diff --git a/.configurations/configuration.dsc.yaml b/.configurations/configuration.dsc.yaml new file mode 100644 index 00000000000000..9e38aaba78a412 --- /dev/null +++ b/.configurations/configuration.dsc.yaml @@ -0,0 +1,54 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 +# Reference: https://github.com/nodejs/node/blob/main/BUILDING.md#windows +properties: + resources: + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: pythonPackage + directives: + description: Install Python 3.14 + module: Microsoft.WinGet.DSC + allowPrerelease: true + settings: + id: Python.Python.3.14 + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: vsPackage + directives: + description: Install Visual Studio 2022 Community + allowPrerelease: true + settings: + id: Microsoft.VisualStudio.2022.Community + source: winget + useLatest: true + - resource: Microsoft.VisualStudio.DSC/VSComponents + id: vsComponents + dependsOn: + - vsPackage + directives: + description: Install required VS workloads and components + allowPrerelease: true + settings: + productId: Microsoft.VisualStudio.Product.Community + channelId: VisualStudio.17.Release + includeRecommended: true + components: + - Microsoft.VisualStudio.Workload.NativeDesktop + - Microsoft.VisualStudio.Component.VC.Llvm.Clang + - Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: gitPackage + directives: + description: Install Git + allowPrerelease: true + settings: + id: Git.Git + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: nasmPackage + directives: + description: Install NetWide Assembler (NASM) + allowPrerelease: true + settings: + id: Nasm.Nasm + source: winget + configurationVersion: 0.1.1 diff --git a/.configurations/configuration.vsEnterprise.dsc.yaml b/.configurations/configuration.vsEnterprise.dsc.yaml new file mode 100644 index 00000000000000..4faf7d77d371d6 --- /dev/null +++ b/.configurations/configuration.vsEnterprise.dsc.yaml @@ -0,0 +1,54 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 +# Reference: https://github.com/nodejs/node/blob/main/BUILDING.md#windows +properties: + resources: + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: pythonPackage + directives: + description: Install Python 3.14 + module: Microsoft.WinGet.DSC + allowPrerelease: true + settings: + id: Python.Python.3.14 + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: vsPackage + directives: + description: Install Visual Studio 2022 Enterprise + allowPrerelease: true + settings: + id: Microsoft.VisualStudio.2022.Enterprise + source: winget + useLatest: true + - resource: Microsoft.VisualStudio.DSC/VSComponents + id: vsComponents + dependsOn: + - vsPackage + directives: + description: Install required VS workloads and components + allowPrerelease: true + settings: + productId: Microsoft.VisualStudio.Product.Enterprise + channelId: VisualStudio.17.Release + includeRecommended: true + components: + - Microsoft.VisualStudio.Workload.NativeDesktop + - Microsoft.VisualStudio.Component.VC.Llvm.Clang + - Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: gitPackage + directives: + description: Install Git + allowPrerelease: true + settings: + id: Git.Git + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: nasmPackage + directives: + description: Install NetWide Assembler (NASM) + allowPrerelease: true + settings: + id: Nasm.Nasm + source: winget + configurationVersion: 0.1.1 diff --git a/.configurations/configuration.vsProfessional.dsc.yaml b/.configurations/configuration.vsProfessional.dsc.yaml new file mode 100644 index 00000000000000..e094059e826c0e --- /dev/null +++ b/.configurations/configuration.vsProfessional.dsc.yaml @@ -0,0 +1,54 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 +# Reference: https://github.com/nodejs/node/blob/main/BUILDING.md#windows +properties: + resources: + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: pythonPackage + directives: + description: Install Python 3.14 + module: Microsoft.WinGet.DSC + allowPrerelease: true + settings: + id: Python.Python.3.14 + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: vsPackage + directives: + description: Install Visual Studio 2022 Professional + allowPrerelease: true + settings: + id: Microsoft.VisualStudio.2022.Professional + source: winget + useLatest: true + - resource: Microsoft.VisualStudio.DSC/VSComponents + id: vsComponents + dependsOn: + - vsPackage + directives: + description: Install required VS workloads and components + allowPrerelease: true + settings: + productId: Microsoft.VisualStudio.Product.Professional + channelId: VisualStudio.17.Release + includeRecommended: true + components: + - Microsoft.VisualStudio.Workload.NativeDesktop + - Microsoft.VisualStudio.Component.VC.Llvm.Clang + - Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: gitPackage + directives: + description: Install Git + allowPrerelease: true + settings: + id: Git.Git + source: winget + - resource: Microsoft.WinGet.DSC/WinGetPackage + id: nasmPackage + directives: + description: Install NetWide Assembler (NASM) + allowPrerelease: true + settings: + id: Nasm.Nasm + source: winget + configurationVersion: 0.1.1 diff --git a/.cpplint b/.cpplint index f6e10f03963405..6590633de164a3 100644 --- a/.cpplint +++ b/.cpplint @@ -1,3 +1,3 @@ set noparent -filter=-build/include_alpha,-build/include_subdir,-build/include_what_you_use,-legal/copyright,-readability/nolint +filter=-build/c++17,-build/include_alpha,-build/include_subdir,-build/include_what_you_use,-legal/copyright,-readability/nolint,-readability/braces,-whitespace/indent_namespace linelength=80 diff --git a/.devcontainer/base/devcontainer.json b/.devcontainer/base/devcontainer.json new file mode 100644 index 00000000000000..083123eccacaa4 --- /dev/null +++ b/.devcontainer/base/devcontainer.json @@ -0,0 +1,12 @@ +{ + "name": "Node.js Dev Container", + "image": "nodejs/devcontainer:nightly", + "workspaceMount": "source=${localWorkspaceFolder},target=/home/developer/nodejs/node,type=bind,consistency=cached", + "workspaceFolder": "/home/developer/nodejs/node", + "remoteUser": "developer", + "mounts": [ + "source=node-devcontainer-cache,target=/home/developer/nodejs/node/out,type=volume" + ], + "postCreateCommand": "git restore-mtime", + "postStartCommand": "cp /home/developer/envrc/static-libs.envrc /home/developer/nodejs/node/.envrc && direnv allow /home/developer/nodejs/node" +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index a69b66f442b666..00000000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "Node.js Core Developer Environment", - "extensions": [ - "github.vscode-pull-request-github", - "ms-vsliveshare.vsliveshare", - "vscode-icons-team.vscode-icons", - "visualstudioexptteam.vscodeintellicode" - ], - "image": "nodejs/devcontainer:nightly", - "initializeCommand": "docker system prune -f -a", - "settings": { - "terminal.integrated.profiles.linux": { - "zsh (login)": { - "path": "zsh", - "args": ["-l"] - } - } - } -} diff --git a/.editorconfig b/.editorconfig index 3a416e87aba4db..eebdfb046db52d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,5 +23,5 @@ indent_size = unset indent_style = unset trim_trailing_whitespace = unset -[{test/fixtures,deps,tools/node_modules,tools/gyp,tools/icu,tools/msvs}/**] +[{test/fixtures,deps,tools/eslint/node_modules,tools/gyp,tools/icu,tools/msvs}/**] insert_final_newline = false diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 64f34660d87a8f..00000000000000 --- a/.eslintignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules -lib/punycode.js -test/addons/??_* -test/fixtures -test/message/esm_display_syntax_error.mjs -tools/icu -tools/lint-md/lint-md.mjs -tools/github_reporter -benchmark/tmp -benchmark/fixtures -doc/**/*.js -doc/changelogs/CHANGELOG_v1*.md -!doc/changelogs/CHANGELOG_v18.md -!doc/api_assets/*.js -!.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index a154d00794ab4d..00000000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,365 +0,0 @@ -'use strict'; - -/* eslint-env node */ - -const Module = require('module'); -const path = require('path'); - -const NodePlugin = require('./tools/node_modules/eslint-plugin-node-core'); -NodePlugin.RULES_DIR = path.resolve(__dirname, 'tools', 'eslint-rules'); - -// The Module._findPath() monkeypatching is to make it so that ESLint will work -// if invoked by a globally-installed ESLint or ESLint installed elsewhere -// rather than the one we ship. This makes it possible for IDEs to lint files -// with our rules while people edit them. -const ModuleFindPath = Module._findPath; -const hacks = [ - 'eslint-plugin-node-core', - 'eslint-plugin-jsdoc', - 'eslint-plugin-markdown', - '@babel/eslint-parser', - '@babel/plugin-syntax-import-attributes', -]; -Module._findPath = (request, paths, isMain) => { - const r = ModuleFindPath(request, paths, isMain); - if (!r && hacks.includes(request)) { - try { - return require.resolve(`./tools/node_modules/${request}`); - } catch { - return require.resolve( - `./tools/node_modules/eslint/node_modules/${request}`); - } - } - return r; -}; - -module.exports = { - root: true, - env: { - es2022: true, - }, - extends: ['eslint:recommended', 'plugin:jsdoc/recommended'], - plugins: ['jsdoc', 'markdown', 'node-core'], - parser: '@babel/eslint-parser', - parserOptions: { - babelOptions: { - plugins: [ - Module._findPath('@babel/plugin-syntax-import-attributes'), - ], - }, - requireConfigFile: false, - sourceType: 'script', - }, - overrides: [ - { - files: [ - '*.mjs', - 'test/es-module/test-esm-example-loader.js', - 'test/es-module/test-esm-type-flag.js', - 'test/es-module/test-esm-type-flag-alias.js', - ], - parserOptions: { sourceType: 'module' }, - }, - { - files: ['**/*.md'], - processor: 'markdown/markdown', - }, - { - files: ['**/*.md/*.cjs', '**/*.md/*.js'], - parserOptions: { - sourceType: 'script', - ecmaFeatures: { impliedStrict: true }, - }, - rules: { strict: 'off' }, - }, - { - files: [ - '**/*.md/*.mjs', - 'doc/api/esm.md/*.js', - 'doc/api/packages.md/*.js', - ], - parserOptions: { sourceType: 'module' }, - rules: { 'no-restricted-globals': [ - 'error', - { - name: '__filename', - message: 'Use import.meta.url instead', - }, - { - name: '__dirname', - message: 'Not available in ESM', - }, - { - name: 'exports', - message: 'Not available in ESM', - }, - { - name: 'module', - message: 'Not available in ESM', - }, - { - name: 'require', - message: 'Use import instead', - }, - { - name: 'Buffer', - message: 'Import Buffer instead of using the global', - }, - { - name: 'process', - message: 'Import process instead of using the global', - }, - ] }, - }, - { - files: [ - 'lib/internal/modules/**/*.js', - ], - rules: { - 'curly': 'error', - }, - }, - { - files: [ - 'lib/internal/test_runner/**/*.js', - ], - rules: { - 'node-core/set-proto-to-null-in-object': 'error', - }, - }, - ], - rules: { - // ESLint built-in rules - // https://eslint.org/docs/rules/ - 'accessor-pairs': 'error', - 'array-callback-return': 'error', - 'arrow-parens': 'error', - 'arrow-spacing': 'error', - 'block-scoped-var': 'error', - 'block-spacing': 'error', - 'brace-style': ['error', '1tbs', { allowSingleLine: true }], - 'capitalized-comments': ['error', 'always', { - line: { - // Ignore all lines that have less characters than 20 and all lines that - // start with something that looks like a variable name or code. - ignorePattern: '.{0,20}$|[a-z]+ ?[0-9A-Z_.(/=:[#-]|std|http|ssh|ftp', - ignoreInlineComments: true, - ignoreConsecutiveComments: true, - }, - block: { - ignorePattern: '.*', - }, - }], - 'comma-dangle': ['error', 'always-multiline'], - 'comma-spacing': 'error', - 'comma-style': 'error', - 'computed-property-spacing': 'error', - 'default-case-last': 'error', - 'dot-location': ['error', 'property'], - 'dot-notation': 'error', - 'eol-last': 'error', - 'eqeqeq': ['error', 'smart'], - 'func-call-spacing': 'error', - 'func-name-matching': 'error', - 'func-style': ['error', 'declaration', { allowArrowFunctions: true }], - 'indent': ['error', 2, { - ArrayExpression: 'first', - CallExpression: { arguments: 'first' }, - FunctionDeclaration: { parameters: 'first' }, - FunctionExpression: { parameters: 'first' }, - MemberExpression: 'off', - ObjectExpression: 'first', - SwitchCase: 1, - }], - 'key-spacing': 'error', - 'keyword-spacing': 'error', - 'linebreak-style': 'error', - 'max-len': ['error', { - code: 120, - ignorePattern: '^// Flags:', - ignoreRegExpLiterals: true, - ignoreTemplateLiterals: true, - ignoreUrls: true, - tabWidth: 2, - }], - 'new-parens': 'error', - 'no-confusing-arrow': 'error', - 'no-constant-condition': ['error', { checkLoops: false }], - 'no-constructor-return': 'error', - 'no-duplicate-imports': 'error', - 'no-else-return': 'error', - 'no-extra-parens': ['error', 'functions'], - 'no-lonely-if': 'error', - 'no-mixed-requires': 'error', - 'no-multi-spaces': ['error', { ignoreEOLComments: true }], - 'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 0, maxBOF: 0 }], - 'no-new-require': 'error', - 'no-path-concat': 'error', - 'no-proto': 'error', - 'no-redeclare': ['error', { 'builtinGlobals': false }], - 'no-restricted-modules': ['error', 'sys'], - 'no-restricted-properties': [ - 'error', - { - object: 'assert', - property: 'deepEqual', - message: 'Use `assert.deepStrictEqual()`.', - }, - { - object: 'assert', - property: 'notDeepEqual', - message: 'Use `assert.notDeepStrictEqual()`.', - }, - { - object: 'assert', - property: 'equal', - message: 'Use `assert.strictEqual()` rather than `assert.equal()`.', - }, - { - object: 'assert', - property: 'notEqual', - message: 'Use `assert.notStrictEqual()` rather than `assert.notEqual()`.', - }, - { - property: '__defineGetter__', - message: '__defineGetter__ is deprecated.', - }, - { - property: '__defineSetter__', - message: '__defineSetter__ is deprecated.', - }, - ], - // If this list is modified, please copy changes that should apply to ./lib - // as well to lib/.eslintrc.yaml. - 'no-restricted-syntax': [ - 'error', - { - selector: "CallExpression[callee.name='setTimeout'][arguments.length<2]", - message: '`setTimeout()` must be invoked with at least two arguments.', - }, - { - selector: "CallExpression[callee.name='setInterval'][arguments.length<2]", - message: '`setInterval()` must be invoked with at least two arguments.', - }, - { - selector: 'ThrowStatement > CallExpression[callee.name=/Error$/]', - message: 'Use `new` keyword when throwing an `Error`.', - }, - { - selector: "CallExpression[callee.name='isNaN']", - message: 'Use Number.isNaN() instead of the global isNaN() function.', - }, - { - // TODO(@panva): move this to no-restricted-properties - // when https://github.com/eslint/eslint/issues/16412 is fixed - selector: "Identifier[name='webcrypto']", - message: 'Use `globalThis.crypto`.', - }, - ], - 'no-self-compare': 'error', - 'no-tabs': 'error', - 'no-template-curly-in-string': 'error', - 'no-throw-literal': 'error', - 'no-trailing-spaces': 'error', - 'no-undef': ['error', { typeof: true }], - 'no-undef-init': 'error', - 'no-unused-expressions': ['error', { allowShortCircuit: true }], - 'no-unused-vars': ['error', { args: 'none', caughtErrors: 'all' }], - 'no-use-before-define': ['error', { - classes: true, - functions: false, - variables: false, - }], - 'no-useless-call': 'error', - 'no-useless-concat': 'error', - 'no-useless-constructor': 'error', - 'no-useless-return': 'error', - 'no-var': 'error', - 'no-void': 'error', - 'no-whitespace-before-property': 'error', - 'object-curly-newline': 'error', - 'object-curly-spacing': ['error', 'always'], - 'one-var': ['error', { initialized: 'never' }], - 'one-var-declaration-per-line': 'error', - 'operator-linebreak': ['error', 'after'], - 'padding-line-between-statements': [ - 'error', - { blankLine: 'always', prev: 'function', next: 'function' }, - ], - 'prefer-const': ['error', { ignoreReadBeforeAssign: true }], - 'prefer-object-has-own': 'error', - 'quotes': ['error', 'single', { avoidEscape: true }], - 'quote-props': ['error', 'consistent'], - 'rest-spread-spacing': 'error', - 'semi': 'error', - 'semi-spacing': 'error', - 'space-before-blocks': ['error', 'always'], - 'space-before-function-paren': ['error', { - anonymous: 'never', - named: 'never', - asyncArrow: 'always', - }], - 'space-in-parens': 'error', - 'space-infix-ops': 'error', - 'space-unary-ops': 'error', - 'spaced-comment': ['error', 'always', { - 'block': { 'balanced': true }, - 'exceptions': ['-'], - }], - 'strict': ['error', 'global'], - 'symbol-description': 'error', - 'template-curly-spacing': 'error', - 'unicode-bom': 'error', - 'valid-typeof': ['error', { requireStringLiterals: true }], - - // ESLint recommended rules that we disable - 'no-inner-declarations': 'off', - - // JSDoc recommended rules that we disable - 'jsdoc/require-jsdoc': 'off', - 'jsdoc/require-param-description': 'off', - 'jsdoc/newline-after-description': 'off', - 'jsdoc/require-returns-description': 'off', - 'jsdoc/valid-types': 'off', - 'jsdoc/no-defaults': 'off', - 'jsdoc/no-undefined-types': 'off', - 'jsdoc/require-param': 'off', - 'jsdoc/check-tag-names': 'off', - 'jsdoc/require-returns': 'off', - - // Custom rules from eslint-plugin-node-core - 'node-core/no-unescaped-regexp-dot': 'error', - 'node-core/no-duplicate-requires': 'error', - 'node-core/prefer-proto': 'error', - }, - globals: { - ByteLengthQueuingStrategy: 'readable', - CompressionStream: 'readable', - CountQueuingStrategy: 'readable', - CustomEvent: 'readable', - crypto: 'readable', - Crypto: 'readable', - CryptoKey: 'readable', - DecompressionStream: 'readable', - fetch: 'readable', - FormData: 'readable', - navigator: 'readable', - ReadableStream: 'readable', - ReadableStreamDefaultReader: 'readable', - ReadableStreamBYOBReader: 'readable', - ReadableStreamBYOBRequest: 'readable', - ReadableByteStreamController: 'readable', - ReadableStreamDefaultController: 'readable', - Response: 'readable', - TextDecoderStream: 'readable', - TextEncoderStream: 'readable', - TransformStream: 'readable', - TransformStreamDefaultController: 'readable', - ShadowRealm: 'readable', - SubtleCrypto: 'readable', - WritableStream: 'readable', - WritableStreamDefaultWriter: 'readable', - WritableStreamDefaultController: 'readable', - WebSocket: 'readable', - }, -}; diff --git a/.gitattributes b/.gitattributes index 82563e5d2fc91b..36b6c2b11d095b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,9 @@ test/fixtures/* -text vcbuild.bat text eol=crlf +# disable eol conversion in vendored files. +deps/crates/vendor/**/* -text deps/npm/bin/npm text eol=lf deps/npm/bin/npx text eol=lf deps/corepack/shims/corepack text eol=lf tools/msvs/find_python.cmd text eol=crlf +doc/**/*.md text eol=lf diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e1fe4d0add3daf..0164937307a770 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,9 +15,10 @@ /.github/ISSUE_TEMPLATE/* @nodejs/tsc /CODE_OF_CONDUCT.md @nodejs/tsc /CONTRIBUTING.md @nodejs/tsc -/doc/contributing/*.md @nodejs/tsc +/doc/contributing/**/* @nodejs/tsc /GOVERNANCE.md @nodejs/tsc /SECURITY.md @nodejs/tsc +/BUILDING.md @nodejs/build @nodejs/tsc /LICENSE @nodejs/tsc /onboarding.md @nodejs/tsc @@ -35,7 +36,6 @@ # net -/deps/ada @nodejs/url /deps/cares @nodejs/net /doc/api/dgram.md @nodejs/net /doc/api/dns.md @nodejs/net @@ -47,14 +47,11 @@ /lib/internal/js_stream_socket.js @nodejs/net /lib/internal/net.js @nodejs/net /lib/internal/socket_list.js @nodejs/net -/lib/internal/url.js @nodejs/url /lib/net.js @nodejs/net -/lib/url.js @nodejs/url /src/cares_wrap.cc @nodejs/net /src/connect_wrap.* @nodejs/net /src/connection_wrap.* @nodejs/net /src/node_sockaddr* @nodejs/net -/src/node_url.* @nodejs/url /src/tcp_wrap.* @nodejs/net /src/udp_wrap.* @nodejs/net @@ -68,6 +65,7 @@ /lib/tls.js @nodejs/crypto @nodejs/net /src/crypto/* @nodejs/crypto /src/node_crypto* @nodejs/crypto +/deps/ncrypto/* @nodejs/crypto # http @@ -142,6 +140,7 @@ # Actions /.github/workflows/* @nodejs/actions +/.github/workflows/create-release-proposal.yml @nodejs/releasers /tools/actions/* @nodejs/actions # Test runner @@ -159,14 +158,17 @@ /doc/contributing/maintaining/maintaining-single-executable-application-support.md @nodejs/single-executable /src/node_sea* @nodejs/single-executable /test/fixtures/postject-copy @nodejs/single-executable -/test/parallel/test-single-executable-* @nodejs/single-executable -/test/sequential/test-single-executable-* @nodejs/single-executable +/test/sea @nodejs/single-executable /tools/dep_updaters/update-postject.sh @nodejs/single-executable # Permission Model /doc/api/permissions.md @nodejs/security-wg /lib/internal/process/permission.js @nodejs/security-wg /src/permission/* @nodejs/security-wg +/test/parallel/test-permission-* @nodejs/security-wg + +# Security Release +/doc/contributing/security-release-process.md @nodejs/security-stewards # Dependency Update Tools @@ -181,3 +183,55 @@ /lib/internal/navigator.js @nodejs/web-standards /test/fixtures/wpt/ @nodejs/web-standards /test/wpt/ @nodejs/web-standards + +# TypeScript + +/deps/amaro/ @nodejs/typescript +/doc/api/typescript.md @nodejs/typescript +/test/fixtures/typescript/ @nodejs/typescript +/tools/dep_updaters/update-amaro.sh @nodejs/typescript + +# Performance +/benchmark/* @nodejs/performance + +# URL +/deps/ada @nodejs/url +/lib/internal/url.js @nodejs/url +/lib/url.js @nodejs/url +/src/node_url.* @nodejs/url +/test/fixtures/wpt/url @nodejs/url + +# SQLite +/deps/sqlite/ @nodejs/sqlite +/doc/api/sqlite.md @nodejs/sqlite +/src/node_sqlite.* @nodejs/sqlite +/test/parallel/test-sqlite* @nodejs/sqlite +/test/sqlite/ @nodejs/sqlite +/tools/dep_updaters/update-sqlite.sh @nodejs/sqlite + +# Config +/doc/node-config-schema.json @nodejs/config +/src/node_config.* @nodejs/config +/src/node_dotenv.* @nodejs/config +/src/node_options.* @nodejs/config +/test/parallel/test-config-* @nodejs/config +/test/parallel/test-dotenv-* @nodejs/config + +# Inspector +/src/inspector/* @nodejs/inspector +/src/inspector_* @nodejs/inspector +/lib/internal/inspector/* @nodejs/inspector +/lib/internal/inspector_* @nodejs/inspector +/lib/inspector.js @nodejs/inspector + +# path +/lib/path.js @nodejs/path +/lib/path/* @nodejs/path +/test/parallel/test-path-* @nodejs/path + +# userland-migrations +/doc/api/deprecations.md @nodejs/userland-migrations + +# dev container +/.devcontainer/* @nodejs/devcontainer +/doc/contributing/using-devcontainer.md @nodejs/devcontainer diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index 72292b65430d7a..4637a2fa86e17b 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -13,10 +13,13 @@ body: - type: input attributes: label: Version - description: Output of `node -v` - - type: input + description: | + Output of `node -v`. + Please verify that you are reproducing the issue in a [currently-supported version](https://github.com/nodejs/Release/blob/HEAD/README.md#release-schedule) of Node.js. + - type: textarea attributes: label: Platform + render: text description: | UNIX: output of `uname -a` Windows: output of `"$([Environment]::OSVersion.VersionString) $(('x86', 'x64')[[Environment]::Is64BitOperatingSystem])"` in PowerShell console @@ -32,13 +35,19 @@ body: be run using `node` directly without installing third-party dependencies or downloading code from the internet (i.e. no ZIP archive, no GitHub repository, etc.). + validations: + required: true - type: textarea attributes: label: How often does it reproduce? Is there a required condition? + validations: + required: true - type: textarea attributes: label: What is the expected behavior? Why is that the expected behavior? description: If possible please provide textual output instead of screenshots. + validations: + required: true - type: textarea attributes: label: What do you see instead? diff --git a/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml b/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml index 8dc099fb40a5e7..17d50dcaa22ad9 100644 --- a/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml +++ b/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml @@ -35,7 +35,8 @@ body: - macOS ARM64 - macOS x64 - SmartOS - - Windows + - Windows ARM64 + - Windows x64 - Other - type: textarea attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index df5f12bb934f75..dc01fd3fdac591 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,14 @@ blank_issues_enabled: true contact_links: - - name: ⁉️ Need help with Node.js? + - name: ⁉️ Need general help with Node.js? url: https://github.com/nodejs/help about: Please file an issue in our help repo. + - name: 📦 Have an issue with npm? + url: https://github.com/npm/cli/issues + about: npm has a separate issue tracker. + - name: 📡 Have an issue with undici? (`WebSocket`, `fetch`, etc.) + url: https://github.com/nodejs/undici/issues + about: Undici has a separate issue tracker. - name: 🌐 Found a problem with nodejs.org beyond the API reference docs? url: https://github.com/nodejs/nodejs.org/issues/new/choose about: Please file an issue in the Node.js website repo. diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index 9e4a041bf7ce9b..4613512bf2d01f 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -7,9 +7,10 @@ Node.js](https://github.com/nodejs/Release#release-schedule). When looking for support, please first search for your question in these venues: * [Node.js Website](https://nodejs.org/en/), especially the - [API docs](https://nodejs.org/api/) -* [Node.js Help](https://github.com/nodejs/help) + [API docs](https://nodejs.org/api/) or the [Learn material](https://nodejs.org/en/learn) +* [Node.js's GitHub Help repository](https://github.com/nodejs/help) * [Open or closed issues in the Node.js GitHub organization](https://github.com/issues?utf8=%E2%9C%93&q=sort%3Aupdated-desc+org%3Anodejs+is%3Aissue) +* [Ask for support on Node.js's Discord server](https://nodejs.org/discord) If you didn't find an answer in the resources above, try these unofficial resources: @@ -19,7 +20,7 @@ resources: * [Node.js Slack Community](https://node-js.slack.com/) * To register: [nodeslackers.com](https://www.nodeslackers.com/) -GitHub issues are for tracking enhancements and bugs, not general support. +**GitHub issues are for tracking enhancements and bugs, not general support.** The open source license grants you the freedom to use Node.js. It does not guarantee commitments of other people's time. Please be respectful and manage diff --git a/.github/codeql-config.yml b/.github/codeql-config.yml new file mode 100644 index 00000000000000..d042ed96096955 --- /dev/null +++ b/.github/codeql-config.yml @@ -0,0 +1,6 @@ +name: CodeQL config + +paths-ignore: + - test + - deps + - benchmark diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7a47cbcadc9d26..37b865597e5d25 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,54 @@ updates: commit-message: prefix: meta open-pull-requests-limit: 10 + + - package-ecosystem: npm + directory: /tools/eslint + schedule: + interval: monthly + cooldown: + semver-major-days: 5 + semver-minor-days: 5 + semver-patch-days: 5 + commit-message: + prefix: tools + open-pull-requests-limit: 10 + groups: + eslint: + applies-to: version-updates + patterns: + - '*' + + - package-ecosystem: npm + directory: /tools/lint-md + schedule: + interval: monthly + cooldown: + semver-major-days: 5 + semver-minor-days: 5 + semver-patch-days: 5 + commit-message: + prefix: tools + open-pull-requests-limit: 10 + groups: + lint-md: + applies-to: version-updates + patterns: + - '*' + + - package-ecosystem: npm + directory: /tools/doc + schedule: + interval: weekly + cooldown: + semver-major-days: 5 + semver-minor-days: 5 + semver-patch-days: 5 + commit-message: + prefix: tools + open-pull-requests-limit: 10 + groups: + doc: + applies-to: version-updates + patterns: + - '*' diff --git a/.github/label-pr-config.yml b/.github/label-pr-config.yml index 3961cda0e38724..4ff8bee4c56d64 100644 --- a/.github/label-pr-config.yml +++ b/.github/label-pr-config.yml @@ -33,6 +33,10 @@ subSystemLabels: /^src\/quic\/*/: c++, quic /^src\/node_bob*/: c++, quic /^src\/node_sea/: single-executable + /^src\/node_sqlite.*/: c++, sqlite + /^src\/node_config_file.*/: c++, config + /^src\/node_dotenv.*/: c++, config + /^src\/node_options.*/: c++, config # Properly label changes to V8 inspector integration-related files /^src\/inspector_/: c++, inspector, needs-ci @@ -66,7 +70,7 @@ subSystemLabels: /^tools\/build-addons.mjs/: needs-ci # All other tool changes should be marked as such /^tools\//: tools - /^\.eslint|\.editorconfig/: tools + /^eslint\.config|\.editorconfig/: tools /^typings\//: typings ## Dependencies @@ -76,29 +80,33 @@ subSystemLabels: /^deps\/v8\/tools\/gen-postmortem-metadata\.py/: v8 engine, python, post-mortem /^deps\/v8\//: v8 engine /^deps\/uvwasi\//: wasi - /^deps\/npm\//: npm, fast-track + /^deps\/npm\//: npm /^deps\/nghttp2\/nghttp2\.gyp/: build, http2 /^deps\/nghttp2\//: http2 /^deps\/ngtcp2\//: quic + /^deps\/amaro\//: strip-types /^deps\/([^/]+)/: dependencies, $1 ## JS subsystems # Oddities first /^lib\/(?:punycode|\w+\/freelist|sys\.js)/: '' /^lib\/constants\.js$/: lib / src - /^lib\/internal/debugger$/: debugger + /^lib\/internal\/debugger$/: debugger /^lib\/internal\/linkedlist\.js$/: timers /^lib\/internal\/bootstrap/: lib / src /^lib\/internal\/v8_prof_/: tools /^lib\/internal\/socket(?:_list|address)\.js$/: net - /^lib\/\w+\/streams$/: stream + /^lib\/(_stream.*|internal\/streams\/.*|stream\.js|stream\/.*)$/: stream /^lib\/.*http2/: http2 /^lib\/worker_threads.js$/: worker /^lib\/test.js$/: test_runner + /^lib\/v8.js$/: v8 module /^lib\/internal\/url\.js$/: whatwg-url /^lib\/internal\/modules\/esm/: esm + /^lib\/internal\/modules/: module /^lib\/internal\/webstreams/: web streams /^lib\/internal\/test_runner/: test_runner + /^lib\/internal\/v8\//: v8 module # All other lib/ files map directly /^lib\/_(\w+)_\w+\.js?$/: $1 # e.g. _(stream)_wrap @@ -121,6 +129,9 @@ exlusiveLabels: /^test\/fixtures\/es-module/: test, esm /^test\/es-module\//: test, esm /^test\/fixtures\/wpt\/streams\//: test, web streams + /^test\/fixtures\/typescript/: test, strip-types + /^test\/module-hooks\//: test, module, loaders + /^test\/fixtures/module-hooks\//: test, module, loaders /^test\//: test @@ -140,6 +151,10 @@ exlusiveLabels: # Add deprecations label to PRs that affect doc/api/deprecations.md /^doc\/api\/deprecations.md$/: doc, deprecations /^doc\/changelogs\//: release + # Specific map for typescript.md as it should be labeled 'strip-types' + /^doc\/api\/typescript.md$/: doc, strip-types + + /^doc\/node-config-schema.json$/: doc, config /^doc\//: doc @@ -160,6 +175,7 @@ allJsSubSystems: - buffer - child_process - cluster + - config - console - crypto - debugger @@ -186,8 +202,10 @@ allJsSubSystems: - readline - repl - report + - sqlite - stream - string_decoder + - strip-types - timers - tls - trace_events diff --git a/.github/workflows/auto-start-ci.yml b/.github/workflows/auto-start-ci.yml index 823bb4be4f0dbb..911b11a6cebba7 100644 --- a/.github/workflows/auto-start-ci.yml +++ b/.github/workflows/auto-start-ci.yml @@ -21,7 +21,7 @@ jobs: permissions: pull-requests: read if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim outputs: numbers: ${{ steps.get_prs_for_ci.outputs.numbers }} steps: @@ -43,14 +43,14 @@ jobs: pull-requests: write needs: get-prs-for-ci if: needs.get-prs-for-ci.outputs.numbers != '' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} @@ -59,11 +59,15 @@ jobs: - name: Setup @node-core/utils run: | - ncu-config set username ${{ secrets.JENKINS_USER }} - ncu-config set token "${{ secrets.GH_USER_TOKEN }}" - ncu-config set jenkins_token ${{ secrets.JENKINS_TOKEN }} + ncu-config set username "$USERNAME" + ncu-config set token "$GH_TOKEN" + ncu-config set jenkins_token "$JENKINS_TOKEN" ncu-config set owner "${{ github.repository_owner }}" ncu-config set repo "$(echo ${{ github.repository }} | cut -d/ -f2)" + env: + USERNAME: ${{ secrets.JENKINS_USER }} + GH_TOKEN: ${{ secrets.GH_USER_TOKEN }} + JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }} - name: Start the CI run: ./tools/actions/start-ci.sh ${{ needs.get-prs-for-ci.outputs.numbers }} diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index ff0a9d725d304a..e99e4f6dbc7df8 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -8,6 +8,7 @@ on: - '**.md' - AUTHORS - doc/** + - test/internet/** - .github/** - '!.github/workflows/build-tarball.yml' push: @@ -20,6 +21,7 @@ on: - '**.md' - AUTHORS - doc/** + - test/internet/** - .github/** - '!.github/workflows/build-tarball.yml' @@ -28,7 +30,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying permissions: @@ -37,13 +39,13 @@ permissions: jobs: build-tarball: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -51,47 +53,49 @@ jobs: - name: Make tarball run: | export DISTTYPE=nightly - export DATESTRING=`date "+%Y-%m-%d"` + export DATESTRING=$(date "+%Y-%m-%d") export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA") - ./configure && make tar -j8 SKIP_XZ=1 - mkdir tarballs - mv *.tar.gz tarballs + ./configure && make tar -j4 SKIP_XZ=1 - name: Upload tarball artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: tarballs - path: tarballs + path: '*.tar.gz' + compression-level: 0 test-tarball-linux: needs: build-tarball - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm + env: + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + sparse-checkout: .github/actions/install-clang + sparse-checkout-cone-mode: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo - name: Download tarball - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 with: name: tarballs path: tarballs - name: Extract tarball run: | - tar xzf tarballs/*.tar.gz -C $RUNNER_TEMP - echo "TAR_DIR=$RUNNER_TEMP/`basename tarballs/*.tar.gz .tar.gz`" >> $GITHUB_ENV - - name: Copy directories needed for testing - run: | - cp -r tools/node_modules $TAR_DIR/tools - cp -r tools/eslint-rules $TAR_DIR/tools + tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP" + echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV" - name: Build - run: | - cd $TAR_DIR - make build-ci -j4 V=1 + run: make -C "$TAR_DIR" build-ci -j4 V=1 - name: Test - run: | - cd $TAR_DIR - make run-ci -j4 V=1 TEST_CI_ARGS="-p dots --node-args='--test-reporter=spec' --measure-flakiness 9" + run: make -C "$TAR_DIR" test-ci -j1 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml deleted file mode 100644 index 0b35c4f31571cc..00000000000000 --- a/.github/workflows/build-windows.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Build Windows - -on: - pull_request: - paths-ignore: - - README.md - - .github/** - - '!.github/workflows/build-windows.yml' - types: [opened, synchronize, reopened, ready_for_review] - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - README.md - - .github/** - - '!.github/workflows/build-windows.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.12' - FLAKY_TESTS: keep_retrying - -permissions: - contents: read - -jobs: - build-windows: - if: github.event.pull_request.draft == false - strategy: - matrix: - windows: [windows-2022] - fail-fast: false - runs-on: ${{ matrix.windows }} - steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Install deps - run: choco install nasm - - name: Environment Information - run: npx envinfo - - name: Build - run: ./vcbuild.bat diff --git a/.github/workflows/close-stale-feature-requests.yml b/.github/workflows/close-stale-feature-requests.yml index 301dbff620c602..b992696079884c 100644 --- a/.github/workflows/close-stale-feature-requests.yml +++ b/.github/workflows/close-stale-feature-requests.yml @@ -39,9 +39,9 @@ jobs: issues: write # for actions/stale to close stale issues pull-requests: write # for actions/stale to close stale PRs if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 180 diff --git a/.github/workflows/close-stale-pull-requests.yml b/.github/workflows/close-stale-pull-requests.yml index b18cd5c37e69c4..de565c9051328d 100644 --- a/.github/workflows/close-stale-pull-requests.yml +++ b/.github/workflows/close-stale-pull-requests.yml @@ -33,7 +33,7 @@ jobs: permissions: pull-requests: write # for actions/stale to close stale PRs if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Set default end date which is 1 year ago run: echo "END_DATE=$(date --date='525600 minutes ago' --rfc-2822)" >> "$GITHUB_ENV" diff --git a/.github/workflows/close-stalled.yml b/.github/workflows/close-stalled.yml index 7ece19e2e2d6b2..5d2ee0bebfd69b 100644 --- a/.github/workflows/close-stalled.yml +++ b/.github/workflows/close-stalled.yml @@ -18,9 +18,9 @@ jobs: issues: write # for actions/stale to close stale issues pull-requests: write # for actions/stale to close stale PRs if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-close: 30 @@ -32,7 +32,5 @@ jobs: only-labels: stalled # max requests it will send per run to the GitHub API before it deliberately exits to avoid hitting API rate limits operations-per-run: 500 - # deactivates automatic removal of stalled label if issue gets any activity - remove-stale-when-updated: false # deactivates automatic stale labelling as we prefer to do that manually days-before-stale: -1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000000000..7c0887b568e908 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,41 @@ +name: Run CodeQL + +on: + schedule: + - cron: 0 0 * * * + +permissions: + contents: read + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [cpp, javascript, python] + + steps: + - name: Checkout repository + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9 + with: + languages: ${{ matrix.language }} + config-file: ./.github/codeql-config.yml + + - name: Autobuild + uses: github/codeql-action/autobuild@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9 + with: + category: /language:${{matrix.language}} diff --git a/.github/workflows/comment-labeled.yml b/.github/workflows/comment-labeled.yml index 7e3a19c6afd13c..e6652507484154 100644 --- a/.github/workflows/comment-labeled.yml +++ b/.github/workflows/comment-labeled.yml @@ -24,7 +24,7 @@ jobs: issues: write pull-requests: write if: github.repository == 'nodejs/node' && github.event.label.name == 'stalled' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Post stalled comment env: @@ -36,7 +36,7 @@ jobs: permissions: pull-requests: write if: github.repository == 'nodejs/node' && github.event_name == 'pull_request_target' && github.event.label.name == 'fast-track' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Request Fast-Track env: @@ -47,7 +47,7 @@ jobs: permissions: pull-requests: write if: github.repository == 'nodejs/node' && github.event_name == 'pull_request_target' && github.event.label.name == 'notable-change' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Add notable change description env: diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index 6edd0980695e97..ca90c9bbb9f0b8 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -10,20 +10,20 @@ permissions: jobs: lint-commit-message: - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Compute number of commits in the PR id: nb-of-commits run: | echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} persist-credentials: false - run: git reset HEAD^2 - name: Install Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Validate commit message diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml index 7657a7790a94e1..747d9cbac6637c 100644 --- a/.github/workflows/commit-queue.yml +++ b/.github/workflows/commit-queue.yml @@ -1,6 +1,6 @@ # This action requires the following secrets to be set on the repository: -# GH_USER_NAME: GitHub user whose Jenkins and GitHub token are defined below # GH_USER_TOKEN: GitHub user token, to be used by ncu and to push changes +# JENKINS_USER: GitHub user whose Jenkins token is defined below # JENKINS_TOKEN: Jenkins token, to be used to check CI status name: Commit Queue @@ -26,7 +26,7 @@ jobs: permissions: pull-requests: read if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim outputs: numbers: ${{ steps.get_mergeable_prs.outputs.numbers }} steps: @@ -34,35 +34,33 @@ jobs: id: get_mergeable_prs run: | prs=$(gh pr list \ - --repo ${{ github.repository }} \ - --base ${{ github.ref_name }} \ + --repo "$GITHUB_REPOSITORY" \ + --base "$GITHUB_REF_NAME" \ --label 'commit-queue' \ --json 'number' \ - --search "created:<=$(date --date="2 days ago" +"%Y-%m-%dT%H:%M:%S%z")" \ + --search "created:<=$(date --date="2 days ago" +"%Y-%m-%dT%H:%M:%S%z") -label:blocked" \ -t '{{ range . }}{{ .number }} {{ end }}' \ --limit 100) fast_track_prs=$(gh pr list \ - --repo ${{ github.repository }} \ - --base ${{ github.ref_name }} \ + --repo "$GITHUB_REPOSITORY" \ + --base "$GITHUB_REF_NAME" \ --label 'commit-queue' \ --label 'fast-track' \ + --search "-label:blocked" \ --json 'number' \ -t '{{ range . }}{{ .number }} {{ end }}' \ --limit 100) numbers=$(echo $prs' '$fast_track_prs | jq -r -s 'unique | join(" ")') - echo "numbers=$numbers" >> $GITHUB_OUTPUT + echo "numbers=$numbers" >> "$GITHUB_OUTPUT" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} commitQueue: needs: get_mergeable_prs if: needs.get_mergeable_prs.outputs.numbers != '' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: - # Needs the whole git history for ncu to work - # See https://github.com/nodejs/node-core-utils/pull/486 - fetch-depth: 0 # A personal token is required because pushing with GITHUB_TOKEN will # prevent commits from running CI after they land. It needs # to be set here because `checkout` configures GitHub authentication @@ -71,7 +69,7 @@ jobs: # Install dependencies - name: Install Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Install @node-core/utils @@ -79,20 +77,23 @@ jobs: - name: Set variables run: | - echo "REPOSITORY=$(echo ${{ github.repository }} | cut -d/ -f2)" >> $GITHUB_ENV - echo "OWNER=${{ github.repository_owner }}" >> $GITHUB_ENV + echo "REPOSITORY=$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" >> "$GITHUB_ENV" - name: Configure @node-core/utils run: | - ncu-config set branch ${GITHUB_REF_NAME} + ncu-config set branch "${GITHUB_REF_NAME}" ncu-config set upstream origin - ncu-config set username "${{ secrets.GH_USER_NAME }}" - ncu-config set token "${{ secrets.GH_USER_TOKEN }}" - ncu-config set jenkins_token "${{ secrets.JENKINS_TOKEN }}" + ncu-config set username "$USERNAME" + ncu-config set token "$GITHUB_TOKEN" + ncu-config set jenkins_token "$JENKINS_TOKEN" ncu-config set repo "${REPOSITORY}" - ncu-config set owner "${OWNER}" + ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" + env: + USERNAME: ${{ secrets.JENKINS_USER }} + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }} - name: Start the Commit Queue - run: ./tools/actions/commit-queue.sh ${{ env.OWNER }} ${{ env.REPOSITORY }} ${{ needs.get_mergeable_prs.outputs.numbers }} + run: ./tools/actions/commit-queue.sh "${GITHUB_REPOSITORY_OWNER}" "${REPOSITORY}" ${{ needs.get_mergeable_prs.outputs.numbers }} env: GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index a2351225d6efbd..1215d0ac8b2c8a 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -12,6 +12,8 @@ on: - tools/gyp/** - tools/test.py - .github/workflows/coverage-linux-without-intl.yml + - codecov.yml + - .nycrc push: branches: - main @@ -24,51 +26,61 @@ on: - tools/gyp/** - tools/test.py - .github/workflows/coverage-linux-without-intl.yml + - codecov.yml + - .nycrc concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} permissions: contents: read jobs: coverage-linux-without-intl: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + # Disabled because "Report JS" step was crashing. + if: false + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo - name: Install gcovr - run: pip install gcovr==4.2 - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --coverage --without-intl" + run: pip install gcovr==7.2 + - name: Configure + run: ./configure --verbose --error-on-warn --coverage --without-intl # TODO(bcoe): fix the couple tests that fail with the inspector enabled. # The cause is most likely coverage's use of the inspector. - - name: Test - run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --node-args='--test-reporter=spec' --measure-flakiness 9" || exit 0 + - name: Build and test + run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" || exit 0 - name: Report JS run: npx c8 report --check-coverage env: NODE_OPTIONS: --max-old-space-size=8192 - name: Report C++ - run: cd out && gcovr --gcov-exclude='.*\b(deps|usr|out|obj|cctest|embedding)\b' -v -r Release/obj.target --xml -o ../coverage/coverage-cxx.xml --root=$(cd ../ && pwd) + run: gcovr --object-directory=out -v --filter src --xml -o ./coverage/coverage-cxx.xml --root=./ --gcov-executable="llvm-cov-18 gcov" # Clean temporary output from gcov and c8, so that it's not uploaded: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index 10705fc16a749c..daa68afe35458c 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -12,6 +12,8 @@ on: - tools/gyp/** - tools/test.py - .github/workflows/coverage-linux.yml + - codecov.yml + - .nycrc push: branches: - main @@ -24,51 +26,61 @@ on: - tools/gyp/** - tools/test.py - .github/workflows/coverage-linux.yml + - codecov.yml + - .nycrc concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} permissions: contents: read jobs: coverage-linux: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + # Disabled because "Report JS" step was crashing. + if: false + runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo - name: Install gcovr - run: pip install gcovr==4.2 - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --coverage" + run: pip install gcovr==7.2 + - name: Configure + run: ./configure --verbose --error-on-warn --coverage # TODO(bcoe): fix the couple tests that fail with the inspector enabled. # The cause is most likely coverage's use of the inspector. - - name: Test - run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --node-args='--test-reporter=spec' --measure-flakiness 9" || exit 0 + - name: Build and test + run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" || exit 0 - name: Report JS run: npx c8 report --check-coverage env: NODE_OPTIONS: --max-old-space-size=8192 - name: Report C++ - run: cd out && gcovr --gcov-exclude='.*\b(deps|usr|out|obj|cctest|embedding)\b' -v -r Release/obj.target --xml -o ../coverage/coverage-cxx.xml --root=$(cd ../ && pwd) + run: gcovr --object-directory=out -v --filter src --xml -o ./coverage/coverage-cxx.xml --root=./ --gcov-executable="llvm-cov-18 gcov" # Clean temporary output from gcov and c8, so that it's not uploaded: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index ead5743f51b39e..fa0a52b925f90c 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -5,32 +5,36 @@ on: types: [opened, synchronize, reopened, ready_for_review] paths: - lib/**/*.js - - Makefile + - vcbuild.bat - src/**/*.cc - src/**/*.h - test/** - tools/gyp/** - tools/test.py - .github/workflows/coverage-windows.yml + - codecov.yml + - .nycrc push: branches: - main paths: - lib/**/*.js - - Makefile + - vcbuild.bat - src/**/*.cc - src/**/*.h - test/** - tools/gyp/** - tools/test.py - .github/workflows/coverage-windows.yml + - codecov.yml + - .nycrc concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying permissions: @@ -39,13 +43,13 @@ permissions: jobs: coverage-windows: if: github.event.pull_request.draft == false - runs-on: windows-2022 + runs-on: windows-2025 steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install deps @@ -67,7 +71,6 @@ jobs: - name: Clean tmp run: npx rimraf ./coverage/tmp - name: Upload - uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1 + uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml new file mode 100644 index 00000000000000..399da244cc4fe0 --- /dev/null +++ b/.github/workflows/create-release-proposal.yml @@ -0,0 +1,81 @@ +# This action requires the following secrets to be set on the repository: +# GH_USER_TOKEN: GitHub user token, to be used by ncu and to push changes + +name: Create Release Proposal + +on: + workflow_dispatch: + inputs: + release-line: + required: true + type: number + description: 'The release line (without dots or prefix). e.g: 22' + release-date: + required: true + type: string + description: The release date in YYYY-MM-DD format + +concurrency: ${{ github.workflow }} + +env: + NODE_VERSION: lts/* + +permissions: + contents: write + pull-requests: write + +jobs: + releasePrepare: + env: + STAGING_BRANCH: v${{ inputs.release-line }}.x-staging + RELEASE_BRANCH: v${{ inputs.release-line }}.x + RELEASE_DATE: ${{ inputs.release-date }} + RELEASE_LINE: ${{ inputs.release-line }} + runs-on: ubuntu-slim + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ env.STAGING_BRANCH }} + persist-credentials: false + + # Install dependencies + - name: Install Node.js + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install @node-core/utils + run: npm install -g @node-core/utils + + - name: Configure @node-core/utils + run: | + ncu-config set branch "${RELEASE_BRANCH}" + ncu-config set upstream origin + ncu-config set username "$GITHUB_ACTOR" + ncu-config set token "$GH_TOKEN" + ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" + ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" + env: + GH_TOKEN: ${{ github.token }} + + - name: Set up ghauth config (Ubuntu) + run: | + mkdir -p "${XDG_CONFIG_HOME:-~/.config}/changelog-maker" + jq --null-input '{user: env.GITHUB_ACTOR, token: env.TOKEN}' > "${XDG_CONFIG_HOME:-~/.config}/changelog-maker/config.json" + env: + TOKEN: ${{ github.token }} + + - name: Setup git author + run: | + git config --local user.email "github-bot@iojs.org" + git config --local user.name "Node.js GitHub Bot" + + - name: Start git node release prepare + # The curl command is to make sure we run the version of the script corresponding to the current workflow. + run: | + curl -fsSL https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/tools/actions/create-release-proposal.sh |\ + sh -s -- "${RELEASE_DATE}" "${RELEASE_LINE}" "${GITHUB_ACTOR}" + env: + GH_TOKEN: ${{ github.token }} + # We want the bot to push the push the release commit so CI runs on it. + BOT_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 62eb8b29f43ecc..6c28e70e6d949c 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -6,11 +6,6 @@ name: Daily WPT report on: workflow_dispatch: - inputs: - node-versions: - description: Node.js versions (as supported by actions/setup-node) to test as JSON array - required: false - default: '["current", "lts/*", "lts/-1"]' schedule: # This is 20 minutes after `epochs/daily` branch is triggered to be created # in WPT repo. @@ -18,22 +13,33 @@ on: - cron: 30 0 * * * env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' permissions: contents: read jobs: - report: + collect-versions: if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-slim + outputs: + matrix: ${{ steps.query.outputs.matrix }} + steps: + - id: query + run: | + matrix=$(curl -s https://raw.githubusercontent.com/nodejs/Release/refs/heads/main/schedule.json | jq -c --arg now "$(date +%Y-%m-%d)" '[with_entries(select(.value.end > $now and .value.start < $now)) | keys[] | ltrimstr("v") | tonumber] + ["latest-nightly"]') + echo "matrix=$matrix" >> "$GITHUB_OUTPUT" + report: + needs: + - collect-versions strategy: matrix: - node-version: ${{ fromJSON(github.event.inputs.node-versions || '["latest-nightly", "current", "lts/*", "lts/-1"]') }} + node-version: ${{ fromJSON(needs.collect-versions.outputs.matrix) }} fail-fast: false - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm steps: - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -45,7 +51,7 @@ jobs: run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-x64"))][0].version')" >> $GITHUB_ENV - name: Install Node.js id: setup-node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NIGHTLY || matrix.node-version }} check-latest: true @@ -57,7 +63,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@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} @@ -73,7 +79,7 @@ jobs: run: rm -rf wpt working-directory: test/fixtures - name: Checkout epochs/daily WPT - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: web-platform-tests/wpt persist-credentials: false @@ -89,31 +95,6 @@ jobs: echo "WPT_REPORT=$(pwd)/out/wpt/wptreport.json" >> $GITHUB_ENV fi - # undici WPT Runner - - name: Set env.UNDICI_VERSION - if: ${{ env.WPT_REPORT != '' }} - run: echo "UNDICI_VERSION=v$(jq -r '.version' < deps/undici/src/package.json)" >> $GITHUB_ENV - - name: Remove deps/undici - if: ${{ env.WPT_REPORT != '' }} - run: rm -rf deps/undici - - name: Checkout undici - if: ${{ env.WPT_REPORT != '' }} - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - repository: nodejs/undici - persist-credentials: false - path: deps/undici - clean: false - ref: ${{ env.UNDICI_VERSION }} - - name: Add undici WPTs to the report - if: ${{ env.WPT_REPORT != '' }} - run: | - rm -rf test/wpt/tests - mv ../../test/fixtures/wpt/ test/wpt/tests/ - npm install - npm run test:wpt || true - working-directory: deps/undici - # Upload artifacts - name: Clone report for upload if: ${{ env.WPT_REPORT != '' }} @@ -121,7 +102,7 @@ jobs: run: cp wptreport.json wptreport-${{ steps.setup-node.outputs.node-version }}.json - name: Upload GitHub Actions artifact if: ${{ env.WPT_REPORT != '' }} - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: path: out/wpt/wptreport-*.json name: WPT Report for ${{ steps.setup-node.outputs.node-version }} diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index d5f458f5b31a35..199896f6d442fc 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -13,21 +13,19 @@ permissions: jobs: build-lto: - runs-on: ubuntu-latest - # not working on gcc-8 and gcc-9 see https://github.com/nodejs/node/issues/38570 - container: gcc:11 + runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information run: npx envinfo - name: Build lto run: | - apt-get update && apt-get install ninja-build python-is-python3 -y + sudo apt-get update && sudo apt-get install ninja-build -y ./configure --enable-lto --ninja ninja -C out/Release diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 5de7373a8baf35..f77aa4057994f8 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -22,22 +22,22 @@ permissions: jobs: build-docs: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information run: npx envinfo - name: Build run: NODE=$(command -v node) make doc-only - - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: docs path: out/doc - name: Test - run: NODE=$(command -v node) make test-doc-ci TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + run: NODE=$(command -v node) make test-doc-ci TEST_CI_ARGS="-p actions --measure-flakiness 9" diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index 4b60ad4b40f9ee..2e5290d5d121dc 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -16,16 +16,16 @@ permissions: jobs: find: if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} @@ -42,7 +42,7 @@ jobs: author: Node.js GitHub Bot branch: actions/inactive-collaborators body: | - This PR was generated by tools/find-inactive-collaborators.yml. + This PR was generated by the [`find-inactive-collaborators.yml` workflow](https://github.com/nodejs/node/blob/main/.github/workflows/find-inactive-collaborators.yml). @nodejs/tsc Please follow up with the [offboarding tasks](https://github.com/nodejs/node/blob/main/doc/contributing/offboarding.md). commit-message: 'meta: move one or more collaborators to emeritus' diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml index b8ef8ef1f92d8a..0638a097065875 100644 --- a/.github/workflows/find-inactive-tsc.yml +++ b/.github/workflows/find-inactive-tsc.yml @@ -16,17 +16,17 @@ permissions: jobs: find: if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Checkout the repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 persist-credentials: false - name: Clone nodejs/TSC repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 path: .tmp @@ -34,7 +34,7 @@ jobs: repository: nodejs/TSC - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.github/workflows/label-flaky-test-issue.yml b/.github/workflows/label-flaky-test-issue.yml index 82e2a10ab2b25c..b623d9eaae2cd4 100644 --- a/.github/workflows/label-flaky-test-issue.yml +++ b/.github/workflows/label-flaky-test-issue.yml @@ -2,7 +2,7 @@ name: Label Flaky Test Issues on: issues: - types: [opened, labeled] + types: [labeled] permissions: contents: read @@ -10,7 +10,7 @@ permissions: jobs: label: if: github.event.label.name == 'flaky-test' - runs-on: ubuntu-latest + runs-on: ubuntu-slim permissions: issues: write steps: diff --git a/.github/workflows/label-pr.yml b/.github/workflows/label-pr.yml index 95fdd42a4c700a..03aa1fa9a8d0e6 100644 --- a/.github/workflows/label-pr.yml +++ b/.github/workflows/label-pr.yml @@ -9,7 +9,7 @@ permissions: jobs: label: - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - uses: nodejs/node-pr-labeler@d4cf1b8b9f23189c37917000e5e17e796c770a6b # v1 diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml index c1cbfafc1ac789..3d87cb09ead472 100644 --- a/.github/workflows/license-builder.yml +++ b/.github/workflows/license-builder.yml @@ -15,13 +15,13 @@ jobs: contents: write # for gr2m/create-or-update-pull-request-action to push local changes pull-requests: write # for gr2m/create-or-update-pull-request-action to create a PR if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - run: ./tools/license-builder.sh # Run the license builder tool - - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 + - uses: gr2m/create-or-update-pull-request-action@86ec1766034c8173518f61d2075cc2a173fb8c97 # v1.9.4 # Creates a PR or update the Action's existing PR, or # no-op if the base branch is already up-to-date. env: diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml new file mode 100644 index 00000000000000..ec7482d501b870 --- /dev/null +++ b/.github/workflows/lint-release-proposal.yml @@ -0,0 +1,102 @@ +name: Linters (release proposals) + +on: + push: + branches: + - v[0-9]+.[0-9]+.[0-9]+-proposal + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + PYTHON_VERSION: '3.14' + NODE_VERSION: lts/* + +permissions: + contents: read + +jobs: + lint-release-commit: + runs-on: ubuntu-slim + permissions: + contents: read + pull-requests: read + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + fetch-depth: 2 + - name: Lint release commit title format + run: | + EXPECTED_TITLE='^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}, Version [[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+ (\(Current|'.+' \(LTS)\)$' + echo "Expected commit title format: $EXPECTED_TITLE" + COMMIT_SUBJECT="$(git --no-pager log -1 --format=%s)" + echo "Actual: $ACTUAL" + echo "$COMMIT_SUBJECT" | grep -q -E "$EXPECTED_TITLE" + echo "COMMIT_SUBJECT=$COMMIT_SUBJECT" >> "$GITHUB_ENV" + - name: Lint release commit message trailers + run: | + EXPECTED_TRAILER="^$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pull/[[:digit:]]+\$" + echo "Expected trailer format: $EXPECTED_TRAILER" + PR_URL="$(git --no-pager log -1 --format='%(trailers:key=PR-URL,valueonly)')" + echo "Actual: $PR_URL" + echo "$PR_URL" | grep -E -q "$EXPECTED_TRAILER" + + PR_HEAD="$(gh pr view "$PR_URL" --json headRefOid -q .headRefOid)" + echo "Head of $PR_URL: $PR_HEAD" + echo "Current commit: $GITHUB_SHA" + [ "$PR_HEAD" = "$GITHUB_SHA" ] + env: + GH_TOKEN: ${{ github.token }} + - name: Verify it's release-ready + run: | + SKIP_XZ=1 make release-only + - name: Lint release commit content + run: | + MAJOR="$(awk '/^#define NODE_MAJOR_VERSION / { print $3 }' src/node_version.h)" + + echo "Checking for expected files in the release commit:" + missing_expected= + for expected in CHANGELOG.md src/node_version.h doc/changelogs/; do + if git diff --exit-code --quiet --diff-filter=M HEAD^ -- "$expected"; then + echo "Missing expected file in diff: $expected" + missing_expected=1 + fi + done + [ -z "$missing_expected" ] || exit 1 + + echo "Checking for unexpected files in the release commit:" + set -ex + [ -z "$(git diff-tree --no-commit-id --name-only -r HEAD --\ + . \ + ':(exclude)CHANGELOG.md' \ + ':(exclude)src/node_version.h' \ + ':(exclude)test/parallel/test-process-release.js' \ + ':(exclude)doc/api/' \ + ":(exclude)doc/changelogs/CHANGELOG_V$MAJOR.md")" ] + - name: Validate CHANGELOG + id: releaser-info + run: | + EXPECTED_CHANGELOG_TITLE_INTRO="## $COMMIT_SUBJECT, @" + echo "Expected CHANGELOG section title: $EXPECTED_CHANGELOG_TITLE_INTRO" + MAJOR="$(awk '/^#define NODE_MAJOR_VERSION / { print $3 }' src/node_version.h)" + CHANGELOG_PATH="doc/changelogs/CHANGELOG_V${MAJOR}.md" + CHANGELOG_TITLE="$(grep "$EXPECTED_CHANGELOG_TITLE_INTRO" "$CHANGELOG_PATH")" + echo "Actual: $CHANGELOG_TITLE" + [ "${CHANGELOG_TITLE%%@*}@" = "$EXPECTED_CHANGELOG_TITLE_INTRO" ] + gh api \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + --jq '.commits.[] | { smallSha: .sha[0:10] } + (.commit.message|capture("^(?.+)\n\n(.*\n)*PR-URL: (?<prURL>.+)\n"))' \ + "/repos/${GITHUB_REPOSITORY}/compare/v${MAJOR}.x...$GITHUB_SHA" --paginate \ + | node tools/actions/lint-release-proposal-commit-list.mjs "$CHANGELOG_PATH" "$GITHUB_SHA" \ + | while IFS= read -r PR_URL; do + LABEL="dont-land-on-v${MAJOR}.x" gh pr view \ + --json labels,url \ + --jq 'if (.labels|map(.name==env.LABEL)|any) then error("\(.url) has the \(env.LABEL) label, forbidding it to be in this release proposal") end' \ + "$PR_URL" > /dev/null + done + shell: bash # See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference, we want the pipefail option. + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index bfc1cd66785863..faa28d5ce7dba3 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -14,7 +14,7 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' NODE_VERSION: lts/* permissions: @@ -23,13 +23,13 @@ permissions: jobs: lint-addon-docs: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information @@ -38,13 +38,13 @@ jobs: run: NODE=$(command -v node) make lint-addon-docs lint-cpp: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -53,18 +53,18 @@ jobs: run: make lint-cpp format-cpp: if: ${{ github.event.pull_request && github.event.pull_request.draft == false && github.base_ref == github.event.repository.default_branch }} - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -91,19 +91,43 @@ jobs: fi lint-js-and-md: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information run: npx envinfo - name: Lint JavaScript files - run: NODE=$(command -v node) make lint-js + run: | + set +e + NODE=$(command -v node) make lint-js + EXIT_CODE="$?" + if [ "$EXIT_CODE" != "0" ]; then + echo + echo 'ERROR: The JavaScript lint validation failed (the errors are logged above).' + echo ' Please fix the lint errors.' + if NODE=$(command -v node) make lint-js-fix > /dev/null 2>&1; then + echo ' Run:' + echo ' make lint-js-fix' + echo ' to fix the lint issues.' + git --no-pager diff + elif git diff --quiet --exit-code; then + echo ' None of the issue is auto-fixable, so manual fixes for' + echo ' all of the issues are required.' + else + echo ' Run:' + echo ' make lint-js-fix' + echo ' to fix the auto-fixable lint issues.' + echo ' Note that some manual fixes are also required.' + fi + echo + exit "$EXIT_CODE" + fi - name: Get release version numbers if: ${{ github.event.pull_request && github.event.pull_request.base.ref == github.event.pull_request.base.repo.default_branch }} id: get-released-versions @@ -116,13 +140,23 @@ jobs: NODE_RELEASED_VERSIONS: ${{ steps.get-released-versions.outputs.NODE_RELEASED_VERSIONS }} lint-py: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + sparse-checkout: | + /Makefile + /benchmark/ + /doc/ + /lib/ + /src/node_version.h + /tools/ + pyproject.toml + *.py + sparse-checkout-cone-mode: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -133,13 +167,19 @@ jobs: make lint-py lint-yaml: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + sparse-checkout: | + /Makefile + /tools/pip/ + *.yml + *.yaml + sparse-checkout-cone-mode: false - name: Use Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -151,19 +191,25 @@ jobs: lint-sh: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + sparse-checkout: | + /tools/lint-sh.mjs + *.sh + sparse-checkout-cone-mode: false - run: shellcheck -V - name: Lint Shell scripts run: tools/lint-sh.mjs . lint-codeowners: if: github.event.pull_request.draft == false + # cannot use ubuntu-slim here because mszostok/codeowners-validator is dockerized + # cannot use ubuntu-24.04-arm here because the docker image is x86 only runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f @@ -171,11 +217,44 @@ jobs: checks: files,duppatterns lint-pr-url: if: ${{ github.event.pull_request }} - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 2 persist-credentials: false + sparse-checkout: | + /tools/lint-pr-url.mjs + /doc/api/ + sparse-checkout-cone-mode: false # GH Actions squashes all PR commits, HEAD^ refers to the base branch. - run: git diff HEAD^ HEAD -G"pr-url:" -- "*.md" | ./tools/lint-pr-url.mjs ${{ github.event.pull_request.html_url }} + lint-readme: + runs-on: ubuntu-slim + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + sparse-checkout: | + README.md + /tools/lint-readme-lists.mjs + sparse-checkout-cone-mode: false + - name: Get team members if possible + if: ${{ (github.event.pull_request && github.event.pull_request.base.ref == github.event.pull_request.base.repo.default_branch) || github.event.ref == github.event.repository.default_branch }} + id: team_members + run: | + get_list_members() { + TEAM="$1" + QUOTE='"' + gh api "/orgs/nodejs/teams/$TEAM/members" -X GET -f per_page=100 --jq "map(.login) | ${QUOTE}${TEAM}=\(tojson)${QUOTE}" + } + [ -z "$GITHUB_TOKEN" ] || ( + get_list_members "collaborators" + get_list_members "issue-triage" + get_list_members "tsc" + ) >> "$GITHUB_OUTPUT" + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + - run: tools/lint-readme-lists.mjs "$TEAMS" + env: + TEAMS: ${{ tojson(steps.team_members.outputs) }} diff --git a/.github/workflows/major-release.yml b/.github/workflows/major-release.yml new file mode 100644 index 00000000000000..b65917f89e74b2 --- /dev/null +++ b/.github/workflows/major-release.yml @@ -0,0 +1,49 @@ +name: Major Release + +on: + schedule: + - cron: 0 0 15 2,8 * # runs at midnight UTC every 15 February and 15 August + +permissions: + contents: read + +jobs: + create-issue: + if: github.repository == 'nodejs/node' + runs-on: ubuntu-slim + permissions: + issues: write + steps: + - name: Check for release schedule + id: check-date + run: | + # Get the current month and day + MONTH=$(date +'%m') + DAY=$(date +'%d') + # We'll create the reminder issue two months prior the release + if [[ "$MONTH" == "02" || "$MONTH" == "08" ]] && [[ "$DAY" == "15" ]]; then + echo "create_issue=true" >> "$GITHUB_ENV" + fi + - name: Retrieve next major release info from nodejs/Release + if: env.create_issue == 'true' + run: | + curl -L https://github.com/nodejs/Release/raw/HEAD/schedule.json | \ + jq -r 'to_entries | map(select(.value.start | strptime("%Y-%m-%d") | mktime > now)) | first | "VERSION=" + .key + "\nRELEASE_DATE=" + .value.start' >> "$GITHUB_ENV" + - name: Compute max date for landing semver-major PRs + if: env.create_issue == 'true' + run: | + echo "PR_MAX_DATE=$(date -d "$RELEASE_DATE -1 month" +%Y-%m-%d)" >> "$GITHUB_ENV" + - name: Create release announcement issue + if: env.create_issue == 'true' + run: | + gh issue create --repo "${GITHUB_REPOSITORY}" \ + --title "Upcoming Node.js Major Release ($VERSION)" \ + --body-file -<<EOF + A reminder that the next Node.js **SemVer Major release** is scheduled for **${RELEASE_DATE}**. + All commits that were landed until **${PR_MAX_DATE}** (one month prior to the release) will be included in the next semver major release. Please ensure that any necessary preparations are made in advance. + For more details on the release process, consult the [Node.js Release Working Group repository](https://github.com/nodejs/release). + + cc: @nodejs/collaborators + EOF + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml index a7f63c7bcad9ea..1e57b9993097f9 100644 --- a/.github/workflows/notify-on-push.yml +++ b/.github/workflows/notify-on-push.yml @@ -11,10 +11,11 @@ jobs: notifyOnForcePush: name: Notify on Force Push on `main` if: github.repository == 'nodejs/node' && github.event.forced - runs-on: ubuntu-latest + # cannot use ubuntu-slim here because rtCamp/action-slack-notify is dockerized + runs-on: ubuntu-24.04-arm steps: - name: Slack Notification - uses: rtCamp/action-slack-notify@4e5fb42d249be6a45a298f3c9543b111b02f7907 # 2.3.0 + uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 env: SLACK_COLOR: '#DE512A' SLACK_ICON: https://github.com/nodejs.png?size=48 @@ -27,40 +28,27 @@ jobs: SLACK_USERNAME: nodejs-bot SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - notifyOnMissingMetadata: - name: Notify on Push on `main` that lacks metadata + validateCommitMessage: + name: Notify on Push on `main` with invalid message if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - permissions: - pull-requests: write + # cannot use ubuntu-slim here because rtCamp/action-slack-notify is dockerized + runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Check commit message - run: npx -q core-validate-commit ${{ github.event.after }} || echo "INVALID_COMMIT_MESSAGE=1" >> $GITHUB_ENV - - name: Retrieve PR number if possible - if: env.INVALID_COMMIT_MESSAGE - run: | - COMMIT_TITLE=$(git --no-pager log --oneline -1 --no-color) node <<'EOF' >> $GITHUB_ENV || true - const invalidCommitMessageMatch = /\s\(\#(\d+)\)$/.exec(process.env.COMMIT_TITLE); - if (invalidCommitMessageMatch == null) process.exit(1) - console.log(`PR_ID=${invalidCommitMessageMatch[1]}`) - EOF - - name: Comment on the Pull Request - if: ${{ env.PR_ID }} - run: | - gh pr comment ${{ env.PR_ID }} --repo "${{ github.repository }}" \ - --body "A commit referencing this Pull Request was pushed to `${{ github.ref_name }}` by @${{ github.actor }} with an invalid commit message." + id: commit-check + run: npx -q core-validate-commit "$COMMIT" env: - GH_TOKEN: ${{ github.token }} + COMMIT: ${{ github.event.after }} - name: Slack Notification - if: ${{ env.INVALID_COMMIT_MESSAGE }} - uses: rtCamp/action-slack-notify@4e5fb42d249be6a45a298f3c9543b111b02f7907 # 2.3.0 + if: ${{ failure() && steps.commit-check.conclusion == 'failure' }} + uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 env: SLACK_COLOR: '#DE512A' SLACK_ICON: https://github.com/nodejs.png?size=48 - SLACK_TITLE: Invalid commit was pushed to ${{ github.repository.default_branch }} + SLACK_TITLE: Invalid commit was pushed to ${{ github.ref }} SLACK_MESSAGE: | <!here> A commit with an invalid message was pushed to <https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}|${{ github.repository }}@${{ github.ref_name }}> by <https://github.com/${{ github.actor }}|${{ github.actor }}>. diff --git a/.github/workflows/notify-on-review-wanted.yml b/.github/workflows/notify-on-review-wanted.yml new file mode 100644 index 00000000000000..1d3124e336b80b --- /dev/null +++ b/.github/workflows/notify-on-review-wanted.yml @@ -0,0 +1,45 @@ +name: Notify on Review Wanted +on: + issues: + types: [labeled] + pull_request_target: + types: [labeled] + +permissions: + contents: read + +jobs: + notifyOnReviewWanted: + name: Notify on Review Wanted + if: github.repository == 'nodejs/node' && github.event.label.name == 'review wanted' + # cannot use ubuntu-slim here because rtCamp/action-slack-notify is dockerized + runs-on: ubuntu-24.04-arm + steps: + - name: Determine PR or Issue + id: define-message + env: + TITLE_ISSUE: ${{ github.event.issue.title }} + TITLE_PR: ${{ github.event.pull_request.title }} + run: | + if [[ -n "${{ github.event.pull_request.number }}" ]]; then + number="${{ github.event.pull_request.number }}" + link="https://github.com/${{ github.repository }}/pull/$number" + echo "message=The PR (#$number) requires review from Node.js maintainers. See: $link" >> "$GITHUB_OUTPUT" + echo "title=$TITLE_PR" >> "$GITHUB_OUTPUT" + else + number="${{ github.event.issue.number }}" + link="https://github.com/${{ github.repository }}/issues/$number" + echo "message=The issue (#$number) requires review from Node.js maintainers. See: $link" >> "$GITHUB_OUTPUT" + echo "title=$TITLE_ISSUE" >> "$GITHUB_OUTPUT" + fi + + - name: Slack Notification + uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 + env: + MSG_MINIMAL: actions url + SLACK_COLOR: '#3d85c6' + SLACK_ICON: https://github.com/nodejs.png?size=48 + SLACK_TITLE: ${{ steps.define-message.outputs.title }} + SLACK_MESSAGE: ${{ steps.define-message.outputs.message }} + SLACK_USERNAME: nodejs-bot + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml new file mode 100644 index 00000000000000..87320f3f51da45 --- /dev/null +++ b/.github/workflows/post-release.yml @@ -0,0 +1,32 @@ +name: Post-Release actions + +on: + workflow_dispatch: + inputs: + version: + description: The version to generate a blog post for. + type: string + required: true + release: + types: [released] + +permissions: + contents: read + +jobs: + post-release-actions: + if: github.repository == 'nodejs/node' + runs-on: ubuntu-slim + steps: + - name: Trigger update-links workflow on nodejs/release-cloudflare-worker + run: | + gh workflow run update-links.yml --repo nodejs/release-cloudflare-worker + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + + - name: Trigger create-release-post workflow on nodejs/nodejs.org + run: | + gh workflow run create-release-post.yml --repo nodejs/nodejs.org -f version=$VERSION + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + VERSION: ${{ inputs.version || github.event.release.tag_name }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index bee3bf155f7059..16dd17dbc41bd0 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -21,7 +21,8 @@ permissions: read-all jobs: analysis: name: Scorecard analysis - runs-on: ubuntu-latest + # cannot use ubuntu-slim here because ossf/scorecard-action is dockerized + runs-on: ubuntu-24.04-arm permissions: # Needed to upload the results to code-scanning dashboard. security-events: write @@ -33,17 +34,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 # v2.7.0 + uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0 with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif @@ -65,7 +66,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: SARIF file path: results.sarif @@ -73,6 +74,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9 + uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9 with: sarif_file: results.sarif diff --git a/.github/workflows/test-asan.yml b/.github/workflows/test-asan.yml deleted file mode 100644 index 495f6679d950d5..00000000000000 --- a/.github/workflows/test-asan.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Test ASan - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-asan.yml' - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-asan.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - ASAN_OPTIONS: intercept_tls_get_addr=0 - PYTHON_VERSION: '3.12' - FLAKY_TESTS: keep_retrying - -permissions: - contents: read - -jobs: - test-asan: - if: github.event.pull_request.draft == false - runs-on: ubuntu-20.04 - env: - CC: clang - CXX: clang++ - LINK: clang++ - CONFIG_FLAGS: --enable-asan - steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Build - run: make build-ci -j4 V=1 - - name: Test - run: make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' -t 300 --measure-flakiness 9" diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml index 2f50448d45aded..d1b3d2c347a671 100644 --- a/.github/workflows/test-internet.yml +++ b/.github/workflows/test-internet.yml @@ -8,6 +8,7 @@ on: pull_request: types: [opened, synchronize, reopened, ready_for_review] paths: + - .github/workflows/test-internet.yml - test/internet/** - internal/dns/** - lib/dns.js @@ -19,6 +20,7 @@ on: - v[0-9]+.x-staging - v[0-9]+.x paths: + - .github/workflows/test-internet.yml - test/internet/** - internal/dns/** - lib/dns.js @@ -29,24 +31,32 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} permissions: contents: read jobs: test-internet: - if: github.repository == 'nodejs/node' || github.event_name != 'schedule' - runs-on: ubuntu-latest + if: github.event_name == 'schedule' && github.repository == 'nodejs/node' || github.event.pull_request.draft == false + runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo - name: Build diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index cebcf5d1152a5b..ec3f0b349996b0 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -3,7 +3,10 @@ name: Test Linux on: pull_request: paths-ignore: + - .mailmap - README.md + - vcbuild.bat + - test/internet/** - .github/** - '!.github/workflows/test-linux.yml' types: [opened, synchronize, reopened, ready_for_review] @@ -14,7 +17,10 @@ on: - v[0-9]+.x-staging - v[0-9]+.x paths-ignore: + - .mailmap - README.md + - vcbuild.bat + - test/internet/** - .github/** - '!.github/workflows/test-linux.yml' @@ -23,8 +29,11 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' FLAKY_TESTS: keep_retrying + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} permissions: contents: read @@ -32,18 +41,35 @@ permissions: jobs: test-linux: if: github.event.pull_request.draft == false - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, ubuntu-24.04-arm] steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + path: node - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" + run: make -C node build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - name: Test - run: make run-ci -j4 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + run: make -C node test-ci -j1 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" + - name: Re-run test in a folder whose name contains unusual chars + run: | + mv node "$DIR" + cd "$DIR" + ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 + env: + DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index ddcda36bd71aa6..95d656a765b5ed 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -8,6 +8,7 @@ on: - '**.md' - AUTHORS - doc/** + - test/internet/** - .github/** - '!.github/workflows/test-macos.yml' push: @@ -21,6 +22,7 @@ on: - '**.md' - AUTHORS - doc/** + - test/internet/** - .github/** - '!.github/workflows/test-macos.yml' @@ -29,7 +31,8 @@ concurrency: cancel-in-progress: true env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' + XCODE_VERSION: '16.1' FLAKY_TESTS: keep_retrying permissions: @@ -38,15 +41,29 @@ permissions: jobs: test-macOS: if: github.event.pull_request.draft == false + strategy: + fail-fast: false runs-on: macos-14 + env: + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} gcc + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} g++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false + path: node - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} + - name: Set up Xcode ${{ env.XCODE_VERSION }} + run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 + with: + version: v0.12.0 - name: Environment Information run: npx envinfo # The `npm ci` for this step fails a lot as part of the Test step. Run it @@ -56,8 +73,31 @@ jobs: # happen anymore running this step here first, that's also useful # information.) - name: tools/doc/node_modules workaround - run: make tools/doc/node_modules + run: make -C node tools/doc/node_modules + # This is needed due to https://github.com/nodejs/build/issues/3878 + - name: Cleanup + run: | + echo "::group::Free space before cleanup" + df -h + echo "::endgroup::" + echo "::group::Cleaned Files" + + sudo rm -rf /Users/runner/Library/Android/sdk + + echo "::endgroup::" + echo "::group::Free space after cleanup" + df -h + echo "::endgroup::" - name: Build - run: make build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn" + run: make -C node build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn" + - name: Free Space After Build + run: df -h - name: Test - run: make run-ci -j$(getconf _NPROCESSORS_ONLN) V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' --measure-flakiness 9" + run: make -C node test-ci -j1 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" + - name: Re-run test in a folder whose name contains unusual chars + run: | + mv node "$DIR" + cd "$DIR" + ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 + env: + DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-ubsan.yml b/.github/workflows/test-ubsan.yml deleted file mode 100644 index 0282f57e92aba8..00000000000000 --- a/.github/workflows/test-ubsan.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Test UBSan - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-ubsan.yml' - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-ubsan.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.12' - FLAKY_TESTS: keep_retrying - -permissions: - contents: read - -jobs: - test-ubsan: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - env: - CC: gcc - CXX: g++ - LINK: g++ - CONFIG_FLAGS: --enable-ubsan - steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - persist-credentials: false - - name: Store suppressions path - run: | - echo "UBSAN_OPTIONS=suppressions=$GITHUB_WORKSPACE/suppressions.supp" >> $GITHUB_ENV - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Build - run: make build-ci -j2 V=1 - - name: Test - run: make run-ci -j2 V=1 TEST_CI_ARGS="-p actions --node-args='--test-reporter=spec' --node-args='--test-reporter-destination=stdout' -t 300 --measure-flakiness 9" diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml index 00158082692fc6..6032e52eaf7456 100644 --- a/.github/workflows/timezone-update.yml +++ b/.github/workflows/timezone-update.yml @@ -16,16 +16,16 @@ jobs: pull-requests: write # to create a PR (gr2m/create-or-update-pull-request-action) if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - name: Checkout nodejs/node - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Checkout unicode-org/icu-data - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: path: icu-data persist-credentials: false diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 4cc595b44141df..035fed80b1c42a 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -16,22 +16,19 @@ on: - acorn - acorn-walk - ada - - base64 + - amaro - brotli - c-ares - cjs-module-lexer - corepack - - doc - - eslint - - github_reporter - googletest - gyp-next - histogram - icu - # - libuv - - lint-md-dependencies + - libuv - llhttp - minimatch + - nbytes - nghttp2 - nghttp3 - ngtcp2 @@ -39,20 +36,22 @@ on: - root-certificates - simdjson - simdutf + - sqlite - undici - uvwasi - zlib + - zstd env: - PYTHON_VERSION: '3.12' + PYTHON_VERSION: '3.14' permissions: contents: read jobs: tools-deps-update: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-slim strategy: fail-fast: false # Prevent other jobs from aborting if one fails matrix: @@ -81,17 +80,17 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output - - id: base64 + - id: amaro subsystem: deps - label: dependencies + label: dependencies, strip-types run: | - ./tools/dep_updaters/update-base64.sh > temp-output + ./tools/dep_updaters/update-amaro.sh > temp-output cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output - id: brotli subsystem: deps - label: dependencies + label: dependencies, zlib run: | ./tools/dep_updaters/update-brotli.sh > temp-output cat temp-output @@ -99,7 +98,7 @@ jobs: rm temp-output - id: c-ares subsystem: deps - label: dependencies + label: dependencies, cares run: | ./tools/dep_updaters/update-c-ares.sh > temp-output cat temp-output @@ -119,38 +118,6 @@ jobs: run: | make corepack-update echo "NEW_VERSION=$(node deps/corepack/dist/corepack.js --version)" >> $GITHUB_ENV - - id: doc - subsystem: tools - label: tools - run: | - cd tools/doc - npm ci - NEW_VERSION=$(npm outdated --parseable | cut -d: -f4 | xargs) - if [ "$NEW_VERSION" != "" ]; then - echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV - rm -rf package-lock.json node_modules - # Include $NEW_VERSION to explicitly update the package.json - # entry for the dependency and also so that semver-major updates - # are not skipped. - npm install --ignore-scripts $NEW_VERSION - npm install --ignore-scripts - fi - - id: eslint - subsystem: tools - label: tools - run: | - ./tools/dep_updaters/update-eslint.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: github_reporter - subsystem: tools - label: tools - run: | - ./tools/dep_updaters/update-github-reporter.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - id: googletest subsystem: deps label: dependencies, test @@ -161,7 +128,7 @@ jobs: rm temp-output - id: gyp-next subsystem: tools - label: tools + label: tools, gyp run: | ./tools/dep_updaters/update-gyp-next.sh > temp-output cat temp-output @@ -177,41 +144,20 @@ jobs: rm temp-output - id: icu subsystem: deps - label: dependencies, test + label: dependencies, test, icu run: | ./tools/dep_updaters/update-icu.sh > temp-output cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output - # libuv update was disabled because of Feb 14, 2024 security releas - # modified the bundled version of libuv, we cannot automatically update - # libuv without potentially undoing those changes. - # - id: libuv - # subsystem: deps - # label: dependencies - # run: | - # ./tools/dep_updaters/update-libuv.sh > temp-output - # cat temp-output - # tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - # rm temp-output - - id: lint-md-dependencies - subsystem: tools - label: tools + - id: libuv + subsystem: deps + label: dependencies run: | - cd tools/lint-md - npm ci - NEW_VERSION=$(npm outdated --parseable | cut -d: -f4 | xargs) - if [ "$NEW_VERSION" != "" ]; then - echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV - rm -rf package-lock.json node_modules - # Include $NEW_VERSION to explicitly update the package.json - # entry for the dependency and also so that semver-major updates - # are not skipped. - npm install --ignore-scripts $NEW_VERSION - npm install --ignore-scripts - cd ../.. - make lint-md-rollup - fi + ./tools/dep_updaters/update-libuv.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: llhttp subsystem: deps label: dependencies @@ -228,6 +174,14 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: nbytes + subsystem: deps + label: dependencies + run: | + ./tools/dep_updaters/update-nbytes.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: nghttp2 subsystem: deps label: dependencies @@ -281,6 +235,14 @@ jobs: cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: sqlite + subsystem: deps + label: dependencies, sqlite + run: | + ./tools/dep_updaters/update-sqlite.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: undici subsystem: deps label: dependencies @@ -299,20 +261,34 @@ jobs: rm temp-output - id: zlib subsystem: deps - label: dependencies + label: dependencies, zlib run: | ./tools/dep_updaters/update-zlib.sh > temp-output cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output + - id: zstd + subsystem: deps + label: dependencies, zlib + run: | + ./tools/dep_updaters/update-zstd.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Setup Git config + 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 if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - if: matrix.id == 'icu' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + if: | + (matrix.id == 'icu' || matrix.id == 'inspector_protocol') && + (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) + uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 with: python-version: ${{ env.PYTHON_VERSION }} - run: ${{ matrix.run }} @@ -323,17 +299,15 @@ jobs: if: env.COMMIT_MSG == '' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) run: | echo "COMMIT_MSG=${{ matrix.subsystem }}: update ${{ matrix.id }} to ${{ env.NEW_VERSION }}" >> "$GITHUB_ENV" - - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 + - uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0 if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id # Creates a PR or update the Action's existing PR, or # no-op if the base branch is already up-to-date. - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} with: - author: Node.js GitHub Bot <github-bot@iojs.org> - body: This is an automated update of ${{ matrix.id }} to ${{ env.NEW_VERSION }}. + token: ${{ secrets.GH_USER_TOKEN }} branch: actions/tools-update-${{ matrix.id }} # Custom branch *just* for this Action. + delete-branch: true commit-message: ${{ env.COMMIT_MSG }} labels: ${{ matrix.label }} title: '${{ matrix.subsystem }}: update ${{ matrix.id }} to ${{ env.NEW_VERSION }}' - update-pull-request-title-and-body: true + body: This is an automated update of ${{ matrix.id }} to ${{ env.NEW_VERSION }}. diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml index 23361dec160467..ec5237a456956a 100644 --- a/.github/workflows/update-openssl.yml +++ b/.github/workflows/update-openssl.yml @@ -12,9 +12,9 @@ permissions: jobs: openssl-update: if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Check and download new OpenSSL version @@ -35,8 +35,8 @@ jobs: author: Node.js GitHub Bot <github-bot@iojs.org> body: This is an automated update of OpenSSL to ${{ env.NEW_VERSION }}. branch: actions/tools-update-openssl # Custom branch *just* for this Action. - commit-message: 'deps: upgrade openssl sources to quictls/openssl-${{ env.NEW_VERSION }}' - labels: dependencies + commit-message: 'deps: upgrade openssl sources to openssl-${{ env.NEW_VERSION }}' + labels: dependencies, openssl title: 'deps: update OpenSSL to ${{ env.NEW_VERSION }}' path: deps/openssl update-pull-request-title-and-body: true diff --git a/.github/workflows/update-release-links.yml b/.github/workflows/update-release-links.yml deleted file mode 100644 index 3eaa61260545e8..00000000000000 --- a/.github/workflows/update-release-links.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Update release links - -on: - workflow_dispatch: - release: - types: [released] - -permissions: - contents: read - -jobs: - update-release-links: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - name: Trigger update-links workflow on nodejs/release-cloudflare-worker - run: | - gh workflow run update-links.yml --repo nodejs/release-cloudflare-worker - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml index e2b58456bf789a..c5e28d29a11fb7 100644 --- a/.github/workflows/update-v8.yml +++ b/.github/workflows/update-v8.yml @@ -14,13 +14,13 @@ permissions: jobs: v8-update: if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest + runs-on: ubuntu-slim steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: Cache node modules and update-v8 - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 id: cache-v8-npm env: cache-name: cache-v8-npm @@ -30,26 +30,28 @@ jobs: ~/.npm key: ${{ runner.os }}-build-${{ env.cache-name }} - name: Install Node.js - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: ${{ env.NODE_VERSION }} - name: Install @node-core/utils run: npm install -g @node-core/utils + - name: Setup Git config + run: | + git config --global user.name "Node.js GitHub Bot" + git config --global user.email "github-bot@iojs.org" - name: Check and download new V8 version run: | ./tools/dep_updaters/update-v8-patch.sh > temp-output cat temp-output tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output - - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 + - uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 # v8.0.0 # Creates a PR or update the Action's existing PR, or # no-op if the base branch is already up-to-date. - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} with: - author: Node.js GitHub Bot <github-bot@iojs.org> - body: This is an automated patch update of V8 to ${{ env.NEW_VERSION }}. + token: ${{ secrets.GH_USER_TOKEN }} branch: actions/update-v8-patch # Custom branch *just* for this Action. - labels: v8 engine + delete-branch: true title: 'deps: patch V8 to ${{ env.NEW_VERSION }}' - update-pull-request-title-and-body: true + body: This is an automated patch update of V8 to ${{ env.NEW_VERSION }}. + labels: dependencies, v8 engine diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml new file mode 100644 index 00000000000000..355f2780f23b3b --- /dev/null +++ b/.github/workflows/update-wpt.yml @@ -0,0 +1,87 @@ +name: WPT update + +on: + schedule: + # Run once a week at 12:00 AM UTC on Sunday. + - cron: 0 0 * * 0 + workflow_dispatch: + inputs: + subsystems: + description: Subsystem to run the update for + required: false + default: '["url", "WebCryptoAPI"]' + +permissions: + contents: read + +env: + NODE_VERSION: lts/* + +jobs: + wpt-subsystem-update: + if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-slim + strategy: + fail-fast: false + matrix: + subsystem: ${{ fromJSON(github.event.inputs.subsystems || '["url", "WebCryptoAPI"]') }} + + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + + - name: Install Node.js + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install @node-core/utils + run: npm install -g @node-core/utils + + - name: Setup @node-core/utils + run: | + ncu-config set username "$USERNAME" + ncu-config set token "$GH_TOKEN" + ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" + ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" + env: + USERNAME: ${{ secrets.JENKINS_USER }} + GH_TOKEN: ${{ secrets.GH_USER_TOKEN }} + + - name: Update WPT for subsystem ${{ matrix.subsystem }} + run: | + git node wpt "$SUBSYSTEM" + env: + SUBSYSTEM: ${{ matrix.subsystem }} + + - name: Retrieve new version commit + run: | + new_version="$( + node -p 'require("./test/fixtures/wpt/versions.json")[process.argv[1]].commit' "$SUBSYSTEM" + )" + { + echo "long_version=$new_version" + echo "short_version=${new_version:0:10}" + } >> "$GITHUB_ENV" + env: + SUBSYSTEM: ${{ matrix.subsystem }} + + - name: Open or update PR for the subsystem update + uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 + with: + # The create-or-update-pull-request-action matches the branch name by prefix, + # which is why we need to add the -wpt suffix. If we dont do that, we risk matching wrong PRs, + # like for example "url" mistakenly matching and updating the "urlpattern" PR + # as seen in https://github.com/nodejs/node/pull/57368 + branch: actions/update-${{ matrix.subsystem }}-wpt + author: Node.js GitHub Bot <github-bot@iojs.org> + title: 'test: update WPT for ${{ matrix.subsystem }} to ${{ env.short_version }}' + commit-message: 'test: update WPT for ${{ matrix.subsystem }} to ${{ env.short_version }}' + labels: test + update-pull-request-title-and-body: true + body: > + This is an automated update of the WPT for ${{ matrix.subsystem }} to + https://github.com/web-platform-tests/wpt/commit/${{ env.long_version }}. + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.gitignore b/.gitignore index 34c26e3a81e051..bf839aa91c86e1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,15 +7,10 @@ .* # Exclude specific dotfiles that we want to track. !deps/**/.* -!.devcontainer/ -!.devcontainer/.devcontainer.json !test/fixtures/**/.* !.clang-format !.cpplint !.editorconfig -!.eslintignore -!.eslintrc.js -!.eslintrc.yaml !.gitattributes !.github !.gitignore @@ -24,6 +19,8 @@ !.mailmap !.nycrc !.yamllint.yaml +!.configurations/ +!/.npmrc # === Rules for root dir === /core @@ -115,6 +112,8 @@ tools/*/*.i.tmp /node_modules /tools/doc/node_modules /tools/clang-format/node_modules +/tools/eslint/node_modules +/tools/lint-md/node_modules # === Rules for test artifacts === /*.tap @@ -167,3 +166,10 @@ __pycache__ # === Rules for C++ development === compile_commands.json + +# === Dev Container rules === +# Only track the shared base devcontainer.json; ignore everything else under .devcontainer +!.devcontainer/ +.devcontainer/** +!.devcontainer/base/ +!.devcontainer/base/devcontainer.json diff --git a/.mailmap b/.mailmap index 1a3408a3f221d5..0422fba4472601 100644 --- a/.mailmap +++ b/.mailmap @@ -2,9 +2,11 @@ Aaron Bieber <aaron@bolddaemon.com> <deftly@gmail.com> Aaron Heckmann <aaron.heckmann@gmail.com> <aaron.heckmann+github@gmail.com> Aayush Ahuja <aayush.a@directi.com> +Abdirahim Musse <abdirahim.musse@ibm.com> <33973272+abmusse@users.noreply.github.com> Abe Fettig <abefettig@gmail.com> <abe@fettig.net> Abhimanyu Vashisht <abhimanyuvashisht.av@gmail.com> Adam Langley <agl@imperialviolet.org> <agl@google.com> +Aditi Singh <aditisingh1400@gmail.com> Akhil Marsonya <akhil.marsonya27@gmail.com> Akhil Marsonya <akhil.marsonya27@gmail.com> <16393876+marsonya@users.noreply.github.com> Akito Ito <akito0107@gmail.com> <akito_ito@r.recruit.co.jp> @@ -98,6 +100,7 @@ Chen Gang <gangc.cxy@foxmail.com> Chen Gang <gangc.cxy@foxmail.com> <13298548+MoonBall@users.noreply.github.com> Chengzhong Wu <legendecas@gmail.com> Chengzhong Wu <legendecas@gmail.com> <chengzhong.wcz@alibaba-inc.com> +Chengzhong Wu <legendecas@gmail.com> <cwu631@bloomberg.net> Chew Choon Keat <choonkeat@gmail.com> Chris Andrews <cpandrews8@gmail.com> Chris Johnson <chris.s.johnson4@gmail.com> @@ -202,6 +205,7 @@ George Adams <gadams@microsoft.com> <george.adams@uk.ibm.com> Gerhard Stöbich <deb2001-github@yahoo.de> Gibson Fahnestock <gibfahn@gmail.com> <gib@uk.ibm.com> Gil Pedersen <git@gpost.dk> <github@gpost.dk> +Giovanni Bucci <github@puskin.it> Graham Fairweather <xotic750@gmail.com> <xotic750@gmail> Greg Sabia Tucker <greg@narrowlabs.com> <greg@tucke.rs> Gregor Martynus <gregor@martynus.net> @@ -238,7 +242,8 @@ James Ide <ide@jameside.com> <ide@users.noreply.github.com> James M Snell <jasnell@gmail.com> James Nimlos <james@nimlos.com> James Sumners <james@sumners.email> <james.sumners@gmail.com> -Jan Krems <jan.krems@gmail.com> <jan.krems@groupon.com> +Jan Martin <jan.krems@gmail.com> +Jan Martin <jan.krems@gmail.com> <jankrems@google.com> Jem Bezooyen <github@jem.dev> <jem@hipmedia.ca> Jem Bezooyen <github@jem.dev> <jem@sendwithus.com> Jenna Vuong <jennavuong@gmail.com> <hello@jennavuong.com> @@ -267,6 +272,7 @@ John McGuirk <johnmac81@gmail.com> John Musgrave <musgravejw@gmail.com> Johnny Ray Austin <johnny@johnnyray.me> <http://johnnyray.me> Jon Tippens <jwtippens@gmail.com> +Jonas Badalic <jonas.badalic@gmail.com> <jonas@badalic.com> Jonas Pfenniger <jonas@pfenniger.name> <jonas@stvs.ch> Jonathan Gourlay <gourlayjd@linux.com> Jonathan Ong <jonathanrichardong@gmail.com> <jonathanong@users.noreply.github.com> @@ -431,7 +437,8 @@ Rebecca Turner <me@re-becca.org> <rebecca@npmjs.com> Refael Ackermann <refack@gmail.com> <refael@empeeric.com> Reza Akhavan <reza@akhavan.me> Ricardo Sánchez Gregorio <me@richnologies.io> -Richard Lau <rlau@redhat.com> <riclau@uk.ibm.com> +Richard Lau <richard.lau@ibm.com> <riclau@uk.ibm.com> +Richard Lau <richard.lau@ibm.com> <rlau@redhat.com> Rick Olson <technoweenie@gmail.com> rickyes <0x19951125@gmail.com> <ives199511@gmail.com> rickyes <0x19951125@gmail.com> <mail@zhoumq.cn> @@ -585,7 +592,7 @@ xiaoyu <306766053@qq.com> Xu Meng <dmabupt@gmail.com> <mengxumx@cn.ibm.com> Xuguang Mei <meixuguang@gmail.com> <meixg@foxmail.com> Yael Hermon <yaelherm@gmail.com> <yaelhe@wix.com> -Yagiz Nizipli <yagiz.nizipli@sentry.io> <yagiz@nizipli.com> +Yagiz Nizipli <yagiz@nizipli.com> <yagiz.nizipli@sentry.io> Yang Guo <yangguo@chromium.org> Yash Ladha <yash@yashladha.in> <18033231+yashLadha@users.noreply.github.com> Yash Ladha <yash@yashladha.in> <yashladhapankajladha123@gmail.com> diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000000000..97b895e2f9681e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +ignore-scripts=true diff --git a/BUILDING.md b/BUILDING.md index 0b0362e8bf3749..2767e01ca749b6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -19,7 +19,7 @@ file a new issue. * [OpenSSL asm support](#openssl-asm-support) * [Previous versions of this document](#previous-versions-of-this-document) * [Building Node.js on supported platforms](#building-nodejs-on-supported-platforms) - * [Note about Python](#note-about-python) + * [Prerequisites](#prerequisites) * [Unix and macOS](#unix-and-macos) * [Unix prerequisites](#unix-prerequisites) * [macOS prerequisites](#macos-prerequisites) @@ -31,12 +31,16 @@ file a new issue. * [Building a debug build](#building-a-debug-build) * [Building an ASan build](#building-an-asan-build) * [Speeding up frequent rebuilds when developing](#speeding-up-frequent-rebuilds-when-developing) + * [ccache](#ccache) + * [Loading JS files from disk instead of embedding](#loading-js-files-from-disk-instead-of-embedding) * [Troubleshooting Unix and macOS builds](#troubleshooting-unix-and-macos-builds) * [Windows](#windows) - * [Prerequisites](#prerequisites) + * [Windows Prerequisites](#windows-prerequisites) * [Option 1: Manual install](#option-1-manual-install) - * [Option 2: Automated install with Boxstarter](#option-2-automated-install-with-boxstarter) + * [Option 2: Automated install with WinGet](#option-2-automated-install-with-winget) + * [Option 3: Automated install with Boxstarter](#option-3-automated-install-with-boxstarter) * [Building Node.js](#building-nodejs-2) + * [Using ccache](#using-ccache) * [Android](#android) * [`Intl` (ECMA-402) support](#intl-ecma-402-support) * [Build with full ICU support (all locales supported by ICU)](#build-with-full-icu-support-all-locales-supported-by-icu) @@ -120,10 +124,11 @@ platforms. This is true regardless of entries in the table below. | SmartOS | x64 | >= 18 | Tier 2 | | | AIX | ppc64be >=power8 | >= 7.2 TL04 | Tier 2 | | | FreeBSD | x64 | >= 13.2 | Experimental | | +| OpenHarmony | arm64 | >= 5.0 | Experimental | | <!--lint disable final-definition--> -[^1]: Older kernel versions may work. However official Node.js release +[^1]: Older kernel versions may work. However, official Node.js release binaries are [built on RHEL 8 systems](#official-binary-platforms-and-toolchains) with kernel 4.18. @@ -155,11 +160,11 @@ platforms. This is true regardless of entries in the table below. Depending on the host platform, the selection of toolchains may vary. -| Operating System | Compiler Versions | -| ---------------- | -------------------------------------------------------------- | -| Linux | GCC >= 10.1 | -| Windows | Visual Studio >= 2022 with the Windows 10 SDK on a 64-bit host | -| macOS | Xcode >= 13 (Apple LLVM >= 12) | +| Operating System | Compiler Versions | +| ---------------- | ----------------------------------------------------------- | +| Linux | GCC >= 10.1 | +| Windows | Visual Studio 2022 with the Windows 10 SDK on a 64-bit host | +| macOS | Xcode >= 13 (Apple LLVM >= 12) | ### Official binary platforms and toolchains @@ -168,8 +173,8 @@ Binaries at <https://nodejs.org/download/release/> are produced on: | Binary package | Platform and Toolchain | | ----------------------- | ----------------------------------------------------------------------------------------------------------- | | aix-ppc64 | AIX 7.2 TL04 on PPC64BE with GCC 10 | -| darwin-x64 | macOS 11, Xcode 13 with -mmacosx-version-min=11.0 | -| darwin-arm64 (and .pkg) | macOS 11 (arm64), Xcode 13 with -mmacosx-version-min=11.0 | +| darwin-x64 | macOS 13, Xcode 16 with -mmacosx-version-min=11.0 | +| darwin-arm64 (and .pkg) | macOS 13 (arm64), Xcode 16 with -mmacosx-version-min=11.0 | | linux-arm64 | RHEL 8 with GCC 10[^6] | | linux-armv7l | Cross-compiled on RHEL 8 x64 with [custom GCC toolchain](https://github.com/rvagg/rpi-newer-crosstools)[^7] | | linux-ppc64le | RHEL 8 with gcc-toolset-10[^6] | @@ -210,8 +215,7 @@ For use of AVX2, * llvm version 3.3 or higher * nasm version 2.10 or higher in Windows -Please refer to -<https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_ia32cap.html> for details. +Please refer to <https://docs.openssl.org/1.1.1/man3/OPENSSL_ia32cap/> for details. If compiling without one of the above, use `configure` with the `--openssl-no-asm` flag. Otherwise, `configure` will fail. @@ -222,15 +226,16 @@ Supported platforms and toolchains change with each major version of Node.js. This document is only valid for the current major version of Node.js. Consult previous versions of this document for older versions of Node.js: -* [Node.js 19](https://github.com/nodejs/node/blob/v19.x/BUILDING.md) -* [Node.js 18](https://github.com/nodejs/node/blob/v18.x/BUILDING.md) -* [Node.js 16](https://github.com/nodejs/node/blob/v16.x/BUILDING.md) +* [Node.js 24](https://github.com/nodejs/node/blob/v24.x/BUILDING.md) +* [Node.js 22](https://github.com/nodejs/node/blob/v22.x/BUILDING.md) +* [Node.js 20](https://github.com/nodejs/node/blob/v20.x/BUILDING.md) ## Building Node.js on supported platforms -### Note about Python +### Prerequisites -The Node.js project supports Python >= 3 for building and testing. +* [A supported version of Python][Python versions] for building and testing. +* Memory: at least 8GB of RAM is typically required when compiling with 4 parallel jobs (e.g: `make -j4`) ### Unix and macOS @@ -243,7 +248,7 @@ The Node.js project supports Python >= 3 for building and testing. Installation via Linux package manager can be achieved with: -* Ubuntu, Debian: `sudo apt-get install python3 g++ make python3-pip` +* Ubuntu, Debian: `sudo apt-get install python3 g++-12 gcc-12 make python3-pip` * Fedora: `sudo dnf install python3 gcc-c++ make python3-pip` * CentOS and RHEL: `sudo yum install python3 gcc-c++ make python3-pip` * OpenSUSE: `sudo zypper install python3 gcc-c++ make python3-pip` @@ -271,10 +276,16 @@ fail. To build Node.js: ```bash +export CXX=g++-12 ./configure make -j4 ``` +> \[!IMPORTANT] +> If you face a compilation error during this process such as +> `error: no matching conversion for functional-style cast from 'unsigned int' to 'TypeIndex'` +> Make sure to use a `g++` or `clang` version compatible with C++20. + We can speed up the builds by using [Ninja](https://ninja-build.org/). For more information, see [Building Node.js with Ninja](doc/contributing/building-node-with-ninja.md). @@ -350,6 +361,27 @@ You can also execute the tests in a test suite directory tools/test.py test/message ``` +You can execute tests that match a specific naming pattern using the wildcard +`*`. For example, to run all tests under `test/parallel` with a name that starts +with `test-stream-`: + +```bash +tools/test.py test/parallel/test-stream-* +tools/test.py parallel/test-stream-* # The test/ prefix can be omitted +# In some shell environments, you may need to quote the pattern +tools/test.py "test/parallel/test-stream-*" +``` + +The wildcard `*` can be used in any part of the path. For example, to run all tests +with a name that starts with `test-inspector-`, regardless of the directory they are in: + +```bash +# Matches test/sequential/test-inspector-*, test/parallel/test-inspector-*, +# test/known_issues/test-inspector-*, etc. +tools/test.py "test/*/test-inspector-*" +tools/test.py "*/test-inspector-*" # The test/ prefix can be omitted +``` + If you want to check the other options, please refer to the help by using the `--help` option: @@ -528,11 +560,11 @@ $ gdb /opt/node-debug/node core.node.8.1535359906 [ASan](https://github.com/google/sanitizers) can help detect various memory related bugs. ASan builds are currently only supported on linux. If you want to check it on Windows or macOS or you want a consistent toolchain -on Linux, you can try [Docker](https://www.docker.com/products/docker-desktop) +on Linux, you can try [Docker](https://www.docker.com/products/docker-desktop/) (using an image like `gengjiawen/node-build:2020-02-14`). The `--debug` is not necessary and will slow down build and testing, but it can -show clear stacktrace if ASan hits an issue. +show a clear stack trace if ASan hits an issue. ```bash ./configure --debug --enable-asan && make -j4 @@ -541,16 +573,21 @@ make test-only #### Speeding up frequent rebuilds when developing +##### ccache + Tips: The `ccache` utility is widely used and should generally work fine. If you encounter any difficulties, consider disabling `mold` as a troubleshooting step. If you plan to frequently rebuild Node.js, especially if using several -branches, installing `ccache` and `mold` can help to greatly reduce build +branches, installing `ccache` can help to greatly reduce build times. Set up with: On GNU/Linux: +Tips: `mold` can speed up the link process, which can't be cached, you may +need to install the latest version but not the apt version. + ```bash sudo apt install ccache mold # for Debian/Ubuntu, included in most Linux distros export CC="ccache gcc" # add to your .profile @@ -558,17 +595,20 @@ export CXX="ccache g++" # add to your .profile export LDFLAGS="-fuse-ld=mold" # add to your .profile ``` +Refs: + +1. <https://ccache.dev/performance.html> +2. <https://github.com/rui314/mold> + On macOS: ```bash -brew install ccache mold # see https://brew.sh +brew install ccache # see https://brew.sh export CC="ccache cc" # add to ~/.zshrc or other shell config file export CXX="ccache c++" # add to ~/.zshrc or other shell config file -export LDFLAGS="-fuse-ld=mold" # add to ~/.zshrc or other shell config file ``` -This will allow for near-instantaneous rebuilds when switching branches back -and forth that were built with cache. +##### Loading JS files from disk instead of embedding When modifying only the JS layer in `lib`, it is possible to externally load it without modifying the executable: @@ -582,11 +622,6 @@ the specified directory. The JS debugger of Visual Studio Code supports this configuration since the November 2020 version and allows for setting breakpoints. -Refs: - -1. <https://ccache.dev/performance.html> -2. <https://github.com/rui314/mold> - #### Troubleshooting Unix and macOS builds Stale builds can sometimes result in `file not found` errors while building. @@ -598,12 +633,17 @@ rebuild may take a lot more time than previous builds. Additionally, ran `./configure` with non-default options (such as `--debug`), you will need to run it again before invoking `make -j4`. +If you received the error `nodejs g++ fatal error compilation terminated cc1plus` +during compilation, this is likely a memory issue and you should either provide +more RAM or create swap space to accommodate toolchain requirements or reduce +the number of parallel build tasks (`-j<n>`). + ### Windows #### Tips -You may need disable vcpkg integration if you got link error about symbol -redefine related to zlib.lib(zlib1.dll), even you never install it by hand, +You may need to disable vcpkg integration if you encounter a link error about symbol +redefinition related to zlib.lib(zlib1.dll), even if you never installed it by hand, as vcpkg is part of CLion and Visual Studio now. ```powershell @@ -614,17 +654,21 @@ vcpkg owns zlib1.dll vcpkg integrate remove ``` -Refs: #24448, <https://github.com/microsoft/vcpkg/issues/37518>, [vcpkg](https://github.com/microsoft/vcpkg/) +Refs: + +1. <https://github.com/nodejs/node/issues/24448> +2. <https://github.com/microsoft/vcpkg/issues/37518> / <https://github.com/microsoft/vcpkg/discussions/37546> +3. [vcpkg](https://github.com/microsoft/vcpkg/) -#### Prerequisites +#### Windows Prerequisites ##### Option 1: Manual install * The current [version of Python][Python versions] from the [Microsoft Store](https://apps.microsoft.com/store/search?publisher=Python+Software+Foundation) * The "Desktop development with C++" workload from - [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) or - the "C++ build tools" workload from the + [Visual Studio 2022 (17.6 or newer)](https://visualstudio.microsoft.com/downloads/) + or the "C++ build tools" workload from the [Build Tools](https://aka.ms/vs/17/release/vs_buildtools.exe), with the default optional components * Basic Unix tools required for some tests, @@ -640,15 +684,49 @@ Optional requirements to build the MSI installer package: * The .NET SDK component from [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) * This component can be installed via the Visual Studio Installer Application -Optional requirements for compiling for Windows 10 on ARM (ARM64): +Optional requirements for compiling for Windows on ARM (ARM64): -* Visual Studio 17.6.0 or newer +* Visual Studio 2022 (17.6.0 or newer) + > **Note:** There is [a bug](https://github.com/nodejs/build/issues/3739) in `17.10.x` + > preventing Node.js from compiling. * Visual Studio optional components * Visual C++ compilers and libraries for ARM64 * Visual C++ ATL for ARM64 * Windows 10 SDK 10.0.17763.0 or newer -##### Option 2: Automated install with Boxstarter +Optional requirements for compiling with ClangCL (search for `clang` in Visual Studio +Installer's "individual component" tab): + +* Visual Studio individual components + * C++ Clang Compiler for Windows + * MSBuild support for LLVM toolset + +NOTE: Currently we only support compiling with Clang that comes from Visual Studio. + +When building with ClangCL, if the output from `vcbuild.bat` shows that the components are not installed +even when the Visual Studio Installer shows that they are installed, try removing the components +first and then reinstalling them again. + +##### Option 2: Automated install with WinGet + +[WinGet configuration files](https://github.com/nodejs/node/tree/main/.configurations) +can be used to install all the required prerequisites for Node.js development +easily. These files will install the following +[WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget/) packages: + +* Git for Windows with the `git` and Unix tools added to the `PATH` +* `Python 3.14` +* `Visual Studio 2022` (Community, Enterprise or Professional) +* `Visual Studio 2022 Build Tools` with Visual C++ workload, Clang and ClangToolset +* `NetWide Assembler` + +To install Node.js prerequisites from PowerShell Terminal: + +```powershell +winget configure .\.configurations\configuration.dsc.yaml +``` + +##### Option 3: Automated install with Boxstarter A [Boxstarter](https://boxstarter.org/) script can be used for easy setup of Windows systems with all the required prerequisites for Node.js development. @@ -663,9 +741,9 @@ packages: * [NetWide Assembler](https://chocolatey.org/packages/nasm) To install Node.js prerequisites using -[Boxstarter WebLauncher](https://boxstarter.org/weblauncher), open +[Boxstarter WebLauncher](https://boxstarter.org/weblauncher), visit <https://boxstarter.org/package/nr/url?https://raw.githubusercontent.com/nodejs/node/HEAD/tools/bootstrap/windows_boxstarter> -with Edge browser on the target machine. +with a supported browser. Alternatively, you can use PowerShell. Run those commands from an elevated (Administrator) PowerShell terminal: @@ -689,6 +767,15 @@ disk space. git clone https://github.com/nodejs/node.git cd node ``` + +> \[!TIP] +> If you are building from a Windows machine, symlinks are disabled by default, and can be enabled by cloning +> with the `-c core.symlinks=true` flag. +> +> ```powershell +> git clone -c core.symlinks=true <repository_url> +> ``` + * If the path to your build directory contains a space or a non-ASCII character, the build will likely fail @@ -710,6 +797,42 @@ To test if Node.js was built correctly: Release\node -e "console.log('Hello from Node.js', process.version)" ``` +##### Using ccache: + +Follow <https://github.com/ccache/ccache/wiki/MS-Visual-Studio>, and you +should notice that obj file will be bigger than the normal one. + +First, install ccache. Assuming the installation of ccache is in `c:\ccache` +(where you can find `ccache.exe`), copy `c:\ccache\ccache.exe` to `c:\ccache\cl.exe` +with this command. + +```powershell +cp c:\ccache\ccache.exe c:\ccache\cl.exe +``` + +With newer version of Visual Studio, it may need the copy to be `clang-cl.exe` +instead. If the output of `vcbuild.bat` suggests missing `clang-cl.exe`, copy +it differently: + +```powershell +cp c:\ccache\ccache.exe c:\ccache\clang-cl.exe +``` + +When building Node.js, provide a path to your ccache via the option: + +```powershell +.\vcbuild.bat ccache c:\ccache\ +``` + +This will allow for near-instantaneous rebuilds when switching branches back +and forth that were built with cache. + +To use it with ClangCL, run this instead: + +```powershell +.\vcbuild.bat clang-cl ccache c:\ccache\ +``` + ### Android Android is not a supported platform. Patches to improve the Android build are @@ -731,7 +854,7 @@ architecture supports \[arm, arm64/aarch64, x86, x86\_64]. ## `Intl` (ECMA-402) support -[Intl](https://github.com/nodejs/node/blob/HEAD/doc/api/intl.md) support is +[Intl](doc/api/intl.md) support is enabled by default. ### Build with full ICU support (all locales supported by ICU) @@ -797,7 +920,7 @@ that works for both your host and target environments. ### Build with a specific ICU You can find other ICU releases at -[the ICU homepage](http://site.icu-project.org/download). +[the ICU homepage](https://icu.unicode.org/download). Download the file named something like `icu4c-**##.#**-src.tgz` (or `.zip`). @@ -828,7 +951,7 @@ From a tarball URL: #### Windows First unpack latest ICU to `deps/icu` -[icu4c-**##.#**-src.tgz](http://site.icu-project.org/download) (or `.zip`) +[icu4c-**##.#**-src.tgz](https://icu.unicode.org/download) (or `.zip`) as `deps/icu` (You'll have: `deps/icu/source/...`) ```powershell @@ -851,10 +974,10 @@ configure option: ## Building Node.js with FIPS-compliant OpenSSL Node.js supports FIPS when statically or dynamically linked with OpenSSL 3 via -[OpenSSL's provider model](https://www.openssl.org/docs/man3.0/man7/crypto.html#OPENSSL-PROVIDERS). +[OpenSSL's provider model](https://docs.openssl.org/3.0/man7/crypto/#OPENSSL-PROVIDERS). It is not necessary to rebuild Node.js to enable support for FIPS. -See [FIPS mode](./doc/api/crypto.md#fips-mode) for more information on how to +See [FIPS mode](doc/api/crypto.md#fips-mode) for more information on how to enable FIPS support in Node.js. ## Building Node.js with external core modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 1838a4dac92e75..68f35b70d0eca9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,11 @@ Select a Node.js version below to view the changelog history: +* [Node.js 22](doc/changelogs/CHANGELOG_V22.md) **Long Term Support** * [Node.js 21](doc/changelogs/CHANGELOG_V21.md) **Current** -* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) **Long Term Support** +* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) Long Term Support * [Node.js 19](doc/changelogs/CHANGELOG_V19.md) End-of-Life -* [Node.js 18](doc/changelogs/CHANGELOG_V18.md) **Long Term Support** +* [Node.js 18](doc/changelogs/CHANGELOG_V18.md) End-of-Life * [Node.js 17](doc/changelogs/CHANGELOG_V17.md) End-of-Life * [Node.js 16](doc/changelogs/CHANGELOG_V16.md) End-of-Life * [Node.js 15](doc/changelogs/CHANGELOG_V15.md) End-of-Life @@ -30,12 +31,44 @@ release. <table> <tr> + <th title="LTS Until 2027-04"><a href="doc/changelogs/CHANGELOG_V22.md">22</a> (LTS)</th> <th title="Current"><a href="doc/changelogs/CHANGELOG_V21.md">21</a> (Current)</th> <th title="LTS Until 2026-04"><a href="doc/changelogs/CHANGELOG_V20.md">20</a> (LTS)</th> - <th title="LTS Until 2025-04"><a href="doc/changelogs/CHANGELOG_V18.md">18</a> (LTS)</th> </tr> <tr> <td valign="top"> +<b><a href="doc/changelogs/CHANGELOG_V22.md#22.22.1">22.22.1</a></b><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.22.0">22.22.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.21.1">22.21.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.21.0">22.21.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.20.0">22.20.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.19.0">22.19.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.18.0">22.18.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.17.1">22.17.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.17.0">22.17.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.16.0">22.16.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.15.1">22.15.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.15.0">22.15.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.14.0">22.14.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.13.1">22.13.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.13.0">22.13.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.12.0">22.12.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.11.0">22.11.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.10.0">22.10.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.9.0">22.9.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.8.0">22.8.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.7.0">22.7.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.6.0">22.6.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.5.1">22.5.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.5.0">22.5.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.4.1">22.4.1</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.4.0">22.4.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.3.0">22.3.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.2.0">22.2.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.1.0">22.1.0</a><br/> +<a href="doc/changelogs/CHANGELOG_V22.md#22.0.0">22.0.0</a><br/> + </td> + <td valign="top"> <b><a href="doc/changelogs/CHANGELOG_V21.md#21.7.3">21.7.3</a></b><br/> <a href="doc/changelogs/CHANGELOG_V21.md#21.7.2">21.7.2</a><br/> <a href="doc/changelogs/CHANGELOG_V21.md#21.7.1">21.7.1</a><br/> @@ -72,40 +105,6 @@ release. <a href="doc/changelogs/CHANGELOG_V20.md#20.1.0">20.1.0</a><br/> <a href="doc/changelogs/CHANGELOG_V20.md#20.0.0">20.0.0</a><br/> </td> - <td valign="top"> -<b><a href="doc/changelogs/CHANGELOG_V18.md#18.20.2">18.20.2</a></b><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.20.1">18.20.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.20.0">18.20.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.19.1">18.19.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.19.0">18.19.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.18.2">18.18.2</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.18.1">18.18.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.18.0">18.18.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.17.1">18.17.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.17.0">18.17.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.16.1">18.16.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.16.0">18.16.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.15.0">18.15.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.14.2">18.14.2</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.14.1">18.14.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.14.0">18.14.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.13.0">18.13.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.12.1">18.12.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.12.0">18.12.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.11.0">18.11.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.10.0">18.10.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.9.1">18.9.1</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.9.0">18.9.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.8.0">18.8.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.7.0">18.7.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.6.0">18.6.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.5.0">18.5.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.4.0">18.4.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.3.0">18.3.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.2.0">18.2.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.1.0">18.1.0</a><br/> -<a href="doc/changelogs/CHANGELOG_V18.md#18.0.0">18.0.0</a><br/> - </td> </tr> </table> diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f815adbb1fc34b..ae787bc6d8e84f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,25 @@ # Contributing to Node.js +Contributions to Node.js include code, documentation, answering user questions, +running the project's infrastructure, and advocating for all types of Node.js +users. + +The Node.js project welcomes all contributions from anyone willing to work in +good faith with other contributors and the community. No contribution is too +small and all contributions are valued. + +The Node.js project has an open governance model. +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. See the +[GOVERNANCE.md](./GOVERNANCE.md) document for more information about how this +works. + +## Contents + * [Code of Conduct](#code-of-conduct) * [Issues](#issues) * [Pull Requests](#pull-requests) -* [Developer's Certificate of Origin 1.1](#developers-certificate-of-origin) +* [Developer's Certificate of Origin 1.1](#developers-certificate-of-origin-11) ## [Code of Conduct](./doc/contributing/code-of-conduct.md) @@ -22,17 +38,18 @@ See [details on our policy on Code of Conduct](./doc/contributing/code-of-conduc ## [Pull Requests](./doc/contributing/pull-requests.md) +Pull Requests are the way concrete changes are made to the code, documentation, +dependencies, and tools contained in the `nodejs/node` repository. + * [Dependencies](./doc/contributing/pull-requests.md#dependencies) * [Setting up your local environment](./doc/contributing/pull-requests.md#setting-up-your-local-environment) * [The Process of Making Changes](./doc/contributing/pull-requests.md#the-process-of-making-changes) * [Reviewing Pull Requests](./doc/contributing/pull-requests.md#reviewing-pull-requests) * [Notes](./doc/contributing/pull-requests.md#notes) -<a id="developers-certificate-of-origin"></a> - ## Developer's Certificate of Origin 1.1 -<pre> +```text By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I @@ -56,4 +73,4 @@ By making a contribution to this project, I certify that: personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. -</pre> +``` diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 1a5faf99a480ec..a1fd4148aaeed4 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -8,6 +8,9 @@ * [Technical steering committee](#technical-steering-committee) * [TSC meetings](#tsc-meetings) * [Collaborator nominations](#collaborator-nominations) + * [Who can nominate Collaborators?](#who-can-nominate-collaborators) + * [Ideal Nominees](#ideal-nominees) + * [Nominating a new Collaborator](#nominating-a-new-collaborator) * [Onboarding](#onboarding) * [Consensus seeking process](#consensus-seeking-process) @@ -94,9 +97,17 @@ Charter need approval by the OpenJS Foundation Cross-Project Council (CPC). The TSC meets in a video conference call. Each year, the TSC elects a chair to run the meetings. The TSC streams its meetings for public viewing on YouTube. +TSC meetings may consist of a public portion and a private portion. The private +portion is used to discuss sensitive topics, such as personnel issues, +security vulnerabilities, or other confidential matters. Private discussions +should be avoided as much as possible, and the TSC should strive to keep +discussions in the public portion of the meeting, but there are times when +private discussions are necessary. + The TSC agenda includes issues that are at an impasse. The intention of the agenda is not to review or approve all patches. Collaborators review and approve -patches on GitHub. +patches on GitHub. The preference is to minimize the need for TSC meetings to +make decisions that can otherwise be made by collaborators on GitHub. Any community member can create a GitHub issue asking that the TSC review something. If consensus-seeking fails for an issue, a collaborator may apply the @@ -106,30 +117,140 @@ Before each TSC meeting, the meeting chair will share the agenda with members of the TSC. TSC members can also add items to the agenda at the beginning of each meeting. The meeting chair and the TSC cannot veto or remove items. -The TSC may invite people to take part in a non-voting capacity. - -During the meeting, the TSC chair ensures that someone takes minutes. After the -meeting, the TSC chair ensures that someone opens a pull request with the -minutes. - -The TSC seeks to resolve as many issues as possible outside meetings using -[the TSC issue tracker](https://github.com/nodejs/TSC/issues). The process in -the issue tracker is: +The TSC may invite people to take part in a non-voting capacity in either the +public or private portions of the meeting. + +During the public portion of the meeting, the TSC chair ensures that someone +takes minutes that include a summary of the discussion and any +decisions made. After the meeting, the TSC chair ensures that someone opens a +public pull request with the minutes from the public portion of the meeting. + +The public portion of the TSC meeting is expected to be recorded and made +available for live streaming during the meeting or download by anyone after. +This expectation is to be announced to all participants at the start of the +each meeting before the recording is started. Continued participation in the +public portion of the meeting after this announcement is interpreted as consent to the +recording. + +For the private portion of the meeting, the TSC chair ensures that someone +produces a summary of the discussions, gets it reviewed by the attendees, +and shares it to all the TSC members once approved by the attendees via a +private discussion channel such as the TSC private mailing list. The summary +may be made public if there is consensus within the TSC and the non-TSC +attendees to make it public. + +Recording the private portion of a meeting or maintaining or publishing a +detailed transcript is only permitted when all participants present during the +private portion of the meeting explicitly agree to the recording and/or +transcript, in order to comply to privacy regulations. + +All discussions made during meetings are considered provisional, receiving no +objections from folks at the TSC meeting to take an action is not equivalent to +the TSC endorsing that action. + +If a quorum of TSC voting members is present, it is possible to call for an +explicit vote, and take the vote immediately if there are no objections. The +decision is considered confirmed once the rest of the TSC voting members have +been informed and no objection for taking that vote has been raised in 48 hours. +To clarify, TSC voting members can object to the vote taking place during the +meeting, but not to the vote itself. + +For discussions outside of meetings, the TSC uses +[the TSC issue tracker](https://github.com/nodejs/TSC/issues) for public +issues, and the private TSC email list for private matters. The process for +public issues in the issue tracker is: * A TSC member opens an issue explaining the proposal/issue and @-mentions @nodejs/tsc. * The proposal passes if, after 72 hours, there are two or more TSC voting member approvals and no TSC voting member opposition. -* If there is an extended impasse, a TSC member may make a motion for a vote. +* If there is an extended impasse, a TSC member may ask for the issue to be + added to the TSC agenda, or make a motion for a vote. ## Collaborator nominations -Existing collaborators can nominate someone to become a collaborator. Nominees -should have significant and valuable contributions across the Node.js +### Who can nominate Collaborators? + +Existing Collaborators can nominate someone to become a Collaborator. + +### Ideal Nominees + +Nominees should have significant and valuable contributions across the Node.js organization. -To nominate a new collaborator, open an issue in the [nodejs/node][] repository. -Provide a summary of the nominee's contributions. For example: +Contributions can be: + +* Opening pull requests. +* Comments and reviews. +* Opening new issues. +* Participation in other projects, teams, and working groups of the Node.js + organization. + +Collaborators should be people volunteering to do unglamorous work because it's +the right thing to do, they find the work itself satisfying, and they care about +Node.js and its users. People should get collaborator status because they're +doing work and are likely to continue doing work where having the abilities that +come with collaborator status are helpful (abilities like starting CI jobs, +reviewing and approving PRs, etc.). That will usually--but, very importantly, not +always--be work involving committing to the `nodejs/node` repository. For an example +of an exception, someone working primarily on the website might benefit from being +able to start Jenkins CI jobs to test changes to documentation tooling. That, +along with signals indicating commitment to Node.js, personal integrity, etc., +should be enough for a successful nomination. + +It is important to understand that potential collaborators may have vastly +different areas and levels of expertise, interest, and skill. The Node.js +project is large and complex, and it is not expected that every collaborator +will have the same level of expertise in every area of the project. The +complexity or "sophistication" of an individual’s contributions, or even their +relative engineering "skill" level, are not primary factors in determining +whether they should be a collaborator. The primary factors do include the quality +of their contributions (do the contributions make sense, do they add value, do +they follow documented guidelines, are they authentic and well-intentioned, +etc.), their commitment to the project, can their judgement be trusted, and do +they have the ability to work well with others. + +#### The Authenticity of Contributors + +The Node.js project does not require that contributors use their legal names or +provide any personal information verifying their identity. + +It is not uncommon for malicious actors to attempt to gain commit access to +open-source projects in order to inject malicious code or for other nefarious +purposes. The Node.js project has a number of mechanisms in place to prevent +this, but it is important to be vigilant. If you have concerns about the +authenticity of a contributor, please raise them with the TSC. Anyone nominating +a new collaborator should take reasonable steps to verify that the contributions +of the nominee are authentic and made in good faith. This is not always easy, +but it is important. + +### Nominating a new Collaborator + +To nominate a new Collaborator: + +1. **Optional but strongly recommended**: open a + [discussion in the nodejs/collaborators][] repository. Provide a summary of + the nominee's contributions (see below for an example). +2. **Optional but strongly recommended**: After sufficient wait time (e.g. 72 + hours), if the nomination proposal has received some support and no explicit + block, and any questions/concerns have been addressed, add a comment in the + private discussion stating you're planning on opening a public issue, e.g. + "I see a number of approvals and no block, I'll be opening a public + nomination issue if I don't hear any objections in the next 72 hours". +3. **Optional but strongly recommended**: Privately contact the nominee to make + sure they're comfortable with the nomination. +4. Open an issue in the [nodejs/node][] repository. Provide a summary of + the nominee's contributions (see below for an example). Mention + @nodejs/collaborators in the issue to notify other collaborators about + the nomination. + +The _Optional but strongly recommended_ steps are optional in the sense that +skipping them would not invalidate the nomination, but it could put the nominee +in a very awkward situation if a nomination they didn't ask for pops out of +nowhere only to be rejected. Do not skip those steps unless you're absolutely +certain the nominee is fine with the public scrutiny. + +Example of list of contributions: * Commits in the [nodejs/node][] repository. * Use the link `https://github.com/nodejs/node/commits?author=GITHUB_ID` @@ -148,22 +269,65 @@ Provide a summary of the nominee's contributions. For example: organization * Other participation in the wider Node.js community -Mention @nodejs/collaborators in the issue to notify other collaborators about -the nomination. - -The nomination passes if no collaborators oppose it after one week. In the case -of an objection, the TSC is responsible for working with the individuals -involved and finding a resolution. - -There are steps a nominator can take in advance to make a nomination as -frictionless as possible. To request feedback from other collaborators in -private, use the [collaborators discussion page][] -(which only collaborators may view). A nominator may also work with the -nominee to improve their contribution profile. - -Collaborators might overlook someone with valuable contributions. In that case, -the contributor may open an issue or contact a collaborator to request a -nomination. +The nomination passes if no collaborators oppose it (as described in the +following section) after one week. In the case of an objection, the TSC is +responsible for working with the individuals involved and finding a resolution. +The TSC may, following typical TSC consensus seeking processes, choose to +advance a nomination that has otherwise failed to reach a natural consensus or +clear path forward even if there are outstanding objections. The TSC may also +choose to prevent a nomination from advancing if the TSC determines that any +objections have not been adequately addressed. + +#### How to review a collaborator nomination + +A collaborator nomination can be reviewed in the same way one would review a PR +adding a feature: + +* If you see the nomination as something positive to the project, say so! +* If you are neutral, or feel you don't know enough to have an informed opinion, + it's certainly OK to not interact with the nomination. +* If you think the nomination was made too soon, or can be detrimental to the + project, share your concerns. See the section "How to oppose a collaborator + nomination" below. + +Our goal is to keep gate-keeping at a minimal, but it cannot be zero since being +a collaborator requires trust (collaborators can start CI jobs, use their veto, +push commits, etc.), so what's the minimal amount is subjective, and there will +be cases where collaborators disagree on whether a nomination should move +forward. + +Refrain from discussing or debating aspects of the nomination process +itself directly within a nomination private discussion or public issue. +Such discussions can derail and frustrate the nomination causing unnecessary +friction. Move such discussions to a separate issue or discussion thread. + +##### How to oppose a collaborator nomination + +An important rule of thumb is that the nomination process is intended to be +biased strongly towards implicit approval of the nomination. This means +discussion and review around the proposal should be more geared towards "I have +reasons to say no..." as opposed to "Give me reasons to say yes...". + +Given that there is no "Request for changes" feature in discussions and issues, +try to be explicit when your comment is expressing a blocking concern. +Similarly, once the blocking concern has been addressed, explicitly say so. + +Explicit opposition would typically be signaled as some form of clear +and unambiguous comment like, "I don't believe this nomination should pass". +Asking clarifying questions or expressing general concerns is not the same as +explicit opposition; however, a best effort should be made to answer such +questions or addressing those concerns before advancing the nomination. + +Opposition does not need to be public. Ideally, the comment showing opposition, +and any discussion thereof, should be done in the private discussion _before_ +the public issue is opened. Opposition _should_ be paired with clear suggestions +for positive, concrete, and unambiguous next steps that the nominee can take to +overcome the objection and allow it to move forward. While such suggestions are +technically optional, they are _strongly encouraged_ to prevent the nomination +from stalling indefinitely or objections from being overridden by the TSC. + +Remember that all private discussions about a nomination will be visible to +the nominee once they are onboarded. ### Onboarding @@ -178,6 +342,6 @@ The TSC follows a [Consensus Seeking][] decision-making model per the [Consensus Seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [TSC Charter]: https://github.com/nodejs/TSC/blob/HEAD/TSC-Charter.md -[collaborators discussion page]: https://github.com/nodejs/collaborators/discussions/categories/collaborator-nominations +[discussion in the nodejs/collaborators]: https://github.com/nodejs/collaborators/discussions/categories/collaborator-nominations [nodejs/help]: https://github.com/nodejs/help [nodejs/node]: https://github.com/nodejs/node diff --git a/LICENSE b/LICENSE index fb7c9d3abe9215..a640a1f4708257 100644 --- a/LICENSE +++ b/LICENSE @@ -130,13 +130,243 @@ The externally maintained libraries used by Node.js are: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ +- amaro, located at deps/amaro, is licensed as follows: + """ + MIT License + + Copyright (c) Marco Ippolito and Amaro contributors + + 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. + """ + +- swc, located at deps/amaro/dist, is licensed as follows: + """ + 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 SWC contributors. + + 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. + """ + - ICU, located at deps/icu-small, is licensed as follows: """ UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE - Copyright © 2016-2023 Unicode, Inc. + Copyright © 2016-2025 Unicode, Inc. NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR @@ -172,6 +402,8 @@ The externally maintained libraries used by Node.js are: dealings in these Data Files or Software without prior written authorization of the copyright holder. + SPDX-License-Identifier: Unicode-3.0 + ---------------------------------------------------------------------- Third-Party Software Licenses @@ -565,6 +797,34 @@ The externally maintained libraries used by Node.js are: ---------------------------------------------------------------------- + JSON parsing library (nlohmann/json) + + File: vendor/json/upstream/single_include/nlohmann/json.hpp (only for ICU4C) + + MIT License + + Copyright (c) 2013-2022 Niels Lohmann + + 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. + + ---------------------------------------------------------------------- + File: aclocal.m4 (only for ICU4C) Section: pkg.m4 - Macros to locate and utilise pkg-config. @@ -602,7 +862,7 @@ The externally maintained libraries used by Node.js are: This file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -639,6 +899,32 @@ The externally maintained libraries used by Node.js are: written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. + + ---------------------------------------------------------------------- + + File: sorttable.js (only for ICU4J) + + The MIT Licence, for code from kryogenix.org + + Code downloaded from the Browser Experiments section of kryogenix.org is + licenced under the so-called MIT licence. The licence is below. + + Copyright (c) 1997-date Stuart Langridge + + 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 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. """ - libuv, located at deps/uv, is licensed as follows: @@ -1285,9 +1571,9 @@ The externally maintained libraries used by Node.js are: - zlib, located at deps/zlib, is licensed as follows: """ zlib.h -- interface of the 'zlib' general purpose compression library - version 1.3.0.1, August xxth, 2023 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1499,7 +1785,7 @@ The externally maintained libraries used by Node.js are: same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2023 The simdjson authors + Copyright 2018-2025 The simdjson authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1560,21 +1846,61 @@ The externally maintained libraries used by Node.js are: - minimatch, located at deps/minimatch, is licensed as follows: """ - The ISC License + # Blue Oak Model License - Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors + Version 1.0.0 - 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. + ## Purpose - 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. + This license gives everyone as much permission to work with + this software as possible, while protecting contributors + from liability. + + ## Acceptance + + In order to receive this license, you must agree to its + rules. The rules of this license are both obligations + under that agreement and conditions to your license. + You must not do anything with this software that triggers + a rule that you cannot or will not follow. + + ## Copyright + + Each contributor licenses you to do everything with this + software that would otherwise infringe that contributor's + copyright in it. + + ## Notices + + You must ensure that everyone who gets a copy of + any part of this software from you, with or without + changes, also gets the text of this license or a link to + <https://blueoakcouncil.org/license/1.0.0>. + + ## Excuse + + If anyone notifies you in writing that you have not + complied with [Notices](#notices), you can keep your + license by taking all practical steps to comply within 30 + days after the notice. If you do not do so, your license + ends immediately. + + ## Patent + + Each contributor licenses you to do everything with this + software that would otherwise infringe any patent claims + they can license or become able to license. + + ## Reliability + + No contributor can revoke this license. + + ## No Liability + + **_As far as the law allows, this software comes as is, + without any warranty or condition, and no contributor + will be liable to anyone for any damages related to this + software or this license, under any kind of legal claim._** """ - npm, located at deps/npm, is licensed as follows: @@ -1838,9 +2164,9 @@ The externally maintained libraries used by Node.js are: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- inspector_protocol, located at tools/inspector_protocol, is licensed as follows: +- inspector_protocol, located at deps/inspector_protocol, is licensed as follows: """ - // Copyright 2016 The Chromium Authors. All rights reserved. + // Copyright 2016 The Chromium Authors. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -2001,29 +2327,6 @@ The externally maintained libraries used by Node.js are: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- ESLint, located at tools/node_modules/eslint, is licensed as follows: - """ - Copyright OpenJS Foundation and other contributors, <www.openjsf.org> - - 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. - """ - - gtest, located at deps/googletest, is licensed as follows: """ Copyright 2008, Google Inc. @@ -2147,6 +2450,40 @@ The externally maintained libraries used by Node.js are: THE SOFTWARE. """ +- zstd, located at deps/zstd, is licensed as follows: + """ + BSD License + + For Zstandard software + + Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook, nor Meta, nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + - HdrHistogram, located at deps/histogram, is licensed as follows: """ The code in this repository code was Written by Gil Tene, Michael Barker, @@ -2192,39 +2529,6 @@ The externally maintained libraries used by Node.js are: THE POSSIBILITY OF SUCH DAMAGE. """ -- highlight.js, located at doc/api_assets/highlight.pack.js, is licensed as follows: - """ - BSD 3-Clause License - - Copyright (c) 2006, Ivan Sagalaev. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - """ - - node-heapdump, located at src/heap_utils.cc, is licensed as follows: """ ISC License @@ -2377,34 +2681,52 @@ The externally maintained libraries used by Node.js are: ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -- base64, located at deps/base64/base64/, is licensed as follows: +- on-exit-leak-free, located at lib/internal/process/finalization, is licensed as follows: """ - Copyright (c) 2005-2007, Nick Galbreath - Copyright (c) 2015-2018, Wojciech Muła - Copyright (c) 2016-2017, Matthieu Darbois - Copyright (c) 2013-2022, Alfred Klomp - All rights reserved. + MIT License - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: + Copyright (c) 2021 Matteo Collina - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + 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: - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 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. + """ + +- sonic-boom, located at lib/internal/streams/fast-utf8-stream.js, is licensed as follows: + """ + MIT License + + Copyright (c) 2017 Matteo Collina + + 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/Makefile b/Makefile index 475043ceae7eb6..2e6d957a8ea4d3 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ PREFIX ?= /usr/local FLAKY_TESTS ?= run TEST_CI_ARGS ?= STAGINGSERVER ?= node-www +CLOUDFLARE_BUCKET ?= r2:dist-staging LOGLEVEL ?= silent OSTYPE := $(shell uname -s | tr '[:upper:]' '[:lower:]') ifeq ($(findstring os/390,$OSTYPE),os/390) @@ -16,7 +17,7 @@ endif ARCHTYPE := $(shell uname -m | tr '[:upper:]' '[:lower:]') COVTESTS ?= test-cov COV_SKIP_TESTS ?= core_line_numbers.js,testFinalizer.js,test_function/test.js -GTEST_FILTER ?= "*" +GTEST_FILTER ?= * GNUMAKEFLAGS += --no-print-directory GCOV ?= gcov PWD = $(CURDIR) @@ -30,9 +31,9 @@ else endif ifdef ENABLE_V8_TAP - TAP_V8 := --junitout $(PWD)/v8-tap.xml - TAP_V8_INTL := --junitout $(PWD)/v8-intl-tap.xml - TAP_V8_BENCHMARKS := --junitout $(PWD)/v8-benchmarks-tap.xml + TAP_V8 := --junitout '$(PWD)/v8-tap.xml' + TAP_V8_INTL := --junitout '$(PWD)/v8-intl-tap.xml' + TAP_V8_BENCHMARKS := --junitout '$(PWD)/v8-benchmarks-tap.xml' define convert_to_junit @true endef @@ -46,12 +47,12 @@ ifdef ENABLE_CONVERT_V8_JSON_TO_XML # By default, the V8's JSON test output only includes the tests which have # failed. We use --slow-tests-cutoff to ensure that all tests are present # in the output, including those which pass. - TAP_V8 := --json-test-results $(TAP_V8_JSON) --slow-tests-cutoff 1000000 - TAP_V8_INTL := --json-test-results $(TAP_V8_INTL_JSON) --slow-tests-cutoff 1000000 - TAP_V8_BENCHMARKS := --json-test-results $(TAP_V8_BENCHMARKS_JSON) --slow-tests-cutoff 1000000 + TAP_V8 := --json-test-results '$(TAP_V8_JSON)' --slow-tests-cutoff 1000000 + TAP_V8_INTL := --json-test-results '$(TAP_V8_INTL_JSON)' --slow-tests-cutoff 1000000 + TAP_V8_BENCHMARKS := --json-test-results '$(TAP_V8_BENCHMARKS_JSON)' --slow-tests-cutoff 1000000 define convert_to_junit - export PATH="$(NO_BIN_OVERRIDE_PATH)" && \ + PATH="$(NO_BIN_OVERRIDE_PATH)" \ $(PYTHON) tools/v8-json-to-junit.py < $(1) > $(1:.json=.xml) endef endif @@ -77,11 +78,17 @@ EXEEXT := $(shell $(PYTHON) -c \ "import sys; print('.exe' if sys.platform == 'win32' else '')") NODE_EXE = node$(EXEEXT) -# Use $(PWD) so we can cd to anywhere before calling this -NODE ?= "$(PWD)/$(NODE_EXE)" NODE_G_EXE = node_g$(EXEEXT) NPM ?= ./deps/npm/bin/npm-cli.js +# Release build of node. +# Use $(PWD) so we can cd to anywhere before calling this. +NODE ?= $(PWD)/$(NODE_EXE) +# Prefer $(OUT_NODE) when running tests. Use $(NODE) +# when generating coverage reports or running toolings as +# debug build is be slower. +OUT_NODE ?= $(PWD)/out/$(BUILDTYPE)/node$(EXEEXT) + # Flags for packaging. BUILD_DOWNLOAD_FLAGS ?= --download=all BUILD_INTL_FLAGS ?= --with-intl=full-icu @@ -93,8 +100,8 @@ V ?= 0 # Use -e to double check in case it's a broken link available-node = \ - if [ -x "$(NODE)" ] && [ -e "$(NODE)" ]; then \ - "$(NODE)" $(1); \ + if [ -x '$(NODE)' ] && [ -e '$(NODE)' ]; then \ + '$(NODE)' $(1); \ elif [ -x `command -v node` ] && [ -e `command -v node` ] && [ `command -v node` ]; then \ `command -v node` $(1); \ else \ @@ -106,9 +113,11 @@ available-node = \ # BUILDTYPE=Debug builds both release and debug builds. If you want to compile # just the debug build, run `make -C out BUILDTYPE=Debug` instead. ifeq ($(BUILDTYPE),Release) -all: $(NODE_EXE) ## Default target, builds node in out/Release/node. +all: $(NODE_EXE) ## Build node in out/Release/node (Default). +$(OUT_NODE): $(NODE_EXE) else all: $(NODE_EXE) $(NODE_G_EXE) +$(OUT_NODE): $(NODE_G_EXE) endif .PHONY: help @@ -143,7 +152,8 @@ endif ifdef JOBS NINJA_ARGS := $(NINJA_ARGS) -j$(JOBS) else - NINJA_ARGS := $(NINJA_ARGS) $(filter -j%,$(MAKEFLAGS)) + IMMEDIATE_NINJA_ARGS := $(NINJA_ARGS) + NINJA_ARGS = $(filter -j%,$(MAKEFLAGS))$(IMMEDIATE_NINJA_ARGS) endif $(NODE_EXE): config.gypi out/Release/build.ninja $(NINJA) -C out/Release $(NINJA_ARGS) @@ -168,12 +178,12 @@ endif with-code-cache test-code-cache: $(warning '$@' target is a noop) -out/Makefile: config.gypi common.gypi node.gyp \ - deps/uv/uv.gyp deps/llhttp/llhttp.gyp deps/zlib/zlib.gyp \ - deps/simdutf/simdutf.gyp deps/ada/ada.gyp \ - tools/v8_gypfiles/toolchain.gypi tools/v8_gypfiles/features.gypi \ +out/Makefile: config.gypi common.gypi common_node.gypi node.gyp \ + deps/*/*.gyp \ + tools/v8_gypfiles/toolchain.gypi \ + tools/v8_gypfiles/features.gypi \ tools/v8_gypfiles/inspector.gypi tools/v8_gypfiles/v8.gyp - $(PYTHON) tools/gyp_node.py -f make + $(PYTHON) tools/gyp_node.py -f make -Dpython=$(PYTHON) # node_version.h is listed because the N-API version is taken from there # and included in config.gypi @@ -186,11 +196,11 @@ config.gypi: configure configure.py src/node_version.h fi .PHONY: install -install: all ## Installs node into $PREFIX (default=/usr/local). +install: all ## Install node into $PREFIX (default=/usr/local). $(PYTHON) tools/install.py $@ --dest-dir '$(DESTDIR)' --prefix '$(PREFIX)' .PHONY: uninstall -uninstall: ## Uninstalls node from $PREFIX (default=/usr/local). +uninstall: ## Uninstall node from $PREFIX (default=/usr/local). $(PYTHON) tools/install.py $@ --dest-dir '$(DESTDIR)' --prefix '$(PREFIX)' .PHONY: clean @@ -208,17 +218,17 @@ clean: ## Remove build artifacts. .PHONY: testclean .NOTPARALLEL: testclean -testclean: +testclean: ## Remove test artifacts. # Next one is legacy remove this at some point $(RM) -r test/tmp* $(RM) -r test/.tmp* .PHONY: distclean .NOTPARALLEL: distclean -distclean: +distclean: ## Remove all build and test artifacts. $(RM) -r out $(RM) config.gypi icu_config.gypi - $(RM) config.mk + $(RM) config.mk config.status $(RM) -r $(NODE_EXE) $(NODE_G_EXE) $(RM) -r node_modules $(RM) -r deps/icu @@ -232,12 +242,14 @@ check: test .NOTPARALLEL: coverage-clean # Remove files generated by running coverage, put the non-instrumented lib back # in place -coverage-clean: +coverage-clean: ## Remove coverage artifacts. $(RM) -r node_modules $(RM) -r gcovr $(RM) -r coverage/tmp - $(FIND) out/$(BUILDTYPE)/obj.target \( -name "*.gcda" -o -name "*.gcno" \) \ - -type f -exec $(RM) {} \; + @if [ -d "out/$(BUILDTYPE)/obj.target" ]; then \ + $(FIND) out/$(BUILDTYPE)/obj.target \( -name "*.gcda" -o -name "*.gcno" \) \ + -type f | xargs $(RM); \ + fi .PHONY: coverage # Build and test with code coverage reporting. HTML coverage reports will be @@ -247,27 +259,30 @@ coverage-clean: coverage: coverage-test ## Run the tests and generate a coverage report. .PHONY: coverage-build -coverage-build: all +coverage-build: all ## Build coverage files. -$(MAKE) coverage-build-js - if [ ! -d gcovr ]; then $(PYTHON) -m pip install -t gcovr gcovr==4.2; fi + if [ ! -d gcovr ]; then $(PYTHON) -m pip install -t gcovr gcovr==7.2; fi $(MAKE) .PHONY: coverage-build-js -coverage-build-js: +coverage-build-js: ## Build JavaScript coverage files. mkdir -p node_modules if [ ! -d node_modules/c8 ]; then \ - $(NODE) ./deps/npm install c8 --no-save --no-package-lock;\ + '$(NODE)' ./deps/npm install c8 --no-save --no-package-lock;\ fi .PHONY: coverage-test -coverage-test: coverage-build - $(FIND) out/$(BUILDTYPE)/obj.target -name "*.gcda" -type f -exec $(RM) {} \; +coverage-test: coverage-build ## Run the tests and generate a coverage report. + @if [ -d "out/$(BUILDTYPE)/obj.target" ]; then \ + $(FIND) out/$(BUILDTYPE)/obj.target -name "*.gcda" -type f | xargs $(RM); \ + fi -NODE_V8_COVERAGE=coverage/tmp \ TEST_CI_ARGS="$(TEST_CI_ARGS) --type=coverage" $(MAKE) $(COVTESTS) $(MAKE) coverage-report-js - -(cd out && PYTHONPATH=../gcovr $(PYTHON) -m gcovr \ - --gcov-exclude='.*\b(deps|usr|out|cctest|embedding)\b' -v \ - -r ../src/ --object-directory Release/obj.target \ + -(PYTHONPATH=./gcovr $(PYTHON) -m gcovr \ + --object-directory=out \ + --filter src -v \ + --root ./ \ --html --html-details -o ../coverage/cxxcoverage.html \ --gcov-executable="$(GCOV)") @printf "Javascript coverage %%: " @@ -278,18 +293,18 @@ coverage-test: coverage-build | sed 's/<[^>]*>//g'| sed 's/ //g' .PHONY: coverage-report-js -coverage-report-js: +coverage-report-js: ## Report JavaScript coverage results. -$(MAKE) coverage-build-js - $(NODE) ./node_modules/.bin/c8 report + '$(NODE)' ./node_modules/.bin/c8 report .PHONY: cctest -# Runs the C++ tests using the built `cctest` executable. -cctest: all + +cctest: all ## Run the C++ tests using the built `cctest` executable. @out/$(BUILDTYPE)/$@ --gtest_filter=$(GTEST_FILTER) - $(NODE) ./test/embedding/test-embedding.js + '$(OUT_NODE)' ./test/embedding/test-embedding.js .PHONY: list-gtests -list-gtests: +list-gtests: ## List all available C++ gtests. ifeq (,$(wildcard out/$(BUILDTYPE)/cctest)) $(error Please run 'make cctest' first) endif @@ -299,12 +314,12 @@ endif # Related CI job: node-test-commit-v8-linux # Rebuilds deps/v8 as a git tree, pulls its third-party dependencies, and # builds it. -v8: +v8: ## Build deps/v8. export PATH="$(NO_BIN_OVERRIDE_PATH)" && \ tools/make-v8.sh $(V8_ARCH).$(BUILDTYPE_LOWER) $(V8_BUILD_OPTIONS) .PHONY: jstest -jstest: build-addons build-js-native-api-tests build-node-api-tests ## Runs addon tests and JS tests +jstest: build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests ## Run addon tests and JS tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) \ $(TEST_CI_ARGS) \ --skip-tests=$(CI_SKIP_TESTS) \ @@ -312,11 +327,11 @@ jstest: build-addons build-js-native-api-tests build-node-api-tests ## Runs addo $(NATIVE_SUITES) .PHONY: tooltest -tooltest: +tooltest: ## Test the various tools. @$(PYTHON) -m unittest discover -s ./test/tools .PHONY: coverage-run-js -coverage-run-js: +coverage-run-js: ## Run JavaScript tests with coverage. $(RM) -r coverage/tmp -NODE_V8_COVERAGE=coverage/tmp CI_SKIP_TESTS=$(COV_SKIP_TESTS) \ TEST_CI_ARGS="$(TEST_CI_ARGS) --type=coverage" $(MAKE) jstest @@ -324,35 +339,38 @@ coverage-run-js: .PHONY: test # This does not run tests of third-party libraries inside deps. -test: all ## Runs default tests, linters, and builds docs. +test: all ## Run default tests, linters, and build docs. $(MAKE) -s tooltest $(MAKE) -s test-doc $(MAKE) -s build-addons $(MAKE) -s build-js-native-api-tests $(MAKE) -s build-node-api-tests + $(MAKE) -s build-sqlite-tests $(MAKE) -s cctest $(MAKE) -s jstest .PHONY: test-only -test-only: all ## For a quick test, does not run linter or build docs. +test-only: all ## Run default tests, without linters or building the docs. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests + $(MAKE) build-sqlite-tests $(MAKE) cctest $(MAKE) jstest $(MAKE) tooltest # Used by `make coverage-test` .PHONY: test-cov -test-cov: all +test-cov: all ## Run coverage tests. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests + $(MAKE) build-sqlite-tests $(MAKE) cctest CI_SKIP_TESTS=$(COV_SKIP_TESTS) $(MAKE) jstest .PHONY: test-valgrind -test-valgrind: all +test-valgrind: all ## Run tests using valgrind. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) --valgrind sequential parallel message .PHONY: test-check-deopts @@ -375,7 +393,7 @@ test/addons/.docbuildstamp: $(DOCBUILDSTAMP_PREREQS) tools/doc/node_modules echo "Skipping .docbuildstamp (no crypto)"; \ else \ $(RM) -r test/addons/??_*/; \ - [ -x $(NODE) ] && $(NODE) $< || node $< ; \ + [ -x '$(NODE)' ] && '$(NODE)' $< || node $< ; \ [ $$? -eq 0 ] && touch $@; \ fi @@ -432,7 +450,7 @@ test/addons/.buildstamp: $(ADDONS_PREREQS) \ # .buildstamp is out of date and need a rebuild. # Just goes to show that recursive make really is harmful... # TODO(bnoordhuis) Force rebuild after gyp update. -build-addons: | $(NODE_EXE) test/addons/.buildstamp +build-addons: | $(NODE_EXE) test/addons/.buildstamp ## Build addons for Node.js. JS_NATIVE_API_BINDING_GYPS := \ $(filter-out test/js-native-api/??_*/binding.gyp, \ @@ -456,7 +474,7 @@ test/js-native-api/.buildstamp: $(ADDONS_PREREQS) \ # .buildstamp is out of date and need a rebuild. # Just goes to show that recursive make really is harmful... # TODO(bnoordhuis) Force rebuild after gyp or node-gyp update. -build-js-native-api-tests: | $(NODE_EXE) test/js-native-api/.buildstamp +build-js-native-api-tests: | $(NODE_EXE) test/js-native-api/.buildstamp ## Build JS Native-API tests. NODE_API_BINDING_GYPS := \ $(filter-out test/node-api/??_*/binding.gyp, \ @@ -480,7 +498,7 @@ test/node-api/.buildstamp: $(ADDONS_PREREQS) \ # .buildstamp is out of date and need a rebuild. # Just goes to show that recursive make really is harmful... # TODO(bnoordhuis) Force rebuild after gyp or node-gyp update. -build-node-api-tests: | $(NODE_EXE) test/node-api/.buildstamp +build-node-api-tests: | $(NODE_EXE) test/node-api/.buildstamp ## Build Node-API tests. BENCHMARK_NAPI_BINDING_GYPS := $(wildcard benchmark/napi/*/binding.gyp) @@ -493,8 +511,33 @@ benchmark/napi/.buildstamp: $(ADDONS_PREREQS) \ $(BENCHMARK_NAPI_BINDING_GYPS) $(BENCHMARK_NAPI_BINDING_SOURCES) @$(call run_build_addons,"$$PWD/benchmark/napi",$@) +SQLITE_BINDING_GYPS := $(wildcard test/sqlite/*/binding.gyp) + +SQLITE_BINDING_SOURCES := \ + $(wildcard test/sqlite/*/*.c) + +# Implicitly depends on $(NODE_EXE), see the build-sqlite-tests rule for rationale. +ifndef NOSQLITE +test/sqlite/.buildstamp: $(ADDONS_PREREQS) \ + $(SQLITE_BINDING_GYPS) $(SQLITE_BINDING_SOURCES) + @$(call run_build_addons,"$$PWD/test/sqlite",$@) +else +test/sqlite/.buildstamp: +endif + +.PHONY: build-sqlite-tests +ifndef NOSQLITE +# .buildstamp needs $(NODE_EXE) but cannot depend on it +# directly because it calls make recursively. The parent make cannot know +# if the subprocess touched anything so it pessimistically assumes that +# .buildstamp is out of date and need a rebuild. +build-sqlite-tests: | $(NODE_EXE) test/sqlite/.buildstamp ## Build SQLite tests. +else +build-sqlite-tests: +endif + .PHONY: clear-stalled -clear-stalled: +clear-stalled: ## Clear any stalled processes. $(info Clean up any leftover processes but don't error if found.) ps awwx | grep Release/node | grep -v grep | cat @PS_OUT=`ps awwx | grep Release/node | grep -v grep | awk '{print $$1}'`; \ @@ -503,20 +546,24 @@ clear-stalled: fi .PHONY: test-build -test-build: | all build-addons build-js-native-api-tests build-node-api-tests +test-build: | all build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests ## Build all tests. .PHONY: test-build-js-native-api -test-build-js-native-api: all build-js-native-api-tests +test-build-js-native-api: all build-js-native-api-tests ## Build JS Native-API tests. .PHONY: test-build-node-api -test-build-node-api: all build-node-api-tests +test-build-node-api: all build-node-api-tests ## Build Node-API tests. + +.PHONY: test-build-sqlite +test-build-sqlite: all build-sqlite-tests ## Build SQLite tests. + .PHONY: test-all test-all: test-build ## Run default tests with both Debug and Release builds. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=debug,release .PHONY: test-all-valgrind -test-all-valgrind: test-build +test-all-valgrind: test-build ## Run all tests using valgrind. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=debug,release --valgrind .PHONY: test-all-suites @@ -535,10 +582,10 @@ else endif .PHONY: test-ci-native -# Build and test addons without building anything else + # Related CI job: node-test-commit-arm-fanned -test-ci-native: LOGLEVEL := info -test-ci-native: | benchmark/napi/.buildstamp test/addons/.buildstamp test/js-native-api/.buildstamp test/node-api/.buildstamp +test-ci-native: LOGLEVEL := info ## Build and test addons without building anything else. +test-ci-native: | benchmark/napi/.buildstamp test/addons/.buildstamp test/js-native-api/.buildstamp test/node-api/.buildstamp test/sqlite/.buildstamp $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \ $(TEST_CI_ARGS) $(CI_NATIVE_SUITES) @@ -546,9 +593,10 @@ test-ci-native: | benchmark/napi/.buildstamp test/addons/.buildstamp test/js-nat .PHONY: test-ci-js # This target should not use a native compiler at all # Related CI job: node-test-commit-arm-fanned -test-ci-js: | clear-stalled +test-ci-js: | clear-stalled ## Build and test JavaScript with building anything else. $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \ + --skip-tests=$(CI_SKIP_TESTS) \ $(TEST_CI_ARGS) $(CI_JS_SUITES) $(info Clean up any leftover processes, error if found.) ps awwx | grep Release/node | grep -v grep | cat @@ -559,13 +607,13 @@ test-ci-js: | clear-stalled .PHONY: test-ci # Related CI jobs: most CI tests, excluding node-test-commit-arm-fanned -test-ci: LOGLEVEL := info -test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests doc-only +test-ci: LOGLEVEL := info ## Build and test everything (CI). +test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests doc-only out/Release/cctest --gtest_output=xml:out/junit/cctest.xml $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \ $(TEST_CI_ARGS) $(CI_JS_SUITES) $(CI_NATIVE_SUITES) $(CI_DOC) - $(NODE) ./test/embedding/test-embedding.js + '$(OUT_NODE)' ./test/embedding/test-embedding.js $(info Clean up any leftover processes, error if found.) ps awwx | grep Release/node | grep -v grep | cat @PS_OUT=`ps awwx | grep Release/node | grep -v grep | awk '{print $$1}'`; \ @@ -576,7 +624,7 @@ test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tes .PHONY: build-ci # Prepare the build for running the tests. # Related CI jobs: most CI tests, excluding node-test-commit-arm-fanned -build-ci: +build-ci: ## Build everything (CI). $(PYTHON) ./configure --verbose $(CONFIG_FLAGS) $(MAKE) @@ -590,41 +638,48 @@ build-ci: # # Using -j1 as the sub target in `test-ci` already have internal parallelism. # Refs: https://github.com/nodejs/node/pull/23733 -run-ci: build-ci +run-ci: build-ci ## Build and run all tests (CI). $(MAKE) test-ci -j1 .PHONY: test-release .PHONY: test-debug -test-debug: BUILDTYPE_LOWER=debug -test-release test-debug: test-build +test-debug: BUILDTYPE_LOWER=debug ## Run tests on a debug build. +test-release test-debug: test-build ## Run tests on a release or debug build. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) +.PHONY: test-test426 +test-test426: all ## Run the Web Platform Tests. + $(PYTHON) tools/test.py $(PARALLEL_ARGS) test426 + .PHONY: test-wpt -test-wpt: all +test-wpt: all ## Run the Web Platform Tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) wpt +# https://github.com/nodejs/node/blob/a00d95c73dcac8fc2b316238fb978a7d5aa650c6/.github/workflows/daily-wpt-fyi.yml#L71-L97 +# This uses NODE instead of OUT_NODE and if changes are to be made they'd need to be made on all +# non-EOL release lines' since the wpt.fyi job checks out the repository in a state of a given release +# to ensure future changes to the WPT runner don't need to be backported. .PHONY: test-wpt-report -test-wpt-report: +test-wpt-report: ## Run the Web Platform Tests and generate a report. $(RM) -r out/wpt mkdir -p out/wpt - -WPT_REPORT=1 $(PYTHON) tools/test.py --shell $(NODE) $(PARALLEL_ARGS) wpt - $(NODE) "$$PWD/tools/merge-wpt-reports.mjs" + -WPT_REPORT=1 $(PYTHON) tools/test.py --shell '$(NODE)' $(PARALLEL_ARGS) wpt + '$(NODE)' "$$PWD/tools/merge-wpt-reports.mjs" .PHONY: test-internet -test-internet: all +test-internet: all ## Run internet tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) internet .PHONY: test-tick-processor -test-tick-processor: all +test-tick-processor: all ## Run tick processor tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) tick-processor .PHONY: test-hash-seed -# Verifies the hash seed used by V8 for hashing is random. -test-hash-seed: all +test-hash-seed: all ## Verifu that the hash seed used by V8 for hashing is random. $(NODE) test/pummel/test-hash-seed.js .PHONY: test-doc -test-doc: doc-only lint-md ## Builds, lints, and verifies the docs. +test-doc: doc-only lint-md ## Build, lint, and verify the docs. @if [ "$(shell $(node_use_openssl))" != "true" ]; then \ echo "Skipping test-doc (no crypto)"; \ else \ @@ -632,49 +687,59 @@ test-doc: doc-only lint-md ## Builds, lints, and verifies the docs. fi .PHONY: test-doc-ci -test-doc-ci: doc-only - $(PYTHON) tools/test.py --shell $(NODE) $(TEST_CI_ARGS) $(PARALLEL_ARGS) doctool +test-doc-ci: doc-only ## Build, lint, and verify the docs (CI). + $(PYTHON) tools/test.py --shell '$(NODE)' $(TEST_CI_ARGS) $(PARALLEL_ARGS) doctool .PHONY: test-known-issues -test-known-issues: all +test-known-issues: all ## Run tests for known issues. $(PYTHON) tools/test.py $(PARALLEL_ARGS) known_issues # Related CI job: node-test-npm .PHONY: test-npm -test-npm: $(NODE_EXE) ## Run the npm test suite on deps/npm. - $(NODE) tools/test-npm-package --install --logfile=test-npm.tap deps/npm test +test-npm: $(OUT_NODE) ## Run the npm test suite on deps/npm. + '$(OUT_NODE)' tools/test-npm-package --install --logfile=test-npm.tap deps/npm test .PHONY: test-npm-publish -test-npm-publish: $(NODE_EXE) - npm_package_config_publishtest=true $(NODE) deps/npm/test/run.js +test-npm-publish: $(OUT_NODE) ## Test the `npm publish` command. + npm_package_config_publishtest=true '$(OUT_NODE)' deps/npm/test/run.js .PHONY: test-js-native-api -test-js-native-api: test-build-js-native-api +test-js-native-api: test-build-js-native-api ## Run JS Native-API tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) js-native-api .PHONY: test-js-native-api-clean .NOTPARALLEL: test-js-native-api-clean -test-js-native-api-clean: +test-js-native-api-clean: ## Remove JS Native-API testing artifacts. $(RM) -r test/js-native-api/*/build $(RM) test/js-native-api/.buildstamp .PHONY: test-node-api -test-node-api: test-build-node-api +test-node-api: test-build-node-api ## Run Node-API tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) node-api .PHONY: test-node-api-clean .NOTPARALLEL: test-node-api-clean -test-node-api-clean: +test-node-api-clean: ## Remove Node-API testing artifacts. $(RM) -r test/node-api/*/build $(RM) test/node-api/.buildstamp +.PHONY: test-sqlite +test-sqlite: test-build-sqlite ## Run SQLite tests. + $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) sqlite + +.PHONY: test-sqlite-clean +.NOTPARALLEL: test-sqlite-clean +test-sqlite-clean: ## Remove SQLite testing artifacts. + $(RM) -r test/sqlite/*/build + $(RM) test/sqlite/.buildstamp + .PHONY: test-addons -test-addons: test-build test-js-native-api test-node-api +test-addons: test-build test-js-native-api test-node-api ## Run addon tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) addons .PHONY: test-addons-clean .NOTPARALLEL: test-addons-clean -test-addons-clean: +test-addons-clean: ## Remove addon testing artifacts. $(RM) -r "$(ADDONS_HEADERS_DIR)" $(RM) -r test/addons/??_*/ $(RM) -r test/addons/*/build @@ -683,7 +748,7 @@ test-addons-clean: $(MAKE) test-node-api-clean .PHONY: test-with-async-hooks -test-with-async-hooks: +test-with-async-hooks: ## Run tests with async hooks. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests @@ -700,7 +765,7 @@ test-with-async-hooks: .PHONY: test-v8-updates ifneq ("","$(wildcard deps/v8/tools/run-tests.py)") # Related CI job: node-test-commit-v8-linux -test-v8: v8 ## Runs the V8 test suite on deps/v8. +test-v8: v8 ## Run the V8 test suite on deps/v8. export PATH="$(NO_BIN_OVERRIDE_PATH)" && \ $(PYTHON) deps/v8/tools/run-tests.py --gn --arch=$(V8_ARCH) $(V8_TEST_OPTIONS) \ mjsunit cctest debugger inspector message preparser \ @@ -709,24 +774,24 @@ test-v8: v8 ## Runs the V8 test suite on deps/v8. $(info Testing hash seed) $(MAKE) test-hash-seed -test-v8-intl: v8 +test-v8-intl: v8 ## Run the v8 test suite, intl tests. export PATH="$(NO_BIN_OVERRIDE_PATH)" && \ $(PYTHON) deps/v8/tools/run-tests.py --gn --arch=$(V8_ARCH) \ intl \ $(TAP_V8_INTL) $(call convert_to_junit,$(TAP_V8_INTL_JSON)) -test-v8-benchmarks: v8 +test-v8-benchmarks: v8 ## Run the v8 test suite, benchmarks. export PATH="$(NO_BIN_OVERRIDE_PATH)" && \ $(PYTHON) deps/v8/tools/run-tests.py --gn --arch=$(V8_ARCH) \ benchmarks \ $(TAP_V8_BENCHMARKS) $(call convert_to_junit,$(TAP_V8_BENCHMARKS_JSON)) -test-v8-updates: +test-v8-updates: ## Run the v8 test suite, updates. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) v8-updates -test-v8-all: test-v8 test-v8-intl test-v8-benchmarks test-v8-updates +test-v8-all: test-v8 test-v8-intl test-v8-benchmarks test-v8-updates ## Run the entire V8 test suite, including intl, benchmarks, and updates. # runs all v8 tests else test-v8 test-v8-intl test-v8-benchmarks test-v8-all: @@ -750,7 +815,7 @@ tools/doc/node_modules: tools/doc/package.json .PHONY: doc-only doc-only: tools/doc/node_modules \ - $(apidoc_dirs) $(apiassets) ## Builds the docs with the local or the global Node.js binary. + $(apidoc_dirs) $(apiassets) ## Build the docs with the local or the global Node.js binary. @if [ "$(shell $(node_use_openssl))" != "true" ]; then \ echo "Skipping doc-only (no crypto)"; \ else \ @@ -758,10 +823,11 @@ doc-only: tools/doc/node_modules \ fi .PHONY: doc -doc: $(NODE_EXE) doc-only +doc: $(NODE_EXE) doc-only ## Build Node.js, and then build the documentation with the new binary. out/doc: mkdir -p $@ + cp doc/node-config-schema.json $@ # If it's a source tarball, doc/api already contains the generated docs. # Just copy everything under doc/api over. @@ -779,7 +845,7 @@ out/doc/api/assets/%: doc/api_assets/% | out/doc/api/assets @cp $< $@ ; $(RM) out/doc/api/assets/README.md -run-npm-ci = $(PWD)/$(NPM) ci +run-npm-ci = '$(PWD)/$(NPM)' ci LINK_DATA = out/doc/apilinks.json VERSIONS_DATA = out/previous-doc-versions.json @@ -830,16 +896,16 @@ out/doc/api/stability: out/doc/api/all.json tools/doc/stability.mjs | out/doc/ap fi .PHONY: docopen -docopen: out/doc/api/all.html +docopen: out/doc/api/all.html ## Open the documentation in a web browser. @$(PYTHON) -mwebbrowser file://$(abspath $<) .PHONY: docserve -docserve: $(apidocs_html) $(apiassets) +docserve: $(apidocs_html) $(apiassets) ## Serve the documentation on localhost:8000. @$(PYTHON) -m http.server 8000 --bind 127.0.0.1 --directory out/doc/api .PHONY: docclean .NOTPARALLEL: docclean -docclean: +docclean: ## Remove the generated documentation. $(RM) -r out/doc $(RM) "$(VERSIONS_DATA)" @@ -925,6 +991,9 @@ else ifeq ($(findstring riscv64,$(UNAME_M)),riscv64) DESTCPU ?= riscv64 else +ifeq ($(findstring loongarch64,$(UNAME_M)),loongarch64) +DESTCPU ?= loong64 +else DESTCPU ?= x86 endif endif @@ -938,6 +1007,7 @@ endif endif endif endif +endif ifeq ($(DESTCPU),x64) ARCH=x64 else @@ -962,6 +1032,9 @@ else ifeq ($(DESTCPU),riscv64) ARCH=riscv64 else +ifeq ($(DESTCPU),loong64) +ARCH=loong64 +else ARCH=x86 endif endif @@ -971,6 +1044,7 @@ endif endif endif endif +endif # node and v8 use different arch names (e.g. node 'x86' vs v8 'ia32'). # pass the proper v8 arch name to $V8_ARCH based on user-specified $DESTCPU. @@ -998,7 +1072,7 @@ else BINARYNAME=$(TARNAME)-$(PLATFORM)-$(ARCH) endif BINARYTAR=$(BINARYNAME).tar -# OSX doesn't have xz installed by default, http://macpkg.sourceforge.net/ +# macOS doesn't have xz installed by default, http://macpkg.sourceforge.net/ HAS_XZ ?= $(shell command -v xz > /dev/null 2>&1; [ $$? -eq 0 ] && echo 1 || echo 0) # Supply SKIP_XZ=1 to explicitly skip .tar.xz creation SKIP_XZ ?= 0 @@ -1021,7 +1095,7 @@ endif endif .PHONY: release-only -release-only: check-xz +release-only: check-xz ## Prepare Node.js for release. @if [ "$(DISTTYPE)" = "release" ] && `grep -q REPLACEME doc/api/*.md`; then \ echo 'Please update REPLACEME tags in the following doc/api/*.md files (See doc/contributing/releases.md):\n' ; \ REPLACEMES="$(shell grep -l REPLACEME doc/api/*.md)" ; \ @@ -1122,7 +1196,7 @@ endif $(MACOSOUTDIR)/dist/npm/usr/local/lib/node_modules unlink $(MACOSOUTDIR)/dist/node/usr/local/bin/npm unlink $(MACOSOUTDIR)/dist/node/usr/local/bin/npx - $(NODE) tools/license2rtf.mjs < LICENSE > \ + '$(NODE)' tools/license2rtf.mjs < LICENSE > \ $(MACOSOUTDIR)/installer/productbuild/Resources/license.rtf cp doc/osx_installer_logo.png $(MACOSOUTDIR)/installer/productbuild/Resources pkgbuild --version $(FULLVERSION) \ @@ -1140,19 +1214,19 @@ endif sh tools/osx-notarize.sh $(FULLVERSION) .PHONY: pkg -# Builds the macOS installer for releases. -pkg: $(PKG) +pkg: $(PKG) ## Build the macOS installer for releases. .PHONY: corepack-update -corepack-update: +corepack-update: ## Update Corepack to the latest version. mkdir -p /tmp/node-corepack - curl -qLo /tmp/node-corepack/package.tgz "$$(npm view corepack dist.tarball)" + curl -qLo /tmp/node-corepack/package.tgz "$$($(call available-node,$(NPM) view corepack dist.tarball))" rm -rf deps/corepack && mkdir deps/corepack cd deps/corepack && tar xf /tmp/node-corepack/package.tgz --strip-components=1 chmod +x deps/corepack/shims/* - node deps/corepack/dist/corepack.js --version + $(call available-node,'-p' \ + 'require(`./deps/corepack/package.json`).version') .PHONY: pkg-upload # Note: this is strictly for release builds on release machines only. @@ -1160,6 +1234,7 @@ pkg-upload: pkg ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)" chmod 664 $(TARNAME).pkg scp -p $(TARNAME).pkg $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).pkg + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).pkg $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).pkg" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).pkg.done" $(TARBALL): release-only doc-only @@ -1182,15 +1257,17 @@ $(TARBALL): release-only doc-only $(RM) -r $(TARNAME)/doc/images # too big $(RM) -r $(TARNAME)/test*.tap $(RM) -r $(TARNAME)/tools/cpplint.py + $(RM) -r $(TARNAME)/tools/eslint $(RM) -r $(TARNAME)/tools/eslint-rules + $(RM) -r $(TARNAME)/test/parallel/test-eslint-* $(RM) -r $(TARNAME)/tools/license-builder.sh - $(RM) -r $(TARNAME)/tools/node_modules + $(RM) -r $(TARNAME)/tools/eslint/node_modules $(RM) -r $(TARNAME)/tools/osx-* $(RM) -r $(TARNAME)/tools/osx-pkg.pmdoc find $(TARNAME)/deps/v8/test/* -type d ! -regex '.*/test/torque$$' | xargs $(RM) -r find $(TARNAME)/deps/v8/test -type f ! -regex '.*/test/torque/.*' | xargs $(RM) find $(TARNAME)/deps/zlib/contrib/* -type d ! -regex '.*/contrib/optimizations$$' | xargs $(RM) -r - find $(TARNAME)/ -name ".eslint*" -maxdepth 2 | xargs $(RM) + find $(TARNAME)/ -name "eslint.config*" -maxdepth 2 | xargs $(RM) find $(TARNAME)/ -type l | xargs $(RM) tar -cf $(TARNAME).tar $(TARNAME) $(RM) -r $(TARNAME) @@ -1209,10 +1286,12 @@ tar-upload: tar ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)" chmod 664 $(TARNAME).tar.gz scp -p $(TARNAME).tar.gz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.gz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.gz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.gz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.gz.done" ifeq ($(XZ), 1) chmod 664 $(TARNAME).tar.xz scp -p $(TARNAME).tar.xz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.xz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.xz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.xz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME).tar.xz.done" endif @@ -1222,6 +1301,7 @@ doc-upload: doc ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/docs/" chmod -R ug=rw-x+X,o=r+X out/doc/ scp -pr out/doc/* $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/docs/ + ssh $(STAGINGSERVER) "rclone copy nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/docs/ $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/docs/" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/docs.done" .PHONY: $(TARBALL)-headers @@ -1250,10 +1330,12 @@ tar-headers-upload: tar-headers ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)" chmod 664 $(TARNAME)-headers.tar.gz scp -p $(TARNAME)-headers.tar.gz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.gz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.gz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.gz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.gz.done" ifeq ($(XZ), 1) chmod 664 $(TARNAME)-headers.tar.xz scp -p $(TARNAME)-headers.tar.xz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.xz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.xz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.xz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-headers.tar.xz.done" endif @@ -1295,10 +1377,12 @@ binary-upload: binary ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)" chmod 664 $(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz scp -p $(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz.done" ifeq ($(XZ), 1) chmod 664 $(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz scp -p $(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz" ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz.done" endif @@ -1307,9 +1391,8 @@ endif bench bench-all: bench-addons-build $(warning Please use benchmark/run.js or benchmark/compare.js to run the benchmarks.) -# Build required addons for benchmark before running it. .PHONY: bench-addons-build -bench-addons-build: | $(NODE_EXE) benchmark/napi/.buildstamp +bench-addons-build: | $(NODE_EXE) benchmark/napi/.buildstamp ## Build required addons for benchmark before running it. .PHONY: bench-addons-clean .NOTPARALLEL: bench-addons-clean @@ -1317,21 +1400,6 @@ bench-addons-clean: $(RM) -r benchmark/napi/*/build $(RM) benchmark/napi/.buildstamp -.PHONY: lint-md-rollup -lint-md-rollup: - $(RM) tools/.*mdlintstamp - cd tools/lint-md && npm ci && npm run build - -.PHONY: lint-md-clean -.NOTPARALLEL: lint-md-clean -lint-md-clean: - $(RM) -r tools/lint-md/node_modules - $(RM) tools/.*mdlintstamp - -.PHONY: lint-md-build -lint-md-build: - $(warning Deprecated no-op target 'lint-md-build') - ifeq ("$(wildcard tools/.mdlintstamp)","") LINT_MD_NEWER = else @@ -1343,40 +1411,46 @@ LINT_MD_FILES = $(shell $(FIND) $(LINT_MD_TARGETS) -type f \ ! -path '*node_modules*' ! -path 'test/fixtures/*' -name '*.md' \ $(LINT_MD_NEWER)) run-lint-md = tools/lint-md/lint-md.mjs $(LINT_MD_FILES) + +# Check for a specific file, as (empty) directories are persisted in git. +tools/lint-md/node_modules/remark-parse/package.json: + -cd tools/lint-md && $(call available-node,$(run-npm-ci)) + # Lint all changed markdown files maintained by us -tools/.mdlintstamp: $(LINT_MD_FILES) +tools/.mdlintstamp: tools/lint-md/node_modules/remark-parse/package.json $(LINT_MD_FILES) $(info Running Markdown linter...) @$(call available-node,$(run-lint-md)) @touch $@ .PHONY: lint-md -# Lints the markdown documents maintained by us in the codebase. -lint-md: lint-js-doc | tools/.mdlintstamp +lint-md: lint-js-doc | tools/.mdlintstamp ## Lint the markdown documents maintained by us in the codebase. run-format-md = tools/lint-md/lint-md.mjs --format $(LINT_MD_FILES) .PHONY: format-md -# Formats the markdown documents maintained by us in the codebase. -format-md: +format-md: tools/lint-md/node_modules/remark-parse/package.json ## Format the markdown documents maintained by us in the codebase. + $(info Formatting Markdown...) @$(call available-node,$(run-format-md)) -LINT_JS_TARGETS = .eslintrc.js benchmark doc lib test tools +LINT_JS_TARGETS = eslint.config.mjs benchmark doc lib test tools -run-lint-js = tools/node_modules/eslint/bin/eslint.js --cache \ +run-lint-js = tools/eslint/node_modules/eslint/bin/eslint.js --cache \ --max-warnings=0 --report-unused-disable-directives $(LINT_JS_TARGETS) run-lint-js-fix = $(run-lint-js) --fix +tools/eslint/node_modules/eslint/bin/eslint.js: tools/eslint/package-lock.json + -cd tools/eslint && $(call available-node,$(run-npm-ci)) + .PHONY: lint-js-fix -lint-js-fix: +lint-js-fix: tools/eslint/node_modules/eslint/bin/eslint.js ## Lint and fix the JavaScript code with eslint./eslint/bin/eslint.js @$(call available-node,$(run-lint-js-fix)) .PHONY: lint-js .PHONY: lint-js-doc # Note that on the CI `lint-js-ci` is run instead. -# Lints the JavaScript code with eslint. lint-js-doc: LINT_JS_TARGETS=doc -lint-js lint-js-doc: +lint-js lint-js-doc: tools/eslint/node_modules/eslint/bin/eslint.js ## Lint the JavaScript code with eslint./eslint/bin/eslint.js @if [ "$(shell $(node_use_openssl))" != "true" ]; then \ echo "Skipping $@ (no crypto)"; \ else \ @@ -1387,13 +1461,13 @@ lint-js lint-js-doc: jslint: lint-js $(warning Please use lint-js instead of jslint) -run-lint-js-ci = tools/node_modules/eslint/bin/eslint.js \ +run-lint-js-ci = tools/eslint/node_modules/eslint/bin/eslint.js \ --max-warnings=0 --report-unused-disable-directives -f tap \ -o test-eslint.tap $(LINT_JS_TARGETS) .PHONY: lint-js-ci # On the CI the output is emitted in the TAP format. -lint-js-ci: +lint-js-ci: tools/eslint/node_modules/eslint/bin/eslint.js $(info Running JS linter...) @$(call available-node,$(run-lint-js-ci)) @@ -1408,6 +1482,11 @@ LINT_CPP_EXCLUDE += $(LINT_CPP_ADDON_DOC_FILES) # These files were copied more or less verbatim from V8. LINT_CPP_EXCLUDE += src/tracing/trace_event.h src/tracing/trace_event_common.h +# deps/ncrypto is included in this list, as it is maintained in +# this repository, and should be linted. Eventually it should move +# to its own repo, at which point we should remove it from this list. +LINT_CPP_DEPS = deps/ncrypto/*.cc deps/ncrypto/*.h + LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ benchmark/napi/*/*.cc \ src/*.c \ @@ -1418,10 +1497,13 @@ LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ src/*/*.h \ test/addons/*/*.cc \ test/addons/*/*.h \ + test/cctest/*/*.cc \ + test/cctest/*/*.h \ test/cctest/*.cc \ test/cctest/*.h \ test/embedding/*.cc \ test/embedding/*.h \ + test/sqlite/*/*.c \ test/fixtures/*.c \ test/js-native-api/*/*.cc \ test/node-api/*/*.cc \ @@ -1432,6 +1514,7 @@ LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ tools/code_cache/*.h \ tools/snapshot/*.cc \ tools/snapshot/*.h \ + $(LINT_CPP_DEPS) \ )) FORMAT_CPP_FILES ?= @@ -1444,6 +1527,7 @@ FORMAT_CPP_FILES += $(wildcard \ test/js-native-api/*/*.h \ test/node-api/*/*.c \ test/node-api/*/*.h \ + test/sqlite/*/*.c \ ) # Code blocks don't have newline at the end, @@ -1451,12 +1535,12 @@ FORMAT_CPP_FILES += $(wildcard \ ADDON_DOC_LINT_FLAGS=-whitespace/ending_newline,-build/header_guard .PHONY: format-cpp-build -format-cpp-build: +format-cpp-build: ## Build 'clang-format' tooling for C++ code formatting. cd tools/clang-format && $(call available-node,$(run-npm-ci)) .PHONY: format-cpp-clean .NOTPARALLEL: format-cpp-clean -format-cpp-clean: +format-cpp-clean: ## Remove 'clang-format' tooling for C++ code formatting. $(RM) -r tools/clang-format/node_modules CLANG_FORMAT_START ?= HEAD @@ -1467,7 +1551,7 @@ CLANG_FORMAT_START ?= HEAD # $ CLANG_FORMAT_START=`git rev-parse HEAD~1` make format-cpp # To format diff between main and current branch head (main...HEAD): # $ CLANG_FORMAT_START=main make format-cpp -format-cpp: ## Format C++ diff from $CLANG_FORMAT_START to current changes +format-cpp: ## Format C++ diff from $CLANG_FORMAT_START to current changes. ifneq ("","$(wildcard tools/clang-format/node_modules/)") $(info Formatting C++ diff from $(CLANG_FORMAT_START)..) @$(PYTHON) tools/clang-format/node_modules/.bin/git-clang-format \ @@ -1486,8 +1570,7 @@ else CPPLINT_QUIET = --quiet endif .PHONY: lint-cpp -# Lints the C++ code with cpplint.py and checkimports.py. -lint-cpp: tools/.cpplintstamp +lint-cpp: tools/.cpplintstamp ## Lint the C++ code with cpplint.py and checkimports.py. tools/.cpplintstamp: $(LINT_CPP_FILES) $(info Running C++ linter...) @@ -1496,7 +1579,7 @@ tools/.cpplintstamp: $(LINT_CPP_FILES) @touch $@ .PHONY: lint-addon-docs -lint-addon-docs: tools/.doclintstamp +lint-addon-docs: tools/.doclintstamp ## Lint the addon documentation. tools/.doclintstamp: test/addons/.docbuildstamp $(info Running C++ linter on addon docs...) @@ -1510,19 +1593,23 @@ cpplint: lint-cpp .PHONY: lint-py-build # python -m pip install ruff # Try with '--system' if it fails without; the system may have set '--user' -lint-py-build: +lint-py-build: ## Build resources needed to lint python files. $(info Pip installing ruff on $(shell $(PYTHON) --version)...) - $(PYTHON) -m pip install --upgrade --target tools/pip/site-packages ruff==0.3.4 || \ - $(PYTHON) -m pip install --upgrade --system --target tools/pip/site-packages ruff==0.3.4 + $(PYTHON) -m pip install --upgrade --target tools/pip/site-packages ruff==0.13.1 || \ + $(PYTHON) -m pip install --upgrade --system --target tools/pip/site-packages ruff==0.13.1 -.PHONY: lint-py +.PHONY: lint-py lint-py-fix lint-py-fix-unsafe ifneq ("","$(wildcard tools/pip/site-packages/ruff)") # Lint the Python code with ruff. lint-py: - tools/pip/site-packages/bin/ruff --version + $(info Running Python linter...) tools/pip/site-packages/bin/ruff check . +lint-py-fix: + tools/pip/site-packages/bin/ruff check . --fix +lint-py-fix-unsafe: + tools/pip/site-packages/bin/ruff check . --fix --unsafe-fixes else -lint-py: +lint-py lint-py-fix lint-py-fix-unsafe: $(warning Python linting with ruff is not available) $(warning Run 'make lint-py-build') endif @@ -1530,15 +1617,15 @@ endif .PHONY: lint-yaml-build # python -m pip install yamllint # Try with '--system' if it fails without; the system may have set '--user' -lint-yaml-build: +lint-yaml-build: ## Build resources needed to lint YAML files. $(info Pip installing yamllint on $(shell $(PYTHON) --version)...) $(PYTHON) -m pip install --upgrade -t tools/pip/site-packages yamllint || \ $(PYTHON) -m pip install --upgrade --system -t tools/pip/site-packages yamllint .PHONY: lint-yaml -# Lints the YAML files with yamllint. -lint-yaml: +lint-yaml: ## Lint the YAML files with yamllint. @if [ -d "tools/pip/site-packages/yamllint" ]; then \ + $(info Running YAML linter...) \ PYTHONPATH=tools/pip $(PYTHON) -m yamllint .; \ else \ echo 'YAML linting with yamllint is not available'; \ @@ -1547,7 +1634,7 @@ lint-yaml: .PHONY: lint .PHONY: lint-ci -ifneq ("","$(wildcard tools/node_modules/eslint/)") +ifneq ("","$(wildcard tools/eslint/)") lint: ## Run JS, C++, MD and doc linters. @EXIT_STATUS=0 ; \ $(MAKE) lint-js || EXIT_STATUS=$$? ; \ @@ -1575,19 +1662,22 @@ lint lint-ci: endif .PHONY: lint-clean -lint-clean: +lint-clean: ## Remove linting artifacts. $(RM) tools/.*lintstamp $(RM) .eslintcache + $(RM) -r tools/eslint/node_modules + $(RM) -r tools/lint-md/node_modules + $(RM) tools/pip/site_packages HAS_DOCKER ?= $(shell command -v docker > /dev/null 2>&1; [ $$? -eq 0 ] && echo 1 || echo 0) .PHONY: gen-openssl ifeq ($(HAS_DOCKER), 1) -DOCKER_COMMAND ?= docker run -it -v $(PWD):/node -IS_IN_WORKTREE = $(shell grep '^gitdir: ' $(PWD)/.git 2>/dev/null) +DOCKER_COMMAND ?= docker run --rm -u $(shell id -u) -v '$(PWD):/node' +IS_IN_WORKTREE = $(shell grep '^gitdir: ' '$(PWD)/.git' 2>/dev/null) GIT_WORKTREE_COMMON = $(shell git rev-parse --git-common-dir) DOCKER_COMMAND += $(if $(IS_IN_WORKTREE), -v $(GIT_WORKTREE_COMMON):$(GIT_WORKTREE_COMMON)) -gen-openssl: ## Generate platform dependent openssl files (requires docker) +gen-openssl: ## Generate platform dependent openssl files (requires docker). docker build -t node-openssl-builder deps/openssl/config/ $(DOCKER_COMMAND) node-openssl-builder make -C deps/openssl/config else diff --git a/README.md b/README.md index a3ee8b7444bfb4..3ac5fba3d77ab2 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Looking for help? Check out the * **Current**: Under active development. Code for the Current release is in the branch for its major version number (for example, - [v19.x](https://github.com/nodejs/node/tree/v19.x)). Node.js releases a new + [v22.x](https://github.com/nodejs/node/tree/v22.x)). Node.js releases a new major version every 6 months, allowing for breaking changes. This happens in April and October every year. Releases appearing each October have a support life of 8 months. Releases appearing each April convert to LTS (see below) @@ -81,8 +81,10 @@ directory contains the latest Hydrogen (Node.js 18) release. <https://nodejs.org/download/nightly/> -Each directory name and filename contains a date (in UTC) and the commit -SHA at the HEAD of the release. +Each directory and filename includes the version (e.g., `v22.0.0`), +followed by the UTC date (e.g., `20240424` for April 24, 2024), +and the short commit SHA of the HEAD of the release (e.g., `ddd0a9e494`). +For instance, a full directory name might look like `v22.0.0-nightly20240424ddd0a9e494`. #### API documentation @@ -93,43 +95,27 @@ _docs_ subdirectory. Version-specific documentation is also at ### Verifying binaries -Download directories contain a `SHASUMS256.txt` file with SHA checksums for the -files. +Download directories contain a `SHASUMS256.txt.asc` file with SHA checksums for the +files and the releaser PGP signature. -To download `SHASUMS256.txt` using `curl`: +You can get a trusted keyring from nodejs/release-keys, e.g. using `curl`: ```bash -curl -O https://nodejs.org/dist/vx.y.z/SHASUMS256.txt +curl -fsLo "/path/to/nodejs-keyring.kbx" "https://github.com/nodejs/release-keys/raw/HEAD/gpg/pubring.kbx" ``` -To check that a downloaded file matches the checksum, run -it through `sha256sum` with a command such as: +Alternatively, you can import the releaser keys in your default keyring, see +[Release keys](#release-keys) for commands to how to do that. -```bash -grep node-vx.y.z.tar.gz SHASUMS256.txt | sha256sum -c - -``` - -For Current and LTS, the GPG detached signature of `SHASUMS256.txt` is in -`SHASUMS256.txt.sig`. You can use it with `gpg` to verify the integrity of -`SHASUMS256.txt`. You will first need to import -[the GPG keys of individuals authorized to create releases](#release-keys). To -import the keys: - -```bash -gpg --keyserver hkps://keys.openpgp.org --recv-keys 4ED778F539E3634C779C87C6D7062848A1AB005C -``` - -See [Release keys](#release-keys) for a script to import active release keys. - -Next, download the `SHASUMS256.txt.sig` for the release: +Then, you can verify the files you've downloaded locally +(if you're using your default keyring, pass `--keyring="${GNUPGHOME:-~/.gnupg}/pubring.kbx"`): ```bash -curl -O https://nodejs.org/dist/vx.y.z/SHASUMS256.txt.sig +curl -fsO "https://nodejs.org/dist/${VERSION}/SHASUMS256.txt.asc" \ +&& gpgv --keyring="/path/to/nodejs-keyring.kbx" --output SHASUMS256.txt < SHASUMS256.txt.asc \ +&& shasum --check SHASUMS256.txt --ignore-missing ``` -Then use `gpg --verify SHASUMS256.txt.sig SHASUMS256.txt` to verify -the file's signature. - ## Building Node.js See [BUILDING.md](BUILDING.md) for instructions on how to build Node.js from @@ -165,15 +151,11 @@ For information about the governance of the Node.js project, see * [aduh95](https://github.com/aduh95) - **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> (he/him) * [anonrig](https://github.com/anonrig) - - **Yagiz Nizipli** <<yagiz.nizipli@sentry.io>> (he/him) -* [apapirovski](https://github.com/apapirovski) - - **Anatoli Papirovski** <<apapirovski@mac.com>> (he/him) + **Yagiz Nizipli** <<yagiz@nizipli.com>> (he/him) * [benjamingr](https://github.com/benjamingr) - **Benjamin Gruenbaum** <<benjamingr@gmail.com>> * [BridgeAR](https://github.com/BridgeAR) - **Ruben Bridgewater** <<ruben@bridgewater.de>> (he/him) -* [GeoffreyBooth](https://github.com/geoffreybooth) - - **Geoffrey Booth** <<webadmin@geoffreybooth.com>> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** <<gpunathi@in.ibm.com>> (he/him) * [jasnell](https://github.com/jasnell) - @@ -182,16 +164,18 @@ For information about the governance of the Node.js project, see **Joyee Cheung** <<joyeec9h3@gmail.com>> (she/her) * [legendecas](https://github.com/legendecas) - **Chengzhong Wu** <<legendecas@gmail.com>> (he/him) +* [marco-ippolito](https://github.com/marco-ippolito) - + **Marco Ippolito** <<marcoippolito54@gmail.com>> (he/him) * [mcollina](https://github.com/mcollina) - **Matteo Collina** <<matteo.collina@gmail.com>> (he/him) -* [mhdawson](https://github.com/mhdawson) - - **Michael Dawson** <<midawson@redhat.com>> (he/him) -* [MoLow](https://github.com/MoLow) - - **Moshe Atlow** <<moshe@atlow.co.il>> (he/him) +* [panva](https://github.com/panva) - + **Filip Skokan** <<panva.ip@gmail.com>> (he/him) * [RafaelGSS](https://github.com/RafaelGSS) - **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> (he/him) +* [RaisinTen](https://github.com/RaisinTen) - + **Darshan Sen** <<raisinten@gmail.com>> (he/him) * [richardlau](https://github.com/richardlau) - - **Richard Lau** <<rlau@redhat.com>> + **Richard Lau** <<richard.lau@ibm.com>> * [ronag](https://github.com/ronag) - **Robert Nagy** <<ronagy@icloud.com>> * [ruyadorno](https://github.com/ruyadorno) - @@ -209,18 +193,14 @@ For information about the governance of the Node.js project, see **Beth Griggs** <<bethanyngriggs@gmail.com>> (she/her) * [bnoordhuis](https://github.com/bnoordhuis) - **Ben Noordhuis** <<info@bnoordhuis.nl>> -* [ChALkeR](https://github.com/ChALkeR) - - **Сковорода Никита Андреевич** <<chalkerx@gmail.com>> (he/him) * [cjihrig](https://github.com/cjihrig) - **Colin Ihrig** <<cjihrig@gmail.com>> (he/him) * [codebytere](https://github.com/codebytere) - **Shelley Vohr** <<shelley.vohr@gmail.com>> (she/her) -* [danielleadams](https://github.com/danielleadams) - - **Danielle Adams** <<adamzdanielle@gmail.com>> (she/her) -* [MylesBorins](https://github.com/MylesBorins) - - **Myles Borins** <<myles.borins@gmail.com>> (he/him) -* [TimothyGu](https://github.com/TimothyGu) - - **Tiancheng "Timothy" Gu** <<timothygu99@gmail.com>> (he/him) +* [GeoffreyBooth](https://github.com/GeoffreyBooth) - + **Geoffrey Booth** <<webadmin@geoffreybooth.com>> (he/him) +* [MoLow](https://github.com/MoLow) - + **Moshe Atlow** <<moshe@atlow.co.il>> (he/him) * [Trott](https://github.com/Trott) - **Rich Trott** <<rtrott@gmail.com>> (he/him) @@ -232,10 +212,16 @@ For information about the governance of the Node.js project, see * [addaleax](https://github.com/addaleax) - **Anna Henningsen** <<anna@addaleax.net>> (she/her) +* [apapirovski](https://github.com/apapirovski) - + **Anatoli Papirovski** <<apapirovski@mac.com>> (he/him) +* [ChALkeR](https://github.com/ChALkeR) - + **Сковорода Никита Андреевич** <<chalkerx@gmail.com>> (he/him) * [chrisdickinson](https://github.com/chrisdickinson) - **Chris Dickinson** <<christopher.s.dickinson@gmail.com>> * [danbev](https://github.com/danbev) - **Daniel Bevenius** <<daniel.bevenius@gmail.com>> (he/him) +* [danielleadams](https://github.com/danielleadams) - + **Danielle Adams** <<adamzdanielle@gmail.com>> (she/her) * [evanlucas](https://github.com/evanlucas) - **Evan Lucas** <<evanlucas@me.com>> (he/him) * [fhinkel](https://github.com/fhinkel) - @@ -252,10 +238,14 @@ For information about the governance of the Node.js project, see **Isaac Z. Schlueter** <<i@izs.me>> * [joshgav](https://github.com/joshgav) - **Josh Gavant** <<josh.gavant@outlook.com>> +* [mhdawson](https://github.com/mhdawson) - + **Michael Dawson** <<midawson@redhat.com>> (he/him) * [mmarchini](https://github.com/mmarchini) - **Mary Marchini** <<oss@mmarchini.me>> (she/her) * [mscdex](https://github.com/mscdex) - **Brian White** <<mscdex@mscdex.net>> +* [MylesBorins](https://github.com/MylesBorins) - + **Myles Borins** <<myles.borins@gmail.com>> (he/him) * [nebrius](https://github.com/nebrius) - **Bryan Hughes** <<bryan@nebri.us>> * [ofrobots](https://github.com/ofrobots) - @@ -264,8 +254,6 @@ For information about the governance of the Node.js project, see **Alexis Campailla** <<orangemocha@nodejs.org>> * [piscisaureus](https://github.com/piscisaureus) - **Bert Belder** <<bertbelder@gmail.com>> -* [RaisinTen](https://github.com/RaisinTen) - - **Darshan Sen** <<raisinten@gmail.com>> (he/him) * [rvagg](https://github.com/rvagg) - **Rod Vagg** <<r@va.gg>> * [sam-github](https://github.com/sam-github) - @@ -274,6 +262,8 @@ For information about the governance of the Node.js project, see **Shigeki Ohtsu** <<ohtsu@ohtsu.org>> (he/him) * [thefourtheye](https://github.com/thefourtheye) - **Sakthipriyan Vairamani** <<thechargingvolcano@gmail.com>> (he/him) +* [TimothyGu](https://github.com/TimothyGu) - + **Tiancheng "Timothy" Gu** <<timothygu99@gmail.com>> (he/him) * [trevnorris](https://github.com/trevnorris) - **Trevor Norris** <<trev.norris@gmail.com>> @@ -285,20 +275,20 @@ For information about the governance of the Node.js project, see ### Collaborators +* [abmusse](https://github.com/abmusse) - + **Abdirahim Musse** <<abdirahim.musse@ibm.com>> * [addaleax](https://github.com/addaleax) - **Anna Henningsen** <<anna@addaleax.net>> (she/her) +* [Aditi-1400](https://github.com/Aditi-1400) - + **Aditi Singh** <<aditisingh1400@gmail.com>> (she/her) * [aduh95](https://github.com/aduh95) - - **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> (he/him) + **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> (he/him) - [Support me](https://github.com/sponsors/aduh95) * [anonrig](https://github.com/anonrig) - - **Yagiz Nizipli** <<yagiz.nizipli@sentry.io>> (he/him) -* [antsmartian](https://github.com/antsmartian) - - **Anto Aravinth** <<anto.aravinth.cse@gmail.com>> (he/him) -* [apapirovski](https://github.com/apapirovski) - - **Anatoli Papirovski** <<apapirovski@mac.com>> (he/him) -* [AshCripps](https://github.com/AshCripps) - - **Ash Cripps** <<email@ashleycripps.co.uk>> + **Yagiz Nizipli** <<yagiz@nizipli.com>> (he/him) - [Support me](https://github.com/sponsors/anonrig) * [atlowChemi](https://github.com/atlowChemi) - **Chemi Atlow** <<chemi@atlow.co.il>> (he/him) +* [avivkeller](https://github.com/avivkeller) - + **Aviv Keller** <<me@aviv.sh>> (he/him) - [Support me](https://github.com/sponsors/avivkeller) * [Ayase-252](https://github.com/Ayase-252) - **Qingyu Deng** <<i@ayase-lab.com>> * [bengl](https://github.com/bengl) - @@ -307,8 +297,6 @@ For information about the governance of the Node.js project, see **Benjamin Gruenbaum** <<benjamingr@gmail.com>> * [BethGriggs](https://github.com/BethGriggs) - **Beth Griggs** <<bethanyngriggs@gmail.com>> (she/her) -* [bmeck](https://github.com/bmeck) - - **Bradley Farias** <<bradley.meck@gmail.com>> * [bnb](https://github.com/bnb) - **Tierney Cyren** <<hello@bnb.im>> (they/them) * [bnoordhuis](https://github.com/bnoordhuis) - @@ -327,36 +315,34 @@ For information about the governance of the Node.js project, see **Kohei Ueno** <<kohei.ueno119@gmail.com>> (he/him) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <<daeyeon.dev@gmail.com>> (he/him) -* [danbev](https://github.com/danbev) - - **Daniel Bevenius** <<daniel.bevenius@gmail.com>> (he/him) -* [danielleadams](https://github.com/danielleadams) - - **Danielle Adams** <<adamzdanielle@gmail.com>> (she/her) +* [dario-piotrowicz](https://github.com/dario-piotrowicz) - + **Dario Piotrowicz** <<dario.piotrowicz@gmail.com>> (he/him) * [debadree25](https://github.com/debadree25) - **Debadree Chatterjee** <<debadree333@gmail.com>> (he/him) * [deokjinkim](https://github.com/deokjinkim) - **Deokjin Kim** <<deokjin81.kim@gmail.com>> (he/him) -* [devsnek](https://github.com/devsnek) - - **Gus Caplan** <<me@gus.host>> (they/them) * [edsadr](https://github.com/edsadr) - **Adrian Estrada** <<edsadr@gmail.com>> (he/him) -* [erickwendel](https://github.com/erickwendel) - +* [ErickWendel](https://github.com/ErickWendel) - **Erick Wendel** <<erick.workspace@gmail.com>> (he/him) * [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - **Ethan Arrowood** <<ethan@arrowood.dev>> (he/him) * [fhinkel](https://github.com/fhinkel) - **Franziska Hinkelmann** <<franziska.hinkelmann@gmail.com>> (she/her) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <<F3n67u@outlook.com>> (he/him) * [Flarna](https://github.com/Flarna) - **Gerhard Stöbich** <<deb2001-github@yahoo.de>> (he/they) * [gabrielschulhof](https://github.com/gabrielschulhof) - **Gabriel Schulhof** <<gabrielschulhof@gmail.com>> +* [geeksilva97](https://github.com/geeksilva97) - + **Edy Silva** <<edigleyssonsilva@gmail.com>> (he/him) * [gengjiawen](https://github.com/gengjiawen) - **Jiawen Geng** <<technicalcute@gmail.com>> -* [GeoffreyBooth](https://github.com/geoffreybooth) - +* [GeoffreyBooth](https://github.com/GeoffreyBooth) - **Geoffrey Booth** <<webadmin@geoffreybooth.com>> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** <<gpunathi@in.ibm.com>> (he/him) +* [gurgunday](https://github.com/gurgunday) - + **Gürgün Dayıoğlu** <<hey@gurgun.day>> (he/him) * [guybedford](https://github.com/guybedford) - **Guy Bedford** <<guybedford@gmail.com>> (he/him) * [H4ad](https://github.com/H4ad) - @@ -365,14 +351,22 @@ For information about the governance of the Node.js project, see **Harshitha K P** <<harshitha014@gmail.com>> (she/her) * [himself65](https://github.com/himself65) - **Zeyu "Alex" Yang** <<himself65@outlook.com>> (he/him) +* [hybrist](https://github.com/hybrist) - + **Jan Martin** <<jan.krems@gmail.com>> (he/him) +* [IlyasShabi](https://github.com/IlyasShabi) - + **Ilyas Shabi** <<ilyasshabi94@gmail.com>> (he/him) +* [islandryu](https://github.com/islandryu) - + **Ryuhei Shima** <<shimaryuhei@gmail.com>> (he/him) +* [jakecastelli](https://github.com/jakecastelli) - + **Jake Yuesong Li** <<jake.yuesong@gmail.com>> (he/him) * [JakobJingleheimer](https://github.com/JakobJingleheimer) - **Jacob Smith** <<jacob@frende.me>> (he/him) * [jasnell](https://github.com/jasnell) - **James M Snell** <<jasnell@gmail.com>> (he/him) -* [jkrems](https://github.com/jkrems) - - **Jan Krems** <<jan.krems@gmail.com>> (he/him) -* [joesepi](https://github.com/joesepi) - - **Joe Sepi** <<sepi@joesepi.com>> (he/him) +* [jazelly](https://github.com/jazelly) - + **Jason Zhang** <<xzha4350@gmail.com>> (he/him) +* [JonasBa](https://github.com/JonasBa) - + **Jonas Badalic** <<jonas.badalic@gmail.com>> (he/him) * [joyeecheung](https://github.com/joyeecheung) - **Joyee Cheung** <<joyeec9h3@gmail.com>> (she/her) * [juanarbol](https://github.com/juanarbol) - @@ -381,106 +375,92 @@ For information about the governance of the Node.js project, see **Minwoo Jung** <<nodecorelab@gmail.com>> (he/him) * [KhafraDev](https://github.com/KhafraDev) - **Matthew Aitken** <<maitken033380023@gmail.com>> (he/him) -* [kuriyosh](https://github.com/kuriyosh) - - **Yoshiki Kurihara** <<yosyos0306@gmail.com>> (he/him) -* [kvakil](https://github.com/kvakil) - - **Keyhan Vakil** <<kvakil@sylph.kvakil.me>> * [legendecas](https://github.com/legendecas) - **Chengzhong Wu** <<legendecas@gmail.com>> (he/him) * [lemire](https://github.com/lemire) - **Daniel Lemire** <<daniel@lemire.me>> -* [linkgoron](https://github.com/linkgoron) - - **Nitzan Uziely** <<linkgoron@gmail.com>> * [LiviaMedeiros](https://github.com/LiviaMedeiros) - **LiviaMedeiros** <<livia@cirno.name>> +* [ljharb](https://github.com/ljharb) - + **Jordan Harband** <<ljharb@gmail.com>> * [lpinca](https://github.com/lpinca) - **Luigi Pinca** <<luigipinca@gmail.com>> (he/him) -* [lukekarrys](https://github.com/lukekarrys) - - **Luke Karrys** <<luke@lukekarrys.com>> (he/him) * [Lxxyx](https://github.com/Lxxyx) - **Zijian Liu** <<lxxyxzj@gmail.com>> (he/him) * [marco-ippolito](https://github.com/marco-ippolito) - - **Marco Ippolito** <<marcoippolito54@gmail.com>> (he/him) + **Marco Ippolito** <<marcoippolito54@gmail.com>> (he/him) - [Support me](https://github.com/sponsors/marco-ippolito) * [marsonya](https://github.com/marsonya) - **Akhil Marsonya** <<akhil.marsonya27@gmail.com>> (he/him) +* [MattiasBuelens](https://github.com/MattiasBuelens) - + **Mattias Buelens** <<mattias@buelens.com>> (he/him) * [mcollina](https://github.com/mcollina) - - **Matteo Collina** <<matteo.collina@gmail.com>> (he/him) + **Matteo Collina** <<matteo.collina@gmail.com>> (he/him) - [Support me](https://github.com/sponsors/mcollina) * [meixg](https://github.com/meixg) - **Xuguang Mei** <<meixuguang@gmail.com>> (he/him) -* [Mesteery](https://github.com/Mesteery) - - **Mestery** <<mestery@protonmail.com>> (he/him) * [mhdawson](https://github.com/mhdawson) - **Michael Dawson** <<midawson@redhat.com>> (he/him) -* [mildsunrise](https://github.com/mildsunrise) - - **Alba Mendez** <<me@alba.sh>> (she/her) * [MoLow](https://github.com/MoLow) - **Moshe Atlow** <<moshe@atlow.co.il>> (he/him) * [MrJithil](https://github.com/MrJithil) - **Jithil P Ponnan** <<jithil@outlook.com>> (he/him) -* [mscdex](https://github.com/mscdex) - - **Brian White** <<mscdex@mscdex.net>> -* [MylesBorins](https://github.com/MylesBorins) - - **Myles Borins** <<myles.borins@gmail.com>> (he/him) * [ovflowd](https://github.com/ovflowd) - **Claudio Wunder** <<cwunder@gnome.org>> (he/they) * [panva](https://github.com/panva) - - **Filip Skokan** <<panva.ip@gmail.com>> (he/him) + **Filip Skokan** <<panva.ip@gmail.com>> (he/him) - [Support me](https://github.com/sponsors/panva) +* [pimterry](https://github.com/pimterry) - + **Tim Perry** <<pimterry@gmail.com>> (he/him) +* [pmarchini](https://github.com/pmarchini) - + **Pietro Marchini** <<pietro.marchini94@gmail.com>> (he/him) +* [puskin](https://github.com/puskin) - + **Giovanni Bucci** <<github@puskin.it>> (he/him) * [Qard](https://github.com/Qard) - **Stephen Belanger** <<admin@stephenbelanger.com>> (he/him) * [RafaelGSS](https://github.com/RafaelGSS) - - **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> (he/him) + **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> (he/him) - [Support me](https://github.com/sponsors/RafaelGSS) +* [RaisinTen](https://github.com/RaisinTen) - + **Darshan Sen** <<raisinten@gmail.com>> (he/him) - [Support me](https://github.com/sponsors/RaisinTen) +* [Renegade334](https://github.com/Renegade334) - + **René** <<contact.9a5d6388@renegade334.me.uk>> +* [richardlau](https://github.com/richardlau) - + **Richard Lau** <<richard.lau@ibm.com>> * [rluvaton](https://github.com/rluvaton) - **Raz Luvaton** <<rluvaton@gmail.com>> (he/him) -* [richardlau](https://github.com/richardlau) - - **Richard Lau** <<rlau@redhat.com>> -* [rickyes](https://github.com/rickyes) - - **Ricky Zhou** <<0x19951125@gmail.com>> (he/him) * [ronag](https://github.com/ronag) - **Robert Nagy** <<ronagy@icloud.com>> * [ruyadorno](https://github.com/ruyadorno) - **Ruy Adorno** <<ruy@vlt.sh>> (he/him) -* [ryzokuken](https://github.com/ryzokuken) - - **Ujjwal Sharma** <<ryzokuken@disroot.org>> (he/him) * [santigimeno](https://github.com/santigimeno) - **Santiago Gimeno** <<santiago.gimeno@gmail.com>> -* [shisama](https://github.com/shisama) - - **Masashi Hirano** <<shisama07@gmail.com>> (he/him) * [ShogunPanda](https://github.com/ShogunPanda) - **Paolo Insogna** <<paolo@cowtech.it>> (he/him) * [srl295](https://github.com/srl295) - **Steven R Loomis** <<srl295@gmail.com>> +* [StefanStojanovic](https://github.com/StefanStojanovic) - + **Stefan Stojanovic** <<stefan.stojanovic@janeasystems.com>> (he/him) * [sxa](https://github.com/sxa) - **Stewart X Addison** <<sxa@redhat.com>> (he/him) * [targos](https://github.com/targos) - **Michaël Zasso** <<targos@protonmail.com>> (he/him) * [theanarkh](https://github.com/theanarkh) - **theanarkh** <<theratliter@gmail.com>> (he/him) -* [TimothyGu](https://github.com/TimothyGu) - - **Tiancheng "Timothy" Gu** <<timothygu99@gmail.com>> (he/him) * [tniessen](https://github.com/tniessen) - **Tobias Nießen** <<tniessen@tnie.de>> (he/him) * [trivikr](https://github.com/trivikr) - **Trivikram Kamat** <<trivikr.dev@gmail.com>> * [Trott](https://github.com/Trott) - **Rich Trott** <<rtrott@gmail.com>> (he/him) -* [UlisesGascon](https://github.com/ulisesgascon) - +* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** <<ulisesgascongonzalez@gmail.com>> (he/him) -* [vdeturckheim](https://github.com/vdeturckheim) - - **Vladimir de Turckheim** <<vlad2t@hotmail.com>> (he/him) * [vmoroz](https://github.com/vmoroz) - **Vladimir Morozov** <<vmorozov@microsoft.com>> (he/him) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - **Mohammed Keyvanzadeh** <<mohammadkeyvanzade94@gmail.com>> (he/him) * [watilde](https://github.com/watilde) - **Daijiro Wachi** <<daijiro.wachi@gmail.com>> (he/him) -* [XadillaX](https://github.com/XadillaX) - - **Khaidi Chu** <<i@2333.moe>> (he/him) -* [yashLadha](https://github.com/yashLadha) - - **Yash Ladha** <<yash@yashladha.in>> (he/him) -* [ZYSzys](https://github.com/ZYSzys) - - **Yongsheng Zhang** <<zyszys98@gmail.com>> (he/him) * [zcbenz](https://github.com/zcbenz) - **Cheng Zhao** <<zcbenz@gmail.com>> (he/him) +* [ZYSzys](https://github.com/ZYSzys) - + **Yongsheng Zhang** <<zyszys98@gmail.com>> (he/him) <details> @@ -495,14 +475,22 @@ For information about the governance of the Node.js project, see **Aleksei Koziatinskii** <<ak239spb@gmail.com>> * [andrasq](https://github.com/andrasq) - **Andras** <<andras@kinvey.com>> -* [AnnaMag](https://github.com/AnnaMag) - - **Anna M. Kedzierska** <<anna.m.kedzierska@gmail.com>> * [AndreasMadsen](https://github.com/AndreasMadsen) - **Andreas Madsen** <<amwebdk@gmail.com>> (he/him) +* [AnnaMag](https://github.com/AnnaMag) - + **Anna M. Kedzierska** <<anna.m.kedzierska@gmail.com>> +* [antsmartian](https://github.com/antsmartian) - + **Anto Aravinth** <<anto.aravinth.cse@gmail.com>> (he/him) +* [apapirovski](https://github.com/apapirovski) - + **Anatoli Papirovski** <<apapirovski@mac.com>> (he/him) * [aqrln](https://github.com/aqrln) - **Alexey Orlenko** <<eaglexrlnk@gmail.com>> (he/him) +* [AshCripps](https://github.com/AshCripps) - + **Ash Cripps** <<email@ashleycripps.co.uk>> * [bcoe](https://github.com/bcoe) - **Ben Coe** <<bencoe@gmail.com>> (he/him) +* [bmeck](https://github.com/bmeck) - + **Bradley Farias** <<bradley.meck@gmail.com>> * [bmeurer](https://github.com/bmeurer) - **Benedikt Meurer** <<benedikt.meurer@gmail.com>> * [boneskull](https://github.com/boneskull) - @@ -517,17 +505,23 @@ For information about the governance of the Node.js project, see **Chris Dickinson** <<christopher.s.dickinson@gmail.com>> * [claudiorodriguez](https://github.com/claudiorodriguez) - **Claudio Rodriguez** <<cjrodr@yahoo.com>> -* [DavidCai1993](https://github.com/DavidCai1993) - +* [danbev](https://github.com/danbev) - + **Daniel Bevenius** <<daniel.bevenius@gmail.com>> (he/him) +* [danielleadams](https://github.com/danielleadams) - + **Danielle Adams** <<adamzdanielle@gmail.com>> (she/her) +* [DavidCai1111](https://github.com/DavidCai1111) - **David Cai** <<davidcai1993@yahoo.com>> (he/him) * [davisjam](https://github.com/davisjam) - **Jamie Davis** <<davisjam@vt.edu>> (he/him) * [devnexen](https://github.com/devnexen) - **David Carlier** <<devnexen@gmail.com>> +* [devsnek](https://github.com/devsnek) - + **Gus Caplan** <<me@gus.host>> (they/them) * [digitalinfinity](https://github.com/digitalinfinity) - **Hitesh Kanwathirtha** <<digitalinfinity@gmail.com>> (he/him) * [dmabupt](https://github.com/dmabupt) - **Xu Meng** <<dmabupt@gmail.com>> (he/him) -* [dnlup](https://github.com/dnlup) +* [dnlup](https://github.com/dnlup) - **dnlup** <<dnlup.dev@gmail.com>> * [eljefedelrodeodeljefe](https://github.com/eljefedelrodeodeljefe) - **Robert Jefe Lindstaedt** <<robert.lindstaedt@gmail.com>> @@ -537,6 +531,8 @@ For information about the governance of the Node.js project, see **Eugene Ostroukhov** <<eostroukhov@google.com>> * [evanlucas](https://github.com/evanlucas) - **Evan Lucas** <<evanlucas@me.com>> (he/him) +* [F3n67u](https://github.com/F3n67u) - + **Feng Yu** <<F3n67u@outlook.com>> (he/him) * [firedfox](https://github.com/firedfox) - **Daniel Wang** <<wangyang0123@gmail.com>> * [Fishrock123](https://github.com/Fishrock123) - @@ -579,6 +575,8 @@ For information about the governance of the Node.js project, see **Yuval Brik** <<yuval@brik.org.il>> * [joaocgreis](https://github.com/joaocgreis) - **João Reis** <<reis@janeasystems.com>> +* [joesepi](https://github.com/joesepi) - + **Joe Sepi** <<sepi@joesepi.com>> (he/him) * [joshgav](https://github.com/joshgav) - **Josh Gavant** <<josh.gavant@outlook.com>> * [julianduque](https://github.com/julianduque) - @@ -587,12 +585,20 @@ For information about the governance of the Node.js project, see **Kyle Farnung** <<kfarnung@microsoft.com>> (he/him) * [kunalspathak](https://github.com/kunalspathak) - **Kunal Pathak** <<kunal.pathak@microsoft.com>> +* [kuriyosh](https://github.com/kuriyosh) - + **Yoshiki Kurihara** <<yosyos0306@gmail.com>> (he/him) +* [kvakil](https://github.com/kvakil) - + **Keyhan Vakil** <<kvakil@sylph.kvakil.me>> * [lance](https://github.com/lance) - **Lance Ball** <<lball@redhat.com>> (he/him) * [Leko](https://github.com/Leko) - **Shingo Inoue** <<leko.noor@gmail.com>> (he/him) +* [Linkgoron](https://github.com/Linkgoron) - + **Nitzan Uziely** <<linkgoron@gmail.com>> * [lucamaraschi](https://github.com/lucamaraschi) - **Luca Maraschi** <<luca.maraschi@gmail.com>> (he/him) +* [lukekarrys](https://github.com/lukekarrys) - + **Luke Karrys** <<luke@lukekarrys.com>> (he/him) * [lundibundi](https://github.com/lundibundi) - **Denys Otrishko** <<shishugi@gmail.com>> (he/him) * [lxe](https://github.com/lxe) - @@ -603,12 +609,16 @@ For information about the governance of the Node.js project, see **Mathias Buus** <<mathiasbuus@gmail.com>> (he/him) * [matthewloring](https://github.com/matthewloring) - **Matthew Loring** <<mattloring@google.com>> +* [Mesteery](https://github.com/Mesteery) - + **Mestery** <<mestery@protonmail.com>> (he/him) * [micnic](https://github.com/micnic) - **Nicu Micleușanu** <<micnic90@gmail.com>> (he/him) * [mikeal](https://github.com/mikeal) - **Mikeal Rogers** <<mikeal.rogers@gmail.com>> * [miladfarca](https://github.com/miladfarca) - **Milad Fa** <<mfarazma@redhat.com>> (he/him) +* [mildsunrise](https://github.com/mildsunrise) - + **Alba Mendez** <<me@alba.sh>> (she/her) * [misterdjules](https://github.com/misterdjules) - **Julien Gilli** <<jgilli@netflix.com>> * [mmarchini](https://github.com/mmarchini) - @@ -617,6 +627,10 @@ For information about the governance of the Node.js project, see **Christopher Monsanto** <<chris@monsan.to>> * [MoonBall](https://github.com/MoonBall) - **Chen Gang** <<gangc.cxy@foxmail.com>> +* [mscdex](https://github.com/mscdex) - + **Brian White** <<mscdex@mscdex.net>> +* [MylesBorins](https://github.com/MylesBorins) - + **Myles Borins** <<myles.borins@gmail.com>> (he/him) * [not-an-aardvark](https://github.com/not-an-aardvark) - **Teddy Katz** <<teddy.katz@gmail.com>> (he/him) * [ofrobots](https://github.com/ofrobots) - @@ -645,12 +659,12 @@ For information about the governance of the Node.js project, see **Peter Marshall** <<petermarshall@chromium.org>> (he/him) * [puzpuzpuz](https://github.com/puzpuzpuz) - **Andrey Pechkurov** <<apechkurov@gmail.com>> (he/him) -* [RaisinTen](https://github.com/RaisinTen) - - **Darshan Sen** <<raisinten@gmail.com>> (he/him) * [refack](https://github.com/refack) - **Refael Ackermann (רפאל פלחי)** <<refack@gmail.com>> (he/him/הוא/אתה) * [rexagod](https://github.com/rexagod) - **Pranshu Srivastava** <<rexagod@gmail.com>> (he/him) +* [rickyes](https://github.com/rickyes) - + **Ricky Zhou** <<0x19951125@gmail.com>> (he/him) * [rlidwka](https://github.com/rlidwka) - **Alex Kocharin** <<alex@kocharin.ru>> * [rmg](https://github.com/rmg) - @@ -667,6 +681,8 @@ For information about the governance of the Node.js project, see **Sam Ruby** <<rubys@intertwingly.net>> * [rvagg](https://github.com/rvagg) - **Rod Vagg** <<rod@vagg.org>> +* [ryzokuken](https://github.com/ryzokuken) - + **Ujjwal Sharma** <<ryzokuken@disroot.org>> (he/him) * [saghul](https://github.com/saghul) - **Saúl Ibarra Corretgé** <<s@saghul.net>> * [sam-github](https://github.com/sam-github) - @@ -677,6 +693,8 @@ For information about the governance of the Node.js project, see **Nikolai Vavilov** <<vvnicholas@gmail.com>> * [shigeki](https://github.com/shigeki) - **Shigeki Ohtsu** <<ohtsu@ohtsu.org>> (he/him) +* [shisama](https://github.com/shisama) - + **Masashi Hirano** <<shisama07@gmail.com>> (he/him) * [silverwind](https://github.com/silverwind) - **Roman Reiss** <<me@silverwind.io>> * [starkwang](https://github.com/starkwang) - @@ -689,10 +707,14 @@ For information about the governance of the Node.js project, see **Sakthipriyan Vairamani** <<thechargingvolcano@gmail.com>> (he/him) * [thlorenz](https://github.com/thlorenz) - **Thorsten Lorenz** <<thlorenz@gmx.de>> +* [TimothyGu](https://github.com/TimothyGu) - + **Tiancheng "Timothy" Gu** <<timothygu99@gmail.com>> (he/him) * [trevnorris](https://github.com/trevnorris) - **Trevor Norris** <<trev.norris@gmail.com>> * [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe** <<m.j.tunnicliffe@gmail.com>> +* [vdeturckheim](https://github.com/vdeturckheim) - + **Vladimir de Turckheim** <<vlad2t@hotmail.com>> (he/him) * [vkurchatkin](https://github.com/vkurchatkin) - **Vladimir Kurchatkin** <<vladimir.kurchatkin@gmail.com>> * [vsemozhetbyt](https://github.com/vsemozhetbyt) - @@ -701,6 +723,10 @@ For information about the governance of the Node.js project, see **Thomas Watson** <<w@tson.dk>> * [whitlockjc](https://github.com/whitlockjc) - **Jeremy Whitlock** <<jwhitlock@apache.org>> +* [XadillaX](https://github.com/XadillaX) - + **Khaidi Chu** <<i@2333.moe>> (he/him) +* [yashLadha](https://github.com/yashLadha) - + **Yash Ladha** <<yash@yashladha.in>> (he/him) * [yhwang](https://github.com/yhwang) - **Yihong Wang** <<yh.wang@ibm.com>> * [yorkie](https://github.com/yorkie) - @@ -717,34 +743,42 @@ maintaining the Node.js project. ### Triagers +* [1ilsang](https://github.com/1ilsang) - + **Sangchul Lee** <<1ilsang.dev@gmail.com>> (he/him) * [atlowChemi](https://github.com/atlowChemi) - **Chemi Atlow** <<chemi@atlow.co.il>> (he/him) * [Ayase-252](https://github.com/Ayase-252) - **Qingyu Deng** <<i@ayase-lab.com>> +* [bjohansebas](https://github.com/bjohansebas) - + **Sebastian Beltran** <<bjohansebas@gmail.com>> * [bmuenzenmeyer](https://github.com/bmuenzenmeyer) - **Brian Muenzenmeyer** <<brian.muenzenmeyer@gmail.com>> (he/him) * [CanadaHonk](https://github.com/CanadaHonk) - **Oliver Medhurst** <<honk@goose.icu>> (they/them) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <<daeyeon.dev@gmail.com>> (he/him) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <<F3n67u@outlook.com>> (he/him) -* [himadriganguly](https://github.com/himadriganguly) - - **Himadri Ganguly** <<himadri.tech@gmail.com>> (he/him) +* [gireeshpunathil](https://github.com/gireeshpunathil) - + **Gireesh Punathil** <<gpunathi@in.ibm.com>> (he/him) +* [gurgunday](https://github.com/gurgunday) - + **Gürgün Dayıoğlu** <<hey@gurgun.day>> +* [haramj](https://github.com/haramj) - + **Haram Jeong** <<haramj.dev@gmail.com>> +* [HBSPS](https://github.com/HBSPS) - + **Wiyeong Seo** <<hbsps.dev@gmail.com>> * [iam-frankqiu](https://github.com/iam-frankqiu) - **Frank Qiu** <<iam.frankqiu@gmail.com>> (he/him) +* [KevinEady](https://github.com/KevinEady) - + **Kevin Eady** <<kevin.c.eady@gmail.com>> (he/him) * [marsonya](https://github.com/marsonya) - **Akhil Marsonya** <<akhil.marsonya27@gmail.com>> (he/him) * [meixg](https://github.com/meixg) - **Xuguang Mei** <<meixuguang@gmail.com>> (he/him) -* [mertcanaltin](https://github.com/mertcanaltin) - - **Mert Can Altin** <<mertgold60@gmail.com>> -* [Mesteery](https://github.com/Mesteery) - - **Mestery** <<mestery@protonmail.com>> (he/him) +* [milesguicent](https://github.com/milesguicent) - + **Miles Guicent** <<guicent@pm.me>> (he/him) * [preveen-stack](https://github.com/preveen-stack) - **Preveen Padmanabhan** <<wide4head@gmail.com>> (he/him) -* [PoojaDurgad](https://github.com/PoojaDurgad) - - **Pooja Durgad** <<Pooja.D.P@ibm.com>> +* [RaisinTen](https://github.com/RaisinTen) - + **Darshan Sen** <<raisinten@gmail.com>> (he/him) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - **Mohammed Keyvanzadeh** <<mohammadkeyvanzade94@gmail.com>> (he/him) @@ -755,44 +789,38 @@ responding to new issues. Primary GPG keys for Node.js Releasers (some Releasers sign with subkeys): -* **Beth Griggs** <<bethanyngriggs@gmail.com>> - `4ED778F539E3634C779C87C6D7062848A1AB005C` -* **Bryan English** <<bryan@bryanenglish.com>> - `141F07595B7B3FFE74309A937405533BE57C7D57` -* **Danielle Adams** <<adamzdanielle@gmail.com>> - `74F12602B6F1C4E913FAA37AD3A89613643B6201` +* **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> + `5BE8A3F6C8A5C01D106C0AD820B1A390B168D356` * **Juan José Arboleda** <<soyjuanarbol@gmail.com>> `DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7` * **Marco Ippolito** <<marcoippolito54@gmail.com>> `CC68F5A3106FF448322E48ED27F5E38D5B0A215F` * **Michaël Zasso** <<targos@protonmail.com>> `8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600` -* **Myles Borins** <<myles.borins@gmail.com>> - `C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8` -* **RafaelGSS** <<rafael.nunu@hotmail.com>> +* **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> `890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4` -* **Richard Lau** <<rlau@redhat.com>> +* **Richard Lau** <<richard.lau@ibm.com>> `C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C` * **Ruy Adorno** <<ruyadorno@hotmail.com>> `108F52B48DB57BB0CC439B2997B01419BD92F80A` * **Ulises Gascón** <<ulisesgascongonzalez@gmail.com>> `A363A499291CBBC940DD62E41F10027AF002F8B0` -To import the full set of trusted release keys (including subkeys possibly used -to sign releases): +You can use the keyring the project maintains at +<https://github.com/nodejs/release-keys/raw/refs/heads/main/gpg-only-active-keys/pubring.kbx>. +Alternatively, you can import them from a public key server. Have in mind that +the project cannot guarantee the availability of the server nor the keys on +that server. ```bash -gpg --keyserver hkps://keys.openpgp.org --recv-keys 4ED778F539E3634C779C87C6D7062848A1AB005C -gpg --keyserver hkps://keys.openpgp.org --recv-keys 141F07595B7B3FFE74309A937405533BE57C7D57 -gpg --keyserver hkps://keys.openpgp.org --recv-keys 74F12602B6F1C4E913FAA37AD3A89613643B6201 -gpg --keyserver hkps://keys.openpgp.org --recv-keys DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 -gpg --keyserver hkps://keys.openpgp.org --recv-keys CC68F5A3106FF448322E48ED27F5E38D5B0A215F -gpg --keyserver hkps://keys.openpgp.org --recv-keys 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 -gpg --keyserver hkps://keys.openpgp.org --recv-keys C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 -gpg --keyserver hkps://keys.openpgp.org --recv-keys 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 -gpg --keyserver hkps://keys.openpgp.org --recv-keys C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C -gpg --keyserver hkps://keys.openpgp.org --recv-keys 108F52B48DB57BB0CC439B2997B01419BD92F80A -gpg --keyserver hkps://keys.openpgp.org --recv-keys A363A499291CBBC940DD62E41F10027AF002F8B0 +gpg --keyserver hkps://keys.openpgp.org --recv-keys 5BE8A3F6C8A5C01D106C0AD820B1A390B168D356 # Antoine du Hamel +gpg --keyserver hkps://keys.openpgp.org --recv-keys DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 # Juan José Arboleda +gpg --keyserver hkps://keys.openpgp.org --recv-keys CC68F5A3106FF448322E48ED27F5E38D5B0A215F # Marco Ippolito +gpg --keyserver hkps://keys.openpgp.org --recv-keys 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 # Michaël Zasso +gpg --keyserver hkps://keys.openpgp.org --recv-keys 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 # Rafael Gonzaga +gpg --keyserver hkps://keys.openpgp.org --recv-keys C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C # Richard Lau +gpg --keyserver hkps://keys.openpgp.org --recv-keys 108F52B48DB57BB0CC439B2997B01419BD92F80A # Ruy Adorno +gpg --keyserver hkps://keys.openpgp.org --recv-keys A363A499291CBBC940DD62E41F10027AF002F8B0 # Ulises Gascón ``` See [Verifying binaries](#verifying-binaries) for how to use these keys to @@ -802,12 +830,19 @@ verify a downloaded file. <summary>Other keys used to sign some previous releases</summary> +* **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> + `C0D6248439F1D5604AAFFB4021D900FFDB233756` +* **Beth Griggs** <<bethanyngriggs@gmail.com>> + `4ED778F539E3634C779C87C6D7062848A1AB005C` +* **Bryan English** <<bryan@bryanenglish.com>> + `141F07595B7B3FFE74309A937405533BE57C7D57` * **Chris Dickinson** <<christopher.s.dickinson@gmail.com>> `9554F04D7259F04124DE6B476D5A82AC7E37093B` * **Colin Ihrig** <<cjihrig@gmail.com>> `94AE36675C464D64BAFA68DD7434390BDBE9B9C5` * **Danielle Adams** <<adamzdanielle@gmail.com>> `1C050899334244A8AF75E53792EF661D867B9DFA` + `74F12602B6F1C4E913FAA37AD3A89613643B6201` * **Evan Lucas** <<evanlucas@me.com>> `B9AE9905FFD7803F25714661B63B535A4C206CA9` * **Gibson Fahnestock** <<gibfahn@gmail.com>> @@ -824,6 +859,8 @@ verify a downloaded file. `61FC681DFB92A079F1685E77973F295594EC4689` * **Julien Gilli** <<jgilli@fastmail.fm>> `114F43EE0176B71C7BC219DD50A3051F888C628D` +* **Myles Borins** <<myles.borins@gmail.com>> + `C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8` * **Rod Vagg** <<rod@vagg.org>> `DD8F2338BAE7501E3DD5AC78C273792F7D83545D` * **Ruben Bridgewater** <<ruben@bridgewater.de>> @@ -833,6 +870,9 @@ verify a downloaded file. * **Timothy J Fontaine** <<tjfontaine@gmail.com>> `7937DFD2AB06298B2293C3187D33FF9D0246406D` +The project maintains a keyring able to verify all past releases of Node.js at +<https://github.com/nodejs/release-keys/raw/refs/heads/main/gpg/pubring.kbx>. + </details> ### Security release stewards @@ -845,30 +885,36 @@ prioritize security releases. Security release stewards manage security releases on a rotation basis as outlined in the [security release process](./doc/contributing/security-release-process.md). -* Datadog +* [Datadog](https://www.datadoghq.com/) * [bengl](https://github.com/bengl) - **Bryan English** <<bryan@bryanenglish.com>> (he/him) -* NodeSource +* [HeroDevs](https://www.herodevs.com/) + * [marco-ippolito](https://github.com/marco-ippolito) - OpenJSF handle: `Marco Ippolito` + **Marco Ippolito** <<marcoippolito54@gmail.com>> (he/him) +* [NodeSource](https://nodesource.com/) * [juanarbol](https://github.com/juanarbol) - **Juan José Arboleda** <<soyjuanarbol@gmail.com>> (he/him) - * [RafaelGSS](https://github.com/RafaelGSS) - + * [RafaelGSS](https://github.com/RafaelGSS) - OpenJSF handle: `RafaelGSS` **Rafael Gonzaga** <<rafael.nunu@hotmail.com>> (he/him) -* Platformatic - * [mcollina](https://github.com/mcollina) - +* [Platformatic](https://platformatic.dev/) + * [mcollina](https://github.com/mcollina) - OpenJSF handle: `mcollina` **Matteo Collina** <<matteo.collina@gmail.com>> (he/him) -* Red Hat and IBM - * [joesepi](https://github.com/joesepi) - - **Joe Sepi** <<joesepi@ibm.com>> (he/him) - * [mhdawson](https://github.com/mhdawson) - - **Michael Dawson** <<midawson@redhat.com>> (he/him) +* [Red Hat](https://redhat.com) / [IBM](https://ibm.com) + * [BethGriggs](https://github.com/BethGriggs) - + **Beth Griggs** <<bethanyngriggs@gmail.com>> (she/her) + * [sxa](https://github.com/sxa) - + **Stewart X Addison** <<sxa@redhat.com>> (he/him) ## License -Node.js is available under the -[MIT license](https://opensource.org/licenses/MIT). Node.js also includes -external libraries that are available under a variety of licenses. See -[LICENSE](https://github.com/nodejs/node/blob/HEAD/LICENSE) for the full -license text. +Node.js is licensed under the [MIT License](https://opensource.org/licenses/MIT). + +This project also depends on external libraries that may use different open-source +licenses. For a complete list of included licenses, please see the +[LICENSE](https://github.com/nodejs/node/blob/main/LICENSE) file. + +If you are contributing documentation or source changes, please ensure your +additions comply with the project’s license guidelines. [Code of Conduct]: https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md [Contributing to the project]: CONTRIBUTING.md diff --git a/SECURITY.md b/SECURITY.md index 7d62c76e5b898c..34d8633cf1f27d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ Report security bugs in Node.js via [HackerOne](https://hackerone.com/nodejs). -Normally your report will be acknowledged within 5 days, and you'll receive +Normally, your report will be acknowledged within 5 days, and you'll receive a more detailed response to your report within 10 days indicating the next steps in handling your submission. These timelines may extend when our triage volunteers are away on holiday, particularly at the end of the @@ -15,15 +15,22 @@ you informed of the progress being made towards a fix and full announcement, and may ask for additional information or guidance surrounding the reported issue. +If you do not receive an acknowledgement of your report within 6 business +days, or if you cannot find a private security contact for the project, you +may escalate to the OpenJS Foundation CNA at `security@lists.openjsf.org`. + +If the project acknowledges your report but does not provide any further +response or engagement within 14 days, escalation is also appropriate. + ### Node.js bug bounty program The Node.js project engages in an official bug bounty program for security researchers and responsible public disclosures. The program is managed through the HackerOne platform. See <https://hackerone.com/nodejs> for further details. -## Reporting a bug in a third party module +## Reporting a bug in a third-party module -Security bugs in third party modules should be reported to their respective +Security bugs in third-party modules should be reported to their respective maintainers. ## Disclosure policy @@ -41,20 +48,54 @@ Here is the security disclosure policy for Node.js * A suggested embargo date for this vulnerability is chosen and a CVE (Common Vulnerabilities and Exposures (CVE®)) is requested for the vulnerability. -* On the embargo date, the Node.js security mailing list is sent a copy of the - announcement. The changes are pushed to the public repository and new builds - are deployed to nodejs.org. Within 6 hours of the mailing list being +* On the embargo date, a copy of the announcement is sent to the Node.js + security mailing list. The changes are pushed to the public repository and new + builds are deployed to nodejs.org. Within 6 hours of the mailing list being notified, a copy of the advisory will be published on the Node.js blog. -* Typically the embargo date will be set 72 hours from the time the CVE is +* Typically, the embargo date will be set 72 hours from the time the CVE is issued. However, this may vary depending on the severity of the bug or difficulty in applying a fix. -* This process can take some time, especially when coordination is required - with maintainers of other projects. Every effort will be made to handle the - bug in as timely a manner as possible; however, it's important that we follow - the release process above to ensure that the disclosure is handled in a - consistent manner. +* This process can take some time, especially when we need to coordinate with + maintainers of other projects. We will try to handle the bug as quickly as + possible; however, we must follow the release process above to ensure that we + handle disclosure consistently. + +## Code of Conduct and Vulnerability Reporting Guidelines + +When reporting security vulnerabilities, reporters must adhere to the following guidelines: + +1. **Code of Conduct Compliance**: All security reports must comply with our + [Code of Conduct](CODE_OF_CONDUCT.md). Reports that violate our code of conduct + will not be considered and may result in being banned from future participation. + +2. **No Harmful Actions**: Security research and vulnerability reporting must not: + * Cause damage to running systems or production environments. + * Disrupt Node.js development or infrastructure. + * Affect other users' applications or systems. + * Include actual exploits that could harm users. + * Involve social engineering or phishing attempts. + +3. **Responsible Testing**: When testing potential vulnerabilities: + * Use isolated, controlled environments. + * Do not test on production systems without prior authorization. Contact + the Node.js Technical Steering Committee (<tsc@iojs.org>) for permission or open + a HackerOne report. + * Do not attempt to access or modify other users' data. + * Immediately stop testing if unauthorized access is gained accidentally. + +4. **Report Quality** + * Provide clear, detailed steps to reproduce the vulnerability. + * Include only the minimum proof of concept required to demonstrate the issue. + * Remove any malicious payloads or components that could cause harm. + +Failure to follow these guidelines may result in: + +* Rejection of the vulnerability report. +* Forfeiture of any potential bug bounty. +* Temporary or permanent ban from the bug bounty program. +* Legal action in cases of malicious intent. ## The Node.js threat model @@ -68,6 +109,42 @@ vulnerability in the context of the Node.js threat model. In other words, it cannot assume that a trusted element (such as the operating system) has been compromised. +### Experimental platforms + +Node.js maintains a tier-based support system for operating systems and +hardware combinations (Tier 1, Tier 2, and Experimental). For platforms +classified as "Experimental" in the [supported platforms](BUILDING.md#supported-platforms) +documentation: + +* Security vulnerabilities that only affect experimental platforms will **not** be accepted as valid security issues. +* Any issues on experimental platforms will be treated as normal bugs. +* No CVEs will be issued for issues that only affect experimental platforms +* Bug bounty rewards are not available for experimental platform-specific issues + +This policy recognizes that experimental platforms may not compile, may not +pass the test suite, and do not have the same level of testing and support +infrastructure as Tier 1 and Tier 2 platforms. + +### Experimental features behind compile-time flags + +Node.js includes certain experimental features that are only available when +Node.js is compiled with specific flags. These features are intended for +development, debugging, or testing purposes and are not enabled in official +releases. + +* Security vulnerabilities that only affect features behind compile-time flags + will **not** be accepted as valid security issues. +* Any issues with these features will be treated as normal bugs. +* No CVEs will be issued for issues that only affect compile-time flag features. +* Bug bounty rewards are not available for compile-time flag feature issues. + +This policy recognizes that experimental features behind compile-time flags +are not ready for public consumption and may have incomplete implementations, +missing security hardening, or other limitations that make them unsuitable +for production use. + +### What constitutes a vulnerability + Being able to cause the following through control of the elements that Node.js does not trust is considered a vulnerability: @@ -75,6 +152,22 @@ does not trust is considered a vulnerability: the correct use of Node.js APIs. * The unavailability of the runtime, including the unbounded degradation of its performance. +* Memory leaks qualify as vulnerabilities when all of the following criteria are met: + * The API is being correctly used. + * The API doesn't have a warning against its usage in a production environment. + * The API is public and documented. + * The API is on stable (2.0) status. + * The memory leak is significant enough to cause a denial of service quickly + or in a context not controlled by the user (for example, HTTP parsing). + * The memory leak is directly exploitable by an untrusted source without requiring application mistakes. + * The leak cannot be reasonably mitigated through standard operational practices (like process recycling). + * The leak occurs deterministically under normal usage patterns rather than edge cases. + * The leak occurs at a rate that would cause practical resource exhaustion within a practical timeframe under + typical workloads. + * The attack demonstrates [asymmetric resource consumption](https://cwe.mitre.org/data/definitions/405.html), + where the attacker expends significantly fewer resources than what's required by the server to process the + attack. Attacks requiring comparable resources on the attacker's side (which can be mitigated through common + practices like rate limiting) may not qualify. If Node.js loads configuration files or runs code by default (without a specific request from the user), and this is not documented, it is considered a @@ -83,23 +176,23 @@ Vulnerabilities related to this case may be fixed by a documentation update. **Node.js does NOT trust**: -1. Data received from the remote end of inbound network connections - that are accepted through the use of Node.js APIs and - which is transformed/validated by Node.js before being passed - to the application. This includes: - * HTTP APIs (all flavors) server APIs. -2. The data received from the remote end of outbound network connections - that are created through the use of Node.js APIs and - which is transformed/validated by Node.js before being passed - to the application EXCEPT in respect to payload length. Node.js trusts - that applications make connections/requests which will avoid payload - sizes that will result in a Denial of Service. - * HTTP APIs (all flavors) client APIs. - * DNS APIs. -3. Consumers of data protected through the use of Node.js APIs (for example - people who have access to data encrypted through the Node.js crypto APIs). -4. The file content or other I/O that is opened for reading or writing by the - use of Node.js APIs (ex: stdin, stdout, stderr). +* Data received from the remote end of inbound network connections + that are accepted through the use of Node.js APIs and + which is transformed/validated by Node.js before being passed + to the application. This includes: + * HTTP APIs (all flavors) server APIs. +* The data received from the remote end of outbound network connections + that are created through the use of Node.js APIs and + which is transformed/validated by Node.js before being passed + to the application **except** with respect to payload length. Node.js trusts + that applications make connections/requests which will avoid payload + sizes that will result in a Denial of Service. + * HTTP APIs (all flavors) client APIs. + * DNS APIs. +* Consumers of data protected through the use of Node.js APIs (for example, + people who have access to data encrypted through the Node.js crypto APIs). +* The file content or other I/O that is opened for reading or writing by the + use of Node.js APIs (ex: stdin, stdout, stderr). In other words, if the data passing through Node.js to/from the application can trigger actions other than those documented for the APIs, there is likely @@ -107,25 +200,33 @@ a security vulnerability. Examples of unwanted actions are polluting globals, causing an unrecoverable crash, or any other unexpected side effects that can lead to a loss of confidentiality, integrity, or availability. -**Node.js trusts everything else**. As some examples this includes: - -1. The developers and infrastructure that runs it. -2. The operating system that Node.js is running under and its configuration, - along with anything under control of the operating system. -3. The code it is asked to run including JavaScript and native code, even if - said code is dynamically loaded, e.g. all dependencies installed from the - npm registry. - The code run inherits all the privileges of the execution user. -4. Inputs provided to it by the code it is asked to run, as it is the - responsibility of the application to perform the required input validations, - e.g. the input to `JSON.parse()`. -5. Any connection used for inspector (debugger protocol) regardless of being - opened by command line options or Node.js APIs, and regardless of the remote - end being on the local machine or remote. -6. The file system when requiring a module. - See <https://nodejs.org/api/modules.html#all-together>. -7. The `node:wasi` module does not currently provide the comprehensive file - system security properties provided by some WASI runtimes. +For example, if trusted input (like secure application code) is correct, +then untrusted input must not lead to arbitrary JavaScript code execution. + +**Node.js trusts everything else**. Examples include: + +* The developers and infrastructure that run it. +* The operating system that Node.js is running under and its configuration, + along with anything under the control of the operating system. +* The code it is asked to run, including JavaScript, WASM and native code, even + if said code is dynamically loaded, e.g., all dependencies installed from the + npm registry. + The code run inherits all the privileges of the execution user. +* Inputs provided to it by the code it is asked to run, as it is the + responsibility of the application to perform the required input validations, + e.g. the input to `JSON.parse()`. +* Any connection used for inspector (debugger protocol) regardless of being + opened by command line options or Node.js APIs, and regardless of the remote + end being on the local machine or remote. +* The file system when requiring a module. + See <https://nodejs.org/api/modules.html#all-together>. +* The `node:wasi` module does not currently provide the comprehensive file + system security properties provided by some WASI runtimes. +* The execution path is trusted. Additionally, Node.js path manipulation functions + such as `path.join()` and `path.normalize()` trust their input. Reports about issues + related to these functions that rely on unsanitized input are not considered vulnerabilities + requiring CVEs, as it's the user's responsibility to sanitize path inputs according to + their security requirements. Any unexpected behavior from the data manipulation from Node.js Internal functions may be considered a vulnerability if they are exploitable via @@ -135,7 +236,7 @@ In addition to addressing vulnerabilities based on the above, the project works to avoid APIs and internal implementations that make it "easy" for application code to use the APIs incorrectly in a way that results in vulnerabilities within the application code itself. While we don’t consider those vulnerabilities in -Node.js itself and will not necessarily issue a CVE we do want them to be +Node.js itself and will not necessarily issue a CVE, we do want them to be reported privately to Node.js first. We often choose to work to improve our APIs based on those reports and issue fixes either in regular or security releases depending on how much of a risk to @@ -147,12 +248,12 @@ the community they pose. * Node.js provides APIs to validate handling of Subject Alternative Names (SANs) in certificates used to connect to a TLS/SSL endpoint. If certificates can be - crafted which result in incorrect validation by the Node.js APIs that is + crafted that result in incorrect validation by the Node.js APIs that is considered a vulnerability. #### Inconsistent Interpretation of HTTP Requests (CWE-444) -* Node.js provides APIs to accept http connections. Those APIs parse the +* Node.js provides APIs to accept HTTP connections. Those APIs parse the headers received for a connection and pass them on to the application. Bugs in parsing those headers which can result in request smuggling are considered vulnerabilities. @@ -165,21 +266,21 @@ the community they pose. #### External Control of System or Configuration Setting (CWE-15) -* If Node.js automatically loads a configuration file which is not documented +* If Node.js automatically loads a configuration file that is not documented and modification of that configuration can affect the confidentiality of - data protected using the Node.js APIs this is considered a vulnerability. + data protected using the Node.js APIs, then this is considered a vulnerability. ### Examples of non-vulnerabilities #### Malicious Third-Party Modules (CWE-1357) -* Code is trusted by Node.js, therefore any scenario that requires a malicious +* Code is trusted by Node.js. Therefore any scenario that requires a malicious third-party module cannot result in a vulnerability in Node.js. #### Prototype Pollution Attacks (CWE-1321) * Node.js trusts the inputs provided to it by application code. - It is up to the application to sanitize appropriately, therefore any scenario + It is up to the application to sanitize appropriately. Therefore any scenario that requires control over user input is not considered a vulnerability. #### Uncontrolled Search Path Element (CWE-427) @@ -190,7 +291,7 @@ the community they pose. #### External Control of System or Configuration Setting (CWE-15) -* If Node.js automatically loads a configuration file which is documented +* If Node.js automatically loads a configuration file that is documented, no scenario that requires modification of that configuration file is considered a vulnerability. @@ -205,24 +306,167 @@ the community they pose. * Corepack defaults to downloading the latest version of the software requested by the user, or a specific version requested by the user. For this reason, - Node.js releases won't be affected by such vulnerabilities, users are - responsible to keep the software they use through Corepack up-to-date. + Node.js releases won't be affected by such vulnerabilities. Users are + responsible for keeping the software they use through Corepack up-to-date. + +#### Exposing Application-Level APIs to Untrusted Users (CWE-653) + +* Node.js trusts the application code that uses its APIs. When application code + exposes Node.js functionality to untrusted users in an unsafe manner, any + resulting crashes, data corruption, or other issues are not considered + vulnerabilities in Node.js itself. It is the application's responsibility to: + * Validate and sanitize all untrusted input before passing it to Node.js APIs. + * Design appropriate access controls and security boundaries. + * Avoid exposing low-level or dangerous APIs directly to untrusted users. + +* Examples of scenarios that are **not** Node.js vulnerabilities: + * Allowing untrusted users to register SQLite user-defined functions that can + perform arbitrary operations (e.g., closing database connections during query + execution, causing crashes or use-after-free conditions). + * Exposing `child_process.exec()` or similar APIs to untrusted users without + proper input validation, allowing command injection. + * Allowing untrusted users to control file paths passed to file system APIs + without validation, leading to path traversal issues. + * Permitting untrusted users to define custom code that executes with the + application's privileges (e.g., custom transforms, plugins, or callbacks). + +* These scenarios represent application-level security issues, not Node.js + vulnerabilities. The root cause is the application's failure to establish + proper security boundaries between trusted application logic and untrusted + user input. ## Assessing experimental features reports -Experimental features are eligible to reports as any other stable feature of -Node.js. They will also be susceptible to receiving the same severity score -as any other stable feature. +Experimental features are eligible for security reports just like any other +stable feature of Node.js. They may also receive the same severity score that a +stable feature would. ## Receiving security updates Security notifications will be distributed via the following methods. * <https://groups.google.com/group/nodejs-sec> -* <https://nodejs.org/en/blog/> +* <https://nodejs.org/en/blog/vulnerability> + +### CVE publication timeline + +When security releases are published, there is a built-in delay before the +corresponding CVEs are publicly disclosed. This delay occurs because: + +1. After the security release, we request the vulnerability reporter to disclose + the details on HackerOne. +2. If the reporter does not disclose within one day, we proceed with forced + disclosure to publish the CVEs. +3. The disclosure then goes through HackerOne's approval process before the CVEs + become publicly available. + +As a result, CVEs may not be immediately available when security releases are +published, but will typically be disclosed within a few days of the release. ## Comments on this policy -If you have suggestions on how this process could be improved please submit a -[pull request](https://github.com/nodejs/nodejs.org) or -[file an issue](https://github.com/nodejs/security-wg/issues/new) to discuss. +If you have suggestions on how this process could be improved, please visit +the [nodejs/security-wg](https://github.com/nodejs/security-wg) +repository. + +## Incident Response Plan + +In the event of a security incident, please refer to the +[Security Incident Response Plan](https://github.com/nodejs/security-wg/blob/main/INCIDENT_RESPONSE_PLAN.md). + +## Node.js Security Team + +Node.js security team members are expected to keep all information that they +have privileged access to by being on the team completely private to the team. +This includes agreeing to not notify anyone outside the team of issues that have +not yet been disclosed publicly, including the existence of issues, expectations +of upcoming releases, and patching of any issues other than in the process of +their work as a member of the security team. + +### Node.js Security Team Membership Policy + +The Node.js Security Team has access to security-sensitive issues and patches +that aren't appropriate for public availability. + +The policy for inclusion is as follows: + +1. All members of @nodejs/TSC have access to private security reports and + private patches. +2. Members of the @nodejs/releasers team + have access to private security patches in order to produce releases. +3. On a case-by-case basis, individuals outside the Technical Steering + Committee are invited by the TSC to have access to private security reports + or private patches so that their expertise can be applied to an issue or + patch. This access may be temporary or permanent, as decided by the TSC. + +Membership on the security teams can be requested via an issue in the TSC repo. + +## Team responsible for Triaging security reports + +The responsibility of Triage is to determine whether Node.js must take any +action to mitigate the issue, and if so, to ensure that the action is taken. + +Mitigation may take many forms, for example, a Node.js security release that +includes a fix, documentation, an informational CVE or blog post. + +* [@mcollina](https://github.com/mcollina) - Matteo Collina +* [@RafaelGSS](https://github.com/RafaelGSS) - Rafael Gonzaga +* [@vdeturckheim](https://github.com/vdeturckheim) - Vladimir de Turckheim +* [@BethGriggs](https://github.com/BethGriggs) - Beth Griggs + +## Team with access to private security reports against Node.js + +[TSC voting members](https://github.com/nodejs/node#tsc-voting-members) +have access. + +In addition, these individuals have access: + +* [BethGriggs](https://github.com/BethGriggs) - **Beth Griggs** +* [MylesBorins](https://github.com/MylesBorins) - **Myles Borins** +* [bengl](https://github.com/bengl)- **Bryan English** +* [bnoordhuis](https://github.com/bnoordhuis) **Ben Noordhuis** +* [cjihrig](https://github.com/cjihrig) **Colin Ihrig** +* [joesepi](https://github.com/joesepi) - **Joe Sepi** +* [juanarbol](https://github.com/juanarbol) **Juan Jose Arboleda** +* [ulisesgascon](https://github.com/ulisesgascon) **Ulises Gascón** +* [vdeturckheim](https://github.com/vdeturckheim) - **Vladimir de Turckheim** + +The list is from the [member page](https://hackerone.com/organizations/nodejs/settings/users) for +the Node.js program on HackerOne. + +## Team with access to private security patches to Node.js + +<!-- ncu-team-sync.team(nodejs-private/security) --> + +* [@aduh95](https://github.com/aduh95) - Antoine du Hamel +* [@anonrig](https://github.com/anonrig) - Yagiz Nizipli +* [@bengl](https://github.com/bengl) - Bryan English +* [@benjamingr](https://github.com/benjamingr) - Benjamin Gruenbaum +* [@bmeck](https://github.com/bmeck) - Bradley Farias +* [@bnoordhuis](https://github.com/bnoordhuis) - Ben Noordhuis +* [@BridgeAR](https://github.com/BridgeAR) - Ruben Bridgewater +* [@gireeshpunathil](https://github.com/gireeshpunathil) - Gireesh Punathil +* [@guybedford](https://github.com/guybedford) - Guy Bedford +* [@indutny](https://github.com/indutny) - Fedor Indutny +* [@jasnell](https://github.com/jasnell) - James M Snell +* [@joaocgreis](https://github.com/joaocgreis) - João Reis +* [@joesepi](https://github.com/joesepi) - Joe Sepi +* [@joyeecheung](https://github.com/joyeecheung) - Joyee Cheung +* [@juanarbol](https://github.com/juanarbol) - Juan José +* [@legendecas](https://github.com/legendecas) - Chengzhong Wu +* [@marco-ippolito](https://github.com/marco-ippolito) - Marco Ippolito +* [@mcollina](https://github.com/mcollina) - Matteo Collina +* [@MoLow](https://github.com/MoLow) - Moshe Atlow +* [@panva](https://github.com/panva) - Filip Skokan +* [@RafaelGSS](https://github.com/RafaelGSS) - Rafael Gonzaga +* [@richardlau](https://github.com/richardlau) - Richard Lau +* [@ronag](https://github.com/ronag) - Robert Nagy +* [@ruyadorno](https://github.com/ruyadorno) - Ruy Adorno +* [@santigimeno](https://github.com/santigimeno) - Santiago Gimeno +* [@ShogunPanda](https://github.com/ShogunPanda) - Paolo Insogna +* [@targos](https://github.com/targos) - Michaël Zasso +* [@tniessen](https://github.com/tniessen) - Tobias Nießen +* [@UlisesGascon](https://github.com/UlisesGascon) - Ulises Gascón +* [@vdeturckheim](https://github.com/vdeturckheim) - Vladimir de Turckheim + +<!-- ncu-team-sync end --> diff --git a/android-configure b/android-configure index 2731e48d708a4a..27f39b9917cc55 100755 --- a/android-configure +++ b/android-configure @@ -4,12 +4,13 @@ # Note that the mix of single and double quotes is intentional, # as is the fact that the ] goes on a new line. _=[ 'exec' '/bin/sh' '-c' ''' +command -v python3.14 >/dev/null && exec python3.14 "$0" "$@" +command -v python3.13 >/dev/null && exec python3.13 "$0" "$@" +command -v python3.12 >/dev/null && exec python3.12 "$0" "$@" command -v python3.11 >/dev/null && exec python3.11 "$0" "$@" command -v python3.10 >/dev/null && exec python3.10 "$0" "$@" command -v python3.9 >/dev/null && exec python3.9 "$0" "$@" command -v python3.8 >/dev/null && exec python3.8 "$0" "$@" -command -v python3.7 >/dev/null && exec python3.7 "$0" "$@" -command -v python3.6 >/dev/null && exec python3.6 "$0" "$@" command -v python3 >/dev/null && exec python3 "$0" "$@" exec python "$0" "$@" ''' "$0" "$@" @@ -23,7 +24,7 @@ except ImportError: from distutils.spawn import find_executable as which print('Node.js android configure: Found Python {}.{}.{}...'.format(*sys.version_info)) -acceptable_pythons = ((3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) +acceptable_pythons = ((3, 14), (3, 13), (3, 12), (3, 11), (3, 10), (3, 9), (3, 8)) if sys.version_info[:2] in acceptable_pythons: import android_configure else: diff --git a/android-patches/trap-handler.h.patch b/android-patches/trap-handler.h.patch index f4f151f65261f1..6974259ffb8d7e 100644 --- a/android-patches/trap-handler.h.patch +++ b/android-patches/trap-handler.h.patch @@ -1,26 +1,47 @@ ---- trap-handler.h 2022-08-11 09:01:23.384000000 +0800 -+++ fixed-trap-handler.h 2022-08-11 09:09:15.352000000 +0800 -@@ -17,23 +17,7 @@ - namespace internal { - namespace trap_handler { - +--- trap-handler.h ++++ fixed-trap-handler.h +@@ -18,43 +18,1 @@ -// X64 on Linux, Windows, MacOS, FreeBSD. -#if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \ - ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN || \ - V8_OS_FREEBSD) -#define V8_TRAP_HANDLER_SUPPORTED true --// Arm64 (non-simulator) on Mac. --#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && V8_OS_DARWIN +-// Arm64 native on Linux, Windows, MacOS. +-#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && \ +- ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN) -#define V8_TRAP_HANDLER_SUPPORTED true +-// For Linux and Mac, enable the simulator when it's been requested. +-#if USE_SIMULATOR && ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_DARWIN) +-#define V8_TRAP_HANDLER_VIA_SIMULATOR +-#endif -// Arm64 simulator on x64 on Linux, Mac, or Windows. +-// +-// The simulator case uses some inline assembly code, which cannot be +-// compiled with MSVC, so don't enable the trap handler in that case. +-// (MSVC #defines _MSC_VER, but so does Clang when targeting Windows, hence +-// the check for __clang__.) -#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_X64 && \ -- (V8_OS_LINUX || V8_OS_DARWIN) +- (V8_OS_LINUX || V8_OS_DARWIN || V8_OS_WIN) && \ +- (!defined(_MSC_VER) || defined(__clang__)) +-#define V8_TRAP_HANDLER_VIA_SIMULATOR +-#define V8_TRAP_HANDLER_SUPPORTED true +-// Loong64 (non-simulator) on Linux. +-#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_LOONG64 && V8_OS_LINUX +-#define V8_TRAP_HANDLER_SUPPORTED true +-// Loong64 simulator on x64 on Linux +-#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_X64 && V8_OS_LINUX +-#define V8_TRAP_HANDLER_VIA_SIMULATOR +-#define V8_TRAP_HANDLER_SUPPORTED true +-// RISCV64 (non-simulator) on Linux. +-#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_RISCV64 && V8_OS_LINUX && \ +- !V8_OS_ANDROID +-#define V8_TRAP_HANDLER_SUPPORTED true +-// RISCV64 simulator on x64 on Linux +-#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_X64 && V8_OS_LINUX -#define V8_TRAP_HANDLER_VIA_SIMULATOR -#define V8_TRAP_HANDLER_SUPPORTED true -// Everything else is unsupported. -#else - #define V8_TRAP_HANDLER_SUPPORTED false +-#define V8_TRAP_HANDLER_SUPPORTED false -#endif - - // Setup for shared library export. - #if defined(BUILDING_V8_SHARED) && defined(V8_OS_WIN) \ No newline at end of file ++#define V8_TRAP_HANDLER_SUPPORTED false diff --git a/android_configure.py b/android_configure.py index a82bb56bc5f5b6..5cea0393f48a76 100644 --- a/android_configure.py +++ b/android_configure.py @@ -10,8 +10,8 @@ def patch_android(): os.system('patch -f ./deps/v8/src/trap-handler/trap-handler.h < ./android-patches/trap-handler.h.patch') print("\033[92mInfo: \033[0m" + "Tried to patch.") -if platform.system() == "Windows": - print("android-configure is not supported on Windows yet.") +if platform.system() != "Linux" and platform.system() != "Darwin": + print("android-configure is currently only supported on Linux and Darwin.") sys.exit(1) if len(sys.argv) == 2 and sys.argv[1] == "patch": diff --git a/benchmark/.eslintrc.yaml b/benchmark/.eslintrc.yaml deleted file mode 100644 index aa014eec4e3627..00000000000000 --- a/benchmark/.eslintrc.yaml +++ /dev/null @@ -1,8 +0,0 @@ -## Benchmark-specific linter rules - -env: - node: true - es6: true - -rules: - prefer-arrow-callback: error diff --git a/benchmark/README.md b/benchmark/README.md index 96bd0318465f45..2f52a44f251af7 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -40,6 +40,7 @@ directories. * `_cli.R`: parses the command line arguments passed to `compare.R` * `_http-benchmarkers.js`: selects and runs external tools for benchmarking the `http` subsystem. +* `bar.R`: R script for visualizing the output of benchmarks with bar plots. * `common.js`: see [Common API](#common-api). * `compare.js`: command line tool for comparing performance between different Node.js binaries. diff --git a/benchmark/_cli.js b/benchmark/_cli.js index 33ba2e0963f2fe..990e37b67ce1ab 100644 --- a/benchmark/_cli.js +++ b/benchmark/_cli.js @@ -33,6 +33,7 @@ function CLI(usage, settings) { let mode = 'both'; // Possible states are: [both, option, item] for (const arg of process.argv.slice(2)) { + if (arg === '--help') this.abort(usage); if (arg === '--') { // Only items can follow -- mode = 'item'; @@ -139,8 +140,8 @@ CLI.prototype.getCpuCoreSetting = function() { const isValid = /^(\d+(-\d+)?)(,\d+(-\d+)?)*$/.test(value); if (!isValid) { throw new Error(` - Invalid CPUSET format: "${value}". Please use a single core number (e.g., "0"), - a range of cores (e.g., "0-3"), or a list of cores/ranges + Invalid CPUSET format: "${value}". Please use a single core number (e.g., "0"), + a range of cores (e.g., "0-3"), or a list of cores/ranges (e.g., "0,2,4" or "0-2,4").\n\n${this.usage} `); } diff --git a/benchmark/_http-benchmarkers.js b/benchmark/_http-benchmarkers.js index 4eba83eccb58f0..b9ef93c149f765 100644 --- a/benchmark/_http-benchmarkers.js +++ b/benchmark/_http-benchmarkers.js @@ -110,7 +110,7 @@ class TestDoubleBenchmarker { } create(options) { - process.env.duration = process.env.duration || options.duration || 5; + process.env.duration ||= options.duration || 5; const scheme = options.scheme || 'http'; const env = { diff --git a/benchmark/assert/assertion-error.js b/benchmark/assert/assertion-error.js new file mode 100644 index 00000000000000..51fb52ae1a4286 --- /dev/null +++ b/benchmark/assert/assertion-error.js @@ -0,0 +1,37 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [200], + size: [2, 75], +}); + +const baseObject = { + a: 1, + b: { + c: 2, + d: [3, 4, 5], + e: 'fghi', + j: { + k: 6, + }, + }, +}; + +function createObjects(size) { + return Array.from({ length: size }, () => baseObject); +} + +function main({ n, size }) { + bench.start(); + for (let i = 0; i < n; ++i) { + new assert.AssertionError({ + actual: {}, + expected: createObjects(size), + operator: 'partialDeepStrictEqual', + stackStartFunction: () => {}, + }); + } + bench.end(n); +} diff --git a/benchmark/assert/deepequal-buffer.js b/benchmark/assert/deepequal-buffer.js index 1b6aa3bee1d6ac..50bcd3047b146a 100644 --- a/benchmark/assert/deepequal-buffer.js +++ b/benchmark/assert/deepequal-buffer.js @@ -7,7 +7,7 @@ const bench = common.createBenchmark(main, { len: [1e2, 1e3], strict: [0, 1], arrayBuffer: [0, 1], - method: ['deepEqual', 'notDeepEqual', 'unequal_length'], + method: ['deepEqual', 'notDeepEqual', 'unequal_length', 'partial'], }, { combinationFilter: (p) => { return p.strict === 1 || p.method === 'deepEqual'; @@ -18,11 +18,16 @@ function main({ len, n, method, strict, arrayBuffer }) { let actual = Buffer.alloc(len); let expected = Buffer.alloc(len + Number(method === 'unequal_length')); - if (method === 'unequal_length') { method = 'notDeepEqual'; } + if (method === 'partial') { + method = 'partialDeepStrictEqual'; + } else if (strict) { + method = method.replace('eep', 'eepStrict'); + } + for (let i = 0; i < len; i++) { actual.writeInt8(i % 128, i); expected.writeInt8(i % 128, i); @@ -33,10 +38,6 @@ function main({ len, n, method, strict, arrayBuffer }) { expected[position] = expected[position] + 1; } - if (strict) { - method = method.replace('eep', 'eepStrict'); - } - const fn = assert[method]; if (arrayBuffer) { diff --git a/benchmark/assert/deepequal-map.js b/benchmark/assert/deepequal-map.js index fb3f7cd316028f..c336a471b25101 100644 --- a/benchmark/assert/deepequal-map.js +++ b/benchmark/assert/deepequal-map.js @@ -5,7 +5,7 @@ const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } = require('assert'); const bench = common.createBenchmark(main, { - n: [5e3], + n: [2e3], len: [5e2], strict: [0, 1], method: [ @@ -31,7 +31,7 @@ function benchmark(method, n, values, values2) { } function main({ n, len, method, strict }) { - const array = Array(len).fill(1); + const array = Array.from({ length: len }, () => ''); switch (method) { case 'deepEqual_primitiveOnly': { diff --git a/benchmark/assert/deepequal-object.js b/benchmark/assert/deepequal-object.js index 4238129b292b45..e1d1baf838d9c6 100644 --- a/benchmark/assert/deepequal-object.js +++ b/benchmark/assert/deepequal-object.js @@ -4,13 +4,12 @@ const common = require('../common.js'); const assert = require('assert'); const bench = common.createBenchmark(main, { - n: [25, 2e2, 2e3], - size: [1e2, 1e3, 1e4], - strict: [1], - method: ['deepEqual', 'notDeepEqual'], + n: [50, 2e2], + size: [1e2, 1e4], + method: ['deepEqual', 'notDeepEqual', 'deepStrictEqual', 'notDeepStrictEqual'], }, { combinationFilter: (p) => { - return p.size === 1e4 && p.n === 25 || + return p.size === 1e4 && p.n === 50 || p.size === 1e3 && p.n === 2e2 || p.size === 1e2 && p.n === 2e3 || p.size === 1; @@ -30,10 +29,7 @@ function createObj(size, add = '') { })); } -function main({ size, n, method, strict }) { - if (strict) { - method = method.replace('eep', 'eepStrict'); - } +function main({ size, n, method }) { const fn = assert[method]; const actual = createObj(size); diff --git a/benchmark/assert/deepequal-prims-and-objs-big-loop.js b/benchmark/assert/deepequal-prims-and-objs-big-loop.js index 1ab4ff4dd81f33..bc2b84ebf20f41 100644 --- a/benchmark/assert/deepequal-prims-and-objs-big-loop.js +++ b/benchmark/assert/deepequal-prims-and-objs-big-loop.js @@ -10,11 +10,11 @@ const notCircular = {}; notCircular.circular = {}; const primValues = { + 'null_prototype': { __proto__: null }, 'string': 'abcdef', 'number': 1_000, 'boolean': true, 'object': { property: 'abcdef' }, - 'object_other_property': { property: 'abcdef' }, 'array': [1, 2, 3], 'set_object': new Set([[1]]), 'set_simple': new Set([1, 2, 3]), @@ -25,6 +25,7 @@ const primValues = { }; const primValues2 = { + 'null_prototype': { __proto__: null }, 'object': { property: 'abcdef' }, 'array': [1, 2, 3], 'set_object': new Set([[1]]), @@ -36,6 +37,7 @@ const primValues2 = { }; const primValuesUnequal = { + 'null_prototype': { __proto__: { __proto__: null } }, 'string': 'abcdez', 'number': 1_001, 'boolean': false, diff --git a/benchmark/assert/deepequal-set.js b/benchmark/assert/deepequal-set.js index 27ca7c92bce1b0..2667cf88d73708 100644 --- a/benchmark/assert/deepequal-set.js +++ b/benchmark/assert/deepequal-set.js @@ -5,9 +5,10 @@ const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } = require('assert'); const bench = common.createBenchmark(main, { - n: [5e2], - len: [5e2], + n: [1e3], + len: [2, 1e2], strict: [0, 1], + order: ['insert', 'random', 'reversed'], method: [ 'deepEqual_primitiveOnly', 'deepEqual_objectOnly', @@ -16,12 +17,30 @@ const bench = common.createBenchmark(main, { 'notDeepEqual_objectOnly', 'notDeepEqual_mixed', ], +}, { + combinationFilter(p) { + return p.order !== 'random' || p.strict === 1 && p.method !== 'notDeepEqual_objectOnly'; + }, }); -function benchmark(method, n, values, values2) { +function shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } +} + +function benchmark(method, n, values, values2, order) { const actual = new Set(values); // Prevent reference equal elements - const deepCopy = JSON.parse(JSON.stringify(values2 ? values2 : values)); + let deepCopy = JSON.parse(JSON.stringify(values2)); + if (order === 'reversed') { + deepCopy = deepCopy.reverse(); + } else if (order === 'random') { + shuffleArray(deepCopy); + } const expected = new Set(deepCopy); bench.start(); for (let i = 0; i < n; ++i) { @@ -30,39 +49,39 @@ function benchmark(method, n, values, values2) { bench.end(n); } -function main({ n, len, method, strict }) { - const array = Array(len).fill(1); +function main({ n, len, method, strict, order }) { + const array = Array.from({ length: len }, () => ''); switch (method) { case 'deepEqual_primitiveOnly': { const values = array.map((_, i) => `str_${i}`); - benchmark(strict ? deepStrictEqual : deepEqual, n, values); + benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'deepEqual_objectOnly': { const values = array.map((_, i) => [`str_${i}`, null]); - benchmark(strict ? deepStrictEqual : deepEqual, n, values); + benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'deepEqual_mixed': { const values = array.map((_, i) => { return i % 2 ? [`str_${i}`, null] : `str_${i}`; }); - benchmark(strict ? deepStrictEqual : deepEqual, n, values); + benchmark(strict ? deepStrictEqual : deepEqual, n, values, values, order); break; } case 'notDeepEqual_primitiveOnly': { const values = array.map((_, i) => `str_${i}`); const values2 = values.slice(0); values2[Math.floor(len / 2)] = 'w00t'; - benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); + benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } case 'notDeepEqual_objectOnly': { const values = array.map((_, i) => [`str_${i}`, null]); const values2 = values.slice(0); values2[Math.floor(len / 2)] = ['w00t']; - benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); + benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } case 'notDeepEqual_mixed': { @@ -71,7 +90,7 @@ function main({ n, len, method, strict }) { }); const values2 = values.slice(); values2[0] = 'w00t'; - benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2); + benchmark(strict ? notDeepStrictEqual : notDeepEqual, n, values, values2, order); break; } default: diff --git a/benchmark/assert/deepequal-simple-array-and-set.js b/benchmark/assert/deepequal-simple-array-and-set.js index a1f6820696d7b8..dd9351b63d5799 100644 --- a/benchmark/assert/deepequal-simple-array-and-set.js +++ b/benchmark/assert/deepequal-simple-array-and-set.js @@ -5,12 +5,14 @@ const { deepEqual, deepStrictEqual, notDeepEqual, notDeepStrictEqual } = require('assert'); const bench = common.createBenchmark(main, { - n: [5e2], + n: [1e3], len: [1e4], strict: [1], method: [ 'deepEqual_Array', 'notDeepEqual_Array', + 'deepEqual_sparseArray', + 'notDeepEqual_sparseArray', 'deepEqual_Set', 'notDeepEqual_Set', ], @@ -25,18 +27,30 @@ function run(fn, n, actual, expected) { } function main({ n, len, method, strict }) { - const actual = []; - const expected = []; + let actual = Array.from({ length: len }, (_, i) => i); + // Contain one undefined value to trigger a specific code path + actual[0] = undefined; + let expected = actual.slice(0); - for (let i = 0; i < len; i++) { - actual.push(i); - expected.push(i); - } if (method.includes('not')) { expected[len - 1] += 1; } switch (method) { + case 'deepEqual_sparseArray': + case 'notDeepEqual_sparseArray': + actual = new Array(len); + for (let i = 0; i < len; i += 2) { + actual[i] = i; + } + expected = actual.slice(0); + if (method.includes('not')) { + expected[len - 2] += 1; + run(strict ? notDeepStrictEqual : notDeepEqual, n, actual, expected); + } else { + run(strict ? deepStrictEqual : deepEqual, n, actual, expected); + } + break; case 'deepEqual_Array': run(strict ? deepStrictEqual : deepEqual, n, actual, expected); break; diff --git a/benchmark/assert/deepequal-typedarrays.js b/benchmark/assert/deepequal-typedarrays.js index 86826d6588ef86..5684cd520d258b 100644 --- a/benchmark/assert/deepequal-typedarrays.js +++ b/benchmark/assert/deepequal-typedarrays.js @@ -16,6 +16,12 @@ const bench = common.createBenchmark(main, { 'notDeepEqual', ], len: [1e2, 5e3], +}, { + combinationFilter(p) { + return p.strict === 1 || + p.type !== 'Float32Array' || + p.len === 1e2; + }, }); function main({ type, n, len, method, strict }) { diff --git a/benchmark/assert/match.js b/benchmark/assert/match.js new file mode 100644 index 00000000000000..5ad9292c4b012b --- /dev/null +++ b/benchmark/assert/match.js @@ -0,0 +1,28 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [2e7], + method: ['match', 'doesNotMatch'], +}, { + combinationFilter(p) { + // These benchmarks purposefully do not run by default. They do not provide + // might insight, due to only being a small wrapper around a native regexp + // call. + return p.n === 1; + }, +}); + +function main({ n, method }) { + const fn = assert[method]; + const actual = 'Example of string that will match'; + const expected = method === 'match' ? /will match/ : /will not match/; + + bench.start(); + for (let i = 0; i < n; ++i) { + fn(actual, expected); + } + bench.end(n); +} diff --git a/benchmark/assert/partial-deep-equal.js b/benchmark/assert/partial-deep-equal.js new file mode 100644 index 00000000000000..6e479115050cde --- /dev/null +++ b/benchmark/assert/partial-deep-equal.js @@ -0,0 +1,170 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [125], + size: [500], + extraProps: [0, 1], + datasetName: [ + 'objects', + 'sets', + 'setsWithObjects', + 'maps', + 'circularRefs', + 'typedArrays', + 'arrayBuffers', + 'dataViewArrayBuffers', + 'array', + ], +}); + +function createArray(length, extraProps) { + if (extraProps) { + return Array.from({ length: length * 4 }, (_, i) => i); + } + return Array.from({ length }, (_, i) => i * 4); +} + +function createObjects(length, extraProps, depth = 0) { + return Array.from({ length }, (_, i) => ({ + foo: 'yarp', + nope: { + bar: '123', + ...(extraProps ? { a: [1, 2, i] } : {}), + c: {}, + b: !depth ? createObjects(2, extraProps, depth + 1) : [], + }, + })); +} + +function createSetsWithObjects(length, extraProps, depth = 0) { + return Array.from({ length }, (_, i) => new Set([ + ...(extraProps ? [{}] : []), + { + simple: 'object', + number: i, + }, + ['array', 'with', 'values'], + new Set([[], {}, { nested: i }]), + ])); +} + +function createSets(length, extraProps, depth = 0) { + return Array.from({ length }, (_, i) => new Set([ + 'yarp', + ...(extraProps ? ['123', 1, 2] : []), + i + 3, + null, + { + simple: 'object', + number: i, + }, + ['array', 'with', 'values'], + !depth ? new Set([1, { nested: i }]) : new Set(), + !depth ? createSets(2, extraProps, depth + 1) : null, + ])); +} + +function createMaps(length, extraProps, depth = 0) { + return Array.from({ length }, (_, i) => new Map([ + ...(extraProps ? [['primitiveKey', 'primitiveValue']] : []), + [42, 'numberKey'], + ['objectValue', { a: 1, b: i }], + ['arrayValue', [1, 2, i]], + ['nestedMap', new Map([['a', i], ['b', { deep: true }]])], + [{ objectKey: true }, 'value from object key'], + [[1, i, 3], 'value from array key'], + [!depth ? createMaps(2, extraProps, depth + 1) : null, 'recursive value' + i], + ])); +} + +function createCircularRefs(length, extraProps) { + return Array.from({ length }, (_, i) => { + const circularSet = new Set(); + const circularMap = new Map(); + const circularObj = { name: 'circular object' }; + + circularSet.add('some value' + i); + circularSet.add(circularSet); + + circularMap.set('self', circularMap); + circularMap.set('value', 'regular value'); + + circularObj.self = circularObj; + + const objA = { name: 'A' }; + const objB = { name: 'B' }; + objA.ref = objB; + objB.ref = objA; + + circularSet.add(objA); + circularMap.set('objB', objB); + + return { + circularSet, + circularMap, + ...extraProps ? { extra: i } : {}, + circularObj, + objA, + objB, + }; + }); +} + +function createTypedArrays(length, extraParts) { + const extra = extraParts ? [9, 8, 7] : []; + return Array.from({ length }, (_, i) => { + return { + uint8: new Uint8Array(new ArrayBuffer(32), 4, 4), + int16: new Int16Array([1, 2, ...extra, 3]), + uint32: new Uint32Array([i + 1, i + 2, ...extra, i + 3]), + float64: new Float64Array([1.1, 2.2, ...extra, i + 3.3]), + bigUint64: new BigUint64Array([1n, 2n, 3n]), + }; + }); +} + +function createArrayBuffers(length, extra) { + return Array.from({ length }, (_, n) => { + const buffer = Buffer.alloc(n + (extra ? 1 : 0)); + for (let i = 0; i < n; i++) { + buffer.writeInt8(i % 128, i); + } + return buffer.buffer; + }); +} + +function createDataViewArrayBuffers(length, extra) { + return createArrayBuffers(length, extra).map((buffer) => new DataView(buffer)); +} + +const datasetMappings = { + objects: createObjects, + sets: createSets, + setsWithObjects: createSetsWithObjects, + maps: createMaps, + circularRefs: createCircularRefs, + typedArrays: createTypedArrays, + arrayBuffers: createArrayBuffers, + dataViewArrayBuffers: createDataViewArrayBuffers, + array: createArray, +}; + +function getDatasets(datasetName, size, extra) { + return { + actual: datasetMappings[datasetName](size, true), + expected: datasetMappings[datasetName](size, !extra), + }; +} + +function main({ size, n, datasetName, extraProps }) { + const { actual, expected } = getDatasets(datasetName, size, extraProps); + + bench.start(); + for (let i = 0; i < n; ++i) { + assert.partialDeepStrictEqual(actual, expected); + } + bench.end(n); +} diff --git a/benchmark/assert/rejects.js b/benchmark/assert/rejects.js new file mode 100644 index 00000000000000..d8a6d6f4bb8058 --- /dev/null +++ b/benchmark/assert/rejects.js @@ -0,0 +1,34 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [2e5], + method: ['rejects', 'doesNotReject'], +}, { + combinationFilter(p) { + // These benchmarks purposefully do not run by default. They do not provide + // much insight, due to only being a small wrapper around a native promise + // with a few extra checks. + return p.n === 1; + }, +}); + +async function main({ n, method }) { + const fn = assert[method]; + const shouldReject = method === 'rejects'; + + bench.start(); + for (let i = 0; i < n; ++i) { + await fn(async () => { + const err = new Error(`assert.${method}`); + if (shouldReject) { + throw err; + } else { + return err; + } + }); + } + bench.end(n); +} diff --git a/benchmark/assert/strictequal.js b/benchmark/assert/strictequal.js new file mode 100644 index 00000000000000..fef74ffb1ecb5b --- /dev/null +++ b/benchmark/assert/strictequal.js @@ -0,0 +1,49 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [2e5], + type: ['string', 'object', 'number'], + method: ['strictEqual', 'notStrictEqual'], +}, { + combinationFilter(p) { + // These benchmarks purposefully do not run by default. They do not provide + // much insight, due to only being a small wrapper around `Object.is()`. + return p.n === 1; + }, +}); + +function main({ type, n, method }) { + const fn = assert[method]; + let actual, expected; + switch (type) { + case 'string': + actual = expected = 'Hello World'; + if (method === 'notStrictEqual') { + expected += 'bar'; + } + break; + case 'object': + actual = expected = { a: 'Hello', b: 'World' }; + if (method === 'notStrictEqual') { + expected = { a: 'Hello', b: 'World' }; + } + break; + case 'number': + actual = expected = 1e9; + if (method === 'notStrictEqual') { + expected += 1; + } + break; + default: + throw new Error('Unexpected type'); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + fn(actual, expected); + } + bench.end(n); +} diff --git a/benchmark/assert/throws.js b/benchmark/assert/throws.js new file mode 100644 index 00000000000000..df2fdf2dbf0e07 --- /dev/null +++ b/benchmark/assert/throws.js @@ -0,0 +1,33 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [2e5], + method: ['throws', 'doesNotThrow'], +}, { + combinationFilter(p) { + // These benchmarks purposefully do not run by default. They do not provide + // much insight, due to only being a small wrapper around a try / catch. + return p.n === 1; + }, +}); + +function main({ n, method }) { + const fn = assert[method]; + const shouldThrow = method === 'throws'; + + bench.start(); + for (let i = 0; i < n; ++i) { + fn(() => { + const err = new Error(`assert.${method}`); + if (shouldThrow) { + throw err; + } else { + return err; + } + }); + } + bench.end(n); +} diff --git a/benchmark/async_hooks/async-local-storage-getstore-nested-resources.js b/benchmark/async_hooks/async-local-storage-getstore-nested-resources.js index 3474e801e01f35..65faa73440af04 100644 --- a/benchmark/async_hooks/async-local-storage-getstore-nested-resources.js +++ b/benchmark/async_hooks/async-local-storage-getstore-nested-resources.js @@ -38,9 +38,11 @@ function runInAsyncScopes(resourceCount, cb, i = 0) { function main({ n, resourceCount }) { const store = new AsyncLocalStorage(); - runInAsyncScopes(resourceCount, () => { - bench.start(); - runBenchmark(store, n); - bench.end(n); + store.run({}, () => { + runInAsyncScopes(resourceCount, () => { + bench.start(); + runBenchmark(store, n); + bench.end(n); + }); }); } diff --git a/benchmark/async_hooks/async-local-storage-getstore-nested-run.js b/benchmark/async_hooks/async-local-storage-getstore-nested-run.js index 5f8948f62eb13e..074a44b1ce261b 100644 --- a/benchmark/async_hooks/async-local-storage-getstore-nested-run.js +++ b/benchmark/async_hooks/async-local-storage-getstore-nested-run.js @@ -14,7 +14,7 @@ const { AsyncLocalStorage } = require('async_hooks'); * - AsyncLocalStorage1.getStore() */ const bench = common.createBenchmark(main, { - sotrageCount: [1, 10, 100], + storageCount: [1, 10, 100], n: [1e4], }); @@ -34,8 +34,8 @@ function runStores(stores, value, cb, idx = 0) { } } -function main({ n, sotrageCount }) { - const stores = new Array(sotrageCount).fill(0).map(() => new AsyncLocalStorage()); +function main({ n, storageCount }) { + const stores = new Array(storageCount).fill(0).map(() => new AsyncLocalStorage()); const contextValue = {}; runStores(stores, contextValue, () => { diff --git a/benchmark/blob/blob.js b/benchmark/blob/blob.js index 4a79a87d27deba..83e58007dd58e9 100644 --- a/benchmark/blob/blob.js +++ b/benchmark/blob/blob.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const { Blob } = require('buffer'); const bench = common.createBenchmark(main, { - bytes: [128, 1024, 1024 ** 2], + bytes: [128, 1024, 8192], n: [1e3], operation: ['text', 'arrayBuffer'], }); diff --git a/benchmark/buffers/buffer-atob.js b/benchmark/buffers/buffer-atob.js index 2cc20759e3f0f6..ee986e49e5e9ae 100644 --- a/benchmark/buffers/buffer-atob.js +++ b/benchmark/buffers/buffer-atob.js @@ -16,5 +16,5 @@ function main({ n, size }) { out += atob(input).length; } bench.end(n); - assert(out > 0); + assert.ok(out > 0); } diff --git a/benchmark/buffers/buffer-btoa.js b/benchmark/buffers/buffer-btoa.js index 3867d5890b1d79..5bfe7cff3db179 100644 --- a/benchmark/buffers/buffer-btoa.js +++ b/benchmark/buffers/buffer-btoa.js @@ -16,5 +16,5 @@ function main({ n, size }) { out += btoa(input).length; } bench.end(n); - assert(out > 0); + assert.ok(out > 0); } diff --git a/benchmark/buffers/buffer-bytelength-string.js b/benchmark/buffers/buffer-bytelength-string.js index 143da0215a613b..557bc8d6fe38d6 100644 --- a/benchmark/buffers/buffer-bytelength-string.js +++ b/benchmark/buffers/buffer-bytelength-string.js @@ -22,7 +22,7 @@ const chars = { function getInput(type, repeat, encoding) { const original = (repeat === 1) ? chars[type] : chars[type].repeat(repeat); if (encoding === 'base64') { - Buffer.from(original, 'utf8').toString('base64'); + return Buffer.from(original, 'utf8').toString('base64'); } return original; } diff --git a/benchmark/buffers/buffer-copy.js b/benchmark/buffers/buffer-copy.js index a498c08e65276f..c2dafc8515c4f2 100644 --- a/benchmark/buffers/buffer-copy.js +++ b/benchmark/buffers/buffer-copy.js @@ -2,15 +2,9 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - bytes: [0, 8, 128, 32 * 1024], + bytes: [8, 128, 1024], partial: ['true', 'false'], n: [6e6], -}, { - combinationFilter: (p) => { - return (p.partial === 'false' && p.bytes === 0) || - (p.partial !== 'false' && p.bytes !== 0); - }, - test: { partial: 'false', bytes: 0 }, }); function main({ n, bytes, partial }) { diff --git a/benchmark/buffers/buffer-isascii.js b/benchmark/buffers/buffer-isascii.js new file mode 100644 index 00000000000000..d118049fa5ea6b --- /dev/null +++ b/benchmark/buffers/buffer-isascii.js @@ -0,0 +1,23 @@ +'use strict'; + +const common = require('../common.js'); +const buffer = require('node:buffer'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + n: [2e7], + length: ['short', 'long'], + input: ['hello world'], +}); + + +function main({ n, input }) { + const normalizedInput = input === 'short' ? input : input.repeat(200); + const encoder = new TextEncoder(); + const buff = encoder.encode(normalizedInput); + bench.start(); + for (let i = 0; i < n; ++i) { + assert.ok(buffer.isAscii(buff)); + } + bench.end(n); +} diff --git a/benchmark/buffers/buffer-isutf8.js b/benchmark/buffers/buffer-isutf8.js new file mode 100644 index 00000000000000..dac1e07b30b88f --- /dev/null +++ b/benchmark/buffers/buffer-isutf8.js @@ -0,0 +1,23 @@ +'use strict'; + +const common = require('../common.js'); +const buffer = require('node:buffer'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + n: [2e7], + length: ['short', 'long'], + input: ['regular string', '∀x∈ℝ: ⌈x⌉ = −⌊−x⌋'], +}); + + +function main({ n, input, length }) { + const normalizedInput = length === 'short' ? input : input.repeat(300); + const encoder = new TextEncoder(); + const buff = encoder.encode(normalizedInput); + bench.start(); + for (let i = 0; i < n; ++i) { + assert.ok(buffer.isUtf8(buff)); + } + bench.end(n); +} diff --git a/benchmark/buffers/buffer-iterate.js b/benchmark/buffers/buffer-iterate.js index 57a15e42249742..c1c4f6917501a1 100644 --- a/benchmark/buffers/buffer-iterate.js +++ b/benchmark/buffers/buffer-iterate.js @@ -31,7 +31,7 @@ function main({ size, type, method, n }) { function benchFor(buffer, n) { for (let k = 0; k < n; k++) { for (let i = 0; i < buffer.length; i++) { - assert(buffer[i] === 0); + assert.strictEqual(buffer[i], 0); } } } @@ -39,7 +39,7 @@ function benchFor(buffer, n) { function benchForOf(buffer, n) { for (let k = 0; k < n; k++) { for (const b of buffer) { - assert(b === 0); + assert.strictEqual(b, 0); } } } @@ -50,7 +50,7 @@ function benchIterator(buffer, n) { let cur = iter.next(); while (!cur.done) { - assert(cur.value === 0); + assert.strictEqual(cur.value, 0); cur = iter.next(); } diff --git a/benchmark/buffers/buffer-transcode.js b/benchmark/buffers/buffer-transcode.js new file mode 100644 index 00000000000000..cbb3b2e9b16374 --- /dev/null +++ b/benchmark/buffers/buffer-transcode.js @@ -0,0 +1,35 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('node:assert'); +const buffer = require('node:buffer'); + +const hasIntl = !!process.config.variables.v8_enable_i18n_support; +const encodings = ['latin1', 'ascii', 'ucs2', 'utf8']; + +if (!hasIntl) { + console.log('Skipping: `transcode` is only available on platforms that support i18n`'); + process.exit(0); +} + +const bench = common.createBenchmark(main, { + fromEncoding: encodings, + toEncoding: encodings, + length: [1, 10, 1000], + n: [1e5], +}, { + combinationFilter(p) { + return !(p.fromEncoding === 'ucs2' && p.toEncoding === 'utf8'); + }, +}); + +function main({ n, fromEncoding, toEncoding, length }) { + const input = Buffer.from('a'.repeat(length)); + let out = 0; + bench.start(); + for (let i = 0; i < n; i++) { + const dest = buffer.transcode(input, fromEncoding, toEncoding); + out += dest.buffer.byteLength; + } + bench.end(n); + assert.ok(out >= 0); +} diff --git a/benchmark/buffers/buffer-write-string-short.js b/benchmark/buffers/buffer-write-string-short.js new file mode 100644 index 00000000000000..8f02b70aabb56a --- /dev/null +++ b/benchmark/buffers/buffer-write-string-short.js @@ -0,0 +1,20 @@ +'use strict'; + +const common = require('../common.js'); +const bench = common.createBenchmark(main, { + encoding: [ + 'utf8', 'ascii', 'latin1', + ], + len: [1, 8, 16, 32], + n: [1e6], +}); + +function main({ len, n, encoding }) { + const buf = Buffer.allocUnsafe(len); + const string = Buffer.from('a'.repeat(len)).toString(); + bench.start(); + for (let i = 0; i < n; ++i) { + buf.write(string, 0, encoding); + } + bench.end(n); +} diff --git a/benchmark/calibrate-n.js b/benchmark/calibrate-n.js new file mode 100644 index 00000000000000..16bb512cc50a8c --- /dev/null +++ b/benchmark/calibrate-n.js @@ -0,0 +1,292 @@ +'use strict'; + +const path = require('node:path'); +const { fork } = require('node:child_process'); +const fs = require('node:fs'); +const { styleText } = require('node:util'); + +const DEFAULT_RUNS = 30; // Number of runs for each n value +const CV_THRESHOLD = 0.05; // 5% coefficient of variation threshold +const MAX_N_INCREASE = 6; // Maximum number of times to increase n (10**6) +const INCREASE_FACTOR = 10; // Factor by which to increase n + +const args = process.argv.slice(2); +if (args.length === 0) { + console.log(` +Usage: node calibrate-n.js [options] <benchmark_path> + +Options: + --runs=N Number of runs for each n value (default: ${DEFAULT_RUNS}) + --cv-threshold=N Target coefficient of variation threshold (default: ${CV_THRESHOLD}) + --max-increases=N Maximum number of n increases to try (default: ${MAX_N_INCREASE}) + --start-n=N Initial n value to start with (default: autodetect) + --increase=N Factor by which to increase n (default: ${INCREASE_FACTOR}) + +Example: + node calibrate-n.js buffers/buffer-compare.js + node calibrate-n.js --runs=10 --cv-threshold=0.02 buffers/buffer-compare.js + `); + process.exit(1); +} + +// Extract options +let benchmarkPath; +let runs = DEFAULT_RUNS; +let cvThreshold = CV_THRESHOLD; +let maxIncreases = MAX_N_INCREASE; +let startN = 10; +let increaseFactor = INCREASE_FACTOR; + +for (const arg of args) { + if (arg.startsWith('--runs=')) { + runs = parseInt(arg.substring(7), 10); + } else if (arg.startsWith('--cv-threshold=')) { + cvThreshold = parseFloat(arg.substring(14)); + } else if (arg.startsWith('--max-increases=')) { + maxIncreases = parseInt(arg.substring(15), 10); + if (isNaN(maxIncreases)) { + console.error(`Error: Invalid value for --max-increases. Using default: ${MAX_N_INCREASE}`); + maxIncreases = MAX_N_INCREASE; + } + } else if (arg.startsWith('--start-n=')) { + startN = parseInt(arg.substring(10), 10); + if (isNaN(startN)) { + console.error(`Error: Invalid value for --start-n. Using default: 10`); + startN = 10; + } + } else if (arg.startsWith('--increase=')) { + increaseFactor = parseInt(arg.substring(11), 10); + if (isNaN(increaseFactor)) { + console.error(`Error: Invalid value for --increase. Using default: ${INCREASE_FACTOR}`); + increaseFactor = INCREASE_FACTOR; + } + } else { + benchmarkPath = arg; + } +} + +if (!benchmarkPath) { + console.error('Error: No benchmark path specified'); + process.exit(1); +} + +const fullBenchmarkPath = path.resolve(benchmarkPath); +if (!fs.existsSync(fullBenchmarkPath)) { + console.error(`Error: Benchmark file not found: ${fullBenchmarkPath}`); + process.exit(1); +} + +function calculateStats(values) { + const mean = values.reduce((sum, val) => sum + val, 0) / values.length; + + const squaredDiffs = values.map((val) => { + const diff = val - mean; + const squared = diff ** 2; + return squared; + }); + + const variance = squaredDiffs.reduce((sum, val) => sum + val, 0) / values.length; + const stdDev = Math.sqrt(variance); + const cv = stdDev / mean; + + return { mean, stdDev, cv, variance }; +} + +function runBenchmark(n) { + return new Promise((resolve, reject) => { + const child = fork( + fullBenchmarkPath, + [`n=${n}`], + { stdio: ['inherit', 'pipe', 'inherit', 'ipc'] }, + ); + + const results = []; + child.on('message', (data) => { + if (data.type === 'report' && data.rate && data.conf) { + results.push({ + rate: data.rate, + conf: data.conf, + }); + } + }); + + child.on('close', (code) => { + if (code !== 0) { + reject(new Error(`Benchmark exited with code ${code}`)); + } else { + resolve(results); + } + }); + }); +} + +async function main(n = startN) { + let increaseCount = 0; + let bestN = n; + let bestCV = Infinity; + let bestGroupStats = null; + + console.log(` +-------------------------------------------------------- +Benchmark: ${benchmarkPath} +-------------------------------------------------------- +What we are trying to find: The optimal number of iterations (n) +that produces consistent benchmark results without wasting time. + +How it works: +1. Run the benchmark multiple times with a specific n value +2. Group results by configuration +3. If overall CV is above 5% or any configuration has CV above 10%, increase n and try again + +Configuration: +- Starting n: ${n.toLocaleString()} iterations +- Runs per n value: ${runs} +- Target CV threshold: ${cvThreshold * 100}% (lower CV = more stable results) +- Max increases: ${maxIncreases} +- Increase factor: ${increaseFactor}x`); + + while (increaseCount < maxIncreases) { + console.log(`\nTesting with n=${n}:`); + + const resultsData = []; + for (let i = 0; i < runs; i++) { + const results = await runBenchmark(n); + // Each run might return multiple results (one per configuration) + if (Array.isArray(results) && results.length > 0) { + resultsData.push(...results); + } else if (results) { + resultsData.push(results); + } + process.stdout.write('.'); + } + process.stdout.write('\n'); + + const groupedResults = {}; + resultsData.forEach((result) => { + if (!result || !result.conf) return; + + const confKey = JSON.stringify(result.conf); + groupedResults[confKey] ||= { + conf: result.conf, + rates: [], + }; + + groupedResults[confKey].rates.push(result.rate); + }); + + const groupStats = []; + for (const [confKey, group] of Object.entries(groupedResults)) { + console.log(`\nConfiguration: ${JSON.stringify(group.conf)}`); + + const stats = calculateStats(group.rates); + console.log(` CV: ${(stats.cv * 100).toFixed(2)}% (lower values mean more stable results)`); + + const isStable = stats.cv <= cvThreshold; + console.log(` Stability: ${isStable ? + styleText(['bold', 'green'], '✓ Stable') : + styleText(['bold', 'red'], '✗ Unstable')}`); + + groupStats.push({ + confKey, + stats, + isStable, + }); + } + + if (groupStats.length > 0) { + // Check if any configuration has CV > 10% (too unstable) + const tooUnstableConfigs = groupStats.filter((g) => g.stats.cv > 0.10); + + const avgCV = groupStats.reduce((sum, g) => sum + g.stats.cv, 0) / groupStats.length; + console.log(`\nOverall average CV: ${(avgCV * 100).toFixed(2)}%`); + + const isOverallStable = avgCV < CV_THRESHOLD; + const hasVeryUnstableConfigs = tooUnstableConfigs.length > 0; + + // Check if overall CV is below CV_THRESHOLD and no configuration has CV > 10% + if (isOverallStable && !hasVeryUnstableConfigs) { + console.log(styleText(['bold', 'green'], ` ✓ Overall CV is below 5% and no configuration has CV above 10%`)); + } else { + if (!isOverallStable) { + console.log(styleText(['bold', 'red'], ` ✗ Overall CV (${(avgCV * 100).toFixed(2)}%) is above 5%`)); + } + if (hasVeryUnstableConfigs) { + console.log(styleText(['bold', 'red'], ` ✗ ${tooUnstableConfigs.length} configuration(s) have CV above 10%`)); + } + } + + if (avgCV < bestCV || !bestGroupStats) { + bestN = n; + bestCV = avgCV; + + bestGroupStats = []; + for (const group of Object.values(groupedResults)) { + if (group.rates.length >= 3) { + const stats = calculateStats(group.rates); + bestGroupStats.push({ + conf: group.conf, + stats: stats, + isStable: stats.cv <= 0.10, + }); + } + } + console.log(` → New best n: ${n} with average CV: ${(avgCV * 100).toFixed(2)}%`); + } else { + console.log(` → Current best n remains: ${bestN} with average CV: ${(bestCV * 100).toFixed(2)}%`); + } + } + + // Check if we've reached acceptable stability based on new criteria + // 1. Overall CV should be below CV_THRESHOLD + // 2. No configuration should have a CV greater than 10% + const avgCV = groupStats.length > 0 ? + groupStats.reduce((sum, g) => sum + g.stats.cv, 0) / groupStats.length : Infinity; + const hasUnstableConfig = groupStats.some((g) => g.stats.cv > 0.10); + const isOverallStable = avgCV < CV_THRESHOLD; + + if (isOverallStable && !hasUnstableConfig) { + console.log(`\n✓ Found optimal n=${n} (Overall CV=${(avgCV * 100).toFixed(2)}% < 5% and no configuration has CV > 10%)`); + console.log('\nFinal CV for each configuration:'); + groupStats.forEach((g) => { + console.log(` ${JSON.stringify(groupedResults[g.confKey].conf)}: ${(g.stats.cv * 100).toFixed(2)}%`); + }); + + return n; + } + + increaseCount++; + n *= increaseFactor; + } + + if (increaseCount >= maxIncreases) { + const finalAvgCV = bestGroupStats && bestGroupStats.length > 0 ? + bestGroupStats.reduce((sum, g) => sum + g.stats.cv, 0) / bestGroupStats.length : Infinity; + + console.log(`Maximum number of increases (${maxIncreases}) reached without achieving target stability`); + console.log(`Best n found: ${bestN} with average CV=${(finalAvgCV * 100).toFixed(2)}%`); + console.log(`\nCV by configuration at best n:`); + + if (bestGroupStats) { + bestGroupStats.forEach((g) => { + if (g.conf) { + console.log(` ${JSON.stringify(g.conf)}: ${(g.stats.cv * 100).toFixed(2)}%`); + if (g.stats.cv > cvThreshold) { + console.log(` ⚠️ This configuration is above the target threshold of ${cvThreshold * 100}%`); + } + } + }); + } + } + + console.log(` +Recommendation: You might want to try increasing --max-increases to +continue testing with larger n values, or adjust --cv-threshold to +accept the current best result, or investigate if specific configurations +are contributing to instability.`); + return bestN; +} + +main().catch((err) => { + console.error('Error:', err); + process.exit(1); +}); diff --git a/benchmark/cluster/echo.js b/benchmark/cluster/echo.js index 71ded75c9d2572..a3f103bc0b8987 100644 --- a/benchmark/cluster/echo.js +++ b/benchmark/cluster/echo.js @@ -8,7 +8,7 @@ if (cluster.isPrimary) { payload: ['string', 'object'], sendsPerBroadcast: [1, 10], serialization: ['json', 'advanced'], - n: [1e5], + n: [1e3], }); function main({ diff --git a/benchmark/common.js b/benchmark/common.js index efe21e871571fc..48082e59e1eb95 100644 --- a/benchmark/common.js +++ b/benchmark/common.js @@ -22,27 +22,37 @@ class Benchmark { this.name = require.main.filename.slice(__dirname.length + 1); // Execution arguments i.e. flags used to run the jobs - this.flags = process.env.NODE_BENCHMARK_FLAGS ? - process.env.NODE_BENCHMARK_FLAGS.split(/\s+/) : - []; + this.flags = process.env.NODE_BENCHMARK_FLAGS?.split(/\s+/) ?? []; // Parse job-specific configuration from the command line arguments const argv = process.argv.slice(2); const parsed_args = this._parseArgs(argv, configs, options); + + this.originalOptions = options; this.options = parsed_args.cli; this.extra_options = parsed_args.extra; + this.combinationFilter = typeof options.combinationFilter === 'function' ? options.combinationFilter : allow; + + if (options.byGroups) { + this.queue = []; + const groupNames = process.env.NODE_RUN_BENCHMARK_GROUPS?.split(',') ?? Object.keys(configs); + + for (const groupName of groupNames) { + const config = { ...configs[groupName][0], group: groupName }; + const parsed_args = this._parseArgs(argv, config, options); + + this.options = parsed_args.cli; + this.extra_options = parsed_args.extra; + this.queue = this.queue.concat(this._queue(this.options)); + } + } else { + this.queue = this._queue(this.options); + } + if (options.flags) { this.flags = this.flags.concat(options.flags); } - if (typeof options.combinationFilter === 'function') - this.combinationFilter = options.combinationFilter; - else - this.combinationFilter = allow; - - // The configuration list as a queue of jobs - this.queue = this._queue(this.options); - if (this.queue.length === 0) return; @@ -104,12 +114,10 @@ class Benchmark { } const [, key, value] = match; if (configs[key] !== undefined) { - if (!cliOptions[key]) - cliOptions[key] = []; - cliOptions[key].push( - // Infer the type from the config object and parse accordingly - typeof configs[key][0] === 'number' ? +value : value, - ); + cliOptions[key] ||= []; + const configType = typeof configs[key][0]; + const configValue = configType === 'number' ? +value : configType === 'boolean' ? value === 'true' : value; + cliOptions[key].push(configValue); } else { extraOptions[key] = value; } @@ -129,7 +137,7 @@ class Benchmark { const values = options[key]; for (const value of values) { - if (typeof value !== 'number' && typeof value !== 'string') { + if (typeof value !== 'number' && typeof value !== 'string' && typeof value !== 'boolean') { throw new TypeError( `configuration "${key}" had type ${typeof value}`); } @@ -168,10 +176,9 @@ class Benchmark { http(options, cb) { const http_options = { ...options }; - http_options.benchmarker = http_options.benchmarker || - this.config.benchmarker || - this.extra_options.benchmarker || - http_benchmarkers.default_http_benchmarker; + http_options.benchmarker ||= this.config.benchmarker || + this.extra_options.benchmarker || + http_benchmarkers.default_http_benchmarker; http_benchmarkers.run( http_options, (error, code, used_benchmarker, result, elapsed) => { if (cb) { @@ -197,6 +204,12 @@ class Benchmark { }); } + if (this.originalOptions.setup) { + // Only do this from the root process. _run() is only ever called from the root, + // in child processes main is run directly. + this.originalOptions.setup(this.queue); + } + const recursive = (queueIndex) => { const config = this.queue[queueIndex]; diff --git a/benchmark/compare.js b/benchmark/compare.js index 1efff9e85c072f..ad3084db390414 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -83,11 +83,8 @@ if (showProgress) { const spawnArgs = ['-c', cpuCore, cli.optional[job.binary], resolvedPath, ...cli.optional.set]; child = spawn('taskset', spawnArgs, { env: process.env, - stdio: ['inherit', 'pipe', 'pipe'], + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], }); - - child.stdout.pipe(process.stdout); - child.stderr.pipe(process.stderr); } else { child = fork(resolvedPath, cli.optional.set, { execPath: cli.optional[job.binary], diff --git a/benchmark/console/log.js b/benchmark/console/log.js new file mode 100644 index 00000000000000..37fb2e466bc576 --- /dev/null +++ b/benchmark/console/log.js @@ -0,0 +1,78 @@ +'use strict'; + +// A console throughput benchmark. +// Uses a custom Console with null Writable streams to avoid I/O latency. + +const common = require('../common.js'); +const { Writable } = require('stream'); +const { Console } = require('console'); + +const bench = common.createBenchmark(main, { + n: [2e6], + variant: ['plain', 'format', 'object', 'group', 'info', 'warn', 'error'], +}); + +class Null extends Writable { + _write(chunk, enc, cb) { cb(); } +} + +function makeConsole() { + const dn = new Null(); + return new Console({ stdout: dn, stderr: dn, ignoreErrors: true, colorMode: false }); +} + +function main({ n, variant }) { + const c = makeConsole(); + + switch (variant) { + case 'plain': { + bench.start(); + for (let i = 0; i < n; i++) c.log('hello world'); + bench.end(n); + break; + } + case 'format': { + bench.start(); + for (let i = 0; i < n; i++) c.log('%s %d %j', 'a', 42, { x: 1 }); + bench.end(n); + break; + } + case 'object': { + const obj = { a: 1, b: 2, c: 3 }; + bench.start(); + for (let i = 0; i < n; i++) c.log(obj); + bench.end(n); + break; + } + case 'group': { + bench.start(); + for (let i = 0; i < n; i++) { + c.group('g'); + c.log('x'); + c.groupEnd(); + } + bench.end(n); + break; + } + case 'info': { + bench.start(); + for (let i = 0; i < n; i++) c.info('hello world'); + bench.end(n); + break; + } + case 'warn': { + bench.start(); + for (let i = 0; i < n; i++) c.warn('hello world'); + bench.end(n); + break; + } + case 'error': { + bench.start(); + for (let i = 0; i < n; i++) c.error('hello world'); + bench.end(n); + break; + } + default: + throw new Error('unknown variant'); + } +} diff --git a/benchmark/cpu.sh b/benchmark/cpu.sh new file mode 100755 index 00000000000000..7e35c0ef0de8c8 --- /dev/null +++ b/benchmark/cpu.sh @@ -0,0 +1,76 @@ +#!/bin/sh + +CPUPATH=/sys/devices/system/cpu + +MAXID=$(cat $CPUPATH/present | awk -F- '{print $NF}') + +[ "$(uname -s || true)" = "Linux" ] || \ + echo "Warning: This script supports Linux only." >&2 + +[ "$(id -u || true)" = "0" ] || \ + echo "Warning: This script typically needs root access to modify CPU governor. Consider running it with sudo." >&2 + +get_default_governor() { + case "$(cat "$CPUPATH/cpu0/cpufreq/scaling_available_governors")" in + *"schedutil"*) echo "schedutil" ;; + *"ondemand"*) echo "ondemand" ;; + *"conservative"*) echo "conservative";; + *) echo "powersave" ;; + esac + +} + +set_governor() { + governor_name="$1" + + echo "Setting governor for all CPU cores to \"$governor_name\"..." + + i=0 + while [ "$i" -le "$MAXID" ]; do + echo "$1" > "$CPUPATH/cpu$i/cpufreq/scaling_governor" + i=$((i + 1)) + done + + echo "Done." +} + +usage() { + default_gov=$(get_default_governor) + echo "CPU Governor Management Script" + echo "----------------------------------------------------------------------------" + echo "Usage: $0 [command]" + echo + echo "Commands:" + echo " fast Sets the governor to 'performance' for maximum speed." + echo " (Warning: Increases heat/power use. Use for short-term tasks.)" + echo + echo " reset Resets the governor to the system's recommended default ('$default_gov')." + echo + echo " get Shows the current CPU governor for ALL cores." + echo "----------------------------------------------------------------------------" +} + +case "$1" in + fast | performance) + echo "Warning: The 'performance' mode locks the CPU at its highest speed." + echo "It is highly recommended to 'reset' after your task is complete." + set_governor "performance" + ;; + + reset | default) + default_governor=$(get_default_governor) + set_governor "$default_governor" + ;; + + get | status) + echo "Current governor status for all cores:" + grep . "$CPUPATH"/cpu*/cpufreq/scaling_governor + ;; + + *) + usage + exit 1 + ;; +esac + +exit 0 diff --git a/benchmark/crypto/randomUUID.js b/benchmark/crypto/randomUUID.js index cca05242874738..e03c502998188d 100644 --- a/benchmark/crypto/randomUUID.js +++ b/benchmark/crypto/randomUUID.js @@ -5,11 +5,10 @@ const { randomUUID } = require('crypto'); const bench = common.createBenchmark(main, { n: [1e7], - disableEntropyCache: [0, 1], + disableEntropyCache: [false, true], }); function main({ n, disableEntropyCache }) { - disableEntropyCache = !!disableEntropyCache; bench.start(); for (let i = 0; i < n; ++i) randomUUID({ disableEntropyCache }); diff --git a/benchmark/dgram/array-vs-concat.js b/benchmark/dgram/array-vs-concat.js index b5662acfc4033b..c859771e711095 100644 --- a/benchmark/dgram/array-vs-concat.js +++ b/benchmark/dgram/array-vs-concat.js @@ -5,18 +5,18 @@ const common = require('../common.js'); const dgram = require('dgram'); const PORT = common.PORT; -// `num` is the number of send requests to queue up each time. +// `n` is the number of send requests to queue up each time. // Keep it reasonably high (>10) otherwise you're benchmarking the speed of // event loop cycles more than anything else. const bench = common.createBenchmark(main, { - len: [64, 256, 512, 1024], - num: [100], - chunks: [1, 2, 4, 8], + len: [64, 512, 1024], + n: [100], + chunks: [1, 4], type: ['concat', 'multi'], dur: [5], }); -function main({ dur, len, num, type, chunks }) { +function main({ dur, len, n, type, chunks }) { const chunk = []; for (let i = 0; i < chunks; i++) { chunk.push(Buffer.allocUnsafe(Math.round(len / chunks))); @@ -28,11 +28,11 @@ function main({ dur, len, num, type, chunks }) { const onsend = type === 'concat' ? onsendConcat : onsendMulti; function onsendConcat() { - if (sent++ % num === 0) { + if (sent++ % n === 0) { // The setImmediate() is necessary to have event loop progress on OSes // that only perform synchronous I/O on nonblocking UDP sockets. setImmediate(() => { - for (let i = 0; i < num; i++) { + for (let i = 0; i < n; i++) { socket.send(Buffer.concat(chunk), PORT, '127.0.0.1', onsend); } }); @@ -40,11 +40,11 @@ function main({ dur, len, num, type, chunks }) { } function onsendMulti() { - if (sent++ % num === 0) { + if (sent++ % n === 0) { // The setImmediate() is necessary to have event loop progress on OSes // that only perform synchronous I/O on nonblocking UDP sockets. setImmediate(() => { - for (let i = 0; i < num; i++) { + for (let i = 0; i < n; i++) { socket.send(chunk, PORT, '127.0.0.1', onsend); } }); diff --git a/benchmark/dgram/multi-buffer.js b/benchmark/dgram/multi-buffer.js index 945d02c2d1c0e7..83d61daa36e1b7 100644 --- a/benchmark/dgram/multi-buffer.js +++ b/benchmark/dgram/multi-buffer.js @@ -5,18 +5,18 @@ const common = require('../common.js'); const dgram = require('dgram'); const PORT = common.PORT; -// `num` is the number of send requests to queue up each time. +// `n` is the number of send requests to queue up each time. // Keep it reasonably high (>10) otherwise you're benchmarking the speed of // event loop cycles more than anything else. const bench = common.createBenchmark(main, { - len: [64, 256, 1024], - num: [100], - chunks: [1, 2, 4, 8], + len: [64, 512, 1024], + n: [100], + chunks: [1, 8], type: ['send', 'recv'], dur: [5], }); -function main({ dur, len, num, type, chunks }) { +function main({ dur, len, n, type, chunks }) { const chunk = []; for (let i = 0; i < chunks; i++) { chunk.push(Buffer.allocUnsafe(Math.round(len / chunks))); @@ -26,11 +26,11 @@ function main({ dur, len, num, type, chunks }) { const socket = dgram.createSocket('udp4'); function onsend() { - if (sent++ % num === 0) { + if (sent++ % n === 0) { // The setImmediate() is necessary to have event loop progress on OSes // that only perform synchronous I/O on nonblocking UDP sockets. setImmediate(() => { - for (let i = 0; i < num; i++) { + for (let i = 0; i < n; i++) { socket.send(chunk, PORT, '127.0.0.1', onsend); } }); diff --git a/benchmark/dgram/offset-length.js b/benchmark/dgram/offset-length.js index ac0fee731eab20..85381da8de78e0 100644 --- a/benchmark/dgram/offset-length.js +++ b/benchmark/dgram/offset-length.js @@ -5,28 +5,28 @@ const common = require('../common.js'); const dgram = require('dgram'); const PORT = common.PORT; -// `num` is the number of send requests to queue up each time. +// `n` is the number of send requests to queue up each time. // Keep it reasonably high (>10) otherwise you're benchmarking the speed of // event loop cycles more than anything else. const bench = common.createBenchmark(main, { - len: [1, 64, 256, 1024], - num: [100], + len: [1, 512, 1024], + n: [100], type: ['send', 'recv'], dur: [5], }); -function main({ dur, len, num, type }) { +function main({ dur, len, n, type }) { const chunk = Buffer.allocUnsafe(len); let sent = 0; let received = 0; const socket = dgram.createSocket('udp4'); function onsend() { - if (sent++ % num === 0) { + if (sent++ % n === 0) { // The setImmediate() is necessary to have event loop progress on OSes // that only perform synchronous I/O on nonblocking UDP sockets. setImmediate(() => { - for (let i = 0; i < num; i++) { + for (let i = 0; i < n; i++) { socket.send(chunk, 0, chunk.length, PORT, '127.0.0.1', onsend); } }); diff --git a/benchmark/dgram/send-types.js b/benchmark/dgram/send-types.js new file mode 100644 index 00000000000000..47d69b3b3a9aab --- /dev/null +++ b/benchmark/dgram/send-types.js @@ -0,0 +1,52 @@ +'use strict'; + +const common = require('../common.js'); +const dgram = require('dgram'); +const { Buffer } = require('buffer'); + +const bench = common.createBenchmark(main, { + type: ['string', 'buffer', 'mixed', 'typedarray'], + chunks: [1, 4, 8, 16], + len: [64, 512, 1024], + n: [1000], +}); + +function main({ type, chunks, len, n }) { + const socket = dgram.createSocket('udp4'); + + let testData; + switch (type) { + case 'string': + testData = Array(chunks).fill('a'.repeat(len)); + break; + case 'buffer': + testData = Array(chunks).fill(Buffer.alloc(len, 'a')); + break; + case 'mixed': + testData = []; + for (let i = 0; i < chunks; i++) { + if (i % 2 === 0) { + testData.push(Buffer.alloc(len, 'a')); + } else { + testData.push('a'.repeat(len)); + } + } + break; + case 'typedarray': + testData = Array(chunks).fill(new Uint8Array(len).fill(97)); + break; + } + + bench.start(); + + for (let i = 0; i < n; i++) { + socket.send(testData, 12345, 'localhost', (err) => { + if (err && err.code !== 'ENOTCONN' && err.code !== 'ECONNREFUSED') { + throw err; + } + }); + } + + bench.end(n); + socket.close(); +} diff --git a/benchmark/dgram/single-buffer.js b/benchmark/dgram/single-buffer.js index 6a7fa3dde22942..bab8cee1594f24 100644 --- a/benchmark/dgram/single-buffer.js +++ b/benchmark/dgram/single-buffer.js @@ -10,23 +10,23 @@ const PORT = common.PORT; // event loop cycles more than anything else. const bench = common.createBenchmark(main, { len: [1, 64, 256, 1024], - num: [100], + n: [100], type: ['send', 'recv'], dur: [5], }); -function main({ dur, len, num, type }) { +function main({ dur, len, num: n, type }) { const chunk = Buffer.allocUnsafe(len); let sent = 0; let received = 0; const socket = dgram.createSocket('udp4'); function onsend() { - if (sent++ % num === 0) { + if (sent++ % n === 0) { // The setImmediate() is necessary to have event loop progress on OSes // that only perform synchronous I/O on nonblocking UDP sockets. setImmediate(() => { - for (let i = 0; i < num; i++) { + for (let i = 0; i < n; i++) { socket.send(chunk, PORT, '127.0.0.1', onsend); } }); diff --git a/benchmark/diagnostics_channel/publish.js b/benchmark/diagnostics_channel/publish.js index 3a30012ba692b8..6d8e40a6b733f6 100644 --- a/benchmark/diagnostics_channel/publish.js +++ b/benchmark/diagnostics_channel/publish.js @@ -1,29 +1,58 @@ 'use strict'; const common = require('../common.js'); -const dc = require('diagnostics_channel'); +const dc = require('node:diagnostics_channel'); const bench = common.createBenchmark(main, { n: [1e8], + checkSubscribers: [1, 0], + objSize: [10, 1e2, 1e3], subscribers: [0, 1, 10], }); function noop() {} -function main({ n, subscribers }) { +function createObj(size) { + return Array.from({ length: size }, (n) => ({ + foo: 'yarp', + nope: { + bar: '123', + a: [1, 2, 3], + baz: n, + c: {}, + b: [], + }, + })); +} + +function main({ n, subscribers, checkSubscribers, objSize }) { const channel = dc.channel('test'); for (let i = 0; i < subscribers; i++) { channel.subscribe(noop); } - const data = { - foo: 'bar', + const publishWithCheck = () => { + const data = createObj(objSize); + bench.start(); + for (let i = 0; i < n; i++) { + if (channel.hasSubscribers) { + channel.publish(data); + } + } + bench.end(n); }; - bench.start(); - for (let i = 0; i < n; i++) { - if (channel.hasSubscribers) { + const publishWithoutCheck = () => { + const data = createObj(objSize); + bench.start(); + for (let i = 0; i < n; i++) { channel.publish(data); } + bench.end(n); + }; + + if (checkSubscribers) { + publishWithCheck(); + } else { + publishWithoutCheck(); } - bench.end(n); } diff --git a/benchmark/diagnostics_channel/subscribe.js b/benchmark/diagnostics_channel/subscribe.js index 1415054588c4b1..c7cffac5edb7e1 100644 --- a/benchmark/diagnostics_channel/subscribe.js +++ b/benchmark/diagnostics_channel/subscribe.js @@ -3,17 +3,16 @@ const common = require('../common.js'); const dc = require('diagnostics_channel'); const bench = common.createBenchmark(main, { - n: [1e8], + n: [1e5], }); -function noop() {} +function noop() { } function main({ n }) { - const channel = dc.channel('channel.0'); bench.start(); for (let i = 0; i < n; i++) { - channel.subscribe(noop); + dc.subscribe('channel.0', noop); } bench.end(n); } diff --git a/benchmark/es/defaultparams-bench.js b/benchmark/es/defaultparams-bench.js index 4befe99177175b..1e42b0aed8a5cb 100644 --- a/benchmark/es/defaultparams-bench.js +++ b/benchmark/es/defaultparams-bench.js @@ -9,8 +9,8 @@ const bench = common.createBenchmark(main, { }); function oldStyleDefaults(x, y) { - x = x || 1; - y = y || 2; + x ||= 1; + y ||= 2; assert.strictEqual(x, 1); assert.strictEqual(y, 2); } diff --git a/benchmark/es/error-stack.js b/benchmark/es/error-stack.js index 907f308ea41558..2cc3321640c5cd 100644 --- a/benchmark/es/error-stack.js +++ b/benchmark/es/error-stack.js @@ -2,13 +2,19 @@ const common = require('../common.js'); const modPath = require.resolve('../fixtures/simple-error-stack.js'); +const nodeModulePath = require.resolve('../fixtures/node_modules/error-stack/simple-error-stack.js'); +const Module = require('node:module'); const bench = common.createBenchmark(main, { - method: ['without-sourcemap', 'sourcemap'], + method: [ + 'without-sourcemap', + 'sourcemap', + 'node-modules-without-sourcemap', + 'node-modules-sourcemap'], n: [1e5], }); -function runN(n) { +function runN(n, modPath) { delete require.cache[modPath]; const mod = require(modPath); bench.start(); @@ -22,11 +28,23 @@ function main({ n, method }) { switch (method) { case 'without-sourcemap': process.setSourceMapsEnabled(false); - runN(n); + runN(n, modPath); break; case 'sourcemap': process.setSourceMapsEnabled(true); - runN(n); + runN(n, modPath); + break; + case 'node-modules-without-sourcemap': + Module.setSourceMapsSupport(true, { + nodeModules: false, + }); + runN(n, nodeModulePath); + break; + case 'node-modules-sourcemap': + Module.setSourceMapsSupport(true, { + nodeModules: true, + }); + runN(n, nodeModulePath); break; default: throw new Error(`Unexpected method "${method}"`); diff --git a/benchmark/es/spread-assign.js b/benchmark/es/spread-assign.js deleted file mode 100644 index f0dcd56bb606b1..00000000000000 --- a/benchmark/es/spread-assign.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const common = require('../common.js'); -const util = require('util'); - -const bench = common.createBenchmark(main, { - method: ['spread', 'assign', '_extend'], - count: [5, 10, 20], - n: [1e6], -}); - -function main({ n, context, count, rest, method }) { - - const src = {}; - for (let n = 0; n < count; n++) - src[`p${n}`] = n; - - let obj; - - switch (method) { - case '_extend': - bench.start(); - for (let i = 0; i < n; i++) - obj = util._extend({}, src); - bench.end(n); - break; - case 'assign': - bench.start(); - for (let i = 0; i < n; i++) - obj = Object.assign({}, src); - bench.end(n); - break; - case 'spread': - bench.start(); - for (let i = 0; i < n; i++) - obj = { ...src }; // eslint-disable-line no-unused-vars - bench.end(n); - break; - default: - throw new Error('Unexpected method'); - } -} diff --git a/benchmark/eslint.config_partial.mjs b/benchmark/eslint.config_partial.mjs new file mode 100644 index 00000000000000..7f10460f71971b --- /dev/null +++ b/benchmark/eslint.config_partial.mjs @@ -0,0 +1,15 @@ +import { globals } from '../tools/eslint/eslint.config_utils.mjs'; + +export default [ + { + files: ['benchmark/**/*.{js,mjs,cjs}'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + rules: { + 'prefer-arrow-callback': 'error', + }, + }, +]; diff --git a/benchmark/esm/cjs-parse.js b/benchmark/esm/cjs-parse.js deleted file mode 100644 index 13516a93133290..00000000000000 --- a/benchmark/esm/cjs-parse.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; -const fs = require('fs'); -const path = require('path'); -const common = require('../common.js'); -const { strictEqual } = require('assert'); - -const tmpdir = require('../../test/common/tmpdir'); -const benchmarkDirectory = tmpdir.resolve('benchmark-esm-parse'); - -const bench = common.createBenchmark(main, { - n: [1e2], -}); - -async function main({ n }) { - tmpdir.refresh(); - - fs.mkdirSync(benchmarkDirectory); - - let sampleSource = 'try {\n'; - for (let i = 0; i < 1000; i++) { - sampleSource += 'sample.js(() => file = /test/);\n'; - } - sampleSource += '} catch {}\nexports.p = 5;\n'; - - for (let i = 0; i < n; i++) { - const sampleFile = path.join(benchmarkDirectory, `sample${i}.js`); - fs.writeFileSync(sampleFile, sampleSource); - } - - bench.start(); - for (let i = 0; i < n; i++) { - const sampleFile = path.join(benchmarkDirectory, `sample${i}.js`); - const m = await import('file:' + sampleFile); - strictEqual(m.p, 5); - } - bench.end(n); - - tmpdir.refresh(); -} diff --git a/benchmark/esm/detect-esm-syntax.js b/benchmark/esm/detect-esm-syntax.js index dfc347225f32d6..f12cb46ed77908 100644 --- a/benchmark/esm/detect-esm-syntax.js +++ b/benchmark/esm/detect-esm-syntax.js @@ -4,34 +4,33 @@ // We use the TypeScript fixture because it's a very large CommonJS file with no ESM syntax: the worst case. const common = require('../common.js'); const tmpdir = require('../../test/common/tmpdir.js'); -const fixtures = require('../../test/common/fixtures.js'); -const scriptPath = fixtures.path('snapshot', 'typescript.js'); const fs = require('node:fs'); const bench = common.createBenchmark(main, { - type: ['with-module-syntax-detection', 'without-module-syntax-detection'], + type: ['with-package-json', 'without-package-json'], n: [1e4], -}, { - flags: ['--experimental-detect-module'], }); -const benchmarkDirectory = tmpdir.fileURL('benchmark-detect-esm-syntax'); -const ambiguousURL = new URL('./typescript.js', benchmarkDirectory); -const explicitURL = new URL('./typescript.cjs', benchmarkDirectory); - async function main({ n, type }) { tmpdir.refresh(); + fs.mkdirSync(tmpdir.resolve('bench')); - fs.mkdirSync(benchmarkDirectory, { recursive: true }); - fs.cpSync(scriptPath, ambiguousURL); - fs.cpSync(scriptPath, explicitURL); - - bench.start(); - + let loader = ''; + const modules = []; for (let i = 0; i < n; i++) { - const url = type === 'with-module-syntax-detection' ? ambiguousURL : explicitURL; - await import(url); + const url = tmpdir.fileURL('bench', `mod${i}.js`); + fs.writeFileSync(url, `const foo${i} = ${i};\nexport { foo${i} };\n`); + loader += `import { foo${i} } from './mod${i}.js';\n`; + modules.push(url); } + const loaderURL = tmpdir.fileURL('bench', 'load.js'); + fs.writeFileSync(loaderURL, loader); + if (type === 'with-package-json') { + fs.writeFileSync(tmpdir.resolve('bench', 'package.json'), '{ "type": "module" }'); + } + + bench.start(); + await import(loaderURL); bench.end(n); } diff --git a/benchmark/esm/import-cjs.js b/benchmark/esm/import-cjs.js new file mode 100644 index 00000000000000..e3d4e19e476e12 --- /dev/null +++ b/benchmark/esm/import-cjs.js @@ -0,0 +1,41 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); +const fixtures = require('../../test/common/fixtures.js'); +const fs = require('fs'); + +// This fixture has 2000+ exports. +const fixtureFile = fixtures.path('snapshot', 'typescript.js'); +// This is fixed - typescript.js is slow to load, so 10 is enough. +// And we want to measure either 10 warm loads, or 1 cold load (but compare.js would run it many times) +const runs = 10; +const bench = common.createBenchmark(main, { + type: ['cold', 'warm'], +}, { + setup() { + tmpdir.refresh(); + fs.cpSync(fixtureFile, tmpdir.resolve(`imported-cjs-initial.js`)); + for (let i = 0; i < runs; i++) { + fs.cpSync(fixtureFile, tmpdir.resolve(`imported-cjs-${i}.js`)); + } + }, +}); + +async function main({ type }) { + if (type === 'cold') { + bench.start(); + await import(tmpdir.fileURL(`imported-cjs-initial.js`)); + bench.end(1); + } else { + await import(tmpdir.fileURL(`imported-cjs-initial.js`)); // Initialize the wasm first. + bench.start(); + let result; + for (let i = 0; i < runs; i++) { + result = await import(tmpdir.fileURL(`imported-cjs-${i}.js`)); + } + bench.end(runs); + const mod = require(fixtures.path('snapshot', 'typescript.js')); + assert.deepStrictEqual(Object.keys(mod), Object.keys(result.default)); + } +} diff --git a/benchmark/esm/import-meta.js b/benchmark/esm/import-meta.js index fd371cf60ed6a3..1f405a59a0a757 100644 --- a/benchmark/esm/import-meta.js +++ b/benchmark/esm/import-meta.js @@ -1,32 +1,53 @@ 'use strict'; const path = require('path'); -const { pathToFileURL, fileURLToPath } = require('url'); +const { pathToFileURL } = require('url'); const common = require('../common'); const assert = require('assert'); const bench = common.createBenchmark(main, { n: [1000], + valuesToRead: [ + 'dirname-and-filename', + 'dirname', + 'filename', + 'url', + ], }); -const file = pathToFileURL( - path.resolve(__filename, '../../fixtures/esm-dir-file.mjs'), -); -async function load(array, n) { +async function load(n, fixtureFileURL) { + const array = []; for (let i = 0; i < n; i++) { - array[i] = await import(`${file}?i=${i}`); + array[i] = await import(`${fixtureFileURL}?i=${i}`); } return array; } -function main({ n }) { - const array = []; - for (let i = 0; i < n; ++i) { - array.push({ dirname: '', filename: '', i: 0 }); - } +function main({ n, valuesToRead }) { + const fixtureDir = path.resolve(__filename, '../../fixtures'); + const fixtureFile = path.join(fixtureDir, `import-meta-${valuesToRead}.mjs`); + const fixtureFileURL = pathToFileURL(fixtureFile); - bench.start(); - load(array, n).then((arr) => { + load(n, fixtureFileURL).then((array) => { + const results = new Array(n); + bench.start(); + for (let i = 0; i < n; i++) { + results[i] = array[i].default(); + } bench.end(n); - assert.strictEqual(arr[n - 1].filename, fileURLToPath(file)); + + switch (valuesToRead) { + case 'dirname-and-filename': + assert.deepStrictEqual(results[n - 1], [fixtureDir, fixtureFile]); + break; + case 'dirname': + assert.strictEqual(results[n - 1], fixtureDir); + break; + case 'filename': + assert.strictEqual(results[n - 1], fixtureFile); + break; + case 'url': + assert.strictEqual(results[n - 1], `${fixtureFileURL}?i=${n - 1}`); + break; + } }); } diff --git a/benchmark/esm/require-esm.js b/benchmark/esm/require-esm.js new file mode 100644 index 00000000000000..8734d0d0bc09e9 --- /dev/null +++ b/benchmark/esm/require-esm.js @@ -0,0 +1,79 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +const path = require('path'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: ['all', 'access', 'load'], + exports: ['default', 'named'], + n: [1000], +}, { + flags: ['--experimental-require-module', '--no-warnings'], +}); + +function prepare(count, useDefault) { + tmpdir.refresh(); + const dir = tmpdir.resolve('modules'); + fs.mkdirSync(dir, { recursive: true }); + let mainSource = ''; + let useSource = 'exports.access = function() { return 0'; + for (let i = 0; i < count; ++i) { + let modSource = `const value${i} = 1;\n`; + if (useDefault) { + modSource += `export default { value${i} }\n`; + } else { + modSource += `export { value${i} };\n`; + } + const filename = `mod${i}.mjs`; + fs.writeFileSync( + path.resolve(dir, filename), + modSource, + 'utf8', + ); + mainSource += `const mod${i} = require('./modules/${filename}');\n`; + if (useDefault) { + useSource += ` + mod${i}.default.value${i}`; + } else { + useSource += ` + mod${i}.value${i}`; + } + } + useSource += '; };\n'; + const script = tmpdir.resolve('main.js'); + fs.writeFileSync(script, mainSource + useSource, 'utf8'); + return script; +} + +function main({ n, exports, type }) { + const script = prepare(n, exports === 'default'); + switch (type) { + case 'all': { + bench.start(); + const result = require(script).access(); + bench.end(n); + assert.strictEqual(result, n); + break; + } + case 'access': { + const { access } = require(script); + bench.start(); + let result = access(); + for (let i = 0; i < 99; ++i) { + result = access(); + } + bench.end(n * 100); + assert.strictEqual(result, n); + break; + } + case 'load': { + bench.start(); + const { access } = require(script); + bench.end(n); + const result = access(); + assert.strictEqual(result, n); + break; + } + } +} diff --git a/benchmark/events/eventtarget-add-remove-abort.js b/benchmark/events/eventtarget-add-remove-abort.js new file mode 100644 index 00000000000000..b1565c1f432a3e --- /dev/null +++ b/benchmark/events/eventtarget-add-remove-abort.js @@ -0,0 +1,25 @@ +'use strict'; +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + n: [1e5], + nListener: [1, 5, 10], +}); + +function main({ n, nListener }) { + const target = new EventTarget(); + const listeners = []; + for (let k = 0; k < nListener; k += 1) + listeners.push(() => {}); + + bench.start(); + for (let i = 0; i < n; i += 1) { + for (let k = listeners.length; --k >= 0;) { + target.addEventListener('abort', listeners[k]); + } + for (let k = listeners.length; --k >= 0;) { + target.removeEventListener('abort', listeners[k]); + } + } + bench.end(n); +} diff --git a/benchmark/events/eventtarget-add-remove.js b/benchmark/events/eventtarget-add-remove.js index a3defce03cfb8d..62048086d5d0bf 100644 --- a/benchmark/events/eventtarget-add-remove.js +++ b/benchmark/events/eventtarget-add-remove.js @@ -2,8 +2,8 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - n: [1e6], - nListener: [5, 10], + n: [1e5], + nListener: [1, 5, 10], }); function main({ n, nListener }) { diff --git a/benchmark/fixtures/basic-test-runner.js b/benchmark/fixtures/basic-test-runner.js new file mode 100644 index 00000000000000..d57f70da0d40a5 --- /dev/null +++ b/benchmark/fixtures/basic-test-runner.js @@ -0,0 +1,11 @@ +const { test } = require('node:test'); + +test('should pass', () => {}); +test('should fail', () => { throw new Error('fail'); }); +test('should skip', { skip: true }, () => {}); +test('parent', (t) => { + t.test('should fail', () => { throw new Error('fail'); }); + t.test('should pass but parent fail', (t, done) => { + setImmediate(done); + }); +}); diff --git a/benchmark/fixtures/esm-dir-file.mjs b/benchmark/fixtures/esm-dir-file.mjs deleted file mode 100644 index a1028d57afd56b..00000000000000 --- a/benchmark/fixtures/esm-dir-file.mjs +++ /dev/null @@ -1,2 +0,0 @@ -export const dirname = import.meta.dirname; -export const filename = import.meta.filename; diff --git a/benchmark/fixtures/import-meta-dirname-and-filename.mjs b/benchmark/fixtures/import-meta-dirname-and-filename.mjs new file mode 100644 index 00000000000000..1f92bc85f52692 --- /dev/null +++ b/benchmark/fixtures/import-meta-dirname-and-filename.mjs @@ -0,0 +1 @@ +export default () => [ import.meta.dirname, import.meta.filename ]; diff --git a/benchmark/fixtures/import-meta-dirname.mjs b/benchmark/fixtures/import-meta-dirname.mjs new file mode 100644 index 00000000000000..f8ee699d31416e --- /dev/null +++ b/benchmark/fixtures/import-meta-dirname.mjs @@ -0,0 +1 @@ +export default () => import.meta.dirname; diff --git a/benchmark/fixtures/import-meta-filename.mjs b/benchmark/fixtures/import-meta-filename.mjs new file mode 100644 index 00000000000000..ecec26d09c74c7 --- /dev/null +++ b/benchmark/fixtures/import-meta-filename.mjs @@ -0,0 +1 @@ +export default () => import.meta.filename; diff --git a/benchmark/fixtures/import-meta-url.mjs b/benchmark/fixtures/import-meta-url.mjs new file mode 100644 index 00000000000000..a924853bcc7113 --- /dev/null +++ b/benchmark/fixtures/import-meta-url.mjs @@ -0,0 +1 @@ +export default () => import.meta.url; diff --git a/benchmark/fixtures/node_modules/error-stack/simple-error-stack.js b/benchmark/fixtures/node_modules/error-stack/simple-error-stack.js new file mode 100644 index 00000000000000..33c3ad7f324d40 --- /dev/null +++ b/benchmark/fixtures/node_modules/error-stack/simple-error-stack.js @@ -0,0 +1,16 @@ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.simpleErrorStack = simpleErrorStack; +// Compile with `tsc --inlineSourceMap benchmark/fixtures/node_modules/error-stack/simple-error-stack.ts`. +var lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; +function simpleErrorStack() { + [1].map(function () { + try { + lorem.BANG(); + } + catch (e) { + return e.stack; + } + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWVycm9yLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltcGxlLWVycm9yLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFpQlgsNENBQWdCO0FBZmxCLGlGQUFpRjtBQUVqRixJQUFNLEtBQUssR0FBRywrYkFBK2IsQ0FBQztBQUU5YyxTQUFTLGdCQUFnQjtJQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNOLElBQUksQ0FBQztZQUNGLEtBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIn0= diff --git a/benchmark/fixtures/node_modules/error-stack/simple-error-stack.ts b/benchmark/fixtures/node_modules/error-stack/simple-error-stack.ts new file mode 100644 index 00000000000000..58d3d7eedd2f1b --- /dev/null +++ b/benchmark/fixtures/node_modules/error-stack/simple-error-stack.ts @@ -0,0 +1,19 @@ +'use strict'; + +// Compile with `tsc --inlineSourceMap benchmark/fixtures/node_modules/error-stack/simple-error-stack.ts`. + +const lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; + +function simpleErrorStack() { + [1].map(() => { + try { + (lorem as any).BANG(); + } catch (e) { + return e.stack; + } + }) +} + +export { + simpleErrorStack, +}; diff --git a/benchmark/fixtures/simple-error-stack.js b/benchmark/fixtures/simple-error-stack.js index 0057807795b072..74aae191800778 100644 --- a/benchmark/fixtures/simple-error-stack.js +++ b/benchmark/fixtures/simple-error-stack.js @@ -1,15 +1,16 @@ 'use strict'; -exports.__esModule = true; -exports.simpleErrorStack = void 0; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.simpleErrorStack = simpleErrorStack; // Compile with `tsc --inlineSourceMap benchmark/fixtures/simple-error-stack.ts`. var lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; function simpleErrorStack() { - try { - lorem.BANG(); - } - catch (e) { - return e.stack; - } + [1].map(function () { + try { + lorem.BANG(); + } + catch (e) { + return e.stack; + } + }); } -exports.simpleErrorStack = simpleErrorStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWVycm9yLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltcGxlLWVycm9yLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsaUZBQWlGO0FBRWpGLElBQU0sS0FBSyxHQUFHLCtiQUErYixDQUFDO0FBRTljLFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUk7UUFDRCxLQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDdkI7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUNoQjtBQUNILENBQUM7QUFHQyw0Q0FBZ0IifQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWVycm9yLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltcGxlLWVycm9yLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFpQlgsNENBQWdCO0FBZmxCLGlGQUFpRjtBQUVqRixJQUFNLEtBQUssR0FBRywrYkFBK2IsQ0FBQztBQUU5YyxTQUFTLGdCQUFnQjtJQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNOLElBQUksQ0FBQztZQUNGLEtBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIn0= \ No newline at end of file diff --git a/benchmark/fixtures/simple-error-stack.ts b/benchmark/fixtures/simple-error-stack.ts index 58034e92f24b98..1335df3478b99b 100644 --- a/benchmark/fixtures/simple-error-stack.ts +++ b/benchmark/fixtures/simple-error-stack.ts @@ -5,11 +5,13 @@ const lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; function simpleErrorStack() { - try { - (lorem as any).BANG(); - } catch (e) { - return e.stack; - } + [1].map(() => { + try { + (lorem as any).BANG(); + } catch (e) { + return e.stack; + } + }) } export { diff --git a/benchmark/fixtures/strip-types-benchmark.js b/benchmark/fixtures/strip-types-benchmark.js new file mode 100644 index 00000000000000..3244114dea3cf7 --- /dev/null +++ b/benchmark/fixtures/strip-types-benchmark.js @@ -0,0 +1,21 @@ +function processData(input) { + return { + ...input, + b: input.b + 1 + }; +} + +const data = { + a: "test", + b: 42, + c: true, + d: { + e: ["hello", "world"], + f: { + g: 100, + h: ["str", 123, false] + } + } +}; + +export const result = processData(data); diff --git a/benchmark/fixtures/strip-types-benchmark.ts b/benchmark/fixtures/strip-types-benchmark.ts new file mode 100644 index 00000000000000..0f0185c2d7dc52 --- /dev/null +++ b/benchmark/fixtures/strip-types-benchmark.ts @@ -0,0 +1,34 @@ +type ComplexType = { + a: string; + b: number; + c: boolean; + d: { + e: string[]; + f: { + g: number; + h: [string, number, boolean]; + }; + }; +}; + +function processData(input: ComplexType): ComplexType { + return { + ...input, + b: input.b + 1 + }; +} + +const data: ComplexType = { + a: "test", + b: 42, + c: true, + d: { + e: ["hello", "world"], + f: { + g: 100, + h: ["str", 123, false] + } + } +}; + +export const result = processData(data); diff --git a/benchmark/fixtures/transform-types-benchmark.js b/benchmark/fixtures/transform-types-benchmark.js new file mode 100644 index 00000000000000..c0946942179fe3 --- /dev/null +++ b/benchmark/fixtures/transform-types-benchmark.js @@ -0,0 +1,28 @@ +var Color; +(function (Color) { + Color[Color["Red"] = 0] = "Red"; + Color[Color["Green"] = 1] = "Green"; + Color[Color["Blue"] = 2] = "Blue"; +})(Color || (Color = {})); +var Geometry; +(function (Geometry) { + class Circle { + constructor(center, radius) { + this.center = center; + this.radius = radius; + } + area() { + return Math.PI * Math.pow(this.radius, 2); + } + } + Geometry.Circle = Circle; +})(Geometry || (Geometry = {})); +function processShape(color, shape) { + const colorName = Color[color]; + const area = shape.area().toFixed(2); + return `A ${colorName} circle with area ${area}`; +} + +const point = { x: 0, y: 0 }; +const circle = new Geometry.Circle(point, 5); +export const result = processShape(Color.Blue, circle); diff --git a/benchmark/fixtures/transform-types-benchmark.ts b/benchmark/fixtures/transform-types-benchmark.ts new file mode 100644 index 00000000000000..69c13af4ee4d7c --- /dev/null +++ b/benchmark/fixtures/transform-types-benchmark.ts @@ -0,0 +1,30 @@ +enum Color { + Red, + Green, + Blue +} + +namespace Geometry { + export interface Point { + x: number; + y: number; + } + + export class Circle { + constructor(public center: Point, public radius: number) { } + + area(): number { + return Math.PI * this.radius ** 2; + } + } +} + +function processShape(color: Color, shape: Geometry.Circle): string { + const colorName = Color[color]; + const area = shape.area().toFixed(2); + return `A ${colorName} circle with area ${area}`; +} + +const point: Geometry.Point = { x: 0, y: 0 }; +const circle = new Geometry.Circle(point, 5); +export const result = processShape(Color.Blue, circle); diff --git a/benchmark/fixtures/valid.env b/benchmark/fixtures/valid.env new file mode 100644 index 00000000000000..6df454da653137 --- /dev/null +++ b/benchmark/fixtures/valid.env @@ -0,0 +1,69 @@ +BASIC=basic + +# COMMENTS=work +#BASIC=basic2 +#BASIC=basic3 + +# previous line intentionally left blank +AFTER_LINE=after_line +A="B=C" +B=C=D +EMPTY= +EMPTY_SINGLE_QUOTES='' +EMPTY_DOUBLE_QUOTES="" +EMPTY_BACKTICKS=`` +SINGLE_QUOTES='single_quotes' +SINGLE_QUOTES_SPACED=' single quotes ' +DOUBLE_QUOTES="double_quotes" +DOUBLE_QUOTES_SPACED=" double quotes " +DOUBLE_QUOTES_INSIDE_SINGLE='double "quotes" work inside single quotes' +DOUBLE_QUOTES_WITH_NO_SPACE_BRACKET="{ port: $MONGOLAB_PORT}" +SINGLE_QUOTES_INSIDE_DOUBLE="single 'quotes' work inside double quotes" +BACKTICKS_INSIDE_SINGLE='`backticks` work inside single quotes' +BACKTICKS_INSIDE_DOUBLE="`backticks` work inside double quotes" +BACKTICKS=`backticks` +BACKTICKS_SPACED=` backticks ` +DOUBLE_QUOTES_INSIDE_BACKTICKS=`double "quotes" work inside backticks` +SINGLE_QUOTES_INSIDE_BACKTICKS=`single 'quotes' work inside backticks` +DOUBLE_AND_SINGLE_QUOTES_INSIDE_BACKTICKS=`double "quotes" and single 'quotes' work inside backticks` +EXPAND_NEWLINES="expand\nnew\nlines" +DONT_EXPAND_UNQUOTED=dontexpand\nnewlines +DONT_EXPAND_SQUOTED='dontexpand\nnewlines' +# COMMENTS=work +INLINE_COMMENTS=inline comments # work #very #well +INLINE_COMMENTS_SINGLE_QUOTES='inline comments outside of #singlequotes' # work +INLINE_COMMENTS_DOUBLE_QUOTES="inline comments outside of #doublequotes" # work +INLINE_COMMENTS_BACKTICKS=`inline comments outside of #backticks` # work +INLINE_COMMENTS_SPACE=inline comments start with a#number sign. no space required. +EQUAL_SIGNS=equals== +RETAIN_INNER_QUOTES={"foo": "bar"} +RETAIN_INNER_QUOTES_AS_STRING='{"foo": "bar"}' +RETAIN_INNER_QUOTES_AS_BACKTICKS=`{"foo": "bar's"}` +TRIM_SPACE_FROM_UNQUOTED= some spaced out string +SPACE_BEFORE_DOUBLE_QUOTES= "space before double quotes" +EMAIL=therealnerdybeast@example.tld + SPACED_KEY = parsed +EDGE_CASE_INLINE_COMMENTS="VALUE1" # or "VALUE2" or "VALUE3" + +MULTI_DOUBLE_QUOTED="THIS +IS +A +MULTILINE +STRING" + +MULTI_SINGLE_QUOTED='THIS +IS +A +MULTILINE +STRING' + +MULTI_BACKTICKED=`THIS +IS +A +"MULTILINE'S" +STRING` +export EXPORT_EXAMPLE = ignore export + +MULTI_NOT_VALID_QUOTE=" +MULTI_NOT_VALID=THIS +IS NOT MULTILINE diff --git a/benchmark/fs/bench-accessSync.js b/benchmark/fs/bench-accessSync.js index bf0718634b1d01..0be0ca799d3a36 100644 --- a/benchmark/fs/bench-accessSync.js +++ b/benchmark/fs/bench-accessSync.js @@ -10,6 +10,7 @@ fs.writeFileSync(tmpfile, 'this-is-for-a-benchmark', 'utf8'); const bench = common.createBenchmark(main, { type: ['existing', 'non-existing', 'non-flat-existing'], + method: ['access', 'accessSync'], n: [1e5], }); @@ -23,7 +24,17 @@ function runBench(n, path) { } } -function main({ n, type }) { +function runAsyncBench(n, path) { + (function r(cntr, path) { + if (cntr-- <= 0) + return bench.end(n); + fs.access(path, () => { + r(cntr, path); + }); + })(n, path); +} + +function main({ n, type, method }) { let path; switch (type) { @@ -39,10 +50,19 @@ function main({ n, type }) { default: new Error('Invalid type'); } - // warmup - runBench(n, path); - bench.start(); - runBench(n, path); - bench.end(n); + if (method === 'access') { + // Warmup the filesystem - it doesn't need to use the async method + runBench(n, path); + + bench.start(); + runAsyncBench(n, path); + } else { + // warmup + runBench(n, path); + + bench.start(); + runBench(n, path); + bench.end(n); + } } diff --git a/benchmark/fs/bench-chownSync.js b/benchmark/fs/bench-chownSync.js index d07f3b65949979..18e2bd35d5264c 100644 --- a/benchmark/fs/bench-chownSync.js +++ b/benchmark/fs/bench-chownSync.js @@ -45,7 +45,7 @@ function main({ n, type, method }) { } } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/bench-cpSync.js b/benchmark/fs/bench-cpSync.js new file mode 100644 index 00000000000000..822036726d198d --- /dev/null +++ b/benchmark/fs/bench-cpSync.js @@ -0,0 +1,59 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const path = require('path'); +const tmpdir = require('../../test/common/tmpdir'); + +const bench = common.createBenchmark(main, { + n: [1, 100, 10_000], + dereference: ['true', 'false'], + // When `force` is `true` the `cpSync` function is called twice the second + // time however an `ERR_FS_CP_EINVAL` is thrown, so skip `true` for the time being + // TODO: allow `force` to also be `true` once https://github.com/nodejs/node/issues/58468 is addressed + force: ['false'], +}); + +function prepareTestDirectory() { + const testDir = tmpdir.resolve(`test-cp-${process.pid}`); + fs.mkdirSync(testDir, { recursive: true }); + + fs.writeFileSync(path.join(testDir, 'source.txt'), 'test content'); + + fs.symlinkSync( + path.join(testDir, 'source.txt'), + path.join(testDir, 'link.txt'), + ); + + return testDir; +} + +function main({ n, dereference, force }) { + tmpdir.refresh(); + + const src = prepareTestDirectory(); + const dest = tmpdir.resolve(`${process.pid}/subdir/cp-bench-${process.pid}`); + + const options = { + recursive: true, + dereference: dereference === 'true', + force: force === 'true', + }; + + if (options.force) { + fs.cpSync(src, dest, { recursive: true }); + } + + bench.start(); + for (let i = 0; i < n; i++) { + if (options.force) { + fs.cpSync(src, dest, options); + } else { + const uniqueDest = tmpdir.resolve( + `${process.pid}/subdir/cp-bench-${process.pid}-${i}`, + ); + fs.cpSync(src, uniqueDest, options); + } + } + bench.end(n); +} diff --git a/benchmark/fs/bench-linkSync.js b/benchmark/fs/bench-linkSync.js index 7c3ef29291913e..ead39c338fe6c8 100644 --- a/benchmark/fs/bench-linkSync.js +++ b/benchmark/fs/bench-linkSync.js @@ -41,7 +41,7 @@ function main({ n, type }) { } } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/bench-openSync.js b/benchmark/fs/bench-openSync.js index eaa56139dcbf3c..b17c0a1e67f8a7 100644 --- a/benchmark/fs/bench-openSync.js +++ b/benchmark/fs/bench-openSync.js @@ -10,6 +10,18 @@ const bench = common.createBenchmark(main, { n: [1e5], }); +function runBench({ n, path }) { + for (let i = 0; i < n; i++) { + try { + const fd = fs.openSync(path, 'r', 0o666); + fs.closeSync(fd); + } catch { + // do nothing + } + } +} + + function main({ n, type }) { let path; @@ -24,14 +36,9 @@ function main({ n, type }) { new Error('Invalid type'); } + runBench({ n, path }); + bench.start(); - for (let i = 0; i < n; i++) { - try { - const fd = fs.openSync(path, 'r', 0o666); - fs.closeSync(fd); - } catch { - // do nothing - } - } + runBench({ n, path }); bench.end(n); } diff --git a/benchmark/fs/bench-readlinkSync.js b/benchmark/fs/bench-readlinkSync.js index 15c22273e557b6..9b3bbceb42e92f 100644 --- a/benchmark/fs/bench-readlinkSync.js +++ b/benchmark/fs/bench-readlinkSync.js @@ -30,7 +30,7 @@ function main({ n, type }) { returnValue = fs.readlinkSync(tmpdir.resolve(`.readlink-sync-${i}`), { encoding: 'utf8' }); } bench.end(n); - assert(returnValue); + assert.ok(returnValue); break; } @@ -45,7 +45,7 @@ function main({ n, type }) { } } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/bench-readvSync.js b/benchmark/fs/bench-readvSync.js index c163429b5f6212..21f61ba7e9b7bc 100644 --- a/benchmark/fs/bench-readvSync.js +++ b/benchmark/fs/bench-readvSync.js @@ -49,7 +49,7 @@ function main({ n, type }) { } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/bench-renameSync.js b/benchmark/fs/bench-renameSync.js index 9f9f5e4e84cda0..2c4c5a39eeb0f4 100644 --- a/benchmark/fs/bench-renameSync.js +++ b/benchmark/fs/bench-renameSync.js @@ -23,7 +23,7 @@ function main({ n, type }) { } } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } case 'valid': { diff --git a/benchmark/fs/bench-symlinkSync.js b/benchmark/fs/bench-symlinkSync.js index 5bf4e0e50779d9..92ceb3579a42e3 100644 --- a/benchmark/fs/bench-symlinkSync.js +++ b/benchmark/fs/bench-symlinkSync.js @@ -42,7 +42,7 @@ function main({ n, type }) { } } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/bench-writevSync.js b/benchmark/fs/bench-writevSync.js index 596359c6750011..bdcd0919050b4a 100644 --- a/benchmark/fs/bench-writevSync.js +++ b/benchmark/fs/bench-writevSync.js @@ -30,7 +30,7 @@ function main({ n, type }) { } bench.end(n); - assert(result); + assert.ok(result); fs.closeSync(fd); break; case 'invalid': { @@ -46,7 +46,7 @@ function main({ n, type }) { } bench.end(n); - assert(hasError); + assert.ok(hasError); break; } default: diff --git a/benchmark/fs/read-stream-throughput.js b/benchmark/fs/read-stream-throughput.js index 9d4431d360e7d2..e3705b6c327f45 100644 --- a/benchmark/fs/read-stream-throughput.js +++ b/benchmark/fs/read-stream-throughput.js @@ -67,7 +67,7 @@ function main(conf) { } function runTest(filesize, highWaterMark, encoding, n) { - assert(fs.statSync(filename).size === filesize * n); + assert.strictEqual(fs.statSync(filename).size, filesize * n); const rs = fs.createReadStream(filename, { highWaterMark, encoding, diff --git a/benchmark/fs/readFileSync.js b/benchmark/fs/readFileSync.js index 800ab31450f43a..bfa00070b15772 100644 --- a/benchmark/fs/readFileSync.js +++ b/benchmark/fs/readFileSync.js @@ -4,7 +4,7 @@ const common = require('../common.js'); const fs = require('fs'); const bench = common.createBenchmark(main, { - encoding: ['undefined', 'utf8'], + encoding: ['undefined', 'utf8', 'ascii'], path: ['existing', 'non-existing'], hasFileDescriptor: ['true', 'false'], n: [1e4], diff --git a/benchmark/fs/readfile-permission-enabled.js b/benchmark/fs/readfile-permission-enabled.js index 46f20be6a0b06e..4d784ab343467a 100644 --- a/benchmark/fs/readfile-permission-enabled.js +++ b/benchmark/fs/readfile-permission-enabled.js @@ -12,12 +12,12 @@ const filename = tmpdir.resolve(`.removeme-benchmark-garbage-${process.pid}`); const bench = common.createBenchmark(main, { duration: [5], - encoding: ['', 'utf-8'], - len: [1024, 16 * 1024 * 1024], + encoding: ['utf-8'], + len: [1024], concurrent: [1, 10], }, { flags: [ - '--experimental-permission', + '--permission', '--allow-fs-read=*', '--allow-fs-write=*', '--allow-child-process', diff --git a/benchmark/fs/readfile.js b/benchmark/fs/readfile.js index 9f74508042205f..58ea110159c1d7 100644 --- a/benchmark/fs/readfile.js +++ b/benchmark/fs/readfile.js @@ -12,7 +12,7 @@ const filename = tmpdir.resolve(`.removeme-benchmark-garbage-${process.pid}`); const bench = common.createBenchmark(main, { duration: [5], - encoding: ['', 'utf-8'], + encoding: ['', 'utf-8', 'ascii'], len: [1024, 16 * 1024 * 1024], concurrent: [1, 10], }); diff --git a/benchmark/fs/writefile-promises.js b/benchmark/fs/writefile-promises.js index 41c029051bc04d..f271d837115406 100644 --- a/benchmark/fs/writefile-promises.js +++ b/benchmark/fs/writefile-promises.js @@ -39,8 +39,17 @@ function main({ encodingType, duration, concurrent, size }) { let writes = 0; let waitConcurrent = 0; - const startedAt = Date.now(); - const endAt = startedAt + (duration * 1000); + let startedAt = Date.now(); + let endAt = startedAt + duration * 1000; + + // fs warmup + for (let i = 0; i < concurrent; i++) write(); + + writes = 0; + waitConcurrent = 0; + + startedAt = Date.now(); + endAt = startedAt + duration * 1000; bench.start(); @@ -59,7 +68,8 @@ function main({ encodingType, duration, concurrent, size }) { } function write() { - fs.promises.writeFile(`${filename}-${filesWritten++}`, chunk, encoding) + fs.promises + .writeFile(`${filename}-${filesWritten++}`, chunk, encoding) .then(() => afterWrite()) .catch((err) => afterWrite(err)); } @@ -72,7 +82,7 @@ function main({ encodingType, duration, concurrent, size }) { writes++; const benchEnded = Date.now() >= endAt; - if (benchEnded && (++waitConcurrent) === concurrent) { + if (benchEnded && ++waitConcurrent === concurrent) { stop(); } else if (!benchEnded) { write(); diff --git a/benchmark/http/bench-parser.js b/benchmark/http/bench-parser.js index 6b8bbd8808c720..0a1e8f7b5e8a0f 100644 --- a/benchmark/http/bench-parser.js +++ b/benchmark/http/bench-parser.js @@ -16,7 +16,6 @@ function main({ len, n }) { const kOnHeadersComplete = HTTPParser.kOnHeadersComplete | 0; const kOnBody = HTTPParser.kOnBody | 0; const kOnMessageComplete = HTTPParser.kOnMessageComplete | 0; - const CRLF = '\r\n'; function processHeader(header, n) { const parser = newParser(REQUEST); @@ -43,12 +42,12 @@ function main({ len, n }) { return parser; } - let header = `GET /hello HTTP/1.1${CRLF}Content-Type: text/plain${CRLF}`; + let header = `GET /hello HTTP/1.1\r\nContent-Type: text/plain\r\n`; for (let i = 0; i < len; i++) { - header += `X-Filler${i}: ${Math.random().toString(36).substr(2)}${CRLF}`; + header += `X-Filler${i}: ${Math.random().toString(36).substring(2)}\r\n`; } - header += CRLF; + header += '\r\n'; processHeader(Buffer.from(header), n); } diff --git a/benchmark/http/headers.js b/benchmark/http/headers.js index e995f380cef151..62612d9fda1911 100644 --- a/benchmark/http/headers.js +++ b/benchmark/http/headers.js @@ -4,10 +4,22 @@ const common = require('../common.js'); const http = require('http'); const bench = common.createBenchmark(main, { - n: [10, 600], - len: [1, 100], - duration: 5, -}); + fewHeaders: { + n: [10], + len: [1, 5], + duration: 5, + }, + mediumHeaders: { + n: [50], + len: [1, 10], + duration: 5, + }, + manyHeaders: { + n: [600], + len: [1, 100], + duration: 5, + }, +}, { byGroups: true }); function main({ len, n, duration }) { const headers = { @@ -15,10 +27,9 @@ function main({ len, n, duration }) { 'Transfer-Encoding': 'chunked', }; - // TODO(BridgeAR): Change this benchmark to use grouped arguments when - // implemented. https://github.com/nodejs/node/issues/26425 - const Is = [ ...Array(Math.max(n / len, 1)).keys() ]; - const Js = [ ...Array(len).keys() ]; + const Is = [...Array(n / len).keys()]; + const Js = [...Array(len).keys()]; + for (const i of Is) { headers[`foo${i}`] = Js.map(() => `some header value ${i}`); } @@ -27,6 +38,7 @@ function main({ len, n, duration }) { res.writeHead(200, headers); res.end(); }); + server.listen(0, () => { bench.http({ path: '/', diff --git a/benchmark/internal/util_isinsidenodemodules.js b/benchmark/internal/util_isinsidenodemodules.js new file mode 100644 index 00000000000000..b75ef5614143d4 --- /dev/null +++ b/benchmark/internal/util_isinsidenodemodules.js @@ -0,0 +1,51 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], + stackCount: [99, 101], + method: ['isInsideNodeModules', 'noop'], +}, { + flags: ['--expose-internals', '--disable-warning=internal/test/binding'], +}); + +function main({ n, stackCount, method }) { + const { internalBinding } = require('internal/test/binding'); + const { isInsideNodeModules } = internalBinding('util'); + + const testFunction = method === 'noop' ? + () => { + bench.start(); + for (let i = 0; i < n; i++) { + noop(); + } + bench.end(n); + } : + () => { + Error.stackTraceLimit = Infinity; + const existingStackFrameCount = new Error().stack.split('\n').length - 1; + assert.strictEqual(existingStackFrameCount, stackCount); + + bench.start(); + for (let i = 0; i < n; i++) { + isInsideNodeModules(); + } + bench.end(n); + }; + + // Excluding the message line. + const existingStackFrameCount = new Error().stack.split('\n').length - 1; + // Excluding the test function itself. + nestCallStack(stackCount - existingStackFrameCount - 1, testFunction); +} + +function nestCallStack(depth, callback) { + // nestCallStack(1) already adds a stack frame, so we stop at 1. + if (depth === 1) { + return callback(); + } + return nestCallStack(depth - 1, callback); +} + +function noop() {} diff --git a/benchmark/misc/punycode.js b/benchmark/misc/punycode.js deleted file mode 100644 index a4fda4168da47c..00000000000000 --- a/benchmark/misc/punycode.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -const common = require('../common.js'); -let icu; -try { - icu = common.binding('icu'); -} catch { - // Continue regardless of error. -} -const punycode = require('punycode'); - -const bench = common.createBenchmark(main, { - method: ['punycode'].concat(icu !== undefined ? ['icu'] : []), - n: [1024], - val: [ - 'افغانستا.icom.museum', - 'الجزائر.icom.museum', - 'österreich.icom.museum', - 'বাংলাদেশ.icom.museum', - 'беларусь.icom.museum', - 'belgië.icom.museum', - 'българия.icom.museum', - 'تشادر.icom.museum', - '中国.icom.museum', - 'القمر.icom.museum', - 'κυπρος.icom.museum', - 'českárepublika.icom.museum', - 'مصر.icom.museum', - 'ελλάδα.icom.museum', - 'magyarország.icom.museum', - 'ísland.icom.museum', - 'भारत.icom.museum', - 'ايران.icom.museum', - 'éire.icom.museum', - 'איקו״ם.ישראל.museum', - '日本.icom.museum', - 'الأردن.icom.museum', - ], -}); - -function usingPunycode(val) { - punycode.toUnicode(punycode.toASCII(val)); -} - -function usingICU(val) { - icu.toUnicode(icu.toASCII(val)); -} - -function runPunycode(n, val) { - for (let i = 0; i < n; i++) - usingPunycode(val); - bench.start(); - for (let i = 0; i < n; i++) - usingPunycode(val); - bench.end(n); -} - -function runICU(n, val) { - bench.start(); - for (let i = 0; i < n; i++) - usingICU(val); - bench.end(n); -} - -function main({ n, val, method }) { - switch (method) { - case 'punycode': - runPunycode(n, val); - break; - case 'icu': - if (icu !== undefined) { - runICU(n, val); - break; - } - // fallthrough - default: - throw new Error(`Unexpected method "${method}"`); - } -} diff --git a/benchmark/misc/startup-cli-version.js b/benchmark/misc/startup-cli-version.js index 4dbeb81fc70740..a553f90621f45d 100644 --- a/benchmark/misc/startup-cli-version.js +++ b/benchmark/misc/startup-cli-version.js @@ -9,19 +9,21 @@ const path = require('path'); // tends to be minimal and fewer operations are done to generate // these so that the startup cost is still dominated by a more // indispensible part of the CLI. +// NOTE: not all tools are present in tarball hence need to filter +const availableCli = [ + 'tools/eslint/node_modules/eslint/bin/eslint.js', + 'deps/npm/bin/npx-cli.js', + 'deps/npm/bin/npm-cli.js', + 'deps/corepack/dist/corepack.js', +].filter((cli) => existsSync(path.resolve(__dirname, '../../', cli))); const bench = common.createBenchmark(main, { - cli: [ - 'tools/node_modules/eslint/bin/eslint.js', - 'deps/npm/bin/npx-cli.js', - 'deps/npm/bin/npm-cli.js', - 'deps/corepack/dist/corepack.js', - ], - count: [30], + cli: availableCli, + n: [30], }); function spawnProcess(cli, bench, state) { const cmd = process.execPath || process.argv[0]; - while (state.finished < state.count) { + while (state.finished < state.n) { const child = spawnSync(cmd, [cli, '--version'], { env: { npm_config_loglevel: 'silent', ...process.env }, }); @@ -39,19 +41,15 @@ function spawnProcess(cli, bench, state) { bench.start(); } - if (state.finished === state.count) { - bench.end(state.count); + if (state.finished === state.n) { + bench.end(state.n); } } } -function main({ count, cli }) { +function main({ n, cli }) { cli = path.resolve(__dirname, '../../', cli); - if (!existsSync(cli)) { - return; - } - const warmup = 3; - const state = { count, finished: -warmup }; + const state = { n, finished: -warmup }; spawnProcess(cli, bench, state); } diff --git a/benchmark/misc/startup-core.js b/benchmark/misc/startup-core.js index d16a989fd2ce75..053a1ec0cbff8f 100644 --- a/benchmark/misc/startup-core.js +++ b/benchmark/misc/startup-core.js @@ -12,12 +12,12 @@ const bench = common.createBenchmark(main, { 'test/fixtures/snapshot/typescript', ], mode: ['process', 'worker'], - count: [30], + n: [30], }); function spawnProcess(script, bench, state) { const cmd = process.execPath || process.argv[0]; - while (state.finished < state.count) { + while (state.finished < state.n) { const child = spawnSync(cmd, [script]); if (child.status !== 0) { console.log('---- STDOUT ----'); @@ -32,8 +32,8 @@ function spawnProcess(script, bench, state) { bench.start(); } - if (state.finished === state.count) { - bench.end(state.count); + if (state.finished === state.n) { + bench.end(state.n); } } } @@ -49,18 +49,18 @@ function spawnWorker(script, bench, state) { // Finished warmup. bench.start(); } - if (state.finished < state.count) { + if (state.finished < state.n) { spawnWorker(script, bench, state); } else { - bench.end(state.count); + bench.end(state.n); } }); } -function main({ count, script, mode }) { +function main({ n, script, mode }) { script = path.resolve(__dirname, '../../', `${script}.js`); const warmup = 3; - const state = { count, finished: -warmup }; + const state = { n, finished: -warmup }; if (mode === 'worker') { Worker = require('worker_threads').Worker; spawnWorker(script, bench, state); diff --git a/benchmark/module/module-loader.js b/benchmark/module/module-loader.js index a885207ff6393a..0b7700c10aa111 100644 --- a/benchmark/module/module-loader.js +++ b/benchmark/module/module-loader.js @@ -16,7 +16,7 @@ const bench = common.createBenchmark(main, { files: [5e2], n: [1, 1e3], cache: ['true', 'false'], -}); +}, { flags: '--no-warnings' }); function main({ n, name, cache, files, dir }) { tmpdir.refresh(); diff --git a/benchmark/module/module-require.js b/benchmark/module/module-require.js index 5346366dc8e8b7..472f943746b785 100644 --- a/benchmark/module/module-require.js +++ b/benchmark/module/module-require.js @@ -8,12 +8,15 @@ const benchmarkDirectory = tmpdir.resolve('nodejs-benchmark-module'); const bench = common.createBenchmark(main, { type: ['.js', '.json', 'dir'], n: [1e4], +}, { + setup(configs) { + tmpdir.refresh(); + const maxN = configs.reduce((max, c) => Math.max(max, c.n), 0); + createEntryPoint(maxN); + }, }); function main({ type, n }) { - tmpdir.refresh(); - createEntryPoint(n); - switch (type) { case '.js': measureJSFile(n); @@ -24,8 +27,6 @@ function main({ type, n }) { case 'dir': measureDir(n); } - - tmpdir.refresh(); } function measureJSFile(n) { diff --git a/benchmark/napi/buffer/.gitignore b/benchmark/napi/buffer/.gitignore new file mode 100644 index 00000000000000..567609b1234a9b --- /dev/null +++ b/benchmark/napi/buffer/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/benchmark/napi/buffer/binding.cc b/benchmark/napi/buffer/binding.cc new file mode 100644 index 00000000000000..d593ecbc3840f2 --- /dev/null +++ b/benchmark/napi/buffer/binding.cc @@ -0,0 +1,85 @@ +#include <node_api.h> +#include <stdio.h> +#include <stdlib.h> + +#define NODE_API_CALL(call) \ + do { \ + napi_status status = call; \ + if (status != napi_ok) { \ + fprintf(stderr, #call " failed: %d\n", status); \ + abort(); \ + } \ + } while (0) + +#define ABORT_IF_FALSE(condition) \ + if (!(condition)) { \ + fprintf(stderr, #condition " failed\n"); \ + abort(); \ + } + +static void Finalize(node_api_basic_env env, void* data, void* hint) { + delete[] static_cast<uint8_t*>(data); +} + +static napi_value CreateExternalBuffer(napi_env env, napi_callback_info info) { + napi_value argv[2], undefined, start, end; + size_t argc = 2; + int32_t n = 0; + napi_valuetype val_type = napi_undefined; + + // Validate params and retrieve start and end function. + NODE_API_CALL(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr)); + ABORT_IF_FALSE(argc == 2); + NODE_API_CALL(napi_typeof(env, argv[0], &val_type)); + ABORT_IF_FALSE(val_type == napi_object); + NODE_API_CALL(napi_typeof(env, argv[1], &val_type)); + ABORT_IF_FALSE(val_type == napi_number); + NODE_API_CALL(napi_get_named_property(env, argv[0], "start", &start)); + NODE_API_CALL(napi_typeof(env, start, &val_type)); + ABORT_IF_FALSE(val_type == napi_function); + NODE_API_CALL(napi_get_named_property(env, argv[0], "end", &end)); + NODE_API_CALL(napi_typeof(env, end, &val_type)); + ABORT_IF_FALSE(val_type == napi_function); + NODE_API_CALL(napi_get_value_int32(env, argv[1], &n)); + + NODE_API_CALL(napi_get_undefined(env, &undefined)); + + constexpr uint32_t kBufferLen = 32; + + // Start the benchmark. + napi_call_function(env, argv[0], start, 0, nullptr, nullptr); + + for (int32_t idx = 0; idx < n; idx++) { + napi_handle_scope scope; + uint8_t* buffer = new uint8_t[kBufferLen]; + napi_value jsbuffer; + NODE_API_CALL(napi_open_handle_scope(env, &scope)); + NODE_API_CALL(napi_create_external_buffer( + env, kBufferLen, buffer, Finalize, nullptr, &jsbuffer)); + NODE_API_CALL(napi_close_handle_scope(env, scope)); + } + + // Conclude the benchmark. + napi_value end_argv[] = {argv[1]}; + NODE_API_CALL(napi_call_function(env, argv[0], end, 1, end_argv, nullptr)); + + return undefined; +} + +NAPI_MODULE_INIT() { + napi_property_descriptor props[] = { + {"createExternalBuffer", + nullptr, + CreateExternalBuffer, + nullptr, + nullptr, + nullptr, + static_cast<napi_property_attributes>(napi_writable | napi_configurable | + napi_enumerable), + nullptr}, + }; + + NODE_API_CALL(napi_define_properties( + env, exports, sizeof(props) / sizeof(*props), props)); + return exports; +} diff --git a/benchmark/napi/buffer/binding.gyp b/benchmark/napi/buffer/binding.gyp new file mode 100644 index 00000000000000..c80eb5357b7f81 --- /dev/null +++ b/benchmark/napi/buffer/binding.gyp @@ -0,0 +1,18 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ], + 'defines': [ + 'NAPI_EXPERIMENTAL' + ] + }, + { + 'target_name': 'binding_node_api_v8', + 'sources': [ 'binding.cc' ], + 'defines': [ + 'NAPI_VERSION=8' + ] + } + ] +} diff --git a/benchmark/napi/buffer/index.js b/benchmark/napi/buffer/index.js new file mode 100644 index 00000000000000..25429a93fab01b --- /dev/null +++ b/benchmark/napi/buffer/index.js @@ -0,0 +1,14 @@ +'use strict'; + +const common = require('../../common.js'); + +const bench = common.createBenchmark(main, { + n: [5e6], + addon: ['binding', 'binding_node_api_v8'], + implem: ['createExternalBuffer'], +}); + +function main({ n, implem, addon }) { + const binding = require(`./build/${common.buildType}/${addon}`); + binding[implem](bench, n); +} diff --git a/benchmark/napi/function_args/index.js b/benchmark/napi/function_args/index.js index 8ce9fa9d528f5c..2cf91650f4e77a 100644 --- a/benchmark/napi/function_args/index.js +++ b/benchmark/napi/function_args/index.js @@ -1,5 +1,5 @@ // Show the difference between calling a V8 binding C++ function -// relative to a comparable N-API C++ function, +// relative to a comparable Node-API C++ function, // in various types/numbers of arguments. // Reports n of calls per second. 'use strict'; @@ -19,7 +19,7 @@ try { try { napi = require(`./build/${common.buildType}/napi_binding`); } catch { - console.error(`${__filename}: NAPI-Binding failed to load`); + console.error(`${__filename}: Node-API binding failed to load`); process.exit(0); } diff --git a/benchmark/napi/function_call/index.js b/benchmark/napi/function_call/index.js index cde4c7ae223945..b22b5ac8b2151f 100644 --- a/benchmark/napi/function_call/index.js +++ b/benchmark/napi/function_call/index.js @@ -24,7 +24,7 @@ let napi_binding; try { napi_binding = require(`./build/${common.buildType}/napi_binding`); } catch { - console.error('misc/function_call/index.js NAPI-Binding failed to load'); + console.error('misc/function_call/index.js Node-API binding failed to load'); process.exit(0); } const napi = napi_binding.hello; diff --git a/benchmark/napi/property_keys/.gitignore b/benchmark/napi/property_keys/.gitignore new file mode 100644 index 00000000000000..567609b1234a9b --- /dev/null +++ b/benchmark/napi/property_keys/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/benchmark/napi/property_keys/binding.cc b/benchmark/napi/property_keys/binding.cc new file mode 100644 index 00000000000000..258193f4b356a7 --- /dev/null +++ b/benchmark/napi/property_keys/binding.cc @@ -0,0 +1,111 @@ +#include <node_api.h> +#include <stdio.h> +#include <stdlib.h> + +#define NODE_API_CALL(call) \ + do { \ + napi_status status = call; \ + if (status != napi_ok) { \ + fprintf(stderr, #call " failed: %d\n", status); \ + abort(); \ + } \ + } while (0) + +#define ABORT_IF_FALSE(condition) \ + if (!(condition)) { \ + fprintf(stderr, #condition " failed\n"); \ + abort(); \ + } + +static napi_value Runner(napi_env env, + napi_callback_info info, + napi_value property_key) { + napi_value argv[2], undefined, js_array_length, start, end; + size_t argc = 2; + napi_valuetype val_type = napi_undefined; + bool is_array = false; + uint32_t array_length = 0; + napi_value* native_array; + + // Validate params and retrieve start and end function. + NODE_API_CALL(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr)); + ABORT_IF_FALSE(argc == 2); + NODE_API_CALL(napi_typeof(env, argv[0], &val_type)); + ABORT_IF_FALSE(val_type == napi_object); + NODE_API_CALL(napi_is_array(env, argv[1], &is_array)); + ABORT_IF_FALSE(is_array); + NODE_API_CALL(napi_get_array_length(env, argv[1], &array_length)); + NODE_API_CALL(napi_get_named_property(env, argv[0], "start", &start)); + NODE_API_CALL(napi_typeof(env, start, &val_type)); + ABORT_IF_FALSE(val_type == napi_function); + NODE_API_CALL(napi_get_named_property(env, argv[0], "end", &end)); + NODE_API_CALL(napi_typeof(env, end, &val_type)); + ABORT_IF_FALSE(val_type == napi_function); + + NODE_API_CALL(napi_get_undefined(env, &undefined)); + NODE_API_CALL(napi_create_uint32(env, array_length, &js_array_length)); + + // Copy objects into a native array. + native_array = + static_cast<napi_value*>(malloc(array_length * sizeof(napi_value))); + for (uint32_t idx = 0; idx < array_length; idx++) { + NODE_API_CALL(napi_get_element(env, argv[1], idx, &native_array[idx])); + } + + // Start the benchmark. + napi_call_function(env, argv[0], start, 0, nullptr, nullptr); + + for (uint32_t idx = 0; idx < array_length; idx++) { + NODE_API_CALL( + napi_set_property(env, native_array[idx], property_key, undefined)); + } + + // Conclude the benchmark. + NODE_API_CALL( + napi_call_function(env, argv[0], end, 1, &js_array_length, nullptr)); + + free(native_array); + + return undefined; +} + +static napi_value RunPropertyKey(napi_env env, napi_callback_info info) { + napi_value property_key; + NODE_API_CALL(node_api_create_property_key_utf16( + env, u"prop", NAPI_AUTO_LENGTH, &property_key)); + return Runner(env, info, property_key); +} + +static napi_value RunNormalString(napi_env env, napi_callback_info info) { + napi_value property_key; + NODE_API_CALL( + napi_create_string_utf16(env, u"prop", NAPI_AUTO_LENGTH, &property_key)); + return Runner(env, info, property_key); +} + +NAPI_MODULE_INIT() { + napi_property_descriptor props[] = { + {"RunPropertyKey", + nullptr, + RunPropertyKey, + nullptr, + nullptr, + nullptr, + static_cast<napi_property_attributes>(napi_writable | napi_configurable | + napi_enumerable), + nullptr}, + {"RunNormalString", + nullptr, + RunNormalString, + nullptr, + nullptr, + nullptr, + static_cast<napi_property_attributes>(napi_writable | napi_configurable | + napi_enumerable), + nullptr}, + }; + + NODE_API_CALL(napi_define_properties( + env, exports, sizeof(props) / sizeof(*props), props)); + return exports; +} diff --git a/benchmark/napi/property_keys/binding.gyp b/benchmark/napi/property_keys/binding.gyp new file mode 100644 index 00000000000000..0006991c5d1b7c --- /dev/null +++ b/benchmark/napi/property_keys/binding.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ], + 'defines': [ 'NAPI_EXPERIMENTAL' ], + } + ] +} diff --git a/benchmark/napi/property_keys/index.js b/benchmark/napi/property_keys/index.js new file mode 100644 index 00000000000000..258c8aabdd116e --- /dev/null +++ b/benchmark/napi/property_keys/index.js @@ -0,0 +1,15 @@ +'use strict'; + +const common = require('../../common.js'); + +const binding = require(`./build/${common.buildType}/binding`); + +const bench = common.createBenchmark(main, { + n: [5e6], + implem: ['RunPropertyKey', 'RunNormalString'], +}); + +function main({ n, implem }) { + const objs = Array(n).fill(null).map((item) => new Object()); + binding[implem](bench, objs); +} diff --git a/benchmark/napi/ref/addon.c b/benchmark/napi/ref/addon.c index 3fb8de603d3ced..bced905cab8bc6 100644 --- a/benchmark/napi/ref/addon.c +++ b/benchmark/napi/ref/addon.c @@ -1,6 +1,5 @@ -#include <stdlib.h> -#define NAPI_EXPERIMENTAL #include <node_api.h> +#include <stdlib.h> #define NAPI_CALL(env, call) \ do { \ @@ -34,8 +33,7 @@ SetCount(napi_env env, napi_callback_info info) { return NULL; } -static void -IncrementCounter(napi_env env, void* data, void* hint) { +static void IncrementCounter(node_api_basic_env env, void* data, void* hint) { size_t* count = data; (*count) = (*count) + 1; } diff --git a/benchmark/os/tmpdir.js b/benchmark/os/tmpdir.js new file mode 100644 index 00000000000000..ba083fc280c001 --- /dev/null +++ b/benchmark/os/tmpdir.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common.js'); +const { tmpdir } = require('os'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], +}); + +function main({ n }) { + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(tmpdir()); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = tmpdir(); + } + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'string'); + } +} diff --git a/benchmark/path/join-posix.js b/benchmark/path/join-posix.js index 2e7836650af455..fe4ea4b4a4724a 100644 --- a/benchmark/path/join-posix.js +++ b/benchmark/path/join-posix.js @@ -16,8 +16,8 @@ function main({ n, paths }) { bench.start(); for (let i = 0; i < n; i++) { - if (i % 3 === 0) { - copy[1] = `${orig}${i}`; + if (i % 5 === 0) { + copy[1] = `${orig}/${i}`; posix.join(...copy); } else { posix.join(...args); diff --git a/benchmark/path/join-win32.js b/benchmark/path/join-win32.js index 3ad1c0c7ba2a61..41899dd9240842 100644 --- a/benchmark/path/join-win32.js +++ b/benchmark/path/join-win32.js @@ -16,8 +16,8 @@ function main({ n, paths }) { bench.start(); for (let i = 0; i < n; i++) { - if (i % 3 === 0) { - copy[1] = `${orig}${i}`; + if (i % 5 === 0) { + copy[1] = `${orig}\\${i}`; win32.join(...copy); } else { win32.join(...args); diff --git a/benchmark/path/normalize-posix.js b/benchmark/path/normalize-posix.js index 3e90bfc21aec46..4318ee0b147eda 100644 --- a/benchmark/path/normalize-posix.js +++ b/benchmark/path/normalize-posix.js @@ -17,7 +17,7 @@ const bench = common.createBenchmark(main, { function main({ n, path }) { bench.start(); for (let i = 0; i < n; i++) { - posix.normalize(i % 3 === 0 ? `${path}${i}` : path); + posix.normalize(i % 5 === 0 ? `${path}/${i}` : path); } bench.end(n); } diff --git a/benchmark/path/normalize-win32.js b/benchmark/path/normalize-win32.js index 33af7953ff547d..289b385d3f65a8 100644 --- a/benchmark/path/normalize-win32.js +++ b/benchmark/path/normalize-win32.js @@ -17,7 +17,7 @@ const bench = common.createBenchmark(main, { function main({ n, path }) { bench.start(); for (let i = 0; i < n; i++) { - win32.normalize(i % 3 === 0 ? `${path}${i}` : path); + win32.normalize(i % 5 === 0 ? `${path}\\${i}` : path); } bench.end(n); } diff --git a/benchmark/path/relative-win32.js b/benchmark/path/relative-win32.js index e513b828533ddb..219c6a31e6aed7 100644 --- a/benchmark/path/relative-win32.js +++ b/benchmark/path/relative-win32.js @@ -9,6 +9,7 @@ const bench = common.createBenchmark(main, { ['C:\\foo\\bar\\baz', 'C:\\foo\\bar\\baz'].join('|'), ['C:\\foo\\BAR\\BAZ', 'C:\\foo\\bar\\baz'].join('|'), ['C:\\foo\\bar\\baz\\quux', 'C:\\'].join('|'), + ['c:\\İ\\a\\İ', 'c:\\İ\\b\\İ\\test.txt', '..\\..\\b\\İ\\test.txt'].join('|'), ], n: [1e5], }); diff --git a/benchmark/path/resolve-posix.js b/benchmark/path/resolve-posix.js index 4881947fe46b6d..edc3593bb7f4d9 100644 --- a/benchmark/path/resolve-posix.js +++ b/benchmark/path/resolve-posix.js @@ -4,23 +4,26 @@ const { posix } = require('path'); const bench = common.createBenchmark(main, { paths: [ + 'empty', '', + '.', ['', ''].join('|'), ['foo/bar', '/tmp/file/', '..', 'a/../subfile'].join('|'), ['a/b/c/', '../../..'].join('|'), + ['/a/b/c/', 'abc'].join('|'), ], n: [1e5], }); function main({ n, paths }) { - const args = paths.split('|'); + const args = paths === 'empty' ? [] : paths.split('|'); const copy = [...args]; - const orig = copy[0]; + const orig = copy[0] ?? ''; bench.start(); for (let i = 0; i < n; i++) { - if (i % 3 === 0) { - copy[0] = `${orig}${i}`; + if (i % 5 === 0) { + copy[0] = `${orig}/${i}`; posix.resolve(...copy); } else { posix.resolve(...args); diff --git a/benchmark/path/resolve-win32.js b/benchmark/path/resolve-win32.js index 822b98c2b86c52..a28f2f43e25314 100644 --- a/benchmark/path/resolve-win32.js +++ b/benchmark/path/resolve-win32.js @@ -4,7 +4,9 @@ const { win32 } = require('path'); const bench = common.createBenchmark(main, { paths: [ + 'empty', '', + '.', ['', ''].join('|'), ['c:/ignore', 'd:\\a/b\\c/d', '\\e.exe'].join('|'), ['c:/blah\\blah', 'd:/games', 'c:../a'].join('|'), @@ -13,14 +15,14 @@ const bench = common.createBenchmark(main, { }); function main({ n, paths }) { - const args = paths.split('|'); + const args = paths === 'empty' ? [] : paths.split('|'); const copy = [...args]; - const orig = copy[0]; + const orig = copy[0] ?? ''; bench.start(); for (let i = 0; i < n; i++) { - if (i % 3 === 0) { - copy[0] = `${orig}${i}`; + if (i % 5 === 0) { + copy[0] = `${orig}\\${i}`; win32.resolve(...copy); } else { win32.resolve(...args); diff --git a/benchmark/perf_hooks/nodetiming-uvmetricsinfo.js b/benchmark/perf_hooks/nodetiming-uvmetricsinfo.js new file mode 100644 index 00000000000000..1d8d174de14fbc --- /dev/null +++ b/benchmark/perf_hooks/nodetiming-uvmetricsinfo.js @@ -0,0 +1,29 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('node:assert'); +const fs = require('node:fs/promises'); + +const { + performance, +} = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e6], + events: [1, 1000, 10000], +}); + +async function runEvents(events) { + for (let i = 0; i < events; ++i) { + assert.ok(await fs.statfs(__filename)); + } +} + +async function main({ n, events }) { + await runEvents(events); + bench.start(); + for (let i = 0; i < n; i++) { + assert.ok(performance.nodeTiming.uvMetricsInfo); + } + bench.end(n); +} diff --git a/benchmark/perf_hooks/resourcetiming.js b/benchmark/perf_hooks/resourcetiming.js index 69ee06c92cbd9f..e0fe90d657f78d 100644 --- a/benchmark/perf_hooks/resourcetiming.js +++ b/benchmark/perf_hooks/resourcetiming.js @@ -21,18 +21,12 @@ function createTimingInfo({ finalConnectionTimingInfo = null, }) { if (finalConnectionTimingInfo !== null) { - finalConnectionTimingInfo.domainLookupStartTime = - finalConnectionTimingInfo.domainLookupStartTime || 0; - finalConnectionTimingInfo.domainLookupEndTime = - finalConnectionTimingInfo.domainLookupEndTime || 0; - finalConnectionTimingInfo.connectionStartTime = - finalConnectionTimingInfo.connectionStartTime || 0; - finalConnectionTimingInfo.connectionEndTime = - finalConnectionTimingInfo.connectionEndTime || 0; - finalConnectionTimingInfo.secureConnectionStartTime = - finalConnectionTimingInfo.secureConnectionStartTime || 0; - finalConnectionTimingInfo.ALPNNegotiatedProtocol = - finalConnectionTimingInfo.ALPNNegotiatedProtocol || []; + finalConnectionTimingInfo.domainLookupStartTime ||= 0; + finalConnectionTimingInfo.domainLookupEndTime ||= 0; + finalConnectionTimingInfo.connectionStartTime ||= 0; + finalConnectionTimingInfo.connectionEndTime ||= 0; + finalConnectionTimingInfo.secureConnectionStartTime ||= 0; + finalConnectionTimingInfo.ALPNNegotiatedProtocol ||= []; } return { startTime, diff --git a/benchmark/permission/permission-processhas-fs-read.js b/benchmark/permission/permission-processhas-fs-read.js index bd81814e55861a..ea06aed4bc27a9 100644 --- a/benchmark/permission/permission-processhas-fs-read.js +++ b/benchmark/permission/permission-processhas-fs-read.js @@ -11,8 +11,10 @@ const rootPath = path.resolve(__dirname, '../../..'); const options = { flags: [ - '--experimental-permission', + '--permission', `--allow-fs-read=${rootPath}`, + '--allow-child-process', + '--no-warnings', ], }; diff --git a/benchmark/permission/permission-startup.js b/benchmark/permission/permission-startup.js index c800706299bb23..d95caa01f605e0 100644 --- a/benchmark/permission/permission-startup.js +++ b/benchmark/permission/permission-startup.js @@ -19,12 +19,12 @@ const bench = common.createBenchmark(main, { ], prefixPath: ['/tmp'], nFiles: [10, 100, 1000], - count: [30], + n: [30], }); function spawnProcess(script, bench, state) { const cmd = process.execPath || process.argv[0]; - while (state.finished < state.count) { + while (state.finished < state.n) { const child = spawnSync(cmd, script); if (child.status !== 0) { console.log('---- STDOUT ----'); @@ -39,21 +39,21 @@ function spawnProcess(script, bench, state) { bench.start(); } - if (state.finished === state.count) { - bench.end(state.count); + if (state.finished === state.n) { + bench.end(state.n); } } } -function main({ count, script, nFiles, prefixPath }) { +function main({ n, script, nFiles, prefixPath }) { script = path.resolve(__dirname, '../../', `${script}.js`); - const files = mockFiles(nFiles, prefixPath).join(','); const optionsWithScript = [ - '--experimental-permission', - `--allow-fs-read=${files},${script}`, + '--permission', + `--allow-fs-read=${script}`, + ...mockFiles(nFiles, prefixPath).map((file) => '--allow-fs-read=' + file), script, ]; const warmup = 3; - const state = { count, finished: -warmup }; + const state = { n, finished: -warmup }; spawnProcess(optionsWithScript, bench, state); } diff --git a/benchmark/policy/policy-startup.js b/benchmark/policy/policy-startup.js deleted file mode 100644 index 9ee84fff4d0452..00000000000000 --- a/benchmark/policy/policy-startup.js +++ /dev/null @@ -1,51 +0,0 @@ -// Tests the impact on eager operations required for policies affecting -// general startup, does not test lazy operations -'use strict'; -const common = require('../common.js'); - -const configs = { - n: [1024], -}; - -const options = { - flags: ['--expose-internals'], -}; - -const bench = common.createBenchmark(main, configs, options); - -function main(conf) { - const hash = (str, algo) => { - const hash = require('crypto').createHash(algo); - return hash.update(str).digest('base64'); - }; - const resources = Object.fromEntries( - // Simulate graph of 1k modules - Array.from({ length: 1024 }, (_, i) => { - return [`./_${i}`, { - integrity: `sha256-${hash(`// ./_${i}`, 'sha256')}`, - dependencies: Object.fromEntries(Array.from({ - // Average 3 deps per 4 modules - length: Math.floor((i % 4) / 2), - }, (_, ii) => { - return [`_${ii}`, `./_${i - ii}`]; - })), - }]; - }), - ); - const json = JSON.parse(JSON.stringify({ resources }), (_, o) => { - if (o && typeof o === 'object') { - Reflect.setPrototypeOf(o, null); - Object.freeze(o); - } - return o; - }); - const { Manifest } = require('internal/policy/manifest'); - - bench.start(); - - for (let i = 0; i < conf.n; i++) { - new Manifest(json, 'file://benchmark/policy-relative'); - } - - bench.end(conf.n); -} diff --git a/benchmark/run.js b/benchmark/run.js index 11f95d8e71f035..4948292437fdde 100644 --- a/benchmark/run.js +++ b/benchmark/run.js @@ -3,6 +3,7 @@ const path = require('path'); const { spawn, fork } = require('node:child_process'); const CLI = require('./_cli.js'); +const { styleText } = require('node:util'); const cli = new CLI(`usage: ./node run.js [options] [--] <category> ... Run each benchmark in the <category> directory a single time, more than one @@ -12,8 +13,11 @@ const cli = new CLI(`usage: ./node run.js [options] [--] <category> ... (can be repeated) --exclude pattern excludes scripts matching <pattern> (can be repeated) + --runs variable=value set the amount of benchmark suite execution. + Default: 1 --set variable=value set benchmark variable (can be repeated) --format [simple|csv] optional value that specifies the output format + --track Display the time elapsed to run each benchmark file. test only run a single configuration from the options matrix all each benchmark category is run one after the other @@ -23,7 +27,7 @@ const cli = new CLI(`usage: ./node run.js [options] [--] <category> ... --set CPUSET=0-2 Specifies that benchmarks should run on CPU cores 0 to 2. Note: The CPUSET format should match the specifications of the 'taskset' command on your system. -`, { arrayArgs: ['set', 'filter', 'exclude'] }); +`, { arrayArgs: ['set', 'filter', 'exclude'], boolArgs: ['track'] }); const benchmarks = cli.benchmarks(); @@ -45,8 +49,7 @@ if (format === 'csv') { console.log('"filename", "configuration", "rate", "time"'); } -(function recursive(i) { - const filename = benchmarks[i]; +function runBenchmark(filename) { const scriptPath = path.resolve(__dirname, filename); const args = cli.test ? ['--test'] : cli.optional.set; @@ -54,11 +57,8 @@ if (format === 'csv') { let child; if (cpuCore !== null) { child = spawn('taskset', ['-c', cpuCore, 'node', scriptPath, ...args], { - stdio: ['inherit', 'pipe', 'pipe'], + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], }); - - child.stdout.pipe(process.stdout); - child.stderr.pipe(process.stderr); } else { child = fork( scriptPath, @@ -66,42 +66,57 @@ if (format === 'csv') { ); } - if (format !== 'csv') { - console.log(); - console.log(filename); - } - - child.on('message', (data) => { - if (data.type !== 'report') { - return; - } - // Construct configuration string, " A=a, B=b, ..." - let conf = ''; - for (const key of Object.keys(data.conf)) { - if (conf !== '') - conf += ' '; - conf += `${key}=${JSON.stringify(data.conf[key])}`; - } - if (format === 'csv') { - // Escape quotes (") for correct csv formatting - conf = conf.replace(/"/g, '""'); - console.log(`"${data.name}", "${conf}", ${data.rate}, ${data.time}`); - } else { - let rate = data.rate.toString().split('.'); - rate[0] = rate[0].replace(/(\d)(?=(?:\d\d\d)+(?!\d))/g, '$1,'); - rate = (rate[1] ? rate.join('.') : rate[0]); - console.log(`${data.name} ${conf}: ${rate}`); - } + return new Promise((resolve, reject) => { + child.on('message', (data) => { + if (data.type !== 'report') { + return; + } + // Construct configuration string, " A=a, B=b, ..." + let conf = ''; + for (const key of Object.keys(data.conf)) { + if (conf !== '') + conf += ' '; + conf += `${key}=${JSON.stringify(data.conf[key])}`; + } + if (format === 'csv') { + // Escape quotes (") for correct csv formatting + conf = conf.replace(/"/g, '""'); + console.log(`"${data.name}", "${conf}", ${data.rate}, ${data.time}`); + } else { + let rate = data.rate.toString().split('.'); + rate[0] = rate[0].replace(/(\d)(?=(?:\d\d\d)+(?!\d))/g, '$1,'); + rate = (rate[1] ? rate.join('.') : rate[0]); + console.log(`${data.name} ${conf}: ${rate}`); + } + }); + child.once('close', (code) => { + if (code) { + reject(code); + } else { + resolve(code); + } + }); }); +} - child.once('close', (code) => { - if (code) { - process.exit(code); +async function run() { + for (let i = 0; i < benchmarks.length; ++i) { + let runs = cli.optional.runs ?? 1; + const filename = benchmarks[i]; + if (format !== 'csv') { + console.log(); + console.log(filename); } - // If there are more benchmarks execute the next - if (i + 1 < benchmarks.length) { - recursive(i + 1); + while (runs-- > 0) { + const start = performance.now(); + await runBenchmark(filename); + if (format !== 'csv' && cli.optional.track) { + const ms = styleText(['bold', 'yellow'], `${Math.round(performance.now() - start)}ms`); + console.log(`[${ms}] ${filename}`); + } } - }); -})(0); + } +} + +run(); diff --git a/benchmark/source_map/source-map-cache.js b/benchmark/source_map/source-map-cache.js new file mode 100644 index 00000000000000..aee4155471a02f --- /dev/null +++ b/benchmark/source_map/source-map-cache.js @@ -0,0 +1,60 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); +const fixtures = require('../../test/common/fixtures'); + +const bench = common.createBenchmark( + main, + { + operation: [ + 'findSourceMap-valid', + 'findSourceMap-generated-source', + ], + n: [1e5], + }, +); + +function main({ operation, n }) { + const Module = require('node:module'); + + Module.setSourceMapsSupport(true, { + generatedCode: true, + }); + const validFileName = fixtures.path('test-runner/source-maps/line-lengths/index.js'); + + const fileNameKey = '/source-map/disk.js'; + const generatedFileName = fixtures.path(fileNameKey); + const generatedFileContent = fixtures.readSync(fileNameKey, 'utf8'); + const sourceMapUrl = generatedFileName.replace(/\.js$/, '.map'); + const sourceWithGeneratedSourceMap = + `${generatedFileContent}\n//# sourceMappingURL=${sourceMapUrl}\n//# sourceURL=${generatedFileName}`; + const generatedExpectedUrl = `file://${generatedFileName}`; + + let sourceMap; + switch (operation) { + case 'findSourceMap-valid': + require(validFileName); + + bench.start(); + for (let i = 0; i < n; i++) { + sourceMap = Module.findSourceMap(validFileName); + } + bench.end(n); + break; + + case 'findSourceMap-generated-source': + eval(sourceWithGeneratedSourceMap); + + bench.start(); + for (let i = 0; i < n; i++) { + sourceMap = Module.findSourceMap(generatedExpectedUrl); + } + bench.end(n); + break; + + default: + throw new Error(`Unknown operation: ${operation}`); + } + assert.ok(sourceMap); +} diff --git a/benchmark/source_map/source-map.js b/benchmark/source_map/source-map.js new file mode 100644 index 00000000000000..54f78f300f9746 --- /dev/null +++ b/benchmark/source_map/source-map.js @@ -0,0 +1,95 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); +const fixtures = require('../../test/common/fixtures'); + +const bench = common.createBenchmark( + main, + { + operation: [ + 'parse', + 'parse-sectioned', + 'findEntry', + 'findEntry-sectioned', + 'findOrigin', + 'findOrigin-sectioned', + ], + n: [1e5], + }, +); + +function main({ operation, n }) { + const { SourceMap } = require('node:module'); + + const samplePayload = JSON.parse( + fixtures.readSync('source-map/no-source.js.map', 'utf8'), + ); + const sectionedPayload = JSON.parse( + fixtures.readSync('source-map/disk-index.map', 'utf8'), + ); + + let sourceMap; + let sourceMapMethod; + switch (operation) { + case 'parse': + bench.start(); + for (let i = 0; i < n; i++) { + sourceMap = new SourceMap(samplePayload); + } + bench.end(n); + break; + + case 'parse-sectioned': + bench.start(); + for (let i = 0; i < n; i++) { + sourceMap = new SourceMap(sectionedPayload); + } + bench.end(n); + break; + + case 'findEntry': + sourceMap = new SourceMap(samplePayload); + bench.start(); + for (let i = 0; i < n; i++) { + sourceMapMethod = sourceMap.findEntry(i, i); + } + bench.end(n); + assert.ok(sourceMapMethod); + break; + + case 'findEntry-sectioned': + sourceMap = new SourceMap(sectionedPayload); + bench.start(); + for (let i = 0; i < n; i++) { + sourceMapMethod = sourceMap.findEntry(i, i); + } + bench.end(n); + assert.ok(sourceMapMethod); + break; + + case 'findOrigin': + sourceMap = new SourceMap(samplePayload); + bench.start(); + for (let i = 0; i < n; i++) { + sourceMapMethod = sourceMap.findOrigin(i, i); + } + bench.end(n); + assert.ok(sourceMapMethod); + break; + + case 'findOrigin-sectioned': + sourceMap = new SourceMap(sectionedPayload); + bench.start(); + for (let i = 0; i < n; i++) { + sourceMapMethod = sourceMap.findOrigin(i, i); + } + bench.end(n); + assert.ok(sourceMapMethod); + break; + + default: + throw new Error(`Unknown operation: ${operation}`); + } + assert.ok(sourceMap); +} diff --git a/benchmark/sqlite/sqlite-is-transaction.js b/benchmark/sqlite/sqlite-is-transaction.js new file mode 100644 index 00000000000000..3bfc896cf91cf3 --- /dev/null +++ b/benchmark/sqlite/sqlite-is-transaction.js @@ -0,0 +1,31 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e7], + transaction: ['true', 'false'], +}); + +function main(conf) { + const db = new sqlite.DatabaseSync(':memory:'); + + if (conf.transaction === 'true') { + db.exec('BEGIN'); + } + + let i; + let deadCodeElimination = true; + + bench.start(); + for (i = 0; i < conf.n; i += 1) + deadCodeElimination &&= db.isTransaction; + bench.end(conf.n); + + assert.ok(deadCodeElimination === (conf.transaction === 'true')); + + if (conf.transaction === 'true') { + db.exec('ROLLBACK'); + } +} diff --git a/benchmark/sqlite/sqlite-prepare-insert.js b/benchmark/sqlite/sqlite-prepare-insert.js new file mode 100644 index 00000000000000..58e97274c98fc4 --- /dev/null +++ b/benchmark/sqlite/sqlite-prepare-insert.js @@ -0,0 +1,100 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + statement: [ + 'INSERT INTO text_column_type (text_column) VALUES (?)', + 'INSERT INTO integer_column_type (integer_column) VALUES (?)', + 'INSERT INTO real_column_type (real_column) VALUES (?)', + 'INSERT INTO blob_column_type (blob_column) VALUES (?)', + 'INSERT INTO all_column_types (text_column, integer_column, real_column, blob_column) VALUES (?, ?, ?, ?)', + 'INSERT INTO large_text (text_8kb_column) VALUES (?)', + 'INSERT INTO missing_required_value (any_value, required_value) VALUES (?, ?)', + ], +}); + +function main(conf) { + const db = new sqlite.DatabaseSync(':memory:'); + + db.exec('CREATE TABLE text_column_type (text_column TEXT)'); + db.exec('CREATE TABLE integer_column_type (integer_column INTEGER)'); + db.exec('CREATE TABLE real_column_type (real_column REAL)'); + db.exec('CREATE TABLE blob_column_type (blob_column BLOB)'); + db.exec( + 'CREATE TABLE all_column_types (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)', + ); + db.exec('CREATE TABLE large_text (text_8kb_column TEXT)'); + db.exec('CREATE TABLE missing_required_value (any_value TEXT, required_value TEXT NOT NULL)'); + + const insertStatement = db.prepare(conf.statement); + + let i; + let deadCodeElimination; + + const stringValue = crypto.randomUUID(); + const integerValue = Math.floor(Math.random() * 100); + const realValue = Math.random(); + const blobValue = Buffer.from('example blob data'); + + const largeText = 'a'.repeat(8 * 1024); + + if (conf.statement.includes('text_column_type')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run(stringValue); + } + bench.end(conf.n); + } else if (conf.statement.includes('integer_column_type')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run(integerValue); + } + bench.end(conf.n); + } else if (conf.statement.includes('real_column_type')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run(realValue); + } + bench.end(conf.n); + } else if (conf.statement.includes('blob_column_type')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run(blobValue); + } + bench.end(conf.n); + } else if (conf.statement.includes('INTO all_column_types')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run( + stringValue, + integerValue, + realValue, + blobValue, + ); + } + bench.end(conf.n); + } else if (conf.statement.includes('INTO large_text')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + deadCodeElimination = insertStatement.run(largeText); + } + bench.end(conf.n); + } else if (conf.statement.includes('missing_required_value')) { + bench.start(); + for (i = 0; i < conf.n; i += 1) { + try { + deadCodeElimination = insertStatement.run(stringValue); + } catch (e) { + deadCodeElimination = e; + } + } + bench.end(conf.n); + } else { + throw new Error('Unknown statement'); + } + + assert.ok(deadCodeElimination !== undefined); +} diff --git a/benchmark/sqlite/sqlite-prepare-select-all-options.js b/benchmark/sqlite/sqlite-prepare-select-all-options.js new file mode 100644 index 00000000000000..336a6b176b0d87 --- /dev/null +++ b/benchmark/sqlite/sqlite-prepare-select-all-options.js @@ -0,0 +1,51 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + tableSeedSize: [1e5], + statement: [ + 'SELECT * FROM foo LIMIT 1', + 'SELECT * FROM foo LIMIT 100', + ], + options: ['none', 'readBigInts', 'returnArrays', 'readBigInts|returnArrays'], +}); + +function main(conf) { + const optionsObj = conf.options === 'none' ? {} : conf.options.split('|').reduce((acc, key) => { + acc[key] = true; + return acc; + }, {}); + + const db = new sqlite.DatabaseSync(':memory:', optionsObj); + + db.exec( + 'CREATE TABLE foo (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)', + ); + + const fooInsertStatement = db.prepare( + 'INSERT INTO foo (text_column, integer_column, real_column, blob_column) VALUES (?, ?, ?, ?)', + ); + + for (let i = 0; i < conf.tableSeedSize; i++) { + fooInsertStatement.run( + crypto.randomUUID(), + Math.floor(Math.random() * 100), + Math.random(), + Buffer.from('example blob data'), + ); + } + + let i; + let deadCodeElimination; + + const stmt = db.prepare(conf.statement); + + bench.start(); + for (i = 0; i < conf.n; i += 1) deadCodeElimination = stmt.all(); + bench.end(conf.n); + + assert.ok(deadCodeElimination !== undefined); +} diff --git a/benchmark/sqlite/sqlite-prepare-select-all.js b/benchmark/sqlite/sqlite-prepare-select-all.js new file mode 100644 index 00000000000000..c8487dca471b84 --- /dev/null +++ b/benchmark/sqlite/sqlite-prepare-select-all.js @@ -0,0 +1,68 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + tableSeedSize: [1e5], + statement: [ + 'SELECT 1', + 'SELECT * FROM foo LIMIT 1', + 'SELECT * FROM foo LIMIT 100', + 'SELECT text_column FROM foo LIMIT 1', + 'SELECT text_column FROM foo LIMIT 100', + 'SELECT text_column, integer_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column FROM foo LIMIT 100', + 'SELECT text_column, integer_column, real_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column, real_column FROM foo LIMIT 100', + 'SELECT text_column, integer_column, real_column, blob_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column, real_column, blob_column FROM foo LIMIT 100', + 'SELECT text_8kb_column FROM foo_large LIMIT 1', + 'SELECT text_8kb_column FROM foo_large LIMIT 100', + ], +}); + +function main(conf) { + const db = new sqlite.DatabaseSync(':memory:'); + + // Create only the necessary table for the benchmark type. + // If the statement includes 'foo_large', create the foo_large table; otherwise, create the foo table. + if (conf.statement.includes('foo_large')) { + db.exec('CREATE TABLE foo_large (text_8kb_column TEXT)'); + const fooLargeInsertStatement = db.prepare( + 'INSERT INTO foo_large (text_8kb_column) VALUES (?)', + ); + const largeText = 'a'.repeat(8 * 1024); + for (let i = 0; i < conf.tableSeedSize; i++) { + fooLargeInsertStatement.run(largeText); + } + } else { + db.exec( + 'CREATE TABLE foo (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)', + ); + const fooInsertStatement = db.prepare( + 'INSERT INTO foo (text_column, integer_column, real_column, blob_column) VALUES (?, ?, ?, ?)', + ); + + for (let i = 0; i < conf.tableSeedSize; i++) { + fooInsertStatement.run( + crypto.randomUUID(), + Math.floor(Math.random() * 100), + Math.random(), + Buffer.from('example blob data'), + ); + } + } + + let i; + let deadCodeElimination; + + const stmt = db.prepare(conf.statement); + + bench.start(); + for (i = 0; i < conf.n; i += 1) deadCodeElimination = stmt.all(); + bench.end(conf.n); + + assert.ok(deadCodeElimination !== undefined); +} diff --git a/benchmark/sqlite/sqlite-prepare-select-get-options.js b/benchmark/sqlite/sqlite-prepare-select-get-options.js new file mode 100644 index 00000000000000..eb2e5074151af2 --- /dev/null +++ b/benchmark/sqlite/sqlite-prepare-select-get-options.js @@ -0,0 +1,50 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + tableSeedSize: [1e5], + statement: [ + 'SELECT * FROM foo LIMIT 1', + ], + options: ['none', 'readBigInts', 'returnArrays', 'readBigInts|returnArrays'], +}); + +function main(conf) { + const optionsObj = conf.options === 'none' ? {} : conf.options.split('|').reduce((acc, key) => { + acc[key] = true; + return acc; + }, {}); + + const db = new sqlite.DatabaseSync(':memory:', optionsObj); + + db.exec( + 'CREATE TABLE foo (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)', + ); + + const fooInsertStatement = db.prepare( + 'INSERT INTO foo (text_column, integer_column, real_column, blob_column) VALUES (?, ?, ?, ?)', + ); + + for (let i = 0; i < conf.tableSeedSize; i++) { + fooInsertStatement.run( + crypto.randomUUID(), + Math.floor(Math.random() * 100), + Math.random(), + Buffer.from('example blob data'), + ); + } + + let i; + let deadCodeElimination; + + const stmt = db.prepare(conf.statement); + + bench.start(); + for (i = 0; i < conf.n; i += 1) deadCodeElimination = stmt.get(); + bench.end(conf.n); + + assert.ok(deadCodeElimination !== undefined); +} diff --git a/benchmark/sqlite/sqlite-prepare-select-get.js b/benchmark/sqlite/sqlite-prepare-select-get.js new file mode 100644 index 00000000000000..0fff29ce5686da --- /dev/null +++ b/benchmark/sqlite/sqlite-prepare-select-get.js @@ -0,0 +1,62 @@ +'use strict'; +const common = require('../common.js'); +const sqlite = require('node:sqlite'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + tableSeedSize: [1e5], + statement: [ + 'SELECT 1', + 'SELECT * FROM foo LIMIT 1', + 'SELECT text_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column, real_column FROM foo LIMIT 1', + 'SELECT text_column, integer_column, real_column, blob_column FROM foo LIMIT 1', + 'SELECT text_8kb_column FROM foo_large LIMIT 1', + ], +}); + +function main(conf) { + const db = new sqlite.DatabaseSync(':memory:'); + + // Create only the necessary table for the benchmark type. + // If the statement includes 'foo_large', create the foo_large table; otherwise, create the foo table. + if (conf.statement.includes('foo_large')) { + db.exec('CREATE TABLE foo_large (text_8kb_column TEXT)'); + const fooLargeInsertStatement = db.prepare( + 'INSERT INTO foo_large (text_8kb_column) VALUES (?)', + ); + const largeText = 'a'.repeat(8 * 1024); + for (let i = 0; i < conf.tableSeedSize; i++) { + fooLargeInsertStatement.run(largeText); + } + } else { + db.exec( + 'CREATE TABLE foo (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)', + ); + const fooInsertStatement = db.prepare( + 'INSERT INTO foo (text_column, integer_column, real_column, blob_column) VALUES (?, ?, ?, ?)', + ); + + for (let i = 0; i < conf.tableSeedSize; i++) { + fooInsertStatement.run( + crypto.randomUUID(), + Math.floor(Math.random() * 100), + Math.random(), + Buffer.from('example blob data'), + ); + } + } + + let i; + let deadCodeElimination; + + const stmt = db.prepare(conf.statement); + + bench.start(); + for (i = 0; i < conf.n; i += 1) deadCodeElimination = stmt.get(); + bench.end(conf.n); + + assert.ok(deadCodeElimination !== undefined); +} diff --git a/benchmark/streams/compose.js b/benchmark/streams/compose.js new file mode 100644 index 00000000000000..b98596ffbd1411 --- /dev/null +++ b/benchmark/streams/compose.js @@ -0,0 +1,42 @@ +'use strict'; +const common = require('../common.js'); + +const { + PassThrough, + Readable, + Writable, + compose, +} = require('node:stream'); + +const bench = common.createBenchmark(main, { + n: [1e3], +}); + +function main({ n }) { + const cachedPassThroughs = []; + const cachedReadables = []; + const cachedWritables = []; + + for (let i = 0; i < n; i++) { + const numberOfPassThroughs = 100; + const passThroughs = []; + + for (let i = 0; i < numberOfPassThroughs; i++) { + passThroughs.push(new PassThrough()); + } + + const readable = Readable.from(['hello', 'world']); + const writable = new Writable({ objectMode: true, write: (chunk, encoding, cb) => cb() }); + + cachedPassThroughs.push(passThroughs); + cachedReadables.push(readable); + cachedWritables.push(writable); + } + + bench.start(); + for (let i = 0; i < n; i++) { + const composed = compose(cachedReadables[i], ...cachedPassThroughs[i], cachedWritables[i]); + composed.end(); + } + bench.end(n); +} diff --git a/benchmark/string_decoder/string-decoder.js b/benchmark/string_decoder/string-decoder.js index 8acb9c15bfd6f3..bcb4eace71b3ae 100644 --- a/benchmark/string_decoder/string-decoder.js +++ b/benchmark/string_decoder/string-decoder.js @@ -1,11 +1,12 @@ 'use strict'; const common = require('../common.js'); const StringDecoder = require('string_decoder').StringDecoder; +const assert = require('node:assert'); const bench = common.createBenchmark(main, { encoding: ['ascii', 'utf8', 'base64-utf8', 'base64-ascii', 'utf16le'], - inLen: [32, 128, 1024, 4096], - chunkLen: [16, 64, 256, 1024], + inLen: [32, 128, 1024], + chunkLen: [16, 256, 1024], n: [25e5], }); @@ -75,10 +76,13 @@ function main({ encoding, inLen, chunkLen, n }) { const nChunks = chunks.length; + let avoidDeadCode; bench.start(); for (let i = 0; i < n; ++i) { + avoidDeadCode = ''; for (let j = 0; j < nChunks; ++j) - sd.write(chunks[j]); + avoidDeadCode += sd.write(chunks[j]); } bench.end(n); + assert.ok(avoidDeadCode); } diff --git a/benchmark/test_runner/mock-fn.js b/benchmark/test_runner/mock-fn.js new file mode 100644 index 00000000000000..6489ccf815e294 --- /dev/null +++ b/benchmark/test_runner/mock-fn.js @@ -0,0 +1,48 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const { test } = require('node:test'); + +const bench = common.createBenchmark(main, { + n: [1e6], + mode: ['define', 'execute'], +}, { + // We don't want to test the reporter here + flags: ['--test-reporter=./benchmark/fixtures/empty-test-reporter.js'], +}); + +const noop = () => {}; + +function benchmarkDefine(n) { + let noDead; + test((t) => { + bench.start(); + for (let i = 0; i < n; i++) { + noDead = t.mock.fn(noop); + } + bench.end(n); + assert.ok(noDead); + }); +} + +function benchmarkExecute(n) { + let noDead; + test((t) => { + const mocked = t.mock.fn(noop); + bench.start(); + for (let i = 0; i < n; i++) { + noDead = mocked(); + } + bench.end(n); + assert.strictEqual(noDead, noop()); + }); +} + +function main({ n, mode }) { + if (mode === 'define') { + benchmarkDefine(n); + } else if (mode === 'execute') { + benchmarkExecute(n); + } +} diff --git a/benchmark/test_runner/run-single-test-file.js b/benchmark/test_runner/run-single-test-file.js new file mode 100644 index 00000000000000..00e95e088a223e --- /dev/null +++ b/benchmark/test_runner/run-single-test-file.js @@ -0,0 +1,62 @@ +'use strict'; +const common = require('../common'); + +const tmpdir = require('../../test/common/tmpdir'); +const { run } = require('node:test'); +const { writeFileSync, mkdirSync } = require('node:fs'); +const { join } = require('node:path'); + +const fixtureContent = "const test = require('node:test'); test('test has ran');"; + +function makeTestDirWithFiles(dirPath, count) { + mkdirSync(dirPath); + for (let i = 0; i < count; i++) { + writeFileSync(join(dirPath, `test-${i}.js`), fixtureContent); + } +} + +function getTestDirPath(numberOfTestFiles) { + return join(tmpdir.path, `${numberOfTestFiles}-tests`); +} + +function setup(numberOfTestFiles) { + tmpdir.refresh(); + const dirPath = getTestDirPath(numberOfTestFiles); + makeTestDirWithFiles(dirPath, numberOfTestFiles); +} + +/** + * This benchmark evaluates the overhead of running a single test file under different + * isolation modes. + * Specifically, it compares the performance of running tests in the + * same process versus creating multiple processes. + */ +const bench = common.createBenchmark(main, { + numberOfTestFiles: [1, 10, 100], + isolation: ['none', 'process'], +}, { + // We don't want to test the reporter here + flags: ['--test-reporter=./benchmark/fixtures/empty-test-reporter.js'], +}); + +async function runBenchmark({ numberOfTestFiles, isolation }) { + const dirPath = getTestDirPath(numberOfTestFiles); + const stream = run({ + cwd: dirPath, + isolation, + concurrency: false, // We don't want to run tests concurrently + }); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + + return numberOfTestFiles; +} + +function main(params) { + setup(params.numberOfTestFiles); + bench.start(); + runBenchmark(params).then(() => { + bench.end(1); + }); +} diff --git a/benchmark/test_runner/test-reporters.js b/benchmark/test_runner/test-reporters.js new file mode 100644 index 00000000000000..4eecd1c4306005 --- /dev/null +++ b/benchmark/test_runner/test-reporters.js @@ -0,0 +1,41 @@ +'use strict'; + +const common = require('../common'); +const { run } = require('node:test'); +const reporters = require('node:test/reporters'); +const { Readable } = require('node:stream'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + n: [1e4], + reporter: Object.keys(reporters), +}); + +// No need to run this for every benchmark, +// it should always be the same data. +const stream = run({ + files: ['../fixtures/basic-test-runner.js'], +}); +let testResults; + +async function main({ n, reporter: r }) { + testResults ??= await stream.toArray(); + + // Create readable streams for each iteration + const readables = Array.from({ length: n }, () => Readable.from(testResults)); + + // Get the selected reporter + const reporter = reporters[r]; + + bench.start(); + + let noDead; + for (const readable of readables) { + // Process each readable stream through the reporter + noDead = await readable.compose(reporter).toArray(); + } + + bench.end(n); + + assert.ok(noDead); +} diff --git a/benchmark/ts/strip-typescript.js b/benchmark/ts/strip-typescript.js new file mode 100644 index 00000000000000..29c81f5a750bae --- /dev/null +++ b/benchmark/ts/strip-typescript.js @@ -0,0 +1,27 @@ +'use strict'; + +const common = require('../common'); +const path = require('path'); +const assert = require('node:assert'); + + +const js = path.resolve(__dirname, '../fixtures/strip-types-benchmark.js'); +const ts = path.resolve(__dirname, '../fixtures/strip-types-benchmark.ts'); + +const bench = common.createBenchmark(main, { + filepath: [ts, js], + n: [1e4], +}, { + flags: ['--disable-warning=ExperimentalWarning'], +}); + +async function main({ n, filepath }) { + let output; + bench.start(); + for (let i = 0; i < n; i++) { + const { result } = await import(`${filepath}?${i}`); + output = result; + } + bench.end(n); + assert.ok(output); +} diff --git a/benchmark/ts/transform-typescript.js b/benchmark/ts/transform-typescript.js new file mode 100644 index 00000000000000..59a78eccae3ff1 --- /dev/null +++ b/benchmark/ts/transform-typescript.js @@ -0,0 +1,26 @@ +'use strict'; + +const common = require('../common'); +const path = require('path'); +const assert = require('node:assert'); + +const js = path.resolve(__dirname, '../fixtures/transform-types-benchmark.js'); +const ts = path.resolve(__dirname, '../fixtures/transform-types-benchmark.ts'); + +const bench = common.createBenchmark(main, { + filepath: [js, ts], + n: [1e4], +}, { + flags: ['--experimental-transform-types', '--disable-warning=ExperimentalWarning'], +}); + +async function main({ n, filepath }) { + let output; + bench.start(); + for (let i = 0; i < n; i++) { + const { result } = await import(`${filepath}?${i}`); + output = result; + } + bench.end(n); + assert.ok(output); +} diff --git a/benchmark/url/url-searchparams-inspect.js b/benchmark/url/url-searchparams-inspect.js new file mode 100644 index 00000000000000..ceccb4f488a1e6 --- /dev/null +++ b/benchmark/url/url-searchparams-inspect.js @@ -0,0 +1,39 @@ +'use strict'; +const common = require('../common.js'); +const { inspect } = require('util'); + +const bench = common.createBenchmark(main, { + variant: ['empty', 'small', 'medium', 'large'], + kind: ['params', 'iterator-keys', 'iterator-values', 'iterator-entries'], + n: [1e5], +}); + +function makeParams(size) { + const u = new URLSearchParams(); + for (let i = 0; i < size; i++) { + u.append('k' + i, 'v' + i); + } + return u; +} + +function main({ variant, kind, n }) { + const sizes = { empty: 0, small: 3, medium: 16, large: 128 }; + const size = sizes[variant]; + const params = makeParams(size); + let target; + if (kind === 'params') { + target = params; + } else if (kind === 'iterator-keys') { + target = params.keys(); + } else if (kind === 'iterator-values') { + target = params.values(); + } else { + target = params.entries(); + } + + bench.start(); + for (let i = 0; i < n; i++) { + inspect(target, { showHidden: false, depth: 2 }); + } + bench.end(n); +} diff --git a/benchmark/url/url-searchparams-update.js b/benchmark/url/url-searchparams-update.js index 082d476a5d2250..3c42de61110ef3 100644 --- a/benchmark/url/url-searchparams-update.js +++ b/benchmark/url/url-searchparams-update.js @@ -17,7 +17,7 @@ function getMethod(url, property) { function main({ searchParams, property, n }) { const url = new URL('https://nodejs.org'); - if (searchParams === 'true') assert(url.searchParams); + if (searchParams === 'true') assert.ok(url.searchParams); const method = getMethod(url, property); diff --git a/benchmark/url/whatwg-url-to-and-from-path.js b/benchmark/url/whatwg-url-to-and-from-path.js index 3b87c0670a8fee..366a8c98991f60 100644 --- a/benchmark/url/whatwg-url-to-and-from-path.js +++ b/benchmark/url/whatwg-url-to-and-from-path.js @@ -3,28 +3,46 @@ const common = require('../common.js'); const { fileURLToPath, pathToFileURL } = require('node:url'); const isWindows = process.platform === 'win32'; -const bench = common.createBenchmark(main, { - input: isWindows ? [ - 'file:///c/', - ] : [ - 'file:///dev/null', - 'file:///dev/null?key=param&bool', - 'file:///dev/null?key=param&bool#hash', - ], - method: isWindows ? [ - 'fileURLToPath', - ] : [ - 'fileURLToPath', - 'pathToFileURL', - ], - n: [5e6], -}); +const inputs = isWindows ? [ + 'C:\\foo', + 'C:\\Program Files\\Music\\Web Sys\\main.html?REQUEST=RADIO', + '\\\\nas\\My Docs\\File.doc', + '\\\\?\\UNC\\server\\share\\folder\\file.txt', + 'file:///C:/foo', + 'file:///C:/dir/foo?query=1', + 'file:///C:/dir/foo#fragment', +] : [ + '/dev/null', + '/dev/null?key=param&bool', + '/dev/null?key=param&bool#hash', + 'file:///dev/null', + 'file:///dev/null?key=param&bool', + 'file:///dev/null?key=param&bool#hash', +]; -function main({ n, input, method }) { - method = method === 'fileURLOrPath' ? fileURLToPath : pathToFileURL; +const bench = common.createBenchmark( + main, + { + method: ['pathToFileURL', 'fileURLToPath'], + input: Object.values(inputs), + n: [5e6], + }, + { + combinationFilter: (p) => ( + (isWindows ? + (!p.input.startsWith('file://') && p.method === 'pathToFileURL') : + p.method === 'pathToFileURL' + ) || + (p.input.startsWith('file://') && p.method === 'fileURLToPath') + ), + }, +); + +function main({ method, input, n }) { + const methodFunc = method === 'fileURLToPath' ? fileURLToPath : pathToFileURL; bench.start(); for (let i = 0; i < n; i++) { - method(input); + methodFunc(input); } bench.end(n); } diff --git a/benchmark/util/deprecate.js b/benchmark/util/deprecate.js new file mode 100644 index 00000000000000..13ddcec8ecda02 --- /dev/null +++ b/benchmark/util/deprecate.js @@ -0,0 +1,36 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], + modifyPrototype: [true, false], + emitWarningSync: [1, 0], +}, { + flags: ['--expose-internals'], +}); + +function simpleFunction(x) { + return x * 2 + (new Array(1000)).fill(0).map((_, i) => i).reduce((a, b) => a + b, 0); +} + +function main({ n, modifyPrototype, emitWarningSync }) { + const { deprecate } = require('internal/util'); + + const fn = deprecate( + simpleFunction, + 'This function is deprecated', + 'DEP0000', + emitWarningSync, + modifyPrototype, + ); + + let sum = 0; + bench.start(); + for (let i = 0; i < n; ++i) { + sum += fn(i); + } + bench.end(n); + assert.ok(sum); +} diff --git a/benchmark/util/diff.js b/benchmark/util/diff.js new file mode 100644 index 00000000000000..7e40b3cd30f63b --- /dev/null +++ b/benchmark/util/diff.js @@ -0,0 +1,43 @@ +'use strict'; + +const util = require('util'); +const common = require('../common'); + +const bench = common.createBenchmark(main, { + n: [1e3], + length: [500, 1000], + scenario: ['identical', 'small-diff', 'medium-diff', 'large-diff'], +}); + +function main({ n, length, scenario }) { + const actual = Array.from({ length }, (_, i) => `${i}`); + let expected; + + switch (scenario) { + case 'identical': // 0% difference + expected = Array.from({ length }, (_, i) => `${i}`); + break; + + case 'small-diff': // ~5% difference + expected = Array.from({ length }, (_, i) => { + return Math.random() < 0.05 ? `modified-${i}` : `${i}`; + }); + break; + + case 'medium-diff': // ~25% difference + expected = Array.from({ length }, (_, i) => { + return Math.random() < 0.25 ? `modified-${i}` : `${i}`; + }); + break; + + case 'large-diff': // ~100% difference + expected = Array.from({ length }, (_, i) => `modified-${i}`); + break; + } + + bench.start(); + for (let i = 0; i < n; i++) { + util.diff(actual, expected); + } + bench.end(n); +} diff --git a/benchmark/util/get-callsite.js b/benchmark/util/get-callsite.js new file mode 100644 index 00000000000000..20329c9c0167a3 --- /dev/null +++ b/benchmark/util/get-callsite.js @@ -0,0 +1,65 @@ +'use strict'; + +const common = require('../common'); +const { getCallSites } = require('node:util'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], + method: ['ErrorCallSites', 'ErrorCallSitesSerialized', 'CPP'], +}); + +function ErrorGetCallSites() { + const originalStackFormatter = Error.prepareStackTrace; + Error.prepareStackTrace = (_err, stack) => { + if (stack && stack.length > 1) { + // Remove node:util + return stack.slice(1); + } + return stack; + }; + const err = new Error(); + // With the V8 Error API, the stack is not formatted until it is accessed + err.stack; // eslint-disable-line no-unused-expressions + Error.prepareStackTrace = originalStackFormatter; + return err.stack; +} + +function ErrorCallSitesSerialized() { + const callSites = ErrorGetCallSites(); + const serialized = []; + for (let i = 0; i < callSites.length; ++i) { + serialized.push({ + functionName: callSites[i].getFunctionName(), + scriptName: callSites[i].getFileName(), + lineNumber: callSites[i].getLineNumber(), + column: callSites[i].getColumnNumber(), + }); + } + return serialized; +} + +function main({ n, method }) { + let fn; + switch (method) { + case 'ErrorCallSites': + fn = ErrorGetCallSites; + break; + case 'ErrorCallSitesSerialized': + fn = ErrorCallSitesSerialized; + break; + case 'CPP': + fn = getCallSites; + break; + } + let lastStack = {}; + + bench.start(); + for (let i = 0; i < n; i++) { + const stack = fn(); + lastStack = stack; + } + bench.end(n); + // Attempt to avoid dead-code elimination + assert.ok(lastStack); +} diff --git a/benchmark/util/parse-env.js b/benchmark/util/parse-env.js new file mode 100644 index 00000000000000..1bcd08ba213b93 --- /dev/null +++ b/benchmark/util/parse-env.js @@ -0,0 +1,23 @@ +'use strict'; + +const { createBenchmark } = require('../common.js'); +const path = require('node:path'); +const fs = require('node:fs'); +const util = require('node:util'); +const assert = require('node:assert'); + +const bench = createBenchmark(main, { + n: 3e4, +}); + +const env = fs.readFileSync(path.resolve(__dirname, '../fixtures/valid.env'), 'utf-8'); + +function main({ n }) { + let noDead; + bench.start(); + for (let i = 0; i < n; i++) { + noDead = util.parseEnv(env); + } + bench.end(n); + assert(noDead !== undefined); +} diff --git a/benchmark/util/priority-queue.js b/benchmark/util/priority-queue.js index 2301c5a1ef6892..0a880a1c7cf29d 100644 --- a/benchmark/util/priority-queue.js +++ b/benchmark/util/priority-queue.js @@ -6,7 +6,7 @@ const bench = common.createBenchmark(main, { n: [1e5], }, { flags: ['--expose-internals'] }); -function main({ n, type }) { +function main({ n }) { const PriorityQueue = require('internal/priority_queue'); const queue = new PriorityQueue(); bench.start(); diff --git a/benchmark/util/style-text.js b/benchmark/util/style-text.js index 195907bba5c628..282a96150f0b94 100644 --- a/benchmark/util/style-text.js +++ b/benchmark/util/style-text.js @@ -3,14 +3,16 @@ const common = require('../common.js'); const { styleText } = require('node:util'); +const assert = require('node:assert'); const bench = common.createBenchmark(main, { messageType: ['string', 'number', 'boolean', 'invalid'], format: ['red', 'italic', 'invalid'], + validateStream: [1, 0], n: [1e3], }); -function main({ messageType, format, n }) { +function main({ messageType, format, validateStream, n }) { let str; switch (messageType) { case 'string': @@ -29,8 +31,10 @@ function main({ messageType, format, n }) { bench.start(); for (let i = 0; i < n; i++) { + let colored = ''; try { - styleText(format, str); + colored = styleText(format, str, { validateStream }); + assert.ok(colored); // Attempt to avoid dead-code elimination } catch { // eslint-disable no-empty } diff --git a/benchmark/util/text-decoder.js b/benchmark/util/text-decoder.js index dd4f02016df077..1aa60f2dd0bcd6 100644 --- a/benchmark/util/text-decoder.js +++ b/benchmark/util/text-decoder.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - encoding: ['utf-8', 'latin1', 'iso-8859-3'], + encoding: ['utf-8', 'windows-1252', 'iso-8859-3'], ignoreBOM: [0, 1], fatal: [0, 1], len: [256, 1024 * 16, 1024 * 128], diff --git a/benchmark/v8/serialize.js b/benchmark/v8/serialize.js index c370da49ea7cca..1b9a240bd458e4 100644 --- a/benchmark/v8/serialize.js +++ b/benchmark/v8/serialize.js @@ -4,8 +4,8 @@ const common = require('../common.js'); const v8 = require('v8'); const bench = common.createBenchmark(main, { - len: [256, 1024 * 16, 1024 * 512], - n: [1e6], + len: [256, 1024 * 16], + n: [1e5], }); function main({ n, len }) { diff --git a/benchmark/vm/source-text-module-leaf.js b/benchmark/vm/source-text-module-leaf.js new file mode 100644 index 00000000000000..66d942556c6ac8 --- /dev/null +++ b/benchmark/vm/source-text-module-leaf.js @@ -0,0 +1,84 @@ +'use strict'; + +const vm = require('vm'); +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + stage: ['all', 'compile', 'link', 'instantiate', 'evaluate'], + type: ['sync', 'async'], + n: [1000], +}, { + flags: ['--experimental-vm-modules'], +}); + +function main({ stage, type, n }) { + const arr = []; + if (stage === 'all' || stage === 'compile') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + let source = `export const value${i} = 1;`; + if (type === 'async') { + source += `\nawait Promise.resolve();\n`; + } + const m = new vm.SourceTextModule(source); + arr.push(m); + } + + if (stage === 'compile') { + bench.end(n); + return; + } + + if (stage === 'link') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + arr[i].linkRequests([]); + } + + if (stage === 'link') { + bench.end(n); + return; + } + + if (stage === 'instantiate') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + arr[i].instantiate(); + } + + if (stage === 'instantiate') { + bench.end(n); + return; + } + + if (stage === 'evaluate') { + bench.start(); + } + + function finalize() { + bench.end(n); + for (let i = 0; i < n; i++) { + assert.strictEqual(arr[i].namespace[`value${i}`], 1); + } + } + + if (type === 'sync') { + for (let i = 0; i < n; i++) { + arr[i].evaluate(); + } + finalize(); + } else { + const promises = []; + for (let i = 0; i < n; i++) { + promises.push(arr[i].evaluate()); + } + Promise.all(promises).then(finalize); + } +} diff --git a/benchmark/webstorage/getItem.js b/benchmark/webstorage/getItem.js new file mode 100644 index 00000000000000..c383f91ee0d75b --- /dev/null +++ b/benchmark/webstorage/getItem.js @@ -0,0 +1,75 @@ +'use strict'; +const { join } = require('node:path'); +const common = require('../common.js'); +const tmpdir = require('../../test/common/tmpdir'); + +let cnt = 0; + +tmpdir.refresh(); + +function nextLocalStorage() { + return join(tmpdir.path, `${++cnt}.localstorage`); +} + +const options = { + flags: ['--experimental-webstorage', `--localstorage-file=${nextLocalStorage()}`], +}; + +const bench = common.createBenchmark(main, { + type: ['localStorage-getItem', + 'localStorage-getter', + 'sessionStorage-getItem', + 'sessionStorage-getter'], + // Note: web storage has only 10mb quota + n: [1e5], +}, options); + +function fillStorage(storage, n) { + for (let i = 0; i < n; i++) { + storage.setItem(i, i); + } +} + +function main({ n, type }) { + const localStorage = globalThis.localStorage; + const sessionStorage = globalThis.sessionStorage; + + switch (type) { + case 'localStorage-getItem': + fillStorage(localStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + localStorage.getItem(i); + } + bench.end(n); + break; + case 'localStorage-getter': + fillStorage(localStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + // eslint-disable-next-line no-unused-expressions + localStorage[i]; + } + bench.end(n); + break; + case 'sessionStorage-getItem': + fillStorage(sessionStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + sessionStorage.getItem(i); + } + bench.end(n); + break; + case 'sessionStorage-getter': + fillStorage(sessionStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + // eslint-disable-next-line no-unused-expressions + sessionStorage[i]; + } + bench.end(n); + break; + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/webstorage/removeItem.js b/benchmark/webstorage/removeItem.js new file mode 100644 index 00000000000000..330f17bdf35293 --- /dev/null +++ b/benchmark/webstorage/removeItem.js @@ -0,0 +1,75 @@ +'use strict'; +const { join } = require('node:path'); +const common = require('../common.js'); +const tmpdir = require('../../test/common/tmpdir'); + +let cnt = 0; + +tmpdir.refresh(); + +function nextLocalStorage() { + return join(tmpdir.path, `${++cnt}.localstorage`); +} + +const options = { + flags: ['--experimental-webstorage', `--localstorage-file=${nextLocalStorage()}`], +}; + +const bench = common.createBenchmark(main, { + type: ['localStorage-removeItem', + 'localStorage-delete', + 'sessionStorage-removeItem', + 'sessionStorage-delete', + ], + // Note: web storage has only 10mb quota + n: [1e5], +}, options); + +function fillStorage(storage, n) { + for (let i = 0; i < n; i++) { + storage.setItem(i, i); + } +} + +function main({ n, type }) { + const localStorage = globalThis.localStorage; + const sessionStorage = globalThis.sessionStorage; + + switch (type) { + case 'localStorage-removeItem': + fillStorage(localStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + localStorage.removeItem(i); + } + bench.end(n); + break; + case 'localStorage-delete': + fillStorage(localStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + delete localStorage[i]; + } + bench.end(n); + break; + case 'sessionStorage-removeItem': + fillStorage(sessionStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + sessionStorage.removeItem(i); + } + bench.end(n); + break; + + case 'sessionStorage-delete': + fillStorage(localStorage, n); + bench.start(); + for (let i = 0; i < n; i++) { + delete sessionStorage[i]; + } + bench.end(n); + break; + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/webstorage/setItem.js b/benchmark/webstorage/setItem.js new file mode 100644 index 00000000000000..e6ef2f866de05a --- /dev/null +++ b/benchmark/webstorage/setItem.js @@ -0,0 +1,63 @@ +'use strict'; +const { join } = require('node:path'); +const common = require('../common.js'); +const tmpdir = require('../../test/common/tmpdir'); + +let cnt = 0; + +tmpdir.refresh(); + +function nextLocalStorage() { + return join(tmpdir.path, `${++cnt}.localstorage`); +} + +const options = { + flags: ['--experimental-webstorage', `--localstorage-file=${nextLocalStorage()}`], +}; + +const bench = common.createBenchmark(main, { + type: ['localStorage-setItem', + 'localStorage-setter', + 'sessionStorage-setItem', + 'sessionStorage-setter'], + // Note: web storage has only 10mb quota + n: [1e5], +}, options); + +function main({ n, type }) { + const localStorage = globalThis.localStorage; + const sessionStorage = globalThis.sessionStorage; + + switch (type) { + case 'localStorage-setItem': + bench.start(); + for (let i = 0; i < n; i++) { + localStorage.setItem(i, i); + } + bench.end(n); + break; + case 'localStorage-setter': + bench.start(); + for (let i = 0; i < n; i++) { + localStorage[i] = i; + } + bench.end(n); + break; + case 'sessionStorage-setItem': + bench.start(); + for (let i = 0; i < n; i++) { + sessionStorage.setItem(i, i); + } + bench.end(n); + break; + case 'sessionStorage-setter': + bench.start(); + for (let i = 0; i < n; i++) { + sessionStorage[i] = i; + } + bench.end(n); + break; + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/zlib/creation.js b/benchmark/zlib/creation.js index 90b22780d2d312..41b1e4917a67bb 100644 --- a/benchmark/zlib/creation.js +++ b/benchmark/zlib/creation.js @@ -5,7 +5,7 @@ const zlib = require('zlib'); const bench = common.createBenchmark(main, { type: [ 'Deflate', 'DeflateRaw', 'Inflate', 'InflateRaw', 'Gzip', 'Gunzip', 'Unzip', - 'BrotliCompress', 'BrotliDecompress', + 'BrotliCompress', 'BrotliDecompress', 'ZstdCompress', 'ZstdDecompress', ], options: ['true', 'false'], n: [5e5], diff --git a/benchmark/zlib/deflate.js b/benchmark/zlib/deflate.js index ab9ff333224a0e..2f57df9b5e8d99 100644 --- a/benchmark/zlib/deflate.js +++ b/benchmark/zlib/deflate.js @@ -10,7 +10,7 @@ const bench = common.createBenchmark(main, { function main({ n, method, inputLen }) { // Default method value for testing. - method = method || 'deflate'; + method ||= 'deflate'; const chunk = Buffer.alloc(inputLen, 'a'); switch (method) { diff --git a/benchmark/zlib/inflate.js b/benchmark/zlib/inflate.js index a65b00f78a5059..e2e29755f5d483 100644 --- a/benchmark/zlib/inflate.js +++ b/benchmark/zlib/inflate.js @@ -10,7 +10,7 @@ const bench = common.createBenchmark(main, { function main({ n, method, inputLen }) { // Default method value for tests. - method = method || 'inflate'; + method ||= 'inflate'; const chunk = zlib.deflateSync(Buffer.alloc(inputLen, 'a')); let i = 0; diff --git a/benchmark/zlib/pipe.js b/benchmark/zlib/pipe.js index a9c86e3de660a9..5a21c3ff417084 100644 --- a/benchmark/zlib/pipe.js +++ b/benchmark/zlib/pipe.js @@ -7,7 +7,7 @@ const bench = common.createBenchmark(main, { inputLen: [1024], duration: [5], type: ['string', 'buffer'], - algorithm: ['gzip', 'brotli'], + algorithm: ['gzip', 'brotli', 'zstd'], }, { test: { inputLen: 1024, @@ -15,14 +15,19 @@ const bench = common.createBenchmark(main, { }, }); +const algorithms = { + 'gzip': [zlib.createGzip, zlib.createGunzip], + 'brotli': [zlib.createBrotliCompress, zlib.createBrotliDecompress], + 'zstd': [zlib.createZstdCompress, zlib.createZstdDecompress], +}; + function main({ inputLen, duration, type, algorithm }) { const buffer = Buffer.alloc(inputLen, fs.readFileSync(__filename)); const chunk = type === 'buffer' ? buffer : buffer.toString('utf8'); - const input = algorithm === 'gzip' ? - zlib.createGzip() : zlib.createBrotliCompress(); - const output = algorithm === 'gzip' ? - zlib.createGunzip() : zlib.createBrotliDecompress(); + const [createCompress, createUncompress] = algorithms[algorithm]; + const input = createCompress(); + const output = createUncompress(); let readFromOutput = 0; input.pipe(output); diff --git a/codecov.yml b/codecov.yml index 80ee32b360abce..05410f5c18957b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,19 +1,19 @@ -# TODO(bcoe): re-enable coverage report comments, once we can figure out -# how to make them more accurate for the Node.js project, -# See: https://github.com/nodejs/node/issues/35759 -comment: false -# # Only show diff and files changed: -# layout: "diff, files" -# # Don't post if no changes in coverage: -# require_changes: true +comment: + # Only show diff and files changed: + layout: diff, files + # Don't post if no changes in coverage: + require_changes: true codecov: - branch: main notify: # Wait for all coverage builds: + # - coverage-linux.yml + # - coverage-windows.yml [manually disabled see #50489] + # - coverage-linux-without-intl.yml after_n_builds: 2 coverage: + # Useful for blocking Pull Requests that don't meet a particular coverage threshold. status: project: off patch: off diff --git a/common.gypi b/common.gypi index 108788e98a3f2c..d71df903c125e4 100644 --- a/common.gypi +++ b/common.gypi @@ -3,7 +3,6 @@ 'configuring_node%': 0, 'asan%': 0, 'ubsan%': 0, - 'werror': '', # Turn off -Werror in V8 build. 'visibility%': 'hidden', # V8's visibility setting 'target_arch%': 'ia32', # set v8's target architecture 'host_arch%': 'ia32', # set v8's host architecture @@ -28,6 +27,8 @@ 'clang%': 0, 'error_on_warn%': 'false', + 'suppress_all_error_on_warn%': 'false', + 'control_flow_guard%': 'false', 'openssl_product': '<(STATIC_LIB_PREFIX)openssl<(STATIC_LIB_SUFFIX)', 'openssl_no_asm%': 0, @@ -37,7 +38,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.9', + 'v8_embedder_string': '-node.35', ##### V8 defaults for Node.js ##### @@ -81,6 +82,7 @@ 'v8_enable_direct_local%': 0, 'v8_enable_map_packing%': 0, 'v8_enable_pointer_compression_shared_cage%': 0, + 'v8_enable_external_code_space%': 0, 'v8_enable_sandbox%': 0, 'v8_enable_v8_checks%': 0, 'v8_enable_zone_compression%': 0, @@ -107,19 +109,21 @@ 'v8_base': '<(PRODUCT_DIR)/obj.target/tools/v8_gypfiles/libv8_snapshot.a', }], ['OS=="mac"', { - 'clang%': 1, 'obj_dir%': '<(PRODUCT_DIR)/obj.target', 'v8_base': '<(PRODUCT_DIR)/libv8_snapshot.a', }], # V8 pointer compression only supports 64bit architectures. ['target_arch in "arm ia32 mips mipsel ppc"', { 'v8_enable_pointer_compression': 0, + 'v8_enable_pointer_compression_shared_cage': 0, 'v8_enable_31bit_smis_on_64bit_arch': 0, + 'v8_enable_external_code_space': 0, + 'v8_enable_sandbox': 0 }], ['target_arch in "ppc64 s390x"', { 'v8_enable_backtrace': 1, }], - ['OS=="linux"', { + ['OS=="linux" or OS=="openharmony"', { 'node_section_ordering_info%': '' }], ['OS == "zos"', { @@ -154,6 +158,9 @@ 'cflags': [ '-fPIC' ], 'ldflags': [ '-fPIC' ] }], + ['clang==1', { + 'msbuild_toolset': 'ClangCL', + }], ], 'msvs_settings': { 'VCCLCompilerTool': { @@ -182,10 +189,10 @@ }, { 'MSVC_runtimeType': 2 # MultiThreadedDLL (/MD) }], - ['llvm_version=="0.0"', { - 'lto': ' -flto=4 -fuse-linker-plugin -ffat-lto-objects ', # GCC - }, { + ['clang==1', { 'lto': ' -flto ', # Clang + }, { + 'lto': ' -flto=4 -fuse-linker-plugin -ffat-lto-objects ', # GCC }], ], }, @@ -198,7 +205,7 @@ 'LLVM_LTO': 'YES', }, }], - ['OS=="linux"', { + ['OS=="linux" or OS=="openharmony"', { 'conditions': [ ['node_section_ordering_info!=""', { 'cflags': [ @@ -226,7 +233,7 @@ # frames otherwise, even with --call-graph dwarf. 'cflags': [ '-fno-omit-frame-pointer' ], }], - ['OS=="linux"', { + ['OS=="linux" or OS=="openharmony"', { 'conditions': [ ['enable_pgo_generate=="true"', { 'cflags': ['<(pgo_generate)'], @@ -242,6 +249,9 @@ 'cflags': [ '-fPIC', '-I<(android_ndk_path)/sources/android/cpufeatures' ], 'ldflags': [ '-fPIC' ] }], + ['clang==1', { + 'msbuild_toolset': 'ClangCL', + }], ], 'msvs_settings': { 'VCCLCompilerTool': { @@ -269,6 +279,9 @@ # Defines these mostly for node-gyp to pickup. 'defines': [ '_GLIBCXX_USE_CXX11_ABI=1', + # This help forks when building Node.js on a 32-bit arch as + # libuv is always compiled with _FILE_OFFSET_BITS=64 + '_FILE_OFFSET_BITS=64' ], # Forcibly disable -Werror. We support a wide range of compilers, it's @@ -284,9 +297,31 @@ ], 'msvs_settings': { 'VCCLCompilerTool': { - 'AdditionalOptions': [ - '/Zc:__cplusplus', - '-std:c++17' + # TODO(targos): Remove condition and always use LanguageStandard options + # once node-gyp supports them. + 'conditions': [ + ['clang==1', { + 'LanguageStandard': 'stdcpp20', + 'LanguageStandard_C': 'stdc11', + 'AdditionalOptions': [ + '/Zc:__cplusplus', + # The following option reduces the "error C1060: compiler is out of heap space" + '/Zm2000', + ], + }, { + 'AdditionalOptions': [ + '/Zc:__cplusplus', + # The following option enables c++20 on Windows. This is needed for V8 v12.4+ + '-std:c++20', + # The following option reduces the "error C1060: compiler is out of heap space" + '/Zm2000', + ], + }], + ['control_flow_guard=="true"', { + 'AdditionalOptions': [ + '/guard:cf', # Control Flow Guard + ], + }], ], 'BufferSecurityCheck': 'true', 'DebugInformationFormat': 1, # /Z7 embed info in .obj files @@ -313,6 +348,11 @@ ['target_arch=="arm64"', { 'TargetMachine' : 0, # NotSet. MACHINE:ARM64 is inferred from the input files. }], + ['control_flow_guard=="true"', { + 'AdditionalOptions': [ + '/guard:cf', # Control Flow Guard + ], + }], ], 'GenerateDebugInformation': 'true', 'SuppressStartupBanner': 'true', @@ -409,9 +449,6 @@ ['v8_enable_pointer_compression_shared_cage == 1', { 'defines': ['V8_COMPRESS_POINTERS_IN_SHARED_CAGE'], }], - ['v8_enable_pointer_compression == 1 and v8_enable_pointer_compression_shared_cage != 1', { - 'defines': ['V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE'], - }], ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1', { 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'], }], @@ -421,6 +458,9 @@ ['v8_enable_sandbox == 1', { 'defines': ['V8_ENABLE_SANDBOX',], }], + ['v8_enable_external_code_space == 1', { + 'defines': ['V8_EXTERNAL_CODE_SPACE',], + }], ['v8_deprecation_warnings == 1', { 'defines': ['V8_DEPRECATION_WARNINGS',], }], @@ -455,15 +495,24 @@ '_HAS_EXCEPTIONS=0', 'BUILDING_V8_SHARED=1', 'BUILDING_UV_SHARED=1', + # Stop <windows.h> from defining macros that conflict with + # std::min() and std::max(). We don't use <windows.h> (much) + # but we still inherit it from uv.h. + 'NOMINMAX', ], }], - [ 'OS in "linux freebsd openbsd solaris aix os400"', { + [ 'OS in "linux freebsd openbsd solaris aix os400 openharmony"', { 'cflags': [ '-pthread' ], 'ldflags': [ '-pthread' ], }], - [ 'OS in "linux freebsd openbsd solaris android aix os400 cloudabi"', { + [ 'OS in "linux freebsd openbsd solaris android aix os400 cloudabi openharmony"', { 'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ], - 'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++17' ], + 'cflags_cc': [ + '-fno-rtti', + '-fno-exceptions', + '-fno-strict-aliasing', + '-std=gnu++17', + ], 'defines': [ '__STDC_FORMAT_MACROS' ], 'ldflags': [ '-rdynamic' ], 'target_conditions': [ @@ -490,7 +539,12 @@ 'ldflags': [ '-m32' ], }], [ 'host_arch=="ppc64" and OS not in "aix os400"', { - 'cflags': [ '-m64', '-mminimal-toc' ], + 'conditions': [ + [ 'clang==0', { + 'cflags': [ '-mminimal-toc' ], + }], + ], + 'cflags': [ '-m64' ], 'ldflags': [ '-m64' ], }], [ 'host_arch=="s390x" and OS=="linux"', { @@ -514,7 +568,12 @@ 'ldflags': [ '-m32' ], }], [ 'target_arch=="ppc64" and OS not in "aix os400"', { - 'cflags': [ '-m64', '-mminimal-toc' ], + 'conditions': [ + [ 'clang==0', { + 'cflags': [ '-mminimal-toc' ], + }], + ], + 'cflags': [ '-m64' ], 'ldflags': [ '-m64' ], }], [ 'target_arch=="s390x" and OS=="linux"', { @@ -554,6 +613,9 @@ '-Wl,-brtl', ], }, { # else it's `AIX` + 'variables': { + 'gcc_major': '<!(sh -c "${CXX:-g++} -dumpversion")' + }, # Disable the following compiler warning: # # warning: visibility attribute not supported in this @@ -564,7 +626,7 @@ # out more relevant warnings. 'cflags': [ '-Wno-attributes' ], 'ldflags': [ - '-Wl,-blibpath:/usr/lib:/lib:/opt/freeware/lib/pthread/ppc64', + '-Wl,-blibpath:/usr/lib:/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix7.3.0.0/>(gcc_major)/pthread/ppc64:/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/>(gcc_major)/pthread/ppc64:/opt/freeware/lib/pthread/ppc64', ], }], ], @@ -591,12 +653,10 @@ 'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions 'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti 'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings + 'GCC_STRICT_ALIASING': 'NO', # -fno-strict-aliasing 'PREBINDING': 'NO', # No -Wl,-prebind 'MACOSX_DEPLOYMENT_TARGET': '11.0', # -mmacosx-version-min=11.0 'USE_HEADERMAP': 'NO', - 'OTHER_CFLAGS': [ - '-fno-strict-aliasing', - ], 'WARNING_CFLAGS': [ '-Wall', '-Wendif-labels', diff --git a/common_node.gypi b/common_node.gypi new file mode 100644 index 00000000000000..0bfbf7283c0f57 --- /dev/null +++ b/common_node.gypi @@ -0,0 +1,16 @@ +{ + 'target_defaults': { + 'conditions': [ + # Override common.gypi config to use C++20 for Node.js core only. + ['OS in "linux freebsd openbsd solaris android aix os400 cloudabi"', { + 'cflags_cc!': ['-std=gnu++17'], + 'cflags_cc': ['-std=gnu++20'], + }], + ['OS=="mac" and clang==1', { + 'xcode_settings': { + 'CLANG_CXX_LANGUAGE_STANDARD': 'gnu++20', # -std=gnu++20 + }, + }], + ], + }, +} diff --git a/configure b/configure index 711a3014b9a67f..789a87c5377f35 100755 --- a/configure +++ b/configure @@ -4,13 +4,13 @@ # Note that the mix of single and double quotes is intentional, # as is the fact that the ] goes on a new line. _=[ 'exec' '/bin/sh' '-c' ''' +command -v python3.14 >/dev/null && exec python3.14 "$0" "$@" +command -v python3.13 >/dev/null && exec python3.13 "$0" "$@" command -v python3.12 >/dev/null && exec python3.12 "$0" "$@" command -v python3.11 >/dev/null && exec python3.11 "$0" "$@" command -v python3.10 >/dev/null && exec python3.10 "$0" "$@" command -v python3.9 >/dev/null && exec python3.9 "$0" "$@" command -v python3.8 >/dev/null && exec python3.8 "$0" "$@" -command -v python3.7 >/dev/null && exec python3.7 "$0" "$@" -command -v python3.6 >/dev/null && exec python3.6 "$0" "$@" command -v python3 >/dev/null && exec python3 "$0" "$@" exec python "$0" "$@" ''' "$0" "$@" @@ -24,7 +24,7 @@ except ImportError: from distutils.spawn import find_executable as which print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info)) -acceptable_pythons = ((3, 12), (3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) +acceptable_pythons = ((3, 14), (3, 13), (3, 12), (3, 11), (3, 10), (3, 9), (3, 8)) if sys.version_info[:2] in acceptable_pythons: import configure else: diff --git a/configure.py b/configure.py index 1d7c095d03dbc2..77c87f5a953971 100755 --- a/configure.py +++ b/configure.py @@ -20,9 +20,9 @@ original_argv = sys.argv[1:] # gcc and g++ as defaults matches what GYP's Makefile generator does, -# except on OS X. -CC = os.environ.get('CC', 'cc' if sys.platform == 'darwin' else 'gcc') -CXX = os.environ.get('CXX', 'c++' if sys.platform == 'darwin' else 'g++') +# except on macOS and Windows. +CC = os.environ.get('CC', 'cc' if sys.platform == 'darwin' else 'clang' if sys.platform == 'win32' else 'gcc') +CXX = os.environ.get('CXX', 'c++' if sys.platform == 'darwin' else 'clang' if sys.platform == 'win32' else 'g++') tools_path = Path('tools') @@ -46,7 +46,7 @@ parser = argparse.ArgumentParser() valid_os = ('win', 'mac', 'solaris', 'freebsd', 'openbsd', 'linux', - 'android', 'aix', 'cloudabi', 'os400', 'ios') + 'android', 'aix', 'cloudabi', 'os400', 'ios', 'openharmony') valid_arch = ('arm', 'arm64', 'ia32', 'mips', 'mipsel', 'mips64el', 'ppc', 'ppc64', 'x64', 'x86', 'x86_64', 's390x', 'riscv64', 'loong64') valid_arm_float_abi = ('soft', 'softfp', 'hard') @@ -56,11 +56,12 @@ valid_mips_float_abi = ('soft', 'hard') valid_intl_modes = ('none', 'small-icu', 'full-icu', 'system-icu') icu_versions = json.loads((tools_path / 'icu' / 'icu_versions.json').read_text(encoding='utf-8')) -maglev_enabled_architectures = ('x64', 'arm', 'arm64') +# builtins may be removed later if they have been disabled by options shareable_builtins = {'cjs_module_lexer/lexer': 'deps/cjs-module-lexer/lexer.js', 'cjs_module_lexer/dist/lexer': 'deps/cjs-module-lexer/dist/lexer.js', - 'undici/undici': 'deps/undici/undici.js' + 'undici/undici': 'deps/undici/undici.js', + 'amaro/dist/index': 'deps/amaro/dist/index.js' } # create option groups @@ -129,6 +130,12 @@ default=None, help='use the prefix to look for pre-installed headers') +parser.add_argument('--use_clang', + action='store_true', + dest='use_clang', + default=None, + help='use clang instead of gcc') + parser.add_argument('--dest-os', action='store', dest='dest_os', @@ -141,6 +148,12 @@ default=None, help='Turn compiler warnings into errors for node core sources.') +parser.add_argument('--suppress-all-error-on-warn', + action='store_true', + dest='suppress_all_error_on_warn', + default=False, + help='Suppress cases where compiler warnings are turned into errors by default.') + parser.add_argument('--gdb', action='store_true', dest='gdb', @@ -164,14 +177,14 @@ dest="fully_static", default=None, help="Generate an executable without external dynamic libraries. This " - "will not work on OSX when using the default compilation environment") + "will not work on macOS when using the default compilation environment") parser.add_argument("--partly-static", action="store_true", dest="partly_static", default=None, help="Generate an executable with libgcc and libstdc++ libraries. This " - "will not work on OSX when using the default compilation environment") + "will not work on macOS when using the default compilation environment") parser.add_argument("--enable-vtune-profiling", action="store_true", @@ -382,6 +395,28 @@ dest='shared_openssl_libpath', help='a directory to search for the shared OpenSSL DLLs') +shared_optgroup.add_argument('--shared-uvwasi', + action='store_true', + dest='shared_uvwasi', + default=None, + help='link to a shared uvwasi DLL instead of static linking') + +shared_optgroup.add_argument('--shared-uvwasi-includes', + action='store', + dest='shared_uvwasi_includes', + help='directory containing uvwasi header files') + +shared_optgroup.add_argument('--shared-uvwasi-libname', + action='store', + dest='shared_uvwasi_libname', + default='uvwasi', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-uvwasi-libpath', + action='store', + dest='shared_uvwasi_libpath', + help='a directory to search for the shared uvwasi DLL') + shared_optgroup.add_argument('--shared-zlib', action='store_true', dest='shared_zlib', @@ -404,6 +439,74 @@ dest='shared_zlib_libpath', help='a directory to search for the shared zlib DLL') +shared_optgroup.add_argument('--shared-simdjson', + action='store_true', + dest='shared_simdjson', + default=None, + help='link to a shared simdjson DLL instead of static linking') + +shared_optgroup.add_argument('--shared-simdjson-includes', + action='store', + dest='shared_simdjson_includes', + help='directory containing simdjson header files') + +shared_optgroup.add_argument('--shared-simdjson-libname', + action='store', + dest='shared_simdjson_libname', + default='simdjson', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-simdjson-libpath', + action='store', + dest='shared_simdjson_libpath', + help='a directory to search for the shared simdjson DLL') + + +shared_optgroup.add_argument('--shared-simdutf', + action='store_true', + dest='shared_simdutf', + default=None, + help='link to a shared simdutf DLL instead of static linking') + +shared_optgroup.add_argument('--shared-simdutf-includes', + action='store', + dest='shared_simdutf_includes', + help='directory containing simdutf header files') + +shared_optgroup.add_argument('--shared-simdutf-libname', + action='store', + dest='shared_simdutf_libname', + default='simdutf', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-simdutf-libpath', + action='store', + dest='shared_simdutf_libpath', + help='a directory to search for the shared simdutf DLL') + + +shared_optgroup.add_argument('--shared-ada', + action='store_true', + dest='shared_ada', + default=None, + help='link to a shared ada DLL instead of static linking') + +shared_optgroup.add_argument('--shared-ada-includes', + action='store', + dest='shared_ada_includes', + help='directory containing ada header files') + +shared_optgroup.add_argument('--shared-ada-libname', + action='store', + dest='shared_ada_libname', + default='ada', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-ada-libpath', + action='store', + dest='shared_ada_libpath', + help='a directory to search for the shared ada DLL') + shared_optgroup.add_argument('--shared-brotli', action='store_true', dest='shared_brotli', @@ -448,6 +551,50 @@ dest='shared_cares_libpath', help='a directory to search for the shared cares DLL') +shared_optgroup.add_argument('--shared-sqlite', + action='store_true', + dest='shared_sqlite', + default=None, + help='link to a shared sqlite DLL instead of static linking') + +shared_optgroup.add_argument('--shared-sqlite-includes', + action='store', + dest='shared_sqlite_includes', + help='directory containing sqlite header files') + +shared_optgroup.add_argument('--shared-sqlite-libname', + action='store', + dest='shared_sqlite_libname', + default='sqlite3', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-sqlite-libpath', + action='store', + dest='shared_sqlite_libpath', + help='a directory to search for the shared sqlite DLL') + +shared_optgroup.add_argument('--shared-zstd', + action='store_true', + dest='shared_zstd', + default=None, + help='link to a shared zstd DLL instead of static linking') + +shared_optgroup.add_argument('--shared-zstd-includes', + action='store', + dest='shared_zstd_includes', + help='directory containing zstd header files') + +shared_optgroup.add_argument('--shared-zstd-libname', + action='store', + dest='shared_zstd_libname', + default='zstd', + help='alternative lib name to link to [default: %(default)s]') + +shared_optgroup.add_argument('--shared-zstd-libpath', + action='store', + dest='shared_zstd_libpath', + help='a directory to search for the shared zstd DLL') + parser.add_argument_group(shared_optgroup) for builtin in shareable_builtins: @@ -458,15 +605,11 @@ help='Path to shared file for ' + builtin + ' builtin. ' 'Will be used instead of bundled version at runtime') -parser.add_argument_group(shared_builtin_optgroup) - static_optgroup.add_argument('--static-zoslib-gyp', action='store', dest='static_zoslib_gyp', help='path to zoslib.gyp file for includes and to link to static zoslib library') -parser.add_argument_group(static_optgroup) - parser.add_argument('--tag', action='store', dest='tag', @@ -485,6 +628,12 @@ default=None, help=argparse.SUPPRESS) # Unsupported, undocumented. +parser.add_argument('--enable-v8windbg', + action='store_true', + dest='enable_v8windbg', + default=None, + help=argparse.SUPPRESS) # Undocumented. + parser.add_argument('--enable-trace-maps', action='store_true', dest='trace_maps', @@ -646,8 +795,6 @@ default='deps', help='Download directory [default: %(default)s]') -parser.add_argument_group(intl_optgroup) - parser.add_argument('--debug-lib', action='store_true', dest='node_debug_lib', @@ -660,7 +807,11 @@ default=None, help='build nghttp2 with DEBUGBUILD (default is false)') -parser.add_argument_group(http2_optgroup) +parser.add_argument('--without-amaro', + action='store_true', + dest='without_amaro', + default=None, + help='do not install the bundled Amaro (TypeScript utils)') parser.add_argument('--without-npm', action='store_true', @@ -674,6 +825,12 @@ default=None, help='do not install the bundled Corepack') +parser.add_argument('--control-flow-guard', + action='store_true', + dest='enable_cfg', + default=None, + help='enable Control Flow Guard (CFG)') + # Dummy option for backwards compatibility parser.add_argument('--without-report', action='store_true', @@ -713,6 +870,12 @@ default=None, help='build without NODE_OPTIONS support') +parser.add_argument('--without-sqlite', + action='store_true', + dest='without_sqlite', + default=None, + help='build without SQLite (disables SQLite and Web Storage API)') + parser.add_argument('--ninja', action='store_true', dest='use_ninja', @@ -825,13 +988,11 @@ help='Enable V8 transparent hugepage support. This feature is only '+ 'available on Linux platform.') -maglev_enabled_by_default_help = f"(Maglev is enabled by default on {','.join(maglev_enabled_architectures)})" - -parser.add_argument('--v8-disable-maglev', +parser.add_argument('--v8-enable-maglev', action='store_true', - dest='v8_disable_maglev', + dest='v8_enable_maglev', default=None, - help=f"Disable V8's Maglev compiler. {maglev_enabled_by_default_help}") + help='Enable V8 Maglev compiler. Not available on all platforms.') parser.add_argument('--v8-enable-short-builtin-calls', action='store_true', @@ -866,6 +1027,18 @@ default=None, help=argparse.SUPPRESS) +parser.add_argument('--clang-cl', + action='store', + dest='clang_cl', + default=None, + help='Configure for clang-cl on Windows. This flag sets the GYP "clang" ' + + 'variable to 1 and "llvm_version" to the specified value.') +parser.add_argument('--use-ccache-win', + action='store_true', + dest='use_ccache_win', + default=None, + help='Use ccache for compiling on Windows. ') + (options, args) = parser.parse_known_args() # Expand ~ in the install prefix now, it gets written to multiple files. @@ -944,7 +1117,7 @@ def try_check_compiler(cc, lang): proc = subprocess.Popen(shlex.split(cc) + ['-E', '-P', '-x', lang, '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) except OSError: - return (False, False, '', '') + return (False, False, '', '', False) with proc: proc.stdin.write(b'__clang__ __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ ' @@ -1041,8 +1214,19 @@ def get_gas_version(cc): # check involves checking the build number against an allowlist. I'm not # quite prepared to go that far yet. def check_compiler(o): + o['variables']['use_ccache_win'] = 0 + if sys.platform == 'win32': - o['variables']['llvm_version'] = '0.0' + if options.clang_cl: + o['variables']['clang'] = 1 + o['variables']['llvm_version'] = options.clang_cl + else: + o['variables']['clang'] = 0 + o['variables']['llvm_version'] = '0.0' + + if options.use_ccache_win: + o['variables']['use_ccache_win'] = 1 + if not options.openssl_no_asm and options.dest_cpu in ('x86', 'x64'): nasm_version = get_nasm_version('nasm') o['variables']['nasm_version'] = nasm_version @@ -1051,6 +1235,7 @@ def check_compiler(o): return ok, is_clang, clang_version, gcc_version = try_check_compiler(CXX, 'c++') + o['variables']['clang'] = B(is_clang) version_str = ".".join(map(str, clang_version if is_clang else gcc_version)) print_verbose(f"Detected {'clang ' if is_clang else ''}C++ compiler (CXX={CXX}) version: {version_str}") if not ok: @@ -1189,6 +1374,9 @@ def host_arch_win(): return matchup.get(arch, 'ia32') +def set_configuration_variable(configs, name, release=None, debug=None): + configs['Release'][name] = release + configs['Debug'][name] = debug def configure_arm(o): if options.arm_float_abi: @@ -1229,7 +1417,7 @@ def configure_zos(o): o['variables']['node_static_zoslib'] = b(True) if options.static_zoslib_gyp: # Apply to all Node.js components for now - o['variables']['zoslib_include_dir'] = Path(options.static_zoslib_gyp).parent + '/include' + o['variables']['zoslib_include_dir'] = Path(options.static_zoslib_gyp).parent / 'include' o['include_dirs'] += [o['variables']['zoslib_include_dir']] else: raise Exception('--static-zoslib-gyp=<path to zoslib.gyp file> is required.') @@ -1255,15 +1443,25 @@ def gcc_version_ge(version_checked): def configure_node_lib_files(o): o['variables']['node_library_files'] = SearchFiles('lib', 'js') +def configure_node_cctest_sources(o): + o['variables']['node_cctest_sources'] = [ 'src/node_snapshot_stub.cc' ] + \ + SearchFiles('test/cctest', 'cc') + \ + SearchFiles('test/cctest', 'h') + def configure_node(o): if options.dest_os == 'android': o['variables']['OS'] = 'android' o['variables']['node_prefix'] = options.prefix o['variables']['node_install_npm'] = b(not options.without_npm) o['variables']['node_install_corepack'] = b(not options.without_corepack) + o['variables']['control_flow_guard'] = b(options.enable_cfg) + o['variables']['node_use_amaro'] = b(not options.without_amaro) o['variables']['debug_node'] = b(options.debug_node) o['default_configuration'] = 'Debug' if options.debug else 'Release' + if options.error_on_warn and options.suppress_all_error_on_warn: + raise Exception('--error_on_warn is incompatible with --suppress_all_error_on_warn.') o['variables']['error_on_warn'] = b(options.error_on_warn) + o['variables']['suppress_all_error_on_warn'] = b(options.suppress_all_error_on_warn) o['variables']['use_prefix_to_find_headers'] = b(options.use_prefix_to_find_headers) host_arch = host_arch_win() if os.name == 'nt' else host_arch_cc() @@ -1279,6 +1477,10 @@ def configure_node(o): o['variables']['target_arch'] = target_arch o['variables']['node_byteorder'] = sys.byteorder + # Allow overriding the compiler - needed by embedders. + if options.use_clang: + o['variables']['clang'] = 1 + cross_compiling = (options.cross_compiling if options.cross_compiling is not None else target_arch != host_arch) @@ -1310,7 +1512,9 @@ def configure_node(o): o['variables']['node_use_node_snapshot'] = b( not cross_compiling and not options.shared) - if options.without_node_code_cache or options.without_node_snapshot or options.node_builtin_modules_path: + # Do not use code cache when Node.js is built for collecting coverage of itself, this allows more + # precise coverage for the JS built-ins. + if options.without_node_code_cache or options.without_node_snapshot or options.node_builtin_modules_path or options.coverage: o['variables']['node_use_node_code_cache'] = 'false' else: # TODO(refack): fix this when implementing embedded code-cache when cross-compiling. @@ -1503,34 +1707,45 @@ def configure_library(lib, output, pkgname=None): output['libraries'] += pkg_libs.split() -def configure_v8(o): +def configure_v8(o, configs): + set_configuration_variable(configs, 'v8_enable_v8_checks', release=1, debug=0) + o['variables']['v8_enable_webassembly'] = 0 if options.v8_lite_mode else 1 o['variables']['v8_enable_javascript_promise_hooks'] = 1 o['variables']['v8_enable_lite_mode'] = 1 if options.v8_lite_mode else 0 o['variables']['v8_enable_gdbjit'] = 1 if options.gdb else 0 - o['variables']['v8_no_strict_aliasing'] = 1 # Work around compiler bugs. o['variables']['v8_optimized_debug'] = 0 if options.v8_non_optimized_debug else 1 o['variables']['dcheck_always_on'] = 1 if options.v8_with_dchecks else 0 o['variables']['v8_enable_object_print'] = 0 if options.v8_disable_object_print else 1 o['variables']['v8_random_seed'] = 0 # Use a random seed for hash tables. o['variables']['v8_promise_internal_field_count'] = 1 # Add internal field to promises for async hooks. o['variables']['v8_use_siphash'] = 0 if options.without_siphash else 1 - o['variables']['v8_enable_maglev'] = B(not options.v8_disable_maglev and - o['variables']['target_arch'] in maglev_enabled_architectures) + o['variables']['v8_enable_maglev'] = 1 if options.v8_enable_maglev else 0 o['variables']['v8_enable_pointer_compression'] = 1 if options.enable_pointer_compression else 0 + # Using the sandbox requires always allocating array buffer backing stores in the sandbox. + # We currently have many backing stores tied to pointers from C++ land that are not + # even necessarily dynamic (e.g. in static storage) for fast communication between JS and C++. + # Until we manage to get rid of all those, v8_enable_sandbox cannot be used. + # Note that enabling pointer compression without enabling sandbox is unsupported by V8, + # so this can be broken at any time. + o['variables']['v8_enable_sandbox'] = 0 + o['variables']['v8_enable_pointer_compression_shared_cage'] = 1 if options.enable_pointer_compression else 0 + 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_shared_ro_heap'] = 0 if options.enable_pointer_compression or options.disable_shared_ro_heap else 1 o['variables']['v8_enable_extensible_ro_snapshot'] = 0 - o['variables']['v8_enable_v8_checks'] = 1 if options.debug 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) o['variables']['force_dynamic_crt'] = 1 if options.shared else 0 o['variables']['node_enable_d8'] = b(options.enable_d8) + o['variables']['node_enable_v8windbg'] = b(options.enable_v8windbg) if options.enable_d8: o['variables']['test_isolation_mode'] = 'noop' # Needed by d8.gyp. if options.without_bundled_v8 and options.enable_d8: raise Exception('--enable-d8 is incompatible with --without-bundled-v8.') + if options.without_bundled_v8 and options.enable_v8windbg: + raise Exception('--enable-v8windbg is incompatible with --without-bundled-v8.') if options.static_zoslib_gyp: o['variables']['static_zoslib_gyp'] = options.static_zoslib_gyp if flavor != 'linux' and options.v8_enable_hugepage: @@ -1540,10 +1755,13 @@ def configure_v8(o): o['variables']['v8_enable_short_builtin_calls'] = 1 if options.v8_enable_snapshot_compression: o['variables']['v8_enable_snapshot_compression'] = 1 - if options.v8_enable_object_print and options.v8_disable_object_print: + if all(opt in sys.argv for opt in ['--v8-enable-object-print', '--v8-disable-object-print']): raise Exception( 'Only one of the --v8-enable-object-print or --v8-disable-object-print options ' 'can be specified at a time.') + if sys.platform != 'darwin': + if o['variables']['v8_enable_webassembly'] and o['variables']['target_arch'] == 'x64': + o['variables']['v8_enable_wasm_simd256_revec'] = 1 def configure_openssl(o): variables = o['variables'] @@ -1624,11 +1842,21 @@ def without_ssl_error(option): configure_library('openssl', o) +def configure_sqlite(o): + o['variables']['node_use_sqlite'] = b(not options.without_sqlite) + if options.without_sqlite: + def without_sqlite_error(option): + error(f'--without-sqlite is incompatible with {option}') + if options.shared_sqlite: + without_sqlite_error('--shared-sqlite') + return + + configure_library('sqlite', o, pkgname='sqlite3') def configure_static(o): if options.fully_static or options.partly_static: if flavor == 'mac': - warn("Generation of static executable will not work on OSX " + warn("Generation of static executable will not work on macOS " "when using the default compilation environment") return @@ -1748,7 +1976,7 @@ def icu_download(path): elif with_intl == 'system-icu': # ICU from pkg-config. o['variables']['v8_enable_i18n_support'] = 1 - pkgicu = pkg_config('icu-i18n') + pkgicu = pkg_config(['icu-i18n', 'icu-uc']) if not pkgicu[0]: error('''Could not load pkg-config data for "icu-i18n". See above errors or the README.md.''') @@ -1999,7 +2227,7 @@ def make_bin_override(): if sys.platform == 'win32': raise Exception('make_bin_override should not be called on win32.') # If the system python is not the python we are running (which should be - # python 3), then create a directory with a symlink called `python` to our + # python 3.8+), then create a directory with a symlink called `python` to our # sys.executable. This directory will be prefixed to the PATH, so that # other tools that shell out to `python` will use the appropriate python @@ -2037,6 +2265,10 @@ def make_bin_override(): 'defines': [], 'cflags': [], } +configurations = { + 'Release': { 'variables': {} }, + 'Debug': { 'variables': {} }, +} # Print a warning when the compiler is too old. check_compiler(output) @@ -2050,22 +2282,33 @@ def make_bin_override(): configure_node(output) configure_node_lib_files(output) +configure_node_cctest_sources(output) configure_napi(output) configure_library('zlib', output) configure_library('http_parser', output) configure_library('libuv', output) +configure_library('ada', output) +configure_library('simdjson', output) +configure_library('simdutf', output) configure_library('brotli', output, pkgname=['libbrotlidec', 'libbrotlienc']) configure_library('cares', output, pkgname='libcares') configure_library('nghttp2', output, pkgname='libnghttp2') configure_library('nghttp3', output, pkgname='libnghttp3') configure_library('ngtcp2', output, pkgname='libngtcp2') -configure_v8(output) +configure_sqlite(output); +configure_library('uvwasi', output) +configure_library('zstd', output, pkgname='libzstd') +configure_v8(output, configurations) configure_openssl(output) configure_intl(output) configure_static(output) configure_inspector(output) configure_section_file(output) +# remove builtins that have been disabled +if options.without_amaro: + del shareable_builtins['amaro/dist/index'] + # configure shareable builtins output['variables']['node_builtin_shareable_builtins'] = [] for builtin, value in shareable_builtins.items(): @@ -2082,7 +2325,6 @@ def make_bin_override(): # move everything else to target_defaults variables = output['variables'] del output['variables'] -variables['is_debug'] = B(options.debug) # make_global_settings should be a root level element too if 'make_global_settings' in output: @@ -2091,6 +2333,9 @@ def make_bin_override(): else: make_global_settings = False +# Add configurations to target defaults +output['configurations'] = configurations + output = { 'variables': variables, 'target_defaults': output, @@ -2100,8 +2345,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=1024) + '\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') @@ -2164,8 +2410,9 @@ def make_bin_override(): if options.compile_commands_json: gyp_args += ['-f', 'compile_commands_json'] - os.path.islink('./compile_commands.json') and os.unlink('./compile_commands.json') - os.symlink('./out/' + config['BUILDTYPE'] + '/compile_commands.json', './compile_commands.json') + if sys.platform != 'win32': + os.path.lexists('./compile_commands.json') and os.unlink('./compile_commands.json') + os.symlink('./out/' + config['BUILDTYPE'] + '/compile_commands.json', './compile_commands.json') # pass the leftover non-whitespace positional arguments to GYP gyp_args += [arg for arg in args if not str.isspace(arg)] @@ -2175,4 +2422,7 @@ def make_bin_override(): print_verbose("running: \n " + " ".join(['python', 'tools/gyp_node.py'] + gyp_args)) run_gyp(gyp_args) +if options.compile_commands_json and sys.platform == 'win32': + os.path.isfile('./compile_commands.json') and os.unlink('./compile_commands.json') + shutil.copy2('./out/' + config['BUILDTYPE'] + '/compile_commands.json', './compile_commands.json') info('configure completed successfully') diff --git a/deps/acorn/acorn-walk/CHANGELOG.md b/deps/acorn/acorn-walk/CHANGELOG.md index 0b4eea8a95d3ed..7aeae8fd5c8622 100644 --- a/deps/acorn/acorn-walk/CHANGELOG.md +++ b/deps/acorn/acorn-walk/CHANGELOG.md @@ -1,3 +1,21 @@ +## 8.3.4 (2024-09-09) + +### Bug fixes + +Walk SwitchCase nodes as separate nodes. + +## 8.3.3 (2024-01-11) + +### Bug fixes + +Make acorn a dependency because acorn-walk uses the types from that package. + +## 8.3.2 (2024-01-11) + +### Bug fixes + +Add missing type for `findNodeBefore`. + ## 8.3.1 (2023-12-06) ### Bug fixes diff --git a/deps/acorn/acorn-walk/dist/walk.js b/deps/acorn/acorn-walk/dist/walk.js index 580df6413725f8..40b7aa1b078a18 100644 --- a/deps/acorn/acorn-walk/dist/walk.js +++ b/deps/acorn/acorn-walk/dist/walk.js @@ -215,16 +215,10 @@ }; base.SwitchStatement = function (node, st, c) { c(node.discriminant, st, "Expression"); - for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { - var cs = list$1[i$1]; + for (var i = 0, list = node.cases; i < list.length; i += 1) { + var cs = list[i]; - if (cs.test) { c(cs.test, st, "Expression"); } - for (var i = 0, list = cs.consequent; i < list.length; i += 1) - { - var cons = list[i]; - - c(cons, st, "Statement"); - } + c(cs, st); } }; base.SwitchCase = function (node, st, c) { diff --git a/deps/acorn/acorn-walk/dist/walk.mjs b/deps/acorn/acorn-walk/dist/walk.mjs index 19eebc0e70f598..c475ababc7ac30 100644 --- a/deps/acorn/acorn-walk/dist/walk.mjs +++ b/deps/acorn/acorn-walk/dist/walk.mjs @@ -209,16 +209,10 @@ base.WithStatement = function (node, st, c) { }; base.SwitchStatement = function (node, st, c) { c(node.discriminant, st, "Expression"); - for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { - var cs = list$1[i$1]; + for (var i = 0, list = node.cases; i < list.length; i += 1) { + var cs = list[i]; - if (cs.test) { c(cs.test, st, "Expression"); } - for (var i = 0, list = cs.consequent; i < list.length; i += 1) - { - var cons = list[i]; - - c(cons, st, "Statement"); - } + c(cs, st); } }; base.SwitchCase = function (node, st, c) { diff --git a/deps/acorn/acorn-walk/package.json b/deps/acorn/acorn-walk/package.json index 9d3b7e5248fb83..133059576956d8 100644 --- a/deps/acorn/acorn-walk/package.json +++ b/deps/acorn/acorn-walk/package.json @@ -16,10 +16,13 @@ ], "./package.json": "./package.json" }, - "version": "8.3.2", + "version": "8.3.4", "engines": { "node": ">=0.4.0" }, + "dependencies": { + "acorn": "^8.11.0" + }, "maintainers": [ { "name": "Marijn Haverbeke", diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md index eb848a58b8a091..c86068cd71ab47 100644 --- a/deps/acorn/acorn/CHANGELOG.md +++ b/deps/acorn/acorn/CHANGELOG.md @@ -1,3 +1,77 @@ +## 8.15.0 (2025-06-08) + +### New features + +Support `using` and `await using` syntax. + +The `AnyNode` type is now defined in such a way that plugins can extend it. + +### Bug fixes + +Fix an issue where the `bigint` property of literal nodes for non-decimal bigints had the wrong format. + +The `acorn` CLI tool no longer crashes when emitting a tree that contains a bigint. + +## 8.14.1 (2025-03-05) + +### Bug fixes + +Fix an issue where `await` expressions in class field initializers were inappropriately allowed. + +Properly allow await inside an async arrow function inside a class field initializer. + +Mention the source file name in syntax error messages when given. + +Properly add an empty `attributes` property to every form of `ExportNamedDeclaration`. + +## 8.14.0 (2024-10-27) + +### New features + +Support ES2025 import attributes. + +Support ES2025 RegExp modifiers. + +### Bug fixes + +Support some missing Unicode properties. + +## 8.13.0 (2024-10-16) + +### New features + +Upgrade to Unicode 16.0. + +## 8.12.1 (2024-07-03) + +### Bug fixes + +Fix a regression that caused Acorn to no longer run on Node versions <8.10. + +## 8.12.0 (2024-06-14) + +### New features + +Support ES2025 duplicate capture group names in regular expressions. + +### Bug fixes + +Include `VariableDeclarator` in the `AnyNode` type so that walker objects can refer to it without getting a type error. + +Properly raise a parse error for invalid `for`/`of` statements using `async` as binding name. + +Properly recognize \"use strict\" when preceded by a string with an escaped newline. + +Mark the `Parser` constructor as protected, not private, so plugins can extend it without type errors. + +Fix a bug where some invalid `delete` expressions were let through when the operand was parenthesized and `preserveParens` was enabled. + +Properly normalize line endings in raw strings of invalid template tokens. + +Properly track line numbers for escaped newlines in strings. + +Fix a bug that broke line number accounting after a template literal with invalid escape sequences. + ## 8.11.3 (2023-12-29) ### Bug fixes diff --git a/deps/acorn/acorn/README.md b/deps/acorn/acorn/README.md index cfc51b384a3e2b..f7ff9662419308 100644 --- a/deps/acorn/acorn/README.md +++ b/deps/acorn/acorn/README.md @@ -50,12 +50,11 @@ Options are provided by in a second argument, which should be an object containing any of these fields (only `ecmaVersion` is required): -- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be - either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019), - 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` (the - latest the library supports). This influences support for strict - mode, the set of reserved words, and support for new syntax - features. +- **ecmaVersion**: Indicates the ECMAScript version to parse. Can be a + number, either in year (`2022`) or plain version number (`6`) form, + or `"latest"` (the latest the library supports). This influences + support for strict mode, the set of reserved words, and support for + new syntax features. **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being implemented by Acorn. Other proposed new features must be diff --git a/deps/acorn/acorn/dist/acorn.d.mts b/deps/acorn/acorn/dist/acorn.d.mts index 6ad58121195c96..f2ec5243bcb262 100644 --- a/deps/acorn/acorn/dist/acorn.d.mts +++ b/deps/acorn/acorn/dist/acorn.d.mts @@ -169,7 +169,7 @@ export interface FunctionDeclaration extends Function { export interface VariableDeclaration extends Node { type: "VariableDeclaration" declarations: Array<VariableDeclarator> - kind: "var" | "let" | "const" + kind: "var" | "let" | "const" | "using" | "await using" } export interface VariableDeclarator extends Node { @@ -403,6 +403,7 @@ export interface ImportDeclaration extends Node { type: "ImportDeclaration" specifiers: Array<ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier> source: Literal + attributes: Array<ImportAttribute> } export interface ImportSpecifier extends Node { @@ -421,11 +422,18 @@ export interface ImportNamespaceSpecifier extends Node { local: Identifier } +export interface ImportAttribute extends Node { + type: "ImportAttribute" + key: Identifier | Literal + value: Literal +} + export interface ExportNamedDeclaration extends Node { type: "ExportNamedDeclaration" declaration?: Declaration | null specifiers: Array<ExportSpecifier> source?: Literal | null + attributes: Array<ImportAttribute> } export interface ExportSpecifier extends Node { @@ -454,6 +462,7 @@ export interface ExportAllDeclaration extends Node { type: "ExportAllDeclaration" source: Literal exported?: Identifier | Literal | null + attributes: Array<ImportAttribute> } export interface AwaitExpression extends Node { @@ -469,6 +478,7 @@ export interface ChainExpression extends Node { export interface ImportExpression extends Node { type: "ImportExpression" source: Expression + options: Expression | null } export interface ParenthesizedExpression extends Node { @@ -562,7 +572,24 @@ export type ModuleDeclaration = | ExportDefaultDeclaration | ExportAllDeclaration -export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock +/** + * This interface is only used for defining {@link AnyNode}. + * It exists so that it can be extended by plugins: + * + * @example + * ```typescript + * declare module 'acorn' { + * interface NodeTypes { + * pluginName: FirstNode | SecondNode | ThirdNode | ... | LastNode + * } + * } + * ``` + */ +interface NodeTypes { + core: Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportAttribute | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock | VariableDeclarator +} + +export type AnyNode = NodeTypes[keyof NodeTypes] export function parse(input: string, options: Options): Program @@ -573,16 +600,15 @@ export function tokenizer(input: string, options: Options): { [Symbol.iterator](): Iterator<Token> } -export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest" +export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | "latest" export interface Options { /** - * `ecmaVersion` indicates the ECMAScript version to parse. Must be - * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 - * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` - * (the latest version the library supports). This influences - * support for strict mode, the set of reserved words, and support - * for new syntax features. + * `ecmaVersion` indicates the ECMAScript version to parse. Can be a + * number, either in year (`2022`) or plain version number (`6`) form, + * or `"latest"` (the latest the library supports). This influences + * support for strict mode, the set of reserved words, and support for + * new syntax features. */ ecmaVersion: ecmaVersion @@ -733,7 +759,7 @@ export class Parser { options: Options input: string - private constructor(options: Options, input: string, startPos?: number) + protected constructor(options: Options, input: string, startPos?: number) parse(): Program static parse(input: string, options: Options): Program diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts index 6ad58121195c96..f2ec5243bcb262 100644 --- a/deps/acorn/acorn/dist/acorn.d.ts +++ b/deps/acorn/acorn/dist/acorn.d.ts @@ -169,7 +169,7 @@ export interface FunctionDeclaration extends Function { export interface VariableDeclaration extends Node { type: "VariableDeclaration" declarations: Array<VariableDeclarator> - kind: "var" | "let" | "const" + kind: "var" | "let" | "const" | "using" | "await using" } export interface VariableDeclarator extends Node { @@ -403,6 +403,7 @@ export interface ImportDeclaration extends Node { type: "ImportDeclaration" specifiers: Array<ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier> source: Literal + attributes: Array<ImportAttribute> } export interface ImportSpecifier extends Node { @@ -421,11 +422,18 @@ export interface ImportNamespaceSpecifier extends Node { local: Identifier } +export interface ImportAttribute extends Node { + type: "ImportAttribute" + key: Identifier | Literal + value: Literal +} + export interface ExportNamedDeclaration extends Node { type: "ExportNamedDeclaration" declaration?: Declaration | null specifiers: Array<ExportSpecifier> source?: Literal | null + attributes: Array<ImportAttribute> } export interface ExportSpecifier extends Node { @@ -454,6 +462,7 @@ export interface ExportAllDeclaration extends Node { type: "ExportAllDeclaration" source: Literal exported?: Identifier | Literal | null + attributes: Array<ImportAttribute> } export interface AwaitExpression extends Node { @@ -469,6 +478,7 @@ export interface ChainExpression extends Node { export interface ImportExpression extends Node { type: "ImportExpression" source: Expression + options: Expression | null } export interface ParenthesizedExpression extends Node { @@ -562,7 +572,24 @@ export type ModuleDeclaration = | ExportDefaultDeclaration | ExportAllDeclaration -export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock +/** + * This interface is only used for defining {@link AnyNode}. + * It exists so that it can be extended by plugins: + * + * @example + * ```typescript + * declare module 'acorn' { + * interface NodeTypes { + * pluginName: FirstNode | SecondNode | ThirdNode | ... | LastNode + * } + * } + * ``` + */ +interface NodeTypes { + core: Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportAttribute | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock | VariableDeclarator +} + +export type AnyNode = NodeTypes[keyof NodeTypes] export function parse(input: string, options: Options): Program @@ -573,16 +600,15 @@ export function tokenizer(input: string, options: Options): { [Symbol.iterator](): Iterator<Token> } -export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest" +export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | "latest" export interface Options { /** - * `ecmaVersion` indicates the ECMAScript version to parse. Must be - * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 - * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` - * (the latest version the library supports). This influences - * support for strict mode, the set of reserved words, and support - * for new syntax features. + * `ecmaVersion` indicates the ECMAScript version to parse. Can be a + * number, either in year (`2022`) or plain version number (`6`) form, + * or `"latest"` (the latest the library supports). This influences + * support for strict mode, the set of reserved words, and support for + * new syntax features. */ ecmaVersion: ecmaVersion @@ -733,7 +759,7 @@ export class Parser { options: Options input: string - private constructor(options: Options, input: string, startPos?: number) + protected constructor(options: Options, input: string, startPos?: number) parse(): Program static parse(input: string, options: Options): Program diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js index 3a6a3a2aeed54c..cb5628bf83cf0b 100644 --- a/deps/acorn/acorn/dist/acorn.js +++ b/deps/acorn/acorn/dist/acorn.js @@ -5,16 +5,16 @@ })(this, (function (exports) { 'use strict'; // This file was generated. Do not modify manually! - var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! - var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; + var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; // This file was generated. Do not modify manually! - var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! - var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; // These are a run-length and offset encoded representation of the // >0xffff code points that are a valid part of identifiers. The @@ -493,6 +493,7 @@ SCOPE_SUPER = 64, SCOPE_DIRECT_SUPER = 128, SCOPE_CLASS_STATIC_BLOCK = 256, + SCOPE_CLASS_FIELD_INIT = 512, SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; function functionFlags(async, generator) { @@ -603,15 +604,16 @@ prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; - prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit }; + prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; - prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit }; + prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; prototypeAccessors.canAwait.get = function () { for (var i = this.scopeStack.length - 1; i >= 0; i--) { - var scope = this.scopeStack[i]; - if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false } - if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 } + var ref = this.scopeStack[i]; + var flags = ref.flags; + if (flags & (SCOPE_CLASS_STATIC_BLOCK | SCOPE_CLASS_FIELD_INIT)) { return false } + if (flags & SCOPE_FUNCTION) { return (flags & SCOPE_ASYNC) > 0 } } return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction }; @@ -619,8 +621,7 @@ prototypeAccessors.allowSuper.get = function () { var ref = this.currentThisScope(); var flags = ref.flags; - var inClassFieldInit = ref.inClassFieldInit; - return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod + return (flags & SCOPE_SUPER) > 0 || this.options.allowSuperOutsideMethod }; prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; @@ -628,10 +629,13 @@ prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; prototypeAccessors.allowNewDotTarget.get = function () { - var ref = this.currentThisScope(); - var flags = ref.flags; - var inClassFieldInit = ref.inClassFieldInit; - return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit + for (var i = this.scopeStack.length - 1; i >= 0; i--) { + var ref = this.scopeStack[i]; + var flags = ref.flags; + if (flags & (SCOPE_CLASS_STATIC_BLOCK | SCOPE_CLASS_FIELD_INIT) || + ((flags & SCOPE_FUNCTION) && !(flags & SCOPE_ARROW))) { return true } + } + return false }; prototypeAccessors.inClassStaticBlock.get = function () { @@ -667,7 +671,7 @@ // ## Parser utilities - var literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/; + var literal = /^(?:'((?:\\[^]|[^'\\])*?)'|"((?:\\[^]|[^"\\])*?)")/; pp$9.strictDirective = function(start) { if (this.options.ecmaVersion < 5) { return false } for (;;) { @@ -853,7 +857,7 @@ // Statement) is allowed here. If context is not empty then only a Statement // is allowed. However, `let [` is an explicit negative lookahead for // ExpressionStatement, so special-case it first. - if (nextCh === 91 || nextCh === 92) { return true } // '[', '/' + if (nextCh === 91 || nextCh === 92) { return true } // '[', '\' if (context) { return false } if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral @@ -883,6 +887,49 @@ !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00)) }; + pp$8.isUsingKeyword = function(isAwaitUsing, isFor) { + if (this.options.ecmaVersion < 17 || !this.isContextual(isAwaitUsing ? "await" : "using")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + + if (lineBreak.test(this.input.slice(this.pos, next))) { return false } + + if (isAwaitUsing) { + var awaitEndPos = next + 5 /* await */, after; + if (this.input.slice(next, awaitEndPos) !== "using" || + awaitEndPos === this.input.length || + isIdentifierChar(after = this.input.charCodeAt(awaitEndPos)) || + (after > 0xd7ff && after < 0xdc00) + ) { return false } + + skipWhiteSpace.lastIndex = awaitEndPos; + var skipAfterUsing = skipWhiteSpace.exec(this.input); + if (skipAfterUsing && lineBreak.test(this.input.slice(awaitEndPos, awaitEndPos + skipAfterUsing[0].length))) { return false } + } + + if (isFor) { + var ofEndPos = next + 2 /* of */, after$1; + if (this.input.slice(next, ofEndPos) === "of") { + if (ofEndPos === this.input.length || + (!isIdentifierChar(after$1 = this.input.charCodeAt(ofEndPos)) && !(after$1 > 0xd7ff && after$1 < 0xdc00))) { return false } + } + } + + var ch = this.input.charCodeAt(next); + return isIdentifierStart(ch, true) || ch === 92 // '\' + }; + + pp$8.isAwaitUsing = function(isFor) { + return this.isUsingKeyword(true, isFor) + }; + + pp$8.isUsing = function(isFor) { + return this.isUsingKeyword(false, isFor) + }; + // Parse a single statement. // // If expecting a statement and finding a slash operator, parse a @@ -959,6 +1006,23 @@ return this.parseFunctionStatement(node, true, !context) } + var usingKind = this.isAwaitUsing(false) ? "await using" : this.isUsing(false) ? "using" : null; + if (usingKind) { + if (topLevel && this.options.sourceType === "script") { + this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script`"); + } + if (usingKind === "await using") { + if (!this.canAwait) { + this.raise(this.start, "Await using cannot appear outside of async function"); + } + this.next(); + } + this.next(); + this.parseVar(node, false, usingKind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") + } + var maybeName = this.value, expr = this.parseExpression(); if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon)) { return this.parseLabeledStatement(node, maybeName, expr, context) } @@ -1034,25 +1098,32 @@ this.next(); this.parseVar(init$1, true, kind); this.finishNode(init$1, "VariableDeclaration"); - if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types$1._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } - } - return this.parseForIn(node, init$1) - } - if (awaitAt > -1) { this.unexpected(awaitAt); } - return this.parseFor(node, init$1) + return this.parseForAfterInit(node, init$1, awaitAt) } var startsWithLet = this.isContextual("let"), isForOf = false; + + var usingKind = this.isUsing(true) ? "using" : this.isAwaitUsing(true) ? "await using" : null; + if (usingKind) { + var init$2 = this.startNode(); + this.next(); + if (usingKind === "await using") { this.next(); } + this.parseVar(init$2, true, usingKind); + this.finishNode(init$2, "VariableDeclaration"); + return this.parseForAfterInit(node, init$2, awaitAt) + } + var containsEsc = this.containsEsc; var refDestructuringErrors = new DestructuringErrors; - var init = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors); + var initPos = this.start; + var init = awaitAt > -1 + ? this.parseExprSubscripts(refDestructuringErrors, "await") + : this.parseExpression(true, refDestructuringErrors); if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types$1._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } + if (awaitAt > -1) { // implies `ecmaVersion >= 9` (see declaration of awaitAt) + if (this.type === types$1._in) { this.unexpected(awaitAt); } + node.await = true; + } else if (isForOf && this.options.ecmaVersion >= 8) { + if (init.start === initPos && !containsEsc && init.type === "Identifier" && init.name === "async") { this.unexpected(); } + else if (this.options.ecmaVersion >= 9) { node.await = false; } } if (startsWithLet && isForOf) { this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); } this.toAssignable(init, false, refDestructuringErrors); @@ -1065,6 +1136,20 @@ return this.parseFor(node, init) }; + // Helper method to parse for loop after variable initialization + pp$8.parseForAfterInit = function(node, init, awaitAt) { + if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) + }; + pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) { this.next(); return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) @@ -1321,6 +1406,8 @@ decl.init = this.parseMaybeAssign(isFor); } else if (!allowMissingInitializer && kind === "const" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { this.unexpected(); + } else if (!allowMissingInitializer && (kind === "using" || kind === "await using") && this.options.ecmaVersion >= 17 && this.type !== types$1._in && !this.isContextual("of")) { + this.raise(this.lastTokEnd, ("Missing initializer in " + kind + " declaration")); } else if (!allowMissingInitializer && decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) { this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); } else { @@ -1333,7 +1420,10 @@ }; pp$8.parseVarId = function(decl, kind) { - decl.id = this.parseBindingAtom(); + decl.id = kind === "using" || kind === "await using" + ? this.parseIdent() + : this.parseBindingAtom(); + this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); }; @@ -1552,11 +1642,9 @@ if (this.eat(types$1.eq)) { // To raise SyntaxError if 'arguments' exists in the initializer. - var scope = this.currentThisScope(); - var inClassFieldInit = scope.inClassFieldInit; - scope.inClassFieldInit = true; + this.enterScope(SCOPE_CLASS_FIELD_INIT | SCOPE_SUPER); field.value = this.parseMaybeAssign(); - scope.inClassFieldInit = inClassFieldInit; + this.exitScope(); } else { field.value = null; } @@ -1672,6 +1760,8 @@ this.expectContextual("from"); if (this.type !== types$1.string) { this.unexpected(); } node.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } this.semicolon(); return this.finishNode(node, "ExportAllDeclaration") }; @@ -1696,12 +1786,16 @@ { this.checkExport(exports, node.declaration.id, node.declaration.id.start); } node.specifiers = []; node.source = null; + if (this.options.ecmaVersion >= 16) + { node.attributes = []; } } else { // export { x, y as z } [from '...'] node.declaration = null; node.specifiers = this.parseExportSpecifiers(exports); if (this.eatContextual("from")) { if (this.type !== types$1.string) { this.unexpected(); } node.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } } else { for (var i = 0, list = node.specifiers; i < list.length; i += 1) { // check for keywords used as local names @@ -1717,6 +1811,8 @@ } node.source = null; + if (this.options.ecmaVersion >= 16) + { node.attributes = []; } } this.semicolon(); } @@ -1842,6 +1938,8 @@ this.expectContextual("from"); node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected(); } + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } this.semicolon(); return this.finishNode(node, "ImportDeclaration") }; @@ -1902,6 +2000,41 @@ return nodes }; + pp$8.parseWithClause = function() { + var nodes = []; + if (!this.eat(types$1._with)) { + return nodes + } + this.expect(types$1.braceL); + var attributeKeys = {}; + var first = true; + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { break } + } else { first = false; } + + var attr = this.parseImportAttribute(); + var keyName = attr.key.type === "Identifier" ? attr.key.name : attr.key.value; + if (hasOwn(attributeKeys, keyName)) + { this.raiseRecoverable(attr.key.start, "Duplicate attribute key '" + keyName + "'"); } + attributeKeys[keyName] = true; + nodes.push(attr); + } + return nodes + }; + + pp$8.parseImportAttribute = function() { + var node = this.startNode(); + node.key = this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never"); + this.expect(types$1.colon); + if (this.type !== types$1.string) { + this.unexpected(); + } + node.value = this.parseExprAtom(); + return this.finishNode(node, "ImportAttribute") + }; + pp$8.parseModuleExportName = function() { if (this.options.ecmaVersion >= 13 && this.type === types$1.string) { var stringLiteral = this.parseLiteral(this.value); @@ -2665,8 +2798,7 @@ node.argument = this.parseMaybeUnary(null, true, update, forInit); this.checkExpressionErrors(refDestructuringErrors, true); if (update) { this.checkLValSimple(node.argument); } - else if (this.strict && node.operator === "delete" && - node.argument.type === "Identifier") + else if (this.strict && node.operator === "delete" && isLocalVariableAccess(node.argument)) { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } else if (node.operator === "delete" && isPrivateFieldAccess(node.argument)) { this.raiseRecoverable(node.start, "Private fields can not be deleted"); } @@ -2701,10 +2833,18 @@ } }; + function isLocalVariableAccess(node) { + return ( + node.type === "Identifier" || + node.type === "ParenthesizedExpression" && isLocalVariableAccess(node.expression) + ) + } + function isPrivateFieldAccess(node) { return ( node.type === "MemberExpression" && node.property.type === "PrivateIdentifier" || - node.type === "ChainExpression" && isPrivateFieldAccess(node.expression) + node.type === "ChainExpression" && isPrivateFieldAccess(node.expression) || + node.type === "ParenthesizedExpression" && isPrivateFieldAccess(node.expression) ) } @@ -2962,13 +3102,32 @@ // Parse node.source. node.source = this.parseMaybeAssign(); - // Verify ending. - if (!this.eat(types$1.parenR)) { - var errorPos = this.start; - if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { - this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + if (this.options.ecmaVersion >= 16) { + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + node.options = this.parseMaybeAssign(); + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + this.unexpected(); + } + } + } else { + node.options = null; + } } else { - this.unexpected(errorPos); + node.options = null; + } + } else { + // Verify ending. + if (!this.eat(types$1.parenR)) { + var errorPos = this.start; + if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } } } @@ -2995,7 +3154,8 @@ var node = this.startNode(); node.value = value; node.raw = this.input.slice(this.start, this.end); - if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, ""); } + if (node.raw.charCodeAt(node.raw.length - 1) === 110) + { node.bigint = node.value != null ? node.value.toString() : node.raw.slice(0, -1).replace(/_/g, ""); } this.next(); return this.finishNode(node, "Literal") }; @@ -3131,7 +3291,7 @@ this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); } elem.value = { - raw: this.value, + raw: this.value.replace(/\r\n?/g, "\n"), cooked: null }; } else { @@ -3233,9 +3393,10 @@ }; pp$5.parseGetterSetter = function(prop) { - prop.kind = prop.key.name; + var kind = prop.key.name; this.parsePropertyName(prop); prop.value = this.parseMethod(false); + prop.kind = kind; var paramCount = prop.kind === "get" ? 0 : 1; if (prop.value.params.length !== paramCount) { var start = prop.value.start; @@ -3258,9 +3419,9 @@ prop.kind = "init"; } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) { if (isPattern) { this.unexpected(); } - prop.kind = "init"; prop.method = true; prop.value = this.parseMethod(isGenerator, isAsync); + prop.kind = "init"; } else if (!isPattern && !containsEsc && this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && @@ -3272,7 +3433,6 @@ this.checkUnreserved(prop.key); if (prop.key.name === "await" && !this.awaitIdentPos) { this.awaitIdentPos = startPos; } - prop.kind = "init"; if (isPattern) { prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); } else if (this.type === types$1.eq && refDestructuringErrors) { @@ -3282,6 +3442,7 @@ } else { prop.value = this.copyNode(prop.key); } + prop.kind = "init"; prop.shorthand = true; } else { this.unexpected(); } }; @@ -3457,7 +3618,7 @@ { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } if (this.inAsync && name === "await") { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } - if (this.currentThisScope().inClassFieldInit && name === "arguments") + if (!(this.currentThisScope().flags & SCOPE_VAR) && name === "arguments") { this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); } if (this.inClassStaticBlock && (name === "arguments" || name === "await")) { this.raise(start, ("Cannot use " + name + " in class static initialization block")); } @@ -3570,6 +3731,9 @@ pp$4.raise = function(pos, message) { var loc = getLineInfo(this.input, pos); message += " (" + loc.line + ":" + loc.column + ")"; + if (this.sourceFile) { + message += " in " + this.sourceFile; + } var err = new SyntaxError(message); err.pos = pos; err.loc = loc; err.raisedAt = this.pos; throw err @@ -3593,8 +3757,6 @@ this.lexical = []; // A list of lexically-declared FunctionDeclaration names in the current lexical scope this.functions = []; - // A switch to disallow the identifier reference 'arguments' - this.inClassFieldInit = false; }; // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. @@ -3664,7 +3826,7 @@ pp$3.currentVarScope = function() { for (var i = this.scopeStack.length - 1;; i--) { var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR) { return scope } + if (scope.flags & (SCOPE_VAR | SCOPE_CLASS_FIELD_INIT | SCOPE_CLASS_STATIC_BLOCK)) { return scope } } }; @@ -3672,7 +3834,8 @@ pp$3.currentThisScope = function() { for (var i = this.scopeStack.length - 1;; i--) { var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + if (scope.flags & (SCOPE_VAR | SCOPE_CLASS_FIELD_INIT | SCOPE_CLASS_STATIC_BLOCK) && + !(scope.flags & SCOPE_ARROW)) { return scope } } }; @@ -3728,6 +3891,9 @@ return newNode }; + // This file was generated by "bin/generate-unicode-script-values.js". Do not modify manually! + var scriptValuesAddedInUnicode = "Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz"; + // This file contains Unicode properties extracted from the ECMAScript specification. // The lists are extracted like so: // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText) @@ -3770,7 +3936,7 @@ var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi"; var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith"; - var ecma14ScriptValues = ecma13ScriptValues + " Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz"; + var ecma14ScriptValues = ecma13ScriptValues + " " + scriptValuesAddedInUnicode; var unicodeScriptValues = { 9: ecma9ScriptValues, @@ -3806,6 +3972,30 @@ var pp$1 = Parser.prototype; + // Track disjunction structure to determine whether a duplicate + // capture group name is allowed because it is in a separate branch. + var BranchID = function BranchID(parent, base) { + // Parent disjunction branch + this.parent = parent; + // Identifies this set of sibling branches + this.base = base || this; + }; + + BranchID.prototype.separatedFrom = function separatedFrom (alt) { + // A branch is separate from another branch if they or any of + // their parents are siblings in a given disjunction + for (var self = this; self; self = self.parent) { + for (var other = alt; other; other = other.parent) { + if (self.base === other.base && self !== other) { return true } + } + } + return false + }; + + BranchID.prototype.sibling = function sibling () { + return new BranchID(this.parent, this.base) + }; + var RegExpValidationState = function RegExpValidationState(parser) { this.parser = parser; this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : "") + (parser.options.ecmaVersion >= 15 ? "v" : ""); @@ -3822,8 +4012,9 @@ this.lastAssertionIsQuantifiable = false; this.numCapturingParens = 0; this.maxBackReference = 0; - this.groupNames = []; + this.groupNames = Object.create(null); this.backReferenceNames = []; + this.branchID = null; }; RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { @@ -3955,6 +4146,11 @@ } }; + function hasProp(obj) { + for (var _ in obj) { return true } + return false + } + /** * Validate the pattern part of a given RegExpLiteral. * @@ -3969,7 +4165,7 @@ // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* // exception if _P_ did not conform to the grammar, if any elements of _P_ // were not matched by the parse, or if any Early Error conditions exist. - if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + if (!state.switchN && this.options.ecmaVersion >= 9 && hasProp(state.groupNames)) { state.switchN = true; this.regexp_pattern(state); } @@ -3983,8 +4179,9 @@ state.lastAssertionIsQuantifiable = false; state.numCapturingParens = 0; state.maxBackReference = 0; - state.groupNames.length = 0; + state.groupNames = Object.create(null); state.backReferenceNames.length = 0; + state.branchID = null; this.regexp_disjunction(state); @@ -4003,7 +4200,7 @@ for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { var name = list[i]; - if (state.groupNames.indexOf(name) === -1) { + if (!state.groupNames[name]) { state.raise("Invalid named capture referenced"); } } @@ -4011,10 +4208,14 @@ // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction pp$1.regexp_disjunction = function(state) { + var trackDisjunction = this.options.ecmaVersion >= 16; + if (trackDisjunction) { state.branchID = new BranchID(state.branchID, null); } this.regexp_alternative(state); while (state.eat(0x7C /* | */)) { + if (trackDisjunction) { state.branchID = state.branchID.sibling(); } this.regexp_alternative(state); } + if (trackDisjunction) { state.branchID = state.branchID.parent; } // Make the same message as V8. if (this.regexp_eatQuantifier(state, true)) { @@ -4027,8 +4228,7 @@ // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative pp$1.regexp_alternative = function(state) { - while (state.pos < state.source.length && this.regexp_eatTerm(state)) - { } + while (state.pos < state.source.length && this.regexp_eatTerm(state)) {} }; // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term @@ -4161,12 +4361,41 @@ pp$1.regexp_eatUncapturingGroup = function(state) { var start = state.pos; if (state.eat(0x28 /* ( */)) { - if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { - this.regexp_disjunction(state); - if (state.eat(0x29 /* ) */)) { - return true + if (state.eat(0x3F /* ? */)) { + if (this.options.ecmaVersion >= 16) { + var addModifiers = this.regexp_eatModifiers(state); + var hasHyphen = state.eat(0x2D /* - */); + if (addModifiers || hasHyphen) { + for (var i = 0; i < addModifiers.length; i++) { + var modifier = addModifiers.charAt(i); + if (addModifiers.indexOf(modifier, i + 1) > -1) { + state.raise("Duplicate regular expression modifiers"); + } + } + if (hasHyphen) { + var removeModifiers = this.regexp_eatModifiers(state); + if (!addModifiers && !removeModifiers && state.current() === 0x3A /* : */) { + state.raise("Invalid regular expression modifiers"); + } + for (var i$1 = 0; i$1 < removeModifiers.length; i$1++) { + var modifier$1 = removeModifiers.charAt(i$1); + if ( + removeModifiers.indexOf(modifier$1, i$1 + 1) > -1 || + addModifiers.indexOf(modifier$1) > -1 + ) { + state.raise("Duplicate regular expression modifiers"); + } + } + } + } + } + if (state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); } - state.raise("Unterminated group"); } state.pos = start; } @@ -4188,6 +4417,23 @@ } return false }; + // RegularExpressionModifiers :: + // [empty] + // RegularExpressionModifiers RegularExpressionModifier + pp$1.regexp_eatModifiers = function(state) { + var modifiers = ""; + var ch = 0; + while ((ch = state.current()) !== -1 && isRegularExpressionModifier(ch)) { + modifiers += codePointToString(ch); + state.advance(); + } + return modifiers + }; + // RegularExpressionModifier :: one of + // `i` `m` `s` + function isRegularExpressionModifier(ch) { + return ch === 0x69 /* i */ || ch === 0x6d /* m */ || ch === 0x73 /* s */ + } // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom pp$1.regexp_eatExtendedAtom = function(state) { @@ -4266,14 +4512,26 @@ // `?` GroupName pp$1.regexp_groupSpecifier = function(state) { if (state.eat(0x3F /* ? */)) { - if (this.regexp_eatGroupName(state)) { - if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + if (!this.regexp_eatGroupName(state)) { state.raise("Invalid group"); } + var trackDisjunction = this.options.ecmaVersion >= 16; + var known = state.groupNames[state.lastStringValue]; + if (known) { + if (trackDisjunction) { + for (var i = 0, list = known; i < list.length; i += 1) { + var altID = list[i]; + + if (!altID.separatedFrom(state.branchID)) + { state.raise("Duplicate capture group name"); } + } + } else { state.raise("Duplicate capture group name"); } - state.groupNames.push(state.lastStringValue); - return } - state.raise("Invalid group"); + if (trackDisjunction) { + (known || (state.groupNames[state.lastStringValue] = [])).push(state.branchID); + } else { + state.groupNames[state.lastStringValue] = true; + } } }; @@ -5778,15 +6036,18 @@ break case "$": - if (this.input[this.pos + 1] !== "{") { - break - } - - // falls through + if (this.input[this.pos + 1] !== "{") { break } + // fall through case "`": return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos)) - // no default + case "\r": + if (this.input[this.pos + 1] === "\n") { ++this.pos; } + // fall through + case "\n": case "\u2028": case "\u2029": + ++this.curLine; + this.lineStart = this.pos + 1; + break } } this.raise(this.start, "Unterminated template"); @@ -5849,6 +6110,7 @@ if (isNewLine(ch)) { // Unicode new line characters after \ get removed from output in both // template literals and strings + if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; } return "" } return String.fromCharCode(ch) @@ -5923,11 +6185,9 @@ // Please use the [github bug tracker][ghbt] to report issues. // // [ghbt]: https://github.com/acornjs/acorn/issues - // - // [walk]: util/walk.js - var version = "8.11.3"; + var version = "8.15.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs index d1f81ef48511a4..74d5fc431be2b5 100644 --- a/deps/acorn/acorn/dist/acorn.mjs +++ b/deps/acorn/acorn/dist/acorn.mjs @@ -1,14 +1,14 @@ // This file was generated. Do not modify manually! -var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! -var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; // This file was generated. Do not modify manually! -var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0897-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! -var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c8a\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7cd\ua7d0\ua7d1\ua7d3\ua7d5-\ua7dc\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; // These are a run-length and offset encoded representation of the // >0xffff code points that are a valid part of identifiers. The @@ -487,6 +487,7 @@ var SCOPE_SUPER = 64, SCOPE_DIRECT_SUPER = 128, SCOPE_CLASS_STATIC_BLOCK = 256, + SCOPE_CLASS_FIELD_INIT = 512, SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; function functionFlags(async, generator) { @@ -597,15 +598,16 @@ Parser.prototype.parse = function parse () { prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; -prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit }; +prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; -prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit }; +prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; prototypeAccessors.canAwait.get = function () { for (var i = this.scopeStack.length - 1; i >= 0; i--) { - var scope = this.scopeStack[i]; - if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false } - if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 } + var ref = this.scopeStack[i]; + var flags = ref.flags; + if (flags & (SCOPE_CLASS_STATIC_BLOCK | SCOPE_CLASS_FIELD_INIT)) { return false } + if (flags & SCOPE_FUNCTION) { return (flags & SCOPE_ASYNC) > 0 } } return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction }; @@ -613,8 +615,7 @@ prototypeAccessors.canAwait.get = function () { prototypeAccessors.allowSuper.get = function () { var ref = this.currentThisScope(); var flags = ref.flags; - var inClassFieldInit = ref.inClassFieldInit; - return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod + return (flags & SCOPE_SUPER) > 0 || this.options.allowSuperOutsideMethod }; prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; @@ -622,10 +623,13 @@ prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThis prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; prototypeAccessors.allowNewDotTarget.get = function () { - var ref = this.currentThisScope(); - var flags = ref.flags; - var inClassFieldInit = ref.inClassFieldInit; - return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit + for (var i = this.scopeStack.length - 1; i >= 0; i--) { + var ref = this.scopeStack[i]; + var flags = ref.flags; + if (flags & (SCOPE_CLASS_STATIC_BLOCK | SCOPE_CLASS_FIELD_INIT) || + ((flags & SCOPE_FUNCTION) && !(flags & SCOPE_ARROW))) { return true } + } + return false }; prototypeAccessors.inClassStaticBlock.get = function () { @@ -661,7 +665,7 @@ var pp$9 = Parser.prototype; // ## Parser utilities -var literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/; +var literal = /^(?:'((?:\\[^]|[^'\\])*?)'|"((?:\\[^]|[^"\\])*?)")/; pp$9.strictDirective = function(start) { if (this.options.ecmaVersion < 5) { return false } for (;;) { @@ -847,7 +851,7 @@ pp$8.isLet = function(context) { // Statement) is allowed here. If context is not empty then only a Statement // is allowed. However, `let [` is an explicit negative lookahead for // ExpressionStatement, so special-case it first. - if (nextCh === 91 || nextCh === 92) { return true } // '[', '/' + if (nextCh === 91 || nextCh === 92) { return true } // '[', '\' if (context) { return false } if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral @@ -877,6 +881,49 @@ pp$8.isAsyncFunction = function() { !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00)) }; +pp$8.isUsingKeyword = function(isAwaitUsing, isFor) { + if (this.options.ecmaVersion < 17 || !this.isContextual(isAwaitUsing ? "await" : "using")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + + if (lineBreak.test(this.input.slice(this.pos, next))) { return false } + + if (isAwaitUsing) { + var awaitEndPos = next + 5 /* await */, after; + if (this.input.slice(next, awaitEndPos) !== "using" || + awaitEndPos === this.input.length || + isIdentifierChar(after = this.input.charCodeAt(awaitEndPos)) || + (after > 0xd7ff && after < 0xdc00) + ) { return false } + + skipWhiteSpace.lastIndex = awaitEndPos; + var skipAfterUsing = skipWhiteSpace.exec(this.input); + if (skipAfterUsing && lineBreak.test(this.input.slice(awaitEndPos, awaitEndPos + skipAfterUsing[0].length))) { return false } + } + + if (isFor) { + var ofEndPos = next + 2 /* of */, after$1; + if (this.input.slice(next, ofEndPos) === "of") { + if (ofEndPos === this.input.length || + (!isIdentifierChar(after$1 = this.input.charCodeAt(ofEndPos)) && !(after$1 > 0xd7ff && after$1 < 0xdc00))) { return false } + } + } + + var ch = this.input.charCodeAt(next); + return isIdentifierStart(ch, true) || ch === 92 // '\' +}; + +pp$8.isAwaitUsing = function(isFor) { + return this.isUsingKeyword(true, isFor) +}; + +pp$8.isUsing = function(isFor) { + return this.isUsingKeyword(false, isFor) +}; + // Parse a single statement. // // If expecting a statement and finding a slash operator, parse a @@ -953,6 +1000,23 @@ pp$8.parseStatement = function(context, topLevel, exports) { return this.parseFunctionStatement(node, true, !context) } + var usingKind = this.isAwaitUsing(false) ? "await using" : this.isUsing(false) ? "using" : null; + if (usingKind) { + if (topLevel && this.options.sourceType === "script") { + this.raise(this.start, "Using declaration cannot appear in the top level when source type is `script`"); + } + if (usingKind === "await using") { + if (!this.canAwait) { + this.raise(this.start, "Await using cannot appear outside of async function"); + } + this.next(); + } + this.next(); + this.parseVar(node, false, usingKind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") + } + var maybeName = this.value, expr = this.parseExpression(); if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon)) { return this.parseLabeledStatement(node, maybeName, expr, context) } @@ -1028,25 +1092,32 @@ pp$8.parseForStatement = function(node) { this.next(); this.parseVar(init$1, true, kind); this.finishNode(init$1, "VariableDeclaration"); - if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types$1._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } - } - return this.parseForIn(node, init$1) - } - if (awaitAt > -1) { this.unexpected(awaitAt); } - return this.parseFor(node, init$1) + return this.parseForAfterInit(node, init$1, awaitAt) } var startsWithLet = this.isContextual("let"), isForOf = false; + + var usingKind = this.isUsing(true) ? "using" : this.isAwaitUsing(true) ? "await using" : null; + if (usingKind) { + var init$2 = this.startNode(); + this.next(); + if (usingKind === "await using") { this.next(); } + this.parseVar(init$2, true, usingKind); + this.finishNode(init$2, "VariableDeclaration"); + return this.parseForAfterInit(node, init$2, awaitAt) + } + var containsEsc = this.containsEsc; var refDestructuringErrors = new DestructuringErrors; - var init = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors); + var initPos = this.start; + var init = awaitAt > -1 + ? this.parseExprSubscripts(refDestructuringErrors, "await") + : this.parseExpression(true, refDestructuringErrors); if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types$1._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } + if (awaitAt > -1) { // implies `ecmaVersion >= 9` (see declaration of awaitAt) + if (this.type === types$1._in) { this.unexpected(awaitAt); } + node.await = true; + } else if (isForOf && this.options.ecmaVersion >= 8) { + if (init.start === initPos && !containsEsc && init.type === "Identifier" && init.name === "async") { this.unexpected(); } + else if (this.options.ecmaVersion >= 9) { node.await = false; } } if (startsWithLet && isForOf) { this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); } this.toAssignable(init, false, refDestructuringErrors); @@ -1059,6 +1130,20 @@ pp$8.parseForStatement = function(node) { return this.parseFor(node, init) }; +// Helper method to parse for loop after variable initialization +pp$8.parseForAfterInit = function(node, init, awaitAt) { + if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) +}; + pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) { this.next(); return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) @@ -1315,6 +1400,8 @@ pp$8.parseVar = function(node, isFor, kind, allowMissingInitializer) { decl.init = this.parseMaybeAssign(isFor); } else if (!allowMissingInitializer && kind === "const" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { this.unexpected(); + } else if (!allowMissingInitializer && (kind === "using" || kind === "await using") && this.options.ecmaVersion >= 17 && this.type !== types$1._in && !this.isContextual("of")) { + this.raise(this.lastTokEnd, ("Missing initializer in " + kind + " declaration")); } else if (!allowMissingInitializer && decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) { this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); } else { @@ -1327,7 +1414,10 @@ pp$8.parseVar = function(node, isFor, kind, allowMissingInitializer) { }; pp$8.parseVarId = function(decl, kind) { - decl.id = this.parseBindingAtom(); + decl.id = kind === "using" || kind === "await using" + ? this.parseIdent() + : this.parseBindingAtom(); + this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); }; @@ -1546,11 +1636,9 @@ pp$8.parseClassField = function(field) { if (this.eat(types$1.eq)) { // To raise SyntaxError if 'arguments' exists in the initializer. - var scope = this.currentThisScope(); - var inClassFieldInit = scope.inClassFieldInit; - scope.inClassFieldInit = true; + this.enterScope(SCOPE_CLASS_FIELD_INIT | SCOPE_SUPER); field.value = this.parseMaybeAssign(); - scope.inClassFieldInit = inClassFieldInit; + this.exitScope(); } else { field.value = null; } @@ -1666,6 +1754,8 @@ pp$8.parseExportAllDeclaration = function(node, exports) { this.expectContextual("from"); if (this.type !== types$1.string) { this.unexpected(); } node.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } this.semicolon(); return this.finishNode(node, "ExportAllDeclaration") }; @@ -1690,12 +1780,16 @@ pp$8.parseExport = function(node, exports) { { this.checkExport(exports, node.declaration.id, node.declaration.id.start); } node.specifiers = []; node.source = null; + if (this.options.ecmaVersion >= 16) + { node.attributes = []; } } else { // export { x, y as z } [from '...'] node.declaration = null; node.specifiers = this.parseExportSpecifiers(exports); if (this.eatContextual("from")) { if (this.type !== types$1.string) { this.unexpected(); } node.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } } else { for (var i = 0, list = node.specifiers; i < list.length; i += 1) { // check for keywords used as local names @@ -1711,6 +1805,8 @@ pp$8.parseExport = function(node, exports) { } node.source = null; + if (this.options.ecmaVersion >= 16) + { node.attributes = []; } } this.semicolon(); } @@ -1836,6 +1932,8 @@ pp$8.parseImport = function(node) { this.expectContextual("from"); node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected(); } + if (this.options.ecmaVersion >= 16) + { node.attributes = this.parseWithClause(); } this.semicolon(); return this.finishNode(node, "ImportDeclaration") }; @@ -1896,6 +1994,41 @@ pp$8.parseImportSpecifiers = function() { return nodes }; +pp$8.parseWithClause = function() { + var nodes = []; + if (!this.eat(types$1._with)) { + return nodes + } + this.expect(types$1.braceL); + var attributeKeys = {}; + var first = true; + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { break } + } else { first = false; } + + var attr = this.parseImportAttribute(); + var keyName = attr.key.type === "Identifier" ? attr.key.name : attr.key.value; + if (hasOwn(attributeKeys, keyName)) + { this.raiseRecoverable(attr.key.start, "Duplicate attribute key '" + keyName + "'"); } + attributeKeys[keyName] = true; + nodes.push(attr); + } + return nodes +}; + +pp$8.parseImportAttribute = function() { + var node = this.startNode(); + node.key = this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never"); + this.expect(types$1.colon); + if (this.type !== types$1.string) { + this.unexpected(); + } + node.value = this.parseExprAtom(); + return this.finishNode(node, "ImportAttribute") +}; + pp$8.parseModuleExportName = function() { if (this.options.ecmaVersion >= 13 && this.type === types$1.string) { var stringLiteral = this.parseLiteral(this.value); @@ -2659,8 +2792,7 @@ pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forIni node.argument = this.parseMaybeUnary(null, true, update, forInit); this.checkExpressionErrors(refDestructuringErrors, true); if (update) { this.checkLValSimple(node.argument); } - else if (this.strict && node.operator === "delete" && - node.argument.type === "Identifier") + else if (this.strict && node.operator === "delete" && isLocalVariableAccess(node.argument)) { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } else if (node.operator === "delete" && isPrivateFieldAccess(node.argument)) { this.raiseRecoverable(node.start, "Private fields can not be deleted"); } @@ -2695,10 +2827,18 @@ pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forIni } }; +function isLocalVariableAccess(node) { + return ( + node.type === "Identifier" || + node.type === "ParenthesizedExpression" && isLocalVariableAccess(node.expression) + ) +} + function isPrivateFieldAccess(node) { return ( node.type === "MemberExpression" && node.property.type === "PrivateIdentifier" || - node.type === "ChainExpression" && isPrivateFieldAccess(node.expression) + node.type === "ChainExpression" && isPrivateFieldAccess(node.expression) || + node.type === "ParenthesizedExpression" && isPrivateFieldAccess(node.expression) ) } @@ -2956,13 +3096,32 @@ pp$5.parseDynamicImport = function(node) { // Parse node.source. node.source = this.parseMaybeAssign(); - // Verify ending. - if (!this.eat(types$1.parenR)) { - var errorPos = this.start; - if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { - this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + if (this.options.ecmaVersion >= 16) { + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + node.options = this.parseMaybeAssign(); + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + this.unexpected(); + } + } + } else { + node.options = null; + } } else { - this.unexpected(errorPos); + node.options = null; + } + } else { + // Verify ending. + if (!this.eat(types$1.parenR)) { + var errorPos = this.start; + if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } } } @@ -2989,7 +3148,8 @@ pp$5.parseLiteral = function(value) { var node = this.startNode(); node.value = value; node.raw = this.input.slice(this.start, this.end); - if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, ""); } + if (node.raw.charCodeAt(node.raw.length - 1) === 110) + { node.bigint = node.value != null ? node.value.toString() : node.raw.slice(0, -1).replace(/_/g, ""); } this.next(); return this.finishNode(node, "Literal") }; @@ -3125,7 +3285,7 @@ pp$5.parseTemplateElement = function(ref) { this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); } elem.value = { - raw: this.value, + raw: this.value.replace(/\r\n?/g, "\n"), cooked: null }; } else { @@ -3227,9 +3387,10 @@ pp$5.parseProperty = function(isPattern, refDestructuringErrors) { }; pp$5.parseGetterSetter = function(prop) { - prop.kind = prop.key.name; + var kind = prop.key.name; this.parsePropertyName(prop); prop.value = this.parseMethod(false); + prop.kind = kind; var paramCount = prop.kind === "get" ? 0 : 1; if (prop.value.params.length !== paramCount) { var start = prop.value.start; @@ -3252,9 +3413,9 @@ pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startP prop.kind = "init"; } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) { if (isPattern) { this.unexpected(); } - prop.kind = "init"; prop.method = true; prop.value = this.parseMethod(isGenerator, isAsync); + prop.kind = "init"; } else if (!isPattern && !containsEsc && this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && @@ -3266,7 +3427,6 @@ pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startP this.checkUnreserved(prop.key); if (prop.key.name === "await" && !this.awaitIdentPos) { this.awaitIdentPos = startPos; } - prop.kind = "init"; if (isPattern) { prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); } else if (this.type === types$1.eq && refDestructuringErrors) { @@ -3276,6 +3436,7 @@ pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startP } else { prop.value = this.copyNode(prop.key); } + prop.kind = "init"; prop.shorthand = true; } else { this.unexpected(); } }; @@ -3451,7 +3612,7 @@ pp$5.checkUnreserved = function(ref) { { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } if (this.inAsync && name === "await") { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } - if (this.currentThisScope().inClassFieldInit && name === "arguments") + if (!(this.currentThisScope().flags & SCOPE_VAR) && name === "arguments") { this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); } if (this.inClassStaticBlock && (name === "arguments" || name === "await")) { this.raise(start, ("Cannot use " + name + " in class static initialization block")); } @@ -3564,6 +3725,9 @@ var pp$4 = Parser.prototype; pp$4.raise = function(pos, message) { var loc = getLineInfo(this.input, pos); message += " (" + loc.line + ":" + loc.column + ")"; + if (this.sourceFile) { + message += " in " + this.sourceFile; + } var err = new SyntaxError(message); err.pos = pos; err.loc = loc; err.raisedAt = this.pos; throw err @@ -3587,8 +3751,6 @@ var Scope = function Scope(flags) { this.lexical = []; // A list of lexically-declared FunctionDeclaration names in the current lexical scope this.functions = []; - // A switch to disallow the identifier reference 'arguments' - this.inClassFieldInit = false; }; // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. @@ -3658,7 +3820,7 @@ pp$3.currentScope = function() { pp$3.currentVarScope = function() { for (var i = this.scopeStack.length - 1;; i--) { var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR) { return scope } + if (scope.flags & (SCOPE_VAR | SCOPE_CLASS_FIELD_INIT | SCOPE_CLASS_STATIC_BLOCK)) { return scope } } }; @@ -3666,7 +3828,8 @@ pp$3.currentVarScope = function() { pp$3.currentThisScope = function() { for (var i = this.scopeStack.length - 1;; i--) { var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + if (scope.flags & (SCOPE_VAR | SCOPE_CLASS_FIELD_INIT | SCOPE_CLASS_STATIC_BLOCK) && + !(scope.flags & SCOPE_ARROW)) { return scope } } }; @@ -3722,6 +3885,9 @@ pp$2.copyNode = function(node) { return newNode }; +// This file was generated by "bin/generate-unicode-script-values.js". Do not modify manually! +var scriptValuesAddedInUnicode = "Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz"; + // This file contains Unicode properties extracted from the ECMAScript specification. // The lists are extracted like so: // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText) @@ -3764,7 +3930,7 @@ var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Han var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi"; var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith"; -var ecma14ScriptValues = ecma13ScriptValues + " Hrkt Katakana_Or_Hiragana Kawi Nag_Mundari Nagm Unknown Zzzz"; +var ecma14ScriptValues = ecma13ScriptValues + " " + scriptValuesAddedInUnicode; var unicodeScriptValues = { 9: ecma9ScriptValues, @@ -3800,6 +3966,30 @@ for (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) { var pp$1 = Parser.prototype; +// Track disjunction structure to determine whether a duplicate +// capture group name is allowed because it is in a separate branch. +var BranchID = function BranchID(parent, base) { + // Parent disjunction branch + this.parent = parent; + // Identifies this set of sibling branches + this.base = base || this; +}; + +BranchID.prototype.separatedFrom = function separatedFrom (alt) { + // A branch is separate from another branch if they or any of + // their parents are siblings in a given disjunction + for (var self = this; self; self = self.parent) { + for (var other = alt; other; other = other.parent) { + if (self.base === other.base && self !== other) { return true } + } + } + return false +}; + +BranchID.prototype.sibling = function sibling () { + return new BranchID(this.parent, this.base) +}; + var RegExpValidationState = function RegExpValidationState(parser) { this.parser = parser; this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : "") + (parser.options.ecmaVersion >= 15 ? "v" : ""); @@ -3816,8 +4006,9 @@ var RegExpValidationState = function RegExpValidationState(parser) { this.lastAssertionIsQuantifiable = false; this.numCapturingParens = 0; this.maxBackReference = 0; - this.groupNames = []; + this.groupNames = Object.create(null); this.backReferenceNames = []; + this.branchID = null; }; RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { @@ -3949,6 +4140,11 @@ pp$1.validateRegExpFlags = function(state) { } }; +function hasProp(obj) { + for (var _ in obj) { return true } + return false +} + /** * Validate the pattern part of a given RegExpLiteral. * @@ -3963,7 +4159,7 @@ pp$1.validateRegExpPattern = function(state) { // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* // exception if _P_ did not conform to the grammar, if any elements of _P_ // were not matched by the parse, or if any Early Error conditions exist. - if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + if (!state.switchN && this.options.ecmaVersion >= 9 && hasProp(state.groupNames)) { state.switchN = true; this.regexp_pattern(state); } @@ -3977,8 +4173,9 @@ pp$1.regexp_pattern = function(state) { state.lastAssertionIsQuantifiable = false; state.numCapturingParens = 0; state.maxBackReference = 0; - state.groupNames.length = 0; + state.groupNames = Object.create(null); state.backReferenceNames.length = 0; + state.branchID = null; this.regexp_disjunction(state); @@ -3997,7 +4194,7 @@ pp$1.regexp_pattern = function(state) { for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { var name = list[i]; - if (state.groupNames.indexOf(name) === -1) { + if (!state.groupNames[name]) { state.raise("Invalid named capture referenced"); } } @@ -4005,10 +4202,14 @@ pp$1.regexp_pattern = function(state) { // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction pp$1.regexp_disjunction = function(state) { + var trackDisjunction = this.options.ecmaVersion >= 16; + if (trackDisjunction) { state.branchID = new BranchID(state.branchID, null); } this.regexp_alternative(state); while (state.eat(0x7C /* | */)) { + if (trackDisjunction) { state.branchID = state.branchID.sibling(); } this.regexp_alternative(state); } + if (trackDisjunction) { state.branchID = state.branchID.parent; } // Make the same message as V8. if (this.regexp_eatQuantifier(state, true)) { @@ -4021,8 +4222,7 @@ pp$1.regexp_disjunction = function(state) { // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative pp$1.regexp_alternative = function(state) { - while (state.pos < state.source.length && this.regexp_eatTerm(state)) - { } + while (state.pos < state.source.length && this.regexp_eatTerm(state)) {} }; // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term @@ -4155,12 +4355,41 @@ pp$1.regexp_eatReverseSolidusAtomEscape = function(state) { pp$1.regexp_eatUncapturingGroup = function(state) { var start = state.pos; if (state.eat(0x28 /* ( */)) { - if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { - this.regexp_disjunction(state); - if (state.eat(0x29 /* ) */)) { - return true + if (state.eat(0x3F /* ? */)) { + if (this.options.ecmaVersion >= 16) { + var addModifiers = this.regexp_eatModifiers(state); + var hasHyphen = state.eat(0x2D /* - */); + if (addModifiers || hasHyphen) { + for (var i = 0; i < addModifiers.length; i++) { + var modifier = addModifiers.charAt(i); + if (addModifiers.indexOf(modifier, i + 1) > -1) { + state.raise("Duplicate regular expression modifiers"); + } + } + if (hasHyphen) { + var removeModifiers = this.regexp_eatModifiers(state); + if (!addModifiers && !removeModifiers && state.current() === 0x3A /* : */) { + state.raise("Invalid regular expression modifiers"); + } + for (var i$1 = 0; i$1 < removeModifiers.length; i$1++) { + var modifier$1 = removeModifiers.charAt(i$1); + if ( + removeModifiers.indexOf(modifier$1, i$1 + 1) > -1 || + addModifiers.indexOf(modifier$1) > -1 + ) { + state.raise("Duplicate regular expression modifiers"); + } + } + } + } + } + if (state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); } - state.raise("Unterminated group"); } state.pos = start; } @@ -4182,6 +4411,23 @@ pp$1.regexp_eatCapturingGroup = function(state) { } return false }; +// RegularExpressionModifiers :: +// [empty] +// RegularExpressionModifiers RegularExpressionModifier +pp$1.regexp_eatModifiers = function(state) { + var modifiers = ""; + var ch = 0; + while ((ch = state.current()) !== -1 && isRegularExpressionModifier(ch)) { + modifiers += codePointToString(ch); + state.advance(); + } + return modifiers +}; +// RegularExpressionModifier :: one of +// `i` `m` `s` +function isRegularExpressionModifier(ch) { + return ch === 0x69 /* i */ || ch === 0x6d /* m */ || ch === 0x73 /* s */ +} // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom pp$1.regexp_eatExtendedAtom = function(state) { @@ -4260,14 +4506,26 @@ pp$1.regexp_eatExtendedPatternCharacter = function(state) { // `?` GroupName pp$1.regexp_groupSpecifier = function(state) { if (state.eat(0x3F /* ? */)) { - if (this.regexp_eatGroupName(state)) { - if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + if (!this.regexp_eatGroupName(state)) { state.raise("Invalid group"); } + var trackDisjunction = this.options.ecmaVersion >= 16; + var known = state.groupNames[state.lastStringValue]; + if (known) { + if (trackDisjunction) { + for (var i = 0, list = known; i < list.length; i += 1) { + var altID = list[i]; + + if (!altID.separatedFrom(state.branchID)) + { state.raise("Duplicate capture group name"); } + } + } else { state.raise("Duplicate capture group name"); } - state.groupNames.push(state.lastStringValue); - return } - state.raise("Invalid group"); + if (trackDisjunction) { + (known || (state.groupNames[state.lastStringValue] = [])).push(state.branchID); + } else { + state.groupNames[state.lastStringValue] = true; + } } }; @@ -5772,15 +6030,18 @@ pp.readInvalidTemplateToken = function() { break case "$": - if (this.input[this.pos + 1] !== "{") { - break - } - - // falls through + if (this.input[this.pos + 1] !== "{") { break } + // fall through case "`": return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos)) - // no default + case "\r": + if (this.input[this.pos + 1] === "\n") { ++this.pos; } + // fall through + case "\n": case "\u2028": case "\u2029": + ++this.curLine; + this.lineStart = this.pos + 1; + break } } this.raise(this.start, "Unterminated template"); @@ -5843,6 +6104,7 @@ pp.readEscapedChar = function(inTemplate) { if (isNewLine(ch)) { // Unicode new line characters after \ get removed from output in both // template literals and strings + if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; } return "" } return String.fromCharCode(ch) @@ -5917,11 +6179,9 @@ pp.readWord = function() { // Please use the [github bug tracker][ghbt] to report issues. // // [ghbt]: https://github.com/acornjs/acorn/issues -// -// [walk]: util/walk.js -var version = "8.11.3"; +var version = "8.15.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/dist/bin.js b/deps/acorn/acorn/dist/bin.js index 0bf3e5f8d12bda..c7d9b9f8ed88fe 100644 --- a/deps/acorn/acorn/dist/bin.js +++ b/deps/acorn/acorn/dist/bin.js @@ -77,7 +77,7 @@ function run(codeList) { console.error(fileMode ? e.message.replace(/\(\d+:\d+\)$/, function (m) { return m.slice(0, 1) + inputFilePaths[fileIdx] + " " + m.slice(1); }) : e.message); process.exit(1); } - if (!silent) { console.log(JSON.stringify(result, null, compact ? null : 2)); } + if (!silent) { console.log(JSON.stringify(result, function (_, value) { return typeof value === "bigint" ? null : value; }, compact ? null : 2)); } } if (fileMode = inputFilePaths.length && (forceFileName || !inputFilePaths.includes("-") || inputFilePaths.length !== 1)) { diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json index 1b8dc76afc3cf5..6f63ddbf620a19 100644 --- a/deps/acorn/acorn/package.json +++ b/deps/acorn/acorn/package.json @@ -16,7 +16,7 @@ ], "./package.json": "./package.json" }, - "version": "8.11.3", + "version": "8.15.0", "engines": { "node": ">=0.4.0" }, @@ -38,13 +38,13 @@ ], "repository": { "type": "git", - "url": "https://github.com/acornjs/acorn.git" + "url": "git+https://github.com/acornjs/acorn.git" }, "license": "MIT", "scripts": { "prepare": "cd ..; npm run build:main" }, "bin": { - "acorn": "./bin/acorn" + "acorn": "bin/acorn" } } diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index a7be606bb9e70f..d7f9b3a92c5330 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,7 +1,8 @@ -/* auto-generated on 2024-03-07 13:23:39 -0500. Do not edit! */ +/* auto-generated on 2024-09-02 20:07:32 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ + #include <algorithm> namespace ada::checkers { @@ -65,8 +66,7 @@ static constexpr std::array<uint8_t, 256> path_signature_table = std::array<uint8_t, 256> result{}; for (size_t i = 0; i < 256; i++) { if (i <= 0x20 || i == 0x22 || i == 0x23 || i == 0x3c || i == 0x3e || - i == 0x3f || i == 0x60 || i == 0x7b || i == 0x7b || i == 0x7d || - i > 0x7e) { + i == 0x3f || i == 0x60 || i == 0x7b || i == 0x7d || i > 0x7e) { result[i] = 1; } else if (i == 0x25) { result[i] = 8; @@ -9795,6 +9795,10 @@ ADA_POP_DISABLE_WARNINGS namespace ada::unicode { +constexpr bool is_tabs_or_newline(char c) noexcept { + return c == '\r' || c == '\n' || c == '\t'; +} + constexpr uint64_t broadcast(uint8_t v) noexcept { return 0x101010101010101ull * v; } @@ -9829,53 +9833,54 @@ ada_really_inline bool has_tabs_or_newline( std::string_view user_input) noexcept { // first check for short strings in which case we do it naively. if (user_input.size() < 16) { // slow path - for (size_t i = 0; i < user_input.size(); i++) { - if (user_input[i] == '\r' || user_input[i] == '\n' || - user_input[i] == '\t') { - return true; - } - } - return false; + return std::any_of(user_input.begin(), user_input.end(), + is_tabs_or_newline); } // fast path for long strings (expected to be common) size_t i = 0; - const uint8x16_t mask1 = vmovq_n_u8('\r'); - const uint8x16_t mask2 = vmovq_n_u8('\n'); - const uint8x16_t mask3 = vmovq_n_u8('\t'); + /** + * The fastest way to check for `\t` (==9), '\n'(== 10) and `\r` (==13) relies + * on table lookup instruction. We notice that these are all unique numbers + * between 0..15. Let's prepare a special register, where we put '\t' in the + * 9th position, '\n' - 10th and '\r' - 13th. Then we shuffle this register by + * input register. If the input had `\t` in position X then this shuffled + * register will also have '\t' in that position. Comparing input with this + * shuffled register will mark us all interesting characters in the input. + * + * credit for algorithmic idea: @aqrit, credit for description: + * @DenisYaroshevskiy + */ + static uint8_t rnt_array[16] = {1, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 10, 0, 0, 13, 0, 0}; + const uint8x16_t rnt = vld1q_u8(rnt_array); + // m['0xd', '0xa', '0x9'] uint8x16_t running{0}; for (; i + 15 < user_input.size(); i += 16) { uint8x16_t word = vld1q_u8((const uint8_t*)user_input.data() + i); - running = vorrq_u8(vorrq_u8(running, vorrq_u8(vceqq_u8(word, mask1), - vceqq_u8(word, mask2))), - vceqq_u8(word, mask3)); + + running = vorrq_u8(running, vceqq_u8(vqtbl1q_u8(rnt, word), word)); } if (i < user_input.size()) { uint8x16_t word = vld1q_u8((const uint8_t*)user_input.data() + user_input.length() - 16); - running = vorrq_u8(vorrq_u8(running, vorrq_u8(vceqq_u8(word, mask1), - vceqq_u8(word, mask2))), - vceqq_u8(word, mask3)); + running = vorrq_u8(running, vceqq_u8(vqtbl1q_u8(rnt, word), word)); } - return vmaxvq_u8(running) != 0; + return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0; } #elif ADA_SSE2 ada_really_inline bool has_tabs_or_newline( std::string_view user_input) noexcept { // first check for short strings in which case we do it naively. if (user_input.size() < 16) { // slow path - for (size_t i = 0; i < user_input.size(); i++) { - if (user_input[i] == '\r' || user_input[i] == '\n' || - user_input[i] == '\t') { - return true; - } - } - return false; + return std::any_of(user_input.begin(), user_input.end(), + is_tabs_or_newline); } // fast path for long strings (expected to be common) size_t i = 0; const __m128i mask1 = _mm_set1_epi8('\r'); const __m128i mask2 = _mm_set1_epi8('\n'); const __m128i mask3 = _mm_set1_epi8('\t'); + // If we supported SSSE3, we could use the algorithm that we use for NEON. __m128i running{0}; for (; i + 15 < user_input.size(); i += 16) { __m128i word = _mm_loadu_si128((const __m128i*)(user_input.data() + i)); @@ -9898,7 +9903,7 @@ ada_really_inline bool has_tabs_or_newline( ada_really_inline bool has_tabs_or_newline( std::string_view user_input) noexcept { auto has_zero_byte = [](uint64_t v) { - return ((v - 0x0101010101010101) & ~(v)&0x8080808080808080); + return ((v - 0x0101010101010101) & ~(v) & 0x8080808080808080); }; size_t i = 0; uint64_t mask1 = broadcast('\r'); @@ -10028,15 +10033,8 @@ contains_forbidden_domain_code_point_or_upper(const char* input, constexpr static std::array<bool, 256> is_alnum_plus_table = []() constexpr { std::array<bool, 256> result{}; for (size_t c = 0; c < 256; c++) { - if (c >= '0' && c <= '9') { - result[c] = true; - } else if (c >= 'a' && c <= 'z') { - result[c] = true; - } else if (c >= 'A' && c <= 'Z') { - result[c] = true; - } else if (c == '+' || c == '-' || c == '.') { - result[c] = true; - } + result[c] = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || c == '+' || c == '-' || c == '.'; } return result; }(); @@ -10260,10 +10258,6 @@ std::string percent_encode(const std::string_view input, return out; } -std::string to_unicode(std::string_view input) { - return ada::idna::to_unicode(input); -} - } // namespace ada::unicode /* end file src/unicode.cpp */ /* begin file src/serializers.cpp */ @@ -10356,7 +10350,8 @@ namespace ada { template <class result_type> ada_warn_unused tl::expected<result_type, ada::errors> parse( std::string_view input, const result_type* base_url) { - result_type u = ada::parser::parse_url<result_type>(input, base_url); + result_type u = + ada::parser::parse_url_impl<result_type, true>(input, base_url); if (!u.is_valid) { return tl::unexpected(errors::generic_error); } @@ -10392,16 +10387,22 @@ std::string href_from_file(std::string_view input) { } bool can_parse(std::string_view input, const std::string_view* base_input) { - ada::result<ada::url_aggregator> base; + ada::url_aggregator base_aggregator; ada::url_aggregator* base_pointer = nullptr; + if (base_input != nullptr) { - base = ada::parse<url_aggregator>(*base_input); - if (!base) { + base_aggregator = ada::parser::parse_url_impl<ada::url_aggregator, false>( + *base_input, nullptr); + if (!base_aggregator.is_valid) { return false; } - base_pointer = &base.value(); + base_pointer = &base_aggregator; } - return ada::parse<url_aggregator>(input, base_pointer).has_value(); + + ada::url_aggregator result = + ada::parser::parse_url_impl<ada::url_aggregator, false>(input, + base_pointer); + return result.is_valid; } ada_warn_unused std::string to_string(ada::encoding_type type) { @@ -10659,7 +10660,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); uint8x16_t classify = vandq_u8(lowpart, highpart); - if (vmaxvq_u8(classify) != 0) { + if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); uint16_t is_non_zero = ~to_bitmask(is_zero); return i + trailing_zeroes(is_non_zero); @@ -10672,7 +10673,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); uint8x16_t classify = vandq_u8(lowpart, highpart); - if (vmaxvq_u8(classify) != 0) { + if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); uint16_t is_non_zero = ~to_bitmask(is_zero); return view.length() - 16 + trailing_zeroes(is_non_zero); @@ -10797,7 +10798,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); uint8x16_t classify = vandq_u8(lowpart, highpart); - if (vmaxvq_u8(classify) != 0) { + if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); uint16_t is_non_zero = ~to_bitmask(is_zero); return i + trailing_zeroes(is_non_zero); @@ -10810,7 +10811,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); uint8x16_t classify = vandq_u8(lowpart, highpart); - if (vmaxvq_u8(classify) != 0) { + if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); uint16_t is_non_zero = ~to_bitmask(is_zero); return view.length() - 16 + trailing_zeroes(is_non_zero); @@ -11164,7 +11165,7 @@ ada_really_inline void strip_trailing_spaces_from_opaque_path( static constexpr std::array<uint8_t, 256> authority_delimiter_special = []() constexpr { std::array<uint8_t, 256> result{}; - for (int i : {'@', '/', '\\', '?'}) { + for (uint8_t i : {'@', '/', '\\', '?'}) { result[i] = 1; } return result; @@ -11185,7 +11186,7 @@ find_authority_delimiter_special(std::string_view view) noexcept { // @ / ? static constexpr std::array<uint8_t, 256> authority_delimiter = []() constexpr { std::array<uint8_t, 256> result{}; - for (int i : {'@', '/', '?'}) { + for (uint8_t i : {'@', '/', '?'}) { result[i] = 1; } return result; @@ -11255,7 +11256,7 @@ bool url::parse_ipv4(std::string_view input) { segment_result = 0; input.remove_prefix(2); } else { - std::from_chars_result r; + std::from_chars_result r{}; if (is_hex) { r = std::from_chars(input.data() + 2, input.data() + input.size(), segment_result, 16); @@ -11552,21 +11553,21 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { // If url's scheme is not a special scheme and buffer is a special scheme, // then return. if (is_special() != is_input_special) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || port.has_value()) && parsed_type == ada::scheme::type::FILE) { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && host.has_value() && host.value().empty()) { - return true; + return false; } } @@ -11585,7 +11586,7 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { } } } else { // slow path - std::string _buffer = std::string(input); + std::string _buffer(input); // Next function is only valid if the input is ASCII and returns false // otherwise, but it seems that we always have ascii content so we do not // need to check the return value. @@ -11809,7 +11810,6 @@ ada_really_inline void url::parse_path(std::string_view input) { * Includes all the getters of `ada::url` */ -#include <algorithm> #include <string> namespace ada { @@ -12058,7 +12058,6 @@ void url::set_hash(const std::string_view input) { helpers::remove_ascii_tab_or_newline(new_value); hash = unicode::percent_encode(new_value, ada::character_sets::FRAGMENT_PERCENT_ENCODE); - return; } void url::set_search(const std::string_view input) { @@ -12136,14 +12135,14 @@ bool url::set_href(const std::string_view input) { /* end file src/url-setters.cpp */ /* begin file src/parser.cpp */ -#include <numeric> #include <limits> + namespace ada::parser { -template <class result_type> -result_type parse_url(std::string_view user_input, - const result_type* base_url) { +template <class result_type, bool store_values> +result_type parse_url_impl(std::string_view user_input, + const result_type* base_url) { // We can specialize the implementation per type. // Important: result_type_is_ada_url is evaluated at *compile time*. This // means that doing if constexpr(result_type_is_ada_url) { something } else { @@ -12178,7 +12177,7 @@ result_type parse_url(std::string_view user_input, if (!url.is_valid) { return url; } - if constexpr (result_type_is_ada_url_aggregator) { + if constexpr (result_type_is_ada_url_aggregator && store_values) { // Most of the time, we just need user_input.size(). // In some instances, we may need a bit more. /////////////////////////// @@ -12195,9 +12194,6 @@ result_type parse_url(std::string_view user_input, helpers::leading_zeroes(uint32_t(1 | user_input.size()))) + 1; url.reserve(reserve_capacity); - // - // - // } std::string tmp_buffer; std::string_view internal_input; @@ -12420,32 +12416,36 @@ result_type parse_url(std::string_view user_input, password_token_seen = password_token_location != std::string_view::npos; - if (!password_token_seen) { - if constexpr (result_type_is_ada_url) { - url.username += unicode::percent_encode( - authority_view, character_sets::USERINFO_PERCENT_ENCODE); - } else { - url.append_base_username(unicode::percent_encode( - authority_view, character_sets::USERINFO_PERCENT_ENCODE)); - } - } else { - if constexpr (result_type_is_ada_url) { - url.username += unicode::percent_encode( - authority_view.substr(0, password_token_location), - character_sets::USERINFO_PERCENT_ENCODE); - url.password += unicode::percent_encode( - authority_view.substr(password_token_location + 1), - character_sets::USERINFO_PERCENT_ENCODE); + if constexpr (store_values) { + if (!password_token_seen) { + if constexpr (result_type_is_ada_url) { + url.username += unicode::percent_encode( + authority_view, + character_sets::USERINFO_PERCENT_ENCODE); + } else { + url.append_base_username(unicode::percent_encode( + authority_view, + character_sets::USERINFO_PERCENT_ENCODE)); + } } else { - url.append_base_username(unicode::percent_encode( - authority_view.substr(0, password_token_location), - character_sets::USERINFO_PERCENT_ENCODE)); - url.append_base_password(unicode::percent_encode( - authority_view.substr(password_token_location + 1), - character_sets::USERINFO_PERCENT_ENCODE)); + if constexpr (result_type_is_ada_url) { + url.username += unicode::percent_encode( + authority_view.substr(0, password_token_location), + character_sets::USERINFO_PERCENT_ENCODE); + url.password += unicode::percent_encode( + authority_view.substr(password_token_location + 1), + character_sets::USERINFO_PERCENT_ENCODE); + } else { + url.append_base_username(unicode::percent_encode( + authority_view.substr(0, password_token_location), + character_sets::USERINFO_PERCENT_ENCODE)); + url.append_base_password(unicode::percent_encode( + authority_view.substr(password_token_location + 1), + character_sets::USERINFO_PERCENT_ENCODE)); + } } } - } else { + } else if constexpr (store_values) { if constexpr (result_type_is_ada_url) { url.password += unicode::percent_encode( authority_view, character_sets::USERINFO_PERCENT_ENCODE); @@ -12472,8 +12472,10 @@ result_type parse_url(std::string_view user_input, break; } if (end_of_authority == input_size) { - if (fragment.has_value()) { - url.update_unencoded_base_hash(*fragment); + if constexpr (store_values) { + if (fragment.has_value()) { + url.update_unencoded_base_hash(*fragment); + } } return url; } @@ -12670,19 +12672,22 @@ result_type parse_url(std::string_view user_input, } case ada::state::QUERY: { ada_log("QUERY ", helpers::substring(url_data, input_position)); - // Let queryPercentEncodeSet be the special-query percent-encode set if - // url is special; otherwise the query percent-encode set. - const uint8_t* query_percent_encode_set = - url.is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE - : ada::character_sets::QUERY_PERCENT_ENCODE; - - // Percent-encode after encoding, with encoding, buffer, and - // queryPercentEncodeSet, and append the result to url's query. - url.update_base_search(helpers::substring(url_data, input_position), - query_percent_encode_set); - ada_log("QUERY update_base_search completed "); - if (fragment.has_value()) { - url.update_unencoded_base_hash(*fragment); + if constexpr (store_values) { + // Let queryPercentEncodeSet be the special-query percent-encode set + // if url is special; otherwise the query percent-encode set. + const uint8_t* query_percent_encode_set = + url.is_special() + ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE + : ada::character_sets::QUERY_PERCENT_ENCODE; + + // Percent-encode after encoding, with encoding, buffer, and + // queryPercentEncodeSet, and append the result to url's query. + url.update_base_search(helpers::substring(url_data, input_position), + query_percent_encode_set); + ada_log("QUERY update_base_search completed "); + if (fragment.has_value()) { + url.update_unencoded_base_hash(*fragment); + } } return url; } @@ -12785,9 +12790,11 @@ result_type parse_url(std::string_view user_input, // Optimization: Avoiding going into PATH state improves the // performance of urls ending with /. if (input_position == input_size) { - url.update_base_pathname("/"); - if (fragment.has_value()) { - url.update_unencoded_base_hash(*fragment); + if constexpr (store_values) { + url.update_base_pathname("/"); + if (fragment.has_value()) { + url.update_unencoded_base_hash(*fragment); + } } return url; } @@ -12833,11 +12840,13 @@ result_type parse_url(std::string_view user_input, } else { input_position = input_size + 1; } - if constexpr (result_type_is_ada_url) { - helpers::parse_prepared_path(view, url.type, url.path); - } else { - url.consume_prepared_path(view); - ADA_ASSERT_TRUE(url.validate()); + if constexpr (store_values) { + if constexpr (result_type_is_ada_url) { + helpers::parse_prepared_path(view, url.type, url.path); + } else { + url.consume_prepared_path(view); + ADA_ASSERT_TRUE(url.validate()); + } } break; } @@ -13031,17 +13040,29 @@ result_type parse_url(std::string_view user_input, ada::unreachable(); } } - if (fragment.has_value()) { - url.update_unencoded_base_hash(*fragment); + if constexpr (store_values) { + if (fragment.has_value()) { + url.update_unencoded_base_hash(*fragment); + } } return url; } +template url parse_url_impl(std::string_view user_input, + const url* base_url = nullptr); +template url_aggregator parse_url_impl( + std::string_view user_input, const url_aggregator* base_url = nullptr); + +template <class result_type> +result_type parse_url(std::string_view user_input, + const result_type* base_url) { + return parse_url_impl<result_type, true>(user_input, base_url); +} + template url parse_url<url>(std::string_view user_input, const url* base_url = nullptr); template url_aggregator parse_url<url_aggregator>( std::string_view user_input, const url_aggregator* base_url = nullptr); - } // namespace ada::parser /* end file src/parser.cpp */ /* begin file src/url_components.cpp */ @@ -13121,7 +13142,6 @@ namespace ada { if (hash_start < index) { return false; } - index = hash_start; } return true; @@ -13195,21 +13215,21 @@ template <bool has_state_override> // If url's scheme is not a special scheme and buffer is a special scheme, // then return. if (is_special() != is_input_special) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || components.port != url_components::omitted) && parsed_type == ada::scheme::type::FILE) { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && components.host_start == components.host_end) { - return true; + return false; } } @@ -13227,7 +13247,7 @@ template <bool has_state_override> } } } else { // slow path - std::string _buffer = std::string(input); + std::string _buffer(input); // Next function is only valid if the input is ASCII and returns false // otherwise, but it seems that we always have ascii content so we do not // need to check the return value. @@ -13479,7 +13499,7 @@ bool url_aggregator::set_pathname(const std::string_view input) { } clear_pathname(); parse_path(input); - if (checkers::begins_with(input, "//") && !has_authority() && + if (checkers::begins_with(get_pathname(), "//") && !has_authority() && !has_dash_dot()) { buffer.insert(components.pathname_start, "/."); components.pathname_start += 2; @@ -13683,7 +13703,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { return false; } - std::string previous_host = std::string(get_hostname()); + std::string previous_host(get_hostname()); uint32_t previous_port = components.port; size_t host_end_pos = input.find('#'); @@ -13810,7 +13830,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { return "null"; } -[[nodiscard]] std::string_view url_aggregator::get_username() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_username() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_username"); if (has_non_empty_username()) { return helpers::substring(buffer, components.protocol_end + 2, @@ -13819,7 +13840,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { return ""; } -[[nodiscard]] std::string_view url_aggregator::get_password() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_password() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_password"); if (has_non_empty_password()) { return helpers::substring(buffer, components.username_end + 1, @@ -13828,7 +13850,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { return ""; } -[[nodiscard]] std::string_view url_aggregator::get_port() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_port() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_port"); if (components.port == url_components::omitted) { return ""; @@ -13837,7 +13860,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { components.pathname_start); } -[[nodiscard]] std::string_view url_aggregator::get_hash() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_hash() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_hash"); // If this's URL's fragment is either null or the empty string, then return // the empty string. Return U+0023 (#), followed by this's URL's fragment. @@ -13850,7 +13874,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { return helpers::substring(buffer, components.hash_start); } -[[nodiscard]] std::string_view url_aggregator::get_host() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_host() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_host"); // Technically, we should check if there is a hostname, but // the code below works even if there isn't. @@ -13863,12 +13888,13 @@ bool url_aggregator::set_hostname(const std::string_view input) { // if we have an empty host, then the space between components.host_end and // components.pathname_start may be occupied by /. if (start == components.host_end) { - return std::string_view(); + return {}; } return helpers::substring(buffer, start, components.pathname_start); } -[[nodiscard]] std::string_view url_aggregator::get_hostname() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_hostname() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_hostname"); // Technically, we should check if there is a hostname, but // the code below works even if there isn't. @@ -13882,12 +13908,13 @@ bool url_aggregator::set_hostname(const std::string_view input) { return helpers::substring(buffer, start, components.host_end); } -[[nodiscard]] std::string_view url_aggregator::get_pathname() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_pathname() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_pathname pathname_start = ", components.pathname_start, " buffer.size() = ", buffer.size(), " components.search_start = ", components.search_start, " components.hash_start = ", components.hash_start); - uint32_t ending_index = uint32_t(buffer.size()); + auto ending_index = uint32_t(buffer.size()); if (components.search_start != url_components::omitted) { ending_index = components.search_start; } else if (components.hash_start != url_components::omitted) { @@ -13896,14 +13923,15 @@ bool url_aggregator::set_hostname(const std::string_view input) { return helpers::substring(buffer, components.pathname_start, ending_index); } -[[nodiscard]] std::string_view url_aggregator::get_search() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_search() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_search"); // If this's URL's query is either null or the empty string, then return the // empty string. Return U+003F (?), followed by this's URL's query. if (components.search_start == url_components::omitted) { return ""; } - uint32_t ending_index = uint32_t(buffer.size()); + auto ending_index = uint32_t(buffer.size()); if (components.hash_start != url_components::omitted) { ending_index = components.hash_start; } @@ -13913,7 +13941,8 @@ bool url_aggregator::set_hostname(const std::string_view input) { return helpers::substring(buffer, components.search_start, ending_index); } -[[nodiscard]] std::string_view url_aggregator::get_protocol() const noexcept { +[[nodiscard]] std::string_view url_aggregator::get_protocol() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_protocol"); return helpers::substring(buffer, 0, components.protocol_end); } @@ -14041,7 +14070,7 @@ bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { segment_result = 0; input.remove_prefix(2); } else { - std::from_chars_result r; + std::from_chars_result r{}; if (is_hex) { ada_log("parse_ipv4 trying to parse hex number"); r = std::from_chars(input.data() + 2, input.data() + input.size(), @@ -14983,13 +15012,12 @@ bool ada_can_parse(const char* input, size_t length) noexcept { bool ada_can_parse_with_base(const char* input, size_t input_length, const char* base, size_t base_length) noexcept { - auto base_view = std::string_view(base, base_length); + std::string_view base_view(base, base_length); return ada::can_parse(std::string_view(input, input_length), &base_view); } void ada_free(ada_url result) noexcept { - ada::result<ada::url_aggregator>* r = - (ada::result<ada::url_aggregator>*)result; + auto* r = (ada::result<ada::url_aggregator>*)result; delete r; } @@ -15006,7 +15034,7 @@ bool ada_is_valid(ada_url result) noexcept { // caller must free the result with ada_free_owned_string ada_owned_string ada_get_origin(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); - ada_owned_string owned; + ada_owned_string owned{}; if (!r) { owned.data = nullptr; owned.length = 0; @@ -15021,14 +15049,12 @@ ada_owned_string ada_get_origin(ada_url result) noexcept { void ada_free_owned_string(ada_owned_string owned) noexcept { delete[] owned.data; - owned.data = nullptr; - owned.length = 0; } ada_string ada_get_href(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_href(); return ada_string_create(out.data(), out.length()); @@ -15037,7 +15063,7 @@ ada_string ada_get_href(ada_url result) noexcept { ada_string ada_get_username(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_username(); return ada_string_create(out.data(), out.length()); @@ -15046,7 +15072,7 @@ ada_string ada_get_username(ada_url result) noexcept { ada_string ada_get_password(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_password(); return ada_string_create(out.data(), out.length()); @@ -15055,7 +15081,7 @@ ada_string ada_get_password(ada_url result) noexcept { ada_string ada_get_port(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_port(); return ada_string_create(out.data(), out.length()); @@ -15064,7 +15090,7 @@ ada_string ada_get_port(ada_url result) noexcept { ada_string ada_get_hash(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_hash(); return ada_string_create(out.data(), out.length()); @@ -15073,7 +15099,7 @@ ada_string ada_get_hash(ada_url result) noexcept { ada_string ada_get_host(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_host(); return ada_string_create(out.data(), out.length()); @@ -15082,7 +15108,7 @@ ada_string ada_get_host(ada_url result) noexcept { ada_string ada_get_hostname(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_hostname(); return ada_string_create(out.data(), out.length()); @@ -15091,7 +15117,7 @@ ada_string ada_get_hostname(ada_url result) noexcept { ada_string ada_get_pathname(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_pathname(); return ada_string_create(out.data(), out.length()); @@ -15100,7 +15126,7 @@ ada_string ada_get_pathname(ada_url result) noexcept { ada_string ada_get_search(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_search(); return ada_string_create(out.data(), out.length()); @@ -15109,7 +15135,7 @@ ada_string ada_get_search(ada_url result) noexcept { ada_string ada_get_protocol(ada_url result) noexcept { ada::result<ada::url_aggregator>& r = get_instance(result); if (!r) { - return ada_string_create(NULL, 0); + return ada_string_create(nullptr, 0); } std::string_view out = r->get_protocol(); return ada_string_create(out.data(), out.length()); @@ -15368,15 +15394,14 @@ ada_url_search_params ada_parse_search_params(const char* input, } void ada_free_search_params(ada_url_search_params result) { - ada::result<ada::url_search_params>* r = - (ada::result<ada::url_search_params>*)result; + auto* r = (ada::result<ada::url_search_params>*)result; delete r; } ada_owned_string ada_search_params_to_string(ada_url_search_params result) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (!r) return ada_owned_string{NULL, 0}; + if (!r) return ada_owned_string{nullptr, 0}; std::string out = r->to_string(); ada_owned_string owned{}; owned.length = out.size(); @@ -15388,14 +15413,27 @@ ada_owned_string ada_search_params_to_string(ada_url_search_params result) { size_t ada_search_params_size(ada_url_search_params result) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (!r) return 0; + if (!r) { + return 0; + } return r->size(); } void ada_search_params_sort(ada_url_search_params result) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (r) r->sort(); + if (r) { + r->sort(); + } +} + +void ada_search_params_reset(ada_url_search_params result, const char* input, + size_t length) { + ada::result<ada::url_search_params>& r = + *(ada::result<ada::url_search_params>*)result; + if (r) { + r->reset(std::string_view(input, length)); + } } void ada_search_params_append(ada_url_search_params result, const char* key, @@ -15444,7 +15482,9 @@ bool ada_search_params_has(ada_url_search_params result, const char* key, size_t key_length) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (!r) return false; + if (!r) { + return false; + } return r->has(std::string_view(key, key_length)); } @@ -15453,7 +15493,9 @@ bool ada_search_params_has_value(ada_url_search_params result, const char* key, size_t value_length) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (!r) return false; + if (!r) { + return false; + } return r->has(std::string_view(key, key_length), std::string_view(value, value_length)); } @@ -15462,9 +15504,13 @@ ada_string ada_search_params_get(ada_url_search_params result, const char* key, size_t key_length) { ada::result<ada::url_search_params>& r = *(ada::result<ada::url_search_params>*)result; - if (!r) return ada_string_create(NULL, 0); + if (!r) { + return ada_string_create(nullptr, 0); + } auto found = r->get(std::string_view(key, key_length)); - if (!found.has_value()) return ada_string_create(NULL, 0); + if (!found.has_value()) { + return ada_string_create(nullptr, 0); + } return ada_string_create(found->data(), found->length()); } @@ -15514,90 +15560,96 @@ ada_url_search_params_entries_iter ada_search_params_get_entries( } void ada_free_strings(ada_strings result) { - ada::result<std::vector<std::string>>* r = - (ada::result<std::vector<std::string>>*)result; + auto* r = (ada::result<std::vector<std::string>>*)result; delete r; } size_t ada_strings_size(ada_strings result) { - ada::result<std::vector<std::string>>* r = - (ada::result<std::vector<std::string>>*)result; - if (!r) return 0; + auto* r = (ada::result<std::vector<std::string>>*)result; + if (!r) { + return 0; + } return (*r)->size(); } ada_string ada_strings_get(ada_strings result, size_t index) { - ada::result<std::vector<std::string>>* r = - (ada::result<std::vector<std::string>>*)result; - if (!r) return ada_string_create(NULL, 0); + auto* r = (ada::result<std::vector<std::string>>*)result; + if (!r) { + return ada_string_create(nullptr, 0); + } std::string_view view = (*r)->at(index); return ada_string_create(view.data(), view.length()); } void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result) { - ada::result<ada::url_search_params_keys_iter>* r = - (ada::result<ada::url_search_params_keys_iter>*)result; + auto* r = (ada::result<ada::url_search_params_keys_iter>*)result; delete r; } ada_string ada_search_params_keys_iter_next( ada_url_search_params_keys_iter result) { - ada::result<ada::url_search_params_keys_iter>* r = - (ada::result<ada::url_search_params_keys_iter>*)result; - if (!r) return ada_string_create(NULL, 0); + auto* r = (ada::result<ada::url_search_params_keys_iter>*)result; + if (!r) { + return ada_string_create(nullptr, 0); + } auto next = (*r)->next(); - if (!next.has_value()) return ada_string_create(NULL, 0); + if (!next.has_value()) { + return ada_string_create(nullptr, 0); + } return ada_string_create(next->data(), next->length()); } bool ada_search_params_keys_iter_has_next( ada_url_search_params_keys_iter result) { - ada::result<ada::url_search_params_keys_iter>* r = - (ada::result<ada::url_search_params_keys_iter>*)result; - if (!r) return false; + auto* r = (ada::result<ada::url_search_params_keys_iter>*)result; + if (!r) { + return false; + } return (*r)->has_next(); } void ada_free_search_params_values_iter( ada_url_search_params_values_iter result) { - ada::result<ada::url_search_params_values_iter>* r = - (ada::result<ada::url_search_params_values_iter>*)result; + auto* r = (ada::result<ada::url_search_params_values_iter>*)result; delete r; } ada_string ada_search_params_values_iter_next( ada_url_search_params_values_iter result) { - ada::result<ada::url_search_params_values_iter>* r = - (ada::result<ada::url_search_params_values_iter>*)result; - if (!r) return ada_string_create(NULL, 0); + auto* r = (ada::result<ada::url_search_params_values_iter>*)result; + if (!r) { + return ada_string_create(nullptr, 0); + } auto next = (*r)->next(); - if (!next.has_value()) return ada_string_create(NULL, 0); + if (!next.has_value()) { + return ada_string_create(nullptr, 0); + } return ada_string_create(next->data(), next->length()); } bool ada_search_params_values_iter_has_next( ada_url_search_params_values_iter result) { - ada::result<ada::url_search_params_values_iter>* r = - (ada::result<ada::url_search_params_values_iter>*)result; - if (!r) return false; + auto* r = (ada::result<ada::url_search_params_values_iter>*)result; + if (!r) { + return false; + } return (*r)->has_next(); } void ada_free_search_params_entries_iter( ada_url_search_params_entries_iter result) { - ada::result<ada::url_search_params_entries_iter>* r = - (ada::result<ada::url_search_params_entries_iter>*)result; + auto* r = (ada::result<ada::url_search_params_entries_iter>*)result; delete r; } ada_string_pair ada_search_params_entries_iter_next( ada_url_search_params_entries_iter result) { - ada::result<ada::url_search_params_entries_iter>* r = - (ada::result<ada::url_search_params_entries_iter>*)result; - if (!r) return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; + auto* r = (ada::result<ada::url_search_params_entries_iter>*)result; + if (!r) return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)}; auto next = (*r)->next(); - if (!next.has_value()) - return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; + if (!next.has_value()) { + return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)}; + } return ada_string_pair{ ada_string_create(next->first.data(), next->first.length()), ada_string_create(next->second.data(), next->second.length())}; @@ -15605,9 +15657,10 @@ ada_string_pair ada_search_params_entries_iter_next( bool ada_search_params_entries_iter_has_next( ada_url_search_params_entries_iter result) { - ada::result<ada::url_search_params_entries_iter>* r = - (ada::result<ada::url_search_params_entries_iter>*)result; - if (!r) return false; + auto* r = (ada::result<ada::url_search_params_entries_iter>*)result; + if (!r) { + return false; + } return (*r)->has_next(); } diff --git a/deps/ada/ada.h b/deps/ada/ada.h index 721ac736c39c57..4b00198e6a4bac 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2024-03-07 13:23:39 -0500. Do not edit! */ +/* auto-generated on 2024-09-02 20:07:32 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -461,9 +461,11 @@ namespace ada { #ifdef ADA_VISUAL_STUDIO #define ADA_ASSUME(COND) __assume(COND) #else -#define ADA_ASSUME(COND) \ - do { \ - if (!(COND)) __builtin_unreachable(); \ +#define ADA_ASSUME(COND) \ + do { \ + if (!(COND)) { \ + __builtin_unreachable(); \ + } \ } while (0) #endif @@ -477,6 +479,18 @@ namespace ada { #define ADA_NEON 1 #endif +#ifndef __has_cpp_attribute +#define ada_lifetime_bound +#elif __has_cpp_attribute(msvc::lifetimebound) +#define ada_lifetime_bound [[msvc::lifetimebound]] +#elif __has_cpp_attribute(clang::lifetimebound) +#define ada_lifetime_bound [[clang::lifetimebound]] +#elif __has_cpp_attribute(lifetimebound) +#define ada_lifetime_bound [[lifetimebound]] +#else +#define ada_lifetime_bound +#endif + #endif // ADA_COMMON_DEFS_H /* end file include/ada/common_defs.h */ #include <cstdint> @@ -948,15 +962,15 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = { // 30 31 32 33 34 35 36 37 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 38 39 3A 3B 3C 3D 3E 3F - 0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80, + 0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 40 41 42 43 44 45 46 47 - 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 48 49 4A 4B 4C 4D 4E 4F 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 50 51 52 53 54 55 56 57 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 58 59 5A 5B 5C 5D 5E 5F - 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x00, // 60 61 62 63 64 65 66 67 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 68 69 6A 6B 6C 6D 6E 6F @@ -964,7 +978,7 @@ constexpr uint8_t WWW_FORM_URLENCODED_PERCENT_ENCODE[32] = { // 70 71 72 73 74 75 76 77 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 78 79 7A 7B 7C 7D 7E 7F - 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x40 | 0x80, + 0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 80 81 82 83 84 85 86 87 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, // 88 89 8A 8B 8C 8D 8E 8F @@ -1072,7 +1086,7 @@ ada_really_inline bool begins_with(std::string_view view, } // namespace ada::checkers -#endif // ADA_CHECKERS_H +#endif // ADA_CHECKERS_INL_H /* end file include/ada/checkers-inl.h */ /* begin file include/ada/log.h */ /** @@ -1212,25 +1226,104 @@ namespace ada { * @see https://url.spec.whatwg.org/#url-parsing */ enum class state { + /** + * @see https://url.spec.whatwg.org/#authority-state + */ AUTHORITY, + + /** + * @see https://url.spec.whatwg.org/#scheme-start-state + */ SCHEME_START, + + /** + * @see https://url.spec.whatwg.org/#scheme-state + */ SCHEME, + + /** + * @see https://url.spec.whatwg.org/#host-state + */ HOST, + + /** + * @see https://url.spec.whatwg.org/#no-scheme-state + */ NO_SCHEME, + + /** + * @see https://url.spec.whatwg.org/#fragment-state + */ FRAGMENT, + + /** + * @see https://url.spec.whatwg.org/#relative-state + */ RELATIVE_SCHEME, + + /** + * @see https://url.spec.whatwg.org/#relative-slash-state + */ RELATIVE_SLASH, + + /** + * @see https://url.spec.whatwg.org/#file-state + */ FILE, + + /** + * @see https://url.spec.whatwg.org/#file-host-state + */ FILE_HOST, + + /** + * @see https://url.spec.whatwg.org/#file-slash-state + */ FILE_SLASH, + + /** + * @see https://url.spec.whatwg.org/#path-or-authority-state + */ PATH_OR_AUTHORITY, + + /** + * @see https://url.spec.whatwg.org/#special-authority-ignore-slashes-state + */ SPECIAL_AUTHORITY_IGNORE_SLASHES, + + /** + * @see https://url.spec.whatwg.org/#special-authority-slashes-state + */ SPECIAL_AUTHORITY_SLASHES, + + /** + * @see https://url.spec.whatwg.org/#special-relative-or-authority-state + */ SPECIAL_RELATIVE_OR_AUTHORITY, + + /** + * @see https://url.spec.whatwg.org/#query-state + */ QUERY, + + /** + * @see https://url.spec.whatwg.org/#path-state + */ PATH, + + /** + * @see https://url.spec.whatwg.org/#path-start-state + */ PATH_START, + + /** + * @see https://url.spec.whatwg.org/#cannot-be-a-base-url-path-state + */ OPAQUE_PATH, + + /** + * @see https://url.spec.whatwg.org/#port-state + */ PORT, }; @@ -1774,6 +1867,9 @@ inline int fast_digit_count(uint32_t x) noexcept { #ifndef ADA_PARSER_H #define ADA_PARSER_H +#include <optional> +#include <string_view> + /* begin file include/ada/expected.h */ /** * @file expected.h @@ -2751,8 +2847,9 @@ struct expected_operations_base<void, E> : expected_storage_base<void, E> { // This class manages conditionally having a trivial copy constructor // This specialization is for when T and E are trivially copy constructible template <class T, class E, - bool = is_void_or<T, TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T)>:: - value &&TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value> + bool = is_void_or<T, TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE( + T)>::value && + TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value> struct expected_copy_base : expected_operations_base<T, E> { using expected_operations_base<T, E>::expected_operations_base; }; @@ -2784,8 +2881,9 @@ struct expected_copy_base<T, E, false> : expected_operations_base<T, E> { // move constructible #ifndef TL_EXPECTED_GCC49 template <class T, class E, - bool = is_void_or<T, std::is_trivially_move_constructible<T>>::value - &&std::is_trivially_move_constructible<E>::value> + bool = + is_void_or<T, std::is_trivially_move_constructible<T>>::value && + std::is_trivially_move_constructible<E>::value> struct expected_move_base : expected_copy_base<T, E> { using expected_copy_base<T, E>::expected_copy_base; }; @@ -2814,14 +2912,16 @@ struct expected_move_base<T, E, false> : expected_copy_base<T, E> { }; // This class manages conditionally having a trivial copy assignment operator -template <class T, class E, - bool = is_void_or< - T, conjunction<TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T), - TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T), - TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)>>::value - &&TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(E)::value - &&TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value - &&TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(E)::value> +template < + class T, class E, + bool = + is_void_or< + T, conjunction<TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T), + TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T), + TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T)>>::value && + TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(E)::value && + TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value && + TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(E)::value> struct expected_copy_assign_base : expected_move_base<T, E> { using expected_move_base<T, E>::expected_move_base; }; @@ -2848,14 +2948,15 @@ struct expected_copy_assign_base<T, E, false> : expected_move_base<T, E> { // to make do with a non-trivial move assignment operator even if T is trivially // move assignable #ifndef TL_EXPECTED_GCC49 -template <class T, class E, - bool = - is_void_or<T, conjunction<std::is_trivially_destructible<T>, - std::is_trivially_move_constructible<T>, - std::is_trivially_move_assignable<T>>>:: - value &&std::is_trivially_destructible<E>::value - &&std::is_trivially_move_constructible<E>::value - &&std::is_trivially_move_assignable<E>::value> +template < + class T, class E, + bool = is_void_or< + T, conjunction<std::is_trivially_destructible<T>, + std::is_trivially_move_constructible<T>, + std::is_trivially_move_assignable<T>>>::value && + std::is_trivially_destructible<E>::value && + std::is_trivially_move_constructible<E>::value && + std::is_trivially_move_assignable<E>::value> struct expected_move_assign_base : expected_copy_assign_base<T, E> { using expected_copy_assign_base<T, E>::expected_copy_assign_base; }; @@ -2877,10 +2978,10 @@ struct expected_move_assign_base<T, E, false> expected_move_assign_base &operator=(const expected_move_assign_base &rhs) = default; - expected_move_assign_base & - operator=(expected_move_assign_base &&rhs) noexcept( - std::is_nothrow_move_constructible<T>::value - &&std::is_nothrow_move_assignable<T>::value) { + expected_move_assign_base &operator=( + expected_move_assign_base + &&rhs) noexcept(std::is_nothrow_move_constructible<T>::value && + std::is_nothrow_move_assignable<T>::value) { this->assign(std::move(rhs)); return *this; } @@ -3769,11 +3870,10 @@ class expected : private detail::expected_move_assign_base<T, E>, detail::is_swappable<OE>::value && (std::is_nothrow_move_constructible<OT>::value || std::is_nothrow_move_constructible<OE>::value)> - swap(expected &rhs) noexcept( - std::is_nothrow_move_constructible<T>::value - &&detail::is_nothrow_swappable<T>::value - &&std::is_nothrow_move_constructible<E>::value - &&detail::is_nothrow_swappable<E>::value) { + swap(expected &rhs) noexcept(std::is_nothrow_move_constructible<T>::value && + detail::is_nothrow_swappable<T>::value && + std::is_nothrow_move_constructible<E>::value && + detail::is_nothrow_swappable<E>::value) { if (has_value() && rhs.has_value()) { swap_where_both_have_value(rhs, typename std::is_void<T>::type{}); } else if (!has_value() && rhs.has_value()) { @@ -4292,9 +4392,6 @@ void swap(expected<T, E> &lhs, #endif /* end file include/ada/expected.h */ -#include <optional> -#include <string_view> - /** * @private */ @@ -4308,9 +4405,11 @@ struct url; * @brief Includes the definitions for supported parsers */ namespace ada::parser { - /** - * Parses a url. + * Parses a url. The parameter user_input is the input to be parsed: + * it should be a valid UTF-8 string. The parameter base_url is an optional + * parameter that can be used to resolve relative URLs. If the base_url is + * provided, the user_input is resolved against the base_url. */ template <typename result_type = ada::url_aggregator> result_type parse_url(std::string_view user_input, @@ -4321,6 +4420,14 @@ extern template url_aggregator parse_url<url_aggregator>( extern template url parse_url<url>(std::string_view user_input, const url* base_url); +template <typename result_type = ada::url_aggregator, bool store_values = true> +result_type parse_url_impl(std::string_view user_input, + const result_type* base_url = nullptr); + +extern template url_aggregator parse_url_impl<url_aggregator>( + std::string_view user_input, const url_aggregator* base_url); +extern template url parse_url_impl<url>(std::string_view user_input, + const url* base_url); } // namespace ada::parser #endif // ADA_PARSER_H @@ -4349,6 +4456,30 @@ constexpr std::string_view is_special_list[] = {"http", " ", "https", "ws", constexpr uint16_t special_ports[] = {80, 0, 443, 80, 21, 443, 0, 0}; } // namespace details +/**** + * @private + * In is_special, get_scheme_type, and get_special_port, we + * use a standard hashing technique to find the index of the scheme in + * the is_special_list. The hashing technique is based on the size of + * the scheme and the first character of the scheme. It ensures that we + * do at most one string comparison per call. If the protocol is + * predictible (e.g., it is always "http"), we can get a better average + * performance by using a simpler approach where we loop and compare + * scheme with all possible protocols starting with the most likely + * protocol. Doing multiple comparisons may have a poor worst case + * performance, however. In this instance, we choose a potentially + * slightly lower best-case performance for a better worst-case + * performance. We can revisit this choice at any time. + * + * Reference: + * Schmidt, Douglas C. "Gperf: A perfect hash function generator." + * More C++ gems 17 (2000). + * + * Reference: https://en.wikipedia.org/wiki/Perfect_hash_function + * + * Reference: https://github.com/ada-url/ada/issues/617 + ****/ + ada_really_inline constexpr bool is_special(std::string_view scheme) { if (scheme.empty()) { return false; @@ -4501,12 +4632,6 @@ namespace ada::unicode { bool to_ascii(std::optional<std::string>& out, std::string_view plain, size_t first_percent); -/** - * @private - * @see https://www.unicode.org/reports/tr46/#ToUnicode - */ -std::string to_unicode(std::string_view input); - /** * @private * Checks if the input has tab or newline characters. @@ -4683,10 +4808,10 @@ constexpr bool to_lower_ascii(char* input, size_t length) noexcept; #ifndef ADA_URL_AGGREGATOR_H #define ADA_URL_AGGREGATOR_H - #include <string> #include <string_view> + namespace ada { /** @@ -4732,35 +4857,38 @@ struct url_aggregator : url_base { * @see https://url.spec.whatwg.org/#dom-url-href * @see https://url.spec.whatwg.org/#concept-url-serializer */ - [[nodiscard]] inline std::string_view get_href() const noexcept; + [[nodiscard]] inline std::string_view get_href() const noexcept + ada_lifetime_bound; /** * The username getter steps are to return this's URL's username. * This function does not allocate memory. * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-username */ - [[nodiscard]] std::string_view get_username() const noexcept; + [[nodiscard]] std::string_view get_username() const noexcept + ada_lifetime_bound; /** * The password getter steps are to return this's URL's password. * This function does not allocate memory. * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-password */ - [[nodiscard]] std::string_view get_password() const noexcept; + [[nodiscard]] std::string_view get_password() const noexcept + ada_lifetime_bound; /** * Return this's URL's port, serialized. * This function does not allocate memory. * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-port */ - [[nodiscard]] std::string_view get_port() const noexcept; + [[nodiscard]] std::string_view get_port() const noexcept ada_lifetime_bound; /** * Return U+0023 (#), followed by this's URL's fragment. * This function does not allocate memory. * @return a lightweight std::string_view.. * @see https://url.spec.whatwg.org/#dom-url-hash */ - [[nodiscard]] std::string_view get_hash() const noexcept; + [[nodiscard]] std::string_view get_hash() const noexcept ada_lifetime_bound; /** * Return url's host, serialized, followed by U+003A (:) and url's port, * serialized. @@ -4769,7 +4897,7 @@ struct url_aggregator : url_base { * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-host */ - [[nodiscard]] std::string_view get_host() const noexcept; + [[nodiscard]] std::string_view get_host() const noexcept ada_lifetime_bound; /** * Return this's URL's host, serialized. * This function does not allocate memory. @@ -4777,7 +4905,8 @@ struct url_aggregator : url_base { * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-hostname */ - [[nodiscard]] std::string_view get_hostname() const noexcept; + [[nodiscard]] std::string_view get_hostname() const noexcept + ada_lifetime_bound; /** * The pathname getter steps are to return the result of URL path serializing * this's URL. @@ -4785,7 +4914,8 @@ struct url_aggregator : url_base { * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-pathname */ - [[nodiscard]] std::string_view get_pathname() const noexcept; + [[nodiscard]] std::string_view get_pathname() const noexcept + ada_lifetime_bound; /** * Compute the pathname length in bytes without instantiating a view or a * string. @@ -4799,7 +4929,7 @@ struct url_aggregator : url_base { * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-search */ - [[nodiscard]] std::string_view get_search() const noexcept; + [[nodiscard]] std::string_view get_search() const noexcept ada_lifetime_bound; /** * The protocol getter steps are to return this's URL's scheme, followed by * U+003A (:). @@ -4807,7 +4937,8 @@ struct url_aggregator : url_base { * @return a lightweight std::string_view. * @see https://url.spec.whatwg.org/#dom-url-protocol */ - [[nodiscard]] std::string_view get_protocol() const noexcept; + [[nodiscard]] std::string_view get_protocol() const noexcept + ada_lifetime_bound; /** * A URL includes credentials if its username or password is not the empty @@ -4880,6 +5011,11 @@ struct url_aggregator : url_base { std::string_view, const ada::url_aggregator *); friend void ada::helpers::strip_trailing_spaces_from_opaque_path< ada::url_aggregator>(ada::url_aggregator &url) noexcept; + friend ada::url_aggregator ada::parser::parse_url_impl< + ada::url_aggregator, true>(std::string_view, const ada::url_aggregator *); + friend ada::url_aggregator + ada::parser::parse_url_impl<ada::url_aggregator, false>( + std::string_view, const ada::url_aggregator *); std::string buffer{}; url_components components{}; @@ -5115,7 +5251,6 @@ ada_really_inline constexpr bool verify_dns_length( #ifndef ADA_URL_H #define ADA_URL_H - #include <algorithm> #include <charconv> #include <iostream> @@ -5123,6 +5258,7 @@ ada_really_inline constexpr bool verify_dns_length( #include <string> #include <string_view> + namespace ada { /** @@ -5397,6 +5533,11 @@ struct url : url_base { friend void ada::helpers::strip_trailing_spaces_from_opaque_path<ada::url>( ada::url &url) noexcept; + friend ada::url ada::parser::parse_url_impl<ada::url, true>(std::string_view, + const ada::url *); + friend ada::url_aggregator ada::parser::parse_url_impl< + ada::url_aggregator, true>(std::string_view, const ada::url_aggregator *); + inline void update_unencoded_base_hash(std::string_view input); inline void update_base_hostname(std::string_view input); inline void update_base_search(std::string_view input); @@ -5642,7 +5783,7 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { if (query.has_value()) { out.search_start = uint32_t(running_index); running_index += get_search().size(); - if (get_search().size() == 0) { + if (get_search().empty()) { running_index++; } } @@ -5705,7 +5846,7 @@ inline void url::set_scheme(std::string &&new_scheme) noexcept { type = ada::scheme::get_scheme_type(new_scheme); // We only move the 'scheme' if it is non-special. if (!is_special()) { - non_special_scheme = new_scheme; + non_special_scheme = std::move(new_scheme); } } @@ -5754,10 +5895,15 @@ inline void url::copy_scheme(const ada::url &u) { ada_really_inline size_t url::parse_port(std::string_view view, bool check_trailing_content) noexcept { ada_log("parse_port('", view, "') ", view.size()); + if (!view.empty() && view[0] == '-') { + ada_log("parse_port: view[0] == '0' && view.size() > 1"); + is_valid = false; + return 0; + } uint16_t parsed_port{}; auto r = std::from_chars(view.data(), view.data() + view.size(), parsed_port); if (r.ec == std::errc::result_out_of_range) { - ada_log("parse_port: std::errc::result_out_of_range"); + ada_log("parse_port: r.ec == std::errc::result_out_of_range"); is_valid = false; return 0; } @@ -6113,7 +6259,7 @@ inline void url_aggregator::append_base_pathname(const std::string_view input) { ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); #if ADA_DEVELOPMENT_CHECKS // computing the expected password. - std::string path_expected = std::string(get_pathname()); + std::string path_expected(get_pathname()); path_expected.append(input); #endif // ADA_DEVELOPMENT_CHECKS uint32_t ending_index = uint32_t(buffer.size()); @@ -6183,7 +6329,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) { ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); #if ADA_DEVELOPMENT_CHECKS // computing the expected password. - std::string username_expected = std::string(get_username()); + std::string username_expected(get_username()); username_expected.append(input); #endif // ADA_DEVELOPMENT_CHECKS add_authority_slashes_if_needed(); @@ -6213,7 +6359,7 @@ inline void url_aggregator::append_base_username(const std::string_view input) { components.hash_start += difference; } #if ADA_DEVELOPMENT_CHECKS - std::string username_after = std::string(get_username()); + std::string username_after(get_username()); ADA_ASSERT_EQUAL( username_expected, username_after, "append_base_username problem after inserting " + std::string(input)); @@ -6339,7 +6485,7 @@ inline void url_aggregator::append_base_password(const std::string_view input) { components.hash_start += difference; } #if ADA_DEVELOPMENT_CHECKS - std::string password_after = std::string(get_password()); + std::string password_after(get_password()); ADA_ASSERT_EQUAL( password_expected, password_after, "append_base_password problem after inserting " + std::string(input)); @@ -6653,8 +6799,8 @@ inline bool url_aggregator::has_port() const noexcept { buffer[components.host_end + 1] == '.'; } -[[nodiscard]] inline std::string_view url_aggregator::get_href() - const noexcept { +[[nodiscard]] inline std::string_view url_aggregator::get_href() const noexcept + ada_lifetime_bound { ada_log("url_aggregator::get_href"); return buffer; } @@ -6662,10 +6808,15 @@ inline bool url_aggregator::has_port() const noexcept { ada_really_inline size_t url_aggregator::parse_port( std::string_view view, bool check_trailing_content) noexcept { ada_log("url_aggregator::parse_port('", view, "') ", view.size()); + if (!view.empty() && view[0] == '-') { + ada_log("parse_port: view[0] == '0' && view.size() > 1"); + is_valid = false; + return 0; + } uint16_t parsed_port{}; auto r = std::from_chars(view.data(), view.data() + view.size(), parsed_port); if (r.ec == std::errc::result_out_of_range) { - ada_log("parse_port: std::errc::result_out_of_range"); + ada_log("parse_port: r.ec == std::errc::result_out_of_range"); is_valid = false; return 0; } @@ -6826,7 +6977,7 @@ struct url_search_params { /** * @see https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior */ - inline std::string to_string(); + inline std::string to_string() const; /** * Returns a simple JS-style iterator over all of the keys in this @@ -6864,6 +7015,14 @@ struct url_search_params { inline auto back() const { return params.back(); } inline auto operator[](size_t index) const { return params[index]; } + /** + * @private + * Used to reset the search params to a new input. + * Used primarily for C API. + * @param input + */ + void reset(std::string_view input); + private: typedef std::pair<std::string, std::string> key_value_pair; std::vector<key_value_pair> params{}; @@ -6934,6 +7093,11 @@ namespace ada { template <typename T, ada::url_search_params_iter_type Type> url_search_params url_search_params_iter<T, Type>::EMPTY; +inline void url_search_params::reset(std::string_view input) { + params.clear(); + initialize(input); +} + inline void url_search_params::initialize(std::string_view input) { if (!input.empty() && input.front() == '?') { input.remove_prefix(1); @@ -6943,12 +7107,12 @@ inline void url_search_params::initialize(std::string_view input) { auto equal = current.find('='); if (equal == std::string_view::npos) { - auto name = std::string(current); + std::string name(current); std::replace(name.begin(), name.end(), '+', ' '); params.emplace_back(unicode::percent_decode(name, name.find('%')), ""); } else { - auto name = std::string(current.substr(0, equal)); - auto value = std::string(current.substr(equal + 1)); + std::string name(current.substr(0, equal)); + std::string value(current.substr(equal + 1)); std::replace(name.begin(), name.end(), '+', ' '); std::replace(value.begin(), value.end(), '+', ' '); @@ -7021,7 +7185,7 @@ inline bool url_search_params::has(std::string_view key, return entry != params.end(); } -inline std::string url_search_params::to_string() { +inline std::string url_search_params::to_string() const { auto character_set = ada::character_sets::WWW_FORM_URLENCODED_PERCENT_ENCODE; std::string out{}; for (size_t i = 0; i < params.size(); i++) { @@ -7106,20 +7270,26 @@ inline bool url_search_params_iter<T, Type>::has_next() { template <> inline std::optional<std::string_view> url_search_params_keys_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++].first; } template <> inline std::optional<std::string_view> url_search_params_values_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++].second; } template <> inline std::optional<key_value_view_pair> url_search_params_entries_iter::next() { - if (!has_next()) return std::nullopt; + if (!has_next()) { + return std::nullopt; + } return params.params[pos++]; } @@ -7137,14 +7307,14 @@ url_search_params_entries_iter::next() { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "2.7.7" +#define ADA_VERSION "2.9.2" namespace ada { enum { ADA_VERSION_MAJOR = 2, - ADA_VERSION_MINOR = 7, - ADA_VERSION_REVISION = 7, + ADA_VERSION_MINOR = 9, + ADA_VERSION_REVISION = 2, }; } // namespace ada diff --git a/deps/ada/ada_c.h b/deps/ada/ada_c.h index 173e27bb16af06..44e945c9656187 100644 --- a/deps/ada/ada_c.h +++ b/deps/ada/ada_c.h @@ -151,6 +151,8 @@ ada_string ada_search_params_get(ada_url_search_params result, const char* key, size_t key_length); ada_strings ada_search_params_get_all(ada_url_search_params result, const char* key, size_t key_length); +void ada_search_params_reset(ada_url_search_params result, const char* input, + size_t length); ada_url_search_params_keys_iter ada_search_params_get_keys( ada_url_search_params result); ada_url_search_params_values_iter ada_search_params_get_values( diff --git a/deps/amaro/LICENSE.md b/deps/amaro/LICENSE.md new file mode 100644 index 00000000000000..debb68feeb8aad --- /dev/null +++ b/deps/amaro/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Marco Ippolito and Amaro contributors + +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/amaro/README.md b/deps/amaro/README.md new file mode 100644 index 00000000000000..28b0347baa517e --- /dev/null +++ b/deps/amaro/README.md @@ -0,0 +1,83 @@ +# Amaro + +Amaro is a wrapper around `@swc/wasm-typescript`, a WebAssembly port of the SWC TypeScript parser. +It's used as an internal in Node.js for [Type Stripping](https://nodejs.org/api/typescript.html#type-stripping) but can also be used as a standalone package. + +> Amaro means "bitter" in Italian. It's a reference to [Mount Amaro](https://en.wikipedia.org/wiki/Monte_Amaro_(Abruzzo)) on whose slopes this package was conceived. + +This package provides a stable API for the TypeScript parser and allows users to upgrade to the latest version of TypeScript transpiler independently from the one used internally in Node.js. + +## How to Install + +To install Amaro, run: + +```shell +npm install amaro +``` + +## How to Use + +By default Amaro exports a `transformSync` function that performs type stripping. +Stack traces are preserved, by replacing removed types with white spaces. + +```javascript +const amaro = require('amaro'); +const { code } = amaro.transformSync("const foo: string = 'bar';", { mode: "strip-only" }); +console.log(code); // "const foo = 'bar';" +``` + +### Loader + +It is possible to use Amaro as an external loader to execute TypeScript files. +This allows the installed Amaro to override the Amaro version used by Node.js. +In order to use Amaro as an external loader, type stripping needs to be enabled. + +In node v23 and later you can omit the `--experimental-strip-types` flag, as it is enabled by default. + +```bash +node --experimental-strip-types --import="amaro/strip" file.ts +``` + +Enabling TypeScript feature transformation: + +```bash +node --experimental-transform-types --import="amaro/transform" file.ts +``` + +> Note that the "amaro/transform" loader should be used with `--experimental-transform-types` flag, or +> at least with `--enable-source-maps` flag, to preserve the original source maps. + +#### Type stripping in dependencies + +Contrary to the Node.js [TypeScript support](https://nodejs.org/docs/latest/api/typescript.html#type-stripping-in-dependencies), when used as a loader, Amaro handles TypeScript files inside folders under a `node_modules` path. + +### Monorepo usage + +Amaro makes working in monorepos smoother by removing the need to rebuild internal packages during development. When used with the [`--conditions`](https://nodejs.org/docs/latest/api/cli.html#-c-condition---conditionscondition) flag, you can reference TypeScript source files directly in exports: + +```json +"exports": { + ".": { + "typescript": "./src/index.ts", + "types": "./dist/index.d.ts", + "require": "./dist/index.js", + "import": "./dist/index.js" + } +} +``` + +Then run your app with: + +```bash +node --watch --import="amaro/strip" --conditions=typescript ./src/index.ts +``` + +This setup allows Node.js to load TypeScript files from linked packages without a build step. Changes to any package are picked up immediately, speeding up and simplifying local development in monorepos. + +### TypeScript Version + +The supported TypeScript version is 5.8. + +## License (MIT) + +See [`LICENSE.md`](./LICENSE.md). diff --git a/deps/amaro/dist/LICENSE b/deps/amaro/dist/LICENSE new file mode 100644 index 00000000000000..6a08504909fe06 --- /dev/null +++ b/deps/amaro/dist/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2024 SWC contributors. + +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. \ No newline at end of file diff --git a/deps/amaro/dist/errors.d.ts b/deps/amaro/dist/errors.d.ts new file mode 100644 index 00000000000000..c3d84d4de2cfea --- /dev/null +++ b/deps/amaro/dist/errors.d.ts @@ -0,0 +1,13 @@ +type SwcError = { + code: "UnsupportedSyntax" | "InvalidSyntax"; + message: string; + startColumn: number; + startLine: number; + snippet: string; + filename: string; + endColumn: number; + endLine: number; +}; +export declare function isSwcError(error: unknown): error is SwcError; +export declare function wrapAndReThrowSwcError(error: SwcError): never; +export {}; diff --git a/deps/amaro/dist/errors.js b/deps/amaro/dist/errors.js new file mode 100644 index 00000000000000..0b860e4b541d87 --- /dev/null +++ b/deps/amaro/dist/errors.js @@ -0,0 +1,24 @@ +"use strict"; +export function isSwcError(error) { + return error.code !== void 0; +} +export function wrapAndReThrowSwcError(error) { + const errorHints = `${error.filename}:${error.startLine} +${error.snippet} +`; + switch (error.code) { + case "UnsupportedSyntax": { + const unsupportedSyntaxError = new Error(error.message); + unsupportedSyntaxError.name = "UnsupportedSyntaxError"; + unsupportedSyntaxError.stack = `${errorHints}${unsupportedSyntaxError.stack}`; + throw unsupportedSyntaxError; + } + case "InvalidSyntax": { + const syntaxError = new SyntaxError(error.message); + syntaxError.stack = `${errorHints}${syntaxError.stack}`; + throw syntaxError; + } + default: + throw new Error(error.message); + } +} diff --git a/deps/amaro/dist/index.d.ts b/deps/amaro/dist/index.d.ts new file mode 100644 index 00000000000000..5e35978f759a02 --- /dev/null +++ b/deps/amaro/dist/index.d.ts @@ -0,0 +1 @@ +export { transformSync } from "./transform.ts"; diff --git a/deps/amaro/dist/index.js b/deps/amaro/dist/index.js new file mode 100644 index 00000000000000..26ff44b9ee3cae --- /dev/null +++ b/deps/amaro/dist/index.js @@ -0,0 +1,586 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// lib/wasm.js +var require_wasm = __commonJS({ + "lib/wasm.js"(exports2, module2) { + "use strict"; + var imports = {}; + imports["__wbindgen_placeholder__"] = module2.exports; + var wasm; + var { TextDecoder, TextEncoder } = require("util"); + var heap = new Array(128).fill(void 0); + heap.push(void 0, null, true, false); + function getObject(idx) { + return heap[idx]; + } + var heap_next = heap.length; + function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + heap[idx] = obj; + return idx; + } + function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_export_0(addHeapObject(e)); + } + } + var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); + cachedTextDecoder.decode(); + var cachedUint8ArrayMemory0 = null; + function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; + } + function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); + } + function getCachedStringFromWasm0(ptr, len) { + if (ptr === 0) { + return getObject(len); + } else { + return getStringFromWasm0(ptr, len); + } + } + function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; + } + function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; + } + function isLikeNone(x) { + return x === void 0 || x === null; + } + var cachedDataViewMemory0 = null; + function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || cachedDataViewMemory0.buffer.detached === void 0 && cachedDataViewMemory0.buffer !== wasm.memory.buffer) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; + } + var CLOSURE_DTORS = typeof FinalizationRegistry === "undefined" ? { register: () => { + }, unregister: () => { + } } : new FinalizationRegistry((state) => { + wasm.__wbindgen_export_1.get(state.dtor)(state.a, state.b); + }); + function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_1.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; + } + function debugString(val) { + const type = typeof val; + if (type == "number" || type == "boolean" || val == null) { + return `${val}`; + } + if (type == "string") { + return `"${val}"`; + } + if (type == "symbol") { + const description = val.description; + if (description == null) { + return "Symbol"; + } else { + return `Symbol(${description})`; + } + } + if (type == "function") { + const name = val.name; + if (typeof name == "string" && name.length > 0) { + return `Function(${name})`; + } else { + return "Function"; + } + } + if (Array.isArray(val)) { + const length = val.length; + let debug = "["; + if (length > 0) { + debug += debugString(val[0]); + } + for (let i = 1; i < length; i++) { + debug += ", " + debugString(val[i]); + } + debug += "]"; + return debug; + } + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + return toString.call(val); + } + if (className == "Object") { + try { + return "Object(" + JSON.stringify(val) + ")"; + } catch (_) { + return "Object"; + } + } + if (val instanceof Error) { + return `${val.name}: ${val.message} +${val.stack}`; + } + return className; + } + var WASM_VECTOR_LEN = 0; + var cachedTextEncoder = new TextEncoder("utf-8"); + var encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) { + return cachedTextEncoder.encodeInto(arg, view); + } : function(arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + }; + function passStringToWasm0(arg, malloc, realloc) { + if (realloc === void 0) { + const buf = cachedTextEncoder.encode(arg); + const ptr2 = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr2; + } + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + const mem = getUint8ArrayMemory0(); + let offset = 0; + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 127) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + WASM_VECTOR_LEN = offset; + return ptr; + } + module2.exports.transform = function(input, options) { + const ret = wasm.transform(addHeapObject(input), addHeapObject(options)); + return takeObject(ret); + }; + module2.exports.transformSync = function(input, options) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.transformSync(retptr, addHeapObject(input), addHeapObject(options)); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + }; + function __wbg_adapter_50(arg0, arg1, arg2) { + wasm.__wbindgen_export_4(arg0, arg1, addHeapObject(arg2)); + } + function __wbg_adapter_91(arg0, arg1, arg2, arg3) { + wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); + } + module2.exports.__wbg_buffer_609cc3eee51ed158 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + module2.exports.__wbg_call_672a4d21634d4a24 = function() { + return handleError(function(arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + module2.exports.__wbg_call_7cccdd69e0791ae2 = function() { + return handleError(function(arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); + }; + module2.exports.__wbg_done_769e5ede4b31c67b = function(arg0) { + const ret = getObject(arg0).done; + return ret; + }; + module2.exports.__wbg_entries_3265d4158b33e5dc = function(arg0) { + const ret = Object.entries(getObject(arg0)); + return addHeapObject(ret); + }; + module2.exports.__wbg_get_67b2ba62fc30de12 = function() { + return handleError(function(arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + module2.exports.__wbg_get_b9b93047fe3cf45b = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + module2.exports.__wbg_getwithrefkey_1dc361bd10053bfe = function(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + module2.exports.__wbg_instanceof_ArrayBuffer_e14585432e3737fc = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + module2.exports.__wbg_instanceof_Map_f3469ce2244d2430 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Map; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + module2.exports.__wbg_instanceof_Uint8Array_17156bcf118086a9 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + module2.exports.__wbg_isArray_a1eab7e0d067391b = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + module2.exports.__wbg_isSafeInteger_343e2beeeece1bb0 = function(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + module2.exports.__wbg_iterator_9a24c88df860dc65 = function() { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + module2.exports.__wbg_length_a446193dc22c12f8 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + module2.exports.__wbg_length_e2d2a49132c1b256 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + module2.exports.__wbg_new_23a2665fac83c611 = function(arg0, arg1) { + try { + var state0 = { a: arg0, b: arg1 }; + var cb0 = (arg02, arg12) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_91(a, state0.b, arg02, arg12); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return addHeapObject(ret); + } finally { + state0.a = state0.b = 0; + } + }; + module2.exports.__wbg_new_405e22f390576ce2 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + module2.exports.__wbg_new_78feb108b6472713 = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + module2.exports.__wbg_new_a12002a7f91c75be = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + module2.exports.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) { + var v0 = getCachedStringFromWasm0(arg0, arg1); + const ret = new Function(v0); + return addHeapObject(ret); + }; + module2.exports.__wbg_next_25feadfc0913fea9 = function(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + module2.exports.__wbg_next_6574e1a8a62d1055 = function() { + return handleError(function(arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments); + }; + module2.exports.__wbg_queueMicrotask_97d92b4fcc8a61c5 = function(arg0) { + queueMicrotask(getObject(arg0)); + }; + module2.exports.__wbg_queueMicrotask_d3219def82552485 = function(arg0) { + const ret = getObject(arg0).queueMicrotask; + return addHeapObject(ret); + }; + module2.exports.__wbg_resolve_4851785c9c5f573d = function(arg0) { + const ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }; + module2.exports.__wbg_set_37837023f3d740e8 = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + module2.exports.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + module2.exports.__wbg_set_65595bdd868b3009 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + module2.exports.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() { + const ret = typeof global === "undefined" ? null : global; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + module2.exports.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() { + const ret = typeof globalThis === "undefined" ? null : globalThis; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + module2.exports.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() { + const ret = typeof self === "undefined" ? null : self; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + module2.exports.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() { + const ret = typeof window === "undefined" ? null : window; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + module2.exports.__wbg_then_44b73946d2fb3e7d = function(arg0, arg1) { + const ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }; + module2.exports.__wbg_toString_5285597960676b7b = function(arg0) { + const ret = getObject(arg0).toString(); + return addHeapObject(ret); + }; + module2.exports.__wbg_value_cd1ffa7b1ab794f1 = function(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + module2.exports.__wbindgen_bigint_from_i64 = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + module2.exports.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + module2.exports.__wbindgen_bigint_get_as_i64 = function(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof v === "bigint" ? v : void 0; + getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + module2.exports.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? v ? 1 : 0 : 2; + return ret; + }; + module2.exports.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + module2.exports.__wbindgen_closure_wrapper6827 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 967, __wbg_adapter_50); + return addHeapObject(ret); + }; + module2.exports.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + module2.exports.__wbindgen_error_new = function(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + module2.exports.__wbindgen_in = function(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + module2.exports.__wbindgen_is_bigint = function(arg0) { + const ret = typeof getObject(arg0) === "bigint"; + return ret; + }; + module2.exports.__wbindgen_is_falsy = function(arg0) { + const ret = !getObject(arg0); + return ret; + }; + module2.exports.__wbindgen_is_function = function(arg0) { + const ret = typeof getObject(arg0) === "function"; + return ret; + }; + module2.exports.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + const ret = typeof val === "object" && val !== null; + return ret; + }; + module2.exports.__wbindgen_is_string = function(arg0) { + const ret = typeof getObject(arg0) === "string"; + return ret; + }; + module2.exports.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === void 0; + return ret; + }; + module2.exports.__wbindgen_jsval_eq = function(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; + module2.exports.__wbindgen_jsval_loose_eq = function(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + module2.exports.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + module2.exports.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "number" ? obj : void 0; + getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); + }; + module2.exports.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + module2.exports.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + module2.exports.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + module2.exports.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "string" ? obj : void 0; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + module2.exports.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + module2.exports.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + var { Buffer: Buffer2 } = require("node:buffer"); + var bytes = Buffer2.from("AGFzbQEAAAAB7AROYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmACf38AYAJ/fwF/YAJ/fwF+YAJ/fwF8YAN/f38AYAN/f38Bf2ADf39/AX5gBH9/f38AYAR/f39/AX9gBH9/f38BfmAFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwBgB39/f39/f38Bf2AIf39/f39/f38AYAh/f39/f39/fwF/YAt/f39/f39/f39/fwF/YA1/f39/f39/f39/f39/AGAOf39/f39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AX9gE39/f39/f39/f39/f39/f39/f38Bf2AXf39/f39/f39/f39/f39/f39/f39/f38Bf2AJf39/f39/fn5+AGAFf39/f34AYAZ/f39/fn8AYAR/f39+AGAGf39/fn9/AGADf39+AGADf39+AX9gBH9/fn8AYAR/f35/AX9gBX9/fn9/AGAGf39+f35/AGAFf399f38AYAV/f3x/fwBgAn9+AGACf34Bf2ADf35/AGADf35/AX9gBH9+f38AYAR/fn9+AX5gA39+fgBgA39+fgF/YAR/fn5/AGAFf35+fn4AYAR/fX9/AGACf3wAYAN/fH8Bf2AEf3x/fwBgBH98f38Bf2ABfgBgAX4Bf2ABfgF+YAJ+fwBgAn5/AX9gAn5/AX5gA35/fwBgA35/fwF/YAJ+fgBgAn5+AX5gA35+fwBgBH5+f38BfmAEfn5+fwF+YAd+fn5/f39/AX5gAXwBf2ABfAF8YAJ8fwF/YAJ8fwF8YAJ8fAF8YAN8fHwBfALLGj0YX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX2dldAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMjNhMjY2NWZhYzgzYzYxMQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfMWRjMzYxYmQxMDA1M2JmZQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfZTJkMmE0OTEzMmMxYjI1NgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX3N0cmluZwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfYjliOTMwNDdmZTNjZjQ1YgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19uZXcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18fX193YmdfdG9TdHJpbmdfNTI4NTU5Nzk2MDY3NmI3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNDA1ZTIyZjM5MDU3NmNlMgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNzhmZWIxMDhiNjQ3MjcxMwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfMzc4MzcwMjNmM2Q3NDBlOAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21fdTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fE19fd2JpbmRnZW5fanN2YWxfZXEABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcASBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF82NTc0ZTFhOGE2MmQxMDU1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2RvbmVfNzY5ZTVlZGU0YjMxYzY3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxxfX3diZ192YWx1ZV9jZDFmZmE3YjFhYjc5NGYxAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX2dldF82N2IyYmE2MmZjMzBkZTEyAAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24ABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF8yNWZlYWRmYzA5MTNmZWE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfNjcyYTRkMjE2MzRkNGEyNAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyBfX3diZ19uZXdub2FyZ3NfMTA1ZWQ0NzE0NzVhYWY1MAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzg4YTkwMmQxM2E1NTdkMDcAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18yX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzU2NTc4YmU3ZTlmODMyYjAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV181ZGUzNzA0M2E5MWE5YzQwAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fK19fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzM3YzVkNDE4ZTRiZjU4MTkAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfaXNBcnJheV9hMWVhYjdlMGQwNjczOTFiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfN2NjY2RkNjllMDc5MWFlMgALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfYTQ0NjE5M2RjMjJjMTJmOAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxFfX3diaW5kZ2VuX21lbW9yeQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfYTEyMDAyYTdmOTFjNzViZQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfNjU1OTViZGQ4NjhiMzAwOQAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfMTcxNTZiY2YxMTgwODZhOQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWYABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18ZX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2UxNDU4NTQzMmUzNzM3ZmMABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfZW50cmllc18zMjY1ZDQxNThiMzNlNWRjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEF9fd2JpbmRnZW5fdGhyb3cABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ190aGVuXzQ0YjczOTQ2ZDJmYjNlN2QABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfcXVldWVNaWNyb3Rhc2tfOTdkOTJiNGZjYzhhNjFjNQADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza19kMzIxOWRlZjgyNTUyNDg1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX3Jlc29sdmVfNDg1MTc4NWM5YzVmNTczZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxJfX3diaW5kZ2VuX2NiX2Ryb3AABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmluZGdlbl9jbG9zdXJlX3dyYXBwZXI2ODI3AAsDlzCVMA0GEAoLBgYGBgYKEAoKCgYKCg0GBg0GBgYKEgoNEAoNBi8GDQYQBgc5BgYHCg0KCg0GBhIGBg4GBgYSChANChIEBwoNCgYNBgoKEgYDEBIGDQYHBgcDBhINBAYSBgoDCgoNCg0GAwMDBgYGBgYGChISAwMDDQMSAxIGBwMDCgoDEgMDEgYKBhADBgYDAwcGBgYDBg0GCgYDAwMGAwMGAwoGCgYNCgZMAwMGBgsUDQYKBhANAw0KBkoHAwoQBhJKBgYKEAcQEAsDAwMGBxAGDQcUBgcQCwcHBgsSBwoGBgMQBg0LBgYNDQYKDQEQEAYGBwYGBgYKBwoDBAYKCgsKCgYEDQYNBg0GBw0QEA0HBg0SBg0HBwoNEAYDCgtNChAKEgYDEgYGBgYGAwMGBwYGEAoKCgoKCgoGAwcKCgoGBgYGBgQEBwoGAwEUDQcKCg0DCwoGBg0HBgYECgEKBgMGBhADBgYKCwsHBgoGEAMGDQYKAwMDAw0GBgMDBgMaAxIKCgYGAw0GBgQDBwYECgYDDQMDAwMDAwMKAwMDAwMDAwMDAwMDAwMDAwwGBAoDChQOAwMDAw0NBhUOBgoDBgYGFAMGBgYOBgQGDg0OAwMKBgsSBgYKBgYGBAMDAwMOCgYSCyAKCwYHBgYGBgYGBgYDBgYSBxQGBxQNNwYGBg0HAwoNFwYKBgoQBgYLCwMKBgsLBgYNCwsEBgsGCgoNBgoKCgYNBgcDBgYDBgYGCgoNBgoHAwcOBgoDCwsSBwYGAwMDCgYEEDkZEAMNAwoDAwcKCg0HCwMHEAsGBgMDEAcKCgoGDQ0GDQsNDQMDCgYGBgcLBhYDAygGCgoGBwYDBgMGBgYUCwoDEgoNFAYGBgcGAwMDBgcGCwYGDQoDBhASBQYKEwcGCwYGCgYKBhIHCwYGDQ0DEggKAwYGAwcDCgsGCgMHBgYKCg4LBwYKAy0ILgYDAwMDAwMDAwYNBA0GAxAQEhIGBwMDBgYGFQMDAwMDAw0NDQQGBgYSAwMHCgMGBgoGBgYUEgYHKwsUAwoSEgMGCgcHBgMGCgpFRQYLCgoRBwZFBg0NDQYQEhQSBwYGFBIKBEwLBgYKBwYGCgcHAzELCwcHBgYKEBIDBwMGBgoGDQYGBgMGCwoKBgYDBgYKAwAGCgYGPQQGAwYNCg0HBhAeBwMGBgoDBwMDBgoKAwMDBwYGDgYSBwYLCgoKBgYGBgYKBgYGBwMHBwYGQQYLBgYKBgcDBgoKCgoKDQ0NBwYDAwsNAwMKBgYKCgoNAwoGIQYGCwMHBBUEEgYEDQ0KBhMHEgoKCg0NBgoHBgpJChIEDQoKCgoNBgYHBAMHBhUHBgcHCg0ECgYGCwYUDQYEBxAGBwcNBgYKChIHCgQGHwoEBgYSBAYGBwYGBgYDBgYGBiUGCg4GBgMGBgMGEA0NDQ0NDgoGBgcHCgYEEg0NEgoNBhIGEAYGEgoGBgMDBgcQCjANDRIKBwYKDQMGBg0DBgYGBgoGEhIEAwMFBgoGCgQHBwYQBgcKAwYNDQMGAwMSEgsEEBEDBwUHBgYHBgMKAwMGBgYGBwYGBgYGCg4HBgQKCgYKAwsiBgsDBwYKAwYNDQYDBgYQBwcHCgYGBgYKCxItBBISBgYGBwcDBwcHAwcHBwYGBgYDBgYGBgoNEAYGBwcNCgoGDQoKBgQKBgMKFRINDQ0GBwMDBgYHAwYGAw4KDQYKBgcHBgYHBwYKBg0SDQoHAwoGBgoGBgYHCgoHCgcHAwMNDQoHBgoLBgoGAwsDCwcOCgcEBgcGCg0NDQYGCgMDAwMDAwMDBgoNDQYDEgMGBgoEEgoGBgYGBwoKCwsKBwcHBgYtBgMHAwMGBwcGBgYKBgYGBgYGCgYNEgMEBgYDBw0SBgsGBwMLDg4HEAMDAwMDAwoGJQYKEAMLDQcHBw0GBgYGDQsGBhAGCgMNAwYQBAYGBwYGAwoGAworBgYGBgYGBgYREAoDBwYGBwYKBgYSEgoNCgMKBQcQAysKCwsGDQoKBg0NBgMGCgMGChAdBgMQDQYKCgYGLwcHBgQGCgYDCgYGDQoHBgcDAw0KCgYHCgYHBwcDBgQIBwYHBwcmBgcHBwMGAwYGHAoHAz0KCgMNDQYGBgcGDQoGDgMDCgYOFAcKBwYLBgYGBgoHCgoKBgcGCgMHBQcmBAMHBAoGBgYDBgYGBgYGCgoGDRsGDgcHBgYHEAoQEBAQChAQEAoQEBANEBAKEAoKBxQDDQoKBgMDAwMDAwMGAwMDAwMDAwMHBiwDAwcHDQYHBxIGCkEDDQYGBgYKBgcHAwQGChgNCwYNBgMLAwoEAxILCwcEBgMSBw0UBgYGBgQGBgoKBgYHAwYDBgYGBgYGBgYGBgYGBAMKBgMGBwcGAwYDAw0KChUQBgcGBwcDBAcHBwcHBgMGBDYGAw0DBhEKBgMKAwMDEQYGBgYSAwMGCwQKBgYGBwoKBw0HBAcKBwYDBgYDBxAHBwYDBwMDAwcDBgMSBhIDEgYGDQQNCwsGBgYDDQ0GBAYQCgQDAwMDBgMGAwMDBgoKCgoKCgYKBhAGBgYGBgcLAwQHBwkGBwcGBgYGBgYGBgQGBwQHBwYHAwMDBwcHBwcHBwcHBwcHBwcHBwMDBAcHBwcDAwMDAwMDAwMDDg4NBg0OBAYQDQYGCgoGCksKBwoSBgYGBgYKFBAGBg0GBg0NBwYKBgoGBgYDBAcHBwMGCgMDAwoNAwoEBwYGBisGBgkHBwcHBwcHBwcHBy0GBhANAwYGBgYGBAMHCgcEBkxMTBAHBwcHCgYEEg0GBwcHBwcHAwcHAwcHBwcHBwcHBwcHBwcHBwcHEgcHBwcHBwcHBwcHBwMDBwYGBgYGBgoGBgYGCgYODQMGBgYDCwtMTEwSBC0GBAYNBwYDBgMDAwcHAwYHAwMDBwMDAwMDAwMDAwYHBgYHBhIGBgYGAwotAwoGCg0KCgMDBhIHBgQHEisDDSQGEAcNBwYHBwcKBwcDBgYDAwMHBwYGBxAPBgYHBwcHAwcLCwsLAwcDAwcDBgMDAwMDBAYKDwYKCgoNBgcLBgYGBxQHBhAKBAMGDQMDBAcKBgMHBgMDAwMDAwMDBAYNBAUEEgcHAwMDBwcrCg4DBgYKBgYGBgYGBgYGBgoGAwYLNBALCwsGAwcGBwMHAwYGBgYFBgYGBgYLDQoKBgYKBBAHDgMGCgYEBgMKCgoKCgMDDgMDAwckBAMKJA4EJAoKBCQSBgsKCgsHBAMHBgMHBhAGEBAQBAYGBwYHBgcNEgMDCgMGAwMDBgYGCgQQBAYGDQoKEAQKBgYGBwcGBAYKCgQDAwYGBgYDBgYGBg0NDQoGCwYGBgYGCgoGEgcHAwYDBgYKBAoGCgoDAwMDAwMDAwMDAwMGAwoHBhIKBg4GBgQGA0IGBwcHBwYtBwcHBgcGBgYGBgYGBgYGBgYGBgYKBgYKEBAQBgsKCkZGDQMDAwMHBwcHBwcHBwcHBwcHAwcDBwcHAwMHAwcHBwcHBwcDBwMDAwMDAwMDAwMDAwMDAwMKCgoGDQYHBwMKDQ0EDQoKCgYrCgoKCg0KCgMLBgQOBhIHEg4QAwcKCwQLQgYHBwcHBwMEBwsLCwsHBwcHQgcHAwYGCgMGBgcGCwMLAwcGBwYGBgYHAw4GBwcHBwMEBxAHAwMDBwMGBg0GBgMDAwYLAwcEAwQHBwcHBwcHBwcHBwcDCgYGBAYGMzMDDQoGBgYHDQcHDQoDAwMGDQQEBwcHBwYGBwcHBwYGBg0KBwoHBwcGChILDQcHAwYHBwcHBwcHBwcHBwcHBwcHBwcHAwcHBwcHBwcHBwQGBwMHBwcHBwcHBwcDBwcDBwcDBwcHBwcHBwcHBwcDBwcHAwcDBwMDAwYDAwMGBwYGBAcKBwcKAwoKBwcHCgcGCgMHAwoHBAYDBAYGAwcGCgYGCgcDCgcKBxADBwcLBw0GCgoGCgYGBgoHBwcHBwcEBgYHBwcHBwYGBgYKBg0GCgoHBwcHAwcHBwcHBwYHBwoKAwMHBwcHBwcHCgcGBwcHBwcHBwoEDgcOCgYGCg0GBwsHBAYNCgoGBwoKPQYHBwcHAwc9Bz0GBwcHBwcHPQc9PT0HAz09PQM9PT09PT09PQoKBgoKEAMHChAQChAEAwcDAwMDAwcHBwcHBwYGBxADAwcHBwcHBwcHBwcHBwcHBwMGBwcHBgYGBgcHBwcHBwcDBwcDBwcDBwMDBgYGBgYGBgMDAwMDBgMQEAYQBBAGChAQEAoHCgoQCgcHBgYGBwcQEBADPQYGBgYGCgoHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcQBwcHBwcHBwsLCwsHPQcHBwcHBwcHBwcHBwcGBwcHBwcDBwcHBwcHBwcHBwcHBwYHBwcHBwcHBwcHBwcDBwcHAwYQAxAHDRANCgQGChAQCgoDDQcKBwEEAwYSEAMHBAcGAwMDAwYDBgoHBwMGBgMDAwMHBwQGCgMQBwcDBwsHBgYGBgYGBwYGBgZJBgYGBgYGBgYGBgYGBgAKBgYGBgYGBgYGBgYLAwoGAwEDBgoGBxAOBgYLCgoGBgMGBgMEAxAHCwMDCgYKBg0NAwYGCgMhCgYDAyEDAz0DAwMDBgYDAwMDAwMDBAYhCgMKAwYDCgMHBwoGBwoHBgMGBgYGBgcDBgYEBwYDAwcSAwMHBwcEBwcGBwcGBgoGBgMDBwYGBgYDBgoDBwYNBgYGBgYDAwMGAwMGAwMGAwMDBgMDAwMDBwcHAwYGAwcHAwoKBgMDBgMDAwMGAwMHBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcDBwcHBwcHBwcHBwcHBwcHBwcDBwcHBwcGBgMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDAwHBwcHBwYGBgMGBgMHAwMKEAMDAwYQBgMDEhALBgMGBgYQAwMDBBABAwYGAwYDAwMQAwMDAwYDBgYGAwMDBgYDBgMDAwMGAwYDBgYDBgYDAwMGAwMGBgYEBgMDAwMDBwcHBwcHBwcHCg0GBwcHBwcHBwcMBwMHAwMHEgcGAwMHBwYGAwYDBwMDAwMDAwcHAwMGBgYGBwYHBwYGBgYHAw0KChIGCAYDBwoDBAcGBgQDBgMDBgQDAwoKBgYDCkdHA0AGPwYNBwMKCgoKCgoKCgMKCgYHCgcKBgcKChINBgoNDQ0KCgcHRBIEAwMLCgoLCwYGCgoKCgYDBgMGBwcUBgYNOgsHDgYKCgsKNgMDAzotAwMDAwMGBgYGBgYGAwoGBgoDAwoDAwMKAwMHBwQGCgYGEAcKCgMDBwgHAwQHCgoKCgcCAgICAg4EAwcHAgICAgICAgICAgICAgICAgYGBgYGBgYGBgYGBgYGBgYGAwICAwICAgYGBgYGBgYGAgYGBgQGBgYGBAYGBgMHMjIGCgcKBwcHBAcNEQ4KBwYGBgcHBwcHBgYEDQoHB0MCPAoHAgICAgICAgICAgICAgICAgIHBwcHBwcHBwcCAgIHBwcHBwYHBwcHBwcGAwYGBgYGBgYGBgYGBg4HEBAHEAoIBwcKBgMGDQYKAwoGBgoOAwYHBwcHBwcHBwcHDQcHBw0HBwcGBgQGBwoNBgcMOjoHOgcHBgcHBjoHBAoGCjoGMQEGOgYGAwYLBwADAw0DAAAAAAQAAAQHBwcHBwcHBwsHBwcHBwcHBwoKBgALCwcHAwMDAwMDAwcGAwMDBwZMAwMDAwMEBQoKBgYEBAQEBAQEBAYGBgMOBwcHEBAQDRANBwcEAwMGBwsHBxAQDRAQEAgKEAMDBwcHBwcHBwcHBwcHBAcEDgcHBgMHDgQEBhAQEAcOAwcHBwYGBgYDAwMDAwMDAwMDAwMDBgYGQAMDLQQLDQoDAwMNCgcKCwoGBgYGAwMKAxADCwMDBgYGCgYEBgYGDQQGAwMGBgYGCgMECgcHBgMGAwoKMQoGAwYGEAsDEBADAwMHDgcQEAQEBA0DCwYGQAQGAwMNBAMDAwMDAwMDBgYDCgoHAwcHBgoGBAcHBwcHAwMjBw0DBwYHEAMHBwcHJQsLCwYGBgYDBwYHBwcDAw0GBgYGBwcHAwMGBw0NBwcODQYDAwYDBAMNCwYDAwMDAwMDBxAKBA0DBwcKCgYDCgoDAwMHAwMDBwYGBAcEAxANPj4DAw0GBwcHBwcEBAMHBgYGBgYDBw0GBgYMBgcKBgYHAwYSEAYHBhAGBgMDAwYGBgQGAwYDBgYNBgYGBgcDBgYGBgYGBgMLBgYMAwYGAwMDAwYDAwMDAwYGBgYDAwcIBgYGAw4ODg4DDgsQDgQKBxMODgcDKwMODg4HBA4DBgYGBgMDDgYDBwYOAw0KCgMEDg4QERAQKSonEQsDAwQKBwcGBgYKCg0NDQwLBgMDAwMDBwMMAwYHBgYGAQEDAwcDAwoKBgYGCgoGBgMDCgQDDQ0DBgYKCgEBBw4OBzINBwYDBwQKAQYMDAcEPT0DPT0DBgYGBgYGBgQLCgYDAwMDCgMDBwYEAwMGBwYECgoDBg0GBwsGCgsKCgMHBAQHCgUDAwMDAwMDBgYGAw0DBgcQBwMEBAMDAwMDAwQDBgMDAwYDAwoKAwMHBwMEBwMHBwQHBzsHBwcDAwMDAwMDAwMDAwMDDQ0DBgoKBgoDBgMDAwMDAwMDBgYGCgYDAwMDAwMGBgYGBwMDAwMDBAMDBAMEBgcEBAMDAQMEAwoKAwoHAQQBAQEBAQEBAQEBAQEBAQEHBgMDAwMDAwMDAwMDAwMDAwMGAwYGAwYGAwMDAwMDBgYGBgYDBgYGBgYGAQMDAwMDAwMKCgYDAwMDBgwDAwMDAwYDAwYDAwYGAwMDAwMHBwcHBwcGAwcDAwMDAwcHBwsLBwcMPT09DQcBEAMDAwMDBgYGBgYGAwYGAwMDBgMGCwMDAwMHCgcGAwMKDgsGDQcKBwcHBwcHBwMDBwMDBgoDAwMHBwcHBwcDBwYxBwcHBwcGCgcHBwsLBwMDAwYDBgMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHAwMDAwMDAwMBAQMDBwMDAwMDAwMGCwsLCwMDBwcHAwcHAwMDAwMDAwMDAwcDAwMDAwMDAwMDBwYHAwMHAwMHAwMKEgYLCwcHCgMDAwoHCgYGBgMDAwMDAwMDAwMDAQcDAwYGCgYDAwYGBgYDBwYGBgYGBgMDAwcDAwoDAwsDCwQEBAQHEAMDBwMBCwcEBAQDDgMDAwsLDQMDAwMDOgMDAwMDAwM6AwMDAwMDAwMDAwMDAwMDAwMDAwMDBgYDAwMLCwMDCg0DAwMDAwMDAwMDAwoEAwMDAwYGAwMDAwMDAwMDBgMDAwMDAwMDAwMDAwMDAwMGCgMKBwcGBgcHBwcHBwMGBgYNDQ0NDQ0NCwcHBwYDBwcHAwcKAwMKBwYHBwoKBwMDAwMDAwMDAwMDAwMDAwoGBwcEBwcGBgcDBAMDAwcDBwoDAwoKCgMDBwcDAwMDAwYDAwMKAwMDBgYGBgYGBgYGBgYGAwMDBwYDAwMDAwYGBgYDBgcEBwYGBgYGBgYLBgoKCgYGCwcGBgYHBgYHAwQKBgYGBgYGBgMDBgYGBgYGBgYGAwMGBAYGBwcGBgMLAw4OAwQDBgYGDgYGBgYGBgYGBgYGBgYGAwsDBwMGBgYDAwMDDQ0GBgYDAwYGBgYHBgYGAwYGBgADCwMKAAQGCgoKBgYGAwMDCgMDAwMGCgMDBAQEBAoHCgsKBwcHBwcHBwcEBgMDCgMNCwcEBwcHBwcEBAQEBAQHBwcEBwcHAwMDAwMDBwcHBwcHCgYHBwYH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QQEhCiAFQQFHDQIgARCeEQwCCyAELwDtCiAEQe8Kai0AAEEQdHIhGyAELwDdCiAEQd8Kai0AAEEQdHIhHCAELwDNCiAEQc8Kai0AAEEQdHIhHSAELwC9CiAEQb8Kai0AAEEQdHIhHiAELwCtCiAEQa8Kai0AAEEQdHIhHyAELwCdCiAEQZ8Kai0AAEEQdHIhICAELwCNCiAEQY8Kai0AAEEQdHIhISAELwD9CSAEQf8Jai0AAEEQdHIhIiAELwDtCSAEQe8Jai0AAEEQdHIhIyAELwDdCSAEQd8Jai0AAEEQdHIhJCAELwDNCSAEQc8Jai0AAEEQdHIhJSAELwC9CSAEQb8Jai0AAEEQdHIhJiAELwCtCSAEQa8Jai0AAEEQdHIhJyAELwCdCSAEQZ8Jai0AAEEQdHIhKCAELwCNCSAEQY8Jai0AAEEQdHIhKSAELwD9CCAEQf8Iai0AAEEQdHIhKiAELwDtCCAEQe8Iai0AAEEQdHIhKyAELwDdCCAEQd8Iai0AAEEQdHIhLCAELwDNCCAEQc8Iai0AAEEQdHIhLSAELwC9CCAEQb8Iai0AAEEQdHIhLiAELwCtCCAEQa8Iai0AAEEQdHIhLyAELwCdCCAEQZ8Iai0AAEEQdHIhMCAELwCNCCAEQY8Iai0AAEEQdHIhMSAELwD9ByAEQf8Hai0AAEEQdHIhMiAELwDtByAEQe8Hai0AAEEQdHIhMyAELwDdByAEQd8Hai0AAEEQdHIhNCAELwDNByAEQc8Hai0AAEEQdHIhNSAELwC9ByAEQb8Hai0AAEEQdHIhNiAELwCtByAEQa8Hai0AAEEQdHIhNyAELwCdByAEQZ8Hai0AAEEQdHIhOCAELwCNByAEQY8Hai0AAEEQdHIhOSAELwD9BiAEQf8Gai0AAEEQdHIhOiAELwDtBiAEQe8Gai0AAEEQdHIhOyAELwDdBiAEQd8Gai0AAEEQdHIhPCAELwDNBiAEQc8Gai0AAEEQdHIhPSAELwC9BiAEQb8Gai0AAEEQdHIhPiAELwCtBiAEQa8Gai0AAEEQdHIhPyAELwCdBiAEQZ8Gai0AAEEQdHIhQCAELwCNBiAEQY8Gai0AAEEQdHIhQSAELwD9BSAEQf8Fai0AAEEQdHIhQiAELwDtBSAEQe8Fai0AAEEQdHIhQyAELwDdBSAEQd8Fai0AAEEQdHIhRCAELwDNBSAEQc8Fai0AAEEQdHIhRSAELwC9BSAEQb8Fai0AAEEQdHIhRiAELwCtBSAEQa8Fai0AAEEQdHIhRyAELwCdBSAEQZ8Fai0AAEEQdHIhSCAELwCNBSAEQY8Fai0AAEEQdHIhSSAELwD9BCAEQf8Eai0AAEEQdHIhSiAELwDtBCAEQe8Eai0AAEEQdHIhSyAELwDdBCAEQd8Eai0AAEEQdHIhTCAELwDNBCAEQc8Eai0AAEEQdHIhTSAELwC9BCAEQb8Eai0AAEEQdHIhTiAELwCtBCAEQa8Eai0AAEEQdHIhTyAELwCdBCAEQZ8Eai0AAEEQdHIhUCAELwCNBCAEQY8Eai0AAEEQdHIhUSAELwD9AyAEQf8Dai0AAEEQdHIhUiAELwDtAyAEQe8Dai0AAEEQdHIhUyAELwDdAyAEQd8Dai0AAEEQdHIhVCAELwDNAyAEQc8Dai0AAEEQdHIhVSAELwC9AyAEQb8Dai0AAEEQdHIhViAELwCtAyAEQa8Dai0AAEEQdHIhVyAELwCdAyAEQZ8Dai0AAEEQdHIhWCAELwCNAyAEQY8Dai0AAEEQdHIhWSAELwD9AiAEQf8Cai0AAEEQdHIhWiAELwDtAiAEQe8Cai0AAEEQdHIhWyAELwDdAiAEQd8Cai0AAEEQdHIhXCAELwDNAiAEQc8Cai0AAEEQdHIhXSAELwC9AiAEQb8Cai0AAEEQdHIhXiAELwCtAiAEQa8Cai0AAEEQdHIhXyAELwCdAiAEQZ8Cai0AAEEQdHIhYCAELwCNAiAEQY8Cai0AAEEQdHIhYSAELwD9ASAEQf8Bai0AAEEQdHIhYiAELwDtASAEQe8Bai0AAEEQdHIhYyAELwDdASAEQd8Bai0AAEEQdHIhZCAELwDNASAEQc8Bai0AAEEQdHIhZSAELwC9ASAEQb8Bai0AAEEQdHIhZiAELwCtASAEQa8Bai0AAEEQdHIhGSAELwCdASAEQZ8Bai0AAEEQdHIhBiAELwCNASAEQY8Bai0AAEEQdHIhCCAEQfwAajUCACGWBCAEQewAajUCACGaBCAEKQJ0IZcEIAQpAmQhlQQgBC0A7AohZyAEKALoCiFoIAQoAuQKIWkgBCgC4AohaiAELQDcCiFrIAQoAtgKIWwgBCgC1AohbSAEKALQCiFuIAQtAMwKIW8gBCgCyAohcCAEKALECiFxIAQoAsAKIXIgBC0AvAohcyAEKAK4CiF0IAQoArQKIXUgBCgCsAohdiAELQCsCiF3IAQoAqgKIXggBCgCpAoheSAEKAKgCiF6IAQtAJwKIXsgBCgCmAohfCAEKAKUCiF9IAQoApAKIX4gBC0AjAohfyAEKAKICiGAASAEKAKECiGBASAEKAKACiGCASAELQD8CSGDASAEKAL4CSGEASAEKAL0CSGFASAEKALwCSGGASAELQDsCSGHASAEKALoCSGIASAEKALkCSGJASAEKALgCSGKASAELQDcCSGLASAEKALYCSGMASAEKALUCSGNASAEKALQCSGOASAELQDMCSGPASAEKALICSGQASAEKALECSGRASAEKALACSGSASAELQC8CSGTASAEKAK4CSGUASAEKAK0CSGVASAEKAKwCSGWASAELQCsCSGXASAEKAKoCSGYASAEKAKkCSGZASAEKAKgCSGaASAELQCcCSGbASAEKAKYCSGcASAEKAKUCSGdASAEKAKQCSGeASAELQCMCSGfASAEKAKICSGgASAEKAKECSGhASAEKAKACSGiASAELQD8CCGjASAEKAL4CCGkASAEKAL0CCGlASAEKALwCCGmASAELQDsCCGnASAEKALoCCGoASAEKALkCCGpASAEKALgCCGqASAELQDcCCGrASAEKALYCCGsASAEKALUCCGtASAEKALQCCGuASAELQDMCCGvASAEKALICCGwASAEKALECCGxASAEKALACCGyASAELQC8CCGzASAEKAK4CCG0ASAEKAK0CCG1ASAEKAKwCCG2ASAELQCsCCG3ASAEKAKoCCG4ASAEKAKkCCG5ASAEKAKgCCG6ASAELQCcCCG7ASAEKAKYCCG8ASAEKAKUCCG9ASAEKAKQCCG+ASAELQCMCCG/ASAEKAKICCHAASAEKAKECCHBASAEKAKACCHCASAELQD8ByHDASAEKAL4ByHEASAEKAL0ByHFASAEKALwByHGASAELQDsByHHASAEKALoByHIASAEKALkByHJASAEKALgByHKASAELQDcByHLASAEKALYByHMASAEKALUByHNASAEKALQByHOASAELQDMByHPASAEKALIByHQASAEKALEByHRASAEKALAByHSASAELQC8ByHTASAEKAK4ByHUASAEKAK0ByHVASAEKAKwByHW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ASEFIJIEDQAMBQsLQQAtAKDxngEaQRBBwA0QugciBUUNCCAFIJsDOwCtDSAFIJwDOwCdDSAFIJ0DOwCNDSAFIJ4DOwD9DCAFIJ8DOwDtDCAFIKADOwDdDCAFIKEDOwDNDCAFIKIDOwC9DCAFIKMDOwCtDCAFIKQDOwCdDCAFIKUDOwCNDCAFIKYDOwD9CyAFIKcDOwDtCyAFIKgDOwDdCyAFIKkDOwDNCyAFIKoDOwC9CyAFIKsDOwCtCyAFIKwDOwCdCyAFIK0DOwCNCyAFIK4DOwD9CiAFIK8DOwDtCiAFIJkDOwDdCiAFIJoDOwDNCiAFIBs7AK0KIAUgHDsAnQogBSAdOwCNCiAFIB47AP0JIAUgHzsA7QkgBSAgOwDdCSAFICE7AM0JIAUgIjsAvQkgBSAjOwCtCSAFICQ7AJ0JIAUgJTsAjQkgBSAmOwD9CCAFICc7AO0IIAUgKDsA3QggBSApOwDNCCAFICo7AL0IIAUgKzsArQggBSAsOwCdCCAFIC07AI0IIAUgLjsA/QcgBSAvOwDtByAFIDA7AN0HIAUgMTsAzQcgBSAyOwC9ByAFIDM7AK0HIAUgNDsAnQcgBSA1OwCNByAFIDY7AP0GIAUgNzsA7QYgBSA4OwDdBiAFIDk7AM0GIAUgOjsAvQYgBSA7OwCtBiAFIDw7AJ0GIAUgPTsAjQYgBSA+OwD9BSAFID87AO0FIAUgQDsA3QUgBSBBOwDNBSAFIEI7AL0FIAUgQzsArQUgBSBEOwCdBSAFIEU7AI0FIAUgRjsA/QQgBSBHOwDtBCAFIEg7AN0EIAUgSTsAzQQgBSBKOwC9BCAFIEs7AK0EIAUgTDsAnQQgBSBNOwCNBCAFIE47AP0DIAUgTzsA7QMgBSBQOwDdAyAFIFE7AM0DIAUgUjsAvQMgBSBTOwCtAyAFIFQ7AJ0DIAUgVTsAjQMgBSBWOwD9AiAFIFc7AO0CIAUgWDsA3QIgBSBZOwDNAiAFIFo7AL0CIAUgWzsArQIgBSBcOwCdAiAFIF07AI0CIAUgXjsA/QEgBSBfOwDtASAFIGA7AN0BIAUgYTsAzQEgBSBiOwC9ASAFIGM7AK0BIAUgZDsAnQEgBSBlOwCNASAFIGY7AH0gBSAZOwBtIAUgBjsAXSAFIJcENwI0IAUglQQ3AiQgBSCZBDcDECAFQQA6ALwNIAUgGjYC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INABNgKIByAFINEBNgKEByAFINIBNgKAByAFINMBOgD8BiAFINQBNgL4BiAFINUBNgL0BiAFINYBNgLwBiAFINcBOgDsBiAFINgBNgLoBiAFINkBNgLkBiAFINoBNgLgBiAFINsBOgDcBiAFINwBNgLYBiAFIN0BNgLUBiAFIN4BNgLQBiAFIN8BOgDMBiAFIOABNgLIBiAFIOEBNgLEBiAFIOIBNgLABiAFIOMBOgC8BiAFIOQBNgK4BiAFIOUBNgK0BiAFIOYBNgKwBiAFIOcBOgCsBiAFIOgBNgKoBiAFIOkBNgKkBiAFIOoBNgKgBiAFIOsBOgCcBiAFIOwBNgKYBiAFIO0BNgKUBiAFIO4BNgKQBiAFIO8BOgCMBiAFIPABNgKIBiAFIPEBNgKEBiAFIPIBNgKABiAFIPMBOgD8BSAFIPQBNgL4BSAFIPUBNgL0BSAFIPYBNgLwBSAFIPcBOgDsBSAFIPgBNgLoBSAFIPkBNgLkBSAFIPoBNgLgBSAFIPsBOgDcBSAFIPwBNgLYBSAFIP0BNgLUBSAFIP4BNgLQBSAFIP8BOgDMBSAFIIACNgLIBSAFIIECNgLEBSAFIIICNgLABSAFIIMCOgC8BSAFIIQCNgK4BSAFIIUCNgK0BSAFIIYCNgKwBSAFIIcCOgCsBSAFIIgCNgKoBSAFIIkCNgKkBSAFIIoCNgKgBSAFIIsCOgCcBSAFIIwCNgKYBSAFII0CNgKUBSAFII4CNgKQBSAFII8COgCMBSAFIJACNgKIBSAFIJECNgKEBSAFIJICNgKABSAFIJMCOgD8BCAFIJQCNgL4BCAFIJUCNgL0BCAFIJYCNgLwBCAFIJcCOgDsBCAFIJgCNgLoBCAFIJkCNgLkBCAFIJoCNgLgBCAFIJsCOgDcBCAFIJwCNgLYBCAFIJ0CNgLUBCAFIJ4CNgLQBCAFIJ8COgDMBCAFIKACNgLIBCAFIKECNgLEBCAFIKICNgLABCAFIKMCOgC8BCAFIKQCNgK4BCAFIKUCNgK0BCAFIKYCNgKwBCAFIKcCOgCsBCAFIKgCNgKoBCAFIKkCNgKkBCAFIKoCNgKgBCAFIKsCOgCcBCAFIKwCNgKYBCAFIK0CNgKUBCAFIK4CNgKQBCAFIK8COgCMBCAFILACNgKIBCAFILECNgKEBCAFILICNgKABCAFILMCOgD8AyAFILQCNgL4AyAFILUCNgL0AyAFILYCNgLwAyAFILcCOgDsAyAFILgCNgLoAyAFILkCNgLkAyAFILoCNgLgAyAFILsCOgDcAyAFILwCNgLYAyAFIL0CNgLUAyAFIL4CNgLQAyAFIL8COgDMAyAFIMACNgLIAyAFIMECNgLEAyAFIMICNgLAAyAFIMMCOgC8AyAFIMQCNgK4AyAFIMUCNgK0AyAFIMYCNgKwAyAFIMcCOgCsAyAFIMgCNgKoAyAFIMkCNgKkAyAFIMoCNgKgAyAFIMsCOgCcAyAFIMwCNgKYAyAFIM0CNgKUAyAFIM4CNgKQAyAFIM8COgCMAyAFINACNgKIAyAFINECNgKEAyAFINICNgKAAyAFINMCOgD8AiAFINQCNgL4AiAFINUCNgL0AiAFINYCNgLwAiAFINcCOgDsAiAFINgCNgLoAiAFINkCNgLkAiAFINoCNgLgAiAFINsCOgDcAiAFINwCNgLYAiAFIN0CNgLUAiAFIN4CNgLQAiAFIN8COgDMAiAFIOACNgLIAiAFIOECNgLEAiAFIOICNgLAAiAFIOMCOgC8AiAFIOQCNgK4AiAFIOUCNgK0AiAFIOYCNgKwAiAFIOcCOgCsAiAFIOgCNgKoAiAFIOkCNgKkAiAFIOoCNgKgAiAFIOsCOgCcAiAFIOwCNgKYAiAFIO0CNgKUAiAFIO4CNgKQAiAFIO8COgCMAiAFIPACNgKIAiAFIPECNgKEAiAFIPICNgKAAiAFIPMCOgD8ASAFIPQCNgL4ASAFIPUCNgL0ASAFIPYCNgLwASAFIPcCOgDsASAFIPgCNgLoASAFIPkCNgLkASAFIPoCNgLgASAFIPsCOgDcASAFIPwCNgLYASAFIP0CNgLUASAFIP4CNgLQASAFIP8COgDMASAFIIADNgLIASAFIIEDNgLEASAFIIIDNgLAASAFIIMDOgC8ASAFIIQDNgK4ASAFIIUDNgK0ASAFIIYDNgKwASAFIIcDOgCsASAFIIgDNgKoASAFIIkDNgKkASAFIIoDNgKgASAFIIsDOgCcASAFIIwDNgKYASAFII0DNgKUASAFII4DNgKQASAFII8DOgCMASAFIJADNgKIASAFIJEDNgKEASAFIJIDNgKAASAFIJMDOgB8IAUglAM2AnggBSCVAzYCdCAFIJYDNgJwIAUglwM6AGwgBSCYAzYC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NwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAApFDQAgAyABQbDcmgFBECACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQALRQ0AIAMgAUHA3JoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ADEUNACADIAFB09yaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAA1FDQAgAyABQercmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAORQ0AIAMgAUH53JoBQRggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AD0UNACADIAFBkd2aAUEOIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABBFDQAgAyABQZ/dmgFBEiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQARRQ0AIAMgAUGx3ZoBQRUgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AEkUNACADIAFBxt2aAUELIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABNFDQAgAyABQdHdmgFBCiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAURQ0AIAMgAUHb3ZoBQRsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AFUUNACADIAFB9t2aAUEiIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABZFDQAgAyABQZjemgFBGiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAXRQ0AIAMgAUGy3poBQRogAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AGEUNACADIAFBzN6aAUEdIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABlFDQAgAyABQenemgFBECACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAaRQ0AIAMgAUH53poBQSsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AG0UNACADIAFBpN+aAUEeIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABxFDQAgAyABQcLfmgFBFCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAdRQ0AIAMgAUHW35oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AHkUNACADIAFB7d+aAUEYIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAB9FDQAgAyABQYXgmgFBHiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAgRQ0AIAMgAUGj4JoBQR0gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AIUUNACADIAFBwOCaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACJFDQAgAyABQdfgmgFBGiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAjRQ0AIAMgAUHx4JoBQRggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJEUNACADIAFBieGaAUEZIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACVFDQAgAyABQaLhmgFBGCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAmRQ0AIAMgAUG64ZoBQSMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJ0UNACADIAFB3eGaAUEjIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAChFDQAgAyABQYDimgFBISACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQApRQ0AIAMgAUGh4poBQQkgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AKkUNACADIAFBquKaAUEMIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACtFDQAgAyABQbbimgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAsRQ0AIAMgAUG+4poBQQggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ALUUNACADIAFBxuKaAUEcIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAC5FDQAgAyABQeLimgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAvRQ0AIAMgAUHx4poBQQsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AMEUNACADIAFBvPObAUEHIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADFFDQAgAyABQaC6nAFBAyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAyRQ0AIAMgAUH84poBQRAgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AM0UNACADIAFBjOOaAUEIIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADRFDQAgAyABQZTjmgFBDiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA1RQ0AIAMgAUGi45oBQRsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ANkUNACADIAFBveOaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADdFDQAgAyABQZ6WnAFBCiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA4RQ0AIAMgAUHX45oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AOUUNACADIAFB7uOaAUEYIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADpFDQAgAyABQYbkmgFBEiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA7RQ0AIAMgAUGY5JoBQREgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0APEUNACADIAFBqeSaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAD1FDQAgAyABQcDkmgFBHSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA+RQ0AIAMgAUHd5JoBQQMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AP0UNACADIAFB4OSaAUEPIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEBFDQAgAyABQe/kmgFBESACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBBRQ0AIAMgAUGA5ZoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQkUNACADIAFBk+WaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAENFDQAgAyABQa3lmgFBDSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBERQ0AIAMgAUG65ZoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ARUUNACADIAFBzeWaAUEZIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEZFDQAgAyABQeblmgFBHyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBHRQ0AIAMgAUGF5poBQQ4gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ASEUNACADIAFBk+aaAUEbIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAElFDQAgAyABQa7mmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBKRQ0AIAMgAUGjupwBQQMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AS0UNACADIAFBveaaAUEQIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAExFDQAgAyABQc3mmgFBGSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBNRQ0AIAMgAUHm5poBQQ8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ATkUNACADIAFB9eaaAUEVIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAE9FDQAgAyABQYrnmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBQRQ0AIAMgAUGZ55oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AUUUNACADIAFBsOeaAUEdIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFJFDQAgAyABQdSCnAFBBSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBTRQ0AIAMgAUHN55oBQQggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AVEUNACADIAFB1eeaAUETIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFVFDQAgAyABQejnmgFBDCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBWRQ0AIAMgAUH055oBQQ8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AV0UNACADIAFB0/6aAUEGIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFhFDQAgAyABQYPomgFBByACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBZRQ0AIAMgAUGK6JoBQR0gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AWkUNACADIAFBp+iaAUEUIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFtFDQAgAyABQbvomgFBESACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBcRQ0AIAMgAUHM6JoBQRAgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AXUUNACADIAFB3OiaAUEfIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAF5FDQAgAyABQfvomgFBJiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBfRQ0AIAMgAUGh6ZoBQR8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AYEUNACADIAFBwOmaAUEhIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGFFDQAgAyABQeHpmgFBGyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBiRQ0AIAMgAUH86ZoBQQwgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AY0UNACADIAFBiOqaAUEjIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGRFDQAgAyABQavqmgFBCyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBlRQ0AIAMgAUG26poBQQwgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZkUNACADIAFBwuqaAUELIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGdFDQAgAyABQc3qmgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBoRQ0AIAMgAUHV6poBQQkgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AaUUNACADIAFB3uqaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGpFDQAgAyABQfjqmgFBFCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBrRQ0AIAMgAUGM65oBQSQgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AbEUNACADIAFBsOuaAUERIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAG1FDQAgAyABQcHrmgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBuRQ0AIAMgAUHJ65oBQQcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0Ab0UNACADIAFBqZ2cAUEFIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAHBFDQAgAyABQdDrmgFBCSACKAIAENcFAkAgACgCCCIEIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIARBMGxqIgEgAykDADcDACABQShqIANBKGopAwA3AwAgAUEgaiADQSBqKQMANwMAIAFBGGogA0EYaikDADcDACABQRBqIANBEGopAwA3AwAgAUEIaiADQQhqKQMANwMAIAAgBEEBajYCCAsgAiACKAIEQX9qNgIEIANBMGokAAv+iAECaH8IfiMAQcAHayIDJAAgAUEIaiEEIANB4AFqQR1qIQUgA0GwBGpBCGohBiADQbAFakEMaiEHIANBsARqQQRyIQggA0HVBGohCSADQbAFakEVaiEKIANBsARqQRRqIQsgA0GwBWpBBHIhDCADQaECaiENIANB4AFqQSBqIQ4gA0GwBGpBFWohDyADQbABakEVaiEQIANBsAFqQQRyIREgA0HoBmpBFWohEiADQegGakEEciETIANBsAZqQRVqIRQgA0GwBmpBBHIhFSADQYAGakEVaiEWIANBgAZqQQRyIRcgA0GwBGpBEGohGCADQbAEakEMaiEZIANBqQJqIRogA0GdAmohGyADQYwCaiEcIANB4AFqQQxqIR0gA0HgAWpBFWohHiADQeABakEEciEfIANBoAdqQQRyISAgA0HgAWpBFGohISADQegGakEMaiEiIANBsAVqQR1qISMgA0HgAWpBCGohJCADQegGakEIaiElIANBsAFqQR1qISYgA0GwAWpBCGohJyADQYQBakEEaiEoIAAoAgAhKQJAAkADQAJAAkAgKSgCACIqRQ0AIAMgKjYC6AYCQCABLQDgASIAQaMBRw0AIANBsAVqIAEQ1CYgASgC3AEhACABKALYASECIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2ArQBIAMgA0GwAWo2AugBIAMgA0HoBmo2ArABIANBsARqIANB4AFqEP0aIANBxARqIANBuAVqKAIANgIAIAMgAykCsAU3ArwEIAEgAiAAIANBsARqEN4jDAQLIAAgKi0AAEcNAQwDCyABLQDgASIAQaMBRg0CCyADQQE6AH8gAyABKALYATYCgAECQAJAIABBGEYNAEEEISpBACErQQAhLAwBCyADQeABaiABQQEQ9wEgAygC5AEhKiADKALgASIsQYCAgIB4Rg0DIAMoAugBISsgAS0A4AEhAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQf8BcSIAQdgARiItDQAgAEHfAEcNAQsgAyArNgKQASADICo2AowBIAMgLDYCiAEgAyABNgKEAQJAIAEoAogBIipBgICAgAZxDQAgASgC3AEhACABKALYASEqIANBxoCAgHg2AuABICogACADQeABahDgGiEqDC4LAkACQCAAQd8ARg0AIC0NASADQQE2AuQBIANBoPubATYC4AEgA0IANwLsASADIANBvAdqNgLoASADQeABakGo+5sBEOkjAAsgASgC2AEhLQJAAkACQCABENgJIgBFDQAgAC0AAEEIRg0BCwJAAkAgARDYCSIARQ0AIAAtAABFDQELAkAgASgCiAEiAEECcQ0AIAEgAEEKchCoEgsCQCABLQDgAUHfAEYNACABKALcASEAIAEoAtgBISogA0G8A2ogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgK0ASADQd8AOgCwBiADIANBsAFqNgK4BCADIANB6AZqNgKwASADIANBsAZqNgLoBiADQbAFaiADQbAEahCHGyAHQQhqIANBvANqQQhqKAIANgIAIAcgAykCvAM3AgAgKiAAIANBsAVqEOAaIS4gAS0A4AFBogFHDTEgASABEJosEKcXDDELIAEQoQsCQCABLQDgAUHAAEYNACADQSBqQQRBCEHIAEGk+ZsBELAaIANBADYC0AMgAyADKQMgNwLIAwJAIAEoAogBIAEtAOABIgAQ2g1FDQAgA0GwBGogARCkDSADKAKwBCEuIAMtAMQEIgBBAkYNMCARIAgpAgA3AgAgECAPLwAAOwAAIBFBCGoiLCAIQQhqIispAgA3AgAgEEECaiIvIA9BAmoiMC0AADoAACADIAA6AMQBIAMgLjYCsAFBACExIAEtAJEBQSBxRQ0fIANBsAFqQbKEnAFBBBCEIkUNH0EBITFBACEqIAEtAOABIgBBAkYNICAAQQ9GDSBBACExIAEoAogBIAAQ2g1FDR8CQAJAIABB/gBHDQAgARDYCSIARQ0BIAAtAABB/gBHDQELIANBsARqIAEQpA0gAygCsAQhLiADLQDEBCIAQQJGDSUgA0HYA2pBCGogKykCADcDACADQdQDakECaiAwLQAAOgAAIAMgCCkCADcD2AMgAyAPLwAAOwHUAyADQdQDaiEqIANB2ANqITEMHwsgARDYCSIARQ0fIAAtAABBF0cNHyADQbAFaiABENwOIANBsARqIANBsAVqEPEkIAMoArAEIS4gAy0AxAQiAEECRg0kIANB8ANqQQhqICspAgA3AwAgA0HsA2pBAmogMC0AADoAACADIAgpAgA3A/ADIAMgDy8AADsB7AMgA0HsA2ohKiADQfADaiExDB4LQQAhMEEAITEgAEH/AXFBD0YNJwwpCyADQbAEaiABEP4aQRhBCBCmKiIAQRBqIBgpAwA3AwAgAEEIaiAGKQMANwMAIAAgAykDsAQ3AwBBACErQQAhKgJAIAEtAOEBDQACQCABLQDgASIsQfcARg0AQQAhKiAsQfAARw0BCyABEKELIANBsARqIAEQqyAgAygCtAQhLgJAIAMoArAEIipBMkcNACAAENYnDDILAkBBOEUNACADQbAFaiAGQTj8CgAACyAqQQ5HDQZBFEEEEKYqIiogLjYCACAqIAMpA7AFNwIEICpBDGogA0GwBWpBCGopAwA3AgALIAEQqiAaIAEoAtQBITJBCCEzQQAhNCAtITVBACE2QQAhLkEAISwMLAsgA0EoaiABEP8JIAMoAiwhMSADKAIoQQFxDQEgARCqIBogASgC1AEhNUEJISxBEiEzIDchKyA4ITQgOSEqIDohMiAtIQAgMSE2DCsLIANBMGogARD/CSADKAI0ITEgAygCMEEBcQ0ZIAEQqiAaIAEoAtQBITVBCSEsQRIhMyA3ISsgOCE0IDkhKiA6ITIgLSEAIDEhNgwqCyAxIS4MLQsgA0GgAWpBCGoiLSAoQQhqKAIANgIAIAMgKCkCADcDoAECQCAqQYKAgIACcUGAgICAAkcNACABICpBCnIQqBILIAEoAtgBISogARChCyABLQDgASIAQaMBRg0CIAEvAZABQYDAAHEiLEUNAyAAQfwARw0DIAEoAtgBIQAgARChCyADQbAEaiAoEO0IIANB4AFqIAEgACADQbAEahCODCADKALkASEAAkAgAygC4AEiK0EJRw0AQQkhLCAAITsMFAsgJyAkKQMANwMAICdBGGogJEEYaikDADcDACAnQRBqICRBEGopAwA3AwAgJ0EIaiAkQQhqKQMANwMAIAMgADYCtAEgAyArNgKwAQJAICtBCEYNACADQZoBakECaiAmQQJqLQAAOgAAIAMgAy8BygE7AZ4BIAMgJi8AADsBmgEgAygCvAEiPEEIdiE9IAEoAtQBIT5BASEsIAMpA9ABIWsgAy0AzAEhPyADLQDJASFAIAMtAMgBIUEgAygCxAEhQiADKALAASFDIAMoArgBIUQgKiFFIAAhRiArIUcMBQsgA0GwAWoQuCogAS8BkAFBgMAAcSEsIAEtAOABIQAMAwsgAyArNgK4BCADICo2ArQEIAMgLDYCsAQgASgCiAEhACADIANB/wBqNgLABCADIANBgAFqNgK8BAJAAkAgAEGAgARxRQ0AIAEgAEH//3txNgKIASADQeABaiADQbAEaiABEIITIAEgASgCiAFBgIAEcjYCiAEMAQsgA0HgAWogA0GwBGogARCCEwsCQCADKALgASIAQRNHDQBBCiEsIAMoAuQBISoMLwsgA0HyAGpBAmogBUECai0AADoAACADIAMvAfoBOwF2IAMgBS8AADsBckEJISwgAygCjAIhSCADKAKIAiFJIAMpA4ACIWwgAy0A/AEhSiADLQD5ASFLIAMtAPgBITQgAygC9AEhTCADKALwASEyIAMoAuwBITUgAygC6AEhTSADKALkASE2IAAhMwwuC0GgppwBQShBlPqbARDSHgALQQkhLCABKAKAARDfIyE7DBALAkAgLA0AIAEoAtgBIStBACExDAILAkAgABClFUUNAAJAAkAgAEEAIAQgBCgCAEEJRhsQiAYibUIAUQ0AICUgKBDtCCADIG03A+gGAkAgAS0AkQFBIHENACADQQg2ArAFICUQlCggbRDGIQwCCyABKAKIASErIANBsAJqIAEQ3QEgASABKAKIAUEBchCoEiADQeABaiABIAEoAtgBICUgbUEBEJ0EIAMoAuQBIQACQCADKALgASIsQQlHDQAgAyAANgK0BCADQQk2ArAEIAEgA0GwAmoQxwUgA0EINgKwBSAIEOkHDAILIAYgJCkDADcDACAGQRhqICRBGGopAwA3AwAgBkEQaiAkQRBqKQMANwMAIAZBCGogJEEIaikDADcDACADIAA2ArQEIAMgLDYCsAQCQCAsQQhHDQAgASADQbACahDHBSADQQg2ArAFDAILICtBAXEhAAJAQShFDQAgA0GwBWogA0GwBGpBKPwKAAALIAEgASgCiAFBfnEgAHIQqBIgA0GwAmoQliYgAygCsAUiAEEIRg0BIANBmgFqQQJqICNBAmotAAA6AAAgAyADLwHKBTsBngEgAyAjLwAAOwGaASADKAK8BSI8QQh2IT0gASgC1AEhPkEBISwgAykD0AUhayADLQDMBSE/IAMtAMkFIUAgAy0AyAUhQSADKALEBSFCIAMoAsAFIUMgAygCuAUhRCADKAK0BSFGICohRSAAIUcMAwtB5PibARDSLAALIANBsAVqELgqIAEtAOABIQALAkACQAJAAkACQCAAQf8BcSIsQRdGDQACQAJAICxB3wBGDQAgLEH1AEcNBiABEKELIAEtAOABQYYBRg0BIAEoAtwBIQAgASgC2AEhKiADQZgEaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANBhgE6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEIcbIBlBCGogA0GYBGpBCGooAgA2AgAgGSADKQKYBDcCACAqIAAgA0GwBGoQ4BohO0EJISwgAS0A4AFBogFHDRYgASABEJosEKcXDBYLIAEQoQtBACEAIAEtAOABQZcBRw0EIAEQ2AkiLEUNBCAsLQAAEKUVDQIMBAsgARChCyADQeABaiABQQBBABDLAyADKALgASEAIAMtAPQBIitBAkYNAiADQbAEakECaiIsIB5BAmotAAA6AAAgAyADLwHyATsB6AYgAyAeLwAAOwGwBCADLQDxASEvIAMtAPABITAgAygC7AEhTiADKALoASFPIAMoAuQBIS0CQCABEMoSIjFFDQAgLa1CIIYgAK2EEMYhQQkhLCAxITsMFQsgA0GaAWpBAmogLC0AADoAACADIAMvAegGOwGeASADIAMvAbAEOwGaAUEIISwgLUEIdiE9IAEoAtQBIUYgLSE8ICshPyAvIUAgMCFBIE4hQiBPIUMgACFEICohRwwUCyABEKELIANB6ABqIAEQ/wlBCSEsIAMoAmwhAAJAIAMoAmhBAXENACADIAA2AuABAkAgARDKEiI7RQ0AIANB4AFqENQDDBULIAEoAtQBIUZBByEsICohRwsgACE7DBMLIAEQoQtBASEADAELQQkhLCAAITsMEQsgA0HgAWogARDcDiADKALoASE7IAMpA+ABIm1QDQ8gAygC7AEhLCADQQA2AvABIAMgLDYC7AEgAyA7NgLoASADQQA6APQBIAMgbTcD4AEgA0HgAGogASAqIANB4AFqQQEgABDMAkEJQQYgAygCYEEBcRshLCADKAJkITsMEAsgASgC2AEhKyABLQCRAUEFdiAsQZcBRnEiMUUNASABEKELDAILDA4LIABB/wFxQdQARg0BC0ECIQBBACEsDAELIAEQoQsCQCABLQDgASIAQRhHDQAgASgC2AEhLyADQeABaiABQQAQ9wEgAygC5AEhAAJAIAMoAuABIixBgICAgHhHDQAgACE7DAwLIAMgAygC6AE2ArgEIAMgADYCtAQgAyAsNgKwBAJAIAMoAqgBRQ0AIAEoAtQBIQAgA0G0gYCAeDYC4AEgLyAAIANB4AFqEOAaITsCQCABLQDgAUGiAUcNACABIAEQmiwQpxcLIANBsARqEJQoDAwLIANBoAFqEJQoIC0gBigCADYCACADIAMpArAENwOgASABLQDgASEACwJAAkACQAJAAkACQCABLQCRAUEgcUUNAAJAAkAgAEH/AXFB8wBHDQACQCABENgJIgBFDQAgAC0AAEHQAEcNACABEIsnDQAgASgC2AEhACABEKELAkACQCABLQDgAUGiAUYNACADQeABaiABICogACADQaABakEBELIGIAMoAuABIgBBA0cNAUEJISwgAygC5AEhOwwXC0EJISwgARCaLCE7DBULIANBmgFqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBngEgAyAFLwAAOwGaASADKALsASI8QQh2IT1BAyEsIAMoAowCIT4gAygCiAIhRSADKQOAAiFrIAMtAPwBIT8gAy0A+QEhQCADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALoASFEIAMoAuQBIUYgACFHDBULIAEtAOABIgBB8wBHDQEgARDYCSIARQ0AIAAtAABBggFHDQAgASgC3AEhACABKALYASEsIANBnoGAgHg2AuABIAEgLCAAIANB4AFqEN4jIAEQoQsLIAEtAOABIQALIABB/wFxQYIBRw0AIAEoAtgBIQAgARChCyADQdgAaiABIAAQuwRBCSEsIAMoAlwhACADKAJYQQFxRQ0BIAAhOwwRCwJAIABB/wFxIgBB0ABGDQAgAEH4AEcNBSABENgJIgBFDQUgAC0AAEHdAEcNBSABEIsnDQUgASgC2AEhAAJAIAEtAOABQfgARg0AIAEoAtwBISogA0GwBmogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgKkByADQfgAOgDQBiADIANBoAdqNgK4BCADIANBiAdqNgKgByADIANB0AZqNgKIByADQegGaiADQbAEahCSECAiQQhqIANBsAZqQQhqKAIANgIAICIgAykCsAY3AgAgACAqIANB6AZqEOAaITsgAS0A4AFBogFHDQQgASABEJosEKcXDAQLIAEQoQsgA0HgAWogASAqQQEgACADQaABahDeDiADKALkASEAAkAgAygC4AEiKkEDRw0AIAAhOwwFCyADQZoBakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7AZ4BIAMgBS8AADsBmgEgAygC7AEiPEEIdiE9IAMtAPkBIUAgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC6AEhRCADLQD8ASE/IAMpA4ACIWsgAygCiAIhRSADKAKMAiE+QQMhLCAAIUYgKiFHDBILIANB4AFqIAEgKiABKALYASADQaABakEAELIGIAMoAuQBIQAgAygC4AEiKkEDRg0BIANBmgFqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBngEgAyAFLwAAOwGaASADKALsASI8QQh2IT0gAy0A+QEhQCADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALoASFEIAMtAPwBIT8gAykDgAIhayADKAKIAiFFIAMoAowCIT5BAyEsIAAhRiAqIUcMEQsgASgC1AEhPkEDISxBAiFHICohRSAAIUYMDwtBCSEsIAAhOwwPCyADQaABahCUKAtBCSEsDA0LIAEtAOABIgBB3QBGDQIgAS0AkAFBEHFFDQECQAJAIABB/gBHDQACQCABENgJIgBFDQAgAC0AAEHAAEYNAgsgAS0A4AEhAAsgAEH/AXFBB0cNAiABENgJIgBFDQIgAC0AACIAQQJGDQAgAEEPRw0CCyABKALUASEvIAEoAtABITBBACEAQQEhLAsgAS0A4AFBGEcNAyABKALYASFQIANB4AFqIAFBABD3ASADKALkASFOIAMoAuABIk9BgICAgHhHDQIgTiE7DAkLAkACQCABKAKIASIAQcAAcQ0AIAEgAEHAAHI2AogBIANBOGogARDCGCADKAI4ISsgASABKAKIAUG/f3E2AogBIAMoAjwhAAwBCyADQcAAaiABEMIYIAMoAkQhACADKAJAISsLQQkhLAJAICtBAXENACADIAA2AuABAkAgARDKEiI7RQ0AIANB4AFqENQDDAsLIAEoAtQBIUZBBCEsICohRwsgACE7DAkLIANB4AFqIAEgKkEAIAMgA0GgAWoQ3g4gAygC5AEhACADKALgASIqQQNGDQYgA0GaAWpBAmogBUECai0AADoAACADIAMvAfoBOwGeASADIAUvAAA7AZoBIAMoAuwBIjxBCHYhPSADLQD5ASFAIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAugBIUQgAy0A/AEhPyADKQOAAiFrIAMoAogCIUUgAygCjAIhPkEDISwgACFGICohRwwJCyADIAMoAugBNgK4BCADIE42ArQEIAMgTzYCsAQCQCADKAKoAUUNACABKALUASEAIANBtIGAgHg2AuABIFAgACADQeABahDgGiE7IAEtAOABQaIBRg0CDAULIANBoAFqEJQoIC0gBigCADYCACADIAMpArAENwOgAQsgMQ0BAkACQCABLQDgASJOQfgARg0AIE5B0ABHDQEgA0HgAWogASAqIAEoAtgBIANBoAFqQQAQjAQgAygC5AEhKwJAIAMoAuABIi1BCEcNACArITsMDAsgA0HUA2pBAmogBUECai0AADoAACADIAMvAfoBOwHeASADIAUvAAA7AdQDIAMtAPkBIVEgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC7AEhUiADKALoASFEIAMtAPwBIVMgAykDgAIhbkEAISwgLSFHICshRgwECwJAIAEQ2AkiTkUNACBOLQAAQd0ARw0AIAEQiycNACADQeABaiABIANBoAFqENILIAMoAuQBISsCQCADKALgASItQQhHDQAgKyE7DAwLIANB1ANqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsB3gEgAyAFLwAAOwHUAyADLQD5ASFRIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAuwBIVIgAygC6AEhRCADLQD8ASFTIAMpA4ACIW5BACEsIC0hRyArIUYMBAsgAS0A4AEhTgsCQCBOQf8BcSJPQd0ARw0AIAYgLSgCADYCACADIAMpA6ABNwOwBCADQeABaiABIANBsARqEKEsIAMoAuQBISsCQCADKALgASItQQhHDQAgKyE7DAsLIANB1ANqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsB3gEgAyAFLwAAOwHUAyADLQD5ASFRIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAuwBIVIgAygC6AEhRCADLQD8ASFTIAMpA4ACIW5BACEsIC0hRyArIUYMAwsCQCABLQCRAUEgcUUNACBPQdEARw0AAkAgARDYCSItRQ0AIC0tAABB/QBHDQAgASgC2AEhACABEKELIAEQoQsgA0HQAGogASAAQQEQ0AEgAygCVCEAAkAgAygCUEEBcUUNAEEJISwgACE7DAkLIAEoAtQBIT5BASEsQQYhRyAqIUUgACFGDAgLIAEtAOABIU4LAkAgTkH/AXEiLUHRAEYNAAJAIC1B4gBGDQAgLUHtAEYNAQwDCyABENgJIi1FDQICQAJAIC0tAAAiLUF+ag4DAgECAAsgLUG1f2pBAkkNASAtQeIARg0BIC1B8QBGDQELIC1BjX9qQf8BcUEtSw0CCyADQcgAaiABQQAQ2wJBASEsIAMoAkwhKwJAIAMoAkhBAXENACBUIUQgVSFDIFYhQiBXIUFBAiFHICshRgwDC0EJISwgKyE7DAYLIAEgARCaLBCnFwwCCwJAAkACQAJAAkACQAJAICwNACABLQDgASEAAkACQAJAIAEtAJABQRBxRQ0AIAAQpRUNAQsCQCAAQf8BcUEPRw0AIAEQ2AkiAEUNAiAALQAAQfUARw0CIAEtAOABIQALIANBADYCrAQgA0KAgICAgAE3AqQEIABB/wFxQQ9GDQQMBwsgA0HgAWogAUEAQQAQywMgAygC4AEhOyADLQD0ASIAQQJGDQsgA0HsA2pBAmogHkECai0AADoAACADIB4vAAA7AewDIAMoAvABISwgAygC7AEhLyADKALoASEwIAMoAuQBIS0MAgsgARChCyADQeABaiABELgFIAMoAuQBITsgAygC4AEiAEUNCiABKALUASFGQQUhLCAxITwgOyFEICohRyAAITsMCwsgA0HsA2pBAmogA0HbAWpBAmotAAA6AAAgAyADLwDbATsB7ANBACEsQeHqsaMHIS1B8ciVswYhOwsgA0EANgKsBCADQoCAgICAATcCpAQgBSADLwHsAzsAACAFQQJqIANB7ANqQQJqLQAAOgAAIAMgADoA/AEgAyAsNgL4ASADIC82AvQBIAMgMDYC8AEgAyAtNgLsASADIDs2AugBIANCAzcD4AEgA0GkBGogA0HgAWpB9PibARD0HiABLQDgASEAAkAgAygCrARFDQAgAEH/AXFBB0cNAiABENgJIgBFDQIgAC0AAEEPRw0CIAEQoQsMAQsgAEH/AXFBD0cNAgsgARChCwJAIAEtAOABQfUARg0AIAEoAtwBIQAgASgC2AEhKiADQZgFaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANB9QA6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEIcbIBlBCGogA0GYBWpBCGooAgA2AgAgGSADKQKYBTcCACAqIAAgA0GwBGoQ4BohOyABLQDgAUGiAUcNBCABIAEQmiwQpxcMBAsgARChCyADQbAEaiABEIwKIAMoArgEITsgAykDsAQibUICUQ0DICEgGSkCADcCACAhQRBqIBlBEGooAgA2AgAgIUEIaiAZQQhqKQIANwIAIAMgKzYCiAIgAyA7NgLwASADIG03A+gBIANCAjcD4AEgAyABKALUATYCjAIgA0GkBGogA0HgAWpBhPmbARD0HgsgAS0A4AEhAAsCQAJAAkACQCAAQf8BcSIAQf4ARg0AIAEtAJABQRBxDQEgASgC3AEhACABKALYASEqIANBpAVqIAEQ1CYgA0EBNgLkASADQZy/nAE2AuABIANCATcC7AEgA0GzBzYC7AYgA0H+ADoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQhxsgGUEIaiADQaQFakEIaigCADYCACAZIAMpAqQFNwIAICogACADQbAEahDgGiE7IAEtAOABQaIBRw0FIAEgARCaLBCnFwwFCyADQeABaiABELgFIAMoAuQBIQAgAygC4AEiKw0BIAAhOwwECyAAQQdGDQEgASgC3AEhACABKALYASEqIANB2ANqIAEQ1CYgA0EBNgLkASADQZy/nAE2AuABIANCATcC7AEgA0GzBzYC7AYgA0EHOgCgByADIANB6AZqNgLoASADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAEaiADQeABahCHGyAZQQhqIANB2ANqQQhqKAIANgIAIBkgAykC2AM3AgAgKiAAIANBsARqEOAaITsgAS0A4AFBogFHDQMgASABEJosEKcXDAMLIAEoAtQBIjxBCHYhPUECISwgAygCrAQhRiADKAKoBCFHIAMoAqQEITsgMSFBIAAhQiArIUMgKiFEDAcLIAEQoQsgAS0A4AEhAAsCQAJAIABB/wFxQQJHDQAgWCErAkACQANAIAEQoQsgAS0A4AFBA0YNASABKALYASFYIANB4AFqIAEQjAogAygC6AEhOyADKQPgASJtQgJRDQQgA0GIB2pBEGoiLCAdQRBqIi8oAgA2AgAgA0GIB2pBCGoiLSAdQQhqIgApAgA3AwAgAyAdKQIANwOIBwJAAkACQCBtp0EBcUUNACAZIAMpA4gHNwIAIBlBCGogLSkDADcCACAZQRBqICwoAgA2AgAgAyA7NgK4BCADIG03A7AEQQAhLAwBCyAgIAMpA4gHNwIAICBBCGoiMCAtKQMANwIAICBBEGoiLSAsKAIANgIAIAMgOzYCoAcCQAJAIAEtAJEBQSBxRQ0AIANBoAdqQbKEnAFBBBCEIkUNACABLQDgARClFUUNACADQegGaiABENwOIANB4AFqIANB6AZqEPEkIAMoAuABITsCQAJAIAMtAPQBIixBAkYNACAVIB8pAgA3AgAgFCAeLwAAOwAAIBVBCGoiTiAfQQhqIk8pAgA3AgAgFEECaiAeQQJqIlAtAAA6AAAgAyAsOgDEBiADIDs2ArAGAkACQAJAAkACQAJAIANBsAZqQbaEnAFBAhCEIg0AIDENAQwFCwJAIAEtAOABEKUVDQAgMUUNBCADKAKsByEsIAMoAqgHISsgA0GngYCAeDYC4AEgASArICwgA0HgAWoQ3iMMBAsgA0HoBWogARDcDiADQeABaiADQegFahDxJCADKALgASE7IAMtAPQBIixBAkYNAiATIB8pAgA3AgAgEiAeLwAAOwAAIBNBCGoiWSBPKQIANwIAIBJBAmoiWiBQLQAAOgAAIAMgLDoA/AYgAyA7NgLoBgJAIANB6AZqQbaEnAFBAhCEIkUNACABLQDgARClFUUNACADQegFaiABENwOIANB4AFqIANB6AVqEPEkIAMoAuABISwCQCADLQD0ASItQQJHDQAgAykD6AYQxiEgAykDsAYQxiFCAiFtICwhOyArIVgMCAsgA0GABmpBCGoiKyBPKQIANwMAIANB+ARqQQJqIjsgUC0AADoAACADIB8pAgA3A4AGIAMgHi8AADsB+AQgMUUNAiADKAKsByFbIAMoAqgHIVwgA0GngYCAeDYC4AEgASBcIFsgA0HgAWoQ3iMMAgsgA0HQBmpBCGogMCkCADcDACADQdAGakEQaiAtKAIANgIAIANBgAVqQQhqIFkpAgA3AwAgA0GEBGpBAmogWi0AADoAACADICApAgA3A9AGIAMgEykCADcDgAUgAyASLwAAOwGEBCADKAKgByE7IAMoAqwHIVsgAygC6AYhXSADLQD8BiFeIAMpA7AGEMYhQgAhb0EAIVwgWCErQgAhbQwKCyADKAKsByEsIAMoAqgHIS0gA0GngYCAeDYC4AEgASAtICwgA0HgAWoQ3iMMAwsgA0HQBmpBCGogTikCADcDACADQdAGakEQaiAVQRBqKAIANgIAIANBgAVqQQhqICspAwA3AwAgA0GEBGpBAmogOy0AADoAACADIAMpA4AGNwOABSADIAMvAfgEOwGEBCADIBUpAgA3A9AGIAMoArAGITsgAygCrAchWyADKQPoBhDGIUEBIVxCACFtQgAhbyAsIV0gLSFeDAQLIAMpA7AGEMYhDAILIANB0AZqQQhqIE4pAgA3AwAgA0HQBmpBEGogFUEQaigCADYCACADIBUpAgA3A9AGIAEoAtQBIVtBASFcQgIhb0IAIW0gAygCsAYhOwwCCyAGIAMpA7AGNwMAIAZBEGogA0GwBmpBEGopAwA3AwAgBkEIaiADQbAGakEIaikDADcDACADQgA3A7AEIAMpA6AHEMYhQQEhLAwDC0ICIW0gKyFYCyADKQOgBxDGISBtQgJRDQkgWCErDAMLIAYgAykDoAc3AwAgBkEQaiADQaAHakEQaikDADcDACAGQQhqIANBoAdqQQhqKQMANwMAIANCADcDsARBACEsC0IAIW0LAkACQCABLQDgAUH1AEYNAEICIW8MAQsgARChCyADQeABaiABEIwKIAMoAugBITsgAykD4AEicEICUQ0EIANBmAZqQQhqIAApAgA3AwAgA0G8A2pBAmogBUECai0AADoAACADIB0pAgA3A5gGIAMgBS8AADsBvAMgAy0A/AEhXyA7IV0gcCFvCyADQdAGakEIaiAZQQhqKQIANwMAIANB0AZqQRBqIBlBEGooAgA2AgAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GEBGpBAmogA0G8A2pBAmotAAA6AAAgAyADKQOYBjcDgAUgAyADLwG8AzsBhAQgAyAZKQIANwPQBiABKALUASFbIAMoArgEITsgLCFcIFghKyBfIV4LIB0gAykD0AY3AgAgHCADKQOABTcCACAbIAMvAYQEOwAAIC8gA0HQBmpBEGooAgA2AgAgACADQdAGakEIaikDADcCACAcQQhqIANBgAVqQQhqKQMANwIAIBtBAmogA0GEBGpBAmotAAA6AAAgAyBdNgKIAiADIG83A4ACIAMgXjoAnAIgGiADKADIAzYAACAaQQNqIANByANqQQNqKAAANgAAIAMgXDoAqAIgAyBbNgKkAiADICs2AqACIAMgOzYC6AEgAyBtNwPgASADQaQEaiADQeABakGU+ZsBEPQeAkAgAS0A4AFBfWoOBQIAAAABAAsLIAEoAtwBIQAgASgC2AEhKiADQYgEaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANBBzoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQhxsgGUEIaiADQYgEakEIaigCADYCACAZIAMpAogENwIAICogACADQbAEahDgGiE7IAEtAOABQaIBRw0DIAEgARCaLBCnFwwDCyABEKELAkACQCABLQDgAUH+AEYNACADKAKoBCJHIAMoAqwEIkZB0ABsaiFEIEchLAJAA0ACQAJAAkACQCAsIgAgREYNACAAQdAAaiEsIAApAwAicEJ+fCJtQgIgbUICVBunDgMBAgMBCyABEKogGkEAIUMMBgsCQCAAKQMQIm1CA4NCAFINACBtpyItIC0oAgAiLUEBajYCACAtQX9MDQQLIAAoAiwhLSAAKAIoIQAgA0HsgICAeDYC4AEgAyBtNwPoASABIAAgLSADQeABahDeIwwCCyAAKAIUIS0gACgCECE7AkAgACkDCCJtQgODQgBSDQAgbaciACAAKAIAIgBBAWo2AgAgAEF/TA0DCyADQeyAgIB4NgLgASADIG03A+gBIAEgOyAtIANB4AFqEN4jDAELAkAgcKdBAXFFDQAgACgCFCEtIAAoAhAhACADQfCAgIB4NgLgASABIAAgLSADQeABahDeIwwBC0GQ4Z4BQZDhngEQiSgaIABBCGohLUEAKAKc4Z4BRQ0AQQAhPEEAKAKQ4Z4BIkNBeGohQSAtKQMAENYgIm1CGYhCgYKEiJCgwIABfiFwQQAoApThngEiQiBtp3EhOwJAA0ACQCBDIDtqKQAAInEgcIUibUJ/hSBtQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIm1QDQADQCAtIEEgbXqnQQN2IDtqIEJxQQN0axCTDA0DIG1Cf3wgbYMibVBFDQALCyBxIHFCAYaDQoCBgoSIkKDAgH+DUEUNAiA7IDxBCGoiPGogQnEhOwwACwsgACgCFCEtIAAoAhAhOwJAIAApAwgibUIDg0IAUg0AIG2nIgAgACgCACIAQQFqNgIAIABBf0wNAgsgA0HsgICAeDYC4AEgAyBtNwPoASABIDsgLSADQeABahDeIwwACwsACyADQeABaiABELgFIAMoAuQBITsgAygC4AEiAEUNAyADKAKsBCFGIAMoAqgEIUcgACFDCyA7QQAgQxshQiABKALUASI8QQh2IT1BAiEsIAMoAqQEITsgMSFBICohRCArIVgMCAsgA0GwBGoQmiYMAQsgASgC3AEhACABKALYASEqIANB8ANqIAEQ1CYgA0EBNgLkASADQZy/nAE2AuABIANCATcC7AEgA0GzBzYC7AYgA0ECOgCgByADIANB6AZqNgLoASADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAEaiADQeABahCHGyAZQQhqIANB8ANqQQhqKAIANgIAIBkgAykC8AM3AgAgKiAAIANBsARqEOAaITsgAS0A4AFBogFHDQEgASABEJosEKcXDAELICshWAsgA0GkBGoQzCgMAwsgA0GaAWpBAmogA0HUA2pBAmotAAA6AAAgAyADLwHeATsBngEgAyADLwHUAzsBmgEgASgC1AEhSELxyJWzlqydtvQAIAAQ7SggUkEIdiE9AkAgLEUNACADQaABahCUKAtBASEsIFEhQCBBIVcgQiFWIEMhVSBEIVQgUiE8IEghPiAqIUUgbiJsIWsgUyJKIT8MBQsgA0GwBGoQlCgMAQtBCSEsIAAhOwwCC0EJISwLIANBoAFqEJQoCyAsQQlGDQEgPyFKIGshbCBFISogPiFICyADQfIAakECaiADQZoBakECai0AADoAACADIAMvAZ4BOwF2IAMgAy8BmgE7AXIgPUEIdCA8Qf8BcXIhNSAqIUkgQCFLIEEhNCBCIUwgQyEyIEQhTSBGITYgRyEzIDshKgwZC0EKISwgOyEqDBgLIDEhLgwUCyADKQOwARDGISARIDEpAgA3AgAgLCAxQQhqKQIANwIAIBAgKi8AADsAACAvICpBAmotAAA6AAAgAyAuNgKwASADIAA6AMQBQQEhMQsCQCABLQCRAUEgcUUNACABLQDgAUH/AXFBF0YNAgsgA0EYaiADQbABahDxFQJAIAMoAhgiACADKAIcIi5Bx4+cAUEGEOMlDQBBACEqIAAgLkHShJwBQQUQ4yVFDQQLIANBEGogA0GwAWoQ8RUCQAJAIAMoAhAiACADKAIUIipBx4+cAUEGEOMlIi5FDQBBASEqDAELIAAgKkHShJwBQQUQ4yVFDQNBAiEqCyABLQDgASIAQQJGDQAgAEEPRg0AAkACQCABKAKIASAAENoNRQ0AIABB/gBHDQELQQAhKiABENgJIgBFDQQgAC0AAEH+AEcNBAtBACEqIC5FDQAgA0GwBGogARCkDSADKAKwBCEuIAMtAMQEIgBBAkYNBCADQYgEakEIaiIqICspAgA3AwAgA0GEBGpBAmoiKyAwLQAAOgAAIAMgCCkCADcDiAQgAyAPLwAAOwGEBCADKQOwARDGISARIAMpA4gENwIAICwgKikDADcCACAQIAMvAYQEOwAAIC8gKy0AADoAACADIC42ArABIAMgADoAxAFBASEqDAMLIAMpA7ABEMYhDAYLIBggA0GwAWpBEGopAwA3AwAgBiAnKQMANwMAIAMgAykDsAE3A7AEIANBCGogASAtIANBsARqQQAgMRDMAkEKQQYgAygCCEEBcRshLCADKAIMIS4MDwtBoKacAUEoQbT5mwEQ0h4ACyABLQDgASIAQQdGDQEgAEH+AEYNAiABKALcASEAIAEoAtgBISogA0GYBGogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgLsBiADQQc6AKAHIAMgA0HoBmo2ArgEIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsAVqIANBsARqEIcbIAdBCGogA0GYBGpBCGooAgA2AgAgByADKQKYBDcCACAqIAAgA0GwBWoQ4BohLiABLQDgAUGiAUcNACABIAEQmiwQpxcLIAMpA7ABEMYhDAsLIAEQoQsLIBggAykDsAE3AwAgGEEIaiAnKQMAIm03AwAgGEEQaiADQbABakEQaikDADcDACADQgM3A7AEIAMgbTcDuAQgA0HIA2ogA0GwBGpBxPmbARD1HgtBASErICpBAUYNBCABLQDgASIAQQ9HDQEgKiEwCyABKALYASEAIAEQoQsgAS0A4AFB9QBGDQIgASgC3AEhACABKALYASEqIANBpARqIAEQ1CYgA0EBNgK0BCADQZy/nAE2ArAEIANCATcCvAQgA0GzBzYCtAEgA0H1ADoAsAYgAyADQbABajYCuAQgAyADQegGajYCsAEgAyADQbAGajYC6AYgA0GwBWogA0GwBGoQhxsgB0EIaiADQaQEakEIaigCADYCACAHIAMpAqQENwIAICogACADQbAFahDgGiEuIAEtAOABQaIBRw0HIAEgARCaLBCnFwwHCyAxITAgKkUNACAqISsMAwtBACErAkAgAEH/AXFBAkcNAAJAA0AgARChCyABLQDgAUEDRg0BIAEoAtgBITEgA0GwBWogARCMCiADKAK4BSEAAkACQAJAAkACQAJAIAMpA7AFIm1CAlINACAAIWAMAQsgAykDyAUhcCADKALEBSEsIAMoAsAFIS4gAygCvAUhKgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIG2nQQFxRQ0AIAEtAOABQfUARg0BIAMgKjYCvAUgAyAANgK4BSADQe+AgIB4NgKwBSAuICwgA0GwBWoQ4BohYCABLQDgAUGiAUcNAiABIAEQmiwQpxcMAgsgAyBwNwP4BSADICw2AvQFIAMgLjYC8AUgAyAqNgLsBSADIAA2AugFQQAhACABLQCRAUEgcUUNCCADQegFakGyhJwBQQQQhCJFDQhBACEAIAEtAOABIioQpRVFDQkgA0GYBmogARDcDiADQbAFaiADQZgGahDxJCADKAKwBSEAAkAgAy0AxAUiKkECRw0AQgUhbSAAIWAMDAsgFyAMKQIANwIAIBYgCi8AADsAACAXQQhqIAxBCGoiLCkCADcCACAWQQJqIApBAmotAAA6AAAgAyAqOgCUBiADIAA2AoAGAkAgA0GABmpBtoScAUECEIQiDQAgMEUNCCADKAL0BSEAIAMoAvAFISogA0GmgYCAeDYCsAUgASAqIAAgA0GwBWoQ3iMMCAsCQCABLQDgARClFQ0AIDBFDQYgAygC9AUhACADKALwBSEqIANBpoGAgHg2ArAFIAEgKiAAIANBsAVqEN4jDAYLIANBsAVqIAFBABCzBSADKAKwBSFgAkACQCADLQDEBSIAQQJGDQAgFSAMKQIANwIAIBQgCikAADcAACAVQQhqICwpAgA3AgAgFEEHaiAKQQdqIiooAAA2AAAgAyAAOgDEBiADIGA2ArAGIANBmAZqIANBsAZqELYZAkAgA0GYBmpBtoScAUECEIQiDQAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GABWpBEGogA0GYBmpBEGopAwA3AwAgAyADKQOYBjcDgAUgAygC8AUhYSADKALsBSFiIAMoAvQFImMhZAwHCwJAIAEtAOABEKUVDQAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GABWpBEGogA0GYBmpBEGopAwA3AwAgAyADKQOYBjcDgAUgAygC9AUhYyADKALwBSFhIAMoAuwFIWIgAygCpAYhZAwHCyADQbAFaiABQQAQswUgAygCsAUhYCADLQDEBSIAQQJHDQEgAykDmAYQxiELIAMpA4AGEMYhDAsLIBMgDCkCADcCACASIAopAAA3AAAgE0EIaiAsKQIANwIAIBJBB2ogKigAADYAACADIAA6APwGIAMgYDYC6AYgA0HQBmogA0HoBmoQthkgMA0CDAMLIAEQoQsgA0GwBWogAUEAELMFIAMoArAFIWACQCADLQDEBSIvQQJGDQAgCCAMKQIANwIAIA8gCikAADcAACAIQQhqIAxBCGopAgA3AgAgD0EHaiAKQQdqKAAANgAAIAMgLzoAxAQgAyBgNgKwBCADQaAHaiADQbAEahC2GSADQYAFakEIaiADQaAHakEIaikDADcDACADQYAFakEQaiADQaAHakEQaikDADcDACADIAMpA6AHNwOABUEAIWVCASFtIAMoAqwHIWQgMSFmIHAhciAsIWMgLiFhICohYiAAIWAMEAsgKq1CIIYgAK2EEMYhCyBwEPsqDAoLIAMoAvQFIQAgAygC8AUhKiADQaaBgIB4NgKwBSABICogACADQbAFahDeIwsgA0GABWpBCGogA0HQBmpBCGopAwA3AwAgA0GABWpBEGogA0HQBmpBEGopAwA3AwAgAyADKQPQBjcDgAUgAykDkAYhciADKAKMBiFjIAMoAogGIWEgAygChAYhYiADKAKABiFgIAMoAvQFIWQgAykDmAYQxiFCACFtDAILIAMoAugFIWAgAykD+AUhciADKQOABhDGIUEAIWUMCQsgA0GABWpBCGogA0GABmpBCGopAwA3AwAgA0GABWpBEGogA0GABmpBEGopAwA3AwAgAyADKQOABjcDgAUgASgC1AEhZEICIW0LQQEhZSAxIWYMBAsgA0GwBWpBEGoiACADQYAGakEQaikDADcDACADQbAFakEIaiIqIANBgAZqQQhqKQMANwMAIAMgAykDgAY3A7AFIAMpA+gFEMYhIANB6AVqQRBqIAApAwA3AwAgA0HoBWpBCGogKikDADcDACADIAMpA7AFNwPoBUEBIQALIAEtAOABISoLAkAgKkH/AXFB9QBGDQAgA0GABWpBEGogA0HoBWpBEGopAwA3AwAgA0GABWpBCGogA0HoBWpBCGopAwA3AwAgAyADKQPoBTcDgAUgASgC1AEhZEICIW0gACFlDAYLIAEQoQsgA0GwBWogAUEAELMFIAMoArAFIWAgAy0AxAUiKkECRw0DC0IFIW0LIAMpA+gFEMYhIG1CBVINBAtBCiEsIGAhLgwNCyARIAwpAgA3AgAgECAKKQAANwAAIBFBCGogDEEIaikCADcCACAQQQdqIApBB2ooAAA2AAAgAyAqOgDEASADIGA2ArABIANBiAdqIANBsAFqELYZIANBgAVqQQhqIANBiAdqQQhqKQMANwMAIANBgAVqQRBqIANBiAdqQRBqKQMANwMAIAMgAykDiAc3A4AFIAMpA/gFIXIgAygC9AUhYyADKALwBSFhIAMoAuwFIWIgAygC6AUhYCADKAKUByFkIAAhZQtCACFtCyAxIWYLIA4gAykDgAU3AwAgDSADKAD4BDYAACAOQQhqIANBgAVqQQhqKQMANwMAIA5BEGogA0GABWpBEGopAwA3AwAgDUEDaiADQfgEakEDaigAADYAACADIHI3A/gBIAMgYzYC9AEgAyBhNgLwASADIGI2AuwBIAMgZToAoAIgAyBkNgKcAiADIGY2ApgCIAMgYDYC6AEgAyBtNwPgASADQcgDaiADQeABakHU+ZsBEPUeAkAgAS0A4AFBfWoOBQIAAAABAAsLIAEoAtwBIQAgASgC2AEhKiADQZgFaiABENQmIANBATYCtAQgA0Gcv5wBNgKwBCADQgE3ArwEIANBswc2ArQBIANBBzoAsAYgAyADQbABajYCuAQgAyADQegGajYCsAEgAyADQbAGajYC6AYgA0GwBWogA0GwBGoQhxsgB0EIaiADQZgFakEIaigCADYCACAHIAMpApgFNwIAICogACADQbAFahDgGiEuIAEtAOABQaIBRw0HIAEgARCaLBCnFwwHCyABEKELCyAwITEMAQsgARChCyADQbAFaiABEKQNIAMoArAFIS4gAy0AxAUiKkECRg0EIAsgDCkCADcCACAJIAovAAA7AAAgC0EIaiAMQQhqKQIANwIAIAlBAmogCkECai0AADoAACADICo6ANQEIAMgLjYCwAQgAyAANgK4BCADQgQ3A7AEIAMgASgC1AE2ArwEIANByANqIANBsARqQeT5mwEQ9R4gMCErCyABLQDgASEACwJAIABB/wFxQf4ARg0AIAEoAtwBIQAgASgC2AEhKiADQaQFaiABENQmIANBATYCtAQgA0Gcv5wBNgKwBCADQgE3ArwEIANBswc2ArQBIANB/gA6ALAGIAMgA0GwAWo2ArgEIAMgA0HoBmo2ArABIAMgA0GwBmo2AugGIANBsAVqIANBsARqEIcbIAdBCGogA0GkBWpBCGooAgA2AgAgByADKQKkBTcCACAqIAAgA0GwBWoQ4BohLiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgARChCwJAIAEtAOABQcAARg0AIAggARDUJiADQRA2AsQEIANB9PmbATYCwAQgA0GwgICAeDYCsAQgASgC2AEgASgC3AEgA0GwBGoQ4BohLiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgA0GwBGogARD+GkEYQQgQpioiAEEQaiAYKQMANwMAIABBCGogBikDADcDACAAIAMpA7AENwMAQQAhKgJAAkACQCABLQDhAQ0AAkAgAS0A4AEiLEH3AEYNACAsQfAARw0BCyABEKELIANBsARqIAEQqyAgAygCtAQhLiADKAKwBCIqQTJGDQECQEE4RQ0AIANBsAVqIAZBOPwKAAALICpBDkcNBEEUQQQQpioiKiAuNgIAICogAykDsAU3AgQgKkEMaiADQbAFakEIaikDADcCAAsgARDKEiIuRQ0BICoQrywLIAAQ1icMAwsgASgC1AEhMiADKALQAyE2IAMoAswDITMgAygCyAMhLkEAISwgMSE0IC0hNQsgKyE3IDQhOCAqITkgMiE6IDUhZyAAIWggNiFpIDMhagwFC0GgppwBQShBhPqbARDSHgALQQohLAsgA0HIA2oQyyggLEEKRg0AIGohMyBpITYgaCEAIGchNSA6ITIgOSEqIDghNCA3ISsMAgsgLiEqCyAoEJQoQQohLAwBCyADQfIAakECaiADQdsBakECai0AADoAACADIAMvAZoBOwF2IAMgAy8A2wE7AXIgKBCUKCArIUsgKiFMIAAhTSAuISoLICxBCkYNAiADQfgAakECaiItIANB8gBqQQJqLQAAOgAAIAMgAy8BdjsBfCADIAMvAXI7AXgCQCACKAIIIisgAigCAEcNACACQcienAEQ4x0LIAIoAgQgK0E4bGoiACBLOgAhIAAgNDoAICAAIEw2AhwgACAyNgIYIAAgNTYCFCAAIE02AhAgACA2NgIMIAAgMzYCCCAAICo2AgQgACAsNgIAIAAgSjoAJCAAIAMvAXw7ASIgACADLwF4OwAlIABBJ2ogLS0AADoAACAAIEg2ATQgACBJNgEwIAAgbDcBKCACICtBAWo2AggMAAsLQQAhKgsgA0HAB2okACAqC7ppAhZ/An4jAEHgAWsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiA0F0aiIEQQcgBEEmSRsOJgABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlAAsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwuCyABKAIIIQMgASgCFCEFIAEoAhAhBiACQeAAaiABKAIMIgdBBEEQEJUPIAIoAmQhCCACKAJgQQFGDSQgAigCaCEJAkAgCEUNACAHQQR0IQogCSEEIAghCwNAIApFDQECQCADKAIAIgxBAkYNACADQQRqKQIAIRggA0EMaigCACENEPonIQEgAkHgAGogDRBCIAFBOGogAkHgAGpBOGopAwA3AwAgAUEwaiACQeAAakEwaikDADcDACABQShqIAJB4ABqQShqKQMANwMAIAFBIGogAkHgAGpBIGopAwA3AwAgAUEYaiACQeAAakEYaikDADcDACABQRBqIAJB4ABqQRBqKQMANwMAIAFBCGogAkHgAGpBCGopAwA3AwAgASACKQNgNwMACyADQRBqIQMgBCAMNgIAIARBDGogATYCACAEQQRqIBg3AgAgBEEQaiEEIApBcGohCiALQX9qIgsNAAsLIAAgBTYCFCAAIAY2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEENNgIADC0LIAEoAhAhBCABKAIUIQMgAkHgAGogAUEEahChASAAQRRqIAM2AgAgAEEONgIAIAAgAikCYDcCBCACIAQ2AmwgAEEMaiACQegAaikCADcCAAwsCwJAAkAgAS0AHCINQQJHDQAMAQsgASgCGCEJIAEoAhQhByABKAIQIQggASkDCCIYQgODQgBSDQAgGKciBCAEKAIAIgRBAWo2AgAgBEF/TA0kCyABKAIgIQQQgighASACQRhqIAQQggkgAkHAAWogBEEMahDtCEGAgICAeCEMIAQoAjghBSAEKAI0IQYgBCgCMCEOAkAgBCgCGEGAgICAeEYNACAEKAIsIQMgBCkCJCEZIAJB4ABqIARBGGoQvQogAkEwaiAZNwMAIAJBOGogAzYCACACIAIpAmQ3AyggAigCYCEMCyAELQBFIQ8gBC0ARCEQQQAhCkEAIQMCQCAEKAI8IgtFDQAQgCghAyALKAIMIREgCygCECESIAJB4ABqIAsQ4QYgA0EQaiASNgIAIAMgAikCYDcCACACIBE2AmwgA0EIaiACQeAAakEIaikCADcCAAsCQCAEKAJAIgRFDQAQ+ychCiAEKQIEIRkgBCgCACELEPwnIQQgAkHgAGogCxB2AkBB4ABFDQAgBCACQeAAakHgAPwKAAALIAogGTcCBCAKIAQ2AgALIAJB4ABqQQhqIgQgAkEYakEIaigCADYCACACQfQAaiACQcABakEIaigCADYCACACIAIpAhgiGTcDYCACIAIpAsABNwJsIAFBEGogAkHgAGpBEGopAwA3AgAgAUEIaiAEKQMANwIAIAEgGTcCACABIAw2AhggASAPOgBFIAEgEDoARCABIAo2AkAgASADNgI8IAEgBTYCOCABIAY2AjQgASAONgIwIAEgAikDKDcCHCABQSRqIAJBKGpBCGopAwA3AgAgAUEsaiACQShqQRBqKAIANgIAIAAgATYCICAAIA06ABwgACAJNgIYIAAgBzYCFCAAIAg2AhAgACAYNwMIIABBDzYCAAwrCyABKQMIIRggAS0AECEDEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgAzoAECAAIBg3AwggACAENgIEIABBEDYCAAwqCyABKQIEIRggAS8BECEDEPonIQQgAkHgAGogASgCDBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgAzsBECAAIAQ2AgwgACAYNwIEIABBETYCAAwpCyABKQIMIRggAS0AFCEKEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGoiCykDADcDACAEQTBqIAJB4ABqQTBqIgwpAwA3AwAgBEEoaiACQeAAakEoaiINKQMANwMAIARBIGogAkHgAGpBIGoiCCkDADcDACAEQRhqIAJB4ABqQRhqIgcpAwA3AwAgBEEQaiACQeAAakEQaiIJKQMANwMAIARBCGogAkHgAGpBCGoiBSkDADcDACAEIAIpA2A3AwAQ+ichAyACQeAAaiABKAIIEEIgA0E4aiALKQMANwMAIANBMGogDCkDADcDACADQShqIA0pAwA3AwAgA0EgaiAIKQMANwMAIANBGGogBykDADcDACADQRBqIAkpAwA3AwAgA0EIaiAFKQMANwMAIAMgAikDYDcDACAAIAo6ABQgACAYNwIMIAAgAzYCCCAAIAQ2AgQgAEESNgIADCgLIAEtADwhCyABKAI0IQwgASgCMCENAkAgA0ELRw0AAkACQAJAIAEoAgQiCA4DAAECAAsgASgCGCEHIAEoAhQhCSACQcABaiABQQhqEMUJIAEtACAhBQJAAkAgASgCHCIEDQBBACEKDAELEPsnIQogBCkCBCEYIAQoAgAhBhD8JyEEIAJB4ABqIAYQdgJAQeAARQ0AIAQgAkHgAGpB4AD8CgAACyAKIBg3AgQgCiAENgIACyACKALIASEGIAIpA8ABIRgMKQsgASgCGCEHIAEoAhQhCSACQShqIAFBCGoQ4AIgAS0AICEFAkACQCABKAIcIgQNAEEAIQoMAQsQ+ychCiAEKQIEIRggBCgCACEGEPwnIQQgAkHgAGogBhB2AkBB4ABFDQAgBCACQeAAakHgAPwKAAALIAogGDcCBCAKIAQ2AgALIAIoAjAhBiACKQMoIRgMKAsgAkHeAGogAUEjai0AADoAACACIAEvACE7AVwgAS0AICEFIAEoAhwhCiABKAIYIQcgASgCFCEJIAEoAhAhBiABKQMIIRgMJwsCQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCwABAgMEBQYHCAkKAAsgAkHgAGogAUEIahDMDCACQd4AaiACQfsAai0AADoAACACIAIvAHk7AVwgAi0AeCEFIAIoAnQhCiACKAJwIQcgAigCbCEJIAIoAmghBiACKQNgIRggAigCfCEODDALIAJB4ABqIAFBCGoQwAYgAkHeAGogAkH7AGotAAA6AAAgAiACLwB5OwFcDC4LIAJB4ABqIAFBCGoQ7gggAkHeAGogAkH7AGotAAA6AAAgAiACLwB5OwFcDC0LIAJB4ABqIAFBBGoQrg4MKwsgAkHgAGogAUEEahD1AwwpCyACQeAAaiABQQRqELEMDCgLIAJB4ABqIAFBBGoQsQwMJwsgAkHgAGogAUEEahCuDgwnCyACQeAAaiABQQRqELEMDCULIAJB4ABqIAFBBGoQkQsMJAsgAkHeAGogAUEjai0AADoAACACIAEvACE7AVwgASkDKCEZIAEoAiQhDiABLQAgIQUgASgCHCEKIAEoAhghByABKAIUIQkgASgCECEGIAEpAwghGCABKAIEIQgMJgsgASgCJCEKIAEoAiAhCxD6JyEEIAJB4ABqIAEoAigQQiAEQThqIAJB4ABqQThqIgcpAwA3AwAgBEEwaiACQeAAakEwaiIJKQMANwMAIARBKGogAkHgAGpBKGoiBSkDADcDACAEQSBqIAJB4ABqQSBqIgYpAwA3AwAgBEEYaiACQeAAakEYaiIOKQMANwMAIARBEGogAkHgAGpBEGoiDykDADcDACAEQQhqIAJB4ABqQQhqIhApAwA3AwAgBCACKQNgNwMAAkACQAJAAkAgASgCCCIMDgMAAQIACyABKAIUIQMgASgCECENIAEoAhwhCCABKAIYIQcCQCABKQMQIhhCA4NCAFINACAYpyIBIAEoAgAiAUEBajYCACABQX9MDSILIAIgAzYCYCACQShqIQEMAgsgASgCFCEDIAEoAhAhDSABKAIcIQggASgCGCEHAkAgASkDECIYQgODQgBSDQAgGKciASABKAIAIgFBAWo2AgAgAUF/TA0hCyACIAM2AmAgAkEoaiEBDAELIAEoAhQhCCABKAIQIQ0Q+ichAyACQeAAaiABKAIMEEIgA0E4aiAHKQMANwMAIANBMGogCSkDADcDACADQShqIAUpAwA3AwAgA0EgaiAGKQMANwMAIANBGGogDikDADcDACADQRBqIA8pAwA3AwAgA0EIaiAQKQMANwMAIAMgAikDYDcDACACQeAAaiEBCyABIAg2AgAgACANNgIQIAAgAzYCDCAAIAw2AgggACAHNgIYIAAgBDYCKCAAIAo2AiQgACALNgIgIABBFDYCACAAIAIoAmA2AhQgACACKAIoNgIcDCYLQQEhBCABKAIsIQMgASgCKCEKIAEoAiQhCyABKAIgIQwCQAJAIAEoAghBAUcNACABKQMQIRggAUEMahC6DyEBDAELIAEoAhwhCCABKAIYIQ1BACEEAkAgASkDECIYQgODQgBRDQAMAQsgGKciASABKAIAIgdBAWo2AgAgB0F/TA0eCyAAIAM2AiwgACAKNgIoIAAgCzYCJCAAIAw2AiAgACAINgIcIAAgDTYCGCAAIBg3AxAgACABNgIMIAAgBDYCCCAAQRU2AgAMJQsgASkDECEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGoiCykDADcDACAEQTBqIAJB4ABqQTBqIgwpAwA3AwAgBEEoaiACQeAAakEoaiINKQMANwMAIARBIGogAkHgAGpBIGoiCCkDADcDACAEQRhqIAJB4ABqQRhqIgcpAwA3AwAgBEEQaiACQeAAakEQaiIJKQMANwMAIARBCGogAkHgAGpBCGoiBSkDADcDACAEIAIpA2A3AwAQ+ichAyACQeAAaiABKAIIEEIgA0E4aiALKQMANwMAIANBMGogDCkDADcDACADQShqIA0pAwA3AwAgA0EgaiAIKQMANwMAIANBGGogBykDADcDACADQRBqIAkpAwA3AwAgA0EIaiAFKQMANwMAIAMgAikDYDcDABD6JyEKIAJB4ABqIAEoAgwQQiAKQThqIAspAwA3AwAgCkEwaiAMKQMANwMAIApBKGogDSkDADcDACAKQSBqIAgpAwA3AwAgCkEYaiAHKQMANwMAIApBEGogCSkDADcDACAKQQhqIAUpAwA3AwAgCiACKQNgNwMAIAAgGDcDECAAIAo2AgwgACADNgIIIAAgBDYCBCAAQRY2AgAMJAsgAUEEaiEKIAEoAiQhCyABKAIgIQwgASgCHCENAkACQAJAIAEtABgiA0F9aiIEQQEgBEH/AXFBA0kbQf8BcQ4DAAECAAsgAkEKaiABQRtqLQAAOgAAIAIgAS8AGTsBCAwfCyACQQpqIAFBG2otAAA6AAAgAiABLwAZOwEIDB4LEPonIQQgAkHgAGogASgCEBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAQQUhAwweCyABKAIcIQogASgCGCELIAEoAhQhDBD6JyEEIAJB4ABqIAEoAhAQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDAEGAgICAeCEDAkAgASgCBEGAgICAeEYNACACQeAAaiABQQRqELoIIAIpAmQhGCACKAJgIQMLAkACQCABKAIgIgENAEEAIQEMAQsgARCjFiEBCyAAIAE2AiAgACAKNgIcIAAgCzYCGCAAIAw2AhQgACAENgIQIAAgGDcDCCAAIAM2AgQgAEEYNgIADCILIAEoAhAhBCABKAIUIQMgAkHgAGogAUEEahCVCSAAQRRqIAM2AgAgAEEZNgIAIAAgAikCYDcCBCACIAQ2AmwgAEEMaiACQegAaikCADcCAAwhCyABKAIYIQQgASgCFCEDIAEoAhAhCgJAIAEpAwgiGEIDg0IAUg0AIBinIgsgCygCACILQQFqNgIAIAtBf0wNGQsgACAENgIYIAAgAzYCFCAAIAo2AhAgACAYNwMIIABBGjYCACAAIAEtABw6ABwMIAsCQAJAAkACQAJAAkACQAJAAkAgASgCCCIKDgcAAQIDBAUGAAsgASgCHCEIIAEoAhghBAJAIAEpAxAiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNIAsgASgCJCELIAEoAiAhAwJAIAEpAyAiGVANACAZQgODUEUNACAZpyIBIAEoAgAiAUEBajYCACABQX9MDSALIBhCIIinIQwgGKchDQwGCyABKQMYIhhCIIinIQggASkDECIZQiCIpyEMIAEoAiQhCyABKAIgIQMgASgCDCEBIBinIQQgGachDQwGCyABKQMYIhhCIIinIQggASkDECIZQiCIpyEMIAEoAiQhCyABKAIgIQMgASgCDCEBIBinIQQgGachDQwFCyABKAIkIQsgASgCICEDIAEpAxghGCABKAIUIQwgASgCECENAkAgASkDICIZUA0AIBlCA4NQRQ0AIBmnIgEgASgCACIBQQFqNgIAIAFBf0wNHQsgGEIgiKchCCAYpyEEDAMLIAEoAiAhBCABKAIUIQwgASgCECENEP4nIQMgBC0ADCELIAJB4ABqIARBBGooAgAgBEEIaigCABDgFyADIAIpAmA3AgAgAiALOgBsIANBCGogAkHgAGpBCGopAgA3AgAgASkDGCIYpyEEAkAgGFANACAYQgODUEUNACAEIAQoAgAiAUEBajYCACABQX9MDRwLIBhCIIinIQgMAwsgASgCJCELIAEoAiAhAwJAIAEpAxAiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNGwsgASkDGCIZpyEEAkAgGUIDg0IAUg0AIAQgBCgCACIBQQFqNgIAIAFBf0wNGwsgGUIgiKchCCAYQiCIpyEMIBinIQ0MAQsgASgCJCELIAEoAiAhAwJAIAEpAxAiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNGgsgASkDGCIZpyEEAkAgGUIDg0IAUg0AIAQgBCgCACIBQQFqNgIAIAFBf0wNGgsgGUIgiKchCCAYQiCIpyEMIBinIQ0LCyAAIAs2AiQgACADNgIgIAAgATYCDCAAIAo2AgggAEEbNgIAIAAgCK1CIIYgBK2ENwMYIAAgDK1CIIYgDa2ENwMQDB8LIAEpAhwhGCACQeAAaiABQQRqEJUJIAJB4ABqQQxqIAEoAhQgASgCGBD4CCAAQRxqIBg3AgAgAEEcNgIAIAAgAikCYDcCBCAAQQxqIAJB6ABqKQIANwIAIABBFGogAkHwAGopAgA3AgAMHgsgASgCFCEKIAEoAhAhCyABKAIMIQwQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGoiDSkDADcDACAEQQhqIAJB4ABqQQhqIggpAwA3AwAgBCACKQNgNwMAAkACQCABKAIYIgMNAEEAIQcMAQsgAxCjFiEHCyABKAIIIQMQiCghASADKQIYIRggAkHgAGogAxCVCSACQewAaiADQRBqKAIAIANBFGooAgAQ+AggAUEYaiAYNwIAIAEgAikCYDcCACABQQhqIAgpAgA3AgAgAUEQaiANKQIANwIAIAAgBzYCGCAAIAo2AhQgACALNgIQIAAgDDYCDCAAIAE2AgggACAENgIEIABBHTYCAAwdCyABKAIIIQMgASgCHCEHIAEoAhghCSABKAIUIQUgAkHgAGogASgCDCINQQhBKBCVDyACKAJkIQwgAigCYEEBRg0VIAIoAmghCAJAIAxFDQAgDUEobCEKIAghBCAMIQsDQCAKRQ0BIAJB4ABqIAMQvAIgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgBEEoaiEEIApBWGohCiADQShqIQMgC0F/aiILDQALCxCEKCEEQYCAgIB4IQsCQAJAIAEoAhAiCigCAEGAgICAeEcNABD6JyEDIAJB4ABqIAooAgQQQiADQThqIAJB4ABqQThqKQMANwMAIANBMGogAkHgAGpBMGopAwA3AwAgA0EoaiACQeAAakEoaikDADcDACADQSBqIAJB4ABqQSBqKQMANwMAIANBGGogAkHgAGpBGGopAwA3AwAgA0EQaiACQeAAakEQaikDADcDACADQQhqIAJB4ABqQQhqKQMANwMAIAMgAikDYDcDAAwBCyAKKQIMIRggCigCFCEDIAJB4ABqIAoQvQogAiADNgJ0IAIgGDcCbCACQTBqIAJB8ABqKQIANwMAIAIgAikCaDcDKCACKAJgIQsgAigCZCEDCyAEIAM2AgQgBCALNgIAIAQgAikDKDcCCCAEQRBqIAJBMGopAwA3AgAgAS0AKSELIAEtACghBkEAIQNBACEKAkAgASgCICIORQ0AIA4QpBYhCgsCQCABKAIkIgFFDQAgARDBGiEDCyAAIAs6ACkgACAGOgAoIAAgAzYCJCAAIAo2AiAgACAHNgIcIAAgCTYCGCAAIAU2AhQgACAENgIQIAAgDTYCDCAAIAg2AgggACAMNgIEIABBHjYCAAwcCwJAAkAgAS0AHCINQQJHDQAMAQsgASgCGCEJIAEoAhQhByABKAIQIQggASkDCCIYQgODQgBSDQAgGKciBCAEKAIAIgRBAWo2AgAgBEF/TA0UCxCHKCEEIAEoAiAiASgCLCEFIAEoAighBiABKAIkIQ4gAkHAAWogARDtCCACQShqIAFBDGoQdUEAIQpBACEDAkAgASgCMCILRQ0AEPonIQMgAkHgAGogCxBCIANBOGogAkHgAGpBOGopAwA3AwAgA0EwaiACQeAAakEwaikDADcDACADQShqIAJB4ABqQShqKQMANwMAIANBIGogAkHgAGpBIGopAwA3AwAgA0EYaiACQeAAakEYaikDADcDACADQRBqIAJB4ABqQRBqKQMANwMAIANBCGogAkHgAGpBCGopAwA3AwAgAyACKQNgNwMACyABLQA8IQ8CQCABKAI0IgtFDQAQgCghCiALKAIMIQwgCygCECEQIAJB4ABqIAsQ4QYgCkEQaiAQNgIAIAogAikCYDcCACACIAw2AmwgCkEIaiACQeAAakEIaikCADcCAAsCQAJAIAEoAjgiDA0AQQAhCwwBCxCAKCELIAwoAgwhECAMKAIQIREgAkHgAGogDBDVDCALQRBqIBE2AgAgCyACKQJgNwIAIAIgEDYCbCALQQhqIAJB4ABqQQhqKQIANwIACyACQeAAakEYaiIMIAFBGGoQ0QUgAkHgAGpBCGoiASACQcABakEIaigCADYCACACQfQAaiACQShqQQhqKAIANgIAIAIgAikCwAEiGTcDYCACIAIpAig3AmwgBEEgaiACQeAAakEgaigCADYCACAEQRhqIAwpAwA3AgAgBEEQaiACQeAAakEQaikDADcCACAEQQhqIAEpAwA3AgAgBCAZNwIAIAQgDzoAPCAEIAs2AjggBCAKNgI0IAQgAzYCMCAEIAU2AiwgBCAGNgIoIAQgDjYCJCAAIAQ2AiAgACANOgAcIAAgCTYCGCAAIAc2AhQgACAINgIQIAAgGDcDCCAAQR82AgAMGwsgASgCCCEEIAEoAgQhAwJAAkAgASgCDA0AQQAhCgwBCyABQQxqELoPIQoLIAAgCjYCDCAAIAQ2AgggACADNgIEIABBIDYCACAAIAEtABA6ABAMGgsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwZCyABKQMIIRgQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAYNwMIIAAgBDYCBCAAQSI2AgAMGAsgASkDCCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgGDcDCCAAIAQ2AgQgAEEjNgIADBcLIAEoAhwhBCABKAIYIQMgAkHgAGogAUEgahCpCCABKAIUIQogASgCECELAkAgASkDCCIYQgODQgBSDQAgGKciASABKAIAIgFBAWo2AgAgAUF/TA0PCyAAIAIpA2A3AyAgAEEwaiACQfAAaikDADcDACAAQShqIAJB6ABqKQMANwMAIAAgBDYCHCAAIAM2AhggACAKNgIUIAAgCzYCECAAIBg3AwggAEEkNgIADBYLIAEoAhQhBCABKAIQIQMgASgCLCEKIAEoAighCwJAIAEpAwgiGEIDg0IAUg0AIBinIgwgDCgCACIMQQFqNgIAIAxBf0wNDgsgASgCJCEMIAEoAiAhDQJAIAEpAxgiGUIDg0IAUg0AIBmnIgEgASgCACIBQQFqNgIAIAFBf0wNDgsgACAKNgIsIAAgCzYCKCAAIAw2AiQgACANNgIgIAAgGTcDGCAAIAQ2AhQgACADNgIQIAAgGDcDCCAAQSU2AgAMFQsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwUCyABKAIEIQQQ/ychASAEKAIEIQcgBCgCACEJAkACQAJAAkACQCAELQBsQX1qIgNBASADQf8BcUEDSRtB/wFxDgMAAQIACyAEKAJQIQggBCgCTCEFIAQoAkghBgJAIAQpA0AiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNEAsgBC0AVCENQQAhEkEDIRMMAgsgBCgCVCENIAQoAlAhCCACQeAAaiAEQdgAahCpCCAEKAJMIQUgBCgCSCEGAkAgBCkDQCIYQgODQgBSDQAgGKciAyADKAIAIgNBAWo2AgAgA0F/TA0PCyACQdoAaiACQfcAai0AADoAACACIAIvAHU7AVggDUEIdiESIAItAHQhEyACKAJwIRQgAigCbCEPIAIoAmghDiACKAJkIREgAigCYCEQDAILIAQoAkwhBSAEKAJIIQYgBCgCZCEPIAQoAmAhDgJAIAQpA0AiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNDgsgBCgCXCERIAQoAlghECAEKQNQIhmnIQgCQCAZQgODQgBSDQAgCCAIKAIAIgNBAWo2AgAgA0F/TA0OCyAZQiiIpyESIBlCIIinIQ1BBSETCwsgBCgCdCEVIAQoAnAhFiACQcABaiAEQfwAahCqAiAELQCIASEXAkACQCAEKAJ4IgoNAEEAIQMMAQsQgCghAyAKKAIMIQsgCigCECEMIAJB4ABqIAoQ1QwgA0EQaiAMNgIAIAMgAikCYDcCACACIAs2AmwgA0EIaiACQeAAakEIaikCADcCAAsgAkEYaiAEQZABahCYCkEGIQoCQCAELQA8QQZGDQAgBCgCDCEMIAQoAgghCyACQeAAaiAEQRBqEKMGIAJBKGpBKGogAkHgAGpBKGooAgA2AgAgAkEoakEgaiACQeAAakEgaikDADcDACACQShqQRhqIAJB4ABqQRhqKQMANwMAIAJBKGpBEGogAkHgAGpBEGopAwA3AwAgAkEoakEIaiACQeAAakEIaikDADcDACACQSZqIAJBjwFqLQAAOgAAIAIgAikDYDcDKCACIAIvAI0BOwEkIAItAIwBIQoLIAJB7wBqIgQgAkEYakEIaigCADYAACACIAIpAhg3AGcgASAMNgIMIAEgCzYCCCABIAc2AgQgASAJNgIAIAEgAikDKDcDECABQRhqIAJBKGpBCGopAwA3AwAgAUEgaiACQThqKQMANwMAIAFBKGogAkEoakEYaikDADcDACABQTBqIAJBKGpBIGopAwA3AwAgAUE4aiACQShqQShqKAIANgIAIAEgCjoAPCABIBM6AGwgASAUNgJoIAEgDzYCZCABIA42AmAgASARNgJcIAEgEDYCWCABIBJBCHQgDUH/AXFyrUIghiAIrYQ3A1AgASAFNgJMIAEgBjYCSCABIBg3A0AgASACLwEkOwA9IAFBP2ogAkEkakECai0AADoAACABIAIvAVg7AG0gAUHvAGogAkHYAGpBAmotAAA6AAAgASADNgJ4IAEgFTYCdCABIBY2AnAgAUGEAWogAkHAAWpBCGooAgA2AgAgASACKQLAATcCfCABIBc6AIgBIAFBmAFqIAQoAAA2AAAgAUGRAWogAkHgAGpBCGopAAA3AAAgASACKQBgNwCJASAAQSc2AgAgACABNgIEDBMLIAEoAhAhBCABKQIUIRggASgCHCEDIAJB4ABqIAFBBGoQmAogAkH4AGoiCiADNgIAIABBFGogGDcCACAAQSg2AgAgACACKQJgNwIEIABBJGogASgCJDYCACACIAQ2AmwgAEEMaiACQegAaikCADcCACACIAEoAiA2AnwgAEEcaiAKKQIANwIADBILIAEpAgwhGBD6JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACABKAIIIQMQ/CchASACQeAAaiADEHYCQEHgAEUNACABIAJB4ABqQeAA/AoAAAsgACAYNwIMIAAgATYCCCAAIAQ2AgQgAEEpNgIADBELIAEpAwghGBD6JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIBg3AwggACAENgIEIABBKjYCAAwQCyABKQMIIRgQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAYNwMIIAAgBDYCBCAAQSs2AgAMDwsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAEoAgghAxD8JyEBIAJB4ABqIAMQdgJAQeAARQ0AIAEgAkHgAGpB4AD8CgAACyAAIBg3AgwgACABNgIIIAAgBDYCBCAAQSw2AgAMDgsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGoiCikDADcDACAEIAIpA2A3AwAgASgCCCEDEIAoIQEgAygCDCELIAMoAhAhDCACQeAAaiADENUMIAFBEGogDDYCACABIAIpAmA3AgAgAiALNgJsIAFBCGogCikCADcCACAAIBg3AgwgACABNgIIIAAgBDYCBCAAQS02AgAMDQsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAEoAgghAxD8JyEBIAJB4ABqIAMQdgJAQeAARQ0AIAEgAkHgAGpB4AD8CgAACyAAIBg3AgwgACABNgIIIAAgBDYCBCAAQS42AgAMDAsgASgCFCEEIAEoAhAhAwJAIAEpAwgiGEIDg0IAUg0AIBinIgEgASgCACIBQQFqNgIAIAFBf0wNBAsgACAENgIUIAAgAzYCECAAIBg3AwggAEEvNgIADAsLIAEtABAhDCABKAIMIQ0gASgCCCEIEP0nIQRBAyELAkACQCABKAIEIgMoAgBBA0cNACADKAIcIQcgAygCGCEJIAMoAhQhBRD6JyEKIAJB4ABqIAMoAhAQQiAKQThqIAJB4ABqQThqKQMANwMAIApBMGogAkHgAGpBMGopAwA3AwAgCkEoaiACQeAAakEoaikDADcDACAKQSBqIAJB4ABqQSBqKQMANwMAIApBGGogAkHgAGpBGGopAwA3AwAgCkEQaiACQeAAakEQaikDADcDACAKQQhqIAJB4ABqQQhqIgYpAwA3AwAgCiACKQNgNwMAIAJB0AFqIANBBGoQuggCQCADKAIgIgMNAEEAIQEMAgsQgCghASADKAIMIQ4gAygCECEPIAJB4ABqIAMQ1QwgAUEQaiAPNgIAIAEgAikCYDcCACACIA42AmwgAUEIaiAGKQIANwIADAELIAMoAhwhByADKAIYIQkQ+ichASACQeAAaiADKAIgEEIgAUE4aiACQeAAakE4aikDADcDACABQTBqIAJB4ABqQTBqKQMANwMAIAFBKGogAkHgAGpBKGopAwA3AwAgAUEgaiACQeAAakEgaikDADcDACABQRhqIAJB4ABqQRhqKQMANwMAIAFBEGogAkHgAGpBEGopAwA3AwAgAUEIaiACQeAAakEIaikDADcDACABIAIpA2A3AwAgAkHgAGogAxD7ByACQdABakEIaiACQewAaigCADYCACACIAIpAmQ3A9ABIAIoAmAhCyACKAJwIQogAigCdCEFCyAEIAs2AgAgBCACKQPQATcCBCAEIAE2AiAgBCAHNgIcIAQgCTYCGCAEIAU2AhQgBCAKNgIQIAAgDDoAECAAIA02AgwgACAINgIIIAAgBDYCBCAAQTA2AgAgBEEMaiACQdgBaigCADYCAAwKCyAAIAEpAwA3AwAgAEE4aiABQThqKQMANwMAIABBMGogAUEwaikDADcDACAAQShqIAFBKGopAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqKQMANwMADAkLIAggAigCaEG08poBEI4pCwALIAwgAigCaEG08poBEI4pAAsgASgCFCEIIAEoAhAhBAsgAkEMaiAKELoIAkACQCABKAIoIgENAEEAIQEMAQsgARCjFiEBCyAAIAIpAgw3AgQgACADOgAYIAAgCDYCFCAAIAQ2AhAgACACLwEIOwAZIAAgATYCKCAAIAs2AiQgACAMNgIgIAAgDTYCHCAAQRc2AgAgAEEMaiACQRRqKAIANgIAIABBG2ogAkEKai0AADoAAAwECyACKAJsIQYgAikCZCEYIAIoAmAhCAwCCyACKQJkIRggAigCYCEIDAELIAItAHghBSACKAJ0IQogAigCcCEHIAIoAmwhCSACKAJoIQYgAikDYCEYIAIoAnwhDiACKQOAASEZCxD6JyEEIAJB4ABqIAEoAjgQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIAU6ACAgACAKNgIcIAAgBzYCGCAAIAk2AhQgACAGNgIQIAAgGDcDCCAAIAg2AgQgACADNgIAIAAgCzoAPCAAIAQ2AjggACAMNgI0IAAgDTYCMCAAIBk3AyggACAONgIkIAAgAi8BXDsAISAAQSNqIAJB3gBqLQAAOgAACyACQeABaiQAC+dnAiV/B34jAEHgBGsiAiQAQQAhAwJAAkAgASkDACInpyIEDQAgAC0AGw0AIAEoAhwhBSABKAIgQThsIQYDQCAGRQ0BIAUgBkFIaiIGaiIHKAIAIghBBUsNAAsgB0E4aiIGIAhBAnQiBUGs2p4BaigCAGooAgAhCSAGIAVBxNqeAWooAgBqKAIAIQpBASEDDAELCwJAIAAtABgiCw0AIAAtABohBiACQZAEakEQaiIFQQApA/iEngEiJzcDACACQZAEakEYaiIHQQApA4CFngEiKDcDACACQZAEakEIaiIIIABBCGoiDCkCADcDACAAKQIAISkgACAnNwIAIAwgKDcCACACICk3A5AEIAJBqAFqQQhqICg3AwAgAkGoAWpBEGogJzcDACACQagBakEYaiAoNwMAIAJBCGpBCGogKDcDACACQQhqQRhqICg3AwAgAkEIakEQaiAnNwMAIAIgJzcDqAEgAkGAA2pBCGoiDCAoNwMAIAJBgANqQRBqIg0gJzcDACACQYADakEYaiIOICg3AwAgAkEAOgBIIAIgJzcDCCACICc3A4ADIAJBCGpBOGoiDyAoNwMAIAJBCGpBMGoiECAnNwMAIAJBCGpBKGoiESAoNwMAIAIgJzcDKCACIAY6AMADIA4gBykDADcDACANIAUpAwA3AwAgDCAIKQMANwMAIAIgAikDkAQ3A4ADIAJBgANqQThqIA8pAwA3AwAgAkGAA2pBMGogECkDADcDACACQYADakEoaiARKQMANwMAIAIgAikDKDcDoAMgAkGgA2ohDAJAAkAgBEUNACABKAIgIgVFDQEgASgCHCEGIAVBMGwhBQNAAkAgBigCAEERRw0AIAZBCGooAgBBB0cNACAGIAJBkARqEKYECyAGQTBqIQYgBUFQaiIFDQAMAgsLAkAgASgCICIGRQ0AIAEoAhwiBSAGQThsaiEIIAZBOGwhByAFIQYDQAJAAkAgBigCAEEJRw0AIAZBCGogAkGAA2oQ/QMMAQsgBiACQYADahD7AgsgBkE4aiEGIAdBSGoiBw0ACyACQYADakEwaiEEA0ACQAJAIAUoAgAiBkEJRw0AIAwgBUEIahDFJwwBCwJAAkACQAJAAkACQAJAAkAgBg4JAAECAwQFBgcIAAsgBSgCDCIHRQ0HIAUoAgghBgJAIAUtACANACAHQcgAbCEHA0ACQCAGKQMAQgNaDQAgBkHAAGotAABBAUcNACACQagBaiAGQSBqKQMAIAZBMGooAgAQuR8gDCACKQOoASACKAKwARCJBhoLIAZByABqIQYgB0G4f2oiBw0ADAkLCyAHQcgAbCEHA0ACQAJAAkACQCAGKQMAQn18IienQQFqQQAgJ0ICVBsOAwIBAAILIAJBqAFqIAZBEGopAwAgBkEgaigCABC5HyAMIAIpA6gBIAIoArABEIkGGgwCCyACQagBaiAGQRBqKQMAIAZBIGooAgAQuR8gDCACKQOoASACKAKwARCJBhoMAQsgAkGoAWogBkEgaikDACAGQTBqKAIAELkfIAwgAikDqAEgAigCsAEQiQYaCyAGQcgAaiEGIAdBuH9qIgcNAAwICwsgBUEIaiAMEJYHDAYLIAUoAhwiBkUNBSAGIAwQjBkMBQsCQAJAIAUoAggOAwABBgALIAUtACRBAkYNBSACQagBaiAFKQMQIAVBIGooAgAQuR8gBCACKQOoASACKAKwARCJBhoMBQsgBS0AJEECRg0EIAJBqAFqIAUpAxAgBUEgaigCABC5HyAEIAIpA6gBIAIoArABEIkGGgwECyAFKAIEIAwQpQEMAwsgBSgCECIGRQ0CIAYgDBCMGQwCCwJAIAUoAgQiBi0AQQ0AIAJBqAFqIAYpAyggBkE4aigCABC5HyAEIAIpA6gBIAIoArABEIkGGgwCCyACQagBaiAGKQMoIAZBOGooAgAQuR8gDCACKQOoASACKAKwARCJBhoMAQsgBSgCBCAMEKUBCyAFQThqIgUgCEcNAAsLIAJBwANqIQ4CQCACKAKcAyIERQ0AIAJBkANqIQggAkGAAmpBCGpBACkDgIWeATcDACACQQApA/iEngE3A4ACIAIoAoADIgdBCGohBSAHKQMAQn+FQoCBgoSIkKDAgH+DISggAigCjAMhDQJAAkADQCANRQ0BAkAgKEIAUg0AA0AgB0GAf2ohByAFKQMAIScgBUEIaiIGIQUgJ0KAgYKEiJCgwIB/gyInQoCBgoSIkKDAgH9RDQALICdCgIGChIiQoMCAf4UhKCAGIQULIAJBkARqIAggByAoeqdBAXRB8AFxa0FwahDxBiAoQn98ISkCQCACKQOQBCInUA0AIAIoApgEIQYDQCACIAY2AvABIAIgJzcD6AEgAkGoAWogCCACQegBahDxBiACKAKwASEGIAIpA6gBIScgAkGAAmogAikD6AEgAigC8AEQiQYaICdCAFINAAsLIA1Bf2ohDSApICiDISggAigCnAMiBA0ADAILCyACKAKQAyINQQhqIQYgDSkDAEJ/hUKAgYKEiJCgwIB/gyEnIA0hBQNAAkAgJ0IAUg0AA0AgBUGAfmohBSAGKQMAIScgBkEIaiIHIQYgJ0KAgYKEiJCgwIB/gyInQoCBgoSIkKDAgH9RDQALICdCgIGChIiQoMCAf4UhJyAHIQYLIAUgJ3qnQQJ0QeADcWtBYGoQmxQgJ0J/fCAngyEnIARBf2oiBA0ACwJAIAIoApQDIgZFDQAgBkEJaiIFRQ0AIA1B/wEgBfwLAAsgAkEANgKcAyACIAYgBkEBakEDdkEHbCAGQQhJGzYCmAMLIAJBkARqIAJBgAJqENUQIAIoAqgEIQYgAkGoAWpBLGogAkGQBGpBLGooAgA2AgAgAkGoAWpBJGogAkGQBGpBJGopAgA3AgAgAiACKQKsBDcCxAEgAkGAA2ogBkEBakEBdiAGIAIoAowDGyAIEMEnIAJBqAFqQRBqIAJBkARqQRBqKQMANwMAIAJBqAFqQQhqIAJBkARqQQhqKQMANwMAIAIgBjYCwAEgAiACKQOQBDcDqAECQANAIAJBkAJqIAJBqAFqENENIAIpA5ACIidQDQEgAkGAA2ogJyACKAKYAhCJBhoMAAsLIAJBqAFqENsKCyACIAw2ArABIAIgDjYCqAEgAiACQZAEajYCtAEgAiACQYADajYCrAEgASgCICIIRQ0AIAEoAhwhBkEAIQcCQAJAA0AgB0EBaiEFIAJBqAFqIAYQgANFDQEgBkE4aiEGIAUhByAIIAVHDQALQQAhBAwBCyAGEPEFAkAgBSAIRw0AQQEhBAwBCyAGQThqIQYgB0F/cyAIaiEHQQEhBANAAkACQCACQagBaiAGEIADDQAgBhDxBSAEQQFqIQQMAQsgBiAEQUhsaiIFIAYpAwA3AwAgBUEwaiAGQTBqKQMANwMAIAVBKGogBkEoaikDADcDACAFQSBqIAZBIGopAwA3AwAgBUEYaiAGQRhqKQMANwMAIAVBEGogBkEQaikDADcDACAFQQhqIAZBCGopAwA3AwALIAZBOGohBiAHQX9qIgcNAAsLIAEgCCAEazYCIAsgAkGAA2oQtAogAkGAA2pBEGoQuwwgDBC0CiACQbADahC0CiACQQhqELQKIAJBCGpBEGoQuwwgASkDACEnCyACQQA6AAggAUEYaiEOAkACQCAnp0EBcUUNACACQQhqIA4Q3gcMAQsgDiACQQhqEJsJIAEoAiAiBUUNACABKAIcIQYgBUE4bCEFA0AgBiACQQhqEPgEIAZBOGohBiAFQUhqIgUNAAsLIAAtAB0hBiAALQAcIQUgAC0AGSEHIAAoAhQhCEEAIAAoAhAQ9QUhAEEAIAgQ9QUhCCACQYwDakEAKQOAhZ4BIic3AgAgAkHgAGogJzcDACACQcAAaiAnNwMAIAJB0ABqICc3AwAgAkEAKQP4hJ4BIic3AoQDIAJBLGogAkGIA2opAgA3AgAgAkE0aiACQZADaigCADYCACACQgA3AxggAkEANgIIIAIgJzcDWCACICc3AzggAiAnNwNIIAIgAikCgAM3AiQgAkEAOgCkASACIAc6AKMBIAIgCzoAogEgAiAFOgChASACIAY6AKABIAJCBDcDmAEgAkIANwOQASACQoCAgICAATcDiAEgAkIINwOAASACQgA3A3ggAkKAgICAgAE3A3AgAiAINgJsIAIgADYCaAJAAkAgASgCAEEBRw0AIAEoAiAiBUUNASABKAIcIQYgBUEwbCEFA0AgBiACQQhqEKUEIAZBMGohBiAFQVBqIgUNAAwCCwsgASgCICIFRQ0AIAEoAhwhBiAFQThsIQUDQAJAAkAgBigCAEEJRw0AIAZBCGogAkEIahClBAwBCyAGIAJBCGoQ3wELIAZBOGohBiAFQUhqIgUNAAsLAkACQAJAIAIoAkQiD0UNAAJAAkAgAigCPCIGDQBBACEQQfCEngEhDUEAIQZBACEPDAELIAJBgANqQSBBCCAGQQFqEKMSIAIoAoADIQ0gAigCOCEEAkAgAigChAMiEEEJaiIGRQ0AIA0gBCAG/AoAAAsgBEEIaiEGIAQpAwBCf4VCgIGChIiQoMCAf4MhJyAPIQggBCEFA0ACQCAnQgBSDQADQCAFQYB+aiEFIAYpAwAhJyAGQQhqIgchBiAnQoCBgoSIkKDAgH+DIidCgIGChIiQoMCAf1ENAAsgJ0KAgYKEiJCgwIB/hSEnIAchBgsgBSAneqdBAnRB4ANxayIHQWhqKAIAIQACQCAHQWBqKQMAIilCA4NCAFINACAppyILIAsoAgAiC0EBajYCACALQX9MDQQLAkAgB0FwaikDACIoUA0AIAdBeGooAgAhDCAoQgODQgBSDQAgKKciCyALKAIAIgtBAWo2AgAgC0F/TA0ECyAnQn98ICeDIScgDSAHIARraiIHQXhqIAw2AgAgB0FwaiAoNwMAIAdBaGogADYCACAHQWBqICk3AwAgCEF/aiIIDQALIAIoAkAhBgsCQCACKAIIRQ0AIAJBCGoQ4wgLIAIgDzYCFCACIAY2AhAgAiAQNgIMIAIgDTYCCAsCQCABKAIAQQFHDQAgAkEIaiAOEP0EDAILQQBBABD8FRD1BSESEJsgIShBAEEAEPwVEPUFIRMQnCAhKQJAAkAgASgCICIGDQAgKUIDgyEqQQAhBgwBCyABKAIcIgUgBkE4bGohDCACKAJoIRQgKUIDgyEqIAVBOGohACACQZAEakEEaiEVICmnIRYgAkGQBGpBBHIhByACQYADakEEciEIIAJBvQNqIRcgAkGAA2pBHGohGCACLQCgASEZIAJBgANqQQRqIg9BEGohGiACQYADakEYaiELQQAhG0EAIQ0CQAJAA0AgBSEGIAAhBQJAAkACQAJAAkACQCAGKAIAQXpqDgIAAQULIAYoAgQiAC0AQQ0EAkACQAJAAkACQCAAKQMAUA0AIBkOBAIJAQQCCyACQYADaiAAQQhqEKkIIAJBqAFqIAJBgANqEOcGIAYoAgQiAEEwaiIEKQMAISsgBEIANwMAIAApAyghLCAAQgE3AyggAEE4aikDACEtIABBNWpCADcAACAPICw3AgAgD0EIaiArNwIAIBogLTcCACACQagBahDUECEEQQAtAKDxngEaQTgQfSIARQ0NIABBADYCACAAIAIpAoADNwIEIABBADoANCAAIAQ2AjAgAEIANwMoIABBADYCICAAQQxqIAJBgANqQQhqIhwpAgA3AgAgAEEUaiACQYADakEQaiIdKQIANwIAIABBHGogCygCADYCAEEAQQgQoy1BAC0AoPGeARogBigCBCIEKAIkIRAgBCgCICERIAQtAEAhHkEcEH0hBAJAIB4NACAERQ0OIARBgAQ7ARggBEEANgIUIAQgEDYCECAEIBE2AgwgBEEBNgIIIAQgADYCBCAEQQE2AgBBCSEeQREhAAwICyAERQ0NIARCADcCDEEBIR4gBEEBNgIIIAQgADYCBCAEQQE2AgBBAiEAIARBAjoAGSAEQRFqQgA3AAAMBwsCQCAqQgBSDQAgFiAWKAIAIgRBAWo2AgAgBEF/TA0NC0EALQCg8Z4BGkEQEH0iBEUNDCAAKQMAISsgAEIBNwMAIAJB6AFqQRBqIABBEGoiECkDACIsNwMAIAJB6AFqQQhqIABBCGoiACkDACItNwMAIABCADcDACAQQgA3AwAgAiArNwPoASAVQRBqIhwgLDcCACAVQQhqIh0gLTcCACAVICs3AgAgAkGQAmpBCGoiECACQZAEakEIaiIfKQIANwMAIAJBkAJqQRBqIhEgAkGQBGpBEGoiICkCADcDACACQZACakEYaiIeIAJBkARqQRhqIiEoAgA2AgAgAiACKQKQBDcDkAJBAC0AoPGeARpBwAAQfSIARQ0MIABBADYCCCAAQRs2AgAgACACKQOQAjcCDCAAQRRqIBApAwA3AgAgAEEcaiARKQMANwIAIABBJGogHigCADYCACAEIAA2AgwgBEEANgIAQQAtAKDxngEaQcAAEH0iAEUNDCAAQQA6ABwgACATNgIYIABCADcDECAAICk3AwggAEEaNgIAIBhCADcCACAYQQhqQgA3AgAgAkEFOgCYAyACIAA2ApADIAJBATYCjAMgAiAENgKIAyACQQE2AoQDIAJCADcCqAQgAkEDOgCkBCACQQA2AqAEIAJCADcCsAQgAkIANwKYBCACQoCAgIDAADcCkAQgAkEXNgKAAyACQZAEahDpHkEAQQQQmy0gBigCBCIAQTBqIgQpAwAhKyAEQgA3AwAgACkDKCEsIABCATcDKCAAQThqKQMAIS0gAEE1akIANwAAIBUgLDcCACAdICs3AgAgHCAtNwIAIAJBgANqENQQIQRBAC0AoPGeARpBOBB9IgBFDQwgAEEANgIAIAAgAikCkAQ3AgQgAEEAOgA0IAAgBDYCMCAAQgA3AyggAEEANgIgIABBDGogHykCADcCACAAQRRqICApAgA3AgAgAEEcaiAhKAIANgIAQQBBCBCjLUEALQCg8Z4BGiAGKAIEIgQoAiQhECAEKAIgIREgBC0AQCEeQRwQfSEEIB4NASAERQ0MIARBgAQ7ARggBEEANgIUIAQgEDYCECAEIBE2AgwgBEEBNgIIIAQgADYCBCAEQQE2AgBBESEAQQkhHgwFC0EALQCg8Z4BGkEQEH0iEEUNCyAAKQMAISsgAEIBNwMAIAJBkAJqQRBqIABBEGoiBCkDACIsNwMAIAJBkAJqQQhqIABBCGoiACkDACItNwMAIABCADcDACAEQgA3AwAgAiArNwOQAiAaICw3AgAgD0EIaiAtNwIAIA8gKzcCACACQZAEakEIaiIeIAJBgANqQQhqIiIpAgA3AwAgAkGQBGpBEGoiHCACQYADakEQaiIjKQIANwMAIAJBkARqQRhqIh0gCygCADYCACACIAIpAoADNwOQBEEALQCg8Z4BGkHAABB9IgBFDQsgAEEANgIIIABBGzYCACAAIAIpA5AENwIMIABBFGogHikDADcCACAAQRxqIBwpAwA3AgAgAEEkaiAdKAIANgIAIBAgADYCDCAQQQA2AgBBAC0AoPGeARpBwAAQfSIARQ0LQQAhICAAQQA6ABwgACAUNgIYIABCADcDECAAQvHklYvXrpq55QA3AwggAEEaNgIAIAJCADcCmAMgAkEDOgCUAyACQQA2ApADIAJCADcCoAMgAkIANwKIAyACQoCAgIDAADcCgAMgAkGAA2oQ6R5BAEEEEJstAkAgBigCBCIELQBADQBBBSEhQRchJEEAIREMBAsgBCgCNCEgIAQoAjAhIQJAIAQpAygiK0IDg0IAUg0AICunIgQgBCgCACIEQQFqNgIAIARBf0wNDAtBAC0AoPGeARpBwAAQfSIRRQ0LIBFBADoAHCARIBQ2AhggEUIANwMQIBFC8crhg/fNnLrzADcDCCARQRo2AgBBAC0AoPGeARpBwAAQfSIERQ0LIARCADcCMCAEQQU6ABggBCAANgIQQQEhJCAEQQE2AgwgBCAQNgIIIARCl4CAgBA3AwAgBEIANwIcQQAhECAEQQA6ADwgBCAlNgI4IARBJGpCADcCACAhQQh2IR8gK0IgiKchJiArpyEAIAQhJQwDCyAERQ0KIARCADcCDEEBIR4gBEEBNgIIIAQgADYCBCAEQQE2AgBBAiEAIARBAjoAGSAEQRFqQgA3AAAMAwtBACgCuPCeASIGRQ0EIABBJGooAgAhBCAAKAIgIRAgAkGAA2ogBkEDQeCkmwFBwQEQ6gtBAC0AoPGeARogAigChAMhBkEIEH0iAEUNCSAAIAQ2AgQgACAQNgIAIAYoAhwgBkEgaiIQKAIAENksIAZBLGoiBCgCACAGQTBqKAIAEKIjIAYoAiggBCgCABDaLCAEQgQ3AgAgBkIBNwIkIBAgADYCACAGQQE2AhwgAkGQBGpBCGogAkGAA2pBCGooAgA2AgAgAiACKQKAAzcDkAQgAkGQBGoQ9gEgAkGQBGoQ/w0MBAsgAkGAA2pBMGogBkEwaikDADcDACACQYADakEoaiAGQShqKQMANwMAIAJBgANqQSBqIAZBIGopAwA3AwAgCyAGQRhqKQMANwMAIAJBgANqQRBqIAZBEGoiACkDADcDACACQYADakEIaiAGQQhqIgQpAwA3AwAgBEIBNwIAIAIgBikDADcDgAMgBkEJNgIAIABBADYCACAGQRxqIAJBkAJqQQhqKQIANwIAIAZBJGogAkGQAmpBEGopAgA3AgAgBkEsaiACQZACakEYaikCADcCACAGQTRqIAJBkAJqQSBqKAIANgIAIAYgAikCkAI3AhQCQCACKAKAAyIGQQlGDQAgByAIKQIANwIAIAdBMGogCEEwaigCADYCACAHQShqIAhBKGopAgA3AgAgB0EgaiAIQSBqKQIANwIAIAdBGGogCEEYaikCADcCACAHQRBqIAhBEGopAgA3AgAgB0EIaiAIQQhqKQIANwIAIAIgBjYCkAQCQAJAIAZBB0cNACACKAKUBCIGRQ0BAkAgDQ0AIAIpA5gEIScgBiENDAcLIAYQtAEgBkHAAEEIELMWDAYLIAJBkARqELcFC0HUopsBENIsAAsgAkGIA2oQ7QNBxKKbARDSLAALIBcgAi8AkAI7AAAgAiAfOwCZAyACQYADakEbaiAfQRB2OgAAIBdBAmogAkGQAmpBAmotAAA6AAAgAkEAOgC8AyACICU2ArgDIAJCADcDsAMgAiARNgKoAyACQgA3A6ADIAIgIDYCnAMgAiAhOgCYAyACICY2ApQDIAIgADYCkAMgAkEBNgKMAyACIBA2AogDIAJBATYChAMgAiAkNgKAAyAGKAIEIgBBMGoiBCkDACErIARCADcDACAAKQMoISwgAEIBNwMoIABBOGopAwAhLSAAQTVqQgA3AAAgFSAsNwIAIBVBCGogKzcCACAVQRBqIC03AgAgAkGAA2oQ1BAhBEEALQCg8Z4BGkE4EH0iAEUNByAAQQA2AgAgACACKQKQBDcCBCAAQQA6ADQgACAENgIwIABCADcDKCAAQQA2AiAgAEEMaiAeKQIANwIAIABBFGogHCkCADcCACAAQRxqIB0oAgA2AgBBAEEIEKMtQQAtAKDxngEaIAYoAgQiBCgCJCEQIAQoAiAhEUEcEH0iBEUNByAEQYAEOwEYIARBADYCFCAEIBA2AhAgBCARNgIMIARBATYCCCAEIAA2AgQgBEEBNgIAAkACQCAGKAIAQQlGDQAgBhC3BQwBCyAGQQhqEO0DCyAGQQk2AgAgBkERNgIIIAYgBDYCFCAGQQI2AhAgBiACKQKAAzcCGCAGQSBqICIpAgA3AgAgBkEoaiAjKQIANwIAIAZBMGogCykCADcCAAwCCwJAAkAgBigCAEEJRg0AIAYQtwUMAQsgBkEIahDtAwsgBiAeNgIAIAYgBDYCDCAGIAA2AgggBiAENgIUIAZBAjYCECAGIBA2AjQgBiARNgIwIAYgAikCgAM3AhggBkEgaiACQYADakEIaikCADcCACAGQShqIAJBgANqQRBqKQIANwIAIAVBAEE4IAUgDEYiBhtqIQBBASEbIAZFDQIMAwsCQAJAIAYoAgBBCUYNACAGELcFDAELIAZBCGoQ7QMLIAYgHjYCACAGIAQ2AgwgBiAANgIIIAYgBDYCFCAGQQI2AhAgBiAQNgI0IAYgETYCMCAGIAIpAoADNwIYIAZBIGogHCkCADcCACAGQShqIB0pAgA3AgALIAVBOGohACAFIAxHDQALQQAhBiAbQQFxRQ0BC0EALQCg8Z4BGkHIABB9IgdFDQICQCAoQgODQgBSDQAgKKciBiAGKAIAIgZBAWo2AgAgBkF/TA0DCyACEJ0gNwOAAiACQgA3A4gCIAdBCGogAkGAAmoQhSYgB0IANwM4IAdBADoANCAHIBI2AjAgB0IANwMoIAcgKDcDICAHQgA3AwAgB0HAAGpBADoAAEEALQCg8Z4BGkEYEH0iBEUNAiAEQgA3AwggBELh2r2j1o7bMjcDACAEQRBqQgA3AwBBAC0AoPGeARpBEBB9IghFDQJBAC0AoPGeARpBwAAQfSIFRQ0CIAVBAToADCAFQQA2AgggBUIhNwMAQQAtAKDxngEaQcAAEH0iBkUNAiAGQgA3AxggBkKx6snjBjcDECAGQQA2AgggBkEUNgIAIAYgBTYCKCAGQSBqQgA3AwAgCCAGNgIMIAhBADYCAEEALQCg8Z4BGkHAABB9IgZFDQIgBkEAOgAcIAYgEjYCGCAGQgA3AhAgBiAoNwIIIAZBGjYCACACQQU6AJgDIAIgBjYCkAMgAkEBNgKMAyACIAg2AogDIAJBATYChAMgAkIANwKoBCACQQM6AKQEIAJBADYCoAQgAkIANwKwBCACQgA3ApgEIAJCgICAgMAANwKQBCACQaQDakIANwIAIAJCADcCnAMgAkEXNgKAAyACQZAEahDpHkEAQQQQmy0CQCAqQgBSDQAgFiAWKAIAIgZBAWo2AgAgBkF/TA0DCyACQYADahDUECEFQQAtAKDxngEaQTgQfSIGRQ0CIAZBADoANCAGIAU2AjAgBkIANwMoIAZBADYCICAGQQA6ABwgBiATNgIYIAZCADcCECAGICk3AgggBkEANgIAQQBBCBCjLUEALQCg8Z4BGkEcEH0iAEUNAiAAQgA3AgwgAEEBNgIIIAAgBjYCBCAAQQE2AgAgAEECOgAZIABBEWpCADcAACACQfIBaiACQZAEakEIaikCADcBACACQegBakESaiACQZAEakEQaigCADYBACACQZACakEIaiACQYADakEIaikCADcDACACQZACakEQaiIQIAJBgANqQRBqKQIANwMAIAJBkAJqQRhqIhEgAkGAA2pBGGopAgA3AwAgAiACKQKQBDcB6gEgAiACKQKAAzcDkAIgASgCHCELAkACQCABKAIgIg8NAEEAIQUMAQsgCyAPQThsaiEMQQAhBSALIQYDQCAGKAIAQQlHDQEgBkEIaigCAEESRw0BIAZBDGooAgAiCCgCAEEbRw0BIAgoAggNASAFQQFqIQUgBkE4aiIGIAxHDQALIA8hBQsgAiAFIAUgD0G8r5sBENsfIAJBogNqQgA3AQAgASACKAIAIgU2AiAgAkGyA2ogAkHoAWpBCGopAQA3AQAgAkGAA2pBOGogAkH2AWopAQA3AQAgAiAONgKABCACQgA3ApwDIAIgBDYCmAMgAkEBNgKUAyACIAc2ApADIAJCgICAgBA3A4gDIAJCgICAgCA3A4ADIAIgAigCBCIGNgKEBCACIAIpAegBNwGqAyACIA8gBmsiBzYCiAQgAiALIAZBOGxqNgL8AyACIAsgBUE4bGoiCDYC+AMgAkHgA2ogAkGQAmpBCGopAwA3AwAgAkHoA2ogECkDADcDACACQfADaiARKQMANwMAIAIgADYC1AMgAkECNgLQAyACQRE2AsgDIAJBCTYCwAMgAiACKQOQAjcD2AMCQCAFIAZGDQAgBkE4bCAFQThsayEAIAJBkARqQQhqIREgAkGQBGpBBHIiB0EwaiEMIAdBKGoh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BAwUCyAIIAJB5ANqEKcNIAJB5ANqEI0LGiACQQA6AJAFDBILIAggAkHkA2oQpw0gAkHkA2oQjQsaIAJBAToAkAUMEQsgAkHwBGogAkHkA2oQhAEgAigC9AQhASACKALwBCITQSJGDREgAkGwA2pBCGogBEEIaikCACI+NwMAIAJB0ARqQQhqID43AwAgAiAEKQIAIj43A7ADIAIgPjcD0AQgAigCmAUhCyACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEFIAIoAvwEISIgAigC+AQhHiACKAKsBSEMDAwLAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQ1AUgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQcgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDA4LAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQgQMgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQYgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDA0LAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQ0gYgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQUgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDAwLAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkEDNgKwAiACQfAEaiACQeQDaiACQcADaiACQbACahC4BCACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEFIAIoAvwEIQMgAigC+AQhBiACKAL0BCEBIAIoAvAEIhNBIkYNBCACQdAEakEIaiAEQQhqKQIANwMAIAIgBCkCADcD0AQMCwsCQEEkRQ0AIAJBwANqIAJB3AJqQST8CgAACyACQQQ2ArACIAJB8ARqIAJB5ANqIAJBwANqIAJBsAJq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CyADQWhqIQMgEyEBDAELCyABQX9qIQELIAIgATYC8AIMBgsgCiACKQPAAzcCACAKQRBqIAJBwANqQRBqKAIANgIAIApBCGogAkHAA2pBCGopAwA3AgAgAiA+NwLMASACIAM2AsgBIAIgBTYCxAEgAiABNgLAAQwGCyACIAE2AvACIAIoAuQDIQEgBCEGIAghAwwACwsgBkEIaigCACIBDQUMAgtBACEDQQAhAQwGCyAGQQhqKAIAIgFFDQAgAUF/aiEDIAZBBGooAgAiBkEIaiETQQIhAQwFCyACQfAEaiACQeQDaiAFKAIAIBooAgAQWQJAAkAgAigC8AQiAUGAgICAeEYNAEEkRQ0CDAELIAIoAuACIAIoAuQCIgFBFGxqQWxqIQMCQAJAAkADQAJAAkACQAJAIAENAEEAIQEMAQsCQCADQQRqIhgoAgAiBkEERg0AIAFBf2ohEyADKAIAIQUgByADQQhqKQIANwIAIAdBCGogA0EQaigCADYCACACIAY2AoAEIAJBkARqIAJBgARqENMOIAIoApAEQQRGDQMgAkGgBGpBCGogAkGQBGpBCGoiGikCADcDACACIBM2AuQCIAIgAikCkAQiPjcDoAQgPqdBA0YNAgwHCyABQX9qIQELIAIgATYC5AIgAigC5AMiASgCACIDQf////8HTw0EIAEgA0EBajYCACACIAEoAgwiBTYC0AQCQCAFQQFHDQAgASADNgIAIAJB8ARqIAEQsg8gAigC8ARBEEcNBEGA4IQBENIsAAsgAkEANgLwBEEAIAJB0ARqQfDRmwEgAkHwBGpBkOCEARCVIQALIAIoAuQDIQYgAkEPNgLwBCAGIAJB8ARqENoeDAQLIAJB8ARqIAJB5ANqIAUoAgAgBUEEaigCABBZAkAgAigC8AQiAUGAgICAeEYNACACIBM2AuQCQSQNBQwGCyADQWxqIQMgEyEBDAALCyACQcADakEYaiACQfAEakEYaigCADYCACACQcADakEQaiACQfAEakEQaikCADcDACACQcADakEIaiACQfAEakEIaikCADcDACACIAIpAvAENwPAAyAJIAJBwANqELgMQQEhA0GAgICAeCEBDAQLQfDfhAEQ0xoACyACQaAEahDtISEGIAMgBTYCACAYIAIpApAENwIAIBhBCGogGikCADcCAAwGCyAJICBBJPwKAAALQQAhAwsgAkHcAmoQ9iUgAigCxAEhHgJAIANFDQAgAigC3AEhBSACKALYASEGIAIoAtQBIRMgAigC0AEhGCACKALMASEaIAIoAsgBIQQgAigCyAIgAigCzAIQ/xEgAigCxAIgAigCyAIQ9iwCQCACKAK8ASIDIAIoArQBRw0AIAJBtAFqQfjxgwEQjRwLIAIoArgBIANBHGxqIgEgBTYCGCABIAY2AhQgASATNgIQIAEgGDYCDCABIBo2AgggASAENgIEIAEgHjYCACACIANBAWo2ArwBDAcLIAJBOGpBCGogAkGwAmpBCGopAgA3AwAgAiACKQKwAjcDOCACKALkASELIAIpAtwBIT4gAikC1AEhPyACKALQASEHIAIoAswBIQUgAigCyAEhIiACKALIAiACKALMAhD/ESACKALEAiACKALIAhD2LEEAIQNBIiETDAkLIAFBf2ohAyAGQQRqKAIAIgZBCGohE0EDIQEMAQtBASEBQQAhAwsgAiAGNgL0AyACIAE2AvADIAIgA61CIIYgE62ENwL4AyACQfADahDtISEGAkAgAigC5AIiASACKALcAkcNACACQdwCakGUgIgBEI4cCyACKALgAiABQRRsaiIDIAU2AgAgAyACKQLwAzcCBCADQQxqIAJB8ANqQQhqKQIANwIAIAFBAWohAQsgAiABNgLkAiACKALkAyEBIAYhBQwACwsLIAItAIgBISMgAi0AhwEhJyACLQCGASEoIAIoArwBIQYgAigCuAEhAQJAAkAgAi0AgAEiHUEDRg0AIB1BAkYNACACKAJ0Ih8gHygCACIDQQFqNgIAIANBf0wNAiACKAJ8ISkgAigCeCEqDAELCyACLQCFASErIAItAIQBISwgAi0AjQEhLSACLQCMASEuIAItAIsBIS8gAigCcCEwIAIoAmwhMSACKAJoITIgAigCZCEzIAItAIoBITQgAi0AiQEhNSACKAJQITYgAigCTCE3IAIoAmAhOCACKAJcITkgAigCWCE6IAIoAlQhOyACLQCOASE8QQAhGyACQfAEaiAGQQBBBEEEEKgMIAIoAvQEIT0CQCACKALwBEEBRg0AIAIoAvgEIRECQCAGRQ0AIBEhAyAGIQUDQCADIAE2AgAgA0EEaiEDIAFBHGohASAFQX9qIgUNAAsgBiEbC0EAIQUgAkEANgLsBCAC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5AIgAiADNgLgAiACIAU2AtwCIAIgAkGgBWo2AugCIAJB5AJqIRMgAkGAA2ogAkHcAmoQ2wcCQCAFIAMQzCINACACQQA2AtABIAJBATYCxAEgAkGU/IcBNgLAASACQgQ3AsgBIAJBOGogAkHAAWoQvCkNBCACQcABaiACQdwCahDbByACQcADaiACQcABahC1BCACQcABahDOGCACQQE2AsQBIAJBnL+cATYCwAEgAkIBNwLMASACQQQ2AtQEIAIgAkHQBGo2AsgBIAIgAkHAA2o2AtAEAkAgAkE4aiACQcABahC8KQ0AIAJBATYCxAEgAkGk/IcBNgLAASACQgE3AswBIAJB9QA2AtQEIAIgEzYC0AQgAiACQdAEajYCyAEgAkE4aiACQcABahC8KQ0AIAJBwANqEPgsDAcLIAJBwANqEPgsDAQLIAJBsAJqQf4AQc8AEKAVIAJBADYC0AEgAkEBNgLEASACQZT8hwE2AsABIAJCBDcCyAEgAkE4aiACQcABahC8KUUNAQwCCyACQcABakEIaiIBQQA2AgAgAkKAgICAEDcCwAEgAkHAAWpB0MWDAUHixYMBEMMgIBhBCGogASgCADYCACAYIAIpAsABNwIADAwLIAJBAjYCxAEgAkGQ/YcBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQbACajYCwAMgAkE4aiACQcABahC8KQ0AIAJBgARqIAJBgANqELUEIAJBATYCxAEgAkGcv5wBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQYAEajYCwAMCQCACQThqIAJBwAFqELwpDQAgAkECNgLEASACQZD9hwE2AsABIAJCATcCzAEgAkEENgLEAyACIAJBwANqNgLIASACIAJBsAJqNgLAAyACQThqIAJBwAFqELwpDQACQCACKAKUAyIBRQ0AIAJBADYCqAQgAkKAgICAwAA3AqAEIAFBGGwhAyACKAKQAyIFQRBqIQECQANAIANFDQEgAkEFNgLEAyACQcD9hwE2AsADIAJCBDcCzAMgAkELNgLMASACQQs2AsQBIAUoAhQhBiACQQs2AtwBIAJBCzYC1AEgAiABNgLQASACIAFBeGo2AsgBIAIgAUF0ajYCwAEgAiAGQX9qNgLkAyADQWhqIQMgBUEYaiEFIAFB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IAJB+YCAgHg2ArACIAEgFSAKIAJBsAJqEN4jQQEhE0EBIQkMCAsQ4iAhJSACQfqAgIB4NgKwAiACICU3A7gCIAEgFSAKIAJBsAJqEN4jQQEhCQwHCwJAIBRBAXENAEEBIRQgCUEBcSEEQQAhCSAERQ0HEOMgISUgAhDkIDcDwAIgAiAlNwO4AiACQfmAgIB4NgKwAiABIBUgCiACQbACahDeI0EBIQlBASEUDAcLEOUgISUgAkH6gICAeDYCsAIgAiAlNwO4AiABIBUgCiACQbACahDeI0EBIRQMBgsgAkGwAmogASADIBNBAEcgD0EBcRDaAiACKAK0AiEEAkAgAigCsAIiEUGBgICAeEcNACAAQQ02AgAgACAENgIEDAkLIAJB4ANqQRBqIhIgAkHIAmooAgA2AgAgAkHoA2oiDSACQbACakEQaikCADcDACACIAIpArgCNwPgAyARQYCAgIB4Rg0HIAAgAikD4AM3AgwgACAENgIIIAAgETYCBCAAQQk2AgAgAEEcaiASKAIANgIAIABBFGogDSkDADcCAAwICwJAIAZBAXFFDQAgAkGagYCAeDYCsAIgASAVIAogAkGwAmoQ3iMLAkAgDkUNACACQZqBgIB4NgKwAiABIAwgECACQbACahDeIwsgARChCwwBCwJAIAhFDQAgAkGagYCAeDYCsAIgASADIAsgAkGwAmoQ3iMLIAdB/wFxQQNGDQAgASgC3AEhBCABKALYASEFIAJBmoGAgHg2ArACIAEgBSAEIAJBsAJqEN4jCyAAIAEgAxD2DQwFCyAAQQ02AgAgACAENgIEDAQLQQEhEwsgAS8BkAEhBEEBIQYMAAsLAkACQAJAAkAgAS0A4AEiBEEPRg0AAkAgE0UNACAEQXdqDgMCAAIACyACQbACaiABEIAKIAIoArQCIQQCQCACKAKwAiIRQQZHDQAgAEENNgIAIAAgBDYCBAwFCyACQZACakEYaiACQbACakEYaikDADcDACACQZACakEQaiACQbACakEQaikDADcDACACIAIpA7gCNwOYAiACIAQ2ApQCIAIgETYCkAIgEUUhEQwDCyABEKELIAJBsAJqIAEQgAogAigCtAIhBCACKAKwAiIFQQZGDQEgAkG4A2pBEGogAkGwAmpBGGopAwAiJTcDACACQcADaiACQbACakEQaikDACImNwMAIAJB4ANqQRBqICY3AwAgAkHgA2pBGGogJTcDACACIAIpA7gCIiU3A7gDIAIgBDYC5AMgAiAFNgLgAyACICU3A+gDAkAgE0UNACABKALUASEGIAJB44CAgHg2ArACIAEgAyAGIAJBsAJqEN4jCwJAIAJB4ANqEOUVRQ0AIAEoAtQBIQYgAkHkgICAeDYCsAIgASADIAYgAkGwAmoQ3iMLIAJB3AJqIAJB+AFqQQhqKAIANgIAIAJBsAJqQRBqIAJBuANqQQhqKQMANwMAIAJByAJqIAJBuANqQRBqKQMANwMAIAIgAikD+AE3AtQCIAIgBzoA7AIgAiADNgLQAiACQQA6AO8CIAIgEDYC6AIgAiAMNgLkAiACIA42AuACIAIgBDYCtAIgAiAFNgKwAiACIAIpA7gDNwO4AiACIBRBAXE6AO4CIAIgCUEBcToA8AIgAkGAAjsA8QIgAkEAOgDtAiAAIAEgAkGwAmoQngQMBQsQ5iAhJSACIBY2AqQCIAIgFzYCoAIgAiAlNwOYAiACQQA2ApACQQEhEQwBCyAAQQ02AgAgACAENgIEDAELAkAgAS0AkQFBBXYgAS0A4AEiBEH/AXFBCkZxIg1FDQAgARChCyABLQDgASEECwJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQf8BcUUNAAJAIAEtAJEBQSBxRQ0AIARB/wFxIhJBEkYNASASQT5GDQELAkACQCARRQ0AIAEtAOEBIRUCQCACQZgCaiIGQaC6nAFBAxCEIg0AIAZBo7qcAUEDEIQiRQ0BC0EAIQogAUEAEMkRIARB/wFxQQ9GIBVxckEBcUUNAQtBACEGQQEhCiABQQEQyRENAgsgAigCkAINBiACQZgCakGmupwBQQUQhCJFDQYgAS0A4QENBiABLQCRAUEgcUUNBUEBIQUgAkGwAmogAUGsuJwBQQFBABDCBCACKAK0AiEEAkAgAigCsAJFDQAgAEENNgIAIAAgBDYCBAwJCyAERQ0FIAEoAtQBIQQgASgC0AEhBRDnICElIAJC0cLNy+ftGDcDwAIgAiAlNwO4AiACQfmAgIB4NgKwAiABIAUgBCACQbACahDeI0EBIQkMBQsCQCAIRQ0AIAJB+4CAgHg2ArACIAEgAyALIAJBsAJqEN4jCwJAIBMNAAJAIAJBkAJqEOUVDQAgAkHcAmogAkH4AWpBCGoiBCgCADYCACACQbACakEIaiACQZACakEIaikDADcDACACQbACakEQaiACQZACakEQaikDADcDACACQbACakEYaiACQZACakEYaikDADcDACACIAIpA/gBNwLUAiACIAIpA5ACNwOwAiACIAc6AOwCIAIgAzYC0AIgAiANOgDvAiACIBA2AugCIAIgDDYC5AIgAiAONgLgAiACIBRBAXEiBjoA7gIgAiAJQQFxIgk6APACIAJBADsA8QIgAkEAOgDtAiACIAM2ArgDIAJB4ANqQQhqIAQoAgA2AgAgAiACKQP4ATcD4AMgAkEAOgDABCACQQA6AIgDIAEoAogBIQQgAiACQYgDajYC9AMgAiACQcAEajYC8AMgAiACQbgDajYC7AMCQAJAIARBgICAEHENACABIARBgICAEHI2AogBIAJBMGogAkHgA2ogARCVDiACKAIwIQMgASABKAKIAUH///9vcTYCiAEgAigCNCEEDAELIAJBOGogAkHgA2ogARCVDiACKAI8IQQgAigCOCEDCwJAIANBAXFFDQAgAEENNgIAIAAgBDYCBCACQbACahCPJwwQCwJAAkAgAigCsAJBBUYNACABKALUASEDIAIoArgDIQogFEEBcQ0BDAcLIAEoAtQBIRQgAkGwAmpBCGohAyACKAK4AyEKIAIoAsQCIRUCQCAHQf8BcUEDRg0AIAJBtYGAgHg2AuADIAEgCiAVIAogFUkbIAogFSAKIBVLGyACQeADahDeIwsgAkHgA2pBDGogA0EIaigCADYCACAAQQY2AgAgACAJOgApIAAgDToAKCAAIAY6ACcgAEEAOgAlIAAgBzoAJCAAIAQ2AiAgACAUNgIcIAAgCjYCGCAAIBU2AhQgACAFQf8BcUGUAUY6ACYgAiADKQIANwLkAyAAIAIpAuADNwIEIABBDGogAkHgA2pBCGopAgA3AgAMEAsgBCgCGEGAgICAeEYNBSACQaGBgIB4NgLgAyABIAogAyACQeADahDeIwwFCyABLwGQAUGAwABxIgVBDXYgCXFFDQMgASgC1AEhBBDoICElIAJBgoGAgHg2ArACIAIgJTcDuAIgASADIAQgAkGwAmoQ3iMgAS8BkAFBgMAAcSEFDAMLIAEoAtQBIQQgAkHjgICAeDYCsAIgAyAEIAJBsAJqEOAaIQQgAS0A4AFBogFH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DzYCICACQgA3A8ACIAJCATcDuAIgAkIANwPoAiACQQA2ArACIAJCADcD+AIgAkKAgICAgAE3A/ACIAJBgICAgHg2AtACIAJBgAY7AYADIAAgAikD4AM3AiggAEEwaiACQeADakEIaikDADcCACACQbACahC8HSACQfACahDGKCACQdACahCoKgwPCyACQQE2ArQCIAJBkPKbATYCsAIgAkIANwK8AiACIAJBuANqNgK4AiACQbACakGY8psBEOkjAAsgAEENNgIAIAAgBDYCBAsgAkGIA2oQxigMCwsgAkHgA2oQ6RULIAJBwARqEJQoDAILIAEtAOABIgRBAUYNAAJAIARBB0YNACABKALcASEEIAEoAtgBIQMgAkGIA2ogARDUJiACQQE2AuQDIAJBnL+cATYC4AMgAkIBNwLsAyACQbMHNgLEBCACQQc6AOAEIAIgAkHABGo2AugDIAIgAkGgBGo2AsAEIAIgAkHgBGo2AqAEIAJBuANqIAJB4ANqEJMQIAJBzANqIAJBkANqKAIANgIAIAIgAikCiAM3AsQDIAMgBCACQbgDahDgGiEEIAEtAOABQaIBRw0CIAEgARCaLBCnFwwCCyABEKELIAhBHEcNACABLQDgAUH/AXFBAUcNACABKALUASEEIAEoAtABIQggAkG6gICAeDYC4AMgASAIIAQgAkHgA2oQ3iMMAAsLIAIoAqQDIgEgAigCqAMQmSUgAigCoAMgARCdLQsgAEENNgIAIAAgBDYCBAwFCyABIAEQmiwQpxcLIABBDTYCACAAIAQ2AgQMBAsgAEEFNgIAIAJB/ANqIAJByAJqKQMANwIAIAJB9ANqIAJBwAJqKQMANwIAIAJB7ANqIAJBuAJqKQMANwIAIAIgAikDsAI3AuQDAkBBJEUNACAAQQRqIAJB4ANqQST8CgAACyAAIAc6ADkgAEEAOgA4IAAgCToANyAAIA06ADYgACAGOgA1IAAgBUH/AXFBlAFGOgA0IAAgBDYCMCAAIAM2AiwgACAKNgIoDAkLAkAgAS0A4AEiBkEPRw0AIAEQoQsLIAJBsAJqIAEQgAogAigCtAIhBAJAIAIoArACIgVBBkcNACAAQQ02AgAgACAENgIEQQEhBAwFCyACQeADakEYaiACQbACakEYaikDADcDACACQeADakEQaiACQbACakEQaikDADcDACACIAIpA7gCNwPoAyACIAQ2AuQDIAIgBTYC4AMCQAJAAkACQCACQeADahDlFQ0AIBMNAUEBIQQCQCANDQBBACEEIAEtAJEBQSBxRQ0AIAEtAOABQf8BcUEKRw0AIAEQoQtBASEECyACQbACakEYaiACQeADakEYaikDADcDACACQbACakEQaiACQeADakEQaikDADcDACACQbACakEIaiACQeADakEIaikDADcDACACQdwCaiACQfgBakEIaigCADYCACACIAIpA+ADNwOwAiACIAIpA/gBNwLUAiACIAc6AOwCIAIgAzYC0AIgAiAEOgDvAiACIBA2AugCIAIgDDYC5AIgAiAONgLgAiACIBRBAXE6AO4CIAIgCUEBcToA8AIgAiAGQQ9GOgDyAiACQQE6APECQQAhBCACQQA6AO0CIAAgASACQbACahCeBAwICyACQYABaiACQeADahDWISACKAKEASEEIAIoAoABIQMgAkHegICAeDYCsAIgAyAEIAJBsAJqEOAaIQQgAS0A4AFBogFHDQIMAQsgASgC1AEhBCACQeOAgIB4NgKwAiADIAQgAkGwAmoQ4BohBCABLQDgAUGiAUcNAQsgASABEJosEKcXCyAAQQ02AgAgACAENgIEIAJB4ANqEI8nQQEhBAwECwJAAkACQCAKDQAgAkH4AGogAkGQAmoQ1iEgAiACKAJ8Igg2AsQEIAIgAigCeCIPNgLABCACQbACaiABEIAKIAIoArQCIQoCQCACKAKwAiIVQQZGIgRFDQAgAEENNgIAIAAgCjYCBAwHCyACQYgDakEQaiACQbACakEYaikDACIlNwMAIAJBkANqIAJBsAJqQRBqKQMAIiY3AwAgAkG4A2pBEGogJjcDACACQbgDakEYaiAlNwMAIAIgAikDuAIiJTcDiAMgAiAKNgK8AyACIBU2ArgDIAIgJTcDwAMCQCATRQ0AIAJBj4CAgHg2ArACIAEgDyAIIAJBsAJqEN4jCyACQbgDahDlFQ0BDAULIAJBsAJqQQRyIAEQ1CYgAkExNgLEAiACQYTxmwE2AsACIAJBsICAgHg2ArACIAEoAtgBIAEoAtwBIAJBsAJqEOAaIQQgAS0A4AFBogFHDQEgASABEJosEKcXDAELIAJB4oCAgHg2ArACIAEgDyAIIAJBsAJqEN4jDAMLIABBDTYCACAAIAQ2AgQLQQEhBQtBASEEDAILIAJB8ABqIAYQ8RUCQAJAAkACQAJAAkAgAigCcCIGIAIoAnQiE0GgupwBQQMQ4yUNACAGIBNBo7qcAUEDEOMlDQFBoKacAUEoQfTwmwEQ0h4ACyACQdwCaiACQfgBakEIaiIGKAIANgIAIAJBsAJqQRBqIAJBiANqQQhqKQMANwMAIAJByAJqIAJBiANqQRBqKQMANwMAIAIgAikD+AE3AtQCIAIgBzoA7AIgAiADNgLQAiACIA06AO8CIAIgEDYC6AIgAiAMNgLkAiACIA42AuACIAIgCjYCtAIgAiAVNgKwAiACIAIpA4gDNwO4AiACIBRBAXEiCjoA7gIgAiAJQQFxIgk6APACIAJBADsA8QIgAkEBOgDtAiACIAM2AqAEIAJB4ANqQQhqIAYoAgA2AgAgAiACKQP4ATcD4AMgAkEAOgCgAyACQQA6AKwDIAEoAogBIQMgAiACQawDajYC+AMgAiACQaADajYC9AMgAiACQcAEajYC8AMgAiACQaAEajYC7AMCQAJAIANBgICAEHENACABIANBgICAEHI2AogBIAJByABqIAJB4ANqIAEQuA4gAigCSCEGIAEgASgCiAFB////b3E2AogBIAIoAkwhAwwBCyACQdAAaiACQeADaiABELgOIAIoAlQhAyACKAJQIQYLAkAgBkEBcUUNACAAQQ02AgAgACADNgIEIAJBsAJqEI8nDAYLIAEtAJEBQSBxRQ0EIAEtAJIBQf8BcUUNAQwECyACQdwCaiACQfgBakEIaiIGKAIANgIAIAJBsAJqQRBqIAJBiANqQQhqKQMANwMAIAJByAJqIAJBiANqQRBqKQMANwMAIAIgAikD+AE3AtQCIAIgBzoA7AIgAiADNgLQAiACIA06AO8CIAIgEDYC6AIgAiAMNgLkAiACIA42AuACIAIgCjYCtAIgAiAVNgKwAiACIAIpA4gDNwO4AiACIBRBAXEiCjoA7gIgAiAJQQFxIgk6APACIAJBADsA8QIgAkECOgDtAiACIAM2AqAEIAJB4ANqQQhqIAYoAgA2AgAgAiACKQP4ATcD4AMgAkEAOgCgAyACQQA6AKwDIAEoAogBIQMgAiACQawDajYC+AMgAiACQaADajYC9AMgAiACQcAEajYC8AMgAiACQaAEajYC7AMCQAJAIANBgICAEHENACABIANBgICAEHI2AogBIAJB4ABqIAJB4ANqIAEQtw4gAigCYCEGIAEgASgCiAFB////b3E2AogBIAIoAmQhAwwBCyACQegAaiACQeADaiABELcOIAIoAmwhAyACKAJoIQYLAkAgBkEBcUUNACAAQQ02AgAgACADNgIEIAJBsAJqEI8nDAULIAEtAJEBQSBxRQ0CIAEtAJIBQf8BcUUNAQwCCyACQcAAaiACQbACahDWISACKAJEIQYgAigCQCETIAJBgIGAgHg2AuADIAEgEyAGIAJB4ANqEN4jDAILIAJB2ABqIAJBsAJqENYhIAIoAlwhBiACKAJYIRMgAkGAgYCAeDYC4AMgASATIAYgAkHgA2oQ3iMLAkACQAJAIBVBBUYNACABKALUASEGIAIoAqAEIRUgFEEBcQ0BDAILIAEoAtQBIRQgAigCoAQhBiACKALEAiEVAkAgB0H/AXFBA0YNACACQbWBgIB4NgLgAyABIAYgFSAGIBVJGyAGIBUgBiAVSxsgAkHgA2oQ3iMLIAJB4ANqQQxqIAJBiANqQQhqKAIANgIAIABBBjYCACAAIAk6ACkgACANOgAoIAAgCjoAJyAAQQI6ACUgACAHOgAkIAAgAzYCICAAIBQ2AhwgACAGNgIYIAAgFTYCFCACIAIpA4gDNwLkAyAAIAIpAuADNwIEIAAgBUH/AXFBlAFGOgAmIABBDGogAkHgA2pBCGopAgA3AgAMAwsgAygCGEGAgICAeEYNACACQaGBgIB4NgLgAyABIBUgBiACQeADahDeIwsgAEEFNgIAIAJB/ANqIAJByAJqKQMANwIAIAJB9ANqIAJBwAJqKQMANwIAIAJB7ANqIAJBuAJqKQMANwIAIAIgAikDsAI3AuQDAkBBJEUNACAAQQRqIAJB4ANqQST8CgAACyAAIAc6ADkgAEECOgA4IAAgCToANyAAIA06ADYgACAKOgA1IAAgBUH/AXFBlAFGOgA0IAAgAzYCMCAAIAY2AiwgACAVNgIoDAELAkACQAJAIBVBBUYNACABKALUASEGIAIoAqAEIRUgFEEBcQ0BDAILIAEoAtQBIRQgAigCoAQhBiACKALEAiEVAkAgB0H/AXFBA0YNACACQbWBgIB4NgLgAyABIAYgFSAGIBVJGyAGIBUgBiAVSxsgAkHgA2oQ3iMLIAJB4ANqQQxqIAJBiANqQQhqKAIANgIAIABBBjYCACAAIAk6ACkgACANOgAoIAAgCjoAJyAAQQE6ACUgACAHOgAkIAAgAzYCICAAIBQ2AhwgACAGNgIYIAAgFTYCFCACIAIpA4gDNwLkAyAAIAIpAuADNwIEIAAgBUH/AXFBlAFGOgAmIABBDGogAkHgA2pBCGopAgA3AgAMAgsgAygCGEGAgICAeEYNACACQaGBgIB4NgLgAyABIBUgBiACQeADahDeIwsgAEEFNgIAIAJB/ANqIAJByAJqKQMANwIAIAJB9ANqIAJBwAJqKQMANwIAIAJB7ANqIAJBuAJqKQMANwIAIAIgAikDsAI3AuQDAkBBJEUNACAAQQRqIAJB4ANqQST8CgAACyAAIAc6ADkgAEEBOgA4IAAgCToANyAAIA06ADYgACAKOgA1IAAgBUH/AXFBlAFGOgA0IAAgAzYCMCAAIAY2AiwgACAVNgIoC0EBIQULAkACQAJAIAIoApACQQVGDQAgBQ0BDAILIAJBkAJqEI8nDAELIAJBkAJqELwdCyAERQ0CCyACQfgBahCUKAwBCyABKALUASEEIAJB3AJqIAJBlAFqKAIANgIAIAIgAikCjAE3AtQCIAIgBzoA7AIgAiADNgLQAiACQQA6APACIAJBADYC4AIgAkEAOwDxAiACQQA7AO0CIAIgBDYCxAIgAiADNgLAAiACQvHIlZvGrZi55QA3A7gCIAJBADYCsAIgAiAJIAVB/wFxQQpGcToA7wIgACABIAJBsAJqEJ4ECyACQfAEaiQAC+NbAgt/AX4jAEGwAWsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiBEF0aiIFQQcgBUEmSRsOJgABAgMEBQYHCAkKCwwNDg8QEScmJSQjIiEgMR8eHRwbGhkYFxYVAAsgASgCCCEFIANBoAFqIAIgASgCBCIEQQAQiwICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgAyAFNgKoASADIAQ2AqQBIANBATYCoAEgA0GQAWogAiADQaABakGolpwBQQQQug0gAy0AkAFBBEYNMSADKQOQASIOQv8Bg0IEUQ0xCyAOQv8Bg0IEUQ0wIAAgDjcCAAwxCyABKAIUIQYgA0GQAWogAiABKAIQIgdBABCLAgJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINLwsCQCAHRQ0AIANBkAFqIAIgBxCOIyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDS8LIANBADYCoAEgA0GQAWogAiADQaABakHhq5wBQQEQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDS8LIAEoAggiBSABKAIMIghBBHRqQXBqIQlB0iIhCgJAIAhFDQAgCUUNAEHSosAAQdIiIAkoAgBBAkYbIQoLIANBkAFqIAIgByAIIAogCBDMHgJAIAMtAJABQQVGDQAgAykDkAEhDgwtC0EFIAMoApQBEL4oIAhFDSsgA0EoaiAFEIAbIAItAE1BAUYNKiADQZABaiACEIwWIAMtAJABQQRGDSogAykDkAEiDkL/AYNCBFENKgwsCyADQaABaiABQQRqIAIQeyADLQCgAUEERg0uIAMpA6ABIg5C/wGDQgRRDS4gACAONwIADC8LIANBoAFqIAFBCGogAhCyBSADLQCgAUEERg0tIAMpA6ABIg5C/wGDQgRRDS0gACAONwIADC4LIANBoAFqIAIgASgCCCIFQQAQiwICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCAFRQ0AIANBoAFqIAIgBRCOIyADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIAFBBGohBCADQTBqIAEtABAiBRDyJCADKAI0IQsgAygCMCEMAkACQAJAAkAgBUEDSw0AIANBADYCoAEgA0GQAWogAiADQaABaiAMIAsQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQULIAQoAgAgBRCpDQ0BDAMLIANBADYCoAEgA0GQAWogAiADQaABaiAMIAsQug0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQQLIAQoAgAgBRCpDUUNAQsgA0GgAWogAhCXESADLQCgAUEERg0BIAMpA6ABIg5C/wGDQgRRDQEMAgsgAi0ATQ0AIANBoAFqIAIQlxEgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyADQaABaiAEIAIQzi0gAy0AoAFBBEYNLSADKQOgASIOQv8Bg0IEUQ0tCyAOQv8Bg0IEUQ0sIAAgDjcCAAwtCyADQaABaiACIAEoAgQiBUEAEIsCAkACQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkAgBUUNACADQaABaiACIAUQjiMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIAEtABENACADQaABaiABQQxqIAIQzi0CQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQILIANBADYCoAEgA0GQAWogAiADQaABakGn5ZsBQaXlmwEgAS0AEBtBAhC7DSADLQCQAUEERg0tIAMpA5ABIg5C/wGDQgRSDQEMLQsgA0EANgKgASADQZABaiACIANBoAFqQaflmwFBpeWbASABLQAQG0ECELsNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQaABaiABQQxqIAIQzi0gAy0AoAFBBEYNLCADKQOgASIOQv8Bg0IEUQ0sCyAOQv8Bg0IEUQ0rIAAgDjcCAAwsCyADQaABaiACIAEoAgwiBUEAEIsCAkACQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkAgBUUNACADQaABaiACIAUQjiMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BC0EAIQUgA0EANgKoASADQoCAgIDAADcCoAFBfyEEQQQhCiABQQRqIgchCwNAAkAgBEEBaiIMIAMoAqABRw0AIANBoAFqEP0dIAMoAqQBIQoLIAogBWogCzYCACADIARBAmo2AqgBIAVBBGohBSALKAIAIgZBBGohCyAMIQQgBigCAEESRg0AC0EAIQQgAygCpAEhBiADKAKgASEKAkACQANAIAVFDQEgBiAFakF8aigCACELAkAgBA0AIANBkAFqIAsgAhDOLSADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQMLAkAgDCAERg0AIANBkAFqIAIgCxDpAyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQMLIARBAWohBCAFQXxqIQUMAAsLIAYgChDRLSADQaABaiACIAcQ6QMgAy0AoAFBBEYNLCADKQOgASIOQv8Bg0IEUg0BDCwLIAYgChDRLQsgDkL/AYNCBFENKiAAIA43AgAMKwsgA0GgAWogAiABKAIwQQAQiwICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQAJAAkAgBEELRw0AIAFBCGohBQJAAkACQAJAIAEoAgQOAwABAgALIANBoAFqIAUgAhDZAiADLQCgAUEERg0FIAMpA6ABIg5C/wGDQgRSDQIMBQsgA0GgAWogBSACENIBIAMtAKABQQRGDQQgAykDoAEiDkL/AYNCBFINAQwECyADQaABaiABKAIIIAEoAgwgAhDtESADLQCgAUEERg0DIAMpA6ABIg5C/wGDQgRRDQMLIA5C/wGDQgRSDQEMAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBA4LAAECAwQFBgcICQoACyADQaABaiABQQhqIAIQpAogAy0AoAFBBEYNDCADKQOgASIOQv8Bg0IEUg0KDAwLIANBoAFqIAFBCGogAhD2AiADLQCgAUEERg0LIAMpA6ABIg5C/wGDQgRSDQkMCwsgA0GgAWogAUEIaiACEIAHIAMtAKABQQRGDQogAykDoAEiDkL/AYNCBFINCAwKCyADQaABaiABQQRqIAIQ8gcgAy0AoAFBBEYNCSADKQOgASIOQv8Bg0IEUg0HDAkLIANBoAFqIAFBBGogAhCPBCADLQCgAUEERg0IIAMpA6ABIg5C/wGDQgRSDQYMCAsgA0GgAWogAUEEaiACEMAIIAMtAKABQQRGDQcgAykDoAEiDkL/AYNCBFINBQwHCyADQaABaiABQQRqIAIQwQggAy0AoAFBBEYNBiADKQOgASIOQv8Bg0IEUg0EDAYLIANBoAFqIAFBBGogAhCiDSADLQCgAUEERg0FIAMpA6ABIg5C/wGDQgRSDQMMBQsgA0GgAWogAUEEaiACEKUJIAMtAKABQQRGDQQgAykDoAEiDkL/AYNCBFINAgwECyADQaABaiABQQRqIAIQgA4gAy0AoAFBBEYNAyADKQOgASIOQv8Bg0IEUg0BDAMLIANBoAFqIAEoAgQgASgCCCACEO0RIAMtAKABQQRGDQIgAykDoAEiDkL/AYNCBFENAgsgDkL/AYNCBFENAQsgDkL/AYNCBFINAQsCQCACLQBNDQAgA0GgAWogAhCXESADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABaiABLQA8QQJ0IgVBmN6eAWooAgAgBUHY3Z4BaigCABC7DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCACLQBNDQAgA0GgAWogAhCXESADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBoAFqIAFBOGogAhDOLSADLQCgAUEERg0qIAMpA6ABIg5C/wGDQgRRDSoLIA5C/wGDQgRRDSkgACAONwIADCoLIANBoAFqIAFBCGogAhD2AiADLQCgAUEERg0oIAMpA6ABIg5C/wGDQgRRDSggACAONwIADCkLIANBoAFqIAFBCGogAhCAByADLQCgAUEERg0nIAMpA6ABIg5C/wGDQgRRDScgACAONwIADCgLIANBkAFqIAIgASgCECIFQQAQiwICQAJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCAFRQ0AIANBkAFqIAIgBRCOIyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAFBBGogAhDOLQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCACLQBNDQAgA0GQAWogAhCXESADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABakGnmZwBQQEQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkAgAi0ATQ0AIANBkAFqIAIQlxEgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiABQQhqIAIQzi0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkAgAi0ATQ0AIANBkAFqIAIQlxEgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiACIANBoAFqQeCrnAFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCACLQBNDQAgA0GQAWogAhCXESADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAFBDGogAhDOLSADLQCQAUEERg0nIAMpA5ABIg5C/wGDQgRRDScLIA5C/wGDQgRRDSYgACAONwIADCcLIAEoAiAhBCADQaABaiACIAEoAhwiBUEAEIsCAkACQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkAgBUUNACADQaABaiACIAUQjiMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAAkACQAJAAkAgAS0AGCIMQX1qIgtBASALQf8BcUEDSRtB/wFxDgMAAQIACyADQaABaiABKAIQIAEoAhQgAhCMFSADLQCgAUEERg0DIAMpA6ABIg5C/wGDQgRSDQIMAwsgA0EBNgKAASADIAEpAxA3AoQBIANB+ABqIAIgA0GAAWpBzIScAUEGELoNAkACQCADLQB4QQRGDQAgAykDeCIOQv8Bg0IEUg0BCwJAAkAgDA4DBQABBQsgA0EANgKQASADQYABaiACIANBkAFqQciBnAFBARC5DQJAIAMtAIABQQRGDQAgAykDgAEiDkL/AYNCBFINAgsgA0GAAWogAiADQZABakHHj5wBQQYQug0gAy0AgAFBBEYNBCADKQOAASIOQv8Bg0IEUg0BDAQLIANBADYCoAEgA0GAAWogAiADQaABakHIgZwBQQEQuQ0CQCADLQCAAUEERg0AIAMpA4ABIg5C/wGDQgRSDQELIANBgAFqIAIgA0GgAWpB0oScAUEFELoNIAMtAIABQQRGDQMgAykDgAEiDkL/AYNCBFENAwsgDkL/AYNCBFINAQwCCwJAIAFBEGoiCygCACIMKAIAQRhHDQAgA0GgAWogAiAMQQRqQQAQ3QQgAy0AoAFBBEYNAiADKQOgASIOQv8Bg0IEUg0BDAILIANBoAFqIAsgAhDOLSADLQCgAUEERg0BIAMpA6ABIg5C/wGDQgRRDQELIA5C/wGDQgRSDQELAkAgASgCKCILRQ0AIANBoAFqIAsgAhCUCiADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBADYCbCADQaABaiACIANB7ABqQd2rnAFBARC5DQJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgA0GgAWogAiAFIAQgASgCCCABKAIMEKEqAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyADQaABaiACIANB7ABqQdyEngFBARC5DSADLQCgAUEERg0mIAMpA6ABIg5C/wGDQgRRDSYLIA5C/wGDQgRRDSUgACAONwIADCYLIANBoAFqIAIgAUEEakEBEN0EIAMtAKABQQRGDSQgAykDoAEiDkL/AYNCBFENJCAAIA43AgAMJQsgA0GgAWogAiABKAIQIgVBABCLAgJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINBwsCQCAFRQ0AIANBoAFqIAIgBRCOIyADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQcLIAEoAgxBAnQhBSABKAIIIQRBASELA0AgBUUNJAJAIAtBAXENACADQQA2AqABIANBkAFqIAIgA0GgAWpB36ucAUEBELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0JCyACLQBNDQAgA0GgAWogAhCXESADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQgLIANBoAFqIAQgAhDOLQJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINCAsgBEEEaiEEIAVBfGohBUEAIQsMAAsLIANBoAFqIAFBCGogAhCEGCADLQCgAUEERg0iIAMpA6ABIg5C/wGDQgRRDSIgACAONwIADCMLIANBoAFqIAFBCGogAhCzAiADLQCgAUEERg0hIAMpA6ABIg5C/wGDQgRRDSEgACAONwIADCILIAEoAiAhCCADQZABaiACIAEoAhwiBUEAEIsCAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0bCwJAIAVFDQAgA0GQAWogAiAFEI4jIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINGwsgA0EANgKgASADQZABaiACIANBoAFqQeDzmwFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINGwsgASgCDCIKIAEoAhgiDGohBCABKAIUIQYgASgCCCEHQQAhBQNAAkACQAJAIAQgBUYNACAFQQFxDQEgBUEBdiILIAxPDQYgA0GQAWogBiALQQV0aiACEGkgAy0AkAFBBEYNAiADKQOQASIOQv8Bg0IEUg0eDAILIANBkAFqIAIgA0GgAWpB4PObAUEBELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0eCyAIRQ0jIANBkAFqIAIgCBCOIyADLQCQAUEERg0jIAMpA5ABIg5C/wGDQgRRDSMMHQsgA0GQAWogAiADQaABakH085sBQQIQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDR0LIAVBAXYiCyAKTw0DIANBkAFqIAcgC0ECdGogAhDOLQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINHQsgA0GQAWogAiADQaABakGpmZwBQQEQuQ0gAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0cCyAFQQFqIQUMAAsLIAEoAhAhCSADQaABaiACIAEoAgwiBUEAEIsCAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0ZCwJAIAVFDQAgA0GgAWogAiAFEI4jIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINGQsCQAJAIAFBBGoiBSgCACIEKAIAQRhHDQAgA0GgAWogAiAEQQRqQQAQ3QQgAy0AoAFBBEYNASADKQOgASIOQv8Bg0IEUQ0BDBoLIANBoAFqIAUgAhDOLSADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDRkLIANBoAFqIAFBGGogAhCcJgJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINGQsgASgCCCIFKAIcIQ0gA0GQAWogAiAFKAIYIgRBABCLAgJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINFwsCQCAERQ0AIANBkAFqIAIgBBCOIyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRcLIANBADYCoAEgA0GQAWogAiADQaABakHg85sBQQEQrg0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRcLIAUoAggiByAFKAIUIgZqIQsgBSgCECEKIAUoAgQhCEEAIQUDQAJAAkACQAJAAkAgCyAFRg0AIAVBAXENASAFQQF2IgQgBk8NAgJAAkAgCiAEQQV0aiIEKAIIIgxFDQAgA0GQAWogAiAMEI4jIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0E4aiAEEPEVIANBkAFqIAJBAEEAIAMoAjggAygCPBCFDwJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgBCgCDCIERQ0FIANBkAFqIAIgBBCOIyADLQCQAUEERg0FIAMpA5ABIg5C/wGDQgRRDQULIA5C/wGDQgRSDRwMBAsgA0GQAWogAiADQaABakHg85sBQQEQrg0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRwLIA1FDRwgA0GQAWogAiANEI4jIAMtAJABQQRGDRwgAykDkAEiDkL/AYNCBFINGwwcCyADQZABaiACIANBoAFqQfTzmwFBAhCuDQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINGwsgBUEBdiIEIAdPDQEgA0GQAWogCCAEQQJ0aiACEM4tAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0bCyADQZABaiACIANBoAFqQamZnAFBARCuDSADLQCQAUEERg0CIAMpA5ABIg5C/wGDQgRRDQIMGgsgBCAGQdDjmwEQkRUACyAEIAdB4OObARCRFQALIAVBAWohBQwACwsgCyAKQejqmwEQkRUACyALIAxB2OqbARCRFQALIA5C/wGDQgRRDRwgACAONwIADB0LIANBoAFqIAEoAgQgASgCCCACEO0RIAMtAKABQQRGDRsgAykDoAEiDkL/AYNCBFENGyAAIA43AgAMHAsgA0GgAWogAUEEaiACEI8EIAMtAKABQQRGDRogAykDoAEiDkL/AYNCBFENGiAAIA43AgAMGwsgA0GgAWogAUEIaiACEIEJIAMtAKABQQRGDRkgAykDoAEiDkL/AYNCBFENGSAAIA43AgAMGgsgA0GgAWogAUEEaiACEMEIIAMtAKABQQRGDRggAykDoAEiDkL/AYNCBFENGCAAIA43AgAMGQsgA0GgAWogAUEEaiACEIAOIAMtAKABQQRGDRcgAykDoAEiDkL/AYNCBFENFyAAIA43AgAMGAsgA0GgAWogAUEEaiACEMAIIAMtAKABQQRGDRYgAykDoAEiDkL/AYNCBFENFiAAIA43AgAMFwsgA0GgAWogAUEEaiACEKINIAMtAKABQQRGDRUgAykDoAEiDkL/AYNCBFENFSAAIA43AgAMFgsgA0GQAWogAiABKAIIQQAQiwICQAJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0GQAWogAUEEaiACEM4tAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiACEJIRAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQQA2AqABIANBkAFqIAIgA0GgAWpBtoScAUECELMNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiACEJIRAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiACIANBoAFqQZvzmwFBBRCzDSADLQCQAUEERg0VIAMpA5ABIg5C/wGDQgRRDRULIA5C/wGDQgRRDRQgACAONwIADBULIANBoAFqIAFBBGogAhClCSADLQCgAUEERg0TIAMpA6ABIg5C/wGDQgRRDRMgACAONwIADBQLIANBoAFqIAFBBGogAhCPDCADLQCgAUEERg0SIAMpA6ABIg5C/wGDQgRRDRIgACAONwIADBMLIANBoAFqIAEoAgQgAhC6ASADLQCgAUEERg0RIAMpA6ABIg5C/wGDQgRRDREgACAONwIADBILIANBoAFqIAFBCGogAhCjDSADLQCgAUEERg0QIAMpA6ABIg5C/wGDQgRRDRAgACAONwIADBELIANBoAFqIAFBCGogAhCgCiADLQCgAUEERg0PIAMpA6ABIg5C/wGDQgRRDQ8gACAONwIADBALIANBoAFqIAFBBGogAhDyByADLQCgAUEERg0OIAMpA6ABIg5C/wGDQgRRDQ4gACAONwIADA8LIANBoAFqIAIgASgCCCIFQQAQiwICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCAFRQ0AIANBoAFqIAIgBRCOIyADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABakHYppwBQQUQug0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBoAFqIAIQlxECQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBoAFqIAFBBGogAhDOLSADLQCgAUEERg0OIAMpA6ABIg5C/wGDQgRRDQ4LIA5C/wGDQgRRDQ0gACAONwIADA4LIAEtAAwhBCABKAIEIQUCQAJAIAIoAkRFDQAgA0GgAWogAiAFQQAQiwIgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIAVFDQAgA0GgAWogAiAFEI4jIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCAEQQFxRQ0AIANBADYCoAEgA0GQAWogAiADQaABakG+65sBQQsQug0gAy0AkAFBBEYNDiADKQOQASIOQv8Bg0IEUg0BDA4LIANBADYCoAEgA0GQAWogAiADQaABakG065sBQQoQug0gAy0AkAFBBEYNDSADKQOQASIOQv8Bg0IEUQ0NCyAOQv8Bg0IEUQ0MIAAgDjcCAAwNCyADQZABaiACIAEoAgQiBUEAEIsCAkACQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkAgBUUNACADQZABaiACIAUQjiMgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQQA2AqABIANBkAFqIAIgA0GgAWpB3aacAUEFELoNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCwJAIAEtABAiBEUNACADQZABaiACIANBoAFqQd6rnAFBARC7DSADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIAEoAgwiBUUNDAJAAkACQCACIAUQzQYiCw0AAkAgBA0AIAUQ8wgNAgsgAi0ATQ0CIANBkAFqIAIQlxEgAy0AkAFBBEYNAiADKQOQASIOQv8Bg0IEUQ0CDAMLIANBkAFqIAIgA0GgAWpB3aucAUEBELkNIAMtAJABQQRGDQEgAykDkAEiDkL/AYNCBFENAQwCCyADQZABaiACEJcRIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0GQAWogAUEMaiACENkmAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyALRQ0MIANBkAFqIAIgA0GgAWpB3ISeAUEBELkNIAMtAJABQQRGDQwgAykDkAEiDkL/AYNCBFENDAsgDkL/AYNCBFENCyAAIA43AgAMDAsgA0GgAWogAUEIaiACEJsFIAMtAKABQQRGDQogAykDoAEiDkL/AYNCBFENCiAAIA43AgAMCwsgASgCGCEKIANBoAFqIAIgASgCFCILQQAQiwICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCALRQ0AIANBoAFqIAIgCxCOIyADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkACQAJAIAItAE0NACABLQAoRQ0CIANBADYCoAEgA0GQAWogAiADQaABakGmupwBQQUQug0gAy0AkAFBBEYNASADKQOQASIOQv8Bg0IEUg0DDAELQQAhBQJAIAEoAgxBAUcNACABKAIIKAIARSEFCyABLQAoQQFHDQEgA0EANgKgASADQZABaiACIANBoAFqQaa6nAFBBRC6DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAwsgBQ0AIAItAE0NASADQaABaiACEJcRIAMtAKABQQRGDQEgAykDoAEiDkL/AYNCBFENAQwCCyADQaABaiACEJcRIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCABLQApRQ0AIANBADYCoAEgA0GQAWogAiADQaABakHeq5wBQQEQuQ0gAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCwJAAkACQCACLQBNDQAgA0GgAWogAUEgaiACEJsmIAMtAKABQQRGDQEgAykDoAEiDkL/AYNCBFINAwwBCwJAAkAgASgCDEEBRw0AIAEoAggiBSgCAEUNAQsgA0GgAWogAUEgaiACEJsmIAMtAKABQQRGDQEgAykDoAEiDkL/AYNCBFENAQwDCwJAAkAgAigCRCIEDQBBACEFDAELIAQgBSgCFCACKAJIKAIsEQcAIQULIANBoAFqIAFBIGogAhCbJgJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAwtBACEIIAVFDQELIANBADYCoAFBASEIIANBkAFqIAIgA0GgAWpB3aucAUEBELkNIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgASgCCCEJIANBoAFqIAIgCyABKAIMIgdBkAIgBxDMHgJAAkACQCADLQCgAUEFRg0AIAMpA6ABIQ4MAQtBBSADKAKkARC+KAJAIAdFDQAgA0EBOgCAASADQeAAaiAJEK4PIANBADoAkAEgByEEIAkhBUEAIQxBACEGA0ACQAJAAkAgBEUNACADQdgAaiAFEK4PIANBoAFqIAIgCkGQAiAMIAYgA0GQAWogA0GAAWoQrQUCQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQYLIANBoAFqIAUgAhDGBgJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINBgsgAy0AgAENASADQQE6AIABDAILAkAgCSAHQShsakFYaiIFRQ0AIANBwABqIAUQrg8LIANBoAFqIAIgCyAKQZACIAwgBhCNAiADLQCgAUEERg0DIAMpA6ABIg5C/wGDQgRSDQQMAwsgAigCREUNACADQdAAaiAFEI4DIANBoAFqIAIgAygCVEEAEPADIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAwsCQCADLQCQAUUNACACIAIoAixBf2o2AiwgA0EAOgCQAQsgBEF/aiEEIANByABqIAUQrg8gBUEoaiEFQQEhDCADKAJMIQYMAAsLIANBoAFqIAIgCiAHRUGQAhDbEyADLQCgAUEERg0BIAMpA6ABIg5C/wGDQgRRDQELIA5C/wGDQgRSDQELAkAgCEUNACADQQA2AqABIANBkAFqIAIgA0GgAWpB3ISeAUEBELkNIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCABKAIkIgVFDQAgA0EANgKgASADQZABaiACIANBoAFqQeCrnAFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAgsCQCACLQBNDQAgA0GgAWogAhCXESADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQILIANBoAFqIAUgAhCdEgJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAgsgAi0ATQ0AIANBoAFqIAIQlxEgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyADQQA2AqABIANBkAFqIAIgA0GgAWpBmfObAUECELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCwJAAkAgASgCECIFKAIAQYCAgIB4Rg0AIANBoAFqIAIgBUEBEK0GIAMtAKABQQRGDQwgAykDoAEiDkL/AYNCBFENDAwBCyACIAIoAixBAWo2AiwgA0GgAWogBUEEaiACEM4tAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyACIAIoAixBf2o2AiwMCwsgDkL/AYNCBFENCgsgDkL/AYNCBFENCSAAIA43AgAMCgsgDkL/AYNCBFINAQsgCUUNByADQaABaiACIAkQjiMgAy0AoAFBBEYNByADKQOgASIOQv8Bg0IEUQ0HCyAOQv8Bg0IEUQ0GIAAgDjcCAAwHCyAOQv8Bg0IEUQ0FIAAgDjcCAAwGCyADQQA6AGwCQCACLQBNDQAgAiACKAIsQQFqNgIsCyADQQA6AIABIAghBEEAIQtBACEMA0ACQAJAAkAgBEUNACADQSBqIAUQgBsgA0GQAWogAiAGIAogCyAMIANBgAFqIANB7ABqEK0FAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0GCwJAIAUoAgBBAkYNACADQZABaiAFIAIQxwwgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0GCyADLQBsDQEgA0EBOgBsDAILAkAgCUUNACADQQhqIAkQgBsLIANBkAFqIAIgByAGIAogCyAMEI0CIAMtAJABQQRGDQMgAykDkAEiDkL/AYNCBFINBAwDCyACKAJERQ0AQQAhCwJAIAUoAgAiDEECRg0AIANBGGogBUEMaigCABDJAyADKAIcIQsgDEEBcUUNACAFQQRqKAIAIgwgCyAMIAtLGyELCyADQZABaiACIAtBABDwAyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQMLAkAgAy0AgAFFDQAgAiACKAIsQX9qNgIsIANBADoAgAELIARBf2ohBCADQRBqIAUQgBsgBUEQaiEFQQEhCyADKAIUIQwMAAsLIANBkAFqIAIgBiAIRSAKENsTIAMtAJABQQRGDQEgAykDkAEiDkL/AYNCBFENAQsgDkL/AYNCBFINAQsgA0GQAWogAiADQaABakHiq5wBQQEQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIAZFDQEgA0GQAWogAiAGEI4jIAMtAJABQQRGDQEgAykDkAEiDkL/AYNCBFENAQsgDkL/AYNCBFENACAAIA43AgAMAQsCQAJAIAIoAkRFDQAgAyABEMkDIANBoAFqIAIgAygCBEEBEPADIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgAEEEOgAADAELIAAgDjcCAAsgA0GwAWokAAuqYAIKfwF+IwBBsAVrIgUkACABLQDgASEGAkACQAJAIAEvAZABQYDAAHEiB0UNACAGQf8BcUHRAEcNAAJAIAEQ2AkiBkUNACAGLQAAQf0ARw0AIAEQoQsgARChCyAFQZACaiABIAJBARDQASAFKAKUAiEBAkACQCAFKAKQAkEBcUUNAEETIQZBBCEIDAELIABBBjYCCEERIQZBDCEICyAAIAY2AgAgACAIaiABNgIADAILIAEtAOABIQYLIAEoAogBIQgCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkH/AXEiCUHMAEcNACADIAhBgICAgAJxIgpBHXZyDQELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAJQbN/ag4kEAsGDQsQDwsLAAsLCwsHAQ4CCwsLCwsLAwsECwULCAsMCwoJCwsgASgC2AEhCCABEKELAkACQCABKAKIASIGQYAYcUGAGEYNACABIAZBgBhyNgKIASAFQZAEaiABELUvIAEgASgCiAEgBkH/Z3JxNgKIAQwBCyAFQZAEaiABELUvCyAFQaABaiAFQZAEahDZISAFKAKkASEGAkAgBSgCoAFBAXFFDQAgAEETNgIAIAAgBjYCBAw9CyAFIAY2ArgDAkAgAS0A4AFB7wBGDQAgASgC3AEhBiABKALYASEIIAVB8ARqIAEQ1CYgBUEBNgKUBCAFQZy/nAE2ApAEIAVCATcCnAQgBUGzBzYCzAIgBUHvADoAqAMgBSAFQcgCajYCmAQgBSAFQZADajYCyAIgBSAFQagDajYCkAMgBUHIA2ogBUGQBGoQ/RogBUHcA2ogBUH4BGooAgA2AgAgBSAFKQLwBDcC1AMgCCAGIAVByANqEOAaIQYgAS0A4AFBogFGDRIMOwsgARChCwJAIAEtAOABRQ0AIAEoAtwBIQYgASgC2AEhCCAFQZAFaiABENQmIAVBATYClAQgBUGcv5wBNgKQBCAFQgE3ApwEIAVBswc2AswCIAVBADoAqAMgBSAFQcgCajYCmAQgBSAFQZADajYCyAIgBSAFQagDajYCkAMgBUHIA2ogBUGQBGoQ/RogBUHcA2ogBUGYBWooAgA2AgAgBSAFKQKQBTcC1AMgCCAGIAVByANqEOAaIQYgAS0A4AFBogFGDRMMOgsgARChCwJAAkAgASgCiAEiA0HAAHENACABIANBwAByNgKIASAFQZABaiABEP8JIAUoApABIQIgASABKAKIAUG/f3E2AogBIAUoApQBIQMMAQsgBUGYAWogARD/CSAFKAKcASEDIAUoApgBIQILAkAgAkEBcUUNACAAQRM2AgAgACADNgIEDDwLIAUgAzYCqAMgAS0A4AFBAUYNEyABKALcASEGIAEoAtgBIQggBUHoAmogARDUJiAFQQE2ApQEIAVBnL+cATYCkAQgBUIBNwKcBCAFQbMHNgLMAiAFQQE6AMADIAUgBUHIAmo2ApgEIAUgBUGQA2o2AsgCIAUgBUHAA2o2ApADIAVByANqIAVBkARqEP0aIAVB3ANqIAVB8AJqKAIANgIAIAUgBSkC6AI3AtQDIAggBiAFQcgDahDgGiEGIAEtAOABQaIBRw04IAEgARCaLBCnFww4CyABKALYASEJIAEQoQsgASgC2AEhBwJAAkAgAS0A4AEiAkHMAEYNAEEAIQMgAiEGDAELIAEQoQsgAS0A4AEhBiABKALUASELQQEhAwsCQCAGQf8BcUUNACABKALcASEGIAEoAtgBIQggBUHwBGogARDUJiAFQQE2ApQEIAVBnL+cATYCkAQgBUIBNwKcBCAFQbMHNgLsAiAFQQA6AJADIAUgBUHoAmo2ApgEIAUgBUHIAmo2AugCIAUgBUGQA2o2AsgCIAVByANqIAVBkARqEP0aIAVB3ANqIAVB+ARqKAIANgIAIAUgBSkC8AQ3AtQDIAggBiAFQcgDahDgGiEGIAEtAOABQaIBRg0UDDcLIAEQoQsCQAJAIAEoAogBIgZBEHENACABIAZBEHI2AogBIAVBkARqIAMgARDLFSABIAEoAogBQW9xNgKIAQwBCyAFQZAEaiADIAEQyxULIAUoApQEIQgCQCAFKAKQBCIGQQVHDQAgAEETNgIAIAAgCDYCBAw8CyAFIAUpApgEIg83AvACIAUgCDYC7AIgBSAGNgLoAgJAAkACQCABLQDgAUEBRg0AIAEoAtwBIQggASgC2AEhAyAFQZAFaiABENQmIAVBATYClAQgBUGcv5wBNgKQBCAFQgE3ApwEIAVBswc2AswCIAVBAToAqAMgBSAFQcgCajYCmAQgBSAFQZADajYCyAIgBSAFQagDajYCkAMgBUHIA2ogBUGQBGoQ/RogBUHcA2ogBUGQBWpBCGooAgA2AgAgBSAFKQKQBTcC1AMgAyAIIAVByANqEOAaIQggAS0A4AFBogFGDQEMNgsgARChCwJAAkAgASgCiAEiCkGAGHFBgBhGDQAgASAKQYAYcjYCiAEgBUGQBGogARC1LyABIAEoAogBIApB/2dycTYCiAEMAQsgBUGQBGogARC1LwsgBUGoAWogBUGQBGoQ2SEgBSgCrAEhCiAFKAKoAUEBcUUNASAAQRM2AgAgACAKNgIEDDYLIAEgARCaLBCnFww0CyAPQiCIpyEMIA+nIQ0gBSAKNgKoAyABKALUASEOAkACQAJAIAZBfmpBACAGQX1qQQJJGw4DAAIBAAsgBSAINgLMAyAFIAY2AsgDIAUgDTYCkAMgBSAMNgLIAgJAIAMNAEEOIQEgDSECIAwhAyAIIQ0gCiEMIAkhCiAOIQkgAiEODDMLIAVB0oCAgHg2ApAEIAcgCyAFQZAEahDgGiEIIAEtAOABQaIBRg0WDDMLIAJBzABGIQNBECEBIAghBgwxCyAFIA02AswDIAUgCDYCyAMgBSAMNgLIAgJAIAMNAEEPIQEgCCEGDDELIAVB0oCAgHg2ApAEIAcgCyAFQZAEahDgGiEIIAEtAOABQaIBRw0vIAEgARCaLBCnFwwvCyAFQZAEaiABEL8CAkACQCAFKAKQBA0AIAAgBSgClAQ2AgRBEyEBDAELIAAgBSkCkAQ3AgQgAEEUaiAFQaAEaigCADYCAEEIIQEgAEEMaiAFQZAEakEIaikCADcCAAsgACABNgIADDoLIAEoAtgBIQMgARChC0EAIQYCQAJAAkAgAS0A4AEiCEF9ag4EAgEBAgALIAhBowFGDQELIAEtAOEBDQACQAJAIAEoAogBIgZBwABxDQAgASAGQcAAcjYCiAEgBUGwAWogARD/CSAFKAKwASEIIAEgASgCiAFBv39xNgKIASAFKAK0ASEGDAELIAVBuAFqIAEQ/wkgBSgCvAEhBiAFKAK4ASEICyAIQQFxRQ0AIABBEzYCACAAIAY2AgQMOgsgBSAGNgLIAwJAIAEQyBIiCEUNACAAQRM2AgAgACAINgIEIAVByANqEMcrDDoLIAEoAtQBIQgCQCABLQCKAUEIcQ0AIAEtAJABQYABcQ0AIAVBy4CAgHg2ApAEIAEgAyAIIAVBkARqEN4jCyAAIAY2AgwgACAINgIIIAAgAzYCBCAAQQQ2AgAMOQsgASgC2AEhAyABEKELAkAgAS0A4AFFDQAgASgC3AEhBiABKALYASEIIAVBqANqIAEQ1CYgBUEBNgKUBCAFQZy/nAE2ApAEIAVCATcCnAQgBUGzBzYC9AQgBUEAOgC4AyAFIAVB8ARqNgKYBCAFIAVByAJqNgLwBCAFIAVBuANqNgLIAiAFQcgDaiAFQZAEahD9GiAFQdwDaiAFQbADaigCADYCACAFIAUpAqgDNwLUAyAIIAYgBUHIA2oQ4BohBiABLQDgAUGiAUYNEwwsCyABEKELAkACQCABKAKIASIGQcAAcQ0AIAEgBkHAAHI2AogBIAVBwAFqIAEQ/wkgBSgCwAEhCCABIAEoAogBQb9/cTYCiAEgBSgCxAEhBgwBCyAFQcgBaiABEP8JIAUoAswBIQYgBSgCyAEhCAsCQCAIQQFxRQ0AIABBEzYCACAAIAY2AgQMOQsgBSAGNgK0AwJAIAEtAOABQQFGDQAgASgC3AEhBiABKALYASEIIAVBkANqIAEQ1CYgBUEBNgKUBCAFQZy/nAE2ApAEIAVCATcCnAQgBUGzBzYC9AQgBUEBOgC4AyAFIAVB8ARqNgKYBCAFIAVByAJqNgLwBCAFIAVBuANqNgLIAiAFQcgDaiAFQZAEahD9GiAFQdwDaiAFQZgDaigCADYCACAFIAUpApADNwLUAyAIIAYgBUHIA2oQ4BohBiABLQDgAUGiAUYNFAwqCyABEKELIAVBADYC0AIgBUKAgICAwAA3AsgCIAVBADYC8AQCQCABLQDgAUECRg0AIAEoAtwBIQYgASgC2AEhCCAFQZAFaiABENQmIAVBATYClAQgBUGcv5wBNgKQBCAFQgE3ApwEIAVBswc2ArwDIAVBAjoAxwMgBSAFQbgDajYCmAQgBSAFQcADajYCuAMgBSAFQccDajYCwAMgBUHIA2ogBUGQBGoQ/RogBUHcA2ogBUGYBWooAgA2AgAgBSAFKQKQBTcC1AMgCCAGIAVByANqEOAaIQggAS0A4AFBogFHDSkMKAsgARChCwJAAkAgASgCiAEiCEGAEHENACABIAhBgBByNgKIASAFQfAEaiAFQcgCaiABEJ8EIQggASABKAKIAUH/b3E2AogBDAELIAVB8ARqIAVByAJqIAEQnwQhCAsgCA0oAkAgAS0A4AFBA0YNACABKALcASEGIAEoAtgBIQggBUHoAmogARDUJiAFQQE2ApQEIAVBnL+cATYCkAQgBUIBNwKcBCAFQbMHNgK8AyAFQQM6AMcDIAUgBUG4A2o2ApgEIAUgBUHAA2o2ArgDIAUgBUHHA2o2AsADIAVByANqIAVBkARqEP0aIAVB3ANqIAVB8AJqKAIANgIAIAUgBSkC6AI3AtQDIAggBiAFQcgDahDgGiEIIAEtAOABQaIBRg0oDCkLIAEQoQsgACADNgIUIAAgBjYCECAAQQk2AgAgACAFKQLIAjcCBCAAQQxqIAVB0AJqKAIANgIAIAAgASgC1AE2AhgMOAsgASgC2AEhAyABEKELAkAgAS0A4QENAAJAAkAgASgCiAEiBkHAAHENACABIAZBwAByNgKIASAFQdABaiABEP8JIAUoAtABIQggASABKAKIAUG/f3E2AogBIAUoAtQBIQYMAQsgBUHYAWogARD/CSAFKALcASEGIAUoAtgBIQgLAkAgCEEBcUUNACAAQRM2AgAgACAGNgIEDDkLIAUgBjYCkAQCQCABEMgSIghFDQAgAEETNgIAIAAgCDYCBCAFQZAEahDFLAw5CyAAIAM2AgggACAGNgIEIABBCjYCACAAIAEoAtQBNgIMDDgLIAEoAtwBIQYgASgC2AEhCCAFQa6AgIB4NgKQBCAIIAYgBUGQBGoQ4BohBiABLQDgAUGiAUcNJSABIAEQmiwQpxcMJQsgASgC3AEhBiABKALYASEIIAVB9YCAgHg2ApAEIAEgCCAGIAVBkARqEN4jIAVBkARqIAEQmwMCQAJAIAUoApAEQQlGDQAgBUGQBGoQlycMAQsgBUGQBGpBBHIQuQcLIAVBkARqIAEQyg8gBUGQBGoQ3yYgCCAGEPYkIQEgACAGNgIMIAAgCDYCCCAAIAE2AgQgAEESNgIADDYLIAEoAtwBIQYgASgC2AEhCCAFQfWAgIB4NgKQBCABIAggBiAFQZAEahDeIyAFQZAEaiABEMoPIAVBkARqEN8mIAggBhD2JCEBIAAgBjYCDCAAIAg2AgggACABNgIEIABBEjYCAAw1CyABKALYASEDIAEQoQsgBUGQBGogAUEAEI4IIAUoApQEIQYCQCAFKAKQBCIIQYCAgIB4Rw0AIABBEzYCACAAIAY2AgQMNQsgBUHoAmpBEGogBUGQBGpBEGopAgA3AgAgBSAFKQKYBDcC8AIgBSAGNgLsAiAFIAg2AugCIAEoAtgBIQIgBUGQBGogARCbAyAFKAKUBCEGAkACQAJAIAUoApAEIghBCUcNACAAQRM2AgAgACAGNgIEDAELAkBBwABFDQAgBUHIA2pBCGogBUGQBGpBCGpBwAD8CgAACyAFIAY2AswDIAUgCDYCyAMgBUGQBGogARDKDyAFKAKUBCEGIAUoApAEIglBgYCAgHhHDQEgAEETNgIAIAAgBjYCBCAFQcgDahCXJwsgBUHoAmoQySgMNQsgBUGQBWpBCGogBUGQBGpBEGopAgA3AwAgBSAFKQKYBDcDkAUgCUGAgICAeEcNICAIQQhHDSAgBUH1gICAeDYCkAQgASACIAIgBUGQBGoQ3iMMIAsCQCABLQCRAUEgcUUNACABKALcASEGIAEoAtgBIQggBUGrgYCAeDYCkAQgASAIIAYgBUGQBGoQ3iMLIAEoAtwBIQYgASgC2AEhCCAFQcqAgIB4NgKQBCABIAggBiAFQZAEahDODiABKALYASEDIAEQoQsCQCABLQDgAUUNACABKALcASEGIAEoAtgBIQggBUGQBWogARDUJiAFQQE2ApQEIAVBnL+cATYCkAQgBUIBNwKcBCAFQbMHNgL0BCAFQQA6AJADIAUgBUHwBGo2ApgEIAUgBUHIAmo2AvAEIAUgBUGQA2o2AsgCIAVByANqIAVBkARqEP0aIAVB3ANqIAVBmAVqKAIANgIAIAUgBSkCkAU3AtQDIAggBiAFQcgDahDgGiEGIAEtAOABQaIBRg0QDB8LIAEQoQsCQAJAIAEoAogBIgZBwABxDQAgASAGQcAAcjYCiAEgBUHoAWogARD/CSAFKALoASEIIAEgASgCiAFBv39xNgKIASAFKALsASEGDAELIAVB8AFqIAEQ/wkgBSgC9AEhBiAFKALwASEICwJAIAhBAXFFDQAgAEETNgIAIAAgBjYCBAw0CyAFIAY2ApADAkACQAJAIAEtAOABQQFGDQAgASgC3AEhBiABKALYASEIIAVB6AJqIAEQ1CYgBUEBNgKUBCAFQZy/nAE2ApAEIAVCATcCnAQgBUGzBzYC9AQgBUEBOgCoAyAFIAVB8ARqNgKYBCAFIAVByAJqNgLwBCAFIAVBqANqNgLIAiAFQcgDaiAFQZAEahD9GiAFQdwDaiAFQfACaigCADYCACAFIAUpAugCNwLUAyAIIAYgBUHIA2oQ4BohCCABLQDgAUGiAUcNASABIAEQmiwQpxcMAQsgARChCwJAAkAgASgCiAEiCEGAgCBxDQAgASAIQYCAIHI2AogBIAVBkARqIAEQtS8gASABKAKIAUH//19xNgKIAQwBCyAFQZAEaiABELUvCyAFQeABaiAFQZAEahDZISAFKALkASEIIAUoAuABQQFxRQ0BCyAAQRM2AgAgACAINgIEIAVBkANqEMUsDDQLIAAgAzYCDCAAIAg2AgggACAGNgIEIABBAzYCACAAIAEoAtQBNgIQDDMLIAEoAtgBIQMgARChCwJAIAEtAOABRQ0AIAEoAtwBIQYgASgC2AEhCCAFQZAFaiABENQmIAVBATYClAQgBUGcv5wBNgKQBCAFQgE3ApwEIAVBswc2AvQEIAVBADoAkAMgBSAFQfAEajYCmAQgBSAFQcgCajYC8AQgBSAFQZADajYCyAIgBUHIA2ogBUGQBGoQ/RogBUHcA2ogBUGYBWooAgA2AgAgBSAFKQKQBTcC1AMgCCAGIAVByANqEOAaIQYgAS0A4AFBogFGDRAMHQsgARChCwJAAkAgASgCiAEiBkHAAHENACABIAZBwAByNgKIASAFQYACaiABEP8JIAUoAoACIQggASABKAKIAUG/f3E2AogBIAUoAoQCIQYMAQsgBUGIAmogARD/CSAFKAKMAiEGIAUoAogCIQgLAkAgCEEBcUUNACAAQRM2AgAgACAGNgIEDDMLIAUgBjYCkAMCQAJAAkAgAS0A4AFBAUYNACABKALcASEGIAEoAtgBIQggBUHoAmogARDUJiAFQQE2ApQEIAVBnL+cATYCkAQgBUIBNwKcBCAFQbMHNgL0BCAFQQE6AKgDIAUgBUHwBGo2ApgEIAUgBUHIAmo2AvAEIAUgBUGoA2o2AsgCIAVByANqIAVBkARqEP0aIAVB3ANqIAVB8AJqKAIANgIAIAUgBSkC6AI3AtQDIAggBiAFQcgDahDgGiEIIAEtAOABQaIBRw0BIAEgARCaLBCnFwwBCyABEKELAkACQCABKAKIASIIQYAYcUGAGEYNACABIAhBgBhyNgKIASAFQZAEaiABELUvIAEgASgCiAEgCEH/Z3JxNgKIAQwBCyAFQZAEaiABELUvCyAFQfgBaiAFQZAEahDZISAFKAL8ASEIIAUoAvgBQQFxRQ0BCyAAQRM2AgAgACAINgIEIAVBkANqEMUsDDMLIAAgAzYCDCAAIAg2AgggACAGNgIEIABBDDYCACAAIAEoAtQBNgIQDDILAkAgA0UNACAGQf8BcUHRAEYNAQsCQAJAIANFDQAgBkH/AXFB4gBGDQELAkACQCADRQ0AIAZB/wFxQZsBRg0BCwJAAkACQAJAAkACQCAHRQ0AIAZB/wFxQYIBRg0BCwJAIAdFDQAgBkH/AXFBlwFGDQILAkAgB0UNACAGQf8BcUH9AEYNAwsgBkH/AXFBfmoOBQMbGxsEGwsgARDYCSIGRQ0aIAYtAAAQpRVFDRogARCLJw0aIAEoAtgBIQYgARChCyAFQfgAaiABIAYQuwQgBSgCfCEBAkAgBSgCeEEBcUUNACAAQRM2AgAgACABNgIEDDgLIAAgATYCDCAAQQQ2AgggAEERNgIADDcLIAEQ2AkiBkUNGSAGLQAAEKUVRQ0ZIAEQiycNGSABKALYASEGIAEQoQsgBUGAAWogASAGENkJIAUoAoQBIQECQCAFKAKAAUEBcUUNACAAQRM2AgAgACABNgIEDDcLIAAgATYCDCAAQQU2AgggAEERNgIADDYLIAEQ2AkiBkUNGCAGLQAAEKUVRQ0YIAEQiycNGCABKALYASEGIAEQoQsgBUGIAWogASAGQQAQ0AEgBSgCjAEhAQJAIAUoAogBQQFxRQ0AIABBEzYCACAAIAE2AgQMNgsgACABNgIMIABBBjYCCCAAQRE2AgAMNQsCQAJAIAhBgICAgAFxDQAgASAIQYCAgIABcjYCiAEgBUGQBGogARCaLyABIAEoAogBQf////9+cTYCiAEMAQsgBUGQBGogARCaLwsCQAJAIAUoApAEQYCAgIB4Rw0AIAAgBSgClAQ2AgRBEyEBDAELIAAgBSkCkAQ3AgQgAEEUaiAFQaAEaikCADcCACAAQQxqIAVBmARqKQIANwIAQQAhAQsgACABNgIADDQLIAEQoQsgACACNgIEIABBATYCACAAIAEoAtQBNgIIDDMLIAVB8ABqIAEgAkEAELMEIAUoAnQhBiAFKAJwQQFxDRsgBkUNFSAAIAY2AgwgAEEDNgIIIABBETYCAAwyCyABENgJIgYNEwwUCyAFQeAAaiABQQAQ2wIgBSgCZCEBIAUoAmBBAXENESAAIAE2AgwgAEECNgIIIABBETYCAAwwCwJAIAMNACABKALcASEGIAEoAtgBIQggBUGBgICAeDYCkAQgASAIIAYgBUGQBGoQ3iMLIAVByANqIAEgAiACIARBABCMBAJAAkAgBSgCyANBCEcNACAAIAUoAswDNgIEQRMhAQwBCwJAQShFDQAgBUGQBGpBBGogBUHIA2pBKPwKAAALAkBBLEUNACAAQQRqIAVBkARqQSz8CgAAC0ERIQELIAAgATYCAAwwCwJAIAMNACABKALcASEGIAEoAtgBIQggBUGBgICAeDYCkAQgASAIIAYgBUGQBGoQ3iMLIAVBkARqQQhqIARBCGooAgA2AgAgBSAEKQIANwOQBCAFQcgDaiABIAVBkARqEKEsAkACQCAFKALIA0EIRw0AIAAgBSgCzAM2AgRBEyEBDAELAkBBKEUNACAFQZAEakEEaiAFQcgDakEo/AoAAAsCQEEsRQ0AIABBBGogBUGQBGpBLPwKAAALQREhAQsgACABNgIADC8LIAEQoQsCQCABEMgSIgZFDQAgAEETNgIAIAAgBjYCBAwuCyAAIAI2AgQgAEECNgIAIAAgASgC1AE2AggMLQsgARChCwJAAkACQAJAAkACQCABEKogDQAgBUGQBGogASABKAKIASIIQYACcUUgCEGAAXFFEMsDIAUoApAEIQgCQCAFLQCkBCIDQQJHDQAgAEETNgIAIAAgCDYCBAwzCyAFQfACaiIHIAVBkARqQRBqKAIANgIAIAVBkAVqQQJqIAVBkARqQRdqLQAAOgAAIAUgBSkDmAQ3A+gCIAUgBS8ApQQ7AZAFIAUoApQEIQkgARDIEiIKRQ0BIABBEzYCACAAIAo2AgQgCa1CIIYgCK2EIAMQ7ygMMgsgBUECOgDcAyABKALUASEIIAZB/wFxQc0ARg0EQQchBiABLQCJAUEEcUUNAQwRCyAFQcgDakEQaiAHKAIANgIAIAVByANqQRdqIAVBkgVqLQAAOgAAIAUgCTYCzAMgBSAINgLIAyAFIAUpA+gCNwPQAyAFIAM6ANwDIAUgBS8BkAU7AN0DIAEoAtQBIQggBkH/AXFBzQBGDQIgAS0AiQFBBHENAQsgBUGOgYCAeDYCkAQgASACIAggBUGQBGoQ3iNBByEGDA8LQQchBiAFQcgDaiABKAL0ASABKAL4ARCVHw0OIAVBioGAgHg2ApAEIAEgAiAIIAVBkARqEN4jDA4LIAVByANqIAEoAvQBIAEoAvgBEJUfRQ0LC0EGIQYgAS0AiQFBCHENDCAFQYiBgIB4NgKQBCABIAIgCCAFQZAEahDeIwwMCyAKRQ0KIAFBAToAjAIgCEEEcQ0KIAEoAtwBIQYgASgC2AEhCCAFQZOAgIB4NgKQBCABIAggBiAFQZAEahDeIwwKCyABIAEQmiwQpxcMKAsgASABEJosEKcXDCYLIAEQoQsgARCqIBogACAINgIMIAAgBjYCCCAAIAM2AgQgAEENNgIAIAAgASgC1AE2AhAMKAsgASABEJosEKcXDCILIAEgARCaLBCnFwwcCyABIAEQmiwQpxcMGAsgASABEJosEKcXDBULIAEgARCaLBCnFwwOCyABIAEQmiwQpxcMDAsgBUGPgYCAeDYCkAQgASACIAggBUGQBGoQ3iNBBiEGDAELIAEQ2AkiBkUNAyAGLQAAQZsBRw0DIAEoAtgBIQggARChCyAFQdgAaiABIAJBARCzBCAFKAJcIQYCQCAFKAJYQQFxRQ0AIABBEzYCACAAIAY2AgQMIQsCQCAGRQ0AIAAgBjYCDCAAQQM2AgggAEERNgIADCELIAVB0ABqIAFBASAIEKwGIAUoAlQhBgJAIAUoAlBBAXFFDQAgAEETNgIAIAAgBjYCBAwhCwJAAkAgASgCiAEiCEHAAHENACABIAhBwAByNgKIASAFQcAAaiAGIAEQuCAgBSgCQCEGIAEgASgCiAFBv39xNgKIASAFKAJEIQgMAQsgBUHIAGogBiABELggIAUoAkwhCCAFKAJIIQYLAkAgBkEBcUUNACAAQRM2AgAgACAINgIEDCELIAEQqiAaIAAgAjYCCCAAIAg2AgQgAEESNgIAIAAgASgC1AE2AgwMIAsgACAINgIMIAAgAjYCCCAAIAY2AgAgACAFKQPIAzcDECAAQRhqIAVB0ANqKQMANwMAIABBIGogBUHYA2opAwA3AwAMHwsgAEETNgIAIAAgATYCBAweCyAGLQAAEKAbRQ0AIAVB6ABqIAFBABDbAiAFKAJsIQEgBSgCaEEBcUUNASAAQRM2AgAgACABNgIEDB0LAkAgAS0A4AFB+ABHDQAgARDYCSIGRQ0AIAYtAABB3QBHDQAgARCLJ0UNBAsgASgCiAEiBkHAAHENASABIAZBwAByNgKIASAFQTBqIAEQ/wkgBSgCMCEIIAEgASgCiAFBv39xNgKIASAFKAI0IQYMAgsgACABNgIMIABBAjYCCCAAQRE2AgAMGwsgBUE4aiABEP8JIAUoAjwhBiAFKAI4IQgLIAhBAXFFDQEgAEETNgIAIAAgBjYCBAwZCyAFQcgDaiABIAQQ0gsCQAJAIAUoAsgDQQhHDQAgACAFKALMAzYCBEETIQEMAQsCQEEoRQ0AIAVBkARqQQRqIAVByANqQSj8CgAACwJAQSxFDQAgAEEEaiAFQZAEakEs/AoAAAtBESEBCyAAIAE2AgAMGQsgBiEIAkACQAJAAkACQAJAAkACQAJAAkAgBigCAEF0aiIJQQ5HDQAgBUGwAmpBEGoiCCAGQRhqKQMANwMAIAVBsAJqQQhqIgMgBkEQaikDADcDACAFIAYpAwg3A7ACIAEtAOABQQlGDQEgBUGQBGpBFGogCCkDADcCACAFQZAEakEMaiADKQMANwIAIAUgBSkDsAI3ApQEQQhBwAAQxywiCEUNDiAIQRo2AgAgCCAFKQKQBDcCBCAIQQxqIAVBmARqKQIANwIAIAhBFGogBUGgBGopAgA3AgAgCEEcaiAFQagEaigCADYCAAsgBSAINgKoA0EBIQMgCCgCAEEaRw0DIAVBKGogCEEIahDxFQJAIAUoAiggBSgCLEGIn5wBQQkQ4yVFDQAgAS0A4QENAgsgAS0AkQFBIHFFDQMgCCgCGCEKIAgoAhQhByAIKAIQIQMgCCkDCCIPQgODQgBSDQIgD6ciCyALKAIAIgtBAWo2AgAgC0F/Sg0CDA0LIAEQoQsCQAJAIAEoAogBIghBgBBxDQAgASAIQYAQcjYCiAEgACAFQbACaiABENkRIAEgASgCiAFB/29xNgKIAQwBCyAAIAVBsAJqIAEQ2RELQQEhAwwECyAIKAIUIQMgCCgCECEKAkAgCCkDCCIPQgODQgBSDQAgD6ciByAHKAIAIgdBAWo2AgAgB0F/TA0MCyAFQaeAgIB4NgKQBCAFIA83A5gEIAEgCiADIAVBkARqEM4OIAEQqiAaIAAgAjYCCCAAIAg2AgQgAEESNgIAIAAgASgC1AE2AgxBASEDIAlBDkYNAwweCyAFIAo2AqADIAUgBzYCnAMgBSADNgKYAyAFIA83A5ADIAUgCC0AHDoApAMgBUEgaiAFQZADahDxFQJAAkACQAJAAkACQAJAIAUoAiAiCiAFKAIkIgdBqpmcAUEHEOMlDQACQCAKIAdB2vObAUEGEOMlDQAgBUHoAmogASADIAQgBSkDkANBABCdBAwECwJAIAEtAOABQQJGDQAgBUEINgLoAiAFKQOQAxDGIQwDCyAFQagFaiAFQZADakEQaikDADcDACAFQZAFakEQaiAFQZADakEIaikDADcDACAFIAUpA5ADNwOYBSAFQgA3A5AFIAVB8ARqIAEQswggBSgC8AQiB0GAgICAeEYNASAFQcgDakEIaiAFQfQEaiIKQQhqKQIANwMAIAUgCikCADcDyAMgASgC1AEhC0EIQdgAEJ4sIgpFDREgCiAFKQOQBTcDACAKIAc2AiAgCkEYaiAFQZAFakEYaikDADcDACAKQRBqIAVBkAVqQRBqKQMANwMAIApBCGogBUGQBWpBCGopAwA3AwACQEEhRQ0AIApBJGogBUHIA2pBIfwKAAALIApBADoAUiAKQYACOwFQIAogCzYCTCAKIAM2AkggCkECOgBFIAUgCjYC7AIgBUEHNgLoAgwCCyAFQcgDaiABIAMgBBCODCAFKALMAyEDAkAgBSgCyAMiCkEJRg0AIAVB8ARqQRhqIgcgBUHIA2pBIGopAwA3AwAgBUHwBGpBEGoiCyAFQcgDakEYaikDADcDACAFQfAEakEIaiIMIAVByANqQRBqKQMANwMAIAUgBSkD0AM3A/AEAkACQCAKQQhGDQAgBUGQBGpBEGogDCkDADcDACAFQZAEakEYaiALKQMANwMAIAVBkARqQSBqIAcpAwA3AwAgBSADNgKUBCAFIAo2ApAEIAUgBSkD8AQ3A5gEIAVB6AJqIAVBkARqEOUODAELIAVBCDYC6AILIAUpA5ADEMYhDAMLIAUgAzYC7AIgBSkDkAMQxiEMAwsgBSAFKAL0BCIDNgLsAiAFQZAFahCaJiAEEJQoDAILIAQQlCgLIAUoAuwCIQMgBSgC6AIiCkEJRg0AIAVByAJqQRhqIgcgBUHoAmpBIGopAwA3AwAgBUHIAmpBEGoiCyAFQegCakEYaikDADcDACAFQcgCakEIaiIMIAVB6AJqQRBqKQMANwMAIAUgBSkD8AI3A8gCIApBCEYNAiAAIAUpA8gCNwMQIAAgAzYCDCAAIAo2AgggAEERNgIAIABBKGogBykDADcDACAAQSBqIAspAwA3AwAgAEEYaiAMKQMANwMADAELIABBEzYCACAAIAM2AgQLQQAhAwwCC0EAIQMLAkAgAS0AkQFBIHFFDQAgCCgCAEEaRw0AIAVBGGogCEEIahDxFQJAAkACQCAFKAIYIgogBSgCHCIHQZGfnAFBBhDjJQ0AIAogB0GXn5wBQQYQ4yVFDQELIAEtAOABQYIBRw0CDAELIAogB0Gdn5wBQQgQ4yVFDQEgAS0A4AFB/wFxQYIBRw0BCyABEKELIAgoAhQhCiAIKAIQIQggBUGtgYCAeDYCkAQgASAIIAogBUGQBGoQ3iMgBUEQaiABIAIQuwQgBSgCFCEBAkACQCAFKAIQQQFxRQ0AQRMhCEEEIQIMAQsgAEEENgIIQREhCEEMIQILIAAgCDYCACAAIAJqIAE2AgAMAQsCQAJAAkACQCABEKogDQAgASgC3AEhCiABKALYASEHAkAgAS0A4AEiC0FRakH/AXFBDUkNACALQXNqQf8BcUEKSQ0AIAVBCGogCBDJAyAFQbWAgIB4NgKQBCAFIAUpAwg3ApQEIAcgCiAFQZAEahDgGiEIIAEtAOABQaIBRw0EIAEgARCaLBCnFwwECyAFQfWAgIB4NgKQBCABIAcgCiAFQZAEahDeIyAFIAEgCEEAEOENIAUoAgQhCCAFKAIAQQFxDQEgACACNgIIIAAgCDYCBCAAQRI2AgAgACABKALUATYCDCAJQQ5GDQUMCAsgACACNgIIIAAgCDYCBCAAQRI2AgAgACABKALUATYCDCAJQQ5GDQEMBwsgAEETNgIAIAAgCDYCBCAJQQ5GDQMMBgsgBigCAEEaRw0DDAQLIABBEzYCACAAIAg2AgQLIAVBqANqEMUsIAlBDkcNAwsgBigCAEEaRg0BCyAGEMoDCyAGEIgvCyADRQ0YDBcLIABBEzYCACAAIAY2AgQMFgsgAEETNgIAIAAgBjYCBAwVCyAAQRM2AgAgACAGNgIEDBQLIAEoAtQBIQggBUHoBGogBUHoAmpBEGopAgA3AwAgBUHgBGogBUHoAmpBCGopAgA3AwAgBSAFKQLoAjcD2AQCQEHIAEUNACAFQZAEaiAFQcgDakHIAPwKAAALQQhBgAEQxywiAUUNAAJAQeAARQ0AIAEgBUGQBGpB4AD8CgAACyABIAY2AmQgASAJNgJgIAEgCDYCfCABIAM2AnggASAFKQOQBTcDaCABQfAAaiAFQZgFaikDADcDACAAIAE2AgQgAEELNgIADBMLAAsgAEETNgIAIAAgBjYCBAwRCyABIAEQmiwQpxcLIABBEzYCACAAIAg2AgQgBUHIAmoQ1SgMAQsgAEETNgIAIAAgBjYCBAsgBUG0A2oQxSwMDQsgAEETNgIAIAAgBjYCBAwMCyAAQRM2AgAgACAINgIEIAVByAJqEMUsIAVByANqEOYjQQAhCEEBIQAMAgsgACADNgIcIAAgDjYCGCAAIAk2AhQgACAKNgIQIAAgDDYCDCAAIA02AgggACAGNgIEIAAgATYCAAwKCyAAQRM2AgAgACAINgIEIAVByAJqEMcrIAVBkANqEMcrIAVByANqEOUjQQEhCEEAIQALIAVBqANqELkFDAILIABBEzYCACAAIAg2AgQLQQEhAEEBIQgLIAVB7AJqIQECQAJAAkAgBkF+akEAIAZBfWpBAkkbDgMBAgABCyABEOYjIAVB9AJqEMUsDAcLIABFDQYgBUHoAmoQ5SMgBUHoAmpBCGoQxysgBUH0AmoQxysMBgsgCEUNBSABEOYjIAVB9AJqEMUsDAULIABBEzYCACAAIAY2AgQMBAsgAEETNgIAIAAgBjYCBCAFQagDahDFLAwCCyAAQRM2AgAgACAGNgIEDAELIABBEzYCACAAIAY2AgQLIAVBuANqELkFCyAEEJQoCyAFQbAFaiQAC+BSAgx/An4jAEHQAGsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIADhMAAQIDBAUGBwgJCgsMDQ4PEBESAAsgA0HAAGogAUEEaiACEKwaIAMtAEBBBEYNFiADKQNAIg9C/wGDQgRRDRYgACAPNwIADC0LIANBwABqIAEoAgQgAhCVESADLQBAQQRGDSsgAykDQCIPQv8Bg0IEUQ0rIAAgDzcCAAwsCyABKAIIIQQgA0HAAGogAiABKAIEIgVBABCLAgJAAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgAyAENgJIIAMgBTYCRCADQQE2AkAgA0EoaiACIANBwABqQZ2DnAFBCBC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGoQvw0gAy0AKEEERg0rIAMpAygiD0L/AYNCBFENKwsgD0L/AYNCBFENKiAAIA83AgAMKwsCQAJAIAEoAgwiBEUNACADQShqIAIgBBCOIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiACIANBwABqQcKEnAFBBBC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkAgAi0ATQ0AIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3aucAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQRqIAIQzi0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3ISeAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQhqIAIQ1y0gAy0AKEEERg0qIAMpAygiD0L/AYNCBFENKgsgD0L/AYNCBFENKSAAIA83AgAMKgsgA0EoaiACIAEoAgQiBEEAEIsCAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINKAsCQCAERQ0AIANBKGogAiAEEI4jIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSgLIANBADYCQCADQShqIAIgA0HAAGpB3oKcAUEGEL4NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINKAsgASgCDCIERQ0mAkACQAJAIAIgBBDNBiIFDQAgBBDzCA0BIAItAE0NAiADQShqIAIQmREgAy0AKEEERg0CIAMpAygiD0L/AYNCBFENAgwqCyADQShqIAIgA0HAAGpB3aucAUEBELENIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMKQsgA0EoaiACEJkRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSgLIANBKGogBCACEEcCQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0oCyAFRQ0mIANBKGogAiADQcAAakHchJ4BQQEQsQ0gAy0AKEEERg0mIAMpAygiD0L/AYNCBFENJgwnCyADQcAAaiABQRBqIAIQhBgCQAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGpB4KucAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCACLQBNDQAgA0HAAGogAhCZESADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCyADQcAAaiABQShqIAIQ1y0gAy0AQEEERg0oIAMpA0AiD0L/AYNCBFENKAsgD0L/AYNCBFENJyAAIA83AgAMKAsCQCABKAIIIgRFDQAgA0EoaiACIAQQjiMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINJAsgA0EANgJAIANBKGogAiADQcAAakHNgpwBQQUQvg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0kCyABLQAkQQJGDSIgA0EoaiACEJkRAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINJAsgA0EoaiABQRBqIAIQhBggAy0AKEEERg0iIAMpAygiD0L/AYNCBFENIgwjCwJAIAEoAggiBEUNACADQShqIAIgBBCOIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0hCyADQQA2AkAgA0EoaiACIANBwABqQZWDnAFBCBC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSELIAEtACRBAkYNHyADQShqIAIQmRECQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0hCyADQShqIAFBEGogAhCEGCADLQAoQQRGDR8gAykDKCIPQv8Bg0IEUQ0fDCALIANBKGogAiABKAIMIgRBABCLAgJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LAkAgBEUNACADQShqIAIgBBCOIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0eCyADQQA2AkAgA0EoaiACIANBwABqQbqCnAFBAhC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LAkAgAi0ATQ0AIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0eCyADQShqIAIgA0HAAGpB3aucAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsgA0EoaiABQQRqIAIQzi0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0eCyADQShqIAIgA0HAAGpB3ISeAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsCQCACLQBNDQAgA0EoaiACEJkRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LIAEoAggoAgAhBCADQShqIAFBCGogAhDXLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LIAEoAhQiBUUNJCAEDRwgAi0ATQ0cIANBKGogAhCZESADLQAoQQRGDRwgAykDKCIPQv8Bg0IEUQ0cDB0LIAEoAhghBiADQcAAaiACIAEoAhQiBUEAEIsCAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINGwsCQCAFRQ0AIANBwABqIAIgBRCOIyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0bCyADQQA2AiggA0HAAGogAiADQShqQYiDnAFBBhC+DQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDRsLIANBwABqIAIgA0EoakHdq5wBQQEQsQ0CQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0bCyADQcAAaiABQRBqIAIQzi0CQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0bCyADQcAAaiACIANBKGpB3ISeAUEBELENAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINGwsgA0HAAGogAiADQShqQaiZnAFBARCxDQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDRsLIAEoAgghBCADQcAAaiACIAUgASgCDCIHQcEAIAcQzB4CQCADLQBAQQVGDQAgAykDQCEPDBkLQQUgAygCRBC+KAJAIAcNACACLQBNDRggA0HAAGogAhCMFiADLQBAQQRGDRggAykDQCIPQv8Bg0IEUQ0YDBkLIAItAE1BAUYNFiADQcAAaiACEIwWIAMtAEBBBEYNFiADKQNAIg9C/wGDQgRRDRYMGAsgA0EoaiACIAEoAggiBEEAEIsCAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINFQsCQCAERQ0AIANBKGogAiAEEI4jIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDRULIANBADYCQCADQShqIAIgA0HAAGpB1IKcAUEFEL4NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINFQsCQAJAAkAgAiABQQRqIgQoAgAiBhDNBiIFDQAgBhDzCA0BIAItAE0NAiADQShqIAIQmREgAy0AKEEERg0CIAMpAygiD0L/AYNCBFENAgwXCyADQShqIAIgA0HAAGpB3aucAUEBELENIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMFgsgA0EoaiACEJkRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDRULIANBKGogBCACEM4tAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINFQsgBUUNEyADQShqIAIgA0HAAGpB3ISeAUEBELENIAMtAChBBEYNEyADKQMoIg9C/wGDQgRRDRMMFAsgA0HAAGogAiABKAIEIgQoAngiBUEAEIsCAkACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCwJAIAVFDQAgA0HAAGogAiAFEI4jIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBADYCKCADQcAAaiACIANBKGpBw4KcAUEDEL4NAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsCQCACLQBNDQAgA0HAAGogAhCZESADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCyADQcAAaiAEQcgAaiACEKwaAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsCQCAEKAIAQQhGDQACQCACLQBNDQAgA0HAAGogAhCZESADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0CCyADQThqIAIgBCgCQCIFQQAQiwICQAJAIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELAkAgBUUNACADQThqIAIgBRCOIyADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0BCyADQQA2AkAgA0E4aiACIANBwABqQY6DnAFBBRC+DQJAIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELAkAgAi0ATQ0AIANBOGogAhCZESADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0BCwJAIAQoAgBBB0YNACADQThqIAIgA0HAAGpB3aucAUEBELENAkAgAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINAgsgA0E4aiAEIAIQxgYCQCADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0CCyADQThqIAIgA0HAAGpB3ISeAUEBELENIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELAkAgAi0ATQ0AIANBOGogAhCZESADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0BCyADQThqIARBKGogAhCsGiADLQA4QQRGDQEgAykDOCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0BCyAEKAJgQYCAgIB4Rg0iAkAgAi0ATQ0AIANBwABqIAIQmREgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0HAAGogAiADQShqQcaCnAFBBxC+DQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBwABqIARB4ABqIAIQrBogAy0AQEEERg0iIAMpA0AiD0L/AYNCBFENIgsgD0L/AYNCBFENISAAIA83AgAMIgsgA0EoaiACIAEoAgwiBEEAEIsCAkACQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIARFDQAgA0EoaiACIAQQjiMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAakHZgpwBQQUQvg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3aucAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQRqIAIQzi0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3ISeAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQhqIAIQ1y0gAy0AKEEERg0hIAMpAygiD0L/AYNCBFENIQsgD0L/AYNCBFENICAAIA83AgAMIQsgASgCECEFIANBKGogAiABKAIMIgRBABCLAgJAAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCAERQ0AIANBKGogAiAEEI4jIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGpBk4OcAUECEL4NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAEoAggiBCgCACAEQQRqKAIAEMImDQAgAi0ATQ0BIANBKGogAhCZESADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BDAILIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBCGogAhDXLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHZgpwBQQUQvg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIAItAE0NACADQShqIAIQmREgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQd2rnAFBARCxDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEEaiACEM4tAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQdyEngFBARCxDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkAgAi0AUkEBSw0AIANBKGogAiADQcAAahC/DSADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyAFRQ0gIANBKGogAiAFEI4jIAMtAChBBEYNICADKQMoIg9C/wGDQgRRDSALIA9C/wGDQgRRDR8gACAPNwIADCALIANBKGogAiABKAIQIgRBABCLAgJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQ8LAkAgBEUNACADQShqIAIgBBCOIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0PCyADQQA2AkAgA0EoaiACIANBwABqQcCCnAFBAxC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQ8LIANBKGogAiADQcAAakHdq5wBQQEQsQ0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0PCwJAIAEoAgQiBEECRg0AIAFBCGohBQJAAkAgBEEBcUUNACADQShqIAUgAhDOLSADLQAoQQRGDQIgAykDKCIPQv8Bg0IEUg0BDAILIAMgBTYCOCADQShqIANBOGogAhCfGSADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0PCyADQShqIAIgA0HAAGpBuJ+cAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINDwsgASgCGEUNDQJAIAItAE0NACADQShqIAIQmREgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINDwsgA0EoaiABQRhqIAIQzi0gAy0AKEEERw0EDA0LIANBKGogAiABKAIUIgRBABCLAgJAAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCAERQ0AIANBKGogAiAEEI4jIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGpBwIKcAUEDEL4NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQd2rnAFBARCxDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEEaiACEMgMAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAEoAgQgASgCCBCwDg0AIAItAE0NASADQShqIAIQmREgAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQwCCyADQShqIAIQmREgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQZyWnAFBAhC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkACQCABKAIMEPMIDQAgAi0ATQ0BIANBKGogAhCZESADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BDAILIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBDGogAhDOLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHchJ4BQQEQsQ0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBEGogAhDXLSADLQAoQQRGDR4gAykDKCIPQv8Bg0IEUQ0eCyAPQv8Bg0IEUQ0dIAAgDzcCAAweCyADQShqIAIgASgCFCIEQQAQiwICQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0LCwJAIARFDQAgA0EoaiACIAQQjiMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINCwsgA0EANgJAIANBKGogAiADQcAAakHAgpwBQQMQvg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0LCyABLQAcRQ0JIANBKGogAhCZEQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQsLIANBKGogAiADQcAAakHYppwBQQUQvg0gAy0AKEEERg0JIAMpAygiD0L/AYNCBFENCQwKCyABQQhqIQQgASgCCEF+ag4CAwIECyADQcAAaiACIAEoAghBABCLAgJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQYLIANBKGogAigCRCACKAJIIAEoAgwQjSMgA0HAAGogAUEEaiACEM4tAkACQAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBADYCQCADQThqIAIgA0HAAGoQrw0CQCADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0BC0EEIQhCACEQIAMoAihBgICAgHhGDQEgAygCMEEYbCEFIAMoAiwhBEEEIQgDQCAFRQ0CIAItAE0hBgJAAkACQAJAAkAgBEEQai0AAEEBRw0AIAZBAXFFDQEMAwsgBkEBcQ0BIANBwABqIAJBqqWcAUEBEJQQIAMtAEBBBEYNASADKQNAIg9C/wGDQgRRDQEMBQsgA0HAAGogAkGqpZwBQQEQlBAgAy0AQEEERg0BIAMpA0AiD0L/AYNCBFENAQwECwJAIARBCGooAgAiBkUNACADQcAAaiACIAYQjiMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINBAsgA0HAAGogAkHy5JsBQQIQlBACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0ECyADQRhqIAQQ8RUgA0HAAGogAiADKAIYIAMoAhwQlBACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0ECwJAIARBDGooAgAiBkUNACADQcAAaiACIAYQjiMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINBAsgA0HAAGogAhCMFiADLQBAQQRGDQEgAykDQCIPQv8Bg0IEUg0DDAELAkAgBEEIaigCACIGRQ0AIANBwABqIAIgBhCOIyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0DCyADQcAAaiACQfTkmwFBAhCUEAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQMLIANBEGogBBDxFSADQcAAaiACIAMoAhAgAygCFBCUEAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQMLAkAgBEEMaigCACIGQQJNDQAgA0HAAGogAiAGQX5qEI4jIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQMLIANBwABqIAJB9uSbAUECEJQQAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAwsgAi0ATQ0AIANBwABqIAIQkREgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAgsgBEEYaiEEIAVBaGohBQwACwsgD0KAfoMhECAPpyEICyADQShqEJ8qIAhB/wFxQQRHDQYMGgsgAykDKCIPQv8Bg0IEUQ0IDAkLIANBwABqIAQgAhB/AkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFENACAAIA83AgAMGgsgA0EANgJAIANBKGogAiADQcAAahC/DSADLQAoQQRGDRggAykDKCIPQv8Bg0IEUQ0YIAAgDzcCAAwZCyADIAFBDGo2AjggA0HAAGogA0E4aiACEJ8ZAkACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiACIANBwABqEL8NIAMtAChBBEYNGCADKQMoIg9C/wGDQgRRDRgLIAAgDzcCAAwYCyADQcAAaiAEIAIQfyADLQBAQQRGDRYgAykDQCIPQv8Bg0IEUQ0WIAAgDzcCAAwXCyAAQQQ6AAAMFgsgD6ciCEH/AXFBBEYNFCAPQoB+gyEQCyAAIBAgCK1C/wGDhDcCAAwUCwJAIAItAE0NACADQShqIAIQmREgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQd2rnAFBARCxDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEEaiACEMgMAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAEoAgQgASgCCBCwDg0AIAItAE0NASADQShqIAIQmREgAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQwCCyADQShqIAIQmREgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQdKCnAFBAhC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkACQCABKAIMEPMIDQAgAi0ATQ0BIANBKGogAhCZESADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BDAILIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBDGogAhDOLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHchJ4BQQEQsQ0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBEGogAhDXLSADLQAoQQRGDRIgAykDKCIPQv8Bg0IEUQ0SCyAPQv8Bg0IEUQ0RIAAgDzcCAAwSCyADQShqIAIgA0HAAGpBuJ+cAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCABKAIcRQ0AAkAgAi0ATQ0AIANBKGogAhCZESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0CCyADQShqIAFBHGogAhDOLSADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3ISeAUEBELENAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQxqIAIQ1y0gAy0AKEEERg0QIAMpAygiD0L/AYNCBFENEAsgD0L/AYNCBFENDyAAIA83AgAMEAsgA0EoaiACIANBwABqEL8NIAMtAChBBEYNDiADKQMoIg9C/wGDQgRRDQ4LIA9C/wGDQgRRDQ0gACAPNwIADA4LIANBADoAJgJAIAItAE0NACACIAIoAixBAWo2AiwLIANBADoAJyAEQRRqIQQgByEIQQAhCUEAIQoDQAJAAkACQAJAAkACQAJAIAhFDQAgBEF8aiILKAIAIQwgA0HAAGogAiAGQcEAIAkgCiADQSdqIANBJmoQrQUCQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0KCyALKAIAIQogA0HAAGogAiAEQXhqKAIAIglBABCLAgJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQYLAkAgCUUNACADQcAAaiACIAkQjiMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINBgsgBCgCACINRQ0BIANBADYCQCADQThqIAIgA0HAAGpB5IKcAUEEEL4NAkAgAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINBgsgDRDzCA0CIAItAE0NAyADQcAAaiACEJkRIAMtAEBBBEYNAyADKQNAIg9C/wGDQgRRDQMMBQsgA0HAAGogAiAFIAZBwQAgCSAKEI0CIAMtAEBBBEYNByADKQNAIg9C/wGDQgRSDQgMBwsgA0EANgJAIANBOGogAiADQcAAakGEhpwBQQcQvg0gAy0AOEEERg0CIAMpAzgiD0L/AYNCBFENAgwDCyADQcAAaiACEJkRIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQILIANBwABqIAQgAhDOLSADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCwJAIARBdGooAgAiDUEBRw0AIARBcGooAgAiDkEBQeiCnAEQwiogDkEBQfiCnAEQwioLIANBADYCQCADQThqIAIgA0HAAGpB4KucAUEBELENAkAgAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINAQsgA0HAAGogAiAJIAogBEFwaigCACANQcGABRCyBCADLQBAQQRGDQEgAykDQCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0DCwJAAkAgAy0AJg0AIANBAToAJgwBCyACKAJERQ0AIANBwABqIAIgCygCAEEAEPADIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQMLAkAgAy0AJ0UNACACIAIoAixBf2o2AiwgA0EAOgAnCyAIQX9qIQggBEEYaiEEQQEhCSAMIQoMAAsLIANBwABqIAIgBiAHRUHBABDbEyADLQBAQQRGDQEgAykDQCIPQv8Bg0IEUQ0BCyAPQv8Bg0IEUg0BCwJAIAZFDQAgA0HAAGogAiAGQX9qEI4jIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBwABqIAIgA0EoakGpmZwBQQEQsQ0gAy0AQEEERg0JIAMpA0AiD0L/AYNCBFENCQsgD0L/AYNCBFENCCAAIA83AgAMCQsgA0EoaiACIANBwABqQbyCnAFBBBC+DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkACQCAFKAIAIAVBBGooAgAQwiYNACACLQBNDQEgA0EoaiACEJkRIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMAgsgA0EoaiACEJkRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEUaiACENctIAMtAChBBEYNByADKQMoIg9C/wGDQgRRDQcLIA9C/wGDQgRRDQYgACAPNwIADAcLIANBKGogAiADQcAAahC/DSADLQAoQQRGDQUgAykDKCIPQv8Bg0IEUQ0FCyAPQv8Bg0IEUQ0EIAAgDzcCAAwFCyADQShqIAIgA0HAAGoQvw0gAy0AKEEERg0DIAMpAygiD0L/AYNCBFENAwsgD0L/AYNCBFENAiAAIA83AgAMAwsgA0EoaiACIANBwABqEL8NIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQELIA9C/wGDQgRRDQAgACAPNwIADAELAkACQCACKAJERQ0AIANBCGogARDNBSADQcAAaiACIAMoAgxBARDwAyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCwJAIAItAE0NACACKAIAIQEgAkEANgIAIAItADwNACACKAIEIQQgAigCKCACKAIQIAIoAhQQjgkCQCACKAI4RQ0AIAJBADYCNCACIAIoAjBBAWo2AjALIAJBAToAPCABRQ0AIAIgBBDFBQsgAEEEOgAADAELIAAgDzcCAAsgA0HQAGokAAu6UQISfwF+IwBB0ABrIgMkAAJAAkAgAigCMCIERQ0AIANBwABqIAEQkRECQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwCCyADQQA2AkAgA0EoaiABIANBwABqQbzzmwFBBxCwDQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRRDQAgACAVNwIADAILAkACQCAEEPMIDQAgAS0ATQ0BIANBwABqIAEQkREgAy0AQEEERg0BIAMpA0AiFUL/AYNCBFENASAAIBU3AgAMAwsgA0HAAGogARCRESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwCCyADQcAAaiACQTBqIAEQ2SYCQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwCCyADQcAAaiACQThqIAEQnCYgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFENACAAIBU3AgAMAQsCQCACKAIgIgRFDQAgA0HAAGogARCREQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAILIANBADYCQCADQShqIAEgA0HAAGpB6OSbAUEKELANAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFENACAAIBU3AgAMAgsgA0HAAGogARCREQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAILIANBwABqIAEgAigCJCACKAIoIAIoAhwgBBDmBSADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwBCwJAAkACQAJAAkACQAJAIAEtAE0NACADQcAAaiABEJERIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIANBADYCFCADQcAAaiABIANBFGpBqJmcAUEBEK4NAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFENACAAIBU3AgAMBwsgAigCECEFIAIoAighBiADQcAAaiABIAIoAiQiByACKAIUIghBwQAgCBDMHgJAIAMtAEBBBUYNACADKQNAIRUMBQtBBSADKAJEEL4oAkAgCEUNAAJAIAEtAE0NACADQcAAaiABEIwWIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQYLIANBADoAIiABLQBNRQ0CDAMLIAEtAE0NAyADQcAAaiABEIwWIAMtAEBBBEYNAyADKQNAIhVC/wGDQgRRDQMMBAsgACAVNwIADAULIAEgASgCLEEBajYCLAsgA0EAOgAjQQAhCUEAIQRBACEKA0AgCiELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCSAIRg0AIAUgCUHYAGxqIgIgAigCACIKQXxqQQAgCkF7akEISRtBAnRBkN2eAWooAgBqKAIAIQogA0HAAGogASAGQcEAIAQgCyADQSNqIANBImoQrQUCQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0TCyACKAIAIgRBfGpBACAEQXtqQQhJGw4JAQkIBwYFBAMCAQsgA0HAAGogASAHIAZBwQAgBCALEI0CIAMtAEBBBEYNECADKQNAIhVC/wGDQgRSDREMEAsgAigCPCEMIANBwABqIAEgAigCOCINQQAQiwICQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0MCwJAIA1FDQAgA0HAAGogASANEJIjIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQwLIANBwABqIAEgAi0AURD3CQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQwLIANBADYCKCADQcAAaiABIANBKGpBspmcAUELELYNAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINDAsgA0HAAGogASADQShqQd2rnAFBARC3DQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQwLIAIoAkQhDiADQcAAaiABIA0gAigCSCIPQZAKIA8QzB4CQCADLQBAQQVGDQAgAykDQCEVDAoLQQUgAygCRBC+KCAPRQ0IIANBAToAN0EAIQtBACEQQQAhEQNAIANBADoAJCAOIAtBBnRqIQQDQCARIRICQAJAAkACQCAPIAtGDQAgBEEsaiITKAIAIREgA0HAAGogASAMQZAKIBAgEiADQSRqIANBN2oQrQUCQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0QCyAEKAIAQQdGDQEgA0HAAGogBCABEJEJIAMtAEBBBEYNAyADKQNAIhVC/wGDQgRSDQIMAwsgA0HAAGogASANIAxBkAogECASEI0CIAMtAEBBBEYNDSADKQNAIhVC/wGDQgRSDQ4MDQsgEygCACEQIANBwABqIAEgBEEoaigCACISQQAQiwICQAJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIANBwABqIAEgEiAQIARBNGooAgAgBEE4aigCABDYBQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkACQAJAAkACQCAEQT5qLQAADgQAAQIEAAsgA0EANgJAIANBOGogASADQcAAakGRn5wBQQYQsw0gAy0AOEEERg0CIAMpAzgiFUL/AYNCBFENAgwECyADQQA2AkAgA0E4aiABIANBwABqQanzmwFBCRCzDSADLQA4QQRGDQEgAykDOCIVQv8Bg0IEUQ0BDAMLIANBADYCQCADQThqIAEgA0HAAGpBsvObAUEHELMNIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBwABqIAEQkhEgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQCAEQTxqLQAARQ0AIANBADYCQCADQThqIAEgA0HAAGpBpLicAUEIELMNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsgA0HAAGogARCSESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIARBPWotAABFDQAgA0EANgJAIANBOGogASADQcAAakG0uJwBQQgQsw0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQcAAaiABEJIRIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIARBCGohEAJAAkAgBEEcai0AAEECRyIUDQAgBEEQaigCACESDAELIANBCGogEBC1GSADKAIIIRILIANBwABqIAEgEkEAEIsCAkACQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIBQNACADQcAAaiAQIAEQywYgAy0AQEEERg0EIAMpA0AiFUL/AYNCBFINAQwECyADQcAAaiAQIAEQpAogAy0AQEEERg0DIAMpA0AiFUL/AYNCBFENAwsgFUL/AYNCBFENAgsgFUL/AYNCBFENAQsgFUL/AYNCBFINDAsCQAJAIAMtADcNACADQQE6ADcMAQsgASgCREUNACADQcAAaiABIBMoAgBBABDwAyADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0MC0EBIRAgC0EBaiELIARBwABqIQQgAy0AJEUNAAsgASABKAIsQX9qNgIsQQEhEAwACwsgA0EoaiABIAIoAiggAigCLCACKAI0IAIoAjgQ2AUCQAJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBKGogASACLQBIEPcJAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBERQ0AIANBADYCKCADQThqIAEgA0EoakGXn5wBQQYQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBFRQ0AIANBADYCKCADQThqIAEgA0EoakGdn5wBQQgQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBGRQ0AIANBADYCKCADQThqIAEgA0EoakGkuJwBQQgQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsgA0EANgJAIANBKGogASADQcAAakG9mZwBQQgQtg0CQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQShqIAEQlBECQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAAkACQCACQQhqIgQoAgBBBUYNACADQShqIAQgARCKBSADLQAoQQRGDQIgAykDKCIVQv8Bg0IEUg0BDAILIANBKGogAkEQaiABEIEJIAMtAChBBEYNASADKQMoIhVC/wGDQgRRDQELIBVC/wGDQgRSDQELAkAgAigCQEUNACADIAJBwABqNgI4AkAgAi0AR0UNACADQShqIAEgA0HAAGpBsZmcAUEBELcNIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQILIANBKGogASADQcAA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IAMpAygiFUL/AYNCBFINAQsgA0EoaiABIAJBCGoiEUEQQQggESgCACISQQJJG2ooAgBBABCLAgJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgBEUNACADQShqIAEgBBCSIyADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyACKAIwIhBBFGooAgBBDGwhBCAQQRBqKAIAIQsCQANAIARFDQEgA0EoaiALIAEQtgcCQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0DCyALQQxqIQsgBEF0aiEEDAALCyADQShqIAEgAi0AORD3CQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgAi0ANEUNACADQQA2AiggA0E4aiABIANBKGpBl5+cAUEGELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsCQCACLQA4DQAgEC0ARQ0AAkAgEC0ARA0AQQEgEnRBFXENAQsgAS0ATQ0BIANBKGogARCUESADLQAoQQRGDQEgAykDKCIVQv8Bg0IEUQ0BDAILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADVFDQAgA0EANgIoIANBOGogASADQShqQZ2fnAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADdFDQAgA0EANgIoIANBOGogASADQShqQaS4nAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAAkACQAJAAkACQAJAAkACQCACLQA4DgMCAAECCyADQQA2AiggA0E4aiABIANBKGpBoLqcAUEDELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINCQtBASASdEEVcQ0CIAEtAE0NAyADQShqIAEQlBEgAy0AKEEERg0DIAMpAygiFUL/AYNCBFENAwwICyADQQA2AiggA0E4aiABIANBKGpBo7qcAUEDELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINCAtBASASdEEVcQ0DIAEtAE0NBCADQShqIAEQlBEgAy0AKEEERg0EIAMpAygiFUL/AYNCBFENBAwHCyAQLQBFRQ0EIANBADYCKCADQThqIAEgA0EoakGmupwBQQUQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0HCyADQShqIAEQlBEgAy0AKEEERg0EIAMpAygiFUL/AYNCBFENBAwGCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINBQsgA0EoaiARIAEQigUgAy0AKEEERg0DIAMpAygiFUL/AYNCBFENAwwECyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAwsgA0EoaiARIAEQigUgAy0AKEEERg0BIAMpAygiFUL/AYNCBFINAgwBCwJAIBAtAERFDQAgA0EANgIoIANBOGogASADQShqQd6rnAFBARC3DSADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIBEgARCKBSADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADZFDQAgA0EANgIoIANBOGogASADQShqQaeZnAFBARC3DSADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0BCwJAIBAoAjwiBEUNACADQShqIAQgARCGBSADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQd2rnAFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBKGogASAQKAIwIBAoAjQgECgCBCAQKAIIEOMGAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsgA0EoaiABIANBwABqQdyEngFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgECgCQEUNACADIBBBwABqNgI4IANBKGogASADQcAAakHgq5wBQQEQtw0CQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0CCwJAIAEtAE0NACADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAgsgA0EoaiADQThqIAEQpiwgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCAQKAIYQYCAgIB4Rg0AAkAgAS0ATQ0AIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0C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LQAwQQRGDQIgAykDMCIPQv8Bg0IEUQ0CCyAPpyIEQf8BcUEERg0BCyAAIA9CgH6DIAStQv8Bg4Q3AgAMAQsgAyABEOEMIANBMGogAiADKAIEQQEQ8AMCQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUQ0AIAAgDzcCAAwBCyAAQQQ6AAALIANB8ABqJAALyE8CFX8DfiMAQcABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAA4TAAECAwQFBgcICQoLDA0ODxAREgALIAEoAhghAyABKQMQIRcgAkE4aiABQQRqEL0KIABBADYCACAAIAIpAjg3AgQgAiAXNwJEIABBDGogAkHAAGopAgA3AgAgAiADNgJMIABBFGogAkHIAGopAgA3AgAMGAsgACABKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMFwsgACABKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMFgsgASkCDCEXIAEoAgQhBBD6JyEDIAJBOGogBBBCIANBOGogAkE4akE4aikDADcDACADQTBqIAJBOGpBMGopAwA3AwAgA0EoaiACQThqQShqIgUpAwA3AwAgA0EgaiACQThqQSBqIgYpAwA3AwAgA0EYaiACQThqQRhqIgcpAwA3AwAgA0EQaiACQThqQRBqIggpAwA3AwAgA0EIaiACQThqQQhqIgkpAwA3AwAgAyACKQM4NwMAEIEoIQQgAkE4aiABKAIIEEwgBEEoaiAFKQMANwMAIARBIGogBikDADcDACAEQRhqIAcpAwA3AwAgBEEQaiAIKQMANwMAIARBCGogCSkDADcDACAEIAIpAzg3AwAgACAXNwIMIAAgBDYCCCAAIAM2AgQgAEEDNgIADBULIAEoAgghAyABKAIEIQQCQAJAIAEoAgwiBQ0AQQAhAQwBCxD6JyEBIAJBOGogBRBCIAFBOGogAkE4akE4aikDADcDACABQTBqIAJBOGpBMGopAwA3AwAgAUEoaiACQThqQShqKQMANwMAIAFBIGogAkE4akEgaikDADcDACABQRhqIAJBOGpBGGopAwA3AwAgAUEQaiACQThqQRBqKQMANwMAIAFBCGogAkE4akEIaikDADcDACABIAIpAzg3AwALIAAgATYCDCAAIAM2AgggACAENgIEIABBBDYCAAwUCyABKAIgIQQgASgCHCEFIAEoAhghBiABKAIMIQcgASgCCCEIAkAgASkDECIXQgODQgBSDQAgF6ciAyADKAIAIgNBAWo2AgAgA0F/TA0VCyABLQAkIQkQgSghAyACQThqIAEoAigQTCADQShqIAJBOGpBKGopAwA3AwAgA0EgaiACQThqQSBqKQMANwMAIANBGGogAkE4akEYaikDADcDACADQRBqIAJBOGpBEGopAwA3AwAgA0EIaiACQThqQQhqKQMANwMAIAMgAikDODcDACAAIAM2AiggACAJOgAkIAAgBDYCICAAIAU2AhwgACAGNgIYIAAgFzcDECAAIAc2AgwgACAINgIIIABBBTYCAAwTCyABKAIMIQMgASgCCCEEIAEtACQiBUECRw0MDA0LIAEoAgwhAyABKAIIIQQgAS0AJCIFQQJHDQ0MDgsgASgCECEKIAEoAgwhCyABKAIEIQQQ+ichAyACQThqIAQQQiADQThqIAJBOGpBOGopAwA3AwAgA0EwaiACQThqQTBqKQMANwMAIANBKGogAkE4akEoaiIFKQMANwMAIANBIGogAkE4akEgaiIGKQMANwMAIANBGGogAkE4akEYaiIHKQMANwMAIANBEGogAkE4akEQaiIIKQMANwMAIANBCGogAkE4akEIaiIJKQMANwMAIAMgAikDODcDABCBKCEEIAJBOGogASgCCBBMIARBKGogBSkDADcDACAEQSBqIAYpAwA3AwAgBEEYaiAHKQMANwMAIARBEGogCCkDADcDACAEQQhqIAkpAwA3AwAgBCACKQM4NwMAAkACQCABKAIUIgwNAEEAIQEMAQsQgSghASACQThqIAwQTCABQShqIAUpAwA3AwAgAUEgaiAGKQMANwMAIAFBGGogBykDADcDACABQRBqIAgpAwA3AwAgAUEIaiAJKQMANwMAIAEgAikDODcDAAsgACABNgIUIAAgCjYCECAAIAs2AgwgACAENgIIIAAgAzYCBCAAQQg2AgAMEAsgASgCGCENIAEoAhQhDiABKAIQIQMQ+ichDyACQThqIAMQQiAPQThqIAJBOGpBOGopAwA3AwAgD0EwaiACQThqQTBqKQMANwMAIA9BKGogAkE4akEoaikDADcDACAPQSBqIAJBOGpBIGopAwA3AwAgD0EYaiACQThqQRhqKQMANwMAIA9BEGogAkE4akEQaikDADcDACAPQQhqIAJBOGpBCGopAwA3AwAgDyACKQM4NwMAIAEoAgghBiACQThqIAEoAgwiEEEEQRgQlQ8gAigCPCERIAIoAjhBAUYNDSACKAJAIRICQCARRQ0AIAYgEEEYbGohE0EAIQogESEUA0AgBiATRg0BIAYoAhAhFSAGKAIMIRYCQAJAIAYoAhQiAQ0AQQAhBwwBCxD6JyEHIAJBOGogARBCIAdBOGogAkE4akE4aikDADcDACAHQTBqIAJBOGpBMGopAwA3AwAgB0EoaiACQThqQShqKQMANwMAIAdBIGogAkE4akEgaikDADcDACAHQRhqIAJBOGpBGGopAwA3AwAgB0EQaiACQThqQRBqKQMANwMAIAdBCGogAkE4akEIaikDADcDACAHIAIpAzg3AwALIAYoAgQhAyACQThqIAYoAggiC0EIQTAQlQ8gAigCPCEJIAIoAjhBAUYNECASIApBGGxqIQggAigCQCEMAkAgCUUNACALQTBsIQQgDCEBIAkhBQNAIARFDQEgAkE4aiADEEwgAUEoaiACQThqQShqKQMANwMAIAFBIGogAkE4akEgaikDADcDACABQRhqIAJBOGpBGGopAwA3AwAgAUEQaiACQThqQRBqKQMANwMAIAFBCGogAkE4akEIaikDADcDACABIAIpAzg3AwAgAUEwaiEBIARBUGohBCADQTBqIQMgBUF/aiIFDQALCyAKQQFqIQogBkEYaiEGIAggBzYCFCAIIBU2AhAgCCAWNgIMIAggCzYCCCAIIAw2AgQgCCAJNgIAIBRBf2oiFA0ACwsgACANNgIYIAAgDjYCFCAAIA82AhAgACAQNgIMIAAgEjYCCCAAIBE2AgQgAEEJNgIADA8LIAEpAwghFyABKAIEIQMQ+ichASACQThqIAMQQiABQThqIAJBOGpBOGopAwA3AwAgAUEwaiACQThqQTBqKQMANwMAIAFBKGogAkE4akEoaikDADcDACABQSBqIAJBOGpBIGopAwA3AwAgAUEYaiACQThqQRhqKQMANwMAIAFBEGogAkE4akEQaikDADcDACABQQhqIAJBOGpBCGopAwA3AwAgASACKQM4NwMAIAAgFzcDCCAAIAE2AgQgAEEKNgIADA4LQQAtAKDxngEaIAEoAgQhA0GAARB9IgFFDQ4gAygCfCEIIAMoAnghCSADKQJUIRcgAygCXCEEIAJBCGogA0HIAGoQvQogAiAENgIcIAIgFzcCFEEIIQQCQCADKAIAIgdBCEYNAEEHIQQgAygCRCEGIAMoAkAhBQJAIAdBB0YNACACQThqIAMQvAIgAkGgAWogAkHEAGopAgA3AwAgAkGoAWogAkHMAGopAgA3AwAgAkGwAWogAkHUAGopAgA3AwAgAkG4AWogAkHcAGooAgA2AgAgAiACKQI8NwOYASACKAI4IQQLIAMoAjwhByADKQI0IRcgAkEgaiADQShqEL0KIAJBOGpBCGogAkGYAWpBCGopAwA3AwAgAkE4akEQaiACQZgBakEQaikDADcDACACQThqQRhqIAJBmAFqQRhqKQMANwMAIAJBOGpBIGogAkGYAWpBIGooAgA2AgAgAiAXNwIsIAJB5ABqIAJBIGpBCGopAgA3AgAgAiAHNgI0IAJB7ABqIAJBIGpBEGopAgA3AgAgAiACKQOYATcDOCACIAIpAiA3AlwLQYCAgIB4IQcCQCADKAJgQYCAgIB4Rg0AIAMoAnQhByADKQJsIRcgAkGYAWogA0HgAGoQvQogAkEoaiAXNwMAIAJBMGogBzYCACACIAIpApwBNwMgIAIoApgBIQcLIAEgBDYCACABIAIpAzg3AgQgASAGNgJEIAEgBTYCQCABQQxqIAJBOGpBCGopAwA3AgAgAUEUaiACQThqQRBqKQMANwIAIAFBHGogAkHQAGopAwA3AgAgAUEkaiACQdgAaikDADcCACABQSxqIAJB4ABqKQMANwIAIAFBNGogAkHoAGopAwA3AgAgAUE8aiACQfAAaigCADYCACABIAc2AmAgASAINgJ8IAEgCTYCeCABQdgAaiACQQhqQRBqKQMANwMAIAFB0ABqIAJBCGpBCGopAwA3AwAgASACKQMINwNIIAFB9ABqIAJBIGpBEGooAgA2AgAgAUHsAGogAkEgakEIaikDADcCACABIAIpAyA3AmQgAEELNgIAIAAgATYCBAwNCyABKQIMIRcgASgCBCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiBSkDADcDACADQSBqIAJBOGpBIGoiBikDADcDACADQRhqIAJBOGpBGGoiBykDADcDACADQRBqIAJBOGpBEGoiCCkDADcDACADQQhqIAJBOGpBCGoiCSkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAggQTCAEQShqIAUpAwA3AwAgBEEgaiAGKQMANwMAIARBGGogBykDADcDACAEQRBqIAgpAwA3AwAgBEEIaiAJKQMANwMAIAQgAikDODcDACAAIBc3AgwgACAENgIIIAAgAzYCBCAAQQw2AgAMDAsgASkCDCEXIAEoAgQhBBD6JyEDIAJBOGogBBBCIANBOGogAkE4akE4aikDADcDACADQTBqIAJBOGpBMGopAwA3AwAgA0EoaiACQThqQShqIgUpAwA3AwAgA0EgaiACQThqQSBqIgYpAwA3AwAgA0EYaiACQThqQRhqIgcpAwA3AwAgA0EQaiACQThqQRBqIggpAwA3AwAgA0EIaiACQThqQQhqIgkpAwA3AwAgAyACKQM4NwMAEIEoIQQgAkE4aiABKAIIEEwgBEEoaiAFKQMANwMAIARBIGogBikDADcDACAEQRhqIAcpAwA3AwAgBEEQaiAIKQMANwMAIARBCGogCSkDADcDACAEIAIpAzg3AwAgACAXNwIMIAAgBDYCCCAAIAM2AgQgAEENNgIADAsLQQIhByABKAIUIQggASgCECEJAkAgASgCBCIEQQJGDQBBASEHIAEoAgghAwJAIARBAXFFDQAQ+ichBiACQThqIAMQQiAGQThqIAJBOGpBOGopAwA3AwAgBkEwaiACQThqQTBqKQMANwMAIAZBKGogAkE4akEoaikDADcDACAGQSBqIAJBOGpBIGopAwA3AwAgBkEYaiACQThqQRhqKQMANwMAIAZBEGogAkE4akEQaikDADcDACAGQQhqIAJBOGpBCGopAwA3AwAgBiACKQM4NwMADAELEIMoIQYgAygCFCEEIAMpAgwhFyADLwEYIQUgAkE4aiADEMkFIAJBOGpBGGoiAyAFOwEAIAYgAikCODcCACACIBc3AkQgBkEIaiACQThqQQhqKQIANwIAIAIgBDYCTCAGQRBqIAJBOGpBEGopAgA3AgAgBkEYaiADKAIANgIAQQAhBwtBACEEQQAhBQJAIAEoAhgiA0UNABD6JyEFIAJBOGogAxBCIAVBOGogAkE4akE4aikDADcDACAFQTBqIAJBOGpBMGopAwA3AwAgBUEoaiACQThqQShqKQMANwMAIAVBIGogAkE4akEgaikDADcDACAFQRhqIAJBOGpBGGopAwA3AwAgBUEQaiACQThqQRBqKQMANwMAIAVBCGogAkE4akEIaikDADcDACAFIAIpAzg3AwALAkAgASgCHCIDRQ0AEPonIQQgAkE4aiADEEIgBEE4aiACQThqQThqKQMANwMAIARBMGogAkE4akEwaikDADcDACAEQShqIAJBOGpBKGopAwA3AwAgBEEgaiACQThqQSBqKQMANwMAIARBGGogAkE4akEYaikDADcDACAEQRBqIAJBOGpBEGopAwA3AwAgBEEIaiACQThqQQhqKQMANwMAIAQgAikDODcDAAsQgSghAyACQThqIAEoAgwQTCADQShqIAJBOGpBKGopAwA3AwAgA0EgaiACQThqQSBqKQMANwMAIANBGGogAkE4akEYaikDADcDACADQRBqIAJBOGpBEGopAwA3AwAgA0EIaiACQThqQQhqKQMANwMAIAMgAikDODcDACAAIAQ2AhwgACAFNgIYIAAgCDYCFCAAIAk2AhAgACADNgIMIAAgBjYCCCAAIAc2AgQgAEEONgIADAoLIAEoAgghAyABKAIYIQYgASgCFCEHAkACQAJAAkAgASgCBCIIDgMAAQIACxCDKCEFIAMoAhQhBCADKQIMIRcgAy8BGCEJIAJBOGogAxDJBSACQThqQRhqIgMgCTsBACAFIAIpAjg3AgAgAiAXNwJEIAVBCGogAkE4akEIaikCADcCACACIAQ2AkwgBUEQaiACQThqQRBqKQIANwIAIAVBGGogAygCADYCAAwCCxCEKCEFIAMtABQhBCADKQIMIRcgAkE4aiADEMkFIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDoATCAFQRBqIAJBOGpBEGopAgA3AgAMAQsQ/SchBSACQThqIAMQvAIgBUEgaiACQThqQSBqKQMANwMAIAVBGGogAkE4akEYaikDADcDACAFQRBqIAJBOGpBEGopAwA3AwAgBUEIaiACQThqQQhqKQMANwMAIAUgAikDODcDAAsgASgCDCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiCSkDADcDACADQSBqIAJBOGpBIGoiCikDADcDACADQRhqIAJBOGpBGGoiCykDADcDACADQRBqIAJBOGpBEGoiDCkDADcDACADQQhqIAJBOGpBCGoiFCkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAhAQTCAEQShqIAkpAwA3AwAgBEEgaiAKKQMANwMAIARBGGogCykDADcDACAEQRBqIAwpAwA3AwAgBEEIaiAUKQMANwMAIAQgAikDODcDACAAIAY2AhggACAHNgIUIAAgBDYCECAAIAM2AgwgACAFNgIIIAAgCDYCBCAAQQ82AgAMCQsgASgCCCEDIAEtABwhBiABKAIYIQcgASgCFCEIAkACQAJAAkAgASgCBCIJDgMAAQIACxCDKCEFIAMoAhQhBCADKQIMIRcgAy8BGCEKIAJBOGogAxDJBSACQThqQRhqIgMgCjsBACAFIAIpAjg3AgAgAiAXNwJEIAVBCGogAkE4akEIaikCADcCACACIAQ2AkwgBUEQaiACQThqQRBqKQIANwIAIAVBGGogAygCADYCAAwCCxCEKCEFIAMtABQhBCADKQIMIRcgAkE4aiADEMkFIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDoATCAFQRBqIAJBOGpBEGopAgA3AgAMAQsQ/SchBSACQThqIAMQvAIgBUEgaiACQThqQSBqKQMANwMAIAVBGGogAkE4akEYaikDADcDACAFQRBqIAJBOGpBEGopAwA3AwAgBUEIaiACQThqQQhqKQMANwMAIAUgAikDODcDAAsgASgCDCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiCikDADcDACADQSBqIAJBOGpBIGoiCykDADcDACADQRhqIAJBOGpBGGoiDCkDADcDACADQRBqIAJBOGpBEGoiFCkDADcDACADQQhqIAJBOGpBCGoiFSkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAhAQTCAEQShqIAopAwA3AwAgBEEgaiALKQMANwMAIARBGGogDCkDADcDACAEQRBqIBQpAwA3AwAgBEEIaiAVKQMANwMAIAQgAikDODcDACAAIAY6ABwgACAHNgIYIAAgCDYCFCAAIAQ2AhAgACADNgIMIAAgBTYCCCAAIAk2AgQgAEEQNgIADAgLAkACQAJAAkACQAJAAkACQAJAAkAgASgCCCIEDggAAQIDBAUGBwALIAEoAiAhBSABKAIcIQYgASgCGCEHAkAgASkDECIXQgODQgBSDQAgF6ciAyADKAIAIgNBAWo2AgAgA0F/TA0SCyABLQAsIQggAS0AJCEJIAEoAighARCHKCEDIAEoAiwhFSABKAIoIRYgASgCJCESIAJBIGogARDtCCACQZgBaiABQQxqEHVBACELQQAhCgJAIAEoAjAiDEUNABD6JyEKIAJBOGogDBBCIApBOGogAkE4akE4aikDADcDACAKQTBqIAJBOGpBMGopAwA3AwAgCkEoaiACQThqQShqKQMANwMAIApBIGogAkE4akEgaikDADcDACAKQRhqIAJBOGpBGGopAwA3AwAgCkEQaiACQThqQRBqKQMANwMAIApBCGogAkE4akEIaikDADcDACAKIAIpAzg3AwALIAEtADwhEwJAIAEoAjQiDEUNABCAKCELIAwoAgwhFCAMKAIQIQ8gAkE4aiAMEOEGIAtBEGogDzYCACALIAIpAjg3AgAgAiAUNgJEIAtBCGogAkE4akEIaikCADcCAAsCQAJAIAEoAjgiFA0AQQAhDAwBCxCAKCEMIBQoAgwhDyAUKAIQIREgAkE4aiAUENUMIAxBEGogETYCACAMIAIpAjg3AgAgAiAPNgJEIAxBCGogAkE4akEIaikCADcCAAsgAkE4akEYaiIUIAFBGGoQ0QUgAkE4akEoaiIBIBY2AgAgAkE4akEIaiIWIAJBIGpBCGooAgA2AgAgAkHMAGogAkGYAWpBCGooAgA2AgAgAkE4akEwaiIPIAo2AgAgAkE4akE4aiIKIAw2AgAgAiAVNgJkIAIgEjYCXCACIAIpAiAiGDcDOCACIAIpApgBNwJEIAIgEzoAdCACIAs2AmwgA0E4aiAKKQMANwIAIANBMGogDykDADcCACADQShqIAEpAwA3AgAgA0EgaiACQThqQSBqKQMANwIAIANBGGogFCkDADcCACADQRBqIAJBOGpBEGopAwA3AgAgA0EIaiAWKQMANwIAIAMgGDcCAAwICyABKAIgIQUgASgCHCEGIAEoAhghBwJAIAEpAxAiF0IDg0IAUg0AIBenIgMgAygCACIDQQFqNgIAIANBf0wNEQsgAS0ALCEIIAEtACQhCSABKAIoIQEQgighAyACQQhqIAEQggkgAkEgaiABQQxqEO0IQYCAgIB4IRQgASgCOCEVIAEoAjQhFiABKAIwIRICQCABKAIYQYCAgIB4Rg0AIAEoAiwhCiABKQIkIRggAkE4aiABQRhqEL0KIAJBoAFqIBg3AwAgAkGoAWogCjYCACACIAIpAjw3A5gBIAIoAjghFAsgAS0ARSETIAEtAEQhD0EAIQtBACEKAkAgASgCPCIMRQ0AEIAoIQogDCgCDCERIAwoAhAhECACQThqIAwQ4QYgCkEQaiAQNgIAIAogAikCODcCACACIBE2AkQgCkEIaiACQThqQQhqKQIANwIACwJAIAEoAkAiAUUNABD7JyELIAEpAgQhGCABKAIAIQwQ/CchASACQThqIAwQdgJAQeAARQ0AIAEgAkE4akHgAPwKAAALIAsgGDcCBCALIAE2AgALIAJBOGpBCGoiASACQQhqQQhqKAIANgIAIAJBzABqIAJBIGpBCGooAgA2AgAgAiACKQIIIhg3AzggAiACKQIgNwJEIANBEGogAkE4akEQaikDADcCACADQQhqIAEpAwA3AgAgAyAYNwIAIAMgFDYCGCADIBM6AEUgAyAPOgBEIAMgCzYCQCADIAo2AjwgAyAVNgI4IAMgFjYCNCADIBI2AjAgAyACKQOYATcCHCADQSRqIAJBmAFqQQhqKQMANwIAIANBLGogAkGYAWpBEGooAgA2AgAMBwsgASgCDCEDEIMoIQEgAygCFCEFIAMpAgwhFyADLwEYIQYgAkE4aiADEMkFIAJBOGpBGGoiAyAGOwEAIAEgAikCODcCACACIBc3AkQgAUEIaiACQThqQQhqKQIANwIAIAIgBTYCTCABQRBqIAJBOGpBEGopAgA3AgAgAUEYaiADKAIANgIADAULIAEoAgwhAxCEKCEBIAMtABQhBSADKQIMIRcgAkE4aiADEMkFIAEgAikCODcCACACIBc3AkQgAUEIaiACQThqQQhqKQIANwIAIAIgBToATCABQRBqIAJBOGpBEGopAgA3AgAMBAsgASgCDCEDEIUoIQEgAygCGCEHIAMoAhQhCCADKAIQIQkgAygCBCEKIAMoAgAhCwJAIAMpAwgiF0IDg0IAUg0AIBenIgUgBSgCACIFQQFqNgIAIAVBf0wNDgsgAy0ARCEMIAMtABwhFAJAAkAgAygCICIGDQBBACEFDAELEIAoIQUgBigCDCEVIAYoAhAhFiACQThqIAYQ4QYgBUEQaiAWNgIAIAUgAikCODcCACACIBU2AkQgBUEIaiACQThqQQhqKQIANwIACyACQThqQThqIANBOGoQ0QUgAygCMCEGIAMoAjQhFSACQZgBaiADQSRqEJcBIAJB7ABqIBU2AgAgAiAGNgKkASACQeQAaiACQaABaikCADcCACACIAw6AHwgAiAUOgBUIAIgBzYCUCACIAg2AkwgAiAJNgJIIAIgFzcDQCACIAo2AjwgAiALNgI4IAIgBTYCWCACIAIpApgBNwJcQcgARQ0DIAEgAkE4akHIAPwKAAAMAwsgASgCDCEDEIEoIQEgAygCGCEHIAMoAhQhCCADKAIQIQkgAy0AKCEKIAMoAgQhCyADKAIAIQwCQCADKQMIIhdCA4NCAFINACAXpyIFIAUoAgAiBUEBajYCACAFQX9MDQ0LIAMtABwhFAJAAkAgAygCICIGDQBBACEFDAELEIAoIQUgBigCDCEVIAYoAhAhFiACQThqIAYQ4QYgBUEQaiAWNgIAIAUgAikCODcCACACIBU2AkQgBUEIaiACQThqQQhqKQIANwIACyADKAIkIQYQ/CchAyACQThqIAYQdgJAQeAARQ0AIAMgAkE4akHgAPwKAAALIAEgCjoAKCABIAM2AiQgASAFNgIgIAEgFDoAHCABIAc2AhggASAINgIUIAEgCTYCECABIBc3AwggASALNgIEIAEgDDYCAAwCCyABKAIMIQMQgSghASADKAIQIQUgAygCDCEGIAMoAgghByADLQAtIQggAy0ALCEJIAMoAhwhCiADKAIYIQsCQCADKQMAIhdCA4NCAFINACAXpyIMIAwoAgAiDEEBajYCACAMQX9MDQwLIAMtABQhDCACQThqQSBqIhQgA0EgahCcBSACQThqQQhqIgMgBzYCACACQThqQRBqIgcgBTYCACACQThqQRhqIgUgCzYCACABIBc3AwAgAUEgaiAUKQMANwMAIAIgBjYCRCABQQhqIAMpAwA3AwAgAiAMOgBMIAFBEGogBykDADcDACACIAo2AlQgAUEYaiAFKQMANwMAIAIgCDoAZSACIAk6AGQgAUEoaiACQThqQShqKQMANwMADAELIAEoAgwhAxCGKCEBIAMoAhQhByADKAIQIQggAy0AUiEJIAMtAFEhCiADLQBQIQsgAygCTCEMIAMoAkghFAJAAkAgAygCAEEBRw0AAkAgAykDCCIYQgODQgBSDQAgGKciBSAFKAIAIgVBAWo2AgAgBUF/TA0NC0IBIRkgAykDGCIXUA0BIBdCA4NQRQ0BIBenIgUgBSgCACIFQQFqNgIAIAVBf0oNAQwMC0IAIRkgAzUCGCEXAkAgAykDCCIYQgODQgBSDQAgGKciBSAFKAIAIgVBAWo2AgAgBUF/TA0MCyADMQAcQiCGIBeEIRcLQQMhBQJAIAMtAEVBA0YNACACQThqIANBIGoQqQUgAkGYAWpBHWogAkE4akEdaikAADcAACACQZgBakEYaiACQThqQRhqKQMANwMAIAJBmAFqQRBqIAJBOGpBEGopAwA3AwAgAkGYAWpBCGogAkE4akEIaikDADcDACACIAIpAzg3A5gBIAItAF0hBSACLwFeIQYLIAEgFzcDGCABIAc2AhQgASAINgIQIAEgGDcDCCABIBk3AwAgASACKQOYATcDICABIAk6AFIgASAKOgBRIAEgCzoAUCABIAw2AkwgASAUNgJIIAEgBjsBRiABIAU6AEUgAUEoaiACQaABaikDADcDACABQTBqIAJBqAFqKQMANwMAIAFBOGogAkGwAWopAwA3AwAgAUE9aiACQbUBaikAADcAAAsLIAAgCToAJCAAIAU2AiAgACAGNgIcIAAgBzYCGCAAIBc3AxAgACABNgIMIAAgBDYCCCAAIAIvADg7ACUgACAIOgAsIAAgAzYCKCAAIAIvAJgBOwAtIABBETYCACAAQSdqIAJBOGpBAmotAAA6AAAgAEEvaiACQZgBakECai0AADoAAAwHCyABKQMIIRcgASgCBCEDEPonIQEgAkE4aiADEEIgAUE4aiACQThqQThqKQMANwMAIAFBMGogAkE4akEwaikDADcDACABQShqIAJBOGpBKGopAwA3AwAgAUEgaiACQThqQSBqKQMANwMAIAFBGGogAkE4akEYaikDADcDACABQRBqIAJBOGpBEGopAwA3AwAgAUEIaiACQThqQQhqKQMANwMAIAEgAikDODcDACAAIBc3AwggACABNgIEIABBEjYCAAwGCyABKAIgIQggASgCHCEHIAEoAhghBiABKQMQIhdCA4NCAFINACAXpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIAAgBToAJCAAIAg2AiAgACAHNgIcIAAgBjYCGCAAIBc3AxAgACADNgIMIAAgBDYCCCAAQQY2AgAMBAsgASgCICEIIAEoAhwhByABKAIYIQYgASkDECIXQgODQgBSDQAgF6ciASABKAIAIgFBAWo2AgAgAUF/TA0ECyAAIAU6ACQgACAINgIgIAAgBzYCHCAAIAY2AhggACAXNwMQIAAgAzYCDCAAIAQ2AgggAEEHNgIADAILIBEgAigCQEG08poBEI4pAAsgCSACKAJAQbTymgEQjikACyACQcABaiQADwsAC+hRAid/A34jAEHgA2siAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIADggAAQgCAwQFBgALIANBgANqIAEQ3iIgAEEIaiEEIAMoAoQDIQECQAJAIAMoAoADIgJBKkYNAEE4RQ0BIAQgA0GAA2pBCGpBOPwKAAAMAQsgBCABNgIACyAAIAI2AgAgACABNgIEDBILIAIoAgQiBSACKAIIIgJqIQQCQAJAAkACQCABLQALQQFxDQAgAkUNAiAFQQFqIQIMAQsgAkUNASAFIQIgBEF/aiIEIQULIANBKGogASAFLQAAIgUgBRCODyADKAIoIgZBK0YNACADKAIwIQUgAygCLCEHIAZBKkYNAQJAQTRFDQAgAEEMaiADQShqQQxqQTT8CgAACyAAIAU2AgggACAHNgIEIAAgBjYCAAwTCyADQYADaiABEN4iIABBCGohBCADKAKEAyEBAkACQCADKAKAAyICQSpGDQBBOEUNASAEIANBgANqQQhqQTj8CgAADAELIAQgATYCAAsgACACNgIAIAAgATYCBAwSCyADQcwCaiEIA0ACQAJAIAEtAAtBAXENACACIARGDQggAkEBaiEJDAELIAIgBEYNByACIQkgBEF/aiIEIQILIANBwAJqIAEgAi0AACICIAIQjg8gAygCwAIiAkErRg0GIAMoAsgCIQogAygCxAIhBgJAIAJBKkYNAAJAQTRFDQAgAEEMaiAIQTT8CgAACyAAIAo2AgggACAGNgIEIAAgAjYCAAwTCyADQYADaiABIAUgBhC1CAJAIAMoAoADIgJBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACACNgIADBMLIAkhAiAKIQUMAAsLIAIoAgRoQQJ0QYTDngFqKAIAIQIgAS0AC0EBcUUNDyACaEECdEHMw54BaigCACECDA8LIAIoAgQhBCACKAIIIQUCQAJAAkACQCACKAIQIgYNACAERQ0AIAVBAUYNAQsgBEUNASACKAIMIQQgBiAFRg0CIAAgASAEIAItABQgBiAFEPUEDBILIAIoAgwhBAJAAkAgAi0AFA0AIANBgANqIAEQrRkMAQsgA0GAA2ogARCTGAsgAygChAMhAgJAIAMoAoADIgVBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACACNgIEIAAgBTYCAAwSCyADQYADaiABIAQQTSADKAKIAyEFIAMoAoQDIQQCQCADKAKAAyIGQSpGDQACQEE0RQ0AIABBDGogA0GAA2pBDGpBNPwKAAALIAAgBTYCCCAAIAQ2AgQgACAGNgIADBILIANBgANqIAEQ3iIgAygChAMhBgJAIAMoAoADIglBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACAGNgIEIAAgCTYCAAwSCyADQYADaiABIAIgBBC1CAJAIAMoAoADIgRBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAENgIADBILIANBgANqIAEgAiAGELUIAkAgAygCgAMiBEEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAQ2AgAMEgsgA0GAA2ogASAFIAYQtQgCQCADKAKAAyIBQSpGDQACQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgATYCAAwSCyAAIAY2AgggACACNgIEIABBKjYCAAwRCyAAIAEgAigCDCACLQAUIAYQ+AEMEAsgAyAGNgKMAyADQQA2AogDIAMgBDYChAMgAyABNgKAAyAAIAEgA0GAA2oQ6wQMDwsgACABIAIoAgggAigCDCACKAIQIAIoAgQQ3AIMDgsgAigCCCIEIAIoAgwiBUEcbGohAgJAAkACQAJAAkAgAS0AC0EBcQ0AIAVFDQIgA0GAA2ogASAEEE0gAygCiAMhBSADKAKEAyEIIAMoAoADIQYCQEE0RQ0AIANB7ABqIANBjANqQTT8CgAACyAEQRxqIQQMAQsgBUUNASADQYADaiABIAJBZGoiAhBNIAMoAogDIQUgAygChAMhCCADKAKAAyEGQTRFDQAgA0HsAGogA0GMA2pBNPwKAAALIAZBVmoOAgIAAQsgA0GAA2ogARDeIiAAQQhqIQQgAygChAMhAQJAAkAgAygCgAMiAkEqRg0AQThFDQEgBCADQYADakEIakE4/AoAAAwBCyAEIAE2AgALIAAgAjYCACAAIAE2AgQMDwsCQEE0RQ0AIABBDGogA0HsAGpBNPwKAAALIAAgBTYCCCAAIAg2AgQgACAGNgIADA4LIANBjANqIQcDQAJAAkACQAJAAkAgAS0AC0EBcQ0AIAQgAkYNAiADQYADaiABIAQQTSADKAKIAyEKIAMoAoQDIQkgAygCgAMhBgJAQTRFDQAgA0GgAWogB0E0/AoAAAsgBEEcaiEEDAELIAQgAkYNASADQYADaiABIAJBZGoiAhBNIAMoAogDIQogAygChAMhCSADKAKAAyEGQTRFDQAgA0GgAWogB0E0/AoAAAsgBkEqRg0CIAZBK0cNAQsgACAFNgIIIAAgCDYCBCAAQSo2AgAMEAsCQEE0RQ0AIABBDGogA0GgAWpBNPwKAAALIAAgCjYCCCAAIAk2AgQgACAGNgIADA8LIANBgANqIAEgBSAJELUIAkAgAygCgAMiBUEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAU2AgAMDwsgCiEFDAALCwJAAkACQAJAIAIoAgwiCUUNACACKAIIIgYgCUEcbCIKaiELQQAhBCAGIQIgCSEFA0AgBCACKAIAQQFGaiEEIAJBHGohAiAFQX9qIgUNAAsCQCAEQQJJDQAgBCAJTw0ECyADQYADaiABIAYQTSADKAKIAyEFIAMoAoQDIQQgAygCgAMhAgJAQTRFDQAgA0GIAmogA0GMA2pBNPwKAAALIAJBVmoOAgIAAQsgACABELIQDA8LAkBBNEUNACAAQQxqIANBiAJqQTT8CgAACyAAIAU2AgggACAENgIEIAAgAjYCAAwOCwJAAkACQCAJQQFGDQAgA0GAA2ogASAGQRxqEE0gAygCiAMhCCADKAKEAyEHIAMoAoADIQICQEE0RQ0AIANBKGogA0GMA2pBNPwKAAALIAJBVmoOAgIAAQsgACAFNgIIIAAgBDYCBCAAQSo2AgAMDwsCQEE0RQ0AIABBDGogA0EoakE0/AoAAAsgACAINgIIIAAgBzYCBCAAIAI2AgAMDgsgA0GAA2ogARCTGCADKAKEAyECAkAgAygCgAMiDEEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAI2AgQgACAMNgIADA4LIANBgANqIAEQ3iIgAygChAMhDAJAIAMoAoADIg1BKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACAMNgIEIAAgDTYCAAwOCyADQYADaiABIAIgBBC1CAJAIAMoAoADIgRBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAENgIADA4LIANBgANqIAEgBSAMELUIAkAgAygCgAMiBEEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAQ2AgAMDgsgA0GAA2ogASACIAcQtQgCQCADKAKAAyIEQSpGDQACQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgBDYCAAwOCyADQYADaiABIAggDBC1CAJAIAMoAoADIgRBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAENgIADA4LAkAgCUECRg0AIAZBOGohBCADQcwCaiEHIApBSGohCQNAIANBwAJqIAEgBBBNIAMoAsACIgVBK0YNASADKALIAiEKIAMoAsQCIQYCQCAFQSpGDQACQEE0RQ0AIABBDGogB0E0/AoAAAsgACAKNgIIIAAgBjYCBCAAIAU2AgAMEAsgA0GAA2ogASACIAYQtQgCQCADKAKAAyIFQSpGDQACQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgBTYCAAwQCyADQYADaiABIAogDBC1CAJAIAMoAoADIgVBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAFNgIADBALIARBHGohBCAJQWRqIgkNAAsLIAAgDDYCCCAAIAI2AgQgAEEqNgIADA0LAkACQCABLQALQQFxDQAgA0GAA2oQoR4MAQsgA0GAA2oQoh4LA0AgBigCAEEBRw0DIAZBHGohDiAGKAIEIgIgBigCCGohDUEAIQQCQANAAkACQCADLQCMAw0AIAIgDUYNAyACQQFqIQ8MAQsgAiANRg0CIAIhDyANQX9qIg0hAgsgBCADKAKIAyIHTw0IIAItAAAhDCADQSBqIAMoAoQDIgggBEEYbCIQahCJFEEAIQIgAygCICEJAkACQAJAIAMoAiQiBA4CAgEAC0EAIQIgDEH/AXEhCgNAIAIgBEEBdiIFIAJqIgYgCSAGQQN0ai0ABCAKSxshAiAEIAVrIgRBAUsNAAsLAkAgCSACQQN0aiIELQAEIgUgDEH/AXEiBkcNACAEKAIAIQQgDyECDAILIAIgBSAGSWohBAsCQCAHIAMoAoADRw0AIANBgANqEJscIAMoAoQDIQgLIAggB0EYbGoiAkIENwIQIAJCADcCCCACQoCAgIDAADcCACADIAdBAWo2AogDQQAhBgJAIAggEGoiAigCFCIFRQ0AIAIoAhAgBUEDdGoiBUF4akUNACAFQXxqKAIAIQYLIAIoAggiBSAGIARqIgRJDQcCQCAFIAIoAgBHDQAgAhCXHAsgAigCBCAEQQN0aiEGAkAgBSAETQ0AIAUgBGtBA3QiBEUNACAGQQhqIAYgBPwKAAALIAYgDDoABCAGIAc2AgAgAiAFQQFqNgIIIA8hAiAHIQQMAAsLIAQgAygCiAMiAk8NBCADKAKEAyAEQRhsaiICKAIUIQQCQAJAAkAgAigCCCIJDQAgBA0CIAJBEGohCiACKAIQIQVBACEEQQAhBgwBCyACQRBqIQogAigCECEFQQAhBiAERQ0AIAUgBEEDdGoiB0F4akUNACAHQXxqKAIAIQYLAkAgBCACKAIMRw0AIAJBDGoQnRwgCigCACEFCyAFIARBA3RqIgUgCTYCBCAFIAY2AgAgAiAEQQFqNgIUCyAOIQYgDiALRg0LDAALCyAAIAU2AgggACAHNgIEIABBKjYCAAwLCyACKAIEDQcgAigCDCIRIAIoAhAiBBC2IQ0EIAEtAAtBAXENBQJAIAEoAiANACABQX82AiACQCABKAJgDQAgAUF/NgJgIANBgANqIAFBJGogAUHkAGoQkgcgA0HAAmpBCGoiAiADQYwDaigCADYCACADIAMpAoQDNwPAAgJAIAMoAoADIgVBKkYNAAJAQTBFDQAgAEEQaiADQYADakEQakEw/AoAAAsgAEEMaiADQcgCaigCADYCACAAIAMpA8ACNwIEIAAgBTYCAAwJCyADQShqQQhqIAIoAgA2AgAgAyADKQPAAjcDKCARIARBA3RqIQQDQAJAAkAgESAERg0AIANBwAJqIBEoAgAgESgCBBC1IyARQQhqIREDQCADQfgBaiADQcACahDlAyADLQD4AUEERg0CIANBiAJqQQhqIANB+AFqQQhqLQAAOgAAIAMgAykA+AE3A4gCIANBGGogA0GIAmoQuSYgA0GAA2ogA0EoaiADKAIYIAMoAhwQ7AUgAygCgAMiAkEqRg0ACwJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACACNgIAIAMoAsACIAMoAsQCEIAtDAsLIAAgA0EoahCQCSABIAEoAmBBAWo2AmAgASABKAIgQQFqNgIgDA4LIAMoAsACIAMoAsQCEIAtDAALC0HMnoQBENIaAAtBvJ6EARDSGgALQaCmnAFBKEGMnoQBENIeAAsgBCACQazzgwEQkRUACyAEIAVB3PODARCXFQALIAQgB0G884MBEJEVAAsgA0GAA2ogARDeIiADKAKEAyEJAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAk2AgQgACACNgIADAYLQQAhAiADQYADaiAEQQBBBEEIEKgMIAMoAoQDIQYCQAJAAkAgAygCgANBAUYNACADQQA2AugBIAMgAygCiAMiBTYC5AEgAyAGNgLgASAEQQN0IQYgCa0hKkEAIQQCQANAIAYgAkYNASARNQIAIitCgAJaDQMgETUCBCIsQoACWg0EAkAgBCADKALgAUcNACADQeABakG8n4QBEJUcIAMoAuQBIQULIBFBCGohESAFIAJqICtCIIYgKoQgLEIohoQ3AgAgAyAEQQFqIgQ2AugBIAJBCGohAgwACwsgA0GAA2ogASADQeABahD/ISADKAKEAyEBAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAE2AgQgACACNgIADAkLIAAgCTYCCCAAIAE2AgQgAEEqNgIADAgLIAYgAygCiANBjJ+EARCOKQALQcSInAFBKyADQYADakG0nIQBQZyfhAEQ6hIAC0HEiJwBQSsgA0GAA2pBtJyEAUGsn4QBEOoSAAsCQAJAAkAgAS0ADEEBcQ0AAkAgASgC2AENACABQX82AtgBIAFB3AFqEJUMIANBgANqIAEQkxggAygChAMhDQJAIAMoAoADIgJBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACANNgIEIAAgAjYCAAwECyADQYADaiABEN4iIAMoAoQDIQ8CQCADKAKAAyICQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgDzYCBCAAIAI2AgAMBAsgESAEQQN0aiEQIAFB5AFqIQcCQANAIBEgEEYNBCADQcACaiARKAIAIBEoAgQQtSMgEUEIaiERA0AgA0GIAmogA0HAAmoQ5QMCQAJAAkACQAJAIAMtAIgCQQRGDQAgA0EoakEIaiADQYgCakEIai0AADoAACADIAMpAIgCNwMoIANBEGogA0EoahC5JiADKAIQIgIgAygCFEEBdGohDCAPIQQDQCAHKAIAIgVFDQIgBSAErSIrQqXGiKHInKf5S4VCs4OAgIAgfiACLQAAIgmtQv8BgyIshUKzg4CAgCB+IAJBAWotAAAiCq1C/wGDIiqFQrODgICAIH4gBa2CpyIGTQ0DAkACQCABKALgASAGQQR0IghqIgUvAQwgAS8B7AFHDQAgBCAFKAIARw0AIAlB/wFxIAUtAARHDQAgCkH/AXEgBS0ABUcNACAFKAIIIQQMAQsgA0GAA2ogASAJIAoQjg8gAygCiAMhCSADKAKEAyEFAkAgAygCgAMiCkEqRg0AAkBBNEUNACAAQQxqIANBgANqQQxqQTT8CgAACyAAIAk2AgggACAFNgIEIAAgCjYCAAwKCyADQYADaiABIAkgBBC1CAJAIAMoAoADIgRBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAENgIADAoLIAcoAgAiBCAGTQ0FIAEoAuABIAhqIgQgAS8B7AE7AQwgBCAFNgIIIAQgKkIohiAsQiCGhCArhDcCACAFIQQLIAJBAmoiAiAMRg0FDAALCyADKALAAiADKALEAhCALQwFC0GcyYMBEN0hAAsgBiAFQazJgwEQkRUACyAGIARBvMmDARCRFQALIANBgANqIAEgDSAEELUIIAMoAoADIgJBKkYNAAsLAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgALIAMoAsACIAMoAsQCEIAtDAMLQcyfhAEQ0hoACwJAAkAgASgChAENACABQX82AoQBIAFBiAFqIhIQjwogAUGgAWohEyABQawBaiEUIBEgBEEDdGohFSADQfgBakF/aiEWIANBwAJqQQRqIRcgA0EoakECciEYIANB+AFqQQFqIRkgA0HGAmohGiADQckCaiEbA0AgESAVRg0CIANBiAJqIBEoAgAgESgCBBC1IyARQQhqIREDQCADQe8BaiADQYgCahDlAwJAAkACQCADLQDvAUEERg0AIANB+AFqQQhqIANB7wFqQQhqLQAAOgAAIAMgAykA7wEiKzcD+AFBAiECAkACQCArp0H/AXEOBAQDAAEEC0EDIQIMAgtBBCECDAELIAMoAogCIAMoAowCEIAtDAMLIAJBAXYhBSAWIAJBAXRqIQIgGSEEA0AgBUUNASAELwAAIQYgBCACLwAAOwAAIAIgBjsAACAFQX9qIQUgAkF+aiECIARBAmohBAwACwsgA0EIaiADQfgBahC5JiABKQKsASErIAMoAgwhAiADKAIIIQQgAUKAgICAwAA3AqwBIAFBADYCtAEgA0EANgLIAyADICs3A8ADIANBgANqQQEgBCACEMUTAkACQCArp0UNACArQiCIpyECDAELIANBwANqQZTLgwEQmBwgAygCxAMhAgsgAiADKQKAAzcCACACQQhqIANBgANqQQhqIhwpAgA3AgBBASECA0AgAyACQX9qIgI2AsgDIANBKGpBCGogAygCxAMgAkEEdGoiAkEIaikCACIrNwMAIAMgAikCADcDKAJAAkAgAy0ANCIKQQVPDQACQCAKRQ0AAkAgK6ciHSABKAKQASICTw0AIAMtACkhHiADLQAoIR8CQAJAAkAgASgCjAEgHUEMbCIgaiICKAIIIgYNAEEAISEMAQsgAigCBCEJQQAhISAGIQQDQCAEICFqQQF2IgIgBk8NAiACQQFqICEgH0H/AXEgCSACQQN0ai0ABUsiBRsiISAEIAIgBRsiBEkNAAsLIApBf2ohIgJA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akEw/AoAAAsgAEEMaiADQcgCaigCADYCACAAIAMpA8ACNwIEIAAgBDYCAAwBCyADQShqQQhqIAIoAgA2AgAgAyADKQPAAjcDKCADQYADaiASIANBKGoQ9wUgAygCgAMiAkEqRg0DAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgALIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAgASABKAKEAUEBajYChAEMCQtB7J6EARDSGgALQfyehAEQ0hoACyAAIANBKGoQkAkgASABKAJgQQFqNgJgIAEgASgCIEEBajYCICABIAEoAoQBQQFqNgKEAQwGCyAAIA82AgggACANNgIEIABBKjYCAAsgASABKALYAUEBajYC2AEMBAsgASABKAJgQQFqNgJgIAEgASgCIEEBajYCIAwDCyADQYADaiABEN4iIAMoAoQDIQoCQCADKAKAAyIEQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgCjYCBCAAIAQ2AgAMAwtBACEFIANBgANqIAIoAhAiBkEAQQRBCBCoDCADKAKEAyEEAkAgAygCgANBAUYNACADQQA2AtwBIAMgAygCiAMiCTYC2AEgAyAENgLUASAGQQF0IQQgCq0hKiACKAIMIQJBACEGAkADQCAERQ0BIAIxAAEhKyACMQAAISwCQCAGIAMoAtQBRw0AIANB1AFqQayehAEQlRwgAygC2AEhCQsgAkECaiECIAkgBWogLEIghiAqhCArQiiGhDcCACADIAZBAWoiBjYC3AEgBEF+aiEEIAVBCGohBQwACwsgA0GAA2ogASADQdQBahD/ISADKAKEAyEBAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAE2AgQgACACNgIADAQLIAAgCjYCCCAAIAE2AgQgAEEqNgIADAMLIAQgAygCiANBnJ6EARCOKQALAkAgASgCIA0AIAFBfzYCICAAIAMoAoQDIgIgAygCiAMiBCABQSRqEMACIAIgBBCuGyADKAKAAyACEIUtIAEgASgCIEEBajYCIAwCC0H8nYQBENIaAAsCQCABKAIgRQ0AQbyghAEQ0hoACyABQX82AiAgAyACNgLIAiADQgM3AsACIANBgANqIAFBJGogA0HAAmoQwAwgASABKAIgQQFqNgIgIABBCGohBCADKAKEAyEBAkACQCADKAKAAyICQSpGDQBBOEUNASAEIANBgANqQQhqQTj8CgAADAELIAQgATYCAAsgACACNgIAIAAgATYCBAsgA0HgA2okAAvxTgIJfwF+IwBBMGsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAA4UAAECAwQFBgcICQoLDA0ODxAREhMACyABKAIIIQQgA0EgaiACIAEoAgQiBUEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAAwODQABAgMEBQYHCAkKCwwACyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGI9JsBQQMQsw0gAy0ACEEERg0yIAMpAwgiDEL/AYNCBFINDAwyCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGL9JsBQQcQsw0gAy0ACEEERg0xIAMpAwgiDEL/AYNCBFINCwwxCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGS9JsBQQYQsw0gAy0ACEEERg0wIAMpAwgiDEL/AYNCBFINCgwwCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGY9JsBQQYQsw0gAy0ACEEERg0vIAMpAwgiDEL/AYNCBFINCQwvCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGe9JsBQQcQsw0gAy0ACEEERg0uIAMpAwgiDEL/AYNCBFINCAwuCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGl9JsBQQYQsw0gAy0ACEEERg0tIAMpAwgiDEL/AYNCBFINBwwtCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGr9JsBQQYQsw0gAy0ACEEERg0sIAMpAwgiDEL/AYNCBFINBgwsCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGx9JsBQQYQsw0gAy0ACEEERg0rIAMpAwgiDEL/AYNCBFINBQwrCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakG39JsBQQQQsw0gAy0ACEEERg0qIAMpAwgiDEL/AYNCBFINBAwqCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakG79JsBQQkQsw0gAy0ACEEERg0pIAMpAwgiDEL/AYNCBFINAwwpCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGVq5wBQQQQsw0gAy0ACEEERg0oIAMpAwgiDEL/AYNCBFINAgwoCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakHE9JsBQQUQsw0gAy0ACEEERg0nIAMpAwgiDEL/AYNCBFINAQwnCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakHJ9JsBQQkQsw0gAy0ACEEERg0mIAMpAwgiDEL/AYNCBFENJgsgDEL/AYNCBFENJSAAIAw3AgAMJgsgA0EgaiABKAIEIAEoAgggAhD5DyADLQAgQQRGDSQgAykDICIMQv8Bg0IEUQ0kIAAgDDcCAAwlCyADQSBqIAIgASgCGCIFIAEoAhQiBiABKAIEIgRBgICAgHhGG0EAEIsCAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINIwsCQCAEQYCAgIB4Rg0AIANBCGogAiAGQQAQiwICQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0jCyABLQAgRQ0hIANBADYCCCADQRhqIAIgA0EIakGdn5wBQQgQsw0CQCADLQAYQQRGDQAgAykDGCIMQv8Bg0IEUg0jCyADQQhqIAIQkhEgAy0ACEEERg0hIAMpAwgiDEL/AYNCBFENIQwiCyABKAIcIQQgA0EIaiACIAVBABCLAgJAAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiABQSBqIAIQmyYCQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpB3aucAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIAUgBCABKAIMIAEoAhAQwQUCQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgA0EgakHchJ4BQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCwJAIAItAE0NACADQQhqIAIQkhEgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGpBmfObAUECELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsCQCACLQBNDQAgA0EIaiACEJIRIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEUaiACEM8tIAMtAAhBBEYNJCADKQMIIgxC/wGDQgRRDSQLIAxC/wGDQgRRDSMMIgsgA0EIaiACIAEoAghBABCLAgJAAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiABQRBqIAIQ7wcCQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyABKAIoIgFFDSMgA0EANgIgIANBCGogAiADQSBqQcyBnAFBARCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAiABKAIMIAEoAhAgASgCBCABKAIIQZDSARCvBAJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAiADQSBqQcuBnAFBARCyDSADLQAIQQRGDSMgAykDCCIMQv8Bg0IEUQ0jCyAMQv8Bg0IEUQ0iIAAgDDcCAAwjCyADQSBqIAIgASgCCEEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpBw/ObAUEGELMNAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EgaiACEJIRAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsgAUEQaiEEAkACQAJAIAEtAERBBEYNACADQSBqIAQgAhClAyADLQAgQQRGDQIgAykDICIMQv8Bg0IEUg0BDAILIANBIGogBCACEO8HIAMtACBBBEYNASADKQMgIgxC/wGDQgRRDQELIAxC/wGDQgRSDQELIANBIGogAUHYAGogAhCcJiADLQAgQQRGDSIgAykDICIMQv8Bg0IEUQ0iCyAMQv8Bg0IEUQ0hIAAgDDcCAAwiCyABKAIUIQQgA0EIaiACIAEoAhAiBUEAEIsCAkACQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpBqJmcAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIAUgBCABKAIIIAEoAgwQdwJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAiADQSBqQamZnAFBARCyDSADLQAIQQRGDSEgAykDCCIMQv8Bg0IEUQ0hCyAMQv8Bg0IEUQ0gIAAgDDcCAAwhCyADQQhqIAIgASgCCEEAEIsCAkACQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAFBBGogAhDQLQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBADYCICADQQhqIAIgA0EgakHhq5wBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgA0EgakHiq5wBQQEQsg0gAy0ACEEERg0gIAMpAwgiDEL/AYNCBFENIAsgDEL/AYNCBFENHyAAIAw3AgAMIAsgASgCFCEHIANBIGogAiABKAIQIghBABCLAgJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDRsLIANBADYCCCADQSBqIAIgA0EIakHhq5wBQQEQsg0CQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0bCyABKAIIIQQgA0EgaiACIAggASgCDCIJQdACIAkQzB4CQCADLQAgQQVGDQAgAykDICEMDBkLQQUgAygCJBC+KCAJRQ0XIANBAToAFiACLQBNRQ0MDBYLIANBIGogAiABKAIIQQAQiwICQAJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQELIANBIGogAUEEaiACENAtAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQaeZnAFBARCyDSADLQAIQQRGDR4gAykDCCIMQv8Bg0IEUQ0eCyAMQv8Bg0IEUQ0dIAAgDDcCAAweCyADQSBqIAIgASgCCEEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpBpJmcAUEDELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EgaiABQQRqIAIQ0C0gAy0AIEEERg0dIAMpAyAiDEL/AYNCBFENHQsgDEL/AYNCBFENHCAAIAw3AgAMHQsCQAJAIAEoAgRBAUcNACABKAIYIQQgA0EgaiACIAEoAhQiBUEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCyADQSBqIAIgBSAEIAEoAgwgASgCEEGIAhCvBCADLQAgQQRGDR4gAykDICIMQv8Bg0IEUQ0eCyAMQv8Bg0IEUg0BDB0LIAEoAhghBCADQSBqIAIgASgCFCIFQQAQiwICQAJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQELIANBIGogAiAFIAQgASgCDCABKAIQQYQCEK8EIAMtACBBBEYNHSADKQMgIgxC/wGDQgRRDR0LIAxC/wGDQgRRDRwLIAxC/wGDQgRRDRsgACAMNwIADBwLIANBCGogAiABKAIUQQAQiwICQAJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEEaiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACEJIRAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQbzzmwFBBxCzDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAhCSEQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEIaiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACEJIRAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGpBp5mcAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACEJIRAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiABQQxqIAIQ0C0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgA0EgakHgq5wBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAFBEGogAhDQLSADLQAIQQRGDRsgAykDCCIMQv8Bg0IEUQ0bCyAMQv8Bg0IEUQ0aIAAgDDcCAAwbCyADQSBqIAIgASgCCEEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCyADQQA2AiAgA0EIaiACIANBIGpBpPObAUEFELMNAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EgaiACEJIRAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsgA0EgaiABQRBqIAIQ0wMgAy0AIEEERg0aIAMpAyAiDEL/AYNCBFENGgsgDEL/AYNCBFENGSAAIAw3AgAMGgsgA0EIaiACIAEoAghBABCLAgJAAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQd2rnAFBARCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEEaiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGpB3ISeAUEBELINIAMtAAhBBEYNGSADKQMIIgxC/wGDQgRRDRkLIAxC/wGDQgRRDRggACAMNwIADBkLIANBIGogAiABKAIIQQAQiwICQAJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQELAkACQAJAAkAgAS0AEA4DAAECAAsgA0EANgIgIANBCGogAiADQSBqQdL0mwFBBRCzDSADLQAIQQRGDQIgAykDCCIMQv8Bg0IEUQ0CDAMLIANBADYCICADQQhqIAIgA0EgakHX9JsBQQYQsw0gAy0ACEEERg0BIAMpAwgiDEL/AYNCBFENAQwCCyADQQA2AiAgA0EIaiACIANBIGpBtLicAUEIELMNIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBIGogAhCSEQJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQELIANBIGogAUEEaiACENAtIAMtACBBBEYNGCADKQMgIgxC/wGDQgRRDRgLIAxC/wGDQgRRDRcgACAMNwIADBgLIANBCGogAiABKAIMQQAQiwICQAJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEEaiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQeGrnAFBARCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEIaiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGpB4qucAUEBELINIAMtAAhBBEYNFyADKQMIIgxC/wGDQgRRDRcLIAxC/wGDQgRRDRYgACAMNwIADBcLIANBCGogAiABKAIIQQAQiwICQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0NCyADQQA2AiAgA0EIaiACIANBIGpBqJmcAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINDQsgA0EIaiACEIwWAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINDQsgAiACKAIsQQFqNgIsAkACQAJAIAEtAEgOBAABAg4ACyADQQhqIAIgA0EgakG0uJwBQQgQsw0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0PCyADQQhqIAIQkhEgAy0ACEEERg0NIAMpAwgiDEL/AYNCBFENDQwOCyADQQhqIAIgA0EgakHJ85sBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0OCyADQQhqIAIgA0EgakG0uJwBQQgQsw0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0OCyADQQhqIAIQkhEgAy0ACEEERg0MIAMpAwgiDEL/AYNCBFENDAwNCyADQQhqIAIgA0EgakHK85sBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0NCyADQQhqIAIgA0EgakG0uJwBQQgQsw0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0NCyADQQhqIAIQkhEgAy0ACEEERg0LIAMpAwgiDEL/AYNCBFENCwwMCyADQSBqIAIgASgCKEEAEIsCAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINCgsCQAJAAkACQAJAIAEoAghBgICAgHhzIgRBBCAEQQRJGw4FAAECAwQACyADQSBqIAFBEGogAhCvGiADLQAgQQRGDRggAykDICIMQv8Bg0IEUg0MDBgLIANBIGogAUEQaiACEGsgAy0AIEEERg0XIAMpAyAiDEL/AYNCBFINCwwXCyABKAIQIQQgA0EgaiACIAEoAgwiBUEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCwJAIAEtABQNACADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGMq5wBQQUQvQ0gAy0ACEEERg0YIAMpAwgiDEL/AYNCBFINAQwYCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGRq5wBQQQQvQ0gAy0ACEEERg0XIAMpAwgiDEL/AYNCBFENFwsgDEL/AYNCBFINCgwWCyADQSBqIAFBEGogAhCxAiADLQAgQQRGDRUgAykDICIMQv8Bg0IEUg0JDBULIANBCGogAiABKAIgQQAQiwICQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0ICyADQQA2AiAgA0EIaiACIANBIGpB4PObAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINCAsgASgCECIHIAEoAhwiBmohBCABKAIYIQogASgCDCELQQAhAQNAAkACQAJAIAQgAUYNACABQQFxDQEgAUEBdiIFIAZPDQcgA0EIaiAKIAVBBXRqIAIQaSADLQAIQQRGDQIgAykDCCIMQv8Bg0IEUg0LDAILIANBCGogAiADQSBqQeDzmwFBARCyDSADLQAIQQRGDRcgAykDCCIMQv8Bg0IEUQ0XDAoLIANBCGogAiADQSBqQfTzmwFBAhCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQoLIAFBAXYiBSAHTw0GIANBCGogCyAFQQJ0aiACENAtAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINCgsgA0EIaiACIANBIGpBqZmcAUEBELINIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQkLIAFBAWohAQwACwsgA0EgaiACIAEoAiBBABCLAgJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQYLIAEtACxFDQQgA0EANgIgIANBCGogAiADQSBqQeb0mwFBBxCzDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQYLIANBIGogAhCSESADLQAgQQRGDQQgAykDICIMQv8Bg0IEUQ0EDAULIANBIGogAUEIaiACEKUDIAMtACBBBEYNEiADKQMgIgxC/wGDQgRRDRIgACAMNwIADBMLIAIgAigCLEEBajYCLAwJCyAFIAZB5PObARCRFQALIAUgB0H485sBEJEVAAsgA0EgaiACIAFBCGoiBSABLQAcIgRBAkdBA3RqKAIAQQAQiwICQAJAAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsCQCAEQQJGDQAgA0EgaiAFIAIQhBggAy0AIEEERg0CIAMpAyAiDEL/AYNCBFINAQwCCyADQSBqIAEoAgggASgCDCACEPkPIAMtACBBBEYNASADKQMgIgxC/wGDQgRRDQELIAxC/wGDQgRSDQELIAEoAihFDQ4gA0EgaiACEJIRAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsgA0EANgIgIANBCGogAiADQSBqQe30mwFBAhCzDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBIGogAhCSEQJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQELIANBIGogAUEoaiACEM8tIAMtACBBBEYNDiADKQMgIgxC/wGDQgRRDQ4LIAxC/wGDQgRRDQ0gACAMNwIADA4LIAxC/wGDQgRRDQwLIAxC/wGDQgRRDQsLIAxC/wGDQgRRDQogACAMNwIADAsLIANBCGogAiADQSBqQeGrnAFBARCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAUEYaiACEIQYAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsCQCABKAIwRQ0AIANBCGogAhCSEQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQILIANBCGogAiADQSBqQZyWnAFBAhCzDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQILIANBCGogAhCSEQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQILIANBCGogAUEwaiACENAtIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELAkAgASgCNEUNAAJAIAItAE0NACADQQhqIAIQkhEgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAgsgA0EIaiACIANBIGpB3KucAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAgsCQCACLQBNDQAgA0EIaiACEJIRIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQILIANBCGogAUE0aiACENAtIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELAkAgASgCQEUNACADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIAIgA0EgakG2hJwBQQIQsw0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIAFBwABqIAIQ0C0gAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGpB4qucAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsCQAJAAkACQCABLQBJDgQAAQIDAAsgA0EIaiACIANBIGpBp5mcAUEBELINIAMtAAhBBEYNAiADKQMIIgxC/wGDQgRRDQIMAwsgA0EIaiACIANBIGpByfObAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAwsgA0EIaiACIANBIGpBp5mcAUEBELINIAMtAAhBBEYNASADKQMIIgxC/wGDQgRRDQEMAgsgA0EIaiACIANBIGpByvObAUEBELINAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAgsgA0EIaiACIANBIGpBp5mcAUEBELINIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELAkAgASgCREUNACADQQhqIAIgA0EgakHgq5wBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIAFBxABqIAIQ0C0gAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiACIANBIGoQtA0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIQjBYCQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyACIAIoAixBf2o2AiwgA0EIaiACIANBIGpBqZmcAUEBELINIAMtAAhBBEYNCSADKQMIIgxC/wGDQgRRDQkLIAxC/wGDQgRRDQggACAMNwIADAkLIANBADoAFyAJIQFBACEFQQAhBgNAAkACQAJAIAFFDQAgBEEsaiILKAIAIQogA0EgaiACIAdB0AIgBSAGIANBF2ogA0EWahCtBQJAIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQYLIANBIGogAiAEQShqKAIAQQAQiwICQAJAAkAgAy0AIEEERg0AIAMpAyAiDEL/AYNCBFINAQsCQCAEKAIAQQdGDQAgA0EgaiAEIAIQxgYCQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0CCyADQQA2AiAgA0EYaiACIANBIGpB4KucAUEBELINAkAgAy0AGEEERg0AIAMpAxgiDEL/AYNCBFINAgsgAi0ATQ0AIANBIGogAhCSESADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCyADQSBqIARBMGogAhDQLSADLQAgQQRGDQEgAykDICIMQv8Bg0IEUQ0BCyAMQv8Bg0IEUg0GCyADLQAWDQEgA0EBOgAWDAILIANBIGogAiAIIAdB0AIgBSAGEI0CIAMtACBBBEYNAyADKQMgIgxC/wGDQgRSDQQMAwsgAigCREUNACADQSBqIAIgCygCAEEAEPADIAMtACBBBEYNACADKQMgIgxC/wGDQgRSDQMLAkAgAy0AF0UNACACIAIoAixBf2o2AiwgA0EAOgAXCyABQX9qIQEgBEE4aiEEQQEhBSAKIQYMAAsLIANBIGogAiAHIAlFQdACENsTIAMtACBBBEYNASADKQMgIgxC/wGDQgRRDQELIAxC/wGDQgRSDQELIANBIGogAiADQQhqQeKrnAFBARCyDSADLQAgQQRGDQQgAykDICIMQv8Bg0IEUQ0ECyAMQv8Bg0IEUQ0DIAAgDDcCAAwECyADQQA2AiAgA0EIaiACIANBIGpBlvObAUEDELMNAkAgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsCQCABKAIcRQ0AIAMgAUEcajYCGCADQQhqIAIQkhECQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0CCyADQQhqIANBGGogAhClLCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgA0EgakHdq5wBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgBiAFIAEoAgggASgCDBDBBQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELIANBCGogAiADQSBqQdyEngFBARCyDQJAIAMtAAhBBEYNACADKQMIIgxC/wGDQgRSDQELAkAgAi0ATQ0AIANBCGogAhCSESADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCyADQQhqIAIgA0EgakGZ85sBQQIQsg0CQCADLQAIQQRGDQAgAykDCCIMQv8Bg0IEUg0BCwJAIAItAE0NACADQQhqIAIQkhEgAy0ACEEERg0AIAMpAwgiDEL/AYNCBFINAQsgA0EIaiABQRBqIAIQzy0gAy0ACEEERg0CIAMpAwgiDEL/AYNCBFENAgsgDEL/AYNCBFENAQsgDEL/AYNCBFENACAAIAw3AgAMAQsgAEEEOgAACyADQTBqJAALoFMCGX8CfiMAQYACayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIQIgUgAygCFCIGSw0AAkACQCADKAIAIgdBf2pBAkkNAEGMqIQBIAFBMGogAS0APEEDRhsiCC0ADCIJQQJHDQELAkAgAy0AGA0AIARBxAFqIAMQkRsgBCgCyAEhCiAEKALEASEJAkAgBC0AzAFBAUYNAEECIQsMLgsgBC0AzQEhCCABQeAEaiILEIYtRQ0rDCwLIARBxAFqIAMQkRsgBCgCyAEhCiAEKALEASEJAkAgBC0AzAFBAUYNAEECIQsMIwsgBC0AzQEhCCABQeAEaiILEIYtRQ0gDCELIAMoAgQhDEEAIAggCUECRhshDQJAIAMtABgiCw0AIAEoAoAFIg4oArwCIQ8gBEHEAWogAxCRGyAEKALIASEQIAQoAsQBIQkCQCAELQDMAUEBRg0AQQIhCgwUCyAELQDNASEIIAFB4ARqIgoQhi1FDREMEgsgASgCgAUiDigCvAIhDyAEQcQBaiADEJEbIAQoAsgBIRAgBCgCxAEhCgJAIAQtAMwBQQFGDQBBAiERDAQLIAQtAM0BIQggAUHgBGoiCRCGLUUNAQwCCyAAQQA2AgAMMgsgCSAIEOEbRQ0AIAitIR1CBCEeDAILIAEgCGotAGAhEQsgEUH/AXEhCAJAAkAgCg4DBAABBAsgCEEGaiEIDAMLIAEtAFlBAXENASAQrSEdQgIhHgsgHUIghiAehCEdDAILAkAgECAOKALcAk8NACAQQQZsIAhqQQxqIQgMAQsgASgChAUQ1xohCQwCCwJAIAggAigCiAEiCUkNACAIIAlBuOKDARCRFQALIAIoAoQBIAhBAnRqKAIAIglBAE4NASAEIAI2AuwBIAQgATYC6AEgBEG4AWogBEHoAWogCiAQIBEQigECQCAEKAK4AUEFRw0AIAQoArwBIQkMAgsgBCkDuAEhHQsgHUIgiKchAgJAAkACQAJAIB2nIghBfWoiBkECIAZBAkkbDgMAAQIACyAFELQjIQUMAgsgBUUNAyACIAVBf2oQsSEhBQwBCyAIIAIQriEhBQsgAEECNgIAIAAgBTYCBAwrCyAEQegBaiANKAIAIA0oAgQiCCgCCEF/akF4cWpBCGogAygCCCIQIAMoAgwiEiAFIAYgCCgCEBESAEEAIQggBCgC6AFFDQUgBCgC7AEhCCAPRQ0GIAQgBjYC2AEgBCAFNgLUASAEIBI2AtABIAQgEDYCzAEgBCALOgDcASAEIAw2AsgBIAQgBzYCxAEgBEHEAWogCBD8DwJAAkAgBCgC1AEiCUUNACAJQX9qIgUgBCgC0AFJDQELIAQoAsgBIREgBCgCxAEhC0ECIQoMBAsgBCgCzAEgBWotAAAhBSAEKALIASERIAQoAsQBIQsgAUHgBGoiChCGLUUNAQwCC0H04IMBQSRBmOGDARCyFwALIAogBRDhG0UNACAEIAWtQiCGQgSENwPgAQwCCyABIAVqLQBgIQoLIApB/wFxIQUCQAJAAkACQAJAIAsOAwIAAQILIAVBBmohBQwBCwJAIAEtAFlBAXENACAEIBGtQiCGQgKENwPgAQwECwJAIBEgDigC3AJPDQAgEUEGbCAFakEMaiEFDAELIAEoAoQFENcaIQUMAQsCQCAFIAIoAogBIgNJDQAgBSADQbjigwEQkRUACyACKAKEASAFQQJ0aigCACIFQQBIDQELIARBBTYC4AEgBCAFNgLkAQwBCyAEIAI2ArwBIAQgATYCuAEgBEHgAWogBEG4AWogCyARIAoQigELIARBiAFqIARB4AFqIAkQnRAgBCgCjAEhCSAEKAKIAUEBcUUNASAAIAk2AgRBAiEICyAAIAg2AgAMJAsCQCACKAKwAUEBcUUNACACIAIoArQBIgUgAigCuAEiC2sgCyAFayAFIAtLGyACKAJwajYCcAsgAiAINgK4ASACIAg2ArQBIAJBATYCsAECQCAIIAZPDQAgAUHgAGohEyABQeAEaiEUIAZBAWohFSABQeACaiELIAxBBmxBDGohFiABKAKEBSEXIAEtAFlBAXEhGANAAkACQAJAAkACQAJAIAlB////P0sNACAIIAZPDQQgAigCfCEZIAIoAnghCgJAAkADQCAKIAkgCyAQIAhqIhEtAABqLQAAakECdGooAgAhBSAIQQNqIgMgBk8NBCAFQYCAgMAATw0EIAogBSALIBFBAWotAABqLQAAakECdGooAgAiCUH///8/Sw0BIAogCSALIBFBAmotAABqLQAAakECdGooAgAiBUH///8/Sw0CAkAgCiAFIAsgEUEDai0AAGotAABqQQJ0aigCACIJQf///z9LDQAgCEEEaiIIIAZJDQEMCAsLIAUhESAJIQUMBAsgCEEBaiEDIAUhESAJIQUMAwsgCEECaiEDIAkhEQwCCwJAAkAgAigCsAFFDQAgAiAINgK4AQJAIAggEkkNACAIIBJBuOODARCRFQALIAlB////P3EgCyAQIAhqLQAAIhFqLQAAaiIFIAIoAnwiCk8NAQJAAkAgAigCeCAFQQJ0aigCACIKQQBIDQBBACEFDAELIAQgAjYCyAEgBCABNgLEASAEQfgAaiAEQcQBaiAJIBFBCHQQgAEgBCgCfCEKIAQoAnghBQsCQCAFQQFxRQ0AIAgQtCMhBSAAQQI2AgAgACAFNgIEDC0LIAghAyAKIQkMBAtB2OGDAUEfQfjhgwEQshcACyAFIApB1OCDARCRFQALIAkhESAIIQMLAkAgBUEASA0AIAUhCQwBCwJAAkAgAigCsAFFDQAgAiADNgK4ASARIAsgECADai0AACIIai0AAGoiBSAZTw0BAkACQCAKIAVBAnRqKAIAIglBAEgNAEEAIQUMAQsgBCACNgLIASAEIAE2AsQBIARBgAFqIARBxAFqIBEgCEEIdBCAASAEKAKEASEJIAQoAoABIQULIAVBAXFFDQIgAxC0IyEFIABBAjYCACAAIAU2AgQMKgtB2OGDAUEfQfjhgwEQshcACyAFIBlB1OCDARCRFQALAkACQAJAAkACQAJAAkACQAJAAkAC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AkACQCALDgMCAAECCyAFQQZqIQUMAQsCQCABLQBZQQFxDQAgBCARrUIghkIChDcD4AEMBAsCQCARIA4oAtwCTw0AIBFBBmwgBWpBDGohBQwBCyABKAKEBRDXGiEFDAELAkAgBSACKAKIASIDSQ0AIAUgA0G44oMBEJEVAAsgAigChAEgBUECdGooAgAiBUEASA0BCyAEQQU2AuABIAQgBTYC5AEMAQsgBCACNgK8ASAEIAE2ArgBIARB4AFqIARBuAFqIAsgESAKEIoBCyAEQbABaiAEQeABaiAJEJ0QIAQoArQBIREgBCgCsAFBAXFFDQEgACARNgIEQQIhCAsgACAINgIADBULAkAgAigCsAFBAXFFDQAgAiACKAK0ASIFIAIoArgBIglrIAkgBWsgBSAJSxsgAigCcGo2AnALIAIgCDYCuAEgAiAINgK0ASACQQE2ArABAkACQAJAAkACQCAIIAZJDQBBACEXDAELIAFB4ABqIRMgAUHgBGohFCAGQQFqIRUgAUHgAmohCSAMQQZsQQxqIRogASgChAUhGyABLQBZQQFxIRxBACEXA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCARQf///z9LDQAgCCAGSQ0BDAsLIAIoArABRQ0CIAIgCDYCuAEgCCASSQ0BIAggEkG444MBEJEVAAsgAigCfCEZIAIoAnghCwNAIAsgESAJIBAgCGoiCi0AAGotAABqQQJ0aigCACEFIAhBA2oiAyAGTw0HIAVBgICAwABPDQcgCyAFIAkgCkEBai0AAGotAABqQQJ0aigCACIRQf///z9LDQUgCyARIAkgCkECai0AAGotAABqQQJ0aigCACIFQf///z9LDQYgCyAFIAkgCkEDai0AAGotAABqQQJ0aigCACIRQf///z9LDQQgCEEEaiIIIAZPDQoMAAsLIBFB////P3EgCSAQIAhqLQAAIgpqLQAAaiIFIAIoAnwiC08NAQJAAkAgAigCeCAFQQJ0aigCACILQQBIDQBBACEFDAELIAQgAjYCyAEgBCABNgLEASAEQaABaiAEQcQBaiARIApBCHQQgAEgBCgCpAEhCyAEKAKgASEFCwJAIAVBAXFFDQAgCBC0IyEFIABBAjYCACAAIAU2AgQMJAsgCCEDIAshEQwHC0HY4YMBQR9B+OGDARCyFwALIAUgC0HU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bCAIakEMaiEIDAELIAEoAoQFENcaIQgMAgsCQCAIIAIoAogBIhFJDQAgCCARQbjigwEQkRUACyACKAKEASAIQQJ0aigCACIIQQBODQEgBCACNgLsASAEIAE2AugBIARBuAFqIARB6AFqIAkgCiALEIoBAkAgBCgCuAFBBUcNACAEKAK8ASEIDAILIAQpA7gBIR0LIB1CIIinIQICQAJAAkACQCAdpyIIQX1qIgZBAiAGQQJJGw4DAAECAAsgBRC0IyEFDAILIAVFDQMgAiAFQX9qELEhIQUMAQsgCCACEK4hIQULIABBAjYCACAAIAU2AgQMAwsCQCACKAKwAUEBcUUNACACIAIoArQBIgkgAigCuAEiC2sgCyAJayAJIAtLGyACKAJwajYCcAsgAiAFNgK4ASACIAU2ArQBIAJBATYCsAECQCAFIAZJDQAgAygCDCEQQQAhDAwCCyABQeACaiEJIAEoAoQFIRUgASgCgAUhDiADKAIMIRAgAygCCCENQQAhDANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCEH///8/Sw0AIAUgBkkNAQwLCyACKAKwAUUNAiACIAU2ArgBIAUgEEkNASAFIBBBuOODARCRFQALIAIoAnwhGSACKAJ4IQsDQCALIAggCSANIAVqIgotAABqLQAAakECdGooAgAhESAFQQNqIgcgBk8NByARQYCAgMAATw0HIAsgESAJIApBAWotAABqLQAAakECdGooAgAiCEH///8/Sw0FIAsgCCAJIApBAmotAABqLQAAakECdGooAgAiEUH///8/Sw0GIAsgESAJIApBA2otAABqLQAAakECdGooAgAiCEH///8/Sw0EIAVBBGoiBSAGTw0KDAALCyAIQf///z9xIAkgDSAFai0AACIRai0AAGoiCyACKAJ8IgpPDQECQAJAIAIoAnggC0ECdGooAgAiCkEASA0AQQAhCAwBCyAEIAI2AsgBIAQgATYCxAEgBEHAAGogBEHEAWogCCARQQh0EIABIAQoAkQhCiAEKAJAIQgLAkAgCEEBcUUNACAFELQjIQUgAEECNgIAIAAgBTYCBAwOCyAFIQcMBwtB2OGDAUEfQfjhgwEQshcACyALIApB1OCDARCRFQALIAghCiARIQgMAwsgBUEBaiEHIAghCiARIQgMAgsgBUECaiEHIBEh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+ANqQQRyIQcCQANAIAZBAXENAQJAIAEtAOABQT1GDQAgASgC3AEhBCABKALYASEDIAJB+AZqIAEQ1CYgAkEBNgL8AyACQZy/nAE2AvgDIAJCATcChAQgAkGzBzYCrAcgAkE9OgCfBSACIAJBqAdqNgKABCACIAJBmAVqNgKoByACIAJBnwVqNgKYBSACQagDaiACQfgDahD9GiACQbwDaiACQYAHaigCADYCACACIAIpAvgGNwK0AyADIAQgAkGoA2oQ4BohBSABLQDgAUGiAUcNMiABIAEQmiwQpxcMMgsgARChCyACQSBqIAEQxhIgAigCJCEFIAIoAiBBAXENMSACQbQFaiAFQaTYmwEQ0iECQCABLQDgAUEDRg0AIAEoAtwBIQQgASgC2AEhAyACQZAHaiABENQmIAJBATYC/AMgAkGcv5wBNgL4AyACQgE3AoQEIAJBswc2AqwHIAJBAzoAnwUgAiACQagHajYCgAQgAiACQZgFajYCqAcgAiACQZ8FajYCmAUgAkGoA2ogAkH4A2oQ/RogAkG8A2ogAkGYB2ooAgA2AgAgAiACKQKQBzcCtAMgAyAEIAJBqANqEOAaIQUgAS0A4AFBogFHDTIgASABEJosEKcXDDILIAEQoQsgAkH4A2ogARDtCyACKAL4AyEFIAItAJAEIgZBAkYNMSACQeABakEQaiIKIAdBEGooAgA2AgAgAkHgAWpBCGoiCyAHQQhqKQIANwMAIAIgBykCADcD4AEgAiAJKAAANgKgBSACIAlBA2ooAAA2AKMFAkAgAigC9AYiCCACKALsBkcNACACQewGakG02JsBEOkdCyACKALwBiAIQQV0aiIEIAU2AgAgBCACKQPgATcCBCAEIAY6ABggBCACKAKgBTYAGSAEQQxqIAspAwA3AgAgBEEUaiAKKAIANgIAIARBHGogAigAowU2AAAgAiAIQQFqNgL0BgwACwsgAkGABWpBCGoiBiACQewGakEIaigCADYCACACIAIpAuwGNwOABSACKAK4BSEFIAIoArQFIgRBgICAgHhGDTEgAigCvAUhByACQeABakEIaiAGKAIANgIAIAIgAikDgAU3A+ABIAIgBzYCyAUgAiAFNgLEBSACIAQ2AsAFIAEtAOABQRpGDQUgASgC3AEhBCABKALYASEDIAJBqAVqIAEQ1CYgAkEBNgL8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QZQCakEBEJYlIAgoAgAhCyAIQQE2AgAgCyACKAKYAmpB3wA6AAAgAkGUAmogHiAeIBpqENcgIAIoArABIAIoArQBENgsIAJBsAFqQQhqIAgoAgA2AgAgAiACKQKUAjcDsAEMAQsgCyACKALIAkGIr5wBEI4pAAsgAikCtAEhISACKAKkAiEIIAIoArABIgtBgICAgHhGDQAgAigCoAIgCBDYLCACIAs2AqACIAIgITcCpAIgIachCAsgAigCqAIhCyACQd8ANgLAAgJAIAggCyACQcACakEBEOolDQAgAkEBNgLEAiACQcyumwE2AsACIAJCATcCzAIgAiAjNwOIAiACIAJBiAJqNgLIAiACQbABaiACQcACahDtCSACKAKgAiACKAKkAhDYLCACQaACakEIaiACQbABakEIaigCADYCACACIAIpArABNwOgAgsgAkHAAmpBCGogAkGgAmpBCGooAgA2AgAgAiACKQOgAjcDwAICQCACQcACahD4JiIhQgODIiJCAFINACAhpyIIIAgoAgAiCEEBajYCACAIQX9MDQYLAkAgASgCcCIIIAEoAmhHDQAgIEHMoZsBEPcdCyABKAJsIAhBBHRqIgsgEzYCCCALICE3AwAgASAIQQFqNgJwQQAtAKDxngEaQcAAEH0iCEUNBSAIQQA2AgggCEIxNwMAIAQoAgwhCyAEIAg2AgwCQCAiQgBSDQAgIaciCCAIKAIAIghBAWo2AgAgCEEASA0GIAQoAgwhCAsgCBC0ASAEKAIMIghBADoAPCAIIAs2AjggCEIANwMwIAhBADYCICAIQQA6ABwgCCATNgIYIAggEjYCFCAIIBg2AhAgCCAhNwMIIAhBADYCAEEALQCg8Z4BGiAEKAIUIQsgBCgCECEIQcAAEH0iEUUNBSARQQA6ABwgESATNgIYIBEgEjYCFCARIBg2AhAgESAhNwIIIBFBGjYCAEEDIRMLIAIgDjYCzAEgAiAWNgLIASACIBE2ArQBIAIgEzYCsAEgAiAKrUIghiAXrYQ3A8ABIAIgC61CIIYgCK2ENwO4ASAEKAI8IQggBEEANgI8AkAgCEUNACACQcACakE4aiAIQThqKQMANwMAIAJBwAJqQTBqIAhBMGopAwA3AwAgAkHAAmpBKGogCEEoaikDADcDACACQcACakEgaiAIQSBqKQMANwMAIAJBwAJqQRhqIAhBGGopAwA3AwAgAkHAAmpBEGogCEEQaikDADcDACACQcACakEIaiAIQQhqKQMANwMAIAIgCCkDADcDwAIgAkGwAWogAkHAAmoQoQQhCyAIQcAAQQgQsxYgCyAEKAIoIAQoAiwQ4goCQCACKAJUIgQgAigCTEcNACACQcwAakHsoZsBEPUdCyACKAJQIARBAnRqIAs2AgAgAiAEQQFqNgJUDAILQdyhmwEQ0iwACwJAIAIoAlhBBUYNACACQdgAahDIDiACKAKcASIIIAIoAqABEJklIAIoApgBIAgQnS0gAigCeCIIQYCAgIB4Rg0AIAIoAnwiCyACKAKAARCeJSAIIAsQni0LIAIgBDYCWAJAQdQARQ0AIAkgAkGwAWpB1AD8CgAACyATIRQLIAZBAWohCyADQQBB2AAgAyAVRhtqIQggBiAQRg0EDAALCyACQQE2AsQCIAJB/J+bATYCwAIgAkIANwLMAiACIAJBsAFqNgLIAiACQcACakGEoJsBEOkjAAsACwJAIAAoAhQiA0UNACAAKAIQIQQgA0HYAGwhAwNAAkAgBCgCAEEFTw0AIAIgCzYCyAIgAiAGNgLEAiACIAg2AsACIAQgAkHAAmoQoAQgAkGwAWogDBDXEyACQcACakEQaiACQbABakEQaigCADYCACACQcACakEIaiACQbABakEIaikCADcDACACIAUgD0EEdGo2AuACIAIgBzYC3AIgAiAFNgLYAiACIAU2AtQCIAIgAikCsAE3A8ACIAJBwAJqELAHIAJBwAJqEK0DIAJB1AJqELUTDAYLIARB2ABqIQQgA0Gof2oiAw0ACwsgAkGwAWogDBDXEyACQcACakEQaiACQbABakEQaigCADYCACACQcACakEIaiACQbABakEIaikCADcDACACIAUgD0EEdGo2AuACIAIgBzYC3AIgAiAFNgLYAiACIAU2AtQCIAIgAikCsAE3A8ACIAJBwAJqELAHIAJBwAJqEK0DIAJB1AJqELUTIAYgCxDwIiAIIAYQny0MAwsgAigCWEEFRg0AAkBB2ABFDQAgAkGwAWogAkHYAGpB2AD8CgAACyACQbABaiACQcwAahCgBCAAKAIQIQMCQCAUIAAoAhQiBE8NACADIBRB2ABsaiIGKAIAQQpHDQAgBigCBCACKALoAUcNACAGKAIIIAIo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mAEgAiACKQNANwKQASAOIApBGGxqIQ8gAkGAAmpBDGohECACQdACakEMaiEJIAAoArQBIREgDiEBAkACQAJAA0ACQAJAIAEgD0YNAEGAgICAeCEEAkAgASgCAEGAgICAeEYNACACQYgDaiABQQRqKAIAIAFBCGooAgAQrxcgAigCiAMhBAsgBEGBgICAeEYNACABQRBqKAIAIQggAUEMaigCACEHIAIpAowDITcgAiABQRRqLQAAOgDkAiACIAg2AuACIAIgBzYC3AIgAiA3NwLUAiACIAQ2AtACIAJBsANqIAYgCSARIBEQeSACKAKwA0UNASACIAIpArQDNwPwAiACQZwBakEMaiAAQYABai8BADsBACACQdjCgAE2ApwBIAIgACkCeDcCoAEgAkGsAWpBDGogAEGoAWoiAS8BADsBACACQQYgAigC2AIgAigC0AJBgICAgHhGIgQbNgKAAyACQeDCgAEgAigC1AIgBBs2AvwCIAIgACkCoAE3ArABIAIgAkH8Amo2AqwBIAJBvAFqQQxqIAEvAQA7AQAgAiACKALcAjYC8AEgAiAAKQKgATcCwAEgAiACQfABajYCvAEgAkHMAWpBDGogAS8BADsBACACIAIoAuACNgKkAiACIAApAqABNwLQASACIAJBpAJqNgLMASACQbACakEMaiAAQYoBai8BADsBACACIAApAYIBNwK0AiACIAJB8AJqNgKwAiACQQE2AqwDIAJBAjYCpAMgAkECNgKcAyACQQM2ApQDIAJBAzYCjAMgAiACQbACajYCqAMgAiACQcwBajYCoAMgAiACQbwBajYCmAMgAiACQawBajYCkAMgAiACQZwBajYCiAMgAkEANgKQAiACQQY2AoQCIAJBhMOAATYCgAIgAkEFNgKMAiACIAJBiANqNgKIAiACQfwAaiACQYACahCPKSELIAItAPACIAIoAvQCEMoaIAJB0AJqEIspIAIoApgBIQQgAigClAEiDCEBA0AgBEUNBCABKAIAIAFBBGooAgAQkCkgAUEYaigCACEHAkAgAUEcaigCACIIKAIAIgVFDQAgByAFEQMACwJAIAgoAgQiBUUNACAHIAUgCCgCCBCzFgsgBEF/aiEEIAFBIGohAQwACwsgAigCmAEhBCACKAKUASEBIAIgAigCkAE2AsQBIAIgATYCwAEgAiABNgK8ASACIAEgBEEFdGo2AsgBIABBEGohEiAAQcAAaiETIABBxABqIRQgAEEYaiEVIABBFGohFiAAQSRqIRcgAEE4aiEYIABBBGohGSAAKAJwIhogACgCdEEKbGohGyACQYACakEEaiEcIAJB0AJqQQRqIR0gAkGIA2pBBGohHiACQYgDakEUaiEfIAJBzAFqQQxqISAgACgCuAEhISACQcwBakEEaiIiQQhqISMCQANAIAIoAsABIgEgAigCyAFGDQEgAiABQSBqNgLAASABKAIAIgRBgYCAgHhGDQEgASgCHCEkIAEoAhghJSAiIAEpAgQ3AgAgIyABQQxqKQIANwIAICJBEGogAUEUaigCADYCACACIAQ2AswBIAJBiANqIAYgICARIBEQeQJAIAIoAogDQQFHDQAgAigCjAMgAigCkAMQyhoMBgsgAkEwaiACKAKMAyImIAIoApADIicoAgwRBgAgAkGsAWogAigCMCACKAI0ENsFICYgJygCHBEEACEEICYgJygCEBEEACgCACEJIAJBKGogAigCtAEiAUEBQQFBiK+cARChGUEAIQwgAkEANgK4AiACIAIpAyg3ArACIAJBIGpBAUEEQRRBmMaAARChGSACQQA2AtgCIAIgAigCJCIoNgLUAiACIAIoAiA2AtACIAIgASACKAKwASIIajYCiAIgAiAINgKEAkGBgMQAIQEgCSEHA0AgAkGBgMQANgKAAgJAIAFBgYDEAEcNACAcEJMNIQELAkACQAJAAkACQAJAIAFBgIDEAEYNAAJAAkAgAUGAAU8NAEEBIQgMAQsCQCABQYAQTw0AQQIhCAwBC0EDQQQgAUGAgARJGyEICyAIIAdqIQdBACEFIAFBdmoOBAUCAgECCyACKQLUAiE3IAIoAtACIQEgAkGwAmoQzSwCQCACKAKsAUGAgICAeEYNACACQawBahDNLAsgJiAnEMMjIAFBgICAgHhHDQIMCwsgAigCgAIhCCACQYGAxAA2AoACAkACQAJAIAhBgYDEAEcNAAJAIAIoAoQCIgsgAigCiAJHDQBBgIDEACELDAMLIAIgC0EBajYChAIgCy0AACIIwEF/Sg0BIAIgC0ECajYChAIgCy0AAUE/cSEpIAhBH3EhEAJAIAhB3wFLDQAgEEEGdCApciEIDAILIAIgC0EDajYChAIgKUEGdCALLQACQT9x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AiAMQQFqIgw2AtgCIAJBADYCuAIgAigCgAIhASAFIQQgByEJDAALCwsgAkG8AWoQyRBBACELDAQLIAIoArgDIQQgAigCtAMhCAJAAkACQAJAIAIoApgBIgVFDQACQCACKAKUASIpIAVBBXRqIgdBYGoiKEUNACAHQXhqIgsoAgAgB0F8aiIMKAIAKAIYEQQAIAsoAgAgDCgCACgCIBEEAGogCCAEKAIYEQQASQ0DIAJBOGogKBDiJSACKALgAiACKALcAmoiCyAHQXBqKAIAIAdBbGoiKCgCACIHaiIMIAsgDEsbIQsCQAJAIAIoAjgiDEUNACACQYgDaiAMIAIoAjwQiRggKCgCACEHDAELIAJBgICAgHg2AogDCyACQYACakEIaiIoIAJBiANqQQhqIgwoAgA2AgAgAiACKQKIAzcDgAIgAkEAOgCUAiACIAc2AowCIAIgCyAHazYCkAIgAkGwAmogBiAQIBEgERB5AkAgAigCsAIiBw0AIAIgBUF/aiIHNgKYASACKAK4AiEFIAIoArQCIQsgDCApIAdBBXRqIgdBCGopAgA3AwAgAkGIA2pBEGoiKSAHQRBqKQIANwMAIAJBiANqQRhqIAdBGGopAgA3AwAgAiAHKQIAIjc3A4gDAkAgN6dBgYCAgHhGDQAgAkGIA2oQiykgAigCoAMgAigCpAMQwyMLICkgAkGAAmpBEGopAwA3AwAgDCAoKQMANwMAIAIgAikDgAI3A4gDIAIgBTYCpAMgAiALNgKgAyACQZABaiACQYgDakGEwoABEMYUIAggBBDDIyACQdACahCLKQwFCyACQYACahCLKSACKAK4AiEFIAcNAiACKAK0AiAFEMMjDAMLQfTBgAEQ0iwACyACQYgDakEQaiACQdACakEQaikCADcDACACQYgDakEIaiACQdACakEIaikCADcDACACIAIpAtACNwOIAyACIAQ2AqQDIAIgCDYCoAMgAkGQAWogAkGIA2pBpMKAARDGFAwCCyACLQC0AiAFEMoaCyACQYgDakEQaiACQdACakEQaikCADcDACACQYgDakEIaiACQdACakEIaikCADcDACACIAIpAtACNwOIAyACIAQ2AqQDIAIgCDYCoAMgAkGQAWogAkGIA2pBlMKAARDGFAsgAUEYaiEBDAALCyACKAKQASAMENMsDAELIAJBzAFqEIspICUgJBDDIyACQbwBahDJEEEBIQsLIA4hAQJAA0AgCkUNASABKAIAIAFBBGooAgAQkCkgCkF/aiEKIAFBGGohAQwACwsgDSAOQQRBGBCSFSALDQEgAigCfCEFCyACKQKAASE3DAELIAJB/ABqEM0sQYCAgIB4IQULIABBwAFqIQQLIAMoAjghByACQQhqIAMoAjwiAUEEQShB4OmbARCiGSACQQA2AogCIAIgAigCDDYChAIgAiACKAIIIgg2AoACAkACQCABIAhNDQAgAkGAAmpBACABQQRBKBD9CAwBCyABDQAgAkHQAGpBCGogAkGAAmpBCGooAgA2AgAgAiACKQKAAjcDUAJAAkAgAygCAEECRw0AQQAhAQwBCyADKAIMIQggAygCCCEBCwJAAkACQCADQSRqKAIARQ0AIAJBiANqIAQoAgBBCGogA0EgaigCACgCABCXAwJAAkAgAigCiANFDQAgAkHQAmpBCGogAkGIA2pBCGopAgA3AwAgAiACKQKIAzcD0AIMAQsgAkEANgLQAgsgA0EkaigCAEUNASACQYgDaiAEKAIAQQhqIANBIGooAgAoAgQQlwMCQCACKAKIA0UNACACQYACakEIaiACQYgDakEIaikCADcDACACIAIpAogDNwOAAgwDCyACQQA2AoACDAILIAJBADYC0AILIAJBADYCgAILAkACQAJAAkAgAigC0AIiBw0AQYCAgIB4IQsMAQsgAkEANgK4AiACQoCAgIAQNwKwAiACQYCAgAE2AowDIAJCoICAgA43ApADIAIgAkGwAmo2AogDIAdB6ABqIAJBiANqENcoDQEgAikCtAIhOCACKAKwAiELCwJAAkAgAUUNACACQYgDaiABIAgQ/xMMAQsgAkGAgICAeDYCiAMLIAMoAhhFDQEgAkHwAGogAygCFCIBQQRqKAIAIAFBCGooAgAQrxcgAkHgAGpBCGoiDCACQYgDakEIaigCADYCACACIAIpAogDNwNgIAIoAowCIQkgAigChAIhCiACKAKAAiEoIAIoAtwCISkgAigC1AIhECAAKAK8ASIEQQhqEJEXIQACQCAEKAIUIgggBCgCDEcNACAEQQxqEMMdCyAEKAIQIAhB3ABsaiIBIAk2AhwgASAoQQBHIgk2AhggASAKNgIUIAEgCTYCECABICk2AgwgASAHQQBHIgc2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GC8BADsBACAIIAMpA+AINwGWASAIQZ4BaiALLwEAOwEAIAggEDYCtAEgCCAFNgK4ASAIIBE2ArwBIAggEjYCwAEgCEGoAWogGi8BADsBACAIIAMpA9AINwKgASAIIAMpA8AINwGqASAIQbIBaiAVLwEAOwEAIANBxwVqIhFBACkDgIWeASIcNwAAIANBACkD+ISeASIbNwC/BSADQakEaiADQbwFakEIaiIJKQAANwAAIANBsARqIANBywVqIhIoAAA2AAAgA0EAOgCgBCADIAMpALwFNwChBCARIBw3AAAgAyAbNwC/BSADQQA6ALQEIANBxARqIBIoAAA2AAAgA0G9BGogCSkAADcAACADIAMpALwFNwC1BCARIBw3AAAgAyAbNwC/BSADQQE6AN4EIANBADYA3wQgA0EAOgCEBCADQQA2AoAEIANBgAI7AdwEIANBuICAATYCjAQgAyAINgKIBCADQQA6AMgEIANBADYCnAQgA0KAgICAwAA3ApQEIANBADoAkAQgA0HYBGogEigAADYAACADQdEEaiAJKQAANwAAIAMgAykAvAU3AMkEAkBBKEUNACADQbwFaiADQZACakEo/AoAAAsgAyADQYAEajYC6AUgAyADQYwCajYC5AVBFiADQYAEahD6JCERIANB8AhqIAMoAowCIANBgARqIANBvAVqIANBvAVqQQxqED8CQAJAIAMoAvAIQYCAgIB4Rw0AIANB8AZqEOcnIANBkAlqIgkgA0HwBmpBDGopAgA3AwAgA0GICWpBEGoiEiADQYQHaigCADYCACADIAMpAvQGNwOICSADKALwBiEGQSwQ6CciCCAGNgIEIAhBoNeAATYCACAIIAMpA4gJNwIIIAhBEGogCSkDADcCACAIQRhqIBIoAgA2AgAgCCADKQL0CDcCHCAIQSRqIANB8AhqQQxqKQIANwIAIAMgCDYC9AYgA0GAgICAeDYC8AYMAQsgA0HwBmpBEGogA0HwCGpBEGopAgA3AwAgA0HwBmpBCGogA0HwCGpBCGopAgA3AwAgAyADKQLwCDcD8AYLQbDimAEgERCtJgJAAkAgAygCgAQNACADKAL0BiENIAMoAvAGIgxBgICAgHhGDQYgAykDgAchHCADKAL8BiEOIAMoAvgGIQoMAQsgAygC9AMiCEEIahCRF0EAOgAAIAgoAhQhDiAIKAIQIQogCEIENwIQIAgoAgwhDSAIQQA2AgxBgICAgHghDAJAAkAgAygC8AZBgICAgHhGDQAgA0HwBmoQ0ysMAQsgAygC9AYiCCAIKAIAKAIAEQMACwsCQCADKAKABA0AIANBgARqQRBqIgsQ5CUgAygCmAQiEUHQAGohEiADKAKcBCEYIANBADYCnARBACARayEGIBhB0ABsIghBsH9qIQkgESAIaiEaAkADQCAJQbB/Rg0BAkAgESgCACIFQQNGDQACQEHMAEUiEA0AIANBvAVqIBFBBGpBzAD8CgAAC0EALQCg8Z4BGkHQABB9IghFDQYgCCAFNgIAAkAgEA0AIAhBBGogA0G8BWpBzAD8CgAACyADQQE6APgGIAMgCDYC9AYgAyADQYAEajYC8AYgA0HwBmoQ9gEgA0HwBmoQkhYgAygC9AYiCEEUaiIFKAIAIAhBGGooAgAQoSMgCCgCECAFKAIAENcsAkAgCCgCAEECRg0AIAgoAgQgCEEIaigCABDYLAsgEUHQAGohESAIKAIcIAhBIGooAgAQ2SwgCEEsaiIFKAIAIAhBMGooAgAQoiMgCCgCKCAFKAIAENosIAhBOGoiBSgCACAIQTxqKAIAEM0VIAgoAjQgBSgCABDbLCAIQcQAaiIFKAIAIAhByABqKAIAEIoNIAgoAkAgBSgCABDcLCAIQdAAQQQQsxYgEkHQAGohEiAGQbB/aiEGIAlBsH9qIQkMAQsLIBogEkYNACADKAKYBCIIIAZrIRJBACAIayEGIAlB0ABuIREDQCARRQ0BIBIgBmoiCEHkAGoiCSgCACAIQegAaigCABChIyAIQeAAaigCACAJKAIAENcsAkAgCEHQAGooAgBBAkYNACAIQdQAaigCACAIQdgAaigCABDYLAsgCEHsAGooAgAgCEHwAGooAgAQ2SwgCEH8AGoiCSgCACAIQYABaigCABCiIyAIQfgAaigCACAJKAIAENosIAhBiAFqIgkoAgAgCEGMAWooAgAQzRUgCEGEAWooAgAgCSgCABDbLCAIQZQBaiIJKAIAIAhBmAFqKAIAEIoNIAhBkAFqKAIAIAkoAgAQ3CwgEkHQAGohEiARQX9qIREMAAsLIBgNBiALEPskCyADKAKIBCERAkAgAygCjAQiCCgCACIJRQ0AIBEgCREDAAsCQCAIKAIEIglFDQAgESAJIAgoAggQsxYLIAMoApwEIREgAygCmAQhCAJAA0AgEUUNASAIQRRqKAIAIgkgCEEYaigCABChIyAIQRBqKAIAIAkQ1ywCQCAIKAIAQQJGDQAgCEEEaigCACAIQQhqKAIAEM8sCyAIQRxqKAIAIAhBIGooAgAQ2SwgCEEsaigCACIJIAhBMGooAgAQoiMgCEEoaigCACAJENosIAhBOGooAgAiCSAIQTxqKAIAEM0VIAhBNGooAgAgCRDbLCAIQcQAaiIJKAIAIAhByABqKAIAEIoNIAhBwABqKAIAIAkoAgAQ3CwgEUF/aiERIAhB0ABqIQgMAAsLIAMoApQEIAMoApgEQQRB0AAQkxUgA0GkBGoQ1AsgA0G4BGoQ1AsCQCADKALQBCIIRQ0AIAMoAswEIREgA0G8BWpBEEEQIAhBAWoQ2hEgESADKALEBWsgAygCvAUgAygCwAUQkykLIANBuAJqEPkeIANBjAJqELokQejsmAEgFxCtJiADKAK4ASADKAK8ARDQLAJAIAMoAsgBIghFDQAgAygCxAEhESADQbgCakEMIAhBAWoQhhMgESADKALAAmsgAygCuAIgAygCvAIQkykLIAMoAtgBIAMoAtwBENEsAkAgDEGAgICAeEcNACAORQ0HIANBADYCuAIgCigCOCEIIAooAjQhGCAKKAIYIQwgCigCECEQIAooAgghBSAKKAIAIQYgCigCUCEJIAooAkQhERAJIRICQAJAIAhBgICAgHhGDQAgA0HIAGogA0G4AmogEkGt1JgBQQQgCkE4ahDLEiADKAJIQQFxRQ0AIAMoAkwhBQwBCyASQbyPmQFBByAKKAIkIAooAigQkiECQCARQYCAgIB4Rg0AIANBwABqIANBuAJqIBJBrIKAAUEHIApBxABqEMsSIAMoAkBBAXFFDQAgAygCRCEFDAELAkAgCUGAgICAeEYNACADQThqIANBuAJqIBJBmNSAAUEIIApB0ABqEMsSIAMoAjhBAXFFDQAgAygCPCEFDAELAkAgBkUNACADQTBqIANBuAJqIBJBs4KAAUEJIAooAgAgCigCBBCrEiADKAIwQQFxRQ0AIAMoAjQhBQwBCwJAIAVFDQAgA0EoaiADQbgCaiASQbyCgAFBCyAKKAIIIAooAgwQqxIgAygCKEEBcUUNACADKAIsIQUMAQsCQCAQRQ0AIANBIGogA0G4AmogEkHHgoABQQcgCigCECAKKAIUEKsSIAMoAiBBAXFFDQAgAygCJCEFDAELAkAgDEUNACADQRhqIANBuAJqIBJBzoKAAUEJIAooAhggCigCHBCrEiADKAIYQQFxRQ0AIAMoAhwhBQwBCyAYRQ0JIAooAjRBKGwhDCAKKAIwIQsQCiEYQQAhCUEAIQYCQAJAA0AgDCAJRg0BIAsgCWoiCEEYaiIQKAIAIQUQCSIRQbyPmQFBByAIQQRqKAIAIAhBCGooAgAQkiECQCAFQYCAgIB4Rg0AIANBEGogA0G4AmogEUGsgoABQQcgEBDLEiADKAIQQQFxDQMLIBFBmNSAAUEIIAhBEGooAgAgCEEUaigCABCSISADQQhqIAhBJGooAgBBABCjIyADKAIMIQggEUH8tJsBQQQQiQUgCBALIBggBiAREAwgCUEoaiEJIAZBAWohBgwACwsgEkGhnZsBQQgQiQUgGBALDAoLIAMoAhQhBSARENwqIBgQ3CoLIBIQ3CpBASERDAkLIAMgHDcCyAIgAyAONgLEAiADIAo2AsACIAMgDTYCvAIgAyAMNgK4AkEAIQggA0EANgKABBAJIhFBrdSYAUEEIA0gChCSISADQdAAaiADQYAEaiARQZm1mwFBAyADQcQCahDLEgJAAkAgAygCUEEBcSIJDQAgESEFDAELIAMoAlQhBSARQYQBSQ0AIBEQDQsgA0G4AmoQ0ysgCQ0JDAoLQfeBgAFBIxAHIQUgARDcKiARENwqCyAIQQFzIQ8gA0GMAWoQiykMBwsACyADQQA2AsgCIANBATYCvAIgA0Hg3ZgBNgK4AiADQgQ3AsACIANBuAJqQfjWmAEQ6SMACyADIA02ArwFQdCAgAFBNSADQbwFakGogIABQYiBgAEQ6hIACyADQQA2AoAHIANBATYC9AYgA0HU4ZgBNgLwBiADQgQ3AvgGIANB8AZqQdzhmAEQ6SMAC0EAQQBBnIKAARCRFQALQQAhESASIQULIAogDhC+DCANIAoQ3SxBASEIIBFFDQELQQEhCCAEQQFGDQEMBAsgBEEBRg0BDAILIAIQ3CoMAgsgAhDcKgsgE0GAgICAeEYNAgwBCyAPRQ0BCyABENwqCyAAIAU2AgQgACAINgIAIANBoAlqJAAL9D4BJH8jAEGQAWsiBiQAIAIgBTYCaCACQQA2AlQgAiAFNgI4IAJBADYCJCACQQA2AggCQAJAAkACQAJAIAMoAhAiByADKAIUIghLDQACQCADKAIMIglBf0YNACADKAIIIQogAS0AFCELIAZByABqIAEoAgAiDCADKAIAIAMoAgQQvRYgBi0ASCINQQJGDQQgC0ECRiALciIOQQFzIQtBACEPAkAgDUEBcQ0AQQBBjKiEASABQQRqIAEtABBBA0YbIgEgAS0ADEECRhshDwsgBigCTCEQIAVBAnQhESACQdgAaiESIAJBKGohEyANQQFzIRQgAy0AGCIVQQFzIRYgC0EBcyEXIAchGEEAIRkCQAJAAkADQAJAIAIoAiQNACAYIAdLIA1xDQIgGUEARyAOcQ0CIA9FDQAgBkH0AGogDygCACAPKAIEIgMoAghBf2pBeHFqQQhqIAogCSAYIAggAygCEBESACAGKAJ0QQFHDQIgBigCeCEYCwJAIBlBAEcgF3ENACAYIAdGIBRyQQFxRQ0AIAIoAmAiAyACKAJoIhprIQsCQAJAIAMgGkkNACACKAJcIRsCQCACKAIIIgMgAigCAEcNACACQYiqhAEQnBwLIAIoAgQgA0EMbGoiASAQNgIEIAFBADYCACACIANBAWoiAzYCCCADRQ0CIBsgC0ECdGohHCAaQQJ0IR0gGEEBaiEeIAogGGoiH0F/aiEgIAogGEF/aiIhaiEiA0AgAiADQX9qIgM2AgggAigCBCADQQxsaiIBKAIAIgtBAkYNAyABKAIEIQMCQAJAAkACQCALQQFxDQAgBiADNgJUIAMgAigCICIBSQ0BDAYLIAMgGk8NAiAcIANBAnRqIAEoAgg2AgAMAQsDQCACKAIUIQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAhwgA0ECdCIjaigCACIbIAIoAiQiAU8NACAbIAtPDQEgAigCECAbQQJ0aigCACADRg0MCyAGIAE2AlggASALTw0BIAIoAhAgAUECdGogAzYCACADIAIoAiAiC08NByACKAIcICNqIAE2AgAgAiACKAIkQQFqNgIkIAMgDCgC0AIiAU8NAgJAAkACQAJAAkACQCAMKALMAiADQRRsaiIBKAIADgkAAAABBAIDAAAACyAGQcAAaiATIAMQnRYgBigCRCIDIBpHDQggHUUNECAGKAJAIBwgHfwKAAAMEAsgASgCBCEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIIaA4SFAABAgMEBQYHCAkKCwwNDg8QFAsgGCAJRg0dDB8LIBhFDRwCQCAhIAlPDQAgIi0AACAMLQDgAkYNHQwfCyAhIAlB+KyEARCRFQALIBggCUYNGwJAIBggCU8NACAfLQAAIAwtAOACRg0cDB4LIBggCUGIrYQBEJEVAAsgGEUNGgJAAkAgISAJTw0AICItAABBdmoOBBweHgEeCyAhIAlBmK2EARCRFQALIBggCU8NGiAfLQAAQQpHDRoMHAsgGCAJRg0ZAkACQCAYIAlPDQAgHy0AAEF2ag4EAR0dGx0LIBggCUGorYQBEJEVAAsgGEUNGSAgLQAAQQ1HDRkMGwsCQAJAAkAgGEUNACAhIAlPDQEgIi0AAEHYtIQBai0AACEBIBggCUkNAiABQQFxDRsMHQsgGCAJTw0cIB8tAABB2LSEAWotAAANGgwcCyAhIAlBuK2EARCRFQALIAFB/wFxIB8tAABB2LSEAWotAABHDRgMGgsCQAJAAkAgGEUNACAhIAlPDQEgIi0AAEHYtIQBai0AACEBIBggCUkNAiABQQFxRQ0aDBwLIBggCU8NGSAfLQAAQdi0hAFqLQAARQ0ZDBsLICEgCUG4rYQBEJEVAAsgAUH/AXEgHy0AAEHYtIQBai0AAEYNFwwZCyAKIAkgGBDQBEH/AXENFgwYCyAKIAkgGBCiA0H/AXENFQwXCwJAIBgNACAJRQ0XIAotAABB2LSEAWotAAANFQwXCyAhIAlPDQ8gGCAJTw0WICItAABB2LSEAWotAAANFiAfLQAAQdi0hAFqLQAAQQFxDRQMFgsgGEUNFSAhIAlPDQ8gIi0AAEHYtIQBai0AACELQQEhASAYIAlPDRIgHy0AAEHYtIQBai0AAEEBcyEBDBILIAogCSAYEMsEQf8BcQ0SDBQLIAogCSAYEMYEQf8BcQ0RDBMLIBhFDRACQCAhIAlPDQAgIi0AAEHYtIQBai0AAEUNEQwTCyAhIAlB+K2EARCRFQALIBggCU8NDyAfLQAAQdi0hAFqLQAARQ0PDBELIAogCSAYEPQEQf8BcQ0ODBALIAogCSAYEPsGQf8BcQ0NDA8LIAEoAgghCyABKAIEIQMCQCACKAIIIgEgAigCAEcNACACQaiqhAEQnBwLIAIoAgQgAUEMbGoiGyALNgIEIBtBADYCACACIAFBAWo2AggMDAsgASgCBCEDIAEoAhAiASAaTw0LIBwgAUECdGoiJCgCACEjAkAgAigCCCILIAIoAgBHDQAgAkG4qoQBEJwcCyACKAIEIAtBDGxqIhsgIzYCCCAbIAE2AgQgG0EBNgIAIAIgC0EBajYCCCAeRQ0IICQgHjYCAAwLCyABKAIIIgtFDQwgASgCBCIBKAIAIQMgAiABQQRqIAEgC0ECdGoQ8xEMCgsgGEUNCQwLCyAbIAtBuLSEARCRFQALIAZBAzYCYCAGQfCzhAE2AlwgBkIDNwJoIAZBigE2AogBIAZB+AA2AoABIAZB+AA2AnggBiALNgKMASAGIAZB9ABqNgJkIAYgBkHUAGo2AoQBIAYgBkGMAWo2AnwgBiAGQdgAajYCdCAGQdwAakGItIQBEOkjAAsgAyABQeynhAEQkRUACyADIBpB2KqEARDwLAALICEgCUHYrYQBEJEVAAsgISAJQeithAEQkRUAC0HIqoQBENIsAAsgAyALQZi0hAEQkRUACyALQQFxRQ0CIAFBAXFFDQILIAYgAzYCVCADIAIoAiAiAU8NBQwACwsgAigCCCIDRQ0EDAELCyADIBpBmKqEARCRFQALIAsgA0Gsq4QBEOIsAAsgAyABQai0hAEQkRUACyACKAIkIgMgAigCFCIBSw0DAkACQAJAAkAgA0UNACACKAIQIhogA0ECdGohHCAYQQJqISQgCiAYaiEiIAogGEEBaiIeaiEgQQAhJQNAAkACQAJAAkACQCAaKAIAIgEgDCgC0AIiA08NACAaQQRqIRoCQCAMKALMAiABQRRsaiIDKAIADgkABAMFBQUFBQIACyAYIAlPDQQgA0EIai0AACAiLQAAIgtLDQQgCyADQQlqLQAAQf8BcUsNBCAGQRBqIBMgARCdFiADKAIEIQEgBigCFCEhIAYoAhAhHwJAIAIoAggiAyACKAIARw0AIAJBiKqEARCcHAsgAigCBCADQQxsaiILIAE2AgQgC0EANgIAIAIgA0EBaiIDNgIIIANFDQQgIUECdCEmA0AgAiADQX9qIgM2AgggAigCBCADQQxsaiIBKAIAIgtBAkYNBSABKAIEIQMCQAJAAkACQCALQQFxDQAgBiADNgJUIAMgAigCUCIBSQ0BDBYLIAMgIU8NAiAfIANBAnRqIAEoAgg2AgAMAQsDQCACKAJEIQsCQAJAAkACQAJAAkACQAJAAkAgAigCTCADQQJ0IiNqKAIAIhsgAigCVCIBTw0AIBsgC08NASACKAJAIBtBAnRqKAIAIANGDQoLIAYgATYCWCABIAtPDQEgAigCQCABQQJ0aiADNgIAIAMgAigCUCILTw0FIAIoAkwgI2ogATYCACACIAIoAlRBAWo2AlQgAyAMKALQAiIBTw0CAkACQAJAAkACQAJAIAwoAswCIANBFGxqIgEoAgAOCQAAAAEEAgMAAAALIAZBCGogEiADEJ0WIAYoAgwiAyAhRw0IICZFDQ4gBigCCCAfICb8CgAADA4LIAEoAgQhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCCGgOEhQAAQIDBAUGBwgJCgsMDQ4PEBQLIB4gCUYNGwwdCyAeRQ0aICItAAAgDC0A4AJGDRoMHAsgHiAJRg0ZAkAgHiAJTw0AICAtAAAgDC0A4AJGDRoMHAsgHiAJQYithAEQkRUACyAeRQ0YAkAgIi0AAEF2ag4EGRsbABsLIB4gCU8NGCAgLQAAQQpHDRgMGgsgHiAJRg0XAkACQCAeIAlPDQAgIC0AAEF2ag4EARsbGRsLIB4gCUGorYQBEJEVAAsgHkUNFyAiLQAAQQ1HDRcMGQsCQAJAIB5FDQAgIi0AAEHYtIQBai0AACEBIB4gCUkNASABQQFxDRgMGgsgHiAJTw0ZICAtAABB2LSEAWotAAANFwwZCyABQf8BcSAgLQAAQdi0hAFqLQAARw0WDBgLAkACQCAeRQ0AICItAABB2LSEAWotAAAhASAeIAlJDQEgAUEBcUUNFwwZCyAeIAlPDRYgIC0AAEHYtIQBai0AAEUNFgwYCyABQf8BcSAgLQAAQdi0hAFqLQAARg0VDBcLIAogCSAeENAEQf8BcQ0UDBYLIAogCSAeEKIDQf8BcQ0TDBULAkAgHg0AIAlFDRUgCi0AAEHYtIQBai0AAA0TDBULIB4gCU8NFCAiLQAAQdi0hAFqLQAADRQgIC0AAEHYtIQBai0AAEEBcQ0SDBQLIB5FDRMgIi0AAEHYtIQBai0AACELQQEhASAeIAlPDRAgIC0AAEHYtIQBai0AAEEBcyEBDBALIAogCSAeEMsEQf8BcQ0QDBILIAogCSAeEMYEQf8BcQ0PDBELIB5FDQ4gIi0AAEHYtIQBai0AAEUNDgwQCyAeIAlPDQ0gIC0AAEHYtIQBai0AAEUNDQwPCyAKIAkgHhD0BEH/AXENDAwOCyAKIAkgHhD7BkH/AXENCwwNCyABKAIIIQsgASgCBCEDAkAgAigCCCIBIAIoAgBHDQAgAkGoqoQBEJwcCyACKAIEIAFBDGxqIhsgCzYCBCAbQQA2AgAgAiABQQFqNgIIDAoLIAEoAgQhAyABKAIQIgEgIU8NCSAfIAFBAnRqIh0oAgAhIwJAIAIoAggiCyACKAIARw0AIAJBuKqEARCcHAsgAigCBCALQQxsaiIbICM2AgggGyABNgIEIBtBATYCACACIAtBAWo2AgggJEUNBiAdICQ2AgAMCQsgASgCCCILRQ0KIAEoAgQiASgCACEDIAIgAUEEaiABIAtBAnRqEPMRDAgLIB5FDQcMCQsgGyALQbi0hAEQkRUACyAGQQM2AmAgBkHws4QBNgJcIAZCAzcCaCAGQYoBNgKIASAGQfgANgKAASAGQfgANgJ4IAYgCzYCjAEgBiAGQfQAajYCZCAGIAZB1ABqNgKEASAGIAZBjAFqNgJ8IAYgBkHYAGo2AnQgBkHcAGpBiLSEARDpIwALIAMgAUHsp4QBEJEVAAsgAyAhQdiqhAEQ8CwAC0HIqoQBENIsAAsgAyALQZi0hAEQkRUACyALQQFxRQ0CIAFBAXFFDQILIAYgAzYCVCADIAIoAlAiAU8NFQwACwsgAigCCCIDDQEMBgsLIAMgIUGYqoQBEJEVAAsgASADQeynhAEQkRUACyADKAIEIScgBkE4aiATIAEQnRYCQCAFIAYoAjwiA0cNAAJAIBFFDQAgBCAGKAI4IBH8CgAAC0EBISUgDiAaIBxGckEBcUUNBAwGCyAFIANB+KmEARDwLAALIBggCU8NAQJAAkAgAygCCCIbICItAAAiC00NACADKAIEIAtBAnRqKAIAIgtFDQMgBkEwaiATIAEQnRYgBigCNCEhIAYoAjAhHwJAIAIoAggiAyACKAIARw0AIAJBiKqEARCcHAsgAigCBCADQQxsaiIBIAs2AgQgAUEANgIAIAIgA0EBaiIDNgIIIANFDQMgIUECdCEmA0AgAiADQX9qIgM2AgggAigCBCADQQxsaiIBKAIAIgtBAkYNBCABKAIEIQMCQAJAAkACQCALQQFxDQAgBiADNgJUIAMgAigCUCIBSQ0BDAYLIAMgIU8NAiAfIANBAnRqIAEoAgg2AgAMAQsDQCACKAJEIQsCQAJAAkACQAJAAkACQAJAAkAgAigCTCADQQJ0IiNqKAIAIhsgAigCVCIBTw0AIBsgC08NASACKAJAIBtBAnRqKAIAIANGDQoLIAYgATYCWCABIAtPDQEgAigCQCABQQJ0aiADNgIAIAMgAigCUCILTw0FIAIoAkwgI2ogATYCACACIAIoAlRBAWo2AlQgAyAMKALQAiIBTw0CAkACQAJAAkACQAJAIAwoAswCIANBFGxqIgEoAgAOCQAAAAEEAgMAAAALIAZBKGogEiADEJ0WIAYoAiwiAyAhRw0IICZFDQ4gBigCKCAfICb8CgAADA4LIAEoAgQhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAghoDhIdEwABAgMEBQYHCAkKCwwNDg8dCyAiLQAAIAwtAOACRg0aDBwLIB4gCUYNGQJAIB4gCU8NACAgLQAAIAwtAOACRg0aDBwLIB4gCUGIrYQBEJEVAAsCQCAiLQAAQXZqDgQZGxsAGwsgHiAJTw0YICAtAABBCkcNGAwaCyAeIAlGDRcCQAJAIB4gCU8NACAgLQAAQXZqDgQBGxsZGwsgHiAJQaithAEQkRUACyAiLQAAQQ1HDRcMGQsgIi0AAEHYtIQBai0AACEBAkAgHiAJSQ0AIAFBAXENFwwZCyABQf8BcSAgLQAAQdi0hAFqLQAARw0WDBgLICItAABB2LSEAWotAAAhAQJAIB4gCUkNACABQQFxRQ0WDBgLICAtAABB2LSEAWotAAAgAUH/AXFGDRUMFwsgCiAJIB4Q0ARB/wFxDRQMFgsgCiAJIB4QogNB/wFxDRMMFQsgHiAJTw0UICItAABB2LSEAWotAAANFCAgLQAAQdi0hAFqLQAAQQFxDRIMFAsgIi0AAEHYtIQBai0AACELQQEhASAeIAlPDRAgIC0AAEHYtIQBai0AAEEBcyEBDBALIAogCSAeEMsEQf8BcQ0QDBILIAogCSAeEMYEQf8BcQ0PDBELICItAABB2LSEAWotAABFDQ4MEAsgHiAJTw0NICAtAABB2LSEAWotAABFDQ0MDwsgCiAJIB4Q9ARB/wFxDQwMDgsgCiAJIB4Q+wZB/wFxDQsMDQsgASgCCCELIAEoAgQhAwJAIAIoAggiASACKAIARw0AIAJBqKqEARCcHAsgAigCBCABQQxsaiIbIAs2AgQgG0EANgIAIAIgAUEBajYCCAwKCyABKAIEIQMgASgCECIBICFPDQkgHyABQQJ0aiIdKAIAISMCQCACKAIIIgsgAigCAEcNACACQbiqhAEQnBwLIAIoAgQgC0EMbGoiGyAjNgIIIBsgATYCBCAbQQE2AgAgAiALQQFqNgIIICRFDQYgHSAkNgIADAkLIAEoAggiC0UNCiABKAIEIgEoAgAhAyACIAFBBGogASALQQJ0ahDzEQwICyAeIAlGDQcMCQsgGyALQbi0hAEQkRUACyAGQQM2AmAgBkHws4QBNgJcIAZCAzcCaCAGQYoBNgKIASAGQfgANgKAASAGQfgANgJ4IAYgCzYCjAEgBiAGQfQAajYCZCAGIAZB1ABqNgKEASAGIAZBjAFqNgJ8IAYgBkHYAGo2AnQgBkHcAGpBiLSEARDpIwALIAMgAUHsp4QBEJEVAAsgAyAhQdiqhAEQ8CwAC0HIqoQBENIsAAsgAyALQZi0hAEQkRUACyALQQFxRQ0CIAFBAXFFDQILIAYgAzYCVCADIAIoAlAiAU8NBQwACwsgAigCCCIDDQEMBQsLIAMgIUGYqoQBEJEVAAsgCyAbQfynhAEQkRUACyADIAFBqLSEARCRFQALIBggCU8NACADKAIIQQN0IQsgAygCBEEFaiEbICItAAAhIQNAIBshAyALRQ0BIANBf2otAAAgIUH/AXEiI0sNASALQXhqIQsgA0EIaiEbICMgAy0AAEsNAAsgA0F7aigCACELIAZBIGogEyABEJ0WIAYoAiQhISAGKAIgIR8CQCACKAIIIgMgAigCAEcNACACQYiqhAEQnBwLIAIoAgQgA0EMbGoiASALNgIEIAFBADYCACACIANBAWoiAzYCCCADRQ0AICFBAnQhJgNAIAIgA0F/aiIDNgIIIAIoAgQgA0EMbGoiASgCACILQQJGDQEgASgCBCEDAkACQAJAIAtBAXENACAGIAM2AlQgAyACKAJQIgFJDQEMEAsgAyAhTw0LIB8gA0ECdGogASgCCDYCAAwBCwNAIAIoAkQhCwJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCTCADQQJ0IiNqKAIAIhsgAigCVCIBTw0AIBsgC08NASACKAJAIBtBAnRqKAIAIANGDQwLIAYgATYCWCABIAtPDQEgAigCQCABQQJ0aiADNgIAIAMgAigCUCILTw0HIAIoAkwgI2ogATYCACACIAIoAlRBAWo2AlQgAyAMKALQAiIBTw0CAkACQAJAAkACQAJAIAwoAswCIANBFGxqIgEoAgAOCQAAAAEEAgMAAAALIAZBGGogEiADEJ0WIAYoAhwiAyAhRw0IICZFDRAgBigCGCAfICb8CgAADBALIAEoAgQhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCCGgOEhQAAQIDBAUGBwgJCgsMDQ4PEBQLIB4gCUYNHQwfCyAeRQ0cICItAAAgDC0A4AJGDRwMHgsgHiAJRg0bAkAgHiAJTw0AICAtAAAgDC0A4AJGDRwMHgsgHiAJQYithAEQkRUACyAeRQ0aAkAgIi0AAEF2ag4EGx0dAB0LIB4gCU8NGiAgLQAAQQpHDRoMHAsgHiAJRg0ZAkACQCAeIAlPDQAgIC0AAEF2ag4EAR0dGx0LIB4gCUGorYQBEJEVAAsgHkUNGSAiLQAAQQ1HDRkMGwsgHkUNEyAiLQAAQdi0hAFqLQAAIQECQCAeIAlJDQAgAUEBcQ0ZDBsLIAFB/wFxICAtAABB2LSEAWotAABHDRgMGgsgHkUNEyAiLQAAQdi0hAFqLQAAIQECQCAeIAlJDQAgAUEBcUUNGAwaCyABQf8BcSAgLQAAQdi0hAFqLQAARg0XDBkLIAogCSAeENAEQf8BcQ0WDBgLIAogCSAeEKIDQf8BcQ0VDBcLAkAgHg0AIAotAABB2LSEAWotAAANFQwXCyAeIAlPDRYgIi0AAEHYtIQBai0AAA0WICAtAABB2LSEAWotAABBAXENFAwWCyAeRQ0VICItAABB2LSEAWotAAAhC0EBIQEgHiAJTw0SICAtAABB2LSEAWotAABBAXMhAQwSCyAKIAkgHhDLBEH/AXENEgwUCyAKIAkgHhDGBEH/AXENEQwTCyAeRQ0QICItAABB2LSEAWotAABFDRAMEgsgHiAJTw0PICAtAABB2LSEAWotAABFDQ8MEQsgCiAJIB4Q9ARB/wFxDQ4MEAsgCiAJIB4Q+wZB/wFxDQ0MDwsgASgCCCELIAEoAgQhAwJAIAIoAggiASACKAIARw0AIAJBqKqEARCcHAsgAigCBCABQQxsaiIbIAs2AgQgG0EANgIAIAIgAUEBajYCCAwMCyABKAIEIQMgASgCECIBICFPDQsgHyABQQJ0aiIdKAIAISMCQCACKAIIIgsgAigCAEcNACACQbiqhAEQnBwLIAIoAgQgC0EMbGoiGyAjNgIIIBsgATYCBCAbQQE2AgAgAiALQQFqNgIIICRFDQggHSAkNgIADAsLIAEoAggiC0UNDCABKAIEIgEoAgAhAyACIAFBBGogASALQQJ0ahDzEQwKCyAeRQ0JDAsLIBsgC0G4tIQBEJEVAAsgBkEDNgJgIAZB8LOEATYCXCAGQgM3AmggBkGKATYCiAEgBkH4ADYCgAEgBkH4ADYCeCAGIAs2AowBIAYgBkH0AGo2AmQgBiAGQdQAajYChAEgBiAGQYwBajYCfCAGIAZB2ABqNgJ0IAZB3ABqQYi0hAEQ6SMACyADIAFB7KeEARCRFQALIAMgIUHYqoQBEPAsAAsgIC0AAEHYtIQBai0AAA0EDAYLICAtAABB2LSEAWotAABFDQMMBQtByKqEARDSLAALIAMgC0GYtIQBEJEVAAsgC0EBcUUNAiABQQFxRQ0CCyAGIAM2AlQgAyACKAJQIgFPDQ8MAAsLIAIoAggiAw0ACwsgGiAcRw0ACyAlQQFxDQELIBlFIBZyQQFxDQFBASEZDAQLQQEhGQJAIBVBAXENACAnISggGCEpDAILIBghKSAnISgMAwtBACAZIBVBAXEbIRkLQQwhAwJAA0AgA0E8Rg0BIAIgA2oiAUEwaiILKAIAIRsgCyABKAIANgIAIAEgGzYCACADQQRqIQMMAAsLIAJBADYCVCAYQQFqIhggCE0NAAsLIAAgKTYCCCAAICg2AgQgACAZNgIADAcLIAMgIUGYqoQBEJEVAAsgAyABQci0hAEQ4SwACyAGQQA2AoQBIAZBATYCeCAGQdCphAE2AnQgBkIENwJ8IAZB9ABqQdiphAEQ6SMACyAAQQA2AgAMAwsgAyABQai0hAEQkRUACyADIAFBqLSEARCRFQALIABBADYCAAsgBkGQAWokAAuAPgMPfwV+AnwjAEGgA2siAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCAEFwag4UAAcBBwIHBwcHBwoDBAcHBwcHBxAHCyADQSRqQQJqIAJBE2otAAA6AAAgAyACLwAROwEkIAIoAgwhBCACKAIIIQUgAigCBCEGAkACQAJAIAItABAiB0EDSw0AIAdBAkcNAQtBAC0AoPGeARpBwAAQfSIBRQ0dIAEgBzoAECABIAQ2AgwgASAFNgIIIAEgBjYCBCABQRA2AgAgASADLwEkOwARIAAgATYCBCAAQQI2AgAgAUETaiADQSRqQQJqLQAAOgAADAELIANB8ABqIAEgBhBYAkAgAygCcEEBRw0AIAMrA3ghFwJAAkACQAJAIAcOBAEDAAIAC0GgppwBQShBjKubARDSHgALIBeaIRcMAQsgFxDtGiEXCyAAQQE2AgAgACAXOQMIIANB8ABqELcYDAELIANB2AJqIANB8ABqEJ8FQQAtAKDxngEaQcAAEH0iAUUNHCABIAMpA9gCNwMAIAFBOGogA0HYAmpBOGopAwA3AwAgAUEwaiADQdgCakEwaikDADcDACABQShqIANB2AJqQShqKQMANwMAIAFBIGogA0HYAmpBIGopAwA3AwAgAUEYaiADQdgCakEYaikDADcDACABQRBqIANB2AJqQRBqKQMANwMAIAFBCGogA0HYAmpBCGopAwA3AwBBAC0AoPGeARpBwAAQfSIGRQ0cIAYgBzoAECAGIAQ2AgwgBiAFNgIIIAYgATYCBCAGQRA2AgAgACAGNgIEIABBAjYCAAsgAigCAEFwaiIAQRNLDSBBASAAdEGVqCBxDSIgAEELRg0fDCALIAIoAhAhCCACKAIMIQkgAi0AFCEEIAIoAgghBSACKAIEIQoQ+ichByADQdgCaiAKEEIgB0E4aiADQdgCakE4aiILKQMANwMAIAdBMGogA0HYAmpBMGoiDCkDADcDACAHQShqIANB2AJqQShqIg0pAwA3AwAgB0EgaiADQdgCakEgaiIOKQMANwMAIAdBGGogA0HYAmpBGGoiDykDADcDACAHQRBqIANB2AJqQRBqIhApAwA3AwAgB0EIaiADQdgCakEIaiIRKQMANwMAIAcgAykD2AI3AwAQ+ichBiADQdgCaiAFEEIgBkE4aiALKQMANwMAIAZBMGogDCkDADcDACAGQShqIA0pAwA3AwAgBkEgaiAOKQMANwMAIAZBGGogDykDADcDACAGQRBqIBApAwA3AwAgBkEIaiARKQMANwMAIAYgAykD2AI3AwACQCAEQXhqQQtJDQAgBEEXRg0AQQAtAKDxngEaQcAAEH0iAUUNGyABIAQ6ABQgASAINgIQIAEgCTYCDCABIAY2AgggASAHNgIEIAFBEjYCACAAIAE2AgQgAEECNgIAIAogBRCGJwweCyADQYABaiABIAoQWCADQYABakEQaiILIAEgBRBYIAMgBDoAoAEgAygCkAEhCkEBIQwCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCgAEiBQ4CAAExCyAKDgIBAi8LIAoOAgIDLgsgBEELRg0SQQAhCgwtCwJAIARBC0YNAEEBIQoMLQsgAyADKQOIATcD0AEgA0GQAmogAysDmAEQyw4gA0ECNgLcAiADQZyrmwE2AtgCIANCAjcC5AIgA0GgB61CIIYgA0GQAmqthDcDgAIgA0HMBK1CIIYgA0HQAWqthDcD+AEgAyADQfgBajYC4AIgA0HIAmogA0HYAmoQoA5BACEBIANByAJqEPgmIRIgAEEANgIAIAAgEjcDCCADKAKQAiADKAKUAhDYLCADKQPQARDFIQwTCyAEQQtGDQFBACEKDCsLIAMrA5gBIRcgAysDiAEhGCAEQXhqDhACAwQFBgcICQoLDAEBAQENAQsgAysDiAEhFyADIAMpA5gBNwPQASADQZACaiAXEMsOIANBAjYC3AIgA0Gcq5sBNgLYAiADQgI3AuQCIANBzAStQiCGIANB0AFqrYQ3A4ACIANBoAetQiCGIANBkAJqrYQ3A/gBIAMgA0H4AWo2AuACIANByAJqIANB2AJqEKAOIANByAJqEPgmIRIgAEEANgIAIAAgEjcDCCADKAKQAiADKAKUAhDYLCADKQPQARDFIQwPC0GgppwBQShBrKubARDSHgALIBggFxDWECEXDAsLIBggFxDXECEXDAoLIBggFxDYECEXDAkLIBggF6AhFwwICyAYIBehIRcMBwsgGCAXoiEXDAYLIBggF6MhFwwFCyAYIBcQ7QYhFwwECyAYIBcQpREhFwwDCyAYIBcQphEhFwwCCyAYIBcQpxEhFwwBCyAYIBcQlSIhFwsgAEEBNgIAIAAgFzkDCEEAIQEMAgsgAyADKQOIATcD0AEgAyADKQOYATcDkAIgA0ECNgLcAiADQZyrmwE2AtgCIANCAjcC5AIgA0HMBK1CIIYiEiADQZACaq2ENwOAAiADIBIgA0HQAWqthDcD+AEgAyADQfgBajYC4AIgA0HIAmogA0HYAmoQoA4gA0HIAmoQ+CYhEiAAQQA2AgAgACASNwMIIAMpA5ACEMUhIAMpA9ABEMUhC0EBIQELIAcQvwEgB0HAAEEIELMWIAYQvwEgBkHAAEEIELMWIAUNBAwXCyADQShqQSBqIAJBKGopAwA3AwAgA0EoakEYaiACQSBqKQMANwMAIANBKGpBEGogAkEYaikDADcDACADQShqQQhqIAJBEGopAwA3AwAgAyACKQMIIhI3AygCQCASpyIEQQFHDQAgA0HYAmpBJGogAkEIaiIBQSBqKQIANwIAIANB2AJqQRxqIAFBGGopAgA3AgAgA0HYAmpBFGogAUEQaikCADcCACADQdgCakEMaiABQQhqKQIANwIAQQAtAKDxngEaIAMgASkCADcC3AJBwAAQfSIBRQ0aIAFBFDYCACABIAMpAtgCNwIEIAFBDGogA0HgAmopAgA3AgAgAUEUaiADQegCaikCADcCACABQRxqIANB8AJqKQIANwIAIAFBJGogA0H4AmopAgA3AgAgAUEsaiADQYADaigCADYCACAAQQI2AgAgACABNgIEDBYLIAEoAgQhECADKAJEIQsgAygCQCEMIAMoAkghBRD6JyEHIANB2AJqIAUQQiAHQThqIANB2AJqQThqIgopAwA3AwAgB0EwaiADQdgCakEwaiIOKQMANwMAIAdBKGogA0HYAmpBKGopAwA3AwAgB0EgaiADQdgCakEgaikDADcDACAHQRhqIANB2AJqQRhqKQMANwMAIAdBEGogA0HYAmpBEGopAwA3AwAgB0EIaiADQdgCakEIaikDADcDACAHIAMpA9gCNwMAAkACQCAEDQAgAygCNCEGIAMoAjAhDSADKAI8IQEgAygCOCEOAkAgAykDMCISQgODQgBSDQAgEqciCiAKKAIAIgpBAWo2AgAgCkF/TA0cCyADIAY2AtgCIANBgAFqIQoMAQsgAygCNCEBIAMoAjAhDSADKAIsIQ8Q+ichBiADQdgCaiAPEEIgBkE4aiAKKQMANwMAIAZBMGogDikDADcDACAGQShqIANB2AJqQShqKQMANwMAIAZBIGogA0HYAmpBIGopAwA3AwAgBkEYaiADQdgCakEYaikDADcDACAGQRBqIANB2AJqQRBqKQMANwMAIAZBCGogA0HYAmpBCGopAwA3AwAgBiADKQPYAjcDACADQdgCaiEKCyAKIAE2AgBBAC0AoPGeARogAygCgAEhCiADKALYAiEPQcAAEH0iAUUNGSABIAc2AiggASALNgIkIAEgDDYCICABIAo2AhwgASAONgIYIAEgDzYCFCABIA02AhAgASAGNgIMIAEgBDYCCCABQRQ2AgACQAJAAkAgBA4DAAIBAAtBASEHQQAhBiADKQMwIRIMFQsCQAJAIAMoAiwiBygCAEEbRw0AIAcoAghFDQELIAAgATYCBCAAQQI2AgAgBxC/ASAHQcAAQQgQsxZBACEHQQEhBgwWCyAHKQMQIRIgBykDICITUA0TIBNCA4NCAFINEyATpyIGIAYoAgAiCkF/ajYCAAJAIApBAUcNACAGIAYoAhAQxiQLIAcoAgBBG0cNAyAHQQhqIgYoAgBFDRMgBhCFCQwTCyAAIAE2AgQgAEECNgIAQQEhBkEBIQcMFAsgAigCCA4EBQMDBAMLIANB6ABqIAJBHGopAgAiEjcDACADQdAAakEQaiIHIAJBFGopAgA3AwAgA0HQAGpBCGogAkEMaikCADcDACADIAIpAgQ3A1AgAygCbCEFIANBuAFqIANB0ABqEJUJIANBuAFqQQxqIAcoAgAiBiADKAJkIgQQ+AhBAC0AoPGeARpBwAAQfSIHRQ0XIAdBHDYCACAHIAMpArgBNwIEIAcgBTYCICAHIBKnNgIcIAdBDGogA0G4AWpBCGopAgA3AgAgB0EUaiADQbgBakEQaikCADcCACADIAc2AqwBIANBAjYCqAEgAygCUCEFIAMoAlQhByADKAJYIQogAyADKAJcNgLYASADIAY2AtABIAMgBiAEQQV0ajYC3AEgAyAGNgLUASAERQ0MIAMgBkEgajYC1AEgBi0AGCIEQQJGDQwgA0HYAmpBEGogBkEQaikDADcDACADQdgCakEIaiAGQQhqKQMANwMAIAYpAwAhEiADQdgCakEcaiAGQRxqKAAANgAAIAMgEjcD2AIgAyAGKAAZNgDxAiADIAQ6APACIANBADYCgAIgA0KAgICAEDcC+AEgA0HgqZsBNgKEASADQqCAgIAONwKIASADIANB+AFqNgKAAQJAIANB2AJqIANBgAFqEOsiDQAgAygC+AEhBiADKQL8ASESIANB2AJqEM4TIAZBgICAgHhGDQ0gAyASNwLoASADIAY2AuQBIANB2AJqQQhqIANB0AFqQQhqKQIANwMAIAMgAykC0AE3A9gCIANBADYCgAMgA0IANwP4AiADIAcgCkECdGo2AvQCIAMgBTYC8AIgAyAHNgLsAiADIAc2AugCIANB2AJqQRBqIQ8gAygC3AIiByADKALkAkYNDyADQYABakEZaiIFQQNqIQoDQCADIAdBIGo2AtwCIActABgiBkECRg0QIAUgBygAGTYAACADQYABakEQaiILIAdBEGoiDCkDADcDACADQYABakEIaiINIAdBCGoiDikDADcDACAKIAdBHGooAAA2AAAgAyAGOgCYASADIAcpAwA3A4ABAkAgAygC7AIiBCADKAL0AkcNACADQYABahDOEwwRCyADQfgBakEIaiAOKQMAIhI3AwAgA0H4AWpBEGogDCkDACITNwMAIAMgBEEEajYC7AIgAyAHKQMAIhQ3A/gBIAMgB0EZaiIHKAAANgLwASADIAdBA2ooAAA2APMBIAQoAgAhByALIBM3AwAgDSASNwMAIAUgAygC8AE2AAAgCiADKADzATYAACADIBQ3A4ABIAMgBjoAmAEgA0GQAmogASAHEFgCQAJAAkACQAJAIAMoApACDgIBABQLIANBoAJqIAMrA5gCEMsODAELIAMgAykDmAI3A7ACIANBADYCxAIgA0KAgICAEDcCvAIgA0HgqZsBNgLMAiADQqCAgIAONwLQAiADIANBvAJqNgLIAiADQbACaiADQcgCahDrIg0BIANBoAJqQQhqIANBvAJqQQhqKAIANgIAIAMgAykCvAI3A6ACIAMpA7ACIhJCA4NCAFINACASpyIHIAcoAgAiBkF/ajYCACAGQQFHDQAgByAHKAIQEMYkCyADQeQBaiADKAKkAiIHIAcgAygCqAJqENcgIANBGGogA0GAAWoQ8RUgA0HkAWogAygCGCIHIAcgAygCHGoQ1yAgAygCoAIgAygCpAIQ2CwgAygCkAJFDQEgA0GQAmoQtxgMAQtBjKycAUE3IANBnwNqQfipmwFBkK2cARDqEgALIANBgAFqEM4TIAMo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AgBBcGoiAEETSw0IQQEgAHRBlaggcQ0KIABBC0YNBwwICyABDQUMBAsgA0HYAmogA0GAAWoQnwVBAC0AoPGeARpBwAAQfSIBRQ0BIAEgAykD2AI3AwAgAUE4aiADQdgCakE4aikDADcDACABQTBqIANB2AJqQTBqKQMANwMAIAFBKGogA0HYAmpBKGopAwA3AwAgAUEgaiADQdgCakEgaikDADcDACABQRhqIANB2AJqQRhqKQMANwMAIAFBEGogA0HYAmpBEGopAwA3AwAgAUEIaiADQdgCakEIaikDADcDACAHEL8BIAdBwABBCBCzFiAFQQFLIQwgASEHCwJAAkAgCkEBTQ0AIAYhBQwBCyADQdgCaiALEJ8FQQAtAKDxngEaQcAAEH0iBUUNASAFIAMpA9gCNwMAIAVBOGogA0HYAmpBOGopAwA3AwAgBUEwaiADQdgCakEwaikDADcDACAFQShqIANB2AJqQShqKQMANwMAIAVBIGogA0HYAmpBIGopAwA3AwAgBUEYaiADQdgCakEYaikDADcDACAFQRBqIANB2AJqQRBqKQMANwMAIAVBCGogA0HYAmpBCGopAwA3AwAgBhC/ASAGQcAAQQgQsxYLQQAtAKDxngEaQcAAEH0iAUUNACABIAQ6ABQgASAINgIQIAEgCTYCDCABIAU2AgggASAHNgIEIAFBEjYCACAAIAE2AgQgAEECNgIAIApBAU0NASALELcYDAELAAsgA0GAAWohCyAMRQ0BCyALELcYCyACKAIAQXBqIgBBE0sNAUEBIAB0QZWoIHENAyAAQQtHDQELIAIoAggOBAIBAQIBCyACEL8BDAELIAJBCGoQhQkLIAJBwABBCBCzFgsgA0GgA2okAAvlPQISfwR+IwBBgANrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAg4MBwAIAQILAwQFBg8QBwsgBEGwAWogASgCACIBIANBBGooAgAgA0EIaigCABCtCCAEELkaNgLIASAEQQA2ArABIAEgBEGwAWoQ2h4MIwsgBEHYAGpBEGogA0EQaikCADcDACAEQdgAakEIaiADQQhqKQIANwMAIAQgAykCADcDWCABKAIAIgMsABYh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IARBsAFqENoeDBYLIARBsAFqIAIQsg8gBCgCsAFBEEYNCSAEQeACakEYaiAEQbABakEYaigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiAEQbABakEIaikCADcDACAEIAQpArABNwPgAiAEQbACaiAEQeACahCmFCAEQbABaiACIAMtAHAgBEGwAmoQpiQCQCAEKAKwASIBQYCAgIB4Rg0AAkBBJEUNACAAQQRqIARBsAFqQQRqQST8CgAACyAAIAE2AgAgBCgCsAIgBCgCtAIQ9ywMFwsgBEHsAmogBEGwAmpBCGopAgA3AgAgBCAEKQKwAjcC5AIgBEEANgLgAiAEQbABaiAEQeACahDpCyACIARBsAFqENoeDBULIARBADYCrAIgBEKAgICAwAA3AqQCIAEoAgAhBSAEQeACakEEaiEDIARBsAFqQQRqIQIDQCAEQbABaiAFELIPAkAgBCgCsAEiAUEQRw0AIARBCDYCsAIMDwsgAyACKQIANwIAIANBEGogAkEQaikCADcCACADQQhqIgYgAkEIaikCADcCACAEIAE2AuACAkACQAJAAkACQAJAAkACQAJAAkBBACABQXlqIgcgByABSxsOCQgAAQIDBAUGBwgLIARB2ABqQQhqIAYoAgA2AgAgBCADKQIANwNYIARBsAJqIARB2ABqEN8VDAgLIARBATYCtAEgBEG46oQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQcDqhAEQ6SMACyAEQQE2ArQBIARBoOuEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakGo64QBEOkjAAsgBEEBNgK0ASAEQYjshAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBkOyEARDpIwALIARBATYCtAEgBEHs7IQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQfTshAEQ6SMACyAEQQE2ArQBIARB2O2EATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakHg7YQBEOkjAAsgBEEINgKwAgwCCyAEQQE2ArQBIARByO6EATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakHQ7oQBEOkjAAsgBEGwAmpBGGogBEHgAmpBGGooAgA2AgAgBEGwAmpBEGogBEHgAmpBEGopAgA3AwAgBEGwAmpBCGogBEHgAmpBCGopAgA3AwAgBCAEKQLgAjcDsAILAkAgAUEJSQ0AIARB4AJqEL8aCyAEKAKwAkEIRg0OIARBsAFqIAUQsg8gBCgCsAFBEEYNCyAEQeACakEYaiAEQbABakEYaigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiAEQbABakEIaikCADcDACAEIAQpArABIhY3A+ACIBanQQ9HDQwgBEHgAmoQvxogBEGkAmogBEGwAmpBkOGEARDPFAwACwsgBEEANgKgAiAEQoCAgIDAADcCmAIgASgCACEGIARB4AJqQQRqIQMgBEGwAWpBBGohAgNAIARBsAFqIAYQsg8CQCAEKAKwASIBQRBHDQAgBEEINgKwAgwNCyADIAIpAgA3AgAgA0EQaiACQRBqKQIANwIAIANBCGoiByACQQhqKQIANwIAIAQgATYC4AICQAJAAkACQAJAAkACQAJAAkACQEEAIAFBeWoiBSAFIAFLGw4JCAABAgMEBQYHCAsgBEHYAGpBCGogBygCADYCACAEIAMpAgA3A1ggBEGwAmogBEHYAGoQ3xUMCAsgBEEBNgK0ASAEQbTlhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBvOWEARDpIwALIARBATYCtAEgBEGg5oQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQajmhAEQ6SMACyAEQQE2ArQBIARBjOeEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakGU54QBEOkjAAsgBEEBNgK0ASAEQfDnhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB+OeEARDpIwALIARBCDYCsAIMAwsgBEEBNgK0ASAEQdzohAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB5OiEARDpIwALIARBATYCtAEgBEHM6YQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQdTphAEQ6SMACyAEQbACakEYaiAEQeACakEYaigCADYCACAEQbACakEQaiAEQeACakEQaikCADcDACAEQbACakEIaiAEQeACakEIaikCADcDACAEIAQpAuACNwOwAgsCQCAB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CUGcuIABEL4lLQABRw0SIBQoAgAgEygCACAJQQJqQbS9gwEQviUhAgwFCyAJIAtB5LyDARDhLAALIBQoAgAgEygCACAKQQJ0IBVqQaS9gwEQviUhAgwDCyAUKAIAIBMoAgAgFSAKQQJ0akEBakGUvYMBEL4lIQIMAgsgFCgCACATKAIAIBUgCkECdGpBAmpBhL2DARC+JSECDAELIBAgD0Gsn4ABEJEVAAsgAigCACEJCwJAIAkgASgCtAJLDQAgCUUNDCAJIAEoArgCSw0AIAEoAighCiADQQhqIBQoAgAgEygCACAJQfS9gwEQsSICQAJAIAMoAgwiC0UNAAJAAkAgAygCCCIMLQAAIgJB/wFGDQAgAiACQQJ2aiACQQNxQQBHakECaiECDAELIApBAmohAgsgAiALTw0BAkACQCAMIAJBAnRqKAIAIgpBf0wNAAJAIAJBAWoiAiALTw0AIAwgAkECdGooAgAhAgwCCyACIAtBrLWDARCRFQALIApB/////wdxIQILIANBkAFqIAIgB0EBaiILIAFBEGooAgAgCCgCACACQeS9gwEQviUoAgBrIAsQ3RcgAygCkAEgBEsNAiADQYABakEIaiADQZABakEIaigCADYCACADIAMpApABNwOAAUEBIQ0gBkEBcUUNAiADQZABaiEODA4LQQBBAEHMtYMBEJEVAAsgAiALQZy1gwEQkRUACyAHQQFqIQcMAAsLQQBBAEHMtYMBEJEVAAsgByALQZy1gwEQkRUAC0EAQQBBzLWDARCRFQALIABBADYCAAwHCwJAIAZBAXENAEEAIRUCQAJAAkAgASgCvAIiCUUNAEEAIRUgCSABKAK4AksNACABKAIoIQogA0HIAGogAUEEaigCACABQQhqKAIAIAlB9L2DARCxIiADKAJMIgtFDQICQAJAIAMoAkgiDC0AACIHQf8BRg0AIAcgB0ECdmogB0EDcUEAR2pBAmohBwwBCyAKQQJqIQcLIAcgC08NAQJAAkAgDCAHQQJ0aigCACIKQX9MDQACQCAHQQFqIgcgC08NACAMIAdBAnRqKAIAIQcMAgsgByALQay1gwEQkRUACyAKQf////8HcSEHCyADQZABaiAHIAQgAUEQaigCACABQRRqKAIAIAdB5L2DARC+JSgCAGsgBBDdF0EBIRULIAIoAgwiDyAEIA8gBEsb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JSECDAILIBQoAgAgEygCACAOIBFqIApBAnRqQQJqQYS9gwEQviUhAgwBCyASIAhBrJ+AARCRFQALIAIoAgAhCQsCQAJAIAkgASgCtAJLDQAgCUUNByAJIAEoArgCSw0AIAEoAighCyADQSBqIAFBBGooAgAgAUEIaigCACAJQfS9gwEQsSIgAygCJCIJRQ0BAkACQCADKAIgIgctAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgC0ECaiECCyACIAlPDQMCQAJAIAcgAkECdGooAgAiC0F/TA0AAkAgAkEBaiICIAlPDQAgByACQQJ0aigCACECDAILIAIgCUGstYMBEJEVAAsgC0H/////B3EhAgsgA0GQAWogAiAEQQFqIgkgAUEQaigCACABQRRqKAIAIAJB5L2DARC+JSgCAGsgCRDdFwwGCyAEQQFqIQQMAQsLQQBBAEHMtYMBEJEVAAsgAiAJQZy1gwEQkRUACyACIAlBnLWDARCRFQALQQBBAEHMtYMBEJEVAAsgACADKQKQATcCBCAAQQxqIANBmAFqKAIANgIAQQEhFQsgACAVNgIADAYLAkACQAJAAkACQCABKAK8AiIJRQ0AIAkgASgCuAJLDQAgASgCKCELIANB4ABqIAFBBGooAgAgAUEIaigCACAJQfS9gwEQsSIgAygCZCIJRQ0CAkACQCADKAJgIgctAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgC0ECaiECCyACIAlPDQECQAJAIAcgAkECdGooAgAiC0F/TA0AAkAgAkEBaiICIAlPDQAgByACQQJ0aigCACECDAILIAIgCUGstYMBEJEVAAsgC0H/////B3EhAgsgA0GAAWogAiAEIAFBEGooAgAgAUEUaigCACACQeS9gwEQviUoAgBrIAQQ3RcgAEEBNgIAIABBDGogA0GIAWooAgA2AgAgACADKQKAATcCBAwKCyADQZABaiAHIAFBIGoiFSgCACILKAIIQX9qQXhxakEIaiACKAIIIgYgAigCDCISIAQgBSALKAIQERIAAkAgAygCkAEiAg4DBAMABAsgAUEsaiENIAMoApQBIQIgAUEIaiETIAFBBGohFAJAAkACQAJAAkADQAJAIAIiBCAFSQ0AIABBADYCAAwQCwJAAkACQCAEIBJP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CwsgFCgCACATKAIAIApBAnQgDiAGampBpL2DARC+JSECDAQLIAAgAykCgAE3AgQgACAINgIAIABBDGogA0GIAWooAgA2AgAMDQsgDiAJQeS8gwEQ4SwACyAUKAIAIBMoAgAgDiAGaiAKQQJ0akEBakGUvYMBEL4lIQIMAQsgFCgCACATKAIAIA4gBmogCkECdGpBAmpBhL2DARC+JSECCyACKAIAIQkLIAkgASgCtAJLDQEgCUUNAwJAAkACQCAJIAEoArgCSw0AIAEoAighDCADQegAaiAUKAIAIBMoAgAgCUH0vYMBELEiIAMoAmwiB0UNBwJAAkAgAygCaCILLQAAIgJB/wFGDQAgAiACQQJ2aiACQQNxQQBHakECaiECDAELIAxBAmohAgsgAiAHTw0IIAsgAkECdGooAgAiDEF/TA0BAkAgAkEBaiICIAdPDQAgCyACQQJ0aigCACEHDAMLIAIgB0GstYMBEJEVAAsgA0GQAWogASgCHCANKAIAIgIoAghBf2pBeHFqQQhqIBIgESAEIAUgAigCEBESAAJAIAMoApABRQ0AIAMoApQBIgIgBE0NBAwFCyAAQQA2AgAMCgsgDEH/////B3EhBwsgA0GAAWogByAEQQFqIgIgAUEQaigCACAPKAIAIAdB5L2DARC+JSgCAGsgAhDdF0EBIQgMAgsgBCARQayfgAEQkRUACyAEQQFqIQIMAAsLIAAgAykCgAE3AgQgACAINgIAIABBDGogA0GIAWooAgA2AgAMBAtBAEEAQcy1gwEQkRUACyACIAdBnLWDARCRFQALIAcgC0GctYMBEJEVAAsgACANNgIAIAAgDikCADcCBCAAQQxqIA5BCGooAgA2AgALIANBoAFqJAALhDYCFX8EfiMAQZADayIEJAACQAJAAkACQAJAAkACQAJAAkACQCACKAIADggCAgAAAAABAwALIABBFDYCACAAIAIpAwA3AwggAEEoaiACQSBqKQMANwMAIABBIGogAkEYaikDADcDACAAQRhqIAJBEGopAwA3AwAgAEEQaiACQQhqKQMANwMADAcLIAQgAigCBCIFKQMAIAVBEGoiBigCABC5HyABQSBqIAQpAwAgBCgCCBCJBiEHIARB2ABqQRBqIgggBikDADcDACAEQdgAakEIaiAFQQhqKQMAIhk3AwAgBCAFKQMAIho3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ACAEQbACakEIaiARQQhqKQIANwMAIAQgESkCADcDsAILAkAgDSAEKAL0AUcNACAEQfQBakECQQEgBCgCAEETSRsQrCUgBCgC+AEhEAsgECAPaiIGQXxqIAg2AgAgBiAEKQOwAjcCACAGQQhqIARBsAJqQQhqKQMANwIAIAZBEGogBEGwAmpBEGopAwA3AgAgBkEYaiAEQbACakEYaikDADcCACAGQSBqIARBsAJqQSBqKQMANwIAIAZBKGogBEGwAmpBKGooAgA2AgAgBCANQQFqIg02AvwBIA9BMGohDwwACwsgBiAEKAIIQeDpmwEQjikAC0EAIRBBACERDAELIARBqAFqIARBkAFqEOMCAkACQCAEKAKoAUETRg0AIARBBEEIQTAQlQ8gBCgCBCEGIAQoAgBBAUYNAyAEKAIIIgggBCkDqAE3AwAgCEEoaiAEQagBakEoaikDADcDACAIQSBqIARBqAFqQSBqKQMANwMAIAhBGGogBEGoAWpBGGopAwA3AwAgCEEQaiAEQagBakEQaikDADcDACAIQQhqIARBqAFqQQhqKQMANwMAIARBATYCuAIgBCAINgK0AiAEIAY2ArACIARB4AJqQRBqIARBkAFqQRBqKQIANwMAIARB4AJqQQhqIARBkAFqQQhqKQIANwMAIAQgBCkCkAE3A+ACQTAhDEEBIQ0CQANAIAQgBEHgAmoQ4wIgBCgCAEETRg0BAkAgDSAEKAKwAkcNACAEQbACakEBEKwlIAQoArQCIQgLIAggDGoiBiAEKQMANwMAIAZBKGogBEEoaikDADcDACAGQSBqIARBIGopAwA3AwAgBkEYaiAEQRhqKQMANwMAIAZBEGogBEEQaikDADcDACAGQQhqIARBCGopAwA3AwAgBCANQQFqIg02ArgCIAxBMGohDAwACwsgBEHgAmoQvhsgBCgCsAIhDAwBCyAEQZABahC+G0EIIQhBACEMQQAhDQtBASEQC0EAQQgQni1BAEEAIAFBEGogASkDEFAiBhtBACADGyAGGyEGIAQoAoABIg8gASgCZEchEgJAIAdFDQACQAJAIAZFDQACQCAGKQMAIhtCA4NCAFINACAbpyIBIAEoAgAiAUEBajYCACABQX9MDQoLIAYoAgghBiAEKAJ8IRYgBCgCeCEPAkAgBCkDcCIaQgODQgBSDQAgGqciASAB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DQELIAVFDQogAS0AkQFBIHFFDQIgARDYCSIERQ0CIAQtAABBEkcNAiABLQCRAUEgcQ0BIAJBgICAgHg2AvACDAILIAEoAtgBIQQgAS0A4AFB+ABGDQIgASgC3AEhCiACQZgDaiABENQmQQEhBiACQQE2AqwBIAJBnL+cATYCqAEgAkIBNwK0ASACQbMHNgLUBCACQfgAOgDIBCACIAJB0ARqNgKwASACIAJB2ARqNgLQBCACIAJByARqNgLYBCACQagDaiACQagBahCSECACQbwDaiACQaADaigCADYCACACIAIpApgDNwK0AyAEIAogAkGoA2oQ4BohBCABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgASgCiAEhBiACQcADaiABEN0BIAEgASgCiAFBAXIQqBIgASgC2AEhBCABEKELIAJBqAFqIAEgBBC7AgJAAkACQCACKAKoAUGAgICAeGoOAgACAQsgASACQcADahDHBSACQYCAgIB4NgLwAgwCCwJAQShFDQAgAkHwAmogAkGoAWpBKPwKAAALIAEgASgCiAFBfnEgBkEBcXIQqBIgAkHAA2oQliYgAigC8AJBgICAgHhGDQFBACEGIAJB8AJqEKYiIQQMCwsgASACQcADahDHBSACQYCAgIB4NgLwAiACQawBahDpBwsgARDYCSIERQ0HIAQtAAANByABEIsnDQcgAkH4ADoAyAQgAS0A4AEhBCACIAJByARqNgLYBAJAIARB+ABGDQAgASgC3AEhBCABKALYASEFIAJBmANqIAEQ1CZBASEGIAJBATYCrAEgAkGcv5wBNgKoASACQgE3ArQBIAJBswc2AtQEIAIgAkHQBGo2ArABIAIgAkHYBGo2AtAEIAJBqANqIAJBqAFqEJYQIAJBvANqIAJBoANqKAIANgIAIAIgAikCmAM3ArQDIAUgBCACQagDahDgGiEEIAEtAOABQaIBRw0KIAEgARCaLBCnFwwKCyABEKELIAEpA9ABIREgAkEBNgKoASACIBE3AqwBIAJB0ABqIAFBASACQagBahB6IAIoAlQhBCACKAJQIQYMAQsgARChCyACQQA2ArABIAJCgICAgMAANwKoASACQdgAaiABQQEgBCACQagBahDTCyACKAJcIQQgAigCWCEGCyAGQQJGDQUMBwsgARChCyABKALUASEFQQhBwAAQ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IQUgBEECOwG8DQJAIANB//8DcQ0AQQEhBSAEQQE2AsQNIARB4eCXATYCwA0gBEG8DWohAgwCCyAEIAk2AswNIARBADsByA0gBEECNgLEDSAEQZSImQE2AsANIARBvA1qIQIMAQtBASEFIARBATYCxA0gBEHh4JcBNgLADSAEQbwNaiECCyAEIAU2AqQMIAQgAjYCoAwgBCALNgKcDCAEIAo2ApgMIAAgBEGYDGoQyAUhBSAEQeAOaiQAIAUL6yUCHn8HfiMAQdAAayICJAACQAJAIAEoAgAiA0EJRw0AIABBCGogAUEIahBMIABBCTYCAAwBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCQABAgMEBQYHCAALIAEoAgghBCABKAIYIQUgASgCFCEGIAJBCGogASgCDCIHQQhByAAQlQ8gAigCDCEIIAIoAghBAUYNCCACKAIQIQkCQCAIRQ0AIAdByABsIQpBACELIAghDANAIAogC0YNAQJAAkACQAJAIAQgC2oiDSkDACIgQn18IiGnQQFqQQAgIUICVBsOAwABAgALIA1BMGooAgAhDiANQSxqKAIAIQ8gDUEoaigCACEQIA1BPGooAgAhESANQThqKAIAIRICQCANQSBqKQMAIiFCA4NCAFINACAhpyITIBMoAgAiE0EBajYCACATQX9MDRALQgIhIiANQTRqLQAAIRQCQAJAICBCAlINACAVIRMMAQsgDUEUaigCACETIA1BEGooAgAhFgJAAkAgDSgCAEEBRw0AAkAgDUEIaikDACIgQgODQgBSDQAgIKciFyAXKAIAIhdBAWo2AgAgF0F/TA0TCwJAIA1BGGopAwAiI1ANACAjQgODUEUNACAjpyIXIBcoAgAiF0EBajYCACAXQX9MDRMLIBOtQiCGIBathCEkQgEhIgwBCyANQRhqNQIAISICQCANQQhqKQMAIiBCA4NCAFINACAgpyIXIBcoAgAiF0EBajYCACAXQX9MDRILICNCgICAgIBggyAihCANQRxqMQAAQiCGhCEjIBOtQiCGIBathCEkQgAhIgsgIEIgiKchGCAjpyEZICCnIRogI0IgiKciEyEVCyAhQiiIpyEbICFCIIinIRwgDUHAAGotAAAhHSAhpyEWIBkhFyAkISEgGCEeIBohHwwCCyANQSBqKAIAIRYg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AGoQ4BohAwJAIAEtAOABQaIBRw0AIAEQmxIhByABEKELIAEgBxCnFwsgAEEFNgIAIAAgAzYCBAwJCyABKALYASEFIAEQoQsCQAJAIAEtAOABQQNGDQAgAkEIaiABEP8JQQEhAyACKAIMIQcgAigCCEEBcQ0JIAIgBzYClAMgAkEBNgKQAyABLQDgAUEDRg0BIAEoAtwBIQMgASgC2AEhByACQZwDaiABENQmIAJBATYCXCACQZy/nAE2AlggAkIBNwJkIAJBswc2AsQDIAJBAzoAzwMgAiACQcADajYCYCACIAJByANqNgLAAyACIAJBzwNqNgLIAyACQagDaiACQdgAahCTECACQbwDaiACQaQDaigCADYCACACIAIpApwDNwK0AyAHIAMgAkGoA2oQ4BohByABLQDgAUGiAUYNAwwICyADKAIAIQdBACEDCyABEKELIAIgBTYCUCACIAc2AkwgAiAHNgJIIAIgAzYCRCACIAEoAtQBIgc2AlQCQCADDQAgAkHVgICAeDYCWCAFIAcgAkHYAGoQ4BohAwJAIAEtAOABQaIBRw0AIAEgARCaLBCnFwsgAkHEAGoQ+CggAEEFNgIAIAAgAzYCBAwJCyAAIAM2AgQgAEEBNgIAIAAgAkHIAGoiASkCADcCCCAAQRBqIAFBCGopAgA3AgAMCAsgAkHYAGogAUEBEPkbIAIoAlghASACKALoASIDQYGAgIB4Rg0EAkBBjAFFDQAgAkGEAmogAkHYAGpBBHJBjAH8CgAACyACQfgBakEIaiACQfQBaigCADYCACACIAIpAuwBNwP4ASADQYCAgIB4Rg0CQQhBoAEQoCwiB0UNAyAHIAE2AgACQEGMAUUNACAHQQRqIAJBhAJqQYwB/AoAAAsgByADNgKQASAAIAc2AgQgAEECNgIAIAcgAikD+AE3ApQBIAdBnAFqIAJBgAJqKAIANgIADAcLIAEgARCaLBCnFwwECyACQRBqIAEQ/hogAkE0aiACQRBqQQhqKQMANwIAIAJBKGpBFGogAkEQakEQaikDADcCACAAQQA2AgggAEEANgIAIAIgAikDEDcCLCAAIAIpAig3AgwgAEEUaiACQShqQQhqKQIANwIAIABBHGogAkEoakEQaikCADcCACAAQSRqIAJBwABqKAIANgIADAULIAAgAikChAI3AgggACABNgIE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1AFqIAEQnyEMCQsgA0EBNgL0ASADQaCFmQE2AvABIANBATYC5AEgA0GYhZkBNgLgASADQQE2AuwBIANBnAI2ArgBIAMgATsBoAEgAyADQbQBajYC6AEgAyADQaABajYCtAEgA0HUAWogA0HgAWoQwhNFDQhBxIicAUErIANB4AFqQZSEmQFB8IaZARDqEgALAkACQCANDQAgCUEBcQ0BIANB1AFqIAEQnyEMCQsgAyABQYCAfGpBCnZBgLADajYCsAEgAyABQf8HcUGAuANyNgKgASADQQI2AvQBIANB2IWZATYC8AEgA0ECNgLkASADQciFmQE2AuABIANBAjYC7AEgA0HkADYCwAEgA0HkADYCuAEgAyADQbQBajYC6AEgAyADQaABajYCvAEgAyADQbABajYCtAEgA0HUAWogA0HgAWoQwhNFDQhBxIicAUErIANB4AFqQZSEmQFBoIeZARDqEgALIANBATYC9AEgA0GghZkBNgLwASADQQI2AuQBIANBgIeZATYC4AEgA0EBNgLsASADQeQANgK4ASADIAE2AqABIAMgA0G0AWo2AugBIAMgA0GgAWo2ArQBIANB1AFqIANB4AFqEMITRQ0HQcSInAFBKyADQeABakGUhJkBQZCHmQEQ6hIACyAODQIgA0HUAWogARCfIQwGCyADQeABakH7ABCRCgwCCyADQdQBakHcABCfISADQdQBaiAEEJ8hDAQLIANB1AFqQZiGmQFBAhDwBSADQQE2AuQBIANBnL+cATYC4AEgA0IBNwLsASADQecBNgK4ASADIAE6AKABIAMgA0G0AWo2AugBIAMgA0GgAWo2ArQBIANB1AFqIANB4AFqEMITRQ0DQcSInAFBKyADQeABakGUhJkBQbCHmQEQ6hIACyADQeABaiABKAIAEJEKIANBtAFqEOYkGkEDIQUCQAJAAkACQAJAAkACQAJAA0AgBUUNASADQbQBahDmJCIBQYCAxABGDQICQCABQVBqQQpJDQAgAUGff2pBBkkNACABQb9/akEFSw0DCyADQeABaiABEJEKIAVBf2ohBQwACwsgBw0BQQYhCkECIQUgAygC6AEhBiADKALkASEMDAQLIAdFDQELIANB4AFqQf0AEJEKIAVFDQELIANB1AFqQYvPmwFBAhDwBQwDC0EDIQUgAygC5AEhDCADKALoASIGQX9qIgpBA0kNAQsCQAJAIAUgBkkNACAFIAZGDQEMAgsgDCAFaiwAAEFASA0BCwJAAkAgCiAGSQ0AIAogBkcNAgwBCyAMIApqLAAAQb9/TA0BCyAMIAVqIQECQAJAAkACQAJAAkAgCiAFayIKDgIEAAELQQEhBSABLQAAQVVqDgMDAQMBCwJAIAEtAABBK0cNACAKQX9qIQUgAUEBaiEBIApBCkkNAQwCCyAKIQUgCkEJTw0BC0EAIQoDQCAFRQ0DIANBwABqIAEtAAAQ8SIgAygCQEEBcUUNAiABQQFqIQEgBUF/aiEFIAMoAkQgCkEEdGohCgwACwtBACEKA0AgBUUNAiAKQf////8ASw0BIANByABqIAEtAAAQ8SIgAygCSEEBcUUNASABQQFqIQEgBUF/aiEFIAMoAkwgCkEEdCILaiIKIAtPDQALCyADQdQBakGLz5sBQQIQ8AUMAgsCQCAKQf//A0sNAAJAIApBgPADcUGAsANGDQAgA0HUAWpBi8+bAUECEPAFDAMLIANB1AFqQdwAEJ8hDAILIANB1AFqIAwgBhDwBUEHQQUgBxshAQNAIAFFDQIgAUF/aiEBIANBiAJqEOYkGgwACwsgDCAGIAUgCkHYhpkBEOMqAAsgA0HgAWoQpy0MAgsCQCADQYgCahDSIyIBRQ0AIAEoAgBBUGpBCkkNAQsgA0HUAWpBxIaZAUECEPAFDAELIANB1AFqQcaGmQFBBBDwBQwACwsgBEEBaiEEDAALCyADQaoBaiADLQDiAToAACADIAo2AqQBIAMgCDYCoAEgAyADLwHgATsBqAEgAyABOgCrAQJAIAItAFBFDQAgA0E4aiADQaABahCcGCADKAI4IQUgAygCPCEBIANBCDYCsAEgAyABNgLQASADIAU2AswBQQAhByADQQA2AsQBIAMgBSABajYCwAEgAyAFNgK8ASADQQI2ArQBIAMgA0GwAWo2AsgBIANBMGogA0G0AWpBCGoQsAggAyADKAI0NgK4ASADIAMoAjAiCDYCtAECQAJAAkAgCEEBcUUNAAJAAkAgAQ0AQYCAgIB8IQhBACEBDAELAkAgAUENSQ0AIANB4AFqIAEQwxogAygC4AEhCCADKALkASEHIAFFDQEgByAFIAH8CgAADAELIANBADYA5wEgA0IANwPgASADIAFBwAFyOgDrAQJAIAFFDQAgA0HgAWogBSAB/AoAAAsgAygC6AEhCCADKALkASEBIAMoAuABIQcLIAMgCDYC3AEgAyABNgLYASADIAc2AtQBIANB4AFqQRhqIANBtAFqQRhqKQIANwMAIANB4AFqQRBqIANBtAFqQRBqKQIANwMAIANB4AFqQQhqIgYgA0G0AWpBCGopAgA3AwAgAyADKQK0ATcD4AEgA0EANgKAAgNAIAMoAuABIQEgA0ECNgLgAQJAAkAgAUECRg0AIAMoAuQBIQUMAQsgA0EoaiAGELAIIAMoAiwhBSADKAIoIQELAkAgAUEBcUUNACADIAMoAoACQQFqIgE2AoACIANBEGogA0HUAWoQ1x4CQCABIAVqIgFFDQACQCABIAMoAhQiBUkNACABIAVGDQEMBgsgAygCECABaiwAAEG/f0wNBQsgAy0A3wEhBSADKALYASEHIANB1AFqQQEQlwcgA0EIaiADQdQBahCLGyADKAIIIAFqIQgCQCAHIAVBwABqQf8BcSIKQQwgCkEMSRsgBUH+AUYbIgUgAWsiAUUNACAIQQFqIAggAfwKAAALIAhB3AA6AAAgBUEBaiEBAkAgAy0A3wFB/gFGDQAgAUELSw0CIAMgAUHAAXI6AN8BDAILIAMgATYC2AEMAQsLIANBiAJqQQhqIANB1AFqQQhqKAIANgIAIAMgAykC1AE3A4gCDAELIANB/wE6AJMCIAMgATYCjAIgAyAFNgKIAgsgA0EgaiADQYgCahCcGCADQeABaiADKAIgIAMoAiRBraucAUEEQbGrnAFBBxD7DCADQbQBaiADKALkASADKALoAUG4q5wBQQNBu6ucAUEGEPsMAkACQAJAIAMoArQBIgFB/v//B0sNAAJAAkAgAQ0AIANBqAJqQQAoAqz+mAE2AgAgA0EAKQKk/pgBNwOgAiADKAK4ASEIDAELIAMoArgBIQggAygCvAEiBUEMSw0CIANBADYApwIgA0IANwOgAiADIAVBwAFyOgCrAiAFRQ0AIANBoAJqIAggBfwKAAALIAEgCBCXFgwCCyADQaACaiADKAK4ASIFIAMoArwBEOcNIAEgBRCXFgwBCyADIAFB////ByABQf///wdJG0GAgIBwcjYCqAIgAyAFNgKkAiADIAg2AqACCyADQaABahDNJyADQaABakEIaiADQaACakEIaigCADYCACAD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DQJAAkAgBy0AACIIQf8BRg0AIAggCEECdmogCEEDcUEAR2pBAmohCAwBCyALQQJqIQgLIAggAU8NDgJAAkAgByAIQQJ0aigCACILQX9MDQACQCAKIAhqIgggAU8NACAHIAhBAnRqKAIAIQEMAgsgCCABQay1gwEQkRUACyAMDRAgC0H/////B3EhAQsgA0HoAGogASAEIABBEGooAgAgAEEUaigCACABQeS9gwEQviUoAgBrIAQQ3RcgAkEBNgIAIAYgAykCaDcCACAGQQhqIANB6ABqQQhqKAIANgIADBkLIAAoAighDSACKAIcIQwgA0HIAGogAEEEaigCACAAQQhqKAIAIAhBhL6DARCxIiADKAJMIgtFDQ8CQAJAIAMoAkgiCS0AACIKQf8BRg0AIAogCkECdmogCkEDcUEAR2pBAmoiCiALSQ0BIAogC0HctYMBEJEVAAsgDUECaiIKIAtPDRELAkAgDCAJIApBAnRqKAIAIgpBASAKQX9KG0kNACACQQA2AhggAkEANgIAIAIgAigCIEEBaiIENgIgDBYLIAJBATYCGCACIAxBAWoiCzYCHCAAKAIoIQkgAigCICEKIANBMGogAEEEaigCACAAQQhqKAIAIAhB9L2DARCxIiADKAI0IQEgAygCMCEHIAMgDDYCZCABRQ0RAkACQCAHLQAAIghB/wFGDQAgCCAIQQJ2aiAIQQNxQQBHakECaiEIDAELIAlBAmohCAsgCCABTw0SAkACQCAHIAhBAnRqKAIAIglBf0wNAAJAIAsgCGoiCCABTw0AIAcgCEECdGooAgAhAQwCCyAIIAFBrLWDARCRFQALIAwNFCAJQf////8HcSEBCyADQegAaiABIApBAWoiCCAAQRBqKAIAIABBFGooAgAgAUHkvYMBEL4lKAIAayAIEN0XIAJBATYCACAGIAMpAmg3AgAgBkEIaiADQegAakEIaigCADYCAAwYC0EAQQBBzLWDARCRFQALIAkgDEHstYMBEJEVAAtBAEEAQcy1gwEQkRUACyAIIAFBnLWDARCRFQALIANBADYCaEEAQfjzmAEgA0HkAGogA0HoAGpBvLWDARCVIQALQQBBAEHMtYMBEJEVAAsgDCAKQey1gwEQkRUAC0EAQQBBzLWDARCRFQALIAggAUGctYMBEJEVAAsgA0EANgJoQQBB+POYASAD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ARCAHgwKCyADIAEQ+hMMCQsgAEEIaiABELolDAgLIABBCGogARDOJwwHCyAAQQRqIAEQky8MBgsgAEEEaiABEJMjDAULIABBBGogARCTLwwECyAAQQRqIAEQky8MAwsgAEEEaiABEJMvDAILIABBBGogARCTLwwBCyAAQQRqIAEQky8LIAQgARCTLwwZCyAAQQhqIAEQuiUMGAsgAEEIaiABEM4nDBcLIABBBGogARCTLyAAQQhqIAEQky8gAEEMaiABEJMvDBYLIABBBGohBAJAIAAtABhBBUcNACAAQRBqIAEQky8LIAQgARDIHwwVCyAAQRBqIAEQky8gACgCBEGAgICAeEYNFCAAQQRqIAEQyB8MFAsgAEEEaiABEIchDBMLIABBBGogARCHIQwSCyAAQQRqIAEQky8gACgCCCABEIchDBELIABBBGohBAJAAkACQCABLQBFDQAgAkGAAjsAxAEgBCACQcQBahDRFyACLQDEAQ0BCyACQfAAakEAIAEoAkBBABCbDCACQfABaiEDAkBB1ABFDQAgAyACQfAAakHUAPwKAAALIAJBzAJqQQApA4CFngEiCjcCACACQdQBaiIGIAo3AgAgAkHkAWogCjcCACACQQA6ANQCIAJBADYCxAEgAkEAOgDsASACQQApA/iEngEiCzcCxAIgAiALNwLMASACIAs3AtwBIAJBxAFqIAQQsgwgAkHYAmpBCGogBikCADcDACACIAIpAswBNwPYAiACQegCaiACQcQCahDVECACQaADaiIEIAJB3AFqENUQIAIgAkHYAmo2ApgDIAJB0ANqQQhqIAo3AwAgAiALNwPQAyACQSBqIAJB6AJqEOUSIAJB0ANqIAIoAiAQiigCQCACKAKIA0GBgICAeEYNAAJAQTBFDQAgAkEgaiACQegCakEw/AoAAAsCQANAIAJB4ANqIAJBIGoQ0Q0gAikD4AMiClANASACIAIoAugDNgL4AyACIAo3A/ADAkAgAkHYAmogAkHwA2oQwQtFDQAgAikD8AMQyCEMAQsgAkHQA2ogChDCBgwACwtCABCDKyACQSBqENsKCwJAIAIoAsADQYGAgIB4Rg0AAkBBMEUNACACQSBqIARBMPwKAAALAkADQCACQfADaiACQSBqENENIAIpA/ADIgpQDQEgAkHQA2ogChDCBgwACwtCABCDKyAC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CGohAyABQQRqIQEMAAsLIAogBhCLLSACKQOQAiEfIAJByAFqIgEgCzYCACACIAtFOgDMASACIB83A8ABIAJBwAFqEPsFIAJBnAJqIAEpAwA3AgAgAiACKQPAATcClAIgAkEANgKQAiAAIAJBkAJqEKwODAoLIAIoApACIAIoApQCEIstCyACKAI8IQEgAigCQCEEQQAhAyACQQA2ApgCIAJCgICAgBA3ApACIARBHGwhBEEBIQoCQANAIARFDQECQCABKAIAQQFGDQAgAigCkAIhBwwJCyACKAKQAiEHIAEoAghBAUcNCCABKAIELQAAIQYCQCADIAdHDQAgAkGQAmpBjNGEARCKDyACKAKUAiEKCyABQRxqIQEgCiADaiAGOgAAIAIgA0EBaiIDNgKYAiAEQWRqIQQMAAsLIAIoApACIgpBgICAgHhGDQcgAigClAIhBiACQSBqIANBAUECQeiymwEQsRlBACEBIAJBADYCmAIgAiACKQMgNwOQAiACQZACaiADEJQlIAIoApQCIAIoApgCIgtBAXRqIQQCQANAIAMgAUYNASAEQQFqIAYgAWotAAAiBzoAACAEIAc6AAAgBEECaiEEIAFBAWohAQwACwsgCiAGEIctIAIpA5ACIR8gAkHIAWoiAyALIAFqIgE2AgAgAiABRToAzAEgAiAfNwPAASACQcABahDtBSACQZwCaiADKQMANwIAIAIgAikDwAE3ApQCIAJBATYCkAIgACACQZACahCsDgwICyAAEJ4WDAcLIAQgASkCBDcCACAEQQhqIAFBDGopAgA3AgAgBEEQaiABQRRqKQIANwIAIAIgBzYCRCACQZACaiACQcQAahCvGyACQcABakEQaiIHIAJBkAJqQRBqIgspAgA3AwAgAkHAAWpBCGoiCSACQZACakEIaiIIKQIANwMAIAIgAikCkAIiHzcDwAEgAigCqAIhCiAfp0EHRg0BIAsgBykDADcDACAIIAkpAwA3AwAgAiACKQPAATcDkAIgAiAKNgKoAiACQThqIAJBkAJqQbTPhAEQzxQMAgtBpM+EARDSLAALIAIoAswBIQsgAigCyAEhByACIAIoAsQBNgKYAiACIAc2ApACIAIgBzYClAIgAkE4aiALEI4lIAIoAkAhCQJAIAtBHGwiCEUNACACKAI8IAlBHGxqIAcgCPwKAAALIAIg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ADAgASADNgIsIAEgCzYCKCABIAk2AiQgASAINgIgIAEgBTYCHCABIAw2AhggASAPNgIUIAEgDjYCECABIBs2AgwgASAVNgIIIAEgHDYCBCABIBM2AgAgAEEMaiACQcAAaigCADYCACAAIAIpAjg3AgQgACABNgIYIABBBzYCAAwHCyATIBQgEyABKAIEIh0gHE9xIh4bIRMgHCAdIB4bIRxBACEUCyAWIAtyIQsgFyAJciEJIBggCHEhCCAZIAVxIQUgGiAMciEMQX8gBCADGyEDQQAhBCASQQFxDQALQQEhCkEAIQRBACESIAEoAggiFkEBRw0ACyAVIBYgFSABKAIMIgEgG01xIgQbIRIgGyABIAQbIRtBACEEDAALCyADIAEQmRUAC0GgppwBQShBzNGEARDSHgALIAJBsAJqJAAL8iICKn8CfiMAQbACayICJAAgASgCBCEDIAJB0AFqIAEoAggiBEEIQdgAEJUPIAIoAtQBIQUCQAJAAkACQAJAIAIoAtABQQFGDQAgAigC2AEhBgJAIAVFDQAgAyAEQdgAbGohByACQdABakEdaiEIIAJB0AFqQTBqIQkgAkHYAGpBKGohCiACQdgAakEkaiELIAJBBHIhDCACQQhqIQ0gBSEOQQAhDwNAIAMgB0YNAQJAAkACQAJAAkACQAJAAkACQAJAIAMoAgAiAUF8akEAIAFBe2pBCEkbDgkAAQIDBAUGBwgACyADKAJMIRAgAygCPCERIAMoAjghEiACQdgAaiADEMMEIAMoAkQhEyACQdABaiADKAJIIhRBCEHAABCVDyACKALUASEVIAIoAtABQQFGDQwgAigC2AEhFgJAIBVFDQAgFEEGdCEXQQAhGCAVIRkDQCAXIBhGDQECQAJAIBMgGGoiASgCAEEHRg0AIAFBKGooAgAhGiABQSxqKAIAIRsgCSABQTBqEO0IIAJB0AFqIAEQvAIgAkHMAWpBAmogCEECai0AADoAACACQcABakEIaiAJQQhqKAIANgIAIAIgGzYC/AEgAiAaNgL4ASACIAgvAAA7AcwBIAIgCSkDADcDwAEgAigC0AEhHCACKALUASEdIAIoAtgBIR4gAigC3AEhHyACKALgASEgIAIoAuQBISEgAigC6AEhIiACLQDsASEjIAIoAvABISQgAigC9AEhJSACLQCPAiEmIAItAI4CIScgAi0AjQIhKCACLQCMAiEpDAELIAFBLGooAgAhGyABQShqKAIAIRogAkGgAWogAUEwahDtCCABQT1qLQAAISggAUE8ai0AACEpIAFBPmotAAAhJwJAAkAgAUEcai0AACIjQQJHDQAgAUEUaigCACEhIAFBEGooAgAhICABQQhqKAIAIR8Q/SchHiACQdABaiAfELwCIB5BIGogAkHQAWpBIGoiIikDADcDACAeQRhqIAJB0AFqQRhqIiMpAwA3AwAgHkEQaiACQdABakEQaiIcKQMANwMAIB5BCGogAkHQAWpBCGoiJCkDADcDACAeIAIpA9ABNwMAIAFBDGooAgAhARD6JyEfIAJB0AFqIAEQQiAfQThqIAJB0AFqQThqKQMANwMAIB9BMGogCSkDADcDACAfQShqIAJB0AFqQShqKQMANwMAIB9BIGogIikDADcDACAfQRhqICMpAwA3AwAgH0EQaiAcKQMANwMAIB9BCGogJCkDADcDACAfIAIpA9ABNwMAQQIhIyAqISIMAQsgAUEIaiIcKAIAIR4gAUEUaigCACEhIAFBEGooAgAhICABQQxqKAIAIR8gAUEYaigCACEiAkAgHCkDACIsQgODQgBSDQAgLKciHCAcKAIAIhxBAWo2AgAgHEF/TA0SCwJAIAFBIGooAgAiAQ0AQQAhKwwBCxD7JyErIAEpAgQhLCABKAIAIRwQ/CchASACQdABaiAcEHYCQEHgAEUNACABIAJB0AFqQeAA/AoAAAsgKyAsNwIEICsgATYCAAsgAkHAAWpBCGogAkGgAWpBCGooAgA2AgAgAiACKQOgATcDwAFBByEcICIhKiArISQLIBYgGGoiASAcNgIAIAFBHGogIzoAACABQRhqICI2AgAgAUEUaiAhNgIAIAFBEGogIDYCACABQQxqIB82AgAgAUEIaiAeNgIAIAFBBGogHTYCACABQR1qIAIvAcwBOwAAIAFBH2ogAkHMAWpBAmotAAA6AAAgAUEsaiAbNgIAIAFBKGogGjYCACABQSRqICU2AgAgAUEgaiAkNgIAIAFBMGogAikDwAE3AwAgAUE4aiACQcABakEIaigCADYCACABQT9qICY6AAAgAUE+aiAnOgAAIAFBPWogKDoAACABQTxqICk6AAAgGEHAAGohGCAZQX9qIhkNAAsLQYCAgIB4ISICQCADKAIgQYCAgIB4Rg0AIAMoAiQhGiADKAI0ISEgAygCMCEgIAMoAiwhGSACQdABaiADKAIoIiNBCEEwEJUPIAIoAtQBISIgAigC0AFBAUYNDyACKALYASEeAkAgIg0AQQAhIgwBCyAjQTBsIRtBACEYICIhHwNAIBsgGEYNASACQdABaiAaIBhqEEwgHiAYaiIBQShqIAJB0AFqQShqKQMANwMAIAFBIGogAkHQAWpBIGopAwA3AwAgAUEYaiACQdABakEYaikDADcDACABQRBqIAJB0AFqQRBqKQMANwMAIAFBCGogAkHQAWpBCGopAwA3AwAgASACKQPQATcDACAYQTBqIRggH0F/aiIfDQALCyANIAJB2ABqQQhqKQMANwMAIAJBEGogAkHYAGpBEGopAwA3AwAgAkEYaiACQdgAakEYaikDADcDACACIAIpA1g3AwAgAiAUNgJIIAIgFjYCRCACIBU2AkAgAiAQNgJMIAIgETYCPCACIBI2AjggAiAhNgI0IAIgIDYCMCACIBk2AiwgAiAjNgIoIAIgHjYCJCACICI2AiAgAiADLwFQOwFQDAgLIAMpAyghLCACQdABaiADQQhqEMMEIAJB0AFqQShqIgEgAygCMBDRBDYCACACQdABakEgaiAsNwMAIA1BIGogLDcDACANIAIpA9ABNwMAIA1BCGogAkHQAWpBCGopAwA3AwAgDUEQaiACQdABakEQaikDADcDACANQRhqIAJB0AFqQRhqKQMANwMAIAIgAy0ANDoA/AEgAiADKAA1NgD9ASANQShqIAEpAwA3AwAgAiADLQA5OgCBAiANQTBqIAkpAwA3AwAgAkEFNgIADAcLIAMoAhQhASADKAIQIRggAygCHCEfIAMoAhghHgJAIAMpAwgiLEIDg0IAUg0AICynIhogGigCACIaQQFqNgIAIBpBf0wNDAsgAiADKAIgENEENgIgIAIgHzYCHCACIB42AhggAiABNgIUIAIgGDYCECACICw3AwggAkEGNgIAIAIgAy8BKDsBKCACIAMoAiQ2AiQMBgsgAygCLCEeIAMoAighGiACQaABaiADQQhqEMMEQQAhGEEAIQECQCADKAI8Ih9FDQAQ+ichASACQdABaiAfEEIgAUE4aiACQdABakE4aikDADcDACABQTBqIAkpAwA3AwAgAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwALAkAgAygCQCIfRQ0AEPsnIRggHykCBCEsIB8oAgAhGxD8JyEfIAJB0AFqIBsQdgJAQeAARQ0AIB8gAkHQAWpB4AD8CgAACyAYICw3AgQgGCAfNgIACyADLQBEIR8gCiADQTBqEO0IIAJB2ABqQQhqIAJBoAFqQQhqKQMANwMAIAJB2ABqQRBqIAJBoAFqQRBqKQMANwMAIAJB2ABqQRhqIAJBoAFqQRhqKQMANwMAIAIgHjYCfCACIBo2AnggAiAfOgCUASACIBg2ApABIAIgATYCjAEgAiACKQOgATcDWCACIAMtAEs6AJsBIAIgAy8ASTsAmQEgAiADKABFNgCVAQJAQcgARQ0AIA0gAkHYAGpByAD8CgAACyACQQc2AgAMBQsgAygCFCEeIAMoAhAhGiADKAIgIRsgAygCHCEiIAMoAhghIwJAIAMpAwgiLEIDg0IAUg0AICynIgEgASgCACIBQQFqNgIAIAFBf0wNCgtBACEYQQAhAQJAIAMoAiQiH0UNABD6JyEBIAJB0AFqIB8QQiABQThqIAJB0AFqQThqKQMANwMAIAFBMGogCSkDADcDACABQShqIAJB0AFqQShqKQMANwMAIAFBIGogAkHQAWpBIGopAwA3AwAgAUEYaiACQdABakEYaikDADcDACABQRBqIAJB0AFqQRBqKQMANwMAIAFBCGogAkHQAWpBCGopAwA3AwAgASACKQPQATcDAAsCQCADKAIoIh9FDQAQ+ychGCAfKQIEIS0gHygCACEZEPwnIR8gAkHQAWogGRB2AkBB4ABFDQAgHyACQdABakHgAPwKAAALIBggLTcCBCAYIB82AgALIAMtADkhHyALIANBLGoQ7QggAkHYAGpBCGoiGSAaNgIAIAJB2ABqQRBqIhogIzYCACACQdgAakEYaiIjIBs2AgAgAkHYAGpBIGoiGyAYNgIAIAJB2ABqQTBqIhggAy0AODoAACANICw3AwAgDUEoaiAKKQMANwMAIAIgHjYCZCANQQhqIBkpAwA3AwAgAiAiNgJsIA1BEGogGikDADcDACACIAE2AnQgDUEYaiAjKQMANwMAIA1BIGogGykDADcDACACIB86AIkBIAIgAygBOjYBigEgDUEwaiAYKQMANwMAIAIgLDcDWCACQQg2AgAMBAsgDCADQQRqEL8IIAJBCTYCAAwDC0HYAEUNAiACIANB2AD8CgAADAILIAMoAgghGCADKAIYISMgAygCFCEZIAMoAhAhICADKAIgISEgAygCHCEnIAJB0AFqIAMoAgwiG0EIQTAQlQ8gAigC1AEhGiACKALQAUEBRg0IIAIoAtgBISICQCAaRQ0AIBtBMGwhHyAiIQEgGiEeA0AgH0UNASACQdABaiAYEEwgAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwAgAUEwaiEBIB9BUGohHyAYQTBqIRggHkF/aiIeDQALCyACICE2AiAgAiAnNgIcIAIgIzYCGCACIBk2AhQgAiAgNgIQIAIgGzYCDCACICI2AgggAiAaNgIEIAJBCzYCAAwBCyADKAIsIR4gAygCKCEaAkACQCADKAIIQQVGDQAgAkGgAWogA0EIahDDBAwBCyADKAIcIQEgAygCGCEYAkAgAykDECIsQgODQgBSDQAgLKciHyAfKAIAIh9BAWo2AgAgH0F/TA0HCyACIAE2ArQBIAIgGDYCsAEgAiAsNwOoASACQQU2AqABC0EAIRhBACEBAkAgAygCPCIfRQ0AEPonIQEgAkHQAWogHxBCIAFBOGogAkHQAWpBOGopAwA3AwAgAUEwaiAJKQMANwMAIAFBKGogAkHQAWpBKGopAwA3AwAgAUEgaiACQdABakEgaikDADcDACABQRhqIAJB0AFqQRhqKQMANwMAIAFBEGogAkHQAWpBEGopAwA3AwAgAUEIaiACQdABakEIaikDADcDACABIAIpA9ABNwMACwJAIAMoAkAiH0UNABD7JyEYIB8pAgQhLCAfKAIAIRsQ/CchHyACQdABaiAbEHYCQEHgAEUNACAfIAJB0AFqQeAA/AoAAAsgGCAsNwIEIBggHzYCAAsgAy0ARCEfIAogA0EwahDtCCACQdgAakEIaiACQaABakEIaikDADcDACACQdgAakEQ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CjoAOSAAIAs6ADggACAENgI0IAAgBTYCMCAAIBI6ACwgACADNgIoIAAgCDYCJCAAIBA2AiAgACAUNwMYIAAgETYCFCAAIA42AhAgACAPNgIMIAAgDTYCCCAAQRA2AgAMBgsgASgCLCEHIAEoAighAwJAAkACQAJAAkACQCABKAIIIgRBgICAgHhzIgVBBCAFQQRJGw4FAAECAwQACyABKAIkIQggASgCICEFIAEpAxghFCABKAIUIRAgASgCECERAkAgASkDICIVUA0AIBVCA4NQRQ0AIBWnIgEgASgCACIBQQFqNgIAIAFBf0wNBwsgFEIgiKchDiAUpyEGQYCAgIB4IQQMBAsgASgCHCEOIAEoAhghBgJAIAEpAxAiFEIDg0IAUg0AIBSnIgQgBCgCACIEQQFqNgIAIARBf0wNBgsgASgCJCEIIAEoAiAhBQJAIAEpAyAiFVANACAVQgODUEUNACAVpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIBRCIIinIRAgFKchEUGBgICAeCEEDAMLIAEpAxgiFEIgiKchDiABKQMQIhVCIIinIRAgASgCJCEIIAEoAiAhBSABKAIMIQEgFKchBiAVpyERDAILIAEoAiAhBCABKAIUIRAgASgCECEREP4nIQUgBC0ADCEGIAJBoAFqIARBBGooAgAgBEEIaigCABDgFyAFIAIpAqABNwIAIAIgBjoArAEgBUEIaiACQaABakEIaikCADcCACABKQMYIhSnIQYCQCAUUA0AIBRCA4NQRQ0AIAYgBigCACIBQQFqNgIAIAFBf0wNBAsgFEIgiKchDkGDgICAeCEEDAELIAEoAiQhCCABKAIgIQUgAkGgAWogAUEIahDVDCACQawBaiABKAIYIAEoAhwQ+AggAikCsAEiFEIgiKchDiACKQKoASIVQiCIpyEQIAIoAqQBIQEgAigCoAEhBCAUpyEGIBWnIRELIAAgBzYCLCAAIAM2AiggACAINgIkIAAgBTYCICAAIAE2AgwgACAENgIIIABBETYCACAAIA6tQiCGIAathDcDGCAAIBCtQiCGIBGthDcDEAwFCyABLQAsIQUgASgCJCEGIAEoAiAhByABLQAcIgNBAkYNASABKAIYIQggASgCFCEQIAEoAhAhESABKQMIIhRCA4NCAFINAiAUpyIEIAQoAgAiBEEBajYC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IAkgAUsbIgFBKU8NACABQQJ0IQECQAJAA0AgAUUNASABQXxqIgEgA0HsA2pqKAIAIgUgASADQfwIamooAgAiBkYNAAsgBSAGSyAFIAZJayEBDAELQX9BACADQfwIaiADQfwIaiABakcbIQELAkACQAJAAkACQAJAAkAgASAESA0AIAMoAqABIgZBKU8NBgJAAkAgBg0AQQAhBgwBCyADIAZBAnQiBWohCiADIQFCACEZA0AgASABNQIAQgp+IBl8Iho+AgAgAUEEaiEBIBpCIIghGSAFQXxqIgUNAAsgGkKAgICAEFQNACAGQShGDQYgCiAZpzYCACAGQQFqIQYLIAMgBjYCoAEgAygCxAIiBkEpTw0EQQAhCkEAIQECQCAGRQ0AIANBpAFqIAZBAnQiBWohCyADQaQBaiEBQgAhGQNAIAEgATUCAEIKfiAZfCIaPgIAIAFBBGohASAaQiCIIRkgBUF8aiIFDQALAkAgGkKAgICAEFoNACAGIQEMAQsgBkEoRg0EIAsgGac2AgAgBkEBaiEBCyADIAE2AsQCAkAgCEUNACADQcgCaiAIQQJ0aiEGIAhBAnQhBSADQcgCaiEBQgAhGQNAIAEgATUCAEIKfiAZfCIaPgIAIAFBBGohASAaQiCIIRkgBUF8aiIFDQALAkAgGkKAgICAEFoNACADIAg2AugDDAMLIAhBKEYNAyAGIBmnNgIAIAhBAWohCgsgAyAKNgLoAwwBCyAHQQFqIQcLAkBBpAFFIgENACADQZAFaiADQewDakGkAfwKAAALIANBkAVqQQEQowMhDQJAIAENACADQbQGaiADQewDakGkAfwKAAALIANBtAZqQQIQowMhDgJAIAENACADQdgHaiADQewDakGkAfwKAAALAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIANB2AdqQQMQowMiDygCoAEiECADKAKgASIKIBAgCksbIglBKEsNACANKAKgASERIA4oAqABIRIgAygCjAUhE0EAIRQDQCAUIRUgCUECdCEBAkACQAJAAkADQCABRQ0BIAFBfGoiASADaigCACIFIAEgA0HYB2pqKAIAIgZGDQALIAUgBkkNAQwCCyAPIANB2AdqIAFqRg0BC0EAIRYgCiEJDAELAkAgCUUNAEEBIQogA0HYB2ohBSADIQEgCSEL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yO6eATYC0O6eAUEAQdDungE2AtzungFBAEHQ7p4BNgLY7p4BQQBB2O6eATYC5O6eAUEAQdjungE2AuDungFBAEHg7p4BNgLs7p4BQQBB4O6eATYC6O6eAUEAQejungE2AvTungFBAEHw7p4BNgL87p4BQQBB6O6eATYC8O6eAUEAQfjungE2AoTvngFBAEHw7p4BNgL47p4BQQBBgO+eATYCjO+eAUEAQfjungE2AoDvngFBAEGI754BNgKU754BQQBBgO+eATYCiO+eAUEAQZDvngE2ApzvngFBAEGI754BNgKQ754BQQBBmO+eATYCpO+eAUEAQZDvngE2ApjvngFBAEGg754BNgKs754BQQBBmO+eATYCoO+eAUEAQajvngE2ArTvngFBAEGg754BNgKo754BQQBBsO+eATYCvO+eAUEAQajvngE2ArDvngFBAEG4754BNgLE754BQQBBsO+eATYCuO+eAUEAQcDvngE2AszvngFBAEG4754BNgLA754BQQBByO+eATYC1O+eAUEAQcDvngE2AsjvngFBAEHQ754BNgLc754BQQBByO+eATYC0O+eAUEAQdjvngE2AuTvngFBAEHQ754BNgLY754BQQBB4O+eATYC7O+eAUEAQdjvngE2AuDvngFBACAFNgKE8J4BQQBB4O+eATYC6O+eAUEAIAhBWGoiADYC/O+eASAFIABBAXI2AgQgBSAAakEoNgIEQQBBgICAATYCkPCeAQwICyABIAVPDQAgBiABSw0AIAAoAgxFDQMLQQBBACgClPCeASIAIAUgACAFSRs2ApTwngEgBSAIaiEGQdjtngEhAAJAAkACQANAIAAoAgAiByAGRg0BIAAoAggiAA0ADAILCyAAKAIMRQ0BC0HY7Z4BIQACQANAAkAgACgCACIGIAFLDQAgASAGIAAoAgRqIgZJDQILIAAoAgghAAwACwtBACAFNgKE8J4BQQAgCEFYaiIANgL8754BIAUgAEEBcjYCBCAFIABqQSg2AgRBAEGAgIABNgKQ8J4BIAEgBkFgakF4cUF4aiIAIAAgAUEQakkbIgdBGzYCBEEAKQLY7Z4BIQkgB0EQakEAKQLg7Z4BNwIAIAcgCTcCCEEAIAg2AtztngFBACAFNgLY7Z4BQQAgB0EIajYC4O2eAUEAQQA2AuTtngEgB0EcaiEAA0AgAEEH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AAAgACAFrUI0hiAQhL8iFZogFSAEQS1GGzkDCAsgA0HADGokAAuIIQElfyMAQdAEayICJAACQAJAAkACQCABLQDgAUECRg0AIAEoAtwBIQMgASgC2AEhBCACQTRqIAEQ1CYgAkEBNgK8ASACQZy/nAE2ArgBIAJCATcCxAEgAkGzBzYCiAEgAkECOgCgASACIAJBhAFqNgLAASACIAJBgARqNgKEASACIAJBoAFqNgKABCACQagEaiACQbgBahD9GiACQbwEaiACQTxqKAIANgIAIAIgAikCNDcCtAQgBCADIAJBqARqEOAaIQMgAS0A4AFBogFGDQEMAgsgARChCyACQShqQQhBCEE4QaDUmwEQpxogAkEANgJUIAIgAigCLCIFNgJQIAIgAigCKDYCTCACQagEakEMaiEGIAJBgARqQQxqIQcgAkG4AWpBKGohCCACQagEakEIaiEJIAJBqARqQQRyIQogAkG4AWpBBHIhCyACQYQBakEMaiEMIAJBhAFqQQhqIQ0gAkG4AWpBCGohDkEAIQQDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDgASIDQQNGDQACQAJAAkACQAJAIANFDQAgA0HjAEYNASADQRJHDQILIAJBuAFqIAFBABDVBCACKAK4ASIDQQJGDRFBBUEEIANBAXEbIQQMEAsgAkG4AWogARDdASABIAEoAogBQQFyEKgSIAEQoQsgAS0A4AEhAyABIAJBuAFqEMcFIANFDQEgA0ESRg0BCyABKALYASEPIAJBuAFqIAFBvLicAUEBQQAQwgQgAigCvAEhAyACKAK4AUUNASADIRAMEQsgAkG4AWogAUEBENUEIAIoArgBIgNBAkYNDkEFQQQgA0EBcRshBAwNCyACQbgBaiABIA8gA0EARyIFQQAQ2gIgAigCvAEhEAJAIAIoArgBIhFBgYCAgHhHDQBBCyEEDA8LIA0gDikCADcCACANQRBqIA5BEGooAgA2AgAgDUEIaiAOQQhqKQIANwIAIAIgEDYCiAEgAiARNgKEAQJAIBFBgICAgHhGDQBBCiEEIAIoApwBIRIgAigCmAEhEyACKAKUASEUIAIoApABIRUgAigCjAEhFiAQIRcgESEQDA8LIAEtAJEBQSBxRQ0LIAEoAogBIRggAkHAAmogARDdASABIAEoAogBQQFyEKgSIAEoAtgBIRkCQAJAAkACQAJAAkACQCADDQACQCABLQDgASIEQf8ARg0AAkAgBEGTAUYNACABKALcASEEIAJBzANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkGTAToA2AMgAiACQZgEajYCsAQgAiACQaAEajYCmAQgAiACQdgDajYCoAQgAkGABGogAkGoBGoQ/RogB0EIaiACQcwDakEIaigCADYCACAHIAIpAswDNwIAIBkgBCACQYAEahDgGiEQIAEtAOABQaIBRg0DDAQLIAEQoQsgAkGoBGogARC+ByACKAKsBCEQIAItAKgEIhpBAkYNAyACIBA2AtgDAkAgAS0A4AFFDQAgASgC3AEhBCABKALYASERIAJB9ANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkEAOgCnBCACIAJBmARqNgKwBCACIAJBoARqNgKYBCACIAJBpwRqNgKgBCACQYAEaiACQagEahD9GiAHQQhqIAJB9ANqQQhqKAIANgIAIAcgAikC9AM3AgAgESAEIAJBgARqEOAaIQQgAS0A4AFBogFGDQoMEQsgARChCyACQagEaiABELMDIAIoAqwEIRsgAigCqAQiHEGAgICAeEYNDyACIAIoArAEIhE2AogEIAIgGzYChAQgAiAcNgKABAJAIBFFDQAgGygCACIdQQRGDQsgAiAdNgKoBAJAQSRFDQAgCiAbQQRqQST8CgAACyAbQTBqIQQgEUEobEFYakEobiERAkADQCARRQ0BAkACQAJAAkACQCAEQXhqKAIADgQBAgMAAQsgBEF8ahC0JwwDCyAEEIcrDAILIARBfGoQiCYMAQsgBEF8ahCILAsgEUF/aiERIARBKGohBAwACwsgHCAbEKEtIAEQjCciBEUNBSACQQw2ArgBIAIgBDYCvAECQAJAAkACQCAdDgQBAgMAAQsgChDIJwwVCyAJEKcrDBQLIAoQlyYMEwsgChCfLAwSCyABKALcASEEIAEoAtgBIREgAkGYgICAeDYCqAQgESAEIAJBqARqEOAaIQQgAS0A4AFBogFHDQ4gASABEJosEKcXDA4LIAEQoQsgAkGoBGogARC+ByACKAKsBCEQIAItAKgEIgRBAkYNAiACIBA2AtgDAkAgAS0A4AFFDQAgASgC3AEhBCABKALYASERIAJB3ANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkEAOgCnBCACIAJBmARqNgKwBCACIAJBoARqNgKYBCACIAJBpwRqNgKgBCACQYAEaiACQagEahD9GiAHQQhqIAJB3ANqQQhqKAIANgIAIAcgAikC3AM3AgAgESAEIAJBgARqEOAaIQQgAS0A4AFBogFHDQ0gASABEJosEKcXDA0LIAEQoQsCQCABLQDgAUEBRg0AIAEoAtwBIQQgASgC2AEhESACQegDaiABENQmIAJBATYCrAQgAkGcv5wBNgKoBCACQgE3ArQEIAJBswc2ApwEIAJBAToApwQgAiACQZgEajYCsAQgAiACQaAEajYCmAQgAiACQacEajYCoAQgAkGABGogAkGoBGoQ/RogB0EIaiACQegDakEIaigCADYCACAHIAIpAugDNwIAIBEgBCACQYAEahDgGiEEIAEtAOABQaIBRw0MIAEgARCaLBCnFwwMCyABEKELIAJBIGogARCaGSACKAIkIREgAigCIEEBcQ0KIAIgETYCqAQgARCMJyIbRQ0EIAJBDDYCuAEgAiAbNgK8ASACQagEahCmKwwQCyABKALcASEEIAJBj4CAgHg2AqgEIBkgBCACQagEahDgGiEQIAEtAOABQaIBRw0BCyABIAEQmiwQpxcLIAJBDDYCuAEgAiAQNgK8AQwOCyABKALUASEEAkBBKEUNACACQbgBaiACQagEakEo/AoAAAsgAiAaOgDsASACIBA2AugBIAIgBDYC5AEgAiAZNgLgAQJAIAIoArgBIgRBdWoOAgMOAAsgAigCyAEhFSACKALEASEWIAIoAsABIRcgAigCvAEhEAwBCyACIAQ6AMwBIAIgETYCyAEgAiAZNgLAASACIBA2ArwBQQchBCACQQc2ArgBIAIgASgC1AEiFjYCxAEgESEVIBkhFwsgAkGgAWpBCGoiAyAIQQhqKQMANwMAIAIgAi8B3gE7AbYBIAIgCCkDADcDoAEgAi0A3QEhHiACLQDcASEfIAIoAtgBISAgAigC1AEhEiACKALQASETIAIoAswBIRQgASABKAKIAUF+cSAYQQFxchCoEiACQcACahCWJiACQdgAakEIaiADKQMA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IAEoAgQgASgCCBCKFCACQdwCaiADKQMANwIAIAJB5AJqIAJBoAJqKQMANwIAIAJBIDYCrAIgAiACKQOQAjcC1AJBwABFDRsgACACQawCakHAAPwKAAAMGwsgAkEoaiABEK0JIAJBNGogAkEYakEIaigCADYCACAAQqKAgICggICAgH83AgAgAEEYaiACQShqQRBqKQIANwIAIABBIGogAkEoakEYaikCADcCACACIAIpAxg3AiwgACACKQIoNwIIIABBEGogAkEoakEIaikCADcCAAwaCyACQQA2AqwCIAJBFGpBpMOEASACQawCakGow4QBELchAAsgBEGlf2pBBEkNACAEQYV/akEESQ0AAkAgBEH/AEsNACAEQVBqQQpJDQAgBEG/f2pBGkkNACAEQZ9/akEaSQ0AIARB/QBxQTxHDQMLIARBRGoOBw8EEAQECw4BCyAAIAIpA/gBNwIMIABBAToAJCAAIAQ2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwXCwJAIARBjn9qDgkIAwYDCQMDAwsACyAEQZ9/ag4GAwsCAgIEAQsgACACKQP4ATcCDCAAQQI6ACQgACAENgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMFQsgBEHuAEYNBAsgAkHIAmogASgCBCABKAIIEIoUIAJB3AJqIAJBgAJqKQMANwIAIAJB5AJqIAJBiAJqKQMANwIAIAJBCzYCrAIgAiACKQP4ATcC1AJBwABFDRMgACACQawCakHAAPwKAAAMEwsgACACKQP4ATcCDCAAQQY7ASQgAEEHNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMEgsgACACKQP4ATcCDCAAQYYCOwEkIABBDDYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADBELIAAgAikD+AE3AgwgAEGGBDsBJCAAQQk2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwQCyAAIAIpA/gBNwIMIABBhgY7ASQgAEEKNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMDwsgACACKQP4ATcCDCAAQYYIOwEkIABBDTYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADA4LIAAgAikD+AE3AgwgAEGGCjsBJCAAQQs2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwNCyAAIAIpA/gBNwIIIABBAjoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJBgAJqKQMANwIADAwLIAAgAikD+AE3AgggAEEDOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJB+AFqQRBqKQMANwIAIABBEGogAkGAAmopAwA3AgAMCwsgAkGQAmpBEGoiByACQfgBakEQaikDADcDACACQZACakEIaiIIIAJB+AFqQQhqKQMANwMAIAIgAikD+AE3A5ACQQQhBiAFKAIAIAEoAggiBEYNCSABEPsPQfsARw0JIAIgARD7DyIJNgLsAiAJQfsARw0EIAJB8AJqQQhqIAVBCGoiCSgCADYCACACIAUpAgA3A/ACIAEQ1CQNAyACQbQBaiAJKAIANgIAIAJBoAFqQQhqIgMgAkEYakEIaigCADYCACACIAIpAxg3A6ABIAIgBSkCADcCrAEgAkHIAmogASgCBCAEEIoUIAJB3AJqIAMpAwA3AgAgAkHkAmogAkGwAWopAwA3AgBBHiEDIAJBHjYCrAIgAiACKQOgATcC1AIgAi0AsAIhAQwHCyAAIAIpA/gBNwIIIABBBToAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJBgAJqKQMANwIADAkLIAAgAikD+AE3AgggAEEIOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJB+AFqQRBqKQMANwIAIABBEGogAkH4AWpBCGopAwA3AgAMCAsgACACKQP4ATcCCCAAQQk6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkH4AWpBEGopAwA3AgAgAEEQaiACQYACaikDADcCAAwHCyACQYADakEIaiAJKAIANgIAIAIgBSkCADcDgAMCQCABEPsPIglBLUYNACAJQd///wBxQb9/akEaSQ0AIAUgAikD8AI3AgAgBUEIaiACQfACakEIaigCADYCAAwGCyACQQhqIANBwABqQbjDhAEQ7CMgAigCDCEKIAIoAggiCUEANgIIA0ACQAJAAkACQCAFKAIAIARGDQAgARD7DyIDQS1GDQMgA0Hf//8AcUG/f2pBGkkNAyAFKAIAIARGDQAgARD7D0H9AEYNAQsgAkG0AWogBUEIaigCADYCACACQaABakEIaiIDIAJB8AJqQQhqKAIANgIAIAIgAikD8AI3A6ABIAIgBSkCADcCrAEgAkGsAmpBHGogASgCBCAEEIoUIAJB3AJqIAMpAwA3AgAgAkHkAmogAkGwAWopAwA3AgAgAkEcNgKsAiACIAIpA6ABNwLUAgwBCyACQZADakEIaiAFQQhqKAIANgIAIAIgBSkCADcDkAMgARCNCxoCQCAJKAIEIgsgCSgCCCIJQdXPhAFBBRDrJUUNAEEGIQMMBQsCQCALIAlB2s+EAUEDEOslRQ0AQQchAwwFC0EKIQMgCyAJQcjDhAFBChDrJQ0EAkAgCyAJQdLDhAFBCBDrJUUNAEELIQMMBQsgAkGgAWpBCGoiAyACQYADakEIaigCADYCACACQbQBaiACQZADakEIaigCADYCACACIAIpA4ADNwOgASACIAIpA5ADNwKsASACQcgCaiABKAIEIAQQihQgAkHcAmogAykDADcCACACQeQCaiACQbABaikDADcCACACQR02AqwCIAIgAikDoAE3AtQCCyAKIAooAgBBAWo2AgAMBAsgCSABEPsPEMAXIAEQ1CQaDAALCyACQQA2AqABIAJB7AJqQcyGmQEgAkGgAWpB3MOEARC3IQALIAJBIjYCrAIgAiADOgCwAiAKIAooAgBBAWo2AgALIAItALACIQEgAigCrAIiA0EiRg0BCwJAQTtFDQAgAEEFaiACQawCakEFakE7/AoAAAsgACABOgAEIAAgAzYCAAwCCyABQf8BcUEMRg0AIAJBpAJqIAVBCGooAgA2AgAgAiAFKQIANwKcAiABIQYLIAAgAikDkAI3AgggACAGOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAcpAwA3AgAgAEEQaiAIKQMANwIACyACQaADaiQAC/weARN/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GyEGIAFByABqIQogAigCCCEPIAFBCGohCyABQQRqIRUgAUEgaiEQIAFBHGohEQNAQQAhDCAEIAVGDQYCQAJAIAQgBkYNACAKIA8gBGotAAAiAmohDiAJIQcDQAJAAkACQCAVKAIAIAsoAgAgB0HkkYQBEL8lKAIEIglFDQAgESgCACAQKAIAIAkgDi0AAGpB9JGEARC+JSgCACEJDAELIANBwABqIAEgBxCuJiADIAMpA0A3AtABA0AgA0HcAWogA0HQAWoQvxMgAy0A3AFBAUcNAiACIAMtAN0BIglLDQALIAIgCUcNASADKADeASEJCyAJQQFHDQMLIBUoAgAgCygCACAHQay4gAEQvyUoAgwhBwwACwsgBiAIQayfgAEQkRUACwJAIAkgASgC0AJLDQAgCUUNByAJIAEoAtQCSw0AIANBOGogASAJEK8mIAMgAykDODcC3AEgA0EwaiADQdwBakEAEJQWAkAgAygCMEEBcUUNACADKAI0IQIgA0HcAWogAiAEQQFqIgkgAUE0aigCACABQThqKAIAIAJBlL6DARC+JSgCAGsgCRDdFwwHC0GkvoMBENIsAAsgBEEBaiEEDAALC0GkvoMBENIsAAtBpL6DARDSLAALIAwgDUGsn4ABEJEVAAtBpL6DARDSLAALIAAgAykC3AE3AgQgAEEMaiADQeQBaigCADYCAEEBIQwLIAAgDDYCAAwFCwJAAkACQAJAIAEoAtgCIglFDQAgCSABKALUAksNACADQaABaiABIAkQryYgAyADKQOgATcC3AEgA0GYAWogA0HcAWpBABCUFiADKAKYAUEBcUUNASADKAKcASECIANB0AFqIAIgBCABQTRqKAIAIAFBOGooAgAgAkGUvoMBEL4lKAIAayAEEN0XIABBATYCACAAQQxqIANB2AFqKAIANgIAIAAgAykC0AE3AgQMCAsgA0HcAWogByABQcAAaiIPKAIAIgsoAghBf2pBeHFqQQhqIAIoAggiBiACKAIMIgwgBCAFIAsoAhAREgACQCADKALcASICDgMDAgADCyABQcgAaiEKIAMoAuABIQIgAUEIaiELIAFBBGohFSABQSBqIRAgAUEcaiERA0ACQCACIgQgBUkNACAAQQA2AgAMCQsCQAJAIAQgDE8NACAKIAYgBGotAAAiAmohDiAJIQcDQAJAAkACQCAVKAIAIAsoAgAgB0HkkYQBEL8lKAIEIglFDQAgESgCACAQKAIAIAkgDi0AAGpB9JGEARC+JSgCACEJDAELIANBkAFqIAEgBxCuJiADIAMpA5ABNwL0AQNAIANB3AFqIANB9AFqEL8TIAMtANwBQQFHDQIgAiADLQDdASIJSw0ACyACIAlHDQEgAygA3gEhCQsgCUEBRw0DCyAVKAIAIAsoAgAgB0GsuIABEL8lKAIMIQcMAAsLIAQgDEGsn4ABEJEVAAsCQCAJIAEoAtACSw0AAkAgCUUNAAJAAkAgCSABKALUAksNACADQYgBaiABIAkQryYgAyADKQOIATcC3AEgA0GAAWogA0HcAWpBABCUFiADKAKAAUEBcQ0BQaS+gwEQ0iwACyADQdwBaiABKAI8IA8oAgAiAigCCEF/akF4cWpBCGogBiAMIAQgBSACKAIQERIAAkAgAygC3AFFDQAgAygC4AEiAiAESw0EDAMLIABBADYCAAwLCyADKAKEASECIANB0AFqIAIgBEEBaiIJIAFBNGooAgAgAUE4aigCACACQZS+gwEQviUoAgBrIAkQ3RcgAEEBNgIAIABBDGogA0HYAWooAgA2AgAgACADKQLQATcCBAwKCyAAQQA2AgAMCQsgBEEBaiECDAALC0GkvoMBENIsAAsgACADKQLgATcCBCAAQQxqIANB3AFqQQxqKAIANgIACyAAIAI2AgAMBAsgACADKQLgATcCBCAAQQxqIANB3AFqQQxqKAIANgIACyAAIAI2AgAMAgsgAUHIAGohDyADKALgASECIAFBCGohCyABQQRqIRUgAUE4aiEUIAFBNGohDSABQSBqIRAgAUEcaiERAkADQAJAAkACQCACIgQgBU8NAAJAAkAgBCAMTw0AIA8gBiAEai0AACICaiEOIAkhBwNAAkACQAJAIBUoAgAgCygCACAHQeSRhAEQvyUoAgQiCUUNACARKAIAIBAoAgAgCSAOLQAAakH0kYQBEL4lKAIAIQkMAQsgA0G4AWogASAHEK4mIAMgAykDuAE3AvQBA0AgA0HcAWogA0H0AWoQvxMgAy0A3AFBAUcNAiACIAMtAN0BIglLDQALIAIgCUcNASADKADeASEJCyAJQQFHDQMLIBUoAgAgCygCACAHQay4gAEQvyUoAgwhBwwACwsgBCAMQayfgAEQkRUACwJAIAkgASgC0AJLDQAgCUUNBQJAIAkgASgC1AJLDQAgA0GwAWogASAJEK8mIAMgAykDsAE3AtwBIANBqAFqIANB3AFqQQAQlBYgAygCqAFBAXENBEGkvoMBENIsAAsgA0HcAWogASgCPCAKKAIAIgIoAghBf2pBeHFqQQhqIAYgDCAEIAUgAigCEBESACADKALcAUUNAiADKALgASICIARLDQQLIARBAWohAgwDCyAAIAMpAtABNwIEIAAgCDYCACAAQQxqIANB2AFqKAIANgIADAULIABBADYCAAwECyADKAKsASEHQQEhCCADQdABaiAHIARBAWoiAiANKAIAIBQoAgAgB0GUvoMBEL4lKAIAayACEN0XDAALCyAAIAMpAtABNwIEIAAgCDYCACAAQQxqIANB2AFqKAIANgIADAELIAAgCjYCACAAIAspAgA3AgQgAEEMaiALQQhqKAIANgIACyADQYACaiQAC6AjAgN/AX4jAEHQAGsiAyQAIAMgAjYCGEHdq5wBIQRBASEFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFB/wFxDqQBqAEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0MDQ4eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5OjuUAZUBlgGXAZgBmQGZAZkBmQGaAZsBnAE8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7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DgsgAkUNCSACKAIAQQJHDQkgAyACQQhqNgI0IANBAjYCPCADQZyhmgE2AjggA0IBNwJEIANB2AStQiCGIANBNGqthDcDICADIANBIGo2AkAgACADQThqEKAODA4LIAJFDQkgAigCAEEERw0JIAMgAkEQajYCNCADQQI2AjwgA0HIoZoBNgI4IANCATcCRCADQdgErUIghiADQTRqrYQ3AyAgAyADQSBqNgJAIAAgA0E4ahCgDgwNCyACRQ0JIAIoAgBBAkcNCSADQRBqIAJBCGoQ8RUgAygCFCEFIAMoAhAhBAwLCyACRQ0JIAIoAgBBCEcNCSADIAJBBGo2AjQgA0ECNgI8IANBmKKaATYCOCADQgE3AkQgA0HyA61CIIYgA0E0aq2ENwMgIAMgA0EgajYCQCAAIANBOGoQoA4MCwsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBlJ+aARDpIwALIANBATYCTCADQfyemgE2AkggA0EBNgI8IANBhKGbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQdCfmgEQ6SMACyADQQE2AkwgA0H8npoBNgJIIANBATYCPCADQYShmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGIoJoBEOkjAAsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBwKCaARDpIwALIANBATYCTCADQfyemgE2AkggA0EBNgI8IANBhKGbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQfCgmgEQ6SMACyADQQE2AkwgA0H8npoBNgJIIANBATYCPCADQYShmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGAoZoBEOkjAAsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJA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ASkDCCIxQgODQgBSDQAgMaciBiAGKAIAIgZBAWo2AgAgBkF/TA0GCwJAIAEpAxAiMkIDg0IAUg0AIDKnIgEgASgCACIBQQFqNgIAIAFBf0wNBgsgACAENgIcIAAgBTYCGCAAIDI3AxAgACAxNwMIDAQLQQEhBCABKAIIIQUgASgCFCEGIAEoAhAhBwJAAkAgASgCBCIIQQFHDQAQ+ichASACQSBqIAUQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMADAELIAEoAgwhCSAFIQEgCCEECyAAIAY2AhQgACAHNgIQIAAgCTYCDCAAIAE2AgggACAENgIEDAMLIAEpAwghMSABKAIEIQQQ+ichASACQSBqIAQQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMAIAAgMTcDCCAAIAE2AgQMAgsQ/ychBiABKAIEIgooAgQhCyAKKAIAIQwCQAJAAkACQCAKLQBsQX1qIgFBASABQf8BcUEDSRtB/wFxDgMAAQIACyAKKAJQIQ0gCigCTCEOIAooAkghDwJAIAopA0AiM0IDg0IAUg0AIDOnIgEgASgCACIBQQFqNgIAIAFBf0wNBgsgCi0AVCEQQQMhEUEAIRIMAgsgCigCVCEQIAooAlAhDSACQSBqIApB2ABqEKkIIAooAkwhDiAKKAJIIQ8CQCAKKQNAIjNCA4NCAFINACAzpyIBIAEoAgAiAUEBajYCACABQX9MDQULIAJBEmogAkE3ai0AADoAACACIAIvADU7ARAgEEEIdiESIAItADQhESACKAIwIRMgAigCLCEUIAIoAighFSACKAIkIRYgAigCICEXDAELIAooAkwhDiAKKAJIIQ8gCigCZCEUIAooAmAhFQJAIAop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gICAeDYCAAygAQsgA0GbgICAeDYCAAyfAQsgA0GcgICAeDYCAAyeAQsCQCABKQMQIgZCA4NCAFINACAGpyIBIAEoAgAiAUEBajYCACABQX9MDZ8BCyAAQZ2AgIB4NgIIIAAgBjcDEAydAQsgA0GegICAeDYCAAycAQsgA0GfgICAeDYCAAybAQsgA0GggICAeDYCAAyaAQsgAyAEKQMANwMAIANBEGogBEEQaikDADcDACADQQhqIARBCGopAwA3AwAMmQELIANBooCAgHg2AgAMmAELIANBo4CAgHg2AgAMlwELIAMgBCkDADcDACADQRBqIARBEGopAwA3AwAgA0EIaiAEQQhqKQMANwMADJYBCyADQaWAgIB4NgIADJUBCyADQaaAgIB4NgIADJQBCwJAIAEpAxAiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNlQELIABBp4CAgHg2AgggACAGNwMQDJMBCyADQaiAgIB4NgIADJIBCyADQamAgIB4NgIADJEBCyADQaqAgIB4NgIADJABCyADQauAgIB4NgIADI8BCyACQRRqIAEoAhAgASgCFBCvFyAAQayAgIB4NgIIIAAgAikCFDcCDCAAQRRqIAJBFGpBCGooAgA2AgAgACABKQMYNwMYDI4BCyADQa2AgIB4NgIADI0BCyADQa6AgIB4NgIADIwBCyADQa+AgIB4NgIADIsBCyACQRRqIAEoAhAgASgCFBCvFyAAQbCAgIB4NgIIIAAgAikCFDcCDCAAQRRqIAJBFGpBCGooAgA2AgAgACABKQMYNwMYDIoBCyACQRRqIAEoAhAgASgCFBCkFyAAQbGAgIB4NgIIIABBFGogAkEUakEIaigCADYCACAAIAIpAhQ3AgwMiQELIANBsoCAgHg2AgAMiAELIANBs4CAgHg2AgAMhwELIAJBCGogASgCDCABKAIQEK8XIAJBFGogASgCGCABKAIcEK8XIANBCGogAkEIakEIaigCADYCACADIAIpAgg3AgAgACACKQIUNwIUIABBHGogAkEUakEIaigCADYCAAyGAQsgAEG1gICAeDYCCCAAIAEpAgw3AgwMhQELIANBtoCAgHg2AgAMhAELIANBt4CAgHg2AgAMgwELIANBuICAgHg2AgAMggELIABBuYCAgHg2AgggACABKQIMNwIM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ASACIAJBnAJqNgK0ASACIAJBlAFqNgKcAiACQcABaiACQegBahCWECACQdQBaiACQYwBaigCADYCACACIAIpAoQBNwLMASAEIAMgAkHAAWoQ4BohAyABLQDgAUGiAUYNAgwPCyABEKELIAIgEjYCkAEgAkEwaiABEIQTIAIoAjQhAwJAAkAgAigCMEEBcUUNACAAQQI2AgwgACADNgIADAELIAIgAzYClAECQAJAIAEtAOABQQlGDQAgASgC3AEhAyABKALYASEEIAJBmAFqIAEQ1CYgAkEBNgLsASACQZy/nAE2AugBIAJCATcC9AEgAkGzBzYCuAEgAkEJOgCnASACIAJBtAFqNgLwASACIAJBnAJqNgK0ASACIAJBpwFqNgKcAiACQcABaiACQegBahCWECACQdQBaiACQaABaigCADYCACACIAIpApgBNwLMASAEIAMgAkHAAWoQ4BohFSABLQDgAUGiAUcNASABIAEQmiwQpxcMAQsgARChCwJAAkAgASgCiAEiFUGAgAJxDQAgASAVQYCAAnI2AogBIAJBIGogARC5EyACKAIgIRQgASABKAKIAUH//31xNgKIASACKAIkIRUMAQsgAkEoaiABELkTIAIoAiwhFSACKAIoIRQLIBRBAXFFDQQLIABBAjYCDCAAIBU2AgAgAkGUAWoQsSwLIAJBkAFqELEsDA8LIAEQoQsCQCAVRQ0AIAEoAtQBIQMgASgC0AEhFyACQf6AgIB4NgLoASABIBcgAyACQegBahDeIwsCQCASKAIAQRpHDQBBASEVDAQLIAJBOGogEhDJAyACKAI8IQMCQAJAIBVBAXENACACKAI4IQQMAQsgFCADIBQgA0kbIQQgFCADIBQgA0sbIQMLIAJB5oCAgHg2AugBIAQgAyACQegBahDgGiEDIAEtAOABQaIBRw0NCyABIAEQmiwQpxcMDAsgAkEYaiAVEMkDIAIgDzYC9AEgAiAVNgLwASACIAM2AuwBIAIgEjYC6AEgAiACKAIcNgL4ASACIAJB6AFqEIIeIhI2AoABIAJBADYCdCABLQDgASEDCyABLQCRAUEgcUUNASADQf8BcUEJRw0BQQAhFQsgAkHoAWogAUEAIBIQaiACKALsASESIAIoAugBIgNBB0cNASAAQQI2AgwgACASNgIADAoLIBBBAXENAQwDCyAEIAopAwA3AwAgBEEYaiAKQRhqKQMANwMAIARBEGogCkEQaikDADcDACAEQQhqIApBCGopAwA3AwAgAiASNgLEASACIAM2AsABIBVFDQECQCADDQAgAkEBOgDcAQwCC0GgppwBQShB9P6bARDSHgALIAEoAtQBIQMgAkGogYCAeDYC6AEgASAPIAMgAkHoAWoQ3iMMAQsCQAJAAkACQAJAAkACQAJAIAIoAnRFDQAgASgC1AEhEiACKQJ4IRlBKEEIEL0qIQMCQEEoRQ0AIAMgAkHAAWpBKPwKAAALIAJBADYC2AEgAiAZNwPQASACIBI2AswBIAIgETYCyAEgAiADNgLEASACQQI2AsABDAELIAghFSAGIRICQAJAIAMOBwQBAgEFBQAECyACIAk2ApwCIAJBAjYC7AEgAkHU/psBNgLoASACQgE3AvQBIAJB0wI2ArgBIAIgAkG0AWo2AvABIAIgAkGcAmo2ArQBIAJB6AFqQeT+mwEQ6SMACyAIIRUMAQsgBCEVCyAHIRILIAJBEGogARCaGSACKAIUIQMgAigCEEEBcQ0BAkAgA0UNACAVIBE2AgAgFSABKALUATYCBAsgEhC7KyASIAM2AgALIAEtAOABQRdHDQIgARChCyACQQhqIAEQwhggAigCDCEDIAIoAghBAXFFDQELIABBAjYCDCAAIAM2AgAgAkHAAWoQ6hUMCAsgASgC1AEhFUEoQQgQvSohEgJAQShFDQAgEiACQcABakEo/AoAAAsgAiAVNgLQASACIBE2AswBIAIgAzYCyAEgAiASNgLEASACQQQ2AsABCwJAIBBBAXFFDQAgASgC1AEhAyACQaiBgIB4NgLoASABIA8gAyACQegBahDeIwsgAkHoAGogAkHAAWpB5P2bARD2HgwBCyALIAIpAnQ3AgAgC0EIaiACQfQAakEIaikCADcCACACQQc2AugBIAJB6ABqIAJB6AFqQdT9mwEQ9h4LAkAgAS0A4AEiA0EbRw0AIAEQoQsCQAJAIAIoAnAiFUUNAEEEIRICQAJAAkACQCACKAJsIgMoAgAiFEF6ag4CAgEACyAURQ0CDAQLQRAhEgsgAyASaigCACgCAEEaRw0CCyACQcABaiADIBUQ2AogAkEANgLoASACQbQBaiABIAJBwAFqIAJB6AFqEMUCIAIoArgBIQMCQCACKAK0ASISQYCAgIB4Rw0AIABBAjYCDCAAIAM2AgAMCAsgAiACKAK8ASIVNgKwASACIAM2AqwBIAIgEjYCqAEgAiABQQAgAyAVEPUfEJsKIAIoAgQhEgJAIAIoAgBBAXFFDQAgAEECNgIMIAAgEjYCACACQagBahC2KAwICyABKALUASEVIAJB6AFqEJ8bIAIpAoACIRkgAigCiAIhFEHAAEEIEL0qIgNBHjYCACADQQA6ACkgAyAOOgAoIAMgFDYCJCADIBk3AhwgAyAVNgIYIAMgDzYCFCADIBI2AhAgAyACKQKoATcCBCADQQxqIAJBqAFqQQhqKAIANgIAIAIgAzYC0AEgAkIHNwPAASACQegAaiACQcABakGE/psBEPYeIAJB6AFqELYoIAUQ4yMMAQtBAEEAQfT9mwEQkRUACyABLQDgASEDCyADQf8BcSISQQFGDQACQCASQQdGDQAgASgC3AEhAyABKALYASEEIAJBkAJqIAEQ1CYgAkEBNgLsASACQZy/nAE2AugBIAJCATcC9AEgAkGzBzYCuAEgAkEHOgCUASACIAJBtAFqNgLwASACIAJBnAJqNgK0ASACIAJBlAFqNgKcAiACQcABaiACQegBahCWECACQdQBaiACQZgCaigCADYCACACIAIpApACNwLMASAEIAMgAkHAAWoQ4BohAyABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgARChC0EBIA0gAS0A4AEiA0EBRiISGyENIAEpA9ABIBggEhshGAwACwsgASABEJosEKcXDAMLIABBAjYCDCAAIAM2AgAMAQsgAEECNgIMIAAgAzYCACAMELEsCyACQegAahDPKAwBCyAAQQI2AgwgACADNgIACyACQaACaiQAC4sbAh9/AX4jAEHgAGsiAiQAIAJBADYCUEEBIQMgAkEBNgJEIAJBoKCAATYCQCACQgQ3AkgCQAJAIAEoAgAiBCABKAIEIgUgAkHAAGoQlSkNACAAQShqIQYgACgCKCIHQQJqIQggACgCwAIhCSAAKAK8AiEKIAAoArgCIQsgACgCCCEMIAAoAgQhDUEAIQ4CQAJAAkACQANAIAJBGGogDiANIAxBqKCAARCyIgJAAkACQCACKAIcIg9FDQAgAigCGCEQAkACQAJAAkAgDg0AIBAoAgAiAUH/AXEhEUEAIRIMAQsgECgCACIBQf8BcSERQQAhEiAOIAtNDQELQQAhEwwBCwJAAkAgEUH/AUYNACARIBFBAnZqIAFBA3FBAEdqQQJqIhQgD0kNASAUIA9B3LWDARCRFQALIAghFCAIIA9PDQsLQQEhEiAQIBRBAnRqKAIAIhRBASAUQX9KGyETCwJAAkACQAJAAkACQAJAAkAgAUH/AXFBgn5qDgIABAELIA9Bf2oOAgECBAsCQCAPQQFGDQAgECgCBCEUIAJBCGpBAiAQIA9BsKWAARCyIiARQQJ2IAFBA3FBAEdqIhUgAigCDCIBSw0NIAIoAgghFiACIBVBAmogECAPQdClgAEQsiIgESACKAIEIgFLDQwgAigCACEXQQAhGAwGC0EBQQFBoKWAARCRFQALQQFBAUHwpYABEJEVAAtBAkECQYCmgAEQkRUACwJAIA9BAUYNACAQKAIEIRQgAkEQakECIBAgD0GgpoABELIiIAcgAigCFCIBSw0IIAIoAhAhFkECIRggByEVDAILQQFBAUGQpoABEJEVAAsgAUEIdiEZIBAoAgghFiAQKAIEIRRBASEYCwsCQCAORQ0AIA4gCkYgDiAJRnIhAQJAIA4gC00NACABDQMgAkEANgJQQQEhAyACQQE2AkQgAkHMn4ABNgJAIAJCBDcCSCAEIAUgAkHAAGoQlSlFDQQMCgsCQCABDQAgAkEANgJQQQEhAyACQQE2AkQgAkHgn4ABNgJAIAJCBDcCSCAEIAUgAkHAAGoQlSlFDQQMCgsgAkEANgJQQQEhAyACQQE2AkQgAkHsn4ABNgJAIAJCBDcCSCAEIAUgAkHAAGoQlSlFDQMMCQsgAkEANgJQQQEhAyACQQE2AkQgAkH0n4ABNgJAIAJCBDcCSCAEIAUgAkHAAGoQlSlFDQIMCAsgAkECNgJEIAJB3KGAATYCQCACQgE3AkwgAkE6NgIsIAIgAEHEAmo2AiggAiACQShqNgJIQQEhAyAEIAUgAkHAAGoQlSkNByACQQI2AkQgAkH4oYABNgJAIAJCATcCTCACQSA2AiwgAiAAKAIcIgFBAEc6AFwgAiACQShqNgJIIAIgAkHcAGo2AiggBCAFIAJBwABqEJUpDQcgAkECNgJEIAJByK6DATYCQCACQgE3AkwgAkEhNgIsIAIgAEEYajYCKCACIAJBKGo2AkggBCAFIAJBwABqEJUpDQcgAkECNgJEIAJB6K6DATYCQCACQgE3AkwgAkEhNgIsIAIgACgCFCIUNgJcIAIgAkEoajYCSCACIAJB3ABqNgIoIAQgBSACQcAAahCVKQ0HIAJBAjYCRCACQaSigAE2AkAgAkIBNwJMIAJBITYCLCACIABBrAJqNgIoIAIgAkEoajYCSCAEIAUgAkHAAGoQlSkNByACQQI2AkQgAkHMooABNgJAIAJCATcCTCACQSE2AiwgAiAAQbACajYCKCACIAJBKGo2AkggBCAFIAJBwABqEJUpDQcgAkECNgJEIAJB8KKAATYCQCACQgE3AkwgAkEhNgIsIAIgBjYCKCACIAJBKGo2AkggBCAFIAJBwABqEJUpDQcgAkECNgJEIAJBkKOAATYCQCACQgE3AkwgAkE5NgIsIAIgAEEsajYCKCACIAJBKGo2AkggBCAFIAJBwABqEJUpDQcgAkGwo4ABNgJAIAJCATcCTCACQSE2AiwgACgCJCEaIAJBAjYCRCACIBpBACABGyAUIAxqQQJ0ajYCXCACIAJBKGo2AkggAiACQdwAajYCKCAEIAUgAkHAAGoQlSkNByACQQA2AlAgAkEBNgJEIAJB+K6DATYCQCACQgQ3AkggBCAFIAJBwABqEJUpIQMMBwsgAkEANgJQQQEhAyACQQE2AkQgAkHYn4ABNgJAIAJCBDcCSCAEIAUgAkHAAGoQlSkNBgsgAiAONgIkIAJBAjYCVCACQdCggAE2AlAgAkEDNgJEIAJBuKCAATYCQCACQQI2AkwgAkELNgI0IAJBCzYCLCACIBQ2AlwgAiACQShqNgJIIAIgAkHcAGo2AjAgAiACQSRqNgIoIAQgBSACQcAAahCVKQ0EQQAhGkEAIRtBACEcQQAhAUEAIR0DQCAaIRQgGyEeICAhHwJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAYDgMCAAECC0EBIQMgGSEbIBYhGiABRQ0FDAILIAEgFU8NASAWIRogASEbDAMLIAEgEUkNAQsCQCAdQQFxRQ0AQQAhHSAUIRogHiEbIB8hIAwECyACQQA2AlBBASEDIAJBATYCRCACQcTAgAE2AkAgAkIENwJIIAQgBSACQcAAahCVKQ0RAkACQCAORQ0AIA4gC0sNASACQQA2AlBBASEDIAJBATYCRCACQZShgAE2AkAgAkIENwJIIAQgBSACQcAAahCVKQ0TQQAhAQJAA0ACQAJAAkAgEyABRg0AIAIgATYCKCAIIRQCQCAQLQAAIhpB/wFGDQAgGiAaQQJ2aiAaQQNxQQBHakECaiEUCyAUIA9PDQQCQAJAIBAgFEECdGooAgAiGkF/TA0AIBQgAWpBAWoiFCAPSQ0BIBQgD0GstYMBEJEVAAsgAUUNAiACQQA2AkBBAEH485gBIAJBKGogAkHAAGpBvLWDARCVIQALIBAgFEECdGooAgAhFCABRQ0CIAJBADYCUEEBIQMgAkEBNgJEIAJBnLKAATYCQCACQgQ3AkggBCAFIAJBwABqEJUpRQ0CDBgLIAJBADYCUEEBIQMgAkEBNgJEIAJBxMCAATYCQCACQgQ3AkggBCAFIAJBwABqEJUpRQ0FDBcLIBpB/////wdxIRQLQQEhAyACQQE2AkQgAkGcv5wBNgJAIAJCATcCTCACQQs2AiwgAiAUNgJcIAFBAWohASACIAJBKGo2AkggAiACQdwAajYCKCAEIAUgAkHAAGoQlSlFDQAMFQsLIBQgD0GctYMBEJEVAAtBASEDIAJBATYCVCACQcyvgwE2AlAgAkECNgJEIAJBoKGAATYCQCACQQE2AkwgAkELNgIsIAJBATYCXCACIAJBKGo2AkggAiACQdwAajYCKCAEIAUgAkHAAGoQlSkNEgtBAiEbIAchGgJAAkACQCAQLQAAIgFBgn5qDgIBAgALIAFBAnYgAUEDcUEAR2pBAmohGyABIRoMAQtBASEaC0EAIRQCQAJAAkACQCASRQ0AAkACQAJAIAFB/wFGDQAgASABQQJ2aiABQQNxQQBHakECaiIBIA9JDQEgASAPQdy1gwEQkRUACyAIIA9PDQNBASEUIBAgCEECdGooAgAiAUEASA0CIAFBAUcNAQwCC0EBIRQgECABQQJ0aigCACIBQQBIDQEgAUEBRg0BCyABQQFqIRQLIA4gGyAaaiAUamoiASAOSQ0BIAJBwABqIAEQpCMgAigCQEEBRg0CIAIoAkQhDgwPCyAIIA9B7LWDARCRFQALQbChgAEQ0iwACyACIAIpA0g3AyhBxIicAUErIAJBKGpB/J+AAUHAoYABEOoSAAsgAUECdiIaIBVPDQYgAiAWIBpBAnRqKAIANgJAIAJBwABqIAFBA3FyLQAAIRsgFyEaCyABQQFqIQMgGiABQQJ0aigCACEaCyAdQQFxRQ0BIBQgGkYNAkEBIR0gGyEgIAMhAQsgFEEBRg0HIBwNAgwGCyAarUIghiAbrUL/AYMiIUIIhoQgIYQhIQwDCyAUrUIghiAbrUL/AYNCCIaEIB+tQv8Bg4QhIQwCCyACQQA2AlBBASEDIAJBATYCRCACQZyygAE2AkAgAkIENwJIIAQgBSACQcAAahCVKUUNAwwKCyAaIBVBjKmAARCRFQALICFCIIinIRQgIUIIiKchHiAhpyEfQQEhHSADIQEMAAsLIBxBAWohHAJAIB9B/wFxIB5B/wFxRg0AIAIgHzoAWyACIB46ACQgAkEDNgIsIAJB/NeDATYCKCACQgM3AjQgAkEhNgJUIAJBIjYCTCACQSI2AkQgAiAUNgJcIAIgAkHAAGo2AjAgAiACQdwAajYCUCACIAJBJGo2AkggAiACQdsAajYCQCAEIAUgAkEoahCVKQ0GDAELIAIgHjoAJCACQQI2AkQgAkHQ1oMBNgJAIAJCAjcCTCACQSE2AjQgAkEiNgIsIAIgFDYCXCACIAJBKGo2AkggAiACQdwAajYCMCACIAJBJGo2AiggBCAFIAJBwABqEJUpDQUMAAsLCyAHIAFBsKaAARDhLAALIBEgAUHgpYABEOEsAAsgFSABQcClgAEQ4SwAC0EBIQMLIAJB4ABqJAAgAw8LIAggD0HstYMBEJEVAAufGwIIfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgFBdGoiAkEHIAJBJkkbQX9qDiQAAQIDBAUGBwgJCgsMDQ4PEBESEyIUFRYXIhgZGhscHR4fICEiCyAAKAIIIQMCQCAAKAIMIgFFDQAgAyECA0ACQCACKAIAQQJGDQAgAkEMaigCACIEEJIBIARBwABBCBCzFgsgAkEQaiECIAFBf2oiAQ0ACwsgACgCBCADEJstDwsgACgCCCEDAkAgACgCDCIERQ0AIAMhAgNAAkACQCACKAIAIgFFDQAgARCSASABQcAAQQgQsxYMAQsgAkEEaigCACIBEMcEIAFB8ABBCBCzFgsgAkEMaiECIARBf2oiBA0ACwsgACgCBCADEJwtDwsCQCAALQAcQQJGDQAgACkDCCIJQgODQgBSDQAgCaciAiACKAIAIgFBf2o2AgAgAUEBRw0AIAIgAigCEBDGJAsgACgCICIEQQRqKAIAIQACQCAEKAIIIgJFDQADQCAAEIMHIABBwABqIQAgAkF/aiICDQALIARBBGooAgAhAAsgBCgCACAAEJ0tIARBEGooAgAhAAJAIAQoAhQiAkUNAANAIAAoAgAiARCSASABQcAAQQgQsxYgAEEMaiEAIAJBf2oiAg0ACyAEQRBqKAIAIQALIAQoAgwgABCcLQJAIAQoAhgiAUGAgICAeEYNACAEQRxqKAIAIQACQCAEKAIgIgJFDQADQCAAENUCIABBMGohACACQX9qIgINAAsgBEEcaigCACEAIAQoAhghAQsgASAAEJ4tCwJAIAQoAjwiAEUNACAAENEPIAAoAgAgAEEEaigCABCeLSAAQRRBBBCzFgsCQCAEKAJAIgBFDQAgACgCACICELQCIAJB4ABBCBCzFiAAQQxBBBCzFgsgBEHIAEEEELMWDwsgACgCBCIAEJIBIABBwABBCBCzFg8LIAAoAgwiABCSASAAQcAAQQgQsxYPCyAAKAIEIgIQkgEgAkHAAEEIELMWIAAoAggiABCSASAAQcAAQQgQsxYPCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDgwAAQIDBAUGBwgJCwoLCyAAQQhqEMAWDAoLIABBCGoQ0g8MCQsgAEEIahDfGAwICyAAQQRqEN8pDAcLIABBBGoQhwsMBgsgAEEEahCYJQwFCyAAQQRqEJglDAQLIABBBGoQ3ykMAwsgAEEEahCYJQwCCyAAQQRqEJEUDAELAkACQCAAKAIEDgIAAQILIABBCGoQqRQMAQsgAEEIahDzDQsgACgCOCIAEJIBIABBwABBCBCzFg8LIAAoAigiAhCSASACQcAAQQgQsxYgAEEIahCzEQ8LAkAgACgCCA0AIAApAxAiCUIDg0IAUg0aIAmnIgAgACgCACICQX9qNgIAIAJBAUcNGiAAIAAoAhAQxiQPCyAAQQxqEOApDwsgACgCBCICEJIBIAJBwABBCBCzFiAAKAIIIgIQkgEgAkHAAEEIELMWIAAoAgwiABCSASAAQcAAQQgQsxYPCwJAIAAtABhBBUcNACAAKAIQIgIQkgEgAkHAAEEIELMWCyAAKAIIIQMCQCAAKAIMIgFFDQAgA0EMaiECA0AgAigCACIEEJIBIARBwABBCBCzFiACQRBqIQIgAUF/aiIBDQALCyAAKAIEIAMQmy0gACgCKCIARQ0XIAAQ7BsgAEEUQQQQsxYPCyAAKAIQIgIQkgEgAkHAAEEIELMWAkAgACgCBCICQYCAgIB4Rg0AIABBBGoQ6R4gAiAAKAIIEJstCyAAKAIgIgBFDRYgABDsGyAAQRRBBBCzFg8LIAAoAgghAwJAIAAoAgwiAUUNACADIQIDQCACKAIAIgQQkgEgBEHAAEEIELMWIAJBBGohAiABQX9qIgENAAsLIAAoAgQgAxCfLQ8LIAApAwgiCUIDg0IAUg0UIAmnIgAgACgCACICQX9qNgIAIAJBAUcNFCAAIAAoAhAQxiQPCyAAQQhqEIIMDwsgACgCCCEDAkAgACgCDCIBRQ0AIAMhAgNAIAIoAgAiBBCSASAEQcAAQQgQsxYgAkEEaiECIAFBf2oiAQ0ACwsgACgCBCADEJ8tIAAoAhQiAiAAKAIYELYQIAAoAhAgAhCgLQ8LIAAoAgQiAhCSASACQcAAQQgQsxYCQCAAKAIYIgJFDQAgAhDsGyACQRRBBBCzFgsgACgCCCIEQQRqKAIAIQACQCAEKAIIIgJFDQADQCAAKAIAIgEQkgEgAUHAAEEIELMWIABBBGohACACQX9qIgINAAsgBEEEaigCACEACyAEKAIAIAAQny0gBEEQaiIAKAIAIARBFGooAgAQthAgBCgCDCAAKAIAEKAtIARBIEEEELMWDwsgACgCCCEEAkAgACgCDCIBRQ0AIAQhAgNAIAIQrAcgAkEoaiECIAFBf2oiAQ0ACwsgACgCBCAEEKEtAkACQCAAKAIQIgIoAgBBgICAgHhGDQAgAhC2HwwBCyACQQRqEOApCyACQRhBBBCzFgJAIAAoAiAiAkUNACACEK0OIAJBFEEEELMWCyAAKAIkIgBFDRAgABDhKSAAQQxBBBCzFg8LAkAgAC0AHEECRg0AIAApAwgiCUIDg0IAUg0AIAmnIgIgAigCACIBQX9qNgIAIAFBAUcNACACIAIoAhAQxiQLIAAoAiAiBUEEaigCACEAAkAgBSgCCCICRQ0AA0AgACgCACIBEJIBIAFBwABBCBCzFiAAQQxqIQAgAkF/aiICDQALIAVBBGooAgAhAAsgBSgCACAAEJwtIAVBEGooAgAhAAJAIAUoAhQiAkUNAANAIAAQvwMgAEHYAGohACACQX9qIgINAAsgBUEQaigCACEACyAFKAIMIAAQoi0CQCAFKAIwIgBFDQAgABCSASAAQcAAQQgQsxYLAkAgBSgCNCIARQ0AIAAQ0Q8gACgCACAAQQRqKAIAEJ4tIABBFEEEELMWCwJAIAUoAjgiAEUNACAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFgsgBUEcaigCACEGAkAgBSgCICIHRQ0AQQAhAwNAIAYgA0EEdGoiACgCACICEJIBIAJBwABBCBCzFgJAIAAoAgwiBEUNACAEQQRqIggoAgAhAAJAIAQoAggiAkUNAANAIAAoAgAiARC0AiABQeAAQQgQsxYgAEEEaiEAIAJBf2oiAg0ACyAIKAIAIQALIAQoAgAgABCfLSAEQRRBBBCzFgsgA0EBaiIDIAdHDQALIAVBHGooAgAhBgsgBSgCGCAGEJstIAVBwABBBBCzFg8LIAAoAgwiAEUNDiAAEJIBIABBwABBCBCzFg8LIAAoAgQiABCSASAAQcAAQQgQsxYPCyAAKAIEIgAQkgEgAEHAAEEIELMWDwsgAEEIahC0EQ8LIABBCGoQkhQPCyAAKAIEIgNBwABqENQUIANBgAFqKAIAIQICQCADKAKEASIBRQ0AA0ACQAJAIAIoAgBBBUYNAAJAAkAgAkEwaiIEKQMAQgBSDQAgAkE4aikDACIJQgODQgBSDQEgCaciBCAEKAIAIgZBf2o2AgAgBkEBRw0BIAQgBCgCEBDGJAwBCyAEEJIUCwJAAkACQAJAIAIoAgAOBQECAwAFAQsgAkEEaiIEENMRIAQoAgAgAkEIaigCABChLQwECyACQQhqEIIMDAMLIAJBBGooAgBFDQIgAkEIaigCACIEEJIBIARBwABBCBCzFgwCCyACQQRqEJcJDAELIAJBBGooAgAiBBCSASAEQcAAQQgQsxYLIAJB2ABqIQIgAUF/aiIBDQALIANBgAFqKAIAIQILIAMoAnwgAhCiLQJAIAMoAngiAkUNACACELcfIAIoAgAgAkEEaigCABCfLSACQRRBBBCzFgsgA0GQAWoQ0xEgAygCkAEgA0GUAWooAgAQoS0CQCADLQA8QQZGDQAgA0EQahDUFAsgACgCBEGgAUEIELMWDwsgACgCCCEEAkAgACgCDCIBRQ0AIAQhAgNAIAIQ6gwgAkEoaiECIAFBf2oiAQ0ACwsgACgCBCAEEKEtDwsgACgCBCICEJIBIAJBwABBCBCzFiAAKAIIIgAQtAIgAEHgAEEIELMWDwsgACgCBCIAEJIBIABBwABBCBCzFg8LIAAoAgQiABCSASAAQcAAQQgQsxYPCyAAKAIEIgIQkgEgAkHAAEEIELMWIAAoAggiABC0AiAAQeAAQQgQsxYPCyAAKAIEIgIQkgEgAkHAAEEIELMWIAAoAggiBEEEaigCACEAAkAgBCgCCCICRQ0AA0AgACgCACIBELQCIAFB4ABBCBCzFiAAQQRqIQAgAkF/aiICDQALIARBBGooAgAhAAsgBCgCACAAEJ8tIARBFEEEELMWDwsgACgCBCICEJIBIAJBwABBCBCzFiAAKAIIIgAQtAIgAEHgAEEIELMWDwsgACkDCCIJQgODQgBSDQEgCaciACAAKAIAIgJBf2o2AgAgAkEBRw0BIAAgACgCEBDGJA8LAkACQCAAKAIEIgAoAgBBA0YNACAAENIPDAELIABBBGoQ3Q0LIABBKEEIELMWCwvuGgITfwN+IwBBkAJrIgIkACABKALYASEDIAEQoQsgAkHAAGpBCEEEQQxBwN6bARCqGiACQQA2AlQgAiACKAJEIgQ2AlAgAiACKAJANgJMIAJB4AFqQQRqIQUgAkHgAWpBBHIhBiACQbABakEIaiEHIAJB4AFqQQhqIQggAkGQAWpBCGohCSABLQDgASEKQQAhC0EAIQwDQCALQQxsIQ0CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIApB/wFxIgpBA0YNACACIAEoAtgBIg42AnQCQCAKQQ9GDQACQCAKQRxHDQAgARChCyABKALUASEPIAJBKGogARDQEyACIAIoAiwiCjYCXCACKAIoQQFxRQ0EIAJBATYCWAwWCyACQeABaiABEPgPIAItAOABDQIgAi0A4QEhECABKALUASERIAEoAtABIRIgAkHgAWogARCCISACKALkASEKIAIoAuABIg9BBUYNFSAHIAgpAwA3AwAgB0EQaiAIQRBqKQMANwMAIAdBCGoiEyAIQQhqKQMANwMAIAIgCjYCtAEgAiAPNgKwASABLQDgASEKIAEvAZABQYDAAHEiFEUNBiAKQRdLDQUgCiEOQQEgCnRBkYmCBHENCSAKQQlHDQUMBwsgARChCyACQeABaiABEIIhIAIoAuQBIQ4gAigC4AEiD0EFRg0DIAJB+ABqQRBqIhQgCEEQaikDADcDACACQfgAakEIaiITIAhBCGopAwA3AwAgAiAIKQMANwN4AkACQCABKAKIASIKQYCAgBBxDQAgASAKQYCAgBByNgKIASACQTBqIAIoAnQgARCVEyACKAIwIRAgASABKAKIAUH///9vcTYCiAEgAigCNCEKDAELIAJBOGogAigCdCABEJUTIAIoAjwhCiACKAI4IRALIAkgAikDeDcDACAJQQhqIBMpAwA3AwAgCUEQaiAUKQMANwMAIAIgDjYClAEgAiAPNgKQAQJAAkAgEEEBcUUNACACQZABahC5HUEBIQ4MAQsgBSACKQOQATcCACAFQRhqIAJBkAFqQRhqKQMANwIAIAVBEGogAkGQAWpBEGopAwA3AgAgBUEIaiAJKQMANwIAQfAAELArIg5BCjYCAAJAQSRFDQAgDkEEaiACQeABakEk/AoAAAsgDiAKNgIoIAIgDjYCYEEAIQpBACEOCyACIA42AlggAiAKNgJcDBELIAEQoQsgASgC1AEhCgJAIAxBAXFFDQAgAkHgAWogAUH8AWogAyAVpyAVQiCIpxCZBgsgAEEONgIAIAAgAikCTDcCBCAAIAo2AhQgACADNgIQIABBDGogAkHUAGooAgA2AgAMFAsgAigC5AEhCgwSCyACIA82AmQgAiAONgJgIAJBADYCWAwPCyACIA42AlwgAkEBNgJYIA4hCgwQCyAKIQ4gCkFAakECSQ0DIAoQpRUNAEESIQ4gCkESRg0DAkAgDw0AIAohDiAKQQNGDQQLIAEoAtwBIQogASgC2AEhDiACQfWAgIB4NgLgASABIA4gCiACQeABahDeIyABKALUASEOIAIoAnQhD0HAABDMLSIKRQ0CIAogDjYCCCAKIA82AgQgCkExNgIAIAUgAikDsAE3AgAgBUEIaiAHKQMANwIAIAVBEGogAkGwAWpBEGopAwA3AgAgBUEYaiACQbABakEYaikDADcCAEHwABCwKyIOQQY2AgACQEEkRQ0AIA5BBGogAkHgAWpBJPwKAAALIA4gCjYCKCACIA42AmAgAkIANwJYQQAhCgwNCyAKIQ4gCkEJRw0CCyABEKELIAIgARDQEyACKAIEIQoCQCACKAIAQQFxDQAgBSACKQOwATcCACAFQRhqIAJBsAFqQRhqKQMANwIAIAVBEGogAkGwAWpBEGopAwA3AgAgBUEIaiAHKQMANwIAQfAAELArIg5BBjYCAAJAQSRFDQAgDkEEaiACQeABakEk/AoAAAsgDiAKNgIoIAIgDjYCYEEAIQogAkEANgJcDAwLIA8NAiACKQO4ARDIIQwNCwALAkACQCAUQQBHIA5B/wFxQRJGcQ0AIA5FDQAgDw0BIAkgEykDADcDACACIAcpAwA3A5ABAkAgDkEKRw0AIAEQoQsgASgC1AEhCiABKALQASEOIAJBkoGAgHg2AuABIAEgDiAKIAJB4AFqEN4jIAEtAOABIgohDgsCQAJAAkACQCAOQf8BcSIOQX1qDgUBAgICAQALIA5BF0cNAQsgCkH/AXFBF0YNASACKQO4ASEWIAIpA8ABIRdBACEKQfAAELArIg5BADoAHCAOQQA2AhggDiAXNwMQIA4gFjcDCCAOQQU2AgAgAiAONgJgDAsLIAJBGGogAkGQAWoQ8RUgAigCGCIKIAIoAhwiDkGgupwBQQMQ4yUNByAKIA5Bo7qcAUEDEOMlDQcgCiAOQaa6nAFBBRDjJQ0HAkAgAS0AkQFBIHENACAGIAEQ1CYgAkEqNgL0ASACQau6nAE2AvABIAJBsICAgHg2AuABIAEoAtgBIAEoAtwBIAJB4AFqEOAaIQogAS0A4AFBogFHDQYgASABEJosEKcXDAYLIAYgARDUJiACQdIANgL0ASACQdW6nAE2AvABIAJBsICAgHg2AuABIAEoAtgBIAEoAtwBIAJB4AFqEOAaIQogAS0A4AFBogFHDQQgASABEJosEKcXDAQLIAEQoQsgAkEgaiABENATIAIoAiQhCgJAIAIoAiBBAXFFDQBBASEOIAJBATYCWCACIAo2AlwgAikDuAEQyCEMCwsgASgC1AEhDyACKAJ0IRQgAikDuAEhFiACKQPAASEXQfAAELArIg4gCjYCKEEAIQogDkEAOgAkIA5BADYCICAOIBc3AxggDiAWNwMQIA4gDzYCDCAOIBQ2AgggDkEHNgIAIAIgDjYCYAwJCwJAAkAgASgCiAEiCkGAgIAQcQ0AIAEgCkGAgIAQcjYCiAEgAkEIaiACKAJ0IAEQlhMgAigCCCEOIAEgASgCiAFB////b3E2AogBIAIoAgwhCgwBCyACQRBqIAIoAnQgARCWEyACKAIUIQogAigCECEOCwJAIA5BAXFFDQAgAkGwAWoQuR0MDQsgBSACKQOwATcCACAFQRhqIAJBsAFqQRhqKQMANwIAIAVBEGogAkGwAWpBEGopAwA3AgAgBUEIaiAHKQMANwIAQfAAELArIg5BCjYCAAJAQSRFDQAgDkEEaiACQeABakEk/AoAAAsgDiAKNgIoIAIgDjYCYEEAIQoMCgsgBiABENQmIAJBCjYC9AEgAkGnu5wBNgLwASACQbCAgIB4NgLgASABKALYASABKALcASACQeABahDgGiEKAkAgAS0A4AFBogFHDQAgASABEJosEKcXCyACQQE2AlggAiAKNgJcCyACQbABahC5HQwKCyACQQE2AlgMAQsgAkEBNgJYCyACIAo2AlwMAQsCQCAQQQFxRQ0AIAJB/YCAgHg2AuABIAEgEiARIAJB4AFqEN4jC0EAIQoCQCACQZABakGmupwBQQUQhCJFDQACQCABLQDgASIKQQ9HDQAgARChCwsgCkEPRiEKCyACIAo6ANcBIAJB4AFqIAEQgiEgAigC5AEhCiACKALgASIOQQVHDQEgAiAKNgJcIAJBATYCWAsgAikDkAEQyCEMBQsgAikD+AEhFiACKALwASEPIAIoAugBIRQgAiACKAL0ASITIAIoAuwBIhAgDkECSSIRGzYC3AEgAiAPIBQgERs2AtgBIAIgFjcD+AEgAiATNgL0ASACIA82AvABIAIgEDYC7AEgAiAUNgLoASACIAo2AuQBIAIgDjYC4AEgASgCiAEhCiACIAJB2AFqNgKIAiACIAJB9ABqNgKEAiACIAJBkAFqNgKAAiACIAJB1wFqNgKMAgJAAkAgCkGAgIAQcQ0AIAEgCkGAgIAQcjYCiAEgAkHYAGogAkHgAWogARCCECABIAEoAogBQf///29xNgKIAQwBCyACQdgAaiACQeABaiABEIIQCyACKQOQARDIISACKAJcIQogAigCWCEODAELIAJCADcCWEEAIQ4LIA5BAXENAgsgAikCYCEWAkAgCyACKAJMRw0AIAJBzABqEO0dIAIoAlAhBAsgBCANaiIOIAo2AgAgDkEEaiAWNwIAIAIgC0EBaiILNgJUIA1BDGohDQJAIAEtAOABIgpBfWoOBQEAAAAEAAsLIAEoAtwBIQogASgC2AEhCyACQegAaiABENQmIAJBATYC5AEgAkGcv5wBNgLgASACQgE3AuwBIAJBswc2AnwgAkEHOgDYASACIAJB+ABqNgLoASACIAJB2ABqNgJ4IAIgAkHYAWo2AlggAkGQAWogAkHgAWoQkhAgAkGkAWogAkHwAGooAgA2AgAgAiACKQJoNwKcASALIAogAkGQAWoQ4BohCiABLQDgAUGiAUcNACABIAEQmiwQpxcLIABBMjYCACAAIAo2AgQgAkHMAGoQqisLIAJBkAJqJAAPCyABEKELQQEgDCABLQDgASIKQQNGIg0bIQwgASkD0AEgFSANGyEVDAALC6QYAht/CH4jAEGAAWsiBiQAIAAoAgghByAAQQA2AgggACgCACEIIAAoAgQhCSAAQoCAgICAATcCACAAKAIQIQogACgCDCELIABBACkD+ISeASIhNwIMIABBFGpBACkDgIWeASIiNwIAIAZBGGpBCGogIjcDACAGICE3AxggBkEANgIsIAsgChC6IyADQRBqIQwgCSAHQRhsaiENQboHrUIghiAGQcgAaq2EISNBzAStQiCGIAZBMGqthCEkIAUoAgAiDkF4aiEPIAZBGGpBEGohECAEKAIEIREgBCgCACESIAUoAgQhEyAFKAIMIRQgBCgCDCEVIAkhFgJAA0ACQCAWIgcgDUcNACANIRYMAgsgB0EYaiEWIAcpAwAiIVANASAGIAcoAggiBzYCOCAGICE3AzACQAJAAkAgFUUNACASIBEgISAHEOweIAZBMGoQkg0NAQsgASAGQTBqEKILDQAgAiAGQTBqEKILDQAgBkEwakHE7ZsBQQQQhCINAAJAAkAgBigCJEUNACAGKQMwENYgIiFCGYhCgYKEiJCgwIABfiEiIAYoAhwiCyAhp3EhB0EAIRcgBigCGCEKA0AgCiAHaikAACIlICKFIiFCf4UgIUL//fv379+//358g0KAgYKEiJCgwIB/gyEhAkACQANAICFQDQEgBkEwaiAGKAIYICF6p0EDdiAHaiALcSIYQQR0a0FwahCTDA0CICFCf3wgIYMhIQwACwsgJSAlQgGGg0KAgYKEiJCgwIB/g1BFDQIgByAXQQhqIhdqIAtxIQcMAQsLIApBACAYa0EEdGpBeGooAgAhBwwBC0EAIQcLIAYgBzYCLCAAKAIcIhlBcGoh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IQILIAsgAmohCwwACwsgCiAEKAKIA0HAvJwBEI4pCwALIARBgANqQQRBABCTFyACQQhqIARBgANqQQhqKAIANgIAIAIgBCkCgAM3AgAgB0F/aiEHIAJBDGohAgwACwtBhJqAARDSLAALQeSZgAEQ0iwAC0HUmYABENIsAAtBxJmAARDSLAALQbSZgAEQ0iwAC0EBIAMgBEGAA2oQ2QQMAQtBACADIARBgANqENkECwJAIAQoAoADIAQoAogDIgJNDQAgBEEQaiAEQYADaiACQQQQlRUgBCgCECICQYGAgIB4Rw0CCwJAIAQoApgDIAQoAqADIgJNDQAgBEEIaiAEQZgDaiACQQQQlRUgBCgCCCICQYGAgIB4Rw0DCwJAIAQoAowDIAQoApQDIgJNDQAgBCAEQYwDaiACQQwQlRUgBCgCACICQYGAgIB4Rw0ECwJAQdwCRQ0AIABBBGogBEGAA2pB3AL8CgAACyAAQQA2AgALIARBwAZqJAAPCyACIAQoAhRBtJqAARCOKQALIAIgBCgCDEHEmoABEI4pAAsgAiAEKAIEQdSagAEQjikAC6QgAgt/An4jAEEgayIBJAAQ6CkhAiAAKAIAIgAoAgQhAyAAKAIAIQRBgICAgHghBQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCCCIGQTQgBkG7gYCAeEgbQf8BcQ67AboBAAECAwQFBgcICQoLDA0ODxAR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KGohASARQVhqIREgCUEoaiEJIBJBf2oiEg0ACwtBACEBQQAhCQJAIAMoAhgiEUUNABD7JyEJIBEpAgQhGiARKAIAIRIQ/CchESACQcAAaiASEHYCQEHgAEUNACARIAJBwABqQeAA/AoAAAsgCSAaNwIEIAkgETYCAAsCQCADKAIcIhFFDQAQgCghASARKAIMIRIgESgCECETIAJBwABqIBEQ4QYgAUEQaiATNgIAIAEgAikCQDcCACACIBI2AkwgAUEIaiACQcAAakEIaikCADcCAAsgAiABNgIkIAIgCTYCICACIAw2AhwgAiANNgIYIAIgDjYCFCACIBA2AhAgAiAPNgIMIAJBBTYCCAwFCyADLQAUIRIgAygCCCEPIAMoAgQhDiADKAIQIQkQ+ichASACQcAAaiAJEEIgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgAUEIaiACQcAAakEIaikDADcDACABIAIpA0A3AwAgAy0AFiEQIAMtABUhDAJAAkAgAygCDCIRDQBBACEJDAELEPsnIQkgESkCBCEaIBEoAgAhDRD8JyERIAJBwABqIA0QdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACyACIBA6AB4gAiAMOgAdIAIgEjoAHCACIAE2AhggAiAJNgIUIAIgDzYCECACIA42AgwgAkEGNgIIDAQLIAMoAgwhEiADKAIIIQ8gAygCBCEJEPonIQEgAkHAAGogCRBCIAFBOGogAkHAAGpBOGopAwA3AwAgAUEwaiACQcAAakEwaikDADcDACABQShqIAJBwABqQShqKQMANwMAIAFBIGogAkHAAGpBIGopAwA3AwAgAUEYaiACQcAAakEYaikDADcDACABQRBqIAJBwABqQRBqKQMANwMAIAFBCGogAkHAAGpBCGopAwA3AwAgASACKQNANwMAIAMtABQhDgJAAkAgAygCECIRDQBBACEJDAELEPsnIQkgESkCBCEaIBEoAgAhEBD8JyERIAJBwABqIBAQdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACyACIA46ABwgAiAJNgIYIAIgEjYCFCACIA82AhAgAiABNgIMIAJBBzYCCAwDCyADKQMoIRogAygCMCEJEPonIQEgAkHAAGogCRBCIAFBOGogAkHAAGpBOGopAwA3AwAgAUEwaiACQcAAakEwaiIJKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaiIRKQMANwMAIAFBGGogAkHAAGpBGGoiEikDADcDACABQRBqIAJBwABqQRBqIg8pAwA3AwAgAUEIaiACQcAAakEIaiIOKQMANwMAIAEgAikDQDcDACADLQA0IRAgAkHAAGogAxCfAyAJIAE2AgAgAkEIakEoaiAaNwMAIAJBCGpBCGogDikDADcDACACQQhqQRBqIA8pAwA3AwAgAkEIakEYaiASKQMANwMAIAJBCGpBIGogESkDADcDACACIBA6AHQgAkEIakEwaiAJKQMANwMAIAIgAikDQDcDCAwCCyADKAIYIRQgAygCFCEVIAMoAhAhARD6JyENIAJBwABqIAEQQiANQThqIAJBwABqQThqKQMANwMAIA1BMGogAkHAAGpBMGopAwA3AwAgDUEoaiACQcAAakEoaikDADcDACANQSBqIAJBwABqQSBqIg4pAwA3AwAgDUEYaiACQcAAakEYaiIQKQMANwMAIA1BEGogAkHAAGpBEGoiDCkDADcDACANQQhqIAJBwABqQQhqIg8pAwA3AwAgDSACKQNANwMAIAMoAgghCSADLQAlIRYgAy0AJCEXIAJBwABqIAMoAgwiGEEIQSgQlQ8gAigCRCETIAIoAkBBAUYNByACKAJIIRkCQCATRQ0AIBhBKGwhESAZIQEgEyESA0AgEUUNASACQcAAaiAJEJ8DIAFBIGogDikDADcDACABQRhqIBApAwA3AwAgAUEQaiAMKQMANwMAIAFBCGogDykDADcDACABIAIpA0A3AwAgAUEoaiEBIBFBWGohESAJQShqIQkgEkF/aiISDQALC0EAIQFBACEJAkAgAygCHCIRRQ0AEPsnIQkgESkCBCEaIBEoAgAhEhD8JyERIAJBwABqIBIQdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACwJAIAMoAiAiEUUNABCAKCEBIBEoAgwhEiAR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IAIoAgwiCiAEIAogBEsbIQcgAUHAAGohCyACKAIIIQwgAUEIaiENIAFBBGohDiABQRRqIQ8gAUEQaiEQIAFBIGohESABQRxqIRIgBCECA0ACQCAFIAJHDQAgACADKQMANwIEIAAgCTYCACAAQQxqIANBCGooAgA2AgAMCAsCQAJAIAcgAkYNACAOKAIAIA0oAgAgCCALIAwgAmotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQEgCEUNByAIIAEoAswCSw0BIBAoAgAgDygCACAIIAEoAjx2QX5qQcC6gwEQwyUiEygCBCATKAIIQQAQxCUoAgAhEyADQRBqIBMgAkEBaiIUIBIoAgAgESgCACATQbC6gwEQviUoAgBrIBQQ3RcgAygCECAESw0BIANBCGogA0EQakEIaigCADYCACADIAMpAhA3AwBBASEJIAZBAXFFDQEgA0EQaiECDAgLIAcgCkGsn4ABEJEVAAsgAkEBaiECDAALCyAAQQA2AgAMBQsCQCAGQQFxDQACQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAYLQQAhBgJAIAggASgCzAJLDQAgAUEQaigCACABQRRqKAIAIAggASgCPHZBfmpBwLqDARDDJSIHKAIEIAcoAghBABDEJSgCACEHIANBEGogByAEIAFBHGooAgAgAUEgaigCACAHQbC6gwEQviUoAgBrIAQQ3RdBASEGCyACKAIMIhIgBCASIARLGyEHIAFBwABqIQsgAigCCCECIAFBCGohDCABQQRqIQ0gAUEUaiEUIAFBEGohDyABQSBqIRAgAUEcaiERA0ACQCAFIARHDQAgACADKQIQNwIEIAAgBjYCACAAQQxqIANBGGooAgA2AgAMBwsCQAJAIAcgBEYNACANKAIAIAwoAgAgCCALIAIgBGotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQECQAJAIAhFDQAgCCABKALMAk0NAQwDCyAAIAMpAhA3AgQgACAGNgIAIABBDGogA0EYaigCADYCAAwJCyAPKAIAIBQoAgAgCCABKAI8dkF+akHAuoMBEMMlIg4oAgQgDigCCEEAEMQlKAIAIQ5BASEGIANBEGogDiAEQQFqIhMgESgCACAQKAIAIA5BsLqDARC+JSgCAGsgExDdFwwBCyAHIBJBrJ+AARCRFQALIARBAWohBAwACwsCQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAULAkACQCAIIAEoAswCTQ0AIAIoAgwiDiAEIA4gBEsbIQcgAUHAAGohCyACKAIIIQIgAUEIaiEMIAFBBGohDQNAAkAgBSAERw0AIABBADYCAAwICwJAAkAgByAERg0AIA0oAgAgDCgCACAIIAsgAiAEai0AAGotAABqQaC6gwEQviUoAgAiCCABKALIAksNAQJAIAgNAEEAIQIMBQsgCCABKALMAksNASAEQQFqIQQMAwsgByAOQayfgAEQkRUACyAEQQFqIQQMAAsLIAFBEGooAgAgAUEUaigCACAIIAEoAjx2QX5qQcC6gwEQwyUiAigCBCACKAIIQQAQxCUoAgAhAiADQRBqIAIgBCABQRxqKAIAIAFBIGooAgAgAkGwuoMBEL4lKAIAayAEEN0XIABBDGogA0EYaigCADYCACAAIAMpAhA3AgRBASECCyAAIAI2AgAMBAsCQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAQLAkAgCCABKALMAksNACABQRBqKAIAIAFBFGooAgAgCCABKAI8dkF+akHAuoMBEMMlIgIoAgQgAigCCEEAEMQlKAIAIQIgAyACIAQgAUEcaigCACABQSBqKAIAIAJBsLqDARC+JSgCAGsgBBDdFyAAQQE2AgAgAEEMaiADQQhqKAIANgIAIAAgAykCADcCBAwECyADQRBqIAcgAUEsaiITKAIAIgwoAghBf2pBeHFqQQhqIAIoAggiCyACKAIMIgcgBCAFIAwoAhAREgACQAJAAkAgAygCECICDgMCAQACCyABQcAAaiEMIAMoAhQhBCABQQhqIQ0gAUEEaiEOAkACQAJAA0ACQCAEIgIgBUkNACAAQQA2AgAMCgsgAiAHTw0CAkACQCAOKAIAIA0oAgAgCCAMIAsgAmotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQAgCEUNBSAIIAEoAswCTQ0DIANBEGogASgCKCATKAIAIgQoAghBf2pBeHFqQQhqIAsgByACIAUgBCgCEBESACADKAIQRQ0BIAMoAhQiBCACSw0CCyACQQFqIQQMAQsLIABBADYCAAwICyABQRBqKAIAIAFBFGooAgAgCCABKAI8dkF+akHA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CAwBCyACEKELIANBwAFqIAIQxAQgAygCxAEhBQJAIAMoAsABIghBgICAgHhGDQAgAygCyAEhCQwBCyAAQQM6ABQgACAFNgIADAELIAMgCTYCVCADIAU2AlAgAyAINgJMIAItAOABIQUCQAJAIAIvAZABQYDAAHEiCEUNACAFQf8BcUGBAUcNACACEKELIAIoAtQBIQUgAigC0AEhCCADQZiBgIB4NgLAASACIAggBSADQcABahDeIyADQcABaiACEMQEIAMoAsQBIQUCQCADKALAASIIQYCAgIB4Rw0AIABBAzoAFCAAIAU2AgAMAgsgAyADKALIATYCoAEgAyAFNgKcASADIAg2ApgBIANBmAFqELUoIAIvAZABQYDAAHEhCCACLQDgASEFCwJAAkAgCEUNACAFQf8BcUHZAEcNACACEKELIAIoAtQBIQUgAigC0AEhCCADQZaBgIB4NgLAASACIAggBSADQcABahDeIyADQcABaiACEN0LIAMoAsQBIQUCQCADKALAASIIDQAgAEEDOgAUIAAgBTYCAAwDCyADIAg2AsABIAYhCQJAAkACQAJAAkAgBg0AIANByABqELMrIAMgCDYCSCAFDQEgCCEJCyAFEIQsIAYNAQwCCyAHEIQsIAUhBwwCCyADQcABahCnLAsgCSEICyACLQDgASEFDAELIAYhCAsCQAJAAkACQAJAIAVB/wFxQQJGDQAgAigC3AEhBSACKALYASEGIANB2ABqIAIQ1CYgA0EBNgLEASADQZy/nAE2AsABIANCATcCzAEgA0GzBzYCaCADQQI6AJABIAMgA0HkAGo2AsgBIAMgA0GIAWo2AmQgAyADQZABajYCiAEgA0GYAWogA0HAAWoQkhAgA0GsAWogA0HgAGooAgA2AgAgAyADKQJYNwKkASAGIAUgA0GYAWoQ4BohBSACLQDgAUGiAUYNAQwECyACEKELIAhFDQECQAJAIAIoAogBIgVBgICAAnENACACIAVBgICAAnI2AogBIANBwAFqIAIQrgcgAiACKAKIAUH///99cTYCiAEMAQsgA0HAAWogAhCuBwsgAygCxAEhBSADKALAASIGQYCAgIB4Rw0CIABBAzoAFCAAIAU2AgAMBAsgAiACEJosEKcXDAILAkACQCACKAKIASIFQYCAgAJxRQ0AIAIgBUH///99cTYCiAEgA0HAAWogAhCuByACIAIoAogBQYCAgAJyNgKIAQwBCyADQcABaiACEK4HCyADKALEASEFIAMoAsABIgZBgICAgHhHDQAgAEEDOgAUIAAgBTYCAAwCCyADIAMoAsgBNgJsIAMgBTYCaCADIAY2AmQCQAJAAkAgAi0A4AEiBUEDRg0AAkAgBUGjAUcNACADQfAAaiACENQmIAIoAtwBIQUgAigC2AEhBiADQQE2AsQBIANBnL+cATYCwAEgA0IBNwLMASADQbUHNgKMASADQQM6AJABIAMgA0GIAWo2AsgBIAMgA0GQAWo2AogBIANBmAFqIANBwAFqEJIQIANBrAFqIANB+ABqKAIANgIAIAMgAykCcDcCpAEgAiAGIAUgA0GYAWoQ3iMMAgsgAigC3AEhBSACKALYASEGIANB/ABqIAIQ1CYgA0EBNgLEASADQZy/nAE2AsABIANCATcCzAEgA0GzBzYCjAEgA0EDOgCXASADIANBiAFqNgLIASADIANBkAFqNgKIASADIANBlwFqNgKQASADQZgBaiADQcABahCSECADQawBaiADQYQBaigCADYCACADIAMpAnw3AqQBIAYgBSADQZgBahDgGiEFIAItAOABQaIBRw0CIAIgAhCaLBCnFwwCCyACEKELCyAAIAMpAzA3AwAgAEEIaiADQTBqQQhqKQMANwMAIABBEGogA0EwakEQaikDADcDACABKAIQKAIAIQUgAigC1AEhBiADQawBaiADQeQAakEIaigCADYCACADQZgBakEIaiABQQhqKAIANgIAIAMgAykCZDcCpAEgAyABKQIANwOYASADQbgBaiADQcwAakEIaigCADYCACADIAMpAkw3A7ABIANB9QFqQgA3AAAgA0EANgLsASADQgA3AuQBIANCADcC8AEgA0EANgLYASADQgg3AtABIANCADcCyAEgA0KAgICAwAA3AsABIANCBDcC3AFBwABBBBCsKiECAkBBJEUNACACIANBmAFqQST8CgAACyACQQA6ADwgAiAHNgI4IAIgBDYCNCACIAg2AjAgAkEANgIsIAIgBjYCKCACIAU2AiQgACACNgIYIANBwAFqEOAjDAkLIABBAzoAFCAAIAU2AgAgA0HkAGoQxSgMAQsgAEEDOgAUIAAgBTYCAAsgA0HMAGoQtSgLIAcQhCwgA0HIAGoQsysL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IAIoAiQhFSALIAhBAmotAAA6AAAgAiAILwAAOwEMIBVBgH5xIRYgLEIgiKchESArQiCIpyEUIAIoAjQhGSAspyESICunIRNBBiEPDAQLIA8oAiAhFyAPKAIcIRUgDygCGCEQIA8oAgwhFCAPKAIIIRMgDykDECIrpyESAkAgK0IDg0IAUg0AIBIgEigCACIOQQFqNgIAIA5Bf0wNDAsgDy0AJCEYIA8oAighDxD6JyEOIAJBOGogDxBCIA5BOGogAkE4akE4aikDADcDACAOQTBqIAJBOGpBMGopAwA3AwAgDkEoaiACQThqQShqKQMANwMAIA5BIGogAkE4akEgaikDADcDACAOQRhqIAJBOGpBGGopAwA3AwAgDkEQaiACQThqQRBqKQMANwMAIA5BCGogAkE4akEIaikDADcDACAOIAIpAzg3AwAgFUGAfnEhFiArQiCIpyERQQchDwwECyAPKAJEIRogDygCQCEbIAJBEGogD0EIahDDBAJAAkAgDygCSCIODQBBACEcDAELEPsnIRwgDikCBCErIA4oAgAhFRD8JyEOIAJBOGogFRB2AkBB4ABFDQAgDiACQThqQeAA/AoAAAsgHCArNwIEIBwgDjYCAAtBgICAgHghDgJAIA8oAihBgICAgHhGDQAgDygCLCEdIA8oAjwhHiAPKAI4IR8gDygCNCEgIAJBOGogDygCMCIhQQhBMBCVDyACKAI8IQ4gAigCOEEBRg0MIAIoAkAhGQJAIA4NAEEAIQ4MAQsgIUEwbCEiQQAhFSAOISMDQCAiIBVGDQEgAkE4aiAdIBVqEEwgGSAVaiIPQShqIAJBOGpBKGopAwA3AwAgD0EgaiACQThqQSBqKQMANwMAIA9BGGogAkE4akEYaikDADcDACAPQRBqIAJBOGpBEGopAwA3AwAgD0EIaiACQThqQQhqKQMANwMAIA8gAikDODcDACAVQTBqIRUgI0F/aiIjDQALCyALIAhBAmotAAA6AAAgAiAILwAAOwEMIAIoAiQiFUGAfnEhFiACKQMYIitCIIinIREgAikDECIsQiCIpyEUIAItACwhGCACKAIoIRcgAigCICEQICunIRIgLKchE0EIIQ8MAwsgDygCZCEkIA8oAmAhJSACQRBqIA8QwwRBByEXAkAgDygCIEEHRg0AIAJBOGogD0EgahC8AiACQZwBakECaiAJQQJqLQAAOgAAIAIgCS8AADsBnAEgAi0APCEYIAIoAjghFyACKAJAIQ4gAigCRCEZIAIoAkghISACKAJMISAgAigCUCEfIAIoAlQhHiACKAJYIRsgAigCXCEaCyAPKAJoIRUQ/SchHSACQThqIBUQvAIgHUEgaiACQThqQSBqIhMpAwA3AwAgHUEYaiACQThqQRhqIhApAwA3AwAgHUEQaiACQThqQRBqIhEpAwA3AwAgHUEIaiACQThqQQhqIhQpAwA3AwAgHSACKQM4NwMAQYCAgIB4IRwCQCAPKAJIQYCAgIB4Rg0AIA8oAkwhFiAPKAJcISYgDygCWCEnIA8oAlQhKCACQThqIA8oAlAiIkEIQTAQlQ8gAigCPCEcIAIoAjhBAUYNDCACKAJAISMCQCAcDQBBACEcDAELICJBMGwhKUEAIRUgHCESA0AgKSAVRg0BIAJBOGogFiAVahBMICMgFWoiD0EoaiACQThqQShqKQMANwMAIA9BIGogEykDADcDACAPQRhqIBApAwA3AwAgD0EQaiARKQMANwMAIA9BCGogFCkDADcDACAPIAIpAzg3AwAgFUEwaiEVIBJBf2oiEg0ACwsgCyACQZwBakECai0AADoAACACIAIvAZwBOwEMIAIoAiwiFUGAfnEhFiACKQMgIitCIIinIREgAikDGCIsQiCIpyEUIAIoAighECACKAIUISkgAigCECEPICunIRIgLKchEwwDCyACQThqIA9BCGoQwwQgDygCKBDRBCEOIAsgCkECai0AADoAACACIAovAAA7AQwgAigCTCIVQYB+cSEWIAIpA0AiK0IgiKchESACKQM4IixCIIinIRQgAi0AVCEYIAIoAlAhFyACKAJIIRAgAigCXCEZICunIRIgLKchE0EKIQ8LCwsgASAYOgAkIAEgFzYCICABIBA2AhggASApNgIEIAEgDzYCACABIAIvAQw7ACUgASAdNgJoIAEgJDYCZCABICU2AmAgASAmNgJcIAEgJzYCWCABICg2AlQgASAiNgJQIAEgIzYCTCABIBw2AkggASAaNgJEIAEgGzYCQCABIB42AjwgASAfNgI4IAEgIDYCNCABICE2AjAgASAZNgIsIAEgDjYCKCABIBYgFUH/AXFyNgIcIAFBJ2ogCy0AADoAACABIBGtQiCGIBKthDcDECAB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IgMNAAwOCwsgACgCDCICRQ0MIAAoAggiAyACQThsaiEFA0ACQAJAAkACQAJAAkACQAJAIAMoAgAiAkF8aiIAQQQgAEEHSRsOBwABAgMEBQYACwJAIAMoAgwiAkUNACADKAIIIQAgAkEobCECA0ACQAJAAkACQAJAIAAoAgAOBAABAgMACyAAQQhqKQMAIABBGGooAgAgARCCIwwDCyAAQQRqIAEQ2RcMAgsgAEEEaiABENklDAELIABBBGogARDJDgsgAEEoaiEAIAJBWGoiAg0ACwsCQCADKAIYIgBFDQAgACgCACABEKgBCyADKAIcIgBFDQYgAEEIaigCACICRQ0GIAJBMGwhAiAAQQRqKAIAQSRqIQADQAJAIABBfGooAgAiBEUNACAEIAEQqAELAkAgACgCACIERQ0AIAQgARCoAQsgAEEwaiEAIAJBUGoiAg0ADAcLCwJAIAMoAgwiAkUNACADKAIIIQAgAkEobCECA0ACQAJAAkACQAJAIAAoAgAOBAABAgMACyAAQQhqKQMAIABBGGooAgAgARCCIwwDCyAAQQRqIAEQ2RcMAgsgAEEEaiABENklDAELIABBBGogARDJDgsgAEEoaiEAIAJBWGoiAg0ACwsCQCADKAIYIgBFDQAgACgCACABEKgBCyADKAIcIgBFDQUgAEEIaigCACICRQ0FIAJBMGwhAiAAQQRqKAIAQSRqIQADQAJAIABBfGooAgAiBEUNACAEIAEQqAELAkAgACgCACIERQ0AIAQgARCoAQsgAEEwaiEAIAJBUGoiAg0ADAYLCyADKAIQIAEQpQEgAygCDCIARQ0EIAAoAgAgARCoAQwECyADKAIEIAEQpQEgAygCECIARQ0DIAAoAgAgARCoAQwDCyADKAIwIAEQpQECQAJAAkACQCACDgQAAQIDAAsgAykDCCADQRhqKAIAIAEQgiMMBQsgA0EEaiABENkXDAQLIANBBGogARDZJQwDCyADQQRqIAEQyQ4MAgsgAygCECABEKUBAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEIIjDAMLIABBBGogARDZFwwCCyAAQQRqIAEQ2SUMAQsgAEEEaiABEMkOCyAAQShqIQAgAkFYaiICDQALCwJAIAMoAhwiAEUNACAAKAIAIAEQqAELIAMoAiAiAEUNASAAQQhqKAIAIgJFDQEgAkEwbCECIABBBGooAgBBJGohAANAAkAgAEF8aigCACIERQ0AIAQgARCoAQsCQCAAKAIAIgRFDQAgBCABEKgBCyAAQTBqIQAgAkFQaiICDQAMAgsLAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEIIjDAMLIABBBGogARDZFwwCCyAAQQRqIAEQ2SUMAQsgAEEEaiABEMkOCyAAQShqIQAgAkFYaiICDQALCyADKAIQIgBFDQAgACgCACABEKgBCyADQThqIgMgBUcNAAwNCwsgACgCBCEADA0LIAAoAgwiA0UNCiAAKAIIIQAgA0E4bCEDA0ACQCAAKAIAQQdGDQAgACABELYICyAAQTBqKAIAIAEQqAEgAEE4aiEAIANBSGoiAw0ADAsLCyAAKAIEIQAMCwsgACgCECECIAAoAgwhAwJAIAAoAgRBAUcNACACRQ0JIAJBAnQhAANAIAMoAgAgARCoASADQQRqIQMgAEF8aiIADQAMCgsLIAJFDQggAkECdCEAA0AgAygCACABEKgBIANBBGohAyAAQXxqIgANAAwJCwsgACgCBCABEKgBIAAoAgggARCoASAAKAIMIAEQqAEgACgCECEADAkLAkAgACgCMCIDRQ0AIAMgARCoAQsgACgCNCIADQgMBgsgACgCBCEADAcLIAAoAgQgARCoASAAKAIIIQAMBgsCQCAAKAIwIgNFDQAgAyABEKgBCwJAIAAoAjQiA0UNACADIAEQqAELAkAgACgCQCIDRQ0AIAMgARCoAQsgACgCRCIADQUMAwsgACgCCEGEgICAeEgNAiABIABBCGoQxR8PCyAAKAIoIgBFDQEgACgCACEADAMLAkAgAC0APEECRw0AIAAoAigQxCcLAkAgACgCQCIDRQ0AIANBCGooAgAiAkUNACADQQRqKAIAIQMgAkECdCECA0AgAygCACABEKgBIANBBGohAyACQXxqIgINAAsLIAAoAkQiAEUNACAAIAEQjBkLDwsgACgCACgCACEADAALC+0TAxB/Bn4BfCMAQeABayICJAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIA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Qf9+cTYCiAEgA0EIaiADQdgBaiACEJwMIAMoAgghByACIAIoAogBQYABcjYCiAEgAygCDCEEDAELIAMgA0HYAWogAhCcDCADKAIEIQQgAygCACEHCwJAAkAgB0EBcUUNACAEIQhBgICAgHghBwwBCyAEKAIEIQggBCgCACEHAkBBKEUNACADQTBqIARBCGpBKPwKAAALIANBsAJqIARBwABqKQIANwMAIANBoAJqQQhqIARBOGopAgA3AwAgAyAEKQIwNwOgAiAEEIovCyADQdgAakEIaiABQQhqKQMANwMAIANB2ABqQRBqIAFBEGopAwA3AwAgA0HYAGpBGGogAUEYaikDADcDACADIAU2AoABIAMgBjYCfCADIAI2AnggAyABKQMANwNYAkAgB0GAgICAeEcNACAAQQE2AgAgACAINgIEIANB2ABqELgdDAMLIAMgCDYC3AEgAyAHNgLYAQJAQShFDQAgA0HYAWpBCGogA0EwakEo/AoAAAsgA0GYAmogA0GgAmpBEGopAwAiEDcCACADQdgBakE4aiADQaACakEIaikDADcCACADIAMpA6ACNwKIAgJAIAItAJEBQSBxRQ0AIAItAJIBQf8BcQ0AIAYoAgQhBCAGKAIAIQcgA0GAgYCAeDYC0AIgAiAHIAQgA0HQAmoQ3iMLIANBoAFqQQhqIAFBCGopAwA3AwAgA0GgAWpBEGogAUEQaikDADcDACADQaABakEYaiABQRhqKQMANwMAIANByAFqIANBMGpBGGopAgA3AwAgA0HQAWogA0EwakEgaikCADcDACADIAMpAkA3A8ABIAMgASkDADcDoAEgBSgCACEEIAIoAtQBIQICQEE4RQ0AIANB0AJqQQRqIANBoAFqQTj8CgAACyAQpyEFQfAAQQgQnSoiAUEINgIAAkBBPEUNACABQQRqIANB0AJqQTz8CgAACyABIAU2AkggASACNgJEIAEgBDYCQCADQdgBahC6KCADQeQBahCUKCADKAKUAhCjLCAAIAE2AgggAEIANwIADAILIAEoAiQiCCgCACEEIAMgASgCKCIJNgLoASADQQA2AuABIANCgICAgMAANwLYASADQQA6AKABIANBADoAWCADIAQ2AtACIAIoAogBIQQgAyADQaABajYC9AEgAyADQdACajYC8AEgAyADQdgAajYC7AEgAyAD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AyABEMEBIAEgBDoAOgsgAUEBOgA5IAAoAkQiAEUNAyABLQA0QQFHDQMgAS0AOiEDIAFBAToAOiAAIAEQwQEgASADOgA6IAFBAToAOQwDCyAAKAIIQYSAgIB4SA0CIAAoAhAiA0UNAiAAKAIMIQAgA0ECdCEDA0AgASAAKAIAEOwkIABBBGohACADQXxqIgMNAAwDCwsgAS0ANEEBRw0BIAEtADohAyABQQE6ADogAS0AOSEEAkAgAC0AHEECRg0AIAEgAEEIahC0EwsgASADOgA6IAEgBDoAOSAAKAIoIgBFDQEgASAAEKskDAELIAEgAEEIahD3EQsgAkHgAGokAAu3EgEIfyMAQdAAayIDJAACQAJAAkADQAJAAkACQAJAAkACQAJAIAIoAgAOCAABBAACBgMFAAsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIAAgA0HAAGoQziAMCQsgAigCBCEEIANBCGogAigCCCICQQFBAUHAvJwBELIZIAMoAgghBSADKAIMIQYCQCACRQ0AIAYgBCAC/AoAAAsgA0EBOgBMIAMgAjYCSCADIAY2AkQgAyAFNgJAIANBIGogA0HAAGoQziAgASgCCCABLQAQIANBIGoQvSYgAEEIaiADQSBqQQhqKAIANgIAIAAgAykCIDcCAAwICyADQRRqIAEgAigCDBDCASACKAIEIQQCQCACKAIQIgUNACACLQAUIQYCQAJAIARFDQAgAigCCEEBRg0BCyADQRRqEKgeCyADQQA2AkggA0KAgICAEDcCQCADQQE6AEwgA0EgaiADQcAAahDOIAJAIAZBAXENACADQRRqIANBIGpBAxCMHwsgA0HAAGpBCGogA0EUakEIaigCADYCACADIAMpAhQ3A0AgACABKAIMIAEtABAgA0HAAGogA0EgahC5CCADQSBqEM0pDAgLIAEoAgQiByAFIAcgBUkbIQYCQCAERQ0AIAUgAigCCEcNACADQQE6AEwgA0EANgJIIANCgICAgBA3AkAgA0E0aiADQcAAahDOIAJAA0AgBkUNASADQTRqEIsUDQEgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiADQRRqEOELIANBNGogASADQSBqIANBwABqEMICIAZBf2ohBiADQcAAahDNKQwACwsgBSAHTQ0GIANBNGoQqB4MBgsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIANBNGogA0HAAGoQziADQAJAAkAgBkUNACADQTRqEIsURQ0BCyADQTRqEKgeIAAgAykCNDcCACAAQQhqIANBNGpBCGooAgA2AgAMCAsgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiADQRRqEOELIANBNGogASADQSBqIANBwABqEMICIAZBf2ohBiADQcAAahDNKQwACwsgAigCDCEFIAIoAgghBgJAIAEtABANACADQQE6AEwgA0EANgJIIANCgICAgBA3AkAgBUEcbCECIANBNGogA0HAAGoQziACQANAIAJFDQEgA0E0ahCLFA0BIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0HAAGogASAGEMIBIANBNGogASADQSBqIANBwABqEMICIAJBZGohAiAGQRxqIQYgA0HAAGoQzSkMAAsLIAAgAykCNDcCACAAQQhqIANBNGpBCGooAgA2AgAMBwsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIAVBHGwhAiAGQWRqIQYgA0E0aiADQcAAahDOIAJAA0AgAkUNASADQTRqEIsUDQEgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiABIAYgAmoQwgEgA0E0aiABIANBIGogA0HAAGoQwgIgAkFkaiECIANBwABqEM0pDAALCyAAIAMpAjQ3AgAgAEEIaiADQTRqQQhqKAIANgIADAYLAkAgAigCBA0AIAJBDGooAgAiBCACQRBqKAIAQQN0IgZqIQggASgCACEHQQAhBSAEIQICQAJAA0AgBkUNASAFIAdLDQIgBkF4aiEGIAJBBGooAgAgAigCAGsgBWpBAWohBSACQQhqIQIMAAsLIAUgB0sNACADQQA2AhwgA0KAgICAwAA3AhQDQAJAAkACQCAEIAhGDQAgBEEIaiEHIAQoAgQhBSAEKAIAIQJBACEGA0AgBkEBcQ0DIAIgBUsNAyADQQA2AjBBASEGAkAgAkGAAUkNAEECIQYgAkGAEEkNAEEDQQQgAkGAgARJGyEGCyACIANBMGoQ5g0gA0EANgI8IANCgICAgBA3AjQgA0Hw04QBNgJEIANCoICAgA43AkggAyADQTRqNgJAIANBwABqIANBMGogBhCCBg0CIAJBgMADIAJBAWogAkH/rwNGGyACIAVPIgYbIQIgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQQE6ACwgA0EUaiADQSBqEOIRDAALCyABKAIIIAEtABAgA0EUahC9JiAAQQhqIANBFGpBCGooAgA2AgAgACADKQIUNwIADAoLQYysnAFBNyADQSBqQYjUhAFBkK2cARDqEgALIAchBAwACwsgAEGAgICAeDYCAAwGCyACQQxqKAIAIgggAkEQaigCAEEBdCIGaiEJIAEoAgAhCkEAIQUgCCECAkACQAJAAkADQCAGRQ0BIAUgCksNAiACQQFqLQAAIgQgAi0AACIHSQ0EIAJBAmohAiAGQX5qIQYgBCAHa0H/AXEgBWpBAWohBQwACwsgBSAKSw0AIANBADYCKCADQoCAgIDAADcCIAwBCyAAQYCAgIB4NgIADAcLA0ACQAJAIAggCUYNACAILQABIQcgCC0AACECQQAhBANAIARBAXENAiACQf8BcSIGIAdB/wFxIgVLDQJBAUEBEKknIgQgAjoAACADQQE6AEwgA0EBNgJIIAMgBDYCRCADQQE2AkAgBiAFTyEEIAIgBiAFSWohAiADQSBqIANBwABqEOIRDAALCyABKAIIIAEtABAgA0EgahC9JiAAQQhqIANBIGpBCGooAgA2AgAgACADKQIgNwIADAgLIAhBAmohCAwACwtBkNCEARDSLAALIAIoAgxBHGwhBiABLQAQIQggASgCDCEKIAIoAgghBUEEIQRBACECQQAhBwJAA0AgBkUNASACQYCAgIB4Rg0BIAMgBzYCKCADIAQ2AiQgAyACNgIgIANBwABqIAEgBRDCASADQTRqIAogCCADQSBqIANBwABqELkIIAZBZGohBiAFQRxqIQUgAygCNCECIAMoAjghBCADKAI8IQcgA0HAAGoQzSkMAAsLIAAgBzYCCCAAIAQ2AgQgACACNgIADAQLIAIoAgQhAgwACwsgACADKQI0NwIAIABBCGogA0E0akEIaigCADYCAAsgA0EUahDNKQsgA0HQAGokAAvUEgEMfyMAQYABayICJAACQCABLQA8RQ0AIAAgACgCHCAAKAIgIAFBJGoiAyABKAIEIAEoAggiBEEMbGoiBUF8aiAFQQxGGyADIAQbKAIAEPkT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FwQXFxcBFwIDAxcLIAAoAighAAwECyAAKAIIIQAMAwsgACgCDCEADAILIAAoAhAhAAwBCyAAKAIUIgANAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAgAOEwABAgMEBQYHCAkKCwwNDg8QERIACyADQRRqIQAgA0EQaiEBDBILIANBCGohACADQQRqIQEMEQsgA0EIaiEAIANBBGohAQwQCyADQRBqIQAgA0EMaiEBDA8LIANBCGohACADQQRqIQEMDgsgA0EMaiEAIANBCGohAQwNCyADQQxqIQAgA0EIaiEBDAwLIANBDGohACADQQhqIQEMCwsgA0EQaiEAIANBDGohAQwKCyADQRhqIQAgA0EUaiEBDAkLIANBDGohACADQQhqIQEMCAsgAygCBCIBQfwAaiEAIAFB+ABqIQEMBwsgA0EQaiEAIANBDGohAQwGCyADQRBqIQAgA0EMaiEBDAULIANBFGohACADQRBqIQEMBAsgA0EYaiEAIANBFGohAQwDCyADQRhqIQAgA0EUaiEBDAILAkACQAJAAkACQAJAAkACQCADKAIIDggAAQIDBAUGBwALIAMoAigiAUEoaiEAIAFBJGohAQwICyADKAIoIgFBNGohACABQTBqIQEMBwsgAygCDCIBQRBqIQAgAUEMaiEBDAYLIAMoAgwiAUEQaiEAIAFBDGohAQwFCyADKAIMIgFBBGohAAwECyADKAIMIgFBBGohAAwDCyADKAIMIgFBHGohACABQRhqIQEMAgsgAygCDCIBQcwAaiEAIAFByABqIQEMAQsgA0EMaiEAIANBCGohAQtBAC0AoPGeARogASgCACEFIAAoAgAhBkEwEH0iAEUNDEEALQCg8Z4BGkEwEH0iAUUNDCABQQA2AgggAUIBNwMAIAQgATYCACAAIAMpAwA3AwAgAEEIaiADQQhqKQMANwMAIABBEGogA0EQaikDADcDACAAQRhqIANBGGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBKGogA0EoaikDADcDAEEALQCg8Z4BGkEwEH0iAUUNDCABQQA2AhggASAGNgIUIAEgBTYCECABQQE2AgwgASAANgIIIAFCgICAgBA3AwAgBBDbASAEIAE2AgBBAEEIEJ4tIANBMEEIELMWDBELIAEgACgC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gICAeEYNACAAIAIpAkg3AgQgAEGMgICAeDYCACAAQQxqIAJB0ABqKAIANgIADAULAkACQCABEPEtDQAgAkHUAGogAkHEAGoQ3xAgAigCVEGAgICAeEYNASAAIAIpAlQ3AgQgAEGOgICAeDYCACAAQQxqIAJB3ABqKAIANgIADAYLIAIgATYCwAECQAJAIAEQ8S1FDQAgARAEIQEgAkEANgJ0IAIgATYCcCACQQA2AmwgAiACQcABajYCaCACQdABaiABQYCABCABQYCABEkbENofIAJBwAFqIQECQAJAA0AgAUUNASACQQhqIAJB6ABqEMkdIAIoAghBAXFFDQEgAigCDCEBIAIgAigCdEEBajYCdCACQeABaiABEM0BAkACQAJAIAIoAuABQZWAgIB4Rw0AIAIoAuQBIQEMAQsgAkGQAWpBCGogAkHgAWpBCGopAwA3AwAgAiACKQPgASIINwOQASAIpyIBQZaAgIB4Rw0BIAIoApQBIQELIABBlYCAgHg2AgAgACABNgIEIAJB0AFqEOUqDAULIAFBlYCAgHhGDQIgAkHQAWogAkGQAWoQ1hsgAigCaCEBDAALCyACQZWAgIB4NgKQAQsgAkGQAWoQoikgAEGUgICAeDYCACAAIAIpAtABNwIEIABBDGogAkHYAWooAgA2AgAMAQsgAkHgAWogARCmDCACKALgASEBAkACQAJAIAItAOQBIgNBfmoOAgIAAQsgAEGVgICAeDYCACAAIAE2AgQMAgsgAiADQQFxOgDUASACIAE2AtABIAJB6ABqQQAQ2h8CQAJAA0AgAkEQaiACQdABahDNESACKAIQIgNBAkYNASACKAIUIQECQAJAIANBAXENACACQeABaiABEM0BIAIoAuQBIQEgAigC4AEiA0GVgICAeEcNAQsgAEGVgICAeDYCACAAIAE2AgQgAkHoAGoQ5SoMAwsgAiACKQPoATcDmAEgAiABNgKUASACIAM2ApABIAJB6ABqIAJBkAFqENYbDAALCyACQZWAgIB4NgKQASACQZABahCiKSAAQZSAgIB4NgIAIABBDGogAkHwAGooAgA2AgAgACACKQJoNwIECyACKALQARDcKgwBCyAAIAJBwAFqELwiCyACKALAARDcKgwGCyABEOEtRQ0DEBMiAyABENQsIQQgAxDcKgJAIARFDQAgARAURQ0E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AhDRDyACKAIAIAJBBGooAgAQni0gAkEUQQQQsxYLIAFBPGoiAigCACABQcAAaigCABCAECABKAI4IAIoAgAQmy0gAUEoaiICKAIAIAFBLGooAgAQnyUgASgCJCACKAIAEKMtIAFByABBCBCzFgwCCwJAIAAoAgwiASkDCCIEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCABKAIgIgJFDQAgAhDRDyACKAIAIAJBBGooAgAQni0gAkEUQQQQsxYLIAEoAiQiAhDWAyACQeAAQQgQsxYgAUEwQQgQsxYMAQsCQCAAKAIMIgEpAwAiBEIDg0IAUg0AIASnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQxiQLIAFBIGoQ0BAgASgCICABQSRqKAIAEJ4tIAFBMEEIELMWCyAAQTBBCBCzFgunEAIIfwJ+IwBBsAFrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACLQDgASIEQbB/ag4CAQIACyAEQd0ARw0CIANB4ABqQQhqIAFBCGooAgA2AgAgAyABKQIANwNgIANBGGogAiADQeAAahChLAJAAkACQCADKAIYIgRBCEYNACADQRhqQQhqIQUgAygCOCECIARBAUcNASABKAIMIQEgA0HgAGpBCGogAkEIaigCADYCACADQeAAakEUaiACQRRqKAIANgIAIANB4ABqQSBqIAJBIGopAgA3AwAgA0HgAGpBKGogAkEoaikCADcDACADIAIpAgA3A2AgAyACKQIMNwJsIAMgAikCGDcDeCABKAIAIQYgAikCNCELIAIpAjwhDCACLwFEIQdByABBBBCaKiEBAkBBMEUNACABIANB4ABqQTD8CgAACyABIAc7AUQgASAMNwI8IAEgCzcCNCABIAY2AjAgA0HIAGpBCGogBUEIaikDADcDACADQcgAakEQaiAFQRBqKQMANwMAIAMgBSkDADcDSCACEIovQQEhBgwCCyADKAIcIQIgAEEJNgIAIAAgAjYCBAwMCyADLQA8IQYgA0HIAGpBCGogBUEIaikDADcDACADQcgAakEQaiAFQRBqKQMANwMAIANBxgBqIANBP2otAAA6AAAgAyADLwA9OwFEIAMgBSkDADcDSCADKAIcIQUgAiEBCyAAIAU2AgQgACAENgIAIAAgAykDSDcDCCAAIAY6ACQgACABNgIgIAAgAy8BRDsAJSAAQRBqIANB0ABqKQMANwMAIABBGGogA0HIAGpBEGopAwA3AwAgAEEnaiADQcYAai0AADoAAAwKCyADQeAAaiACIAEoAhAoAgAiBCAEIAFBABCMBAJAAkACQCADKAJgIgRBCEYNACADQeAAakEIaiEFIAMoAoABIQIgBA0BIAEoAgwhASADQRhqQQhqIAJBCGooAgA2AgAgA0EYakEUaiACQRRqKAIANgIAIANBGGpBIGogAkEgaigCADYCACADIAIpAgA3AxggAyACKQIMNwIkIAMgAikCGDcDMCABKAIAIQYgAikCKCELIAIpAjAhDCACKAI4IQcgAi0APCEIQcAAQQQQmiohAQJAQSRFDQAgASADQRhqQST8CgAACyABIAg6ADwgASAHNgI4IAEgDDcCMCABIAs3AiggASAGNgIkIANBmAFqQQhqIAVBCGopAwA3AwAgA0GYAWpBEGogBUEQaikDADcDACADIAUpAwA3A5gBIAIQiy9BASEGDAILIAMoAmQhAiAAQQk2AgAgACACNgIEDAsLIAMtAIQBIQYgA0GYAWpBCGogBUEIaikDADcDACADQZgBakEQaiAFQRBqKQMANwMAIANBlgFqIANBhwFqLQAAOgAAIAMgAy8AhQE7AZQBIAMgBSkDADcDmAEgAygCZCEFIAIhAQsgACAFNgIEIAAgBDYCACAAIAMpA5gBNwMIIAAgBjoAJCAAIAE2AiAgACADLwGUATsAJSAAQRBqIANBoAFqKQMANwMAIABBGGogA0GYAWpBEGopAwA3AwAgAEEnaiADQZYBai0AADoAAAwJCwJAIAIQ2AkiBEUNACAELQAAQf0ARg0CCyACLQDgASEECyAEQf8BcSIFQdEARg0BIAVB4gBGDQEgBUHtAEYNASAFQYABRg0CIAQQpRUNAyAAQQg2AgAMBQsgAhChCyACEKELIANBEGogAiABKAIQKAIAQQEQ0AEgAygCFCECAkAgAygCEEEBcQ0AIAEoAgwhBCACKAIAIQUgA0HgAGpBCGoiBiACQQxqKQIANwMAIANB8ABqIgcgAkEUaigCADYCACADIAIpAgQ3A2AgAi0ALSEIIAIoAhwhCSAEKAIAIQogAikCJCELIAIoAiAhBCACQTBBCBCzFiAE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+ARqIANB0AFqQRhqKQMANwMAIABB8ARqIANB0AFqQRBqKQMANwMAIABB6ARqIAMpA9gBNwMAIAAgAykD0AE3A+AEIAAgAykD8AE3AxAgAEEYaiADKQP4ATcDACAAQSBqIANB8AFqQRBqKQMANwMAIABBKGogA0HwAWpBGGopAwA3AwAMAgsgAEIANwMIIABCAjcDACAAQbEBNgIYIABBzImEATYCFCAAQSw2AhALIAIgAigCACIEQX9qNgIAIARBAUcNACACEO8SCyADQbAGaiQAC4cPAgZ/An4jAEHQAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4JAAECAwQFBgcIAAsCQCAAKAIMIgNFDQAgA0HIAGwhAwNAIANBuH9qIgMNAAsLIAAoAhwiA0UNByADIAEQixkMBwtBCCEDIABBCGogARCpAQJAAkACQAJAAkACQAJAAkACQCAAKAIIQX5qDgYADw8PAQIPCyAAKAIMIQBBACEEIAJBADYCECACQoCAgICAATcCCEEAIQUCQCAAKAIIIgZFDQAgACgCBCEDIAZBOGwhBANAIAMgAkEIahCdCyADQThqIQMgBEFIaiIEDQALIAIoAhAhBCACKAIMIQMgAigCCCEFCyABKQMQIghQRQ0CDAMLIAJBCGogACgCDCIDKQMAIANBEGooAgAQuR8gAigCECEDIAIpAwghCSABKQMQIghCAFINAyACQQhqIAFBMGogCSADQgAgAhCwBQwECyACQQhqIAAoAgwQ7SQgAigCECEDIAIpAwghCSABKQMQIghCAFINBCACQQhqIAFBMGogCSADQgAgAhCwBQwFCwJAIAhCA4NCAFINACAIpyIAIAAoAgAiAEEBajYCACAAQX9MDQ0LIAEoAhghAAsgAUEwaiIGIARBAWpBAXYgBCABKAI8GyABQcAAahDDJyACQSxqQgA3AgAgAkIANwIkIAIgADYCICACIAg3AxggAiADIARBBHRqNgIUIAIgBTYCECACIAM2AgwgAiADNgIIAkAgBEUNAANAAkACQCACKAIMIgMgAigCFEcNAEIAIQkMAQsgAiADQRBqNgIMIAMoAgghACADKQMAIQkLAkAgAikDGCIIUA0AIAIoAiAhAyAIQgODQgBSDQAgCKciASABKAIAIgFBAWo2AgAgAUF/TA0OCyACQThqIAYg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QQhqIgYgBDYCACADIAUpAgAiETcChAIgAyARNwP4ASAAQRxqIAEoAgQgASgCCBCKFCAAQRs2AgAgACADKQP4ATcCKCAAQTBqIAYpAwA3AgAgAEE4aiADQYgCaikDADcCAAwJCyADQYwCaiAFQQhqKAIAIgQ2AgAgA0H4AWpBCGoiBiAENgIAIAMgBSkCACIRNwKEAiADIBE3A/gBIABBHGogASgCBCABKAIIEIoUIABBGzYCACAAIAMpA/gBNwIoIABBMGogBikDADcCACAAQThqIANBiAJqKQMANwIADAcLIANB+AFqIAEQ3QYgA0EZNgKEASADQQU2AmggA0EoaiADQfgBaiADQegAaiADQYQBahCgDAJAAkACQAJAAkAgBSgCACIIIAEoAggiCUYNACABEPsPQSxHDQIgARDUJA0DIANBjAJqIAVBCGooAgA2AgAgA0H4AWpBCGoiBCADQRBqQQhqKAIANgIAIAMgAykDEDcD+AEgAyAFKQIANwKEAiAAQRxqIAEoAgQgCRCKFCAAQRo2AgAgACADKQP4ATcCKCAAQTBqIAQpAwA3AgAgAEE4aiADQYgCaikDADcCAAwBCyADQYwCaiAFQQhqKAIANgIAIANB+AFqQQhqIgQgA0EQakEIaigCADYCACADIAMpAxA3A/gBIAMgBSkCADcChAIgAEEcaiABKAIEIAgQihQgAEEaNgIAIAAgAykD+AE3AiggAEEwaiAEKQMANwIAIABBOGogA0GIAmopAwA3AgALQQEhBEEBIQgMCAsgAygCLCEKIAMoAigiBEEiRw0BQQAhC0EBIQxBACEEQQAhCAwECyABEPsPIQggAygCKCENAkAgCEH9AEcNACADKAIsIQoCQCANQSJHDQBBACEEQQEhDEEBIQtBACEIDAULAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAgCjYCBAwFCwJAAkACQCANQSJGIggNACADQShqQdTBhAEQsBNFDQEgBC0AZw0CAkBBwABFDQAgACADQShqQcAA/AoAAAtBACEIQQEhBAwJCyADKAIsIQoMBAsgAygCLCEBAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAgATYCBAwFCyADKAJEIAMoAkgQhy1BACEKDAILAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAg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FgwECyAAQQRqEOUBIAAoAggiAhC3HyACKAIAIAJBBGooAgAQny0gAkEUQQQQsxYMAwsgAEEEahDlASAAKAIIIgIQ3AMgAkHgAEEIELMWDAILIAApAwgiA0IDg0IAUg0BIAOnIgIgAigCACIBQX9qNgIAIAFBAUcNASACIAIoAhAQxiQMAQsCQAJAIAAoAgQiAigCAEEDRg0AIAJBIGoQ5QEgAhCWEgwBCyACQRBqEOUBIAJBBGoQ6R4gAigCBCACQQhqKAIAEJstIAIoAiAiAUUNACABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgsgAkEoQQgQsxYLIABBwABBCBCzFgvpDwEJfyMAQfAAayICJAACQAJAAkACQAJAAkADQAJAIAEoAgAiA0FXakEFSw0AA0BBAC0AoPGeARpBwAAQfSIERQ0HIARBADYCCCAEQjE3AwAgASgCBCEDIAEgBDYCBCACQQhqIgQgA0EIaikDADcDACACQRBqIgUgA0EQaikDADcDACACQRhqIgYgA0EYaikDADcDACACQSBqIgcgA0EgaikDADcDACACQShqIgggA0EoaikDADcDACACQTBqIgkgA0EwaikDADcDACACQThqIgogA0E4aikDADcDACACIAMpAwA3AwAgARC+ASABQThqIAopAwA3AwAgAUEwaiAJKQMANwMAIAFBKGogCCkDADcDACABQSBqIAcpAwA3AwAgAUEYaiAGKQMANwMAIAFBEGogBSkDADcDACABQQhqIAQpAwA3AwAgASACKQMANwMAIANBwABBCBCzFiABKAIAIgNBV2pBBkkNAAsLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQXRqIgRBByAEQSZJGw4mHgABAgMEBQYHCAkKCwwNHg4PEBESHhMTFB4eFRYXGBgZGxweHR4eCyABKAIMIgNFDR0gASgCCCEBIANBBHQhAwNAAkAgASgCAEECRg0AIAAgAUEMaigCABDmAQsgAUEQaiEBIANBcGoiAw0ADB4LCyABKAIMIgNFDRwgASgCCCEBIANBDGwhAwNAAkACQCABKAIAIgQNACABQQRqKAIAIAAQsgoMAQsgACAEEOYBCyABQQxqIQEgA0F0aiIDDQAMHQsLAkAgAS0AHEEC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CGooAgA2AgAgAiAFKQIANwOwASACQbABakEUaiACQcAAahDWJCIFQRRqKAIANgIAIAIgBSkCDDcCvAECQCADDQAgAkHIAmogAkEIakE4/AoAAAsgAkGIAmogAkHIAmogASgCBCIDIAQQ2gsgAkHIAWpBCGogAkGIAmpBEGopAgA3AwAgAkHIAWpBEGoiBSACQYgCakEYaikCADcDACACQcgBakEYaiIGIAJBqAJqKAIANgIAIAIgAikCkAI3A8gBIAIoAowCIQECQCACKAKIAiIHQSJGDQAgACACKQKsAjcCKCAAQcAAaiACQcQCaigCADYCACAAQThqIAJBvAJqKQIANwIAIABBMGogAkG0AmopAgA3AgAgAEEkaiAGKAIANgIAIABBHGogBSkDADcCACAAQRRqIAJB0AFqKQMANwIAIAAgAikDyAE3AgwgACABNgIIIAAgBzYCBCAAQYiAxAA2AgAgAkHAAGoQ8icMBAsCQEE4RQ0AIAJByAJqIAJBwABqQTj8CgAACyACQYgCaiACQcgCaiADIAQQ2gsgAkHoAWpBCGoiBiACQYgCakEQaikCADcDACACQegBakEQaiIHIAJBiAJqQRhqKQIANwMAIAJB6AFqQRhqIgggAkGoAmooAgA2AgAgAiACKQKQAjcD6AEgAigCjAIhBQJAIAIoAogCIglBIkYNACAAIAIpAqwCNwIoIABBwABqIAJBxAJqKAIANgIAIABBOGogAkG8AmopAgA3AgAgAEEwaiACQbQCaikCADcCACAAQSRqIAgoAgA2AgAgAEEcaiAHKQMANwIAIABBFGogBikDADcCACAAIAIpA+gBNwIMIAAgBTYCCCAAIAk2AgQgAEGIgMQANgIADAQLIAJB+ABqQQhqIAYpAwA3AwAgAkH4AGpBEGogBykDADcDACACQfgAakEYaiAIKAIANgIAIAJB+ABqQSRqIAJBsAFqQQhqKQMANwIAIAJBpAFqIAJBsAFqQRBqKQMANwIAIAIgAikD6AE3A3ggAiACKQOwATcClAECQCABIAVNDQAgAEEgaiADIAQQihQgAEKIgMSAIDcCACAAIAIpA7ABNwIsIABBNGogAkG4AWopAwA3AgAgAEE8aiACQcABaikDADcCAAwECyAAQQRqIgMgAikDyAE3AgAgA0EYaiACQcgBakEYaigCADYCACADQRBqIAJByAFqQRBqKQMANwIAIANBCGogAkHIAWpBCGopAwA3AgACQEE0RQ0AIABBJGogAkH4AGpBNPwKAAALIAAgBTYCICAAIAE2AgAMAwsgAEEEaiABEP4JIABBiIDEADYCAAsgAkEIahDyJwwBCyACQSxqIQUgAkEIakEEaiEDAkACQAJAAkAgAigCCCIHQf7///8HaiIGQQQgBkEESRsOBQEAAAIDAAsgAkGUAmogA0EIaikCADcCACACQZwCaiADQRBqKQIANwIAIAJBpAJqIANBGGopAgA3AgAgAkG0AmogBUEIaikCADcCACACQYgCakE0aiAFQRBqKAIANgIAIAIgBzYCiAIgAiADKQIANwKMAiACIAUpAgA3AqwCIAJByAJqQRBqIgUgAkGIAmoQ1iQiA0EQaikCADcDACACQcgCakEIaiIGIANBCGopAgA3AwAgAiADKQIANwPIAiAAQSBqIAEoAgQgBBCKFCAAQQE2AgQgACACKQPIAjcCLCAAQTRqIAYpAwA3AgAgAEE8aiAFKQMANwIAIABBiIDEADYCACACQYgCahDyJwwDCyAAQYGAxAA2AgAgACADKQIANwIEIABBHGogA0EYaikCADcCACAAQRRqIANBEGopAgA3AgAgAEEMaiADQQhqKQIANwIADAILIABBhYDEADYCACAAIAMpAgA3AgQgAEEcaiADQRhqKAIANgIAIABBFGogA0EQaikCADcCACAAQQxqIANBCGopAgA3AgAMAQsgACAHNgIEIABBhIDEADYCACAAIAMpAgA3AgggACAFKQIANwIoIABBEGogA0EIaikCADcCACAAQRhqIANBEGopAgA3AgAgAEEgaiADQRhqKQIANwIAIABBMGogBUEIaikCADcCACAAQThqIAVBEGooAgA2AgALIAJBgANqJAALyA8BDH8jAEEQayIDJABBACEEIAJBADYCAAJAIAEoAgAiBSABKAIEIgZLDQAgAkEEaiEHAkACQAJAAkACQAJAIAAoAigiCEUNACABLQAQQQFHDQELAkACQCACKAIQQQFHDQAgAigCFCEJIAIoAhgNASACKAIgIQUMBAsCQAJAIAEtABBBAUcNACAAKALUAiIJDQEQjTAhBAwICyAAKALQAiIJRQ0GCyAJIAAoAswCSw0CQQAhBCACKAIcQQAgAigCGBsiCCAA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QegBaikCADcCACAAQTRqIAJB4AFqKQIANwIAIAAgBDYCECAAIAg2AgwgACAJNgIIIAAgAikDUDcCFCAAQRxqIAYpAwA3AgAgAEEkaiAHKQMANwIAIAAgCjYCBCAAQYSAgIB4NgIADAULIAJB+ABqQQhqIAYpAwA3AwAgAkH4AGpBEGogBykDADcDACACIAIpA1A3A3ggAiABEPsPIgY2ApQBIAEQjQsaAkACQCAGQSlGDQAgBkE6Rw0BIAAgBDYCDCAAIAg2AgggACAJNgIEIAAgAikDeDcCECAAQRhqIAJB+ABqQQhqKQMANwIAIABBIGogAkH4AGpBEGopAwA3AgAgAkHEAWogA0EIaigCACIBNgIAIAJBsAFqQQhqIAE2AgAgAiADKQIAIgs3ArwBIAIgCzcDsAEgAkEIaiACQbABahCHHyACKAIMIQNBCBDxJyIBIAM2AgQgAUEANgIAIAAgATYCLCAAQYKAgIB4NgIAIAAgAikCIDcCMCAAQThqIAJBIGpBCGopAgA3AgAgAEHAAGogAkEgakEQaikCADcCAAwGCwJAIARFDQAgAkGsAWogA0EIaigCADYCACAAIAIpA3g3AhAgACAENgIMIAAgCDYCCCAAIAk2AgQgAEGDgICAeDYCACACQZgBakEIaiIBIAJBIGpBCGooAgA2AgAgAEEYaiACQfgAakEIaikDADcCACAAQSBqIAJB+ABqQRBqKQMANwIAIAIgAykCADcCpAEgAiACKQIgNwOYASAAQThqIAJBmAFqQRBqKQMANwIAIABBMGogASkDADcCACAAIAIpA5gBNwIoDAYLIABBIGogASgCBCAFEIoUIABChICAgLgDNwIAIAAgAikDODcCLCAAQTRqIAJBwABqKQMANwIAIABBPGogAkHIAGopAwA3AgAgCSAIEPYsDAULIAJBADYCsAEgAkGUAWpBvMKEASACQbABakHAwoQBELchAAsgAkGwAWogASAEEPIBIAIoArABIQECQEEoRQ0AIAJB0ABqIAJBtAFqQSj8CgAACwJAIAFBIkYNACAAIAIpAtwBNwIwIABBwABqIAJB7AFqKAIANgIAIABBOGogAkHkAWopAgA3AgACQEEoRQ0AIABBCGogAkHQAGpBKPwKAAALIABBhICAgHg2AgAgACABNgIEDAQLAkBBKEUNACAAIAJB0ABqQSj8CgAACyACQcQBaiADQQhqKAIAIgE2AgAgAkGwAWpBCGogATYCACACIAMpAgAiCzcCvAEgAiALNwOwASACIAJBsAFqEIcfIAIoAgQhA0EIEPEnIgEgAzYCBCABQQA2AgAgACABNgIsIAAgBToAKCAAIAIpAiA3AjAgAEE4aiACQSBqQQhqKQIANwIAIABBwABqIAJBMGopAgA3AgAMAwsgAkEANgKwASACQRxqQZi8hAEgAkGwAWpB0MKEARC3IQALIAJBsAFqQQhqIgMgAkEgakEIaigCADYCACACQcQBaiABKAIAIgRB2ABqKAIANgIAIAIgAikCIDcDsAEgAiAEKQJQNwK8ASAAQSBqIAEoAgQgASgCCBCKFCAAQSE2AgQgACACKQOwATcCLCAAQTRqIAMpAwA3AgAgAEE8aiACQcABaikDADcCACAAQYSAgIB4NgIADAELIABBIGogASgCBCAEEIoUIABChICAgNgCNwIAIAAgAikCIDcCLCAAQTRqIAJBKGopAgA3AgAgAEE8aiACQTBqKQIANwIACyACQfABaiQAC+MQAQp/IwBBwAFrIgMkAAJAAkAgASgCACIELQAUIgVBAkYNACAFQQFxDQAgACABKAIEIAEoAggQjBQgAEEAOgAkIAAgAikCHDcCDCAAQRRqIAJBJGopAgA3AgAgAEEcaiACQSxqKQIANwIADAELAkACQAJAAkACQAJAAkAgAigCAEGAgICAeHMiBUECIAVBAkkbDgMCAAECCyADQfAAaiACKAIIIAIoAgwQxAggAkEcaiEGDAILIAIoAhQhBSACKAIQIQcgA0GoAWogAigCBCACKAIIEL8FIANBtAFqIAcgBRC/BSADQZgBaiADKAKsASIHIAMoArABEK8MIAJBHGohBgJAAkAgAy0AmAFBAUYNAAJAIAMoApwBIggNAEEAIQUMAgsCQAJAIAggAygCoAEiCUHchogBQRAQ6yUNAAJAIAggCUHshogBQQYQ6yUNACADQZgBaiAIIAkQsAwgAy0AmAENA0EBIQUgAygCnAEiCkUNBCADQTBqIAogAygCoAEgAygCuAEiCyADKAK8ARD4DiADKAIwIgpFDQQgAygCNCEMQQMhBQwCCyADQZgBaiADKAK4ASILIAMoArwBEKETIAMtAJgBDQICQCADKAKcASIIRQ0AIAMoAqABIQlBAiEFDAILQQEhBQwDCyADQZgBaiADKAK4ASILIAMoArwBEJcMIAMtAJgBDQFBASEFIAMoApwBIghFDQIgAygCoAEhCQsgAyAMNgKAASADIAo2AnwgAyAJNgJ4IAMgCDYCdCADIAU2AnAgAygCtAEgCxDKLyADKAKoASAHEMovDAMLIAMtAJkBIQULIAMoArQBIAMoArgBEMovIAMoAqgBIAcQyi8MAgsgAigCBCEFIANBADYCtAECQAJAIAVBgAFPDQBBASEHDAELAkAgBUGAEE8NAEECIQcMAQtBA0EEIAVBgIAESRshBwsgAkEcaiEGIAUgA0G0AWoQ5g0gA0GYAWogA0G0AWogBxCMFCADQfAAaiADKAKcASIFIAMoAqABEMQIIAMoApgBIAUQyi8LIAMoAnAiBUEERw0BIAMtAHQhBQsgAyAFOgBkIANBgICAgHg2AmAMAQsgAygCeCEHIAMoAnQhCAJAAkACQAJAAkAgBQ4EAAECAwALIAggB0HokIkBQQ4Q6yUNAwJAIAggB0Gm4IgBQQsQ6yUNACADQfiVlQFBwQAgCCAHEJoPIANB8ABqIAMoAgAgAygCBBD3JgJAIAMoAnBBgICAgHhGDQAgA0HgAGpBCGogA0HwAGpBCGopAgA3AwAgAyADKQJwNwNgDAYLIANBgICAgHg2AmAgA0EAOgBkDAULIANB4ABqEJEuDAQLIANB4ABqIAggBxDxCAwDCyADQQhqQeS+jgFBqgEgCCAHEJoPIANB8ABqIAMoAgggAygCDBD3JgJAIAMoAnBBgICAgHhGDQAgA0HgAGpBCGogA0HwAGpBCGopAgA3AwAgAyADKQJwNwNgDAMLIANBgICAgHg2AmAgA0EBOgBkDAILIAMoAoABIQkgAygCfCELAkACQAJAAkACQAJAAkAgCCAHQfiGiAFBAxDrJQ0AIAggB0H7hogBQREQ6yUNASAIIAdBjIeIAUEWEOslDQIgCCAHQaKHiAFBDhDrJQ0DIAggB0Gwh4gBQQoQ6yUNBCADQYCAgIB4NgJgIANBADoAZAwICyADQZgBahDKI0HQfCEFA0AgBUUNBSALIAkgBUGM54oBaigCACAFQZDnigFqKAIAEOslDQYgBUEQaiEFDAALCyADQRBqQbycjwFBqgEgCyAJEJoPIANB8ABqIAMoAhAgAygCFBD3JgJAIAMoAnBBgICAgHhGDQAgA0HgAGpBCGogA0HwAGpBCGopAgA3AwAgAyADKQJwNwNgDAcLIANBgICAgHg2AmAgA0EBOgBkDAYLIANBGGpBgPSVAUENIAsgCRCaDyADQfAAaiADKAIYIAMoAhwQ9yYCQCADKAJwQYCAgIB4Rg0AIANB4ABqQQhqIANB8ABqQQhqKQIANwMAIAMgAykCcDcDYAwGCyADQYCAgIB4NgJgIANBAToAZAwFCyADQSBqQfjVlwFBDiALIAkQmg8gA0HwAGogAygCICADKAIkEPcmAkAgAygCcEGAgICAeEYNACADQeAAakEIaiADQfAAakEIaikCADcDACADIAMpAnA3A2AMBQsgA0GAgICAeDYCYCADQQE6AGQMBAsgA0EoakGYuZYBQRIgCyAJEJoPIANB8ABqIAMoAiggAygCLBD3JgJAIAMoAnBBgICAgHhGDQAgA0HgAGpBCGogA0HwAGpBCGopAgA3AwAgAyADKQJwNwNgDAQLIANBgICAgHg2AmAgA0EBOgBkDAMLIANBgICAgHg2AmAgA0EBOgBkIAMoApgBIAMoApwBEPcsDAILIAVBwANqIQdB3OOKASEFAkADQCAHRQ0BIANB8ABqIAUoAgggBSgCDBCNDSADQZgBaiADQfAAahDjHiADKAJwIAMoAnQQ9ywgB0FwaiEHIAVBEGohBQwACwsgA0HgAGpBCGogA0GYAWpBCGopAgA3AwAgAyADKQKYATcDYAwBCyADQeAAahCSLgsgA0E4aiABKAIEIAEoAgggBiADQeAAahDUEwJAIAMoAjhBgICAgHhHDQAgA0HwAGogBCACLQA0IANBOGpBBGoQpiQgAygCcCICQYCAgIB4Rg0AAkBBJEUNACAAQQRqIANB8ABqQQRqQST8CgAACyAAIAI2AgACQCADKAI4IgJBgICAgHhHDQAgAygCPCADKAJAEPcsDAILIAIgAygCPBCHLQwBC0EoRQ0AIAAgA0E4akEo/AoAAAsgA0HAAWokAAvbDgIhfwN+IwBBkAFrIgIkACABKAIEIQMgASgCACEEAkACQAJAAkACQAJAAkAgAS0AbEF9aiIFQQEgBUH/AXFBA0kbQf8BcQ4DAAECAAsgASgCUCEGIAEoAkwhByABKAJIIQgCQCABKQNAIiNCA4NCAFINACAjpyIFIAUoAgAiBUEBajYCACAFQX9MDQQLIAEtAFQhCUEDIQpBACELDAILIAEoAlQhCSABKAJQIQYgAkEwaiABQdgAahCpCCABKAJMIQcgASgCSCEIAkAgASkDQCIjQgODQgBSDQAgI6ciBSAFKAIAIgVBAWo2AgAgBUF/TA0DCyACQSJqIAJBxwBqLQAAOgAAIAIgAi8ARTsBICAJQQh2IQsgAi0ARCEKIAIoAkAhDCACKAI8IQ0gAigCOCEOIAIoAjQhDyACKAIwIRAMAQsgASgCTCEHIAEoAkghCCABKAJkIQ0gASgCYCEOAkAgASkDQCIjQgODQgBSDQAgI6ciBSAFKAIAIgVBAWo2AgAgBUF/TA0CCyABKAJcIQ8gASgCWCEQIAEpA1AiJKchBgJAICRCA4NCAFINACAGIAYoAgAiBUEBajYCACAFQX9MDQILICRCKIinIQsgJEIgiKchCUEFIQoLIAEoAnQhESABKAJwIRIgAkEkaiABQfwAahCqAiABLQCIASETAkACQCABKAJ4IhQNAEEAIRUMAQsQgCghFSAUKAIEIQUgFCgCECEWIBQoAgwhFyACQTBqIBQoAggiGEEEQQQQlQ8gAigCNCEZIAIoAjBBAUYNAiACKAI4IRoCQCAZRQ0AIBhBAnQhFCAaIRsgGSEcA0AgFEUNASAFKAIAIR0Q/CchHiACQTBqIB0QdgJAQeAARQ0AIB4gAkEwakHgAPwKAAALIBsgHjYCACAbQQRqIRsgFEF8aiEUIAVBBGohBSAcQX9qIhwNAAsLIBUgFjYCECAVIBc2AgwgFSAYNgIIIBUgGjYCBCAVIBk2AgALIAJBGGpBAmogAkEgakECai0AADoAACACQQhqQQhqIAJBJGpBCGooAgA2AgAgAiACLwEgOwEYIAIgAikCJDcDCCABKAKUASEUIAJBMGogASgCmAEiHUEIQSgQlQ8gAigCNCEcIAIoAjBBAUYNAiACKAI4IRkCQCAcRQ0AIB1BKGwhGyAZIQUgHCEeA0AgG0UNASACQTBqIBQQiAEgBUEgaiACQTBqQSBqKQMANwMAIAVBGGogAkEwakEYaikDADcDACAFQRBqIAJBMGpBEGopAwA3AwAgBUEIaiACQTBqQQhqKQMANwMAIAUgAikDMDcDACAbQVhqIRsgBUEoaiEFIBRBKGohFCAeQX9qIh4NAAsLQQYhBQJAAkAgAS0APCIUQQZHDQAMAQsgASgCDCEYIAEoAgghHgJAAkACQAJAIBRBfWoiBUEBIAVBA0kbQf8BcQ4DAAECAAsgASgCICEfIAEoAhwhFCABKAIYIRsCQCABKQMQIiRCA4NCAFINACAkpyIFIAUoAgAiBUEBajYCACAFQX9MDQULIAEtACQhIEEDIQVBACEhDAILIAEoAiQhICABKAIgIR8gAkEwaiABQShqEKkIIAEoAhwhFCABKAIYIRsCQCABKQMQIiRCA4NCAFINACAkpyIFIAUoAgAiBUEBajYCACAFQX9MDQQLIAJBHmogAkHHAGotAAA6AAAgAiACLwBFOwEcICBBCHYhISACLQBEIQUgAigCQCEBIAIoAjwhGiACKAI4IRYgAigCNCEXIAIoAjAhIgwBCyABKAIcIRQgASgCGCEbIAEoAjQhGiABKAIwIRYCQCABKQMQIiRCA4NCAFINACAkpyIFIAUoAgAiBUEBajYCACAFQX9MDQMLIAEoAiwhFyABKAIoISIgASkDICIlpyEfAkAgJUIDg0IAUg0AIB8gHygCACIFQQFqNgIAIAVBf0wNAwsgJUIoiKchISAlQiCIpyEgQQUhBQsgIUEIdCAgQf8BcXKtQiCGIB+thCElCyAAIAo6AGwgACAMNgJoIAAgDTYCZCAAIA42AmAgACAPNgJcIAAgEDYCWCAAIAc2AkwgACAINgJIIAAgIzcDQCAAIAM2AgQgACAENgIAIAAgAi8BGDsAbSAAIBU2AnggACARNgJ0IAAgEjYCcCAAQe8AaiACQRhqQQJqLQAAOgAAIAAgC0EIdCAJQf8BcXKtQiCGIAathDcDUCAAIBM6AIgBIAAgHTYCmAEgACAZNgKUASAAIBw2ApABIAAgHjYCCCAAIBg2AgwgACAkNwMQIAAgGzYCGCAAIBQ2AhwgACAlNwMgIAAgIjYCKCAAIBc2AiwgACAWNgIwIAAgGjYCNCAAIAE2AjggACAFOgA8IABBhAFqIAJBCGpBCGooAgA2AgAgACACKQMINwJ8IABBP2ogAkEcakECai0AADoAACAAIAIvARw7AD0gAkGQAWokAA8LAAsgGSACKAI4QbTymgEQjikACyAcIAIoAjhBtPKaARCOKQALsA8CD38CfiMAQeAAayIFJAAgBUHEAGogAxCvHyAFKAJIIQYgBSgCRCEHAkACQAJAAkACQAJAAkACQCAFLQBMQQFGDQBBAiEIDAELIAUtAE0hCQJAIAFB4ARqIgoQhi0NACAFQTBqIAogCUEDdkEQcWoiCikDACAKQQhqKQMAIAlB/wBxEJEWIAUpAzBCAYNQDQAgCa0hFEIEIRUMAgsgASAJai0AYCEICyAIQf8BcSEJAkACQCAHDgMEAAEECyAJQQZqIQkMAwsgAS0AWUEBcQ0BIAatIRRCAiEVCyAUQiCGIBWEIRQMAgsCQCAGIAEoAoAFKALcAk8NACAGQQZsIAlqQQxqIQkMAQsgASgChAUQ1xohCgwCCwJAIAkgAigCiAEiCkkNACAJIApBuOKDARCRFQALIAIoAoQBIAlBAnRqKAIAIgpBAE4NASAFIAI2AlwgBSABNgJYIAVB0ABqIAVB2ABqIAcgBiAIEIoBAkAgBSgCUEEFRw0AIAUoAlQhCgwCCyAFKQNQIRQLIBRCIIghFQJAAkACQAJAIBSnIgpBfWoiCUECIAlBAkkbDgMAAQIACyADKAIUELQjIQkMAgsgFacgAygCFBCxISEJDAELIAogFacQriEhCQsgACAJENMTNgIIIABCgoCAgBA3AgAMAQsCQCADKAIQIgggAygCFCIJRg0AIAFB4AJqIQYgCUF/aiEJIAEoAoQFIQsgASgCgAUhDCADKAIMIQ0gAygCCCEOQQAhDwJAAkACQAJAAkACQAJAA0AgCSANTw0DIApB////P3EgBiAOIAlqIhAtAAAiEWotAABqIgMgAigCfCIHTw0CAkACQCACKAJ4IANBAnRqKAIAIgdBAEgNAEEAIQMgByEKDAELIAUgAjYCSCAFIAE2AkQgBUEoaiAFQcQAaiAKIBFBCHQQgAEgBSgCLCEKIAUoAighAwsCQCADQQFxRQ0AIAAgCRC0IxDTEzYCCCAAQoKAgIAQNwIADAoLAkAgCkGAgIDAAEkNAAJAIApBgICAwABxDQAgCkGAgICABHENCSAKQYCAgIACcUUNASAAIBAtAAAgCRCxIRDTEzYCCCAAQoKAgIAQNwIADAsLQQAhEgJAIAwoAtwCQQFGDQAgCyACIAoQ9iEiAygCACADKAIEQQAQrxMhEgtBASEPIAlBAWohEwsgCCAJRg0BIAlBf2oiCSAETw0ACyAAQgI3AgAMCAsgCkH///8/cSEJAkACQAJAIAgNACABLQDfBEEBaiIHIAlqIgkgAigCfCIDTw0FQQAhAwJAIAIoAnggCUECdGooAgAiCUEATg0AIAUgAjYCSCAFIAE2AkQgBUEYaiAFQcQAaiAKIAdBEHRBAXIQgAEgBSgCHCEJIAUoAhghAwsCQCADQQFxRQ0AQQAQtCMhCQwCCyAJQYCAgMAAcUUNAkEAIRMMBwsgCSAGIA4gCEF/aiIEai0AACIHai0AAGoiCSACKAJ8IgNPDQVBACEDAkAgAigCeCAJQQJ0aigCACIJQQBODQAgBSACNgJIIAUgATYCRCAFQSBqIAVBxABqIAogB0EIdBCAASAFKAIkIQkgBSgCICEDCwJAIANBAXFFDQAgCBC0IyEJDAELAkAgCUGAgIDAAHFFDQAgCCETDAcLIAlBgICAgAJxRQ0BIAcgBBCxISEJCyAAIAkQ0xM2AgggAEKCgICAEDcCAAwICyAKQYCAgIAEcQ0FIA9BAXFFDQUgEyAITQ0FIABCAjcCAAwHCyADIAdB1OCDARCRFQALIAkgDUGU5oMBEJEVAAsgCSADQeTggwEQkRUACyAJIANB1OCDARCRFQALQQEhDyAMIAsgAiAJEM0jIRILIAAgEzYCCCAAIBI2AgQgACAPNgIADAELAkACQAJAAkACQAJAAkACQAJAAkAgCA0AIAEtAN8EQQFqIgcgCkH///8/cWoiCSACKAJ8IgNPDQJBACEDAkAgAigCeCAJQQJ0aigCACIJQQBODQAgBSACNgJIIAUgATYCRCAFQQhqIAVBxABqIAogB0EQdEEBchCAASAFKAIMIQkgBSgCCCEDCwJAIANBAXFFDQBBABC0IyEJDAULIAlBgICAwABxDQEMCAsgCEF/aiIHIAMoAgwiCUkNAiAHIAlBpOaDARCRFQALQQEhCkEAIQhBACEDIAEoAoAFKALcAkEBRg0HDAULIAkgA0Hk4IMBEJEVAAsgCkH///8/cSABIAMoAgggB2otAAAiBGotAOACaiIJIAIoAnwiA08NAUEAIQMCQCACKAJ4IAlBAnRqKAIAIglBAE4NACAFIAI2AkggBSABNgJEIAVBEGogBUHEAGogCiAEQQh0EIABIAUoAhQhCSAFKAIQIQMLAkAgA0EBcUUNACAIELQjIQkMAQsgCUGAgIDAAHENAiAJQYCAgIACcUUNBCAEIAcQsSEhCQsgACAJENMTNgIIIABCgoCAgBA3AgAMBQsgCSADQdTggwEQkRUAC0EBIQpBACEDIAEoAoAFKALcAkEBRg0CC0EBIQogASgChAUgAiAJEPYhIgkoAgAgCSgCBEEAEK8TIQMMAQtBACEKCyAAIAg2AgggACADNgIEIAAgCjYCAAsgBUHgAGokAAvoDQIQfwR+IwBB8ABrIgQkAAJAA0ACQAJAAkACQCABQSFJDQACQCADDQAgACABENsIDAILIAAgAUEDdiIFQagBbGohBiAAIAVB4ABsaiEHAkACQCABQcAASQ0AIAAgByAGIAUQ+g8hBQwBCyAAIQUgAEEMaigCACIIIAdBDGooAgAiCUkiCiAIIAZBDGooAgAiC0lzDQAgBiAHIAogCSALSXMbIQULIANBf2ohAyAFIABrIgZBGG4hBQJAIAJFDQAgAkEMaigCACAAIAVBGGxqQQxqKAIATw0ECyAFIAFJDQIMBQsgACABEJAECyAEQfAAaiQADwsgACAGaiIFQRBqIgYpAgAhFCAFQQhqIgcpAgAhFSAAKQIAIRYgACAFKQIANwIAIABBCGoiDCkCACEXIAwgFTcCACAAQRBqIg0pAgAhFSANIBQ3AgAgBSAWNwIAIAcgFzcCACAGIBU3AgAgBEEIaiIOIABBIGooAgA2AgAgBCAAKQIYNwMAIABBMGohBSAAQRhqIQogACABQRhsIg9qIRAgACkCKCEWIAAoAiQhEUEAIQZBACEHAkADQAJAIAUgEEkNACAPQVBqIQ8DQCAAIAZqIglBGGohBSAPIAZGDQMgAEEMaigCACELIAogB0EYbGoiCEEQaiISKQIAIRQgCEEIaiITKQIAIRUgBSAIKQIANwIAIAVBCGogFTcCACAFQRBqIBQ3AgAgCUE8aigCACEQIBIgCUEwaiIFQRBqKQIANwIAIBMgBUEIaikCADcCACAIIAUpAgA3AgAgByAQIAtJaiEHIAZBGGohBgwACwsgAEEMaigCACELIAogB0EYbGoiCEEQaiISKQIAIRQgCEEIaiITKQIAIRUgBUFoaiIJIAgpAgA3AgAgCUEIaiAVNwIAIAlBEGogFDcCACAFQQxqKAIAIQkgEiAFQRBqKQIANwIAIBMgBUEIaikCADcCACAIIAUpAgA3AgAgByAJIAtJaiEHIAZBGGohBiAFQRhqIQUMAAsLIABBDGooAgAhCCAKIAdBGGxqIgYpAgAhFCAGQQhqIgkpAgAhFSAFQRBqIAZBEGoiCikCADcCACAFQQhqIBU3AgAgBSAUNwIAIAkgDigCADYCACAGIAQpAwA3AgAgCiAWNwIAIAYgETYCDCAHIBEgCElqIgYgAU8NAiAAIAZBGGxqIgVBEGoiBykCACEUIAVBCGoiCCkCACEVIAApAgAhFiAAIAUpAgA3AgAgDCkCACEXIAwgFTcCACANKQIAIRUgDSAUNwIAIAUgFjcCACAIIBc3AgAgByAVNwIAIAAgBiACIAMQ7wEgASAGQX9zaiEBIAVBGGohACAFIQIMAQsgACAGaiIFQRBqIgYpAgAhFCAFQQhqIgcpAgAhFSAAKQIAIRYgACAFKQIANwIAIABBCGoiAikCACEXIAIgFTcCACAAQRBqIgwpAgAhFSAMIBQ3AgAgBSAWNwIAIAcgFzcCACAGIBU3AgAgBEEIaiIRIABBIGooAgA2AgAgBCAAKQIYNwMAIABBMGohBSAAQRhqIQogACABQRhsIg9qIRAgACkCKCEWIAAoAiQhDUEAIQZBACEHAkADQAJAIAUgEEkNACAPQVBqIQ8DQCAAIAZqIglBGGohBSAAQQxqKAIAIQsgDyAGRg0DIAogB0EYbGoiCEEQaiISKQIAIRQgCEEIaiITKQIAIRUgBSAIKQIANwIAIAVBCGogFTcCACAFQRBqIBQ3AgAgCUE8aigCACEQIBIgCUEwaiIFQRBqKQIANwIAIBMgBUEIaikCADcCACAIIAUpAgA3AgAgBkEYaiEGIAcgCyAQT2ohBwwACwsgAEEMaigCACELIAogB0EYbGoiCEEQaiISKQIAIRQgCEEIaiITKQIAIRUgBUFoaiIJIAgpAgA3AgAgCUEIaiAVNwIAIAlBEGogFDcCACAFQQxqKAIAIQkgEiAFQRBqKQIANwIAIBMgBUEIaikCADcCACAIIAUpAgA3AgAgByALIAlPaiEHIAZBGGohBiAFQRhqIQUMAAsLIAogB0EYbGoiBikCACEUIAZBCGoiCCkCACEVIAVBEGogBkEQaiIJKQIANwIAIAVBCGogFTcCACAFIBQ3AgAgCCARKAIANgIAIAYgBCkDADcCACAJIBY3AgAgBiANNgIMIAcgCyANT2oiBiABTw0BIAAgBkEYbGoiBUEQaiIHKQIAIRQgBUEIaiIIKQIAIRUgACkCACEWIAAgBSkCADcCACACKQIAIRcgAiAVNwIAIAwpAgAhFSAMIBQ3AgAgBSAWNwIAIAggFzcCACAHIBU3AgAgBkF/cyABaiEBIAVBGGohAEEAIQIMAAsLAAvXDgIJfwF+AkACQAJAAkACQAJAAkACQCAAKAIADggBAgMEBQYHAAELIAAoAgQiAUEIaiECAkACQCABKAIADQAgAikDACIKQgODQgBSDQEgCqciAiACKAIAIgNBf2o2AgAgA0EBRw0BIAIgAigCEBDGJAwBCyACEMgTCwJAIAEtAEUiAkEDRg0AAkAgAkECRw0AIAFBJGooAgAhAgJAIAEoAigiA0UNAANAIAIQhQcgAkE4aiECIANBf2oiAw0ACyABQSRqKAIAIQILIAEoAiAgAhCjLQwBCwJAIAEpAygiCkIDg0IAUg0AIAqnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQxiQLIAFBwABqELkPCyAAKAIEQdgAQQgQsxYPCwJAIAApAwgiCkIDg0IAUg0AIAqnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQxiQLIAAoAiAiBEEEaigCACECAkAgBCgCCCIDRQ0AA0AgAigCACIBEJIBIAFBwABBCBCzFiACQQxqIQIgA0F/aiIDDQALIARBBGooAgAhAgsgBCgCACACEJwtIARBEGooAgAhAgJAIAQoAhQiA0UNAANAIAIQvwMgAkHYAGohAiADQX9qIgMNAAsgBEEQaigCACECCyAEKAIMIAIQoi0CQCAEKAIwIgJFDQAgAhCSASACQcAAQQgQsxYLAkAgBCgCNCICRQ0AIAIQ0Q8gAigCACACQQRqKAIAEJ4tIAJBFEEEELMWCwJAIAQoAjgiBUUNACAFQQRqKAIAIQICQCAFKAIIIgNFDQADQCACKAIAIgEQtAIgAUHgAEEIELMWIAJBBGohAiADQX9qIgMNAAsgBUEEaigCACECCyAFKAIAIAIQny0gBUEUQQQQsxYLIARBHGooAgAhAAJAIAQoAiAiBkUNAEEAIQcDQCAAIAdBBHRqIgIoAgAiAxCSASADQcAAQQgQsxYCQCACKAIMIgVFDQAgBUEEaiIIKAIAIQICQCAFKAIIIgNFDQADQCACKAIAIgEQtAIgAUHgAEEIELMWIAJBBGohAiADQX9qIgMNAAsgCCgCACECCyAFKAIAIAIQny0gBUEUQQQQsxYLIAdBAWoiByAGRw0ACyAEQRxqKAIAIQALIAQoAhggABCbLSAEQcAAQQQQsxYPCwJAIAApAwgiCkIDg0IAUg0AIAqnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQxiQLIABBIGoQyQYPCyAAKAIEIgVBBGooAgAhAgJAIAUoAggiAUUNAANAIAIQrAcCQCACQTBqKAIAIgNFDQAgAxCSASADQcAAQQgQsxYLIAJBOGohAiABQX9qIgENAAsgBUEEaigCACECCyAFKAIAIAIQoy0gBUEcQQQQsxYPCyAAKAIEIgVBBGooAgAhAgJAIAUoAggiAUUNAANAIAIQrAcCQCACQTBqKAIAIgNFDQAgAxCSASADQcAAQQgQsxYLIAJBOGohAiABQX9qIgENAAsgBUEEaigCACECCyAFKAIAIAIQoy0gBUEYQQQQsxYPCwJAIAAoAgQiCSkDCCIKQgODQgBSDQAgCqciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCAJKAIgIgFFDQAgAUEEaigCACECAkAgASgCCCIDRQ0AA0AgAhDVFCACQTBqIQIgA0F/aiIDDQALIAFBBGooAgAhAgsgASgCACACEJ4tIAFBFEEEELMWCyAJQTxqKAIAIQYCQCAJKAJAIghFDQBBACEHA0AgBiAHQQR0aiICKAIAIgMQkgEgA0HAAEEIELMWAkAgAigCDCIFRQ0AIAVBBGoiBCgCACECAkAgBSgCCCIDRQ0AA0AgAigCACIBELQCIAFB4ABBCBCzFiACQQRqIQIgA0F/aiIDDQALIAQoAgAhAgsgBSgCACACEJ8tIAVBFEEEELMWCyAHQQFqIgcgCEcNAAsgCUE8aigCACEGCyAJKAI4IAYQmy0gCUEoaigCACECAkAgCSgCLCIDRQ0AA0AgAhDlAiACQThqIQIgA0F/aiIDDQALIAlBKGooAgAhAgsgCSgCJCACEKMtIAAoAgRByABBCBCzFg8LAkAgACgCBCIFKQMIIgpCA4NCAFINACAKpyICIAIoAgAiA0F/ajYCACADQQFHDQAgAiACKAIQEMYkCwJAIAUoAiAiAUUNACABQQRqKAIAIQICQCABKAIIIgNFDQADQCACENUUIAJBMGohAiADQX9qIgMNAAsgAUEEaigCACECCyABKAIAIAIQni0gAUEUQQQQsxYLIAUoAiQiAhC0AiACQeAAQQgQsxYgACgCBEEwQQgQsxYPCyAAKAIEIgIhAwJAIAIpAwAiCkIDg0IAUg0AIAqnIgMgAygCACIBQX9qNgIAAkAgAUEBRw0AIAMgAygCEBDGJAsgACgCBCEDCyACQSBqENAQIAIoAiAgAkEkaigCABCeLSADQTBBCBCzFgu7DgMKfwJ+AXwjAEGQAWsiBCQAIARBEGogASACQSsQjRgCQCAEKAIQIgVFDQAgASAFIAUgBCgCFCIGQSsQrB8iBxshASACIAYgBxshAgsCQAJAAkAgAkUNAAJAAkAgASACQd8AEKwfDQBBACEIIARB6ABqIAJBAEEBQQEQrAwgBCgCbCEFIAQoAmhBAUYNASAEQQA2AiAgBCAEKAJwIgk2AhwgBCAFNgIYIAEgAmohBwNAAkACQAJAAkACQAJAAkACQCABIAdGDQAgAUEBaiEFIAEtAAAiAkFQaiIGQf8BcUEKSQ0FIAJBn39qQf8BcUEaSQ0EIAJBv39qQf8BcUEaSQ0BIAUhASACQf8BcUHfAEYNCCAEKAIYIQIMBgsCQAJAAkAgAyADQX9qcUUNACADuBCzMCEQQQAhASAEKAIcIQoCQCAQIAi4okQAAAAAAACgP6KbIhBEAAAAAAAA8L9kRQ0AIBBEAAAAAAAA8EFjRQ0AIBCrIQELIARBMGogAUH8noIBEN0fIANBA3QiAkGgoYIBaigCACIGRQ0FIAggCCAGcCIBIAYgARsiBUkNBCACQZyhggFqNQIAIQ5BACECQQAhAQNAIAIgA2wgCiABai0AAGohAiAFIAFBAWoiAUcNAAsgBEEwaiACQayfggEQoiEgBEHoAGogCiAFaiAIIAVrIAZBvJ+CARDKGCAEKAJwIQsgBCgCbCEJIAQoAmghAgNAIAlFDQIgCyAJIAsgCUkbIQYCQAJAIAQoAjgiDEUNACAEKAI0IgcgDEECdGpBfGoiAUUNACABKAIARQ0BCyAEQTBqQQBBzJ+CARCiISAEKAI4IQwgBCgCNCEHCyAJIAZrIQkgAiAGaiENIAxBAnQhCEIAIQ9BACEBAkADQCAIIAFGDQEgByABaiIFIAU1AgAgDn4gD3wiDz4CACABQQRqIQEgD0IgiCEPDAALC0EAIQECQCALRQ0AA0AgASADbCACLQAAaiEBIAJBAWohAiAGQX9qIgYNAAsLIAQgATYCaCAHIAwgBEHoAGpBARCFCyANIQIMAAsLIAhBAXYhByAEKAIcIgogCGohCSADZ0EfcyEMIAhBAkkhA0F/IQEgCiECA0AgByABakF/Rg0CAkAgAw0AIAItAAAhBSACIAkgAWoiBi0AADoAACAGIAU6AAAgAUF/aiEBIAJBAWohAgwBCwsgASAHQfCunAEQkRUACyAEQSRqIARBMGoQoyEMDAsCQEEgIAxuIgEgDGxB/wFxQSBHDQAgBCAMOgA/IARBwABqIAogCCABQbyeggEQyhggBCAEQT9qNgJMIARB3ABqIAQoAkQiByAEKAJIIgkQtxoCQAJAIAQoAmBBAUcNACAEQQhqIAQoAmRB4OmbARDLGCAEQQA2AlggBCAEKQMINwJQIARB6ABqIAcgCRC3GgJAIAQoAmxBAUcNACAEQdAAaiAEKAJwEIMlIAQtAD9BH3EhBiAEKAJAIQUgBCgCWCEIIAQoAlQhCwNAIAdFDQMgBSAJIAcgCSAHSRsiA2ohDEEAIQIgAyEBAkADQCABRQ0BIAIgBnQgAUF/aiIBIAVqLQAAciECDAALCyALIAhBAnRqIAI2AgAgCEEBaiEIIAcgA2shByAMIQUMAAsLIARBADYCeCAEQQE2AmwgBEHorpsBNgJoIARCBDcCcCAEQegAakHg6ZsBEOkjAAsgBEEANgJ4IARBATYCbCAEQeiumwE2AmggBEIENwJwIARB6ABqQeDpmwEQ6SMACyAEQfAAaiAINgIAIAQgBCkCUDcDaCAEQSRqIARB6ABqEKMhDAwLIARBhAFqIAytIAitfiIPQgWIIA9CH4NCAFKtfKdBzJ6CARDdH0EAIQFBACECQQAhBQNAAkACQAJAIAggAUYNACAKIAFqLQAAIgcgAnQgBXIhBSACIAxqIgZB/wFxQR9LDQEgBiECDAILAkAgAkH/AXFFDQAgBEGEAWogBUHcnoIBEKIhCyAEQSRqIARBhAFqEKMhDA4LIARBhAFqIAVB7J6CARCiISAHQQAgAmt2IQUgBkFgaiECCyABQQFqIQEMAAsLIAJBSWohBgwDCyAEQQA2AnggBEEBNgJsIARB0JmcATYCaCAEQgQ3AnAgBEHoAGpBnJ+CARDpIwALQYyfggEQ3SEACyACQal/aiEGCyAFIQEgBCgCGCECIAZB/wFxIANB/wFxSQ0BCyAAQYCAgIB4NgIAIABBAToABCACIAkQ2CwMBgsCQCAIIAJHDQAgBEEYakH0mIIBEIoPIAQoAhwhCQsgCSAIaiAGOgAAIAQgCEEBaiIINgIgDAALCyAAQYCAgIB4NgIAIABBAToABAwDCyAFIAQoAnBB5JiCARCOKQALIABBgICAgHg2AgAgAEEAOgAEDAELIAAgBCkCJDcCACAAQQhqIARBJGpBCGooAgA2AgAgBCgCGCAKENgsCyAEQZABaiQAC5MOAhB/AX4jAEGAAWsiAyQAIAEoAgAiBEHQAGohBQJAAkAgBCgCUCIGIAEoAggiB0YNACAEKAJYIQggBCgCVCEJAkADQCABEPsPQT5GDQEgARD7DyEKAkACQAJAAkACQAJAIAQoAlAgBkcNACAEKAJUIAlHDQAgBCgCWCAIRg0BCyAKQaV/aiILQQRNDQEMAgsgCkHfAEYNAyAKQd///wBxQb9/akEaSQ0DIApBgAFJDQIgChCBCEUNAgwDC0EBIAt0QRVxDQILIApBLkYNASAKQd///wBxQb9/akEaSQ0BAkAgCkGAAUkNACAKEIEIDQJBAEEVIApB0KgESRsiCyALQQpyIgsgC0ECdEHsioIBaigCAEELdCAKQQt0IgtLGyIMIAxBBWoiDCAMQQJ0QeyKggFqKAIAQQt0IAtLGyIMIAxBA2oiDCAMQQJ0QeyKggFqKAIAQQt0IAtLGyIMIAxBAWoiDCAMQQJ0QeyKggFqKAIAQQt0IAtLGyIMIAxBAWoiDCAMQQJ0QeyKggFqKAIAQQt0IAtLGyIMQQJ0QeyKggFqKAIAQQt0Ig0gC0YgDSALSWogDGoiDEECdEHsioIBaiIOKAIAQRV2IQtBoQIhDQJAAkAgDEEoSw0AIA4oAgRBFXYhDSAMDQBBACEMDAELIA5BfGooAgBB////AHEhDAsCQCANIAtBAWpGDQAgCiAMayEMIA1Bf2ohDUEAIQoDQCAKIAtBmu+AAWotAABqIgogDEsNASANIAtBAWoiC0cNAAsLIAtBAXFFDQEMAgsgCkFQakEKSQ0BCyADQRhqIAEQpw0gAEEcaiABKAIEIAcQihQgAEETNgIAIAAgAykCGDcCKCAAQTBqIANBIGopAgA3AgAgAEE4aiADQShqKQIANwIADAQLIAEQjQsNAAsLAkACQAJAIAQoAlAiDyAHRg0AIAQpAlQhEyADIAEQ+w8iCjYCFCAKQT5HDQEgARCNCxogA0EIaiABKAIEIhAgByAGIA9B5MKEARDgESADKAIMIgENAiAAQRxqIBAgBxCKFCAAIAg2AjwgACAJNgI4IAAgBjYCNCAAIAg2AjAgACAJNgIsIAAgBjYCKCAAQRI2AgAMBAsgA0EYakEUaiAFQQhqKAIAIgQ2AgAgA0EYakEIaiIKIAQ2AgAgAyAFKQIAIhM3AiQgAyATNwMYIABBHGogASgCBCAHEIoUIABBFDYCACAAIAMpAxg3AiggAEEwaiAKKQMANwIAIABBOGogA0EoaikDADcCAAwDCyADQQA2AhggA0EUakHgwoQBIANBGGpB9MKEARC3IQALIANBGGogAygCCCABEIoUAkACQCAEKAIwDQAgAygCICEOIAMoAhwhDSADKAIYIREgBEF/NgIwAkAgBCgCPCIBDQBBACEBDAILIAQoAjghEkEAIQoDQAJAIAFBAUsNAAJAIA0gDiASIApBKGxqIgFBBGooAgAgAUEIaigCABDhIkH/AXEiC0UNACAKIAtB/wFGaiEBDAQLIANB6ABqIgogAUEcaikCADcDACADQdgAakEIaiILIAFBFGopAgA3AwAgAyABKQIMNwNYIANBGGpBHGogECAHEIoUIANBGGpBFGogCikDADcCACADQSRqIAspAwA3AgAgAyATNwJQIAMgDzYCTCADIAg2AkggAyAJNgJEIAMgBjYCQCADIAMpA1g3AhwgBCAEKAIwQQFqNgIwAkBBPEUNACAAQQRqIANBGGpBBGpBPPwKAAALIABBETYCACARIA0Qhy0MBQsgAUEBdiIFIApqIQsgCiALIA0gDiASIAtBKGxqIgxBBGooAgAgDEEIaigCABDhIkH/AXFBAUYbIQogASAFayEBDAALC0G4uYQBENIaAAsgAyATNwJ0IAMgDzYCcCADIAg2AmwgAyAJNgJoIAMgBjYCZCADQdgAaiANIA4QrxcgAyACNgJ8AkAgBCgCPCIKIAFJDQACQCAKIARBNGoiCygCAEcNACALEKgcCyAEKAI4IAFBKGxqIQsCQCAKIAFNDQAgCiABa0EobCIBRQ0AIAtBKGogCyAB/AoAAAsCQEEoRQ0AIAsgA0HYAGpBKPwKAAALIAQgCkEBajYCPCAEIAQoAjBBAWo2AjAgACACNgIoIAAgEzcCICAAIA82AhwgACAINgIYIAAgCTYCFCAAIAY2AhAgACAONgIMIAAgDTYCCCAAIBE2AgQgAEEiNgIADAILIAEgCkHIuYQBEJcVAAsgA0EYakEUaiAFQQhqKAIAIgQ2AgAgA0EYakEIaiIKIAQ2AgAgAyAFKQIAIhM3AiQgAyATNwMYIABBHGogASgCBCAGEIoUIABBFDYCACAAIAMpAxg3AiggAEEwaiAKKQMANwIAIABBOGogA0EoaikDADcCAAsgA0GAAWokAAv3DgIQfwN+IwBBoAFrIgIkAAJAAkACQAJAAkACQCABKAIEIgMgASgCDEYNACABKAIkIQQgASADQQxqNgIEIAMoAgQhBSABKAIQIQYCQAJAAkACQAJAAkACQAJAAkAgAygCACIHDQACQAJAAkACQAJAAkACQCAFKAIAIgNBe2oiB0EEIAdBBkkbDgYAAQIDBAUACyAFKAIUIQggBSgCECEJDAULIAVBCGpBEEEIIAUoAghBAkkbaigCACEHIAJBEGogBSgCKBDJAyAHIAIoAhQiCSAHIAlLGyEIIAcgCSAHIAlJGyEJDAQLIAUoAgwhCCAFKAIIIQkMAwsgBSgCRCEIIAUoAkAhCQwCCyAFKAJkIQggBSgCYCEJDAELIAUoAigiBygCNCEIIAcoAjAhCQsgA0F7ag4DAgQDAQsgAygCCCEKIAJBGGogBxDJAyAFIAIoAhwiAyAFIANLGyEIIAUgAyAFIANJGyEJIAEoAhQhAwJAAkACQCAGIAEoAhwoAgBBf2pHDQAgAygCiAJFDQIgAygCgAIiCyABKAIgKAIAIgxB3cvdnnlsQQ93Ig1xIQ4gDUEZdq1CgYKEiJCgwIABfiESIAMoAvwBIQ1BACEPA0AgDSAOaikAACITIBKFIhRCf4UgFEL//fv379+//358g0KAgYKEiJCgwIB/gyEUAkADQCAUUA0BIAwgDUEAIBR6p0EDdiAOaiALcWtBDGxqIhBBdGooAgBGDQQgFEJ/fCAUgyEUDAALCyATIBNCAYaDQoCBgoSIkKDAgH+DUEUNAyAOIA9BCGoiD2ogC3EhDgwACwsgAkG7gICAeDYCeCADIAkgCCACQfgAahDeIwwBCyAQQXxqKAIAIQ4gEEF4aigCACENIAJBuoCAgHg2AnggAyANIA4gAkH4AGoQ3iMLAkACQCABKAIYLQAAIg1BAUsNAAJAIAcoAgBBGkcNACACQegAaiAHQRRqKQIANwMAIAJB8ABqIAdBHGooAgA2AgAgAiAHKQIMNwNgIAcoAgghEEEAIQRBACELQQAhEQwCCyACQe2AgIB4NgJ4IAMgCSAIIAJB+ABqEN4jQQEhEUEFIQQgCSEOIAghEAwBCyACQfgAaiADQQMgBxBqIAIoAnwhDiACKAJ4Ig9BB0YNCCACQegAaiACQYwBaikCADcDACACQfAAaiACQZQBaigCADYCACACIAIpAoQBNwNgQQQhBCACKAKAASEQIAIoApgBIQsgAigCnAEhDEEAIRECQCAPQQRGDQAgDyEEDAELIAJB/4CAgHg2AnggAyAJIAggAkH4AGoQ3iMLQShBCBDdJyIDIBA2AgggAyAONgIEIAMgBDYCACADIAw2AiQgAyALNgIgIAMgAikDYDcCDCADQRRqIAJB4ABqQQhqKQMANwIAIANBHGogAkHwAGooAgA2AgBBAiEOQQAhBCANQQFLDQsgBygCAEEaRw0FIBFFDQogBykDCBDIIQwKCyACQQhqIAUQmgwgAigCDCEDIAIoAgghByACQb6AgIB4NgJ4IAcgAyACQfgAahDgGiEOQQEhAyABKAIUIgctAOABQaIBRw0DIAcgBxCaLBCnFwwDCyAFKQMIIhJCIIinIQogBSkDGCEUIBKnIRBBACEHQQEhDiAFKAIUIgshCCAFKAIQIgkhBEEAIQ0MBwsgBSgCKCENIAUpAiAhFCAFKAIcIQsgBSgCGCEEIAUoAhQhCiAFKAIQIRBBACEHQQEhDgwGCyACQSBqQRhqIAVBIGopAwA3AwAgAkEgakEQaiAFQRhqKQMANwMAIAJBIGpBCGogBUEQaikDADcDACACIAUpAwg3AyAgAkH4AGogASgCFEEDQQEgASgCGC0AAEEBSxsgBSgCKBBqIAIoAnwhDgJAIAIoAngiA0EHRg0AIAJBwABqQRhqIgggAkH4AGpBIGopAwA3AwAgAkHAAGpBEGoiCSACQfgAakEYaikDADcDACACQcAAakEIaiIKIAJB+ABqQRBqKQMANwMAIAIgAikDgAE3A0BBKEEIEN0nIgcgDjYCBCAHIAM2AgAgByACKQNANwMIIAdBEGogCikDADcDACAHQRhqIAkpAwA3AwAgB0EgaiAIKQMANwMAIAIoAiAhCSACKAIkIQggAigCKCEQIAIoAiwhCiACKAIwIQQgAigCNCELIAIpAzghFEEAIQ4CQCAFKAIAQXtqQQNJDQAgBRCpEAsMBgsgAkEgahC+HUEAIQMLAkACQAJAAkAgBSgCAEF7ag4DAQMCAAsgBRCpEAwECyAFKQMIEMghDAMLIAVBCGoQxCsMAgsgA0UNASAFQQhqELcsDAELIAcQqAMMBAsgBRCnLwsgBBDFKyABIAZBAWo2AhAgBCAONgIACyAAQQM2AgAMBAsgBRCnLwwCCyAHEIgvCyAFIRALIAAgDTYCMCAAIAc2AiggACAUNwMgIAAgCzYCHCAAIAQ2AhggACAKNgIUIAAgEDYCECAAIAg2AgwgACAJNgIIIAAgAzYCBCAAIA42AgAgASAGQQFqNgIQCyACQaABaiQAC6UNAgd/Bn4jAEEQayICJAAgAL0iCUL/////////B4MhCiAJQjSIpyEDQQAhBAJAIAlCAFkNACABQS06AABBASEECyADQf8PcSEDAkACQAJAAkACQAJAAkACQAJAAkAgCkIAUg0AIANFDQELIApCAFIgA0ECSXIhBSAKQoCAgICAgIAIhCAKIAMbIglCAoYhCyAJQgGDIQwCQAJAAkAgA0HLd2pBzHcgAxsiA0F/Sg0AIAlBmJGYASADQYWiU2xBFHYgA0F/R2siBiADaiIHQQR0IgNrKQMAQaCRmAEgA2spAwAgBiAHQbHZtX9sQRN2a0H8AGogAiACQQhqIAUQ5x4hDSACKQMIIQogAikDACEOIAZBAkkNASAGQT9PDQYgC0J/IAathkJ/hYNQRQ0GQQAhCAwCCyAJIANBwegEbEESdiADQQNLayIHQQR0IgZBuOaXAWopAwAgBkHA5pcBaikDACAHIANrIAdBz6bKAGxBE3ZqQf0AaiACIAJBCGogBRDnHiENIAIpAwghCiACKQMAIQ4gB0EWTw0FQQAhCAJAIAtCBYCnQXtsQQAgC6drRg0AIAxQDQQgDiALQgKEIAcQ2iStfSEODAYLIAsgBxDaJEUNBQwBCyAOIAx9IQ4gDFAgBXEhCAtBASEGDAILIAEgBGoiA0EALwCp5pcBOwAAIANBAmpBAC0Aq+aXAToAACAJQj+Ip0EDaiEDDAcLIAWtQn+FIAt8IAcQ2iRFDQFBASEIQQAhBgtBACEFQQAhAwNAIA5CCoAiDiAKQgqAIglYDQIgCCAJp0F2bEEAIAqna0ZxIQggA0EBaiEDIAVB/wFxRSAGcSEGIA1CCoAiC6dBdmwgDadqIQUgCSEKIAshDQwACwtBACEFAkACQCAOQuQAgCILIApC5ACAIgxWDQBBACEDIAohDCAOIQsgDSEJDAELIA1C5ACAIgmnQZx/bCANp2pBMUshBUECIQMLA0AgC0IKgCILIAxCCoAiClgNAiADQQFqIQMgCUIKgCINp0F2bCAJp2pBBEshBSAKIQwgDSEJDAALCyAIQQFxRQ0BA0AgCkIKgCIJp0F2bEEAIAqna0cNAiADQQFqIQMgBUH/AXFFIAZxIQYgDUIKgCILp0F2bCANp2ohBSAJIQogCyENDAALCyAJIAxRIAVyIQUMAQsgDSIJIApRIAxCAFIgCEEBc3JxQQRBBSAJQgGDUBsgBSAGQQFxGyAFIAVB/wFxQQVGG0H/AXFBBEtyIQULIAcgA2ohAwJAAkAgCSAFrUIBg3wiCUL//4P+pt7hEVgNAEERIQgMAQsCQCAJQv//mabqr+MBWA0AQRAhCAwBCwJAIAlC///og7HeFlgNAEEPIQgMAQsCQCAJQv+/yvOEowJYDQBBDiEIDAELAkAgCUL/n5SljR1YDQBBDSEIDAELAkAgCUL/z9vD9AJYDQBBDCEIDAELAkAgCUL/x6+gJVgNAEELIQgMAQsCQCAJQv+T69wDWA0AQQohCAwBCwJAIAlC/8HXL1gNAEEJIQgMAQsCQCAJQv+s4gRYDQBBCCEIDAELAkAgCUK/hD1YDQBBByEIDAELAkAgCUKfjQZYDQBBBiEIDAELAkAgCUKPzgBYDQBBBSEIDAELAkAgCULnB1gNAEEEIQgMAQsCQCAJQuMAWA0AQQMhCAwBC0ECQQEgCUIJVhshCAsgCCADaiEGAkACQCADQQBIDQAgBkERSA0BCwJAAkACQCAGQX9qIgNBEEkNACAGQQRqQQVJDQIgCEEBRw0BIAEgBGoiBUHlADoAASAFIAmnQTBqOgAAIAMgASAEQQJyIgVqEO0OIAVqIQMMBAsgCSABIAQgCGpBAWoiA2oQ5wwgASAEaiEFAkAgBkUNACAFIAVBAWogBvwKAAALIAUgBmpBLjoAAAwDCyAJIAEgCCAEaiIGaiIIQQFqEOcMIAEgBGoiBSAFLQABOgAAIAVBLjoAASAIQeUAOgABIAMgASAGQQJqIgVqEO0OIAVqIQMMAgsgASAEaiIDQbDcADsAAEECIAZrIQUgA0ECaiEDAkADQCAGRQ0BIANBMDoAACAGQQFqIQYgA0EBaiEDDAALCyAJIAEgCCAEaiAFaiIDahDnDAwBCyAJIAEgBGogCGoQ5wwgASAIIARqaiEFIAggBiAIIAZKGyAIayEDAkADQCADRQ0BIAVBMDoAACADQX9qIQMgBUEBaiEFDAALCyABIAYgBGoiA2pBruAAOwAAIANBAmohAwsgAkEQaiQAIAMLjg8CB38BfiMAQcAAayICJAACQAJAAkAgACgCACIDDQAgACgCECIARQ0BIABBp5mcAUEBEIIGIQQMAgsgACAAKAIMQQFqIgQ2AgwCQAJAAkACQAJAAkACQAJAAkAgBEH1A0kNACAAKAIQIgRFDQEgBEHM45cBQRkQggZFDQEMCAsCQAJAAkACQAJAIAAoAggiBSAAKAIEIgZJDQAgACgCECIERQ0BIARBvOOXAUEQEIIGDQwMAQtBASEEIAAgBUEBaiIHNgIIAkACQAJAAkACQAJAIAMgBWotAAAiCEG3f2oOBgIBAQEIBQALAkAgCEG+f2oOAgQDAAsgCEGof2oOAgcLAAsgACgCECIDRQ0EQQEhBCADQbzjlwFBEBCCBkUNBAwRCyAAIAEQ9QENECABDQYMDAsgAkEwaiAAQfMAEJsPAkAgAi0AMEEBRw0AIAItADEhAwJAIAAoAhAiAUUNAEEBIQQgAUHM45cBQbzjlwEgA0EBcSIFG0EZQRAgBRsQggYNEQsgACADOgAEDAsLIAIgAikDOCIJNwMIAkAgACgCAA0AIAAoAhAiAEUNDyAAQaeZnAFBARCCBiEEDBALIAJBMGogABDJBAJAIAIoAjANACACLQA0IQMCQCAAKAIQIgFFDQBBASEEIAFBzOOXAUG845cBIANBAXEiBRtBGUEQIAUbEIIGDRELIAAgAzoABAwLCyACQRBqQQhqIAJBMGpBCGopAgA3AwAgAiACKQIwNwMQIAAoAhAiBEUNDCACQRBqIAQQ6AINDSAAKAIQIgNFDQwgCVANDCADKAIIQYCAgARxDQxBASEEIAMoAgBB4aucAUEBIANBBGooAgAoAgwRCwANDyACQQhqIAAoAhAQ8BENDyAAKAIQIgMoAgBB4qucAUEBIANBBGooAgAoAgwRCwBFDQwMDwtBASEEIAAgARCaCw0ODAsLAkAgByAGTw0AIAAgBUECajYCCCADIAdqLQAAIgNBv39qQf8BcUEaSQ0CIANBn39qIQRBgIDEACEDIARB/wFxQRpJDQILIAAoAhAiBEUNACAEQbzjlwFBEBCCBg0LC0EAIQQgAEEAOgAEIABBADYCAAwMC0EBIQQgACABEPUBDQsCQCAAKAIADQAgACgCECIBRQ0LIAFBsN2XAUECEIIGDQwgACgCAA0AQQAhBCAAKAIQIgBFDQwgAEGnmZwBQQEQggYhBAwMCyACQTBqIABB8wAQmw8CQCACLQAwQQFHDQAgAi0AMSEDAkAgACgCECIBRQ0AQQEhBCABQczjlwFBvOOXASADQQFxIgUbQRlBECAFGxCCBg0NCyAAIAM6AAQMBwsCQCAAKAIADQAgACgCECIARQ0LIABBp5mcAUEBEIIGIQQMDAsgAikDOCEJIAJBMGogABDJBAJAIAIoAjANACACLQA0IQMCQCAAKAIQIgFFDQBBASEEIAFBzOOXAUG845cBIANBAXEiBRtBGUEQIAUbEIIGDQ0LIAAgAzoABAwHCyACQSBqQQhqIAJBMGpBCGopAgA3AwAgAiACKQIwNwMgAkACQAJAAkAgA0GAgMQARg0AAkAgACgCECIERQ0AIARB6+OXAUEDEIIGDQ4LIANBwwBGDQEgA0HTAEYNAiACIAM2AjAgACgCECIERQ0DIAJBMGogBBDjCQ0NDAMLIAIoAiQgAigCLHJFDQsgACgCECIDRQ0LQQEhBCADQbDdlwFBAhCCBg0OIAAoAhAiA0UNCyACQSBqIAMQ6AJFDQsMDgsgACgCECIERQ0BIARB7uOXAUEHEIIGDQsMAQsgACgCECIERQ0AIARB9eOXAUEEEIIGDQoLIAAoAhAhAyACKAIkIAIoAixyRQ0FIANFDQhBASEEIANB4KucAUEBEIIGDQsgACgCECIDRQ0IIAJBIGogAxDoAg0LIAAoAhAhAwwFCyACQTBqIABB8wAQmw8gAi0AMEEBRw0CIAItADEhAwJAIAAoAhAiAUUNAEEBIQQgAUHM45cBQbzjlwEgA0EBcSIFG0EZQRAgBRsQggYNCwsgACADOgAEDAULIAAoAhAiA0UNBUEBIQQgA0Gw3ZcBQQIQggZFDQUMCQsgAEEBOgAEDAMLIAAQ6RsLAkAgACgCECIDRQ0AQQEhBCADQcyBnAFBARCCBg0HCyAAEP8CDQQCQCAIQc0ARg0AAkAgACgCECIERQ0AIARB+eOXAUEEEIIGDQYLQQEhBCAAQQAQ9QENBwsgACgCECIDRQ0DQQEhBCADQcuBnAFBARCCBkUNAwwGCyADRQ0CQQEhBCADQbiDnAFBARCCBg0FIAAoAhAhAyACIAk3AzAgA0UNAiACQTBqIAMQ5iwNBSAAKAIQIgNFDQJBASEEIANBqZmcAUEBEIIGRQ0CDAULQQAhBCAAQQA2AgAMBAsCQCAAKAIQIgNFDQBBASEEIANBzIGcAUEBEIIGDQQLQQEhBCAAEMkIQQFxDQMgACgCECIDRQ0AQQEhBCADQcuBnAFBARCCBg0DC0EAIQQgACgCAEUNAiAAIAAoAgxBf2o2AgwMAgtBASEEDAELQQAhBAsgAkHAAGokACAEC9AOAgl/CH4jAEGQAWsiASQAAkACQCAAKAIEIgJBzABqLQAAIgNBB0YNACAAKAIAIQRBACEFAkACQEEALQCo8J4BRQ0AQQAoAqzwngEiBUH/////B0kNAUHs9ZgBENMaAAtBAEEBOgCo8J4BQQBBATYCsPCeAUEAQbjkmAE2ArTwngFBAEEANgKs8J4BC0EAIAU2AqzwngECQCACKAIAQQJGDQAgBEE0aiIFEOQlIAIoAgAhAyABQRRqIAIoAgggAigCDBCvFyABIAM2AhAgBEE4aiEDIAFBEGoQ2QUhCiABIAFBEGo2AowBAkAgBCgCQA0AIAMgBEHIAGoQ9gYaCyABIAM2AlwgASABQYwBajYCWCABQQhqIAQoAjggBCgCPCAKIAFB2ABqQRsQ3wkCQAJAIAEoAghBAXFFDQAgBCgCOCIDIAEoAgwiBmoiBy0AACEIIAFBEGpBCGopAgAhCyABKQIQIQwgByAKQhmIpyIJOgAAIAMgBCgCPCAGQXhqcWpBCGogCToAACAEIAQoAkRBAWo2AkQgBCAEKAJAIAhBAXFrNgJAIAMgBkEEdGtBcGoiAyAMNwIAIANBCGogCzcCAAwBCyABKAIUIAEoAhgQ2CwLIAUQ+yQgAkHMAGotAAAhAwsgAUHIAGpCADcDACABQcAAakIANwMAIAFBOGpCADcDACABQgA3AzAgAULzytHLp4zZsvQANwMoIAFCg9+R85bM3LfkADcDICABQuHklfPW7Nm87AA3AxggAUL1ys2D16zbt/MANwMQIAFBEGogAxCfECACKAIUIQMgAUEQaiACKAIYIgUQshEgAyAFIAFBEGoQjxQgAUEQaiACKAIAIgNBAkcQnxACQCADQQJGDQAgAUEQaiADEJ8QIAJBCGooAgAgAkEMaigCACABQRBqENUKCyACKAIgIQMgAUEQaiACKAIkIgUQshEgAyAFIAFBEGoQ6h8gAigCLCEDIAFBEGogAigCMCIFELIRIAMgBSABQRBqEMsMIAIoAjghCSABQRBqIAIoAjwiAxCyESADQQZ0IQhBACEFAkADQCAIIAVGDQEgCSAFaiIDQTxqLQAAIAFBEGoQly0gA0EEaigCACEGIAFBEGogA0EIaigCACIHELIRIAYgByABQRBqEI8UIANBDGogAUEQahC+ISABQRBqIANBJGoiBigCACIDQYCAgIB4RxC/JgJAIANBgICAgHhGDQAgBiABQRBqEL4hCyAFQcAAaiEFDAALCyACKAJEIQggAUEQaiACKAJIIgMQshEgCCADQRxsaiEJAkADQCAIIAlGDQEgCCgCBCEGIAFBEGogCCgCCCIDELIRIAYgA0EMbGohBwJAA0AgBiAHRg0BIAYoAgQhAyABQRBqIAYoAggiBRCyESAFQRRsIQUCQANAIAVFDQEgAygCDCABQRBqEM4QIAMoAhAgAUEQahDOECADQQRqKAIAIANBCGooAgAgAUEQahDVCiAFQWxqIQUgA0EUaiEDDAALCyAGQQxqIQYMAAsLIAhBEGooAgAgCEEUaigCACABQRBqENUKIAFBEGogCC0AGBCfECABQRBqIAgtABkQnxAgCEEcaiEIDAALCyABKQNAIQogATUCSCELIAFB2ABqQRBqIgUgAUEQakEQaikDADcDACABQdgAakEIaiIDIAFBEGpBCGopAwA3AwAgAUHYAGpBGGoiBiAKIAtCOIaEIgogAUEQakEYaikDAIU3AwAgASABKQMQNwNYIAFB2ABqEP0NIAMgAykDAELuAYU3AwAgASABKQNYIAqFNwNYIAFB2ABqEOAIIAUgBSkDACIKQt0BhTcDACAGKQMAIQsgAykDACEMIAEpA1ghDSABQdgA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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4iAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gIQALIAJBAjYCHCACQYjshwE2AhggAkIBNwIkIAJBCzYCFCACQaS/nAE2AhAgAiACQRBqNgIgIAEgAyACQRhqEJUpIQEMIQsgAkEANgIoIAJBATYCHCACQcjshwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMIAsgAkEANgIoIAJBATYCHCACQYzthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHwsgAkEANgIoIAJBATYCHCACQcDthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHgsgAkEANgIoIAJBATYCHCACQeDthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHQsgAkEANgIoIAJBATYCHCACQYDuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHAsgAkEANgIoIAJBATYCHCACQaDuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGwsgAkEANgIoIAJBATYCHCACQcTuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGgsgAkEANgIoIAJBATYCHCACQYDvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGQsgAkEANgIoIAJBATYCHCACQaTvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGAsgAkEANgIoIAJBATYCHCACQezvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFwsgAkEANgIoIAJBATYCHCACQZDwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFgsgAkEANgIoIAJBATYCHCACQbjwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFQsgAkEANgIoIAJBATYCHCACQdDwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFAsgAkEANgIoIAJBATYCHCACQfjwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEwsgAkEANgIoIAJBATYCHCACQaTxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEgsgAkEANgIoIAJBATYCHCACQcDxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEQsgAkEANgIoIAJBATYCHCACQeTxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEAsgAkEANgIoIAJBATYCHCACQYTyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDwsgAkEANgIoIAJBATYCHCACQazyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDgsgAkEANgIoIAJBATYCHCACQdDyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDQsgAkEANgIoIAJBATYCHCACQejyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDAsgAkEANgIoIAJBATYCHCACQYDzhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCwsgAiAAQQRqKAIANgIMIAJBAjYCHCACQcTzhwE2AhggAkIBNwIkIAJBCzYCFCACIAJBEGo2AiAgAiACQQxqNgIQIAEgAyACQRhqEJUpIQEMCgsgAkEANgIoIAJBATYCHCACQZD0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCQsgAkEANgIoIAJBATYCHCACQcj0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCAsgAkEANgIoIAJBATYCHCACQez0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBwsgAkEANgIoIAJBATYCHCACQZz1hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBgsgAkEANgIoIAJBATYCHCACQfj1hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBQsgAkEANgIoIAJBATYCHCACQeT2hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBAsgAkEANgIoIAJBATYCHCACQfD3hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAwsgAkEANgIoIAJBATYCHCACQZj4hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAgsgAkEANgIoIAJBATYCHCACQcD4hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAQsgAkEANgIoIAJBATYCHCACQYz5hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQELIAJBMGokACABC6YNAgl/AX4jAEHgAWsiAyQAIANCBDcCNCADQgA3AiwgA0KAgICAwAA3AiQgA0EANgJAIAMgATYCPCADQaABakEIaiEEIANBoAFqQQRqIQUgA0HUAGpBBGohBiADQTBqIQcCQANAIAJBBGoiASgCACEIQdgAIQkCQAJAAkACQAJAIAIoAgAODAQEBAQEBAQDAAECAgQLQSghCQwCC0EwIQkMAQtBDCEJCyADQaABaiADQTxqIAggCWoQ7QogAygCoAEiCUEiRg0AAkBBPEUNACAAQQRqIANBoAFqQQRqQTz8CgAACyAAIAk2AgAMAgsgASgCACEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBeWoOBQAFAQYECAsgASABKAIAQYiAxABGIglBAnRqIQEDQAJAAkAgCUEBcUUNACADQaABaiADQTxqIAFBCGoQ7QogAygCoAEiCEEiRg0BIAMpAqwBIQwgAygCqAEhASADKAKkASEJQSxFDQ0gA0HkAGogA0G0AWpBLPwKAAAMDQsCQAJAAkAgASgCAEGAgLx/aiIIQQIgCEEISRsOCAMDAwMDAwABAwsgASgCBEHYAGohCAwBCyABQRBqIQgLIANBoAFqIANBPGogCBDtCiADKAKgASIIQSJGDQAgAykCrAEhDCADKAKoASEBIAMoAqQBIQlBLEUNDCADQeQAaiADQbQBakEs/AoAAAwMCyADQZABaiAJIAEQqw4CQCADKAKQAUEERg0AIAQgAykCkAE3AgAgBEEIaiADQZABakEIaikCADcCACADQQhqIANBkAFqEKAUIAMgATYCpAEgAyAJNgKgASADKAIMIQEgAygCCCEJIAcgA0GgAWpBlIGIARDBFwwBCyADQaABaiAJIAEgA0E8ahCSJQJAIAMoAqABIghBIkYNACADKQKsASEMIAMoAqgBIQEgAygCpAEhCUEsRQ0MIANB5ABqIANBtAFqQSz8CgAADAwLIAMoAjQgAygCOCIJQRhsakFoaiEBA0ACQCAJDQBBACEBDAULIAEoAgAiCEECRg0DIAlBf2ohCSABQQRqKAIAIQogA0GQAWogAUEIahDDEwJAIAMoApABQQRGDQAgAyAJNgI4IARBCGogA0GQAWpBCGopAgA3AgAgBCADKQKQATcCACADIANBkAFqEKAUIAMgCjYCpAEgAyAINgKgASADKAIEIQEgAygC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IQoLIAJBCGpBACkDgIWeASINNwMAIAJBGGogDTcDACACQQApA/iEngEiDTcDACACIA03AxAgBkE4bCEDIAJBEGohCQNAAkACQCAAKAIAQQlHDQAgAEEIaiACEP0DDAELIAAgAhD7AgsgAEE4aiEAIANBSGoiAw0ACwsCQCAFKAIIIghFDQBBACEAIAVBADYCCEEAIQMCQAJAA0ACQCAFKAIEIABqIgQoAgBBBkcNACAEQQRqKAIAIgctAEENAiAHLQBADQAgAkEgaiAHKQMoIAdBOGooAgAQuR8gAiACQSBqELUMIQcCQCACKQMgIg1CA4NCAFINACANpyIGIAYoAgAiC0F/ajYCACALQQFHDQAgBiAGKAIQEMYkCyAHRQ0CCyAAQThqIQAgCCADQQFqIgNHDQALQQAhBgwBCyAEEPEFQQEhBiADQQFqIAhGDQAgAEE4aiEEIANBf3MgCGohB0EBIQYDQAJAAkACQCAFKAIEIgMgBGoiACgCAEEGRw0AIABBBGooAgAiCy0AQQ0BIAstAEANACACQSBqIAspAyggC0E4aigCABC5HyACIAJBIGoQtQwhAwJAIAIpAyAiDUIDg0IAUg0AIA2nIgsgCygCACIMQX9qNgIAIAxBAUcNACALIAsoAhAQxiQLIANFDQEgBSgCBCEDCyADIAZBSGxqIARqIgMgACkDADcDACADQTBqIABBMGopAwA3AwAgA0EoaiAAQShqKQMANwMAIANBIGogAEEgaikDADcDACADQRhqIABBGGopAwA3AwAgA0EQaiAAQRBqKQMANwMAIANBCGogAEEIaikDADcDAAwBCyAAEPEFIAZBAWohBgsgBEE4aiEEIAdBf2oiBw0ACwsgBSAIIAZrNgIICyACELQKIAkQuwwgCg0BIAUoAgghBiAFKAIEIQALIAZFDQAgBkE4bCEFQQAhBANAAkAgACAEaiIDKAIAQQlHDQAgA0EIaigCAEERRw0AIANBEGooAgBBB0cNACADQRRqKAIALQBFQQNGDQAgAyABEKALCyAFIARBOGoiBEcNAAsLIAJBMGokAAvWDQICfwF+IwBB4ABrIgIkAAJAAkACQAJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQXRqDiUAExMEExMTEwEIEwkTEwUMExMTAhMTExMTExMTExMTExMTExMDEwsgAkEIakEEQQFBARCVDyACKAIMIQMgAigCCEEBRg0PIAIoAhAhASAAQQQ2AgggACABNgIEIAAgAzYCACABQfTQpZsHNgAADBMLIAEoAggOAwQRBQQLIAEtABxBAkcNAgwQCyABKAIEIgEoAgAiA0EDRg0GIAMOAwoJCwoLIAEtABxBAkYNDgsgAkEANgIoIAJCgICAgBA3AiAgAkH8rZsBNgIMIAJCoICAgA43AhAgAiACQSBqNgIIIAFBCGogAkEIahDrIg0LIAAgAikCIDcCACAAQQhqIAJBIGpBCGooAgA2AgAMDgsgAkHQAGogASgCKBChAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQayumwE2AgggAkICNwIUIAJBzAStQiCGIAFBEGqthDcDKCACQaAHrUIghiACQcAAaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQ7QkgAigCQCACKAJEENgsDA0LIAJBCGogASgCKBChAgJAAkAgAigCCEGAgICAeEYNACACQTBqQQhqIAJBCGpBCGooAgA2AgAgAiACKQIINwMwDAELIAJBADYCOCACQoCAgIAQNwMwCyACQdAAaiABKAIMEKECAkACQCACKAJQQYCAgIB4Rg0AIAJBwABqQQhqIAJB0ABqQQhqKAIANgIAIAIgAikCUDcDQAwBCyACQQA2AkggAkKAgICAEDcDQAsgAkECNgIMIAJBrK6bATYCCCACQgI3AhQgAkGgB61CIIYiBCACQcAAaq2ENwMoIAIgBCACQTBqrYQ3AyAgAiACQSBqNgIQIAAgAkEIahDtCSACKAJAIAIoAkQQ2CwgAigCMCACKAI0ENgsDAwLAkAgASgCCA0AIAJBATYCDCACQcSumwE2AgggAkIBNwIUIAJBzAStQiCGIAFBEGqthDcDICACIAJBIGo2AhAgACACQQhqEO0JDAwLIAJBIGogASgCDBChAgJAAkAgAigCIEGAgICAeEYNACACQdAAakEIaiACQSBqQQhqKAIANgIAIAIgAikCIDcDUAwBCyACQQA2AlggAkKAgICAEDcDUAsgAkEBNgIMIAJBxK6bATYCCCACQgE3AhQgAkGgB61CIIYgAkHQAGqthDcDQCACIAJBwABqNgIQIAAgAkEIahDtCSACKAJQIAIoAlQQ2CwMCwsgAS0AGEEFRw0JCyABKAIQIQEMAAsLIAEoAggNBiACQQA2AiggAkKAgICAEDcCICACQfytmwE2AgwgAkKggICADjcCECACIAJBIGo2AgggAUEQaiACQQhqEOsiDQUgACACKQIgNwIAIABBCGogAkEgakEIaigCADYCAAwHCyAAQYCAgIB4NgIADAYLIAJB0ABqIAEoAiAQoQICQAJAIAIoAlBBgICAgHhGDQAgAkHAAGpBCGogAkHQAGpBCGooAgA2AgAgAiACKQJQNwNADAELIAJBADYCSCACQoCAgIAQNwNACyACQQI2AgwgAkGsrpsBNgIIIAJCAjcCFCACQcwErUIghiABQQhqrYQ3AyggAkGgB61CIIYgAkHAAGqthDcDICACIAJBIGo2AhAgACACQQhqEO0JIAIoAkAgAigCRBDYLAwFCyACQQhqIAEoAiAQoQICQAJAIAIoAghBgICAgHhGDQAgAkEwakEIaiACQQhqQQhqKAIANgIAIAIgAikCCDcDMAwBCyACQQA2AjggAkKAgICAEDcDMAsgAkHQAGogASgCBBChAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQayumwE2AgggAkICNwIUIAJBoAetQiCGIgQgAkHAAGqthDcDKCACIAQgAkEwaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQ7QkgAigCQCACKAJEENgsIAIoAjAgAigCNBDYLAwECyADIAIoAhBBwLycARCOKQALQYysnAFBNyACQdAAakGUrpsBQZCtnAEQ6hIAC0GMrJwBQTcgAkHQAGpBlK6bAUGQrZwBEOoSAAsgAEGAgICAeDYCAAsgAkHgAGokAAuHDAINfwJ+IwBBwABrIgQkAAJAA0ACQAJAAkACQCABQSFJDQACQCADDQAgACABEJsHDAILIAAgAUEDdiIFQcQBbGohBiAAIAVB8ABsaiEHAkACQCABQcAASQ0AIAAgByAGIAUQ9QwhBQwBCyAAIQUgACgCBCIIIAcoAgQiCUkgACgCACIKIAcoAgAiC0kgCiAL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EL8bDwsgAEEEaiABEKooDwsCQCAAKAIEIgAoAgBBA0cNACAAQQRqIAEQ2BcPCyAAIAEQkSYLC6wNAQx/IwBBgAJrIgMkAEECIQQCQAJAIAItAJEBQSBxDQAMAQsgASgCDCEFIAEoAgghBiABKAIEIQcgASgCACEBIAIoAogBIQggA0EYaiACEN0BIAIgAigCiAFBAXIQqBICQAJAAkACQAJAAkACQAJAAkACQCABLQAADQAgBygCACIJLQAIIgpBBkYNASAKQQVHDQEgAigC7AEhCyACKALoASEKIANBEGogCSgCACIJEMkDIApBAUcNACALIAMoAhBHDQAgCUGmupwBQQUQoSVFDQAgA0HYAWogAiAGKAIAELsCIAMoAtwBIQoCQCADKALYASIJQYGAgIB4Rw0AIANBAzoAqAEgAyAKNgKkAQwICyADQawBakEgaiADQdgBakEgaikCADcCACADQawBakEYaiADQdgBakEYaikCADcCACADQawBakEQaiADQdgBakEQaikCADcCACADIAMpAuABNwK0ASADIAo2ArABIAMgCTYCrAEgCUGAgICAeEYNAEEBIQQgA0GsAWoQmyIhAQwICyADQQhqIAIQzgcgAygCDCEKIAMoAghBAXENBSACEKELIAItAOABIQkCQAJAAkACQAJAAkAgAS0AACIBDQAgCUUNAQsCQAJAIAlBaWoOBAEDAwYACyAJQbt/akECSQ0FIAlB9QBGDQAgCUGeAUcNAgsCQCAHKAIAIgQtAAgiAUEGRg0AIAFBBUYNBAtBoKacAUEoQaDamwEQ0h4ACyADQdgBaiACIAUtAAAQnS8gAygC3AEhBSADKALYASIJQYCAgIB4Rg0BIAMoAuABIQsgBygCACIBLQAIIQQgAUEGOgAIIARBBkYNBSABKAIEIQwgASgCACEHAkACQCAEQQVHDQAgBygCAEEwRg0BCyACKALUASENIAYoAgAhBiADQdQBakECaiIOIAFBCWoiAUECai0AADoAACADQgA3AvABIANBAzoA7AEgA0EANgLoASADQgA3AvgBIANCADcC4AEgA0KAgICAwAA3AtgBIAMgAS8AADsB1AFBCEHAABCeLCIBRQ0HIAEgBDoAGCABIAw2AhQgASAHNgIQIAEgCzYCDCABIAU2AgggASAJNgIEIAFBFzYCACABIAMvAdQB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IA1BKGogAkEwakEoaikDADcDACANQSBqIAJBMGpBIGopAwA3AwAgDUEYaiACQTBqQRhqKQMANwMAIA1BEGogAkEwakEQaikDADcDACANQQhqIAJBMGpBCGopAwA3AwAgDSACKQMwNwMAQQUhEAwBCyABQSxqKAIAIREgAUEoaigCACESAkACQCABQTBqKQMAIh1QDQAgAUE8aigCACETIAFBOGooAgAhDyABQdQAaigCACEUIAFB0ABqKAIAIRUCQCAdQgODQgBSDQAgHaciECAQKAIAIhBBAWo2AgAgEEF/TA0HCyABQcwAaigCACEWIAFByABqKAIAIRcgAUHAAGopAwAiHqchDgJAIB5CA4NCAFINACAOIA4oAgAiEEEBajYCACAQQX9MDQcLIB5CIIinIRgMAQsgAUHEAGooAgAhGCABQcAAaigCACEOIAFBOGopAwAiHachDwJAIB1CA4NCAFINACAPIA8oAgAiEEEBajYCACAQQX9MDQYLIB1CIIinIRNCACEdC0EEIRACQCANQQRGDQACQAJAAkACQAJAIAEoAgAiEA4EAAECAwALIAkgAUEIahDyAwwDCyABQQhqKAIAIRkgAUEUaigCACEaIAFBEGooAgAhGwJAAkAgAUEEaigCACINQQFHDQAQ+ichASACQTBqIBkQQiABQThqIAJBMGpBOGopAwA3AwAgAUEwaiACQTBqQTBqKQMANwMAIAFBKGogAkEwakEoaikDADcDACABQSBqIAJBMGpBIGopAwA3AwAgAUEYaiACQTBqQRhqKQMANwMAIAFBEGogAkEwakEQaikDADcDACABQQhqIAJBMGpBCGopAwA3AwAgASACKQMwNwMAQQEhDQwBCyABQQxqKAIAIRwgGSEBCyACIBo2AhwgAiAbNgIYIAIgHDYCFCACIAE2AhAgAiANNgIMDAILEP8nIQ0gAkEwaiABQQRqKAIAEO0BAkBBoAFFDQAgDSACQTBqQaAB/AoAAAsgAiANNgIMDAELIAFBEGopAgAhHiABQRhqKQIAIR8gCiABQQRqEJgKIAIgHzcDICACIB43AxggAiABQSBqKQIANwMoCyACQTBqQQhqIAhBCGopAgA3AwAgAkEwakEQaiAIQRBqKQIANwMAIAIgCCkCADcDMCACKAIUIRkgAigCECEaIAIoAgwhGwsgCCACQTBqQRBqKQMANwMAIAkgAkEwakEIaikDADcDACACIAIpAzA3AwggGK1CIIYgDq2EIR4gE61CIIYgD62EIR8gGSEOIBohDyAbIQ0LIAYgC2oiASAQNgIAIAFBDGogDjYCACABQQhqIA82AgAgAUEEaiANNgIAIAFBEGogAikDCDcDACABQRhqIAkpAwA3AwAgAUEgaiAIKQMANwMAIAFB1ABqIBQ2AgAgAUHQAGogFTYCACABQcwAaiAWNgIAIAFByABqIBc2AgAgAUHAAGogHjcDACABQThqIB83AwAgAUEwaiAdNwMAIAFBLGogETYCACABQShqIBI2AgAgC0HYAGohCyAMQX9qIgwNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJB0AFqJAAPCyAFIAIoAjhBtPKaARCOKQsAC40MAg1/AX4jAEEwayICJAAgASgCeCEDAkACQAJAAkAgASgCbCIEIAEoAmgiBUYNAAJAIAUtAAAiBkH7AEYNAAJAIAZBPEcNACABIANBAWoiBzYCeCABIAVBAWoiBjYCaEESIQggBCAGRg0EIAYtAABBL0cNBCABIANBAmoiBzYCeCABIAVBAmo2AmhBPCEIDAQLIAFB6ABqIQkgAkEANgIMIAJCgICAgBA3AgRBACEGIAMhCgNAAkACQCAFLAAAIgRBf0wNACAEQf8BcSEFDAELIAUtAAFBP3EhCyAEQR9xIQwCQCAEQV9LDQAgDEEGdCALciEFDAELIAtBBnQgBS0AAkE/cXIhCwJAIARBcE8NACALIAxBDHRyIQUMAQsgC0EGdCAFLQADQT9xciAMQRJ0QYCA8ABxciEFCwJAAkACQAJAAkAgBUFEag4DCAQBAAsCQCAFQYV/ag4DCAQCAAsgBUGAgMQARw0DDAcLQQAtAKDxngEaIAEoAnghC0EQEH0iBEUNASAEQQY2AgwgBEG7m5oBNgIIIARBBzYCBCAEQbSbmgE2AgAgAkECNgIkIAIgBDYCICACQrGAgIAoNwMYIAEgCyACQRhqEI8sDAILQQAtAKDxngEaIAEoAnghC0EQEH0iBEUNACAEQQo2AgwgBEHIm5oBNgIIIARBBzYCBCAEQcGbmgE2AgAgAkECNgIkIAIgBDYCICACQrGAgIAoNwMYIAEgCyACQRhqEI8sDAELAAsCQAJAAkACQAJAAkACQAJAIAYNAEF/IQQgBUF3aiILQRdLDQFBASALdCILQY2AgARxDQMgC0EScUUNAQwECyAFQXdqQQVJDQIgBUEgRg0CDAELIAVB2L9/akECSQ0CCwJAIAVBgAFPDQAgBiEEDAILIAUQuxVFDQILIAEoAnghBAsgBUEmRg0BIAQhBgsgCRCHCgwBCyABIAEoAnAiBSABKAJ0ajYCbCABIAUgASgCeCABKAJ8IgZraiILNgJoIAJBBGogBSAKIAZraiALENcgIAJBGGogARBVAkACQCACKAIYIgVBgIDEAEYNACACKAIgIQYgAigCHCELIAJBBGogBRCSCiABKAJ4IQogCyAGENgsDAELIAJBGGoQ/iILIAQhBgsgASgCaCIFIAEoAmxHDQAMAwsLIAEgA0EBaiIHNgJ4IAEgBUEBajYCaEECIQgMAgsgAS0AKCEFQaMBIQggAyEHDAILIAEgASgCcCIFIAEoAnRqNgJsIAEgBSABKAJ4IAEoAnwiBGsiBmoiDDYCaCAGIAMgBGsiCWshBiAFIAlqIQkCQAJAIAIoAgwiCw0AIAEoAoQBIgVBCGogCSAGEOQDIQ8MAQsgAkEEaiAFIAogBGtqIAwQ1yAgAigCBCEEIAEoAoQBIgVBCGogAigCCCIKIAIoAgwQ5AMhDyAEQYCAgIB4Rg0AIAQgChDYLAsgAiAFQQhqIAkgBhDkAzcDKCACIA83AyAgAkEENgIYIAEgAkEYahCUBSABIAM2AiACQCALDQAgAigCBCACKAIIENgsCyABKAJ4IQdBygAhCAsgByEFAkAgASgCMEGAgICAeEYNACABKAJEIQQgAUEANgJEIAJBADYCFCACIAFBPGo2AgwgAiAENgIQIAIgASgCQCIFNgIEIAIgBSAEQRhsIgtqIg02AggCQCAERQ0AIAFBMGohDiABKAI4IgZBBXQhCQNAIAJBGGpBEGoiCiAFQRBqKQMANwMAIAJBGGpBCGoiDCAFQQhqKQMANwMAIAIgBSkDADcDGAJAIAYgDigCAEcNACAOQYiamgEQ6R0LIAVBGGohBSABKAI0IAlqIgQgAikDGDcDACAEQRBqIAopAwA3AwAgBEEIaiAMKQMANwMAIARBHGpBADoAACAEQRhqIAM2AgAgASAGQQFqIgY2AjggCUEgaiEJIAtBaGoiCw0ACyACIA02AgQLIAJBBGoQyQkgASgCeCEFCyABIAU2AiQgASAIOgArIAEgAS0AKCIFOgApCyAAIAU6AAkgACAIOgAIIAAgBzYCBCAAIAM2AgAgAkEwaiQAC9AMAhR/A34jAEHQAGsiAiQAIAAoAgAhAwJAAkAgASgCACIEQayugwFBDiABKAIEIgUoAgwiBhELAA0AIAMoAhQiByADKAKwAiIBdiEIIAFBH3EhCSADKAIQIQogAygCrAIhC0EAIQwCQAJAA0ACQAJAAkACQCAMIAhGDQAgAiADIAwQ4h8iFjcDACAMRQ0BIBZC////////flgNAiAEQcSvgwFBAiAGEQsADQcMAwtBASENIARBuJOcAUEBIAYRCwANByADKAIgIgBFDQUgAygCHCEBIABBAnQhDkF/IQADQCABKAIAIQ8CQAJAIABBAWoiEA0AIAJBAjYCNCACQYyvgwE2AjAgAkIBNwI8IAJB+AA2AhQgAiAPNgJIIAIgAkEQajYCOCACIAJByABqNgIQIAQgBSACQTBqEN8FDQkMAQsgAiAANgIMIAJBAzYCNCACQayvgwE2AjAgAkICNwI8IAJB+AA2AhwgAkH4ADYCFCACIA82AkggAiACQRBqNgI4IAIgAkHIAGo2AhggAiACQQxqNgIQIAQgBSACQTBqEN8FDQgLIAFBBGohASAQIQAgDkF8aiIODQAMBgsLIARByK+DAUECIAYRCwANBQwBCyAEQcavgwFBAiAGEQsADQQLQQEhDSACQQE2AkQgAkHMr4MBNgJAIAJBATYCNCACQZy/nAE2AjAgAkEBNgI8IAJB+AA2AhQgAiAMNgJIIAIgAkEQajYCOCACIAJByABqNgIQIAQgBSACQTBqEN8FDQQCQCACKQMAQoCAgICAgH9RDQAgAkECNgI0IAJB6K+DATYCMCACQgE3AjwgAkGwATYCFCACIAJBEGo2AjggAiACNgIQIAQgBSACQTBqEN8FDQULIARB+MiYAUECIAYRCwANBCALIAwgCXQiAGoiASALSQ0BAkAgASAHSw0AIAxBAWohDCAKIABBA3RqIgAgC0EDdGohEUEAIQ9BACEOQQAhEgNAAkACQAJAIAAgEUcNACAYIRcgFCETDAELIBghFyABIRAgFCETA0AgDiEBIAApAwAhFgJAAkAgD0EBcUUNACAXIBZRDQEgF0KAgICAgIACVA0AIABBCGohAEEBIQ8gAUEBaiEOIAEhFCAWIRgMBAsgASEUIBYhGCAWIRcgASETC0EBIQ8gAUEBaiEOIAEhECAAQQhqIgAgEUcNAAsLAkAgD0EBcUUNAEEAIQ8gESEAIAEhECAXQv///////wFWDQELQQEhDSAEQbiTnAFBASAGEQsARQ0DDAcLAkAgEkUNACAEQeKemgFBAiAGEQsADQcLIBdCK4inIRUCQAJAIBNB/wFxIBBB/wFxRg0AIAIgEzoALyACIBA6AAwgAkEDNgIUIAJB/NeDATYCECACQgM3AhwgAkH4ADYCRCACQbEBNgI8IAJBsQE2AjQgAiAVNgJIIAIgAkEwajYCGCACIAJByABqNgJAIAIgAkEMajYCOCACIAJBL2o2AjAgBCAFIAJBEGoQ3wVFDQEMCAsgAiATOgAMIAJBAjYCNCACQdDWgwE2AjAgAkICNwI8IAJB+AA2AhwgAkGxATYCFCACIBU2AkggAiACQRBqNgI4IAIgAkHIAGo2AhggAiACQQxqNgIQIAQgBSACQTBqEN8FDQcLAkAgF0KAgICAgIABg1ANACAEQfivgwFBBSAGEQsADQcLIBJBAWohEiAXQv///////wCDIhZQDQAgAkECNgI0IAJB6K+DATYCMCACQgE3AjwgAkGyATYCTCACIBY3AxAgAiACQcgAajYCOCACIAJBEGo2AkggBCAFIAJBMGoQ3wVFDQAMBgsLCyABIAdBzK2DARDhLAALIAAgAUHMrYMBEOIsAAsgAkECNgI0IAJByK6DATYCMCACQgE3AjwgAkH4ADYCFCACIAg2AkggAiACQRBqNgI4IAIgAkHIAGo2AhAgBCAFIAJBMGoQ3wUNASACQQI2AjQgAkHoroMBNgIwIAJCATcCPCACQfgANgIUIAIgAygCJCgC3AI2AkggAiACQRBqNgI4IAIgAkHIAGo2AhAgBCAFIAJBMGoQvykNASACQQA2AkAgAkEBNgI0IAJB+K6DATYCMCACQgQ3AjggBCAFIAJBMGoQvykhDQwBC0EBIQ0LIAJB0ABqJAAgDQuUDAEKfyABQQA6ADwgASgCICECIAFBADYCIAJAIAJFDQAgASgCHCEDA0AgA0EMaigCACEEIAMoAgAiBRC+ASAFQcAAQQgQsxYCQCAERQ0AIAQQtx8gBCgCACAEQQRqKAIAEJ8tIARBFEEEELMWCyADQRBqIQMgAkF/aiICDQALCwJAIAEoAggiA0UNACABKAIEIQQgA0EMbCEDA0AgACAEKAIAEOYBIARBDGohBCADQXRqIgMNAAsLAkAgASgCFCIGRQ0AIAEoAhAiBSEEQQAhAwJAA0BBMCEHQTUhCAJAAkACQAJAAkACQAJAIAQoAgAiAkF8akEAIAJBe2pBCEkbDgkEAgEDBgUGBgAGCyAEQcUAai0AAEUNBQwEC0EgIQdBJyEICyAEIAhqLQAADQIgBCAHaigCACgCGEGAgICAeEcNAwwCCyAEQckAai0AAA0BIARBxQBqLQAADQEMAgsgBEEgaigCAEGAgICAeEcNAQsgBBClBUEBIQkgA0EBaiAGRg0CIANBf3MgBmohAkEBIQlBASEHA0BBMCEKQTUhCwJAAkACQAJAAkACQAJAAkAgBEHYAGoiAygCACIIQXxqQQAgCEF7akEISRsOCQQCAQMFBgUFAAULIARBnQFqLQAADQUMBAtBICEKQSchCwsgBCALakHYAGotAAANAyAEIApqQdgAaigCACgCGEGAgICAeEYNAwwCCyAEQaEBai0AAA0CIARBnQFqLQAARQ0BDAILIARB+ABqKAIAQYCAgIB4Rg0BC0HYAEUNASAEIAdBqH9sakHYAGogA0HYAPwKAAAMAQsgAxClBSAHQQFqIgkhBwsgAyEEIAJBf2oiAg0ADAMLCyAEQdgAaiEEIAYgA0EBaiIDRw0AC0EAIQkLIAEgBiAJayIENgIUIARFDQAgBSAEQdgAbGohBwNAAkACQAJAAkACQAJAAkACQAJAIAUoAgAiBEF8akEAIARBe2pBCEkbDgkBAgMEBQAIBgcBCwALIAVBAzoAUSAFIAAQrigCQCAFKAJIIgRFDQAgBSgCRCICIARBBnRqIQgDQAJAAkAgAigCAEEHRg0AAkAgAigCOCIDRQ0AIAIoAjQhBCADQQxsIQMDQCAAIAQoAgAQ5gEgBEEMaiEEIANBdGoiAw0ACwsgAiAAEJATDAELAkAgAigCOCIDRQ0AIAIoAjQhBCADQQxsIQMDQCAAIAQoAgAQ5gEgBEEMaiEEIANBdGoiAw0ACwsCQCACLQAcQQJHDQAgAigCDCEEIAIoAgggABCQEyAAIAQQ5gEMAQsgAkEAOgAcIAJBIGoQuSMLIAJBwABqIgIgCEcNAAsLIAVBIGoiBCgCAEGAgICAeEYNBiAAIAQQ3gcMBgsgBUEAOgA3IAVBAzoAOSAFQQA7ADUgBUEIaiAAEK4oIAUoAjAgABC5BgwFCyAFQQA6ACkgBUEAOwAnIAVBAzoAJCAFKAIgIAAQuQYMBAsgBUEANgBFIAVBAzoASyAFQckAakEAOwAAIAVBCGogABCuKAJAIAUoAjwiBEUNACAAIAQQ5gELIAVBwABqELkjIAUoAjgiA0UNAyAFKAI0IQQgA0EMbCEDA0AgACAEKAIAEOYBIARBDGohBCADQXRqIgMNAAwECwsgBUEDOgA4IAVBADYBOgJAIAUoAiQiBEUNACAAIAQQ5gELIAVBKGoQuSMgBSgCNCIDRQ0CIAUoAjAhBCADQQxsIQMDQCAAIAQoAgAQ5gEgBEEMaiEEIANBdGoiAw0ADAMLCyAAIAVBBGoQ3gcMAQsCQCAFKAJAIgRFDQAgBCgCACIDEN4DIANB4ABBCBCzFiAEQQxBBBCzFgsgBUEANgJAIAVBgICAGDYARQJAIAUoAghBBUYNACAFQQhqIAAQrigLAkAgBSgCPCIERQ0AIAAgBBDmAQsgBUHAAGoQuSMgBSgCOCIDRQ0AIAUoAjQhBCADQQxsIQMDQCAAIAQoAgAQ5gEgBEEMaiEEIANBdGoiAw0ACwsgBUHYAGoiBSAHRw0ACwsCQCABKAIwIgRFDQAgACAEEOYBCyABQTRqEIQjIAFBOGoQgyMLnAsBDX8jAEEgayICJABBASEDIAEgASgCaCIEQQFqIgU2AmggASgCeCEGAkAgBCwAACIHQX9KDQAgASAEQQJqIgU2AmggBC0AAUE/cSEIIAdBH3EhCQJAAkAgB0FgTw0AIAlBBnQgCHIhBAwBCyABIARBA2oiBTYCaCAIQQZ0IAQtAAJBP3FyIQgCQCAHQXBPDQAgCCAJQQx0ciEEDAELIAEgBEEEaiIFNgJoIAhBBnQgBC0AA0E/cXIgCUESdEGAgPAAcXIhBAsgBEGAAUkNAEECIQMgBEGAEEkNAEEDQQQgBEGAgARJGyEDCyABKAJsIQQgAS0AKCEHIAEgAyAGaiIINgJ4AkACQCABLQCRAUEgcUUNACABKAKIAUGA4ABxQYAgRw0AIABBgCQ7AQAMAQtBEiEDQQAhCQJAIAQgBUYNAAJAAkACQAJAAkACQAJAAkACQCAFLQAAIgpBIUcNACAFQQFqIgsgBEYNCSALLAAAIgpBf0oNAyAFLQACQT9xIQwgCkEfcSENAkAgCkFgTw0AIA1BBnQgDHIhDAwDCyAMQQZ0IAUtAANBP3FyIQwgCkFwTw0BIAwgDUEMdHIhDAwCCwJAIArAQX9KDQAgCkEfcSIMQQZ0IAUtAAFBP3EiDXIhCwJAIApB4AFJDQAgDUEGdCAFLQACQT9xciEOAkACQCAKQfABTw0AIA4gDEEMdHIhDgwBCyAOQQZ0IAUtAANBP3FyIAxBEnRBgIDwAHFyIQ4LIA5BPEcNCiABIAVBAmoiCTYCaCAKQeABSQ0IIAEgBUEDaiIJNgJoIA1BBnQgBS0AAkE/cXIhAyAKQfABTw0HIAMgDEEMdHIhCwwICyALQTxHDQkgASAFQQJqIgU2AmhBASEDDAgLIApBPEcNCEEBIQMgASAFQQFqIgU2AmgMBwsgDEEGdCAFLQAEQT9xciANQRJ0QYCA8ABxciEMCyAMQS1HDQYgCkF/TA0BIAVBAmohCgwCCyAKQf8BcUEtRw0FIAVBAmohCgwBCwJAIApBYE8NACAFQQNqIQoMAQsgC0EEQQMgCkFvSxtqIQoLIAogBEYNAwJAAkAgCiwAACILQX9MDQAgC0H/AXEhCgwBCyAKLQABQT9xIQwgC0EfcSENAkAgC0FfSw0AIA1BBnQgDHIhCgwBCyAMQQZ0IAotAAJBP3FyIQwCQCALQXBPDQAgDCANQQx0ciEKDAELIAxBBnQgCi0AA0E/cXIgDUESdEGAgPAAcXIhCgsgCkEtRw0DIAFBAxCwAiABEIkBIAJBpoCAgHg2AgggASAGIAJBCGoQ1BEgAUEAOgCTAQJAIAEoAmwgASgCaCIFRw0AIABBgMYCOwEADAULIAAgASAFLQAAQQJ0QdyimgFqKAIAEQYADAQLIAEgBUEEaiIJNgJoIANBBnQgBS0AA0E/cXIgDEESdEGAgPAAcXIhCwsCQAJAIAtBgAFPDQBBASEDDAELAkAgC0GAEE8NAEECIQMMAQtBA0EEIAtBgIAESRshAwsgCSEFCyABIAMgCGoiCDYCeEE1IQNBASEJCwJAAkAgBCAFRw0AIAMhCAwBCwJAIAUtAABBPUYNACADIQgMAQsgASAIQQFqNgJ4IAEgBUEBaiIFNgJoQTMhCAJAAkACQCADQW5qDgIDAQALIANBNUYNAUGgppwBQShB4JyaARDSHgALQTQhCAwBC0EkIQgLAkAgCSAHcUUNACAFIAQgBWtB1JyaAUEGEOolRQ0AIAJBm4GAgHg2AgggASAGIAZBB2ogAkEIahCqJCABQQUQsAIgARCJASABQQA6AJMBAkAgASgCbCABKAJoIgVHDQAgAEGAxgI7AQAMAgsgACABIAUtAABBAnRB3KKaAWooAgARBgAMAQsgAEEAOgAAIAAgCDoAAQsgAkEgaiQAC/sLAQN/A0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4UEBAAAQIDBAUGBgcICQoKCwwNDg8QCwJAIAAoAgRBgICAgHhGDQACQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKkoDAMLIANBBGogARDXFwwCCyADQQRqIAEQ2iUMAQsgA0EEaiABEOkaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAhwiA0UNACADQQhqKAIAIgJFDQAgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIERQ0AIAQgARCvAgsCQCADKAIAIgRFDQAgBCABEK8CCyADQTBqIQMgAkFQaiICDQALCyAAQRBqIQAMEQsCQCAAKAIQIgJFDQAgACgCDCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKkoDAMLIANBBGogARDXFwwCCyADQQRqIAEQ2iUMAQsgA0EEaiABEOkaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAiAiA0UNACADQQhqKAIAIgJFDQAgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIERQ0AIAQgARCvAgsCQCADKAIAIgRFDQAgBCABEK8CCyADQTBqIQMgAkFQaiICDQALCyAAQRRqIQAMEAsCQCAALQAkQQJHDQAgACgCEBDEJwsgACgCKCIARQ0OIABBCGooAgAiA0UNDiAAQQRqKAIAIQAgA0ECdCEDA0AgACgCACABEK8CIABBBGohACADQXxqIgMNAAwPCwsCQAJAIAAtAEQiA0EERg0AAkAgA0ECRw0AIAAoAjAQxCcLAkAgACgCSCIDRQ0AIAMoAggiAkUNACADKAIEIQMgAkECdCECA0AgAygCACABEK8CIANBBGohAyACQXxqIgINAAsLIAAoAkwiA0UNASADIAEQkBkMAQsgAC0AJEECRw0AIAAoAhAQxCcLIAAoAlgiAEUNDSAAQQhqKAIAIgNFDQ0gAEEEaigCACEAIANBAnQhAwNAIAAoAgAgARCvAiAAQQRqIQAgA0F8aiIDDQAMDgsLIAAoAgwiA0UNDCAAKAIIIQAgA0E4bCEDA0AgACABEKkDIABBOGohACADQUhqIgMNAAwNCwsgACgCBCEADA0LIAAoAgwiA0UNCiAAKAIIIQAgA0E4bCEDA0ACQCAAKAIAQQdGDQAgACABEIoLCyAAQTBqKAIAIAEQrwIgAEE4aiEAIANBSGoiAw0ADAsLCyAAKAIEIQAMCwsCQCAAKAIEQQFHDQAgACgCECIDRQ0JIAAoAgwhACADQQJ0IQMDQCAAKAIAIAEQrwIgAEEEaiEAIANBfGoiAw0ADAoLCyAAKAIQIgNFDQggACgCDCEAIANBAnQhAwNAIAAoAgAgARCvAiAAQQRqIQAgA0F8aiIDDQAMCQsLIAAoAgQgARCvAiAAKAIIIAEQrwIgACgCDCABEK8CIAAoAhAhAAwJCwJAIAAoAjAiA0UNACADIAEQrwILIAAoAjQiAA0IDAYLIAAoAgQhAAwHCyAAKAIEIAEQrwIgACgCCCEADAYLAkAgACgCMCIDRQ0AIAMgARCvAgsCQCAAKAI0IgNFDQAgAyABEK8CCwJAIAAoAkAiA0UNACADIAEQrwILIAAoAkQiAA0FDAMLIAAoAghBhICAgHhIDQIgACgCECIDRQ0CIAAoAgwhACADQQJ0IQMDQCAAKAIAIAEQrwIgAEEEaiEAIANBfGoiAw0ADAMLCyAAKAIoIgBFDQEgACgCACEADAMLAkAgAC0APEECRw0AIAAoAigQxCcLAkAgACgCQCIDRQ0AIANBCGooAgAiAkUNACADQQRqKAIAIQMgAkECdCECA0AgAygCACABEK8CIANBBGohAyACQXxqIgINAAsLIAAoAkQiAEUNACAAIAEQkBkLDwsgACgCACgCACEADAALC4kMAg1/AX4gACgCeCICIQMCQCABRQ0AIAAgAiABaiIDNgJ4IAAgACgCcCIBIAAoAnRqNgJsIAAgASADIAAoAnxrajYCaAsCQAJAIAAtAChFDQBBASEEDAELAkAgAC0AKyIBQaQBRw0AQQAhBAwBCyABQVFqQf8BcUENSSABQXNqQf8BcUEKSXIhBAsCQAJAAkACQAJAIAAoAmwiBSAAKAJoIgZGDQAgBSAGayEHIAAoAnAiCCAAKAJ0aiEJIAAoAnwhCiADIQsCQANAAkAgBw0AQQAhBwwCC0EAIQwDQAJAIAwiASAHIAFBIGoiDSAHIA1JGyIMTw0AAkADQCAGIAFqLQAAIg5BwI+aAWotAAANASAMIAFBAWoiAUYNAgwACwsCQAJAIA5B4gFHDQAgAUEBaiEMIAFBAmoiDiAHTw0BAkAgDCAHSQ0AIAwgB0HgkZoBEJEVAAsgBiAOai0AAEEIdCAGIAxqLQAAckGAAnJB//8DcUGA0wJHDQELAkAgAUUNACAAIAk2AmwgACALIAFqIgs2AnggACAIIAsgCmtqNgJoCwJAIAAoAjBBgICAgHhGDQAgAEEwaiEGIAAgCTYCbCAAIAggCyAKayIBajYCaCAAKAKEAUEIaiAIIAMgCmsiDGogASAMaxDkAyEPAkACQAJAIAQNACAAKAIwIgFBgICAgHhGDQEgACgCJCEOAkAgACgCOCIMIAFHDQAgBkHomZoBEOkdCyAAKAI0IAxBBXRqIgFBAToAHCABIA42AhggAUEAOgAQIAEgCzYCDCABIAI2AgggASAPNwMAIAAgDEEBajYCOAwDCyAGKAIAQYCAgIB4Rg0BAkAgACgCRCIMIAAoAjxHDQAgAEE8akH4mZoBENcdCyAAKAJAIAxBGGxqIgFBADoAECABIAs2AgwgASACNgIIIAEgDzcDACAAIAxBAWo2AkQMAgtB8JGaARDSLAALQYCSmgEQ0iwACyAAKAJ4IAtGDQYgACALNgJ4IAAgACgCcCIBIAAoAnRqNgJsIAAgASALIAAoAnxrajYCaAwGCwJAIAxFDQAgACAJNgJsIAAgCyAMaiILNgJ4IAAgCCALIApraiIGNgJoIAkhBQsgBSAGayEHIAUgBkcNAgwECyANIAdJDQALCwsgACAJNgJsIAAgCyAHaiIBNgJ4IAAgCCABIAprajYCaCAAKAIwQYCAgIB4Rg0BIABBMGohDiAAIAAoAoABIgE2AnggACAIIAEgCmsiDGo2AmggACgChAFBCGogCCADIAprIgZqIAwgBmsQ5AMhDwJAAkACQCAEDQAgACgCMCIMQYCAgIB4Rg0BIAAoAiQhBwJAIAAoAjgiBiAMRw0AIA5B6JmaARDpHQsgACgCNCAGQQV0aiIMQQE6ABwgDCAHNgIYIAxBADoAECAMIAE2AgwgDCACNgIIIAwgDzcDACAAIAZBAWo2AjgPCyAOKAIAQYCAgIB4Rg0BAkAgACgCRCIGIAAoAjxHDQAgAEE8akH4mZoBENcdCyAAKAJAIAZBGGxqIgxBADoAECAMIAE2AgwgDCACNgIIIAwgDzcDACAAIAZBAWo2AkQPC0HAkZoBENIsAAtB0JGaARDSLAALIAAoAjBBgICAgHhGDQAgAEEwaiEHIAAgACgCgAEiDDYCeCAAIAAoAnAiASAAKAJ0ajYCbCAAIAEgDCAAKAJ8IgZrIg5qNgJoIAAoAoQBQQhqIAEgAyAGayIGaiAOIAZrEOQDIQ8gBA0BIAAoAjAiAUGAgICAeEYNAiAAKAIkIQ4CQCAAKAI4IgYgAUcNACAHQeiZmgEQ6R0LIAAoAjQgBkEFdGoiAUEBOgAcIAEgDjYCGCABQQA6ABAgASAMNgIMIAEgAjYCCCABIA83AwAgACAGQQFqNgI4DwsPCyAHKAIAQYCAgIB4Rg0BAkAgACgCRCIGIAAoAjxHDQAgAEE8akH4mZoBENcdCyAAKAJAIAZBGGxqIgFBADoAECABIAw2AgwgASACNgIIIAEgDzcDACAAIAZBAWo2AkQPC0HAkZoBENIsAAtB0JGaARDSLAAL9QsCC38BfiMAQZABayIDJAAgA0HwAGogAiABKAIAIgRBABCLAgJAAkAgAy0AcEEERg0AIAMpA3AiDkL/AYNCBFENACAAIA43AgAMAQsCQAJAAkACQAJAIAItAE0NAAJAAkACQAJAIAEpAwhQDQAgA0EwaiABQQhqIgUQ8RUgAygCNEEDSQ0BIAItAFJB/wFxQQhPDQEgA0EoaiAFEPEVIAMoAiggAygCLEHfABCdI0UNASABKAIEIQYgA0EYaiAFEPEVIAMoAhghByADKAIcIQVBACEIIANBEGpBAEGIr5wBELsZIANBADYCWCADIAMpAxA3AlAgA0EANgJwIANBCGpB3wAgA0HwAGoQ1RsgAygCcCEJIAMgAygCDCIBOgCIASADIAk2AoQBIAMgBTYCgAEgA0EANgJ8IAMgBTYCeCADIAc2AnQgA0HfADYCcCADQfAAaiABQf8BcSIJakETaiEKIANBhAFqIQsgAUEFSSEMQQAhAQNAIAUgAUkNAyADIAotAAAgByABaiAFIAFrEK4RIAMoAgBBAXFFDQMgAyADKAIEIAFqQQFqIgE2AnwgASAJSQ0AIAEgCWshDSABIAVLDQAgDEUNBiAHIA1qIg0gCSALIAkQ4yVFDQAgA0HQAGogByAIaiANELogIANB0ABqQQFBARC6ICABIQgMAAsLIAEoAgQhBSADQfAAaiABQRBqEP4TIANB0ABqIAIgBCAFIAMoAnQgAygCeBCJDyADLQBQQQRGDQIgAykDUCIOQv8Bg0IEUQ0CIAAgDjcCACADQfAAahDNLAwICyABKAIEIQEgA0EgaiAFEPEVIANB8ABqIAIgBCABIAMoAiAgAygCJBCJDyADLQBwQQRGDQYgAykDcCIOQv8Bg0IEUQ0GIAAgDjcCAAwHCyADQdAAaiAHIAhqIAcgBWoQuiAgA0HgAGpBCGogA0HQAGpBCGooAgAiATYCACADIAMpAlA3A2AgA0E4aiACIAQgBiADKAJkIAEQiQ8CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUQ0AIAAgDjcCACADQeAAahDNLAwHCyADQeAAahDNLAwFCyADQfAAahDNLCADQfAAaiACIAQgBUHBq5wBQQEQiQ8gAy0AcEEERg0EIAMpA3AiDkL/AYNCBFENBCAAIA43AgAMBQsgASgCECEFIANB8ABqEJQPIANBAjoAfCAFIANB8ABqEIcYIQkgAygCcCADKAJ0EPQsIAnAQX9KDQEgA0HwAGoQlA8gA0EAOgB8IAUgA0HwAGoQhxghCSADKAJwIAMoAnQQ9CwCQCAJwEEBSA0AIANBOGogAUEQahD+EwwDCxD+JyEJIAUtAAwhByADQfAAaiAFQQRqKAIAIAVBCGooAgAQ4BcgCSADKQJwNwIAIAMgBzoAfCAJQQhqIgUgA0HwAGpBCGopAgA3AgAgA0HQAGpBCGogBSgCADYCACADQdAAakEPaiAJQQ9qLQAAOgAAIAMgCSkCADcDUCADIAkvAA07AF0gA0ECIAktAAxrOgBcIANB4ABqIANB0ABqENIKIANBBDYCTCADQQE2AnQgA0HIq5wBNgJwIANCATcCfCADIANB4ABqNgJIIAMgA0HIAGo2AnggA0E4aiADQfAAahCCGyADQeAAahDNLCADKAJQIAMoAlQQ9CwgCRCJLwwCCyAJQQRBsLCcARDhLAALIANB0ABqIAUQ0gogA0EENgJkIANBATYCdCADQdSrnAE2AnAgA0IBNwJ8IAMgA0HQAGo2AmAgAyADQeAAajYCeCADQThqIANB8ABqEIIbIANB0ABqEM0sCyADQfAAaiACIAQgASgCBCIBIAMoAjwgAygCQBCJDwJAAkAgAy0AcEEERg0AIAMpA3AiDkL/AYNCBFINAQsgA0HwAGogAiAEIAFBwaucAUEBEIkPAkAgAy0AcEEERg0AIAMpA3AiDkL/AYNCBFINAQsgA0E4ahDNLAwBCyAAIA43AgAgA0E4ahDNLAwBCyAAQQQ6AAALIANBkAFqJAALnwsCEn8EfiMAQTBrIgIkAAJAIAAoAgwiAyABaiIBIANJDQACQAJAAkAgASAAKAIEIgQgBEEBaiIFQQN2IgZBB2wgBEEISRsiB0EBdk0NAAJAAkAgB0EBaiIGIAEgBiABSxsiAUEPSQ0AIAFB/////wFLDQVBfyABQQN0QQduQX9qZ3ZBAWohAQwBC0EEQQhBECABQQhJGyABQQRJGyEBCyACQSBqQQhBCCABEKMSIAIoAiQhCCACKAIgIgRFDQIgAikCKCEUAkAgCEEJaiIBRQ0AIARB/wEgAfwLAAsgAiAUQiCIPgIcIAIgFKciCTYCGCACIAg2AhQgAiAENgIQIAJBCDYCDEEAIQpBACEBAkAgA0UNACAEQQhqIQsgACgCACIMQXhqIQ0gDCkDAEJ/hUKAgYKEiJCgwIB/gyEUQQAhASADIQ4gDCEGA0ACQCAUQgBSDQADQCABQQhqIQEgBkEIaiIGKQMAQoCBgoSIkKDAgH+DIhRCgIGChIiQoMCAf1ENAAsgFEKAgYKEiJCgwIB/hSEUCwJAIAQgCCANIBR6p0EDdiABakEDdCIFaykDABDWICIVp3EiD2opAABCgIGChIiQoMCAf4MiFkIAUg0AQQghEANAIA8gEGohDyAQQQhqIRAgBCAPIAhxIg9qKQAAQoCBgoSIkKDAgH+DIhZQDQALCyAUQn98IRcCQCAEIBZ6p0EDdiAPaiAIcSIPaiwAAEEASA0AIAQpAwBCgIGChIiQoMCAf4N6p0EDdiEPCyAXIBSDIRQgBCAPaiAVQhmIpyIQOgAAIAsgD0F4aiAIcWogEDoAACAEIA9BA3RrQXhqIAwgBWtBeGopAAA3AAAgDkF/aiIODQALIAMhAQsgAiABNgIcIAIgCSABazYCGAJAA0AgCkEQRg0BIAAgCmoiASgCACEGIAEgAkEEaiAKakEMaiIEKAIANgIAIAQgBjYCACAKQQRqIQoMAAsLIAIoAhQiAUUNASABIAFBA3RBD2pBeHEiBmpBCWoiAUUNASACKAIQIAZrIAFBCBCzFgwBCyAAKAIAIQoCQCAGIAVBB3FBAEdqIgZFDQAgCiEBA0AgASABKQMAIhRCf4VCB4hCgYKEiJCgwIABgyAUQv/+/fv379+//wCEfDcDACABQQhqIQEgBkF/aiIGDQALCwJAAkACQCAFQQhJDQAgCiAFaiAKKQAANwAADAELAkAgBUUNACAKQQhqIAogBfwKAAALIAVFDQELIApBCGohCyAKQXhqIQ1BASEIIAohD0EAIQEDQCABIQYgCCEBAkAgCiAGaiIOLQAAQYABRw0AIA0gBkEDdCIIayEMIAogCGtBeGohCQJAA0AgBCAMKQMAENYgIhancSIIIRACQCAKIAhqKQAAQoCBgoSIkKDAgH+DIhRCAFINAEEIIREgCCEQA0AgECARaiEQIBFBCGohESAKIBAgBHEiEGopAABCgIGChIiQoMCAf4MiFFANAAsLAkAgCiAUeqdBA3YgEGogBHEiEGosAABBAEgNACAKKQMAQoCBgoSIkKDAgH+DeqdBA3YhEAsCQCAQIAhrIAYgCGtzIARxQQhJDQAgCiAQaiIILQAAIREgCCAWQhmIpyISOgAAIAsgEEF4aiAEcWogEjoAACAKIBBBA3RrIRMgEUH/AUYNAkF4IQgDQCAIRQ0CIA8gCGoiECgAACERIBAgEyAIaiISKAAANgAAIBIgETYAACAIQQRqIQgMAAsLCyAOIBZCGYinIgg6AAAgCyAGQXhqIARxaiAIOgAADAELIA5B/wE6AAAgCyAGQXhqIARxakH/AToAACATQXhqIAkpAAA3AAALIA9BeGohDyABIAEgBUkiBmohCCAGDQALCyAAIAcgA2s2AggLQYGAgIB4IQgLIAJBMGokACAIDwsQ5yEAC68MAgN/AX4jAEGAAWsiAyQAIANB6ABqIAIgASABKAIAIgRBAnRB0N+eAWooAgBqKAIAIgVBABCLAgJAAkAgAy0AaEEERg0AIAMpA2giBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVFDQAgA0HoAGogAiAFEI4jIAMtAGhBBEYNACADKQNoIgZC/wGDQgRSDQELIAQOBwEHAgMEBQYBCyAAIAY3AgAMDAsgA0HoAGogAUEIaiACEGsgAy0AaEEERg0KIAMpA2giBkL/AYNCBFENCiAAIAY3AgAMCwsgA0EANgJoIANB2ABqIAIgA0HoAGpBlaucAUEEEL0NIAMtAFhBBEYNCSADKQNYIgZC/wGDQgRRDQkgACAGNwIADAoLIANB6ABqIAFBCGogAhCvGiADLQBoQQRGDQggAykDaCIGQv8Bg0IEUQ0IIAAgBjcCAAwJCyADQegAaiABQQhqIAIQsQIgAy0AaEEERg0HIAMpA2giBkL/AYNCBFENByAAIAY3AgAMCAsgA0EANgIkIANB6ABqIAIgA0EkakGZq5wBELwNIAMtAGhBBEYNAiADKQNoIgZC/wGDQgRRDQIgACAGNwIADAcLIANB6ABqIAFBCGogAhD3EyADLQBoQQRGDQUgAykDaCIGQv8Bg0IEUg0CDAULAkAgAS0ADA0AIANBADYCaCADQdgAaiACIANB6ABqQYyrnAFBBRC9DSADLQBYQQRGDQUgAykDWCIGQv8Bg0IEUQ0FIAAgBjcCAAwGCyADQQA2AmggA0HYAGogAiADQegAakGRq5wBQQQQvQ0gAy0AWEEERg0EIAMpA1giBkL/AYNCBFENBCAAIAY3AgAMBQsgA0EYaiABQQhqEPEVIAMoAhwhBSADKAIYIQQgAi0ATEUNASAEIAUQrw4NASADQTxqIAUQuRkgAyAENgJIIAMgBCAFajYCTANAAkACQCADQcgAahCTDSIFQYCAxABGDQAgBUH/AEkNAQJAAkACQAJAIAVBgAJJDQAgBUHYv39qDgIBAgMLIANBPGpBmIaZAUECEPAFIANBATYCfCADQZyGmQE2AnggA0EBNgJsIANBnL+cATYCaCADQQE2AnQgA0HnATYCXCADIAU6AFQgAyADQdgAajYCcCADIANB1ABqNgJYIANBPGogA0HoAGoQwhNFDQVBxIicAUErIANB6ABqQZSEmQFBtIaZARDqEgALIANBPGpBh4WZAUEGEPAFDAQLIANBPGpBjYWZAUEGEPAFDAMLAkAgBUH//wNLDQAgA0EBNgJ8IANBoIWZATYCeCADQQE2AmwgA0GYhZkBNgJoIANBATYCdCADQbkHNgJcIAMgBTsBVCADIANB2ABqNgJwIAMgA0HUAGo2AlggA0E8aiADQegAahDCE0UNA0HEiJwBQSsgA0HoAGpBlISZAUG4hZkBEOoSAAsgAyAFQYCAfGpBCnZBgLADajYCUCADIAVB/wdxQYC4A3I2AlQgA0ECNgJ8IANB2IWZATYCeCADQQI2AmwgA0HIhZkBNgJoIANBAjYCdCADQegBNgJkIANB6AE2AlwgAyADQdgAajYCcCADIANB1ABqNgJgIAMgA0HQAGo2AlggA0E8aiADQegAahDCE0UNAkHEiJwBQSsgA0HoAGpBlISZAUGIhpkBEOoSAAsgA0EwakEIaiADQTxqQQhqKAIANgIAIAMgAykCPDcDMAwECyADQTxqIAUQnyEMAAsLIAAgBjcCAAwDCyADQf8BOgA7IAMgBTYCNCADIAQ2AjALIANBEGogA0EwahCcGCADQegAaiACIAMoAhAgAygCFBCYEAJAAkAgAy0AaEEERg0AIAMpA2giBkL/AYNCBFINAQsgA0HoAGogAiADQSRqQZmrnAEQvA0CQCADLQBoQQRGDQAgAykDaCIGQv8Bg0IEUg0BCyADQQhqIAFBEGoQ8RUgA0HoAGogAiADKAIIIAMoAgwQmBACQCADLQBoQQRGDQAgAykDaCIGQv8Bg0IEUg0BCyADQTBqEM0nDAELIAAgBjcCACADQTBqEM0nDAELIABBBDoAAAsgA0GAAWokAAuoDAIEfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TEhIBAgMEBQYHCAkKCwwNDg8QEQALIABBEGoQyBMCQCAALQA8QQNGDQAgAEEoahDtEAsCQCAAKAJAIgFFDQAgAUEEaigCACECAkAgASgCCCIDRQ0AA0AgAigCACIEELQCIARB4ABBCBCzFiACQQRqIQIgA0F/aiIDDQALIAFBBGooAgAhAgsgASgCACACEJ8tIAFBFEEEELMWCyAAKAJERQ0RIABBxABqENYSDBELAkAgACgCBCICQYCAgIB4Rw0AIABBCGoQsAkgACgCCCAAKAIMEKEtAkAgACgCIEUNACAAQSBqELMZCyAAKAIUIgIoAgAiABC0AiAAQeAAQQgQsxYgAkEMQQQQsxYPCyAAQQRqELAJIAIgACgCCBChLQJAIAAoAhxFDQAgAEEcahCzGQsgACgCECICKAIAIgAQtAIgAEHgAEEIELMWIAJBDEEEELMWDwsgAEEQahDtECAAKAIoIgRFDQ8gBEEEaigCACECAkAgBCgCCCIARQ0AA0AgAigCACIDELQCIANB4ABBCBCzFiACQQRqIQIgAEF/aiIADQALIARBBGooAgAhAgsgBCgCACACEJ8tIARBFEEEELMWDwsCQAJAIAAtAEQiAkEERw0AIABBEGoQ7RAMAQsgAEEYahDIEwJAIAJBA0YNACAAQTBqEO0QCwJAIAAoAkgiAkUNACACELcfIAIoAgAgAkEEaigCABCfLSACQRRBBBCzFgsgACgCTCICRQ0AIAIQoRcgAigCACACQQRqKAIAEJwtIAJBFEEEELMWCyAAKAJYIgRFDQ4gBEEEaigCACECAkAgBCgCCCIARQ0AA0AgAigCACIDELQCIANB4ABBCBCzFiACQQRqIQIgAEF/aiIADQALIARBBGooAgAhAgsgBCgCACACEJ8tIARBFEEEELMWDwsgACgCCCEEAkAgACgCDCIDRQ0AIAQhAgNAIAIQ5QIgAkE4aiECIANBf2oiAw0ACwsgACgCBCAEEKMtDwsgACgCBCICELQCIAJB4ABBCBCzFg8LIAAoAgghAQJAIAAoAgwiA0UNACABIQIDQAJAIAIoAgBBB0YNACACEKwHCyACQTBqKAIAIgQQtAIgBEHgAEEIELMWIAJBOGohAiADQX9qIgMNAAsLIAAoAgQgARCjLQ8LIAAoAgQiAhC0AiACQeAAQQgQsxYPCyAAKAIEIgIQtAIgAkHgAEEIELMWDwsgAEEIaiEEAkAgACgCBA0AIAQQtx8gACgCCCAAKAIMEJ8tDwsgACgCDCEBAkAgACgCECIARQ0AIAEhAgNAIAIoAgAiAxC0AiADQeAAQQgQsxYgAkEEaiECIABBf2oiAA0ACwsgBCgCACABEJ8tDwsgACgCBCICELQCIAJB4ABBCBCzFiAAKAIIIgIQtAIgAkHgAEEIELMWIAAoAgwiAhC0AiACQeAAQQgQsxYgACgCECICELQCIAJB4ABBCBCzFg8LIABBEGoQ1RQPCyAAKAIEIgIQtAIgAkHgAEEIELMWDwsgACgCBCICELQCIAJB4ABBCBCzFg8LIAAoAgQiAhC0AiACQeAAQQgQsxYgACgCCCICELQCIAJB4ABBCBCzFg8LIABBEGoQ1RQCQCAAKAJAIgJFDQAgAhC0AiACQeAAQQgQsxYLIAAoAkQiAkUNAiACELQCIAJB4ABBCBCzFg8LAkACQAJAAkAgACgCCEGAgICAeHMiAkEEIAJBBEkbDgQBAgUDAAsgAEEIahDtGyAAKAIYIgIgACgCHBC2ECAAKAIUIAIQoC0PCyAAKQMgIgVQDQMgBUIDg0IAUg0DIAWnIgIgAigCACIAQX9qNgIAIABBAUcNAyACIAIoAhAQxiQPCyAAQRBqEMgTDwsgACkDGCAAKAIgELQZDwsCQCAALQAcQQJGDQAgACkDCCIFQgODQgBSDQAgBaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsgACgCKCICRQ0AIAIoAgAiABC0AiAAQeAAQQgQsxYgAkEMQQQQsxYPCwvPCwILfwJ+IwBB8ABrIgEkACAAKAIAIgIoAgAhAyACQQA2AgBBAC0AoPGeARogA0EIaigCACEEIANBBGooAgAhBSADKAJkIQYCQEEEEH0iA0UNACADIAY2AgAgAUEBNgJUIAEgAzYCUCABQQE2AkwgAUEANgJgIAFCgICAgMAANwJYIAFBADYCbCABQoCAgIDAADcCZEEEIQdBACEIQQAhAwNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMgBE8NACAFIANqIgktAAAiAkEgSQ0BQQEhCiACQf4ATQ0RAkAgA0UNACACwEG/f0wNAwsCQAJAIALAQX9KDQAgCS0AAUE/cSEKIAJBH3EhCwJAAkAgAkHfAUsNACALQQZ0IApyIQIMAQsgCkEGdCAJLQACQT9xciEKAkAgAkHwAU8NACAKIAtBDHRyIQIMAQsgCkEGdCAJLQADQT9xciALQRJ0QYCA8ABxciICQYCAxABGDQYLAkAgAkGAAUkNAEECQQNBBCACQYCABEkbIAJBgBBJGyEKIAggASgCWEYNAgwMCyADIAZqIQlBASEKIAJB/wBGDQwgAkEfSyELQQEhCgwPCyADIAZqIQlBASEKDAsLIAFB2ABqENMdIAEoAlwhBwwJCwJAIAEoAlQiA0UNACABKAJQIANBAnRqQXxqIgJFDQAgBiAEaiIEIAIoAgAiAkkNBCACIARHDQAgASADQX9qNgJUCyABQShqQQhqIAFBzABqQQhqKAIAIgM2AgAgAUEoakEUaiABQdgAakEIaigCACICNgIAIAFBKGpBIGoiBCABQeQAakEIaigCADYCACABQQhqIAM2AgAgASABKQJMIgw3AyggASABKQJYIg03AjQgASABKQJkNwNAIAEgDDcDACABQRRqIAI2AgAgASANNwIMIAFBIGogBCgCADYCACABIAEpA0A3AxgCQCAAKAIEIgIoAgAiAygCACIEQYCAgIB4Rg0AIAQgA0EEaigCABD0LCADKAIMIANBEGooAgAQ2SwgAygCGCADQRxqKAIAEJktIAIoAgAhAwsCQEEkRQ0AIAMgAUEk/AoAAAsgAUHwAGokAEEBDwsgBiADaiELIAJBd2oOBQQFBgYDBgsgBSAEIAMgBEHU6JgBEOMqAAtB5OiYARDSLAALQZTnmAFBNEHE6JgBENIeAAsCQAJAIANBAWogBE8NACAJQQFqLQAAQQpGDQELQQEhCiABQcwAaiALQQFqQaTpmAEQwCEMDAsgAUHMAGogA0ECaiIDIAZqQZTpmAEQwCEMDAsgAUECNgIoIAEgCzYCLCABQeQAaiABQShqQcTpmAEQsxtBASEKDAoLQQEhCiABQcwAaiALQQFqQbTpmAEQwCEMCQsgAUEANgIoIAEgCzYCLCABQeQAaiABQShqQdTpmAEQsxtBASEKDAgLIAcgCEEDdGoiCyAKOgAEIAsgAyAGaiIJNgIAIAEgCEEBaiIINgJgIAJBnwFNDQAgAkENdkGAj50Bai0AACILQRVPDQEgC0EGdCACQQd2QT9xckGAkZ0Bai0AACILQbQBTw0CIAtBBXQgAkECdkEfcXJBwJudAWotAAAgAkEBdEEGcXZBA3EiC0EDRw0DAkAgAkHyg3xqQQJJDQBBASELIAJB3AtGDQQCQCACQdgvRg0AIAJBkDRGDQUgAkGDmARGDQVBAUEBQQFBAUEBQQIgAkGanHhqQRpJGyACQc+lf2pBP0kbIAJBgFFqQTBJGyACQd5zakHhBEkbIAJB/v//AHFB/MkCRhshCwwFC0EDIQsMBAtBACELDAMLIAEgCTYCLAwDCyALQRVBuOWYARCRFQALIAtBtAFByOWYARCRFQALIAtBAUYNAyABIAk2AiwgCw0BC0EAIQIMAQsgASALNgIwQQEhAgsgASACNgIoIAFB5ABqIAFBKGpBhOmYARCzGwsgCiADaiEDDAALCwAL6gsBC38jAEGgAWsiAiQAAkACQAJAIAEtACkNACABKAIIIgMNAQsgAEGAgICAeDYCAAwBCyABKAIEIQQgAkEgaiADQQRBDEG08poBEMUYIAIoAiAiBSADIAUgA0kbIQZBACEHIAIoAiQhCAJAA0AgBkUNASAEIAdqIglBBGooAgAhCiACQRhqIAlBCGooAgAiCUEBQQFBwLycARDFGCACKAIYIQsgAigCHCEMAkAgCUUNACAMIAogCfwKAAALIAggB2oiCkEIaiAJNgIAIApBBGogDDYCACAKIAs2AgAgBkF/aiEGIAdBDGohBwwACwsgAiADNgIwIAIgCDYCLCACIAU2AiggAkE0aiABKAIQIAEoAhQQkxcgAiABKQIYNwJAIAIgAS0AJCIJOgBIIAIoAjwhByACKAI4IQYCQAJAIAlBAUcNACACIAJBKGo2AnggAiACQfgAajYCUCAHQQJJDQECQCAHQRVJDQAgBiAHIAJB0ABqEN4QDAILIAdBAnQhCUEEIQcDQCAJIAdGDQIgBiAGIAdqIAJB+ABqELcXIAdBBGohBwwACwsgB0ECSQ0AAkAgB0EVSQ0AIAYgBxCtEQwBCyAHQQJ0IQlBBCEHA0AgCSAHRg0BIAYgBiAHahDPGiAHQQRqIQcMAAsLAkBBJEUiBw0AIAJB0ABqIAJBKGpBJPwKAAALQSxBBBCYKSILQoGAgIAQNwIAAkAgBw0AIAtBCGogAkHQAGpBJPwKAAALIAIgCzYCTAJAAkACQAJAAkACQCALQRBqKAIARQ0AIAsoAiAiCEUNAUEBIQdBASEGAkADQCAIIAdGDQEgBkEBdCEGIAdBAWohBwwACwsgCyALKAIAIgdBAWo2AgAgB0F/TA0CIAJBEGpBwABBBEEMQZSwgAEQxRggAkEANgKcASACIAIoAhQiBzYCmAEgAiACKAIQIgk2ApQBQQAhAwJAIAlBP0sNACACQZQBakEAQcAAQQRBDBDFHSACKAKcASEDIAIoApgBIQcLIAcgA0EMbGohBEEAIQcCQANAIAQgB2ohCSAHQfQFRg0BIAJBCGpBAEEEQQhBwLycARDFGCACKAIIIQogAigCDCEMIAlBCGpBADYCACAJQQRqIAw2AgAgCSAKNgIAIAdBDGohBwwACwtBACEKIAlBADYCCCAJQoCAgIDAADcCACACQdgAaiADQcAAajYCACACIAIpApQBNwNQIAIgBjYCZCACIAg2AmAgAiALNgJcIAtBEGohAyALQQxqIQVBACEJAkADQCAJIAMoAgAiB08NASAJIAsoAhwiBk8NBSACIAUoAgAgByALKAIYIApqKAIAIgwQlykgAigCACIHRQ0BIAIoAmAiBiACKAIEIghLDQYgAkHQAGogByAGEOsSIghBP3EiByACKAJYIgZPDQcCQCACKAJUIAdBDGxqIgcoAggiBiAHKAIARw0AIAcQgxwLIAcoAgQgBkEDdGoiBCAMNgIEIAQgCDYCACAHIAZBAWo2AgggCUEBaiEJIApBBGohCgwACwsgAkH4AGpBEGogAkHQAGpBEGopAwA3AwAgAkH4AGpBCGogAkHQAGpBCGopAwA3AwAgAiACKQNQNwN4AkACQCABLQAmIgdBAkYNACAHQQFxDQELIAsgCygCACIHQQFqNgIAIAdBf0wNAyALIAsoAgAiB0F/ajYCAAJAIAdBAUcNACALELQaCyAAQYCAgIB4NgIAIAJBhAFqEMEkIAIoAnwiByACKAKAARDeISACKAJ4IAcQ4ywgAkHMAGoQwSQMBwsgACACKQN4NwIAIABCADcCHCAAIAs2AhggAEEkakIANwIAIABBLGpBADYCACAAQRBqIAJB+ABqQRBqKQMANwIAIABBCGogAkH4AGpBCGopAwA3AgAMBgtBwK6AAUElQdSvgAEQ0h4AC0Hkr4ABQR9BhLCAARDSHgsACyAJIAZB5KuAARCRFQALIAYgCEGksIABEOEsAAsgByAGQbSwgAEQkRUACyACQaABaiQAC8wLAgl/AX4jAEGAAWsiAyQAAkACQAJAAkACQAJAAkAgAkEBRw0AIAEoAgAhAgJAA0ACQCACKAIAIgFBBUYNAAJAIAEOCAkJCQkJAAMJCQsACyACKAIEIQIMAAsLIAIoAgghASADQeAAaiACKAIMIgRBAEEEQRwQqAwgAygCZCECIAMoAmBBAUYNAiADQQA2AlwgAyADKAJoNgJYIAMgAjYCVCADQdQAaiAEEI4lIAMoAlwhAgJAIARFDQAgBCACaiEFIAMoAlggAkEcbGohAgNAIANB4ABqIAEQ/AEgAkEYaiADQeAAakEYaigCADYCACACQRBqIANB4ABqQRBqKQIANwIAIAJBCGogA0HgAGpBCGopAgA3AgAgAiADKQJgNwIAIAJBHGohAiABQRxqIQEgBEF/aiIEDQALIAUhAgsgAyACNgJcIANBOGogA0HUAGoQ0wEgA0HgAGpBEGogA0E4akEQaikCADcDACADQeAAakEIaiADQThqQQhqKQIANwMAIAMpAjghDCADQQA2AjggAyAMNwNgIANBOGoQ7iogAygCYEEGRg0BIANB4ABqEPYODAULIABBCDYCAAwFCyADKAJkIgZBgICAgHhGDQMgAykDaCEMIAMgBjYCCCADIAw3AgwCQAJAAkAgDEKAgICAIFoNACAMpyECDAELIAxCIIinIQcgA0HtAGohCEEcIQFBASECA0AgAygCECIJIAJNDQQgA0HgAGogAygCDCABaiIKEL0OAkAgAy0AbCIFQQJGDQAgA0EUakECaiAIQQJqLQAAOgAAIAMgCC8AADsBFCADKAJkIQsgAygCYCEEIAVBAXENAyAEIAQoAgAiBUF/ajYCACAFQQFHDQAgBCALEO4SCyABQRxqIQEgByACQQFqIgJHDQALIAMoAgwhAgsgAEEINgIAIANBCGoQyiIgBiACEPYsDAULIAMoAmghByADQThqIAkgAmsiAUEAQQRBHBCoDCADKAI8IQggAygCOEEBRg0CIAMgAjYCECADKAJAIQICQCABQRxsIglFDQAgAiAKIAn8CgAACyADIAE2AkAgAyACNgI8IAMgCDYCOCADQeAAaiADQThqENMBIANBGGogA0EIahDTASADQThqIANB4ABqEL0OAkACQCADLQBEIgJBAkYNACADKAI8IQggAygCOCEBIAJBAXENASADQTRqQQJqIgIgA0EUakECai0AADoAACABIAEoAgAiCUF/ajYCACADIAMvARQ7ATQCQCAJQQFHDQAgASAIEO4SCyAAIAMpAhg3AgAgACAFOgAoIAAgBzYCJCAAIAs2AiAgACAENgIcIAAgAy8BNDsAKSAAQRhqIANBGGpBGGooAgA2AgAgAEEQaiADQRhqQRBqKQIANwIAIABBCGogA0EYakEIaikCADcCACAAQStqIAItAAA6AAAgA0HgAGoQ5CgMBgsgACADKQIYNwIAIAAg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NgLQASADQcACahCzHgJAAkACQAJAIAEtAOABQQFGDQAgASgC3AEhAiABKALYASEFIANB1AFqIAEQ1CYgA0EBNgLEAiADQZy/nAE2AsACIANCATcCzAIgA0GzBzYC9AEgA0EBOgDgASADIANB8AFqNgLIAiADIANB+AFqNgLwASADIANB4AFqNgL4ASADQYACaiADQcACahD9GiADQZQCaiADQdwBaigCADYCACADIAMpAtQBNwKMAiAFIAIgA0GAAmoQ4BohAiABLQDgAUGiAUYNAQwHCyABEKELQQAhAiABLQDgASIFQQlHDQIgA0EJOgDAAiADQQhqIAEgA0HAAmoQ1xEgAygCDCECIAMoAghBAXFFDQEgA0GBgICAeDYCqAEgAyACNgKsAQwHCyABIAEQmiwQpxcMBQsgAS0A4AEhBQsgAyACNgLgAQJAIAVB/wFxQRtGDQAgASgC3AEhAiABKALYASEFIANB5AFqIAEQ1CYgA0EBNgLEAiADQZy/nAE2AsACIANCATcCzAIgA0GzBzYC9AEgA0EbOgD/ASADIANB8AFqNgLIAiADIANB+AFqNgLwASADIANB/wFqNgL4ASADQYACaiADQcACahD9GiADQZQCaiADQewBaigCADYCACADIAMpAuQBNwKMAiAFIAIgA0GAAmoQ4BohAiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgARChCyADQagBakEIaiADQcgBakEIaigCADYCACADIAI2ArgBIAMgBDYCtAEgAyADKQLIASIPNwOoAQJAAkAgD6ciBUGAgICAeGoOAgAKAQsgASADQSBqEMcFDAoLIAMpAqwBIQ8gASABKAKIAUF+cSAIchCoEiADQSBqEJYmIAMgAjYC1AIgAyAENgLQAiADIA83AsQCIAMgBTYCwAIgASgCiAEhAiADIANBHGo2AswCAkAgAkGAAXENACABIAJBgAFyNgKIASAAIANBwAJqIAEQ5BIgASABKAKIAUH/fnE2AogBDAsLIAAgA0HAAmogARDkEgwKCyABIAEQmiwQpxcMBQsACyADQYGAgIB4NgKoASADIAI2AqwBIANB4AFqEKYrDAELIANBgYCAgHg2AqgBIAMgAjYCrAELIANByAFqELYoDAILIAMgBjYCrAEgA0GBgICAeDYCqAEMAQsgA0GBgICAeDYCqAEgAyACNgKsAQsgBBCcLAsgASADQSBqEMcFIANBqAFqQQRyEOkHCyAAQYCAgIB4NgIACyADQYADaiQAC74LAgh/An4jAEGAAWsiAiQAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOBwABAgMEBQYACyABKAIYIQMgASgCFCEEIAEoAhAhBQJAIAEpAwgiCkIDg0IAUg0AIAqnIgYgBigCACIGQQFqNgIAIAZBf0wNCAsgAS0AHCEHQQAhBgJAIAEoAiAiAUUNABD7JyEGIAEpAgQhCyABKAIAIQgQ/CchASACQSBqIAgQdgJAQeAARQ0AIAEgAkEgakHgAPwKAAALIAYgCzcCBCAGIAE2AgALIAAgBjYCICAAIAc6ABwgACADNgIYIAAgBDYCFCAAIAU2AhAgACAKNwMIIABBADYCAAwGCyABKAIUIQMgASgCECEEIAJBCGogAUEEahDFCSABLQAcIQUCQAJAIAEoAhgiBg0AQQAhAQwBCxD7JyEBIAYpAgQhCiAGKAIAIQcQ/CchBiACQSBqIAcQdgJAQeAARQ0AIAYgAkEgakHgAPwKAAALIAEgCjcCBCABIAY2AgALIAAgAikCCDcCBCAAIAU6ABwgACABNgIYIAAgAzYCFCAAIAQ2AhAgAEEBNgIAIABBDGogAkEQaigCADYCAAwFCyABKAIUIQQgASgCECEFIAEoAgwhByABKAIIIQgQ/SchBiACQSBqIAEoAgQQvAIgBkEgaiACQSBqQSBqKQMANwMAIAZBGGogAkEgakEYaikDADcDACAGQRBqIAJBIGpBEGopAwA3AwAgBkEIaiACQSBqQQhqKQMANwMAIAYgAikDIDcDAAJAAkAgASgCGCIDDQBBACEBDAELEPsnIQEgAykCBCEKIAMoAgAhCRD8JyEDIAJBIGogCRB2AkBB4ABFDQAgAyACQSBqQeAA/AoAAAsgASAKNwIEIAEgAzYCAAsgACABNgIYIAAgBDYCFCAAIAU2AhAgACAHNgIMIAAgCDYCCCAAIAY2AgQgAEECNgIADAQLIAEoAhQhAyABKAIQIQQgAkEUaiABQQRqEOACIAEtABwhBQJAAkAgASgCGCIGDQBBACEBDAELEPsnIQEgBikCBCEKIAYoAgAhBxD8JyEGIAJBIGogBxB2AkBB4ABFDQAgBiACQSBqQeAA/AoAAAsgASAKNwIEIAEgBjYCAAsgACACKQIUNwIEIAAgBToAHCAAIAE2AhggACADNgIUIAAgBDYCECAAQQM2AgAgAEEMaiACQRxqKAIANgIADAMLIAEpAgwhChD9JyEGIAJBIGogASgCBBC8AiAGQSBqIAJBIGpBIGoiAykDADcDACAGQRhqIAJBIGpBGGoiBCkDADcDACAGQRBqIAJBIGpBEGoiBSkDADcDACAGQQhqIAJBIGpBCGoiBykDADcDACAGIAIpAyA3AwAgASgCCCEIEPonIQEgAkEgaiAIEEIgAUE4aiACQSBqQThqKQMANwMAIAFBMGogAkEgakEwaikDADcDACABQShqIAJBIGpBKGopAwA3AwAgAUEgaiADKQMANwMAIAFBGGogBCkDADcDACABQRBqIAUpAwA3AwAgAUEIaiAHKQMANwMAIAEgAikDIDcDACAAIAo3AgwgACABNgIIIAAgBjYCBCAAQQQ2AgAMAgsgACABKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwBCyABKAIEIQYQ+ichASACQSBqIAYQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMAIABBBjYCACAAIAE2AgQLIAJBgAFqJAAPCwALhwsCHX8FfiMAQcAAayIBJAAQhighAiAAKAIAIgAoAhQhAyAAKAIQIQQgAC0AUiEFIAAtAFEhBiAALQBQIQcgACgCTCEIIAAoAkghCQJAAkACQCAAKAIAQQFHDQACQCAAKQMIIh5CA4NCAFINACAepyIKIAooAgAiCkEBajYCACAKQX9MDQMLQgEhHyAAKQMYIiBQDQEgIEIDg1BFDQEgIKciCiAKKAIAIgpBAWo2AgAgCkF/Sg0BDAILQgAhHyAANQIYISACQCAAKQMIIh5CA4NCAFINACAepyIKIAooAgAiCkEBajYCACAKQX9MDQILIAAxABxCIIYgIIQhIAsCQAJAAkACQAJAIAAtAEUi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IAMoAtABIQEgBEKx3tWjBzcDaCAEQqHSuQM3A2AgBEH5gICAeDYCWCADIAEgAiAEQdgAahDeI0EBIQZBASEPDAcLIAMoAtQBIQIgAygC0AEhASAEQfqAgIB4NgJYIARCodK5AzcDYCADIAEgAiAEQdgAahDeI0EBIQ8MBgtBASEOIAdBAXENBSADKALUASECIAMoAtABIQEgBEGlgYCAeDYCWCAEQtHGvfO2jh03A2AgAyABIAIgBEHYAGoQ3iMMBQsgBCAQNgJYIAQgA0EXEKYTIAQoAgQhEiAEKAIAQQFxRQ0BIARB2ABqEKgrIBIhAgsgFBDGIQwBCyADKALUASETAkAgDCAEKAIQRw0AIARBEGoQ5R0gBCgCFCEJCyAJIAxBMGxqIgFBADoAHCABQQA2AhggASARNgIUIAEgAjYCECABIBM2AgQgASANNgIAIAEgEjYCJCABIBA2AiAgCi0AACECIAQvAFUhDSABIA5BAXE6ACogASAGQQFxOgApIAEgD0EBcToAKCABIA07AB0gAUEfaiACOgAAIAEgFDcCCCABQS9qIAstAAA6AAAgASAEKABQNgArIAQgDEEBaiIMNgIYIAMtAOABIgJBB0YNAyACQRNGDQYgAygC3AEhAiADKALYASEBIARBHGogAxDUJiAEQQE2AlwgBEGcv5wBNgJYIARCATcCZCAEQbMHNgJEIARBBzoATyAEIARBwABqNgJgIAQgBEHIAGo2AkAgBCAEQc8AajYCSCAEQShqIARB2ABqEP0aIARBPGogBEEkaigCADYCACAEIAQpAhw3AjQgASACIARBKGoQ4BohAiADLQDgAUGiAUcNACADIAMQmiwQpxcLIARBEGoQpCtBASEBDAYLIAMoAtQBIQIgAygC0AEhASAEQaSBgIB4NgJYIARCsd7Vowc3A2AgAyABIAIgBEHYAGoQ3iNBASEGDAALCyADEKELDAALCyAEQdgAakEEciADENQmIARBETYCbCAEQejVmwE2AmggBEGwgICAeDYCWCADKALYASADKALcASAEQdgAahDgGiECQQEhASADLQDgAUGiAUcNASADIAMQmiwQpxcMAQsgBCgCFCEGQQEhAQJAIAQoAhAiDkGAgICAeEcNACAGIQIMAQsgAxChCyADKALUASEBQRRBBBCaKiICIAE2AhAgAiAFNgIMIAIgDDYCCCACIAY2AgQgAiAONgIAQQAhAQsgACACNgIEIAAgATYCACAEQfAAaiQAC7QMAQp/IwBBkAJrIgIkACABKALYASEDIAEQoQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABRQ0AIAEoAtwBIQQgASgC2AEhBSACQSRqIAEQ1CYgAkEBNgLkASACQZy/nAE2AuABIAJCATcC7AEgAkGzBzYCgAEgAkEAOgAwIAIgAkH8AGo2AugBIAIgAkHEAGo2AnwgAiACQTBqNgJEIAJByABqIAJB4AFqEP0aIAJB3ABqIAJBLGooAgA2AgAgAiACKQIkNwJUIAUgBCACQcgAahDgGiEEIAEtAOABQaIBRg0BDAkLIAEoAtQBIQUgASgC0AEhBiABEKELAkACQCABKAKIASIEQYCAgCBxRQ0AIAEgBEH///9fcTYCiAEgAkEYaiABENETIAIoAhghBCABIAEoAogBQYCAgCByNgKIASACKAIcIQcMAQsgAkEQaiABENETIAIoAhQhByACKAIQIQQLAkAgBEEBcUUNACAHKAIEIQEgBygCACEEQQRBBBDLKiIIIAc2AgAgAiAFNgL0ASACIAY2AvABIAIgCDYC5AEgAkEwNgLsASACQfmcnAE2AugBIAJBuIGAgHg2AuABIAQgASACQeABahDgGiEBIABBADYCACAAIAE2AgQMCgsgAiAHNgIwAkAgAS0A4AFBAUYNACABKALcASEEIAEoAtgBIQUgAkE0aiABENQmIAJBATYC5AEgAkGcv5wBNgLgASACQgE3AuwBIAJBswc2AoABIAJBAToAQyACIAJB/ABqNgLoASACIAJBxABqNgJ8IAIgAkHDAGo2AkQgAkHIAGogAkHgAWoQ/RogAkHcAGogAkE8aigCADYCACACIAIpAjQ3AlQgBSAEIAJByABqEOAaIQQgAS0A4AFBogFGDQIMBwsgARChCyACQeABaiABQYCAgKACEMcfIAJBCGogAkHgAWoQ2SEgAigCDCEJIAIoAghBAXENBSACIAk2AkQgAS0AiwFBBHENAyACQQA2AnwgAkH8AGpBCGohCiACQeABakEIaiEGA0ACQCABLQDgASIEQdcARg0AQRMhBgwECyABEKELAkACQAJAIAEtAOABQd4ARg0AIAJB4AFqIAFBgICAoAIQxx8gAigC5AEhBSAC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DDYCMCACIA02AiwCQAJAIAEtAOABQRxGDQAgAkHwAGogARDhAiACKAJ0IQ4CQCACKAJwIg9BB0cNACAAQYCAgIB4NgIAIAAgDjYCBAwCCyACQThqQQhqIAVBCGooAgA2AgAgAiAFKQIANwM4IAIoAogBIRAgAigChAEhESACKAKAASESIAIoAnwhEyACKAJ4IQ0MBAsgASgC2AEhDSABEKELIAEoAtQBIREgAkHwAGogAUEAENECIAIoAnQhDAJAIAIoAnAiCkEHRg0AIAMgBCkDADcDACADQRhqIARBGGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDACACIAw2AkwgAiAKNgJIAkACQCABLQDgASIMQRdHDQAgARChCyACQRhqIAEQwhggAigCHCEQIAIoAhhBAXENASACQRBqIAJByABqEK4PIAIoAhQhDCACKAIQIQogAkH/gICAeDYCcCABIAogDCACQfAAahDeIyABKALUASEKQSgQsCshDAJAQShFDQAgDCACQcgAakEo/AoAAAsgAiAKNgJYIAIgDTYCVCACIBA2AlAgAiAMNgJMIAJBBDYCSCABLQDgASEMC0EAIRACQCABLQCRAUEgcUUNACAMQf8BcUEJRw0AIAJBCGogAUEBIAEoAtgBEIETIAIoAgwhECACKAIIQQFxDQELIAEoAtQBIRNBKBCwKyEOAkBBKEUNACAOIAJByABqQSj8CgAAC0ECIQ8gAS0AkQFBIHFFDQQgAS0A4AFB/wFxQQpHDQQgARChCyABKALUASEMIAEoAtABIQogAkH+gICAeDYCcCABIAogDCACQfAAahDeIwwECyAAQYCAgIB4NgIAIAAgEDYCBCACQcgAahDpFQwBCyAAQYCAgIB4NgIAIAAgDDYCBAsgAkEsahCUKAwFCyAAIAIpAiA3AgAgAEEIaiACQSBqQQhqKAIANgIADAULIA0hEiATIQkgDSEKCyABKALUASEUAkAgCCACKAIgRw0AIAJBIGoQ8R0gAigCJCEHCyAHIAZqIgwgDzYCACAMQRhqIBA2AgAgDEEUaiARNgIAIAxBEGogEjYCACAMQQxqIBM2AgAgDEEIaiANNgIAIAxBBGogDjYCACAMQRxqIAIpAzg3AgAgDEEkaiACQThqQQhqKAIANgIAIAxBLGogFDYCACAMQShqIAs2AgAgDEEwaiACKQIsNwIAIAxBOGogAkEsakEIaigCADYCACACIAhBAWoiCDYCKAJAAkAgAS0A4AEiDEEBRg0AAkAgDEEHRg0AIAEoAtwBIQwgASgC2AEhCCACQZwBaiABENQmIAJBATYCdCACQZy/nAE2AnAgAkIBNwJ8IAJBswc2AsQBIAJBBzoAzwEgAiACQcABajYCeCACIAJByAFqNgLAASACIAJBzwFqNgLIASACQagBaiACQfAAahCTECACQbwBaiACQaQBaigCADYCACACIAIpApwBNwK0ASAIIAwgAkGoAWoQ4BohDCABLQDgAUGiAUYNAgwECyABEKELIA9BAkcNACABLQDgAUH/AXFBAUcNACABKALUASEMIAEoAtABIQ0gAkG6gICAeDYCcCABIA0gDCACQfAAahDeIwsgBkHAAGohBgwBCwsgASABEJosEKcXCyAAQYCAgIB4NgIAIAAgDDYCBAsgAkEgahC6KAsgAkHQAWokAAuKDAEJfyMAQdAAayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDKAIADgkAAQgCAwQFBgcACyADQQRqIAEQ1AohAAwICyADKAIEIQRBACEAIAJBGGogAygCCCIFQQBBBEEMEKgMIAIoAhwhBiACKAIYQQFGDQkgAigCICEHAkAgBUUNACAHIQAgBSEDA0AgAiAENgJMIAJBATYCHCACQZy/nAE2AhggAkIBNwIkIAJByQE2AkQgAiACQcAAajYCICACIAJBzABqNgJAIAIgAkEYahDtCSAAQQhqIAJBCGooAgA2AgAgACACKQIANwIAIABBDGohACAEQQhqIQQgA0F/aiIDDQALIAUhAAsgAiAHIABB4p6aAUECEJEFIAcgABCmIyAGIAcQ4ywgAkECNgIcIAJBtNaDATYCGCACQgE3AiQgAkHKATYCRCACIAJBwABqNgIgIAIgAjYCQCABKAIAIAEoAgQgAkEYahDfBSEAIAIoAgAgAigCBBDkLAwHCyACIANBCGo2AkwgAygCBCEAIAJBAjYCHCACQdDWgwE2AhggAkICNwIkIAJB+AA2AgwgAkHLATYCBCACIAA2AkAgAiACNgIgIAIgAkHAAGo2AgggAiACQcwAajYCACABKAIAIAEoAgQgAkEYahDfBSEADAYLIAMoAgQh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CyEBDAELIAIgAEEEajYCDCABQdi7nAFBByACQQxqQaIFEP8LIQELIAJBEGokACABC7ELAQ1/IwBBwAFrIgMkAAJAAkACQAJAAkACQAJAAkAgAS0A4AEiBBClFQ0AIARBfmoOAwYDAQILIANBOGogASACELMFAkACQCADLQBMQQJHDQAgACADKAI4NgIEQQchAQwBCyADQfwAaiADQdAAaikDADcCACADQfQAaiADQcgAaikDADcCACADQewAaiADQcAAaikDADcCACADIAMpAzg3AmQCQEEkRQ0AIABBBGogA0HgAGpBJPwKAAALQQAhAQsgACABNgIADAYLIAEoAtgBIQUgARChCyADQQA2AhQgA0KAgICAgAE3AgwgA0E4akEIaiECIANB4ABqQQhqIQZBACEHQQAhCANAAkACQAJAAkACQAJAAkAgAS0A4AEiBEF7ag4DAQACAAsCQCAIQf7/e0sNACAIIAdyRQ0AIANBu4CAgHg2AjggASAIIAcgA0E4ahDeIyABLQDgASEECwJAIARB/wFxIglBHEYNACADQThqIAEQlAggAygCPCEKIAMoAjgiBEEHRg0FIAYgAikDADcDACAGQRhqIAJBGGopAwA3AwAgBkEQaiACQRBqKQMANwMAIAZBCGogAkEIaikDADcDACADIAo2AmQgAyAENgJgIANBDGogA0HgAGpB9LecARD2HgwECyABKALYASEIIAEQoQsgASgC1AEhCyADQThqIAFBABDRAiADKAI8IQogAygCOCIMQQdGDQQgA0EYakEYaiINIAJBGGopAwA3AwAgA0EYakEQaiIOIAJBEGopAwA3AwAgA0EYakEIaiIPIAJBCGopAwA3AwAgAyACKQMANwMYIAEoAtQBIQdBKBCwKyIEIAo2AgQgBCAMNgIAIAQgAykDGDcDCCAEQRBqIA8pAwA3AwAgBEEYaiAOKQMANwMAIARBIGogDSkDADcDACADQQA2AlAgAyALNgJMIAMgCDYCSCADIAc2AkQgAyAINgJAIAMgBDYCPCADQQI2AjggA0EMaiADQThqQYS4nAEQ9h4MAwsgARChCwJAAkAgAS0AkQFBBHENAEEAIQQgAS0AiQFBwABxRQ0DIAEtAOABQf8BcUEKRg0BDAMLQQAhBCABLQDgAUEKRw0CCyABEKELQQEhBAwBCyABEKELIANB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tSIgBigCCCAGKAIMIAIgAyAFEMUlCyALQQJJDQQgCEECSQ0EIAMgDyASIA8gEkkiCxsiD0kNBCAFKAIAIRMgECASQQJ0aiISIBAgCxshCAJAIA9BAnQiD0UNACACIAggD/wKAAALIAIgD2ohDwJAIAsNACACIQsDQCALIA9GDQUgEiAVRg0FIAggEiALIBMoAgAgEigCACALKAIAEN8hIhEbKAIANgIAIBIgEUECdGohEiALIBFBAXNBAnRqIQsgCEEEaiEIDAALCyAUIRIDQCAIQXxqIQggD0F8aiELIBIgCCALIBMoAgAgCygCACAIKAIAEN8hIhEbKAIANgIAIAsgEUECdGohDyAIIBFBAXNBAnRqIgggEEYNAyASQXxqIRIgDyACRw0ADAMLCwJAIAhBAXENACAAIAEgAiADIAUQxSULIAZBgANqJAAPCyAWQQF0IQggDiELDAMLIAIhCwsgDyALayISRQ0AIAggCyAS/AoAAAsgFkEBdEEBciEIIA4hCwwACwsLwAkCF38CfiMAQZABayICJAAgASgCBCEDIAJBMGogASgCCCIEQQhBOBCVDyACKAI0IQUCQAJAIAIoAjBBAUYNACACKAI4IQYCQCAFRQ0AIARBOGwhByACQSVqIQhBACEJIAUhCgNAIAcgCUYNAQJAAkACQAJAIAMgCWoiASgCACILDgMAAQIACyACQQhqIAFBCGoQwwQgAUEoaigCACEBEP0nIQwgAkEwaiABELwCIAxBIGogAkEwakEgaikDADcDACAMQRhqIAJBMGpBGGopAwA3AwAgDEEQaiACQTBqQRBqKQMANwMAIAxBCGogAkEwakEIaikDADcDACAMIAIpAzA3AwAgAigCCCENIAIoAgwhDiACKAIQIQ8gAigCFCEQIAIoAhghESACKAIcIRIgAigCICETIAItACQhFCACQQRqQQJqIAhBAmotAAA6AAAgAiAILwAAOwEEIAIoAiwhFQwCCyABQSBqKAIAIRMgAUEcaigCACESIAFBGGooAgAhESABQQxqKAIAIQ4gAUEIaigCACENAkAgAUEQaikDACIZQgODQgBSDQAgGaciDCAMKAIAIgxBAWo2AgAgDEF/TA0GCyABQSRqLQAAIRRBACEWQQAhDAJAIAFBKGooAgAiD0UNABD7JyEMIA8pAgQhGiAPKAIAIRAQ/Cch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NwIAIAJBDGogA0EMaikCADcCACACIAMpAgQ3AgQgAiAHNgIAIAJBIGogASgCFCIDKQMAIANBEGooAgAQuR8gAikDICEIIAIoAighBSACQTBqIAIQnwUCQCAIQgODIglCAFINACAIpyIDIAMoAgAiA0EBajYCACADQX9MDQILAkAgAikDECIKQgODIgtCAFINACAKpyIDIAMoAgAiA0EBajYCACADQX9MDQILQQAtAKDxngEaQcAAEH0iBkUNASAGQQA6ABwgBiAFNgIYIAZCADcDECAGIAg3AwggBkEaNgIAQQAtAKDxngEaQcAAEH0iAUUNASABQgA3AxggASAKNwIQIAFBADYCCCABQRs2AgAgAUEgakIANwMAQQAtAKDxngEaQcAAEH0iA0UNASADIAIpAzA3AwAgA0E4aiACQTBqQThqKQMANwMAIANBMGogAkEwakEwaikDADcDACADQShqIAJBMGpBKGopAwA3AwAgA0EgaiACQTBqQSBqKQMANwMAIANBGGogAkEwakEYaikDADcDACADQRBqIAJBMGpBEGopAwA3AwAgA0EIaiACQTBqQQhqKQMANwMAAkACQCAHDQAgASEHIAYhBAwBCwJAIAtCAFINACAKpyIHIAcoAgAiB0EBajYCACAHQX9MDQMLAkAgCUIAUg0AIAinIgcgBygCACIHQQFqNgIAIAdBf0wNAwtBAC0AoPGeARpBwAAQfSIERQ0CIARBADoAHCAEIAU2AhggBEIANwMQIAQgCDcDCCAEQRo2AgBBAC0AoPGeARpBwAAQfSIHRQ0CIAdBADoAPCAHIAM2AjggB0IANwMwIAcgBjYCKCAHQgA3AyAgB0IANwMQIAcgATYCDCAHQQI2AgggB0EBNgIAQQAtAKDxngEaQcAAEH0iA0UNAiADQgA3AxggAyAKNwIQIANBADYCCCADQRs2AgAgA0EgakIANwMAC0EALQCg8Z4BGiACKAIcIQEgAigCGCEFQcAAEH0iBkUNASAGQQA6ADwgBiADNgI4IAZCADcDMCAGIAQ2AiggBkIANwMgIAZCADcDECAGIAc2AgwgBkECNgIIIAZBATYCAAJAIAtCAFINACAKpyIDIAMoAgAiB0F/ajYCACAHQQFHDQAgAyADKAIQEMYkCwJAIAlCAFINACAIpyIDIAMoAgAiB0F/ajYCACAHQQFH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Dxs2AgAgB0EEaiEHIA4gD0ECdGohDiARIBAgEk9BAnRqIREMAAsLIBMhDgNAIA4gCkF8aiIKKAIAIhEgB0F8aiIQKAIAIgcgESAHSxs2AgAgCiARIAdJQQJ0aiEKIBAgESAHT0ECdGoiByASRg0DIA5BfGohDiAKIAJHDQAMAwsLAkAgB0EBcQ0AIAAgASACIAMQ5SULIAVBgANqJAAPCyAVQQF0IQcgDSEKDAMLIAIhEQsgCiARayIKRQ0AIAcgESAK/AoAAAsgFUEBdEEBciEHIA0hCgwACwsLqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQyRUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMkVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCSECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQnSIgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCdIgsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCSECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDXESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEPQfEOMLIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahCrKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ3iMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQnSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELooCyAGEKMsCyABEJQoQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC6oKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMkVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDJFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQkhAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsgASgCDCEHIAMgASgCEDYCgAEgAyAHNgJ8IAMgASgCFCIINgJ4AkACQCACKAKIASIEQYCAgAFxDQAgAiAEQYCAgAFyNgKIASADQcAAaiADQfgAaiACEIkVIAIgAigCiAFB////fnE2AogBDAELIANBwABqIANB+ABqIAIQiRULIAMoAkQhBCADKAJAIgVBgICAgHhGDQAgAyADKAJIIgk2AjAgAyAENgIsIAMgBTYCKAJAAkAgAi0A4AFBAUYNACACKALcASEEIAIoAtgBIQUgA0E0aiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgJcIANBAToAZyADIANB2ABqNgKAASADIANB4ABqNgJYIAMgA0HnAGo2AmAgA0HAAGogA0H4AGoQkhAgA0HUAGogA0E8aigCADYCACADIAMpAjQ3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsCQAJAAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBCUYNAQtBACEKDAELIANBCToAeCADIAIgA0H4AGoQ1xEgAygCBCEKIAMoAgBBAXENAQsgAyAKNgJAIANB+ABqIAIgCC0AACAHLQAAIAQgCRD0HxDjCyADKAJ8IQsCQCADKAJ4IgxBgYCAgHhHDQAgA0HAAGoQqysgCyEEDAILIANB6ABqQQhqIg0gA0H4AGpBEGoiDikCADcDACADIAMpAoABNwNoAkAgDEGAgICAeEcNACACLwGQAUGAwABxRQ0AIAlBBnQhBQNAIAVFDQECQCAEKAIAQQRHDQAgBEEQaigCACEJIARBDGooAgAhDyADQamBgIB4NgJ4IAIgDyAJIANB+ABqEN4jCyAEQcAAaiEEIAVBQGohBQwACwsgA0GMAWogAUEIaigCADYCACADQfgAakEIaiIFIANBKGpBCGooAgA2AgAgAyADKQIoNwN4IAMgASkCADcChAEgASgCGCgCACEBIAIoAtQBIQkgBy0AACECIAgtAAAhB0HIAEEEEJ0qIgQgCzYCHCAEIAw2AhggBCAHOgBFIAQgAjoARCAEIAo2AkAgBCAGNgI8QQAhAiAEQQA2AjggBCAJNgI0IAQgATYCMCAEQRBqIA4pAwA3AgAgBEEIaiAFKQMANwIAIAQgAykDeDcCACAEIAMpA2g3AiAgBEEoaiANKQMANwIADAQLIAohBAsgA0EoahC6KAsgBhCjLAsgARCUKEEBIQILIAAgBDYCBCAAIAI2AgAgA0GQAWokAAuqCgENfyMAQZABayIDJABBACEEAkACQAJAIAItAJEBQSBxRQ0AAkACQCACKAKIASIEQYAgcQ0AIAIgBEGAIHI2AogBIANBCGogAhDJFSADKAIIIQUgAiACKAKIAUH/X3E2AogBIAMoAgwhBAwBCyADQRBqIAIQyRUgAygCFCEEIAMoAhAhBQsgBUEBcQ0BCyAEIQYCQAJAIAItAOABRQ0AIAIoAtwBIQQgAigC2AEhBSADQRxqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AiwgA0EAOgBgIAMgA0EoajYCgAEgAyADQdgAajYCKCADIANB4ABqNgJYIANBwABqIANB+ABqEJIQIANB1ABqIANBJGooAgA2AgAgAyADKQIcNwJMIAUgBCADQcAAahDgGiEEIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELIAEoAgwhByADIAEoAhA2AoABIAMgBzYCfCADIAEoAhQiCDYCeAJAAkAgAigCiAEiBEGAgIABcQ0AIAIgBEGAgIABcjYCiAEgA0HAAGogA0H4AGogAhCeIiACIAIoAogBQf///35xNgKIAQwBCyADQcAAaiADQfgAaiACEJ4iCyADKAJEIQQgAygCQCIFQYCAgIB4Rg0AIAMgAygCSCIJNgIwIAMgBDYCLCADIAU2AigCQAJAIAItAOABQQFGDQAgAigC3AEhBCACKALYASEFIANBNGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCXCADQQE6AGcgAyADQdgAajYCgAEgAyADQeAAajYCWCADIANB5wBqNgJgIANBwABqIANB+ABqEJIQIANB1ABqIANBPGooAgA2AgAgAyADKQI0NwJMIAUgBCADQcAAahDgGiEEIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELAkACQAJAAkAgAi0AkQFBIHFFDQAgAi0A4AFB/wFxQQlGDQELQQAhCgwBCyADQQk6AHggAyACIANB+ABqENcRIAMoAgQhCiADKAIAQQFxDQELIAMgCjYCQCADQfgAaiACIAgtAAAgBy0AACAEIAkQ9B8Q4wsgAygCfCELAkAgAygCeCIMQYGAgIB4Rw0AIANBwABqEKsrIAshBAwCCyADQegAakEIaiINIANB+ABqQRBqIg4pAgA3AwAgAyADKQKAATcDaAJAIAxBgICAgHhHDQAgAi8BkAFBgMAAcUUNACAJQQZ0IQUDQCAFRQ0BAkAgBCgCAEEERw0AIARBEGooAgAhCSAEQQxqKAIAIQ8gA0GpgYCAeDYCeCACIA8gCSADQfgAahDeIwsgBEHAAGohBCAFQUBqIQUMAAsLIANBjAFqIAFBCGooAgA2AgAgA0H4AGpBCGoiBSADQShqQQhqKAIANgIAIAMgAykCKDcDeCADIAEpAgA3AoQBIAEoAhgoAgAhASACKALUASEJIActAAAhAiAILQAAIQdByABBBBCdKiIEIAs2AhwgBCAMNgIYIAQgBzoARSAEIAI6AEQgBCAKNgJAIAQgBjYCPEEAIQIgBEEANgI4IAQgCTYCNCAEIAE2AjAgBEEQaiAOKQMANwIAIARBCGogBSkDADcCACAEIAMpA3g3AgAgBCADKQNoNwIgIARBKGogDSkDADcCAAwECyAKIQQLIANBKGoQuigLIAYQoywLIAEQlChBASECCyAAIAQ2AgQgACACNgIAIANBkAFqJAALqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQyRUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMkVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCSECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQihUgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCKFQsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCSECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDXESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEPQfEOMLIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahCrKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ3iMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQnSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELooCyAGEKMsCyABEJQoQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC6oKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMkVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDJFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQkhAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsgASgCDCEHIAMgASgCEDYCgAEgAyAHNgJ8IAMgASgCFCIINgJ4AkACQCACKAKIASIEQYCAgAFxDQAgAiAEQYCAgAFyNgKIASADQcAAaiADQfgAaiACEJ0iIAIgAigCiAFB////fnE2AogBDAELIANBwABqIANB+ABqIAIQnSILIAMoAkQhBCADKAJAIgVBgICAgHhGDQAgAyADKAJIIgk2AjAgAyAENgIsIAMgBTYCKAJAAkAgAi0A4AFBAUYNACACKALcASEEIAIoAtgBIQUgA0E0aiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgJcIANBAToAZyADIANB2ABqNgKAASADIANB4ABqNgJYIAMgA0HnAGo2AmAgA0HAAGogA0H4AGoQkhAgA0HUAGogA0E8aigCADYCACADIAMpAjQ3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsCQAJAAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBCUYNAQtBACEKDAELIANBCToAeCADIAIgA0H4AGoQ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IAJBEGoQlSkhAQwLCyACIAAoAgQ2AgggAkEBNgIUIAJB7MabATYCECACQgE3AhwgAkELNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwKCyACIAAoAgQ2AgggAkEBNgIUIAJBjMebATYCECACQgE3AhwgAkELNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwJCyACQQA2AiAgAkEBNgIUIAJBwMebATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQlSkhAQwICyACQQA2AiAgAkEBNgIUIAJB6MebATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQlSkhAQwHCyACIAA2AgggAkEBNgIUIAJBmMibATYCECACQgE3AhwgAkH5ADYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqEJUpIQEMBgsgAkEANgIgIAJBATYCFCACQcTImwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMBQsgAkEANgIgIAJBATYCFCACQfDImwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMBAsgAkEANgIgIAJBATYCFCACQZjJmwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMAwsgAkEANgIgIAJBATYCFCACQbDJmwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMAgsgAiAALQAIOgAMIAIgACgCBDYCCCACQQE2AhQgAkHYyZsBNgIQIAJCATcCHCACQbIHNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwBCyACIAAoAgQ2AgggAkEBNgIUIAJB/MmbATYCECACQgE3AhwgAkEFNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQsgAkEwaiQAIAELqgkCBH8BfiMAQSBrIgMkACABKAIcIQQgA0EQaiACIAEoAhgiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIHQv8Bg0IEUQ0AIAAgBzcCAAwBCwJAAkACQAJAAkACQAJAAkACQCAFRQ0AIANBEGogAiAFEI4jIAMtABBBBEYN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IAEoAgQQpwEgACADEP0CDAYLIAEoAgghAyAAIAEoAgQQpwEgACADEP0CDAULAkAgASgCBCIDQQJGDQAgASgCCCEEAkAgA0EBcUUNACAAIAQQpwEMAQsgBCAAEJ4gCwJAIAEoAhgiA0UNACAAIAMQpwELAkAgASgCHCIDRQ0AIAAgAxCnAQsgACABKAIMEP0CDAQLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCeIAwCCyADIAAQnyAMAQsgACADEMInCyAAIAEoAgwQpwEgACABKAIQEP0CDAMLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCeIAwCCyADIAAQnyAMAQsgACADEMInCyAAIAEoAgwQpwEgACABKAIQEP0CDAILIAFBCGogABDTBwwCCyAAIAEoAgQQpwELIAEoAgBBEUcNAQsgAkHgAGoQiCIgAkE4akEgaiABQShqIgMpAwA3AwAgAkE4akEYaiABQSBqIgQpAwA3AwAgAkE4akEQaiABQRhqIgUpAwA3AwAgAkE4akEIaiABQRBqIgYpAwA3AwAgASkDCCEMIAEgAikDYDcDCCAGIAJB4ABqQQhqIgcpAwA3AwAgBSACQeAAakEQaiIIKQMANwMAIAQgAkHgAGpBGGoiCSkDADcDACADIAJB4ABqQSBqIgopAwA3AwAgAiAMNwM4IAJBCGogACACQThqQQAQXCABQQhqIQACQAJAAkAgAigCCEFtaiILQQIgC0ECSRsOAwABAgALIAEpAwAhDCABQgE3AwAgAkHgAGpBKGogAykDADcDACAKIAQpAwA3AwAgCSAFKQMANwMAIAggBikDADcDACAHIAApAwA3AwAgAEEANgIAIAIgDDcDYCACQeAAahDtAwwCCyAAEIcFIABBIGogAkEIakEoaikDADcDACAAQRhqIAJBCGpBIGopAwA3AwAgAEEQaiACQQhqQRhqKQMANwMAIABBCGogAkEIakEQaikDADcDACAAIAIpAxA3AwAMAQsgARDtAyADIAJBCGpBKGopAwA3AwAgBCACQQhqQSBqKQMANwMAIAUgAkEIakEYaikDADcDACAGIAJBCGpBEGopAwA3AwAgACACQQhqQQhqKQMANwMAIAEgAikDCDcDAAsgAkGQAWokAAvnCAISfwF+IwBBMGsiASQAAkAC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QAJAAkACQCAEQSlHDQAgA0EoaiABKAIAIgVBEGpB4LyEARDsIyADKAIsIQQgAygCKCIGKAIIIgdFDQEgBiAHQX9qIgc2AghBgICAgHghCCAGKAIEIAdB8ABsaiIHQQRqIQkgBygCACIKQYCAgIB4ag4CAgEDCyADQQA2AqQBIANBNGpB3LyEASADQaQBakGQvYQBELchAAsgA0GkAWogARCnDSAAQRxqIAEoAgQgASgCCBCKFCAAQRY2AgAgACADKQKkATcCKCAAQTBqIANBrAFqKQIANwIAIABBOGogA0GkAWpBEGopAgA3AgAMBAsCQEEkRQ0AIANBgAFqIAlBJPwKAAALAkAgBigCCCIHDQBBgYCAgHghCiADQYGAgIB4NgKkAQwDCyAGIAdBf2oiBzYCCCAGKAIEIAdB8ABsaiEHAkBB8ABFDQAgA0GkAWogB0HwAPwKAAALIAMoAqQBIgpBgoCAgHhIDQIgA0HYAmogA0GMAWopAgA3AwAgA0HgAmogA0GUAWopAgA3AwAgA0HoAmogA0GcAWopAgA3AwAgAyADKQKEATcD0AIgB0EEaiEJIAMoAoABIQggAy0AkAIhBgwBCyAHLQBsIQYLIANBjAFqIAlBCGopAgA3AgAgA0GUAWogCUEQaikCADcCACADQZwBaiAJQRhqKQIANwIAIAMgCjYCgAEgAyAJKQIANwKEAQJAQTxFDQAgA0E4aiAHQSRqQTz8CgAACyAFIAZBAXE6AGQgAiAFKQJQNwIYIAJBIGogBUHYAGoiBigCADYCACABEI0LGiADQfwAaiAGKAIANgIAIAMgBSkCUDcCdAJAAkAgCEGAgICAeEYNACADQbgCaiADQdACakEIaikDADcCACADQcACaiADQeACaigCADYCACADQawCakEgaiACQRhqIgFBCGooAgA2AgAgAyAINgKsAiADIAMpA9ACNwKwAiADIAEpAgA3AsQCAkBBJEUNACADQaQBaiACQST8CgAACyADQSBqIANBpAFqEKARIANBrAJqIAMoAiAgAygCJEHwvIQBEIYfAkACQAJAAkAgAygCtAIOAgIBAAsgA0EIaiADQawCahDTJEEKIQYgAygCDCECDAQLIANBGGogA0GsAmoQ5xsCQCADKAIYIgZBDEYNACADKAIcIQIMAgtB/PmHARDSLAALIANBEGogA0G4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aiEIDCgLIANBEGohByADQQxqIQgMJwsgA0E0aiEHIANBMGohCAwmCyADQSRqIQcgA0EgaiEIDCULIANBJGohByADQSBqIQgMJAsgA0EUaiEHIANBEGohCAwjCyADQSBqIQcgA0EcaiEIDCILIANBGGohByADQRRqIQgMIQsgA0EUaiEHIANBEGohCAwgCyADQRRqIQcgA0EQaiEIDB8LIAMoAggOBxYXGBkaGxwWCyADQSBqIQcgA0EcaiEIDB0LIANBEGohByADQQxqIQgMHAsgA0EYaiEHIANBFGohCAwbCyADKAIgIghBKGohByAIQSRqIQgMGgsgA0EIaiEHIANBBGohCAwZCyADQQhqIQcgA0EEaiEIDBgLIANBDGohByADQQhqIQgMFwsgA0EMaiEHIANBCGohCAwWCyADQRxqIQcgA0EYaiEIDBULIANBLGohByADQShqIQgMFAsgA0EIaiEHIANBBGohCAwTCyADKAIEIghBBGohBwwSCyADQRRqIQcgA0EQaiEIDBELIANBEGohByADQQxqIQgMEAsgA0EMaiEHIANBCGohCAwPCyADQQxqIQcgA0EIaiEIDA4LIANBEGohByADQQxqIQgMDQsgA0EQaiEHIANBDGohCAwMCyADQRBqIQcgA0EMaiEIDAsLIANBFGohByADQRBqIQgMCgsgA0EMaiEHIANBCGohCAwJCyADQQhqIQcgA0EEaiEIDAgLIANBHGohByADQRhqIQgMBwsgA0EQaiEHIANBDGohCAwGCyADQRBqIQcgA0EMaiEIDAULIANBFGohByADQRBqIQgMBAsgA0EUaiEHIANBEGohCAwDCyADQSRqIQcgA0EgaiEIDAILIANBJGohByADQSBqIQgMAQsgA0EIaiEHIANBBGohCAsgCCgCACEIIAFBDGogBygCADYCACABQQhqIAg2AgAgAUEEaiADNgIAIAFBEjYCACAAIAAoAghBAWo2AgggAUEwaiIBIAVHDQALQQELjgkCBn8BfiMAQeAAayIDJAACQAJAAkACQAJAAkAgAigCCCIERQ0AIAEoAggiBUUNAQJAAkACQAJAAkAgBEEBRw0AIAIoAgQiAigCAEEBRw0BIAAgASgCBCAFEOAXIABBFGpBACgC+KCcATYCACAAQQApAvCgnAE3AgwMCgsCQAJAIAUgBEYNACAF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JAAgAiABEPsPIgM2AgQCQAJAAkACQCADQdsARw0AIAJBCGpBCGoiBCABKAIAIgNB2ABqKAIANgIAIAIgAykCUDcDCCADQdAAaiEFAkAgARDUJA0AIAJBzABqIAVBCGooAgA2AgAgAkE4akEIaiIDIAQoAgA2AgAgAiACKQMINwM4IAIgBSkCADcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIAIABBiYDEADYCAAwECyABEPsPIgZB3gBGDQEMAgsgAkEANgI4IAJBBGpB0L2EASACQThqQazIhAEQtyEACyABENQkDQAgAkHMAGogBUEIaigCADYCACACQThqQQhqIgMgAkEIakEIaigCADYCACACIAIpAwg3AzggAiAFKQIANwJEIABBIGogASgCBCABKAIIEIoUIABBBDYCBCAAIAIpAzg3AiwgAEE0aiADKQMANwIAIABBPGogAkHIAGopAwA3AgAgAEGJgMQANgIADAELIAJBNGogBUEIaigCACIDNgIAIAJBKGogAzYCACACQQA2AhwgAkKAgICAwAA3AhQgAiAFKQIAIgg3AiwgAiAINwIgIAJBOGpBCGohAyACQSBqIQQCQAJAA0AgARD7D0EtRw0BIAMgARCnDSACQQA6AFggAkKBgMSA0AU3AjggAkEUaiACQThqEPESIAEQ1CQNAAsgAkE4akEIaiIDIAJBCGpBCGooAgAiBTYCACACQcwAaiAFNgIAIAIgAikDCCIINwM4IAIgCDcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELAkAgAigCHA0AIAEQ+w9B3QBHDQAgAkE4akEIaiIDIAEQpw0gAkEAOgBYIAJCgYDEgNALNwI4IAJBFGogAkE4ahDxEiABENQkDQAgAkHMAGogBUEIaigCADYCACADIAJBCGpBCGooAgA2AgAgAiACKQMINwM4IAIgBSkCADcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELIAJBkAFqQRRqIAVBCGooAgA2AgAgAkGQ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DAELAkAgBCgCCEEFRg0AIARBCGogARCyKAsCQCAEKAI8IgNFDQAgAyABEKQCCwJAIAQoAkAiA0UNACADKAIAIAEQrwILIAQoAjgiAkUNACAEKAI0IQMgAkEMbCECA0AgAygCACABEKQCIANBDGohAyACQXRqIgINAAsLIARB2ABqIgQgBUcNAAsLAkAgACgCMCIDRQ0AIAMgARCkAgsCQCAAKAI0IgNFDQAgAyABEK8WCwJAIAAoAjgiA0UNACADIAEQwx8LAkAgACgCICIDRQ0AIAAoAhwiBiADQQR0aiEEA0AgBigCDCEDIAYoAgAgARCkAgJAIANFDQAgAygCCCICRQ0AIAMoAgQhAyACQQJ0IQIDQCADKAIAIAEQrwIgA0EEaiEDIAJBfGoiAg0ACwsgBkEQaiIGIARHDQALCwuMCQEJfyMAQYACayICJAAgAiABKALYASIDNgIUAkACQAJAIAEtAOABQc8ARg0AQQghBAwBCyABEKELAkACQCABLQDgAUUNAEEHIQQMAQsgARChCyACQThqIAFBABDRAiACKAI8IQUCQAJAIAIoAjgiBEEHRg0AIAJBoAFqQSBqIAJBOGpBIGopAwA3AwAgAkGgAWpBGGogAkE4akEYaikDADcDACACQaABakEQaiACQThqQRBqKQMANwMAIAIgAikDQDcDqAEgAiAFNgKkASACIAQ2AqABIAEtAOABIQYCQAJAIAEtAJEBQSBxRQ0AIAZB/wFxQQlHDQAgASgC2AEhByABEKELAkACQCABKAKIASIGQYAgcQ0AIAEgBkGAIHI2AogBIAIgARDGEiACKAIAIQggASABKAKIAUH/X3E2AogBIAIoAgQhBgwBCyACQQhqIAEQxhIgAigCDCEGIAIoAgghCAsCQCAIQQFxRQ0AIAYhBQwCCyACQcABaiEIIAIgBjYCOAJAAkACQAJAIAQOBwEAAAACAgIBCyACQbgBaiEICyABKALUASEJQQxBBBDLKiIKIAk2AgggCiAHNgIEIAogBjYCACAIEMkrIAggCjYCAAwBCyACQThqELQGCyABLQDgASEGCyAGQf8BcUEBRg0CIAEoAtwBIQUgASgC2AEhBCACQcwBaiABENQmIAJBATYCPCACQZy/nAE2AjggAkIBNwJEIAJBswc2AvQBIAJBAToA/wEgAiACQfABajYCQCAC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Ig1BBUYNBiAGIAUpAwA3AwAgBkEYaiAFQRhqKQMANwMAIAZBEGogBUEQaikDADcDACAGQQhqIAVBCGopAwA3AwAgAiAMNgJEIAIgDTYCQAwFCyACQegAakEEciABENQmIAJBIDYCfCACQYTgmwE2AnggAkGwgICAeDYCaCABKALYASABKALcASACQegAahDgGiEMIAEtAOABQaIBRw0FIAEQmxIhCyABEKELIAEgCxCnFwwFCyACQegAaiABQQAQ+RsgAigCaCEMIAIoAvgBIg5BgYCAgHhGDQQCQEGMAUUiDw0AIAJBlAJqIAhBjAH8CgAACyACQYgCakEIaiIQIAdBCGooAgA2AgAgAiAHKQIANwOIAiAOQYCAgIB4Rg0BQQhBoAEQoCwiDUUNAiANIAw2AgACQCAPDQAgDUEEaiACQZQCakGMAfwKAAALIA0gDjYCkAEgDSACKQOIAjcClAEgDUGcAWogECgCADYCACACIA02AkQgAkEDNgJADAMLIAJB6ABqIAEQyBEgAikDaCERIAIpA3AhEiABKALYASEMIAEoAtwBIQ4gAkHoAGogARCrAiABIA42AtQBIAEgDDYC0AEgBCACKQJoNwIAIA0gBSgCADYCACACIA42AlwgAiAMNgJYIAIgEjcDUCACIBE3A0ggAkEANgJADAILIAYgAikClAI3AgAgBkEYaiACQZQCakEYaikCADcCACAGQRBqIAJBlAJqQRBqKQIANwIAIAZBCGogAkGUAmpBCGopAgA3AgAgAiAMNgJEIAJBBDYCQAwBCwALAkBBKEUiDA0AIAJBGGogAkHAAGpBKPwKAAALAkAgCyACKAIMRw0AIAJBDGoQ7B0gAigCECEDCwJAIAwNACADIApqIAJBGGpBKPwKAAALIApBKGohCiALQQFqIQsMAQsLIAJBBjYCQCACIAw2AkQgCRC5KAsgACACKQIMNwIAIABBCGogAkEMakEIaigCADYCACACQaADaiQAC7QIAgJ/AX4jAEEwayIDJAAgA0EYaiACIAEoAgBBABCLAgJAAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EANgIMIANBGGogAiADQQxqQcyEnAFBBhCzDQJAIAMtABhBBEYNACADKQMYIgVC/wGDQgRRDQAgACAFNwIADAELIANBGGog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RQ0AIAMoAgAgARCvAgsgACgCHCIDRQ0GIANBCGooAgAiAkUNBiACQTBsIQIgA0EEaigCAEEkaiEDA0ACQCADQXxqKAIAIgBFDQAgACABEK8CCwJAIAMoAgAiAEUNACAAIAEQrwILIANBMGohAyACQVBqIgINAAwHCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKkoDAMLIANBBGogARDXFwwCCyADQQRqIAEQ2iUMAQsgA0EEaiABEOkaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAhgiA0UNACADKAIAIAEQrwILIAAoAhwiA0UNBSADQQhqKAIAIgJFDQUgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIARQ0AIAAgARCvAgsCQCADKAIAIgBFDQAgACABEK8CCyADQTBqIQMgAkFQaiICDQAMBgsLIAAoAhAgARCkAiAAKAIMIgNFDQQgAygCACABEK8CDwsgACgCBCABEKQCIAAoAhAiA0UNAyADKAIAIAEQrwIPCyAAKAIwIAEQpAICQAJAAkACQCACDgQAAQIDAAsgAEEIaiABEKkoDwsgAEEEaiABENcXDwsgAEEEaiABENolDwsgAEEEaiABEOkaDwsgACgCECABEKQCAkAgACgCDCICRQ0AIAAoAgghAyACQShsIQIDQAJAAkACQAJAAkAgAygCAA4EAAECAwALIANBCGogARCpKAwDCyADQQRqIAEQ1xcMAgsgA0EEaiABENolDAELIANBBGogARDpGgsgA0EoaiEDIAJBWGoiAg0ACwsCQCAAKAIcIgNFDQAgAygCACABEK8CCyAAKAIgIgNFDQEgA0EIaigCACICRQ0BIAJBMGwhAiADQQRqKAIAQSRqIQMDQAJAIANBfGooAgAiAEUNACAAIAEQrwILAkAgAygCACIARQ0AIAAgARCvAgsgA0EwaiEDIAJBUGoiAg0ADAILCwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0ACQAJAAkACQAJAIAMoAgAOBAABAgMACyADQQhqIAEQqSgMAwsgA0EEaiABENcXDAILIANBBGogARDaJQwBCyADQQRqIAEQ6RoLIANBKGohAyACQVhqIgINAAsLIAAoAhAiA0UN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aiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ02AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIADAMLIAEQjQsNAAsgAkGcAWogBUEIaigCACIENgIAIAJBiAFqQQhqIgMgBDYCACACIAUpAgAiCDcClAEgAiAINwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ82AgAgACACKQOIATcCKCAAQTBqIAMpAwA3AgAgAEE4aiACQZgBaikDADcCAAwBCyACKAIEIQQgAkHIAWogARCnDSACQYgBakEQaiIDIAIoAhQgAigCGCAEQYTDhAEQ0SUiBEEQaikCADcDACACQYgBakEIaiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ42AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIACyACKAIQIAIoAhQQ9iwLIAJB4AFqJAALswkCCH8CfiMAQaALayIDJAAgA0EDNgIwIANBADsANSADQQA6AB4gA0EAOgAqIANBAToAICADQoKAgIAwNwIUIANBAzYCJCADQQE6ADQgA0EAOgA5IANBgAI7ASwgA0EBOwEoIANBATsBHCADQQJBASACQfUDSRsiBDoAOCADQaADaiADQRRqQRxqIAEgAhCmAgJAAkACQAJAIAMoAqADQQFHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIIAMtALUDIQEgAy0AtAMhBCADKAKwAyEFIAMoAqwDIQIgAygCqAMhBgwBCyADQcgIaiIBIANBvgNqLwEAOwEAIAMgAykBtgM3A8AIIAMpAqQDIQsgAykCrAMhDCADLwG0AyEFAkBByAJFDQAgA0E8akEcaiADQcADakHIAvwKAAALIANB1gBqIAEvAQA7AQAgAyAFOwFMIAMgDDcCRCADIAs3AjwgAyADKQPACDcBTgJAAkACQAJAAkAgAkH1A0kNACADQaADakECQQEgA0E8ahCeAQJAIAMoAqADIgFBgICAgHhHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIDAULIANBwAhqQQhqIgIgA0G+A2ovAQA7AQAgAyADKQG2AzcDwAggAy0AtQMhBSADLQC0AyEGIAMoArADIQcgAygCrAMhCCADKAKoAyEJIAMoAqQDIQoCQEGoAkUNACADQYgGaiADQcADakGoAvwKAAALIANBsAhqQQhqIAIvAQA7AQAgAyADKQPACDcDsAhBAC0AoPGeARpB0AIQfSICRQ0BIAIgBToAHSACIAY6ABwgAiAHNgIYIAIgCDYCFCACIAk2AhAgAiAKNgIMIAIgATYCCCACQoGAgIAQNwIAIAIgAykDsAg3AR4gAkEmaiADQbgIai8BADsBAAJAQagCRQ0AIAJBKGogA0GIBmpBqAL8CgAAC0HssoMBIQUMAwsgA0GgA2pBAEEBIANBPGoQlQEgAygCoAMNASADQcAIakEIaiICIANBvgNqLwEAOwEAIAMgAykBtgM3A8AIIAMtALUDIQEgAy0AtAMhBSADKAKwAyEGIAMoAqwDIQcgAygCqAMhCCADKAKkAyEJAkBBwAJFDQAgA0HQCGogA0HAA2pBwAL8CgAACyADQZALakEIaiACLwEAOwEAIAMgAykDwAg3A5ALQQAtAKDxngEaQeQCEH0iAkUNACACIAE6ABkgAiAFOgAYIAIgBjYCFCACIAc2AhAgAiAINgIMIAIgCTYCCCACQoGAgIAQNwIAIAIgAykDkAs3ARogAkEiaiADQZgLai8BADsBAAJAQcACRQ0AIAJBJGogA0HQCGpBwAL8CgAAC0HUs4MBIQUMAgsACyADQRBqIANBvgNqLwEAOwEAIAMgAykBtgM3AwgMAQsgAy0AOSEBIANBPGoQ8xUMAgsgAy0AtQMhASADLQC0AyEEIAMoArADIQUgAygCrAMhAiADKAKoAyEGIANBPGoQ8xULIAZBA0YNACAAQQM6AAkMAQsgACABOgAJIAAgBDoACCAAIAU2AgQgACACNgIAIAAgAy8BCDsBCgsgA0GgC2okAAvJCAIFfwF+IAAoAgQhASAAKAIAIQIgAEKIgICAgAE3AgAgASACa0HYAG4hAwJAAkACQCABIAJHDQAgACgCECICRQ0BIAAoAgwiBCAAKAIIIgMoAggiAUYNAiACQdgAbCIARQ0CIAMoAgQiBSABQdgAbGogBSAEQdgAbGogAPwKAAAMAgsDQAJAAkACQAJAAkACQAJAAkACQCACKAIAIgFBfGpBACABQXtqQQhJGw4IAQIDBAUGCAcACwJAAkAgAkEIaiIBKAIAQQVHDQAgAkEQaikDACIGQgODQgBSDQEgBqciASABKAIAIgRBf2o2AgAgBEEBRw0BIAEgASgCEBDGJAwBCyABELUOCwJAIAJBPGooAgAiAUUNACABEK4BIAFBwABBCBCzFgsCQCACQcAAaigCACIBRQ0AIAEoAgAiBBDQAyAEQeAAQQgQsxYgAUEMQQQQsxYLIAJBNGoiASgCACACQThqKAIAEO8iIAJBMGooAgAgASgCABCcLQwHCyACELUOIAJBxABqIgEoAgAgAkHIAGooAgAQmSUgAkHAAGooAgAgASgCABCdLSACQSBqIgEoAgBBgICAgHhGDQYgAkEkaiIEKAIAIAJBKGooAgAQniUgASgCACAEKAIAEJ4tDAYLIAJBCGoQtQ4gAkEwaigCABDVDQwFCwJAIAJBCGopAwAiBkIDg0IAUg0AIAanIgEgASgCACIEQX9qNgIAIARBAUcNACABIAEoAhAQxiQLIAJBIGooAgAQ1Q0MBAsgAkEIahC1DgJAIAJBPGooAgAiAUUNACABEK4BIAFBwABBCBCzFgsCQCACQcAAaigCACIBRQ0AIAEoAgAiBBDQAyAEQeAAQQgQsxYgAUEMQQQQsxYLIAJBNGoiASgCACACQThqKAIAEO8iIAJBMGooAgAgASgCABCcLQwDCwJAIAJBCGopAwAiBkIDg0IAUg0AIAanIgEgASgCACIEQX9qNgIAIARBAUcNACABIAEoAhAQxiQLAkAgAkEkaigCACIBRQ0AIAEQrgEgAUHAAEEIELMWCwJAIAJBKGooAgAiAUUNACABKAIAIgQQ0AMgBEHgAEEIELMWIAFBDEEEELMWCyACQTBqIgEoAgAgAkE0aigCABDvIiACQSxqKAIAIAEoAgAQnC0MAgsgAkEEaiIBELAJIAEoAgAgAkEIaigCABChLSACQRBqKAIAIgFFDQEgASgCACIEENADIARB4ABBCBCzFiABQQxBBBCzFgwBCyACQQhqIgEoAgAgAkEMaigCABCeJSACQQRqKAIAIAEoAgAQni0LIAJB2ABqIQIgA0F/aiIDDQALIAAoAhAiAkUNAAJAIAAoAgwiBCAAKAIIIgMoAggiAUYNACACQdgAbCIARQ0AIAMoAgQiBSABQdgAbGogBSAEQdgAbGogAPwKAAALIAMgASACajYCCAsPCyADIAEgAmo2AggL5QgCAn8BfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4TEhIBAgMEBQYHCAkKCwwNDg8QEQALIABBCGoQlhQMEQsCQCAAKAIEQYCAgIB4Rw0AIABBCGoQsAkgACgCCCAAQQxqKAIAEKEtAkAgACgCICIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIUIgEQrgMgAUEMQQQQsxYMEQsgAEEEahCwCSAAKAIEIABBCGooAgAQoS0CQCAAKAIcIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhAiARCuAyABQQxBBBCzFgwQCyAAQRBqEIwRIAAoAigiAUUNDyABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgwPCyAAQRBqIQECQAJAIAAtAERBBEcNACABEIwRDAELIAEQlhQLIAAoAlgiAUUNDiABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgwOCyAAQQhqIgEoAgAgAEEMaigCABCfJSAAKAIEIAEoAgAQoy0MDQsgAEEEahCuAwwMCyAAQQhqIgEoAgAgAEEMaigCABC6HCAAKAIEIAEoAgAQoy0MCwsgAEEEahCuAwwKCyAAQQRqEK4DDAkLIABBCGoQtx8gACgCCCAAQQxqKAIAEJ8tDAgLIABBBGoQrgMgAEEIahCuAyAAQQxqEK4DIABBEGoQrgMMBwsCQCAAKQMYIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCwJAIAAoAjBFDQAgAEEwahCuAwsgACgCNEUNBiAAQTRqEK4DDAYLIABBBGoQrgMMBQsgAEEEahCuAwwECyAAQQRqEK4DIABBCGoQrgMMAwsCQCAAKQMYIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCwJAIAAoAjBFDQAgAEEwahCuAwsCQCAAKAI0RQ0AIABBNGoQrgMLAkAgACgCQEUNACAAQcAAahCuAwsgACgCREUNAiAAQcQAahCuAwwCCwJAAkACQAJAIAAoAghBgICAgHhzIgFBBCABQQRJGw4EAQIFAwALIABBCGoQtx8gACgCCCAAQQxqKAIAEJ8tIABBGGoiASgCACAAQRxqKAIAELYQIAAoAhQgASgCABCgLQwECyAAKQMgIgNQDQMgA0IDg0IAUg0DIAOnIgEgASgCACICQX9qNgIAIAJBAUcNAyABIAEoAhAQxiQMAwsgAEEQahDMEwwCCyAAKQMYIAAoAiAQ8BkMAQsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIBRQ0AIAEQrgMgAUEMQQQQsxYLIABB4ABBCBCzFgucCQECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIBQXRqIgJBByACQSZJG0F/ag4kAAECAwQFBgcICQoLDA0ODxAREhMiFBUWFyIYGRobHB0eHyAhIgsgACgCCCICIAAoAgwQqx4gACgCBCACEJstDwsgAEEEahD8Kg8LIAApAwggAC0AHBDtKCAAKAIgIgAQuiggAEEMahCUKCAAQRhqEKgqIAAoAjwQ4CUgAEHAAGoQsisgAEHIAEEEELMWDwsgAEEEahCnLA8LIABBDGoQpywPCyAAQQRqEKcsIABBCGoQpywPCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDgwKAAECAwQFBgcICwkLCyAAQQhqEJcjDAoLIABBCGoQkCcMCQsgAEEEahCnLAwICyAAQQRqEMsfDAcLIABBBGoQqCwMBgsgAEEEahCoLAwFCyAAQQRqEKcsDAQLIABBBGoQqCwMAwsgAEEEahDULQwCCwJAAkACQCAAKAIEDgIAAQQLIAAoAgwiAiAAKAIQEO4iIAAoAgggAhChLQwBCyAAQQhqEOcRIAAoAgggACgCDBCjLQsgAEEcahCyKwwBCyAAKQMIEMYhIABBIGoQsisLIABBOGoQpywPCyAAQQhqEJcjDwsgAEEIahCQJw8LIABBBGoQpywgAEEIahCnLCAAQQxqEKcsDwsgAEEQahCpKiAAQQRqEP8qIAAoAigQhCwPCyAAQRBqEKcsAkAgACgCBEGAgICAeEYNACAAQQRqEP8qCyAAKAIgEIQsDwsgAEEEahCYKA8LIAApAwgQxiEPCwJAAkACQAJAAkAgACgCCA4GARgYAgMEAAsgACkDEBDGISAAKQMYEMYhDwsgACkDECAAKQMgEKYuDwsgACkDIBD7Kg8LIAApAxggACgCIBDIJg8LIAApAxAQxiEgACkDGBDGIQ8LIABBBGoQhywPCyAAQQRqEKcsIAAoAhgQhCwgACgCCCIAEIcsIABBIEEEELMWDwsgACgCCCICIAAoAgwQnSUgACgCBCACEKEtAkACQCAAKAIQIgIoAgBBgICAgHhGDQAgAhCVKAwBCyACQQRqEKcsCyACQRhBBBCzFiAAKAIgEOAlIABBJGoQsisPCyAAKQMIIAAtABwQ7SggACgCICIAEOAjIABBwABBBBCzFg8LIABBDGoQsysPCyAAQQRqEKcsDwsgAEEEahCnLA8LIABBCGoQ+yIPCyAAKQMIIAApAxgQrS4PCyAAKAIEIgBBwABqELUeIABBgAFqIgIoAgAgAEGEAWooAgAQtBsgACgCfCACKAIAEKItIAAoAngQhCwgAEGQAWoQiSsCQCAALQA8QQZGDQAgAEEQahC1HgsgAEGgAUEIELMWDwsgAEEEahCJKw8LIABBBGoQqCwPCyAAQQRqEKcsDwsgAEEEahCnLA8LIABBBGoQqCwPCyAAQQRqENQtDwsgAEEEahCoLA8LIAApAwgQxiEPCyAAQQRqEMsfCwuHCQICfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TEhIBAgMEBQYHCAkKCwwNDg8QEQALIABBCGoQ6hMMEQsCQCAAKAIEIgFBgICAgHhHDQAgAEEIahCwCSAAKAIIIAAoAgwQoS0CQCAAKAIgIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhQiACgCACIBELADIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBBGoQsAkgASAAKAIIEKEtAkAgACgCHCIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIQIgAoAgAiARCwAyABQeAAQQgQsxYgAEEMQQQQsxYPCyAAQRBqEO0QIAAoAigiAEUNDyAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFg8LIABBEGohAQJAAkAgAC0AREEERw0AIAEQ7RAMAQsgARDqEwsgACgCWCIARQ0OIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgACgCCCIBIAAoAgwQnyUgACgCBCABEKMtDwsgACgCBCIAELADIABB4ABBCBCzFg8LIAAoAggiASAAKAIMELocIAAoAgQgARCjLQ8LIAAoAgQiABCwAyAAQeAAQQgQsxYPCyAAKAIEIgAQsAMgAEHgAEEIELMWDwsgAEEIahC3HyAAKAIIIAAoAgwQny0PCyAAKAIEIgEQsAMgAUHgAEEIELMWIAAoAggiARCwAyABQeAAQQgQsxYgACgCDCIBELADIAFB4ABBCBCzFiAAKAIQIgAQsAMgAEHgAEEIELMWDwsgAEEQahDXFA8LIAAoAgQiABCwAyAAQeAAQQgQsxYPCyAAKAIEIgAQsAMgAEHgAEEIELMWDwsgACgCBCIBELADIAFB4ABBCBCzFiAAKAIIIgAQsAMgAEHgAEEIELMWDwsgAEEQahDXFAJAIAAoAkAiAUUNACABELADIAFB4ABBCBCzFgsgACgCRCIARQ0CIAAQsAMgAEHgAEEIELMWDwsCQAJAAkACQCAAKAIIIgJBgICAgHhzIgFBBCABQQRJGw4EAQIFAwALIABBCGoQtx8gAiAAKAIMEJ8tIAAoAhgiASAAKAIcELYQIAAoAhQgARCgLQ8LIAApAyAiA1ANAyADQgODQgBSDQMgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDGJA8LIAApAxAgACkDIBCqFA8LIAApAxghAyAAKAIgIgAoAgAgAEEEaigCABD0LCAAQRBBBBCzFiADUA0BIANCA4NCAFINASADpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIARQ0AIAAoAgAiARCwAyABQeAAQQgQsxYgAEEMQQQQsxYPCwuPBwIFfwZ+AkACQAJAIAEoAgQiBA0AQQAhAgwBCyADQQdxIQUgASkDECIJQvPK0cunjNmy9ACFIQogCUKD35Hzlszct+QAhSEJQQAhBkL1ys2D16zbt/MAIQsCQAJAIANBeHEiBw0AQuHklfPW7Nm87AAhDEEAIQgMAQtBACEIQuHklfPW7Nm87AAhDANAIAIgCGopAAAiDSAKhSIKIAx8IgwgCyAJfCILIAlCDYmFIgl8Ig4gCUIRiYUhCSAMIApCEImFIgpCFYkgCiALQiCJfCILhSEKIA5CIIkhDCALIA2FIQsgCEEIaiIIIAdJDQALIAdBf2pBeHFBCGohCAtCACENAkAgBUEESQ0AIAIgCGo1AAAhDUEEIQYLAkAgBkEBciAFTw0AIAIgCGogBmozAAAgBkEDdK2GIA2EIQ0gBkECciEGCwJAIAYgBU8NACACIAYgCGpqMQAAIAZBA3SthiANhCENCyABKAIMIghFDQEgASgCCCABKAIAIA0gA61COIaEIg0gCoUiCkIQiSAKIAx8IgqFIgwgCyAJfCILQiCJfCIOIA2FIAogCyAJQg2JhSIJfCIKIAlCEYmFIgl8IgsgCUINiYUiCSAMQhWJIA6FIgwgCkIgiULuAYV8Igp8Ig0gCUIRiYUiCUINiSAJIAxCEIkgCoUiCiALQiCJfCILfCIJhSIMQhGJIAwgCkIViSALhSIKIA1CIIl8Igt8IgyFIg1CDYkgDSAKQhCJIAuFIgogCUIgiXwiCXwiC4UiDSAKQhWJIAmFIgkgDEIgiXwiCnwiDEIgiSIOIAlCEIkgCoUiCUIViSIKhSANQhGJIAyFIgyFIg1CIIinIARwQQN0aiIHKAIEIAxC3QGFIgwgCSALQiCJfCIJfCILQiCJIAogCYUiCUIQiSAJIA58IgmFIgp8Ig4gCkIViYUiCkIQiSAKIAxCDYkgC4UiCyAJfCIJQiCJfCIKhSIMQhWJIAwgCSALQhGJhSIJIA58IgtCIIl8IgyFIg5CEIkgDiAJQg2JIAuFIgkgCnwiCkIgiXwiC4VCFYkgCUIRiSAKhSIJQg2JIAkgDHyFIglCEYmFIAkgC3wiCUIgiIUgCYWnaiAHKAIAIA2nbGogCHBBA3RqIQggCEEAIAgoAgAgCEEEaigCACACIAMQ4yUbIQIgCEEIaiEICyAAIAg2AgQgACACNgIADwtBtPuYARDdIQALyggCCX8DfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCAABAgMICAgEAAsgAS0AJSECIAEoAiAhAyAALQAkDQQMBgsgAC0AJEUNBCABKAIgLQA0DQQMBgsgASAAKAIEEI0QDAULIAEtACUNBCAAKAIEIQMgAS0AJCEEIAFBADoAJAJAIAMoAggiAkUNACADKAIEIQMgAkE4bCECA0AgASADEOwLIANBOGohAyACQUhqIgINAAsLIAEgBDoAJAwECyAAKAIEIgMtAEVBAUsNAyADKAJAIgMtACVBAkYNAwNAIAMoAiAiAy0AJUECRw0ADAQLCyADLQA0DQEMAgsgAEEIaiEDAkAgASgCHEUNACABKAIQIgRBeGohBSADKQMAENYgIgtCGYhCgYKEiJCgwIABfiEMIAEoAhQiBiALp3EhAkEAIQcDQAJAIAQgAmopAAAiDSAMhSILQn+FIAtC//379+/fv/9+fINCgIGChIiQoMCAf4MiC1ANAANAIAMgBSALeqdBA3YgAmogBnFBA3RrEJMMDQUgC0J/fCALgyILUEUNAAsLIA0gDUIBhoNCgIGChIiQoMCAf4NQRQ0BIAIgB0EIaiIHaiAGcSECDAALCyABKAIgIQICQCABLQAlRQ0AIAItAD0NAiACIQQCQANAAkAgBCgCDEUNACAEKAIAIgVBcGohCCADKQMAENYgIgtCGYhCgYKEiJCgwIABfiEMIAQoAgQiByALp3EhBkEAIQkDQAJAIAUgBmopAAAiDSAMhSILQn+FIAtC//379+/fv/9+fINCgIGChIiQoMCAf4MiC1ANAANAIAMgCCALeqdBA3YgBmogB3EiCkEEdGsQkwwNBSALQn98IAuDIgtQRQ0ACwsgDSANQgGGg0KAgYKEiJCgwIB/g1BFDQEgBiAJQQhqIglqIAdxIQYMAAsLIAQoAiAiBEUNAgwACwsgBUEAIAprQQR0akF4ai0AAEECSQ0CCyACIANBAxCBEAwBCyACQQFxDQAgAyAAQQhqIgJBABCBECADLQA0QQFHDQACQCACKQMAIgtCA4NCAFINACALpyICIAIoAgAiAkEBajYCACACQX9MDQILIANBEGogCxDCBgsCQCABKAIgIgMtADRBAUcNAAJAAkACQAJAIAAoAgBBfGoOBAMAAQIECyADLQA6IQIgA0EBOgA6IAEoAiAgACgCBEEIakEEEIEQDAcLIAEtACUNAiADLQA6IQIgA0EAOgA6IAEoAiAgACgCBEEAEIEQDAYLIAAoAgQiAi0AUQ0BIAIoAgANASABLQAlDQEgAy0AOiECIANBADoAOiAAKAIEIgMoAgBBAUYNAyABKAIgIANBCGpBABCBEAwFCyABLQAlRQ0DCw8LAAtBpP6aARDSLAALIAMtADohAiADQQE6ADogASgCICAAKAIEQQhqQQQQgRALIAEoAiAgAjoAOgvaCAENfyMAQcABayICJAAgAkEwaiABEMMCIAIoAjQhAwJAAkAgAigCMCIEQYCAgIB4Rw0AIABBgICAgHg2AgAgACADNgIEDAELIAIoAjghBSACQQhqQQRBCEEoQdTYmwEQpxpBACEGIAJBADYCHCACIAIoAgwiBzYCGCACIAIoAgg2AhQgAiAENgIoIAIgAzYCICACIAMgBUEGdCIIaiIJNgIsIAJB4ABqIQogAkHwAGpBBGohCyACQTBqQQRyIQxBBCENAkACQAJAAkACQAJAA0ACQAJAAkACQAJAAkAgCEUNAAJAIAMoAgAiBUEHRg0AIANBBGohBCACIAU2AjACQEE8RQ0AIAwgBEE8/AoAAAsgA0HAAGohDiAFDgQCAwQFCAsgA0HAAGohCQsgAiAJNgIkIAJBIGoQsx4gAS0A4AFBAUYNByABKALcASEDIAEoAtgBIQQgAkGUAWogARDUJiACQQE2AjQgAkGcv5wBNgIwIAJCATcCPCACQbMHNgIkIAJBAToAvwEgAiACQSBqNgI4IAIgAkG4AWo2AiAgAiACQb8BajYCuAEgAkGgAWogAkEwahD9GiACQbQBaiACQZwBaigCADYCACACIAIpApQBNwKsASAEIAMgAkGgAWoQ4BohAyABLQDgAUGiAUYNCAwKCyALQRhqIANBIGopAgA3AgAgC0EQaiADQRhqKQIANwIAIAtBCGogA0EQaikCADcCACALIANBCGopAgA3AgAMAwsgAkHwAGpBGGogBEEYaigCADYCACACQfAAakEQaiAEQRBqKQIANwMAIAJB8ABqQQhqIARBCGopAgA3AwAgAiAEKQIANwNwDAILIAJB8ABqQRBqIARBEGopAgA3AwAgAkHwAGpBCGogBEEIaikCADcDACACIAQpAgA3A3AMAQsgAkHwAGpBGGogBEEYaigCADYCACACQfAAakEQaiAEQRBqKQIANwMAIAJB8ABqQQhqIARBCGopAgA3AwAgAiAEKQIANwNwCwJAIAYgAigCFEcNACACQRRqEO4dIAIoAhghBwsgByANaiIDQXxqIAU2AgACQEEkRQ0AIAMgAkHwAGpBJPwKAAALIAIgBkEBaiIGNgIcIAoQlCgCQCACKAIwQQRJDQAgAkEwahCoFwsgCEFAaiEIIA1BKGohDSAOIQMMAAsLIAIgDjYCJCACQaABakEEciABENQmIAJB1wA2ArQBIAJB9NibATYCsAEgAkGwgICAeDYCoAEgASgC2AEgASgC3AEgAkGgAWoQ4BohAyABLQDgAUGiAUcNAiABIAEQmiwQpxcMAgsgARChCyAAQQhqIAJBFGpBCGooAgA2AgAgACACKQIUNwIADAQLIAEgARCaLBCnFwwBCyAAQYCAgIB4NgIAIAAgAzYCBCAKEJQoIAJBMGoQqBcgAkEgahCzHgwBCyAAQYCAgIB4NgIAIAAgAzYCBAsgAkEUahD4KgsgAkHAAWokAAuWCQECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIAIgFBdGoiAkEHIAJBJkkbQX9qDiQAAQIDBAUGBwgJCgsMDQ4PEBESEyIUFRYXIhgZGhscHR4fICEiCyAAQQhqIgIoAgAgAEEMaigCABCrHiAAKAIEIAIoAgAQmy0MIQsgAEEEahD8KgwgCyAAKQMIIABBHGotAAAQ7SggACgCIBDzIgwfCyAAQQRqELQDDB4LIABBDGoQtAMMHQsgAEEEahC0AyAAQQhqELQDDBwLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEODAABAgMEBQYHCAkLCgsLIABBCGoQ/ioMCgsgAEEIahD0IgwJCyAAQQhqEPkmDAgLIABBBGoQtAMMBwsgAEEEahCTHwwGCyAAQQRqEIEsDAULIABBBGoQgSwMBAsgAEEEahC0AwwDCyAAQQRqEIEsDAILIABBBGoQqS0MAQsCQAJAIAAoAgQOAgABAgsgAEEIahCGJgwBCyAAQQhqELInCyAAQThqELQDDBsLIABBCGoQ9CIMGgsgAEEIahD5JgwZCyAAQQRqELQDIABBCGoQtAMgAEEMahC0AwwYCyAAQQRqIQICQCAALQAYQQVHDQAgAEEQahC0AwsgAhD/KiAAQShqEOUpDBcLIABBEGoQtAMCQCAAKAIEQYCAgIB4Rg0AIABBBGoQ/yoLIABBIGoQ5SkMFgsgAEEEahCOKAwVCyAAKQMIEMYhDBQLAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAKQMQEMYhIAApAxgQxiEMFwsgACkDECAAQSBqKQMAEKYuDBYLIAApAyAQ+yoMFQsgAEEYaikDACAAQSBqKAIAEMQmDBQLIAApAxAQxiEgACkDGBDGIQwTCyAAQQRqEIIsDBILIABBBGoQtAMgAEEYahDlKSAAKAIIIgIQgiwgAkEgQQQQsxYMEQsgAEEIaiICKAIAIABBDGooAgAQnSUgACgCBCACKAIAEKEtAkACQCAAKAIQIgIoAgBBgICAgHhGDQAgAhCPKAwBCyACQQRqELQDCyAAKAIQQRhBBBCzFiAAQSBqEIQkIABBJGoQ9yoMEAsgACkDCCAAQRxqLQAAEO0oIABBIGoQlB8MDwsgAEEMahCAKwwOCyAAQQRqELQDDA0LIABBBGoQtAMMDAsgAEEIahDyIgwLCyAAKQMIIABBGGopAwAQrS4MCgsgACgCBCICQcAAahCtHiACKAKAASIBIAIoAoQBELQbIAIoAnwgARCiLSACQfgAahDlKSACQZABahD9KgJAIAItADxBBkYNACACQRBqEK0eCyACQaABQQgQsxYMCQsgAEEEahD9KgwICyAAQQRqEIEsDAcLIABBBGoQtAMMBgsgAEEEahC0AwwFCyAAQQRqEIEsDAQLIABBBGoQqS0MAwsgAEEEahCBLAwCCyAAKQMIEMYhDAELIABBBGoQkx8LIABBwABBCBCzFgueCQECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIAIgFBdGoiAkEHIAJBJkkbQX9qDiQAAQIDBAUGBwgJCgsMDQ4PEBESEyIUFRYXIhgZGhscHR4fICEiCyAAQQhqIgIoAgAgAEEMaigCABCrHiAAKAIEIAIoAgAQmy0MIQsgAEEEahD8KgwgCyAAKQMIIABBHGotAAAQ7SggACgCIBChGAwfCyAAQQRqELUDDB4LIABBDGoQtQMMHQsgAEEEahC1AyAAQQhqELUDDBwLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEODAABAgMEBQYHCAkLCgsLIABBCGoQjCsMCgsgAEEIahD6IgwJCyAAQQhqEPwmDAgLIABBBGoQtQMMBwsgAEEEahC8HwwGCyAAQQRqEIosDAULIABBBGoQiiwMBAsgAEEEahC1AwwDCyAAQQRqEIosDAILIABBBGoQsC0MAQsCQAJAIAAoAgQOAgABAgsgAEEIahCJJgwBCyAAQQhqELYnCyAAQThqELUDDBsLIABBCGoQ+iIMGgsgAEEIahD8JgwZCyAAQQRqELUDIABBCGoQtQMgAEEMahC1AwwYCyAAQQRqIQICQCAALQAYQQVHDQAgAEEQahC1AwsgAhD/KiAAKAIoEIQsDBcLIABBEGoQtQMCQCAAKAIEQYCAgIB4Rg0AIABBBGoQ/yoLIAAoAiAQhCwMFgsgAEEEahCYKAwVCyAAKQMIEMYhDBQLAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAKQMQEMYhIAApAxgQxiEMFwsgACkDECAAQSBqKQMAEKYuDBYLIAApAyAQ+yoMFQsgAEEYaikDACAAQSBqKAIAEMgmDBQLIAApAxAQxiEgACkDGBDGIQwTCyAAQQRqEIcsDBILIABBBGoQtQMgACgCGBCELCAAKAIIIgIQhywgAkEgQQQQsxYMEQsgAEEIaiICKAIAIABBDGooAgAQnSUgACgCBCACKAIAEKEtAkACQCAAKAIQIgIoAgBBgICAgHhGDQAgAhCVKAwBCyACQQRqELUDCyAAKAIQQRhBBBCzFiAAKAIgEOckIABBJGoQjSsMEAsgACkDCCAAQRxqLQAAEO0oIABBIGoQuhUMDwsgAEEMahCLKwwOCyAAQQRqELUDDA0LIABBBGoQtQMMDAsgAEEIahD7IgwLCyAAKQMIIABBGGopAwAQrS4MCgsgACgCBCICQcAAahC1HiACQYABaiIBKAIAIAJBhAFqKAIAELQbIAIoAnwgASgCABCiLSACKAJ4EIQsIAJBkAFqEIkrAkAgAi0APEEGRg0AIAJBEGoQtR4LIAJBoAFBCBCzFgwJCyAAQQRqEIkrDAgLIABBBGoQiiwMBwsgAEEEahC1AwwGCyAAQQRqELUDDAULIABBBGoQiiwMBAsgAEEEahCwLQwDCyAAQQRqEIosDAILIAApAwgQxiEMAQsgAEEEahC8HwsgAEHAAEEIELMWC9cIAQR/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBdGoiAkEHIAJBJkkbDiYAASIhIB8eHRwbGhkYFyMWFRQTEhEQDw4NIyMMCwoJCAcGBQQDAgALIAFBADoABA8LIAEtAARBAUcNISABIAAoAgwiAyABKAIAakECajYCACADRQ0hIANBBHQhAiAAKAIIIgQhAANAAkAgACgCAEECRg0AIAEtAARBAUcNAAJAAkACQAJAIABBDGooAgAiBSgCAEFmag4DAwABAgsgBSgCCEEFRg0CDAELIAUoAgxFDQAgAUEAOgAEDAILIAUgARC2AwwBCyABQQA6AAQLIABBEGohACACQXBqIgINAAsgAS0ABQ0hIANBBHQhAANAAkAgBCgCAEECRw0AIAFBADoABAsgBEEQaiEEIABBcGoiAA0ADCILCyABQQA6AAQMIAsgAUEAOgAEDwsgAUEAOgAEDwsgASAAKAIEEPYaDwsgASAAKAIEEPYaDwsgASAAKAIEEPYaDwsgAUEAOgAEDwsgAUEAOgAEDwsgASAAKAIEEPYaDwsgACgCDCICRQ0XIAAoAgghACACQShsIQIDQCAAIAEQ9gkgAEEoaiEAIAJBWGoiAg0ADBgLCyAAKAIEIgRBwABqEK0oAkAgBCgChAEiAkUNACAEKAKAASEAIAJB2ABsIQIDQAJAAkACQCAAKAIAQXxqDgICAAELIAFBADoABAwBCyABIAAQqAcLIABB2ABqIQAgAkGof2oiAg0ACwsCQCAEKAKYASICRQ0AIAQoApQBIQAgAkEobCECA0AgACABEPYJIABBKGohACACQVhqIgINAAsLIAQtADxBBkYNFiAEQRBqEK0oDwsgAC0ANEECRw0VIABBIGoQjiYPCyABIAAoAgQQ9hoPCyABQQA6AAQPCyABQQA6AAQPCyABQQA6AAQPCyABQQA6AAQPCyABQQA6AAQPCyABQQA6AAQPCyAAKAIMIgJFDQ0gACgCCCEAIAJBAnQhAgNAIAEgACgCABD2GiAAQQRqIQAgAkF8aiICDQAMDgsLIAAoAghBA0cNDCABLQAFDQwgACsDGJlEAAAAAAAA8H9iDQwgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgACgCCEEBRw0HIABBDGogARD+Lg8LAkAgACgCKCIAKAIAQRpHDQAgAEEIakGkrpsBQQYQgyINBwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgAUEAOgAEDwsgACgCDCICRQ0AIAAoAgghACACQQxsIQIDQAJAAkAgACgCAA0AIAEgAEEEaigCABCHDAwBCyABQQA6AAQLIABBDGohACACQXRqIgINAAsLC5YJAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCACIBQXRqIgJBByACQSZJG0F/ag4kAAECAwQFBgcICQoLDA0ODxAREhMiFBUWFyIYGRobHB0eHyAhIgsgAEEIaiICKAIAIABBDGooAgAQqx4gACgCBCACKAIAEJstDCELIABBBGoQqisMIAsgACkDCCAAQRxqLQAAEO8oIAAoAiAQgyEMHwsgAEEEahC3AwweCyAAQQxqELcDDB0LIABBBGoQtwMgAEEIahC3AwwcCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDgwAAQIDBAUGBwgJCwoLCyAAKQMIEMghIABBIGoQqysMCgsgAEEIahCLIwwJCyAAQQhqEI4nDAgLIABBBGoQtwMMBwsgAEEEahDGHwwGCyAAQQRqEKIsDAULIABBBGoQoiwMBAsgAEEEahC3AwwDCyAAQQRqEKIsDAILIABBBGoQyS0MAQsCQAJAIAAoAgQOAgABAgsgACgCDCICIAAoAhAQ7iIgACgCCCACEKEtIABBHGoQqysMAQsgAEEIahCsKyAAQRxqEKsrCyAAQThqELcDDBsLIABBCGoQiyMMGgsgAEEIahCOJwwZCyAAQQRqELcDIABBCGoQtwMgAEEMahC3AwwYCyAAQQRqIQICQCAALQAYQQVHDQAgAEEQahC3AwsgAhD/KiAAKAIoEIQsDBcLIABBEGoQtwMCQCAAKAIEQYCAgIB4Rg0AIABBBGoQ/yoLIAAoAiAQhCwMFgsgAEEEahCYKAwVCyAAKQMIEMghDBQLAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAQRhqKQMAIQMgACkDEBDIISADEMghDBcLIAApAxAgAEEgaikDABDALgwWCyAAKQMgEIMrDBULIABBGGopAwAgAEEgaigCABCOLwwUCyAAKQMQEMghIAApAxgQyCEMEwsgAEEEahCHLAwSCyAAQQRqENcmDBELIABBBGoQ8B4MEAsgACkDCCAAQRxqLQAAEO8oIAAoAiAiAhCUKCACQRBqIgEoAgAgAkEUaigCABCaJSACKAIMIAEoAgAQoi0gAkEwahCtKyACKAI0EKMsIAIoAjgQhCwgAkEcaiIBKAIAIAJBIGooAgAQgBAgAigCGCABKAIAEJstIAAoAiBBwABBBBCzFgwPCyAAQQxqEK0rDA4LIABBBGoQtwMMDQsgAEEEahC3AwwMCyAAQQhqEPkiDAsLIAApAwggAEEYaikDABDBLgwKCyAAKAIEIgJBwABqEPcoIAJBkAFqEIkrAkAgAi0APEEGRg0AIAJBEGoQsR4LIAJBoAFBCBCzFgwJCyAAQQRqEIkrDAgLIABBBGoQoiwMBwsgAEEEahC3AwwGCyAAQQRqELcDDAULIABBBGoQoiwMBAsgAEEEahDJLQwDCyAAQQRqEKIsDAILIAApAwgQyCEMAQsgAEEEahDGHwsgAEHAAEEIELMWC60IAQV/IwBB8ABrIg4kACAOIAw2AhAgDiALNgIMAkACQCAAIAEgBCACIAMgBSAGQQAQvQRFDQBBASELDAELIAdBBGohDyAIIAlBA3RqIQQgDkE4akEEaiEAIAcoAgQhEEEBIQwDQAJAIAgiBiAERw0AQQAhCwwCCyAMIAYoAgRBAWoiCyAMIAtLGyIJIAxrQQFqIQwgBkEIaiEIAkADQAJAIAxBf2oiDA0AIAooAgAhDAJAAkAgBigCACIRKAIAIhIoAgAiC0GAgICAeEYNACAMQYCAgIB4Rg0AIBIoAggiDCAKKAIIRw0EIAxBAWohBiASKAIEQQhqIQwgCigCBEEIaiELA0AgBkF/aiIGRQ0CIAwoAgAiBSALKAIARw0FIAxBfGohAyALQXxqIQIgDEEMaiEMIAtBDGohCyADKAIAIAIoAgAgBRCIG0UNAAwFCwsgC0GAgICAeEcNAyAMQYCAgIB4Rw0DCyASKAIMIAooAgxHDQIgEigCECAKKAIQRw0CAkACQAJAAkAgDUH/AXEOAwABAgALIA5BLGogBygCABCxFyAOQSBqIA4oAjAgDigCNEECEJUKIA5BBjYCZCAOQQQ2AlwgDkEFNgJUIA4gB0EkajYCUCAOQQM2AjwgDkGwxYABNgI4IA5CAzcCRCAOIA5BDGo2AmAgDiAOQSBqNgJYIA4gDkHQAGo2AkAgDkEUaiAOQThqENAaIA5BIGoQzSwgDkEsahDNLAwCCyAOQQQ2AjwgDkHIxYABNgI4IA5CBDcCRCAOQQY2AmwgDkEFNgJkIA5BBTYCXCAOQQU2AlQgDiAHNgJYIA4gB0E8ajYCYCAOIAdBJGo2AlAgDiAOQdAAajYCQCAOIA5BDGo2AmggDkEUaiAOQThqENAaDAELIA5BAjYCVCAOQejFgAE2AlAgDkICNwJcIA5BBjYCRCAOQQU2AjwgDiAPNgI4IA4gDkE4ajYCWCAOIA5BDGo2AkAgDkEUaiAOQdAAahDQGgsgDkHEAGogCkEcai8BADsBACAOQQI2AlQgDkGQ/YcBNgJQIA5CATcCXCAOQQo2AjAgDiAKKQIUNwI8IA4gDkEsajYCWCAOIA5BOGo2AiwgDiAOQRRqNgI4IAEgDkHQAGoQjykhCyAOQRRqEM0sDAQLIA5BADYCYEEBIQsgDkEBNgJUIA5B+MWAATYCUCAOQgQ3AlggASAOQdAAahCPKUUNAAwDCwsgDkEsaiAQELEXIAAgESgCACIMKQIUNwIAIABBCGogDEEcai8BADsBAEEBIQsgDkEBNgJUIA5BnL+cATYCUCAOQgE3AlwgDkEKNgIkIAlBAWohDCAOIA5BIGo2AlggDiAOQSxqNgI4IA4gDkE4ajYCICABIA5B0ABqEI8pIQYgDkEsahDNLCAGRQ0ACwsgDkHwAGokACALC4YIAhB/AX4jAEEQayIBJAAgASAAKAIUIgIgACgCsAIiA3YiBEEAQQRBBBCoDCABKAIEIQUCQCABKAIAQQFGDQACQCAERQ0AIANBH3EhBkEAIQMgASgCCCIHIQgDQCAIIAM2AgAgCEEEaiEIIAQgA0EBaiIDRw0ACyAAKAIQIQkgBCEIIAQhCgJAAkACQAJAAkACQAJAAkADQCAKIgtBf2ohCiAIIQMDQCADRQ0CIANBf2ohCCADQQBMDQkgCCEDIAAgCBDiH0L///////9+Vg0ACwJAIAsgCEEBakYNAEEAIQNBACACIAggBnQiDGsiCyALIAJLGyENQQAgAiAKIAZ0Ig5rIgsgCyACSxshDyAJIA5BA3RqIQsgCSAMQQN0aiEQA0AgDyADRg0HIA0gA0YNBiALKQMAIREgCyAQKQMANwMAIBAgETcDACALQQhqIQsgEEEIaiEQIANBAWoiAyAGdkUNAAsgCiAETw0EIAggBE8NAyAHIApBAnRqIgMoAgAhCyADIAcgCEECdGoiECgCADYCACAQIAs2AgALIAAgCjYCKCAKDQALQdqpgwFBNEGQqoMBELIXAAsgASAEQQBBBEEEEKgMIAEoAgQhDiABKAIAQQFGDQUgASgCCCENAkAgBEECdCIDRQ0AIA0gByAD/AoAAAtBACELA0ACQCALIA0gC0ECdCIQaigCACIDRg0AA0AgAyIIIARPDQcgCyANIAhBAnRqKAIAIgNHDQALIAcgEGogCDYCAAsgC0EBaiILIARHDQALIAAoAqwCIQxBACEKA0ACQCAMRQ0AIAIgCiAGdCILIAIgC0kbIQggCSALQQN0aiEDIAwhEAJAAkADQCACIAhGDQEgBCADKQMAIhFCK4inIg9NDQIgAyARQv///////wGDIAcgD0ECdGo1AgBCK4aENwMAIANBCGohAyALQQFqIQsgCEEBaiEIIBBBf2oiEEUNAwwACwsgCyACQZyugwEQkRUACyAPIARBnLCDARCRFQALIApBAWoiCiAERw0ACwJAAkAgACgCICIIRQ0AIAAoAhwhAwNAIAMoAgAiCyAETw0CIAMgByALQQJ0aigCADYCACADQQRqIQMgCEF/aiIIDQALCyAOIA0Q+ywgBSAHEPssIAFBEGokAA8LIAsgBEGcsIMBEJEVAAsgCCAEQZDSgwEQkRUACyAKIARBkNKDARCRFQALIAwgA2ogAkGMroMBEJEVAAsgDiADaiACQYyugwEQkRUACyAIIARBoNKDARCRFQALIA4gASgCCEHAvJwBEI4pAAsgASAIrTcDAEGssIMBQRUgAUHEp4MBQYjbgwEQ6hIAC0H8rYMBENIsAAsgBSABKAIIQeDpmwEQjikAC5AIAgd/AX4jAEEgayIGJAAgBkEIaiABIAIgBUGAgAggBRDMHgJAAkAgBi0ACEEFRg0AIAAgBikDCDcCAAwBC0EFIAYoAgwQvigCQCAFRQ0AIAZBADoABiAGQQA6AAcgBSEHIAQhCEEAIQlBACEKQQAhCwNAAkACQAJAAkACQAJAAkACQAJAAkAgB0UNACAGQQhqIAEgA0GAgAggCiALIAZBB2ogBkEGahCtBQJAIAYtAAhBBEYNACAGKQMIIg1C/wGDQgRSDQkLIAgoAgAiCg4FAQIDBAUBCyAGQQhqIAEgAiADQYCACCAKIAsQjQIgBi0ACEEERg0KIAYpAwgiDUL/AYNCBFINBwwKCyAGQQhqIAhBCGogARD3EyAGLQAIQQRGDQUgBikDCCINQv8Bg0IEUg0EDAULIAZBCGogCEEEaiABEJwKIAYtAAhBBEYNBCAGKQMIIg1C/wGDQgRSDQMMBAsgBkEANgIIIAZBGGogASAGQQhqQaiZnAFBARCxDQJAAkAgBi0AGEEERg0AIAYpAxgiDUL/AYNCBFINAQsgBkEYaiABIAZBCGpBpJmcAUEDELENAkAgBi0AGEEERg0AIAYpAxgiDUL/AYNCBFINAQsgBkEYaiAIQQRqIAEQzi0CQCAGLQAYQQRGDQAgBikDGCINQv8Bg0IEUg0BCyAGQRhqIAEgBkEIakGpmZwBQQEQsQ0gBi0AGEEERg0EIAYpAxgiDUL/AYNCBFENBAsgDUL/AYNCBFINAgwDCyAGIAhBBGo2AhggBkEIaiAGQRhqIAEQpCwgBi0ACEEERg0CIAYpAwgiDUL/AYNCBFINAQwCCyAGQQhqIAhBBGogARCPDCAGLQAIQQRGDQEgBikDCCINQv8Bg0IEUQ0BCyANQv8Bg0IEUg0BCyAEIAlBKGxqIQsCQCAGLQAGDQAgBkEAOgAGDAILIAEoAkRFDQECQAJAAkACQAJAIAoOBQADAQIDAAsgCEEcaiEMDAMLIAtBDGohDAwCCyAIQQRqKAIAQQRqIQwMAQsgC0EUaiEMCyAGQQhqIAEgDCgCAEEAEPADIAYtAAhBBEYNASAGKQMIIg1C/wGDQgRRDQELIAAgDTcCAAwDCwJAIAYtAAdFDQAgASABKAIsQX9qNgIsIAZBADoABwsCQAJAAkACQAJAIAoOBQADAQIDAAsgCEEcaiELDAMLIAtBDGohCwwCCyAIQQRqKAIAQQRqIQsMAQsgC0EUaiELC0EBIQogCUEBaiEJIAdBf2ohByAIQShqIQggCygCACELDAALCyAGQQhqIAEgAyAFRUGAgAgQ2xMCQCAGLQAIQQRGDQAgBikDCCINQv8Bg0IEUQ0AIAAgDTcCAAwBCyAAQQQ6AAALIAZBIGokAAu2CAEFfyMAQdADayIDJAACQAJAIAINACAAQYeAgIB4NgIADAELIAJBBHQhBCABIQUCQANAIARFDQEgBEFwaiEEIAVBCGohBiAFQRBqIQUgBigCAA0ACyAAQYeAgIB4NgIADAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBAUcNACABQQRqKAIAIQQgAUEIaigCACIFQQFHDQEgAEGAgICAeDYCACAAIAQtAAA6AAQMDAsCQAJAAkAgAkECRw0AIAFBCGohBkEAIQQDQCAEQSBGDQIgBiAEaiEFIARBEGohBCAFKAIAQQFGDQALC0EAIQYgAkEDRg0BDAkLIAFBCGooAgBFDQIgAUEYaigCAEUNAyABQQRqKAIAIQQgAEGBgICAeDYCACAAIAQtAAA6AAQgACABQRRqKAIALQAAOgAFDAwLQQghBAJAA0AgBEE4Rg0BIAEgBGohBSAEQRBqIQQgBSgCAEEBRw0JDAALCyABQQhqKAIARQ0DIAFBGGooAgBFDQQgAUEoaigCAEUNBSABQSRqKAIALQAAQRh0IAFBFGooAgAtAABBEHQgAUEEaigCAC0AAEEIdHJyIQZBASEEDAgLIANBMGogBCAFELwDIAMoAnAhBCADKAJsIQYCQAJAIAMoAmhBAXFFDQAgBiEFDAELIANBxANqIARBAEEBQQEQqAwgAygCxANBAUYNBiADKALMAyEFIARFDQAgBSAGIAT8CgAACyADKAJcIQYgAygCWCEBIAMoAmAhAgJAQShFDQAgA0EIaiADQTBqQSj8CgAAC0EBIQcMCAtBAEEAQcCYhAEQkRUAC0EAQQBB0JiEARCRFQALQQBBAEHwmIQBEJEVAAtBAEEAQYCZhAEQkRUAC0EAQQBBkJmEARCRFQALIAMoAsgDIAMoAswDQdSQhAEQjikAC0EAIQQLAkAgBCAGckEBcUUNACAAQYKAgIB4NgIAIABBBmogBkEYdjoAACAAIAZBCHY7AQQMAwsgAkEBRw0BQQIhBwsCQEEoRQ0AIANBMGpBBGogA0EIakEo/AoAAAsgAEGDgICAeDYCAAJAQSxFDQAgAEEEaiADQTBqQSz8CgAACyAAIAQ2AkggACAFNgJEIAAgBzYCQCAAIAI2AjggACAGNgI0IAAgATYCMAwBCyADQTBqIAEgAhDaBAJAIAMoAjBBgICAgHhGDQBBkANFDQEgACADQTBqQZAD/AoAAAwBCyADQTBqEPImIANBMGogASACEKISAkAgAy0AMEECRg0AAkBBgAJFDQAgAEEEaiADQTBqQYAC/AoAAAsgAEGFgICAeDYCAAwBCyADQTBqIAEgAhCsAwJAIAMtADlBA0YNACAAIAMpAjA3AgQgAEGGgICAeDYCACAAQQxqIANBOGooAgA2AgAMAQsgAEGHgICAeDYCAAsgA0HQA2okAAumCAIMfwF+IwBBwABrIgMkAAJAAkACQAJAAkAgAg0AQQEhBEHAASEFQQAhBgwBCyABIAJqIQdBASEIIAEhCUEBIQQgAS0AACIKIQYCQANAAkACQCAIDQAgCSAHRw0BDAMLIAggByAJa08NAiAJIAhqIQlBACEICyAEQQF0IQQgBkEBdCAJLQAAaiEGIAlBAWohCQwACwtBASELAkAgAkEBRw0AQSYhBQwBCyADQQA6ACIgAS0AASEIIANBAToAIwJAAkAgCEHY2YQBai0AACAKQdjZhAFqLQAASQ0AQQAhDCAIIQ0gCiEIDAELQQAhCyADQQA6ACNBASEMIANBAToAIiAKIQ0LQQIhCSADQQI2AjQgA0KAgICA8B83AiwgAyAHNgIoIAMgATYCJANAAkACQCAJDQBBACEJAkAgAygCMCIHDQAMAgsgAyAHQX9qNgIwIAMoAiQiCiADKAIoRg0BIAMgCkEBajYCJCADIAMoAiwiB0EBajYCLCAKIQkMAQsgA0EANgI0IANBGGogA0EkaiAJELkMIAMoAhwhCSADKAIYIQcLAkACQAJAAkAgCUUNACAJLQAAIglB2NmEAWotAAAiBSAIQf8BcSIKQdjZhAFqLQAASQ0BIAkgCkYNAiAFIA1B/wFxQdjZhAFqLQAATw0CIAdBgAJPDQcgAyAHOgAjIAchCyAJIQ0MAgsgDEH/AXEiByALQf8BcUcNAiADQQA2AiRBASADQSJqIANBI2ogA0EkakHoiZkBEJMhAAsgAyAMOgAjIAdBgAJPDQQgAyAHOgAiIAwhCyAHIQwgCCENIAkhCAsgAygCNCEJDAELCwJAAkACQCACIAdNDQBBACEJIAEgB2otAAAiCEHY2YQBai0AAEH6AU0NAUEnIQVBACELDAILIAcgAkHE4IMBEJEVAAsgAiALQf8BcSIKTQ0EIAEgCmotAABBGHQgCEEQdCAKQQh0cnIgB3IhDUEoIQtBKSEFC0IAIQ8CQANAIAIgCUYNASABIAlqIQcgCUEBaiEJQgEgBzEAAIYgD4QhDwwACwsgA0EQaiABIAJBABCECyADKAIUIQcgAygCECEJIANBCGogASACQQEQhAsgAyABIAIgByADKAIMIAkgAygCCCIKSyIOGyAJIAogDhsiCRDlCCADKAIAIQogAygCBCEHCyAAIAI2AkAgACABNgI8IABBADYCOCAAIAU2AjAgACAENgIsIAAgBjYCKCAAIAw6ACEgACAIOgAgIAAgDTYCHCAAIAs2AhggACAJNgIQIAAgDzcDCCAAIAc2AgQgACAKQf8BcTYCACADQcAAaiQADwtBxIicAUErIANBP2pBnN+DAUG834MBEOoSAAtBxIicAUErIANBP2pBnN+DAUGs34MBEOoSAAsgCiACQczfgwEQkRUAC9YIAgp/An4jAEHAAWsiAiQAIAEoAgghAyABKAIEIQEgACgCMBD8FSEEIAJBNGogAEE0aigCADYCACACQQA6ACggAkEIakEAKQOAhZ4BIgw3AwAgAkEQaiIFQQApA/iEngEiDTcDACACQRhqIAw3AwAgAiAANgIgIAIgBDYCJCACQQE6ADkgAiAAKQIsNwIsIAIgACgBOjYBOiACIAAtADg6ADggAiANNwMAAkAgA0UNACACQSxqIQYgA0EMbCEAIAJB4ABqQRBqIQcgAkHgAGpBLGohCCACQaABakEQaiEJA0ACQAJAIAEoAgAiAw0AAkACQAJAAkACQAJAIAFBBGooAgAiAygCACIKQXtqIgRBBCAEQQZJGw4GAAECAwQFAAsgAiADQQhqELQTDAYLIAIgA0EIahCNJCACIAMoAigQgCcMBQsgAiADQRBqELQTIAIgAygCKBCAJwwECyACLQA5IQQCQCADKAIIQQNHDQAgAkEBOgA5IAMoAgwgAhDaAQsgAiAEOgA5AkAgAygCSCIKRQ0AIAItADRBAUcNACACLQA6IQsgAkGBAjsAOSAKKAIAIAIQwQEgAiALOgA6IAIgBDoAOQsgAygCKEGAgICAeEYNAyACIANBKGoQiA4MAwsCQCAKQQNHDQAgAi0AOSEEIAJBAToAOSADKAIEIAIQ2gEgAiAEOgA5CyACKAIwEPwVIQQgCSANNwIAIAlBCGogDDcCACACQaABakEIaiAMNwMAIAggBikCADcCACAIQQhqIAZBCGooAgA2AgAgAkHgAGpBCGogDDcDACAHIAkpAwA3AwAgAkHgAGpBGGogAkGgAWpBGGopAwA3AwAgAiANNwOgASACIA03A2AgAi0AOCEKIAIgAigBOjYBmgEgAkEBOgCIASACIAQ2AoQBIAIgCjoAmAEgAkEAOgCZASACIAI2AoABAkAgAygCIEEHRg0AIANBIGogAkHgAGoQ+w4LIAMoAmggAkHgAGoQ+w4CQCADKAJIQYCAgIB4Rg0AIAJB4ABqIANByABqEIgOCyACQeAAahCwCiAHEMwKDAILAkAgAygCCEEDRw0AIAItADkhBCACQQE6ADkgAygCDCACENoBIAIgBDoAOQsgAygCKCEDIAIoAjAQ/BUhBCAJIA03AgAgCUEIaiAMNwIAIAJBoAFqQQhqIAw3AwAgCCAGKQIANwIAIAhBCGogBkEIaigCADYCACACQeAAakEIaiAMNwMAIAcgCSkDADcDACACQeAAakEYaiACQaABakEYaikDADcDACACIA03A6ABIAIgDTcDYCACLQA4IQogAiACKAE6NgGaASACQQE6AJkBIAJBAToAiAEgAiAENgKEASACIAo6AJgBIAIgAjYCgAEgAkHgAGogAxDUBCACQeAAahCwCiAHEMwKDAELIAIgAxCAJwsgAUEMaiEBIABBdGoiAA0ACwsgAhCwCiAFEMwKIAJBwAFqJAALzAgBAn8CQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACICQXRqIgNBByADQSZJGw4mGgABAgMEBQYHCAkKCwwNGg4PEBESGhMTFBoaFRYXFxcXFxcaGRoaCyAAKAIMIgNFDRkgACgCCCEAIANBBHQhAwNAAkAgACgCAEECRg0AIABBDGooAgAgARC+AwsgAEEQaiEAIANBcGoiAw0ADBoLCyAAKAIMIgNFDRggACgCCCEAIANBDGwhAwNAAkACQCAAKAIAIgINACAAQQRqKAIAIAEQkwsMAQsgAiABEL4DCyAAQQxqIQAgA0F0aiIDDQAMGQsLAkAgAC0AHEECRg0AIABBADYCGAsgACgCICABEJoNDwsgACgCBCEADBQLIAAoAgwhAAwTCyAAKAIEIAEQvgMgACgCCCEADBILAkACQCACQQtHDQAgAEEIaiEDAkACQCAAKAIEDgMAAQMACyADIAEQhR0gACgCOCEADBQLIAMgARCUICAAKAI4IQAMEwsgACABEL4PCyAAKAI4IQAMEQsgACgCKCABEL4DIAAoAghBAkkNEiAAQQxqIAEQ7y4PCyAAKAIIQQFHDREgAEEMaiABEO8uDwsgACgCBCABEL4DIAAoAgggARC+AyAAKAIMIQAMDgsCQCAALQAYQQVHDQAgACgCECABEL4DCyAAKAIMIgNFDQ8gA0EEdCEDIAAoAghBDGohAANAIAAoAgAgARC+AyAAQRBqIQAgA0FwaiIDDQAMEAsLIAAoAhAgARC+AyAAKAIEQYCAgIB4Rg0OIAAoAgwiA0UNDiADQQR0IQMgACgCCEEMaiEAA0AgACgCACABEL4DIABBEGohACADQXBqIgMNAAwPCwsgACgCDCIDRQ0NIAAoAgghACADQQJ0IQMDQCAAKAIAIAEQvgMgAEEEaiEAIANBfGoiAw0ADA4LCyAAQQA2AhgPCyAAKAIMIgNFDQsgACgCCCEAIANBAnQhAwNAIAAoAgAgARC+AyAAQQRqIQAgA0F8aiIDDQAMDAsLIAAoAgQgARC+AyAAKAIIIgAoAggiA0UNCiAAKAIEIQAgA0ECdCEDA0AgACgCACABEL4DIABBBGohACADQXxqIgMNAAwLCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAIAMgARDsDSADQShqIQMgAkFYaiICDQALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAKAIEIAEQvgMPCyAAIAEQlSAPCwJAIAAtABxBAkYNACAAQQA2AhgLIAAoAiAgARDcBA8LIAAoAgwiAA0FDAcLIAAoAgQhAAwECwJAIAAtADRBAkYNACAAQQA2AjAPCyAAQSBqEKwkDwsgACgCBCABEPIFDwsgAEEEaiABEPgLDwsgACgCBCEADAALCyAAKAIEIAEQ7RMLC7QIAgR/AX4CQAJAAkACQAJAAkACQAJAAkAgACgCACIBQXxqQQAgAUF7akEISRsOCAECAwQFBgcIAAsCQAJAIAAoAggiAUEFRw0AIAApAxAiBUIDg0IAUg0BIAWnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQxiQMAQsCQAJAAkACQAJAIAEOBAECAwQACyAAKQMYIAAoAiAQtBkMBAsgACkDEBDFIQwDCyAAQRBqEMgTDAILIAApAyAQuB8MAQsgAEEMahDfKQsCQCAAKAI8IgFFDQAgARCSASABQcAAQQgQsxYLAkAgACgCQCIBRQ0AIAEoAgAiAhC0AiACQeAAQQgQsxYgAUEMQQQQsxYLIAAoAjQhAwJAIAAoAjgiAkUNACADIQEDQCABKAIAIgQQkgEgBEHAAEEIELMWIAFBDGohASACQX9qIgINAAsLIAAoAjAgAxCcLQ8LIAAQwA4gACgCRCEEAkAgACgCSCICRQ0AIAQhAQNAIAEQxgkgAUHAAGohASACQX9qIgINAAsLIAAoAkAgBBCdLSAAKAIgIgJBgICAgHhGDQUgACgCJCEEAkAgACgCKCIARQ0AIAQhAQNAIAEQ1QIgAUEwaiEBIABBf2oiAA0ACwsgAiAEEJ4tDwsgAEEIahDADiAAQTBqEMkGDwsCQCAAKQMIIgVCA4NCAFINACAFpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAQSBqEMkGDwsgAEEIahDADgJAIAAoAjwiAUUNACABEJIBIAFBwABBCBCzFgsCQCAAKAJAIgFFDQAgASgCACICELQCIAJB4ABBCBCzFiABQQxBBBCzFgsgACgCNCEDAkAgACgCOCICRQ0AIAMhAQNAIAEoAgAiBBCSASAEQcAAQQgQsxYgAUEMaiEBIAJBf2oiAg0ACwsgACgCMCADEJwtDwsCQCAAKQMIIgVCA4NCAFINACAFpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCwJAIAAoAiQiAUUNACABEJIBIAFBwABBCBCzFgsCQCAAKAIoIgFFDQAgASgCACICELQCIAJB4ABBCBCzFiABQQxBBBCzFgsgACgCMCEDAkAgACgCNCICRQ0AIAMhAQNAIAEoAgAiBBCSASAEQcAAQQgQsxYgAUEMaiEBIAJBf2oiAg0ACwsgACgCLCADEJwtDwsgACgCCCEEAkAgACgCDCICRQ0AIAQhAQNAIAEQrwogAUEoaiEBIAJBf2oiAg0ACwsgACgCBCAEEKEtIAAoAhAiAUUNACABKAIAIgAQtAIgAEHgAEEIELMWIAFBDEEEELMWCw8LIAAoAgghBAJAIAAoAgwiAkUNACAEIQEDQCABENUCIAFBMGohASACQX9qIgINAAsLIAAoAgQgBBCeLQvbBwISfwZ+IwBBMGsiBCQAIANBf2ohBQJAIANFDQAgA0F+aiEGAkAgA0EBRg0AIAIgBUECdGooAgAhByACIAZBAnRqNQIAIRYgBEEYaiABKAIIIgUgA2siCEEBaiIJQcDDggEQuhZBACEKQQAgA0ECdCILayEMIAetIhdCIIYhGCAEKAIgIQ0gBCgCHCEOIAQoAhghDwJAAkACQAJAA0AgCUUNAyAFRQ0EIAEoAgQiBiAFQQJ0akF8aiIQRQ0EIBAoAgAhECAGIAUgBUF+akHww4IBEMwlNQIAIRkCQAJAIAogB0kNACAQrSAKrXwhGkF/IREMAQsgBEEQaiAKIBAgBxCTHiAENQIUIRogBCgCECERCyAJQX9qIQkgGkIghiAZhCEZAkADQAJAAkACQCAaQoCAgIAQVA0AIBGtIRsMAQsgGSARrSIbIBZ+VA0BCyAEQQhqIAYgBSAJQYDEggEQySIgAyAEKAIMIgUgAyAFSRshBkF/IRIgBCgCCCEFIAIhEAJAA0AgBkUNASAFIBKtIAU1AgB8IBsgEDUCAH59QoGAgIBgfCIaPgIAIBpCIIinIRIgBkF/aiEGIBBBBGohECAFQQRqIQUMAAsLAkAgCiASQX9zTw0AIAQgASgCBCABKAIIIAlBkMSCARDJIiADIAQoAgQiE0sNAyARQX9qIRFBACEKIAMhBiAEKAIAIhQhBSACIRACQANAIAZFDQEgBSAFKAIAIhUgECgCAGoiEiAKQf8BcWoiCjYCACASIBVJIAogEklyQQFxIQogBkF/aiEGIAVBBGohBSAQQQRqIRAMAAsLIApB/wFxRQ0AIAwgE0ECdGohBiAUIAtqIQUDQCAGRQ0BIAUgBSgCAEEBaiIQNgIAIAZBfGohBiAFQQRqIQUgEEUNAAsLIAggDU8NBCAOIAlBAnRqIBE2AgAgASgCCCIFRQ0FIAEgBUF/aiIFNgIIIAEoAgQgBUECdGooAgAhCgwDCyAZIBh8IRkgGiAXfCEaIBFBf2ohEQwACwsLIARBADYCKCAEQQE2AhwgBEHQmZwBNgIYIARCBDcCICAEQRhqQbjHggEQ6SMACyAJIA1BoMSCARCRFQALQbDEggEQ0iwACyABIApB0MOCARCiISABEKsMIARBGGpBCGoiBSANNgIAIAQgDjYCHCAEIA82AhggBEEYahCrDCAAQQhqIAUoAgA2AgAgACAEKQIYNwIAIABBFGogAUEIaigCADYCACAAIAEpAgA3AgwgBEEwaiQADwtB4MOCARDSLAALIAZBAUGww4IBEJEVAAsgBUEAQaDDggEQkRUAC5sHAQx/IwBB4AprIgIkAAJAIAFBAkkNAEEBIQMgACABQQF2IgRBHGwiBWohBiACQRBqIAVqIQcCQAJAIAFBCEkNACAAIAJBEGoQnQYgBiAHEJ0GQQQhAwwBCyACQRBqQRhqIABBGGooAgA2AgAgAkEQakEQaiAAQRBqKQIANwMAIAJBEGpBCGogAEEIaikCADcDACACIAApAgA3AxAgByAGKQIANwIAIAdBCGogBkEIaikCADcCACAHQRBqIAZBEGopAgA3AgAgB0EYaiAGQRhqKAIANgIACyACQoCAgIAgNwLQCiACQQA2AtgKQQAgA2shCCAAIANBHGwiBmohCSACIAQ2AtwKIAEgBGshCiACQRBqIAZqIQsCQANAIAJBCGogAkHQCmoQgRwgAigCCEEBcUUNASAIIAogBCACKAIMIgYbIgUgAyAFIANLG2ohDCAJIAZBHGwiDWohBSALIA1qIQYgAkEQaiANaiENA0AgDEUNASAGIAUpAgA3AgAgBkEYaiAFQRhqKAIANgIAIAZBEGogBUEQaikCADcCACAGQQhqIAVBCGopAgA3AgAgDSAGEIYJIAxBf2ohDCAFQRxqIQUgBkEcaiEGDAALCwsgB0FkaiEMIAAgAUEcbEFkaiIFaiEGIAJBEGogBWohDSACQRBqIQUCQANAAkAgBA0AIAxBHGohBgJAIAFBAXFFDQAgACAFIAcgBSAGSSIEGyIMKQIANwIAIABBGGogDEEYaigCADYCACAAQRBqIAxBEGopAgA3AgAgAEEIaiAMQQhqKQIANwIAIAcgBSAGT0EcbGohByAFIARBHGxqIQULIAUgBkcNAiAHIA1BHGpHDQIMAwsgACAHIAUgBygCBCAFKAIESSAHKAIAIgMgBSgCACIISSADIAhGGyIIGyIDKQIANwIAIABBCGogA0EIaikCADcCACAAQRBqIANBEGopAgA3AgAgAEEYaiADQRhqKAIANgIAIAYgDCANIA0oAgQgDCgCBEkgDSgCACIDIAwoAgAiCUkgAyAJRhsiCRsiAykCADcCACAGQQhqIANBCGopAgA3AgAgBkEQaiADQRBqKQIANwIAIAZBGGogA0EYaigCADYCACAHIAhBHGxqIQcgDEEAIAlrQRxsaiEMIAlBHGwgDWpBZGohDSAFIAhBAXNBHGxqIQUgBEF/aiEEIAZBZGohBiAAQRxqIQAMAAsLEOEhAAsgAkHgCmokAAvACAEFfyMAQfABayICJAACQAJAAkACQAJAIAEtAOABIgNBEkYNAAJAIAMNACACQTBqIAEQ3QFBASEEIAEgASgCiAFBAXIQqBIgARChCwJAAkACQCABLQDgASIDQRxGDQAgA0EBRg0AIAJByAFqIAEQ+A8CQAJAAkAgAi0AyAENACABLQDgASIDQe4ARg0EIAMQpRUhBAJAAkAgA0HoAEYNACAERQ0BCyABEKELDAMLAkAgA0F+ag4DAAUABQsgAkHIAWogAUEAENECIAIoAsgBQQdHDQEgAkHIAWpBBHIQ6QcMBAsgAiACKALMATYCLEEBIQNBACEFDAQLIAJByAFqEKgXCwJAAkACQCABLQDgASIDQX9qDgoBBAQEBAQCBAICAAsgA0EXRg0BDAMLIAEQoQsgAS0A4AFBG0cNAgtBASEECyACIAQ6AClBACEDQQEhBQwBC0EAIQQgAkEAOgApQQEhBUEAIQMLIAIgAzoAKCABIAJBMGoQxwUCQAJAIANFDQAgBQ0BIAJBLGoQ6QcMAQsgBEEBcQ0CCyABLQDgASEDCyADQf8BcUHzAEcNASABENgJIQQgAS0A4AEhAyAERQ0BIAQtAABB4wBGDQMgA0H/AXFB4wBHDQIMAwsgAkHIAWogAUEBEL8EAkACQCACKALIAUGBgICAeEcNACACIAIoAswBNgI0QRQhAQwBCyACQcwAaiACQeABaikCADcCACACQcQAaiACQdgBaikCADcCACACQTxqIAJB0AFqKQIANwIAIAIgAikCyAE3AjRBAiEBCyACIAE2AjAgAkEgaiACQTBqEPgbIAIoAiQhAyACKAIgIQQMAwsgA0H/AXFB4wBGDQELIAEoAtgBIQUCQCADQf8BcUEURw0AIAEQoQsLIAJBGGogARC2CkEBIQQgAigCHCEDIAIoAhhBAXENAUEAIQQgAS0A4AFBFEcNAUEEQQQQmioiBiADNgIAIAJBATYCwAEgAiAGNgK8ASACQQE2ArgBA0ACQCABLQDgAUEURg0AIAEoAtQBIQFB4ABBCBCaKiIDQgo3AwAgAyABNgIYIAMgBTYCFCADIAIpA7gBNwMIIANBEGogAkG4AWpBCGooAgA2AgAMAwsgARChCyACQRBqIAEQtgogAigCFCEDAkAgAigCEEEBcQ0AIAJBuAFqIANBzNmbARDSIQwBCwsgAkG4AWoQ+SpBASEEDAELIAJByAFqIAFBABC/BAJAAkAgAigCyAFBgYCAgHhHDQAgAiACKALMATYCNEEUIQEMAQsgAkHMAGogAkHgAWopAgA3AgAgAkHEAGogAkHYAWopAgA3AgAgAkE8aiACQdABaikCADcCACACIAIpAsgBNwI0QQIhAQsgAiABNgIwIAJBCGogAkEwahD4GyACKAIMIQMgAigCCCEECyAAIAQ2AgAgACADNgIEIAJB8AFqJAALwAcBCn8jAEHQAGsiASQAQYGAxAAhAgJAIAAoAgQiAyAAKAIQIgRJDQAgACADIARrIgM2AgQgACAAKAIAIgIgBGoiBTYCAAJAAkACQAJAAkACQAJAIARBAkcNACACLQAAIgRBv39qQV9xQQpqIARBUGogBEE5SxsiBEEPSw0BIAItAAEiAkG/f2pBX3FBCmogAkFQaiACQTlLGyICQRBPDQIgBEEEdCACciIEwEF/Sg0FQYCAxAAhAiAEQf8BcSIGQcABSQ0HQQIhBwJAIAZB4AFJDQACQCAEQf8BcSIGQfABTw0AQQMhBwwBCyAGQfgBTw0IQQQhBwtBACECIAFBADoADyABQQA7AA0gASAEOgAMIAEgBzYCCCAHQQF0QX5qIQggASABQQxqNgIEIAFBDGpBAWohBANAAkAgA0ECTw0AQYCAxAAhAgwJCyAAIANBfmoiAzYCBCAAIAUgAmoiCUECajYCACAJLQAAIgZBv39qQV9xQQpqIAZBUGogBkE5SxsiCkEPSw0EIAlBAWotAAAiBkG/f2pBX3FBCmogBkFQaiAGQTlLGyIGQRBPDQUgBCAKQQR0IAZyOgAAIARBAWohBCAIIAJBAmoiAkcNAAwHCwtBoKacAUEoQfTglwEQ0h4AC0GE4ZcBENIsAAtBhOGXARDSLAALQYThlwEQ0iwAC0GE4ZcBENIsAAtBASEHIAFBATYCCCABQQA6AA8gAUEAOwANIAEgBDoADCABIAFBDGo2AgQLIAFBMGogAUEMaiAHENsEQYCAxAAhAiABKAIwDQAgASgCNCEAIAEgASgCOCIDNgIUIAEgADYCECAAIANqIQQCQCADRQ0AAkACQCAALAAAIgNBf0wNACAAQQFqIQYgA0H/AXEhAgwBCyAALQABQT9xIQIgA0EfcSEGAkAgA0FfSw0AIAZBBnQgAnIhAiAAQQJqIQYMAQsgAkEGdCAALQACQT9xciECAkAgA0FwTw0AIAIgBkEMdHIhAiAAQQNqIQYMAQsgAkEGdCAALQADQT9xciAGQRJ0QYCA8ABxciECIABBBGohBgsCQCAGIARGDQAgBiwAAEF/ShoMAQsgAkGAgMQARw0BCyAAIAQQ1CUhACABQQutQiCGIAFBzABqrYQ3A0AgAUHKAK1CIIYgAUEQaq2ENwM4IAFB/AGtQiCGIAFBBGqthDcDMCABIAA2AkwgAUEENgIcIAFBhOKXATYCGCABQgM3AiQgASABQTBqNgIgIAFBGGpBpOKXARDpIwALIAFB0ABqJAAgAgu6CAEKfyMAQcABayIBJAACQAJAAkAgACgCACICQYiAxABHDQAgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BIAAoAggoAgAiAkGIgMQARg0BIAJBgIDEAEYNAgwBCwJAAkAgAkGAgLx/aiICQQIgAkEISRsOCAMDAwMDAwABAwsgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BDAILIAAoAgxFDQELQdgAEPEnIQMCQEHYAEUiAg0AIAFB6ABqIABB2AD8CgAACyAAQgA3AgQgAEGAgMQANgIAIABBDGpCADcCACAAQRRqQgA3AgACQCACDQAgAyABQegAakHYAPwKAAALIAFBATYCDCABIAM2AgggAUEBNgIEIAFBEGpBBGohBEEAIQBBASECA0ACQAJAAkACQAJAIAJFDQAgASACQX9qIgU2AgwgAyAFQdgAbGoiBigCACICQYmAxABHDQEgBSEACyADIQIDQCAARQ0CIABBf2ohACACEPojIAJB2ABqIQIMAAsLIAEoAgQhByABIAI2AhACQEHUAEUiCA0AIAQgBkEEakHUAPwKAAALIAJBiIDEAEcNASABKAIUIQICQEHYAEUiBQ0AIAFB6ABqIAJB2AD8CgAACyACQgA3AgQgAkGAgMQANgIAIAJBDGpCADcCACACQRRqQgA3AgAgAUEEaiABQegAakG4+4cBEOYeIAEoAhghAgJAIAUNACABQegAaiACQdgA/AoAAAsgAkIANwIEIAJBgIDEADYCACACQQxqQgA3AgAgAkEUakIANwIAIAFBBGogAUHoAGpByPuHARDmHgwCCyABKAIEIANBBEHYABCcFgwDCwJAAkAgAkGAgLx/aiICQQIgAkEISRsOCAICAgICAgABAgsgASgCFCECAkBB2ABFDQAgAUHoAGogAkHYAPwKAAALIAJCADcCBCACQYCAxAA2AgAgAkEMakIANwIAIAJBFGpCADcCACABQQRqIAFB6ABqQaj7hwEQ5h4MAQsgASgCHCECIAFBADYCHCACQdgAbCEJIAEoAhghBgJAIAIgByAFa00NACABQQRqIAUgAkEEQdgAENEdIAEoAgwhBSABKAIIIQMLIAYgCWohCiAGQdgAaiECIAMgBUHYAGxqIQMCQANAAkAgCQ0AIAohAgwCCyAGKAIAIgdBiIDEAEYNAQJAIAgNACABQegAaiAGQQRqQdQA/AoAAAsgAyAHNgIAAkAgCA0AIANBBGogAUHoAGpB1AD8CgAACyAGQdgAaiEGIANB2ABqIQMgCUGof2ohCSACQdgAaiECIAVBAWohBQwACwsgASAFNgIMIAogAmtB2ABuIQUgCiACRg0AA0AgBUUNASAFQX9qIQUgAhCxGyACQdgAaiECDAALCyABQRBqEPsVIAEoAgghAyABKAIMIQIMAAsLIAFBwAFqJAALuggBBX8jAEHQAGsiAiQAIAAoAgAiA0EEaigCACEAIAMoAgAhAyABKAIEIQQgASgCACEFIAJBADYCSEEBIQEgAkEBNgI8IAJBxIKIATYCOCACQgQ3AkACQCAFIAQgAkE4ahCVKQ0AAkADQCACQRhqIAMgABDEBwJAAkACQAJAIAItABgiAUECRg0AAkAgAUEBcUUNACACIAItABk6ACAgAkEBNgJMIAJBnIaZATYCSCACQQE2AjwgAkGEgJkBNgI4IAJBATYCRCACQecBNgIsIAIgAkEoajYCQCACIAJBIGo2AiggBSAEIAJBOGoQlSkNBiACQQhqQQEgAyAAQdyCiAEQzyMgAigCDCEAIAIoAgghAwwFCwJAAkAgAigCHCIBQYABTw0AQQEhBgwBCwJAIAFBgBBPDQBBAiEGDAELQQNBBCABQYCABEkbIQYLIAJBEGogBiADIABBzIKIARDPIyACKAIUIQAgAigCECEDIAFBDUsNAUEBIAF0IgZBgMwAcQ0DIAZBgDBxDQIgAQ0BIAJBADYCSCACQQE2AjwgAkGMgJkBNgI4IAJCBDcCQCAFIAQgAkE4ahCVKUUNBAwFCyACQQA2AkggAkEBNgI8IAJBxIKIATYCOCACQgQ3AkAgBSAEIAJBOGoQlSkhAQwFCyABQf8ARg0AIAFBf2pBCEkNACABQXJqQQxPDQELIAJBATYCTCACQZyGmQE2AkggAkEBNgI8IAJBhICZATYCOCACQQE2AkQgAkHoATYCLCACIAE2AiAgAiACQShqNgJAIAIgAkEgajYCKCAFIAQgAkE4ahCVKUUNAQwCCwJAAkACQAJAAkACQAJAAkACQCABQXdqDgUBAwcHAgALIAFB3ABGDQMgAUEiRg0EIAFBJ0YNBSABDQYgAkGABDsBMiACQgA3ASogAkHc4AA7ASgMBwsgAkGABDsBMiACQgA3ASogAkHc6AE7ASgMBgsgAkGABDsBMiACQgA3ASogAkHc5AE7ASgMBQsgAkGABDsBMiACQgA3ASogAkHc3AE7ASgMBAsgAkGABDsBMiACQgA3ASogAkHcuAE7ASgMAwsgAkGABDsBMiACQgA3ASogAkHcxAA7ASgMAgsgAkGABDsBMiACQgA3ASogAkHczgA7ASgMAQsCQCABQf8FTQ0AIAEQ/wdFDQAgAkE4aiABEPcKIAJBKGpBCGogAkE4akEIaigAADYCACACIAIpADg3AygMAQsCQCABENIMDQAgAkE4aiABEPcKIAJBKGpBCGogAkE4akEIaigAADYCACACIAIpADg3AygMAQsgAiABNgIsIAJBgAE6ACgLIAJB6QE2AiQgAkEBNgI8IAJBnL+cATYCOCACQgE3AkQgAiACQShqNgIgIAIgAkEgajYCQCAFIAQgAkE4ahCVKUUNAAsLQQEhAQsgAkHQAGokACABC7UIAgV/A34jAEHwAGsiAiQAIAEoAtgBIQMCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0A4AEiBEG1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELAkACQAJAIARBQGoOAwYAAQILIAJB2ABqIAEQjxEgAikDYCIHQoCAgIBwgyEIIAIpA1ghCSAHpyEFIAEoAtQBIQFBAiEGDAYLIAJB2ABqIAEQkBEgAikDYCEJIAIoAlghBSABKALUASEBQQQhBkIAIQgMBQsgBEG0f2pB/wFxQdUASQ0AIARBBEYNAiACQdgAakEEciABENQmIAJBxQA2AmwgAkHA3JsBNgJoIAJBsICAgHg2AlggASgC2AEgASgC3AEgAkHYAGoQ4BohAyABLQDgAUGiAUYNAQwJCyABEJwiIQggATUC1AFCIIYgA62EIQkgCEIgiKchASAIpyEDQQAhBkIAIQgMBgsgASABEJosEKcXDAcLIAEQoQsgASgC2AEhBiACQQhqIAEQ0BMgAigCDCEEAkAgAigCCEEBcQ0AIAIgBDYCFCABLQDgASEFIAEtAJEBQSBxRQ0EIAVB/wFxQQdHDQRBBEEEEJ0qIgUgBDYCACACQQE2AiAgAiAFNgIcIAJBATYCGANAAkAgAS0A4AFBB0YNACABKALUASEEIAJBlIGAgHg2AlggASAGIAQgAkHYAGoQ3iMgASgC1AEhBUHAAEEIEJ0qIgRBGTYCACAEIAU2AhQgBCAGNgIQIAQgAikCGDcCBCAEQQxqIAJBGGpBCGooAgA2AgAgAiAENgIUIAEtAOABIQUMBgsgARChCyACIAEQ0BMgAigCBCEEIAIoAgBBAXENBCACQRhqIARBiN2bARDUIQwACwsgAEEFNgIAIAAgBDYCBAwHCyACQdgAaiABEP4aIAIpA2giB0KAgICAcIMhCCACKQNgIQkgAigCXCEBIAIoAlghAyAHpyEFQQEhBgsMAgsgAEEFNgIAIAAgBDYCBCACQRhqEJgoDAQLAkACQCAFQf8BcUEFRg0AIAEoAtwBIQMgASgC2AEhBCACQSRqIAEQ1CYgAkEBNgJcIAJBnL+cATYCWCACQgE3AmQgAkGzBzYCTCACQQU6AFcgAiACQcgAajYCYCACIAJB0ABqNgJIIAIgAkHXAGo2AlAgAkEwaiACQdgAahCSECACQcQAaiACQSxqKAIANgIAIAIgAikCJDcCPCAEIAMgAkEwahDgGiEDIAEtAOABQaIBRg0BDAMLIAEQoQsgASgC1AEhAUEDIQZCACEIDAELIAEgARCaLBCnFwwBCyAAIAk3AxAgACABNgIMIAAgAzYCCCAAIAQ2AgQgACAGNgIAIAAgCCAFrYQ3AxgMAgsgAEEFNgIAIAAgAzYCBCACQRRqELcDDAELIABBBTYCACAAIAM2AgQLIAJB8ABqJAALzQcCEH8BfiMAQcAAayIBJAACQAJAAkAgACgCDCICQX9GDQACQCACIAAoAgQiAyADQQFqIgRBA3YiBUEHbCADQQhJGyIGQQF2SQ0AIAFBKGogBiACIAYgAksbQQFqEKoMIAEoAiwhAyABKAIoIgVFDQMgASgCMCEHIAEgAzYCHCABQoSAgICAATcCECABIABBEGo2AgwgASAFNgIYIAAoAgAiCCkDACERIAEgCDYCOCABIAI2AjQgAUEANgIwIAEgEUJ/hUKAgYKEiJCgwIB/gzcDKCAIQXxqIQkgBUEIaiEKIAFBGGohCyACIQwCQANAIAxFDQECQANAIAEgAUEoahCIHCABKAIAQQFxDQEgASABKAI4IgZBCGo2AjggASABKAIwQQhqNgIwIAEgBikDCEJ/hUKAgYKEiJCgwIB/gzcDKAwACwsgASgCBCEGIAEgASgCNEF/aiIMNgI0IAUgBSADIAkgBiABKAIwakECdCINaygCACkDCCIREJ4TIgZqIBGnQRl2IgQ6AAAgCiADIAZBeGpxaiAEOgAAIAUgBkECdGtBfGogCCANa0F8aigAADYAAAwACwsgASACNgIkIAEgByACazYCICAAIAtBBBCAHyABKAIcIgZFDQIgASgCGCAGIAEoAhAgASgCFBCJHAwCCyAFIARBB3FBAEdqIQUgACgCACIMIQYCQANAIAVFDQEgBiAGKQMAIhFCf4VCB4hCgYKEiJCgwIABgyARQv/+/fv379+//wCEfDcDACAGQQhqIQYgBUF/aiEFDAALCwJAAkAgBEEISQ0AIAwgBGogDCkAADcAAAwBCyAERQ0AIAxBCGogDCAE/AoAAAsgDEEIaiELIAxBfGohDkEAIQUDQAJAAkAgBCAFIgZGDQAgBkEBaiEFIAwgBmoiCC0AAEGAAUcNAiAOIAZBAnQiDWshDyAMIA1rQXxqIRADQCAGIAMgDygCACkDCCIRpyIJcSIKayAMIAMgERCeEyINIAprcyADcUEISQ0CIAwgDWoiCi0AACEHIAogCUEZdiIJOgAAIAsgAyANQXhqcWogCToAACAMIA1BAnRrQXxqIQ0CQCAHQf8BRg0AIBAgDUEBEIAfIAAoAgQhAwwBCwsgCEH/AToAACALIAAoAgQiAyAGQXhqcWpB/wE6AAAgDSAQKAAANgAADAILIAAgAyADQQFqQQN2QQdsIANBCEkbIAJrNgIIDAMLIAggCUEZdiINOgAAIAsgAyAGQXhqcWogDToAAAwACwsQ6SEAC0GBgICAeCEDCyABQcAAaiQAIAML3AcCBH8BfiMAQTBrIgMkACABKAIAKAIAIgEoAgQhBCADQRhqIAIgASgCACIFQQAQiwICQAJAIAMtABhBBEYNACADKQMYIgdC/wGDQgRRDQAgACAHNwIADAELAkAgAS0AREUNACADQQA2AhggA0EIaiACIANBGGpBqpmcAUEHELMNAkAgAy0ACEEERg0AIAMpAwgiB0L/AYNCBFENACAAIAc3AgAMAgsgA0EYaiACEJIRIAMtABhBBEYNACADKQMYIgdC/wGDQgRRDQAgACAHNwIADAELIANBADYCCCADQRhqIAIgA0EIakGIn5wBQQkQsw0CQCADLQAYQQRGDQAgAykDGCIHQv8Bg0IEUQ0AIAAgBzcCAAwBCyADQRhqIAIQkhECQCADLQAYQQRGDQAgAykDGCIHQv8Bg0IEUQ0AIAAgBzcCAAwBCyADQRhqIAFBCGogAhCEGAJAIAMtABhBBEYNACADKQMYIgdC/wGDQgRRDQAgACAHNwIADAELAkAgASgCIEUNACADIAFBIGo2AiggA0EYaiADQShqIAIQpSwgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFENACAAIAc3AgAMAQsCQCABKAJAIgZFDQAgA0EYaiACEJIRAkAgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFENACAAIAc3AgAMAgsgA0EYaiACIANBCGpBvPObAUEHELMNAkAgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFENACAAIAc3AgAMAgsgA0EYaiACEJIRAkAgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFENACAAIAc3AgAMAgsgA0EYaiACIAUgBCABKAI8IAYQ5gUgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFENACAAIAc3AgAMAQsCQAJAIAItAE0NACADQRhqIAIQkhEgAy0AGEEERg0AIAMpAxgiB0L/AYNCBFINAQsgASgCNCEEIANBKGogAiABKAIwIgVBABCLAgJAAkACQCADLQAoQQRGDQAgAykDKCIHQv8Bg0IEUg0BCyADQQA2AhggA0EoaiACIANBGGpBqJmcAUEBELINAkAgAy0AKEEERg0AIAMpAygiB0L/AYNCBFINAQsgA0EoaiACIAUgBCABKAIoIAEoAiwQdwJAIAMtAChBBEYNACADKQMoIgdC/wGDQgRSDQELIANBKGogAiADQRhqQamZnAFBARCyDSADLQAoQQRGDQEgAykDKCIHQv8Bg0IEUQ0BCyAHQv8Bg0IEUQ0AIAAgBzcCAAwCCyAAQQQ6AAAMAQsgACAHNwIACyADQTBqJAALsgcBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQXRqIgJBByACQSZJGw4mAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyABQQhqIQIgAUEEaiEBDCwLIAFBFGohAiABQRBqIQEMKwsgAUEUaiECIAFBEGohAQwqCyABKAIgIgFBNGohAiABQTBqIQEMKQsgAUEMaiECIAFBCGohAQwoCyABQQhqIQIgAUEEaiEBDCcLIAFBEGohAiABQQxqIQEMJgsgAUE0aiECIAFBMGohAQwlCyABQSRqIQIgAUEgaiEBDCQLIAFBJGohAiABQSBqIQEMIwsgAUEUaiECIAFBEGohAQwiCyABQSBqIQIgAUEcaiEBDCELIAFBGGohAiABQRRqIQEMIAsgAUEUaiECIAFBEGohAQwfCyABQRRqIQIgAUEQaiEBDB4LIAEoAggOBxYXGBkaGxwWCyABQSBqIQIgAUEcaiEBDBwLIAFBEGohAiABQQxqIQEMGwsgAUEYaiECIAFBFGohAQwaCyABKAIgIgFBKGohAiABQSRqIQEMGQsgAUEIaiECIAFBBGohAQwYCyABQQhqIQIgAUEEaiEBDBcLIAFBDGohAiABQQhqIQEMFgsgAUEMaiECIAFBCGohAQwVCyABQRxqIQIgAUEYaiEBDBQLIAFBLGohAiABQShqIQEMEwsgAUEIaiECIAFBBGohAQwSCyABKAIEIgFBBGohAgwRCyABQRRqIQIgAUEQaiEBDBALIAFBEGohAiABQQxqIQEMDwsgAUEMaiECIAFBCGohAQwOCyABQQxqIQIgAUEIaiEBDA0LIAFBEGohAiABQQxqIQEMDAsgAUEQaiECIAFBDGohAQwLCyABQRBqIQIgAUEMaiEBDAoLIAFBFGohAiABQRBqIQEMCQsgAUEMaiECIAFBCGohAQwICyABQQhqIQIgAUEEaiEBDAcLIAFBHGohAiABQRhqIQEMBgsgAUEQaiECIAFBDGohAQwFCyABQRBqIQIgAUEMaiEBDAQLIAFBFGohAiABQRBqIQEMAwsgAUEUaiECIAFBEGohAQwCCyABQSRqIQIgAUEgaiEBDAELIAFBJGohAiABQSBqIQELIAAgAigCADYCBCAAIAEoAgA2AgALwwgBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAUF0aiICQQcgAkEmSRtBf2oOJAABAgMEBQYHCAkKCwwNDg8QERITIhQVFhciGBkaGxwdHh8gISILIAAoAggiAiAAKAIMEKseIAAoAgQgAhCbLQ8LIABBBGoQ/CoPCyAAKQMIIAAtABwQ7yggACgCIBDQGw8LIABBBGoQxSwPCyAAQQxqEMUsDwsgAEEEahDFLCAAQQhqEMUsDwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAQ4MAAECAwQFBgcICQsKCwsgAEEIahDIKwwKCyAAQQhqEJwjDAkLIABBCGoQmCcMCAsgAEEEahDFLAwHCyAAQQRqENAfDAYLIABBBGoQxiwMBQsgAEEEahDGLAwECyAAQQRqEMUsDAMLIABBBGoQxiwMAgsgAEEEahDeLQwBCwJAAkAgACgCBA4CAAECCyAAQQhqEKsmDAELIABBCGoQ4CcLIABBOGoQxSwPCyAAQQhqEJwjDwsgAEEIahCYJw8LIABBBGoQxSwgAEEIahDFLCAAQQxqEMUsDwsgAEEEaiECAkAgAC0AGEEFRw0AIABBEGoQxSwLIAIQ/yogACgCKBCELA8LIABBEGoQxSwCQCAAKAIEQYCAgIB4Rg0AIABBBGoQ/yoLIAAoAiAQhCwPCyAAQQRqEJgoDwsgACkDCBDIIQ8LAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAKQMQEMghIAApAxgQyCEPCyAAKQMQIAApAyAQwC4PCyAAKQMgEIMrDwsgACkDGCAAKAIgEMcmDwsgACkDEBDIISAAKQMYEMghDwsgAEEEahCHLA8LIABBBGoQxSwgACgCGBCELCAAKAIIIgAQhywgAEEgQQQQsxYPCyAAKAIIIgIgACgCDBCdJSAAKAIEIAIQoS0CQAJAIAAoAhAiAigCAEGAgICAeEYNACACEMkoDAELIAJBBGoQxSwLIAJBGEEEELMWIAAoAiAQ5yQgAEEkahDJKw8LIAApAwggAC0AHBDvKCAAQSBqEMkaDwsgAEEMahDHKw8LIABBBGoQxSwPCyAAQQRqEMUsDwsgAEEIahD5Ig8LIAApAwggACkDGBDBLg8LIAAoAgQiAEHAAGoQsR4gAEGAAWoiAigCACAAQYQBaigCABC0GyAAKAJ8IAIoAgAQoi0gACgCeBCELCAAQZABahCJKwJAIAAtADxBBkYNACAAQRBqELEeCyAAQaABQQgQsxYPCyAAQQRqEIkrDwsgAEEEahDGLA8LIABBBGoQxSwPCyAAQQRqEMUsDwsgAEEEahDGLA8LIABBBGoQ3i0PCyAAQQRqEMYsDwsgACkDCBDIIQ8LIABBBGoQ0B8LC8IIAgR/AX4jAEEgayIEJAAgASgC3AEhBSABKALYASEGAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDgASIHEKUVDQAgBEHCgICAeDYCCCAGIAUgBEEIahDgGiEHIAEtAOABQaIBRg0BDA4LIAdBzABGDQMgB0HoAEYNAiAHQfN+aiIDQQdNDQEMBAsgASABEJosEKcXDAwLQQEgA3RBjwFxRQ0CDAMLIAEtAJEBQSBxRQ0JQsHoocu2DiEIDAYLQtHC3YuWjR0hCCABKAKIASIHQYCAAXENBQJAAkACQCAHQYAEcQ0AAkAgB0GCAXENACADDQkgBEHCgICAeDYCCCAGIAUgBEEIahDgGiEHIAEtAOABQaIBRw0DIAEgARCaLBCnFwwDCyAEQaiAgIB4NgIIIAYgBSAEQQhqEOAaIQcgAS0A4AFBogFHDQEgASABEJosEKcXDAELIARBwoCAgHg2AgggBiAFIARBCGoQ4BohBwJAIAEtAOABQaIBRw0AIAEgARCaLBCnFwsgACAHNgIADAwLIAAgBzYCAAwLCyAAIAc2AgAMCgsCQAJAAkAgB0GDf2oOBgIBAQEDAwALIAdB8QBGDQIgB0HiAEYNAgsgB0GNf2pB/wFxQS5JDQIgB0HLAEYNBCACRQ0DIAdB8QBHDQNC0fKlq8aNGSEIDAULAkAgARCcIiIIQgODQgBSDQAgCKciByAHKAIAIgdBAWo2AgAgB0F/TA0GCyAEQaeAgIB4NgIIIAQgCDcDECABIAYgBSAEQQhqEN4jQQAhByAAQQA2AhAgACAGNgIIIAAgCDcDACAAIAEoAtQBNgIMDAoLAkAgARCcIiIIQgODQgBSDQAgCKciByAHKAIAIgdBAWo2AgAgB0F/TA0FCyAEQaeAgIB4NgIIIAQgCDcDECABIAYgBSAEQQhqEM4OQQAhByAAQQA2AhAgACAGNgIIIAAgCDcDACAAIAEoAtQBNgIMDAkLIAcQowkiCEIAUg0CQdyqnAEQ0iwACwJAIAdBpn9qIgNBEEsNAEEBIAN0QYGIBHENBQsgB0G0f2pB/wFxQSdJDQRBoKacAUEoQcimnAEQ0h4ACyAEIAEQnCI3AwAgAS0AigFBBHFFDQIgBBD0ICIINwMIIAQgBEEIahCTDCEHIAgQ2iEgB0UNAiAEQaqAgIB4NgIIIAEgBiAFIARBCGoQ3iMMAgsgARChC0EAIQcgAEEANgIQIAAgBjYCCCAAIAg3AwAgACABKALUATYCDAwFCwALQQAhByAAQQA2AhAgACAGNgIIIAAgBCkDADcDACAAIAEoAtQBNgIMDAMLIARBwoCAgHg2AgggBiAFIARBCGoQ4BohBwJAIAEtAOABQaIBRw0AIAEgARCaLBCnFwsgACAHNgIADAELIAAgBzYCAAtBAiEHCyAAIAc6ABQgBEEgaiQAC70IAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMSEgECAwQFBgcICQoLDA0ODxARAAsgAEEIahDqEwwRCwJAIAAoAgQiAUGAgICAeEcNACAAQQhqELAJIAAoAgggACgCDBChLQJAIAAoAiAiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCFCIAKAIAIgEQzAMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahCwCSABIAAoAggQoS0CQCAAKAIcIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhAiACgCACIBEMwDIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBEGoQ7RAgACgCKCIARQ0PIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgAEEQaiEBAkACQCAALQBEQQRHDQAgARDtEAwBCyABEOoTCyAAKAJYIgBFDQ4gABC3HyAAKAIAIABBBGooAgAQny0gAEEUQQQQsxYPCyAAKAIIIgEgACgCDBCfJSAAKAIEIAEQoy0PCyAAKAIEIgAQzAMgAEHgAEEIELMWDwsgACgCCCIBIAAoAgwQuhwgACgCBCABEKMtDwsgACgCBCIAEMwDIABB4ABBCBCzFg8LIAAoAgQiABDMAyAAQeAAQQgQsxYPCyAAQQhqELcfIAAoAgggACgCDBCfLQ8LIAAoAgQiARDMAyABQeAAQQgQsxYgACgCCCIBEMwDIAFB4ABBCBCzFiAAKAIMIgEQzAMgAUHgAEEIELMWIAAoAhAiABDMAyAAQeAAQQgQsxYPCyAAQRBqENYUDwsgACgCBCIAEMwDIABB4ABBCBCzFg8LIAAoAgQiABDMAyAAQeAAQQgQsxYPCyAAKAIEIgEQzAMgAUHgAEEIELMWIAAoAggiABDMAyAAQeAAQQgQsxYPCyAAQRBqENYUAkAgACgCQCIBRQ0AIAEQzAMgAUHgAEEIELMWCyAAKAJEIgBFDQIgABDMAyAAQeAAQQgQsxYPCwJAAkACQAJAIAAoAggiAkGAgICAeHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahC3HyACIAAoAgwQny0gACgCGCIBIAAoAhwQthAgACgCFCABEKAtDwsgACkDICIDUA0DIANCA4NCAFINAyADpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgACkDECAAKQMgEKoUDwsgACkDGCAAKAIgELQZDwsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIARQ0AIAAoAgAiARDMAyABQeAAQQgQsxYgAEEMQQQQsxYPCwu9CAICfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TEhIBAgMEBQYHCAkKCwwNDg8QEQALIABBCGoQ6hMMEQsCQCAAKAIEIgFBgICAgHhHDQAgAEEIahCwCSAAKAIIIAAoAgwQoS0CQCAAKAIgIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhQiACgCACIBEM0DIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBBGoQsAkgASAAKAIIEKEtAkAgACgCHCIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIQIgAoAgAiARDNAyABQeAAQQgQsxYgAEEMQQQQsxYPCyAAQRBqEO0QIAAoAigiAEUNDyAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFg8LIABBEGohAQJAAkAgAC0AREEERw0AIAEQ7RAMAQsgARDqEwsgACgCWCIARQ0OIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgACgCCCIBIAAoAgwQnyUgACgCBCABEKMtDwsgACgCBCIAEM0DIABB4ABBCBCzFg8LIAAoAggiASAAKAIMELocIAAoAgQgARCjLQ8LIAAoAgQiABDNAyAAQeAAQQgQsxYPCyAAKAIEIgAQzQMgAEHgAEEIELMWDwsgAEEIahC3HyAAKAIIIAAoAgwQny0PCyAAKAIEIgEQzQMgAUHgAEEIELMWIAAoAggiARDNAyABQeAAQQgQsxYgACgCDCIBEM0DIAFB4ABBCBCzFiAAKAIQIgAQzQMgAEHgAEEIELMWDwsgAEEQahDlFA8LIAAoAgQiABDNAyAAQeAAQQgQsxYPCyAAKAIEIgAQzQMgAEHgAEEIELMWDwsgACgCBCIBEM0DIAFB4ABBCBCzFiAAKAIIIgAQzQMgAEHgAEEIELMWDwsgAEEQahDlFAJAIAAoAkAiAUUNACABEM0DIAFB4ABBCBCzFgsgACgCRCIARQ0CIAAQzQMgAEHgAEEIELMWDwsCQAJAAkACQCAAKAIIIgJBgICAgHhzIgFBBCABQQRJGw4EAQIFAwALIABBCGoQtx8gAiAAKAIMEJ8tIAAoAhgiASAAKAIcELYQIAAoAhQgARCgLQ8LIAApAyAiA1ANAyADQgODQgBSDQMgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDGJA8LIAApAxAgACkDIBCqFA8LIAApAxggACgCIBC0GQ8LAkAgAC0AHEECRg0AIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIAAoAigiAEUNACAAKAIAIgEQzQMgAUHgAEEIELMWIABBDEEEELMWDwsLvQgCAn8BfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOExISAQIDBAUGBwgJCgsMDQ4PEBEACyAAQQhqEOoTDBELAkAgACgCBCIBQYCAgIB4Rw0AIABBCGoQsAkgACgCCCAAKAIMEKEtAkAgACgCICIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIUIgAoAgAiARDOAyABQeAAQQgQsxYgAEEMQQQQsxYPCyAAQQRqELAJIAEgACgCCBChLQJAIAAoAhwiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCECIAKAIAIgEQzgMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEQahDtECAAKAIoIgBFDQ8gABC3HyAAKAIAIABBBGooAgAQny0gAEEUQQQQsxYPCyAAQRBqIQECQAJAIAAtAERBBEcNACABEO0QDAELIAEQ6hMLIAAoAlgiAEUNDiAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFg8LIAAoAggiASAAKAIMEJ8lIAAoAgQgARCjLQ8LIAAoAgQiABDOAyAAQeAAQQgQsxYPCyAAKAIIIgEgACgCDBC6HCAAKAIEIAEQoy0PCyAAKAIEIgAQzgMgAEHgAEEIELMWDwsgACgCBCIAEM4DIABB4ABBCBCzFg8LIABBCGoQtx8gACgCCCAAKAIMEJ8tDwsgACgCBCIBEM4DIAFB4ABBCBCzFiAAKAIIIgEQzgMgAUHgAEEIELMWIAAoAgwiARDOAyABQeAAQQgQsxYgACgCECIAEM4DIABB4ABBCBCzFg8LIABBEGoQ+hQPCyAAKAIEIgAQzgMgAEHgAEEIELMWDwsgACgCBCIAEM4DIABB4ABBCBCzFg8LIAAoAgQiARDOAyABQeAAQQgQsxYgACgCCCIAEM4DIABB4ABBCBCzFg8LIABBEGoQ+hQCQCAAKAJAIgFFDQAgARDOAyABQeAAQQgQsxYLIAAoAkQiAEUNAiAAEM4DIABB4ABBCBCzFg8LAkACQAJAAkAgACgCCCICQYCAgIB4cyIBQQQgAUEESRsOBAECBQMACyAAQQhqELcfIAIgACgCDBCfLSAAKAIYIgEgACgCHBC2ECAAKAIUIAEQoC0PCyAAKQMgIgNQDQMgA0IDg0IAUg0DIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQxiQPCyAAKQMQIAApAyAQqhQPCyAAKQMYIAAoAiAQtBkPCwJAIAAtABxBAkYNACAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAKAIoIgBFDQAgACgCACIBEM4DIAFB4ABBCBCzFiAAQQxBBBCzFg8LC70IAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMSEgECAwQFBgcICQoLDA0ODxARAAsgAEEIahDqEwwRCwJAIAAoAgQiAUGAgICAeEcNACAAQQhqELAJIAAoAgggACgCDBChLQJAIAAoAiAiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCFCIAKAIAIgEQzwMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahCwCSABIAAoAggQoS0CQCAAKAIcIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhAiACgCACIBEM8DIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBEGoQ7RAgACgCKCIARQ0PIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgAEEQaiEBAkACQCAALQBEQQRHDQAgARDtEAwBCyABEOoTCyAAKAJYIgBFDQ4gABC3HyAAKAIAIABBBGooAgAQny0gAEEUQQQQsxYPCyAAKAIIIgEgACgCDBCfJSAAKAIEIAEQoy0PCyAAKAIEIgAQzwMgAEHgAEEIELMWDwsgACgCCCIBIAAoAgwQuhwgACgCBCABEKMtDwsgACgCBCIAEM8DIABB4ABBCBCzFg8LIAAoAgQiABDPAyAAQeAAQQgQsxYPCyAAQQhqELcfIAAoAgggACgCDBCfLQ8LIAAoAgQiARDPAyABQeAAQQgQsxYgACgCCCIBEM8DIAFB4ABBCBCzFiAAKAIMIgEQzwMgAUHgAEEIELMWIAAoAhAiABDPAyAAQeAAQQgQsxYPCyAAQRBqEP8UDwsgACgCBCIAEM8DIABB4ABBCBCzFg8LIAAoAgQiABDPAyAAQeAAQQgQsxYPCyAAKAIEIgEQzwMgAUHgAEEIELMWIAAoAggiABDPAyAAQeAAQQgQsxYPCyAAQRBqEP8UAkAgACgCQCIBRQ0AIAEQzwMgAUHgAEEIELMWCyAAKAJEIgBFDQIgABDPAyAAQeAAQQgQsxYPCwJAAkACQAJAIAAoAggiAkGAgICAeHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahC3HyACIAAoAgwQny0gACgCGCIBIAAoAhwQthAgACgCFCABEKAtDwsgACkDICIDUA0DIANCA4NCAFINAyADpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgACkDECAAKQMgEKoUDwsgACkDGCAAKAIgELQZDwsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIARQ0AIAAoAgAiARDPAyABQeAAQQgQsxYgAEEMQQQQsxYPCwu9CAICfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TEhIBAgMEBQYHCAkKCwwNDg8QEQALIABBCGoQ6hMMEQsCQCAAKAIEIgFBgICAgHhHDQAgAEEIahCwCSAAKAIIIAAoAgwQoS0CQCAAKAIgIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhQiACgCACIBENADIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBBGoQsAkgASAAKAIIEKEtAkAgACgCHCIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIQIgAoAgAiARDQAyABQeAAQQgQsxYgAEEMQQQQsxYPCyAAQRBqEO0QIAAoAigiAEUNDyAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFg8LIABBEGohAQJAAkAgAC0AREEERw0AIAEQ7RAMAQsgARDqEwsgACgCWCIARQ0OIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgACgCCCIBIAAoAgwQnyUgACgCBCABEKMtDwsgACgCBCIAENADIABB4ABBCBCzFg8LIAAoAggiASAAKAIMELocIAAoAgQgARCjLQ8LIAAoAgQiABDQAyAAQeAAQQgQsxYPCyAAKAIEIgAQ0AMgAEHgAEEIELMWDwsgAEEIahC3HyAAKAIIIAAoAgwQny0PCyAAKAIEIgEQ0AMgAUHgAEEIELMWIAAoAggiARDQAyABQeAAQQgQsxYgACgCDCIBENADIAFB4ABBCBCzFiAAKAIQIgAQ0AMgAEHgAEEIELMWDwsgAEEQahCAFQ8LIAAoAgQiABDQAyAAQeAAQQgQsxYPCyAAKAIEIgAQ0AMgAEHgAEEIELMWDwsgACgCBCIBENADIAFB4ABBCBCzFiAAKAIIIgAQ0AMgAEHgAEEIELMWDwsgAEEQahCAFQJAIAAoAkAiAUUNACABENADIAFB4ABBCBCzFgsgACgCRCIARQ0CIAAQ0AMgAEHgAEEIELMWDwsCQAJAAkACQCAAKAIIIgJBgICAgHhzIgFBBCABQQRJGw4EAQIFAwALIABBCGoQtx8gAiAAKAIMEJ8tIAAoAhgiASAAKAIcELYQIAAoAhQgARCgLQ8LIAApAyAiA1ANAyADQgODQgBSDQMgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDGJA8LIAApAxAgACkDIBCqFA8LIAApAxggACgCIBC0GQ8LAkAgAC0AHEECRg0AIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIAAoAigiAEUNACAAKAIAIgEQ0AMgAUHgAEEIELMWIABBDEEEELMWDwsLvQgCAn8BfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOExISAQIDBAUGBwgJCgsMDQ4PEBEACyAAQQhqEOoTDBELAkAgACgCBCIBQYCAgIB4Rw0AIABBCGoQsAkgACgCCCAAKAIMEKEtAkAgACgCICIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIUIgAoAgAiARDRAyABQeAAQQgQsxYgAEEMQQQQsxYPCyAAQQRqELAJIAEgACgCCBChLQJAIAAoAhwiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCECIAKAIAIgEQ0QMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEQahDtECAAKAIoIgBFDQ8gABC3HyAAKAIAIABBBGooAgAQny0gAEEUQQQQsxYPCyAAQRBqIQECQAJAIAAtAERBBEcNACABEO0QDAELIAEQ6hMLIAAoAlgiAEUNDiAAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFg8LIAAoAggiASAAKAIMEJ8lIAAoAgQgARCjLQ8LIAAoAgQiABDRAyAAQeAAQQgQsxYPCyAAKAIIIgEgACgCDBC6HCAAKAIEIAEQoy0PCyAAKAIEIgAQ0QMgAEHgAEEIELMWDwsgACgCBCIAENEDIABB4ABBCBCzFg8LIABBCGoQtx8gACgCCCAAKAIMEJ8tDwsgACgCBCIBENEDIAFB4ABBCBCzFiAAKAIIIgEQ0QMgAUHgAEEIELMWIAAoAgwiARDRAyABQeAAQQgQsxYgACgCECIAENEDIABB4ABBCBCzFg8LIABBEGoQgxUPCyAAKAIEIgAQ0QMgAEHgAEEIELMWDwsgACgCBCIAENEDIABB4ABBCBCzFg8LIAAoAgQiARDRAyABQeAAQQgQsxYgACgCCCIAENEDIABB4ABBCBCzFg8LIABBEGoQgxUCQCAAKAJAIgFFDQAgARDRAyABQeAAQQgQsxYLIAAoAkQiAEUNAiAAENEDIABB4ABBCBCzFg8LAkACQAJAAkAgACgCCCICQYCAgIB4cyIBQQQgAUEESRsOBAECBQMACyAAQQhqELcfIAIgACgCDBCfLSAAKAIYIgEgACgCHBC2ECAAKAIUIAEQoC0PCyAAKQMgIgNQDQMgA0IDg0IAUg0DIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQxiQPCyAAKQMQIAApAyAQqhQPCyAAKQMYIAAoAiAQtBkPCwJAIAAtABxBAkYNACAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAKAIoIgBFDQAgACgCACIBENEDIAFB4ABBCBCzFiAAQQxBBBCzFg8LC70IAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMSEgECAwQFBgcICQoLDA0ODxARAAsgAEEIahDqEwwRCwJAIAAoAgQiAUGAgICAeEcNACAAQQhqELAJIAAoAgggACgCDBChLQJAIAAoAiAiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCFCIAKAIAIgEQ0gMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahCwCSABIAAoAggQoS0CQCAAKAIcIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAhAiACgCACIBENIDIAFB4ABBCBCzFiAAQQxBBBCzFg8LIABBEGoQ7RAgACgCKCIARQ0PIAAQtx8gACgCACAAQQRqKAIAEJ8tIABBFEEEELMWDwsgAEEQaiEBAkACQCAALQBEQQRHDQAgARDtEAwBCyABEOoTCyAAKAJYIgBFDQ4gABC3HyAAKAIAIABBBGooAgAQny0gAEEUQQQQsxYPCyAAKAIIIgEgACgCDBCfJSAAKAIEIAEQoy0PCyAAKAIEIgAQ0gMgAEHgAEEIELMWDwsgACgCCCIBIAAoAgwQuhwgACgCBCABEKMtDwsgACgCBCIAENIDIABB4ABBCBCzFg8LIAAoAgQiABDSAyAAQeAAQQgQsxYPCyAAQQhqELcfIAAoAgggACgCDBCfLQ8LIAAoAgQiARDSAyABQeAAQQgQsxYgACgCCCIBENIDIAFB4ABBCBCzFiAAKAIMIgEQ0gMgAUHgAEEIELMWIAAoAhAiABDSAyAAQeAAQQgQsxYPCyAAQRBqEIUVDwsgACgCBCIAENIDIABB4ABBCBCzFg8LIAAoAgQiABDSAyAAQeAAQQgQsxYPCyAAKAIEIgEQ0gMgAUHgAEEIELMWIAAoAggiABDSAyAAQeAAQQgQsxYPCyAAQRBqEIUVAkAgACgCQCIBRQ0AIAEQ0gMgAUHgAEEIELMWCyAAKAJEIgBFDQIgABDSAyAAQeAAQQgQsxYPCwJAAkACQAJAIAAoAggiAkGAgICAeHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahC3HyACIAAoAgwQny0gACgCGCIBIAAoAhwQthAgACgCFCABEKAtDwsgACkDICIDUA0DIANCA4NCAFINAyADpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgACkDECAAKQMgEKoUDwsgACkDGCAAKAIgELQZDwsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIARQ0AIAAoAgAiARDSAyABQeAAQQgQsxYgAEEMQQQQsxYPCwvUBwIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIAQQAQiwICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKkUNACADQQA2AhAgA0EIaiACIANBEGpBm/ObAUEFELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKEUNACADQQA2AhAgA0EIaiACIANBEGpBnJacAUECELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKUUNACADQQA2AhAgA0EIaiACIANBEGpBufObAUEDELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAUEIaiACEIQYAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsCQCABKAIgRQ0AIANBEGogAhCSEQJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAILIANBADYCECADQQhqIAIgA0EQakG885sBQQcQsw0CQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQRBqIAIQkhECQCADLQAQQQRGDQAg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QQEhAiAEQczjlwFBvOOXASADQQFxIgUbQRlBECAFGxCCBg0FCyAAIAM6AARBACECDAELAkAgASgCECIDQQFxDQAgAUKAgICAIDcCGCABIAI2AgwgASADNgIQIAEgAiADaiIFNgIUAkADQCABQQxqEMMDQYCAvH9qDgICAQALCyAAKAIQIgRFDQMgBCgCAEEiIARBBGoiBigCACgCEBEHAA0CIAFCgICAgCA3AhggASAFNgIUIAEgAzYCECABIAI2AgwgAUEoaiEHA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBDGoQwwMiA0GBgMQARg0AIANBgIDEAEYNCiADQSdGDQsCQCADQSFKDQAgA0F3ag4FBwQDAwgCCyADQSJGDQQgA0HcAEcNAkHcACEIQQAhCUECIQpBACELQQAhA0EAIQxB3AAhBQwNCyAEKAIAQSIgBEEEaigCACgCEBEHACECDBILIANFDQMLIANB/wVNDQkgAxD/B0UNCSABQSBqIAMQ9wogASkAIiIOQjCIpyELIA5CEIinIQMgAS0AKyEKIAEtACohDCABLQAhIQggAS0AICEFIA6nIQkMCgtB3AAhBUHuACEIDAQLQdwAIQVBIiEIDAMLQdwAIQVBMCEIQQAhCUECIQpBACELDAMLQdwAIQVB9AAhCAwBC0HcACEFQfIAIQgLQQAhCUECIQpBACELQQAhAwtBACEMDAMLQcSInAFBKyABQSBqQazblwFBnNuXARDqEgALIAQoAgBBJyAGKAIAKAIQEQcADQUMAgtBgAEhBSADENIMDQAgAUEgaiADEPcKIAEpACIiDkIwiKchCyAOQhCIpyEDIAEtACshCiABLQAqIQwgAS0AISEIIAEtACAhBSAOpyEJCyABIAg6ACEgASAFOgAgIAEgC61CMIYgCa1C//8Dg4QgA61CEIaENwEiIAohDSAMIQADQAJAAkAgBUH/AXFBgAFHDQBBACEFIAdBADsBACABQgA3AyBBACENQQAhACADIQJBACEDDAELIABB/wFxIgIgDUH/AXFPDQIgAEEBaiEAIAFBIGogAmotAAAhAgsgBCgCACACIAYoAgAoAhARBwANBAwACwsLAkAgACgCECICRQ0AIAJBvOOXAUEQEIIGDQILQQAhAiAAQQA6AAQLIAAgAjYCAAwCC0EBIQIMAQtBACECCyABQTBqJAAgAgvrBwIHfwF+IwBB8ABrIgMkACADQQhqIAEoAgAiBEHAAGpBuMaEARDsIyADKAIMIQUgAygCCCIGQQA2AgggA0EQakEIaiAEQdgAaigCADYCACADIAQpAlA3AxAgA0HAAGogARCnDSADQSBqQQhqIANB1ABqKAIANgIAIAMgAykCTDcDICAEQdAAaiEEAkACQANAIAEQ1CRFDQEgARD7D0H9AEYNAQJAIAEQ+w8Q4iINACADQcAAaiABEKcNIABBHGogASgCBCABKAIIEIoUIABBCTYCACAAIAMpAkA3AiggAEEwaiADQcgAaikCADcCACAAQThqIANB0ABqKQIANwIADAMLIAYgARD7DxDAFwwACwsCQAJAAkACQCAEKAIAIgcgASgCCCIIRg0AIANBMGpBCGogBEEIaigCADYCACADIAQpAgA3AzAgBigCBCEJIAYoAgghBiADIAEQ+w8iBzYCPCAHQf0ARw0BIAEQ1CQaIAZFDQIgA0HAAGogCSAGQRAQnwggAy0AQA0DIAMoAkQiBkGAsANzQYCAvH9qQYCQvH9JDQMgBkGAgMQARg0DIANB2ABqQQhqIgEgA0EgakEIaigCADYCACADQewAaiAEQQhqKAIANgIAIAAgBjYCBCAAIAMpAyAiCjcCCCAAIAI6ACEgAEEFOgAgIAMgBCkCADcCZCAAQRBqIAEpAwA3AgAgAEEYaiADQdgAakEQaikDADcCACADIAo3A1ggAEEiNgIADAQLIANB1ABqIARBCGooAgA2AgAgA0HAAGpBCGoiBiADQRBqQQhqKAIANgIAIAMgAykDEDcDQCADIAQpAgA3AkwgAEEcaiABKAIEIAcQihQgAEEKNgIAIAAgAykDQDcCKCAAQTBqIAYpAwA3AgAgAEE4aiADQdAAaikDADcCAAwDCyADQQA2AkAgA0E8akHIxoQBIANBwABqQczGhAEQtyEACyADQdQAaiAEQQhqKAIANgIAIANBwABqQQhqIgYgA0EQakEIaigCADYCACADIAMpAxA3A0AgAyAEKQIANwJMIABBHGogASgCBCAIEIoUIABBBzYCACAAIAMpA0A3AiggAEEwaiAGKQMANwIAIABBOGogA0HQAGopAwA3AgAMAQsgA0HAAGpBCGoiBiADQSBqQQhqKAIANgIAIANB1ABqIANB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AiABEKkEDAELAkACQAJAAkACQAJAAkACQAJAAkAgAg4LAAECAwQFBgcICQoACyAAQQhqIAEoAhQQmC8MCQsgASAAQQhqEJ0mDAgLIAEgAEEIahDDKAwHCyAAQQRqIAEQlC8MBgsgAEEEaiABEJQjDAULIABBBGogARCULwwECyAAQQRqIAEQlC8MAwsgAEEEaiABEJQvDAILIABBBGogARCULwwBCyAAQQRqIAEQlC8LIAMgARCULw8LIAEgAEEIahCdJg8LIAEgAEEIahDDKA8LIABBBGogARCULyAAQQhqIAEQlC8gAEEMaiABEJQvDwsgAEEEaiEDAkAgAC0AGEEFRw0AIABBEGogARCULwsgASADEKAfDwsgAEEQaiABEJQvIAAoAgRBgICAgHhGDRMgASAAQQRqEKAfDwsgASAAQQRqEKIfDwsgASgCFCAAQQhqEKsIGg8LIAEgAEEEahCiHw8LIABBBGogARCULyABIAAoAggQoh8PCyAAKAIMQShsIQMgACgCCCECAkADQCADRQ0BIAIgARCOFiADQVhqIQMgAkEoaiECDAALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAQQRqIAEQlC8PCyABIAAQlAcPCyABIABBCGoQlRAPCyAAKAIMRQ0MIABBDGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBIGogASgCFBC0JA8LIAAoAgQgARCTDw8LIABBBGogARD8Ew8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCUIwsLnwcBDH8gAC0AJCECIABBADoAJCAALQAlIQMCQCABKAIwIgRFDQAgACAEEFQLIAAtACYhBSAAQQA6ACYgASgCECEGAkAgASgCFCIHRQ0AIAYgB0HYAGxqIQggBiEJA0ACQAJAAkACQAJAAkACQAJAIAkoAgAiCkF8akEAIApBe2pBCEkbDgkAAQIDBAcHBQYACyAAIAkQkyQCQCAJKAJIIgpFDQAgCSgCRCILIApBBnRqIQwDQAJAAkAgCygCAEEHRg0AIAAvASQhCiAAQQI6ACQgCyAAEL4eIAAgCjsBJAwBCwJAIAsoAjgiDUUNACALKAI0IQogDUEM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AwA3AgAgAkEIaiALKQMANwIAIAIgFTcCACABQYABaiQAIAIPCyAQIAEoAihBtPKaARCOKQALpwcCCn8BfiMAQfAAayICJAACQAJAIAAoAgAiA0EJRw0AIAFBADoAfSAAQQhqIAEQ5AIMAQsCQAJAAkACQAJAAkACQAJAAkAgAw4JAAECAwQFBgcIAAsCQCAAKAIMIgNFDQAgACgCCCEEIANByABsIQUgAUEsaiEGIAFBgAFqIQdBACEIA0ACQAJAAkACQCAEIAhqIgMpAwBCfXwiDKdBAWpBACAMQgJUGw4DAAECAAsgA0EgaiIJKQMAIANBMGoiCigCACABEOoeAkAgAykDACIMQgJRDQAgDKdBAXENACADQQhqKQMAIANBGGooAgAgARDqHgsgAkEIaiAJKQMAIAooAgAQuR8gBiACKQMIIAIoAhBBARCzDCABIAkpAwAgCigCABDVEQwCCyADQSBqIgsoAgAiCSEKAkAgAS0AkAENACAJIQogCUUNACACQQhqIANBEGopAwAgCRC5HyAHIAIpAwggAigCEBCJBhogCygCACEKCyACQQhqIANBEGoiAykDACAKELkfIAYgAikDCCACKAIQQQEQswwgASADKQMAIAkQ1REMAQsgA0EgaiILKAIAIgkhCgJAIAEtAJABDQAgCSEKIAlFDQAgAkEIaiADQRBqKQMAIAkQuR8gByACKQMIIAIoAhAQiQYaIAsoAgAhCgsgAkEIaiADQRBqIgMpAwAgChC5HyAGIAIpAwggAigCEEEBELMMIAEgAykDACAJENURCyAFIAhByABqIghHDQALCyAAKAIcIgNFDQggAyABEPYYDAgLIABBCGogARDMBAwHCyAAQQRqIQMCQCAAKAIYDQAgAyABEP8IDAcLIAEtAJABIQggAUEBOgCQASADIAEQ/wggASAIOgCQAQwGCwJAAkACQAJAIAAoAggOAwABCQALIAFBLGoiAyAAQRBqELwSIAAtACRBAkcNASACQQhqIAMQgg0MAgsgAUEsaiAAQRBqIgMQmx8gASADENoFDAcLIAEgACkDECIMIAAoAiAiCBDVESACQQhqIAMQgg0gAS0AkAENACAIRQ0AIAJB4ABqIAwgCBC5HyABQYABaiACKQNgIAIoAmgQiQYaCyAAKAIoIAEQrwYgAyACQQhqEKYDDAULIAEgACgCBBCQIAwECyAAKAIQIgNFDQMgAyABEPYYDAMLIAAoAgQiAykDKCADQThqKAIAIAEQ6h4MAgsgASAAKAIEEJAgDAELIAApAxAgACgCICABEOoeCyACQfAAaiQAC7IHAQd/IwBBgAFrIgQkAAJAAkACQAJAAkACQAJAIAAtAABBAUcNACABIAIQvi0NARC+JiECDAYLIAAgASACEIATIgINBSAALQAAQQFGDQEgBEEwaiAAKAIEIgAoAgAoAgAQvy0gBEEwahDRJiICDQUCQAJAIAMtAABBAUcNACAAKAIAIQVBACECIARBADYCCCAEQoCAgIAQNwIAIANBAWohBgJAAkAgAy0AIEEBRg0AIARCmICAgMAENwJQIARCk4CAgPACNwJIIARCjoCAgKACNwJAIARCiYCAgNABNwI4IARCgICAgIABNwIwAkBBJEUNACAEQdwAakEAQST8CwALQQAhBwJAA0AgB0EFRg0BIAJBECACQRBLGyEIIARBMGogB0EDdGoiACgCBCEJIAAoAgAhAANAAkAgACAJSQ0AAkACQCAHQQRGDQAgCUEkTw0BIARB3ABqIAlqQS06AAALIAdBAWohBwwDCyAJQSRBhISeARCRFQALIAggAkYNCSAAQSRPDQogBEHcAGogAGoiASAGIAJqLQAAIgpBBHZBmIOeAWotAAA6AAACQCAAQSNGDQAgAUEBaiAKQQ9xQZiDngFqLQAAOgAAIAJBAWohAiAAQQJqIQAMAQsLC0EkQSRBtISeARCRFQALAkBBJEUNACAEQQxqIARB3ABqQST8CgAACyAEIARBDGogBEEMakEkahDXIAwBCyAEIAYoAAAiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AgwgBEEBNgJEIARBmI2CATYCQCAEQQE2AjQgBEGcv5wBNgIwIARBATYCPCAEQeQANgJgIAQgBEHcAGo2AjggBCAEQQxqNgJcIAQgBEEwahC4KQ0HCwJAIAMoABEiAEUNACAEQQE2AjQgBEGQsIMBNgIwIARCATcCPCAEQegBNgJgIAQgADYCDCAEIARB3ABqNgI4IAQgBEEMajYCXCAEIARBMGoQuCkNBwsgBEEwakEIaiAEQQhqKAIAIgA2AgAgBCAEKQIANwMwIARB3ABqIAUgBCgCNCAAEKsGIARB3ABqENEmIQIgBEEwahC5LQwBCyAAKAIAKAIAENojIQILIAINBSAEQQQ6ADAgBEEwahDRJiECDAULEJYDIQIMBAtBoKacAUEoQajPmwEQ0h4ACyAIQRBBlISeARCRFQALIABBJEGkhJ4BEJEVAAtBjKycAUE3IARBMGpBnLSbAUGQrZwBEOoSAAsgBEGAAWokACACC58HAQZ/IwBB0ABrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAKABSIFLQDiAg0AIAQgASACIAMQTyAEKAIAIgZBAkcNAQwMCyAFLQDjAiEHIAQgASACIAMQTyAEKAIAIgZBAkYNCyAGQQFxRQ0DIAQoAgghCCAEKAIEIQkgB0EBcUUNAiAEQThqIAMgCSAIIAggASACEL4GIAQoAjgiBkECRw0BIAQoAjwhAQwMCyAGQQFxRQ0CIAQoAgghCCAEKAIEIQkMAQsgBCgCQCEIIAQoAjwhCQsgBkEBcUUNACADKAIQIgYgCEYNAQJAAkACQCADKAIADQAgBSgCsAIgBSgCtAJGDQAgAygCDCEFIAMoAgghAyAEIAg2AiAgBCAGNgIcIAYgCEEBaksNBSAIIAVLDQUgAkHAAWohAiAEQQA6ABggBCAINgIUIAQgBjYCECAEIAU2AgwgBCADNgIIIARBATYCACABQZAFaiEDAkACQCABKAKQCiIBLQDiAg0AIARBOGogAyACIAQQbSAEKAI4IgFBAkcNAQwLCyABLQDjAiEFIARBOGogAyACIAQQbSAEKAI4IgFBAkYNCiABQQFxRQ0IIAQoAkAhBiAFQQFxRQ0DIARBJGogBCAEKAI8IAYgBiADIAIQ6QYgBCgCJCIBQQJHDQIgBCgCKCEBDAsLIAFBAXFFDQcgBCgCQCEGDAILIAYgCEsNBSAAIAk2AgwgACAINgIIIAAgBjYCBCAAQQE2AgAMDAsgBCgCLCEGCyABQQFxRQ0EIAYgCEsNBSAAIAk2AgwgACAINgIIIAAgBjYCBCAAQQE2AgAMCgsgAEEANgIADAkLIAAgCTYCDCAAIAg2AgggACAINgIEIABBATYCAAwICyAEQQI2AjwgBEHg6JsBNgI4IARCAjcCRCAEQQs2AjAgBEGSATYCKCAEIAU2AjQgBCAEQSRqNgJAIAQgBEE0ajYCLCAEIARBHGo2AiQgBEE4akHw6JsBEOkjAAsgBEEANgIQIARBATYCBCAEQfyUhAE2AgAgBEIENwIIIARB1KSDARDpIwALQcSVgwFBMEHkloMBELIXAAsgBEEANgJIIARBATYCPCAEQfyUhAE2AjggBEIENwJAIARBOGpB1KSDARDpIwALIAQoAjwhAQsgAEECNgIAIAAgATYCBAwCCyAEKAIEIQELIABBAjYCACAAIAE2AgQLIARB0ABqJAAL7QYCCn8DfiMAQcAAayIEJAAgBCADNgIMIAQgAjYCCCAAKAIMIQMgBCAEQQhqNgIQAkACQAJAAkACQAJAAkAgAyABaiICIANJDQAgAiAAKAIEIgMgA0EBakEDdkEHbCADQQhJGyIDQQF2TQ0DIANBAWoiAyACIAMgAksbIgNBD0kNASADQf////8BSw0AQX8gA0EDdEEHbkF/amd2QQFqIQMMAgsQ6CEAC0EEQQhBECADQQhJGyADQQRJGyEDCyAEQTBqIAMQlRIgBCgCNCEFIAQoAjAiBkUNAiAEKAI4IQcgBCgCPCEDAkAgBUEJaiICRQ0AIAZB/wEgAvwLAAsgBCADNgIsIAQgBzYCKCAEIAU2AiQgBCAGNgIgIARBCDYCHEEAIQhBACEDAkAgACgCDCIJRQ0AIAZBCGohCiAAKAIAIgspAwBCf4VCgIGChIiQoMCAf4MhDkEAIQEDQAJAIA5CAFINAANAIAFBCGohASALQQhqIgspAwBCgIGChIiQoMCAf4MiD0KAgYKEiJCgwIB/UQ0ACyAPQoCBgoSIkKDAgH+FIQ4LIAAoAgAgDnqnQQN2IAFqQQJ0IgxrQXxqKAIAIgMgBCgCDCICTw0FAkAgBiAFIAQoAgggA0EYbGooAhAiDXEiAmopAABCgIGChIiQoMCAf4MiD0IAUg0AQQghAwNAIAIgA2ohAiADQQhqIQMgBiACIAVxIgJqKQAAQoCBgoSIkKDAgH+DIg9QDQALCyAOQn98IRACQCAGIA96p0EDdiACaiAFcSIDaiwAAEEASA0AIAYpAwBCgIGChIiQoMCAf4N6p0EDdiEDCyAQIA6DIQ4gBiADaiANQRl2IgI6AAAgCiADQXhqIAVxaiACOgAAIAYgA0ECdGtBfGogACgCACAMa0F8aigAADYAACAJQX9qIgkNAAsgACgCDCEDCyAEIAM2AiwgBCAHIANrNgIoAkADQCAIQRBGDQEgACAIaiIDKAIAIQIgAyAEQRRqIAhqQQxqIgEoAgA2AgAgASACNgIAIAhBBGohCAwACwsgBCgCJCIDRQ0BIAQoAiAgA0ECdEELakF4cSICayADIAJqQQlqQQgQsxYMAQsgACAEQRBqQZYHEOgEC0GBgICAeCEFCyAEQcAAaiQAIAUPCyADIAJBpJKbARCRFQALlgcCBH8BfiAAKAIMIgEgACgCBCICa0HYAG4hAwJAIAEgAkYNAANAAkACQAJAAkACQAJAAkACQAJAIAIoAgAiAUF8akEAIAFBe2pBCEkbDggBAgMEBQYIBwALAkACQCACQQhqIgEoAgBBBUcNACACQRBqKQMAIgVCA4NCAFINASAFpyIBIAEoAgAiBEF/ajYCACAEQQFHDQEgASABKAIQEMYkDAELIAEQtA4LAkAgAkE8aigCACIBRQ0AIAEQrwEgAUHAAEEIELMWCwJAIAJBwABqKAIAIgFFDQAgASgCACIEENEDIARB4ABBCBCzFiABQQxBBBCzFgsgAkE0aiIBKAIAIAJBOGooAgAQ7yIgAkEwaigCACABKAIAEJwtDAcLIAIQtA4gAkHEAGoiASgCACACQcgAaigCABCZJSACQcAAaigCACABKAIAEJ0tIAJBIGoiASgCAEGAgICAeEYNBiACQSRqIgQoAgAgAkEoaigCABCeJSABKAIAIAQoAgAQni0MBgsgAkEIahC0DiACQTBqKAIAENYNDAULAkAgAkEIaikDACIFQgODQgBSDQAgBaciASABKAIAIgRBf2o2AgAgBEEBRw0AIAEgASgCEBDGJAsgAkEgaigCABDWDQwECyACQQhqELQOAkAgAkE8aigCACIBRQ0AIAEQrwEgAUHAAEEIELMWCwJAIAJBwABqKAIAIgFFDQAgASgCACIEENEDIARB4ABBCBCzFiABQQxBBBCzFgsgAkE0aiIBKAIAIAJBOGooAgAQ7yIgAkEwaigCACABKAIAEJwtDAMLAkAgAkEIaikDACIFQgODQgBSDQAgBaciASABKAIAIgRBf2o2AgAgBEEBRw0AIAEgASgCEBDGJAsCQCACQSRqKAIAIgFFDQAgARCvASABQcAAQQgQsxYLAkAgAkEoaigCACIBRQ0AIAEoAgAiBBDRAyAEQeAAQQgQsxYgAUEMQQQQsxYLIAJBMGoiASgCACACQTRqKAIAEO8iIAJBLGooAgAgASgCABCcLQwCCyACQQRqIgEQsAkgASgCACACQQhqKAIAEKEtIAJBEGooAgAiAUUNASABKAIAIgQQ0QMgBEHgAEEIELMWIAFBDEEEELMWDAELIAJBCGoiASgCACACQQxqKAIAEJ4lIAJBBGooAgAgASgCABCeLQsgAkHYAGohAiADQX9qIgMNAAsLIAAoAgggACgCABCiLQvBBwEBfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEF0aiIBQQcgAUEmSRtBf2oOJAABAgMEBQYHCAkKCwwNDg8QERITIhQVFhciGBkaGxwdHh8gISILIABBBGoQzigPCyAAQQRqEPwqDwsgACkDCCAALQAcEO0oIAAoAiAiAEEEaiIBKAIAIABBCGooAgAQmyUgACgCACABKAIAEJ0tIABBDGoQlCgCQCAAKAIYQYCAgIB4Rg0AIABBGGoQlSgLIAAoAjwQ5yQgAEHAAGoQuysgAEHIAEEEELMWDwsgAEEEahCxLA8LIABBDGoQsSwPCyAAQQRqELEsIABBCGoQsSwPCyAAEIgPIABBOGoQsSwPCyAAQQhqELIsDwsgAEEIahCSJw8LIABBBGoQsSwgAEEIahCxLCAAQQxqELEsDwsgAEEEahCCKQ8LIABBBGoQgykPCyAAQQRqEJgoDwsgACkDCBDGIQ8LAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAKQMQEMYhIAApAxgQxiEPCyAAKQMQIAApAyAQpi4PCyAAKQMgEPsqDwsgACkDGCAAKAIgEMgmDwsgACkDEBDGISAAKQMYEMYhDwsgAEEEahCHLA8LIABBBGoQsSwgACgCGBCELCAAKAIIIgAQhywgAEEgQQQQsxYPCyAAQQRqELYoIABBEGoQ4yMgACgCIBDnJCAAQSRqELsrDwsgACkDCCAALQAcEO0oIAAoAiAiABCUKCAAQRBqIgEoAgAgAEEUaigCABCaJSAAKAIMIAEoAgAQoi0gAEEwahC8KyAAKAI0EOckIAAoAjgQhCwgAEEcaiIBKAIAIABBIGooAgAQgBAgACgCGCABKAIAEJstIABBwABBBBCzFg8LIABBDGoQvCsPCyAAQQRqELEsDwsgAEEEahCxLA8LIABBCGoQ+yIPCyAAKQMIIAApAxgQrS4PCyAAKAIEIgBBwABqELUeIABBgAFqIgEoAgAgAEGEAWooAgAQtBsgACgCfCABKAIAEKItIAAoAngQhCwgAEGQAWoQiSsCQCAALQA8QQZGDQAgAEEQahC1HgsgAEGgAUEIELMWDwsgAEEEahCJKw8LIABBBGoQsywPCyAAQQRqELEsDwsgAEEEahCxLA8LIABBBGoQsywPCyAAQQRqENYtDwsgAEEEahCzLA8LIAApAwgQxiEPCyAAQQRqEOQjCwvZBwEFfyMAQeACayIDJAAgAiABKAIAIgQpAlA3AhggAkEgaiAEQdgAaigCADYCACADQSBqIARBEGpBoL2EARDsIyADKAIkIQUCQAJAAkACQCADKAIgIgYoAggiBw0AIANBgYCAgHg2ApABDAELIAYgB0F/aiIHNgIIIAYoAgQgB0HwAGxqIQcCQEHwAEUNACADQZABaiAHQfAA/AoAAAsCQAJAIAMoApABQYCAgIB4ag4CAAIBCyADQfgAaiAHQRRqKQIANwMAIANB6ABqQQhqIAdBDGopAgA3AwAgA0GIAWogBEHQAGoiBEEIaigCADYCACADIAcpAgQ3A2ggAyAEKQIANwOAAQJAQSRFDQAgA0GAAmogAkEk/AoAAAsgA0EYaiADQYACahCgESADQegAaiADKAIYIAMoAhxBsL2EARCGHyADQRBqIANB6ABqENMkIANCooCAgKABNwIoIAMgAygCFDYCMCADKAKQAUGCgICAeEgNAiADQZABahDnKgwCCwJAQcgARQ0AIANBgAJqIAdBJGpByAD8CgAACyADQdgCaiIGIAdB5ABqKQIANwMAIANB0AJqIgQgB0HcAGopAgA3AwAgAyAHKQJUNwPIAiAAQRxqIAEoAgQgASgCCBCKFCAAQRU2AgAgACADKQPIAjcCKCAAQTBqIAQpAwA3AgAgAEE4aiAGKQMANwIAIANBgAJqEOAeIANBkAFqEOcqIAUgBSgCAEEBajYCACACEOcqDAILAkBBJEUNACADQYACaiACQST8CgAACyADQQhqIANBgAJqEKARIANBIjYCKCADIAMpAwg3AiwLAkACQAJAIAYoAggiAg0AIANBgYCAgHg2ApABDAELIAYgAkF/aiICNgIIIAYoAgQgAkHwAGxqIQYCQEHwAEUNACADQZABaiAGQfAA/AoAAAsCQAJAIAMoApABQYCAgIB4ag4CAAIBC0GgppwBQShBwL2EARDSHgALAkBByABFDQAgA0GAAmogBkEkakHIAPwKAAALIANB2AJqIgIgBkHkAGopAgA3AwAgA0HQAmoiBCAGQdwAaikCADcDACADIAYpAlQ3A8gCIABBHGogASgCBCABKAIIEIoUIABBFTYCACAAIAMpA8gCNwIoIABBMGogBCkDADcCACAAQThqIAIpAwA3AgAgA0GAAmoQ4B4gA0EsahDmCwwBC0HAAEUNACAAIANBKGpBwAD8CgAACyAFIAUoAgBBAWo2AgACQAJAIAMoApABQYCAgIB4ag4CAAIBCyADQZABahDKJAwBCyADQZABahDnKgsgA0HgAmokAAvpBgIKfwF+IwBBMGsiAiQAAkACQAJAAkACQCAALQA8DQAgAC0AKEEBRw0BCyACQQA7AC0gAkEIakEIakEAKQOAhZ4BIgw3AwAgAkEgaiAMNwMAIAJBACkD+ISeASIMNwMIIAIgADYCKCACIAAtADg6ACwgAiAMNwMYIAJBCGpBEGohAyABKAIIIgRFDQEgASgCBCIFIARBOGxqIQYgBSEHA0ACQAJAIAcoAgAiAUEJRw0AIAdBCGogAkEIahDeBAwBCwJAAkACQAJAAkAgAQ4JAAECAwUEBQUFAAsCQCAHKAIMIgFFDQAgAUHIAGwhCCAHKAIIQRBqIQEgAigCKCIJQRBqIQoDQAJAAkACQAJAAkAgAUFwaikDAEJ9fCIMp0EBakEAIAxCAlQbDgMAAQIACyAJIAFBEGoiC0EAEIEQIAktADRBAUcNAyALKQMAIgxCA4NCAFINAiAMpyILIAsoAgAiC0EBajYCACALQX9KDQIMDwsgCSABQQAQgRAgCS0ANEEBRw0CIAEpAwAiDEIDg0IAUg0BIAynIgsgCygCACILQQFqNgIAIAtBf0wNDgwBCyAJIAFBABCBECAJLQA0QQFHDQEgASkDACIMQgODQgBSDQAgDKciCyALKAIAIgtBAWo2AgAgC0F/TA0NCyAKIAwQwgYLIAFByABqIQEgCEG4f2oiCA0ACwsgBygCHCIBRQ0EIAFBBGooAgAgAUEIaigCACACQQhqEPoXDAQLIAdBCGogAkEIahCyAwwDCyAHKAIcIgFFDQIgAUEEaigCACABQQhqKAIAIAJBCGoQ+hcMAgsCQAJAIAcoAggOAwABAwALAkAgBy0AJEECRg0AIAIoAiggB0EQakEAEIEQCyAHKAIoIAJBCGoQ4BYMAgsgBy0AJEECRg0BIAIoAiggB0EQakECEIEQDAELIAcoAhAiAUUNACABQQRqKAIAIAFBCGooAgAgAkEIahD6FwsgB0E4aiIHIAZHDQALIAJBCGoQzAogAxDMCiAEQThsIQEDQCAFIAAQ4gIgBUE4aiEFIAFBSGoiAQ0ADAMLCyABKAIIIgdFDQEgASgCBCEBIAdBOGwhBwNAIAEgABDiAiABQThqIQEgB0FIaiIHDQAMAgsLIAJBCGoQzAogAxDMCgsgAkEwaiQADwsAC+YGAgt/A34jAEHAAGsiAyQAIAMgAjYCDCADIAE2AgggACgCDCECIAMgA0EIajYCEAJAAkACQAJAAkACQAJAIAJBf0YNACACIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIgFBAXZJDQMgASACIAEgAksbIgJBDkkNASACQf7///8BSw0AQX8gAkEDdEEIakEHbkF/amd2QQFqIQIMAgsQ6CEAC0EEQQhBECACQQdJGyACQQNJGyECCyADQTBqIAIQlRIgAygCNCEEIAMoAjAiBUUNAiADKAI4IQYgAygCPCECAkAgBEEJaiIBRQ0AIAVB/wEgAfwLAAsgAyACNgIsIAMgBjYCKCADIAQ2AiQgAyAFNgIgIANBCDYCHEEAIQdBACECAkAgACgCDCIIRQ0AIAVBCGohCSAAKAIAIgopAwBCf4VCgIGChIiQoMCAf4MhDkEAIQsDQAJAIA5CAFINAANAIAtBCGohCyAKQQhqIgopAwBCgIGChIiQoMCAf4MiD0KAgYKEiJCgwIB/UQ0ACyAPQoCBgoSIkKDAgH+FIQ4LIAAoAgAgDnqnQQN2IAtqQQJ0IgxrQXxqKAIAIgIgAygCDCIBTw0FAkAgBSAEIAMoAgggAkEUbGooAhAiDXEiAWopAABCgIGChIiQoMCAf4MiD0IAUg0AQQghAgNAIAEgAmohASACQQhqIQIgBSABIARxIgFqKQAAQoCBgoSIkKDAgH+DIg9QDQALCyAOQn98IRACQCAFIA96p0EDdiABaiAEcSICaiwAAEEASA0AIAUpAwBCgIGChIiQoMCAf4N6p0EDdiECCyAQIA6DIQ4gBSACaiANQRl2IgE6AAAgCSACQXhqIARxaiABOgAAIAUgAkECdGtBfGogACgCACAMa0F8aigAADYAACAIQX9qIggNAAsgACgCDCECCyADIAI2AiwgAyAGIAJrNgIoAkADQCAHQRBGDQEgACAHaiICKAIAIQEgAiADQRRqIAdqQQxqIgsoAgA2AgAgCyABNgIAIAdBBGohBwwACwsgAygCJCICRQ0BIAMoAiAgAkECdEELakF4cSIBayACIAFqQQlqQQgQsxYMAQsgACADQRBqQdgFEOgEC0GBgICAeCEECyADQcAAaiQAIAQPCyACIAFBpJKbARCRFQALiAcCAn8DfiMAQaABayIGJAAgBiADNgIEIAYgAjYCACAGQegAakEIaiAEQQhqKAIANgIAIAYgBCkCADcDaCABKAKIASEEIAYgBkEEajYCeCAGIAY2AnQCQAJAIARBgIAIcQ0AIAEgBEGAgAhyNgKIASAGQQhqIAZB6ABqIAEQrSogASABKAKIAUH//3dxNgKIAQwBCyAGQQhqIAZB6ABqIAEQrSoLIAYoAgghBAJAAkAgBi0AHCIDQQNHDQAgAEEINgIAIAAgBDYCBAwBCyAGQTBqQQxqIAZBCGpBDGopAgA3AgAgBkEwakEXaiAGQQhqQRdqLQAAOgAAIAYgBikCDDcCNCAGIAYvAB07AEUgBiADOgBEIAYgBDYCMCAGKAIgIQcCQAJAIAUNACAHKAIUQdgAbCEDIAcoAhAhBANAIANFDQICQAJAAkACQCAEKAIAIgJBfGpBACACQXtqQQhJG0F/ag4DAAMBAwsgBEE1ai0AAA0BDAILIARBxQBqLQAAQQFHDQELIARBLGooAgAhAiAEQShqKAIAIQUgBkGggYCAeDYCCCABIAUgAiAGQQhqEN4jCyAEQdgAaiEEIANBqH9qIQMMAAsLIAdBAToAPAsgBiAHNgJMIAZBwoCAgHg2AogBIAZB6ABqIAZBMGogBkGIAWoQuBIgBkHQAGpBCGoiBCAGQegAakEQaiICKQMANwMAIAZB0ABqQRBqIgMgBkHoAGpBGGoiBSkDADcDACAGIAYpA3A3A1ACQAJAAkAgBigCaEUNACAGQQhqQRhqIAMpAwA3AwAgBkEIakEQaiAEKQMANwMAIAYgBikDUDcDECAGQcwAahC6FSAGQQg2AgggASgC2AEgASgC3AEgBkEIakEIahDgGiEEIAEtAOABQaIBRg0BDAILIAZBiAFqQRBqIAMpAwAiCDcDACAGQYgBakEIaiAEKQMAIgk3AwAgBiAGKQNQIgo3A4gBIAZB6ABqQQxqIAk3AgAgBkHoAGpBFGogCDcCACAGIAo3AmwgBkEIakEMaiAGQegAakEIaikCADcCACAGQQhqQRRqIAIpAgA3AgAgBkEkaiAFKAIANgIAIAYgBikCaDcCDCAGQQA6ACwgBiAHNgIoIAZBADYCCEEoRQ0CIAAgBkEIakEo/AoAAAwCCyABIAEQmiwQpxcLIABBCDYCACAAIAQ2AgQLIAZBoAFqJAALpAcBA38CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMAEREBAgMEBQYHEhAODQwLCgkIAAsgACgCDCICRQ0QIAAoAgghACACQTBsIQIDQCAAIAEQjQQgAEEwaiEAIAJBUGoiAg0ADBELCyAAKAIEIAEQvgMgACgCCCEADA0LIAAoAgwiAEUNDiAAIAEQvgMPCyAAQQA2AiAgACgCKCEADAsLIAAtACRBAkYNDCAAQQA2AiAPCyAALQAkQQJGDQsgAEEANgIgDwsgACgCBCABEL4DIAAoAgggARCNBCAAKAIUIgANCAwKCyAAKAIQIAEQvgMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEL4DCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEI0EIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQvgMMCAsgAEEIaiABELgGDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOUaDAILIAIgARDnGgwBCyACIAEQ7A0LIAAoAgwgARC+AyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOUaDAILIAIgARDnGgwBCyACIAEQ7A0LIAAoAgwgARC+AyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARC+AwwBCyADIAEQ5RoLAkAgACgCGCICRQ0AIAIgARC+AwsCQCAAKAIcIgJFDQAgAiABEL4DCyAAKAIMIQAMAgsgACgCBCABEL4DIAAoAgghAAwBCyAAKAIEIAEQvgMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCNBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDsDQsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQjQQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEI0EIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEL4DC8kGAQt/IwBBIGsiAiQAQQEhAyABIAEoAmgiBEEBaiIFNgJoIAEoAmwhBiABKAJ4IQcCQCAELAAAIghBf0oNACABIARBAmoiBTYCaCAELQABQT9xIQkgCEEfcSEKAkACQCAIQWBPDQAgCkEGdCAJciEEDAELIAEgBEEDaiIFNgJoIAlBBnQgBC0AAkE/cXIhCQJAIAhBcE8NACAJIApBDHRyIQQMAQsgASAEQQRqIgU2AmggCUEGdCAELQADQT9xciAKQRJ0QYCA8ABxciEECyAEQYABSQ0AQQIhAyAEQYAQSQ0AQQNBBCAEQYCABEkbIQMLIAEgAyAHaiIINgJ4QQ4hBAJAAkAgBSAGRg0AAkACQAJAAkAgBSwAACIDQX9KDQAgA0EfcSILQQZ0IAUtAAFBP3EiDHIhCgJAIANBYEkNACAMQQZ0IAUtAAJBP3FyIQkCQAJAIANBcE8NACAJIAtBDHRyIQkMAQsgCUEGdCAFLQADQT9xciALQRJ0QYCA8ABxciEJCyAJQS1HDQUgASAFQQJqIgk2AmggA0FgSQ0DIAEgBUEDaiIJNgJoIAxBBnQgBS0AAkE/cXIhBCADQXBPDQIgBCALQQx0ciEKDAMLIApBLUcNBCABIAVBAmoiCTYCaEEBIQQMAwsCQAJAIANB/wFxQVNqDhEABQUFBQUFBQUFBQUFBQUFAQULQQEhBCABIAVBAWoiCTYCaAwDCyABIAhBAWo2AnggASAFQQFqNgJoQSAhBAwDCyABIAVBBGoiCTYCaCAEQQZ0IAUtAANBP3FyIAtBEnRBgIDwAHFyIQoLAkAgCkGAAU8NAEEBIQQMAQsCQCAKQYAQTw0AQQIhBAwBC0EDQQQgCkGAgARJGyEECyABIAQgCGoiBTYCeEEeIQQgAS0AKEUNACAGIAlGDQAgCS0AAEE+Rw0AIAEgBUEBajYCeCABIAlBAWo2AmggAkGmgICAeDYCCCABIAcgAkEIahDUESABQQAQsAIgARCJASABQQA6AJMBAkAgASgCbCABKAJoIgVHDQAgAEGAxgI7AQAMAgsgACABIAUtAABBAnRB3KKaAWooAgARBgAMAQsgAEEAOgAAIAAgBDoAAQsgAkEgaiQAC+gGAgR/AX4jAEEgayIDJAAgASgCCCEEIANBCGogAiABKAIEIgVBABCLAgJAAkAgAy0ACEEERg0AIAMpAwgiB0L/AYNCBFENACAAIAc3AgAMAQsCQAJAAkACQAJAIAEoAgAiBigCAEEDRw0AIANBCGogBkEQaiACEM4tIAMtAAhBBEYNASADKQMIIgdC/wGDQgRRDQEgACAHNwIADAULAkACQCAGKAIgIgQoAgBBGEcNACADQQhqIAIgBEEEakEAEN0EIAMtAAhBBEYNASADKQMIIgdC/wGDQgRRDQEgACAHNwIADAYLIANBCGogBkEgaiACEM4tIAMtAAhBBEYNACADKQMIIgdC/wGDQgRSDQILAkACQAJAAkACQAJAIAEtAAwNACAGKAIAQQJGDQUgA0EANgIIIAMgAiADQQhqQciBnAFBARC5DSADLQAAQQRGDQEgAykDACIHQv8Bg0IEUQ0BIAAgBzcCAAwKCyADQQA2AgggAyACIANBCGpByeubAUECELkNIAMtAABBBEYNACADKQMAIgdC/wGDQgRSDQELIAYoAgAOAwECAwELIAAgBzcCAAwHCyADQQhqIAZBCGogAhDDGCADLQAIQQRGDQUgAykDCCIHQv8Bg0IEUQ0FIAAgBzcCAAwGCyADQQhqIAZBCGogAhCBCSADLQAIQQRGDQQgAykDCCIHQv8Bg0IEUQ0EIAAgBzcCAAwFCyADQQhqIAZBBGogAhCJCSADLQAIQQRGDQMgAykDCCIHQv8Bg0IEUQ0DIAAgBzcCAAwECyABLQAMRQ0BIANBADYCCCADIAIgA0EIakHJ65sBQQIQuQ0gAy0AAEEERg0BIAMpAwAiB0L/AYNCBFENASAAIAc3AgAMAwsgACAHNwIADAILIANBADYCFCADQQhqIAIgA0EUakHdq5wBQQEQuQ0CQCADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwCCyADQQhqIAIgBSAEIAYoAgggBigCDBChKgJAIAMtAAhBBEYNACADKQMIIgdC/wGDQgRRDQAgACAHNwIADAILIANBCGogAiADQRRqQdyEngFBARC5DSADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwBCyAAQQQ6AAALIANBIGokAAuOBgEOfyMAQZAJayICJAACQCABQQJJDQBBASEDIAAgAUEBdiIEQRhsIgVqIQYgAiAFaiEHAkACQCABQQhJDQAgACACEPAHIAYgBxDwB0EEIQMMAQsgAkEQaiAAQRBqKQIANwMAIAJBCGogAEEIaikCADcDACACIAApAgA3AwAgByAGKQIANwIAIAdBCGogBkEIaikCADcCACAHQRBqIAZBEGopAgA3AgALQQAhCCACQQA2AogJQQAgA2shCSAAIANBGGwiBmohCiACIAQ2AowJIAEgBGshCyACIAZqIQwgAkGACWpBCGohDQNAAkACQCAIQQJGDQAgCSALIAQgDSAIQQJ0aigCACIGGyIFIAMgBSADSxtqIQ4gDCAGQRhsIg9qIQYgCiAPaiEFIAIgD2ohDwNAIA5FDQIgBiAFKQIANwIAIAZBEGogBUEQaikCADcCACAGQQhqIAVBCGopAgA3AgAgDyAGEKULIA5Bf2ohDiAGQRhqIQYgBUEYaiEFDAALCyAHQWhqIQ4gACABQRhsQWhqIgVqIQYgAiAFaiEPIAIhBQJAA0ACQCAEDQAgDkEYaiEGAkAgAUEBcUUNACAAIAUgByAFIAZJIgQbIg4pAgA3AgAgAEEQaiAOQRBqKQIANwIAIABBCGogDkEIaikCADcCACAHIAUgBk9BGGxqIQcgBSAEQRhsaiEFCyAFIAZHDQIgByAPQRhqRw0CDAULIAAgByAFIAdBDGooAgAiAyAFQQxqKAIAIglJIgobIggpAgA3AgAgAEEIaiAIQQhqKQIANwIAIABBEGogCEEQaikCADcCACAGQRBqIA4gDyAPQQxqKAIAIgsgDkEMaigCACIMSSINGyIIQRBqKQIANwIAIAZBCGogCEEIaikCADcCACAGIAgpAgA3AgAgDkFoQQAgDRtqIQ4gD0FoQQAgCyAMTxtqIQ8gBSADIAlPQRhsaiEFIAcgCkEYbGohByAEQX9qIQQgBkFoaiEGIABBGGohAAwACwsQ4SEACyAIQQFqIQgMAAsLIAJBkAlqJAAL7gYCCX8BfiMAQfAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4DAAECAAsgAUEIaiAAEKgoIAAgASgCKBDCJwwCCyAALQCcASEDIABBADoAnAECQCABKAIwIgRFDQAgACAEEKcBCyAAIAM6AJwBIAAoAgANAgwDCyAAIAEoAgQQwicLIAAoAgBFDQEgA0EBRw0BCyAAIAFBEGoiAxCqBSIERQ0AIAEoAjAhBSABQQA2AjACQAJAIAUNACAEIQAMAQsQ+ichACACQTBqIAQQQiAAQThqIAJBMGpBOGopAwA3AwAgAEEwaiACQTBqQTBqKQMANwMAIABBKGogAkEwakEoaiIGKQMANwMAIABBIGogAkEwakEgaiIHKQMANwMAIABBGGogAkEwakEYaiIIKQMANwMAIABBEGogAkEwakEQaiIJKQMANwMAIABBCGogAkEwakEIaiIKKQMANwMAIAAgAikDMDcDACACIAAQoREgAigCAEEMRg0CIAYgAkEoaikDADcDACAHIAJBIGopAwA3AwAgCCACQRhqKQMANwMAIAkgAkEQaikDADcDACAKIAJBCGopAwA3AwAgAiACKQMANwMwQQAtAKDxngEaQcAAEH0iAEUNAyAAIAIpAzA3AwAgAEEAOgA8IAAgBTYCOCAAQgA3AzAgAEEoaiACQTBqQShqKQMANwMAIABBIGogAkEwakEgaikDADcDACAAQRhqIAJBMGpBGGopAwA3AwAgAEEQaiACQTBqQRBqKQMANwMAIABBCGogAkEwakEIaikDADcDACAEEM4BIARBwABBCBCzFgsgAkEwakEYaiADQRhqKQMANwMAIAJBMGpBEGogA0EQaikDADcDACACQTBqQQhqIANBCGopAwA3AwAgAUIANwMYIAMpAwAhCyABQgE3AxAgAUEdakIANwAAIAFBADYCKCACIAs3AzAgAiACQTBqELYZQQAtAKDxngEaIAIpAwAhCyACKAIMIQQgAigCCCEFQSgQfSIDRQ0CIAMgADYCBCADQQY2AgBCAUEAELQYIAEgAzYC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EOARIAAgASAEKAIAIAQoAgQQ4yUNAwsgEw0BDAALCwsgBEGAAWokACAKIAdHC/MGAQ5/IwBBkAFrIgMkACABKALYASEEIANBADYCJCADQoCAgIDAADcCHCADQdAAaiABIAIQqA8gAygCUCEFAkACQAJAAkAgAy0AaCIGQQJGDQAgA0EwakEQaiIHIANB0ABqQRRqKAIANgIAIANBMGpBCGoiCCADQdAAakEMaikCADcDACADIAMpAlQ3AzAgAyADKABpNgIoIAMgA0HQAGpBHGooAAA2ACtBCEEgEKAsIglFDQMgCSAFNgIAIAkgAykDMDcCBCAJIAY6ABggCSADKAIoNgAZIAlBHGogAygAKzYAACAJQQxqIAgpAwA3AgAgCUEUaiAHKAIANgIAIAMgCTYCSCADQQE2AkQgA0HQAGpBBHIhCkEAIQggA0HpAGoiC0EDaiEMQQQhDUEAIQdBASEJA0AgAyAJNgJMIAZBAXENAgJAAkAgASgCiAEiCUHAAHENACABIAlBwAByNgKIASADIAEQ/wkgAygCACEJIAEgASgCiAFBv39xNgKIASADKAIEIQUMAQsgA0EIaiABEP8JIAMoAgwhBSADKAIIIQkLAkAgCUEBcQ0AAkAgByADKAIcRw0AIANBHGpBuOKbARD1HSADKAIgIQ0LIA0gCGogBTYCACADIAdBAWoiBzYCJCADQdAAaiABIAIQtgYgAygCUCEFIAMtAGgiBkECRg0AIANB+ABqQRBqIg4gCkEQaigCADYCACADQfgAakEIaiIPIApBCGopAgA3AwAgAyAKKQIANwN4IAMgCygAADYCcCADIAwoAAA2AHMCQCADKAJMIhAgAygCREcNACADQcQAakHI4psBEOkdCyADKAJIIBBBBXRqIgkgBTYCACAJIAMpA3g3AgQgCSAGOgAYIAkgAygCcDYAGSAJQQxqIA8pAwA3AgAgCUEUaiAOKAIANgIAIAlBHGogAygAczYAACAIQQRqIQggEEEBaiEJDAELCyADQcQAahCNKAsgA0EcahCYKEGAgICAeCEJDAELIANBEGpBCGoiBiADQcQAakEIaigCADYCACADIAMpAkQ3AxAgAygCICEFIAMoAhwiCUGAgICAeEYNACAAIAMpAxA3AgwgAEEUaiAGKAIANgIAIAAgBDYCGCAAIAc2AgggACABKALU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IQQgAi0APiEFIAIoAjAhBiADQTBqIAJBLGooAgA2AgAgAyACKQIkNwMoIAItAD8hByACLQBAIQggAi0APSEJIAMgAi0AQToAJiADIAItAEI6ACcgASgCiAEhCiADIANBJ2o2AjwgAyADQSZqNgI4IAMgA0EgajYCNAJAAkAgCkGAgIAQcQ0AIAEgCkGAgIAQcjYCiAEgA0EQaiADQShqIAEQlQ4gAygCECELIAEgASgCiAFB////b3E2AogBIAMoAhQhCgwBCyADQRhqIANBKGogARCVDiADKAIcIQogAygCGCELCwJAAkAgC0EBcUUNACAAQQ02AgAgACAKNgIEIAIQjycMAQsCQAJAAkACQCAJDgMDAAEDCyABLQCRAUEgcUUNAiABLQCSAUH/AXENAgwBCyABLQCRAUEgcUUNASABLQCSAUH/AXENAQsgA0EIaiACENYhIAMoAgwhCyADKAIIIQwgA0GAgYCAeDYCKCABIAwgCyADQShqEN4jCwJAAkACQCACKAIAQQVGDQAgASgC1AEhCyADKAIgIQwgBUEBcQ0BDAILIAJBCGohCyABKALUASENIAIoAhQhAiADKAIgIQwCQCAEQf8BcUEDRg0AIANBtYGAgHg2AiggASAMIAIgDCACSRsgDCACIAwgAksbIANBKGoQ3iMLIANBKGpBDGogC0EIaigCADYCACAAQQY2AgAgACAIOgApIAAgBzoAKCAAIAU6ACcgACAJOgAlIAAgBDoAJCAAIAo2AiAgACANNgIcIAAgDDYCGCAAIAI2AhQgACAGQQBHOgAmIAMgCykCADcCLCAAIAMpAig3AgQgAEEMaiADQShqQQhqKQIANwIADAILIAooAhhBgICAgHhGDQAgA0GhgYCAeDYCKCABIAwgCyADQShqEN4jCyAAQQU2AgAgA0HEAGogAkEYaikCADcCACADQTxqIAJBEGopAgA3AgAgA0E0aiACQQhqKQIANwIAIAMgAikCADcCLAJAQSRFDQAgAEEEaiADQShqQST8CgAACyAAIAQ6ADkgACAJOgA4IAAgCDoANyAAIAc6ADYgACAFOgA1IAAgBkEARzoANCAAIAo2AjAgACALNgIsIAAgDDYCKAsgA0HQAGokAAuJBwIIfwF+IwBBwAFrIgMkACADQZABakEIaiEEIANB4ABqQQhqIQUgACgCACEGAkACQANAAkACQAJAAkACQCACLQDgASIHQdQARg0AIAdBzgBHDQELIANBADYCJCADQoCAgICAATcCHCACKALYASEIIAIQoQsgB0HOAEYNASAGQQFxRQ0CIAIoAtwBIQcgAigC2AEhCSAAKQIEIQsgA0G5gICAeDYCYCADIAs3AmQgCSAHIANB4ABqEOAaIQogAi0A4AFBogFHDQUgAiACEJosEKcXDAULQQAhCgwFCwJAAkAgAigCiAEiB0HAAHENACACIAdBwAByNgKIASADQQhqIAIQ/wkgAygCCCEHIAIgAigCiAFBv39xNgKIASADKAIMIQoMAQsgA0EQaiACEP8JIAMoAhQhCiADKAIQIQcLIAdBAXFFDQEMAwsgACAINgIEQQEhBiAAQQE2AgAgACACKALUATYCCEEAIQoLIAMgCjYCKAJAAkAgAi0A4AFBCUYNACACKALcASEHIAIoAtgBIQkgA0EsaiACENQmIANBATYCZCADQZy/nAE2AmAgA0IBNwJsIANBswc2AlQgA0EJOgBfIAMgA0HQAGo2AmggAyADQdgAajYCUCADIANB3wBqNgJYIANBOGogA0HgAGoQ/RogA0HMAGogA0E0aigCADYCACADIAMpAiw3AkQgCSAHIANBOGoQ4BohCiACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwNAAkACQCACLQDgASIHQQNGDQAgB0HUAEYNACAHQc4ARw0BCyACKALUASEJAkAgASgCCCIHIAEoAgBHDQAgARDnHQsgASAHQQFqNgIIIAEoAgQgB0EYbGoiByADKQIcNwIAIAcgCjYCFCAHIAk2AhAgByAINgIMIAdBCGogA0EcakEIaigCADYCAAwDCwJAAkAgAigCiAEiB0GAgICAAnFFDQAgAiAHQf////99cTYCiAEgA0HgAGogAhC2LyACIAIoAogBQYCAgIACcjYCiAEMAQsgA0HgAGogAhC2LwsgAygCZCEHAkAgAygCYCIJQRNHDQAgByEKDAILAkBBKEUNACAEIAVBKPwKAAALIAMgBzYClAEgAyAJNgKQASADQRxqIANBkAFqQeienAEQ+B4MAAsLCyADQShqEMcrCyADQRxqEMkoCyADQcABaiQAIAoL3gYBCH8jAEGAAWsiAiQAAkACQCABKAIIDQAgASgCBCIDQQAQ8CIgASgCACADEJ8tDAELAkACQAJAAkACQCAAKAIgQYCAgIB4Rg0AIAJBCGpBCGogAUEIaigCADYCACACQQA7ARQgAiABKQIANwMIQQBBBBCfLQJAIAAoAigiA0UNACAAKAIkIQEgA0EwbCEDA0AgASACQQhqEJoEIAFBMGohASADQVBqIgMNAAsgAi0AFUEBcQ0ECyACKAIQIQMgAkEANgIQIAIoAgghBCACKAIMIQEgAkKAgICAwAA3AwggAkEcaiAAQSBqQQBBABDYEyACIAEgA0ECdGo2AjwgAiAENgI4IAIgATYCNCACIAE2AjACQCACKAIcIgEgAigCICIERg0AIAJBwABqQQRyIgBBKGohBSAAQSBqIQYgAEEYaiEHIABBEGohCCAAQQhqIQkDQCABKAIAIgNBE0YNASAFIAFBLGooAgA2AgAgBiABQSRqKQIANwIAIAcgAUEcaikCADcCACAIIAFBFGopAgA3AgAgCSABQQxqKQIANwIAIAAgAUEEaikCADcCACACIAM2AkAgAkHAAGoQhQIgAUEwaiIBIARHDQALCyACQRxqQRRqIQEgAkKIgICAgAE3AhwgAigCJCEDAkAgAigCLA0AIAMgAUGYsJsBEIgDDAMLIAMgAigCKCABEIwDRQ0CAkAgAigCPCIAIAIoAjQiA0cNACADIQAMAgsgAkEcaiAAIANrQQJ2EMIUIAIoAiQgAigCKCABEIwDRQ0CIAIoAjwhAyACKAI0IQAMAQtBqLCbAUEeQbSxmwEQshcACyACQcAAaiADIABrQQJ2QQhBMBCVDyACKAJEIQMgAigCQEEBRg0CIAJBADYCfCACIAIoAkg2AnggAiADNgJ0IAJB9ABqIAFB4OmbARCIAyACIAIoAnQ2AkggAiACKAJ4IgM2AkAgAiADNgJEIAIgAyACKAJ8IgBBMGxqNgJMAkAgAEUNACACQRxqIAAQwhQgAigCJCACKAIoIAJBwABqELIIGgsgAkHAAGoQsx0LIAJBHGoQugsgARCGHQsgAigCDCACKAIQEPAiIAIoAgggAigCDBCfLQwBCyADIAIoAkhB4OmbARCOKQALIAJBgAFqJAALyAYCBn8BfiMAQSBrIgIkAEEALQCg8Z4BGgJAQcAAEH0iA0UNACADQQA2AgggA0IMNwMAAkACQAJAAkACQAJAAkACQCAAKAIADgUAAgMBBAALIAApAxAhCCAAKAIMIQQgACgCCCEFQQAhBgwGCyAAKAIMIQQgACgCCCEFIAAoAgQhB0ECIQYMBAsgAkEEakEUaiAAQRhqKQIANwIAIAJBEGogAEEQaikCADcCAEEAIQRBAC0AoPGeARogAiAAKQIINwIIQcAAEH0iB0UNBSAHQQA2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAwCCyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQCg8Z4BGiACIAApAgg3AghBwAAQfSIHRQ0EIAdBAzYCCCAHQRs2AgAgByACKQIENwIMIAdBFGogAkEMaikCADcCACAHQRxqIAJBBGpBEGopAgA3AgAgB0EkaiACQQRqQRhqKAIANgIADAELIAJBBGpBFGogAEEYaikCADcCACACQRBqIABBEGopAgA3AgBBACEEQQAtAKDxngEaIAIgACkCCDcCCEHAABB9IgdFDQMgB0EENgIIIAdBGzYCACAHIAIpAgQ3AgwgB0EUaiACQQxqKQIANwIAIAdBHGogAkEEakEQaikCADcCACAHQSRqIAJBBGpBGGooAgA2AgALQQIhBkEAIQULC0EALQCg8Z4BGkHAABB9IgBFDQAgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAEEALQCg8Z4BGkHAABB9IgFFDQAgAUEAOgA8IAEgADYCOCABQgA3AzAgASADNgIoIAFCADcDICABIAg3AhggASAENgIUIAEgBTYCECABIAc2AgwgASAGNgIIIAFBATYCACACQSBqJAAgAQ8LAAvdBgIOfwN+IwBB8ABrIgIkACABKALYASEDIAEQmwEgAkHQAGogARDPCgJAAkACQAJAAkACQAJAIAItAGRBAkcNACACKAJQIQEMAQsgAikDWCEQIAIpA1AhESABLQDgAUEJRw0CIAEQoQsgARCbASACQdAAaiABEM8KIAItAGRBAkcNASAC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ARCkBCAAKAIUIgANCAwKCyABIAAoAhAQngMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEJ4DCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQngMMCAsgAEEIaiABEIwHDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOQaDAILIAIgARDmGgwBCyACIAEQog4LIAEgACgCDBCeAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOQaDAILIAIgARDmGgwBCyACIAEQog4LIAEgACgCDBCeAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxCeAwwBCyADIAEQ5BoLAkAgACgCGCICRQ0AIAEgAhCeAwsCQCAAKAIcIgJFDQAgASACEJ4DCyAAKAIMIQAMAgsgASAAKAIEEJ4DIAAoAgghAAwBCyABIAAoAgQQngMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCkBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCiDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEJ4DC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQggMgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQggMPCyAAKAIoIQAMCQsgACgCBCABEIIDIAAoAgggARClBCAAKAIUIgANCAwKCyAAKAIQIAEQggMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEIIDCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQggMMCAsgAEEIaiABEKkBDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPIaDAILIAIgARDzGgwBCyACIAEQpA4LIAAoAgwgARCCAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPIaDAILIAIgARDzGgwBCyACIAEQpA4LIAAoAgwgARCCAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARCCAwwBCyADIAEQ8hoLAkAgACgCGCICRQ0AIAIgARCCAwsCQCAAKAIcIgJFDQAgAiABEIIDCyAAKAIMIQAMAgsgACgCBCABEIIDIAAoAgghAAwBCyAAKAIEIAEQggMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARClBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCkDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEIIDC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQpAIgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQpAIPCyAAKAIoIQAMCQsgACgCBCABEKQCIAAoAgggARCmBCAAKAIUIgANCAwKCyAAKAIQIAEQpAIgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEKQCCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQpAIMCAsgAEEIaiABEKACDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQigsLIAAoAgwgARCkAiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQigsLIAAoAgwgARCkAiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARCkAgwBCyADIAEQ8BoLAkAgACgCGCICRQ0AIAIgARCkAgsCQCAAKAIcIgJFDQAgAiABEKQCCyAAKAIMIQAMAgsgACgCBCABEKQCIAAoAgghAAwBCyAAKAIEIAEQpAIgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCmBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCKCwsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEKQCC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ0QEgACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ0QEPCyAAKAIoIQAMCQsgASAAKAIEENEBIAAoAgggARCnBCAAKAIUIgANCAwKCyABIAAoAhAQ0QEgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAENEBCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ0QEMCAsgAEEIaiABEI0HDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEO4aDAILIAIgARDvGgwBCyACIAEQpQ4LIAEgACgCDBDRASAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEO4aDAILIAIgARDvGgwBCyACIAEQpQ4LIAEgACgCDBDRASAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxDRAQwBCyADIAEQ7hoLAkAgACgCGCICRQ0AIAEgAhDRAQsCQCAAKAIcIgJFDQAgASACENEBCyAAKAIMIQAMAgsgASAAKAIEENEBIAAoAgghAAwBCyABIAAoAgQQ0QEgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCnBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARClDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEENEBC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ9hogACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ9hoPCyAAKAIoIQAMCQsgASAAKAIEEPYaIAAoAgggARCoBCAAKAIUIgANCAwKCyABIAAoAhAQ9hogACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEPYaCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ9hoMCAsgAEEIaiABEPoCDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPkaDAILIAIgARD6GgwBCyACIAEQ8goLIAEgACgCDBD2GiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPkaDAILIAIgARD6GgwBCyACIAEQ8goLIAEgACgCDBD2GiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxD2GgwBCyADIAEQ+RoLAkAgACgCGCICRQ0AIAEgAhD2GgsCQCAAKAIcIgJFDQAgASACEPYaCyAAKAIMIQAMAgsgASAAKAIEEPYaIAAoAgghAAwBCyABIAAoAgQQ9hogACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCoBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDyCgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEPYaC8AGAhN/AX4jAEHQAGsiAiQAIAAoAghBOGwhAyACQRhqQQRqIQQgASgCFCEFIAAoAgQhBkEAIQcDQAJAAkACQAJAIAMgB0YNAAJAAkACQAJAIAYgB2oiACgCAA4DAAECAAsgASAAQQhqEMooIABBKGooAgAgARCOFgwCCyAAQTBqKAIAIghFDQEgCCABEPgDDAELIABBBGogARCGMAsgACgCAEEBRw0DIAIgAEEQaiIIELQVAkAgBSACEKsIDQAgAiAIEJMMDQIgCCkDACEVIAhCATcDACACQRhqQRhqIgkgCEEYaikDADcDACACQRhqQRBqIgogCEEQaikDADcDACACQRhqQQhqIgsgCEEIaikDADcDACAAQRhqIgxCADcDACAAQR1qQgA3AAAgAEEoaiINQQA2AgAgAiAVNwMYIAJBOGogAkEYahC2GSACKQM4IRUgAigCRCEOIAIoAkAhDyAAQTBqIhAoAgAhESAQQQA2AgACQCARRQ0AIABBCGoiEigCACETIABBDGooAgAhFCAEQRBqIAJBEGopAwA3AgAgBEEIaiACQQhqKQMANwIAIAQgAikDADcCAEEIQSgQqiwiEEUNBCAQQQA2AgAgECACKQIYNwIEIBBBADYCICAQQQxqIAspAgA3AgAgEEEUaiAKKQIANwIAIBBBHGogCSgCADYCAEEIQSgQqiwiCUUNBCAJIBQ2AhAgCSATNgIMIAkgETYCCCAJIBA2AgQgCUEENgIAIAAQox8gEkEANgIAIABBADYCACAIIBU3AgAgDSAJNgIAIABBHGogDjYCACAMIA82AgAMBQsgBCACKQMANwIAIARBEGogAkEQaikDADcCACAEQQhqIAJBCGopAwA3AgBBCEEoEKosIhBFDQMgEEEANgIAIBAgAikCGDcCBCAQQQA2AiAgEEEMaiALKQIANwIAIBBBFGogCikCADcCACAQQRxqIAkoAgA2AgAgABCjHyAAQQhqQQA2AgAgAEEANgIAIAggFTcCACANIBA2AgAgAEEcaiAONgIAIAwgDzYCAAwECyACKQMAEMYhDAMLIAJB0ABqJAAPCyACKQMAEMYhDAELAAsgB0E4aiEHDAALC+AGAgV/AX4jAEGQAWsiASQAAkACQAJAAkACQAJAIAAoAgAOCAUFBQUAAQIDBQsgACgCDCICKAIAIAJBDGooAgAQtiNFDQQMAwsgACgCBCICKAIAIAJBDGooAgAQtiNFDQMMAgsgACgCDA0BDAILIAAoAgxFDQELQRxBBBCnJyECELkaIQMgAEEYaiIEKAIAIQUgBCADNgIAIAApAgAhBiAAQQA2AgAgAiAGNwIAIAJBCGogAEEIaikCADcCACACQRBqIABBEGopAgA3AgAgAkEYaiAFNgIAQQEhACABQQE2AhQgASACNgIQIAFBATYCDCABQdQAakEEaiECA0ACQAJAAkACQAJAAkAgAEUNACABIABBf2oiADYCFCABQThqQQhqIgMgASgCECAAQRxsaiIAQQxqKQIANwMAIAFBOGpBEGoiBCAA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QSBqEPsoDAELIAJBBGogARCvKgsgAEE4aiEADAALCyAAKAIMQThsIQIgACgCCCEAA0AgAkUNCwJAIAAoAgBBB0YNACAAIAEQjhYLIABBMGogARC+BCACQUhqIQIgAEE4aiEADAALCyAAQQhqIAEQiiEPCyAAQQRqIAEQvgQgAEEIaiABEL4EIABBDGogARC+BCAAQRBqIQAMAwsgAEEQaiABEPUkDwsgAEEEaiEADAELIABBBGogARC+BCAAQQhqIQAMAAsLIABBEGogARD1JCABIABBwABqELAqIAEgAEHEAGoQsCoPCyAAKAIIQYSAgIB4SA0CIABBCGogARCKIQ8LIABBKGohAgJAIAAtABxBAkYNACABKAIUIABBCGoQqwgaCyABIAIQrioPCyAAQQhqIAEQxgoLC+AGAgd/AX4jAEHwAGsiAyQAIAEoAtgBIQRBACEFAkACQAJAIAINACABLQDgASIGIQUCQCAGQfMARw0AIAEQoQsgAS0A4AEhBQsCQCAFQf8BcUHjAEYNACABKALcASECIAEoAtgBIQYgA0EYaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0HjADoAbyADIANB4ABqNgJQIAMgA0HoAGo2AmAgAyADQe8AajYCaCADQTBqIANByABqEP0aIANBxABqIANBIGooAgA2AgAgAyADKQIYNwI8IAYgAiADQTBqEOAaIQIgAS0A4AFBogFHDQIgASABEJosEKcXDAILIAEQoQsgBkHzAEYhBQsgA0EQaiABQQBBARCpGiADKAIUIQYCQCADKAIQQQFxRQ0AIABBgYCAgHg2AgAgACAGNgIEDAILAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQUgA0EkaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBSACIANBMGoQ4BohAiABLQDgAUGiAUYNAQwDCyABEKELIANByABqIAEQswMgAygCTCEHIAMoAkgiCEGAgICAeEYNASADIAMoAlAiCTYCOCADIAc2AjQgAyAINgIwIANBGzoASCADQQhqIAEgA0HIAGoQ1xEgAygCDCEHAkAgAygCCEEBcUUNACAAQYGAgIB4NgIAIAAgBzYCBCADQTBqEPgqDAQLIAEoAtQBIQECQAJAIAINACADKQI0IQogBCECIAEhBCAGIQEMAQtBgICAgHghCCADKQMwIQogByECIAYhBSAJIQcLIAAgBTYCHCAAIAE2AhggACAENgIUIAAgAjYCECAAIAc2AgwgACAKNwIEIAAgCDYCAAwFCyABIAEQmiwQpxcMAQsgAEGBgICAeDYCACAAIAc2AgQMAQsgAEGBgICAeDYCACAAIAI2AgQLIAYQmSwMAQsgAEGBgICAeDYCACAAIAI2AgQLIANB8ABqJAALngYBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFBgcICQoLDA0OAAsgAEEEaiABEIYhDwsgAEEEaiABEJUvIABBCGogARClLw8LIAAoAgwiAEUNDCAAIAEQwQIgACgCAEEeRw0MIAAtACgNDCABIABBIGooAgAQpxAPCyAAQShqIAEQpS8PCyAAQQRqIAEQlS8gAEEIaiICIAEQpS8CQCAAKAIUIgNFDQAgAEEUaiABEKUvCwJAIAIoAgAiABCnJkUNACABIAAQvRNBOxDxHgsgA0UNCiADEKcmRQ0KIAEgAxC9E0E7EPEeDwsgAEEQaiABEJUvIAAoAgxBGGwhAyAAKAIIIQADQCADRQ0KIABBFGogARDDKiAAIAEQhiEgA0FoaiEDIABBGGohAAwACwsgAEEEaiABEJUvIAAoAgQiACgCAEEeRw0IIAAtACgNCCABIABBIGooAgAQpxAPCyAAKAIEIgBByABqIAEQhiEgAEHgAGohAwJAAkACQCAAKAIAQXlqDgIBAgALIAAgARCLFQsgAEEoaiABEIYhCyADKAIAQYCAgIB4Rg0HIAMgARCGIQ8LIABBBGogARCVLyAAQQhqIAEQpS8gACgCCCIAEKcmRQ0GIAEgABC9E0E7EPEeDwsgAEEEaiABEJUvIABBCGogARClLyAAKAIIIgAQpyZFDQUgASAAEL0TQTsQ8R4PCwJAIAAoAgQiA0ECRg0AIABBCGohAgJAIANBAXFFDQAgAiABEJUvDAELIAIgARCmLwsgAEEYaiABEMMqIABBHGogARDDKiAAQQxqIAEQpS8gACgCDCIAEKcmRQ0EIAEgABC9E0E7EPEeDwsgAEEEaiABEKsiIABBDGogARCVLyAAQRBqIAEQpS8gACgCECIAEKcmRQ0DIAEgABC9E0E7EPEeDwsgAEEEaiABEKsiIABBDGogARCVLyAAQRBqIAEQpS8gACgCECIAEKcmRQ0CIAEgABC9E0E7EPEeDwsgASAAQQhqELwGDwsgAEEEaiABEJUvCwvgBgECfyMAQSBrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABDigGAQEBAQEBAQECBAEBAwEBAQEBAQEBAQEBAQEBAQEBAQEBCAEBAQEHAAsgAUHcAEYNBAsgAkEBcUUNByABQf8FTQ0HIAEQ/wdFDQcgA0EAOgAKIANBADsBCCADIAFBFHZBmIOeAWotAAA6AAsgAyABQQR2QQ9xQZiDngFqLQAAOgAPIAMgAUEIdkEPcUGYg54Bai0AADoADiADIAFBDHZBD3FBmIOeAWotAAA6AA0gAyABQRB2QQ9xQZiDngFqLQAAOgAMIANBCGogAUEBcmdBAnYiAmoiBEH7ADoAACAEQX9qQfUAOgAAIANBCGogAkF+aiICakHcADoAACADQQhqQQhqIgQgAUEPcUGYg54Bai0AADoAACAAQQo6AAsgACACOgAKIAAgAykCCDcCACADQf0AOgARIABBCGogBC8BADsBAAwJCyAAQYAEOwEKIABCADcBAiAAQdzoATsBAAwICyAAQYAEOwEKIABCADcBAiAAQdzkATsBAAwHCyAAQYAEOwEKIABCADcBAiAAQdzcATsBAAwGCyAAQYAEOwEKIABCADcBAiAAQdy4ATsBAAwFCyAAQYAEOwEKIABCADcBAiAAQdzgADsBAAwECyACQYACcUUNASAAQYAEOwEKIABCADcBAiAAQdzOADsBAAwDCyACQf///wdxQYCABE8NAQsCQCABENIMDQAgA0EAOgAWIANBADsBFCADIAFBFHZBmIOeAWotAAA6ABcgAyABQQR2QQ9xQZiDngFqLQAAOgAbIAMgAUEIdkEPcUGYg54Bai0AADoAGiADIAFBDHZBD3FBmIOeAWotAAA6ABkgAyABQRB2QQ9xQZiDngFqLQAAOgAYIANBFGogAUEBcmdBAnYiAmoiBEH7ADoAACAEQX9qQfUAOgAAIANBFGogAkF+aiICakHcADoAACADQRRqQQhqIgQgAUEPcUGYg54Bai0AADoAACAAQQo6AAsgACACOgAKIAAgAykCFDcCACADQf0AOgAdIABBCGogBC8BADsBAAwCCyAAIAE2AgQgAEGAAToAAAwBCyAAQYAEOwEKIABCADcBAiAAQdzEADsBAAsgA0EgaiQAC5kGAgZ/AX4jAEHAAWsiBSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABIgZBywBGDQAgBkGNf2pB/wFxQS5JDQIgBkHefmoOAgMEAQtBACABQQhqIAEoAghBCUYiBxshBiAHDQYgBigCAEECRw0GIAYpAwgiC0IDg0IAUg0FIAunIgYgBigCACIGQQFqNgIAIAZBf0oNBQALIAZB0QBHDQNC0ca987aOHSELDAQLIAYQowkiC0IAUg0DQdyqnAEQ0iwAC0EBIQcgARCaLCEIDAYLQQEhByABKAKAARDfIyEIDAULQQAhCEEAIQcgBkHgAEcNBEKh0rkDIQsLIAUgCzcDCCADQQN0IQdBACEIIAIhBgJAA0AgB0UNASAGKAIEIQkgBigCACEKIAUgBUEIahDxFSAKIAkgBSgCACAFKAIEEOMlDQEgB0F4aiEHIAhBAWohCCAGQQhqIQYMAAsLIAUpAwgQxiEgB0UNAiAERQ0BIAEtAOABQf8BcUGUAUcNASABENgJIgZFDQEgBi0AAEECRw0BIABCADcCAAwECyAFQQE2AhQgBUHUqZwBNgIQIAVCATcCHCAFIAY2AjQgBUG0B61CIIYgBUE0aq2ENwMoIAUgBUEoajYCGCAFQRBqQdypnAEQ6SMACyABLQCRAUEgcUUNACABKAKIASEHIAVBOGogARDdASABIAEoAogBQQFyEKgSIAEQoQsgAS0A4AEhBgJAAkACQAJAAkAgAS0A4QENACAGQQRGDQELAkAgBkFnag4EAQICAQALIAZBD0YNACAGQQJHDQELIAVBgAI7ARAMAQsgBUEAOgAQIAUgBkFAakH/AXFBA0kgBhClFXIiBjoAESAGRQ0BCyABIAEoAogBQX5xIAdBAXFyEKgSIAVBEGoQ9iggBUE4ahCWJgJAIAggA08NACAAQQA2AgAgACACIAhBA3RqKQIANwIEDAQLIAggA0HA1JsBEJEVAAsgASAFQThqEMcFIAVBEGoQ9igLIABCADcCAAwBCyAAIAc2AgAgACAINgIECyAFQcABaiQAC4sGAwt/An4BfCMAQcAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4FAAECBAMACyABKAIUIQQgASgCECEFAkAgASkDCCINQgODQgBSDQAgDaciASABKAIAIgFBAWo2AgAgAUF/TA0GCyAAIAQ2AhQgACAFNgIQIAAgDTcDCAwECyABKAIUIQQgASgCECEFAkAgASkDCCIOQgODQgBSDQAgDqciBiAGKAIAIgZBAWo2AgAgBkF/TA0FCwJAIAEpAxgiDVANACANQgODUEUNACANpyIBIAEoAgAiAUEBajYCACABQX9MDQULIAAgDTcDGCAAIAQ2AhQgACAFNgIQIAAgDjcDCAwDCyABKwMQIQ8gASgCDCEEIAEoAgghBQJAIAEpAxgiDVANACANQgODUEUNACANpyIBIAEoAgAiAUEBajYCACABQX9MDQQLIAAgDTcDGCAAIA85AxAgACAENgIMIAAgBTYCCAwCCyABKAIYIQUgASgCDCEHIAEoAgghCBD+JyEEIAVBBGooAgAhCSAFLQAMIQogAiAFQQhqKAIAIgVBAEEEQQQQrAwgAigCBCELIAIoAgBBAUYNAyACKAIIIQYCQCAFQQJ0IgxFDQAgBiAJIAz8CgAACyAEIAo6AAwgBCAFNgIIIAQgBjYCBCAEIAs2AgACQCABKQMQIg1QDQAgDUIDg1BFDQAgDaciASABKAIAIgFBAWo2AgAgAUF/TA0DCyAAIAQ2AhggACANNwMQIAAgBzYCDCAAIAg2AggMAQsgASkDCCENIAEoAgQhBBD6JyEBIAIgBBBCIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwAgACANNwMIIAAgATYCBAsgACADNgIAIAJBwABqJAAPCwALIAsgAigCCEHAvJwBEI4pAAukBgIJfwF+IwBB8ABrIgIkAEEAIQMgAkEANgIgIAJCgICAgMAANwIYQQQhBEEMIQUDQAJAAkACQCABLQDgASIGQQJGDQAgBkHZAEYNACAG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KQJENwJcIAUgBiADQdAAahDgGiEGIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELIAMgAhDGEiADKAIEIQkgAygCAEEBcUUNASAJIQYLIANBwABqEI8GDAELIAIoAtQBIQJB4ABBCBCdKiIGIAI2AhggBiABNgIUIAYgCTYCECAGIAg2AgwgBiAHNgIIIAYgBTYCBCAGQQs2AgBBACEEDAMLIANBMGoQjwYLIANBLGoQjwYMAQsgBSEGCyAAIAY2AgQgACAENgIAIANBkAFqJAAL4QUCB38BfkEAIQICQCABKAIIIgMgASgCBCIETw0AIAEoAgAgA2otAABB9QBHDQBBASECIAEgA0EBaiIDNgIICwJAAkAgAyAETw0AIAEoAgAiBSADai0AAEFQaiIGQf8BcSIHQQpJDQELIABBADYCACAAQQA6AAQPCyABIANBAWoiAzYCCAJAAkACQCAHDQBBACEHDAELIAZB/wFxIQcDQAJAIAQgA0cNACAEIQMMAwsgBSADai0AAEFQakH/AXEiBkEJSw0BIAEgA0EBaiIDNgIIAkAgB61CCn4iCUIgiKcNACAJpyIIIAZqIgcgCE8NAQsLIABBADYCACAAQQA6AAQPCyADIARPDQAgBSADai0AAEHfAEcNACABIANBAWoiAzYCCAsCQCADIAdqIgYgA08NACAAQQA2AgAgAEEAOgAEDwsgASAGNgIIAkACQAJAAkAgBiAESw0AIANFDQEgAyAETw0BIAUgA2osAABBv39KDQEMAgsgAEEANgIAIABBADoABA8LAkAgBkUNACAGIARPDQAgBSAGaiwAAEG/f0wNAQsgBSADaiEGIAINASAAQgE3AgggACAHNgIEIAAgBjYCAA8LIAUgBCADIAZB/OKXARDjKgALIAUgA2pBf2ohBCAHIQECQANAAkAgASIDDQBBACEBQQEhAyAGIQQMAgsgA0F/aiEBIAQgA2otAABB3wBHDQALAkACQCABRQ0AAkACQCABIAdJDQAgASAHRw0BIAMNAkEAIQgMAwsgBiABaiwAAEG/f0oNAQsgBiAHQQAgAUGM45cBEOMqAAsCQAJAIAMgB0kNACAHIQggAyAHRw0BDAILIAYgA2osAABBv39MDQAgAyEIDAELIAYgByADIAdBnOOXARDjKgALIAYgCGohBCAHIAhrIQcgBiED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ACAAKAIkIgNFDQAgAUEAIAMQ9QU2AiwLIAFBGGohAwJAIAAtAD0iBA0AAkAgASgCIA0AIABBADoAPQwBCyAAIAEoAhwiBSgCACAFQQRqKAIAEMIaOgA9CyAAIAMQwAogACAEOgA9CyACQcAAaiQAC6wGAQV/IwBB8ABrIgMkACABKALYASEEAkACQAJAAkACQCACRQ0AAkAgAS0A4AFB4wBGDQAgASgC3AEhAiADQRhqIAEQ1CYgA0EBNgJMIANBnL+cATYCSCADQgE3AlQgA0GzBzYCZCADQeMAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EgaigCADYCACADIAMpAhg3AjwgBCACIANBMGoQ4BohAiABLQDgAUGiAUYNAgwECyABEKELCyADQRBqIAFBAEEBEKkaIAMoAhQhBSADKAIQQQFxRQ0BIABBAjYCACAAIAU2AgQMAwsgASABEJosEKcXDAELAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQQgA0EkaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBCACIANBMGoQ4BohAiABLQDgAUGiAUYNAQwDCyABEKELIANByABqIAEQswMgAygCTCEGIAMoAkgiB0GAgICAeEYNASADIAMoAlA2AjggAyAGNgI0IAMgBzYCMAJAAkACQAJAIAEtAOABQQlGDQBBACEGDAELIANBCToAYCADQQhqIAEgA0HgAGoQ1xEgAygCDCEGIAMoAghBAXENAQsgAyAGNgJIAkAgARCMJyIHRQ0AIABBAjYCACAAIAc2AgQgA0HIAGoQpisMAgsgACADKQIwNwIEIAAgBTYCHCAAIAY2AhggACAENgIQIAAgAjYCACAAIAEoAtQBNgIUIABBDGogA0E4aigCADYCAAwHCyAAQQI2AgAgACAGNgIECyADQTBqEPgqDAMLIAEgARCaLBCnFwwBCyAAQQI2AgAgACAGNgIEDAELIABBAjYCACAAIAI2AgQLIAUQmSwM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EFQNACADQShGDQQgASAHpzYCACADQQFqIQMLIAAgAzYCoAEgAA8LIANBKEHosYEBEOEsAAtBKEEoQeixgQEQkRUACyADQShB6LGBARDhLAALQShBKEHosYEBEJEVAAsCQAJAAkAgAUEIcUUNACAAKAKgASIDQSlPDQECQAJAIAMNAEEAIQMMAQsgACADQQJ0IgVqIQRCACEHIAAhAgNAIAIgAjUCAELh6xd+IAd8Igg+AgAgAkEEaiECIAhCIIghByAFQXxqIgUNAAsgCEKAgICAEFQNACADQShGDQMgBCAHpzYCACADQQFqIQMLIAAgAzYCoAELAkAgAUEQcUUNACAAQbSCgQFBAhDTBBoLAkAgAUEgcUUNACAAQbyCgQFBAxDTBBoLAkAgAUHAAHFFDQAgAEHIgoEBQQUQ0wQaCwJAIAFBgAFxRQ0AIABB3IKBAUEKENMEGgsCQCABQYACcUUNACAAQYSDgQFBExDTBBoLIAAgARCjAxogAA8LIANBKEHosYEBEOEsAAtBKEEoQeixgQEQkRUAC5gGAQV/IABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAAkAgAkEBcQ0AIAJBAnFFDQEgASgCACICIABqIQACQCABIAJrIgFBACgCgPCeAUcNACADKAIEQQNxQQNHDQFBACAANgL4754BIAMgAygCBEF+cTYCBCABIABBAXI2AgQgAyAANgIADwsgASACEPgHCwJAAkACQAJAAkACQCADKAIEIgJBAnENACADQQAoAoTwngFGDQIgA0EAKAKA8J4BRg0DIAMgAkF4cSICEPgHIAEgAiAAaiIAQQFyNgIEIAEgAGogADYCACABQQAoAoDwngFHDQFBACAANgL4754BDwsgAyACQX5xNgIEIAEgAEEBcjYCBCABIABqIAA2AgALIABBgAJJDQIgASAAEJQJQQAhAUEAQQAoApjwngFBf2oiADYCmPCeASAADQQCQEEAKALg7Z4BIgBFDQBBACEBA0AgAUEBaiEBIAAoAggiAA0ACwtBACABQf8fIAFB/x9LGzYCmPCeAQ8LQQAgATYChPCeAUEAQQAoAvzvngEgAGoiADYC/O+eASABIABBAXI2AgQCQCABQQAoAoDwngFHDQBBAEEANgL4754BQQBBADYCgPCeAQsgAEEAKAKQ8J4BIgRNDQNBACgChPCe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AAtBBCECAkACQCAFQQRPDQBBACECQgAhBwwBCyABIARqNQAAIQcLAkAgAkEBciAFTw0AIAEgBGogAmozAAAgAkEDdK2GIAeEIQcgAkECciECCwJAIAIgBU8NACABIAIgBGpqMQAAIAJBA3SthiAHhCEHCyAAIAc3AzALIAAgBTYCPAu4BQIHfwF+IwBBMGsiAiQAIAApAmghCSAAQoCAgICAATcDaEEIIQMgAkEIakEIaiIEIABB8ABqIgUoAgA2AgBBACEGIAVBADYCACACIAk3AwggAEHoAGohBwJAAkACQCABKAIIIggNACAHIAIpAwg3AgAgB0EIaiAEKAIANgIAQQAhBQwBCyABKAIEIQMCQAJAA0AgAygCACEEIAAgAxD9AiAGQQFqIQUCQCAEQQFGDQAgAygCAEEBRg0CCyADQTBqIQMgBSEGIAggBUcNAAtBACEEDAELIAMQlwQCQCAFIAhHDQBBASEEDAELIANBMGohAyAGQX9zIAhqIQZBASEEA0AgAygCACEFIAAgAxD9AgJAAkAgBUEBRg0AIAMoAgBBAUcNACADEJcEIARBAWohBAwBCyADIARBUGxqIgUgAykDADcDACAFQShqIANBKGopAwA3AwAgBUEgaiADQSBqKQMANwMAIAVBGGogA0EYaikDADcDACAFQRBqIANBEGopAwA3AwAgBUEIaiADQQhqKQMANwMACyADQTBqIQMgBkF/aiIGDQALCyABIAggBGsiBjYCCCAAKAJsIQMgACgCaCEFIAcgAikDCDcCACAAKAJwIQAgB0EIaiACQQhqQQhqKAIANgIAIABFDQAgAiAFNgIcIAIgAzYCGCACIAM2AhQgAiADIABBBHRqNgIgIAJBJGogAkEUahDLCEEALQCg8Z4BGgJAQRwQfSIDRQ0AIAMgAikCJDcCACADQgA3AgwgA0ESakIANwEAIANBCGogAkEkakEIaigCADYCAAJAIAYgASgCAEcNACABQZSgmwEQ9B0LIAEgBkEBajYCCCABKAIEIAZBMGxqIgUgAzYCDCAFQQI2AgggBUERNgIAQQBBCBCjLQwCCwALIAUgAxC2LQsgAkEwaiQAC+oFAQt/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIUIQIgA0EANgIUAkAgAkUNACABQQhqIAIRAwACQCAAKAIE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AiAgBUEAOgAcIAVBADYCGCAFIAk2AhQgBSABNgIQIAUgDDcDCCAFQRI2AgAgAigC1AEhAkEMQQQQmioiASACNgIIIAEgBzYCBCABIAU2AgAMAgsgDBDGISAKIQELQQEhBAsgACABNgIEIAAgBDYCACADQeAAaiQAC6kFAQx/IwBBMGsiAyQAAkAgASgCeCACRg0AIAEgAjYCeCABIAEoAnAiBCABKAJ0ajYCbCABIAQgAiABKAJ8a2o2AmgLIAEQiQEgASgCeCEFAkACQAJAAkAgASgCbCABKAJoIgJHDQAgBSEGDAELAkACQAJAIAItAAAiBEE+Rw0AQRMhBwwBCyAEQS9HDQFBECEHCyABIAVBAWoiBjYCeCABIAJBAWo2AmgMAgsgAUEAOgCTASADQQRqIAEgBEECdEHcopoBaigCABEGAAJAIAMtAARBAXFFDQAgAygCCCECIANBCDYCGCADIAI2AhwgASADQRhqEJQFIAEoAnghBkGiASEHDAILIAEoAnghBiADLQAFIgdBowFHDQELIAEtACghAkGjASEHDAELIAYhAgJAIAEoAjBBgICAgHhGDQAgASgCRCEEIAFBADYCRCADQQA2AhQgAyABQTxqNgIMIAMgBDYCECADIAEoAkAiAjYCBCADIAIgBEEYbCIIaiIJNgIIAkAgBEUNACABQTBqIQogASgCOCILQQV0IQwDQCADQRhqQRBqIg0gAkEQaikDADcDACADQRhqQQhqIg4gAkEIaikDADcDACADIAIpAwA3AxgCQCALIAooAgBHDQAgCkGImpoBEOkdCyACQRhqIQIgASgCNCAMaiIEIAMpAxg3AwAgBEEQaiANKQMANwMAIARBCGogDikDADcDACAEQRxqQQA6AAAgBEEYaiAFNgIAIAEgC0EBaiILNgI4IAxBIGohDCAIQWhqIggNAAsgAyAJNgIECyADQQRqEMkJIAEoAnghAgsgASACNgIkIAEgBzoAKyABIAEtACgiAjoAKQsgACACOgAJIAAgBzoACCAAIAY2AgQgACAFNgIAIAEgABD0DiADQTBqJAALkgUCBH8BfiMAQSBrIgMkACADQRBqIAIgASgCGCIEKAIkQQAQiwICQAJAIAMtABBBBEYNACADKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkACQAJAAkACQCAEKAIkIgVF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IgRBBiAEQQlJGw4JAAECAwQFBgcIAAsgA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0GTAjYCDCADIAApAgg3AiggAyADQQhqNgIYIAMgA0EoajYCCCABIAIgA0EQahCVKSEADAgLIAMgAEEEajYCCCADQQI2AhQgA0GE65gBNgIQIANCATcCHCADQfkANgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQlSkhAAwHCyADQQA2AiAgA0EBNgIUIANBqOuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwGCyADQQA2AiAgA0EBNgIUIANBuOuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwFCyADQQA2AiAgA0EBNgIUIANB1OuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwECyADQQA2AiAgA0EBNgIUIANB9OuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwDCyADIAA2AgggA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0GUAjYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEJUpIQAMAgsgAyAAQQRqNgIIIANBAjYCFCADQfzrmAE2AhAgA0IBNwIcIANB+QA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahCVKSEADAELIAMgAEEEajYCCCADQQE2AhQgA0Gcv5wBNgIQIANCATcCHCADQfkANgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQlSkhAAsgA0EwaiQAIAAL3gQBFn8jAEHgAGsiAiQAIAEoAgQhAyACIAEoAggiBEEEQRAQlQ8gAigCBCEFAkACQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACADIARBBHRqIQdBACEIIAUhCQNAIAMgB0YNASADKAIIIQogAygCBCELIAMoAgAhARD6JyEMIAIgARBCIAxBOGogAkE4aikDADcDACAMQTBqIAJBMGopAwA3AwAgDEEoaiACQShqKQMANwMAIAxBIGogAkEgaikDADcDACAMQRhqIAJBGGopAwA3AwAgDEEQaiACQRBqKQMANwMAIAxBCGogAkEIaikDADcDACAMIAIpAwA3AwACQAJAIAMoAgwiDQ0AQQAhDgwBCxCAKCEOIA0oAgQh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CyAAQQo2AgAgACABKQIENwIEIAEQ+goMAwsgAkEQaiABQRRqKQIANwMAIAJBGGogAUEcaikCADcDACACIAEpAgw3AwggASgCJCEFIAEoAgghAUEAIQMLIAAgATYCCCAAIAQ2AgQgACADNgIAIAAgAikDCDcCDCAAIAU2AiQgAEEUaiACQRBqKQMANwIAIABBHGogAkEYaikDADcCAAwBCyACQSBqIAEoAgQQpwUgAigCJCEBAkAgAigCICIDQQtGDQAgAkEQaiACQSBqQRRqKQIAIgY3AwAgAkEYaiACQSBqQRxqKQIAIgc3AwAgAiACKQIsIgg3AwggAigCRCEEIAIpA0ghCSAAIAIoAig2AgggACABNgIEIAAgAzYCACAAIAg3AgwgAEEUaiAGNwIAIABBHGogBzcCACAAIAk3AyggACAENgIkDAELIAAgATYCDCAAQQY2AgggAEEMNgIACyACQdAAaiQAC9kEAQh/IwBBEGsiAyQAIAMgATYCBCADIAA2AgAgA0KggICADjcCCAJAAkACQAJAAkAgAigCECIERQ0AIAIoAhQiAQ0BDAILIAIoAgwiAEUNASACKAIIIgEgAEEDdGohBSAAQX9qQf////8BcUEBaiEGIAIoAgAhAANAAkAgAEEEaigCACIHRQ0AIAMoAgAgACgCACAHIAMoAgQoAgwRCwBFDQBBASEBDAULAkAgASgCACADIAFBBGooAgARBwBFDQBBASEBDAULIABBCGohACABQQhqIgEgBUYNAwwACwsgAUEYbCEIIAFBf2pB/////wFxQQFqIQYgAigCCCEJIAIoAgAhAEEAIQcDQAJAIABBBGooAgAiAUUNACADKAIAIAAoAgAgASADKAIEKAIMEQsARQ0AQQEhAQwEC0EAIQVBACEKAkACQAJAIAQgB2oiAUEIai8BAA4DAAECAAsgAUEKai8BACEKDAELIAkgAUEMaigCAEEDdGovAQQhCgsCQAJAAkAgAS8BAA4DAAECAAsgAUECai8BACEFDAELIAkgAUEEaigCAEEDdGovAQQhBQsgAyAFOwEOIAMgCjsBDCADIAFBFGooAgA2AggCQCAJIAFBEGooAgBBA3RqIgEoAgAgAyABKAIEEQcARQ0AQQEhAQwECyAAQQhqIQAgCCAHQRhqIgdGDQIMAAsLQQAhBgsCQCAGIAIoAgRP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DgsgAEEEahCMKAwNCyAAQQRqEKAGDAwLIABBCGoiASgCACAAQQxqKAIAELocIAAoAgQgASgCABCjLQwLCyAAQQRqEKAGDAoLIABBBGoQoAYMCQsgAEEIahD5KgwICyAAQQRqEKAGIABBCGoQoAYgAEEMahCgBiAAQRBqEKAGDAcLIABBEGoQsScMBgsgAEEEahCgBgwFCyAAQQRqEKAGDAQLIABBBGoQoAYgAEEIahCgBgwDCyAAQRBqELEnIABBwABqEPoqIABBxABqEPoqDAILAkACQAJAAkAgACgCCEGAgICAeHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahD5KiAAQRRqEI0oDAQLIAApAyAQ+yoMAwsgACkDECAAQSBqKQMAEKYuDAILIABBGGopAwAgAEEgaigCABDEJgwBCwJAIAAtABxBAkYNACAAKQMIEMYhCyAAQShqEPcqCyAAQeAAQQgQsxYLnAQBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFBgcICQoLDA0OAAsgAEEEaiABEIghDwsgAEEEaiABEJMvIABBCGogARChLw8LIABBDGogARDAKg8LIABBKGogARChLw8LIABBBGogARCTLyAAQQhqIAEQoS8gACgCFEUNCiAAQRRqIAEQoS8PCyAAQRBqIAEQky8gACgCDEEYbCECIAAoAgghAANAIAJFDQogAEEUaiABEMAqIAAgARCIISACQWhqIQIgAEEYaiEADAALCyAAQQRqIAEQky8PCyAAKAIEIgBByABqIAEQiCEgAEHgAGohAgJAAkACQCAAKAIAQXlqDgIBAgALIAAgARCuGgsgAEEoaiABEIghCyACKAIAQYCAgIB4Rg0HIAIgARCIIQ8LIABBBGogARCTLyAAQQhqIAEQoS8PCyAAQQRqIAEQky8gAEEIaiABEKEvDwsCQCAAKAIEIgJBAkYNACAAQQhqIQMCQCACQQFxRQ0AIAMgARCTLwwBCyADIAEQoi8LIABBGGogARDAKiAAQRxqIAEQwCogAEEMaiABEKEvDwsgAEEEaiABEKkiIABBDGogARCTLyAAQRBqIAEQoS8PCyAAQQRqIAEQqSIgAEEMaiABEJMvIABBEGogARChLw8LIABBCGogARBxDwsgAEEEaiABEJMv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QQA2AgALIAJB0ABqIQIgA0Gwf2oiAw0ACwsgACgCHCICRQ0GIAIgARD3GA8LAkACQCAAKAIIDgMAAQcACwJAIAAtACRBAkYNACAAQQA2AiALIAAoAiggARDcBA8LAkAgAC0AJEECRg0AIABBADYCIAsgACgCKCABEJoNDwsgACgCBCABEL4DDwsgACgCECICRQ0DIAIgARD3GA8LIAAoAgRBADYCOA8LIAAoAgQgARC+Aw8LIABBADYCIAsLmwQBB38jAEEwayICJAACQCABKAIAQQdHDQACQCABKAIEIgMtAEVBA0YNACADQSBqIAAQhBsLIAMtAFENACADKQMAQgBSDQAgAygCSCEEAkACQAJAAkAgAy0AUA0AIARBf2oiASAAKAIEIgVPDQEgACgCACABai0AAEHtAEcNBAwDCwJAIAAoAgwiBg0AQQAhAQwCCyAAKAIIIQdBACEAIAYhAQJAA0ACQCABQQFLDQACQCAHIABBDGxqKAIAIgEgBEYNACAAIAEgBElqIQEMBQsgAEEBaiIBIAZPDQIgByABQQxsaiIBLQAIQYYBRg0GIAEoAgAhBAwFCyAAIAFBAXYiBSAAaiIIIAcgCEEMbGooAgAgBEsbIQAgASAFayEBDAALCyABIAZBvJScARCRFQALIAEgBUGclJwBEJEVAAsgAiABNgIgQcSInAFBKyACQSBqQbSInAFBrJScARDqEgALQQAoArjwngEiAEUNACACQRRqIAAgBCADKAIUIgEgBCABSRsgBCABIAQgAUsbQZaxnAFBOxD/ECACQQhqQRFBwLycARC7GSACKAIIIQAgAigCDCIBQQApANGxnAE3AAAgAUEIakEAKQDZsZwBNwAAIAFBEGpBAC0A4bGcAToAACACQRE2AiwgAiABNgIoIAIgADYCJCACQQA2AiAgAkEUaiACQSBqEOsfIgEQ9gEgARCqDgsgAkEwaiQAC6MEAQR/IwBB0ABrIgYkACAGIAM2AgQgBiACNgIAIAZBKGpBCGogBEEIaigCADYCACAGIAQpAgA3AyggASgCiAEhBCAGIAZBBGo2AjggBiAGNgI0AkACQCAEQYCACHENACABIARBgIAIcjYCiAEgBkEIaiAGQShqIAEQqyogASABKAKIAUH//3dxNgKIAQwBCyAGQQhqIAZBKGogARCrKgsgBigCCCEHAkAC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QAJAAkACQAJAAkACQCABKAIADggAAQIDBAUGBwALIAAgASgCIBDDAQwHCyABKAIgIAAQ8wsMBgsgASgCBCAAEOcSDAULIAEoAgQgABDnEgwECyABQQRqIAAQiAgMAwsgACABKAIEIgEoAgAiAyABQQRqKAIAIgEQyh8gACADIAEQhBAMAgtBACgCuPCeASIARQ0BIAJBJGogACABKAIEIgFBGGooAgAgAUEcaigCAEHqspwBQTMQ/xAgAkEQakERQcC8nAEQuxkgAigCECEAIAIoAhQiAUEAKQDRsZwBNwAAIAFBCGpBACkA2bGcATcAACABQRBqQQAtAOGxnAE6AAAgAkERNgI8IAIgATYCOCACIAA2AjQgAkEANgIwIAJBJGogAkEwahDrHyIBEPYBIAEQqg4MAQtBACgCuPCeASIARQ0AIAJBJGogACABKAIEIgFByABqKAIAIAFBzABqKAIAQZ2znAFBxAAQ/xAgAkEYakERQcC8nAEQuxkgAigCGCEAIAIoAhwiAUEAKQDRsZwBNwAAIAFBCGpBACkA2bGcATcAACABQRBqQQAtAOGxnAE6AAAgAkERNgI8IAIgATYCOCACIAA2AjQgAkEANgIwIAJBJGogAkEwahDrHyIBEPYBIAEQqg4LIAJBwABqJAAL7AQCBn8CfiMAQfABayICJAACQEEALQDY8J4BDQBBABCiFQtBAEEAKQPg8J4BIghCAXw3A+DwngFBACkD6PCeASEJIAEoAoAFKALQAiEDIAJCBDcC5AEgAkIANwLcASACQoCAgIDAADcC1AECQCADQX9MDQAgAkHsAWoiBEEANgIAIAJB1AFqIAMQiCUgAkHgAWoiBSADEIglIAJB0ABqIAQoAgA2AgAgAkHIAGogAkHkAWoiBikCADcDACACQcAAaiACQdQBakEIaiIHKQIANwMAIAIgAikC1AE3AzggBEEANgIAIAZCBDcCACAHQgA3AgAgAkKAgICAwAA3AtQBIAJB1AFqIAMQiCUgBSADEIglIAJB7ABqIAQoAgA2AgAgAkHkAGogBikCADcCACACQdwAaiAHKQIANwIAIAJBCGpBCGpBACkDgIWeATcDACACIAIpAtQBNwJUIAJBADYCtAEgAkKAgICAEDcCrAEgAkEANgKcASACQoCAgIDAADcClAEgAkIENwKMASACQgA3AoQB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AgAgABCeLSABKAI8QRRBBBCzFgsCQCABKAJAIgBFDQAgACgCACICELQCIAJB4ABBCBCzFiAAQQxBBBCzFgsgAUHIAEEEELMWC5kEAwZ/An4BfCMAQTBrIgIkACACIAFB4AFqNgIMIAEoAtgBIQMCQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABIgRB5ABGDQAgBEHaAEYNASAEQeoARg0BAkAgBEFAag4DCQMEAAsgBEHefmoOAgQGBQsgARChCyABKALUASEEQQIhBUIAIQgMCAsgBEHqAEYhBiABEKELIAEoAtQBIQRBASEFQgAhCAwHCyACQRBqIAEQjxEgAikDGCIJQoCAgIBwgyEIIAIrAxAhCiABKALUASIGQQh2IQEgCachB0EDIQUgAyEEDAYLIAJBEGogARCQESACKwMYIQogAigCECEHIAEoAtQBIgZBCHYhAUEEIQVCACEIIAMhBAwFCyABEJosIQEMAgsgAkEBNgIUIAJBqICcATYCECACQgE3AhwgAkGzBzYCLCACIAJBKGo2AhggAiACQQxqNgIoIAJBEGpBsICcARDpIwALIAEoAoABEN8jIQELIABBBzYCACAAIAE2AgQMAgsgAkEQaiABEP4aIAIpAyAiCUKAgICAcIMhCCACLwAVIAItABdBEHRyIQEgAisDGCEKIAItABQhBiACKAIQIQQgCachB0EAIQULIAAgATsADSAAIAo5AxAgACAGOgAMIAAgBDYCCCAAIAM2AgQgACAFNgIAIABBD2ogAUEQdjoAACAAIAggB62ENwMYCyACQTBqJAAL8gMCA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEJIjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBEGogASACEN0tIAMtABBBBEYNASADKQMQIgZC/wGDQgRRDQEgACAGNwIADAILIAAgBjcCAAwBCwJAAkACQCACLQBNDQAgA0EQaiACEJQRIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakHcq5wBQQEQtw0CQCADLQAIQQRGDQAgAykDCCIG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IgY2AgggACgCFCEHIAAoAhAhCCACIAAoAgwiATYCACACIAYgAUECdCIJajYCECACIAI2AhggBiEKAkAgAUUNACAGIQEgBiEKA0AgASgCACEEAkACQCADQQFqIgMgAigCGCgCAEYNACAEIAIoAhwQ5gYiBEUNAQsgCiAENgIAIApBBGohCiACKAIUQQFqIQMLIAFBBGohASACIAM2AhQgCUF8aiIJDQALIAIgATYCCAsgCiAGayIDQQJ2IQEgAkEEahDsFiACQQRqEIYdAkACQCADQQhJDQBBAC0AoPGeARpBwAAQfSIDDQEACwJAAkAgCiAGRw0AQQAhAwwBCyAGKAIAIQNBACEBCyAGIAEQ8CIgBSAGEJ8tDAQLIAMgBzYCFCADIAg2AhAgAyABNgIMIAMgBjYCCCADIAU2AgQgA0EZNgIADAMLIAEtAAANASABQQE6AAALIAAhAwwCC0EAIQMCQCAEQXBqDgoBAAAAAAAAAAABAAsgABDIAQsgAEHAAEEIELMWCyACQSBqJAAgAwvcAwEFfyMAQYABayICJAACQAJAAkAgAS0AFEECRg0AIABBGjYCACAAIAEpAwA3AwggAEEYaiABQRBqKQMANwMAIABBEGogAUEIaikDADcDAAwBCyACQQhqIAEoAgAiA0EgaikDADcDACACQRBqIANBKGopAwA3AwAgAkEYakEIaiIEIANBCGopAwA3AwAgAiADKQMYNwMAIAIgAykDADcDGCADKAIUIQUgAygCECEGIAJBKGogAhDnBkEALQCg8Z4BGkHAABB9IgFFDQEgASACKQMoNwMAIAFBOGogAkEoakE4aikDADcDACABQTBqIAJBKGpBMGopAwA3AwAgAUEoaiACQShqQShqKQMANwMAIAFBIGogAkEoakEgaikDADcDACABQRhqIAJBKGpBGGopAwA3AwAgAUEQaiACQShqQRBqKQMANwMAIAFBCGogAkEoakEIaikDADcDACACQfgAaiAEKQMANwIAIABBADYCCCAAIAE2AiggACAFNgIkIAAgBjYCICAAQRQ2AgAgAiACKQMYNwJwIAAgAikCbDcCDCAAQRRqIAJB7ABqQQhqKQIANwIAIABBHGogAkHsAGpBEGooAgA2AgAgA0EwQQgQsxYLIAJBgAFqJAAPCwALhgQBBH8jAEHAAGsiAiQAAkACQAJA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DQAgC0UNBSAKIAxqIAUgBCAFEOslRQ0ACyABKAIcIQkgASAHNgIcIAcgCWshBwwCCyABIAk2AgwLIAFBAToAJQJAAkAgAS0AJEEBRw0AIAEoAiAhBSABKAIcIQkMAQsgASgCICIFIAEoAhwiCUYNAgsgBSAJayEHCyACQQo2AhwgAkEIaiACQRxqIAogCWoiAyAHENkkIAIoAggiCUUNACACKAIMIQcgAkENNgIcIAIgAkEcaiAJIAcQ2SQgAigCBCAHIAIoAgAiBRshByAFIAkgBRshAwsgACAHNgIEIAAgAzYCACACQSBqJAAPCyAFQQRBsLCcARDhLAAL0QMCCn8BfiMAQaABayICJAAgAiABKAIIIgNBCEEwQez1mwEQsBogASgCACEEIAIoAgAhBSACKAIEIQYgAUEANgIAIAEoAgQhByABQQg2AgQgAUEANgIIIAJBADYCFCACIAY2AhAgAiAFNgIMIAIgByADQTBsIghqIgk2AiQgAiAENgIgIAIgBzYCGCACQShqQQRyIQogACkCDCEMIAAoAhQhC0EAIQBBACEEIAchAwJAA0AgCCAARg0BAkAgAygCACIFQRNGDQAgAiAFNgIoAkBBLEUNACAKIANBBGpBLPwKAAALIAIgDDcCZCACIAs2AmwgAkEANgJgIAJCgICAgIABNwJYIAJBKGogAkHYAGoQ6gUCQEEwRSIFDQAgAkHwAGogAkEoakEw/AoAAAsCQCAEIAIoAgxHDQAgAkEMakH89ZsBEPQdIAIoAhAhBgsCQCAFDQAgBiAAaiACQfAAakEw/AoAAAsgA0EwaiEDIAIgBEEBaiIENgIUIABBMGohACACQdgAahDIKAwBCwsgByAAakEwaiEJCyACIAk2AhwgAkEYahCzHSABEMkoIAFBCGogAkEMakEIaigCADYCACABIAIpAgw3AgAgAkGgAWokAAvYAwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhIBERECAwQFBgcICQoLDA0ODxAACyAAQQRqENQDDwsgAEEEahDJKAwPCyAAQQRqENQDIABBCGoQtioPCyAAQQxqELcrDwsgACkDEBDGISAAQShqELYqDwsgACkDECAALQAkEO0oDwsgACkDECAALQAkEO0oDwsgAEEEahDUAyAAQQhqELYq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aiIHIANBCGoiCCgCADYCACABIAMpAgA3AwggAUEANgIcIAFCgICAgBA3AhQgABCNCxoDQAJAAkAgAygCACAGRg0AIAAQ+w8hCSAAEI0LGiAJQQpHDQELIAUgAykCADcCACABQcgAakEIaiIJIAcoAgA2AgAgBUEIaiAIKAIANgIAIAQgASkDCDcCACABQSBqQQhqIAFBFGpBCGooAgA2AgAgBEEIaiAJKQMANwIAIARBEGogAUHIAGpBEGopAwA3AgAgASABKQIUNwMgIAEgAkHkuoQBEOwjIAEoAgQhBwJAIAEoAgAiCSgCCCIIIAkoAgBHDQAgCRClHAsCQEEkRQ0AIAkoAgQgCEEkbGogAUEgakEk/AoAAAsgCSAIQQFqNgIIIAcgBygCAEEBajYCAAwCCyABQRRqIAkQwBcMAAsLCyABQeAAaiQAC+MDAQV/IwBBwABrIgAkAAJAAkACQEEALQDY654BQQJHDQBBACgC3OueASEBQQBBADYC3OueASABRQ0BIABBKGogAREDACAAQRBqQRBqIgIgAEEoakEQaigCADYCACAAQRBqQQhqIgMgAEEoakEIaikCADcDACAAQQxqQQJqIgQgAEE/ai0AADoAACAAIAApAig3AxAgACAALwA9OwEMIAAtADwhAQJAAkBBAC0A2OueAUECRw0AQQAgACkDEDcCxOueAUEAIAE6ANjrngFBACAALwEMOwDZ654BQQAgAigCADYC1OueAUEAIAMpAwA3AszrngFBACAELQAAOgDb654BDAELIAFB/wFxQQJHDQMLIABBAjoAPCAAQShqEJ8jCyAAQcAAaiQADwsgAEEANgI4IABBATYCLCAAQbCMngE2AiggAEIENwIwIABBKGpBmI2eARDpIwALIABBP2ogAEEOai0AADoAACAAQShqQQhqIABBEGpBCGopAwA3AwAgAEEoakEQaiAAQRBqQRBqKAIANgIAIAAgAC8BDDsAPSAAIAApAxA3AyggACABOgA8IABBKGoQnyMgAEEANgI4IABBATYCLCAAQbiNngE2AiggAEIENwIwIABBKGpBwI2eARDpIwALnAMCCX8EfiMAQTBrIgIkACABQQF2IAFqIQMCQANAIANFDQECQAJAIANBf2oiAyABSQ0AIAMgAWshBAwBCyAAIANBHGxqIgVBCGoiBCkCACELIAVB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AAAgAyEBCyACKAIEIQMgACABOgAAIAAgAzYCBCACQSBqJAALogMCCn8BfiMAQeAAayIDJAACQCABKAIMIgQgASgCBCIFa0EEdiIGIAAoAgAgACgCCCIHa00NACAAIAcgBkEIQdgAENsdIAAoAgghBwsCQCAFIARGDQAgACgCBCAHQdgAbGohBiADQQhqQShqIQggA0E8aiEJIANBxQBqIgpBBGohCwNAIAEgBUEQaiIMNgIEIAUpAwAhDSAJQgA3AgAgCUEIakEAOgAAIApBADYAACALQQA7AAAgA0IANwMYIANCATcDECADQQA2AjAgA0IANwMoIANBADYCCCADQQM6AEsgA0IENwI0IANB0ABqQQhqIgUgCEEIaigCADYCACADIAgpAwA3A1AgA0EIahC0DiAGQShqQgA3AgAgBkEYakIANwIAIAZBEGogDTcCACAGQQhqQQA2AgAgBkEHNgIAIAZBMGogAykDUDcCACAGQThqIAUoAgA2AgAgBkE8akIANwIAIAZBwwBqQgA3AAAgBkHLAGpBAzoAACAGQdgAaiEGIAdBAWohByAMIQUgDCAERw0ACwsgACAHNgIIIANB4ABqJAALrAMCA38BfiMAQSBrIgMkACABKAIIIQQgA0EQaiACIAEoAgQiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEJIjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakGEnJwBQQEQtw0gAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogASACEM4tAkAgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFENACAAIAY3AgAMAQsgAigCACEBIAJBADYCAAJAIAItADwNACACKAIEIQUgAigCKCACKAIQIAIoAhQQjgkCQCACKAI4RQ0AIAJBADYCNCACIAIoAjBBAWo2AjALIAJBAToAPCABRQ0AIAIgBRDFBQsCQAJAIARFDQAgA0EQaiACIAQQkiMgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFINAQsgAEEEOgAADAELIAAgBjcCAAsgA0EgaiQAC/QDAQJ/AkACQAJAAkAC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KAIAIgNFDQAgBEEIaigCACEBIANBKGwhAwNAIAEgABDHByABQShqIQEgA0FYaiIDDQALCyAEQShqIgQgBUcNAAsLIAItADxBBkYNASAAIAJBEGoQsQoPCyABKAIMIgNFDQAgASgCCCEBIANBKGwhAwNAIAEgABDPCSABQShqIQEgA0FYaiIDDQALCwvzAgELfyAAQRhBJCAAKAIoIAAoAhxJIAAoAiQiAiAAKAIYIgNJIAIgA0YbIgMbaiIEIAAgACgCECAAKAIESSAAKAIMIgIgACgCACIFSSACIAVGGyIFQQFzQQxsaiICIABBJEEYIAMbaiIDIAMoAgQgACAFQQxsaiIAKAIESSADKAIAIgUgACgCACIGSSAFIAZGGyIHGyAEKAIEIAIoAgRJIAQoAgAiBSACKAIAIgZJIAUgBkYbIggbIgUoAgQhCSAAIAMgAiAIGyAHGyIGKAIEIQogBSgCACELIAYoAgAhDCABQQhqIAMgACAHGyIAQQhqKAIANgIAIAEgACkCADcCACABIAUgBiAJIApJIAsgDEkgCyAMRhsiABsiAykCADcCDCABQRRqIANBCGooAgA2AgAgAUEgaiAGIAUgABsiAEEIaigCADYCACABIAApAgA3AhggASACIAQgCBsiACkCADcCJCABQSxqIABBCGooAgA2AgALpwMBBH8jAEEgayIDJAACQAJAIAItAAwiBEEBRw0AIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyADIAIQ7SYgACADKQIANwIAIANBAiADLQAMazoADCAAQQhqIANBCGopAgA3AgAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggiAhDCIEH/AXEOAgIDAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIAMgAigCBCACKAIIEPQKIAAgBSADQRRqEN8XDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiAGIAIgAxDDBSAAQQIgBWsgA0EUahDfFwwDCyAAQQhqQQApAoyZggE3AgAgAEEAKQKEmYIBNwIADAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiADIAYg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AwsgAygCKCADKAIEIAMoAghBkeqZAUEpENkOGgwBCyADKAIoIAMoAgQgAygCCEHb6ZkBQTYQ2Q4aCyAAIAMpAiQ3AgAgAEEIaiADQSRqQQhqKAIANgIAAkAgAygCGCIAQYCAgIB4Rg0AIAAgARDfLwsgAxDdBwwBCyABEMwuCyADQTBqJAALgwMBBX8jAEHQAGsiAyQAIAEoAgwoAgAhBCABKAIULQAAIQUgASgCGC0AACEGIAEoAhAhByADQTBqQQhqIAFBCGooAgA2AgAgAyAHNgJAIAMgBjoALyADIAU6AC4gAyAENgIoIAMgASkCADcDMCACKAKIASIEQYABcSEBIAMgA0EvajYCTCADIANBKGo2AkggAyADQS5qNgJEIAMgA0EvajYCPAJAAkAgBQ0AAkAgAUUNACACIARB/35xNgKIASADQSBqIANBMGogAhCrDyADKAIgIQEgAiACKAKIAUGAAXI2AogBIAMoAiQhAgwCCyADQRhqIANBMGogAhCrDyADKAIcIQIgAygCGCEBDAELAkAgAQ0AIAIgBEGAAXI2AogBIANBCGogA0EwaiACEKwPIAMoAgghASACIAIoAogBQf9+cTYCiAEgAygCDCECDAELIANBEGogA0EwaiACEKwPIAMoAhQhAiADKAIQIQELIAAgAjYCBCAAIAE2AgAgA0HQAGokAAuDAwEFfyMAQdAAayIDJAAgASgCDCgCACEEIAEoAhQtAAAhBSABKAIYLQAAIQYgASgCECEHIANBMGpBCGogAUEIaigCADYCACADIAc2AkAgAyAGOgAvIAMgBToALiADIAQ2AiggAyABKQIANwMwIAIoAogBIgRBgAFxIQEgAyADQS9qNgJMIAMgA0EoajYCSCADIANBLmo2AkQgAyADQS9qNgI8AkACQCAFDQACQCABRQ0AIAIgBEH/fnE2AogBIANBIGogA0EwaiACEKoPIAMoAiAhASACIAIoAogBQYABcjYCiAEgAygCJCECDAILIANBGGogA0EwaiACEKoPIAMoAhwhAiADKAIYIQEMAQsCQCABDQAgAiAEQYABcjYCiAEgA0EIaiADQTBqIAIQrQ8gAygCCCEBIAIgAigCiAFB/35xNgKIASADKAIMIQIMAQsgA0EQaiADQTBqIAIQrQ8gAygCFCECIAMoAhAhAQsgACACNgIEIAAg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AgBBiO6YAUEOIAEoAgQoAgwRCwAhAQwECyABKAIAQZbumAFBESABKAIEKAIMEQsAIQEMAwsgASgCAEGn7pgBQQcgASgCBCgCDBELACEBDAILIAIgAzYCDCABQa7umAFBBSACQQxqQZICEP8LIQEMAQsgASgCAEGz7pgBQQkgASgCBCgCDBELACEBCyACQRBqJAAgAQuCAwINfwF+IwBB4ABrIgEkABCFKCECIAAoAhghAyAAKAIUIQQgACgCECEFIAAoAgQhBiAAKAIAIQcCQAJAIAApAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNAQsgAC0ARCEJIAAtABwhCgJAAkAgACgCICILDQBBACEIDAELEIAoIQggCygCDCEMIAsoAhAhDSABIAsQ4QYgCEEQaiANNgIAIAggASkCADcCACABIAw2AgwgCEEIaiABQQhqKQIANwIACyABQThqIABBOGoQ0QUgACgCMCELIAAoAjQhDCABQcwAaiAAQSRqEJcBIAFBNGogDDYCACABIAs2AlggAUEsaiABQdQAaikCADcCACABIAk6AEQgASAKOgAcIAEgAzYCGCABIAQ2AhQgASAFNgIQIAEgDjcDCCABIAY2AgQgASAHNgIAIAEgCDYCICABIAEpAkw3AiQCQEHIAEUNACACIAFByAD8CgAACyABQeAAaiQAIAIPCwAL0wQCBH8BfiMAQRBrIgEkACABQQhBCEHAABCjEiABKAIEIQICQAJAIAEoAgAiAw0AIAE1AgghBQwBCyABKQIIIQUgAkEJaiIERQ0AIANB/wEgBPwLAAsgAUEIaiIEIAU3AgAgASACNgIEIAEgAzYCACABQtHEyauW7BoQwgYgAULBxoWb1wwQwgYgAULRxoWjt4waEMIGIAFC0caxi7buHBDCBiABQtHGvfO2jh0QwgYgARDsHxDCBiABEO0fEMIGIAFC8ciVs5asnbb0ABDCBiABQuHIlePWjN0yEMIGIAFCoci9AxDCBiABQsHKsZvXDBDCBiABQsHKuavXDRDCBiABQuHK4YP3zZw6EMIGIAFC8crho9fMm7LzABDCBiABQtHMheO2rhkQwgYgAULxzKXzloybtvkAEMIGIAFCscy9kwcQwgYgARDuHxDCBiABQqHSmQMQwgYgAULh0rWD982cOhDCBiABQqHS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rYQ3AzggByAHQThqNgJgIAdB2ABqIAYQ6SMAC4YDAQR/IwBBIGsiBCQAAkACQCABKAIgDQAgAUF/NgIgIAIgASgCPCIFTw0BIAEoAlghBkEEIQcCQAJAAkACQAJAAkACQAJAIAEoAjggAkEEdGoiAigCAA4KBQUABQQEAQIGBgULIARBADYCGCAEQQE2AgwgBEHwgYQBNgIIIARCBDcCECAEQQhqQfiBhAEQ6SMACwJAIAIoAgwiByACKAIERw0AIAJBBGpBiIKEARCSHAsgAigCCCAHQQJ0aiADNgIAIAIgB0EBajYCDAwBCwJAIAIoAgwiByACKAIERw0AIAJBBGpBmIKEARCSHAsgAigCCCAHQQJ0aiADNgIAIAIgB0EBajYCDAsgASAGQQRqIgI2AlggASgCLEEBRw0CIAVBBHQgAmogASgCMCICTQ0CIAAgAjYCBCAAQSc2AgAMAwtBDCEHCyACIAdqIAM2AgALIABBKjYCAAsgASABKAIgQQFqNgIgIARBIGokAA8LQdyfhAEQ0hoACyACIAVBvIGEARCRFQALgAMBBH8CQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBQQGAAsgACkDCCAAKAIYIAEQgiMPCwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0ACQCADKAIAQQdGDQAgAyABELYICyADQShqIQMgAkFYaiICDQALCyAAKAIYIgNFDQIgAygCACABEKgBDwsgACgCBCABELYIIAAoAhgiA0UNASADKAIAIAEQqAEPCwJAIAAoAgwiA0UNACAAKAIIIQQgA0E4bCEFQQAhAwNAAkACQAJAAkAgBCADaiICKAIADgMAAQIACyACQQhqIAEQrCggAkEoaigCACABELYIDAILIAEgAkEQaikDACACQSBqKAIAEIUjDAELIAJBBGooAgAgARC2CCACQRhqKAIAIgJFDQAgAigCACABEKgBCyAFIANBOGoiA0cNAAsLIAAoAhgiA0UNACADKAIAIAEQqAELDwsgACgCBCABELYIIAAoAgggARClAQ8LIAAoAgQgARClAQuHAwEFfyMAQcABayIBJABBACECAkAgAC0AkQFBIHFFDQAgACgCiAEhAyABQRBqIAAQ3QEgACADQQFyEKgSAkACQAJAIAAtAOABQT5GDQBBACECIAFBCGogAEEAQQEQ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CGoQkS4MAQsgA0EIakG8h4gBQZwGEI0NCyADQThqIAEoAgQgASgCCCACIANBCGoQ1BMgA0EoakEIaiIBIANBOGpBDGopAgA3AwAgAyADKQI8NwMoAkAgAygCOCIEQYCAgIB4Rg0AIAAgAykCTDcCFCAAQSRqIANBOGpBJGooAgA2AgAgAEEcaiADQThqQRxqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAQLIANBGGpBCGogASkDADcDACADIAMpAyg3AxggAi0AGQ0BDAILQeDuhAFBKEGI74QBENIeAAsgA0EYahCDCgsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC+kCAQZ/IwBBEGsiASQAAkACQAJAAkAgACgCACICRQ0AQQAhAwNAAkAgACgCCCIEIAAoAgQiBU8NACACIARqLQAAQcUARw0AIAAgBEEBajYCCAwCCwJAAkACQAJAIANFDQAgACgCECIGRQ0AIAZB4p6aAUECEIIGDQcgACgCACICRQ0BIAAoAgghBCAAKAIEIQULIAQgBU8NAAJAIAIgBGotAABBtX9qDgICAAELIAAgBEEBajYCCCABIAAQgwggAS0AAA0FIAAgASkDCBDcDQ0GDAILIAAQ/wINBQwBC0EBIQIgACAEQQFqNgIIIABBABCMAg0FCyADQX9qIQMgACgCACICDQALC0EAIQIMAgsgAS0AASEEAkAgACgCECIDRQ0AQQEhAiADQczjlwFBvOOXASAEQQFxIgUbQRlBECAFGxCCBg0CCyAAIAQ6AARBACECIABBADYCAAwBC0EBIQILIAFBEGokACACC+ICAgR/AX4jAEHAAGsiAiQAIAIgATYCDAJAAkACQCABRQ0AIAIgACgCAEEIakH885gBEOwjIAIoAgQhAyACQShqIAIoAgAgARDyCSACQShqEJwPIQQQ1SAhBiACQgA3AxggAkEBOgAgIAIgBjcDECAEKAIIQRhsIQEgBCgCBCEAA0AgAUUNAiABQWhqIQEgACACQRBqEJMMIQUgAEEYaiEAIAVFDQALIAIpAxAiBkIDg0IAUg0CIAanIgEgASgCACIAQX9qNgIAIABBAUcNAiABIAEoAhAQxiQMAgsgAkIANwI0IAJCgYCAgMAANwIsIAJBxPSYATYCKCACQQxqIAJBKGoQwiEACyACQShqQRBqIAJBEGpBEGopAwA3AwAgAkEoakEIaiACQRBqQQhqKQMANwMAIAIgAikDEDcDKCAEIAJBKGpBjPSYARDIFwsgAyADKAIAQQFqNgIAIAJBwABqJAAL2wICBn8BfiMAQSBrIgIkACACQRBqIAEoAgwiAyABKAIEIgRrQQR2QQhBOBCVDyACKAIUIQUCQCACKAIQQQFGDQBBACEGIAJBADYCDCACIAIoAhgiBzYCCCACIAU2AgQgASgCACEFIAIgASgCCDYCGCACIAU2AhAgAiAENgIUIAIgAzYCHAJAIAQgA0YNAEEAIQYDQCAEQQhqKAIAIQEgBCkDACEIIAdBIGpCADcCACAHQRxqQQA6AAAgB0EYaiABNgIAIAdBEGpCADcCACAHQQhqIAg3AgAgB0EANgIAIAdBKGpCADcCACAHQS1qQgA3AAAgB0E4aiEHIAZBAWohBiAEQRBqIgQgA0cNAAsgAiAENgIUCyACQQRqQQhqIgcgBjYCACACQRBqELUTIABBCGogBygCADYCACAAIAIpAgQ3AgAgAkEgaiQADwsgBSACKAIYQeiymwEQjikAC+ECAQJ/IwBBMGsiBiQAAkACQAJAAkACQAJAIAEoAhwiBw0AIAUgA0sNAiAGQQhqIAEgAiAFIAQQ/wQMAQsgBSAESQ0CIAUgA0sNAwJAIAUgBGsgASgCKEkNACAGQRhqIAcgASgCICIBKAIIQX9qQXhxakEIaiACIARqIAIgBWogASgCEBENAAJAIAYoAhgNACAGQQA2AggMAgsgBigCICACayIFIAYoAiQgAmsiAUsNBSAGIAE2AhAgBiAFNgIMIAZBATYCCAwBCyAGQQhqIAEgAiADIAQgBRD9JAtBACEFAkAgBigCCEEBRw0AIAAgBikCDDcCBEEBIQULIAAgBTYCACAGQTBqJAAPCyAFIANBkJaEARDhLAALIAQgBUGAloQBEOIsAAsgBSADQYCWhAEQ4SwACyAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakGElYQBEOkjAAvtAgIFfwJ+IwBBEGsiASQAAkACQAJAAkACQCAAKAIADQAgACgCECIADQFBACECDAQLIAEgAEHHABCbDwJAIAEtAABBAUcNACABLQABIQMCQCAAKAIQIgRFDQBBASECIARBzOOXAUG845cBIANBAXEiBRtBGUEQIAUbEIIGDQULIAAgAzoABEEAIQIgAEEANgIADAQLAkAgACgCECICRQ0AIAEpAwgiBlANAyACQeXjlwFBBBCCBg0CQgAhBwNAAkAgBiAHUg0AIAAoAhAiA0UNBUEBIQIgA0Hp45cBQQIQggZFDQUMBgsCQCAHUA0AIAAoAhAiAkUNACACQeKemgFBAhCCBg0EC0EBIQIgACAAKAIUQQFqNgIUIAdCAXwhByAAQgEQ3A1FDQAMBQsLIAAQkwQhAgwDCyAAQaeZnAFBARCCBiECDAILQQEhAgwBCyAAEJMEIQIgACAAKAIUIAanazYCFAsgAUEQaiQAIAIL+AIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyACIAEoAggQgCcPCyACIAEoAgQQgCcPCyABKAIEIgNBwABqIAIQxAoCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCAJwwDCyACIAEoAgAQgCcMAgsgASACEKEPDAELIAEgAhDeEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIAIgA0EQahD1CQ8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCAJwwDCyACIAEoAgAQgCcMAgsgAiABKAIAEMIJDAELIAEgAhDvCwsgAUEoaiEBIABBWGoiAA0ACwsL+AIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyACIAEoAggQpwEPCyACIAEoAgQQpwEPCyABKAIEIgNBwABqIAIQqQsCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCnAQwDCyACIAEoAgAQpwEMAgsgASACEKMPDAELIAEgAhDgEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIAIgA0EQahD0DA8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCnAQwDCyACIAEoAgAQpwEMAgsgAiABKAIAEMMJDAELIAEgAhDwCwsgAUEoaiEBIABBWGoiAA0ACwsLvAIBBX8gACABaiECA0ACQCAAIAIiA0cNAEEADwsCQCADQX9qIgIsAAAiAUF/Sg0AAkACQCADQX5qIgItAAAiBMAiBUFASA0AIARBH3EhBAwBCwJAAkAgA0F9aiICLQAAIgTAIgZBQEgNACAEQQ9xIQQMAQsgA0F8aiICLQAAQQdxQQZ0IAZBP3FyIQQLIARBBnQgBUE/cXIhBAsgBEEGdCABQT9xciEBCwJAIAFBd2oiBEEXSw0AQQEgBHRBn4CABHENAQsCQCABQYABSQ0AAkAgAUEIdiIERQ0AAkACQCAEQTBGDQAgBEEgRg0BIARBFkcNAyABQYAtRg0EDAMLIAFBgOAARg0DDAILIAFB/wFxQdC8nAFqLQAAQQJxDQIMAQsgAUH/AXFB0LycAWotAABBAXENAQsLIAMgAGsLlAMBAn9BCCECAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBgICAgHhzIgNBFSADQRVJGw4WAAECAwQFBgcICQoLDA0ODxQUEBESEwALIAAgAS0ABDoAAUEAIQIMEwsgACABMQAENwMIQQEhAgwSCyAAIAEzAQQ3AwhBASECDBELIAAgATUCBDcDCEEBIQIMEAsgACABKQMINwMIQQEhAgwPCyAAIAEwAAQ3AwhBAiECDA4LIAAgATIBBDcDCEECIQIMDQsgACABNAIENwMIQQIhAgwMCyAAIAEpAwg3AwhBAiECDAsLIAAgASoCBLs5AwhBAyECDAoLIAAgASsDCDkDCEEDIQIMCQsgACABKAIENgIEQQQhAgwICyAAIAEpAwg3AgRBBSECDAcLIAAgASkCBDcCBEEFIQIMBgsgACABKQMINwIEQQYhAgwFCyAAIAEpAgQ3AgRBBiECDAQLQQchAgwDC0EJIQIMAgtBCiECDAELQQshAgsgACACOgAAC/YCAQJ/IAAoAgAhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgAiABKAIIEJ4DDwsgAiABKAIEEJ4DDwsgASgCBCIDQcAAaiACEK4LAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyACIAFBBGooAgAQngMMAwsgAiABKAIAEJ4DDAILIAEgAhDBDwwBCyABIAIQ2xILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEKcoDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAiABQQRqKAIAEJ4DDAMLIAIgASgCABCeAwwCCyACIAEoAgAQzAkMAQsgASACEPoLCyABQShqIQEgAEFYaiIADQALCwvwAgECfyAAKAIAIQICQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAIgASgCCBBUDwsgAiABKAIEEFQPCyABKAIEIgNBwABqIAIQqAsCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABBUDAMLIAIgASgCABBUDAILIAEgAhDCDwwBCyABIAIQ3BILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEKcoDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAiABQQRqKAIAEFQMAwsgAiABKAIAEFQMAgsgAiABKAIAEMsJDAELIAEgAhD5CwsgAUEoaiEBIABBWGoiAA0ACwsL9gIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyABKAIIIAIQvgMPCyABKAIEIAIQvgMPCyABKAIEIgNBwABqIAIQrwsCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAFBBGooAgAgAhC+AwwDCyABKAIAIAIQvgMMAgsgASACEMMPDAELIAEgAhDdEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIANBEGoQnxoPCyABKAIMIgBFDQAgAEEobCEAIAEoAghBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQvgMMAwsgASgCACACEL4DDAILIAIgASgCABDNCQwBCyABIAIQ+AsLIAFBKGohASAAQVhqIgANAAsLC8sCAgJ/An4CQAJAAkACQCAAKQMAIgNCfnwiBEICIARCAlQbpw4CAQIACyAAQQhqIQECQAJAIANCAFINACABKQMAIgRCA4NCAFINASAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIAEQyBMLIAApAyAiBEICUQ0CIABBKGohAAJAIARCAFINACAAKQMAIgRCA4NCAFINAyAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgABDIEw8LIABBEGohAQJAIAAoAggNACABKQMAIgRCA4NCAFINAiAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEMYkDwsgARDIEw8LIAApAwgiBEIDg0IAUg0AIASnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC/YCAQJ/IAAoAgAhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCACEKQCDwsgASgCBCACEKQCDwsgASgCBCIDQcAAaiACEM4KAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQpAIMAwsgASgCACACEKQCDAILIAEgAhDEDwwBCyABIAIQ3xILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEKcoDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAUEEaigCACACEKQCDAMLIAEoAgAgAhCkAgwCCyACIAEoAgAQ0gkMAQsgASACEPsLCyABQShqIQEgAEFYaiIADQALCwv2AgECfyAA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IAEgASgCiAFBgAFyNgKIASAGKAIkIQEMAgsgBkEYaiAGQTBqIAEQqQ8gBigCHCEBIAYoAhghAgwBCwJAIAINACABIANBgAFyNgKIASAGQQhqIAZBMGogARCvDyAGKAIIIQIgASABKAKIAUH/fnE2AogBIAYoAgwhAQwBCyAGQRBqIAZBMGogARCvDyAGKAIUIQEgBigCECECCyAAIAI2AgAgACABNgIEIAZB0ABqJAALzQICA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEI4jIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakG4g5wBQQEQsQ0gAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogAiAFIAFBABDiBgJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBEGogAiAEEI4jIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBIGokAAvKAgIIfwF+IwBBwABrIgIkACABKAIEIQMgAiABKAIIIgRBCEHAABCVDyACKAIEIQUCQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACAEQQZ0IQcgAkEwaiEIIAYhASAFIQkDQCAHRQ0BIAMpAyghCiAIIANBMGoQ7QggAiADELwCIAFBKGogCjcDACACQShqIAo3AwAgASACKQMANwMAIAFBCGogAkEIaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBIGogAkEgaikDADcDACABQTBqIAgpAwA3AwAgAUE4aiACQThqKQMANwMAIAFBwABqIQEgB0FAaiEHIANBwABqIQMgCUF/aiIJDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQcAAaiQADwsgBSACKAIIQbTymgEQjikAC+ACAQR/IAAtACYhAiAAQQA6ACYCQCABKAIIIgNFDQAgASgCBCEBIANBDGwhAwNAAkACQCABKAIA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QQhqKQMANwMADAILIAEoAgQhAxD6JyEBIAIgAxBCIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwAgAEECNgIAIAAgATYCBAwBCyAAQQM2AgALIAJBwABqJAAPCwALrAICA38BfiMAQdAAayIBJABBCiECAkACQCAAKAKoAUEKRg0AIABByAFqIQAMAQsgAEGoAWohAyAAKQMIIQQgAEEJNgIIIAFBEGogAEEYaikDADcDACABQQhqIABBEGopAwA3AwAgASAENwMAIAFBHGogABCPFwJAIAEtACVBAkYNACAAKAIIIQIgAEEJNgIIIAFBKGpBHGogAUEcakEIaigCADYCACABQShqQQhqIABBFGopAgA3AwAgAUEoakEQaiAAQRxqKAIANgIAIAEgASkCHDcCPCABIAApAgw3AygLIAMQnCogACACNgKoAQJAQSRFDQAgAEGsAWogAUEoakEk/AoAAAsgACABEL8dQQAgAEHIAWogACgCqAFBCkYbIQALIAFB0ABqJAAgAAu7AgIHfwF+IwBBIGsiAyQAIANBEGogARDcDiADKAIYIQQCQAJAIAMpAxAiCkIAUg0AQQEhBQwBCyADKAIcIQZBASEFIANBCGogAUEBQQAQqRogAygCDCEHAkACQAJAIAMoAghBAXFFDQAgByEEDAELIAMgAUEXQdyrnAFBARDHECADKAIEIQgCQAJAIAMoAgBBAXFFDQAgCCEEDAELIAMgCDYCECABEMgSIglFDQIgA0EQahD4BiAJIQQLIAcQmSwLIAoQxiEMAQsgASgC1AEhCUEAIQVBMEEIEJoqIgFBADoAKCABIAg2AiQgASAHNgIgIAFBADoAHCABQQA2AhggASAGNgIUIAEgBDYCECABIAo3AwggASAJNgIEIAEgAjYCACABIQQLIAAgBDYCBCAAIAU2AgAgA0EgaiQAC8ECAQN/IwBBMGsiAyQAAkAgASAAKAKIAUEIcUEDdhCHEg0AIANBEGogARDJAyADKAIUIQQgAygCECEFIANBqoGAgHg2AhggACAFIAQgA0EYahDeIwsCQCAALwGQAUGA0ABxQYDAAEcNAAJAIAEoAgAiBEEaRw0AIAFBCGoQ6wtFDQAgAyABEMkDIAMoAgQhBCADKAIAIQUgA0GGgYCAeDYCGCAAIAUgBCADQRhqEM4ODAELIAEgACgCiAFBCHFBA3YQhxINACABIQUCQAJAA0ACQCAEQSNGDQACQCAEQWlqDgUDBAQEBQALIARBEkcNAwwECyAFKAIEIgUoAgAhBAwACwsgAkUNAQsgA0EIaiABEMkDIAMoAgwhBCADKAIIIQUgA0GqgYCAeDYCGCAAIAUgBCADQRhqEN4jCyADQTBqJAALvgIBBH8jAEEgayICJAACQAJAAkACQANAAkAgASgCAA4HAgMABAAFBQILIAEoAgQhAQwACwsgAUEIahDrC0UNAiABKAIUIQMgASgCECEBIAJBqYCAgHg2AgggACABIAMgAkEIahDODgwCCyABKAIMQShsIQMgASgCCCEBA0AgA0UNAgJAIAEoAgBBB0YNACAAIAEQ2wkLIAFBKGohASADQVhqIQMMAAsLIAEoAgxBOGwhAyABKAIIIQEDQCADRQ0BQSghBAJAAkACQAJAIAEoAgAOAwECAAELQQQhBAsgACABIARqKAIAENsJDAELIAFBEGoQ6wtFDQAgAUEcaigCACEEIAFBGGooAgAhBSACQamAgIB4NgIIIAAgBSAEIAJBCGoQzg4LIAFBOGohASADQUhqIQMMAAsLIAJBIGokAAvAAgEGfyMAQSBrIgMkACADIAE2AgwgA0EQaiABEK4XAkACQAJAAkACQAJAAkAgAygCECIEQYCAgIB4Rg0AQQAhBQJAAkAgAygCFCIGIAMoAhgiB0H004ABQQoQ4yVFDQBBACEIDAELAkAgBiAHQf7TgAFBCRDjJUUNAEEBIQgMAQtBASEFIAYgB0GI1IABQQIQmRMhBwsgBCAGEM8sIAEQ3CogBQ0BIAMgAjYCEAJAIAIQ1SwiAQ0AIANBEGogA0EfakHoxZgBEO4GIQYLIAIQ3CpBASECIAhBAXFFDQIgAQ0DDAQLIANBDGogA0EfakGQzYABEO4GIQcgARDcKgsgAhDcKiAAIAc2AgQMAwtBACECIAFFDQELIAAgAjoAAUEAIQEMAgsgACAGNgIEC0EBIQELIAAgAToAACADQSBqJAALugICBH8BfiMAQTBrIgEkAAJAIAAoAgQiAkUNACAAKAIAIQMCQCAAKAIMIgRFDQAgAykDACEFIAEgBDYCKCABIAM2AiAgASADIAJqQQFqNgIcIAEgA0EIajYCGCABIAVCf4VCgIGChIiQoMCAf4M3AxBBASECAkADQCACRQ0BAkADQCABQQhqIAFBEGoQiBwgASgCCEEBcQ0BIAEgASgCIEFgajYCICABIAEoAhgiA0EIajYCGCABIAMpAwBCf4VCgIGChIiQoMCAf4M3AxAMAAsLIAEoAiAgASgCDEECdGtBfGooAgAiAyADKAIAIgRBf2o2AgAgASABKAIoQX9qIgI2AiggBEEBRw0AIAMgAygCEBDGJAwACwsgACgCBCECIAAoAgAhAwsgAyACQQRBCBCJHAsgAUEwaiQAC64CAQR/IwBBIGsiAyQAAkACQAJAAkACQAJAIAAtAKwNQQFGDQAgACkDAEIChSAAKQMIhFANBCABKALIBEECRg0BIAFB2AFqIQQCQAJAAkAgACgCgAUiBS0A4gINACADQRRqIAAgBCACEE8gAygCFCIEQQJHDQEMBQsgBS0A4wIhBiADQRRqIAAgBCACEE8gAygCFCIFQQJGDQQgBUEBcSIFRQ0BIAZBAXFFDQEgA0EIaiACIAMoAhggAygCHCIFIAUgACAEEL4GIAMoAggiBUECRw0BIAMoAgwhBAwFCyAEQQFxIQULIAVBAEchAAwFC0GgppwBQShB9KKDARDSHgALQZSigwEQ0iwACyADKAIYIQQLIAQQ0xMaCyAAIAEgAhDoBSEACyADQSBqJAAgAAuwAgIGfwJ+IANCGYhCgYKEiJCgwIABfiEMIAIgA6dxIQZBACEHQQAhCAJAA0AgASAGaikAACINIAyFIgNCf4UgA0L//fv379+//358g0KAgYKEiJCgwIB/gyEDAkADQCADUA0BQQAhCSAEIAN6p0EDdiAGaiACcSIKIAURBwANAyADQn98IAODIQMMAAsLIA1CgIGChIiQoMCAf4MhAwJAAkACQCAIQQFGDQACQCADUA0AIAN6p0EDdiAGaiACcSELDAELQQAhCAwBCyADIA1CAYaDQgBSDQFBASEICyAGIAdBCGoiB2ogAnEhBgwBCwtBASEJAkAgASALaiwAAEEATg0AIAshCgwBCyABKQMAQoCBgoSIkKDAgH+DeqdBA3YhCgsgACAKNgIEIAAgCTYCAAu1AgECfwJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIEQQFHDQMgACgCCCABEIIDDwsgACgCBCABEIIDDwsgACgCBCICQcAAahCtKAJAIAJBhAFqKAIAIgNFDQAgAkGAAWooAgAhACADQdgAbCEDA0ACQAJAAkAgACgCAEF8ag4CAgABCyAAQQRqKAIAIAEQggMMAQsgASAAEOgHCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgAkGYAWooAgAiA0UNACACQZQBaigCACEAIANBKGwhAwNAIAAgARDgCSAAQShqIQAgA0FYaiIDDQALCyACLQA8QQZGDQEgAkEQahCtKA8LIAAoAgwiA0UNACAAKAIIIQAgA0EobCEDA0AgACABEM0HIABBKGohACADQVhqIgMNAAsLC5QCAQZ/QQEhAwJAIAAoAggiBCABRg0AIAAoAgQiAyABQThsaiEFIAIoAgQgAigCACIGayEHIAMgBEE4bGohBCAGQThsIAJqQQxqIQEDQEEAIQMgB0UNASACIAZBAWoiBjYCACABQXxqKAIAIghBCkYNASAEIAg2AgAgBEEEaiABKQIANwIAIARBDGogAUEIaikCADcCACAEQRRqIAFBEGopAgA3AgAgBEEcaiABQRhqKQIANwIAIARBJGogAUEgaikCADcCACAEQSxqIAFBKGopAgA3AgAgBEE0aiABQTBqKAIANgIAQQEhAyAAIAAoAghBAWo2AgggB0F/aiEHIAFBOGohASAEQThqIgQgBUcNAAsLIAMLrAICCH8BfiMAQRBrIgEkAAJAIAAoAhAiAkUNACAAKAIMIQMCQCAAKAIYIgRFDQAgA0EIaiEFIAMpAwBCf4VCgIGChIiQoMCAf4MhCSADIQZBASEHA0AgB0UNAQJAA0AgCUIAUg0BIAZBgH9qIQYgBSkDAEJ/hUKAgYKEiJCgwIB/gyEJIAVBCGohBQwACwsgBiAJeqdBAXRB8AFxayIHQXhqIggoAgAgB0F8aigCABDHFyAHQXRqKAIAIAgoAgAQmi0gCUJ/fCAJgyEJIARBf2oiBCEHDAALCyABQQRqQRBBCCACQQFqENoRIAMgASgCDGsgASgCBCABKAIIEJMpCwJAIABBf0YNACAAIAAoAgRBf2oiBTYCBCAFDQAgAEEcQQQQsxYLIAFBEGokAAuhAgEBfyMAQRBrIgIkACAAKAIAIQACQAJAIAEtAAtBGHENACABKAIAIAAgASgCBCgCEBEHACEADAELIAJBADYCDAJAAkACQCAAQYABSQ0AIABBgBBJDQECQCAAQYCABEkNACACIABBP3FBgAFyOgAPIAIgAEESdkHwAXI6AAwgAiAAQQZ2QT9xQYABcjoADiACIABBDHZBP3FBgAFyOgANQQQhAAwDCyACIABBP3FBgAFyOgAOIAIgAEEMdkHgAXI6AAwgAiAAQQZ2QT9xQYABcjoADUEDIQAMAgsgAiAAOgAMQQEhAAwBCyACIABBP3FBgAFyOgANIAIgAEEGdkHAAXI6AAxBAiEACyABIAJBDGogABCCBiEACyACQRBqJAAgAAumAgIKfwF+IwBBEGsiAiQAIAEoAgAiAy8BMiEEELAmIgUgASgCCCIGQX9zIAMvATIiB2oiCDsBMiADQQRqIgkgBkECdGooAgAhCiACQQhqIAggBUEEahC+JCAJIAZBAWoiC0ECdGogByALayACKAIIIAIoAgwQtCIgCBDkJiIIIAgQ6ScgAyAGOwEyIAUvATIiB0EBaiEIAkACQCAHQQxPDQAgBCAGayAIRw0BAkAgCEECdCIIRQ0AIAVBNGogAyAGQQJ0akE4aiAI/AoAAAsgAiAFIAEoAgQiBhCAFCACKQMAIQwgACAKNgIQIAAgBjYCBCAAIAM2AgAgACAMNwIIIAJBEGokAA8LIAhBDEHIvZsBEOEsAAtB8LybAUEoQZi9mwEQ0h4AC58CAgZ/AX4jAEEwayIDJAACQCABKAIEIAEoAgBrQQR2IgQgACgCACAAKAIIIgVrTQ0AIAAgBSAEQQRBEBDRHSAAKAIIIQULIAAoAgQhBCADQQhqQRBqIAFBEGooAgA2AgAgA0EIakEIaiABQQhqKQIANwMAIAMgASkCACIJNwMIIAQgBUEEdGohBCAJpyEBIAMoAgwhBgJAA0AgASAGRg0BAkAgASgCACIHQYCAgIB4Rg0AIAFBDGooAgAhCCABQQRqKQIAIQkgBCAHNgIAIARBBGogCTcCACAEQQxqIAg2AgAgBEEQaiEEIAVBAWohBSABQRBqIQEMAQsLIAFBEGohAQsgACAFNgIIIAMgATYCCCADQQhqENQOIANBMGokAAuaAgICfwJ+AkACQAJAAkAgACkDACIDQn18IgSnQQFqQQAgBEICVBsOAgECAAsgACkDECIEQgODQgBSDQIgBKciACAAKAIAIgFBf2o2AgAgAUEBRw0CIAAgACgCEBDGJA8LAkAgACkDICIEQgODQgBSDQAgBKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgA0ICUQ0BIABBCGohAAJAIANCAFINACAAKQMAIgRCA4NCAFINAiAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEMYkDwsgABDIEw8LIAApAxAiBEIDg0IAUg0AIASnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC6YCAgp/AX4jAEEQayICJAAgASgCACIDLwEyIQQQlSYiBSABKAIIIgZBf3MgAy8BMiIHaiIIOwEyIANBBGoiCSAGQQJ0aigCACEKIAJBCGogCCAFQQRqEL4kIAkgBkEBaiILQQJ0aiAHIAtrIAIoAgggAigCDBC0IiAIEOQmIgggCBDpJyADIAY7ATIgBS8BMiIHQQFqIQgCQAJAIAdBDE8NACAEIAZrIAhHDQECQCAIQQJ0IghFDQAgBUE0aiADIAZBAnRqQThqIAj8CgAACyACIAUgASgCBCIGEIAUIAIpAwAhDCAAIAo2AhAgACAGNgIEIAAgAzYCACAAIAw3AgggAkEQaiQADwsgCEEMQci9mwEQ4SwAC0HwvJsBQShBmL2bARDSHgALwQIBB38jAEEgayIEJAAgBEEIaiADEMMCIAQoAgwhBQJAAkAgBCgCCCIGQYCAgIB4Rw0AIABBgICAgHg2AgAgACAFNgIEDAELAkACQCAEKAIQIgdFDQBBACEIIAUhCSAHIQoDQCAIIAkQ8RtqIQggCUHAAGohCSAKQX9qIgoNAAsCQCAIQQFGDQAgBEGSgICAeDYCCCADIAEgAiAEQQhqEN4jCyAFKAIAQQJHDQEgBSgCLCEJIAUoAighCCAEQZmAgIB4NgIIIAMgCCAJIARBCGoQ3iMMAQsgBEGSgICAeDYCCCADIAEgAiAEQQhqEN4jCwJAIAMtAJEBQSBxRQ0AIAMtAJIBQf8BcQ0AIARBgIGAgHg2AgggAyABIAIgBEEIahDeIwsgACAHNgIIIAAgBTYCBCAAIAY2AgALIARBIGokAAuvAgEDfyMAQTBrIgQkAAJAAkACQCADKAIQIgUgAygCFCIGSw0AAkAgAygCAEF/akECSQ0AIARBDGogAUEEaiADKAIIIAMoAgwgBSAGEOoGQQAhAwJAIAQoAgxBAUcNACAEKAIQIgMgBCgCFCIFSw0DIABBADYCDCAAIAU2AgggACADNgIEQQEhAwsgACADNgIADAMLQQAhBgJAIAUgAygCDE8NAAJAIAEtAAQgAygCCCAFai0AACIDRg0AIAEtAAVB/wFxIANHDQELIABBADYCDCAAIAU2AgRBASEGIAAgBUEBajYCCAsgACAGNgIADAILIABBADYCAAwBCyAEQQA2AiggBEEBNgIcIARB/JSEATYCGCAEQgQ3AiAgBEEYakHUpIMBEOkjAAsgBEEwaiQAC8cCAQN/IwBBMGsiAiQAIAEoAgwhAyABKAIIIQQCQAJAAkAgASgCAEEBRw0AAkACQCADQQFHDQAgBC0AACAELQABRg0BCyAAQYCAgIB4NgIADAILQQFBARCnJyEBIABBATYCCCAAIAE2AgQgAEEBNgIAIAEgBC0AADoAAAwBCwJAAkAgA0EBRw0AIAQoAgAiASAEKAIERg0BCyAAQYCAgIB4NgIADAELIAJBADYCDCACIAEgAkEMahDVGyACKAIEIQEgAigCACEEIAJBADYCGCACQoCAgIAQNwIQIAJBgMuEATYCICACQqCAgIAONwIkIAIgAkEQajYCHCACQRxqIAQgARCCBg0BIAAgAikCEDcCACAAQQhqIAJBEGpBCGooAgA2AgALIAJBMGokAA8LQYysnAFBNyACQS9qQZjLhAFBkK2cARDqEgALywIBBn8jAEEgayIBJAACQAJAIAAoAggiAkUNAAJAIAAoAgQiAyACQQBB5OiHARDSJS0AAEUNACAAQQAgAyACQQBB9OiHARDSJS0AABCoJ0GE6YcBEIsfC0EBIQMCQANAIAIgA0YNASAAIAAoAgQiBCAAKAIIIgUgA0F/akHE6YcBENIlLQABELwmQf8BcSIGIAQgBSADQdTphwEQ0iUtAAAQqCdB/wFxIgQgBiAESRsgBiAEIAYgBEsbQeTphwEQix8gA0EBaiEDDAALCwJAIAAoAgQiAyAAKAIIIgYgAkF/aiIEQZTphwEQ0iUtAAFB/wFGDQAgACADIAYgBEGk6YcBENIlLQABELwmQf8BQbTphwEQix8LIAFBDGogACACEK0cIAFBDGoQoBYMAQsgAEEAQf8BQfTphwEQix8gAEEBOgAMCyABQSBqJAALmwIBBH8CQCAAKAIgIgJFDQAgAigCCCIDRQ0AIANBMGwhAyACKAIEQSRqIQIDQAJAIAJBfGooAgAiBEUNACAEIAEQrwILAkAgAigCACIERQ0AIAQgARCvAgsgAkEwaiECIANBUGoiAw0ACwsCQCAAKAJAIgJFDQAgACgCPCIEIAJBBHRqIQUDQCAEQQxqKAIAIQIgBCgCACABEKQCAkAgAkUNACACKAIIIgNFDQAgAigCBCECIANBAnQhAwNAIAIoAgAgARCvAiACQQRqIQIgA0F8aiIDDQALCyAEQRBqIgQgBUcNAAsLAkAgACgCLCIDRQ0AIAAoAighAiADQThsIQMDQCACIAEQqQMgAkE4aiECIANBSGoiAw0ACwsLrgIBBn8jAEEQayICJAACQAJAAkACQAJAIAEoAgQiA0UNACABKAIAIgRBBGohBUEAIQYgAyEHA0AgBSgCACAGaiEGIAVBCGohBSAHQX9qIgcNAAsgASgCDEUNAiAGQQ9LDQEgBCgCBA0BDAMLQQAhBiABKAIMRQ0CCyAGQQAgBkEAShtBAXQhBgsCQAJAIAZBf0wNACAGRQ0CQQAtAKDxngEaIAYQfSIFRQ0BDAMLQbC5gAEQ4iELAAtBASEFQQAhBgsgAkEANgIIIAIgBTYCBCACIAY2AgACQCADDgIAAAALAkAgAkHMuIABIAEQ3wUNACAAIAIpAgA3AgAgAEEIaiACQQhqKAIANgIAIAJBEGokAA8LQdC5gAFB1gAgAkEPakHAuYABQcC6gAEQ6hIAC6gCAQZ/IwBBIGsiBSQAAkACQAJAAkAgASAAKAI8diIBQQJJDQAgACgCJEEEaiEGIAAoAhAgAUF+aiIHQQxsaiEBIAAoAhQhCEEAIQkCQANAIARFDQEgBCADTw0DIAcgCE8NBCACIARBA3RqIgooAgQhBCAKKAIAIQkCQCABKAIIIgogASgCAEcNACABQdSYgAEQ/xsLIAEoAgQgCkECdGogCTYCACAAIAY2AiRBASEJIAEgCkEBajYCCCAGQQRqIQYMAAsLIAlBAXFFDQMgBUEgaiQADwtB+JeAARDSLAALIAQgA0H8tYMBEJEVAAsgByAIQcSYgAEQkRUACyAFQQA2AhggBUEBNgIMIAVBrJiAATYCCCAFQgQ3AhAgBUEIakG0mIABEOkjAAuWAgICfwF+IwBBgAFrIgIkACAAKAIAKQMAIQQCQAJAAkAgASgCCCIAQYCAgBBxDQAgAEGAgIAgcQ0BIARBASABENUHIQAMAgtBgQEhAANAIAIgAGpBfmogBKdBD3EiA0EwciADQdcAaiADQQpJGzoAACAAQX9qIQAgBEIPViEDIARCBIghBCADDQALIAFBAUHQq5wBQQIgAiAAakF/akGBASAAaxDcBSEADAELQYEBIQADQCACIABqQX5qIASnQQ9xIgNBMHIgA0E3aiADQQpJGzoAACAAQX9qIQAgBEIPViEDIARCBIghBCADDQALIAFBAUHQq5wBQQIgAiAAakF/akGBASAAaxDcBSEACyACQYABaiQAIAALtAICAn8BfiMAQTBrIgIkAAJAAkACQAJAAkAgACkDACIEQgqIpyIDRQ0AQQEhACACQQE2AhAgAkGcv5wBNgIMIAJCATcCGCACQbMBNgIoIAIgAzYCLCACIAJBJGo2AhQgAiACQSxqNgIkIAEoAgAiAyABKAIEIgEgAkEMahDfBQ0EIARC/weDUEUNAUEAIQAMBAsgASgCACEDIARC/weDUA0CIAEoAgQhAQwBC0EBIQAgA0GZq5wBQQEgASgCDBELAA0CCyACQQE2AhAgAkGcv5wBNgIMIAJCATcCGCACQbQBNgIoIAIgBKdB/wdxNgIsIAIgAkEkajYCFCACIAJBLGo2AiQgAyABIAJBDGoQ3wUhAAwBCyADQZiwgwFBAyABKAIEKAIMEQsAIQALIAJBMGokACAAC8gCAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCAABAgMEBQYHAAsgASgCAEHPlZsBQQUgASgCBCgCDBELACEADAcLIAIgAEEEajYCDCABQbzihwFBByACQQxqQeoBEP8LIQAMBgsgAiAAQQRqNgIMIAFBqp6bAUEFIAJBDGpB6wEQ/wshAAwFCyACIABBBGo2AgwgAUHs0YQBQQQgAkEMakHsARD/CyEADAQLIAIgAEEEajYCDCABQdnihwFBCiACQQxqQe0BEP8LIQAMAwsgAiAAQQRqNgIMIAFB8NGEAUEHIAJBDGpB7gEQ/wshAAwCCyACIABBBGo2AgwgAUHx4ocBQQYgAkEMakHvARD/CyEADAELIAIgAEEEajYCDCABQffihwFBCyACQQxqQe8BEP8LIQALIAJBEGokACAAC6oCAgh/A34gAUEQaiEDIAEoAgAiBEFwaiEFIAEoAgQiBiACQd3L3Z55bEEPdyIHcSEIIAdBGXatQoGChIiQoMCAAX4hC0EAIQkDQCAEIAhqKQAAIgwgC4UiDUJ/hSANQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIQ0CQAJAAkACQANAIA1QDQEgBSANeqdBA3YgCGogBnEiCkEEdGsoAgAgAkYNAiANQn98IA2DIQ0MAAsLIAwgDEIBhoNCgIGChIiQoMCAf4NQDQICQCABKAIIDQAgASADENoGGgsgACACNgIIIABBADYCBCAAIAc2AgAMAQsgACABNgIEIAAgBEEAIAprQQR0ajYCAEEAIQELIAAgATYCDA8LIAggCUEIaiIJaiAGcSEIDAALC5UCAQR/QQEhAiABIAEoAmgiA0EBajYCaAJAAkACQAJAIAMsAAAiBEF/Sg0AIAEgA0ECajYCaCADLQABQT9xIQIgBEEfcSEFIARBX0sNASAFQQZ0IAJyIQIMAgsgAUH4AGohAyABKAJ4IQEMAgsgASADQQNqNgJoIAJBBnQgAy0AAkE/cXIhAgJAIARBcE8NACACIAVBDHRyIQIMAQsgASADQQRqNgJoIAJBBnQgAy0AA0E/cXIgBUESdEGAgPAAcXIhAgsgAUH4AGohAyABKAJ4IQECQCACQYABTw0AQQEhAgwBCwJAIAJBgBBPDQBBAiECDAELQQNBBCACQYCABEkbIQILIABBgBI7AQAgAyACIAFqNgIAC5UCAQR/QQEhAiABIAEoAmgiA0EBajYCaAJAAkACQAJAIAMsAAAiBEF/Sg0AIAEgA0ECajYCaCADLQABQT9xIQIgBEEfcSEFIARBX0sNASAFQQZ0IAJyIQIMAgsgAUH4AGohAyABKAJ4IQEMAgsgASADQQNqNgJoIAJBBnQgAy0AAkE/cXIhAgJAIARBcE8NACACIAVBDHRyIQIMAQsgASADQQRqNgJoIAJBBnQgAy0AA0E/cXIgBUESdEGAgPAAcXIhAgsgAUH4AGohAyABKAJ4IQECQCACQYABTw0AQQEhAgwBCwJAIAJBgBBPDQBBAiECDAELQQNBBCACQYCABEkbIQILIABBgDI7AQAgAyACIAFqNgIAC5gCAQV/IwBBEGsiAiQAAkACQAJAIAEtACxBA0cNACACQQhqIAEQ8RUgAigCDEUNAAJAAkAgAigCCCIDLAAAIgRBf0wNACAEQf8BcSEEDAELIAMtAAFBP3EhBSAEQR9xIQYCQCAEQV9LDQAgBkEGdCAFciEEDAELIAVBBnQgAy0AAkE/cXIhBQJAIARBcE8NACAFIAZBDHRyIQQMAQsgBUEGdCADLQADQT9xciAGQRJ0QYCA8ABxciEECyAEQZ9/akEaSQ0BCwJAAkAgAS0ALEF9aiIEQQEgBEH/AXFBA0kbQf8BcQ4DAAEDAAsgACABELQTDAILIAAgARCOJAwBCyABIAEoAhAgACgCLBD1BTYCEAsgAkEQaiQAC68CAQJ/AkACQAJAAkACQCAAKAIADgUEAAECAwQLIAAoAgRBAUcNAyABIAAoAggQ9hoPCyABIAAoAgQQ9hoPCyAAKAIEIgJBwABqEK0oAkAgAkGEAWooAgAiA0UNACACQYABaigCACEAIANB2ABsIQMDQAJAAkACQCAAKAIAQXxqDgICAAELIAFBADoABAwBCyABIAAQqAcLIABB2ABqIQAgA0Gof2oiAw0ACwsCQCACQZgBaigCACIDRQ0AIAJBlAFqKAIAIQAgA0EobCEDA0AgACABEPYJIABBKGohACADQVhqIgMNAAsLIAItADxBBkYNASACQRBqEK0oDwsgACgCDCIDRQ0AIAAoAgghACADQShsIQMDQCAAIAEQ1AcgAEEoaiEAIANBWGoiAw0ACwsLrwICAX8BfiMAQSBrIgMkAAJAAkACQAJAAkACQAJAAkAgAkH/AXEOBAABAgQACyADQQA2AhAgA0EIaiABIANBEGpBkZ+cAUEGELANIAMtAAhBBEYNAiADKQMIIgRC/wGDQgRRDQIgACAENwIADAYLIANBADYCECADQQhqIAEgA0EQakGp85sBQQkQsA0gAy0ACEEERg0BIAMpAwgiBEL/AYNCBFENASAAIAQ3AgAMBQsgA0EANgIQIANBCGogASADQRBqQbLzmwFBBxCwDSADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUg0CCyADQRBqIAEQkREgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFINAgsgAEEEOgAADAILIAAgBDcCAAwBCyAAIAQ3AgALIANBIGokAAujAgEDfyMAQTBrIgMkACAAKAIoIQQgA0EIaiAAKAIEIAAoAgggAUH0vYMBELEiIAMoAgwhACADKAIIIQUgAyACNgIUAkACQAJAIABFDQACQAJAIAUtAAAiAUH/AUYNACABIAFBAnZqIAFBA3FBAEdqQQJqIQEMAQsgBEECaiEBCyABIABPDQECQAJAIAUgAUECdGooAgAiBEF/TA0AAkAgAiABakEBaiIBIABPDQAgBSABQQJ0aigCACEADAILIAEgAEGstYMBEJEVAAsgAg0DIARB/////wdxIQALIANBMGokACAADwtBAEEAQcy1gwEQkRUACyABIABBnLWDARCRFQALIANBADYCGEEAQfjzmAEgA0EUaiADQRhqQby1gwEQlSEAC6ACAQR/IwBBMGsiBiQAQQAhBwJAIAMoAhAiCCADKAIUIglLDQACQAJAAkAgAygCAEF/akECSQ0AIAZBDGogAUEEaiADKAIIIAMoAgwgCCAJEOoGIAYoAgxBAUcNAiAGKAIQIgggBigCFCIDTQ0BIAZBADYCKCAGQQE2AhwgBkH8lIQBNgIYIAZCBDcCICAGQRhqQdSkgwEQ6SMAC0EAIQcgCCADKAIMTw0CAkAgAS0ABCADKAIIIAhqLQAAIgNGDQBBACEHIAEtAAVB/wFxIANHDQMLIAhBAWohAwtBASEHIAVFDQEgBCAIQQFqNgIAIAVBAUYNAUEBIQcgBCADQQFqNgIEDAELQQAhBwsgAEEANgIEIAAgBzYCACAGQTBqJAALmAICBH8BfkEUIQMDQAJAIAFCj84AVg0AAkAgAULjAFgNACACIANBfmoiA2ogAaciBCAEQf//A3FB5ABuIgRB5ABsa0H//wNxQQF0Qdz8mAFqLwAAOwAAIAStIQELAkACQCABQgpUDQAgAiADQX5qIgNqIAGnQQF0Qdz8mAFqLwAAOwAADAELIAIgA0F/aiIDaiABp0EwcjoAAAsgAEEUIANrNgIEIAAgAiADajYCAA8LIAIgA2oiBEF8aiABIAFCkM4AgCIHQpDOAH59pyIFQf//A3FB5ABuIgZBAXRB3PyYAWovAAA7AAAgBEF+aiAFIAZB5ABsa0H//wNxQQF0Qdz8mAFqLwAAOwAAIANBfGohAyAHIQEMAAsLogICC38BfiMAQTBrIgEkABCBKCECIAAoAhAhAyAAKAIMIQQgACgCCCEFIAAtAC0hBiAALQAsIQcgACgCHCEIIAAoAhghCQJAIAApAwAiDEIDg0IAUg0AIAynIgogCigCACIKQQFqNgIAIApBf0oNAAALIAAtABQhCiABQSBqIgsgAEEgahCcBSABQQhqIgAgBTYCACABQRBqIgUgAzYCACABQRhqIgMgCTYCACACIAw3AwAgAkEgaiALKQMANwMAIAEgBDYCDCACQQhqIAApAwA3AwAgASAKOgAUIAJBEGogBSkDADcDACABIAg2AhwgAkEYaiADKQMANwMAIAEgBjoALSABIAc6ACwgAkEoaiABQShqKQMANwMAIAFBMGokACACC6gCAQN/IwBBMGsiBiQAAkACQAJAAkACQCABKAIAIgctAOICDQAgBkEIaiABIAIgAyAEIAUQVyAGKAIIRQ0BDAMLIActAOMCIQcgBkEIaiABIAIgAyAEIAUQVyAGKAIIDQELIABBADYCAAwCCyAHQQFxRQ0AIAYoAhAhByAGKAIMIQggBiAFNgIsIAYgBDYCKCAGIAI2AiQgBiABNgIgIAZBFGogAyAIIAcgByAGQSBqEMgGAkAgBigCFEECRg0AIAAgBikCFDcCACAAQQhqIAZBFGpBCGooAgA2AgAMAgsgBiAGKAIYNgIgQcSInAFBKyAGQSBqQZykhAFBkKmEARDqEgALIAAgBikCCDcCACAAQQhqIAZBCGpBCGooAgA2AgALIAZBMGokAAutAgEBfyMAQcAAayIGJAAgBiAFNgIQIAYgBDYCDAJAAkAgBSADSw0AIAQgBUEBaksNACAGQQE2AiQgBiADNgIgIAYgAjYCHCAGIAU2AhggBiAENgIUIAZBLGogAUEwaiAGQRRqEJwBIAYoAiwiBEECRg0BQQAhBQJAIARBAXFFDQAgBigCMCEFIAAgBigCNDYCCCAAIAU2AgRBASEFCyAAIAU2AgAgBkHAAGokAA8LIAZBAjYCGCAGQeDomwE2AhQgBkICNwIgIAZBCzYCOCAGQaIBNgIwIAYgAzYCPCAGIAZBLGo2AhwgBiAGQTxqNgI0IAYgBkEMajYCLCAGQRRqQdiUhAEQ6SMACyAGIAYoAjA2AgxByJqEAUEiIAZBDGpBoJaEAUHgm4QBEOoSAAupAgEFfyMAQSBrIgIkACACIAEoAgBBIGpBnL+EARCAIiACKAIAIgMoAghBmAFsIQQgAygCBCEDIAIoAgQhBQJAA0AgBEUNASADIARB6H5qIgRqIgYoAgBBiYDEAEYNAAsgAkEIakEQaiIDIAZBmAFqQUBqIgRBEGopAgA3AwAgAkEIakEIaiIGIARBCGopAgA3AwAgAiAEKQIANwMIIABBHGogASgCBCABKAIIEIoUIABBBDYCACAAIAIpAwg3AiggAEEwaiAGKQMANwIAIABBOGogAykDADcCACAFIAUoAgBBf2o2AgAgAkEgaiQADwsgBSAFKAIAQX9qNgIAIAJBADYCGCACQQE2AgwgAkHMv4QBNgIIIAJCBDcCECACQQhqQdS/hAEQ6SMAC6gCAQV/IwBBMGsiAiQAIAJBGGogARDCGEEBIQMgAigCHCEEAkAgAigCGEEBcQ0AIAJBEGogBBDJA0EAIQMgAS0A4AFBB0cNACACKAIQIQVBBEEEEJ0qIgYgBDYCACACQQE2AiwgAiAGNgIoIAJBATYCJAJAA0ACQCABLQDgAUEHRg0AIAEoAtQBIQFBCEHAABCgLCIERQ0CIARBGTYCACAEIAIpAiQ3AgQgBCABNgIUIAQgBTYCECAEQQxqIAJBJGpBCGooAgA2AgAMAwsgARChCyACQQhqIAEQwhggAigCDCEEAkAgAigCCEEBcUUNACACQSRqEJgoQQEhAwwDCyACQSRqIARBsNybARDUIQwACwsACyAAIAQ2AgQgACADNgIAIAJBMGokAAusAgIDfwF+IwBBMGsiAiQAAkACQCABLQDgAUEZRg0AIAJBEGogARCCIQJAIAIoAhBBBUcNACAAIAIoAhQ2AgQgAEEGNgIADAILIAAgAikDEDcDACAAQRhqIAJBEGpBGGopAwA3AwAgAEEQaiACQRBqQRBqKQMANwMAIABBCGogAkEQakEIaikDADcDAAwBCyACQRBqIAEQ3Q4CQCACKQMQIgVCAFINACACKAIYIQEgAEEGNgIAIAAgATYCBAwBCyACIAIoAhwiAzYCDCACIAIoAhgiBDYCCCACIAU3AwACQCACQbKZnAFBCxCEIkUNACACQeCAgIB4NgIQIAEgBCADIAJBEGoQ3iMLIAAgAzYCFCAAIAQ2AhAgACAFNwMIIABBBTYCAAsgAkEwaiQAC5YCAQR/AkACQCABQYABSSICRQ0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAoAgghBCAAIAMQ+CQgACgCBCAAKAIIaiEFAkACQAJAIAINACABQYAQSQ0BAkAgAUGAgARJDQAgBSABQT9xQYABcjoAAyAFIAFBEnZB8AFyOgAAIAUgAUEGdkE/cUGAAXI6AAIgBSABQQx2QT9xQYABcjoAAQwDCyAFIAFBP3FBgAFyOgACIAUgAUEMdkHgAXI6AAAgBSABQQZ2QT9xQYABcjoAAQwCCyAFIAE6AAAMAQsgBSABQT9xQYABcjoAASAFIAFBBnZBwAFyOgAACyAAIAMgBGo2AghBAAuWAgEEfwJAAkAgAUGAAUkiAkUNAEEBIQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAKAIIIQQgACADEIQlIAAoAgQgACgCCGohBQJAAkACQCACDQAgAUGAEEkNAQJAIAFBgIAESQ0AIAUgAUE/cUGAAXI6AAMgBSABQRJ2QfABcjoAACAFIAFBBnZBP3FBgAFyOgACIAUgAUEMdkE/cUGAAXI6AAEMAwsgBSABQT9xQYABcjoAAiAFIAFBDHZB4AFyOgAAIAUgAUEGdkE/cUGAAXI6AAEMAgsgBSABOgAADAELIAUgAUE/cUGAAXI6AAEgBSABQQZ2QcABcjoAAAsgACADIARqNgIIQQALyQIBBn8jAEEgayIBJAACQAJAIAAoAggiAkUNAAJAIAAoAgQiAyACQQBB5OiHARDBJSgCAEUNACAAQQAgAyACQQBB9OiHARDBJSgCABDQHUGE6YcBEIofC0EBIQMCQANAIAIgA0YNASAAIAAoAgQiBCAAKAIIIgUgA0F/akHE6YcBEMElKAIEEOMiIgYgBCAFIANB1OmHARDBJSgCABDQHSIEIAYgBEkbIAYgBCAGIARLG0Hk6YcBEIofIANBAWohAwwACwsCQCAAKAIEIgMgACgCCCIGIAJBf2oiBEGU6YcBEMElKAIEQf7/wwBLDQAgACADIAYgBEGk6YcBEMElKAIEEOMiQf//wwBBtOmHARCKHwsgAUEMaiAAIAIQrBwgAUEMahCfFgwBCyAAQQBB///DAEH06YcBEIofIABBAToADAsgAUEgaiQAC5YCAQR/AkACQCABQYABSSICRQ0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAoAgghBCAAIAMQlSUgACgCBCAAKAIIaiEFAkACQAJAIAINACABQYAQSQ0BAkAgAUGAgARJDQAgBSABQT9xQYABcjoAAyAFIAFBEnZB8AFyOgAAIAUgAUEGdkE/cUGAAXI6AAIgBSABQQx2QT9xQYABcjoAAQwDCyAFIAFBP3FBgAFyOgACIAUgAUEMdkHgAXI6AAAgBSABQQZ2QT9xQYABcjoAAQwCCyAFIAE6AAAMAQsgBSABQT9xQYABcjoAASAFIAFBBnZBwAFyOgAACyAAIAMgBGo2AghBAAuWAgEEfwJAAkAgAUGAAUkiAkUNAEEBIQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAKAIIIQQgACADEJYlIAAoAgQgACgCCGohBQJAAkACQCACDQAgAUGAEEkNAQJAIAFBgIAESQ0AIAUgAUE/cUGAAXI6AAMgBSABQRJ2QfABcjoAACAFIAFBBnZBP3FBgAFyOgACIAUgAUEMdkE/cUGAAXI6AAEMAwsgBSABQT9xQYABcjoAAiAFIAFBDHZB4AFyOgAAIAUgAUEGdkE/cUGAAXI6AAEMAgsgBSABOgAADAELIAUgAUE/cUGAAXI6AAEgBSABQQZ2QcABcjoAAAsgACADIARqNgIIQQALuAIBAn8jAEEQayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAEF8aiIDQQQgA0EHSRsOBwABAgMEBQYACyACIABBBGo2AgwgAUGP95oBQRMgAkEMakG1BBD/CyEBDAYLIAIgAEEEajYCDCABQaL3mgFBGCACQQxqQbYEEP8LIQEMBQsgAiAAQQRqNgIMIAFBuveaAUETIAJBDGpBtwQQ/wshAQwECyACIABBBGo2AgwgAUHN95oBQREgAkEMakG4BBD/CyEBDAMLIAIgADYCDCABQd73mgFBESACQQxqQbkEEP8LIQEMAgsgAiAAQQRqNgIMIAFB7/eaAUERIAJBDGpBugQQ/wshAQwBCyACIABBBGo2AgwgAUG/lZsBQRAgAkEMakG7BBD/CyEBCyACQRBqJAAgAQuLAgEEf0EBIQEgACAAKAIAIgJBAWo2AgACQAJAAkACQCACLAAAIgNBf0oNACAAIAJBAmo2AgAgAi0AAUE/cSEBIANBH3EhBCADQV9LDQEgBEEGdCABciEBDAILIABBEGohAiAAKAIQIQAMAgsgACACQQNqNgIAIAFBBnQgAi0AAkE/cXIhAQJAIANBcE8NACABIARBDHRyIQEMAQsgACACQQRqNgIAIAFBBnQgAi0AA0E/cXIgBEESdEGAgPAAcXIhAQsgAEEQaiECIAAoAhAhAAJAIAFBgAFPDQBBASEBDAELAkAgAUGAEE8NAEECIQEMAQtBA0EEIAFBgIAESRshAQsgAiABIABqNgIAC7gCAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgBBfGoiA0EEIANBB0kbDgcAAQIDBAUGAAsgAiAAQQRqNgIMIAFBj/eaAUETIAJBDGpB3wUQ/wshAQwGCyACIABBBGo2AgwgAUGi95oBQRggAkEMakHgBRD/CyEBDAULIAIgAEEEajYCDCABQbr3mgFBEyACQQxqQeEFEP8LIQEMBAsgAiAAQQRqNgIMIAFBzfeaAUERIAJBDGpB4gUQ/wshAQwDCyACIAA2AgwgAUHe95oBQREgAkEMakHjBRD/CyEBDAILIAIgAEEEajYCDCABQe/3mgFBESACQQxqQeQFEP8LIQEMAQsgAiAAQQRqNgIMIAFBv5WbAUEQIAJBDGpB5QUQ/wshAQsgAkEQaiQAIAELlgIBBH8CQAJAIAFBgAFJIgJFDQBBASEDDAELAkAgAUGAEE8NAEECIQMMAQtBA0EEIAFBgIAESRshAwsgACgCCCEEIAAgAxCWJSAAKAIEIAAoAghqIQUCQAJAAkAgAg0AIAFBgBBJDQECQCABQYCABEkNACAFIAFBP3FBgAFyOgADIAUgAUESdkHwAXI6AAAgBSABQQZ2QT9xQYABcjoAAiAFIAFBDHZBP3FBgAFyOgABDAMLIAUgAUE/cUGAAXI6AAIgBSABQQx2QeABcjoAACAFIAFBBnZBP3FBgAFyOgABDAILIAUgAToAAAwBCyAFIAFBP3FBgAFyOgABIAUgAUEGdkHAAXI6AAALIAAgAyAEajYCCEEAC5YCAQR/AkACQCABQYABSSICRQ0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAoAgghBCAAIAMQliUgACgCBCAAKAIIaiEFAkACQAJAIAINACABQYAQSQ0BAkAgAUGAgARJDQAgBSABQT9xQYABcjoAAyAFIAFBEnZB8AFyOgAAIAUgAUEGdkE/cUGAAXI6AAIgBSABQQx2QT9xQYABcjoAAQwDCyAFIAFBP3FBgAFyOgACIAUgAUEMdkHgAXI6AAAgBSABQQZ2QT9xQYABcjoAAQwCCyAFIAE6AAAMAQsgBSABQT9xQYABcjoAASAFIAFBBnZBwAFyOgAACyAAIAMgBGo2AghBAAuiAgIDfwF+IwBBwABrIgIkAAJAAkACQAJAIAEtAOABIgNBQGpBAkkNAAJAIANBogFGDQAgAkEQaiABEKgOAkAgAikDECIFQgJSDQBBASEDIAIoAhghAQwDCwJAIAWnQQFxRQ0AQQAhAyACQRBqQQhqEKkOIQEMAwsgAikDGCEFIAIoAiQhAyACKAIgIQQgAkGHgICAeDYCKCABIAQgAyACQShqEN4jQQhBwAAQniwiAUUNBCABIAM2AhQgASAENgIQIAEgBTcCCCABQS82AgBBACEDDAILQQIhAyABEJosIQEMAgsgAkEIaiABEM8TIAIoAgwhASACKAIIIQMLQQJBACADQQFxGyEDCyAAIAM6AAAgACABNgIEIAJBwABqJAAPCwALtwICAn8BfiMAQTBrIgIkAAJAAkACQAJAAkAgAS0A4AEiA0HAAEYNAAJAIAMQpRUNACACQRhqQQRyIAEQ1CYgAkEUNgIsIAJBkqecATYCKCACQbCAgIB4NgIYIAEoAtgBIAEoAtwBIAJBGGoQ4BohAyABLQDgAUGiAUcNBCABIAEQmiwQpxcMBAsgAkEYaiABENwOIAIoAiAhASACKQMYIgRQDQIgAkEANgIQIAIgAigCJDYCDCACIAE2AgggAkEAOgAUIAIgBDcDAEIAIQQMAQsgAiABEP4aQgEhBAsgACAENwMAIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwAgAEEYaiACQRBqKQMANwMADAILIABCAjcDACAAIAE2AggMAQsgAEICNwMAIAAgAzYCCAsgAkEwaiQAC50CAQZ/IwBBMGsiAiQAAkACQCABKAIAQYCAgIB4Rg0AIAEoAgQhAyACIAEoAggiBEEEQQxB4OmbARCiGSACQQA2AhAgAiACKQMANwIIIAJBCGogBBCBJSACKAIQIQUCQCAERQ0AIAQgBWohBiABQRRqIQcgAigCDCAFQQxsaiEBIAJBIGpBBGohBQNAIAVBCGogB0EIai8BADsBACAFIAcpAgA3AgAgAiADNgIgIAJBFGogAkEgahDgEyABQQhqIAJBFGpBCGooAgA2AgAgASACKQIUNwIAIAFBDGohASADQQxqIQMgBEF/aiIEDQALIAYhBQsgACACKQIINwIAIABBCGogBTYCAAwBCyAAQYCAgIB4NgIACyACQTBqJAALkgIBBn8jAEEgayICJAAgAkEQakEIaiABQQhqKAIAIgM2AgAgAiABKQIANwMQAkAgA0UNACACKAIUIgQgA0ECdGpBfGoiAUUNACABKAIADQAgA0ECdCEBIARBfGohBSADQf////8DcSEGAkADQCAGIQQCQCABDQBBACEEDAILIARBf2ohBiAFIAFqIQcgAUF8aiEBIAcoAgBFDQALIAQgA0sNAQsgAiAENgIYIAQhAwsCQCADIAIoAhBBAnZPDQAgAkEIaiACQRBqIAMQlg4gAigCCCIBQYGAgIB4Rg0AIAEgAigCDEHYyYIBEI4pAAsgACACKQMQNwIAIABBCGogAkEQakEIaigCADYCACACQSBqJAALkwIBBX8gACgCCCEBIABBADYCCCAAKAIEIgIgAUEMbGohAwJAAkACQCABIAAoAgwgACgCFCIEa00NACAAQQxqIAQgAUEEQQwQxR0gACgCECEBIAAoAhQhBAwBCyABRQ0BIAAoAhAhAQsgASAEQQxsaiEBAkADQAJAIAIoAgAiBUGAgICAeEcNACACQQxqIQIMAgsgAUEEaiACQQRqKQIANwIAIAEgBTYCACABQQxqIQEgBEEBaiEEIAJBDGoiAiADRw0ACyADIQILIAMgAmtBDG4hAQsgACAENgIUAkAgAyACRg0AA0AgAigCACACQQRqKAIAEIAtIAJBDGohAiABQX9qIgENAAsLIAAQjQ8aIAAQjQ8aC5QCAQR/AkACQCABQYABSSICRQ0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAoAgghBCAAIAMQhCUgACgCBCAAKAIIaiEFAkACQAJAIAINACABQYAQSQ0BAkAgAUGAgARJDQAgBSABQT9xQYABcjoAAyAFIAFBEnZB8AFyOgAAIAUgAUEGdkE/cUGAAXI6AAIgBSABQQx2QT9xQYABcjoAAQwDCyAFIAFBP3FBgAFyOgACIAUgAUEMdkHgAXI6AAAgBSABQQZ2QT9xQYABcjoAAQwCCyAFIAE6AAAMAQsgBSABQT9xQYABcjoAASAFIAFBBnZBwAFyOgAACyAAIAMgBGo2AggLlAIBBH8CQAJAIAFBgAFJIgJFDQBBASEDDAELAkAgAUGAEE8NAEECIQMMAQtBA0EEIAFBgIAESRshAwsgACgCCCEEIAAgAxCWJSAAKAIEIAAoAghqIQUCQAJAAkAgAg0AIAFBgBBJDQECQCABQYCABEkNACAFIAFBP3FBgAFyOgADIAUgAUESdkHwAXI6AAAgBSABQQZ2QT9xQYABcjoAAiAFIAFBDHZBP3FBgAFyOgABDAMLIAUgAUE/cUGAAXI6AAIgBSABQQx2QeABcjoAACAFIAFBBnZBP3FBgAFyOgABDAILIAUgAToAAAwBCyAFIAFBP3FBgAFyOgABIAUgAUEGdkHAAXI6AAALIAAgAyAEajYCCAuUAgEEfwJAAkAgAUGAAUkiAkUNAEEBIQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAKAIIIQQgACADEJYlIAAoAgQgACgCCGohBQJAAkACQCACDQAgAUGAEEkNAQJAIAFBgIAESQ0AIAUgAUE/cUGAAXI6AAMgBSABQRJ2QfABcjoAACAFIAFBBnZBP3FBgAFyOgACIAUgAUEMdkE/cUGAAXI6AAEMAwsgBSABQT9xQYABcjoAAiAFIAFBDHZB4AFyOgAAIAUgAUEGdkE/cUGAAXI6AAEMAgsgBSABOgAADAELIAUgAUE/cUGAAXI6AAEgBSABQQZ2QcABcjoAAAsgACADIARqNgIIC5QCAQR/AkACQCABQYABSSICRQ0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAoAgghBCAAIAMQ+CQgACgCBCAAKAIIaiEFAkACQAJAIAINACABQYAQSQ0BAkAgAUGAgARJDQAgBSABQT9xQYABcjoAAyAFIAFBEnZB8AFyOgAAIAUgAUEGdkE/cUGAAXI6AAIgBSABQQx2QT9xQYABcjoAAQwDCyAFIAFBP3FBgAFyOgACIAUgAUEMdkHgAXI6AAAgBSABQQZ2QT9xQYABcjoAAQwCCyAFIAE6AAAMAQsgBSABQT9xQYABcjoAASAFIAFBBnZBwAFyOgAACyAAIAMgBGo2AggLoQICA38BfiMAQSBrIgMkACABKAIQIQQgA0EYaiACIAEoAgwiBUEAEIsCAkACQCADLQAYQQRGDQAgAykDGCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyADQQA2AgwgA0EYaiACIANBDGpBzIGcAUEBELINAkAgAy0AGEEERg0AIAMpAxgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EYaiACIAUgBCABKAIEIAEoAghBkNIBEK8EAkAgAy0AGEEERg0AIAMpAxgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EYaiACIANBDGpBy4GcAUEBELINAkAgAy0AGEEERg0AIAMpAxgiBkL/AYNCBFENACAAIAY3AgAMAQsgAEEEOgAACyADQSBqJAALngICAn8BfiMAQSBrIgQkAAJAAkAgAw0AIABBADYCCCAAQoCAgIAQNwIADAELAkACQCACrSADrX4iBkIgiKcNACAEQQhqIAanIgVB1JeCARClGSAEQQA2AhwgBCAEKQMINwIUIARBFGogASABIAJqEKYZIAQoAhwhAiAEKAIYIQECQANAAkAgA0EBSw0AIAQgAjYCHCAFIAJHDQIMBAsCQCACRQ0AIAEgAmogASAC/AoAAAsgAkEBdCECIANBAXYhAwwACwsCQCAFIAJrIgNFDQAgASACaiABIAP8CgAACyAEIAU2AhwMAQtB1K6bAUERQeSXggEQshcACyAAIAQpAhQ3AgAgAEEIaiAEQRRqQQhqKAIANgIACyAEQSBqJAALiwICBX8BfiMAQSBrIgUkAEEAIQYCQAJAIAMgBGpBf2pBACADa3GtIAJBAWoiAiABKAIAIgdBAXQiCCACIAhLGyICQQQgAkEESxsiCK1+IgpCIIinRQ0ADAELIAqnIglBgICAgHggA2tLDQACQAJAIAcNACAFQRRqQQRqIQZBACECDAELIAVBHGohBiAFIAM2AhggBSABKAIENgIUIAcgBGwhAgsgBiACNgIAIAVBCGogAyAJIAVBFGoQ4hACQCAFKAIIQQFHDQAgBSgCECECIAUoAgwhBgwBCyAFKAIMIQMgASAINgIAIAEgAzYCBEGBgICAeCEGCyAAIAI2AgQgACAGNgIAIAVBIGokAAuMAgEHfyMAQTBrIgIkACABKAIEIQMgAkEIaiABKAIIIgRBCEEoEJUPIAIoAgwhBQJAIAIoAghBAUYNACACKAIQIQYCQCAFRQ0AIARBKGwhByAGIQEgBSEIA0AgB0UNASACQQhqIAMQnwMgAUEgaiACQQhqQSBqKQMANwMAIAFBGGogAkEIakEYaikDADcDACABQRBqIAJBCGpBEGopAwA3AwAgAUEIaiACQQhqQQhqKQMANwMAIAEgAikDCDcDACABQShqIQEgB0FYaiEHIANBKGohAyAIQX9qIggNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBMGokAA8LIAUgAigCEEG08poBEI4pAAuMAgEHfyMAQTBrIgIkACABKAIEIQMgAkEIaiABKAIIIgRBCEEoEJUPIAIoAgwhBQJAIAIoAghBAUYNACACKAIQIQYCQCAFRQ0AIARBKGwhByAGIQEgBSEIA0AgB0UNASACQQhqIAMQiAEgAUEgaiACQQhqQSBqKQMANwMAIAFBGGogAkEIakEYaikDADcDACABQRBqIAJBCGpBEGopAwA3AwAgAUEIaiACQQhqQQhqKQMANwMAIAEgAikDCDcDACABQShqIQEgB0FYaiEHIANBKGohAyAIQX9qIggNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBMGokAA8LIAUgAigCEEG08poBEI4pAAvLAgEBfyMAQfAAayICJAAgACgCACEAIAJBtJObATYCaCACQZCZmQE2AmAgAiAAQcEAajYCXCACQZCZmQE2AlggAiAAQcAAajYCVCACQZCZmQE2AlAgAiAAQT9qNgJMIAJBkJmZATYCSCACIABBPmo2AkQgAkGQmZkBNgJAIAIgAEE9ajYCPCACQbCZmQE2AjggAiAAQcMAajYCNCACQaCZmQE2AjAgAiAAQShqNgIsIAJBkJmZATYCKCACIABBPGo2AiQgAkGAmZkBNgIgIAIgAEE4ajYCHCACQfCYmQE2AhggAiAAQTRqNgIUIAJB4JiZATYCECACIAA2AgwgAkHEkpsBNgIIIAIgAEEgajYCBCACIABBwgBqNgJsIAIgAkHsAGo2AmQgAUH4lJsBQQlBkJSbAUENIAJBBGpBDRCoCiEAIAJB8ABqJAAgAAvLAgEBfyMAQfAAayICJAAgACgCACEAIAJBtJObATYCaCACQYSTmwE2AmAgAiAAQcEAajYCXCACQYSTmwE2AlggAiAAQcAAajYCVCACQYSTmwE2AlAgAiAAQT9qNgJMIAJBhJObATYCSCACIABBPmo2AkQgAkGEk5sBNgJAIAIgAEE9ajYCPCACQaSTmwE2AjggAiAAQcMAajYCNCACQZSTmwE2AjAgAiAAQShqNgIsIAJBhJObATYCKCACIABBPGo2AiQgAkH0kpsBNgIgIAIgAEE4ajYCHCACQeSSmwE2AhggAiAAQTRqNgIUIAJB1JKbATYCECACIAA2AgwgAkHEkpsBNgIIIAIgAEEgajYCBCACIABBwgBqNgJsIAIgAkHsAGo2AmQgAUH4lJsBQQlBkJSbAUENIAJBBGpBDRCoCiEAIAJB8ABqJAAgAAurAgEBfyMAQTBrIgQkACAEQQA6ABUgBCACOgAUIARBAToAFiAEIAM6ABcCQCABKAKIASICQYCAAXFFDQAgAS0AkQFBIHFFDQAgAS0A4AFB/wFxQQJHDQAgASgC3AEhAiABKALYASEDIARBmYGAgHg2AhggASADIAIgBEEYahDeIyABKAKIASECCyAEIARBFWo2AiQgBCAEQRZqNgIgIAQgBEEXajYCHCAEIARBFGo2AhgCQAJAIAJBgIAgcQ0AIAEgAkGAgCByNgKIASAEIARBGGogARDqDiAEKAIAIQIgASABKAKIAUH//19xNgKIASAEKAIEIQEMAQsgBEEIaiAEQRhqIAEQ6g4gBCgCDCEBIAQoAgghAgsgACABNgIEIAAgAjYCACAEQTBqJAALmAICAX8BfiMAQSBrIgMkACADQQA2AgwgA0EYaiACIANBDGpBqJmcAUEBELENAkACQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRhqIAIgASgCDEEBakEBEPADAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsCQCABKAIAQQFHDQAgA0EYaiABQQRqIAIQzi0gAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiACIANBDGpBqZmcAUEBELENAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQSBqJAALkAIBB38jAEEwayIDJABBACEEIANBADYCECADQoCAgIAQNwIIIANBAToALCADQd8ANgIoIAMgAjYCJCADIAI2AhwgAyABNgIYIANB3wA2AhQgA0EoaiEFQQAhBgJAA0AgAiAGIgdJDQEgA0HfACABIAdqIAIgB2sQrhEgAygCAEEBcUUNASADIAMoAgQiCCAHaiIJQQFqIgY2AiAgCSACTw0AIAEgCGogB2oiB0EBIAVBARDjJUUNACADQQhqIAEgBGogBxC6ICADQQhqQQFBARC6ICAGIQQMAAsLIANBCGogASAEaiABIAJqELogIABBCGogA0EIakEIaigCADYCACAAIAMpAgg3AgAgA0EwaiQAC50CAQV/AkAgASgCFCICIAEoArACIgN2IgRBgICAAUsNAAJAQQEgA0EfcXQiAyABQQxqIgUoAgAgAmtNDQAgBSACIANBCEEIEMUdIAEoAhQhAgsgAiADaiEFIAEoAhAiBiACQQN0aiECA0AgAkIANwMAIAJBCGohAiADQX9qIgMNAAsgASAFNgIUAkAgBCABKAKwAnQgASgCtAJqIgIgBU8NACAGIAJBA3RqQoCAgICAgH83AwACQAJAIAEoArwCQQFxRQ0AIAEoAiBBAnQgBUEDdGogASgCwAIiAksNAQsgAEEwNgIAIAAgBDYCBA8LIAAgAjYCBCAAQS42AgAPCyACIAVB7K2DARCRFQALIABCgICAATcDCCAAQSs2AgALoAIBA38jAEEwayIEJAACQAJAAkAgAygCECIFIAMoAhQiBksNACABQQRqIQECQCADKAIAQX9qQQJJDQAgBEEMaiABIAMoAgggAygCDCAFIAYQ5QZBACEDAkAgBCgCDEEBRw0AIAQoAhAiAyAEKAIUIgVLDQMgAEEANgIMIAAgBTYCCCAAIAM2AgRBASEDCyAAIAM2AgAMAwtBACEGAkAgBSADKAIMTw0AIAEtAAAgAygCCCAFai0AAEcNACAAQQA2AgwgACAFNgIEQQEhBiAAIAVBAWo2AggLIAAgBjYCAAwCCyAAQQA2AgAMAQsgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDpIwALIARBMGokAAuUAgICfwF+IwBBIGsiAyQAIAFBGGohBAJAAkACQAJAIAEtACxBAkYNACADQRBqIAQgAhCEGCADLQAQQQRGDQIgAykDECIFQv8Bg0IEUg0BDAILIANBEGogBCgCACACEKAKIAMtABBBBEYNASADKQMQIgVC/wGDQgRRDQELIAVC/wGDQgRRDQAgACAFNwIADAELIANBADYCECADQQhqIAIgA0EQakHIgZwBQQEQsQ0CQCADLQAIQQRGDQAgAykDCCIFQv8Bg0IEUQ0AIAAgBTcCAAwBCyADQRBqIAEgAhDDGAJAIAMtABBBBEYNACADKQMQIgVC/wGDQgRRDQAgACAFNwIADAELIABBBDoAAAsgA0EgaiQAC6MCAQR/IwBBEGsiAyQAAkACQCAAKAIIIgRBgIAETw0AAkAgACgCFCIFIAAoAgxHDQAgAEEMakG0q4ABEP8bCyAAIAVBAWo2AhQgACgCECAFQQJ0aiAENgIAIANBBGogAkEAQQFBARCoDCADKAIIIQYgAygCBEEBRg0BIAMoAgwhBAJAIAJFDQAgBCABIAL8CgAACwJAIAAoAggiBSAAKAIARw0AIABBxKuAARCCHAsgACAFQQFqNgIIIAAoAgQgBUEMbGoiBSACNgIIIAUgBDYCBCAFIAY2AgAgACAAKAIcIAJqNgIcIAAgAiAAKAIYIgUgAiAFSRs2AhggA0EQaiQADwtB7KqAAUE3QaSrgAEQ0h4ACyAGIAMoAgxBwLycARCOKQALmgIBBn8jAEEQayICJAAgASgCBCEDQQAhBAJAIAEtAAwiBQ0AIAEoAghBAnQhBEEAIQYgAyEHAkACQANAIARFDQEgBygCAA0CIARBfGohBCAGQQFqIQYgB0EEaiEHDAALC0GwxYIBQRxBuMaCARCyFwALIAatQgWGIAMgBkECdGooAgBorYRQIQQLAkACQCADIAEgASgCAEGAgICAeEYbKAIIRQ0AIAIgAUEAQQEQ7AcMAQsgAiABEMsdCwJAIARFDQACQCACKAIIIgQNACACQQBBlJmCARClISACKAIIIQQLIAIoAgQhByACQQE2AgwgByAEIAJBDGoQ4AtFDQAgAkEBQaSZggEQpSELIAAgBSACEN8XIAJBEGokAAuTAgEKfyMAQRBrIgEkACAAKAIEQYACIAAoAgAiAhsiAyAAKAIMIgQgAyAESxshBSAEQYACIARBgAJLGyEGIAAoAgghByAALQAQQQFxIQggAC0AEUH/AXEhCQJAAkADQAJAIAUgBCIDRw0AQQIhA0EAIQQgBUF/Rg0CIAINAiAAQX82AgwgBy0A/wFBEHRBgYAEaiIDQYCA/A9xIQQMAgsgBiADRg0CIAAgA0EBaiIENgIMIAcgA2otAAAhCgJAIAhFDQAgCSAKQf8BcUYNAQsLIAAgCjoAESAAQQE6ABAgA0EIdCIEIQMLIAFBEGokACADQf8BcSAEcg8LQcSInAFBKyABQQ9qQcDFgwFBnNCDARDqEgALmAICAX8BfiMAQSBrIgMkACADQRBqIAIgASgCCCABIAEtABQQ4gYCQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkACQAJAIAEoAhgiAUUNACADQQA2AhAgA0EIaiACIANBEGpB4KucAUEBELENAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMBAsCQCACLQBNDQAgA0EQaiACEJkRIAMtABBBBEYNACADKQMQIgRC/wGDQgRSDQILIANBEGogASACEJ0SIAMtABBBBEYNACADKQMQIgRC/wGDQgRSDQILIABBBDoAAAwCCyAAIAQ3AgAMAQsgACAENwIACyADQSBqJAALnQICBX8CfiMAQTBrIgIkACABKAIAIgNBCGohBCADIAEoAgQiBWpBAWohBiADKQMAQn+FQoCBgoSIkKDAgH+DIQcgASgCDCEBAkACQCAFDQBCACEIQQAhBQwBCyACQQhBCCAFQQFqENoRIAMgAigCCGutQiCGIAI1AgSEIQggAigCACEFCyAAIAFBAWpBAXYgASAAKAIMGxCKKCACIAg3AiQgAiAFNgIgIAIgATYCGCACIAM2AhAgAiAGNgIMIAIgBDYCCCACIAc3AwACQANAIAFFDQEgAhC2EiEDIAIgAigCGEF/aiIBNgIYIAAgA0F4aikDABDCBgwACwsCQCACKAIgIgFFDQAgAigCKCABIAIoAiQQkykLIAJBMGokAAuzAgIEfwF+IAAoAvQBIgEgACgC+AEQ6SQgACgC8AEgARCsLSAAKAL8ASAAKAKAAhDyHQJAIAAoAjAiAkGAgICAeEYNACAAKAI0IQECQCAAKAI4IgNFDQADQAJAIAEpAwAiBUIDg0IAUg0AIAWnIgIgAigCACIEQX9qNgIAIARBAUcNACACIAIoAhAQxiQLIAFBIGohASADQX9qIgMNAAsgACgCNCEBIAAoAjAhAgsgAiABQQhBIBCZFiAAKAJAIgEgACgCRBDHFyAAKAI8IAEQmi0LIABBCGoQqhAgAEHQAGoQ0yggAEHcAGoQ0yggACgChAEiASABKAIAQX9qIgM2AgACQCADDQAgARD1IgsgACgCmAEgACgCnAEQ3C0CQCAAKAKoAUEKRg0AIABBqAFqEKoQCwuYAgEEfyMAQTBrIgMkAAJAIAAoAjhFDQAgA0EYaiABIAIQxwkgAygCHCEEIAAgACgCMCADKAIYIgVqNgIwIANBEGogBCABIAIQlBgCQCADKAIQIgZFDQAgAygCFCEBQQAhAiADQQA7ASwgAyAGNgIkIAMgBiABajYCKEEAIQEDQAJAAkACQCACQf//A3ENACADQQhqIANBJGoQoQwCQCADKAIIQQFxRQ0AAkAgAygCDCICQf//A0sNACADLwEsIQIMBAsgAkH/B3FBgLh/ciECDAILIAAgAUEAIAAoAjQgBRtqNgI0DAULQQAhAgsgAyACOwEsCyABQQFqIQEMAAsLIAEgAiAEIAJB7KqcARDjKgALIANBMGokAAuaAgEBfyMAQSBrIgckACAHIAQ2AgAgByAGNgIEAkAgBCAGRw0AIAAoAgAgASACIAAoAgQoAgwRCwAhBiAHQQA6AA0gByAGOgAMIAcgADYCCANAIAdBCGogAygCACADQQRqKAIAIAVBDxC9CSEAIANBCGohAyAFQQhqIQUgBEF/aiIEDQALIActAA0iBSAHLQAMIgRyIQMCQCAFQQFxRQ0AIARBAXENAAJAIAAoAgAiAy0ACkGAAXENACADKAIAQb/klwFBAiADKAIEKAIMEQsAIQMMAQsgAygCAEGpmZwBQQEgAygCBCgCDBELACEDCyAHQSBqJAAgA0EBcQ8LIAdBADYCCEEAIAcgB0EEaiAHQQhqQbSbgQEQlSEAC5ECAQR/IwBBMGsiBiQAQQAhBwJAIAMoAhAiCCADKAIUIglLDQAgAUEEaiEBAkACQAJAIAMoAgBBf2pBAkkNACAGQQxqIAEgAygCCCADKAIMIAggCRDlBiAGKAIMQQFHDQIgBigCECIIIAYoAhQiA00NASAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakHUpIMBEOkjAAtBACEHIAggAygCDE8NAkEAIQcgAS0AACADKAIIIAhqLQAARw0CIAhBAWohAwtBASEHIAVFDQEgBCAIQQFqNgIAIAVBAUYNAUEBIQcgBCADQQFqNgIEDAELQQAhBwsgAEEANgIEIAAgBzYCACAGQTBqJAALnwIBBH8jAEEwayIEJABBACEFAkACQCADKAIQIgYgAygCFCIHSw0AIAFBBGohAQJAAkAgAygCAEF/akECSQ0AIARBDGogASADKAIIIAMoAgwgBiAHEO4FIAQoAgxBAUcNAiAEKAIQIAQoAhQiA00NASAEQQA2AiggBEEBNgIcIARB/JSEATYCGCAEQgQ3AiAgBEEYakHUpIMBEOkjAAsgBEEMaiABIAMoAgggAygCDCAGIAMQuxYgBCgCDEEBRw0BIAQoAhAgBCgCFCIDSw0CCyAAIAM2AgggAEEANgIEQQEhBQsgACAFNgIAIARBMGokAA8LIARBADYCKCAEQQE2AhwgBEH8lIQBNgIYIARCBDcCICAEQRhqQdSkgwEQ6SMAC5wCAQN/IwBBMGsiBCQAAkACQAJAIAMoAhAiBSADKAIUIgZLDQACQCADKAIAQX9qQQJJDQAgBEEMaiABIAMoAgggAygCDCAFIAYQiRBBACEDAkAgBCgCDEEBRw0AIAQoAhAiAyAEKAIUIgVLDQMgAEEANgIMIAAgBTYCCCAAIAM2AgRBASEDCyAAIAM2AgAMAwtBACEGAkAgBSADKAIMTw0AIAEgAygCCCAFai0AAGotAABBAUcNACAAQQA2AgwgACAFNgIEIAAgBUEBajYCCEEBIQYLIAAgBjYCAAwCCyAAQQA2AgAMAQsgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDpIwALIARBMGokAAufAgEEfyMAQTBrIgQkAEEAIQUCQAJAIAMoAhAiBiADKAIUIgdLDQAgAUEEaiEBAkACQCADKAIAQX9qQQJJDQAgBEEMaiABIAMoAgggAygCDCAGIAcQiwwgBCgCDEEBRw0CIAQoAhAgBCgCFCIDTQ0BIARBADYCKCAEQQE2AhwgBEH8lIQBNgIYIARCBDcCICAEQRhqQdSkgwEQ6SMACyAEQQxqIAEgAygCCCADKAIMIAYgBxCMDCAEKAIMQQFHDQEgBCgCECAEKAIUIgNLDQILIAAgAzYCCCAAQQA2AgRBASEFCyAAIAU2AgAgBEEwaiQADwsgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDpIwALlwICBH8BfiMAQSBrIgIkAAJAAkAgASgC0AIiA0F/TA0AQQAhBCAAQQA2AhggACADEIglIABBDGogAxCIJQJAIAEoAsQCIgNBEGooAgAiBUUNACADQQxqKAIAIAVBA3RqIgNBeGpFDQAgA0F8aigCACEECyAAIAQ2AiggACABKALcAkEBdCIDIAQgAyAESxsiAzYCLCABNQLQAiAErX4iBkIgiKcNASAGpyIEIANqIgEgBEkNASAAQRxqIAEQjCUgAkEgaiQADwsgAkEBNgIEIAJBwLKEATYCACACQgE3AgwgAkH4ADYCHCACQZiyhAE2AhggAiACQRhqNgIIIAJBuLOEARDpIwALQeiqhAFBIkGMq4QBELIXAAuRAgEDfyMAQSBrIgIkACAAKAIAIQAgASgCAEGomZwBQQEgASgCBCgCDBELACEDIAJBADoAESACIAM6ABAgAiABNgIMIAAoAgwhAyAAKAIIIQECQAJAIAAoAgBBAUcNACADQQF0IQADQCAARQ0CIAEtAAAhAyACIAEtAAE6ABYgAiADQQh0OwEUIAJBDGogAkEUakHwARDDCxogAEF+aiEAIAFBAmohAQwACwsgA0EDdCEAA0AgAEUNASABKAIAIQMgASgCBCEEIAJBADoAHCACIAQ2AhggAiADNgIUIAJBDGogAkEUakHxARDDCxogAEF4aiEAIAFBCGohAQwACwsgAkEMahCqIyEBIAJBIGokACABC6YCAgN/AX4CQAJAAkACQAJAAkACQCAAKAIADgQBAgMAAQsgACgCCCEBAkAgACgCDCICRQ0AIAEhAwNAIAMQtBIgA0E4aiEDIAJBf2oiAg0ACwsgACgCBCABEKMtDAMLAkAgACkDCCIEQgODQgBSDQAgBKciAyADKAIAIgJBf2o2AgAgAkEBRw0AIAMgAygCEBDGJAsgACgCICIDDQMMBAsgACgCCCEBAkAgACgCDCICRQ0AIAEhAwNAAkAgAygCAEEHRg0AIAMQrAcLIANBKGohAyACQX9qIgINAAsLIAAoAgQgARChLQwBCyAAKAIEIgMQrAcgA0EoQQgQsxYLIAAoAhgiA0UNAQsgAygCACICELQCIAJB4ABBCBCzFiADQQxBBBCzFgsLngICBn8DfgJAIAAoAgQiAUUNAAJAIAAoAgwiAkUNACAAKAIAIgNBCGohBCADKQMAQn+FQoCBgoSIkKDAgH+DIQcDQAJAIAdCAFINAANAIANBgH9qIQMgBCkDACEHIARBCGoiBSEEIAdCgIGChIiQoMCAf4MiB0KAgYKEiJCgwIB/UQ0ACyAHQoCBgoSIkKDAgH+FIQcgBSEECyAHQn98IQgCQCADIAd6p0EBdEHwAXFrQXBqKQMAIglCA4NCAFINACAJpyIFIAUoAgAiBkF/ajYCACAGQQFHDQAgBSAFKAIQEMYkCyAIIAeDIQcgAkF/aiICDQALCyABIAFBBHRBF2pBcHEiBGpBCWoiA0UNACAAKAIAIARrIANBCBCzFgsLhQIBB38jAEEQayICJAACQAJAIAEtACxBfWoiA0H/AXEiBA0AIAJBCGogARDxFSACKAIMRQ0AAkACQCACKAIIIgUsAAAiBkF/TA0AIAZB/wFxIQYMAQsgBS0AAUE/cSEHIAZBH3EhCAJAIAZBX0sNACAIQQZ0IAdyIQYMAQsgB0EGdCAFLQACQT9xciEHAkAgBkFwTw0AIAcgCEEMdHIhBgwBCyAHQQZ0IAUtAANBP3FyIAhBEnRBgIDwAHFyIQYLIAZBn39qQRpJDQELAkACQCADQQEgBEEDSRtB/wFxDgMAAQIACyABKQMAIAEoAhAgABDZIwwBCyABIAAQriQLIAJBEGokAAusAgECfwJAAkACQAJAAkACQAJAIAAoAgAiAkF7aiIDQQQgA0EGSRsOBgABAgMEBQALIABBADoAHA8LAkAgACgCCEEDRw0AIAEgACgCDBDmAQsgASAAKAIoEOYBDwsgAEEAOgAkIAEgACgCKBDmAQ8LIABBKGohAyAAQcgAaiECAkAgACgCCEEDRw0AIAEgACgCDBDmAQsgAhC5IyADKAIAQYCAgIB4Rg0CIAEgAxDeBw8LAkAgACgCIEEHRg0AIABBIGoQ/goLIABBBzYCIAJAIAJBA0cNACABIAAoAgQQ5gELIAAoAkghAyAAKAJoIAEQkBMgA0GAgICAeEYNASABIABByABqEN4HDwsCQCAAKAIIQQNHDQAgASAAKAIMEOYBCyAAKAIoIAEQuQYLC7oCAQF/AkACQAJAAkAgACgCAEF/ag4JAQMDAwMDAwMAAwsCQCAAKAIIQRFHDQBBACEBAkACQAJAAkACQAJAIAAoAhAOCAQAAQUICAIDBAsgAC0ANEUNBAwHCyAAKAIULQAYRQ0DDAYLIAAoAhQtACxFDQIMBQsgACgCFCICLQBQDQQgAi0AUUUNAQwECyAALQA0DQMLIABBEGoQhiMPCyAAQQhqELAkDwsgACgCCCECAkAgAUUNAEEBIQEgAkECRg0BC0EAIQECQAJAAkACQAJAAkAgAg4IBAABBQYGAgMECyAALQAsRQ0EDAULIAAoAgwtABhFDQMMBAsgACgCDC0ALEUNAgwDCyAAKAIMIgItAFANAiACLQBRRQ0BDAILIAAtACwNAQsgAEEIahCGIyEBCyABDwsgABDKDgueAgIGfwN+AkAgACgCBCIBRQ0AAkAgACgCDCICRQ0AIAAoAgAiA0EIaiEEIAMpAwBCf4VCgIGChIiQoMCAf4MhBwNAAkAgB0IAUg0AA0AgA0GAf2ohAyAEKQMAIQcgBEEIaiIFIQQgB0KAgYKEiJCgwIB/gyIHQoCBgoSIkKDAgH9RDQALIAdCgIGChIiQoMCAf4UhByAFIQQLIAdCf3whCAJAIAMgB3qnQQF0QfABcWtBcGopAwAiCUIDg0IAUg0AIAmnIgUgBSgCACIGQX9qNgIAIAZBAUcNACAFIAUoAhAQxiQLIAggB4MhByACQX9qIgINAAsLIAEgAUEEdEEXakFwcSIEakEJaiIDRQ0AIAAoAgAgBGsgA0EIELMWCwv3AQEEfwJAAkACQAJAIAAoAiAgACgCBEkgACgCHCICIAAoAgAiA0kgAiADRhsNACAAQTxqIQJBAiEDA0AgASADRg0DIAIoAgAgAkFkaigCAEkgAkF8aigCACIEIAJBYGooAgAiBUkgBCAFRhsNAiACQRxqIQIgA0EBaiEDDAALC0ECIQNBACEEA0AgASADRg0DIAAgBGoiAkE8aigCACACQSBqKAIASSACQThqKAIAIgUgAkEcaigCACICSSAFIAJGG0EBRw0BIARBHGohBCADQQFqIQMMAAsLIAAgAUEAIAFBAXJnQQF0QT5zEKICCw8LIAAgARDJGwunAgEFfyMAQSBrIgIkACABKALYASEDAkAgAS0A4AFBFkcNACABEKELCyACQQhqIAEQzwFBASEEIAIoAgwhBQJAIAIoAghBAXENAEEAIQQgAS0A4AFBFkcNAEEEQQQQmioiBiAFNgIAIAJBATYCGCACIAY2AhQgAkEBNgIQAkACQANAIAEtAOABQRZHDQEgARChCyACIAEQzwEgAigCBCEFIAIoAgBBAXENAiACQRBqIAVBzNmbARDSIQwACwsgASgC1AEhAUHgAEEIEJoqIgVCioCAgBA3AwAgBSABNgIYIAUgAzYCFCAFIAIpAxA3AwggBUEQaiACQRBqQQhqKAIANgIADAELIAJBEGoQ+SpBASEECyAAIAU2AgQgACAENgIAIAJBIGokAAuTAgIHfwF+IwBBEGsiASQAAkAgACgCBCICRQ0AIAAoAgAhAwJAIAAoAgwiBEUNACADQQhqIQAgAykDAEJ/hUKAgYKEiJCgwIB/gyEIQQEhBSADIQYDQCAFRQ0BAkADQCAIQgBSDQEgBkHAfmohBiAAKQMAQn+FQoCBgoSIkKDAgH+DIQggAEEIaiEADAALCyAGQQAgCHqnQQN2a0EYbGoiBUFoaikDABDIISAFQXRqIgcoAgAgBUF4aigCABCmGCAFQXBqKAIAIAcoAgAQti0gCEJ/fCAIgyEIIARBf2oiBCEFDAALCyABQQRqQRhBCCACQQFqENoRIAMgASgCDGsgASgCBCABKAIIEJMpCyABQRBqJAAL/wEBBn8jAEEgayIEJAACQAJAIAMgAUsNACAAIANBAnRqIQVBACEGIAMhBwJAA0AgB0UNASAAIAAoAgAiCCACKAIAaiIJIAZB/wFxaiIGNgIAIAkgCEkgBiAJSXJBAXEhBiAHQX9qIQcgAkEEaiECIABBBGohAAwACwtBACECIAZB/wFxRQ0BIAFBAnQgA0ECdGshAANAAkAgAA0AQQEhAgwDCyAFIAUoAgBBAWoiBzYCACAAQXxqIQAgBUEEaiEFIAdFDQAMAgsLIARBADYCGCAEQQE2AgwgBEHQmZwBNgIIIARCBDcCECAEQQhqQbjHggEQ6SMACyAEQSBqJAAgAgusAgEEfyMAQRBrIgMkAAJAAkAgAi0ADCIEQQFHDQAgACABEO0mDAELAkACQAJAAkACQAJAAkACQCABLQAMIgUOAwAHAQALIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAggiASACKAIEIgYgAigCCCICEMIgQf8BcQ4CAgMBCyADIAEoAgQgASgCCCACKAIEIAIoAggQuRcgACAFIAMQ3xcMBAsgAyAGIAIgBCABEMYiIABBAiAFayADEN8XDAMLIABBCGpBACkCjJmCATcCACAAQQApAoSZggE3AgAMAgsgAyAEIAEgBiACEMYiIAAgBSADEN8XDAELIAMgAhDtJiAAIAMpAgA3AgAgA0ECIAMtAAxrOgAMIABBCGogA0EIaikCADcCAAsgA0EQaiQAC48CAgR/AX4jAEEgayIEJAAgBEEUaiACQQBBBEEQEKgMIAQoAhghBQJAAkACQCAEKAIUQQFGDQAgBEEANgIQIAQgBCgCHCIDNgIMIAQgBTYCCAJAIAJBAkkNACABMQAEQiCGIAE1AgCEIAExAAVCKIaEIQggAkF/aiEFIAEoAgghBiABLwEMIQcDQCADIAg3AgAgA0EMaiAHOwEAIANBCGogBjYCACADQRBqIQMgBUF/aiIFDQALIAIhBQwCC0EBIQUgAg0BQQAhBQwCCyAFIAQoAhwgAxCOKQALIAMgASkCADcCACADQQhqIAFBCGopAgA3AgALIAAgBCkCCDcCACAAQQhqIAU2AgAgBEEgaiQAC6QCAQN/IwBBwABrIgIkACABEPsPIQMgAkEEaiABEKcNIAEQjQsaAkACQAJAAkACQAJAAkACQCADQa1/ag4FBAEBAQUAC0EAIQECQCADQY1/ag4FAwEBAQYACyADQcQARg0BQQAhBCADQeQARg0GCyACIAM2AhwgAkECNgIkIAJB0MqEATYCICACQgE3AiwgAkEFNgI8IAIgAkE4ajYCKCACIAJBHGo2AjggAkEgakHgyoQBEOkjAAtBASEBQQAhBAwEC0EBIQQMAwtBASEEQQEhAQwCC0EBIQELQQIhBAsgACACKQIENwIAIAAgAToAGSAAIAQ6ABggAEEQaiACQQRqQRBqKQIANwIAIABBCGogAkEEakEIaikCADcCACACQcAAaiQAC4oCAgp/AX4jAEEQayIDJAAgA0EEaiACQQhBGBCVDyADKAIIIQQCQAJAIAMoAgRBAUYNACACQRhsIQUgAygCDCEGQQAhByAEIQgCQANAIAhFDQEgBSAHRg0BIAEoAgwhCSABKAIIIQogAS0AECELAkAgASkDACINQgODQgBSDQAgDaciDCAMKAIAIgxBAWo2AgAgDEF/TA0ECyABQRhqIQEgBiAHaiIMIA03AwAgDEEQaiALOgAAIAxBDGogCTYCACAMQQhqIAo2AgAgCEF/aiEIIAdBGGohBwwACwsgACACNgIIIAAgBjYCBCAAIAQ2AgAgA0EQaiQADwsgBCADKAIMQbTymgEQjikLAAuJAgEHfyMAQTBrIgIkACABKAIEIQMgAiABKAIIIgRBCEEwEJUPIAIoAgQhBQJAIAIoAgBBAUYNACACKAIIIQYCQCAFRQ0AIARBMGwhByAGIQEgBSEIA0AgB0UNASACIAMQTCABQShqIAJBKGopAwA3AwAgAUEgaiACQSBqKQMANwMAIAFBGGogAkEYaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEIaiACQQhqKQMANwMAIAEgAikDADcDACABQTBqIQEgB0FQaiEHIANBMGohAyAIQX9qIggNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBMGokAA8LIAUgAigCCEG08poBEI4pAAuuAgEBfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIADgcAAQIDBAUGAAsgAiAAQQhqNgIMIAFBmJybAUEDIAJBDGpBoQIQ/wshAQwGCyACIABBBGo2AgwgAUGbnJsBQQQgAkEMakGNAxD/CyEBDAULIAIgAEEEajYCDCABQbDDmwFBBCACQQxqQY4DEP8LIQEMBAsgAiAAQQhqNgIMIAFBn5ybAUEDIAJBDGpBogIQ/wshAQwDCyACIABBCGo2AgwgAUGinJsBQQYgAkEMakGkAhD/CyEBDAILIAIgAEEIajYCDCABQaicmwFBBSACQQxqQY8DEP8LIQEMAQsgAiAAQQhqNgIMIAFBrZybAUEHIAJBDGpBkAMQ/wshAQsgAkEQaiQAIAELrgIBAX8jAEEQayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4HAAECAwQFBgALIAIgAEEIajYCDCABQb67nAFBBSACQQxqQc4DEP8LIQEMBgsgAiAAQQRqNgIMIAFBw7ucAUEFIAJBDGpBzwMQ/wshAQwFCyACIABBBGo2AgwgAUHIu5wBQQQgAkEMakHQAxD/CyEBDAQLIAIgAEEEajYCDCABQcy7nAFBBiACQQxqQdEDEP8LIQEMAwsgAiAAQQRqNgIMIAFB0rucAUEGIAJBDGpB0gMQ/wshAQwCCyACIABBBGo2AgwgAUHYu5wBQQcgAkEMakH6AhD/CyEBDAELIAIgAEEEajYCDCABQd+7nAFBBCACQQxqQdMCEP8LIQELIAJBEGokACABC5gCAgd/AX4jAEHAAGsiAiQAIAJBADsAJSACQQhqQQApA4CFngEiCTcDACACQRhqIAk3AwAgAiAANgIgIAIgAC0AODoAJCACQQApA/iEngEiCTcDACACIAk3AxAgAiABKAIEIgM2AjQgAiADIAEoAggiBEEwbGo2AjggAiACNgI8IAJBEGohBSACQShqIAJBNGoQuwcgAigCLCEGIAIoAighBwJAIAIoAjAiAUUNACABQQJ0IQggBiEBA0AgASgCACACEN4EIAFBBGohASAIQXxqIggNAAsLIAYgBxC1LSACEMwKIAUQzAoCQCAERQ0AIARBMGwhAQNAIAMgABCaAiADQTBqIQMgAUFQaiIBDQALCyACQcAAaiQAC58CAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgsAAQIDBAUGBwgJCgALIAEgAEEIahDxGA8LIAEgACgCKBCAJyABIABBCGoQjyQPCyABIABBCGoQkCQPCyABIAAoAgQQgCcPCwJAIAAoAgQiAigCAEEDRw0AIAEgAigCEBCAJwJAIAIoAgwiAEUNACAAQQR0IQMgAigCCEEMaiEAA0AgASAAKAIAEIAnIABBEGohACADQXBqIgMNAAsLIAIoAiAiAEUNBiABIAAQjBMPCyABIAIoAiAQgCcgASACEI8kDwsgASAAQQRqEJobDwsgASAAQQRqEJobDwsgASAAKAIEEIAnDwsgASAAQQRqEJobDwsgAEEEaiABEJsoCwuuAgEBfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIADgcAAQIDBAUGAAsgAiAAQQhqNgIMIAFBvrucAUEFIAJBDGpBswUQ/wshAQwGCyACIABBBGo2AgwgAUHDu5wBQQUgAkEMakHGBRD/CyEBDAULIAIgAEEEajYCDCABQci7nAFBBCACQQxqQdkFEP8LIQEMBAsgAiAAQQRqNgIMIAFBzLucAUEGIAJBDGpBxwUQ/wshAQwDCyACIABBBGo2AgwgAUHSu5wBQQYgAkEMakHaBRD/CyEBDAILIAIgAEEEajYCDCABQdi7nAFBByACQQxqQaIFEP8LIQEMAQsgAiAAQQRqNgIMIAFB37ucAUEEIAJBDGpB9wQQ/wshAQsgAkEQaiQAIAELrgIBAX8jAEEQayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4HAAECAwQFBgALIAIgAEEIajYCDCABQZicmwFBAyACQQxqQcIGEP8LIQEMBgsgAiAAQQRqNgIMIAFBm5ybAUEEIAJBDGpByAYQ/wshAQwFCyACIABBBGo2AgwgAUGww5sBQQQgAkEMakGLBxD/CyEBDAQLIAIgAEEIajYCDCABQZ+cmwFBAyACQQxqQccGEP8LIQEMAwsgAiAAQQhqNgIMIAFBopybAUEGIAJBDGpByQYQ/wshAQwCCyACIABBCGo2AgwgAUGonJsBQQUgAkEMakGMBxD/CyEBDAELIAIgAEEIajYCDCABQa2cmwFBByACQQxqQYYGEP8LIQELIAJBEGokACABC6kCAQR/IAEgABD1CQJAIAAoAkQiAkUNACAAKAJAIgMgAkHYAGxqIQQDQAJAAkACQCADKAIAIgJBfGoOAgIAAQsgASADKAIEEIAnDAELAkACQAJAIAIOBAMAAQIDCyADKAIEQQFHDQIgASADKAIIEIAnDAILIAMoAgQgARDgBQwBCyADKAIMIgJFDQAgAkEobCEFIAMoAghBBGohAgNAAkACQAJAAkACQCACQXxqKAIADgUEAAECAwQLIAIoAgBBAUcNAyABIAJBBGooAgAQgCcMAwsgASACKAIAEIAnDAILIAEgAigCABDCCQwBCyACIAEQ7wsLIAJBKGohAiAFQVhqIgUNAAsLIANB2ABqIgMgBEcNAAsLAkAgACgCOCICRQ0AIAEgAhCMEwsLqAIBA38jAEEgayIDJAAgASgCBCEEIAEoAgAhBQJAAkAgASgCCC0AAA0AIAUtAAAhASAELQAAIQQCQCACKAKIASIFQYACcUUNACACIAVB/31xNgKIASADQRhqIAEgBCACELYOIAMoAhghASACIAIoAogBQYACcjYCiAEgAygCHCECDAILIANBEGogASAEIAIQtg4gAygCFCECIAMoAhAhAQwBCwJAIAIoAogBIgFBgAJxDQAgAiABQYACcjYCiAEgAyAFLQAAIAQtAAAgAhC2DiADKAIAIQEgAiACKAKIAUH/fXE2AogBIAMoAgQhAgwBCyADQQhqIAUtAAAgBC0AACACELYOIAMoAgwhAiADKAIIIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC58CAQN/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AAAgASAJOgAAIARBAWohBCADIQEMAQsLIAMgBUHwrpwBEJEVAAsgACACKQIENwIAIABBCGogAkEEakEIaigCADYCACACQRBqJAALoAIBAX8jAEEwayICJAAgAiAANgIMIAIgATYCCAJAIAAoAiBBAUcNACAAKAIoIgEgASgCACIBQX9qNgIAIAFBAUcNACAAKAIoIAAoAiwQgR8LIABBADYCICAAIAIpAhA3AiQgAEEsaiACQRhqKAIANgIAIAJBCGoQlAQCQCACKAIIKAKABSgC0AIiAUF/Sg0AIAJBATYCFCACQcCyhAE2AhAgAkIBNwIcIAJB+AA2AiwgAkGYsoQBNgIoIAIgAkEoajYCGCACQRBqQbizhAEQ6SMACyAAQQA2AkggAEEwaiABEIglIABBPGogARCIJSAAQQA2AmQgAEHMAGogARCIJSAAQdgAaiABEIglIABBADYCsAEgAEEANgJsIAJBMGokAAuhAgEDfyMAQcAAayICJAAgACgCACEDAkACQCAALQAEIgQgAC0ABSIARg0AIAIgBDoAOiACIAA6ADsgAkEDNgIMIAJB/NeDATYCCCACQgM3AhQgAkH4ADYCNCACQbEBNgIsIAJBsQE2AiQgAiADNgI8IAIgAkEgajYCECACIAJBPGo2AjAgAiACQTtqNgIoIAIgAkE6ajYCICABKAIAIAEoAgQgAkEIahDfBSEADAELIAIgBDoAOyACQQI2AiQgAkHQ1oMBNgIgIAJCAjcCLCACQfgANgIUIAJBsQE2AgwgAiADNgI8IAIgAkEIajYCKCACIAJBPGo2AhAgAiACQTtqNgIIIAEoAgAgASgCBCACQSBqEN8FIQALIAJBwABqJAAgAAuJAgIDfwF+IAIgAigCOCABajYCOAJAAkACQCACKAI8IgMNAEEAIQQMAQsgACABQQBBCCADayIEIAEgBCABSRsQghIhBiACIAIpAzAgBiADQQN0QThxrYaEIgY3AzACQCABIARJDQAgAiACKQMYIAaFNwMYIAIQ/Q0gAkEANgI8IAIgAikDACACKQMwhTcDAAwBCyADIAFqIQMMAQsgASAEayIFQXhxIQMCQANAIAQgA08NASACIAIpAxggACAEaikAACIGhTcDGCACEP0NIAIgBiACKQMAhTcDACAEQQhqIQQMAAsLIAIgACABIAQgBUEHcSID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ASgC3AIiBU8NAiABKALYAiACQQJ0aiAENgIAAkAgASgC0AIiBSABKALIAkcNACABQcgCakHwq4MBEJIcCyAAIAQ2AgQgAEEwNgIAIAEgBUEBajYC0AIgASgCzAIgBUECdGogAjYCAAwDCyACIARB0KuDARCRFQALIABBMDYCACAAIAQ2AgQMAQsgAiAFQeCrgwEQkRUACyADQcAAaiQAC7YCAQF/IwBB8ABrIgIkACAAKAIAKAIAIQAgAkHctoMBNgJoIAJBvLaDATYCYCACIABBMWo2AlwgAkGctoMBNgJYIAIgAEEQajYCVCACQcy2gwE2AlAgAiAAQSxqNgJMIAJBvLaDATYCSCACIABBMGo2AkQgAkGstoMBNgJAIAIgAEEoajYCPCACQay2gwE2AjggAiAAQSRqNgI0IAJBrLaDATYCMCACIABBIGo2AiwgAkGstoMBNgIoIAIgAEEcajYCJCACQay2gwE2AiAgAiAAQRhqNgIcIAJBnLaDATYCGCACIABBCGo2AhQgAkGctoMBNgIQIAIgADYCDCACIABBMmo2AmwgAiACQewAajYCZCABQYC5gwFBC0GguIMBQQwgAkEMakEMEKgKIQAgAkHwAGokACAAC4QCAgN/AX4jAEHAAGsiAiQAIAJBIGpBGGogAUEQaikCADcCACACQSBqQRBqIAFBCGopAgA3AgAgAiABKQIANwIoIAJBCGpBA0EEQQhB4OmbARCxGSACQQA2AhggAiACKQMINwMQIAJBEGpBAxCTJSACKAIYIgFBA2ohAyACKAIUIAFBA3RqIQRBaCEBAkADQCABRQ0BIAQgAWpBGGogAkEgaiABakEgaikCADcCACABQQhqIQEMAAsLIAIpAxAhBSACQSBqQQhqIgEgAzYCACACIANFOgAsIAIgBTcDICACQSBqEPsFIABBCGogASkDADcCACAAIAIpAyA3AgAgAkHAAGokAAvJAgEBfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEF0aiIDQQcgA0EmSRsOJgkMDAAICQsBDQ0MAwQMDAIDCwQFCQkICAoGCQcMCwgICwsLDAgJCQsgACgCICIAIAI2AjQgACABNgIwDwsgACACNgI0IAAgATYCMA8LIAAoAggOBwcICAkJCgoHCyAAIAI2AiAgACABNgIcDwsgACAC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JAALkQIBCX8jAEEQayIDJAAgAi0ADCEEIAEtAAwhBSACKAIEIQYgAigCACEHIAEoAgQhCCABKAIAIQkCQAJAAkACQCABKAIIIgpFDQAgAigCCCILDQELIANBCGpBACgC+KCcATYCACADQQApAvCgnAE3AwAMAQsCQCALQQFHDQAgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADIAYoAgAQnQkgBiEIIAchCQwCCwJAIApBAUcNACADQQhqIAJBCGooAgA2AgAgAyACKQIANwMAIAMgCCgCABCdCQwCCyADIAggCiAGIAsQrhILIAcgBhD0LAsgCSAIEPQsIAAgBSAEENkbQf8BcSADEN8XIANBEGokAAuKAgEEfyMAQTBrIgMkAEEAIQQCQAJAIAIoAhAiBSACKAIUIgZLDQACQCACKAIAQX9qQQJJDQAgA0EMaiAAIAIoAgggAigCDCAFIAYQgw5BACEEIAMoAgxBAUcNAUEBIQQgAygCECADKAIUTQ0BIANBADYCKCADQQE2AhwgA0H8lIQBNgIYIANCBDcCICADQRhqQdSkgwEQ6SMACyADQQxqIAAgAigCCCACKAIMIAUgBhChFEEAIQQgAygCDEEBRw0AQQEhBCADKAIQIAMoAhRLDQELIANBMGokACAEDwsgA0EANgIoIANBATYCHCADQfyUhAE2AhggA0IENwIgIANBGGpB1KSDARDpIwALigIBBH8jAEEwayIDJABBACEEAkACQCACKAIQIgUgAigCFCIGSw0AAkAgAigCAEF/akECSQ0AIANBDGogACACKAIIIAIoAgwgBSAGEMwIQQAhBCADKAIMQQFHDQFBASEEIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANB/JSEATYCGCADQgQ3AiAgA0EYakHUpIMBEOkjAAsgA0EMaiAAIAIoAgggAigCDCAFIAYQ/QlBACEEIAMoAgxBAUcNAEEBIQQgAygCECADKAIUSw0BCyADQTBqJAAgBA8LIANBADYCKCADQQE2AhwgA0H8lIQBNgIYIANCBDcCICADQRhqQdSkgwEQ6SMAC/QBAQl/IAEoAggiA0EcbCEEQQAhBSACLQAYQf8BcSIGQQdHIQcgASgCBCIIIQkCQAJAA0AgBEUNAQJAIAktABgiCkEHRyAHcw0AQQEhCyAKQQdGDQMg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JSgAASACRw0AIAogCSAAQeCPgAEQwCVBADYAASAERQ0AIAggByAEIAYgCiAJIABB8I+AARDAJS0AAGotAABqQYCQgAEQviVBADYCAAwACwsgAUEQaiQAC4wCAQR/IwBBIGsiAyQAQQEhBAJAIAAtAAQNACAALQAFIQUCQAJAIAAoAgAiBi0ACkGAAXENAEEBIQQgBUEBcUUNASAGKAIAQeKemgFBAiAGKAIEKAIMEQsARQ0BDAILQQEhBAJAIAVBAXENACAGKAIAQbiTnAFBASAGKAIEKAIMEQsADQILQQEhBCADQQE6AA8gA0HwmIEBNgIUIAMgBikCADcCACADIAYpAgg3AhggAyADQQ9qNgIIIAMgAzYCECABIANBEGogAhEHAA0BIAMoAhBBi5mBAUECIAMoAhQoAgwRCwAhBAwBCyABIAYgAhEHACEECyAAQQE6AAUgACAEOgAEIANBIGokACAAC+YBAQN/AkAgA0EISQ0AIAAgACADQQN2IgNBBXQiBGogACADQThsIgVqIAMQxAshACABIAEgBGogASAFaiADEMQLIQEgAiACIARqIAIgBWogAxDECyECCwJAAkAgACgCACIDIAEoAgAiBUYNACADIAVJIQQMAQsgACgCBCABKAIESSEECwJAAkAgAyACKAIAIgZGDQAgAyAGSSEDDAELIAAoAgQgAigCBEkhAwsCQCAEIANHDQACQAJAIAUgBkYNACAFIAZJIQAMAQsgASgCBCACKAIESSEACyACIAEgBCAAcxshAAsgAAvmAQEDfwJAIANBCEkNACAAIAAgA0F4cSIEaiAAIANBA3YiA0EObCIFaiADEMULIQAgASABIARqIAEgBWogAxDFCyEBIAIgAiAEaiACIAVqIAMQxQshAgsCQAJAIAAtAAAiAyABLQAAIgVGDQAgAyAFSSEEDAELIAAtAAEgAS0AAUkhBAsCQAJAIAMgAi0AACIGRg0AIAMgBkkhAwwBCyAALQABIAItAAFJIQMLAkAgBCADRw0AAkACQCAFIAZGDQAgBSAGSSEADAELIAEtAAEgAi0AAUkhAAsgAiABIAQgAHMbIQALIAALjwIBAX8jAEHgAGsiAiQAIAAoAgAhACACQQA2AkwgAkKAgICAEDcCRCACQdC9mAE2AlQgAkKggICADjcCWCACIAJBxABqNgJQAkAgACACQdAAahCeBkUNAEGMrJwBQTcgAkEgakHovZgBQZCtnAEQ6hIACyACQThqQQhqIAJBxABqQQhqKAIANgIAIAIgAikCRDcDOCACQQs2AjQgAkELNgIsIAJB3AA2AiQgAkEENgIMIAJB0MOYATYCCCACQgM3AhQgAiAAQRBqNgIwIAIgAEEMajYCKCACIAJBOGo2AiAgAiACQSBqNgIQIAEoAgAgASgCBCACQQhqEJUpIQAgAkE4ahCULSACQeAAaiQAIAAL6wECBH8BfiMAQSBrIgUkAAJAIAIgACgCACIGIAFrTQ0AQQAhBwJAAkACQCABIAJqIgIgAU8NAAwBCwJAIAMgBGpBf2pBACADa3GtIAKtfiIJQiCIp0UNAAwBCyAJpyIIQYCAgIB4IANrSw0AQQAhAQJAIAZFDQAgBSAGIARsNgIcIAUgACgCBDYCFCADIQELIAUgATYCGCAFQQhqIAMgCCAFQRRqEOIQIAUoAghBAUcNASAFKAIQIQEgBSgCDCEHCyAHIAFByJubARCOKQALIAUoAgwhASAAIAI2AgAgACABNgIECyAFQSBqJAALkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqEOQBDwsgACkDCCAAKAIgEK0YDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ2AMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEMgLIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ2AMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDYAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEMgLIAFBKEEIELMWIABBCGoQ5AELkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqENkBDwsgACkDCCAAKAIgELAYDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ2gMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEMkLIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ2gMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDaAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEMkLIAFBKEEIELMWIABBCGoQ2QELkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqEOUBDwsgACkDCCAAKAIgELUYDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ3AMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEMoLIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ3AMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDcAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEMoLIAFBKEEIELMWIABBCGoQ5QELkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqENQBDwsgACkDCCAAKAIgELwYDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ4QMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEMsLIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ4QMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDhAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEMsLIAFBKEEIELMWIABBCGoQ1AELkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqENUBDwsgACkDCCAAKAIgEL4YDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ4gMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEMwLIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ4gMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDiAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEMwLIAFBKEEIELMWIABBCGoQ1QELkgIBAX8CQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBgUACyAAQQRqENYBDwsgACkDCCAAKAIgEL8YDwsgACgCCCIBIAAoAgwQ7iIgACgCBCABEKEtIAAoAhgiAEUNAiAAKAIAIgEQ4wMgAUHgAEEIELMWIABBDEEEELMWDwsgACgCBCIBEM0LIAFBKEEIELMWIAAoAhgiAEUNASAAKAIAIgEQ4wMgAUHgAEEIELMWIABBDEEEELMWDwsgAEEEahDnESAAKAIEIAAoAggQoy0gACgCGCIARQ0AIAAoAgAiARDjAyABQeAAQQgQsxYgAEEMQQQQsxYLDwsgACgCBCIBEM0LIAFBKEEIELMWIABBCGoQ1gELhgIBAn8CQAJAAkAgASgCACIDLQAUIgRBAkYNACAEQQFxDQAgAi0AHEEERiACLQAdQf8BcUVxIAIoAgAiBEGAAklxRQ0BIATAIgRBf0oNAgJAIAMtABcNACAAIAQ6AAUgAEEBOgAEIABBgICAgHg2AgAPCyAAIAEoAgQgASgCCBCMFCAAQQE6ACQgACACKQIENwIMIABBFGogAkEMaikCADcCACAAQRxqIAJBFGopAgA3AgAPCyAAQQA6AAQgAEGAgICAeDYCACAAIAIoAgA2AggPCyAAIAQ2AgggAEEAOgAEIABBgICAgHg2AgAPCyAAIAQ2AgggAEEAOgAEIABBgICAgHg2AgAL8gECBH8IfiMAQSBrIgIkACACQRBqIgMgAUEQaikDADcDACACQQhqIgQgAUEIaikDADcDACACQRhqIgUgATUCOEI4hiABKQMwhCIGIAFBGGopAwCFNwMAIAIgASkDADcDACACEP0NIAQgBCkDAELuAYU3AwAgAiACKQMAIAaFNwMAIAIQ4AggAyADKQMAIgZC3QGFNwMAIAQpAwAhByACKQMAIQggBSkDACEJIAIQ4AggBSkDACEKIAQpAwAhCyADKQMAIQwgAikDACENIAAgBiAJIAggB4WFhTcDACAAIAogCyAMIA2FhYU3AwggAkEgaiQAC/YBAgZ/BH4gASgCACIEQXxqIQUgAkIZiEKBgoSIkKDAgAF+IQogASgCBCIGIAKncSEHQQAhCANAIAQgB2opAAAiCyAKhSIMQn+FIAxC//379+/fv/9+fINCgIGChIiQoMCAf4MhDAJAA0AgDFANASAMeiENIAxCf3wgDIMhDCAFIA2nQQN2IAdqIAZxIglBAnRrKAIAIANHDQALIAAgAjcDACAAIARBACAJa0ECdGo2AgggACABNgIMDwsCQCALIAtCAYaDQoCBgoSIkKDAgH+DQgBSDQAgCEEIaiIIIAdqIAZxIQcMAQsLIAAgATYCACAAQQA2AgwL9QEBBH8CQCAAKAIIIgJFDQAgACgCBCIDIAJBBnRqIQQDQAJAIAMoAjgiBUUNACADKAI0IQIgBUEMbCEFA0AgAigCACABEKQCIAJBDGohAiAFQXRqIgUNAAsLIAMgARCKCyADQcAAaiICIQMgAiAERw0ACwsgAEEYaiEDAkAgACgCFCIFRQ0AIAAoAhAhAiAFQQxsIQUDQCACKAIAIAEQpAIgAkEMaiECIAVBdGoiBQ0ACwsCQCADKAIAQYCAgIB4Rg0AIAMgARChIAsCQCAAKAI8IgJFDQAgAiABEK8WCwJAIAAoAkAiAkUNACACKAIAIAEQrwILC4UCAQN/IwBB0ABrIgMkACABKALYASEEAkACQAJAIAEtAOABQfgARg0AIAEoAtwBIQUgA0EEaiABENQmIANBATYCLCADQZy/nAE2AiggA0IBNwI0IANBswc2AkQgA0H4ADoATyADIANBwABqNgIwIAMgA0HIAGo2AkAgAyADQc8AajYCSCADQRBqIANBKGoQkhAgA0EkaiADQQRqQQhqKAIANgIAIAMgAykCBDcCHCAEIAUgA0EQahDgGiEEIAEtAOABQaIBRw0BIAEgARCaLBCnFwwBCyABEKELIAAgAUEBIAQgAhCaBgwBCyAAQQg2AgAgACAENgIEIAIQlCgLIANB0ABqJAAL+AEBA38jAEHAAGsiBSQAQQEhBiAFQQhqIAEgAiADIARBAUEAEL0FIAUoAgghAwJAAkAgBS0AHCICQQNGDQAgBUEwakEIaiIGIAVBFGopAgA3AwAgBSAFKQIMNwMwIAVBLmoiASAFQR9qLQAAOgAAIAUgBS8AHTsBLCAFKAIgIQdBCEHAABD/KyIERQ0BIAQgAzYCCCAEQQ82AgAgBCAFKQMwNwIMIAQgAjoAHCAEIAUvASw7AB0gBCAHNgIgIARBFGogBikDADcCACAEQR9qIAEtAAA6AABBACEGIAQhAwsgACADNgIEIAAgBjYCACAFQcAAaiQADwsAC/IBAgZ/AX4jAEEQayIBJAACQCAAKAIEIgJFDQAgACgCACEDAkAgACgCDCIERQ0AIANBCGohACADKQMAQn+FQoCBgoSIkKDAgH+DIQcgAyEFQQEhBgNAIAZFDQECQANAIAdCAFINASAFQYB/aiEFIAApAwBCf4VCgIGChIiQoMCAf4MhByAAQQhqIQAMAAsLIAUgB3qnQQF0QfABcWsiBkF0aigCACAGQXhqKAIAEM8sIAdCf3wgB4MhByAEQX9qIgQhBgwACwsgAUEEakEQIAJBAWoQhhMgAyABKAIMayABKAIEIAEoAggQkykLIAFBEGokAAuLAgEEfyMAQSBrIgMkACAAKAIAIQRBASEFAkAgAC0ACA0AAkAgACgCBCIGLQAKQYABcQ0AQQEhBSAGKAIAQeKemgFB3aucASAEG0ECQQEgBBsgBigCBCgCDBELAA0BIAEgBiACEQcAIQUMAQsCQCAEDQBBASEFIAYoAgBBjZmBAUECIAYoAgQoAgwRCwANAQtBASEFIANBAToADyADQfCYgQE2AhQgAyAGKQIANwIAIAMgBikCCDcCGCADIANBD2o2AgggAyADNgIQIAEgA0EQaiACEQcADQAgAygCEEGLmYEBQQIgAygCFCgCDBELACEFCyAAIAU6AAggACAEQQFqNgIAIANBIGokACAAC+IBAQN/IwBBIGsiBCQAAkACQCABKAIIQQFHDQAgASgCACEFIAEoAgQhBiABEPYtIARBBGpBCGoiASAGNgIAIAQgAiAFayICIANqNgIIIAQgBTYCBCAEQSAgBkEKdmdrIgNBByADQQdJG0ECdEEBcjYCECAEQQRqIAIQiQwgAEEIaiABKQIANwIAIAAgBCkCBDcCAAwBCyAEQRRqIAIgAxDJFCABENQVIAAgBCgCFCIBNgIIIAAgBCkCGDcCACAAQSAgAUEKdmdrIgFBByABQQdJG0ECdEEBcjYCDAsgBEEgaiQAC/8BAQh/IwBBMGsiAiQAQQEhAwJAIAEoAgAiBEHc0IMBQQ0gASgCBCIFKAIMIgYRCwANAEEAIQEDQEH/ASEHAkACQCABQf8BcSIIQf8BRiIJDQBBASEHIAhFDQEgAUEBaiEHCyAEQeKemgFBAiAGEQsADQILIAIgACAIai0AADoAAyACQQI2AgggAkHQ1oMBNgIEIAJCAjcCECACQcYBNgIoIAJBsQE2AiAgAiABOgAvIAIgAkEcajYCDCACIAJBA2o2AiQgAiACQS9qNgIcIAQgBSACQQRqEN8FDQEgByEBIAlFDQALIARBqZmcAUEBIAYRCwAhAwsgAkEwaiQAIAMLoQIBAX8jAEHgAGsiAiQAIAJByI2EATYCWCACQYzvgwE2AlAgAkHc7oMBNgJIIAJB/O6DATYCQCACQdzugwE2AjggAkHs7oMBNgIwIAJB3O6DATYCKCACQdzugwE2AiAgAkHc7oMBNgIYIAJBzO6DATYCECACQbzugwE2AgggAiAANgIsIAIgAEHIAGo2AkwgAiAAQd0AajYCRCACIABBwABqNgI8IAIgAEHcAGo2AjQgAiAAQdsAajYCJCACIABB2gBqNgIcIAIgAEHZAGo2AhQgAiAAQTBqNgIMIAIgAEHYAGo2AgQgAiAAQdAAajYCXCACIAJB3ABqNgJUIAFB9LeEAUEGQfCOhAFBCyACQQRqQQsQqAohACACQeAAaiQAIAALoQIBAX8jAEHgAGsiAiQAIAJByI2EATYCWCACQbiNhAE2AlAgAkGIjYQBNgJIIAJBqI2EATYCQCACQYiNhAE2AjggAkGYjYQBNgIwIAJBiI2EATYCKCACQYiNhAE2AiAgAkGIjYQBNgIYIAJB+IyEATYCECACQeiMhAE2AgggAiAANgIsIAIgAEHIAGo2AkwgAiAAQd0AajYCRCACIABBwABqNgI8IAIgAEHcAGo2AjQgAiAAQdsAajYCJCACIABB2gBqNgIcIAIgAEHZAGo2AhQgAiAAQTBqNgIMIAIgAEHYAGo2AgQgAiAAQdAAajYCXCACIAJB3ABqNgJUIAFB9LeEAUEGQfCOhAFBCyACQQRqQQsQqAohACACQeAAaiQAIAAL9QEBBH8jAEHQAGsiBCQAAkACQCABKAIAQYKAgIB4Rw0AIAAgASkCBDcCBCAAQRxqIAFBHGopAgA3AgAgAEEUaiABQRRqKQIANwIAIABBDGogAUEMaikCADcCAEEiIQEMAQsCQEE4RQ0AIAQgAUE4/AoAAAsgBEE4akEQaiIFIAQQ1iQiBkEQaikCADcDACAEQThqQQhqIgcgBkEIaikCADcDACAEIAYpAgA3AzggAEEcaiACIAMQihQgAEE4aiAFKQMANwIAIABBMGogBykDADcCACAAIAQpAzg3AiggARDyJ0EDIQELIAAgATYCACAEQdAAaiQAC+wBAgN/AX4jAEEwayICJAAgAkEsaiABQQRqLwAAOwEAIAIgASgAADYCKCACQQhqQQNBAUECQeDpmwEQsRkgAkEANgIYIAIgAikDCDcDECACQRBqQQMQlCUgAigCGCIBQQNqIQMgAigCFCABQQF0aiEEQXohAQJAA0AgAUUNASAEIAFqQQZqIAJBIGogAWpBDmovAQA7AAAgAUECaiEBDAALCyACKQMQIQUgAkEgakEIaiIBIAM2AgAgAiADRToALCACIAU3AyAgAkEgahDtBSAAQQhqIAEpAwA3AgAgACACKQMgNwIAIAJBMGokAAuIAgECfwJAAkACQAJAAkACQCAAKAIAIgJBe2oiA0EEIANBBkkbDgYFAAECAwQFCwJAIAAoAghBA0cNACABIAAoAgwQngMLIAEgACgCKBCeAw8LIAEgACgCKBCeAw8LIABBKGohAwJAIAAoAghBA0cNACABIAAoAgwQngMLIAMoAgBBgICAgHhGDQIgAyABEJMgDwsgAEEgaiEDAkAgAkEDRw0AIAEgACgCBBCeAwsCQCADKAIAQQdGDQAgAyABEKIOCyAAKAJoIAEQog4gACgCSEGAgICAeEYNASAAQcgAaiABEJMgDwsCQCAAKAIIQQNHDQAgASAAKAIMEJ4DCyAAKAIoIAEQmA0LC/kBAQN/IwBBIGsiAiQAIAJBEGogARCZAiACKAIUIQMCQAJAIAIoAhBBAXFFDQAgAEEANgIAIAAgAzYCBAwBCyACIAM2AhwCQAJAAkAgAygCAEEtRw0AIAAgAykCBDcCACADKAIAQS1HDQEMAgsCQAJAAkAgAS0AkQFBIHFFDQAgAS0A4AFB/wFxQRJGDQELIABBADYCBAwBCyACQQhqIAEQzgcgAigCDCEEAkAgAigCCEEBcUUNACAAQQA2AgAgACAENgIEIAJBHGoQpywMBAsgARChCyAAIAQ2AgQLIAAgAzYCAAwCCyADEK8DCyADEIgvCyACQSBqJAAL2QEBA38CQAJAAkACQCAAQSRqIgIoAgAgAEEMaigCAEkNAEECIQMDQCABIANGDQQgAkEYaiIEKAIAIAIoAgBJDQIgA0EBaiEDIAQhAgwACwsgAEEkaiEDQQIhAgNAIAEgAkYNAiADQRhqIgQoAgAgAygCAE8NASACQQFqIQIgBCEDDAALCyAAIAFBACABQQFyZ0EBdEE+cxDvAQwBCyABQQF2IQIgAUEYbCAAakFoaiEDA0AgAkUNASAAIANBBhD+HiACQX9qIQIgAEEYaiEAIANBaGohAwwACwsLlQIBBX8jAEEQayIEJAAgASgCBCABKAIIIAJB1IeAARC/JUEIaiEFIAEoAiwhBiABKAIoIQcDQAJAIAcgBiAFKAIAIgVB5IeAARDBJSgCBA0AIAQgBhCkIwJAAkAgBCgCAEUNACAAIAQpAwg3AxAgAEL+////BzcDCCAAQQA2AgAMAQsgBCgCBCEGIAFBJGpBAEHUiYABEPoeIAEoAigiByABKAIsIgggBkH0h4ABEMElIAM2AgACQAJAIAVFDQAgByAIIAVBhIiAARDBJSAGNgIEDAELIAEoAgQgASgCCCACQZSIgAEQvyUgBjYCCAsgAEEDNgIACyAEQRBqJAAPCyAHIAYgBUGkiIABEMElQQRqIQUMAAsL4QEBBn8jAEEQayIDJAAgAyAAIAFBAUG4x4IBEMsUQQAhBCADKAIEQQBHIQAgAygCDCEFIAMoAgghBiADKAIAIQECQANAIABFDQEgASABKAIAIgcgAigCAGoiCCAEQf8BcWoiBDYCACAIIAdJIAQgCElyQQFxIQQgAEF/aiEAIAJBBGohAiABQQRqIQEMAAsLQQAhAgJAIARB/wFxRQ0AIAVBAnQhAQNAAkAgAQ0AQQEhAgwCCyAGIAYoAgBBAWoiADYCACABQXxqIQEgBkEEaiEGIABFDQALCyADQRBqJAAgAgv1AQIHfwF+IwBBIGsiAiQAQYCAgIB4IQMCQAJAIAEoAgBBgICAgHhHDQAMAQsgASgCBCEEIAJBCGogASgCCCIFQQRBEEG08poBELEZIAIoAggiAyAFQf////8AcSIBIAMgAUkbIQZBACEBIAIoAgwhBwNAIAZFDQEgAkEQaiAEIAFqIghBBGooAgAgCEEIaigCABCWGCACIAhBDGotAAA6ABwgAikCECEJIAcgAWoiCEEIaiACQRBqQQhqKQIANwIAIAggCTcCACAGQX9qIQYgAUEQaiEBDAALCyAAIAU2AgggACAHNgIEIAAgAzYCACACQSBqJAALgwIBBH8jAEHQAGsiAiQAAkACQAJAIAEtAOABQegARg0AIAEoAtwBIQMgASgC2AEhBCACQQRqIAEQ1CZBASEFIAJBATYCLCACQZy/nAE2AiggAkIBNwI0IAJBswc2AkQgAkHoADoATyACIAJBwABqNgIwIAIgAkHIAGo2AkAgAiACQc8AajYCSCACQRBqIAJBKGoQ/RogAkEkaiACQQxqKAIANgIAIAIgAikCBDcCHCAEIAMgAkEQahDgGiEDIAEtAOABQaIBRw0BIAEgARCaLBCnFwwBCyABEKELIAAgASkD0AE3AgRBACEFDAELIAAgAzYCBAsgACAFNgIAIAJB0ABqJAAL/gEBAX8jAEEgayIFJAAgBSADOgAFIAUgAjoABCAFQQA6AAYgBSAEOgAHAkAgASgCiAEiA0GAgAFxRQ0AIAEtAJEBQSBxRQ0AIAEtAOABQf8BcUECRw0AIAEoAtwBIQMgASgC2AEhAiAFQZmBgIB4NgIIIAEgAiADIAVBCGoQ3iMgASgCiAEhAwsgBSAFQQVqNgIUIAUgBUEGajYCECAFIAVBB2o2AgwgBSAFQQRqNgIIAkACQCADQYCAIHENACABIANBgIAgcjYCiAEgACAFQQhqIAEQ0hMgASABKAKIAUH//19xNgKIAQwBCyAAIAVBCGogARDSEwsgBUEgaiQAC/wBAQN/AkACQAJAAkACQAJAIAAoAgAOBwABAgMEBQUACyAAQQhqIAEoAgAgASgCBBCcCQ8LIAAoAgxBKGwhAiAAKAIIIQADQCACRQ0EAkAgACgCAEEHRg0AIAAgARDkCwsgAEEoaiEAIAJBWGohAgwACwsgAEEEaiABEIUwDwsgACgCDEE4bCECIAEoAgQhAyABKAIAIQQgACgCCCEAA0AgAkUNAgJAAkACQAJAIAAoAgAOAwABAgALIABBKGogARCyLwwCCyAAQRBqIAQgAxCcCQwBCyAAQQRqIAEQhTALIABBOGohACACQUhqIQIMAAsLIABBBGogARCyLwsLhgIBA38jAEEgayIDJAAgACgCACIAKAIAIQQgAEEANgIAAkAgBEEBcQ0AQbjXgAFBMRDyLQALIANBEGpBCGoiBCAAQQxqKAIANgIAIAMgACkCBDcDEEEkEOgnIgBBADoAICAAIAI2AhAgACABNgIMIABBCGogBCgCADYCACAAIAMpAxA3AgBBIBDsJyIEQQE6ABwgBEIANwIIIARCgoCAgBA3AgAgA0EIaiAEQQhqIgVBjIueARDsIyADKAIMIQEgAygCCCICEKYbIAIgBTYCDCACQZyLngE2AgggAkGA1YABNgIEIAIgADYCACABIAEoAgBBAWo2AgAQmgcgBBCUDSADQSBqJAALjQIBAX8gABDPBiAAQQRqIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LAQIDBAUGBwgJCgsACyABKAIAIgAQ5yogAEEkQQQQsxYPCyABKAIAEI4uDwsgASgCACIAKAIAIABBBGooAgAQ9iwgAEE8QQQQsxYPCyABKAIAQSBBBBCzFg8LIAEoAgAQji4PCyABKAIAQRxBBBCzFg8LIAEoAgAiABDoGyAAQThBBBCzFg8LIAEoAgBBHEEEELMWDwsgARDDKQ8LIAEoAgAiAEEkahDCKSAAQcQAQQQQsxYPCyABKAIAIgAQ4B4gAEHIAEEEELMWDwsgASgCACIAEOcqIABBJEEEELMWC/ABAQR/IwBBMGsiBCQAQQAhBQJAIAMoAhAiBiADKAIUIgdLDQACQAJAIAMoAgBBf2pBAkkNACAEQQxqIAFBBGogAygCCCADKAIMIAYgBxDqBiAEKAIMQQFHDQIgBCgCECAEKAIUIgNNDQEgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDpIwALIAYgAygCDE8NAQJAIAEtAAQgAygCCCAGai0AACIDRg0AIAEtAAVB/wFxIANHDQILIAZBAWohAwsgACADNgIIIABBADYCBEEBIQULIAAgBTYCACAEQTBqJAALjQIBAX8gABDPBiAAQQRqIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LAQIDBAUGBwgJCgsACyABKAIAIgAQ5yogAEEkQQQQsxYPCyABKAIAEI4uDwsgASgCACIAKAIAIABBBGooAgAQ9iwgAEE8QQQQsxYPCyABKAIAQSBBBBCzFg8LIAEoAgAQji4PCyABKAIAQRxBBBCzFg8LIAEoAgAiABDoGyAAQThBBBCzFg8LIAEoAgBBHEEEELMWDwsgARDJKQ8LIAEoAgAiAEEkahDMKSAAQcQAQQQQsxYPCyABKAIAIgAQ3x4gAEHIAEEEELMWDwsgASgCACIAEOcqIABBJEEEELMWC/QBAQF/IwBBIGsiAiQAAkACQAJAIAEQyS8NACACQQxqIAEQ6gkCQCACKAIMQYCAgIB4Rg0AIAJBCGogAkEMakEIaigCADYCACACIAIpAgw3AwAgACACEN8VDAILIAAgARCgCTYCGCAAQQI2AgAgAEEUaiABQRBqKAIANgIAIABBDGogAUEIaikCADcCACAAIAEpAgA3AgQMAgsgAkEQahDJIyACQQE2AgwgACACQQxqEKAJNgIYIABBAjYCACAAQRRqIAJBHGooAgA2AgAgAEEMaiACQRRqKQIANwIAIAAgAikCDDcCBAsgARDXJAsgAkEgaiQAC4YCAQR/IwBBEGsiBSQAQQAtAKDxngEaAkACQEEQEH0iBkUNACAFQQRqIARBAUEBEJUPIAUoAgghByAFKAIEQQFGDQEgBSgCDCEIAkAgBEUNACAIIAMgBPwKAAALIAZBEzoADCAGIAQ2AgggBiAINgIEIAYgBzYCAEHQAEEEEJclIgQgAjoATCAEQQA2AkggBEKAgICAwAA3AkAgBEIENwI4IARCADcCMCAEQoCAgIDAADcCKCAEQgQ3AiAgBEIBNwIYIAQgBjYCFCAEQQE2AhAgBEECNgIAIABBAToACCAAIAQ2AgQgACABNgIAIAVBEGokAA8LAAsgByAFKAIMQcC8nAEQjikAC/8BAgV/A35BiOKeAUGI4p4BEIkoGkEAIQECQEEAKAKU4p4BRQ0AQQAhAkEAKAKI4p4BIgNBeGohBCAAKQMAENYgIgZCGYhCgYKEiJCgwIABfiEHQQAoAozingEiBSAGp3EhAQNAAkAgAyABaikAACIIIAeFIgZCf4UgBkL//fv379+//358g0KAgYKEiJCgwIB/gyIGUA0AA0ACQCAAIAQgBnqnQQN2IAFqIAVxQQN0axCTDEUNAEEBDwsgBkJ/fCAGgyIGUEUNAAsLAkAgCCAIQgGGg0KAgYKEiJCgwIB/g1ANAEEAIQEMAgsgASACQQhqIgJqIAVxIQEMAAsLIAEL+QEBAX8CQCABKAIAIgINACAAIAFBCGoQ0gQPCwJAAkACQAJAAkAgAkF/ag4GAAECBAMDAAsgASgCDCICRQ0CIAEoAgghASACQShsIQIDQAJAIAEoAgBBB0YNACAAIAEQ7AsLIAFBKGohASACQVhqIgINAAwDCwsgACABKAIEEOwLDwsgASgCDCICRQ0AIAEoAgghASACQThsIQIDQAJAAkACQAJAIAEoAgAOAwABAgALIAAgAUEoaigCABDsCwwCCyAAIAFBEGoQ0gQMAQsgACABQQRqKAIAEOwLCyABQThqIQEgAkFIaiICDQALCw8LIAAgASgCBBDsCwuKAgICfwF+IwBBIGsiAiQAAkACQAJAIAEtAOABQcQARg0AIAJBCGpBBHIgARDUJiACQQ42AhwgAkGY3ZsBNgIYIAJBsICAgHg2AgggASgC2AEgASgC3AEgAkEIahDgGiEDIAEtAOABQaIBRw0BIAEgARCaLBCnFwwBCyABKALYASEDIAJBCGogARCnDyABEKELIAIpAxghBAJAIAIoAghBAXENACAAIAIpAxA3AxAgACADNgIIIAAgBDcDACAAIAEoAtQBNgIMIAAgAS0A4AFBGkY6ABgMAgsgAigCDCEBIABBAjoAGCAAIAE2AgAgBBDIIQwBCyAAQQI6ABggACADNgIACyACQSBqJAAL8gEBBX8jAEEgayICJAAgAkKAgICAwAA3AgxBBCEDQQAhBEEAIQUDQCACIAQ2AhQCQANAIAVBgAJGDQEgACAFaiEGIAVBAWohBSAGLQAARQ0ACyAAIAVqQX9qIQYCQCAEIAIoAgxHDQAgAkEMahD9GyACKAIQIQMLIAMgBEECdGogBjYCACAEQQFqIQQMAQsLIAEoAgBB1JOAAUEPIAEoAgQoAgwRCwAhBSACQQA6AB0gAiAFOgAcIAIgATYCGCACQRhqQaO6nAFBAyACQQxqQS0QvQkQlBUhBSACKAIMIAIoAhBBBEEEEJMWIAJBIGokACAFC/ABAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEgBCgCCBCAJwwDCyABIAQoAgQQgCcMAgsgBCgCBCIGQcAAaiABEMQKIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDOCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgASAGQRBqEPUJDAELIARBBGogARDvCwsgBEEoaiIEIAVHDQALCyACQRBqJAAL8AEBBX8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCIEIANBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgASAEKAIIEKcBDAMLIAEgBCgCBBCnAQwCCyAEKAIEIgZBwABqIAEQqQsgBigCmAEhAyAGKAKUASEAIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEM8IIABBKGohACADQVhqIgMNAAsLIAYtADxBBkYNASABIAZBEGoQ9AwMAQsgBEEEaiABEPALCyAEQShqIgQgBUcNAAsLIAJBEGokAAvpAQIGfwF+IwBBEGsiASQAAkAgACgCBCICRQ0AIAAoAgAhAwJAIAAoAgwiBEUNACADQQhqIQAgAykDAEJ/hUKAgYKEiJCgwIB/gyEHQQEhBSADIQYDQCAFRQ0BAkADQCAHQgBSDQEgBkHgfmohBiAAKQMAQn+FQoCBgoSIkKDAgH+DIQcgAEEIaiEADAALCyAGQQAgB3qnQQN2a0EUbGpBbGoQxycgB0J/fCAHgyEHIARBf2oiBCEFDAALCyABQQRqQRRBCCACQQFqENoRIAMgASgCDGsgASgCBCABKAIIEJMpCyABQRBqJAAL+QEBBH8jAEEgayIDJAAgAUEEaiEEIAIoAogBIgVBgAFxIQYCQAJAIAEoAgAtAAANAAJAIAZFDQAgAiAFQf9+cTYCiAEgA0EYaiAEIAIQxQogAygCGCEBIAIgAigCiAFBgAFyNgKIASADKAIcIQIMAgsgA0EQaiAEIAIQxQogAygCFCECIAMoAhAhAQwBCwJAIAYNACACIAVBgAFyNgKIASADIAQgAhDFCiADKAIAIQEgAiACKAKIAUH/fnE2AogBIAMoAgQhAgwBCyADQQhqIAQgAhDFCiADKAIMIQIgAygCCCEBCyAAIAE2AgAgACACNgIEIANBIGokAAvuAQEHfyAAQRhqIQIgAEEMaiEDIAAoAgQhBAJAAkACQAJAIAAoAggiBUUNACAEKAIADQAgBEEIakGolpwBQQQQhCJFDQAgBCgCKCEGIAEoAhwgASgCICAEKAIsIgcQoyoiCC0ACEEHRg0BIAYhCAwCCyAEIAUgARC/IwwCCyAGIAgoAgQiByAGIAdJGyEIIAYgByAGIAdLGyEHCyABIAggBxDKHyAEQcAAaiAFQX9qIAEQvyMLIAMgARCNISACIAEQ+SgCQCAAKAI8IgRFDQAgASAEQQxqKAIAIARBEGooAgAQyh8LIAAoAkAgARCfJguLAgEBfgJAAkACQAJAAkACQAJAAkAgACgCAA4IAQIDBAUGBwABCyAAKAIEIgApAwghAQJAAkAgACgCAA0AIAEQxiEMAQsgASAAQRhqKQMAEKYuCwJAIAAtAEVBA0YNACAAQSBqEOEjCyAAQdgAQQgQsxYPCyAAKQMIEMYhIABBIGoQxRoPCyAAKQMIEMYhIAAoAiAQzBsPCyAAKAIEEKssDwsgACgCBBCsLA8LIAAoAgQQtSQPCyAAKAIEIgApAwgQxiEgACgCIBDnJCAAQSRqELMGIABBMEEIELMWDwsgACgCBCIAKQMAEMYhIABBIGoQ0BAgACgCICAAQSRqKAIAEJ4tIABBMEEIELMWC+EBAQR/IwBBIGsiAyQAIANBFGogAUEAQQRBBBCoDCADKAIYIQQCQCADKAIUQQFGDQAgA0EANgIQIAMgAygCHDYCDCADIAQ2AgggA0EIaiABEPwkIAFBASABQQFLGyIFQX9qIQQgAygCDCADKAIQIgZBAnRqIQICQAJAA0ACQCAEDQAgBiAFaiEEIAENAiAEQX9qIQQMAwsgAkEANgIAIARBf2ohBCACQQRqIQIMAAsLIAJBADYCAAsgACADKQIINwIAIABBCGogBDYCACADQSBqJAAPCyAEIAMoAhwgAhCOKQALiAIBAn8jAEHAAGsiAiQAIAJCADcCKCACQoCAgIDAADcCICACQgg3AhggAkIANwIQIAJCgICAgMAANwIIAkACQAJAAkAgAacNACACQQhqQQAQkwYgAkEwaiACKAIMIAIoAhAQjwsCQCACKAIwIgNBhICAgHhGDQAgACACKQI0NwIEIABBDGogAkEwakEMaigCADYCACAAIAM2AgAMAgtBAC0AoPGeARpBMBB9IgNFDQIgA0KBgICAEDcCAAJAQShFDQAgA0EIaiACQQhqQSj8CgAACyAAQYSAgIB4NgIAIAAgAzYCBAwDCyAAQoOAgIAINwMACyACQQhqEM8dDAELAAsgAkHAAGokAAvmAQECfyABQXxqIQECQAJAA0ACQCAAQY/OAEsNACABQQRqIQEgAEHjAEsNAiAAIQIMAwsgASAAQZDOAG4iAkHwsX9sIABqIgBB5ABuIgNBAXRB3PyYAWovAAA7AAAgAUECaiAAIANB5ABsa0EBdEHc/JgBai8AADsAACABQXxqIQEgAiEADAALCyABQX5qIgEgACAAQf//A3FB5ABuIgJB5ABsa0H//wNxQQF0Qdz8mAFqLwAAOwAACwJAIAJBCUsNACABQX9qIAJBMHI6AAAPCyABQX5qIAJBAXRB3PyYAWovAAA7AAAL7gEBBX8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCIEIANBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgBCgCCCABEL4DDAMLIAQoAgQgARC+AwwCCyAEKAIEIgZBwABqIAEQrwsgBigCmAEhAyAGKAKUASEAIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAENQIIABBKGohACADQVhqIgMNAAsLIAYtADxBBkYNASAGQRBqEJ8aDAELIARBBGogARD4CwsgBEEoaiIEIAVHDQALCyACQRBqJAAL7AEBBX8jAEEQayICJAACQCAAKAIIIgNFDQAgACgCBCIEIANBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgASAEKAIIEFQMAwsgASAEKAIEEFQMAgsgBCgCBCIGQcAAaiABEKgLIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDTCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCnKAwBCyAEQQRqIAEQ+QsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC+4BAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEgBCgCCBCeAwwDCyABIAQoAgQQngMMAgsgBCgCBCIGQcAAaiABEK4LIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDSCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCnKAwBCyAEQQRqIAEQ+gsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC+4BAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAQoAgggARCkAgwDCyAEKAIEIAEQpAIMAgsgBCgCBCIGQcAAaiABEM4KIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDWCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCnKAwBCyAEQQRqIAEQ+wsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC+4BAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEgBCgCCBDmAQwDCyABIAQoAgQQ5gEMAgsgBCgCBCIGQcAAaiABEIsLIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDXCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCjGgwBCyAEQQRqIAEQ/AsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC+4BAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEgBCgCCBDRAQwDCyABIAQoAgQQ0QEMAgsgBCgCBCIGQcAAaiABELALIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDYCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCnKAwBCyAEQQRqIAEQ/QsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC+4BAQV/IwBBEGsiAiQAAkAgACgCCCIDRQ0AIAAoAgQiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAEgBCgCCBCqAQwDCyABIAQoAgQQqgEMAgsgBCgCBCIGQcAAaiABELELIAYoApgBIQMgBigClAEhACACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABDZCCAAQShqIQAgA0FYaiIDDQALCyAGLQA8QQZGDQEgBkEQahCnKAwBCyAEQQRqIAEQ/gsLIARBKGoiBCAFRw0ACwsgAkEQaiQAC4ECAQV/IwBBIGsiBSQAQQEhBgJAIAAoAgAiByABIAIgACgCBCIIKAIMIgkRCwANAAJAAkAgAC0ACkGAAXENAEEBIQYgB0Hdq5wBQQEgCRELAA0CIAMgACAEEQcADQIgACgCACEHIAAoAgQoAgwhCQwBCyAHQY2ZgQFBAiAJEQsADQFBASEGIAVBAToADyAFIAg2AgQgBSAHNgIAIAVB8JiBATYCFCAFIAApAgg3AhggBSAFQQ9qNgIIIAUgBTYCECADIAVBEGogBBEHAA0BIAUoAhBBi5mBAUECIAUoAhQoAgwRCwANAQsgB0HchJ4BQQEgCRELACEGCyAFQSBqJAAgBgvwAQEEfyMAQSBrIgUkAAJAIAIgASgCACIGSw0AAkACQCAGDQBBACEGIAVBBGohBwwBCyAFIAM2AgQgBiAEbCEGIAEoAgQhCCAFQRxqIQcLIAcgBjYCAAJAAkAgBSgCBCIGRQ0AIAUoAhwhBwJAAkAgAg0AIAggBiAHEJMpDAELIAggByAGIAQgAmwiBBD0AyIDRQ0CCyABIAI2AgAgASADNgIEC0GBgICAeCEGCyAAIAQ2AgQgACAGNgIAIAVBIGokAA8LIAVBADYCFCAFQQE2AgggBUGMhp4BNgIEIAVCBDcCDCAFQQRqQeSGngEQ6SMAC94BAQJ/AkACQAJAIAFBgAFJDQAgAUGAEEkNAUEDQQQgAUGAgARJIgMbIQQCQCADDQAgAiABQT9xQYABcjoAAyACIAFBEnZB8AFyOgAAIAIgAUEGdkE/cUGAAXI6AAIgAiABQQx2QT9xQYABcjoAAQwDCyACIAFBP3FBgAFyOgACIAIgAUEMdkHgAXI6AAAgAiABQQZ2QT9xQYABcjoAAQwCCyACIAE6AABBASEEDAELIAIgAUE/cUGAAXI6AAEgAiABQQZ2QcABcjoAAEECIQQLIAAgBDYCBCAAIAI2AgAL6QECAX8CfgJAAkACQAJAAkACQCAAKAIADgYBBQUCAwQACyAAQQhqEJMUDwsgAEEIahDIEwwDCyAAKQMYIgJQDQIgAkIDg0IAUg0CIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNAiAAIAAoAhAQxiQPCyAAKQMQIAAoAhgQtBkPCyAAKQMQIQICQCAAKQMIIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCyACQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJA8LC4wCAQF/IwBB4ABrIgIkACAAKAIAIQAgAkG0k5sBNgJYIAJBkJmZATYCUCACIABBPmo2AkwgAkGQmZkBNgJIIAIgAEE9ajYCRCACQbCZmQE2AkAgAiAAQcAAajYCPCACQaCZmQE2AjggAiAAQShqNgI0IAJBkJmZATYCMCACIABBPGo2AiwgAkGAmZkBNgIoIAIgAEE4ajYCJCACQfCYmQE2AiAgAiAAQTRqNgIcIAJBkJqZATYCGCACIAA2AhQgAkHEkpsBNgIQIAIgAEEgajYCDCACIABBP2o2AlwgAiACQdwAajYCVCABQd+VmwFBDEHYmJsBQQogAkEMakEKEKgKIQAgAkHgAGokACAAC/0BAgR/An4jAEHgAGsiAiQAAkAgASgCGCIDKAIwIgRFDQAgAC0AOSEFIABBAToAOSAEIAAQ2gEgACAFOgA5CyAAKAIwEPwVIQQgAkE0aiAAQTRqKAIANgIAIAJBADoAOSACQQhqQQApA4CFngEiBjcDACACQRBqIgVBACkD+ISeASIHNwMAIAJBGGogBjcDACACIAA2AiAgAiAENgIkIAJBAToAKCACIAApAiw3AiwgAiAAKAE6NgE6IAIgAC0AODoAOCACIAc3AwACQCABLQAUQQJGDQAgAiABELQTCyACQQE6ADkgAiADEKYBIAIQsAogBRDMCiACQeAAaiQAC/4BAQF/AkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LCQABAgMEBQYHCAkJCyABIAAoAigQmSsgASAAQQhqEMwmDwsgASAAQQhqEM0mDwsgASAAKAIEEJkrDwsCQCAAKAIEIgAoAgBBA0cNACABIAAoAhAQmSsgACgCDCICRQ0GIAJBBHQhAiAAKAIIQQxqIQADQCABIAAoAgAQmSsgAEEQaiEAIAJBcGoiAg0ADAcLCyABIAAoAiAQmSsgASAAEMwmDwsgASAAKAIEEJkrDwsgASAAKAIEEJkrDwsgASAAKAIEEJkrDwsgASAAKAIEEJkrDwsgASAAKAIEEJkrCwuMAgEBfyMAQeAAayICJAAgACgCACEAIAJBtJObATYCWCACQYSTmwE2AlAgAiAAQT5qNgJMIAJBhJObATYCSCACIABBPWo2AkQgAkGkk5sBNgJAIAIgAEHAAGo2AjwgAkGUk5sBNgI4IAIgAEEoajYCNCACQYSTmwE2AjAgAiAAQTxqNgIsIAJB9JKbATYCKCACIABBOGo2AiQgAkHkkpsBNgIgIAIgAEE0ajYCHCACQciYmwE2AhggAiAANgIUIAJBxJKbATYCECACIABBIGo2AgwgAiAAQT9qNgJcIAIgAkHcAGo2AlQgAUHflZsBQQxB2JibAUEKIAJBDGpBChCoCiEAIAJB4ABqJAAgAAv6AQEBfwJAIAAtAARBAUcNAAJAAkACQAJAAkACQCABKAIAQXtqIgJBBCACQQZJGw4GBQABAgMEBQsgACABQQhqEJQOIAAgASgCKBD2GgwECyAAIAEoAigQ9hoMAwsgACABQQhqEJQOIAEoAihBgICAgHhGDQIgAUEoaiAAEKggDAILIAAgARCUDgJAIAEoAiBBB0YNACABQSBqIAAQ8goLIAEoAmggABDyCiABKAJIQYCAgIB4Rg0BIAFByABqIAAQqCAMAQsgACABQQhqEJQOIAEoAiggABCgDQsCQCACQQFHDQAgACAAKAIAQQFqNgIADwsgAEEAOgAECwvjAQEHfyACKAIAIAAoAgQgACgCABDfISEDIAIoAgAgACgCDCAAKAIIEN8hIQQgAigCACAAQQxBCCAEG2oiBSgCACAAIANBAnRqIgYoAgAQ3yEhByACKAIAIABBCEEMIAQbaiIEKAIAIAAgA0EBc0ECdGoiACgCABDfISEDIAIoAgAgBCAAIAUgBxsgAxsiAigCACAGIAUgACADGyAHGyIIKAIAEN8hIQkgASAFIAYgBxsoAgA2AgAgASACIAggCRsoAgA2AgQgASAIIAIgCRsoAgA2AgggASAAIAQgAxsoAgA2AgwL3wEBBn8CQCABRQ0AAkAgACgCDCICQQFxRQ0AAkACQCACQQV2IgMgAWoiBEGAgIDAAE8NACAEQQV0IAJBH3FyIQQMAQtBAC0AoPGeARogACgCCCEFIAAoAgQhBiAAKAIAIQcCQEEUEH0iBEUNACAEQQE2AhAgBCADIAZqNgIIIAQgByADazYCBCAEIAUgA2o2AgAgBCACQQJ2QQdxNgIMDAELAAsgACAENgIMCyAAIAAoAgAgAWo2AgAgACAAKAIIIAFrNgIIIABBACAAKAIEIgQgAWsiASABIARLGzYCBAsL6QEBAn8jAEEgayICJAACQAJAIAFB////d0YNACACIAFB////B3E2AhggAkEBNgIUIAJBADYCHCACQQhqIAJBFGpBsN2AARCpGyAAIAIoAggiASACKAIMakF/akEAIAFrcSABELMWDAELQQAhAQJAIABBfGoiACgAACIDQX9zQR92IANBhN2AARC+IiIDQfj///8HSw0AQQQhASACQQQ2AhwgAiADQQRqNgIYCyACIAE2AhQgAkEIaiACQRRqQaDdgAEQqRsgACACKAIIIgEgAigCDGpBf2pBACABa3EgARCzFgsgAkEgaiQAC+wBAQJ/IwBB0ABrIgYkACAGIAU2AiAgBiAENgIcAkAgBSADSw0AIAQgBUEBaksNAEEAIQcgBkEAOwEYIAYgAzYCFCAGIAI2AhAgBiAFNgIMIAYgBDYCCCAGQSRqIAEgBkEIahCrCwJAIAYoAiRBAUcNACAAIAYpAig3AgRBASEHCyAAIAc2AgAgBkHQAGokAA8LIAZBAjYCKCAGQeDomwE2AiQgBkICNwIwIAZBCzYCSCAGQaIBNgJAIAYgAzYCTCAGIAZBPGo2AiwgBiAGQcwAajYCRCAGIAZBHGo2AjwgBkEkakHYlIQBEOkjAAvsAQEBfyMAQdAAayIGJAAgBiAFNgIgIAYgBDYCHAJAIAUgA0sNACAEIAVBAWpLDQAgBiADNgIUIAYgAjYCECAGIAU2AgwgBiAENgIIIAZBATYCGCAGQSRqIAEgBkEIahCrC0EAIQUCQCAGKAIkQQFHDQAgACAGKQIoNwIEQQEhBQsgACAFNgIAIAZB0ABqJAAPCyAGQQI2AiggBkHg6JsBNgIkIAZCAjcCMCAGQQs2AkggBkGiATYCQCAGIAM2AkwgBiAGQTxqNgIsIAYgBkHMAGo2AkQgBiAGQRxqNgI8IAZBJGpB2JSEARDpIwAL3AEBBn8CQCABKAIEIgMgASgCACIEa0EDdiIFIAAoAgAgACgCCCIGa00NACAAIAYgBUEEQQgQ0R0gACgCCCEGCyAGIAVqIQcgACgCBCAGQQN0aiEGIAEoAhAhBSABKAIMIQggASgCCCEBAkADQCAEIANGDQEgBiAEKQIANwIAIARBCGohBCAGQQhqIQYMAAsLIAAgBzYCCAJAIAVFDQACQCAIIAEoAggiBEYNACAFQQN0IgZFDQAgASgCBCIDIARBA3RqIAMgCEEDdGogBvwKAAALIAEgBSAEajYCCAsL+gEBAn8jAEEwayIEJAAgBCACNgIMAkACQCABLQCRAUEgcQ0AIABBCDYCACADEJQoDAELAkAgASgCiAEiBUGAgIGABHFBgICBgARHDQAgASgC1AEhBSAEQfyAgIB4NgIQIAEgAiAFIARBEGoQ3iMgASgCiAEhBQsgBCACNgIsIARBEGpBCGogA0EIaigCADYCACAEIAMpAgA3AxAgBCAEQQxqNgIgIAQgBEEsajYCHAJAIAVBgIABcQ0AIAEgBUGAgAFyNgKIASAAIARBEGogARDcASABIAEoAogBQf//fnE2AogBDAELIAAgBEEQaiABENwBCyAEQTBqJAAL6gECAX8BfiMAQSBrIgMkACADQQA2AhAgA0EIaiACIANBEGpB0IGcAUECELENAkACQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRBqIAIgASgCDCABKAIQIAEoAgQgASgCCBC6AwJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBADYCECADQQhqIAIgA0EQakHNgZwBQQMQsQ0CQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBIGokAAuEAgEBfyAAKAIUIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAhQQsRILIAAoAgggAEEMaigCABD7LAJAIAAoAugEIgFBgICAgHhGDQAgASAAQewEaigCABCZLSAAQfQEahD2KiAAQaQFahD2KgsCQCAAKALUBSIBQYCAgIB4Rg0AIAEgAEHYBWooAgAQmS0gACgC4AUgAEHkBWooAgAQiy0LAkAgACgC2AQiAUGAgICAeEYNACABIABB3ARqKAIAEPssCwJAIAAoAsgEQQJGDQAgAEHYAWoQ+hEgAEGYA2oQ+hELAkAgACgCyAFBAkYNACAAQRhqEPoRCyAAQfAFQQgQsxYL2QEAAkACQAJAIAFBgAFJDQAgAUGAEEkNAQJAIAFBgIAESQ0AIAIgAUE/cUGAAXI6AAMgAiABQRJ2QfABcjoAACACIAFBBnZBP3FBgAFyOgACIAIgAUEMdkE/cUGAAXI6AAFBBCEBDAMLIAIgAUE/cUGAAXI6AAIgAiABQQx2QeABcjoAACACIAFBBnZBP3FBgAFyOgABQQMhAQwCCyACIAE6AABBASEBDAELIAIgAUE/cUGAAXI6AAEgAiABQQZ2QcABcjoAAEECIQELIAAgATYCBCAAIAI2AgAL0QECBH8BfkIAIQUCQCAAKAIAIgFFDQAgACgCBCICQQBIDQBCfyEFIAJBEksNAAJAAkAgAg0AQgAhBQwBCyAAQQhqIQNBACEEQgAhBQNAIAVCCn4hBQJAIAQgAU8NACAFIAMgBGoxAAB8IQULIAIgBEEBaiIERw0ACwsgAiABTw0AAkACQCAAIAJqIgMtAAgiBEEFRw0AIAJBAWogAUcNACAALQCIBg0BIAJFDQIgA0EIakF/ai0AAEEBcQ0BDAILIARBBE0NAQsgBUIBfCEFCyAFC9oBAgV/An4jAEEQayICJABBASEDAkAgACkDACIHIAEpAwAiCFENAEEAIQMgB6ciBEEDcSIFIAinIgZBA3FHDQACQCAFRQ0AAkAgB0IDg0IAUg0AIAQpAwghBwsCQCAIQgODQgBSDQAgBikDCCEICyAHIAhSDQEgAkEIaiAAEPEVIAIoAgwhAyACKAIIIQAgAiABEPEVIAAgAyACKAIAIAIoAgQQ6yUhAwwBCyAEKQMIIAYpAwhSDQAgBEEYaiAEKAIQIAZBGGogBigCEBDrJSEDCyACQRBqJAAgAwvuAQECfyMAQcAAayIFJAAgASgCICEGAkACQAJAIAJBAXFFDQAgBiADQQFqRg0BQfSqgwFBOUGwq4MBENIeAAsgBg0BCyAFIAEgBBDfCiAFKAIEIQICQAJAIAUoAgAiBkEwRg0AAkBBOEUNACAAQQhqIAVBCGpBOPwKAAALIAAgAjYCBCAAIAY2AgAMAQsCQCABKAIgIgYgASgCGEcNACABQRhqQcCrgwEQkhwLIAAgAjYCBCAAQTA2AgAgASAGQQFqNgIgIAEoAhwgBkECdGogAjYCAAsgBUHAAGokAA8LQbaqgwFBLEHkqoMBENIeAAvrAQECfyMAQSBrIgEkAAJAAkAgACgCCEUNACAAIAAvARBBAWoiAjsBECACQf//A3EgAkYNASABQQA2AhggAUIANwMQIAFBADsBHCABQQRqIAFBEGogACgCDEH8yIMBELoKIAAoAgAgACgCBBD9LCAAQQhqIAFBBGpBCGooAgA2AgAgACABKQIENwIADAELIAFBADYCGCABQgA3AxAgAUEAOwEcIAFBBGogAUEQaiAAKAIMQYzJgwEQugogACgCACAAKAIEEP0sIABBCGogAUEEakEIaigCADYCACAAIAEpAgQ3AgALIAFBIGokAAvbAQEGfyMAQSBrIgIkACACQQhqQQFBBEEIQeDpmwEQsRlBACEDIAJBADYCGCACIAIpAwg3AxAgAkEQakEBEJMlIAIoAhgiBEEBaiEFIAIoAhQgBEEDdGohBCABQiCIpyEGIAGnIQcCQANAIANBAXENASAEIAc2AgAgBEEEaiAGNgIAIARBCGohBEEBIQMMAAsLIAIpAxAhASACQRBqQQhqIgQgBTYCACACIAVFOgAcIAIgATcDECACQRBqEPsFIABBCGogBCkDADcCACAAIAIpAxA3AgAgAkEgaiQAC/oBAQJ/IwBBIGsiAyQAQQMhBAJAAkACQAJAIAEgAkGI9JsBQQMQ6yVFDQBB0b6IASECDAELQQghBAJAIAEgAkGkvogBQQgQ6yVFDQBByb6IASECDAELQQUhBAJAIAEgAkGsvogBQQUQ6yVFDQBBxL6IASECDAELIANBFGpB3IaIAUEQELAMQQEhBAJAIAMtABRBAUcNACAAIAMtABU6AAEMAgsgAygCGCIERQ0CIANBCGogBCADKAIcIAEgAhD4DiADKAIMIQQgAygCCCECCyAAIAQ2AgggACACNgIEQQAhBAsgACAEOgAAIANBIGokAA8LQbS+iAEQ0iwAC+4BAQN/IwBBEGsiAyQAAkACQCACKAIAQQFxRQ0AQQkhAkGI15gBIQQMAQsgA0EEaiACKAIEIAIoAggQ2wRBiNeYASADKAIIIAMoAgQiAhshBEEJIAMoAgwgAhshAgsgBCACIAEQjw8hAgJAAkAgACgCACIBQYCAgIB4Rg0AIAFFDQEgACgCBCABQQEQsxYMAQsgAC0ABEEDRw0AIAAoAggiACgCACEEAkAgAEEEaigCACIBKAIAIgVFDQAgBCAFEQMACwJAIAEoAgQiBUUNACAEIAUgASgCCBCzFgsgAEEMQQQQsxYLIANBEGokACACC+cBAQV/IwBBIGsiAyQAAkACQCACDQBBACECDAELIANBDGogACACIAERCgBBACECIAMoAgwiBEGAgICAeEYNACADKAIQIgAgAygCFCIFQRhsaiEGIAAhAQJAA0AgASAGRg0BIAEtABBFDQEgAUEYaiEHIAMgARDxFSADIAMoAgAiAjYCGCADIAIgAygCBGo2AhwDQAJAIANBGGoQ5R8iAkF2ag4EAwEBAwALIAJB2L9/akECSQ0CIAJBgIDEAEcNAAsgByEBDAALCyABIAZHIQIgACAFEMcXIAQgABCaLQsgA0EgaiQAIAIL6QEBA38jAEEQayICJAACQAJAAkACQAJAAkACQCABKAIAQXtqIgNBBCADQQZJGw4GAAECAwQFAAsgASgCFCEDIAEoAhAhAQwFCyABQQhqQRBBCCABKAIIQQJJG2ooAgAhBCACQQhqIAEoAigQyQMgBCACKAIMIgEgBCABSxshAyAEIAEgBCABSRshAQwECyABKAIMIQMgASgCCCEBDAMLIAEoAkQhAyABKAJAIQEMAgsgASgCZCEDIAEoAmAhAQwBCyABKAIoIgEoAjQhAyABKAIwIQELIAAgAzYCBCAAIAE2AgAgAkEQaiQAC4ECAgN/An4jAEEQayIEJAAgBEEEakEgQQhBEBCVDyAEKAIIIQUCQCAEKAIEQQFHDQAgBSAEKAIMQcyCmwEQjikACyAEKAIMIQZBABD8FRogACABOgBMIABBADoATyAAQQA7AE0gACACNgJIIABBAToAUSAAIAM6AFAgAEEANgJEIAAgBjYCQCAAIAU2AjwgAEEAOgA4IABBADYCNCAAQoCAgIDAADcCLCAAQQA2AgggAEKAgICAgAE3AgAgAEEkakEAKQOAhZ4BIgc3AgAgAEEAKQP4hJ4BIgg3AhwgACAINwIMIABBFGogBzcCAEEIQQAQphhBAEEIELYtIARBEGokAAvyAQEDfyMAQSBrIgMkACACKAKIASIEQYACcSEFAkACQCABKAIcLQAADQACQCAFRQ0AIAIgBEH/fXE2AogBIANBGGogASACEO8CIAMoAhghASACIAIoAogBQYACcjYCiAEgAygCHCECDAILIANBEGogASACEO8CIAMoAhQhAiADKAIQIQEMAQsCQCAFDQAgAiAEQYACcjYCiAEgAyABIAIQ7wIgAygCACEBIAIgAigCiAFB/31xNgKIASADKAIEIQIMAQsgA0EIaiABIAIQ7wIgAygCDCECIAMoAgghAQsgACABNgIAIAAgAjYCBCADQSBqJAAL8gEBA38jAEEgayIDJAAgAigCiAEiBEGAAnEhBQJAAkAgASgCHC0AAA0AAkAgBUUNACACIARB/31xNgKIASADQRhqIAEgAhDtAiADKAIYIQEgAiACKAKIAUGAAnI2AogBIAMoAhwhAgwCCyADQRBqIAEgAhDtAiADKAIUIQIgAygCECEBDAELAkAgBQ0AIAIgBEGAAnI2AogBIAMgASACEO0CIAMoAgAhASACIAIoAogBQf99cTYCiAEgAygCBCECDAELIANBCGogASACEO0CIAMoAgwhAiADKAIIIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC/cBAgZ/AX4jAEEgayICJAAgAkEIaiABQazwmwFBBUEAEMIEQQEhAyACKAIMIQQCQAJAIAIoAghBAUcNACAAIAQ2AgQMAQtBAyEDAkAgBEUNAAJAIAQgAigCECIFQZGfnAFBBhDjJUUNAEEAIQMMAQsCQCAEIAVBqfObAUEJEOMlRQ0AQQEhAwwBCwJAIAQgBUGy85sBQQcQ4yVFDQBBAiEDDAELIAEoAtQBIQYgASgC0AEhByAEIAUQ0wwhCCACQaSBgIB4NgIIIAIgCDcDECABIAcgBiACQQhqEN4jCyAAIAM6AAFBACEDCyAAIAM6AAAgAkEgaiQAC+YBAQJ/IwBBwABrIgQkACAEIAM2AhAgBCACNgIMIAEoAgwhBQJAAkAgAiADQQFqSw0AIAMgBU0NAQsgBEECNgIYIARB4OibATYCFCAEQgI3AiAgBEELNgI4IARBkgE2AjAgBCAFNgI8IAQgBEEsajYCHCAEIARBPGo2AjQgBCAEQQxqNgIsIARBFGpB8OibARDpIwALIAEgAzYCFCABQRBqIgMgAjYCACAAQRhqIAFBGGooAgA2AgAgAEEQaiADKQIANwIAIABBCGogAUEIaikCADcCACAAIAEpAgA3AgAgBEHAAGokAAvnAQEBfyMAQcAAayIEJAACQAJAAkAgASgCAEEiRg0AIAEgAhCwEw0BQcAARQ0CIAAgAUHAAPwKAAAMAgtBwABFDQEgACABQcAA/AoAAAwBCyAEQSRqIAFBJGooAgA2AgAgBEEwaiABQTBqKQIANwMAIARBOGogAUE4aikCADcDACAEQQhqIANBCGopAgA3AwAgBEEQaiADQRBqKQIANwMAIARBGGogA0EYaigCADYCACAEIAEpAhw3AhwgBCABKQIoNwMoIAQgAykCADcDAEHAAEUNACAAIARBwAD8CgAACyAEQcAAaiQAC9EBAQV/AkACQCABKAIAIgIgASgCBEcNAEEAIQMMAQtBASEDIAEgAkEBajYCACACLQAAIgTAQX9KDQAgASACQQJqNgIAIAItAAFBP3EhBSAEQR9xIQYCQCAEQd8BSw0AIAZBBnQgBXIhBAwBCyABIAJBA2o2AgAgBUEGdCACLQACQT9xciEFAkAgBEHwAU8NACAFIAZBDHRyIQQMAQsgASACQQRqNgIAIAVBBnQgAi0AA0E/cXIgBkESdEGAgPAAcXIhBAsgACAENgIEIAAgAzYCAAvhAQEGfwJAIAAtAAwNACAAKAIIIQFBACECAkADQCABIAJGDQECQCAAKAIEIAAoAgggAkGo5YcBENIlIgMtAAAiBEHhACAEQeEASxsiBSADLQABIgNB+gAgA0H6AEkbIgZLDQAgACAFQWBqQf8BcSIFIAZBYGpB/wFxIgYgBSAGSRsgBSAGIAUgBksbQfDPhAEQiR8LAkAgBEHBACAEQcEASxsiBCADQdoAIANB2gBJGyIDSw0AIAAgBEEgaiADQSBqQYDQhAEQiR8LIAJBAWohAgwACwsgABDtBSAAQQE6AAwLC+4BAQF/AkACQAJAAkACQAJAIAAoAgAOBwUAAQIDBQQFCyAAKAIMIgJFDQQgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARCjDAsgAEEoaiEAIAJBWGoiAg0ADAULCyAAKAIEIAEQowwPCyAAKAIMIgJFDQIgACgCCCEAIAJBOGwhAgNAAkACQAJAAkAgACgCAA4DAAECAAsgASAAQQhqEP4ZDAILIAEgAEEIahD0GwwBCyAAQQRqKAIAIAEQowwLIABBOGohACACQUhqIgINAAwDCwsgASAAQQRqEMAfDwsgASAAKAIEEFQLC/sBAgN/An4jAEEgayIDJAAgASgC2AEhBCADQQhqIAEQpw8gAykDGCEGAkACQAJAIAMoAghBAXENACADKQMQIQcMAQsgAyADKAIMIgU2AggCQCACDQAgAEGAgICAeDYCACAAIAU2AgQgBhDIIQwCCyADQQhqELkoQgAhBwsgARChCyABKALUASECAkBBCEEgEKAsIgENAAALIAFBAToAGCABIAc3AxAgASAGNwMAIAAgAjYCHCAAIAQ2AhggAEEBNgIUIAAgATYCECAAQoCAgIAQNwIIIABCgICAgMAANwIAIAEgAkF/ajYCDCABIARBAWo2AggLIANBIGokAAvgAQEGfyMAQSBrIgEkAEEAIQICQAJAAkAgACgCACIDQQF0QQEgAxsiBEH/////A00NAAwBCyAEQQQgBEEESxsiBUECdCIEQfz///8HSw0AAkACQCADDQAgAUEUakEEaiECQQAhAwwBCyABQRxqIQIgAUEENgIYIAEgACgCBDYCFCADQQJ0IQMLIAIgAzYCACABQQhqIAQgAUEUahCaESABKAIIQQFHDQEgASgCECEGIAEoAgwhAgsgAiAGQYCKngEQjikACyABKAIMIQMgACAFNgIAIAAgAzYCBCABQSBqJAAL3wEBBX8jAEEQayICJAAgARATIgMQHyEEIAJBCGoQxyQgAigCDCAEIAIoAghBAXEiBRshBAJAAkAgBUUNACAAQQM6AAQgACAENgIADAELAkACQCAEECBBAUcNACACIAQgARDYGyACKAIEIQECQAJAAkAgAigCAEEBcUUNACAAQQM6AAQMAQsgARAXQQFHDQEgARAhIgUQICEGIAUQ3CogBkEBRw0BIABBADoABAsgACABNgIADAILIABBAjoABCABENwqDAELIABBAjoABAsgBBDcKgsgAxDcKiACQRBqJAALyAEBBn8gACgCACIDQQRqIAMvATIiBEEBaiIFIAAoAggiBiABELUaIAZBAWohACADQTRqIQcCQCAEQQJqIgEgBkECaiIITQ0AIAQgBmtBAnQiBEUNACAHIAhBAnRqIAcgAEECdGogBPwKAAALIAcgAEECdGogAjYCACADIAU7ATIgASAAIAEgAEsbIQQgBkECdCADakE4aiEGAkADQCAEIABGDQEgBigCACIBIAA7ATAgASADNgIAIAZBBGohBiAAQQFqIQAMAAsLC9oBAgF/AX4jAEEQayIFJAACQAJAAkAgAyAEakF/akEAIANrca0gAa1+IgZCIIinDQAgBqciBEGAgICAeCADa00NAQsgAEEANgIEQQEhAwwBCwJAIAQNACAAIAM2AghBACEDIABBADYCBAwBCwJAAkAgAkUNACAFIAMgBEEBEMAgIAUoAgAhAgwBCyAFQQhqIAMgBBDYHyAFKAIIIQIL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NgIEIANBCGogA0EEaiACEJ8ZIAMtAAhBBEYNAiADKQMIIgVC/wGDQgRRDQIgACAFNwIADAQLIANBCGogBCgCACACEPQHIAMtAAhBBEYNASADKQMIIgVC/wGDQgRRDQEgACAFNwIADAMLIANBCGogBCgCACACEMYGIAMtAAhBBEYNACADKQMIIgVC/wGDQgRSDQELIABBBDoAAAwBCyAAIAU3AgALIANBEGokAAvSAQEDfyMAQSBrIgIkACABKAKQBiEDIAJBCGogAUG0A2oiBCABKAKMBkEBEIUIAkACQCACKAIIIgFBA0YNACAAIAIpAgw3AgQgAEEUaiACQQhqQRRqKAIANgIAIABBDGogAkEIakEMaikCADcCAAwBCyACQQhqIAQgA0EBEIUIAkAgAigCCCIBQQNGDQAgACACKQIMNwIEIABBFGogAkEIakEUaigCADYCACAAQQxqIAJBCGpBDGopAgA3AgAMAQtBAyEBCyAAIAE2AgAgAkEgaiQAC/sBAQJ/IwBBMGsiAiQAAkACQCAAKQMAQv///////////wCDQoCAgICAgID4/wBTDQAgAkEBNgIUIAJBnL+cATYCECACQgE3AhwgAkH9ATYCLCACIAA2AiggAiACQShqNgIYIAEoAgAgASgCBCACQRBqEJUpIQMMAQsgAkEAOgAMIAIgATYCCEEBIQMgAkEBNgIUIAJBnL+cATYCECACQgE3AhwgAkH9ATYCLCACIAA2AiggAiACQShqNgIYIAJBCGogAkEQahDbKQ0AAkAgAi0ADA0AIAEoAgBBy72YAUECIAEoAgQoAgwRCwANAQtBACEDCyACQTBqJAAgAwvTAQICfwF+IAFBFGwhAQJAA0AgAUUNASAAKAIMIABBEGooAgAgAhD9KyACIAAoAgQgACgCCBD5CiACIAIoAjhBAWo2AjggAkL/ASACKAI8IgNBA3RBOHGthiACKQMwhCIFNwMwAkACQEEIIANrIgRBAUsNACACIAIpAxggBYU3AxggAhD9DSACKQMwIQUgAkL/ASAEQQN0rYg3AzAgAiAFIAIpAwCFNwMAIANBeWohAwwBCyADQQFqIQMLIABBFGohACACIAM2AjwgAUFsaiEBDAALCwvjAQIHfwJ+IwBB4ABrIgIkACABKAIQIQMgASgCDCEEIAEoAgghBQJAAkAgASkDACIJQgODQgBSDQAgCaciBiAGKAIAIgZBAWo2AgAgBkF/TA0BCyABLQAUIQcCQAJAIAEoAhgiBg0AQQAhAQwBCxD7JyEBIAYpAgQhCiAGKAIAIQgQ/CchBiACIAgQdgJAQeAARQ0AIAYgAkHgAPwKAAALIAEgCjcCBCABIAY2AgALIAAgATYCGCAAIAc6ABQgACADNgIQIAAgBDYCDCAAIAU2AgggACAJNwMAIAJB4ABqJAAPCwAL+gEBAX8jAEHQAGsiAiQAIAAoAgAoAgAhACACQfiKmQE2AkggAkHoipkBNgJAIAIgAEE4ajYCPCACQdiKmQE2AjggAiAAQTRqNgI0IAJByIqZATYCMCACIABBPGo2AiwgAkG4ipkBNgIoIAIgAEEwajYCJCACQaiKmQE2AiAgAiAAQQxqNgIcIAJBmIqZATYCGCACIAA2AhQgAkHklpsBNgIQIAIgAEEsajYCDCACQcSSmwE2AgggAiAAQSRqNgIEIAIgAEEYajYCTCACIAJBzABqNgJEIAFBqp6bAUEFQaiKmwFBCSACQQRqQQkQqAohACACQdAAaiQAIAAL+gEBAX8jAEHQAGsiAiQAIAAoAgAoAgAhACACQfCJmwE2AkggAkHgiZsBNgJAIAIgAEE4ajYCPCACQdCJmwE2AjggAiAAQTRqNgI0IAJBwImbATYCMCACIABBPGo2AiwgAkGwiZsBNgIoIAIgAEEwajYCJCACQaCJmwE2AiAgAiAAQQxqNgIcIAJBkImbATYCGCACIAA2AhQgAkHklpsBNgIQIAIgAEEsajYCDCACQcSSmwE2AgggAiAAQSRqNgIEIAIgAEEYajYCTCACIAJBzABqNgJEIAFBqp6bAUEFQaiKmwFBCSACQQRqQQkQqAohACACQdAAaiQAIAAL/QEBAX8jAEHQAGsiAiQAIAAoAgAoAgAhACACQeCLmwE2AkggAkHQiZsBNgJAIAIgAEE8ajYCPCACQcCJmwE2AjggAiAAQcUAajYCNCACQcCJmwE2AjAgAiAAQcQAajYCLCACQdCLmwE2AiggAiAAQRhqNgIkIAJB5JabATYCICACIABBOGo2AhwgAkHEkpsBNgIYIAIgAEEwajYCFCACQZCJmwE2AhAgAiAAQQxqNgIMIAJBwIubATYCCCACIAA2AgQgAiAAQcAAajYCTCACIAJBzABqNgJEIAFB2IybAUEIQZCMmwFBCSACQQRqQQkQqAohACACQdAAaiQAIAAL1AEBBX8gACgCBCEBIAAoAgAhAiAAQoSAgIDAADcCACAAKAIQIQMCQAJAAkACQCABIAJGDQAgAw0BDAMLIANFDQIgACgCDCICIAAoAggiACgCCCIBRg0BIANBFGwiBEUNASAAKAIEIgUgAUEUbGogBSACQRRsaiAE/AoAAAwBCwJAIAAoAgwiAiAAKAIIIgAoAggiAUYNACADQRRsIgRFDQAgACgCBCIFIAFBFGxqIAUgAkEUbGogBPwKAAALIAAgASADajYCCA8LIAAgASADajYCCA8LC9YBAQR/AkAgACgCCCICRQ0AIAAoAgQiAyACQQZ0aiEEA0ACQCADKAI4IgVFDQAgAygCNCECIAVBDGwhBQNAIAIoAgAgARClASACQQxqIQIgBUF0aiIFDQALCyADIAEQtgggA0HAAGoiAiEDIAIgBEcNAAsLAkAgACgCFCIFRQ0AIAAoAhAhAiAFQQxsIQUDQCACKAIAIAEQpQEgAkEMaiECIAVBdGoiBQ0ACwsCQCAAKAI8IgJFDQAgAiABELAWCwJAIAAoAkAiAkUNACACKAIAIAEQqAELC+MBAAJAIABBIE8NAEEADwsCQCAAQf8ATw0AQQEPCwJAIABBgIAESQ0AAkAgAEGAgAhJDQAgAEHg//8AcUHgzQpHIABB/v//AHFBnvAKR3EgAEHAkXVqQXpJcSAAQdDidGpBcklxIABBkKh0akFxSXEgAEGAkHRqQd5sSXEgAEGAgHRqQZ50SXEgAEGw2XNqQXtJcSAAQYD+R2pBsMVUSXEgAEHwgzhJcQ8LIABBoKSBAUEsQfikgQFB0AFByKaBAUHmAxCnCA8LIABBrqqBAUEoQf6qgQFBogJBoK2BAUGpAhCnCAv/AQICfwN+IwBBMGsiAiQAAkBBACgC4OueAQ0AIAJBCGoQoSFBACkC4OueASEEQQBBATYC4OueAUEAKQLo654BIQVBACkC8OueASEGQQAgAkEEakEIaikCADcC7OueAUEAIAJBBGpBEGooAgA2AvTrngEgAkEANgIEQQAgAikCBDcC5OueASACQRhqQRBqIAY3AwAgAkEYakEIaiIDIAU3AwAgAiAENwMYIASnRQ0AIAMQ3QkLAkBBACgC5OueAUUNAEHwkYIBENIaAAtBAEF/NgLk654BQejrngEgACABEOQDIQRBAEEAKALk654BQQFqNgLk654BIAJBMGokACAEC/8BAQF/IwBB0ABrIgIkACAAKAIAIQAgAkH8pYMBNgJIIAJB7KWDATYCQCACIAA2AjwgAkHcpYMBNgI4IAIgAEHkCmo2AjQgAkHMpYMBNgIwIAIgAEHICmo2AiwgAkG8pYMBNgIoIAIgAEGwCmo2AiQgAkGspYMBNgIgIAIgAEGoDWo2AhwgAkGcpYMBNgIYIAIgAEGkDWo2AhQgAkGMpYMBNgIQIAIgAEGgCmo2AgwgAkH8pIMBNgIIIAIgAEGgDWo2AgQgAiAAQawNajYCTCACIAJBzABqNgJEIAFB5KaDAUEEQZymgwFBCSACQQRqQQkQqAohACACQdAAaiQAIAAL2AEBCX8jAEHgAGsiAiQAIAEoAgQhAyACIAEoAggiBEEEQQQQlQ8gAigCBCEFAkAgAigCAEEBRg0AIAIoAgghBgJAIAVFDQAgBEECdCEBIAYhByAFIQgDQCABRQ0BIAMoAgAhCRD8JyEKIAIgCRB2AkBB4ABFDQAgCiACQeAA/AoAAAsgByAKNgIAIAdBBGohByABQXxqIQEgA0EEaiEDIAhBf2oiCA0ACwsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkHgAGokAA8LIAUgAigCCEG08poBEI4pAAv6AQEBfyMAQdAAayICJAAgACgCACEAIAJBjJ6ZATYCSCACQdiKmQE2AkAgAiAAQTxqNgI8IAJByIqZATYCOCACIABBxQBqNgI0IAJByIqZATYCMCACIABBxABqNgIsIAJBqIuZATYCKCACIABBGGo2AiQgAkHklpsBNgIgIAIgAEE4ajYCHCACQcSSmwE2AhggAiAAQTBqNgIUIAJBmIqZATYCECACIABBDGo2AgwgAkGYi5kBNgIIIAIgADYCBCACIABBwABqNgJMIAIgAkHMAGo2AkQgAUHYjJsBQQhBkIybAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAv3AQEBfyMAQdAAayICJAAgACgCACEAIAJBtJObATYCSCACQZCZmQE2AkAgAiAAQS5qNgI8IAJBkJmZATYCOCACIABBLWo2AjQgAkGwmZkBNgIwIAIgAEExajYCLCACQZCZmQE2AiggAiAAQSxqNgIkIAJB0JmZATYCICACIABBMGo2AhwgAkHAmZkBNgIYIAIgAEEoajYCFCACQeCYmQE2AhAgAiAANgIMIAJBxJKbATYCCCACIABBIGo2AgQgAiAAQS9qNgJMIAIgAkHMAGo2AkQgAUHYlpsBQQtBkJabAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAv3AQEBfyMAQdAAayICJAAgACgCACEAIAJBtJObATYCSCACQZCZmQE2AkAgAiAAQSBqNgI8IAJBkJmZATYCOCACIABBH2o2AjQgAkGwmZkBNgIwIAIgAEEcajYCLCACQZCZmQE2AiggAiAAQR5qNgIkIAJB0JmZATYCICACIABBHWo2AhwgAkHAmZkBNgIYIAIgAEEYajYCFCACQYCamQE2AhAgAiAANgIMIAJBxJKbATYCCCACIABBEGo2AgQgAiAAQSFqNgJMIAIgAkHMAGo2AkQgAUGnlZsBQQ1BkJabAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAvRAQIEfwN+IABBfGohBCACQhmIQoGChIiQoMCAAX4hCCABIAKncSEFQQAhBgN/IAAgBWopAAAiCSAIhSICQn+FIAJC//379+/fv/9+fINCgIGChIiQoMCAf4MhAgJAA0AgAlANASACeiEKIAJCf3wgAoMhAiAEIAqnQQN2IAVqIAFxIgdBAnRrKAIAIANHDQALIABBACAHa0ECdGpBfGoPCwJAIAkgCUIBhoNCgIGChIiQoMCAf4NCAFENAEEADwsgBkEIaiIGIAVqIAFxIQUMAAsL6gEBAX8CQCAAKAIAIgJBCUcNACABIABBCGoQqwQPCwJAAkACQAJAAkACQAJAAkAgAg4JAAECAwQFBwYHAAsCQCAAKAIMIgJFDQAgAkHIAGwhAgNAIAJBuH9qIgINAAsLIAAoAhwiAEUNBiAAIAEQ9RgPCyAAQQhqIAEQiwcPCyAAKAIYDQQgACgCHCIARQ0EIAAgARD1GA8LAkACQCAAKAIIDgMAAQUACyAAKAIoIAEQ+QUPCyAAKAIoIAEQmQ0PCyABIAAoAgQQmSsPCyAAKAIQIgBFDQEgACABEPUYDwsgASAAKAIEEJkrCwv6AQEBfyMAQdAAayICJAAgACgCACEAIAJB4IubATYCSCACQdCJmwE2AkAgAiAAQTxqNgI8IAJBwImbATYCOCACIABBxQBqNgI0IAJBwImbATYCMCACIABBxABqNgIsIAJB0IubATYCKCACIABBGGo2AiQgAkHklpsBNgIgIAIgAEE4ajYCHCACQcSSmwE2AhggAiAAQTBqNgIUIAJBkImbATYCECACIABBDGo2AgwgAkHAi5sBNgIIIAIgADYCBCACIABBwABqNgJMIAIgAkHMAGo2AkQgAUHYjJsBQQhBkIybAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAv3AQEBfyMAQdAAayICJAAgACgCACEAIAJBtJObATYCSCACQYSTmwE2AkAgAiAAQS5qNgI8IAJBhJObATYCOCACIABBLWo2AjQgAkGkk5sBNgIwIAIgAEExajYCLCACQYSTmwE2AiggAiAAQSxqNgIkIAJB/JWbATYCICACIABBMGo2AhwgAkHslZsBNgIYIAIgAEEoajYCFCACQdSSmwE2AhAgAiAANgIMIAJBxJKbATYCCCACIABBIGo2AgQgAiAAQS9qNgJMIAIgAkHMAGo2AkQgAUHYlpsBQQtBkJabAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAv3AQEBfyMAQdAAayICJAAgACgCACEAIAJBtJObATYCSCACQYSTmwE2AkAgAiAAQSBqNgI8IAJBhJObATYCOCACIABBH2o2AjQgAkGkk5sBNgIwIAIgAEEcajYCLCACQYSTmwE2AiggAiAAQR5qNgIkIAJB/JWbATYCICACIABBHWo2AhwgAkHslZsBNgIYIAIgAEEYajYCFCACQdiXmwE2AhAgAiAANgIMIAJBxJKbATYCCCACIABBEGo2AgQgAiAAQSFqNgJMIAIgAkHMAGo2AkQgAUGnlZsBQQ1BkJabAUEJIAJBBGpBCRCoCiEAIAJB0ABqJAAgAAvmAQEBfyAAQQRqIgEoAgAgAEEIaigCABDvIiAAKAIAIAEoAgAQnC0gAEEQaiIBKAIAIABBFGooAgAQmiUgACgCDCABKAIAEKItAkAgACgCMCIBRQ0AIAEQtAEgAUHAAEEIELMWCwJAIAAoAjQiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsCQCAAKAI4IgFFDQAgARC3HyABKAIAIAFBBGooAgAQny0gAUEUQQQQsxYLIABBHGoiASgCACAAQSBqKAIAEIAQIAAoAhggASgCABCbLSAAQcAAQQQQsxYL5wEBAn8CQAJAAkACQAJAAkAgACgCACICQXtqIgNBBCADQQZJGw4GBQABAgMEBQsCQCAAKAIIQQNHDQAgACgCDCABEKUBCyAAKAIoIAEQpQEPCyAAKAIoIAEQpQEPCwJAIAAoAghBA0cNACAAKAIMIAEQpQELIAAoAkgiAEUNAiAAKAIAIAEQqAEPCyAAQSBqIQMCQCACQQNHDQAgACgCBCABEKUBCwJAIAMoAgBBB0YNACADIAEQtggLIAAoAmggARC2CA8LAkAgACgCCEEDRw0AIAAoAgwgARClAQsgACgCKCABENEMCwvmAQEBfyAAQQRqIgEoAgAgAEEIaigCABDvIiAAKAIAIAEoAgAQnC0gAEEQaiIBKAIAIABBFGooAgAQmiUgACgCDCABKAIAEKItAkAgACgCMCIBRQ0AIAEQsAEgAUHAAEEIELMWCwJAIAAoAjQiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsCQCAAKAI4IgFFDQAgARC3HyABKAIAIAFBBGooAgAQny0gAUEUQQQQsxYLIABBHGoiASgCACAAQSBqKAIAEIAQIAAoAhggASgCABCbLSAAQcAAQQQQsxYL+QEBAn8jAEEQayICJAACQAJAIAEoAgBBCUcNAAJAAkACQAJAAkACQAJAIAEoAggOEwMAAAIABgYGAgQGAQICAwQEBQYDCyABKAIQIQMgASgCDCEBDAcLIAEoAgwiASgCfCEDIAEoAnghAQwGCyABKAIYIQMgASgCFCEBDAULIAEoAhwhAyABKAIYIQEMBAsgASgCICEDIAEoAhwhAQwDCyACIAFBEGoQ4gwgAigCBCEDIAIoAgAhAQwCCyABKAIUIQMgASgCECEBDAELIAJBCGogARC2DCACKAIMIQMgAigCCCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAvdAQEBfwJAAkACQAJAAkACQAJAAkACQCABKAIADggAAQIDBAUGBwALIAEoAiAiAkEoaiEBIAJBJGohAgwHCyABKAIgIgJBNGohASACQTBqIQIMBgsgASgCBCICQRBqIQEgAkEMaiECDAULIAEoAgQiAkEQaiEBIAJBDGohAgwECyABKAIEIgJBBGohAQwDCyABKAIEIgJBBGohAQwCCyABKAIEIgJBHGohASACQRhqIQIMAQsgASgCBCICQcwAaiEBIAJByABqIQILIAAgASgCADYCBCAAIAIoAgA2AgAL4AEBAX8jAEEQayITJAAgACgCACABIAIgACgCBCgCDBELACECIBNBADoADSATIAI6AAwgEyAANgIIIBNBCGogAyAEIAUgBhC9CSAHIAggCSAKEL0JIAsgDCANIA4QvQkgDyAQIBEgEhC9CSESIBMtAA0iAiATLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgEigCACIALQAKQYABcQ0AIAAoAgBBv+SXAUECIAAoAgQoAgwRCwAhAAwBCyAAKAIAQamZnAFBASAAKAIEKAIMEQsAIQALIBNBEGokACAAQQFxC84BAQN/IwBBIGsiAyQAAkACQAJAIAEgAmoiAiABTw0AQQAhBAwBC0EAIQQCQCACIAAoAgAiBUEBdCIBIAIgAUsbIgFBCCABQQhLGyIBQQBODQAMAQtBACECAkAgBUUNACADIAU2AhwgAyAAKAIENgIUQQEhAgsgAyACNgIYIANBCGogASADQRRqEJYXIAMoAghBAUcNASADKAIQIQAgAygCDCEECyAEIABBhLmAARCOKQALIAMoAgwhAiAAIAE2AgAgACACNgIEIANBIGokAAvPAQEKfyMAQRBrIgIkACAALQAMIQMgAkEEaiAAKAIEIAAoAghBChCxASACKAIIIgQgAigCDCIFaiEGIAVBAXYhByAFQQJJIQhBfyEAIAQhCQJAA0AgByAAakF/Rg0BAkAgCA0AIAktAAAhCiAJIAYgAGoiCy0AADoAACALIAo6AAAgAEF/aiEAIAlBAWohCQwBCwsgACAHQfCunAEQkRUACyACKAIEIQAgASADQf8BcUEAR0EBQQAgBCAFENwFIQkgACAEENgsIAJBEGokACAJC/IBAQJ/IAAQqgQCQAJAAkACQAJAAkACQCAAKAIADggGAQIGAwQFAAYLIABBBGoQyiIgACgCBCAAKAIIEPYsDAULIAAoAggiAUUNBCAAKAIEIAFBARCzFgwECyAAKAIMIQEgACgCCCECAkAgACgCBA0AIAIgARD3LAwECyACIAEQgi0MAwsgACgCDCIBEOYMIAFBHEEEELMWDAILAkAgACgCDCIBRQ0AIAAoAhAiAkUNACABIAJBARCzFgsgACgCBCIBEOYMIAFBHEEEELMWDAEL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IgQ2AhggAEF4aikDACEFIABBaGopAwAQyCEgBRDIIQwACwsgAUEYQQggAkEBahDaESADIAEoAghrIAEoAgAgASgCBBCTKQsgAUEgaiQAC84BAgJ/AX4jAEEQayIDJAACQAJAAkAgAkEPSQ0AIAJB/////wFLDQJBfyACQQN0QQduQX9qZ3ZBAWohAgwBC0EEQQhBECACQQhJGyACQQRJGyECCyADIAFBCCACEKMSIAMoAgQhAgJAAkAgAygCACIBDQAgACADKAIINgIIIAAgAjYCBCAAQQA2AgAMAQsgAykCCCEFAkAgAkEJaiIERQ0AIAFB/wEgBPwLAAsgACAFNwIIIAAgAjYCBCAAIAE2AgALIANBEGokAA8LEOchAAvCAQEFfwJAIAEoAgQiAiABQXhqKAIASSABKAIAIgMgAUF0aigCACIESSADIARGG0EBRw0AIAFBaGohBCABKAIIIQUCQAJAA0AgBCIBQSBqIAFBFGooAgA2AgAgAUEYaiABQQxqIgQpAgA3AgAgBCAARg0BIAFBdGohBCACIAFBBGooAgBJIAMgASgCACIGSSADIAZGGw0ACyABQQxqIQQMAQsgAUEMaiEECyABQQxqIAM2AgAgBCAFNgIIIAQgAjYCBAsLuQEBBX8CQCADQQhJDQAgACAAIANBA3YiA0EwbCIEaiAAIANB1ABsIgVqIAMQ+gwhACABIAEgBGogASAFaiADEPoMIQEgAiACIARqIAIgBWogAxD6DCECCwJAIAAoAgQiBSABKAIEIgZJIAAoAgAiAyABKAIAIgRJIAMgBEYbIgcgBSACKAIEIghJIAMgAigCACIFSSADIAVGG0cNACACIAEgByAGIAhJIAQgBUkgBCAFRhtzGyEACyAAC8wBAQJ/IwBB8ABrIgckACAHQQhqIAJBiK+cARC7GUEAIQggB0EANgIcIAcgBykDCDcCFCAHQSBqIAEgAiADIAQQ0wIgBSAGaiEDAkADQCAHQeQAaiAHQSBqEMgHIAcoAmRBAUcNASABIAhqIQQgBygCbCEIIAdBFGogBCABIAcoAmhqELogIAdBFGogBSADELogDAALCyAHQRRqIAEgCGogASACahC6ICAAQQhqIAdBFGpBCGooAgA2AgAgACAHKQIUNwIAIAdB8ABqJAAL0QECA38BfiMAQYABayICJAACQCABKQII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QQI6ACQgBCABEL4eIAEgBToAJSABIAY6ACQgBEHAAGohBCADQUBqIgMNAAsLIABBGGohBSABIAI6ACYCQCAAKAIUIgNFDQAgACgCECEEIANBDGwhAwNAIAEgBCgCABBUIARBDGohBCADQXRqIgMNAAsLAkAgBSgCAEGAgICAeEYNACABIAUQmxsLC8wBAQJ/IAFBwABqEK0oAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABClAQwBCyAAIAMQwQcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAJ4IgNFDQAgAyAAEMQfCwJAIAEoApgBIgJFDQAgASgClAEhAyACQShsIQIDQCADIAAQpAkgA0EoaiEDIAJBWGoiAg0ACwsCQCABLQA8QQZGDQAgAUEQahCtKAsLwAEBB38jAEHgAGshAwJAIAAoAggiBCABRg0AIAAoAgQiBSABQdgAbGohBiAFIARB2ABsaiEEIAIoAgQhASACKAIMIQcDQCABIAdGDQEgAiABQdgAaiIFNgIEIAEoAgAiCEENRg0BAkBB1ABFIgkNACADQQxqIAFBBGpB1AD8CgAACyAEIAg2AgACQCAJDQAgBEEEaiADQQxqQdQA/AoAAAsgACAAKAIIQQFqNgIIIAUhASAEQdgAaiIEIAZHDQALCwvPAQEDfyAAQcAAahC3JCAAQZABaiECIAAoAoQBQdgAbCEDIAAoAoABIQQCQANAIANFDQECQAJAAkACQAJAIAQoAgAOBgQBAgMEAAQLIARBBGogARCVLwwDCyAEQQRqIAEQ2ScMAgsgBEEEaiABEJ4vDAELIARBBGogARD4EwsgBEHYAGohBCADQah/aiEDDAALCwJAIAAoAngiBEUNACABIARBDGooAgAgBEEQaigCABCgJgsgAiABEPgTAkAgAC0APEEGRg0AIABBEGoQtyQLC7oBAQJ/IAAgAC0ADSABLQANIgIgAkEDRhs6AA0gACAALQAMIAEtAAwiAiACQQJGGzoADCAAIAAtAAsgAS0ACyICIAJBAkYbOgALIAAgAC0ACiABLQAKIgIgAkECRhs6AAogACABQQlqIABBCWogAS0ACCICGy0AADoACSAAIAAoAgAgASgCACIDIANBAkYiAxs2AgAgACACIAAtAAhyQQFxOgAIIAAgAEEEaiABQQRqIAMbKAIANgIEIAALuQEBAn8CQAJAAkAgACgCCCICIAFJDQAgAiABRg0BIAIgAWshAgJAAkAgACgCBCABQQJ0aiIDLQAAIgFB/wFGDQAgASABQQJ2aiABQQNxQQBHakECaiIBIAJJDQEgASACQdy1gwEQkRUACyAAKAIoQQJqIgEgAk8NAwsgAyABQQJ0aigCACIBQQEgAUF/ShsPCyABIAJBhL6DARDgLAALQQBBAEHMtYMBEJEVAAsgASACQey1gwEQkRUAC80BAQV/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQAJAAkACQAJAIAMoAgAOAgECAAsgA0EEaigCACIEEKwHIARBKEEIELMWIANBGGooAgAiBEUNAiAEKAIAIgUQtAIgBUHgAEEIELMWIARBDEEEELMWDAILIANBCGoQ3g0MAQsgA0EIahCyEwsgA0E4aiEDIAJBf2oiAg0ACwsgACgCACABEKMtAkAgACgCFCIDRQ0AIAMoAgAiAhC0AiACQeAAQQgQsxYgA0EMQQQQsxYLC8sBAQN/IwBB0ABrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCUCECIANBADYCUAJAIAJFDQAgAUEIaiACEQMAAkAgACgCBCICKAIAIgMoAjgiAEECRg0AIABFDQAgAygCQCIARQ0AIAMoAjwgAEEBELMWIAIoAgAhAwsCQEHIAEUNACADIAFBCGpByAD8CgAACyABQdAAaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsIyeATYCCCABQgQ3AhAgAUEIakGov5wBEOkjAAvOAQEBfwJAIAAoAgAiAkEJRw0AIABBCGogARCaBA8LAkACQAJAAkACQAJAAkACQCACDgkAAQIDBAUHBgcACwJAIAAoAgwiAkUNACACQcgAbCECA0AgAkG4f2oiAg0ACwsgACgCHCIARQ0GIAAgARCWGQ8LIABBCGogARCeBw8LIAAoAhwiAEUNBCAAIAEQlhkPCyAAKAIIDQMgACgCKCABEI8HDwsgASAAKAIEEKoBDwsgACgCECIARQ0BIAAgARCWGQ8LIAEgACgCBBCqAQsL2QEBA38jAEEgayIDJAACQAJAIAEoAogBIgRBgISQgAFxQYCEkIABRg0AIAEgBEGAhJCAAXI2AogBIANBCGogARCaLyABIAEoAogBIARB//vv/35ycTYCiAEMAQsgA0EIaiABEJovCyADKAIMIQQCQAJAIAMoAggiBUGAgICAeEcNAEENIQEMAQsgACADKQIQNwIMIABBFGogA0EYaikCADcCACAAIAI2AhwgACAENgIIIAAgASgC1AE2AiBBCyEBIAUhBAsgACABNgIAIAAgBDYCBCADQSBqJAALygEBAX8jAEEQayILJAAgACgCACABIAIgACgCBCgCDBELACECIAtBADoADSALIAI6AAwgCyAANgIIIAtBCGogAyAEIAUgBhC9CSAHIAggCSAKEL0JIQogCy0ADSICIAstAAwiAXIhAAJAIAJBAUcNACABQQFxDQACQCAKKAIAIgAtAApBgAFxDQAgACgCAEG/5JcBQQIgACgCBCgCDBELACEADAELIAAoAgBBqZmcAUEBIAAoAgQoAgwRCwAhAAsgC0EQaiQAIABBAXELuQECAn8BfiMAQRBrIgQkAAJAAkACQCACIANqQX9qQQAgAmtxrSABrX4iBkIgiKcNACAGpyIDQYCAgIB4IAJrTQ0BCyAAQQA2AgRBASECDAELAkAgAw0AIAAgAjYCCEEAIQIgAEEANgIEDAELIARBCGogAiADEMQkAkAgBCgCCCIFRQ0AIAAgBTYCCCAAIAE2AgRBACECDAELIAAgAzYCCCAAIAI2AgRBASECCyAAIAI2AgAgBEEQaiQAC8ABAQR/IwBBMGsiAyQAQQAhBAJAIAIoAhAiBSACKAIUIgZLDQAgAEEEaiEAAkAgAigCAEF/akECSQ0AIANBDGogACACKAIIIAIoAgwgBSAGEOUGIAMoAgwiBEEBRw0BIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANB/JSEATYCGCADQgQ3AiAgA0EYakHUpIMBEOkjAAsgBSACKAIMTw0AIAAtAAAgAigCCCAFai0AAEYhBAsgA0EwaiQAIAQLyAEBBH8jAEHQAGsiAiQAIAJBNGpBGGoiA0EANgIAIAJBNGpBEGoiBEIENwIAIAJBNGpBCGoiBUIANwIAIAJCgICAgMAANwI0IAJBNGpBABCIJSACQcAAakEAEIglIAJBGGogAygCADYCACACQRBqIAQpAgA3AwAgAkEIaiAFKQIANwMAIAIgAikCNDcDACACQQA2AiwgAkIANwIkIAJCgICAgMAANwIcIAIgARCtCgJAQTBFDQAgACACQTD8CgAACyACQdAAaiQAC7kBAgJ/AX4jAEEQayIEJAACQAJAAkAgAiADakF/akEAIAJrca0gAa1+IgZCIIinDQAgBqciA0GAgICAeCACa00NAQsgAEEANgIEQQEhAgwBCwJAIAMNACAAIAI2AghBACECIABBADYCBAwBCyAEQQhqIAIgAxDIJAJAIAQoAggiBUUNACAAIAU2AgggACABNgIEQQAhAgwBCyAAIAM2AgggACACNgIEQQEhAgsgACACNgIAIARBEGokAAuzAQEEfwJAAkACQCABLQAAIgIgAUF+ai0AACIDRw0AIAEtAAEiBCABQX9qLQAASQ0BDAILIAIgA08NASABLQABIQQLIAFBfGohASAEQf8BcSEFAkADQCABQQRqIAFBAmoiAy8AADsAACADIABGDQECQAJAIAIgAS0AACIDRw0AIAUgAUEBai0AAEkNAQwDCyACIANPDQILIAFBfmohAQwACwsgAUECaiAEQQh0IAJyOwAADwsLoAEBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICQhWJIAIgACkDECIDIAApAwB8IgRCIIl8IgKFIgVCEIkgBSABIANCDYkgBIUiA3wiAUIgiXwiBIUiBSACIAEgA0IRiYUiAXwiAkIgiXwiAzcDACAAIAVCFYkgA4U3AxggACABQg2JIAKFIgFCEYkgBCABfCIBhTcDECAAIAFCIIk3AwgL1wEAAkAgASACQbqCnAFBAhDjJUUNAEHeAA8LAkAgASACQcyEnAFBBhDjJUUNAEHfAA8LAkAgASACQZyWnAFBAhDjJUUNAEHgAA8LAkAgASACQZ6WnAFBChDjJUUNAEHhAA8LAkAgASACQe30mwFBAhDjJUUNAEGEAQ8LAkAgASACQaTzmwFBBRDjJUUNAEGdAQ8LAkAgASACQYifnAFBCRDjJUUNAEGCAQ8LAkAgASACQejkmwFBChDjJUUNAEGBAQ8LQYN/QaR/IAEgAkHJ9JsBQQkQ4yUbC88BAQF/IAAQkhYgACgCBCIAQRRqIgEoAgAgAEEYaigCABChIyAAKAIQIAEoAgAQ1ywCQCAAKAIAQQJGDQAgACgCBCAAQQhqKAIAENgsCyAAKAIcIABBIGooAgAQ2SwgAEEsaiIBKAIAIABBMGooAgAQoiMgACgCKCABKAIAENosIABBOGoiASgCACAAQTxqKAIAEM0VIAAoAjQgASgCABDbLCAAQcQAaiIBKAIAIABByABqKAIAEIoNIAAoAkAgASgCABDcLCAAQdAAQQQQsxYLvgECAX8BfiMAQRBrIgMkACADQQhqIAIgASgCCEEAEIsCAkACQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQQhqIAEgAhDOLQJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIANBCGogASgCBCACEJQKAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQRBqJAALvAEBA39BACEBAkACQAJAIAAoAgBBfGoOBAEBAgACCyAAKAIEIgAtAEVBA0YNASAAQSBqIQACQANAIAAtACVBAkYNASAAKAIgIQAMAAsLIAAoAghBOGwhAiAAKAIEQQhqIQADQCACRQ0BAkACQCAAQXhqKAIAIgNBAUYNACADQQlHDQQgACgCAEERRw0EIABBCGoQgQ5FDQQMAQsgABCBDkUNAwsgAkFIaiECIABBOGohAAwACwtBASEBCyABC88BAQF/IAAQkhYgACgCBCIAQRRqIgEoAgAgAEEYaigCABChIyAAKAIQIAEoAgAQ1ywCQCAAKAIAQQJGDQAgACgCBCAAQQhqKAIAEL8vCyAAKAIcIABBIGooAgAQ2SwgAEEsaiIBKAIAIABBMGooAgAQoiMgACgCKCABKAIAENosIABBOGoiASgCACAAQTxqKAIAEM0VIAAoAjQgASgCABDbLCAAQcQAaiIBKAIAIABByABqKAIAEIoNIAAoAkAgASgCABDcLCAAQdAAQQQQsxYLuQEBAX8jAEEQayIGJAACQAJAIAUgBEkNACAFIANLDQEgBkIBNwIIAkACQCAFIARrIgUgASgCQCIDTw0AQQAhBQwBCyAGIAEgBkEIaiACIARqIAUgASgCPCADIAEoAjARFABBACEFIAYoAgBBAXFFDQAgACAGKAIEIARqIgU2AgQgACAFIANqNgIIQQEhBQsgACAFNgIAIAZBEGokAA8LIAQgBUGomoQBEOIsAAsgBSADQaiahAEQ4SwAC78BAQR/IwBBMGsiAyQAQQAhBAJAIAIoAhAiBSACKAIUIgZLDQACQCACKAIAQX9qQQJJDQAgA0EMaiAAIAIoAgggAigCDCAFIAYQiRBBACEEIAMoAgxBAUcNAUEBIQQgAygCECADKAIUTQ0BIANBADYCKCADQQE2AhwgA0H8lIQBNgIYIANCBDcCICADQRhqQdSkgwEQ6SMACyAFIAIoAgxPDQAgACACKAIIIAVqLQAAai0AACEECyADQTBqJAAgBAu6AQEDfyMAQRBrIgMkACADQQhqIAAgARCvJiADKAIMIQEgAygCCCEAAkACQAJAAkAgAkUNAEEAIQQDQCABRQ0CIAEgACgCLCIFTw0EIAAoAiggAUEDdGooAgQhASACIARBAWoiBEcNAAsLIAFFDQAgASAAKAIsIgRJDQEgASAEQfy1gwEQkRUAC0GkvoMBENIsAAsgACgCKCABQQN0aigCACEBIANBEGokACABDwsgASAFQfy1gwEQkRUAC7oBAQN/IwBBIGsiAiQAIAAoAgAhA0EAIQAgASgCAEGomZwBQQEgASgCBCgCDBELACEEIAJBADoAGSACIAQ6ABggAiABNgIUA0AgAiAAOgAfIAIgAyAAQYABcUEDdmoiASkDACABQQhqKQMAIABB/wBxEJEWAkAgAikDAEIBg1ANACACQRRqIAJBH2pBlQEQwwsaCyAAQf8BcUEBaiIAQf8BcSAARg0ACyACQRRqEKojIQAgAkEgaiQAIAALtQECBn8BfgJAIAAoAgAiASgCSCICQQFxRQ0AIAAoAgQhAwJAIAJBAkYNACABKAJMIAMoAmxLDQELQQEhAgJAIAEoAlBBAXFFDQAgASgCVCEEQQEhAiADKAJwIQVBACEBAkAgAygCsAFBAUcNACADKAK0ASIBIAMoArgBIgZrIAYgAWsgASAGSxshAQsgASAFakF/IAStIAM1ApQBfiIHpyAHQiCIpxtPDQELIAIPCyAAEJQEQQALzwECA38CfiMAQeAAayICJAAgACgCMBD8FSEDIAJBNGogAEE0aigCADYCACACQQA6ACggAkEIakEAKQOAhZ4BIgU3AwAgAkEQaiIEQQApA/iEngEiBjcDACACQRhqIAU3AwAgAiAANgIgIAIgAzYCJCACQQE6ADkgAiAAKQIsNwIsIAIgACgBOjYBOiACIAAtADg6ADggAiAGNwMAAkAgASgCFA0AIANFDQAgAUEAIAMQ9QU2AhQLIAIgARDACiACELAKIAQQzAogAkHgAGokAAu2AQIEfwF+AkAgACgCDCIBIAAoAgQiAkYNACABIAJrQQV2IQEDQAJAIAJBEGopAwAiBVANACAFQgODQgBSDQAgBaciAyADKAIAIgRBf2o2AgAgBEEBRw0AIAMgAygCEBDGJAsCQCACKQMAIgVCA4NCAFINACAFpyIDIAMoAgAiBEF/ajYCACAEQQFHDQAgAyADKAIQEMYkCyACQSBqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgAQoC0LuAEBA38jAEEQayIGJAAgAS0AgQIhByABLQCAAiEIIAZBCGogAiADIAQgBUHwlIABEMQdIAYgCCAHIAYoAgggBigCDBCpBwJAAkACQCAGKAIAQQFxRQ0AIAYoAgQgBGoiBSADTw0CIABBACAFIAEgAiAFai0AAGotAABrIgEgASAFSxsiASAEIAEgBEsbNgIEQQIhAQwBC0EAIQELIAAgATYCACAGQRBqJAAPCyAFIANBgJWAARCRFQALswEBBH8jAEEQayICJABBAyEDIAAtAAAiACEEAkAgAEEKSQ0AQQEhAyACIAAgAEHkAG4iBEHkAGxrQf8BcUEBdCIFQd38mAFqLQAAOgAPIAIgBUHc/JgBai0AADoADgsCQAJAIABFDQAgBEUNAQsgAkENaiADQX9qIgNqIARBAXRB/gFxQd38mAFqLQAAOgAACyABQQFBAUEAIAJBDWogA2pBAyADaxDcBSEDIAJBEGokACADC74BAQN/IwBBMGsiBCQAAkAgAigCECIFIAIoAhQiBksNACAAQQRqIQACQAJAIAIoAgBBf2pBAkkNACAEQQxqIAAgAigCCCACKAIMIAUgBhDlBiAEKAIMRQ0CIAQoAhAgBCgCFE0NASAEQQA2AiggBEEBNgIcIARB/JSEATYCGCAEQgQ3AiAgBEEYakHUpIMBEOkjAAsgBSACKAIMTw0BIAAtAAAgAigCCCAFai0AAEcNAQsgAxC6FwsgBEEwaiQAC64BAAJAAkAgAyABTw0AIAAgA0EMbGoiASgCCCIDIAJJDQECQCADIAEoAgBHDQAgAUHozIMBEJUcCyABKAIEIAJBA3RqIQACQCADIAJNDQAgAyACa0EDdCICRQ0AIABBCGogACAC/AoAAAsgASADQQFqNgIIIAAgBa1C/wGDQiiGIAStQv8Bg0IghoQgBq2ENwIADwsgAyABQZjNgwEQkRUACyACIANB6MyDARCXFQALvwEBBX8CQAJAIAEgACgCDGsiAkEBdCACQR91cyIDQf8ASw0AIAAoAgghBAwBCyAAKAIIIQIgAyEFA0ACQCACIAAoAgBHDQAgAEH4sYQBEIoPCyAAIAJBAWoiBDYCCCAAKAIEIAJqIAVBgH9yOgAAIAVB//8ASyEGIAQhAiAFQQd2IgMhBSAGDQALCwJAIAQgACgCAEcNACAAQeixhAEQig8LIAAgATYCDCAAIARBAWo2AgggACgCBCAEaiADOgAAC70BAQV/IwBBIGsiAiQAAkACQAJAIAEoAggiA0UNAAJAIAEoAgQiBC0AAEECcUUNACACIANBc2oiBUEDcSIGNgIEIAYNAyADQQxNDQIgBCAFQQJ2NgAJCyAAQQA2AgwgACABKQIANwIAIABBCGogAUEIaigCADYCACACQSBqJAAPC0EAQQBByK+EARCRFQALQQ0gA0HIsYQBEOEsAAsgAkEANgIIQQAgAkEEakH485gBIAJBCGpB2LGEARCVIQALrQEBA38CQAJAAkAgASgCACICIAFBeGooAgAiA0cNACABKAIEIgQgAUF8aigCAEkNAQwCCyACIANPDQEgASgCBCEECyABQXBqIQECQANAIAFBEGogAUEIaiIDKQIANwIAIAMgAEYNAQJAAkAgAiABKAIAIgNHDQAgBCABQQRqKAIASQ0BDAMLIAIgA08NAgsgAUF4aiEBDAALCyABQQhqIAStQiCGIAKthDcCAA8LC8cBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEO0JDAELIAJBBGogAUEAQQFBARCsDCACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQcC8nAEQjikAC8UBAQN/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIQIQIgA0EANgIQAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgAoAgAiAygCACICQYKAgIB4SA0AIAIgA0EEaigCABDYLCAAKAIAIQMLIAMgASkCCDcCACADQQhqIAFBCGpBCGooAgA2AgAgAUEgaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsIyeATYCCCABQgQ3AhAgAUEIakGov5wBEOkjAAvKAQEBfwJAAkACQAJAAkACQCAAKAIAQXtqIgJBBCACQQZJGw4GBQABAgMEBQsgASAAQQhqENAmIAEgACgCKBCZKw8LIAEgACgCKBCZKw8LIAEgAEEIahDQJiAAKAIoQYCAgIB4Rg0CIABBKGogARCSIA8LIAEgABDQJgJAIAAoAiBBB0YNACAAQSBqIAEQoQ4LIAAoAmggARChDiAAKAJIQYCAgIB4Rg0BIABByABqIAEQkiAPCyABIABBCGoQ0CYgACgCKCABEJkNCwvKAQEBfyMAQRBrIgIkAAJAIAAtAARBAUcNAAJAAkACQAJAAkAgASgCAA4FAQIAAwQBCwJAIAAtAAUNACABKwMQmUQAAAAAAADwf2INACAAQQA6AAQLIAAgACgCAEEFajYCAAwECyACIAFBCGoQ8RUgACACKAIEIAAoAgBqQQJqNgIADAMLIAJBCGogAUEIahDxFSAAIAIoAgwgACgCAGpBAmo2AgAMAgsgACABKAIEEPYaIABBADoABAwBCyAAQQA6AAQLIAJBEGokAAvDAQEBfyMAQTBrIgMkACADQRhqQQhqIAFBCGooAgA2AgAgAyABKQIANwMYIAMgASgCFDYCLCADIAEpAgw3AiQCQAJAIAIoAogBIgFBgIAQcUUNACACIAFB//9vcTYCiAEgA0EQaiADQRhqIAIQyxsgAygCECEBIAIgAigCiAFBgIAQcjYCiAEgAygCFCECDAELIANBCGogA0EYaiACEMsbIAMoAgwhAiADKAIIIQELIAAgAjYCBCAAIAE2AgAgA0EwaiQAC7wBAQV/IwBBEGsiAyQAAkACQCABKAIAIgQNAEEAIQQgA0EMaiEFDAELIANBBDYCDCAEQQJ0IQQgASgCBCEGIANBCGohBQsgBSAENgIAAkACQCADKAIMIgRFDQAgAygCCCEHAkACQCACDQAgBiAEIAcQkylBBCEGDAELIAYgByAEIAJBAnQiBRD0AyIGRQ0CCyABIAI2AgAgASAGNgIEC0GBgICAeCEECyAAIAU2AgQgACAENgIAIANBEGokAAvFAQEEfyMAQRBrIgIkACABKAIMIQMCQAJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARDtCQwBCyACQQRqIAFBAUEBEPsNIAIoAgghBSACKAIEQQFGDQEgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAAPCyAFIAIoAgxBwLycARCOKQALwgEBAn8jAEGABmsiAiQAQQIhAwJAIAEpAwBCAoUgASkDCIRQDQAgAkGAA2ogARC9BiACQcAEaiABQZAFahC9BgJAQfACRQ0AIAJBEGogAkGAA2pB8AL8CgAACyACQQhqIAJB/AVqKAIANgIAIAIgAikC9AU3AwAgAigC8AUhAwsCQEHwAkUNACAAIAJBEGpB8AL8CgAACyAAIAM2AvACIAAgAikDADcC9AIgAEH8AmogAkEIaigCADYCACACQYAGaiQAC98BAQJ/IwBBEGsiAiQAIAAoAgAoAgAiAEEBaiEDAkACQAJAAkACQAJAIAAtAAAOBQABAgMEAAsgASgCAEHwuoMBQRQgASgCBCgCDBELACEBDAQLIAEoAgBBhLuDAUEWIAEoAgQoAgwRCwAhAQwDCyACIAM2AgggAUGau4MBQRFBvfGZAUEDIAJBCGpBvwEQuQ4hAQwCCyACIAM2AgwgAUGru4MBQRZBvfGZAUEDIAJBDGpBvwEQuQ4hAQwBCyABKAIAQcG7gwFBECABKAIEKAIMEQsAIQELIAJBEGokACABC9IBAQJ/IAAQqgQCQAJAAkACQAJAAkACQCAAKAIADggGAQIGAwQFAAYLIABBBGoQyiIgACgCBCAAKAIIEPYsDAULIAAoAggiAUUNBCAAKAIEIAFBARCzFgwECyAAQQRqENAkDAMLIAAoAgwiARCaDiABQRxBBBCzFgwCCwJAIAAoAgwiAUUNACAAKAIQIgJFDQAgASACQQEQsxYLIAAoAgQiARCaDiABQRxBBBCzFgwBCyAAQQRqEMoiIAAoAgQgACgCCBD2LAsgACgCGEE0QQQQsxYLxQEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAw0BQQEhBEEAIQEMAgsgAw0AIAEoAgAiAygCBCEBIAMoAgAhBAwBCyAAIAEQ7QkMAQsgAkEEaiABQQFBARCVDyACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQcC8nAEQjikAC7QBAQV/IAAoAgQhASAAKAIAIQIgAEKEgICAwAA3AgACQCABIAJGDQAgASACa0EEdiEBA0AgAUUNAQJAIAIoAgBBAkYNACACQQxqEIsDCyABQX9qIQEgAkEQaiECDAALCwJAIAAoAhAiAkUNAAJAIAAoAgwiAyAAKAIIIgEoAggiAEYNACACQQR0IgRFDQAgASgCBCIFIABBBHRqIAUgA0EEdGogBPwKAAALIAEgAiAAajYCCAsLxQEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAw0BQQEhBEEAIQEMAgsgAw0AIAEoAgAiAygCBCEBIAMoAgAhBAwBCyAAIAEQ7QkMAQsgAkEEaiABQQFBARCVDyACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQcC8nAEQjikAC8gBAgR/AX4jAEEQayICJAAgAiABEP0FIAIoAgQhAwJAAkAgAigCACIEQYGAgIB4Rw0AIAAgAzYCBEEBIQEMAQsgAi0ADCEFIAEoAoQBQQhqIAMgAigCCBDkAyEGAkAgBEGAgICAeEYNACAEIAMQ2CwLAkAgASgCCEEJRg0AIAFBCGoQwAULIAEgBjcDECABQQI2AggCQCAFQQFxRQ0AIAEgAS0AkwFBAXI6AJMBCyAAQcsAOgABQQAhAQsgACABOgAAIAJBEGokAAvFAQEEfyMAQRBrIgIkACABKAIMIQMCQAJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARDtCQwBCyACQQRqIAFBAUEBEJUPIAIoAgghBSACKAIEQQFGDQEgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAAPCyAFIAIoAgxBwLycARCOKQALxQEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAw0BQQEhBEEAIQEMAgsgAw0AIAEoAgAiAygCBCEBIAMoAgAhBAwBCyAAIAEQ7QkMAQsgAkEEaiABQQFBARCVDyACKAIIIQUgAigCBEEBRg0BIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQADwsgBSACKAIMQcC8nAEQjikAC8MBAQF/AkACQAJAAkACQAJAIAAoAgAOBwMAAQIEAwUDCyAAKAIMIgJFDQIgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARChDgsgAEEoaiEAIAJBWGoiAg0ADAMLCyAAKAIEIAEQoQ4PCyAAKAIMIgJFDQAgACgCCCEAIAJBOGwhAgNAIAAgARDAHiAAQThqIQAgAkFIaiICDQALCw8LIAAoAgQgARChDiABIAAoAggQmSsPCyABIAAoAgQQmSsLwwEBAX8CQAJAAkACQAJAAkAgACgCAA4HAwABAgQDBQMLIAAoAgwiAkUNAiAAKAIIIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEKIOCyAAQShqIQAgAkFYaiICDQAMAwsLIAAoAgQgARCiDg8LIAAoAgwiAkUNACAAKAIIIQAgAkE4bCECA0AgACABEL0eIABBOGohACACQUhqIgINAAsLDwsgACgCBCABEKIOIAEgACgCCBCeAw8LIAEgACgCBBCeAwvDAQEBfwJAAkACQAJAAkACQCAAKAIADgcDAAECBAMFAwsgACgCDCICRQ0CIAAoAgghACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQow4LIABBKGohACACQVhqIgINAAwDCwsgACgCBCABEKMODwsgACgCDCICRQ0AIAAoAgghACACQThsIQIDQCAAIAEQxR4gAEE4aiEAIAJBSGoiAg0ACwsPCyAAKAIEIAEQow4gACgCCCABEPkCDwsgACgCBCABEPkCC8MBAQF/AkACQAJAAkACQAJAIAAoAgAOBwMAAQIEAwUDCyAAKAIMIgJFDQIgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARCkDgsgAEEoaiEAIAJBWGoiAg0ADAMLCyAAKAIEIAEQpA4PCyAAKAIMIgJFDQAgACgCCCEAIAJBOGwhAgNAIAAgARDEHiAAQThqIQAgAkFIaiICDQALCw8LIAAoAgQgARCkDiAAKAIIIAEQggMPCyAAKAIEIAEQggMLwwEBAX8CQAJAAkACQAJAAkAgACgCAA4HAwABAgQDBQMLIAAoAgwiAkUNAiAAKAIIIQAgAkEobCECA0ACQCAAKAIAQQdGDQAgACABEKUOCyAAQShqIQAgAkFYaiICDQAMAwsLIAAoAgQgARClDg8LIAAoAgwiAkUNACAAKAIIIQAgAkE4bCECA0AgACABEMMeIABBOGohACACQUhqIgINAAsLDwsgACgCBCABEKUOIAEgACgCCBDRAQ8LIAEgACgCBBDRAQvDAQEBfwJAAkACQAJAAkACQCAAKAIADgcDAAECBAMFAwsgACgCDCICRQ0CIAAoAgghACACQShsIQIDQAJAIAAoAgBBB0YNACAAIAEQpg4LIABBKGohACACQVhqIgINAAwDCwsgACgCBCABEKYODwsgACgCDCICRQ0AIAAoAgghACACQThsIQIDQCAAIAEQxh4gAEE4aiEAIAJBSGoiAg0ACwsPCyAAKAIEIAEQpg4gASAAKAIIEKoBDwsgASAAKAIEEKoBC74BAQN/IwBBEGsiAiQAAkACQCABKAIEIgMgASgCACIEKAIgTw0AAkACQCADIAQoAixPDQAgBCgCKCADQSRsaiIEKAIARQ0AIAEgA0EBajYCBCABKAIIQQE6AAAgAkEEaiAEQQRqKAIAIARBCGooAgAQ2RMMAQsgASADQQFqNgIEIAJBgICAgHg2AgQLIAAgAikCBDcCACAAQQhqIAJBBGpBCGooAgA2AgAMAQsgAEGBgICAeDYCAAsgAkEQaiQAC8EBAgF/AX4jAEEQayICJAACQAJAIAEtAOABQRlGDQAgAiABENwOAkACQCACKQMAQgBSDQAgACACKAIINgIIQgIhAwwBCyAAIAIpAwA3AwggAEEQaiACQQhqKQMANwMAQgEhAwsgACADNwMADAELIAIgARDdDkIAIQMCQAJAIAIpAwBCAFINACAAIAIoAgg2AghCAiEDDAELIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwALIAAgAzcDAAsgAkEQaiQAC68BAQF/IwBBwABrIgEkACABQShqIAAQhSYgAUEMakEUaiABQShqQRBqKQMANwIAIAFBDGpBDGogAUEoakEIaikDADcCACABIAEpAyg3AhACQEEIQcAAEJ4sIgANAAALIABBGjYCACAAIAEpAgw3AgQgAEEMaiABQQxqQQhqKQIANwIAIABBFGogAUEMakEQaikCADcCACAAQRxqIAFBJGooAgA2AgAgAUHAAGokACAAC8cBAQF/IAAQkhYgACgCBCIAQRRqIgEoAgAgAEEYaigCABChIyAAKAIQIAEoAgAQ1ywCQCAAKAIAQQJGDQAgAEEEahDNLAsgACgCHCAAQSBqKAIAENksIABBLGoiASgCACAAQTBqKAIAEKIjIAAoAiggASgCABDaLCAAQThqIgEoAgAgAEE8aigCABDNFSAAKAI0IAEoAgAQ2ywgAEHEAGoiASgCACAAQcgAaigCABCKDSAAKAJAIAEoAgAQ3CwgAEHQAEEEELMWC8EBAAJAIAFBAXFFDQAgACACNgIEIABBAjYCACAAIAIpAgA3AggPCwJAAkACQAJAIAIoAgBB+v+7f2oOAgECAAsgAEEENgIADwsgAigCBCICKAIAQYiAxABGDQEgAEIENwIIIAAgAjYCBCAAQQA2AgAPCwJAIAIoAgwiAUUNACAAQQA2AgAgACABQX9qNgIMIAAgAigCCCICNgIEIAAgAkHYAGo2AggPCyAAQQQ2AgAPCyAAQQE2AgAgACACQQRqNgIEC8ABAQF/IwBBIGsiAiQAAkACQAJAIAEQyS8NACACQQRqIAEQ6gkCQCACKAIEQYCAgIB4Rg0AIAJBEGpBCGogAkEEakEIaigCADYCACACIAIpAgQ3AxAgACACQRBqEOwXDAILQYCAgIB4IAIoAggQxykgACABEKAJNgIYIABBAjYCACAAQRRqIAFBEGooAgA2AgAgAEEMaiABQQhqKQIANwIAIAAgASkCADcCBAwCCyAAEJ4WCyABENckCyACQSBqJAALuAECBH8BfiAAKAIEIQECQCAAKAIIIgJFDQAgAUEkaiEBA0ACQCABQWRqKQMAIgVCA4NCAFINACAFpyIDIAMoAgAiBEF/ajYCACAEQQFHDQAgAyADKAIQEMYkCwJAIAFBfGooAgAiA0UNACADELQCIANB4ABBCBCzFgsCQCABKAIAIgNFDQAgAxC0AiADQeAAQQgQsxYLIAFBMGohASACQX9qIgINAAsgACgCBCEBCyAAKAIAIAEQni0LtQECAn8BfiMAQcAAayICJAAgASkCBCEEEPonIQMgAiABKAIAEEIgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgA0EIaiACQQhqKQMANwMAIAMgAikDADcDACAAIAM2AgAgACAENwIEIAJBwABqJAALrQEBAn8CQAJAIAFBA0sNACAAQX9qIQADQAJAIAENAEEBDwsgACABaiECIAFBf2ohASACLAAAQX9KDQALQQAhAwwBC0EAIQMgACgAAEGAgYKEeHENAEEEIABBA2pBfHEiAiAAayACIABGGyECIAFBfGohAQNAAkAgAiABSQ0AIAAgAWooAABBgIGChHhxRQ8LIAAgAmooAgBBgIGChHhxDQEgAkEEaiECDAALCyADC6sBAQF/AkACQAJAAkAgAA4DAAECAAtBASEAIAFBCGooAgAiAkUNAiABQQRqKAIAIAJBOGxqIgFBSGoiAkUNAgJAIAFBeGooAgAiAUUNACABEKIQDwsgAhDyHw8LQQEhACABQQhqKAIAIgJFDQEgAUEEaigCACACQThsaiIBQUhqIgJFDQECQCABQXhqKAIAIgFFDQAgARCiEA8LIAIQ8h8PCyABEPIfIQALIAALvwEBBX8gACgCBCECAkACQAJAAkAgACgCAA4DAAECAAsgAiABEJEPDwsgAigCCCIDRQ0BIAIoAgQiACADQThsaiEDIAFBLGohBCABLQB5IQUgAS0AKCEGA0AgAUEBOgB5IAFBAToAKCAAIAEQkgsCQCAAQTBqKAIAIgJFDQAgAUEAOgB5IAFBADoAKCAEIAIQwh8gAiABEIcCCyABIAY6ACggASAFOgB5IABBOGoiACADRw0ADAILCyACIAEQkgsLC78BAgF/AX4CQAJAAkACQAJAAkAgACgCAA4EAQIDBAALIAApAxAgACgCGBC0GQ8LIAApAwgiAkIDg0IAUg0DIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQxiQPCyAAKQMIIAApAxgQqhQPCyAAKQMYIgJQDQEg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ACIFRQ0AIAUoAgAgARCoAQsgBCACQThqIgJHDQALCwJAIAAoAhQiAkUNACACKAIAIAEQqAELC9sBAQJ/AkACQCAAKAIAIgFBCUcNACAAQQhqELAkIQIMAQtBASECAkACQAJAAkACQAJAAkACQCABDgkAAQIDCAQFCAcACyAALQAgQQFzIQIMBwsCQAJAIAAoAggOCAgACAgHBwgBCAsgACgCKCgCGEGAgICAeEchAgwHCyAAKAIMEI8TIQIMBgsgAC0AIEEBcyECDAULIAAoAggOAwQCAwQLIAAtABRBAXMhAgwDCyAAKAIELQBBQQFzIQIMAgsgACgCKCgCGEGAgICAeEchAgwBC0EAIQILIAJBAXELzAEBBX8jAEGgAWsiAiQAAkACQCABvUL///////////8Ag0L/////////9/8AVQ0AIAJBEGohAyABIAJBEGoQ+wEhBAwBCyACQQhqIAEQtB8gAigCDCEEIAIoAgghAwsgAkGUAWogBEEBQQEQlQ8gAigCmAEhBQJAIAIoApQBQQFGDQAgAigCnAEhBgJAIARFDQAgBiADIAT8CgAACyAAIAQ2AgggACAGNgIEIAAgBTYCACACQaABaiQADwsgBSACKAKcAUHAvJwBEI4pAAu8AQECfyAAIAFBwABqELEKAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABD5AgwBCyAAIAMQ2AcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAKYASICRQ0AIAEoApQBIQMgAkEobCECA0AgAyAAEM8JIANBKGohAyACQVhqIgINAAsLAkAgAS0APEEGRg0AIAAgAUEQahCxCgsLugECAX8BfgJAAkACQAJAAkACQCAAKAIADgQBAgMEAAsgACkDECAAKAIYELQZDwsgACkDCCICQgODQgBSDQMgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDGJA8LIABBCGoQyBMPCyAAKQMYIgJQDQEgAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKAIEIgAQsAEgAEHAAEEIELMWCwu3AQEBfwJAIAAoAogBIgRBAXENACABIAIgAxDgGiEDAkAgBEEIcQ0A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AgAgAiABKQIENwIMIAIgAzYCCAJAAkAgA0GAgICAeEcNACAAIAItAAw6AAEgAkEIahDSFUEAIQEMAQsgACACQQhqIAJBH2pBwMyAARDFIzYCBEEBIQELIAAgAToAAAwBC0HQ04ABQRAQnxQhASAAQQE6AAAgACABNgIECyACQSBqJAALoAEBA38gAkEDcSEDIAAgAkEMcSIEaiEFIAEgBGohBAN/AkACQAJAAkAgAkEDSw0AQQEhAgJAIANBAU0NACAFLwAAIAQvAABHDQIgA0F+aiEDIARBAmohBCAFQQJqIQULIANFDQIgBS0AACAELQAARg8LIAAoAAAgASgAAEYNAgtBACECCyACDwsgAkF8aiECIAFBBGohASAAQQRqIQAMAAsLpgEBBH8CQAJAIABB/wFLDQBBASEBIABB3wFxQb9/akH/AXFBGkkNASAAQd8ARg0BIABBUGpB/wFxQQpJDQELQZwGIQFBACECAkADQCABQQJJDQEgAiABQQF2IgMgAmoiBCAEQQN0QbyHiAFqKAIAIABLGyECIAEgA2shAQwACwsgAkEDdCIBQbyHiAFqKAIAIABNIAAgAUHAh4gBaigCAE1xIQELIAELsgEBA38jAEHAAGsiAyQAAkACQCABKAIAIgQoAlwiBUF/Rg0AIABBIjYCACAAIAVBAWoiATYCBCAEIAE2AlwMAQsgA0EcaiABKAIEIAEoAggQihQgA0E4aiACQRBqKQIANwIAIANBMGogAkEIaikCADcCACADIAIpAgA3AiggAygCBCEBAkBBOEUNACAAQQhqIANBCGpBOPwKAAALIAAgATYCBCAAQQA2AgALIANBwABqJAALzQEBAX8jAEEgayICJAACQAJAAkACQAJAAkACQAJAAkAgASgCAA4IAAECAwQFBgcACyABQQE6ACQMBwsgAUEBOgAkDAYLIAEoAgRBAToAGAwFCyACQQE2AgggAkGUnJkBNgIEIAJCADcCECACIAJBHGo2AgwgAkEEakGcnJkBEOkjAAsgASgCBEEBOgBEDAMLIAEoAgRBAToAKAwCCyABKAIEQQE6ACwMAQsgASgCBEEBOgBQCwJAQShFDQAgACABQSj8CgAACyACQSBqJAALtgECA38CfiMAQRBrIgIkAAJAAkAgAC0AJUECRg0AIAIgACkDCCAAKAIYELkfIAIpAwAhBSABKAIYIQMgASACKAIINgIYIAEpAxAhBiABIAU3AxAgACgCICABEOYOAkAgASkDECIFUA0AIAVCA4NCAFINACAFpyIAIAAoAgAiBEF/ajYCACAEQQFHDQAgACAAKAIQEMYkCyABIAM2AhggASAGNwMQDAELIAEgABC2BAsgAkEQaiQAC7gBAQJ/IAFBwABqEK0oAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABCCAwwBCyAAIAMQ6AcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAKYASICRQ0AIAEoApQBIQMgAkEobCECA0AgAyAAEOAJIANBKGohAyACQVhqIgINAAsLAkAgAS0APEEGRg0AIAFBEGoQrSgLC+wBAQF/QQAhAgJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQf8BcUG0f2oOSQALCwsLCwsLCwsLCwsLCwsLCwsLCwsBCwsLCwsLCwsLCwsLCwsCCgoKCgoKCgoKCgoLCgoKCQMKCgoKCgoKCgoKBAUGBwoKCgEKCyABQYAFcUUNBwwKCyABQQhxQQN2DwsgAUGAAnENCCABQQhxQQN2DwsgAUEIcQ0HDAYLIAFBCHENBgwFCyABQQhxDQUMBAsgAUEIcQ0EDAMLIAFBCHENAwwCCyABQQhxQQN2IQIMAQsgAUEIcQ0BCyACDwtBAQvDAQECfyABKAIEIQMgASgCACEEAkAgASgCCC0AAA0AIAQtAAAhASADLQAAIQMCQCACKAKIASIEQYACcUUNACACIARB/31xNgKIASAAIAEgAyACEKsaIAIgAigCiAFBgAJyNgKIAQ8LIAAgASADIAIQqxoPCwJAIAIoAogBIgFBgAJxDQAgAiABQYACcjYCiAEgACAELQAAIAMtAAAgAhCrGiACIAIoAogBQf99cTYCiAEPCyAAIAQtAAAgAy0AACACEKsaC7oBAQJ/IwBBIGsiAyQAIANBEGpBDGogAUEMaigCADYCACADIAEoAgA2AhAgAyABKQIENwIUAkACQCACKAKIASIBQYCcgIACcSIERQ0AIAIgAUH/4///fXE2AogBIANBCGogA0EQaiACEPILIAMoAgghASACIAIoAogBIARyNgKIASADKAIMIQIMAQsgAyADQRBqIAIQ8gsgAygCBCECIAMoAgAhAQsgACACNgIEIAAgATYCACADQSBqJAALzQEBAX8jAEHAAGsiAiQAIAJByIOEATYCOCACQazugwE2AjAgAkHgi4QBNgIoIAJB0IuEATYCICACQcjpgwE2AhggAkGc7oMBNgIQIAJBjO6DATYCCCACIAA2AgQgAiAAQeAEajYCLCACIABB4AJqNgIkIAIgAEHgAGo2AhwgAiAAQYQFajYCFCACIABBgAVqNgIMIAIgAEGIBWo2AjwgAiACQTxqNgI0IAFB5IyEAUEDQayMhAFBByACQQRqQQcQqAohACACQcAAaiQAIAALwAECAX8BfiMAQYACayIEJAAgBEEQaiADEJkPIARB7ABqIAEgBEEQahD1BiAEQQhqIAFBIGpB5L+EARDsIyAEIAI6AMQBIARBiYDEADYCaCAEKAIMIQMgBCgCCCAEQegAakH0v4QBEOIeIAMgAygCAEEBajYCACAAQQA2AgggAEKAgICAwAA3AgAgAEEgaiABQdgAaigCACIDNgIAIAAgASkCUCIFNwIYIAAgBTcCDCAAQRRqIAM2AgAgBEGAAmokAAuiAQECfwJAAkAgAEEASA0AIAAhAgwBCyABQS06AABBACAAayECIAFBAWohAQsCQCACQeMASg0AAkAgAkEJSg0AIAEgAkEwajoAACAAQR92QQFqDwsgASACQQF0Qdz8mAFqLwAAOwAAIABBH3ZBAnIPCyABIAJB5ABuIgNBMGo6AAAgASACIANB5ABsa0EBdEHc/JgBai8AADsAASAAQR92QQNqC7UBAQN/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIUIQIgA0EANgIUAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgAoAgAiAygCAEUNACADEMwKIAAoAgAhAwsgAyABKQIINwIAIANBCGogAUEIakEIaikCADcCACABQSBqJABBAQ8LIAFBADYCGCABQQE2AgwgAUGwjJ4BNgIIIAFCBDcCECABQQhqQai/nAEQ6SMAC8cBAQF/IwBBwABrIgIkACACQdydmQE2AjggAkHMnZkBNgIwIAJBnJ2ZATYCKCACQZydmQE2AiAgAkGcnZkBNgIYIAJBvJ2ZATYCECACQcSSmwE2AgggAiAANgIEIAIgAEEgajYCLCACIABBKmo2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ASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEO4CIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC7EBAQJ/IwBBIGsiAyQAAkACQCABKAIcLQAADQAgA0EYaiACIAEQlBMgAygCHCECIAMoAhghAQwBCwJAIAIoAogBIgRBgAJxDQAgAiAEQYACcjYCiAEgA0EIaiABIAIQ8QIgAygCCCEBIAIgAigCiAFB/31xNgKIASADKAIMIQIMAQsgA0EQaiABIAIQ8QIgAygCFCECIAMoAhAhAQsgACABNgIAIAAgAjYCBCADQSBqJAALsQEBAn8jAEEgayIDJAACQAJAIAEoAhwtAAANACADQRhqIAIgARCTEyADKAIcIQIgAygCGCEBDAELAkAgAigCiAEiBEGAAnENACACIARBgAJyNgKIASADQQhqIAEgAhDwAiADKAIIIQEgAiACKAKIAUH/fXE2AogBIAMoAgwhAgwBCyADQRBqIAEgAhDwAiADKAIUIQIgAygCECEBCyAAIAE2AgAgACACNgIEIANBIGokAAu7AQECfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAIAEoAgAOBwACAQIDBAUACyACIAFBCGoQtRkgAigCBCEDIAIoAgAhAQwFCyABKAIMIQMgASgCCCEBDAQLIAEoAhQhAyABKAIQIQEMAwsgASgCECEDIAEoAgwhAQwCCyABKAIIIQMgASgCBCEBDAELIAJBCGogASgCBBDJAyACKAIMIQMgAigCCCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAuxAQECfyMAQSBrIgMkAAJAAkAgASgCGC0AAA0AIANBGGogAiABEJITIAMoAhwhAiADKAIYIQEMAQsCQCACKAKIASIEQYACcQ0AIAIgBEGAAnI2AogBIANBCGogASACEPgCIAMoAgghASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEPgCIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC6oBAQV/IwBBIGsiAiQAIAJBGGoiAyABQTRqKAIANgIAIAJBEGoiBCABQSxqKQIANwMAIAJBCGoiBSABQSRqKQIANwMAIAIgASkCHDcDAEEcQQQQ3SciBkEYaiADKAIANgIA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NgIQIAIgADYCDCACIABBJGo2AjwgAiACQTxqNgI0IAFBiJGbAUEPQdiQmwFBBiACQQxqQQYQqAohACACQcAAaiQAIAALwQEBAX8jAEHAAGsiAiQAIAAoAgAoAgAhACACQeyPmwE2AjggAkHcj5sBNgIwIAIgADYCLCACQcCJmwE2AiggAiAAQdIAajYCJCACQcCJmwE2AiAgAiAAQdEAajYCHCACQcCJmwE2AhggAiAAQdAAajYCFCACQcSSmwE2AhAgAiAAQcgAajYCDCACIABBIGo2AjwgAiACQTxqNgI0IAFBrJCbAUEMQfyPmwFBBiACQQxqQQYQqAohACACQcAAaiQAIAALsAEBAn8gACgCACICQcAAaiABEK4LAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQngMMAwsgASAAKAIAEJ4DDAILIAAgARDBDwwBCyAAIAEQ2xILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQpygLC64BAQJ/IAAoAgAiAkHAAGogARCoCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEFQMAwsgASAAKAIAEFQMAgsgACABEMIPDAELIAAgARDcEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCnKAsLsAEBAn8gACgCACICQcAAaiABEK8LAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyAAQQRqKAIAIAEQvgMMAwsgACgCACABEL4DDAILIAAgARDDDwwBCyAAIAEQ3RILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQnxoLC7ABAQJ/IAAoAgAiAkHAAGogARDOCgJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgAEEEaigCACABEKQCDAMLIAAoAgAgARCkAgwCCyAAIAEQxA8MAQsgACABEN8SCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEKcoCwuwAQECfyAAKAIAIgJBwABqIAEQiwsCQCACKAKYASIARQ0AIABBKGwhAyACKAKUAUEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABDmAQwDCyABIAAoAgAQ5gEMAgsgACABEMUPDAELIAAgARDhEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCjGgsLsAEBAn8gACgCACICQcAAaiABELALAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQ0QEMAwsgASAAKAIAENEBDAILIAAgARDGDwwBCyAAIAEQ4hILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQpygLC7ABAQJ/IAAoAgAiAkHAAGogARCxCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEKoBDAMLIAEgACgCABCqAQwCCyAAIAEQxw8MAQsgACABEOMSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEKcoCwueAQEDfyMAQSBrIgIkAAJAAkAgASgCBCIDIAEoAgAiBCgCFE8NACABIANBAWo2AgQgAkEIakEEciAEKAIQIANBBHRqIgFBBGooAgAgAUEIaigCABDZEyAAQQhqIAJBCGpBCGopAwA3AwAgAEEQaiACQQhqQRBqKQMANwMAIAJBAzoACCAAIAIpAwg3AwAMAQsgAEEGOgAACyACQSBqJAALnQEBAX8jAEEgayIBJAAgAUEEakEUaiAAQRBqKQIANwIAIAFBBGpBDGogAEEIaikCADcCACABIAApAgA3AggCQEEIQcAAEP8rIgANAAALIABBGjYCACAAIAEpAgQ3AgQgAEEMaiABQQRqQQhqKQIANwIAIABBFGogAUEEakEQaikCADcCACAAQRxqIAFBHGooAgA2AgAgAUEgaiQAIAALtgEBAn8jAEEwayICJAACQAJAAkAgAS0A4AFB2wBGDQBBgICAgHghAwwBCyABEKELIAJBGGogAUEAEI4IIAIoAhwhAQJAIAIoAhgiA0GAgICAeEYNACACQRBqIAJBKGopAgA3AwAgAiACKQIgNwMIDAELIABBgYCAgHg2AgAgACABNgIEDAELIAAgATYCBCAAIAM2AgAgACACKQMINwIIIABBEGogAkEQaikDADcCAAsgAkEwaiQAC6ABAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EDdCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBOxDDCxogAUF4aiEBIABBCGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6kBAQR/IwBBEGsiASQAQYCAxAAhAgJAIAAoAgAoAlAiAyAAKAIIIgRGDQAgACgCBCECAkACQCAAEPsPIgBBgAFPDQBBASEADAELAkAgAEGAEE8NAEECIQAMAQtBA0EEIABBgIAESRshAAsgASACIAQgACADakGEu4QBEL4aIAEgASgCACIANgIIIAEgACABKAIEajYCDCABQQhqEOUfIQILIAFBEGokACACC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EcbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB9wAQwwsaIAFBZGohASAAQRxqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQu6AQEBfyMAQcAAayICJAAgACgCACEAIAJBpOOHATYCOCACQZTjhwE2AjAgAiAAQQRqNgIsIAJBlOOHATYCKCACIABBA2o2AiQgAkGU44cBNgIgIAIgAEECajYCHCACQZTjhwE2AhggAiAAQQFqNgIUIAJBlOOHATYCECACIAA2AgwgAiAAQQVqNgI8IAIgAkE8ajYCNCABQajkhwFBBUH444cBQQYgAkEMakEGEKgKIQAgAkHAAGokACAAC6kBAgJ/AX4jAEEQayICJAAgASgCCCEDIAIgARCDCAJAAkAgAi0AAEEBRw0AIAItAAEhASAAQQA2AgAgACABOgAEDAELAkAgAikDCCIEIANBf2qtWg0AAkAgASgCDEEBaiIDQfQDSw0AIAAgAzYCDCAAIAQ+AgggACABKQIANwIADAILIABBADYCACAAQQE6AAQMAQsgAEEANgIAIABBADoABAsgAkEQaiQAC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EUbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBigIQwwsaIAFBbGohASAAQRRqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQujAQIDfwF+AkAgACgCCCIBRQ0AIAAoAgRBJGohAANAAkAgAEFkaikDACIEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCAAQXxqKAIAIgJFDQAgAhC0AiACQeAAQQgQsxYLAkAgACgCACICRQ0AIAIQtAIgAkHgAEEIELMWCyAAQTBqIQAgAUF/aiIBDQALCwuqAQIBfwF+IAAoAiAiARCSASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABCSASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQogEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQogEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC7wBAQF/IwBBwABrIgIkACAAKAIAIQAgAkHcnZkBNgI4IAJB7J2ZATYCMCACIABBwQBqNgIsIAJBzJ2ZATYCKCACIABBOGo2AiQgAkH8nZkBNgIgIAIgAEEIajYCHCACQeydmQE2AhggAiAAQcAAajYCFCACQcSSmwE2AhAgAiAANgIMIAIgAEE8ajYCPCACIAJBPGo2AjQgAUHAjpsBQQxBsPaaAUEGIAJBDGpBBhCoCiEAIAJBwABqJAAgAAuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBOGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQdYDEMMLGiABQUhqIQEgAEE4aiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQTBsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakG8AxDDCxogAUFQaiEBIABBMGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EYbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB3AMQwwsaIAFBaGohASAAQRhqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBDGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQd0DEMMLGiABQXRqIQEgAEEMaiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQTBsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakHHAhDDCxogAUFQaiEBIABBMGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EFdCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB5wMQwwsaIAFBYGohASAAQSBqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBMGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQfkDEMMLGiABQVBqIQEgAEEwaiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELugEBAX8jAEHAAGsiAiQAIAAoAgAhACACQdyNmQE2AjggAkHMjpkBNgIwIAIgAEEYajYCLCACQYyOmQE2AiggAiAAQRxqNgIkIAJBrI6ZATYCICACIABBDGo2AhwgAkG8jpkBNgIYIAIgADYCFCACQcSSmwE2AhAgAiAAQRBqNgIMIAIgAEEdajYCPCACIAJBPGo2AjQgAUGwhJsBQQpBgISbAUEGIAJBDGpBBhCoCiEAIAJBwABqJAAgAAuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBBHQhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQZwEEMMLGiABQXBqIQEgAEEQaiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQThsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakGvBBDDCxogAUFIaiEBIABBOGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0E4bCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBsQQQwwsaIAFBSGohASAAQThqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBOGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQbQEEMMLGiABQUhqIQEgAEE4aiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQQN0IQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakHHBBDDCxogAUF4aiEBIABBCGohAAwACwsgAkEEahClIyEBIAJBEGokACABC7oBAQF/IwBBwABrIgIkACAAKAIAIQAgAkGMnpkBNgI4IAJBnJ2ZATYCMCACIABBEmo2AiwgAkGcnZkBNgIoIAIgAEERajYCJCACQeycmQE2AiAgAiAAQQxqNgIcIAJBnJ2ZATYCGCACIABBEGo2AhQgAkHEkpsBNgIQIAIgADYCDCACIABBCGo2AjwgAiACQTxqNgI0IAFBuveaAUETQej7mgFBBiACQQxqQQYQqAohACACQcAAaiQAIAALugEBAX8jAEHAAGsiAiQAIAAoAgAhACACQaydmQE2AjggAkGcnZkBNgIwIAIgAEE1ajYCLCACQZydmQE2AiggAiAAQTRqNgIkIAJBjJ2ZATYCICACIABBNmo2AhwgAkHMnJkBNgIYIAIgAEEoajYCFCACQcSSmwE2AhAgAiAAQSBqNgIMIAIgADYCPCACIAJBPGo2AjQgAUHAgZsBQQtBhPSaAUEGIAJBDGpBBhCoCiEAIAJBwABqJAAgAAuqAQIBfwF+IAAoAiAiARCjASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABCjASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQyAEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQyAEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC7YBAgR/AX4CQCAAKAIYIgENAEEADwsCQAJAIAApAwAiBVANACAAKAIQIQIMAQsgACgCECECIAAoAgghAwNAIAJBYGohAiADKQMAIQUgA0EIaiIEIQMgBUKAgYKEiJCgwIB/gyIFQoCBgoSIkKDAgH9RDQALIAAgAjYCECAAIAQ2AgggBUKAgYKEiJCgwIB/hSEFCyAAIAFBf2o2AhggACAFQn98IAWDNwMAIAIgBXqnQQF2QTxxawu8AQEBfyMAQcAAayICJAAgACgCACEAIAJB4PSaATYCOCACQYT2mgE2AjAgAiAAQcEAajYCLCACQdD0mgE2AiggAiAAQThqNgIkIAJBlPaaATYCICACIABBCGo2AhwgAkGE9poBNgIYIAIgAEHAAGo2AhQgAkHEkpsBNgIQIAIgADYCDCACIABBPGo2AjwgAiACQTxqNgI0IAFBwI6bAUEMQbD2mgFBBiACQQxqQQYQqAohACACQcAAaiQAIAALugEBAX8jAEHAAGsiAiQAIAAoAgAhACACQeCLmwE2AjggAkHk85oBNgIwIAIgAEESajYCLCACQeTzmgE2AiggAiAAQRFqNgIkIAJB1PKaATYCICACIABBDGo2AhwgAkHk85oBNgIYIAIgAEEQajYCFCACQcSSmwE2AhAgAiAANgIMIAIgAEEIajYCPCACIAJBPGo2AjQgAUG695oBQRNB6PuaAUEGIAJBDGpBBhCoCiEAIAJBwABqJAAgAAu6AQEBfyMAQcAAayICJAAgACgCACEAIAJB9POaATYCOCACQeTzmgE2AjAgAiAAQTVqNgIsIAJB5POaATYCKCACIABBNGo2AiQgAkHU85oBNgIgIAIgAEE2ajYCHCACQcTzmgE2AhggAiAAQShqNgIUIAJBxJKbATYCECACIABBIGo2AgwgAiAANgI8IAIgAkE8ajYCNCABQcCBmwFBC0GE9JoBQQYgAkEMakEGEKgKIQAgAkHAAGokACAAC7oBAQF/IwBBwABrIgIkACAAKAIAIQAgAkHgg5sBNgI4IAJB0IObATYCMCACIABBGGo2AiwgAkGMg5sBNgIoIAIgAEEcajYCJCACQfyCmwE2AiAgAiAAQQxqNgIcIAJBwIObATYCGCACIAA2AhQgAkHEkpsBNgIQIAIgAEEQajYCDCACIABBHWo2AjwgAiACQTxqNgI0IAFBsISbAUEKQYCEmwFBBiACQQxqQQYQqAohACACQcAAaiQAIAALqgECAX8BfiAAKAIgIgEQxQEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQxQEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC6oBAgF/AX4gACgCICIBELIBIAFBwABBCBCzFgJAAkACQAJAIAAoAgAOAgECAAsgACgCBCIAELIBIABBwABBCBCzFg8LIAApAwgiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKQMIIgJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCwuqAQIBfwF+IAAoAiAiARC0ASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABC0ASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQvgEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQvgEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC6oBAgF/AX4gACgCICIBEL8BIAFBwABBCBCzFgJAAkACQAJAIAAoAgAOAgECAAsgACgCBCIAEL8BIABBwABBCBCzFg8LIAApAwgiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKQMIIgJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCwuqAQIBfwF+IAAoAiAiARCuASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABCuASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQsAEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQsAEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC6oBAgF/AX4gACgCICIBEM4BIAFBwABBCBCzFgJAAkACQAJAIAAoAgAOAgECAAsgACgCBCIAEM4BIABBwABBCBCzFg8LIAApAwgiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKQMIIgJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCwuqAQIBfwF+IAAoAiAiARCvASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABCvASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQpAEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQpAEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC6wBAQF/IwBBEGsiBCQAAkACQAJAAkAgAC0AAEEBRw0AIAEgAhC+LQ0BEL4mIQIMAwsgACABIAIQgBMiAg0CIAAtAABBAUYNASAEQQhqIAAoAgQiACgCACgCABC/LSAEQQhqENEmIgINAiADIAAoAgAQhwkiAg0CIARBBDoACCAEQQhqENEmIQIMAgsQlgMhAgwBC0GgppwBQShBqM+bARDSHgALIARBEGokACACC6wBAQF/IwBBEGsiBCQAAkACQAJAAkAgAC0AAEEBRw0AIAEgAhC+LQ0BEL4mIQIMAwsgACABIAIQgBMiAg0CIAAtAABBAUYNASAEQQhqIAAoAgQiACgCACgCABC/LSAEQQhqENEmIgINAiADIAAoAgAQuCUiAg0CIARBBDoACCAEQQhqENEmIQIMAgsQlgMhAgwBC0GgppwBQShBqM+bARDSHgALIARBEGokACACC6YBAQF/IwBBIGsiBCQAIAQgAzoAHyAEIAI6AB4CQAJAIAEoAogBIgNBgCBxDQAgASADQYAgcjYCiAEgBEEIaiAEQR5qIARBH2ogARC+AiAEKAIIIQMgASABKAKIAUH/X3E2AogBIAQoAgwhAQwBCyAEQRBqIARBHmogBEEfaiABEL4CIAQoAhQhASAEKAIQIQMLIAAgAzYCACAAIAE2AgQgBEEgaiQAC6UBAQN/IwBBEGsiAiQAQQAhAwJAIAEtAJEBQSBxRQ0AQQAhAyABLQDgAUHyAGpB/wFxQQNLDQBBACEDIAEQ2AkiBEUNAAJAIAQtAAAiBBClFQ0AQQAhAyAEQX5qDgMAAQABCyACQQRqIAFB0NSbAUEEQQAQwgQCQCACKAIERQ0AIAJBBGpBBGoQ6QcLQQEhAwsgAEEAOgAAIAAgAzoAASACQRBqJAALpQECAX8BfiMAQSBrIgQkACAEQRBqIAMgAUEAEIsCAkACQCAELQAQQQRGDQAgBCkDECIFQv8Bg0IEUQ0AIAAgBTcCAAwBCyAEIAI2AhggBCABNgIUIARBATYCECAEQQhqIAMgBEEQakGolpwBQQQQsw0CQCAELQAIQQRGDQAgBCkDCCIFQv8Bg0IEUQ0AIAAgBTcCAAwBCyAAQQQ6AAALIARBIGokAAuNAQEDfwJAIANBCEkNACAAIAAgA0EDdiIDQeAAbCIEaiAAIANBqAFsIgVqIAMQ+g8hACABIAEgBGogASAFaiADEPoPIQEgAiACIARqIAIgBWogAxD6DyECCyAAIAIgASAAQQxqKAIAIgMgAUEMaigCACIESSIFIAQgAkEMaigCACIGSXMbIAUgAyAGSXMbC68BAQJ/IwBBwABrIgEkACABIAAoAgAoAlAiAjYCFCABQQhqIAAoAgQgACgCCCACQdi5hAEQvhogASABKAIIIgA2AhggASAAIAEoAgxqNgIcAkAgAUEYahDlHyIAQYCAxABHDQAgAUEBNgIkIAFBgLqEATYCICABQgE3AiwgAUELNgI8IAEgAUE4ajYCKCABIAFBFGo2AjggAUEgakGIuoQBEOkjAAsgAUHAAGokACAAC6gBAQN/IwBBwABrIgIkACACIAAoAhQiAzYCECACIAE2AgwgACgCDCEEAkACQCABIANBAWpLDQAgAyAETQ0BCyACQQI2AhggAkHg6JsBNgIUIAJCAjcCICACQQs2AjggAkGSATYCMCACIAQ2AjwgAiACQSxqNgIcIAIgAkE8ajYCNCACIAJBDGo2AiwgAkEUakHw6JsBEOkjAAsgACABNgIQIAJBwABqJAALoAEBA38jAEEQayIFJAACQCADQf///z9xIAEgBEH/AXEiBmotAOACaiIHIAIoAnwiBE8NAEEAIQQCQCACKAJ4IAdBAnRqKAIAIgdBAE4NACAFIAI2AgwgBSABNgIIIAUgBUEIaiADIAZBCHQQgAEgBSgCBCEHIAUoAgAhBAsgACAENgIAIAAgBzYCBCAFQRBqJAAPCyAHIARB1OCDARCRFQALnwEBBH8jAEEQayIEJAACQCABLQDfBEEBaiIFIANB////P3FqIgYgAigCfCIHTw0AQQAhBwJAIAIoAnggBkECdGooAgAiBkEATg0AIAQgAjYCDCAEIAE2AgggBCAEQQhqIAMgBUEQdEEBchCAASAEKAIEIQYgBCgCACEHCyAAIAc2AgAgACAGNgIEIARBEGokAA8LIAYgB0Hk4IMBEJEVAAulAQEDfwJAAkACQCABKAIAIgINAEEAIQMMAQtBACEDA0ACQCABKAIIIgQgASgCBE8NACACIARqLQAAQcUARw0AIAEgBEEBajYCCAwCCwJAIANFDQAgASgCECICRQ0AIAJB4p6aAUECEIIGRQ0AQQEhAgwDC0EBIQIgAUEBEIwCDQIgA0EBaiEDIAEoAgAiAg0ACwtBACECCyAAIAM2AgQgACACNgIAC6IBAQZ/AkAgAUUNAEEAIQIDQCAAIAJBBHRqIgMoAgAiBBCSASAEQcAAQQgQsxYCQCADKAIMIgVFDQAgBUEEaiIGKAIAIQMCQCAFKAIIIgRFDQADQCADKAIAIgcQtAIgB0HgAEEIELMWIANBBGohAyAEQX9qIgQNAAsgBigCACEDCyAFKAIAIAMQny0gBUEUQQQQsxYLIAJBAWoiAiABRw0ACwsLnwECAX8CfgJAAkAgASgCEA0AIAEpAwAiBEIDgyEFAkACQCAALQA6DQACQCAFQgBSDQAgBKciAyADKAIAIgNBAWo2AgAgA0F/TA0ECyAAIAQgAhCHBgwBCwJAIAVCAFINACAEpyICIAIoAgAiAkEBajYCACACQX9MDQMLIABBEGogBBDCBgsgACgCJCIARQ0AIAFBACAAEPUFNgIQCw8LAAuqAQEBfyMAQTBrIgMkACADQQhqIAFBCGopAwA3AwAgA0EQaiABQRBqKQMANwMAIANBGGogAUEYaikDADcDACADIAEpAyA3AyAgAyABKQMANwMAIAMgASkDKDcDKAJAAkAgAigCiAEiAUGAgBBxRQ0AIAIgAUH//29xNgKIASAAIAMgAhCrASACIAIoAogBQYCAEHI2AogBDAELIAAgAyACEKsBCyADQTBqJAALrQEBA38gAEHAAGoQuCQgAEGQAWohAiAAKAKEAUHYAGwhAyAAKAKAASEEAkADQCADRQ0BAkACQAJAAkACQCAEKAIADgYEAQIDBAAECyAEQQRqIAEQky8MAwsgBEEEaiABENsnDAILIARBBGogARCgLwwBCyAEQQRqIAEQ+xMLIARB2ABqIQQgA0Gof2ohAwwACwsgAiABEPsTAkAgAC0APEEGRg0AIABBEGoQuCQLC64BAQN/AkAgACgCHCIDIAAoAiAiBCABEOgSIgVFDQAgAyAEIAVBf2pBnJWcARDeJSEFIAMgBCACQX9qEOgSIgIgBEF/akYNACADIAQgAkEBakGslZwBEN4lIgQtAAlBAUcNAAJAAkAgBC0ACCIEDgUBAgICAQALAkAgBEG9f2oOAwECAQALIARBc2pBAk8NAQsCQCAFLQAIQQZHDQAgBSgCACEBCyAAIAFBOxDxHgsLrgEAAkACQAJAAkAgAUH/B0oNACABQYJ4Tg0DIABEAAAAAAAAYAOiIQAgAUG4cE0NASABQckHaiEBDAMLIABEAAAAAAAA4H+iIQAgAUH+D0sNASABQYF4aiEBDAILIABEAAAAAAAAYAOiIQAgAUHwaCABQfBoSxtBkg9qIQEMAQsgAEQAAAAAAADgf6IhACABQf0XIAFB/RdJG0GCcGohAQsgACABQf8Haq1CNIa/ogu7AQACQAJAAkACQAJAAkAgASACQYDRgAFBFBDjJQ0AIAEgAkGU0YABQRUQ4yUNASABIAJBqdGAAUEVEOMlDQIgASACQb7RgAFBDRDjJQ0DIAEgAkHL0YABQRgQ4yUNBAJAIAEgAkHj0YABQQ8Q4yUNACAAQQY6AAEMBgsgAEEFOgABDAULIABBADoAAQwECyAAQQE6AAEMAwsgAEECOgABDAILIABBAzoAAQwBCyAAQQQ6AAELIABBADoAAAugAQEEfyMAQRBrIgIkAEEBIQMCQCABKAIAIgRBJyABKAIEIgUoAhAiAREHAA0AIAJBBGogACgCAEGBAhDBBAJAAkAgAi0ABEGAAUcNACAEIAIoAgggAREHAEUNAUEBIQMMAgsgBCACQQRqIAItAA4iA2ogAi0ADyADayAFKAIMEQsARQ0AQQEhAwwBCyAEQScgAREHACEDCyACQRBqJAAgAwufAQEDfyMAQZADayIDJAAgAyABIAIQuwMCQAJAIAMoAgBBh4CAgHhGDQACQAJAIAINAEEAIQQMAQsgAUEIaigCACEEIAJBAUYNACABQRhqIQEgAkF/akH/////AHEhAgNAIAEoAgAiBSAEIAUgBEsbIQQgAUEQaiEBIAJBf2oiAg0ACwsgACADIAQQ1wYMAQsgAEECOgAMCyADQZADaiQAC5wBAQF/AkACQAJAAkAgBSAESQ0AIAUgA0sNASAFIARGDQIgBSAEayEGIAIgBGohA0EAIQUCQANAIAEgAyAFai0AAGotAAANASAGIAVBAWoiBUYNBAwACwsgACAFIARqIgE2AgRBASEFIAAgAUEBajYCCAwDCyAEIAVBqJeEARDiLAALIAUgA0Gol4QBEOEsAAtBACEFCyAAIAU2AgALmwEBAX8CQCABRQ0AA0ACQAJAAkACQCAAKAIAQX9qDgQAAQMCAwsgAEEIaigCACICRQ0CIABBBGooAgAgAkEDdEEEELMWDAILIABBCGooAgAiAkUNASAAQQRqKAIAIAJBAnRBBBCzFgwBCyAAQQhqKAIAIgJFDQAgAEEEaigCACACQQJ0QQQQsxYLIABBFGohACABQX9qIgENAAsLC6wBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARDtCQwBCyACQQhqIAFBAUEBQcC8nAEQ4xkgAigCCCEFIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQAC58BAQR/AkAgAS0AGEUNACAALQA0DQAPCyAALQA4IQIgACABLQAZRUEBdDoAOAJAIAEoAggiA0UNACABKAIEIgEgA0E4bGohBCAALQA5IQMDQCAAQQA6ADkgASAAEPsOIAAgAzoAOQJAIAFBMGooAgAiBUUNACAAQQE6ADkgBSAAENoBIAAgAzoAOQsgAUE4aiIBIARHDQALCyAAIAI6ADgLnAEBA38CQAJAAkAgAS0AGEUNACAAKAIgLQA0RQ0BCyABLQAZIQICQCAALQAlDQAgAkH/AXFFQQF0IQMMAgtBAiEDIAJBf2pB/wFxQQJPDQELDwsgAC0AJCEEIAAgAzoAJAJAIAEoAggiAkUNACABKAIEIQEgAkE4bCECA0AgACABEOwLIAFBOGohASACQUhqIgINAAsLIAAgBDoAJAudAQEGf0EAIQICQANAIAIgAUYNASACQQxsIQMgAkEBaiIEIQIgACADaiIFKAIAIgZBgICAgHhGDQAgBSgCCCEDIAUoAgQiByECAkADQCADRQ0BIAJBBGooAgAiBSACQQhqKAIAELMlIAIoAgAgBRC6LSACQQxqELktIANBf2ohAyACQRhqIQIMAAsLIAYgB0EEQRgQnxUgBCECDAALCwumAQEDfyMAQRBrIgMkACABKAIAIgQoAgBB4aucAUEBEI4JIANBBDoACAJAAkAgA0EIahDRJiIFRQ0AIABBAjoAACAAIAU2AgQMAQsCQCACRQ0AIAAgATYCBCAAQYACOwEADAELIANBCGogBCgCABDDLQJAIANBCGoQ0SYiBUUNACAAQQI6AAAgACAFNgIEDAELIAAgATYCBCAAQQA7AQALIANBEGokAAuhAQAgAEEAOgAYIABBfzYCFCAAIAY2AhAgACAFNgIMIAAgBDYCCCAAIAM2AgQgACACNgIAAkAgASgCFCIGIAEoAgxHDQAgAUEMakGguZsBELUdCyABIAZBAWo2AhQgASgCECAGQRxsaiIBIAApAgA3AgAgAUEIaiAAQQhqKQIANwIAIAFBEGogAEEQaikCADcCACABQRhqIABBGGooAgA2AgALkgEBAX9B/wEhBQJAIANB/wFxRQ0AQX9BACADa0EHcXRBf3MgA0EHcXQhBQsgAEEIOgAOIAAgAzoADSAAIAU6AAwgACABNgIIIAAgBDoAFiAAQQA6ABUgACACQX5qNgIEIAAgAUEBajYCACAAIAEgAmpBf2o2AhAgAEF/QX8gBEEHcXRBf3MgBEH/AXFBCEYbOgAUC6wBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARDtCQwBCyACQQhqIAFBAUEBQcC8nAEQqhogAigCCCEFIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQAC6wBAQR/IwBBEGsiAiQAIAEoAgwhAwJAAkACQAJAAkAgASgCBA4CAAECCyADDQFBASEEQQAhAQwCCyADDQAgASgCACIDKAIEIQEgAygCACEEDAELIAAgARDtCQwBCyACQQhqIAFBAUEBQcC8nAEQpxogAigCCCEFIAIoAgwhAwJAIAFFDQAgAyAEIAH8CgAACyAAIAE2AgggACADNgIEIAAgBTYCAAsgAkEQaiQAC6MBAgJ/AX4jAEEQayIEJAACQAJAAkAgA0UNAAJAIAEtADxBAUcNACAEQQhqIAEQqhcCQCAELQAIQQRGDQAgBCkDCCIGQv8Bg0IEUg0DCyABQQA6ADwgASgCACEFIAFBADYCACAFQQFHDQAgASABKAIEEMUFCyABKAIoIAIgAxCOCSABIAIgAxDgBwsgAEEEOgAADAELIAAgBjcCAAsgBEEQaiQAC58BAQF/IwBBIGsiAiQAAkACQAJAIAEtABRBAkYNACACIAAgASABKAIYEKQHIAItABRBA0cNASABLQAUQQJGDQAgACgCFCABEKsIGgsgASgCGCAAEP4GDAELIAEQ/yggAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACABQQhqIAJBCGopAwA3AwAgASACKQMANwMACyACQSBqJAALrAEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEO0JDAELIAJBCGogAUEBQQFBwLycARCxGiACKAIIIQUgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAALowECAn8BfiMAQRBrIgQkAAJAAkACQCADRQ0AAkAgAS0APEEBRw0AIARBCGogARCqFwJAIAQtAAhBBEYNACAEKQMIIgZC/wGDQgRSDQMLIAFBADoAPCABKAIAIQUgAUEANgIAIAVBAUcNACABIAEoAgQQxgULIAEoAiggAiADEI4JIAEgAiADEOAHCyAAQQQ6AAAMAQsgACAGNwIACyAEQRBqJAALowECAn8BfiMAQRBrIgQkAAJAAkACQCADRQ0AAkAgAS0APEEBRw0AIARBCGogARCqFwJAIAQtAAhBBEYNACAEKQMIIgZC/wGDQgRSDQMLIAFBADoAPCABKAIAIQUgAUEANgIAIAVBAUcNACABIAEoAgQQxQULIAEoAiggAiADEI4JIAEgAiADEKcKCyAAQQQ6AAAMAQsgACAGNwIACyAEQRBqJAALmwECA38BfiMAQSBrIgIkAEEAIQNBACEEAkADQCABIARGDQEgACkCACEFIABBgYCAgHg2AgAgAkEIakEQaiAAQRBqKQIANwMAIAJBCGpBCGogAEEIaikCADcDACACIAU3AwgCQCAFp0GBgICAeEYNACAEQQFqIQQgAkEIahCMKQwBCwsgASAEayEDIAJBCGoQjCkLIAJBIGokACADC6UBAQR/IwBBEGsiAiQAIAIgASgCFCIDEKQjAkACQCACKAIAQQFHDQAgACACKQMINwMQIABC/v///wc3AwggAEEANgIADAELIAIoAgQhBAJAIAMgAUEMaiIFKAIARw0AIAVBxImAARD6GwsgACAENgIEIABBAzYCACABIANBAWo2AhQgASgCECADQQlsaiIBQgA3AAAgAUEIakEAOgAACyACQRBqJAALsQEBA38jAEEgayIDJAAgA0IAEPYLAkACQCADKAIAQYSAgIB4Rw0AQQAtAKDxngEaIAMoAgQhBEEQEH0iBUUNASAFIAI6AA0gBSABOgAMIAUgBDYCCCAFQoGAgIAQNwIAIABB1JmDATYCBCAAIAU2AgAgA0EgaiQADwsgA0EQakEIaiADQQhqKQMANwMAIAMgAykDADcDEEHEiJwBQSsgA0EQakH0lIMBQcSZgwEQ6hILAAuPAQIDfwF+AkACQCABrUIMfiIFQiCIpw0AIAWnIgJBeEsNACACQQdqQXhxIgIgAUEIamoiAyACSQ0AIANB+P///wdLDQBBAC0AoPGeARogAxB9IgNFDQEgAEEANgIMIAAgAUF/aiIENgIEIAAgAyACajYCACAAIAQgAUEDdkEHbCABQQlJGzYCCA8LEOchCwALpAECAn8BfgJAAkACQCABKAIAQQVGDQAgASkCACIFQiCIpyEDAkACQAJAIAWnIgRBfWoiAUECIAFBAkkbDgMAAQIAC0EBIQEgAhC0IyECDAMLIAJFDQNBASEBIAMgAkF/ahCxISECDAILQQEhASAEIAMQriEhAgwBCyABKAIEIQJBACEBCyAAIAI2AgQgACABNgIADwtB9OCDAUEkQZjhgwEQshcAC5UBAgF/An4gACAAKAI4QQFqNgI4IAAgAa1C/wGDIgMgACgCPCIBQQN0QThxrYYgACkDMIQiBDcDMAJAAkBBCCABayICQQFLDQAgACAAKQMYIASFNwMYIAAQ/Q0gACkDMCEEIAAgAyACQQN0rYg3AzAgACAEIAApAwCFNwMAIAFBeWohAQwBCyABQQFqIQELIAAg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ACACNgIEIAAgBDYCACADQRBqJAAPC0HEiJwBQSsgA0EPakGY24MBQajbgwEQ6hIAC0HEiJwBQSsgA0EPakHQuoABQai7gAEQ6hILAAufAQECfyAAEKgJIQEgACgCwBIgACgCxBIiAigCCEF/akF4cWpBCGogAigCGBEEACECAkAgAC0A1BJBAUcNAEGgppwBQShBqOuDARDSHgALIAEgAmogACgC0BIiACgC0AJBFGxqIAAoAtwCQQJ0aiAAKALEAiICKAIQQQN0aiACKAIcQQV0aiACKAIoQQxsaiACKAIsaiAAKALAAmpBiANqC5sBAQN/IwBBEGsiAiQAIAAoAgAiACgCCCEDIAAoAgQhACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBA3QhAQNAIAIgADYCDCACQQRqIAJBDGpBtwEQwwsaIABBCGohACABQXhqIgENAAsLIAJBBGoQpSMhACACQRBqJAAgAAueAQEDfyMAQdAAayICJAACQCABKAIgDQAgAUF/NgIgIAJBCDYCQCACIAFBJGogAkHAAGoQwAwgASABKAIgQQFqNgIgIABBCGohAyACKAIEIQECQAJAIAIoAgAiBEEqRg0AQThFDQEgAyACQQhqQTj8CgAADAELIAMgATYCAAsgACAENgIAIAAgATYCBCACQdAAaiQADwtBjKGEARDSGgALmAEBBH8CQCAAKAIAQYCAgIB4Rg0AIAAoAghBBHQhAiAAKAIEQQxqIQADQCACRQ0BAkAgAEF8aiIDKAIAIgQgAU0NACAAQQA6AAAgBCABayAEEPYmIQQgA0EANgIAIAFFDQACQCABRQ0AIABBeGooAgAiBSAFIARqIAH8CgAACyADIAE2AgALIAJBcGohAiAAQRBqIQAMAAsLC6EBAQN/AkACQAJAAkAgASgCACICDQBBACEDDAELQQAhAwNAAkAgASgCCCIEIAEoAgRPDQAgAiAEai0AAEHFAEcNACABIARBAWo2AggMAgsCQCADRQ0AIAEoAhAiAkUNACACQeKemgFBAhCCBg0DCyABEP8CDQIgA0EBaiEDIAEoAgAiAg0ACwtBACEBDAELQQEhAQsgACADNgIEIAAgATYCAAuXAQICfwF+IAAgACgCOEEBajYCOCAAQv8BIAAo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BBD/CyEADAILIAIgAEEIajYCCCABQceFmwFBByACQQhqQaMEEP8LIQAMAQsgAiAANgIMIAFBzoWbAUEFIAJBDGpBpAQQ/wshAAsgAkEQaiQAIAALkwEBAn8jAEEQayIDJAACQAJAIAEoAgAiBEEBakF+cSAERg0AIANBCGogARC8ISADKAIMIQEgAygCCCEEDAELIAEoAgghAQsCQAJAAkAgAUECSw0AIAFBAkcNAQwCCyAELAACQb9/Sg0BCyAEIAFBAiABIAIQ4yoACyAAIAFBfmo2AgQgACAEQQJqNgIAIANBEGokAAujAQIBfwF+IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKQMAQn58IgNCAiADQgJUG6cOAwABAgALIAIgAEEIajYCBCABQb6FmwFBCSACQQRqQZcGEP8LIQAMAgsgAiAAQQhqNgIIIAFBx4WbAUEHIAJBCGpBmAYQ/wshAAwBCyACIAA2AgwgAUHOhZsBQQUgAkEMakGZBhD/CyEACyACQRBqJAAgAAuWAQEBf0EALQCg8Z4BGgJAQcAAEH0iAQ0AAAsgASAAKQMANwMAIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAFBCGogAEEIaikDADcDACABC5oBAgN/An4gASgCDCECIAEoAgAiAykDACEFAkACQCABKAIEIgENAEIAIQZBACEEDAELIAMgAUEEdGtBcGqtQiCGIAFBEWxBGWqthCEGQQghBAsgACAGNwIkIAAgBDYCICAAIAI2AhggACADNgIQIAAgA0EIajYCCCAAIAMgAWpBAWo2AgwgACAFQn+FQoCBgoSIkKDAgH+DNwMAC9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnS3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnW3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAna4C5kBAQF/IwBBIGsiBSQAIAUgBDoAByAFIAI2AgAgBUEIakEIaiADQQhqKAIANgIAIAUgAykCADcDCCABKAKIASEDIAUgBTYCGCAFIAVBB2o2AhQCQAJAIANBCHENACABIANBCHI2AogBIAAgBUEIaiABEJ8BIAEgASgCiAFBd3E2AogBDAELIAAgBUEIaiABEJ8BCyAFQSBqJAALlQEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEECdCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBLhDDCxogAUF8aiEBIANBBGohAwwACwsgAkEEahClIyEBIAJBEGokACABC5UBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABBDGwhAQJAA0AgAUUNASACIAM2AgwgAkEEaiACQQxqQT0QwwsaIAFBdGohASADQQxqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAg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AEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABBAnQhAQJAA0AgAUUNASACIAM2AgwgAkEEaiACQQxqQacCEMMLGiABQXxqIQEgA0EEaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlwEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEGdCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBxQQQwwsaIAFBQGohASADQcAAaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlgEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEobCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpByQQQwwsaIAFBWGohASADQShqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuZAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCEAIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCAAQdgAbCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBygQQwwsaIAFBqH9qIQEgA0HYAGohAwwACwsgAkEEahClIyEBIAJBEGokACABC5kBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABByABsIQECQANAIAFFDQEgAiADNgIMIAJBBGogAkEMakHLBBDDCxogAUG4f2ohASADQcgAaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlgEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEobCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpB2wMQwwsaIAFBWGohASADQShqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAgAQudAQEBfyMAQRBrIgYk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IAM2AgQgAkEwaiQAC6ABAgR/AX4jAEEQayIBJAAgAUEIQQhBBBCjEiABKAIEIQICQAJAIAEoAgAiAw0AIAE1AgghBQwBCyABKQIIIQUgAkEJaiIERQ0AIANB/wEgBPwLAAsgAUEIaiIEIAU3AgAgASACNgIEIAEgAzYCACABQsHK2YvGDRDCBiABEPAfEMIGIABBCGogBCkCADcCACAAIAEpAgA3AgAgAUEQaiQAC6cBAAJAIAEgAkH46psBQQUQ4yVFDQBB5gAPCwJAIAEgAkGXn5wBQQYQ4yVFDQBBlAEPCwJAIAEgAkGIg5wBQQYQ4yVFDQBB5wAPCwJAIAEgAkGx9JsBQQYQ4yVFDQBBlgEPCwJAIAEgAkGjupwBQQMQ4yVFDQBBkwEPCwJAIAEgAkGr9JsBQQYQ4yVFDQBBlQEPC0Gef0GkfyABIAJB3fSbAUEJEOMlGwunAQACQCABIAJBqJacAUEEEOMlRQ0AQegADwsCQCABIAJB1IKcAUEFEOMlRQ0AQekADwsCQCABIAJBkaucAUEEEOMlRQ0AQeoADwsCQCABIAJBw/ObAUEGEOMlRQ0AQewADwsCQCABIAJBw4KcAUEDEOMlRQ0AQesADwsCQCABIAJBsoScAUEEEOMlRQ0AQZcBDwtBoH9BpH8gASACQdT/mwFBBhDjJRsL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADcrcL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADc7cL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADcbcLmAEBAn8jAEEQayIGJABBACEHAkACQAJAIAEtAOABQYQBRw0AIAEQoQsgBkEIaiABQQAgASgC2AEQgRMgBigCDCEHIAYoAghBAXENAQsgACAHNgIgIAAgAjYCGCAAQQI6ABQgACABKALUATYCHCAAIAWtQiCGIASthDcDAAwBCyAAIAc2AgBBAiEDCyAAIAM6ACQgBkEQaiQAC6wBAQJ/IwBBIGsiASQAAkACQEEAKALI8J4BDQACQAJAIABFDQAgACgCACECIABBADYCACACRQ0AIAAoAgQhAAwBC0EAQQAoAtzgngEiAEEBajYC3OCeASAARQ0CC0EAIAA2AszwngFBAEEBNgLI8J4BCyABQSBqJABBzPCeAQ8LIAFBADYCGCABQQE2AgwgAUGcnIQBNgIIIAFCBDcCECABQQhqQaSchAEQ6SMAC40BAQR/IwBBEGsiAyQAIANBCGogACgCACIEIAAoAgQgARCyGyADKAIIIQUgAy0ADCEGIAAgACgCDEEBajYCDCAAIAAoAgggBkEBcWs2AgggBEEAIAVrQRhsakFoaiIAIAIpAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACADQRBqJAALoAEAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCgECAwQFBggHCAABCyAAQQhqIAEQoQYPCyAAQRxqIAEQhSkPCyAAQQhqIAEQcQ8LIABBHGogARCFKQ8LAkACQCAAKAIIDgMAAQUACyAAKAIoIAEQYQ8LIAAoAiggARCdGw8LIABBBGogARCTLw8LIABBEGogARCFKQ8LIABBBGogARCTLwsLnwEBA38gAC0ACCEBAkACQCAAKAIAIgIN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AWo2AgAgBEF/TA0BCyAAIANqIAEgAhCJBhoPCwALlgECAn8BfgJAIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLAkACQAJAIAAoAgAOAwACAQILIAApAwgiA0IDg0IAUg0BIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKAIEIgAQrwEgAEHAAEEIELMWCwuVAQEBfyMAQSBrIgMkACADIAI2AhwCQAJAIAEoAogBIgJBgCBxDQAgASACQYAgcjYCiAEgA0EIaiADQRxqIAEQmQUgAygCCCECIAEgASgCiAFB/19xNgKIASADKAIMIQEMAQsgA0EQaiADQRxqIAEQmQUgAygCFCEBIAMoAhAhAgsgACACNgIAIAAgATYCBCADQSBqJAALkQEBBH8jAEEgayICJAAgAkEIakEQaiIDIAFBLGooAgA2AgAgAkEIakEIaiIEIAFBJGopAgA3AwAgAiABKQIcNwMIQRRBBBDdJyIFQRBqIAMoAgA2AgAgBUEIaiAEKQMANwIAIAUgAikDCDcCACABQQRqEO4nIAEQqy8gAEGcjpwBNgIEIAAgBTYCACACQSBqJAALmAEBAX8jAEEgayIDJAAgA0EIakEQaiABQRBqKQMANwMAIANBCGpBCGogAUEIaikDADcDACADIAEpAwA3AwgCQAJAIAIoAogBIgFBgICAgAFxRQ0AIAIgAUH/////fnE2AogBIAAgA0EIaiACEPICIAIgAigCiAFBgICAgAFyNgKIAQwBCyAAIANBCGogAhDyAgsgA0EgaiQAC4IBAgF/AX4CQAJAIAGtIAOtfiIFQiCIpw0AIAWnIgEgAkF/amoiBCABSQ0AIARBACACa3EiASADQQhqaiIDIAFJDQECQCADQYCAgIB4IAJrSw0AIAAgATYCCCAAIAM2AgQgACACNgIADwsgAEEANgIADwsgAEEANgIADwsgAEEANgIAC5IBAQR/IwBBEGsiAyQAAkACQCABKAIAIgQgAigCACIFTw0AIANBCGogAkEIaigCADYCACADIAIpAgA3AwAgACADIAEoAgQiBiABKAIIEPQKDAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgACADIAIoAgQiBiACKAIIEPQKIAUhBAsg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A0EwRg0DDAULIAFFDQQgAEEIahDrC0EBcw8LIABBBGogARClEg8LIABBKGogARClEiECCyACDwsgAEEEaiABEKUSDwtBAQuWAQEBfyMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACgCAA4DAAECAAsgAiAAQQhqNgIEIAFBoJqbAUEIIAJBBGpBqwQQ/wshAAwCCyACIABBCGo2AgggAUHSu5wBQQYgAkEIakGsBBD/CyEADAELIAIgAEEEajYCDCABQci7nAFBBCACQQxqQdADEP8LIQALIAJBEGokACAAC4oBAgF/AX4CQAJAAkACQCAAKAIADgIBAgALIABBBGoQuQEPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLlgEBAX8jAEEQayICJAACQAJAAkACQCAAKAIAIgAoAgAOAwABAgALIAIgAEEIajYCBCABQb67nAFBBSACQQRqQb4FEP8LIQAMAgsgAiAAQQhqNgIIIAFBhZqbAUELIAJBCGpBoAUQ/wshAAwBCyACIABBBGo2AgwgAUH9mZsBQQggAkEMakG9BRD/CyEACyACQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBBHQhAgNAIAMgADYCDCADQQRqIANBDGpB1wUQwwsaIABBEGohACACQXBqIgINAAsLIANBBGoQpSMhACADQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBBHQhAgNAIAMgADYCDCADQQRqIANBDGpB6wUQwwsaIABBEGohACACQXBqIgINAAsLIANBBGoQpSMhACADQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBAnQhAgNAIAMgADYCDCADQQRqIANBDGpB9wQQwwsaIABBBGohACAC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IABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEK4BIAFBwABBCBCzFiAAEMMRDAELIAAoAhAiARCuASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBELABIAFBwABBCBCzFiAAEMQRDAELIAAoAhAiARCwASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEK8BIAFBwABBCBCzFiAAEMYRDAELIAAoAhAiARCvASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEKQBIAFBwABBCBCzFiAAEMcRDAELIAAoAhAiARCkASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguPAQEDfyMAQSBrIgEkACAAQQRqKAIAIQIgACgCACIDKAIAIQAgA0EANgIAIAAoAgwhAyAAQQA2AgwCQCADDQAgAUEANgIYIAFBATYCDCABQbCMngE2AgggAUIENwIQIAFBCGpBqL+cARDpIwALIAMRAQAhACACKAIAIgMgADYCBCADQQE2AgAgAUEgaiQAQQELlwEBA38jAEEQayICJAAgASgC2AEhAwJAAkAgASgCiAEiBEGAgIDAAHFFDQAgASAEQf///79/cTYCiAEgAkEIaiADIAEQyAQgAigCCCEDIAEgASgCiAFBgICAwAByNgKIASACKAIMIQEM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QCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAQSBqEPUSCyAAQShBCBCzFguJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABCeAwwDCyABIAAoAgAQngMMAgsgACABEMEPDAELIAAgARDbEgsgAEEoaiEAIAJBWGoiAg0ACwsLhwEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQVAwDCyABIAAoAgAQVAwCCyAAIAEQwg8MAQsgACABENwSCyAAQShqIQAgAkFYaiICDQALCwuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIABBBGooAgAgARC+AwwDCyAAKAIAIAEQvgMMAgsgACABEMMPDAELIAAgARDdEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQgCcMAwsgASAAKAIAEIAnDAILIAAgARChDwwBCyAAIAEQ3hILIABBKGohACACQVhqIgINAAsLC4ABAgF/An4CQCAAKQMAIgJCA4NCAFINACACpykDCCECCyAAKAIIIQECQCAAKQMQIgNCA4NCAFINACADpykDCCEDCyACp0Hdy92eeWwgAkIgiKdqQd3L3Z55bCABakHdy92eeWwgA6dqQd3L3Z55bCADQiCIp2pB3cvdnnlsQQ93rQuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIABBBGooAgAgARCkAgwDCyAAKAIAIAEQpAIMAgsgACABEMQPDAELIAAgARDfEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQpwEMAwsgASAAKAIAEKcBDAILIAAgARCjDwwBCyAAIAEQ4BILIABBKGohACACQVhqIgINAAsLC4kBAQF/AkAgACgCCCICRQ0AIAJBKGwhAiAAKAIEQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEOYBDAMLIAEgACgCABDmAQwCCyAAIAEQxQ8MAQsgACABEOESCyAAQShqIQAgAkFYaiICDQALCwuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABDRAQwDCyABIAAoAgAQ0QEMAgsgACABEMYPDAELIAAgARDiEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQqgEMAwsgASAAKAIAEKoBDAILIAAgARDHDwwBCyAAIAEQ4xILIABBKGohACACQVhqIgINAAsLC4UBAQN/IwBBEGsiAyQAAkAgAC0AAEEBRg0AIANBCGogACgCBCIEKAIAIAAtAAFBAUYQ0yYCQCADQQhqENEmIgUNACAAQQI6AAEgBCgCACABIAIQhyMiBQ0AIANBBDoACCADQQhqENEmIQULIANBEGokACAFDwtBoKacAUEoQZjPmwEQ0h4AC4kBAQJ/IwBBEGsiBCQAAkACQCABKAKIASIFQYAgcQ0AIAEgBUGAIHI2AogBIAQgAiADIAEQxxIgBCgCACECIAEgASgCiAFB/19xNgKIASAEKAIEIQEMAQsgBEEIaiACIAMgARDHEiAEKAIMIQEgBCgCCCECCyAAIAI2AgAgACABNgIEIARBEGokAAuOAQEBfyMAQSBrIgMkACADQQhqQQhqIAFBCGopAgA3AwAgAyABKAIQNgIYIAMgASkCADcDCAJAAkAgAigCiAEiAUGAgICAAXENACACIAFBgICAgAFyNgKIASAAIANBCGogAhC8KCACIAIoAogBQf////9+cTYCiAEMAQsgACADQQhqIAIQvCgLIANBIGokAAuOAQEBfyMAQSBrIgMkACADQQhqQQhqIAFBCGopAgA3AwAgAyABKAIQNgIYIAMgASkCADcDCAJAAkAgAigCiAEiAUGAgICAAXENACACIAFBgICAgAFyNgKIASAAIANBCGogAhC9KCACIAIoAogBQf////9+cTYCiAEMAQsgACADQQhqIAIQvSgLIANBIGokAAuMAQEDfyMAQRBrIgIkAAJAAkAgASgCiAEiA0HAgAZxQcCABkYNACABIANBwIAGcjYCiAEgAkEIaiABEMIYIAIoAgghBCABIAEoAogBIANBv/95cnE2AogBIAIoAgwhAQwBCyACIAEQwhggAigCBCEBIAIoAgAhBAsgACAENgIAIAAgATYCBCACQRBqJAALhwEBAn8jAEEQayICJAAgASgCACEDIAFBADYCAAJAAkAgAyABKAIEEOImIgEQ1SwNACACQQhqIAEQlhZBASEBAkACQCACLQAIQQFHDQAgACACKAIMNgIEDAELIAAgAi0ACToAAUEAIQELIAAgAToAAAwBCyAAQYAEOwEAIAEQ3CoLIAJBEGokAAt1AQF+AkACQCABrSACrX4iA0IgiKcNACADpyIBQXhLDQAgAUEHakF4cSIBIAJBCGpqIgIgAUkNAQJAIAJB+P///wdLDQAgACABNgIIIAAgAjYCBCAAQQg2AgAPCyAAQQA2AgAPCyAAQQA2AgAPCyAAQQA2AgALjgECA38BfiMAQSBrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCECECIANBADYCEAJAIAINACABQQA2AhggAUEBNgIMIAFBsIyeATYCCCABQgQ3AhAgAUEIakGov5wBEOkjAAsgAhECACEEIAAoAgQiAygCACkDABCrHyADKAIAIAQ3AwAgAUEgaiQAQQELeAECfyMAQRBrIgUkACAFQQhqIAIgAyAEIAIoAgARDQAgBSgCDCECIAUoAgghAyABIAEoAgBBAWoiBkF/IAYbNgIAIAFBfyABKAIEIgYgAiAEIANBAXEbaiIEIAQgBkkbNgIEIAAgAjYCBCAAIAM2AgAgBUEQaiQAC4IBAQN/IwBBEGsiAiQAIAAoAgAhA0EAIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEA0AgAiADIABqNgIMIAJBBGogAkEMakGnARDDCyEBIABBAWoiAEGAAkcNAAsgARClIyEAIAJBEGokACAAC4EBAQF/IwBBEGsiBCQAAkACQCADDQBBACEADAELIAQgABCNDyIAIAIgAxDFEwJAIAEoAggiAyABKAIARw0AIAFBkM6DARCYHAsgASADQQFqNgIIIAEoAgQgA0EEdGoiASAEKQIANwIAIAFBCGogBEEIaikCADcCAAsgBEEQaiQAIAALgQEBAX8gACgCCCIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAIIIABBDGooAgAQ7hILIAAoAhAiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCEBCeEQsCQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBFEEEELMWCwuEAQEEfwJAIAAtADRFDQAgAC0AOSECIAAtADohAwJAIAEoAggiBEUNACABKAIEIQEgBEECdCEEA0ACQCAALQA0QQFHDQAgASgCACEFIABBgQI7ADkgBSAAEMEBIABBgQI7ADkLIAFBBGohASAEQXxqIgQNAAsLIAAgAzoAOiAAIAI6ADkLC4cBACAAQQA2AjggAEIANwIwIABBADYCFCAAQoCAgIDAADcCDCAAQgA3AjwgACABKQIANwIAIAAgAikCADcCGCAAQcQAakEAOwEAIABBCGogAUEIaigCADYCACAAQSBqIAJBCGopAgA3AgAgAEEoaiACQRBqKQIANwIAQQBBCBCdLUEAQQQQnC0LfwECfwJAIAAoAgAiAkEDRw0AIAEgACgCEBDmAQJAIAAoAgwiAkUNACACQQR0IQMgACgCCEEMaiECA0AgASACKAIAEOYBIAJBEGohAiADQXBqIgMNAAsLIABBIGoQgyMPCyABIAAoAiAQ5gECQCACQQJJDQAgASAAKAIEEOYBCwt5AQN/QQAhAQJAIAAtAEUiAkEDRg0AIABBIGohAAJAIAJBAkYNAANAIAAoAiAiAC0AJUECRw0ACwsgACgCCCICRQ0AIAAoAgQhACACQThsQUhqIQIDQCAAEMoOIgENASAAQThqIQAgAiEDIAJBSGohAiADDQALCyABC4wBAAJAAkACQAJAAkACQAJAIAAoAgAOBwABAwQFAgYACyAAQQA6ABwgAEEgahC5Iw8LIABBBGogARDqGiAAQQA6ABwLDwsgACgCBCABEJATIABBGGoQuSMPCyAAQQRqIAEQgw8gAEEAOgAcDwsgACgCBCABEJATIAEgACgCCBDmAQ8LIAEgACgCBBDmAQuEAQECfyMAQTBrIgEkAAJAAkAgACgCACICDQBBACEAQQAhAgwBCyABIAI2AiQgAUEANgIgIAEgAjYCFCABQQA2AhAgASAAKAIEIgI2AiggASACNgIYIAAoAgghAkEBIQALIAEgAjYCLCABIAA2AhwgASAANgIMIAFBDGoQsSQgAUEwaiQAC4YBAQJ/IwBBEGsiAyQAAkACQCABKAKIASIEQYACcUUNACABIARB/31xNgKIASADQQhqIAIgARD3AiADKAIIIQIgASABKAKIAUGAAnI2AogBIAMoAgwhAQwBCyADIAIgARD3AiADKAIEIQEgAygCACECCyAAIAI2AgAgACABNgIEIANBEGokAAuGAQECfyMAQRBrIgMkAAJAAkAgASgCiAEiBEGAAnFFDQAgASAEQf99cTYCiAEgA0EIaiACIAEQ7AIgAygCCCECIAEgASgCiAFBgAJyNgKIASADKAIMIQEMAQsgAyACIAEQ7AIgAygCBCEBIAMoAgAhAgsgACACNgIAIAAgATYCBCADQRBqJAALhgEBAn8jAEEQayIDJAACQAJAIAEoAogBIgRBgAJxRQ0AIAEgBEH/fXE2AogBIANBCGogAiABEO4CIAMoAgghAiABIAEoAogBQYACcjYCiAEgAygCDCEBDAELIAMgAiABEO4CIAMoAgQhASADKAIAIQILIAAgAjYCACAAIAE2AgQgA0EQaiQAC4kBAQJ/IwBBEGsiAyQAAkACQCACKAKIASIEQYCAEHFFDQAgAiAEQf//b3E2AogBIANBCGogASACEMoeIAMoAgghASACIAIoAogBQYCAEHI2AogBIAMoAgwhAgwBCyADIAEgAhDKHiADKAIEIQIgAygCACEBCyAAIAE2AgAgACACNgIEIANBEGokAAuJAQECfyMAQRBrIgMkAAJAAkAgAigCiAEiBEGAgBBxRQ0AIAIgBEH//29xNgKIASADQQhqIAEgAhDLHiADKAIIIQEgAiACKAKIAUGAgBByNgKIASADKAIM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IgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC3UCAn8BfgJAIAApAxAiA1ANACADQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsCQCAAKQMAIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCwuCAQECfyMAQRBrIgIkAAJAAkAgASgCiAEiA0GAwABxDQAgASADQYDAAHI2AogBIAIgARBfIAIoAgAhAyABIAEoAogBQf+/f3E2AogBIAIoAgQhAQwBCyACQQhqIAEQXyACKAIMIQEgAigCCCEDCyAAIAM2AgAgACABNgIEIAJBEGokAAuBAQECfyMAQRBrIgIkAAJAAkAgASgCiAEiA0HAAHENACABIANBwAByNgKIASACIAEQwhggAigCACEDIAEgASgCiAFBv39xNgKIASACKAIEIQEMAQsgAkEIaiABEMIYIAIoAgwhASACKAIIIQMLIAAgAzYCACAAIAE2AgQgAkEQaiQAC4EBAQJ/IwBBEGsiAiQAAkACQCABKAKIASIDQcAAcQ0AIAEgA0HAAHI2AogBIAIgARD/CSACKAIAIQMgASABKAKIAUG/f3E2AogBIAIoAgQhAQwBCyACQQhqIAEQ/wkgAigCDCEBIAIoAgghAwsgACADNgIAIAAgATYCBCACQRBqJAALhAEBAn8jAEEQayIDJAAgA0EMaiABQQxqKAIANgIAIAMgASgCADYCACADIAEpAgQ3AgQCQAJAIAIoAogBIgFBgJyAgAJxIgRFDQAgAiABQf/j//99cTYCiAEgACADIAIQpxMgAiACKAKIASAEcjYCiAEMAQsgACADIAIQpxMLIANBEGokAAt8AQJ/IwBBMGsiASQAIAEgADYCDAJAIAAtAABBAkkNACABQQE2AhQgAUG0xoMBNgIQIAFCATcCHCABQZMBNgIsIAEgAUEoajYCGCABIAFBDGo2AiggAUEQakGox4MBEOkjAAsgACgCBCECIABBDEEEELMWIAFBMGokACACC30AAkAgBCgCAEGAgICAeEcNACAELQAEIQQgACABIAIQjBQgACAEQQNqOgAkIAAgAykCADcCDCAAQRRqIANBCGopAgA3AgAgAEEcaiADQRBqKQIANwIADwsgAEGAgICAeDYCACAAIAQpAgA3AgQgAEEMaiAEQQhqKQIANwIAC3IBAn8jAEEgayIBJAACQAJAIAAoAjBBAkcNACAAQTRqIQIMAQsgASAANgIIIAEgAEE0aiICNgIMIAEgAUEfajYCGCABIAFBDGo2AhQgASABQQhqNgIQIABBMGogAUEQakHs5ZgBELoGCyABQSBqJAAgAguQAQICfwF8IwBBkAFrIgIkAAJAAkAgASsDACIERAAAAAAAAAAAYQ0AAkACQCAEvUL///////////8Ag0L/////////9/8AVQ0AIAJBDGohASAEIAJBDGoQ+wEhAwwBCyACIAQQtB8gAigCBCEDIAIoAgAhAQsgACABIAMQuhkMAQsgACABEOsTCyACQZABaiQAC3gBBH8jAEEQayICJAAgAkEIakEAQQAgASgCCCIDQbyvmwEQ2x8gAigCDCEEIAEgAigCCCIFNgIIIAAgBDYCDCAAIAE2AgggACADIARrNgIQIAAgASgCBCIBIARB2ABsajYCBCAAIAEgBUHYAGxqNgIAIAJBEGokAAt2AQJ/IwBBEGsiBCQAIARBCGogAiADIAEoAggiBUG8r5sBENsfIAQoAgwhAyABIAQoAggiAjYCCCAAIAM2AgwgACABNgIIIAAgBSADazYCECAAIAEoAgQiASADQTBsajYCBCAAIAEgAkEwbGo2AgAgBEEQaiQAC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANB+LKbATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQZCzmwFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANBoLObATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQbizmwFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC3oCAX8BfiMAQRBrIgUkAAJAAkACQCAEQYA8cUGAPEcNACADRQ0BIAVBCGogASACQQEQiwIgBS0ACEEERg0BIAUpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgAEEEOgAADAELQaCmnAFBKEG4/JgBENIeAAsgBUEQaiQAC44BAQF/QQEhAQJAAkACQAJAAkACQAJAIAAoAgAOCAAEAQMGBgIFAAsgAC0AJCEBDAULIAAoAgQtABghAQwECyAAKAIELQAsIQEMAwtBACEBDAILQQEhASAALQAkDQEgACgCICgCGEGAgICAeEYhAQwBC0EBIQEgACgCBCIALQBQDQAgACgCACEBCyABQQFxC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANB5IecATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQfyHnAFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC4YBAQF/IwBBIGsiAiQAIAJBADYCCCACQoCAgIAQNwIAIAJBvMGAATYCECACQqCAgIAONwIUIAIgAjYCDAJAIAEgAkEMahDVH0UNAEGMrJwBQTcgAkEfakHUwYABQZCtnAEQ6hIACyAAIAIpAgA3AgAgAEEIaiACQQhqKAIANgIAIAJBIGokAAuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQbzBgAE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQjh5FDQBBjKycAUE3IAJBH2pB1MGAAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkGoyIABNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEI4eRQ0AQYysnAFBNyACQR9qQcDIgAFBkK2cARDqEgALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC4sBAQJ/IwBBEGsiAiQAIAAoAgAhACABKAIAQYu5gwFBCCABKAIEKAIMEQsAIQMgAkEAOgANIAIgAzoADCACIAE2AgggAkEIakGEl4IBQQRB/JaCAUHKABC9CUGMlpsBQQRBoJeCAUHKABC9CUGbuYMBQQkgAEEoakHLABC9CRCUFSEBIAJBEGokACABC4gBAQF/IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKAIADgMAAQIACyABKAIAQZ35gwFBAiABKAIEKAIMEQsAIQEMAgsgASgCAEGf+YMBQQMgASgCBCgCDBELACEBDAELIAIgAEEEajYCDCABQaL5gwFBByACQQxqQa4BEP8LIQELIAJBEGokACABC4EBAQR/IwBBEGsiAiQAQQAhAwJAIAEoAgQiBCgCfCIFQYCAgMAASQ0AAkAgARCHDkUNAEEBIQMMAQsgBCgCfCIFQYCAgMAASQ0AIAIgBa03AwhBxIicAUErIAJBCGpBuIOEAUHkhIQBEOoSAAsgACAFNgIEIAAgAzYCACACQRBqJAALeQECfwJAIAAoAggiASAAKAIARw0AIAAQshwLIAAgAUEBajYCCCAAKAIEIAFBDGxqIgJBADYCCCACQoCAgIDAADcCAAJAIAAoAhQiAiAAKAIMRw0AIABBDGoQsxwLIAAgAkEBajYCFCAAKAIQIAJBAnRqQQA2AgAgAQuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQdj7hwE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQ1ixFDQBBjKycAUE3IAJBH2pB8PuHAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALewEBfyMAQRBrIgMkACADIAI2AgwgAyABKAIAQQhqQfjymAEQgCIgAygCBCECAkACQCADKAIAIANBDGoQywoiAUUNACAAIAFBBGooAgAgAUEIaigCABC8CgwBCyAAQYCAgIB4NgIACyACIAIoAgBBf2o2AgAgA0EQaiQAC3sBAX8jAEEQayIDJAAgAyACNgIMIAMgASgCBEEIakHo85gBEIAiIAMoAgQhAgJAAkAgAygCACADQQxqEMsKIgFFDQAgACABQQRqKAIAIAFBCGooAgAQvAoMAQsgAEGAgICAeDYCAAsgAiACKAIAQX9qNgIAIANBEGokAAtzAgN/AX4jAEEgayIBJAAQhCghAiAALQAUIQMgACkCDCEEIAFBCGogABDJBSACIAEpAgg3AgAgASAENwIUIAJBCGogAUEIakEIaikCADcCACABIAM6ABwgAkEQaiABQQhqQRBqKQIANwIAIAFBIGokACACC3cCAX8BfgJAAkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsg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RQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARDZJwwDCyAAQQRqIAEQlS8MAgsgAEEEaiABEJ4vDAELIABBBGogARD4EwsgAEEoaiEAIAJBWGohAgwACwsLZQEDf0EAIQMCQCABRQ0AA0ACQCABQQFLDQAgACADQQxsaigCACIBIAJGDQIgAyABIAJJaiEDDAILIAMgAUEBdiIEIANqIgUgACAFQQxsaigCACACSxshAyABIARrIQEMAAsLIAMLdgEBfyAAKAIIQThsIQIgACgCBCEAA0ACQAJAIAJFDQACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABENInIABBKGogARC0LwwDCyAAQTBqIAEQwCoMAgsgAEEEaiABEIcwDAELDwsgAEE4aiEAIAJBSGohAgwACwt6AQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgAEEEaiABENsnDAMLIABBBGogARCTLwwCCyAAQQRqIAEQoC8MAQsgAEEEaiABEPsTCyAAQShqIQAgAkFYaiECDAALCwt6AQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgAEEEaiABENonDAMLIABBBGogARCULwwCCyAAQQRqIAEQny8MAQsgAEEEaiABEPwTCyAAQShqIQAgAkFYaiECDAALCwtuAQJ/IAAoAiAhAiAAKAIcIQMCQAJAIAAoAgBBAUcNACACQTBsIQADQCAARQ0CIAEgAxDcJyAAQVBqIQAgA0EwaiEDDAALCyACQThsIQADQCAARQ0BIAMgARCfIiAAQUhqIQAgA0E4aiEDDAALCwuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQeSrnAE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQ9C5FDQBBjKycAUE3IAJBH2pB/KucAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALdQEDfyMAQRBrIgMkACADQQRqIAJBAUEBEJUPIAMoAgghBAJAIAMoAgRBAUYNACADKAIMIQUCQCACRQ0AIAUgASAC/AoAAAsgACACNgIIIAAgBTYCBCAAIAQ2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ACgCABCjLSABQRxBBBCzFg8LIAFBBGoiACgCACABQQhqKAIAEKweIAEoAgAgACgCABCjLSABQRhBBBCzFgtsAQN/IwBBEGsiAiQAIAJBCGogASgCDBDJAyACKAIMIQMCQAJAIAEoAgBBAUYNACACKAIIIQEMAQsgASgCBCIEIAMgBCADSRshASAEIAMgBCADSxshAwsgACABNgIAIAAgAzYCBCACQRBqJAALbAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCEHAsgACADQQFqNgIIIAAoAgQgA0EFdGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgAgAEEYaiABQRhqKQIANwIAC28BAX8CQCAAKAIIIgIgACgCAEcNACAAQbDMgAEQxx0LIAAgAkEBajYCCCAAKAIEIAJBBXRqIgAgASkDADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDAAtvAQF/AkAgACgCCCICIAAoAgBHDQAgAEHsyYABEMcdCyAAIAJBAWo2AgggACgCBCACQQV0aiIAIAEpAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwALcQEDfyMAQRBrIgMkACADQQRqIAIQrRIgAygCCCEEAkAgAygCBEEBRg0AIAMoAgwhBQJAIAJFDQAgBSABIAL8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAAPCyAEIAMoAgxBwLycARCOKQALbQEBfyMAQSBrIgUkAAJAIAIgA08NACAFQQA2AhggBUEBNgIMIAVB0JmcATYCCCAFQgQ3AhAgBUEIaiAEEOkjAAsgACADNgIEIAAgATYCACAAIAIgA2s2AgwgACABIANBAnRqNgIIIAVBIGokAAttAQF/IwBBIGsiBSQAAkAgAiADTw0AIAVBADYCGCAFQQE2AgwgBUHQmZwBNgIIIAVCBDcCECAFQQhqIAQQ6SMACyAAIAM2AgQgACABNgIAIAAgAiADazYCDCAAIAEgA0ECdGo2AgggBUEgaiQAC20BAX8jAEEgayIFJAACQCACIANPDQAgBUEANgIYIAVBATYCDCAFQdCZnAE2AgggBUIENwIQIAVBCGogBBDpIwALIAAgAzYCBCAAIAE2AgAgACACIANrNgIMIAAgASADQQJ0ajYCCCAFQSBqJAALaAEDfwJAIAEgACgCCCICTQ0AIAAgASACayIDEIMlIANBf2ohASAAKAIEIAAoAggiBEECdGohAgJAA0AgAkEANgIAIAFFDQEgAUF/aiEBIAJBBGohAgwACwsgBCADaiEBCyAAIAE2AggLbAECf0EAIQNBACEEAkACQCACRQ0AIAJBf2oiBCABTw0BIAAgBGotAABB2LSEAWotAAAhBAsCQCACIAFPDQAgACACai0AAEHYtIQBai0AACEDCyAEIANzQX9zQQFxDwsgBCABQbithAEQkRUAC2wBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQjRwLIAAgA0EBajYCCCAAKAIEIANBHGxqIgAgASkCADcCACAAQQhqIAFBCGopAgA3AgAgAEEQaiABQRBqKQIANwIAIABBGGogAUEYaigCADYCAAtsAQF/AkAgACgCCCIDIAAoAgBHDQAgACACEI0cCyAAIANBAWo2AgggACgCBCADQRxsaiIAIAEpAgA3AgAgAEEIaiABQQhqKQIANwIAIABBEGogAUEQaikCADcCACAAQRhqIAFBGGooAgA2AgALZwEBfyMAQTBrIgQkACAEQSBqIAFCACAAQgAQ6RIgBEEQaiACQgAgAEIAEOkSIAQgBCkDKCIAIAQpAxB8IgEgBCkDGCABIABUrXwgA0H/AHFBwABzEJEWIAQpAwAhACAEQTBqJAAgAAtnAQF/IwBBMGsiBCQAIARBIGogAUIAIABCABDpEiAEQRBqIAJCACAAQgAQ6RIgBCAEKQMoIgAgBCkDEHwiASAEKQMYIAEgAFStfCADQf8AcUHAAHMQkRYgBCkDACEAIARBMGokACAAC38BAn8jAEEQayIEJABBAEEAKAK88J4BIgVBAWo2ArzwngECQCAFQQBIDQACQAJAQQAtAKDwngENAEEAQQAoApzwngFBAWo2ApzwngFBACgCxOyeAUF/Sg0BDAILIARBCGogACABEQYAAAtBAEEAOgCg8J4BIAJFDQAQxDAACwALbwIBfwF+AkACQAJAAkAgAC0ALEF9aiIBQQEgAUH/AXFBA0kbQf8BcQ4CAQIACyAAEJIUDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2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AgQgAiAANgIAIAJBAzYCDCACQdi8gAE2AgggAkICNwIUIAJBC61CIIYiAyACQQRqrYQ3AyggAiADIAKthDcDICACIAJBIGo2AhAgAkEIakGs0YQBEOkjAAt2AQJ/IwBBEGsiAiQAAkACQAJAAkAgAUIBVg0AIAGnDgIBAgELQQEhAyACQQE6AAAgAiABNwMIIAAgAkGo0oABQbDSgAEQ0xU2AgQMAgtBACEDIABBADoAAQwBCyAAQQE6AAFBACEDCyAAIAM6AAAgAkEQaiQAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcCGggE2AgggA0ICNwIUIANBC61CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEOkjAAtpAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0HghoIBNgIIIANCAjcCFCADQQutQiCGIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhDpIwALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANBlIeCATYCCCADQgI3AhQgA0ELrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQ6SMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQfiHggE2AgggA0ICNwIUIANBC61CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEOkjAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABCzFgsgBEEQaiQAC2sBAX8jAEEQayIDJAAgA0EANgIMIANCgICAgBA3AgQgA0EEaiACEIQlAkAgAkUNAANAIANBBGogARDAFyACQX9qIgINAAsLIAAgAykCBDcCACAAQQhqIANBBGpBCGooAgA2AgAgA0EQaiQAC28BAn8jAEEQayIDJAACQAJAIAEoAgAgASgCCCIETQ0AIANBCGogASAEQQRBBBC6DiADKAIIIgRB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Qb4FEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGu+5oBQRIgAkEMakHWBhD/CyEADAELIAIgAzYCCCABQdT1mgFBCyACQQhqQdcGEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUHfu5wBQQQgAkEMakH3BBD/CyEADAELIAIgAzYCCCABQfCKmwFBByACQQhqQeQGEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQhqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGYnJsBQQMgAkEMakHCBhD/CyEADAELIAIgAzYCCCABQb67nAFBBSACQQhqQfoEEP8LIQALIAJBEGokACAAC2QBAn8CQCAAQgODQgBSDQAgAKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCABQgODQgBSDQAgAaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsLdwEBfyMAQRBrIgIkACACIABBOGo2AgwgAUH5jpsBQRFB1ZybAUEEIABBkwdBtJybAUEEIABBMGpBiwJBio+bAUEFIABBPGpBlAdBj4+bAUEMIABByABqQbkFQZuPmwFBCSACQQxqQakFEKkMIQAgAkEQaiQAIAALbgECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQd+7nAFBBCACQQxqQfcEEP8LIQAMAQsgAiADNgIIIAFB2ZybAUEMIAJBCGpBlwUQ/wshAAsgAkEQaiQAIAALbwICfwF+IAApAwghAwJAAkAgACgCAA0AIANCA4NCAFINASADpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIAMgACkDGBCqFAsCQCAAKAIoIgBFDQAgABCvASAAQcAAQQgQsxYLC2cBA38jAEEQayICJAACQAJAIAEtAOABIgNBEkYNAEEAIQFBACEEIANBPkcNARDLLQALIAJBCGogAUEAQQEQ9w8gAigCCEEBcSEEIAIoAgwhAQsgACABNgIEIAAgBDYCACACQRBqJAALcQEBfwJAAkACQCAAKAIYIgINACAALQAURQ0CIAEoAhwgASgCICAAKAIMEPkTIQAMAQsgASACQQRqKAIAIAJBCGooAgAQyh8gAC0AFEEBRw0BIAEoAhwgASgCICACKAIEQX9qEOgSIQALIAEgABDdJgsLbwECfyACKAKIASIDQSBxIQQCQAJAIAENACAERQ0BIAIgA0FfcTYCiAEgACACENcBIAIgAigCiAFBIHI2AogBDwsgBA0AIAIgA0EgcjYCiAEgACACENcBIAIgAigCiAFBX3E2AogBDwsgACACENcBC2wBBX8gACgCCCEBIAAoAgQiAiEDAkADQCABRQ0BAkAgAygCACIEQYCAgIB4Rg0AIANBBGooAgAiBSADQQhqKAIAEKYjIAQgBRDjLAsgAUF/aiEBIANBIGohAwwACwsgACgCACACQQRBIBCTFQtqAQF/IABBJGohAAJAA0AgAUUNASAAQWBqIgIoAgAgAEFkaigCABChIyAAQVxqKAIAIAIoAgAQ1ywgAEFoahDXJQJAIAAoAgBBgICAgHhGDQAgABDXJQsgAUF/aiEBIABBwABqIQAMAAsLC3ABAn8CQAJAIAEoAgQiAg0AQQAhAQwBCyAAIAEoAgAiA0EQaigCACADQRRqKAIAIAJB1JGEARDAJSICKAAANgABIAEgAigABSIDNgIEIAAgAzYABiAAQQVqIAJBBGotAAA6AABBASEBCyAAIAE6AAALawEBfyMAQTBrIgIkACACQQI2AgwgAkGE6pgBNgIIIAJCAjcCFCACQQs2AiwgAkELNgIkIAIgADYCICACIABBBGo2AiggAiACQSBqNgIQIAEoAgAgASgCBCACQQhqEN8FIQAgAkEwaiQAIAALZwEDfyMAQRBrIgIkACAAIAEoAgQgASgCAGsQ+CQgACgCCCEDIAAoAgQhBAJAA0AgAkEIaiABEKkfIAItAAhFDQEgBCADaiACLQAJOgAAIANBAWohAwwACwsgACADNgIIIAJBEGokAAttAQF/IwBBMGsiAyQAIAMgAjYCBCADIAE2AgAgA0ECNgIMIANB2MWYATYCCCADQgI3AhQgA0EUNgIsIANB1AA2AiQgAyAANgIgIAMgA0EgajYCECADIAM2AiggA0EIahDWHyECIANBMGokACACC4MBAQF/AkACQAJAAkACQAJAAkAgACgC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IQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAIAMQ+CQgASAAKAIEIAAoAghqEOYNIAAgAyACajYCCAtZAQF/IwBBIGsiAiQAIAJBADYCECACQQhqIAEgAkEQahDVGyACQRRqIAIoAgggAigCDBCJGCAAQQhqIAJBFGpBCGooAgA2AgAgACACKQIUNwIAIAJBIGokAAtaAQF/IwBBMGsiAyQAIAMgATYCDCADIAA2AgggA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0EMrUIghiADQQhqrYQ3AyggAyADQShqNgIYIANBEGogAhDpIwALXQEBfyMAQSBrIgIkACACQQA6ABggAiABNgIUIAIgADYCECACQQE2AgwgAiACQQxqNgIcIAJBHGpBkNWAARABIQECQCACKAIMRQ0AIAJBEGoQ5ScLIAJBIGokACABC5ABACAAQcgAakH4ABDyFSAAQdQAakEhEPIVIABB4ABqQT4Q8hUgAEL8gICA4As3AkAgAEL8gICAwA83AjggAELbgICA0As3AjAgAEKngICA4As3AiggAEKugICAgAw3AiAgAEKsgICA4A43AhggAELegICA4Ac3AhAgAEKrgICAoAc3AgggAEKtgICAwA83AgALWgECfwJAIAAoAgwiAyAAKAIAIgRHDQAgACACELsOIAAoAgAhBCAAKAIMIQMLIAAgA0EBajYCDCAAKAIEIAAoAgggA2oiAEEAIAQgACAESRtrQQJ0aiABNgIAC2YBAX8jAEEQayICJAAgAiAAQYICajYCDCABQbmXgAFBDkGtl4ABQQcgAEEsQZyXgAFBBSAAQYACakEqQbSXgAFBBSAAQYECakEqQceXgAFBBSACQQxqQSQQ4wwhACACQRBqJAAgAAthAQJ/AkAgAigCACABKAIAIAFBfGoiAygCABDfIUUNACABKAIAIQQCQANAIAMiAUEEaiABKAIANgIAIAEgAEYNASACKAIAIAQgAUF8aiIDKAIAEN8hDQALCyABIAQ2AgALC2QBAX8jAEEQayICJAAgAiAAQRRqNgIMIAFBtLmDAUEJQZO5gwFBCCAAQQxqQTBB0buDAUEHIABBxABB2LuDAUEIIABBEGpBIUHgu4MBQQkgAkEMakEzEOMMIQAgAkEQaiQAIAALVwEBfyMAQRBrIgUkAAJA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IgRLDQACQCADIARJDQBBASECIAFBAToAAAwBC0EBIQIgASADQQFqOgABCyAAIAM6AAEgACACOgAAC10BAX9BASEDAkACQCABQf8BcUEBRg0AIAFBASACKAIIGyEDDAELIAJBADYCCCACQQRBBBCSHiACEKsMCyAAIAM6AAwgACACKQIANwIAIABBCGogAkEIaigCADYCAAtdAQR/IwBBEGsiAyQAIANBCGogAkHAvJwBEMsYIAMoAgghBCADKAIMIQUCQCACQQJ0IgZFDQAgBSABIAb8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAALYwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQNGDQAgAiAANgIMIAFBgbCcAUEEIAJBDGpB/QAQ/wshAQwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQYGwnAFBBCACQQxqQf8AEP8LIQEMAQsgASgCAEH9r5wBQQQgASgCBCgCDBELACEBCyACQRBqJAAgAQtlAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQdgAajYCDCABQbjbgwFBCkGNuIQBQQYgAEEIakGHAUH4mZsBQQUgAEHMAGpBiAFBwtuDAUELIAJBDGpBiQEQpg0hACACQRBqJAAgAAtjAQF/IwBBEGsiAiQAIAIgASgCAEH+2oMBQQcgASgCBCgCDBELADoACCACIAE2AgQgAkEAOgAJIAJBADYCACACIAAoAgA2AgwgAiACQQxqQbYBENULEKwRIQEgAkEQaiQAIAELYgECfyAAKAIAIAAoAgQQ3ywgACgCECIBIAAoAhQQpyMgACgCDCABEOMsIAAoAhggACgCHBDfLAJAIAAoAigiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgAEEoahDQEgsLYAEBfyMAQRBrIgIkAAJAAkAgACgCAEEBRw0AIAIgAEEEajYCDCABQYGwnAFBBCACQQxqQTMQ/wshAAwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQALIAJBEGokACAAC2MBAX8jAEEQayICJAAgAiABKAIAQebZgwFBCSABKAIEKAIMEQsAOgAIIAIgATYCBCACQQA6AAkg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ACAFNgIEIAAgBDYCACADQRBqJAALVQECfyMAQRBrIgQkACAEQQA2AgwgBCADIARBDGoQ3BEgASACIAQoAgAgBCgCBCIDEOolIQUgACACIANrNgIEIAAgASADakEAIAUbNgIAIARBEGokAAtdAQJ/AkACQAJAIAEoAgAiAiABKAIERw0AQQAhAgwBCyABIAJBCGo2AgAgASgCCCIDIAEoAgxPDQEgASADQQFqNgIICyAAIAI2AgQgACADNgIADwtB4NqDARDSLAALYAEBfyMAQRBrIgIkACAAKAIAIQAgAiABKAIAQajBgwFBCyABKAIEKAIMEQsAOgAMIAIgATYCCCACQQA6AA0gAkEANgIEIAJBBGogAEGqARDVCxCsESEBIAJBEGokACABC1oBAX9BASEDAkAgAiABRg0AAkACQAJAIAIgAU8NACAAIAJqIgEtAABBdmoOBAIBAQMBCyACIAFBqK2EARCRFQALQQAPCyACRQ0AIAFBf2otAABBDUchAwsgAwthAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBFDQAgAiAANgIMIAFBgbCcAUEEIAJBDGpBuAEQ/wshAQwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQELIAJBEGokACABC1MAIAAoAgxBDGwgACgClAFBA3RqIAAoAkQgACgCOGogACgCVGogACgCYGpBAnRqIAAoAqQBaiAAKAJoaiAAKAKIASAAKAJ8aiAAKAKYAWpBAnRqC14BAX8jAEEQayICJAACQCABKAIgRQ0AQcyghAEQ0hoACyABQX82AiAgAkEANgIMIAJCgICAgMAANwIEIAAgAUEkaiACQQRqEIQfIAEgASgCIEEBajYCICACQRBqJAALUwACQAJAIAFFDQACQAJAIAMgAUsNACADIAFHDQEMAgsgAiABaiwAAEG/f0oNAQtBACECDAELIAIgAWohAiADIAFrIQELIAAgATYCBCAAIAI2AgALXAEDfyMAQRBrIgMkACADQQhqIAJBAUEBQcC8nAEQsBkgAygCCCEEIAMoAgwhBQJAIAJFDQAgBSABIAL8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAALXAEDfyMAQRBrIgMkACADQQhqIAJBAUEBQcC8nAEQsRkgAygCCCEEIAMoAgwhBQJAIAJFDQAgBSAB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IQEMAQsgACABEO0JDwsgACABIAIQwBgLWAICfwJ+IwBBEGsiAiQAIAEoAtgBIQMgAiABEMgRIAEQoQsgAikDACEEIAIpAwghBSAAIAM2AgggACAFNwMQIAAgBDcDACAAIAEoAtQBNgIMIAJBEGokAAtUAQJ/AkAgAEH/AXFBA0cNACABKAIAIQICQCABKAIEIgAoAgAiA0UNACACIAMRAwALAkAgACgCBCIDRQ0AIAIgAyAAKAIIELMWCyABQQxBBBCzFgsLTwEDfyMAQRBrIgIkAEEAIQNBACEEAkAgASgCAEECRg0AIAJBCGogARDFFCACKAIMIQMgAigCCCEECyAAIAM2AgQgACAENgIAIAJBEGokAAtPAQN/IwBBEGsiAiQAQQAhA0EAIQQCQCABKAIAQQdGDQAgAkEIaiABEK4PIAIoAgwhAyACKAIIIQQLIAAgAzYCBCAAIAQ2AgAgAkEQaiQAC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARDtCQ8LIAAgASACELoZC0sBA38jAEEQayICJAAgAkEIaiABKAIAEMkDIAAgAigCDCIDIAEoAgwiBCADIARJGyADIAQgAyAESxsQyh8gASAAEJUvIAJBEGokAAtQAQF/AkADQCAALQAlQQJGDQEgACgCICEADAALCyAAKAIIQThsIQIgACgCBCEAAkADQCACRQ0BIAAgARCfIiACQUhqIQIgAEE4aiEADAALCwtQAQF/AkADQCAALQAlQQJGDQEgACgCICEADAALCyAAKAIIQThsIQIgACgCBCEAAkADQCACRQ0BIAAgARCrESACQUhqIQIgAEE4aiEADAALCwtPAQJ/EPIoGiABKAIIQThsIQIgASgCBCEBAkADQCACRQ0BIAEgABCOFgJAIAEoAjAiA0UNACADIAAQ+AMLIAFBOGohASACQUhqIQIMAAsLC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARDtCQ8LIAAgASACEMQYC0oBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASAAQQFqIQAg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IgBBgYCAgHhGDQAgACABKAIMQYzsmAEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQRgQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQbjemAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQZz2mAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfz1mAEQjikACyABQRBqJAALSQEBfyMAQRBrIgUkACAFQQhqIAAgASACIAMgBBD7CAJAIAUoAggiBEGBgICAeEYNACAEIAUoAgxBxISeARCOKQALIAVBEGokAAtHACAAKQMIIAApAxgQpi4CQCAALQA0QQNGDQAgAEEgahCJIgsgAEE4ahDlKQJAIAAoAjwiAEUNACAAEPwqIABBFEEEELMWCwtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBOBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBsNSbARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBCBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjNubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBDBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjPCbARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQRBEBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBOBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBxNibARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBKBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBOBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtIAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhB0AAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTAQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRAQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfienAEQjikACyABQRBqJAALSAEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQcAAEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0cBAX8jAEEQayICJAAgAkEIaiAAIAAoAgBBCEEgEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0sBAX8jAEEQayIBJAAgAUEIaiAAIAAoAgBBCEHYABCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB9N+bARCOKQALIAFBEGokAAtIAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhB2AAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQSgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdjgmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQwQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdDemwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQSgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQeTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdDemwEQjikACyABQRBqJAALSAEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQcgAEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0sBAX8jAEEQayIBJAAgAUEIaiAAIAAoAgBBCEHAABCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjLecARCOKQALIAFBEGokAAtCAQF/IwBBEGsiAiQAAkAgAUUNACACQQRqQQxBCCABQQFqENoRIAAgAigCDGsgAigCBCACKAIIEJMpCyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQYCumgEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQTAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEEQQQQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfibmwEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQRAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALRgADQAJAAkACQCAALQAlQQJGDQAgAC0AJEUNAiABLQA0DQIMAQsgASAAEIoECw8LIAEgAEEIakEAEIEQIAAoAiAhAAwACwtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBPBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB7IKbARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBGBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB+JubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBEBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB/NqbARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBOBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBBBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBgOubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBBBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBqOebARCOKQALIAFBEGokAAtHAQJ/AkACQCABKAIYDQBBACEBDAELIAEQqBMhAiABIAEoAhhBf2o2AhggAkF4aiEDIAJBaGohAQsgACADNgIEIAAgATYCAAtEAQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQCAAKAIAQQdGDQAgACABEK4aCyAAQShqIQAgAkFYaiECDAALCwtEAQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQCAAKAIAQQdGDQAgACABEI4WCyAAQShqIQAgAkFYaiECDAALCwtHAQF/AkBBCEHAABD/KyIBDQAACyABQRY2AgAgASAAKQIANwIEIAFBDGogAEEIaikCADcCACABQRRqIABBEGooAgA2AgAgAQtIAgF/AX4gACABIAEpAwBCfnwiA0ICIANCAlQbp0ECdCICQZzfngFqKAIAaigCADYCBCAAIAEgAkGQ354BaigCAGooAgA2AgALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQaSFnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdiEnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcyUnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoC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+AMgAkF8aiECIAFBBGohAQwACwsLPwACQAJAAkAgACgCAA4CAQIACyAAQQRqEK4sDwsgAEEIahC9HSAAQShqELUqDwsgAEEQahC6KyAAQTBqELcrC0ABAX8CQAJAAkAgAC0ALEF9aiICQQEgAkH/AXFBA0kbQf8BcQ4DAAECAAsgASAAEKsIGg8LIABBGGogARC0JAsLPAACQCABaUEBRw0AIABBgICAgHggAWtLDQACQCAARQ0AQQAtAKDxngEaIAAgARChJyIBRQ0BCyABDwsAC0QBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEIsODwsgAC0AACABEKwSDwsgACABEO4RCz0BAX8jAEEQayIHJAAgB0EIaiABLQAAIAMgBBDmByAHKAIMIQEgACAHKAIINgIAIAAgATYCBCAHQRBqJAALPQEDfwJAIAEtAAQiAiABLQAFIgNPDQAgASACQQFqOgAEIAEgAmotAAAhBAsgACAEOgABIAAgAiADSToAAAs/AQJ/AkACQCABKAIAIgIgASgCBCIDRw0ADAELIAEgAkEBajYCACACLQAAIQELIAAgAToAASAAIAIgA0c6AAALQQEBfyABIAEoAggiBEEBajYCCAJAIARBAEgNACAAIAE2AgwgACADNgIIIAAgAjYCBCAAQbjZgAE2AgAPCxC3MAALOAECfwJAIABQDQAgAEIDg1BFDQAgAKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsLPAEBfyMAQRBrIgMkACADQQA2AgwgAyACIANBDGoQ3BEgACABIAMoAgAgAygCBBDqJSECIANBEGokACACC0QBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEIsODwsgAC0AACABEKwSDwsgACABEO4RCzsAAkAgAiAAIANB/wFxai0AQGoiAyAAKAIIIgJJDQAgAyACQaC6gwEQkRUACyAAKAIEIANBAnRqKAIAC0ABA38CQCABKAIUIgIgASgCDCIDTw0AIAEoAgggAmotAAAhBAsgACAEOgAJIAAgAiADSToACCAAIAEpAgA3AgALPAECfyAAIAIQkyUgACgCCCEDAkAgAkEDdCIERQ0AIAAoAgQgA0EDdGogASAE/AoAAAsgACAD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AkE4bCECA0AgACABEMQeIABBOGohACACQUhqIgINAAsLCzkBAX8CQCAAKAIIIgJFDQAgACgCBCEAIAJBMGwhAgNAIAAgARClBCAAQTBqIQAgAkFQaiICDQALCws/AgF/AX4CQEHo6p4BQejqngEQmBYpAwAiAUIDg0IAUg0AIAGnIgAgACgCACIAQQFqNgIAIABBf0oNAAALIAELOQEBfwJAIAAoAggiAkUNACAAKAIEIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLCzkBAX8CQCAAKAIIIgJFDQAgACgCBCEAIAJBMGwhAgNAIAAgARCoBCAAQTBqIQAgAkFQaiICDQALCws5AQF/AkAgACgCCCICRQ0AIAAoAgQhACACQTBsIQIDQCAAIAEQmgQgAEEwaiEAIAJBUGoiAg0ACwsLQgECf0EBIQECQAJAAkAgAC0A4AEiAkF9ag4EAgEBAAELIAAQoQtBASEBDAELIAJBowFGIAAtAOEBciEBCyABQQFxC0QBAX8CQCABKAKIASICQYCABHFFDQAgASACQf//e3E2AogBIAAgARCTASABIAEoAogBQYCABHI2AogBDwsgACABEJMBC0oBAX8CQCABKAKIASICQYCAgIACcUUNACABIAJB/////31xNgKIASAAIAEQmiQgASABKAKIAUGAgICAAnI2AogBDwsgACABEJokCzsBAX8jAEEQayICJAAgARChCyACQQhqIAEQxhIgAigCDCEBIAAgAigCCDYCACAAIAE2AgQgAkEQaiQACz4BAX8CQCAAKAJYIgIgACgCUEcNACAAQdAAakGYmpoBENUdCyAAIAJBAWo2AlggACgCVCACQQJ0aiABNgIACzsBA38gACgCACEBIAAoAgQhAgJAA0AgASIDIAJGDQEgACADQcAAaiIBNgIAIAMQ8RtFDQALCyADIAJHC0QBAX8CQCABKAKIASICQYCABHFFDQAgASACQf//e3E2AogBIAAgARCQASABIAEoAogBQYCABHI2AogBDwsgACABEJABCzoAAkAgACgCACIAKAIAQQNHDQAgAEEQaiABEJUvIABBBGogARDJHyAAKAIgIAEQniYPCyAAIAEQuyULPQAgACgCACAAKAIEIAEQpyoCQCAAKAIgQQdGDQAgAEEgaiABEI4WCyAAKAJoIAEQ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IgIkACACIAAoAgA2AgwgAUHw74MBQRMgAkEMakHVARD/CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBjfCDAUEQIAJBDGpBzAAQ/wshACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQdvvgwFBDCACQQxqQdwBEP8LIQAgAkEQaiQAIAALOAEBf0EBIQICQCABQYCAgIB4Rg0AIAEgAEGEBWoiACgCABDXGkYNACABIAAoAgAQ5RtGIQILIAILNgACQCABKAIgRQ0AQayghAEQ0hoACyABQX82AiAgACABQSRqIAIQgx8gASABKAIgQQFqNgIgCzgBAX8CQCABKAIAIgNB/////wdJDQAgAhDTGgALIAEgA0EBajYCACAAIAE2AgQgACABQQRqNgIACzYBAn9BACECAkAgASgCACIDIAEoAgRPDQBBASECIAEgA0EBajYCAAsgACADNgIEIAAgAjYCAAs6AQF/IwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEGAzZgBNgIIIABCBDcCECAAQQhqQYjNmAEQ6SMACzMBAX8jAEEQayIDJAAgA0EIaiAAEPEVIAMoAgggAygCDCABIAIQ6yUhACADQRBqJAAgAAszAQF/IwBBEGsiAyQAIANBCGogABDxFSADKAIIIAMoAgwgASACEOslIQAgA0EQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGd7ZgBQQcgAkEMakHOABD/CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBnPGYAUEEIAJBDGpBzgAQ/wshACACQRBqJAAgAAs7AQF/IAAoAgAiARCiASABQcAAQQgQsxYgACgCBCIAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFgs8AQF/EIMoIgFCADcCCCABQoCAgICAATcCACAAIAE2AgQgAEECNgIAIAFBEGpCADcCACABQRhqQQA7AQALNgACQCAALQAUQQJHDQAgACgCACIAQRhqEIkiIAApAwAQxiEgAEEwQQgQsxYPCyAAKQMAEMYhCzYAAkAgAC0AFEECRw0AIAAoAgAiAEEYahCKIiAAKQMAEMghIABBMEEIELMWDwsgACkDABDIIQs2AAJAIAAtABRBAkcNACAA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IAIoAgAgARCOFgs8AQF/IABBBGohAgJAAkACQCAAKAIADgMAAQIACyACIAEQpi8PCyACKAIAIAEQ5xIPCyACKAIAIAEQixULPAEBfwJAAkAgACgCAA0AIAAoAhwiASAAKAIgEJwlIAAoAhggARCjLQwBCyAAQRhqEMkoCyAAKQMQEIMrCy8AAkAgA2lBAUcNACABQYCAgIB4IANrSw0AIAAgASADIAIQ9AMiA0UNACADDwsACzIBAX8jAEEQayICJAAgAiAANgIMIAFBwbCDAUEMIAJBDGpBHhD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFB/JaAAUEGIAJBDGpBLxD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFBycGDAUEGIAJBDGpBNBD/CyEAIAJBEGokACAACy0AAkAgAiADTw0AIAMgAiAEEOAsAAsgACACIANrNgIEIAAgASADQQJ0ajYCAAstAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAUECdGo2AgALLQACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACzQAAkAgASADRw0AAkAgAUECdCIBRQ0AIAIgACAB/AoAAAsPC0HwvJsBQShBmL2bARDSHgALLQACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACzAAAkAgAyABTw0AIAEgA0H0m5wBEOAsAAsgACADIAFrNgIEIAAgAiABQQJ0ajYCAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQaC1gAFBCCACQQxqQckAEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHEnIQBQQ8gAkEMakHMABD/CyEAIAJBEGokACAACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQ3ysgAEEgaiEADAALCwsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQmhMgAEEQaiEADAALCws3AQF/IwBBEGsiAiQAIAEgAkEPakHAzYABEO4GIQEgAEGVgICAeDYCACAAIAE2AgQgAkEQaiQACzEBAX8jAEEQayICJAAgAkEIaiAAENceIAEgAigCCCACKAIMEIIGIQAgAkEQaiQAIAALNAEBfyMAQRBrIgMkAAJAIAANAEH0gpkBQQ4gA0EPakH03IABIAIQ6hIACyADQRBqJAAgAQszAQF/IwBBEGsiAiQAIAIgADYCDCABQeTLmwFBESACQQxqQcwAEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGL8ZkBQQQgAkEMakHOABD/CyEAIAJBEGokACAACy0AAkAgAiADTw0AIAMgAiAEEOAsAAsgACACIANrNgIEIAAgASADQQJ0ajYCAAstAAJAIAIgA08NACADIAIgBBDgLAALIAAgAiADazYCBCAAIAEgA0ECdGo2AgALNgEBfyABKAIEIAFBCGoiBCgCACACIAMQhgggARCrDCAAQQhqIAQoAgA2AgAgACABKQIANwIACy0AAkAgAyABTw0AIAEgAyAEEOAsAAsgACADIAFrNgIEIAAgAiABQQJ0ajYCAAstAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAUECdGo2AgALLgEBfyMAQRBrIgUkACAFQQRqIAEgAhDgFyAAIAVBBGogAyAEEMMiIAVBEGokAAsrAAJAIAAgAUECdGpBfGoiAA0AQazBggEQ0iwACyABrUIFhiAAKAIAZ619CzQBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQig8LIAAgA0EBajYCCCAAKAIEIANqIAE6AAALLQACQCACIANPDQAgAyACIAQQ4CwACyAAIAIgA2s2AgQgACABIANBAnRqNgIACzIBAX8gACgCCCEBIAAoAgQhAAJAA0AgAUUNASABQX9qIQEgABDXDiAAQRxqIQAMAAsLCzIBAX8gACgCCCEBIAAoAgQhAAJAA0AgAUUNASABQX9qIQEgABDoCyAAQQhqIQAMAAsLCy4BAX8jAEEQayICJAAgAkEIakEKIAAgARCuESACKAIIIQEgAkEQaiQAIAFBAUYLMwEBfyMAQRBrIgIkACACIAA2AgwgAUGjp4MBQQYgAkEMakH6ABD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBnKeDAUEHIAJBDGpB/AAQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQa3wgwFBEiACQQxqQf4AEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGHuIQBQQYgAkEMakGAARD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB5KSDAUEJIAJBDGpBhgEQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQamngwFBDSACQQxqQZABEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGWuIQBQQogAkEMakGUARD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFBtcGDAUEGIAJBDGpBJBD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB9o+EAUEHIAJBDGpBpgEQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQcGwgwFBDCACQQxqQbUBEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGWuIQBQQogAkEMakG+ARD/CyEAIAJBEGokACAACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagszAQF/IwBBEGsiAiQAIAIgADYCDCABQcSchAFBDyACQQxqQcwAEP8LIQAgAkEQaiQAIAALNQEBf0EALQCg8Z4BGgJAQQwQfSIBDQAACyABIAApAgA3AgAgAUEIaiAAQQhqKAIANgIAIAELKAAgACACIAEgAyABIANJGxCIGyICIAEgA2sgAhsiA0EASiADQQBIawszAQF/IwBBEGsiAiQAIAIgADYCDCABQdKPhAFBCyACQQxqQc4AEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHIj4QBQQogAkEMakHMABD/CyEAIAJBEGokACAACzQAAkAgASgCIEUNAEGMoIQBENIaAAsgAUF/NgIgIAAgAUEkahCQJSABIAEoAiBBAWo2AiALMwEBfyAAKAIIIQEgACgCBCEAAkADQCABRQ0BIAFBf2ohASAAEOUeIABB2ABqIQAMAAsLCzQBAX9BACECAkAgACgC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QRBqJAALNgEBfwJAIAAoAgAiAUUNACABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgsgAEEANgIACzYBAX8CQCAAKAIAIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIABBADYCAAswAQF/IwBBEGsiAyQAIAMgASACELkfIABBEGogAykDACADKAIIEIkGGiADQRBqJAALQwEBf0EBIQECQAJAAkACQCAAKAIADggDAAMDAQEDAgMLIAAoAiAoAhhBgICAgHhHDwtBAA8LIAAoAgQQjxMhAQsgAQsuAQF/IwBBEGsiAyQAIANBCGogACABIAIQqwYgA0EIahDRJiECIANBEGokACACCzAAAkAgAyABTw0AIAEgA0G8t5sBEOAsAAsgACADIAFrNgIEIAAgAiABQRxsajYCAAs0AQF/AkAgACgCCCIDIAAoAgBHDQAgACACEIoPCyAAIANBAWo2AgggACgCBCADaiABOgAACzcAIABBIGoQmywCQAJAAkAgACgCAA4CAQIACyAAQQRqEJssDwsgACkDCBDGIQ8LIAApAwgQxiELNwAgAEEgahC3AwJAAkACQCAAKAIADgIBAgALIABBBGoQtwMPCyAAKQMIEMghDwsgACkDCBDIIQs6AQF/IAAoAiRB6AFqIABBCRD+HiAAKAIMIgEgACgCEBDpJCAAKAIIIAEQrC0gACgCFCAAKAIYEPIdCzgAAkAgA0UNAAJAIAFFDQAgACABIAMgAigCNBEKAA8LIABBgICAgHg2AgAPCyAAQYCAgIB4NgIACzUAAkAgASgCOEUNAAJAIAEtADwNACABIAIQxQUMAQsgASACNgIEIAFBATYCAAsgAEEEOgAACzQBAX9BACECAkAgACgCACABKAIARw0AIAAoAgQgASgCBEcNACAAKAIIIAEoAghGIQILIAILNQACQCABKAI4RQ0AAkAgAS0APA0AIAEgAhDGBQwBCyABIAI2AgQgAUEBNgIACyAAQQQ6AAALLgEBfyMAQRBrIgMkACADQQhqIAIgACABEK4RIAMoAgghASADQRBqJAAgAUEBRgs1AAJAIAEoAjhFDQACQCABLQA8DQAgASACEMUFDAELIAEgAjYCBCABQQE2AgALIABBBDoAAAswAAJAIAAoAgAiACgCAEEDRw0AIABBEGogARCTLyAAQQRqIAEQyB8PCyAAIAEQuiULMAACQCAAKAIAIgAoAgBBA0cNACAAQRBqIAEQlC8gASAAQQRqEKAfDwsgASAAEJ0mCy4BAn8gACABKAIIIgJBf2oiAyACIAMgAkkbIAMgAiADIAJLGxDKHyABIAAQlS8LMAEBfyAAIAFBFEEMIAEoAgBBAkkiAhtqKAIANgIEIAAgAUEQQQggAhtqKAIANgIACzcAIABBIGoQpywCQAJAAkAgACgCAA4CAQIACyAAQQRqEKcsDwsgACkDCBDGIQ8LIAApAwgQxiELNwAgAEEgahDUAwJAAkACQCAAKAIADgIBAgALIABBBGoQ1AMPCyAAKQMIEMYhDwsgACkDCBDGIQsuACABQQxsIQECQANAIAFFDQEgACgCACACEPgDIAFBdGohASAAQQxqIQAMAAsLCzcAIABBIGoQtSwCQAJAAkAgACgCAA4CAQIACyAAQQRqELUsDwsgACkDCBDIIQ8LIAApAwgQyCELLQACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFBDGxqNgIACzcAIABBIGoQxSwCQAJAAkAgACgCAA4CAQIACyAAQQRqEMUsDwsgACkDCBDIIQ8LIAApAwgQyCELLgEBfyMAQRBrIgMkACADQQhqIAIgACABEK4RIAMoAgghASADQRBqJAAgAUEBRgs3ACAAQSBqEMksAkACQAJAIAAoAgAOAgECAAsgAEEEahDJLA8LIAApAwgQyCEPCyAAKQMIEMghCzYAAkAgAC0AFEECRg0AIAAoAgAQnicgACgCEBDcKiAAKAIMEDtFDQAgACgCBCAAKAIIEMMjCwsxAQF/QQEhAgJAAkAgARAXQQFGDQBBACECDAELIAEQMyEBCyAAIAE2AgQgACACNgIACy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABDYLCABQX9qIQEgAEEQaiEADAALCwstAAJAA0AgAUUNASAAKAIAIABBBGooAgAQ2CwgAUF/aiEBIABBFGohAAwACwsLLQACQAJAIAJBAXENACABuBAbIQIMAQsgAa0QEiECCyAAIAI2AgQgAEEANgIACzMAAkACQCABQf////8HSQ0AIAAgAa03AwhBASEBDAELIAAgATYCBEEAIQELIAAgATYCAAs5AQF/QQEhAQJAIAAtAAQNACAAKAIAIgEoAgBB4qucAUEBIAEoAgQoAgwRCwAhAQsgACABOgAEIAELLQACQANAIAFFDQEgACgCACAAQQRqKAIAEOQsIAFBf2ohASAAQQxqIQAMAAsLCy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABDfLCABQX9qIQEgAEEMaiEADAALCwstAAJAA0AgAUUNASAAKAIAIABBBGooAgAQ5CwgAUF/aiEBIABBDGohAAwACwsLLwEBfwJAIAEoAgAiBEEBcUUNACAAIAEgBCAEIAIgAxCqFQ8LIAAgBCACIAMQqh8LOQEBf0EBIQECQCAALQAEDQAgACgCACIBKAIAQamZnAFBASABKAIEKAIMEQsAIQELIAAgAToABCABCy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABCHLSABQX9qIQEgAEEkaiEADAALCws0AQF/IABBMGoQ2R4gACgCgAUiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCgAUQ7xILCzIBAX8gAEEEahDZHiAAKAIAIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAgAQ7xILCy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABCHLSABQX9qIQEgAEEQaiEADAALCwstAAJAIAFFDQADQCAAKAIAIABBBGooAgAQgC0gAEEUaiEAIAFBf2oiAQ0ACwsLLQACQCABRQ0AA0AgACgCACAAQQRqKAIAEIAtIABBEGohACABQX9qIgENAAsLCy0AAkAgAUUNAANAIAAoAgAgAEEEaigCABCALSAAQQxqIQAgAUF/aiIBDQALCws1AAJAAkAgAUEDRg0AIAAoAgBBgICAgHhGDQEgACACQcQCaigCABDbFQsPC0Ho6oMBENIsAAs3AQF/IAAQxQ0gACgCsA0iASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCsA0gACgCtA0Q7hILCy4BAX8jAEEQayIBJAAgAUEBOgAEIAEgADYCCCABQQRqENoiIQAgAUEQaiQAIAALNAEBfwJAQQgQky0iAw0AAAsgAyACNgIEIAMgATYCACAAQQE2AgggACADNgIEIABBATYCAAsrAQF/QQAhAgJAQQEgAHQiAEEPcQ0AAkAgAEEwcUUNAEEBDwsgASECCyACCy8AAkAgASgCAEERRw0AIAEoAghBf2pBAUsNACABIAAoAgAoAgAQ3gRBACEBCyABCzYBAX8CQCABKAIARQ0AIAEgABCeKA8LIAAtAJABIQIgAEEBOgCQASABIAAQniggACACOgCQAQs1AQJ/AkAgACgCACIBRQ0AIAEoAgAiAhDeAyACQeAAQQgQsxYgAUEMQQQQsxYLIABBADYCAAspAQF/AkAgAUUNACAAIAFBAnRBC2pBeHEiAmsgASACakEJakEIELMWCws3AAJAAkACQAJAIAAtAAAOBwMDAwECAAMACyAAQQRqEPQFDwsgAEEEahC5LQ8LIABBBGoQoCsLCywBAX8jAEEQayIDJAAgA0EDOgAPIAAgAiABQQFxIANBD2oQ3wYgA0EQaiQACysAIAFBMGwhAQJAA0AgAUUNASAAIAIQ6gUgAUFQaiEBIABBMGohAAwACwsLPgAgAEEEahDuJwJAIAFC+IKZvZXuxsW5f1INACACQu26rbbNhdT14wBSDQAgAEEkahDGGgsgAEEwQQQQsxYLLAAgAUEGdCEBAkADQCABRQ0BIAAgAhDMKiABQUBqIQEgAEHAAGohAAwACwsLLwEBfyMAQRBrIgIkACACIAAoAgAiADYCDCACQQxqIAEQpgggABCeJyACQRBqJAALLwECfwJAIAAoAgAiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCABCrEAsLMQEBfwJAIAEoAgAiAkUNACAAIAIRAwALAkAgASgCBCICRQ0AIAAgAiABKAIIELMWCwsxAQF/AkAgASgCACICRQ0AIAAgAhEDAAsCQCABKAIEIgJFDQAgACACIAEoAggQsxYLCy4AIAAgASACIANB/wFxakGEnoABQfSdgAEgBEEBRiIDGxC+JUEAIAQgAxs2AgALLQEBfyMAQRBrIgMkACADIAAQ0QggAyABIAIQ0RUhAiAAENIVIANBEGokACACCzkBAX8gACEBAkACQAJAIAAtACAOBAECAgACCyAAQRRqIQELIAEQ5ScgACgCDBDcKiAAKAIQENwqCwsqAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAWo2AgALKgACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFqNgIACzABAX8jAEEQayIBJAAgAUEANgIMIAFCgICAgBA3AgQgACABQQRqENwYIAFB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IAEoAgAgACgCAC0AAEECdCIAQdjRngFqKAIAIABBtNGeAWooAgAgASgCBCgCDBELAAsoACABIAIgAyAEEOolIQMgACACIARrNgIEIAAgASAEakEAIAMbNgIACy0AAkAgACgCACIARQ0AIAAQ0Q8gACgCACAAQQRqKAIAEJ4tIABBFEEEELMWCwszACABKAIAIAAoAgAtAABBAnQiAEGA1p4BaigCACAAQfTVngFqKAIAIAEoAgQoAgwRCwALMwAgASgCACAAKAIALQAAQQJ0IgBBpNaeAWooAgAgAEGY1p4BaigCACABKAIEKAIMEQsACzMAIAEoAgAgACgCAC0AAEECdCIAQeTWngFqKAIAIABBsNaeAWooAgAgASgCBCgCDBELAAszACABKAIAIAAoAgAtAABBAnQiAEGk154BaigCACAAQZjXngFqKAIAIAEoAgQoAgwRCwALLAAgACACQoCBgoSIkKDAgH+DIgJCAFI2AgAgACACeqdBA3YgA2ogAXE2AgQLNQEBf0GAASEDAkAgASACQdrzmwFBBhDjJQ0AQf8AQaR/IAEgAkGgupwBQQMQ4yUbIQMLIAMLNQEBf0HtACEDAkAgASACQfjimwFBAxDjJQ0AQe4AQaR/IAEgAkG39JsBQQQQ4yUbIQMLIAMLNQEBf0HvACEDAkAgASACQdmCnAFBBRDjJQ0AQfAAQaR/IAEgAkHChJwBQQQQ4yUbIQMLIAMLMAEBfwJAIAEoAgBBA0cNACAALQA5IQIgAEEBOgA5IAEoAgQgABDaASAAIAI6ADkLCywBAX8DQCABQRhqIQICQCABLQAsQQJGDQAgACACELQTDwsgAigCACEBDAALCzABAX8CQCABKAIAQQJHDQAgAC0AOSECIABBAToAOSABKAIEIAAQ2gEgACACOgA5CwswAQF/AkAgASgCAEEBRw0AIAAtADkhAiAAQQE6ADkgASgCBCAAENoBIAAgAjoAOQsLLQACQCAAKAIAIgBFDQAgABDRDyAAKAIAIABBBGooAgAQni0gAEEUQQQQsxYLCzMAIAEoAgAgACgCAC0AAEECdCIAQZTangFqKAIAIABBiNqeAWooAgAgASgCBCgCDBELAAssACABIAAQvycCQCABKAIAQQNHDQAgASgCBCIBKAIAQRlHDQAgACABEMcBCwszACABKAIAIAAoAgAt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AgQiASAAKAIIEO4iIAAoAgAgARChLQsXACAAKAIAQQhqIAEoAgAgASgCBBDQBQsXACAAKAIAIAEgACgCBEEMaigCABEHAAsVACABIAAoArwCRiABIAAoAsACRnILFQAgASAAKALYAkYgASAAKALcAkZyCxUAIAEgACgC0AJGIAEgACgC1AJGcgsZACAAKAIAIAAoAgQgASgCACABKAIEEOsDCxUAAkAgAEUNACABIABBBEEIEJMVCwsXACAAQQRqEO4nIAAoAhwgACgCIBC/LwsZACAAKAIEIAAoAgggASgCACABKAIEEOsDCxcBAX8gABAkIgE2AgQgACABQQBHNgIACxcBAX8gABAlIgE2AgQgACABQQBHNgIACxcBAX8gABAmIgE2AgQgACABQQBHNgIACxcBAX8gABAnIgE2AgQgACABQQBHNgIACxgAIAAQqgQgABD2DiAAKAIYQTRBBBCzFgsVACABIAAoArwCRiABIAAoAsACRnILFQAgASAAKALQAkYgASAAKALUAkZyCxUAIAEgACgC2AJGIAEgACgC3AJGcgsVAAJAIAENAEEAQQAgAhCRFQALIAALFQACQCABDQBBAEEAIAIQkRUACyAACxkAIAAoAgAgACgCBCABKAIAIAEoAgQQ6wMLGQAgACgCBCAAKAIIIAEoAgAgASgCBBDrAwsTACABKAIAIAJBBHRrQXBqENkFCxUAAkAgAUH/AXFBAkYNACAAEMYhCwsVAAJAIAFB/wFxQQJGDQAgABDIIQsLFQACQCABQf8BcUECRg0AIAAQyCELCxcAIAAgASACIAMQ4Bo2AgQgAEEBNgIACxUAIAAgARCTDCAAKAIIIAEoAghGcQsdAAJAQQAoAojrngFBAkYNABD7GgtBACgChOueAQsXACAAQQA2AhAgAEIBNwIAIABBADYCCAsXACAAKAIAIABBBGooAgAQ9CwgABCJLwsXACAAQQxqEJssIAAQ/yogACgCHBCELAsVAAJAIAAtAABFDQAgAEEEahDpBwsLFwAgABCxHiAAQTxqELsoIAAoAjgQhCwLFQACQCAAKAIARQ0AIABBBGoQySwLCxoAAkAgACgCAEGAgICAeEYNACAAIAEQhiELCxoAAkAgACgCAEGAgICAeEYNACAAIAEQiCELCxYAAkAgASgCACIBRQ0AIAEgABCJIQsLFgAC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IAEgABChJwsQACAAEMcoIABBHEEEELMWCxAAIAAQxyggAEEYQQQQsxYLDwAgABDUAyAAQQRqELMGCw8AIAAQtSogAEEUahC4KwsPAAJAIABFDQAgABCFLAsLIQAgAELQr6/Z4cDf4pJ/NwMIIABCxITPwofQy/snNwMACxEAIAAoAgAiABCIBCAAEIgvCw8AIABBIGoQsSwgABC2JAsPACAAELEsIABBBGoQkQYLEAAgACABKAIAKAIAIAIQewsRACAAKAIAIgAQqAMgABCILwsPACAAELUsIABBBGoQnwYLDwAgABC+HSAAQSBqELUsCyEAIABC+uS16sSa6LkjNwMIIABCqKrrluGhn4qhfzcDAAshACAAQvjM69Sv9bCpczcDCCAAQvrY9o/g8bfw0gA3AwALEwAgAEEfNgIEIABB74ucATYCAAsTACAAQQ02AgQgAEGOjJwBNgIACyEAIABC/Nf7/tHxgf67fzcDCCAAQvToq6SjnLOEVTcDAAshACAAQofz952r/suKq383AwggAEKokZWU3Oqn13c3AwALIgAgAEKw5ceF7tGb5rh/NwMIIABC4JrKm5Hcj63KADcDAAshACAAQqre593e4reKfDcDCCAAQsmU4+vWuJ3A0wA3AwALEwAgAEEoNgIEIABBjIicATYCAAsTACAAQdiOnAE2AgQgACABNgIACxMAIABBKDYCBCAAQYyInAE2AgALEwAgAEGUj5wBNgIEIAAgATYCAAsSACAAKAIAEJYnIAAoAgQQlicLEQAgACgCACIAEMoDIAAQiC8LDwAgABDFLCAAQQRqELQGCxIAQQAtAKDxngEaIAEgABChJwsiACAAQr2r3N/6tMLJ9QA3AwggAEKxnJTpsPP9nsEANwMACxEAIAAoAgAiABD3AyAAEIgvCw8AIAAQySwgAEEEahCSBgsPACAAENYoIABBFGoQzSsLDwAgABCsKyAAQRRqEM0rCw8AIAAoAgAgACgCBBDPLAsNACAAIAFBAUEKEJIVCw0AIAAgAUEBQQEQkxULDQAgACABQQRBCBCTFQsNACAAIAFBBEEEEJMVCw8AQcSWgQFBKyAAENIeAAsNACAAIAFBBEEgEJIVCwsAIAAgARAYQQFGCwwAIABBgQEQMUEARwsOACAAKAIAQQEgARDrBwsNACAAIAFBBEEQEJkWCw0AIAAg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CwoAIAAgARCaLgALCgAgACABEIEkAAsMACAAKAIAIAEQsiYLDAAgACgCACABEPwMCwwAIAAgASkCADcDAAsMACAAKAIAIAEQ4BULCgAgABCSDhpBAQsKACAAELUCGkEBCwsAIAAgAUEEEP4eCwwAIAAoAgAgARDsKwsKACAAEPQNGkEBCwwAIAAoAgAgARC7HAsMACAAKAIAIAEQ7AQLDAAgABDGISABEPsqCwwAIAAoAgAgARDcGgsMACAAKAIAIAEQ5QwLDAAgACgCACABEM8CCwwAIAAoAgAgARDJFwsMACAAKAIAIAEQ0yALDAAgACgCACABENkZCwwAIAAQxiEgARDGIQsMACAAKAIAIAEQry4LDAAgACgCACABEJAFCwwAIAAoAgAgARDdGgsMACAAKAIAIAEQvwoLDAAgACgCACABELwZCwwAIAAoAgAgARDXCgsMACAAKAIAIAEQ1gwLDAAgACgCACABEKcuCwwAIAAoAgAgARD5EAsMACAAKAIAIAEQqg0LDAAgACgCACABEOsiCwsAIABBAToADEEBCwwAIAAQyCEgARCDKwsMACAAEMghIAEQyCELDAAgACgCACABEMkhCwwAIAAoAgAgARD+FQsMACAAKAIAIAEQ8xALDAAgACgCACABEPAQCwwAIAAQyCEgARCDKwsMACAAEMghIAEQyCELDAAgACgCACABEPcQCwwAIAAoAgAgARDvDgsMACAAKAIAIAEQ3CgLDAAgACgCACABEJEeCwwAIAAoAgAgARDjCQsMACAAKAIAIAEQ5BgLDAAgACgCACABENgZCwwAIAAoAgAgARDpGQsMACAAKAIAIAEQyhcLCwAgAEEEQQQQsxYLCwAgAEEgQQgQsxYLCwAgACABIAIQ4BoLCwAgACABIAIQ4BoLCwAgASAAIAIQzS4LDAAgACgCACABEKoICwwAIAAoAgAgARClCAsLACAAIAFBABCIBwsLACAAIAFBARCIBwsMACAAIAFB4gQQlQMLDAAgACABQeMEEJUDCwwAIAAgAUHkBBCVAwsMACAAIAFB5QQQlQMLDAAgACABQeYEEJUDCwwAIAAgAUHnBBCVAwsMACAAIAFB6AQQlQMLDAAgACABQekEEJUDCwwAIAAgAUHqBBCVAwsMACAAIAFB6wQQlQMLDAAgACABQewEEJUDCwwAIAAgAUHt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ARCxCAsIACAAIAEQRQsJACAAIAEQ8wkLCQAgACABEK4CCwkAIAAgARDKAgsJACAAIAEQyQcLCQAgACABEOkCCwkAIAAgARCyJgsMAEH7opsBQQ0Q0wwLDABB8qKbAUEJENMMCwwAQeSimwFBDhDTDAsJACABIAAQ5gELDABBi6qbAUEIENMMCwcAIABBGGoLCQAgACABEPEsCwkAIABBADYCAAsJACAAIAEQ1isLCQAgACABENYrCwgAIAAgARBkCwkAIAAgARCyLwsJACAAIAEQsy8LCQAgACABELQvCwoAEJoHIAAQlA0LCgAgACgCABCeJwsJACAAIAEQ4wELBwAgABCMKQsHAEEBEN4qCwcAQQAQ3ioLCAAgAC0AxAILBwAgACgCFAsIACAAKAKsAgsIACAAKAKwAgsIACAALQDgAgsHACAAKAI4CwgAIAAoAsgCCwgAIAAoAswCCwUAIAFFCwgAIAAtANgCCwcAIAAoAiALCAAgACgCwAILCAAgACgCxAILCAAgAC0AzBILCAAgAC0AvA0LBwAgABDFDQsHACAAEKgJCwcAIAAoAkALBwAgABCfEwsIACAALQDEAgsHACAAKAIUCwgAIAAoAqwCCwgAIAAoArACCwUAIAFFCwgAIAAtANgCCwcAIAAoAiALCAAgACgCwAILCAAgACgCxAILCAAgAC0A4AILBwAgACgCOAsIACAAKALIAgsIACAAKALMAgsHACAAKAJACwcAQQAQ/BULBwAgACgCIAsHACAAKAIkCwcAIAAoAigLBwAgABCWCAsEAEEBCwcAQcDwngELBwBBuPCeAQsDAAALBAAgAAsEAEEACwQAQQELBABBAQsEAEEACwQAIAALBABBAQsEAEEACwQAIAALBABBAAsEAEEBCwQAQQALAwAACwQAQQALBABBAQsHAEHE8J4BCwQAQQELBABBAQsCAAsCAAsCAAsCAAsCAAsCAAsCAAsCAAsL9OseAgBBgICAAQug4B7JAwAADAAAAAQAAADKAwAAywMAAMwDAAAAAAAAAAAAAAEAAADNAwAAzgMAAAQAAAAEAAAAzwMAANADAADEAAAABAAAANEDAADSAwAA0wMAAGl0IHNob3VsZCBub3QgZmFpbCB3aXRob3V0IGVtaXR0aW5nIGVycm9ycyB0byBoYW5kbGVyAAAAGiwgACIAAAB7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AAAA8gEAABgAAAAs2iAAbQAAAPMBAAAjAAAALNogAG0AAADzAQAAGAAAACzaIABtAAAA7QEAACMAAAAs2iAAbQAAAO0BAAAYAAAALNogAG0AAADuAQAAHgAAACzaIABtAAAA7gEAACMAAAAs2iAAbQAAAO8BAAAZAAAALNogAG0AAACYAgAANAAAACzaIABtAAAAmwIAACEAAAAs2iAAbQAAAJsCAAAmAAAALNogAG0AAACcAgAAHwAAACzaIABtAAAAnAIAADIAAAAs2iAAbQAAAJMCAAA0AAAALNogAG0AAACVAgAAGAAAACzaIABtAAAAjwIAADQAAAAs2iAAbQAAAJACAAAnAAAALNogAG0AAACQAgAALAAAACzaIABtAAAA0gIAABEAAAAs2iAAbQAAANMCAAARAAAALNogAG0AAADMAgAANAAAACzaIABtAAAAzgIAABEAAAAs2iAAbQAAAM8CAAARAAAALNogAG0AAADQAgAAEQAAACzaIABtAAAAyAIAABEAAAAs2iAAbQAAAMkCAAARAAAALNogAG0AAADaAgAAPAAAACzaIABtAAAA3AIAABUAAAAs2iAAbQAAANsCAAARAAAALNogAG0AAADfAgAAFQAAACzaIABtAAAA3gIAABEAAAAs2iAAbQAAAAoDAAARAAAALNogAG0AAAANAwAAEQAAACzaIABtAAAA+AIAABUAAABlcXVpdmFsZW5jZSBjbGFzc2VzIGFyZSBuZXZlciBlbXB0eQBAFCAAIwAAACzaIABtAAAALgMAAAkAAAAs2iAAbQAAADADAAAQAAAALNogAG0AAAA/AwAAHQAAACzaIABtAAAAswMAACUAAAAs2iAAbQAAAOADAAAjAAAALNogAG0AAADhAwAAIQAAACzaIABtAAAA4gMAACgAAAAs2iAAbQAAAOMDAAAmAAAALNogAG0AAADuAwAAEgAAACzaIABtAAAA7wMAABoAAAAs2iAAbQAAANgDAAAmAAAALNogAG0AAADSAwAAHgAAACzaIABtAAAAxgMAACIAAAAAAAAABAAAAAQAAAAkAAAAAAAAAAQAAAAEAAAATgAAAAAAAAAEAAAABAAAAO0DAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmJ5X2lkLmxlbigpIDw9IHUxNjo6TUFYIGFzIHVzaXplAAEaIABtAAAASAAAAAkAAAABGiAAbQAAAEsAAAAUAAAAARogAG0AAABMAAAAFAAAAAEaIABtAAAAjwAAABwAAAABGiAAbQAAAMgAAAAlAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3JlbWFwcGVyLnJz9BUgAGwAAAByAAAAEgAAAPQVIABsAAAAjAAAACQAAAD0FSAAbAAAAJEAAAAgAAAA9BUgAGwAAACTAAAAHQAAAJQKIQBpAAAAhwIAACkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwAAsBYgAG4AAADhAgAAAQAAAAAAAAAIAAAABAAAAO4DAABhc3NlcnRpb24gZmFpbGVkOiBwYXR0ZXJucy5sZW4oKSA+PSAxL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvcmFiaW5rYXJwLnJzZRcgAG8AAAA9AAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IGhhc2hfbGVuID49IDEAZRcgAG8AAAA/AAAACQAAAGUXIABvAAAASAAAABYAAABlFyAAbwAAAE0AAAAsAAAAZRcgAG8AAABPAAAAFwAAAGUXIABvAAAATwAAACAAAABAAAAAZRcgAG8AAABgAAAAKwAAAGUXIABvAAAAbwAAABEAAABlFyAAbwAAAFsAAAAJAAAAZRcgAG8AAACOAAAAIwAAAGUXIABvAAAAlwAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvYWxwaGFiZXQucnOx5yAADAAAAGKPJgACAAAA4hUnAAEAAABCeXRlQ2xhc3Nlcyg8b25lLWNsYXNzLXBlci1ieXRlPikAAAAsGSAAIQAAAKgYIABsAAAA9QAAAC4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvZGVidWcucnMAAABoGSAAaQAAABgAAAA9AAAAaBkgAGkAAAAVAAAADQAAAEJvcnJvd2VkT3duZWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9wYXR0ZXJuLnJzAAABGiAAbQAAAF0AAAAaAAAAARogAG0AAABdAAAAMAAAAAAAAAAAAAAAAQAAAO8DAABDb3dCeXRlc25lZWRsZVBhdHRlcm5zYnlfaWRvcmRlcnRvdGFsX3BhdHRlcm5fYnl0ZXNpbXBtZW1vcnlfdXNhZ2UAAPADAABcAQAABAAAAKEAAADwAwAAXAEAAAQAAADxAwAA8gMAAPMDAAD0AwAA9QMAAPYDAAD3AwAA+AMAAPkDAAD6AwAA+wMAAPwDAAD9AwAA/gMAAP8DAAAABAAAAQQAAKEAAADkGiAAAgQAAEgBAAAEAAAAAwQAAAIEAABIAQAABAAAAAQEAAAFBAAABgQAAPQDAAAHBAAACAQAAAkEAAAKBAAACwQAAAwEAAANBAAADgQAAA8EAAAQBAAAEQQAABIEAAATBAAAAwQAAEwbIAAUBAAAZAEAAAQAAAAVBAAAFAQAAGQBAAAEAAAAFgQAABcEAAAYBAAA9AMAABkEAAAaBAAAGwQAABwEAAAdBAAAHgQAAB8EAAAgBAAAIQQAACIEAAAjBAAAJAQAACUEAAAVBAAAtBsgACzaIABtAAAA0wAAACEAAABkCCEAcAAAAHACAAAeAAAAAAAAAAQAAAAEAAAAJgQAACcEAAAMAAAABAAAACgEAAApBAAAKgQAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzZBwgACAAAAAuAgAAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwCUHCAAGwAAAOgBAAAXAAAAAAAAAAAAAAABAAAAKwQAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90bGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAAAmHSAAGAAAAIoCAAAOAAAAAAAAAAAAAAABAAAALAQAAGxpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAABgHSAAGgAAAL4BAAAdAAAAbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwAAAIwdIAAZAAAAhAEAADIAAAApIHNob3VsZCBiZSA8IGxlbiAoaXMgaW5zZXJ0aW9uIGluZGV4IChpcyApIHNob3VsZCBiZSA8PSBsZW4gKGlzIAAAAM4dIAAUAAAA4h0gABcAAABcgicAAQAAAHJlbW92YWwgaW5kZXggKGlzIAAAFB4gABIAAAC4HSAAFgAAAFyCJwABAAAAYGF0YCBzcGxpdCBpbmRleCAoaXMgAAAAQB4gABUAAADiHSAAFwAAAFyCJwABAAAAAAAAAAQAAAAEAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaW52YWxpZCBPbmNlIHN0YXRlfB4gADwAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvb25jZS9ub190aHJlYWRzLnJzAMAeIABbAAAANQAAABIAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobikAAEMWJwBLAAAAFAgAAB0AAADJAwAADAAAAAQAAADKAwAAywMAAMwDAADJAwAADAAAAAQAAADKAwAAywMAAMwDAAAAAAAAAAAAAAEAAADNAwAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnMAwB8gAF8AAABnBAAADgAAAAoKQ2F1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AAAAyiImAAsAAABpbnZhbGlkIGxlbmd0aCAASCcgAA8AAADKIiYACwAAAGR1cGxpY2F0ZSBmaWVsZCBgAAAAaCcgABEAAADg+SYAAQAAAHVua25vd24gdmFyaWFudCBgYCwgZXhwZWN0ZWQgAAAAjCcgABEAAACdJyAADAAAAIX0JgBYAAAAlQgAABsAAACF9CYAWAAAAJMIAAAaAAAATWFwQWNjZXNzOjpuZXh0X3ZhbHVlIGNhbGxlZCBiZWZvcmUgbmV4dF9rZXkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9jb3JlLTEuMC4yMjUvc3JjL2RlL3ZhbHVlLnJzAAgoIABnAAAAZwUAABsAAAB2ZXJiYXRpbU1vZHVsZVN5bnRheG5hdGl2ZUNsYXNzUHJvcGVydGllc2ltcG9ydE5vdFVzZWRBc1ZhbHVlc25vRW1wdHlFeHBvcnRpbXBvcnRFeHBvcnRBc3NpZ25Db25maWd0c0VudW1Jc011dGFibGVyZW1vdmVwcmVzZXJ2ZfIoIAAGAAAA+CggAAgAAAB2YXJpYW50IGluZGV4IDAgPD0gaSA8IDIQKSAAGAAAAAAAAAAIAAAABAAAADwEAABDbGFzc2ljUHJlc2VydmVOb2RlTmV4dEVzTmV4dAAAAEApIAAHAAAARykgAAgAAABPKSAACAAAAFcpIAAGAAAAdmFyaWFudCBpbmRleCAwIDw9IGkgPCA0gCkgABgAAACAKCAAFAAAAJQoIAAVAAAAqSggABUAAAC+KCAADQAAAMsoIAAYAAAA4yggAA8AAAB2YWx1ZSBpcyBtaXNzaW5ndHN4AOApIAADAAAAzckmAAoAAABzdHJpcC1vbmx5dHJhbnNmb3JtAPQpIAAKAAAA/ikgAAkAAABmaWxlbmFtZXBhcnNlcmRlcHJlY2F0ZWRUc01vZHVsZUFzRXJyb3Jzb3VyY2VNYXDU+SYABgAAABgqIAAIAAAAICogAAYAAAA54SAABAAAAP4pIAAJAAAAJiogABkAAAA/KiAACQAAAD0EAAAkAAAABAAAAD4EAAAAAAAABAAAAAQAAAA/BAAAQAQAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvbGliLnJzAKQqIABrAAAA5gAAABUAAABUc0Vycm9yAEEEAAAQAAAABAAAAEIEAABBBAAAEAAAAAQAAABDBAAAQgQAACgrIABEBAAARQQAAEYEAABEBAAARwQAAEgEAAAsAAAABAAAAEkEAABIBAAALAAAAAQAAABKBAAASQQAAGQrIABLBAAATAQAAE0EAABOBAAATwQAAFAEAABRBAAAUgQAAFMEAABUBAAAVQQAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXBfdGhyb3coKWAgb24gYSBgTm9uZWAgdmFsdWVjYWxsZWQgYFJlc3VsdDo6dW53cmFwX3Rocm93KClgIG9uIGFuIGBFcnJgIHZhbHVlYmluZGluZ190eXBlc2NyaXB0X3dhc20vc3JjL2xpYi5ycxosIAAiAAAAIwAAABcAAAAAAAAAAAAAAAEAAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABfBAAAYAQAAGEEAABiBAAAYwQAAF8EAABkBAAAzCwgAF4AAABIBQAAMgAAAMwsIABeAAAAVgUAAEkAAABlBAAAZgQAAGcEAABoBAAAaQQAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2J5dGVzLTEuMTAuMS9zcmMvYnl0ZXMucnMvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ieXRlcy1zdHItMC4yLjcvc3JjL2J5dGVfc3RyLnJzbiBpcyBub3QgYSBjaGFyYWN0ZXIgYm91bmRhcnkAji0gAB0AAAAqLSAAZAAAAJsBAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL2xpYi5yc2lkeCBtdXN0IGxpZSBvbiBjaGFyIGJvdW5kYXJ5AAAl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AAkBBwECCQUBBgYAAQUGAgUBCAEICQgJBAADBQQFCAUGBAcFCAMAAAcIAQIFCQAJBAkEBwABBwcCCQIIAgMHCQEFAAMJAAYCBQQFBAcEBwMFAAgIBgQGBAEBCAkFBwUBCQUDAQIFAgIHAwcDBgcFBAQDAgMCAAUJBAcIBwUJBwYFBgIFAQEDBggGCAMHBwIBBgEGAAIJBwMJAwcJCAgCCAECBQUGCAQDBAEICAYACAAIAAEECAYJBggJCQQBBAAGAgUCCAQCAQcACQQDAAQABAAABwQDBAgEBAkHAAcAAwECBQEEAgEACAUEBwEFAgACAAADBwEHBAICBAgFAwUBBQYCBQcBAAUEAgcDBQcGAAEAAAEIBQgHAQECBAIGBwUHCAECBQMFBQIHAQMGBwgIAAAFAAAJAgkDBQUGAgEDAwcICQAGAgUBBwcGAwUGCAMJBAAAAgUABAYEBgcHCAEABgYICQQFAwECBQgICAEHCAQBCQcAAAECBQIDAgMDCAkABQMDBAQHAgYFBgIFBAQEAAgJAgAJCAUAAAYCBgEGAQYJBAUCBgYHAgMGAwIIAQIFAgICAAQEBgAECQIFAAMBAwAIAAgEBwIGAwMDBgEIAQYEAAYCBQEBAQACAgMAAgQGAgUBBQYFBAAEAgMGAwEGBggACQAIAgADAQIFBQUFAQEBBQECAwECBQcIAgcAAgEBCAEFCAMEAAQFBAEAAQUGAgUCBwcFBQUHBQYBBQYCCAkBAwUBAAUJAAcJAQcAAgIHAAUABwgBAgUBAwgHBwcIBwgABwgBBAQFBgcFBQIJBQMJBQgFAQEDBQIFAwkABgIFBgkDCAgJAwkAAwkABwICCAMHBwYEBwYJBwkCBQUGBwYCBgkFAwECBQMEBgkEBAYJBQEJBQMGAQQBCAgIAgMIBAgJBgIHCAMIAQMEBwYFBgIFAQcDBAcCAwQHBQkHBggABwAJBAQBAQkCBAQIAQMJAQkABgcDCAIIAQIFCAYHAwYBBwMHCQgIBAADBQQHAgAFCQYCAgQABgkFCQUDAwYJAQQABgIFAABAOSAAKwAAAGwBAAAbAAAAQDkgACsAAABxAQAAEwAAAAADBgkNEBMXGh0hJCcrLjE1ODsAAAAAAAAA8D8AAAAAAAAkQAAAAAAAAFlAAAAAAABAj0AAAAAAAIjDQAAAAAAAavhAAAAAAICELkEA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IHN5bWJvbG5vbi16ZXJvIHRyYWlsaW5nIGJpdHNpbnZhbGlkIHBhZGRpbmcgbGVuZ3RoIGF0IAEAAAAAAAAAXIYgAAQAAABMZW5ndGhUcmFpbGluZ1BhZGRpbmdEZWNvZGVFcnJvcnBvc2l0aW9uAgAAAAAAAAAAAAgAAAAAAAAAAAAgAADpL3J1c3QvZGVwcy9oYXNoYnJvd24tMC4xNS4zL3NyYy9yYXcvbW9kLnJzAACwhiAAKgAAACUAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaGFzaGJyb3duLTAuMTUuNC9zcmMvcmF3L21vZC5yc+yGIABkAAAAJQAAACgAAAAAAAAAAAAAAAEAAABWBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdHJpb21waGUtMC4xLjE0L3NyYy9hcmMucnMAcIcgAF8AAAA1AQAADgAAAHCHIABfAAAAbgEAAC0AAABwhyAAXwAAAG8BAAAOAAAAAAAAAAwAAAAEAAAAcgQAAHMEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oc3RyLTIuMS4wL3NyYy9saWIucnMAABSIIABaAAAAFAEAADwAAAAAAAAAAAAAAAEAAAB0BAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaHN0ci0yLjEuMC9zcmMvZHluYW1pYy5ycwAAkIggAF4AAABxAAAAIAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5yc3JldHVybiB0aGlzAIkgAF0AAAD7GAAAAQAAAHSDJwBvAAAAJAEAAA4AAAB3RCYAcAAAAE0AAAAuAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJn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Njg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pdGVyLnJzAABAoiAATgAAAPYFAAAVAAAAAAAAAAQAAAAEAAAATgAAAG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm9uLXplcm8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAAADMoiAAaQAAAGYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAAAEijIABtAAAAOwAAABoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3NoaWZ0LnJzAADIoyAAagAAAB4AAAAcAAAAyKMgAGoAAAAoAAAAGQAAAMijIABqAAAALgAAABIAAADIoyAAagAAAEoAAAAjAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC5yc3SkIABkAAAAYwMAABcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJz6KQgAHAAAAA0AAAAGgAAAOikIABwAAAANQAAABoAAABDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEueKUgADQAAADopCAAcAAAAEUAAAAFAAAA6KQgAHAAAABdAAAAGgAAAOikIABwAAAAXgAAABoAAABhc3NlcnRpb24gZmFpbGVkOiBhX2hpLmlzX2VtcHR5KCkAAADopCAAcAAAAGIAAAAFAAAA6KQgAHAAAABlAAAABQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnMopiAAZAAAAIMBAAABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvaW1wX3N0ZC5yc5ymIABkAAAAoQAAADYAAACcpiAAZAAAAJsAAAAJAAAAMzg7NTswMzg7NTsxMzg7NTsyMzg7NTszMzg7NTs0Mzg7NTs1Mzg7NTs2Mzg7NTs3Mzg7NTs4Mzg7NTs5Mzg7NTsxMDM4OzU7MTEzODs1OzEyMzg7NTsxMzM4OzU7MTQzODs1OzE1Mzg7NTsxNjM4OzU7MTczODs1OzE4Mzg7NTsxOTM4OzU7MjAzODs1OzIxMzg7NTsyMjM4OzU7MjMzODs1OzI0Mzg7NTsyNTM4OzU7MjYzODs1OzI3Mzg7NTsyODM4OzU7MjkzODs1OzMwMzg7NTszMTM4OzU7MzIzODs1OzMzMzg7NTszNDM4OzU7MzUzODs1OzM2Mzg7NTszNzM4OzU7MzgzODs1OzM5Mzg7NTs0MDM4OzU7NDEzODs1OzQyMzg7NTs0MzM4OzU7NDQzODs1OzQ1Mzg7NTs0NjM4OzU7NDczODs1OzQ4Mzg7NTs0OTM4OzU7NTAzODs1OzUxMzg7NTs1MjM4OzU7NTMzODs1OzU0Mzg7NTs1NTM4OzU7NTYzODs1OzU3Mzg7NTs1ODM4OzU7NTkzODs1OzYwMzg7NTs2MTM4OzU7NjIzODs1OzYzMzg7NTs2NDM4OzU7NjUzODs1OzY2Mzg7NTs2NzM4OzU7NjgzODs1OzY5Mzg7NTs3MDM4OzU7NzEzODs1OzcyMzg7NTs3MzM4OzU7NzQzODs1Ozc1Mzg7NTs3NjM4OzU7NzczODs1Ozc4Mzg7NTs3OTM4OzU7ODAzODs1OzgxMzg7NTs4MjM4OzU7ODMzODs1Ozg0Mzg7NTs4NTM4OzU7ODYzODs1Ozg3Mzg7NTs4ODM4OzU7ODkzODs1OzkwMzg7NTs5MTM4OzU7OTIzODs1OzkzMzg7NTs5NDM4OzU7OTUzODs1Ozk2Mzg7NTs5NzM4OzU7OTgzODs1Ozk5Mzg7NTsxMDAzODs1OzEwMTM4OzU7MTAyMzg7NTsxMDMzODs1OzEwNDM4OzU7MTA1Mzg7NTsxMDYzODs1OzEwNzM4OzU7MTA4Mzg7NTsxMDkzODs1OzExMDM4OzU7MTExMzg7NTsxMTIzODs1OzExMzM4OzU7MTE0Mzg7NTsxMTUzODs1OzExNjM4OzU7MTE3Mzg7NTsxMTgzODs1OzExOTM4OzU7MTIwMzg7NTsxMjEzODs1OzEyMjM4OzU7MTIzMzg7NTsxMjQzODs1OzEyNTM4OzU7MTI2Mzg7NTsxMjczODs1OzEyODM4OzU7MTI5Mzg7NTsxMzAzODs1OzEzMTM4OzU7MTMyMzg7NTsxMzMzODs1OzEzNDM4OzU7MTM1Mzg7NTsxMzYzODs1OzEzNzM4OzU7MTM4Mzg7NTsxMzkzODs1OzE0MDM4OzU7MTQxMzg7NTsxNDIzODs1OzE0MzM4OzU7MTQ0Mzg7NTsxNDUzODs1OzE0NjM4OzU7MTQ3Mzg7NTsxNDgzODs1OzE0OTM4OzU7MTUwMzg7NTsxNTEzODs1OzE1MjM4OzU7MTUzMzg7NTsxNTQzODs1OzE1NTM4OzU7MTU2Mzg7NTsxNTczODs1OzE1ODM4OzU7MTU5Mzg7NTsxNjAzODs1OzE2MTM4OzU7MTYyMzg7NTsxNjMzODs1OzE2NDM4OzU7MTY1Mzg7NTsxNjYzODs1OzE2NzM4OzU7MTY4Mzg7NTsxNjkzODs1OzE3MDM4OzU7MTcxMzg7NTsxNzIzODs1OzE3MzM4OzU7MTc0Mzg7NTsxNzUzODs1OzE3NjM4OzU7MTc3Mzg7NTsxNzgzODs1OzE3OTM4OzU7MTgwMzg7NTsxODEzODs1OzE4MjM4OzU7MTgzMzg7NTsxODQzODs1OzE4NTM4OzU7MTg2Mzg7NTsxODczODs1OzE4ODM4OzU7MTg5Mzg7NTsxOTAzODs1OzE5MTM4OzU7MTkyMzg7NTsxOTMzODs1OzE5NDM4OzU7MTk1Mzg7NTsxOTYzODs1OzE5NzM4OzU7MTk4Mzg7NTsxOTkzODs1OzIwMDM4OzU7MjAxMzg7NTsyMDIzODs1OzIwMzM4OzU7MjA0Mzg7NTsyMDUzODs1OzIwNjM4OzU7MjA3Mzg7NTsyMDgzODs1OzIwOTM4OzU7MjEwMzg7NTsyMTEzODs1OzIxMjM4OzU7MjEzMzg7NTsyMTQzODs1OzIxNTM4OzU7MjE2Mzg7NTsyMTczODs1OzIxODM4OzU7MjE5Mzg7NTsyMjAzODs1OzIyMTM4OzU7MjIyMzg7NTsyMjMzODs1OzIyNDM4OzU7MjI1Mzg7NTsyMjYzODs1OzIyNzM4OzU7MjI4Mzg7NTsyMjkzODs1OzIzMDM4OzU7MjMxMzg7NTsyMzIzODs1OzIzMzM4OzU7MjM0Mzg7NTsyMzUzODs1OzIzNjM4OzU7MjM3Mzg7NTsyMzgzODs1OzIzOTM4OzU7MjQwMzg7NTsyNDEzODs1OzI0MjM4OzU7MjQzMzg7NTsyNDQzODs1OzI0NTM4OzU7MjQ2Mzg7NTsyNDczODs1OzI0ODM4OzU7MjQ5Mzg7NTsyNTAzODs1OzI1MTM4OzU7MjUyMzg7NTsyNTMzODs1OzI1NDM4OzU7MjU1NDg7NTswNDg7NTsxNDg7NTsyNDg7NTszNDg7NTs0NDg7NTs1NDg7NTs2NDg7NTs3NDg7NTs4NDg7NTs5NDg7NTsxMDQ4OzU7MTE0ODs1OzEyNDg7NTsxMzQ4OzU7MTQ0ODs1OzE1NDg7NTsxNjQ4OzU7MTc0ODs1OzE4NDg7NTsxOTQ4OzU7MjA0ODs1OzIxNDg7NTsyMjQ4OzU7MjM0ODs1OzI0NDg7NTsyNTQ4OzU7MjY0ODs1OzI3NDg7NTsyODQ4OzU7Mjk0ODs1OzMwNDg7NTszMTQ4OzU7MzI0ODs1OzMzNDg7NTszNDQ4OzU7MzU0ODs1OzM2NDg7NTszNzQ4OzU7Mzg0ODs1OzM5NDg7NTs0MDQ4OzU7NDE0ODs1OzQyNDg7NTs0MzQ4OzU7NDQ0ODs1OzQ1NDg7NTs0NjQ4OzU7NDc0ODs1OzQ4NDg7NTs0OTQ4OzU7NTA0ODs1OzUxNDg7NTs1MjQ4OzU7NTM0ODs1OzU0NDg7NTs1NTQ4OzU7NTY0ODs1OzU3NDg7NTs1ODQ4OzU7NTk0ODs1OzYwNDg7NTs2MTQ4OzU7NjI0ODs1OzYzNDg7NTs2NDQ4OzU7NjU0ODs1OzY2NDg7NTs2NzQ4OzU7Njg0ODs1OzY5NDg7NTs3MDQ4OzU7NzE0ODs1OzcyNDg7NTs3MzQ4OzU7NzQ0ODs1Ozc1NDg7NTs3NjQ4OzU7Nzc0ODs1Ozc4NDg7NTs3OTQ4OzU7ODA0ODs1OzgxNDg7NTs4MjQ4OzU7ODM0ODs1Ozg0NDg7NTs4NTQ4OzU7ODY0ODs1Ozg3NDg7NTs4ODQ4OzU7ODk0ODs1OzkwNDg7NTs5MTQ4OzU7OTI0ODs1OzkzNDg7NTs5NDQ4OzU7OTU0ODs1Ozk2NDg7NTs5NzQ4OzU7OTg0ODs1Ozk5NDg7NTsxMDA0ODs1OzEwMTQ4OzU7MTAyNDg7NTsxMDM0ODs1OzEwNDQ4OzU7MTA1NDg7NTsxMDY0ODs1OzEwNzQ4OzU7MTA4NDg7NTsxMDk0ODs1OzExMDQ4OzU7MTExNDg7NTsxMTI0ODs1OzExMzQ4OzU7MTE0NDg7NTsxMTU0ODs1OzExNjQ4OzU7MTE3NDg7NTsxMTg0ODs1OzExOTQ4OzU7MTIwNDg7NTsxMjE0ODs1OzEyMjQ4OzU7MTIzNDg7NTsxMjQ0ODs1OzEyNTQ4OzU7MTI2NDg7NTsxMjc0ODs1OzEyODQ4OzU7MTI5NDg7NTsxMzA0ODs1OzEzMTQ4OzU7MTMyNDg7NTsxMzM0ODs1OzEzNDQ4OzU7MTM1NDg7NTsxMzY0ODs1OzEzNzQ4OzU7MTM4NDg7NTsxMzk0ODs1OzE0MDQ4OzU7MTQxNDg7NTsxNDI0ODs1OzE0MzQ4OzU7MTQ0NDg7NTsxNDU0ODs1OzE0NjQ4OzU7MTQ3NDg7NTsxNDg0ODs1OzE0OTQ4OzU7MTUwNDg7NTsxNTE0ODs1OzE1MjQ4OzU7MTUzNDg7NTsxNTQ0ODs1OzE1NTQ4OzU7MTU2NDg7NTsxNTc0ODs1OzE1ODQ4OzU7MTU5NDg7NTsxNjA0ODs1OzE2MTQ4OzU7MTYyNDg7NTsxNjM0ODs1OzE2NDQ4OzU7MTY1NDg7NTsxNjY0ODs1OzE2NzQ4OzU7MTY4NDg7NTsxNjk0ODs1OzE3MDQ4OzU7MTcxNDg7NTsxNzI0ODs1OzE3MzQ4OzU7MTc0NDg7NTsxNzU0ODs1OzE3NjQ4OzU7MTc3NDg7NTsxNzg0ODs1OzE3OTQ4OzU7MTgwNDg7NTsxODE0ODs1OzE4MjQ4OzU7MTgzNDg7NTsxODQ0ODs1OzE4NTQ4OzU7MTg2NDg7NTsxODc0ODs1OzE4ODQ4OzU7MTg5NDg7NTsxOTA0ODs1OzE5MTQ4OzU7MTkyNDg7NTsxOTM0ODs1OzE5NDQ4OzU7MTk1NDg7NTsxOTY0ODs1OzE5NzQ4OzU7MTk4NDg7NTsxOTk0ODs1OzIwMDQ4OzU7MjAxNDg7NTsyMDI0ODs1OzIwMzQ4OzU7MjA0NDg7NTsyMDU0ODs1OzIwNjQ4OzU7MjA3NDg7NTsyMDg0ODs1OzIwOTQ4OzU7MjEwNDg7NTsyMTE0ODs1OzIxMjQ4OzU7MjEzNDg7NTsyMTQ0ODs1OzIxNTQ4OzU7MjE2NDg7NTsyMTc0ODs1OzIxODQ4OzU7MjE5NDg7NTsyMjA0ODs1OzIyMTQ4OzU7MjIyNDg7NTsyMjM0ODs1OzIyNDQ4OzU7MjI1NDg7NTsyMjY0ODs1OzIyNzQ4OzU7MjI4NDg7NTsyMjk0ODs1OzIzMDQ4OzU7MjMxNDg7NTsyMzI0ODs1OzIzMzQ4OzU7MjM0NDg7NTsyMzU0ODs1OzIzNjQ4OzU7MjM3NDg7NTsyMzg0ODs1OzIzOTQ4OzU7MjQwNDg7NTsyNDE0ODs1OzI0MjQ4OzU7MjQzNDg7NTsyNDQ0ODs1OzI0NTQ4OzU7MjQ2NDg7NTsyNDc0ODs1OzI0ODQ4OzU7MjQ5NDg7NTsyNTA0ODs1OzI1MTQ4OzU7MjUyNDg7NTsyNTM0ODs1OzI1NDQ4OzU7MjU1Mzg7MjsAAABEtiAABQAAALgPJwABAAAAuA8nAAEAAAA0ODsyOwAAAGS2IAAFAAAAuA8nAAEAAAC4DycAAQAAADMwMzEzMjMzMzQzNTM2MzczOTkwOTE5MjkzOTQ5NTk2OTc0MDQxNDI0MzQ0NDU0NjQ3NDkxMDAxMDExMDIxMDMxMDQxMDUxMDYxMDczODsyOzI0MDsyNDg7MjU1Mzg7MjsyNTA7MjM1OzIxNTM4OzI7MDAwOzI1NTsyNTUzODsyOzEyNzsyNTU7MjEyMzg7MjsyNDA7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyMjAzODsyOzI1NTsyMjg7MTk2Mzg7MjswMDA7MDAwOzAwMDM4OzI7MjU1OzIzNTsyMDUzODsyOzAwMDswMDA7MjU1Mzg7MjsxMzg7MDQzOzIyNjM4OzI7MTY1OzA0MjswNDIzODsyOzIyMjsxODQ7MTM1Mzg7MjswOTU7MTU4OzE2MDM4OzI7MTI3OzI1NTswMDAzODsyOzIxMDsxMDU7MDMwMzg7MjsyNTU7MTI3OzA4MDM4OzI7MTAwOzE0OTsyMzczODsyOzI1NTsyNDg7MjIwMzg7MjsyMjA7MDIwOzA2MDM4OzI7MDAwOzAwMDsxMzkzODsyOzAwMDsxMzk7MTM5Mzg7MjsxODQ7MTM0OzAxMTM4OzI7MTY5OzE2OTsxNjkzODsyOzAwMDsxMDA7MDAwMzg7MjsxODk7MTgzOzEwNzM4OzI7MTM5OzAwMDsxMzkzODsyOzA4NTsxMDc7MDQ3Mzg7MjsyNTU7MTQwOzAwMDM4OzI7MTUzOzA1MDsyMDQzODsyOzEzOTswMDA7MDAwMzg7MjsyMzM7MTUwOzEyMjM4OzI7MTQzOzE4ODsxNDMzODsyOzA3MjswNjE7MTM5Mzg7MjswNDc7MDc5OzA3OTM4OzI7MDAwOzIwNjsyMDkzODsyOzE0ODswMDA7MjExMzg7MjsyNTU7MDIwOzE0NzM4OzI7MDAwOzE5MTsyNTUzODsyOzEwNTsxMDU7MTA1Mzg7MjswMzA7MTQ0OzI1NTM4OzI7MTc4OzAzNDswMzQzODsyOzI1NTsyNTA7MjQwMzg7MjswMzQ7MTM5OzAzNDM4OzI7MjU1OzAwMDsyNTUzODsyOzIyMDsyMjA7MjIwMzg7MjsyNDg7MjQ4OzI1NTM4OzI7MjU1OzIxNTswMDAzODsyOzIxODsxNjU7MDMyMzg7MjsxMjg7MTI4OzEyODM4OzI7MDAwOzEyODswMDAzODsyOzE3MzsyNTU7MDQ3Mzg7MjsyNDA7MjU1OzI0MDM4OzI7MjU1OzEwNTsxODAzODsyOzIwNTswOTI7MDkyMzg7MjswNzU7MDAwOzEzMDM4OzI7MjU1OzI1NTsyNDAzODsyOzI0MDsyMzA7MTQwMzg7MjsyMzA7MjMwOzI1MDM4OzI7MjU1OzI0MDsyNDUzODsyOzEyNDsyNTI7MDAwMzg7MjsyNTU7MjUwOzIwNTM4OzI7MTczOzIxNjsyMzAzODsyOzI0MDsxMjg7MTI4Mzg7MjsyMjQ7MjU1OzI1NTM4OzI7MjUwOzI1MDsyMTAzODsyOzIxMTsyMTE7MjExMzg7MjsxNDQ7MjM4OzE0NDM4OzI7MjU1OzE4MjsxOTMzODsyOzI1NTsxNjA7MTIyMzg7MjswMzI7MTc4OzE3MDM4OzI7MTM1OzIwNjsyNTAzODsyOzExOTsxMzY7MTUzMzg7MjsxNzY7MTk2OzIyMjM4OzI7MjU1OzI1NTsyMjQzODsyOzAwMDsyNTU7MDAwMzg7MjswNTA7MjA1OzA1MDM4OzI7MjUwOzI0MDsyMzAzODsyOzEyODswMDA7MDAwMzg7MjsxMDI7MjA1OzE3MDM4OzI7MDAwOzAwMDsyMDUzODsyOzE4NjswODU7MjExMzg7MjsxNDc7MTEyOzIxOTM4OzI7MDYwOzE3OTsxMTMzODsyOzEyMzsxMDQ7MjM4Mzg7MjswMDA7MjUwOzE1NDM4OzI7MDcyOzIwOTsyMDQzODsyOzE5OTswMjE7MTMzMzg7MjswMjU7MDI1OzExMjM4OzI7MjQ1OzI1NTsyNTAzODsyOzI1NTsyMjg7MjI1Mzg7MjsyNTU7MjI4OzE4MTM4OzI7MjU1OzIyMjsxNzMzODsyOzAwMDswMDA7MTI4Mzg7MjsyNTM7MjQ1OzIzMDM4OzI7MTI4OzEyODswMDAzODsyOzEwNzsxNDI7MDM1Mzg7MjsyNTU7MTY1OzAwMDM4OzI7MjU1OzA2OTswMDAzODsyOzIxODsxMTI7MjE0Mzg7MjsyMzg7MjMyOzE3MDM4OzI7MTUyOzI1MTsxNTIzODsyOzE3NTsyMzg7MjM4Mzg7MjsyMTk7MTEyOzE0NzM4OzI7MjU1OzIzOTsyMTMzODsyOzI1NTsyMTg7MTg1Mzg7MjsyMDU7MTMzOzA2MzM4OzI7MjU1OzE5MjsyMDMzODsyOzIyMTsxNjA7MjIxMzg7MjsxNzY7MjI0OzIzMDM4OzI7MTI4OzAwMDsxMjgzODsyOzEwMjswNTE7MTUzMzg7MjsyNTU7MDAwOzAwMDM4OzI7MTg4OzE0MzsxNDMzODsyOzA2NTsxMDU7MjI1Mzg7MjsxMzk7MDY5OzAxOTM4OzI7MjUwOzEyODsxMTQzODsyOzI0NDsxNjQ7MDk2Mzg7MjswNDY7MTM5OzA4NzM4OzI7MjU1OzI0NTsyMzgzODsyOzE2MDswODI7MDQ1Mzg7MjsxOTI7MTkyOzE5MjM4OzI7MTM1OzIwNjsyMzUzODsyOzEwNjswOTA7MjA1Mzg7MjsxMTI7MTI4OzE0NDM4OzI7MjU1OzI1MDsyNTAzODsyOzAwMDsyNTU7MTI3Mzg7MjswNzA7MTMwOzE4MDM4OzI7MjEwOzE4MDsxNDAzODsyOzAwMDsxMjg7MTI4Mzg7MjsyMTY7MTkxOzIxNjM4OzI7MjU1OzA5OTswNzEzODsyOzA2NDsyMjQ7MjA4Mzg7MjsyMzg7MTMwOzIzODM4OzI7MjQ1OzIyMjsxNzkzODsyOzI1NTsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzI0NTM4OzI7MjU1OzI1NTswMDAzODsyOzE1NDsyMDU7MDUwNDg7MjsyNDA7MjQ4OzI1NTQ4OzI7MjUwOzIzNTsyMTU0ODsyOzAwMDsyNTU7MjU1NDg7MjsxMjc7MjU1OzIxMjQ4OzI7MjQwOzI1NTsyNTU0ODsyOzI0NTsyNDU7MjIwNDg7MjsyNTU7MjI4OzE5NjQ4OzI7MDAwOzAwMDswMDA0ODsyOzI1NTsyMzU7MjA1NDg7MjswMDA7MDAwOzI1NTQ4OzI7MTM4OzA0MzsyMjY0ODsyOzE2NTswNDI7MDQyNDg7MjsyMjI7MTg0OzEzNTQ4OzI7MDk1OzE1ODsxNjA0ODsyOzEyNzsyNTU7MDAwNDg7MjsyMTA7MTA1OzAzMDQ4OzI7MjU1OzEyNzswODA0ODsyOzEwMDsxNDk7MjM3NDg7MjsyNTU7MjQ4OzIyMDQ4OzI7MjIwOzAyMDswNjA0ODsyOzAwMDswMDA7MTM5NDg7MjswMDA7MTM5OzEzOTQ4OzI7MTg0OzEzNDswMTE0ODsyOzE2OTsxNjk7MTY5NDg7MjswMDA7MTAwOzAwMDQ4OzI7MTg5OzE4MzsxMDc0ODsyOzEzOTswMDA7MTM5NDg7MjswODU7MTA3OzA0NzQ4OzI7MjU1OzE0MDswMDA0ODsyOzE1MzswNTA7MjA0NDg7MjsxMzk7MDAwOzAwMDQ4OzI7MjMzOzE1MDsxMjI0ODsyOzE0MzsxODg7MTQzNDg7MjswNzI7MDYxOzEzOTQ4OzI7MDQ3OzA3OTswNzk0ODsyOzAwMDsyMDY7MjA5NDg7MjsxNDg7MDAwOzIxMTQ4OzI7MjU1OzAyMDsxNDc0ODsyOzAwMDsxOTE7MjU1NDg7MjsxMDU7MTA1OzEwNTQ4OzI7MDMwOzE0NDsyNTU0ODsyOzE3ODswMzQ7MDM0NDg7MjsyNTU7MjUwOzI0MDQ4OzI7MDM0OzEzOTswMzQ0ODsyOzI1NTswMDA7MjU1NDg7MjsyMjA7MjIwOzIyMDQ4OzI7MjQ4OzI0ODsyNTU0ODsyOzI1NTsyMTU7MDAwNDg7MjsyMTg7MTY1OzAzMjQ4OzI7MTI4OzEyODsxMjg0ODsyOzAwMDsxMjg7MDAwNDg7MjsxNzM7MjU1OzA0NzQ4OzI7MjQwOzI1NTsyNDA0ODsyOzI1NTsxMDU7MTgwNDg7MjsyMDU7MDkyOzA5MjQ4OzI7MDc1OzAwMDsxMzA0ODsyOzI1NTsyNTU7MjQwNDg7MjsyNDA7MjMwOzE0MDQ4OzI7MjMwOzIzMDsyNTA0ODsyOzI1NTsyNDA7MjQ1NDg7MjsxMjQ7MjUyOzAwMDQ4OzI7MjU1OzI1MDsyMDU0ODsyOzE3MzsyMTY7MjMwNDg7MjsyNDA7MTI4OzEyODQ4OzI7MjI0OzI1NTsyNTU0ODsyOzI1MDsyNTA7MjEwNDg7MjsyMTE7MjExOzIxMTQ4OzI7MTQ0OzIzODsxNDQ0ODsyOzI1NTsxODI7MTkzNDg7MjsyNTU7MTYwOzEyMjQ4OzI7MDMyOzE3ODsxNzA0ODsyOzEzNTsyMDY7MjUwNDg7MjsxMTk7MTM2OzE1MzQ4OzI7MTc2OzE5NjsyMjI0ODsyOzI1NTsyNTU7MjI0NDg7MjswMDA7MjU1OzAwMDQ4OzI7MDUwOzIwNTswNTA0ODsyOzI1MDsyNDA7MjMwNDg7MjsxMjg7MDAwOzAwMDQ4OzI7MTAyOzIwNTsxNzA0ODsyOzAwMDswMDA7MjA1NDg7MjsxODY7MDg1OzIxMTQ4OzI7MTQ3OzExMjsyMTk0ODsyOzA2MDsxNzk7MTEzNDg7MjsxMjM7MTA0OzIzODQ4OzI7MDAwOzI1MDsxNTQ0ODsyOzA3MjsyMDk7MjA0NDg7MjsxOTk7MDIxOzEzMzQ4OzI7MDI1OzAyNTsxMTI0ODsyOzI0NTsyNTU7MjUwNDg7MjsyNTU7MjI4OzIyNTQ4OzI7MjU1OzIyODsxODE0ODsyOzI1NTsyMjI7MTczNDg7MjswMDA7MDAwOzEyODQ4OzI7MjUzOzI0NTsyMzA0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ZmEvY29udGlndW91cy5ycwAAACzaIABtAAAAcQIAABYAAAAs2iAAbQAAAHMCAAANAAAALNogAG0AAAB1AgAADQAAACzaIABtAAAAKQIAAAkAAAAs2iAAbQAAAE8CAAANAAAALNogAG0AAABKAgAADQAAAGQIIQBwAAAAMgEAACEAAAAyBQAABAAAAAQAAAAzBQAAAAAAAAgAAAAEAAAANAUAAAAAAAAEAAAABAAAADUFAAAAAAAAAQAAAAEAAACFAAAAAAAAAAQAAAAEAAAAeAAAAAAAAAAEAAAABAAAAKcAAABtaW5pbXVtX2xlbm1heGltdW1fbGVubG9va19zZXRsb29rX3NldF9wcmVmaXhsb29rX3NldF9zdWZmaXhsb29rX3NldF9wcmVmaXhfYW55bG9va19zZXRfc3VmZml4X2FueXV0ZjhleHBsaWNpdF9jYXB0dXJlc19sZW5zdGF0aWNfZXhwbGljaXRfY2FwdHVyZXNfbGVubGl0ZXJhbGFsdGVybmF0aW9uX2xpdGVyYWwAAABs2yAACwAAAHfbIAALAAAAgtsgAAgAAACK2yAADwAAAJnbIAAPAAAAqNsgABMAAAC72yAAEwAAAM7bIAAEAAAA0tsgABUAAADn2yAAHAAAAAPcIAAHAAAACtwgABMAAABQcm9wZXJ0aWVzSVNlYXJjaGVycGF0dGVybnNyYWJpbmthcnBzZWFyY2hfa2luZFRlZGR5UmFiaW5LYXJwL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9kZmEucnMAvdwgAGIAAADhAAAAEwAAAL3cIABiAAAABQEAABoAAAC93CAAYgAAAB0BAAAVAAAAvdwgAGIAAAAdAQAAHQAAAL3cIABiAAAAFgEAABUAAABJbnZhbGlkSW5wdXRBbmNob3JlZEludmFsaWRJbnB1dFVuYW5jaG9yZWRVbnN1cHBvcnRlZFN0cmVhbVVuc3VwcG9ydGVkT3ZlcmxhcHBpbmdVbnN1cHBvcnRlZEVtcHR5YnVja2V0c2hhc2hfbGVuaGFzaF8ycG93L3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm94ZWQucnMA6d0gAEoAAADpBgAAHwAAACzaIABtAAAAxQAAABwAAAAs2iAAbQAAAN0AAAAZAAAALNogAG0AAADdAAAAIgAAACzaIABtAAAA6gAAAC0AAAAs2iAAbQAAAOcAAAAtAAAALNogAG0AAADkAAAALQAAACzaIABtAAAA4QAAAC0AAAAs2iAAbQAAANQAAAApAAAALNogAG0AAADOAAAAKQAAACzaIABtAAAA9QAAACAAAAAs2iAAbQAAABoBAAAaAAAALNogAG0AAAAwAQAAFwAAACzaIABtAAAAKQEAADcAAABkCCEAcAAAAJkCAAAaAAAAZAghAHAAAACtAgAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9tZXRhL3JldmVyc2VfaW5uZXIucnMANN8gAHMAAABLAAAAGgAAADTfIABzAAAAXAAAADAAAAAAAAAAAQAAAAEAAACZAAAANgUAADcFAAA4BQAAOQUAAAAAAAACAAAAAQAAAJwAAAA6BQAAOwUAADgFAAA5BQAAAAAAAAMAAAABAAAAnQAAADwFAAA9BQAAOAUAADkFAAA+BQAASAAAAAgAAACeAAAAPwUAAEAFAABBBQAA4AQAAEIFAACQAQAABAAAAJ8AAABDBQAARAUAAEUFAABGBQAAAAAAAAABAAABAAAApQAAAEcFAABIBQAAOAUAAEkFAABKBQAADAAAAAQAAACoAAAASwUAAEwFAABNBQAAwAQAAEFob0NvcmFzaWNrYWNNZW1jaHJNZW1jaHIyTWVtY2hyM01lbW1lbWZpbmRlcnNlYXJjaGVyYW5jaG9yZWRfYWNQcmVmaWx0ZXJpc19mYXN0bWF4X25lZWRsZV9sZW5RdWl0Ynl0ZUdhdmVVcEhheXN0YWNrVG9vTG9uZ2xlblVuc3VwcG9ydGVkQW5jaG9yZWRtb2RlAAAAAAAAAAgAAAAIAAAATgUAACgBIQBuAAAA2QAAADIAAAAoASEAbgAAAJEIAAAJAAAAKAEhAG4AAACSCAAACQAAACgBIQBuAAAAkwgAAAkAAAAoASEAbgAAAJoIAAAaAAAAKAEhAG4AAACbCAAAHAAAACgBIQBuAAAAnAgAABwAAAAoASEAbgAAALUIAAAoAAAAKAEhAG4AAAC7CAAAIgAAACgBIQBuAAAAwAgAAB8AAAAoASEAbgAAAMAIAAAlAAAAKAEhAG4AAADKCAAAHwAAACgBIQBuAAAAyggAACUAAAAoASEAbgAAANAIAAAJAAAAKAEhAG4AAADSCAAAOAAAACgBIQBuAAAA0ggAAAkAAAAoASEAbgAAAPAIAABBAAAAR3JvdXBJbmZvVG9vTWFueVBhdHRlcm5zZXJyVG9vTWFueUdyb3Vwc3BhdHRlcm5taW5pbXVtTWlzc2luZ0dyb3Vwc0ZpcnN0TXVzdEJlVW5uYW1lZER1cGxpY2F0ZQAAAAAAAAAAAAABAAAATwUAAGVycm9yIGJ1aWxkaW5nIE5GQWludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGZvdW5kIGltcG9zc2libGUgZXJyb3IgaW4gbWV0YSBlbmdpbmU6IADi4iAAUQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9tZXRhL2Vycm9yLnJzADzjIABrAAAA7QAAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL21hcC5ycwAAALjjIABxAAAAiQAAABwAAAC44yAAcQAAAIIAAAAYAAAAuOMgAHEAAACWAAAACQAAALjjIABxAAAAnwAAAB4AAAC44yAAcQAAALYAAAARAAAAuOMgAHEAAAD4AAAAHAAAALjjIABxAAAA9AAAABgAAAC44yAAcQAAAAgBAAAJAAAAuOMgAHEAAAAUAQAAHgAAALjjIABxAAAAJQEAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdl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IGZhaWxlZDogc3RhY2suaXNfZW1wdHkoKS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL2RldGVybWluaXplL21vZC5ycwA27CAAdQAAAHgBAAAFAAAANuwgAHUAAACAAQAACwAAADbsIAB1AAAApAEAABsAAABTbWFsbEluZGV4UGF0dGVybklEL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwDv7CAAcAAAAPECAAABAAAAUGF0dGVybklERXJyb3JTdGF0ZUlEAAAA7+wgAHAAAADyAgAAAQAAAAAAAAAAAAAAAQAAAFAFAABQHycASQAAABcIAAApAAAAUmVnZXhJbmZvSXByb3BzX3VuaW9uAAAAAAAAAAEAAAABAAAA3gAAAAAAAAABAAAAAQAAAFEFAABSBQAAEAAAAAQAAADaAAAAAAAAAAEAAAABAAAAUwUAAAAAAAAIAAAABAAAAFQFAAAAAAAACAAAAAQAAAA0BQAAAAAAAAQAAAAEAAAARwAAAHV0ZjhfZW1wdHlhdXRvcHJld2hpY2hfY2FwdHVyZXNuZmFfc2l6ZV9saW1pdG9uZXBhc3Nfc2l6ZV9saW1pdGh5YnJpZF9jYWNoZV9jYXBhY2l0eWh5YnJpZGRmYWRmYV9zaXplX2xpbWl0ZGZhX3N0YXRlX2xpbWl0b25lcGFzc2JhY2t0cmFja2xpbmVfdGVybWluYXRvcgAAAPobIQAKAAAAQO4gAAoAAABK7iAABwAAAAQcIQADAAAAUe4gAA4AAABf7iAADgAAAG3uIAASAAAAf+4gABUAAACU7iAABgAAAJruIAADAAAAne4gAA4AAACr7iAADwAAALruIAAHAAAAwe4gAAkAAADvBiEADAAAAMruIAAPAAAAR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhAAAAAAAAAAAAAQAAAE8FAAB3RCYAcAAAALwAAAAqAAAAd0QmAHAAAAC5AAAAKgAAAHdEJgBwAAAAOgAAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjUvc3JjL21lbW1lbS9zZWFyY2hlci5yc9zvIABoAAAAdAIAABsAAADYASEAawAAAMcEAAAeAAAA2AEhAGsAAADpBQAAHgAAAG5vIHF1aXQgaW4gc3RhcnQgd2l0aG91dCBsb29rLWJlaGluZNgBIQBrAAAARQYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBpZC5pc19tYXRjaCgpANgBIQBrAAAAtQYAAAkAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gdXBkYXRlANgBIQBrAAAAtwcAACQAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gZmluaXNoANgBIQBrAAAAwwcAACIAAADYASEAawAAAI4KAAAdAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL2h5YnJpZC9zZWFyY2gucnMAAEjxIABuAAAAWQAAACkAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzaWQgYmVpbmcgdW5rbm93biBpcyBhIGJ1Z8jxIABEAAAASPEgAG4AAAAdAQAAEQAAAEjxIABuAAAAGgEAAC0AAABI8SAAbgAAAFcBAAApAAAASPEgAG4AAACtAQAAEQAAAEjxIABuAAAAqgEAAC0AAABI8SAAbgAAAPsBAAAlAAAASPEgAG4AAAAiAgAAEQAAAEjxIABuAAAAHQIAABUAAABI8SAAbgAAAOICAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvbGltaXRlZC5ycwAAAKTyIABtAAAAjgAAACUAAACk8iAAbQAAAOgAAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvc3RvcGF0LnJzNPMgAGwAAABuAAAAJQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL3dpcmUucnMAALDzIABqAAAAVwIAAA4AAACw8yAAagAAAHgDAAAMAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvZW1wdHkucnMAPPQgAGsAAAD5AAAAOgAAAAAAAAAIAAAABAAAAFUFAAAAAAAABAAAAAQAAAB4AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvd3JhcHBlcnMucnMAANj0IABuAAAAiQAAABkAAADY9CAAbgAAAEUBAAAdAAAA2PQgAG4AAAD7AQAAHQAAANj0IABuAAAAHwMAAB0AAADY9CAAbgAAACwEAAANAAAA2PQgAG4AAAC0BAAAHQAAANj0IABuAAAARAUAAA0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL2JhY2t0cmFjay5ycwC49SAAdwAAAJkFAAAVAAAAuPUgAHcAAACiBQAAGgAAALj1IAB3AAAAAQYAACEAAAC49SAAdwAAAAUGAAAlAAAAuPUgAHcAAAAhBwAAFwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL2VzY2FwZS5yc4D2IABsAAAAKAAAAD0AAACA9iAAbAAAACUAAAANAAAAVgUAAGAAAAAQAAAAVwUAAPcEAAAEAAAABAAAAI0AAAAAAAAAIAAAABAAAABYBQAAAAAAAAEAAAABAAAA3gAAAFIFAAAQAAAABAAAANoAAAAAAAAAAQAAAAEAAABRBQAAAAAAADAAAAAQAAAAWQUAAAAAAAAIAAAABAAAADQFAAAAAAAACAAAAAQAAABUBQAAZm9yd2FyZHJldmVyc2VQaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzRW5naW5lSHlicmlkRW5naW5lREZBRW5naW5lUmV2ZXJzZUh5YnJpZEVuZ2luZVJldmVyc2VERkFSZXZlcnNlREZBRW5naW5ldmlzaXRlZF9jYXBhY2l0eUJvdW5kZWRCYWNrdHJhY2tlcgAAAAAACAAAAAQAAABaBQAAAAAAAAQAAAAEAAAAWwUAAAAAAAAEAAAABAAAAFwFAABQcm9wZXJ0aWVzL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvcmVnZXgucnMAAAB6+CAAawAAAIgHAAATAAAAevggAGsAAABvDQAAEgAAAHr4IABrAAAAZQ0AABIAAABdBQAACAAAAAQAAABeBQAAXwUAAF8FAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL2xpdGVyYWxfdHJpZS5ycwAAMPkgAHoAAAB0AAAAFAAAADD5IAB6AAAAgQAAACEAAAAw+SAAegAAAIkAAAAdAAAAMPkgAHoAAACOAAAALwAAADD5IAB6AAAArAAAACwAAAAw+SAAegAAAK8AAAAfAAAAMPkgAHoAAAC2AAAAHgAAADD5IAB6AAAAvwAAABsAAAAw+SAAegAAAMAAAAAwAAAAMPkgAHoAAACwAAAAHgAAADD5IAB6AAAAzgAAABkAAAAw+SAAegAAANUAAAAZAAAAMPkgAHoAAADnAAAALgAAADD5IAB6AAAASQEAACMAAAAw+SAAegAAAIABAAAVAAAAMPkgAHoAAACYAQAAGgAAADD5IAB6AAAAxwEAACoAAABhc3NlcnRpb24gZmFpbGVkOiBtLmlzX2VtcHR5KCkAAKnyJgBqAAAApQIAAAkAAACp8iYAagAAAKYCAABAAAAAUGF0dGVyblNldCBzaG91bGQgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5AADM8yYAbAAAAMsEAAAOAAAAcXVpdCBzZWFyY2ggYWZ0ZXIgb2JzZXJ2aW5nIGJ5dGUgIGF0IG9mZnNldCA4+yAAIQAAAFn7IAALAAAAZ2F2ZSB1cCBzZWFyY2hpbmcgYXQgb2Zmc2V0IHT7IAAcAAAAaGF5c3RhY2sgb2YgbGVuZ3RoICBpcyB0b28gbG9uZwCY+yAAEwAAAKv7IAAMAAAAdW5hbmNob3JlZCBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkYW5jaG9yZWQgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZGFuY2hvcmVkIHNlYXJjaGVzIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gKCkgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZAAAJvwgACoAAABQ/CAAHgAAAFBhdHRlcm5TZXRJbnNlcnRFcnJvcmNhcGFjaXR5Tm9ZZXNQYXR0ZXJuAAAAAAAAAAgAAAAIAAAATgUAAFN0YW5kYXJkTGVmdG1vc3RGaXJzdExlZnRtb3N0TG9uZ2VzdC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vYnVpbGRlci5yc211c3QgY2FsbCAnZmluaXNoX3BhdHRlcm4nIGZpcnN0AAAAVf0gACAAAADg/CAAdQAAAJ8BAAAJAAAA4PwgAHUAAAAwAgAAHAAAAOD8IAB1AAAAMgIAABgAAADg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Yy9zcmMvYm94ZWQvY29udmVydC5ycwABCCEAUgAAAFIAAAATAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvbm9uY29udGlndW91cy5yc2QIIQBwAAAAIgEAACAAAABkCCEAcAAAAFQBAAAdAAAAZAghAHAAAABmAQAAFwAAAGV4cGVjdGVkIG51bWJlciBvZiBwYXR0ZXJucyB0byBtYXRjaCBwYXR0ZXJuIElEAAQJIQAvAAAAZAghAHAAAAA0BAAADQAAAGQIIQBwAAAAOQQAACMAAABkCCEAcAAAAFUEAAA5AAAAZAghAHAAAADKAwAAGQAAAGQIIQBwAAAAywMAABoAAABkCCEAcAAAAM8DAAAYAAAAZAghAHAAAADjAwAAGQAAAGQIIQBwAAAAFgQAABkAAABkCCEAcAAAABcEAAAYAAAAZAghAHAAAAAYBAAAGgAAAGQIIQBwAAAAGQQAAB8AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvc2VhcmNoLnJzAADsCSEAagAAAE4BAAAJAAAAaW52YWxpZCBtYXRjaCBzcGFuAABoCiEAEgAAAOwJIQBqAAAAWwMAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9hcGkucnMAAACUCiEAaQAAABkCAAAcAAAAlAohAGkAAAAfAgAAMQAAADIFAAAEAAAABAAAADMFAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvYnl0ZXNldC5ycwAwCyEAdwAAACMAAAARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcHJlZmlsdGVyL21lbWNoci5ycwAAuAshAHYAAAAnAAAALQAAALgLIQB2AAAAVQAAABYAAAC4CyEAdgAAAFYAAAAWAAAAuAshAHYAAABkAAAANgAAALgLIQB2AAAAkgAAABYAAAC4CyEAdgAAAJMAAAAWAAAAuAshAHYAAACUAAAAFgAAALgLIQB2AAAAogAAAD4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvbWVtbWVtLnJzAACwDCEAdgAAACsAAAAnAAAAsAwhAHYAAAA7AAAAGAAAAGFoby1jb3Jhc2ljayBERkEgc2hvdWxkIG5ldmVyIGZhaWwvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvdGVkZHkucnMAag0hAHUAAABxAAAAEgAAAHJlZ2V4OiB0aHJlYWQgSUQgYWxsb2NhdGlvbiBzcGFjZSBleGhhdXN0ZWQA8A0hACsAAABs+yYAagAAAF4BAAARAAAAAAAAAAAAAAABAAAATwUAAFRyeUZyb21JbnRFcnJvci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vY29tcGlsZXIucnMAAABTDiEAdgAAALUDAAAWAAAAUw4hAHYAAAC2AwAAFgAAAFMOIQB2AAAA3QMAAA4AAABTDiEAdgAAADAEAAAoAAAAUw4hAHYAAAAsBAAAFgAAAFMOIQB2AAAARQUAABkAAABTDiEAdgAAAEcFAAATAAAAUw4hAHYAAACdBQAALAAAAFMOIQB2AAAAngUAADIAAABTDiEAdgAAAIUFAAAwAAAAUw4hAHYAAACOBQAAMAAAAFMOIQB2AAAAjwUAADYAAABTDiEAdgAAAGYFAAAdAAAAUw4hAHYAAABsBQAAPwAAAFMOIQB2AAAAbQUAADsAAABTDiEAdgAAAGoFAAAXAAAAUw4hAHYAAADtBQAAKgAAAFMOIQB2AAAATwYAABYAAABTDiEAdgAAAFMGAAAWAAAAUw4hAHYAAABaBgAAFgAAAFMOIQB2AAAAXgYAABYAAABTDiEAdgAAAGIGAAAWAAAAUw4hAHYAAABtBgAAFgAAAFMOIQB2AAAAdAYAABYAAABTDiEAdgAAAHgGAAAWAAAAUw4hAHYAAAB8BgAAFgAAAFMOIQB2AAAAhQYAABYAAABTDiEAdgAAAJAGAAAWAAAAUw4hAHYAAACUBgAAFgAAAFMOIQB2AAAAmAYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBwcmVmaXhfbGVuIDwgcmFuZ2VzLmxlbigpAFMOIQB2AAAA/gYAAAkAAABub24tZW1wdHkgbm9kZXMAUw4hAHYAAAAiBwAADgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3RhdGUudW5jb21waWxlZFtsYXN0XS5sYXN0LmlzX25vbmUoKVMOIQB2AAAAIwcAAAkAAABTDiEAdgAAACkHAAAjAAAAUw4hAHYAAAAxBwAAHwAAAFMOIQB2AAAANQcAADoAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLnN0YXRlLnVuY29tcGlsZWRbMF0ubGFzdC5pc19ub25lKCkAAABTDiEAdgAAADwHAAAJAAAAUw4hAHYAAAA9BwAAJQAAAFMOIQB2AAAAOwcAAAkAAABTDiEAdgAAAEYHAAAOAAAAUw4hAHYAAABOBwAAGAAAAEFsbEltcGxpY2l0AIAEAAAEAAAABAAAAIEEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbWV0YS9saXRlcmFsLnJzAAAALBIhAG0AAAAeAAAADQAAACwSIQBtAAAAPgAAAA4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgvBIhAEAAAAAsEiEAbQAAADgAAAAeAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCAAABQTIQBKAAAALBIhAG0AAAA8AAAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vbmZhLnJzAAAAeBMhAHEAAAB5AgAAFwAAAHgTIQBxAAAAgwcAABQAAAAAAAAAAAAAAAAAAAACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL25mYS90aG9tcHNvbi9waWtldm0ucnMcFCEAdAAAAIUEAAAKAAAAYnl0ZSBzbGljZSBsZW5ndGhzIG11c3QgYmUgbGVzcyB0aGFuIHVzaXplIE1BWAAAoBQhAC4AAAAcFCEAdAAAANgEAAAJAAAAHBQhAHQAAACHBQAACQAAABwUIQB0AAAAzAUAABMAAAAcFCEAdAAAAFgGAAAPAAAAHBQhAHQAAABcBgAAHwAAABwUIQB0AAAAwQYAABsAAAAcFCEAdAAAAMoGAAAfAAAAHBQhAHQAAADPBgAARgAAABwUIQB0AAAAnAYAADQAAABzbG90IHRhYmxlIGxlbmd0aCBkb2Vzbid0IG92ZXJmbG93AAAcFCEAdAAAAD0IAAAOAAAAHBQhAHQAAABlCAAAGAAAABwUIQB0AAAAbggAABgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9sb29rLnJzAAC8FSEAagAAAMsBAAAsAAAAvBUhAGoAAADYAQAACQAAALwVIQBq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AAAAYgQAADEAAAAgKiEAagAAAGoEAAAXAAAAICohAGoAAADRBAAADwAAACAqIQBqAAAAZwYAABgAAAAgKiEAagAAAHQGAAATAAAAICohAGoAAABtBgAAGgAAACAqIQBqAAAAnAYAABgAAAAgKiEAagAAAKoGAAATAAAAICohAGoAAACjBgAAGgAAACAqIQBqAAAAeAcAABEAAAAFAAAACgAAAAQAAAAKAAAAAwAAAEAAAAACAAAAQAAAAAEAAAAKAAAAICohAGoAAADOCAAAFQAAACAqIQBqAAAA3ggAACgAAAAgKiEAagAAAPIIAAAVAAAAICohAGoAAADiCAAAHgAAACAqIQBqAAAA5AgAACcAAAAgKiEAagAAAOQIAAAzAAAAICohAGoAAADlCAAANAAAACAqIQBqAAAA6wgAACAAAAAgKiEAagAAAOsIAAAtAAAAICohAGoAAAACCQAAFQAAACAqIQBqAAAAAwkAABYAAAA3NDMyMTAvLi1n8kJD5SwrKikoJyYlJCMiITggHx4dHP+UpJWIoJut3d6GeujK1+DQ3My7t7OxqLLI4sOauK5+eL+dwqq9oqGWwY6Jq7C5p7pwr8C8nIyPe4WAk4qSct+X+dju7P3j2ub3h7Tx6fb054v18/vrycTw1pi2zbV/G9TT0tXkxamfg6xpUGJgYVHPkXRzkIKZeWuEbW58b1Jsdo1xgXd9pXVcalNIY11BT6bto8e+4dHLxtnbzur4nu//////////////////////////////////////////////////////////////////////////////////////dHJpZWQgdG8gdW53cmFwIGV4cHIgZnJvbSBIaXJGcmFtZSwgZ290OiAAAADYLSEAKQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNS9zcmMvaGlyL3RyYW5zbGF0ZS5ycwwuIQBsAAAAAQEAABIAAAB0cmllZCB0byB1bndyYXAgVW5pY29kZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAiC4hADIAAAAMLiEAbAAAAAoBAAASAAAAdHJpZWQgdG8gdW53cmFwIGJ5dGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAA1C4hAC8AAAAMLiEAbAAAABcBAAASAAAAdHJpZWQgdG8gdW53cmFwIHJlcGV0aXRpb24gZnJvbSBIaXJGcmFtZSwgZ290OiAAHC8hAC8AAAAMLiEAbAAAACUBAAARAAAAdHJpZWQgdG8gdW53cmFwIGdyb3VwIGZyb20gSGlyRnJhbWUsIGdvdDogAABkLyEAKgAAAAwuIQBsAAAANAEAABEAAAB0cmllZCB0byB1bndyYXAgYWx0IHBpcGUgZnJvbSBIaXJGcmFtZSwgZ290OiAAAACoLyEALQAAAAwuIQBsAAAAPwEAABEAAAAMLiEAbAAAAE4BAAAnAAAADC4hAGwAAABPAQAAFwAAAAwuIQBsAAAATgEAAAkAAAAMLiEAbAAAAKwBAAAuAAAADC4hAGwAAACjAQAALgAAAAwuIQBsAAAAtwEAACcAAAAMLiEAbAAAALgBAAAcAAAADC4hAGwAAAC8AQAAJwAAAAwuIQBsAAAAvQEAACwAAAAMLiEAbAAAAM4BAAAgAAAADC4hAGwAAADPAQAAGwAAAAwuIQBsAAAAxQEAAB8AAAAMLiEAbAAAAP4BAAAuAAAADC4hAGwAAAD6AQAALgAAAAwuIQBsAAAACgIAAC4AAAAMLiEAbAAAAAYCAAAuAAAADC4hAGwAAAAZAgAALgAAAAwuIQBsAAAAFAIAAC4AAAAMLiEAbAAAACACAAAqAAAADC4hAGwAAAAsAgAALgAAAAwuIQBsAAAAJwIAAC4AAAAMLiEAbAAAAD4CAAAvAAAADC4hAGwAAABFAgAALwAAAAwuIQBsAAAAMwIAAC8AAAAMLiEAbAAAADoCAAAvAAAADC4hAGwAAACMAgAAJgAAAAwuIQBsAAAAjQIAACYAAAAMLiEAbAAAAI4CAAAmAAAADC4hAGwAAABzAgAAJgAAAAwuIQBsAAAAdAIAACYAAAAMLiEAbAAAAHUCAAAmAAAADC4hAGwAAAC4AgAAHAAAAAwuIQBsAAAAuAIAACkAAAAMLiEAbAAAAMMCAAAsAAAADC4hAGwAAADHAgAAEwAAAAwuIQBsAAAA0QIAACwAAAAMLiEAbAAAANMCAAAVAAAADC4hAGwAAADVAgAAEwAAAAwuIQBsAAAA2wIAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IFVuaWNvZGUgY2xhc3NgMiEAVAAAAAwuIQBsAAAA6QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGJ5dGUgY2xhc3MAAADMMiEAUQAAAAwuIQBsAAAA7AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IHJlcGV0aXRpb24AAAA4MyEAUQAAAAwuIQBsAAAA7wIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGdyb3VwpDMhAEwAAAAMLiEAbAAAAPICAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgbWFya2VyAAAACDQhAFEAAAAMLiEAbAAAAPUCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcnQ0IQBYAAAADC4hAGwAAAD4AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgVW5pY29kZSBjbGFzcwAAAOQ0IQBRAAAADC4hAGwAAAAIAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYnl0ZSBjbGFzcwAAUDUhAE4AAAAMLiEAbAAAAAsDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCByZXBldGl0aW9uAAC4NSEATgAAAAwuIQBsAAAADgMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGdyb3VwAAAAIDYhAEkAAAAMLiEAbAAAABEDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBjb25jYXQgbWFya2VyAAAAhDYhAFEAAAAMLiEAbAAAABQDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgAAAPA2IQBVAAAADC4hAGwAAAAXAwAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuZmxhZ3MoKS51bmljb2RlKCkMLiEAbAAAAEMEAAAJAAAABQxhc3NlcnRpb24gZmFpbGVkOiAhc2VsZi5mbGFncygpLnVuaWNvZGUoKQAMLiEAbAAAAFkEAAAJAAAAMDlBWmF6QVphegB/CQkgIAAff38wOSF+YXogfiEvOkBbYHt+CQkKCgsLDAwNDSAgQVowOUFaX19hejA5QUZhZpwBIgBmAAAAVwEAABkAAABhAAAAYgAAAGMAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAKiEAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAfwEAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABBAAAAQgAAAEMAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAKiEAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAfwEAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAACcAwAAvAMAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAACshAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAACeHgAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAKyEAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAHgBAAABAQAAAAEAAAMBAAACAQAABQEAAAQBAAAHAQAABgEAAAkBAAAIAQAACwEAAAoBAAANAQAADAEAAA8BAAAOAQAAEQEAABABAAATAQAAEgEAABUBAAAUAQAAFwEAABYBAAAZAQAAGAEAABsBAAAaAQAAHQEAABwBAAAfAQAAHgEAACEBAAAgAQAAIwEAACIBAAAlAQAAJAEAACcBAAAmAQAAKQEAACgBAAArAQAAKgEAAC0BAAAsAQAALwEAAC4BAAAzAQAAMgEAADUBAAA0AQAANwEAADYBAAA6AQAAOQEAADwBAAA7AQAAPgEAAD0BAABAAQAAPwEAAEIBAABBAQAARAEAAEMBAABGAQAARQEAAEgBAABHAQAASwEAAEoBAABNAQAATAEAAE8BAABOAQAAUQEAAFABAABTAQAAUgEAAFUBAABUAQAAVwEAAFYBAABZAQAAWAEAAFsBAABaAQAAXQEAAFwBAABfAQAAXgEAAGEBAABgAQAAYwEAAGIBAABlAQAAZAEAAGcBAABmAQAAaQEAAGgBAABrAQAAagEAAG0BAABsAQAAbwEAAG4BAABxAQAAcAEAAHMBAAByAQAAdQEAAHQBAAB3AQAAdgEAAP8AAAB6AQAAeQEAAHwBAAB7AQAAfgEAAH0BAABTAAAAcwAAAEMCAABTAgAAgwEAAIIBAACFAQAAhAEAAFQCAACIAQAAhwEAAFYCAABXAgAAjAEAAIsBAADdAQAAWQIAAFsCAACSAQAAkQEAAGACAABjAgAA9gEAAGkCAABoAgAAmQEAAJgBAAA9AgAA3KcAAG8CAAByAgAAIAIAAHUCAAChAQAAoAEAAKMBAACiAQAApQEAAKQBAACAAgAAqAEAAKcBAACDAgAArQEAAKwBAACIAgAAsAEAAK8BAACKAgAAiwIAALQBAACzAQAAtgEAALUBAACSAgAAuQEAALgBAAC9AQAAvAEAAPcBAADFAQAAxgEAAMQBAADGAQAAxAEAAMUBAADIAQAAyQEAAMcBAADJAQAAxwEAAMgBAADLAQAAzAEAAMoBAADMAQAAygEAAMsBAADOAQAAzQEAANABAADPAQAA0gEAANEBAADUAQAA0wEAANYBAADVAQAA2AEAANcBAADaAQAA2QEAANwBAADbAQAAjgEAAN8BAADeAQAA4QEAAOABAADjAQAA4gEAAOUBAADkAQAA5wEAAOYBAADpAQAA6AEAAOsBAADqAQAA7QEAAOwBAADvAQAA7gEAAPIBAADzAQAA8QEAAPMBAADxAQAA8gEAAPUBAAD0AQAAlQEAAL8BAAD5AQAA+AEAAPsBAAD6AQAA/QEAAPwBAAD/AQAA/gEAAAECAAAAAgAAAwIAAAICAAAFAgAABAIAAAcCAAAGAgAACQIAAAgCAAALAgAACgIAAA0CAAAMAgAADwIAAA4CAAARAgAAEAIAABMCAAASAgAAFQIAABQCAAAXAgAAFgIAABkCAAAYAgAAGwIAABoCAAAdAgAAHAIAAB8CAAAeAgAAngEAACMCAAAiAgAAJQIAACQCAAAnAgAAJgIAACkCAAAoAgAAKwIAACoCAAAtAgAALAIAAC8CAAAuAgAAMQIAADACAAAzAgAAMgIAAGUsAAA8AgAAOwIAAJoBAABmLAAAfiwAAH8sAABCAgAAQQIAAIABAACJAgAAjAIAAEcCAABGAgAASQIAAEgCAABLAgAASgIAAE0CAABMAgAATwIAAE4CAABvLAAAbSwAAHAsAACBAQAAhgEAAIkBAACKAQAAjwEAAJABAACrpwAAkwEAAKynAACUAQAAy6cAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAA0x8AALEDAACyAwAA0AMAALMDAAC0AwAAtQMAAPUDAAC2AwAAtwMAALgDAADRAwAA9AMAAEUDAAC5AwAAvh8AALoDAADwAwAAuwMAALUAAAC8AwAAvQMAAL4DAAC/AwAAwAMAANYDAADBAwAA8QMAAMIDAADDAwAAxAMAAMUDAADGAwAA1QMAAMcDAADIAwAAyQMAACYhAADKAwAAywMAAIYDAACIAwAAiQMAAIoDAADjHwAAkQMAAJIDAADQAwAAkwMAAJQDAACVAwAA9QMAAJYDAACXAwAAmAMAANEDAAD0AwAARQMAAJkDAAC+HwAAmgMAAPADAACbAwAAtQAAAJwDAACdAwAAngMAAJ8DAACgAwAA1gMAAKEDAADxAwAAowMAAMMDAACjAwAAwgMAAKQDAAClAwAApgMAANUDAACnAwAAqAMAAKkDAAAmIQAAqgMAAKsDAACMAwAAjgMAAI8DAADXAwAAkgMAALIDAACYAwAAuAMAAPQDAACmAwAAxgMAAKADAADAAwAAzwMAANkDAADYAwAA2wMAANoDAADdAwAA3AMAAN8DAADeAwAA4QMAAOADAADjAwAA4gMAAOUDAADkAwAA5wMAAOYDAADpAwAA6AMAAOsDAADqAwAA7QMAAOwDAADvAwAA7gMAAJoDAAC6AwAAoQMAAMEDAAD5AwAAfwMAAJgDAAC4AwAA0QMAAJUDAAC1AwAA+AMAAPcDAADyAwAA+wMAAPoDAAB7AwAAfAMAAH0DAABQBAAAUQQAAFIEAABTBAAAVAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABfBAAAMAQAADEEAAAyBAAAgBwAADMEAAA0BAAAgRwAADUEAAA2BAAANwQAADgEAAA5BAAAOgQAADsEAAA8BAAAPQQAAD4EAACCHAAAPwQAAEAEAABBBAAAgxwAAEIEAACEHAAAhRwAAEMEAABEBAAARQQAAEYEAABHBAAASAQAAEkEAABKBAAAhhwAAEsEAABMBAAATQQAAE4EAABPBAAAEAQAABEEAAASBAAAgBwAABMEAAAUBAAAgRwAABUEAAAWBAAAFwQAABgEAAAZBAAAGgQAABsEAAAcBAAAHQQAAB4EAACCHAAAHwQAACAEAAAhBAAAgxwAACIEAACEHAAAhRwAACMEAAAkBAAAJQQAACYEAAAnBAAAKAQAACkEAAAqBAAAhhwAACsEAAAsBAAALQQAAC4EAAAvBAAAAAQAAAEEAAACBAAAAwQAAAQEAAAFBAAABgQAAAcEAAAIBAAACQQAAAoEAAALBAAADAQAAA0EAAAOBAAADwQAAGEEAABgBAAAYwQAAIccAABiBAAAhxwAAGUEAABkBAAAZwQAAGYEAABpBAAAaAQAAGsEAABqBAAAbQQAAGwEAABvBAAAbgQAAHEEAABwBAAAcwQAAHIEAAB1BAAAdAQAAHcEAAB2BAAAeQQAAHgEAAB7BAAAegQAAH0EAAB8BAAAfwQAAH4EAACBBAAAgAQAAIsEAACKBAAAjQQAAIwEAACPBAAAjgQAAJEEAACQBAAAkwQAAJIEAACVBAAAlAQAAJcEAACWBAAAmQQAAJgEAACbBAAAmgQAAJ0EAACcBAAAnwQAAJ4EAAChBAAAoAQAAKMEAACiBAAApQQAAKQEAACnBAAApgQAAKkEAACoBAAAqwQAAKoEAACtBAAArAQAAK8EAACuBAAAsQQAALAEAACzBAAAsgQAALUEAAC0BAAAtwQAALYEAAC5BAAAuAQAALsEAAC6BAAAvQQAALwEAAC/BAAAvgQAAM8EAADCBAAAwQQAAMQEAADDBAAAxgQAAMUEAADIBAAAxwQAAMoEAADJBAAAzAQAAMsEAADOBAAAzQQAAMAEAADRBAAA0AQAANMEAADSBAAA1QQAANQEAADXBAAA1gQAANkEAADYBAAA2wQAANoEAADdBAAA3AQAAN8EAADeBAAA4QQAAOAEAADjBAAA4gQAAOUEAADkBAAA5wQAAOYEAADpBAAA6AQAAOsEAADqBAAA7QQAAOwEAADvBAAA7gQAAPEEAADwBAAA8wQAAPIEAAD1BAAA9AQAAPcEAAD2BAAA+QQAAPgEAAD7BAAA+gQAAP0EAAD8BAAA/wQAAP4EAAABBQAAAAUAAAMFAAACBQAABQUAAAQFAAAHBQAABgUAAAkFAAAIBQAACwUAAAoFAAANBQAADAUAAA8FAAAOBQAAEQUAABAFAAATBQAAEgUAABUFAAAUBQAAFwUAABYFAAAZBQAAGAUAABsFAAAaBQAAHQUAABwFAAAfBQAAHgUAACEFAAAgBQAAIwUAACIFAAAlBQAAJAUAACcFAAAmBQAAKQUAACgFAAArBQAAKgUAAC0FAAAsBQAALwUAAC4FAABhBQAAYgUAAGMFAABkBQAAZQUAAGYFAABnBQAAaAUAAGkFAABqBQAAawUAAGwFAABtBQAAbgUAAG8FAABwBQAAcQUAAHIFAABzBQAAdAUAAHUFAAB2BQAAdwUAAHgFAAB5BQAAegUAAHsFAAB8BQAAfQUAAH4FAAB/BQAAgAUAAIEFAACCBQAAgwUAAIQFAACFBQAAhgUAADEFAAAyBQAAMwUAADQFAAA1BQAANgUAADcFAAA4BQAAOQUAADoFAAA7BQAAPAUAAD0FAAA+BQAAPwUAAEAFAABBBQAAQgUAAEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABTBQAAVAUAAFUFAABWBQAAAC0AAAEtAAACLQAAAy0AAAQtAAAFLQAABi0AAActAAAILQAACS0AAAotAAALLQAADC0AAA0tAAAOLQAADy0AABAtAAARLQAAEi0AABMtAAAULQAAFS0AABYtAAAXLQAAGC0AABktAAAaLQAAGy0AABwtAAAdLQAAHi0AAB8tAAAgLQAAIS0AACItAAAjLQAAJC0AACUtAAAnLQAALS0AAJAcAACRHAAAkhwAAJMcAACUHAAAlRwAAJYcAACXHAAAmBwAAJkcAACaHAAAmxwAAJwcAACdHAAAnhwAAJ8cAACgHAAAoRwAAKIcAACjHAAApBwAAKUcAACmHAAApxwAAKgcAACpHAAAqhwAAKscAACsHAAArRwAAK4cAACvHAAAsBwAALEcAACyHAAAsxwAALQcAAC1HAAAthwAALccAAC4HAAAuRwAALocAAC9HAAAvhwAAL8cAABwqwAAcasAAHKrAABzqwAAdKsAAHWrAAB2qwAAd6sAAHirAAB5qwAAeqsAAHurAAB8qwAAfasAAH6rAAB/qwAAgKsAAIGrAACCqwAAg6sAAISrAACFqwAAhqsAAIerAACIqwAAiasAAIqrAACLqwAAjKsAAI2rAACOqwAAj6sAAJCrAACRqwAAkqsAAJOrAACUqwAAlasAAJarAACXqwAAmKsAAJmrAACaqwAAm6sAAJyrAACdqwAAnqsAAJ+rAACgqwAAoasAAKKrAACjqwAApKsAAKWrAACmqwAAp6sAAKirAACpqwAAqqsAAKurAACsqwAArasAAK6rAACvqwAAsKsAALGrAACyqwAAs6sAALSrAAC1qwAAtqsAALerAAC4qwAAuasAALqrAAC7qwAAvKsAAL2rAAC+qwAAv6sAAPgTAAD5EwAA+hMAAPsTAAD8EwAA/RMAAPATAADxEwAA8hMAAPMTAAD0EwAA9RMAABIEAAAyBAAAFAQAADQEAAAeBAAAPgQAACEEAABBBAAAIgQAAEIEAACFHAAAIgQAAEIEAACEHAAAKgQAAEoEAABiBAAAYwQAAEqmAABLpgAAihwAAIkcAADQEAAA0RAAANIQAADTEAAA1BAAANUQAADWEAAA1xAAANgQAADZEAAA2hAAANsQAADcEAAA3RAAAN4QAADfEAAA4BAAAOEQAADiEAAA4xAAAOQQAADlEAAA5hAAAOcQAADoEAAA6RAAAOoQAADrEAAA7BAAAO0QAADuEAAA7xAAAPAQAADxEAAA8hAAAPMQAAD0EAAA9RAAAPYQAAD3EAAA+BAAAPkQAAD6EAAA/RAAAP4QAAD/EAAAfacAAGMsAADGpwAAAR4AAAAeAAADHgAAAh4AAAUeAAAEHgAABx4AAAYeAAAJHgAACB4AAAseAAAKHgAADR4AAAweAAAPHgAADh4AABEeAAAQHgAAEx4AABIeAAAVHgAAFB4AABceAAAWHgAAGR4AABgeAAAbHgAAGh4AAB0eAAAcHgAAHx4AAB4eAAAhHgAAIB4AACMeAAAiHgAAJR4AACQeAAAnHgAAJh4AACkeAAAoHgAAKx4AACoeAAAtHgAALB4AAC8eAAAuHgAAMR4AADAeAAAzHgAAMh4AADUeAAA0HgAANx4AADYeAAA5HgAAOB4AADseAAA6HgAAPR4AADweAAA/HgAAPh4AAEEeAABAHgAAQx4AAEIeAABFHgAARB4AAEceAABGHgAASR4AAEgeAABLHgAASh4AAE0eAABMHgAATx4AAE4eAABRHgAAUB4AAFMeAABSHgAAVR4AAFQeAABXHgAAVh4AAFkeAABYHgAAWx4AAFoeAABdHgAAXB4AAF8eAABeHgAAYR4AAJseAABgHgAAmx4AAGMeAABiHgAAZR4AAGQeAABnHgAAZh4AAGkeAABoHgAAax4AAGoeAABtHgAAbB4AAG8eAABuHgAAcR4AAHAeAABzHgAAch4AAHUeAAB0HgAAdx4AAHYeAAB5HgAAeB4AAHseAAB6HgAAfR4AAHweAAB/HgAAfh4AAIEeAACAHgAAgx4AAIIeAACFHgAAhB4AAIceAACGHgAAiR4AAIgeAACLHgAAih4AAI0eAACMHgAAjx4AAI4eAACRHgAAkB4AAJMeAACSHgAAlR4AAJQeAABgHgAAYR4AAN8AAAChHgAAoB4AAKMeAACiHgAApR4AAKQeAACnHgAAph4AAKkeAACoHgAAqx4AAKoeAACtHgAArB4AAK8eAACuHgAAsR4AALAeAACzHgAAsh4AALUeAAC0HgAAtx4AALYeAAC5HgAAuB4AALseAAC6HgAAvR4AALweAAC/HgAAvh4AAMEeAADAHgAAwx4AAMIeAADFHgAAxB4AAMceAADGHgAAyR4AAMgeAADLHgAAyh4AAM0eAADMHgAAzx4AAM4eAADRHgAA0B4AANMeAADSHgAA1R4AANQeAADXHgAA1h4AANkeAADYHgAA2x4AANoeAADdHgAA3B4AAN8eAADeHgAA4R4AAOAeAADjHgAA4h4AAOUeAADkHgAA5x4AAOYeAADpHgAA6B4AAOseAADqHgAA7R4AAOweAADvHgAA7h4AAPEeAADwHgAA8x4AAPIeAAD1HgAA9B4AAPceAAD2HgAA+R4AAPgeAAD7HgAA+h4AAP0eAAD8HgAA/x4AAP4eAAAIHwAACR8AAAofAAALHwAADB8AAA0fAAAOHwAADx8AAAAfAAABHwAAAh8AAAMfAAAEHwAABR8AAAYfAAAHHwAAGB8AABkfAAAaHwAAGx8AABwfAAAdHwAAEB8AABEfAAASHwAAEx8AABQfAAAVHwAAKB8AACkfAAAqHwAAKx8AACwfAAAtHwAALh8AAC8fAAAgHwAAIR8AACIfAAAjHwAAJB8AACUfAAAmHwAAJx8AADgfAAA5HwAAOh8AADsfAAA8HwAAPR8AAD4fAAA/HwAAMB8AADEfAAAyHwAAMx8AADQfAAA1HwAANh8AADcfAABIHwAASR8AAEofAABLHwAATB8AAE0fAABAHwAAQR8AAEIfAABDHwAARB8AAEUfAABZHwAAWx8AAF0fAABfHwAAUR8AAFMfAABVHwAAVx8AAGgfAABpHwAAah8AAGsfAABsHwAAbR8AAG4fAABvHwAAYB8AAGEfAABiHwAAYx8AAGQfAABlHwAAZh8AAGcfAAC6HwAAux8AAMgfAADJHwAAyh8AAMsfAADaHwAA2x8AAPgfAAD5HwAA6h8AAOsfAAD6HwAA+x8AAIgfAACJHwAAih8AAIsfAACMHwAAjR8AAI4fAACPHwAAgB8AAIEfAACCHwAAgx8AAIQfAACFHwAAhh8AAIcfAACYHwAAmR8AAJofAACbHwAAnB8AAJ0fAACeHwAAnx8AAJAfAACRHwAAkh8AAJMfAACUHwAAlR8AAJYfAACXHwAAqB8AAKkfAACqHwAAqx8AAKwfAACtHwAArh8AAK8fAACgHwAAoR8AAKIfAACjHwAApB8AAKUfAACmHwAApx8AALgfAAC5HwAAvB8AALAfAACxHwAAcB8AAHEfAACzHwAARQMAAJkDAAC5AwAAzB8AAHIfAABzHwAAdB8AAHUfAADDHwAA2B8AANkfAACQAwAA0B8AANEfAAB2HwAAdx8AAOgfAADpHwAAsAMAAOwfAADgHwAA4R8AAHofAAB7HwAA5R8AAPwfAAB4HwAAeR8AAHwfAAB9HwAA8x8AAKkDAADJAwAASwAAAGsAAADFAAAA5QAAAE4hAAAyIQAAcCEAAHEhAAByIQAAcyEAAHQhAAB1IQAAdiEAAHchAAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJinAACbpwAAmqcAAJ2nAACcpwAAn6cAAJ6nAAChpwAAoKcAAKOnAACipwAApacAAKSnAACnpwAApqcAAKmnAACopwAAZgIAAFwCAABhAgAAbAIAAGoCAACeAgAAhwIAAJ0CAABTqwAAtacAALSnAAC3pwAAtqcAALmnAAC4pwAAu6cAALqnAAC9pwAAvKcAAL+nAAC+pwAAwacAAMCnAADDpwAAwqcAAJSnAACCAgAAjh0AAMinAADHpwAAyqcAAMmnAABkAgAAzacAAMynAADRpwAA0KcAANenAADWpwAA2acAANinAADbpwAA2qcAAJsBAAD2pwAA9acAALOnAACgEwAAoRMAAKITAACjEwAApBMAAKUTAACmEwAApxMAAKgTAACpEwAAqhMAAKsTAACsEwAArRMAAK4TAACvEwAAsBMAALETAACyEwAAsxMAALQTAAC1EwAAthMAALcTAAC4EwAAuRMAALoTAAC7EwAAvBMAAL0TAAC+EwAAvxMAAMATAADBEwAAwhMAAMMTAADEEwAAxRMAAMYTAADHEwAAyBMAAMkTAADKEwAAyxMAAMwTAADNEwAAzhMAAM8TAADQEwAA0RMAANITAADTEwAA1BMAANUTAADWEwAA1xMAANgTAADZEwAA2hMAANsTAADcEwAA3RMAAN4TAADfEwAA4BMAAOETAADiEwAA4xMAAOQTAADlEwAA5hMAAOcTAADoEwAA6RMAAOoTAADrEwAA7BMAAO0TAADuEwAA7xMAAAb7AAAF+wAAQf8AAEL/AABD/wAARP8AAEX/AABG/wAAR/8AAEj/AABJ/wAASv8AAEv/AABM/wAATf8AAE7/AABP/wAAUP8AAFH/AABS/wAAU/8AAFT/AABV/wAAVv8AAFf/AABY/wAAWf8AAFr/AAAh/wAAIv8AACP/AAAk/wAAJf8AACb/AAAn/wAAKP8AACn/AAAq/wAAK/8AACz/AAAt/wAALv8AAC//AAAw/wAAMf8AADL/AAAz/wAANP8AADX/AAA2/wAAN/8AADj/AAA5/wAAOv8AACgEAQApBAEAKgQBACsEAQAsBAEALQQBAC4EAQAvBAEAMAQBADEEAQAyBAEAMwQBADQEAQA1BAEANgQBADcEAQA4BAEAOQQBADoEAQA7BAEAPAQBAD0EAQA+BAEAPwQBAEAEAQBBBAEAQgQBAEMEAQBEBAEARQQBAEYEAQBHBAEASAQBAEkEAQBKBAEASwQBAEwEAQBNBAEATgQBAE8EAQAABAEAAQQBAAIEAQADBAEABAQBAAUEAQAGBAEABwQBAAgEAQAJBAEACgQBAAsEAQAMBAEADQQBAA4EAQAPBAEAEAQBABEEAQASBAEAEwQBABQEAQAVBAEAFgQBABcEAQAYBAEAGQQBABoEAQAbBAEAHAQBAB0EAQAeBAEAHwQBACAEAQAhBAEAIgQBACMEAQAkBAEAJQQBACYEAQAnBAEA2AQBANkEAQDaBAEA2wQBANwEAQDdBAEA3gQBAN8EAQDgBAEA4QQBAOIEAQDjBAEA5AQBAOUEAQDmBAEA5wQBAOgEAQDpBAEA6gQBAOsEAQDsBAEA7QQBAO4EAQDvBAEA8AQBAPEEAQDyBAEA8wQBAPQEAQD1BAEA9gQBAPcEAQD4BAEA+QQBAPoEAQD7BAEAsAQBALEEAQCyBAEAswQBALQEAQC1BAEAtgQBALcEAQC4BAEAuQQBALoEAQC7BAEAvAQBAL0EAQC+BAEAvwQBAMAEAQDBBAEAwgQBAMMEAQDEBAEAxQQBAMYEAQDHBAEAyAQBAMkEAQDKBAEAywQBAMwEAQDNBAEAzgQBAM8EAQDQBAEA0QQBANIEAQDTBAEAlwUBAJgFAQCZBQEAmgUBAJsFAQCcBQEAnQUBAJ4FAQCfBQEAoAUBAKEFAQCjBQEApAUBAKUFAQCmBQEApwUBAKgFAQCpBQEAqgUBAKsFAQCsBQEArQUBAK4FAQCvBQEAsAUBALEFAQCzBQEAtAUBALUFAQC2BQEAtwUBALgFAQC5BQEAuwUBALwFAQBwBQEAcQUBAHIFAQBzBQEAdAUBAHUFAQB2BQEAdwUBAHgFAQB5BQEAegUBAHwFAQB9BQEAfgUBAH8FAQCABQEAgQUBAIIFAQCDBQEAhAUBAIUFAQCGBQEAhwUBAIgFAQCJBQEAigUBAIwFAQCNBQEAjgUBAI8FAQCQBQEAkQUBAJIFAQCUBQEAlQUBAMAMAQDBDAEAwgwBAMMMAQDEDAEAxQwBAMYMAQDHDAEAyAwBAMkMAQDKDAEAywwBAMwMAQDNDAEAzgwBAM8MAQDQDAEA0QwBANIMAQDTDAEA1AwBANUMAQDWDAEA1wwBANgMAQDZDAEA2gwBANsMAQDcDAEA3QwBAN4MAQDfDAEA4AwBAOEMAQDiDAEA4wwBAOQMAQDlDAEA5gwBAOcMAQDoDAEA6QwBAOoMAQDrDAEA7AwBAO0MAQDuDAEA7wwBAPAMAQDxDAEA8gwBAIAMAQCBDAEAggwBAIMMAQCEDAEAhQwBAIYMAQCHDAEAiAwBAIkMAQCKDAEAiwwBAIwMAQCNDAEAjgwBAI8MAQCQDAEAkQwBAJIMAQCTDAEAlAwBAJUMAQCWDAEAlwwBAJgMAQCZDAEAmgwBAJsMAQCcDAEAnQwBAJ4MAQCfDAEAoAwBAKEMAQCiDAEAowwBAKQMAQClDAEApgwBAKcMAQCoDAEAqQwBAKoMAQCr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OSEAAQAAAM8AAABEOSEAAQAAANAAAABIOSEAAQAAANEAAABMOSEAAQAAANIAAABQOSEAAQAAANMAAABUOSEAAQAAANQAAABYOSEAAQAAANUAAABcOSEAAQAAANYAAABgOSEAAQAAANgAAABkOSEAAQAAANkAAABoOSEAAQAAANoAAABsOSEAAQAAANsAAABwOSEAAQAAANwAAAB0OSEAAQAAAN0AAAB4OSEAAQAAAN4AAAB8OSEAAQAAAN8AAACAOSEAAQAAAOAAAACEOSEAAQAAAOEAAACIOSEAAQAAAOIAAACMOSEAAQAAAOMAAACQOSEAAQAAAOQAAACUOSEAAQAAAOUAAACYOSEAAgAAAOYAAACgOSEAAQAAAOcAAACkOSEAAQAAAOgAAACoOSEAAQAAAOkAAACsOSEAAQAAAOoAAACwOSEAAQAAAOsAAAC0OSEAAQAAAOwAAAC4OSEAAQAAAO0AAAC8OSEAAQAAAO4AAADAOSEAAQAAAO8AAADEOSEAAQAAAPAAAADIOSEAAQAAAPEAAADMOSEAAQAAAPIAAADQOSEAAQAAAPMAAADUOSEAAQAAAPQAAADYOSEAAQAAAPUAAADcOSEAAQAAAPYAAADgOSEAAQAAAPgAAADkOSEAAQAAAPkAAADoOSEAAQAAAPoAAADsOSEAAQAAAPsAAADwOSEAAQAAAPwAAAD0OSEAAQAAAP0AAAD4OSEAAQAAAP4AAAD8OSEAAQAAAP8AAAAAOiEAAQAAAAABAAAEOiEAAQAAAAEBAAAIOiEAAQAAAAIBAAAMOiEAAQAAAAMBAAAQOiEAAQAAAAQBAAAUOiEAAQAAAAUBAAAYOiEAAQAAAAYBAAAcOiEAAQAAAAcBAAAgOiEAAQAAAAgBAAAkOiEAAQAAAAkBAAAoOiEAAQAAAAoBAAAsOiEAAQAAAAsBAAAwOiEAAQAAAAwBAAA0OiEAAQAAAA0BAAA4OiEAAQAAAA4BAAA8OiEAAQAAAA8BAABAOiEAAQAAABABAABEOiEAAQAAABEBAABIOiEAAQAAABIBAABMOiEAAQAAABMBAABQOiEAAQAAABQBAABUOiEAAQAAABUBAABYOiEAAQAAABYBAABcOiEAAQAAABcBAABgOiEAAQAAABgBAABkOiEAAQAAABkBAABoOiEAAQAAABoBAABsOiEAAQAAABsBAABwOiEAAQAAABwBAAB0OiEAAQAAAB0BAAB4OiEAAQAAAB4BAAB8OiEAAQAAAB8BAACAOiEAAQAAACABAACEOiEAAQAAACEBAACIOiEAAQAAACIBAACMOiEAAQAAACMBAACQOiEAAQAAACQBAACUOiEAAQAAACUBAACYOiEAAQAAACYBAACcOiEAAQAAACcBAACgOiEAAQAAACgBAACkOiEAAQAAACkBAACoOiEAAQAAACoBAACsOiEAAQAAACsBAACwOiEAAQAAACwBAAC0OiEAAQAAAC0BAAC4OiEAAQAAAC4BAAC8OiEAAQAAAC8BAADAOiEAAQAAADIBAADEOiEAAQAAADMBAADIOiEAAQAAADQBAADMOiEAAQAAADUBAADQOiEAAQAAADYBAADUOiEAAQAAADcBAADYOiEAAQAAADkBAADcOiEAAQAAADoBAADgOiEAAQAAADsBAADkOiEAAQAAADwBAADoOiEAAQAAAD0BAADsOiEAAQAAAD4BAADwOiEAAQAAAD8BAAD0OiEAAQAAAEABAAD4OiEAAQAAAEEBAAD8OiEAAQAAAEIBAAAAOyEAAQAAAEMBAAAEOyEAAQAAAEQBAAAIOyEAAQAAAEUBAAAMOyEAAQAAAEYBAAAQOyEAAQAAAEcBAAAUOyEAAQAAAEgBAAAYOyEAAQAAAEoBAAAcOyEAAQAAAEsBAAAgOyEAAQAAAEwBAAAkOyEAAQAAAE0BAAAoOyEAAQAAAE4BAAAsOyEAAQAAAE8BAAAwOyEAAQAAAFABAAA0OyEAAQAAAFEBAAA4OyEAAQAAAFIBAAA8OyEAAQAAAFMBAABAOyEAAQAAAFQBAABEOyEAAQAAAFUBAABIOyEAAQAAAFYBAABMOyEAAQAAAFcBAABQOyEAAQAAAFgBAABUOyEAAQAAAFkBAABYOyEAAQAAAFoBAABcOyEAAQAAAFsBAABgOyEAAQAAAFwBAABkOyEAAQAAAF0BAABoOyEAAQAAAF4BAABsOyEAAQAAAF8BAABwOyEAAQAAAGABAAB0OyEAAQAAAGEBAAB4OyEAAQAAAGIBAAB8OyEAAQAAAGMBAACAOyEAAQAAAGQBAACEOyEAAQAAAGUBAACIOyEAAQAAAGYBAACMOyEAAQAAAGcBAACQOyEAAQAAAGgBAACUOyEAAQAAAGkBAACYOyEAAQAAAGoBAACcOyEAAQAAAGsBAACgOyEAAQAAAGwBAACkOyEAAQAAAG0BAACoOyEAAQAAAG4BAACsOyEAAQAAAG8BAACwOyEAAQAAAHABAAC0OyEAAQAAAHEBAAC4OyEAAQAAAHIBAAC8OyEAAQAAAHMBAADAOyEAAQAAAHQBAADEOyEAAQAAAHUBAADIOyEAAQAAAHYBAADMOyEAAQAAAHcBAADQOyEAAQAAAHgBAADUOyEAAQAAAHkBAADYOyEAAQAAAHoBAADcOyEAAQAAAHsBAADgOyEAAQAAAHwBAADkOyEAAQAAAH0BAADoOyEAAQAAAH4BAADsOyEAAQAAAH8BAADwOyEAAgAAAIABAAD4OyEAAQAAAIEBAAD8OyEAAQAAAIIBAAAAPCEAAQAAAIMBAAAEPCEAAQAAAIQBAAAIPCEAAQAAAIUBAAAMPCEAAQAAAIYBAAAQPCEAAQAAAIcBAAAUPCEAAQAAAIgBAAAYPCEAAQAAAIkBAAAcPCEAAQAAAIoBAAAgPCEAAQAAAIsBAAAkPCEAAQAAAIwBAAAoPCEAAQAAAI4BAAAsPCEAAQAAAI8BAAAwPCEAAQAAAJABAAA0PCEAAQAAAJEBAAA4PCEAAQAAAJIBAAA8PCEAAQAAAJMBAABAPCEAAQAAAJQBAABEPCEAAQAAAJUBAABIPCEAAQAAAJYBAABMPCEAAQAAAJcBAABQPCEAAQAAAJgBAABUPCEAAQAAAJkBAABYPCEAAQAAAJoBAABcPCEAAQAAAJsBAABgPCEAAQAAAJwBAABkPCEAAQAAAJ0BAABoPCEAAQAAAJ4BAABsPCEAAQAAAJ8BAABwPCEAAQAAAKABAAB0PCEAAQAAAKEBAAB4PCEAAQAAAKIBAAB8PCEAAQAAAKMBAACAPCEAAQAAAKQBAACEPCEAAQAAAKUBAACIPCEAAQAAAKYBAACMPCEAAQAAAKcBAACQPCEAAQAAAKgBAACUPCEAAQAAAKkBAACYPCEAAQAAAKwBAACcPCEAAQAAAK0BAACgPCEAAQAAAK4BAACkPCEAAQAAAK8BAACoPCEAAQAAALABAACsPCEAAQAAALEBAACwPCEAAQAAALIBAAC0PCEAAQAAALMBAAC4PCEAAQAAALQBAAC8PCEAAQAAALUBAADAPCEAAQAAALYBAADEPCEAAQAAALcBAADIPCEAAQAAALgBAADMPCEAAQAAALkBAADQPCEAAQAAALwBAADUPCEAAQAAAL0BAADYPCEAAQAAAL8BAADcPCEAAQAAAMQBAADgPCEAAgAAAMUBAADoPCEAAgAAAMYBAADwPCEAAgAAAMcBAAD4PCEAAgAAAMgBAAAAPSEAAgAAAMkBAAAIPSEAAgAAAMoBAAAQPSEAAgAAAMsBAAAYPSEAAgAAAMwBAAAgPSEAAgAAAM0BAAAoPSEAAQAAAM4BAAAsPSEAAQAAAM8BAAAwPSEAAQAAANABAAA0PSEAAQAAANEBAAA4PSEAAQAAANIBAAA8PSEAAQAAANMBAABAPSEAAQAAANQBAABEPSEAAQAAANUBAABIPSEAAQAAANYBAABMPSEAAQAAANcBAABQPSEAAQAAANgBAABUPSEAAQAAANkBAABYPSEAAQAAANoBAABcPSEAAQAAANsBAABgPSEAAQAAANwBAABkPSEAAQAAAN0BAABoPSEAAQAAAN4BAABsPSEAAQAAAN8BAABwPSEAAQAAAOABAAB0PSEAAQAAAOEBAAB4PSEAAQAAAOIBAAB8PSEAAQAAAOMBAACAPSEAAQAAAOQBAACEPSEAAQAAAOUBAACIPSEAAQAAAOYBAACMPSEAAQAAAOcBAACQPSEAAQAAAOgBAACUPSEAAQAAAOkBAACYPSEAAQAAAOoBAACcPSEAAQAAAOsBAACgPSEAAQAAAOwBAACkPSEAAQAAAO0BAACoPSEAAQAAAO4BAACsPSEAAQAAAO8BAACwPSEAAQAAAPEBAAC0PSEAAgAAAPIBAAC8PSEAAgAAAPMBAADEPSEAAgAAAPQBAADMPSEAAQAAAPUBAADQPSEAAQAAAPYBAADUPSEAAQAAAPcBAADYPSEAAQAAAPgBAADcPSEAAQAAAPkBAADgPSEAAQAAAPoBAADkPSEAAQAAAPsBAADoPSEAAQAAAPwBAADsPSEAAQAAAP0BAADwPSEAAQAAAP4BAAD0PSEAAQAAAP8BAAD4PSEAAQAAAAACAAD8PSEAAQAAAAECAAAAPiEAAQAAAAICAAAEPiEAAQAAAAMCAAAIPiEAAQAAAAQCAAAMPiEAAQAAAAUCAAAQPiEAAQAAAAYCAAAUPiEAAQAAAAcCAAAYPiEAAQAAAAgCAAAcPiEAAQAAAAkCAAAgPiEAAQAAAAoCAAAkPiEAAQAAAAsCAAAoPiEAAQAAAAwCAAAsPiEAAQAAAA0CAAAwPiEAAQAAAA4CAAA0PiEAAQAAAA8CAAA4PiEAAQAAABACAAA8PiEAAQAAABECAABAPiEAAQAAABICAABEPiEAAQAAABMCAABIPiEAAQAAABQCAABMPiEAAQAAABUCAABQPiEAAQAAABYCAABUPiEAAQAAABcCAABYPiEAAQAAABgCAABcPiEAAQAAABkCAABgPiEAAQAAABoCAABkPiEAAQAAABsCAABoPiEAAQAAABwCAABsPiEAAQAAAB0CAABwPiEAAQAAAB4CAAB0PiEAAQAAAB8CAAB4PiEAAQAAACACAAB8PiEAAQAAACICAACAPiEAAQAAACMCAACEPiEAAQAAACQCAACIPiEAAQAAACUCAACMPiEAAQAAACYCAACQPiEAAQAAACcCAACUPiEAAQAAACgCAACYPiEAAQAAACkCAACcPiEAAQAAACoCAACgPiEAAQAAACsCAACkPiEAAQAAACwCAACoPiEAAQAAAC0CAACsPiEAAQAAAC4CAACwPiEAAQAAAC8CAAC0PiEAAQAAADACAAC4PiEAAQAAADECAAC8PiEAAQAAADICAADAPiEAAQAAADMCAADEPiEAAQAAADoCAADIPiEAAQAAADsCAADMPiEAAQAAADwCAADQPiEAAQAAAD0CAADUPiEAAQAAAD4CAADYPiEAAQAAAD8CAADcPiEAAQAAAEACAADgPiEAAQAAAEECAADkPiEAAQAAAEICAADoPiEAAQAAAEMCAADsPiEAAQAAAEQCAADwPiEAAQAAAEUCAAD0PiEAAQAAAEYCAAD4PiEAAQAAAEcCAAD8PiEAAQAAAEgCAAAAPyEAAQAAAEkCAAAEPyEAAQAAAEoCAAAIPyEAAQAAAEsCAAAMPyEAAQAAAEwCAAAQPyEAAQAAAE0CAAAUPyEAAQAAAE4CAAAYPyEAAQAAAE8CAAAcPyEAAQAAAFACAAAgPyEAAQAAAFECAAAkPyEAAQAAAFICAAAoPyEAAQAAAFMCAAAsPyEAAQAAAFQCAAAwPyEAAQAAAFYCAAA0PyEAAQAAAFcCAAA4PyEAAQAAAFkCAAA8PyEAAQAAAFsCAABAPyEAAQAAAFwCAABEPyEAAQAAAGACAABIPyEAAQAAAGECAABMPyEAAQAAAGMCAABQPyEAAQAAAGQCAABUPyEAAQAAAGUCAABYPyEAAQAAAGYCAABcPyEAAQAAAGgCAABgPyEAAQAAAGkCAABkPyEAAQAAAGoCAABoPyEAAQAAAGsCAABsPyEAAQAAAGwCAABwPyEAAQAAAG8CAAB0PyEAAQAAAHECAAB4PyEAAQAAAHICAAB8PyEAAQAAAHUCAACAPyEAAQAAAH0CAACEPyEAAQAAAIACAACIPyEAAQAAAIICAACMPyEAAQAAAIMCAACQPyEAAQAAAIcCAACUPyEAAQAAAIgCAACYPyEAAQAAAIkCAACcPyEAAQAAAIoCAACgPyEAAQAAAIsCAACkPyEAAQAAAIwCAACoPyEAAQAAAJICAACsPyEAAQAAAJ0CAACwPyEAAQAAAJ4CAAC0PyEAAQAAAEUDAAC4PyEAAwAAAHADAADEPyEAAQAAAHEDAADIPyEAAQAAAHIDAADMPyEAAQAAAHMDAADQPyEAAQAAAHYDAADUPyEAAQAAAHcDAADYPyEAAQAAAHsDAADcPyEAAQAAAHwDAADgPyEAAQAAAH0DAADkPyEAAQAAAH8DAADoPyEAAQAAAIYDAADsPyEAAQAAAIgDAADwPyEAAQAAAIkDAAD0PyEAAQAAAIoDAAD4PyEAAQAAAIwDAAD8PyEAAQAAAI4DAAAAQCEAAQAAAI8DAAAEQCEAAQAAAJADAAAIQCEAAQAAAJEDAAAMQCEAAQAAAJIDAAAQQCEAAgAAAJMDAAAYQCEAAQAAAJQDAAAcQCEAAQAAAJUDAAAgQCEAAgAAAJYDAAAoQCEAAQAAAJcDAAAsQCEAAQAAAJgDAAAwQCEAAwAAAJkDAAA8QCEAAwAAAJoDAABIQCEAAgAAAJsDAABQQCEAAQAAAJwDAABUQCEAAgAAAJ0DAABcQCEAAQAAAJ4DAABgQCEAAQAAAJ8DAABkQCEAAQAAAKADAABoQCEAAgAAAKEDAABwQCEAAgAAAKMDAAB4QCEAAgAAAKQDAACAQCEAAQAAAKUDAACEQCEAAQAAAKYDAACIQCEAAgAAAKcDAACQQCEAAQAAAKgDAACUQCEAAQAAAKkDAACYQCEAAgAAAKoDAACgQCEAAQAAAKsDAACkQCEAAQAAAKwDAACoQCEAAQAAAK0DAACsQCEAAQAAAK4DAACwQCEAAQAAAK8DAAC0QCEAAQAAALADAAC4QCEAAQAAALEDAAC8QCEAAQAAALIDAADAQCEAAgAAALMDAADIQCEAAQAAALQDAADMQCEAAQAAALUDAADQQCEAAgAAALYDAADYQCEAAQAAALcDAADcQCEAAQAAALgDAADgQCEAAwAAALkDAADsQCEAAwAAALoDAAD4QCEAAgAAALsDAAAAQSEAAQAAALwDAAAEQSEAAgAAAL0DAAAMQSEAAQAAAL4DAAAQQSEAAQAAAL8DAAAUQSEAAQAAAMADAAAYQSEAAgAAAMEDAAAgQSEAAgAAAMIDAAAoQSEAAgAAAMMDAAAwQSEAAgAAAMQDAAA4QSEAAQAAAMUDAAA8QSEAAQAAAMYDAABAQSEAAgAAAMcDAABIQSEAAQAAAMgDAABMQSEAAQAAAMkDAABQQSEAAgAAAMoDAABYQSEAAQAAAMsDAABcQSEAAQAAAMwDAABgQSEAAQAAAM0DAABkQSEAAQAAAM4DAABoQSEAAQAAAM8DAABsQSEAAQAAANADAABwQSEAAgAAANEDAAB4QSEAAwAAANUDAACEQSEAAgAAANYDAACMQSEAAgAAANcDAACUQSEAAQAAANgDAACYQSEAAQAAANkDAACcQSEAAQAAANoDAACgQSEAAQAAANsDAACkQSEAAQAAANwDAACoQSEAAQAAAN0DAACsQSEAAQAAAN4DAACwQSEAAQAAAN8DAAC0QSEAAQAAAOADAAC4QSEAAQAAAOEDAAC8QSEAAQAAAOIDAADAQSEAAQAAAOMDAADEQSEAAQAAAOQDAADIQSEAAQAAAOUDAADMQSEAAQAAAOYDAADQQSEAAQAAAOcDAADUQSEAAQAAAOgDAADYQSEAAQAAAOkDAADcQSEAAQAAAOoDAADgQSEAAQAAAOsDAADkQSEAAQAAAOwDAADoQSEAAQAAAO0DAADsQSEAAQAAAO4DAADwQSEAAQAAAO8DAAD0QSEAAQAAAPADAAD4QSEAAgAAAPEDAAAAQiEAAgAAAPIDAAAIQiEAAQAAAPMDAAAMQiEAAQAAAPQDAAAQQiEAAwAAAPUDAAAcQiEAAgAAAPcDAAAkQiEAAQAAAPgDAAAoQiEAAQAAAPkDAAAsQiEAAQAAAPoDAAAwQiEAAQAAAPsDAAA0QiEAAQAAAP0DAAA4QiEAAQAAAP4DAAA8QiEAAQAAAP8DAABAQiEAAQAAAAAEAABEQiEAAQAAAAEEAABIQiEAAQAAAAIEAABMQiEAAQAAAAMEAABQQiEAAQAAAAQEAABUQiEAAQAAAAUEAABYQiEAAQAAAAYEAABcQiEAAQAAAAcEAABgQiEAAQAAAAgEAABkQiEAAQAAAAkEAABoQiEAAQAAAAoEAABsQiEAAQAAAAsEAABwQiEAAQAAAAwEAAB0QiEAAQAAAA0EAAB4QiEAAQAAAA4EAAB8QiEAAQAAAA8EAACAQiEAAQAAABAEAACEQiEAAQAAABEEAACIQiEAAQAAABIEAACMQiEAAgAAABMEAACUQiEAAQAAABQEAACYQiEAAgAAABUEAACgQiEAAQAAABYEAACkQiEAAQAAABcEAACoQiEAAQAAABgEAACsQiEAAQAAABkEAACwQiEAAQAAABoEAAC0QiEAAQAAABsEAAC4QiEAAQAAABwEAAC8QiEAAQAAAB0EAADAQiEAAQAAAB4EAADEQiEAAgAAAB8EAADMQiEAAQAAACAEAADQQiEAAQAAACEEAADUQiEAAgAAACIEAADcQiEAAwAAACMEAADoQiEAAQAAACQEAADsQiEAAQAAACUEAADwQiEAAQAAACYEAAD0QiEAAQAAACcEAAD4QiEAAQAAACgEAAD8QiEAAQAAACkEAAAAQyEAAQAAACoEAAAEQyEAAgAAACsEAAAMQyEAAQAAACwEAAAQQyEAAQAAAC0EAAAUQyEAAQAAAC4EAAAYQyEAAQAAAC8EAAAcQyEAAQAAADAEAAAgQyEAAQAAADEEAAAkQyEAAQAAADIEAAAoQyEAAgAAADMEAAAwQyEAAQAAADQEAAA0QyEAAgAAADUEAAA8QyEAAQAAADYEAABAQyEAAQAAADcEAABEQyEAAQAAADgEAABIQyEAAQAAADkEAABMQyEAAQAAADoEAABQQyEAAQAAADsEAABUQyEAAQAAADwEAABYQyEAAQAAAD0EAABcQyEAAQAAAD4EAABgQyEAAgAAAD8EAABoQyEAAQAAAEAEAABsQyEAAQAAAEEEAABwQyEAAgAAAEIEAAB4QyEAAwAAAEMEAACEQyEAAQAAAEQEAACIQyEAAQAAAEUEAACMQyEAAQAAAEYEAACQQyEAAQAAAEcEAACUQyEAAQAAAEgEAACYQyEAAQAAAEkEAACcQyEAAQAAAEoEAACgQyEAAgAAAEsEAACoQyEAAQAAAEwEAACsQyEAAQAAAE0EAACwQyEAAQAAAE4EAAC0QyEAAQAAAE8EAAC4QyEAAQAAAFAEAAC8QyEAAQAAAFEEAADAQyEAAQAAAFIEAADEQyEAAQAAAFMEAADIQyEAAQAAAFQEAADMQyEAAQAAAFUEAADQQyEAAQAAAFYEAADUQyEAAQAAAFcEAADYQyEAAQAAAFgEAADcQyEAAQAAAFkEAADgQyEAAQAAAFoEAADkQyEAAQAAAFsEAADoQyEAAQAAAFwEAADsQyEAAQAAAF0EAADwQyEAAQAAAF4EAAD0QyEAAQAAAF8EAAD4QyEAAQAAAGAEAAD8QyEAAQAAAGEEAAAARCEAAQAAAGIEAAAERCEAAgAAAGMEAAAMRCEAAgAAAGQEAAAURCEAAQAAAGUEAAAYRCEAAQAAAGYEAAAcRCEAAQAAAGcEAAAgRCEAAQAAAGgEAAAkRCEAAQAAAGkEAAAoRCEAAQAAAGoEAAAsRCEAAQAAAGsEAAAwRCEAAQAAAGwEAAA0RCEAAQAAAG0EAAA4RCEAAQAAAG4EAAA8RCEAAQAAAG8EAABARCEAAQAAAHAEAABERCEAAQAAAHEEAABIRCEAAQAAAHIEAABMRCEAAQAAAHMEAABQRCEAAQAAAHQEAABURCEAAQAAAHUEAABYRCEAAQAAAHYEAABcRCEAAQAAAHcEAABgRCEAAQAAAHgEAABkRCEAAQAAAHkEAABoRCEAAQAAAHoEAABsRCEAAQAAAHsEAABwRCEAAQAAAHwEAAB0RCEAAQAAAH0EAAB4RCEAAQAAAH4EAAB8RCEAAQAAAH8EAACARCEAAQAAAIAEAACERCEAAQAAAIEEAACIRCEAAQAAAIoEAACMRCEAAQAAAIsEAACQRCEAAQAAAIwEAACURCEAAQAAAI0EAACYRCEAAQAAAI4EAACcRCEAAQAAAI8EAACgRCEAAQAAAJAEAACkRCEAAQAAAJEEAACoRCEAAQAAAJIEAACsRCEAAQAAAJMEAACwRCEAAQAAAJQEAAC0RCEAAQAAAJUEAAC4RCEAAQAAAJYEAAC8RCEAAQAAAJcEAADARCEAAQAAAJgEAADERCEAAQAAAJkEAADIRCEAAQAAAJoEAADMRCEAAQAAAJsEAADQRCEAAQAAAJwEAADURCEAAQAAAJ0EAADYRCEAAQAAAJ4EAADcRCEAAQAAAJ8EAADgRCEAAQAAAKAEAADkRCEAAQAAAKEEAADoRCEAAQAAAKIEAADsRCEAAQAAAKMEAADwRCEAAQAAAKQEAAD0RCEAAQAAAKUEAAD4RCEAAQAAAKYEAAD8RCEAAQAAAKcEAAAARSEAAQAAAKgEAAAERSEAAQAAAKkEAAAIRSEAAQAAAKoEAAAMRSEAAQAAAKsEAAAQRSEAAQAAAKwEAAAURSEAAQAAAK0EAAAYRSEAAQAAAK4EAAAcRSEAAQAAAK8EAAAgRSEAAQAAALAEAAAkRSEAAQAAALEEAAAoRSEAAQAAALIEAAAsRSEAAQAAALMEAAAwRSEAAQAAALQEAAA0RSEAAQAAALUEAAA4RSEAAQAAALYEAAA8RSEAAQAAALcEAABARSEAAQAAALgEAABERSEAAQAAALkEAABIRSEAAQAAALoEAABMRSEAAQAAALsEAABQRSEAAQAAALwEAABURSEAAQAAAL0EAABYRSEAAQAAAL4EAABcRSEAAQAAAL8EAABgRSEAAQAAAMAEAABkRSEAAQAAAMEEAABoRSEAAQAAAMIEAABsRSEAAQAAAMMEAABwRSEAAQAAAMQEAAB0RSEAAQAAAMUEAAB4RSEAAQAAAMYEAAB8RSEAAQAAAMcEAACARSEAAQAAAMgEAACERSEAAQAAAMkEAACIRSEAAQAAAMoEAACMRSEAAQAAAMsEAACQRSEAAQAAAMwEAACURSEAAQAAAM0EAACYRSEAAQAAAM4EAACcRSEAAQAAAM8EAACgRSEAAQAAANAEAACkRSEAAQAAANEEAACoRSEAAQAAANIEAACsRSEAAQAAANMEAACwRSEAAQAAANQEAAC0RSEAAQAAANUEAAC4RSEAAQAAANYEAAC8RSEAAQAAANcEAADARSEAAQAAANgEAADERSEAAQAAANkEAADIRSEAAQAAANoEAADMRSEAAQAAANsEAADQRSEAAQAAANwEAADURSEAAQAAAN0EAADYRSEAAQAAAN4EAADcRSEAAQAAAN8EAADgRSEAAQAAAOAEAADkRSEAAQAAAOEEAADoRSEAAQAAAOIEAADsRSEAAQAAAOMEAADwRSEAAQAAAOQEAAD0RSEAAQAAAOUEAAD4RSEAAQAAAOYEAAD8RSEAAQAAAOcEAAAARiEAAQAAAOgEAAAERiEAAQAAAOkEAAAIRiEAAQAAAOoEAAAMRiEAAQAAAOsEAAAQRiEAAQAAAOwEAAAURiEAAQAAAO0EAAAYRiEAAQAAAO4EAAAcRiEAAQAAAO8EAAAgRiEAAQAAAPAEAAAkRiEAAQAAAPEEAAAoRiEAAQAAAPIEAAAsRiEAAQAAAPMEAAAwRiEAAQAAAPQEAAA0RiEAAQAAAPUEAAA4RiEAAQAAAPYEAAA8RiEAAQAAAPcEAABARiEAAQAAAPgEAABERiEAAQAAAPkEAABIRiEAAQAAAPoEAABMRiEAAQAAAPsEAABQRiEAAQAAAPwEAABURiEAAQAAAP0EAABYRiEAAQAAAP4EAABcRiEAAQAAAP8EAABgRiEAAQAAAAAFAABkRiEAAQAAAAEFAABoRiEAAQAAAAIFAABsRiEAAQAAAAMFAABwRiEAAQAAAAQFAAB0RiEAAQAAAAUFAAB4RiEAAQAAAAYFAAB8RiEAAQAAAAcFAACARiEAAQAAAAgFAACERiEAAQAAAAkFAACIRiEAAQAAAAoFAACMRiEAAQAAAAsFAACQRiEAAQAAAAwFAACURiEAAQAAAA0FAACYRiEAAQAAAA4FAACcRiEAAQAAAA8FAACgRiEAAQAAABAFAACkRiEAAQAAABEFAACoRiEAAQAAABIFAACsRiEAAQAAABMFAACwRiEAAQAAABQFAAC0RiEAAQAAABUFAAC4RiEAAQAAABYFAAC8RiEAAQAAABcFAADARiEAAQAAABgFAADERiEAAQAAABkFAADIRiEAAQAAABoFAADMRiEAAQAAABsFAADQRiEAAQAAABwFAADURiEAAQAAAB0FAADYRiEAAQAAAB4FAADcRiEAAQAAAB8FAADgRiEAAQAAACAFAADkRiEAAQAAACEFAADoRiEAAQAAACIFAADsRiEAAQAAACMFAADwRiEAAQAAACQFAAD0RiEAAQAAACUFAAD4RiEAAQAAACYFAAD8RiEAAQAAACcFAAAARyEAAQAAACgFAAAERyEAAQAAACkFAAAIRyEAAQAAACoFAAAMRyEAAQAAACsFAAAQRyEAAQAAACwFAAAURyEAAQAAAC0FAAAYRyEAAQAAAC4FAAAcRyEAAQAAAC8FAAAgRyEAAQAAADEFAAAkRyEAAQAAADIFAAAoRyEAAQAAADMFAAAsRyEAAQAAADQFAAAwRyEAAQAAADUFAAA0RyEAAQAAADYFAAA4RyEAAQAAADcFAAA8RyEAAQAAADgFAABARyEAAQAAADkFAABERyEAAQAAADoFAABIRyEAAQAAADsFAABMRyEAAQAAADwFAABQRyEAAQAAAD0FAABURyEAAQAAAD4FAABYRyEAAQAAAD8FAABcRyEAAQAAAEAFAABgRyEAAQAAAEEFAABkRyEAAQAAAEIFAABoRyEAAQAAAEMFAABsRyEAAQAAAEQFAABwRyEAAQAAAEUFAAB0RyEAAQAAAEYFAAB4RyEAAQAAAEcFAAB8RyEAAQAAAEgFAACARyEAAQAAAEkFAACERyEAAQAAAEoFAACIRyEAAQAAAEsFAACMRyEAAQAAAEwFAACQRyEAAQAAAE0FAACURyEAAQAAAE4FAACYRyEAAQAAAE8FAACcRyEAAQAAAFAFAACgRyEAAQAAAFEFAACkRyEAAQAAAFIFAACoRyEAAQAAAFMFAACsRyEAAQAAAFQFAACwRyEAAQAAAFUFAAC0RyEAAQAAAFYFAAC4RyEAAQAAAGEFAAC8RyEAAQAAAGIFAADARyEAAQAAAGMFAADERyEAAQAAAGQFAADIRyEAAQAAAGUFAADMRyEAAQAAAGYFAADQRyEAAQAAAGcFAADURyEAAQAAAGgFAADYRyEAAQAAAGkFAADcRyEAAQAAAGoFAADgRyEAAQAAAGsFAADkRyEAAQAAAGwFAADoRyEAAQAAAG0FAADsRyEAAQAAAG4FAADwRyEAAQAAAG8FAAD0RyEAAQAAAHAFAAD4RyEAAQAAAHEFAAD8RyEAAQAAAHIFAAAASCEAAQAAAHMFAAAESCEAAQAAAHQFAAAISCEAAQAAAHUFAAAMSCEAAQAAAHYFAAAQSCEAAQAAAHcFAAAUSCEAAQAAAHgFAAAYSCEAAQAAAHkFAAAcSCEAAQAAAHoFAAAgSCEAAQAAAHsFAAAkSCEAAQAAAHwFAAAoSCEAAQAAAH0FAAAsSCEAAQAAAH4FAAAwSCEAAQAAAH8FAAA0SCEAAQAAAIAFAAA4SCEAAQAAAIEFAAA8SCEAAQAAAIIFAABASCEAAQAAAIMFAABESCEAAQAAAIQFAABISCEAAQAAAIUFAABMSCEAAQAAAIYFAABQSCEAAQAAAKAQAABUSCEAAQAAAKEQAABYSCEAAQAAAKIQAABcSCEAAQAAAKMQAABgSCEAAQAAAKQQAABkSCEAAQAAAKUQAABoSCEAAQAAAKYQAABsSCEAAQAAAKcQAABwSCEAAQAAAKgQAAB0SCEAAQAAAKkQAAB4SCEAAQAAAKoQAAB8SCEAAQAAAKsQAACASCEAAQAAAKwQAACESCEAAQAAAK0QAACISCEAAQAAAK4QAACMSCEAAQAAAK8QAACQSCEAAQAAALAQAACUSCEAAQAAALEQAACYSCEAAQAAALIQAACcSCEAAQAAALMQAACgSCEAAQAAALQQAACkSCEAAQAAALUQAACoSCEAAQAAALYQAACsSCEAAQAAALcQAACwSCEAAQAAALgQAAC0SCEAAQAAALkQAAC4SCEAAQAAALoQAAC8SCEAAQAAALsQAADASCEAAQAAALwQAADESCEAAQAAAL0QAADISCEAAQAAAL4QAADMSCEAAQAAAL8QAADQSCEAAQAAAMAQAADUSCEAAQAAAMEQAADYSCEAAQAAAMIQAADcSCEAAQAAAMMQAADgSCEAAQAAAMQQAADkSCEAAQAAAMUQAADoSCEAAQAAAMcQAADsSCEAAQAAAM0QAADwSCEAAQAAANAQAAD0SCEAAQAAANEQAAD4SCEAAQAAANIQAAD8SCEAAQAAANMQAAAASSEAAQAAANQQAAAESSEAAQAAANUQAAAISSEAAQAAANYQAAAMSSEAAQAAANcQAAAQSSEAAQAAANgQAAAUSSEAAQAAANkQAAAYSSEAAQAAANoQAAAcSSEAAQAAANsQAAAgSSEAAQAAANwQAAAkSSEAAQAAAN0QAAAoSSEAAQAAAN4QAAAsSSEAAQAAAN8QAAAwSSEAAQAAAOAQAAA0SSEAAQAAAOEQAAA4SSEAAQAAAOIQAAA8SSEAAQAAAOMQAABASSEAAQAAAOQQAABESSEAAQAAAOUQAABISSEAAQAAAOYQAABMSSEAAQAAAOcQAABQSSEAAQAAAOgQAABUSSEAAQAAAOkQAABYSSEAAQAAAOoQAABcSSEAAQAAAOsQAABgSSEAAQAAAOwQAABkSSEAAQAAAO0QAABoSSEAAQAAAO4QAABsSSEAAQAAAO8QAABwSSEAAQAAAPAQAAB0SSEAAQAAAPEQAAB4SSEAAQAAAPIQAAB8SSEAAQAAAPMQAACASSEAAQAAAPQQAACESSEAAQAAAPUQAACISSEAAQAAAPYQAACMSSEAAQAAAPcQAACQSSEAAQAAAPgQAACUSSEAAQAAAPkQAACYSSEAAQAAAPoQAACcSSEAAQAAAP0QAACgSSEAAQAAAP4QAACkSSEAAQAAAP8QAACoSSEAAQAAAKATAACsSSEAAQAAAKETAACwSSEAAQAAAKITAAC0SSEAAQAAAKMTAAC4SSEAAQAAAKQTAAC8SSEAAQAAAKUTAADASSEAAQAAAKYTAADESSEAAQAAAKcTAADISSEAAQAAAKgTAADMSSEAAQAAAKkTAADQSSEAAQAAAKoTAADUSSEAAQAAAKsTAADYSSEAAQAAAKwTAADcSSEAAQAAAK0TAADgSSEAAQAAAK4TAADkSSEAAQAAAK8TAADoSSEAAQAAALATAADsSSEAAQAAALETAADwSSEAAQAAALITAAD0SSEAAQAAALMTAAD4SSEAAQAAALQTAAD8SSEAAQAAALUTAAAASiEAAQAAALYTAAAESiEAAQAAALcTAAAISiEAAQAAALgTAAAMSiEAAQAAALkTAAAQSiEAAQAAALoTAAAUSiEAAQAAALsTAAAYSiEAAQAAALwTAAAcSiEAAQAAAL0TAAAgSiEAAQAAAL4TAAAkSiEAAQAAAL8TAAAoSiEAAQAAAMATAAAsSiEAAQAAAMETAAAwSiEAAQAAAMITAAA0SiEAAQAAAMMTAAA4SiEAAQAAAMQTAAA8SiEAAQAAAMUTAABASiEAAQAAAMYTAABESiEAAQAAAMcTAABISiEAAQAAAMgTAABMSiEAAQAAAMkTAABQSiEAAQAAAMoTAABUSiEAAQAAAMsTAABYSiEAAQAAAMwTAABcSiEAAQAAAM0TAABgSiEAAQAAAM4TAABkSiEAAQAAAM8TAABoSiEAAQAAANATAABsSiEAAQAAANETAABwSiEAAQAAANITAAB0SiEAAQAAANMTAAB4SiEAAQAAANQTAAB8SiEAAQAAANUTAACASiEAAQAAANYTAACESiEAAQAAANcTAACISiEAAQAAANgTAACMSiEAAQAAANkTAACQSiEAAQAAANoTAACUSiEAAQAAANsTAACYSiEAAQAAANwTAACcSiEAAQAAAN0TAACgSiEAAQAAAN4TAACkSiEAAQAAAN8TAACoSiEAAQAAAOATAACsSiEAAQAAAOETAACwSiEAAQAAAOITAAC0SiEAAQAAAOMTAAC4SiEAAQAAAOQTAAC8SiEAAQAAAOUTAADASiEAAQAAAOYTAADESiEAAQAAAOcTAADISiEAAQAAAOgTAADMSiEAAQAAAOkTAADQSiEAAQAAAOoTAADUSiEAAQAAAOsTAADYSiEAAQAAAOwTAADcSiEAAQAAAO0TAADgSiEAAQAAAO4TAADkSiEAAQAAAO8TAADoSiEAAQAAAPATAADsSiEAAQAAAPETAADwSiEAAQAAAPITAAD0SiEAAQAAAPMTAAD4SiEAAQAAAPQTAAD8SiEAAQAAAPUTAAAASyEAAQAAAPgTAAAESyEAAQAAAPkTAAAISyEAAQAAAPoTAAAMSyEAAQAAAPsTAAAQSyEAAQAAAPwTAAAUSyEAAQAAAP0TAAAYSyEAAQAAAIAcAAAcSyEAAgAAAIEcAAAkSyEAAgAAAIIcAAAsSyEAAgAAAIMcAAA0SyEAAgAAAIQcAAA8SyEAAwAAAIUcAABISyEAAwAAAIYcAABUSyEAAgAAAIccAABcSyEAAgAAAIgcAABkSyEAAgAAAIkcAABsSyEAAQAAAIocAABwSyEAAQAAAJAcAAB0SyEAAQAAAJEcAAB4SyEAAQAAAJIcAAB8SyEAAQAAAJMcAACASyEAAQAAAJQcAACESyEAAQAAAJUcAACISyEAAQAAAJYcAACMSyEAAQAAAJccAACQSyEAAQAAAJgcAACUSyEAAQAAAJkcAACYSyEAAQAAAJocAACcSyEAAQAAAJscAACgSyEAAQAAAJwcAACkSyEAAQAAAJ0cAACoSyEAAQAAAJ4cAACsSyEAAQAAAJ8cAACwSyEAAQAAAKAcAAC0SyEAAQAAAKEcAAC4SyEAAQAAAKIcAAC8SyEAAQAAAKMcAADASyEAAQAAAKQcAADESyEAAQAAAKUcAADISyEAAQAAAKYcAADMSyEAAQAAAKccAADQSyEAAQAAAKgcAADUSyEAAQAAAKkcAADYSyEAAQAAAKocAADcSyEAAQAAAKscAADgSyEAAQAAAKwcAADkSyEAAQAAAK0cAADoSyEAAQAAAK4cAADsSyEAAQAAAK8cAADwSyEAAQAAALAcAAD0SyEAAQAAALEcAAD4SyEAAQAAALIcAAD8SyEAAQAAALMcAAAATCEAAQAAALQcAAAETCEAAQAAALUcAAAITCEAAQAAALYcAAAMTCEAAQAAALccAAAQTCEAAQAAALgcAAAUTCEAAQAAALkcAAAYTCEAAQAAALocAAAcTCEAAQAAAL0cAAAgTCEAAQAAAL4cAAAkTCEAAQAAAL8cAAAoTCEAAQAAAHkdAAAsTCEAAQAAAH0dAAAwTCEAAQAAAI4dAAA0TCEAAQAAAAAeAAA4TCEAAQAAAAEeAAA8TCEAAQAAAAIeAABATCEAAQAAAAMeAABETCEAAQAAAAQeAABITCEAAQAAAAUeAABMTCEAAQAAAAYeAABQTCEAAQAAAAceAABUTCEAAQAAAAgeAABYTCEAAQAAAAkeAABcTCEAAQAAAAoeAABgTCEAAQAAAAseAABkTCEAAQAAAAweAABoTCEAAQAAAA0eAABsTCEAAQAAAA4eAABwTCEAAQAAAA8eAAB0TCEAAQAAABAeAAB4TCEAAQAAABEeAAB8TCEAAQAAABIeAACATCEAAQAAABMeAACETCEAAQAAABQeAACITCEAAQAAABUeAACMTCEAAQAAABYeAACQTCEAAQAAABceAACUTCEAAQAAABgeAACYTCEAAQAAABkeAACcTCEAAQAAABoeAACgTCEAAQAAABseAACkTCEAAQAAABweAACoTCEAAQAAAB0eAACsTCEAAQAAAB4eAACwTCEAAQAAAB8eAAC0TCEAAQAAACAeAAC4TCEAAQAAACEeAAC8TCEAAQAAACIeAADATCEAAQAAACMeAADETCEAAQAAACQeAADITCEAAQAAACUeAADMTCEAAQAAACYeAADQTCEAAQAAACceAADUTCEAAQAAACgeAADYTCEAAQAAACkeAADcTCEAAQAAACoeAADgTCEAAQAAACseAADkTCEAAQAAACweAADoTCEAAQAAAC0eAADsTCEAAQAAAC4eAADwTCEAAQAAAC8eAAD0TCEAAQAAADAeAAD4TCEAAQAAADEeAAD8TCEAAQAAADIeAAAATSEAAQAAADMeAAAETSEAAQAAADQeAAAITSEAAQAAADUeAAAMTSEAAQAAADYeAAAQTSEAAQAAADceAAAUTSEAAQAAADgeAAAYTSEAAQAAADkeAAAcTSEAAQAAADoeAAAgTSEAAQAAADseAAAkTSEAAQAAADweAAAoTSEAAQAAAD0eAAAsTSEAAQAAAD4eAAAwTSEAAQAAAD8eAAA0TSEAAQAAAEAeAAA4TSEAAQAAAEEeAAA8TSEAAQAAAEIeAABATSEAAQAAAEMeAABETSEAAQAAAEQeAABITSEAAQAAAEUeAABMTSEAAQAAAEYeAABQTSEAAQAAAEceAABUTSEAAQAAAEgeAABYTSEAAQAAAEkeAABcTSEAAQAAAEoeAABgTSEAAQAAAEseAABkTSEAAQAAAEweAABoTSEAAQAAAE0eAABsTSEAAQAAAE4eAABwTSEAAQAAAE8eAAB0TSEAAQAAAFAeAAB4TSEAAQAAAFEeAAB8TSEAAQAAAFIeAACATSEAAQAAAFMeAACETSEAAQAAAFQeAACITSEAAQAAAFUeAACMTSEAAQAAAFYeAACQTSEAAQAAAFceAACUTSEAAQAAAFgeAACYTSEAAQAAAFkeAACcTSEAAQAAAFoeAACgTSEAAQAAAFseAACkTSEAAQAAAFweAACoTSEAAQAAAF0eAACsTSEAAQAAAF4eAACwTSEAAQAAAF8eAAC0TSEAAQAAAGAeAAC4TSEAAgAAAGEeAADATSEAAgAAAGIeAADITSEAAQAAAGMeAADMTSEAAQAAAGQeAADQTSEAAQAAAGUeAADUTSEAAQAAAGYeAADYTSEAAQAAAGceAADcTSEAAQAAAGgeAADgTSEAAQAAAGkeAADkTSEAAQAAAGoeAADoTSEAAQAAAGseAADsTSEAAQAAAGweAADwTSEAAQAAAG0eAAD0TSEAAQAAAG4eAAD4TSEAAQAAAG8eAAD8TSEAAQAAAHAeAAAATiEAAQAAAHEeAAAETiEAAQAAAHIeAAAITiEAAQAAAHMeAAAMTiEAAQAAAHQeAAAQTiEAAQAAAHUeAAAUTiEAAQAAAHYeAAAYTiEAAQAAAHceAAAcTiEAAQAAAHgeAAAgTiEAAQAAAHkeAAAkTiEAAQAAAHoeAAAoTiEAAQAAAHseAAAsTiEAAQAAAHweAAAwTiEAAQAAAH0eAAA0TiEAAQAAAH4eAAA4TiEAAQAAAH8eAAA8TiEAAQAAAIAeAABATiEAAQAAAIEeAABETiEAAQAAAIIeAABITiEAAQAAAIMeAABMTiEAAQAAAIQeAABQTiEAAQAAAIUeAABUTiEAAQAAAIYeAABYTiEAAQAAAIceAABcTiEAAQAAAIgeAABgTiEAAQAAAIkeAABkTiEAAQAAAIoeAABoTiEAAQAAAIseAABsTiEAAQAAAIweAABwTiEAAQAAAI0eAAB0TiEAAQAAAI4eAAB4TiEAAQAAAI8eAAB8TiEAAQAAAJAeAACATiEAAQAAAJEeAACETiEAAQAAAJIeAACITiEAAQAAAJMeAACMTiEAAQAAAJQeAACQTiEAAQAAAJUeAACUTiEAAQAAAJseAACYTiEAAgAAAJ4eAACgTiEAAQAAAKAeAACkTiEAAQAAAKEeAACoTiEAAQAAAKIeAACsTiEAAQAAAKMeAACwTiEAAQAAAKQeAAC0TiEAAQAAAKUeAAC4TiEAAQAAAKYeAAC8TiEAAQAAAKceAADATiEAAQAAAKgeAADETiEAAQAAAKkeAADITiEAAQAAAKoeAADMTiEAAQAAAKseAADQTiEAAQAAAKweAADUTiEAAQAAAK0eAADYTiEAAQAAAK4eAADcTiEAAQAAAK8eAADgTiEAAQAAALAeAADkTiEAAQAAALEeAADoTiEAAQAAALIeAADsTiEAAQAAALMeAADwTiEAAQAAALQeAAD0TiEAAQAAALUeAAD4TiEAAQAAALYeAAD8TiEAAQAAALceAAAATyEAAQAAALgeAAAETyEAAQAAALkeAAAITyEAAQAAALoeAAAMTyEAAQAAALseAAAQTyEAAQAAALweAAAUTyEAAQAAAL0eAAAYTyEAAQAAAL4eAAAcTyEAAQAAAL8eAAAgTyEAAQAAAMAeAAAkTyEAAQAAAMEeAAAoTyEAAQAAAMIeAAAsTyEAAQAAAMMeAAAwTyEAAQAAAMQeAAA0TyEAAQAAAMUeAAA4TyEAAQAAAMYeAAA8TyEAAQAAAMceAABATyEAAQAAAMgeAABETyEAAQAAAMkeAABITyEAAQAAAMoeAABMTyEAAQAAAMseAABQTyEAAQAAAMweAABUTyEAAQAAAM0eAABYTyEAAQAAAM4eAABcTyEAAQAAAM8eAABgTyEAAQAAANAeAABkTyEAAQAAANEeAABoTyEAAQAAANIeAABsTyEAAQAAANMeAABwTyEAAQAAANQeAAB0TyEAAQAAANUeAAB4TyEAAQAAANYeAAB8TyEAAQAAANceAACATyEAAQAAANgeAACETyEAAQAAANkeAACITyEAAQAAANoeAACMTyEAAQAAANseAACQTyEAAQAAANweAACUTyEAAQAAAN0eAACYTyEAAQAAAN4eAACcTyEAAQAAAN8eAACgTyEAAQAAAOAeAACkTyEAAQAAAOEeAACoTyEAAQAAAOIeAACsTyEAAQAAAOMeAACwTyEAAQAAAOQeAAC0TyEAAQAAAOUeAAC4TyEAAQAAAOYeAAC8TyEAAQAAAOceAADATyEAAQAAAOgeAADETyEAAQAAAOkeAADITyEAAQAAAOoeAADMTyEAAQAAAOseAADQTyEAAQAAAOweAADUTyEAAQAAAO0eAADYTyEAAQAAAO4eAADcTyEAAQAAAO8eAADgTyEAAQAAAPAeAADkTyEAAQAAAPEeAADoTyEAAQAAAPIeAADsTyEAAQAAAPMeAADwTyEAAQAAAPQeAAD0TyEAAQAAAPUeAAD4TyEAAQAAAPYeAAD8TyEAAQAAAPceAAAAUCEAAQAAAPgeAAAEUCEAAQAAAPkeAAAIUCEAAQAAAPoeAAAMUCEAAQAAAPseAAAQUCEAAQAAAPweAAAUUCEAAQAAAP0eAAAYUCEAAQAAAP4eAAAcUCEAAQAAAP8eAAAgUCEAAQAAAAAfAAAkUCEAAQAAAAEfAAAoUCEAAQAAAAIfAAAsUCEAAQAAAAMfAAAwUCEAAQAAAAQfAAA0UCEAAQAAAAUfAAA4UCEAAQAAAAYfAAA8UCEAAQAAAAcfAABAUCEAAQAAAAgfAABEUCEAAQAAAAkfAABIUCEAAQAAAAofAABMUCEAAQAAAAsfAABQUCEAAQAAAAwfAABUUCEAAQAAAA0fAABYUCEAAQAAAA4fAABcUCEAAQAAAA8fAABgUCEAAQAAABAfAABkUCEAAQAAABEfAABoUCEAAQAAABIfAABsUCEAAQAAABMfAABwUCEAAQAAABQfAAB0UCEAAQAAABUfAAB4UCEAAQAAABgfAAB8UCEAAQAAABkfAACAUCEAAQAAABofAACEUCEAAQAAABsfAACIUCEAAQAAABwfAACMUCEAAQAAAB0fAACQUCEAAQAAACAfAACUUCEAAQAAACEfAACYUCEAAQAAACIfAACcUCEAAQAAACMfAACgUCEAAQAAACQfAACkUCEAAQAAACUfAACoUCEAAQAAACYfAACsUCEAAQAAACcfAACwUCEAAQAAACgfAAC0UCEAAQAAACkfAAC4UCEAAQAAACofAAC8UCEAAQAAACsfAADAUCEAAQAAACwfAADEUCEAAQAAAC0fAADIUCEAAQAAAC4fAADMUCEAAQAAAC8fAADQUCEAAQAAADAfAADUUCEAAQAAADEfAADYUCEAAQAAADIfAADcUCEAAQAAADMfAADgUCEAAQAAADQfAADkUCEAAQAAADUfAADoUCEAAQAAADYfAADsUCEAAQAAADcfAADwUCEAAQAAADgfAAD0UCEAAQAAADkfAAD4UCEAAQAAADofAAD8UCEAAQAAADsfAAAAUSEAAQAAADwfAAAEUSEAAQAAAD0fAAAIUSEAAQAAAD4fAAAMUSEAAQAAAD8fAAAQUSEAAQAAAEAfAAAUUSEAAQAAAEEfAAAYUSEAAQAAAEIfAAAcUSEAAQAAAEMfAAAgUSEAAQAAAEQfAAAkUSEAAQAAAEUfAAAoUSEAAQAAAEgfAAAsUSEAAQAAAEkfAAAwUSEAAQAAAEofAAA0USEAAQAAAEsfAAA4USEAAQAAAEwfAAA8USEAAQAAAE0fAABAUSEAAQAAAFEfAABEUSEAAQAAAFMfAABIUSEAAQAAAFUfAABMUSEAAQAAAFcfAABQUSEAAQAAAFkfAABUUSEAAQAAAFsfAABYUSEAAQAAAF0fAABcUSEAAQAAAF8fAABgUSEAAQAAAGAfAABkUSEAAQAAAGEfAABoUSEAAQAAAGIfAABsUSEAAQAAAGMfAABwUSEAAQAAAGQfAAB0USEAAQAAAGUfAAB4USEAAQAAAGYfAAB8USEAAQAAAGcfAACAUSEAAQAAAGgfAACEUSEAAQAAAGkfAACIUSEAAQAAAGofAACMUSEAAQAAAGsfAACQUSEAAQAAAGwfAACUUSEAAQAAAG0fAACYUSEAAQAAAG4fAACcUSEAAQAAAG8fAACgUSEAAQAAAHAfAACkUSEAAQAAAHEfAACoUSEAAQAAAHIfAACsUSEAAQAAAHMfAACwUSEAAQAAAHQfAAC0USEAAQAAAHUfAAC4USEAAQAAAHYfAAC8USEAAQAAAHcfAADAUSEAAQAAAHgfAADEUSEAAQAAAHkfAADIUSEAAQAAAHofAADMUSEAAQAAAHsfAADQUSEAAQAAAHwfAADUUSEAAQAAAH0fAADYUSEAAQAAAIAfAADcUSEAAQAAAIEfAADgUSEAAQAAAIIfAADkUSEAAQAAAIMfAADoUSEAAQAAAIQfAADsUSEAAQAAAIUfAADwUSEAAQAAAIYfAAD0USEAAQAAAIcfAAD4USEAAQAAAIgfAAD8USEAAQAAAIkfAAAAUiEAAQAAAIofAAAEUiEAAQAAAIsfAAAIUiEAAQAAAIwfAAAMUiEAAQAAAI0fAAAQUiEAAQAAAI4fAAAUUiEAAQAAAI8fAAAYUiEAAQAAAJAfAAAcUiEAAQAAAJEfAAAgUiEAAQAAAJIfAAAkUiEAAQAAAJMfAAAoUiEAAQAAAJQfAAAsUiEAAQAAAJUfAAAwUiEAAQAAAJYfAAA0UiEAAQAAAJcfAAA4UiEAAQAAAJgfAAA8UiEAAQAAAJkfAABAUiEAAQAAAJofAABEUiEAAQAAAJsfAABIUiEAAQAAAJwfAABMUiEAAQAAAJ0fAABQUiEAAQAAAJ4fAABUUiEAAQAAAJ8fAABYUiEAAQAAAKAfAABcUiEAAQAAAKEfAABgUiEAAQAAAKIfAABkUiEAAQAAAKMfAABoUiEAAQAAAKQfAABsUiEAAQAAAKUfAABwUiEAAQAAAKYfAAB0UiEAAQAAAKcfAAB4UiEAAQAAAKgfAAB8UiEAAQAAAKkfAACAUiEAAQAAAKofAACEUiEAAQAAAKsfAACIUiEAAQAAAKwfAACMUiEAAQAAAK0fAACQUiEAAQAAAK4fAACUUiEAAQAAAK8fAACYUiEAAQAAALAfAACcUiEAAQAAALEfAACgUiEAAQAAALMfAACkUiEAAQAAALgfAACoUiEAAQAAALkfAACsUiEAAQAAALofAACwUiEAAQAAALsfAAC0UiEAAQAAALwfAAC4UiEAAQAAAL4fAAC8UiEAAwAAAMMfAADIUiEAAQAAAMgfAADMUiEAAQAAAMkfAADQUiEAAQAAAMofAADUUiEAAQAAAMsfAADYUiEAAQAAAMwfAADcUiEAAQAAANAfAADgUiEAAQAAANEfAADkUiEAAQAAANMfAADoUiEAAQAAANgfAADsUiEAAQAAANkfAADwUiEAAQAAANofAAD0UiEAAQAAANsfAAD4UiEAAQAAAOAfAAD8UiEAAQAAAOEfAAAAUyEAAQAAAOMfAAAEUyEAAQAAAOUfAAAIUyEAAQAAAOgfAAAMUyEAAQAAAOkfAAAQUyEAAQAAAOofAAAUUyEAAQAAAOsfAAAYUyEAAQAAAOwfAAAcUyEAAQAAAPMfAAAgUyEAAQAAAPgfAAAkUyEAAQAAAPkfAAAoUyEAAQAAAPofAAAsUyEAAQAAAPsfAAAwUyEAAQAAAPwfAAA0UyEAAQAAACYhAAA4UyEAAgAAACohAABAUyEAAgAAACshAABIUyEAAgAAADIhAABQUyEAAQAAAE4hAABUUyEAAQAAAGAhAABYUyEAAQAAAGEhAABcUyEAAQAAAGIhAABgUyEAAQAAAGMhAABkUyEAAQAAAGQhAABoUyEAAQAAAGUhAABsUyEAAQAAAGYhAABwUyEAAQAAAGchAAB0UyEAAQAAAGghAAB4UyEAAQAAAGkhAAB8UyEAAQAAAGohAACAUyEAAQAAAGshAACEUyEAAQAAAGwhAACIUyEAAQAAAG0hAACMUyEAAQAAAG4hAACQUyEAAQAAAG8hAACUUyEAAQAAAHAhAACYUyEAAQAAAHEhAACcUyEAAQAAAHIhAACgUyEAAQAAAHMhAACkUyEAAQAAAHQhAACoUyEAAQAAAHUhAACsUyEAAQAAAHYhAACwUyEAAQAAAHchAAC0UyEAAQAAAHghAAC4UyEAAQAAAHkhAAC8UyEAAQAAAHohAADAUyEAAQAAAHshAADEUyEAAQAAAHwhAADIUyEAAQAAAH0hAADMUyEAAQAAAH4hAADQUyEAAQAAAH8hAADUUyEAAQAAAIMhAADYUyEAAQAAAIQhAADcUyEAAQAAALYkAADgUyEAAQAAALckAADkUyEAAQAAALgkAADoUyEAAQAAALkkAADsUyEAAQAAALokAADwUyEAAQAAALskAAD0UyEAAQAAALwkAAD4UyEAAQAAAL0kAAD8UyEAAQAAAL4kAAAAVCEAAQAAAL8kAAAEVCEAAQAAAMAkAAAIVCEAAQAAAMEkAAAMVCEAAQAAAMIkAAAQVCEAAQAAAMMkAAAUVCEAAQAAAMQkAAAYVCEAAQAAAMUkAAAcVCEAAQAAAMYkAAAgVCEAAQAAAMckAAAkVCEAAQAAAMgkAAAoVCEAAQAAAMkkAAAsVCEAAQAAAMokAAAwVCEAAQAAAMskAAA0VCEAAQAAAMwkAAA4VCEAAQAAAM0kAAA8VCEAAQAAAM4kAABAVCEAAQAAAM8kAABEVCEAAQAAANAkAABIVCEAAQAAANEkAABMVCEAAQAAANIkAABQVCEAAQAAANMkAABUVCEAAQAAANQkAABYVCEAAQAAANUkAABcVCEAAQAAANYkAABgVCEAAQAAANckAABkVCEAAQAAANgkAABoVCEAAQAAANkkAABsVCEAAQAAANokAABwVCEAAQAAANskAAB0VCEAAQAAANwkAAB4VCEAAQAAAN0kAAB8VCEAAQAAAN4kAACAVCEAAQAAAN8kAACEVCEAAQAAAOAkAACIVCEAAQAAAOEkAACMVCEAAQAAAOIkAACQVCEAAQAAAOMkAACUVCEAAQAAAOQkAACYVCEAAQAAAOUkAACcVCEAAQAAAOYkAACgVCEAAQAAAOckAACkVCEAAQAAAOgkAACoVCEAAQAAAOkkAACsVCEAAQAAAAAsAACwVCEAAQAAAAEsAAC0VCEAAQAAAAIsAAC4VCEAAQAAAAMsAAC8VCEAAQAAAAQsAADAVCEAAQAAAAUsAADEVCEAAQAAAAYsAADIVCEAAQAAAAcsAADMVCEAAQAAAAgsAADQVCEAAQAAAAksAADUVCEAAQAAAAosAADYVCEAAQAAAAssAADcVCEAAQAAAAwsAADgVCEAAQAAAA0sAADkVCEAAQAAAA4sAADoVCEAAQAAAA8sAADsVCEAAQAAABAsAADwVCEAAQAAABEsAAD0VCEAAQAAABIsAAD4VCEAAQAAABMsAAD8VCEAAQAAABQsAAAAVSEAAQAAABUsAAAEVSEAAQAAABYsAAAIVSEAAQAAABcsAAAMVSEAAQAAABgsAAAQVSEAAQAAABksAAAUVSEAAQAAABosAAAYVSEAAQAAABssAAAcVSEAAQAAABwsAAAgVSEAAQAAAB0sAAAkVSEAAQAAAB4sAAAoVSEAAQAAAB8sAAAsVSEAAQAAACAsAAAwVSEAAQAAACEsAAA0VSEAAQAAACIsAAA4VSEAAQAAACMsAAA8VSEAAQAAACQsAABAVSEAAQAAACUsAABEVSEAAQAAACYsAABIVSEAAQAAACcsAABMVSEAAQAAACgsAABQVSEAAQAAACksAABUVSEAAQAAACosAABYVSEAAQAAACssAABcVSEAAQAAACwsAABgVSEAAQAAAC0sAABkVSEAAQAAAC4sAABoVSEAAQAAAC8sAABsVSEAAQAAADAsAABwVSEAAQAAADEsAAB0VSEAAQAAADIsAAB4VSEAAQAAADMsAAB8VSEAAQAAADQsAACAVSEAAQAAADUsAACEVSEAAQAAADYsAACIVSEAAQAAADcsAACMVSEAAQAAADgsAACQVSEAAQAAADksAACUVSEAAQAAADosAACYVSEAAQAAADssAACcVSEAAQAAADwsAACgVSEAAQAAAD0sAACkVSEAAQAAAD4sAACoVSEAAQAAAD8sAACsVSEAAQAAAEAsAACwVSEAAQAAAEEsAAC0VSEAAQAAAEIsAAC4VSEAAQAAAEMsAAC8VSEAAQAAAEQsAADAVSEAAQAAAEUsAADEVSEAAQAAAEYsAADIVSEAAQAAAEcsAADMVSEAAQAAAEgsAADQVSEAAQAAAEksAADUVSEAAQAAAEosAADYVSEAAQAAAEssAADcVSEAAQAAAEwsAADgVSEAAQAAAE0sAADkVSEAAQAAAE4sAADoVSEAAQAAAE8sAADsVSEAAQAAAFAsAADwVSEAAQAAAFEsAAD0VSEAAQAAAFIsAAD4VSEAAQAAAFMsAAD8VSEAAQAAAFQsAAAAViEAAQAAAFUsAAAEViEAAQAAAFYsAAAIViEAAQAAAFcsAAAMViEAAQAAAFgsAAAQViEAAQAAAFksAAAUViEAAQAAAFosAAAYViEAAQAAAFssAAAcViEAAQAAAFwsAAAgViEAAQAAAF0sAAAkViEAAQAAAF4sAAAoViEAAQAAAF8sAAAsViEAAQAAAGAsAAAwViEAAQAAAGEsAAA0ViEAAQAAAGIsAAA4ViEAAQAAAGMsAAA8ViEAAQAAAGQsAABAViEAAQAAAGUsAABEViEAAQAAAGYsAABIViEAAQAAAGcsAABMViEAAQAAAGgsAABQViEAAQAAAGksAABUViEAAQAAAGosAABYViEAAQAAAGssAABcViEAAQAAAGwsAABgViEAAQAAAG0sAABkViEAAQAAAG4sAABoViEAAQAAAG8sAABsViEAAQAAAHAsAABwViEAAQAAAHIsAAB0ViEAAQAAAHMsAAB4ViEAAQAAAHUsAAB8ViEAAQAAAHYsAACAViEAAQAAAH4sAACEViEAAQAAAH8sAACIViEAAQAAAIAsAACMViEAAQAAAIEsAACQViEAAQAAAIIsAACUViEAAQAAAIMsAACYViEAAQAAAIQsAACcViEAAQAAAIUsAACgViEAAQAAAIYsAACkViEAAQAAAIcsAACoViEAAQAAAIgsAACsViEAAQAAAIksAACwViEAAQAAAIosAAC0ViEAAQAAAIssAAC4ViEAAQAAAIwsAAC8ViEAAQAAAI0sAADAViEAAQAAAI4sAADEViEAAQAAAI8sAADIViEAAQAAAJAsAADMViEAAQAAAJEsAADQViEAAQAAAJIsAADUViEAAQAAAJMsAADYViEAAQAAAJQsAADcViEAAQAAAJUsAADgViEAAQAAAJYsAADkViEAAQAAAJcsAADoViEAAQAAAJgsAADsViEAAQAAAJksAADwViEAAQAAAJosAAD0ViEAAQAAAJssAAD4ViEAAQAAAJwsAAD8ViEAAQAAAJ0sAAAAVyEAAQAAAJ4sAAAEVyEAAQAAAJ8sAAAIVyEAAQAAAKAsAAAMVyEAAQAAAKEsAAAQVyEAAQAAAKIsAAAUVyEAAQAAAKMsAAAYVyEAAQAAAKQsAAAcVyEAAQAAAKUsAAAgVyEAAQAAAKYsAAAkVyEAAQAAAKcsAAAoVyEAAQAAAKgsAAAsVyEAAQAAAKksAAAwVyEAAQAAAKosAAA0VyEAAQAAAKssAAA4VyEAAQAAAKwsAAA8VyEAAQAAAK0sAABAVyEAAQAAAK4sAABEVyEAAQAAAK8sAABIVyEAAQAAALAsAABMVyEAAQAAALEsAABQVyEAAQAAALIsAABUVyEAAQAAALMsAABYVyEAAQAAALQsAABcVyEAAQAAALUsAABgVyEAAQAAALYsAABkVyEAAQAAALcsAABoVyEAAQAAALgsAABsVyEAAQAAALksAABwVyEAAQAAALosAAB0VyEAAQAAALssAAB4VyEAAQAAALwsAAB8VyEAAQAAAL0sAACAVyEAAQAAAL4sAACEVyEAAQAAAL8sAACIVyEAAQAAAMAsAACMVyEAAQAAAMEsAACQVyEAAQAAAMIsAACUVyEAAQAAAMMsAACYVyEAAQAAAMQsAACcVyEAAQAAAMUsAACgVyEAAQAAAMYsAACkVyEAAQAAAMcsAACoVyEAAQAAAMgsAACsVyEAAQAAAMksAACwVyEAAQAAAMosAAC0VyEAAQAAAMssAAC4VyEAAQAAAMwsAAC8VyEAAQAAAM0sAADAVyEAAQAAAM4sAADEVyEAAQAAAM8sAADIVyEAAQAAANAsAADMVyEAAQAAANEsAADQVyEAAQAAANIsAADUVyEAAQAAANMsAADYVyEAAQAAANQsAADcVyEAAQAAANUsAADgVyEAAQAAANYsAADkVyEAAQAAANcsAADoVyEAAQAAANgsAADsVyEAAQAAANksAADwVyEAAQAAANosAAD0VyEAAQAAANssAAD4VyEAAQAAANwsAAD8VyEAAQAAAN0sAAAAWCEAAQAAAN4sAAAEWCEAAQAAAN8sAAAIWCEAAQAAAOAsAAAMWCEAAQAAAOEsAAAQWCEAAQAAAOIsAAAUWCEAAQAAAOMsAAAYWCEAAQAAAOssAAAcWCEAAQAAAOwsAAAgWCEAAQAAAO0sAAAkWCEAAQAAAO4sAAAoWCEAAQAAAPIsAAAsWCEAAQAAAPMsAAAwWCEAAQAAAAAtAAA0WCEAAQAAAAEtAAA4WCEAAQAAAAItAAA8WCEAAQAAAAMtAABAWCEAAQAAAAQtAABEWCEAAQAAAAUtAABIWCEAAQAAAAYtAABMWCEAAQAAAActAABQWCEAAQAAAAgtAABUWCEAAQAAAAktAABYWCEAAQAAAAotAABcWCEAAQAAAAstAABgWCEAAQAAAAwtAABkWCEAAQAAAA0tAABoWCEAAQAAAA4tAABsWCEAAQAAAA8tAABwWCEAAQAAABAtAAB0WCEAAQAAABEtAAB4WCEAAQAAABItAAB8WCEAAQAAABMtAACAWCEAAQAAABQtAACEWCEAAQAAABUtAACIWCEAAQAAABYtAACMWCEAAQAAABctAACQWCEAAQAAABgtAACUWCEAAQAAABktAACYWCEAAQAAABotAACcWCEAAQAAABstAACgWCEAAQAAABwtAACkWCEAAQAAAB0tAACoWCEAAQAAAB4tAACsWCEAAQAAAB8tAACwWCEAAQAAACAtAAC0WCEAAQAAACEtAAC4WCEAAQAAACItAAC8WCEAAQAAACMtAADAWCEAAQAAACQtAADEWCEAAQAAACUtAADIWCEAAQAAACctAADMWCEAAQAAAC0tAADQWCEAAQAAAECmAADUWCEAAQAAAEGmAADYWCEAAQAAAEKmAADcWCEAAQAAAEOmAADgWCEAAQAAAESmAADkWCEAAQAAAEWmAADoWCEAAQAAAEamAADsWCEAAQAAAEemAADwWCEAAQAAAEimAAD0WCEAAQAAAEmmAAD4WCEAAQAAAEqmAAD8WCEAAgAAAEumAAAEWSEAAgAAAEymAAAMWSEAAQAAAE2mAAAQWSEAAQAAAE6mAAAUWSEAAQAAAE+mAAAYWSEAAQAAAFCmAAAcWSEAAQAAAFGmAAAgWSEAAQAAAFKmAAAkWSEAAQAAAFOmAAAoWSEAAQAAAFSmAAAsWSEAAQAAAFWmAAAwWSEAAQAAAFamAAA0WSEAAQAAAFemAAA4WSEAAQAAAFimAAA8WSEAAQAAAFmmAABAWSEAAQAAAFqmAABEWSEAAQAAAFumAABIWSEAAQAAAFymAABMWSEAAQAAAF2mAABQWSEAAQAAAF6mAABUWSEAAQAAAF+mAABYWSEAAQAAAGCmAABcWSEAAQAAAGGmAABgWSEAAQAAAGKmAABkWSEAAQAAAGOmAABoWSEAAQAAAGSmAABsWSEAAQAAAGWmAABwWSEAAQAAAGamAAB0WSEAAQAAAGemAAB4WSEAAQAAAGimAAB8WSEAAQAAAGmmAACAWSEAAQAAAGqmAACEWSEAAQAAAGumAACIWSEAAQAAAGymAACMWSEAAQAAAG2mAACQWSEAAQAAAICmAACUWSEAAQAAAIGmAACYWSEAAQAAAIKmAACcWSEAAQAAAIOmAACgWSEAAQAAAISmAACkWSEAAQAAAIWmAACoWSEAAQAAAIamAACsWSEAAQAAAIemAACwWSEAAQAAAIimAAC0WSEAAQAAAImmAAC4WSEAAQAAAIqmAAC8WSEAAQAAAIumAADAWSEAAQAAAIymAADEWSEAAQAAAI2mAADIWSEAAQAAAI6mAADMWSEAAQAAAI+mAADQWSEAAQAAAJCmAADUWSEAAQAAAJGmAADYWSEAAQAAAJKmAADcWSEAAQAAAJOmAADgWSEAAQAAAJSmAADkWSEAAQAAAJWmAADoWSEAAQAAAJamAADsWSEAAQAAAJemAADwWSEAAQAAAJimAAD0WSEAAQAAAJmmAAD4WSEAAQAAAJqmAAD8WSEAAQAAAJumAAAAWiEAAQAAACKnAAAEWiEAAQAAACOnAAAIWiEAAQAAACSnAAAMWiEAAQAAACWnAAAQWiEAAQAAACanAAAUWiEAAQAAACenAAAYWiEAAQAAACinAAAcWiEAAQAAACmnAAAgWiEAAQAAACqnAAAkWiEAAQAAACunAAAoWiEAAQAAACynAAAsWiEAAQAAAC2nAAAwWiEAAQAAAC6nAAA0WiEAAQAAAC+nAAA4WiEAAQAAADKnAAA8WiEAAQAAADOnAABAWiEAAQAAADSnAABEWiEAAQAAADWnAABIWiEAAQAAADanAABMWiEAAQAAADenAABQWiEAAQAAADinAABUWiEAAQAAADmnAABYWiEAAQAAADqnAABcWiEAAQAAADunAABgWiEAAQAAADynAABkWiEAAQAAAD2nAABoWiEAAQAAAD6nAABsWiEAAQAAAD+nAABwWiEAAQAAAECnAAB0WiEAAQAAAEGnAAB4WiEAAQAAAEKnAAB8WiEAAQAAAEOnAACAWiEAAQAAAESnAACEWiEAAQAAAEWnAACIWiEAAQAAAEanAACMWiEAAQAAAEenAACQWiEAAQAAAEinAACUWiEAAQAAAEmnAACYWiEAAQAAAEqnAACcWiEAAQAAAEunAACgWiEAAQAAAEynAACkWiEAAQAAAE2nAACoWiEAAQAAAE6nAACsWiEAAQAAAE+nAACwWiEAAQAAAFCnAAC0WiEAAQAAAFGnAAC4WiEAAQAAAFKnAAC8WiEAAQAAAFOnAADAWiEAAQAAAFSnAADEWiEAAQAAAFWnAADIWiEAAQAAAFanAADMWiEAAQAAAFenAADQWiEAAQAAAFinAADUWiEAAQAAAFmnAADYWiEAAQAAAFqnAADcWiEAAQAAAFunAADgWiEAAQAAAFynAADkWiEAAQAAAF2nAADoWiEAAQAAAF6nAADsWiEAAQAAAF+nAADwWiEAAQAAAGCnAAD0WiEAAQAAAGGnAAD4WiEAAQAAAGKnAAD8WiEAAQAAAGOnAAAAWyEAAQAAAGSnAAAEWyEAAQAAAGWnAAAIWyEAAQAAAGanAAAMWyEAAQAAAGenAAAQWyEAAQAAAGinAAAUWyEAAQAAAGmnAAAYWyEAAQAAAGqnAAAcWyEAAQAAAGunAAAgWyEAAQAAAGynAAAkWyEAAQAAAG2nAAAoWyEAAQAAAG6nAAAsWyEAAQAAAG+nAAAwWyEAAQAAAHmnAAA0WyEAAQAAAHqnAAA4WyEAAQAAAHunAAA8WyEAAQAAAHynAABAWyEAAQAAAH2nAABEWyEAAQAAAH6nAABIWyEAAQAAAH+nAABMWyEAAQAAAICnAABQWyEAAQAAAIGnAABUWyEAAQAAAIKnAABYWyEAAQAAAIOnAABcWyEAAQAAAISnAABgWyEAAQAAAIWnAABkWyEAAQAAAIanAABoWyEAAQAAAIenAABsWyEAAQAAAIunAABwWyEAAQAAAIynAAB0WyEAAQAAAI2nAAB4WyEAAQAAAJCnAAB8WyEAAQAAAJGnAACAWyEAAQAAAJKnAACEWyEAAQAAAJOnAACIWyEAAQAAAJSnAACMWyEAAQAAAJanAACQWyEAAQAAAJenAACUWyEAAQAAAJinAACYWyEAAQAAAJmnAACcWyEAAQAAAJqnAACgWyEAAQAAAJunAACkWyEAAQAAAJynAACoWyEAAQAAAJ2nAACsWyEAAQAAAJ6nAACwWyEAAQAAAJ+nAAC0WyEAAQAAAKCnAAC4WyEAAQAAAKGnAAC8WyEAAQAAAKKnAADAWyEAAQAAAKOnAADEWyEAAQAAAKSnAADIWyEAAQAAAKWnAADMWyEAAQAAAKanAADQWyEAAQAAAKenAADUWyEAAQAAAKinAADYWyEAAQAAAKmnAADcWyEAAQAAAKqnAADgWyEAAQAAAKunAADkWyEAAQAAAKynAADoWyEAAQAAAK2nAADsWyEAAQAAAK6nAADwWyEAAQAAALCnAAD0WyEAAQAAALGnAAD4WyEAAQAAALKnAAD8WyEAAQAAALOnAAAAXCEAAQAAALSnAAAEXCEAAQAAALWnAAAIXCEAAQAAALanAAAMXCEAAQAAALenAAAQXCEAAQAAALinAAAUXCEAAQAAALmnAAAYXCEAAQAAALqnAAAcXCEAAQAAALunAAAgXCEAAQAAALynAAAkXCEAAQAAAL2nAAAoXCEAAQAAAL6nAAAsXCEAAQAAAL+nAAAwXCEAAQAAAMCnAAA0XCEAAQAAAMGnAAA4XCEAAQAAAMKnAAA8XCEAAQAAAMOnAABAXCEAAQAAAMSnAABEXCEAAQAAAMWnAABIXCEAAQAAAManAABMXCEAAQAAAMenAABQXCEAAQAAAMinAABUXCEAAQAAAMmnAABYXCEAAQAAAMqnAABcXCEAAQAAAMunAABgXCEAAQAAAMynAABkXCEAAQAAAM2nAABoXCEAAQAAANCnAABsXCEAAQAAANGnAABwXCEAAQAAANanAAB0XCEAAQAAANenAAB4XCEAAQAAANinAAB8XCEAAQAAANmnAACAXCEAAQAAANqnAACEXCEAAQAAANunAACIXCEAAQAAANynAACMXCEAAQAAAPWnAACQXCEAAQAAAPanAACUXCEAAQAAAFOrAACYXCEAAQAAAHCrAACcXCEAAQAAAHGrAACgXCEAAQAAAHKrAACkXCEAAQAAAHOrAACoXCEAAQAAAHSrAACsXCEAAQAAAHWrAACwXCEAAQAAAHarAAC0XCEAAQAAAHerAAC4XCEAAQAAAHirAAC8XCEAAQAAAHmrAADAXCEAAQAAAHqrAADEXCEAAQAAAHurAADIXCEAAQAAAHyrAADMXCEAAQAAAH2rAADQXCEAAQAAAH6rAADUXCEAAQAAAH+rAADYXCEAAQAAAICrAADcXCEAAQAAAIGrAADgXCEAAQAAAIKrAADkXCEAAQAAAIOrAADoXCEAAQAAAISrAADsXCEAAQAAAIWrAADwXCEAAQAAAIarAAD0XCEAAQAAAIerAAD4XCEAAQAAAIirAAD8XCEAAQAAAImrAAAAXSEAAQAAAIqrAAAEXSEAAQAAAIurAAAIXSEAAQAAAIyrAAAMXSEAAQAAAI2rAAAQXSEAAQAAAI6rAAAUXSEAAQAAAI+rAAAYXSEAAQAAAJCrAAAcXSEAAQAAAJGrAAAgXSEAAQAAAJKrAAAkXSEAAQAAAJOrAAAoXSEAAQAAAJSrAAAsXSEAAQAAAJWrAAAwXSEAAQAAAJarAAA0XSEAAQAAAJerAAA4XSEAAQAAAJirAAA8XSEAAQAAAJmrAABAXSEAAQAAAJqrAABEXSEAAQAAAJurAABIXSEAAQAAAJyrAABMXSEAAQAAAJ2rAABQXSEAAQAAAJ6rAABUXSEAAQAAAJ+rAABYXSEAAQAAAKCrAABcXSEAAQAAAKGrAABgXSEAAQAAAKKrAABkXSEAAQAAAKOrAABoXSEAAQAAAKSrAABsXSEAAQAAAKWrAABwXSEAAQAAAKarAAB0XSEAAQAAAKerAAB4XSEAAQAAAKirAAB8XSEAAQAAAKmrAACAXSEAAQAAAKqrAACEXSEAAQAAAKurAACIXSEAAQAAAKyrAACMXSEAAQAAAK2rAACQXSEAAQAAAK6rAACUXSEAAQAAAK+rAACYXSEAAQAAALCrAACcXSEAAQAAALGrAACgXSEAAQAAALKrAACkXSEAAQAAALOrAACoXSEAAQAAALSrAACsXSEAAQAAALWrAACwXSEAAQAAALarAAC0XSEAAQAAALerAAC4XSEAAQAAALirAAC8XSEAAQAAALmrAADAXSEAAQAAALqrAADEXSEAAQAAALurAADIXSEAAQAAALyrAADMXSEAAQAAAL2rAADQXSEAAQAAAL6rAADUXSEAAQAAAL+rAADYXSEAAQAAAAX7AADcXSEAAQAAAAb7AADgXSEAAQAAACH/AADkXSEAAQAAACL/AADoXSEAAQAAACP/AADsXSEAAQAAACT/AADwXSEAAQAAACX/AAD0XSEAAQAAACb/AAD4XSEAAQAAACf/AAD8XSEAAQAAACj/AAAAXiEAAQAAACn/AAAEXiEAAQAAACr/AAAIXiEAAQAAACv/AAAMXiEAAQAAACz/AAAQXiEAAQAAAC3/AAAUXiEAAQAAAC7/AAAYXiEAAQAAAC//AAAcXiEAAQAAADD/AAAgXiEAAQAAADH/AAAkXiEAAQAAADL/AAAoXiEAAQAAADP/AAAsXiEAAQAAADT/AAAwXiEAAQAAADX/AAA0XiEAAQAAADb/AAA4XiEAAQAAADf/AAA8XiEAAQAAADj/AABAXiEAAQAAADn/AABEXiEAAQAAADr/AABIXiEAAQAAAEH/AABMXiEAAQAAAEL/AABQXiEAAQAAAEP/AABUXiEAAQAAAET/AABYXiEAAQAAAEX/AABcXiEAAQAAAEb/AABgXiEAAQAAAEf/AABkXiEAAQAAAEj/AABoXiEAAQAAAEn/AABsXiEAAQAAAEr/AABwXiEAAQAAAEv/AAB0XiEAAQAAAEz/AAB4XiEAAQAAAE3/AAB8XiEAAQAAAE7/AACAXiEAAQAAAE//AACEXiEAAQAAAFD/AACIXiEAAQAAAFH/AACMXiEAAQAAAFL/AACQXiEAAQAAAFP/AACUXiEAAQAAAFT/AACYXiEAAQAAAFX/AACcXiEAAQAAAFb/AACgXiEAAQAAAFf/AACkXiEAAQAAAFj/AACoXiEAAQAAAFn/AACsXiEAAQAAAFr/AACwXiEAAQAAAAAEAQC0XiEAAQAAAAEEAQC4XiEAAQAAAAIEAQC8XiEAAQAAAAMEAQDAXiEAAQAAAAQEAQDEXiEAAQAAAAUEAQDIXiEAAQAAAAYEAQDMXiEAAQAAAAcEAQDQXiEAAQAAAAgEAQDUXiEAAQAAAAkEAQDYXiEAAQAAAAoEAQDcXiEAAQAAAAsEAQDgXiEAAQAAAAwEAQDkXiEAAQAAAA0EAQDoXiEAAQAAAA4EAQDsXiEAAQAAAA8EAQDwXiEAAQAAABAEAQD0XiEAAQAAABEEAQD4XiEAAQAAABIEAQD8XiEAAQAAABMEAQAAXyEAAQAAABQEAQAEXyEAAQAAABUEAQAIXyEAAQAAABYEAQAMXyEAAQAAABcEAQAQXyEAAQAAABgEAQAUXyEAAQAAABkEAQAYXyEAAQAAABoEAQAcXyEAAQAAABsEAQAgXyEAAQAAABwEAQAkXyEAAQAAAB0EAQAoXyEAAQAAAB4EAQAsXyEAAQAAAB8EAQAwXyEAAQAAACAEAQA0XyEAAQAAACEEAQA4XyEAAQAAACIEAQA8XyEAAQAAACMEAQBAXyEAAQAAACQEAQBEXyEAAQAAACUEAQBIXyEAAQAAACYEAQBMXyEAAQAAACcEAQBQXyEAAQAAACgEAQBUXyEAAQAAACkEAQBYXyEAAQAAACoEAQBcXyEAAQAAACsEAQBgXyEAAQAAACwEAQBkXyEAAQAAAC0EAQBoXyEAAQAAAC4EAQBsXyEAAQAAAC8EAQBwXyEAAQAAADAEAQB0XyEAAQAAADEEAQB4XyEAAQAAADIEAQB8XyEAAQAAADMEAQCAXyEAAQAAADQEAQCEXyEAAQAAADUEAQCIXyEAAQAAADYEAQCMXyEAAQAAADcEAQCQXyEAAQAAADgEAQCUXyEAAQAAADkEAQCYXyEAAQAAADoEAQCcXyEAAQAAADsEAQCgXyEAAQAAADwEAQCkXyEAAQAAAD0EAQCoXyEAAQAAAD4EAQCsXyEAAQAAAD8EAQCwXyEAAQAAAEAEAQC0XyEAAQAAAEEEAQC4XyEAAQAAAEIEAQC8XyEAAQAAAEMEAQDAXyEAAQAAAEQEAQDEXyEAAQAAAEUEAQDIXyEAAQAAAEYEAQDMXyEAAQAAAEcEAQDQXyEAAQAAAEgEAQDUXyEAAQAAAEkEAQDYXyEAAQAAAEoEAQDcXyEAAQAAAEsEAQDgXyEAAQAAAEwEAQDkXyEAAQAAAE0EAQDoXyEAAQAAAE4EAQDsXyEAAQAAAE8EAQDwXyEAAQAAALAEAQD0XyEAAQAAALEEAQD4XyEAAQAAALIEAQD8XyEAAQAAALMEAQAAYCEAAQAAALQEAQAEYCEAAQAAALUEAQAIYCEAAQAAALYEAQAMYCEAAQAAALcEAQAQYCEAAQAAALgEAQAUYCEAAQAAALkEAQAYYCEAAQAAALoEAQAcYCEAAQAAALsEAQAgYCEAAQAAALwEAQAkYCEAAQAAAL0EAQAoYCEAAQAAAL4EAQAsYCEAAQAAAL8EAQAwYCEAAQAAAMAEAQA0YCEAAQAAAMEEAQA4YCEAAQAAAMIEAQA8YCEAAQAAAMMEAQBAYCEAAQAAAMQEAQBEYCEAAQAAAMUEAQBIYCEAAQAAAMYEAQBMYCEAAQAAAMcEAQBQYCEAAQAAAMgEAQBUYCEAAQAAAMkEAQBYYCEAAQAAAMoEAQBcYCEAAQAAAMsEAQBgYCEAAQAAAMwEAQBkYCEAAQAAAM0EAQBoYCEAAQAAAM4EAQBsYCEAAQAAAM8EAQBwYCEAAQAAANAEAQB0YCEAAQAAANEEAQB4YCEAAQAAANIEAQB8YCEAAQAAANMEAQCAYCEAAQAAANgEAQCEYCEAAQAAANkEAQCIYCEAAQAAANoEAQCMYCEAAQAAANsEAQCQYCEAAQAAANwEAQCUYCEAAQAAAN0EAQCYYCEAAQAAAN4EAQCcYCEAAQAAAN8EAQCgYCEAAQAAAOAEAQCkYCEAAQAAAOEEAQCoYCEAAQAAAOIEAQCsYCEAAQAAAOMEAQCwYCEAAQAAAOQEAQC0YCEAAQAAAOUEAQC4YCEAAQAAAOYEAQC8YCEAAQAAAOcEAQDAYCEAAQAAAOgEAQDEYCEAAQAAAOkEAQDIYCEAAQAAAOoEAQDMYCEAAQAAAOsEAQDQYCEAAQAAAOwEAQDUYCEAAQAAAO0EAQDYYCEAAQAAAO4EAQDcYCEAAQAAAO8EAQDgYCEAAQAAAPAEAQDkYCEAAQAAAPEEAQDoYCEAAQAAAPIEAQDsYCEAAQAAAPMEAQDwYCEAAQAAAPQEAQD0YCEAAQAAAPUEAQD4YCEAAQAAAPYEAQD8YCEAAQAAAPcEAQAAYSEAAQAAAPgEAQAEYSEAAQAAAPkEAQAIYSEAAQAAAPoEAQAMYSEAAQAAAPsEAQAQYSEAAQAAAHAFAQAUYSEAAQAAAHEFAQAYYSEAAQAAAHIFAQAcYSEAAQAAAHMFAQAgYSEAAQAAAHQFAQAkYSEAAQAAAHUFAQAoYSEAAQAAAHYFAQAsYSEAAQAAAHcFAQAwYSEAAQAAAHgFAQA0YSEAAQAAAHkFAQA4YSEAAQAAAHoFAQA8YSEAAQAAAHwFAQBAYSEAAQAAAH0FAQBEYSEAAQAAAH4FAQBIYSEAAQAAAH8FAQBMYSEAAQAAAIAFAQBQYSEAAQAAAIEFAQBUYSEAAQAAAIIFAQBYYSEAAQAAAIMFAQBcYSEAAQAAAIQFAQBgYSEAAQAAAIUFAQBkYSEAAQAAAIYFAQBoYSEAAQAAAIcFAQBsYSEAAQAAAIgFAQBwYSEAAQAAAIkFAQB0YSEAAQAAAIoFAQB4YSEAAQAAAIwFAQB8YSEAAQAAAI0FAQCAYSEAAQAAAI4FAQCEYSEAAQAAAI8FAQCIYSEAAQAAAJAFAQCMYSEAAQAAAJEFAQCQYSEAAQAAAJIFAQCUYSEAAQAAAJQFAQCYYSEAAQAAAJUFAQCcYSEAAQAAAJcFAQCgYSEAAQAAAJgFAQCkYSEAAQAAAJkFAQCoYSEAAQAAAJoFAQCsYSEAAQAAAJsFAQCwYSEAAQAAAJwFAQC0YSEAAQAAAJ0FAQC4YSEAAQAAAJ4FAQC8YSEAAQAAAJ8FAQDAYSEAAQAAAKAFAQDEYSEAAQAAAKEFAQDIYSEAAQAAAKMFAQDMYSEAAQAAAKQFAQDQYSEAAQAAAKUFAQDUYSEAAQAAAKYFAQDYYSEAAQAAAKcFAQDcYSEAAQAAAKgFAQDgYSEAAQAAAKkFAQDkYSEAAQAAAKoFAQDoYSEAAQAAAKsFAQDsYSEAAQAAAKwFAQDwYSEAAQAAAK0FAQD0YSEAAQAAAK4FAQD4YSEAAQAAAK8FAQD8YSEAAQAAALAFAQAAYiEAAQAAALEFAQAEYiEAAQAAALMFAQAIYiEAAQAAALQFAQAMYiEAAQAAALUFAQAQYiEAAQAAALYFAQAUYiEAAQAAALcFAQAYYiEAAQAAALgFAQAcYiEAAQAAALkFAQAgYiEAAQAAALsFAQAkYiEAAQAAALwFAQAoYiEAAQAAAIAMAQAsYiEAAQAAAIEMAQAwYiEAAQAAAIIMAQA0YiEAAQAAAIMMAQA4YiEAAQAAAIQMAQA8YiEAAQAAAIUMAQBAYiEAAQAAAIYMAQBEYiEAAQAAAIcMAQBIYiEAAQAAAIgMAQBMYiEAAQAAAIkMAQBQYiEAAQAAAIoMAQBUYiEAAQAAAIsMAQBYYiEAAQAAAIwMAQBcYiEAAQAAAI0MAQBgYiEAAQAAAI4MAQBkYiEAAQAAAI8MAQBoYiEAAQAAAJAMAQBsYiEAAQAAAJEMAQBwYiEAAQAAAJIMAQB0YiEAAQAAAJMMAQB4YiEAAQAAAJQMAQB8YiEAAQAAAJUMAQCAYiEAAQAAAJYMAQCEYiEAAQAAAJcMAQCIYiEAAQAAAJgMAQCMYiEAAQAAAJkMAQCQYiEAAQAAAJoMAQCUYiEAAQAAAJsMAQCYYiEAAQAAAJwMAQCcYiEAAQAAAJ0MAQCgYiEAAQAAAJ4MAQCkYiEAAQAAAJ8MAQCoYiEAAQAAAKAMAQCsYiEAAQAAAKEMAQCwYiEAAQAAAKIMAQC0YiEAAQAAAKMMAQC4YiEAAQAAAKQMAQC8YiEAAQAAAKUMAQDAYiEAAQAAAKYMAQDEYiEAAQAAAKcMAQDIYiEAAQAAAKgMAQDMYiEAAQAAAKkMAQDQYiEAAQAAAKoMAQDUYiEAAQAAAKsMAQDYYiEAAQAAAKwMAQDcYiEAAQAAAK0MAQDgYiEAAQAAAK4MAQDkYiEAAQAAAK8MAQDoYiEAAQAAALAMAQDsYiEAAQAAALEMAQDwYiEAAQAAALIMAQD0YiEAAQAAAMAMAQD4YiEAAQAAAMEMAQD8YiEAAQAAAMIMAQAAYyEAAQAAAMMMAQAEYyEAAQAAAMQMAQAIYyEAAQAAAMUMAQAMYyEAAQAAAMYMAQAQYyEAAQAAAMcMAQAUYyEAAQAAAMgMAQAYYyEAAQAAAMkMAQAcYyEAAQAAAMoMAQAgYyEAAQAAAMsMAQAkYyEAAQAAAMwMAQAoYyEAAQAAAM0MAQAsYyEAAQAAAM4MAQAwYyEAAQAAAM8MAQA0YyEAAQAAANAMAQA4YyEAAQAAANEMAQA8YyEAAQAAANIMAQBAYyEAAQAAANMMAQBEYyEAAQAAANQMAQBIYyEAAQAAANUMAQBMYyEAAQAAANYMAQBQYyEAAQAAANcMAQBUYyEAAQAAANgMAQBYYyEAAQAAANkMAQBcYyEAAQAAANoMAQBgYyEAAQAAANsMAQBkYyEAAQAAANwMAQBoYyEAAQAAAN0MAQBsYyEAAQAAAN4MAQBwYyEAAQAAAN8MAQB0YyEAAQAAAOAMAQB4YyEAAQAAAOEMAQB8YyEAAQAAAOIMAQCAYyEAAQAAAOMMAQCEYyEAAQAAAOQMAQCIYyEAAQAAAOUMAQCMYyEAAQAAAOYMAQCQYyEAAQAAAOcMAQCUYyEAAQAAAOgMAQCYYyEAAQAAAOkMAQCcYyEAAQAAAOoMAQCgYyEAAQAAAOsMAQCkYyEAAQAAAOwMAQCoYyEAAQAAAO0MAQCsYyEAAQAAAO4MAQCwYyEAAQAAAO8MAQC0YyEAAQAAAPAMAQC4YyEAAQAAAPEMAQC8YyEAAQAAAPIMAQDAYyEAAQAAAFANAQDEYyEAAQAAAFENAQDIYyEAAQAAAFINAQDMYyEAAQAAAFMNAQDQYyEAAQAAAFQNAQDUYyEAAQAAAFUNAQDYYyEAAQAAAFYNAQDcYyEAAQAAAFcNAQDgYyEAAQAAAFgNAQDkYyEAAQAAAFkNAQDoYyEAAQAAAFoNAQDsYyEAAQAAAFsNAQDwYyEAAQAAAFwNAQD0YyEAAQAAAF0NAQD4YyEAAQAAAF4NAQD8YyEAAQAAAF8NAQAAZCEAAQAAAGANAQAEZCEAAQAAAGENAQAIZCEAAQAAAGINAQAMZCEAAQAAAGMNAQAQZCEAAQAAAGQNAQAUZCEAAQAAAGUNAQAYZCEAAQAAAHANAQAcZCEAAQAAAHENAQAgZCEAAQAAAHINAQAkZCEAAQAAAHMNAQAoZCEAAQAAAHQNAQAsZCEAAQAAAHUNAQAwZCEAAQAAAHYNAQA0ZCEAAQAAAHcNAQA4ZCEAAQAAAHgNAQA8ZCEAAQAAAHkNAQBAZCEAAQAAAHoNAQBEZCEAAQAAAHsNAQBIZCEAAQAAAHwNAQBMZCEAAQAAAH0NAQBQZCEAAQAAAH4NAQBUZCEAAQAAAH8NAQBYZCEAAQAAAIANAQBcZCEAAQAAAIENAQBgZCEAAQAAAIINAQBkZCEAAQAAAIMNAQBoZCEAAQAAAIQNAQBsZCEAAQAAAIUNAQBwZCEAAQAAAKAYAQB0ZCEAAQAAAKEYAQB4ZCEAAQAAAKIYAQB8ZCEAAQAAAKMYAQCAZCEAAQAAAKQYAQCEZCEAAQAAAKUYAQCIZCEAAQAAAKYYAQCMZCEAAQAAAKcYAQCQZCEAAQAAAKgYAQCUZCEAAQAAAKkYAQCYZCEAAQAAAKoYAQCcZCEAAQAAAKsYAQCgZCEAAQAAAKwYAQCkZCEAAQAAAK0YAQCoZCEAAQAAAK4YAQCsZCEAAQAAAK8YAQCwZCEAAQAAALAYAQC0ZCEAAQAAALEYAQC4ZCEAAQAAALIYAQC8ZCEAAQAAALMYAQDAZCEAAQAAALQYAQDEZCEAAQAAALUYAQDIZCEAAQAAALYYAQDMZCEAAQAAALcYAQDQZCEAAQAAALgYAQDUZCEAAQAAALkYAQDYZCEAAQAAALoYAQDcZCEAAQAAALsYAQDgZCEAAQAAALwYAQDkZCEAAQAAAL0YAQDoZCEAAQAAAL4YAQDsZCEAAQAAAL8YAQDwZCEAAQAAAMAYAQD0ZCEAAQAAAMEYAQD4ZCEAAQAAAMIYAQD8ZCEAAQAAAMMYAQAAZSEAAQAAAMQYAQAEZSEAAQAAAMUYAQAIZSEAAQAAAMYYAQAMZSEAAQAAAMcYAQAQZSEAAQAAAMgYAQAUZSEAAQAAAMkYAQAYZSEAAQAAAMoYAQAcZSEAAQAAAMsYAQAgZSEAAQAAAMwYAQAkZSEAAQAAAM0YAQAoZSEAAQAAAM4YAQAsZSEAAQAAAM8YAQAwZSEAAQAAANAYAQA0ZSEAAQAAANEYAQA4ZSEAAQAAANIYAQA8ZSEAAQAAANMYAQBAZSEAAQAAANQYAQBEZSEAAQAAANUYAQBIZSEAAQAAANYYAQBMZSEAAQAAANcYAQBQZSEAAQAAANgYAQBUZSEAAQAAANkYAQBYZSEAAQAAANoYAQBcZSEAAQAAANsYAQBgZSEAAQAAANwYAQBkZSEAAQAAAN0YAQBoZSEAAQAAAN4YAQBsZSEAAQAAAN8YAQBwZSEAAQAAAEBuAQB0ZSEAAQAAAEFuAQB4ZSEAAQAAAEJuAQB8ZSEAAQAAAENuAQCAZSEAAQAAAERuAQCEZSEAAQAAAEVuAQCIZSEAAQAAAEZuAQCMZSEAAQAAAEduAQCQZSEAAQAAAEhuAQCUZSEAAQAAAEluAQCYZSEAAQAAAEpuAQCcZSEAAQAAAEtuAQCgZSEAAQAAAExuAQCkZSEAAQAAAE1uAQCoZSEAAQAAAE5uAQCsZSEAAQAAAE9uAQCwZSEAAQAAAFBuAQC0ZSEAAQAAAFFuAQC4ZSEAAQAAAFJuAQC8ZSEAAQAAAFNuAQDAZSEAAQAAAFRuAQDEZSEAAQAAAFVuAQDIZSEAAQAAAFZuAQDMZSEAAQAAAFduAQDQZSEAAQAAAFhuAQDUZSEAAQAAAFluAQDYZSEAAQAAAFpuAQDcZSEAAQAAAFtuAQDgZSEAAQAAAFxuAQDkZSEAAQAAAF1uAQDoZSEAAQAAAF5uAQDsZSEAAQAAAF9uAQDwZSEAAQAAAGBuAQD0ZSEAAQAAAGFuAQD4ZSEAAQAAAGJuAQD8ZSEAAQAAAGNuAQAAZiEAAQAAAGRuAQAE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ZXhhZGVjaW1hbCBsaXRlcmFsIGlzIG5vdCBhIFVuaWNvZGUgc2NhbGFyIHZhbHVlAAAATPchADEAAABpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0AAAAiPchABkAAABpbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZSwgcmVhY2hlZCBlbmQgb2YgcGF0dGVybiBwcmVtYXR1cmVseQAArPchAD4AAAB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNl9PchABwAAABkYW5nbGluZyBmbGFnIG5lZ2F0aW9uIG9wZXJhdG9yABj4IQAfAAAAZHVwbGljYXRlIGZsYWcAAED4IQAOAAAAZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZABY+CEAHwAAAGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXgAAID4IQAiAAAAdW5yZWNvZ25pemVkIGZsYWcAAACs+CEAEQAAAGR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWXI+CEAHAAAAGVtcHR5IGNhcHR1cmUgZ3JvdXAgbmFtZez4IQAYAAAAaW52YWxpZCBjYXB0dXJlIGdyb3VwIGNoYXJhY3RlcgAM+SEAHwAAAHVuY2xvc2VkIGNhcHR1cmUgZ3JvdXAgbmFtZQA0+SEAGwAAAHVuY2xvc2VkIGdyb3VwAABY+SEADgAAAHVub3BlbmVkIGdyb3VwAABw+SEADgAAAGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHBhcmVudGhlc2VzL2JyYWNrZXRzICgAAIj5IQA6AAAAXIInAAEAAABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmTU+SEAPAAAAHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbAAAABj6IQAtAAAAdW5jbG9zZWQgY291bnRlZCByZXBldGl0aW9uAFD6IQAbAAAAcmVwZXRpdGlvbiBvcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb24AAHT6IQAmAAAAc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIApPohAFMAAAB1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGYAAPshAGMAAABmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2UAAABs+yEAgQAAAGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgY2xhc3MA+PshAB8AAABiYWNrcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCD8IQAgAAAAbG9vay1hcm91bmQsIGluY2x1ZGluZyBsb29rLWFoZWFkIGFuZCBsb29rLWJlaGluZCwgaXMgbm90IHN1cHBvcnRlZABI/CEAQwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNS9zcmMvYXN0L21vZC5ycwAAlPwhAGYAAAB/AgAAIgAAAJT8IQBmAAAAmAIAACIAAABhbG51bWJsYW5rZ3JhcGhwcmludHhkaWdpdAAAlPwhAGYAAADnBAAAFAAAAJT8IQBmAAAA8wQAACMAAACU/CEAZgAAAA8GAAAUAAAAlPwhAGYAAACHBgAAGwAAAJT8IQBmAAAAigYAABsAAACU/CEAZgAAAI0GAAAbAAAAlPwhAGYAAACQBgAAGwAAAJT8IQBmAAAAxAYAAB8AAACU/CEAZgAAAMsGAAAbAAAAlPwhAGYAAADMBgAAGwAAAGYFAAAMAAAABAAAAGoFAABrBQAAfQQAAAAAAAAAAAAAAQAAAM0DAAByZWdleCBwYXJzZSBlcnJvcjoKAAD+IQATAAAAZXJyb3I6IAAc/iEABwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4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CAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABj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qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAAoAQBAKkEAQAwDQEAOQ0BAEANAQBJDQEAZhABAG8QAQDwEAEA+RABADYRAQA/EQEA0BEBANkRAQDwEgEA+RIBAFAUAQBZFAEA0BQBANkUAQBQFgEAWRYBAMAWAQDJFgEA0BYBAOMWAQAwFwEAORcBAOAYAQDpGAEAUBkBAFkZAQDwGwEA+RsBAFAcAQBZHAEAUB0BAFkdAQCgHQEAqR0BAFAfAQBZHwEAMGEBADlhAQBgagEAaWoBAMBqAQDJagEAUGsBAFlrAQBwbQEAeW0BAPDMAQD5zAEAztcBAP/XAQBA4QEASeEBAPDiAQD54gEA8OQBAPnkAQDx5QEA+uUBAFDpAQBZ6QEA8PsBAPn7AQBhc3NpZ25lZGFzY2lpAAAApAIiAGYAAAD9AQAAQAAAAEFTQ0lJQXNzaWduZWRBbnmkAiIAZgAAAAYCAAAuAAAAYWdlYWhleEFTQ0lJX0hleF9EaWdpdEFscGhhYmV0aWNhbHBoYWJldGljYXNjaWloZXhkaWdpdGJjQmlkaV9DbGFzc2JpZGljQmlkaV9Db250cm9sYmlkaWNsYXNzYmlkaWNvbnRyb2xiaWRpbUJpZGlfTWlycm9yZWRiaWRpbWlycm9yZWRiaWRpbWlycm9yaW5nZ2x5cGhCaWRpX01pcnJvcmluZ19HbHlwaGJpZGlwYWlyZWRicmFja2V0QmlkaV9QYWlyZWRfQnJhY2tldGJpZGlwYWlyZWRicmFja2V0dHlwZUJpZGlfUGFpcmVkX0JyYWNrZXRfVHlwZWJsa2JtZ2JwYmJwdGNhbm9uaWNhbGNvbWJpbmluZ2NsYXNzQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc2Nhc2VkQ2FzZWRjYXNlZm9sZGluZ0Nhc2VfRm9sZGluZ2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2hhbmdlc3doZW5jYXNlZm9sZGVkQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbmNhc2VtYXBwZWRDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZGNoYW5nZXN3aGVubG93ZXJjYXNlZENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkY2hhbmdlc3doZW5uZmtjY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbnRpdGxlY2FzZWRDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZGNoYW5nZXN3aGVudXBwZXJjYXNlZENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkY2ljamthY2NvdW50aW5nbnVtZXJpY2tBY2NvdW50aW5nTnVtZXJpY2Nqa2NvbXBhdGliaWxpdHl2YXJpYW50a0NvbXBhdGliaWxpdHlWYXJpYW50Y2praWljb3Jla0lJQ29yZWNqa2lyZ2dzb3VyY2VrSVJHX0dTb3VyY2Vjamtpcmdoc291cmNla0lSR19IU291cmNlY2praXJnanNvdXJjZWtJUkdfSlNvdXJjZWNqa2lyZ2twc291cmNla0lSR19LUFNvdXJjZWNqa2lyZ2tzb3VyY2VrSVJHX0tTb3VyY2Vjamtpcmdtc291cmNla0lSR19NU291cmNlY2praXJnc3NvdXJjZWtJUkdfU1NvdXJjZWNqa2lyZ3Rzb3VyY2VrSVJHX1RTb3VyY2Vjamtpcmd1a3NvdXJjZWtJUkdfVUtTb3VyY2Vjamtpcmd1c291cmNla0lSR19VU291cmNlY2praXJndnNvdXJjZWtJUkdfVlNvdXJjZWNqa290aGVybnVtZXJpY2tPdGhlck51bWVyaWNjamtwcmltYXJ5bnVtZXJpY2tQcmltYXJ5TnVtZXJpY2Nqa3JzdW5pY29kZWtSU1VuaWNvZGVjb21wZXhGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbmNvbXBvc2l0aW9uZXhjbHVzaW9uY3djZmN3Y21jd2tjZmN3bGN3dGN3dWRhc2hEYXNoZGVjb21wb3NpdGlvbm1hcHBpbmdEZWNvbXBvc2l0aW9uX01hcHBpbmdkZWNvbXBvc2l0aW9udHlwZURlY29tcG9zaXRpb25fVHlwZWRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnREZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50ZGVwRGVwcmVjYXRlZGRlcHJlY2F0ZWRkaWRpYURpYWNyaXRpY2RpYWNyaXRpY2RtZHRlYUVhc3RfQXNpYW5fV2lkdGhlYXN0YXNpYW53aWR0aGViYXNlRW1vamlfTW9kaWZpZXJfQmFzZWVjb21wRW1vamlfQ29tcG9uZW50ZW1vZEVtb2ppX01vZGlmaWVyZW1vamlFbW9qaWVtb2ppY29tcG9uZW50ZW1vamltb2RpZmllcmVtb2ppbW9kaWZpZXJiYXNlZW1vamlwcmVzZW50YXRpb25FbW9qaV9QcmVzZW50YXRpb25lcHJlc2VxdWlkZW9FcXVpdmFsZW50X1VuaWZpZWRfSWRlb2dyYXBoZXF1aXZhbGVudHVuaWZpZWRpZGVvZ3JhcGhleHBhbmRzb25uZmNFeHBhbmRzX09uX05GQ2V4cGFuZHNvbm5mZEV4cGFuZHNfT25fTkZEZXhwYW5kc29ubmZrY0V4cGFuZHNfT25fTkZLQ2V4cGFuZHNvbm5ma2RFeHBhbmRzX09uX05GS0RleHRFeHRlbmRlcmV4dGVuZGVkcGljdG9ncmFwaGljRXh0ZW5kZWRfUGljdG9ncmFwaGljZXh0ZW5kZXJleHRwaWN0ZmNuZmtjRkNfTkZLQ19DbG9zdXJlZmNuZmtjY2xvc3VyZWZ1bGxjb21wb3NpdGlvbmV4Y2x1c2lvbmdjZ2NiZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbXBhdG1hdGhjb250aW51ZUlEX0NvbXBhdF9NYXRoX0NvbnRpbnVlaWRjb21wYXRtYXRoc3RhcnRJRF9Db21wYXRfTWF0aF9TdGFydGlkY29udGludWVpZGVvSWRlb2dyYXBoaWNpZGVvZ3JhcGhpY2lkc0lEX1N0YXJ0aWRzYklEU19CaW5hcnlfT3BlcmF0b3JpZHNiaW5hcnlvcGVyYXRvcmlkc3RJRFNfVHJpbmFyeV9PcGVyYXRvcmlkc3RhcnRpZHN0cmluYXJ5b3BlcmF0b3JpZHN1SURTX1VuYXJ5X09wZXJhdG9yaWRzdW5hcnlvcGVyYXRvcmluY2JJbmRpY19Db25qdW5jdF9CcmVha2luZGljY29uanVuY3RicmVha2luZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtlaGNhdGtFSF9DYXRrZWhkZXNja0VIX0Rlc2NrZWhoZ2tFSF9IR2tlaGlmYW9rRUhfSUZBT2tlaGpzZXNoa0VIX0pTZXNoa2Vobm9taXJyb3JrRUhfTm9NaXJyb3JrZWhub3JvdGF0ZWtFSF9Ob1JvdGF0ZWtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha0xvd2VyY2FzZV9NYXBwaW5nbGluZWJyZWFrbG9lTG9naWNhbF9PcmRlcl9FeGNlcHRpb25sb2dpY2Fsb3JkZXJleGNlcHRpb25sb3dlckxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG1jbU1vZGlmaWVyX0NvbWJpbmluZ19NYXJrbW9kaWZpZXJjb21iaW5pbmdtYXJrbmFOYW1lbmExVW5pY29kZV8xX05hbWVuYW1lYWxpYXNOYW1lX0FsaWFzbmNoYXJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludG5mY3FjTkZDX1F1aWNrX0NoZWNrbmZjcXVpY2tjaGVja25mZHFjTkZEX1F1aWNrX0NoZWNrbmZkcXVpY2tjaGVja25ma2NjYXNlZm9sZE5GS0NfQ2FzZWZvbGRuZmtjY2ZuZmtjcWNORktDX1F1aWNrX0NoZWNrbmZrY3F1aWNrY2hlY2tuZmtjc2NmTkZLQ19TaW1wbGVfQ2FzZWZvbGRuZmtjc2ltcGxlY2FzZWZvbGRuZmtkcWNORktEX1F1aWNrX0NoZWNrbmZrZHF1aWNrY2hlY2tub25jaGFyYWN0ZXJjb2RlcG9pbnRudE51bWVyaWNfVHlwZW51bWVyaWN0eXBlbnVtZXJpY3ZhbHVlTnVtZXJpY19WYWx1ZW52b2FscGhhT3RoZXJfQWxwaGFiZXRpY29jb21tZW50b2RpT3RoZXJfRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludG9ncmV4dE90aGVyX0dyYXBoZW1lX0V4dGVuZG9pZGNPdGhlcl9JRF9Db250aW51ZW9pZHNPdGhlcl9JRF9TdGFydG9sb3dlck90aGVyX0xvd2VyY2FzZW9tYXRoT3RoZXJfTWF0aG90aGVyYWxwaGFiZXRpY290aGVyZGVmYXVsdGlnbm9yYWJsZWNvZGVwb2ludG90aGVyZ3JhcGhlbWVleHRlbmRvdGhlcmlkY29udGludWVvdGhlcmlkc3RhcnRvdGhlcmxvd2VyY2FzZW90aGVybWF0aG90aGVydXBwZXJjYXNlT3RoZXJfVXBwZXJjYXNlb3VwcGVycGF0c3luUGF0dGVybl9TeW50YXhwYXR0ZXJuc3ludGF4cGF0dGVybndoaXRlc3BhY2VQYXR0ZXJuX1doaXRlX1NwYWNlcGF0d3NwY21QcmVwZW5kZWRfQ29uY2F0ZW5hdGlvbl9NYXJrcHJlcGVuZGVkY29uY2F0ZW5hdGlvbm1hcmtxbWFya1F1b3RhdGlvbl9NYXJrcXVvdGF0aW9ubWFya3JhZGljYWxSYWRpY2FscmVnaW9uYWxpbmRpY2F0b3JSZWdpb25hbF9JbmRpY2F0b3JyaXNic2NmU2ltcGxlX0Nhc2VfRm9sZGluZ3NjcmlwdGV4dGVuc2lvbnNzY3hzZFNvZnRfRG90dGVkc2VudGVuY2VicmVha3NlbnRlbmNldGVybWluYWxTZW50ZW5jZV9UZXJtaW5hbHNmY3NpbXBsZWNhc2Vmb2xkaW5nc2ltcGxlbG93ZXJjYXNlbWFwcGluZ1NpbXBsZV9Mb3dlcmNhc2VfTWFwcGluZ3NpbXBsZXRpdGxlY2FzZW1hcHBpbmdTaW1wbGVfVGl0bGVjYXNlX01hcHBpbmdzaW1wbGV1cHBlcmNhc2VtYXBwaW5nU2ltcGxlX1VwcGVyY2FzZV9NYXBwaW5nc2xjc29mdGRvdHRlZHNwYWNlV2hpdGVfU3BhY2VzdGNzdGVybXN1Y3RjVGl0bGVjYXNlX01hcHBpbmd0ZXJtVGVybWluYWxfUHVuY3R1YXRpb250ZXJtaW5hbHB1bmN0dWF0aW9udGl0bGVjYXNlbWFwcGluZ3VjVXBwZXJjYXNlX01hcHBpbmd1aWRlb1VuaWZpZWRfSWRlb2dyYXBodW5pY29kZTFuYW1ldW5pY29kZXJhZGljYWxzdHJva2V1bmlmaWVkaWRlb2dyYXBodXBwZXJVcHBlcmNhc2V1cHBlcmNhc2V1cHBlcmNhc2VtYXBwaW5ndXJzdmFyaWF0aW9uc2VsZWN0b3JWYXJpYXRpb25fU2VsZWN0b3J2ZXJ0aWNhbG9yaWVudGF0aW9uVmVydGljYWxfT3JpZW50YXRpb252b3Zzd2J3aGl0ZXNwYWNld29yZGJyZWFrd3NwYWNleGlkY1hJRF9Db250aW51ZXhpZGNvbnRpbnVleGlkc1hJRF9TdGFydHhpZHN0YXJ0eG9uZmN4b25mZHhvbmZrY3hvbmZrZGQfIgADAAAAeAMiAAMAAABnHyIABAAAAGsfIgAPAAAAQEomAAUAAAB6HyIACgAAAIQfIgAKAAAAeh8iAAoAAACOHyIADQAAAGsfIgAPAAAAmx8iAAIAAACdHyIACgAAAKcfIgAFAAAArB8iAAwAAAC4HyIACQAAAJ0fIgAKAAAAwR8iAAsAAACsHyIADAAAAMwfIgAFAAAA0R8iAA0AAADeHyIADAAAANEfIgANAAAA6h8iABIAAAD8HyIAFAAAABAgIgARAAAAISAiABMAAAA0ICIAFQAAAEkgIgAYAAAAYSAiAAMAAAA3xCYABQAAAIPFJgAFAAAAN8QmAAUAAABkICIAAwAAAPwfIgAUAAAAZyAiAAMAAAAhICIAEwAAAGogIgADAAAASSAiABgAAABtICIAFwAAAIQgIgAZAAAAnSAiAAUAAACiICIABQAAAKcgIgALAAAAsiAiAAwAAAC+ICIADQAAAMsgIgAOAAAA2SAiAAMAAACEICIAGQAAANwgIgACAAAA3iAiABUAAAByAyIAAgAAALIgIgAMAAAA8yAiABUAAAAIISIAFwAAAB8hIgAVAAAANCEiABcAAABLISIAFQAAAGAhIgAXAAAAdyEiABkAAACQISIAHAAAAKwhIgAVAAAAwSEiABcAAADYISIAFQAAAO0hIgAXAAAABCIiAAIAAADLICIADgAAAAYiIgAUAAAAGiIiABIAAAAsIiIAFwAAAEMiIgAVAAAAWCIiAAkAAABhIiIABwAAAGgiIgANAAAAdSIiAAwAAACBIiIADQAAAI4iIgAMAAAAmiIiAA0AAACnIiIADAAAALMiIgAOAAAAwSIiAA0AAADOIiIADQAAANsiIgAMAAAA5yIiAA0AAAD0IiIADAAAAAAjIgANAAAADSMiAAwAAAAZIyIADQAAACYjIgAMAAAAMiMiAA4AAABAIyIADQAAAE0jIgANAAAAWiMiAAwAAABmIyIADQAAAHMjIgAMAAAAfyMiAA8AAACOIyIADQAAAJsjIgARAAAArCMiAA8AAAC7IyIADAAAAMcjIgAKAAAA0SMiAAYAAADXIyIAGgAAAPEjIgAUAAAA3iAiABUAAAAFJCIABAAAAAghIgAXAAAACSQiAAQAAAA0ISIAFwAAAA0kIgAFAAAAkCEiABwAAAASJCIAAwAAAGAhIgAXAAAAFSQiAAMAAADBISIAFwAAABgkIgADAAAA7SEiABcAAAAbJCIABAAAAB8kIgAEAAAAIyQiABQAAAA3JCIAFQAAAEwkIgARAAAAXSQiABIAAABvJCIAGQAAAIgkIgAcAAAApCQiAAMAAACnJCIACgAAALEkIgAKAAAApyQiAAoAAAC7JCIAAgAAAIgkIgAcAAAAvSQiAAMAAADAJCIACQAAAMkkIgAJAAAAwCQiAAkAAADSJCIAAgAAADckIgAVAAAA1CQiAAIAAABdJCIAEgAAANYkIgACAAAA2CQiABAAAADoJCIADgAAANgkIgAQAAAA9iQiAAUAAAD7JCIAEwAAAA4lIgAFAAAAEyUiAA8AAAAiJSIABAAAACYlIgAOAAAANCUiAAUAAAA5JSIABQAAAD4lIgAOAAAAEyUiAA8AAABMJSIADQAAACYlIgAOAAAAWSUiABEAAAD7JCIAEwAAAGolIgARAAAAeyUiABIAAACNJSIABQAAAHslIgASAAAAkiUiAAcAAACZJSIAHAAAALUlIgAaAAAAmSUiABwAAADPJSIADAAAANslIgAOAAAA6SUiAAwAAAD1JSIADgAAAAMmIgANAAAAECYiAA8AAAAfJiIADQAAACwmIgAPAAAAOyYiAAMAAAA+JiIACAAAAEYmIgAUAAAAWiYiABUAAABvJiIACAAAAD4mIgAIAAAAdyYiAAcAAABaJiIAFQAAAH4mIgAGAAAAhCYiAA8AAACTJiIADQAAAIQmIgAPAAAAoCYiABgAAADXIyIAGgAAALgmIgACAAAAXAMiABAAAAC6JiIAAwAAAIwDIgAWAAAAvSYiAA8AAABcAyIAEAAAAMwmIgAMAAAA2CYiAA0AAADlJiIAFAAAAIwDIgAWAAAA+SYiAA4AAAAHJyIADwAAABYnIgAMAAAAIiciAA0AAAAvJyIABgAAANgmIgANAAAANSciAAUAAAAHJyIADwAAADonIgAGAAAAIiciAA0AAABAJyIAEgAAAFInIgAUAAAAZiciAAMAAABpJyIACQAAAHInIgAIAAAAaSciAAkAAAB6JyIAAwAAAFInIgAUAAAAfSciAAYAAACDJyIABgAAAIknIgADAAAAjCciAAsAAACXJyIAFAAAAKsnIgAXAAAAwiciABEAAADTJyIAFAAAAOcnIgAKAAAAjCciAAsAAADxJyIABAAAAPUnIgALAAAAACgiAAsAAAD1JyIACwAAAAsoIgADAAAADigiAAgAAAAWKCIABAAAABooIgATAAAALSgiABEAAAAaKCIAEwAAAD4oIgAEAAAAQigiABQAAABWKCIABwAAAA4oIgAIAAAAXSgiABIAAABCKCIAFAAAAG8oIgAEAAAAcygiABIAAACFKCIAEAAAAHMoIgASAAAAlSgiAAQAAACZKCIAFAAAAK0oIgASAAAAmSgiABQAAAC/KCIAFwAAANYoIgAZAAAA7ygiABUAAAAEKSIAFwAAABspIgAEAAAA1igiABkAAAAfKSIABAAAAAQpIgAXAAAAIykiAAMAAAAmKSIACwAAADEpIgANAAAAPikiAA8AAABNKSIAAgAAAE8pIgANAAAAXCkiAAUAAABhKSIADAAAAG0pIgALAAAAYSkiAAwAAAB4KSIADAAAAE8pIgAN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bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJkaWdpdGVuY2xvc2luZ21hcmtFbmNsb3NpbmdfTWFya2ZpbmFscHVuY3R1YXRpb25GaW5hbF9QdW5jdHVhdGlvbmZvcm1hdGluaXRpYWxwdW5jdHVhdGlvbkluaXRpYWxfUHVuY3R1YXRpb25sTGV0dGVybGV0dGVybGV0dGVybnVtYmVyTGV0dGVyX051bWJlcmxpbmVzZXBhcmF0b3JMaW5lX1NlcGFyYXRvcmxsTG93ZXJjYXNlX0xldHRlcmxtTW9kaWZpZXJfTGV0dGVybG9PdGhlcl9MZXR0ZXJsb3dlcmNhc2VsZXR0ZXJUaXRsZWNhc2VfTGV0dGVybHVVcHBlcmNhc2VfTGV0dGVybW1hcmttYXRoc3ltYm9sTWF0aF9TeW1ib2xtY1NwYWNpbmdfTWFya21lbW5Ob25zcGFjaW5nX01hcmttb2RpZmllcmxldHRlcm1vZGlmaWVyc3ltYm9sTW9kaWZpZXJfU3ltYm9sbmRubG5vT3RoZXJfTnVtYmVybm9uc3BhY2luZ21hcmtvcGVucHVuY3R1YXRpb25PcGVuX1B1bmN0dWF0aW9ub3RoZXJvdGhlcmxldHRlcm90aGVybnVtYmVyb3RoZXJwdW5jdHVhdGlvbk90aGVyX1B1bmN0dWF0aW9ub3RoZXJzeW1ib2xPdGhlcl9TeW1ib2xwUHVuY3R1YXRpb25wYXJhZ3JhcGhzZXBhcmF0b3JQYXJhZ3JhcGhfU2VwYXJhdG9ycGNwZHBlcGZwb3ByaXZhdGV1c2Vwc3B1bmN0cHVuY3R1YXRpb25zc2VwYXJhdG9yU2VwYXJhdG9yc2tzbXNvc3BhY2VzZXBhcmF0b3JTcGFjZV9TZXBhcmF0b3JzcGFjaW5nbWFya3N1cnJvZ2F0ZXRpdGxlY2FzZWxldHRlcnVwcGVyY2FzZWxldHRlcnp6bHpwenMAlXcmAAEAAABOLiYABQAAAHxHIgALAAAAh0ciAAwAAACTRyIAAgAAAJVHIgAHAAAAcgMiAAIAAACcRyIABgAAAKJHIgAQAAAAskciABEAAADDRyIAAgAAAItDIgAKAAAAxUciAAUAAACV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bGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2FyYUdhcmF5Z2FyYXlnZW9yR2VvcmdpYW5nZW9yZ2lhbmdsYWdHbGFnb2xpdGljZ2xhZ29saXRpY2dvbmdHdW5qYWxhX0dvbmRpZ29ubU1hc2FyYW1fR29uZGlnb3RoR290aGljZ290aGljZ3JhbkdyYW50aGFncmFudGhhZ3JlZWtHcmVla2dyZWtndWphcmF0aUd1amFyYXRpZ3Vqcmd1a2hHdXJ1bmdfS2hlbWFndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWd1cnVuZ2toZW1haGFuSGFuaGFuZ0hhbmd1bGhhbmd1bGhhbmloYW5pZmlyb2hpbmd5YUhhbmlmaV9Sb2hpbmd5YWhhbm9IYW51bm9vaGFudW5vb2hhdHJIYXRyYW5oYXRyYW5oZWJySGVicmV3aGVicmV3aGlyYUhpcmFnYW5haGlyYWdhbmFobHV3aG1uZ1BhaGF3aF9IbW9uZ2htbnBOeWlha2VuZ19QdWFjaHVlX0htb25naHJrdEthdGFrYW5hX09yX0hpcmFnYW5haHVuZ09sZF9IdW5nYXJpYW5pbXBlcmlhbGFyYW1haWNpbmhlcml0ZWRJbmhlcml0ZWRpbnNjcmlwdGlvbmFscGFobGF2aUluc2NyaXB0aW9uYWxfUGFobGF2aWluc2NyaXB0aW9uYWxwYXJ0aGlhbkluc2NyaXB0aW9uYWxfUGFydGhpYW5pdGFsT2xkX0l0YWxpY2phdmFKYXZhbmVzZWphdmFuZXNla2FpdGhpS2FpdGhpa2FsaUtheWFoX0xpa2FuYUthdGFrYW5ha2FubmFkYUthbm5hZGFrYXRha2FuYWthdGFrYW5hb3JoaXJhZ2FuYWthd2lLYXdpa2F5YWhsaWtoYXJLaGFyb3NodGhpa2hhcm9zaHRoaWtoaXRhbnNtYWxsc2NyaXB0S2hpdGFuX1NtYWxsX1NjcmlwdGtobWVyS2htZXJraG1ya2hvaktob2praWtob2praWtodWRhd2FkaUtodWRhd2FkaWtpcmF0cmFpS2lyYXRfUmFpa2l0c2tuZGFrcmFpa3RoaWxhbmFUYWlfVGhhbWxhb0xhb2xhb29sYXRpbkxhdGlubGF0bmxlcGNMZXBjaGFsZXBjaGFsaW1iTGltYnVsaW1idWxpbmFMaW5lYXJfQWxpbmJMaW5lYXJfQmxpbmVhcmFsaW5lYXJibGlzdUxpc3VseWNpTHljaWFubHljaWFubHlkaUx5ZGlhbmx5ZGlhbm1haGFqYW5pTWFoYWphbmltYWhqbWFrYU1ha2FzYXJtYWthc2FybWFsYXlhbGFtTWFsYXlhbGFtbWFuZE1hbmRhaWNtYW5kYWljbWFuaU1hbmljaGFlYW5tYW5pY2hhZWFubWFyY01hcmNoZW5tYXJjaGVubWFzYXJhbWdvbmRpbWVkZWZhaWRyaW5NZWRlZmFpZHJpbm1lZGZtZWV0ZWltYXlla01lZXRlaV9NYXlla21lbmRNZW5kZV9LaWtha3VpbWVuZGVraWtha3VpbWVyY01lcm9pdGljX0N1cnNpdmVtZXJvTWVyb2l0aWNfSGllcm9nbHlwaHNtZXJvaXRpY2N1cnNpdmVtZXJvaXRpY2hpZXJvZ2x5cGhzbWlhb01pYW9tbHltbW9kaU1vZGltb25nTW9uZ29saWFubW9uZ29saWFubXJvTXJvbXJvb210ZWltdWx0TXVsdGFuaW11bHRhbmlteWFubWFyTXlhbm1hcm15bXJuYWJhdGFlYW5OYWJhdGFlYW5uYWdtTmFnX011bmRhcmluYWdtdW5kYXJpbmFuZE5hbmRpbmFnYXJpbmFuZGluYWdhcmluYXJiT2xkX05vcnRoX0FyYWJpYW5uYmF0bmV3YU5ld2FuZXd0YWlsdWVOZXdfVGFpX0x1ZW5rb05rb25rb29uc2h1TnVzaHVudXNodW55aWFrZW5ncHVhY2h1ZWhtb25nb2dhbU9naGFtb2doYW1vbGNoaWtpT2xfQ2hpa2lvbGNrb2xkaHVuZ2FyaWFub2xkaXRhbGljb2xkbm9ydGhhcmFiaWFub2xkcGVybWljT2xkX1Blcm1pY29sZHBlcnNpYW5PbGRfUGVyc2lhbm9sZHNvZ2RpYW5PbGRfU29nZGlhbm9sZHNvdXRoYXJhYmlhbk9sZF9Tb3V0aF9BcmFiaWFub2xkdHVya2ljT2xkX1R1cmtpY29sZHV5Z2h1ck9sZF9VeWdodXJvbG9uYWxPbF9PbmFsb25hb29yaXlhT3JpeWFvcmtob3J5YW9zYWdlT3NhZ2Vvc2dlb3NtYU9zbWFueWFvc21hbnlhb3VncnBhaGF3aGhtb25ncGFsbVBhbG15cmVuZXBhbG15cmVuZXBhdWNQYXVfQ2luX0hhdXBhdWNpbmhhdXBlcm1waGFnUGhhZ3NfUGFwaGFnc3BhcGhsaXBobHBQc2FsdGVyX1BhaGxhdmlwaG54UGhvZW5pY2lhbnBob2VuaWNpYW5wbHJkcHJ0aXBzYWx0ZXJwYWhsYXZpcWFhY3FhYWlyZWphbmdSZWphbmdyam5ncm9oZ3J1bmljUnVuaWNydW5yc2FtYXJpdGFuU2FtYXJpdGFuc2FtcnNhcmJzYXVyU2F1cmFzaHRyYXNhdXJhc2h0cmFzZ253U2lnbldyaXRpbmdzaGFyYWRhU2hhcmFkYXNoYXZpYW5TaGF2aWFuc2hhd3NocmRzaWRkU2lkZGhhbXNpZGRoYW1zaWdud3JpdGluZ3NpbmRzaW5oU2luaGFsYXNpbmhhbGFzb2dkU29nZGlhbnNvZ2RpYW5zb2dvc29yYVNvcmFfU29tcGVuZ3NvcmFzb21wZW5nc295b1NveW9tYm9zb3lvbWJvc3VuZFN1bmRhbmVzZXN1bmRhbmVzZXN1bnVTdW51d2Fyc3VudXdhcnN5bG9TeWxvdGlfTmFncmlzeWxvdGluYWdyaXN5cmNTeXJpYWNzeXJpYWN0YWdhbG9nVGFnYWxvZ3RhZ2JUYWdiYW53YXRhZ2JhbndhdGFpbGVUYWlfTGV0YWl0aGFtdGFpdmlldFRhaV9WaWV0dGFrclRha3JpdGFrcml0YWxldGFsdXRhbWlsVGFtaWx0YW1sdGFuZ1Rhbmd1dHRhbmdzYVRhbmdzYXRhbmd1dHRhdnR0ZWx1VGVsdWd1dGVsdWd1dGZuZ1RpZmluYWdodGdsZ3RoYWFUaGFhbmF0aGFhbmF0aGFpVGhhaXRpYmV0YW5UaWJldGFudGlidHRpZmluYWdodGlyaFRpcmh1dGF0aXJodXRhdG5zYXRvZGhyaVRvZGhyaXRvZHJ0b3RvVG90b3R1bHV0aWdhbGFyaVR1bHVfVGlnYWxhcml0dXRndWdhclVnYXJpdGljdWdhcml0aWN2YWlWYWl2YWlpdml0aFZpdGhrdXFpdml0aGt1cWl3YW5jaG9XYW5jaG93YXJhV2FyYW5nX0NpdGl3YXJhbmdjaXRpd2Nob3hwZW94c3V4eWV6aVllemlkaXllemlkaXlpWWl5aWlpemFuYWJhemFyc3F1YXJlWmFuYWJhemFyX1NxdWFyZXphbmJ6aW5oenl5eXp6enoAmFIiAAUAAACdUiIABQAAAKJSIgAEAAAAnVIiAAUAAACmUiIABAAAAKpSIgASAAAAvFIiAAQAAADAUiIABAAAAMRSIgAUAAAA2FIiABUAAADtUiIABAAAAPFSIgAGAAAA91IiAAYAAADxUiIABgAAAP1SIgAIAAAABVMiAAgAAAANUyIABAAAABFTIgAQAAAAIVMiAAQAAAAFUyIACAAAACVTIgAHAAAALFMiAAcAAAAzUyIABAAAACxTIgAHAAAAN1MiAAQAAAA7UyIACAAAAENTIgAIAAAAO1MiAAgAAABLUyIABAAAAE9TIgAFAAAAVFMiAAUAAABPUyIABQAAAFlTIgAEAAAAXVMiAAkAAABmUyIACAAAAF1TIgAJAAAAblMiAAUAAABzUyIABQAAAHhTIgAEAAAAc1MiAAUAAAB8UyIABAAAAIBTIgAHAAAAh1MiAAcAAACAUyIABwAAAI5TIgAJAAAAl1MiAAkAAACgUyIABAAAAJdTIgAJAAAApFMiAAQAAACoUyIACAAAALBTIgAIAAAAqFMiAAgAAAC4UyIABAAAALxTIgAGAAAAwlMiAAYAAAC8UyIABgAAAMhTIgAEAAAAzFMiAAcAAADTUyIABwAAAMxTIgAHAAAA2lMiAAQAAADeUyIACAAAAOZTIgAIAAAA3lMiAAgAAADuUyIABAAAAPJTIgAFAAAA91MiAAUAAADyUyIABQAAAPxTIgAEAAAAAFQiAAYAAAAGVCIAEgAAABhUIgATAAAAK1QiAAQAAAAYVCIAEwAAAC9UIgAEAAAAM1QiAAYAAAA5VCIABgAAADNUIgAGAAAAP1QiABEAAACqUiIAEgAAAFBUIgAGAAAAAFQiAAYAAABWVCIABAAAAFpUIgAEAAAAXlQiAAQAAABiVCIACAAAAGpUIgAIAAAAYlQiAAgAAAByVCIACgAAAHxUIgAKAAAAhlQiAAQAAAB8VCIACgAAAIpUIgAGAAAAkFQiAAYAAACWVCIABAAAAJpUIgAGAAAAoFQiAAYAAACaVCIABgAAAKZUIgAEAAAAqlQiAAwAAAC2VCIABAAAALpUIgAHAAAAwVQiAAkAAADKVCIACQAAANNUIgAHAAAAulQiAAcAAADaVCIACwAAAKpUIgAMAAAA5VQiAAgAAADtVCIACAAAAPVUIgAEAAAA7VQiAAgAAAD5VCIABwAAAABVIgAHAAAAB1UiAAQAAAALVSIACgAAABVVIgAKAAAAC1UiAAoAAAAfVSIABAAAACNVIgALAAAALlUiAAoAAAAjVSIACwAAADhVIgAEAAAAPFUiAAUAAABBVSIABQAAADxVIgAFAAAARlUiAAQAAAAAVSIABwAAAEpVIgAEAAAATlUiAAgAAABWVSIACAAAAE5VIgAIAAAAXlUiAAQAAABiVSIAFAAAAHZVIgATAAAAYlUiABQAAACJVSIABAAAAI1VIgAHAAAAlFUiAAcAAACNVSIABwAAAJtVIgAEAAAAn1UiAAcAAACmVSIABwAAAJ9VIgAHAAAArVUiAAQAAACxVSIACAAAALlVIgAIAAAAsVUiAAgAAADBVSIABAAAAMVVIgAFAAAAylUiAAUAAADFVSIABQAAAM9VIgAEAAAA01UiAAgAAADbVSIACAAAANNVIgAIAAAA41UiAAQAAADnVSIACgAAAPFVIgAKAAAA51UiAAoAAAD7VSIABAAAAP9VIgANAAAADFYiAAQAAAAQViIADQAAAB1WIgAEAAAAIVYiAAYAAAAnViIABgAAACFWIgAGAAAALVYiAAQAAAAxViIABwAAADhWIgAHAAAAMVYiAAcAAAA/ViIABQAAAERWIgAFAAAASVYiAAQAAABEViIABQAAAE1WIgAIAAAAVVYiAAgAAABdViIABAAAAFVWIgAIAAAAYVYiAAQAAABlViIADAAAAHFWIgAMAAAA/1UiAA0AAAB9ViIACAAAAIVWIgAIAAAAjVYiAAQAAACFViIACAAAAJFWIgALAAAAZVYiAAwAAACcViIAAwAAAJ9WIgADAAAAolYiAAQAAACmViIABgAAAKxWIgAGAAAAplYiAAYAAACyViIABAAAAJ9WIgADAAAAtlYiAA4AAADEViIADwAAANNWIgAEAAAA11YiAAcAAADeViIABwAAANdWIgAHAAAA5VYiAAQAAADpViIABgAAAO9WIgAGAAAA6VYiAAYAAAD1ViIABAAAAPlWIgAGAAAA/1YiAAYAAAD5ViIABgAAAAVXIgAEAAAACVciAAgAAAARVyIACAAAAAlXIgAIAAAAGVciAAQAAADYUiIAFQAAAB1XIgAEAAAAIVciAAwAAAAtVyIABAAAADFXIgAWAAAAR1ciAAQAAABLVyIAFAAAAF9XIgAEAAAAY1ciAA0AAABwVyIADwAAABFTIgAQAAAAf1ciAAkAAACIVyIACQAAAJFXIgAUAAAApVciABUAAAC6VyIAFQAAAM9XIgAWAAAA5VciAAQAAADpVyIACgAAAPNXIgAEAAAA91ciAAgAAAD/VyIACAAAAPdXIgAIAAAAB1giAAYAAAANWCIABgAAABNYIgAEAAAAF1giAAgAAAAfWCIABAAAACNYIgAIAAAAK1giAAcAAAAyWCIABwAAADlYIgAIAAAAI1giAAgAAABBWCIAEgAAAEtXIgAUAAAAU1giAAQAAABXWCIABAAAAFtYIgAHAAAAF1giAAgAAABiWCIABAAAAGZYIgAKAAAAcFgiAAoAAABmWCIACgAAAHpYIgARAAAAi1giABMAAACeWCIABQAAAKNYIgAFAAAAqFgiAAQAAACjWCIABQAAAKxYIgAEAAAAsFgiAAYAAAC2WCIABgAAALBYIgAGAAAAvFgiAAkAAADFWCIACQAAAM5YIgAIAAAA1lgiAAkAAADfWCIABAAAAItYIgATAAAA41giAAQAAAAyWCIABwAAAOdYIgAEAAAA1lgiAAkAAADrWCIABAAAAA1YIgAGAAAA71giAAQAAADzWCIACAAAAPtYIgADAAAA/lgiAAMAAAABWSIABAAAAP5YIgADAAAABVkiAAUAAAAKWSIABQAAAA9ZIgAEAAAAClkiAAUAAAATWSIABAAAABdZIgAGAAAAHVkiAAYAAAAXWSIABgAAACNZIgAEAAAAJ1kiAAUAAAAsWSIABQAAACdZIgAFAAAAMVkiAAQAAAA1WSIACAAAAD1ZIgAEAAAAQVkiAAgAAABJWSIABwAAADVZIgAIAAAAUFkiAAcAAABBWSIACAAAAFdZIgAEAAAAW1kiAAQAAABfWSIABAAAAGNZIgAGAAAAaVkiAAYAAABjWSIABgAAAG9ZIgAEAAAAc1kiAAYAAAB5WSIABgAAAHNZIgAGAAAAf1kiAAgAAACHWSIACAAAAI9ZIgAEAAAAh1kiAAgAAACTWSIABAAAAJdZIgAHAAAAnlkiAAcAAACXWSIABwAAAKVZIgAJAAAArlkiAAkAAAC3WSIABAAAALtZIgAHAAAAwlkiAAcAAAC7WSIABwAAAMlZIgAEAAAAzVkiAAoAAADXWSIACgAAAM1ZIgAKAAAA4VkiAAQAAADlWSIABwAAAOxZIgAHAAAA5VkiAAcAAADzWSIADAAAABBWIgANAAAA/1kiAAsAAAAKWiIACwAAABVaIgAEAAAACloiAAsAAAAZWiIACwAAACRaIgAMAAAAMFoiAAQAAAA0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BgAAvgYAAMAGAADOBgAA0AYAAO0GAADwBgAA+QYAAAEJAAADCQAABQkAADkJAAA8CQAATQkAAFAJAABUCQAAWAkAAHAJAACBCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAAC8CQAAvgkAAMQJAADHCQAAyAkAAMsJAADNCQAA1wkAANcJAADcCQAA3QkAAN8JAADjCQAA5gkAAPoJAAACCgAAAgoAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABZCgAAXAoAAF4KAABeCgAAZgoAAHQKAACBCgAAgwoAAIUKAACLCgAAjQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvAoAAMUKAADHCgAAyQoAAMsKAADNCgAA0AoAANAKAADgCgAA4AoAAOYKAADvCgAAAQsAAAMLAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANgsAADkLAAA8CwAAQwsAAEcLAABICwAASwsAAE0LAABWCwAAVwsAAFwLAABdCwAAXwsAAGELAABmCwAAcAsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC1CwAAtwsAALkLAAC+CwAAwgsAAMYLAADICwAAygsAAM0LAADXCwAA1wsAAOcLAADyCwAAAQwAAAMMAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAMwwAADUMAAA5DAAAPgwAAEQMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABgDAAAYQwAAGYMAABvDAAAggwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvgwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADeDAAA3gwAAOAMAADhDAAA5gwAAO8MAAACDQAAAw0AAAUNAAAMDQAADg0AABANAAASDQAAKA0AACoNAAA5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EgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAoBMAAPUTAAD4EwAA/RMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA8RYAAPgWAAAAFwAAERcAAB8XAAAxFwAAQBcAAFEXAABgFwAAbBcAAG4XAABwFwAAgBcAALMXAADXFwAA1xcAANwXAADcFwAAIBgAAHgYAACAGAAAhBgAAIcYAACoGAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAApxoAAKcaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA6RwAAOwcAADuHAAA8xwAAPUcAAD2HAAA+hwAAPocAAAAHQAAvx0AAAAeAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAALyEAADkhAAA8IQAAPyEAAEUhAABJIQAATiEAAE4hAACDIQAAhCEAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAAAvLgAALy4AAAUwAAAGMAAAMTAAADUwAAA7MAAAPDAAAEEwAACWMAAAnTAAAJ8wAAChMAAA+jAAAPwwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/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6QEAS+kBAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BAAAAAgDfpgIAAKcCADm3AgBAtwIAHbgCACC4AgChzgIAsM4CAODrAgDw6wIAXe4CAAD4AgAd+gIAAAADAEoTAwBQEwMAryMDAO4WAADwFgAAYCEAAIIhAACFIQAAiCEAAAcwAAAHMAAAITAAACkwAAA4MAAAOjAAAOamAADvpgAAQAEBAHQBAQBBAwEAQQMBAEoDAQBKAwEA0QMBANUDAQAAJAEAbiQBACggAAAoIAAAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAArwIAAHEDAABxAwAAcwMAAHMDAAB3AwAAdwMAAHsDAAB9AwAAkAMAAJADAACsAwAAzgMAANADAADRAwAA1QMAANcDAADZAwAA2QMAANsDAADbAwAA3QMAAN0DAADfAwAA3wMAAOEDAADhAwAA4wMAAOMDAADlAwAA5QMAAOcDAADnAwAA6QMAAOkDAADrAwAA6wMAAO0DAADtAwAA7wMAAPMDAAD1AwAA9QMAAPgDAAD4AwAA+wMAAPwDAAAwBAAAXwQAAGEEAABhBAAAYwQAAGMEAABlBAAAZQQAAGcEAABnBAAAaQQAAGkEAABrBAAAawQAAG0EAABtBAAAbwQAAG8EAABxBAAAcQQAAHMEAABzBAAAdQQAAHUEAAB3BAAAdwQAAHkEAAB5BAAAewQAAHsEAAB9BAAAfQQAAH8EAAB/BAAAgQQAAIEEAACLBAAAiwQAAI0EAACNBAAAjwQAAI8EAACRBAAAkQQAAJMEAACTBAAAlQQAAJUEAACXBAAAlwQAAJkEAACZBAAAmwQAAJsEAACdBAAAnQQAAJ8EAACfBAAAoQQAAKEEAACjBAAAowQAAKUEAAClBAAApwQAAKcEAACpBAAAqQQAAKsEAACrBAAArQQAAK0EAACvBAAArwQAALEEAACxBAAAswQAALMEAAC1BAAAtQQAALcEAAC3BAAAuQQAALkEAAC7BAAAuwQAAL0EAAC9BAAAvwQAAL8EAADCBAAAwgQAAMQEAADEBAAAxgQAAMYEAADIBAAAyAQAAMoEAADKBAAAzAQAAMwEAADOBAAAzwQAANEEAADRBAAA0wQAANMEAADVBAAA1QQAANcEAADXBAAA2QQAANkEAADbBAAA2wQAAN0EAADdBAAA3wQAAN8EAADhBAAA4QQAAOMEAADjBAAA5QQAAOUEAADnBAAA5wQAAOkEAADpBAAA6wQAAOsEAADtBAAA7QQAAO8EAADvBAAA8QQAAPEEAADzBAAA8wQAAPUEAAD1BAAA9wQAAPcEAAD5BAAA+QQAAPsEAAD7BAAA/QQAAP0EAAD/BAAA/wQAAAEFAAABBQAAAwUAAAMFAAAFBQAABQUAAAcFAAAHBQAACQUAAAkFAAALBQAACwUAAA0FAAANBQAADwUAAA8FAAARBQAAEQUAABMFAAATBQAAFQUAABUFAAAXBQAAFwUAABkFAAAZBQAAGwUAABsFAAAdBQAAHQUAAB8FAAAfBQAAIQUAACEFAAAjBQAAIwUAACUFAAAlBQAAJwUAACcFAAApBQAAKQUAACsFAAArBQAALQUAAC0FAAAvBQAALwUAAGAFAACIBQAA0BAAAPoQAAD9EAAA/xAAAPgTAAD9EwAAgBwAAIgcAACKHAAAihwAAAAdAAArHQAAax0AAHcdAAB5HQAAmh0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAIQhAACEIQAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB7LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHGnAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA9qcAAPanAAD6pwAA+qcAADCrAABaqwAAYKsAAGirAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAMAQDyDAEAcA0BAIUNAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfVAQBS1QEAa9UBAIbVAQCf1QEAutUBANPVAQDu1QEAB9YBACLWAQA71gEAVtYBAG/WAQCK1gEApdYBAMLWAQDa1gEA3NYBAOHWAQD81gEAFNcBABbXAQAb1wEANtcBAE7XAQBQ1wEAVdcBAHDXAQCI1wEAitcBAI/XAQCq1wEAwtcBAMTXAQDJ1wEAy9cBAMvXAQAA3wEACd8BAAvfAQAe3wEAJd8BACrfAQAi6QEAQ+kBAAADAABvAwAAgwQAAIkEAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAAEAYAABoGAABLBgAAXwYAAHAGAABwBgAA1gYAANwGAADfBgAA5AYAAOcGAADoBgAA6gYAAO0GAAARBwAAEQcAADAHAABKBwAApgcAALAHAADrBwAA8wcAAP0HAAD9BwAAFggAABkIAAAbCAAAIwgAACUIAAAnCAAAKQgAAC0IAABZCAAAWwgAAJcIAACfCAAAyggAAOEIAADjCAAAAwkAADoJAAA8CQAAPgkAAE8JAABRCQAAVwkAAGIJAABjCQAAgQkAAIMJAAC8CQAAvAkAAL4JAADECQAAxwkAAMgJAADLCQAAzQkAANcJAADXCQAA4gkAAOMJAAD+CQAA/gkAAAEKAAADCgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAgwoAALwKAAC8CgAAvgoAAMUKAADHCgAAyQoAAMsKAADNCgAA4goAAOMKAAD6CgAA/woAAAELAAADCwAAPAsAADwLAAA+CwAARAsAAEcLAABICwAASwsAAE0LAABVCwAAVwsAAGILAABjCwAAggsAAIILAAC+CwAAwgsAAMYLAADICwAAygsAAM0LAADXCwAA1wsAAAAMAAAEDAAAPAwAADwMAAA+DAAARAwAAEYMAABI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BQAAjAUAAJAFAACQBQAAyAUAAM8FAADrBQAA7gUAAPUFAAAFBgAAHAYAABwGAADdBgAA3QYAAA4HAAAPBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACWCAAA4ggAAOIIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADODAAA1AwAANcMAADc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AwAAogMAAKIDAAAwBQAAMAUAAFcFAABYBQAAiwUAAIwFAACQBQAAkAUAAMgFAADPBQAA6wUAAO4FAAD1BQAA/wUAAA4HAAAOBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACPCAAAkggAAJYIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADO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AQAAdAEAAHYBAAB2AQAAeAEAAHkBAAB7AQAAewEAAH0BAAB9AQAAgQEAAIIBAACEAQAAhAEAAIYBAACHAQAAiQEAAIsBAACOAQAAkQEAAJMBAACUAQAAlgEAAJgBAACcAQAAnQEAAJ8BAACgAQAAogEAAKIBAACkAQAApAEAAKYBAACnAQAAqQEAAKkBAACsAQAArAEAAK4BAACvAQAAsQEAALMBAAC1AQAAtQEAALcBAAC4AQAAvAEAALwBAADEAQAAxAEAAMcBAADHAQAAygEAAMoBAADNAQAAzQEAAM8BAADPAQAA0QEAANEBAADTAQAA0wEAANUBAADVAQAA1wEAANcBAADZAQAA2QEAANsBAADbAQAA3gEAAN4BAADgAQAA4AEAAOIBAADiAQAA5AEAAOQBAADmAQAA5gEAAOgBAADoAQAA6gEAAOoBAADsAQAA7AEAAO4BAADuAQAA8QEAAPEBAAD0AQAA9AEAAPYBAAD4AQAA+gEAAPoBAAD8AQAA/AEAAP4BAAD+AQAAAAIAAAACAAACAgAAAgIAAAQCAAAEAgAABgIAAAYCAAAIAgAACAIAAAoCAAAKAgAADAIAAAwCAAAOAgAADgIAABACAAAQAgAAEgIAABICAAAUAgAAFAIAABYCAAAWAgAAGAIAABgCAAAaAgAAGgIAABwCAAAcAgAAHgIAAB4CAAAgAgAAIAIAACICAAAiAgAAJAIAACQCAAAmAgAAJgIAACgCAAAoAgAAKgIAACoCAAAsAgAALAIAAC4CAAAuAgAAMAIAADACAAAyAgAAMgIAADoCAAA7AgAAPQIAAD4CAABBAgAAQQIAAEMCAABGAgAASAIAAEgCAABKAgAASgIAAEwCAABMAgAATgIAAE4CAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAM8DAADPAwAA0gMAANQDAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAgyEAAIMhAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc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AAAAQQAAAFoAAABhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAMAAAADWAAAA2AAAAPYAAAD4AAAAwQIAAMYCAADRAgAA4AIAAOQCAADsAgAA7AIAAO4CAADuAgAARQMAAEUDAABjAwAAdAMAAHYDAAB3AwAAegMAAH0DAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIoEAAAvBQAAMQUAAFYFAABZBQAAWQUAAGAFAACIBQAAsAUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAANAFAADqBQAA7wUAAPIFAAAQBgAAGgYAACAGAABXBgAAWQYAAF8GAABuBgAA0wYAANUGAADcBgAA4QYAAOgGAADtBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAPwcAAE0HAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABcIAAAaCAAALAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAlwgAAJcIAACgCAAAyQgAANQIAADfCAAA4wgAAOkIAADwCAAAOwkAAD0JAABMCQAATgkAAFAJAABVCQAAYwkAAHEJAACDCQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAMQJAADHCQAAyAkAAMsJAADMCQAAzgkAAM4JAADXCQAA1wkAANwJAADdCQAA3wkAAOMJAADwCQAA8QkAAPwJAAD8CQAAAQoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABCCgAARwoAAEgKAABLCgAATAoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAHAKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAxQoAAMcKAADJCgAAywoAAMwKAADQCgAA0AoAAOAKAADjCgAA+QoAAPwKAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAABECwAARwsAAEgLAABLCwAATAsAAFYLAABXCwAAXAsAAF0LAABfCwAAYwsAAHELAABxCwAAggsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC+CwAAwgsAAMYLAADICwAAygsAAMwLAADQCwAA0AsAANcLAADXCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAARAwAAEYMAABIDAAASgwAAEwMAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAIAMAACDDAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAADEDAAAxgwAAMgMAADKDAAAzAwAANUMAADWDAAA3QwAAN4MAADgDAAA4wwAAPEMAADzDAAAAA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAEQNAABGDQAASA0AAEoNAABMDQAATg0AAE4NAABUDQAAVw0AAF8NAABjDQAAeg0AAH8NAACBDQAAgw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAEYOAABNDgAATQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAuQ4AALsOAAC9DgAAwA4AAMQOAADGDgAAxg4AAM0OAADNDgAA3A4AAN8OAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAABxDwAAgw8AAIgPAACXDwAAmQ8AALwPAAAAEAAANhAAADgQAAA4EAAAOxAAAD8QAABQEAAAjxAAAJoQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAoBMAAPUTAAD4EwAA/RMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA7hYAAPgWAAAAFwAAExcAAB8XAAAzFwAAQBcAAFMXAABgFwAAbBcAAG4XAABwFwAAchcAAHMXAACAFwAAsxcAALYXAADIFwAA1xcAANcXAADcFwAA3BcAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOBkAAFAZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAAABoAABsaAAAgGgAAXhoAAGEaAAB0GgAApxoAAKcaAAC/GgAAwBoAAMwaAADOGgAAABsAADMbAAA1GwAAQxsAAEUbAABMGwAAgBsAAKkbAACsGwAArxsAALobAADlGwAA5xsAAPEbAAAAHAAANhwAAE0cAABPHAAAWhwAAH0cAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAAAAdAAC/HQAA0x0AAPQdAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAAC8hAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAC2JAAA6SQAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAADgLQAA/y0AAC8uAAAvLgAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABB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FwAAFBcAADIXAAAzFwAAUhcAAFMXAAByFwAAcxcAALQXAAC1FwAAtxcAAL0XAADGFwAAxhcAAMkXAADTFwAA1xcAANcXAADdFwAA3RcAAAsYAAAPGAAAQxgAAEMYAACFGAAAhhgAAKkYAACpGAAAIBkAACIZAAAnGQAAKBkAADIZAAAyGQAAORkAADsZAAAXGgAAGBoAABsaAAAbGgAAVhoAAFYaAABYGgAAXhoAAGAaAABgGgAAYhoAAGIaAABlGgAAbBoAAHMaAAB8GgAAfxoAAH8aAACnGgAApxoAALAaAADOGgAAABsAAAMbAAA0GwAANBsAADYbAAA6GwAAPBsAADwbAABCGwAAQhsAAGsbAABzGwAAgBsAAIEbAACiGwAApRsAAKgbAACpGwAAqxsAAK0bAADmGwAA5hsAAOgbAADpGwAA7RsAAO0bAADvGwAA8RsAACwcAAAzHAAANhwAADccAAB4HAAAfRwAANAcAADSHAAA1BwAAOAcAADiHAAA6BwAAO0cAADtHAAA9BwAAPQcAAD4HAAA+RwAACwdAABqHQAAeB0AAHgdAACbHQAA/x0AAL0fAAC9HwAAvx8AAMEfAADNHwAAzx8AAN0fAADfHwAA7R8AAO8fAAD9HwAA/h8AAAsgAAAPIAAAGCAAABkgAAAkIAAAJCAAACcgAAAnIAAAKiAAAC4gAABgIAAAZCAAAGYgAABvIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAB8LAAAfSwAAO8sAADxLAAAby0AAG8tAAB/LQAAfy0AAOAtAAD/LQAALy4AAC8uAAAFMAAABTAAACowAAAtMAAAMTAAADUwAAA7MAAAOzAAAJkwAACeMAAA/DAAAP4wAAAVoAAAFaAAAPikAAD9pAAADKYAAAymAABvpgAAcqYAAHSmAAB9pgAAf6YAAH+mAACcpgAAn6YAAPCmAADxpgAAAKcAACGnAABwpwAAcKcAAIinAACKpwAA8qcAAPSnAAD4pwAA+acAAAKoAAACqAAABqgAAAaoAAALqAAAC6gAACWoAAAmqAAALKgAACyoAADEqAAAxagAAOCoAADxqAAA/6gAAP+oAAAmqQAALakAAEepAABRqQAAgKkAAIKpAACzqQAAs6kAALapAAC5qQAAvKkAAL2pAADPqQAAz6kAAOWpAADmqQAAKaoAAC6qAAAxqgAAMqoAADWqAAA2qgAAQ6oAAEOqAABMqgAATKoAAHCqAABwqgAAfKoAAHyqAACwqgAAsKoAALKqAAC0qgAAt6oAALiqAAC+qgAAv6oAAMGqAADBqgAA3aoAAN2qAADsqgAA7aoAAPOqAAD0qgAA9qoAAPaqAABbqwAAX6sAAGmrAABrqwAA5asAAOWrAADoqwAA6KsAAO2rAADtqwAAHvsAAB77AACy+wAAwvsAAAD+AAAP/gAAE/4AABP+AAAg/gAAL/4AAFL+AABS/gAAVf4AAFX+AAD//gAA//4AAAf/AAAH/wAADv8AAA7/AAAa/wAAGv8AAD7/AAA+/wAAQP8AAED/AABw/wAAcP8AAJ7/AACf/wAA4/8AAOP/AAD5/wAA+/8AAP0BAQD9AQEA4AIBAOACAQB2AwEAegMBAIAHAQCFBwEAhwcBALAHAQCyBwEAugcBAAEKAQADCgEABQoBAAYKAQAMCgEADwoBADgKAQA6CgEAPwoBAD8KAQDlCgEA5goBACQNAQAnDQEATg0BAE4NAQBpDQEAbQ0BAG8NAQBvDQEAqw4BAKwOAQD8DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQABEAEAARABADgQAQBGEAEAcBABAHAQAQBzEAEAdBABAH8QAQCBEAEAsxABALYQAQC5EAEAuhABAL0QAQC9EAEAwhABAMIQAQDNEAEAzRABAAARAQACEQEAJxEBACsRAQAtEQEANBEBAHMRAQBzEQEAgBEBAIERAQC2EQEAvhEBAMkRAQDMEQEAzxEBAM8RAQAvEgEAMRIBADQSAQA0EgEANhIBADcSAQA+EgEAPhIBAEESAQBBEgEA3xIBAN8SAQDjEgEA6hIBAAATAQABEwEAOxMBADwTAQBAEwEAQBMBAGYTAQBsEwEAcBMBAHQTAQC7EwEAwBMBAM4TAQDOEwEA0BMBANATAQDSEwEA0hMBAOETAQDiEwEAOBQBAD8UAQBCFAEARBQBAEYUAQBGFAEAXhQBAF4UAQCzFAEAuBQBALoUAQC6FAEAvxQBAMAUAQDCFAEAwxQBALIVAQC1FQEAvBUBAL0VAQC/FQEAwBUBANwVAQDdFQEAMxYBADoWAQA9FgEAPRYBAD8WAQBAFgEAqxYBAKsWAQCtFgEArRYBALAWAQC1FgEAtxYBALcWAQAdFwEAHRcBAB8XAQAfFwEAIhcBACUXAQAnFwEAKxcBAC8YAQA3GAEAORgBADoYAQA7GQEAPBkBAD4ZAQA+GQEAQxkBAEMZAQDUGQEA1xkBANoZAQDbGQEA4BkBAOAZAQABGgEAChoBADMaAQA4GgEAOxoBAD4aAQBHGgEARxoBAFEaAQBWGgEAWRoBAFsaAQCKGgEAlhoBAJgaAQCZGgEAMBwBADYcAQA4HAEAPRwBAD8cAQA/HAEAkhwBAKccAQCqHAEAsBwBALIcAQCzHAEAtRwBALYcAQAxHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARR0BAEcdAQBHHQEAkB0BAJEdAQCVHQEAlR0BAJcdAQCXHQEA8x4BAPQeAQAAHwEAAR8BADYfAQA6HwEAQB8BAEAfAQBCHwEAQh8BAFofAQBaHwEAMDQBAEA0AQBHNAEAVTQBAB5hAQApYQEALWEBAC9hAQDwagEA9GoBADBrAQA2awEAQGsBAENrAQBAbQEAQm0BAGttAQBsbQEAT28BAE9vAQCPbwEAn28BAOBvAQDhbwEA428BAORvAQDwrwEA868BAPWvAQD7rwEA/a8BAP6vAQCdvAEAnrwBAKC8AQCjvAEAAM8BAC3PAQAwzwEARs8BAGfRAQBp0QEAc9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAMOABAG3gAQCP4AEAj+ABADDhAQA94QEAruIBAK7iAQDs4gEA7+IBAOvkAQDv5AEA7uUBAO/lAQDQ6AEA1ugBAETpAQBL6QEA+/MBAP/zAQABAA4AAQAOACAADgB/AA4AAAEOAO8BDgBBAAAAWgAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALoAAAC6AAAAwAAAANYAAADYAAAA9gAAAPgAAAC6AQAAvAEAAL8BAADEAQAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcAMAAHMDAAB2AwAAdwMAAHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACKBAAALwUAADEFAABWBQAAYAUAAIgFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAADQEAAA+hAAAPwQAAD/EAAAoBMAAPUTAAD4EwAA/RMAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAAAAdAAC/HQAAAB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAvIQAANCEAADkhAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAH8hAACDIQAAhCEAALYkAADpJAAAACwAAOQsAADrLAAA7iwAAPIsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQKYAAG2mAACApgAAnaYAACKnAACHpwAAi6cAAI6nAACQpwAAzacAANCnAADRpwAA06cAANOnAADVpwAA3KcAAPKnAAD2pwAA+KcAAPqnAAAwqwAAWqsAAFyrAABpqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AABB/wAAWv8AAAAEAQBPBAEAsAQBANMEAQDYBAEA+wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCABwEAgAcBAIMHAQCFBwEAhwcBALAHAQCyBwEAugcBAIAMAQCyDAEAwAwBAPIMAQBQDQEAZQ0BAHANAQCFDQEAoBgBAN8YAQBAbgEAf24BAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAADfAQAJ3wEAC98BAB7fAQAl3wEAKt8BADDgAQBt4AEAAOkBAEPpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQBBAAAAWgAAALUAAAC1AAAAwAAAANYAAADYAAAA3wAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEkBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAAB/AQAAfwEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAARQMAAEUDAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAMIDAADCAwAAzwMAANEDAADVAwAA1gMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPADAADxAwAA9AMAAPUDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAIcFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA+BMAAP0TAACAHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACaHgAAmx4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAACAHwAArx8AALIfAAC0HwAAtx8AALwfAADCHwAAxB8AAMcfAADMHwAA2B8AANsfAADoHwAA7B8AAPIfAAD0HwAA9x8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAQQAAAFoAAABhAAAAegAAALUAAAC1AAAAwAAAANYAAADYAAAA9gAAAPgAAAA3AQAAOQEAAIwBAACOAQAAqQEAAKwBAAC5AQAAvAEAAL0BAAC/AQAAvwEAAMQBAAAgAgAAIgIAADMCAAA6AgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcAMAAHMDAAB2AwAAdwMAAHsDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAADRAwAA1QMAAPUDAAD3AwAA+wMAAP0DAACBBAAAigQAAC8FAAAxBQAAVgUAAGEFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD9EAAA/xAAAKATAAD1EwAA+BMAAP0TAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAAAHgAAmx4AAJ4eAACeHgAAoB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABOIQAATiEAAGAhAAB/IQAAgyEAAIQhAAC2JAAA6SQAAAAsAABwLAAAciwAAHMsAAB1LAAAdiwAAH4sAADjLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAECmAABtpgAAgKYAAJumAAAipwAAL6cAADKnAABvpwAAeacAAIenAACLpwAAjacAAJCnAACUpwAAlqcAAK6nAACwpwAAzacAANCnAADRpwAA1qcAANynAAD1pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AABB/wAAWv8AAAAEAQBPBAEAsAQBANMEAQDYBAEA+wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCADAEAsgwBAMAMAQDyDAEAUA0BAGUNAQBwDQEAhQ0BAKAYAQDfGAEAQG4BAH9uAQAA6QEAQ+kBAEEAAABaAAAAwAAAANYAAADYAAAA3gAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADFAQAAxwEAAMgBAADKAQAAywEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8gEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAAy6cAAMynAADQpwAA0KcAANanAADWpwAA2KcAANinAADapwAA2qcAANynAADcpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAUA0BAGUNAQCgGAEAvxgBAEBuAQBfbgEAAOkBACHpAQBhAAAAegAAALUAAAC1AAAA3wAAAPYAAAD4AAAA/wAAAAEBAAABAQAAAwEAAAMBAAAFAQAABQEAAAcBAAAHAQAACQEAAAkBAAALAQAACwEAAA0BAAANAQAADwEAAA8BAAARAQAAEQEAABMBAAATAQAAFQEAABUBAAAXAQAAFwEAABkBAAAZAQAAGwEAABsBAAAdAQAAHQEAAB8BAAAfAQAAIQEAACEBAAAjAQAAIwEAACUBAAAlAQAAJwEAACcBAAApAQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA3AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjAEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC5AQAAvQEAAL0BAAC/AQAAvwEAAMQBAADEAQAAxgEAAMcBAADJAQAAygEAAMwBAADMAQAAzgEAAM4BAADQAQAA0AEAANIBAADSAQAA1AEAANQBAADWAQAA1gEAANgBAADYAQAA2gEAANoBAADcAQAA3QEAAN8BAADfAQAA4QEAAOEBAADjAQAA4wEAAOUBAADlAQAA5wEAAOcBAADpAQAA6QEAAOsBAADrAQAA7QEAAO0BAADvAQAA8QEAAPMBAADzAQAA9QEAAPUBAAD5AQAA+QEAAPsBAAD7AQAA/QEAAP0BAAD/AQAA/wEAAAECAAABAgAAAwIAAAMCAAAFAgAABQIAAAcCAAAHAgAACQIAAAkCAAALAgAACwIAAA0CAAANAgAADwIAAA8CAAARAgAAEQIAABMCAAATAgAAFQIAABUCAAAXAgAAFwIAABkCAAAZAgAAGwIAABsCAAAdAgAAHQIAAB8CAAAfAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAAzAgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA+wMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYQUAAIcFAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACRpwAAkacAAJOnAACUpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA26cAANunAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BACLpAQBD6QEAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAANwEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAIwBAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAArQEAAK0BAACwAQAAsAEAALQBAAC0AQAAtgEAALYBAAC5AQAAuQEAAL0BAAC9AQAAvwEAAL8BAADFAQAAxgEAAMgBAADJAQAAywEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8gEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAjAgAAIwIAACUCAAAlAgAAJwIAACcCAAApAgAAKQIAACsCAAArAgAALQIAAC0CAAAvAgAALwIAADECAAAxAgAAMwIAADMCAAA8AgAAPAIAAD8CAABAAgAAQgIAAEICAABHAgAARwIAAEkCAABJAgAASwIAAEsCAABNAgAATQIAAE8CAABUAgAAVgIAAFcCAABZAgAAWQIAAFsCAABcAgAAYAIAAGECAABjAgAAZgIAAGgCAABsAgAAbwIAAG8CAABxAgAAcgIAAHUCAAB1AgAAfQIAAH0CAACAAgAAgAIAAIICAACDAgAAhwIAAIwCAACSAgAAkgIAAJ0CAACeAgAARQMAAEUDAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB7AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD7AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABhBQAAhwUAANAQAAD6EAAA/RAAAP8QAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAAC0HwAAth8AALcfAAC8HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AAMwfAADMHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAPwfAAD8HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABT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IQAAOSEAAJQhAACZIQAAqSEAAKohAAAaIwAAGyMAACgjAAAoIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/8QEAAfIBAALyAQAa8gEAGvIBAC/yAQAv8gEAMvIBADryAQBQ8gEAUfIBAADzAQAh8wEAJPMBAJPzAQCW8wEAl/MBAJnzAQCb8wEAnvMBAPDzAQDz8wEA9fMBAPfzAQD99AEA//QBAD31AQBJ9QEATvUBAFD1AQBn9QEAb/UBAHD1AQBz9QEAevUBAIf1AQCH9QEAivUBAI31AQCQ9QEAkPUBAJX1AQCW9QEApPUBAKX1AQCo9QEAqPUBALH1AQCy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CQAAvQkAAL8JAADACQAAxwkAAMgJAADLCQAAzAkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAOYJAAD9CQAAAwoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABACgAAWQoAAFwKAABeCgAAXgoAAGYKAABvCgAAcgoAAHQKAAB2CgAAdgoAAIMKAACDCgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAMAKAADJCgAAyQoAAMsKAADMCgAA0AoAANAKAADgCgAA4QoAAOYKAADxCgAA+QoAAPkKAAACCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAQAsAAEALAABHCwAASAsAAEsLAABMCwAAXAsAAF0LAABfCwAAYQsAAGYLAAB3CwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC/CwAAvwsAAMELAADCCwAAxgsAAMgLAADKCwAAzAsAANALAADQCwAA5gsAAPoLAAABDAAAAwwAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABBDAAARAwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAGYMAABvDAAAdwwAAIAMAACCDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL4MAADBDAAAwQwAAMMMAADEDAAA3QwAAN4MAADgDAAA4QwAAOYMAADvDAAA8QwAAPMMAAACDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAD8NAABADQAARg0AAEgNAABKDQAATA0AAE4NAABPDQAAVA0AAFYNAABYDQAAYQ0AAGYNAAB/DQAAgg0AAIMNAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAA0A0AANENAADYDQAA3g0AAOYNAADvDQAA8g0AAPQNAAABDgAAMA4AADIOAAAz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FgEAOxYBADwWAQA+FgEAPhYBAEEWAQBEFgEAUBYBAFkWAQBgFgEAbBYBAIAWAQCqFgEArBYBAKwWAQCuFgEArxYBALgWAQC5FgEAwBYBAMkWAQDQFgEA4xYBAAAXAQAaFwEAHhcBAB4XAQAgFwEAIRcBACYXAQAmFwEAMBcBAEYXAQAAGAEALhgBADgYAQA4GAEAOxgBADsYAQCgGAEA8hgBAP8YAQAGGQEACRkBAAkZAQAMGQEAExkBABUZAQAWGQEAGBkBAC8ZAQAxGQEANRkBADcZAQA4GQEAPxkBAEIZAQBEGQEARhkBAFAZAQBZGQEAoBkBAKcZAQCqGQEA0xkBANwZAQDfGQEA4RkBAOQZAQAAGgEAABoBAAsaAQAyGgEAORoBADoaAQA/GgEARhoBAFAaAQBQGgEAVxoBAFgaAQBcGgEAiRoBAJcaAQCXGgEAmhoBAKIaAQCwGgEA+BoBAAAbAQAJGwEAwBsBAOEbAQDwGwEA+RsBAAAcAQAIHAEAChwBAC8cAQA+HAEAPhwBAEAcAQBFHAEAUBwBAGwcAQBwHAEAjxwBAKkcAQCpHAEAsRwBALEcAQC0HAEAtBwBAAAdAQAGHQEACB0BAAkdAQALHQEAMB0BAEYdAQBGHQEAUB0BAFkdAQBgHQEAZR0BAGcdAQBoHQEAah0BAI4dAQCTHQEAlB0BAJYdAQCWHQEAmB0BAJgdAQCgHQEAqR0BAOAeAQDyHgEA9R4BAPgeAQACHwEAEB8BABIfAQA1HwEAPh8BAD8fAQBDHwEAWR8BALAfAQCwHwEAwB8BAPEfAQD/HwEAmSMBAAAkAQBuJAEAcCQBAHQkAQCAJAEAQyUBAJAvAQDyLwEAADABAC80AQBBNAEARjQBAGA0AQD6QwEAAEQBAEZGAQAAYQEAHWEBACphAQAsYQEAMGEBADlhAQAAaAEAOGoBAEBqAQBeagEAYGoBAGlqAQBuagEAvmoBAMBqAQDJagEA0GoBAO1qAQD1agEA9WoBAABrAQAvawEAN2sBAEVrAQBQawEAWWsBAFtrAQBhawEAY2sBAHdrAQB9awEAj2sBAEBtAQB5bQEAQG4BAJpuAQAAbwEASm8BAFBvAQCHbwEAk28BAJ9vAQDgbwEA428BAABwAQD3hwEAAIgBANWMAQD/jAEACI0BAPCvAQDzrwEA9a8BAPuvAQD9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BQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAaRMAAHETAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABUXAAAfFwAANBcAAEAXAABTFwAAYBcAAGwXAABuFwAAcBcAAHIXAABzFwAAgBcAANMXAADXFwAA1xcAANwXAADdFwAA4BcAAOkXAAALGAAADRgAAA8YAAAZGAAAIBgAAHgYAACAGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAgGQAAKxkAADAZAAA7GQAARhkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAADQGQAA2hkAAAAaAAAbGgAAIBoAAF4aAABgGgAAfBoAAH8aAACJGgAAkBoAAJkaAACnGgAApxoAALAaAAC9GgAAvxoAAM4aAAAAGwAATBsAAFAbAABZGwAAaxsAAHMbAACAGwAA8xsAAAAcAAA3HAAAQBwAAEkcAABNHAAAfRwAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAANAcAADSHAAA1BwAAPocAAAAHQAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAAwgAAANIAAAPyAAAEAgAABUIAAAVCAAAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAANAgAADcIAAA4SAAAOEgAADlIAAA8CAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGCEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAACwAAOQsAADrLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAAB/LQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAADgLQAA/y0AAAUwAAAHMAAAITAAAC8wAAAxMAAANTAAADgwAAA8MAAAQTAAAJYwAACZMAAAnzAAAKEwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/MQAA8DEAAP8xAAAANAAAv00AAABOAACMpAAA0KQAAP2kAAAApQAADKYAABCmAAArpgAAQKYAAG+mAAB0pgAAfaYAAH+mAADxpgAAF6cAAB+nAAAipwAAiKcAAIunAADNpwAA0KcAANGnAADTpwAA06cAANWnAADcpwAA8qcAACeoAAAsqAAALKgAAECoAABz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BQAAWQUAAFkFAABgBQAAiAUAANAFAADqBQAA7wUAAPIFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACF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AwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACXCAAAnwgAAMoIAADhCAAA4wgAAAIJAAAVCQAAOgkAADwJAAA8CQAAQQkAAEgJAABNCQAATQkAAFEJAABfCQAAYgkAAGMJAAB4CQAAfwkAAIEJAACBCQAAlQkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC8CQAAvAkAAL4JAAC+CQAAwQkAAMQJAADNCQAAzQkAANcJAADXCQAA3AkAAN0JAADfCQAA3wkAAOIJAADjCQAA8AkAAPEJAAD+CQAA/gkAAAEKAAACCgAAPAoAADwKAABBCgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAggoAAJUKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvAoAALwKAADBCgAAxQoAAMcKAADICgAAzQoAAM0KAADiCgAA4woAAPkKAAD/CgAAAQsAAAELAAAVCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAADwLAAA8CwAAPgsAAD8LAABBCwAARAsAAE0LAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABfCwAAYgsAAGMLAABxCwAAcQsAAIILAACCCwAAvgsAAL4LAADACwAAwAsAAM0LAADNCwAA1wsAANcLAAAADAAAAAwAAAQMAAAEDAAAFQwAACgMAAAqDAAAOQwAADwMAAA8DAAAPgwAAEAMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABYDAAAWgwAAGIMAABjDAAAgQwAAIEMAAC8DAAAvAwAAL8MAADADAAAwgwAAMIMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADiDAAA4wwAAAANAAABDQAAFQ0AADwNAAA+DQAAPg0AAEENAABEDQAATQ0AAE0NAABXDQAAVw0AAGINAABj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AQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjQEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACqAQAAqwEAAK0BAACtAQAAsAEAALABAAC0AQAAtAEAALYBAAC2AQAAuQEAALoBAAC9AQAAvwEAAMYBAADGAQAAyQEAAMkBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACECAAAhAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAA5AgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAegMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA/AMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYAUAAIgFAADQEAAA+hAAAPwQAAD/EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9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/wcA/v8IAP//CAD+/wkA//8JAP7/CgD//woA/v8LAP//CwD+/wwA//8MAP7/DQD//w0A/v8OAP//DgD+/w8A//8PAP7/EAD//xAARQMAAEUDAABjAwAAbwMAALAFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAAQBgAAGgYAAEsGAABXBgAAWQYAAF8GAABwBgAAcAYAANYGAADcBgAA4QYAAOQGAADnBgAA6AYAAO0GAADtBgAAEQcAABEHAAAwBwAAPwcAAKYHAACwBwAAFggAABcIAAAbCAAAIwgAACUIAAAnCAAAKQgAACwIAACXCAAAlwgAANQIAADfCAAA4wgAAOkIAADwCAAAAwkAADoJAAA7CQAAPgkAAEwJAABOCQAATwkAAFUJAABXCQAAYgkAAGMJAACBCQAAgwkAAL4JAADECQAAxwkAAMgJAADLCQAAzAkAANcJAADXCQAA4gkAAOMJAAABCgAAAwoAAD4KAABCCgAARwoAAEgKAABLCgAATAoAAFEKAABRCgAAcAoAAHEKAAB1CgAAdQoAAIEKAACDCgAAvgoAAMUKAADHCgAAyQoAAMsKAADMCgAA4goAAOMKAAD6CgAA/AoAAAELAAADCwAAPgsAAEQLAABHCwAASAsAAEsLAABMCwAAVgsAAFcLAABiCwAAYwsAAIILAACCCwAAvgsAAMILAADGCwAAyAsAAMoLAADMCwAA1wsAANcLAAAADAAABAwAAD4MAABEDAAARgwAAEgMAABKDAAATAwAAFUMAABWDAAAYgwAAGMMAACBDAAAgwwAAL4MAADEDAAAxgwAAMgMAADKDAAAzAwAANUMAADWDAAA4gwAAOMMAADzDAAA8wwAAAANAAADDQAAPg0AAEQNAABGDQAASA0AAEoNAABMDQAAVw0AAFcNAABiDQAAYw0AAIENAACDDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA8g0AAPMNAAAxDgAAMQ4AADQOAAA6DgAATQ4AAE0OAACxDgAAsQ4AALQOAAC5DgAAuw4AALwOAADNDgAAzQ4AAHEPAACDDwAAjQ8AAJcPAACZDwAAvA8AACsQAAA2EAAAOBAAADgQAAA7EAAAPhAAAFYQAABZEAAAXhAAAGAQAABiEAAAZBAAAGcQAABtEAAAcRAAAHQQAACC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EAAA/BAAACwdAABqHQAAeB0AAHgdAACbHQAAvx0AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAHAhAAB/IQAA0CQAAOkkAAB8LAAAfSwAAJymAACdpgAAcKcAAHCnAADypwAA9KcAAPinAAD5pwAAXKsAAF+rAABpqwAAaasAAIAHAQCABwEAgwcBAIUHAQCHBwEAsAcBALIHAQC6BwEAMOABAG3gAQBeAAAAXgAAANADAADSAwAA1QMAANUDAADwAwAA8QMAAPQDAAD1AwAAFiAAABYgAAAyIAAANCAAAEAgAABAIAAAYSAAAGQgAAB9IAAAfiAAAI0gAACOIAAA0CAAANwgAADhIAAA4SAAAOUgAADmIAAA6yAAAO8gAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAoIQAAKSEAACwhAAAtIQAALyEAADEhAAAzIQAAOCEAADwhAAA/IQAARSEAAEkhAACVIQAAmSEAAJwhAACfIQAAoSEAAKIhAACkIQAApSEAAKchAACnIQAAqSEAAK0hAACwIQAAsSEAALYhAAC3IQAAvCEAAM0hAADQIQAA0SEAANMhAADTIQAA1SEAANshAADdIQAA3SEAAOQhAADlIQAACCMAAAsjAAC0IwAAtSMAALcjAAC3IwAA0CMAANAjAADiIwAA4iMAAKAlAAChJQAAriUAALYlAAC8JQAAwCUAAMYlAADHJQAAyiUAAMslAADPJQAA0yUAAOIlAADiJQAA5CUAAOQlAADnJQAA7CUAAAUmAAAGJgAAQCYAAEAmAABCJgAAQiYAAGAmAABjJgAAbSYAAG4mAADFJwAAxicAAOYnAADvJwAAgykAAJgpAADYKQAA2ykAAPwpAAD9KQAAYf4AAGH+AABj/gAAY/4AAGj+AABo/gAAPP8AADz/AAA+/wAAPv8AAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAM7XAQD/1wEAAO4BAAPuAQAF7gEAH+4BACHuAQAi7gEAJO4BACTuAQAn7gEAJ+4BACnuAQAy7gEANO4BADfuAQA57gEAOe4BADvuAQA77gEAQu4BAELuAQBH7gEAR+4BAEnuAQBJ7gEAS+4BAEvuAQBN7gEAT+4BAFHuAQBS7gEAVO4BAFTuAQBX7gEAV+4BAFnuAQBZ7gEAW+4BAFvuAQBd7gEAXe4BAF/uAQBf7gEAYe4BAGLuAQBk7gEAZO4BAGfuAQBq7gEAbO4BAHLuAQB07gEAd+4BAHnuAQB87gEAfu4BAH7uAQCA7gEAie4BAIvuAQCb7gEAoe4BAKPuAQCl7gEAqe4BAKvuAQC77gEAYCEAAG8hAAC2JAAAzyQAADDxAQBJ8QEAUPEBAGnxAQBw8QEAifEBACEAAAAvAAAAOgAAAEAAAABbAAAAXgAAAGAAAABgAAAAewAAAH4AAAChAAAApwAAAKkAAACpAAAAqwAAAKwAAACuAAAArgAAALAAAACxAAAAtgAAALYAAAC7AAAAuwAAAL8AAAC/AAAA1wAAANcAAAD3AAAA9wAAABAgAAAnIAAAMCAAAD4gAABBIAAAUyAAAFUgAABeIAAAkCEAAF8kAAAAJQAAdScAAJQnAAD/KwAAAC4AAH8uAAABMAAAAzAAAAgwAAAgMAAAMDAAADAwAAA+/QAAP/0AAEX+AABG/gAACQAAAA0AAAAgAAAAIAAAAIUAAACFAAAADiAAAA8gAAAoIAAAKSAAAAAGAAAFBgAA3QYAAN0GAAAPBwAADwcAAJAIAACRCAAA4ggAAOIIAAC9EAEAvRABAM0QAQDNEAEAIgAAACIAAAAnAAAAJwAAAKsAAACrAAAAuwAAALsAAAAYIAAAHyAAADkgAAA6IAAAQi4AAEIuAAAMMAAADzAAAB0wAAAfMAAAQf4AAET+AAAC/wAAAv8AAAf/AAAH/wAAYv8AAGP/AACALgAAmS4AAJsuAADzLgAAAC8AANUvAADm8QEA//EBACEAAAAhAAAALgAAAC4AAAA/AAAAPwAAAIkFAACJBQAAHQYAAB8GAADUBgAA1AYAAAAHAAACBwAA+QcAAPkHAAA3CAAANwgAADkIAAA5CAAAPQgAAD4IAABkCQAAZQkAAEoQAABLEAAAYhMAAGITAABnEwAAaBMAAG4WAABuFgAANRcAADYXAADUFwAA1RcAAAMYAAADGAAACRgAAAkYAABEGQAARRkAAKgaAACrGgAAThsAAE8bAABaGwAAWxsAAF4bAABfGwAAfRsAAH8bAAA7HAAAPBwAAH4cAAB/HAAAJCAAACQgAAA8IAAAPSAAAEcgAABJIAAA+SwAAPssAAAuLgAALi4AADwuAAA8LgAAUy4AAFQuAAACMAAAAjAAAP+kAAD/pAAADqYAAA+mAADzpgAA86YAAPemAAD3pgAAdqgAAHeoAADOqAAAz6gAAC+pAAAvqQAAyKkAAMmpAABdqgAAX6oAAPCqAADxqgAA66sAAOurAAAS/gAAEv4AABX+AAAW/gAAUv4AAFL+AABW/gAAV/4AAAH/AAAB/wAADv8AAA7/AAAf/wAAH/8AAGH/AABh/wAAVgoBAFcKAQBVDwEAWQ8BAIYPAQCJDwEARxABAEgQAQC+EAEAwRABAEERAQBDEQEAxREBAMYRAQDNEQEAzREBAN4RAQDfEQEAOBIBADkSAQA7EgEAPBIBAKkSAQCpEgEA1BMBANUTAQBLFAEATBQBAMIVAQDDFQEAyRUBANcVAQBBFgEAQhYBADwXAQA+FwEARBkBAEQZAQBGGQEARhkBAEIaAQBDGgEAmxoBAJwaAQBBHAEAQhwBAPceAQD4HgEAQx8BAEQfAQBuagEAb2oBAPVqAQD1agEAN2sBADhrAQBEawEARGsBAG5tAQBvbQEAmG4BAJhuAQCfvAEAn7wBAIjaAQCI2gEAaQAAAGoAAAAvAQAALwEAAEkCAABJAgAAaAIAAGgCAACdAgAAnQIAALICAACyAgAA8wMAAPMDAABWBAAAVgQAAFgEAABYBAAAYh0AAGIdAACWHQAAlh0AAKQdAACkHQAAqB0AAKgdAAAtHgAALR4AAMseAADLHgAAcSAAAHEgAABIIQAASSEAAHwsAAB8LAAAItQBACPUAQBW1AEAV9QBAIrUAQCL1AEAvtQBAL/UAQDy1AEA89QBACbVAQAn1QEAWtUBAFvVAQCO1QEAj9UBAMLVAQDD1QEA9tUBAPfVAQAq1gEAK9YBAF7WAQBf1gEAktYBAJPWAQAa3wEAGt8BAEzgAQBN4AEAaOABAGjgAQAhAAAAIQAAACwAAAAsAAAALgAAAC4AAAA6AAAAOwAAAD8AAAA/AAAAfgMAAH4DAACHAwAAhwMAAIkFAACJBQAAwwUAAMMFAAAMBgAADAYAABsGAAAbBgAAHQYAAB8GAADUBgAA1AYAAAAHAAAKBwAADAcAAAwHAAD4BwAA+QcAADAIAAA1CAAANwgAAD4IAABeCAAAXggAAGQJAABlCQAAWg4AAFsOAAAIDwAACA8AAA0PAAASDwAAShAAAEsQAABhEwAAaBMAAG4WAABuFgAA6xYAAO0WAAA1FwAANhcAANQXAADWFwAA2hcAANoXAAACGAAABRgAAAgYAAAJGAAARBkAAEUZAACoGgAAqxoAAE4bAABPGwAAWhsAAFsbAABdGwAAXxsAAH0bAAB/GwAAOxwAAD8cAAB+HAAAfxwAACQgAAAkIAAAPCAAAD0gAABHIAAASSAAAPksAAD7LAAALi4AAC4uAAA8LgAAPC4AAEEuAABBLgAATC4AAEwuAABOLgAATy4AAFMuAABULgAAATAAAAIwAAD+pAAA/6QAAA2mAAAPpgAA86YAAPemAAB2qAAAd6gAAM6oAADPqAAAL6kAAC+pAADHqQAAyakAAF2qAABfqgAA36oAAN+qAADwqgAA8aoAAOurAADrqwAAEv4AABL+AAAV/gAAFv4AAFD+AABS/gAAVP4AAFf+AAAB/wAAAf8AAAz/AAAM/wAADv8AAA7/AAAa/wAAG/8AAB//AAAf/wAAYf8AAGH/AABk/wAAZP8AAJ8DAQCfAwEA0AMBANADAQBXCAEAVwgBAB8JAQAfCQEAVgoBAFcKAQDwCgEA9QoBADoLAQA/CwEAmQsBAJwLAQBVDwEAWQ8BAIYPAQCJDwEARxABAE0QAQC+EAEAwRABAEERAQBDEQEAxREBAMYRAQDNEQEAzREBAN4RAQDfEQEAOBIBADwSAQCpEgEAqRIBANQTAQDVEwEASxQBAE0UAQBaFAEAWxQBAMIVAQDFFQEAyRUBANcVAQBBFgEAQhYBADwXAQA+FwEARBkBAEQZAQBGGQEARhkBAEIaAQBDGgEAmxoBAJwaAQChGgEAohoBAEEcAQBDHAEAcRwBAHEcAQD3HgEA+B4BAEMfAQBEHwEAcCQBAHQkAQBuagEAb2oBAPVqAQD1agEAN2sBADlrAQBEawEARGsBAG5tAQBvbQEAl24BAJhuAQCfvAEAn7wBAIfaAQCK2gEAADQAAL9NAAAATgAA/58AAA76AAAP+gAAEfoAABH6AAAT+gAAFPoAAB/6AAAf+gAAIfoAACH6AAAj+gAAJPoAACf6AAAp+gAAAAACAN+mAgAApwIAObcCAEC3AgAduAIAILgCAKHOAgCwzgIA4OsCAPDrAgBd7gIAAAADAEoTAwBQEwMAryMDAEEAAABaAAAAwAAAANYAAADYAAAA3gAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADEAQAAxwEAAMcBAADKAQAAygEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8QEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAIkcAACJHAAAkBwAALocAAC9HAAAvxwAAAAeAAAAHgAAAh4AAAIeAAAEHgAABB4AAAYeAAAGHgAACB4AAAgeAAAKHgAACh4AAAweAAAMHgAADh4AAA4eAAAQHgAAEB4AABIeAAASHgAAFB4AABQeAAAWHgAAFh4AABgeAAAYHgAAGh4AABoeAAAcHgAAHB4AAB4eAAAeHgAAIB4AACAeAAAiHgAAIh4AACQeAAAkHgAAJh4AACYeAAAoHgAAKB4AACoeAAAqHgAALB4AACweAAAuHgAALh4AADAeAAAwHgAAMh4AADIeAAA0HgAANB4AADYeAAA2HgAAOB4AADgeAAA6HgAAOh4AADweAAA8HgAAPh4AAD4eAABAHgAAQB4AAEIeAABCHgAARB4AAEQeAABGHgAARh4AAEgeAABIHgAASh4AAEoeAABMHgAATB4AAE4eAABOHgAAUB4AAFAeAABSHgAAUh4AAFQeAABUHgAAVh4AAFYeAABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc1AEAntQBAJ/UAQCi1AEAotQBAKXUAQCm1AEAqdQBAKzUAQCu1AEAtdQBANDUAQDp1AEABNUBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQA41QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAbNUBAIXVAQCg1QEAudUBANTVAQDt1QEACNYBACHWAQA81gEAVdYBAHDWAQCJ1gEAqNYBAMDWAQDi1gEA+tYBABzXAQA01wEAVtcBAG7XAQCQ1wEAqNcBAMrXAQDK1wEAAOkBACHpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQALGAAADRgAAA8YAAAPGAAAAP4AAA/+AAAAAQ4A7wEOADAAAAA5AAAAQQAAAFoAAABfAAAAXwAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALcAAAC3AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB7AwAAfQMAAH8DAAB/AwAAhgMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIMEAACHBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAaRMAAHETAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABUXAAAfFwAANBcAAEAXAABTFwAAYBcAAGwXAABuFwAAcBcAAHIXAABzFwAAgBcAANMXAADXFwAA1xcAANwXAADdFwAA4BcAAOkXAAALGAAADRgAAA8YAAAZGAAAIBgAAHgYAACAGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAgGQAAKxkAADAZAAA7GQAARhkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAADQGQAA2hkAAAAaAAAbGgAAIBoAAF4aAABgGgAAfBoAAH8aAACJGgAAkBoAAJkaAACnGgAApxoAALAaAAC9GgAAvxoAAM4aAAAAGwAATBsAAFAbAABZGwAAaxsAAHMbAACAGwAA8xsAAAAcAAA3HAAAQBwAAEkcAABNHAAAfRwAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAANAcAADSHAAA1BwAAPocAAAAHQAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAAwgAAANIAAAPyAAAEAgAABUIAAAVCAAAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAANAgAADcIAAA4SAAAOEgAADlIAAA8CAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGCEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAACwAAOQsAADrLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAAB/LQAAli0AAKAtAACm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GAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAApxoAAKcaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA6RwAAOwcAADuHAAA8xwAAPUcAAD2HAAA+hwAAPocAAAAHQAAvx0AAAAeAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAYIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAAALAAA5CwAAOssAADuLAAA8iwAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAAAwLQAAZy0AAG8tAABvLQAAgC0AAJYtAACgLQAApi0AAKgtAACuLQAAsC0AALYtAAC4LQAAvi0AAMAtAADGLQAAyC0AAM4tAADQLQAA1i0AANgtAADeLQAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABBMAAAljAAAJ0wAACfMAAAoTAAAPowAAD8MAAA/zAAAAUxAAAvMQAAMTEAAI4xAACgMQAAvzEAAPAxAAD/MQAAADQAAL9NAAAATgAAjKQAANCkAAD9pAAAAKUAAAymAAAQpgAAH6YAACqmAAArpgAAQKYAAG6mAAB/pgAAnaYAAKCmAADvpgAAF6cAAB+nAAAipwAAiKcAAIunAADNpwAA0KcAANGnAADTpwAA06cAANWnAADcpwAA8qcAAAGoAAADqAAABagAAAeoAAAKqAAADKgAACKoAABAqAAAc6gAAIKoAACzqAAA8qgAAPeoAAD7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rAAAjKwAAKisAACorAAAxKwAAMSsAADgrAAA4KwAAPysAAD8rAAAGK0AABitAAA0rQAANK0AAFCtAABQrQAAbK0AAGytAACIrQAAiK0AAKStAACkrQAAwK0AAMCtAADcrQAA3K0AAPitAAD4rQAAFK4AABSuAAAwrgAAMK4AAEyuAABMrgAAaK4AAGiuAACErgAAhK4AAKCuAACgrgAAvK4AALyuAADYrgAA2K4AAPSuAAD0rgAAEK8AABCvAAAsrwAALK8AAEivAABIrwAAZK8AAGSvAACArwAAgK8AAJyvAACcrwAAuK8AALivAADUrwAA1K8AAPCvAADwrwAADLAAAAywAAAosAAAKLAAAESwAABEsAAAYLAAAGCwAAB8sAAAfLAAAJiwAACYsAAAtLAAALSwAADQsAAA0LAAAOywAADssAAACLEAAAixAAAksQAAJLEAAECxAABAsQAAXLEAAFyxAAB4sQAAeLEAAJSxAACUsQAAsLEAALCxAADMsQAAzLEAAOixAADosQAABLIAAASyAAAgsgAAILIAADyyAAA8sgAAWLIAAFiyAAB0sgAAdLIAAJCyAACQsgAArLIAAKyyAADIsgAAyLIAAOSyAADksgAAALMAAACzAAAcswAAHLMAADizAAA4swAAVLMAAFSzAABwswAAcLMAAIyzAACMswAAqLMAAKizAADEswAAxLMAAOCzAADgswAA/LMAAPyzAAAYtAAAGLQAADS0AAA0tAAAULQAAFC0AABstAAAbLQAAIi0AACItAAApLQAAKS0AADAtAAAwLQAANy0AADctAAA+LQAAPi0AAAUtQAAFLUAADC1AAAwtQAATLUAAEy1AABotQAAaLUAAIS1AACEtQAAoLUAAKC1AAC8tQAAvLUAANi1AADYtQAA9LUAAPS1AAAQtgAAELYAACy2AAAstgAASLYAAEi2AABktgAAZLYAAIC2AACAtgAAnLYAAJy2AAC4tgAAuLYAANS2AADUtgAA8LYAAPC2AAAMtwAADLcAACi3AAAotwAARLcAAES3AABgtwAAYLcAAHy3AAB8twAAmLcAAJi3AAC0twAAtLcAANC3AADQtwAA7LcAAOy3AAAIuAAACLgAACS4AAAkuAAAQLgAAEC4AABcuAAAXLgAAHi4AAB4uAAAlLgAAJS4AACwuAAAsLgAAMy4AADMuAAA6LgAAOi4AAAEuQAABLkAACC5AAAguQAAPLkAADy5AABYuQAAWLkAAHS5AAB0uQAAkLkAAJC5AACsuQAArLkAAMi5AADIuQAA5LkAAOS5AAAAugAAALoAABy6AAAcugAAOLoAADi6AABUugAAVLoAAHC6AABwugAAjLoAAIy6AACougAAqLoAAMS6AADEugAA4LoAAOC6AAD8ugAA/LoAABi7AAAYuwAANLsAADS7AABQuwAAULsAAGy7AABsuwAAiLsAAIi7AACkuwAApLsAAMC7AADAuwAA3LsAANy7AAD4uwAA+LsAABS8AAAUvAAAMLwAADC8AABMvAAATLwAAGi8AABovAAAhLwAAIS8AACgvAAAoLwAALy8AAC8vAAA2LwAANi8AAD0vAAA9LwAABC9AAAQvQAALL0AACy9AABIvQAASL0AAGS9AABkvQAAgL0AAIC9AACcvQAAnL0AALi9AAC4vQAA1L0AANS9AADwvQAA8L0AAAy+AAAMvgAAKL4AACi+AABEvgAARL4AAGC+AABgvgAAfL4AAHy+AACYvgAAmL4AALS+AAC0vgAA0L4AANC+AADsvgAA7L4AAAi/AAAIvwAAJL8AACS/AABAvwAAQL8AAFy/AABcvwAAeL8AAHi/AACUvwAAlL8AALC/AACwvwAAzL8AAMy/AADovwAA6L8AAATAAAAEwAAAIMAAACDAAAA8wAAAPMAAAFjAAABYwAAAdMAAAHTAAACQwAAAkMAAAKzAAACswAAAyMAAAMjAAADkwAAA5MAAAADBAAAAwQAAHMEAABzBAAA4wQAAOMEAAFTBAABUwQAAcMEAAHDBAACMwQAAjMEAAKjBAACowQAAxMEAAMTBAADgwQAA4MEAAPzBAAD8wQAAGMIAABjCAAA0wgAANMIAAFDCAABQwgAAbMIAAGzCAACIwgAAiMIAAKTCAACkwgAAwMIAAMDCAADcwgAA3MIAAPjCAAD4wgAAFMMAABTDAAAwwwAAMMMAAEzDAABMwwAAaMMAAGjDAACEwwAAhMMAAKDDAACgwwAAvMMAALzDAADYwwAA2MMAAPTDAAD0wwAAEMQAABDEAAAsxAAALMQAAEjEAABIxAAAZMQAAGTEAACAxAAAgMQAAJzEAACcxAAAuMQAALjEAADUxAAA1MQAAPDEAADwxAAADMUAAAzFAAAoxQAAKMUAAETFAABExQAAYMUAAGDFAAB8xQAAfMUAAJjFAACYxQAAtMUAALTFAADQxQAA0MUAAOzFAADsxQAACMYAAAjGAAAkxgAAJMYAAEDGAABAxgAAXMYAAFzGAAB4xgAAeMYAAJTGAACUxgAAsMYAALDGAADMxgAAzMYAAOjGAADoxgAABMcAAATHAAAgxwAAIMcAADzHAAA8xwAAWMcAAFjHAAB0xwAAdMcAAJDHAACQxwAArMcAAKzHAADIxwAAyMcAAOTHAADkxwAAAMgAAADIAAAcyAAAHMgAADjIAAA4yAAAVMgAAFTIAABwyAAAcMgAAIzIAACMyAAAqMgAAKjIAADEyAAAxMgAAODIAADgyAAA/MgAAPzIAAAYyQAAGMkAADTJAAA0yQAAUMkAAFDJAABsyQAAbMkAAIjJAACIyQAApMkAAKTJAADAyQAAwMkAANzJAADcyQAA+MkAAPjJAAAUygAAFMoAADDKAAAwygAATMoAAEzKAABoygAAaMoAAITKAACEygAAoMoAAKDKAAC8ygAAvMoAANjKAADYygAA9MoAAPTKAAAQywAAEMsAACzLAAAsywAASMsAAEjLAABkywAAZMsAAIDLAACAywAAnMsAAJzLAAC4ywAAuMsAANTLAADUywAA8MsAAPDLAAAMzAAADMwAACjMAAAozAAARMwAAETMAABgzAAAYMwAAHzMAAB8zAAAmMwAAJjMAAC0zAAAtMwAANDMAADQzAAA7MwAAOzMAAAIzQAACM0AACTNAAAkzQAAQM0AAEDNAABczQAAXM0AAHjNAAB4zQAAlM0AAJTNAACwzQAAsM0AAMzNAADMzQAA6M0AAOjNAAAEzgAABM4AACDOAAAgzgAAPM4AADzOAABYzgAAWM4AAHTOAAB0zgAAkM4AAJDOAACszgAArM4AAMjOAADIzgAA5M4AAOTOAAAAzwAAAM8AABzPAAAczwAAOM8AADjPAABUzwAAVM8AAHDPAABwzwAAjM8AAIzPAACozwAAqM8AAMTPAADEzwAA4M8AAODPAAD8zwAA/M8AABjQAAAY0AAANNAAADTQAABQ0AAAUNAAAGzQAABs0AAAiNAAAIjQAACk0AAApNAAAMDQAADA0AAA3NAAANzQAAD40AAA+NAAABTRAAAU0QAAMNEAADDRAABM0QAATNEAAGjRAABo0QAAhNEAAITRAACg0QAAoNEAALzRAAC80QAA2NEAANjRAAD00QAA9NEAABDSAAAQ0gAALNIAACzSAABI0gAASNIAAGTSAABk0gAAgNIAAIDSAACc0gAAnNIAALjSAAC40gAA1NIAANTSAADw0gAA8NIAAAzTAAAM0wAAKNMAACjTAABE0wAARNMAAGDTAABg0wAAfNMAAHzTAACY0wAAmNMAALTTAAC00wAA0NMAANDTAADs0wAA7NMAAAjUAAAI1AAAJNQAACTUAABA1AAAQNQAAFzUAABc1AAAeNQAAHjUAACU1AAAlNQAALDUAACw1AAAzNQAAMzUAADo1AAA6NQAAATVAAAE1QAAINUAACDVAAA81QAAPNUAAFjVAABY1QAAdNUAAHTVAACQ1QAAkNUAAKzVAACs1QAAyNUAAMjVAADk1QAA5NUAAADWAAAA1gAAHNYAABzWAAA41gAAONYAAFTWAABU1gAAcNYAAHDWAACM1gAAjNYAAKjWAACo1gAAxNYAAMTWAADg1gAA4NYAAPzWAAD81gAAGNcAABjXAAA01wAANNcAAFDXAABQ1wAAbNcAAGzXAACI1wAAiNcAAAGsAAAbrAAAHawAADesAAA5rAAAU6wAAFWsAABvrAAAcawAAIusAACNrAAAp6wAAKmsAADDrAAAxawAAN+sAADhrAAA+6wAAP2sAAAXrQAAGa0AADOtAAA1rQAAT60AAFGtAABrrQAAba0AAIetAACJrQAAo60AAKWtAAC/rQAAwa0AANutAADdrQAA960AAPmtAAATrgAAFa4AAC+uAAAxrgAAS64AAE2uAABnrgAAaa4AAIOuAACFrgAAn64AAKGuAAC7rgAAva4AANeuAADZrgAA864AAPWuAAAPrwAAEa8AACuvAAAtrwAAR68AAEmvAABjrwAAZa8AAH+vAACBrwAAm68AAJ2vAAC3rwAAua8AANOvAADVrwAA768AAPGvAAALsAAADbAAACewAAApsAAAQ7AAAEWwAABfsAAAYbAAAHuwAAB9sAAAl7AAAJmwAACzsAAAtbAAAM+wAADRsAAA67AAAO2wAAAHsQAACbEAACOxAAAlsQAAP7EAAEGxAABbsQAAXbEAAHexAAB5sQAAk7EAAJWxAACvsQAAsbEAAMuxAADNsQAA57EAAOmxAAADsgAABbIAAB+yAAAhsgAAO7IAAD2yAABXsgAAWbIAAHOyAAB1sgAAj7IAAJGyAACrsgAArbIAAMeyAADJsgAA47IAAOWyAAD/sgAAAbMAABuzAAAdswAAN7MAADmzAABTswAAVbMAAG+zAABxswAAi7MAAI2zAACnswAAqbMAAMOzAADFswAA37MAAOGzAAD7swAA/bMAABe0AAAZtAAAM7QAADW0AABPtAAAUbQAAGu0AABttAAAh7QAAIm0AACjtAAApbQAAL+0AADBtAAA27QAAN20AAD3tAAA+bQAABO1AAAVtQAAL7UAADG1AABLtQAATbUAAGe1AABptQAAg7UAAIW1AACftQAAobUAALu1AAC9tQAA17UAANm1AADztQAA9bUAAA+2AAARtgAAK7YAAC22AABHtgAASbYAAGO2AABltgAAf7YAAIG2AACbtgAAnbYAALe2AAC5tgAA07YAANW2AADvtgAA8bYAAAu3AAANtwAAJ7cAACm3AABDtwAARbcAAF+3AABhtwAAe7cAAH23AACXtwAAmbcAALO3AAC1twAAz7cAANG3AADrtwAA7bcAAAe4AAAJuAAAI7gAACW4AAA/uAAAQbgAAFu4AABduAAAd7gAAHm4AACTuAAAlbgAAK+4AACxuAAAy7gAAM24AADnuAAA6bgAAAO5AAAFuQAAH7kAACG5AAA7uQAAPbkAAFe5AABZuQAAc7kAAHW5AACPuQAAkbkAAKu5AACtuQAAx7kAAMm5AADjuQAA5bkAAP+5AAABugAAG7oAAB26AAA3ugAAOboAAFO6AABVugAAb7oAAHG6AACLugAAjboAAKe6AACpugAAw7oAAMW6AADfugAA4boAAPu6AAD9ugAAF7sAABm7AAAzuwAANbsAAE+7AABRuwAAa7sAAG27AACHuwAAibsAAKO7AACluwAAv7sAAMG7AADbuwAA3bsAAPe7AAD5uwAAE7wAABW8AAAvvAAAMbwAAEu8AABNvAAAZ7wAAGm8AACDvAAAhbwAAJ+8AAChvAAAu7wAAL28AADXvAAA2bwAAPO8AAD1vAAAD70AABG9AAArvQAALb0AAEe9AABJvQAAY70AAGW9AAB/vQAAgb0AAJu9AACdvQAAt70AALm9AADTvQAA1b0AAO+9AADxvQAAC74AAA2+AAAnvgAAKb4AAEO+AABFvgAAX74AAGG+AAB7vgAAfb4AAJe+AACZvgAAs74AALW+AADPvgAA0b4AAOu+AADtvgAAB78AAAm/AAAjvwAAJb8AAD+/AABBvwAAW78AAF2/AAB3vwAAeb8AAJO/AACVvwAAr78AALG/AADLvwAAzb8AAOe/AADpvwAAA8AAAAXAAAAfwAAAIcAAADvAAAA9wAAAV8AAAFnAAABzwAAAdcAAAI/AAACRwAAAq8AAAK3AAADHwAAAycAAAOPAAADlwAAA/8AAAAHBAAAbwQAAHcEAADfBAAA5wQAAU8EAAFXBAABvwQAAccEAAIvBAACNwQAAp8EAAKnBAADDwQAAxcEAAN/BAADhwQAA+8EAAP3BAAAXwgAAGcIAADPCAAA1wgAAT8IAAFHCAABrwgAAbcIAAIfCAACJwgAAo8IAAKXCAAC/wgAAwcIAANvCAADdwgAA98IAAPnCAAATwwAAFcMAAC/DAAAxwwAAS8MAAE3DAABnwwAAacMAAIPDAACFwwAAn8MAAKHDAAC7wwAAvcMAANfDAADZwwAA88MAAPXDAAAPxAAAEcQAACvEAAAtxAAAR8QAAEnEAABjxAAAZcQAAH/EAACBxAAAm8QAAJ3EAAC3xAAAucQAANPEAADVxAAA78QAAPHEAAALxQAADcUAACfFAAApxQAAQ8UAAEXFAABfxQAAYcUAAHvFAAB9xQAAl8UAAJnFAACzxQAAtcUAAM/FAADRxQAA68UAAO3FAAAHxgAACcYAACPGAAAlxgAAP8YAAEHGAABbxgAAXcYAAHfGAAB5xgAAk8YAAJXGAACvxgAAscYAAMvGAADNxgAA58YAAOnGAAADxwAABccAAB/HAAAhxwAAO8cAAD3HAABXxwAAWccAAHPHAAB1xwAAj8cAAJHHAACrxwAArccAAMfHAADJxwAA48cAAOXHAAD/xwAAAcgAABvIAAAdyAAAN8gAADnIAABTyAAAVcgAAG/IAABxyAAAi8gAAI3IAACnyAAAqcgAAMPIAADFyAAA38gAAOHIAAD7yAAA/cgAABfJAAAZyQAAM8kAADXJAABPyQAAUckAAGvJAABtyQAAh8kAAInJAACjyQAApckAAL/JAADByQAA28kAAN3JAAD3yQAA+ckAABPKAAAVygAAL8oAADHKAABLygAATcoAAGfKAABpygAAg8oAAIXKAACfygAAocoAALvKAAC9ygAA18oAANnKAADzygAA9coAAA/LAAARywAAK8sAAC3LAABHywAAScsAAGPLAABlywAAf8sAAIHLAACbywAAncsAALfLAAC5ywAA08sAANXLAADvywAA8csAAAvMAAANzAAAJ8wAACnMAABDzAAARcwAAF/MAABhzAAAe8wAAH3MAACXzAAAmcwAALPMAAC1zAAAz8wAANHMAADrzAAA7cwAAAfNAAAJzQAAI80AACXNAAA/zQAAQc0AAFvNAABdzQAAd80AAHnNAACTzQAAlc0AAK/NAACxzQAAy80AAM3NAADnzQAA6c0AAAPOAAAFzgAAH84AACHOAAA7zgAAPc4AAFfOAABZzgAAc84AAHXOAACPzgAAkc4AAKvOAACtzgAAx84AAMnOAADjzgAA5c4AAP/OAAABzwAAG88AAB3PAAA3zwAAOc8AAFPPAABVzwAAb88AAHHPAACLzwAAjc8AAKfPAACpzwAAw88AAMXPAADfzwAA4c8AAPvPAAD9zwAAF9AAABnQAAAz0AAANdAAAE/QAABR0AAAa9AAAG3QAACH0AAAidAAAKPQAACl0AAAv9AAAMHQAADb0AAA3dAAAPfQAAD50AAAE9EAABXRAAAv0QAAMdEAAEvRAABN0QAAZ9EAAGnRAACD0QAAhdEAAJ/RAACh0QAAu9EAAL3RAADX0QAA2dEAAPPRAAD10QAAD9IAABHSAAAr0gAALdIAAEfSAABJ0gAAY9IAAGXSAAB/0gAAgdIAAJvSAACd0gAAt9IAALnSAADT0gAA1dIAAO/SAADx0gAAC9MAAA3TAAAn0wAAKdMAAEPTAABF0wAAX9MAAGHTAAB70wAAfdMAAJfTAACZ0wAAs9MAALXTAADP0wAA0dMAAOvTAADt0wAAB9QAAAnUAAAj1AAAJdQAAD/UAABB1AAAW9QAAF3UAAB31AAAedQAAJPUAACV1AAAr9QAALHUAADL1AAAzdQAAOfUAADp1AAAA9UAAAXVAAAf1QAAIdUAADvVAAA91QAAV9UAAFnVAABz1QAAddUAAI/VAACR1QAAq9UAAK3VAADH1QAAydUAAOPVAADl1QAA/9UAAAHWAAAb1gAAHdYAADfWAAA51gAAU9YAAFXWAABv1gAAcdYAAIvWAACN1gAAp9YAAKnWAADD1gAAxdYAAN/WAADh1gAA+9YAAP3WAAAX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AwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAigQAAC8FAAAxBQAAVgUAAFkFAABcBQAAXgUAAF4FAABgBQAAiAUAAIoFAACKBQAA8wUAAPMFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAADwcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAAS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4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBAO7lAQDv5QEA0OgBANboAQBE6QEASukBACAADgB/AA4AAAEOAO8BDgCtAAAArQAAABwGAAAcBgAADwcAAA8HAAAOGAAADhgAAAsgAAALIAAADiAAAA8gAAAqIAAALiAAAGAgAABkIAAAZiAAAG8gAAD//gAA//4AAPn/AAD7/wAAMDQBAD80AQCgvAEAo7wBAHPRAQB60QEAAQAOAAEADgBhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAAuAIAAMACAADBAgAA4AIAAOQCAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB6AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD8AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABgBQAAiAUAAPwQAAD8EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAMOABAG3gAQAi6QEAQ+kBADAAAAA5AAAAAAYAAAUGAABgBgAAaQYAAGsGAABsBgAA3QYAAN0GAADwBgAA+QYAAMAHAADJBwAAkAgAAJEIAADiCAAA4ggAAGYJAABvCQAA5gkAAO8JAABmCgAAbwoAAOYKAADvCgAAZgsAAG8LAADmCwAA7wsAAGYMAABvDAAA5gwAAO8MAABmDQAAbw0AAOYNAADvDQAAUA4AAFkOAADQDgAA2Q4AACAPAAApDwAAQBAAAEkQAACQEAAAmRAAAOAXAADpFwAAEBgAABkYAABGGQAATxkAANAZAADaGQAAgBoAAIkaAACQGgAAmRoAAFAbAABZGwAAsBsAALkbAABAHAAASRwAAFAcAABZHAAAIKYAACmmAADQqAAA2agAAACpAAAJqQAA0KkAANmpAADwqQAA+akAAFCqAABZqgAA8KsAAPmrAAAQ/wAAGf8AAKAEAQCpBAEAMA0BADkNAQBADQEASQ0BAGYQAQBvEAEAvRABAL0QAQDNEAEAzRABAPAQAQD5EAEANhEBAD8RAQDQEQEA2REBAPASAQD5EgEAUBQBAFkUAQDQFAEA2RQBAFAWAQBZFgEAwBYBAMkWAQDQFgEA4xYBADAXAQA5FwEA4BgBAOkYAQBQGQEAWRkBAPAbAQD5GwEAUBwBAFkcAQBQHQEAWR0BAKAdAQCpHQEAUB8BAFkfAQAwYQEAOWEBAGBqAQBpagEAwGoBAMlqAQBQawEAWWsBAHBtAQB5bQEA8MwBAPnMAQDO1wEA/9cBAEDhAQBJ4QEA8OIBAPniAQDw5AEA+eQBAPHlAQD65QEAUOkBAFnpAQDw+wEA+fsBALsBAAC7AQAAwAEAAMMBAACUAgAAlAIAALkCAAC/AgAAxgIAANECAADsAgAA7AIAAO4CAADuAgAAdAMAAHQDAABZBQAAWQUAANAFAADqBQAA7wUAAPMFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9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AQAADAEAAAwBAAAOAQAADgEAABABAAAQAQAAEgEAABIBAAAUAQAAFAEAABYBAAAWAQAAGAEAABgBAAAaAQAAGgEAABwBAAAcAQAAHgEAAB4BAAAgAQAAIAEAACIBAAAiAQAAJAEAACQBAAAmAQAAJgEAACgBAAAoAQAAKgEAACoBAAAsAQAALAEAAC4BAAAuAQAAMAEAADABAAAyAQAAMgEAADQBAAA0AQAANgEAADYBAAA5AQAAOQEAADsBAAA7AQAAPQEAAD0BAAA/AQAAPwEAAEEBAABBAQAAQwEAAEMBAABFAQAARQEAAEcBAABHAQAASgEAAEoBAABMAQAATAEAAE4BAABOAQAAUAEAAFABAABSAQAAUgEAAFQBAABUAQAAVgEAAFYBAABYAQAAWAEAAFoBAABaAQAAXAEAAFwBAABeAQAAXgEAAGABAABgAQAAYgEAAGIBAABkAQAAZAEAAGYBAABmAQAAaAEAAGgBAABqAQAAagEAAGwBAABsAQAAbgEAAG4BAABwAQAAcAEAAHIBAAByAQAAdAEAAHQBAAB2AQAAdgEAAHgBAAB5AQAAewEAAHsBAAB9AQAAfQEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANIDAADUAwAA2AMAANgDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADiAwAA5AMAAOQDAADmAwAA5gMAAOgDAADoAwAA6gMAAOoDAADsAwAA7AMAAO4DAADuAwAA9AMAAPQDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAKATAAD1EwAAiRwAAIkcAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABu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AAAACAAAAAQAAAB4BQAAeQUAAHoFAAB1bml0YSBib29sZWFuYSBzdHJpbmdieXRlIGFycmF5Ym9vbGVhbiBgOx0mAAkAAADg+SYAAQAAAGludGVnZXIgYAAAAFQdJgAJAAAA4PkmAAEAAABmbG9hdGluZyBwb2ludCBgcB0mABAAAADg+SYAAQAAAGNoYXJhY3RlciBgAJAdJgALAAAA4PkmAAEAAABzdHJpbmcgAKwdJgAHAAAAdW5pdCB2YWx1ZU9wdGlvbiB2YWx1ZW5ld3R5cGUgc3RydWN0c2VxdWVuY2V1bml0IHZhcmlhbnRuZXd0eXBlIHZhcmlhbnR0dXBsZSB2YXJpYW50c3RydWN0IHZhcmlhbnQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9jb3JlLTEuMC4yMjUvc3JjL2RlL21vZC5ycwAeHiYAZQAAACUJAAASAAAA4PkmAAEAAADg+SYAAQAAAGAgb3IgYAAA4PkmAAEAAACkHiYABgAAAOD5JgABAAAAb25lIG9mIC4wAAAAewUAAAwAAAAEAAAAfAUAAH0FAAB+BQAAAAAAAAAAAAABAAAAzQMAAKAWJwBPAAAAOQYAABQAAACgFicATwAAADkGAAAhAAAAoBYnAE8AAAAtBgAAFAAAAKAWJwBPAAAALQYAACEAAABDFicASwAAADIIAAAeAAAAoBYnAE8AAAC6BAAAJAAAAEVPRiB3aGlsZSBwYXJzaW5nIGEgbGlzdEVPRiB3aGlsZSBwYXJzaW5nIGFuIG9iamVjdEVPRiB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nRU9GIHdoaWxlIHBhcnNpbmcgYSB2YWx1ZWV4cGVjdGVkIGA6YGV4cGVjdGVkIGAsYCBvciBgXWBleHBlY3RlZCBgLGAgb3IgYH1gZXhwZWN0ZWQgaWRlbnRleHBlY3RlZCB2YWx1ZWV4cGVjdGVkIGAiYGludmFsaWQgZXNjYXBlaW52YWxpZCBudW1iZXJudW1iZXIgb3V0IG9mIHJhbmdlaW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnRjb250cm9sIGNoYXJhY3RlciAoXHUwMDAwLVx1MDAxRikgZm91bmQgd2hpbGUgcGFyc2luZyBhIHN0cmluZ2tleSBtdXN0IGJlIGEgc3RyaW5naW52YWxpZCB2YWx1ZTogZXhwZWN0ZWQga2V5IHRvIGJlIGEgbnVtYmVyIGluIHF1b3Rlc2Zsb2F0IGtleSBtdXN0IGJlIGZpbml0ZSAoZ290IE5hTiBvciArLy1pbmYpbG9uZSBsZWFkaW5nIHN1cnJvZ2F0ZSBpbiBoZXggZXNjYXBldHJhaWxpbmcgY29tbWF0cmFpbGluZyBjaGFyYWN0ZXJzdW5leHBlY3RlZCBlbmQgb2YgaGV4IGVzY2FwZXJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZCBhdCBsaW5lICBjb2x1bW4gAAAAAQAAAAAAAACMISYACQAAAJUhJgAIAAAARXJyb3IoLCBsaW5lOiAsIGNvbHVtbjoguCEmAAYAAAC+ISYACAAAAMYhJgAKAAAAXIInAAEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL2Vycm9yLnJz8CEmAGQAAAD3AQAAIQAAAPAhJgBkAAAA+wEAAAwAAADwISYAZAAAAAICAAAhAAAA8CEmAGQAAAALAgAAKgAAAPAhJgBkAAAADwIAACwAAAB7BQAADAAAAAQAAAB8BQAAfQUAAH4FAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAAvCImAA4AAADKIiYACwAAAAAAAAAAAAAAAQAAAH8FAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5yc/giJgBoAAAANQAAAA4AAAAAAAAAAAAAAAEAAABWBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5yc4AjJgBkAAAAKwAAACsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvYm94ZWQucnMA9CMmAGMAAABBAAAADgAAAPQjJgBjAAAAdgAAACQAAAA6IAAAAAAAAAQAAAAEAAAAgAUAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjgvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZACMJCYAKQAAAKwEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAjCQmACkAAACyBAAADQAAAHVzZSBvZiBzdGQ6OnRocmVhZDo6Y3VycmVudCgpIGlzIG5vdCBwb3NzaWJsZSBhZnRlciB0aGUgdGhyZWFkJ3MgbG9jYWwgZGF0YSBoYXMgYmVlbiBkZXN0cm95ZWQAADQlJgBeAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9jdXJyZW50LnJzAAAAnCUmACEAAAABAQAACQAAAEFjY2Vzc0Vycm9yY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbjogANslJgBIAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkSSYmADcAAAAsJiYAHQAAAKkEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAAmCYmACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnN1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UAzCYmABwAAACKAQAAHQAAAIEFAAAQAAAABAAAAIIFAACDBQAAV291bGRCbG9ja2VudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yT3Njb2RlS2luZEN1c3RvbSAob3MgZXJyb3IgAAABAAAAAAAAADsqJgALAAAAXIInAAEAAABsaWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwBgKiYAFwAAANMCAAAhAAAAYComABcAAAD6AgAALAAAAGAqJgAXAAAA/AIAACYAAABgKiYAFwAAAAkDAAAnAAAAYComABcAAAAVAwAAJwAAAGAqJgAXAAAAfwMAACkAAABgKiYAFwAAAIADAAArAAAAYComABcAAACVAwAALwAAAGAqJgAXAAAAjQMAAC8AAABgKiYAFwAAAJsDAAArAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMYKyYALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAVCsmACMAAADWAAAAFAAAADx1bmtub3duPu+/vWxpYnJhcnkvc3RkL3NyYy8uLi8uLi9iYWNrdHJhY2Uvc3JjL3N5bWJvbGl6ZS9tb2QucnOUKyYANAAAAGcBAAAwAAAAAQAAAAAAAAB4JCYAAgAAAAIAAAAAAAAAAAAEAAAAAAAAAAAAIAAA6CAtIAABAAAAAAAAAAAsJgADAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAgAADoICAgICAgICAgICAgICAgICAgIGF0IAAA4BUnAAEAAABOb3RGb3VuZFBlcm1pc3Npb25EZW5pZWRDb25uZWN0aW9uUmVmdXNlZENvbm5lY3Rpb25SZXNldEhvc3RVbnJlYWNoYWJsZU5ldHdvcmtVbnJlYWNoYWJsZUNvbm5lY3Rpb25BYm9ydGVkTm90Q29ubmVjdGVkQWRkckluVXNlQWRkck5vdEF2YWlsYWJsZU5ldHdvcmtEb3duQnJva2VuUGlwZUFscmVhZHlFeGlzdHNOb3RBRGlyZWN0b3J5SXNBRGlyZWN0b3J5RGlyZWN0b3J5Tm90RW1wdHlSZWFkT25seUZpbGVzeXN0ZW1GaWxlc3lzdGVtTG9vcFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVJbnZhbGlkSW5wdXRJbnZhbGlkRGF0YVRpbWVkT3V0V3JpdGVaZXJvU3RvcmFnZUZ1bGxOb3RTZWVrYWJsZVF1b3RhRXhjZWVkZWRGaWxlVG9vTGFyZ2VSZXNvdXJjZUJ1c3lFeGVjdXRhYmxlRmlsZUJ1c3lEZWFkbG9ja0Nyb3NzZXNEZXZpY2VzVG9vTWFueUxpbmtzSW52YWxpZEZpbGVuYW1lQXJndW1lbnRMaXN0VG9vTG9uZ0ludGVycnVwdGVkVW5zdXBwb3J0ZWRVbmV4cGVjdGVkRW9mT3V0T2ZNZW1vcnlJblByb2dyZXNzT3RoZXJVbmNhdGVnb3JpemVkb3BlcmF0aW9uIHN1Y2Nlc3NmdWxPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAHQuJgAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHmoLiYAOAAAAIQFAAAMAAAABAAAAIUFAACGBQAAhwUAAAAAAAAAAAAAAQAAAM0DAAAAAAAABAAAAAQAAACIBQAAAAAAAAAAAAABAAAAigUAAIsFAACMBQAAQAAnAGgAAAAEAQAAIAAAAEAAJwBoAAAAJQEAACcAAABAACcAaAAAACoBAAA0AAAAQAAnAGgAAABKAQAAMQAAADogYnBvcyA9IDsgbGluZWJwb3MgPSAAAAEAAAAAAAAAeC8mAAkAAACBLyYADQAAALgPJwABAAAAQAAnAGgAAABLAQAAEQAAAEAAJwBoAAAAYQEAABkAAABAACcAaAAAAIMBAABGAAAAQAAnAGgAAADeAwAANQAAAEAAJwBoAAAA5QMAADYAAABtYXAuc3RhcnRfcG9zID0gOyB0b3RhbF9leHRyYV9ieXRlcyA9IDsgYnBvcyA9IAAAMCYAEAAAABAwJgAWAAAAJjAmAAkAAABAACcAaAAAAOwDAAAJAAAAQAAnAGgAAAAZBAAAEAAAAEAAJwBoAAAAygQAADAAAABAACcAaAAAALYEAAAwAAAAQAAnAGgAAACnBQAAEAAAAG5vIGVycm9ycyBlbmNvdW50ZXJlZCBldmVuIHRob3VnaCBgZGVsYXlfc3Bhbl9idWdgIGlzc3VlZAAAAJgwJgA5AAAAhDomAGgAAACaAQAAEQAAAGVuY291bnRlcmVkIGVycm9yIHdpdGggYC1aIHRyZWF0X2Vycl9hc19idWcA7DAmACsAAACEOiYAaAAAAGcCAAANAAAAFgAAAE1lc3NhZ2VTdWJEaWFnbm9zdGljbGV2ZWxyZW5kZXJfc3BhbkJ1Z0ZhdGFsUGhhc2VGYXRhbFdhcm5pbmdOb3RlSGVscENhbmNlbGxlZEZhaWx1cmVOb3RlL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL2Vycm9ycy9kaWFnbm9zdGljX2J1aWxkZXIucnNFcnJvciBjb25zdHJ1Y3RlZCBidXQgbm90IGVtaXR0ZWQAAACNMSYAdwAAAF0BAAANAAAAAAAAAAAAAAABAAAAjQUAAI4FAACPBQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdW5pY29kZS13aWR0aC0wLjEuMTQvc3JjL3RhYmxlcy5ycwBQMiYAZwAAAJEAAAAVAAAAUDImAGcAAACXAAAAGQAAAAAAAAAMAAAABAAAAJAFAACRBQAAAAAAAAwAAAAEAAAAkgUAAJMFAABhc3NlcnRpb24gZmFpbGVkOiBzdGFydCA8PSBlbmQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfY29tbW9uLTE1LjAuMC9zcmMvaW5wdXQucnMAAAAeMyYAYwAAAB8AAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc291cmNlX2ZpbGVfZW5kID49IGxhc3RfbGluZV9zdGFydC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zeW50YXhfcG9zL2FuYWx5emVfc291cmNlX2ZpbGUucnPIMyYAfAAAACoAAAAJAAAAyDMmAHwAAABqAAAAGAAAAMgzJgB8AAAAagAAAC0AAADIMyYAfAAAAHUAAAAiAAAAyDMmAHwAAAB9AAAAIgAAAMgzJgB8AAAAVQAAAB8AAADIMyYAfAAAAFkAAAAbAAAAyDMmAHwAAABdAAAAGwAAAMgzJgB8AAAAYAAAACYAAADIMyYAfAAAAGMAAAAmAAAAAAAAAAQAAAAEAAAAlAUAAAAAAAAEAAAABAAAAAkBAAABAAAAAAAAAODoJgACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL3N5bnRheF9wb3MucnMgbWFjcm9zPswAJwABAAAAfDUmAAgAAAA8cXVvdGUgZXhwYW5zaW9uPgAAAJQ1JgARAAAAPGFub24+AACwNSYABgAAADxtYWNybyBleHBhbnNpb24+AAAAwDUmABEAAAA8cHJvYy1tYWNybyBzb3VyY2UgY29kZT7cNSYAGAAAAMwAJwABAAAAywAnAAEAAAAUNSYAaAAAAFMCAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9pbmRleCA8IGFuYWx5c2lzLmxpbmVzLmxlbigpIGFzIGlzaXplFDUmAGgAAACpAwAACQAAABUAAABQcmltYXJ5U3BhbkxhYmVsTXVsdGlTcGFucHJpbWFyeV9zcGFuc3NwYW5fbGFiZWxzQnl0ZVBvc01haW5IZWFkZXJNc2dIZWFkZXJNc2dMaW5lQW5kQ29sdW1uTGluZU51bWJlclF1b3RhdGlvblVuZGVybGluZVByaW1hcnlVbmRlcmxpbmVTZWNvbmRhcnlMYWJlbFByaW1hcnlMYWJlbFNlY29uZGFyeU9sZFNjaG9vbE5vdGVUZXh0Tm9TdHlsZUxldmVsSGlnaGxpZ2h0b3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybTw3JgAoAAAAJAAAAAIAAABkNyYAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXh4NyYAIAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJzoDcmAFwAAAATAAAACQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9wYXRoLnJzAAw4JgBHAAAAuAwAABsAAAAMOCYARwAAANsMAAAhAAAADDgmAEcAAADODAAAIgAAAAWWJgBwAAAAaQEAAA0AAAC4AScAAQAAAE1hcmsAAAAAAAAAAAEAAAB0BAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL2NvbW1lbnRzLnJzAACwOCYAZgAAAKcBAAAW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AAAAIQEAAMEFAAAMAAAABAAAAMIFAADDBQAABAAAAAQAAADEBQAAZmFpbGVkIHRvIHBhcnNlIHN0cmluZyBhcyBudW1iZXKAhCYAcgAAALADAAAvAAAAZmFpbGVkIHRvIHBhcnNlIG51bWJlciBhcyBjaGFyAACAhCYAcgAAALIDAAAOAAAAbWVzc2FnZXF1b3RhbXBhcG9zbHRndG5ic3BpZXhjbGNlbnRwb3VuZGN1cnJlbnllbmJydmJhcnNlY3R1bWxjb3B5b3JkZmxhcXVvbm90c2h5cmVnbWFjcmRlZ3BsdXNtbnN1cDJzdXAzYWN1dGVtaWNyb3BhcmFtaWRkb3RjZWRpbHN1cDFvcmRtcmFxdW9mcmFjMTRmcmFjMTJmcmFjMzRpcXVlc3RBZ3JhdmVBYWN1dGVBY2lyY0F0aWxkZUF1bWxBcmluZ0FFbGlnQ2NlZGlsRWdyYXZlRWFjdXRlRWNpcmNFdW1sSWdyYXZlSWFjdXRlSWNpcmNJdW1sRVRITnRpbGRlT2dyYXZlT2FjdXRlT2NpcmNPdGlsZGVPdW1sdGltZXNPc2xhc2hVZ3JhdmVVYWN1dGVVY2lyY1V1bWxZYWN1dGVUSE9STnN6bGlnYWdyYXZlYWFjdXRlYWNpcmNhdGlsZGVhdW1sYXJpbmdhZWxpZ2NjZWRpbGVncmF2ZWVhY3V0ZWVjaXJjZXVtbGlncmF2ZWlhY3V0ZWljaXJjaXVtbGV0aG50aWxkZW9ncmF2ZW9hY3V0ZW9jaXJjb3RpbGRlb3VtbGRpdmlkZW9zbGFzaHVncmF2ZXVhY3V0ZXVjaXJjdXVtbHlhY3V0ZXRob3JueXVtbE9FbGlnb2VsaWdTY2Fyb25zY2Fyb25ZdW1sZm5vZmNpcmN0aWxkZUFscGhhQmV0YUdhbW1hRGVsdGFFcHNpbG9uWmV0YUV0YVRoZXRhSW90YUthcHBhTGFtYmRhTXVOdVhpT21pY3JvblBpUmhvU2lnbWFUYXVVcHNpbG9uUGhpQ2hpUHNpT21lZ2FhbHBoYWJldGFnYW1tYWRlbHRhZXBzaWxvbnpldGFldGF0aGV0YWlvdGFrYXBwYWxhbWJkYW11bnV4aW9taWNyb25waXJob3NpZ21hZnNpZ21hdGF1dXBzaWxvbnBoaWNoaXBzaW9tZWdhdGhldGFzeW11cHNpaHBpdmVuc3BlbXNwdGhpbnNwenduanp3amxybXJsbW5kYXNobWRhc2hsc3F1b3JzcXVvc2JxdW9sZHF1b3JkcXVvYmRxdW9kYWdnZXJEYWdnZXJidWxsaGVsbGlwcGVybWlscHJpbWVQcmltZWxzYXF1b3JzYXF1b29saW5lZnJhc2xldXJvaW1hZ2V3ZWllcnByZWFsdHJhZGVhbGVmc3ltbGFycnVhcnJyYXJyZGFycmhhcnJjcmFycmxBcnJ1QXJyckFycmRBcnJoQXJyZm9yYWxscGFydGV4aXN0ZW1wdHluYWJsYWlzaW5ub3Rpbm5pcHJvZHN1bW1pbnVzbG93YXN0cmFkaWNpbmZpbmFuZ2FuZG9yY2FwY3VwaW50dGhlcmU0c2ltY29uZ2FzeW1wbmVlcXVpdmxlZ2VzdWJzdXBuc3Vic3ViZXN1cGVvcGx1c290aW1lc3BlcnBzZG90bGNlaWxyY2VpbGxmbG9vcnJmbG9vcmxhbmdyYW5nbG96c3BhZGVzY2x1YnNoZWFydHNkaWFtc3N0cnVjdCBUc1N5bnRheAAAxQUAACAAAAAIAAAAHQEAAMYFAAAEAAAABAAAAJUBAADHBQAABAAAAAQAAAAeAQAAAAAAAAEAAAABAAAAIAAAAKsFAAAMAAAABAAAAEgCAAAAAAAAAQAAAAEAAADIBQAAyQUAAAQAAAAEAAAAygUAAAAAAAABAAAAAQAAAMsFAADMBQAADAAAAAQAAADNBQAAzgUAABgAAAAEAAAAtgUAAM8FAAAQAAAACAAAANAFAADRBQAAIAAAAAgAAADSBQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL3V0aWwucnMBAAAAAAAAAMgAJwABAAAAAQAAAAAAAADgFScAAQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IFVzaW5nIGlzIG5vdCBhIHZhbGlkIGRlY2xhcmF0aW9uIGZvciBgZGVjbGFyZWAga2V5d29yZLRNJgBgAAAAIE0mAHQAAABZAAAAHAAAAAAAAAABAAAAAQAAANQFAAAAAAAAAQAAAAEAAABlBQAAqwUAAAwAAAAEAAAASAIAAFBhcnNlSW50RXJyb3IAAADVBQAABAAAAAQAAACCAQAA1gUAAAwAAAAEAAAAQwIAAAAAAAABAAAAAQAAAMgFAAAAAAAAAQAAAAEAAAAgAAAAAAAAAAQAAAAEAAAA1wUAANgFAAAYAAAACAAAAKYBAADZBQAABAAAAAQAAADaBQAAAAAAAAQAAAAEAAAA2wUAAAAAAAABAAAAAQAAANwFAADdBQAAMAAAAAgAAADeBQAAAAAAAAQAAAAEAAAASwEAAN8FAAAEAAAABAAAAB4BAAAAAAAABAAAAAQAAABNAgAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vbGV4ZXIvbnVtYmVyLnJzAAAAPE8mAHUAAAA6AAAAJAAAADxPJgB1AAAARgAAACMAAAA8TyYAdQAAAFIAAAAjAAAAPE8mAHUAAABcAAAAGgAAADxPJgB1AAAAWgAAABoAAABVbmV4cGVjdGVkIGVvZi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvZXJyb3IucnNEZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gZm9yLWluIGxvb3BVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgZW5hYmxlZC4gU2V0IGpzYy5wYXJzZXIuZXhwbGljaXRSZXNvdXJjZU1hbmFnZW1lbnQgdG8gdHJ1ZVVzaW5nIGRlY2xhcmF0aW9uIG9ubHkgYWxsb3dzIGlkZW50aWZpZXJzVXNpbmcgZGVjbGFyYXRpb24gcmVxdWlyZXMgaW5pdGlhbGl6ZXJwcml2YXRlIG5hbWVzIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcmZhY2VJbnZhbGlkIGBzdXBlcigpYEludmFsaWQgYWNjZXNzIHRvIHN1cGVySW5kZXggc3VwZXIgd2l0aCBwcml2YXRlIG5hbWUgaXMgbm90IGFsbG93ZWQnbmV3LnRhcmdldCcgaXMgb25seSBhbGxvd2VkIGluIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yIGNsYXNzLkltcG9ydCBpcyBub3QgYWxsb3dlZCBoZXJlQW4gYXJyb3cgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgaGVyZWBleHBvcnRgIGlzIG5vdCBhbGxvd2VkIGhlcmVBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgcmVhZG9ubHlBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgb3B0aW9uYWxBIGBnZXRgIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHBhcmFtZXRlcnNBIGBzZXRgIGFjY2Vzc29yIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJ0b3AgbGV2ZWwgYXdhaXQgaXMgb25seSBhbGxvd2VkIGluIG1vZHVsZUxlZ2FjeSBkZWNpbWFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlTGVnYWN5IG9jdGFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlSW52YWxpZCBjaGFyYWN0ZXIgaW4gaWRlbnRpZmllcmEgYmluYXJ5YW4gb2N0YWxhIGRlY2ltYWxhIGhleGFkZWNpbWFsRXhwZWN0ZWQgIGRpZ2l0AAAAOlQmAAkAAABDVCYABgAAABJQJgBnAAAAQAEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW5leHBlY3RlZCBlc2NhcGUgc2VxdWVuY2UgaW4gcmVzZXJ2ZWQgd29yZDogAAZVJgAtAAAAVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlclVuZXhwZWN0ZWQgY2hhcmFjdGVyIItVJgAVAAAASW52YWxpZCBzdHJpbmcgZXNjYXBlSW52YWxpZCB1bmljb2RlIGVzY2FwZUJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLCBleHBlY3RlZCAA01UmACgAAABFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZQDg+SYAAQAAAFdWJgAwAAAAYGF3YWl0YCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIGFuIGFzeW5jIGNvbnRleHQnZXZhbCcgYW5kICdhcmd1bWVudHMnIGNhbm5vdCBiZSB1c2VkIGFzIGEgYmluZGluZyBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlJ2FyZ3VtZW50cycgaXMgb25seSBhbGxvd2VkIGluIGZ1bmN0aW9ucyBhbmQgY2xhc3MgbWV0aG9kc0lsbGVnYWwgJ3VzZSBzdHJpY3QnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QuJyoqJyBjYW5ub3QgYmUgYXBwbGllZCB0byB1bmFyeS9hd2FpdCBleHByZXNzaW9uLlVuZXhwZWN0ZWQgdG9rZW4gJyMnTGluZUJyZWFrIGNhbm5vdCBmb2xsb3cgJ3Rocm93J1VuZXhwZWN0ZWQgbGluZSBicmVhayBiZXR3ZWVuIGFycm93IGhlYWQgYW5kIGFycm93VW5leHBlY3RlZCB0b2tlbiBgYC4gRXhwZWN0ZWQgADlYJgASAAAAS1gmAAwAAAAgLCBvciAAAGtYJgADAAAAIG9yIFVuZXhwZWN0ZWQgdG9rZW4uIERpZCB5b3UgbWVhbiAAfFgmAB8AAACnDCcAAQAAAGNhbm5vdCBpbXBvcnQgYXMgcmVzZXJ2ZWQgd29yZGFzc2lnbm1lbnQgcHJvcGVydHkgaXMgaW52YWxpZCBzeW50YXhFeHBlY3RlZCAnJywgZ290ICcnAADvWCYACgAAAPlYJgAIAAAAAVkmAAEAAABFeHBlY3RlZCAnOycsICd9JyBvciA8ZW9mPmF3YWl0KiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFzeW5jIGZ1bmN0aW9ucyBwcm9wb3NhbC4gVXNlIFByb21pc2UuYWxsKCkgaW5zdGVhZC5DYW5ub3QgdXNlIGEgcmVzZXJ2ZWQgd29yZCBhcyBhIHNob3J0aGFuZCBwcm9wZXJ0eU51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnNBIHN3aXRjaCBibG9jayBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0c1RyYWlsaW5nIGNvbW1hIGlzbid0IHBlcm1pdHRlZCBhZnRlciBhIHJlc3QgZWxlbWVudFJlc3QgZWxlbWVudCBtdXN0IGJlIGZpbmFsIGVsZW1lbnRQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gc3ByZWFkIG9wZXJhdG9yUGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBiZSBlbXB0eU5vdCBhIHBhdHRlcm5Ob3QgYW4gZXhwcmVzc2lvbkNhbm5vdCBhc3NpZ24gdG8gdGhpc0ludmFsaWQgYXNzaWdubWVudCB0YXJnZXRFeHBlY3RlZCBpZGVudEV4cGVjdGVkICc7JyBvciBsaW5lIGJyZWFrTGFiZWwgIGlzIGFscmVhZHkgZGVjbGFyZWQAAABjWyYABgAAAGlbJgAUAAAAQW4gYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGdlbmVyYXRvcidpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgYXJlIG5vdCBwZXJtaXR0ZWQgaGVyZSdpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZSdpbXBvcnQubWV0YScgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZS5EZXN0cnVjdHVyaW5nIGJpbmRpbmdzIHJlcXVpcmUgaW5pdGlhbGl6ZXJzV2l0aCBzdGF0ZW1lbnQgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlUmV0dXJuIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCBoZXJlRXhwZWN0ZWQgb25lIHZhcmlhYmxlIGJpbmRpbmdVbmV4cGVjdGVkIGluaXRpYWxpemVyIGluIGZvciBpbi9vZiBsb29wR2VuZXJhdG9yIG9yIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZEZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZCBpbiBzdHJpY3QgbW9kZSd5aWVsZCcgY2Fubm90IGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2l0aGluIGdlbmVyYXRvcmBhd2FpdGAgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIuZm9yIGF3YWl0IHN5bnRheCBpcyB2YWxpZCBvbmx5IGZvciBmb3Itb2Ygc3RhdGVtZW50YXdhaXQgaXNuJ3QgYWxsb3dlZCBpbiBub24tYXN5bmMgZnVuY3Rpb25VbnRlcm1pbmF0ZWQgSlNYIGNvbnRlbnRzSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb25KU1ggdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBhbiBleHByZXNzaW9uIG9yIGEgcXVvdGVkIEpTWCB0ZXh0RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDw+RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDwAAAD5XiYALAAAAMsAJwABAAAATGVhZGluZyBkZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBkZWNsYXJhdGlvblVzaW5nIHRoZSBleHBvcnQga2V5d29yZCBiZXR3ZWVuIGEgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIGBleHBvcnQgQGRlYyBjbGFzc2AgaW5zdGVhZC5BIHJlcXVpcmVkIGVsZW1lbnQgY2Fubm90IGZvbGxvdyBhbiBvcHRpb25hbCBlbGVtZW50LlR5cGVzY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IG11c3QgYmUgYW4gaWRlbnRpZmllciBvciBhc3NpZ25tZW50IHBhdHRlcm5VbmV4cGVjdGVkIHNwYWNlIGJldHdlZW4gIyBhbmQgaWRlbnRpZmllckNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFzeW5jIGZ1bmN0aW9uQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBub24tc3RhdGljIGZpZWxkIG5hbWVkICdjb25zdHJ1Y3RvcidDbGFzc2VzIGNhbid0IGhhdmUgYSBwcml2YXRlIGZpZWxkIG5hbWVkICcjY29uc3RydWN0b3InLicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllcgAAAAFZJgABAAAAImEmADMAAABDbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YCBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGBmcm9tYCBjbGF1c2UAAOD5JgABAAAANGMmACYAAABgLi4uYCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgaW4gZGVjbGFyYXRpb24gY29udGV4dHNBIG51bWVyaWMgc2VwYXJhdG9yIGlzIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIHR3byBkaWdpdHNBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGltcG9ydGVkIGJpbmRpbmcuCi0gRGlkIHlvdSBtZWFuIGBpbXBvcnQgeyAiIiBhcyBmb28gfWA/AOFjJgBSAAAAM2QmAAwAAABBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBgZnJvbWAuJ2NvbnN0JyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZER1cGxpY2F0ZWQgcmVndWxhciBleHByZXNzaW9uIGZsYWcgJycuvmQmACQAAADiZCYAAgAAAFVua25vd24gcmVndWxhciBleHByZXNzaW9uIGZsYWdzLkV4cGVjdGVkIGFuIGlkZW50aWZpZXJFeHBlY3RlZCBhIHNlbWljb2xvblRyYWlsaW5nIGNvbW1hIGlzIG5vdCBhbGxvd2VkQSByZXN0IHBhcmFtZXRlciBtdXN0IGJlIGxhc3QgaW4gYSBwYXJhbWV0ZXIgbGlzdFBhcmFtZXRlciBjYW5ub3QgaGF2ZSBxdWVzdGlvbiBtYXJrIGFuZCBpbml0aWFsaXplcicgbW9kaWZpZXIgbXVzdCBwcmVjZWRlICcnIG1vZGlmaWVyLgFZJgABAAAAwGUmABkAAADZZSYACwAAACcgbW9kaWZpZXIgYWxyZWFkeSBzZWVuLgFZJgABAAAA/GUmABgAAABgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlcicgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uAAAAAVkmAAEAAACgZyYANQAAAFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb24nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJwAAAAFZJgABAAAAEW0mACAAAADZZSYACwAAAEFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5BYnN0cmFjdCBtZXRob2QgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24uQWJzdHJhY3QgcHJvcGVydHkgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIAAAABWSYAAQAAAOFtJgAsAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcwAAAVkmAAEAAAAgbiYAUgAAACcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGNsYXNzAAAAAVkmAAEAAACEbiYATQAAAFRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUeXBlc2NyaXB0IG5vbi1udWxsIGFzc2VydGlvbiBvcGVyYXRvciBpcyBub3QgYWxsb3dlZCB3aXRoICcAv3MmADwAAAABWSYAAQAAAFRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIFVzZSBhbiBgYXNgIGV4cHJlc3Npb24gaW5zdGVhZC5UaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBBZGQgYSB0cmFpbGluZyBjb21tYSwgYXMgaW4gYDxULD4oKSA9PiAuLi5gLlRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcGFydCBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudHByZXZpb3VzIGRlZmF1bHQgY2FzZSBpcyBkZWNsYXJlZCBhdCBoZXJlRW9mRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkVXNpbmdEZWNsTm90QWxsb3dlZEZvckZvckluTG9vcFVzaW5nRGVjbE5vdEVuYWJsZWRJbnZhbGlkTmFtZUluVXNpbmdEZWNsSW5pdFJlcXVpcmVkRm9yVXNpbmdEZWNsUHJpdmF0ZU5hbWVJbkludGVyZmFjZUludmFsaWRTdXBlckNhbGxJbnZhbGlkU3VwZXJJbnZhbGlkU3VwZXJQcml2YXRlTmFtZUludmFsaWROZXdUYXJnZXRJbnZhbGlkSW1wb3J0QXJyb3dOb3RBbGxvd2VkRXhwb3J0Tm90QWxsb3dlZEdldHRlclNldHRlckNhbm5vdEJlUmVhZG9ubHlHZXR0ZXJTZXR0ZXJDYW5ub3RCZU9wdGlvbmFsR2V0dGVyUGFyYW1TZXR0ZXJQYXJhbVRvcExldmVsQXdhaXRJblNjcmlwdExlZ2FjeURlY2ltYWxMZWdhY3lPY3RhbEludmFsaWRJZGVudENoYXJFeHBlY3RlZERpZ2l0cmFkaXhTZXR0ZXJQYXJhbVJlcXVpcmVkUmVzdFBhdEluU2V0dGVyVW50ZXJtaW5hdGVkQmxvY2tDb21tZW50VW50ZXJtaW5hdGVkU3RyTGl0RXhwZWN0ZWRVbmljb2RlRXNjYXBlRXNjYXBlSW5SZXNlcnZlZFdvcmR3b3JkVW50ZXJtaW5hdGVkUmVnRXhwVW50ZXJtaW5hdGVkVHBsSWRlbnRBZnRlck51bVVuZXhwZWN0ZWRDaGFyY0ludmFsaWRTdHJFc2NhcGVJbnZhbGlkVW5pY29kZUVzY2FwZUJhZENoYXJhY3RlckVzY2FwZVNlcXVlbmNlZXhwZWN0ZWROdW1MaXRUZXJtaW5hdGVkV2l0aEV4cExlZ2FjeUNvbW1lbnRJbk1vZHVsZUludmFsaWRJZGVudEluU3RyaWN0SW52YWxpZElkZW50SW5Bc3luY0V2YWxBbmRBcmd1bWVudHNJblN0cmljdEFyZ3VtZW50c0luQ2xhc3NGaWVsZElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmVVbmFyeUluRXhwbGVmdF9zcGFuSGFzaExpbmVCcmVha0luVGhyb3dMaW5lQnJlYWtCZWZvcmVBcnJvd1VuZXhwZWN0ZWRnb3RVbmV4cGVjdGVkVG9rZW5XaXRoU3VnZ2VzdGlvbnNjYW5kaWRhdGVfbGlzdFJlc2VydmVkV29yZEluSW1wb3J0QXNzaWduUHJvcGVydHlFeHBlY3RlZEV4cGVjdGVkU2VtaUZvckV4cHJTdG10QXdhaXRTdGFyUmVzZXJ2ZWRXb3JkSW5PYmpTaG9ydGhhbmRPclBhdE51bGxpc2hDb2FsZXNjaW5nV2l0aExvZ2ljYWxPcE11bHRpcGxlRGVmYXVsdHByZXZpb3VzQ29tbWFBZnRlclJlc3RFbGVtZW50Tm9uTGFzdFJlc3RQYXJhbVNwcmVhZEluUGFyZW5FeHByRW1wdHlQYXJlbkV4cHJJbnZhbGlkUGF0SW52YWxpZEV4cHJOb3RTaW1wbGVBc3NpZ25JbnZhbGlkQXNzaWduVGFyZ2V0RXhwZWN0ZWRJZGVudEV4cGVjdGVkU2VtaUR1cGxpY2F0ZUxhYmVsQXN5bmNHZW5lcmF0b3JOb25Ub3BMZXZlbEltcG9ydEV4cG9ydEltcG9ydEV4cG9ydEluU2NyaXB0SW1wb3J0TWV0YUluU2NyaXB0UGF0VmFyV2l0aG91dEluaXRXaXRoSW5TdHJpY3RSZXR1cm5Ob3RBbGxvd2VkVG9vTWFueVZhckluRm9ySW5IZWFkVmFySW5pdGlhbGl6ZXJJbkZvckluSGVhZExhYmVsbGVkR2VuZXJhdG9yT3JBc3luY0xhYmVsbGVkRnVuY3Rpb25JblN0cmljdFlpZWxkUGFyYW1JbkdlbkF3YWl0UGFyYW1JbkFzeW5jQXdhaXRGb3JTdG10QXdhaXRJbkZ1bmN0aW9uVW50ZXJtaW5hdGVkSlNYQ29udGVudHNFbXB0eUpTWEF0dHJJbnZhbGlkSlNYVmFsdWVKU1hFeHBlY3RlZENsb3NpbmdUYWdGb3JMdEd0SlNYRXhwZWN0ZWRDbG9zaW5nVGFnSW52YWxpZExlYWRpbmdEZWNvcmF0b3JEZWNvcmF0b3JPbkV4cG9ydFRzUmVxdWlyZWRBZnRlck9wdGlvbmFsVHNJbnZhbGlkUGFyYW1Qcm9wUGF0U3BhY2VCZXR3ZWVuSGFzaEFuZElkZW50QXN5bmNDb25zdHJ1Y3RvclByb3BlcnR5TmFtZWRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvclByaXZhdGVOYW1lTW9kaWZpZXJDb25zdHJ1Y3RvckFjY2Vzc29yUmVhZE9ubHlNZXRob2RHZW5lcmF0b3JDb25zdHJ1Y3RvckR1cGxpY2F0ZUNvbnN0cnVjdG9yVHNCaW5kaW5nUGF0Q2Fubm90QmVPcHRpb25hbFN1cGVyQ2FsbE9wdGlvbmFsT3B0Q2hhaW5DYW5ub3RGb2xsb3dDb25zdHJ1Y3RvckNhbGxUYWdnZWRUcGxJbk9wdENoYWluVHJhaWxpbmdDb21tYUluc2lkZUltcG9ydEV4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRTMjcwM1RTNDExMlRTODAzOFRTMTgwMTBUU1R5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ25Uc05vbk51bGxBc3NlcnRpb25Ob3RBbGxvd2VkV2l0aExhYmVsaW5uZXJub3RlUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AUAAOEFAADgBQAA4AUAAOEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAOIFAADiBQAA4gUAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL2xleGVyL21vZC5yc2ZhaWxlZCB0byBwYXJzZSBmbG9hdCBsaXRlcmFsAICEJgByAAAAEAMAABkAAACAhCYAcgAAAK4CAABWAAAAgIQmAHIAAACpBwAAIAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIQmAHIAAAD8BwAAKgAAAJbxJgABAAAAuA8nAAEAAACAhCYAcgAAANADAAAlAAAAgIQmAHIAAADRAwAANQAAADIgaGV4IGNoYXJhY3RlcnOAhCYAcgAAAO4DAAAlAAAAgIQmAHIAAABeAwAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIQmAHIAAAAWAQAANAAAAICEJgByAAAAEwEAADQAAACAhCYAcgAAAPgAAAAmAAAAgIQmAHIAAAA2AQAAFgAAAICEJgByAAAAMgEAACwAAAB8fHx8fCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIQmAHIAAABgAQAAKgAAAICEJgByAAAAlwEAACkAAACAhCYAcgAAAKMBAAAmAAAAgIQmAHIAAACfAQAAPAAAAICEJgByAAAAZQQAABkAAAA0IGhleCBjaGFyYWN0ZXJzMS02IGhleCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSAwIHRvIDEwRkZGRi4xLTYgaGV4IGNoYXJhY3RlcnMAAICEJgByAAAAtgQAACMAAACAhCYAcgAAAKoEAAAjAAAAgIQmAHIAAACwBAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQAAAAAAAAAAAAABAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAhCYAcgAAAHgDAAA+AAAAAAAAAAEAAAABAAAA4wUAAFBhcnNlRmxvYXRFcnJvci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL2xleGVyL2NvbW1lbnRzX2J1ZmZlci5ycwBvjCYAeAAAACcAAAAXAAAAb4wmAHgAAAAsAAAAHgAAAG+MJgB4AAAAMwAAABsAAACSCycAbgAAAIkAAAAVAAAAkgsnAG4AAACRAAAAHAAAAJILJwBuAAAADQEAACsAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBgdG9rZW5fdmFsdWVgIHNob3VsZCBiZSBhIHdvcmQsIGJ1dCBnb3Q6IABIjSYAUwAAAJILJwBuAAAAKgEAAA0AAABgeyc+J31gYCZndDtgYHsnfSd9YGAmcmJyYWNlO2AvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9wYXJzZXItMjUuMC4wL3NyYy9sZXhlci9tb2QucnMAANKNJgBsAAAATQAAABUAAAA9PT09PDw8PDwgPj4+PiAA0o0mAGwAAAAoAQAAFgAAANKNJgBsAAAAnAEAAB4AAAA8c3RyaW5nIGxpdGVyYWw+PG51bWJlciBsaXRlcmFsPjxiaWdpbnQgbGl0ZXJhbD48cmVnZXhwIGxpdGVyYWw+PHRlbXBsYXRlIGxpdGVyYWw+PHRlbXBsYXRlIGhlYWQgYC4uLiR7ID48dGVtcGxhdGUgbWlkZGxlIC4uLiR7ID48dGVtcGxhdGUgdGFpbCBgID48anN4IG5hbWU+PGpzeCB0ZXh0PjxpZGVudGlmaWVyPjxlcnJvcj5qc3ggdGFnIHN0YXJ0anN4IHRhZyBlbmRzdHJpbmcgbGl0ZXJhbCAoLCBSjyYAEAAAAGKPJgACAAAAXIInAAEAAAACAAAAAAAAAAIAAAAAAAAAAAAAACAAgODsFCcAbgAAACMEAAAVAAAAbnVtZXJpYyBsaXRlcmFsICgAAACkjyYAEQAAAGKPJgACAAAAXIInAAEAAADsFCcAbgAAACkEAAAVAAAAYmlnaW50IGxpdGVyYWwgKOCPJgAQAAAAYo8mAAIAAABcgicAAQAAAOwUJwBuAAAALwQAABUAAAByZWdleHAgbGl0ZXJhbCAoGJAmABAAAABijyYAAgAAAFyCJwABAAAA7BQnAG4AAAA1BAAAFQAAAHRlbXBsYXRlIHRva2VuIChQkCYAEAAAAFyCJwABAAAA7BQnAG4AAAA7BAAAFQAAAOwUJwBuAAAAVgQAABUAAABqc3ggbmFtZSAoAACQkCYACgAAAFyCJwABAAAA7BQnAG4AAABBBAAAFQAAAGpzeCB0ZXh0ICgAALyQJgAKAAAAXIInAAEAAADsFCcAbgAAAB0EAAAVAAAA7BQnAG4AAABNBAAAFQAAAGluc3RhbmNlT2Z0eXBlT2Y8bGV4aW5nIGVycm9yOiAACJEmAA8AAADLACcAAQAAAOwUJwBuAAAARwQAABUAAAA8ZW9mPgAAAOwUJwBuAAAAMAUAABUAAABXb3JkVGVtcGxhdGXwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADxBQAA8gUAAPMFAAD0BQAA9QUAAPYFAADyBQAA9wUAAPgFAAD5BQAA+gUAAPsFAAD8BQAA/QUAAP4FAAD/BQAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAQYAAAIGAAADBgAABAYAAAUGAAAGBgAABwYAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAACAYAAPQFAAAJBgAACgYAAPQFAAALBgAADAYAAA0GAAAOBgAADwYAABAGAAARBgAAEgYAAPQFAAATBgAA9AUAABQGAAAVBgAAFgYAABcGAAAYBgAAGQYAAPQFAAAaBgAAGwYAABwGAAAdBgAAHgYAAB8GAAD0BQAAIAYAAPQFAAAhBgAAIgYAACMGAAAkBgAA8AUAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAcGFja2FnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAABPa0Vyci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zeW50YXhfcG9zL2h5Z2llbmUucnMAAAAFliYAcAAAALcBAAA2AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI4LjAuMS9zcmMvaGVscGVycy9tb2QucnMAiJYmAHcAAAD7AAAAAQAAAF9hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcl9hcnJheV9saWtlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2FycmF5X2xpa2VfdG9fYXJyYXlfYXJyYXlfd2l0aF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRoX2hvbGVzX2FycmF5X3dpdGhvdXRfaG9sZXNAc3djL2hlbHBlcnMvXy9fYXJyYXlfd2l0aG91dF9ob2xlc19hc3NlcnRfdGhpc19pbml0aWFsaXplZEBzd2MvaGVscGVycy9fL19hc3NlcnRfdGhpc19pbml0aWFsaXplZF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfZ2VuZXJhdG9yX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZUBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfZGVsZWdhdGVfYXN5bmNfaXRlcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfaXRlcmF0b3JfYXN5bmNfdG9fZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX3RvX2dlbmVyYXRvcl9hd2FpdF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXdhaXRfYXN5bmNfZ2VuZXJhdG9yX2F3YWl0X3ZhbHVlQHN3Yy9oZWxwZXJzL18vX2F3YWl0X3ZhbHVlX2NhbGxfc3VwZXJAc3djL2hlbHBlcnMvXy9fY2FsbF9zdXBlcl9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25Ac3djL2hlbHBlcnMvXy9fY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZV9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZV9jbGFzc19jYWxsX2NoZWNrQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NhbGxfY2hlY2tfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfbmFtZV90ZHpfZXJyb3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfbmFtZV90ZHpfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdF9jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5X2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0X2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9pbml0X2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZV9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9fY29uc3RydWN0X2NyZWF0ZV9jbGFzc0Bzd2MvaGVscGVycy9fL19jcmVhdGVfY2xhc3NfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fZGVjb3JhdGVfZGVmYXVsdHNAc3djL2hlbHBlcnMvXy9fZGVmYXVsdHNfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19kZWZpbmVfcHJvcGVydHlfZXhwb3J0X3N0YXJAc3djL2hlbHBlcnMvXy9fZXhwb3J0X3N0YXJfZXh0ZW5kc0Bzd2MvaGVscGVycy9fL19leHRlbmRzX2dldEBzd2MvaGVscGVycy9fL19nZXRfZ2V0X3Byb3RvdHlwZV9vZkBzd2MvaGVscGVycy9fL19nZXRfcHJvdG90eXBlX29mX2luaGVyaXRzQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2luaGVyaXRzX2xvb3NlQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2xvb3NlX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlfaW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJAc3djL2hlbHBlcnMvXy9faW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJfaW5zdGFuY2VvZkBzd2MvaGVscGVycy9fL19pbnN0YW5jZW9mX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0QHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0X2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZEBzd2MvaGVscGVycy9fL19pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRfaXNfbmF0aXZlX2Z1bmN0aW9uQHN3Yy9oZWxwZXJzL18vX2lzX25hdGl2ZV9mdW5jdGlvbl9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9pdGVyYWJsZV90b19hcnJheV9saW1pdEBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZV9qc3hAc3djL2hlbHBlcnMvXy9fanN4X25ld19hcnJvd19jaGVja0Bzd2MvaGVscGVycy9fL19uZXdfYXJyb3dfY2hlY2tfbm9uX2l0ZXJhYmxlX3Jlc3RAc3djL2hlbHBlcnMvXy9fbm9uX2l0ZXJhYmxlX3Jlc3Rfbm9uX2l0ZXJhYmxlX3NwcmVhZEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfc3ByZWFkX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5QHN3Yy9oZWxwZXJzL18vX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5X29iamVjdF9zcHJlYWRAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9vYmplY3Rfc3ByZWFkX3Byb3BzQHN3Yy9oZWxwZXJzL18vX29iamVjdF9zcHJlYWRfcHJvcHNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZV9vdmVybG9hZF95aWVsZEBzd2MvaGVscGVycy9fL19vdmVybG9hZF95aWVsZF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5Ac3djL2hlbHBlcnMvXy9fcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuX3JlYWRfb25seV9lcnJvckBzd2MvaGVscGVycy9fL19yZWFkX29ubHlfZXJyb3Jfc2V0QHN3Yy9oZWxwZXJzL18vX3NldF9zZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3NldF9wcm90b3R5cGVfb2Zfc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dEBzd2MvaGVscGVycy9fL19za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0X3NsaWNlZF90b19hcnJheUBzd2MvaGVscGVycy9fL19zbGljZWRfdG9fYXJyYXlfc2xpY2VkX3RvX2FycmF5X2xvb3NlQHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9sb29zZV9zdXBlcl9wcm9wX2Jhc2VAc3djL2hlbHBlcnMvXy9fc3VwZXJfcHJvcF9iYXNlX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlX3Rocm93QHN3Yy9oZWxwZXJzL18vX3Rocm93X3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3RvX2FycmF5X3RvX2NvbnN1bWFibGVfYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fY29uc3VtYWJsZV9hcnJheV90b19wcmltaXRpdmVAc3djL2hlbHBlcnMvXy9fdG9fcHJpbWl0aXZlX3RvX3Byb3BlcnR5X2tleUBzd2MvaGVscGVycy9fL190b19wcm9wZXJ0eV9rZXlfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX3VwZGF0ZV90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3R5cGVfb2ZfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlfd3JhcF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fd3JhcF9hc3luY19nZW5lcmF0b3Jfd3JhcF9uYXRpdmVfc3VwZXJAc3djL2hlbHBlcnMvXy9fd3JhcF9uYXRpdmVfc3VwZXJfd3JpdGVfb25seV9lcnJvckBzd2MvaGVscGVycy9fL193cml0ZV9vbmx5X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0X2NyZWF0ZV9zdXBlckBzd2MvaGVscGVycy9fL19jcmVhdGVfc3VwZXJfY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VfdHNfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fdHNfZGVjb3JhdGVfdHNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3RzX2dlbmVyYXRvcl90c19tZXRhZGF0YUBzd2MvaGVscGVycy9fL190c19tZXRhZGF0YV90c19wYXJhbUBzd2MvaGVscGVycy9fL190c19wYXJhbV90c192YWx1ZXNAc3djL2hlbHBlcnMvXy9fdHNfdmFsdWVzX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlQHN3Yy9oZWxwZXJzL18vX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzQHN3Yy9oZWxwZXJzL18vX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbkBzd2MvaGVscGVycy9fL190c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25fYXBwbHlfZGVjc18yMjAzX3JAc3djL2hlbHBlcnMvXy9fYXBwbHlfZGVjc18yMjAzX3JfaWRlbnRpdHlAc3djL2hlbHBlcnMvXy9faWRlbnRpdHlfZGlzcG9zZUBzd2MvaGVscGVycy9fL19kaXNwb3NlX3VzaW5nQHN3Yy9oZWxwZXJzL18vX3VzaW5nX3VzaW5nX2N0eEBzd2MvaGVscGVycy9fL191c2luZ19jdHhhcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcmFycmF5X2xpa2VfdG9fYXJyYXlhcnJheV93aXRoX2hvbGVzYXJyYXlfd2l0aG91dF9ob2xlc2Fzc2VydF90aGlzX2luaXRpYWxpemVkYXN5bmNfZ2VuZXJhdG9yYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlYXN5bmNfaXRlcmF0b3Jhc3luY190b19nZW5lcmF0b3Jhd2FpdF9hc3luY19nZW5lcmF0b3Jhd2FpdF92YWx1ZWNhbGxfc3VwZXJjaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXRjbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlY2xhc3NfY2FsbF9jaGVja2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19uYW1lX3Rkel9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZ2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0Y2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXljbGFzc19wcml2YXRlX2ZpZWxkX3NldGNsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0Y2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdGNsYXNzX3ByaXZhdGVfbWV0aG9kX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfZ2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVjb25zdHJ1Y3RjcmVhdGVfY2xhc3NkZWNvcmF0ZWRlZmF1bHRzZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc2RlZmluZV9wcm9wZXJ0eWV4cG9ydF9zdGFyZ2V0X3Byb3RvdHlwZV9vZmluaGVyaXRzaW5oZXJpdHNfbG9vc2Vpbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlpbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcmludGVyb3BfcmVxdWlyZV9kZWZhdWx0aW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkaXNfbmF0aXZlX2Z1bmN0aW9uaXRlcmFibGVfdG9fYXJyYXlpdGVyYWJsZV90b19hcnJheV9saW1pdGl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlanN4bmV3X2Fycm93X2NoZWNrbm9uX2l0ZXJhYmxlX3Jlc3Rub25faXRlcmFibGVfc3ByZWFkb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlvYmplY3Rfc3ByZWFkb2JqZWN0X3NwcmVhZF9wcm9wc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3Nlb3ZlcmxvYWRfeWllbGRwb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5yZWFkX29ubHlfZXJyb3JzZXRfcHJvdG90eXBlX29mc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dHNsaWNlZF90b19hcnJheXNsaWNlZF90b19hcnJheV9sb29zZXN1cGVyX3Byb3BfYmFzZXRhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2V0b19hcnJheXRvX2NvbnN1bWFibGVfYXJyYXl0b19wcmltaXRpdmV0b19wcm9wZXJ0eV9rZXl0eXBlX29mdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXl3cmFwX2FzeW5jX2dlbmVyYXRvcndyYXBfbmF0aXZlX3N1cGVyd3JpdGVfb25seV9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3Npc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RjcmVhdGVfc3VwZXJjcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZXRzX2RlY29yYXRldHNfZ2VuZXJhdG9ydHNfbWV0YWRhdGF0c19wYXJhbXRzX3ZhbHVlc3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNldHNfZGlzcG9zZV9yZXNvdXJjZXN0c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25hcHBseV9kZWNzXzIyMDNfcmlkZW50aXR5ZGlzcG9zZXVzaW5nX2N0eEBzd2MvaGVscGVycy9fL18AAADZtSYAEAAAACYGAABNYXJrZXIgcHJvdmlkZWQgdG8gcmVzb2x2ZXIgc2hvdWxkIG5vdCBiZSB0aGUgcm9vdCBtYXJrAPi1JgA3AAAArL4mAHgAAACHAAAABQAAAFN1cGVyRm5FeHByQmluRXhwck5ld0V4cHJjYWxsZWVhcmdzT3B0Q2FsbFNlcUV4cHJBcnJheUxpdENhbGxFeHByQ29uZEV4cHJUaGlzRXhwcgAAACcGAAAMAAAABAAAACgGAAApBgAABAAAAAQAAAAqBgAAAAAAAAEAAAABAAAAuQIAACsGAAAEAAAABAAAAFMDAAA0ziYABAAAAKjMJgAEAAAAlMsmAAYAAACayyYABAAAAPzFJgAIAAAA8MUmAAwAAAALxSYACwAAAATGJgALAAAAQXJyb3dFeHByQXdhaXRFeHByQ2xhc3NFeHByUGFyZW5FeHBydGFndHBsVW5hcnlFeHByWWllbGRFeHByZGVsZWdhdGVBc3NpZ25FeHByTWVtYmVyRXhwclRwbEVsZW1lbnR0YWlsY29va2VkVXBkYXRlRXhwcnByZWZpeFNpbXBsZUV4cHJPclNwcmVhZHNwcmVhZE1ldGFQcm9wRXhwck9wdENoYWluRXhwcmJhc2VTcHJlYWRQcm9wU3VwZXJQcm9wRXhwcmNhbGxlZCBleHBlY3Qgb24g47cmABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9hc3QtMTYuMC4wL3NyYy9wYXQucnMA/LcmAGMAAAANAAAAFAAAACwGAAAEAAAABAAAAHsCAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjguMC4xL3NyYy9maXhlci5ycwAAAIC4JgBxAAAAxgAAAEAAAACAuCYAcQAAAG8DAAAjAAAAgLgmAHEAAAB/AwAAMQAAAIC4JgBxAAAAiwMAACkAAADjHScASgAAAKgBAAAfAAAAy9UmAGUAAABsBgAAFAAAAC0GAAAEAAAABAAAAHsCAABUc0FzRXhwci4GAAAMAAAABAAAADsDAABUc0ZuVHlwZWxpdHR5cGVfbmFtZWVsZW1fdHlwZXR5cGVfcGFyYW1Uc0VudGl0eU5hbWVUc0V4dGVybmFsTW9kdWxlUmVmAAAvBgAADAAAAAQAAAAkAwAAAAAAAAEAAAABAAAAMAYAAAAAAAABAAAAAQAAALkCAAAAAAAABAAAAAQAAAAxBgAANM4mAAQAAADNySYACgAAANfJJgANAAAA+skmAAsAAAA0HCcACAAAAN6/JgAFAAAAZWxlbV90eXBlcwAAMgYAABgAAAAIAAAAtAIAADMGAAAEAAAABAAAADQGAAAAAAAABAAAAAQAAAA1BgAAaXNfaW5pc19vdXRjb25zdHJhaW50AAAANM4mAAQAAABVziYABAAAAHC6JgAFAAAAdbomAAYAAAC+xyYACAAAAHu6JgAKAAAABAMnAAcAAABUc1R5cGVQYXJhbWV4cHJfbmFtZVRzVW5pb25UeXBldHlwZXNUc0VudW1NZW1iZXJxdWFsaWZpZXJhdHRyaWJ1dGVzAAAAAAABAAAAAQAAADYGAAA3BgAAMAAAAAgAAAA4BgAAbmFtZV90eXBlAAAANM4mAAQAAAA0HCcACAAAAJm5JgAKAAAAJLsmAAkAAACszCYACAAAAMjMJgAIAAAAVHNUcGxMaXRUeXBlUHJvdGVjdGVkVHJ1ZVBsdXNNaW51c1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzVHVwbGVFbGVtZW50dHlvcFRzSW50ZXJmYWNlQm9keVRzU2F0aXNmaWVzRXhwcnBhcmFtX25hbWUAADkGAAAEAAAABAAAADwDAABjaGVja190eXBlZXh0ZW5kc190eXBldHJ1ZV90eXBlZmFsc2VfdHlwZVRzQ29uc3RydWN0b3JUeXBlY29tcHV0ZWRUc0FueUtleXdvcmRUc1Vua25vd25LZXl3b3JkVHNOdW1iZXJLZXl3b3JkVHNPYmplY3RLZXl3b3JkVHNCb29sZWFuS2V5d29yZFRzQmlnSW50S2V5d29yZFRzU3RyaW5nS2V5d29yZFRzU3ltYm9sS2V5d29yZFRzVm9pZEtleXdvcmRUc1VuZGVmaW5lZEtleXdvcmRUc051bGxLZXl3b3JkVHNOZXZlcktleXdvcmRUc0ludHJpbnNpY0tleXdvcmQAAAAAAAAABAAAAAQAAABQAwAANM4mAAQAAAAdzSYAAwAAAIa8JgAIAAAArMwmAAgAAACUyyYABgAAAMjMJgAIAAAAC8UmAAsAAABUc0V4cHJXaXRoVHlwZUFyZ3NUc0ludGVyc2VjdGlvblR5cGVUc0ltcG9ydENhbGxPcHRpb25zb2JqX3R5cGVpbmRleF90eXBlAAAANM4mAAQAAAA0HCcACAAAAB3NJgADAAAAhrwmAAgAAACszCYACAAAAMjMJgAIAAAAVHNOYW1lc3BhY2VFeHBvcnREZWNsRm5EZWNsaWRlbnRDbGFzc0RlY2xBc3NpZ25Qcm9wR2V0dGVyUHJvcE1ldGhvZFByb3BTZXR0ZXJQcm9wdGhpc19wYXJhbUtleVZhbHVlUHJvcFZhckRlY2xhcmF0b3JDb21wdXRlZFByb3BOYW1lVM0mAGMAAAA7AAAAIwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3Jlc29sdmVyL21vZC5yc6y+JgB4AAAA1AYAADYAAABJZlN0bXR0ZXN0Y29uc2FsdFBhdEZvclN0bXRpbml0dXBkYXRlRXhwclN0bXRXaXRoU3RtdEJyZWFrU3RtdGxhYmVsRW1wdHlTdG10Rm9ySW5TdG10Rm9yT2ZTdG10VGhyb3dTdG10V2hpbGVTdG10UmV0dXJuU3RtdFN3aXRjaENhc2VTd2l0Y2hTdG10ZGlzY3JpbWluYW50Y2FzZXNDYXRjaENsYXVzZXBhcmFtRG9XaGlsZVN0bXRMYWJlbGVkU3RtdE1vZHVsZURlY2xTdG10Q29udGludWVTdG10RGVidWdnZXJTdG10L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI4LjAuMS9zcmMvcmVuYW1lL2FuYWx5emVyL3JldmVyc2VfbWFwLnJzAAAfwCYAhwAAAA4AAAAsAAAAUGFyYW1wYXRUc1BhcmFtUHJvcC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3JlbmFtZS9hbmFseXplci9tb2QucnMAAMvAJgB/AAAAKQAAABsAAADLwCYAfwAAADQAAAA3AAAAy8AmAH8AAACEAAAAHQAAADoGAAAEAAAABAAAAEIDAAAAAAAAAQAAAAEAAAC5AgAARXhwb3J0QWxsc3JjdHlwZV9vbmx5RXhwb3J0RGVjbGRlY2wAOwYAAAwAAAAEAAAAPAYAAD0GAAAEAAAABAAAAD4GAAAAAAAABAAAAAQAAADNAgAAc3BlY2lmaWVyc3BoYXNlADTOJgAEAAAA8MEmAAoAAAClwSYAAwAAAKjBJgAJAAAAQgInAAQAAAD6wSYABQAAAEltcG9ydERlY2xJbXBvcnRFeHBvcnROYW1lZEV4cG9ydERlZmF1bHREZWNsRXhwb3J0RGVmYXVsdEV4cHJUc0ltcG9ydEVxdWFsc1RzRXhwb3J0QXNzaWdubWVudFRzTmFtZXNwYWNlRXhwb3J0RXZhbHVhdGlvblNvdXJjZURlZmVyTmFtZWRFeHBvcnROYW1lc3BhY2VEZWZhdWx0TmFtZWRFeHBvcnROYW1lZFNwZWNpZmllcm9yaWdleHBvcnRlZEltcG9ydE5hbWVkU3BlY2lmaWVybG9jYWxpbXBvcnRlZEltcG9ydFN0YXJBc1NwZWNpZmllckV4cG9ydERlZmF1bHRTcGVjaWZpZXJJbXBvcnREZWZhdWx0U3BlY2lmaWVyRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyVHBsZXhwcnNxdWFzaXNUaGlzVW5hcnlVcGRhdGVCaW5NZW1iZXJTdXBlclByb3BDb25kQ2FsbE5ld1NlcVRhZ2dlZFRwbEFycm93WWllbGRNZXRhUHJvcEF3YWl0UGFyZW5KU1hNZW1iZXJKU1hFbXB0eVRzVHlwZUFzc2VydGlvblRzQ29uc3RBc3NlcnRpb25Uc05vbk51bGxUc0FzVHNJbnN0YW50aWF0aW9uVHNTYXRpc2ZpZXNPcHRDaGFpblNob3J0aGFuZEJsb2NrRGVidWdnZXJXaXRoUmV0dXJuTGFiZWxlZEJyZWFrQ29udGludWVJZlN3aXRjaFRocm93VHJ5V2hpbGVEb1doaWxlRm9yRm9ySW5Gb3JPZkRlY2wALwYAAAwAAAAEAAAAJAMAAD8GAAAMAAAABAAAAEAGAABBBgAABAAAAAQAAADUAgAAAAAAAAEAAAABAAAAuQIAACsGAAAEAAAABAAAAFMDAABCBgAABAAAAAQAAAB8AgAAAAAAAAQAAAAEAAAAQwYAAHN1cGVyX2NsYXNzdHlwZV9wYXJhbXNzdXBlcl90eXBlX3BhcmFtcwA0ziYABAAAAKjMJgAEAAAAzckmAAoAAACayyYABAAAAADFJgALAAAA5MkmAAsAAAALxSYACwAAABbFJgARAAAAaPImAAoAAABWYXJEZWNsZGVjbHNUcnlTdG10YmxvY2toYW5kbGVyZmluYWxpemVyVXNpbmdEZWNsaXNfYXdhaXRPYmplY3RMaXRCbG9ja1N0bXRzdG10c0QGAAAMAAAABAAAAEUGAABGBgAAGAAAAAQAAABHBgAAAAAAAAQAAAAEAAAAtQIAAGlzX2dlbmVyYXRvcmlzX2FzeW5jcmV0dXJuX3R5cGUAlMsmAAYAAADNySYACgAAADTOJgAEAAAAqMwmAAQAAACayyYABAAAAPDFJgAMAAAA/MUmAAgAAAALxSYACwAAAATGJgALAAAARnVuY3Rpb25Uc0tleXdvcmRUeXBlVHNUaGlzVHlwZVRzRm5PckNvbnN0cnVjdG9yVHlwZVRzVHlwZVJlZlRzVHlwZVF1ZXJ5VHNUeXBlTGl0VHNBcnJheVR5cGVUc1R1cGxlVHlwZVRzT3B0aW9uYWxUeXBlVHNSZXN0VHlwZVRzVW5pb25PckludGVyc2VjdGlvblR5cGVUc0NvbmRpdGlvbmFsVHlwZVRzSW5mZXJUeXBlVHNQYXJlbnRoZXNpemVkVHlwZVRzVHlwZU9wZXJhdG9yVHNJbmRleGVkQWNjZXNzVHlwZVRzTWFwcGVkVHlwZVRzTGl0VHlwZVRzVHlwZVByZWRpY2F0ZVRzSW1wb3J0VHlwZVRzVHlwZUFubkpTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3Npbmd0eXBlX2FyZ3MyBgAAGAAAAAgAAAC0AgAAVHNFbnVtRGVjbGlzX2NvbnN0bWVtYmVyc1RzUXVhbGlmaWVkTmFtZUgGAAAgAAAACAAAAO8CAAAAAAAABAAAAAQAAABJBgAANM4mAAQAAACqDCcABwAAANr5JgAGAAAAy/kmAAkAAAA0zSYAAgAAAJrLJgAEAAAAVHNNb2R1bGVEZWNsSgYAAAwAAAAEAAAASwYAAAAAAAAEAAAABAAAAEwGAAA0ziYABAAAADTNJgACAAAAqgwnAAcAAAALxSYACwAAALz5JgAHAAAAmssmAAQAAABUc0ludGVyZmFjZURlY2xUc01vZHVsZUJsb2NrVHNOYW1lc3BhY2VEZWNsVHNUeXBlQWxpYXNEZWNsVHNUeXBlUGFyYW1EZWNsVHNJbXBvcnRFcXVhbHNEZWNsaXNfZXhwb3J0aXNfdHlwZV9vbmx5bW9kdWxlX3JlZlRzVHlwZVBhcmFtSW5zdGFudGlhdGlvbmFyZ3VtZW50cwBUzSYAYwAAADMAAAAPAAAAUHJpdmF0ZVB1YmxpYwAAAAAAAAAIAAAABAAAAAsBAABNBgAAIAAAAAgAAABhAwAATgYAAAQAAAAEAAAA1AIAAE8GAAAEAAAABAAAADwDAAAAAAAAAQAAAAEAAAC5AgAALwYAAAwAAAAEAAAAJAMAAAAAAAABAAAAAQAAADAGAAAAAAAABAAAAAQAAACnAAAAaXNfc3RhdGljZGVjb3JhdG9yc2FjY2Vzc2liaWxpdHlpc19hYnN0cmFjdGlzX29wdGlvbmFsaXNfb3ZlcnJpZGVkZWZpbml0ZQAAADTOJgAEAAAAHc0mAAMAAAA4ziYABQAAAMjMJgAIAAAAxMkmAAkAAADNySYACgAAANfJJgANAAAA5MkmAAsAAADvySYACwAAAPrJJgALAAAANBwnAAgAAACqDCcABwAAAAXKJgAIAAAAQ2xhc3NQcm9wRGVjb3JhdG9yTWV0aG9kR2V0dGVyU2V0dGVyQ29uc3RydWN0b3JQcml2YXRlTWV0aG9kUHJpdmF0ZVByb3BUc0luZGV4U2lnbmF0dXJlRW1wdHlTdGF0aWNCbG9ja0F1dG9BY2Nlc3NvcgBQBgAABAAAAAQAAABRBgAAAAAAAAEAAAABAAAAUgYAAGtpbmQ0ziYABAAAAB3NJgADAAAACwMnAAgAAAAMyyYABAAAAMTJJgAJAAAA18kmAA0AAADkySYACwAAAO/JJgALAAAA+skmAAsAAABDbGFzc01ldGhvZAAAAAAABAAAAAQAAACIAQAAUwYAAAwAAAAEAAAAVAYAAEYGAAAYAAAABAAAAEcGAABwYXJhbXNib2R5AAA0ziYABAAAAKjMJgAEAAAAHc0mAAMAAACUyyYABgAAAJrLJgAEAAAA18kmAA0AAADvySYACwAAAFUGAAAQAAAACAAAAFYGAAA0ziYABAAAAKjMJgAEAAAAHc0mAAMAAAA4ziYABQAAAMjMJgAIAAAAxMkmAAkAAADNySYACgAAANfJJgANAAAA78kmAAsAAAD6ySYACwAAADQcJwAIAAAABcomAAgAAABXBgAAIAAAAAgAAABYBgAANM4mAAQAAAAdzSYAAwAAADjOJgAFAAAAyMwmAAgAAADEySYACQAAAM3JJgAKAAAA18kmAA0AAADkySYACwAAAPrJJgALAAAABcomAAgAAABjdHh0b3B0aW9uYWxSZXN0UGF0ZG90M190b2tlbmFyZ3R5cGVfYW5uQXJyYXlQYXRlbGVtc0Fzc2lnblBhdGxlZnRyaWdodE9iamVjdFBhdHByb3BzQ29tcHV0ZWRQcml2YXRlTmFtZUFzc2lnblBhdFByb3BrZXlLZXlWYWx1ZUJpbmRpbmdJZGVudGlkS2V5VmFsdWVQYXRQcm9waW5kZXggbm90IGZvdW5kL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaW5kZXhtYXAtMi45LjAvc3JjL21hcC9jb3JlLnJzAFTNJgBjAAAASwAAAAoAAABUzSYAYwAAABYCAAANAAAAVM0mAGMAAACIAgAALAAAAFTNJgBjAAAAYAIAACIAAABUzSYAYwAAAE8BAAAWAAAAVM0mAGMAAABbAQAAOAAAAFN0ckJvb2xOdW1CaWdJbnRSZWdleEpTWFRleHRzcGFudmFsdWVyYXdleHBmbGFnc051bWJlckpTWEF0dHJuYW1lSlNYRW1wdHlFeHBySlNYTWVtYmVyRXhwcklkZW50TmFtZXN5bUpTWE5hbWVzcGFjZWROYW1lSlNYRnJhZ21lbnRvcGVuaW5nY2hpbGRyZW5jbG9zaW5nTGl0SlNYRXhwckNvbnRhaW5lckpTWEVsZW1lbnRvYmpwcm9wSlNYU3ByZWFkQ2hpbGRleHByU3ByZWFkRWxlbWVudEpTWENsb3NpbmdFbGVtZW50bnNKU1hDbG9zaW5nRnJhZ21lbnRKU1hPcGVuaW5nRnJhZ21lbnRDbGFzc0ZuVmFyVXNpbmdUc0ludGVyZmFjZVRzVHlwZUFsaWFzVHNFbnVtVHNNb2R1bGUAAABw1iYAewAAAO8AAAAXAAAAcNYmAHsAAAAKAQAAEgAAAHDWJgB7AAAAUgEAACgAAABw1iYAewAAAFMBAAAtAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuIGluc2lkZSBUc1BhcmFtZXRlclByb3BlcnR5AACgzyYAWgAAAHDWJgB7AAAAQQEAACEAAABw1iYAewAAAHABAAASAAAAcNYmAHsAAABDAgAAJwAAAHDWJgB7AAAAQAIAADIAAABw1iYAewAAAEgDAAANAAAAcNYmAHsAAACoAwAAHwAAAHDWJgB7AAAAqQMAAB8AAABw1iYAewAAANEDAAAfAAAAy/UmACoAAABw1iYAewAAANkDAAAdAAAAcNYmAHsAAAD1AwAAIwAAAHDWJgB7AAAAoQMAADEAAABw1iYAewAAAGkEAAAjAAAAcNYmAHsAAAA/BAAAKwAAAHDWJgB7AAAASwQAAFEAAABw1iYAewAAAE4EAAAfAAAAcNYmAHsAAABYBAAAVgAAAHDWJgB7AAAAWgQAAB8AAABleHBvcnRzAHDWJgB7AAAAkAUAACMAAABw1iYAewAAAJQFAAAfAAAAcNYmAHsAAABLBQAAGgAAAHDWJgB7AAAATQUAABoAAABfY3JlYXRlUmVxdWlyZV9fcmVxdWlyZWNyZWF0ZVJlcXVpcmVcBgAAKAAAAAgAAABdBgAAcNYmAHsAAAC0AwAAQAAAAE9ubHkgYW1iaWVudCBtb2R1bGVzIGNhbiB1c2UgcXVvdGVkIG5hbWVzLgAAcNYmAHsAAAD5BQAADgAAAEltcG9ydCBkZWNsYXJhdGlvbnMgaW4gYSBuYW1lc3BhY2UgY2Fubm90IHJlZmVyZW5jZSBhIG1vZHVsZS5FU00tc3R5bGUgbW9kdWxlIGRlY2xhcmF0aW9ucyBhcmUgbm90IHBlcm1pdHRlZCBpbiBhIG5hbWVzcGFjZS5JbXBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBpbXBvcnQgKiBhcyBucyBmcm9tICJtb2QiYCwgYGltcG9ydCB7YX0gZnJvbSAibW9kImAsIGBpbXBvcnQgZCBmcm9tICJtb2QiYCwgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuRXhwb3J0IGFzc2lnbm1lbnQgY2Fubm90IGJlIHVzZWQgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCBtb2R1bGVzLiBDb25zaWRlciB1c2luZyBgZXhwb3J0IGRlZmF1bHRgIG9yIGFub3RoZXIgbW9kdWxlIGZvcm1hdCBpbnN0ZWFkLi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3R5cGVzY3JpcHQucnMAAKbTJgB8AAAAQgAAACwAAACm0yYAfAAAAGgAAAAQAAAAXgYAAAQAAAAEAAAAggEAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3N0cmlwX3R5cGUucnNU1CYAfAAAANUAAAApAAAAXwYAAAwAAAAEAAAAYAYAAGEGAACHBQAAAAAAAAAAAAABAAAAYgYAAE5hTkluZmluaXR5L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTMxLjAuMC9zcmMvdHNfZW51bS5ycxPVJgB5AAAAsAAAABIAAAABAAAAAAAAAAEAAAAAAAAAE9UmAHkAAADaAAAAGgAAAG5vdCBpbXBsZW1lbnRlZC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3V0aWxzLTIyLjAuMC9zcmMvbGliLnJzy9UmAGUAAADxCQAAPgAAAGQGAAAEAAAABAAAAIIBAADL1SYAZQAAAP8JAAA8AAAAy9UmAGUAAADeCQAAJgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3RyYW5zZm9ybS5ycwBw1iYAewAAAMYCAAA4AAAAXwYAAAwAAAAEAAAAYAYAAGEGAACHBQAAAAAAAAAAAAABAAAAYgYAAFN5bWJvbF8AAQAAAAAAAAAq1yYAAQAAAHN1cGVyXwAAPNcmAAYAAAAq1yYAAQAAAGNhcGFjaXR5IG92ZXJmbG93AAAAVNcmABEAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvbW9kLnJzcNcmAEwAAABWCgAAJAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvcHRyL21vZC5ycwDM1yYASwAAAAwCAAABAAAAY29uc3RydWN0b3Igc2hvdWxkIGhhdmUgYSBib2R5L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdXRpbHMtMjIuMC4wL3NyYy9jb25zdHJ1Y3Rvci5ycwBG2CYAbQAAAA4AAAAgAAAAAAAAAAwAAAAEAAAAZQYAAGYGAACgFicATwAAAAoCAAA3AAAAyQMAAAwAAAAEAAAAygMAAMsDAADMAwAAAAAAAAAAAAABAAAAzQMAAGgGAAAsAAAABAAAAGkGAABqBgAAawYAAGwGAABtBgAAbgYAAEQEAABAACcAaAAAAHoCAAAUAAAAQAAnAGgAAACiAgAAPAAAAEAAJwBoAAAAkQIAAD4AAACqGicAXgAAADQAAAAFAAAAbwYAAAwAAAAEAAAAhQUAAHAGAACHBQAAAAAAAAAAAAABAAAAzQMAAG8GAAAMAAAABAAAAIUFAABwBgAAhwUAAAAAAAAAAAAAAQAAAM0DAABodHRwOmh0dHBzOgABAAAAAAAAAJkVJwABAAAAJHNlcmRlX2pzb246OnByaXZhdGU6OlJhd1ZhbHVlAABvBgAADAAAAAQAAACFBQAAowUAAIcFAAAAAAAAAAAAAAEAAADNAwAAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1Jhd1NlY3Rpb25PZmZzZXRsaW5lY29sdW1uUmF3U2VjdGlvbm9mZnNldHVybG1hcEZhY2Vib29rU2NvcGVNYXBwaW5nbmFtZXNtYXBwaW5nc1Jhd1NvdXJjZU1hcHZlcnNpb25maWxlc291cmNlc3NvdXJjZVJvb3Rzb3VyY2VzQ29udGVudHNlY3Rpb25zcmFuZ2VNYXBwaW5nc2lnbm9yZUxpc3R4X2ZhY2Vib29rX29mZnNldHN4X21ldHJvX21vZHVsZV9wYXRoc3hfZmFjZWJvb2tfc291cmNlc2RlYnVnX2lkZGVidWdJZC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC91bnN0YWJsZS9xdWlja3NvcnQucnMAAFnbJgBhAAAAOQAAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2Nfc291cmNlbWFwLTkuMy40L3NyYy9idWlsZGVyLnJzAMzbJgBnAAAAaQAAABoAAADM2yYAZwAAAGoAAAAiAAAAQ2Fubm90IHNldCBzb3VyY2VzIGZvciB0b21ic3RvbmUgc291cmNlIGlkAADM2yYAZwAAAIAAAAAJAAAAzNsmAGcAAACEAAAAHQAAAMzbJgBnAAAABwEAABUAAAB1OC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAAAAstwmAF8AAADGAAAAJwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5ycyTdJgBgAAAAoQEAAC4AAABhc3NlcnRpb24gZmFpbGVkOiBpZHggPCBDQVBBQ0lUWS9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25vZGUucnMAtN0mAFsAAACVAgAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYuaGVpZ2h0IC0gMbTdJgBbAAAArQIAAAkAAAC03SYAWwAAALECAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3JjLmxlbigpID09IGRzdC5sZW4oKbTdJgBbAAAASgcAAAUAAAC03SYAWwAAAMcEAAAjAAAAtN0mAFsAAADLBAAAIwAAALTdJgBbAAAACgUAACQAAABhc3NlcnRpb24gZmFpbGVkOiBlZGdlLmhlaWdodCA9PSBzZWxmLm5vZGUuaGVpZ2h0IC0gMQAAALTdJgBbAAAA+gMAAAkAAACy3CYAXwAAAFgCAAAwAAAAstwmAF8AAAAWAgAALwAAALLcJgBfAAAAoQAAACQAAABJbmNsdWRlZEV4Y2x1ZGVkVW5ib3VuZGVkaW5kZXggIG91dCBvZiByYW5nZTogAABp3yYABgAAAG/fJgAPAAAADOEmAF4AAAAxBgAAAwAAAHJhbmdlICBvdXQgb2YgYm91bmRzOiAAAKDfJgAGAAAApt8mABAAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlL2FwaS5ycwAAyN8mAGIAAACOCgAAAQAAAHEGAAAUAAAABAAAAHIGAAAAAAAACAAAAAQAAABzBgAAY2Fubm90ICBiaXRzIGZyb20gYSAtYml0IHJlZ2lvbgBc4CYABwAAAKoSJwABAAAAY+AmAA0AAABw4CYACwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvZmllbGQucnMAAJzgJgBeAAAADgIAAAIAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlLnJzAAAM4SYAXgAAAPcAAAAfAAAADOEmAF4AAABPAQAAIwAAAGxvYWRCaXRTcGFuRXJyb3I8Pjo6kOEmAA0AAACd4SYAAwAAAE51bGxNaXNhbGlnbmVkVG9vTG9uZ1Rvb0hpZ2gvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2Nfc291cmNlbWFwLTkuMy40L3NyYy9lbmNvZGVyLnJzAMzhJgBnAAAANwAAAA0AAABpbnZhbGlkIGJ5dGXM4SYAZwAAACMAAAASAAAAaW52YWxpZCB1dGY4zOEmAGcAAABmAAAAIQAAAMzhJgBnAAAAWAAAABEAAABiYWQganNvbjogAACM4iYACgAAAGxlZnRvdmVyIGN1ci9zaGlmdCBpbiB2bHEgZGVjb2RloOImACAAAAB2bHEgZGVjb2RlIGRpZCBub3QgcHJvZHVjZSBhbnkgdmFsdWVzAAAAyOImACUAAAB2bHEgZGVjb2RlIGNhdXNlZCBhbiBvdmVyZmxvdwAAAPjiJgAdAAAAZ290ICBzZWdtZW50cywgZXhwZWN0ZWQgNCBvciA1AAAg4yYABAAAACTjJgAaAAAAYmFkIHJlZmVyZW5jZSB0byBzb3VyY2UgIwAAAFDjJgAZAAAAYmFkIHJlZmVyZW5jZSB0byBuYW1lICMAdOMmABcAAABlbmNvdW50ZXJlZCBpbmNvbXBhdGlibGUgc291cmNlbWFwIGZvcm1hdAAAAJTjJgApAAAAdGhlIHByb3ZpZGVkIGRhdGEgVVJMIGlzIGludmFsaWTI4yYAIAAAAGNhbm5vdCBmbGF0dGVuIHRoZSBpbmRleGVkIHNvdXJjZW1hcDogAADw4yYAJgAAAGludmFsaWQgbWFnaWMgbnVtYmVyIGZvciByYW0gYnVuZGxlACDkJgAjAAAAaW52YWxpZCBtb2R1bGUgaW5kZXggaW4gcmFtIGJ1bmRsZQAATOQmACIAAABpbnZhbGlkIHJhbSBidW5kbGUgbW9kdWxlIGVudHJ5AHjkJgAfAAAAbm90IGEgcmFtIGJ1bmRsZaDkJgAQAAAAaW52YWxpZCByYW5nZSBtYXBwaW5nIGluZGV4OiAAAAC45CYAHQAAAGludmFsaWQgYmFzZTY0IGNoYXJhY3RlcjogAADg5CYAGgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3J1c3RjLWhhc2gtMi4xLjEvc3JjL2xpYi5ycwTlJgBgAAAAIwEAABwAAAAE5SYAYAAAACQBAAAoAAAABOUmAGAAAAAlAQAAKAAAAATlJgBgAAAACAEAACsAAAAE5SYAYAAAAAgBAABCAAAABOUmAGAAAAAFAQAAKwAAAATlJgBgAAAABQEAAEIAAAAAAAAAAAAAAAEAAAB0BAAAVHJ5RnJvbVNsaWNlRXJyb3IvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL3Nlci5ycwD15SYAYgAAAA0GAAASAAAA9eUmAGIAAABMCAAAMwAAAHV1dXV1dXV1YnRudWZydXV1dXV1dXV1dXV1dXV1dXV1AAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD15SYAYgAAAD8IAABAAAAAIlwiXFxcYlxmXG5cclx0APXlJgBiAAAAfwIAACoAAAD15SYAYgAAAJYCAAAqAAAA9eUmAGIAAACkAgAAKgAAAPXlJgBiAAAA/AEAACoAAAD15SYAYgAAAAoCAAAqAAAAZXhwZWN0ZWQgUmF3VmFsdWUvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93eXotMC41LjEvc3JjL2NvbXUucnMA+ecmAFoAAAAnAQAAAgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC91bnN0YWJsZS9oZWFwc29ydC5yc2ToJgBgAAAAHAAAAB0AAABOdWxsUHRyRXJyb3IuLk1pc2FsaWduRXJyb3IAAQAAAGF0dGVtcHQgdG8gam9pbiBpbnRvIGNvbGxlY3Rpb24gd2l0aCBsZW4gPiB1c2l6ZTo6TUFYL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvc3RyLnJzAAAAKekmAEgAAACaAAAACgAAACnpJgBIAAAAnQAAABYAAAAp6SYASAAAALEAAAAWAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL3R5cGVzY3JpcHQucnMAAKTpJgB6AAAAQQAAABMAAACk6SYAegAAAEUAAAANAAAApOkmAHoAAAB0AQAAHAAAAJEPJwAGAAAAqfkmAAkAAACy+SYABwAAADQcJwAIAAAAkQ8nAAYAAACy+SYABwAAAKn5JgAJAAAANBwnAAgAAACdDycACAAAAJv5JgAFAAAAJBwnAAgAAAAcCycAAgAAALn5JgADAAAApOkmAHoAAADcAwAAPAAAAKTpJgB6AAAA3wMAACgAAACk6SYAegAAACwIAAAzAAAAPCAoanN4IHRhZyBzdGFydCkAAACk6SYAegAAALUKAAASAAAApOkmAHoAAADpCAAADgAAAKTpJgB6AAAAbQQAABIAAABhbiBpZGVudGlmaWVyLCB2b2lkLCB5aWVsZCwgbnVsbCwgYXdhaXQsIGJyZWFrLCBhIHN0cmluZyBsaXRlcmFsLCBhIG51bWVyaWMgbGl0ZXJhbCwgdHJ1ZSwgZmFsc2UsIGAsIC0sIGltcG9ydCwgdGhpcywgdHlwZW9mLCB7LCBbLCAobnVtZXJpYyBsaXRlcmFsIG9yIGJpZ2ludCBsaXRlcmFsAACk6SYAegAAANEJAAA0AAAApOkmAHoAAADjCQAANAAAAKTpJgB6AAAA7QkAABIAAACk6SYAegAAADgJAAAnAAAApOkmAHoAAAA2CQAAFgAAAKTpJgB6AAAAVAQAAA8AAACk6SYAegAAAFgEAAAQAAAApOkmAHoAAAB4AAAADQAAAKTpJgB6AAAAbwUAABQAAACk6SYAegAAAH0FAAAOAAAAYW4gaWRlbnRpZmllciwgWyBmb3IgYW4gYXJyYXkgcGF0dGVybiwgeyBmb3IgYW4gb2JqZWN0IHBhdHRlciBvciAuLi4gZm9yIGEgcmVzdCBwYXR0ZXJuAKTpJgB6AAAAKgEAABMAAABnbG9iYWwgb3IgYSBzdHJpbmcgbGl0ZXJhbAAA3P0mAHQAAABsAgAAJgAAANz9JgB0AAAAgQIAADYAAAAoIG9yIGAAANz9JgB0AAAAtQIAACoAAADc/SYAdAAAAKkCAAAmAAAAZmFpbMkDAAAMAAAABAAAADAEAAB0BgAAzAMAAAAAAAAAAAAAAQAAAM0DAADc/SYAdAAAACIBAAAjAAAA3P0mAHQAAAAzAQAAHQAAAAUOJwB0AAAARgMAACIAAAAFDicAdAAAAF8DAAAqAAAABQ4nAHQAAABAAwAAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9tb2QucnMAvO0mAHMAAAC7AQAAFwAAAGlkZW50aWZpZXIsIHN0cmluZyBsaXRlcmFsLCBudW1lcmljIGxpdGVyYWwgb3IgWyBmb3IgdGhlIGNvbXB1dGVkIGtleQAAALztJgBzAAAAfgEAAB8AAAB0ZW1wbGF0ZSB0b2tlbkFuIGV4cHJlc3Npb24gc2hvdWxkIGZvbGxvdyAnLi4uJy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9vYmplY3QucnMAAADH7iYAdgAAACQAAAAZAAAAx+4mAHYAAAAnAAAAEwAAAMfuJgB2AAAApwEAAB4AAAAcAy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci9qc3gvbW9kLnJzAHLvJgBxAAAAMwEAABkAAABy7yYAcQAAAD0BAAATAAAAPCAoanN4IHRhZyBzdGFydCksIGpzeCB0ZXh0IG9yIHty7yYAcQAAAOAAAAASAAAAanN4IGlkZW50aWZpZXISEBMAAABy7yYAcQAAAKMAAAAYAAAAcu8mAHEAAACpAAAAEgAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IEpTWE5hbWVzcGFjZWROYW1lIC0+IEpTWE9iamVjdGjwJgBIAAAAcu8mAHEAAABgAAAAGgAAAGB9YC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci90cGwucnPL8CYAbQAAAHgAAAATAAAAy/AmAG0AAAB7AAAAFAAAAMvwJgBtAAAA6AAAABEAAADL8CYAbQAAAOsAAAAUAAAAdmFybGV0PT0hPT09PSE9PTw9Pj08PD4+Pj4+JXxeJnx8JiYqKj8/APD0JgBnAAAAiwMAABIAAADw9CYAZwAAAAECAABIAAAA8PQmAGcAAAACAgAAKAAAAPD0JgBnAAAAygAAAEwAAADw9CYAZwAAAM0AAAAnAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL2xpdC5ycwDw8SYAZwAAAP4AAAA0AAAAaW1wbGVtZW50cy8vLyoqL35kZWxldGUrPS09Kj0vPSU9PDw9Pj49Pj4+PXw9Xj0mPSoqPSYmPXx8PT8/PSsrLS0vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9pdGVyLnJzdW5leHBlY3RlZCByZWdleCBmaW5kIGVycm9yOiAKdG8gaGFuZGxlIGZpbmQgZXJyb3JzLCB1c2UgJ3RyeScgb3IgJ3NlYXJjaCcgbWV0aG9kcwAAABPzJgAdAAAAMPMmADUAAACp8iYAagAAAH4BAAAZAAAAbPsmAGoAAABeAgAAHAAAAGz7JgBqAAAAawIAADIAAABs+yYAagAAAG8CAAAXAAAAAgAAAGz7JgBqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAAOPQmAA0AAABF9CYAGAAAAMzzJgBsAAAAqgEAAAkAAABjbGFzcy9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAACF9CYAWAAAANMHAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL2xpYi5ycwDw9CYAZwAAABAIAAAiAAAA8PQmAGcAAAATCAAAIQAAAHN1cGVyAAAA8PQmAGcAAACCBwAAFwAAAA0KAADw9CYAZwAAAEMIAAAyAAAA8PQmAGcAAAA8CAAAMAAAAG5ldy50YXJnZXRpbXBvcnQubWV0YT8uaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAADL9SYAKgAAAPX1JgAXAAAADPYmABYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjguMC4xL3NyYy9yZW5hbWUvbW9kLnJzAAA89iYAdgAAABABAAAZAAAAZXZhbEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3fI9iYAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2hhc2hicm93bi0wLjE0LjUvc3JjL3Jhdy9tb2QucnPs9iYAZAAAAFYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL2NsYXNzX2FuZF9mbi5yc2D3JgB8AAAA4wUAABUAAABg9yYAfAAAAPsFAAAPAAAAYPcmAHwAAADpBQAAEwAAAGD3JgB8AAAAZQAAABQAAABg9yYAfAAAAFsGAAARAAAAkQ8nAAYAAACp+SYACQAAALL5JgAHAAAAHAsnAAIAAAC5+SYAAwAAAJ0PJwAIAAAANBwnAAgAAAAkHCcACAAAAJcPJwAGAAAAYPcmAHwAAAD/BAAAEgAAACogZm9yIGdlbmVyYXRvciwgcHJpdmF0ZSBrZXksIGlkZW50aWZpZXIgb3IgYXN5bmNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpc19jb25zdHJ1Y3RvcigpIHJldHVybnMgZmFsc2UgZm9yIFByaXZhdGVOYW1lAAAAtfgmAFgAAABg9yYAfAAAAE4EAAAaAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3R5cGVzY3JpcHQucnNuZXc9PmNvbnN0ZW51bWluZmVycHJvdGVjdGVkcHJpdmF0ZW91dGV4dGVuZHN0eXBlb2YrLW5hbWVzcGFjZW1vZHVsZWdsb2JhbGAAAAAo+SYAbgAAABUCAAAiAAAAJHsAACj5JgBuAAAAGAIAACEAAABhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHZvaWR1bmRlZmluZWRuZXZlcmludHJpbnNpY2tleW9mdW5pcXVlc2F0aXNmaWVzYXNzZXJ0c2lzcmVxdWlyZS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3JlbmFtZS9vcHMucnN2+iYAdgAAAEoCAAAXAAAAdvomAHYAAABPAgAAEQAAAHb6JgB2AAAAHgEAABkAAAB2+iYAdgAAAEcBAAAZAAAAdvomAHYAAAB7AQAAHAAAAHb6JgB2AAAAuwEAABcAAAB2+iYAdgAAAMABAAARAAAAdvomAHYAAAB+AgAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL3Bvb2wucnMAAGz7JgBqAAAAPQIAABwAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yNC4wLjEvc3JjL2NvbW1vbi9wYXJzZXIvbW9kdWxlX2l0ZW0ucnMA6PsmAHsAAAB5AQAAOAAAAOj7JgB7AAAAZAIAABgAAADo+yYAewAAAH0CAAAYAAAA6PsmAHsAAACaAgAAGAAAAOj7JgB7AAAAIAMAABoAAADo+yYAewAAAEIDAAAaAAAA6PsmAHsAAABcAwAAGAAAAOj7JgB7AAAAcAMAABwAAADo+yYAewAAAGkDAAAYAAAAYSBzdHJpbmcgbGl0ZXJhbOj7JgB7AAAAiwMAABIAAADo+yYAewAAAA0DAAAWAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaGFuZGxlX2ltcG9ydF9leHBvcnQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgY3VycmVudCB0b2tlbiBpc24ndCBpbXBvcnQgbm9yIGV4cG9ydCT9JgB8AAAA6PsmAHsAAAAwAAAACQAAAOj7JgB7AAAAUgAAABIAAAAAAAAADAAAAAQAAAB2BgAAdwYAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9leHByLnJz3P0mAHQAAABKAAAAFQAAANz9JgB0AAAAUwAAAA8AAADc/SYAdAAAAE8AAAATAAAA3P0mAHQAAADHAgAAGwAAAGAuYCBvciBgKGAAANz9JgB0AAAA+wIAACcAAABtZXRhVHJpZWQgdG8gcGFyc2UgYW4gYXJndW1lbnQgb2YgeWllbGQA3P0mAHQAAADRBwAAEwAAANz9JgB0AAAAywcAABMAAADc/SYAdAAAANcHAAAYAAAA3P0mAHQAAADrBwAAEwAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgcGF0dGVybjogRXhwcigU/yYAQAAAAFyCJwABAAAA3P0mAHQAAACwBwAAKAAAANz9JgB0AAAAiQcAABoAAADc/SYAdAAAAMQIAAA9AAAA3P0mAHQAAADTCAAAGQAAANz9JgB0AAAA4ggAAB8AAADc/SYAdAAAAOMIAAAeAAAA3P0mAHQAAADaCAAANAAAAHRhcmdldGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHBhcnNlX2xpdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgANr/JgBNAAAA3P0mAHQAAAAQAQAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zb3VyY2VfbWFwLnJzQAAnAGgAAAA1BQAASgAAAEAAJwBoAAAAYgUAACYAAAAuPC8+PDwvPjw+L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3N0bXQucnNpZmVsc2Vmb3J0cnlmaW5hbGx5YnJlYWtvZnRocm93d2hpbGVyZXR1cm5jYXNl0gAnAGgAAAADAQAAHQAAANIAJwBoAAAABgEAAEEAAABzd2l0Y2hjYXRjaGRvY29udGludWVkZWJ1Z2dlcgAAAAAAAAAEAAAABAAAAIgFAAAjTm9GaWxlRm9yL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL21vZHVsZV9kZWNscy5yc3R5cGVhc2V4cG9ydGZyb213aXRoYXNzZXJ0aW1wb3J0ZGVmZXIAwgEnAHAAAAChAAAAIAAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3BlY2lmaWVycy5sZW4oKSA8PSAywgEnAHAAAACvAAAAFQAAAMIBJwBwAAAAZQEAACgAAABub3QgaW1wbGVtZW50ZWQ6IGNvZGVnZW4gb2YgYGV4cG9ydCBkZWZhdWx0IGZyb20gJ2Zvbyc7YLQCJwA4AAAAwgEnAHAAAAAHAQAAEQAAAGRlZmF1bHRmdW5jdGlvbiMhaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogTW9kdWxlIGlzIGhhbmRsZWQgYWJvdmUAABUDJwBBAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfcGFyc2VyLTI1LjAuMC9zcmMvcGFyc2VyL21vZC5ycwAAAGADJwBtAAAAKAEAADIAAAAgICAgeAYAAAwAAAAEAAAAygMAAMsDAADMAwAAAAAAAAAAAAABAAAAzQMAAGRlc2NyaXB0aW9uKCkgaXMgZGVwcmVjYXRlZDsgdXNlIERpc3BsYXkAAAAABAAAAAQAAAAhAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQB5BgAACAAAAAQAAAB6BgAAewYAAAwAAAAEAAAAfAYAAHsGAAAMAAAABAAAAMMDAAB8BgAAgAQnAEQEAAB9BgAARgQAAH4GAABHBAAAVXRmOEVycm9ydmFsaWRfdXBfdG9lcnJvcl9sZW5Gcm9tVXRmOEVycm9yYnl0ZXNlcnJvcklvVXRmOEJhZEpzb25WbHFMZWZ0b3ZlclZscU5v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AAAAgAAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9wYXJzZXItMjUuMC4wL3NyYy9sZXhlci9jYXB0dXJpbmcucnMAACAMJwByAAAAOAAAAAsAAAAuLi4/e31kZWNsYXJlIWNvbnN0cnVjdG9yYWNjZXNzb3JtaWQgPiBsZW4AAMUMJwAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9kcmlmdC5ycwDYDCcAWwAAAP8AAAAZAAAA2AwnAFsAAADyAAAAEgAAANgMJwBbAAAAzgAAACQAAADYDCcAWwAAANEAAAAkAAAA2AwnAFsAAABAAAAAIgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvcXVpY2tzb3J0LnJzAIQNJwBfAAAATgAAAB8AAACEDScAXwAAAEgAAAAXAAAAQC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9zdG10LnJzVHJpZWQgdG8gcGFyc2UgdGhlIGNvbmRpdGlvbiBmb3IgYW4gaWYgc3RhdGVtZW50dXNpbmcAAAUOJwB0AAAAiAEAACIAAAAFDicAdAAAAIsBAAAjAAAABQ4nAHQAAACRAQAANAAAAAUOJwB0AAAAmwEAADIAAAAFDicAdAAAANEAAAAJAAAABQ4nAHQAAAD8AAAAFQAAAAUOJwB0AAAAFQEAAA8AAAAFDicAdAAAAFgFAAAVAAAAInVzZSBzdHJpY3QiJ3VzZSBzdHJpY3QnBQ4nAHQAAAB4BQAAEwAAAAUOJwB0AAAAUgEAAA8AAAAFDicAdAAAANgDAAAWAAAABQ4nAHQAAADbAwAAEwAAAGludGVyZmFjZXB1YmxpY3N0YXRpY2Fic3RyYWN0AAAABQ4nAHQAAACWAAAAEgAAADsAAADsFCcAbgAAANwCAAARAAAArwYAALAGAACxBgAAsgYAALMGAAC0BgAAtQYAALYGAAC3BgAAuAYAALkGAAC6BgAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50LnJzAPwPJwBjAAAAbAMAAA8AAAAAAAAABAAAAAAAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnN8ECcAbAAAAPABAAAWAAAAY2Fubm90IGFjY2VzcyBhIHNjb3BlZCB0aHJlYWQgbG9jYWwgdmFyaWFibGUgd2l0aG91dCBjYWxsaW5nIGBzZXRgIGZpcnN0L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2NvcGVkLXRscy0xLjAuMS9zcmMvbGliLnJzQBEnAGAAAACoAAAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci9pbnB1dC5ycwCwEScAbwAAAAEBAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3RleHRfd3JpdGVyL2Jhc2ljX2ltcGwucnMgL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL2lkZW50LnJzaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZasSJwB1AAAA1AAAAAkAAABhd2FpdHlpZWxkbGV0IGlzIHJlc2VydmVkIGluIGNvbnN0LCBsZXQsIGNsYXNzIGRlY2xhcmF0aW9uaWRlbnRpZmllciBvciBzdHJpbmcvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yNC4wLjEvc3JjL2NvbW1vbi9wYXJzZXIvYnVmZmVyLnJzphMnAHYAAABjAAAAIAAAALARJwBvAAAAKgAAAA0AAACwEScAbwAAAGAAAAANAAAAsBEnAG8AAABRAAAADQAAALARJwBvAAAASQAAAA0AAACwEScAbwAAADkAAAANAAAAsBEnAG8AAABBAAAADQAAALARJwBvAAAAWQAAAA0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiB0b2tlbl92YWx1ZTogAJwUJwA3AAAAsBEnAG8AAAAxAAAADQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL2xleGVyL3Rva2VuLnJzAADsFCcAbgAAABkDAAAkAAAAMBInAHoAAAByAAAAGgAAADASJwB6AAAAiwAAABgAAABmYWxzZXRydWVudWxsL3VzZSBzdHJpY3RzY3JpcHRcdXs8IS0tXHgzYyEtLS0tPi0tXHgzZW4tMHgAAADCFScAAwAAADB4AADQFScAAgAAAD0oKiw6W10AyQMAAAwAAAAEAAAAygMAADQEAADMAwAAAAAAAAAAAAABAAAAzQMAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAEMWJwBLAAAA8AoAAA4AAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAKAWJwBPAAAA4gUAABQAAACgFicATwAAAOIFAAAhAAAAoBYnAE8AAADWBQAAIQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvbW9kLnJzAAAAIBcnAE0AAADsAwAAKwAAAEVycm9yAAAAQxYnAEsAAADoAQAAFwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2JvcnJvdy5ycwCYFycASwAAABUBAAAlAAAAPGludmFsaWQ+Tm9uZVNvbWUAAAAAAAAABAAAAAQAAAC7BgAAvAYAAL0GAACgFicATwAAAGYEAAAkAAAAoBYnAE8AAADOAQAANwAAAKAGAAAIAAAABAAAAKEGAACiBgAAowYAAKQGAAClBgAApgYAAKcGAACoBgAAqQYAAKoGAACrBgAArAYAAK0GAACuBgAAVW5zdXBwb3J0ZWQgc3ludGF4YG1vZHVsZWAga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYG5hbWVzcGFjZWAgaW5zdGVhZC5VbnN1cHBvcnRlZFN5bnRheFR5cGVTY3JpcHQgZXhwb3J0IGFzc2lnbm1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGltcG9ydCBlcXVhbHMgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGVudW0gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZVR5cGVTY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVGhl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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////8/P/////8/P/+q////P////////99f3B/PD/8f3B8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAT//3////9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgBP//f////3///////////////////////////////////////////////////////////////////////w8A//9/+P//////D////////////////////////////////8P/AwAfUAAAAAAAAAAAAAAAAAAAAADfvEDX///7////////////v//////////////////////////////////D/wMAH1AAAP//////////////////37zA1///+////////////7///////////////////////wP8///////////////////////////+////fwL//////wEAAAAAAAAAAP///4cHAP/////////////////////7/P///////////////////////////v///38C//////8B/v////+/tgD///+HBwAAAAAA//////8HAAAAwP7//////////////y8AYMAAnAAA/f///wAAAOD/////////////PwACAAD8////BzAEAAD/B////////////8P////////////////vn//9/58AAP/////////n////////////////AwD///////8/JP//PwQQAQAA////Af8H////fgAA//////8DAAAAAAAA8P///////yMAAAH/AwD+/+Gf+f///cUjAEAAsAMAAxD//////z8AAP///w//B////36A////////////+////////////////////8///v/vn/n///3F8595gLDP/wNQ4If5///9bQMAAABeAAAcAOC/+////e0jAAABAAMAAALgn/n///3tIwAAALADAAIA6Mc91hjH/wMAAAEAAAAAAO6H+f///W3ThzkCXsD/PwDuv/v///3t8787AQDP/wD+7p/5///97fOfOeCwz/8CAOzHPdYYx//Dxz2BAMD/AADg3/3///3/IwAAACcDAAAA4d/9///97yMAAABgAwAGAPDf/f////8nAEBwgAMAAPzg/3/8///7L38AAAAAAAAA/9/9///9//PfPWAnz/8AAO/f/f///e/z3z1gYM//DgD/3/3//////9998IDP/wD87v9//P//+y9/hF//wP8MAP7//////w0AfwAAAAAAAADW9///r/8NIF8AAPAAAAAAAQAAAAAAAAD//v///x8AAAAfAAAAAAAAAAAAAAAAAAD+////////B/9//wMAAAAA1vf//6///z9ff//zAAAAAAEAAAP/A6DC//7///8f/v/f///+////H0AAAAAAAAAA//////8HAIAAAD88YsDh/wNAAAD/////vyD///////f///////////////////////////////////////////////////8/AAD///////////z///////8AAAAAAP8P////////////A////////////z//////vyD///////f//////////////////////////////////////////////////38A//8/AP8AAAC////////9BwAAAAAAAAAA////////////PX89//////89/////z1/Pf9//////////z3//////////wcAAAAA//8AAP////////////8/P////////////z1/Pf//////Pf////89fz3/f/////////89///////////nAP4DAP//AAD/////////////Pz/+/////////////////////////////////////////////////////////////////////////////////////////////////////////////wMAAAAAAAAAAAAAAAD/////////////////n////v//B////////////8f/Af//A4D//wMA//8DAP/fAQD///////8PAAAAgBAAAAAA/////////////////5////7//wf////////////H/wH//z+A//8fAP//DwD/3w0A/////////////48w/wMAAAAAAAD//////////////wH//////wX//////////z8A////fwAAAAAAAP///z8fAP//////D////wMAAAAAAAAAuP8D//////////////8B//////8H//////////8/AP///3//D/8PwP////8/HwD//////w////8D/wcAAAAA//9/AP///////x8AAAAAAAAAAACAAAAAAAAAAAAAAADg//////8PAOAfAAAAAAAA+P///wHAAPz/////PwAAAP///w//////////f////5//A/8DgAD/v/9/AAAAAAAA////////////H/8DAPgPAP//////////////////DwD/////DwAAAADgAPz///8//wf//////+cAAAAAAN5vBP///////////////////////////////wAAAAAAAAAA/////////wD/4///////P/8H///////nAAD3/////wf///////////////////////////////////////////////////////////////////////////////////8HAAAAAAAAAAAAAAAAAAACgAAA/x8AAAAAAAAAAAAAAACE/C8/UP3/8+BDAAD//////wEAAAAAAAAAAAAAAAAAAAAwAAAAAACAAQAQAAAAAoAAAP8fAAAAAAAA/x/i/wEAhPwvP1D9//PgQwAA//////8BAAAAAAAAAAAAAAAAAAD/////////////////////////////////////H3gMAP////+/IP////////+AAAD//38Af39/f39/f38AAAAA/////////////////////////////////////x/4DwD/////vyD/////////gACA//9/AH9/f39/f39//////+AAAAD+Az4f/v///////////3/4/v/////////////34P///////v////////////9/AAD/////AAAAAAAA///gAAAA/v8+H/7///////////9//v7//////////////+D///////7/////////////fwAA/////wAAAAAAAP////////////////////////8fAAAAAAAAAAD//////z////////////////////////////////////////////////////////////////////////////////////8A/x///wAMAAD//////38AgP///z//////////////AAAAAID//P////////////////n/////////P+sfAAD8//8f////DwAA////////8L///////////////////wMAAACA//z////////////////5/////////z/rHwAA/P+79///BwAAAP///////w8A/P//////DwAAAAAAAAD8aAD8//8/AP//fwAAAP///x/w//////8HAACAAADf/wB8//////8QAAD///////8PAP//////////PwD/A////+j//////z//////DwD///8f//////////8BgP8D////f///////AQAA9w8AAP//f8T///////9iPgUAADj/BxwAfn5+AH9////////3/wP//////////////////wcAAAD///////9/AP8//wP//3/8//////////8HAAA4//98AH5+fgB/f///////9/8D////////////////////N/8D/////////////////z//////////////////AwAAAAB/APig//1/X9v/////////////////AwAAAPj///////////////////////8//////////////////wMAAAAAfwD44P/9f1/b/////////////////wMAAAD4//////8AAAAAAAAAAAAAAAAAAN//////////////////////HwAAAAD+//8H/v//B8D/////////////f/z8/BwAAAAA//8AAP//GAAA4AAAAADf/////////////////////x8AAP8D/v//h/7//wfg/////////////3/8/PwcAAAAAP/v//9///+3/z//PwAAAAD///////////////////8HAAAAAAAAAAD///////8fAAAAAAAAAAAAAAAAAAAAAAD/7///f///t/8//z8AAAAA////////////////////BwAAAAAAAAAA////////HwAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAP///x////////8BAAAAAAD/////AOD///8H/////z8A////P/////8P/z4AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8f////////AQABAAAA/////wDg////B///////B////z//////D/8+AAAAAAD/////////////////////////PwAA/////w//////D///////AP///////w8A//f/97f/+//7G////////w8A/////////////////////////z//A/////8P/////w///////wD///////8PAP/3//e3//v/+xv///////8PAD/9/////7+R//8/AP//fwD///9/AAAAAAAAAAD//zcA//8/AP///wMAAAAAAAAAAP/////////AAAAAAAAAAAABAO/+//8/AAAAAAD///8f////HwAAAAD//v//HwAAAP///////z8A//8/AP//BwD//wMAAAAAAAAAAAAAAAAAb/Dv/v//P4cAAAAA////H////x8AAAAA//7//38AAAD///////8/AP//PwD//wcA//8DAAAAAAAAAAAAAAAAAP///////////wEAAAAAAAD///////8HAP///////wcA/////w8AAAAA/P//P4D//z8AAAAAAAAAAAAAAAAAAAD///////////8BAAAAAAAA////////BwD///////8HAP//////AP8D/////z++//8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AwMAHAAAAAAAAAD///8fgAD//z8AAAAAAP//AwAAAAAA//8fAAAA//9/AAAAAAAAAAAAAAAAAAAAAAD//////xsDABwAAAAAAADw////H4AA/////wEAAAD//z8AAAAAAP//HwAAAP//fwD4////////AAAAAAAAACYA+P//////AAAAAP///wEAAPj///9/AAAAkAD/////RwD4//////8HAB4AABQAAAAA//////////9/AAAAwP8/gP////////8HBAD///8B/wP////////f//AA/////08A//////////8f3v8XAAAAAP//+///DwCAAQAAAAAAAAB/vf+//wH//////38AAAAA4J/5///97SMAAAHgAwAAAP9L/////78AAAAKAAAAAAD///v/////wAMAAAAAAAAAf73/v/8B/////////wf/A++f+f///e37nzmB4M8fHwD/S/////+//6X3DwAGAAAA////////HwCABwCAAwAAAP///////wAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////9/AAAAAAAPAAAAAP///////////wf/wwMAAAD//////////78A/wMAAAAAAAAAAAAAAAAAAAAAAAAAAP///////z//AQAAPwAAAAD///////8AABAAAAAAAAAA//////8HAAEAAAAAAAAAAP///wcAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8RAP8DAAAAAP////////8B/wP//w8AAAD////n/w//A38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////DwAAAAAAAAAAAAAAAAAA//////////8AAACAf/Jv////AIACAAAAAAAAAAAAAAD//P////8BAAoAAAD/////////BwAAAAAAAAAAAAAAAP///////////wMAgH/yb////7/5DwD/AwAAAAAAAAAA//z///////wbAAAAAfj/////BwQAAAHw//////8DACAAAP///////////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AQAAAP////////9/gAD///////////8jAAD///////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEA/wP//f///38AAAEAAAAAAPz///8AAAAAAAAAAAAAAAAAAH/7/////wEAQAAAAL/9////AwABAAAAAAAAAAAAAAAA//3/////f/8BAP8DAAD8/////P///n8AAAAAAAAAAAB/+/////9/tP8A/wO//f///3/7Af8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wcA9P/9////DwAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//9/AP///f/////HBwD/BwAAAAAAAAAAAAABAAAAAAAAAAAA/////////////////38AAP///////////////////////////////w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AQD///////8AAH4AAAD//////////////////////////////////////////////////////////////////////////wcABAAAACcA8AD///////////////////////////////8AAP//PwD//////////////////////////////////////////////////////////////////////////////wP//////////////////////////////////////////38AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wH///9/AAD///////////9/AAD///8/AAD///////8AAA8AAAD4///g//8AAAAAAAAAAAAAAAAAAP////////8B////f/8D////////////f/8D////Px8A////////fwAPAP8D+P//4P//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////H/8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAA////////////BwEAAAAAAAAA+P8AAAAAAAAAAAsAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAP///////////4f/////////gP//AAAAAAAAAAAbAAMA//////////////////////////////////8/AAAAAID/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA72//////////////////////////////////////////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8///9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////B/8f/wH/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4OMH+OcPAAAAPAAAAAAAAAAAAAD/////////////////B/8f/wH/YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////f+AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9v/38AAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wP/////////////3///////////32Te/+vv/////////7/n39////97X/z9//////////////////////////////////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3DwAAAAAAAP//////////////////////////P/////3///f////3///f////3///f////3/////9/////f//98////////////////9/+P//////HyAAEAAA+P7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////AAAAAAAAAAD/////////PwAAAAAAAAAAAAAAAAAAAAAAAP//////H4A/AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///+dsH/////////z8AAACAAAAAAAAAAAAAAAAAAAD//////x//P/9DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///z8AAP//////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///9/AAD/////////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///z8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wf///////////////////////////////8fAAAAAAAAAP//////////DwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////HwB/AAAAAAD///////////8P/wMAAAAAAAAAAAAAAAAAAAAAAAAAAO////+W/vcKhOqWqpb3917/+/8P7vv/DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAP///////////////////////////////////////////////////////////////////////////////wEA//////8/////////////////////////////////////////////////////////////////////////////////////////////B////////////////////////////////////////////////////////wMA/////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAD//////////////z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMDBAUGBwgJCgsMDQ4DAwMDAwMDDwMDAwMDAwMPCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkQCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAgIDAgIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICKywCAgICLS4CAgIvMDEyMwICAgICAjQCAjU2NwI4OTo7PD0+Pzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5QQICQkMCAkRFRkdISQJKOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5SwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjk5OTlMAgICAgJNTk9QAgICUQJSUwICAgICAgICAgICAgJUVQICVgJXAgJYWVpbXF1eX2BhAmJjAmRlZmcCaAJpamtsAgJtbm9wAnFyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHUCAgICAgICdnc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OXg5OTk5OTk5OTl5egICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICezk5fDk5fQICAgICAgICAgICAgICAgICAgJ+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICfwICAoCBggICAgICAgICAgICAgICAoOEAgICAgICAgICAoWGdQIChwICAogCAgICAgICiYoCAgICAgICAgICAgICi4wCjY4Cj5CRkpOUlZYClwICmJmamwICAgICAgICAgI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTmcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCdAgICAp6fAgQCBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHQICHgICAgICAgIfICEiIwIkJSYnKCkCKgICAgKgoaKjpKWmLqeoqaqrrK0zAgICAgICrgICNTY3Ajg5Ojs8PT6vOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5TAICAgICsE5PsYWGdQIChwICAogCAgICAgICiYoCAgICAgICAgICAgICi4yys44Cj5CRkpOUlZYClwICmJmamwICAgICAgICAgJVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVRUAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEAAAAAAAAAAAAAEEEQVVVVVVVXVVVVVVVVVVVVUVVVAABAVPXdVVVVVVVVVVUVAAAAAABVVVVV/F1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQUAFAAUBFBVVVVVVVVVFVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVdVXVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVBVAABVVVVVVVVVVVVVBQAAAAAAAAAAAAAAAABAVVVVVVVVVVVVVVVVVUVUAQBUUQEAVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVUQBVFVRVRVVVQVVVVVVVVVFQVVVVVVVVVVVVVVVVVVVVEEVFFBRVVVVVVVVVVBRVVVBVVVVVVVVVVVVVVVVVVVUARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVUFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVVVVVVUFVVVVf//99//911931tXXVRAAUFVFAQAAVVdRVVVVVVVVVVVVVRUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVxUUVVVVVVVVVVVVVVVVVVVFAEBEAQBUFQAAFFVVVVVVVVVVVVVVVQAAAAAAAABAVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVQAAUAVVVVVVVVVVVVUVAABVVVVQVVVVVVVVVQVQEFBVVVVVVVVVVVVVVVVVRVARUFVVVVVVVVVVVVVVVVVVAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAABABUUVVUUFVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVVVVVVVVVX///9VVVVVVVVVVVVV1VVVVVXVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVVVVVVVVVVVVqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAAAAAAAAAAAAAAAAVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAFVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAEQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAABBVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBQEUQAABVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVAVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRFQBQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAEAVAAAAAAAAAAAAAAAAVFVRVVVVVFVVVVUVAAEAAABVVVVVVVVVVVVVVVVVVVVVVVVVVQBAAAAAABQAEARAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9Vf9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9XVf//////////////3/9fVfX///9V//9XVf//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVZVWlWqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqqqqqqqqqqqqVVVVqqqqqqVaVVWaqlpVpaVVWlqllqVaVVVVpVpVlVVVVX1VaVmlVV9VZlVVVVVVVVVVZlX///9VVVWammqaVVVV1VVVVVXVVVWlXVX1VVVVVb1Vr6q6qquqqppVuqr6rrquVV31VVVVVVVVVVdVVVVVWVVVVXfV31VVVVVVVVWlqqpVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqalWqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIDBAUGBwgJCgsMDQICAgICAgIOAgICAgICAg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAgMCAgQCBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHQICHgICAgICAgIfICEiIwIkJSYnKCkCKgICAgIrLAICAgItLgICAi8wMTIzAgICAgICNAICNTY3Ajg5Ojs8PT4/OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUACAkFCAgJDREVGR0gCSTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUoCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI5OTk5SwICAgICTE1OTwICAlACUVICAgICAgICAgICAgICU1QCAlUCVgICV1hZWltcXV5fYGFiYwJkZWZnAmgCaWprbAICbW5vcAJxcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAICAgICAgICAgICAgICAgICAnV2AgICdwICAnh5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTl6OTk5OTk5OTk5e3wCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn05OX45OX8CAgICAgICAgICAgICAgICAgICgAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoECAgKCg4QChQICAgICAgICAgICAgKGhwICAgICAgICAgKIiXYCAooCAgKLAowCAgICAo2OAgICAgICAgICAgICAo+QApGSApOUlZaXmJmaApsCApydnp8CAgICAgICAgICOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5oB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoQICAgKiowIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICpKWmp6ipqi6rOaytrq+wsQICAgICArICAjU2NwI4OTo7PD0+szk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUsCAgICArRNTrWIiXYCAooCAgKLAowCAgICAo2OAgICAgICAgICAgICAo+QtreSApOUlZaXmJmaApsCApydnp8CAgICAgICAgICVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVUVAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBAAAAAAAAAAAAABBBEFVVVVVVV1VVVVVVVVVVVVFVVQAAQFT13VVVVVVVVVVVFQAAAAAAVVVVVfxdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFABQAFARQVVVVVVVVVRVRVVVVVVVVVQAAAAAAAEBVVVVVVVVVVVXVV1VVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVVVUVAABVVVFVVVVVVQUQAAABAVBVVVVVVVVVVVVVAVVVVVVV/////39VVVVQFQAAVVVVVVVVVVVVVQUAAAAAAAAAAAAAAAAAQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVQVVVVVVVVVVVVVVVVVVVVAEQVFFVVVVVBVVVVVVVBQBRVVVVVVVVVVVVVVVVVVUEAVRVUVUBVVUFVVVVVVVVVUVVVVVVVVVVVVVVVVVVVUVUVVVRVRVVVVVVVVVVVVVVVFRVVVVVVVVVVVVVVVVVBFQFBFBVQVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVUURAUEUFVBVVUFVVVVVVVVVVBVVVVVVVVVVVVVVVVVFUQBVFVBVRVVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVRRUFRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAEBVVRUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAAFRVVQBAVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVRFRVVVVVVVVVVVVVVVVVQEAAEAABFUBAAABAAAAAAAAAABUVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQQAQUFVVVVVVVVQBVRVVVUBVFVVRUFVUVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVBVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAQFVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVFVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUABQVVVVVVVVVVVVVVVVVUVQEQBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAABVVRUAVVVVVVVVBUBVVVVVVVVVVVVVVVUAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAABUVVVVVVVVVVVV9VVVVWlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf1X11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV9VVVVVVVfVVVVVVVVqqpVVVVV////VVVVVVVVVVVVVdVVVaWq1VVVVV1V9VVVVVV9VV9VdVVXVVVVVXVV9V11XVVd9VVVVVVVVVVXVVVVVVVVVVV31d9VVVVVVVVVVVVVVVVVVVX9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVddVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQVVVVVVVVVVVVVVVVVVVV/f///////////////19V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAKqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVqqqqqqqqqqqqqqqqqqoKAKqqqmqpqqqqqqqqqqqqqqqqqqqqqqqqqqpqgaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqaqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqKqqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVZWqqqqqqqqqqqqqqmqqqqqqqqqqqqqqVVWqqqqqqqqqqqqqqqqqqqpWqqqqqqqqqqqqqqqqqmpVVVVVVVVVVVVVVVVVX1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVAAABQVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVFRRVVVVVVVVVBVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVQAAAABQVUUVVVVVVVVVVVVVBQBQVVVVVVUVAAAQVVVVqqqqqqqqqlZAVVVVVVVVVVVVVVUVBVBQVFVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVUBQEFBVVUVVVVUVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVBBRUBVFVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRRVVVVVaqqqqqqqqqqqlVVVQAAAAAAQBUAAAAAAAAAAAAAAABVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUMAADwqqpaVQAAAACqqqqqqqqqqmqqqqqqaqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVlVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAVQFBVQBVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVAVBVVVVVVVVVVVVVVVVVVRVUVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVUAAABAVVVVVVVVVVVVVRRUVRVQVVVVVVVVVVVVVVUVQEFVRVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVRUAAQBUVVVVVVVVVVVVVVVVVVUVVVVVUFVVVVVVVVVVVVVVVQUAQARVARRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQAFVFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFRUAQFVVVVVVUFVVVVVVVVVVVVVVVVUVRFRVVVFVFVVVVQUAVABUVVVVVVVVVVVVVVVVVVVVVRQARBFQBUBVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAFRFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVFABEEQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUFUFUQVFVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVRUAQBFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVRAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEQUQAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUVABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUABVVUVVVVVVVVVQEAQFVVVVVVVVVVVRUABEBVFVVVAUABVVVVVVVVVVVVVQAAAABAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVUFAAAAAAAFAARBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAUBFEAAAVVVVVVVVVVVVVVVVVVVVVVVVUBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVQFVVVVVVVVVVVVVVVQVAVUBVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUAAABQVVVVVVVVVVVVVVVVVVVVVVUFAABQAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVUVQFVVVVVVVVVVVVVVVVVVVVVVVVWqVFVVUFVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVVZWqqlZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqappqqqqqqqqqqpqVVVVZVVVVVVVVVVqWVVVVapVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVVVVVVVVBAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAABQAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAVABAAAAAEABAFVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpqVVWqqqqqqmpVVQAAAAAAAAAAAAAAAABAFQAAAAAAAAAAAAAAAFRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9Vf9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9f1f////////////////9/VfX////X//9fVf//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVaqqqmqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVaqqqqqqqqqqqlZVVaqqqqqlWlVVmqpaVaWlVVpapZalWlVVVaVaVZVVVVV9VWlZpVWvVWZVVVVVqqpVVWZV////VVVVmppqmlVVVdVVVaWq1VVVpV1V9VVVVVW9Va+quqqrqqqaVbqq+q66rlVd9VVVVVVVVVVXVVVVVVlVVVV31d9VVVVVVVVVpaqqqqqqqqr9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAwAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqqlaqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////++BgAADAAAAAQAAACFBQAAcAYAAIcFAAAwMTIzNDU2Nzg5YWJjZGVmL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdXVpZC0xLjE3LjAvc3JjL2ZtdC5ycwCogScAWwAAALsAAAANAAAAqIEnAFsAAACzAAAAFQAAAKiBJwBbAAAAtgAAAA0AAACogScAWwAAALcAAAANAAAAFIMnAFAAAAAuAgAAEQAAAEpzVmFsdWUoKQAAAFSCJwAIAAAAXIInAAEAAAD//////////3CCJwAAAAAAAAAAAAAAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAIiCJwBPAAAAGQEAABkAAABUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHnogicAJAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzFIMnAFAAAAC5AgAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5ycy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jYWNoZS9pbnRlcm4ucnPjgycAbQAAABoAAAArAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjUwL3NyYy9xdWV1ZS5ycwAAAGCEJwBtAAAAJQAAAC4AAABghCcAbQAAACgAAAApAAAAYIQnAG0AAAA+AAAAGgAAAGCEJwBtAAAAPgAAACcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3Rhc2svc2luZ2xldGhyZWFkLnJzAAAAEIUnAHkAAAAiAAAAFQAAAMEGAADCBgAAwwYAAMQGAAAQhScAeQAAAGcAAAAlAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWQAAMUGAAAEAAAABAAAAMYGAADHBgAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAAEhicAKgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycziGJwBgAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAqIYnAA4AAAA4hicAYAAAAHoCAAANAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIAAAABAQICAggAAAANAAAADwAAALz8IADE/CAA0fwgAAgAAAANAAAADwAAALz8IADE/CAA0fwgAAgAAAANAAAADwAAALz8IADE/CAA0fwgAAYAAAAGAAAACAAAAAcAAABwhiAAJNcmAHaGIAB+hiAAFIYgACKGIAAwhiAARoYgAA4AAAAOAAAAFgAAABYAAACEtiAAhrYgAIi2IACKtiAAjLYgAI62IACQtiAAkrYgAJS2IACWtiAAmLYgAJq2IACctiAAnrYgAKC2IACitiAApLYgAGC+IABwviAAgL4gAJC+IACQviAAoL4gALC+IADAviAA0L4gAOC+IADwviAAAL8gABC/IAAgvyAAML8gAEC/IABQvyAAYL8gAHC/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0LYgAOC2IADwtiAAALcgABC3IAAgtyAAMLcgAEC3IABQtyAAYLcgAHC3IACAtyAAkLcgAKC3IACwtyAAwLcgANC3IADgtyAA8LcgAAC4IAAQuCAAILggADC4IABAuCAAQLggAFC4IABguCAAcLggAIC4IACQuCAAoLggALC4IADAuCAA0LggAOC4IADwuCAA8LggAAC5IAAQuSAAILkgADC5IABAuSAAQLkgAFC5IABguSAAcLkgAIC5IACQuSAAoLkgALC5IADAuSAA0LkgAOC5IADguSAA8LkgAAC6IAAQuiAAILogADC6IABAuiAAULogAGC6IABwuiAAgLogAJC6IACguiAAsLogAMC6IADQuiAA4LogAPC6IADwuiAAALsgABC7IAAguyAAMLsgAEC7IABQuyAAULsgAGC7IABwuyAAgLsgAJC7IACguyAAkLkgALC7IADAuyAA0LsgAOC7IADwuyAAALwgABC8IAAgvCAAMLwgAEC8IABQvCAAYLwgAHC8IACAvCAAkLwgAKC8IACwvCAAwLwgANC8IADgvCAA8LwgAAC9IAAQvSAAIL0gADC9IABAvSAAUL0gAGC9IABwvSAAgL0gAJC9IACgvSAAsL0gAMC9IADQvSAA4L0gAPC9IAAAviAAEL4gACC+IAAwviAAQL4gAFC+IAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAH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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC/IACQvyAAoL8gALC/IADAvyAA0L8gAOC/IADwvyAAAMAgABDAIAAgwCAAMMAgAEDAIABQwCAAYMAgAHDAIACAwCAAkMAgAKDAIACwwCAAwMAgANDAIADgwCAA8MAgAPDAIAAAwSAAEMEgACDBIAAwwSAAQMEgAFDBIABgwSAAcMEgAIDBIACQwSAAoMEgAKDBIACwwSAAwMEgANDBIADgwSAA8MEgAPDBIAAAwiAAEMIgACDCIAAwwiAAQMIgAFDCIABgwiAAcMIgAIDCIACQwiAAkMIgAKDCIACwwiAAwMIgANDCIADgwiAA8MIgAADDIAAQwyAAIMMgADDDIABAwyAAUMMgAGDDIABwwyAAgMMgAJDDIACgwyAAoMMgALDDIADAwyAA0MMgAODDIADwwyAAAMQgAADEIAAQxCAAIMQgADDEIABAxCAAUMQgAEDCIABgxCAAcMQgAIDEIACQxCAAoMQgALDEIADAxCAA0MQgAODEIADwxCAAAMUgABDFIAAgxSAAMMUgAEDFIABQxSAAYMUgAHDFIACAxSAAkMUgAKDFIACwxSAAwMUgANDFIADgxSAA8MUgAADGIAAQxiAAIMYgADDGIABAxiAAUMYgAGDGIABwxiAAgMYgAJDGIACgxiAAsMYgAMDGIADQxiAA4MYgAPDGIAAAxyAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAESyIABMsiAAVLIgAFyyIABksiAAbLIgAHSyIAB8siAAhLIgAIyyIACUsiAAnLIgAKSyIACssiAAtLIgALyyIADEsiAAzLIgANSyIADcsiAA5LIgAOyyIAD0siAA/LIgAASzIAAMsyAAFLMgAByzIAAksyAALLMgADSzIAA8syAARLMgAEyzIABUsyAAXLMgAGSzIABssyAAdLMgAHyzIACEsyAAjLMgAJSzIACcsyAApLMgAKyzIAC0syAAvLMgAMSzIADMsyAA1LMgANyzIADksyAA7LMgAPSzIAD8syAABLQgAAy0IAAUtCAAHLQgACS0IAAstCAANLQgADy0IABEtCAATLQgAFS0IABctCAAZLQgAGy0IAB0tCAAfLQgAIS0IACMtCAAlLQgAJy0IACktCAArLQgALS0IAC8tCAAxLQgAMy0IADUtCAA3LQgAOS0IADstCAA9LQgAPy0IAAEtSAADLUgABS1IAActSAAJLUgACy1IAA0tSAAPLUgAES1IABMtSAAVLUgAFy1IABktSAAbLUgAHS1IAB8tSAAhLUgAIy1IACUtSAAnLUgAKS1IACstSAAtLUgALy1IADEtSAAzLUgANS1IADctSAA5LUgAOy1IAD0tSAA/LUgAAS2IAAMtiAAFLYgABy2IAAktiAALLYgADS2IAA8tiAAsq4gALiuIAC+riAAxK4gAMquIADQriAA1q4gANyuIADiriAA6K4gAO6uIAD1riAA/K4gAAOvIAAKryAAEa8gABivIAAfryAAJq8gAC2vIAA0ryAAO68gAEKvIABJryAAUK8gAFevIABeryAAZa8gAGyvIABzryAAeq8gAIGvIACIryAAj68gAJavIACdryAApK8gAKuvIACyryAAua8gAMCvIADHryAAzq8gANWvIADcryAA468gAOqvIADxryAA+K8gAP+vIAAGsCAADbAgABSwIAAbsCAAIrAgACmwIAAwsCAAN7AgAD6wIABFsCAATLAgAFOwIABasCAAYbAgAGiwIABvsCAAdrAgAH2wIACEsCAAi7AgAJKwIACZsCAAoLAgAKewIACusCAAtbAgALywIADDsCAAyrAgANGwIADYsCAA37AgAOawIADtsCAA9LAgAPuwIAACsSAACbEgABCxIAAXsSAAHrEgACWxIAAs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", "base64"); + var wasmModule = new WebAssembly.Module(bytes); + var wasmInstance = new WebAssembly.Instance(wasmModule, imports); + wasm = wasmInstance.exports; + module2.exports.__wasm = wasm; + } +}); + +// src/index.ts +var src_exports = {}; +__export(src_exports, { + transformSync: () => transformSync +}); +module.exports = __toCommonJS(src_exports); + +// src/transform.ts +var import_wasm = __toESM(require_wasm()); +var DEFAULT_OPTIONS = { + mode: "strip-only", + deprecatedTsModuleAsError: true, + // default transform will only work when mode is "transform" + transform: { + verbatimModuleSyntax: true, + nativeClassProperties: true, + noEmptyExport: true, + importNotUsedAsValues: "preserve" + } +}; +function transformSync(source, options) { + const input = `${source ?? ""}`; + return import_wasm.default.transformSync(input, { + ...DEFAULT_OPTIONS, + ...options + }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + transformSync +}); diff --git a/deps/amaro/dist/package.json b/deps/amaro/dist/package.json new file mode 100644 index 00000000000000..edae7b89a05eba --- /dev/null +++ b/deps/amaro/dist/package.json @@ -0,0 +1,19 @@ +{ + "name": "@swc/wasm-typescript", + "collaborators": [ + "강동윤 <kdy1997.dev@gmail.com>" + ], + "description": "wasm module for swc", + "version": "1.13.21", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/swc-project/swc.git" + }, + "files": [ + "wasm.js", + "wasm.d.ts" + ], + "main": "wasm.js", + "types": "wasm.d.ts" +} \ No newline at end of file diff --git a/deps/amaro/dist/register-strip.mjs b/deps/amaro/dist/register-strip.mjs new file mode 100644 index 00000000000000..3a6134ba69a8f9 --- /dev/null +++ b/deps/amaro/dist/register-strip.mjs @@ -0,0 +1,3 @@ +import { register } from "node:module"; + +register("./strip-loader.js", import.meta.url); diff --git a/deps/amaro/dist/register-transform.mjs b/deps/amaro/dist/register-transform.mjs new file mode 100644 index 00000000000000..d8f2aad43babd7 --- /dev/null +++ b/deps/amaro/dist/register-transform.mjs @@ -0,0 +1,12 @@ +import { register } from "node:module"; +import { emitWarning, env, execArgv } from "node:process"; + +const hasSourceMaps = + execArgv.includes("--enable-source-maps") || + env.NODE_OPTIONS?.includes("--enable-source-maps"); + +if (!hasSourceMaps) { + emitWarning("Source maps are disabled, stack traces will not accurate"); +} + +register("./transform-loader.js", import.meta.url); diff --git a/deps/amaro/dist/strip-loader.d.ts b/deps/amaro/dist/strip-loader.d.ts new file mode 100644 index 00000000000000..7e2300c74725c0 --- /dev/null +++ b/deps/amaro/dist/strip-loader.d.ts @@ -0,0 +1,2 @@ +import type { LoadFnOutput, LoadHookContext } from "node:module"; +export declare function load(url: string, context: LoadHookContext, nextLoad: (url: string, context?: LoadHookContext) => LoadFnOutput | Promise<LoadFnOutput>): Promise<LoadFnOutput>; diff --git a/deps/amaro/dist/strip-loader.js b/deps/amaro/dist/strip-loader.js new file mode 100644 index 00000000000000..bcb250f8501af6 --- /dev/null +++ b/deps/amaro/dist/strip-loader.js @@ -0,0 +1,34 @@ +"use strict"; +import { fileURLToPath } from "node:url"; +import { isSwcError, wrapAndReThrowSwcError } from "./errors.js"; +import { transformSync } from "./index.js"; +export async function load(url, context, nextLoad) { + const { format } = context; + if (format?.endsWith("-typescript")) { + try { + const { source } = await nextLoad(url, { + ...context, + format: "module" + }); + const { code } = transformSync(source.toString(), { + mode: "strip-only", + filename: fileURLToPath(url) + }); + return { + format: format.replace("-typescript", ""), + // Source map is not necessary in strip-only mode. However, to map the source + // file in debuggers to the original TypeScript source, add a sourceURL magic + // comment to hint that it is a generated source. + source: `${code} + +//# sourceURL=${url}` + }; + } catch (error) { + if (isSwcError(error)) { + wrapAndReThrowSwcError(error); + } + throw error; + } + } + return nextLoad(url, context); +} diff --git a/deps/amaro/dist/transform-loader.d.ts b/deps/amaro/dist/transform-loader.d.ts new file mode 100644 index 00000000000000..7e2300c74725c0 --- /dev/null +++ b/deps/amaro/dist/transform-loader.d.ts @@ -0,0 +1,2 @@ +import type { LoadFnOutput, LoadHookContext } from "node:module"; +export declare function load(url: string, context: LoadHookContext, nextLoad: (url: string, context?: LoadHookContext) => LoadFnOutput | Promise<LoadFnOutput>): Promise<LoadFnOutput>; diff --git a/deps/amaro/dist/transform-loader.js b/deps/amaro/dist/transform-loader.js new file mode 100644 index 00000000000000..1ef8b3bfa4506b --- /dev/null +++ b/deps/amaro/dist/transform-loader.js @@ -0,0 +1,39 @@ +"use strict"; +import { fileURLToPath } from "node:url"; +import { isSwcError, wrapAndReThrowSwcError } from "./errors.js"; +import { transformSync } from "./index.js"; +export async function load(url, context, nextLoad) { + const { format } = context; + if (format?.endsWith("-typescript")) { + try { + const { source } = await nextLoad(url, { + ...context, + format: "module" + }); + const { code, map } = transformSync(source.toString(), { + mode: "transform", + sourceMap: true, + filename: fileURLToPath(url) + }); + let output = code; + if (map) { + const base64SourceMap = Buffer.from(map).toString("base64"); + output = `${code} + +//# sourceMappingURL=data:application/json;base64,${base64SourceMap}`; + } + return { + format: format.replace("-typescript", ""), + source: `${output} + +//# sourceURL=${url}` + }; + } catch (error) { + if (isSwcError(error)) { + wrapAndReThrowSwcError(error); + } + throw error; + } + } + return nextLoad(url, context); +} diff --git a/deps/amaro/dist/transform.d.ts b/deps/amaro/dist/transform.d.ts new file mode 100644 index 00000000000000..2d10478abe5efb --- /dev/null +++ b/deps/amaro/dist/transform.d.ts @@ -0,0 +1,2 @@ +import type { Options, TransformOutput } from "../lib/wasm"; +export declare function transformSync(source: string, options?: Options): TransformOutput; diff --git a/deps/amaro/lib/wasm.d.ts b/deps/amaro/lib/wasm.d.ts new file mode 100644 index 00000000000000..0fb4e65fd58414 --- /dev/null +++ b/deps/amaro/lib/wasm.d.ts @@ -0,0 +1,73 @@ +/* tslint:disable */ +/* eslint-disable */ + +export declare function transform(src: string | Uint8Array, opts?: Options): Promise<TransformOutput>; +export declare function transformSync(src: string | Uint8Array, opts?: Options): TransformOutput; +export type { Options, TransformOutput }; + + + +interface Options { + module?: boolean; + filename?: string; + mode?: Mode; + transform?: TransformConfig; + deprecatedTsModuleAsError?: boolean; + sourceMap?: boolean; +} + +interface TransformConfig { + /** + * @see https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax + */ + verbatimModuleSyntax?: boolean; + /** + * Native class properties support + */ + nativeClassProperties?: boolean; + importNotUsedAsValues?: "remove" | "preserve"; + /** + * Don't create `export {}`. + * By default, strip creates `export {}` for modules to preserve module + * context. + * + * @see https://github.com/swc-project/swc/issues/1698 + */ + noEmptyExport?: boolean; + importExportAssignConfig?: "Classic" | "Preserve" | "NodeNext" | "EsNext"; + /** + * Disables an optimization that inlines TS enum member values + * within the same module that assumes the enum member values + * are never modified. + * + * Defaults to false. + */ + tsEnumIsMutable?: boolean; + + /** + * Available only on nightly builds. + */ + jsx?: JsxConfig; +} + +interface JsxConfig { + /** + * How to transform JSX. + * + * @default "react-jsx" + */ + transform?: "react-jsx" | "react-jsxdev"; +} + + + +type Mode = "strip-only" | "transform"; + + + +interface TransformOutput { + code: string; + map?: string; +} + + diff --git a/deps/amaro/lib/wasm_bg.wasm.d.ts b/deps/amaro/lib/wasm_bg.wasm.d.ts new file mode 100644 index 00000000000000..550d0edb341201 --- /dev/null +++ b/deps/amaro/lib/wasm_bg.wasm.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const transform: (a: number, b: number) => number; +export const transformSync: (a: number, b: number, c: number) => void; +export const __wbindgen_export_0: (a: number) => void; +export const __wbindgen_export_1: WebAssembly.Table; +export const __wbindgen_export_2: (a: number, b: number) => number; +export const __wbindgen_export_3: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_export_4: (a: number, b: number, c: number) => void; +export const __wbindgen_export_5: (a: number, b: number, c: number, d: number) => void; diff --git a/deps/amaro/package.json b/deps/amaro/package.json new file mode 100644 index 00000000000000..b80444ce5e789b --- /dev/null +++ b/deps/amaro/package.json @@ -0,0 +1,58 @@ +{ + "name": "amaro", + "version": "1.1.5", + "description": "Node.js TypeScript wrapper", + "license": "MIT", + "type": "commonjs", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "homepage": "https://github.com/nodejs/amaro#readme", + "bugs": { + "url": "https://github.com/nodejs/amaro/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/nodejs/amaro.git" + }, + "keywords": [ + "typescript", + "nodejs", + "type stripping", + "strip-types" + ], + "scripts": { + "clean": "rimraf dist", + "lint": "biome lint --write", + "format": "biome format --write", + "ci": "biome ci", + "ci:fix": "biome check --write", + "prepack": "npm run build", + "postpack": "npm run clean", + "build": "node esbuild.config.mjs && tsc --noCheck", + "build:wasm": "node tools/build-wasm.js", + "typecheck": "tsc --noEmit", + "test": "node --test \"**/*.test.js\"", + "test:regenerate": "node --test --test-update-snapshots \"**/*.test.js\"" + }, + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@types/node": "^22.0.0", + "esbuild": "^0.23.0", + "esbuild-plugin-copy": "^2.1.1", + "rimraf": "^6.0.1", + "typescript": "^5.5.3" + }, + "exports": { + ".": "./dist/index.js", + "./strip": "./dist/register-strip.mjs", + "./transform": "./dist/register-transform.mjs" + }, + "files": [ + "dist", + "lib/**/*.d.ts", + "LICENSE.md" + ], + "engines": { + "node": ">=22" + } +} diff --git a/deps/base64/BUILD.gn b/deps/base64/BUILD.gn deleted file mode 100644 index 172dd960910439..00000000000000 --- a/deps/base64/BUILD.gn +++ /dev/null @@ -1,14 +0,0 @@ -############################################################################## -# # -# DO NOT EDIT THIS FILE! # -# # -############################################################################## - -# This file is used by GN for building, which is NOT the build system used for -# building official binaries. -# Please modify the gyp files if you are making changes to build system. - -import("unofficial.gni") - -base64_gn_build("base64") { -} diff --git a/deps/base64/README.md b/deps/base64/README.md deleted file mode 100644 index 330d979e9180bd..00000000000000 --- a/deps/base64/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# base64 - -This project boosts base64 encoding/decoding performance by utilizing SIMD -operations where possible. - -The source is pulled from: https://github.com/aklomp/base64 - -Active development occurs in the default branch (currently named `master`). - -## Updating - -```sh -$ git clone https://github.com/aklomp/base64 -``` diff --git a/deps/base64/base64.gyp b/deps/base64/base64.gyp deleted file mode 100644 index 5d0a0c05dc2a08..00000000000000 --- a/deps/base64/base64.gyp +++ /dev/null @@ -1,221 +0,0 @@ -{ - 'variables': { - 'arm_fpu%': '', - 'target_arch%': '', - 'base64_sources_common': [ - 'base64/include/libbase64.h', - 'base64/lib/arch/generic/codec.c', - 'base64/lib/tables/tables.c', - 'base64/lib/codec_choose.c', - 'base64/lib/codecs.h', - 'base64/lib/lib.c', - ], - }, - 'targets': [ - { - 'target_name': 'base64', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'direct_dependent_settings': { - 'include_dirs': [ 'base64/include' ], - 'defines': [ 'BASE64_STATIC_DEFINE' ], - }, - 'defines': [ 'BASE64_STATIC_DEFINE' ], - 'sources': [ - '<@(base64_sources_common)', - ], - - 'conditions': [ - [ 'arm_fpu=="neon" and target_arch=="arm"', { - 'defines': [ 'HAVE_NEON32=1' ], - 'dependencies': [ 'base64_neon32' ], - }, { - 'sources': [ 'base64/lib/arch/neon32/codec.c' ], - }], - - # arm64 requires NEON, so it's safe to always use it - [ 'target_arch=="arm64"', { - 'defines': [ 'HAVE_NEON64=1' ], - 'dependencies': [ 'base64_neon64' ], - }, { - 'sources': [ 'base64/lib/arch/neon64/codec.c' ], - }], - - # Runtime detection will happen for x86 CPUs - [ 'target_arch in "ia32 x64 x32"', { - 'defines': [ - 'HAVE_SSSE3=1', - 'HAVE_SSE41=1', - 'HAVE_SSE42=1', - 'HAVE_AVX=1', - 'HAVE_AVX2=1', - 'HAVE_AVX512=1', - ], - 'dependencies': [ - 'base64_ssse3', - 'base64_sse41', - 'base64_sse42', - 'base64_avx', - 'base64_avx2', - 'base64_avx512', - ], - }, { - 'sources': [ - 'base64/lib/arch/ssse3/codec.c', - 'base64/lib/arch/sse41/codec.c', - 'base64/lib/arch/sse42/codec.c', - 'base64/lib/arch/avx/codec.c', - 'base64/lib/arch/avx2/codec.c', - 'base64/lib/arch/avx512/codec.c', - ], - }], - ], - }, - - { - 'target_name': 'base64_ssse3', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/ssse3/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_SSSE3=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-mssse3' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-mssse3' ] - }, - }], - ], - }, - - { - 'target_name': 'base64_sse41', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/sse41/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_SSE41=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-msse4.1' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-msse4.1' ] - }, - }], - ], - }, - - { - 'target_name': 'base64_sse42', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/sse42/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_SSE42=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-msse4.2' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-msse4.2' ] - }, - }], - ], - }, - - { - 'target_name': 'base64_avx', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/avx/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_AVX=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-mavx' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-mavx' ] - }, - }, { - 'msvs_settings': { - 'VCCLCompilerTool': { - 'AdditionalOptions': [ - '/arch:AVX' - ], - }, - }, - }], - ], - }, - - { - 'target_name': 'base64_avx2', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/avx2/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_AVX2=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-mavx2' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-mavx2' ] - }, - }, { - 'msvs_settings': { - 'VCCLCompilerTool': { - 'AdditionalOptions': [ - '/arch:AVX2' - ], - }, - }, - }], - ], - }, - - { - 'target_name': 'base64_avx512', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/avx512/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_AVX512=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-mavx512vl', '-mavx512vbmi' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-mavx512vl', '-mavx512vbmi' ] - }, - }, { - 'msvs_settings': { - 'VCCLCompilerTool': { - 'AdditionalOptions': [ - '/arch:AVX512' - ], - }, - }, - }], - ], - }, - - { - 'target_name': 'base64_neon32', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/neon32/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_NEON32=1' ], - 'conditions': [ - [ 'OS!="win"', { - 'cflags': [ '-mfpu=neon' ], - 'xcode_settings': { - 'OTHER_CFLAGS': [ '-mfpu=neon' ] - }, - }], - ], - }, - - { - 'target_name': 'base64_neon64', - 'type': 'static_library', - 'include_dirs': [ 'base64/include', 'base64/lib' ], - 'sources': [ 'base64/lib/arch/neon64/codec.c' ], - 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_NEON64=1' ], - # NEON is required in arm64, so no -mfpu flag is needed - } - - ] -} diff --git a/deps/base64/base64/.editorconfig b/deps/base64/base64/.editorconfig deleted file mode 100644 index f6b4d2a07c192c..00000000000000 --- a/deps/base64/base64/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -# https://EditorConfig.org -root = true - -[*] -charset = utf-8 -insert_final_newline = true -trim_trailing_whitespace = true - -indent_style = tab -tab_width = 8 -indent_size = 8 - -[CMakeLists.txt] -tab_width = 4 -indent_style = space -[*.cmake] -tab_width = 4 -indent_style = space - -[*.py] -tab_width = 4 -indent_style = space diff --git a/deps/base64/base64/.gitignore b/deps/base64/base64/.gitignore deleted file mode 100644 index bb7b160deb3702..00000000000000 --- a/deps/base64/base64/.gitignore +++ /dev/null @@ -1 +0,0 @@ -# Intentionally empty diff --git a/deps/base64/base64/CMakeLists.txt b/deps/base64/base64/CMakeLists.txt deleted file mode 100644 index ff9f6f21e1ee28..00000000000000 --- a/deps/base64/base64/CMakeLists.txt +++ /dev/null @@ -1,290 +0,0 @@ -# Written in 2016-2017, 2021 by Henrik Steffen Gaßmann henrik@gassmann.onl -# -# To the extent possible under law, the author(s) have dedicated all -# copyright and related and neighboring rights to this software to the -# public domain worldwide. This software is distributed without any warranty. -# -# You should have received a copy of the CC0 Public Domain Dedication -# along with this software. If not, see -# -# http://creativecommons.org/publicdomain/zero/1.0/ -# -######################################################################## -cmake_minimum_required(VERSION 3.10.2) - -# new dependent option syntax. We are already compliant -if (POLICY CMP0127) - cmake_policy(SET CMP0127 NEW) -endif() - -project(base64 LANGUAGES C VERSION 0.5.2) - -include(GNUInstallDirs) -include(CMakeDependentOption) -include(CheckIncludeFile) -include(FeatureSummary) -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") - -####################################################################### -# platform detection -include(TargetArch) -detect_target_architecture(_TARGET_ARCH) - -check_include_file(getopt.h HAVE_GETOPT_H) -cmake_dependent_option(BASE64_BUILD_CLI "Build the cli for encoding and decoding" ON "HAVE_GETOPT_H" OFF) -add_feature_info(CLI BASE64_BUILD_CLI "enables the CLI executable for encoding and decoding") - -################################################################### -# optional/conditional dependencies -find_package(OpenMP) -set_package_properties(OpenMP PROPERTIES - TYPE OPTIONAL - PURPOSE "Allows to utilize OpenMP" -) - - -######################################################################## -# Compilation options -option(BASE64_WERROR "Treat warnings as error" ON) -option(BASE64_BUILD_TESTS "add test projects" OFF) -cmake_dependent_option(BASE64_WITH_OpenMP "use OpenMP" OFF "OpenMP_FOUND" OFF) -add_feature_info("OpenMP codec" BASE64_WITH_OpenMP "spreads codec work accross multiple threads") -cmake_dependent_option(BASE64_REGENERATE_TABLES "regenerate the codec tables" OFF "NOT CMAKE_CROSSCOMPILING" OFF) - -set(_IS_X86 "_TARGET_ARCH_x86 OR _TARGET_ARCH_x64") -cmake_dependent_option(BASE64_WITH_SSSE3 "add SSSE 3 codepath" ON ${_IS_X86} OFF) -add_feature_info(SSSE3 BASE64_WITH_SSSE3 "add SSSE 3 codepath") -cmake_dependent_option(BASE64_WITH_SSE41 "add SSE 4.1 codepath" ON ${_IS_X86} OFF) -add_feature_info(SSE4.1 BASE64_WITH_SSE41 "add SSE 4.1 codepath") -cmake_dependent_option(BASE64_WITH_SSE42 "add SSE 4.2 codepath" ON ${_IS_X86} OFF) -add_feature_info(SSE4.2 BASE64_WITH_SSE42 "add SSE 4.2 codepath") -cmake_dependent_option(BASE64_WITH_AVX "add AVX codepath" ON ${_IS_X86} OFF) -add_feature_info(AVX BASE64_WITH_AVX "add AVX codepath") -cmake_dependent_option(BASE64_WITH_AVX2 "add AVX 2 codepath" ON ${_IS_X86} OFF) -add_feature_info(AVX2 BASE64_WITH_AVX2 "add AVX2 codepath") -cmake_dependent_option(BASE64_WITH_AVX512 "add AVX 512 codepath" ON ${_IS_X86} OFF) -add_feature_info(AVX512 BASE64_WITH_AVX512 "add AVX512 codepath") - -cmake_dependent_option(BASE64_WITH_NEON32 "add NEON32 codepath" OFF _TARGET_ARCH_arm OFF) -add_feature_info(NEON32 BASE64_WITH_NEON32 "add NEON32 codepath") - -cmake_dependent_option(BASE64_WITH_NEON64 "add NEON64 codepath" ON _TARGET_ARCH_arm64 OFF) -add_feature_info(NEON64 BASE64_WITH_NEON64 "add NEON64 codepath") - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") - -######################################################################## -# Regenerate headers - -if (BASE64_REGENERATE_TABLES) - # Generate tables in build folder and copy to source tree. - # Don't add the tables in the source tree to the outputs, to avoid `make clean` removing them. - add_executable(table_generator - lib/tables/table_generator.c - ) - - add_custom_command(OUTPUT table_dec_32bit.h "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_dec_32bit.h" - COMMAND table_generator > table_dec_32bit.h - COMMAND "${CMAKE_COMMAND}" -E copy table_dec_32bit.h "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_dec_32bit.h" - DEPENDS table_generator - ) - set(Python_ADDITIONAL_VERSIONS 3) - find_package(PythonInterp REQUIRED) - add_custom_command(OUTPUT table_enc_12bit.h "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_enc_12bit.h" - COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_enc_12bit.py" > table_enc_12bit.h - COMMAND "${CMAKE_COMMAND}" -E copy table_enc_12bit.h "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_enc_12bit.h" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/lib/tables/table_enc_12bit.py" - ) -endif() - - -######################################################################## -# library project -add_library(base64 - # library files - lib/lib.c - lib/codec_choose.c - include/libbase64.h - - lib/tables/tables.c - # Add generated headers explicitly to target, to insert them in the dependency tree - lib/tables/table_dec_32bit.h - lib/tables/table_enc_12bit.h - - # codec implementations - lib/arch/generic/codec.c - - lib/arch/ssse3/codec.c - lib/arch/sse41/codec.c - lib/arch/sse42/codec.c - lib/arch/avx/codec.c - lib/arch/avx2/codec.c - lib/arch/avx512/codec.c - - lib/arch/neon32/codec.c - lib/arch/neon64/codec.c -) - -target_include_directories(base64 - PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> - $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> - PRIVATE - "${CMAKE_CURRENT_BINARY_DIR}" -) - -#################################################################### -# platform/compiler specific configuration -set_target_properties(base64 PROPERTIES - C_STANDARD 99 - C_STANDARD_REQUIRED YES - C_EXTENSIONS OFF - DEFINE_SYMBOL BASE64_EXPORTS - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} -) - -#generate_export_header(base64) -# the following definitions and those in libbase64.h have been -# kept forward compatible in case we ever switch to generate_export_header -if (BUILD_SHARED_LIBS) - set_target_properties(base64 PROPERTIES - C_VISIBILITY_PRESET hidden - ) -else() - target_compile_definitions(base64 - PUBLIC - BASE64_STATIC_DEFINE - ) -endif() - -target_compile_options(base64 PRIVATE - $<$<C_COMPILER_ID:MSVC>: - /W4 - /we4013 # Error warning C4013: 'function' undefined; assuming extern returning int - /we4700 # Error warning C4700: uninitialized local variable - /we4715 # not all control paths return a value - /we4003 # not enough actual parameters for macro - /wd4456 # disable warning C4456: declaration of 'xxx' hides previous local declaration - > - $<$<NOT:$<C_COMPILER_ID:MSVC>>: - -Wall - -Wextra - -Wpedantic - > - $<$<BOOL:${BASE64_WERROR}>:$<IF:$<C_COMPILER_ID:MSVC>,/WX,-Werror>> -) - -target_compile_definitions(base64 PRIVATE - $<$<C_COMPILER_ID:MSVC>: - # remove unnecessary warnings about unchecked iterators - _SCL_SECURE_NO_WARNINGS - > -) - -######################################################################## -# SIMD settings -include(TargetSIMDInstructionSet) -define_SIMD_compile_flags() - -if (_TARGET_ARCH STREQUAL "x86" OR _TARGET_ARCH STREQUAL "x64") - macro(configure_codec _TYPE) - if (BASE64_WITH_${_TYPE}) - string(TOLOWER "${_TYPE}" _DIR) - set_source_files_properties("lib/arch/${_DIR}/codec.c" PROPERTIES - COMPILE_FLAGS "${COMPILE_FLAGS_${_TYPE}}" - ) - - if (${ARGC} GREATER 1 AND MSVC) - set_source_files_properties("lib/arch/${_DIR}/codec.c" PROPERTIES - COMPILE_DEFINITIONS ${ARGV1} - ) - endif() - endif() - endmacro() - - configure_codec(SSSE3 __SSSE3__) - configure_codec(SSE41 __SSSE4_1__) - configure_codec(SSE42 __SSSE4_2__) - configure_codec(AVX) - configure_codec(AVX2) - configure_codec(AVX512) - -elseif (_TARGET_ARCH STREQUAL "arm") - set(BASE64_NEON32_CFLAGS "${COMPILE_FLAGS_NEON32}" CACHE STRING "the NEON32 compile flags (for 'lib/arch/neon32/codec.c')") - mark_as_advanced(BASE64_NEON32_CFLAGS) - - if (BASE64_WITH_NEON32) - set_source_files_properties("lib/arch/neon32/codec.c" PROPERTIES - COMPILE_FLAGS "${BASE64_NEON32_CFLAGS} " - ) - endif() - -#elseif (_TARGET_ARCH STREQUAL "arm64" AND BASE64_WITH_NEON64) - -endif() - -configure_file("${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY) - -######################################################################## -# OpenMP Settings -if (BASE64_WITH_OpenMP) - target_link_libraries(base64 PRIVATE OpenMP::OpenMP_C) -endif() - -######################################################################## -if (BASE64_BUILD_TESTS) - enable_testing() - add_subdirectory(test) -endif() - -######################################################################## -# base64 -if (BASE64_BUILD_CLI) - add_executable(base64-bin - bin/base64.c - ) - target_link_libraries(base64-bin PRIVATE base64) - set_target_properties(base64-bin PROPERTIES - OUTPUT_NAME base64 - ) -endif() - -######################################################################## -# cmake install -install(DIRECTORY include/ TYPE INCLUDE) -install(TARGETS base64 - EXPORT base64-targets - DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) -if (BASE64_BUILD_CLI) - install(TARGETS base64-bin EXPORT base64-targets DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif() - -include(CMakePackageConfigHelpers) -configure_package_config_file(cmake/base64-config.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/base64-config.cmake" - - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" -) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/base64-config-version.cmake" - VERSION ${BASE64_VERSION} - COMPATIBILITY SameMajorVersion -) - -install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/base64-config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/base64-config-version.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" -) - -install(EXPORT base64-targets - NAMESPACE aklomp:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" -) - -######################################################################## -feature_summary(WHAT PACKAGES_FOUND PACKAGES_NOT_FOUND ENABLED_FEATURES DISABLED_FEATURES) diff --git a/deps/base64/base64/LICENSE b/deps/base64/base64/LICENSE deleted file mode 100644 index 109d6521b122c0..00000000000000 --- a/deps/base64/base64/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2005-2007, Nick Galbreath -Copyright (c) 2015-2018, Wojciech Muła -Copyright (c) 2016-2017, Matthieu Darbois -Copyright (c) 2013-2022, Alfred Klomp -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -- Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/base64/base64/Makefile b/deps/base64/base64/Makefile deleted file mode 100644 index bba3fde4dd05bf..00000000000000 --- a/deps/base64/base64/Makefile +++ /dev/null @@ -1,109 +0,0 @@ -CFLAGS += -std=c99 -O3 -Wall -Wextra -pedantic -DBASE64_STATIC_DEFINE - -# Set OBJCOPY if not defined by environment: -OBJCOPY ?= objcopy - -OBJS = \ - lib/arch/avx512/codec.o \ - lib/arch/avx2/codec.o \ - lib/arch/generic/codec.o \ - lib/arch/neon32/codec.o \ - lib/arch/neon64/codec.o \ - lib/arch/ssse3/codec.o \ - lib/arch/sse41/codec.o \ - lib/arch/sse42/codec.o \ - lib/arch/avx/codec.o \ - lib/lib.o \ - lib/codec_choose.o \ - lib/tables/tables.o - -HAVE_AVX512 = 0 -HAVE_AVX2 = 0 -HAVE_NEON32 = 0 -HAVE_NEON64 = 0 -HAVE_SSSE3 = 0 -HAVE_SSE41 = 0 -HAVE_SSE42 = 0 -HAVE_AVX = 0 - -# The user should supply compiler flags for the codecs they want to build. -# Check which codecs we're going to include: -ifdef AVX512_CFLAGS - HAVE_AVX512 = 1 -endif -ifdef AVX2_CFLAGS - HAVE_AVX2 = 1 -endif -ifdef NEON32_CFLAGS - HAVE_NEON32 = 1 -endif -ifdef NEON64_CFLAGS - HAVE_NEON64 = 1 -endif -ifdef SSSE3_CFLAGS - HAVE_SSSE3 = 1 -endif -ifdef SSE41_CFLAGS - HAVE_SSE41 = 1 -endif -ifdef SSE42_CFLAGS - HAVE_SSE42 = 1 -endif -ifdef AVX_CFLAGS - HAVE_AVX = 1 -endif -ifdef OPENMP - CFLAGS += -fopenmp -endif - -TARGET := $(shell $(CC) -dumpmachine) - -.PHONY: all analyze clean - -all: bin/base64 lib/libbase64.o - -bin/base64: bin/base64.o lib/libbase64.o - $(CC) $(CFLAGS) -o $@ $^ - -# Workaround: mangle exported function names on MinGW32. -lib/exports.build.txt: lib/exports.txt -ifeq (i686-w64-mingw32, $(TARGET)) - sed -e 's/^/_/' $< > $@ -else - cp -f $< $@ -endif - -lib/libbase64.o: lib/exports.build.txt $(OBJS) - $(LD) -r -o $@ $(OBJS) - $(OBJCOPY) --keep-global-symbols=$< $@ - -lib/config.h: - @echo "#define HAVE_AVX512 $(HAVE_AVX512)" > $@ - @echo "#define HAVE_AVX2 $(HAVE_AVX2)" >> $@ - @echo "#define HAVE_NEON32 $(HAVE_NEON32)" >> $@ - @echo "#define HAVE_NEON64 $(HAVE_NEON64)" >> $@ - @echo "#define HAVE_SSSE3 $(HAVE_SSSE3)" >> $@ - @echo "#define HAVE_SSE41 $(HAVE_SSE41)" >> $@ - @echo "#define HAVE_SSE42 $(HAVE_SSE42)" >> $@ - @echo "#define HAVE_AVX $(HAVE_AVX)" >> $@ - -$(OBJS): lib/config.h -$(OBJS): CFLAGS += -Ilib - -lib/arch/avx512/codec.o: CFLAGS += $(AVX512_CFLAGS) -lib/arch/avx2/codec.o: CFLAGS += $(AVX2_CFLAGS) -lib/arch/neon32/codec.o: CFLAGS += $(NEON32_CFLAGS) -lib/arch/neon64/codec.o: CFLAGS += $(NEON64_CFLAGS) -lib/arch/ssse3/codec.o: CFLAGS += $(SSSE3_CFLAGS) -lib/arch/sse41/codec.o: CFLAGS += $(SSE41_CFLAGS) -lib/arch/sse42/codec.o: CFLAGS += $(SSE42_CFLAGS) -lib/arch/avx/codec.o: CFLAGS += $(AVX_CFLAGS) - -%.o: %.c - $(CC) $(CFLAGS) -o $@ -c $< - -analyze: clean - scan-build --use-analyzer=`which clang` --status-bugs make - -clean: - rm -f bin/base64 bin/base64.o lib/libbase64.o lib/config.h lib/exports.build.txt $(OBJS) diff --git a/deps/base64/base64/README.md b/deps/base64/base64/README.md deleted file mode 100644 index ae0a914965e101..00000000000000 --- a/deps/base64/base64/README.md +++ /dev/null @@ -1,491 +0,0 @@ -# Fast Base64 stream encoder/decoder - -[![Build Status](https://github.com/aklomp/base64/actions/workflows/test.yml/badge.svg)](https://github.com/aklomp/base64/actions/workflows/test.yml) - -This is an implementation of a base64 stream encoding/decoding library in C99 -with SIMD (AVX2, AVX512, NEON, AArch64/NEON, SSSE3, SSE4.1, SSE4.2, AVX) and -[OpenMP](http://www.openmp.org) acceleration. It also contains wrapper functions -to encode/decode simple length-delimited strings. This library aims to be: - -- FAST; -- easy to use; -- elegant. - -On x86, the library does runtime feature detection. The first time it's called, -the library will determine the appropriate encoding/decoding routines for the -machine. It then remembers them for the lifetime of the program. If your -processor supports AVX2, SSSE3, SSE4.1, SSE4.2 or AVX instructions, the library -will pick an optimized codec that lets it encode/decode 12 or 24 bytes at a -time, which gives a speedup of four or more times compared to the "plain" -bytewise codec. - -AVX512 support is only for encoding at present, utilizing the AVX512 VL and VBMI -instructions. Decoding part reused AVX2 implementations. For CPUs later than -Cannonlake (manufactured in 2018) supports these instructions. - -NEON support is hardcoded to on or off at compile time, because portable -runtime feature detection is unavailable on ARM. - -Even if your processor does not support SIMD instructions, this is a very fast -library. The fallback routine can process 32 or 64 bits of input in one round, -depending on your processor's word width, which still makes it significantly -faster than naive bytewise implementations. On some 64-bit machines, the 64-bit -routines even outperform the SSSE3 ones. - -To the author's knowledge, at the time of original release, this was the only -Base64 library to offer SIMD acceleration. The author wrote -[an article](http://www.alfredklomp.com/programming/sse-base64) explaining one -possible SIMD approach to encoding/decoding Base64. The article can help figure -out what the code is doing, and why. - -Notable features: - -- Really fast on x86 and ARM systems by using SIMD vector processing; -- Can use [OpenMP](http://www.openmp.org) for even more parallel speedups; -- Really fast on other 32 or 64-bit platforms through optimized routines; -- Reads/writes blocks of streaming data; -- Does not dynamically allocate memory; -- Valid C99 that compiles with pedantic options on; -- Re-entrant and threadsafe; -- Unit tested; -- Uses Duff's Device. - -## Acknowledgements - -The original AVX2, NEON and Aarch64/NEON codecs were generously contributed by -[Inkymail](https://github.com/inkymail/base64), who, in their fork, also -implemented some additional features. Their work is slowly being backported -into this project. - -The SSSE3 and AVX2 codecs were substantially improved by using some very clever -optimizations described by Wojciech Muła in a -[series](http://0x80.pl/notesen/2016-01-12-sse-base64-encoding.html) of -[articles](http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html). -His own code is [here](https://github.com/WojciechMula/toys/tree/master/base64). - -The AVX512 encoder is based on code from Wojciech Muła's -[base64simd](https://github.com/WojciechMula/base64simd) library. - -The OpenMP implementation was added by Ferry Toth (@htot) from [Exalon Delft](http://www.exalondelft.nl). - -## Building - -The `lib` directory contains the code for the actual library. -Typing `make` in the toplevel directory will build `lib/libbase64.o` and `bin/base64`. -The first is a single, self-contained object file that you can link into your own project. -The second is a standalone test binary that works similarly to the `base64` system utility. - -The matching header file needed to use this library is in `include/libbase64.h`. - -To compile just the "plain" library without SIMD codecs, type: - -```sh -make lib/libbase64.o -``` - -Optional SIMD codecs can be included by specifying the `AVX2_CFLAGS`, `AVX512_CFLAGS`, -`NEON32_CFLAGS`, `NEON64_CFLAGS`, `SSSE3_CFLAGS`, `SSE41_CFLAGS`, `SSE42_CFLAGS` and/or `AVX_CFLAGS` environment variables. -A typical build invocation on x86 looks like this: - -```sh -AVX2_CFLAGS=-mavx2 SSSE3_CFLAGS=-mssse3 SSE41_CFLAGS=-msse4.1 SSE42_CFLAGS=-msse4.2 AVX_CFLAGS=-mavx make lib/libbase64.o -``` - -### AVX2 - -To build and include the AVX2 codec, set the `AVX2_CFLAGS` environment variable to a value that will turn on AVX2 support in your compiler, typically `-mavx2`. -Example: - -```sh -AVX2_CFLAGS=-mavx2 make -``` - -### AVX512 - -To build and include the AVX512 codec, set the `AVX512_CFLAGS` environment variable to a value that will turn on AVX512 support in your compiler, typically `-mavx512vl -mavx512vbmi`. -Example: - -```sh -AVX512_CFLAGS="-mavx512vl -mavx512vbmi" make -``` - -The codec will only be used if runtime feature detection shows that the target machine supports AVX2. - -### SSSE3 - -To build and include the SSSE3 codec, set the `SSSE3_CFLAGS` environment variable to a value that will turn on SSSE3 support in your compiler, typically `-mssse3`. -Example: - -```sh -SSSE3_CFLAGS=-mssse3 make -``` - -The codec will only be used if runtime feature detection shows that the target machine supports SSSE3. - -### NEON - -This library includes two NEON codecs: one for regular 32-bit ARM and one for the 64-bit AArch64 with NEON, which has double the amount of SIMD registers and can do full 64-byte table lookups. -These codecs encode in 48-byte chunks and decode in massive 64-byte chunks, so they had to be augmented with an uint32/64 codec to stay fast on smaller inputs! - -Use LLVM/Clang for compiling the NEON codecs. -The code generation of at least GCC 4.6 (the version shipped with Raspbian and used for testing) contains a bug when compiling `vstq4_u8()`, and the generated assembly code is of low quality. -NEON intrinsics are a known weak area of GCC. -Clang does a better job. - -NEON support can unfortunately not be portably detected at runtime from userland (the `mrc` instruction is privileged), so the default value for using the NEON codec is determined at compile-time. -But you can do your own runtime detection. -You can include the NEON codec and make it the default, then do a runtime check if the CPU has NEON support, and if not, force a downgrade to non-NEON with `BASE64_FORCE_PLAIN`. - -These are your options: - -1. Don't include NEON support; -2. build NEON support and make it the default, but build all other code without NEON flags so that you can override the default at runtime with `BASE64_FORCE_PLAIN`; -3. build everything with NEON support and make it the default; -4. build everything with NEON support, but don't make it the default (which makes no sense). - -For option 1, simply don't specify any NEON-specific compiler flags at all, like so: - -```sh -CC=clang CFLAGS="-march=armv6" make -``` - -For option 2, keep your `CFLAGS` plain, but set the `NEON32_CFLAGS` environment variable to a value that will build NEON support. -The line below, for instance, will build all the code at ARMv6 level, except for the NEON codec, which is built at ARMv7. -It will also make the NEON codec the default. -For ARMv6 platforms, override that default at runtime with the `BASE64_FORCE_PLAIN` flag. -No ARMv7/NEON code will then be touched. - -```sh -CC=clang CFLAGS="-march=armv6" NEON32_CFLAGS="-march=armv7 -mfpu=neon" make -``` - -For option 3, put everything in your `CFLAGS` and use a stub, but non-empty, `NEON32_CFLAGS`. -This example works for the Raspberry Pi 2B V1.1, which has NEON support: - -```sh -CC=clang CFLAGS="-march=armv7 -mtune=cortex-a7" NEON32_CFLAGS="-mfpu=neon" make -``` - -To build and include the NEON64 codec, use `CFLAGS` as usual to define the platform and set `NEON64_CFLAGS` to a nonempty stub. -(The AArch64 target has mandatory NEON64 support.) -Example: - -```sh -CC=clang CFLAGS="--target=aarch64-linux-gnu -march=armv8-a" NEON64_CFLAGS=" " make -``` - -### OpenMP - -To enable OpenMP on GCC you need to build with `-fopenmp`. This can be by setting the the `OPENMP` environment variable to `1`. - -Example: - -```sh -OPENMP=1 make -``` - -This will let the compiler define `_OPENMP`, which in turn will include the OpenMP optimized `lib_openmp.c` into `lib.c`. - -By default the number of parallel threads will be equal to the number of cores of the processor. -On a quad core with hyperthreading eight cores will be detected, but hyperthreading will not increase the performance. - -To get verbose information about OpenMP start the program with `OMP_DISPLAY_ENV=VERBOSE`, for instance - -```sh -OMP_DISPLAY_ENV=VERBOSE test/benchmark -``` - -To put a limit on the number of threads, start the program with `OMP_THREAD_LIMIT=n`, for instance - -```sh -OMP_THREAD_LIMIT=2 test/benchmark -``` - -An example of running a benchmark with OpenMP, SSSE3 and AVX2 enabled: - -```sh -make clean && OPENMP=1 SSSE3_CFLAGS=-mssse3 AVX2_CFLAGS=-mavx2 make && OPENMP=1 make -C test -``` - -## API reference - -Strings are represented as a pointer and a length; they are not -zero-terminated. This was a conscious design decision. In the decoding step, -relying on zero-termination would make no sense since the output could contain -legitimate zero bytes. In the encoding step, returning the length saves the -overhead of calling `strlen()` on the output. If you insist on the trailing -zero, you can easily add it yourself at the given offset. - -### Flags - -Some API calls take a `flags` argument. -That argument can be used to force the use of a specific codec, even if that codec is a no-op in the current build. -Mainly there for testing purposes, this is also useful on ARM where the only way to do runtime NEON detection is to ask the OS if it's available. -The following constants can be used: - -- `BASE64_FORCE_AVX2` -- `BASE64_FORCE_AVX512` -- `BASE64_FORCE_NEON32` -- `BASE64_FORCE_NEON64` -- `BASE64_FORCE_PLAIN` -- `BASE64_FORCE_SSSE3` -- `BASE64_FORCE_SSE41` -- `BASE64_FORCE_SSE42` -- `BASE64_FORCE_AVX` - -Set `flags` to `0` for the default behavior, which is runtime feature detection on x86, a compile-time fixed codec on ARM, and the plain codec on other platforms. - -### Encoding - -#### base64_encode - -```c -void base64_encode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) ; -``` - -Wrapper function to encode a plain string of given length. -Output is written to `out` without trailing zero. -Output length in bytes is written to `outlen`. -The buffer in `out` has been allocated by the caller and is at least 4/3 the size of the input. - -#### base64_stream_encode_init - -```c -void base64_stream_encode_init - ( struct base64_state *state - , int flags - ) ; -``` - -Call this before calling `base64_stream_encode()` to init the state. - -#### base64_stream_encode - -```c -void base64_stream_encode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) ; -``` - -Encodes the block of data of given length at `src`, into the buffer at `out`. -Caller is responsible for allocating a large enough out-buffer; it must be at least 4/3 the size of the in-buffer, but take some margin. -Places the number of new bytes written into `outlen` (which is set to zero when the function starts). -Does not zero-terminate or finalize the output. - -#### base64_stream_encode_final - -```c -void base64_stream_encode_final - ( struct base64_state *state - , char *out - , size_t *outlen - ) ; -``` - -Finalizes the output begun by previous calls to `base64_stream_encode()`. -Adds the required end-of-stream markers if appropriate. -`outlen` is modified and will contain the number of new bytes written at `out` (which will quite often be zero). - -### Decoding - -#### base64_decode - -```c -int base64_decode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) ; -``` - -Wrapper function to decode a plain string of given length. -Output is written to `out` without trailing zero. Output length in bytes is written to `outlen`. -The buffer in `out` has been allocated by the caller and is at least 3/4 the size of the input. -Returns `1` for success, and `0` when a decode error has occured due to invalid input. -Returns `-1` if the chosen codec is not included in the current build. - -#### base64_stream_decode_init - -```c -void base64_stream_decode_init - ( struct base64_state *state - , int flags - ) ; -``` - -Call this before calling `base64_stream_decode()` to init the state. - -#### base64_stream_decode - -```c -int base64_stream_decode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) ; -``` - -Decodes the block of data of given length at `src`, into the buffer at `out`. -Caller is responsible for allocating a large enough out-buffer; it must be at least 3/4 the size of the in-buffer, but take some margin. -Places the number of new bytes written into `outlen` (which is set to zero when the function starts). -Does not zero-terminate the output. -Returns 1 if all is well, and 0 if a decoding error was found, such as an invalid character. -Returns -1 if the chosen codec is not included in the current build. -Used by the test harness to check whether a codec is available for testing. - -## Examples - -A simple example of encoding a static string to base64 and printing the output -to stdout: - -```c -#include <stdio.h> /* fwrite */ -#include "libbase64.h" - -int main () -{ - char src[] = "hello world"; - char out[20]; - size_t srclen = sizeof(src) - 1; - size_t outlen; - - base64_encode(src, srclen, out, &outlen, 0); - - fwrite(out, outlen, 1, stdout); - - return 0; -} -``` - -A simple example (no error checking, etc) of stream encoding standard input to -standard output: - -```c -#include <stdio.h> -#include "libbase64.h" - -int main () -{ - size_t nread, nout; - char buf[12000], out[16000]; - struct base64_state state; - - // Initialize stream encoder: - base64_stream_encode_init(&state, 0); - - // Read contents of stdin into buffer: - while ((nread = fread(buf, 1, sizeof(buf), stdin)) > 0) { - - // Encode buffer: - base64_stream_encode(&state, buf, nread, out, &nout); - - // If there's output, print it to stdout: - if (nout) { - fwrite(out, nout, 1, stdout); - } - - // If an error occurred, exit the loop: - if (feof(stdin)) { - break; - } - } - - // Finalize encoding: - base64_stream_encode_final(&state, out, &nout); - - // If the finalizing resulted in extra output bytes, print them: - if (nout) { - fwrite(out, nout, 1, stdout); - } - - return 0; -} -``` - -Also see `bin/base64.c` for a simple re-implementation of the `base64` utility. -A file or standard input is fed through the encoder/decoder, and the output is -written to standard output. - -## Tests - -See `tests/` for a small test suite. Testing is automated with -[GitHub Actions](https://github.com/aklomp/base64/actions), which builds and -tests the code across various architectures. - -## Benchmarks - -Benchmarks can be run with the built-in benchmark program as follows: - -```sh -make -C test benchmark <buildflags> && test/benchmark -``` - -It will run an encoding and decoding benchmark for all of the compiled-in codecs. - -The tables below contain some results on random machines. All numbers measured with a 10MB buffer in MB/sec, rounded to the nearest integer. - -\*: Update needed - -x86 processors - -| Processor | Plain enc | Plain dec | SSSE3 enc | SSSE3 dec | AVX enc | AVX dec | AVX2 enc | AVX2 dec | -|-------------------------------------------|----------:|----------:|----------:|----------:|--------:|--------:|---------:|---------:| -| i7-4771 @ 3.5 GHz | 833\* | 1111\* | 3333\* | 4444\* | TBD | TBD | 4999\* | 6666\* | -| i7-4770 @ 3.4 GHz DDR1600 | 1790\* | 3038\* | 4899\* | 4043\* | 4796\* | 5709\* | 4681\* | 6386\* | -| i7-4770 @ 3.4 GHz DDR1600 OPENMP 1 thread | 1784\* | 3041\* | 4945\* | 4035\* | 4776\* | 5719\* | 4661\* | 6294\* | -| i7-4770 @ 3.4 GHz DDR1600 OPENMP 2 thread | 3401\* | 5729\* | 5489\* | 7444\* | 5003\* | 8624\* | 5105\* | 8558\* | -| i7-4770 @ 3.4 GHz DDR1600 OPENMP 4 thread | 4884\* | 7099\* | 4917\* | 7057\* | 4799\* | 7143\* | 4902\* | 7219\* | -| i7-4770 @ 3.4 GHz DDR1600 OPENMP 8 thread | 5212\* | 8849\* | 5284\* | 9099\* | 5289\* | 9220\* | 4849\* | 9200\* | -| i7-4870HQ @ 2.5 GHz | 1471\* | 3066\* | 6721\* | 6962\* | 7015\* | 8267\* | 8328\* | 11576\* | -| i5-4590S @ 3.0 GHz | 3356 | 3197 | 4363 | 6104 | 4243\* | 6233 | 4160\* | 6344 | -| Xeon X5570 @ 2.93 GHz | 2161 | 1508 | 3160 | 3915 | - | - | - | - | -| Pentium4 @ 3.4 GHz | 896 | 740 | - | - | - | - | - | - | -| Atom N270 | 243 | 266 | 508 | 387 | - | - | - | - | -| AMD E-450 | 645 | 564 | 625 | 634 | - | - | - | - | -| Intel Edison @ 500 MHz | 79\* | 92\* | 152\* | 172\* | - | - | - | - | -| Intel Edison @ 500 MHz OPENMP 2 thread | 158\* | 184\* | 300\* | 343\* | - | - | - | - | -| Intel Edison @ 500 MHz (x86-64) | 162 | 119 | 209 | 164 | - | - | - | - | -| Intel Edison @ 500 MHz (x86-64) 2 thread | 319 | 237 | 412 | 329 | - | - | - | - | - -ARM processors - -| Processor | Plain enc | Plain dec | NEON32 enc | NEON32 dec | NEON64 enc | NEON64 dec | -|-------------------------------------------|----------:|----------:|-----------:|-----------:|-----------:|-----------:| -| Raspberry PI B+ V1.2 | 46\* | 40\* | - | - | - | - | -| Raspberry PI 2 B V1.1 | 85 | 141 | 300 | 225 | - | - | -| Apple iPhone SE armv7 | 1056\* | 895\* | 2943\* | 2618\* | - | - | -| Apple iPhone SE arm64 | 1061\* | 1239\* | - | - | 4098\* | 3983\* | - -PowerPC processors - -| Processor | Plain enc | Plain dec | -|-------------------------------------------|----------:|----------:| -| PowerPC E6500 @ 1.8GHz | 270\* | 265\* | - - -Benchmarks on i7-4770 @ 3.4 GHz DDR1600 with varrying buffer sizes: -![Benchmarks](base64-benchmarks.png) - -Note: optimal buffer size to take advantage of the cache is in the range of 100 kB to 1 MB, leading to 12x faster AVX encoding/decoding compared to Plain, or a throughput of 24/27GB/sec. -Also note the performance degradation when the buffer size is less than 10 kB due to thread creation overhead. -To prevent this from happening `lib_openmp.c` defines `OMP_THRESHOLD 20000`, requiring at least a 20000 byte buffer to enable multithreading. - -## License - -This repository is licensed under the -[BSD 2-clause License](http://opensource.org/licenses/BSD-2-Clause). See the -LICENSE file. diff --git a/deps/base64/base64/base64-benchmarks.png b/deps/base64/base64/base64-benchmarks.png deleted file mode 100644 index de0d7d42e8d00e..00000000000000 Binary files a/deps/base64/base64/base64-benchmarks.png and /dev/null differ diff --git a/deps/base64/base64/bin/base64.c b/deps/base64/base64/bin/base64.c deleted file mode 100644 index 0e32ed03762df7..00000000000000 --- a/deps/base64/base64/bin/base64.c +++ /dev/null @@ -1,591 +0,0 @@ -// Test for MinGW. -#if defined(__MINGW32__) || defined(__MINGW64__) -# define MINGW -#endif - -// Decide if the writev(2) system call needs to be emulated as a series of -// write(2) calls. At least MinGW does not support writev(2). -#ifdef MINGW -# define EMULATE_WRITEV -#endif - -// Include the necessary system header when using the system's writev(2). -#ifndef EMULATE_WRITEV -# define _XOPEN_SOURCE // Unlock IOV_MAX -# include <sys/uio.h> -#endif - -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <getopt.h> -#include <errno.h> -#include <limits.h> - -#include "../include/libbase64.h" - -// Size of the buffer for the "raw" (not base64-encoded) data in bytes. -#define BUFFER_RAW_SIZE (1024 * 1024) - -// Size of the buffer for the base64-encoded data in bytes. The base64-encoded -// data is 4/3 the size of the input, with some margin to be sure. -#define BUFFER_ENC_SIZE (BUFFER_RAW_SIZE * 4 / 3 + 16) - -// Global config structure. -struct config { - - // Name by which the program was called on the command line. - const char *name; - - // Name of the input file for logging purposes. - const char *file; - - // Input file handle. - FILE *fp; - - // Wrap width in characters, for encoding only. - size_t wrap; - - // Whether to run in decode mode. - bool decode; - - // Whether to just print the help text and exit. - bool print_help; -}; - -// Input/output buffer structure. -struct buffer { - - // Runtime-allocated buffer for raw (unencoded) data. - char *raw; - - // Runtime-allocated buffer for base64-encoded data. - char *enc; -}; - -// Optionally emulate writev(2) as a series of write calls. -#ifdef EMULATE_WRITEV - -// Quick and dirty definition of IOV_MAX as it is probably not defined. -#ifndef IOV_MAX -# define IOV_MAX 1024 -#endif - -// Quick and dirty definition of this system struct, for local use only. -struct iovec { - - // Opaque data pointer. - void *iov_base; - - // Length of the data in bytes. - size_t iov_len; -}; - -static ssize_t -writev (const int fd, const struct iovec *iov, int iovcnt) -{ - ssize_t r, nwrite = 0; - - // Reset the error marker. - errno = 0; - - while (iovcnt-- > 0) { - - // Write the vector; propagate errors back to the caller. Note - // that this loses information about how much vectors have been - // successfully written, but that also seems to be the case - // with the real function. The API is somewhat flawed. - if ((r = write(fd, iov->iov_base, iov->iov_len)) < 0) { - return r; - } - - // Update the total write count. - nwrite += r; - - // Return early after a partial write; the caller should retry. - if ((size_t) r != iov->iov_len) { - break; - } - - // Move to the next vector. - iov++; - } - - return nwrite; -} - -#endif // EMULATE_WRITEV - -static bool -buffer_alloc (const struct config *config, struct buffer *buf) -{ - if ((buf->raw = malloc(BUFFER_RAW_SIZE)) == NULL || - (buf->enc = malloc(BUFFER_ENC_SIZE)) == NULL) { - free(buf->raw); - fprintf(stderr, "%s: malloc: %s\n", - config->name, strerror(errno)); - return false; - } - - return true; -} - -static void -buffer_free (struct buffer *buf) -{ - free(buf->raw); - free(buf->enc); -} - -static bool -writev_retry (const struct config *config, struct iovec *iov, size_t nvec) -{ - // Writing nothing always succeeds. - if (nvec == 0) { - return true; - } - - while (true) { - ssize_t nwrite; - - // Try to write the vectors to stdout. - if ((nwrite = writev(1, iov, nvec)) < 0) { - - // Retry on EINTR. - if (errno == EINTR) { - continue; - } - - // Quit on other errors. - fprintf(stderr, "%s: writev: %s\n", - config->name, strerror(errno)); - return false; - } - - // The return value of `writev' is the number of bytes written. - // To check for success, we traverse the list and remove all - // written vectors. The call succeeded if the list is empty. - while (true) { - - // Retry if this vector is not or partially written. - if (iov->iov_len > (size_t) nwrite) { - char *base = iov->iov_base; - - iov->iov_base = (size_t) nwrite + base; - iov->iov_len -= (size_t) nwrite; - break; - } - - // Move to the next vector. - nwrite -= iov->iov_len; - iov++; - - // Return successfully if all vectors were written. - if (--nvec == 0) { - return true; - } - } - } -} - -static inline bool -iov_append (const struct config *config, struct iovec *iov, - size_t *nvec, char *base, const size_t len) -{ - // Add the buffer to the IO vector array. - iov[*nvec].iov_base = base; - iov[*nvec].iov_len = len; - - // Increment the array index. Flush the array if it is full. - if (++(*nvec) == IOV_MAX) { - if (writev_retry(config, iov, IOV_MAX) == false) { - return false; - } - *nvec = 0; - } - - return true; -} - -static bool -write_stdout (const struct config *config, const char *buf, size_t len) -{ - while (len > 0) { - ssize_t nwrite; - - // Try to write the buffer to stdout. - if ((nwrite = write(1, buf, len)) < 0) { - - // Retry on EINTR. - if (errno == EINTR) { - continue; - } - - // Quit on other errors. - fprintf(stderr, "%s: write: %s\n", - config->name, strerror(errno)); - return false; - } - - // Update the buffer position. - buf += (size_t) nwrite; - len -= (size_t) nwrite; - } - - return true; -} - -static bool -write_wrapped (const struct config *config, char *buf, size_t len) -{ - static size_t col = 0; - - // Special case: if buf is NULL, print final trailing newline. - if (buf == NULL) { - if (config->wrap > 0 && col > 0) { - return write_stdout(config, "\n", 1); - } - return true; - } - - // If no wrap width is given, write the entire buffer. - if (config->wrap == 0) { - return write_stdout(config, buf, len); - } - - // Statically allocated IO vector buffer. - static struct iovec iov[IOV_MAX]; - size_t nvec = 0; - - while (len > 0) { - - // Number of characters to fill the current line. - size_t nwrite = config->wrap - col; - - // Do not write more data than is available. - if (nwrite > len) { - nwrite = len; - } - - // Append the data to the IO vector array. - if (iov_append(config, iov, &nvec, buf, nwrite) == false) { - return false; - } - - // Advance the buffer. - len -= nwrite; - buf += nwrite; - col += nwrite; - - // If the line is full, append a newline. - if (col == config->wrap) { - if (iov_append(config, iov, &nvec, "\n", 1) == false) { - return false; - } - col = 0; - } - } - - // Write the remaining vectors. - if (writev_retry(config, iov, nvec) == false) { - return false; - } - - return true; -} - -static bool -encode (const struct config *config, struct buffer *buf) -{ - size_t nread, nout; - struct base64_state state; - - // Initialize the encoder's state structure. - base64_stream_encode_init(&state, 0); - - // Read raw data into the buffer. - while ((nread = fread(buf->raw, 1, BUFFER_RAW_SIZE, config->fp)) > 0) { - - // Encode the raw input into the encoded buffer. - base64_stream_encode(&state, buf->raw, nread, buf->enc, &nout); - - // Append the encoded data to the output stream. - if (write_wrapped(config, buf->enc, nout) == false) { - return false; - } - } - - // Check for stream errors. - if (ferror(config->fp)) { - fprintf(stderr, "%s: %s: read error\n", - config->name, config->file); - return false; - } - - // Finalize the encoding by adding proper stream terminators. - base64_stream_encode_final(&state, buf->enc, &nout); - - // Append this tail to the output stream. - if (write_wrapped(config, buf->enc, nout) == false) { - return false; - } - - // Print optional trailing newline. - if (write_wrapped(config, NULL, 0) == false) { - return false; - } - - return true; -} - -static inline size_t -find_newline (const char *p, const size_t avail) -{ - // This is very naive and can probably be improved by vectorization. - for (size_t len = 0; len < avail; len++) { - if (p[len] == '\n') { - return len; - } - } - - return avail; -} - -static bool -decode (const struct config *config, struct buffer *buf) -{ - size_t avail; - struct base64_state state; - - // Initialize the decoder's state structure. - base64_stream_decode_init(&state, 0); - - // Read encoded data into the buffer. Use the smallest buffer size to - // be on the safe side: the decoded output will fit the raw buffer. - while ((avail = fread(buf->enc, 1, BUFFER_RAW_SIZE, config->fp)) > 0) { - char *start = buf->enc; - char *outbuf = buf->raw; - size_t ototal = 0; - - // By popular demand, this utility tries to be bug-compatible - // with GNU `base64'. That includes silently ignoring newlines - // in the input. Tokenize the input on newline characters. - while (avail > 0) { - - // Find the offset of the next newline character, which - // is also the length of the next chunk. - size_t outlen, len = find_newline(start, avail); - - // Ignore empty chunks. - if (len == 0) { - start++; - avail--; - continue; - } - - // Decode the chunk into the raw buffer. - if (base64_stream_decode(&state, start, len, - outbuf, &outlen) == 0) { - fprintf(stderr, "%s: %s: decoding error\n", - config->name, config->file); - return false; - } - - // Update the output buffer pointer and total size. - outbuf += outlen; - ototal += outlen; - - // Bail out if the whole string has been consumed. - if (len == avail) { - break; - } - - // Move the start pointer past the newline. - start += len + 1; - avail -= len + 1; - } - - // Append the raw data to the output stream. - if (write_stdout(config, buf->raw, ototal) == false) { - return false; - } - } - - // Check for stream errors. - if (ferror(config->fp)) { - fprintf(stderr, "%s: %s: read error\n", - config->name, config->file); - return false; - } - - return true; -} - -static void -usage (FILE *fp, const struct config *config) -{ - const char *usage = - "Usage: %s [OPTION]... [FILE]\n" - "If no FILE is given or is specified as '-', " - "read from standard input.\n" - "Options:\n" - " -d, --decode Decode a base64 stream.\n" - " -h, --help Print this help text.\n" - " -w, --wrap=COLS Wrap encoded lines at this column. " - "Default 76, 0 to disable.\n"; - - fprintf(fp, usage, config->name); -} - -static bool -get_wrap (struct config *config, const char *str) -{ - char *eptr; - - // Reject empty strings. - if (*str == '\0') { - return false; - } - - // Convert the input string to a signed long. - const long wrap = strtol(str, &eptr, 10); - - // Reject negative numbers. - if (wrap < 0) { - return false; - } - - // Reject strings containing non-digits. - if (*eptr != '\0') { - return false; - } - - config->wrap = (size_t) wrap; - return true; -} - -static bool -parse_opts (int argc, char **argv, struct config *config) -{ - int c; - static const struct option opts[] = { - { "decode", no_argument, NULL, 'd' }, - { "help", no_argument, NULL, 'h' }, - { "wrap", required_argument, NULL, 'w' }, - { NULL } - }; - - // Remember the program's name. - config->name = *argv; - - // Parse command line options. - while ((c = getopt_long(argc, argv, ":dhw:", opts, NULL)) != -1) { - switch (c) { - case 'd': - config->decode = true; - break; - - case 'h': - config->print_help = true; - return true; - - case 'w': - if (get_wrap(config, optarg) == false) { - fprintf(stderr, - "%s: invalid wrap value '%s'\n", - config->name, optarg); - return false; - } - break; - - case ':': - fprintf(stderr, "%s: missing argument for '%c'\n", - config->name, optopt); - return false; - - default: - fprintf(stderr, "%s: unknown option '%c'\n", - config->name, optopt); - return false; - } - } - - // Return successfully if no filename was given. - if (optind >= argc) { - return true; - } - - // Return unsuccessfully if more than one filename was given. - if (optind + 1 < argc) { - fprintf(stderr, "%s: too many files\n", config->name); - return false; - } - - // For compatibility with GNU Coreutils base64, treat a filename of '-' - // as standard input. - if (strcmp(argv[optind], "-") == 0) { - return true; - } - - // Save the name of the file. - config->file = argv[optind]; - - // Open the file. - if ((config->fp = fopen(config->file, "rb")) == NULL) { - fprintf(stderr, "%s: %s: %s\n", - config->name, config->file, strerror(errno)); - return false; - } - - return true; -} - -int -main (int argc, char **argv) -{ - // Default program config. - struct config config = { - .file = "stdin", - .fp = stdin, - .wrap = 76, - .decode = false, - .print_help = false, - }; - struct buffer buf; - - // Parse options from the command line. - if (parse_opts(argc, argv, &config) == false) { - usage(stderr, &config); - return 1; - } - - // Return early if the user just wanted the help text. - if (config.print_help) { - usage(stdout, &config); - return 0; - } - - // Allocate buffers. - if (buffer_alloc(&config, &buf) == false) { - return 1; - } - - // Encode or decode the input based on the user's choice. - const bool ret = config.decode - ? decode(&config, &buf) - : encode(&config, &buf); - - // Free the buffers. - buffer_free(&buf); - - // Close the input file. - fclose(config.fp); - - // Close the output stream. - fclose(stdout); - - // That's all, folks. - return ret ? 0 : 1; -} diff --git a/deps/base64/base64/cmake/Modules/TargetArch.cmake b/deps/base64/base64/cmake/Modules/TargetArch.cmake deleted file mode 100644 index d5b0a50bb1fc5d..00000000000000 --- a/deps/base64/base64/cmake/Modules/TargetArch.cmake +++ /dev/null @@ -1,30 +0,0 @@ -# Written in 2017 by Henrik Steffen Gaßmann henrik@gassmann.onl -# -# To the extent possible under law, the author(s) have dedicated all -# copyright and related and neighboring rights to this software to the -# public domain worldwide. This software is distributed without any warranty. -# -# You should have received a copy of the CC0 Public Domain Dedication -# along with this software. If not, see -# -# http://creativecommons.org/publicdomain/zero/1.0/ -# -######################################################################## - -set(TARGET_ARCHITECTURE_TEST_FILE "${CMAKE_CURRENT_LIST_DIR}/../test-arch.c") - -function(detect_target_architecture OUTPUT_VARIABLE) - message(STATUS "${CMAKE_CURRENT_LIST_DIR}") - try_compile(_IGNORED "${CMAKE_CURRENT_BINARY_DIR}" - "${TARGET_ARCHITECTURE_TEST_FILE}" - OUTPUT_VARIABLE _LOG - ) - - string(REGEX MATCH "##arch=([^#]+)##" _IGNORED "${_LOG}") - - set(${OUTPUT_VARIABLE} "${CMAKE_MATCH_1}" PARENT_SCOPE) - set("${OUTPUT_VARIABLE}_${CMAKE_MATCH_1}" 1 PARENT_SCOPE) - if (CMAKE_MATCH_1 STREQUAL "unknown") - message(WARNING "could not detect the target architecture.") - endif() -endfunction() diff --git a/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake b/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake deleted file mode 100644 index 485080905319a6..00000000000000 --- a/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# Written in 2016-2017 by Henrik Steffen Gaßmann henrik@gassmann.onl -# -# To the extent possible under law, the author(s) have dedicated all -# copyright and related and neighboring rights to this software to the -# public domain worldwide. This software is distributed without any warranty. -# -# You should have received a copy of the CC0 Public Domain Dedication -# along with this software. If not, see -# -# http://creativecommons.org/publicdomain/zero/1.0/ -# -######################################################################## - -######################################################################## -# compiler flags definition -macro(define_SIMD_compile_flags) - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang") - # x86 - set(COMPILE_FLAGS_SSSE3 "-mssse3") - set(COMPILE_FLAGS_SSE41 "-msse4.1") - set(COMPILE_FLAGS_SSE42 "-msse4.2") - set(COMPILE_FLAGS_AVX "-mavx") - set(COMPILE_FLAGS_AVX2 "-mavx2") - set(COMPILE_FLAGS_AVX512 "-mavx512vl -mavx512vbmi") - - #arm - set(COMPILE_FLAGS_NEON32 "-mfpu=neon") - elseif(MSVC) - set(COMPILE_FLAGS_SSSE3 " ") - set(COMPILE_FLAGS_SSE41 " ") - set(COMPILE_FLAGS_SSE42 " ") - set(COMPILE_FLAGS_AVX "/arch:AVX") - set(COMPILE_FLAGS_AVX2 "/arch:AVX2") - set(COMPILE_FLAGS_AVX512 "/arch:AVX512") - endif() -endmacro(define_SIMD_compile_flags) diff --git a/deps/base64/base64/cmake/base64-config.cmake.in b/deps/base64/base64/cmake/base64-config.cmake.in deleted file mode 100644 index d009bf73ad7475..00000000000000 --- a/deps/base64/base64/cmake/base64-config.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -@PACKAGE_INIT@ - -include("${CMAKE_CURRENT_LIST_DIR}/base64-targets.cmake") - -check_required_components(base64) diff --git a/deps/base64/base64/cmake/config.h.in b/deps/base64/base64/cmake/config.h.in deleted file mode 100644 index c7faa94bc0903d..00000000000000 --- a/deps/base64/base64/cmake/config.h.in +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef BASE64_CONFIG_H -#define BASE64_CONFIG_H - -#cmakedefine01 BASE64_WITH_SSSE3 -#define HAVE_SSSE3 BASE64_WITH_SSSE3 - -#cmakedefine01 BASE64_WITH_SSE41 -#define HAVE_SSE41 BASE64_WITH_SSE41 - -#cmakedefine01 BASE64_WITH_SSE42 -#define HAVE_SSE42 BASE64_WITH_SSE42 - -#cmakedefine01 BASE64_WITH_AVX -#define HAVE_AVX BASE64_WITH_AVX - -#cmakedefine01 BASE64_WITH_AVX2 -#define HAVE_AVX2 BASE64_WITH_AVX2 - -#cmakedefine01 BASE64_WITH_AVX512 -#define HAVE_AVX512 BASE64_WITH_AVX512 - -#cmakedefine01 BASE64_WITH_NEON32 -#define HAVE_NEON32 BASE64_WITH_NEON32 - -#cmakedefine01 BASE64_WITH_NEON64 -#define HAVE_NEON64 BASE64_WITH_NEON64 - -#endif // BASE64_CONFIG_H diff --git a/deps/base64/base64/cmake/test-arch.c b/deps/base64/base64/cmake/test-arch.c deleted file mode 100644 index b438405e358b5e..00000000000000 --- a/deps/base64/base64/cmake/test-arch.c +++ /dev/null @@ -1,35 +0,0 @@ -// Written in 2017 by Henrik Steffen Gaßmann henrik@gassmann.onl -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to the -// public domain worldwide. This software is distributed without any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. If not, see -// -// http://creativecommons.org/publicdomain/zero/1.0/ -// -//////////////////////////////////////////////////////////////////////////////// - -// ARM 64-Bit -#if defined(__aarch64__) -#error ##arch=arm64## - -// ARM 32-Bit -#elif defined(__arm__) \ - || defined(_M_ARM) -#error ##arch=arm## - -// x86 64-Bit -#elif defined(__x86_64__) \ - || defined(_M_X64) -#error ##arch=x64## - -// x86 32-Bit -#elif defined(__i386__) \ - || defined(_M_IX86) -#error ##arch=x86## - -#else -#error ##arch=unknown## -#endif diff --git a/deps/base64/base64/include/libbase64.h b/deps/base64/base64/include/libbase64.h deleted file mode 100644 index c5908973c5e73c..00000000000000 --- a/deps/base64/base64/include/libbase64.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef LIBBASE64_H -#define LIBBASE64_H - -#include <stddef.h> /* size_t */ - - -#if defined(_WIN32) || defined(__CYGWIN__) -#define BASE64_SYMBOL_IMPORT __declspec(dllimport) -#define BASE64_SYMBOL_EXPORT __declspec(dllexport) -#define BASE64_SYMBOL_PRIVATE - -#elif __GNUC__ >= 4 -#define BASE64_SYMBOL_IMPORT __attribute__ ((visibility ("default"))) -#define BASE64_SYMBOL_EXPORT __attribute__ ((visibility ("default"))) -#define BASE64_SYMBOL_PRIVATE __attribute__ ((visibility ("hidden"))) - -#else -#define BASE64_SYMBOL_IMPORT -#define BASE64_SYMBOL_EXPORT -#define BASE64_SYMBOL_PRIVATE -#endif - -#if defined(BASE64_STATIC_DEFINE) -#define BASE64_EXPORT -#define BASE64_NO_EXPORT - -#else -#if defined(BASE64_EXPORTS) // defined if we are building the shared library -#define BASE64_EXPORT BASE64_SYMBOL_EXPORT - -#else -#define BASE64_EXPORT BASE64_SYMBOL_IMPORT -#endif - -#define BASE64_NO_EXPORT BASE64_SYMBOL_PRIVATE -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -/* These are the flags that can be passed in the `flags` argument. The values - * below force the use of a given codec, even if that codec is a no-op in the - * current build. Used in testing. Set to 0 for the default behavior, which is - * runtime feature detection on x86, a compile-time fixed codec on ARM, and - * the plain codec on other platforms: */ -#define BASE64_FORCE_AVX2 (1 << 0) -#define BASE64_FORCE_NEON32 (1 << 1) -#define BASE64_FORCE_NEON64 (1 << 2) -#define BASE64_FORCE_PLAIN (1 << 3) -#define BASE64_FORCE_SSSE3 (1 << 4) -#define BASE64_FORCE_SSE41 (1 << 5) -#define BASE64_FORCE_SSE42 (1 << 6) -#define BASE64_FORCE_AVX (1 << 7) -#define BASE64_FORCE_AVX512 (1 << 8) - -struct base64_state { - int eof; - int bytes; - int flags; - unsigned char carry; -}; - -/* Wrapper function to encode a plain string of given length. Output is written - * to *out without trailing zero. Output length in bytes is written to *outlen. - * The buffer in `out` has been allocated by the caller and is at least 4/3 the - * size of the input. See above for `flags`; set to 0 for default operation: */ -void BASE64_EXPORT base64_encode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) ; - -/* Call this before calling base64_stream_encode() to init the state. See above - * for `flags`; set to 0 for default operation: */ -void BASE64_EXPORT base64_stream_encode_init - ( struct base64_state *state - , int flags - ) ; - -/* Encodes the block of data of given length at `src`, into the buffer at - * `out`. Caller is responsible for allocating a large enough out-buffer; it - * must be at least 4/3 the size of the in-buffer, but take some margin. Places - * the number of new bytes written into `outlen` (which is set to zero when the - * function starts). Does not zero-terminate or finalize the output. */ -void BASE64_EXPORT base64_stream_encode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) ; - -/* Finalizes the output begun by previous calls to `base64_stream_encode()`. - * Adds the required end-of-stream markers if appropriate. `outlen` is modified - * and will contain the number of new bytes written at `out` (which will quite - * often be zero). */ -void BASE64_EXPORT base64_stream_encode_final - ( struct base64_state *state - , char *out - , size_t *outlen - ) ; - -/* Wrapper function to decode a plain string of given length. Output is written - * to *out without trailing zero. Output length in bytes is written to *outlen. - * The buffer in `out` has been allocated by the caller and is at least 3/4 the - * size of the input. See above for `flags`, set to 0 for default operation: */ -int BASE64_EXPORT base64_decode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) ; - -/* Call this before calling base64_stream_decode() to init the state. See above - * for `flags`; set to 0 for default operation: */ -void BASE64_EXPORT base64_stream_decode_init - ( struct base64_state *state - , int flags - ) ; - -/* Decodes the block of data of given length at `src`, into the buffer at - * `out`. Caller is responsible for allocating a large enough out-buffer; it - * must be at least 3/4 the size of the in-buffer, but take some margin. Places - * the number of new bytes written into `outlen` (which is set to zero when the - * function starts). Does not zero-terminate the output. Returns 1 if all is - * well, and 0 if a decoding error was found, such as an invalid character. - * Returns -1 if the chosen codec is not included in the current build. Used by - * the test harness to check whether a codec is available for testing. */ -int BASE64_EXPORT base64_stream_decode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) ; - -#ifdef __cplusplus -} -#endif - -#endif /* LIBBASE64_H */ diff --git a/deps/base64/base64/lib/arch/avx/codec.c b/deps/base64/base64/lib/arch/avx/codec.c deleted file mode 100644 index b069618e29463e..00000000000000 --- a/deps/base64/base64/lib/arch/avx/codec.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_AVX -#include <immintrin.h> - -// Only enable inline assembly on supported compilers and on 64-bit CPUs. -#ifndef BASE64_AVX_USE_ASM -# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 -# define BASE64_AVX_USE_ASM 1 -# else -# define BASE64_AVX_USE_ASM 0 -# endif -#endif - -#include "../ssse3/dec_reshuffle.c" -#include "../ssse3/dec_loop.c" - -#if BASE64_AVX_USE_ASM -# include "enc_loop_asm.c" -#else -# include "../ssse3/enc_translate.c" -# include "../ssse3/enc_reshuffle.c" -# include "../ssse3/enc_loop.c" -#endif - -#endif // HAVE_AVX - -BASE64_ENC_FUNCTION(avx) -{ -#if HAVE_AVX - #include "../generic/enc_head.c" - - // For supported compilers, use a hand-optimized inline assembly - // encoder. Otherwise fall back on the SSSE3 encoder, but compiled with - // AVX flags to generate better optimized AVX code. - -#if BASE64_AVX_USE_ASM - enc_loop_avx(&s, &slen, &o, &olen); -#else - enc_loop_ssse3(&s, &slen, &o, &olen); -#endif - - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(avx) -{ -#if HAVE_AVX - #include "../generic/dec_head.c" - dec_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/avx/enc_loop_asm.c b/deps/base64/base64/lib/arch/avx/enc_loop_asm.c deleted file mode 100644 index 979269af57740e..00000000000000 --- a/deps/base64/base64/lib/arch/avx/enc_loop_asm.c +++ /dev/null @@ -1,264 +0,0 @@ -// Apologies in advance for combining the preprocessor with inline assembly, -// two notoriously gnarly parts of C, but it was necessary to avoid a lot of -// code repetition. The preprocessor is used to template large sections of -// inline assembly that differ only in the registers used. If the code was -// written out by hand, it would become very large and hard to audit. - -// Generate a block of inline assembly that loads register R0 from memory. The -// offset at which the register is loaded is set by the given round. -#define LOAD(R0, ROUND) \ - "vlddqu ("#ROUND" * 12)(%[src]), %["R0"] \n\t" - -// Generate a block of inline assembly that deinterleaves and shuffles register -// R0 using preloaded constants. Outputs in R0 and R1. -#define SHUF(R0, R1, R2) \ - "vpshufb %[lut0], %["R0"], %["R1"] \n\t" \ - "vpand %["R1"], %[msk0], %["R2"] \n\t" \ - "vpand %["R1"], %[msk2], %["R1"] \n\t" \ - "vpmulhuw %["R2"], %[msk1], %["R2"] \n\t" \ - "vpmullw %["R1"], %[msk3], %["R1"] \n\t" \ - "vpor %["R1"], %["R2"], %["R1"] \n\t" - -// Generate a block of inline assembly that takes R0 and R1 and translates -// their contents to the base64 alphabet, using preloaded constants. -#define TRAN(R0, R1, R2) \ - "vpsubusb %[n51], %["R1"], %["R0"] \n\t" \ - "vpcmpgtb %[n25], %["R1"], %["R2"] \n\t" \ - "vpsubb %["R2"], %["R0"], %["R0"] \n\t" \ - "vpshufb %["R0"], %[lut1], %["R2"] \n\t" \ - "vpaddb %["R1"], %["R2"], %["R0"] \n\t" - -// Generate a block of inline assembly that stores the given register R0 at an -// offset set by the given round. -#define STOR(R0, ROUND) \ - "vmovdqu %["R0"], ("#ROUND" * 16)(%[dst]) \n\t" - -// Generate a block of inline assembly that generates a single self-contained -// encoder round: fetch the data, process it, and store the result. Then update -// the source and destination pointers. -#define ROUND() \ - LOAD("a", 0) \ - SHUF("a", "b", "c") \ - TRAN("a", "b", "c") \ - STOR("a", 0) \ - "add $12, %[src] \n\t" \ - "add $16, %[dst] \n\t" - -// Define a macro that initiates a three-way interleaved encoding round by -// preloading registers a, b and c from memory. -// The register graph shows which registers are in use during each step, and -// is a visual aid for choosing registers for that step. Symbol index: -// -// + indicates that a register is loaded by that step. -// | indicates that a register is in use and must not be touched. -// - indicates that a register is decommissioned by that step. -// x indicates that a register is used as a temporary by that step. -// V indicates that a register is an input or output to the macro. -// -#define ROUND_3_INIT() /* a b c d e f */ \ - LOAD("a", 0) /* + */ \ - SHUF("a", "d", "e") /* | + x */ \ - LOAD("b", 1) /* | + | */ \ - TRAN("a", "d", "e") /* | | - x */ \ - LOAD("c", 2) /* V V V */ - -// Define a macro that translates, shuffles and stores the input registers A, B -// and C, and preloads registers D, E and F for the next round. -// This macro can be arbitrarily daisy-chained by feeding output registers D, E -// and F back into the next round as input registers A, B and C. The macro -// carefully interleaves memory operations with data operations for optimal -// pipelined performance. - -#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - LOAD(D, (ROUND + 3)) /* V V V + */ \ - SHUF(B, E, F) /* | | | | + x */ \ - STOR(A, (ROUND + 0)) /* - | | | | */ \ - TRAN(B, E, F) /* | | | - x */ \ - LOAD(E, (ROUND + 4)) /* | | | + */ \ - SHUF(C, A, F) /* + | | | | x */ \ - STOR(B, (ROUND + 1)) /* | - | | | */ \ - TRAN(C, A, F) /* - | | | x */ \ - LOAD(F, (ROUND + 5)) /* | | | + */ \ - SHUF(D, A, B) /* + x | | | | */ \ - STOR(C, (ROUND + 2)) /* | - | | | */ \ - TRAN(D, A, B) /* - x V V V */ - -// Define a macro that terminates a ROUND_3 macro by taking pre-loaded -// registers D, E and F, and translating, shuffling and storing them. -#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - SHUF(E, A, B) /* + x V V V */ \ - STOR(D, (ROUND + 3)) /* | - | | */ \ - TRAN(E, A, B) /* - x | | */ \ - SHUF(F, C, D) /* + x | | */ \ - STOR(E, (ROUND + 4)) /* | - | */ \ - TRAN(F, C, D) /* - x | */ \ - STOR(F, (ROUND + 5)) /* - */ - -// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. -#define ROUND_3_A(ROUND) \ - ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") - -// Define a type B round. Inputs and outputs are swapped with regard to type A. -#define ROUND_3_B(ROUND) \ - ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") - -// Terminating macro for a type A round. -#define ROUND_3_A_LAST(ROUND) \ - ROUND_3_A(ROUND) \ - ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") - -// Terminating macro for a type B round. -#define ROUND_3_B_LAST(ROUND) \ - ROUND_3_B(ROUND) \ - ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") - -// Suppress clang's warning that the literal string in the asm statement is -// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 -// compilers). It may be true, but the goal here is not C99 portability. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" - -static inline void -enc_loop_avx (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - // For a clearer explanation of the algorithm used by this function, - // please refer to the plain (not inline assembly) implementation. This - // function follows the same basic logic. - - if (*slen < 16) { - return; - } - - // Process blocks of 12 bytes at a time. Input is read in blocks of 16 - // bytes, so "reserve" four bytes from the input buffer to ensure that - // we never read beyond the end of the input buffer. - size_t rounds = (*slen - 4) / 12; - - *slen -= rounds * 12; // 12 bytes consumed per round - *olen += rounds * 16; // 16 bytes produced per round - - // Number of times to go through the 36x loop. - size_t loops = rounds / 36; - - // Number of rounds remaining after the 36x loop. - rounds %= 36; - - // Lookup tables. - const __m128i lut0 = _mm_set_epi8( - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); - - const __m128i lut1 = _mm_setr_epi8( - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); - - // Temporary registers. - __m128i a, b, c, d, e, f; - - __asm__ volatile ( - - // If there are 36 rounds or more, enter a 36x unrolled loop of - // interleaved encoding rounds. The rounds interleave memory - // operations (load/store) with data operations (table lookups, - // etc) to maximize pipeline throughput. - " test %[loops], %[loops] \n\t" - " jz 18f \n\t" - " jmp 36f \n\t" - " \n\t" - ".balign 64 \n\t" - "36: " ROUND_3_INIT() - " " ROUND_3_A( 0) - " " ROUND_3_B( 3) - " " ROUND_3_A( 6) - " " ROUND_3_B( 9) - " " ROUND_3_A(12) - " " ROUND_3_B(15) - " " ROUND_3_A(18) - " " ROUND_3_B(21) - " " ROUND_3_A(24) - " " ROUND_3_B(27) - " " ROUND_3_A_LAST(30) - " add $(12 * 36), %[src] \n\t" - " add $(16 * 36), %[dst] \n\t" - " dec %[loops] \n\t" - " jnz 36b \n\t" - - // Enter an 18x unrolled loop for rounds of 18 or more. - "18: cmp $18, %[rounds] \n\t" - " jl 9f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B(3) - " " ROUND_3_A(6) - " " ROUND_3_B(9) - " " ROUND_3_A_LAST(12) - " sub $18, %[rounds] \n\t" - " add $(12 * 18), %[src] \n\t" - " add $(16 * 18), %[dst] \n\t" - - // Enter a 9x unrolled loop for rounds of 9 or more. - "9: cmp $9, %[rounds] \n\t" - " jl 6f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B_LAST(3) - " sub $9, %[rounds] \n\t" - " add $(12 * 9), %[src] \n\t" - " add $(16 * 9), %[dst] \n\t" - - // Enter a 6x unrolled loop for rounds of 6 or more. - "6: cmp $6, %[rounds] \n\t" - " jl 55f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A_LAST(0) - " sub $6, %[rounds] \n\t" - " add $(12 * 6), %[src] \n\t" - " add $(16 * 6), %[dst] \n\t" - - // Dispatch the remaining rounds 0..5. - "55: cmp $3, %[rounds] \n\t" - " jg 45f \n\t" - " je 3f \n\t" - " cmp $1, %[rounds] \n\t" - " jg 2f \n\t" - " je 1f \n\t" - " jmp 0f \n\t" - - "45: cmp $4, %[rounds] \n\t" - " je 4f \n\t" - - // Block of non-interlaced encoding rounds, which can each - // individually be jumped to. Rounds fall through to the next. - "5: " ROUND() - "4: " ROUND() - "3: " ROUND() - "2: " ROUND() - "1: " ROUND() - "0: \n\t" - - // Outputs (modified). - : [rounds] "+r" (rounds), - [loops] "+r" (loops), - [src] "+r" (*s), - [dst] "+r" (*o), - [a] "=&x" (a), - [b] "=&x" (b), - [c] "=&x" (c), - [d] "=&x" (d), - [e] "=&x" (e), - [f] "=&x" (f) - - // Inputs (not modified). - : [lut0] "x" (lut0), - [lut1] "x" (lut1), - [msk0] "x" (_mm_set1_epi32(0x0FC0FC00)), - [msk1] "x" (_mm_set1_epi32(0x04000040)), - [msk2] "x" (_mm_set1_epi32(0x003F03F0)), - [msk3] "x" (_mm_set1_epi32(0x01000010)), - [n51] "x" (_mm_set1_epi8(51)), - [n25] "x" (_mm_set1_epi8(25)) - - // Clobbers. - : "cc", "memory" - ); -} - -#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/avx2/codec.c b/deps/base64/base64/lib/arch/avx2/codec.c deleted file mode 100644 index 8a2aa4a6071500..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/codec.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_AVX2 -#include <immintrin.h> - -// Only enable inline assembly on supported compilers and on 64-bit CPUs. -#ifndef BASE64_AVX2_USE_ASM -# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 -# define BASE64_AVX2_USE_ASM 1 -# else -# define BASE64_AVX2_USE_ASM 0 -# endif -#endif - -#include "dec_reshuffle.c" -#include "dec_loop.c" - -#if BASE64_AVX2_USE_ASM -# include "enc_loop_asm.c" -#else -# include "enc_translate.c" -# include "enc_reshuffle.c" -# include "enc_loop.c" -#endif - -#endif // HAVE_AVX2 - -BASE64_ENC_FUNCTION(avx2) -{ -#if HAVE_AVX2 - #include "../generic/enc_head.c" - enc_loop_avx2(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(avx2) -{ -#if HAVE_AVX2 - #include "../generic/dec_head.c" - dec_loop_avx2(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/avx2/dec_loop.c b/deps/base64/base64/lib/arch/avx2/dec_loop.c deleted file mode 100644 index f959fc4ba2be7e..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/dec_loop.c +++ /dev/null @@ -1,110 +0,0 @@ -static inline int -dec_loop_avx2_inner (const uint8_t **s, uint8_t **o, size_t *rounds) -{ - const __m256i lut_lo = _mm256_setr_epi8( - 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x13, 0x1A, 0x1B, 0x1B, 0x1B, 0x1A, - 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x13, 0x1A, 0x1B, 0x1B, 0x1B, 0x1A); - - const __m256i lut_hi = _mm256_setr_epi8( - 0x10, 0x10, 0x01, 0x02, 0x04, 0x08, 0x04, 0x08, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x01, 0x02, 0x04, 0x08, 0x04, 0x08, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10); - - const __m256i lut_roll = _mm256_setr_epi8( - 0, 16, 19, 4, -65, -65, -71, -71, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 19, 4, -65, -65, -71, -71, - 0, 0, 0, 0, 0, 0, 0, 0); - - const __m256i mask_2F = _mm256_set1_epi8(0x2F); - - // Load input: - __m256i str = _mm256_loadu_si256((__m256i *) *s); - - // See the SSSE3 decoder for an explanation of the algorithm. - const __m256i hi_nibbles = _mm256_and_si256(_mm256_srli_epi32(str, 4), mask_2F); - const __m256i lo_nibbles = _mm256_and_si256(str, mask_2F); - const __m256i hi = _mm256_shuffle_epi8(lut_hi, hi_nibbles); - const __m256i lo = _mm256_shuffle_epi8(lut_lo, lo_nibbles); - - if (!_mm256_testz_si256(lo, hi)) { - return 0; - } - - const __m256i eq_2F = _mm256_cmpeq_epi8(str, mask_2F); - const __m256i roll = _mm256_shuffle_epi8(lut_roll, _mm256_add_epi8(eq_2F, hi_nibbles)); - - // Now simply add the delta values to the input: - str = _mm256_add_epi8(str, roll); - - // Reshuffle the input to packed 12-byte output format: - str = dec_reshuffle(str); - - // Store the output: - _mm256_storeu_si256((__m256i *) *o, str); - - *s += 32; - *o += 24; - *rounds -= 1; - - return 1; -} - -static inline void -dec_loop_avx2 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 45) { - return; - } - - // Process blocks of 32 bytes per round. Because 8 extra zero bytes are - // written after the output, ensure that there will be at least 13 - // bytes of input data left to cover the gap. (11 data bytes and up to - // two end-of-string markers.) - size_t rounds = (*slen - 13) / 32; - - *slen -= rounds * 32; // 32 bytes consumed per round - *olen += rounds * 24; // 24 bytes produced per round - - do { - if (rounds >= 8) { - if (dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 4) { - if (dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 2) { - if (dec_loop_avx2_inner(s, o, &rounds) && - dec_loop_avx2_inner(s, o, &rounds)) { - continue; - } - break; - } - dec_loop_avx2_inner(s, o, &rounds); - break; - - } while (rounds > 0); - - // Adjust for any rounds that were skipped: - *slen += rounds * 32; - *olen -= rounds * 24; -} diff --git a/deps/base64/base64/lib/arch/avx2/dec_reshuffle.c b/deps/base64/base64/lib/arch/avx2/dec_reshuffle.c deleted file mode 100644 index f3518098191ca4..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/dec_reshuffle.c +++ /dev/null @@ -1,34 +0,0 @@ -static inline __m256i -dec_reshuffle (const __m256i in) -{ - // in, lower lane, bits, upper case are most significant bits, lower - // case are least significant bits: - // 00llllll 00kkkkLL 00jjKKKK 00JJJJJJ - // 00iiiiii 00hhhhII 00ggHHHH 00GGGGGG - // 00ffffff 00eeeeFF 00ddEEEE 00DDDDDD - // 00cccccc 00bbbbCC 00aaBBBB 00AAAAAA - - const __m256i merge_ab_and_bc = _mm256_maddubs_epi16(in, _mm256_set1_epi32(0x01400140)); - // 0000kkkk LLllllll 0000JJJJ JJjjKKKK - // 0000hhhh IIiiiiii 0000GGGG GGggHHHH - // 0000eeee FFffffff 0000DDDD DDddEEEE - // 0000bbbb CCcccccc 0000AAAA AAaaBBBB - - __m256i out = _mm256_madd_epi16(merge_ab_and_bc, _mm256_set1_epi32(0x00011000)); - // 00000000 JJJJJJjj KKKKkkkk LLllllll - // 00000000 GGGGGGgg HHHHhhhh IIiiiiii - // 00000000 DDDDDDdd EEEEeeee FFffffff - // 00000000 AAAAAAaa BBBBbbbb CCcccccc - - // Pack bytes together in each lane: - out = _mm256_shuffle_epi8(out, _mm256_setr_epi8( - 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1, - 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1)); - // 00000000 00000000 00000000 00000000 - // LLllllll KKKKkkkk JJJJJJjj IIiiiiii - // HHHHhhhh GGGGGGgg FFffffff EEEEeeee - // DDDDDDdd CCcccccc BBBBbbbb AAAAAAaa - - // Pack lanes: - return _mm256_permutevar8x32_epi32(out, _mm256_setr_epi32(0, 1, 2, 4, 5, 6, -1, -1)); -} diff --git a/deps/base64/base64/lib/arch/avx2/enc_loop.c b/deps/base64/base64/lib/arch/avx2/enc_loop.c deleted file mode 100644 index b9e2736fc828bd..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/enc_loop.c +++ /dev/null @@ -1,89 +0,0 @@ -static inline void -enc_loop_avx2_inner_first (const uint8_t **s, uint8_t **o) -{ - // First load is done at s - 0 to not get a segfault: - __m256i src = _mm256_loadu_si256((__m256i *) *s); - - // Shift by 4 bytes, as required by enc_reshuffle: - src = _mm256_permutevar8x32_epi32(src, _mm256_setr_epi32(0, 0, 1, 2, 3, 4, 5, 6)); - - // Reshuffle, translate, store: - src = enc_reshuffle(src); - src = enc_translate(src); - _mm256_storeu_si256((__m256i *) *o, src); - - // Subsequent loads will be done at s - 4, set pointer for next round: - *s += 20; - *o += 32; -} - -static inline void -enc_loop_avx2_inner (const uint8_t **s, uint8_t **o) -{ - // Load input: - __m256i src = _mm256_loadu_si256((__m256i *) *s); - - // Reshuffle, translate, store: - src = enc_reshuffle(src); - src = enc_translate(src); - _mm256_storeu_si256((__m256i *) *o, src); - - *s += 24; - *o += 32; -} - -static inline void -enc_loop_avx2 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 32) { - return; - } - - // Process blocks of 24 bytes at a time. Because blocks are loaded 32 - // bytes at a time an offset of -4, ensure that there will be at least - // 4 remaining bytes after the last round, so that the final read will - // not pass beyond the bounds of the input buffer: - size_t rounds = (*slen - 4) / 24; - - *slen -= rounds * 24; // 24 bytes consumed per round - *olen += rounds * 32; // 32 bytes produced per round - - // The first loop iteration requires special handling to ensure that - // the read, which is done at an offset, does not underflow the buffer: - enc_loop_avx2_inner_first(s, o); - rounds--; - - while (rounds > 0) { - if (rounds >= 8) { - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_avx2_inner(s, o); - enc_loop_avx2_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_avx2_inner(s, o); - break; - } - - // Add the offset back: - *s += 4; -} diff --git a/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c b/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c deleted file mode 100644 index eb775a1d1f03d0..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c +++ /dev/null @@ -1,291 +0,0 @@ -// Apologies in advance for combining the preprocessor with inline assembly, -// two notoriously gnarly parts of C, but it was necessary to avoid a lot of -// code repetition. The preprocessor is used to template large sections of -// inline assembly that differ only in the registers used. If the code was -// written out by hand, it would become very large and hard to audit. - -// Generate a block of inline assembly that loads register R0 from memory. The -// offset at which the register is loaded is set by the given round and a -// constant offset. -#define LOAD(R0, ROUND, OFFSET) \ - "vlddqu ("#ROUND" * 24 + "#OFFSET")(%[src]), %["R0"] \n\t" - -// Generate a block of inline assembly that deinterleaves and shuffles register -// R0 using preloaded constants. Outputs in R0 and R1. -#define SHUF(R0, R1, R2) \ - "vpshufb %[lut0], %["R0"], %["R1"] \n\t" \ - "vpand %["R1"], %[msk0], %["R2"] \n\t" \ - "vpand %["R1"], %[msk2], %["R1"] \n\t" \ - "vpmulhuw %["R2"], %[msk1], %["R2"] \n\t" \ - "vpmullw %["R1"], %[msk3], %["R1"] \n\t" \ - "vpor %["R1"], %["R2"], %["R1"] \n\t" - -// Generate a block of inline assembly that takes R0 and R1 and translates -// their contents to the base64 alphabet, using preloaded constants. -#define TRAN(R0, R1, R2) \ - "vpsubusb %[n51], %["R1"], %["R0"] \n\t" \ - "vpcmpgtb %[n25], %["R1"], %["R2"] \n\t" \ - "vpsubb %["R2"], %["R0"], %["R0"] \n\t" \ - "vpshufb %["R0"], %[lut1], %["R2"] \n\t" \ - "vpaddb %["R1"], %["R2"], %["R0"] \n\t" - -// Generate a block of inline assembly that stores the given register R0 at an -// offset set by the given round. -#define STOR(R0, ROUND) \ - "vmovdqu %["R0"], ("#ROUND" * 32)(%[dst]) \n\t" - -// Generate a block of inline assembly that generates a single self-contained -// encoder round: fetch the data, process it, and store the result. Then update -// the source and destination pointers. -#define ROUND() \ - LOAD("a", 0, -4) \ - SHUF("a", "b", "c") \ - TRAN("a", "b", "c") \ - STOR("a", 0) \ - "add $24, %[src] \n\t" \ - "add $32, %[dst] \n\t" - -// Define a macro that initiates a three-way interleaved encoding round by -// preloading registers a, b and c from memory. -// The register graph shows which registers are in use during each step, and -// is a visual aid for choosing registers for that step. Symbol index: -// -// + indicates that a register is loaded by that step. -// | indicates that a register is in use and must not be touched. -// - indicates that a register is decommissioned by that step. -// x indicates that a register is used as a temporary by that step. -// V indicates that a register is an input or output to the macro. -// -#define ROUND_3_INIT() /* a b c d e f */ \ - LOAD("a", 0, -4) /* + */ \ - SHUF("a", "d", "e") /* | + x */ \ - LOAD("b", 1, -4) /* | + | */ \ - TRAN("a", "d", "e") /* | | - x */ \ - LOAD("c", 2, -4) /* V V V */ - -// Define a macro that translates, shuffles and stores the input registers A, B -// and C, and preloads registers D, E and F for the next round. -// This macro can be arbitrarily daisy-chained by feeding output registers D, E -// and F back into the next round as input registers A, B and C. The macro -// carefully interleaves memory operations with data operations for optimal -// pipelined performance. - -#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - LOAD(D, (ROUND + 3), -4) /* V V V + */ \ - SHUF(B, E, F) /* | | | | + x */ \ - STOR(A, (ROUND + 0)) /* - | | | | */ \ - TRAN(B, E, F) /* | | | - x */ \ - LOAD(E, (ROUND + 4), -4) /* | | | + */ \ - SHUF(C, A, F) /* + | | | | x */ \ - STOR(B, (ROUND + 1)) /* | - | | | */ \ - TRAN(C, A, F) /* - | | | x */ \ - LOAD(F, (ROUND + 5), -4) /* | | | + */ \ - SHUF(D, A, B) /* + x | | | | */ \ - STOR(C, (ROUND + 2)) /* | - | | | */ \ - TRAN(D, A, B) /* - x V V V */ - -// Define a macro that terminates a ROUND_3 macro by taking pre-loaded -// registers D, E and F, and translating, shuffling and storing them. -#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - SHUF(E, A, B) /* + x V V V */ \ - STOR(D, (ROUND + 3)) /* | - | | */ \ - TRAN(E, A, B) /* - x | | */ \ - SHUF(F, C, D) /* + x | | */ \ - STOR(E, (ROUND + 4)) /* | - | */ \ - TRAN(F, C, D) /* - x | */ \ - STOR(F, (ROUND + 5)) /* - */ - -// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. -#define ROUND_3_A(ROUND) \ - ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") - -// Define a type B round. Inputs and outputs are swapped with regard to type A. -#define ROUND_3_B(ROUND) \ - ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") - -// Terminating macro for a type A round. -#define ROUND_3_A_LAST(ROUND) \ - ROUND_3_A(ROUND) \ - ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") - -// Terminating macro for a type B round. -#define ROUND_3_B_LAST(ROUND) \ - ROUND_3_B(ROUND) \ - ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") - -// Suppress clang's warning that the literal string in the asm statement is -// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 -// compilers). It may be true, but the goal here is not C99 portability. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" - -static inline void -enc_loop_avx2 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - // For a clearer explanation of the algorithm used by this function, - // please refer to the plain (not inline assembly) implementation. This - // function follows the same basic logic. - - if (*slen < 32) { - return; - } - - // Process blocks of 24 bytes at a time. Because blocks are loaded 32 - // bytes at a time an offset of -4, ensure that there will be at least - // 4 remaining bytes after the last round, so that the final read will - // not pass beyond the bounds of the input buffer. - size_t rounds = (*slen - 4) / 24; - - *slen -= rounds * 24; // 24 bytes consumed per round - *olen += rounds * 32; // 32 bytes produced per round - - // Pre-decrement the number of rounds to get the number of rounds - // *after* the first round, which is handled as a special case. - rounds--; - - // Number of times to go through the 36x loop. - size_t loops = rounds / 36; - - // Number of rounds remaining after the 36x loop. - rounds %= 36; - - // Lookup tables. - const __m256i lut0 = _mm256_set_epi8( - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, - 14, 15, 13, 14, 11, 12, 10, 11, 8, 9, 7, 8, 5, 6, 4, 5); - - const __m256i lut1 = _mm256_setr_epi8( - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0, - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); - - // Temporary registers. - __m256i a, b, c, d, e; - - // Temporary register f doubles as the shift mask for the first round. - __m256i f = _mm256_setr_epi32(0, 0, 1, 2, 3, 4, 5, 6); - - __asm__ volatile ( - - // The first loop iteration requires special handling to ensure - // that the read, which is normally done at an offset of -4, - // does not underflow the buffer. Load the buffer at an offset - // of 0 and permute the input to achieve the same effect. - LOAD("a", 0, 0) - "vpermd %[a], %[f], %[a] \n\t" - - // Perform the standard shuffling and translation steps. - SHUF("a", "b", "c") - TRAN("a", "b", "c") - - // Store the result and increment the source and dest pointers. - "vmovdqu %[a], (%[dst]) \n\t" - "add $24, %[src] \n\t" - "add $32, %[dst] \n\t" - - // If there are 36 rounds or more, enter a 36x unrolled loop of - // interleaved encoding rounds. The rounds interleave memory - // operations (load/store) with data operations (table lookups, - // etc) to maximize pipeline throughput. - " test %[loops], %[loops] \n\t" - " jz 18f \n\t" - " jmp 36f \n\t" - " \n\t" - ".balign 64 \n\t" - "36: " ROUND_3_INIT() - " " ROUND_3_A( 0) - " " ROUND_3_B( 3) - " " ROUND_3_A( 6) - " " ROUND_3_B( 9) - " " ROUND_3_A(12) - " " ROUND_3_B(15) - " " ROUND_3_A(18) - " " ROUND_3_B(21) - " " ROUND_3_A(24) - " " ROUND_3_B(27) - " " ROUND_3_A_LAST(30) - " add $(24 * 36), %[src] \n\t" - " add $(32 * 36), %[dst] \n\t" - " dec %[loops] \n\t" - " jnz 36b \n\t" - - // Enter an 18x unrolled loop for rounds of 18 or more. - "18: cmp $18, %[rounds] \n\t" - " jl 9f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B(3) - " " ROUND_3_A(6) - " " ROUND_3_B(9) - " " ROUND_3_A_LAST(12) - " sub $18, %[rounds] \n\t" - " add $(24 * 18), %[src] \n\t" - " add $(32 * 18), %[dst] \n\t" - - // Enter a 9x unrolled loop for rounds of 9 or more. - "9: cmp $9, %[rounds] \n\t" - " jl 6f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B_LAST(3) - " sub $9, %[rounds] \n\t" - " add $(24 * 9), %[src] \n\t" - " add $(32 * 9), %[dst] \n\t" - - // Enter a 6x unrolled loop for rounds of 6 or more. - "6: cmp $6, %[rounds] \n\t" - " jl 55f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A_LAST(0) - " sub $6, %[rounds] \n\t" - " add $(24 * 6), %[src] \n\t" - " add $(32 * 6), %[dst] \n\t" - - // Dispatch the remaining rounds 0..5. - "55: cmp $3, %[rounds] \n\t" - " jg 45f \n\t" - " je 3f \n\t" - " cmp $1, %[rounds] \n\t" - " jg 2f \n\t" - " je 1f \n\t" - " jmp 0f \n\t" - - "45: cmp $4, %[rounds] \n\t" - " je 4f \n\t" - - // Block of non-interlaced encoding rounds, which can each - // individually be jumped to. Rounds fall through to the next. - "5: " ROUND() - "4: " ROUND() - "3: " ROUND() - "2: " ROUND() - "1: " ROUND() - "0: \n\t" - - // Outputs (modified). - : [rounds] "+r" (rounds), - [loops] "+r" (loops), - [src] "+r" (*s), - [dst] "+r" (*o), - [a] "=&x" (a), - [b] "=&x" (b), - [c] "=&x" (c), - [d] "=&x" (d), - [e] "=&x" (e), - [f] "+x" (f) - - // Inputs (not modified). - : [lut0] "x" (lut0), - [lut1] "x" (lut1), - [msk0] "x" (_mm256_set1_epi32(0x0FC0FC00)), - [msk1] "x" (_mm256_set1_epi32(0x04000040)), - [msk2] "x" (_mm256_set1_epi32(0x003F03F0)), - [msk3] "x" (_mm256_set1_epi32(0x01000010)), - [n51] "x" (_mm256_set1_epi8(51)), - [n25] "x" (_mm256_set1_epi8(25)) - - // Clobbers. - : "cc", "memory" - ); -} - -#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/avx2/enc_reshuffle.c b/deps/base64/base64/lib/arch/avx2/enc_reshuffle.c deleted file mode 100644 index ba166903e9e153..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/enc_reshuffle.c +++ /dev/null @@ -1,83 +0,0 @@ -static inline __m256i -enc_reshuffle (const __m256i input) -{ - // Translation of the SSSE3 reshuffling algorithm to AVX2. This one - // works with shifted (4 bytes) input in order to be able to work - // efficiently in the two 128-bit lanes. - - // Input, bytes MSB to LSB: - // 0 0 0 0 x w v u t s r q p o n m - // l k j i h g f e d c b a 0 0 0 0 - - const __m256i in = _mm256_shuffle_epi8(input, _mm256_set_epi8( - 10, 11, 9, 10, - 7, 8, 6, 7, - 4, 5, 3, 4, - 1, 2, 0, 1, - - 14, 15, 13, 14, - 11, 12, 10, 11, - 8, 9, 7, 8, - 5, 6, 4, 5)); - // in, bytes MSB to LSB: - // w x v w - // t u s t - // q r p q - // n o m n - // k l j k - // h i g h - // e f d e - // b c a b - - const __m256i t0 = _mm256_and_si256(in, _mm256_set1_epi32(0x0FC0FC00)); - // bits, upper case are most significant bits, lower case are least - // significant bits. - // 0000wwww XX000000 VVVVVV00 00000000 - // 0000tttt UU000000 SSSSSS00 00000000 - // 0000qqqq RR000000 PPPPPP00 00000000 - // 0000nnnn OO000000 MMMMMM00 00000000 - // 0000kkkk LL000000 JJJJJJ00 00000000 - // 0000hhhh II000000 GGGGGG00 00000000 - // 0000eeee FF000000 DDDDDD00 00000000 - // 0000bbbb CC000000 AAAAAA00 00000000 - - const __m256i t1 = _mm256_mulhi_epu16(t0, _mm256_set1_epi32(0x04000040)); - // 00000000 00wwwwXX 00000000 00VVVVVV - // 00000000 00ttttUU 00000000 00SSSSSS - // 00000000 00qqqqRR 00000000 00PPPPPP - // 00000000 00nnnnOO 00000000 00MMMMMM - // 00000000 00kkkkLL 00000000 00JJJJJJ - // 00000000 00hhhhII 00000000 00GGGGGG - // 00000000 00eeeeFF 00000000 00DDDDDD - // 00000000 00bbbbCC 00000000 00AAAAAA - - const __m256i t2 = _mm256_and_si256(in, _mm256_set1_epi32(0x003F03F0)); - // 00000000 00xxxxxx 000000vv WWWW0000 - // 00000000 00uuuuuu 000000ss TTTT0000 - // 00000000 00rrrrrr 000000pp QQQQ0000 - // 00000000 00oooooo 000000mm NNNN0000 - // 00000000 00llllll 000000jj KKKK0000 - // 00000000 00iiiiii 000000gg HHHH0000 - // 00000000 00ffffff 000000dd EEEE0000 - // 00000000 00cccccc 000000aa BBBB0000 - - const __m256i t3 = _mm256_mullo_epi16(t2, _mm256_set1_epi32(0x01000010)); - // 00xxxxxx 00000000 00vvWWWW 00000000 - // 00uuuuuu 00000000 00ssTTTT 00000000 - // 00rrrrrr 00000000 00ppQQQQ 00000000 - // 00oooooo 00000000 00mmNNNN 00000000 - // 00llllll 00000000 00jjKKKK 00000000 - // 00iiiiii 00000000 00ggHHHH 00000000 - // 00ffffff 00000000 00ddEEEE 00000000 - // 00cccccc 00000000 00aaBBBB 00000000 - - return _mm256_or_si256(t1, t3); - // 00xxxxxx 00wwwwXX 00vvWWWW 00VVVVVV - // 00uuuuuu 00ttttUU 00ssTTTT 00SSSSSS - // 00rrrrrr 00qqqqRR 00ppQQQQ 00PPPPPP - // 00oooooo 00nnnnOO 00mmNNNN 00MMMMMM - // 00llllll 00kkkkLL 00jjKKKK 00JJJJJJ - // 00iiiiii 00hhhhII 00ggHHHH 00GGGGGG - // 00ffffff 00eeeeFF 00ddEEEE 00DDDDDD - // 00cccccc 00bbbbCC 00aaBBBB 00AAAAAA -} diff --git a/deps/base64/base64/lib/arch/avx2/enc_translate.c b/deps/base64/base64/lib/arch/avx2/enc_translate.c deleted file mode 100644 index 46173cd1f0cbf1..00000000000000 --- a/deps/base64/base64/lib/arch/avx2/enc_translate.c +++ /dev/null @@ -1,30 +0,0 @@ -static inline __m256i -enc_translate (const __m256i in) -{ - // A lookup table containing the absolute offsets for all ranges: - const __m256i lut = _mm256_setr_epi8( - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0, - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); - - // Translate values 0..63 to the Base64 alphabet. There are five sets: - // # From To Abs Index Characters - // 0 [0..25] [65..90] +65 0 ABCDEFGHIJKLMNOPQRSTUVWXYZ - // 1 [26..51] [97..122] +71 1 abcdefghijklmnopqrstuvwxyz - // 2 [52..61] [48..57] -4 [2..11] 0123456789 - // 3 [62] [43] -19 12 + - // 4 [63] [47] -16 13 / - - // Create LUT indices from the input. The index for range #0 is right, - // others are 1 less than expected: - __m256i indices = _mm256_subs_epu8(in, _mm256_set1_epi8(51)); - - // mask is 0xFF (-1) for range #[1..4] and 0x00 for range #0: - const __m256i mask = _mm256_cmpgt_epi8(in, _mm256_set1_epi8(25)); - - // Subtract -1, so add 1 to indices for range #[1..4]. All indices are - // now correct: - indices = _mm256_sub_epi8(indices, mask); - - // Add offsets to input values: - return _mm256_add_epi8(in, _mm256_shuffle_epi8(lut, indices)); -} diff --git a/deps/base64/base64/lib/arch/avx512/codec.c b/deps/base64/base64/lib/arch/avx512/codec.c deleted file mode 100644 index 664120853d4316..00000000000000 --- a/deps/base64/base64/lib/arch/avx512/codec.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_AVX512 -#include <immintrin.h> - -#include "../avx2/dec_reshuffle.c" -#include "../avx2/dec_loop.c" -#include "enc_reshuffle_translate.c" -#include "enc_loop.c" - -#endif // HAVE_AVX512 - -BASE64_ENC_FUNCTION(avx512) -{ -#if HAVE_AVX512 - #include "../generic/enc_head.c" - enc_loop_avx512(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -// Reuse AVX2 decoding. Not supporting AVX512 at present -BASE64_DEC_FUNCTION(avx512) -{ -#if HAVE_AVX512 - #include "../generic/dec_head.c" - dec_loop_avx2(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/avx512/enc_loop.c b/deps/base64/base64/lib/arch/avx512/enc_loop.c deleted file mode 100644 index 4c71e160ae820a..00000000000000 --- a/deps/base64/base64/lib/arch/avx512/enc_loop.c +++ /dev/null @@ -1,61 +0,0 @@ -static inline void -enc_loop_avx512_inner (const uint8_t **s, uint8_t **o) -{ - // Load input. - __m512i src = _mm512_loadu_si512((__m512i *) *s); - - // Reshuffle, translate, store. - src = enc_reshuffle_translate(src); - _mm512_storeu_si512((__m512i *) *o, src); - - *s += 48; - *o += 64; -} - -static inline void -enc_loop_avx512 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 64) { - return; - } - - // Process blocks of 48 bytes at a time. Because blocks are loaded 64 - // bytes at a time, ensure that there will be at least 24 remaining - // bytes after the last round, so that the final read will not pass - // beyond the bounds of the input buffer. - size_t rounds = (*slen - 24) / 48; - - *slen -= rounds * 48; // 48 bytes consumed per round - *olen += rounds * 64; // 64 bytes produced per round - - while (rounds > 0) { - if (rounds >= 8) { - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_avx512_inner(s, o); - enc_loop_avx512_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_avx512_inner(s, o); - break; - } -} diff --git a/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c b/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c deleted file mode 100644 index 5c332bb24ca4e3..00000000000000 --- a/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c +++ /dev/null @@ -1,50 +0,0 @@ -// AVX512 algorithm is based on permutevar and multishift. The code is based on -// https://github.com/WojciechMula/base64simd which is under BSD-2 license. - -static inline __m512i -enc_reshuffle_translate (const __m512i input) -{ - // 32-bit input - // [ 0 0 0 0 0 0 0 0|c1 c0 d5 d4 d3 d2 d1 d0| - // b3 b2 b1 b0 c5 c4 c3 c2|a5 a4 a3 a2 a1 a0 b5 b4] - // output order [1, 2, 0, 1] - // [b3 b2 b1 b0 c5 c4 c3 c2|c1 c0 d5 d4 d3 d2 d1 d0| - // a5 a4 a3 a2 a1 a0 b5 b4|b3 b2 b1 b0 c3 c2 c1 c0] - - const __m512i shuffle_input = _mm512_setr_epi32(0x01020001, - 0x04050304, - 0x07080607, - 0x0a0b090a, - 0x0d0e0c0d, - 0x10110f10, - 0x13141213, - 0x16171516, - 0x191a1819, - 0x1c1d1b1c, - 0x1f201e1f, - 0x22232122, - 0x25262425, - 0x28292728, - 0x2b2c2a2b, - 0x2e2f2d2e); - - // Reorder bytes - // [b3 b2 b1 b0 c5 c4 c3 c2|c1 c0 d5 d4 d3 d2 d1 d0| - // a5 a4 a3 a2 a1 a0 b5 b4|b3 b2 b1 b0 c3 c2 c1 c0] - const __m512i in = _mm512_permutexvar_epi8(shuffle_input, input); - - // After multishift a single 32-bit lane has following layout - // [c1 c0 d5 d4 d3 d2 d1 d0|b1 b0 c5 c4 c3 c2 c1 c0| - // a1 a0 b5 b4 b3 b2 b1 b0|d1 d0 a5 a4 a3 a2 a1 a0] - // (a = [10:17], b = [4:11], c = [22:27], d = [16:21]) - - // 48, 54, 36, 42, 16, 22, 4, 10 - const __m512i shifts = _mm512_set1_epi64(0x3036242a1016040alu); - __m512i shuffled_in = _mm512_multishift_epi64_epi8(shifts, in); - - // Translate immediatedly after reshuffled. - const __m512i lookup = _mm512_loadu_si512(base64_table_enc_6bit); - - // Translation 6-bit values to ASCII. - return _mm512_permutexvar_epi8(shuffled_in, lookup); -} diff --git a/deps/base64/base64/lib/arch/generic/32/dec_loop.c b/deps/base64/base64/lib/arch/generic/32/dec_loop.c deleted file mode 100644 index 8a8260f25e47fc..00000000000000 --- a/deps/base64/base64/lib/arch/generic/32/dec_loop.c +++ /dev/null @@ -1,86 +0,0 @@ -static inline int -dec_loop_generic_32_inner (const uint8_t **s, uint8_t **o, size_t *rounds) -{ - const uint32_t str - = base64_table_dec_32bit_d0[(*s)[0]] - | base64_table_dec_32bit_d1[(*s)[1]] - | base64_table_dec_32bit_d2[(*s)[2]] - | base64_table_dec_32bit_d3[(*s)[3]]; - -#if BASE64_LITTLE_ENDIAN - - // LUTs for little-endian set MSB in case of invalid character: - if (str & UINT32_C(0x80000000)) { - return 0; - } -#else - // LUTs for big-endian set LSB in case of invalid character: - if (str & UINT32_C(1)) { - return 0; - } -#endif - // Store the output: - memcpy(*o, &str, sizeof (str)); - - *s += 4; - *o += 3; - *rounds -= 1; - - return 1; -} - -static inline void -dec_loop_generic_32 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 8) { - return; - } - - // Process blocks of 4 bytes per round. Because one extra zero byte is - // written after the output, ensure that there will be at least 4 bytes - // of input data left to cover the gap. (Two data bytes and up to two - // end-of-string markers.) - size_t rounds = (*slen - 4) / 4; - - *slen -= rounds * 4; // 4 bytes consumed per round - *olen += rounds * 3; // 3 bytes produced per round - - do { - if (rounds >= 8) { - if (dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 4) { - if (dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 2) { - if (dec_loop_generic_32_inner(s, o, &rounds) && - dec_loop_generic_32_inner(s, o, &rounds)) { - continue; - } - break; - } - dec_loop_generic_32_inner(s, o, &rounds); - break; - - } while (rounds > 0); - - // Adjust for any rounds that were skipped: - *slen += rounds * 4; - *olen -= rounds * 3; -} diff --git a/deps/base64/base64/lib/arch/generic/32/enc_loop.c b/deps/base64/base64/lib/arch/generic/32/enc_loop.c deleted file mode 100644 index f4870a75dc75e0..00000000000000 --- a/deps/base64/base64/lib/arch/generic/32/enc_loop.c +++ /dev/null @@ -1,73 +0,0 @@ -static inline void -enc_loop_generic_32_inner (const uint8_t **s, uint8_t **o) -{ - uint32_t src; - - // Load input: - memcpy(&src, *s, sizeof (src)); - - // Reorder to 32-bit big-endian, if not already in that format. The - // workset must be in big-endian, otherwise the shifted bits do not - // carry over properly among adjacent bytes: - src = BASE64_HTOBE32(src); - - // Two indices for the 12-bit lookup table: - const size_t index0 = (src >> 20) & 0xFFFU; - const size_t index1 = (src >> 8) & 0xFFFU; - - // Table lookup and store: - memcpy(*o + 0, base64_table_enc_12bit + index0, 2); - memcpy(*o + 2, base64_table_enc_12bit + index1, 2); - - *s += 3; - *o += 4; -} - -static inline void -enc_loop_generic_32 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 4) { - return; - } - - // Process blocks of 3 bytes at a time. Because blocks are loaded 4 - // bytes at a time, ensure that there will be at least one remaining - // byte after the last round, so that the final read will not pass - // beyond the bounds of the input buffer: - size_t rounds = (*slen - 1) / 3; - - *slen -= rounds * 3; // 3 bytes consumed per round - *olen += rounds * 4; // 4 bytes produced per round - - do { - if (rounds >= 8) { - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_generic_32_inner(s, o); - enc_loop_generic_32_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_generic_32_inner(s, o); - break; - - } while (rounds > 0); -} diff --git a/deps/base64/base64/lib/arch/generic/64/enc_loop.c b/deps/base64/base64/lib/arch/generic/64/enc_loop.c deleted file mode 100644 index 0840bc73c50e25..00000000000000 --- a/deps/base64/base64/lib/arch/generic/64/enc_loop.c +++ /dev/null @@ -1,77 +0,0 @@ -static inline void -enc_loop_generic_64_inner (const uint8_t **s, uint8_t **o) -{ - uint64_t src; - - // Load input: - memcpy(&src, *s, sizeof (src)); - - // Reorder to 64-bit big-endian, if not already in that format. The - // workset must be in big-endian, otherwise the shifted bits do not - // carry over properly among adjacent bytes: - src = BASE64_HTOBE64(src); - - // Four indices for the 12-bit lookup table: - const size_t index0 = (src >> 52) & 0xFFFU; - const size_t index1 = (src >> 40) & 0xFFFU; - const size_t index2 = (src >> 28) & 0xFFFU; - const size_t index3 = (src >> 16) & 0xFFFU; - - // Table lookup and store: - memcpy(*o + 0, base64_table_enc_12bit + index0, 2); - memcpy(*o + 2, base64_table_enc_12bit + index1, 2); - memcpy(*o + 4, base64_table_enc_12bit + index2, 2); - memcpy(*o + 6, base64_table_enc_12bit + index3, 2); - - *s += 6; - *o += 8; -} - -static inline void -enc_loop_generic_64 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 8) { - return; - } - - // Process blocks of 6 bytes at a time. Because blocks are loaded 8 - // bytes at a time, ensure that there will be at least 2 remaining - // bytes after the last round, so that the final read will not pass - // beyond the bounds of the input buffer: - size_t rounds = (*slen - 2) / 6; - - *slen -= rounds * 6; // 6 bytes consumed per round - *olen += rounds * 8; // 8 bytes produced per round - - do { - if (rounds >= 8) { - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_generic_64_inner(s, o); - enc_loop_generic_64_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_generic_64_inner(s, o); - break; - - } while (rounds > 0); -} diff --git a/deps/base64/base64/lib/arch/generic/codec.c b/deps/base64/base64/lib/arch/generic/codec.c deleted file mode 100644 index 8dd5af235949d4..00000000000000 --- a/deps/base64/base64/lib/arch/generic/codec.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <string.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if BASE64_WORDSIZE == 32 -# include "32/enc_loop.c" -#elif BASE64_WORDSIZE == 64 -# include "64/enc_loop.c" -#endif - -#if BASE64_WORDSIZE >= 32 -# include "32/dec_loop.c" -#endif - -BASE64_ENC_FUNCTION(plain) -{ - #include "enc_head.c" -#if BASE64_WORDSIZE == 32 - enc_loop_generic_32(&s, &slen, &o, &olen); -#elif BASE64_WORDSIZE == 64 - enc_loop_generic_64(&s, &slen, &o, &olen); -#endif - #include "enc_tail.c" -} - -BASE64_DEC_FUNCTION(plain) -{ - #include "dec_head.c" -#if BASE64_WORDSIZE >= 32 - dec_loop_generic_32(&s, &slen, &o, &olen); -#endif - #include "dec_tail.c" -} diff --git a/deps/base64/base64/lib/arch/generic/dec_head.c b/deps/base64/base64/lib/arch/generic/dec_head.c deleted file mode 100644 index 179a31b63ff4ec..00000000000000 --- a/deps/base64/base64/lib/arch/generic/dec_head.c +++ /dev/null @@ -1,37 +0,0 @@ -int ret = 0; -const uint8_t *s = (const uint8_t *) src; -uint8_t *o = (uint8_t *) out; -uint8_t q; - -// Use local temporaries to avoid cache thrashing: -size_t olen = 0; -size_t slen = srclen; -struct base64_state st; -st.eof = state->eof; -st.bytes = state->bytes; -st.carry = state->carry; - -// If we previously saw an EOF or an invalid character, bail out: -if (st.eof) { - *outlen = 0; - ret = 0; - // If there was a trailing '=' to check, check it: - if (slen && (st.eof == BASE64_AEOF)) { - state->bytes = 0; - state->eof = BASE64_EOF; - ret = ((base64_table_dec_8bit[*s++] == 254) && (slen == 1)) ? 1 : 0; - } - return ret; -} - -// Turn four 6-bit numbers into three bytes: -// out[0] = 11111122 -// out[1] = 22223333 -// out[2] = 33444444 - -// Duff's device again: -switch (st.bytes) -{ - for (;;) - { - case 0: diff --git a/deps/base64/base64/lib/arch/generic/dec_tail.c b/deps/base64/base64/lib/arch/generic/dec_tail.c deleted file mode 100644 index e64f7247f3f122..00000000000000 --- a/deps/base64/base64/lib/arch/generic/dec_tail.c +++ /dev/null @@ -1,91 +0,0 @@ - if (slen-- == 0) { - ret = 1; - break; - } - if ((q = base64_table_dec_8bit[*s++]) >= 254) { - st.eof = BASE64_EOF; - // Treat character '=' as invalid for byte 0: - break; - } - st.carry = q << 2; - st.bytes++; - - // Deliberate fallthrough: - BASE64_FALLTHROUGH - - case 1: if (slen-- == 0) { - ret = 1; - break; - } - if ((q = base64_table_dec_8bit[*s++]) >= 254) { - st.eof = BASE64_EOF; - // Treat character '=' as invalid for byte 1: - break; - } - *o++ = st.carry | (q >> 4); - st.carry = q << 4; - st.bytes++; - olen++; - - // Deliberate fallthrough: - BASE64_FALLTHROUGH - - case 2: if (slen-- == 0) { - ret = 1; - break; - } - if ((q = base64_table_dec_8bit[*s++]) >= 254) { - st.bytes++; - // When q == 254, the input char is '='. - // Check if next byte is also '=': - if (q == 254) { - if (slen-- != 0) { - st.bytes = 0; - // EOF: - st.eof = BASE64_EOF; - q = base64_table_dec_8bit[*s++]; - ret = ((q == 254) && (slen == 0)) ? 1 : 0; - break; - } - else { - // Almost EOF - st.eof = BASE64_AEOF; - ret = 1; - break; - } - } - // If we get here, there was an error: - break; - } - *o++ = st.carry | (q >> 2); - st.carry = q << 6; - st.bytes++; - olen++; - - // Deliberate fallthrough: - BASE64_FALLTHROUGH - - case 3: if (slen-- == 0) { - ret = 1; - break; - } - if ((q = base64_table_dec_8bit[*s++]) >= 254) { - st.bytes = 0; - st.eof = BASE64_EOF; - // When q == 254, the input char is '='. Return 1 and EOF. - // When q == 255, the input char is invalid. Return 0 and EOF. - ret = ((q == 254) && (slen == 0)) ? 1 : 0; - break; - } - *o++ = st.carry | q; - st.carry = 0; - st.bytes = 0; - olen++; - } -} - -state->eof = st.eof; -state->bytes = st.bytes; -state->carry = st.carry; -*outlen = olen; -return ret; diff --git a/deps/base64/base64/lib/arch/generic/enc_head.c b/deps/base64/base64/lib/arch/generic/enc_head.c deleted file mode 100644 index 38d60b2c62b534..00000000000000 --- a/deps/base64/base64/lib/arch/generic/enc_head.c +++ /dev/null @@ -1,24 +0,0 @@ -// Assume that *out is large enough to contain the output. -// Theoretically it should be 4/3 the length of src. -const uint8_t *s = (const uint8_t *) src; -uint8_t *o = (uint8_t *) out; - -// Use local temporaries to avoid cache thrashing: -size_t olen = 0; -size_t slen = srclen; -struct base64_state st; -st.bytes = state->bytes; -st.carry = state->carry; - -// Turn three bytes into four 6-bit numbers: -// in[0] = 00111111 -// in[1] = 00112222 -// in[2] = 00222233 -// in[3] = 00333333 - -// Duff's device, a for() loop inside a switch() statement. Legal! -switch (st.bytes) -{ - for (;;) - { - case 0: diff --git a/deps/base64/base64/lib/arch/generic/enc_tail.c b/deps/base64/base64/lib/arch/generic/enc_tail.c deleted file mode 100644 index cbd573376812d7..00000000000000 --- a/deps/base64/base64/lib/arch/generic/enc_tail.c +++ /dev/null @@ -1,34 +0,0 @@ - if (slen-- == 0) { - break; - } - *o++ = base64_table_enc_6bit[*s >> 2]; - st.carry = (*s++ << 4) & 0x30; - st.bytes++; - olen += 1; - - // Deliberate fallthrough: - BASE64_FALLTHROUGH - - case 1: if (slen-- == 0) { - break; - } - *o++ = base64_table_enc_6bit[st.carry | (*s >> 4)]; - st.carry = (*s++ << 2) & 0x3C; - st.bytes++; - olen += 1; - - // Deliberate fallthrough: - BASE64_FALLTHROUGH - - case 2: if (slen-- == 0) { - break; - } - *o++ = base64_table_enc_6bit[st.carry | (*s >> 6)]; - *o++ = base64_table_enc_6bit[*s++ & 0x3F]; - st.bytes = 0; - olen += 2; - } -} -state->bytes = st.bytes; -state->carry = st.carry; -*outlen = olen; diff --git a/deps/base64/base64/lib/arch/neon32/codec.c b/deps/base64/base64/lib/arch/neon32/codec.c deleted file mode 100644 index a0b27f9ff6ac95..00000000000000 --- a/deps/base64/base64/lib/arch/neon32/codec.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <string.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#ifdef __arm__ -# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && HAVE_NEON32 -# define BASE64_USE_NEON32 -# endif -#endif - -#ifdef BASE64_USE_NEON32 -#include <arm_neon.h> - -// Only enable inline assembly on supported compilers. -#if defined(__GNUC__) || defined(__clang__) -#define BASE64_NEON32_USE_ASM -#endif - -static inline uint8x16_t -vqtbl1q_u8 (const uint8x16_t lut, const uint8x16_t indices) -{ - // NEON32 only supports 64-bit wide lookups in 128-bit tables. Emulate - // the NEON64 `vqtbl1q_u8` intrinsic to do 128-bit wide lookups. - uint8x8x2_t lut2; - uint8x8x2_t result; - - lut2.val[0] = vget_low_u8(lut); - lut2.val[1] = vget_high_u8(lut); - - result.val[0] = vtbl2_u8(lut2, vget_low_u8(indices)); - result.val[1] = vtbl2_u8(lut2, vget_high_u8(indices)); - - return vcombine_u8(result.val[0], result.val[1]); -} - -#include "../generic/32/dec_loop.c" -#include "../generic/32/enc_loop.c" -#include "dec_loop.c" -#include "enc_reshuffle.c" -#include "enc_translate.c" -#include "enc_loop.c" - -#endif // BASE64_USE_NEON32 - -// Stride size is so large on these NEON 32-bit functions -// (48 bytes encode, 32 bytes decode) that we inline the -// uint32 codec to stay performant on smaller inputs. - -BASE64_ENC_FUNCTION(neon32) -{ -#ifdef BASE64_USE_NEON32 - #include "../generic/enc_head.c" - enc_loop_neon32(&s, &slen, &o, &olen); - enc_loop_generic_32(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(neon32) -{ -#ifdef BASE64_USE_NEON32 - #include "../generic/dec_head.c" - dec_loop_neon32(&s, &slen, &o, &olen); - dec_loop_generic_32(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/neon32/dec_loop.c b/deps/base64/base64/lib/arch/neon32/dec_loop.c deleted file mode 100644 index 2216b39599da18..00000000000000 --- a/deps/base64/base64/lib/arch/neon32/dec_loop.c +++ /dev/null @@ -1,106 +0,0 @@ -static inline int -is_nonzero (const uint8x16_t v) -{ - uint64_t u64; - const uint64x2_t v64 = vreinterpretq_u64_u8(v); - const uint32x2_t v32 = vqmovn_u64(v64); - - vst1_u64(&u64, vreinterpret_u64_u32(v32)); - return u64 != 0; -} - -static inline uint8x16_t -delta_lookup (const uint8x16_t v) -{ - const uint8x8_t lut = { - 0, 16, 19, 4, (uint8_t) -65, (uint8_t) -65, (uint8_t) -71, (uint8_t) -71, - }; - - return vcombine_u8( - vtbl1_u8(lut, vget_low_u8(v)), - vtbl1_u8(lut, vget_high_u8(v))); -} - -static inline uint8x16_t -dec_loop_neon32_lane (uint8x16_t *lane) -{ - // See the SSSE3 decoder for an explanation of the algorithm. - const uint8x16_t lut_lo = { - 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x13, 0x1A, 0x1B, 0x1B, 0x1B, 0x1A - }; - - const uint8x16_t lut_hi = { - 0x10, 0x10, 0x01, 0x02, 0x04, 0x08, 0x04, 0x08, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 - }; - - const uint8x16_t mask_0F = vdupq_n_u8(0x0F); - const uint8x16_t mask_2F = vdupq_n_u8(0x2F); - - const uint8x16_t hi_nibbles = vshrq_n_u8(*lane, 4); - const uint8x16_t lo_nibbles = vandq_u8(*lane, mask_0F); - const uint8x16_t eq_2F = vceqq_u8(*lane, mask_2F); - - const uint8x16_t hi = vqtbl1q_u8(lut_hi, hi_nibbles); - const uint8x16_t lo = vqtbl1q_u8(lut_lo, lo_nibbles); - - // Now simply add the delta values to the input: - *lane = vaddq_u8(*lane, delta_lookup(vaddq_u8(eq_2F, hi_nibbles))); - - // Return the validity mask: - return vandq_u8(lo, hi); -} - -static inline void -dec_loop_neon32 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 64) { - return; - } - - // Process blocks of 64 bytes per round. Unlike the SSE codecs, no - // extra trailing zero bytes are written, so it is not necessary to - // reserve extra input bytes: - size_t rounds = *slen / 64; - - *slen -= rounds * 64; // 64 bytes consumed per round - *olen += rounds * 48; // 48 bytes produced per round - - do { - uint8x16x3_t dec; - - // Load 64 bytes and deinterleave: - uint8x16x4_t str = vld4q_u8(*s); - - // Decode each lane, collect a mask of invalid inputs: - const uint8x16_t classified - = dec_loop_neon32_lane(&str.val[0]) - | dec_loop_neon32_lane(&str.val[1]) - | dec_loop_neon32_lane(&str.val[2]) - | dec_loop_neon32_lane(&str.val[3]); - - // Check for invalid input: if any of the delta values are - // zero, fall back on bytewise code to do error checking and - // reporting: - if (is_nonzero(classified)) { - break; - } - - // Compress four bytes into three: - dec.val[0] = vorrq_u8(vshlq_n_u8(str.val[0], 2), vshrq_n_u8(str.val[1], 4)); - dec.val[1] = vorrq_u8(vshlq_n_u8(str.val[1], 4), vshrq_n_u8(str.val[2], 2)); - dec.val[2] = vorrq_u8(vshlq_n_u8(str.val[2], 6), str.val[3]); - - // Interleave and store decoded result: - vst3q_u8(*o, dec); - - *s += 64; - *o += 48; - - } while (--rounds > 0); - - // Adjust for any rounds that were skipped: - *slen += rounds * 64; - *olen -= rounds * 48; -} diff --git a/deps/base64/base64/lib/arch/neon32/enc_loop.c b/deps/base64/base64/lib/arch/neon32/enc_loop.c deleted file mode 100644 index d694b33733cd61..00000000000000 --- a/deps/base64/base64/lib/arch/neon32/enc_loop.c +++ /dev/null @@ -1,170 +0,0 @@ -#ifdef BASE64_NEON32_USE_ASM -static inline void -enc_loop_neon32_inner_asm (const uint8_t **s, uint8_t **o) -{ - // This function duplicates the functionality of enc_loop_neon32_inner, - // but entirely with inline assembly. This gives a significant speedup - // over using NEON intrinsics, which do not always generate very good - // code. The logic of the assembly is directly lifted from the - // intrinsics version, so it can be used as a guide to this code. - - // Temporary registers, used as scratch space. - uint8x16_t tmp0, tmp1, tmp2, tmp3; - uint8x16_t mask0, mask1, mask2, mask3; - - // A lookup table containing the absolute offsets for all ranges. - const uint8x16_t lut = { - 65U, 71U, 252U, 252U, - 252U, 252U, 252U, 252U, - 252U, 252U, 252U, 252U, - 237U, 240U, 0U, 0U - }; - - // Numeric constants. - const uint8x16_t n51 = vdupq_n_u8(51); - const uint8x16_t n25 = vdupq_n_u8(25); - const uint8x16_t n63 = vdupq_n_u8(63); - - __asm__ ( - - // Load 48 bytes and deinterleave. The bytes are loaded to - // hard-coded registers q12, q13 and q14, to ensure that they - // are contiguous. Increment the source pointer. - "vld3.8 {d24, d26, d28}, [%[src]]! \n\t" - "vld3.8 {d25, d27, d29}, [%[src]]! \n\t" - - // Reshuffle the bytes using temporaries. - "vshr.u8 %q[t0], q12, #2 \n\t" - "vshr.u8 %q[t1], q13, #4 \n\t" - "vshr.u8 %q[t2], q14, #6 \n\t" - "vsli.8 %q[t1], q12, #4 \n\t" - "vsli.8 %q[t2], q13, #2 \n\t" - "vand.u8 %q[t1], %q[t1], %q[n63] \n\t" - "vand.u8 %q[t2], %q[t2], %q[n63] \n\t" - "vand.u8 %q[t3], q14, %q[n63] \n\t" - - // t0..t3 are the reshuffled inputs. Create LUT indices. - "vqsub.u8 q12, %q[t0], %q[n51] \n\t" - "vqsub.u8 q13, %q[t1], %q[n51] \n\t" - "vqsub.u8 q14, %q[t2], %q[n51] \n\t" - "vqsub.u8 q15, %q[t3], %q[n51] \n\t" - - // Create the mask for range #0. - "vcgt.u8 %q[m0], %q[t0], %q[n25] \n\t" - "vcgt.u8 %q[m1], %q[t1], %q[n25] \n\t" - "vcgt.u8 %q[m2], %q[t2], %q[n25] \n\t" - "vcgt.u8 %q[m3], %q[t3], %q[n25] \n\t" - - // Subtract -1 to correct the LUT indices. - "vsub.u8 q12, %q[m0] \n\t" - "vsub.u8 q13, %q[m1] \n\t" - "vsub.u8 q14, %q[m2] \n\t" - "vsub.u8 q15, %q[m3] \n\t" - - // Lookup the delta values. - "vtbl.u8 d24, {%q[lut]}, d24 \n\t" - "vtbl.u8 d25, {%q[lut]}, d25 \n\t" - "vtbl.u8 d26, {%q[lut]}, d26 \n\t" - "vtbl.u8 d27, {%q[lut]}, d27 \n\t" - "vtbl.u8 d28, {%q[lut]}, d28 \n\t" - "vtbl.u8 d29, {%q[lut]}, d29 \n\t" - "vtbl.u8 d30, {%q[lut]}, d30 \n\t" - "vtbl.u8 d31, {%q[lut]}, d31 \n\t" - - // Add the delta values. - "vadd.u8 q12, %q[t0] \n\t" - "vadd.u8 q13, %q[t1] \n\t" - "vadd.u8 q14, %q[t2] \n\t" - "vadd.u8 q15, %q[t3] \n\t" - - // Store 64 bytes and interleave. Increment the dest pointer. - "vst4.8 {d24, d26, d28, d30}, [%[dst]]! \n\t" - "vst4.8 {d25, d27, d29, d31}, [%[dst]]! \n\t" - - // Outputs (modified). - : [src] "+r" (*s), - [dst] "+r" (*o), - [t0] "=&w" (tmp0), - [t1] "=&w" (tmp1), - [t2] "=&w" (tmp2), - [t3] "=&w" (tmp3), - [m0] "=&w" (mask0), - [m1] "=&w" (mask1), - [m2] "=&w" (mask2), - [m3] "=&w" (mask3) - - // Inputs (not modified). - : [lut] "w" (lut), - [n25] "w" (n25), - [n51] "w" (n51), - [n63] "w" (n63) - - // Clobbers. - : "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", - "cc", "memory" - ); -} -#endif - -static inline void -enc_loop_neon32_inner (const uint8_t **s, uint8_t **o) -{ -#ifdef BASE64_NEON32_USE_ASM - enc_loop_neon32_inner_asm(s, o); -#else - // Load 48 bytes and deinterleave: - uint8x16x3_t src = vld3q_u8(*s); - - // Reshuffle: - uint8x16x4_t out = enc_reshuffle(src); - - // Translate reshuffled bytes to the Base64 alphabet: - out = enc_translate(out); - - // Interleave and store output: - vst4q_u8(*o, out); - - *s += 48; - *o += 64; -#endif -} - -static inline void -enc_loop_neon32 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - size_t rounds = *slen / 48; - - *slen -= rounds * 48; // 48 bytes consumed per round - *olen += rounds * 64; // 64 bytes produced per round - - while (rounds > 0) { - if (rounds >= 8) { - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_neon32_inner(s, o); - enc_loop_neon32_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_neon32_inner(s, o); - break; - } -} diff --git a/deps/base64/base64/lib/arch/neon32/enc_reshuffle.c b/deps/base64/base64/lib/arch/neon32/enc_reshuffle.c deleted file mode 100644 index d6e97cb5f815e4..00000000000000 --- a/deps/base64/base64/lib/arch/neon32/enc_reshuffle.c +++ /dev/null @@ -1,31 +0,0 @@ -static inline uint8x16x4_t -enc_reshuffle (uint8x16x3_t in) -{ - uint8x16x4_t out; - - // Input: - // in[0] = a7 a6 a5 a4 a3 a2 a1 a0 - // in[1] = b7 b6 b5 b4 b3 b2 b1 b0 - // in[2] = c7 c6 c5 c4 c3 c2 c1 c0 - - // Output: - // out[0] = 00 00 a7 a6 a5 a4 a3 a2 - // out[1] = 00 00 a1 a0 b7 b6 b5 b4 - // out[2] = 00 00 b3 b2 b1 b0 c7 c6 - // out[3] = 00 00 c5 c4 c3 c2 c1 c0 - - // Move the input bits to where they need to be in the outputs. Except - // for the first output, the high two bits are not cleared. - out.val[0] = vshrq_n_u8(in.val[0], 2); - out.val[1] = vshrq_n_u8(in.val[1], 4); - out.val[2] = vshrq_n_u8(in.val[2], 6); - out.val[1] = vsliq_n_u8(out.val[1], in.val[0], 4); - out.val[2] = vsliq_n_u8(out.val[2], in.val[1], 2); - - // Clear the high two bits in the second, third and fourth output. - out.val[1] = vandq_u8(out.val[1], vdupq_n_u8(0x3F)); - out.val[2] = vandq_u8(out.val[2], vdupq_n_u8(0x3F)); - out.val[3] = vandq_u8(in.val[2], vdupq_n_u8(0x3F)); - - return out; -} diff --git a/deps/base64/base64/lib/arch/neon32/enc_translate.c b/deps/base64/base64/lib/arch/neon32/enc_translate.c deleted file mode 100644 index e616d54bc15dc7..00000000000000 --- a/deps/base64/base64/lib/arch/neon32/enc_translate.c +++ /dev/null @@ -1,57 +0,0 @@ -static inline uint8x16x4_t -enc_translate (const uint8x16x4_t in) -{ - // A lookup table containing the absolute offsets for all ranges: - const uint8x16_t lut = { - 65U, 71U, 252U, 252U, - 252U, 252U, 252U, 252U, - 252U, 252U, 252U, 252U, - 237U, 240U, 0U, 0U - }; - - const uint8x16_t offset = vdupq_n_u8(51); - - uint8x16x4_t indices, mask, delta, out; - - // Translate values 0..63 to the Base64 alphabet. There are five sets: - // # From To Abs Index Characters - // 0 [0..25] [65..90] +65 0 ABCDEFGHIJKLMNOPQRSTUVWXYZ - // 1 [26..51] [97..122] +71 1 abcdefghijklmnopqrstuvwxyz - // 2 [52..61] [48..57] -4 [2..11] 0123456789 - // 3 [62] [43] -19 12 + - // 4 [63] [47] -16 13 / - - // Create LUT indices from input: - // the index for range #0 is right, others are 1 less than expected: - indices.val[0] = vqsubq_u8(in.val[0], offset); - indices.val[1] = vqsubq_u8(in.val[1], offset); - indices.val[2] = vqsubq_u8(in.val[2], offset); - indices.val[3] = vqsubq_u8(in.val[3], offset); - - // mask is 0xFF (-1) for range #[1..4] and 0x00 for range #0: - mask.val[0] = vcgtq_u8(in.val[0], vdupq_n_u8(25)); - mask.val[1] = vcgtq_u8(in.val[1], vdupq_n_u8(25)); - mask.val[2] = vcgtq_u8(in.val[2], vdupq_n_u8(25)); - mask.val[3] = vcgtq_u8(in.val[3], vdupq_n_u8(25)); - - // Subtract -1, so add 1 to indices for range #[1..4], All indices are - // now correct: - indices.val[0] = vsubq_u8(indices.val[0], mask.val[0]); - indices.val[1] = vsubq_u8(indices.val[1], mask.val[1]); - indices.val[2] = vsubq_u8(indices.val[2], mask.val[2]); - indices.val[3] = vsubq_u8(indices.val[3], mask.val[3]); - - // Lookup delta values: - delta.val[0] = vqtbl1q_u8(lut, indices.val[0]); - delta.val[1] = vqtbl1q_u8(lut, indices.val[1]); - delta.val[2] = vqtbl1q_u8(lut, indices.val[2]); - delta.val[3] = vqtbl1q_u8(lut, indices.val[3]); - - // Add delta values: - out.val[0] = vaddq_u8(in.val[0], delta.val[0]); - out.val[1] = vaddq_u8(in.val[1], delta.val[1]); - out.val[2] = vaddq_u8(in.val[2], delta.val[2]); - out.val[3] = vaddq_u8(in.val[3], delta.val[3]); - - return out; -} diff --git a/deps/base64/base64/lib/arch/neon64/codec.c b/deps/base64/base64/lib/arch/neon64/codec.c deleted file mode 100644 index 79789bb7d0ecbc..00000000000000 --- a/deps/base64/base64/lib/arch/neon64/codec.c +++ /dev/null @@ -1,97 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <string.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#ifdef __aarch64__ -# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && HAVE_NEON64 -# define BASE64_USE_NEON64 -# endif -#endif - -#ifdef BASE64_USE_NEON64 -#include <arm_neon.h> - -// Only enable inline assembly on supported compilers. -#if defined(__GNUC__) || defined(__clang__) -#define BASE64_NEON64_USE_ASM -#endif - -static inline uint8x16x4_t -load_64byte_table (const uint8_t *p) -{ -#ifdef BASE64_NEON64_USE_ASM - - // Force the table to be loaded into contiguous registers. GCC will not - // normally allocate contiguous registers for a `uint8x16x4_t'. These - // registers are chosen to not conflict with the ones in the enc loop. - register uint8x16_t t0 __asm__ ("v8"); - register uint8x16_t t1 __asm__ ("v9"); - register uint8x16_t t2 __asm__ ("v10"); - register uint8x16_t t3 __asm__ ("v11"); - - __asm__ ( - "ld1 {%[t0].16b, %[t1].16b, %[t2].16b, %[t3].16b}, [%[src]], #64 \n\t" - : [src] "+r" (p), - [t0] "=w" (t0), - [t1] "=w" (t1), - [t2] "=w" (t2), - [t3] "=w" (t3) - ); - - return (uint8x16x4_t) { - .val[0] = t0, - .val[1] = t1, - .val[2] = t2, - .val[3] = t3, - }; -#else - return vld1q_u8_x4(p); -#endif -} - -#include "../generic/32/dec_loop.c" -#include "../generic/64/enc_loop.c" -#include "dec_loop.c" - -#ifdef BASE64_NEON64_USE_ASM -# include "enc_loop_asm.c" -#else -# include "enc_reshuffle.c" -# include "enc_loop.c" -#endif - -#endif // BASE64_USE_NEON64 - -// Stride size is so large on these NEON 64-bit functions -// (48 bytes encode, 64 bytes decode) that we inline the -// uint64 codec to stay performant on smaller inputs. - -BASE64_ENC_FUNCTION(neon64) -{ -#ifdef BASE64_USE_NEON64 - #include "../generic/enc_head.c" - enc_loop_neon64(&s, &slen, &o, &olen); - enc_loop_generic_64(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(neon64) -{ -#ifdef BASE64_USE_NEON64 - #include "../generic/dec_head.c" - dec_loop_neon64(&s, &slen, &o, &olen); - dec_loop_generic_32(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/neon64/dec_loop.c b/deps/base64/base64/lib/arch/neon64/dec_loop.c deleted file mode 100644 index 48232f2049228d..00000000000000 --- a/deps/base64/base64/lib/arch/neon64/dec_loop.c +++ /dev/null @@ -1,129 +0,0 @@ -// The input consists of five valid character sets in the Base64 alphabet, -// which we need to map back to the 6-bit values they represent. -// There are three ranges, two singles, and then there's the rest. -// -// # From To LUT Characters -// 1 [0..42] [255] #1 invalid input -// 2 [43] [62] #1 + -// 3 [44..46] [255] #1 invalid input -// 4 [47] [63] #1 / -// 5 [48..57] [52..61] #1 0..9 -// 6 [58..63] [255] #1 invalid input -// 7 [64] [255] #2 invalid input -// 8 [65..90] [0..25] #2 A..Z -// 9 [91..96] [255] #2 invalid input -// 10 [97..122] [26..51] #2 a..z -// 11 [123..126] [255] #2 invalid input -// (12) Everything else => invalid input - -// The first LUT will use the VTBL instruction (out of range indices are set to -// 0 in destination). -static const uint8_t dec_lut1[] = { - 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, - 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, - 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 62U, 255U, 255U, 255U, 63U, - 52U, 53U, 54U, 55U, 56U, 57U, 58U, 59U, 60U, 61U, 255U, 255U, 255U, 255U, 255U, 255U, -}; - -// The second LUT will use the VTBX instruction (out of range indices will be -// unchanged in destination). Input [64..126] will be mapped to index [1..63] -// in this LUT. Index 0 means that value comes from LUT #1. -static const uint8_t dec_lut2[] = { - 0U, 255U, 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, - 14U, 15U, 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U, 24U, 25U, 255U, 255U, 255U, 255U, - 255U, 255U, 26U, 27U, 28U, 29U, 30U, 31U, 32U, 33U, 34U, 35U, 36U, 37U, 38U, 39U, - 40U, 41U, 42U, 43U, 44U, 45U, 46U, 47U, 48U, 49U, 50U, 51U, 255U, 255U, 255U, 255U, -}; - -// All input values in range for the first look-up will be 0U in the second -// look-up result. All input values out of range for the first look-up will be -// 0U in the first look-up result. Thus, the two results can be ORed without -// conflicts. -// -// Invalid characters that are in the valid range for either look-up will be -// set to 255U in the combined result. Other invalid characters will just be -// passed through with the second look-up result (using the VTBX instruction). -// Since the second LUT is 64 bytes, those passed-through values are guaranteed -// to have a value greater than 63U. Therefore, valid characters will be mapped -// to the valid [0..63] range and all invalid characters will be mapped to -// values greater than 63. - -static inline void -dec_loop_neon64 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 64) { - return; - } - - // Process blocks of 64 bytes per round. Unlike the SSE codecs, no - // extra trailing zero bytes are written, so it is not necessary to - // reserve extra input bytes: - size_t rounds = *slen / 64; - - *slen -= rounds * 64; // 64 bytes consumed per round - *olen += rounds * 48; // 48 bytes produced per round - - const uint8x16x4_t tbl_dec1 = load_64byte_table(dec_lut1); - const uint8x16x4_t tbl_dec2 = load_64byte_table(dec_lut2); - - do { - const uint8x16_t offset = vdupq_n_u8(63U); - uint8x16x4_t dec1, dec2; - uint8x16x3_t dec; - - // Load 64 bytes and deinterleave: - uint8x16x4_t str = vld4q_u8((uint8_t *) *s); - - // Get indices for second LUT: - dec2.val[0] = vqsubq_u8(str.val[0], offset); - dec2.val[1] = vqsubq_u8(str.val[1], offset); - dec2.val[2] = vqsubq_u8(str.val[2], offset); - dec2.val[3] = vqsubq_u8(str.val[3], offset); - - // Get values from first LUT: - dec1.val[0] = vqtbl4q_u8(tbl_dec1, str.val[0]); - dec1.val[1] = vqtbl4q_u8(tbl_dec1, str.val[1]); - dec1.val[2] = vqtbl4q_u8(tbl_dec1, str.val[2]); - dec1.val[3] = vqtbl4q_u8(tbl_dec1, str.val[3]); - - // Get values from second LUT: - dec2.val[0] = vqtbx4q_u8(dec2.val[0], tbl_dec2, dec2.val[0]); - dec2.val[1] = vqtbx4q_u8(dec2.val[1], tbl_dec2, dec2.val[1]); - dec2.val[2] = vqtbx4q_u8(dec2.val[2], tbl_dec2, dec2.val[2]); - dec2.val[3] = vqtbx4q_u8(dec2.val[3], tbl_dec2, dec2.val[3]); - - // Get final values: - str.val[0] = vorrq_u8(dec1.val[0], dec2.val[0]); - str.val[1] = vorrq_u8(dec1.val[1], dec2.val[1]); - str.val[2] = vorrq_u8(dec1.val[2], dec2.val[2]); - str.val[3] = vorrq_u8(dec1.val[3], dec2.val[3]); - - // Check for invalid input, any value larger than 63: - const uint8x16_t classified - = vcgtq_u8(str.val[0], vdupq_n_u8(63)) - | vcgtq_u8(str.val[1], vdupq_n_u8(63)) - | vcgtq_u8(str.val[2], vdupq_n_u8(63)) - | vcgtq_u8(str.val[3], vdupq_n_u8(63)); - - // Check that all bits are zero: - if (vmaxvq_u8(classified) != 0U) { - break; - } - - // Compress four bytes into three: - dec.val[0] = vshlq_n_u8(str.val[0], 2) | vshrq_n_u8(str.val[1], 4); - dec.val[1] = vshlq_n_u8(str.val[1], 4) | vshrq_n_u8(str.val[2], 2); - dec.val[2] = vshlq_n_u8(str.val[2], 6) | str.val[3]; - - // Interleave and store decoded result: - vst3q_u8((uint8_t *) *o, dec); - - *s += 64; - *o += 48; - - } while (--rounds > 0); - - // Adjust for any rounds that were skipped: - *slen += rounds * 64; - *olen -= rounds * 48; -} diff --git a/deps/base64/base64/lib/arch/neon64/enc_loop.c b/deps/base64/base64/lib/arch/neon64/enc_loop.c deleted file mode 100644 index 59a1c59728a139..00000000000000 --- a/deps/base64/base64/lib/arch/neon64/enc_loop.c +++ /dev/null @@ -1,66 +0,0 @@ -static inline void -enc_loop_neon64_inner (const uint8_t **s, uint8_t **o, const uint8x16x4_t tbl_enc) -{ - // Load 48 bytes and deinterleave: - uint8x16x3_t src = vld3q_u8(*s); - - // Divide bits of three input bytes over four output bytes: - uint8x16x4_t out = enc_reshuffle(src); - - // The bits have now been shifted to the right locations; - // translate their values 0..63 to the Base64 alphabet. - // Use a 64-byte table lookup: - out.val[0] = vqtbl4q_u8(tbl_enc, out.val[0]); - out.val[1] = vqtbl4q_u8(tbl_enc, out.val[1]); - out.val[2] = vqtbl4q_u8(tbl_enc, out.val[2]); - out.val[3] = vqtbl4q_u8(tbl_enc, out.val[3]); - - // Interleave and store output: - vst4q_u8(*o, out); - - *s += 48; - *o += 64; -} - -static inline void -enc_loop_neon64 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - size_t rounds = *slen / 48; - - *slen -= rounds * 48; // 48 bytes consumed per round - *olen += rounds * 64; // 64 bytes produced per round - - // Load the encoding table: - const uint8x16x4_t tbl_enc = load_64byte_table(base64_table_enc_6bit); - - while (rounds > 0) { - if (rounds >= 8) { - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_neon64_inner(s, o, tbl_enc); - enc_loop_neon64_inner(s, o, tbl_enc); - rounds -= 2; - continue; - } - enc_loop_neon64_inner(s, o, tbl_enc); - break; - } -} diff --git a/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c b/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c deleted file mode 100644 index 182e9cdf4a17db..00000000000000 --- a/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c +++ /dev/null @@ -1,168 +0,0 @@ -// Apologies in advance for combining the preprocessor with inline assembly, -// two notoriously gnarly parts of C, but it was necessary to avoid a lot of -// code repetition. The preprocessor is used to template large sections of -// inline assembly that differ only in the registers used. If the code was -// written out by hand, it would become very large and hard to audit. - -// Generate a block of inline assembly that loads three user-defined registers -// A, B, C from memory and deinterleaves them, post-incrementing the src -// pointer. The register set should be sequential. -#define LOAD(A, B, C) \ - "ld3 {"A".16b, "B".16b, "C".16b}, [%[src]], #48 \n\t" - -// Generate a block of inline assembly that takes three deinterleaved registers -// and shuffles the bytes. The output is in temporary registers t0..t3. -#define SHUF(A, B, C) \ - "ushr %[t0].16b, "A".16b, #2 \n\t" \ - "ushr %[t1].16b, "B".16b, #4 \n\t" \ - "ushr %[t2].16b, "C".16b, #6 \n\t" \ - "sli %[t1].16b, "A".16b, #4 \n\t" \ - "sli %[t2].16b, "B".16b, #2 \n\t" \ - "and %[t1].16b, %[t1].16b, %[n63].16b \n\t" \ - "and %[t2].16b, %[t2].16b, %[n63].16b \n\t" \ - "and %[t3].16b, "C".16b, %[n63].16b \n\t" - -// Generate a block of inline assembly that takes temporary registers t0..t3 -// and translates them to the base64 alphabet, using a table loaded into -// v8..v11. The output is in user-defined registers A..D. -#define TRAN(A, B, C, D) \ - "tbl "A".16b, {v8.16b-v11.16b}, %[t0].16b \n\t" \ - "tbl "B".16b, {v8.16b-v11.16b}, %[t1].16b \n\t" \ - "tbl "C".16b, {v8.16b-v11.16b}, %[t2].16b \n\t" \ - "tbl "D".16b, {v8.16b-v11.16b}, %[t3].16b \n\t" - -// Generate a block of inline assembly that interleaves four registers and -// stores them, post-incrementing the destination pointer. -#define STOR(A, B, C, D) \ - "st4 {"A".16b, "B".16b, "C".16b, "D".16b}, [%[dst]], #64 \n\t" - -// Generate a block of inline assembly that generates a single self-contained -// encoder round: fetch the data, process it, and store the result. -#define ROUND() \ - LOAD("v12", "v13", "v14") \ - SHUF("v12", "v13", "v14") \ - TRAN("v12", "v13", "v14", "v15") \ - STOR("v12", "v13", "v14", "v15") - -// Generate a block of assembly that generates a type A interleaved encoder -// round. It uses registers that were loaded by the previous type B round, and -// in turn loads registers for the next type B round. -#define ROUND_A() \ - SHUF("v2", "v3", "v4") \ - LOAD("v12", "v13", "v14") \ - TRAN("v2", "v3", "v4", "v5") \ - STOR("v2", "v3", "v4", "v5") - -// Type B interleaved encoder round. Same as type A, but register sets swapped. -#define ROUND_B() \ - SHUF("v12", "v13", "v14") \ - LOAD("v2", "v3", "v4") \ - TRAN("v12", "v13", "v14", "v15") \ - STOR("v12", "v13", "v14", "v15") - -// The first type A round needs to load its own registers. -#define ROUND_A_FIRST() \ - LOAD("v2", "v3", "v4") \ - ROUND_A() - -// The last type B round omits the load for the next step. -#define ROUND_B_LAST() \ - SHUF("v12", "v13", "v14") \ - TRAN("v12", "v13", "v14", "v15") \ - STOR("v12", "v13", "v14", "v15") - -// Suppress clang's warning that the literal string in the asm statement is -// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 -// compilers). It may be true, but the goal here is not C99 portability. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" - -static inline void -enc_loop_neon64 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - size_t rounds = *slen / 48; - - if (rounds == 0) { - return; - } - - *slen -= rounds * 48; // 48 bytes consumed per round. - *olen += rounds * 64; // 64 bytes produced per round. - - // Number of times to go through the 8x loop. - size_t loops = rounds / 8; - - // Number of rounds remaining after the 8x loop. - rounds %= 8; - - // Temporary registers, used as scratch space. - uint8x16_t tmp0, tmp1, tmp2, tmp3; - - __asm__ volatile ( - - // Load the encoding table into v8..v11. - " ld1 {v8.16b-v11.16b}, [%[tbl]] \n\t" - - // If there are eight rounds or more, enter an 8x unrolled loop - // of interleaved encoding rounds. The rounds interleave memory - // operations (load/store) with data operations to maximize - // pipeline throughput. - " cbz %[loops], 4f \n\t" - - // The SIMD instructions do not touch the flags. - "88: subs %[loops], %[loops], #1 \n\t" - " " ROUND_A_FIRST() - " " ROUND_B() - " " ROUND_A() - " " ROUND_B() - " " ROUND_A() - " " ROUND_B() - " " ROUND_A() - " " ROUND_B_LAST() - " b.ne 88b \n\t" - - // Enter a 4x unrolled loop for rounds of 4 or more. - "4: cmp %[rounds], #4 \n\t" - " b.lt 30f \n\t" - " " ROUND_A_FIRST() - " " ROUND_B() - " " ROUND_A() - " " ROUND_B_LAST() - " sub %[rounds], %[rounds], #4 \n\t" - - // Dispatch the remaining rounds 0..3. - "30: cbz %[rounds], 0f \n\t" - " cmp %[rounds], #2 \n\t" - " b.eq 2f \n\t" - " b.lt 1f \n\t" - - // Block of non-interlaced encoding rounds, which can each - // individually be jumped to. Rounds fall through to the next. - "3: " ROUND() - "2: " ROUND() - "1: " ROUND() - "0: \n\t" - - // Outputs (modified). - : [loops] "+r" (loops), - [src] "+r" (*s), - [dst] "+r" (*o), - [t0] "=&w" (tmp0), - [t1] "=&w" (tmp1), - [t2] "=&w" (tmp2), - [t3] "=&w" (tmp3) - - // Inputs (not modified). - : [rounds] "r" (rounds), - [tbl] "r" (base64_table_enc_6bit), - [n63] "w" (vdupq_n_u8(63)) - - // Clobbers. - : "v2", "v3", "v4", "v5", - "v8", "v9", "v10", "v11", - "v12", "v13", "v14", "v15", - "cc", "memory" - ); -} - -#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/neon64/enc_reshuffle.c b/deps/base64/base64/lib/arch/neon64/enc_reshuffle.c deleted file mode 100644 index ea543e04ec7da4..00000000000000 --- a/deps/base64/base64/lib/arch/neon64/enc_reshuffle.c +++ /dev/null @@ -1,31 +0,0 @@ -static inline uint8x16x4_t -enc_reshuffle (const uint8x16x3_t in) -{ - uint8x16x4_t out; - - // Input: - // in[0] = a7 a6 a5 a4 a3 a2 a1 a0 - // in[1] = b7 b6 b5 b4 b3 b2 b1 b0 - // in[2] = c7 c6 c5 c4 c3 c2 c1 c0 - - // Output: - // out[0] = 00 00 a7 a6 a5 a4 a3 a2 - // out[1] = 00 00 a1 a0 b7 b6 b5 b4 - // out[2] = 00 00 b3 b2 b1 b0 c7 c6 - // out[3] = 00 00 c5 c4 c3 c2 c1 c0 - - // Move the input bits to where they need to be in the outputs. Except - // for the first output, the high two bits are not cleared. - out.val[0] = vshrq_n_u8(in.val[0], 2); - out.val[1] = vshrq_n_u8(in.val[1], 4); - out.val[2] = vshrq_n_u8(in.val[2], 6); - out.val[1] = vsliq_n_u8(out.val[1], in.val[0], 4); - out.val[2] = vsliq_n_u8(out.val[2], in.val[1], 2); - - // Clear the high two bits in the second, third and fourth output. - out.val[1] = vandq_u8(out.val[1], vdupq_n_u8(0x3F)); - out.val[2] = vandq_u8(out.val[2], vdupq_n_u8(0x3F)); - out.val[3] = vandq_u8(in.val[2], vdupq_n_u8(0x3F)); - - return out; -} diff --git a/deps/base64/base64/lib/arch/sse41/codec.c b/deps/base64/base64/lib/arch/sse41/codec.c deleted file mode 100644 index 6e5afe30011b7b..00000000000000 --- a/deps/base64/base64/lib/arch/sse41/codec.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_SSE41 -#include <smmintrin.h> - -// Only enable inline assembly on supported compilers and on 64-bit CPUs. -#ifndef BASE64_SSE41_USE_ASM -# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 -# define BASE64_SSE41_USE_ASM 1 -# else -# define BASE64_SSE41_USE_ASM 0 -# endif -#endif - -#include "../ssse3/dec_reshuffle.c" -#include "../ssse3/dec_loop.c" - -#if BASE64_SSE41_USE_ASM -# include "../ssse3/enc_loop_asm.c" -#else -# include "../ssse3/enc_translate.c" -# include "../ssse3/enc_reshuffle.c" -# include "../ssse3/enc_loop.c" -#endif - -#endif // HAVE_SSE41 - -BASE64_ENC_FUNCTION(sse41) -{ -#if HAVE_SSE41 - #include "../generic/enc_head.c" - enc_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(sse41) -{ -#if HAVE_SSE41 - #include "../generic/dec_head.c" - dec_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/sse42/codec.c b/deps/base64/base64/lib/arch/sse42/codec.c deleted file mode 100644 index dde823b7aa0aa6..00000000000000 --- a/deps/base64/base64/lib/arch/sse42/codec.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_SSE42 -#include <nmmintrin.h> - -// Only enable inline assembly on supported compilers and on 64-bit CPUs. -#ifndef BASE64_SSE42_USE_ASM -# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 -# define BASE64_SSE42_USE_ASM 1 -# else -# define BASE64_SSE42_USE_ASM 0 -# endif -#endif - -#include "../ssse3/dec_reshuffle.c" -#include "../ssse3/dec_loop.c" - -#if BASE64_SSE42_USE_ASM -# include "../ssse3/enc_loop_asm.c" -#else -# include "../ssse3/enc_translate.c" -# include "../ssse3/enc_reshuffle.c" -# include "../ssse3/enc_loop.c" -#endif - -#endif // HAVE_SSE42 - -BASE64_ENC_FUNCTION(sse42) -{ -#if HAVE_SSE42 - #include "../generic/enc_head.c" - enc_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(sse42) -{ -#if HAVE_SSE42 - #include "../generic/dec_head.c" - dec_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/ssse3/codec.c b/deps/base64/base64/lib/arch/ssse3/codec.c deleted file mode 100644 index a812a2901f4efb..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/codec.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -#include "../../../include/libbase64.h" -#include "../../tables/tables.h" -#include "../../codecs.h" -#include "config.h" -#include "../../env.h" - -#if HAVE_SSSE3 -#include <tmmintrin.h> - -// Only enable inline assembly on supported compilers and on 64-bit CPUs. -// 32-bit CPUs with SSSE3 support, such as low-end Atoms, only have eight XMM -// registers, which is not enough to run the inline assembly. -#ifndef BASE64_SSSE3_USE_ASM -# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 -# define BASE64_SSSE3_USE_ASM 1 -# else -# define BASE64_SSSE3_USE_ASM 0 -# endif -#endif - -#include "dec_reshuffle.c" -#include "dec_loop.c" - -#if BASE64_SSSE3_USE_ASM -# include "enc_loop_asm.c" -#else -# include "enc_reshuffle.c" -# include "enc_translate.c" -# include "enc_loop.c" -#endif - -#endif // HAVE_SSSE3 - -BASE64_ENC_FUNCTION(ssse3) -{ -#if HAVE_SSSE3 - #include "../generic/enc_head.c" - enc_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/enc_tail.c" -#else - BASE64_ENC_STUB -#endif -} - -BASE64_DEC_FUNCTION(ssse3) -{ -#if HAVE_SSSE3 - #include "../generic/dec_head.c" - dec_loop_ssse3(&s, &slen, &o, &olen); - #include "../generic/dec_tail.c" -#else - BASE64_DEC_STUB -#endif -} diff --git a/deps/base64/base64/lib/arch/ssse3/dec_loop.c b/deps/base64/base64/lib/arch/ssse3/dec_loop.c deleted file mode 100644 index 9da71abef48f56..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/dec_loop.c +++ /dev/null @@ -1,173 +0,0 @@ -// The input consists of six character sets in the Base64 alphabet, which we -// need to map back to the 6-bit values they represent. There are three ranges, -// two singles, and then there's the rest. -// -// # From To Add Characters -// 1 [43] [62] +19 + -// 2 [47] [63] +16 / -// 3 [48..57] [52..61] +4 0..9 -// 4 [65..90] [0..25] -65 A..Z -// 5 [97..122] [26..51] -71 a..z -// (6) Everything else => invalid input -// -// We will use lookup tables for character validation and offset computation. -// Remember that 0x2X and 0x0X are the same index for _mm_shuffle_epi8, this -// allows to mask with 0x2F instead of 0x0F and thus save one constant -// declaration (register and/or memory access). -// -// For offsets: -// Perfect hash for lut = ((src >> 4) & 0x2F) + ((src == 0x2F) ? 0xFF : 0x00) -// 0000 = garbage -// 0001 = / -// 0010 = + -// 0011 = 0-9 -// 0100 = A-Z -// 0101 = A-Z -// 0110 = a-z -// 0111 = a-z -// 1000 >= garbage -// -// For validation, here's the table. -// A character is valid if and only if the AND of the 2 lookups equals 0: -// -// hi \ lo 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 -// LUT 0x15 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x13 0x1A 0x1B 0x1B 0x1B 0x1A -// -// 0000 0x10 char NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI -// andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// -// 0001 0x10 char DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US -// andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// -// 0010 0x01 char ! " # $ % & ' ( ) * + , - . / -// andlut 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x00 0x01 0x01 0x01 0x00 -// -// 0011 0x02 char 0 1 2 3 4 5 6 7 8 9 : ; < = > ? -// andlut 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x02 0x02 0x02 0x02 0x02 -// -// 0100 0x04 char @ A B C D E F G H I J K L M N O -// andlut 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 -// -// 0101 0x08 char P Q R S T U V W X Y Z [ \ ] ^ _ -// andlut 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x08 0x08 0x08 0x08 -// -// 0110 0x04 char ` a b c d e f g h i j k l m n o -// andlut 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 -// 0111 0x08 char p q r s t u v w x y z { | } ~ -// andlut 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x08 0x08 0x08 0x08 -// -// 1000 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1001 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1010 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1011 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1100 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1101 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1110 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 -// 1111 0x10 andlut 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10 - -static inline int -dec_loop_ssse3_inner (const uint8_t **s, uint8_t **o, size_t *rounds) -{ - const __m128i lut_lo = _mm_setr_epi8( - 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x13, 0x1A, 0x1B, 0x1B, 0x1B, 0x1A); - - const __m128i lut_hi = _mm_setr_epi8( - 0x10, 0x10, 0x01, 0x02, 0x04, 0x08, 0x04, 0x08, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10); - - const __m128i lut_roll = _mm_setr_epi8( - 0, 16, 19, 4, -65, -65, -71, -71, - 0, 0, 0, 0, 0, 0, 0, 0); - - const __m128i mask_2F = _mm_set1_epi8(0x2F); - - // Load input: - __m128i str = _mm_loadu_si128((__m128i *) *s); - - // Table lookups: - const __m128i hi_nibbles = _mm_and_si128(_mm_srli_epi32(str, 4), mask_2F); - const __m128i lo_nibbles = _mm_and_si128(str, mask_2F); - const __m128i hi = _mm_shuffle_epi8(lut_hi, hi_nibbles); - const __m128i lo = _mm_shuffle_epi8(lut_lo, lo_nibbles); - - // Check for invalid input: if any "and" values from lo and hi are not - // zero, fall back on bytewise code to do error checking and reporting: - if (_mm_movemask_epi8(_mm_cmpgt_epi8(_mm_and_si128(lo, hi), _mm_setzero_si128())) != 0) { - return 0; - } - - const __m128i eq_2F = _mm_cmpeq_epi8(str, mask_2F); - const __m128i roll = _mm_shuffle_epi8(lut_roll, _mm_add_epi8(eq_2F, hi_nibbles)); - - // Now simply add the delta values to the input: - str = _mm_add_epi8(str, roll); - - // Reshuffle the input to packed 12-byte output format: - str = dec_reshuffle(str); - - // Store the output: - _mm_storeu_si128((__m128i *) *o, str); - - *s += 16; - *o += 12; - *rounds -= 1; - - return 1; -} - -static inline void -dec_loop_ssse3 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 24) { - return; - } - - // Process blocks of 16 bytes per round. Because 4 extra zero bytes are - // written after the output, ensure that there will be at least 8 bytes - // of input data left to cover the gap. (6 data bytes and up to two - // end-of-string markers.) - size_t rounds = (*slen - 8) / 16; - - *slen -= rounds * 16; // 16 bytes consumed per round - *olen += rounds * 12; // 12 bytes produced per round - - do { - if (rounds >= 8) { - if (dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 4) { - if (dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds)) { - continue; - } - break; - } - if (rounds >= 2) { - if (dec_loop_ssse3_inner(s, o, &rounds) && - dec_loop_ssse3_inner(s, o, &rounds)) { - continue; - } - break; - } - dec_loop_ssse3_inner(s, o, &rounds); - break; - - } while (rounds > 0); - - // Adjust for any rounds that were skipped: - *slen += rounds * 16; - *olen -= rounds * 12; -} diff --git a/deps/base64/base64/lib/arch/ssse3/dec_reshuffle.c b/deps/base64/base64/lib/arch/ssse3/dec_reshuffle.c deleted file mode 100644 index fdf587fea2ee91..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/dec_reshuffle.c +++ /dev/null @@ -1,33 +0,0 @@ -static inline __m128i -dec_reshuffle (const __m128i in) -{ - // in, bits, upper case are most significant bits, lower case are least significant bits - // 00llllll 00kkkkLL 00jjKKKK 00JJJJJJ - // 00iiiiii 00hhhhII 00ggHHHH 00GGGGGG - // 00ffffff 00eeeeFF 00ddEEEE 00DDDDDD - // 00cccccc 00bbbbCC 00aaBBBB 00AAAAAA - - const __m128i merge_ab_and_bc = _mm_maddubs_epi16(in, _mm_set1_epi32(0x01400140)); - // 0000kkkk LLllllll 0000JJJJ JJjjKKKK - // 0000hhhh IIiiiiii 0000GGGG GGggHHHH - // 0000eeee FFffffff 0000DDDD DDddEEEE - // 0000bbbb CCcccccc 0000AAAA AAaaBBBB - - const __m128i out = _mm_madd_epi16(merge_ab_and_bc, _mm_set1_epi32(0x00011000)); - // 00000000 JJJJJJjj KKKKkkkk LLllllll - // 00000000 GGGGGGgg HHHHhhhh IIiiiiii - // 00000000 DDDDDDdd EEEEeeee FFffffff - // 00000000 AAAAAAaa BBBBbbbb CCcccccc - - // Pack bytes together: - return _mm_shuffle_epi8(out, _mm_setr_epi8( - 2, 1, 0, - 6, 5, 4, - 10, 9, 8, - 14, 13, 12, - -1, -1, -1, -1)); - // 00000000 00000000 00000000 00000000 - // LLllllll KKKKkkkk JJJJJJjj IIiiiiii - // HHHHhhhh GGGGGGgg FFffffff EEEEeeee - // DDDDDDdd CCcccccc BBBBbbbb AAAAAAaa -} diff --git a/deps/base64/base64/lib/arch/ssse3/enc_loop.c b/deps/base64/base64/lib/arch/ssse3/enc_loop.c deleted file mode 100644 index 6de652e1c9719b..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/enc_loop.c +++ /dev/null @@ -1,67 +0,0 @@ -static inline void -enc_loop_ssse3_inner (const uint8_t **s, uint8_t **o) -{ - // Load input: - __m128i str = _mm_loadu_si128((__m128i *) *s); - - // Reshuffle: - str = enc_reshuffle(str); - - // Translate reshuffled bytes to the Base64 alphabet: - str = enc_translate(str); - - // Store: - _mm_storeu_si128((__m128i *) *o, str); - - *s += 12; - *o += 16; -} - -static inline void -enc_loop_ssse3 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - if (*slen < 16) { - return; - } - - // Process blocks of 12 bytes at a time. Because blocks are loaded 16 - // bytes at a time, ensure that there will be at least 4 remaining - // bytes after the last round, so that the final read will not pass - // beyond the bounds of the input buffer: - size_t rounds = (*slen - 4) / 12; - - *slen -= rounds * 12; // 12 bytes consumed per round - *olen += rounds * 16; // 16 bytes produced per round - - do { - if (rounds >= 8) { - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - rounds -= 8; - continue; - } - if (rounds >= 4) { - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - rounds -= 4; - continue; - } - if (rounds >= 2) { - enc_loop_ssse3_inner(s, o); - enc_loop_ssse3_inner(s, o); - rounds -= 2; - continue; - } - enc_loop_ssse3_inner(s, o); - break; - - } while (rounds > 0); -} diff --git a/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c b/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c deleted file mode 100644 index 0cdb340a63b7fc..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c +++ /dev/null @@ -1,268 +0,0 @@ -// Apologies in advance for combining the preprocessor with inline assembly, -// two notoriously gnarly parts of C, but it was necessary to avoid a lot of -// code repetition. The preprocessor is used to template large sections of -// inline assembly that differ only in the registers used. If the code was -// written out by hand, it would become very large and hard to audit. - -// Generate a block of inline assembly that loads register R0 from memory. The -// offset at which the register is loaded is set by the given round. -#define LOAD(R0, ROUND) \ - "lddqu ("#ROUND" * 12)(%[src]), %["R0"] \n\t" - -// Generate a block of inline assembly that deinterleaves and shuffles register -// R0 using preloaded constants. Outputs in R0 and R1. -#define SHUF(R0, R1) \ - "pshufb %[lut0], %["R0"] \n\t" \ - "movdqa %["R0"], %["R1"] \n\t" \ - "pand %[msk0], %["R0"] \n\t" \ - "pand %[msk2], %["R1"] \n\t" \ - "pmulhuw %[msk1], %["R0"] \n\t" \ - "pmullw %[msk3], %["R1"] \n\t" \ - "por %["R1"], %["R0"] \n\t" - -// Generate a block of inline assembly that takes R0 and R1 and translates -// their contents to the base64 alphabet, using preloaded constants. -#define TRAN(R0, R1, R2) \ - "movdqa %["R0"], %["R1"] \n\t" \ - "movdqa %["R0"], %["R2"] \n\t" \ - "psubusb %[n51], %["R1"] \n\t" \ - "pcmpgtb %[n25], %["R2"] \n\t" \ - "psubb %["R2"], %["R1"] \n\t" \ - "movdqa %[lut1], %["R2"] \n\t" \ - "pshufb %["R1"], %["R2"] \n\t" \ - "paddb %["R2"], %["R0"] \n\t" - -// Generate a block of inline assembly that stores the given register R0 at an -// offset set by the given round. -#define STOR(R0, ROUND) \ - "movdqu %["R0"], ("#ROUND" * 16)(%[dst]) \n\t" - -// Generate a block of inline assembly that generates a single self-contained -// encoder round: fetch the data, process it, and store the result. Then update -// the source and destination pointers. -#define ROUND() \ - LOAD("a", 0) \ - SHUF("a", "b") \ - TRAN("a", "b", "c") \ - STOR("a", 0) \ - "add $12, %[src] \n\t" \ - "add $16, %[dst] \n\t" - -// Define a macro that initiates a three-way interleaved encoding round by -// preloading registers a, b and c from memory. -// The register graph shows which registers are in use during each step, and -// is a visual aid for choosing registers for that step. Symbol index: -// -// + indicates that a register is loaded by that step. -// | indicates that a register is in use and must not be touched. -// - indicates that a register is decommissioned by that step. -// x indicates that a register is used as a temporary by that step. -// V indicates that a register is an input or output to the macro. -// -#define ROUND_3_INIT() /* a b c d e f */ \ - LOAD("a", 0) /* + */ \ - SHUF("a", "d") /* | + */ \ - LOAD("b", 1) /* | + | */ \ - TRAN("a", "d", "e") /* | | - x */ \ - LOAD("c", 2) /* V V V */ - -// Define a macro that translates, shuffles and stores the input registers A, B -// and C, and preloads registers D, E and F for the next round. -// This macro can be arbitrarily daisy-chained by feeding output registers D, E -// and F back into the next round as input registers A, B and C. The macro -// carefully interleaves memory operations with data operations for optimal -// pipelined performance. - -#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - LOAD(D, (ROUND + 3)) /* V V V + */ \ - SHUF(B, E) /* | | | | + */ \ - STOR(A, (ROUND + 0)) /* - | | | | */ \ - TRAN(B, E, F) /* | | | - x */ \ - LOAD(E, (ROUND + 4)) /* | | | + */ \ - SHUF(C, A) /* + | | | | */ \ - STOR(B, (ROUND + 1)) /* | - | | | */ \ - TRAN(C, A, F) /* - | | | x */ \ - LOAD(F, (ROUND + 5)) /* | | | + */ \ - SHUF(D, A) /* + | | | | */ \ - STOR(C, (ROUND + 2)) /* | - | | | */ \ - TRAN(D, A, B) /* - x V V V */ - -// Define a macro that terminates a ROUND_3 macro by taking pre-loaded -// registers D, E and F, and translating, shuffling and storing them. -#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ - SHUF(E, A) /* + V V V */ \ - STOR(D, (ROUND + 3)) /* | - | | */ \ - TRAN(E, A, B) /* - x | | */ \ - SHUF(F, C) /* + | | */ \ - STOR(E, (ROUND + 4)) /* | - | */ \ - TRAN(F, C, D) /* - x | */ \ - STOR(F, (ROUND + 5)) /* - */ - -// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. -#define ROUND_3_A(ROUND) \ - ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") - -// Define a type B round. Inputs and outputs are swapped with regard to type A. -#define ROUND_3_B(ROUND) \ - ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") - -// Terminating macro for a type A round. -#define ROUND_3_A_LAST(ROUND) \ - ROUND_3_A(ROUND) \ - ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") - -// Terminating macro for a type B round. -#define ROUND_3_B_LAST(ROUND) \ - ROUND_3_B(ROUND) \ - ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") - -// Suppress clang's warning that the literal string in the asm statement is -// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 -// compilers). It may be true, but the goal here is not C99 portability. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" - -static inline void -enc_loop_ssse3 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) -{ - // For a clearer explanation of the algorithm used by this function, - // please refer to the plain (not inline assembly) implementation. This - // function follows the same basic logic. - - if (*slen < 16) { - return; - } - - // Process blocks of 12 bytes at a time. Input is read in blocks of 16 - // bytes, so "reserve" four bytes from the input buffer to ensure that - // we never read beyond the end of the input buffer. - size_t rounds = (*slen - 4) / 12; - - *slen -= rounds * 12; // 12 bytes consumed per round - *olen += rounds * 16; // 16 bytes produced per round - - // Number of times to go through the 36x loop. - size_t loops = rounds / 36; - - // Number of rounds remaining after the 36x loop. - rounds %= 36; - - // Lookup tables. - const __m128i lut0 = _mm_set_epi8( - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); - - const __m128i lut1 = _mm_setr_epi8( - 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); - - // Temporary registers. - __m128i a, b, c, d, e, f; - - __asm__ volatile ( - - // If there are 36 rounds or more, enter a 36x unrolled loop of - // interleaved encoding rounds. The rounds interleave memory - // operations (load/store) with data operations (table lookups, - // etc) to maximize pipeline throughput. - " test %[loops], %[loops] \n\t" - " jz 18f \n\t" - " jmp 36f \n\t" - " \n\t" - ".balign 64 \n\t" - "36: " ROUND_3_INIT() - " " ROUND_3_A( 0) - " " ROUND_3_B( 3) - " " ROUND_3_A( 6) - " " ROUND_3_B( 9) - " " ROUND_3_A(12) - " " ROUND_3_B(15) - " " ROUND_3_A(18) - " " ROUND_3_B(21) - " " ROUND_3_A(24) - " " ROUND_3_B(27) - " " ROUND_3_A_LAST(30) - " add $(12 * 36), %[src] \n\t" - " add $(16 * 36), %[dst] \n\t" - " dec %[loops] \n\t" - " jnz 36b \n\t" - - // Enter an 18x unrolled loop for rounds of 18 or more. - "18: cmp $18, %[rounds] \n\t" - " jl 9f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B(3) - " " ROUND_3_A(6) - " " ROUND_3_B(9) - " " ROUND_3_A_LAST(12) - " sub $18, %[rounds] \n\t" - " add $(12 * 18), %[src] \n\t" - " add $(16 * 18), %[dst] \n\t" - - // Enter a 9x unrolled loop for rounds of 9 or more. - "9: cmp $9, %[rounds] \n\t" - " jl 6f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A(0) - " " ROUND_3_B_LAST(3) - " sub $9, %[rounds] \n\t" - " add $(12 * 9), %[src] \n\t" - " add $(16 * 9), %[dst] \n\t" - - // Enter a 6x unrolled loop for rounds of 6 or more. - "6: cmp $6, %[rounds] \n\t" - " jl 55f \n\t" - " " ROUND_3_INIT() - " " ROUND_3_A_LAST(0) - " sub $6, %[rounds] \n\t" - " add $(12 * 6), %[src] \n\t" - " add $(16 * 6), %[dst] \n\t" - - // Dispatch the remaining rounds 0..5. - "55: cmp $3, %[rounds] \n\t" - " jg 45f \n\t" - " je 3f \n\t" - " cmp $1, %[rounds] \n\t" - " jg 2f \n\t" - " je 1f \n\t" - " jmp 0f \n\t" - - "45: cmp $4, %[rounds] \n\t" - " je 4f \n\t" - - // Block of non-interlaced encoding rounds, which can each - // individually be jumped to. Rounds fall through to the next. - "5: " ROUND() - "4: " ROUND() - "3: " ROUND() - "2: " ROUND() - "1: " ROUND() - "0: \n\t" - - // Outputs (modified). - : [rounds] "+r" (rounds), - [loops] "+r" (loops), - [src] "+r" (*s), - [dst] "+r" (*o), - [a] "=&x" (a), - [b] "=&x" (b), - [c] "=&x" (c), - [d] "=&x" (d), - [e] "=&x" (e), - [f] "=&x" (f) - - // Inputs (not modified). - : [lut0] "x" (lut0), - [lut1] "x" (lut1), - [msk0] "x" (_mm_set1_epi32(0x0FC0FC00)), - [msk1] "x" (_mm_set1_epi32(0x04000040)), - [msk2] "x" (_mm_set1_epi32(0x003F03F0)), - [msk3] "x" (_mm_set1_epi32(0x01000010)), - [n51] "x" (_mm_set1_epi8(51)), - [n25] "x" (_mm_set1_epi8(25)) - - // Clobbers. - : "cc", "memory" - ); -} - -#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/ssse3/enc_reshuffle.c b/deps/base64/base64/lib/arch/ssse3/enc_reshuffle.c deleted file mode 100644 index b738591f9f2683..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/enc_reshuffle.c +++ /dev/null @@ -1,48 +0,0 @@ -static inline __m128i -enc_reshuffle (__m128i in) -{ - // Input, bytes MSB to LSB: - // 0 0 0 0 l k j i h g f e d c b a - - in = _mm_shuffle_epi8(in, _mm_set_epi8( - 10, 11, 9, 10, - 7, 8, 6, 7, - 4, 5, 3, 4, - 1, 2, 0, 1)); - // in, bytes MSB to LSB: - // k l j k - // h i g h - // e f d e - // b c a b - - const __m128i t0 = _mm_and_si128(in, _mm_set1_epi32(0x0FC0FC00)); - // bits, upper case are most significant bits, lower case are least significant bits - // 0000kkkk LL000000 JJJJJJ00 00000000 - // 0000hhhh II000000 GGGGGG00 00000000 - // 0000eeee FF000000 DDDDDD00 00000000 - // 0000bbbb CC000000 AAAAAA00 00000000 - - const __m128i t1 = _mm_mulhi_epu16(t0, _mm_set1_epi32(0x04000040)); - // 00000000 00kkkkLL 00000000 00JJJJJJ - // 00000000 00hhhhII 00000000 00GGGGGG - // 00000000 00eeeeFF 00000000 00DDDDDD - // 00000000 00bbbbCC 00000000 00AAAAAA - - const __m128i t2 = _mm_and_si128(in, _mm_set1_epi32(0x003F03F0)); - // 00000000 00llllll 000000jj KKKK0000 - // 00000000 00iiiiii 000000gg HHHH0000 - // 00000000 00ffffff 000000dd EEEE0000 - // 00000000 00cccccc 000000aa BBBB0000 - - const __m128i t3 = _mm_mullo_epi16(t2, _mm_set1_epi32(0x01000010)); - // 00llllll 00000000 00jjKKKK 00000000 - // 00iiiiii 00000000 00ggHHHH 00000000 - // 00ffffff 00000000 00ddEEEE 00000000 - // 00cccccc 00000000 00aaBBBB 00000000 - - return _mm_or_si128(t1, t3); - // 00llllll 00kkkkLL 00jjKKKK 00JJJJJJ - // 00iiiiii 00hhhhII 00ggHHHH 00GGGGGG - // 00ffffff 00eeeeFF 00ddEEEE 00DDDDDD - // 00cccccc 00bbbbCC 00aaBBBB 00AAAAAA -} diff --git a/deps/base64/base64/lib/arch/ssse3/enc_translate.c b/deps/base64/base64/lib/arch/ssse3/enc_translate.c deleted file mode 100644 index 04f288fccb62b1..00000000000000 --- a/deps/base64/base64/lib/arch/ssse3/enc_translate.c +++ /dev/null @@ -1,33 +0,0 @@ -static inline __m128i -enc_translate (const __m128i in) -{ - // A lookup table containing the absolute offsets for all ranges: - const __m128i lut = _mm_setr_epi8( - 65, 71, -4, -4, - -4, -4, -4, -4, - -4, -4, -4, -4, - -19, -16, 0, 0 - ); - - // Translate values 0..63 to the Base64 alphabet. There are five sets: - // # From To Abs Index Characters - // 0 [0..25] [65..90] +65 0 ABCDEFGHIJKLMNOPQRSTUVWXYZ - // 1 [26..51] [97..122] +71 1 abcdefghijklmnopqrstuvwxyz - // 2 [52..61] [48..57] -4 [2..11] 0123456789 - // 3 [62] [43] -19 12 + - // 4 [63] [47] -16 13 / - - // Create LUT indices from the input. The index for range #0 is right, - // others are 1 less than expected: - __m128i indices = _mm_subs_epu8(in, _mm_set1_epi8(51)); - - // mask is 0xFF (-1) for range #[1..4] and 0x00 for range #0: - __m128i mask = _mm_cmpgt_epi8(in, _mm_set1_epi8(25)); - - // Subtract -1, so add 1 to indices for range #[1..4]. All indices are - // now correct: - indices = _mm_sub_epi8(indices, mask); - - // Add offsets to input values: - return _mm_add_epi8(in, _mm_shuffle_epi8(lut, indices)); -} diff --git a/deps/base64/base64/lib/codec_choose.c b/deps/base64/base64/lib/codec_choose.c deleted file mode 100644 index abef3f2ae9f403..00000000000000 --- a/deps/base64/base64/lib/codec_choose.c +++ /dev/null @@ -1,305 +0,0 @@ -#include <stdbool.h> -#include <stdint.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> - -#include "../include/libbase64.h" -#include "codecs.h" -#include "config.h" -#include "env.h" - -#if (__x86_64__ || __i386__ || _M_X86 || _M_X64) - #define BASE64_X86 - #if (HAVE_SSSE3 || HAVE_SSE41 || HAVE_SSE42 || HAVE_AVX || HAVE_AVX2 || HAVE_AVX512) - #define BASE64_X86_SIMD - #endif -#endif - -#ifdef BASE64_X86 -#ifdef _MSC_VER - #include <intrin.h> - #define __cpuid_count(__level, __count, __eax, __ebx, __ecx, __edx) \ - { \ - int info[4]; \ - __cpuidex(info, __level, __count); \ - __eax = info[0]; \ - __ebx = info[1]; \ - __ecx = info[2]; \ - __edx = info[3]; \ - } - #define __cpuid(__level, __eax, __ebx, __ecx, __edx) \ - __cpuid_count(__level, 0, __eax, __ebx, __ecx, __edx) -#else - #include <cpuid.h> - #if HAVE_AVX512 || HAVE_AVX2 || HAVE_AVX - #if ((__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 2) || (__clang_major__ >= 3)) - static inline uint64_t _xgetbv (uint32_t index) - { - uint32_t eax, edx; - __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index)); - return ((uint64_t)edx << 32) | eax; - } - #else - #error "Platform not supported" - #endif - #endif -#endif - -#ifndef bit_AVX512vl -#define bit_AVX512vl (1 << 31) -#endif -#ifndef bit_AVX512vbmi -#define bit_AVX512vbmi (1 << 1) -#endif -#ifndef bit_AVX2 -#define bit_AVX2 (1 << 5) -#endif -#ifndef bit_SSSE3 -#define bit_SSSE3 (1 << 9) -#endif -#ifndef bit_SSE41 -#define bit_SSE41 (1 << 19) -#endif -#ifndef bit_SSE42 -#define bit_SSE42 (1 << 20) -#endif -#ifndef bit_AVX -#define bit_AVX (1 << 28) -#endif - -#define bit_XSAVE_XRSTORE (1 << 27) - -#ifndef _XCR_XFEATURE_ENABLED_MASK -#define _XCR_XFEATURE_ENABLED_MASK 0 -#endif - -#define _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS 0x6 -#endif - -// Function declarations: -#define BASE64_CODEC_FUNCS(arch) \ - BASE64_ENC_FUNCTION(arch); \ - BASE64_DEC_FUNCTION(arch); \ - -BASE64_CODEC_FUNCS(avx512) -BASE64_CODEC_FUNCS(avx2) -BASE64_CODEC_FUNCS(neon32) -BASE64_CODEC_FUNCS(neon64) -BASE64_CODEC_FUNCS(plain) -BASE64_CODEC_FUNCS(ssse3) -BASE64_CODEC_FUNCS(sse41) -BASE64_CODEC_FUNCS(sse42) -BASE64_CODEC_FUNCS(avx) - -static bool -codec_choose_forced (struct codec *codec, int flags) -{ - // If the user wants to use a certain codec, - // always allow it, even if the codec is a no-op. - // For testing purposes. - - if (!(flags & 0xFFFF)) { - return false; - } - - if (flags & BASE64_FORCE_AVX2) { - codec->enc = base64_stream_encode_avx2; - codec->dec = base64_stream_decode_avx2; - return true; - } - if (flags & BASE64_FORCE_NEON32) { - codec->enc = base64_stream_encode_neon32; - codec->dec = base64_stream_decode_neon32; - return true; - } - if (flags & BASE64_FORCE_NEON64) { - codec->enc = base64_stream_encode_neon64; - codec->dec = base64_stream_decode_neon64; - return true; - } - if (flags & BASE64_FORCE_PLAIN) { - codec->enc = base64_stream_encode_plain; - codec->dec = base64_stream_decode_plain; - return true; - } - if (flags & BASE64_FORCE_SSSE3) { - codec->enc = base64_stream_encode_ssse3; - codec->dec = base64_stream_decode_ssse3; - return true; - } - if (flags & BASE64_FORCE_SSE41) { - codec->enc = base64_stream_encode_sse41; - codec->dec = base64_stream_decode_sse41; - return true; - } - if (flags & BASE64_FORCE_SSE42) { - codec->enc = base64_stream_encode_sse42; - codec->dec = base64_stream_decode_sse42; - return true; - } - if (flags & BASE64_FORCE_AVX) { - codec->enc = base64_stream_encode_avx; - codec->dec = base64_stream_decode_avx; - return true; - } - if (flags & BASE64_FORCE_AVX512) { - codec->enc = base64_stream_encode_avx512; - codec->dec = base64_stream_decode_avx512; - return true; - } - return false; -} - -static bool -codec_choose_arm (struct codec *codec) -{ -#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && ((defined(__aarch64__) && HAVE_NEON64) || HAVE_NEON32) - - // Unfortunately there is no portable way to check for NEON - // support at runtime from userland in the same way that x86 - // has cpuid, so just stick to the compile-time configuration: - - #if defined(__aarch64__) && HAVE_NEON64 - codec->enc = base64_stream_encode_neon64; - codec->dec = base64_stream_decode_neon64; - #else - codec->enc = base64_stream_encode_neon32; - codec->dec = base64_stream_decode_neon32; - #endif - - return true; - -#else - (void)codec; - return false; -#endif -} - -static bool -codec_choose_x86 (struct codec *codec) -{ -#ifdef BASE64_X86_SIMD - - unsigned int eax, ebx = 0, ecx = 0, edx; - unsigned int max_level; - - #ifdef _MSC_VER - int info[4]; - __cpuidex(info, 0, 0); - max_level = info[0]; - #else - max_level = __get_cpuid_max(0, NULL); - #endif - - #if HAVE_AVX512 || HAVE_AVX2 || HAVE_AVX - // Check for AVX/AVX2/AVX512 support: - // Checking for AVX requires 3 things: - // 1) CPUID indicates that the OS uses XSAVE and XRSTORE instructions - // (allowing saving YMM registers on context switch) - // 2) CPUID indicates support for AVX - // 3) XGETBV indicates the AVX registers will be saved and restored on - // context switch - // - // Note that XGETBV is only available on 686 or later CPUs, so the - // instruction needs to be conditionally run. - if (max_level >= 1) { - __cpuid_count(1, 0, eax, ebx, ecx, edx); - if (ecx & bit_XSAVE_XRSTORE) { - uint64_t xcr_mask; - xcr_mask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK); - if ((xcr_mask & _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS) == _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS) { // check multiple bits at once - #if HAVE_AVX512 - if (max_level >= 7) { - __cpuid_count(7, 0, eax, ebx, ecx, edx); - if ((ebx & bit_AVX512vl) && (ecx & bit_AVX512vbmi)) { - codec->enc = base64_stream_encode_avx512; - codec->dec = base64_stream_decode_avx512; - return true; - } - } - #endif - #if HAVE_AVX2 - if (max_level >= 7) { - __cpuid_count(7, 0, eax, ebx, ecx, edx); - if (ebx & bit_AVX2) { - codec->enc = base64_stream_encode_avx2; - codec->dec = base64_stream_decode_avx2; - return true; - } - } - #endif - #if HAVE_AVX - __cpuid_count(1, 0, eax, ebx, ecx, edx); - if (ecx & bit_AVX) { - codec->enc = base64_stream_encode_avx; - codec->dec = base64_stream_decode_avx; - return true; - } - #endif - } - } - } - #endif - - #if HAVE_SSE42 - // Check for SSE42 support: - if (max_level >= 1) { - __cpuid(1, eax, ebx, ecx, edx); - if (ecx & bit_SSE42) { - codec->enc = base64_stream_encode_sse42; - codec->dec = base64_stream_decode_sse42; - return true; - } - } - #endif - - #if HAVE_SSE41 - // Check for SSE41 support: - if (max_level >= 1) { - __cpuid(1, eax, ebx, ecx, edx); - if (ecx & bit_SSE41) { - codec->enc = base64_stream_encode_sse41; - codec->dec = base64_stream_decode_sse41; - return true; - } - } - #endif - - #if HAVE_SSSE3 - // Check for SSSE3 support: - if (max_level >= 1) { - __cpuid(1, eax, ebx, ecx, edx); - if (ecx & bit_SSSE3) { - codec->enc = base64_stream_encode_ssse3; - codec->dec = base64_stream_decode_ssse3; - return true; - } - } - #endif - -#else - (void)codec; -#endif - - return false; -} - -void -codec_choose (struct codec *codec, int flags) -{ - // User forced a codec: - if (codec_choose_forced(codec, flags)) { - return; - } - - // Runtime feature detection: - if (codec_choose_arm(codec)) { - return; - } - if (codec_choose_x86(codec)) { - return; - } - codec->enc = base64_stream_encode_plain; - codec->dec = base64_stream_decode_plain; -} diff --git a/deps/base64/base64/lib/codecs.h b/deps/base64/base64/lib/codecs.h deleted file mode 100644 index 441fd600a45e02..00000000000000 --- a/deps/base64/base64/lib/codecs.h +++ /dev/null @@ -1,65 +0,0 @@ -#include <stdint.h> -#include <stddef.h> - -#include "../include/libbase64.h" -#include "config.h" - -// Function parameters for encoding functions: -#define BASE64_ENC_PARAMS \ - ( struct base64_state *state \ - , const char *src \ - , size_t srclen \ - , char *out \ - , size_t *outlen \ - ) - -// Function parameters for decoding functions: -#define BASE64_DEC_PARAMS \ - ( struct base64_state *state \ - , const char *src \ - , size_t srclen \ - , char *out \ - , size_t *outlen \ - ) - -// Function signature for encoding functions: -#define BASE64_ENC_FUNCTION(arch) \ - void \ - base64_stream_encode_ ## arch \ - BASE64_ENC_PARAMS - -// Function signature for decoding functions: -#define BASE64_DEC_FUNCTION(arch) \ - int \ - base64_stream_decode_ ## arch \ - BASE64_DEC_PARAMS - -// Cast away unused variable, silence compiler: -#define UNUSED(x) ((void)(x)) - -// Stub function when encoder arch unsupported: -#define BASE64_ENC_STUB \ - UNUSED(state); \ - UNUSED(src); \ - UNUSED(srclen); \ - UNUSED(out); \ - \ - *outlen = 0; - -// Stub function when decoder arch unsupported: -#define BASE64_DEC_STUB \ - UNUSED(state); \ - UNUSED(src); \ - UNUSED(srclen); \ - UNUSED(out); \ - UNUSED(outlen); \ - \ - return -1; - -struct codec -{ - void (* enc) BASE64_ENC_PARAMS; - int (* dec) BASE64_DEC_PARAMS; -}; - -extern void codec_choose (struct codec *, int flags); diff --git a/deps/base64/base64/lib/config.h b/deps/base64/base64/lib/config.h deleted file mode 100644 index 5885289003f0a4..00000000000000 --- a/deps/base64/base64/lib/config.h +++ /dev/null @@ -1 +0,0 @@ -// Intentionally empty diff --git a/deps/base64/base64/lib/env.h b/deps/base64/base64/lib/env.h deleted file mode 100644 index d489ba54215bbf..00000000000000 --- a/deps/base64/base64/lib/env.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef BASE64_ENV_H -#define BASE64_ENV_H - -#include <stdint.h> - -// This header file contains macro definitions that describe certain aspects of -// the compile-time environment. Compatibility and portability macros go here. - -// Define machine endianness. This is for GCC: -#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -# define BASE64_LITTLE_ENDIAN 1 -#else -# define BASE64_LITTLE_ENDIAN 0 -#endif - -// This is for Clang: -#ifdef __LITTLE_ENDIAN__ -# define BASE64_LITTLE_ENDIAN 1 -#endif - -#ifdef __BIG_ENDIAN__ -# define BASE64_LITTLE_ENDIAN 0 -#endif - -// MSVC++ needs intrin.h for _byteswap_uint64 (issue #68): -#if BASE64_LITTLE_ENDIAN && defined(_MSC_VER) -# include <intrin.h> -#endif - -// Endian conversion functions: -#if BASE64_LITTLE_ENDIAN -# ifdef _MSC_VER -// Microsoft Visual C++: -# define BASE64_HTOBE32(x) _byteswap_ulong(x) -# define BASE64_HTOBE64(x) _byteswap_uint64(x) -# else -// GCC and Clang: -# define BASE64_HTOBE32(x) __builtin_bswap32(x) -# define BASE64_HTOBE64(x) __builtin_bswap64(x) -# endif -#else -// No conversion needed: -# define BASE64_HTOBE32(x) (x) -# define BASE64_HTOBE64(x) (x) -#endif - -// Detect word size: -#if defined (__x86_64__) -// This also works for the x32 ABI, which has a 64-bit word size. -# define BASE64_WORDSIZE 64 -#elif SIZE_MAX == UINT32_MAX -# define BASE64_WORDSIZE 32 -#elif SIZE_MAX == UINT64_MAX -# define BASE64_WORDSIZE 64 -#else -# error BASE64_WORDSIZE_NOT_DEFINED -#endif - -// End-of-file definitions. -// Almost end-of-file when waiting for the last '=' character: -#define BASE64_AEOF 1 -// End-of-file when stream end has been reached or invalid input provided: -#define BASE64_EOF 2 - -// GCC 7 defaults to issuing a warning for fallthrough in switch statements, -// unless the fallthrough cases are marked with an attribute. As we use -// fallthrough deliberately, define an alias for the attribute: -#if __GNUC__ >= 7 -# define BASE64_FALLTHROUGH __attribute__((fallthrough)); -#else -# define BASE64_FALLTHROUGH -#endif - -#endif // BASE64_ENV_H diff --git a/deps/base64/base64/lib/exports.txt b/deps/base64/base64/lib/exports.txt deleted file mode 100644 index 67d45588f50575..00000000000000 --- a/deps/base64/base64/lib/exports.txt +++ /dev/null @@ -1,7 +0,0 @@ -base64_encode -base64_stream_encode -base64_stream_encode_init -base64_stream_encode_final -base64_decode -base64_stream_decode -base64_stream_decode_init diff --git a/deps/base64/base64/lib/lib.c b/deps/base64/base64/lib/lib.c deleted file mode 100644 index 053931a9918b2b..00000000000000 --- a/deps/base64/base64/lib/lib.c +++ /dev/null @@ -1,164 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#ifdef _OPENMP -#include <omp.h> -#endif - -#include "../include/libbase64.h" -#include "tables/tables.h" -#include "codecs.h" -#include "env.h" - -// These static function pointers are initialized once when the library is -// first used, and remain in use for the remaining lifetime of the program. -// The idea being that CPU features don't change at runtime. -static struct codec codec = { NULL, NULL }; - -void -base64_stream_encode_init (struct base64_state *state, int flags) -{ - // If any of the codec flags are set, redo choice: - if (codec.enc == NULL || flags & 0xFF) { - codec_choose(&codec, flags); - } - state->eof = 0; - state->bytes = 0; - state->carry = 0; - state->flags = flags; -} - -void -base64_stream_encode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) -{ - codec.enc(state, src, srclen, out, outlen); -} - -void -base64_stream_encode_final - ( struct base64_state *state - , char *out - , size_t *outlen - ) -{ - uint8_t *o = (uint8_t *)out; - - if (state->bytes == 1) { - *o++ = base64_table_enc_6bit[state->carry]; - *o++ = '='; - *o++ = '='; - *outlen = 3; - return; - } - if (state->bytes == 2) { - *o++ = base64_table_enc_6bit[state->carry]; - *o++ = '='; - *outlen = 2; - return; - } - *outlen = 0; -} - -void -base64_stream_decode_init (struct base64_state *state, int flags) -{ - // If any of the codec flags are set, redo choice: - if (codec.dec == NULL || flags & 0xFFFF) { - codec_choose(&codec, flags); - } - state->eof = 0; - state->bytes = 0; - state->carry = 0; - state->flags = flags; -} - -int -base64_stream_decode - ( struct base64_state *state - , const char *src - , size_t srclen - , char *out - , size_t *outlen - ) -{ - return codec.dec(state, src, srclen, out, outlen); -} - -#ifdef _OPENMP - - // Due to the overhead of initializing OpenMP and creating a team of - // threads, we require the data length to be larger than a threshold: - #define OMP_THRESHOLD 20000 - - // Conditionally include OpenMP-accelerated codec implementations: - #include "lib_openmp.c" -#endif - -void -base64_encode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) -{ - size_t s; - size_t t; - struct base64_state state; - - #ifdef _OPENMP - if (srclen >= OMP_THRESHOLD) { - base64_encode_openmp(src, srclen, out, outlen, flags); - return; - } - #endif - - // Init the stream reader: - base64_stream_encode_init(&state, flags); - - // Feed the whole string to the stream reader: - base64_stream_encode(&state, src, srclen, out, &s); - - // Finalize the stream by writing trailer if any: - base64_stream_encode_final(&state, out + s, &t); - - // Final output length is stream length plus tail: - *outlen = s + t; -} - -int -base64_decode - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) -{ - int ret; - struct base64_state state; - - #ifdef _OPENMP - if (srclen >= OMP_THRESHOLD) { - return base64_decode_openmp(src, srclen, out, outlen, flags); - } - #endif - - // Init the stream reader: - base64_stream_decode_init(&state, flags); - - // Feed the whole string to the stream reader: - ret = base64_stream_decode(&state, src, srclen, out, outlen); - - // If when decoding a whole block, we're still waiting for input then fail: - if (ret && (state.bytes == 0)) { - return ret; - } - return 0; -} diff --git a/deps/base64/base64/lib/lib_openmp.c b/deps/base64/base64/lib/lib_openmp.c deleted file mode 100644 index 6b87c52486bb49..00000000000000 --- a/deps/base64/base64/lib/lib_openmp.c +++ /dev/null @@ -1,149 +0,0 @@ -// This code makes some assumptions on the implementation of -// base64_stream_encode_init(), base64_stream_encode() and base64_stream_decode(). -// Basically these assumptions boil down to that when breaking the src into -// parts, out parts can be written without side effects. -// This is met when: -// 1) base64_stream_encode() and base64_stream_decode() don't use globals; -// 2) the shared variables src and out are not read or written outside of the -// bounds of their parts, i.e. when base64_stream_encode() reads a multiple -// of 3 bytes, it must write no more then a multiple of 4 bytes, not even -// temporarily; -// 3) the state flag can be discarded after base64_stream_encode() and -// base64_stream_decode() on the parts. - -static inline void -base64_encode_openmp - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) -{ - size_t s; - size_t t; - size_t sum = 0, len, last_len; - struct base64_state state, initial_state; - int num_threads, i; - - // Request a number of threads but not necessarily get them: - #pragma omp parallel - { - // Get the number of threads used from one thread only, - // as num_threads is a shared var: - #pragma omp single - { - num_threads = omp_get_num_threads(); - - // Split the input string into num_threads parts, each - // part a multiple of 3 bytes. The remaining bytes will - // be done later: - len = srclen / (num_threads * 3); - len *= 3; - last_len = srclen - num_threads * len; - - // Init the stream reader: - base64_stream_encode_init(&state, flags); - initial_state = state; - } - - // Single has an implicit barrier for all threads to wait here - // for the above to complete: - #pragma omp for firstprivate(state) private(s) reduction(+:sum) schedule(static,1) - for (i = 0; i < num_threads; i++) - { - // Feed each part of the string to the stream reader: - base64_stream_encode(&state, src + i * len, len, out + i * len * 4 / 3, &s); - sum += s; - } - } - - // As encoding should never fail and we encode an exact multiple - // of 3 bytes, we can discard state: - state = initial_state; - - // Encode the remaining bytes: - base64_stream_encode(&state, src + num_threads * len, last_len, out + num_threads * len * 4 / 3, &s); - - // Finalize the stream by writing trailer if any: - base64_stream_encode_final(&state, out + num_threads * len * 4 / 3 + s, &t); - - // Final output length is stream length plus tail: - sum += s + t; - *outlen = sum; -} - -static inline int -base64_decode_openmp - ( const char *src - , size_t srclen - , char *out - , size_t *outlen - , int flags - ) -{ - int num_threads, result = 0, i; - size_t sum = 0, len, last_len, s; - struct base64_state state, initial_state; - - // Request a number of threads but not necessarily get them: - #pragma omp parallel - { - // Get the number of threads used from one thread only, - // as num_threads is a shared var: - #pragma omp single - { - num_threads = omp_get_num_threads(); - - // Split the input string into num_threads parts, each - // part a multiple of 4 bytes. The remaining bytes will - // be done later: - len = srclen / (num_threads * 4); - len *= 4; - last_len = srclen - num_threads * len; - - // Init the stream reader: - base64_stream_decode_init(&state, flags); - - initial_state = state; - } - - // Single has an implicit barrier to wait here for the above to - // complete: - #pragma omp for firstprivate(state) private(s) reduction(+:sum, result) schedule(static,1) - for (i = 0; i < num_threads; i++) - { - int this_result; - - // Feed each part of the string to the stream reader: - this_result = base64_stream_decode(&state, src + i * len, len, out + i * len * 3 / 4, &s); - sum += s; - result += this_result; - } - } - - // If `result' equals `-num_threads', then all threads returned -1, - // indicating that the requested codec is not available: - if (result == -num_threads) { - return -1; - } - - // If `result' does not equal `num_threads', then at least one of the - // threads hit a decode error: - if (result != num_threads) { - return 0; - } - - // So far so good, now decode whatever remains in the buffer. Reuse the - // initial state, since we are at a 4-byte boundary: - state = initial_state; - result = base64_stream_decode(&state, src + num_threads * len, last_len, out + num_threads * len * 3 / 4, &s); - sum += s; - *outlen = sum; - - // If when decoding a whole block, we're still waiting for input then fail: - if (result && (state.bytes == 0)) { - return result; - } - return 0; -} diff --git a/deps/base64/base64/lib/tables/.gitignore b/deps/base64/base64/lib/tables/.gitignore deleted file mode 100644 index 68043ffdf17d3e..00000000000000 --- a/deps/base64/base64/lib/tables/.gitignore +++ /dev/null @@ -1 +0,0 @@ -table_generator diff --git a/deps/base64/base64/lib/tables/Makefile b/deps/base64/base64/lib/tables/Makefile deleted file mode 100644 index b47b93e77498ed..00000000000000 --- a/deps/base64/base64/lib/tables/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -.PHONY: all clean - -TARGETS := table_dec_32bit.h table_enc_12bit.h table_generator - -all: $(TARGETS) - -clean: - $(RM) $(TARGETS) - -table_dec_32bit.h: table_generator - ./$^ > $@ - -table_enc_12bit.h: table_enc_12bit.py - ./$^ > $@ - -table_generator: table_generator.c - $(CC) $(CFLAGS) -o $@ $^ diff --git a/deps/base64/base64/lib/tables/table_dec_32bit.h b/deps/base64/base64/lib/tables/table_dec_32bit.h deleted file mode 100644 index f5d951fa79c717..00000000000000 --- a/deps/base64/base64/lib/tables/table_dec_32bit.h +++ /dev/null @@ -1,393 +0,0 @@ -#include <stdint.h> -#define CHAR62 '+' -#define CHAR63 '/' -#define CHARPAD '=' - - -#if BASE64_LITTLE_ENDIAN - - -/* SPECIAL DECODE TABLES FOR LITTLE ENDIAN (INTEL) CPUS */ - -const uint32_t base64_table_dec_32bit_d0[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x000000f8, 0xffffffff, 0xffffffff, 0xffffffff, 0x000000fc, -0x000000d0, 0x000000d4, 0x000000d8, 0x000000dc, 0x000000e0, 0x000000e4, -0x000000e8, 0x000000ec, 0x000000f0, 0x000000f4, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00000004, 0x00000008, 0x0000000c, 0x00000010, 0x00000014, 0x00000018, -0x0000001c, 0x00000020, 0x00000024, 0x00000028, 0x0000002c, 0x00000030, -0x00000034, 0x00000038, 0x0000003c, 0x00000040, 0x00000044, 0x00000048, -0x0000004c, 0x00000050, 0x00000054, 0x00000058, 0x0000005c, 0x00000060, -0x00000064, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00000068, 0x0000006c, 0x00000070, 0x00000074, 0x00000078, -0x0000007c, 0x00000080, 0x00000084, 0x00000088, 0x0000008c, 0x00000090, -0x00000094, 0x00000098, 0x0000009c, 0x000000a0, 0x000000a4, 0x000000a8, -0x000000ac, 0x000000b0, 0x000000b4, 0x000000b8, 0x000000bc, 0x000000c0, -0x000000c4, 0x000000c8, 0x000000cc, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d1[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x0000e003, 0xffffffff, 0xffffffff, 0xffffffff, 0x0000f003, -0x00004003, 0x00005003, 0x00006003, 0x00007003, 0x00008003, 0x00009003, -0x0000a003, 0x0000b003, 0x0000c003, 0x0000d003, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00001000, 0x00002000, 0x00003000, 0x00004000, 0x00005000, 0x00006000, -0x00007000, 0x00008000, 0x00009000, 0x0000a000, 0x0000b000, 0x0000c000, -0x0000d000, 0x0000e000, 0x0000f000, 0x00000001, 0x00001001, 0x00002001, -0x00003001, 0x00004001, 0x00005001, 0x00006001, 0x00007001, 0x00008001, -0x00009001, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x0000a001, 0x0000b001, 0x0000c001, 0x0000d001, 0x0000e001, -0x0000f001, 0x00000002, 0x00001002, 0x00002002, 0x00003002, 0x00004002, -0x00005002, 0x00006002, 0x00007002, 0x00008002, 0x00009002, 0x0000a002, -0x0000b002, 0x0000c002, 0x0000d002, 0x0000e002, 0x0000f002, 0x00000003, -0x00001003, 0x00002003, 0x00003003, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d2[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00800f00, 0xffffffff, 0xffffffff, 0xffffffff, 0x00c00f00, -0x00000d00, 0x00400d00, 0x00800d00, 0x00c00d00, 0x00000e00, 0x00400e00, -0x00800e00, 0x00c00e00, 0x00000f00, 0x00400f00, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00400000, 0x00800000, 0x00c00000, 0x00000100, 0x00400100, 0x00800100, -0x00c00100, 0x00000200, 0x00400200, 0x00800200, 0x00c00200, 0x00000300, -0x00400300, 0x00800300, 0x00c00300, 0x00000400, 0x00400400, 0x00800400, -0x00c00400, 0x00000500, 0x00400500, 0x00800500, 0x00c00500, 0x00000600, -0x00400600, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00800600, 0x00c00600, 0x00000700, 0x00400700, 0x00800700, -0x00c00700, 0x00000800, 0x00400800, 0x00800800, 0x00c00800, 0x00000900, -0x00400900, 0x00800900, 0x00c00900, 0x00000a00, 0x00400a00, 0x00800a00, -0x00c00a00, 0x00000b00, 0x00400b00, 0x00800b00, 0x00c00b00, 0x00000c00, -0x00400c00, 0x00800c00, 0x00c00c00, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d3[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x003e0000, 0xffffffff, 0xffffffff, 0xffffffff, 0x003f0000, -0x00340000, 0x00350000, 0x00360000, 0x00370000, 0x00380000, 0x00390000, -0x003a0000, 0x003b0000, 0x003c0000, 0x003d0000, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00010000, 0x00020000, 0x00030000, 0x00040000, 0x00050000, 0x00060000, -0x00070000, 0x00080000, 0x00090000, 0x000a0000, 0x000b0000, 0x000c0000, -0x000d0000, 0x000e0000, 0x000f0000, 0x00100000, 0x00110000, 0x00120000, -0x00130000, 0x00140000, 0x00150000, 0x00160000, 0x00170000, 0x00180000, -0x00190000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x001a0000, 0x001b0000, 0x001c0000, 0x001d0000, 0x001e0000, -0x001f0000, 0x00200000, 0x00210000, 0x00220000, 0x00230000, 0x00240000, -0x00250000, 0x00260000, 0x00270000, 0x00280000, 0x00290000, 0x002a0000, -0x002b0000, 0x002c0000, 0x002d0000, 0x002e0000, 0x002f0000, 0x00300000, -0x00310000, 0x00320000, 0x00330000, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -#else - - -/* SPECIAL DECODE TABLES FOR BIG ENDIAN (IBM/MOTOROLA/SUN) CPUS */ - -const uint32_t base64_table_dec_32bit_d0[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xf8000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xfc000000, -0xd0000000, 0xd4000000, 0xd8000000, 0xdc000000, 0xe0000000, 0xe4000000, -0xe8000000, 0xec000000, 0xf0000000, 0xf4000000, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x04000000, 0x08000000, 0x0c000000, 0x10000000, 0x14000000, 0x18000000, -0x1c000000, 0x20000000, 0x24000000, 0x28000000, 0x2c000000, 0x30000000, -0x34000000, 0x38000000, 0x3c000000, 0x40000000, 0x44000000, 0x48000000, -0x4c000000, 0x50000000, 0x54000000, 0x58000000, 0x5c000000, 0x60000000, -0x64000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x68000000, 0x6c000000, 0x70000000, 0x74000000, 0x78000000, -0x7c000000, 0x80000000, 0x84000000, 0x88000000, 0x8c000000, 0x90000000, -0x94000000, 0x98000000, 0x9c000000, 0xa0000000, 0xa4000000, 0xa8000000, -0xac000000, 0xb0000000, 0xb4000000, 0xb8000000, 0xbc000000, 0xc0000000, -0xc4000000, 0xc8000000, 0xcc000000, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d1[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x03e00000, 0xffffffff, 0xffffffff, 0xffffffff, 0x03f00000, -0x03400000, 0x03500000, 0x03600000, 0x03700000, 0x03800000, 0x03900000, -0x03a00000, 0x03b00000, 0x03c00000, 0x03d00000, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00100000, 0x00200000, 0x00300000, 0x00400000, 0x00500000, 0x00600000, -0x00700000, 0x00800000, 0x00900000, 0x00a00000, 0x00b00000, 0x00c00000, -0x00d00000, 0x00e00000, 0x00f00000, 0x01000000, 0x01100000, 0x01200000, -0x01300000, 0x01400000, 0x01500000, 0x01600000, 0x01700000, 0x01800000, -0x01900000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x01a00000, 0x01b00000, 0x01c00000, 0x01d00000, 0x01e00000, -0x01f00000, 0x02000000, 0x02100000, 0x02200000, 0x02300000, 0x02400000, -0x02500000, 0x02600000, 0x02700000, 0x02800000, 0x02900000, 0x02a00000, -0x02b00000, 0x02c00000, 0x02d00000, 0x02e00000, 0x02f00000, 0x03000000, -0x03100000, 0x03200000, 0x03300000, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d2[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x000f8000, 0xffffffff, 0xffffffff, 0xffffffff, 0x000fc000, -0x000d0000, 0x000d4000, 0x000d8000, 0x000dc000, 0x000e0000, 0x000e4000, -0x000e8000, 0x000ec000, 0x000f0000, 0x000f4000, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00004000, 0x00008000, 0x0000c000, 0x00010000, 0x00014000, 0x00018000, -0x0001c000, 0x00020000, 0x00024000, 0x00028000, 0x0002c000, 0x00030000, -0x00034000, 0x00038000, 0x0003c000, 0x00040000, 0x00044000, 0x00048000, -0x0004c000, 0x00050000, 0x00054000, 0x00058000, 0x0005c000, 0x00060000, -0x00064000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00068000, 0x0006c000, 0x00070000, 0x00074000, 0x00078000, -0x0007c000, 0x00080000, 0x00084000, 0x00088000, 0x0008c000, 0x00090000, -0x00094000, 0x00098000, 0x0009c000, 0x000a0000, 0x000a4000, 0x000a8000, -0x000ac000, 0x000b0000, 0x000b4000, 0x000b8000, 0x000bc000, 0x000c0000, -0x000c4000, 0x000c8000, 0x000cc000, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -const uint32_t base64_table_dec_32bit_d3[256] = { -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00003e00, 0xffffffff, 0xffffffff, 0xffffffff, 0x00003f00, -0x00003400, 0x00003500, 0x00003600, 0x00003700, 0x00003800, 0x00003900, -0x00003a00, 0x00003b00, 0x00003c00, 0x00003d00, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, -0x00000100, 0x00000200, 0x00000300, 0x00000400, 0x00000500, 0x00000600, -0x00000700, 0x00000800, 0x00000900, 0x00000a00, 0x00000b00, 0x00000c00, -0x00000d00, 0x00000e00, 0x00000f00, 0x00001000, 0x00001100, 0x00001200, -0x00001300, 0x00001400, 0x00001500, 0x00001600, 0x00001700, 0x00001800, -0x00001900, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0x00001a00, 0x00001b00, 0x00001c00, 0x00001d00, 0x00001e00, -0x00001f00, 0x00002000, 0x00002100, 0x00002200, 0x00002300, 0x00002400, -0x00002500, 0x00002600, 0x00002700, 0x00002800, 0x00002900, 0x00002a00, -0x00002b00, 0x00002c00, 0x00002d00, 0x00002e00, 0x00002f00, 0x00003000, -0x00003100, 0x00003200, 0x00003300, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff -}; - - -#endif diff --git a/deps/base64/base64/lib/tables/table_enc_12bit.h b/deps/base64/base64/lib/tables/table_enc_12bit.h deleted file mode 100644 index 2bc0d23068753a..00000000000000 --- a/deps/base64/base64/lib/tables/table_enc_12bit.h +++ /dev/null @@ -1,1031 +0,0 @@ -#include <stdint.h> - -const uint16_t base64_table_enc_12bit[] = { -#if BASE64_LITTLE_ENDIAN - 0x4141U, 0x4241U, 0x4341U, 0x4441U, 0x4541U, 0x4641U, 0x4741U, 0x4841U, - 0x4941U, 0x4A41U, 0x4B41U, 0x4C41U, 0x4D41U, 0x4E41U, 0x4F41U, 0x5041U, - 0x5141U, 0x5241U, 0x5341U, 0x5441U, 0x5541U, 0x5641U, 0x5741U, 0x5841U, - 0x5941U, 0x5A41U, 0x6141U, 0x6241U, 0x6341U, 0x6441U, 0x6541U, 0x6641U, - 0x6741U, 0x6841U, 0x6941U, 0x6A41U, 0x6B41U, 0x6C41U, 0x6D41U, 0x6E41U, - 0x6F41U, 0x7041U, 0x7141U, 0x7241U, 0x7341U, 0x7441U, 0x7541U, 0x7641U, - 0x7741U, 0x7841U, 0x7941U, 0x7A41U, 0x3041U, 0x3141U, 0x3241U, 0x3341U, - 0x3441U, 0x3541U, 0x3641U, 0x3741U, 0x3841U, 0x3941U, 0x2B41U, 0x2F41U, - 0x4142U, 0x4242U, 0x4342U, 0x4442U, 0x4542U, 0x4642U, 0x4742U, 0x4842U, - 0x4942U, 0x4A42U, 0x4B42U, 0x4C42U, 0x4D42U, 0x4E42U, 0x4F42U, 0x5042U, - 0x5142U, 0x5242U, 0x5342U, 0x5442U, 0x5542U, 0x5642U, 0x5742U, 0x5842U, - 0x5942U, 0x5A42U, 0x6142U, 0x6242U, 0x6342U, 0x6442U, 0x6542U, 0x6642U, - 0x6742U, 0x6842U, 0x6942U, 0x6A42U, 0x6B42U, 0x6C42U, 0x6D42U, 0x6E42U, - 0x6F42U, 0x7042U, 0x7142U, 0x7242U, 0x7342U, 0x7442U, 0x7542U, 0x7642U, - 0x7742U, 0x7842U, 0x7942U, 0x7A42U, 0x3042U, 0x3142U, 0x3242U, 0x3342U, - 0x3442U, 0x3542U, 0x3642U, 0x3742U, 0x3842U, 0x3942U, 0x2B42U, 0x2F42U, - 0x4143U, 0x4243U, 0x4343U, 0x4443U, 0x4543U, 0x4643U, 0x4743U, 0x4843U, - 0x4943U, 0x4A43U, 0x4B43U, 0x4C43U, 0x4D43U, 0x4E43U, 0x4F43U, 0x5043U, - 0x5143U, 0x5243U, 0x5343U, 0x5443U, 0x5543U, 0x5643U, 0x5743U, 0x5843U, - 0x5943U, 0x5A43U, 0x6143U, 0x6243U, 0x6343U, 0x6443U, 0x6543U, 0x6643U, - 0x6743U, 0x6843U, 0x6943U, 0x6A43U, 0x6B43U, 0x6C43U, 0x6D43U, 0x6E43U, - 0x6F43U, 0x7043U, 0x7143U, 0x7243U, 0x7343U, 0x7443U, 0x7543U, 0x7643U, - 0x7743U, 0x7843U, 0x7943U, 0x7A43U, 0x3043U, 0x3143U, 0x3243U, 0x3343U, - 0x3443U, 0x3543U, 0x3643U, 0x3743U, 0x3843U, 0x3943U, 0x2B43U, 0x2F43U, - 0x4144U, 0x4244U, 0x4344U, 0x4444U, 0x4544U, 0x4644U, 0x4744U, 0x4844U, - 0x4944U, 0x4A44U, 0x4B44U, 0x4C44U, 0x4D44U, 0x4E44U, 0x4F44U, 0x5044U, - 0x5144U, 0x5244U, 0x5344U, 0x5444U, 0x5544U, 0x5644U, 0x5744U, 0x5844U, - 0x5944U, 0x5A44U, 0x6144U, 0x6244U, 0x6344U, 0x6444U, 0x6544U, 0x6644U, - 0x6744U, 0x6844U, 0x6944U, 0x6A44U, 0x6B44U, 0x6C44U, 0x6D44U, 0x6E44U, - 0x6F44U, 0x7044U, 0x7144U, 0x7244U, 0x7344U, 0x7444U, 0x7544U, 0x7644U, - 0x7744U, 0x7844U, 0x7944U, 0x7A44U, 0x3044U, 0x3144U, 0x3244U, 0x3344U, - 0x3444U, 0x3544U, 0x3644U, 0x3744U, 0x3844U, 0x3944U, 0x2B44U, 0x2F44U, - 0x4145U, 0x4245U, 0x4345U, 0x4445U, 0x4545U, 0x4645U, 0x4745U, 0x4845U, - 0x4945U, 0x4A45U, 0x4B45U, 0x4C45U, 0x4D45U, 0x4E45U, 0x4F45U, 0x5045U, - 0x5145U, 0x5245U, 0x5345U, 0x5445U, 0x5545U, 0x5645U, 0x5745U, 0x5845U, - 0x5945U, 0x5A45U, 0x6145U, 0x6245U, 0x6345U, 0x6445U, 0x6545U, 0x6645U, - 0x6745U, 0x6845U, 0x6945U, 0x6A45U, 0x6B45U, 0x6C45U, 0x6D45U, 0x6E45U, - 0x6F45U, 0x7045U, 0x7145U, 0x7245U, 0x7345U, 0x7445U, 0x7545U, 0x7645U, - 0x7745U, 0x7845U, 0x7945U, 0x7A45U, 0x3045U, 0x3145U, 0x3245U, 0x3345U, - 0x3445U, 0x3545U, 0x3645U, 0x3745U, 0x3845U, 0x3945U, 0x2B45U, 0x2F45U, - 0x4146U, 0x4246U, 0x4346U, 0x4446U, 0x4546U, 0x4646U, 0x4746U, 0x4846U, - 0x4946U, 0x4A46U, 0x4B46U, 0x4C46U, 0x4D46U, 0x4E46U, 0x4F46U, 0x5046U, - 0x5146U, 0x5246U, 0x5346U, 0x5446U, 0x5546U, 0x5646U, 0x5746U, 0x5846U, - 0x5946U, 0x5A46U, 0x6146U, 0x6246U, 0x6346U, 0x6446U, 0x6546U, 0x6646U, - 0x6746U, 0x6846U, 0x6946U, 0x6A46U, 0x6B46U, 0x6C46U, 0x6D46U, 0x6E46U, - 0x6F46U, 0x7046U, 0x7146U, 0x7246U, 0x7346U, 0x7446U, 0x7546U, 0x7646U, - 0x7746U, 0x7846U, 0x7946U, 0x7A46U, 0x3046U, 0x3146U, 0x3246U, 0x3346U, - 0x3446U, 0x3546U, 0x3646U, 0x3746U, 0x3846U, 0x3946U, 0x2B46U, 0x2F46U, - 0x4147U, 0x4247U, 0x4347U, 0x4447U, 0x4547U, 0x4647U, 0x4747U, 0x4847U, - 0x4947U, 0x4A47U, 0x4B47U, 0x4C47U, 0x4D47U, 0x4E47U, 0x4F47U, 0x5047U, - 0x5147U, 0x5247U, 0x5347U, 0x5447U, 0x5547U, 0x5647U, 0x5747U, 0x5847U, - 0x5947U, 0x5A47U, 0x6147U, 0x6247U, 0x6347U, 0x6447U, 0x6547U, 0x6647U, - 0x6747U, 0x6847U, 0x6947U, 0x6A47U, 0x6B47U, 0x6C47U, 0x6D47U, 0x6E47U, - 0x6F47U, 0x7047U, 0x7147U, 0x7247U, 0x7347U, 0x7447U, 0x7547U, 0x7647U, - 0x7747U, 0x7847U, 0x7947U, 0x7A47U, 0x3047U, 0x3147U, 0x3247U, 0x3347U, - 0x3447U, 0x3547U, 0x3647U, 0x3747U, 0x3847U, 0x3947U, 0x2B47U, 0x2F47U, - 0x4148U, 0x4248U, 0x4348U, 0x4448U, 0x4548U, 0x4648U, 0x4748U, 0x4848U, - 0x4948U, 0x4A48U, 0x4B48U, 0x4C48U, 0x4D48U, 0x4E48U, 0x4F48U, 0x5048U, - 0x5148U, 0x5248U, 0x5348U, 0x5448U, 0x5548U, 0x5648U, 0x5748U, 0x5848U, - 0x5948U, 0x5A48U, 0x6148U, 0x6248U, 0x6348U, 0x6448U, 0x6548U, 0x6648U, - 0x6748U, 0x6848U, 0x6948U, 0x6A48U, 0x6B48U, 0x6C48U, 0x6D48U, 0x6E48U, - 0x6F48U, 0x7048U, 0x7148U, 0x7248U, 0x7348U, 0x7448U, 0x7548U, 0x7648U, - 0x7748U, 0x7848U, 0x7948U, 0x7A48U, 0x3048U, 0x3148U, 0x3248U, 0x3348U, - 0x3448U, 0x3548U, 0x3648U, 0x3748U, 0x3848U, 0x3948U, 0x2B48U, 0x2F48U, - 0x4149U, 0x4249U, 0x4349U, 0x4449U, 0x4549U, 0x4649U, 0x4749U, 0x4849U, - 0x4949U, 0x4A49U, 0x4B49U, 0x4C49U, 0x4D49U, 0x4E49U, 0x4F49U, 0x5049U, - 0x5149U, 0x5249U, 0x5349U, 0x5449U, 0x5549U, 0x5649U, 0x5749U, 0x5849U, - 0x5949U, 0x5A49U, 0x6149U, 0x6249U, 0x6349U, 0x6449U, 0x6549U, 0x6649U, - 0x6749U, 0x6849U, 0x6949U, 0x6A49U, 0x6B49U, 0x6C49U, 0x6D49U, 0x6E49U, - 0x6F49U, 0x7049U, 0x7149U, 0x7249U, 0x7349U, 0x7449U, 0x7549U, 0x7649U, - 0x7749U, 0x7849U, 0x7949U, 0x7A49U, 0x3049U, 0x3149U, 0x3249U, 0x3349U, - 0x3449U, 0x3549U, 0x3649U, 0x3749U, 0x3849U, 0x3949U, 0x2B49U, 0x2F49U, - 0x414AU, 0x424AU, 0x434AU, 0x444AU, 0x454AU, 0x464AU, 0x474AU, 0x484AU, - 0x494AU, 0x4A4AU, 0x4B4AU, 0x4C4AU, 0x4D4AU, 0x4E4AU, 0x4F4AU, 0x504AU, - 0x514AU, 0x524AU, 0x534AU, 0x544AU, 0x554AU, 0x564AU, 0x574AU, 0x584AU, - 0x594AU, 0x5A4AU, 0x614AU, 0x624AU, 0x634AU, 0x644AU, 0x654AU, 0x664AU, - 0x674AU, 0x684AU, 0x694AU, 0x6A4AU, 0x6B4AU, 0x6C4AU, 0x6D4AU, 0x6E4AU, - 0x6F4AU, 0x704AU, 0x714AU, 0x724AU, 0x734AU, 0x744AU, 0x754AU, 0x764AU, - 0x774AU, 0x784AU, 0x794AU, 0x7A4AU, 0x304AU, 0x314AU, 0x324AU, 0x334AU, - 0x344AU, 0x354AU, 0x364AU, 0x374AU, 0x384AU, 0x394AU, 0x2B4AU, 0x2F4AU, - 0x414BU, 0x424BU, 0x434BU, 0x444BU, 0x454BU, 0x464BU, 0x474BU, 0x484BU, - 0x494BU, 0x4A4BU, 0x4B4BU, 0x4C4BU, 0x4D4BU, 0x4E4BU, 0x4F4BU, 0x504BU, - 0x514BU, 0x524BU, 0x534BU, 0x544BU, 0x554BU, 0x564BU, 0x574BU, 0x584BU, - 0x594BU, 0x5A4BU, 0x614BU, 0x624BU, 0x634BU, 0x644BU, 0x654BU, 0x664BU, - 0x674BU, 0x684BU, 0x694BU, 0x6A4BU, 0x6B4BU, 0x6C4BU, 0x6D4BU, 0x6E4BU, - 0x6F4BU, 0x704BU, 0x714BU, 0x724BU, 0x734BU, 0x744BU, 0x754BU, 0x764BU, - 0x774BU, 0x784BU, 0x794BU, 0x7A4BU, 0x304BU, 0x314BU, 0x324BU, 0x334BU, - 0x344BU, 0x354BU, 0x364BU, 0x374BU, 0x384BU, 0x394BU, 0x2B4BU, 0x2F4BU, - 0x414CU, 0x424CU, 0x434CU, 0x444CU, 0x454CU, 0x464CU, 0x474CU, 0x484CU, - 0x494CU, 0x4A4CU, 0x4B4CU, 0x4C4CU, 0x4D4CU, 0x4E4CU, 0x4F4CU, 0x504CU, - 0x514CU, 0x524CU, 0x534CU, 0x544CU, 0x554CU, 0x564CU, 0x574CU, 0x584CU, - 0x594CU, 0x5A4CU, 0x614CU, 0x624CU, 0x634CU, 0x644CU, 0x654CU, 0x664CU, - 0x674CU, 0x684CU, 0x694CU, 0x6A4CU, 0x6B4CU, 0x6C4CU, 0x6D4CU, 0x6E4CU, - 0x6F4CU, 0x704CU, 0x714CU, 0x724CU, 0x734CU, 0x744CU, 0x754CU, 0x764CU, - 0x774CU, 0x784CU, 0x794CU, 0x7A4CU, 0x304CU, 0x314CU, 0x324CU, 0x334CU, - 0x344CU, 0x354CU, 0x364CU, 0x374CU, 0x384CU, 0x394CU, 0x2B4CU, 0x2F4CU, - 0x414DU, 0x424DU, 0x434DU, 0x444DU, 0x454DU, 0x464DU, 0x474DU, 0x484DU, - 0x494DU, 0x4A4DU, 0x4B4DU, 0x4C4DU, 0x4D4DU, 0x4E4DU, 0x4F4DU, 0x504DU, - 0x514DU, 0x524DU, 0x534DU, 0x544DU, 0x554DU, 0x564DU, 0x574DU, 0x584DU, - 0x594DU, 0x5A4DU, 0x614DU, 0x624DU, 0x634DU, 0x644DU, 0x654DU, 0x664DU, - 0x674DU, 0x684DU, 0x694DU, 0x6A4DU, 0x6B4DU, 0x6C4DU, 0x6D4DU, 0x6E4DU, - 0x6F4DU, 0x704DU, 0x714DU, 0x724DU, 0x734DU, 0x744DU, 0x754DU, 0x764DU, - 0x774DU, 0x784DU, 0x794DU, 0x7A4DU, 0x304DU, 0x314DU, 0x324DU, 0x334DU, - 0x344DU, 0x354DU, 0x364DU, 0x374DU, 0x384DU, 0x394DU, 0x2B4DU, 0x2F4DU, - 0x414EU, 0x424EU, 0x434EU, 0x444EU, 0x454EU, 0x464EU, 0x474EU, 0x484EU, - 0x494EU, 0x4A4EU, 0x4B4EU, 0x4C4EU, 0x4D4EU, 0x4E4EU, 0x4F4EU, 0x504EU, - 0x514EU, 0x524EU, 0x534EU, 0x544EU, 0x554EU, 0x564EU, 0x574EU, 0x584EU, - 0x594EU, 0x5A4EU, 0x614EU, 0x624EU, 0x634EU, 0x644EU, 0x654EU, 0x664EU, - 0x674EU, 0x684EU, 0x694EU, 0x6A4EU, 0x6B4EU, 0x6C4EU, 0x6D4EU, 0x6E4EU, - 0x6F4EU, 0x704EU, 0x714EU, 0x724EU, 0x734EU, 0x744EU, 0x754EU, 0x764EU, - 0x774EU, 0x784EU, 0x794EU, 0x7A4EU, 0x304EU, 0x314EU, 0x324EU, 0x334EU, - 0x344EU, 0x354EU, 0x364EU, 0x374EU, 0x384EU, 0x394EU, 0x2B4EU, 0x2F4EU, - 0x414FU, 0x424FU, 0x434FU, 0x444FU, 0x454FU, 0x464FU, 0x474FU, 0x484FU, - 0x494FU, 0x4A4FU, 0x4B4FU, 0x4C4FU, 0x4D4FU, 0x4E4FU, 0x4F4FU, 0x504FU, - 0x514FU, 0x524FU, 0x534FU, 0x544FU, 0x554FU, 0x564FU, 0x574FU, 0x584FU, - 0x594FU, 0x5A4FU, 0x614FU, 0x624FU, 0x634FU, 0x644FU, 0x654FU, 0x664FU, - 0x674FU, 0x684FU, 0x694FU, 0x6A4FU, 0x6B4FU, 0x6C4FU, 0x6D4FU, 0x6E4FU, - 0x6F4FU, 0x704FU, 0x714FU, 0x724FU, 0x734FU, 0x744FU, 0x754FU, 0x764FU, - 0x774FU, 0x784FU, 0x794FU, 0x7A4FU, 0x304FU, 0x314FU, 0x324FU, 0x334FU, - 0x344FU, 0x354FU, 0x364FU, 0x374FU, 0x384FU, 0x394FU, 0x2B4FU, 0x2F4FU, - 0x4150U, 0x4250U, 0x4350U, 0x4450U, 0x4550U, 0x4650U, 0x4750U, 0x4850U, - 0x4950U, 0x4A50U, 0x4B50U, 0x4C50U, 0x4D50U, 0x4E50U, 0x4F50U, 0x5050U, - 0x5150U, 0x5250U, 0x5350U, 0x5450U, 0x5550U, 0x5650U, 0x5750U, 0x5850U, - 0x5950U, 0x5A50U, 0x6150U, 0x6250U, 0x6350U, 0x6450U, 0x6550U, 0x6650U, - 0x6750U, 0x6850U, 0x6950U, 0x6A50U, 0x6B50U, 0x6C50U, 0x6D50U, 0x6E50U, - 0x6F50U, 0x7050U, 0x7150U, 0x7250U, 0x7350U, 0x7450U, 0x7550U, 0x7650U, - 0x7750U, 0x7850U, 0x7950U, 0x7A50U, 0x3050U, 0x3150U, 0x3250U, 0x3350U, - 0x3450U, 0x3550U, 0x3650U, 0x3750U, 0x3850U, 0x3950U, 0x2B50U, 0x2F50U, - 0x4151U, 0x4251U, 0x4351U, 0x4451U, 0x4551U, 0x4651U, 0x4751U, 0x4851U, - 0x4951U, 0x4A51U, 0x4B51U, 0x4C51U, 0x4D51U, 0x4E51U, 0x4F51U, 0x5051U, - 0x5151U, 0x5251U, 0x5351U, 0x5451U, 0x5551U, 0x5651U, 0x5751U, 0x5851U, - 0x5951U, 0x5A51U, 0x6151U, 0x6251U, 0x6351U, 0x6451U, 0x6551U, 0x6651U, - 0x6751U, 0x6851U, 0x6951U, 0x6A51U, 0x6B51U, 0x6C51U, 0x6D51U, 0x6E51U, - 0x6F51U, 0x7051U, 0x7151U, 0x7251U, 0x7351U, 0x7451U, 0x7551U, 0x7651U, - 0x7751U, 0x7851U, 0x7951U, 0x7A51U, 0x3051U, 0x3151U, 0x3251U, 0x3351U, - 0x3451U, 0x3551U, 0x3651U, 0x3751U, 0x3851U, 0x3951U, 0x2B51U, 0x2F51U, - 0x4152U, 0x4252U, 0x4352U, 0x4452U, 0x4552U, 0x4652U, 0x4752U, 0x4852U, - 0x4952U, 0x4A52U, 0x4B52U, 0x4C52U, 0x4D52U, 0x4E52U, 0x4F52U, 0x5052U, - 0x5152U, 0x5252U, 0x5352U, 0x5452U, 0x5552U, 0x5652U, 0x5752U, 0x5852U, - 0x5952U, 0x5A52U, 0x6152U, 0x6252U, 0x6352U, 0x6452U, 0x6552U, 0x6652U, - 0x6752U, 0x6852U, 0x6952U, 0x6A52U, 0x6B52U, 0x6C52U, 0x6D52U, 0x6E52U, - 0x6F52U, 0x7052U, 0x7152U, 0x7252U, 0x7352U, 0x7452U, 0x7552U, 0x7652U, - 0x7752U, 0x7852U, 0x7952U, 0x7A52U, 0x3052U, 0x3152U, 0x3252U, 0x3352U, - 0x3452U, 0x3552U, 0x3652U, 0x3752U, 0x3852U, 0x3952U, 0x2B52U, 0x2F52U, - 0x4153U, 0x4253U, 0x4353U, 0x4453U, 0x4553U, 0x4653U, 0x4753U, 0x4853U, - 0x4953U, 0x4A53U, 0x4B53U, 0x4C53U, 0x4D53U, 0x4E53U, 0x4F53U, 0x5053U, - 0x5153U, 0x5253U, 0x5353U, 0x5453U, 0x5553U, 0x5653U, 0x5753U, 0x5853U, - 0x5953U, 0x5A53U, 0x6153U, 0x6253U, 0x6353U, 0x6453U, 0x6553U, 0x6653U, - 0x6753U, 0x6853U, 0x6953U, 0x6A53U, 0x6B53U, 0x6C53U, 0x6D53U, 0x6E53U, - 0x6F53U, 0x7053U, 0x7153U, 0x7253U, 0x7353U, 0x7453U, 0x7553U, 0x7653U, - 0x7753U, 0x7853U, 0x7953U, 0x7A53U, 0x3053U, 0x3153U, 0x3253U, 0x3353U, - 0x3453U, 0x3553U, 0x3653U, 0x3753U, 0x3853U, 0x3953U, 0x2B53U, 0x2F53U, - 0x4154U, 0x4254U, 0x4354U, 0x4454U, 0x4554U, 0x4654U, 0x4754U, 0x4854U, - 0x4954U, 0x4A54U, 0x4B54U, 0x4C54U, 0x4D54U, 0x4E54U, 0x4F54U, 0x5054U, - 0x5154U, 0x5254U, 0x5354U, 0x5454U, 0x5554U, 0x5654U, 0x5754U, 0x5854U, - 0x5954U, 0x5A54U, 0x6154U, 0x6254U, 0x6354U, 0x6454U, 0x6554U, 0x6654U, - 0x6754U, 0x6854U, 0x6954U, 0x6A54U, 0x6B54U, 0x6C54U, 0x6D54U, 0x6E54U, - 0x6F54U, 0x7054U, 0x7154U, 0x7254U, 0x7354U, 0x7454U, 0x7554U, 0x7654U, - 0x7754U, 0x7854U, 0x7954U, 0x7A54U, 0x3054U, 0x3154U, 0x3254U, 0x3354U, - 0x3454U, 0x3554U, 0x3654U, 0x3754U, 0x3854U, 0x3954U, 0x2B54U, 0x2F54U, - 0x4155U, 0x4255U, 0x4355U, 0x4455U, 0x4555U, 0x4655U, 0x4755U, 0x4855U, - 0x4955U, 0x4A55U, 0x4B55U, 0x4C55U, 0x4D55U, 0x4E55U, 0x4F55U, 0x5055U, - 0x5155U, 0x5255U, 0x5355U, 0x5455U, 0x5555U, 0x5655U, 0x5755U, 0x5855U, - 0x5955U, 0x5A55U, 0x6155U, 0x6255U, 0x6355U, 0x6455U, 0x6555U, 0x6655U, - 0x6755U, 0x6855U, 0x6955U, 0x6A55U, 0x6B55U, 0x6C55U, 0x6D55U, 0x6E55U, - 0x6F55U, 0x7055U, 0x7155U, 0x7255U, 0x7355U, 0x7455U, 0x7555U, 0x7655U, - 0x7755U, 0x7855U, 0x7955U, 0x7A55U, 0x3055U, 0x3155U, 0x3255U, 0x3355U, - 0x3455U, 0x3555U, 0x3655U, 0x3755U, 0x3855U, 0x3955U, 0x2B55U, 0x2F55U, - 0x4156U, 0x4256U, 0x4356U, 0x4456U, 0x4556U, 0x4656U, 0x4756U, 0x4856U, - 0x4956U, 0x4A56U, 0x4B56U, 0x4C56U, 0x4D56U, 0x4E56U, 0x4F56U, 0x5056U, - 0x5156U, 0x5256U, 0x5356U, 0x5456U, 0x5556U, 0x5656U, 0x5756U, 0x5856U, - 0x5956U, 0x5A56U, 0x6156U, 0x6256U, 0x6356U, 0x6456U, 0x6556U, 0x6656U, - 0x6756U, 0x6856U, 0x6956U, 0x6A56U, 0x6B56U, 0x6C56U, 0x6D56U, 0x6E56U, - 0x6F56U, 0x7056U, 0x7156U, 0x7256U, 0x7356U, 0x7456U, 0x7556U, 0x7656U, - 0x7756U, 0x7856U, 0x7956U, 0x7A56U, 0x3056U, 0x3156U, 0x3256U, 0x3356U, - 0x3456U, 0x3556U, 0x3656U, 0x3756U, 0x3856U, 0x3956U, 0x2B56U, 0x2F56U, - 0x4157U, 0x4257U, 0x4357U, 0x4457U, 0x4557U, 0x4657U, 0x4757U, 0x4857U, - 0x4957U, 0x4A57U, 0x4B57U, 0x4C57U, 0x4D57U, 0x4E57U, 0x4F57U, 0x5057U, - 0x5157U, 0x5257U, 0x5357U, 0x5457U, 0x5557U, 0x5657U, 0x5757U, 0x5857U, - 0x5957U, 0x5A57U, 0x6157U, 0x6257U, 0x6357U, 0x6457U, 0x6557U, 0x6657U, - 0x6757U, 0x6857U, 0x6957U, 0x6A57U, 0x6B57U, 0x6C57U, 0x6D57U, 0x6E57U, - 0x6F57U, 0x7057U, 0x7157U, 0x7257U, 0x7357U, 0x7457U, 0x7557U, 0x7657U, - 0x7757U, 0x7857U, 0x7957U, 0x7A57U, 0x3057U, 0x3157U, 0x3257U, 0x3357U, - 0x3457U, 0x3557U, 0x3657U, 0x3757U, 0x3857U, 0x3957U, 0x2B57U, 0x2F57U, - 0x4158U, 0x4258U, 0x4358U, 0x4458U, 0x4558U, 0x4658U, 0x4758U, 0x4858U, - 0x4958U, 0x4A58U, 0x4B58U, 0x4C58U, 0x4D58U, 0x4E58U, 0x4F58U, 0x5058U, - 0x5158U, 0x5258U, 0x5358U, 0x5458U, 0x5558U, 0x5658U, 0x5758U, 0x5858U, - 0x5958U, 0x5A58U, 0x6158U, 0x6258U, 0x6358U, 0x6458U, 0x6558U, 0x6658U, - 0x6758U, 0x6858U, 0x6958U, 0x6A58U, 0x6B58U, 0x6C58U, 0x6D58U, 0x6E58U, - 0x6F58U, 0x7058U, 0x7158U, 0x7258U, 0x7358U, 0x7458U, 0x7558U, 0x7658U, - 0x7758U, 0x7858U, 0x7958U, 0x7A58U, 0x3058U, 0x3158U, 0x3258U, 0x3358U, - 0x3458U, 0x3558U, 0x3658U, 0x3758U, 0x3858U, 0x3958U, 0x2B58U, 0x2F58U, - 0x4159U, 0x4259U, 0x4359U, 0x4459U, 0x4559U, 0x4659U, 0x4759U, 0x4859U, - 0x4959U, 0x4A59U, 0x4B59U, 0x4C59U, 0x4D59U, 0x4E59U, 0x4F59U, 0x5059U, - 0x5159U, 0x5259U, 0x5359U, 0x5459U, 0x5559U, 0x5659U, 0x5759U, 0x5859U, - 0x5959U, 0x5A59U, 0x6159U, 0x6259U, 0x6359U, 0x6459U, 0x6559U, 0x6659U, - 0x6759U, 0x6859U, 0x6959U, 0x6A59U, 0x6B59U, 0x6C59U, 0x6D59U, 0x6E59U, - 0x6F59U, 0x7059U, 0x7159U, 0x7259U, 0x7359U, 0x7459U, 0x7559U, 0x7659U, - 0x7759U, 0x7859U, 0x7959U, 0x7A59U, 0x3059U, 0x3159U, 0x3259U, 0x3359U, - 0x3459U, 0x3559U, 0x3659U, 0x3759U, 0x3859U, 0x3959U, 0x2B59U, 0x2F59U, - 0x415AU, 0x425AU, 0x435AU, 0x445AU, 0x455AU, 0x465AU, 0x475AU, 0x485AU, - 0x495AU, 0x4A5AU, 0x4B5AU, 0x4C5AU, 0x4D5AU, 0x4E5AU, 0x4F5AU, 0x505AU, - 0x515AU, 0x525AU, 0x535AU, 0x545AU, 0x555AU, 0x565AU, 0x575AU, 0x585AU, - 0x595AU, 0x5A5AU, 0x615AU, 0x625AU, 0x635AU, 0x645AU, 0x655AU, 0x665AU, - 0x675AU, 0x685AU, 0x695AU, 0x6A5AU, 0x6B5AU, 0x6C5AU, 0x6D5AU, 0x6E5AU, - 0x6F5AU, 0x705AU, 0x715AU, 0x725AU, 0x735AU, 0x745AU, 0x755AU, 0x765AU, - 0x775AU, 0x785AU, 0x795AU, 0x7A5AU, 0x305AU, 0x315AU, 0x325AU, 0x335AU, - 0x345AU, 0x355AU, 0x365AU, 0x375AU, 0x385AU, 0x395AU, 0x2B5AU, 0x2F5AU, - 0x4161U, 0x4261U, 0x4361U, 0x4461U, 0x4561U, 0x4661U, 0x4761U, 0x4861U, - 0x4961U, 0x4A61U, 0x4B61U, 0x4C61U, 0x4D61U, 0x4E61U, 0x4F61U, 0x5061U, - 0x5161U, 0x5261U, 0x5361U, 0x5461U, 0x5561U, 0x5661U, 0x5761U, 0x5861U, - 0x5961U, 0x5A61U, 0x6161U, 0x6261U, 0x6361U, 0x6461U, 0x6561U, 0x6661U, - 0x6761U, 0x6861U, 0x6961U, 0x6A61U, 0x6B61U, 0x6C61U, 0x6D61U, 0x6E61U, - 0x6F61U, 0x7061U, 0x7161U, 0x7261U, 0x7361U, 0x7461U, 0x7561U, 0x7661U, - 0x7761U, 0x7861U, 0x7961U, 0x7A61U, 0x3061U, 0x3161U, 0x3261U, 0x3361U, - 0x3461U, 0x3561U, 0x3661U, 0x3761U, 0x3861U, 0x3961U, 0x2B61U, 0x2F61U, - 0x4162U, 0x4262U, 0x4362U, 0x4462U, 0x4562U, 0x4662U, 0x4762U, 0x4862U, - 0x4962U, 0x4A62U, 0x4B62U, 0x4C62U, 0x4D62U, 0x4E62U, 0x4F62U, 0x5062U, - 0x5162U, 0x5262U, 0x5362U, 0x5462U, 0x5562U, 0x5662U, 0x5762U, 0x5862U, - 0x5962U, 0x5A62U, 0x6162U, 0x6262U, 0x6362U, 0x6462U, 0x6562U, 0x6662U, - 0x6762U, 0x6862U, 0x6962U, 0x6A62U, 0x6B62U, 0x6C62U, 0x6D62U, 0x6E62U, - 0x6F62U, 0x7062U, 0x7162U, 0x7262U, 0x7362U, 0x7462U, 0x7562U, 0x7662U, - 0x7762U, 0x7862U, 0x7962U, 0x7A62U, 0x3062U, 0x3162U, 0x3262U, 0x3362U, - 0x3462U, 0x3562U, 0x3662U, 0x3762U, 0x3862U, 0x3962U, 0x2B62U, 0x2F62U, - 0x4163U, 0x4263U, 0x4363U, 0x4463U, 0x4563U, 0x4663U, 0x4763U, 0x4863U, - 0x4963U, 0x4A63U, 0x4B63U, 0x4C63U, 0x4D63U, 0x4E63U, 0x4F63U, 0x5063U, - 0x5163U, 0x5263U, 0x5363U, 0x5463U, 0x5563U, 0x5663U, 0x5763U, 0x5863U, - 0x5963U, 0x5A63U, 0x6163U, 0x6263U, 0x6363U, 0x6463U, 0x6563U, 0x6663U, - 0x6763U, 0x6863U, 0x6963U, 0x6A63U, 0x6B63U, 0x6C63U, 0x6D63U, 0x6E63U, - 0x6F63U, 0x7063U, 0x7163U, 0x7263U, 0x7363U, 0x7463U, 0x7563U, 0x7663U, - 0x7763U, 0x7863U, 0x7963U, 0x7A63U, 0x3063U, 0x3163U, 0x3263U, 0x3363U, - 0x3463U, 0x3563U, 0x3663U, 0x3763U, 0x3863U, 0x3963U, 0x2B63U, 0x2F63U, - 0x4164U, 0x4264U, 0x4364U, 0x4464U, 0x4564U, 0x4664U, 0x4764U, 0x4864U, - 0x4964U, 0x4A64U, 0x4B64U, 0x4C64U, 0x4D64U, 0x4E64U, 0x4F64U, 0x5064U, - 0x5164U, 0x5264U, 0x5364U, 0x5464U, 0x5564U, 0x5664U, 0x5764U, 0x5864U, - 0x5964U, 0x5A64U, 0x6164U, 0x6264U, 0x6364U, 0x6464U, 0x6564U, 0x6664U, - 0x6764U, 0x6864U, 0x6964U, 0x6A64U, 0x6B64U, 0x6C64U, 0x6D64U, 0x6E64U, - 0x6F64U, 0x7064U, 0x7164U, 0x7264U, 0x7364U, 0x7464U, 0x7564U, 0x7664U, - 0x7764U, 0x7864U, 0x7964U, 0x7A64U, 0x3064U, 0x3164U, 0x3264U, 0x3364U, - 0x3464U, 0x3564U, 0x3664U, 0x3764U, 0x3864U, 0x3964U, 0x2B64U, 0x2F64U, - 0x4165U, 0x4265U, 0x4365U, 0x4465U, 0x4565U, 0x4665U, 0x4765U, 0x4865U, - 0x4965U, 0x4A65U, 0x4B65U, 0x4C65U, 0x4D65U, 0x4E65U, 0x4F65U, 0x5065U, - 0x5165U, 0x5265U, 0x5365U, 0x5465U, 0x5565U, 0x5665U, 0x5765U, 0x5865U, - 0x5965U, 0x5A65U, 0x6165U, 0x6265U, 0x6365U, 0x6465U, 0x6565U, 0x6665U, - 0x6765U, 0x6865U, 0x6965U, 0x6A65U, 0x6B65U, 0x6C65U, 0x6D65U, 0x6E65U, - 0x6F65U, 0x7065U, 0x7165U, 0x7265U, 0x7365U, 0x7465U, 0x7565U, 0x7665U, - 0x7765U, 0x7865U, 0x7965U, 0x7A65U, 0x3065U, 0x3165U, 0x3265U, 0x3365U, - 0x3465U, 0x3565U, 0x3665U, 0x3765U, 0x3865U, 0x3965U, 0x2B65U, 0x2F65U, - 0x4166U, 0x4266U, 0x4366U, 0x4466U, 0x4566U, 0x4666U, 0x4766U, 0x4866U, - 0x4966U, 0x4A66U, 0x4B66U, 0x4C66U, 0x4D66U, 0x4E66U, 0x4F66U, 0x5066U, - 0x5166U, 0x5266U, 0x5366U, 0x5466U, 0x5566U, 0x5666U, 0x5766U, 0x5866U, - 0x5966U, 0x5A66U, 0x6166U, 0x6266U, 0x6366U, 0x6466U, 0x6566U, 0x6666U, - 0x6766U, 0x6866U, 0x6966U, 0x6A66U, 0x6B66U, 0x6C66U, 0x6D66U, 0x6E66U, - 0x6F66U, 0x7066U, 0x7166U, 0x7266U, 0x7366U, 0x7466U, 0x7566U, 0x7666U, - 0x7766U, 0x7866U, 0x7966U, 0x7A66U, 0x3066U, 0x3166U, 0x3266U, 0x3366U, - 0x3466U, 0x3566U, 0x3666U, 0x3766U, 0x3866U, 0x3966U, 0x2B66U, 0x2F66U, - 0x4167U, 0x4267U, 0x4367U, 0x4467U, 0x4567U, 0x4667U, 0x4767U, 0x4867U, - 0x4967U, 0x4A67U, 0x4B67U, 0x4C67U, 0x4D67U, 0x4E67U, 0x4F67U, 0x5067U, - 0x5167U, 0x5267U, 0x5367U, 0x5467U, 0x5567U, 0x5667U, 0x5767U, 0x5867U, - 0x5967U, 0x5A67U, 0x6167U, 0x6267U, 0x6367U, 0x6467U, 0x6567U, 0x6667U, - 0x6767U, 0x6867U, 0x6967U, 0x6A67U, 0x6B67U, 0x6C67U, 0x6D67U, 0x6E67U, - 0x6F67U, 0x7067U, 0x7167U, 0x7267U, 0x7367U, 0x7467U, 0x7567U, 0x7667U, - 0x7767U, 0x7867U, 0x7967U, 0x7A67U, 0x3067U, 0x3167U, 0x3267U, 0x3367U, - 0x3467U, 0x3567U, 0x3667U, 0x3767U, 0x3867U, 0x3967U, 0x2B67U, 0x2F67U, - 0x4168U, 0x4268U, 0x4368U, 0x4468U, 0x4568U, 0x4668U, 0x4768U, 0x4868U, - 0x4968U, 0x4A68U, 0x4B68U, 0x4C68U, 0x4D68U, 0x4E68U, 0x4F68U, 0x5068U, - 0x5168U, 0x5268U, 0x5368U, 0x5468U, 0x5568U, 0x5668U, 0x5768U, 0x5868U, - 0x5968U, 0x5A68U, 0x6168U, 0x6268U, 0x6368U, 0x6468U, 0x6568U, 0x6668U, - 0x6768U, 0x6868U, 0x6968U, 0x6A68U, 0x6B68U, 0x6C68U, 0x6D68U, 0x6E68U, - 0x6F68U, 0x7068U, 0x7168U, 0x7268U, 0x7368U, 0x7468U, 0x7568U, 0x7668U, - 0x7768U, 0x7868U, 0x7968U, 0x7A68U, 0x3068U, 0x3168U, 0x3268U, 0x3368U, - 0x3468U, 0x3568U, 0x3668U, 0x3768U, 0x3868U, 0x3968U, 0x2B68U, 0x2F68U, - 0x4169U, 0x4269U, 0x4369U, 0x4469U, 0x4569U, 0x4669U, 0x4769U, 0x4869U, - 0x4969U, 0x4A69U, 0x4B69U, 0x4C69U, 0x4D69U, 0x4E69U, 0x4F69U, 0x5069U, - 0x5169U, 0x5269U, 0x5369U, 0x5469U, 0x5569U, 0x5669U, 0x5769U, 0x5869U, - 0x5969U, 0x5A69U, 0x6169U, 0x6269U, 0x6369U, 0x6469U, 0x6569U, 0x6669U, - 0x6769U, 0x6869U, 0x6969U, 0x6A69U, 0x6B69U, 0x6C69U, 0x6D69U, 0x6E69U, - 0x6F69U, 0x7069U, 0x7169U, 0x7269U, 0x7369U, 0x7469U, 0x7569U, 0x7669U, - 0x7769U, 0x7869U, 0x7969U, 0x7A69U, 0x3069U, 0x3169U, 0x3269U, 0x3369U, - 0x3469U, 0x3569U, 0x3669U, 0x3769U, 0x3869U, 0x3969U, 0x2B69U, 0x2F69U, - 0x416AU, 0x426AU, 0x436AU, 0x446AU, 0x456AU, 0x466AU, 0x476AU, 0x486AU, - 0x496AU, 0x4A6AU, 0x4B6AU, 0x4C6AU, 0x4D6AU, 0x4E6AU, 0x4F6AU, 0x506AU, - 0x516AU, 0x526AU, 0x536AU, 0x546AU, 0x556AU, 0x566AU, 0x576AU, 0x586AU, - 0x596AU, 0x5A6AU, 0x616AU, 0x626AU, 0x636AU, 0x646AU, 0x656AU, 0x666AU, - 0x676AU, 0x686AU, 0x696AU, 0x6A6AU, 0x6B6AU, 0x6C6AU, 0x6D6AU, 0x6E6AU, - 0x6F6AU, 0x706AU, 0x716AU, 0x726AU, 0x736AU, 0x746AU, 0x756AU, 0x766AU, - 0x776AU, 0x786AU, 0x796AU, 0x7A6AU, 0x306AU, 0x316AU, 0x326AU, 0x336AU, - 0x346AU, 0x356AU, 0x366AU, 0x376AU, 0x386AU, 0x396AU, 0x2B6AU, 0x2F6AU, - 0x416BU, 0x426BU, 0x436BU, 0x446BU, 0x456BU, 0x466BU, 0x476BU, 0x486BU, - 0x496BU, 0x4A6BU, 0x4B6BU, 0x4C6BU, 0x4D6BU, 0x4E6BU, 0x4F6BU, 0x506BU, - 0x516BU, 0x526BU, 0x536BU, 0x546BU, 0x556BU, 0x566BU, 0x576BU, 0x586BU, - 0x596BU, 0x5A6BU, 0x616BU, 0x626BU, 0x636BU, 0x646BU, 0x656BU, 0x666BU, - 0x676BU, 0x686BU, 0x696BU, 0x6A6BU, 0x6B6BU, 0x6C6BU, 0x6D6BU, 0x6E6BU, - 0x6F6BU, 0x706BU, 0x716BU, 0x726BU, 0x736BU, 0x746BU, 0x756BU, 0x766BU, - 0x776BU, 0x786BU, 0x796BU, 0x7A6BU, 0x306BU, 0x316BU, 0x326BU, 0x336BU, - 0x346BU, 0x356BU, 0x366BU, 0x376BU, 0x386BU, 0x396BU, 0x2B6BU, 0x2F6BU, - 0x416CU, 0x426CU, 0x436CU, 0x446CU, 0x456CU, 0x466CU, 0x476CU, 0x486CU, - 0x496CU, 0x4A6CU, 0x4B6CU, 0x4C6CU, 0x4D6CU, 0x4E6CU, 0x4F6CU, 0x506CU, - 0x516CU, 0x526CU, 0x536CU, 0x546CU, 0x556CU, 0x566CU, 0x576CU, 0x586CU, - 0x596CU, 0x5A6CU, 0x616CU, 0x626CU, 0x636CU, 0x646CU, 0x656CU, 0x666CU, - 0x676CU, 0x686CU, 0x696CU, 0x6A6CU, 0x6B6CU, 0x6C6CU, 0x6D6CU, 0x6E6CU, - 0x6F6CU, 0x706CU, 0x716CU, 0x726CU, 0x736CU, 0x746CU, 0x756CU, 0x766CU, - 0x776CU, 0x786CU, 0x796CU, 0x7A6CU, 0x306CU, 0x316CU, 0x326CU, 0x336CU, - 0x346CU, 0x356CU, 0x366CU, 0x376CU, 0x386CU, 0x396CU, 0x2B6CU, 0x2F6CU, - 0x416DU, 0x426DU, 0x436DU, 0x446DU, 0x456DU, 0x466DU, 0x476DU, 0x486DU, - 0x496DU, 0x4A6DU, 0x4B6DU, 0x4C6DU, 0x4D6DU, 0x4E6DU, 0x4F6DU, 0x506DU, - 0x516DU, 0x526DU, 0x536DU, 0x546DU, 0x556DU, 0x566DU, 0x576DU, 0x586DU, - 0x596DU, 0x5A6DU, 0x616DU, 0x626DU, 0x636DU, 0x646DU, 0x656DU, 0x666DU, - 0x676DU, 0x686DU, 0x696DU, 0x6A6DU, 0x6B6DU, 0x6C6DU, 0x6D6DU, 0x6E6DU, - 0x6F6DU, 0x706DU, 0x716DU, 0x726DU, 0x736DU, 0x746DU, 0x756DU, 0x766DU, - 0x776DU, 0x786DU, 0x796DU, 0x7A6DU, 0x306DU, 0x316DU, 0x326DU, 0x336DU, - 0x346DU, 0x356DU, 0x366DU, 0x376DU, 0x386DU, 0x396DU, 0x2B6DU, 0x2F6DU, - 0x416EU, 0x426EU, 0x436EU, 0x446EU, 0x456EU, 0x466EU, 0x476EU, 0x486EU, - 0x496EU, 0x4A6EU, 0x4B6EU, 0x4C6EU, 0x4D6EU, 0x4E6EU, 0x4F6EU, 0x506EU, - 0x516EU, 0x526EU, 0x536EU, 0x546EU, 0x556EU, 0x566EU, 0x576EU, 0x586EU, - 0x596EU, 0x5A6EU, 0x616EU, 0x626EU, 0x636EU, 0x646EU, 0x656EU, 0x666EU, - 0x676EU, 0x686EU, 0x696EU, 0x6A6EU, 0x6B6EU, 0x6C6EU, 0x6D6EU, 0x6E6EU, - 0x6F6EU, 0x706EU, 0x716EU, 0x726EU, 0x736EU, 0x746EU, 0x756EU, 0x766EU, - 0x776EU, 0x786EU, 0x796EU, 0x7A6EU, 0x306EU, 0x316EU, 0x326EU, 0x336EU, - 0x346EU, 0x356EU, 0x366EU, 0x376EU, 0x386EU, 0x396EU, 0x2B6EU, 0x2F6EU, - 0x416FU, 0x426FU, 0x436FU, 0x446FU, 0x456FU, 0x466FU, 0x476FU, 0x486FU, - 0x496FU, 0x4A6FU, 0x4B6FU, 0x4C6FU, 0x4D6FU, 0x4E6FU, 0x4F6FU, 0x506FU, - 0x516FU, 0x526FU, 0x536FU, 0x546FU, 0x556FU, 0x566FU, 0x576FU, 0x586FU, - 0x596FU, 0x5A6FU, 0x616FU, 0x626FU, 0x636FU, 0x646FU, 0x656FU, 0x666FU, - 0x676FU, 0x686FU, 0x696FU, 0x6A6FU, 0x6B6FU, 0x6C6FU, 0x6D6FU, 0x6E6FU, - 0x6F6FU, 0x706FU, 0x716FU, 0x726FU, 0x736FU, 0x746FU, 0x756FU, 0x766FU, - 0x776FU, 0x786FU, 0x796FU, 0x7A6FU, 0x306FU, 0x316FU, 0x326FU, 0x336FU, - 0x346FU, 0x356FU, 0x366FU, 0x376FU, 0x386FU, 0x396FU, 0x2B6FU, 0x2F6FU, - 0x4170U, 0x4270U, 0x4370U, 0x4470U, 0x4570U, 0x4670U, 0x4770U, 0x4870U, - 0x4970U, 0x4A70U, 0x4B70U, 0x4C70U, 0x4D70U, 0x4E70U, 0x4F70U, 0x5070U, - 0x5170U, 0x5270U, 0x5370U, 0x5470U, 0x5570U, 0x5670U, 0x5770U, 0x5870U, - 0x5970U, 0x5A70U, 0x6170U, 0x6270U, 0x6370U, 0x6470U, 0x6570U, 0x6670U, - 0x6770U, 0x6870U, 0x6970U, 0x6A70U, 0x6B70U, 0x6C70U, 0x6D70U, 0x6E70U, - 0x6F70U, 0x7070U, 0x7170U, 0x7270U, 0x7370U, 0x7470U, 0x7570U, 0x7670U, - 0x7770U, 0x7870U, 0x7970U, 0x7A70U, 0x3070U, 0x3170U, 0x3270U, 0x3370U, - 0x3470U, 0x3570U, 0x3670U, 0x3770U, 0x3870U, 0x3970U, 0x2B70U, 0x2F70U, - 0x4171U, 0x4271U, 0x4371U, 0x4471U, 0x4571U, 0x4671U, 0x4771U, 0x4871U, - 0x4971U, 0x4A71U, 0x4B71U, 0x4C71U, 0x4D71U, 0x4E71U, 0x4F71U, 0x5071U, - 0x5171U, 0x5271U, 0x5371U, 0x5471U, 0x5571U, 0x5671U, 0x5771U, 0x5871U, - 0x5971U, 0x5A71U, 0x6171U, 0x6271U, 0x6371U, 0x6471U, 0x6571U, 0x6671U, - 0x6771U, 0x6871U, 0x6971U, 0x6A71U, 0x6B71U, 0x6C71U, 0x6D71U, 0x6E71U, - 0x6F71U, 0x7071U, 0x7171U, 0x7271U, 0x7371U, 0x7471U, 0x7571U, 0x7671U, - 0x7771U, 0x7871U, 0x7971U, 0x7A71U, 0x3071U, 0x3171U, 0x3271U, 0x3371U, - 0x3471U, 0x3571U, 0x3671U, 0x3771U, 0x3871U, 0x3971U, 0x2B71U, 0x2F71U, - 0x4172U, 0x4272U, 0x4372U, 0x4472U, 0x4572U, 0x4672U, 0x4772U, 0x4872U, - 0x4972U, 0x4A72U, 0x4B72U, 0x4C72U, 0x4D72U, 0x4E72U, 0x4F72U, 0x5072U, - 0x5172U, 0x5272U, 0x5372U, 0x5472U, 0x5572U, 0x5672U, 0x5772U, 0x5872U, - 0x5972U, 0x5A72U, 0x6172U, 0x6272U, 0x6372U, 0x6472U, 0x6572U, 0x6672U, - 0x6772U, 0x6872U, 0x6972U, 0x6A72U, 0x6B72U, 0x6C72U, 0x6D72U, 0x6E72U, - 0x6F72U, 0x7072U, 0x7172U, 0x7272U, 0x7372U, 0x7472U, 0x7572U, 0x7672U, - 0x7772U, 0x7872U, 0x7972U, 0x7A72U, 0x3072U, 0x3172U, 0x3272U, 0x3372U, - 0x3472U, 0x3572U, 0x3672U, 0x3772U, 0x3872U, 0x3972U, 0x2B72U, 0x2F72U, - 0x4173U, 0x4273U, 0x4373U, 0x4473U, 0x4573U, 0x4673U, 0x4773U, 0x4873U, - 0x4973U, 0x4A73U, 0x4B73U, 0x4C73U, 0x4D73U, 0x4E73U, 0x4F73U, 0x5073U, - 0x5173U, 0x5273U, 0x5373U, 0x5473U, 0x5573U, 0x5673U, 0x5773U, 0x5873U, - 0x5973U, 0x5A73U, 0x6173U, 0x6273U, 0x6373U, 0x6473U, 0x6573U, 0x6673U, - 0x6773U, 0x6873U, 0x6973U, 0x6A73U, 0x6B73U, 0x6C73U, 0x6D73U, 0x6E73U, - 0x6F73U, 0x7073U, 0x7173U, 0x7273U, 0x7373U, 0x7473U, 0x7573U, 0x7673U, - 0x7773U, 0x7873U, 0x7973U, 0x7A73U, 0x3073U, 0x3173U, 0x3273U, 0x3373U, - 0x3473U, 0x3573U, 0x3673U, 0x3773U, 0x3873U, 0x3973U, 0x2B73U, 0x2F73U, - 0x4174U, 0x4274U, 0x4374U, 0x4474U, 0x4574U, 0x4674U, 0x4774U, 0x4874U, - 0x4974U, 0x4A74U, 0x4B74U, 0x4C74U, 0x4D74U, 0x4E74U, 0x4F74U, 0x5074U, - 0x5174U, 0x5274U, 0x5374U, 0x5474U, 0x5574U, 0x5674U, 0x5774U, 0x5874U, - 0x5974U, 0x5A74U, 0x6174U, 0x6274U, 0x6374U, 0x6474U, 0x6574U, 0x6674U, - 0x6774U, 0x6874U, 0x6974U, 0x6A74U, 0x6B74U, 0x6C74U, 0x6D74U, 0x6E74U, - 0x6F74U, 0x7074U, 0x7174U, 0x7274U, 0x7374U, 0x7474U, 0x7574U, 0x7674U, - 0x7774U, 0x7874U, 0x7974U, 0x7A74U, 0x3074U, 0x3174U, 0x3274U, 0x3374U, - 0x3474U, 0x3574U, 0x3674U, 0x3774U, 0x3874U, 0x3974U, 0x2B74U, 0x2F74U, - 0x4175U, 0x4275U, 0x4375U, 0x4475U, 0x4575U, 0x4675U, 0x4775U, 0x4875U, - 0x4975U, 0x4A75U, 0x4B75U, 0x4C75U, 0x4D75U, 0x4E75U, 0x4F75U, 0x5075U, - 0x5175U, 0x5275U, 0x5375U, 0x5475U, 0x5575U, 0x5675U, 0x5775U, 0x5875U, - 0x5975U, 0x5A75U, 0x6175U, 0x6275U, 0x6375U, 0x6475U, 0x6575U, 0x6675U, - 0x6775U, 0x6875U, 0x6975U, 0x6A75U, 0x6B75U, 0x6C75U, 0x6D75U, 0x6E75U, - 0x6F75U, 0x7075U, 0x7175U, 0x7275U, 0x7375U, 0x7475U, 0x7575U, 0x7675U, - 0x7775U, 0x7875U, 0x7975U, 0x7A75U, 0x3075U, 0x3175U, 0x3275U, 0x3375U, - 0x3475U, 0x3575U, 0x3675U, 0x3775U, 0x3875U, 0x3975U, 0x2B75U, 0x2F75U, - 0x4176U, 0x4276U, 0x4376U, 0x4476U, 0x4576U, 0x4676U, 0x4776U, 0x4876U, - 0x4976U, 0x4A76U, 0x4B76U, 0x4C76U, 0x4D76U, 0x4E76U, 0x4F76U, 0x5076U, - 0x5176U, 0x5276U, 0x5376U, 0x5476U, 0x5576U, 0x5676U, 0x5776U, 0x5876U, - 0x5976U, 0x5A76U, 0x6176U, 0x6276U, 0x6376U, 0x6476U, 0x6576U, 0x6676U, - 0x6776U, 0x6876U, 0x6976U, 0x6A76U, 0x6B76U, 0x6C76U, 0x6D76U, 0x6E76U, - 0x6F76U, 0x7076U, 0x7176U, 0x7276U, 0x7376U, 0x7476U, 0x7576U, 0x7676U, - 0x7776U, 0x7876U, 0x7976U, 0x7A76U, 0x3076U, 0x3176U, 0x3276U, 0x3376U, - 0x3476U, 0x3576U, 0x3676U, 0x3776U, 0x3876U, 0x3976U, 0x2B76U, 0x2F76U, - 0x4177U, 0x4277U, 0x4377U, 0x4477U, 0x4577U, 0x4677U, 0x4777U, 0x4877U, - 0x4977U, 0x4A77U, 0x4B77U, 0x4C77U, 0x4D77U, 0x4E77U, 0x4F77U, 0x5077U, - 0x5177U, 0x5277U, 0x5377U, 0x5477U, 0x5577U, 0x5677U, 0x5777U, 0x5877U, - 0x5977U, 0x5A77U, 0x6177U, 0x6277U, 0x6377U, 0x6477U, 0x6577U, 0x6677U, - 0x6777U, 0x6877U, 0x6977U, 0x6A77U, 0x6B77U, 0x6C77U, 0x6D77U, 0x6E77U, - 0x6F77U, 0x7077U, 0x7177U, 0x7277U, 0x7377U, 0x7477U, 0x7577U, 0x7677U, - 0x7777U, 0x7877U, 0x7977U, 0x7A77U, 0x3077U, 0x3177U, 0x3277U, 0x3377U, - 0x3477U, 0x3577U, 0x3677U, 0x3777U, 0x3877U, 0x3977U, 0x2B77U, 0x2F77U, - 0x4178U, 0x4278U, 0x4378U, 0x4478U, 0x4578U, 0x4678U, 0x4778U, 0x4878U, - 0x4978U, 0x4A78U, 0x4B78U, 0x4C78U, 0x4D78U, 0x4E78U, 0x4F78U, 0x5078U, - 0x5178U, 0x5278U, 0x5378U, 0x5478U, 0x5578U, 0x5678U, 0x5778U, 0x5878U, - 0x5978U, 0x5A78U, 0x6178U, 0x6278U, 0x6378U, 0x6478U, 0x6578U, 0x6678U, - 0x6778U, 0x6878U, 0x6978U, 0x6A78U, 0x6B78U, 0x6C78U, 0x6D78U, 0x6E78U, - 0x6F78U, 0x7078U, 0x7178U, 0x7278U, 0x7378U, 0x7478U, 0x7578U, 0x7678U, - 0x7778U, 0x7878U, 0x7978U, 0x7A78U, 0x3078U, 0x3178U, 0x3278U, 0x3378U, - 0x3478U, 0x3578U, 0x3678U, 0x3778U, 0x3878U, 0x3978U, 0x2B78U, 0x2F78U, - 0x4179U, 0x4279U, 0x4379U, 0x4479U, 0x4579U, 0x4679U, 0x4779U, 0x4879U, - 0x4979U, 0x4A79U, 0x4B79U, 0x4C79U, 0x4D79U, 0x4E79U, 0x4F79U, 0x5079U, - 0x5179U, 0x5279U, 0x5379U, 0x5479U, 0x5579U, 0x5679U, 0x5779U, 0x5879U, - 0x5979U, 0x5A79U, 0x6179U, 0x6279U, 0x6379U, 0x6479U, 0x6579U, 0x6679U, - 0x6779U, 0x6879U, 0x6979U, 0x6A79U, 0x6B79U, 0x6C79U, 0x6D79U, 0x6E79U, - 0x6F79U, 0x7079U, 0x7179U, 0x7279U, 0x7379U, 0x7479U, 0x7579U, 0x7679U, - 0x7779U, 0x7879U, 0x7979U, 0x7A79U, 0x3079U, 0x3179U, 0x3279U, 0x3379U, - 0x3479U, 0x3579U, 0x3679U, 0x3779U, 0x3879U, 0x3979U, 0x2B79U, 0x2F79U, - 0x417AU, 0x427AU, 0x437AU, 0x447AU, 0x457AU, 0x467AU, 0x477AU, 0x487AU, - 0x497AU, 0x4A7AU, 0x4B7AU, 0x4C7AU, 0x4D7AU, 0x4E7AU, 0x4F7AU, 0x507AU, - 0x517AU, 0x527AU, 0x537AU, 0x547AU, 0x557AU, 0x567AU, 0x577AU, 0x587AU, - 0x597AU, 0x5A7AU, 0x617AU, 0x627AU, 0x637AU, 0x647AU, 0x657AU, 0x667AU, - 0x677AU, 0x687AU, 0x697AU, 0x6A7AU, 0x6B7AU, 0x6C7AU, 0x6D7AU, 0x6E7AU, - 0x6F7AU, 0x707AU, 0x717AU, 0x727AU, 0x737AU, 0x747AU, 0x757AU, 0x767AU, - 0x777AU, 0x787AU, 0x797AU, 0x7A7AU, 0x307AU, 0x317AU, 0x327AU, 0x337AU, - 0x347AU, 0x357AU, 0x367AU, 0x377AU, 0x387AU, 0x397AU, 0x2B7AU, 0x2F7AU, - 0x4130U, 0x4230U, 0x4330U, 0x4430U, 0x4530U, 0x4630U, 0x4730U, 0x4830U, - 0x4930U, 0x4A30U, 0x4B30U, 0x4C30U, 0x4D30U, 0x4E30U, 0x4F30U, 0x5030U, - 0x5130U, 0x5230U, 0x5330U, 0x5430U, 0x5530U, 0x5630U, 0x5730U, 0x5830U, - 0x5930U, 0x5A30U, 0x6130U, 0x6230U, 0x6330U, 0x6430U, 0x6530U, 0x6630U, - 0x6730U, 0x6830U, 0x6930U, 0x6A30U, 0x6B30U, 0x6C30U, 0x6D30U, 0x6E30U, - 0x6F30U, 0x7030U, 0x7130U, 0x7230U, 0x7330U, 0x7430U, 0x7530U, 0x7630U, - 0x7730U, 0x7830U, 0x7930U, 0x7A30U, 0x3030U, 0x3130U, 0x3230U, 0x3330U, - 0x3430U, 0x3530U, 0x3630U, 0x3730U, 0x3830U, 0x3930U, 0x2B30U, 0x2F30U, - 0x4131U, 0x4231U, 0x4331U, 0x4431U, 0x4531U, 0x4631U, 0x4731U, 0x4831U, - 0x4931U, 0x4A31U, 0x4B31U, 0x4C31U, 0x4D31U, 0x4E31U, 0x4F31U, 0x5031U, - 0x5131U, 0x5231U, 0x5331U, 0x5431U, 0x5531U, 0x5631U, 0x5731U, 0x5831U, - 0x5931U, 0x5A31U, 0x6131U, 0x6231U, 0x6331U, 0x6431U, 0x6531U, 0x6631U, - 0x6731U, 0x6831U, 0x6931U, 0x6A31U, 0x6B31U, 0x6C31U, 0x6D31U, 0x6E31U, - 0x6F31U, 0x7031U, 0x7131U, 0x7231U, 0x7331U, 0x7431U, 0x7531U, 0x7631U, - 0x7731U, 0x7831U, 0x7931U, 0x7A31U, 0x3031U, 0x3131U, 0x3231U, 0x3331U, - 0x3431U, 0x3531U, 0x3631U, 0x3731U, 0x3831U, 0x3931U, 0x2B31U, 0x2F31U, - 0x4132U, 0x4232U, 0x4332U, 0x4432U, 0x4532U, 0x4632U, 0x4732U, 0x4832U, - 0x4932U, 0x4A32U, 0x4B32U, 0x4C32U, 0x4D32U, 0x4E32U, 0x4F32U, 0x5032U, - 0x5132U, 0x5232U, 0x5332U, 0x5432U, 0x5532U, 0x5632U, 0x5732U, 0x5832U, - 0x5932U, 0x5A32U, 0x6132U, 0x6232U, 0x6332U, 0x6432U, 0x6532U, 0x6632U, - 0x6732U, 0x6832U, 0x6932U, 0x6A32U, 0x6B32U, 0x6C32U, 0x6D32U, 0x6E32U, - 0x6F32U, 0x7032U, 0x7132U, 0x7232U, 0x7332U, 0x7432U, 0x7532U, 0x7632U, - 0x7732U, 0x7832U, 0x7932U, 0x7A32U, 0x3032U, 0x3132U, 0x3232U, 0x3332U, - 0x3432U, 0x3532U, 0x3632U, 0x3732U, 0x3832U, 0x3932U, 0x2B32U, 0x2F32U, - 0x4133U, 0x4233U, 0x4333U, 0x4433U, 0x4533U, 0x4633U, 0x4733U, 0x4833U, - 0x4933U, 0x4A33U, 0x4B33U, 0x4C33U, 0x4D33U, 0x4E33U, 0x4F33U, 0x5033U, - 0x5133U, 0x5233U, 0x5333U, 0x5433U, 0x5533U, 0x5633U, 0x5733U, 0x5833U, - 0x5933U, 0x5A33U, 0x6133U, 0x6233U, 0x6333U, 0x6433U, 0x6533U, 0x6633U, - 0x6733U, 0x6833U, 0x6933U, 0x6A33U, 0x6B33U, 0x6C33U, 0x6D33U, 0x6E33U, - 0x6F33U, 0x7033U, 0x7133U, 0x7233U, 0x7333U, 0x7433U, 0x7533U, 0x7633U, - 0x7733U, 0x7833U, 0x7933U, 0x7A33U, 0x3033U, 0x3133U, 0x3233U, 0x3333U, - 0x3433U, 0x3533U, 0x3633U, 0x3733U, 0x3833U, 0x3933U, 0x2B33U, 0x2F33U, - 0x4134U, 0x4234U, 0x4334U, 0x4434U, 0x4534U, 0x4634U, 0x4734U, 0x4834U, - 0x4934U, 0x4A34U, 0x4B34U, 0x4C34U, 0x4D34U, 0x4E34U, 0x4F34U, 0x5034U, - 0x5134U, 0x5234U, 0x5334U, 0x5434U, 0x5534U, 0x5634U, 0x5734U, 0x5834U, - 0x5934U, 0x5A34U, 0x6134U, 0x6234U, 0x6334U, 0x6434U, 0x6534U, 0x6634U, - 0x6734U, 0x6834U, 0x6934U, 0x6A34U, 0x6B34U, 0x6C34U, 0x6D34U, 0x6E34U, - 0x6F34U, 0x7034U, 0x7134U, 0x7234U, 0x7334U, 0x7434U, 0x7534U, 0x7634U, - 0x7734U, 0x7834U, 0x7934U, 0x7A34U, 0x3034U, 0x3134U, 0x3234U, 0x3334U, - 0x3434U, 0x3534U, 0x3634U, 0x3734U, 0x3834U, 0x3934U, 0x2B34U, 0x2F34U, - 0x4135U, 0x4235U, 0x4335U, 0x4435U, 0x4535U, 0x4635U, 0x4735U, 0x4835U, - 0x4935U, 0x4A35U, 0x4B35U, 0x4C35U, 0x4D35U, 0x4E35U, 0x4F35U, 0x5035U, - 0x5135U, 0x5235U, 0x5335U, 0x5435U, 0x5535U, 0x5635U, 0x5735U, 0x5835U, - 0x5935U, 0x5A35U, 0x6135U, 0x6235U, 0x6335U, 0x6435U, 0x6535U, 0x6635U, - 0x6735U, 0x6835U, 0x6935U, 0x6A35U, 0x6B35U, 0x6C35U, 0x6D35U, 0x6E35U, - 0x6F35U, 0x7035U, 0x7135U, 0x7235U, 0x7335U, 0x7435U, 0x7535U, 0x7635U, - 0x7735U, 0x7835U, 0x7935U, 0x7A35U, 0x3035U, 0x3135U, 0x3235U, 0x3335U, - 0x3435U, 0x3535U, 0x3635U, 0x3735U, 0x3835U, 0x3935U, 0x2B35U, 0x2F35U, - 0x4136U, 0x4236U, 0x4336U, 0x4436U, 0x4536U, 0x4636U, 0x4736U, 0x4836U, - 0x4936U, 0x4A36U, 0x4B36U, 0x4C36U, 0x4D36U, 0x4E36U, 0x4F36U, 0x5036U, - 0x5136U, 0x5236U, 0x5336U, 0x5436U, 0x5536U, 0x5636U, 0x5736U, 0x5836U, - 0x5936U, 0x5A36U, 0x6136U, 0x6236U, 0x6336U, 0x6436U, 0x6536U, 0x6636U, - 0x6736U, 0x6836U, 0x6936U, 0x6A36U, 0x6B36U, 0x6C36U, 0x6D36U, 0x6E36U, - 0x6F36U, 0x7036U, 0x7136U, 0x7236U, 0x7336U, 0x7436U, 0x7536U, 0x7636U, - 0x7736U, 0x7836U, 0x7936U, 0x7A36U, 0x3036U, 0x3136U, 0x3236U, 0x3336U, - 0x3436U, 0x3536U, 0x3636U, 0x3736U, 0x3836U, 0x3936U, 0x2B36U, 0x2F36U, - 0x4137U, 0x4237U, 0x4337U, 0x4437U, 0x4537U, 0x4637U, 0x4737U, 0x4837U, - 0x4937U, 0x4A37U, 0x4B37U, 0x4C37U, 0x4D37U, 0x4E37U, 0x4F37U, 0x5037U, - 0x5137U, 0x5237U, 0x5337U, 0x5437U, 0x5537U, 0x5637U, 0x5737U, 0x5837U, - 0x5937U, 0x5A37U, 0x6137U, 0x6237U, 0x6337U, 0x6437U, 0x6537U, 0x6637U, - 0x6737U, 0x6837U, 0x6937U, 0x6A37U, 0x6B37U, 0x6C37U, 0x6D37U, 0x6E37U, - 0x6F37U, 0x7037U, 0x7137U, 0x7237U, 0x7337U, 0x7437U, 0x7537U, 0x7637U, - 0x7737U, 0x7837U, 0x7937U, 0x7A37U, 0x3037U, 0x3137U, 0x3237U, 0x3337U, - 0x3437U, 0x3537U, 0x3637U, 0x3737U, 0x3837U, 0x3937U, 0x2B37U, 0x2F37U, - 0x4138U, 0x4238U, 0x4338U, 0x4438U, 0x4538U, 0x4638U, 0x4738U, 0x4838U, - 0x4938U, 0x4A38U, 0x4B38U, 0x4C38U, 0x4D38U, 0x4E38U, 0x4F38U, 0x5038U, - 0x5138U, 0x5238U, 0x5338U, 0x5438U, 0x5538U, 0x5638U, 0x5738U, 0x5838U, - 0x5938U, 0x5A38U, 0x6138U, 0x6238U, 0x6338U, 0x6438U, 0x6538U, 0x6638U, - 0x6738U, 0x6838U, 0x6938U, 0x6A38U, 0x6B38U, 0x6C38U, 0x6D38U, 0x6E38U, - 0x6F38U, 0x7038U, 0x7138U, 0x7238U, 0x7338U, 0x7438U, 0x7538U, 0x7638U, - 0x7738U, 0x7838U, 0x7938U, 0x7A38U, 0x3038U, 0x3138U, 0x3238U, 0x3338U, - 0x3438U, 0x3538U, 0x3638U, 0x3738U, 0x3838U, 0x3938U, 0x2B38U, 0x2F38U, - 0x4139U, 0x4239U, 0x4339U, 0x4439U, 0x4539U, 0x4639U, 0x4739U, 0x4839U, - 0x4939U, 0x4A39U, 0x4B39U, 0x4C39U, 0x4D39U, 0x4E39U, 0x4F39U, 0x5039U, - 0x5139U, 0x5239U, 0x5339U, 0x5439U, 0x5539U, 0x5639U, 0x5739U, 0x5839U, - 0x5939U, 0x5A39U, 0x6139U, 0x6239U, 0x6339U, 0x6439U, 0x6539U, 0x6639U, - 0x6739U, 0x6839U, 0x6939U, 0x6A39U, 0x6B39U, 0x6C39U, 0x6D39U, 0x6E39U, - 0x6F39U, 0x7039U, 0x7139U, 0x7239U, 0x7339U, 0x7439U, 0x7539U, 0x7639U, - 0x7739U, 0x7839U, 0x7939U, 0x7A39U, 0x3039U, 0x3139U, 0x3239U, 0x3339U, - 0x3439U, 0x3539U, 0x3639U, 0x3739U, 0x3839U, 0x3939U, 0x2B39U, 0x2F39U, - 0x412BU, 0x422BU, 0x432BU, 0x442BU, 0x452BU, 0x462BU, 0x472BU, 0x482BU, - 0x492BU, 0x4A2BU, 0x4B2BU, 0x4C2BU, 0x4D2BU, 0x4E2BU, 0x4F2BU, 0x502BU, - 0x512BU, 0x522BU, 0x532BU, 0x542BU, 0x552BU, 0x562BU, 0x572BU, 0x582BU, - 0x592BU, 0x5A2BU, 0x612BU, 0x622BU, 0x632BU, 0x642BU, 0x652BU, 0x662BU, - 0x672BU, 0x682BU, 0x692BU, 0x6A2BU, 0x6B2BU, 0x6C2BU, 0x6D2BU, 0x6E2BU, - 0x6F2BU, 0x702BU, 0x712BU, 0x722BU, 0x732BU, 0x742BU, 0x752BU, 0x762BU, - 0x772BU, 0x782BU, 0x792BU, 0x7A2BU, 0x302BU, 0x312BU, 0x322BU, 0x332BU, - 0x342BU, 0x352BU, 0x362BU, 0x372BU, 0x382BU, 0x392BU, 0x2B2BU, 0x2F2BU, - 0x412FU, 0x422FU, 0x432FU, 0x442FU, 0x452FU, 0x462FU, 0x472FU, 0x482FU, - 0x492FU, 0x4A2FU, 0x4B2FU, 0x4C2FU, 0x4D2FU, 0x4E2FU, 0x4F2FU, 0x502FU, - 0x512FU, 0x522FU, 0x532FU, 0x542FU, 0x552FU, 0x562FU, 0x572FU, 0x582FU, - 0x592FU, 0x5A2FU, 0x612FU, 0x622FU, 0x632FU, 0x642FU, 0x652FU, 0x662FU, - 0x672FU, 0x682FU, 0x692FU, 0x6A2FU, 0x6B2FU, 0x6C2FU, 0x6D2FU, 0x6E2FU, - 0x6F2FU, 0x702FU, 0x712FU, 0x722FU, 0x732FU, 0x742FU, 0x752FU, 0x762FU, - 0x772FU, 0x782FU, 0x792FU, 0x7A2FU, 0x302FU, 0x312FU, 0x322FU, 0x332FU, - 0x342FU, 0x352FU, 0x362FU, 0x372FU, 0x382FU, 0x392FU, 0x2B2FU, 0x2F2FU, -#else - 0x4141U, 0x4142U, 0x4143U, 0x4144U, 0x4145U, 0x4146U, 0x4147U, 0x4148U, - 0x4149U, 0x414AU, 0x414BU, 0x414CU, 0x414DU, 0x414EU, 0x414FU, 0x4150U, - 0x4151U, 0x4152U, 0x4153U, 0x4154U, 0x4155U, 0x4156U, 0x4157U, 0x4158U, - 0x4159U, 0x415AU, 0x4161U, 0x4162U, 0x4163U, 0x4164U, 0x4165U, 0x4166U, - 0x4167U, 0x4168U, 0x4169U, 0x416AU, 0x416BU, 0x416CU, 0x416DU, 0x416EU, - 0x416FU, 0x4170U, 0x4171U, 0x4172U, 0x4173U, 0x4174U, 0x4175U, 0x4176U, - 0x4177U, 0x4178U, 0x4179U, 0x417AU, 0x4130U, 0x4131U, 0x4132U, 0x4133U, - 0x4134U, 0x4135U, 0x4136U, 0x4137U, 0x4138U, 0x4139U, 0x412BU, 0x412FU, - 0x4241U, 0x4242U, 0x4243U, 0x4244U, 0x4245U, 0x4246U, 0x4247U, 0x4248U, - 0x4249U, 0x424AU, 0x424BU, 0x424CU, 0x424DU, 0x424EU, 0x424FU, 0x4250U, - 0x4251U, 0x4252U, 0x4253U, 0x4254U, 0x4255U, 0x4256U, 0x4257U, 0x4258U, - 0x4259U, 0x425AU, 0x4261U, 0x4262U, 0x4263U, 0x4264U, 0x4265U, 0x4266U, - 0x4267U, 0x4268U, 0x4269U, 0x426AU, 0x426BU, 0x426CU, 0x426DU, 0x426EU, - 0x426FU, 0x4270U, 0x4271U, 0x4272U, 0x4273U, 0x4274U, 0x4275U, 0x4276U, - 0x4277U, 0x4278U, 0x4279U, 0x427AU, 0x4230U, 0x4231U, 0x4232U, 0x4233U, - 0x4234U, 0x4235U, 0x4236U, 0x4237U, 0x4238U, 0x4239U, 0x422BU, 0x422FU, - 0x4341U, 0x4342U, 0x4343U, 0x4344U, 0x4345U, 0x4346U, 0x4347U, 0x4348U, - 0x4349U, 0x434AU, 0x434BU, 0x434CU, 0x434DU, 0x434EU, 0x434FU, 0x4350U, - 0x4351U, 0x4352U, 0x4353U, 0x4354U, 0x4355U, 0x4356U, 0x4357U, 0x4358U, - 0x4359U, 0x435AU, 0x4361U, 0x4362U, 0x4363U, 0x4364U, 0x4365U, 0x4366U, - 0x4367U, 0x4368U, 0x4369U, 0x436AU, 0x436BU, 0x436CU, 0x436DU, 0x436EU, - 0x436FU, 0x4370U, 0x4371U, 0x4372U, 0x4373U, 0x4374U, 0x4375U, 0x4376U, - 0x4377U, 0x4378U, 0x4379U, 0x437AU, 0x4330U, 0x4331U, 0x4332U, 0x4333U, - 0x4334U, 0x4335U, 0x4336U, 0x4337U, 0x4338U, 0x4339U, 0x432BU, 0x432FU, - 0x4441U, 0x4442U, 0x4443U, 0x4444U, 0x4445U, 0x4446U, 0x4447U, 0x4448U, - 0x4449U, 0x444AU, 0x444BU, 0x444CU, 0x444DU, 0x444EU, 0x444FU, 0x4450U, - 0x4451U, 0x4452U, 0x4453U, 0x4454U, 0x4455U, 0x4456U, 0x4457U, 0x4458U, - 0x4459U, 0x445AU, 0x4461U, 0x4462U, 0x4463U, 0x4464U, 0x4465U, 0x4466U, - 0x4467U, 0x4468U, 0x4469U, 0x446AU, 0x446BU, 0x446CU, 0x446DU, 0x446EU, - 0x446FU, 0x4470U, 0x4471U, 0x4472U, 0x4473U, 0x4474U, 0x4475U, 0x4476U, - 0x4477U, 0x4478U, 0x4479U, 0x447AU, 0x4430U, 0x4431U, 0x4432U, 0x4433U, - 0x4434U, 0x4435U, 0x4436U, 0x4437U, 0x4438U, 0x4439U, 0x442BU, 0x442FU, - 0x4541U, 0x4542U, 0x4543U, 0x4544U, 0x4545U, 0x4546U, 0x4547U, 0x4548U, - 0x4549U, 0x454AU, 0x454BU, 0x454CU, 0x454DU, 0x454EU, 0x454FU, 0x4550U, - 0x4551U, 0x4552U, 0x4553U, 0x4554U, 0x4555U, 0x4556U, 0x4557U, 0x4558U, - 0x4559U, 0x455AU, 0x4561U, 0x4562U, 0x4563U, 0x4564U, 0x4565U, 0x4566U, - 0x4567U, 0x4568U, 0x4569U, 0x456AU, 0x456BU, 0x456CU, 0x456DU, 0x456EU, - 0x456FU, 0x4570U, 0x4571U, 0x4572U, 0x4573U, 0x4574U, 0x4575U, 0x4576U, - 0x4577U, 0x4578U, 0x4579U, 0x457AU, 0x4530U, 0x4531U, 0x4532U, 0x4533U, - 0x4534U, 0x4535U, 0x4536U, 0x4537U, 0x4538U, 0x4539U, 0x452BU, 0x452FU, - 0x4641U, 0x4642U, 0x4643U, 0x4644U, 0x4645U, 0x4646U, 0x4647U, 0x4648U, - 0x4649U, 0x464AU, 0x464BU, 0x464CU, 0x464DU, 0x464EU, 0x464FU, 0x4650U, - 0x4651U, 0x4652U, 0x4653U, 0x4654U, 0x4655U, 0x4656U, 0x4657U, 0x4658U, - 0x4659U, 0x465AU, 0x4661U, 0x4662U, 0x4663U, 0x4664U, 0x4665U, 0x4666U, - 0x4667U, 0x4668U, 0x4669U, 0x466AU, 0x466BU, 0x466CU, 0x466DU, 0x466EU, - 0x466FU, 0x4670U, 0x4671U, 0x4672U, 0x4673U, 0x4674U, 0x4675U, 0x4676U, - 0x4677U, 0x4678U, 0x4679U, 0x467AU, 0x4630U, 0x4631U, 0x4632U, 0x4633U, - 0x4634U, 0x4635U, 0x4636U, 0x4637U, 0x4638U, 0x4639U, 0x462BU, 0x462FU, - 0x4741U, 0x4742U, 0x4743U, 0x4744U, 0x4745U, 0x4746U, 0x4747U, 0x4748U, - 0x4749U, 0x474AU, 0x474BU, 0x474CU, 0x474DU, 0x474EU, 0x474FU, 0x4750U, - 0x4751U, 0x4752U, 0x4753U, 0x4754U, 0x4755U, 0x4756U, 0x4757U, 0x4758U, - 0x4759U, 0x475AU, 0x4761U, 0x4762U, 0x4763U, 0x4764U, 0x4765U, 0x4766U, - 0x4767U, 0x4768U, 0x4769U, 0x476AU, 0x476BU, 0x476CU, 0x476DU, 0x476EU, - 0x476FU, 0x4770U, 0x4771U, 0x4772U, 0x4773U, 0x4774U, 0x4775U, 0x4776U, - 0x4777U, 0x4778U, 0x4779U, 0x477AU, 0x4730U, 0x4731U, 0x4732U, 0x4733U, - 0x4734U, 0x4735U, 0x4736U, 0x4737U, 0x4738U, 0x4739U, 0x472BU, 0x472FU, - 0x4841U, 0x4842U, 0x4843U, 0x4844U, 0x4845U, 0x4846U, 0x4847U, 0x4848U, - 0x4849U, 0x484AU, 0x484BU, 0x484CU, 0x484DU, 0x484EU, 0x484FU, 0x4850U, - 0x4851U, 0x4852U, 0x4853U, 0x4854U, 0x4855U, 0x4856U, 0x4857U, 0x4858U, - 0x4859U, 0x485AU, 0x4861U, 0x4862U, 0x4863U, 0x4864U, 0x4865U, 0x4866U, - 0x4867U, 0x4868U, 0x4869U, 0x486AU, 0x486BU, 0x486CU, 0x486DU, 0x486EU, - 0x486FU, 0x4870U, 0x4871U, 0x4872U, 0x4873U, 0x4874U, 0x4875U, 0x4876U, - 0x4877U, 0x4878U, 0x4879U, 0x487AU, 0x4830U, 0x4831U, 0x4832U, 0x4833U, - 0x4834U, 0x4835U, 0x4836U, 0x4837U, 0x4838U, 0x4839U, 0x482BU, 0x482FU, - 0x4941U, 0x4942U, 0x4943U, 0x4944U, 0x4945U, 0x4946U, 0x4947U, 0x4948U, - 0x4949U, 0x494AU, 0x494BU, 0x494CU, 0x494DU, 0x494EU, 0x494FU, 0x4950U, - 0x4951U, 0x4952U, 0x4953U, 0x4954U, 0x4955U, 0x4956U, 0x4957U, 0x4958U, - 0x4959U, 0x495AU, 0x4961U, 0x4962U, 0x4963U, 0x4964U, 0x4965U, 0x4966U, - 0x4967U, 0x4968U, 0x4969U, 0x496AU, 0x496BU, 0x496CU, 0x496DU, 0x496EU, - 0x496FU, 0x4970U, 0x4971U, 0x4972U, 0x4973U, 0x4974U, 0x4975U, 0x4976U, - 0x4977U, 0x4978U, 0x4979U, 0x497AU, 0x4930U, 0x4931U, 0x4932U, 0x4933U, - 0x4934U, 0x4935U, 0x4936U, 0x4937U, 0x4938U, 0x4939U, 0x492BU, 0x492FU, - 0x4A41U, 0x4A42U, 0x4A43U, 0x4A44U, 0x4A45U, 0x4A46U, 0x4A47U, 0x4A48U, - 0x4A49U, 0x4A4AU, 0x4A4BU, 0x4A4CU, 0x4A4DU, 0x4A4EU, 0x4A4FU, 0x4A50U, - 0x4A51U, 0x4A52U, 0x4A53U, 0x4A54U, 0x4A55U, 0x4A56U, 0x4A57U, 0x4A58U, - 0x4A59U, 0x4A5AU, 0x4A61U, 0x4A62U, 0x4A63U, 0x4A64U, 0x4A65U, 0x4A66U, - 0x4A67U, 0x4A68U, 0x4A69U, 0x4A6AU, 0x4A6BU, 0x4A6CU, 0x4A6DU, 0x4A6EU, - 0x4A6FU, 0x4A70U, 0x4A71U, 0x4A72U, 0x4A73U, 0x4A74U, 0x4A75U, 0x4A76U, - 0x4A77U, 0x4A78U, 0x4A79U, 0x4A7AU, 0x4A30U, 0x4A31U, 0x4A32U, 0x4A33U, - 0x4A34U, 0x4A35U, 0x4A36U, 0x4A37U, 0x4A38U, 0x4A39U, 0x4A2BU, 0x4A2FU, - 0x4B41U, 0x4B42U, 0x4B43U, 0x4B44U, 0x4B45U, 0x4B46U, 0x4B47U, 0x4B48U, - 0x4B49U, 0x4B4AU, 0x4B4BU, 0x4B4CU, 0x4B4DU, 0x4B4EU, 0x4B4FU, 0x4B50U, - 0x4B51U, 0x4B52U, 0x4B53U, 0x4B54U, 0x4B55U, 0x4B56U, 0x4B57U, 0x4B58U, - 0x4B59U, 0x4B5AU, 0x4B61U, 0x4B62U, 0x4B63U, 0x4B64U, 0x4B65U, 0x4B66U, - 0x4B67U, 0x4B68U, 0x4B69U, 0x4B6AU, 0x4B6BU, 0x4B6CU, 0x4B6DU, 0x4B6EU, - 0x4B6FU, 0x4B70U, 0x4B71U, 0x4B72U, 0x4B73U, 0x4B74U, 0x4B75U, 0x4B76U, - 0x4B77U, 0x4B78U, 0x4B79U, 0x4B7AU, 0x4B30U, 0x4B31U, 0x4B32U, 0x4B33U, - 0x4B34U, 0x4B35U, 0x4B36U, 0x4B37U, 0x4B38U, 0x4B39U, 0x4B2BU, 0x4B2FU, - 0x4C41U, 0x4C42U, 0x4C43U, 0x4C44U, 0x4C45U, 0x4C46U, 0x4C47U, 0x4C48U, - 0x4C49U, 0x4C4AU, 0x4C4BU, 0x4C4CU, 0x4C4DU, 0x4C4EU, 0x4C4FU, 0x4C50U, - 0x4C51U, 0x4C52U, 0x4C53U, 0x4C54U, 0x4C55U, 0x4C56U, 0x4C57U, 0x4C58U, - 0x4C59U, 0x4C5AU, 0x4C61U, 0x4C62U, 0x4C63U, 0x4C64U, 0x4C65U, 0x4C66U, - 0x4C67U, 0x4C68U, 0x4C69U, 0x4C6AU, 0x4C6BU, 0x4C6CU, 0x4C6DU, 0x4C6EU, - 0x4C6FU, 0x4C70U, 0x4C71U, 0x4C72U, 0x4C73U, 0x4C74U, 0x4C75U, 0x4C76U, - 0x4C77U, 0x4C78U, 0x4C79U, 0x4C7AU, 0x4C30U, 0x4C31U, 0x4C32U, 0x4C33U, - 0x4C34U, 0x4C35U, 0x4C36U, 0x4C37U, 0x4C38U, 0x4C39U, 0x4C2BU, 0x4C2FU, - 0x4D41U, 0x4D42U, 0x4D43U, 0x4D44U, 0x4D45U, 0x4D46U, 0x4D47U, 0x4D48U, - 0x4D49U, 0x4D4AU, 0x4D4BU, 0x4D4CU, 0x4D4DU, 0x4D4EU, 0x4D4FU, 0x4D50U, - 0x4D51U, 0x4D52U, 0x4D53U, 0x4D54U, 0x4D55U, 0x4D56U, 0x4D57U, 0x4D58U, - 0x4D59U, 0x4D5AU, 0x4D61U, 0x4D62U, 0x4D63U, 0x4D64U, 0x4D65U, 0x4D66U, - 0x4D67U, 0x4D68U, 0x4D69U, 0x4D6AU, 0x4D6BU, 0x4D6CU, 0x4D6DU, 0x4D6EU, - 0x4D6FU, 0x4D70U, 0x4D71U, 0x4D72U, 0x4D73U, 0x4D74U, 0x4D75U, 0x4D76U, - 0x4D77U, 0x4D78U, 0x4D79U, 0x4D7AU, 0x4D30U, 0x4D31U, 0x4D32U, 0x4D33U, - 0x4D34U, 0x4D35U, 0x4D36U, 0x4D37U, 0x4D38U, 0x4D39U, 0x4D2BU, 0x4D2FU, - 0x4E41U, 0x4E42U, 0x4E43U, 0x4E44U, 0x4E45U, 0x4E46U, 0x4E47U, 0x4E48U, - 0x4E49U, 0x4E4AU, 0x4E4BU, 0x4E4CU, 0x4E4DU, 0x4E4EU, 0x4E4FU, 0x4E50U, - 0x4E51U, 0x4E52U, 0x4E53U, 0x4E54U, 0x4E55U, 0x4E56U, 0x4E57U, 0x4E58U, - 0x4E59U, 0x4E5AU, 0x4E61U, 0x4E62U, 0x4E63U, 0x4E64U, 0x4E65U, 0x4E66U, - 0x4E67U, 0x4E68U, 0x4E69U, 0x4E6AU, 0x4E6BU, 0x4E6CU, 0x4E6DU, 0x4E6EU, - 0x4E6FU, 0x4E70U, 0x4E71U, 0x4E72U, 0x4E73U, 0x4E74U, 0x4E75U, 0x4E76U, - 0x4E77U, 0x4E78U, 0x4E79U, 0x4E7AU, 0x4E30U, 0x4E31U, 0x4E32U, 0x4E33U, - 0x4E34U, 0x4E35U, 0x4E36U, 0x4E37U, 0x4E38U, 0x4E39U, 0x4E2BU, 0x4E2FU, - 0x4F41U, 0x4F42U, 0x4F43U, 0x4F44U, 0x4F45U, 0x4F46U, 0x4F47U, 0x4F48U, - 0x4F49U, 0x4F4AU, 0x4F4BU, 0x4F4CU, 0x4F4DU, 0x4F4EU, 0x4F4FU, 0x4F50U, - 0x4F51U, 0x4F52U, 0x4F53U, 0x4F54U, 0x4F55U, 0x4F56U, 0x4F57U, 0x4F58U, - 0x4F59U, 0x4F5AU, 0x4F61U, 0x4F62U, 0x4F63U, 0x4F64U, 0x4F65U, 0x4F66U, - 0x4F67U, 0x4F68U, 0x4F69U, 0x4F6AU, 0x4F6BU, 0x4F6CU, 0x4F6DU, 0x4F6EU, - 0x4F6FU, 0x4F70U, 0x4F71U, 0x4F72U, 0x4F73U, 0x4F74U, 0x4F75U, 0x4F76U, - 0x4F77U, 0x4F78U, 0x4F79U, 0x4F7AU, 0x4F30U, 0x4F31U, 0x4F32U, 0x4F33U, - 0x4F34U, 0x4F35U, 0x4F36U, 0x4F37U, 0x4F38U, 0x4F39U, 0x4F2BU, 0x4F2FU, - 0x5041U, 0x5042U, 0x5043U, 0x5044U, 0x5045U, 0x5046U, 0x5047U, 0x5048U, - 0x5049U, 0x504AU, 0x504BU, 0x504CU, 0x504DU, 0x504EU, 0x504FU, 0x5050U, - 0x5051U, 0x5052U, 0x5053U, 0x5054U, 0x5055U, 0x5056U, 0x5057U, 0x5058U, - 0x5059U, 0x505AU, 0x5061U, 0x5062U, 0x5063U, 0x5064U, 0x5065U, 0x5066U, - 0x5067U, 0x5068U, 0x5069U, 0x506AU, 0x506BU, 0x506CU, 0x506DU, 0x506EU, - 0x506FU, 0x5070U, 0x5071U, 0x5072U, 0x5073U, 0x5074U, 0x5075U, 0x5076U, - 0x5077U, 0x5078U, 0x5079U, 0x507AU, 0x5030U, 0x5031U, 0x5032U, 0x5033U, - 0x5034U, 0x5035U, 0x5036U, 0x5037U, 0x5038U, 0x5039U, 0x502BU, 0x502FU, - 0x5141U, 0x5142U, 0x5143U, 0x5144U, 0x5145U, 0x5146U, 0x5147U, 0x5148U, - 0x5149U, 0x514AU, 0x514BU, 0x514CU, 0x514DU, 0x514EU, 0x514FU, 0x5150U, - 0x5151U, 0x5152U, 0x5153U, 0x5154U, 0x5155U, 0x5156U, 0x5157U, 0x5158U, - 0x5159U, 0x515AU, 0x5161U, 0x5162U, 0x5163U, 0x5164U, 0x5165U, 0x5166U, - 0x5167U, 0x5168U, 0x5169U, 0x516AU, 0x516BU, 0x516CU, 0x516DU, 0x516EU, - 0x516FU, 0x5170U, 0x5171U, 0x5172U, 0x5173U, 0x5174U, 0x5175U, 0x5176U, - 0x5177U, 0x5178U, 0x5179U, 0x517AU, 0x5130U, 0x5131U, 0x5132U, 0x5133U, - 0x5134U, 0x5135U, 0x5136U, 0x5137U, 0x5138U, 0x5139U, 0x512BU, 0x512FU, - 0x5241U, 0x5242U, 0x5243U, 0x5244U, 0x5245U, 0x5246U, 0x5247U, 0x5248U, - 0x5249U, 0x524AU, 0x524BU, 0x524CU, 0x524DU, 0x524EU, 0x524FU, 0x5250U, - 0x5251U, 0x5252U, 0x5253U, 0x5254U, 0x5255U, 0x5256U, 0x5257U, 0x5258U, - 0x5259U, 0x525AU, 0x5261U, 0x5262U, 0x5263U, 0x5264U, 0x5265U, 0x5266U, - 0x5267U, 0x5268U, 0x5269U, 0x526AU, 0x526BU, 0x526CU, 0x526DU, 0x526EU, - 0x526FU, 0x5270U, 0x5271U, 0x5272U, 0x5273U, 0x5274U, 0x5275U, 0x5276U, - 0x5277U, 0x5278U, 0x5279U, 0x527AU, 0x5230U, 0x5231U, 0x5232U, 0x5233U, - 0x5234U, 0x5235U, 0x5236U, 0x5237U, 0x5238U, 0x5239U, 0x522BU, 0x522FU, - 0x5341U, 0x5342U, 0x5343U, 0x5344U, 0x5345U, 0x5346U, 0x5347U, 0x5348U, - 0x5349U, 0x534AU, 0x534BU, 0x534CU, 0x534DU, 0x534EU, 0x534FU, 0x5350U, - 0x5351U, 0x5352U, 0x5353U, 0x5354U, 0x5355U, 0x5356U, 0x5357U, 0x5358U, - 0x5359U, 0x535AU, 0x5361U, 0x5362U, 0x5363U, 0x5364U, 0x5365U, 0x5366U, - 0x5367U, 0x5368U, 0x5369U, 0x536AU, 0x536BU, 0x536CU, 0x536DU, 0x536EU, - 0x536FU, 0x5370U, 0x5371U, 0x5372U, 0x5373U, 0x5374U, 0x5375U, 0x5376U, - 0x5377U, 0x5378U, 0x5379U, 0x537AU, 0x5330U, 0x5331U, 0x5332U, 0x5333U, - 0x5334U, 0x5335U, 0x5336U, 0x5337U, 0x5338U, 0x5339U, 0x532BU, 0x532FU, - 0x5441U, 0x5442U, 0x5443U, 0x5444U, 0x5445U, 0x5446U, 0x5447U, 0x5448U, - 0x5449U, 0x544AU, 0x544BU, 0x544CU, 0x544DU, 0x544EU, 0x544FU, 0x5450U, - 0x5451U, 0x5452U, 0x5453U, 0x5454U, 0x5455U, 0x5456U, 0x5457U, 0x5458U, - 0x5459U, 0x545AU, 0x5461U, 0x5462U, 0x5463U, 0x5464U, 0x5465U, 0x5466U, - 0x5467U, 0x5468U, 0x5469U, 0x546AU, 0x546BU, 0x546CU, 0x546DU, 0x546EU, - 0x546FU, 0x5470U, 0x5471U, 0x5472U, 0x5473U, 0x5474U, 0x5475U, 0x5476U, - 0x5477U, 0x5478U, 0x5479U, 0x547AU, 0x5430U, 0x5431U, 0x5432U, 0x5433U, - 0x5434U, 0x5435U, 0x5436U, 0x5437U, 0x5438U, 0x5439U, 0x542BU, 0x542FU, - 0x5541U, 0x5542U, 0x5543U, 0x5544U, 0x5545U, 0x5546U, 0x5547U, 0x5548U, - 0x5549U, 0x554AU, 0x554BU, 0x554CU, 0x554DU, 0x554EU, 0x554FU, 0x5550U, - 0x5551U, 0x5552U, 0x5553U, 0x5554U, 0x5555U, 0x5556U, 0x5557U, 0x5558U, - 0x5559U, 0x555AU, 0x5561U, 0x5562U, 0x5563U, 0x5564U, 0x5565U, 0x5566U, - 0x5567U, 0x5568U, 0x5569U, 0x556AU, 0x556BU, 0x556CU, 0x556DU, 0x556EU, - 0x556FU, 0x5570U, 0x5571U, 0x5572U, 0x5573U, 0x5574U, 0x5575U, 0x5576U, - 0x5577U, 0x5578U, 0x5579U, 0x557AU, 0x5530U, 0x5531U, 0x5532U, 0x5533U, - 0x5534U, 0x5535U, 0x5536U, 0x5537U, 0x5538U, 0x5539U, 0x552BU, 0x552FU, - 0x5641U, 0x5642U, 0x5643U, 0x5644U, 0x5645U, 0x5646U, 0x5647U, 0x5648U, - 0x5649U, 0x564AU, 0x564BU, 0x564CU, 0x564DU, 0x564EU, 0x564FU, 0x5650U, - 0x5651U, 0x5652U, 0x5653U, 0x5654U, 0x5655U, 0x5656U, 0x5657U, 0x5658U, - 0x5659U, 0x565AU, 0x5661U, 0x5662U, 0x5663U, 0x5664U, 0x5665U, 0x5666U, - 0x5667U, 0x5668U, 0x5669U, 0x566AU, 0x566BU, 0x566CU, 0x566DU, 0x566EU, - 0x566FU, 0x5670U, 0x5671U, 0x5672U, 0x5673U, 0x5674U, 0x5675U, 0x5676U, - 0x5677U, 0x5678U, 0x5679U, 0x567AU, 0x5630U, 0x5631U, 0x5632U, 0x5633U, - 0x5634U, 0x5635U, 0x5636U, 0x5637U, 0x5638U, 0x5639U, 0x562BU, 0x562FU, - 0x5741U, 0x5742U, 0x5743U, 0x5744U, 0x5745U, 0x5746U, 0x5747U, 0x5748U, - 0x5749U, 0x574AU, 0x574BU, 0x574CU, 0x574DU, 0x574EU, 0x574FU, 0x5750U, - 0x5751U, 0x5752U, 0x5753U, 0x5754U, 0x5755U, 0x5756U, 0x5757U, 0x5758U, - 0x5759U, 0x575AU, 0x5761U, 0x5762U, 0x5763U, 0x5764U, 0x5765U, 0x5766U, - 0x5767U, 0x5768U, 0x5769U, 0x576AU, 0x576BU, 0x576CU, 0x576DU, 0x576EU, - 0x576FU, 0x5770U, 0x5771U, 0x5772U, 0x5773U, 0x5774U, 0x5775U, 0x5776U, - 0x5777U, 0x5778U, 0x5779U, 0x577AU, 0x5730U, 0x5731U, 0x5732U, 0x5733U, - 0x5734U, 0x5735U, 0x5736U, 0x5737U, 0x5738U, 0x5739U, 0x572BU, 0x572FU, - 0x5841U, 0x5842U, 0x5843U, 0x5844U, 0x5845U, 0x5846U, 0x5847U, 0x5848U, - 0x5849U, 0x584AU, 0x584BU, 0x584CU, 0x584DU, 0x584EU, 0x584FU, 0x5850U, - 0x5851U, 0x5852U, 0x5853U, 0x5854U, 0x5855U, 0x5856U, 0x5857U, 0x5858U, - 0x5859U, 0x585AU, 0x5861U, 0x5862U, 0x5863U, 0x5864U, 0x5865U, 0x5866U, - 0x5867U, 0x5868U, 0x5869U, 0x586AU, 0x586BU, 0x586CU, 0x586DU, 0x586EU, - 0x586FU, 0x5870U, 0x5871U, 0x5872U, 0x5873U, 0x5874U, 0x5875U, 0x5876U, - 0x5877U, 0x5878U, 0x5879U, 0x587AU, 0x5830U, 0x5831U, 0x5832U, 0x5833U, - 0x5834U, 0x5835U, 0x5836U, 0x5837U, 0x5838U, 0x5839U, 0x582BU, 0x582FU, - 0x5941U, 0x5942U, 0x5943U, 0x5944U, 0x5945U, 0x5946U, 0x5947U, 0x5948U, - 0x5949U, 0x594AU, 0x594BU, 0x594CU, 0x594DU, 0x594EU, 0x594FU, 0x5950U, - 0x5951U, 0x5952U, 0x5953U, 0x5954U, 0x5955U, 0x5956U, 0x5957U, 0x5958U, - 0x5959U, 0x595AU, 0x5961U, 0x5962U, 0x5963U, 0x5964U, 0x5965U, 0x5966U, - 0x5967U, 0x5968U, 0x5969U, 0x596AU, 0x596BU, 0x596CU, 0x596DU, 0x596EU, - 0x596FU, 0x5970U, 0x5971U, 0x5972U, 0x5973U, 0x5974U, 0x5975U, 0x5976U, - 0x5977U, 0x5978U, 0x5979U, 0x597AU, 0x5930U, 0x5931U, 0x5932U, 0x5933U, - 0x5934U, 0x5935U, 0x5936U, 0x5937U, 0x5938U, 0x5939U, 0x592BU, 0x592FU, - 0x5A41U, 0x5A42U, 0x5A43U, 0x5A44U, 0x5A45U, 0x5A46U, 0x5A47U, 0x5A48U, - 0x5A49U, 0x5A4AU, 0x5A4BU, 0x5A4CU, 0x5A4DU, 0x5A4EU, 0x5A4FU, 0x5A50U, - 0x5A51U, 0x5A52U, 0x5A53U, 0x5A54U, 0x5A55U, 0x5A56U, 0x5A57U, 0x5A58U, - 0x5A59U, 0x5A5AU, 0x5A61U, 0x5A62U, 0x5A63U, 0x5A64U, 0x5A65U, 0x5A66U, - 0x5A67U, 0x5A68U, 0x5A69U, 0x5A6AU, 0x5A6BU, 0x5A6CU, 0x5A6DU, 0x5A6EU, - 0x5A6FU, 0x5A70U, 0x5A71U, 0x5A72U, 0x5A73U, 0x5A74U, 0x5A75U, 0x5A76U, - 0x5A77U, 0x5A78U, 0x5A79U, 0x5A7AU, 0x5A30U, 0x5A31U, 0x5A32U, 0x5A33U, - 0x5A34U, 0x5A35U, 0x5A36U, 0x5A37U, 0x5A38U, 0x5A39U, 0x5A2BU, 0x5A2FU, - 0x6141U, 0x6142U, 0x6143U, 0x6144U, 0x6145U, 0x6146U, 0x6147U, 0x6148U, - 0x6149U, 0x614AU, 0x614BU, 0x614CU, 0x614DU, 0x614EU, 0x614FU, 0x6150U, - 0x6151U, 0x6152U, 0x6153U, 0x6154U, 0x6155U, 0x6156U, 0x6157U, 0x6158U, - 0x6159U, 0x615AU, 0x6161U, 0x6162U, 0x6163U, 0x6164U, 0x6165U, 0x6166U, - 0x6167U, 0x6168U, 0x6169U, 0x616AU, 0x616BU, 0x616CU, 0x616DU, 0x616EU, - 0x616FU, 0x6170U, 0x6171U, 0x6172U, 0x6173U, 0x6174U, 0x6175U, 0x6176U, - 0x6177U, 0x6178U, 0x6179U, 0x617AU, 0x6130U, 0x6131U, 0x6132U, 0x6133U, - 0x6134U, 0x6135U, 0x6136U, 0x6137U, 0x6138U, 0x6139U, 0x612BU, 0x612FU, - 0x6241U, 0x6242U, 0x6243U, 0x6244U, 0x6245U, 0x6246U, 0x6247U, 0x6248U, - 0x6249U, 0x624AU, 0x624BU, 0x624CU, 0x624DU, 0x624EU, 0x624FU, 0x6250U, - 0x6251U, 0x6252U, 0x6253U, 0x6254U, 0x6255U, 0x6256U, 0x6257U, 0x6258U, - 0x6259U, 0x625AU, 0x6261U, 0x6262U, 0x6263U, 0x6264U, 0x6265U, 0x6266U, - 0x6267U, 0x6268U, 0x6269U, 0x626AU, 0x626BU, 0x626CU, 0x626DU, 0x626EU, - 0x626FU, 0x6270U, 0x6271U, 0x6272U, 0x6273U, 0x6274U, 0x6275U, 0x6276U, - 0x6277U, 0x6278U, 0x6279U, 0x627AU, 0x6230U, 0x6231U, 0x6232U, 0x6233U, - 0x6234U, 0x6235U, 0x6236U, 0x6237U, 0x6238U, 0x6239U, 0x622BU, 0x622FU, - 0x6341U, 0x6342U, 0x6343U, 0x6344U, 0x6345U, 0x6346U, 0x6347U, 0x6348U, - 0x6349U, 0x634AU, 0x634BU, 0x634CU, 0x634DU, 0x634EU, 0x634FU, 0x6350U, - 0x6351U, 0x6352U, 0x6353U, 0x6354U, 0x6355U, 0x6356U, 0x6357U, 0x6358U, - 0x6359U, 0x635AU, 0x6361U, 0x6362U, 0x6363U, 0x6364U, 0x6365U, 0x6366U, - 0x6367U, 0x6368U, 0x6369U, 0x636AU, 0x636BU, 0x636CU, 0x636DU, 0x636EU, - 0x636FU, 0x6370U, 0x6371U, 0x6372U, 0x6373U, 0x6374U, 0x6375U, 0x6376U, - 0x6377U, 0x6378U, 0x6379U, 0x637AU, 0x6330U, 0x6331U, 0x6332U, 0x6333U, - 0x6334U, 0x6335U, 0x6336U, 0x6337U, 0x6338U, 0x6339U, 0x632BU, 0x632FU, - 0x6441U, 0x6442U, 0x6443U, 0x6444U, 0x6445U, 0x6446U, 0x6447U, 0x6448U, - 0x6449U, 0x644AU, 0x644BU, 0x644CU, 0x644DU, 0x644EU, 0x644FU, 0x6450U, - 0x6451U, 0x6452U, 0x6453U, 0x6454U, 0x6455U, 0x6456U, 0x6457U, 0x6458U, - 0x6459U, 0x645AU, 0x6461U, 0x6462U, 0x6463U, 0x6464U, 0x6465U, 0x6466U, - 0x6467U, 0x6468U, 0x6469U, 0x646AU, 0x646BU, 0x646CU, 0x646DU, 0x646EU, - 0x646FU, 0x6470U, 0x6471U, 0x6472U, 0x6473U, 0x6474U, 0x6475U, 0x6476U, - 0x6477U, 0x6478U, 0x6479U, 0x647AU, 0x6430U, 0x6431U, 0x6432U, 0x6433U, - 0x6434U, 0x6435U, 0x6436U, 0x6437U, 0x6438U, 0x6439U, 0x642BU, 0x642FU, - 0x6541U, 0x6542U, 0x6543U, 0x6544U, 0x6545U, 0x6546U, 0x6547U, 0x6548U, - 0x6549U, 0x654AU, 0x654BU, 0x654CU, 0x654DU, 0x654EU, 0x654FU, 0x6550U, - 0x6551U, 0x6552U, 0x6553U, 0x6554U, 0x6555U, 0x6556U, 0x6557U, 0x6558U, - 0x6559U, 0x655AU, 0x6561U, 0x6562U, 0x6563U, 0x6564U, 0x6565U, 0x6566U, - 0x6567U, 0x6568U, 0x6569U, 0x656AU, 0x656BU, 0x656CU, 0x656DU, 0x656EU, - 0x656FU, 0x6570U, 0x6571U, 0x6572U, 0x6573U, 0x6574U, 0x6575U, 0x6576U, - 0x6577U, 0x6578U, 0x6579U, 0x657AU, 0x6530U, 0x6531U, 0x6532U, 0x6533U, - 0x6534U, 0x6535U, 0x6536U, 0x6537U, 0x6538U, 0x6539U, 0x652BU, 0x652FU, - 0x6641U, 0x6642U, 0x6643U, 0x6644U, 0x6645U, 0x6646U, 0x6647U, 0x6648U, - 0x6649U, 0x664AU, 0x664BU, 0x664CU, 0x664DU, 0x664EU, 0x664FU, 0x6650U, - 0x6651U, 0x6652U, 0x6653U, 0x6654U, 0x6655U, 0x6656U, 0x6657U, 0x6658U, - 0x6659U, 0x665AU, 0x6661U, 0x6662U, 0x6663U, 0x6664U, 0x6665U, 0x6666U, - 0x6667U, 0x6668U, 0x6669U, 0x666AU, 0x666BU, 0x666CU, 0x666DU, 0x666EU, - 0x666FU, 0x6670U, 0x6671U, 0x6672U, 0x6673U, 0x6674U, 0x6675U, 0x6676U, - 0x6677U, 0x6678U, 0x6679U, 0x667AU, 0x6630U, 0x6631U, 0x6632U, 0x6633U, - 0x6634U, 0x6635U, 0x6636U, 0x6637U, 0x6638U, 0x6639U, 0x662BU, 0x662FU, - 0x6741U, 0x6742U, 0x6743U, 0x6744U, 0x6745U, 0x6746U, 0x6747U, 0x6748U, - 0x6749U, 0x674AU, 0x674BU, 0x674CU, 0x674DU, 0x674EU, 0x674FU, 0x6750U, - 0x6751U, 0x6752U, 0x6753U, 0x6754U, 0x6755U, 0x6756U, 0x6757U, 0x6758U, - 0x6759U, 0x675AU, 0x6761U, 0x6762U, 0x6763U, 0x6764U, 0x6765U, 0x6766U, - 0x6767U, 0x6768U, 0x6769U, 0x676AU, 0x676BU, 0x676CU, 0x676DU, 0x676EU, - 0x676FU, 0x6770U, 0x6771U, 0x6772U, 0x6773U, 0x6774U, 0x6775U, 0x6776U, - 0x6777U, 0x6778U, 0x6779U, 0x677AU, 0x6730U, 0x6731U, 0x6732U, 0x6733U, - 0x6734U, 0x6735U, 0x6736U, 0x6737U, 0x6738U, 0x6739U, 0x672BU, 0x672FU, - 0x6841U, 0x6842U, 0x6843U, 0x6844U, 0x6845U, 0x6846U, 0x6847U, 0x6848U, - 0x6849U, 0x684AU, 0x684BU, 0x684CU, 0x684DU, 0x684EU, 0x684FU, 0x6850U, - 0x6851U, 0x6852U, 0x6853U, 0x6854U, 0x6855U, 0x6856U, 0x6857U, 0x6858U, - 0x6859U, 0x685AU, 0x6861U, 0x6862U, 0x6863U, 0x6864U, 0x6865U, 0x6866U, - 0x6867U, 0x6868U, 0x6869U, 0x686AU, 0x686BU, 0x686CU, 0x686DU, 0x686EU, - 0x686FU, 0x6870U, 0x6871U, 0x6872U, 0x6873U, 0x6874U, 0x6875U, 0x6876U, - 0x6877U, 0x6878U, 0x6879U, 0x687AU, 0x6830U, 0x6831U, 0x6832U, 0x6833U, - 0x6834U, 0x6835U, 0x6836U, 0x6837U, 0x6838U, 0x6839U, 0x682BU, 0x682FU, - 0x6941U, 0x6942U, 0x6943U, 0x6944U, 0x6945U, 0x6946U, 0x6947U, 0x6948U, - 0x6949U, 0x694AU, 0x694BU, 0x694CU, 0x694DU, 0x694EU, 0x694FU, 0x6950U, - 0x6951U, 0x6952U, 0x6953U, 0x6954U, 0x6955U, 0x6956U, 0x6957U, 0x6958U, - 0x6959U, 0x695AU, 0x6961U, 0x6962U, 0x6963U, 0x6964U, 0x6965U, 0x6966U, - 0x6967U, 0x6968U, 0x6969U, 0x696AU, 0x696BU, 0x696CU, 0x696DU, 0x696EU, - 0x696FU, 0x6970U, 0x6971U, 0x6972U, 0x6973U, 0x6974U, 0x6975U, 0x6976U, - 0x6977U, 0x6978U, 0x6979U, 0x697AU, 0x6930U, 0x6931U, 0x6932U, 0x6933U, - 0x6934U, 0x6935U, 0x6936U, 0x6937U, 0x6938U, 0x6939U, 0x692BU, 0x692FU, - 0x6A41U, 0x6A42U, 0x6A43U, 0x6A44U, 0x6A45U, 0x6A46U, 0x6A47U, 0x6A48U, - 0x6A49U, 0x6A4AU, 0x6A4BU, 0x6A4CU, 0x6A4DU, 0x6A4EU, 0x6A4FU, 0x6A50U, - 0x6A51U, 0x6A52U, 0x6A53U, 0x6A54U, 0x6A55U, 0x6A56U, 0x6A57U, 0x6A58U, - 0x6A59U, 0x6A5AU, 0x6A61U, 0x6A62U, 0x6A63U, 0x6A64U, 0x6A65U, 0x6A66U, - 0x6A67U, 0x6A68U, 0x6A69U, 0x6A6AU, 0x6A6BU, 0x6A6CU, 0x6A6DU, 0x6A6EU, - 0x6A6FU, 0x6A70U, 0x6A71U, 0x6A72U, 0x6A73U, 0x6A74U, 0x6A75U, 0x6A76U, - 0x6A77U, 0x6A78U, 0x6A79U, 0x6A7AU, 0x6A30U, 0x6A31U, 0x6A32U, 0x6A33U, - 0x6A34U, 0x6A35U, 0x6A36U, 0x6A37U, 0x6A38U, 0x6A39U, 0x6A2BU, 0x6A2FU, - 0x6B41U, 0x6B42U, 0x6B43U, 0x6B44U, 0x6B45U, 0x6B46U, 0x6B47U, 0x6B48U, - 0x6B49U, 0x6B4AU, 0x6B4BU, 0x6B4CU, 0x6B4DU, 0x6B4EU, 0x6B4FU, 0x6B50U, - 0x6B51U, 0x6B52U, 0x6B53U, 0x6B54U, 0x6B55U, 0x6B56U, 0x6B57U, 0x6B58U, - 0x6B59U, 0x6B5AU, 0x6B61U, 0x6B62U, 0x6B63U, 0x6B64U, 0x6B65U, 0x6B66U, - 0x6B67U, 0x6B68U, 0x6B69U, 0x6B6AU, 0x6B6BU, 0x6B6CU, 0x6B6DU, 0x6B6EU, - 0x6B6FU, 0x6B70U, 0x6B71U, 0x6B72U, 0x6B73U, 0x6B74U, 0x6B75U, 0x6B76U, - 0x6B77U, 0x6B78U, 0x6B79U, 0x6B7AU, 0x6B30U, 0x6B31U, 0x6B32U, 0x6B33U, - 0x6B34U, 0x6B35U, 0x6B36U, 0x6B37U, 0x6B38U, 0x6B39U, 0x6B2BU, 0x6B2FU, - 0x6C41U, 0x6C42U, 0x6C43U, 0x6C44U, 0x6C45U, 0x6C46U, 0x6C47U, 0x6C48U, - 0x6C49U, 0x6C4AU, 0x6C4BU, 0x6C4CU, 0x6C4DU, 0x6C4EU, 0x6C4FU, 0x6C50U, - 0x6C51U, 0x6C52U, 0x6C53U, 0x6C54U, 0x6C55U, 0x6C56U, 0x6C57U, 0x6C58U, - 0x6C59U, 0x6C5AU, 0x6C61U, 0x6C62U, 0x6C63U, 0x6C64U, 0x6C65U, 0x6C66U, - 0x6C67U, 0x6C68U, 0x6C69U, 0x6C6AU, 0x6C6BU, 0x6C6CU, 0x6C6DU, 0x6C6EU, - 0x6C6FU, 0x6C70U, 0x6C71U, 0x6C72U, 0x6C73U, 0x6C74U, 0x6C75U, 0x6C76U, - 0x6C77U, 0x6C78U, 0x6C79U, 0x6C7AU, 0x6C30U, 0x6C31U, 0x6C32U, 0x6C33U, - 0x6C34U, 0x6C35U, 0x6C36U, 0x6C37U, 0x6C38U, 0x6C39U, 0x6C2BU, 0x6C2FU, - 0x6D41U, 0x6D42U, 0x6D43U, 0x6D44U, 0x6D45U, 0x6D46U, 0x6D47U, 0x6D48U, - 0x6D49U, 0x6D4AU, 0x6D4BU, 0x6D4CU, 0x6D4DU, 0x6D4EU, 0x6D4FU, 0x6D50U, - 0x6D51U, 0x6D52U, 0x6D53U, 0x6D54U, 0x6D55U, 0x6D56U, 0x6D57U, 0x6D58U, - 0x6D59U, 0x6D5AU, 0x6D61U, 0x6D62U, 0x6D63U, 0x6D64U, 0x6D65U, 0x6D66U, - 0x6D67U, 0x6D68U, 0x6D69U, 0x6D6AU, 0x6D6BU, 0x6D6CU, 0x6D6DU, 0x6D6EU, - 0x6D6FU, 0x6D70U, 0x6D71U, 0x6D72U, 0x6D73U, 0x6D74U, 0x6D75U, 0x6D76U, - 0x6D77U, 0x6D78U, 0x6D79U, 0x6D7AU, 0x6D30U, 0x6D31U, 0x6D32U, 0x6D33U, - 0x6D34U, 0x6D35U, 0x6D36U, 0x6D37U, 0x6D38U, 0x6D39U, 0x6D2BU, 0x6D2FU, - 0x6E41U, 0x6E42U, 0x6E43U, 0x6E44U, 0x6E45U, 0x6E46U, 0x6E47U, 0x6E48U, - 0x6E49U, 0x6E4AU, 0x6E4BU, 0x6E4CU, 0x6E4DU, 0x6E4EU, 0x6E4FU, 0x6E50U, - 0x6E51U, 0x6E52U, 0x6E53U, 0x6E54U, 0x6E55U, 0x6E56U, 0x6E57U, 0x6E58U, - 0x6E59U, 0x6E5AU, 0x6E61U, 0x6E62U, 0x6E63U, 0x6E64U, 0x6E65U, 0x6E66U, - 0x6E67U, 0x6E68U, 0x6E69U, 0x6E6AU, 0x6E6BU, 0x6E6CU, 0x6E6DU, 0x6E6EU, - 0x6E6FU, 0x6E70U, 0x6E71U, 0x6E72U, 0x6E73U, 0x6E74U, 0x6E75U, 0x6E76U, - 0x6E77U, 0x6E78U, 0x6E79U, 0x6E7AU, 0x6E30U, 0x6E31U, 0x6E32U, 0x6E33U, - 0x6E34U, 0x6E35U, 0x6E36U, 0x6E37U, 0x6E38U, 0x6E39U, 0x6E2BU, 0x6E2FU, - 0x6F41U, 0x6F42U, 0x6F43U, 0x6F44U, 0x6F45U, 0x6F46U, 0x6F47U, 0x6F48U, - 0x6F49U, 0x6F4AU, 0x6F4BU, 0x6F4CU, 0x6F4DU, 0x6F4EU, 0x6F4FU, 0x6F50U, - 0x6F51U, 0x6F52U, 0x6F53U, 0x6F54U, 0x6F55U, 0x6F56U, 0x6F57U, 0x6F58U, - 0x6F59U, 0x6F5AU, 0x6F61U, 0x6F62U, 0x6F63U, 0x6F64U, 0x6F65U, 0x6F66U, - 0x6F67U, 0x6F68U, 0x6F69U, 0x6F6AU, 0x6F6BU, 0x6F6CU, 0x6F6DU, 0x6F6EU, - 0x6F6FU, 0x6F70U, 0x6F71U, 0x6F72U, 0x6F73U, 0x6F74U, 0x6F75U, 0x6F76U, - 0x6F77U, 0x6F78U, 0x6F79U, 0x6F7AU, 0x6F30U, 0x6F31U, 0x6F32U, 0x6F33U, - 0x6F34U, 0x6F35U, 0x6F36U, 0x6F37U, 0x6F38U, 0x6F39U, 0x6F2BU, 0x6F2FU, - 0x7041U, 0x7042U, 0x7043U, 0x7044U, 0x7045U, 0x7046U, 0x7047U, 0x7048U, - 0x7049U, 0x704AU, 0x704BU, 0x704CU, 0x704DU, 0x704EU, 0x704FU, 0x7050U, - 0x7051U, 0x7052U, 0x7053U, 0x7054U, 0x7055U, 0x7056U, 0x7057U, 0x7058U, - 0x7059U, 0x705AU, 0x7061U, 0x7062U, 0x7063U, 0x7064U, 0x7065U, 0x7066U, - 0x7067U, 0x7068U, 0x7069U, 0x706AU, 0x706BU, 0x706CU, 0x706DU, 0x706EU, - 0x706FU, 0x7070U, 0x7071U, 0x7072U, 0x7073U, 0x7074U, 0x7075U, 0x7076U, - 0x7077U, 0x7078U, 0x7079U, 0x707AU, 0x7030U, 0x7031U, 0x7032U, 0x7033U, - 0x7034U, 0x7035U, 0x7036U, 0x7037U, 0x7038U, 0x7039U, 0x702BU, 0x702FU, - 0x7141U, 0x7142U, 0x7143U, 0x7144U, 0x7145U, 0x7146U, 0x7147U, 0x7148U, - 0x7149U, 0x714AU, 0x714BU, 0x714CU, 0x714DU, 0x714EU, 0x714FU, 0x7150U, - 0x7151U, 0x7152U, 0x7153U, 0x7154U, 0x7155U, 0x7156U, 0x7157U, 0x7158U, - 0x7159U, 0x715AU, 0x7161U, 0x7162U, 0x7163U, 0x7164U, 0x7165U, 0x7166U, - 0x7167U, 0x7168U, 0x7169U, 0x716AU, 0x716BU, 0x716CU, 0x716DU, 0x716EU, - 0x716FU, 0x7170U, 0x7171U, 0x7172U, 0x7173U, 0x7174U, 0x7175U, 0x7176U, - 0x7177U, 0x7178U, 0x7179U, 0x717AU, 0x7130U, 0x7131U, 0x7132U, 0x7133U, - 0x7134U, 0x7135U, 0x7136U, 0x7137U, 0x7138U, 0x7139U, 0x712BU, 0x712FU, - 0x7241U, 0x7242U, 0x7243U, 0x7244U, 0x7245U, 0x7246U, 0x7247U, 0x7248U, - 0x7249U, 0x724AU, 0x724BU, 0x724CU, 0x724DU, 0x724EU, 0x724FU, 0x7250U, - 0x7251U, 0x7252U, 0x7253U, 0x7254U, 0x7255U, 0x7256U, 0x7257U, 0x7258U, - 0x7259U, 0x725AU, 0x7261U, 0x7262U, 0x7263U, 0x7264U, 0x7265U, 0x7266U, - 0x7267U, 0x7268U, 0x7269U, 0x726AU, 0x726BU, 0x726CU, 0x726DU, 0x726EU, - 0x726FU, 0x7270U, 0x7271U, 0x7272U, 0x7273U, 0x7274U, 0x7275U, 0x7276U, - 0x7277U, 0x7278U, 0x7279U, 0x727AU, 0x7230U, 0x7231U, 0x7232U, 0x7233U, - 0x7234U, 0x7235U, 0x7236U, 0x7237U, 0x7238U, 0x7239U, 0x722BU, 0x722FU, - 0x7341U, 0x7342U, 0x7343U, 0x7344U, 0x7345U, 0x7346U, 0x7347U, 0x7348U, - 0x7349U, 0x734AU, 0x734BU, 0x734CU, 0x734DU, 0x734EU, 0x734FU, 0x7350U, - 0x7351U, 0x7352U, 0x7353U, 0x7354U, 0x7355U, 0x7356U, 0x7357U, 0x7358U, - 0x7359U, 0x735AU, 0x7361U, 0x7362U, 0x7363U, 0x7364U, 0x7365U, 0x7366U, - 0x7367U, 0x7368U, 0x7369U, 0x736AU, 0x736BU, 0x736CU, 0x736DU, 0x736EU, - 0x736FU, 0x7370U, 0x7371U, 0x7372U, 0x7373U, 0x7374U, 0x7375U, 0x7376U, - 0x7377U, 0x7378U, 0x7379U, 0x737AU, 0x7330U, 0x7331U, 0x7332U, 0x7333U, - 0x7334U, 0x7335U, 0x7336U, 0x7337U, 0x7338U, 0x7339U, 0x732BU, 0x732FU, - 0x7441U, 0x7442U, 0x7443U, 0x7444U, 0x7445U, 0x7446U, 0x7447U, 0x7448U, - 0x7449U, 0x744AU, 0x744BU, 0x744CU, 0x744DU, 0x744EU, 0x744FU, 0x7450U, - 0x7451U, 0x7452U, 0x7453U, 0x7454U, 0x7455U, 0x7456U, 0x7457U, 0x7458U, - 0x7459U, 0x745AU, 0x7461U, 0x7462U, 0x7463U, 0x7464U, 0x7465U, 0x7466U, - 0x7467U, 0x7468U, 0x7469U, 0x746AU, 0x746BU, 0x746CU, 0x746DU, 0x746EU, - 0x746FU, 0x7470U, 0x7471U, 0x7472U, 0x7473U, 0x7474U, 0x7475U, 0x7476U, - 0x7477U, 0x7478U, 0x7479U, 0x747AU, 0x7430U, 0x7431U, 0x7432U, 0x7433U, - 0x7434U, 0x7435U, 0x7436U, 0x7437U, 0x7438U, 0x7439U, 0x742BU, 0x742FU, - 0x7541U, 0x7542U, 0x7543U, 0x7544U, 0x7545U, 0x7546U, 0x7547U, 0x7548U, - 0x7549U, 0x754AU, 0x754BU, 0x754CU, 0x754DU, 0x754EU, 0x754FU, 0x7550U, - 0x7551U, 0x7552U, 0x7553U, 0x7554U, 0x7555U, 0x7556U, 0x7557U, 0x7558U, - 0x7559U, 0x755AU, 0x7561U, 0x7562U, 0x7563U, 0x7564U, 0x7565U, 0x7566U, - 0x7567U, 0x7568U, 0x7569U, 0x756AU, 0x756BU, 0x756CU, 0x756DU, 0x756EU, - 0x756FU, 0x7570U, 0x7571U, 0x7572U, 0x7573U, 0x7574U, 0x7575U, 0x7576U, - 0x7577U, 0x7578U, 0x7579U, 0x757AU, 0x7530U, 0x7531U, 0x7532U, 0x7533U, - 0x7534U, 0x7535U, 0x7536U, 0x7537U, 0x7538U, 0x7539U, 0x752BU, 0x752FU, - 0x7641U, 0x7642U, 0x7643U, 0x7644U, 0x7645U, 0x7646U, 0x7647U, 0x7648U, - 0x7649U, 0x764AU, 0x764BU, 0x764CU, 0x764DU, 0x764EU, 0x764FU, 0x7650U, - 0x7651U, 0x7652U, 0x7653U, 0x7654U, 0x7655U, 0x7656U, 0x7657U, 0x7658U, - 0x7659U, 0x765AU, 0x7661U, 0x7662U, 0x7663U, 0x7664U, 0x7665U, 0x7666U, - 0x7667U, 0x7668U, 0x7669U, 0x766AU, 0x766BU, 0x766CU, 0x766DU, 0x766EU, - 0x766FU, 0x7670U, 0x7671U, 0x7672U, 0x7673U, 0x7674U, 0x7675U, 0x7676U, - 0x7677U, 0x7678U, 0x7679U, 0x767AU, 0x7630U, 0x7631U, 0x7632U, 0x7633U, - 0x7634U, 0x7635U, 0x7636U, 0x7637U, 0x7638U, 0x7639U, 0x762BU, 0x762FU, - 0x7741U, 0x7742U, 0x7743U, 0x7744U, 0x7745U, 0x7746U, 0x7747U, 0x7748U, - 0x7749U, 0x774AU, 0x774BU, 0x774CU, 0x774DU, 0x774EU, 0x774FU, 0x7750U, - 0x7751U, 0x7752U, 0x7753U, 0x7754U, 0x7755U, 0x7756U, 0x7757U, 0x7758U, - 0x7759U, 0x775AU, 0x7761U, 0x7762U, 0x7763U, 0x7764U, 0x7765U, 0x7766U, - 0x7767U, 0x7768U, 0x7769U, 0x776AU, 0x776BU, 0x776CU, 0x776DU, 0x776EU, - 0x776FU, 0x7770U, 0x7771U, 0x7772U, 0x7773U, 0x7774U, 0x7775U, 0x7776U, - 0x7777U, 0x7778U, 0x7779U, 0x777AU, 0x7730U, 0x7731U, 0x7732U, 0x7733U, - 0x7734U, 0x7735U, 0x7736U, 0x7737U, 0x7738U, 0x7739U, 0x772BU, 0x772FU, - 0x7841U, 0x7842U, 0x7843U, 0x7844U, 0x7845U, 0x7846U, 0x7847U, 0x7848U, - 0x7849U, 0x784AU, 0x784BU, 0x784CU, 0x784DU, 0x784EU, 0x784FU, 0x7850U, - 0x7851U, 0x7852U, 0x7853U, 0x7854U, 0x7855U, 0x7856U, 0x7857U, 0x7858U, - 0x7859U, 0x785AU, 0x7861U, 0x7862U, 0x7863U, 0x7864U, 0x7865U, 0x7866U, - 0x7867U, 0x7868U, 0x7869U, 0x786AU, 0x786BU, 0x786CU, 0x786DU, 0x786EU, - 0x786FU, 0x7870U, 0x7871U, 0x7872U, 0x7873U, 0x7874U, 0x7875U, 0x7876U, - 0x7877U, 0x7878U, 0x7879U, 0x787AU, 0x7830U, 0x7831U, 0x7832U, 0x7833U, - 0x7834U, 0x7835U, 0x7836U, 0x7837U, 0x7838U, 0x7839U, 0x782BU, 0x782FU, - 0x7941U, 0x7942U, 0x7943U, 0x7944U, 0x7945U, 0x7946U, 0x7947U, 0x7948U, - 0x7949U, 0x794AU, 0x794BU, 0x794CU, 0x794DU, 0x794EU, 0x794FU, 0x7950U, - 0x7951U, 0x7952U, 0x7953U, 0x7954U, 0x7955U, 0x7956U, 0x7957U, 0x7958U, - 0x7959U, 0x795AU, 0x7961U, 0x7962U, 0x7963U, 0x7964U, 0x7965U, 0x7966U, - 0x7967U, 0x7968U, 0x7969U, 0x796AU, 0x796BU, 0x796CU, 0x796DU, 0x796EU, - 0x796FU, 0x7970U, 0x7971U, 0x7972U, 0x7973U, 0x7974U, 0x7975U, 0x7976U, - 0x7977U, 0x7978U, 0x7979U, 0x797AU, 0x7930U, 0x7931U, 0x7932U, 0x7933U, - 0x7934U, 0x7935U, 0x7936U, 0x7937U, 0x7938U, 0x7939U, 0x792BU, 0x792FU, - 0x7A41U, 0x7A42U, 0x7A43U, 0x7A44U, 0x7A45U, 0x7A46U, 0x7A47U, 0x7A48U, - 0x7A49U, 0x7A4AU, 0x7A4BU, 0x7A4CU, 0x7A4DU, 0x7A4EU, 0x7A4FU, 0x7A50U, - 0x7A51U, 0x7A52U, 0x7A53U, 0x7A54U, 0x7A55U, 0x7A56U, 0x7A57U, 0x7A58U, - 0x7A59U, 0x7A5AU, 0x7A61U, 0x7A62U, 0x7A63U, 0x7A64U, 0x7A65U, 0x7A66U, - 0x7A67U, 0x7A68U, 0x7A69U, 0x7A6AU, 0x7A6BU, 0x7A6CU, 0x7A6DU, 0x7A6EU, - 0x7A6FU, 0x7A70U, 0x7A71U, 0x7A72U, 0x7A73U, 0x7A74U, 0x7A75U, 0x7A76U, - 0x7A77U, 0x7A78U, 0x7A79U, 0x7A7AU, 0x7A30U, 0x7A31U, 0x7A32U, 0x7A33U, - 0x7A34U, 0x7A35U, 0x7A36U, 0x7A37U, 0x7A38U, 0x7A39U, 0x7A2BU, 0x7A2FU, - 0x3041U, 0x3042U, 0x3043U, 0x3044U, 0x3045U, 0x3046U, 0x3047U, 0x3048U, - 0x3049U, 0x304AU, 0x304BU, 0x304CU, 0x304DU, 0x304EU, 0x304FU, 0x3050U, - 0x3051U, 0x3052U, 0x3053U, 0x3054U, 0x3055U, 0x3056U, 0x3057U, 0x3058U, - 0x3059U, 0x305AU, 0x3061U, 0x3062U, 0x3063U, 0x3064U, 0x3065U, 0x3066U, - 0x3067U, 0x3068U, 0x3069U, 0x306AU, 0x306BU, 0x306CU, 0x306DU, 0x306EU, - 0x306FU, 0x3070U, 0x3071U, 0x3072U, 0x3073U, 0x3074U, 0x3075U, 0x3076U, - 0x3077U, 0x3078U, 0x3079U, 0x307AU, 0x3030U, 0x3031U, 0x3032U, 0x3033U, - 0x3034U, 0x3035U, 0x3036U, 0x3037U, 0x3038U, 0x3039U, 0x302BU, 0x302FU, - 0x3141U, 0x3142U, 0x3143U, 0x3144U, 0x3145U, 0x3146U, 0x3147U, 0x3148U, - 0x3149U, 0x314AU, 0x314BU, 0x314CU, 0x314DU, 0x314EU, 0x314FU, 0x3150U, - 0x3151U, 0x3152U, 0x3153U, 0x3154U, 0x3155U, 0x3156U, 0x3157U, 0x3158U, - 0x3159U, 0x315AU, 0x3161U, 0x3162U, 0x3163U, 0x3164U, 0x3165U, 0x3166U, - 0x3167U, 0x3168U, 0x3169U, 0x316AU, 0x316BU, 0x316CU, 0x316DU, 0x316EU, - 0x316FU, 0x3170U, 0x3171U, 0x3172U, 0x3173U, 0x3174U, 0x3175U, 0x3176U, - 0x3177U, 0x3178U, 0x3179U, 0x317AU, 0x3130U, 0x3131U, 0x3132U, 0x3133U, - 0x3134U, 0x3135U, 0x3136U, 0x3137U, 0x3138U, 0x3139U, 0x312BU, 0x312FU, - 0x3241U, 0x3242U, 0x3243U, 0x3244U, 0x3245U, 0x3246U, 0x3247U, 0x3248U, - 0x3249U, 0x324AU, 0x324BU, 0x324CU, 0x324DU, 0x324EU, 0x324FU, 0x3250U, - 0x3251U, 0x3252U, 0x3253U, 0x3254U, 0x3255U, 0x3256U, 0x3257U, 0x3258U, - 0x3259U, 0x325AU, 0x3261U, 0x3262U, 0x3263U, 0x3264U, 0x3265U, 0x3266U, - 0x3267U, 0x3268U, 0x3269U, 0x326AU, 0x326BU, 0x326CU, 0x326DU, 0x326EU, - 0x326FU, 0x3270U, 0x3271U, 0x3272U, 0x3273U, 0x3274U, 0x3275U, 0x3276U, - 0x3277U, 0x3278U, 0x3279U, 0x327AU, 0x3230U, 0x3231U, 0x3232U, 0x3233U, - 0x3234U, 0x3235U, 0x3236U, 0x3237U, 0x3238U, 0x3239U, 0x322BU, 0x322FU, - 0x3341U, 0x3342U, 0x3343U, 0x3344U, 0x3345U, 0x3346U, 0x3347U, 0x3348U, - 0x3349U, 0x334AU, 0x334BU, 0x334CU, 0x334DU, 0x334EU, 0x334FU, 0x3350U, - 0x3351U, 0x3352U, 0x3353U, 0x3354U, 0x3355U, 0x3356U, 0x3357U, 0x3358U, - 0x3359U, 0x335AU, 0x3361U, 0x3362U, 0x3363U, 0x3364U, 0x3365U, 0x3366U, - 0x3367U, 0x3368U, 0x3369U, 0x336AU, 0x336BU, 0x336CU, 0x336DU, 0x336EU, - 0x336FU, 0x3370U, 0x3371U, 0x3372U, 0x3373U, 0x3374U, 0x3375U, 0x3376U, - 0x3377U, 0x3378U, 0x3379U, 0x337AU, 0x3330U, 0x3331U, 0x3332U, 0x3333U, - 0x3334U, 0x3335U, 0x3336U, 0x3337U, 0x3338U, 0x3339U, 0x332BU, 0x332FU, - 0x3441U, 0x3442U, 0x3443U, 0x3444U, 0x3445U, 0x3446U, 0x3447U, 0x3448U, - 0x3449U, 0x344AU, 0x344BU, 0x344CU, 0x344DU, 0x344EU, 0x344FU, 0x3450U, - 0x3451U, 0x3452U, 0x3453U, 0x3454U, 0x3455U, 0x3456U, 0x3457U, 0x3458U, - 0x3459U, 0x345AU, 0x3461U, 0x3462U, 0x3463U, 0x3464U, 0x3465U, 0x3466U, - 0x3467U, 0x3468U, 0x3469U, 0x346AU, 0x346BU, 0x346CU, 0x346DU, 0x346EU, - 0x346FU, 0x3470U, 0x3471U, 0x3472U, 0x3473U, 0x3474U, 0x3475U, 0x3476U, - 0x3477U, 0x3478U, 0x3479U, 0x347AU, 0x3430U, 0x3431U, 0x3432U, 0x3433U, - 0x3434U, 0x3435U, 0x3436U, 0x3437U, 0x3438U, 0x3439U, 0x342BU, 0x342FU, - 0x3541U, 0x3542U, 0x3543U, 0x3544U, 0x3545U, 0x3546U, 0x3547U, 0x3548U, - 0x3549U, 0x354AU, 0x354BU, 0x354CU, 0x354DU, 0x354EU, 0x354FU, 0x3550U, - 0x3551U, 0x3552U, 0x3553U, 0x3554U, 0x3555U, 0x3556U, 0x3557U, 0x3558U, - 0x3559U, 0x355AU, 0x3561U, 0x3562U, 0x3563U, 0x3564U, 0x3565U, 0x3566U, - 0x3567U, 0x3568U, 0x3569U, 0x356AU, 0x356BU, 0x356CU, 0x356DU, 0x356EU, - 0x356FU, 0x3570U, 0x3571U, 0x3572U, 0x3573U, 0x3574U, 0x3575U, 0x3576U, - 0x3577U, 0x3578U, 0x3579U, 0x357AU, 0x3530U, 0x3531U, 0x3532U, 0x3533U, - 0x3534U, 0x3535U, 0x3536U, 0x3537U, 0x3538U, 0x3539U, 0x352BU, 0x352FU, - 0x3641U, 0x3642U, 0x3643U, 0x3644U, 0x3645U, 0x3646U, 0x3647U, 0x3648U, - 0x3649U, 0x364AU, 0x364BU, 0x364CU, 0x364DU, 0x364EU, 0x364FU, 0x3650U, - 0x3651U, 0x3652U, 0x3653U, 0x3654U, 0x3655U, 0x3656U, 0x3657U, 0x3658U, - 0x3659U, 0x365AU, 0x3661U, 0x3662U, 0x3663U, 0x3664U, 0x3665U, 0x3666U, - 0x3667U, 0x3668U, 0x3669U, 0x366AU, 0x366BU, 0x366CU, 0x366DU, 0x366EU, - 0x366FU, 0x3670U, 0x3671U, 0x3672U, 0x3673U, 0x3674U, 0x3675U, 0x3676U, - 0x3677U, 0x3678U, 0x3679U, 0x367AU, 0x3630U, 0x3631U, 0x3632U, 0x3633U, - 0x3634U, 0x3635U, 0x3636U, 0x3637U, 0x3638U, 0x3639U, 0x362BU, 0x362FU, - 0x3741U, 0x3742U, 0x3743U, 0x3744U, 0x3745U, 0x3746U, 0x3747U, 0x3748U, - 0x3749U, 0x374AU, 0x374BU, 0x374CU, 0x374DU, 0x374EU, 0x374FU, 0x3750U, - 0x3751U, 0x3752U, 0x3753U, 0x3754U, 0x3755U, 0x3756U, 0x3757U, 0x3758U, - 0x3759U, 0x375AU, 0x3761U, 0x3762U, 0x3763U, 0x3764U, 0x3765U, 0x3766U, - 0x3767U, 0x3768U, 0x3769U, 0x376AU, 0x376BU, 0x376CU, 0x376DU, 0x376EU, - 0x376FU, 0x3770U, 0x3771U, 0x3772U, 0x3773U, 0x3774U, 0x3775U, 0x3776U, - 0x3777U, 0x3778U, 0x3779U, 0x377AU, 0x3730U, 0x3731U, 0x3732U, 0x3733U, - 0x3734U, 0x3735U, 0x3736U, 0x3737U, 0x3738U, 0x3739U, 0x372BU, 0x372FU, - 0x3841U, 0x3842U, 0x3843U, 0x3844U, 0x3845U, 0x3846U, 0x3847U, 0x3848U, - 0x3849U, 0x384AU, 0x384BU, 0x384CU, 0x384DU, 0x384EU, 0x384FU, 0x3850U, - 0x3851U, 0x3852U, 0x3853U, 0x3854U, 0x3855U, 0x3856U, 0x3857U, 0x3858U, - 0x3859U, 0x385AU, 0x3861U, 0x3862U, 0x3863U, 0x3864U, 0x3865U, 0x3866U, - 0x3867U, 0x3868U, 0x3869U, 0x386AU, 0x386BU, 0x386CU, 0x386DU, 0x386EU, - 0x386FU, 0x3870U, 0x3871U, 0x3872U, 0x3873U, 0x3874U, 0x3875U, 0x3876U, - 0x3877U, 0x3878U, 0x3879U, 0x387AU, 0x3830U, 0x3831U, 0x3832U, 0x3833U, - 0x3834U, 0x3835U, 0x3836U, 0x3837U, 0x3838U, 0x3839U, 0x382BU, 0x382FU, - 0x3941U, 0x3942U, 0x3943U, 0x3944U, 0x3945U, 0x3946U, 0x3947U, 0x3948U, - 0x3949U, 0x394AU, 0x394BU, 0x394CU, 0x394DU, 0x394EU, 0x394FU, 0x3950U, - 0x3951U, 0x3952U, 0x3953U, 0x3954U, 0x3955U, 0x3956U, 0x3957U, 0x3958U, - 0x3959U, 0x395AU, 0x3961U, 0x3962U, 0x3963U, 0x3964U, 0x3965U, 0x3966U, - 0x3967U, 0x3968U, 0x3969U, 0x396AU, 0x396BU, 0x396CU, 0x396DU, 0x396EU, - 0x396FU, 0x3970U, 0x3971U, 0x3972U, 0x3973U, 0x3974U, 0x3975U, 0x3976U, - 0x3977U, 0x3978U, 0x3979U, 0x397AU, 0x3930U, 0x3931U, 0x3932U, 0x3933U, - 0x3934U, 0x3935U, 0x3936U, 0x3937U, 0x3938U, 0x3939U, 0x392BU, 0x392FU, - 0x2B41U, 0x2B42U, 0x2B43U, 0x2B44U, 0x2B45U, 0x2B46U, 0x2B47U, 0x2B48U, - 0x2B49U, 0x2B4AU, 0x2B4BU, 0x2B4CU, 0x2B4DU, 0x2B4EU, 0x2B4FU, 0x2B50U, - 0x2B51U, 0x2B52U, 0x2B53U, 0x2B54U, 0x2B55U, 0x2B56U, 0x2B57U, 0x2B58U, - 0x2B59U, 0x2B5AU, 0x2B61U, 0x2B62U, 0x2B63U, 0x2B64U, 0x2B65U, 0x2B66U, - 0x2B67U, 0x2B68U, 0x2B69U, 0x2B6AU, 0x2B6BU, 0x2B6CU, 0x2B6DU, 0x2B6EU, - 0x2B6FU, 0x2B70U, 0x2B71U, 0x2B72U, 0x2B73U, 0x2B74U, 0x2B75U, 0x2B76U, - 0x2B77U, 0x2B78U, 0x2B79U, 0x2B7AU, 0x2B30U, 0x2B31U, 0x2B32U, 0x2B33U, - 0x2B34U, 0x2B35U, 0x2B36U, 0x2B37U, 0x2B38U, 0x2B39U, 0x2B2BU, 0x2B2FU, - 0x2F41U, 0x2F42U, 0x2F43U, 0x2F44U, 0x2F45U, 0x2F46U, 0x2F47U, 0x2F48U, - 0x2F49U, 0x2F4AU, 0x2F4BU, 0x2F4CU, 0x2F4DU, 0x2F4EU, 0x2F4FU, 0x2F50U, - 0x2F51U, 0x2F52U, 0x2F53U, 0x2F54U, 0x2F55U, 0x2F56U, 0x2F57U, 0x2F58U, - 0x2F59U, 0x2F5AU, 0x2F61U, 0x2F62U, 0x2F63U, 0x2F64U, 0x2F65U, 0x2F66U, - 0x2F67U, 0x2F68U, 0x2F69U, 0x2F6AU, 0x2F6BU, 0x2F6CU, 0x2F6DU, 0x2F6EU, - 0x2F6FU, 0x2F70U, 0x2F71U, 0x2F72U, 0x2F73U, 0x2F74U, 0x2F75U, 0x2F76U, - 0x2F77U, 0x2F78U, 0x2F79U, 0x2F7AU, 0x2F30U, 0x2F31U, 0x2F32U, 0x2F33U, - 0x2F34U, 0x2F35U, 0x2F36U, 0x2F37U, 0x2F38U, 0x2F39U, 0x2F2BU, 0x2F2FU, -#endif -}; diff --git a/deps/base64/base64/lib/tables/table_enc_12bit.py b/deps/base64/base64/lib/tables/table_enc_12bit.py deleted file mode 100755 index 613ab81af1de97..00000000000000 --- a/deps/base64/base64/lib/tables/table_enc_12bit.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/python3 - -def tr(x): - """Translate a 6-bit value to the Base64 alphabet.""" - s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \ - + 'abcdefghijklmnopqrstuvwxyz' \ - + '0123456789' \ - + '+/' - return ord(s[x]) - -def table(fn): - """Generate a 12-bit lookup table.""" - ret = [] - for n in range(0, 2**12): - pre = "\n\t" if n % 8 == 0 else " " - pre = "\t" if n == 0 else pre - ret.append("{}0x{:04X}U,".format(pre, fn(n))) - return "".join(ret) - -def table_be(): - """Generate a 12-bit big-endian lookup table.""" - return table(lambda n: (tr(n & 0x3F) << 0) | (tr(n >> 6) << 8)) - -def table_le(): - """Generate a 12-bit little-endian lookup table.""" - return table(lambda n: (tr(n >> 6) << 0) | (tr(n & 0x3F) << 8)) - -def main(): - """Entry point.""" - lines = [ - "#include <stdint.h>", - "", - "const uint16_t base64_table_enc_12bit[] = {", - "#if BASE64_LITTLE_ENDIAN", - table_le(), - "#else", - table_be(), - "#endif", - "};" - ] - for line in lines: - print(line) - -if __name__ == "__main__": - main() diff --git a/deps/base64/base64/lib/tables/table_generator.c b/deps/base64/base64/lib/tables/table_generator.c deleted file mode 100644 index 64f239302bf5db..00000000000000 --- a/deps/base64/base64/lib/tables/table_generator.c +++ /dev/null @@ -1,184 +0,0 @@ -/** - * - * Copyright 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com - * Copyright 2017 Matthieu Darbois - * All rights reserved. - * - * http://modp.com/release/base64 - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/****************************/ - -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -static uint8_t b64chars[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' -}; - -static uint8_t padchar = '='; - -static void printStart(void) -{ - printf("#include <stdint.h>\n"); - printf("#define CHAR62 '%c'\n", b64chars[62]); - printf("#define CHAR63 '%c'\n", b64chars[63]); - printf("#define CHARPAD '%c'\n", padchar); -} - -static void clearDecodeTable(uint32_t* ary) -{ - int i = 0; - for (i = 0; i < 256; ++i) { - ary[i] = 0xFFFFFFFF; - } -} - -/* dump uint32_t as hex digits */ -void uint32_array_to_c_hex(const uint32_t* ary, size_t sz, const char* name) -{ - size_t i = 0; - - printf("const uint32_t %s[%d] = {\n", name, (int)sz); - for (;;) { - printf("0x%08" PRIx32, ary[i]); - ++i; - if (i == sz) - break; - if (i % 6 == 0) { - printf(",\n"); - } else { - printf(", "); - } - } - printf("\n};\n"); -} - -int main(int argc, char** argv) -{ - uint32_t x; - uint32_t i = 0; - uint32_t ary[256]; - - /* over-ride standard alphabet */ - if (argc == 2) { - uint8_t* replacements = (uint8_t*)argv[1]; - if (strlen((char*)replacements) != 3) { - fprintf(stderr, "input must be a string of 3 characters '-', '.' or '_'\n"); - exit(1); - } - fprintf(stderr, "fusing '%s' as replacements in base64 encoding\n", replacements); - b64chars[62] = replacements[0]; - b64chars[63] = replacements[1]; - padchar = replacements[2]; - } - - printStart(); - - printf("\n\n#if BASE64_LITTLE_ENDIAN\n"); - - printf("\n\n/* SPECIAL DECODE TABLES FOR LITTLE ENDIAN (INTEL) CPUS */\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 2; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d0"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = ((i & 0x30) >> 4) | ((i & 0x0F) << 12); - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d1"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = ((i & 0x03) << 22) | ((i & 0x3c) << 6); - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d2"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 16; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d3"); - printf("\n\n"); - - printf("#else\n"); - - printf("\n\n/* SPECIAL DECODE TABLES FOR BIG ENDIAN (IBM/MOTOROLA/SUN) CPUS */\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 26; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d0"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 20; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d1"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 14; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d2"); - printf("\n\n"); - - clearDecodeTable(ary); - for (i = 0; i < 64; ++i) { - x = b64chars[i]; - ary[x] = i << 8; - } - uint32_array_to_c_hex(ary, sizeof(ary) / sizeof(uint32_t), "base64_table_dec_32bit_d3"); - printf("\n\n"); - - printf("#endif\n"); - - return 0; -} diff --git a/deps/base64/base64/lib/tables/tables.c b/deps/base64/base64/lib/tables/tables.c deleted file mode 100644 index 45778b6befdd6e..00000000000000 --- a/deps/base64/base64/lib/tables/tables.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "tables.h" - -const uint8_t -base64_table_enc_6bit[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789" - "+/"; - -// In the lookup table below, note that the value for '=' (character 61) is -// 254, not 255. This character is used for in-band signaling of the end of -// the datastream, and we will use that later. The characters A-Z, a-z, 0-9 -// and + / are mapped to their "decoded" values. The other bytes all map to -// the value 255, which flags them as "invalid input". - -const uint8_t -base64_table_dec_8bit[] = -{ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // 0..15 - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // 16..31 - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, // 32..47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 254, 255, 255, // 48..63 - 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64..79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // 80..95 - 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96..111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255, // 112..127 - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // 128..143 - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -}; - -#if BASE64_WORDSIZE >= 32 -# include "table_dec_32bit.h" -# include "table_enc_12bit.h" -#endif diff --git a/deps/base64/base64/lib/tables/tables.h b/deps/base64/base64/lib/tables/tables.h deleted file mode 100644 index cb74268a4bf12b..00000000000000 --- a/deps/base64/base64/lib/tables/tables.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef BASE64_TABLES_H -#define BASE64_TABLES_H - -#include <stdint.h> - -#include "../env.h" - -// These tables are used by all codecs for fallback plain encoding/decoding: -extern const uint8_t base64_table_enc_6bit[]; -extern const uint8_t base64_table_dec_8bit[]; - -// These tables are used for the 32-bit and 64-bit generic decoders: -#if BASE64_WORDSIZE >= 32 -extern const uint32_t base64_table_dec_32bit_d0[]; -extern const uint32_t base64_table_dec_32bit_d1[]; -extern const uint32_t base64_table_dec_32bit_d2[]; -extern const uint32_t base64_table_dec_32bit_d3[]; - -// This table is used by the 32 and 64-bit generic encoders: -extern const uint16_t base64_table_enc_12bit[]; -#endif - -#endif // BASE64_TABLES_H diff --git a/deps/base64/base64/test/CMakeLists.txt b/deps/base64/base64/test/CMakeLists.txt deleted file mode 100644 index f07b65a00c2cb4..00000000000000 --- a/deps/base64/base64/test/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -# Written in 2016 by Henrik Steffen Gaßmann henrik@gassmann.onl -# -# To the extent possible under law, the author(s) have dedicated all -# copyright and related and neighboring rights to this software to the -# public domain worldwide. This software is distributed without any warranty. -# -# You should have received a copy of the CC0 Public Domain Dedication -# along with this software. If not, see -# -# http://creativecommons.org/publicdomain/zero/1.0/ -# -######################################################################## - -function(add_base64_test TEST_NAME) - unset(SRC_FILE) - foreach(SRC_FILE ${ARGN}) - list(APPEND SRC_FILES "${SRC_FILE}") - endforeach() - - add_executable(${TEST_NAME} ${SRC_FILES}) - target_link_libraries(${TEST_NAME} PRIVATE base64) - - add_test(NAME ${TEST_NAME} - COMMAND ${TEST_NAME} - ) - install(TARGETS ${TEST_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) -endfunction() - - -add_base64_test(test_base64 - codec_supported.c - test_base64.c -) - -add_base64_test(benchmark - codec_supported.c - benchmark.c -) - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - target_link_libraries(benchmark PRIVATE rt) -endif() - diff --git a/deps/base64/base64/test/Makefile b/deps/base64/base64/test/Makefile deleted file mode 100644 index 7ecb893a6363b9..00000000000000 --- a/deps/base64/base64/test/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -CFLAGS += -std=c99 -O3 -Wall -Wextra -pedantic -DBASE64_STATIC_DEFINE -ifdef OPENMP - CFLAGS += -fopenmp -endif - -TARGET := $(shell $(CC) -dumpmachine) -ifneq (, $(findstring darwin, $(TARGET))) - BENCH_LDFLAGS= -else ifneq (, $(findstring mingw, $(TARGET))) - BENCH_LDFLAGS= -else - # default to linux, -lrt needed - BENCH_LDFLAGS=-lrt -endif - -.PHONY: clean test valgrind - -test: clean test_base64 benchmark - ./test_base64 - ./benchmark - -valgrind: clean test_base64 - valgrind --error-exitcode=2 ./test_base64 - -test_base64: test_base64.c codec_supported.o ../lib/libbase64.o - $(CC) $(CFLAGS) -o $@ $^ - -benchmark: benchmark.c codec_supported.o ../lib/libbase64.o - $(CC) $(CFLAGS) -o $@ $^ $(BENCH_LDFLAGS) - -../%: - make -C .. $* - -%.o: %.c - $(CC) $(CFLAGS) -o $@ -c $< - -clean: - rm -f benchmark test_base64 *.o diff --git a/deps/base64/base64/test/benchmark.c b/deps/base64/base64/test/benchmark.c deleted file mode 100644 index e78b696bedb6b3..00000000000000 --- a/deps/base64/base64/test/benchmark.c +++ /dev/null @@ -1,286 +0,0 @@ -// For clock_gettime(2): -#ifndef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199309L -#endif - -// For CLOCK_REALTIME on FreeBSD: -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 -#endif - -// Standard cross-platform includes. -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> - -// Platform-specific includes. -#if defined(_WIN32) || defined(_WIN64) -# include <windows.h> -# include <wincrypt.h> -#else -# include <sys/types.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <unistd.h> -# include <time.h> -#endif - -#if defined(__MACH__) -# include <mach/mach_time.h> -#endif - -#include "../include/libbase64.h" -#include "codec_supported.h" - -#define KB 1024 -#define MB (1024 * KB) - -#define RANDOMDEV "/dev/urandom" - -struct buffers { - char *reg; - char *enc; - size_t regsz; - size_t encsz; -}; - -// Define buffer sizes to test with: -static struct bufsize { - char *label; - size_t len; - int repeat; - int batch; -} -sizes[] = { - { "10 MB", MB * 10, 10, 1 }, - { "1 MB", MB * 1, 10, 10 }, - { "100 KB", KB * 100, 10, 100 }, - { "10 KB", KB * 10, 100, 100 }, - { "1 KB", KB * 1, 100, 1000 }, -}; - -static inline float -bytes_to_mb (size_t bytes) -{ - return bytes / (float) MB; -} - -static bool -get_random_data (struct buffers *b, char **errmsg) -{ -#if defined(_WIN32) || defined(_WIN64) - HCRYPTPROV hProvider = 0; - - if (!CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { - *errmsg = "Error: CryptAcquireContext"; - return false; - } - - if (!CryptGenRandom(hProvider, b->regsz, b->reg)) { - CryptReleaseContext(hProvider, 0); - *errmsg = "Error: CryptGenRandom"; - return false; - } - - if (!CryptReleaseContext(hProvider, 0)) { - *errmsg = "Error: CryptReleaseContext"; - return false; - } - - return true; -#else - int fd; - ssize_t nread; - size_t total_read = 0; - - // Open random device for semi-random data: - if ((fd = open(RANDOMDEV, O_RDONLY)) < 0) { - *errmsg = "Cannot open " RANDOMDEV; - return false; - } - - printf("Filling buffer with %.1f MB of random data...\n", bytes_to_mb(b->regsz)); - - while (total_read < b->regsz) { - if ((nread = read(fd, b->reg + total_read, b->regsz - total_read)) < 0) { - *errmsg = "Read error"; - close(fd); - return false; - } - total_read += nread; - } - - close(fd); - return true; -#endif -} - -#if defined(__MACH__) -typedef uint64_t base64_timespec; - -static void -base64_gettime (base64_timespec *t) -{ - *t = mach_absolute_time(); -} - -static float -timediff_sec (base64_timespec *start, base64_timespec *end) -{ - uint64_t diff = *end - *start; - mach_timebase_info_data_t tb = { 0, 0 }; - mach_timebase_info(&tb); - - return (float)((diff * tb.numer) / tb.denom) / 1e9f; -} -#elif defined(_WIN32) || defined(_WIN64) -typedef ULARGE_INTEGER base64_timespec; - -static void -base64_gettime (base64_timespec *t) -{ - FILETIME current_time_ft; - - GetSystemTimePreciseAsFileTime(¤t_time_ft); - - t->LowPart = current_time_ft.dwLowDateTime; - t->HighPart = current_time_ft.dwHighDateTime; -} - -static float -timediff_sec (base64_timespec *start, base64_timespec *end) -{ - // Timer resolution is 100 nanoseconds (10^-7 sec). - return (end->QuadPart - start->QuadPart) / 1e7f; -} -#else -typedef struct timespec base64_timespec; - -static void -base64_gettime (base64_timespec *t) -{ - clock_gettime(CLOCK_REALTIME, t); -} - -static float -timediff_sec (base64_timespec *start, base64_timespec *end) -{ - return (end->tv_sec - start->tv_sec) + (end->tv_nsec - start->tv_nsec) / 1e9f; -} -#endif - -static void -codec_bench_enc (struct buffers *b, const struct bufsize *bs, const char *name, unsigned int flags) -{ - float timediff, fastest = -1.0f; - base64_timespec start, end; - - // Reset buffer size: - b->regsz = bs->len; - - // Repeat benchmark a number of times for a fair test: - for (int i = bs->repeat; i; i--) { - - // Timing loop, use batches to increase timer resolution: - base64_gettime(&start); - for (int j = bs->batch; j; j--) - base64_encode(b->reg, b->regsz, b->enc, &b->encsz, flags); - base64_gettime(&end); - - // Calculate average time of batch: - timediff = timediff_sec(&start, &end) / bs->batch; - - // Update fastest time seen: - if (fastest < 0.0f || timediff < fastest) - fastest = timediff; - } - - printf("%s\tencode\t%.02f MB/sec\n", name, bytes_to_mb(b->regsz) / fastest); -} - -static void -codec_bench_dec (struct buffers *b, const struct bufsize *bs, const char *name, unsigned int flags) -{ - float timediff, fastest = -1.0f; - base64_timespec start, end; - - // Reset buffer size: - b->encsz = bs->len; - - // Repeat benchmark a number of times for a fair test: - for (int i = bs->repeat; i; i--) { - - // Timing loop, use batches to increase timer resolution: - base64_gettime(&start); - for (int j = bs->batch; j; j--) - base64_decode(b->enc, b->encsz, b->reg, &b->regsz, flags); - base64_gettime(&end); - - // Calculate average time of batch: - timediff = timediff_sec(&start, &end) / bs->batch; - - // Update fastest time seen: - if (fastest < 0.0f || timediff < fastest) - fastest = timediff; - } - - printf("%s\tdecode\t%.02f MB/sec\n", name, bytes_to_mb(b->encsz) / fastest); -} - -static void -codec_bench (struct buffers *b, const struct bufsize *bs, const char *name, unsigned int flags) -{ - codec_bench_enc(b, bs, name, flags); - codec_bench_dec(b, bs, name, flags); -} - -int -main () -{ - int ret = 0; - char *errmsg = NULL; - struct buffers b; - - // Set buffer sizes to largest buffer length: - b.regsz = sizes[0].len; - b.encsz = sizes[0].len * 5 / 3; - - // Allocate space for megabytes of random data: - if ((b.reg = malloc(b.regsz)) == NULL) { - errmsg = "Out of memory"; - ret = 1; - goto err0; - } - - // Allocate space for encoded output: - if ((b.enc = malloc(b.encsz)) == NULL) { - errmsg = "Out of memory"; - ret = 1; - goto err1; - } - - // Fill buffer with random data: - if (get_random_data(&b, &errmsg) == false) { - ret = 1; - goto err2; - } - - // Loop over all buffer sizes: - for (size_t i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) { - printf("Testing with buffer size %s, fastest of %d * %d\n", - sizes[i].label, sizes[i].repeat, sizes[i].batch); - - // Loop over all codecs: - for (size_t j = 0; codecs[j]; j++) - if (codec_supported(1 << j)) - codec_bench(&b, &sizes[i], codecs[j], 1 << j); - }; - - // Free memory: -err2: free(b.enc); -err1: free(b.reg); -err0: if (errmsg) - fputs(errmsg, stderr); - - return ret; -} diff --git a/deps/base64/base64/test/ci/analysis.sh b/deps/base64/base64/test/ci/analysis.sh deleted file mode 100755 index f7da1857fe05e3..00000000000000 --- a/deps/base64/base64/test/ci/analysis.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -set -ve - -MACHINE=$(uname -m) -export CC=gcc - -uname -a -clang --version # make analyse -${CC} --version # make -C test valgrind - -for USE_ASSEMBLY in 0 1; do - if [ "${MACHINE}" == "x86_64" ]; then - export SSSE3_CFLAGS="-mssse3 -DBASE64_SSSE3_USE_ASM=${USE_ASSEMBLY}" - export SSE41_CFLAGS="-msse4.1 -DBASE64_SSE41_USE_ASM=${USE_ASSEMBLY}" - export SSE42_CFLAGS="-msse4.2 -DBASE64_SSE42_USE_ASM=${USE_ASSEMBLY}" - export AVX_CFLAGS="-mavx -DBASE64_AVX_USE_ASM=${USE_ASSEMBLY}" - export AVX2_CFLAGS="-mavx2 -DBASE64_AVX2_USE_ASM=${USE_ASSEMBLY}" - # Temporarily disable AVX512; it is not available in CI yet. - # export AVX512_CFLAGS="-mavx512vl -mavx512vbmi" - elif [ "${MACHINE}" == "aarch64" ]; then - export NEON64_CFLAGS="-march=armv8-a" - elif [ "${MACHINE}" == "armv7l" ]; then - export NEON32_CFLAGS="-march=armv7-a -mfloat-abi=hard -mfpu=neon" - fi - - if [ ${USE_ASSEMBLY} -eq 0 ]; then - echo "::group::analyze" - make analyze - echo "::endgroup::" - fi - - echo "::group::valgrind (USE_ASSEMBLY=${USE_ASSEMBLY})" - make clean - make - make -C test valgrind - echo "::endgroup::" -done diff --git a/deps/base64/base64/test/ci/test.sh b/deps/base64/base64/test/ci/test.sh deleted file mode 100755 index fb188418cca0a9..00000000000000 --- a/deps/base64/base64/test/ci/test.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -set -ve - -MACHINE=$(uname -m) -if [ "${MACHINE}" == "x86_64" ]; then - export SSSE3_CFLAGS=-mssse3 - export SSE41_CFLAGS=-msse4.1 - export SSE42_CFLAGS=-msse4.2 - export AVX_CFLAGS=-mavx - # no AVX2 or AVX512 on GHA macOS - if [ "$(uname -s)" != "Darwin" ]; then - export AVX2_CFLAGS=-mavx2 - # Temporarily disable AVX512; it is not available in CI yet. - # export AVX512_CFLAGS="-mavx512vl -mavx512vbmi" - fi -elif [ "${MACHINE}" == "aarch64" ]; then - export NEON64_CFLAGS="-march=armv8-a" -elif [ "${MACHINE}" == "armv7l" ]; then - export NEON32_CFLAGS="-march=armv7-a -mfloat-abi=hard -mfpu=neon" -fi - -if [ "${OPENMP:-}" == "0" ]; then - unset OPENMP -fi - -uname -a -${CC} --version - -make -make -C test diff --git a/deps/base64/base64/test/codec_supported.c b/deps/base64/base64/test/codec_supported.c deleted file mode 100644 index f68c766875abcd..00000000000000 --- a/deps/base64/base64/test/codec_supported.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <string.h> - -#include "../include/libbase64.h" - -static char *_codecs[] = -{ "AVX2" -, "NEON32" -, "NEON64" -, "plain" -, "SSSE3" -, "SSE41" -, "SSE42" -, "AVX" -, "AVX512" -, NULL -} ; - -char **codecs = _codecs; - -int -codec_supported (int flags) -{ - // Check if given codec is supported by trying to decode a test string: - char *a = "aGVsbG8="; - char b[10]; - size_t outlen; - - return (base64_decode(a, strlen(a), b, &outlen, flags) != -1); -} diff --git a/deps/base64/base64/test/codec_supported.h b/deps/base64/base64/test/codec_supported.h deleted file mode 100644 index 18baec08154adf..00000000000000 --- a/deps/base64/base64/test/codec_supported.h +++ /dev/null @@ -1,3 +0,0 @@ -extern char **codecs; - -int codec_supported (int flags); diff --git a/deps/base64/base64/test/moby_dick.h b/deps/base64/base64/test/moby_dick.h deleted file mode 100644 index 19705355897016..00000000000000 --- a/deps/base64/base64/test/moby_dick.h +++ /dev/null @@ -1,41 +0,0 @@ -static const char *moby_dick_plain = - "Call me Ishmael. Some years ago--never mind how long precisely--having\n" - "little or no money in my purse, and nothing particular to interest me on\n" - "shore, I thought I would sail about a little and see the watery part of\n" - "the world. It is a way I have of driving off the spleen and regulating\n" - "the circulation. Whenever I find myself growing grim about the mouth;\n" - "whenever it is a damp, drizzly November in my soul; whenever I find\n" - "myself involuntarily pausing before coffin warehouses, and bringing up\n" - "the rear of every funeral I meet; and especially whenever my hypos get\n" - "such an upper hand of me, that it requires a strong moral principle to\n" - "prevent me from deliberately stepping into the street, and methodically\n" - "knocking people's hats off--then, I account it high time to get to sea\n" - "as soon as I can. This is my substitute for pistol and ball. With a\n" - "philosophical flourish Cato throws himself upon his sword; I quietly\n" - "take to the ship. There is nothing surprising in this. If they but knew\n" - "it, almost all men in their degree, some time or other, cherish very\n" - "nearly the same feelings towards the ocean with me.\n"; - -static const char *moby_dick_base64 = - "Q2FsbCBtZSBJc2htYWVsLiBTb21lIHllYXJzIGFnby0tbmV2ZXIgbWluZCBob3cgbG9uZ" - "yBwcmVjaXNlbHktLWhhdmluZwpsaXR0bGUgb3Igbm8gbW9uZXkgaW4gbXkgcHVyc2UsIG" - "FuZCBub3RoaW5nIHBhcnRpY3VsYXIgdG8gaW50ZXJlc3QgbWUgb24Kc2hvcmUsIEkgdGh" - "vdWdodCBJIHdvdWxkIHNhaWwgYWJvdXQgYSBsaXR0bGUgYW5kIHNlZSB0aGUgd2F0ZXJ5" - "IHBhcnQgb2YKdGhlIHdvcmxkLiBJdCBpcyBhIHdheSBJIGhhdmUgb2YgZHJpdmluZyBvZ" - "mYgdGhlIHNwbGVlbiBhbmQgcmVndWxhdGluZwp0aGUgY2lyY3VsYXRpb24uIFdoZW5ldm" - "VyIEkgZmluZCBteXNlbGYgZ3Jvd2luZyBncmltIGFib3V0IHRoZSBtb3V0aDsKd2hlbmV" - "2ZXIgaXQgaXMgYSBkYW1wLCBkcml6emx5IE5vdmVtYmVyIGluIG15IHNvdWw7IHdoZW5l" - "dmVyIEkgZmluZApteXNlbGYgaW52b2x1bnRhcmlseSBwYXVzaW5nIGJlZm9yZSBjb2Zma" - "W4gd2FyZWhvdXNlcywgYW5kIGJyaW5naW5nIHVwCnRoZSByZWFyIG9mIGV2ZXJ5IGZ1bm" - "VyYWwgSSBtZWV0OyBhbmQgZXNwZWNpYWxseSB3aGVuZXZlciBteSBoeXBvcyBnZXQKc3V" - "jaCBhbiB1cHBlciBoYW5kIG9mIG1lLCB0aGF0IGl0IHJlcXVpcmVzIGEgc3Ryb25nIG1v" - "cmFsIHByaW5jaXBsZSB0bwpwcmV2ZW50IG1lIGZyb20gZGVsaWJlcmF0ZWx5IHN0ZXBwa" - "W5nIGludG8gdGhlIHN0cmVldCwgYW5kIG1ldGhvZGljYWxseQprbm9ja2luZyBwZW9wbG" - "UncyBoYXRzIG9mZi0tdGhlbiwgSSBhY2NvdW50IGl0IGhpZ2ggdGltZSB0byBnZXQgdG8" - "gc2VhCmFzIHNvb24gYXMgSSBjYW4uIFRoaXMgaXMgbXkgc3Vic3RpdHV0ZSBmb3IgcGlz" - "dG9sIGFuZCBiYWxsLiBXaXRoIGEKcGhpbG9zb3BoaWNhbCBmbG91cmlzaCBDYXRvIHRoc" - "m93cyBoaW1zZWxmIHVwb24gaGlzIHN3b3JkOyBJIHF1aWV0bHkKdGFrZSB0byB0aGUgc2" - "hpcC4gVGhlcmUgaXMgbm90aGluZyBzdXJwcmlzaW5nIGluIHRoaXMuIElmIHRoZXkgYnV" - "0IGtuZXcKaXQsIGFsbW9zdCBhbGwgbWVuIGluIHRoZWlyIGRlZ3JlZSwgc29tZSB0aW1l" - "IG9yIG90aGVyLCBjaGVyaXNoIHZlcnkKbmVhcmx5IHRoZSBzYW1lIGZlZWxpbmdzIHRvd" - "2FyZHMgdGhlIG9jZWFuIHdpdGggbWUuCg=="; diff --git a/deps/base64/base64/test/moby_dick_base64.txt b/deps/base64/base64/test/moby_dick_base64.txt deleted file mode 100644 index 3083dcfbcb3e87..00000000000000 --- a/deps/base64/base64/test/moby_dick_base64.txt +++ /dev/null @@ -1 +0,0 @@ -Q2FsbCBtZSBJc2htYWVsLiBTb21lIHllYXJzIGFnby0tbmV2ZXIgbWluZCBob3cgbG9uZyBwcmVjaXNlbHktLWhhdmluZwpsaXR0bGUgb3Igbm8gbW9uZXkgaW4gbXkgcHVyc2UsIGFuZCBub3RoaW5nIHBhcnRpY3VsYXIgdG8gaW50ZXJlc3QgbWUgb24Kc2hvcmUsIEkgdGhvdWdodCBJIHdvdWxkIHNhaWwgYWJvdXQgYSBsaXR0bGUgYW5kIHNlZSB0aGUgd2F0ZXJ5IHBhcnQgb2YKdGhlIHdvcmxkLiBJdCBpcyBhIHdheSBJIGhhdmUgb2YgZHJpdmluZyBvZmYgdGhlIHNwbGVlbiBhbmQgcmVndWxhdGluZwp0aGUgY2lyY3VsYXRpb24uIFdoZW5ldmVyIEkgZmluZCBteXNlbGYgZ3Jvd2luZyBncmltIGFib3V0IHRoZSBtb3V0aDsKd2hlbmV2ZXIgaXQgaXMgYSBkYW1wLCBkcml6emx5IE5vdmVtYmVyIGluIG15IHNvdWw7IHdoZW5ldmVyIEkgZmluZApteXNlbGYgaW52b2x1bnRhcmlseSBwYXVzaW5nIGJlZm9yZSBjb2ZmaW4gd2FyZWhvdXNlcywgYW5kIGJyaW5naW5nIHVwCnRoZSByZWFyIG9mIGV2ZXJ5IGZ1bmVyYWwgSSBtZWV0OyBhbmQgZXNwZWNpYWxseSB3aGVuZXZlciBteSBoeXBvcyBnZXQKc3VjaCBhbiB1cHBlciBoYW5kIG9mIG1lLCB0aGF0IGl0IHJlcXVpcmVzIGEgc3Ryb25nIG1vcmFsIHByaW5jaXBsZSB0bwpwcmV2ZW50IG1lIGZyb20gZGVsaWJlcmF0ZWx5IHN0ZXBwaW5nIGludG8gdGhlIHN0cmVldCwgYW5kIG1ldGhvZGljYWxseQprbm9ja2luZyBwZW9wbGUncyBoYXRzIG9mZi0tdGhlbiwgSSBhY2NvdW50IGl0IGhpZ2ggdGltZSB0byBnZXQgdG8gc2VhCmFzIHNvb24gYXMgSSBjYW4uIFRoaXMgaXMgbXkgc3Vic3RpdHV0ZSBmb3IgcGlzdG9sIGFuZCBiYWxsLiBXaXRoIGEKcGhpbG9zb3BoaWNhbCBmbG91cmlzaCBDYXRvIHRocm93cyBoaW1zZWxmIHVwb24gaGlzIHN3b3JkOyBJIHF1aWV0bHkKdGFrZSB0byB0aGUgc2hpcC4gVGhlcmUgaXMgbm90aGluZyBzdXJwcmlzaW5nIGluIHRoaXMuIElmIHRoZXkgYnV0IGtuZXcKaXQsIGFsbW9zdCBhbGwgbWVuIGluIHRoZWlyIGRlZ3JlZSwgc29tZSB0aW1lIG9yIG90aGVyLCBjaGVyaXNoIHZlcnkKbmVhcmx5IHRoZSBzYW1lIGZlZWxpbmdzIHRvd2FyZHMgdGhlIG9jZWFuIHdpdGggbWUuCg== \ No newline at end of file diff --git a/deps/base64/base64/test/moby_dick_plain.txt b/deps/base64/base64/test/moby_dick_plain.txt deleted file mode 100644 index 425d1ed02c8dbb..00000000000000 --- a/deps/base64/base64/test/moby_dick_plain.txt +++ /dev/null @@ -1,16 +0,0 @@ -Call me Ishmael. Some years ago--never mind how long precisely--having -little or no money in my purse, and nothing particular to interest me on -shore, I thought I would sail about a little and see the watery part of -the world. It is a way I have of driving off the spleen and regulating -the circulation. Whenever I find myself growing grim about the mouth; -whenever it is a damp, drizzly November in my soul; whenever I find -myself involuntarily pausing before coffin warehouses, and bringing up -the rear of every funeral I meet; and especially whenever my hypos get -such an upper hand of me, that it requires a strong moral principle to -prevent me from deliberately stepping into the street, and methodically -knocking people's hats off--then, I account it high time to get to sea -as soon as I can. This is my substitute for pistol and ball. With a -philosophical flourish Cato throws himself upon his sword; I quietly -take to the ship. There is nothing surprising in this. If they but knew -it, almost all men in their degree, some time or other, cherish very -nearly the same feelings towards the ocean with me. diff --git a/deps/base64/base64/test/test_base64.c b/deps/base64/base64/test/test_base64.c deleted file mode 100644 index 94aad2d489b9f7..00000000000000 --- a/deps/base64/base64/test/test_base64.c +++ /dev/null @@ -1,388 +0,0 @@ -#include <stdbool.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include "../include/libbase64.h" -#include "codec_supported.h" -#include "moby_dick.h" - -static char out[2000]; -static size_t outlen; - -static bool -assert_enc (int flags, const char *src, const char *dst) -{ - size_t srclen = strlen(src); - size_t dstlen = strlen(dst); - - base64_encode(src, srclen, out, &outlen, flags); - - if (outlen != dstlen) { - printf("FAIL: encoding of '%s': length expected %lu, got %lu\n", src, - (unsigned long)dstlen, - (unsigned long)outlen - ); - return true; - } - if (strncmp(dst, out, outlen) != 0) { - out[outlen] = '\0'; - printf("FAIL: encoding of '%s': expected output '%s', got '%s'\n", src, dst, out); - return true; - } - return false; -} - -static bool -assert_dec (int flags, const char *src, const char *dst) -{ - size_t srclen = strlen(src); - size_t dstlen = strlen(dst); - - if (!base64_decode(src, srclen, out, &outlen, flags)) { - printf("FAIL: decoding of '%s': decoding error\n", src); - return true; - } - if (outlen != dstlen) { - printf("FAIL: encoding of '%s': " - "length expected %lu, got %lu\n", src, - (unsigned long)dstlen, - (unsigned long)outlen - ); - return true; - } - if (strncmp(dst, out, outlen) != 0) { - out[outlen] = '\0'; - printf("FAIL: decoding of '%s': expected output '%s', got '%s'\n", src, dst, out); - return true; - } - return false; -} - -static int -assert_roundtrip (int flags, const char *src) -{ - char tmp[1500]; - size_t tmplen; - size_t srclen = strlen(src); - - // Encode the input into global buffer: - base64_encode(src, srclen, out, &outlen, flags); - - // Decode the global buffer into local temp buffer: - if (!base64_decode(out, outlen, tmp, &tmplen, flags)) { - printf("FAIL: decoding of '%s': decoding error\n", out); - return true; - } - - // Check that 'src' is identical to 'tmp': - if (srclen != tmplen) { - printf("FAIL: roundtrip of '%s': " - "length expected %lu, got %lu\n", src, - (unsigned long)srclen, - (unsigned long)tmplen - ); - return true; - } - if (strncmp(src, tmp, tmplen) != 0) { - tmp[tmplen] = '\0'; - printf("FAIL: roundtrip of '%s': got '%s'\n", src, tmp); - return true; - } - - return false; -} - -static int -test_char_table (int flags, bool use_malloc) -{ - bool fail = false; - char chr[256]; - char enc[400], dec[400]; - size_t enclen, declen; - - // Fill array with all characters 0..255: - for (int i = 0; i < 256; i++) - chr[i] = (unsigned char)i; - - // Loop, using each char as a starting position to increase test coverage: - for (int i = 0; i < 256; i++) { - - size_t chrlen = 256 - i; - char* src = &chr[i]; - if (use_malloc) { - src = malloc(chrlen); /* malloc/copy this so valgrind can find out-of-bound access */ - if (src == NULL) { - printf( - "FAIL: encoding @ %d: allocation of %lu bytes failed\n", - i, (unsigned long)chrlen - ); - fail = true; - continue; - } - memcpy(src, &chr[i], chrlen); - } - - base64_encode(src, chrlen, enc, &enclen, flags); - if (use_malloc) { - free(src); - } - - if (!base64_decode(enc, enclen, dec, &declen, flags)) { - printf("FAIL: decoding @ %d: decoding error\n", i); - fail = true; - continue; - } - if (declen != chrlen) { - printf("FAIL: roundtrip @ %d: " - "length expected %lu, got %lu\n", i, - (unsigned long)chrlen, - (unsigned long)declen - ); - fail = true; - continue; - } - if (strncmp(&chr[i], dec, declen) != 0) { - printf("FAIL: roundtrip @ %d: decoded output not same as input\n", i); - fail = true; - } - } - - return fail; -} - -static int -test_streaming (int flags) -{ - bool fail = false; - char chr[256]; - char ref[400], enc[400]; - size_t reflen; - struct base64_state state; - - // Fill array with all characters 0..255: - for (int i = 0; i < 256; i++) - chr[i] = (unsigned char)i; - - // Create reference base64 encoding: - base64_encode(chr, 256, ref, &reflen, BASE64_FORCE_PLAIN); - - // Encode the table with various block sizes and compare to reference: - for (size_t bs = 1; bs < 255; bs++) - { - size_t inpos = 0; - size_t partlen = 0; - size_t enclen = 0; - - base64_stream_encode_init(&state, flags); - memset(enc, 0, 400); - for (;;) { - base64_stream_encode(&state, &chr[inpos], (inpos + bs > 256) ? 256 - inpos : bs, &enc[enclen], &partlen); - enclen += partlen; - if (inpos + bs > 256) { - break; - } - inpos += bs; - } - base64_stream_encode_final(&state, &enc[enclen], &partlen); - enclen += partlen; - - if (enclen != reflen) { - printf("FAIL: stream encoding gave incorrect size: " - "%lu instead of %lu\n", - (unsigned long)enclen, - (unsigned long)reflen - ); - fail = true; - } - if (strncmp(ref, enc, reflen) != 0) { - printf("FAIL: stream encoding with blocksize %lu failed\n", - (unsigned long)bs - ); - fail = true; - } - } - - // Decode the reference encoding with various block sizes and - // compare to input char table: - for (size_t bs = 1; bs < 255; bs++) - { - size_t inpos = 0; - size_t partlen = 0; - size_t enclen = 0; - - base64_stream_decode_init(&state, flags); - memset(enc, 0, 400); - while (base64_stream_decode(&state, &ref[inpos], (inpos + bs > reflen) ? reflen - inpos : bs, &enc[enclen], &partlen)) { - enclen += partlen; - inpos += bs; - - // Has the entire buffer been consumed? - if (inpos >= 400) { - break; - } - } - if (enclen != 256) { - printf("FAIL: stream decoding gave incorrect size: " - "%lu instead of 255\n", - (unsigned long)enclen - ); - fail = true; - } - if (strncmp(chr, enc, 256) != 0) { - printf("FAIL: stream decoding with blocksize %lu failed\n", - (unsigned long)bs - ); - fail = true; - } - } - - return fail; -} - -static int -test_invalid_dec_input (int flags) -{ - // Subset of invalid characters to cover all ranges - static const char invalid_set[] = { '\0', -1, '!', '-', ';', '_', '|' }; - static const char* invalid_strings[] = { - "Zm9vYg=", - "Zm9vYg", - "Zm9vY", - "Zm9vYmF=Zm9v" - }; - - bool fail = false; - char chr[256]; - char enc[400], dec[400]; - size_t enclen, declen; - - // Fill array with all characters 0..255: - for (int i = 0; i < 256; i++) - chr[i] = (unsigned char)i; - - // Create reference base64 encoding: - base64_encode(chr, 256, enc, &enclen, BASE64_FORCE_PLAIN); - - // Test invalid strings returns error. - for (size_t i = 0U; i < sizeof(invalid_strings) / sizeof(invalid_strings[0]); ++i) { - if (base64_decode(invalid_strings[i], strlen(invalid_strings[i]), dec, &declen, flags)) { - printf("FAIL: decoding invalid input \"%s\": no decoding error\n", invalid_strings[i]); - fail = true; - } - } - - // Loop, corrupting each char to increase test coverage: - for (size_t c = 0U; c < sizeof(invalid_set); ++c) { - for (size_t i = 0U; i < enclen; i++) { - char backup = enc[i]; - - enc[i] = invalid_set[c]; - - if (base64_decode(enc, enclen, dec, &declen, flags)) { - printf("FAIL: decoding invalid input @ %d: no decoding error\n", (int)i); - fail = true; - enc[i] = backup; - continue; - } - enc[i] = backup; - } - } - - // Loop, corrupting two chars to increase test coverage: - for (size_t c = 0U; c < sizeof(invalid_set); ++c) { - for (size_t i = 0U; i < enclen - 2U; i++) { - char backup = enc[i+0]; - char backup2 = enc[i+2]; - - enc[i+0] = invalid_set[c]; - enc[i+2] = invalid_set[c]; - - if (base64_decode(enc, enclen, dec, &declen, flags)) { - printf("FAIL: decoding invalid input @ %d: no decoding error\n", (int)i); - fail = true; - enc[i+0] = backup; - enc[i+2] = backup2; - continue; - } - enc[i+0] = backup; - enc[i+2] = backup2; - } - } - - return fail; -} - -static int -test_one_codec (const char *codec, int flags) -{ - bool fail = false; - - printf("Codec %s:\n", codec); - - // Skip if this codec is not supported: - if (!codec_supported(flags)) { - puts(" skipping"); - return false; - } - - // Test vectors: - struct { - const char *in; - const char *out; - } vec[] = { - - // These are the test vectors from RFC4648: - { "", "" }, - { "f", "Zg==" }, - { "fo", "Zm8=" }, - { "foo", "Zm9v" }, - { "foob", "Zm9vYg==" }, - { "fooba", "Zm9vYmE=" }, - { "foobar", "Zm9vYmFy" }, - - // The first paragraph from Moby Dick, - // to test the SIMD codecs with larger blocksize: - { moby_dick_plain, moby_dick_base64 }, - }; - - for (size_t i = 0; i < sizeof(vec) / sizeof(vec[0]); i++) { - - // Encode plain string, check against output: - fail |= assert_enc(flags, vec[i].in, vec[i].out); - - // Decode the output string, check if we get the input: - fail |= assert_dec(flags, vec[i].out, vec[i].in); - - // Do a roundtrip on the inputs and the outputs: - fail |= assert_roundtrip(flags, vec[i].in); - fail |= assert_roundtrip(flags, vec[i].out); - } - - fail |= test_char_table(flags, false); /* test with unaligned input buffer */ - fail |= test_char_table(flags, true); /* test for out-of-bound input read */ - fail |= test_streaming(flags); - fail |= test_invalid_dec_input(flags); - - if (!fail) - puts(" all tests passed."); - - return fail; -} - -int -main () -{ - bool fail = false; - - // Loop over all codecs: - for (size_t i = 0; codecs[i]; i++) { - - // Flags to invoke this codec: - int codec_flags = (1 << i); - - // Test this codec, merge the results: - fail |= test_one_codec(codecs[i], codec_flags); - } - - return (fail) ? 1 : 0; -} diff --git a/deps/base64/unofficial.gni b/deps/base64/unofficial.gni deleted file mode 100644 index 0e69d7383762f6..00000000000000 --- a/deps/base64/unofficial.gni +++ /dev/null @@ -1,153 +0,0 @@ -# This file is used by GN for building, which is NOT the build system used for -# building official binaries. -# Please edit the gyp files if you are making changes to build system. - -# The actual configurations are put inside a template in unofficial.gni to -# prevent accidental edits from contributors. -template("base64_gn_build") { - config("base64_external_config") { - include_dirs = [ "base64/include" ] - if (!is_component_build) { - defines = [ "BASE64_STATIC_DEFINE" ] - } - } - - config("base64_internal_config") { - include_dirs = [ "base64/lib" ] - if (is_component_build) { - defines = [ "BASE64_EXPORTS" ] - } else { - defines = [] - } - if (current_cpu == "x86" || current_cpu == "x64") { - defines += [ - "HAVE_SSSE3=1", - "HAVE_SSE41=1", - "HAVE_SSE42=1", - "HAVE_AVX=1", - "HAVE_AVX2=1", - "HAVE_AVX512=1", - ] - } - if (current_cpu == "arm") { - defines += [ "HAVE_NEON32=1" ] - } - if (current_cpu == "arm64") { - defines += [ "HAVE_NEON64=1" ] - } - if (is_clang || !is_win) { - cflags_c = [ - "-Wno-implicit-fallthrough", - "-Wno-shadow", - "-Wno-unused-but-set-variable", - ] - } - } - - gypi_values = exec_script("../../tools/gypi_to_gn.py", - [ rebase_path("base64.gyp") ], - "scope", - [ "base64.gyp" ]) - - component(target_name) { - forward_variables_from(invoker, "*") - configs += [ ":base64_internal_config" ] - public_configs = [ ":base64_external_config" ] - sources = gypi_values.base64_sources_common - deps = [ - ":base64_ssse3", - ":base64_sse41", - ":base64_sse42", - ":base64_avx", - ":base64_avx2", - ":base64_avx512", - ":base64_neon32", - ":base64_neon64", - ] - } - - source_set("base64_ssse3") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/ssse3/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ "-mssse3" ] - } - } - } - - source_set("base64_sse41") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/sse41/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ "-msse4.1" ] - } - } - } - - source_set("base64_sse42") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/sse42/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ "-msse4.2" ] - } - } - } - - source_set("base64_avx") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/avx/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ "-mavx" ] - } else if (is_win) { - cflags_c = [ "/arch:AVX" ] - } - } - } - - source_set("base64_avx2") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/avx2/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ "-mavx2" ] - } else if (is_win) { - cflags_c = [ "/arch:AVX2" ] - } - } - } - - source_set("base64_avx512") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/avx512/codec.c" ] - if (current_cpu == "x86" || current_cpu == "x64") { - if (is_clang || !is_win) { - cflags_c = [ - "-mavx512vl", - "-mavx512vbmi", - ] - } else if (is_win) { - cflags_c = [ "/arch:AVX512" ] - } - } - } - - source_set("base64_neon32") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/neon32/codec.c" ] - if (current_cpu == "arm") { - if (is_clang || !is_win) { - cflags_c = [ "-mfpu=neon" ] - } - } - } - - source_set("base64_neon64") { - configs += [ ":base64_internal_config" ] - sources = [ "base64/lib/arch/neon64/codec.c" ] - # NEON is required in arm64, so no -mfpu flag is needed - } -} diff --git a/deps/brotli/brotli.gyp b/deps/brotli/brotli.gyp index f82660d82c6cfa..f1f487945e5727 100644 --- a/deps/brotli/brotli.gyp +++ b/deps/brotli/brotli.gyp @@ -59,14 +59,15 @@ 'defines': [ 'OS_MACOSX' ] + }, { + 'libraries': [ + '-lm', + ], }], ], 'direct_dependent_settings': { 'include_dirs': [ 'c/include' ] }, - 'libraries': [ - '-lm', - ], 'sources': [ '<@(brotli_sources)', ] diff --git a/deps/brotli/unofficial.gni b/deps/brotli/unofficial.gni index 5e07e106672a04..91001fa43ea480 100644 --- a/deps/brotli/unofficial.gni +++ b/deps/brotli/unofficial.gni @@ -25,7 +25,7 @@ template("brotli_gn_build") { } else if (target_os == "freebsd") { defines = [ "OS_FREEBSD" ] } - if (!is_win) { + if (is_linux) { libs = [ "m" ] } if (is_clang || !is_win) { diff --git a/deps/cares/CHANGES b/deps/cares/CHANGES deleted file mode 100644 index ae56d4f24bc3d9..00000000000000 --- a/deps/cares/CHANGES +++ /dev/null @@ -1,6347 +0,0 @@ - Changelog for the c-ares project. Generated with git2changes.pl - -Version 1.28.1 (30 Mar 2024) - -GitHub (30 Mar 2024) -- [Brad House brought this change] - - release prep for 1.28.1 (#739) - -Brad House (30 Mar 2024) -- ares_search() and ares_getaddrinfo() resolution fails if no search domains - - Due to an error in creating the list of domains to search, if no search - domains were configured, resolution would fail. - - Fixes Issue: #737 - Fix By: Brad House (@bradh352) - -- typo - -Version 1.28.0 (28 Mar 2024) - -GitHub (28 Mar 2024) -- [Brad House brought this change] - - Allow configuration value for NDots to be zero (#735) - - As per Issue #734 some people use `ndots:0` in their configuration which - is allowed by the system resolver but not by c-ares. Add support for - `ndots:0` and add a test case to validate this behavior. - - Fixes Issue: #734 - Fix By: Brad House (@bradh352) - -Brad House (27 Mar 2024) -- typo - -GitHub (27 Mar 2024) -- [Brad House brought this change] - - 1.28.0 release prep (#733) - -Brad House (27 Mar 2024) -- CMake: don't overwrite global required libraries/definitions/includes - - When chain building c-ares, global settings were being unset which - could lead to build problems. - - Fixes Issue: #729 - Fix By: Brad House (@bradh352) - -- remove tests that have been disabled forever - -- clang-format - -- ares_search_dnsrec() takes a const - -- sonarcloud: clean up some minor codesmells - -GitHub (26 Mar 2024) -- [Brad House brought this change] - - mark deprecated functions as such (#732) - - Multiple functions have been deprecated over the years, annotate them - with attribute deprecated. - - When possible show a message about their replacements. - - This is a continuation/completion of PR #706 - - Fix By: Cristian Rodríguez (@crrodriguez) - -Brad House (26 Mar 2024) -- silence clang static analyzer - -- silence coverity - -- coverity: fix mostly bogus warnings - -- fix missing doc - -GitHub (25 Mar 2024) -- [Brad House brought this change] - - Rework internals to pass around `ares_dns_record_t` instead of binary data (#730) - - c-ares has historically passed around raw dns packets in binary form. - Now that we have a new parser, and messages are already parsed - internally, lets pass around that parsed message rather than requiring - multiple parse attempts on the same message. Also add a new - `ares_send_dnsrec()` and `ares_query_dnsrec()` similar to - `ares_search_dnsrec()` added with PR #719 that can return the pointer to - the `ares_dns_record_t` to the caller enqueuing queries and rework - `ares_search_dnsrec()` to use `ares_send_dnsrec()` internally. - - Fix By: Brad House (@bradh352) - -Brad House (23 Mar 2024) -- tests: mockserver is local, shorten timeouts to make test cases run faster to use less CI resources - -- appveyor: disable UWP builds until MSVC version is updated in base image - -GitHub (21 Mar 2024) -- [Faraz brought this change] - - Include netinet6/in6.h (#728) - - On some platforms, "netinet6/in6.h" is not included by "netinet/in.h" - and needs to be included separately. - - Fix By: Faraz (@farazrbx) - -- [Oliver Welsh brought this change] - - Add function ares_search_dnrec() to search for records using the new DNS record parser (#719) - - This PR adds a new function `ares_search_dnsrec()` to search for records - using the new DNS record parser. - - The function takes an arbitrary DNS record object to search (that must - represent a query for a single name). The function takes a new callback - type, `ares_callback_dnsrec`, that is invoked with a parsed DNS record - object rather than the raw buffer(+length). - - The original motivation for this change is to provide support for - [draft-kaplan-enum-sip-routing-04](https://datatracker.ietf.org/doc/html/draft-kaplan-enum-sip-routing-04); - when routing phone calls using an ENUM server, it can be useful to - include identifying source information in an OPT RR options value, to - help select the appropriate route for the call. The new function allows - for more customisable searches like this. - - **Summary of code changes** - - A new function `ares_search_dnsrec()` has been added and exposed. - Moreover, the entire `ares_search_int()` internal code flow has been - refactored to use parsed DNS record objects and the new DNS record - parser. The DNS record object is passed through the `search_query` - structure by encoding/decoding to/from a buffer (if multiple search - domains are used). A helper function `ares_dns_write_query_altname()` is - used to re-write the DNS record object with a new query name (used to - append search domains). - - `ares_search()` is now a wrapper around the new internal code, where the - DNS record object is created based on the name, class and type - parameters. - - The new function uses a new callback type, `ares_callback_dnsrec`. This - is invoked with a parsed DNS record object. For now, we convert from - `ares_callback` to this new type using `ares__dnsrec_convert_cb()`. - - Some functions that are common to both `ares_query()` and - `ares_search()` have been refactored using the new DNS record parser. - See `ares_dns_record_create_query()` and - `ares_dns_query_reply_tostatus()`. - - **Testing** - - A new FV has been added to test the new function, which searches for a - DNS record containing an OPT RR with custom options value. - - As part of this, I needed to enhance the mock DNS server to expect - request text (and assert that it matches actual request text). This is - because the FV needs to check that the request contains the correct OPT - RR. - - **Documentation** - - The man page docs have been updated to describe the new feature. - - **Futures** - - In the future, a new variant of `ares_send()` could be introduced in the - same vein (`ares_send_dnsrec()`). This could be used by - `ares_search_dnsrec()`. Moreover, we could migrate internal code to use - `ares_callback_dnsrec` as the default callback. - - This will help to make the new DNS record parser the norm in C-Ares. - - --------- - - Co-authored-by: Oliver Welsh (@oliverwelsh) - -- [Brad House brought this change] - - Replace configuration file parsers with memory-safe parser (#725) - - Rewrite configuration parsers using new memory safe parsing functions. - After CVE-2024-25629 its obvious that we need to prioritize again on - getting all the hand written parsers with direct pointer manipulation - replaced. They're just not safe and hard to audit. It was yet another - example of 20+yr old code having a memory safety issue just now coming - to light. - - Though these parsers are definitely less efficient, they're written with - memory safety in mind, and any performance difference is going to be - meaningless for something that only happens once a while. - - Fix By: Brad House (@bradh352) - -Brad House (12 Mar 2024) -- skip ubsan/asan on debian arm64 due to the compiler getting killed - -- ares_init potential memory leak - - If initializing using default settings fails, there may be a memory leak of - search domains that were set by system configuration. - - Fixes Issue: #724 - Fix By: Brad House (@bradh352) - -GitHub (12 Mar 2024) -- [Faraz Fallahi brought this change] - - simple implementation for isascii where stdlib isascii is not available (#721) - - Some platforms don't have the isascii() function. Implement as a macro. - - Fix By: Faraz Fallahi (@fffaraz) - -Brad House (11 Mar 2024) -- Doxygen: fix typos - - Fix reported typos in doxygen-style comments. - - Fixes Issue: #722 - Credit: @dzalyalov88 - -- CI: update freebsd image - -- CMake: Fix Chain building if CMAKE runtime paths not set - - This fixes issues created by #708 - - Fix By: Brad House (@bradh352) - -- silence benign warnings - -- Remove acountry completely from code, including manpage - - Since acountry cannot be restored due to nerd.dk being decommissioned, - we should completely remove the manpage and source. This also - will resolve issue #718. - - Fixes Issue: #718 - Fix By: Brad House (@bradh352) - -Version 1.27.0 (22 Feb 2024) - -GitHub (22 Feb 2024) -- [Brad House brought this change] - - Release 1.27.0 (#715) - - release prep for 1.27.0 release - -- [Brad House brought this change] - - Merge pull request from GHSA-mg26-v6qh-x48q - -- [Oliver Welsh brought this change] - - Add flag to not use a default local named server on channel initialization (#713) - - Hello, I work on an application for Microsoft which uses c-ares to - perform DNS lookups. We have made some minor changes to the library over - time, and would like to contribute these back to the project in case - they are useful more widely. This PR adds a new channel init flag, - described below. - - Please let me know if I can include any more information to make this PR - better/easier for you to review. Thanks! - - **Summary** - When initializing a channel with `ares_init_options()`, if there are no - nameservers available (because `ARES_OPT_SERVERS` is not used and - `/etc/resolv.conf` is either empty or not available) then a default - local named server will be added to the channel. - - However in some applications a local named server will never be - available. In this case, all subsequent queries on the channel will - fail. - - If we know this ahead of time, then it may be preferred to fail channel - initialization directly rather than wait for the queries to fail. This - gives better visibility, since we know that the failure is due to - missing servers rather than something going wrong with the queries. - - This PR adds a new flag `ARES_FLAG_NO_DFLT_SVR`, to indicate that a - default local named server should not be added to a channel in this - scenario. Instead, a new error `ARES_EINITNOSERVER` is returned and - initialization fails. - - **Testing** - I have added 2 new FV tests: - - `ContainerNoDfltSvrEmptyInit` to test that initialization fails when - no nameservers are available and the flag is set. - - `ContainerNoDfltSvrFullInit` to test that initialization still - succeeds when the flag is set but other nameservers are available. - - Existing FVs are all passing. - - **Documentation** - I have had a go at manually updating the docs to describe the new - flag/error, but couldn't see any contributing guidance about testing - this. Please let me know if you'd like anything more here. - - --------- - - Fix By: Oliver Welsh (@oliverwelsh) - -Brad House (18 Feb 2024) -- badge should be only main branch - -- put logo in readme - -- clang-format - -GitHub (17 Feb 2024) -- [Brad House brought this change] - - Add ares_queue_active_queries() (#712) - - Add a function to request the number of active queries from an ares - channel. This will return the number of inflight requests to dns - servers. Some functions like `ares_getaddrinfo()` when using `AF_UNSPEC` - may enqueue multiple queries which will be reflected in this count. - - In the future, if we implement support for queuing (e.g. for throttling - purposes), and/or implement support for tracking user-requested queries - (e.g. for cancelation), we can provide additional functions for - inspecting those queues. - - Fix By: Brad House (@bradh352) - -- [Vojtěch Vobr brought this change] - - fix leaking DNS suffix search list on Windows (#711) - - ares__strsplit provides a newly allocated buffer, so suffix list in - line variable isn't referenced anymore. Related ares_free seems to - have gone missing during refactoring made in #594 - - Fix By: Vojtěch Vobr (@vojtechvobr) - -- [Brad House brought this change] - - Add ares_queue_wait_empty() for use with EventThreads (#710) - - It may be useful to wait for the queue to be empty under certain conditions (mainly test cases), expose a function to efficiently do this and rework test cases to use it. - - Fix By: Brad House (@bradh352) - -- [Cheng Zhao brought this change] - - Fix warning about ignoring result of write (#709) - - Fix the compiler warning from clang: - - ``` - ares_event_wake_pipe.c:120:3: error: ignoring return value of function declared with 'warn_unused_result' attribute [-Werror,-Wunused-result] - 120 | write(p->filedes[1], "1", 1); - | ^~~~~ ~~~~~~~~~~~~~~~~~~~~~ - 1 error generated. - ``` - - Fix By: Cheng Zhao (@zcbenz) - -Brad House (5 Feb 2024) -- CMake: don't override target output locations if not top-level - - CMake was unconditionally setting output locations globally, but - it should not do that if it is not the top-level project (e.g. - during chain building). Detect this fact and only set the output - location when top level. - - Fixes Issue: #708 - Fix By: Anthony Alayo (@anthonyalayo) - -- make docs match PR #705 - -GitHub (31 Jan 2024) -- [Cristian Rodríguez brought this change] - - lower EDNSPACKETSZ to 1232 (#705) - - In 2020, it was agreed this is optimal maximum size and all - major server software was updated to reflect this. - - see https://www.dnsflagday.net/2020/#faq - - Fix By: Cristian Rodríguez (@crrodriguez) - -Brad House (30 Jan 2024) -- fix version - -- fix typo - -- bad symlink - -- attempt to fix pkgconfig on windows for static builds - -GitHub (28 Jan 2024) -- [Andriy Utkin brought this change] - - docs/ares_init_options.3: fix args in analogy (#701) - - Fix By: Andriy Utkin <hello@autkin.net> - -- [Brad House brought this change] - - sonarcloud: fix minor codesmells (#702) - - Fix minor codesmells, mostly related to missing 'const' in the new event system. - - Fix By: Brad House (@bradh352) - -Brad House (26 Jan 2024) -- remove outdated copyright text - -- spelling - -- sanity check GTest includes GMock component - -GitHub (26 Jan 2024) -- [Brad House brought this change] - - build-time disabled threads breaks c-ares (#700) - - Regression introduced in 1.26.0, building c-ares with threading disabled results in ares_init{_options}() failing. - - Also adds a new CI test case to prevent this regression in the future. - - Fixes Bug: #699 - Fix By: Brad House (@bradh352) - -Version 1.26.0 (25 Jan 2024) - -Brad House (25 Jan 2024) -- clusterfuzz: enforce maximum DNS packet size due to long parser time - -GitHub (24 Jan 2024) -- [Brad House brought this change] - - Release prep for c-ares 1.26.0 (#698) - - release prep - -Brad House (24 Jan 2024) -- adig: Differentiate between internal and server error - - Should not output "Got answer" if there was no answer from the - server, instead should just output the internal error. - - Fix By: Gisle Vanem (@gvanem) - -GitHub (24 Jan 2024) -- [Brad House brought this change] - - Event Subsystem: No longer require integrators to have their own (#696) - - This PR implements an event thread to process all events on file descriptors registered by c-ares. Prior to this feature, integrators were required to understand the internals of c-ares and how to monitor file descriptors and timeouts and process events. - - Implements OS-specific efficient polling such as epoll(), kqueue(), or IOCP, and falls back to poll() or select() if otherwise unsupported. At this point, it depends on basic threading primitives such as pthreads or windows threads. - - If enabled via the ARES_OPT_EVENT_THREAD option passed to ares_init_options(), then socket callbacks cannot be used. - - Fixes Bug: #611 - Fix By: Brad House (@bradh352) - -- [Erik Lax brought this change] - - Added flags to are_dns_parse to force RAW packet parsing (#693) - - This pull request adds six flags to instruct the parser under various circumstances to skip parsing of the returned RR records so the raw data can be retrieved. - - Fixes Bug: #686 - Fix By: Erik Lax (@eriklax) - -- [Brad House brought this change] - - Autotools allow make to override CFLAGS/CPPFLAGS/CXXFLAGS (#695) - - The previous build system allowed overwriting of CFLAGS/CPPFLAGS/CXXFLAGS on the make command line. Switch to using AM_CFLAGS/AM_CPPFLAGS/AM_CXXFLAGS when we set our own flags for building which ensures they are kept even when a user tries to override. - - Fixes Bug: #694 - Fix By: Brad House (@bradh352) - -Brad House (16 Jan 2024) -- fix doxygen typo - -GitHub (16 Jan 2024) -- [Brad House brought this change] - - man ares_fds(3): mark as deprecated and add explanation (#691) - - ares_fds(3) is not safe to use, mark as deprecated. - - Fixes Issue: #687 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - autotools: fix building for 32bit windows due to stdcall symbol mangling (#689) - - Use AC_CHECK_DECL not AC_CHECK_FUNCS, while this doesn't do a linkage test, it just makes sure the headers define it, this is the only thing without a complex workaround on Windows that will do what we need. - - See: - - https://github.com/msys2/msys2/wiki/Porting/f87a222118b1008ebc166ad237f04edb759c8f4c#calling-conventions-stdcall-and-autotools - - and - - https://lists.gnu.org/archive/html/autoconf/2013-05/msg00085.html - - and for a more complex workaround, we'd need to use AC_LINK_IFELSE like: - - https://mailman.videolan.org/pipermail/vlc-devel/2015-March/101802.html - - which would require we check each individually and provide function arguments for the test. I don't think that is worthwhile. - - Fixes Issue: #688 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Do not sanity check RR Name vs Question (#685) - - It appears as though we should never sanity check the RR name vs the question name as some DNS servers may return results for alias records. - - Fixes Bug: #683 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - no reason to include sys/random.h all the time (#684) - - External integrations don't need sys/random.h in order to compile, remove the dependency. Try to fix building on legacy MacOS versions. - - Fixes Issue: #682 - Fix By: Brad House (@bradh352) - -- [Gregor Jasny brought this change] - - cmake: improve some include related code (#680) - - * cmake: avoid warning about non-existing include dir - - In the Debian build logs I noticed the following warning: - cc1: warning: /build/c-ares-1.25.0/test/include: No such file or directory [-Wmissing-include-dirs] - - This happened because ${CMAKE_INSTALL_INCLUDEDIR} had been added to - caresinternal. I believe it has been copied from the "real" lib - where it's used in the INSTALL_INTERFACE context. But because - caresinternal is never installed we don't need that include here. - - * cmake: drop CARES_TOPLEVEL_DIR variable - - The CARES_TOPLEVEL_DIR variable is the same as the automatically - created PROJECT_SOURCE_DIR variable. Let's stick to the official - one. Also because it is already used at places where CARES_TOPLEVEL_DIR - is used as well. - - Fix By: Gregor Jasny (@gjasny) - -Brad House (5 Jan 2024) -- test: fix outdated license headers - -- RELEASE-NOTES -> RELEASE-NOTES.md - -- update format slightly - -- update release notes format - -Version 1.25.0 (2 Jan 2024) - -GitHub (2 Jan 2024) -- [Brad House brought this change] - - 1.25.0 release prep (#676) - -Brad House (31 Dec 2023) -- tests: replace google DNS with CloudFlare for reverse lookups as google's servers stopped responding properly - -- OSSFuzz: it assumes autotools builds a static library by default, which means the old autotools must have done that even though there were comments saying it wasn't. Disable static by default on Windows however since it can't build both simultaneously. - -- autotools: update logic for building tests to provide more feedback - -- set winver consistently across build systems - -GitHub (28 Dec 2023) -- [Brad House brought this change] - - Autotools: rework to simplify and fix recent issues (#674) - - Completely rework the autotools build system, issues have cropped up due to the complexity and could cause issues on even semi-modern Linux systems (Ubuntu 20.04 for example). - - Changes include: - - Remove all curl/xc/cares m4 helper files, they go overboard on detections of functions and datatypes. Go back to more plain autoconf macros as they've come a long way over the years. - Use known systems and heuristics to determine datatypes for functions like send() and recv(), rather than the error prone detection which required thousands of permutations and might still get it wrong. - Remove unneeded configure arguments like --enable-debug or --enable-optimize, its more common for people to simply pass their own CFLAGS on the command line. - Only require CARES_STATICLIB definition on Windows static builds, its not necessary ever for other systems, even when hiding non-public symbols. - Remove some function and definition detections that were never used in c-ares - The test framework is now embedded into the toplevel configure system, there was no need to chain build the test system as it is never built externally to c-ares. - As a side-effect of the changes, a configure run completes in about 25% of the original time. - - This has been tested on various Linux distributions (of varying age), FreeBSD, MacOS, Windows (via MSYS2 with Mingw), and Solaris10/11 (by @dfandrich), AIX 7.3 (by @dfandrich). It is not unlikely that this may have broken more esoteric or legacy systems, and we'll likely need to be ready to accept bug reports and patches, but it has removed over 10k lines of build system code. It is very likely any issues that crop up will add far fewer lines of code to fix such systems. - - Fixes Bug: #670 - Fix By: Brad House (@bradh352) - -Brad House (22 Dec 2023) -- docs: host -> ip - - fix mismatched documentation stating host instead of ip - - Fix By: Brad House (@bradh352) - -GitHub (21 Dec 2023) -- [Brad House brought this change] - - Old MacOS SDKs require you include sys/socket.h before net/if.h (#673) - - Old MacOS SDKs (like 10.8) require you include `sys/socket.h` before you include `net/if.h` as reported by MacPorts. Using a new SDK but with setting the macos target version does not have the same issue. - - Fixes Issue: #672 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Autotools warning fixes (#671) - - * get rid of clashes with curl namespace - * remove warnings due to deprecated functionality - * reorder some macro calls to get rid of warnings due to being called in the wrong order - - Fix By: Brad House (@bradh352) - -Brad House (19 Dec 2023) -- clang-format - -- ares_strsplit() rewrite as wrapper around ares__buf_split() - - We want to limit as much as possible any hand written parsers. - ares__buf_split() uses the new memory-safe parsing routines. This - adds a couple of additional flags to remove duplicates which the - existing split code did. - - Fix By: Brad House (@bradh352) - -- clang-format - -- sonarcloud: const - -- Connection failure should increment server failure count first - - In order to be sure a different server is chosen on the next query, - a read error should result in the failure count being updated - first before requeing the request to a different server. - - Fix By: Brad House (@bradh352) - -GitHub (18 Dec 2023) -- [Brad House brought this change] - - ahost should use ares_getaddrinfo() these days (#669) - - ahost wasn't printing both ipv4 and ipv6 addresses. This day and age, it really should. - - This PR also adds the ability to specify the servers to use. - - Fix By: Brad House (@bradh352) - -Brad House (17 Dec 2023) -- Fix bad stub for ares__iface_ips_enumerate() - - If the ability to enumerate interface ip addresses does not exist - on a system, the stub function contained the wrong prototype. - - Fixes Bug: #668 - Fix By: Brad House (@bradh352) - -GitHub (17 Dec 2023) -- [Gregor Jasny brought this change] - - Fix minor warnings and documentation typos (#666) - - Build warnings could be seen [here](https://buildd.debian.org/status/fetch.php?pkg=c-ares&arch=arm64&ver=1.24.0-1&stamp=1702826366&raw=0) [origin](https://buildd.debian.org/status/package.php?p=c-ares) - - Fix By: Gregor Jasny (@gjasny) - -- [Brad House brought this change] - - CI: Add Alpine Linux and old Ubuntu (#667) - - Alpine linux doesn't use glibc but instead musl c, so provides a good alternative test bed. We are also adding the oldest non-EOL ubuntu version so we can test against older linux variants to prevent surprises. - - This patch also migrates more tests to use cmake and ninja in order to reduce overall build times as we seem to run out of credits on Cirrus-CI pretty quickly. - - Fix By: Brad House (@bradh352) - -Brad House (17 Dec 2023) -- fix support with older google test versions - -- getrandom() may require sys/random.h on some systems - - There is a reported build issue where getrandom() is detected - but compile fails due to a missing prototype. This commit attempts - to resolve that issue. - - Fixes Bug: #665 - Fix By: Brad House (@bradh352) - -GitHub (17 Dec 2023) -- [Martin Chang brought this change] - - Use SOCK_DNS extension on socket on OpenBSD (#659) - - This patch added the `SOCK_DNS` flag when running on OpenBSD. Allowing a reduced set of `pledge(2)` promises. Before this patch. The "stdio rpath inet" promises must be used in order to resolve any records. After the patch inet can be replaced with dns which only allows communication on destination port 53, instead of on all ports. - - Side note: I checked the OpenBSD kernel source code. Even though the socket document says the DNS port (typically 53)., The OpenBSD 7.4 kernel only allows 53. - - Fix By: Martin Chang (@marty1885) - -Brad House (17 Dec 2023) -- ci: disable static for symbol hiding tests - -- ci: add test case for building with hidden symbol visibility - -- fix test building with symbol hiding - - New test cases depend on internal symbols for calculating timeouts. - Disable those test features if symbol hiding is enabled. - - Fixes Bug: #664 - Fix By: Brad House (@bradh352) - -Version 1.24.0 (16 Dec 2023) - -GitHub (16 Dec 2023) -- [Brad House brought this change] - - ares_cancel() could trigger callback with wrong response code (#663) - - When doing ares_gethostbyname() or ares_getaddrinfo() with AF_UNSPEC, if ares_cancel() was called after one address class was returned but before the other address class, it would return ARES_SUCCESS rather than ARES_ECANCELLED. - - Test case has been added for this specific condition. - - Fixes Bug: #662 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - rand: allow fallback from OS (#661) - - getrandom() can fail with ENOSYS if the libc supports the function but the kernel does not. - - Fixes Bug: #660 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - 1.24.0 release prep (#657) - -Brad House (11 Dec 2023) -- reference alternative to ares_getsock() in docs - -- tag some functions as deprecated in docs - -- Coverity: fix allocation size as reported in new code - -- remove dead code: ares_iphlpapi.h - -- remove dead code: bitncmp - -GitHub (9 Dec 2023) -- [Brad House brought this change] - - Use external GoogleTest instead of bundling it (#655) - - GoogleTest should be unbundled. Google changed their guidance a few years back and modern versions of google test cannot build the bundling code file. - - This PR also updates to use C++14 as is required by modern GoogleTest versions. - - Fixes Bug: #506 - Fix By: Brad House (@bradh352) - -Brad House (8 Dec 2023) -- use IF_NAMESIZE instead of IFNAMSIZ to avoid warning - -- remove redundant cast - -- clang-format and fix one warning - -GitHub (8 Dec 2023) -- [Brad House brought this change] - - Clean up some Windows-only warnings (#654) - - Windows was emitting some warnings due to datatype differences. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Rewrite sortlist hand parser for memory safety and bugs (#653) - - The parser for the sortlist has been rewritten to use the ares__buf_*() functions. This also resolves some known bugs in accepting invalid sortlist entries which should have caused parse failures. - - Fixes Bug: #501 - Fix By: Brad House (@bradh352) - -Brad House (8 Dec 2023) -- enhance timeout test case to make sure it will re-use a previously downed server - -- enhance timeout test case - -- SonarCloud: make const - -GitHub (7 Dec 2023) -- [Brad House brought this change] - - increment failures on timeout (#651) - - As of c-ares 1.22.0, server timeouts were erroneously not incrementing server failures meaning the server in use wouldn't rotate. There was apparently never a test case for this condition. - - This PR fixes the bug and adds a test case to ensure it behaves properly. - - Fixes Bug: #650 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Windows UBSAN tests (#649) - - Fix UBSAN error, and enable UBSAN testing in AppVeyor. - - Fixes Bug #648 - Fix By: Gisle Vanem (@gvanem) - -- [Brad House brought this change] - - Support ipv6 link-local servers and %iface syntax (#646) - - Some environments may send router advertisements on a link setting their link-local (fe80::/10) address as a valid DNS server to the remote system. This will cause a DNS entry to be created like `fe80::1%iface`, since all link-local network interfaces are technically part of the same /10 subnet, it must be told what interface to send packets through explicitly if there are multiple physical interfaces. - - This PR adds support for the %iface modifier when setting DNS servers via `/etc/resolv.conf` as well as via `ares_set_servers_csv()`. - - For MacOS and iOS it is assumed that libresolve will set the `sin6_scope_id` and should be supported, but my test systems don't seem to read the Router Advertisement for RDNSS link-local. Specifying the link-local dns server on MacOS via adig has been tested and confirmed working. - - For Windows, this is similar to MacOS in that the system doesn't seem to honor the RDNSS RA, but specifying manually has been tested to work. - - At this point, Android support does not exist. - - Fixes Bug #462 - Supersedes PR #463 - - Fix By: Brad House (@bradh352) and Serhii Purik (@sergvpurik) - -Brad House (4 Dec 2023) -- silence openwatcom warning due to qcache_max_ttl being unsigned - -- ares__round_up_pow2() work around bogus warning - - On 32bit systems, a codeblock that would intentionally never - be executed was emitting a warning. Rework the code to - prevent the warning. More code, no behavior difference, but - keeps people from complaining about the warning... - - Fixes Bug: #645 - Fix By: Brad House (@bradh352) - -- try to move AC_USE_SYSTEM_EXTENSIONS - -- Enable system extensions - - Certain defines are needed on some systems to enable functionality like - pthread recursive mutexes. - - Fixes #644 - Fix By: Brad House (@bradh352) - -- ares_init_options() with invalid options values should unset the option - - Apparently nodejs is relying on the above behavior for legacy reasons. Add - sanity checks to the various optmask parameters where it makes sense. - - See https://github.com/nodejs/node/pull/50800 - - Fix By: Brad House (@bradh352) - -- SonarCloud: silence bogus reported error - -- clang-format - -GitHub (2 Dec 2023) -- [Brad House brought this change] - - Nameserver parsing: replace another hand-written parser (#643) - - This replaces the nameserver parsing code with code that use ares__buf_*() in the name of memory safety. - - Fix By: Brad House (@bradh352) - -Version 1.23.0 (28 Nov 2023) - -GitHub (28 Nov 2023) -- [Brad House brought this change] - - 1.23.0 release prep (#641) - -Brad House (28 Nov 2023) -- add missing manpage to distribution list - -- clang-format - -- remove a simply - -- fix doc typo - -- ares_init_options with ARES_OPT_UDP_PORT wrong byte order - - Regression from c-ares 1.19.1, ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT are - specified from the user in host-byte order, but there was a regression that - caused it to be read as if it was network byte order. - - Fixes Bug: #640 - Reported By: @Flow86 - Fix By: Brad House (@bradh352) - -- fix ares_threadsafety() prototype - -GitHub (28 Nov 2023) -- [Brad House brought this change] - - Basic Thread Safety (#636) - - c-ares does not have any concept of thread-safety. It has always been 100% up to the implementor to ensure they never call c-ares from more than one thread at a time. This patch adds basic thread-safety support, which can be disabled at compile time if not desired. It uses a single recursive mutex per channel, which should be extremely quick when uncontested so overhead should be minimal. - - Fixes Bug: #610 - - Also sets the stage to implement #611 - - Fix By: Brad House (@bradh352) - -- [petrvh brought this change] - - ares_getaddrinfo(): do not use search domains if ARES_FLAG_NOSEARCH is set (#638) - - c-ares init options defines a flag ARES_FLAG_NOSEARCH that is supposed to prevent search using configured domain suffixes, however when using ares_getaddrinfo() the flag was ignored and domain suffixes were used anyway. - - Configuring zero domains to search also does not work (if ndomains == 0 default domain search list is loaded regardless of the flag ARES_OPT_DOMAINS being set). - - This change adds a check for the ARES_FLAG_NOSEARCH in as_is_only() function that is used by ares_getaddrinfo() to decide if to try to query next possible name ( next_dns_lookup() ) - - Fix By: @petrvh - -Brad House (25 Nov 2023) -- Fix MacOS version test - - It appears that the Issue #454 wasn't really fixed for some reason. This commit should fix the detection. - - Fix By: Brad House (@bradh352) - -Daniel Stenberg (24 Nov 2023) -- CI: codespell - - Closes #635 - -GitHub (24 Nov 2023) -- [Christian Clauss brought this change] - - Fix typos discovered by codespell (#634) - - % `codespell --ignore-words-list="aas,aci,acter,atleast,contentss,firey,fo,sais,seh,statics"` - * https://pypi.org/project/codespell - - Fix By: Christian Clauss (@cclauss) - -Brad House (22 Nov 2023) -- environment is meant as an override for sysconfig - -GitHub (22 Nov 2023) -- [Ignat brought this change] - - Support attempts and timeout options from resolv.conf (#632) - - c-ares parses only antique version of options for timeout and number of retries from resolv.conf (`retrans` and `retry` are missing in modern documentation https://man7.org/linux/man-pages/man5/resolv.conf.5.html). - - I add support of `attempts` and `timeout` options - - Fix By: Ignat (@Kontakter) - -- [Brad House brought this change] - - more precise timeout calculation (#633) - - The timeout calculation was occurring with millisecond precision, but on some systems, there is microsecond precision which could mean we'd tell a user a timeout time prior to the actual timeout. - - Fixes Bug: #631 - Fix By: Brad House (@bradh352) - -- [Christian Clauss brought this change] - - INSTALL.md: Fix typo (#630) - - Fix By: Christian Clauss (@cclauss) - -Brad House (19 Nov 2023) -- SonarCloud: fix minor codesmells - -- fix test case regression due to missing parens - -- now that warnings are enabled on test cases, clear a bunch of warnings - -- CMake: CXXFLAGS environment wasn't being read because C++ compiler was enabled after settings warnings. - -- fix additional windows test warnings - -- cleanup some Windows warnings in test - -- clang-format - -GitHub (19 Nov 2023) -- [Brad House brought this change] - - Fix Windows UWP (Store) building and add to CI/CD (#627) - - When building for UWP (WindowsStore), additional headers are needed and some functions are not available. This also adds AppVeyor CI/CD support to catch these issues in the future. - - Fix By: Deal (@halx99) and Brad House (@bradh352) - -Brad House (19 Nov 2023) -- ares_set_servers_*() should allow an empty server list - - For historic reasons, we have users depending on ares_set_servers_*() - to return ARES_SUCCESS when passing no servers and actually *clear* - the server list. It appears they do this for test cases to simulate - DNS unavailable or similar. Presumably they could achieve the same - effect in other ways (point to localhost on a port that isn't in use). - But it seems like this might be wide-spread enough to cause headaches - so we just will document and test for this behavior, clearly it hasn't - caused "issues" for anyone with the old behavior. - - See: https://github.com/nodejs/node/pull/50800 - - Fix By: Brad House (@bradh352) - -GitHub (19 Nov 2023) -- [Brad House brought this change] - - Query Cache support (#625) - - This PR implements a query cache at the lowest possible level, the actual dns request and response messages. Only successful and `NXDOMAIN` responses are cached. The lowest TTL in the response message determines the cache validity period for the response, and is capped at the configuration value for `qcache_max_ttl`. For `NXDOMAIN` responses, the SOA record is evaluated. - - For a query to match the cache, the opcode, flags, and each question's class, type, and name are all evaluated. This is to prevent matching a cached entry for a subtly different query (such as if the RD flag is set on one request and not another). - - For things like ares_getaddrinfo() or ares_search() that may spawn multiple queries, each individual message received is cached rather than the overarching response. This makes it possible for one query in the sequence to be purged from the cache while others still return cached results which means there is no chance of ever returning stale data. - - We have had a lot of user requests to return TTLs on all the various parsers like `ares_parse_caa_reply()`, and likely this is because they want to implement caching mechanisms of their own, thus this PR should solve those issues as well. - - Due to the internal data structures we have these days, this PR is less than 500 lines of new code. - - Fixes #608 - - Fix By: Brad House (@bradh352) - -Version 1.22.1 (17 Nov 2023) - -GitHub (17 Nov 2023) -- [Brad House brought this change] - - 1.22.1 release prep (#624) - -Brad House (17 Nov 2023) -- ares__htable_strvp should be case-insensitive - -- optimize: large /etc/hosts files reading - - profiling found some hot paths that could be optimized to reduce - insert times into the cache. - - Fix By: Brad House (@bradh352) - -- Fix /etc/hosts processing performance with all entries using same IP address - - Some users use blacklist files like https://github.com/StevenBlack/hosts which - can contain 200k+ host entries all pointing to 0.0.0.0. Due to the merge - logic in the new hosts processor, all those entries will be associated as - aliases for the same ip address. - - The first issue is that it attempts to check the status of all the hosts for - the merged entry, when it should only be checking the new hosts added to the - merged entry, so this caused exponential time as the entries got longer. - - The next issue is if searching for one of those hosts, it would append all - the matches as cnames/aliases, but there is zero use for 200k aliases - being appended to a lookup, so we are artificially capping this to 100. - - Bug report reference: https://bugs.gentoo.org/917400 - - Fix By: Brad House (@bradh352) - -- new badges - -- OpenWatcom: time_t is unsigned, change math using time_t to promote to a 64bit signed integer - -- fix more docs - -GitHub (15 Nov 2023) -- [Gregor Jasny brought this change] - - Fix typos and man page whatis entry (#619) - - Those issues were detected by lintian. - - Fix By: Gregor Jasny (@gjasny) - -- [Douglas R. Reno brought this change] - - Fix building c-ares-1.22.0 and higher under Watcom. (#623) - - Update config-win32.h to define HAVE_STDINT_H when OpenWatcom is in use. - - Fix By: Douglas R. Reno (@renodr) - -Brad House (15 Nov 2023) -- OpenWatcom: fix PR building - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- CI/CD: Add OpenWatcom - -- warnings: try to prevent warnings due to automatic integer promotion - -- only push to coverity weekly or on explicit coverity_scan branch commits - -- try to cleanup bogus compiler warnings - -- try to cleanup bogus compiler warnings - -- additional test coverage - -- Coverity: omit tests - -- Coverity: more - -- Coverity: silence false positives - -Version 1.22.0 (14 Nov 2023) - -Brad House (14 Nov 2023) -- fix workflow - -- try a different coverity workflow - -GitHub (14 Nov 2023) -- [Brad House brought this change] - - coverity workflow (#618) - -Brad House (14 Nov 2023) -- typos - -- getaddrinfo ESERVICE - -GitHub (14 Nov 2023) -- [Brad House brought this change] - - Release 1.22.0 (#616) - -Brad House (13 Nov 2023) -- SonarCloud: minor codesmells - -- clang-format - -- Extended RCODE in OPT RR PsuedoRecord should not be exposed directly, it should be presented as part of the normal rcode - -- Slight fixes for PR #615 - - 1. the maxtimeout must come at the end of the structure - 2. fix comment form to be C style - 3. fix timeplus randomness if statement - -GitHub (13 Nov 2023) -- [Brad House brought this change] - - Add DNS record manpages (#615) - - The new DNS record parser and writer needs manpages. This PR implements those. - - Fix By: Brad House (@bradh352) - -- [Ignat brought this change] - - Randomize retry penalties to prevent thundering herd type issues (#606) - - The retry timeout values were using a fixed calculation which could cause multiple simultaneous queries to timeout and retry at the exact same time. If a DNS server is throttling requests, this could cause the issue to never self-resolve due to all requests recurring at the same instance again. - - This PR also creates a maximum timeout option to make sure the random value selected does not exceed this value. - - Fix By: Ignat (@Kontakter) - -Brad House (13 Nov 2023) -- fix typos - -- some simplification and better error handling - -- SonarCloud: fix some minor codesmells - -GitHub (12 Nov 2023) -- [Brad House brought this change] - - Implement ares_reinit() to reload system configuration into existing channel (#614) - - This PR implements ares_reinit() to safely reload a channel's configuration even if there are existing queries. This function can be called when system configuration is detected to be changed, however since c-ares isn't thread aware, care must be taken to ensure no other c-ares calls are in progress at the time this function is called. Also, this function may update the open file descriptor list so care must also be taken to wake any event loops and reprocess the list of file descriptors. - - Fixes Bug #301 - - Fix By: Brad House (@bradh352) - -Brad House (11 Nov 2023) -- test case ensures tag for caa is not blank - -- 0-length strings are ok - -- SonarCloud: fix up codesmells - -GitHub (11 Nov 2023) -- [Brad House brought this change] - - rewrite adig using new helpers (#607) - - adig previously performed manual parsing of the DNS records. Now it can focus strictly on formatting of output data for printing. It simply iterates across the parsed DNS packet and queries for the RRs, parameters for each RR, and the datatypes for each parameter. adig will now automatically pick up new RRs from the c-ares library due to the dynamic nature. - - The adig format also now more closely resembles that of BIND's `dig` output. - - A few more helpers needed to be added to the c-ares library that were missing. There ware a couple of minor bugs and enhancements also needed. - - Example: - ``` - ./adig -t ANY www.google.com - - ; <<>> c-ares DiG 1.21.0 <<>> www.google.com - ;; Got answer: - ;; ->>HEADER<<- opcode: QUERY, status: RCODE, id: 23913 - ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1 - - ;; OPT PSEUDOSECTION: - ; EDNS: version: 0, flags: 0; udp: 512 - ;; QUESTION SECTION: - ;www.google.com. IN ANY - - ;; ANSWER SECTION: - www.google.com. 162 IN A 142.251.107.99 - www.google.com. 162 IN A 142.251.107.105 - www.google.com. 162 IN A 142.251.107.103 - www.google.com. 162 IN A 142.251.107.147 - www.google.com. 162 IN A 142.251.107.104 - www.google.com. 162 IN A 142.251.107.106 - www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::93 - www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::69 - www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::68 - www.google.com. 162 IN AAAA 2607:f8b0:400c:c32::6a - www.google.com. 21462 IN HTTPS 1 . alpn="h2,h3" - - ;; MSG SIZE rcvd: 276 - ``` - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - make dns parser/writer public (#604) - - This PR makes the c-ares parser introduced in 1.21, and the new writer, along with associated helpers public. These helpers are contained in a new public header of `ares_dns_record.h` which should _**not**_ be included directly, instead simply including `ares.h` is sufficient. This will address #587, as well as #470. - - A follow-up PR will be made which will transform `adig` to use the new parsers and helpers. - - This PR does not currently add man pages for these public functions, that will be in a follow-up PR once the `adig` migration is done which may expose additional needed helpers. - - The two aforementioned PRs will be done before the 1.22 release. - - Fix By: Brad House (@bradh352) - -Brad House (9 Nov 2023) -- options helpers: fix dereference to properly return params - -- clang-format - -GitHub (9 Nov 2023) -- [Brad House brought this change] - - Add SVCB and HTTPS RR (RFC 9460) (#603) - - This PR adds parsing and writing support for SVCB and HTTPS RRs as defined in RFC 9460. - - This should fix #566 - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - OPT RR should support parsing key/value options (#602) - - The OPT RR record has some seldom used options with a 16bit key and a binary value. The current parser and writer was not supporting this. This PR adds support. The same format is also used for SVCB/HTTPS records, so getting this in there is necessary to support that RR type. - - Also, we split the Binary record format into BIN and BINP, where BINP is an indicator that the binary data is _likely_ printable and will guarantee a NULL terminator. This is helpful for those attempting to print RRs. - - Fix By: Brad House (@bradh352) - -Brad House (8 Nov 2023) -- SonarCloud: fix some easy codesmells - -- clang-format - -- Mark a couple of parameters as const in the public API - -GitHub (7 Nov 2023) -- [Brad House brought this change] - - Add TLSA record support (#600) - - As per #470, c-ares is missing a parser for the TLSA record format (RFC 6698). This PR introduces that parser. - - Once the new parser interface becomes public and this PR is merged, then #470 can be closed. - - Fix By: Brad House (@bradh352) - -Brad House (7 Nov 2023) -- memory leak in test case - -- fix bad variable reference - -- DNS Write: fix name compression - -- SonarCloud: fix codesmells - -- Coverage: add tests for writing and parsing various record formats - -GitHub (7 Nov 2023) -- [Brad House brought this change] - - DNS Record Write (#598) - - The `ares_dns_record_t` data structure created in the prior release is capable of holding a complete parsed DNS message and also provides all helpers in order to fill in the data structure. This PR adds write capabilities for this data structure to form a complete message and supports features such as DNS name compression as defined in RFC1035. Though this message writing capability goes further than c-ares internally needs, external users may find it useful ... and we may find it useful for test validation as well. - - This also replaces the existing message writing code in `ares_create_query()`, as well rewriting the request message without EDNS in ares_process.c's `process_answer()`. - - Fix By: Brad House (@bradh352) - -Brad House (6 Nov 2023) -- PATH_RESOLV_CONF: use empty string instead of NULL to prevent warnings - -- build fix - -- const: fix some usecases - -- remove tests that depend on randomness - -GitHub (5 Nov 2023) -- [Brad House brought this change] - - Use EDNS by default (#596) - - All DNS servers support EDNS, by using this by default, it will allow larger responses without the need to switch to TCP. If by chance a DNS server is hit that doesn't support EDNS, this is detected due to the lack of the OPT RR in the response and will be automatically retried without EDNS. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - `ares_channel` -> `ares_channel_t *`: don't bury the pointer (#595) - - `ares_channel` is defined as `typedef struct ares_channeldata *ares_channel;`. The problem with this, is it embeds the pointer into the typedef, which means an `ares_channel` can never be declared as `const` as if you write `const ares_channel channel`, that expands to `struct ares_channeldata * const ares_channel` and not `const struct ares_channeldata *channel`. - - We will now typedef `ares_channel_t` as `typedef struct ares_channeldata ares_channel_t;`, so if you write `const ares_channel_t *channel`, it properly expands to `const struct ares_channeldata *channel`. - - We are maintaining the old typedef for API compatibility with existing integrations, and due to typedef expansion this should not even cause any compiler warnings for existing code. There are no ABI implications with this change. I could be convinced to keep existing public functions as `ares_channel` if a sufficient argument exists, but internally we really need make this change for modern best practices. - - This change will allow us to internally use `const ares_channel_t *` where appropriate. Whether or not we decide to change any public interfaces to use `const` may require further discussion on if there might be ABI implications (I don't think so, but I'm also not 100% sure what a compiler internally does with `const` when emitting machine code ... I think more likely ABI implications would occur going the opposite direction). - - FYI, This PR was done via a combination of sed and clang-format, the only manual code change was the addition of the new typedef, and a couple doc fixes :) - - Fix By: Brad House (@bradh352) - -Brad House (4 Nov 2023) -- win32 warnings look good, remove commented out block - -- more msvc warnings - -- fix - -- docs: document setting servers can be done live - -- SonarCloud: more easy codesmells - -- clang-format - -- SonarCloud: fix up codesmells - -GitHub (3 Nov 2023) -- [Brad House brought this change] - - Dynamic Server List (#594) - - This PR makes the server list a dynamic sorted list of servers. The sort order is [ consecutive failures, system config index ]. The server list can be updated via ares_set_servers_*(). Any queries currently directed to servers that are no longer in the list will be automatically re-queued to a different server. - - Also, any time a failure occurs on the server, the sort order of the servers will be updated so that the one with the fewest consecutive failures is chosen for the next query that goes on the wire, this way bad or non-responsive servers are automatically isolated. - - Since the server list is now dynamic, the tracking of query failures per server has been removed and instead is relying on the server sort order as previously described. This simplifies the logic while also reducing the amount of memory required per query. However, because of this dynamic nature, it may not be easy to determine the server attempt order for enqueued queries if there have been any failures. - - If using the ARES_OPT_ROTATE, this is now implemented to be a random selection of the configured servers. Since the server list is dynamic, its not possible to go to the next server as configuration could have changed between queries or attempts for the same query. - - Finally, this PR moved some existing functions into new files to logically separate them. - - This should address issues #550 and #440, while also setting the framework to implement #301. #301 needs a little more effort since it configures things other than the servers themselves (domains, search, sortlist, lookups), which need to make sure they can be safely updated. - - Fix By: Brad House (@bradh352) - -Brad House (1 Nov 2023) -- no reason to run LSAN, ASAN already does it - -GitHub (31 Oct 2023) -- [Brad House brought this change] - - AppVeyor: update compiler versions, use Msys2, and Windows fixes (#593) - - AppVeyor was using Visual Studio 2015 along with old versions of MinGW. Update to the latest AppVeyor provides and also add an MSYS2 build test using MinGW which will use the bleeding edge version. - - When researching #590 this also uncovered a bug in cmake not properly detecting if_indextoname() on windows. This has been corrected as well as the underlying issue reported in #590. - - Fix By: Brad House (@bradh352) and Jonas Kvinge (@jonaski) - -Brad House (31 Oct 2023) -- Coverage: add some code misuse test cases - -- hosts file parsing should set success at end of loop - -- fix windows localhost for ares_gethostbyname_file() when /etc/hosts doesn't have an entry - -- SonarCloud: fix up codesmells (const, unneeded casts, reduce complexity) - -GitHub (30 Oct 2023) -- [Brad House brought this change] - - Replace hosts parser, add caching capabilities (#591) - - HOSTS FILE PROCESSING OVERVIEW - ============================== - The hosts file on the system contains static entries to be processed locally - rather than querying the nameserver. Each row is an IP address followed by - a list of space delimited hostnames that match the ip address. This is used - for both forward and reverse lookups. - - We are caching the entire parsed hosts file for performance reasons. Some - files may be quite sizable and as per Issue #458 can approach 1/2MB in size, - and the parse overhead on a rapid succession of queries can be quite large. - The entries are stored in forwards and backwards hashtables so we can get - O(1) performance on lookup. The file is cached until the file modification - timestamp changes (or 60s if there is no implemented stat() capability). - - The hosts file processing is quite unique. It has to merge all related hosts - and ips into a single entry due to file formatting requirements. For - instance take the below: - ``` - 127.0.0.1 localhost.localdomain localhost - ::1 localhost.localdomain localhost - 192.168.1.1 host.example.com host - 192.168.1.5 host.example.com host - 2620:1234::1 host.example.com host6.example.com host6 host - ``` - This will yield 2 entries. - 1) ips: `127.0.0.1,::1` - hosts: `localhost.localdomain,localhost` - 2) ips: `192.168.1.1,192.168.1.5,2620:1234::1` - hosts: `host.example.com,host,host6.example.com,host6` - - It could be argued that if searching for `192.168.1.1` that the `host6` - hostnames should not be returned, but this implementation will return them - since they are related (both ips have the fqdn of host.example.com). It is - unlikely this will matter in the real world. - - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - cleanups: split functions out into different files, rename some to be more logical (#589) - -Brad House (27 Oct 2023) -- fix comment - -- recursive git attributes - -Version 1.21.0 (26 Oct 2023) - -Brad House (26 Oct 2023) -- SonarCloud: reduce reported complexity that exists for no reason. - -- SonarCloud: fix some #undef codesmells - -- formatting - -- document ARES_RR_* records - -- no reason to limit on truncation - -- linguist fixes - -- don't use test cases to determine language of c-ares - -- fix grammar - -- fix count - -GitHub (25 Oct 2023) -- [Brad House brought this change] - - 1.21.0 release prep (#585) - -Brad House (25 Oct 2023) -- fix build warning - -GitHub (25 Oct 2023) -- [Brad House brought this change] - - SonarCloud: clean up more codesmells (#584) - -Brad House (25 Oct 2023) -- resolve reported memory leaks - -- add test vector said to cause a memory leak - -GitHub (25 Oct 2023) -- [Brad House brought this change] - - sonarcloud: fix more codesmells (#583) - -- [Brad House brought this change] - - sonarcloud easy codesmells (#582) - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Modernization: replace multiple hand-parsers with new memory-safe parser (#581) - - New DNS record parsing code. The old code was basically just some helper macros and functions for parsing an entire DNS message. The caller had to know the RFCs to use the parsers, except for some pre-made exceptions. The new parsing code parses the entire DNS message into an opaque data structure in a memory safe manner with various accessors for reading and manipulating the data. - - The existing parser helpers for the various record types were reimplemented as wrappers around the new parser. - - The accessors allow easy iteration across the DNS record datastructure, and can be used to easily create dig-like output without needing to know anything about the various record types and formats as dynamic helpers are provided for enumeration of values and data types of those values. - - At some point in the future, this new DNS record structure, accessors, and parser will be exposed publicly. This is not done at this point as we don't want to do that until the API is completely stable. Likely a write() function to output the DNS record back into an actual message buffer will be introduced with the stable API as well. - - Some subtle bugs in the existing code were uncovered, some which had test cases which turned out to be bogus. Validation with third-party implementations (e.g. BIND9) were performed to validate such cases were indeed bugs. - - Adding additional RR parsers such as for TLSA (#470) or SVCB/HTTPS (#566) are trivial now since focus can be put on only parsing the data within the RR, not the entire message. That said, as the new parser is not yet public, it isn't clear the best way to expose any new RRs (probably best to wait for the new parser to be public rather than hacking in another legacy function). - - Some additional RRs that are part of DNS RFC1035 or EDNS RFC6891 that didn't have previously implemented parsers are now also implemented (e.g. HINFO, OPT). Any unrecognized RRs are encapsulated into a "RAW_RR" as binary data which can be inserted or extracted, but are otherwise not interpreted in any way. - - Fix By: Brad House (@bradh352) - -- [Gregor Jasny brought this change] - - feat: use CMake to control symbol visibility (#574) - - In contrast to #572 this solution does not need any extra headers. But it is also limited to GCC-like compilers. - - Fix By: Gregor Jasny (@gjasny) - -- [Brad House brought this change] - - remove ares_nowarn helpers #580 - - Now that the code internally is using proper datatypes, there is no longer a need for ares_nowarn helpers. Remove them. - - Fix By: Brad House (@bradh352) - -Brad House (16 Oct 2023) -- clang-format: fix structure alignment - - It appears the structure alignment chosen just doesn't work right. - Switch to 'left', it appears to be mostly correct. - - Fix By: Brad House (@bradh352) - -GitHub (15 Oct 2023) -- [Brad House brought this change] - - Reformat code using clang-format (#579) - - c-ares uses multiple code styles, standardize on one. Talking with @bagder he feels strongly about maintaining an 80 column limit, but feels less strongly about things I feel strongly about (like alignment). - - Can re-run the formatter on the codebase via: - ``` - clang-format -i */*.c */*.h */*/*.c */*/*.h - ``` - - Fix By: Brad House (@bradh352) - -Brad House (15 Oct 2023) -- inet_ntop requires ares_private.h - -- SonarCloud: Fix additional code smells - - Fix By: Brad House (@bradh352) - -- SonarCloud: Ignore codesmells c89 doesn't support - - C89 doesn't support iterator declaration in for loop, kill warning. - - Fix By: Brad House (@bradh352) - -GitHub (15 Oct 2023) -- [Brad House brought this change] - - set compiler standard to ISO C90/ANSI C89 (#577) - - SonarCloud is outputting some code smells for things that aren't possible for C89. Hopefully setting the code standard to C89/C90 properly will fix those bogus warnings. - - Fix By: Brad House (@bradh352) - -Brad House (15 Oct 2023) -- fix new ares_strcpy to ensure null termination - -- build fix - -GitHub (15 Oct 2023) -- [Brad House brought this change] - - SonarCloud: Fix up codesmells due to strlen(), strcpy(), and strncpy() (#576) - - Create ares_strlen() and ares_strcpy() in order to resolve SonarCloud codesmells related to their use. - - ares_strlen() just becomes null-safe. - - ares_strcpy() is equivalent to strlcpy(), so unlike strncpy() it guarantees NULL termination. - - Fix By: Brad House (@bradh352) - -Brad House (15 Oct 2023) -- SonarCloud: try to appease it better - -- SonarCloud: Fix reported bugs - - SonarCloud reported a few bugs, this commit should fix those reports. - - Fix By: Brad House (@bradh352) - -GitHub (15 Oct 2023) -- [Brad House brought this change] - - Fix internal datatype usage and warnings (#573) - - PR #568 increased the warning levels and c-ares code emitted a bunch of warnings. This PR fixes those warnings and starts transitioning internal data types into more proper forms (e.g. data lengths should be size_t not int). It does, however, have to manually cast back to what the public API needs due to API and ABI compliance (we aren't looking to break integrations, just clean up internals). - - Fix By: Brad House (@bradh352) - -Brad House (15 Oct 2023) -- SonarCloud: exclude tests - -- fix source directories - -GitHub (15 Oct 2023) -- [Brad House brought this change] - - Sonarcloud (#575) - -- [Brad House brought this change] - - Increase compiler warnings by default (#568) - - c-ares was missing a couple of common compiler warnings during building that are widely recognized as a best practice. This PR makes no code changes, only build system changes to increase warning levels. - - This PR does cause some new warnings to be emitted, a follow-up PR will address those. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - introduce ares_bool_t datatype (#570) - - c-ares currently uses int for boolean, which can be confusing as there are some functions which return int but use '0' as the success condition. Some internal variable usage is similar. Lets try to identify the boolean use cases and split them out into their own data type of ares_bool_t. Since we're trying to keep C89 compatibility, we can't rely on stdbool.h or the _Bool C99 data type, so we'll define our own. - - Also, chose using an enum rather than say unsigned char or int because of the type safety benefits it provides. Compilers should warn if you try to pass, ARES_TRUE on to a ares_status_t enum (or similar) since they are different enums. - - Fix By: Brad House (@bradh352) - -Brad House (12 Oct 2023) -- Socket callbacks were passed SOCK_STREAM instead of SOCK_DGRAM on udp - - A regression was introduced in 1.20.0 that would pass SOCK_STREAM on udp - connections due to code refactoring. If a client application validated this - data, it could cause issues as seen in gRPC. - - Fixes Issue: #571 - Fix By: Brad House (@bradh352) - -- Enhance test of ares_getsock() - - In an attempt to see if ares_getsock() was broken as per #571, do - further sanity checks of the results of ares_getsock(). It seems - as though ares_getsock() is fine. - - Fix By: Brad House (@bradh352) - -GitHub (10 Oct 2023) -- [Brad House brought this change] - - Tool: STAYOPEN flag could make tools not terminate (#569) - - If a flag is set to keep the connections to the DNS servers open even if there are no queries, the tools would not exit until the remote server closed the connection due to the user of ares_fds() to determine if there are any active queries. Instead, rely on ares_timeout() returning NULL if there are no active queries (technically this returns the value passed to max_tv in ares_timeout(), but in our use case, that is always NULL). - - Fixes Issue: #452 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - ares_status_t enum for status codes (#567) - - The list of possible error codes in c-ares was a #define list. This not only doesn't provide for any sort of type safety but it also lacks clarification on what a function may return or what it takes, as an int could be an ares status, a boolean, or possibly even a length in the current code. - - We are not changing any public APIs as though the C standard states the underlying size and type of an enum is int, there are compiler attributes to override this as well as compiler flags like -fshort-enums. GCC in particular is known to expand an enum's width based on the data values (e.g., it can emit a 64bit integer enum). - - All internal usages should be changed by this PR, but of course, there may be some I missed. - - Fix By: Brad House (@bradh352) - -Daniel Stenberg (9 Oct 2023) -- docs: provide better man page references - - When referring to another c-ares function use \fI function(3) \fP to let - the webpage rendering find and cross-link them appropriately. - - SEE ALSO references should be ".BR name (3),", with a space before the - open parenthesis. This helps the manpage to HTML renderer. - - Closes #565 - -Version 1.20.1 (8 Oct 2023) - -GitHub (8 Oct 2023) -- [Daniel Stenberg brought this change] - - ares-test: silence warning (#564) - - warning: comparison of integer expressions of different signedness - - Fix By: Daniel Stenberg (@bagder) - -Brad House (8 Oct 2023) -- fix README.md - -GitHub (8 Oct 2023) -- [Brad House brought this change] - - 1.20.1 release (#563) - -- [Brad House brought this change] - - fix reference to freed memory (#562) - - Issue #561 shows free'd memory could be accessed in some error conditions. - - Fixes Issue #561 - Fix By: Brad House (@bradh352) - -Brad House (8 Oct 2023) -- reported build/test systems may timeout on intensive tests. reduce test case to still be relevant but to reduce false positive errors - -GitHub (8 Oct 2023) -- [Gregor Jasny brought this change] - - Regression: Fix typo in fuzzcheck target name (#559) - - This seems to be a vim'esque typo introduced with c1b00c41. - - Fix By: Gregor Jasny (@gjasny) - -Version 1.20.0 (6 Oct 2023) - -Brad House (6 Oct 2023) -- fix slist search off by 1 - -GitHub (6 Oct 2023) -- [Brad House brought this change] - - 1.20.0 release prep (#557) - -- [Brad House brought this change] - - ares__buf should return standard error codes. more helpers implemented. (#558) - - The purpose of this PR is to hopefully make the private API of this set of routines less likely to need to be changed in a future release. While this is not a public API, it could become harder in the future to change usage as it becomes more widely used within c-ares. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Update from 1989 MIT license text to modern MIT license text (#556) - - ares (and thus c-ares) was originally licensed under the 1989 MIT license text: - https://fedoraproject.org/wiki/Licensing:MIT#Old_Style_(no_advertising_without_permission) - - This change updates the license to the modern MIT license as recognized here: - https://opensource.org/license/mit/ - - care has been taken to ensure correct attributions remain for the authors contained within the copyright headers, and all authors with attributions in the headers have been contacted for approval regarding the change. Any authors which were not able to be contacted, the original copyright maintains, luckily that exists in only a single file `ares_parse_caa_reply.c` at this time. - - Please see PR #556 for the documented approvals by each contributor. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Test Harness: use ares_timeout() to calculate the value to pass to select() these days. (#555) - - The test framework was using 100ms timeout passed to select(), and not using ares_timeout() to calculate the actual recommended value based on the queries in queue. Using ares_timeout() tests the functionality of ares_timeout() itself and will provide more responsive results. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Fix for TCP back to back queries (#552) - - As per #266, TCP queries are basically broken. If we get a partial reply, things just don't work, but unlike UDP, TCP may get fragmented and we need to properly handle that. - - I've started creating a basic parser/buffer framework for c-ares for memory safety reasons, but it also helps for things like this where we shouldn't be manually tracking positions and fetching only a couple of bytes at a time from a socket. This parser/buffer will be expanded and used more in the future. - - This also resolves #206 by allowing NULL to be specified for some socket callbacks so they will auto-route to the built-in c-ares functions. - - Fixes: #206, #266 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - remove acountry from built tools as nerd.dk is gone (#554) - - The acountry utility required a third party DNSBL service from nerd.dk in order to operate. That service has been offline for about a year and there is no other comparable service offering. We are keeping the code in the repository as an example, but no longer building it. - - Fixes: #537 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Don't requeue any queries for getaddrinfo() during destruction. (#553) - - During ares_destroy(), any outstanding queries are terminated, however ares_getaddrinfo() had an ordering issue with status codes which in some circumstances could lead to a new query being enqueued rather than honoring the termination. - - Fixes #532 - Fix By: @Chilledheart and Brad House (@bradh352) - -- [Brad House brought this change] - - ares_getaddrinfo(): Fail faster on AF_UNSPEC if we've already received one address class (#551) - - As per #541, when using AF_UNSPEC with ares_getaddrinfo() (and in turn with ares_gethostbynam()) if we receive a successful response for one address class, we should not allow the other address class to continue on with retries, just return the address class we have. - - This will limit the overall query time to whatever timeout remains for the pending query for the other address class, it will not, however, terminate the other query as it may still prove to be successful (possibly coming in less than a millisecond later) and we'd want that result still. It just turns off additional error processing to get the result back quicker. - - Fixes Bug: #541 - Fix By: Brad House (@bradh352) - -- [Sam Morris brought this change] - - Avoid producing an ill-formed result when qualifying a name with the root domain (#546) - - This prevents the result of qualifying "name" with "." being "name.." which is ill-formed. - - Fixes Bug: #545 - Fix By: Sam Morris (@yrro) - -- [Brad House brought this change] - - Configuration option to limit number of UDP queries per ephemeral port (#549) - - Add a new ARES_OPT_UDP_MAX_QUERIES option with udp_max_queries parameter that can be passed to ares_init_options(). This value defaults to 0 (unlimited) to maintain existing compatibility, any positive number will cause new UDP ephemeral ports to be created once the threshold is reached, we'll call these 'connections' even though its technically wrong for UDP. - - Implementation Details: - * Each server entry in a channel now has a linked-list of connections/ports for udp and tcp. The first connection in the list is the one most likely to be eligible to accept new queries. - * Queries are now tracked by connection rather than by server. - * Every time a query is detached from a connection, the connection that it was attached to will be checked to see if it needs to be cleaned up. - * Insertion, lookup, and searching for connections has been implemented as O(1) complexity so the number of connections will not impact performance. - * Remove is_broken from the server, it appears it would be set and immediately unset, so must have been invalidated via a prior patch. A future patch should probably track consecutive server errors and de-prioritize such servers. The code right now will always try servers in the order of configuration, so a bad server in the list will always be tried and may rely on timeout logic to try the next. - * Various other cleanups to remove code duplication and for clarification. - - Fixes Bug: #444 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - its not 1991 anymore, lower default timeout and retry count (#542) - - A lot of time has passed since the original timeouts and retry counts were chosen. We have on and off issues reported due to this. Even on geostationary satellite links, latency is worst case around 1.5s. This PR changes the per-server timeout to 2s and the retry count lowered from 4 to 3. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Modernization: Implement base data-structures and replace usage (#540) - - c-ares currently lacks modern data structures that can make coding easier and more efficient. This PR implements a new linked list, skip list (sorted linked list), and hashtable implementation that are easy to use and hard to misuse. Though these implementations use more memory allocations than the prior implementation, the ability to more rapidly iterate on the codebase is a bigger win than any marginal performance difference (which is unlikely to be visible, modern systems are much more powerful than when c-ares was initially created). - - The data structure implementation favors readability and audit-ability over performance, however using the algorithmically correct data type for the purpose should offset any perceived losses. - - The primary motivation for this PR is to facilitate future implementation for Issues #444, #135, #458, and possibly #301 - - A couple additional notes: - - The ares_timeout() function is now O(1) complexity instead of O(n) due to the use of a skiplist. - Some obscure bugs were uncovered which were actually being incorrectly validated in the test cases. These have been addressed in this PR but are not explicitly discussed. - Fixed some dead code warnings in ares_rand for systems that don't need rc4 - - Fix By: Brad House (@bradh352) - -- [Jérôme Duval brought this change] - - fix missing prefix for CMake generated libcares.pc (#530) - - 'pkg-config grpc --cflags' complains with: - Variable 'prefix' not defined in libcares.pc - - Fix By: Jérôme Duval (@korli) - -bradh352 (11 Jul 2023) -- windows get_DNS_Windows port fix for ipv6 - -- windows get_DNS_Windows port is in network byte order - -- backoff to debian 11 due to coverage check failure - -- extend on PR #534, windows should also honor a port - -GitHub (11 Jul 2023) -- [Brad House brought this change] - - Support configuration of DNS server ports (#534) - - As per https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5 we should - support bracketed syntax for resolv.conf entries to contain an optional - port number. - - We also need to utilize this format for configuration of MacOS - DNS servers as seen when using the Viscosity OpenVPN client, where - it starts a private DNS server listening on localhost on a non-standard - port. - - Fix By: Brad House (@bradh352) - -Daniel Stenberg (9 Jun 2023) -- provide SPDX identifiers and a REUSE CI job to verify - - All files have their licence and copyright information clearly - identifiable. If not in the file header, they are set separately in - .reuse/dep5. - - All used license texts are provided in LICENSES/ - -GitHub (30 May 2023) -- [Alexey A Tikhonov brought this change] - - Remove unreachable code as reported by Coverity (#527) - - Coverity reported some code as unreachable. A manual inspection confirmed the reports. - - Fix By: Alexey A Tikhonov (@alexey-tikhonov) - -- [Ben Noordhuis brought this change] - - rand: add support for getrandom() (#526) - - glibc provides arc4random_buf() but musl does not and /dev/urandom is - not always available. - -- [Tim Wojtulewicz brought this change] - - Replace uses of sprintf with snprintf (#525) - - sprintf isn't safe even if you think you are using it right. Switch to snprintf(). - - Fix By: Tim Wojtulewicz (@timwoj) - -bradh352 (23 May 2023) -- update version and release procedure - -GitHub (22 May 2023) -- [Douglas R. Reno brought this change] - - INSTALL.md: Add Watcom instructions and update Windows documentation URLs (#524) - - This commit adds instructions on how to use the WATCOM compiler to build c-ares. This was just tested on c-ares-1.19.1 and works well. - - While going through the links for the C Runtime documentation for Windows systems, I discovered that all three of the KB articles that were linked are now nonexistent. This commit replaces KB94248 with the current replacement available on Microsoft's website, which also makes the other two KB articles obsolete. - - Fix By: Douglas R. Reno (@renodr) - -Version 1.19.1 (22 May 2023) - -bradh352 (22 May 2023) -- Makefile.inc Windows requires tabs not spaces for nmake - -GitHub (22 May 2023) -- [Daniel Stenberg brought this change] - - ares_expand_name: fix compiler warnings (#522) - - Fix some compiler warnings (not introduced in this release) - - Fix By: Daniel Stenberg (@bagder) - -bradh352 (22 May 2023) -- windows MSVC compiler fix on 32bit - -- update security advisory links - -- minor CI issues fixes for imported inet_net_pton - -- ares_rand static analysis fixes from CI - -- windows build fix - -- security release notes - -GitHub (22 May 2023) -- [Brad House brought this change] - - Merge pull request from GHSA-9g78-jv2r-p7vc - -- [Brad House brought this change] - - Merge pull request from GHSA-x6mf-cxr9-8q6v - - * Merged latest OpenBSD changes for inet_net_pton_ipv6() into c-ares. - * Always use our own IP conversion functions now, do not delegate to OS - so we can have consistency in testing and fuzzing. - * Removed bogus test cases that never should have passed. - * Add new test case for crash bug found. - - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Merge pull request from GHSA-8r8p-23f3-64c2 - - * segment random number generation into own file - - * abstract random code to make it more modular so we can have multiple backends - - * rand: add support for arc4random_buf() and also direct CARES_RANDOM_FILE reading - - * autotools: fix detection of arc4random_buf - - * rework initial rc4 seed for PRNG as last fallback - - * rc4: more proper implementation, simplified for clarity - - * clarifications - -bradh352 (20 May 2023) -- add public release note information - -- bump version to 1.19.1 - -GitHub (6 May 2023) -- [Gregor Jasny brought this change] - - test: fix warning about uninitialized memory (#515) - - fix warning in tests - - Fix By: Gregor Jasny (@gjasny) - -- [lifenjoiner brought this change] - - Turn off IPV6_V6ONLY on Windows if it is supported (#520) - - Turn off IPV6_V6ONLY on Windows if it is supported, support for IPv4-mapped IPv6 addresses. - - IPV6_V6ONLY refs: - https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses - https://github.com/golang/go/blob/master/src/net/ipsock_posix.go - https://en.wikipedia.org/wiki/Unix-like - off: - https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables - https://man.netbsd.org/inet6.4 - https://man.freebsd.org/cgi/man.cgi?query=inet6 - https://github.com/apple-oss-distributions/xnu/blob/main/bsd/man/man4/inet6.4 - on: - https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options - acts like off, but returns 1 and dummy setting: - https://man.dragonflybsd.org/?command=inet6 - https://man.dragonflybsd.org/?command=ip6 - unsupported and read-only returns 1: - https://man.openbsd.org/inet6.4 - - default value refs: - https://datatracker.ietf.org/doc/html/rfc3493#section-5.3 - https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#proc-sys-net-ipv6-variables - -- [Brad House brought this change] - - Merge pull request from GHSA-54xr-f67r-4pc4 - - * CARES_RANDOM_FILE should always default to /dev/urandom - - During cross-compilation, CARES_RANDOM_FILE may not be able to be appropriately - detected, therefore we should always set it to /dev/urandom and allow the - entity requesting compilation override the value. The code does appropriately - fall back if CARES_RANDOM_FILE cannot be opened. - - * use set not option - -bradh352 (18 Mar 2023) -- ares_getaddrinfo using service of "0" should be allowed - - As per #517 glibc allows a service/servname of "0" to be treated the - same as if NULL was provided. Also, add a sanity check to ensure - the port number is in range instead of a blind cast. - - Fixes: #517 - Fix By: Brad House (@bradh352) - -GitHub (10 Feb 2023) -- [Nikolaos Chatzikonstantinou brought this change] - - fix memory leak in ares_send (#511) - - When the condition channel->nservers < 1 holds, the function returns - prematurely, without deallocating query->tcpbuf. We rearrange the - check to be done prior to the allocations, avoiding the memory - leak. In this way, we also avoid unnecessary allocations if - channel->nservers < 1 holds. - - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -- [Nikolaos Chatzikonstantinou brought this change] - - change comment style to old-style (#513) - - Following the README.md guidelines, - - "Comments must be written in the old-style" - - the comment is changed to the old style. - - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -- [Nikolaos Chatzikonstantinou brought this change] - - use strncasecmp in ares__strsplit (#512) - - strncasecmp on platforms that don't already have it is already #define'd to a private implementation. There is no need to have OS-specific logic. Also removes ares__strsplit.h as a header as ares_private.h already includes it. - - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -- [Yijie Ma brought this change] - - Fix a typo in ares_init_options.3 (#510) - - that -> than - - Fix By: Yijie Ma (@yijiem) - -- [Douglas R. Reno brought this change] - - Watcom Portability Improvements (#509) - - - Modify the Watcom Makefile for the source code reorganization (#352) - - Add *.map files into .gitignore - - Fix build errors with Watcom's builtin Windows SDK (which is rather - outdated). It's smart enough to understand Windows Vista, but doesn't - have PMIB_UNICASTIPADDRESS_TABLE or MIB_IPFORWARD_ROW2. - - It may be possible to use a different Windows SDK with the Watcom - compiler, such as the most recent Windows 10 SDK. Alternatively the SDK - in OpenWatcom 2.0 (which is in development) should fix this. - - I have no problems testing this Makefile prior to releases, just give me - a ping. - - Tested with Windows Vista, Windows 7, and Windows 10 using 'adig', - 'acountry', and 'ahost'. This also seems to work on Windows XP, though - this is likely due to the compiler in use. - - Fix By: Douglas R. Reno (@renodr) - Fixes Bug: #352 - -- [Jay Freeman (saurik) brought this change] - - ignore aminclude_static.am, as generated by AX_AM_MACROS_STATIC (#508) - - Fix By: Jay Freeman (@saurik) - -- [Jay Freeman (saurik) brought this change] - - sync ax_pthread.m4 with upstream (#507) - - The version in the repository is many years old so this PR simply pulls in the latest - available revision from: - http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 - - Fix By: Jay Freeman (@saurik) - -- [Chilledheart brought this change] - - Windows: Invalid stack variable out of scope for HOSTS file path (#502) - - In some conditions Windows might try to use a stack address that has gone out of scope when determining where to read the hosts data from for file lookups. - - Fix By: @Chilledheart - -- [Brad House brought this change] - - sync ax_cxx_compile_stdcxx_11.m4 with upstream (#505) - - It was reported that ax_cxx_compile_stdcxx_11.m4 was not compatible with uclibc. - The version in the repository is many years old so this PR simply pulls in the latest - available revision from: - http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=tree;f=m4 - - Fixes Bug: #504 - Fix By: Brad House (@bradh352) - -Version 1.19.0 (18 Jan 2023) - -bradh352 (18 Jan 2023) -- Prep for 1.19.0 release - -- Fix inverted logic in 25523e2 - - Fix .localhost. handling in prior commit - - Fix By: Brad House (@bradh352) - -- RFC6761 localhost definition includes subdomains - - RFC6761 6.3 states: - The domain "localhost." and any names falling within ".localhost." - - We were only honoring "localhost". - - Fixes: #477 - Fix By: Brad House (@bradh352) - -- docs: ARES_OPT_UDP_PORT and ARES_OPT_TCP_PORT docs wrong byte order - - As per #487, documentation states the port should be in network byte - order, but we can see from the test cases using MockServers on - different ports that this is not the case, it is definitely in host - byte order. - - Fix By: Brad House (@bradh352) - -GitHub (18 Jan 2023) -- [hopper-vul brought this change] - - Add str len check in config_sortlist to avoid stack overflow (#497) - - In ares_set_sortlist, it calls config_sortlist(..., sortstr) to parse - the input str and initialize a sortlist configuration. - - However, ares_set_sortlist has not any checks about the validity of the input str. - It is very easy to create an arbitrary length stack overflow with the unchecked - `memcpy(ipbuf, str, q-str);` and `memcpy(ipbufpfx, str, q-str);` - statements in the config_sortlist call, which could potentially cause severe - security impact in practical programs. - - This commit add necessary check for `ipbuf` and `ipbufpfx` which avoid the - potential stack overflows. - - fixes #496 - - Fix By: @hopper-vul - -bradh352 (18 Jan 2023) -- Fix build due to str-split sed gone wrong - - Fix By: Brad House (@bradh352) - -- cirrus-ci: switch to scan-build-py for MacOS - - MacOS seems to work better with scan-build-py - - Fix By: Brad House (@bradh352) - -- ares_strsplit* -> ares__strsplit* to comply with internal function naming - - Inspired by #495, but was missing test cases and would failed to build. - - Fix By: Brad House (@bradh352), Daniel Stenberg (@bagder) - -- Cirrus-CI: MacOS Homebrew has changed from /usr/local/opt to /opt/homebrew - - Fix paths for homebrew. - - Fix By: Brad House (@bradh352) - -- cirrus-ci: iOS build needs to use ARM MacOS image - - CirrusCI removed Intel-based MacOS images. Need to switch - iOS builds to use new ARM images as well. - - Fix By: Brad House (@bradh352) - -- cirrus-ci: new MacOS image - - Cirrus-CI has recently EOL'd Intel MacOS VMs, switch to the latest - ARM-based image. - - Fix By: Brad House (@bradh352) - -- acountry was passing stack variable to callback - - Recent ASAN versions picked up that acountry was passing stack - variables to ares_gethostbyname() then leaving the stack context. - We will now allocate a buffer for this. - - Fix By: Brad House (@bradh352) - -GitHub (13 Dec 2022) -- [Daniel Stenberg brought this change] - - docs: reformat/cleanup man pages SYNOPSIS sections (#494) - - To make them render "nicer" in both terminals and on the website. - - - Removes the bold - - Removes .PP lines - - Indents them more like proper code style - - Fix By: Daniel Stenberg (@bagder) - -- [Nikolaos Chatzikonstantinou brought this change] - - bug fix: new ares_strsplit (#492) - - * add ares_strsplit unit test - - The test reveals a bug in the implementation of ares_strsplit when the - make_set parameter is set to 1, as distinct domains are confused for - equal: - - out = ares_strsplit("example.com, example.co", ", ", 1, &n); - - evaluates to n = 1 with out = { "example.com" }. - - * bugfix and cleanup of ares_strsplit - - The purpose of ares_strsplit in c-ares is to split a comma-delimited - string of unique (up to letter case) domains. However, because the - terminating NUL byte was not checked in the substrings when comparing - for uniqueness, the function would sometimes drop domains it should - not. For example, - - ares_strsplit("example.com, example.co", ",") - - would only result in a single domain "example.com". - - Aside from this bugfix, the following cleanup is performed: - - 1. The tokenization now happens with the help of strcspn instead of the - custom function is_delim. - 2. The function list_contains has been inlined. - 3. The interface of ares_strsplit has been simplified by removing the - parameter make_set since in practice it was always 1. - 4. There are fewer passes over the input string. - 5. We resize the table using realloc() down to its minimum size. - 6. The docstring of ares_strsplit is updated and also a couple typos - are fixed. - - There occurs a single use of ares_strsplit and since the make_set - parameter has been removed, the call in ares_init.c is modified - accordingly. The unit test for ares_strsplit is also updated. - - Fix By: Nikolaos Chatzikonstantinou (@createyourpersonalaccount) - -bradh352 (23 Oct 2022) -- CirrusCI: update freebsd image - - Old FreeBSD image for CirrusCI has issues with newer symbols, update to later one. - - Fix By: Brad House (@bradh352) - -GitHub (23 Oct 2022) -- [Stephen Sachs brought this change] - - Fix Intel compiler deprecated options (#485) - - Options `-we ###` and `-wd ###` should not include a whitespace. They are also deprecated and `-diag-error` and `-diag-disable` are their replacements. - - Intel compiler 2021.6 is not able to be used in configure without the proposed patch. - - Fix By: Stephen Sachs (@stephenmsachs) - -- [Jonathan Ringer brought this change] - - Allow for CMake to use absolute install paths (#486) - - Generated libcares.pc could have bad paths when using absolute paths. - - Fix By: Jonathan Ringer (@jonringer) - -- [Thomas Dreibholz brought this change] - - Fix for issue #488: ensure that the number of iovec entries does not exceed system limits. (#489) - - c-ares could try to exceed maximum number of iovec entries supported by system. - - Fix By: Thomas Dreibholz (@dreibh) - -- [bsergean brought this change] - - Add include guards to ares_data.h (#491) - - All the other header files in the src/lib folder do have an include guard so it look like an overthought. - - Fix By: @bsergean - -- [Brad Spencer brought this change] - - Fix typo in docs for ares_process_fd (#490) - - A single letter was missing - - Fix By: Brad Spencer (@b-spencer) - -- [lifenjoiner brought this change] - - tools: refine help (#481) - - fix invalid help options and documentation typos - - Fix By: @lifenjoiner - -- [lifenjoiner brought this change] - - Git: ignore CMake temporary files (#480) - - exclude more files from git - - Fix By: @lifenjoiner - -- [lifenjoiner brought this change] - - adig: fix `-T` option (#479) - - Helper was missing flag to enable TCP mode of operation. - - Fix By: @lifenjoiner - -- [Frank brought this change] - - Add vcpkg installation instructions (#478) - - Update to include vcpkg installation instructions - - Fix By: @FrankXie05 - -- [marc-groundctl brought this change] - - Convert total timeout to per-query (#467) - - On Apple platforms, libresolv reports the total timeout in retrans, not the per-query time. This patch undoes that math to get the per-query time, which is what c-ares expects. This is not perfect because libresolv is inconsistent on whether the timeout is multiplied by retry or retry+1, but I don't see any way to distinguish these cases. - - Fix By: Marc Aldorasi (@marc-groundctl) - -- [marc-groundctl brought this change] - - Don't include version info in the static library (#468) - - The static library should not contain version info, since it would be linked into an executable or dll with its own version info. - - Fix By: @marc-groundctl - -- [Ridge Kennedy brought this change] - - Fix ares_getaddrinfo() numerical address fast path with AF_UNSPEC (#469) - - The conversion of numeric IPv4 addresses in fake_addrinfo() is broken when - the family is AF_UNSPEC. The initial call to ares_inet_pton with AF_INET - will succeed, but the subsequent call using AF_INET6 will fail. This results - in the fake_addrinfo() fast path failing, and ares_getaddrinfo() making a - query when none should be required. - - Resolve this by only attempting the call to ares_inet_pton with AF_INET6 - if the initial call with AF_INET was unsuccessful. - - Fix By: Ridge Kennedy (@ridgek) - -- [Manish Mehra brought this change] - - Configurable hosts path for file_lookup (#465) - - This changeset adds support for configurable hosts file - ARES_OPT_HOSTS_FILE (similar to ARES_OPT_RESOLVCONF). - - Co-authored-by: Manish Mehra (@mmehra) - -bradh352 (27 Apr 2022) -- CMake: Windows DLLs lack version information - - The cares.rc was not included in the build for CMake. Conditionally - add it when building for Windows. - - Fix By: Brad House (@bradh352) - Fixes Bug: #460 - -GitHub (27 Apr 2022) -- [Kai Pastor brought this change] - - CMake: Guard target creation in exported config (#464) - - User projects may call 'find_package(c-ares)' multiple times (e.g. - via dependencies), but targets must be created only once. - Shared and static target must be treated independently. - - Fix By: Kai Pastor (@dg0yt) - -bradh352 (27 Apr 2022) -- Honor valid DNS result even if other class returned an error - - When using ares_getaddrinfo() with PF_UNSPEC, if a DNS server returned - good data on an A record, followed by bad data on an AAAA record, the - good record would be thrown away and an error returned. - - If we got a good response from one of the two queries, regardless of - the order returned, we should honor that. - - Fix By: Dmitry Karpov (dkarpov@roku.com) - Signed Off By: Brad House (@bradh352) - -GitHub (2 Apr 2022) -- [Sam James brought this change] - - configure.ac: fix STDC_HEADERS typo (#459) - - There is no autoconf macro called STDC_HEADERS. AC_HEADER_STDC however does - exist and it defines the STDC_HEADERS macro for use. - - Not clear that STDC_HEADERS from its use in the repo is needed but - would rather not meddle with it for now. - - Fixes an annoying warning on `./configure`: - ``` - /var/tmp/portage/net-dns/c-ares-1.18.1/work/c-ares-1.18.1/configure: 24546: STDC_HEADERS: not found - ``` - - Signed-off-by: Sam James <sam@gentoo.org> - -bradh352 (2 Mar 2022) -- Asterisks should be allowed in host validation as CNAMEs may reference wildcard domains - - CloudFlare appears to use this logic in CNAMEs as per - https://github.com/nodejs/node/issues/42171 - - Fixes: #457 - Fix By: Brad House (@bradh352) - -- Don't return on file lookup failure, set status - - When resolving a host via /etc/hosts, don't return with a predefined - error as there may be other tries. - - Fix By: Brad House (@bradh352) - -- 'localhost' special treatment enhancement - - Since localhost is special-cased, any errors should be ignored when - reading /etc/hosts as otherwise we could return an error if there - were for instance an invalidly formatted /etc/hosts or if /etc/hosts - had a permissions error while reading. - - This exact behavior appears to have been seen on OS/400 PASE - environments which allows AIX binares to run. - - Fix By: Brad House (@bradh352) - -- If chain building c-ares as part of another project, detect of res_servicename could fail (#451) - - If libresolv is already included with the build, c-ares wouldn't properly detect its use. - - May fix: #451 - Fix by: Brad House (@bradh352) - -- no analyze capability on ios - -- attempt to use scan-build on ios - -- disable tests on ios - -- fix switch statement - -- code coverage had gotten disabled - -- looks like shell expansion doesn't work with cirrus-ci, lets do it another way - -- attempt to autobuild for iOS - -GitHub (8 Dec 2021) -- [Brad House brought this change] - - Windows: rework/simplify initialization code, drop long EOL systems (#445) - - There was a lot of windows initialization code specific to the era that predates Windows Vista such as reading DNS configuration from the registry, and dynamically loading libraries to get access to functions that didn't exist in XP or earlier releases. - - Vista was released in January 2007, and was EOL'd in 2017, and support for Vista is still maintained with this patch set. - - XP was EOL'd in Apr 8 2014. - - I believe the last OS based on something earlier than Vista was POSReady 2009, as it was XP based for some reason, and that was EOL'd in January 2019. Considering any POS system falls under the PCI-DSS rules, they aren't allow to run POSReady 2009 any more so there is no reason to try to continue supporting such systems. - - We have also targeted with our build system Vista support for the last few years, and while developers could change the target, we haven't had any reports that they have. - -bradh352 (9 Nov 2021) -- Fix memory leak in reading /etc/hosts - - When an /etc/hosts lookup is performed, but fails with ENOTFOUND, and - a valid RFC6761 Section 6.3 fallback is performed, it could overwrite - variables that were already set and therefore leave the pointers - dangling, never to be cleaned up. - - Clean up explicitly on ENOTFOUND when returning from the file parser. - - Fixes: #439 - Fix By: Brad House (@bradh352) - -GitHub (2 Nov 2021) -- [Bobby Reynolds brought this change] - - Fix cross-compilation from Windows to Linux due to CPACK logic (#436) - - When determining value for CPACK_PACKAGE_ARCHITECTURE, prefer to use - value from CMAKE_SYSTEM_PROCESSOR before falling back to uname output. - - Additionally, if building from a Windows host, emit a fatal error - instead of attempting to call uname. - - Fix By: Bobby Reynolds (@reynoldsbd) - -bradh352 (1 Nov 2021) -- fix coveralls link - -- coveralls needs token - -- coveralls appears to require git - -- fix a couple of coveralls vars - -- more coveralls fixes - -- add code coverage libs to LDADD instead of _LIBS - -- make verbose - -- try to fix code coverage building - -- need -y for install - -- try to fix asan/ubsan/lsan when built with clang. try to support code coverage properly. - -- try another path - -- fix pip - -- attempt to enable some other build types that travis supported - -Version 1.18.1 (26 Oct 2021) - -bradh352 (26 Oct 2021) -- missed version - -- 1.18.1 release prep - -- ares_getaddrinfo() was returning the wrong size for ai_addrlen - - ai_addrlen was erroneously returning 16 bytes instead of the - sizeof(struct sockaddr_in6). This is a regression introduced - in 1.18.0. - - Reported by: James Brown <jbrown@easypost.com> - Fix By: Brad House (@bradh352) - -- Windows: autotools force linking to iphlpapi - -GitHub (26 Oct 2021) -- [Gregor Jasny brought this change] - - Fix typo detected by lintian (#434) - - typo in docs for ares_parse_uri_reply - - Fix By: Gregor Jasny (@gjasny) - -Version 1.18.0 (25 Oct 2021) - -bradh352 (25 Oct 2021) -- replace Travis badge with Cirrus-CI badge - -- c-ares 1.18.0 release prep - -GitHub (21 Oct 2021) -- [Jérôme Duval brought this change] - - Haiku: port (#431) - - Port for Haiku. Slight CMake changes, header changes, and resolv.conf/hosts paths specific to Haiku. - - Port By: Jérôme Duval (@korli) - -bradh352 (19 Oct 2021) -- valgrind: fix reported invalid read - -- make sure distcheck runs - -- detect oddities and skip test if necessary - -- fix null ptr deref in strlen - -- bend over backwards for testing file access, something is weird on debian - -- chmod(fn, 0) is failing on debian - -- maybe process needs to be called - -- split test output - -- clean up a couple of compiler warnings - -- use helper function for addrinfo to simplify code - -- INSTANTIATE_TEST_CASE_P -> INSTANTIATE_TEST_SUITE_P as new convention in googletest - -- gmock: update from 1.8.0 to 1.11.0 - -- Cirrus-CI: fix debian arm build - -- Cirrus-CI: more updates for proper testing - -- install proper packages for asan and analyze - -- fix crash in tests - -- try to disable container tests - -- need g++ for tests on debian - -- try cirrus-ci again - -- whitespace - -- start bringing up cirrus-ci - -- prep for adding new ci - -- fix cut and paste error - -GitHub (18 Oct 2021) -- [Brad House brought this change] - - RFC6761: special case "localhost" (#430) - - As per RFC6761 Section 6.3, "localhost" lookups need to be special cased to return loopback addresses, and not forward queries to recursive dns servers. - - We first look up via files (/etc/hosts or equivalent), and if that fails, we then attempt a system-specific address enumeration for loopback addresses (currently Windows-only), and finally fallback to ::1 and 127.0.0.1. - - Fix By: Brad House (@bradh352) - Fixes Bug: #399 - -- [Brad House brought this change] - - Reimplement ares_gethostbyname() by wrapping ares_getaddrinfo() (#428) - - ares_gethostbyname() and ares_getaddrinfo() do a lot of similar things, however ares_getaddrinfo() has some desirable behaviors that should be imported into ares_gethostbyname(). For one, it sorts the address lists for the most likely to succeed based on the current system routes. Next, when AF_UNSPEC is specified, it properly handles search lists instead of first searching all of AF_INET6 then AF_INET, since ares_gethostbyname() searches in parallel. Therefore, this PR should also resolve the issues attempted in #94. - - A few things this PR does: - - 1. ares_parse_a_reply() and ares_parse_aaaa_reply() had very similar code to translate struct ares_addrinfo into a struct hostent as well as into struct ares_addrttl/ares_addr6ttl this has been split out into helper functions of ares__addrinfo2hostent() and ares__addrinfo2addrttl() to prevent this duplicative code. - - 2. ares_getaddrinfo() was apparently never honoring HOSTALIASES, and this was discovered once ares_gethostbyname() was turned into a wrapper, the affected test cases started failing. - - 3. A slight API modification to save the query hostname into struct ares_addrinfo as the last element of name. Since this is the last element, and all user-level instances of struct ares_addrinfo are allocated internally by c-ares, this is not an ABI-breaking change nor would it impact any API compatibility. This was needed since struct hostent has an h_name element. - - 4. Test Framework: MockServer tests via TCP would fail if more than 1 request was received at a time which is common when ares_getaddrinfo() queries for both A and AAAA records simultaneously. Infact, this was a long standing issue in which the ares_getaddrinfo() test were bypassing TCP alltogether. This has been corrected, the message is now processed in a loop. - - 5. Some tests had to be updated for overall correctness as they were invalid but somehow passing prior to this change. - - Change By: Brad House (@bradh352) - -bradh352 (9 Oct 2021) -- ares_getaddrinfo() missing sanity check to fix #426 - -- ares_getaddrinfo(): continue to next domain in search if query returns ARES_ENODATA - - Some DNS servers may behave badly and return a valid response with no data, in this - case, continue on to the next search domain, but cache the result. - - Fixes Bug: #426 - Fix By: Brad House (@bradh352) - -- Allow '/' as a valid character for a returned name - - As of c-ares 1.17.2, a CNAME an in-addr.arpa delegation broke due - to not allowing '/'. This needs to be allowed to not break valid - functionality. - - Fixes Bug: #427 - Reported By: Adrian (@leftshift) - Fix By: Brad House (@bradh352) - -Daniel Stenberg (5 Oct 2021) -- libcares.pc.in: update the URL - -bradh352 (8 Sep 2021) -- ares_expand_name should allow underscores (_) as SRV records legitimately use them - - c-ares 1.17.2 introduced response validation to prevent a security issue, however - it did not have (_) listed as a valid character for domain name responses which - caused issues when a CNAME referenced a SRV record which contained underscores. - - While RFC2181 section 11 does explicitly state not to do validation, that applies - to servers not clients. - - Fixes: #424 - Fix By: Brad House (@bradh352) - -Daniel Stenberg (7 Sep 2021) -- domain: update to use c-ares.org - - Closes #423 - -- mailing list: moved to lists.haxx.se - -GitHub (3 Sep 2021) -- [Biswapriyo Nath brought this change] - - CMake: Fix build in cygwin (#422) - - As cygwin environment has both socket.h and winsock2.h headers check WIN32 not to include the later one here - - Fix By: Biswapriyo Nath (@Biswa96) - -bradh352 (23 Aug 2021) -- make building more verbose - -- add appveyor cmake/mingw static-only build - -GitHub (17 Aug 2021) -- [Sinan Kaya brought this change] - - CMake: lower case advapi32 for cross-building with mingw (#420) - - When cross compiling with yocto's meta-mingw layer, getting a dependency - error. - - This is caused by the fact that advapi32 is lower case in mingw builds. - - Fix By: Sinan Kaya <sinan.kaya@microsoft.com> - -bradh352 (17 Aug 2021) -- autotools: add ax_check_gnu_make.m4 - -- autotools: add ax_require_defined.m4 - -- autotools: dont use newer AC_CHECK_INCLUDES_DEFAULT, don't quote AC_ERROR_MSG - -- import more files needed by newer ax_code_coverage.m4 - -- import more files needed by newer ax_code_coverage.m4 - -- work around autoreconf -fiv first call returning 'error: too many loops' - -- restore zz40-xc-ovr.m4 - -- autotools: processed configure.ac through autoupdate - -- autotools. update ax_code_coverage.m4 to latest. don't use deprecated AC_HELP_STRING - -- pull out some old autotools cruft - -GitHub (17 Aug 2021) -- [Felix Yan brought this change] - - Provide ares_nameser.h as a public interface (#417) - - NodeJS needs ares_nameser.h as a pubic header. - - Fixes: #415 - Fix By: Felix Yan (@felixonmars) - -- [Felix Yan brought this change] - - Fix building when latest ax_code_coverage.m4 is imported (#418) - - ax_code_coverage.m4 dropped the @CODE_COVERAGE_RULES@ macro, so we need to switch to the latest recommendation from the m4 file. This requires updates to Makefile.am. - - Fix By: Felix Yan (@felixonmars) - -bradh352 (12 Aug 2021) -- bump version to match current release - -GitHub (12 Aug 2021) -- [dhrumilrana brought this change] - - z/OS minor update, add missing semicolon in ares_init.c (#414) - - Build fix for z/OS - - Fix by: Dhrumil Rana (@dhrumilrana) - -- [Daniel Bevenius brought this change] - - add build to .gitignore (#410) - - This commit adds the build directory to be ignored by git. - - The motivation for adding this to .gitignore as opposed to - .git/info/exclude is that the CMake example in INSTALL.md uses build - as the name of the directory to be used by CMake. This will cause - git to report build as an untracked file. - - Fix By: Daniel Bevenius (@danbev) - -- [Martin Holeš brought this change] - - Add support for URI(Uniform Resource Identifier) records. (#411) - - Add ares_parse_uri_reply() for parsing URI DNS replies. - - Fix By: Martin Holeš (@martin-256) - -Daniel Stenberg (10 Aug 2021) -- ares_getaddrinfo.3: available since 1.16.0 - -- README.md: use https:// links - -Version 1.17.2 (24 Jul 2021) - -bradh352 (24 Jul 2021) -- fix typo - -- prep for 1.17.2 release - -GitHub (30 Jun 2021) -- [jeanpierrecartal brought this change] - - Replace strdup() with ares_strdup() (#408) - - strdup() is used in src/lib/ares_parse_a_reply.c and src/lib/ares_parse_aaaa_reply.c whereas allocated memory is freed using ares_free(). - - Bug: 407 - Fix By: Jean-pierre Cartal (@jeanpierrecartal) - -- [Brad House brought this change] - - Validate hostnames in DNS responses and discard from malicious servers (#406) - - To prevent possible users having XSS issues due to intentionally malformed DNS replies, validate hostnames returned in responses and return EBADRESP if they are not valid. - - It is not clear what legitimate issues this may cause at this point. - - Bug Reported By: philipp.jeitner@sit.fraunhofer.de - Fix By: Brad House (@bradh352) - -bradh352 (11 Jun 2021) -- ares_expand_name(): fix formatting and handling of root name response - - Fixes issue introduced in prior commit with formatting and handling - of parsing a root name response which should not be escaped. - - Fix By: Brad House - -- ares_expand_name() should escape more characters - - RFC1035 5.1 specifies some reserved characters and escaping sequences - that are allowed to be specified. Expand the list of reserved characters - and also escape non-printable characters using the \DDD format as - specified in the RFC. - - Bug Reported By: philipp.jeitner@sit.fraunhofer.de - Fix By: Brad House (@bradh352) - -GitHub (15 Apr 2021) -- [HALX99 brought this change] - - Fix can't get dns server on macos and ios (#401) - - If DNS configuration didn't include search domains on MacOS (or iOS) it would throw an error instead of ignoring. - - Fix By: @halx99 - -- [catalinh-bd brought this change] - - Bugfix/crash in ares sortaddrinfo (#400) - - The bug was generated because there was no check for the number - of items in the list and invalid memory was accesed when the list - was empty. There is a check for null after calling malloc but on - some systems it always returns a valid address for size equals 0. - Relates To: #392, 0903dcecabca283d0fa771632892dc7592b7a66d - - Fix By: @catalinh-bd - -bradh352 (2 Mar 2021) -- Null deref if ares_getaddrinfo() is terminated with ares_destroy() - - ares_freeaddrinfo() was not checking for a Null ptr during cleanup of - an aborted query. - - Once that was resolved it uncovered another possible issue with - multiple simultaneous underlying queries being outstanding and - possibly prematurely cleaning up the handle. - - Reported By: Michael Kourlas - Fix By: Brad House (@bradh352) - -GitHub (18 Feb 2021) -- [Brad House brought this change] - - CMake: RANDOM_FILE not defined #397 - - RANDOM_FILE was never defined by cmake, causing RC4 key generation to use the less secure rand() method. - - Also, due to clashes with chain-building from other projects (e.g. curl) that may define RANDOM_FILE, this was renamed to CARES_RANDOM_FILE. - - This is the proposed change for #396 - - Fix By: Brad House (@bradh352) - -- [Anton Danielsson brought this change] - - CMake: fix Make install for iOS/MacOS (#395) - - INSTALL TARGETS were missing the BUNDLE DESTINATION - - Fix By: Anton Danielsson (@anton-danielsson) - -- [František Dvořák brought this change] - - Fix build with autotools out of source tree (#394) - - Add missing include directory, which fixes the build with autotools in separated build directory. - - Fix By: František Dvořák (@valtri) - -bradh352 (15 Jan 2021) -- fuzzing: HAVE_CONFIG_H may not be defined so cannot include ares_setup.h. Its not needed even though we include ares_nameser.h - -- remove redundant header checks - -- properly detect netinet/tcp.h on openbsd - -- more portability updates - -- renamed nameser.h to ares_nameser.h requires Makefile.inc update for distributed files - -- more portability updates - -- remove bad files - -- portability updates for test cases - -- Portability Updates for arpa/nameser.h (#388) - - There is too much inconsistency between platforms for arpa/nameser.h and arpa/nameser_compat.h for the way the current files are structured. Still load the respective system files but make our private nameser.h more forgiving. - - Fixes: #388 - Fix By: Brad House (@bradh352) - -- ares_parse_ptr_reply() handle NULL for addr/addr_len. Fixes #392 - - NodeJS passes NULL for addr and 0 for addrlen parameters to ares_parse_ptr_reply(). On systems where malloc(0) returned NULL, this would cause the function to return ARES_ENOMEM, but the cleanup wasn't handled properly and would crash. - - This patche fixes that bug, and also hardens ares_free_hostent() to not leak memory during cleanup. - - Fixes: #392 - Fix By: Brad House (@bradh352) - -- Define behavior of malloc(0) - - Some systems may return either NULL or a valid pointer on malloc(0). c-ares should never call malloc(0) so lets return NULL so we're more likely to find an issue if it were to occur. - -GitHub (24 Dec 2020) -- [dhrumilrana brought this change] - - z/OS: port (#390) - - Port c-ares to z/OS. - - Fix By: Dhrumil Rana (@dhrumilrana) - -- [vburdo brought this change] - - Use unbuffered stdio for /dev/urandom to read only requested data (#391) - - Buffered fread() reads 4096 bytes which is completely unnecessary and potentially may cause problems. - I discovered this on private linux configuration where custom /dev/urandom implementation has poor performance. - - Fix By: @vburdo - -- [Jay Freeman (saurik) brought this change] - - This relative header #include needs to use quotes. (#386) - - Fix By: Jay Freeman (@saurik) - -bradh352 (23 Nov 2020) -- Win32: Fix tools build with autotools static library - When c-ares is being built as static on Win32, CARES_STATICLIB must - be defined, but it wasn't being pulled in for the tools. - - Fixes: #384 - Fix By: Brad House (@bradh352) - -- Loosen requirements for static c-ares library when building tests - - It appears that when building tests, it would hardcode enabling building - of the c-ares static library. This was probably due to Windows limitations - in symbol visibility. - - This change will use the static library if it exists for tests, always. - Otherwise, it will only forcibly enable static libraries for tests on - Windows. - - Fixes: #380 - Fix By: Brad House (@bradh352) - -- Remove legacy comment about ahost/acountry/adig targets - -- Distribute fuzzinput/fuzznames for fuzz tests - - The fuzz test files were not being distributed. This doesn't appear to be - a regression, it looks like they have never been distributed. - - Fixes: #379 - Fix By: Brad House (@bradh352) - -Version 1.17.1 (19 Nov 2020) - -GitHub (19 Nov 2020) -- [Brad House brought this change] - - Travis: add iOS target built with CMake (#378) - - Issue #377 suggested that CMake builds for iOS with c-ares were broken. This PR adds an automatic Travis build for iOS CMake. - - Fix By: Brad House (@bradh352) - -bradh352 (18 Nov 2020) -- fix build - -GitHub (18 Nov 2020) -- [Fabrice Fontaine brought this change] - - External projects were using non-public header ares_dns.h, make public again (#376) - - It appears some outside projects were relying on macros in ares_dns.h, even though it doesn't appear that header was ever meant to be public. That said, we don't want to break external integrators so we should distribute this header again. - - Fix By: Fabrice Fontaine (@ffontaine) - -bradh352 (17 Nov 2020) -- note that so versioning has moved to configure.ac - -- note about 1.17.1 - -- fix sed gone wrong - -GitHub (17 Nov 2020) -- [Daniel Stenberg brought this change] - - autotools cleanup (#372) - - * remove: install-sh mkinstalldirs - - They're generated when needed, no need to store in it. - - * buildconf: remove custom logic with autoreconf - - Fix By: Daniel Stenberg (@bagder) - -bradh352 (17 Nov 2020) -- attempt to fix 1.17.0 release distribution issues - -Version 1.17.0 (16 Nov 2020) - -bradh352 (16 Nov 2020) -- 1.17.0 release prep - -- ares_getaddrinfo(): duplicate hints ai_socktype and ai_protocol into output - - ai_socktype and ai_protocol were ignored from the hints input. They are now - duplicated into the output as expected. Currently no sanity checks on - proper values are taking place. - - Fixes: #317 - Fix By: Brad House (@bradh352) - -- ares_parse_{a,aaaa}_reply could return larger *naddrttls than passed in - - If there are more ttls returned than the maximum provided by the requestor, then - the *naddrttls response would be larger than the actual number of elements in - the addrttls array. - - This bug could lead to invalid memory accesses in applications using c-ares. - - This behavior appeared to break with PR #257 - - Fixes: #371 - Reported By: Momtchil Momtchev (@mmomtchev) - Fix By: Brad House (@bradh352) - -GitHub (5 Nov 2020) -- [Dustin Lundquist brought this change] - - docs: ares_set_local_ip4() uses host byte order (#368) - - Properly document brain-dead behavior of ares_set_local_ip4() using host byte order instead of expected network byte order. - - Fix By: Dustin Lundquist <d.lundquist@tempered.io> - -- [Łukasz Marszał brought this change] - - empty hquery->name could lead to invalid memory access (#367) - - If hquery->name is empty (=="\0"), &hquery->name[strlen(hquery->name)-1] would point to "random" place in memory. This is causing some of my address sanitizer tests to fail. - - Fix By: Łukasz Marszał (@lmarszal) - -bradh352 (28 Sep 2020) -- Fix OSSFuzz reported issue in CAA reply parsing - - OSS-Fuzz is reporting a use-of-uninitialized-value: - https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26012 - - Reported By: David Drysdale (@daviddrysdale) - -GitHub (26 Sep 2020) -- [David Hotham brought this change] - - fuzz CAA parsing (#363) - - Add fuzz support for CAA parsing - - Fix By: David Hotham (@dimbleby) - -- [Daniela Sonnenschein brought this change] - - Allow parsing of CAA Resource Record (#360) - - CAA (Certification Authority Authorization) was introduced in RFC 6844. - This has been obsoleted by RFC 8659. This commit added the possibility - to query CAA resource records with adig and adds a parser for CAA - records, that can be used in conjunction with ares_query(3). - - Closes Bug: #292 - Fix By: Daniela Sonnenschein (@lxdicted) - -Daniel Stenberg (17 Sep 2020) -- docs: remove the html and pdf make targets - - They're rarely used in our daily work flow and mostly just add friction, - - Closes #362 - -bradh352 (14 Sep 2020) -- ares_process needs to always include nameser.h as it has compat - -- Define T_OPT if system doesn't provide it - -GitHub (12 Sep 2020) -- [Gisle Vanem brought this change] - - Change the mailman links (#358) - - Links when wrapping become misleading. Insert newline to prevent wrapping. - - Fix By: Gisle Vanem (@gvanem) - -- [Gisle Vanem brought this change] - - [adig] Update man-page for the '-x' option (#357) - - Fix By: Gisle Vanem (@gvanem) - -- [Gisle Vanem brought this change] - - [adig] add '-x' option. (#356) - - Added a 'dig-style' '-x' option. Also support '-xx' for a - IPv6 bit-string PTR query. - - Fix By: Gisle Vanem (@gvanem) - -bradh352 (12 Sep 2020) -- fix indentation - -- ns_t_opt -> T_OPT - -GitHub (12 Sep 2020) -- [Gisle Vanem brought this change] - - Fixes for Watt-32 on djgpp + Windows (#355) - - No longer any relation to libcurl since '<libcurl-root>/packages/DOS/common.dj' is dropped. - This Makefile.dj has been tested on Win-10 only (using the Windows hosted djgpp cross compiler). - - Fix By: Gisle Vanem (@gvanem) - -- [Gisle Vanem brought this change] - - Fixes for Watt-32 on Windows and MSDOS (#354) - - Move the prototype to 'ares_private.h'. - - Fix By: Gisle Vanem (@gvanem) - -bradh352 (11 Sep 2020) -- update path for include - -- remove stale information - -- remove stale information - -Brad House (9 Sep 2020) -- silence compiler warnings - -- Remove stale msvc files from makefile - -GitHub (9 Sep 2020) -- [Brad House brought this change] - - Reorganize source tree (#349) - - Originally started by Daniel Stenberg (@bagder) with #123, this patch reorganizes the c-ares source tree to have a more modern layout. It also fixes out of tree builds for autotools, and automatically builds the tests if tests are enabled. All tests are passing which tests each of the supported build systems (autotools, cmake, nmake, mingw gmake). There may be some edge cases that will have to be caught later on for things I'm not aware of. - - Fix By: Brad House (@bradh352) - -Brad House (1 Sep 2020) -- remove CURLDEBUG as per #82 - -GitHub (1 Sep 2020) -- [Erik Lax brought this change] - - Detect remote DNS server does not support EDNS as per RFC 6891 (#244) - - EDNS retry should be based on FORMERR returned without an OPT RR record as per https://tools.ietf.org/html/rfc6891#section-7 rather than just treating any unexpected error condition as a reason to disable EDNS on the channel. - - Fix By: Erik Lax (@eriklax) - -Brad House (27 Aug 2020) -- Fix for #345, don't use 'true' use 1 - -GitHub (27 Aug 2020) -- [Seraphime Kirkovski brought this change] - - ares_gethostbyname: Fix AF_UNSPEC support when using an ip address (#204) - - fake_hostent() was not supporting AF_UNSPEC, so when an ip address was specified when using AF_UNSPEC it would attempt to do a DNS lookup rather than returning a fake hostent using the ip address. - - Fix By: Seraphime Kirkovski (@Seraphime) - -- [apenn-msft brought this change] - - Tests should use dynamic system-assigned ports rather than static port (#346) - - The c-ares test suite was hardcoded to use port 5300 (and possibly 5301, 5302) for the test suite. Especially in containers, there may be no guarantee these ports are available and cause tests to fail when they could otherwise succeed. Instead, request the system to assign a port to use dynamically. This is now the default. To override, the test suite still takes the "-p <port>" option as it always has and will honor that. - - Fix By: Anthony Penniston (@apenn-msft) - -Brad House (25 Aug 2020) -- Unset members of the addr struct contain garbage values (#343) - - When generating the ares_sockaddr data by getaddrinfo() it was only filling - in certain members while leaving others uninitialized. This left garbage - data if a user tried to use the unset values. memset() the ares_sockaddr - to 0 prior to filling in the values to prevent this. - - Reported By: @SmorkalovG - Fix By: Brad House (@bradh352) - -GitHub (24 Aug 2020) -- [Jonathan Maye-Hobbs brought this change] - - FQDN with trailing period should be queried first with larger ndot value (#345) - - If a query is performed for dynamodb.us-east-1.amazonaws.com. with ndots=5, it was attempting to search the search domains rather than just attempting the FQDN that was passed it. This patch now at least attempts the FQDN first. - - We may need to determine if we should abort any further searching, however as is probably intended. - - Fix by: Jonathan Maye-Hobbs (@wheelpharoah) - -- [Gisle Vanem brought this change] - - Update acountry.c country code list (#341) - - Updated country_list[]: - * 2-letter ISO-3166 country-codes. - * Add, rename some names + codes in accordance with latest table at https://en.wikipedia.org/wiki/ISO_3166-1. - - Fix By: Gisle Vanem (@gvanem) - -- [Bulat Gaifullin brought this change] - - Test case should honor flag HAVE_WRITEV rather than WIN32 (#344) - - Test cases where not honoring the HAVE_WRITEV flag but instead using WIN32 to determine if WRITEV was available or not. This patch fixes that. - - Fix By: Bulat Gaifullin (@bgaifullin) - -Brad House (18 Jul 2020) -- Ensure c89 support - - A couple of for loops in Mac-specific code were using integer declarations - inside a for loop. Move the declaration to the top of the preceding - code block to retain c89 compliance. - - Reported By: Jeffrey Walton - -GitHub (2 Jul 2020) -- [Fionn Fitzmaurice brought this change] - - Avoid buffer overflow in RC4 loop comparison (#336) - - The rc4 function iterates over a buffer of size buffer_len who's maximum - value is INT_MAX with a counter of type short that is not guaranteed to - have maximum size INT_MAX. - - In circumstances where short is narrower than int and where buffer_len - is larger than the maximum value of a short, it may be possible to loop - infinitely as counter will overflow and never be greater than or equal - to buffer_len. - - The solution is to make the comparison be between types of equal width. - This commit defines counter as an int. - - Fix By: Fionn Fitzmaurice (@fionn) - -- [anonymoushelpishere brought this change] - - Updated help information for adig, acountry, and ahost. (#334) - - Provide more descriptive help information for various utilities. - - Fix By: @anonymoushelpishere - -- [lutianxiong brought this change] - - avoid read-heap-buffer-overflow (#332) - - Fix invalid read in ares_parse_soa_reply.c found during fuzzing - - Fixes Bug: #333 - Fix By: lutianxiong (@ltx2018) - -- [Ivan Baidakou brought this change] - - Fix: sizeof(sizeof(addr.saX)) -> sizeof(addr.saX) in readaddrinfo (#331) - - Looks like a sed-gone-wrong, a sizeof inside of a sizeof. - - Fix By: Ivan Baidakou (@basiliscos) - -Version 1.16.1 (11 May 2020) - -Brad House (11 May 2020) -- c-ares 1.16.1 release prep - -- update travis to use xcode11.4 - -- Prevent possible double-free in ares_getaddrinfo() if ares_destroy() is called - - In the event that ares_destroy() is called prior to ares_getaddrinfo() completing, - it would result in an invalid read and double-free due to calling end_hquery() twice. - - Reported By: Jann Horn @ Google Project Zero - -GitHub (30 Apr 2020) -- [shelley vohr brought this change] - - fix: windows UNICODE incompatibilities with ares_getaddrinfo (#328) - - Fixes the following compatibility issues: - * Use RegQueryValueExA instead of RegQueryValueEx - * Use ExpandEnvironmentStringsA instead of ExpandEnvironmentStrings - * Use RegOpenKeyExA instead of RegOpenKeyExA - * Use GetWindowsDirectoryA instead of GetWindowsDirectoryA - - Fix By: Shelley Vohr (@codebytere) - Closes: #327 - -Brad House (13 Apr 2020) -- travis: CloudFlare does not allow T_ANY requests, so live tests that use it fail. Disable. - -- travis: bump macos image to the latest - -- cast-align warnings are false for struct sockaddr, silence - - Create a macro to silence false cast-align warnings when casting - struct sockaddr * to struct sockaddr_in * and struct sockaddr_in6 *. - - Fix By: Brad House (@bradh352) - -- MacOS: Enable libresolv support for retrieving DNS servers like iOS does. - -GitHub (10 Apr 2020) -- [Dmitry Igrishin brought this change] - - CMake: Populate the INCLUDE_DIRECTORIES property of installed targets (#323) - - Populate the INCLUDE_DIRECTORIES property of installed targets - - Fix By: Dmitry Igrishin (@dmitigr) - -Brad House (10 Apr 2020) -- travis: make valgrind use cmake for tests - -- dont try to use libtool to run valgrind - -- valgrind requires libtool installed to wrap tests - -- scan build 7 - -- fix travis live test - -- add debug for travis - -- try without sudo - -- attempt to modernize travis build environment - -GitHub (6 Apr 2020) -- [Teemu R brought this change] - - Allow TXT records on CHAOS qclass (#321) - - Some DNS servers intentionally "misuse" the obsoleted CHAOS (CH) qclass to provide things like `version.bind`, `version.server`, `authors.bind`, `hostname.bind` and `id.server`. - - C-ares was not allowing such use cases. - - Fix By: Teemu R. (@rytilahti) - -Brad House (5 Apr 2020) -- Remove warnings from ares_getaddrinfo.3 man page - - As reported in #319, non-standard macros of .IN were used. - Replace with .RS/.RE. - - Fixes: #319 - Fix By: Brad House (@bradh352) - -- ares_getaddrinfo man page render better for man2html - -- update man pages to render better for man2html - -Version 1.16.0 (12 Mar 2020) - -Brad House (12 Mar 2020) -- 1.16.0 release notes draft - -- attempt to fix double-free introduced in e0517f9 - -GitHub (12 Mar 2020) -- [David Drysdale brought this change] - - test: fuzzer input triggering double free (#315) - - OSS-Fuzz has reported a double-free with the fuzzer input file - included here; run with: - ./test/aresfuzz test/fuzzinput/clusterfuzz-5637790584012800 - - Bisecting the failure points to commit e0517f97d988 ("Parse SOA records - from ns_t_any response (#103)") - -- [Brad House brought this change] - - CMake: Install Manpages (#314) - - CMake wasn't installing manpages. - - Fixes #297 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - Enable cmake tests for AppVeyor (#313) - - Tests require linking against the static library on Windows otherwise the symbols are not exported for internals being tested. - - Fix By: Brad House (@bradh352) - -Brad House (11 Mar 2020) -- Add AppVeyor badge - -- bump c-ares version to 1.16.0. test AppVeyor integration. - -GitHub (11 Mar 2020) -- [Brad House brought this change] - - replace all usages of inet_addr() with ares_inet_pton() which is more proper (#312) - - Replace usage of inet_addr() with ares_inet_pton() which is more appropriate and fixes issues with legitimate addresses like 255.255.255.0. IPv6 already used this. - - Fixes #309 - Fix By: Brad House (@bradh352) - -- [Brad House brought this change] - - CMake: Generate WinPDB files during build (#311) - - Build and Install PDB (Windows Debug Symbol) files if supported by underlying system. - - Also update AppVeyor to test cmake builds. - - Fixes #245 - Fix By: Piotr Pietraszkiewicz (@ppietrasa) and Brad House (@bradh352) - -- [Brad House brought this change] - - CMake: Rework library function checking (#310) - - CHECK_LIBRARY_EXISTS(), while it takes a function name, does not actually verify the function exists in the library being evaluated. Instead, if the function is found in any dependent library, and the referenced library also exists, it returns true. This is not desirable. - - Wrap with a Macro to change the behavior. - - Fixes: #307 - Fix By: Brad House (@bradh352) - -- [Dron Rathore brought this change] - - Parse SOA records from ns_t_any response (#103) - - Added the capability of parsing SOA record from a response buffer of ns_t_any type query, this implementation doesn't interfere with existing T_SOA query's response as that too is treated as a list of records. The function returns ARES_EBADRESP if no SOA record is found(as per RFC). - - The basic idea of sticking to RFC that a ns_t_any too should return an SOA record is something open for discussion but I have kept the functionality intact as it was previously i.e the function returns ARES_EBADRESP if it doesn't find a SOA record regardless of which response it is parsing i.e. T_SOA or T_ANY. - - Note that asking for T_ANY is generally a bad idea: - - https://blog.cloudflare.com/what-happened-next-the-deprecation-of-any/ - - https://tools.ietf.org/html/draft-ietf-dnsop-refuse-any - - Bug: #102 - Fix By: Dron Rathore (@DronRathore) - -- [Stephen Bryant brought this change] - - Added CPack functionality for generating RPM or DEB packages (#283) - - Added CPack functionality for generating RPM or DEB packages - - ie: run `cpack -G RPM` (or "DEB") after building with CMake. - - The current configuration creates 3 separate packages for the shared library, - the development files and the tools. - - Fix By: Stephen Bryant (@bf-bryants) - -- [tjwalton brought this change] - - ares_gethostbyname: Return ENODATA if no valid A or AAAA record found (#304) - - ares_gethostbyname() was returning ESUCCESS when no A or AAAA record was found but a CNAME pointing nowhere was present. ENODATA should be returned instead, however the hosts pointer will still be present to provide the alias list. - - * Return ENODATA if no valid A or AAAA record found - * Fix and update test ParseAReplyNoData. - * Add test for new ENODATA behaviour in ares_gethostbyname. - - Fixes Bug #303 - Fix By: @tjwalton - -- [Michal Rostecki brought this change] - - test: Separate live tests from SetServers* tests (#299) - - Before this change, SetServers, SetServersPorts and SetServersCSV - contained test cases trying to make DNS queries with the google.com - hostname, which requires Internet connectivity. Tests with that - requirement should be defined in the ares-test-live.cc file and contain - "Live" prefix to filter them out with `--gtest_filter=-*.Live*` on - machines without Internet connectivity. - - Fix By: Michal Rostecki (@mrostecki) - -- [Adam Majer brought this change] - - Only count valid addresses when response parsing (#302) - - When ares_parse_a_reply or ares_parse_aaaa_reply is called in case - where another AAAA and A responses exist, the resulting ares_addrttl - count is invalid and the structure points to gibberish. - - This is a regression since 1.15. - - Issue: https://github.com/c-ares/c-ares/issues/300 - Fix By: Adam Majer (@AdamMajer) - -Brad House (24 Dec 2019) -- [Kyle Edwards brought this change] - - CMake: Provide c-ares version in package export file (#296) - - The CMake package export file should provide version information. - - Fix By: Kyle Edwards (@KyleFromKitware) - -- [Ben Noordhuis brought this change] - - Accept invalid /etc/resolv.conf lookup values, ability to build container tests (#274) - - * Add CARES_BUILD_CONTAINER_TESTS CMake option to add ability to build the Linux-only containerized tests. - * Accept invalid /etc/resolv.conf lookup values - - Before this commit invalid `lookup` values resulted in c-ares not using - any lookups without any clear indication why. After this commit it uses - the default "fb". - - Fix By: Ben Noordhuis (@bnoordhuis) - -- [Christian Ammer brought this change] - - Parallel A and AAAA lookups in `ares_getaddrinfo` (#290) - - A and AAAA lookups for ares_getaddrinfo() are now performed in parallel. - - For this change `ares_search` was removed from `ares_getaddrinfo`. - Instead `ares_query` in combination with `next_dns_lookup` are - doing the suffix search. - - Adding support for `.onion` addresses which are tested by - `TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain)` - - Fix By: Christian Ammer (@ChristianAmmer) - -- [Vy Nguyen brought this change] - - Move variables into the block where it is used to avoid unused-vars (#281) - - Warning uncovered with [-Werror, -Wunused-variables] - - Fix By: Vy Nguyen (@oontvoo) - -- [Vy Nguyen brought this change] - - Rename local macros to avoid conflicting with system ones and remove unsed variables. (Otherwise code will break once compiled with [-Werror,-Wmacro-redefined,-Wunused-variable] ) (#280) - - Fix new getaddrinfo code to not redefine macros on some systems. - - Fix By: Vy Nguyen (@oontvoo) - -- [Egor Pugin brought this change] - - [ares_getenv] Return NULL in all cases. (#279) - - if ares_getenv is defined, it must return a value on all platforms. - - Fix By: Egor Pugin (@egorpugin) - -- [Abhishek Arya brought this change] - - Add OSS-Fuzz fuzzing badge (#278) - - Adds based on instructions at - https://google.github.io/oss-fuzz/getting-started/new-project-guide/#status-badge - - Patch By: Abhishek Arya (@inferno-chromium) - -- [Peter Eisentraut brought this change] - - ares_init_options.3: Fix layout (#275) - - 7e6af8e inserted the documentation of resolvconf_path in the middle of - the item for ednspsz, leading to broken layout. Fix that. - - Fix By: Peter Eisentraut (@petere) - -- [Gregor Jasny brought this change] - - manpages: Fix typos detected by lintian (#269) - - - Fix By: Gregor Jasny (@gjasny) - -- [lifenjoiner brought this change] - - keep command line usage up to date (#256) - - adig and ahost built-in help did not match args taken. - - Fix-By: @lifenjoiner - -- [Dan Noé brought this change] - - ares-test.cc: Handle nullptr in AddrInfo ostream. (#268) - - The const AddrInfo& argument to operator<< overload for AddrInfo can be - a nullptr unique_ptr. Handle this explicitly by printing {nullptr} if - the rest of the function cannot be safely executed. - - Fix-by: Dan Noé <dpn@google.com> - -- [Dan Noé brought this change] - - Add missing limits.h include from ares_getaddrinfo.c (#267) - - This files references INT_MAX, but does not include limits.h. This can - cause a build failure on some platforms. Include limits.h if we have it. - - Fix-by: Dan Noé <dpn@google.com> - -- [Andrew Selivanov brought this change] - - fix fuzzer docs and add missing getaddrinfo docs (#265) - - There is a fix for a bit outdated clang fuzzer docs and ares_getaddrinfo docs. - - Fix By: Andrew Selivanov (@ki11roy) - -- [Andrew Selivanov brought this change] - - Fix leak and crash in ares_parse_a/aaaa_reply (#264) - - * fix leak if naddress of particular type found - * fix segfault when wanted ttls count lesser than count of result records - * add fuzzer input files that trigger problems (from #263) - - Reported-By: David Drysdale (@daviddrysdale) - Fix-By: Andrew Selivanov (@ki11roy) - -- [Andrew Selivanov brought this change] - - fix segfault when parsing wrong type of record (#262) - - Fixes segfault when trying to ares_parse_aaaa with AF_INET and vise versa. - - Fix By: Andrew Selivanov (@ki11roy) - -- work around mingw compile failure - -- c++ requires explicit casts - -- support EnvValue on Windows by implementing setenv/unsetenv - -- [Andrew Selivanov brought this change] - - getaddrinfo enhancements (#257) - - * Service support has been added to getaddrinfo. - * ares_parse_a/aaaa_record now share code with the addrinfo parser. - * Private ares_addrinfo structure with useful extensions such as ttls (including cname ttls), - as well as the ability to list multiple cnames in chain of lookups - - Work By: Andrew Selivanov @ki11roy - -- [Andrew Selivanov brought this change] - - fix ares__sortaddrinfo, use wrappers for sock_funcs (#258) - - Some socket functions weren't exposed for use by other areas of the library. Expose - those and make use of them in ares__sortaddrinfo(). - - Fix By: Andrew Selivanov (@ki11roy) - -- Fix c89 compilation support broken by .onion rejection changes - - Move .onion check lower after all variables have been declared. - - Bug: #246 - -- [kedixa brought this change] - - getaddrinfo: callback must be called on bad domain (#249) - - Due to an order of incrementing the remaining queries and calling ares_query, on a bad domain - the registered callback wouldn't be called. - - Bug: #248 - Fixed-By: @kedixa - -- [Darrin W. Cullop brought this change] - - Windows ARM/ARM64 requires AdvApi32 (#252) - - Fix link issues caused by missing library that appears to only be required on ARM (though - docs don't list this restriction). Doesn't hurt to require it everywhere. - - Bug: #251 - Fixed-By: Darrin Cullop (@dwcullop) - -- [kedixa brought this change] - - getaddrinfo: avoid infinite loop in case of NXDOMAIN(#240) (#242) - - There are two possible causes for infinite loops fo NXDOMAIN, based on how many dots are in the domain name (one for < ARES_OPT_NDOTS and one for >= ARES_OPT_NDOTS), where it will repeat the same query over and over as the hquery->next_domain doesn't increment. - - Fix By: @kedixa - -- Portability fix for ares__sortaddrinfo() - - replace uint32_t with unsigned int and socklen_t with ares_socklen_t - - By: Brad House - -- [Khaidi Chu brought this change] - - fix: init bufp before reject .onion to make it can be free correctly (#241) - - When querying a .onion domain, it returns directly without setting bufp to NULL. A subsequent free() that occurs can cause a segmentation fault. - - Fix By: Khaidi Chu (@XadillaX) - -- [Andrew Selivanov brought this change] - - Add ares__sortaddrinfo() to support getaddrinfo() sorted results (#239) - - This is a port of RFC 6724 compliant sorting function from Android Bionic project: - https://android.googlesource.com/platform/bionic/+/e919b116d35aa7deb24ddece69c491e24c3b0d6f/libc/netbsd/net/getaddrinfo.c - - The latest version is essentially the same, except two additional parameters to test connection with (mark/uid): - https://android.googlesource.com/platform/bionic/+/master/libc/dns/net/getaddrinfo.c - - Please note that even that version has some restrictions. It doesn't support some rules from RFC 6724: - - Rule 3 (Avoid deprecated addresses) - Rule 4 (Prefer home addresses) - Rule 7 (Prefer native transport) - - Submitted By: Andrew Selivanov (@ki11roy) - -- [Christian Ammer brought this change] - - Increase portability of `ares-test-mock-ai.cc` (#235) - - * using portable ares_inet_pton and updated includes in ares-test-mock-ai - * forgot to remove deleted ares-test-ai.cc in Makefile.inc - - Fix By: Christian Ammer (@ChristianAmmer) - -- [Fabrice Fontaine brought this change] - - m4/xc-cc-check.m4: use XC_CHECK_BUILD_FLAGS (#236) - - Use XC_CHECK_BUILD_FLAGS instead of XC_CHECK_USER_FLAGS. - Otherwise it complains of CPPFLAGS in CFLAGS. - [Retrieved from: - https://git.buildroot.net/buildroot/tree/package/c-ares/0001-use_check_build_instead_of_check_user.patch] - - Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar> - Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> - Submitted by: Fabrice Fontaine - -- [Christian Ammer brought this change] - - Bugfix for `ares_getaddrinfo` and additional unit tests (#234) - - This PullRequest fixes a bug in the function add_to_addrinfo which task is to add new addrinfo items to the ai_next linked list. Also additional unit tests for testing ares_getaddrinfo will be added: - - Additional mock server test classes (ares-test-mock-ai.cc): - MockTCPChannelTestAI - MockExtraOptsTestAI - MockNoCheckRespChannelTestAI - MockEDNSChannelTestAI - RotateMultiMockTestAI - NoRotateMultiMockTestAI - - Additional live tests (ares-test-live-ai.cc): - LiveGetHostByNameV4 - LiveGetHostByNameV6 - LiveGetHostByNameV4AndV6 - - Fix By: Christian Ammer (@ChristianAmmer) - -- [Christian Ammer brought this change] - - Remaining queries counter fix, additional unit tests for `ares_getaddrinfo` (#233) - - Remaining queries counter fix, added tests (ParallelLookups, - SearchDomains, SearchDomainsServFailOnAAAA). Removed unnecessary - if and commented code in test. - - Fix By: Christian Ammer (@ChristianAmmer) - -- [Christian Ammer brought this change] - - Add initial implementation for ares_getaddrinfo (#112) - - Initial implementation for ares_getaddrinfo(). It is NOT compliant with RFC6724, though - it is expected to come closer to conformance prior to the next release. - - Features not supported include sorted addresses and honoring of service and hints - parameters. - - Implementation by: Christian Ammer (@ChristianAmmer) - -- [Ben Noordhuis brought this change] - - test: fix bad expectation in ipv6 localhost test (#227) - - The LiveGetLocalhostByAddrV6 test expected to see "localhost" in the - result when doing an address-to-name lookup for ::1 but on my system - that resolves to "ip6-loopback" because of this stanza in /etc/hosts: - - $ grep ^::1 /etc/hosts - ::1 ip6-localhost ip6-loopback - - Fix By: Ben Noordhuis (@bnoordhuis) - Bug: #85 - -- [Ben Noordhuis brought this change] - - ares_version.h: bump version (#230) - - Version change not committed from maketgz.sh - - Bug: #229 - -Daniel Stenberg (24 Oct 2018) -- ares_library_init_android.3: minor syntax edits, fixed AVAILABILITY - -Version 1.15.0 (23 Oct 2018) - -Brad House (23 Oct 2018) -- last minute 1.15.0 addition - -- [Ben Noordhuis brought this change] - - Report ARES_ENOTFOUND for .onion domain names as per RFC7686. (#228) - - Quoting RFC 7686: - - Name Resolution APIs and Libraries (...) MUST either respond - to requests for .onion names by resolving them according to - [tor-rendezvous] or by responding with NXDOMAIN. - - A legacy client may inadvertently attempt to resolve a .onion - name through the DNS. This causes a disclosure that the client - is attempting to use Tor to reach a specific service. Malicious - resolvers could be engineered to capture and record such leaks, - which might have very adverse consequences for the well-being - of the user. - - Bug: #196 - Fix By: Ben Noordhuis @bnoordhuis - -- prepare for c-ares 1.15.0 release - -- AIX Build Fix - - AIX attempts to include both nameser_compat.h and onameser_compat.h. It appears - the proper fix is to define _USE_IRS so that only nameser_compat.h is used. - - Bug: #224 - Fix By: Brad House (@bradh352) - -- Fix crash in ares_dup() due to new ARES_OPT_RESOLVCONF - - ares_dup() calls ares_init_options() by making its own fake option - mask since the original mask isn't stored but ARES_OPT_RESOLVCONF - was always set, instead of conditionally set. This caused a crash - because ares_strdup() isn't NULL-safe if no custom path was set. - - Made ares_dup() set ARES_OPT_RESOLVCONF conditionally. - - Fix By: Brad House (@bradh352) - -- [Sarat Addepalli brought this change] - - Add ares_init_options() configurability for path to resolv.conf file - - Add resolvconf_path to end of struct ares_options with ARES_OPT_RESOLVCONF option - so on Unix-like systems a custom path can be specified. If no path is specified, - /etc/resolv.conf is used like normal. - - Fix By: Sarat Addepalli @SirR4T - Fixes Bug: #220 - Review By: Brad House @bradh352 - -- remove stale variables - -- fix prototype name for ares_strsplit_free() - -- add missing prototype - -- simplify ares_strsplit() and create ares_strsplit_free() helper function - -- missing ares_strsplit.h from HHEADERS for inclusion in distribution - -- [Ruslan Baratov brought this change] - - Add CARES_BUILD_TOOLS CMake option (#214) - - Add ability to exclude building of tools (adig, ahost, acountry) in CMake. This should also close #200. - - Fix By: Ruslan Baratov (@ruslo) - Bug: #200 - -- [flyingdutchman23 brought this change] - - Style. Whitespace cleanup. (#213) - - Small whitespace cleanups. - - Fix By: @flyingdutchman23 - -- [John Schember brought this change] - - Android: Support for domain search suffix (#211) - - Fixes issue #207. Uses LinkProperties.getDomains() to get a list of search domains and adds them to the suffix list. This also adds a new helper function to split strings into an array based on multiple delimiters replacing multiple other functions for dealing with string splitting. - - Submitter: John Schember (@user-none) - Fixes: #207 - Approved-by: Brad House (@bradh352) - -- [afalin brought this change] - - Improve DNS suffixes extracting from WinNT registry (#202) - - Join all global and connection specific suffix lists. Use 'HKLM\Software\Policies\Microsoft\Windows NT\DNSClient\SearchList', 'HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Domain' as global suffix lists. - - Fix By: @afalin - -- Be consistent with indention in CMakeLists.txt - - The imported TRANSFORM_MAKEFILE_INC function from curl used space indention - but the rest of the file used tabs. Go ahead and make it tabs for - consistency as well. - - Committed By: Brad House - -- [flyingdutchman23 brought this change] - - Fix modern gcc warning: argument to 'sizeof' in 'strncpy' call is the same expression as the source - - Silence warning about using src to determine number of bytes to copy. - In this case it doesn't matter whether it is `src` or `dest`. So there - is no functionality change. - - Bug: #210 - Fix By: @flyingdutchman23 - -- [Andi Schnebinger brought this change] - - fix stringop-overflow warning of GCC (#201) - - When using a modern GCC to compile c-ares, there is a stringop-overflow warning. - This patch simply silences the false-positive warning, there is no actual code flaw. - - Bug: https://github.com/c-ares/c-ares/pull/201 - Fixed By: Andi Schnebinger @Iniesta8 - -GitHub (18 May 2018) -- [David Drysdale brought this change] - - travis: do coverage in "coverage" build (#195) - - Fixes #194, a mistake from commit a255081f2c3c ("travis: Only do - coverage/distcheck on normal build") - -Brad House (17 May 2018) -- [Brad Spencer brought this change] - - Apply the IPv6 server blacklist to all nameserver sources, not just Windows (#193) - - For #164, I mentioned that it seemed like the IPv6 nameserver blacklist should apply to all OSes. In a mailing list post, @bradh352 agreed and suggested that I file a PR to make it so. - - This moves the blacklist check from being Windows-specific to being a general feature of config_nameservers(), no matter the nameserver source. It also simplifies the ares_ipv6_server_blacklisted() implementation to not parse and re-parse the blacklisted IPv6 addresses from strings on every check. I think they're almost as easy to read as a sequence of hex bytes in an array initializer, and it's definitely less work on each trip through the code. - - Fix By: Brad Spencer @b-spencer - PR: https://github.com/c-ares/c-ares/pull/193 - -- [Brad Spencer brought this change] - - Fix warnings emitted by MSVC when using -W4 (#192) - - These changes fix a few warnings emitted by recent versions of MSVC when compiling with -W4. Half of the changes are in Windows-specific code, and the other half should be safe no matter the compiler or OS. - - The allocation function change is probably the only one that needs explanation. MSVC gives warnings about the function pointers not being stable across DLL boundaries or something to that effect, so for Windows, I've made them be called indirectly, which at least made the compiler happy. I can't say I've tested every linking combination on Windows with them before or after the change, but it seems harmless. - - Fix By: Brad Spencer @b-spencer - PR: https://github.com/c-ares/c-ares/pull/192 - -- [David Hotham brought this change] - - Prevent changing name servers while queries are outstanding (#191) - - Changing name servers doesn't work, per #41. Better to return an error code than to crash. - - Fix-by: David Hotham @dimbleby - -David Drysdale (15 May 2018) -- [Tobias Nießen brought this change] - - Fix comment in ares_rules.h (#189) - -Brad House (6 May 2018) -- [Brad Spencer brought this change] - - Harden and rationalize c-ares timeout computation (#187) - - * Harden and rationalize c-ares timeout computation - * Remove the rand() part of the timeout calculation completely. - - When c-ares sends a DNS query, it computes the timeout for that request as follows: - - timeplus = channel->timeout << (query->try_count / channel->nservers); - timeplus = (timeplus * (9 + (rand () & 7))) / 16; - I see two issues with this code. Firstly, when either try_count or channel->timeout are large enough, this can end up as an illegal shift. - - Secondly, the algorithm for adding the random timeout (added in 2009) is surprising. The original commit that introduced this algorithm says it was done to avoid a "packet storm". But, the algorithm appears to only reduce the timeout by an amount proportional to the scaled timeout's magnitude. It isn't clear to me that, for example, cutting a 30 second timeout almost in half to roughly 17 seconds is appropriate. Even with the default timeout of 5000 ms, this algorithm computes values between 2812 ms and 5000 ms, which is enough to cause a slightly latent DNS response to get spuriously dropped. - - If preventing the timers from all expiring at the same time really is desirable, then it seems better to extend the timeout by a small factor so that the application gets at least the timeout it asked for, and maybe a little more. In my experience, this is common practice for timeouts: applications expect that a timeout will happen at or after the designated time (but not before), allowing for delay in detecting and reporting the timeout. Furthermore, it seems like the timeout shouldn't be extended by very much (we don't want a 30 second timeout changing into a 45 second timeout, either). - - Consider also the documentation of channel->timeout in ares_init_options(): - - The number of milliseconds each name server is given to respond to a query on the first try. (After the first try, the timeout algorithm becomes more complicated, but scales linearly with the value of timeout.) The default is five seconds. - - In the current implementation, even the first try does not use the value that the user supplies; it will use anywhere between 56% and 100% of that value. - - The attached patch attempts to address all of these concerns without trying to make the algorithm much more sophisticated. After performing a safe shift, this patch simply adds a small random timeout to the computed value of between 0 ms and 511 ms. I could see limiting the random amount to be no greater than a proportion of the configured magnitude, but I can't see scaling the random with the overall computed timeout. As far as I understand, the goal is just to schedule retries "not at the same exact time", so a small difference seems sufficient. - - UPDATE: randomization removed. - - Closes PR #187 - Fix by: Brad Spencer - -- distribute ares_android.h - - Distribute ares_android.h when a release distribution package is - created. - - Reported By: Andrey Khranovsky - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-04/0000.shtml - -- ares_set_servers_csv() on failure should not leave channel in a bad state - - If bad data is passed to ares_set_servers_csv() or - ares_set_servers_ports_csv() it will clear the existing channel - configured DNS servers, then a call to ares_send() will fail due - to a bad malloc which may have undefined behavior. - - The fix now only clears existing servers on success. An additional - sanity check was added in ares_send() to ensure nservers >= 1 or - will result in ARES_ESERVFAIL. - - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2018-03/0000.shtml - Reported-by: Francisco Sedano Crippa - -- docs: Not all manpages are listed - - Some docs aren't installed or not showing up on - https://c-ares.haxx.se/docs.html - due to not being listed in Makefile.inc. Add missing docs and - ensure docs are alphabetized. - -Version 1.14.0 (16 Feb 2018) - -Daniel Stenberg (16 Feb 2018) -- ares_android.c: fix warning: ISO C forbids an empty translation unit - -- RELEASE-NOTES: some more work we did and people who helped - -Brad House (16 Feb 2018) -- travis: skip Autotools style testing for cmake - - Fix cmake test build by skipping autotools portion of test script. - -- travis: standardize CMake test off of Autotools tests - - Instead of running 'make test', run the tests directly like autotools - does. It provides more verbose output. - -- travis: Enable building tests for CMake - - Travis should auto-build and run tests for cmake builds now that - PR #168 is merged. - -- fix version in pkgconfig - -- Add version update to CMakeLists in maketgz - -- Release prep. Add support for pkgconfig in cmake, set versions appropriately - -Gregor Jasny (15 Feb 2018) -- CMake: Add tests - -Brad House (14 Feb 2018) -- [Gregor Jasny brought this change] - - Use cmake3 package provided by Ubuntu (#182) - -- Cmake 3.1 instead of 3.2.1 should be the minimum - -- Update RELEASE-NOTES and RELEASE-PROCEDURE.md to prepare for next release - -- get rid of c++ style comments - -- Use trusty for all builds, precise is EOL. Update clang and cmake versions. - -- Current CMakeLists.txt doesn't support 2.8.12 anymore, we need to bump the version to 3.2.1 minimum - -- Re-organize sections in INSTALL.md and add CMake section - -- [Sergey Kolomenkin brought this change] - - remove compilation warnings in MSVC (#47) - -- document handling of timeouts for ares_process and ares_process_fd to close PR #57 - -- As per Issue #155, since we do not require gethostname() during init, if it fails, there's no reason for init to fail as it is only used to populate the domain - -GitHub (7 Feb 2018) -- [David Drysdale brought this change] - - Document WSAStartup requirement (#180) - -David Drysdale (6 Feb 2018) -- [Antonio Tajuelo brought this change] - - Added coderelease.io badge to readme.md for letting people subscribe to new versions (#174) - -- [Sheel Bedi brought this change] - - Update year in LICENSE.md to 2018 (#170) - -GitHub (4 Feb 2018) -- [David Drysdale brought this change] - - travis: use VM not container for {L,A}SAN builds (#177) - - As per https://github.com/travis-ci/travis-ci/issues/9033, container - based builds do not currently allow ptrace, which is used by LSAN and - ASAN. - -Brad House (3 Feb 2018) -- [acthompson-google-com brought this change] - - Android JNI code leaks local references in some cases (#175) - - * Add Google LLC to AUTHORS. - - * android: Explicitly delete all JNI local references, and cache JNI method IDs at initialization. - - * android: Only return ARES_ENOTINITIALIZED on failures in initialization code. - -Gregor Jasny (2 Jan 2018) -- Embed fused Google Test 1.8.0 - -Brad House (21 Dec 2017) -- [John Schember brought this change] - - android: Check returns for obj and classes are not NULL. Document API levels for various Android functions and objects used. (#166) - -- CARES_CHECK_TYPE should reference variable so a warning is not produced for -Werror compatibility - -- [Brad Spencer brought this change] - - Fix computation of IPv6 blacklist mask for values of netmask > 8. (#164) - -David Drysdale (14 Dec 2017) -- travis: Only do coverage/distcheck on normal build - -- travis: only do pip install on Linux - -- travis: only test in IPv4 mode - - Travis' Trusty environment does not support IPv6. - -- test: allow restriction to one IP address family - -- [Roman Teterin brought this change] - - Fix a typo in init_by_resolv_conf (#160) - -Brad House (11 Dec 2017) -- @gvanem says MSVC -RTCc option fails, looks erroneous to me, but the additional mask is harmless - -- Fix some other mingw warnings - -- Issue #143, get rid of windows build warning due to passing 'char **' to argument expecting 'const char **' - -- [Gregor Jasny brought this change] - - Distribute CMake files (#130) - -- Android variants may not have __system_property_get - - Some android systems like ARM64 may not have the __system_property_get - symbol in libc (but still have it in the public headers). Detect this - condition at build time. The __system_property_get method of retrieving - name servers is deprecated as of Oreo so should strictly be a fallback - mechanism anyhow. - -David Drysdale (9 Nov 2017) -- [David Hotham brought this change] - - Wrong function name throughout man page (#154) - -- ares_data.c: iterate through substructs when freeing - - Previous code recursed into substructures, which makes it more likely - that large/heavily-nested responses could use up lots of stack. - -- test: test ares_free_data on long chain of structs - -- [Felix Yan brought this change] - - Fix a typo in inet_ntop.c (#151) - -Daniel Stenberg (29 Sep 2017) -- ares_gethostbyname.3: fix callback status values - - - ARES_ENOTFOUND means the _name_ wasn't found - - - ARES_ENODATA can be returned when a resolve fails - - Reported-by: Jakub Hrozek - Bug: https://c-ares.haxx.se/mail/c-ares-archive-2011-06/0012.shtml - -Brad House (28 Sep 2017) -- [John Schember brought this change] - - Fix DNS server lookup breaking with Android O due to Android removing access to net.dns# system properties. (#148) - - As of Android 8 (Oreo) access to net.dns# has been removed (https://developer.android.com/about/versions/oreo/android-8.0-changes.html). The reasoning given is that it, "improves privacy on the platform". Currently c-ares uses this to get the list of DNS servers. - - Now the only way to access the DNS server list is by using the Connectivity Manager though Java. This adds the necessary JNI code to use the Connectivity Manager and pull the DNS server list. The old way using __system_property_get with net.dns# remains for compatibilty. - - Using the Connectivity Manager requires the ACCESS_NETWORK_STATE permission to be set on the app. Existing applications most likely are not setting this and keeping the previous method as a fallback will at the very least ensure those apps don't break on older versions of Android. They will need to add this permission for Android 8 compatibility. - - Included in the patch are two initalization functions which are required. The JVM must be registered as well as the Connectivity Manager itself. There is no way to get the Connectivity Manager except though Java. Either being passed down to C directly or by passing in an Android Context which can be used to get the Connectivity Manager. Examples are provided in the documentation. - -- [Konstantinos Sofokleous brought this change] - - allow linking against the static msvc runtime library (#133) - - allow linking against the static msvc runtime library - -- [Gergely Nagy brought this change] - - Force using the ANSI versions of WinAPI functions (#142) - - When compiling c-ares with a build system that defines UNICODE, - bad versions of WinAPI functions are used causing failures or even - crashes. When windows.h is included in MBCS mode (like in the default - build system), the ..A versions are the same as using the one without - any suffix. - -- [cmake] build fix on Solaris - -GitHub (11 Sep 2017) -- [Brad House brought this change] - - Win32 exclude legacy ipv6 subnets (#144) - - win32 ipv6: add infrastructure to exclude ipv6 subnets that are known to cause issues - -- [David Drysdale brought this change] - - windows: only look for ancient compilers (#146) - - Also drop the use of a versioned output directory; just use - .\msvc - -- [David Drysdale brought this change] - - ares_init_options.3: match up sock_state_cb args (#141) - - Fixes #140 - -Daniel Stenberg (25 Aug 2017) -- [Anna Henningsen brought this change] - - gethostbyaddr: fail with `ECANCELLED` for `ares_cancel()` - - When `ares_cancel()` was invoked, `ares_gethostbyaddr()` - queries would fail with `ENOTFOUND` instead of `ECANCELLED`. - - It seems appropriate to treat `ares_cancel()` like `ares_destroy()`, - but I would appreciate review of the correctness of this change. - - Ref: https://github.com/nodejs/node/issues/14814 - - Closes #138 - -David Drysdale (18 Aug 2017) -- [David Hotham brought this change] - - support most recent Visual Studio 2017 - -Brad House (26 Jul 2017) -- Preserve original DNS server order on Windows for equal metrics. - - qsort is not stable, in order to make it stable we need to record - the original index and add it as a secondary sort value when the - metrics are equal to prevent using DNS servers that may not work - at all as reported by some users. - -David Drysdale (15 Jul 2017) -- [Anna Henningsen brought this change] - - ares_parse_naptr_reply: make buffer length check more accurate - - 9478908a490a6bf009ba58d81de8c1d06d50a117 introduced a length check - for records parsed by `ares_parse_naptr_reply()`. However, that - function is designed to parse replies which also contain non-NAPTR - records; for A records, the `rr_len > 7` check will fail as there - are only 4 bytes of payload. - In particular, parsing ANY replies for NAPTR records was broken - by that patch. - - Fix that by moving the check into the case in which it is already - known that the record is a NAPTR record. - -- appveyor: run dnsdump as a sanity check - -- travis: run dnsdump as a sanity check - -- test: use ares_free_string() throughout - - As pointed out by Gisle Vanem in #125. - -Daniel Stenberg (3 Jul 2017) -- RELEASE-PROCEDURE.md: how to release - - Fixes #115 - Closes #116 - -David Drysdale (2 Jul 2017) -- test: Build dnsdump on Windows too - - Thanks to Gisle Vanem for showing the way: - https://github.com/c-ares/c-ares/commit/b701af8a24cf9d173b1dbe5faedcea34642e92da#commitcomment-22830845 - -Brad House (26 Jun 2017) -- [Christian Ammer brought this change] - - fix statement like #define - ares ssize_t define had a trailing semicolon (#120) - -David Drysdale (21 Jun 2017) -- test: distribute the fuzzcheck.sh script - - The TESTS target runs fuzzcheck.sh so make sure it is included - in the distributed tarball. - - (The test itself will be pointless when run on a distribution, because - the fuzzing corpus directories are not shipped, but at least this - means that `make -C test test` should work.) - -- test: run the name-parsing corpus check too - -Daniel Stenberg (21 Jun 2017) -- dist: don't build/ship PDF versions in release archives - - ... experience says very few read them and they can still get build by - those who want them.a - -- ares_version.h: bump version - -Version 1.13.0 (20 Jun 2017) - -Daniel Stenberg (20 Jun 2017) -- RELEASE-NOTES: 1.13.0 - -- ares_set_socket_functions.3: added in 1.13.0 - -David Drysdale (18 Jun 2017) -- ares_parse_naptr_reply: check sufficient data - - Check that there is enough data for the required elements - of an NAPTR record (2 int16, 3 bytes for string lengths) - before processing a record. - -- test: Feed in short NAPTR - -- test: Add fuzz input with short NAPTR - -- test: add ares_parse_naptr_reply to fuzzer - -- [noiz brought this change] - - Update ares.h to support compiling with QNX - -- [Dionna Glaze brought this change] - - Simple changes to appease stricter compilers. - - ares_process.c uses htonl, which needs <arpa/inet.h> included. - ares_getnameinfo.c uses a dynamically selected format string for - sprintf, which -Wformat-literal doesn't like. Usually one would use - inttypes.h and a format string "%" PRIu32, but C99 is too new for some - supported platforms. - -GitHub (16 Jun 2017) -- [Gregor Jasny brought this change] - - CMake: Emulate interface library on import (#108) - - Closes: #104 - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -Brad House (6 Jun 2017) -- [ChristianAmmer brought this change] - - Added support for Windows DNS Suffix Search List (#93) - - This change solves issue #53. - - Support for suffix search lists was already built in for Linux. The search list could be set via set_search. With this change the suffix search list from Windows is read from the registry and then set into the ares configuration via set_search. There are two sources for the search list: - - The global DNS suffix search list. - The primary and connection specific DNS suffixes if the global is not available. - - Contributed by @ChristianAmmer - -Daniel Stenberg (25 May 2017) -- [Thomas Köckerbauer brought this change] - - configure: do not heck for ar if specified manually - - Closes #62 - -David Drysdale (23 May 2017) -- ares_expand_name: limit number of indirections - -- test: fuzz input file that takes a while to process - -- test: copy data in fuzz regression driver - - Oops. - -GitHub (23 May 2017) -- [David Drysdale brought this change] - - Convert char from ISO-8859-1 to UTF-8 (#99) - - Fixes #97 - -- [Gregor Jasny brought this change] - - travis: Use trusty for cmake builds (#109) - - kubuntu-backports dropped the CMake package for Precise - -David Drysdale (2 May 2017) -- [David Hotham brought this change] - - msvc_ver.inc support most recent Visual Studio 2017 (#101) - -- test: use io.h not unistd.h for Windows - -- test: try building fuzz binaries on Windows - -- test: stick to int in ares-fuzz.c - - Using int rather than ares_ssize_t means this file - needs no c-ares dependency - it's a general driver for - any libFuzzer-style entrypoint. - -- test: force ARES_OPT_NOROTATE for no-rotate tests - -- test: check expected NOROTATE value - -- ares_create_query: use ares_free not naked free - - Accidentally added in commit 65c71be1cbe5 - ("ares_create_query: avoid single-byte buffer overwrite") - -Brad House (17 Mar 2017) -- Need ares.h for ares_ssize_t - -- tests should not use ssize_t, use ares_ssize_t - -GitHub (16 Mar 2017) -- [Brad House brought this change] - - Portability updates for legacy systems. (#92) - - Socklen_t should not be used in code, instead ares_socklen_t should be used. - Convert ssize_t to ares_ssize_t for portability since the public API now exposes this. - -David Drysdale (14 Mar 2017) -- [Michael Osei brought this change] - - Update msvc_ver.inc (#91) - - For Visual Studio 2017 builds - -Daniel Stenberg (13 Mar 2017) -- [Brad House brought this change] - - Windows DNS server sorting (#81) - - Original Patch From Brad Spencer: - https://c-ares.haxx.se/mail/c-ares-archive-2016-04/0000.shtml - - My modifications include: - * Dynamically find GetBestRoute2 since it is a Windows Vista+ symbol, and will fall back to prior behavior when not available. - * Prefer get_DNS_AdaptersAddresses as the modifications should alleviate the concerns which caused us to prefer get_DNS_NetworkParams - * Update AppVeyor to use MinGW-w64 instead of the legacy MinGW - * Fix compile error in test suite for Windows. - - Original message from patch below: - - From: Brad Spencer <bspencer@blackberry.com> - Date: Fri, 29 Apr 2016 14:26:23 -0300 - - On Windows, the c-ares DNS resolver tries first to get a full list of - DNS server addresses by enumerating the system's IPv4/v6 interfaces and - then getting the per-interface DNS server lists from those interfaces - and joining them together. The OS, at least in the way the c-ares - prefers to query them (which also may be the only or best way in some - environments), does not provide a unified list of DNS servers ordered - according to "current network conditions". Currently, c-ares will then - try to use them in whatever order the nested enumeration produces, which - may result in DNS requests being sent to servers on one interface - (hosting the current default route, for example) that are only intended - to be used via another interface (intended to be used when the first - interface is not available, for example). This, in turn, can lead to - spurious failures and timeouts simply because of the server address - order that resulted because of the enumeration process. - - This patch makes the (safe?) assumption that there is no other better - rule to chose which interface's DNS server list should be prioritized. - After all, a DNS lookup isn't something "per network"; applications - don't look up "these DNS names on this interface and those DNS names on - that interface". There is a single resource pool of DNS servers and the - application should presume that any server will give it the "right" - answer. However, even if all DNS servers are assumed to give equally - useful responses, it is reasonable to expect that some DNS servers will - not accept requests on all interfaces. This patch avoids the problem by - sorting the DNS server addresses using the Windows IPv4/v6 routing tables. - - For example, a request to DNS server C on interface 2 that is actually - sent over interface 1 (which may happen to have the default route) may - be rejected by or not delivered to DNS server C. So, better to use DNS - servers A and B associated with interface 1, at least as a first try. - - By using the metric of the route to the DNS server itself as a proxy for - priority of the DNS server in the list, this patch is able to adapt - dynamically to changes in the interface list, the DNS server lists per - interface, which interfaces are active, the routing table, and so on, - while always picking a good "best" DNS server first. - - In cases where any DNS server on any interface will do, this patch still - seems useful because it will prioritize a lower-metric route's (and thus - interface's) servers. - -David Drysdale (22 Feb 2017) -- [Sergii Pylypenko brought this change] - - docs: fixed references to ares_set_local_ip4 and ares_set_local_ip6 - -- [Calle Wilund brought this change] - - ares test: fix win32 build errors with virtual socket function tests - - The added api requires both some typedefs not previously imported - into the test build + the test code did not fully deal with - socket differences on windows. - -- [Calle Wilund brought this change] - - ares_process: fix return type of socket_create function (win32 warning) - -Daniel Stenberg (31 Jan 2017) -- [Calle Wilund brought this change] - - ares_set_socket_functions: Add man page - - Providing some rudimentary documentation for the added functionality - - Closes #72 - -- [Calle Wilund brought this change] - - ares-test: Add test helpers and cases for virtual socket IO - - * Added test case macro to automatically run tests twice, once "normal", - once with virtual IO. - * Changed most "live" query tests to run in dual mode to verify - at least simple socket IO via virtual functions - * Added test case for settings/duping socket functions & callback data - -- [elcallio brought this change] - - Implement using virtual socket IO functions when set - - Uses virtual socket IO functions when set on a channel. - Note that no socket options are set, nor is any binding - done by the library in this case, since the client defining - these is probably more suited to deal with this. - -- [elcallio brought this change] - - Add virtual function set for socket IO - - Defines a structure of basic create, close, read/write - functions as virtual function calls, settable for individual - c-ares channels. - -David Drysdale (30 Jan 2017) -- test: ignore aresfuzzname binary - -Gregor Jasny (14 Jan 2017) -- [Stephen Sorley brought this change] - - Always use check_symbol_exists instead of check_function_exists. - -- Also add includes to TARGETS_INST_DEST - -- [Stephen Sorley brought this change] - - Windows build fixes - -- CMake: Export targets - -- CMake: Use GNUInstallDirs for install location defaults - -David Drysdale (11 Jan 2017) -- Update Makefile.am for renamed INSTALL.md - -GitHub (11 Jan 2017) -- [David Drysdale brought this change] - - docs: convert INSTALL to MarkDown & tweak (#83) - -- [Gregor Jasny brought this change] - - Merge pull request #77 from stephen-sorley/cmake_modernize - - Updated CMake minimum version to 2.8.12. - -Stephen Sorley (4 Jan 2017) -- Changed executables to depend directly on internal libcares target, instead of against - the external-facing alias targets. - -- Updated Travis to pull CMake 2.8.12 from kubuntu-backports ppa. - -- Updated CMake minimum version to 2.8.12. - - Changed the way usage requirements (include dirs, compile defs, dependent libraries) are specified, to match the recommended standard practice for modern CMake. This involves using target-specific functions (target_include_directories, target_compile_definitions, etc.), along with the PUBLIC, PRIVATE or INTERFACE modifiers. - - Updated chain-building support to imitate new-style Find modules (import libs), instead of old-style Find modules (cache variables). - -David Drysdale (26 Dec 2016) -- [Chris Araman brought this change] - - configure: clock_gettime workaround (#75) - - Commits 7518c26, c41726b, and bc14ee7 brought this workaround to the CMake build system. This expands it to the autoconf build system. - - Fixes #71 - -- test: add fuzz entrypoint for ares_create_query() - -- test: Add gTest/gMock files to SOURCES - - Built tarballs are not including all of the files needed - to build the test suite because they are missing from the - <target>_SOURCES variable in Makefile.am. - -- travis: Move build scripts under travis/ - - Travis doesn't always propagate errors in inline multi-line - scripts, so move them all to be explicit shell scripts, each - with set -e. - -- travis: check distributed tarball builds - -Daniel Stenberg (25 Oct 2016) -- dist: ship msvc_ver.inc too - - Reported-by: Bruce Stephens - - Fixes #69 - -- [Aaron Bieber brought this change] - - fix build on OpenBSD - -- ares_version.h: bump, working on 1.12.1 now - -GitHub (18 Oct 2016) -- [Gregor Jasny brought this change] - - Merge pull request #64 from bradh352/master - - Add CMake build system support to C-Ares. - -Brad House (5 Oct 2016) -- suggested PROJECT_NAME change broke chain building as it needs the magic PROJECT_NAME set in the ADD_LIBRARY for matching. Fix to make both goals work - -- update MacOSX 10.12 detection - -- Expand XCode clock_gettime fix to include MacOS 10.12, not just iOS10 - -David Drysdale (4 Oct 2016) -- Revert "travis: work around bug in PyCParser" - - This reverts commit a24a10a348fc00b8cfd684d91894a1df14880ea9. - -- travis: work around bug in PyCParser - - See https://github.com/pyca/cryptography/issues/3187 - -Brad House (3 Oct 2016) -- PROJECT_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR as per @gjasny - -- use a project name of c-ares as per @gjasny - -- Import curl conversion of Makefile.inc to cmake form dynamically as per bdoetsch@ameritech.net to make maintaining multiple build systems easier - -Daniel Stenberg (30 Sep 2016) -- dist: add ares_library_initialized.* to the tarball - -David Drysdale (30 Sep 2016) -- test: check ares_create_query with too-long name - -Daniel Stenberg (30 Sep 2016) -- man pages: minor formatting edits - -Brad House (29 Sep 2016) -- merge fc7917e from @daviddrysdale ... travis build updates for cmake - -- cleanups as per @gjasny ... Use naked IF statements and use NOT DEFINED - -Version 1.12.0 (29 Sep 2016) - -Daniel Stenberg (29 Sep 2016) -- RELEASE-NOTES: 1.12.0 - -- [David Drysdale brought this change] - - ares-test-misc: test ares_create_query with escaped trailing dot - -- ares_create_query: avoid single-byte buffer overwrite - - ... when the name ends with an escaped dot. - - CVE-2016-5180 - - Bug: https://c-ares.haxx.se/adv_20160929.html - -Brad House (29 Sep 2016) -- CMake: Unify library versioning with the libtool methodology to make keeping library versions in sync easier with the autotools build system - -Daniel Stenberg (29 Sep 2016) -- ares_library_initialized.3: added - -- make: bump CARES_VERSION_INFO for release - -David Drysdale (29 Sep 2016) -- man: update ares_init_options.3 - -Daniel Stenberg (29 Sep 2016) -- ares_library_init.3: corrected the ares_library_init_mem proto - -Brad House (28 Sep 2016) -- XCode v8 introduced clock_gettime() for iOS v10. However, it is a weak symbol, which means when earlier iOS versions try to use clock_gettime() it results in a crash due to the missing symbol. Detect this condition and do not set HAVE_CLOCK_GETTIME_MONOTONIC. - -- Adds cmake build system support to C-Ares. - - The patch does not modify any source files, it only adds 3 new files - (CMakelists.txt, ares_build.h.cmake, ares_config.h.cmake) which form the - build system. I've tried to go through as much of the autotools tests and - extracted what I thought was appropriate, though many of the tests aren't - as in-depth in CMake as they are for autotools ... it is unclear why some - of them exist at all, I'm guessing for legacy systems that CMake probably - doesn't support anyhow. - - Building the library, and examples (adig, ahost, acountry) plus installation - should work across a large number of tested platforms. The tests have not - yet been integrated. - -Daniel Stenberg (27 Sep 2016) -- README.md: remove space from link - -- README: link to the correct c-ares badge! - - Reported-by: David Hotham - - Fixes #63 - -- docs: minor formatting edits - -- ares_destroy.3: formatting polish - -- ares_init.3: split the init docs into two separate man pages - -- SECURITY: point to the vulnerabilities page now - -- RELEASE-NOTES: synced with daa7235b1a5 - -- ares_create_query.3: edit language - - Tried to make the man page more readable. - -David Drysdale (26 Sep 2016) -- test: fix gMock to work with gcc >= 6.x - - Taken from: - https://github.com/google/googletest/issues/705#issuecomment-235067917 - -Daniel Stenberg (26 Sep 2016) -- [Brad House brought this change] - - headers: remove checks for and defines of variable sizes - - ... they're not really used and by avoiding them in the ares_build.h - output we make the public header less dependent on data sizes. - -David Drysdale (24 Sep 2016) -- api: add ARES_OPT_NOROTATE optmask value - - Fix up a couple of problems with configuring whether c-ares rotates - between different name servers between requests. - - Firstly, ares_save_options() returns (in *optmask) the value of - (channel->optmask & ARES_OPT_ROTATE), which doesn't necessarily - indicate whether the channel is or is not actually doing rotation. - This can be confusing/incorrect if: - - the channel was originally configured without ARES_OPT_ROTATE - (so it appears that the channel is not rotating) - - the /etc/resolv.conf file includes the 'rotate' option - (so the channel is actually performing rotation). - - Secondly, it is not possible to reliably configure a channel - to not-rotate; leaving off ARES_OPT_ROTATE is not enough, since - a 'rotate' option in /etc/resolv.conf will turn it on again. - - Therefore: - - add an ARES_OPT_NOROTATE optmask value to allow explicit - configuration of no-rotate behaviour - - in ares_save_options(), report the value of channel->rotate - as exactly one of (optmask & ARES_OPT_ROTATE) or - (optmask & ARES_OPT_NOROTATE). - - In terms of back-compatibility: - - existing apps that set ARES_OPT_ROTATE will continue to rotate, - and to have ARES_OPT_ROTATE reported back from ares_save_options() - - existing apps that don't set ARES_OPT_ROTATE will continue to - use local config/defaults to decide whether to rotate, and will - now get ARES_OPT_ROTATE or ARES_OPT_NOROTATE reported back from - ares_save_options() rather than 0. - -- ares_init_options: only propagate init failures from options - - Commit 46bb820be3a8 ("ares_init_options: don't lose init failure") - changed init behaviour so that earlier errors in initialization - weren't lost. In particular, if the user passes in specific - options but they are not applied (e.g. because of an allocation - failure), that failure needs to be reported back to the user; this - also applies when duplicating a channel with ares_dup(). - - However, other initialization failures can be ignored and - overridden -- in particular, if init_by_resolv_conf() or - init_by_environment() fail, then falling back to default values - is OK. - - So only preserve failures from the init_by_options() stage, not - from all initialization stages. - - Fixes issue 60. - -- test: Force reinstall of libtool on OSX - - Travis build environment appears to have changed. - -- test: Add valgrind build variant - -- test: Add null pointer to gtest args - - GoogleTest assumes that there is a null pointer in argv[argc], - so make it look like that. Without this change, tests run with - command-line arguments get memory errors under valgrind/ASAN. - -Daniel Stenberg (21 Aug 2016) -- AUTHOR: maybe gitgub isn't really an author =) - -- AUTHORS: added contributors from the git log - -- LICENSE.md: add a stand-alone license file - - Just the MIT license used in the top the source files moved out to a - stand-alone file for easier reference and discovery. - -- README: added "CII best practices" badge - -- SECURITY.md: suggested "security process" for the project - -David Drysdale (17 Aug 2016) -- test: Add Clang static analysis build to Travis - - Run scan-build over the library source code, but skip the - tests. Needs a later Clang install in Travis - -- test: more info on how to run fuzz testing - -- test: make fuzzer driver code C not C++ - -- test: fuzzer mode for AFL's persistent mode - - When fuzzing with AFL, if the LLVM-based instrumentation is - used (via the afl-clang-fast wrapper), then it is possible to - have a single execution of the fuzzer program iterate multiple - times over the fuzzing entrypoint (similar to libFuzzer's normal - mode of execution) with different data. This is much (e.g. 10x) - faster. - - Add code to support this, by checking whether __AFL_LOOP is - defined at compile-time. - - Also, shift the code to effectively be C rather than C++. - -- test: simplify deps for fuzzer entrypoint - - No need to depend on the rest of the test code (ares-test.h) for - the fuzzer entrypoint; this makes the entrypoint slightly simpler - to build with LLVM's libFuzzer. - - Also shift the code to effectively be C rather than C++ - -- test: disable MinGW tests - - The test binary built in the MinGW build is failing for some - reason. It works for me when I build locally, so I'm guessing - it's down to some sort of AppVeyor environment issue. - - Disable for now. - -Daniel Stenberg (16 Aug 2016) -- read_tcp_data: remove superfluous NULL check - - CID 56884 by Coverity. The pointer is already derefenced before this - point so it can't be NULL here anyway. - -- web: http => https - -GitHub (20 Jul 2016) -- [David Drysdale brought this change] - - Merge pull request #59 from fuze/master - - Update msvc_ver.inc for VS2015 Update 3 - -- [Chris Araman brought this change] - - Update msvc_ver.inc - - support Visual Studio 2015 Update 3 - -David Drysdale (2 May 2016) -- Fix trailing comment for #endif - -Daniel Stenberg (30 Apr 2016) -- email: use Gisle's "new" address - -David Drysdale (18 Apr 2016) -- test: drop superfluous fuzz inputs - - Where there are multiple fuzz input files that only differ in - the first two bytes (the query ID), just keep the first such - file. - -svante karlsson (15 Apr 2016) -- Update msvc_ver.inc - - support Visual Studio 2015 Update 2 - -David Drysdale (31 Mar 2016) -- test: Run fuzzcheck.sh in Travis build - -- test: add fuzzing check script to tests - - Add a test script that runs the fuzzing command over the - corpus of DNS packets. This doesn't actually do any fuzzing - (it just runs them as inputs without generating any variations) - but it does ensure that the fuzzing entrypoint is still working. - -- test: allow multiple files in aresfuzz command line - - If no arguments are specified, use stdin as input. - Otherwise treat each argument as a filename and feed - its contents to the fuzz entrypoint. - -- test: Add corpus of DNS packets - - For fuzz testing it is useful to start from a corpus of valid - packets, so fill out the test/fuzzinput/ directory with a bunch - of inputs. - - These packets were generated by temporarily modifying the c-ares - process_answer() function to save off any incoming response messages. - -- test: Add utility to show DNS packet from file - -- [nordsturm brought this change] - - Fix nsort initialization - - Author: Alexander Drachevskiy - http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0004.shtml - http://c-ares.haxx.se/mail/c-ares-archive-2014-07/0014.shtml - -- test: Check setting nsort=0 option is respected - -- test: Update fuzzing function prototype - - libFuzzer changed expected return type from void to int - in LLVM 3.8. - -- Explicitly clear struct servent before use - - On a build where MSAN has been manually set up (which involves - using an MSAN-instrumented version of the standard C++ library, see - https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo) - there's a warning about use of uninitialized memory here. It - might be a false positive, but the fix is trivial so include it. - -- test: for AF_UNSPEC, return CNAME only for AAAA, but valid A record - - Also shuffle expected responses rsp6/rsp4 into the order they will occur. - -- [Chris Araman brought this change] - - msvc_ver.inc: support Visual Studio 2015 Update 1 - -- build: commonize MSVC version detection - - Remove the need to copy/paste version number mapping between - Makefile.msvc and test/Makefile.msvc. - -- test: Use different name in live test - -- test: Only pass unused args to GoogleTest - -- ahost.c: add cast to fix C++ compile - - If ahost.c is force-compiled as C++ the missing cast from - (void *) to (char **) is problematic. - -- ares_library_cleanup: reset ares_realloc too - - Otherwise a subsequent use of the library might use a previous - incarnation's realloc() implementation. - -Daniel Stenberg (9 Mar 2016) -- [Brad House brought this change] - - configure: check if tests can get built before enabled - - The current approach for disabling tests is not a good solution because - it forces you to pass --disable-tests, rather than auto-detect if your - system can support the tests in the first place. Many (most?) systems - do not have C++11. This also causes issues when chain-building c-ares, - the hosting system needs to be updated to support passing this - additional flag if necessary, it doesn't seem reasonable to add this - requirement which breaks compatibility. - - This change auto-detects if the system can build the tests and - automatically disable them if it cannot. If you pass --enable-tests to - configure and the system cannot build them either due to lack of system - support, or because cross-compilation is being used, it will throw an - appropriate error since the user indicated they really did want the - tests. - -David Drysdale (3 Mar 2016) -- [Viktor Szakats brought this change] - - Makefile.m32: add support for CROSSPREFIX - -- [Viktor Szakats brought this change] - - Makefile.m32: add support for extra flags - - Allow specification of CARES_{LD,C}FLAG_EXTRAS envvars - for mingw - -- test: Build with MinGW on AppVeyor - -- test: avoid in6addr_* constants - - These aren't available on MinGW, so use explicit addresses instead. - -- test: add missing #includes for dns-proto.cc - -- [Gregor Jasny brought this change] - - Fix man page typos detected by Lintian - -Daniel Stenberg (19 Feb 2016) -- configure: acknowledge --disable-tests - - Fixes #44 - -- AUTHORS: added contributors from the 1.11.0 release - -- bump: start working on the next version - -Version 1.11.0 (19 Feb 2016) - -Daniel Stenberg (19 Feb 2016) -- RELEASE-NOTES: final edits for 1.11.0 - -David Drysdale (15 Feb 2016) -- ares_dup.3: remove mention of nonexistent function - - ares_dup_options() doesn't exist, so don't document it. - -- test: skip repeated build steps - - Top-level buildconf/configure now triggers for the - test/ subdir too, so don't need to do explicitly. - -- test: namespaces unavailable when cross-compiling - -Daniel Stenberg (13 Feb 2016) -- configure: only run configure in test when NOT cross-compiling - - ... as the tests won't run cross-compiled anyway - -David Drysdale (13 Feb 2016) -- test: prefer ON_CALL to EXPECT_CALL to reduce flakes - - For UDP tests, there's a chance of a retry. EXPECT_CALL only - expects a single request to arrive at the server; ON_CALL allows - for a UDP retry and repeats the same answer. - - Note that ON_CALL and EXPECT_CALL can't be mixed in the same - test, and that tests that have a varied sequence of responses - for the same repeated request still have to use EXPECT_CALL. - -Daniel Stenberg (13 Feb 2016) -- configure: run configure in 'test' too - - Having the test dir completely stand-alone causes too many issues for - users and devs. It still needs to be built specifically. - -- configure: build silently by default - -- buildconf: run test/buildconf too if present - -- test/configure: build silently by default - -- [Gregor Jasny brought this change] - - dist: Distribute README.md - - Closes #42 - -Version 1.11.0 (11 Feb 2016) - -Daniel Stenberg (11 Feb 2016) -- Makefile.am: distribute the test dir too - -- RELEASE-NOTES: synced with 385582bd14b68a - -- [Nicolas \"Pixel\" Noble brought this change] - - ares_win32_init: make LoadLibrary work when using UNICODE too - - Closes #17 - -David Drysdale (11 Feb 2016) -- Use "resolve" as synonym of "dns" in nsswitch.conf - - Modern Linux systems may have libnss_resolve from systemd as the - resolver, which is then configured in /etc/nsswitch.conf with - the "resolve" keyword rather than "dns". - - Fixes #33 - -- ares_set_socket_callback: make manpage match code - - The code in ares_process.c that invokes the socket creation/connection - callback only checks for rc < 0, not for standard ares error codes. - -- Merge pull request #36 from AGWA-forks/master - - Add ares_set_socket_configure_callback() - -- test: Update init tests to match behaviour - - Unreadable config files are now treated the same way - as absent config files. - -- [Fedor Indutny brought this change] - - Ignore `fopen` errors to use default values - - After 46bb820be3a83520e70e6c5f0c5133253fcd69cd `init_by_resolv_conf` - errors are no longer swallowed in `ares_init_options`. This has exposed - a previously unknown bug in `lookups` initialization code. - - If there is no lookup configuration in `resolv.conf`, - `init_by_resolv_conf` will attempt to read it from other files available - on the system. However, some of these files may have restricted - permissions (like `600`), which will lead to `EACCESS` errno, which in - turn is handled like a fatal error by `init_by_resolv_conf`. - - However, it sounds illogical that this error should be handled as a - fatal. There is a `init_by_defaults` call that overrides `lookups` with - default value, and certainly possible absence of lookup information is - the reason why this function exists in a first place! - - I suggest handling any `fopen` errors as non-fatal ones, allowing to - pick up the `lookups` value from different config files, or to pick up - default value. - -Andrew Ayer (9 Feb 2016) -- Document callback type in man page for ares_set_socket_callback - -- Add ares_set_socket_configure_callback() - - This function sets a callback that is invoked after the socket is - created, but before the connection is established. This is an ideal - time to customize various socket options. - -David Drysdale (9 Feb 2016) -- test: ares_set_socket_callback failure behaviour - -- test: Check ares_parse_txt_reply_ext() entrypoint - -- [Fedor Indutny brought this change] - - txt: introduce `ares_parse_txt_reply_ext` - - Introduce `ares_txt_ext` structure with an extra `record_start` - field, which indicates a start of a new TXT record, thus allowing to - differentiate the chunks in the same record, from a chunks in a - different record. - - Introduce a new API method: `ares_parse_txt_reply_ext` that works with - this kind of struct. - -- doc: Update missed repo references - -- doc: Update docs on contributing - -- test: Run command line tools in Travis - - Do a quick execution of each of the command line tools - in the continuous integration build, so that any (say) - sanitizer failures show up. - -- acountry: drop inert test - - If ver_1 is true, then z0 and z1 must both be 'z', and so - (z0 != 'z' && z1 != 'z') can never be true. - - CID 56879, pointed out by Coverity. - -- doc: update badge locations to master repo - -- test: Enable maintainer mode + debug in Travis - -- test: Add an iOS build target - -- test: Ignore SIGPIPE in tests - -- test: More initialization tests - -- test: Improve containerized test mechanism - - Aim is to ensure that code coverage information can escape the - container. To do this: - - Enter a new mount namespace too, so that we can... - - Bind mount the expected source directory into the container - - Share memory with the sub-process so coverage information is - shared too. - -- test: Make contained tests easier to write - -- test: Add framework for containerized testing - - On Linux we can potentially use user and UTS namespaces to run a test - in a pseudo-container with: - - arbitrary filesystem (e.g. /etc/resolv.conf, /etc/nsswitch.conf, /etc/hosts) - - arbitrary hostname/domainname. - - Include a first pass at the framework code to allow this, along with a - first test case that uses the container. - -- test: Use a longer timeout for less flakiness - - Having occasional test failures from timeout before multiple - queries can complete, so up the default timeout for the test - from 100ms to 1500ms. - -- test: Make failure tests more robust - - Different platforms will do different numbers of allocations - in the processing of a given API call; just check that the - return code is either success or ENOMEM, and free off any - returned state in the former case. - - Also cope with ECONNREFUSED as well as ENOTFOUND. - -- test: Get test code building under Windows - - - Initial nmake file based off library nmake file - - Cast socket call arguments to (char *) - - Use wrapper sclose() that maps to closesocket() or close() - - Build a config.h indicating presence of headers - - Conditionally include netdb.h - - Remove unnecessary include of sys/socket.h - - Force longer bitmask for allocation failure tracking - - Call WSAStartup() / WSACleanup() in main() - - Set TCP_NODELAY for mock server - - Turn on tests in AppVeyor build - -- test: Disable tests that manipulate env on Windows - -- test: Move file lists into Makefile.inc - - In preparation for a Win32 build of the test suite. - -- test: Add a simple multi-server test - - Check rotate option does something - -- test: Allow for multiple mock servers - - - Update the MockServer to allow separate specification of - UDP and TCP ports - - Have an array of mock servers listening on consecutive - sets of ports. - - Rename Process(fd) to ProcessFD(fd) to avoid confusion. - - Initialize channel by using the new ares_set_servers_ports() - entrypoint, so multiple ports on the same loopback address - can be used. - -- test: Update test for set/get_servers variants - - Ports are significant in the _ports_ variant functions, so update test to cope. - -- test: Make GetNameServers() utility function port-aware - - Also make it generally available. - -- test: more testing, including of internal static functions - -- test: more tests, especially fallback processing - - - Make mock server listen on UDP + TCP in parallel. - - Test UDP->TCP fallback on truncation - - Test EDNS->no-EDNS fallback - - Test some environment init options - - Test nonsense reply - - test: short response - -- test: more tests, particularly of initialization - -- test: Run mock tests over both TCP and UDP - - With the exception of a few tests that make use of the timed - retry aspect of UDP. - -- test: Run mock tests over both IPv4 and IPv6 - -- test: Add more tests for edge cases - -- test: more nooks and crannies of pton functions - -- test: More tests for PTR parsing - -- test: Use of HOSTALIAS environment variable - -- test: Add RAII utility classes for testing - - - TempFile holds specific contents - - EnvValue sets an environment variable - -- test: More search domain scenarios - -- test: Remove duplicate flags from Makefile.am - -- test: Make test code leak-free - -- test: More tests - - - test use of sortlist - - test gethostbyname(AF_UNSPEC) - -- test: Test ares_gethostbyname_file() - -- test: Add more tests of ares_getnameinfo() - -- test: Tweak tests, add alloc failure test - -- test: Test init with options - -- test: More tests - - - ares_inet_net_pton() variants - - ares_getsock() variants - -- test: Expose ProcessWork() function - -- test: More parsing tests - - Including: - - Split each parse function test set out into separate files. - - Add an allocation failure test for each parsing function. - - Add error check test for each parsing function. - -- test: Add various additional tests - -- test: More tests - - Include tests of internal functions, based on the value of the - CARES_SYMBOL_HIDING macro; need to configure the library with - --disable-symbol-hiding to enable these tests. - -- test: Allow command line override of mock server port - -- test: Add README.md documentation - -- test: Temporarily avoid latest Python requests package - - Currently get error from Travis on this install step, and downgrading one - version appears to fix the problem. - - "Could not find any downloads that satisfy the requirement pyOpenSSL>=0.13 - (from requests[security])" - -- test: Add AppVeyor config file for Windows build - -- test: Add configuration for a Travis build - - Cover Linux & OSX on the container infrastructure, but install - a later G++ to satisfy the tests' need for C++11. - - Use a build matrix to include a variety of build variants: - - ASAN - - UBSAN - - LSAN - - Coverage via coveralls.io - - test: invoke ASAN and coverage in Travis build - - Also shift to use explicit build matrix - - test: Use coveralls.io for coverage tracking - - test: Add a build with UBSAN - - Also expand and re-order the setting of environment variables - for easier modification. - - test: Add LSAN build to Travis config - -- test: Add initial unit tests for c-ares library - - The tests are written in C++11, using the GoogleTest and GoogleMock - frameworks. They have their own independent autoconf setup, so that - users of the library need not have a C++ compiler just to get c-ares - working (however, the test/configure.ac file does assume the use of - a shared top-level m4/ directory). However, this autoconf setup has - only been tested on Linux and OSX so far. - - Run with "./arestest", or "./arestest -v" to see extra debug info. - The GoogleTest options for running specific tests are also - available (e.g. "./arestest --gtest_filter=*Live*"). - - The tests are nowhere near complete yet (currently hitting around - 60% coverage as reported by gcov), but they do include examples - of a few different styles of testing: - - - There are live tests (ares-test-live.cc), which assume that the - current machine has a valid DNS setup and connection to the - internet; these tests issue queries for real domains but don't - particularly check what gets returned. The tests will fail on - an offline machine. - - - There a few mock tests (ares-test-mock.cc) that set up a fake DNS - server and inject its port into the c-ares library configuration. - These tests allow specific response messages to be crafted and - injected, and so are likely to be used for many more tests in - future. - - - To make this generation/injection easier, the dns-proto.h file - includes C++ helper classes for building DNS packets. - - - Other library entrypoints that don't require network activity - (e.g. ares_parse_*_reply) are tested directly. - - - There are few tests of library-internal functions that are not - normally visible to API users (in ares-test-internal.cc). - - - A couple of the tests use a helper method of the test fixture to - inject memory allocation failures, using the earlier change to the - library to allow override of malloc/realloc/free. - - - There is also an entrypoint to allow Clang's libfuzzer to drive - the packet parsing code in ares_parse_*_reply, together with a - standalone wrapper for it (./aresfuzz) to allow use of afl-fuzz - for further fuzz testing. - -- test: Add local copy of GoogleMock/GoogleTest 1.7.0 - - Don't check in gtest/m4 files, as they are unused and interfere - with the top-level configure process. - -- doc: Show build badges in README.md - - Note that these URLs will need to be updated if/when the test branch - gets pulled into the master repo/branch. - -- doc: Convert README to README.md - - Gives better display on GitHub - -- doc: Update in preparation for next release - - Assume 1.11.0 is next (as there are various API additions). - Also add myself to AUTHORS. - -- build: Allow header compilation by Windows C++ compiler - -- build: Expose whether symbol hiding is on - - Adding the CARES_SYMBOL_HIDING definition allows the test suite to - detect whether internal symbols are available or not. - -- build: Add autoconf macros for C++11 code using pthreads - - Pull in testing macros from the GNU autoconf archive to allow - configure scripts to test for and setup use of a C++11 compiler - (AX_CXX_COMPILE_STDCXX_11) and the pthreads library (AX_PTHREAD). - - Note that these macros are not used by the main library autoconf, - just by the tests (which share the same m4/ directory). - -- build: Add a code coverage option - - Configure with: - ./configure --enable-code-coverage - Show coverage output with: - make code-coverage-capture - - Built on m4/ax_code_coverage.m4 from the GNU autoconf archive - to provide the macros to check for presence of gcov + lcov; - upstream macro modified to: - - Remove use of $(AM_DEFAULT_VERBOSITY) , as earlier versions of - autoconf (such as the one used by default on Travis) do not have this. - - Rather than automatically defining CODE_COVERAGE_RULES to be a set - of makefile rules that use ifeq/endif (which is GNU make-specific), - instead only define CODE_COVERAGE_RULES if coverages is turned on, - and in that case don't use conditionals in the makefile. - -- api: Add entrypoints to allow use of per-server ports - - Add user-visible entrypoints ares_{get,set}_servers_ports(3), which - take struct ares_addr_port_node rather than struct ares_addr_node. - This structure includes a UDP and TCP port number; if this is set - to zero, the channel-wide port values are used as before. - - Similarly, add a new ares_set_servers_ports_csv(3) entrypoint, which - is analogous to ares_set_servers(3) except it doesn't ignore any - specified port information; instead, any per-server specified port - is used as both the UDP and TCP port for that server. - - The internal struct ares_addr is extended to hold the UDP/TCP ports, - stored in network order, with the convention that a value of zero - indicates that the channel-wide UDP/TCP port should be used. - - For the internal implementation of ares_dup(3), shift to use the - _ports() version of the get/set functions, so port information is - transferred correctly to the new channel. - - Update manpages, and add missing ares_set_servers_csv to the lists - while we're at it - -- api: Add ares_set_sortlist(3) entrypoint - - Allow explicit configuration of the channel's sortlist, by - specifying a string in the same format as the equivalent - /etc/resolv.conf option. - - This allows library users to perform the same configuration - that is available via /etc/resolv.conf, but without needing - to change that file. - -- api: Allow injection of user-specified malloc/free functions - - Add a new ares_library_init_mem() initialization function for the - library which allows the library user to specify their own malloc, - realloc & free equivalents for use library-wide. - - Store these function pointers in library-wide global variables, - defaulting to libc's malloc(), realloc() and free(). - - Change all calls to malloc, realloc and free to use the function pointer - instead. Also ensure that ares_strdup() is always available - (even if the local environment includes strdup(3)), and change the - library code to always use it. - - Convert calls to calloc() to use ares_malloc() + memset - -- api: Add option to expose some internal functions - - Purely for testing, add --enable-expose-statics option to configure - which converts some static internal functions to be externally visible. - -- api: Expose the ares_library_initialized() function - -- ahost: Allow repeated -s <domain> options - - This also removes a potential leak where later -s options would - replace earlier ones without freeing the relevant string. - -- Mark unhittable lines - - Add comments for the benefit of the lcov tool, marking - lines that cannot be hit. Typically these are fall-back - protection arms that are already covered by earlier checks, - and so it's not worth taking out the unhittable code (in case - someone changes the code between the two places in future). - -- ares_set_servers_csv.3: make return type match code - -- bitncmp: update comment to match code behaviour - -- ares_striendstr: fix so non-NULL return can happen - - This looks to have been broken since it was first introduced in 2005 in - commit aba0b775ea30 ("Added ares_getnameinfo which mimics the - getnameinfo API") - -- config_sortlist: free any existing sortlist on (re)alloc failure - - If we get an allocation failure on 2nd or later entry in the sortlist, the - code would return ENOMEM but still leave the initial entries allocated. - Ensure that *sortlist is set to NULL whenever ENOMEM is returned. - -- ares_dup: clear new channel on failure - - If the attempt to transfer IPv6 servers from the old to the new channel - fails, the previous code would still return a channel to the user even though - an error return code was generated. This makes it likely that users would - leak the channel, so explicitly clear the channel in this case. - -- ares_init_options: don't lose init failure - - If (say) init_by_options() fails, the subsequent call to - init_by_defaults() was overwriting the return code with - success. Still call init_by_defaults() regardless, but track - its return value separately - -- ares_gethostbyname: don't leak valid-but-empty hostent - - If an AF_UNSPEC query gets a valid response to its AAAA query, - but which has no IPv6 addresses in it, then the code chains on to - a A record query. However, the hostent from the AAAA response - was being leaked along the way (because it gets replaced before - the follow-on end_hquery() invocation). - -- ares_parse_txt_reply: propagate errors from per-substring loop - - If we get an allocation failure when processing a particular substring in a - TXT record, that failure is silently lost; fix that by propagating errors from - the inner loop to the outer loop. - -- process_answer: fix things up correctly when removing EDNS option - - When a server rejects an EDNS-equipped request, we retry without - the EDNS option. However, in TCP mode, the 2-byte length prefix was - being calculated wrong -- it was built from the answer length rather than - the length of the original request. - - Also, it is theoretically possible that the call to realloc() might change - the data pointed to; to allow for this, qbuf also needs updating. - - (Both these fixes were actually included in a patchset sent on the mailing - list in Oct 2012, but were included with other functional changes that - didn't get merged: - http://c-ares.haxx.se/mail/c-ares-archive-2012-10/0004.shtml) - -- ares__read_line: clear buf pointer on realloc failure - -- ares_expand_name: check for valid bits in label length - - The top two bits of the label length indicate whether this is a - label length (00) or an index to a name elsewhere in the message - (11). RFC1035 4.1.4 says that the other possible values for the - top two bits (01, 10) are reserved for future use. - -Daniel Stenberg (23 Jan 2016) -- [Gregor Jasny brought this change] - - Fix typos detected by lintian - - Closes #32 - -- [Gregor Jasny brought this change] - - Distribute all man pages - -- README.cares: s/I/Daniel - - ... and add a pointer to an existing version of the original area 1.1.1 - package.a - -- read_tcp_data: don't try to use NULL pointer after malloc failure - - CID 56884, pointed out by Coverity. We really should make this function - return an error code so that a malloc() failure can return back a major - failure. - -- configure_socket: explicitly ignore return code - - CID 56889 in Coverity pointed out the return code from setsocknonblock() - is ignored, and this added typecast to (void) makes it explicit. - -- ahost: check the select() return code - - Fixes CID 137189, pointed out by Coverity - -David Drysdale (18 Jan 2016) -- Fix buildconf on platforms using glibtoolize - - Commit c49a87eea538 changed buildconf to only check for - libtoolize, but missed a line - -- Don't exit loop early leaving uninitialized entries - - Update for commit affc63cba875d. - - The original patch from Gregor Jasny did not have the break - statement; I incorrectly added it to prevent continuing the loop. - However, the later entries in the array would then be left - uninitialized, causing problems for later cleanup. - - So fix to match Gregor's original patch, with apologies. - -Daniel Stenberg (18 Jan 2016) -- buildconf: remove check for libtool, it only requires libtoolize - -David Drysdale (17 Jan 2016) -- [Gregor Jasny brought this change] - - Use libresolv to initialize cares on iPhone targets - - On iPhone targets like iOS, watchOS or tvOS the file - /etc/resolv.conf cannot be used to configure cares. - - Instead the resolver library is queried for configuration - values. - - CC: Yury Kirpichev <ykirpichev@yandex-team.ru> - -Daniel Stenberg (17 Jan 2016) -- README: updated to new repo URL - -David Drysdale (14 Jan 2016) -- [Lei Shi brought this change] - - Fixing slow DNS lookup issue - - This patch is fixing the dns lookup issue due to dummy dns information - of a disconnected adapter(in my case is a bluetooth adapter). I changed - the dns lookup policy to try GetNetworkParams first because the - GetNetworkParams provides the most reliable dns information (lots of - checks were done by system). I also filter out inoperable adapter in - DNS_AdaptersAddresses in case GetNetworkParams fail. - -- Merge pull request #30 from p-push/vs-2015 - - Support Visual Studio 2015 - -Oleg Pudeyev (3 Jan 2016) -- [Gisle Vanem brought this change] - - Support Visual Studio 2015 - -David Drysdale (11 Nov 2015) -- [Andrew Andkjar brought this change] - - added another version case to Makefile.msvc - - nmake version 11.00.61030.0 resolves to CC_VERS_NUM = 110 - -- Merge pull request #26 from bitbouncer/vs-2013 - - added define for visual studio 2013 - -svante karlsson (25 Jun 2015) -- added define for visual studio 2013 - -Jakub Hrozek (6 Nov 2014) -- ares__read_line: free buf on realloc failure - -- Destroy options if ares_save_options fails - - It's possible that, if ares_save_options failed, the opts structure - would contain some allocated memory. Calling ares_destroy_options in - this case is safe, because ares_save_options zeroes out the memory - initially. - -- [David Drysdale brought this change] - - Continue loop if space for hostname not large enough - - When attempting to build a search domain from the local hostname - (used as a fallback when no other methods have given a search - domain), the code doubles the buffer size on each loop iteration. - - However, the loop previously had a WHILE_FALSE terminator so the continue - statement exited the loop rather than going round again. - -Daniel Stenberg (30 Oct 2014) -- ares_getnameinfo.3: there is no ares_getaddrinfo - -David Drysdale (30 Sep 2014) -- [Gregor Jasny brought this change] - - Prevent tmpbuf from overrunning - - Fix Coverity error CID 56886. - - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -- [Gregor Jasny brought this change] - - Re-start loop if select fails - - Fix Coverity error CID 56882 - - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -- [Gregor Jasny brought this change] - - Free temporary variable in error path - - Fix Coverity CID 56890 - - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -- [Gregor Jasny brought this change] - - Fix integer shift overflow if both tcp_socket and udp_socket are set - - The problem occurs if at the start of the loop the sockindex is at the - last valid ARES_GETSOCK_MAXNUM position. If then both udp_socket and - tcp_socket are valid, sockindex gets incremented for UDP first and - points one entry behind the array for the tcp block. - So the fix is to check after every increment of sockindex if it is still - valid. - - Fix Coverity error CID 56878 - - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -- [Gregor Jasny brought this change] - - Null check before dereference - - Fix Coverity error CID 56880 - - Signed-off-by: Gregor Jasny <gjasny@googlemail.com> - -Jakub Hrozek (28 Jul 2014) -- [Gisle Vanem brought this change] - - Comment in ares_ipv6.h - -David Drysdale (25 Jul 2014) -- CONTRIBUTING: add file to indicate mailing list is preferred - -- Add -t u option to ahost - - Add an option to allow specification of the AF_UNSPEC - address family. - -Jakub Hrozek (24 Jul 2014) -- host_callback: Fall back to AF_INET on searching with AF_UNSPEC - - Previously, when an ares_gethostbyname() searched with AF_UNSPEC and the - first AF_INET6 call only returned CNAMEs, the host_callback never - retried AF_INET. - - This patch makes sure than on ARES_SUCCESS, the result of AF_INET6 is - taken as authoritative only if the result contains some addresses. - -- [David Drysdale brought this change] - - Move memset call below platform-specific declarations - - A GitHub commenter [1] says that my recent change to ahost.c has - problems compiling on Windows + C89 platforms. - - [1] https://github.com/bagder/c-ares/commit/ee22246507c9#commitcomment-6587616 - -- [David Drysdale brought this change] - - Update ahost man page to describe -s option. - - Commit ee22246507c9 added the -s <domain> option to the - ahost command, but neglected to update the man page to - describe it. - - Also fix typo in description of -t option. - -- ares_parse_soa_reply: Do not leak rr_name on allocation failure - - If ares_malloc_data failed, already allocated rr_name would go out of - scope. - -- [David Drysdale brought this change] - - Don't override explicitly specified search domains - - Only set search domains from /etc/resolv.conf if there isn't a value - already present in the channel. - -- [David Drysdale brought this change] - - Allow specification of search domain in ahost - - Add the "-s domain" command line option to override the search - domains. - -Daniel Stenberg (12 May 2014) -- Revert "ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address" - - This reverts commit 440110b303fdbfadb3ad53d30eeb98cc45d70451. - -- [Frederic Germain brought this change] - - ares_parse_aaaa_reply: fix leak when reply contains 1 alias and no address - -- [Doug Kwan brought this change] - - ares_build.h: fix building on 64-bit powerpc - - There are two issues. - - 1. gcc actually does not use __ppc__ and __ppc64__ but __PPC__ and - __PPC64__. The tests of __ILP32__ and __LP64__ are sufficient for gcc. - - 2. clang defines __GNU__ and defines both __ppc64__ and __ppc__ when - targeting ppc64. This makes CARES_SIZEOF_LONG to be 4 on a ppc64 system - when building with clang. - - My patch is two change the order of the checks so that we check the - 64-bit case first. - -- refresh: updated now with automake 1.14 - -- [David Drysdale brought this change] - - single_domain: Invalid memory access for empty string input - - We noticed a small buglet in ares_search() when it gets an empty string - as input -- the single_domain() utility function in ares_search.c - accesses invalid memory (before the start of the string). - -Guenter Knauf (31 Aug 2013) -- Fixed warning 'type specifier missing'. - -Daniel Stenberg (30 Aug 2013) -- [Tor Arntsen brought this change] - - ares_rules.h: CARES_SIZEOF_LONG doesn't exist anymore, don't test for it - - It was removed in f19387dd72432 - -- nowarn: use <limits.h> instead of configure for size of long - - This makes the header file much more multi-arch friendly and can be used - as-is with both 32 bit and 64 bit builds. - -- timeoffset: made static and private - - ares__timeoffset() was only used once within this single source file - -- timeadd: make static - - ares__timeadd() was only ever used from within the same source - -Yang Tse (18 Jul 2013) -- xc-am-iface.m4: comments refinement - -- configure: fix 'subdir-objects' distclean related issue - - See XC_AMEND_DISTCLEAN comments for details. - -- configure: automake 1.14 compatibility tweak (use XC_AUTOMAKE) - -- xc-am-iface.m4: provide XC_AUTOMAKE macro - -Daniel Stenberg (12 May 2013) -- gitignore: ignore all ares_*pdf but also CHANGES.dist - -- bump: start working towards 1.10.1 - -Version 1.10.0 (12 May 2013) - -Daniel Stenberg (12 May 2013) -- RELEASE-NOTES: two more bug fixes - -- [Keith Shaw brought this change] - - ares_set_servers_csv: fixed IPv6 address parsing - - Fixed bug that caused the last part of an IPv6 address to be parsed as - the port number when the last part is all numeric. - -- nroff: fix two syntax mistakes - - ares_parse_a_reply and ares_parse_aaaa_reply both had two \fB instead of - \fP - - Reported-by: Alexander Klauer - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-03/0010.shtml - -- [Alex Loukissas brought this change] - - build: fix build on msvc11 - -- Makefile.am: increment -version-info for 1.10.0 release - -- README: remove unnecessary comment - -- ares_version.h: copyright end range year is now 2013 - -- RELEASE-NOTES: synced with fb0737f3a0a1c37 - -- [Paul Saab brought this change] - - ares_parse_aaaa_reply: Plug memory leak - - This change is similar to ares_parse_a_reply.c in commit - bffd67f16a8f42fe6dbf79ab2e39d92eea05c8a6 - -- [Patrick Valsecchi brought this change] - - ares_parse_txt_reply: return a ares_txt_reply node for each sub-string - - Previously, the function would wrongly return all substrings merged into - one. - -- [Alexander Klauer brought this change] - - library init: documentation update - - This commit updates the documentation of ares_library_init() and - ares_library_cleanup() with regard to the newly introduced reference - counting of initializations and deinitializations. - -- [Alexander Klauer brought this change] - - library init: be recursive - - Previously, a single call to ares_library_cleanup() would deinitialise - the c-ares library, regardless of how many times ares_library_init() was - called. This behaviour may cause problems in programs linking two or - more libraries which, in turn, use c-ares. The present commit fixes this - problem, deinitializing the library only after a number of calls to - ares_library_cleanup() matching the number of calls to - ares_library_init(). - -- [Patrick Valsecchi brought this change] - - protocol parsing: check input data stricter - - ... so that bad length fields aren't blindly accepted - - Bug: http://c-ares.haxx.se/mail/c-ares-archive-2013-04/0016.shtml - -Guenter Knauf (11 Apr 2013) -- Create ares_build.h when buidling from Git. - -- Added -DCARES_STATICLIB to CFLAGS. - - Currently this static makefile does only support building the - static library libcares.a. - -Daniel Stenberg (8 Apr 2013) -- [Alexander Klauer brought this change] - - .gitignore: ignore patch files - - This commit adds a line to .gitignore to the effect that patch files - generated by 'git format-patch' are excluded from the repository. - -- [Alexander Klauer brought this change] - - ares_destroy() documentation: no new requests - - Clarify that no new requests may be added to a resolver channel that is - currently being destroyed. - -- [Alexander Klauer brought this change] - - Documentation: properly document ARES_ECANCELLED - - This commit clarifies the behaviour of ares_cancel() with respect to - callbacks and adds missing documentation of ARES_ECANCELLED to the man - pages of the affected functions. - -- [Alexander Klauer brought this change] - - ares_cancel(): cancel requests safely - - An invocation of ares_cancel() walks through the request list, calling - the callbacks of all pending requests on a channel. Previously, if such - a callback added a new request to the channel, the request list might - not end up empty, causing an abort by assertion failure. The present - commit ensures that precisely all requests present upon entry of - ares_cancel() are cancelled, and that adding new requests through - callbacks is safe. - -Yang Tse (10 Mar 2013) -- ares.h: stricter CARES_EXTERN linkage decorations logic - - No API change involved. - -- ares_build.h.dist: enhance non-configure GCC ABI detection logic - - GCC specific adjustments: - - - check __ILP32__ before 32 and 64bit processor architectures in - order to detect ILP32 programming model on 64 bit processors - which, of course, also support LP64 programming model, when using - gcc 4.7 or newer. - - - keep 32bit processor architecture checks in order to support gcc - versions older than 4.7 which don't define __ILP32__ - - - check __LP64__ for gcc 3.3 and newer, while keeping 64bit processor - architecture checks for older versions which don't define __LP64__ - -Daniel Stenberg (9 Mar 2013) -- ares.h: there is no ares_free_soa function diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt index 2718ce52b73ff6..a2a9c19329e09b 100644 --- a/deps/cares/CMakeLists.txt +++ b/deps/cares/CMakeLists.txt @@ -1,6 +1,6 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0) +CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0...3.10.0) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") @@ -12,10 +12,10 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.28.1" ) +PROJECT (c-ares LANGUAGES C VERSION "1.34.6" ) # Set this version before release -SET (CARES_VERSION "1.28.1") +SET (CARES_VERSION "${PROJECT_VERSION}") INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong. @@ -30,7 +30,7 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "15:1:13") +SET (CARES_LIB_VERSIONINFO "21:5:19") OPTION (CARES_STATIC "Build as a static library" OFF) @@ -42,17 +42,9 @@ OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARE OPTION (CARES_BUILD_TOOLS "Build tools" ON) OPTION (CARES_SYMBOL_HIDING "Hide private symbols in shared libraries" OFF) OPTION (CARES_THREADS "Build with thread-safety support" ON) +OPTION (CARES_COVERAGE "Build for code coverage" OFF) SET (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom") - -# Tests require a C++14 compiler -IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) - set(CMAKE_CXX_STANDARD 14) - set(CMAKE_CXX_STANDARD_REQUIRED TRUE) - set(CMAKE_CXX_EXTENSIONS FALSE) - enable_language(CXX) -ENDIF () - # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols IF ((CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) AND (NOT CARES_STATIC) AND WIN32) SET (CARES_STATIC ON) @@ -62,8 +54,8 @@ ENDIF () INCLUDE (EnableWarnings) -# allow linking against the static runtime library in msvc IF (MSVC) + # allow linking against the static runtime library in msvc OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF) IF (CARES_MSVC_STATIC_RUNTIME) # CMAKE_CONFIGURATION_TYPES is empty on non-IDE generators (Ninja, NMake) @@ -172,7 +164,7 @@ return 0; MACOS_V1012) ENDIF () -IF ((IOS OR APPLE OR ZOS) AND HAVE_LIBRESOLV) +IF (ZOS AND HAVE_LIBRESOLV) SET (CARES_USE_LIBRESOLV 1) ENDIF() @@ -227,7 +219,6 @@ CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H) CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H) CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H) -CHECK_INCLUDE_FILES (sys/random.h HAVE_SYS_RANDOM_H) CHECK_INCLUDE_FILES (sys/event.h HAVE_SYS_EVENT_H) CHECK_INCLUDE_FILES (sys/epoll.h HAVE_SYS_EPOLL_H) CHECK_INCLUDE_FILES (ifaddrs.h HAVE_IFADDRS_H) @@ -263,21 +254,25 @@ ENDIF () # Set system-specific compiler flags IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin") LIST (APPEND SYSFLAGS -D_DARWIN_C_SOURCE) -ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux") +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android") LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700) ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "SunOS") - LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=700) + LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=600) ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=700 -D_USE_IRS) -ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "MidnightBSD") # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "QNX") + LIST (APPEND SYSFLAGS -D_QNX_SOURCE) ELSEIF (WIN32) - LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602) + LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) + IF (NOT CMAKE_C_FLAGS MATCHES ".*-D_WIN32_WINNT=.*") + LIST (APPEND SYSFLAGS -D_WIN32_WINNT=0x0602) + ENDIF () ENDIF () ADD_DEFINITIONS(${SYSFLAGS}) - # Tell C-Ares about libraries to depend on IF (HAVE_LIBRESOLV) LIST (APPEND CARES_DEPENDENT_LIBS resolv) @@ -341,7 +336,6 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H sys/sockio.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_STAT_H sys/stat.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H sys/uio.h) -CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_RANDOM_H sys/random.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_EVENT_H sys/event.h) CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_EPOLL_H sys/epoll.h) CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h) @@ -407,10 +401,12 @@ ENDIF () CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C) - +CHECK_SYMBOL_EXISTS (strnlen "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNLEN) +CHECK_SYMBOL_EXISTS (memmem "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MEMMEM) CHECK_SYMBOL_EXISTS (closesocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET) CHECK_SYMBOL_EXISTS (CloseSocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET_CAMEL) CHECK_SYMBOL_EXISTS (connect "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONNECT) +CHECK_SYMBOL_EXISTS (connectx "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONNECTX) CHECK_SYMBOL_EXISTS (fcntl "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FCNTL) CHECK_SYMBOL_EXISTS (freeaddrinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FREEADDRINFO) CHECK_SYMBOL_EXISTS (getaddrinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETADDRINFO) @@ -423,8 +419,13 @@ CHECK_SYMBOL_EXISTS (getservbyname_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERV CHECK_SYMBOL_EXISTS (gettimeofday "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETTIMEOFDAY) CHECK_SYMBOL_EXISTS (if_indextoname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IF_INDEXTONAME) CHECK_SYMBOL_EXISTS (if_nametoindex "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IF_NAMETOINDEX) +CHECK_SYMBOL_EXISTS (GetBestRoute2 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETBESTROUTE2) CHECK_SYMBOL_EXISTS (ConvertInterfaceIndexToLuid "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONVERTINTERFACEINDEXTOLUID) CHECK_SYMBOL_EXISTS (ConvertInterfaceLuidToNameA "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONVERTINTERFACELUIDTONAMEA) +CHECK_SYMBOL_EXISTS (NotifyIpInterfaceChange "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_NOTIFYIPINTERFACECHANGE) +CHECK_SYMBOL_EXISTS (RegisterWaitForSingleObject "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_REGISTERWAITFORSINGLEOBJECT) + + CHECK_SYMBOL_EXISTS (inet_net_pton "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_NET_PTON) IF (NOT WIN32) # Disabled on Windows, because these functions are only really supported on Windows @@ -439,6 +440,7 @@ CHECK_SYMBOL_EXISTS (IoctlSocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTLSO CHECK_SYMBOL_EXISTS (recv "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECV) CHECK_SYMBOL_EXISTS (recvfrom "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECVFROM) CHECK_SYMBOL_EXISTS (send "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SEND) +CHECK_SYMBOL_EXISTS (sendto "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SENDTO) CHECK_SYMBOL_EXISTS (setsockopt "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SETSOCKOPT) CHECK_SYMBOL_EXISTS (socket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKET) CHECK_SYMBOL_EXISTS (strcasecmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRCASECMP) @@ -495,7 +497,6 @@ IF (CARES_THREADS) CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_H pthread.h) CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_NP_H pthread_np.h) CHECK_SYMBOL_EXISTS (pthread_init "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PTHREAD_INIT) - # Make sure libcares.pc.cmake knows about thread libraries on static builds LIST (APPEND CARES_DEPENDENT_LIBS ${CMAKE_THREAD_LIBS_INIT}) ELSE () MESSAGE (WARNING "Threading support not found, disabling...") @@ -566,7 +567,7 @@ SET (RECVFROM_TYPE_ARG5 "struct sockaddr *") SET (RECV_TYPE_ARG4 int) SET (GETNAMEINFO_TYPE_ARG1 "struct sockaddr *") SET (GETNAMEINFO_TYPE_ARG7 int) -SET (SEND_TYPE_ARG2 "void *") +SET (SEND_TYPE_ARG2 "const void *") SET (SEND_TYPE_ARG4 int) ################################################################################ @@ -620,6 +621,7 @@ IF (HAVE_GETADDRINFO) CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR + CMAKE_SYSTEM_NAME STREQUAL "MidnightBSD" OR CMAKE_SYSTEM_NAME STREQUAL "AIX" OR WIN32) SET (HAVE_GETADDRINFO_THREADSAFE 1) @@ -665,6 +667,9 @@ ENDIF () IF (HAVE_SYS_SOCKET_H) SET (CARES_HAVE_SYS_SOCKET_H 1) ENDIF() +IF (HAVE_SYS_SELECT_H) + SET (CARES_HAVE_SYS_SELECT_H 1) +ENDIF() IF (HAVE_WS2TCPIP_H) SET (CARES_HAVE_WS2TCPIP_H 1) ENDIF() @@ -681,6 +686,26 @@ IF (HAVE_ARPA_NAMESER_COMPAT_H) SET (CARES_HAVE_ARPA_NAMESER_COMPAT_H 1) ENDIF() +# Coverage +IF (CARES_COVERAGE) + # set compiler flags + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs") + + # find required tools + FIND_PROGRAM(LCOV lcov REQUIRED) + FIND_PROGRAM(GENHTML genhtml REQUIRED) + + # add coverage target + ADD_CUSTOM_TARGET(coverage + # gather data + COMMAND ${LCOV} --directory . --capture --output-file coverage.info + # generate report + COMMAND ${GENHTML} --demangle-cpp -o coverage coverage.info + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +ENDIF() + # TRANSFORM_MAKEFILE_INC # # This function consumes the "Makefile.inc" autotools file, and converts it into @@ -727,7 +752,6 @@ IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) ADD_SUBDIRECTORY (test) ENDIF () - # Export targets IF (CARES_INSTALL) SET (CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") @@ -742,17 +766,18 @@ IF (CARES_INSTALL) INSTALL (EXPORT ${PROJECT_NAME}-targets COMPONENT Devel DESTINATION ${CMAKECONFIG_INSTALL_DIR} NAMESPACE ${PROJECT_NAME}::) INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" COMPONENT Devel DESTINATION ${CMAKECONFIG_INSTALL_DIR}) - # pkgconfig support - IF (NOT CARES_SHARED) - FOREACH (LIB ${CARES_DEPENDENT_LIBS}) - SET (CARES_PRIVATE_LIBS "${CARES_PRIVATE_LIBS} -l${LIB}") - ENDFOREACH () - ENDIF () + # pkgconfig support for static builds + FOREACH (LIB ${CARES_DEPENDENT_LIBS}) + IF (NOT LIB MATCHES "^-") + SET (LIB "-l${LIB}") + ENDIF () + SET (CARES_PRIVATE_LIBS "${CARES_PRIVATE_LIBS} ${LIB}") + ENDFOREACH () + CONFIGURE_FILE("libcares.pc.cmake" "libcares.pc" @ONLY) INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/libcares.pc" COMPONENT Devel DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") ENDIF () - # Legacy chain-building variables (provided for compatibility with old code). # Don't use these, external code should be updated to refer to the aliases directly (e.g., Cares::cares). SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND") diff --git a/deps/cares/CONTRIBUTING.md b/deps/cares/CONTRIBUTING.md index a3b5194c78ad5f..a984e430fd75fe 100644 --- a/deps/cares/CONTRIBUTING.md +++ b/deps/cares/CONTRIBUTING.md @@ -4,12 +4,6 @@ Contributing to c-ares To contribute patches to c-ares, please generate a GitHub pull request and follow these guidelines: - - Check that the Travis builds are green for your pull request. + - Check that the CI/CD builds are green for your pull request. - Please update the test suite to add a test case for any new functionality. - - Build the library with `./configure --enable-debug --enable-maintainer-mode` and - ensure there are no new warnings. - -To improve the chances of the c-ares maintainers responding to your request: - - - Also send an email to the mailing list at `c-ares@lists.haxx.se` describing your change. - - To follow any associated discussion, please subscribe to the [mailing list](http://lists.haxx.se/listinfo/c-ares). + - Build the library on your own machine and ensure there are no new warnings. diff --git a/deps/cares/DEVELOPER-NOTES.md b/deps/cares/DEVELOPER-NOTES.md new file mode 100644 index 00000000000000..c8a2f0b762407b --- /dev/null +++ b/deps/cares/DEVELOPER-NOTES.md @@ -0,0 +1,47 @@ +Developer Notes +=============== + +* The distributed `ares_build.h` in the official release tarballs is only + intended to be used on systems which can also not run the also distributed + `configure` or `CMake` scripts. It is generated as a copy of + `ares_build.h.dist` as can be seen in the code repository. + +* If you check out from git on a non-`configure` or `CMake` platform, you must run + the appropriate `buildconf*` script to set up `ares_build.h` and other local + files before being able to compile the library. There are pre-made makefiles + for a subset of such systems such as Watcom, NMake, and MinGW Makefiles. + +* On systems capable of running the `configure` or `CMake` scripts, the process + will overwrite the distributed `ares_build.h` file with one that is suitable + and specific to the library being configured and built, this new file is + generated from the `ares_build.h.in` and `ares_build.h.cmake` template files. + +* If you intend to distribute an already compiled c-ares library you **MUST** + also distribute along with it the generated `ares_build.h` which has been + used to compile it. Otherwise, the library will be of no use for the users of + the library that you have built. It is **your** responsibility to provide this + file. No one at the c-ares project can know how you have built the library. + The generated file includes platform and configuration dependent info, + and must not be modified by anyone. + +* We support both the AutoTools `configure` based build system as well as the + `CMake` build system. Any new code changes must work with both. + +* The files that get compiled and are present in the distribution are referenced + in the `Makefile.inc` in the current directory. This file gets included in + every build system supported by c-ares so that the list of files doesn't need + to be maintained per build system. Don't forget to reference new header files + otherwise they won't be included in the official release tarballs. + +* We cannot assume anything else but very basic C89 compiler features being + present. The lone exception is the requirement for 64bit integers which is + not a requirement for C89 compilers to support. Please do not use any extended + features released by later standards. + +* Newlines must remain unix-style for older compilers' sake. + +* Comments must be written in the old-style `/* unnested C-fashion */` + +* Try to keep line lengths below 80 columns and formatted as the existing code. + There is a `.clang-format` in the repository that can be used to run the + automated code formatter as such: `clang-format -i */*.c */*.h */*/*.c */*/*.h` diff --git a/deps/cares/INSTALL.md b/deps/cares/INSTALL.md index de766aad283d1b..dc58ab8c0457ca 100644 --- a/deps/cares/INSTALL.md +++ b/deps/cares/INSTALL.md @@ -1,5 +1,3 @@ -** This file is adapted from libcurl and not yet fully rewritten for c-ares! ** - ``` ___ __ _ _ __ ___ ___ / __| ___ / _` | '__/ _ \/ __| @@ -44,7 +42,7 @@ unpacked the source archive): You probably need to be root when doing the last command. If you have checked out the sources from the git repository, read the -[GIT-INFO](GIT_INFO) on how to proceed. +[GIT-INFO](GIT-INFO) on how to proceed. Get a full listing of all available configure options by invoking it like: @@ -309,6 +307,16 @@ first to rebuild every single library your app uses as well as your app using the debug multithreaded dynamic C runtime. +### MSYS + +Building is supported for native windows via both AutoTools and CMake. When +building with autotools, you can only build either a shared version or a static +version (use `--disable-shared` or `--disable-static`). CMake can build both +simultaneously. + +All of the MSYS environments are supported: `MINGW32`, `MINGW64`, `UCRT64`, +`CLANG32`, `CLANG64`, `CLANGARM64`. + ### MingW32 Make sure that MinGW32's bin dir is in the search path, for example: @@ -341,6 +349,26 @@ add `-DCARES_STATICLIB` to your `CFLAGS`. Otherwise the linker will look for dynamic import symbols. +DOS +--- + +c-ares supports building as a 32bit protected mode application via +[DJGPP](https://www.delorie.com/djgpp/). It is recommended to use a DJGPP +cross compiler from [Andrew Wu](https://github.com/andrewwutw/build-djgpp) +as building directly in a DOS environment can be difficult. + +It is required to also have [Watt-32](https://www.watt-32.net/) available +built using the same compiler. It is recommended to build the latest `master` +branch from [GitHub](https://github.com/sezero/watt32/tree/master). + +Finally, the `DJ_PREFIX` and `WATT_ROOT` environment variables must be set +appropriately before calling `make Makefile.dj` to build c-ares. + +Please refer to our CI +[GitHub Actions Workflow](https://github.com/c-ares/c-ares/blob/main/.github/workflows/djgpp.yml) +for a full build example, including building the latest Watt-32 release. + + IBM OS/2 -------- @@ -420,20 +448,25 @@ This is a probably incomplete list of known hardware and operating systems that c-ares has been compiled for. If you know a system c-ares compiles and runs on, that isn't listed, please let us know! - - Alpha Tru64 v5.0 5.1 - - ARM Android 1.5, 2.1, 2.3 - - MIPS IRIX 6.2, 6.5 - - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 - - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 - - i386 Novell NetWare - - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 - - x86_64 Linux + - Linux (i686, x86_64, AARCH64, and more) + - MacOS 10.4+ + - iOS + - Windows 8+ (i686, x86_64) + - Android (ARM, AARCH64, x86_64) + - FreeBSD + - NetBSD + - OpenBSD + - Solaris (SPARC, x86_64) + - AIX (POWER) + - Tru64 (Alpha) + - IRIX (MIPS) + - Novell NetWare (i386) Useful URLs =========== - c-ares: https://c-ares.org/ - - MingW: http://www.mingw.org/ - MinGW-w64: http://mingw-w64.sourceforge.net/ + - MSYS2: https://msys2.org - OpenWatcom: http://www.openwatcom.org/ diff --git a/deps/cares/LICENSE.md b/deps/cares/LICENSE.md index 134145428aae48..910ddded5c7a69 100644 --- a/deps/cares/LICENSE.md +++ b/deps/cares/LICENSE.md @@ -1,9 +1,6 @@ -# c-ares license - MIT License - -Copyright (c) 1998 Massachusetts Institute of Technology +Copyright (c) 1998 Massachusetts Institute of Technology Copyright (c) 2007 - 2023 Daniel Stenberg with many contributors, see AUTHORS file. diff --git a/deps/cares/Makefile.Watcom b/deps/cares/Makefile.Watcom index 0cbae5c53c3255..1e445f287a54cc 100644 --- a/deps/cares/Makefile.Watcom +++ b/deps/cares/Makefile.Watcom @@ -42,8 +42,9 @@ RD = rmdir /q /s 2>NUL CP = copy CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -aa & - -wcd=201 -bt=nt -d+ -dWIN32 -dCARES_BUILDING_LIBRARY & - -dNTDDI_VERSION=0x06020000 -I. -I.\include -I.\src\lib $(SYS_INCL) + -wcd=201 -bt=nt -d+ -dCARES_BUILDING_LIBRARY & + -dNTDDI_VERSION=0x06020000 -I. -I.\include -I.\src\lib -I.\src\lib\include & + $(SYS_INCL) LFLAGS = option quiet, map, caseexact, eliminate @@ -97,7 +98,19 @@ all: $(ARESBUILDH) $(OBJ_BASE) $(TARGETS) $(DEMOS) .SYMBOLIC $(OBJ_BASE): -$(MD) $^@ -$(MD) $^@\stat + -$(MD) $^@\stat\dsa + -$(MD) $^@\stat\event + -$(MD) $^@\stat\legacy + -$(MD) $^@\stat\record + -$(MD) $^@\stat\str + -$(MD) $^@\stat\util -$(MD) $^@\dyn + -$(MD) $^@\dyn\dsa + -$(MD) $^@\dyn\event + -$(MD) $^@\dyn\legacy + -$(MD) $^@\dyn\record + -$(MD) $^@\dyn\str + -$(MD) $^@\dyn\util -$(MD) $^@\tools $(ARESBUILDH): .EXISTSONLY @@ -112,7 +125,7 @@ $(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG) $(OBJ_BASE)\tools\ares_getopt.obj: $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\tools\ares_getopt.c -fo=$^@ -adig.exe: $(OBJ_BASE)\tools\ares_getopt.obj $(LIBNAME).lib +adig.exe: $(LIBNAME).lib $(CC) $(CFLAGS) src\tools\adig.c -fo=$(OBJ_BASE)\tools\adig.obj $(LD) name $^@ system nt $(LFLAGS) file { $(OBJ_BASE)\tools\adig.obj $[@ } library $]@, ws2_32.lib, iphlpapi.lib @@ -129,7 +142,19 @@ vclean realclean: clean .SYMBOLIC -$(RM) $(TARGETS) $(LIBNAME).map -$(RM) $(DEMOS) $(DEMOS:.exe=.map) -$(RD) $(OBJ_BASE)\stat + -$(RD) $(OBJ_BASE)\stat\dsa + -$(RD) $(OBJ_BASE)\stat\event + -$(RD) $(OBJ_BASE)\stat\legacy + -$(RD) $(OBJ_BASE)\stat\record + -$(RD) $(OBJ_BASE)\stat\str + -$(RD) $(OBJ_BASE)\stat\util -$(RD) $(OBJ_BASE)\dyn + -$(RD) $(OBJ_BASE)\dyn\dsa + -$(RD) $(OBJ_BASE)\dyn\event + -$(RD) $(OBJ_BASE)\dyn\legacy + -$(RD) $(OBJ_BASE)\dyn\record + -$(RD) $(OBJ_BASE)\dyn\str + -$(RD) $(OBJ_BASE)\dyn\util -$(RD) $(OBJ_BASE)\tools -$(RD) $(OBJ_BASE) @@ -144,10 +169,58 @@ $(RESOURCE): src\lib\cares.rc .AUTODEPEND .c{$(OBJ_BASE)\dyn}.obj: $(CC) $(CFLAGS) -bd .\src\lib\$^& -fo=$^@ +.ERASE +{dsa}.c{$(OBJ_BASE)\dyn\dsa}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\dsa\$^& -fo=$^@ + +.ERASE +{event}.c{$(OBJ_BASE)\dyn\event}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\event\$^& -fo=$^@ + +.ERASE +{legacy}.c{$(OBJ_BASE)\dyn\legacy}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\legacy\$^& -fo=$^@ + +.ERASE +{record}.c{$(OBJ_BASE)\dyn\record}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\record\$^& -fo=$^@ + +.ERASE +{str}.c{$(OBJ_BASE)\dyn\str}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\str\$^& -fo=$^@ + +.ERASE +{util}.c{$(OBJ_BASE)\dyn\util}.obj: + $(CC) $(CFLAGS) -bd .\src\lib\util\$^& -fo=$^@ + .ERASE .c{$(OBJ_BASE)\stat}.obj: $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\$^& -fo=$^@ +.ERASE +{dsa}.c{$(OBJ_BASE)\stat\dsa}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\dsa\$^& -fo=$^@ + +.ERASE +{event}.c{$(OBJ_BASE)\stat\event}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\event\$^& -fo=$^@ + +.ERASE +{legacy}.c{$(OBJ_BASE)\stat\legacy}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\legacy\$^& -fo=$^@ + +.ERASE +{record}.c{$(OBJ_BASE)\stat\record}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\record\$^& -fo=$^@ + +.ERASE +{str}.c{$(OBJ_BASE)\stat\str}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\str\$^& -fo=$^@ + +.ERASE +{util}.c{$(OBJ_BASE)\stat\util}.obj: + $(CC) $(CFLAGS) -DCARES_STATICLIB .\src\lib\util\$^& -fo=$^@ + $(LINK_ARG): $(__MAKEFILES__) %create $^@ @%append $^@ system nt dll diff --git a/deps/cares/Makefile.am b/deps/cares/Makefile.am index a545f8e374f7c0..51b5f6be32be78 100644 --- a/deps/cares/Makefile.am +++ b/deps/cares/Makefile.am @@ -3,17 +3,24 @@ # Copyright (C) the Massachusetts Institute of Technology. # Copyright (C) Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# 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 (including the next +# paragraph) 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. # # SPDX-License-Identifier: MIT # @@ -22,15 +29,15 @@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install -MSVCFILES = msvc_ver.inc buildconf.bat +MSVCFILES = buildconf.bat # adig and ahost are just sample programs and thus not mentioned with the # regular sources and headers -EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES.md \ - c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ - maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ +EXTRA_DIST = AUTHORS $(man_MANS) RELEASE-NOTES.md \ + c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf \ + README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + Makefile.Watcom CONTRIBUTING.md SECURITY.md DEVELOPER-NOTES.md \ cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) diff --git a/deps/cares/Makefile.dj b/deps/cares/Makefile.dj index 2f22188863886b..8dca20cb42b4c3 100644 --- a/deps/cares/Makefile.dj +++ b/deps/cares/Makefile.dj @@ -5,8 +5,14 @@ # include src/lib/Makefile.inc -CSOURCES := $(addprefix src/lib/, $(CSOURCES)) -CSOURCES := $(filter-out src/lib/windows_port.c, $(CSOURCES)) +OBJ_DIR = djgpp +OBJECTS = $(addprefix $(OBJ_DIR)/, \ + $(CSOURCES:.c=.o)) + +CSRC = $(addprefix src/lib/, $(CSOURCES)) +#CSRC := $(filter-out src/lib/windows_port.c, $(CSOURCES)) + +OBJ_SUBDIRS = $(OBJ_DIR)/dsa $(OBJ_DIR)/event $(OBJ_DIR)/legacy $(OBJ_DIR)/record $(OBJ_DIR)/str $(OBJ_DIR)/util VPATH = src/lib src/tools @@ -17,13 +23,52 @@ VPATH = src/lib src/tools WATT32_ROOT = $(realpath $(WATT_ROOT)) WATT32_LIB = $(WATT32_ROOT)/lib/libwatt.a -OBJ_DIR = djgpp - -CFLAGS = -g -O2 -I./include -I./src/lib \ - -I$(WATT32_ROOT)/inc -Wall \ +CFLAGS = -g -O2 -I./include -I./src/lib -I./src/lib/include \ + -I$(WATT32_ROOT)/inc \ + -Wall \ + -Wextra \ + -Waggregate-return \ + -Wcast-align \ + -Wcast-qual \ + -Wconversion \ + -Wdeclaration-after-statement \ + -Wdouble-promotion \ + -Wfloat-equal \ + -Winit-self \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-include-dirs \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-coverage-mismatch \ + -Wold-style-definition \ + -Wpacked \ + -Wpointer-arith \ + -Wshadow \ + -Wsign-conversion \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wtrampolines \ + -Wundef \ + -Wunreachable-code \ + -Wunused \ + -Wvariadic-macros \ + -Wvla \ + -Wwrite-strings \ + -Werror=implicit-int \ + -Werror=implicit-function-declaration \ + -Wno-long-long \ -DWATT32 -DHAVE_CONFIG_H \ + -D_REENTRANT \ + -DCARES_NO_DEPRECATED \ -Dselect=select_s +# Can't enable -Wredundant-decls due to WATT32 issues + + LDFLAGS = -s ifeq ($(OS),Windows_NT) @@ -41,9 +86,6 @@ else CC = gcc endif -OBJECTS = $(addprefix $(OBJ_DIR)/, \ - $(notdir $(CSOURCES:.c=.o))) - GENERATED = src/lib/ares_config.h \ include/ares_build.h @@ -51,7 +93,7 @@ TARGETS = libcares.a adig.exe ahost.exe .SECONDARY: $(OBJ_DIR)/ares_getopt.o -all: $(OBJ_DIR) $(GENERATED) $(TARGETS) +all: $(OBJ_DIR) $(OBJ_SUBDIRS) $(GENERATED) $(TARGETS) @echo Welcome to c-ares. libcares.a: $(OBJECTS) @@ -70,15 +112,19 @@ include/ares_build.h: include/ares_build.h.dist # clean: - rm -f depend.dj $(GENERATED) $(OBJ_DIR)/*.o - - rmdir $(OBJ_DIR) + - rmdir $(OBJ_SUBDIRS) # Clean everything # realclean vclean: clean - rm -f $(TARGETS) $(TARGETS:.exe=.map) -$(OBJ_DIR): - - mkdir $@ +.PHONY: obj_subdirs $(OBJ_SUBDIRS) + +obj_subdirs: $(OBJ_SUBDIRS) + +$(OBJ_SUBDIRS): + mkdir $@ $(OBJ_DIR)/%.o: %.c $(CC) $(CFLAGS) -o $@ -c $< @@ -97,7 +143,7 @@ DEP_REPLACE = sed -e 's@\(.*\)\.o: @\n$$(OBJ_DIR)\/\1.o: @' \ # a foreign 'curl_config.h' is making trouble. # depend: $(GENERATED) Makefile.dj - $(CC) -MM $(CFLAGS) $(CSOURCES) | $(DEP_REPLACE) > depend.dj + $(CC) -MM $(CFLAGS) $(CSRC) | $(DEP_REPLACE) > depend.dj -include depend.dj diff --git a/deps/cares/Makefile.in b/deps/cares/Makefile.in index 928cdc217ee6de..ba5253f890c1b5 100644 --- a/deps/cares/Makefile.in +++ b/deps/cares/Makefile.in @@ -19,17 +19,24 @@ # Copyright (C) the Massachusetts Institute of Technology. # Copyright (C) Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# 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 (including the next +# paragraph) 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. # # SPDX-License-Identifier: MIT # @@ -111,7 +118,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -121,12 +130,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -230,11 +236,9 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libcares.pc.in \ $(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ - $(top_srcdir)/config/missing AUTHORS INSTALL.md NEWS README.md \ - TODO compile config.guess config.sub config/compile \ - config/config.guess config/config.sub config/install-sh \ - config/ltmain.sh config/missing depcomp install-sh ltmain.sh \ - missing + $(top_srcdir)/config/missing AUTHORS INSTALL.md README.md \ + config/compile config/config.guess config/config.sub \ + config/install-sh config/ltmain.sh config/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -327,10 +331,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -437,15 +446,15 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install -MSVCFILES = msvc_ver.inc buildconf.bat +MSVCFILES = buildconf.bat # adig and ahost are just sample programs and thus not mentioned with the # regular sources and headers -EXTRA_DIST = AUTHORS CHANGES README.cares $(man_MANS) RELEASE-NOTES.md \ - c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf get_ver.awk \ - maketgz TODO README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ +EXTRA_DIST = AUTHORS $(man_MANS) RELEASE-NOTES.md \ + c-ares-config.cmake.in libcares.pc.cmake libcares.pc.in buildconf \ + README.msvc $(MSVCFILES) INSTALL.md README.md LICENSE.md \ CMakeLists.txt Makefile.dj Makefile.m32 Makefile.netware Makefile.msvc \ - Makefile.Watcom AUTHORS CONTRIBUTING.md SECURITY.md TODO \ + Makefile.Watcom CONTRIBUTING.md SECURITY.md DEVELOPER-NOTES.md \ cmake/EnableWarnings.cmake CLEANFILES = $(PDFPAGES) $(HTMLPAGES) diff --git a/deps/cares/Makefile.m32 b/deps/cares/Makefile.m32 index a01fe235d1311c..427b08771e1535 100644 --- a/deps/cares/Makefile.m32 +++ b/deps/cares/Makefile.m32 @@ -19,7 +19,9 @@ RANLIB = $(CROSSPREFIX)ranlib #RM = rm -f CP = cp -afv -CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -D_WIN32_WINNT=0x0602 +WIN32_WINNT ?= 0x0602 + +CFLAGS = $(CARES_CFLAG_EXTRAS) -O2 -Wall -I./include -I./src/lib -I./src/lib/include -D_WIN32_WINNT=$(WIN32_WINNT) CFLAGS += -DCARES_STATICLIB LDFLAGS = $(CARES_LDFLAG_EXTRAS) -s LIBS = -lws2_32 -liphlpapi @@ -64,7 +66,6 @@ install: ${INSTALL} -m 444 ${srcdir}/include/ares.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_build.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_dns_record.h ${DESTDIR}${includedir} - ${INSTALL} -m 444 ${srcdir}/include/ares_rules.h ${DESTDIR}${includedir} ${INSTALL} -m 444 ${srcdir}/include/ares_version.h ${DESTDIR}${includedir} (for man in $(MANPAGES); do \ ${INSTALL} -m 444 ${srcdir}/$${man} ${DESTDIR}${mandir}/man3; \ diff --git a/deps/cares/Makefile.msvc b/deps/cares/Makefile.msvc index f6e8f4e71f2e6f..3266db415e09fe 100644 --- a/deps/cares/Makefile.msvc +++ b/deps/cares/Makefile.msvc @@ -1,17 +1,24 @@ # Copyright (C) 2009-2013 by Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# 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 (including the next +# paragraph) 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. # # SPDX-License-Identifier: MIT @@ -71,12 +78,9 @@ RTLIBD = /MTd # otherwise Winsock tcp/ip stack will be used as default. # -------------------------------------------------------- +!IFNDEF USE_WATT32 USE_WATT32 = 0 - -# -------------------------------------------------------- -# Detect compiler version. -# -------------------------------------------------------- -!INCLUDE .\msvc_ver.inc +!ENDIF # ---------------------------------------------------- # Verify that current subdir is the c-ares source one @@ -176,40 +180,26 @@ PROG3_OBJDIR = $(PROG3_OUTDIR)\obj # ------------------------------------- !IF "$(USE_WATT32)" == "1" -CFLAGS = /UWIN32 /DWATT32 /I$(WATT_ROOT)\inc -EX_LIBS_REL = $(WATT_ROOT)\lib\wattcpvc_imp.lib -EX_LIBS_DBG = $(WATT_ROOT)\lib\wattcpvc_imp_d.lib +CFLAGS = /D_WIN32_WINNT=0x0602 /DWATT32 /I$(WATT_ROOT)\inc +! IFNDEF PLATFORM +PLATFORM = x86 +! ENDIF +EX_LIBS_REL = $(WATT_ROOT)\lib\$(PLATFORM)\wattcpvc_imp.lib advapi32.lib +EX_LIBS_DBG = $(WATT_ROOT)\lib\$(PLATFORM)\wattcpvc_imp_d.lib advapi32.lib !ELSE -CFLAGS = /DWIN32 /D_WIN32_WINNT=0x0602 +CFLAGS = /D_WIN32_WINNT=0x0602 EX_LIBS_REL = ws2_32.lib advapi32.lib kernel32.lib iphlpapi.lib EX_LIBS_DBG = ws2_32.lib advapi32.lib kernel32.lib iphlpapi.lib !ENDIF -# ------------------------------------------------- -# Switches that depend on ancient compiler versions -# ------------------------------------------------- - -!IF $(CC_VERS_NUM) == 60 -PDB_NONE = /pdb:none -PDBTYPE_CONSOLIDATE = /pdbtype:consolidate -!ELSE -!UNDEF PDB_NONE -!UNDEF PDBTYPE_CONSOLIDATE -!ENDIF - -!IF $(CC_VERS_NUM) <= 70 -RT_ERROR_CHECKING = /GZ -!ELSE -RT_ERROR_CHECKING = /RTCsu -!ENDIF # ---------------------------- # Assorted commands and flags # ---------------------------- CC_CMD_REL = cl.exe /nologo $(RTLIB) /DNDEBUG /O2 -CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi $(RT_ERROR_CHECKING) -CC_CFLAGS = $(CFLAGS) /I.\src\lib /I.\include /W3 /EHsc /FD +CC_CMD_DBG = cl.exe /nologo $(RTLIBD) /D_DEBUG /Od /Zi /RTCsu +CC_CFLAGS = $(CFLAGS) /D_REENTRANT /I.\src\lib /I.\include /I.\src\lib\include /W3 /EHsc /FD RC_CMD_REL = rc.exe /l 0x409 /d "NDEBUG" RC_CMD_DBG = rc.exe /l 0x409 /d "_DEBUG" @@ -218,8 +208,8 @@ LINK_CMD_LIB = link.exe /lib /nologo LINK_CMD_DLL = link.exe /dll /nologo /incremental:no /fixed:no LINK_CMD_EXE = link.exe /nologo /incremental:no /fixed:no /subsystem:console -LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release $(PDB_NONE) -LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug $(PDBTYPE_CONSOLIDATE) +LINK_CMD_EXE_REL = $(LINK_CMD_EXE) /release +LINK_CMD_EXE_DBG = $(LINK_CMD_EXE) /debug # --------------------------------- # Configuration dependent settings @@ -250,7 +240,7 @@ CC_CMD = $(CC_CMD_DBG) !IF "$(CFG)" == "dll-release" CARES_TARGET = $(DYN_LIB_REL).dll CARES_CFLAGS = /DCARES_BUILDING_LIBRARY -CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib $(PDB_NONE) +CARES_LFLAGS = /release $(EX_LIBS_REL) /implib:$(CARES_OUTDIR)\$(IMP_LIB_REL).lib SPROG_CFLAGS = /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_REL) $(IMP_LIB_REL).lib CARES_LINK = $(LINK_CMD_DLL) @@ -263,7 +253,7 @@ RC_CMD = $(RC_CMD_REL) !IF "$(CFG)" == "dll-debug" CARES_TARGET = $(DYN_LIB_DBG).dll CARES_CFLAGS = /DCARES_BUILDING_LIBRARY /DDEBUGBUILD -CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb $(PDBTYPE_CONSOLIDATE) +CARES_LFLAGS = /debug $(EX_LIBS_DBG) /implib:$(CARES_OUTDIR)\$(IMP_LIB_DBG).lib /pdb:$(CARES_OUTDIR)\$(DYN_LIB_DBG).pdb SPROG_CFLAGS = /DCARES_NO_DEPRECATED SPROG_LFLAGS = /libpath:$(CARES_OUTDIR) $(EX_LIBS_DBG) $(IMP_LIB_DBG).lib CARES_LINK = $(LINK_CMD_DLL) @@ -294,6 +284,7 @@ RC_CMD = $(RC_CMD_DBG) !ERROR Problem generating CARES_OBJS list. !ENDIF CARES_OBJS = $(CARES_OBJS:.c=.obj) +CARES_OBJS = $(CARES_OBJS:/=\) !IF "$(USE_RES_FILE)" == "TRUE" CARES_OBJS = $(CARES_OBJS) $(CARES_OBJDIR)\cares.res !ENDIF @@ -336,20 +327,29 @@ PROG3_OBJS = $(PROG3_OBJS) $(PROG3_OBJDIR)\ahost.obj {$(SRCDIR)\src\lib}.c{$(CARES_OBJDIR)}.obj: $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< -{$(SRCDIR)\src\tools}.c{$(PROG2_OBJDIR)}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< +{$(SRCDIR)\src\lib\dsa}.c{$(CARES_OBJDIR)\dsa}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< -{$(SRCDIR)\src\tools}.c{$(PROG3_OBJDIR)}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< +{$(SRCDIR)\src\lib\event}.c{$(CARES_OBJDIR)\event}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< + +{$(SRCDIR)\src\lib\legacy}.c{$(CARES_OBJDIR)\legacy}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< + +{$(SRCDIR)\src\lib\record}.c{$(CARES_OBJDIR)\record}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< + +{$(SRCDIR)\src\lib\str}.c{$(CARES_OBJDIR)\str}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< -# Hack Alert! we reference ../lib/ files in the Makefile.inc for tools as they -# share some files with the library itself. We need to hack around that here. +{$(SRCDIR)\src\lib\util}.c{$(CARES_OBJDIR)\util}.obj: + $(CC_CMD) $(CC_CFLAGS) $(CARES_CFLAGS) /Fo$@ /Fd$(@D)\ /c $< -{$(SRCDIR)\src\lib}.c{$(PROG2_OBJDIR)\..\lib}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG2_OBJDIR)\$(@F) /Fd$(PROG2_OBJDIR)\ /c $< +{$(SRCDIR)\src\tools}.c{$(PROG2_OBJDIR)}.obj: + $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(PROG2_OBJDIR)\ /c $< -{$(SRCDIR)\src\lib}.c{$(PROG3_OBJDIR)\..\lib}.obj: - $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$(PROG3_OBJDIR)\$(@F) /Fd$(PROG3_OBJDIR)\ /c $< +{$(SRCDIR)\src\tools}.c{$(PROG3_OBJDIR)}.obj: + $(CC_CMD) $(CC_CFLAGS) $(SPROG_CFLAGS) /Fo$@ /Fd$(PROG3_OBJDIR)\ /c $< # ------------------------------------------------------------- # # ------------------------------------------------------------- # @@ -414,16 +414,32 @@ $(PROG3_OUTDIR): $(PROG3_DIR) $(CARES_OBJDIR): $(CARES_OUTDIR) @if not exist $(CARES_OBJDIR) mkdir $(CARES_OBJDIR) + @if not exist $(CARES_OBJDIR)\dsa mkdir $(CARES_OBJDIR)\dsa + @if not exist $(CARES_OBJDIR)\event mkdir $(CARES_OBJDIR)\event + @if not exist $(CARES_OBJDIR)\legacy mkdir $(CARES_OBJDIR)\legacy + @if not exist $(CARES_OBJDIR)\record mkdir $(CARES_OBJDIR)\record + @if not exist $(CARES_OBJDIR)\str mkdir $(CARES_OBJDIR)\str + @if not exist $(CARES_OBJDIR)\util mkdir $(CARES_OBJDIR)\util $(PROG2_OBJDIR): $(PROG2_OUTDIR) @if not exist $(PROG2_OBJDIR) mkdir $(PROG2_OBJDIR) + @if not exist $(PROG2_OBJDIR)\str mkdir $(PROG2_OBJDIR)\str $(PROG3_OBJDIR): $(PROG3_OUTDIR) @if not exist $(PROG3_OBJDIR) mkdir $(PROG3_OBJDIR) + @if not exist $(PROG3_OBJDIR)\str mkdir $(PROG3_OBJDIR)\str clean: + @-RMDIR /S /Q $(CARES_OBJDIR)\dsa >NUL 2>&1 + @-RMDIR /S /Q $(CARES_OBJDIR)\event >NUL 2>&1 + @-RMDIR /S /Q $(CARES_OBJDIR)\legacy >NUL 2>&1 + @-RMDIR /S /Q $(CARES_OBJDIR)\record >NUL 2>&1 + @-RMDIR /S /Q $(CARES_OBJDIR)\str >NUL 2>&1 + @-RMDIR /S /Q $(CARES_OBJDIR)\util >NUL 2>&1 @-RMDIR /S /Q $(CARES_OUTDIR) >NUL 2>&1 + @-RMDIR /S /Q $(PROG2_OBJDIR)\str >NUL 2>&1 @-RMDIR /S /Q $(PROG2_OUTDIR) >NUL 2>&1 + @-RMDIR /S /Q $(PROG3_OBJDIR)\str >NUL 2>&1 @-RMDIR /S /Q $(PROG3_OUTDIR) >NUL 2>&1 install: @@ -435,7 +451,6 @@ install: @copy /y $(CARES_OUTDIR)\*.* "$(INSTALL_DIR_LIB)" >NUL @copy /y $(SRCDIR)\include\ares.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_build.h "$(INSTALL_DIR_INC)" >NUL - @copy /y $(SRCDIR)\include\ares_rules.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_version.h "$(INSTALL_DIR_INC)" >NUL @copy /y $(SRCDIR)\include\ares_dns_record.h "$(INSTALL_DIR_INC)" >NUL @echo Installed c-ares $(CFG) diff --git a/deps/cares/Makefile.netware b/deps/cares/Makefile.netware index 5ebbc76207dcfd..6cb00a7510066e 100644 --- a/deps/cares/Makefile.netware +++ b/deps/cares/Makefile.netware @@ -299,9 +299,8 @@ ifeq ($(LIBARCH),CLIB) @echo $(DL)#define RECVFROM_TYPE_ARG5 struct sockaddr$(DL) >> $@ @echo $(DL)#define RECVFROM_TYPE_ARG6 int$(DL) >> $@ @echo $(DL)#define RECVFROM_TYPE_RETV int$(DL) >> $@ - @echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG2 char *$(DL) >> $@ + @echo $(DL)#define SEND_TYPE_ARG2 const char *$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@ diff --git a/deps/cares/NEWS b/deps/cares/NEWS deleted file mode 100644 index 95a2eeea2742b0..00000000000000 --- a/deps/cares/NEWS +++ /dev/null @@ -1,21 +0,0 @@ -Major changes since: -* see the CHANGES file - -Major changes in release 1.1.1: -* ares should now compile as C++ code (no longer uses reserved word - "class"). -* Added SRV support to adig test program. -* Fixed a few error handling bugs in query processing. - -Major changes in release 1.1.0: -* Added ares_free_string() function so that memory can be freed in the - same layer as it is allocated, a desirable feature in some - environments. -* A few of the ares_dns.h macros are fixed to use the proper bitwise - operator. -* Fixed a couple of fenceposts fixed in ares_expand_name()'s - bounds-checking. -* In process_timeouts(), extract query->next before calling - next_server() and possibly freeing the query structure. -* Casted arguments to ctype macros casted to unsigned char, since not - all char values are valid inputs to those macros according to ANSI. diff --git a/deps/cares/README.cares b/deps/cares/README.cares deleted file mode 100644 index ec809ab948367c..00000000000000 --- a/deps/cares/README.cares +++ /dev/null @@ -1,15 +0,0 @@ -c-ares -====== - -This package is based on ares 1.1.1 (written by Greg Hudson). Daniel Stenberg -decided to fork and release a separate project since the original ares author -didn't want the improvements that were vital for our use of it. - -This package is dubbed 'c-ares' since Daniel wanted this for use within the -curl project (hence the letter C) and it makes a nice pun. c-ares is not API -compatible with ares: a new name makes that more obvious to the public. - -The original libares was distributed at -ftp://athena-dist.mit.edu:pub/ATHENA/ares (which seems to not be alive -anymore). A local copy of the original ares package is kept here: -https://c-ares.org/download/ares-1.1.1.tar.gz diff --git a/deps/cares/README.md b/deps/cares/README.md index 70aa67fce6997c..6566c9fe6aa18e 100644 --- a/deps/cares/README.md +++ b/deps/cares/README.md @@ -1,65 +1,158 @@ # [![c-ares logo](https://c-ares.org/art/c-ares-logo.svg)](https://c-ares.org/) [![Build Status](https://api.cirrus-ci.com/github/c-ares/c-ares.svg?branch=main)](https://cirrus-ci.com/github/c-ares/c-ares) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/aevgc5914tm72pvs/branch/master?svg=true)](https://ci.appveyor.com/project/c-ares/c-ares/branch/master) -[![Coverage Status](https://coveralls.io/repos/github/c-ares/c-ares/badge.svg)](https://coveralls.io/github/c-ares/c-ares) +[![Windows Build Status](https://ci.appveyor.com/api/projects/status/aevgc5914tm72pvs/branch/main?svg=true)](https://ci.appveyor.com/project/c-ares/c-ares/branch/main) +[![Coverage Status](https://coveralls.io/repos/github/c-ares/c-ares/badge.svg?branch=main)](https://coveralls.io/github/c-ares/c-ares?branch=main) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/291/badge)](https://bestpractices.coreinfrastructure.org/projects/291) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/c-ares.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:c-ares) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=c-ares_c-ares&metric=bugs)](https://sonarcloud.io/summary/new_code?id=c-ares_c-ares) [![Coverity Scan Status](https://scan.coverity.com/projects/c-ares/badge.svg)](https://scan.coverity.com/projects/c-ares) -This is c-ares, an asynchronous resolver library. It is intended for +- [Overview](#overview) +- [Code](#code) +- [Communication](#communication) +- [Release Keys](#release-keys) + - [Verifying signatures](#verifying-signatures) +- [Features](#features) + - [RFCs and Proposals](#supported-rfcs-and-proposals) + +## Overview +[c-ares](https://c-ares.org) is a modern DNS (stub) resolver library, written in +C. It provides interfaces for asynchronous queries while trying to abstract the +intricacies of the underlying DNS protocol. It was originally intended for applications which need to perform DNS queries without blocking, or need to -perform multiple DNS queries in parallel. The primary examples of such -applications are servers which communicate with multiple clients and programs -with graphical user interfaces. +perform multiple DNS queries in parallel. -The full source code is available in the ['c-ares' release archives](https://c-ares.org/download/), -and in a git repository: https://github.com/c-ares/c-ares. See the -[INSTALL.md](INSTALL.md) file for build information. - -If you find bugs, correct flaws, have questions or have comments in general in -regard to c-ares (or by all means the original ares too), get in touch with us -on the c-ares mailing list: https://lists.haxx.se/listinfo/c-ares - -c-ares is distributed under the MIT license. - -You'll find all c-ares details and news here: - https://c-ares.org/ - - -## Notes for c-ares hackers - -* The distributed `ares_build.h` file is only intended to be used on systems - which can not run the also distributed configure script. - -* The distributed `ares_build.h` file is generated as a copy of `ares_build.h.dist` - when the c-ares source code distribution archive file is originally created. - -* If you check out from git on a non-configure platform, you must run the - appropriate `buildconf*` script to set up `ares_build.h` and other local files - before being able to compile the library. - -* On systems capable of running the `configure` script, the `configure` process - will overwrite the distributed `ares_build.h` file with one that is suitable - and specific to the library being configured and built, this new file is - generated from the `ares_build.h.in` template file. - -* If you intend to distribute an already compiled c-ares library you **MUST** - also distribute along with it the generated `ares_build.h` which has been - used to compile it. Otherwise, the library will be of no use for the users of - the library that you have built. It is **your** responsibility to provide this - file. No one at the c-ares project can know how you have built the library. - -* File `ares_build.h` includes platform and configuration dependent info, - and must not be modified by anyone. Configure script generates it for you. - -* We cannot assume anything else but very basic compiler features being - present. While c-ares requires an ANSI C compiler to build, some of the - earlier ANSI compilers clearly can't deal with some preprocessor operators. - -* Newlines must remain unix-style for older compilers' sake. - -* Comments must be written in the old-style /* unnested C-fashion */ - -* Try to keep line lengths below 80 columns. +One of the goals of c-ares is to be a better DNS resolver than is provided by +your system, regardless of which system you use. We recommend using +the c-ares library in all network applications even if the initial goal of +asynchronous resolution is not necessary to your application. + +c-ares will build with any C89 compiler and is [MIT licensed](LICENSE.md), +which makes it suitable for both free and commercial software. c-ares runs on +Linux, FreeBSD, OpenBSD, MacOS, Solaris, AIX, Windows, Android, iOS and many +more operating systems. + +c-ares has a strong focus on security, implementing safe parsers and data +builders used throughout the code, thus avoiding many of the common pitfalls +of other C libraries. Through automated testing with our extensive testing +framework, c-ares is constantly validated with a range of static and dynamic +analyzers, as well as being constantly fuzzed by [OSS Fuzz](https://github.com/google/oss-fuzz). + +While c-ares has been around for over 20 years, it has been actively maintained +both in regards to the latest DNS RFCs as well as updated to follow the latest +best practices in regards to C coding standards. + +## Code + +The full source code and revision history is available in our +[GitHub repository](https://github.com/c-ares/c-ares). Our signed releases +are available in the [release archives](https://c-ares.org/download/). + + +See the [INSTALL.md](INSTALL.md) file for build information. + +## Communication + +**Issues** and **Feature Requests** should be reported to our +[GitHub Issues](https://github.com/c-ares/c-ares/issues) page. + +**Discussions** around c-ares and its use, are held on +[GitHub Discussions](https://github.com/c-ares/c-ares/discussions/categories/q-a) +or the [Mailing List](https://lists.haxx.se/mailman/listinfo/c-ares). Mailing +List archive [here](https://lists.haxx.se/pipermail/c-ares/). +Please, do not mail volunteers privately about c-ares. + +**Security vulnerabilities** are treated according to our +[Security Procedure](SECURITY.md), please email c-ares-security at + haxx.se if you suspect one. + + +## Release keys + +Primary GPG keys for c-ares Releasers (some Releasers sign with subkeys): + +* **Daniel Stenberg** <<daniel@haxx.se>> + `27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2` +* **Brad House** <<brad@brad-house.com>> + `DA7D64E4C82C6294CB73A20E22E3D13B5411B7CA` + +To import the full set of trusted release keys (including subkeys possibly used +to sign releases): + +```bash +gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2 # Daniel Stenberg +gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys DA7D64E4C82C6294CB73A20E22E3D13B5411B7CA # Brad House +``` + +### Verifying signatures + +For each release `c-ares-X.Y.Z.tar.gz` there is a corresponding +`c-ares-X.Y.Z.tar.gz.asc` file which contains the detached signature for the +release. + +After fetching all of the possible valid signing keys and loading into your +keychain as per the prior section, you can simply run the command below on +the downloaded package and detached signature: + +```bash +% gpg -v --verify c-ares-1.29.0.tar.gz.asc c-ares-1.29.0.tar.gz +gpg: enabled compatibility flags: +gpg: Signature made Fri May 24 02:50:38 2024 EDT +gpg: using RSA key 27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2 +gpg: using pgp trust model +gpg: Good signature from "Daniel Stenberg <daniel@haxx.se>" [unknown] +gpg: WARNING: This key is not certified with a trusted signature! +gpg: There is no indication that the signature belongs to the owner. +Primary key fingerprint: 27ED EAF2 2F3A BCEB 50DB 9A12 5CC9 08FD B71E 12C2 +gpg: binary signature, digest algorithm SHA512, key algorithm rsa2048 +``` + +## Features + +See [Features](FEATURES.md) + +### Supported RFCs and Proposals +- [RFC1035](https://datatracker.ietf.org/doc/html/rfc1035). + Initial/Base DNS RFC +- [RFC2671](https://datatracker.ietf.org/doc/html/rfc2671), + [RFC6891](https://datatracker.ietf.org/doc/html/rfc6891). + EDNS0 option (meta-RR) +- [RFC3596](https://datatracker.ietf.org/doc/html/rfc3596). + IPv6 Address. `AAAA` Record. +- [RFC2782](https://datatracker.ietf.org/doc/html/rfc2782). + Server Selection. `SRV` Record. +- [RFC3403](https://datatracker.ietf.org/doc/html/rfc3403). + Naming Authority Pointer. `NAPTR` Record. +- [RFC6698](https://datatracker.ietf.org/doc/html/rfc6698). + DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol. + `TLSA` Record. +- [RFC9460](https://datatracker.ietf.org/doc/html/rfc9460). + General Purpose Service Binding, Service Binding type for use with HTTPS. + `SVCB` and `HTTPS` Records. +- [RFC7553](https://datatracker.ietf.org/doc/html/rfc7553). + Uniform Resource Identifier. `URI` Record. +- [RFC6844](https://datatracker.ietf.org/doc/html/rfc6844). + Certification Authority Authorization. `CAA` Record. +- [RFC2535](https://datatracker.ietf.org/doc/html/rfc2535), + [RFC2931](https://datatracker.ietf.org/doc/html/rfc2931). + `SIG0` Record. Only basic parser, not full implementation. +- [RFC7873](https://datatracker.ietf.org/doc/html/rfc7873), + [RFC9018](https://datatracker.ietf.org/doc/html/rfc9018). + DNS Cookie off-path dns poisoning and amplification mitigation. +- [draft-vixie-dnsext-dns0x20-00](https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00). + DNS 0x20 query name case randomization to prevent cache poisioning attacks. +- [RFC7686](https://datatracker.ietf.org/doc/html/rfc7686). + Reject queries for `.onion` domain names with `NXDOMAIN`. +- [RFC2606](https://datatracker.ietf.org/doc/html/rfc2606), + [RFC6761](https://datatracker.ietf.org/doc/html/rfc6761). + Special case treatment for `localhost`/`.localhost`. +- [RFC2308](https://datatracker.ietf.org/doc/html/rfc2308), + [RFC9520](https://datatracker.ietf.org/doc/html/rfc9520). + Negative Caching of DNS Resolution Failures. +- [RFC6724](https://datatracker.ietf.org/doc/html/rfc6724). + IPv6 address sorting as used by `ares_getaddrinfo()`. +- [RFC7413](https://datatracker.ietf.org/doc/html/rfc7413). + TCP FastOpen (TFO) for 0-RTT TCP Connection Resumption. +- [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986). + Uniform Resource Identifier (URI). Used for server configuration. diff --git a/deps/cares/RELEASE-NOTES.md b/deps/cares/RELEASE-NOTES.md index 3a9b9dd9c35fa1..ded75001b54fa4 100644 --- a/deps/cares/RELEASE-NOTES.md +++ b/deps/cares/RELEASE-NOTES.md @@ -1,49 +1,42 @@ -## c-ares version 1.28.1 - Mar 30 2024 +## c-ares version 1.34.6 - December 8 2025 -This release contains a fix for a single significant regression introduced -in c-ares 1.28.0. +This is a security release. -* `ares_search()` and `ares_getaddrinfo()` resolution fails if no search domains - are specified. [Issue #737](https://github.com/c-ares/c-ares/issues/737) - - -## c-ares version 1.28.0 - Mar 29 2024 - -This is a feature and bugfix release. - -Features: - -* Emit warnings when deprecated c-ares functions are used. This can be - disabled by passing a compiler definition of `CARES_NO_DEPRECATED`. [PR #732](https://github.com/c-ares/c-ares/pull/732) -* Add function `ares_search_dnsrec()` to search for records using the new DNS - record data structures. [PR #719](https://github.com/c-ares/c-ares/pull/719) -* Rework internals to pass around `ares_dns_record_t` instead of binary data, - this introduces new public functions of `ares_query_dnsrec()` and - `ares_send_dnsrec()`. [PR #730](https://github.com/c-ares/c-ares/pull/730) +Security: +* CVE-2025-62408. A use-after-free bug has been uncovered in read_answers() that + was introduced in v1.32.3. Please see https://github.com/c-ares/c-ares/security/advisories/GHSA-jq53-42q6-pqr5 Changes: - -* tests: when performing simulated queries, reduce timeouts to make tests run - faster -* Replace configuration file parsers with memory-safe parser. [PR #725](https://github.com/c-ares/c-ares/pull/725) -* Remove `acountry` completely, the manpage might still get installed otherwise. [Issue #718](https://github.com/c-ares/c-ares/pull/718) +* Ignore Windows IDN Search Domains until proper IDN support is added. [PR #1034](https://github.com/c-ares/c-ares/pull/1034) Bugfixes: +* Event Thread could stall when not notified of new queries on existing + connections that are in a bad state + [PR #1032](https://github.com/c-ares/c-ares/pull/1032) +* fix conversion of invalid service to port number in ares_getaddrinfo() + [PR #1029](https://github.com/c-ares/c-ares/pull/1029) +* fix memory leak in ares_uri + [PR #1012](https://github.com/c-ares/c-ares/pull/1012) +* Ignore ares_event_configchg_init failures + [PR #1009](https://github.com/c-ares/c-ares/pull/1009) +* Use XOR for random seed generation on fallback logic. + [PR #994](https://github.com/c-ares/c-ares/pull/994) +* Fix clang build on windows. + [PR #996](https://github.com/c-ares/c-ares/pull/996) +* Fix IPv6 link-local nameservers in /etc/resolv.conf + [PR #996](https://github.com/c-ares/c-ares/pull/997) +* Fix a few build issues on MidnightBSD. + [PR #983](https://github.com/c-ares/c-ares/pull/983) + +Thanks go to these friendly people for their efforts and contributions for this +release: -* CMake: don't overwrite global required libraries/definitions/includes which - could cause build errors for projects chain building c-ares. [Issue #729](https://github.com/c-ares/c-ares/issues/729) -* On some platforms, `netinet6/in6.h` is not included by `netinet/in.h` - and needs to be included separately. [PR #728](https://github.com/c-ares/c-ares/pull/728) -* Fix a potential memory leak in `ares_init()`. [Issue #724](https://github.com/c-ares/c-ares/issues/724) -* Some platforms don't have the `isascii()` function. Implement as a macro. [PR #721](https://github.com/c-ares/c-ares/pull/721) -* CMake: Fix Chain building if CMAKE runtime paths not set -* NDots configuration should allow a value of zero. [PR #735](https://github.com/c-ares/c-ares/pull/735) +* Brad House (@bradh352) +* (@F3lixTheCat) +* Lucas Holt (@laffer1) +* @oargon +* Pavel P (@pps83) +* Sean Harmer (@seanharmer) +* Uwe (@nixblik) -Thanks go to these friendly people for their efforts and contributions for this release: -* Brad House (@bradh352) -* Cristian Rodríguez (@crrodriguez) -* Daniel Stenberg (@bagder) -* Faraz (@farazrbx) -* Faraz Fallahi (@fffaraz) -* Oliver Welsh (@oliverwelsh) diff --git a/deps/cares/SECURITY.md b/deps/cares/SECURITY.md index 2a04a8dbcc3557..0b66cc1146ad31 100644 --- a/deps/cares/SECURITY.md +++ b/deps/cares/SECURITY.md @@ -43,7 +43,7 @@ announcement. - If the report is rejected, the team writes to the reporter to explain why. -- If the report is accepted, the team writes to the reporter to let him/her +- If the report is accepted, the team writes to the reporter to let them know it is accepted and that they are working on a fix. - The security team discusses the problem, works out a fix, considers the diff --git a/deps/cares/TODO b/deps/cares/TODO deleted file mode 100644 index 3b200926e352de..00000000000000 --- a/deps/cares/TODO +++ /dev/null @@ -1,4 +0,0 @@ -TODO -==== - -Please see https://github.com/c-ares/c-ares/issues diff --git a/deps/cares/aclocal.m4 b/deps/cares/aclocal.m4 index ce7ad1c8a86a43..a732fb0e2e1d9d 100644 --- a/deps/cares/aclocal.m4 +++ b/deps/cares/aclocal.m4 @@ -1221,6 +1221,8 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/ares_check_user_namespace.m4]) +m4_include([m4/ares_check_uts_namespace.m4]) m4_include([m4/ax_ac_append_to_file.m4]) m4_include([m4/ax_ac_print_to_file.m4]) m4_include([m4/ax_add_am_macro_static.m4]) @@ -1231,12 +1233,9 @@ m4_include([m4/ax_append_link_flags.m4]) m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_check_gnu_make.m4]) m4_include([m4/ax_check_link_flag.m4]) -m4_include([m4/ax_check_user_namespace.m4]) -m4_include([m4/ax_check_uts_namespace.m4]) m4_include([m4/ax_code_coverage.m4]) m4_include([m4/ax_compiler_vendor.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) -m4_include([m4/ax_cxx_compile_stdcxx_14.m4]) m4_include([m4/ax_file_escapes.m4]) m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_require_defined.m4]) diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am index 6fa817a8346703..07239563e6a6d2 100644 --- a/deps/cares/aminclude_static.am +++ b/deps/cares/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sat Mar 30 16:17:17 CET 2024 +# from AX_AM_MACROS_STATIC on Mon Dec 8 16:21:41 UTC 2025 # Code coverage @@ -66,7 +66,7 @@ code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture" $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) -code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN); +code_coverage_v_lcov_ign_0 = @echo " LCOV --remove" "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " "$(CODE_COVERAGE_OUTPUT_DIRECTORY)"; @@ -85,7 +85,7 @@ check-code-coverage: # Capture code coverage data code-coverage-capture: code-coverage-capture-hook $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) - $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) + $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" diff --git a/deps/cares/cares.gyp b/deps/cares/cares.gyp index 053cdf8c8286ad..fee055c079f013 100644 --- a/deps/cares/cares.gyp +++ b/deps/cares/cares.gyp @@ -1,63 +1,25 @@ { 'variables': { + # This list is generated by `tools/dep_updaters/update-c-ares.mjs`. 'cares_sources_common': [ 'include/ares.h', + 'include/ares_build.h', 'include/ares_dns.h', 'include/ares_dns_record.h', 'include/ares_nameser.h', - 'include/ares_rules.h', 'include/ares_version.h', - 'src/lib/ares__addrinfo2hostent.c', - 'src/lib/ares__addrinfo_localhost.c', - 'src/lib/ares__buf.c', - 'src/lib/ares__buf.h', - 'src/lib/ares__close_sockets.c', - 'src/lib/ares__hosts_file.c', - 'src/lib/ares__htable.c', - 'src/lib/ares__htable.h', - 'src/lib/ares__htable_asvp.c', - 'src/lib/ares__htable_asvp.h', - 'src/lib/ares__htable_strvp.c', - 'src/lib/ares__htable_strvp.h', - 'src/lib/ares__htable_szvp.c', - 'src/lib/ares__htable_szvp.h', - 'src/lib/ares__iface_ips.c', - 'src/lib/ares__iface_ips.h', - 'src/lib/ares__llist.c', - 'src/lib/ares__llist.h', - 'src/lib/ares__parse_into_addrinfo.c', - 'src/lib/ares__slist.c', - 'src/lib/ares__slist.h', - 'src/lib/ares__socket.c', - 'src/lib/ares__sortaddrinfo.c', - 'src/lib/ares__threads.c', - 'src/lib/ares__threads.h', - 'src/lib/ares__timeval.c', + 'src/lib/ares_addrinfo2hostent.c', + 'src/lib/ares_addrinfo_localhost.c', 'src/lib/ares_android.c', 'src/lib/ares_android.h', 'src/lib/ares_cancel.c', - 'src/lib/ares_create_query.c', + 'src/lib/ares_close_sockets.c', + 'src/lib/ares_conn.c', + 'src/lib/ares_conn.h', + 'src/lib/ares_cookie.c', 'src/lib/ares_data.c', 'src/lib/ares_data.h', 'src/lib/ares_destroy.c', - 'src/lib/ares_dns_mapping.c', - 'src/lib/ares_dns_name.c', - 'src/lib/ares_dns_parse.c', - 'src/lib/ares_dns_record.c', - 'src/lib/ares_dns_private.h', - 'src/lib/ares_dns_write.c', - 'src/lib/ares_event.h', - 'src/lib/ares_event_win32.h', - 'src/lib/ares_event_epoll.c', - 'src/lib/ares_event_kqueue.c', - 'src/lib/ares_event_poll.c', - 'src/lib/ares_event_select.c', - 'src/lib/ares_event_thread.c', - 'src/lib/ares_event_wake_pipe.c', - 'src/lib/ares_event_win32.c', - 'src/lib/ares_expand_name.c', - 'src/lib/ares_expand_string.c', - 'src/lib/ares_fds.c', 'src/lib/ares_free_hostent.c', 'src/lib/ares_free_string.c', 'src/lib/ares_freeaddrinfo.c', @@ -67,56 +29,114 @@ 'src/lib/ares_gethostbyaddr.c', 'src/lib/ares_gethostbyname.c', 'src/lib/ares_getnameinfo.c', - 'src/lib/ares_getsock.c', + 'src/lib/ares_hosts_file.c', 'src/lib/ares_inet_net_pton.h', 'src/lib/ares_init.c', - 'src/lib/ares_library_init.c', 'src/lib/ares_ipv6.h', - 'src/lib/ares_math.c', + 'src/lib/ares_library_init.c', + 'src/lib/ares_metrics.c', 'src/lib/ares_options.c', - 'src/lib/ares_parse_a_reply.c', - 'src/lib/ares_parse_aaaa_reply.c', - 'src/lib/ares_parse_caa_reply.c', - 'src/lib/ares_parse_mx_reply.c', - 'src/lib/ares_parse_naptr_reply.c', - 'src/lib/ares_parse_ns_reply.c', - 'src/lib/ares_parse_ptr_reply.c', - 'src/lib/ares_parse_soa_reply.c', - 'src/lib/ares_parse_srv_reply.c', - 'src/lib/ares_parse_txt_reply.c', - 'src/lib/ares_parse_uri_reply.c', - 'src/lib/ares_platform.c', - 'src/lib/ares_platform.h', + 'src/lib/ares_parse_into_addrinfo.c', 'src/lib/ares_private.h', 'src/lib/ares_process.c', 'src/lib/ares_qcache.c', 'src/lib/ares_query.c', - 'src/lib/ares_rand.c', 'src/lib/ares_search.c', 'src/lib/ares_send.c', + 'src/lib/ares_set_socket_functions.c', 'src/lib/ares_setup.h', - 'src/lib/ares_strcasecmp.c', - 'src/lib/ares_strcasecmp.h', - 'src/lib/ares_str.c', - 'src/lib/ares_str.h', + 'src/lib/ares_socket.c', + 'src/lib/ares_socket.h', + 'src/lib/ares_sortaddrinfo.c', 'src/lib/ares_strerror.c', - 'src/lib/ares_strsplit.c', - 'src/lib/ares_strsplit.h', 'src/lib/ares_sysconfig.c', 'src/lib/ares_sysconfig_files.c', + 'src/lib/ares_sysconfig_mac.c', + 'src/lib/ares_sysconfig_win.c', 'src/lib/ares_timeout.c', 'src/lib/ares_update_servers.c', 'src/lib/ares_version.c', + 'src/lib/dsa/ares_array.c', + 'src/lib/dsa/ares_htable.c', + 'src/lib/dsa/ares_htable.h', + 'src/lib/dsa/ares_htable_asvp.c', + 'src/lib/dsa/ares_htable_dict.c', + 'src/lib/dsa/ares_htable_strvp.c', + 'src/lib/dsa/ares_htable_szvp.c', + 'src/lib/dsa/ares_htable_vpstr.c', + 'src/lib/dsa/ares_htable_vpvp.c', + 'src/lib/dsa/ares_llist.c', + 'src/lib/dsa/ares_slist.c', + 'src/lib/dsa/ares_slist.h', + 'src/lib/event/ares_event.h', + 'src/lib/event/ares_event_configchg.c', + 'src/lib/event/ares_event_epoll.c', + 'src/lib/event/ares_event_kqueue.c', + 'src/lib/event/ares_event_poll.c', + 'src/lib/event/ares_event_select.c', + 'src/lib/event/ares_event_thread.c', + 'src/lib/event/ares_event_wake_pipe.c', + 'src/lib/event/ares_event_win32.c', + 'src/lib/event/ares_event_win32.h', + 'src/lib/include/ares_array.h', + 'src/lib/include/ares_buf.h', + 'src/lib/include/ares_htable_asvp.h', + 'src/lib/include/ares_htable_dict.h', + 'src/lib/include/ares_htable_strvp.h', + 'src/lib/include/ares_htable_szvp.h', + 'src/lib/include/ares_htable_vpstr.h', + 'src/lib/include/ares_htable_vpvp.h', + 'src/lib/include/ares_llist.h', + 'src/lib/include/ares_mem.h', + 'src/lib/include/ares_str.h', 'src/lib/inet_net_pton.c', 'src/lib/inet_ntop.c', - 'src/lib/setup_once.h', - 'src/tools/ares_getopt.c', - 'src/tools/ares_getopt.h', - ], - 'cares_sources_win': [ - 'src/lib/config-win32.h', + 'src/lib/legacy/ares_create_query.c', + 'src/lib/legacy/ares_expand_name.c', + 'src/lib/legacy/ares_expand_string.c', + 'src/lib/legacy/ares_fds.c', + 'src/lib/legacy/ares_getsock.c', + 'src/lib/legacy/ares_parse_a_reply.c', + 'src/lib/legacy/ares_parse_aaaa_reply.c', + 'src/lib/legacy/ares_parse_caa_reply.c', + 'src/lib/legacy/ares_parse_mx_reply.c', + 'src/lib/legacy/ares_parse_naptr_reply.c', + 'src/lib/legacy/ares_parse_ns_reply.c', + 'src/lib/legacy/ares_parse_ptr_reply.c', + 'src/lib/legacy/ares_parse_soa_reply.c', + 'src/lib/legacy/ares_parse_srv_reply.c', + 'src/lib/legacy/ares_parse_txt_reply.c', + 'src/lib/legacy/ares_parse_uri_reply.c', + 'src/lib/record/ares_dns_mapping.c', + 'src/lib/record/ares_dns_multistring.c', + 'src/lib/record/ares_dns_multistring.h', + 'src/lib/record/ares_dns_name.c', + 'src/lib/record/ares_dns_parse.c', + 'src/lib/record/ares_dns_private.h', + 'src/lib/record/ares_dns_record.c', + 'src/lib/record/ares_dns_write.c', + 'src/lib/str/ares_buf.c', + 'src/lib/str/ares_str.c', + 'src/lib/str/ares_strsplit.c', + 'src/lib/str/ares_strsplit.h', + 'src/lib/thirdparty/apple/dnsinfo.h', + 'src/lib/util/ares_iface_ips.c', + 'src/lib/util/ares_iface_ips.h', + 'src/lib/util/ares_math.c', + 'src/lib/util/ares_math.h', + 'src/lib/util/ares_rand.c', + 'src/lib/util/ares_rand.h', + 'src/lib/util/ares_threads.c', + 'src/lib/util/ares_threads.h', + 'src/lib/util/ares_time.h', + 'src/lib/util/ares_timeval.c', + 'src/lib/util/ares_uri.c', + 'src/lib/util/ares_uri.h', 'src/lib/windows_port.c', ], + 'cares_sources_mac': [ + 'config/darwin/ares_config.h', + ], }, 'target_defaults': { @@ -150,7 +170,7 @@ { 'target_name': 'cares', 'type': '<(library)', - 'include_dirs': [ 'include' ], + 'include_dirs': [ 'include', 'src/lib', 'src/lib/include' ], 'direct_dependent_settings': { 'include_dirs': [ 'include' ], 'cflags': [ '-Wno-error=deprecated-declarations' ], @@ -177,9 +197,6 @@ '_WINSOCK_DEPRECATED_NO_WARNINGS', ], 'include_dirs': [ 'config/win32' ], - 'sources': [ - '<@(cares_sources_win)', - ], 'libraries': [ '-lws2_32.lib', '-liphlpapi.lib' @@ -206,7 +223,9 @@ }], [ 'OS=="mac" or OS=="ios"', { 'include_dirs': [ 'config/darwin' ], - 'sources': [ 'config/darwin/ares_config.h' ] + 'sources': [ + '<@(cares_sources_mac)', + ] }], [ 'OS=="freebsd" or OS=="dragonflybsd"', { 'include_dirs': [ 'config/freebsd' ], @@ -229,6 +248,10 @@ '-lnsl' ] } + }], + [ 'OS=="openharmony"', { + 'include_dirs': [ 'config/openharmony' ], + 'sources': [ 'config/openharmony/ares_config.h' ], }] ] } diff --git a/deps/cares/cmake/EnableWarnings.cmake b/deps/cares/cmake/EnableWarnings.cmake index a394a8721f79b3..5bd68ec45c213e 100644 --- a/deps/cares/cmake/EnableWarnings.cmake +++ b/deps/cares/cmake/EnableWarnings.cmake @@ -39,6 +39,121 @@ include(CheckCXXCompilerFlag) get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Helper functions + + +# This function can be called in subdirectories, to prune out warnings that they don't want. +# vararg: warning flags to remove from list of enabled warnings. All "no" flags after EXPLICIT_DISABLE +# will be added to C flags. +# +# Ex.: remove_warnings(-Wall -Wdouble-promotion -Wcomment) prunes those warnings flags from the compile command. +function(remove_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + set(toadd) + set(in_explicit_disable FALSE) + foreach (flag ${ARGN}) + if (flag STREQUAL "EXPLICIT_DISABLE") + set(in_explicit_disable TRUE) + elseif (in_explicit_disable) + list(APPEND toadd "${flag}") + else () + string(REGEX REPLACE "${flag}([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + endif () + endforeach () + _int_enable_warnings_set_flags(lang ${toadd}) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Explicitly suppress all warnings. As long as this flag is the last warning flag, warnings will be +# suppressed even if earlier flags enabled warnings. +function(remove_all_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + string(REGEX REPLACE "[-/][Ww][^ \t]*([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") + if (MSVC) + string(APPEND CMAKE_${lang}_FLAGS " /w") + else () + string(APPEND CMAKE_${lang}_FLAGS " -w") + endif () + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +function(remove_all_warnings_from_targets) + foreach (target ${ARGN}) + if (MSVC) + target_compile_options(${target} PRIVATE "/w") + else () + target_compile_options(${target} PRIVATE "-w") + endif () + endforeach() +endfunction() + + +# Save the current warning settings to an internal variable. +function(push_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (CMAKE_${lang}_FLAGS MATCHES ";") + message(AUTHOR_WARNING "Cannot push warnings for ${lang}, CMAKE_${lang}_FLAGS contains semicolons") + continue() + endif () + # Add current flags to end of internal list. + list(APPEND _enable_warnings_internal_${lang}_flags_stack "${CMAKE_${lang}_FLAGS}") + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + endforeach() +endfunction() + + +# Restore the current warning settings from an internal variable. +function(pop_warnings) + get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(langs C) + if ("CXX" IN_LIST languages) + list(APPEND langs CXX) + endif () + + foreach(lang ${langs}) + if (NOT _enable_warnings_internal_${lang}_flags_stack) + continue() + endif () + # Pop flags off of end of list, overwrite current flags with whatever we popped off. + list(GET _enable_warnings_internal_${lang}_flags_stack -1 CMAKE_${lang}_FLAGS) + list(REMOVE_AT _enable_warnings_internal_${lang}_flags_stack -1) + # Propagate results up to caller's scope. + set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) + string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) + endforeach() +endfunction() + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Runs when included automatically + # internal helper: _int_enable_warnings_set_flags_ex(langs_var configs_var [warnings flags]) function(_int_enable_warnings_set_flags_ex langs_var configs_var) if (NOT ARGN) @@ -109,17 +224,42 @@ set(_debug_flags_C) set(_debug_flags_CXX) if (MSVC) + # Don't automatically set /W3 + CMAKE_POLICY (SET CMP0092 NEW) + # Visual Studio uses a completely different nomenclature for warnings than gcc/mingw/clang, so none of the # "-W[name]" warnings will work. - # W4 would be better but it produces unnecessary warnings like: - # * warning C4706: assignment within conditional expression - # Triggered when doing "while(1)" - # * warning C4115: 'timeval' : named type definition in parentheses - # * warning C4201: nonstandard extension used : nameless struct/union - # Triggered by system includes (commctrl.h, shtypes.h, Shlobj.h) set(_flags - /W3 + # Enable warnings + /W4 # Baseline reasonable warnings + /w14242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data + /w14254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data + /w14263 # 'function': member function does not override any base class virtual member function + /w14265 # 'classname': class has virtual functions, but destructor is not virtual instances of this class may + # not be destructed correctly + /w14287 # 'operator': unsigned/negative constant mismatch + /we4289 # nonstandard extension used: 'variable': loop control variable declared in the for-loop is used outside + # the for-loop scope + /w14296 # 'operator': expression is always 'boolean_value' + /w14311 # 'variable': pointer truncation from 'type1' to 'type2' + /w14545 # expression before comma evaluates to a function which is missing an argument list + /w14546 # function call before comma missing argument list + /w14547 # 'operator': operator before comma has no effect; expected operator with side-effect + /w14549 # 'operator': operator before comma has no effect; did you intend 'operator'? + /w14555 # expression has no effect; expected expression with side- effect + /w14619 # pragma warning: there is no warning number 'number' + /w14640 # Enable warning on thread un-safe static member initialization + /w14826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior. + /w14905 # wide string literal cast to 'LPSTR' + /w14906 # string literal cast to 'LPWSTR' + /w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied + + # Disable some warnings + /wd4201 # nonstandard extension used: nameless struct/union. Used in some windows headers, e.g. IO_STATUS_BLOCK, + # disable. + + # Turn some warnings into errors /we4013 # Treat "function undefined, assuming extern returning int" warning as an error. https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4013 ) @@ -157,7 +297,9 @@ else () -Wextra # Enable additional warnings not covered by Wall and Wextra. + -Waggregate-return -Wcast-align + -Wcast-qual -Wconversion -Wdeclaration-after-statement -Wdouble-promotion @@ -175,6 +317,7 @@ else () -Wno-coverage-mismatch -Wold-style-definition -Wpacked + -Wpedantic -Wpointer-arith -Wredundant-decls -Wshadow @@ -183,6 +326,7 @@ else () -Wstrict-prototypes -Wtrampolines -Wundef + -Wunreachable-code -Wunused -Wvariadic-macros -Wvla @@ -201,6 +345,8 @@ else () # Some clang versions might warn if an argument like "-I/path/to/headers" is unused, # silence these. -Qunused-arguments + + -Wno-long-long ) # C++ flags: @@ -285,115 +431,7 @@ foreach(_lang ${languages}) endif () endforeach() - - -# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Helper functions - - -# This function can be called in subdirectories, to prune out warnings that they don't want. -# vararg: warning flags to remove from list of enabled warnings. All "no" flags after EXPLICIT_DISABLE -# will be added to C flags. -# -# Ex.: remove_warnings(-Wall -Wdouble-promotion -Wcomment) prunes those warnings flags from the compile command. -function(remove_warnings) - get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) - set(langs C) - if ("CXX" IN_LIST languages) - list(APPEND langs CXX) - endif () - - foreach(lang ${langs}) - set(toadd) - set(in_explicit_disable FALSE) - foreach (flag ${ARGN}) - if (flag STREQUAL "EXPLICIT_DISABLE") - set(in_explicit_disable TRUE) - elseif (in_explicit_disable) - list(APPEND toadd "${flag}") - else () - string(REGEX REPLACE "${flag}([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") - endif () - endforeach () - _int_enable_warnings_set_flags(lang ${toadd}) - string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) - set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) - endforeach() -endfunction() - - -# Explicitly suppress all warnings. As long as this flag is the last warning flag, warnings will be -# suppressed even if earlier flags enabled warnings. -function(remove_all_warnings) - get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) - set(langs C) - if ("CXX" IN_LIST languages) - list(APPEND langs CXX) - endif () - - foreach(lang ${langs}) - string(REGEX REPLACE "[-/][Ww][^ \t]*([ \t]+|$)" "" CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}") - if (MSVC) - string(APPEND CMAKE_${lang}_FLAGS " /w") - else () - string(APPEND CMAKE_${lang}_FLAGS " -w") - endif () - string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) - set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) - endforeach() -endfunction() - - -function(remove_all_warnings_from_targets) - foreach (target ${ARGN}) - if (MSVC) - target_compile_options(${target} PRIVATE "/w") - else () - target_compile_options(${target} PRIVATE "-w") - endif () - endforeach() -endfunction() - - -# Save the current warning settings to an internal variable. -function(push_warnings) - get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) - set(langs C) - if ("CXX" IN_LIST languages) - list(APPEND langs CXX) - endif () - - foreach(lang ${langs}) - if (CMAKE_${lang}_FLAGS MATCHES ";") - message(AUTHOR_WARNING "Cannot push warnings for ${lang}, CMAKE_${lang}_FLAGS contains semicolons") - continue() - endif () - # Add current flags to end of internal list. - list(APPEND _enable_warnings_internal_${lang}_flags_stack "${CMAKE_${lang}_FLAGS}") - # Propagate results up to caller's scope. - set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) - endforeach() -endfunction() - - -# Restore the current warning settings from an internal variable. -function(pop_warnings) - get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) - set(langs C) - if ("CXX" IN_LIST languages) - list(APPEND langs CXX) - endif () - - foreach(lang ${langs}) - if (NOT _enable_warnings_internal_${lang}_flags_stack) - continue() - endif () - # Pop flags off of end of list, overwrite current flags with whatever we popped off. - list(GET _enable_warnings_internal_${lang}_flags_stack -1 CMAKE_${lang}_FLAGS) - list(REMOVE_AT _enable_warnings_internal_${lang}_flags_stack -1) - # Propagate results up to caller's scope. - set(_enable_warnings_internal_${lang}_flags_stack "${_enable_warnings_internal_${lang}_flags_stack}" PARENT_SCOPE) - string(STRIP "${CMAKE_${lang}_FLAGS}" CMAKE_${lang}_FLAGS) - set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS}" PARENT_SCOPE) - endforeach() -endfunction() +# CMP0092 doesn't appear to really work, really remove the /W3 here. +if (MSVC) + remove_warnings(/W3) +endif () diff --git a/deps/cares/compile b/deps/cares/compile deleted file mode 100755 index df363c8fbfbcbb..00000000000000 --- a/deps/cares/compile +++ /dev/null @@ -1,348 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand '-c -o'. - -scriptversion=2018-03-07.03; # UTC - -# Copyright (C) 1999-2021 Free Software Foundation, Inc. -# Written by Tom Tromey <tromey@cygnus.com>. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <https://www.gnu.org/licenses/>. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to <bug-automake@gnu.org> or send patches to -# <automake-patches@gnu.org>. - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN* | MSYS*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/* | msys/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - for arg - do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand '-c -o'. -Remove '-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file 'INSTALL'. - -Report bugs to <bug-automake@gnu.org>. -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ - icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as 'compile cc -o foo foo.c'. - # So we strip '-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no '-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # '.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use '[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/deps/cares/config.guess b/deps/cares/config.guess deleted file mode 100755 index 7f76b6228f73d6..00000000000000 --- a/deps/cares/config.guess +++ /dev/null @@ -1,1754 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2022 Free Software Foundation, Inc. - -# shellcheck disable=SC2006,SC2268 # see below for rationale - -timestamp='2022-01-09' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see <https://www.gnu.org/licenses/>. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. -# -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess -# -# Please send patches to <config-patches@gnu.org>. - - -# The "shellcheck disable" line above the timestamp inhibits complaints -# about features and limitations of the classic Bourne shell that were -# superseded or lifted in POSIX. However, this script identifies a wide -# variety of pre-POSIX systems that do not have POSIX shells at all, and -# even some reasonably current systems (Solaris 10 as case-in-point) still -# have a pre-POSIX /bin/sh. - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2022 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -# Just in case it came from the environment. -GUESS= - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -tmp= -# shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 - -set_cc_for_build() { - # prevent multiple calls if $tmp is already set - test "$tmp" && return 0 - : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039,SC3028 - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } - dummy=$tmp/dummy - case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in - ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do - if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD=$driver - break - fi - done - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; - esac -} - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if test -f /.attbin/uname ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case $UNAME_SYSTEM in -Linux|GNU|GNU/*) - LIBC=unknown - - set_cc_for_build - cat <<-EOF > "$dummy.c" - #include <features.h> - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #elif defined(__GLIBC__) - LIBC=gnu - #else - #include <stdarg.h> - /* First heuristic to detect musl libc. */ - #ifdef __DEFINED_va_list - LIBC=musl - #endif - #endif - EOF - cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` - eval "$cc_set_libc" - - # Second heuristic to detect musl libc. - if [ "$LIBC" = unknown ] && - command -v ldd >/dev/null && - ldd --version 2>&1 | grep -q ^musl; then - LIBC=musl - fi - - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - if [ "$LIBC" = unknown ]; then - LIBC=gnu - fi - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ - /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ - echo unknown)` - case $UNAME_MACHINE_ARCH in - aarch64eb) machine=aarch64_be-unknown ;; - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine=${arch}${endian}-unknown - ;; - *) machine=$UNAME_MACHINE_ARCH-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently (or will in the future) and ABI. - case $UNAME_MACHINE_ARCH in - earm*) - os=netbsdelf - ;; - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # Determine ABI tags. - case $UNAME_MACHINE_ARCH in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case $UNAME_VERSION in - Debian*) - release='-gnu' - ;; - *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - GUESS=$machine-${os}${release}${abi-} - ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE - ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE - ;; - *:SecBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE - ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE - ;; - *:MidnightBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE - ;; - *:ekkoBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE - ;; - *:SolidBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE - ;; - *:OS108:*:*) - GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE - ;; - macppc:MirBSD:*:*) - GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE - ;; - *:MirBSD:*:*) - GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE - ;; - *:Sortix:*:*) - GUESS=$UNAME_MACHINE-unknown-sortix - ;; - *:Twizzler:*:*) - GUESS=$UNAME_MACHINE-unknown-twizzler - ;; - *:Redox:*:*) - GUESS=$UNAME_MACHINE-unknown-redox - ;; - mips:OSF1:*.*) - GUESS=mips-dec-osf1 - ;; - alpha:OSF1:*:*) - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - trap '' 0 - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case $ALPHA_CPU_TYPE in - "EV4 (21064)") - UNAME_MACHINE=alpha ;; - "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; - "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; - "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; - "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; - "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; - "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; - "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; - "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; - "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; - "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; - "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - GUESS=$UNAME_MACHINE-dec-osf$OSF_REL - ;; - Amiga*:UNIX_System_V:4.0:*) - GUESS=m68k-unknown-sysv4 - ;; - *:[Aa]miga[Oo][Ss]:*:*) - GUESS=$UNAME_MACHINE-unknown-amigaos - ;; - *:[Mm]orph[Oo][Ss]:*:*) - GUESS=$UNAME_MACHINE-unknown-morphos - ;; - *:OS/390:*:*) - GUESS=i370-ibm-openedition - ;; - *:z/VM:*:*) - GUESS=s390-ibm-zvmoe - ;; - *:OS400:*:*) - GUESS=powerpc-ibm-os400 - ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - GUESS=arm-acorn-riscix$UNAME_RELEASE - ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - GUESS=arm-unknown-riscos - ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - GUESS=hppa1.1-hitachi-hiuxmpp - ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - case `(/bin/universe) 2>/dev/null` in - att) GUESS=pyramid-pyramid-sysv3 ;; - *) GUESS=pyramid-pyramid-bsd ;; - esac - ;; - NILE*:*:*:dcosx) - GUESS=pyramid-pyramid-svr4 - ;; - DRS?6000:unix:4.0:6*) - GUESS=sparc-icl-nx6 - ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) GUESS=sparc-icl-nx7 ;; - esac - ;; - s390x:SunOS:*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL - ;; - sun4H:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-hal-solaris2$SUN_REL - ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-sun-solaris2$SUN_REL - ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - GUESS=i386-pc-auroraux$UNAME_RELEASE - ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - set_cc_for_build - SUN_ARCH=i386 - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH=x86_64 - fi - fi - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=$SUN_ARCH-pc-solaris2$SUN_REL - ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=sparc-sun-solaris3$SUN_REL - ;; - sun4*:SunOS:*:*) - case `/usr/bin/arch -k` in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` - GUESS=sparc-sun-sunos$SUN_REL - ;; - sun3*:SunOS:*:*) - GUESS=m68k-sun-sunos$UNAME_RELEASE - ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case `/bin/arch` in - sun3) - GUESS=m68k-sun-sunos$UNAME_RELEASE - ;; - sun4) - GUESS=sparc-sun-sunos$UNAME_RELEASE - ;; - esac - ;; - aushp:SunOS:*:*) - GUESS=sparc-auspex-sunos$UNAME_RELEASE - ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - GUESS=m68k-atari-mint$UNAME_RELEASE - ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - GUESS=m68k-milan-mint$UNAME_RELEASE - ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - GUESS=m68k-hades-mint$UNAME_RELEASE - ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - GUESS=m68k-unknown-mint$UNAME_RELEASE - ;; - m68k:machten:*:*) - GUESS=m68k-apple-machten$UNAME_RELEASE - ;; - powerpc:machten:*:*) - GUESS=powerpc-apple-machten$UNAME_RELEASE - ;; - RISC*:Mach:*:*) - GUESS=mips-dec-mach_bsd4.3 - ;; - RISC*:ULTRIX:*:*) - GUESS=mips-dec-ultrix$UNAME_RELEASE - ;; - VAX*:ULTRIX*:*:*) - GUESS=vax-dec-ultrix$UNAME_RELEASE - ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - GUESS=clipper-intergraph-clix$UNAME_RELEASE - ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" -#ifdef __cplusplus -#include <stdio.h> /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && - { echo "$SYSTEM_NAME"; exit; } - GUESS=mips-mips-riscos$UNAME_RELEASE - ;; - Motorola:PowerMAX_OS:*:*) - GUESS=powerpc-motorola-powermax - ;; - Motorola:*:4.3:PL8-*) - GUESS=powerpc-harris-powermax - ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - GUESS=powerpc-harris-powermax - ;; - Night_Hawk:Power_UNIX:*:*) - GUESS=powerpc-harris-powerunix - ;; - m88k:CX/UX:7*:*) - GUESS=m88k-harris-cxux7 - ;; - m88k:*:4*:R4*) - GUESS=m88k-motorola-sysv4 - ;; - m88k:*:3*:R3*) - GUESS=m88k-motorola-sysv3 - ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 - then - if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ - test "$TARGET_BINARY_INTERFACE"x = x - then - GUESS=m88k-dg-dgux$UNAME_RELEASE - else - GUESS=m88k-dg-dguxbcs$UNAME_RELEASE - fi - else - GUESS=i586-dg-dgux$UNAME_RELEASE - fi - ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - GUESS=m88k-dolphin-sysv3 - ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - GUESS=m88k-motorola-sysv3 - ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - GUESS=m88k-tektronix-sysv3 - ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - GUESS=m68k-tektronix-bsd - ;; - *:IRIX*:*:*) - IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` - GUESS=mips-sgi-irix$IRIX_REL - ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id - ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - GUESS=i386-ibm-aix - ;; - ia64:AIX:*:*) - if test -x /usr/bin/oslevel ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=$UNAME_VERSION.$UNAME_RELEASE - fi - GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV - ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` - then - GUESS=$SYSTEM_NAME - else - GUESS=rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - GUESS=rs6000-ibm-aix3.2.4 - else - GUESS=rs6000-ibm-aix3.2 - fi - ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if test -x /usr/bin/lslpp ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` - else - IBM_REV=$UNAME_VERSION.$UNAME_RELEASE - fi - GUESS=$IBM_ARCH-ibm-aix$IBM_REV - ;; - *:AIX:*:*) - GUESS=rs6000-ibm-aix - ;; - ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - GUESS=romp-ibm-bsd4.4 - ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to - ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - GUESS=rs6000-bull-bosx - ;; - DPX/2?00:B.O.S.:*:*) - GUESS=m68k-bull-sysv3 - ;; - 9000/[34]??:4.3bsd:1.*:*) - GUESS=m68k-hp-bsd - ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - GUESS=m68k-hp-bsd4.4 - ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` - case $UNAME_MACHINE in - 9000/31?) HP_ARCH=m68000 ;; - 9000/[34]??) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if test -x /usr/bin/getconf; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case $sc_cpu_version in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case $sc_kernel_bits in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 - esac ;; - esac - fi - if test "$HP_ARCH" = ""; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - - #define _HPUX_SOURCE - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if test "$HP_ARCH" = hppa2.0w - then - set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH=hppa2.0w - else - HP_ARCH=hppa64 - fi - fi - GUESS=$HP_ARCH-hp-hpux$HPUX_REV - ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` - GUESS=ia64-hp-hpux$HPUX_REV - ;; - 3050*:HI-UX:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - GUESS=unknown-hitachi-hiuxwe2 - ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - GUESS=hppa1.1-hp-bsd - ;; - 9000/8??:4.3bsd:*:*) - GUESS=hppa1.0-hp-bsd - ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - GUESS=hppa1.0-hp-mpeix - ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - GUESS=hppa1.1-hp-osf - ;; - hp8??:OSF1:*:*) - GUESS=hppa1.0-hp-osf - ;; - i*86:OSF1:*:*) - if test -x /usr/sbin/sysversion ; then - GUESS=$UNAME_MACHINE-unknown-osf1mk - else - GUESS=$UNAME_MACHINE-unknown-osf1 - fi - ;; - parisc*:Lites*:*:*) - GUESS=hppa1.1-hp-lites - ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - GUESS=c1-convex-bsd - ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - GUESS=c34-convex-bsd - ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - GUESS=c38-convex-bsd - ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - GUESS=c4-convex-bsd - ;; - CRAY*Y-MP:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=ymp-cray-unicos$CRAY_REL - ;; - CRAY*[A-Z]90:*:*:*) - echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=t90-cray-unicos$CRAY_REL - ;; - CRAY*T3E:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=alphaev5-cray-unicosmk$CRAY_REL - ;; - CRAY*SV1:*:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=sv1-cray-unicos$CRAY_REL - ;; - *:UNICOS/mp:*:*) - CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` - GUESS=craynv-cray-unicosmp$CRAY_REL - ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} - ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} - ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE - ;; - sparc*:BSD/OS:*:*) - GUESS=sparc-unknown-bsdi$UNAME_RELEASE - ;; - *:BSD/OS:*:*) - GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE - ;; - arm:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - set_cc_for_build - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi - else - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf - fi - ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case $UNAME_PROCESSOR in - amd64) - UNAME_PROCESSOR=x86_64 ;; - i386) - UNAME_PROCESSOR=i586 ;; - esac - FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL - ;; - i*:CYGWIN*:*) - GUESS=$UNAME_MACHINE-pc-cygwin - ;; - *:MINGW64*:*) - GUESS=$UNAME_MACHINE-pc-mingw64 - ;; - *:MINGW*:*) - GUESS=$UNAME_MACHINE-pc-mingw32 - ;; - *:MSYS*:*) - GUESS=$UNAME_MACHINE-pc-msys - ;; - i*:PW*:*) - GUESS=$UNAME_MACHINE-pc-pw32 - ;; - *:SerenityOS:*:*) - GUESS=$UNAME_MACHINE-pc-serenity - ;; - *:Interix*:*) - case $UNAME_MACHINE in - x86) - GUESS=i586-pc-interix$UNAME_RELEASE - ;; - authenticamd | genuineintel | EM64T) - GUESS=x86_64-unknown-interix$UNAME_RELEASE - ;; - IA64) - GUESS=ia64-unknown-interix$UNAME_RELEASE - ;; - esac ;; - i*:UWIN*:*) - GUESS=$UNAME_MACHINE-pc-uwin - ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - GUESS=x86_64-pc-cygwin - ;; - prep*:SunOS:5.*:*) - SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` - GUESS=powerpcle-unknown-solaris2$SUN_REL - ;; - *:GNU:*:*) - # the GNU system - GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` - GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` - GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL - ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` - GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC - ;; - *:Minix:*:*) - GUESS=$UNAME_MACHINE-unknown-minix - ;; - aarch64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - arm*:Linux:*:*) - set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi - else - GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf - fi - fi - ;; - avr32*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - cris:Linux:*:*) - GUESS=$UNAME_MACHINE-axis-linux-$LIBC - ;; - crisv32:Linux:*:*) - GUESS=$UNAME_MACHINE-axis-linux-$LIBC - ;; - e2k:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - frv:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - hexagon:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - i*86:Linux:*:*) - GUESS=$UNAME_MACHINE-pc-linux-$LIBC - ;; - ia64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - k1om:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - m32r*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - m68*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - mips:Linux:*:* | mips64:Linux:*:*) - set_cc_for_build - IS_GLIBC=0 - test x"${LIBC}" = xgnu && IS_GLIBC=1 - sed 's/^ //' << EOF > "$dummy.c" - #undef CPU - #undef mips - #undef mipsel - #undef mips64 - #undef mips64el - #if ${IS_GLIBC} && defined(_ABI64) - LIBCABI=gnuabi64 - #else - #if ${IS_GLIBC} && defined(_ABIN32) - LIBCABI=gnuabin32 - #else - LIBCABI=${LIBC} - #endif - #endif - - #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa64r6 - #else - #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa32r6 - #else - #if defined(__mips64) - CPU=mips64 - #else - CPU=mips - #endif - #endif - #endif - - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - MIPS_ENDIAN=el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - MIPS_ENDIAN= - #else - MIPS_ENDIAN= - #endif - #endif -EOF - cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` - eval "$cc_set_vars" - test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } - ;; - mips64el:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - openrisc*:Linux:*:*) - GUESS=or1k-unknown-linux-$LIBC - ;; - or32:Linux:*:* | or1k*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - padre:Linux:*:*) - GUESS=sparc-unknown-linux-$LIBC - ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - GUESS=hppa64-unknown-linux-$LIBC - ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; - PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; - *) GUESS=hppa-unknown-linux-$LIBC ;; - esac - ;; - ppc64:Linux:*:*) - GUESS=powerpc64-unknown-linux-$LIBC - ;; - ppc:Linux:*:*) - GUESS=powerpc-unknown-linux-$LIBC - ;; - ppc64le:Linux:*:*) - GUESS=powerpc64le-unknown-linux-$LIBC - ;; - ppcle:Linux:*:*) - GUESS=powerpcle-unknown-linux-$LIBC - ;; - riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - s390:Linux:*:* | s390x:Linux:*:*) - GUESS=$UNAME_MACHINE-ibm-linux-$LIBC - ;; - sh64*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - sh*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - tile*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - vax:Linux:*:*) - GUESS=$UNAME_MACHINE-dec-linux-$LIBC - ;; - x86_64:Linux:*:*) - set_cc_for_build - LIBCABI=$LIBC - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI=${LIBC}x32 - fi - fi - GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI - ;; - xtensa*:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - GUESS=i386-sequent-sysv4 - ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION - ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - GUESS=$UNAME_MACHINE-pc-os2-emx - ;; - i*86:XTS-300:*:STOP) - GUESS=$UNAME_MACHINE-unknown-stop - ;; - i*86:atheos:*:*) - GUESS=$UNAME_MACHINE-unknown-atheos - ;; - i*86:syllable:*:*) - GUESS=$UNAME_MACHINE-pc-syllable - ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - GUESS=i386-unknown-lynxos$UNAME_RELEASE - ;; - i*86:*DOS:*:*) - GUESS=$UNAME_MACHINE-pc-msdosdjgpp - ;; - i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL - else - GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL - fi - ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL - else - GUESS=$UNAME_MACHINE-pc-sysv32 - fi - ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that - # this is a cross-build. - GUESS=i586-pc-msdosdjgpp - ;; - Intel:Mach:3*:*) - GUESS=i386-pc-mach3 - ;; - paragon:*:*:*) - GUESS=i860-intel-osf1 - ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 - fi - ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - GUESS=m68010-convergent-sysv - ;; - mc68k:UNIX:SYSTEM5:3.51m) - GUESS=m68k-convergent-sysv - ;; - M680?0:D-NIX:5.3:*) - GUESS=m68k-diab-dnix - ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - GUESS=m68k-unknown-lynxos$UNAME_RELEASE - ;; - mc68030:UNIX_System_V:4.*:*) - GUESS=m68k-atari-sysv4 - ;; - TSUNAMI:LynxOS:2.*:*) - GUESS=sparc-unknown-lynxos$UNAME_RELEASE - ;; - rs6000:LynxOS:2.*:*) - GUESS=rs6000-unknown-lynxos$UNAME_RELEASE - ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - GUESS=powerpc-unknown-lynxos$UNAME_RELEASE - ;; - SM[BE]S:UNIX_SV:*:*) - GUESS=mips-dde-sysv$UNAME_RELEASE - ;; - RM*:ReliantUNIX-*:*:*) - GUESS=mips-sni-sysv4 - ;; - RM*:SINIX-*:*:*) - GUESS=mips-sni-sysv4 - ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - GUESS=$UNAME_MACHINE-sni-sysv4 - else - GUESS=ns32k-sni-sysv - fi - ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says <Richard.M.Bartel@ccMail.Census.GOV> - GUESS=i586-unisys-sysv4 - ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes <hewes@openmarket.com>. - # How about differentiating between stratus architectures? -djm - GUESS=hppa1.1-stratus-sysv4 - ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - GUESS=i860-stratus-sysv4 - ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - GUESS=$UNAME_MACHINE-stratus-vos - ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - GUESS=hppa1.1-stratus-vos - ;; - mc68*:A/UX:*:*) - GUESS=m68k-apple-aux$UNAME_RELEASE - ;; - news*:NEWS-OS:6*:*) - GUESS=mips-sony-newsos6 - ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if test -d /usr/nec; then - GUESS=mips-nec-sysv$UNAME_RELEASE - else - GUESS=mips-unknown-sysv$UNAME_RELEASE - fi - ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - GUESS=powerpc-be-beos - ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - GUESS=powerpc-apple-beos - ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - GUESS=i586-pc-beos - ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - GUESS=i586-pc-haiku - ;; - x86_64:Haiku:*:*) - GUESS=x86_64-unknown-haiku - ;; - SX-4:SUPER-UX:*:*) - GUESS=sx4-nec-superux$UNAME_RELEASE - ;; - SX-5:SUPER-UX:*:*) - GUESS=sx5-nec-superux$UNAME_RELEASE - ;; - SX-6:SUPER-UX:*:*) - GUESS=sx6-nec-superux$UNAME_RELEASE - ;; - SX-7:SUPER-UX:*:*) - GUESS=sx7-nec-superux$UNAME_RELEASE - ;; - SX-8:SUPER-UX:*:*) - GUESS=sx8-nec-superux$UNAME_RELEASE - ;; - SX-8R:SUPER-UX:*:*) - GUESS=sx8r-nec-superux$UNAME_RELEASE - ;; - SX-ACE:SUPER-UX:*:*) - GUESS=sxace-nec-superux$UNAME_RELEASE - ;; - Power*:Rhapsody:*:*) - GUESS=powerpc-apple-rhapsody$UNAME_RELEASE - ;; - *:Rhapsody:*:*) - GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE - ;; - arm64:Darwin:*:*) - GUESS=aarch64-apple-darwin$UNAME_RELEASE - ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - if command -v xcode-select > /dev/null 2> /dev/null && \ - ! xcode-select --print-path > /dev/null 2> /dev/null ; then - # Avoid executing cc if there is no toolchain installed as - # cc will be a stub that puts up a graphical alert - # prompting the user to install developer tools. - CC_FOR_BUILD=no_compiler_found - else - set_cc_for_build - fi - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # uname -m returns i386 or x86_64 - UNAME_PROCESSOR=$UNAME_MACHINE - fi - GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE - ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE - ;; - *:QNX:*:4*) - GUESS=i386-pc-qnx - ;; - NEO-*:NONSTOP_KERNEL:*:*) - GUESS=neo-tandem-nsk$UNAME_RELEASE - ;; - NSE-*:NONSTOP_KERNEL:*:*) - GUESS=nse-tandem-nsk$UNAME_RELEASE - ;; - NSR-*:NONSTOP_KERNEL:*:*) - GUESS=nsr-tandem-nsk$UNAME_RELEASE - ;; - NSV-*:NONSTOP_KERNEL:*:*) - GUESS=nsv-tandem-nsk$UNAME_RELEASE - ;; - NSX-*:NONSTOP_KERNEL:*:*) - GUESS=nsx-tandem-nsk$UNAME_RELEASE - ;; - *:NonStop-UX:*:*) - GUESS=mips-compaq-nonstopux - ;; - BS2000:POSIX*:*:*) - GUESS=bs2000-siemens-sysv - ;; - DS/*:UNIX_System_V:*:*) - GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE - ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "${cputype-}" = 386; then - UNAME_MACHINE=i386 - elif test "x${cputype-}" != x; then - UNAME_MACHINE=$cputype - fi - GUESS=$UNAME_MACHINE-unknown-plan9 - ;; - *:TOPS-10:*:*) - GUESS=pdp10-unknown-tops10 - ;; - *:TENEX:*:*) - GUESS=pdp10-unknown-tenex - ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - GUESS=pdp10-dec-tops20 - ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - GUESS=pdp10-xkl-tops20 - ;; - *:TOPS-20:*:*) - GUESS=pdp10-unknown-tops20 - ;; - *:ITS:*:*) - GUESS=pdp10-unknown-its - ;; - SEI:*:*:SEIUX) - GUESS=mips-sei-seiux$UNAME_RELEASE - ;; - *:DragonFly:*:*) - DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` - GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL - ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case $UNAME_MACHINE in - A*) GUESS=alpha-dec-vms ;; - I*) GUESS=ia64-dec-vms ;; - V*) GUESS=vax-dec-vms ;; - esac ;; - *:XENIX:*:SysV) - GUESS=i386-pc-xenix - ;; - i*86:skyos:*:*) - SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` - GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL - ;; - i*86:rdos:*:*) - GUESS=$UNAME_MACHINE-pc-rdos - ;; - i*86:Fiwix:*:*) - GUESS=$UNAME_MACHINE-pc-fiwix - ;; - *:AROS:*:*) - GUESS=$UNAME_MACHINE-unknown-aros - ;; - x86_64:VMkernel:*:*) - GUESS=$UNAME_MACHINE-unknown-esx - ;; - amd64:Isilon\ OneFS:*:*) - GUESS=x86_64-unknown-onefs - ;; - *:Unleashed:*:*) - GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE - ;; -esac - -# Do we have a guess based on uname results? -if test "x$GUESS" != x; then - echo "$GUESS" - exit -fi - -# No uname command or uname output not recognized. -set_cc_for_build -cat > "$dummy.c" <<EOF -#ifdef _SEQUENT_ -#include <sys/types.h> -#include <sys/utsname.h> -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#include <signal.h> -#if defined(_SIZE_T_) || defined(SIGLOST) -#include <sys/utsname.h> -#endif -#endif -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include <sys/param.h> - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); -#endif - -#if defined (vax) -#if !defined (ultrix) -#include <sys/param.h> -#if defined (BSD) -#if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -#else -#if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#endif -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#else -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname un; - uname (&un); - printf ("vax-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname *un; - uname (&un); - printf ("mips-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("mips-dec-ultrix\n"); exit (0); -#endif -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. -test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } - -echo "$0: unable to guess system type" >&2 - -case $UNAME_MACHINE:$UNAME_SYSTEM in - mips:Linux | mips64:Linux) - # If we got here on MIPS GNU/Linux, output extra information. - cat >&2 <<EOF - -NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize -the system type. Please install a C compiler and try again. -EOF - ;; -esac - -cat >&2 <<EOF - -This script (version $timestamp), has failed to recognize the -operating system you are using. If your script is old, overwrite *all* -copies of config.guess and config.sub with the latest versions from: - - https://git.savannah.gnu.org/cgit/config.git/plain/config.guess -and - https://git.savannah.gnu.org/cgit/config.git/plain/config.sub -EOF - -our_year=`echo $timestamp | sed 's,-.*,,'` -thisyear=`date +%Y` -# shellcheck disable=SC2003 -script_age=`expr "$thisyear" - "$our_year"` -if test "$script_age" -lt 3 ; then - cat >&2 <<EOF - -If $0 has already been updated, send the following data and any -information you think might be pertinent to config-patches@gnu.org to -provide the necessary information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = "$UNAME_MACHINE" -UNAME_RELEASE = "$UNAME_RELEASE" -UNAME_SYSTEM = "$UNAME_SYSTEM" -UNAME_VERSION = "$UNAME_VERSION" -EOF -fi - -exit 1 - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/deps/cares/config.sub b/deps/cares/config.sub deleted file mode 100755 index dba16e84c77c7d..00000000000000 --- a/deps/cares/config.sub +++ /dev/null @@ -1,1890 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2022 Free Software Foundation, Inc. - -# shellcheck disable=SC2006,SC2268 # see below for rationale - -timestamp='2022-01-03' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see <https://www.gnu.org/licenses/>. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to <config-patches@gnu.org>. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -# The "shellcheck disable" line above the timestamp inhibits complaints -# about features and limitations of the classic Bourne shell that were -# superseded or lifted in POSIX. However, this script identifies a wide -# variety of pre-POSIX systems that do not have POSIX shells at all, and -# even some reasonably current systems (Solaris 10 as case-in-point) still -# have a pre-POSIX /bin/sh. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS - -Canonicalize a configuration name. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2022 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo "$1" - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Split fields of configuration type -# shellcheck disable=SC2162 -saved_IFS=$IFS -IFS="-" read field1 field2 field3 field4 <<EOF -$1 -EOF -IFS=$saved_IFS - -# Separate into logical components for further validation -case $1 in - *-*-*-*-*) - echo Invalid configuration \`"$1"\': more than four components >&2 - exit 1 - ;; - *-*-*-*) - basic_machine=$field1-$field2 - basic_os=$field3-$field4 - ;; - *-*-*) - # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two - # parts - maybe_os=$field2-$field3 - case $maybe_os in - nto-qnx* | linux-* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) - basic_machine=$field1 - basic_os=$maybe_os - ;; - android-linux) - basic_machine=$field1-unknown - basic_os=linux-android - ;; - *) - basic_machine=$field1-$field2 - basic_os=$field3 - ;; - esac - ;; - *-*) - # A lone config we happen to match not fitting any pattern - case $field1-$field2 in - decstation-3100) - basic_machine=mips-dec - basic_os= - ;; - *-*) - # Second component is usually, but not always the OS - case $field2 in - # Prevent following clause from handling this valid os - sun*os*) - basic_machine=$field1 - basic_os=$field2 - ;; - zephyr*) - basic_machine=$field1-unknown - basic_os=$field2 - ;; - # Manufacturers - dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ - | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ - | unicom* | ibm* | next | hp | isi* | apollo | altos* \ - | convergent* | ncr* | news | 32* | 3600* | 3100* \ - | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ - | ultra | tti* | harris | dolphin | highlevel | gould \ - | cbm | ns | masscomp | apple | axis | knuth | cray \ - | microblaze* | sim | cisco \ - | oki | wec | wrs | winbond) - basic_machine=$field1-$field2 - basic_os= - ;; - *) - basic_machine=$field1 - basic_os=$field2 - ;; - esac - ;; - esac - ;; - *) - # Convert single-component short-hands not valid as part of - # multi-component configurations. - case $field1 in - 386bsd) - basic_machine=i386-pc - basic_os=bsd - ;; - a29khif) - basic_machine=a29k-amd - basic_os=udi - ;; - adobe68k) - basic_machine=m68010-adobe - basic_os=scout - ;; - alliant) - basic_machine=fx80-alliant - basic_os= - ;; - altos | altos3068) - basic_machine=m68k-altos - basic_os= - ;; - am29k) - basic_machine=a29k-none - basic_os=bsd - ;; - amdahl) - basic_machine=580-amdahl - basic_os=sysv - ;; - amiga) - basic_machine=m68k-unknown - basic_os= - ;; - amigaos | amigados) - basic_machine=m68k-unknown - basic_os=amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - basic_os=sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - basic_os=sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - basic_os=bsd - ;; - aros) - basic_machine=i386-pc - basic_os=aros - ;; - aux) - basic_machine=m68k-apple - basic_os=aux - ;; - balance) - basic_machine=ns32k-sequent - basic_os=dynix - ;; - blackfin) - basic_machine=bfin-unknown - basic_os=linux - ;; - cegcc) - basic_machine=arm-unknown - basic_os=cegcc - ;; - convex-c1) - basic_machine=c1-convex - basic_os=bsd - ;; - convex-c2) - basic_machine=c2-convex - basic_os=bsd - ;; - convex-c32) - basic_machine=c32-convex - basic_os=bsd - ;; - convex-c34) - basic_machine=c34-convex - basic_os=bsd - ;; - convex-c38) - basic_machine=c38-convex - basic_os=bsd - ;; - cray) - basic_machine=j90-cray - basic_os=unicos - ;; - crds | unos) - basic_machine=m68k-crds - basic_os= - ;; - da30) - basic_machine=m68k-da30 - basic_os= - ;; - decstation | pmax | pmin | dec3100 | decstatn) - basic_machine=mips-dec - basic_os= - ;; - delta88) - basic_machine=m88k-motorola - basic_os=sysv3 - ;; - dicos) - basic_machine=i686-pc - basic_os=dicos - ;; - djgpp) - basic_machine=i586-pc - basic_os=msdosdjgpp - ;; - ebmon29k) - basic_machine=a29k-amd - basic_os=ebmon - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - basic_os=ose - ;; - gmicro) - basic_machine=tron-gmicro - basic_os=sysv - ;; - go32) - basic_machine=i386-pc - basic_os=go32 - ;; - h8300hms) - basic_machine=h8300-hitachi - basic_os=hms - ;; - h8300xray) - basic_machine=h8300-hitachi - basic_os=xray - ;; - h8500hms) - basic_machine=h8500-hitachi - basic_os=hms - ;; - harris) - basic_machine=m88k-harris - basic_os=sysv3 - ;; - hp300 | hp300hpux) - basic_machine=m68k-hp - basic_os=hpux - ;; - hp300bsd) - basic_machine=m68k-hp - basic_os=bsd - ;; - hppaosf) - basic_machine=hppa1.1-hp - basic_os=osf - ;; - hppro) - basic_machine=hppa1.1-hp - basic_os=proelf - ;; - i386mach) - basic_machine=i386-mach - basic_os=mach - ;; - isi68 | isi) - basic_machine=m68k-isi - basic_os=sysv - ;; - m68knommu) - basic_machine=m68k-unknown - basic_os=linux - ;; - magnum | m3230) - basic_machine=mips-mips - basic_os=sysv - ;; - merlin) - basic_machine=ns32k-utek - basic_os=sysv - ;; - mingw64) - basic_machine=x86_64-pc - basic_os=mingw64 - ;; - mingw32) - basic_machine=i686-pc - basic_os=mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - basic_os=mingw32ce - ;; - monitor) - basic_machine=m68k-rom68k - basic_os=coff - ;; - morphos) - basic_machine=powerpc-unknown - basic_os=morphos - ;; - moxiebox) - basic_machine=moxie-unknown - basic_os=moxiebox - ;; - msdos) - basic_machine=i386-pc - basic_os=msdos - ;; - msys) - basic_machine=i686-pc - basic_os=msys - ;; - mvs) - basic_machine=i370-ibm - basic_os=mvs - ;; - nacl) - basic_machine=le32-unknown - basic_os=nacl - ;; - ncr3000) - basic_machine=i486-ncr - basic_os=sysv4 - ;; - netbsd386) - basic_machine=i386-pc - basic_os=netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - basic_os=linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - basic_os=newsos - ;; - news1000) - basic_machine=m68030-sony - basic_os=newsos - ;; - necv70) - basic_machine=v70-nec - basic_os=sysv - ;; - nh3000) - basic_machine=m68k-harris - basic_os=cxux - ;; - nh[45]000) - basic_machine=m88k-harris - basic_os=cxux - ;; - nindy960) - basic_machine=i960-intel - basic_os=nindy - ;; - mon960) - basic_machine=i960-intel - basic_os=mon960 - ;; - nonstopux) - basic_machine=mips-compaq - basic_os=nonstopux - ;; - os400) - basic_machine=powerpc-ibm - basic_os=os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - basic_os=ose - ;; - os68k) - basic_machine=m68k-none - basic_os=os68k - ;; - paragon) - basic_machine=i860-intel - basic_os=osf - ;; - parisc) - basic_machine=hppa-unknown - basic_os=linux - ;; - psp) - basic_machine=mipsallegrexel-sony - basic_os=psp - ;; - pw32) - basic_machine=i586-unknown - basic_os=pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - basic_os=rdos - ;; - rdos32) - basic_machine=i386-pc - basic_os=rdos - ;; - rom68k) - basic_machine=m68k-rom68k - basic_os=coff - ;; - sa29200) - basic_machine=a29k-amd - basic_os=udi - ;; - sei) - basic_machine=mips-sei - basic_os=seiux - ;; - sequent) - basic_machine=i386-sequent - basic_os= - ;; - sps7) - basic_machine=m68k-bull - basic_os=sysv2 - ;; - st2000) - basic_machine=m68k-tandem - basic_os= - ;; - stratus) - basic_machine=i860-stratus - basic_os=sysv4 - ;; - sun2) - basic_machine=m68000-sun - basic_os= - ;; - sun2os3) - basic_machine=m68000-sun - basic_os=sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - basic_os=sunos4 - ;; - sun3) - basic_machine=m68k-sun - basic_os= - ;; - sun3os3) - basic_machine=m68k-sun - basic_os=sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - basic_os=sunos4 - ;; - sun4) - basic_machine=sparc-sun - basic_os= - ;; - sun4os3) - basic_machine=sparc-sun - basic_os=sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - basic_os=sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - basic_os=solaris2 - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - basic_os= - ;; - sv1) - basic_machine=sv1-cray - basic_os=unicos - ;; - symmetry) - basic_machine=i386-sequent - basic_os=dynix - ;; - t3e) - basic_machine=alphaev5-cray - basic_os=unicos - ;; - t90) - basic_machine=t90-cray - basic_os=unicos - ;; - toad1) - basic_machine=pdp10-xkl - basic_os=tops20 - ;; - tpf) - basic_machine=s390x-ibm - basic_os=tpf - ;; - udi29k) - basic_machine=a29k-amd - basic_os=udi - ;; - ultra3) - basic_machine=a29k-nyu - basic_os=sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - basic_os=none - ;; - vaxv) - basic_machine=vax-dec - basic_os=sysv - ;; - vms) - basic_machine=vax-dec - basic_os=vms - ;; - vsta) - basic_machine=i386-pc - basic_os=vsta - ;; - vxworks960) - basic_machine=i960-wrs - basic_os=vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - basic_os=vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - basic_os=vxworks - ;; - xbox) - basic_machine=i686-pc - basic_os=mingw32 - ;; - ymp) - basic_machine=ymp-cray - basic_os=unicos - ;; - *) - basic_machine=$1 - basic_os= - ;; - esac - ;; -esac - -# Decode 1-component or ad-hoc basic machines -case $basic_machine in - # Here we handle the default manufacturer of certain CPU types. It is in - # some cases the only manufacturer, in others, it is the most popular. - w89k) - cpu=hppa1.1 - vendor=winbond - ;; - op50n) - cpu=hppa1.1 - vendor=oki - ;; - op60c) - cpu=hppa1.1 - vendor=oki - ;; - ibm*) - cpu=i370 - vendor=ibm - ;; - orion105) - cpu=clipper - vendor=highlevel - ;; - mac | mpw | mac-mpw) - cpu=m68k - vendor=apple - ;; - pmac | pmac-mpw) - cpu=powerpc - vendor=apple - ;; - - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - cpu=m68000 - vendor=att - ;; - 3b*) - cpu=we32k - vendor=att - ;; - bluegene*) - cpu=powerpc - vendor=ibm - basic_os=cnk - ;; - decsystem10* | dec10*) - cpu=pdp10 - vendor=dec - basic_os=tops10 - ;; - decsystem20* | dec20*) - cpu=pdp10 - vendor=dec - basic_os=tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - cpu=m68k - vendor=motorola - ;; - dpx2*) - cpu=m68k - vendor=bull - basic_os=sysv3 - ;; - encore | umax | mmax) - cpu=ns32k - vendor=encore - ;; - elxsi) - cpu=elxsi - vendor=elxsi - basic_os=${basic_os:-bsd} - ;; - fx2800) - cpu=i860 - vendor=alliant - ;; - genix) - cpu=ns32k - vendor=ns - ;; - h3050r* | hiux*) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - cpu=m68000 - vendor=hp - ;; - hp9k3[2-9][0-9]) - cpu=m68k - vendor=hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - i*86v32) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv32 - ;; - i*86v4*) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv4 - ;; - i*86v) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=sysv - ;; - i*86sol2) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - basic_os=solaris2 - ;; - j90 | j90-cray) - cpu=j90 - vendor=cray - basic_os=${basic_os:-unicos} - ;; - iris | iris4d) - cpu=mips - vendor=sgi - case $basic_os in - irix*) - ;; - *) - basic_os=irix4 - ;; - esac - ;; - miniframe) - cpu=m68000 - vendor=convergent - ;; - *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) - cpu=m68k - vendor=atari - basic_os=mint - ;; - news-3600 | risc-news) - cpu=mips - vendor=sony - basic_os=newsos - ;; - next | m*-next) - cpu=m68k - vendor=next - case $basic_os in - openstep*) - ;; - nextstep*) - ;; - ns2*) - basic_os=nextstep2 - ;; - *) - basic_os=nextstep3 - ;; - esac - ;; - np1) - cpu=np1 - vendor=gould - ;; - op50n-* | op60c-*) - cpu=hppa1.1 - vendor=oki - basic_os=proelf - ;; - pa-hitachi) - cpu=hppa1.1 - vendor=hitachi - basic_os=hiuxwe2 - ;; - pbd) - cpu=sparc - vendor=tti - ;; - pbb) - cpu=m68k - vendor=tti - ;; - pc532) - cpu=ns32k - vendor=pc532 - ;; - pn) - cpu=pn - vendor=gould - ;; - power) - cpu=power - vendor=ibm - ;; - ps2) - cpu=i386 - vendor=ibm - ;; - rm[46]00) - cpu=mips - vendor=siemens - ;; - rtpc | rtpc-*) - cpu=romp - vendor=ibm - ;; - sde) - cpu=mipsisa32 - vendor=sde - basic_os=${basic_os:-elf} - ;; - simso-wrs) - cpu=sparclite - vendor=wrs - basic_os=vxworks - ;; - tower | tower-32) - cpu=m68k - vendor=ncr - ;; - vpp*|vx|vx-*) - cpu=f301 - vendor=fujitsu - ;; - w65) - cpu=w65 - vendor=wdc - ;; - w89k-*) - cpu=hppa1.1 - vendor=winbond - basic_os=proelf - ;; - none) - cpu=none - vendor=none - ;; - leon|leon[3-9]) - cpu=sparc - vendor=$basic_machine - ;; - leon-*|leon[3-9]-*) - cpu=sparc - vendor=`echo "$basic_machine" | sed 's/-.*//'` - ;; - - *-*) - # shellcheck disable=SC2162 - saved_IFS=$IFS - IFS="-" read cpu vendor <<EOF -$basic_machine -EOF - IFS=$saved_IFS - ;; - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - cpu=$basic_machine - vendor=pc - ;; - # These rules are duplicated from below for sake of the special case above; - # i.e. things that normalized to x86 arches should also default to "pc" - pc98) - cpu=i386 - vendor=pc - ;; - x64 | amd64) - cpu=x86_64 - vendor=pc - ;; - # Recognize the basic CPU types without company name. - *) - cpu=$basic_machine - vendor=unknown - ;; -esac - -unset -v basic_machine - -# Decode basic machines in the full and proper CPU-Company form. -case $cpu-$vendor in - # Here we handle the default manufacturer of certain CPU types in canonical form. It is in - # some cases the only manufacturer, in others, it is the most popular. - craynv-unknown) - vendor=cray - basic_os=${basic_os:-unicosmp} - ;; - c90-unknown | c90-cray) - vendor=cray - basic_os=${Basic_os:-unicos} - ;; - fx80-unknown) - vendor=alliant - ;; - romp-unknown) - vendor=ibm - ;; - mmix-unknown) - vendor=knuth - ;; - microblaze-unknown | microblazeel-unknown) - vendor=xilinx - ;; - rs6000-unknown) - vendor=ibm - ;; - vax-unknown) - vendor=dec - ;; - pdp11-unknown) - vendor=dec - ;; - we32k-unknown) - vendor=att - ;; - cydra-unknown) - vendor=cydrome - ;; - i370-ibm*) - vendor=ibm - ;; - orion-unknown) - vendor=highlevel - ;; - xps-unknown | xps100-unknown) - cpu=xps100 - vendor=honeywell - ;; - - # Here we normalize CPU types with a missing or matching vendor - armh-unknown | armh-alt) - cpu=armv7l - vendor=alt - basic_os=${basic_os:-linux-gnueabihf} - ;; - dpx20-unknown | dpx20-bull) - cpu=rs6000 - vendor=bull - basic_os=${basic_os:-bosx} - ;; - - # Here we normalize CPU types irrespective of the vendor - amd64-*) - cpu=x86_64 - ;; - blackfin-*) - cpu=bfin - basic_os=linux - ;; - c54x-*) - cpu=tic54x - ;; - c55x-*) - cpu=tic55x - ;; - c6x-*) - cpu=tic6x - ;; - e500v[12]-*) - cpu=powerpc - basic_os=${basic_os}"spe" - ;; - mips3*-*) - cpu=mips64 - ;; - ms1-*) - cpu=mt - ;; - m68knommu-*) - cpu=m68k - basic_os=linux - ;; - m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) - cpu=s12z - ;; - openrisc-*) - cpu=or32 - ;; - parisc-*) - cpu=hppa - basic_os=linux - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - cpu=i586 - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) - cpu=i686 - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - cpu=i686 - ;; - pentium4-*) - cpu=i786 - ;; - pc98-*) - cpu=i386 - ;; - ppc-* | ppcbe-*) - cpu=powerpc - ;; - ppcle-* | powerpclittle-*) - cpu=powerpcle - ;; - ppc64-*) - cpu=powerpc64 - ;; - ppc64le-* | powerpc64little-*) - cpu=powerpc64le - ;; - sb1-*) - cpu=mipsisa64sb1 - ;; - sb1el-*) - cpu=mipsisa64sb1el - ;; - sh5e[lb]-*) - cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` - ;; - spur-*) - cpu=spur - ;; - strongarm-* | thumb-*) - cpu=arm - ;; - tx39-*) - cpu=mipstx39 - ;; - tx39el-*) - cpu=mipstx39el - ;; - x64-*) - cpu=x86_64 - ;; - xscale-* | xscalee[bl]-*) - cpu=`echo "$cpu" | sed 's/^xscale/arm/'` - ;; - arm64-* | aarch64le-*) - cpu=aarch64 - ;; - - # Recognize the canonical CPU Types that limit and/or modify the - # company names they are paired with. - cr16-*) - basic_os=${basic_os:-elf} - ;; - crisv32-* | etraxfs*-*) - cpu=crisv32 - vendor=axis - ;; - cris-* | etrax*-*) - cpu=cris - vendor=axis - ;; - crx-*) - basic_os=${basic_os:-elf} - ;; - neo-tandem) - cpu=neo - vendor=tandem - ;; - nse-tandem) - cpu=nse - vendor=tandem - ;; - nsr-tandem) - cpu=nsr - vendor=tandem - ;; - nsv-tandem) - cpu=nsv - vendor=tandem - ;; - nsx-tandem) - cpu=nsx - vendor=tandem - ;; - mipsallegrexel-sony) - cpu=mipsallegrexel - vendor=sony - ;; - tile*-*) - basic_os=${basic_os:-linux-gnu} - ;; - - *) - # Recognize the canonical CPU types that are allowed with any - # company name. - case $cpu in - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | abacus \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ - | alphapca5[67] | alpha64pca5[67] \ - | am33_2.0 \ - | amdgcn \ - | arc | arceb | arc32 | arc64 \ - | arm | arm[lb]e | arme[lb] | armv* \ - | avr | avr32 \ - | asmjs \ - | ba \ - | be32 | be64 \ - | bfin | bpf | bs2000 \ - | c[123]* | c30 | [cjt]90 | c4x \ - | c8051 | clipper | craynv | csky | cydra \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | elxsi | epiphany \ - | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ - | h8300 | h8500 \ - | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i*86 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | loongarch32 | loongarch64 | loongarchx32 \ - | m32c | m32r | m32rle \ - | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ - | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ - | m88110 | m88k | maxq | mb | mcore | mep | metag \ - | microblaze | microblazeel \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64eb | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r3 | mipsisa32r3el \ - | mipsisa32r5 | mipsisa32r5el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r3 | mipsisa64r3el \ - | mipsisa64r5 | mipsisa64r5el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mmix \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nfp \ - | nios | nios2 | nios2eb | nios2el \ - | none | np1 | ns16k | ns32k | nvptx \ - | open8 \ - | or1k* \ - | or32 \ - | orion \ - | picochip \ - | pdp10 | pdp11 | pj | pjl | pn | power \ - | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ - | pru \ - | pyramid \ - | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ - | rl78 | romp | rs6000 | rx \ - | s390 | s390x \ - | score \ - | sh | shl \ - | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ - | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ - | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ - | spu \ - | tahoe \ - | thumbv7* \ - | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ - | tron \ - | ubicom32 \ - | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ - | vax \ - | visium \ - | w65 \ - | wasm32 | wasm64 \ - | we32k \ - | x86 | x86_64 | xc16x | xgate | xps100 \ - | xstormy16 | xtensa* \ - | ymp \ - | z8k | z80) - ;; - - *) - echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 - exit 1 - ;; - esac - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $vendor in - digital*) - vendor=dec - ;; - commodore*) - vendor=cbm - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if test x$basic_os != x -then - -# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just -# set os. -case $basic_os in - gnu/linux*) - kernel=linux - os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` - ;; - os2-emx) - kernel=os2 - os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` - ;; - nto-qnx*) - kernel=nto - os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` - ;; - *-*) - # shellcheck disable=SC2162 - saved_IFS=$IFS - IFS="-" read kernel os <<EOF -$basic_os -EOF - IFS=$saved_IFS - ;; - # Default OS when just kernel was specified - nto*) - kernel=nto - os=`echo "$basic_os" | sed -e 's|nto|qnx|'` - ;; - linux*) - kernel=linux - os=`echo "$basic_os" | sed -e 's|linux|gnu|'` - ;; - *) - kernel= - os=$basic_os - ;; -esac - -# Now, normalize the OS (knowing we just have one component, it's not a kernel, -# etc.) -case $os in - # First match some system type aliases that might get confused - # with valid system types. - # solaris* is a basic system type, with this one exception. - auroraux) - os=auroraux - ;; - bluegene*) - os=cnk - ;; - solaris1 | solaris1.*) - os=`echo "$os" | sed -e 's|solaris1|sunos4|'` - ;; - solaris) - os=solaris2 - ;; - unixware*) - os=sysv4.2uw - ;; - # es1800 is here to avoid being matched by es* (a different OS) - es1800*) - os=ose - ;; - # Some version numbers need modification - chorusos*) - os=chorusos - ;; - isc) - os=isc2.2 - ;; - sco6) - os=sco5v6 - ;; - sco5) - os=sco3.2v5 - ;; - sco4) - os=sco3.2v4 - ;; - sco3.2.[4-9]*) - os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'` - ;; - sco*v* | scout) - # Don't match below - ;; - sco*) - os=sco3.2v2 - ;; - psos*) - os=psos - ;; - qnx*) - os=qnx - ;; - hiux*) - os=hiuxwe2 - ;; - lynx*178) - os=lynxos178 - ;; - lynx*5) - os=lynxos5 - ;; - lynxos*) - # don't get caught up in next wildcard - ;; - lynx*) - os=lynxos - ;; - mac[0-9]*) - os=`echo "$os" | sed -e 's|mac|macos|'` - ;; - opened*) - os=openedition - ;; - os400*) - os=os400 - ;; - sunos5*) - os=`echo "$os" | sed -e 's|sunos5|solaris2|'` - ;; - sunos6*) - os=`echo "$os" | sed -e 's|sunos6|solaris3|'` - ;; - wince*) - os=wince - ;; - utek*) - os=bsd - ;; - dynix*) - os=bsd - ;; - acis*) - os=aos - ;; - atheos*) - os=atheos - ;; - syllable*) - os=syllable - ;; - 386bsd) - os=bsd - ;; - ctix* | uts*) - os=sysv - ;; - nova*) - os=rtmk-nova - ;; - ns2) - os=nextstep2 - ;; - # Preserve the version number of sinix5. - sinix5.*) - os=`echo "$os" | sed -e 's|sinix|sysv|'` - ;; - sinix*) - os=sysv4 - ;; - tpf*) - os=tpf - ;; - triton*) - os=sysv3 - ;; - oss*) - os=sysv3 - ;; - svr4*) - os=sysv4 - ;; - svr3) - os=sysv3 - ;; - sysvr4) - os=sysv4 - ;; - ose*) - os=ose - ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) - os=mint - ;; - dicos*) - os=dicos - ;; - pikeos*) - # Until real need of OS specific support for - # particular features comes up, bare metal - # configurations are quite functional. - case $cpu in - arm*) - os=eabi - ;; - *) - os=elf - ;; - esac - ;; - *) - # No normalization, but not necessarily accepted, that comes below. - ;; -esac - -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -kernel= -case $cpu-$vendor in - score-*) - os=elf - ;; - spu-*) - os=elf - ;; - *-acorn) - os=riscix1.2 - ;; - arm*-rebel) - kernel=linux - os=gnu - ;; - arm*-semi) - os=aout - ;; - c4x-* | tic4x-*) - os=coff - ;; - c8051-*) - os=elf - ;; - clipper-intergraph) - os=clix - ;; - hexagon-*) - os=elf - ;; - tic54x-*) - os=coff - ;; - tic55x-*) - os=coff - ;; - tic6x-*) - os=coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=tops20 - ;; - pdp11-*) - os=none - ;; - *-dec | vax-*) - os=ultrix4.2 - ;; - m68*-apollo) - os=domain - ;; - i386-sun) - os=sunos4.0.2 - ;; - m68000-sun) - os=sunos3 - ;; - m68*-cisco) - os=aout - ;; - mep-*) - os=elf - ;; - mips*-cisco) - os=elf - ;; - mips*-*) - os=elf - ;; - or32-*) - os=coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=sysv3 - ;; - sparc-* | *-sun) - os=sunos4.1.1 - ;; - pru-*) - os=elf - ;; - *-be) - os=beos - ;; - *-ibm) - os=aix - ;; - *-knuth) - os=mmixware - ;; - *-wec) - os=proelf - ;; - *-winbond) - os=proelf - ;; - *-oki) - os=proelf - ;; - *-hp) - os=hpux - ;; - *-hitachi) - os=hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=sysv - ;; - *-cbm) - os=amigaos - ;; - *-dg) - os=dgux - ;; - *-dolphin) - os=sysv3 - ;; - m68k-ccur) - os=rtu - ;; - m88k-omron*) - os=luna - ;; - *-next) - os=nextstep - ;; - *-sequent) - os=ptx - ;; - *-crds) - os=unos - ;; - *-ns) - os=genix - ;; - i370-*) - os=mvs - ;; - *-gould) - os=sysv - ;; - *-highlevel) - os=bsd - ;; - *-encore) - os=bsd - ;; - *-sgi) - os=irix - ;; - *-siemens) - os=sysv4 - ;; - *-masscomp) - os=rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=uxpv - ;; - *-rom68k) - os=coff - ;; - *-*bug) - os=coff - ;; - *-apple) - os=macos - ;; - *-atari*) - os=mint - ;; - *-wrs) - os=vxworks - ;; - *) - os=none - ;; -esac - -fi - -# Now, validate our (potentially fixed-up) OS. -case $os in - # Sometimes we do "kernel-libc", so those need to count as OSes. - musl* | newlib* | relibc* | uclibc*) - ;; - # Likewise for "kernel-abi" - eabi* | gnueabi*) - ;; - # VxWorks passes extra cpu info in the 4th filed. - simlinux | simwindows | spe) - ;; - # Now accept the basic system types. - # The portable systems comes first. - # Each alternative MUST end in a * to match a version number. - gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ - | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ - | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* \ - | mpw* | magic* | mmixware* | mon960* | lnews* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* | twizzler* \ - | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ - | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ - | mirbsd* | netbsd* | dicos* | openedition* | ose* \ - | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ - | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ - | udi* | lites* | ieee* | go32* | aux* | hcos* \ - | chorusrdb* | cegcc* | glidix* | serenity* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ - | midipix* | mingw32* | mingw64* | mint* \ - | uxpv* | beos* | mpeix* | udk* | moxiebox* \ - | interix* | uwin* | mks* | rhapsody* | darwin* \ - | openstep* | oskit* | conix* | pw32* | nonstopux* \ - | storm-chaos* | tops10* | tenex* | tops20* | its* \ - | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ - | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ - | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ - | fiwix* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - ;; - none) - ;; - *) - echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 - exit 1 - ;; -esac - -# As a final step for OS-related things, validate the OS-kernel combination -# (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ - | linux-musl* | linux-relibc* | linux-uclibc* ) - ;; - uclinux-uclibc* ) - ;; - -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) - # These are just libc implementations, not actual OSes, and thus - # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 - exit 1 - ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) - ;; - vxworks-simlinux | vxworks-simwindows | vxworks-spe) - ;; - nto-qnx*) - ;; - os2-emx) - ;; - *-eabi* | *-gnueabi*) - ;; - -*) - # Blank kernel with real OS is always fine. - ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 - exit 1 - ;; -esac - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -case $vendor in - unknown) - case $cpu-$os in - *-riscix*) - vendor=acorn - ;; - *-sunos*) - vendor=sun - ;; - *-cnk* | *-aix*) - vendor=ibm - ;; - *-beos*) - vendor=be - ;; - *-hpux*) - vendor=hp - ;; - *-mpeix*) - vendor=hp - ;; - *-hiux*) - vendor=hitachi - ;; - *-unos*) - vendor=crds - ;; - *-dgux*) - vendor=dg - ;; - *-luna*) - vendor=omron - ;; - *-genix*) - vendor=ns - ;; - *-clix*) - vendor=intergraph - ;; - *-mvs* | *-opened*) - vendor=ibm - ;; - *-os400*) - vendor=ibm - ;; - s390-* | s390x-*) - vendor=ibm - ;; - *-ptx*) - vendor=sequent - ;; - *-tpf*) - vendor=ibm - ;; - *-vxsim* | *-vxworks* | *-windiss*) - vendor=wrs - ;; - *-aux*) - vendor=apple - ;; - *-hms*) - vendor=hitachi - ;; - *-mpw* | *-macos*) - vendor=apple - ;; - *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) - vendor=atari - ;; - *-vos*) - vendor=stratus - ;; - esac - ;; -esac - -echo "$cpu-$vendor-${kernel:+$kernel-}$os" -exit - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/deps/cares/config/openharmony/ares_config.h b/deps/cares/config/openharmony/ares_config.h new file mode 100644 index 00000000000000..ec9f81d40e6a1e --- /dev/null +++ b/deps/cares/config/openharmony/ares_config.h @@ -0,0 +1,573 @@ +/* src/lib/ares_config.h. Generated from ares_config.h.in by configure. */ +/* src/lib/ares_config.h.in. Generated from configure.ac by autoheader. */ + +/* a suitable file/device to read random data from */ +#define CARES_RANDOM_FILE "/dev/urandom" + +/* Set to 1 if non-pubilc shared library symbols are hidden */ +#define CARES_SYMBOL_HIDING 1 + +/* Threading enabled */ +#define CARES_THREADS 1 + +/* the signed version of size_t */ +#define CARES_TYPEOF_ARES_SSIZE_T ssize_t + +/* Use resolver library to configure cares */ +/* #undef CARES_USE_LIBRESOLV */ + +/* if a /etc/inet dir is being used */ +/* #undef ETC_INET */ + +/* gethostname() arg2 type */ +#define GETHOSTNAME_TYPE_ARG2 size_t + +/* getnameinfo() arg1 type */ +#define GETNAMEINFO_TYPE_ARG1 struct sockaddr * + +/* getnameinfo() arg2 type */ +#define GETNAMEINFO_TYPE_ARG2 socklen_t + +/* getnameinfo() arg4 and 6 type */ +#define GETNAMEINFO_TYPE_ARG46 socklen_t + +/* getnameinfo() arg7 type */ +#define GETNAMEINFO_TYPE_ARG7 int + +/* number of arguments for getservbyname_r() */ +/* #undef GETSERVBYNAME_R_ARGS */ + +/* number of arguments for getservbyport_r() */ +#define GETSERVBYPORT_R_ARGS 6 + +/* Define to 1 if you have AF_INET6 */ +#define HAVE_AF_INET6 1 + +/* Define to 1 if you have `arc4random_buf` */ +/* #undef HAVE_ARC4RANDOM_BUF */ + +/* Define to 1 if you have the <arpa/inet.h> header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the <arpa/nameser_compat.h> header file. */ +#define HAVE_ARPA_NAMESER_COMPAT_H 1 + +/* Define to 1 if you have the <arpa/nameser.h> header file. */ +#define HAVE_ARPA_NAMESER_H 1 + +/* Define to 1 if you have the <assert.h> header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the <AvailabilityMacros.h> header file. */ +/* #undef HAVE_AVAILABILITYMACROS_H */ + +/* Define to 1 if you have `clock_gettime` */ +#define HAVE_CLOCK_GETTIME 1 + +/* clock_gettime() with CLOCK_MONOTONIC support */ +#define HAVE_CLOCK_GETTIME_MONOTONIC 1 + +/* Define to 1 if you have `closesocket` */ +/* #undef HAVE_CLOSESOCKET */ + +/* Define to 1 if you have `CloseSocket` */ +/* #undef HAVE_CLOSESOCKET_CAMEL */ + +/* Define to 1 if you have `connect` */ +#define HAVE_CONNECT 1 + +/* Define to 1 if you have `ConvertInterfaceIndexToLuid` */ +/* #undef HAVE_CONVERTINTERFACEINDEXTOLUID */ + +/* Define to 1 if you have `ConvertInterfaceLuidToNameA` */ +/* #undef HAVE_CONVERTINTERFACELUIDTONAMEA */ + +/* define if the compiler supports basic C++14 syntax */ +#define HAVE_CXX14 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have `epoll_{create1,ctl,wait}` */ +#define HAVE_EPOLL 1 + +/* Define to 1 if you have the <errno.h> header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have `fcntl` */ +#define HAVE_FCNTL 1 + +/* Define to 1 if you have the <fcntl.h> header file. */ +#define HAVE_FCNTL_H 1 + +/* fcntl() with O_NONBLOCK support */ +#define HAVE_FCNTL_O_NONBLOCK 1 + +/* Define to 1 if you have `getenv` */ +#define HAVE_GETENV 1 + +/* Define to 1 if you have `gethostname` */ +#define HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have `getifaddrs` */ +#define HAVE_GETIFADDRS 1 + +/* Define to 1 if you have `getnameinfo` */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have `getrandom` */ +#define HAVE_GETRANDOM 1 + +/* Define to 1 if you have `getservbyport_r` */ +/* #undef HAVE_GETSERVBYPORT_R 1 */ + +/* Define to 1 if you have `gettimeofday` */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the <ifaddrs.h> header file. */ +#define HAVE_IFADDRS_H 1 + +/* Define to 1 if you have `if_indextoname` */ +#define HAVE_IF_INDEXTONAME 1 + +/* Define to 1 if you have `if_nametoindex` */ +#define HAVE_IF_NAMETOINDEX 1 + +/* Define to 1 if you have `inet_net_pton` */ +#define HAVE_INET_NET_PTON 1 + +/* Define to 1 if you have `inet_ntop` */ +#define HAVE_INET_NTOP 1 + +/* Define to 1 if you have `inet_pton` */ +#define HAVE_INET_PTON 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have `ioctl` */ +#define HAVE_IOCTL 1 + +/* Define to 1 if you have `ioctlsocket` */ +/* #undef HAVE_IOCTLSOCKET */ + +/* Define to 1 if you have `IoctlSocket` */ +/* #undef HAVE_IOCTLSOCKET_CAMEL */ + +/* ioctlsocket() with FIONBIO support */ +/* #undef HAVE_IOCTLSOCKET_FIONBIO */ + +/* ioctl() with FIONBIO support */ +#define HAVE_IOCTL_FIONBIO 1 + +/* Define to 1 if you have the <iphlpapi.h> header file. */ +/* #undef HAVE_IPHLPAPI_H */ + +/* Define to 1 if you have `kqueue` */ +/* #undef HAVE_KQUEUE */ + +/* Define to 1 if you have the <limits.h> header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if the compiler supports the 'long long' data type. */ +#define HAVE_LONGLONG 1 + +/* Define to 1 if you have the <malloc.h> header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the <minix/config.h> header file. */ +/* #undef HAVE_MINIX_CONFIG_H */ + +/* Define to 1 if you have the <mswsock.h> header file. */ +/* #undef HAVE_MSWSOCK_H */ + +/* Define to 1 if you have the <netdb.h> header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the <netinet/in.h> header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the <netinet/tcp.h> header file. */ +#define HAVE_NETINET_TCP_H 1 + +/* Define to 1 if you have the <netioapi.h> header file. */ +/* #undef HAVE_NETIOAPI_H */ + +/* Define to 1 if you have the <net/if.h> header file. */ +#define HAVE_NET_IF_H 1 + +/* Define to 1 if you have the <ntdef.h> header file. */ +/* #undef HAVE_NTDEF_H */ + +/* Define to 1 if you have the <ntstatus.h> header file. */ +/* #undef HAVE_NTSTATUS_H */ + +/* Define to 1 if you have PF_INET6 */ +#define HAVE_PF_INET6 1 + +/* Define to 1 if you have `pipe` */ +#define HAVE_PIPE 1 + +/* Define to 1 if you have `pipe2` */ +#define HAVE_PIPE2 1 + +/* Define to 1 if you have `poll` */ +#define HAVE_POLL 1 + +/* Define to 1 if you have the <poll.h> header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the <pthread.h> header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the <pthread_np.h> header file. */ +/* #undef HAVE_PTHREAD_NP_H */ + +/* Have PTHREAD_PRIO_INHERIT. */ +#define HAVE_PTHREAD_PRIO_INHERIT 1 + +/* Define to 1 if you have `recv` */ +#define HAVE_RECV 1 + +/* Define to 1 if you have `recvfrom` */ +#define HAVE_RECVFROM 1 + +/* Define to 1 if you have `send` */ +#define HAVE_SEND 1 + +/* Define to 1 if you have `setsockopt` */ +#define HAVE_SETSOCKOPT 1 + +/* setsockopt() with SO_NONBLOCK support */ +/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */ + +/* Define to 1 if you have `socket` */ +#define HAVE_SOCKET 1 + +/* Define to 1 if you have the <socket.h> header file. */ +/* #undef HAVE_SOCKET_H */ + +/* socklen_t */ +#define HAVE_SOCKLEN_T /**/ + +/* Define to 1 if you have `stat` */ +#define HAVE_STAT 1 + +/* Define to 1 if you have the <stdbool.h> header file. */ +#define HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdio.h> header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have `strcasecmp` */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have `strdup` */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have `stricmp` */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have `strncasecmp` */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have `strncmpi` */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have `strnicmp` */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if `ai_flags' is a member of `struct addrinfo'. */ +#define HAVE_STRUCT_ADDRINFO_AI_FLAGS 1 + +/* Define to 1 if the system has the type `struct in6_addr'. */ +#define HAVE_STRUCT_IN6_ADDR 1 + +/* Define to 1 if the system has the type `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6 1 + +/* Define to 1 if `sin6_scope_id' is a member of `struct sockaddr_in6'. */ +#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* Define to 1 if the system has the type `struct timeval'. */ +#define HAVE_STRUCT_TIMEVAL 1 + +/* Define to 1 if you have the <sys/epoll.h> header file. */ +#define HAVE_SYS_EPOLL_H 1 + +/* Define to 1 if you have the <sys/event.h> header file. */ +/* #undef HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the <sys/filio.h> header file. */ +/* #undef HAVE_SYS_FILIO_H */ + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the <sys/param.h> header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the <sys/random.h> header file. */ +#define HAVE_SYS_RANDOM_H 1 + +/* Define to 1 if you have the <sys/select.h> header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <sys/uio.h> header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the <time.h> header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Whether user namespaces are available */ +#define HAVE_USER_NAMESPACE 1 + +/* Whether UTS namespaces are available */ +#define HAVE_UTS_NAMESPACE 1 + +/* Define to 1 if you have the <wchar.h> header file. */ +#define HAVE_WCHAR_H 1 + +/* Define to 1 if you have the <windows.h> header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the <winsock2.h> header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the <winternl.h> header file. */ +/* #undef HAVE_WINTERNL_H */ + +/* Define to 1 if you have `writev` */ +#define HAVE_WRITEV 1 + +/* Define to 1 if you have the <ws2ipdef.h> header file. */ +/* #undef HAVE_WS2IPDEF_H */ + +/* Define to 1 if you have the <ws2tcpip.h> header file. */ +/* #undef HAVE_WS2TCPIP_H */ + +/* Define to 1 if you have `__system_property_get` */ +/* #undef HAVE___SYSTEM_PROPERTY_GET */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "c-ares" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "c-ares mailing list: http://lists.haxx.se/listinfo/c-ares" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "c-ares" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "c-ares 1.26.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "c-ares" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.26.0" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* recvfrom() arg5 qualifier */ +#define RECVFROM_QUAL_ARG5 + +/* recvfrom() arg1 type */ +#define RECVFROM_TYPE_ARG1 int + +/* recvfrom() arg2 type */ +#define RECVFROM_TYPE_ARG2 void * + +/* recvfrom() arg3 type */ +#define RECVFROM_TYPE_ARG3 size_t + +/* recvfrom() arg4 type */ +#define RECVFROM_TYPE_ARG4 int + +/* recvfrom() arg5 type */ +#define RECVFROM_TYPE_ARG5 struct sockaddr * + +/* recvfrom() return value */ +#define RECVFROM_TYPE_RETV ssize_t + +/* recv() arg1 type */ +#define RECV_TYPE_ARG1 int + +/* recv() arg2 type */ +#define RECV_TYPE_ARG2 void * + +/* recv() arg3 type */ +#define RECV_TYPE_ARG3 size_t + +/* recv() arg4 type */ +#define RECV_TYPE_ARG4 int + +/* recv() return value */ +#define RECV_TYPE_RETV ssize_t + +/* send() arg2 qualifier */ +#define SEND_QUAL_ARG2 + +/* send() arg1 type */ +#define SEND_TYPE_ARG1 int + +/* send() arg2 type */ +#define SEND_TYPE_ARG2 void * + +/* send() arg3 type */ +#define SEND_TYPE_ARG3 size_t + +/* send() arg4 type */ +#define SEND_TYPE_ARG4 int + +/* send() return value */ +#define SEND_TYPE_RETV ssize_t + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#define STDC_HEADERS 1 + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable general extensions on macOS. */ +#ifndef _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable X/Open compliant socket functions that do not require linking + with -lxnet on HP-UX 11.11. */ +#ifndef _HPUX_ALT_XOPEN_SOCKET_API +# define _HPUX_ALT_XOPEN_SOCKET_API 1 +#endif +/* Identify the host operating system as Minix. + This macro does not affect the system headers' behavior. + A future release of Autoconf may stop defining this macro. */ +#ifndef _MINIX +/* # undef _MINIX */ +#endif +/* Enable general extensions on NetBSD. + Enable NetBSD compatibility extensions on Minix. */ +#ifndef _NETBSD_SOURCE +# define _NETBSD_SOURCE 1 +#endif +/* Enable OpenBSD compatibility extensions on NetBSD. + Oddly enough, this does nothing on OpenBSD. */ +#ifndef _OPENBSD_SOURCE +# define _OPENBSD_SOURCE 1 +#endif +/* Define to 1 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_SOURCE +/* # undef _POSIX_SOURCE */ +#endif +/* Define to 2 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_1_SOURCE +/* # undef _POSIX_1_SOURCE */ +#endif +/* Enable POSIX-compatible threading on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ +#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +# define __STDC_WANT_IEC_60559_BFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ +#ifndef __STDC_WANT_IEC_60559_DFP_EXT__ +# define __STDC_WANT_IEC_60559_DFP_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ +#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ +# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1 +#endif +/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ +#ifndef __STDC_WANT_LIB_EXT2__ +# define __STDC_WANT_LIB_EXT2__ 1 +#endif +/* Enable extensions specified by ISO/IEC 24747:2009. */ +#ifndef __STDC_WANT_MATH_SPEC_FUNCS__ +# define __STDC_WANT_MATH_SPEC_FUNCS__ 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable X/Open extensions. Define to 500 only if necessary + to make mbstate_t available. */ +#ifndef _XOPEN_SOURCE +/* # undef _XOPEN_SOURCE */ +#endif + + +/* Version number of package */ +#define VERSION "1.26.0" + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ diff --git a/deps/cares/configure b/deps/cares/configure index 656164f46e3ad8..f91e2c956862e7 100755 --- a/deps/cares/configure +++ b/deps/cares/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.28.1. +# Generated by GNU Autoconf 2.71 for c-ares 1.34.6. # # Report bugs to <c-ares mailing list: http://lists.haxx.se/listinfo/c-ares>. # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.28.1' -PACKAGE_STRING='c-ares 1.28.1' +PACKAGE_VERSION='1.34.6' +PACKAGE_STRING='c-ares 1.34.6' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -669,6 +669,10 @@ AM_CPPFLAGS AM_CFLAGS BUILD_TESTS_FALSE BUILD_TESTS_TRUE +GMOCK117_LIBS +GMOCK117_CFLAGS +GMOCK112_LIBS +GMOCK112_CFLAGS GMOCK_LIBS GMOCK_CFLAGS PKG_CONFIG_LIBDIR @@ -777,6 +781,7 @@ am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM +HAVE_CXX17 HAVE_CXX14 ac_ct_CXX CXXFLAGS @@ -852,6 +857,7 @@ with_gcov enable_code_coverage enable_largefile enable_libgcc +enable_tests_crossbuild ' ac_precious_vars='build_alias host_alias @@ -871,7 +877,11 @@ PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GMOCK_CFLAGS -GMOCK_LIBS' +GMOCK_LIBS +GMOCK112_CFLAGS +GMOCK112_LIBS +GMOCK117_CFLAGS +GMOCK117_LIBS' # Initialize some variables set by options. @@ -1420,7 +1430,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.28.1 to adapt to many kinds of systems. +\`configure' configures c-ares 1.34.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1491,7 +1501,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.28.1:";; + short | recursive ) echo "Configuration of c-ares 1.34.6:";; esac cat <<\_ACEOF @@ -1522,6 +1532,8 @@ Optional Features: --enable-code-coverage Whether to enable code coverage support --disable-largefile omit support for large files --enable-libgcc use libgcc when linking + --enable-tests-crossbuild + Enable test building even when cross building Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1559,6 +1571,14 @@ Some influential environment variables: GMOCK_CFLAGS C compiler flags for GMOCK, overriding pkg-config GMOCK_LIBS linker flags for GMOCK, overriding pkg-config + GMOCK112_CFLAGS + C compiler flags for GMOCK112, overriding pkg-config + GMOCK112_LIBS + linker flags for GMOCK112, overriding pkg-config + GMOCK117_CFLAGS + C compiler flags for GMOCK117, overriding pkg-config + GMOCK117_LIBS + linker flags for GMOCK117, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1627,7 +1647,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.28.1 +c-ares configure 1.34.6 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1946,49 +1966,6 @@ fi } # ac_fn_cxx_try_link -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that -# executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } -then : - ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: program exited with status $ac_status" >&5 - printf "%s\n" "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. @@ -2227,6 +2204,49 @@ printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run ac_configure_args_raw= for ac_arg do @@ -2251,7 +2271,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.28.1, which was +It was created by c-ares $as_me 1.34.6, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3225,7 +3245,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="15:1:13" +CARES_VERSION_INFO="21:5:19" @@ -4884,7 +4904,17 @@ else $as_nop // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -5334,1626 +5364,912 @@ printf "%s\n" "#define HAVE_CXX14 1" >>confdefs.h fi -am__api_version='1.16' + ax_cxx_compile_alternatives="17 1z" ax_cxx_compile_cxx17_required=false + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ac_success=no - # Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -printf %s "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if test ${ac_cv_path_install+y} + + + + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do + if test x"$switch" = xMSVC; then + switch=-std:c++${alternative} + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_${switch}_MSVC" | $as_tr_sh` + else + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - # Account for fact that we put trailing slashes in our PATH walk. -case $as_dir in #(( - ./ | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - done -IFS=$as_save_IFS -rm -rf conftest.one conftest.two conftest.dir +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. -fi - if test ${ac_cv_path_install+y}; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -printf "%s\n" "$INSTALL" >&6; } +#ifndef __cplusplus -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +#error "This is not a C++ compiler" -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. +#elif __cplusplus < 201103L && !defined _MSC_VER -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +#error "This is not a C++11 compiler" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 -printf %s "checking whether build environment is sane... " >&6; } -# Reject unsafe characters in $srcdir or the absolute working directory -# name. Accept space and tab only in the latter. -am_lf=' -' -case `pwd` in - *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; -esac -case $srcdir in - *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; -esac +#else -# Do 'set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then +namespace cxx11 +{ - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done - test "$2" = conftest.file - ) -then - # Ok. - : -else - as_fn_error $? "newly created file is older than distributed files! -Check your system clock" "$LINENO" 5 -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi + namespace test_static_assert + { -rm -f conftest.file + template <typename T> + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + } + namespace test_final_override + { - if test x"${MISSING+set}" != xset; then - MISSING="\${SHELL} '$am_aux_dir/missing'" -fi -# Use eval to expand $SHELL -if eval "$MISSING --is-lightweight"; then - am_missing_run="$MISSING " -else - am_missing_run= - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} -fi + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; -if test x"${install_sh+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; - *) - install_sh="\${SHELL} $am_aux_dir/install-sh" - esac -fi + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_STRIP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + } -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -printf "%s\n" "$STRIP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + namespace test_double_right_angle_brackets + { + template < typename T > + struct check {}; -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_STRIP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + typedef check<void> single_type; + typedef check<check<void>> double_type; + typedef check<check<check<void>>> triple_type; + typedef check<check<check<check<void>>>> quadruple_type; -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -printf "%s\n" "$ac_ct_STRIP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + } - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi + namespace test_decltype + { -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 -printf %s "checking for a race-free mkdir -p... " >&6; } -if test -z "$MKDIR_P"; then - if test ${ac_cv_path_mkdir+y} -then : - printf %s "(cached) " >&6 -else $as_nop - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue - case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir ('*'coreutils) '* | \ - 'BusyBox '* | \ - 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext - break 3;; - esac - done - done - done -IFS=$as_save_IFS + namespace test_type_deduction + { -fi + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; - test -d ./--version && rmdir ./--version - if test ${ac_cv_path_mkdir+y}; then - MKDIR_P="$ac_cv_path_mkdir -p" - else - # As a last resort, use the slow shell script. Don't cache a - # value for MKDIR_P within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - MKDIR_P="$ac_install_sh -d" - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -printf "%s\n" "$MKDIR_P" >&6; } + template < typename T > + struct is_same<T, T> + { + static const bool value = true; + }; -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AWK+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -printf "%s\n" "$AWK" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + int + test(const int c, volatile int v) + { + static_assert(is_same<int, decltype(0)>::value == true, ""); + static_assert(is_same<int, decltype(c)>::value == false, ""); + static_assert(is_same<int, decltype(v)>::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same<int, decltype(ac)>::value == true, ""); + static_assert(is_same<int, decltype(av)>::value == true, ""); + static_assert(is_same<int, decltype(sumi)>::value == true, ""); + static_assert(is_same<int, decltype(sumf)>::value == false, ""); + static_assert(is_same<int, decltype(add(c, v))>::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + } - test -n "$AWK" && break -done + namespace test_noexcept + { -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval test \${ac_cv_prog_make_${ac_make}_set+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - SET_MAKE= -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi + int f() { return 0; } + int g() noexcept { return 0; } -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); -DEPDIR="${am__leading_dot}deps" + } -ac_config_commands="$ac_config_commands depfiles" + namespace test_constexpr + { -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 -printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } -cat > confinc.mk << 'END' -am__doit: - @echo this is the am__doit target >confinc.out -.PHONY: am__doit -END -am__include="#" -am__quote= -# BSD make does it like this. -echo '.include "confinc.mk" # ignored' > confmf.BSD -# Other make implementations (GNU, Solaris 10, AIX) do it like this. -echo 'include confinc.mk # ignored' > confmf.GNU -_am_result=no -for s in GNU BSD; do - { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 - (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - case $?:`cat confinc.out 2>/dev/null` in #( - '0:this is the am__doit target') : - case $s in #( - BSD) : - am__include='.include' am__quote='"' ;; #( - *) : - am__include='include' am__quote='' ;; -esac ;; #( - *) : - ;; -esac - if test "$am__include" != "#"; then - _am_result="yes ($s style)" - break - fi -done -rm -f confinc.* confmf.* -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 -printf "%s\n" "${_am_result}" >&6; } + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } -# Check whether --enable-dependency-tracking was given. -if test ${enable_dependency_tracking+y} -then : - enableval=$enable_dependency_tracking; -fi + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' - am__nodep='_no' -fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + } -# Check whether --enable-silent-rules was given. -if test ${enable_silent_rules+y} -then : - enableval=$enable_silent_rules; -fi + namespace test_rvalue_references + { -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=1;; -esac -am_make=${MAKE-make} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -printf %s "checking whether $am_make supports nested variables... " >&6; } -if test ${am_cv_make_support_nested_variables+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' + template < int N > + struct answer + { + static constexpr int value = N; + }; -if test "`cd $srcdir && pwd`" != "`pwd`"; then - # Use -I$(srcdir) only when $(srcdir) != ., so that make's output - # is not polluted with repeated "-I." - am__isrc=' -I$(srcdir)' - # test to see if srcdir already configured - if test -f $srcdir/config.status; then - as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 - fi -fi + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + } -# Define the identity of the package. - PACKAGE='c-ares' - VERSION='1.28.1' + namespace test_uniform_initialization + { + struct test + { + static const int zero {}; + static const int one {1}; + }; -printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + } -printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h + namespace test_lambdas + { -# Some tools Automake needs. + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + } + namespace test_variadic_templates + { -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + template <int...> + struct sum; + template <int N0, int... N1toN> + struct sum<N0, N1toN...> + { + static constexpr auto value = N0 + sum<N1toN...>::value; + }; -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + } -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> -# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> -mkdir_p='$(MKDIR_P)' + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { -# We need awk for the "check" target (and possibly the TAP driver). The -# system "awk" is bad on some platforms. -# Always define AMTAR for backward compatibility. Yes, it's still used -# in the wild :-( We should find a proper way to deprecate it ... -AMTAR='$${TAR-tar}' + struct foo {}; + template<typename T> + using member = typename T::member_type; -# We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' + template<typename T> + void func(...) {} -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + template<typename T> + void func(member<T>*) {} + void test(); + void test() { func<foo>(0); } + } +} // namespace cxx11 -depcc="$CC" am_compiler_list= +#endif // __cplusplus >= 201103L -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -printf %s "checking dependency style of $depcc... " >&6; } -if test ${am_cv_CC_dependencies_compiler_type+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - am_cv_CC_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode - break - fi - fi - done +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. - cd .. - rm -rf conftest.dir -else - am_cv_CC_dependencies_compiler_type=none -fi +#ifndef __cplusplus -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 -printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type +#error "This is not a C++ compiler" - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' -else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= -fi +#elif __cplusplus < 201402L && !defined _MSC_VER +#error "This is not a C++14 compiler" -depcc="$CXX" am_compiler_list= +#else -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 -printf %s "checking dependency style of $depcc... " >&6; } -if test ${am_cv_CXX_dependencies_compiler_type+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". - rm -rf conftest.dir - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub +namespace cxx14 +{ - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - am__universal=false - case " $depcc " in #( - *\ -arch\ *\ -arch\ *) am__universal=true ;; - esac + namespace test_polymorphic_lambdas + { - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } - # We check with '-c' and '-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. - am__obj=sub/conftest.${OBJEXT-o} - am__minus_obj="-o $am__obj" - case $depmode in - gcc) - # This depmode causes a compiler race in universal mode. - test "$am__universal" = false || continue - ;; - nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has - # not run yet. These depmodes are late enough in the game, and - # so weak that their functioning should not be impacted. - am__obj=conftest.${OBJEXT-o} - am__minus_obj= - ;; - none) break ;; - esac - if depmode=$depmode \ - source=sub/conftest.c object=$am__obj \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep $am__obj sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done + } - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi + namespace test_binary_literals + { -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 -printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); - if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi + } + namespace test_generalized_constexpr + { -# Variables for tags utilities; see am/tags.am -if test -z "$CTAGS"; then - CTAGS=ctags -fi + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } -if test -z "$ETAGS"; then - ETAGS=etags -fi + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); -if test -z "$CSCOPE"; then - CSCOPE=cscope -fi + } + namespace test_lambda_init_capture + { + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } -# POSIX will say in a future version that running "rm -f" with no argument -# is OK; and we want to be able to make that assumption in our Makefile -# recipes. So use an aggressive probe to check that the usage we want is -# actually supported "in the wild" to an acceptable degree. -# See automake bug#10828. -# To make any issue more visible, cause the running configure to be aborted -# by default if the 'rm' program in use doesn't match our expectations; the -# user can still override this though. -if rm -f && rm -fr && rm -rf; then : OK; else - cat >&2 <<'END' -Oops! + } -Your 'rm' program seems unable to run without file operands specified -on the command line, even when the '-f' option is present. This is contrary -to the behaviour of most rm programs out there, and not conforming with -the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + namespace test_digit_separators + { -Please tell bug-automake@gnu.org about your system, including the value -of your $PATH and any error possibly output before this message. This -can help us improve future automake versions. + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); -END - if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then - echo 'Configuration will proceed anyway, since you have set the' >&2 - echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 - echo >&2 - else - cat >&2 <<'END' -Aborting the configuration process, to ensure you take notice of the issue. + } -You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: <https://www.gnu.org/software/coreutils/>. + namespace test_return_type_deduction + { -If you want to complete the configuration process using your problematic -'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM -to "yes", and re-run configure. + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } -END - as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 - fi -fi + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; -case `pwd` in - *\ * | *\ *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac + template < typename T > + struct is_same<T, T> + { + static constexpr auto value = true; + }; + int + test() + { + auto x = 0; + static_assert(is_same<int, decltype(f(x))>::value, ""); + static_assert(is_same<int&, decltype(g(x))>::value, ""); + return x; + } + } -macro_version='2.4.7' -macro_revision='2.4.7' +} // namespace cxx14 +#endif // __cplusplus >= 201402L +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. +#ifndef __cplusplus +#error "This is not a C++ compiler" +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L +#error "This is not a C++17 compiler" +#else +#include <initializer_list> +#include <utility> +#include <type_traits> +namespace cxx17 +{ + namespace test_constexpr_lambdas + { -ltmain=$ac_aux_dir/ltmain.sh + constexpr int foo = [](){return 42;}(); + } + namespace test::nested_namespace::definitions + { - # Make sure we can run config.sub. -$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -printf %s "checking build system type... " >&6; } -if test ${ac_cv_build+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + namespace test_fold_expression + { -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -printf "%s\n" "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + template<typename... Args> + int multiply(Args... args) + { + return (args * ... * 1); + } + template<typename... Args> + bool all(Args... args) + { + return (args && ...); + } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -printf %s "checking host system type... " >&6; } -if test ${ac_cv_host+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || - as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 -fi + } -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -printf "%s\n" "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + namespace test_extended_static_assert + { + static_assert (true); -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + } -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' + namespace test_auto_brace_init_list + { -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + auto foo = {5}; + auto bar {5}; -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value); + static_assert(std::is_same<int, decltype(bar)>::value); + } -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' + namespace test_typename_in_template_template_parameter + { -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + template<template<typename> typename X> struct D; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -printf %s "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + } - ECHO='func_fallback_echo' -fi -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} + namespace test_extended_aggregate_initialization + { -case $ECHO in - printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -printf "%s\n" "printf" >&6; } ;; - print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -printf "%s\n" "print -r" >&6; } ;; - *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -printf "%s\n" "cat" >&6; } ;; -esac + struct base1 + { + int b1, b2 = 42; + }; + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + struct derived : base1, base2 + { + int d; + }; + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + } + namespace test_general_range_based_for_loop + { + struct iter + { + int i; + int& operator* () + { + return i; + } + const int& operator* () const + { + return i; + } + iter& operator++() + { + ++i; + return *this; + } + }; + struct sentinel + { + int i; + }; + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + struct range + { + iter begin() const + { + return {0}; + } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -printf %s "checking for a sed that does not truncate output... " >&6; } -if test ${ac_cv_path_SED+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in sed gsed - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac + sentinel end() const + { + return {5}; + } + }; - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi + void f() + { + range r {}; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -printf "%s\n" "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" + } + namespace test_lambda_capture_asterisk_this_by_value + { + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + } + namespace test_enum_class_construction + { + enum class byte : unsigned char + {}; + byte foo {42}; + } + namespace test_constexpr_if + { + template <bool cond> + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -printf %s "checking for grep that handles long lines and -e... " >&6; } -if test ${ac_cv_path_GREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in grep ggrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac + namespace test_selection_statement_with_initializer + { - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi + int f() + { + return 13; + } -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -printf "%s\n" "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + switch (auto i = f(); i + 4) + { + case 17: + return 2; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -printf %s "checking for egrep... " >&6; } -if test ${ac_cv_path_EGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac + default: + return 1; + } + } - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi + } - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -printf "%s\n" "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" + namespace test_template_argument_deduction_for_class_templates + { + template <typename T1, typename T2> + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -printf %s "checking for fgrep... " >&6; } -if test ${ac_cv_path_FGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in fgrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac + T1 m1; + T2 m2; + }; - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -printf "%s\n" "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" + } + + namespace test_non_type_auto_template_parameters + { + template <auto n> + struct B + {}; -test -z "$GREP" && GREP=grep + B<5> b1; + B<'a'> b2; + + } + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair<int, int> pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair<int, int>& + { + return pr; + } + struct S + { + int x1 : 2; + volatile double y1; + }; + S f3() + { + return {}; + } + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + } + namespace test_exception_spec_type_system + { + struct Good {}; + struct Bad {}; + void g1() noexcept; + void g2(); + template<typename T> + Bad + f(T*, T*); + template<typename T1, typename T2> + Good + f(T1*, T2*); + static_assert (std::is_same_v<Good, decltype(f(g1, g2))>); + } + namespace test_inline_variables + { + template<class T> void f(T) + {} + template<class T> inline T g(T) + { + return T{}; + } + template<> inline void f<>(int) + {} + template<> int g<>(int) + { + return 5; + } + } -# Check whether --with-gnu-ld was given. -if test ${with_gnu_ld+y} +} // namespace cxx17 + +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes + eval $cachevar=yes else $as_nop - with_gnu_ld=no + eval $cachevar=no fi - -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -printf %s "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -printf %s "checking for GNU ld... " >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -printf %s "checking for non-GNU ld... " >&6; } -fi -if test ${lt_cv_path_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test no != "$with_gnu_ld" && break - ;; - *) - test yes != "$with_gnu_ld" && break - ;; - esac - fi - done - IFS=$lt_save_ifs -else - lt_cv_path_LD=$LD # Let the user override the test with a path. -fi -fi - -LD=$lt_cv_path_LD -if test -n "$LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -printf "%s\n" "$LD" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -printf %s "checking if the linker ($LD) is GNU ld... " >&6; } -if test ${lt_cv_prog_gnu_ld+y} -then : - printf %s "(cached) " >&6 -else $as_nop - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test x$ax_cxx_compile_cxx17_required = xtrue; then + if test x$ac_success = xno; then + as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 + fi + fi + if test x$ac_success = xno; then + HAVE_CXX17=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 +printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} + else + HAVE_CXX17=1 +printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h + fi +am__api_version='1.16' -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test ${lt_cv_path_NM+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM=$NM -else - lt_nm_to_check=${ac_tool_prefix}nm - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/$lt_tmp_nm - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the 'sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty - case $build_os in - mingw*) lt_bad_file=conftest.nm/nofile ;; - *) lt_bad_file=/dev/null ;; - esac - case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in - *$lt_bad_file* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break 2 - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break 2 - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS=$lt_save_ifs - done - : ${lt_cv_path_NM=no} -fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -printf "%s\n" "$lt_cv_path_NM" >&6; } -if test no != "$lt_cv_path_NM"; then - NM=$lt_cv_path_NM -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DUMPBIN+y} + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -6962,45 +6278,189 @@ do */) ;; *) as_dir=$as_dir/ ;; esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + done IFS=$as_save_IFS +rm -rf conftest.one conftest.two conftest.dir + fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -printf "%s\n" "$DUMPBIN" >&6; } + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! fi +rm -f conftest.file - test -n "$DUMPBIN" && break - done +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7013,7 +6473,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7023,21 +6483,62 @@ IFS=$as_save_IFS fi fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - test -n "$ac_ct_DUMPBIN" && break +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi done + done +IFS=$as_save_IFS - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -7045,809 +6546,795 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DUMPBIN=$ac_ct_DUMPBIN + STRIP=$ac_ct_STRIP fi +else + STRIP="$ac_cv_prog_STRIP" fi - case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols -headers" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test : != "$DUMPBIN"; then - NM=$DUMPBIN - fi fi -test -z "$NM" && NM=nm - - - - +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -printf %s "checking the name lister ($NM) interface... " >&6; } -if test ${lt_cv_nm_interface+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -printf "%s\n" "$lt_cv_nm_interface" >&6; } - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -printf %s "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -printf "%s\n" "no, using $LN_S" >&6; } -fi + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS -# find the maximum length of command line arguments -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -printf %s "checking the maximum length of command line arguments... " >&6; } -if test ${lt_cv_sys_max_cmd_len+y} +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop - i=0 - teststring=ABCD - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test X`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test 17 != "$i" # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi - -if test -n "$lt_cv_sys_max_cmd_len"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 -printf "%s\n" "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - + test -n "$AWK" && break +done -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= else - lt_unset=false + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" fi +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +DEPDIR="${am__leading_dot}deps" +ac_config_commands="$ac_config_commands depfiles" - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi - - - - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -printf %s "checking how to convert $build file names to $host format... " >&6; } -if test ${lt_cv_to_host_file_cmd+y} +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi fi -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +# Define the identity of the package. + PACKAGE='c-ares' + VERSION='1.34.6' +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -printf %s "checking how to convert $build file names to toolchain format... " >&6; } -if test ${lt_cv_to_tool_file_cmd+y} -then : - printf %s "(cached) " >&6 -else $as_nop - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -fi +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } +# Some tools Automake needs. +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -printf %s "checking for $LD option to reload object files... " >&6; } -if test ${lt_cv_ld_reload_flag+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_reload_flag='-r' -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test yes != "$GCC"; then - reload_cmds=false - fi - ;; - darwin*) - if test yes = "$GCC"; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +mkdir_p='$(MKDIR_P)' +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. -set dummy ${ac_tool_prefix}file; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_FILECMD+y} + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$FILECMD"; then - ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_FILECMD="${ac_tool_prefix}file" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub -fi -fi -FILECMD=$ac_cv_prog_FILECMD -if test -n "$FILECMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 -printf "%s\n" "$FILECMD" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf -fi -if test -z "$ac_cv_prog_FILECMD"; then - ac_ct_FILECMD=$FILECMD - # Extract the first word of "file", so it can be a program name with args. -set dummy file; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_FILECMD+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_FILECMD"; then - ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_FILECMD="file" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi done -IFS=$as_save_IFS -fi -fi -ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD -if test -n "$ac_ct_FILECMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 -printf "%s\n" "$ac_ct_FILECMD" >&6; } + cd .. + rm -rf conftest.dir else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + am_cv_CC_dependencies_compiler_type=none fi - if test "x$ac_ct_FILECMD" = x; then - FILECMD=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - FILECMD=$ac_ct_FILECMD - fi -else - FILECMD="$ac_cv_prog_FILECMD" fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi +depcc="$CXX" am_compiler_list= - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OBJDUMP+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi -done - done -IFS=$as_save_IFS + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -printf "%s\n" "$OBJDUMP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OBJDUMP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags fi + +if test -z "$ETAGS"; then + ETAGS=etags fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -printf "%s\n" "$ac_ct_OBJDUMP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + +if test -z "$CSCOPE"; then + CSCOPE=cscope fi - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <https://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" fi -test -z "$OBJDUMP" && OBJDUMP=objdump +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac +macro_version='2.4.7' +macro_revision='2.4.7' -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -printf %s "checking how to recognize dependent libraries... " >&6; } -if test ${lt_cv_deplibs_check_method+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# 'unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# that responds to the $file_magic_cmd with a given extended regex. -# If you have 'file' or equivalent on your system and you're not sure -# whether 'pass_all' will *always* work, you probably want this one. -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; -beos*) - lt_cv_deplibs_check_method=pass_all - ;; -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='$FILECMD -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; -freebsd* | dragonfly* | midnightbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=$FILECMD - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=$FILECMD - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=$FILECMD - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; -openbsd* | bitrig*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; +ltmain=$ac_aux_dir/ltmain.sh -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -os2*) - lt_cv_deplibs_check_method=pass_all - ;; +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac @@ -7861,64 +7348,23 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DLLTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -printf "%s\n" "$DLLTOOL" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -7927,43 +7373,59 @@ do */) ;; *) as_dir=$as_dir/ ;; esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done -IFS=$as_save_IFS + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -printf "%s\n" "$ac_ct_DLLTOOL" >&6; } + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + ac_cv_path_SED=$SED fi - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed -test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" @@ -7971,61 +7433,93 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -printf %s "checking how to associate runtime and link libraries... " >&6; } -if test ${lt_cv_sharedlib_from_linklib_cmd+y} + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh; - # decide which one to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac - ;; + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd=$ECHO - ;; + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AR+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( @@ -8033,48 +7527,72 @@ do */) ;; *) as_dir=$as_dir/ ;; esac + for ac_prog in egrep + do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -printf "%s\n" "$AR" >&6; } + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + ac_cv_path_EGREP=$EGREP fi - - test -n "$AR" && break - done + fi fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_AR+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( @@ -8082,144 +7600,269 @@ do */) ;; *) as_dir=$as_dir/ ;; esac + for ac_prog in fgrep + do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break done -IFS=$as_save_IFS + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -printf "%s\n" "$ac_ct_AR" >&6; } + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + ac_cv_path_FGREP=$FGREP fi - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi + fi fi - -: ${AR=ar} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" +test -z "$GREP" && GREP=grep -# Use ARFLAGS variable as AR's operation code to sync the variable naming with -# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have -# higher priority because thats what people were doing historically (setting -# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS -# variable obsoleted/removed. -test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} -lt_ar_flags=$AR_FLAGS -# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override -# by AR_FLAGS because that was never working and AR_FLAGS is about to die. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -printf %s "checking for archiver @FILE support... " >&6; } -if test ${lt_cv_ar_at_file+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -eq "$ac_status"; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -ne "$ac_status"; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -printf "%s\n" "$lt_cv_ar_at_file" >&6; } -if test no = "$lt_cv_ar_at_file"; then - archiver_list_spec= +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - archiver_list_spec=$lt_cv_ar_at_file + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test no != "$with_gnu_ld" && break + ;; + *) + test yes != "$with_gnu_ld" && break + ;; + esac + fi + done + IFS=$lt_save_ifs +else + lt_cv_path_LD=$LD # Let the user override the test with a path. +fi +fi + +LD=$lt_cv_path_LD +if test -n "$LD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_STRIP+y} +if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -8232,7 +7875,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -8242,29 +7885,33 @@ IFS=$as_save_IFS fi fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -printf "%s\n" "$STRIP" >&6; } +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi + test -n "$DUMPBIN" && break + done fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_STRIP+y} +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -8277,7 +7924,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -8287,17 +7934,21 @@ IFS=$as_save_IFS fi fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -printf "%s\n" "$ac_ct_STRIP" >&6; } +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_STRIP" = x; then - STRIP=":" + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -8305,567 +7956,483 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - STRIP=$ac_ct_STRIP + DUMPBIN=$ac_ct_DUMPBIN fi -else - STRIP="$ac_cv_prog_STRIP" fi -test -z "$STRIP" && STRIP=: + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_RANLIB+y} + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" fi -done - done -IFS=$as_save_IFS - -fi + rm -f conftest* fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -printf "%s\n" "$RANLIB" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_RANLIB+y} + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -printf "%s\n" "$ac_ct_RANLIB" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + i=0 + teststring=ABCD - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; -test -z "$RANLIB" && RANLIB=: + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; -if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - +fi +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} -# Allow CC to be a program name with arguments. -compiler=$CC -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -printf %s "checking command to parse $NM output from $compiler object... " >&6; } -if test ${lt_cv_sys_global_symbol_pipe+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] +fi -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test ia64 = "$host_cpu"; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; esac -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Gets list of data symbols to import. - lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" - # Adjust the below global symbol transforms to fixup imported variables. - lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" - lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" - lt_c_name_lib_hook="\ - -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ - -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" -else - # Disable hooks by default. - lt_cv_sys_global_symbol_to_import= - lt_cdecl_hook= - lt_c_name_hook= - lt_c_name_lib_hook= fi -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ -$lt_cdecl_hook\ -" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ -$lt_c_name_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" -# Transform an extracted symbol line into symbol name with lib prefix and -# symbol address. -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ -$lt_c_name_lib_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; esac -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function, - # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++ or ICC, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ -" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ -" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ -" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ -" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" - # Check to see that the pipe works correctly. - pipe_works=no - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 - if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif -#ifdef __cplusplus -extern "C" { -#endif -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS=conftstm.$ac_objext - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest$ac_exeext; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test yes = "$pipe_works"; then - break - else - lt_cv_sys_global_symbol_pipe= +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. +set dummy ${ac_tool_prefix}file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_FILECMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$FILECMD"; then + ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_FILECMD="${ac_tool_prefix}file" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi done + done +IFS=$as_save_IFS fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -printf "%s\n" "failed" >&6; } +FILECMD=$ac_cv_prog_FILECMD +if test -n "$FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 +printf "%s\n" "$FILECMD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -printf "%s\n" "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -printf %s "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test ${with_sysroot+y} +fi +if test -z "$ac_cv_prog_FILECMD"; then + ac_ct_FILECMD=$FILECMD + # Extract the first word of "file", so it can be a program name with args. +set dummy file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_FILECMD+y} then : - withval=$with_sysroot; + printf %s "(cached) " >&6 else $as_nop - with_sysroot=no -fi + if test -n "$ac_ct_FILECMD"; then + ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_FILECMD="file" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD +if test -n "$ac_ct_FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 +printf "%s\n" "$ac_ct_FILECMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -lt_sysroot= -case $with_sysroot in #( - yes) - if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -printf "%s\n" "$with_sysroot" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; + if test "x$ac_ct_FILECMD" = x; then + FILECMD=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; esac + FILECMD=$ac_ct_FILECMD + fi +else + FILECMD="$ac_cv_prog_FILECMD" +fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -printf "%s\n" "${lt_sysroot:-no}" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -printf %s "checking for a working dd... " >&6; } -if test ${ac_cv_path_lt_DD+y} + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i -cat conftest.i conftest.i >conftest2.i -: ${lt_DD:=$DD} -if test -z "$lt_DD"; then - ac_path_lt_DD_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -8874,375 +8441,374 @@ do */) ;; *) as_dir=$as_dir/ ;; esac - for ac_prog in dd - do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_lt_DD" || continue -if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then - cmp -s conftest.i conftest.out \ - && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: -fi - $ac_path_lt_DD_found && break 3 - done - done + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS - if test -z "$ac_cv_path_lt_DD"; then - : - fi -else - ac_cv_path_lt_DD=$lt_DD -fi -rm -f conftest.i conftest2.i conftest.out fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -printf "%s\n" "$ac_cv_path_lt_DD" >&6; } +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -printf %s "checking how to truncate binary pipes... " >&6; } -if test ${lt_cv_truncate_bin+y} +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop - printf 0123456789abcdef0123456789abcdef >conftest.i -cat conftest.i conftest.i >conftest2.i -lt_cv_truncate_bin= -if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then - cmp -s conftest.i conftest.out \ - && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + fi -rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -printf "%s\n" "$lt_cv_truncate_bin" >&6; } +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi +test -z "$OBJDUMP" && OBJDUMP=objdump -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -func_cc_basename () -{ - for cc_temp in $*""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac - done - func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -} -# Check whether --enable-libtool-lock was given. -if test ${enable_libtool_lock+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} then : - enableval=$enable_libtool_lock; -fi + printf %s "(cached) " >&6 +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. -test no = "$enable_libtool_lock" || enable_libtool_lock=yes +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out what ABI is being produced by ac_compile, and set mode - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE=32 - ;; - *ELF-64*) - HPUX_IA64_MODE=64 - ;; - esac - fi - rm -rf conftest* +beos*) + lt_cv_deplibs_check_method=pass_all ;; -*-*-irix6*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test yes = "$lt_cv_prog_gnu_ld"; then - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='$FILECMD -L' + lt_cv_file_magic_test_file=/shlib/libc.so ;; -mips64*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - emul=elf - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - emul="${emul}32" - ;; - *64-bit*) - emul="${emul}64" - ;; - esac - case `$FILECMD conftest.$ac_objext` in - *MSB*) - emul="${emul}btsmip" - ;; - *LSB*) - emul="${emul}ltsmip" - ;; - esac - case `$FILECMD conftest.$ac_objext` in - *N32*) - emul="${emul}n32" - ;; - esac - LD="${LD-ld} -m $emul" +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' fi - rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. Note that the listed cases only cover the - # situations where additional linker options are needed (such as when - # doing 32-bit compilation for a host where ld defaults to 64-bit, or - # vice versa); the common cases where no linker options are needed do - # not appear in the list. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - case `$FILECMD conftest.o` in - *x86-64*) - LD="${LD-ld} -m elf32_x86_64" - ;; - *) - LD="${LD-ld} -m elf_i386" - ;; - esac - ;; - powerpc64le-*linux*) - LD="${LD-ld} -m elf32lppclinux" - ;; - powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - powerpcle-*linux*) - LD="${LD-ld} -m elf64lppc" - ;; - powerpc-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly* | midnightbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=$FILECMD + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; esac + else + lt_cv_deplibs_check_method=pass_all fi - rm -rf conftest* ;; -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -belf" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -printf %s "checking whether the C compiler needs -belf... " >&6; } -if test ${lt_cv_cc_needs_belf+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=$FILECMD + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; -int -main (void) -{ +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - lt_cv_cc_needs_belf=yes -else $as_nop - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } - if test yes != "$lt_cv_cc_needs_belf"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS=$SAVE_CFLAGS - fi +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all ;; -*-*solaris*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*|x86_64-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD=${LD-ld}_sol2 - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi - rm -rf conftest* ;; -esac -need_locks=$enable_libtool_lock +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=$FILECMD + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_MANIFEST_TOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi -done - done -IFS=$as_save_IFS + ;; -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -printf "%s\n" "$MANIFEST_TOOL" >&6; } +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } @@ -9250,18 +8816,18 @@ fi fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9274,7 +8840,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + ac_cv_prog_ac_ct_DLLTOOL="dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9284,17 +8850,17 @@ IFS=$as_save_IFS fi fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) @@ -9302,52 +8868,72 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + DLLTOOL=$ac_ct_DLLTOOL fi else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" + DLLTOOL="$ac_cv_prog_DLLTOOL" fi -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if test ${lt_cv_path_mainfest_tool+y} +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } -if test yes != "$lt_cv_path_mainfest_tool"; then - MANIFEST_TOOL=: + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DSYMUTIL+y} +if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9360,7 +8946,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9370,29 +8956,33 @@ IFS=$as_save_IFS fi fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -printf "%s\n" "$DSYMUTIL" >&6; } +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi + test -n "$AR" && break + done fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9405,7 +8995,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9415,17 +9005,21 @@ IFS=$as_save_IFS fi fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" else case $cross_compiling:$ac_tool_warned in yes:) @@ -9433,23 +9027,110 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - DSYMUTIL=$ac_ct_DSYMUTIL + AR=$ac_ct_AR fi +fi + +: ${AR=ar} + + + + + + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS + + + + + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" + archiver_list_spec=$lt_cv_ar_at_file fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_NMEDIT+y} +if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9462,7 +9143,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9472,10 +9153,10 @@ IFS=$as_save_IFS fi fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -printf "%s\n" "$NMEDIT" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } @@ -9483,18 +9164,18 @@ fi fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_NMEDIT+y} +if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9507,7 +9188,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" + ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9517,17 +9198,17 @@ IFS=$as_save_IFS fi fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -printf "%s\n" "$ac_ct_NMEDIT" >&6; } +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -9535,23 +9216,30 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - NMEDIT=$ac_ct_NMEDIT + STRIP=$ac_ct_STRIP fi else - NMEDIT="$ac_cv_prog_NMEDIT" + STRIP="$ac_cv_prog_STRIP" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_LIPO+y} +if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9564,7 +9252,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9574,10 +9262,10 @@ IFS=$as_save_IFS fi fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -printf "%s\n" "$LIPO" >&6; } +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } @@ -9585,18 +9273,18 @@ fi fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_LIPO+y} +if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -9609,7 +9297,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" + ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -9619,17 +9307,17 @@ IFS=$as_save_IFS fi fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -printf "%s\n" "$ac_ct_LIPO" >&6; } +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_LIPO" = x; then - LIPO=":" + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -9637,215 +9325,48 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - LIPO=$ac_ct_LIPO + RANLIB=$ac_ct_RANLIB fi else - LIPO="$ac_cv_prog_LIPO" + RANLIB="$ac_cv_prog_RANLIB" fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +test -z "$RANLIB" && RANLIB=: -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -printf "%s\n" "$OTOOL" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -printf "%s\n" "$ac_ct_OTOOL" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OTOOL64+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -printf "%s\n" "$OTOOL64" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OTOOL64+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -printf "%s\n" "$ac_ct_OTOOL64" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi @@ -9873,263 +9394,389 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -printf %s "checking for -single_module linker flag... " >&6; } -if test ${lt_cv_apple_cc_single_mod+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_apple_cc_single_mod=no - if test -z "$LT_MULTI_MODULE"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test 0 = "$_lt_result"; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -printf %s "checking for -exported_symbols_list linker flag... " >&6; } -if test ${lt_cv_ld_exported_symbols_list+y} + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - lt_cv_ld_exported_symbols_list=yes -else $as_nop - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -printf %s "checking for -force_load linker flag... " >&6; } -if test ${lt_cv_ld_force_load+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 - $AR $AR_FLAGS libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -printf "%s\n" "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) - case $MACOSX_DEPLOYMENT_TARGET,$host in - 10.[012],*|,*powerpc*-darwin[5-8]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - *) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test yes = "$lt_cv_apple_cc_single_mod"; then - _lt_dar_single_mod='$single_module' - fi - if test yes = "$lt_cv_ld_exported_symbols_list"; then - _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' - fi - if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac -ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes -then : - printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= fi +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" -func_stripname_cnf () -{ - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; - esac -} # func_stripname_cnf +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" -# Set options -enable_win32_dll=yes + # Check to see that the pipe works correctly. + pipe_works=no -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AS+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_AS="${ac_tool_prefix}as" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= fi done - done -IFS=$as_save_IFS fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= fi -AS=$ac_cv_prog_AS -if test -n "$AS"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 -printf "%s\n" "$AS" >&6; } +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no fi -if test -z "$ac_cv_prog_AS"; then - ac_ct_AS=$AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_AS+y} + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_AS"; then - ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS @@ -10138,390 +9785,460 @@ do */) ;; *) as_dir=$as_dir/ ;; esac + for ac_prog in dd + do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AS="as" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AS=$ac_cv_prog_ac_ct_AS -if test -n "$ac_ct_AS"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 -printf "%s\n" "$ac_ct_AS" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - if test "x$ac_ct_AS" = x; then - AS="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AS=$ac_ct_AS - fi -else - AS="$ac_cv_prog_AS" + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DLLTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done + $ac_path_lt_DD_found && break 3 + done done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -printf "%s\n" "$DLLTOOL" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DLLTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done done IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -printf "%s\n" "$ac_ct_DLLTOOL" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL + if test -z "$ac_cv_path_lt_DD"; then + : fi else - DLLTOOL="$ac_cv_prog_DLLTOOL" + ac_cv_path_lt_DD=$lt_DD fi - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OBJDUMP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -printf "%s\n" "$OBJDUMP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +rm -f conftest.i conftest2.i conftest.out fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -printf "%s\n" "$ac_ct_OBJDUMP" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi - - ;; -esac - -test -z "$AS" && AS=as - - - - - -test -z "$DLLTOOL" && DLLTOOL=dlltool - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } -test -z "$OBJDUMP" && OBJDUMP=objdump +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} - - - - enable_dlopen=no - - - - # Check whether --enable-shared was given. -if test ${enable_shared+y} +# Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else $as_nop - enable_shared=yes + enableval=$enable_libtool_lock; fi +test no = "$enable_libtool_lock" || enable_libtool_lock=yes +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; - - - - - # Check whether --enable-static was given. -if test ${enable_static+y} +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac + printf %s "(cached) " >&6 else $as_nop - enable_static=yes -fi - - - + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ - - - - -# Check whether --with-pic was given. -if test ${with_pic+y} + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for lt_pkg in $withval; do - IFS=$lt_save_ifs - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" fi - done - IFS=$lt_save_ifs + ;; + esac ;; esac -else $as_nop - pic_mode=default -fi + fi + rm -rf conftest* + ;; +esac +need_locks=$enable_libtool_lock +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi - # Check whether --enable-fast-install was given. -if test ${enable_fast_install+y} +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS=$lt_save_ifs - ;; - esac + printf %s "(cached) " >&6 else $as_nop - enable_fast_install=yes + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: fi @@ -10529,349 +10246,517 @@ fi - - - shared_archive_member_spec= -case $host,$enable_shared in -power*-*-aix[5-9]*,yes) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -printf %s "checking which variant of shared library versioning to provide... " >&6; } - -# Check whether --with-aix-soname was given. -if test ${with_aix_soname+y} -then : - withval=$with_aix_soname; case $withval in - aix|svr4|both) - ;; - *) - as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 - ;; - esac - lt_cv_with_aix_soname=$with_aix_soname -else $as_nop - if test ${lt_cv_with_aix_soname+y} + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_with_aix_soname=aix -fi - - with_aix_soname=$lt_cv_with_aix_soname -fi - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -printf "%s\n" "$with_aix_soname" >&6; } - if test aix != "$with_aix_soname"; then - # For the AIX way of multilib, we name the shared archive member - # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', - # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. - # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, - # the AIX toolchain works better with OBJECT_MODE set (default 32). - if test 64 = "${OBJECT_MODE-32}"; then - shared_archive_member_spec=shr_64 - else - shared_archive_member_spec=shr - fi + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - ;; -*) - with_aix_soname=aix - ;; -esac - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS=$ltmain - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - +done + done +IFS=$as_save_IFS +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST fi - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -printf %s "checking for objdir... " >&6; } -if test ${lt_cv_objdir+y} +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + fi -rmdir .libs 2>/dev/null fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -printf "%s\n" "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - ;; -esac +done + done +IFS=$as_save_IFS -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a '.a' archive for static linking (except MSVC and -# ICC, which need '.lib'). -libext=a - -with_gnu_ld=$lt_cv_prog_gnu_ld - -old_CC=$CC -old_CFLAGS=$CFLAGS - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -func_cc_basename $compiler -cc_basename=$func_cc_basename_result +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -printf %s "checking for ${ac_tool_prefix}file... " >&6; } -if test ${lt_cv_path_MAGIC_CMD+y} + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/${ac_tool_prefix}file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi +IFS=$as_save_IFS -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -printf "%s\n" "$MAGIC_CMD" >&6; } +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -printf %s "checking for file... " >&6; } -if test ${lt_cv_path_MAGIC_CMD+y} +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi +IFS=$as_save_IFS -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -printf "%s\n" "$MAGIC_CMD" >&6; } +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - + if test "x$ac_ct_LIPO" = x; then + LIPO=":" else - MAGIC_CMD=: + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO fi +else + LIPO="$ac_cv_prog_LIPO" fi - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC=$CC -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi @@ -10879,2094 +10764,1025 @@ lt_simple_link_test_code='int main(){return(0);}' -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} -# Allow CC to be a program name with arguments. -compiler=$CC -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then -lt_prog_compiler_no_builtin_flag= -if test yes = "$GCC"; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test ${lt_cv_prog_compiler_rtti_exceptions+y} + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } -if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[012],*|,*powerpc*-darwin[5-8]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h +fi - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - if test yes = "$GCC"; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - lt_prog_compiler_pic='-fPIC' - ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - case $host_os in - os2*) - lt_prog_compiler_static='$wl-static' - ;; - esac - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; +# Set options +enable_win32_dll=yes - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac + if test "x$ac_ct_AS" = x; then + AS="false" else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - case $cc_basename in - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - case $host_os in - os2*) - lt_prog_compiler_static='$wl-static' - ;; - esac - ;; + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='$wl-a ${wl}archive' - ;; +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64, which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # flang / f18. f95 an alias for gfortran or flang on Debian - flang* | f18* | f95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -printf %s "checking for $compiler option to produce PIC... " >&6; } -if test ${lt_cv_prog_compiler_pic+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test ${lt_cv_prog_compiler_pic_works+y} +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } - -if test yes = "$lt_cv_prog_compiler_pic_works"; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no fi - +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test ${lt_cv_prog_compiler_static_works+y} +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_prog_compiler_static_works=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -if test yes = "$lt_cv_prog_compiler_static_works"; then - : + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi else - lt_prog_compiler_static= + OBJDUMP="$ac_cv_prog_OBJDUMP" fi + ;; +esac +test -z "$AS" && AS=as - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +test -z "$DLLTOOL" && DLLTOOL=dlltool - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } +test -z "$OBJDUMP" && OBJDUMP=objdump - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + enable_dlopen=no -hard_links=nottested -if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -printf %s "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -printf "%s\n" "$hard_links" >&6; } - if test no = "$hard_links"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi + # Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ' (' and ')$', so one must not match beginning or - # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', - # as well as any symbol that contains 'd'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++ or Intel C++ Compiler. - if test yes != "$GCC"; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) - with_gnu_ld=yes - ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs=no - ;; - esac - ld_shlibs=yes - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test yes = "$with_gnu_ld"; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; + # Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; esac - fi +else $as_nop + enable_static=yes +fi - if test yes = "$lt_use_gnu_ld_interface"; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='$wl' - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - export_dynamic_flag_spec='$wl--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test ia64 != "$host_cpu"; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. -_LT_EOF - fi - ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='$wl--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - link_all_deplibs=yes +# Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs ;; + esac +else $as_nop + pic_mode=default +fi - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - shrext_cmds=.dll - archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - prefix_cmds="$SED"~ - if test EXPORTS = "`$SED 1q $export_symbols`"; then - prefix_cmds="$prefix_cmds -e 1d"; - fi~ - prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ - cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' - enable_shared_with_static_runtimes=yes - file_list_spec='@' - ;; - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test linux-dietlibc = "$host_os"; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test no = "$tmp_diet" - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - nagfor*) # NAGFOR 5.3 - tmp_sharedflag='-Wl,-shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - case $cc_basename in - tcc*) - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - export_dynamic_flag_spec='-rdynamic' - ;; - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - fi + + + # Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs ;; + esac +else $as_nop + enable_fast_install=yes +fi - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi - if test no = "$ld_shlibs"; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; + with_aix_soname=$lt_cv_with_aix_soname +fi - aix[4-9]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to GNU nm, but means don't demangle to AIX nm. - # Without the "-l" option, or with the "-B" option, AIX nm treats - # weak defined symbols like other global defined symbols, whereas - # GNU nm marks them as "W". - # While the 'weak' keyword is ignored in the Export File, we need - # it in the Import File for the 'aix-soname' feature, so we have - # to replace the "-B" option with "-P" for AIX nm. - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # have runtime linking enabled, and use it for executables. - # For shared libraries, we enable/disable runtime linking - # depending on the kind of the shared library created - - # when "with_aix_soname,aix_use_runtimelinking" is: - # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables - # "aix,yes" lib.so shared, rtl:yes, for executables - # lib.a static archive - # "both,no" lib.so.V(shr.o) shared, rtl:yes - # lib.a(lib.so.V) shared, rtl:no, for executables - # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a(lib.so.V) shared, rtl:no - # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a static archive - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then - aix_use_runtimelinking=yes - break - fi - done - if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then - # With aix-soname=svr4, we create the lib.so.V shared archives only, - # so we don't have lib.a shared libs to link our executables. - # We have to force runtime linking in this case. - aix_use_runtimelinking=yes - LDFLAGS="$LDFLAGS -Wl,-brtl" - fi - ;; - esac - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='$wl-f,' - case $with_aix_soname,$aix_use_runtimelinking in - aix,*) ;; # traditional, no import file - svr4,* | *,yes) # use import file - # The Import File defines what to hardcode. - hardcode_direct=no - hardcode_direct_absolute=no - ;; - esac - if test yes = "$GCC"; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag="$shared_flag "'$wl-G' - fi - # Need to ensure runtime linking is disabled for the traditional - # shared library, or the linker may eventually find shared libraries - # /with/ Import File - we do not want to mix them. - shared_flag_aix='-shared' - shared_flag_svr4='-shared $wl-G' - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - shared_flag_aix='$wl-bM:SRE' - shared_flag_svr4='$wl-G' - fi - fi - export_dynamic_flag_spec='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if test ${lt_cv_aix_libpath_+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi -fi +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain - aix_libpath=$lt_cv_aix_libpath_ -fi +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if test ${lt_cv_aix_libpath_+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi -fi - aix_libpath=$lt_cv_aix_libpath_ -fi - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' $wl-bernotok' - allow_undefined_flag=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' - # -brtl affects multiple linker settings, -berok does not and is overridden later - compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' - if test svr4 != "$with_aix_soname"; then - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' - fi - if test aix != "$with_aix_soname"; then - archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' - else - # used by -dlpreopen to get the symbols - archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' - fi - archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' - fi - fi - ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++ or Intel C++ Compiler. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl* | icl*) - # Native MSVC or ICC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC and ICC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - darwin* | rhapsody*) - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test yes = "$lt_cv_ld_force_load"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - else - ld_shlibs=no - fi - ;; - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly* | midnightbsd*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - hpux9*) - if test yes = "$GCC"; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='$wl-E' - ;; - hpux10*) - if test yes,no = "$GCC,$with_gnu_ld"; then - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - hpux11*) - if test yes,no = "$GCC,$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -printf %s "checking if $CC understands -b... " >&6; } -if test ${lt_cv_prog_compiler__b+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler__b=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } -if test yes = "$lt_cv_prog_compiler__b"; then - archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - ;; - esac - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; +test -z "$LN_S" && LN_S="ln -s" - irix5* | irix6* | nonstopux*) - if test yes = "$GCC"; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if test ${lt_cv_irix_exported_symbol+y} + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else $as_nop - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - lt_cv_irix_exported_symbol=yes -else $as_nop - lt_cv_irix_exported_symbol=no + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS +rmdir .libs 2>/dev/null fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } - if test yes = "$lt_cv_irix_exported_symbol"; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' - fi - link_all_deplibs=no - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir - linux*) - case $cc_basename in - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - ld_shlibs=yes - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - *nto* | *qnx*) - ;; - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - else - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - fi - else - ld_shlibs=no - fi - ;; +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - shrext_cmds=.dll - archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - prefix_cmds="$SED"~ - if test EXPORTS = "`$SED 1q $export_symbols`"; then - prefix_cmds="$prefix_cmds -e 1d"; - fi~ - prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ - cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' - enable_shared_with_static_runtimes=yes - file_list_spec='@' - ;; - osf3*) - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - ;; - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac - solaris*) - no_undefined_flag=' -z defs' - if test yes = "$GCC"; then - wlarc='$wl' - archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='$wl' - archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. GCC discards it without '$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test yes = "$GCC"; then - whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; +# Global variables: +ofile=libtool +can_build_shared=yes - sunos4*) - if test sequent = "$host_vendor"; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). +libext=a - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; +with_gnu_ld=$lt_cv_prog_gnu_ld - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; +old_CC=$CC +old_CFLAGS=$CFLAGS - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='$wl-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' +func_cc_basename $compiler +cc_basename=$func_cc_basename_result - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='$wl-z,text' - allow_undefined_flag='$wl-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='$wl-Bexport' - runpath_var='LD_RUN_PATH' +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac fi - ;; + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - *) - ld_shlibs=no - ;; - esac - if test sni = "$host_vendor"; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='$wl-Blargedynsym' - ;; - esac + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break fi - fi - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -printf "%s\n" "$ld_shlibs" >&6; } -test no = "$ld_shlibs" && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test yes,yes = "$GCC,$enable_shared"; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -printf %s "checking whether -lc should be explicitly linked in... " >&6; } -if test ${lt_cv_archive_cmds_need_lc+y} -then : - printf %s "(cached) " >&6 -else $as_nop - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + else + MAGIC_CMD=: + fi +fi + fi + ;; +esac +# Use C for the default configuration in the libtool script +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +# Source file extension for C test sources. +ac_ext=c +# Object file extension for compiled C test sources. +objext=o +objext=$objext +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' @@ -12974,63 +11790,515 @@ esac +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +# Allow CC to be a program name with arguments. +compiler=$CC +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then +lt_prog_compiler_no_builtin_flag= +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi +fi + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # flang / f18. f95 an alias for gfortran or flang on Debian + flang* | f18* | f95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi +fi @@ -13042,8 +12310,47 @@ esac +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi @@ -13051,912 +12358,1429 @@ esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + ld_shlibs=yes + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. +_LT_EOF + fi + ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + case $cc_basename in + tcc*) + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -printf %s "checking dynamic linker characteristics... " >&6; } + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac -if test yes = "$GCC"; then - case $host_os in - darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; - *) lt_awk_arg='/^libraries:/' ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; - *) lt_sed_strip_eq='s|=/|/|g' ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary... - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path component already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). - case "$lt_multi_os_dir; $lt_search_path_spec " in - "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) - lt_multi_os_dir= - ;; - esac - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" - elif test -n "$lt_multi_os_dir"; then - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS = " "; FS = "/|\n";} { - lt_foo = ""; - lt_count = 0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo = "/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's|/\([A-Za-z]:\)|\1|g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # Using Import Files as archive members, it is possible to support - # filename-based versioning of shared library archives on AIX. While - # this would work for both with and without runtime linking, it will - # prevent static linking of such archives. So we do filename-based - # shared library versioning with .so extension only, which is used - # when both runtime linking and shared linking is enabled. - # Unfortunately, runtime linking may impact performance, so we do - # not want this to be the default eventually. Also, we use the - # versioned .so libs for executables only if there is the -brtl - # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. - # To allow for filename-based versioning support, we need to create - # libNAME.so.V as an archive file, containing: - # *) an Import File, referring to the versioned filename of the - # archive as well as the shared archive member, telling the - # bitwidth (32 or 64) of that shared object, and providing the - # list of exported symbols of that shared object, eventually - # decorated with the 'weak' keyword - # *) the shared object with the F_LOADONLY flag set, to really avoid - # it being seen by the linker. - # At run time we better use the real file rather than another symlink, - # but for link time we create the symlink libNAME.so -> libNAME.so.V + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi - case $with_aix_soname,$aix_use_runtimelinking in - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - aix,yes) # traditional libtool - dynamic_linker='AIX unversionable lib.so' - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - aix,no) # traditional AIX only - dynamic_linker='AIX lib.a(lib.so.V)' - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - ;; - svr4,*) # full svr4 only - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,yes) # both, prefer svr4 - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # unpreferred sharedlib libNAME.a needs extra handling - postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' - postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,no) # both, prefer aix - dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling - postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' - postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' - ;; - esac - shlibpath_var=LIBPATH - fi - ;; + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; +int +main (void) +{ -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no +fi - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes + aix_libpath=$lt_cv_aix_libpath_ +fi - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; +int +main (void) +{ - *,cl* | *,icl*) - # Native MSVC or ICC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") ;; - esac - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; - *) - # Assume MSVC and ICC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; + darwin* | rhapsody*) -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; -freebsd* | dragonfly* | midnightbsd*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac + whole_archive_flag_spec='' fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; + else + ld_shlibs=no + fi -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - sys_lib_dlsearch_path_spec=/usr/lib/hpux32 - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - sys_lib_dlsearch_path_spec=/usr/lib/hpux64 - fi - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; + ;; -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly* | midnightbsd*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - hardcode_libdir_flag_spec='-L$libdir' - ;; + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; - # Some binutils ld are patched to set DT_RUNPATH - if test ${lt_cv_shlibpath_overrides_runpath+y} + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS -int -main (void) -{ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } - ; - return 0; -} +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null -then : - lt_cv_shlibpath_overrides_runpath=yes -fi + lt_cv_irix_exported_symbol=yes +else $as_nop + lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - + LDFLAGS=$save_LDFLAGS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + ;; + esac + ;; - # Ideally, we could use ldconfig to report *all* directores which are - # searched for libraries, however this is still not possible. Aside from not - # being certain /sbin/ldconfig is available, command - # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, - # even though it is searched at run-time. Try to do the best guess by - # appending ld.so.conf contents (and includes) to the search path. - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; + *nto* | *qnx*) + ;; -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; -os2*) - libname_spec='$name' - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - # OS/2 can only load a DLL with a base name of 8 characters or less. - soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; - v=$($ECHO $release$versuffix | tr -d .-); - n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); - $ECHO $n$v`$shared_ext' - library_names_spec='${libname}_dll.$libext' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=BEGINLIBPATH - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - ;; + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; -rdos*) - dynamic_linker=no - ;; + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' ;; - siemens) - need_lib_prefix=no + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi ;; - esac - ;; -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=sco - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; +with_gnu_ld=$with_gnu_ld -*) - dynamic_linker=no - ;; -esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -printf "%s\n" "$dynamic_linker" >&6; } -test no = "$dynamic_linker" && can_build_shared=no -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec -fi -# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... -configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec -# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code -func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" -# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool -configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH @@ -13965,9 +13789,75 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac @@ -14054,564 +13944,62 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -printf %s "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test yes = "$hardcode_automatic"; then - # We can hardcode non-existent directories. - if test no != "$hardcode_direct" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && - test no != "$hardcode_minus_L"; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -printf "%s\n" "$hardcode_action" >&6; } -if test relink = "$hardcode_action" || - test yes = "$inherit_rpath"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi - if test yes != "$enable_dlopen"; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - case $host_os in - beos*) - lt_cv_dlopen=load_add_on - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - mingw* | pw32* | cegcc*) - lt_cv_dlopen=LoadLibrary - lt_cv_dlopen_libs= - ;; - cygwin*) - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - ;; - darwin*) - # if libdl is installed we need to link against it - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -printf %s "checking for dlopen in -ldl... " >&6; } -if test ${ac_cv_lib_dl_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main (void) -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes -then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - lt_cv_dlopen=dyld - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes -fi - ;; - tpf*) - # Don't try to run any link tests for TPF. We know it's impossible - # because TPF is a cross-compiler, and we know how we open DSOs. - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - lt_cv_dlopen_self=no - ;; - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes -then : - lt_cv_dlopen=shl_load -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -printf %s "checking for shl_load in -ldld... " >&6; } -if test ${ac_cv_lib_dld_shl_load+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char shl_load (); -int -main (void) -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_dld_shl_load=yes -else $as_nop - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes -then : - lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else $as_nop - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes -then : - lt_cv_dlopen=dlopen -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -printf %s "checking for dlopen in -ldl... " >&6; } -if test ${ac_cv_lib_dl_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main (void) -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_dl_dlopen=yes -else $as_nop - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes -then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -printf %s "checking for dlopen in -lsvld... " >&6; } -if test ${ac_cv_lib_svld_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main (void) -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_svld_dlopen=yes -else $as_nop - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes -then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -printf %s "checking for dld_link in -ldld... " >&6; } -if test ${ac_cv_lib_dld_dld_link+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char dld_link (); -int -main (void) -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_dld_dld_link=yes -else $as_nop - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes -then : - lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld -fi -fi -fi -fi -fi -fi - ;; - esac - if test no = "$lt_cv_dlopen"; then - enable_dlopen=no - else - enable_dlopen=yes - fi - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS=$CPPFLAGS - test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS=$LDFLAGS - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS=$LIBS - LIBS="$lt_cv_dlopen_libs $LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -printf %s "checking whether a program can dlopen itself... " >&6; } -if test ${lt_cv_dlopen_self+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif -#include <stdio.h> -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -printf "%s\n" "$lt_cv_dlopen_self" >&6; } - - if test yes = "$lt_cv_dlopen_self"; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -printf %s "checking whether a statically linked program can dlopen itself... " >&6; } -if test ${lt_cv_dlopen_self_static+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } - fi - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS - LIBS=$save_LIBS - ;; - esac - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi @@ -14622,478 +14010,871 @@ fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; -striplib= -old_striplib= -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -printf %s "checking whether stripping libraries is possible... " >&6; } -if test -z "$STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -else - if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - old_striplib="$STRIP --strip-debug" - striplib="$STRIP --strip-unneeded" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - else - case $host_os in - darwin*) - # FIXME - insert some real tests, host_os isn't really good enough - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - ;; - freebsd*) - if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then - old_striplib="$STRIP --strip-debug" - striplib="$STRIP --strip-unneeded" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + can_build_shared=no fi ;; - *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac + shlibpath_var=LIBPATH fi -fi + ;; +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; - # Report what library types will actually be built - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -printf %s "checking if libtool supports shared libraries... " >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -printf "%s\n" "$can_build_shared" >&6; } +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -printf %s "checking whether to build shared libraries... " >&6; } - test no = "$can_build_shared" && enable_shared=no + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly* | midnightbsd*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes ;; + esac + ;; - aix[4-9]*) - if test ia64 != "$host_cpu"; then - case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in - yes,aix,yes) ;; # shared object as lib.so file only - yes,svr4,*) ;; # shared object as lib.so archive member only - yes,*) enable_static=no ;; # shared object in lib.a archive as well - esac +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -printf "%s\n" "$enable_shared" >&6; } + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -printf %s "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -printf "%s\n" "$enable_static" >&6; } +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; -CC=$lt_save_CC +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no - if test -n "$CXX" && ( test no != "$CXX" && - ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || - (test g++ != "$CXX"))); then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -printf %s "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if test ${ac_cv_prog_CXXCPP+y} + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop - # Double quotes because $CXX needs to be expanded - for CXXCPP in "$CXX -E" cpp /lib/cpp - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include <limits.h> - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO" -then : -else $as_nop - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext +int +main (void) +{ - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> + ; + return 0; +} _ACEOF -if ac_fn_cxx_try_cpp "$LINENO" +if ac_fn_c_try_link "$LINENO" then : - # Broken: success on invalid input. -continue -else $as_nop - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - + lt_cv_shlibpath_overrides_runpath=yes fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -printf "%s\n" "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO" -then : +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir -else $as_nop - # Broken: fails on valid input. -continue fi -rm -f conftest.err conftest.i conftest.$ac_ext - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO" -then : - # Broken: success on invalid input. -continue -else $as_nop - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok -then : + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; -else - _lt_caught_CXX_error=yes -fi +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -compiler_needs_object_CXX=no -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_direct_absolute_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_shlibpath_var_CXX=unsupported -hardcode_automatic_CXX=no -inherit_rpath_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -reload_flag_CXX=$reload_flag -reload_cmds_CXX=$reload_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; -# Source file extension for C++ test sources. -ac_ext=cpp +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test yes != "$_lt_caught_CXX_error"; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[]) { return(0); }' +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; - # ltmain only uses $CC for tagged configurations so make sure $CC is set. +rdos*) + dynamic_linker=no + ;; +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; -# Allow CC to be a program name with arguments. -compiler=$CC +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi - # save warnings/boilerplate of simple test code - ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi - ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - compiler_CXX=$CC - func_cc_basename $compiler -cc_basename=$func_cc_basename_result +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test yes = "$GXX"; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' - else - lt_prog_compiler_no_builtin_flag_CXX= - fi - if test yes = "$GXX"; then - # Set up default GNU C++ configuration -# Check whether --with-gnu-ld was given. -if test ${with_gnu_ld+y} -then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else $as_nop - with_gnu_ld=no -fi -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -printf %s "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -printf %s "checking for GNU ld... " >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -printf %s "checking for non-GNU ld... " >&6; } -fi -if test ${lt_cv_path_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test no != "$with_gnu_ld" && break - ;; - *) - test yes != "$with_gnu_ld" && break - ;; - esac - fi - done - IFS=$lt_save_ifs -else - lt_cv_path_LD=$LD # Let the user override the test with a path. -fi -fi -LD=$lt_cv_path_LD -if test -n "$LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -printf "%s\n" "$LD" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -printf %s "checking if the linker ($LD) is GNU ld... " >&6; } -if test ${lt_cv_prog_gnu_ld+y} -then : - printf %s "(cached) " >&6 -else $as_nop - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld @@ -15101,1577 +14882,2707 @@ with_gnu_ld=$lt_cv_prog_gnu_ld - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test yes = "$with_gnu_ld"; then - archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='$wl' - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' - else - GXX=no - with_gnu_ld=no - wlarc= - fi - # PORTME: fill in a description of your system's C++ link characteristics - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - ld_shlibs_CXX=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix[4-9]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - aix_use_runtimelinking=no - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # have runtime linking enabled, and use it for executables. - # For shared libraries, we enable/disable runtime linking - # depending on the kind of the shared library created - - # when "with_aix_soname,aix_use_runtimelinking" is: - # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables - # "aix,yes" lib.so shared, rtl:yes, for executables - # lib.a static archive - # "both,no" lib.so.V(shr.o) shared, rtl:yes - # lib.a(lib.so.V) shared, rtl:no, for executables - # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a(lib.so.V) shared, rtl:no - # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a static archive - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then - # With aix-soname=svr4, we create the lib.so.V shared archives only, - # so we don't have lib.a shared libs to link our executables. - # We have to force runtime linking in this case. - aix_use_runtimelinking=yes - LDFLAGS="$LDFLAGS -Wl,-brtl" - fi - ;; - esac - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - file_list_spec_CXX='$wl-f,' - case $with_aix_soname,$aix_use_runtimelinking in - aix,*) ;; # no import file - svr4,* | *,yes) # use import file - # The Import File defines what to hardcode. - hardcode_direct_CXX=no - hardcode_direct_absolute_CXX=no - ;; - esac - if test yes = "$GXX"; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag=$shared_flag' $wl-G' - fi - # Need to ensure runtime linking is disabled for the traditional - # shared library, or the linker may eventually find shared libraries - # /with/ Import File - we do not want to mix them. - shared_flag_aix='-shared' - shared_flag_svr4='-shared $wl-G' - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - shared_flag_aix='$wl-bM:SRE' - shared_flag_svr4='$wl-G' - fi - fi - export_dynamic_flag_spec_CXX='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - always_export_symbols_CXX=yes - if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - # The "-G" linker flag allows undefined symbols. - no_undefined_flag_CXX='-bernotok' - # Determine the default libpath from the value encoded in an empty - # executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if test ${lt_cv_aix_libpath__CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO" -then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=/usr/lib:/lib - fi -fi - aix_libpath=$lt_cv_aix_libpath__CXX -fi - hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if test ${lt_cv_aix_libpath__CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO" -then : - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath__CXX"; then - lt_cv_aix_libpath__CXX=/usr/lib:/lib - fi -fi - aix_libpath=$lt_cv_aix_libpath__CXX -fi - hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' $wl-bernotok' - allow_undefined_flag_CXX=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX='$convenience' - fi - archive_cmds_need_lc_CXX=yes - archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' - # -brtl affects multiple linker settings, -berok does not and is overridden later - compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' - if test svr4 != "$with_aix_soname"; then - # This is similar to how AIX traditionally builds its shared - # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. - archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' - fi - if test aix != "$with_aix_soname"; then - archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' - else - # used by -dlpreopen to get the symbols - archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' - fi - archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' - fi - fi - ;; - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_CXX=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - ld_shlibs_CXX=no - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl* | ,icl* | no,icl*) - # Native MSVC or ICC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_CXX=' ' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=yes - file_list_spec_CXX='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' - enable_shared_with_static_runtimes_CXX=yes - # Don't use ranlib - old_postinstall_cmds_CXX='chmod 644 $oldlib' - postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - export_dynamic_flag_spec_CXX='$wl--export-all-symbols' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs_CXX=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - if test yes = "$lt_cv_ld_force_load"; then - whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - else - whole_archive_flag_spec_CXX='' - fi - link_all_deplibs_CXX=yes - allow_undefined_flag_CXX=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - if test yes != "$lt_cv_apple_cc_single_mod"; then - archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" - archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" - fi - else - ld_shlibs_CXX=no - fi - ;; - os2*) - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_minus_L_CXX=yes - allow_undefined_flag_CXX=unsupported - shrext_cmds=.dll - archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - prefix_cmds="$SED"~ - if test EXPORTS = "`$SED 1q $export_symbols`"; then - prefix_cmds="$prefix_cmds -e 1d"; - fi~ - prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ - cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' - enable_shared_with_static_runtimes_CXX=yes - file_list_spec_CXX='@' - ;; - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - ld_shlibs_CXX=no - ;; - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - freebsd* | dragonfly* | midnightbsd*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - haiku*) - archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - link_all_deplibs_CXX=yes - ;; - hpux9*) - hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='$wl-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' - hardcode_libdir_separator_CXX=: - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - export_dynamic_flag_spec_CXX='$wl-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - *) - hardcode_direct_CXX=yes - hardcode_direct_absolute_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - interix[3-9]*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test yes = "$GXX"; then - if test no = "$with_gnu_ld"; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - hardcode_libdir_separator_CXX=: - inherit_rpath_CXX=yes - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [1-5].* | *pgcpp\ [1-5].*) - prelink_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - old_archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - archive_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - export_dynamic_flag_spec_CXX='$wl--export-dynamic' - archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) - # Sun C++ 5.9 - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' - hardcode_libdir_flag_spec_CXX='-R$libdir' - whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object_CXX=yes - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - *nto* | *qnx*) - ld_shlibs_CXX=yes - ;; - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - hardcode_direct_absolute_CXX=yes - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='$wl-E' - whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - ld_shlibs_CXX=no - fi - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' - hardcode_libdir_separator_CXX=: - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - case $host in - osf3*) - allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' - archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - ;; - *) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ - $RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - ;; - esac - hardcode_libdir_separator_CXX=: - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test yes,no = "$GXX,$with_gnu_ld"; then - allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' - case $host in - osf3*) - archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - *) - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - ;; - esac - hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' - hardcode_libdir_separator_CXX=: - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - output_verbose_link_cmd='func_echo_all' - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test yes,no = "$GXX,$with_gnu_ld"; then - no_undefined_flag_CXX=' $wl-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' - else - # g++ 2.7 appears to require '-G' NOT '-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' - fi - hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag_CXX='$wl-z,text' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - runpath_var='LD_RUN_PATH' - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag_CXX='$wl-z,text' - allow_undefined_flag_CXX='$wl-z,nodefs' - archive_cmds_need_lc_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - export_dynamic_flag_spec_CXX='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ - '"$old_archive_cmds_CXX" - reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ - '"$reload_cmds_CXX" - ;; - *) - archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -printf "%s\n" "$ld_shlibs_CXX" >&6; } - test no = "$ld_shlibs_CXX" && can_build_shared=no - GCC_CXX=$GXX - LD_CXX=$LD - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - # Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= -cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; -if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; - for p in `eval "$output_verbose_link_cmd"`; do - case $prev$p in + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test x-L = "$p" || - test x-R = "$p"; then - prev=$p - continue - fi +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test no = "$pre_test_object_deps_done"; then - case $prev in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX=$prev$p - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX=$prev$p - else - postdeps_CXX="${postdeps_CXX} $prev$p" - fi - fi - prev= - ;; + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi +fi - if test no = "$pre_test_object_deps_done"; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX=$p - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX=$p - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; + ;; - *) ;; # Ignore the rest. + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; - esac - done + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -case $host_os in -interix[3-9]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - predep_objects_CXX= - postdep_objects_CXX= - postdeps_CXX= - ;; -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - compiler_lib_search_dirs_CXX= -if test -n "${compiler_lib_search_path_CXX}"; then - compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi +fi +fi +fi +fi +fi + ;; + esac + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif +#include <stdio.h> +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" - lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi - # C++ specific cases for pic, static, wl, etc. - if test yes = "$GXX"; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -z "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - lt_prog_compiler_pic_CXX='-fPIC' ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic_CXX='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - esac + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; + esac + fi +fi - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - case $host_os in - os2*) - lt_prog_compiler_static_CXX='$wl-static' - ;; - esac - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static_CXX= - ;; - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well esac - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix[4-9]*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | dragonfly* | midnightbsd*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='$wl-a ${wl}archive' - if test ia64 != "$host_cpu"; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='$wl-a ${wl}archive' - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - interix*) - # This is c89, which is MS Visual C++ (no shared libs) - # Anyone wants to do a port? - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - ecpc* ) - # old Intel C++ for x86_64, which still supported -KPIC. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-qpic' - lt_prog_compiler_static_CXX='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) - # Sun C++ 5.9 - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - esac - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic_CXX='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test no != "$with_gnu_ld" && break + ;; + *) + test yes != "$with_gnu_ld" && break + ;; + esac + fi + done + IFS=$lt_save_ifs +else + lt_cv_path_LD=$LD # Let the user override the test with a path. +fi +fi + +LD=$lt_cv_path_LD +if test -n "$LD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + file_list_spec_CXX='@' + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly* | midnightbsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly* | midnightbsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; esac ;; psos*) @@ -16734,386 +17645,1256 @@ lt_prog_compiler_static_CXX= esac fi -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl* | icl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly* | midnightbsd*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' ;; -esac + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -printf %s "checking for $compiler option to produce PIC... " >&6; } -if test ${lt_cv_prog_compiler_pic_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } -lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } -if test ${lt_cv_prog_compiler_pic_works_CXX+y} +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works_CXX=yes - fi - fi - $RM conftest* + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir -if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no fi -fi + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test ${lt_cv_prog_compiler_static_works_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_static_works_CXX=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works_CXX=yes - fi - else - lt_cv_prog_compiler_static_works_CXX=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 -printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } +rdos*) + dynamic_linker=no + ;; -if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then - : -else - lt_prog_compiler_static_CXX= -fi +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - lt_cv_prog_compiler_c_o_CXX=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } -hard_links=nottested -if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -printf %s "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -printf "%s\n" "$hard_links" >&6; } - if test no = "$hard_links"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - case $host_os in - aix[4-9]*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to GNU nm, but means don't demangle to AIX nm. - # Without the "-l" option, or with the "-B" option, AIX nm treats - # weak defined symbols like other global defined symbols, whereas - # GNU nm marks them as "W". - # While the 'weak' keyword is ignored in the Export File, we need - # it in the Import File for the 'aix-soname' feature, so we have - # to replace the "-B" option with "-P" for AIX nm. - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX=$ltdll_cmds - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl* | icl*) - exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - ;; - esac - ;; - linux* | k*bsd*-gnu | gnu*) - link_all_deplibs_CXX=no - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 -printf "%s\n" "$ld_shlibs_CXX" >&6; } -test no = "$ld_shlibs_CXX" && can_build_shared=no -with_gnu_ld_CXX=$with_gnu_ld -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - if test yes,yes = "$GCC,$enable_shared"; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -printf %s "checking whether -lc should be explicitly linked in... " >&6; } -if test ${lt_cv_archive_cmds_need_lc_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - pic_flag=$lt_prog_compiler_pic_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc_CXX=no - else - lt_cv_archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 -printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } - archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX - ;; - esac - fi - ;; -esac @@ -17131,8 +18912,43 @@ esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi @@ -17140,8 +18956,25 @@ esac + fi # test -n "$compiler" + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu @@ -17157,524 +18990,764 @@ esac + ac_config_commands="$ac_config_commands libtool" +# Only expand once: +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -printf %s "checking dynamic linker characteristics... " >&6; } +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; + test -n "$ac_ct_CC" && break +done -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH + if test "x$ac_ct_CC" = x; then + CC="" else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # Using Import Files as archive members, it is possible to support - # filename-based versioning of shared library archives on AIX. While - # this would work for both with and without runtime linking, it will - # prevent static linking of such archives. So we do filename-based - # shared library versioning with .so extension only, which is used - # when both runtime linking and shared linking is enabled. - # Unfortunately, runtime linking may impact performance, so we do - # not want this to be the default eventually. Also, we use the - # versioned .so libs for executables only if there is the -brtl - # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. - # To allow for filename-based versioning support, we need to create - # libNAME.so.V as an archive file, containing: - # *) an Import File, referring to the versioned filename of the - # archive as well as the shared archive member, telling the - # bitwidth (32 or 64) of that shared object, and providing the - # list of exported symbols of that shared object, eventually - # decorated with the 'weak' keyword - # *) the shared object with the F_LOADONLY flag set, to really avoid - # it being seen by the linker. - # At run time we better use the real file rather than another symlink, - # but for link time we create the symlink libNAME.so -> libNAME.so.V + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi - case $with_aix_soname,$aix_use_runtimelinking in - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - aix,yes) # traditional libtool - dynamic_linker='AIX unversionable lib.so' - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - aix,no) # traditional AIX only - dynamic_linker='AIX lib.a(lib.so.V)' - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - ;; - svr4,*) # full svr4 only - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,yes) # both, prefer svr4 - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # unpreferred sharedlib libNAME.a needs extra handling - postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' - postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,no) # both, prefer aix - dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling - postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' - postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' - ;; - esac - shlibpath_var=LIBPATH +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - ;; +done + done +IFS=$as_save_IFS -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; esac - ;; - -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes +fi - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } - *,cl* | *,icl*) - # Native MSVC or ICC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif - *) - # Assume MSVC and ICC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; +int +main (void) +{ -freebsd* | dragonfly* | midnightbsd*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; +int +main (void) +{ -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - sys_lib_dlsearch_path_spec=/usr/lib/hpux32 - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - sys_lib_dlsearch_path_spec=/usr/lib/hpux64 - fi - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; +int +main (void) +{ -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - hardcode_libdir_flag_spec_CXX='-L$libdir' - ;; +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - # Some binutils ld are patched to set DT_RUNPATH - if test ${lt_cv_shlibpath_overrides_runpath+y} + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -17685,287 +19758,237 @@ main (void) return 0; } _ACEOF -if ac_fn_cxx_try_link "$LINENO" -then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null -then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Ideally, we could use ldconfig to report *all* directores which are - # searched for libraries, however this is still not possible. Aside from not - # being certain /sbin/ldconfig is available, command - # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, - # even though it is searched at run-time. Try to do the best guess by - # appending ld.so.conf contents (and includes) to the search path. - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; -os2*) - libname_spec='$name' - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - # OS/2 can only load a DLL with a base name of 8 characters or less. - soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; - v=$($ECHO $release$versuffix | tr -d .-); - n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); - $ECHO $n$v`$shared_ext' - library_names_spec='${libname}_dll.$libext' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=BEGINLIBPATH - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi -rdos*) - dynamic_linker=no - ;; + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +printf %s "checking for C compiler vendor... " >&6; } +if test ${ax_cv_c_compiler_vendor+y} +then : + printf %s "(cached) " >&6 +else $as_nop -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=sco - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; + vendors=" + intel: __ICC,__ECC,__INTEL_COMPILER + ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ + pathscale: __PATHCC__,__PATHSCALE__ + clang: __clang__ + cray: _CRAYC + fujitsu: __FUJITSU + sdcc: SDCC,__SDCC + sx: _SX + nvhpc: __NVCOMPILER + portland: __PGI + gnu: __GNUC__ + sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 + hp: __HP_cc,__HP_aCC + dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER + borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ + comeau: __COMO__ + kai: __KCC + lcc: __LCC__ + sgi: __sgi,sgi + microsoft: _MSC_VER + metrowerks: __MWERKS__ + watcom: __WATCOMC__ + tcc: __TINYC__ + unknown: UNKNOWN + " + for ventest in $vendors; do + case $ventest in + *:) + vendor=$ventest + continue + ;; + *) + vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" + ;; + esac -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; +int +main (void) +{ -*) - dynamic_linker=no - ;; -esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -printf "%s\n" "$dynamic_linker" >&6; } -test no = "$dynamic_linker" && can_build_shared=no +#if !($vencpp) + thisisanerror; +#endif -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + break fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi + ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi - -# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... -configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec - -# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code -func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" - -# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool -configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +printf "%s\n" "$ax_cv_c_compiler_vendor" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this is native windows" >&5 +printf %s "checking whether this is native windows... " >&6; } +ac_cv_native_windows=no +ac_cv_windows=no +case $host_os in + mingw*) + ac_cv_native_windows=yes + ac_cv_windows=yes + ;; + cygwin*) + ac_cv_windows=yes + ;; +esac +if test "$ax_cv_c_compiler_vendor" = "microsoft" ; then + ac_cv_native_windows=yes + ac_cv_windows=yes +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_native_windows" >&5 +printf "%s\n" "$ac_cv_native_windows" >&6; } +# Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi @@ -17973,98 +19996,208 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH +if test "x$ac_cv_windows" = "xyes" +then : + # Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_static=no +fi +else $as_nop + # Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_static=yes +fi +fi +# Check whether --enable-warnings was given. +if test ${enable_warnings+y} +then : + enableval=$enable_warnings; enable_warnings=${enableval} +else $as_nop + enable_warnings=yes +fi +# Check whether --enable-symbol-hiding was given. +if test ${enable_symbol_hiding+y} +then : + enableval=$enable_symbol_hiding; + symbol_hiding="$enableval" + if test "$symbol_hiding" = "no" -a "x$enable_shared" = "xyes" ; then + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + as_fn_error $? "Cannot disable symbol hiding on windows" "$LINENO" 5 + ;; + esac + fi +else $as_nop + if test "x$enable_shared" = "xyes" ; then + symbol_hiding="maybe" + else + symbol_hiding="no" + fi +fi +# Check whether --enable-tests was given. +if test ${enable_tests+y} +then : + enableval=$enable_tests; build_tests="$enableval" +else $as_nop + if test "x$HAVE_CXX14" = "x1" && test "x$cross_compiling" = "xno" ; then + build_tests="maybe" + else + build_tests="no" + fi +fi +# Check whether --enable-cares-threads was given. +if test ${enable_cares_threads+y} +then : + enableval=$enable_cares_threads; CARES_THREADS=${enableval} +else $as_nop + CARES_THREADS=yes +fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -printf %s "checking how to hardcode library paths into programs... " >&6; } -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || - test -n "$runpath_var_CXX" || - test yes = "$hardcode_automatic_CXX"; then +# Check whether --with-random was given. +if test ${with_random+y} +then : + withval=$with_random; CARES_RANDOM_FILE="$withval" +else $as_nop + CARES_RANDOM_FILE="/dev/urandom" - # We can hardcode non-existent directories. - if test no != "$hardcode_direct_CXX" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && - test no != "$hardcode_minus_L_CXX"; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 -printf "%s\n" "$hardcode_action_CXX" >&6; } -if test relink = "$hardcode_action_CXX" || - test yes = "$inherit_rpath_CXX"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi +if test -n "$CARES_RANDOM_FILE" && test X"$CARES_RANDOM_FILE" != Xno ; then +printf "%s\n" "#define CARES_RANDOM_FILE \"$CARES_RANDOM_FILE\"" >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi - fi # test -n "$compiler" + MAINT=$MAINTAINER_MODE_TRUE - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test yes != "$_lt_caught_CXX_error" -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' @@ -18079,186 +20212,64 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_config_commands="$ac_config_commands libtool" -# Only expand once: -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + # allow to override gcov location -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} +# Check whether --with-gcov was given. +if test ${with_gcov+y} then : - printf %s "(cached) " >&6 + withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5 +printf %s "checking whether to build with code coverage support... " >&6; } + # Check whether --enable-code-coverage was given. +if test ${enable_code_coverage+y} then : - printf %s "(cached) " >&6 + enableval=$enable_code_coverage; else $as_nop - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + enable_code_coverage=no fi - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi + + if test "x$enable_code_coverage" = xyes; then + CODE_COVERAGE_ENABLED_TRUE= + CODE_COVERAGE_ENABLED_FALSE='#' else - CC="$ac_cv_prog_CC" + CODE_COVERAGE_ENABLED_TRUE='#' + CODE_COVERAGE_ENABLED_FALSE= fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + CODE_COVERAGE_ENABLED=$enable_code_coverage -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5 +printf "%s\n" "$enable_code_coverage" >&6; } + + if test "x$enable_code_coverage" = xyes +then : - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 + for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} +if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. else - ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do @@ -18269,12 +20280,8 @@ do *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18282,45 +20289,78 @@ done done IFS=$as_save_IFS -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" - fi -fi fi fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi + test -n "$AWK" && break +done + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU make" >&5 +printf %s "checking for GNU make... " >&6; } +if test ${_cv_gnu_make_command+y} +then : + printf %s "(cached) " >&6 +else $as_nop + _cv_gnu_make_command="" ; + for a in "$MAKE" make gmake gnumake ; do + if test -z "$a" ; then continue ; fi ; + if "$a" --version 2> /dev/null | grep GNU 2>&1 > /dev/null ; then + _cv_gnu_make_command=$a ; + AX_CHECK_GNU_MAKE_HEADLINE=$("$a" --version 2> /dev/null | grep "GNU Make") + ax_check_gnu_make_version=$(echo ${AX_CHECK_GNU_MAKE_HEADLINE} | ${AWK} -F " " '{ print $(NF); }') + break ; + fi + done ; fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_cv_gnu_make_command" >&5 +printf "%s\n" "$_cv_gnu_make_command" >&6; } + if test "x$_cv_gnu_make_command" = x"" +then : + ifGNUmake="#" +else $as_nop + ifGNUmake="" +fi + if test "x$_cv_gnu_make_command" = x"" +then : + ifnGNUmake="" +else $as_nop + ifnGNUmake="#" +fi + if test "x$_cv_gnu_make_command" = x"" +then : + { ax_cv_gnu_make_command=; unset ax_cv_gnu_make_command;} +else $as_nop + ax_cv_gnu_make_command=${_cv_gnu_make_command} +fi + if test "x$_cv_gnu_make_command" = x"" +then : + as_fn_error $? "not using GNU make that is needed for coverage" "$LINENO" 5 +fi + + + + + # check for gcov + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. +set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} +if test ${ac_cv_prog_GCOV+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. + if test -n "$GCOV"; then + ac_cv_prog_GCOV="$GCOV" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -18333,7 +20373,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18343,33 +20383,29 @@ IFS=$as_save_IFS fi fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } +GCOV=$ac_cv_prog_GCOV +if test -n "$GCOV"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 +printf "%s\n" "$GCOV" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - test -n "$CC" && break - done fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 +if test -z "$ac_cv_prog_GCOV"; then + ac_ct_GCOV=$GCOV + # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. +set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} +if test ${ac_cv_prog_ac_ct_GCOV+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + if test -n "$ac_ct_GCOV"; then + ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -18382,7 +20418,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" + ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18392,21 +20428,17 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } +ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV +if test -n "$ac_ct_GCOV"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5 +printf "%s\n" "$ac_ct_GCOV" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" + if test "x$ac_ct_GCOV" = x; then + GCOV=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -18414,23 +20446,35 @@ yes:) printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - CC=$ac_ct_CC + GCOV=$ac_ct_GCOV fi +else + GCOV="$ac_cv_prog_GCOV" fi + if test "X$GCOV" = "X:" +then : + as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5 fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. -set dummy ${ac_tool_prefix}clang; ac_word=$2 + + + if test "$GCC" = "no" +then : + + as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5 + +fi + + # Extract the first word of "lcov", so it can be a program name with args. +set dummy lcov; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} +if test ${ac_cv_prog_LCOV+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. + if test -n "$LCOV"; then + ac_cv_prog_LCOV="$LCOV" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -18443,7 +20487,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}clang" + ac_cv_prog_LCOV="lcov" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18453,29 +20497,26 @@ IFS=$as_save_IFS fi fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } +LCOV=$ac_cv_prog_LCOV +if test -n "$LCOV"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 +printf "%s\n" "$LCOV" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "clang", so it can be a program name with args. -set dummy clang; ac_word=$2 + # Extract the first word of "genhtml", so it can be a program name with args. +set dummy genhtml; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} +if test ${ac_cv_prog_GENHTML+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + if test -n "$GENHTML"; then + ac_cv_prog_GENHTML="$GENHTML" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -18488,7 +20529,7 @@ do esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="clang" + ac_cv_prog_GENHTML="genhtml" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi @@ -18498,78 +20539,179 @@ IFS=$as_save_IFS fi fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } +GENHTML=$ac_cv_prog_GENHTML +if test -n "$GENHTML"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 +printf "%s\n" "$GENHTML" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" + + + if test x"$LCOV" = x +then : + + as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5 + +fi + + if test x"$GENHTML" = x +then : + + as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5 + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _gcov_init in -lgcov" >&5 +printf %s "checking for _gcov_init in -lgcov... " >&6; } +if test ${ac_cv_lib_gcov__gcov_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgcov $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char _gcov_init (); +int +main (void) +{ +return _gcov_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gcov__gcov_init=yes +else $as_nop + ac_cv_lib_gcov__gcov_init=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcov__gcov_init" >&5 +printf "%s\n" "$ac_cv_lib_gcov__gcov_init" >&6; } +if test "x$ac_cv_lib_gcov__gcov_init" = xyes +then : + CODE_COVERAGE_LIBS="-lgcov" +else $as_nop + CODE_COVERAGE_LIBS="" +fi + + + CODE_COVERAGE_CPPFLAGS="-DNDEBUG" + CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" + CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" + + + + + + + fi + + + + + + + + + + +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; fi +if test "$enable_largefile" != no; then -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ -# Provide some information about the compiler. -printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion -version; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC fi - rm -f conftest.er1 conftest.err - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 -printf %s "checking whether the compiler supports GNU C... " >&6; } -if test ${ac_cv_c_compiler_gnu+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} then : printf %s "(cached) " >&6 else $as_nop + while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int main (void) { -#ifndef __GNUC__ - choke me -#endif ; return 0; @@ -18577,38 +20719,66 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no + ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done fi -ac_test_CFLAGS=${CFLAGS+y} -ac_save_CFLAGS=$CFLAGS -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -printf %s "checking whether $CC accepts -g... " >&6; } -if test ${ac_cv_prog_cc_g+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} then : printf %s "(cached) " >&6 else $as_nop - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int main (void) { @@ -18619,12 +20789,21 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#define _LARGE_FILES 1 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int main (void) { @@ -18635,11 +20814,53 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi +fi + + +case $host_os in + solaris*) + +printf "%s\n" "#define ETC_INET 1" >>confdefs.h + + ;; +esac + +case $host_os in + solaris2*) + if test "x$GCC" = 'xyes'; then + + + +for flag in -mimpure-text; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_ldflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5 +printf %s "checking whether the linker accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -18650,192 +20871,251 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -printf "%s\n" "$ac_cv_prog_cc_g" >&6; } -if test $ac_test_CFLAGS; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags fi -ac_prog_cc_stdc=no -if test x$ac_prog_cc_stdc = xno +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 -printf %s "checking for $CC option to enable C11 features... " >&6; } -if test ${ac_cv_prog_cc_c11+y} + +if test ${LDFLAGS+y} then : - printf %s "(cached) " >&6 + + case " $LDFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains \$flag"; } >&5 + (: LDFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + else $as_nop - ac_cv_prog_cc_c11=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_c_conftest_c11_program -_ACEOF -for ac_arg in '' -std=gnu11 -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" -then : - ac_cv_prog_cc_c11=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - test "x$ac_cv_prog_cc_c11" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC + + LDFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi -if test "x$ac_cv_prog_cc_c11" = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 -printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + : fi + +done + + fi + ;; + *) + ;; +esac + +cares_use_no_undefined=no +case $host_os in + cygwin* | mingw* | pw32* | cegcc* | os2* | aix*) + cares_use_no_undefined=yes + ;; + *) + ;; +esac + if test "$cares_use_no_undefined" = 'yes'; then + CARES_USE_NO_UNDEFINED_TRUE= + CARES_USE_NO_UNDEFINED_FALSE='#' +else + CARES_USE_NO_UNDEFINED_TRUE='#' + CARES_USE_NO_UNDEFINED_FALSE= fi -if test x$ac_prog_cc_stdc = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 -printf %s "checking for $CC option to enable C99 features... " >&6; } -if test ${ac_cv_prog_cc_c99+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_c_conftest_c99_program -_ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" -then : - ac_cv_prog_cc_c99=$ac_arg + + + +if test "$ac_cv_native_windows" = "yes" ; then + AM_CPPFLAGS="$AM_CPPFLAGS -D_WIN32_WINNT=0x0602 -DWIN32_LEAN_AND_MEAN" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC + +if test "$ac_cv_native_windows" = "yes" -a "x$enable_shared" = "xyes" -a "x$enable_static" = "xyes" ; then + as_fn_error $? "Windows cannot build both static and shared simultaneously, specify --disable-shared or --disable-static" "$LINENO" 5 fi -if test "x$ac_cv_prog_cc_c99" = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x +if test "x$enable_shared" = "xno" -a "x$enable_static" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need CARES_STATICLIB definition" >&5 +printf %s "checking whether we need CARES_STATICLIB definition... " >&6; } + if test "$ac_cv_native_windows" = "yes" ; then + +if test ${AM_CPPFLAGS+y} then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } + + case " $AM_CPPFLAGS " in #( + *" -DCARES_STATICLIB "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DCARES_STATICLIB"; } >&5 + (: AM_CPPFLAGS already contains -DCARES_STATICLIB) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CPPFLAGS " -DCARES_STATICLIB" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + + AM_CPPFLAGS=-DCARES_STATICLIB + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi + + PKGCONFIG_CFLAGS="-DCARES_STATICLIB" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi fi -if test x$ac_prog_cc_stdc = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 -printf %s "checking for $CC option to enable C89 features... " >&6; } -if test ${ac_cv_prog_cc_c89+y} + +CARES_SYMBOL_HIDING_CFLAG="" +if test "$symbol_hiding" != "no" ; then + compiler_supports_symbol_hiding="no" + if test "$ac_cv_windows" = "yes" ; then + compiler_supports_symbol_hiding="yes" + else + case "$ax_cv_c_compiler_vendor" in + clang|gnu|intel) + + + + +for flag in -fvisibility=hidden; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_c_conftest_c89_program + +int +main (void) +{ + + ; + return 0; +} _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_compile "$LINENO" then : - ac_cv_prog_cc_c89=$ac_arg + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags fi - -if test "x$ac_cv_prog_cc_c89" = xno +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x + +if test ${CARES_SYMBOL_HIDING_CFLAG+y} then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } + + case " $CARES_SYMBOL_HIDING_CFLAG " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CARES_SYMBOL_HIDING_CFLAG " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + + CARES_SYMBOL_HIDING_CFLAG=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi + +else $as_nop + : fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +done + if test "x$CARES_SYMBOL_HIDING_CFLAG" != "x" ; then + compiler_supports_symbol_hiding="yes" + fi + ;; + sun) - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 -printf %s "checking whether $CC understands -c and -o together... " >&6; } -if test ${am_cv_prog_cc_c_o+y} + + + +for flag in -xldscope=hidden; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop + + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18847,1963 +21127,2202 @@ main (void) return 0; } _ACEOF - # Make sure it works both with $CC and with simple cc. - # Following AC_PROG_CC_C_O, we do the test twice because some - # compilers refuse to overwrite an existing .o file with -o, - # though they will create one. - am_cv_prog_cc_c_o=yes - for am_i in 1 2; do - if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 - ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } \ - && test -f conftest2.$ac_objext; then - : OK - else - am_cv_prog_cc_c_o=no - break - fi - done - rm -f core conftest* - unset am_i +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 -printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } -if test "$am_cv_prog_cc_c_o" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : +if test ${CARES_SYMBOL_HIDING_CFLAG+y} +then : + case " $CARES_SYMBOL_HIDING_CFLAG " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -printf %s "checking for egrep... " >&6; } -if test ${ac_cv_path_EGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; + as_fn_append CARES_SYMBOL_HIDING_CFLAG " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; esac - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi +else $as_nop + + CARES_SYMBOL_HIDING_CFLAG=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } - fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -printf "%s\n" "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" +else $as_nop + : +fi +done + if test "x$CARES_SYMBOL_HIDING_CFLAG" != "x" ; then + compiler_supports_symbol_hiding="yes" + fi + ;; + esac + fi + if test "$compiler_supports_symbol_hiding" = "no" ; then + if test "$symbol_hiding" = "yes" ; then + as_fn_error $? "Compiler does not support symbol hiding" "$LINENO" 5 + else + symbol_hiding="no" + fi + else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 -printf %s "checking for C compiler vendor... " >&6; } -if test ${ax_cv_c_compiler_vendor+y} -then : - printf %s "(cached) " >&6 -else $as_nop +printf "%s\n" "#define CARES_SYMBOL_HIDING 1 " >>confdefs.h - vendors=" - intel: __ICC,__ECC,__INTEL_COMPILER - ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__,__ibmxl__ - pathscale: __PATHCC__,__PATHSCALE__ - clang: __clang__ - cray: _CRAYC - fujitsu: __FUJITSU - sdcc: SDCC,__SDCC - sx: _SX - nvhpc: __NVCOMPILER - portland: __PGI - gnu: __GNUC__ - sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95 - hp: __HP_cc,__HP_aCC - dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER - borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ - comeau: __COMO__ - kai: __KCC - lcc: __LCC__ - sgi: __sgi,sgi - microsoft: _MSC_VER - metrowerks: __MWERKS__ - watcom: __WATCOMC__ - tcc: __TINYC__ - unknown: UNKNOWN - " - for ventest in $vendors; do - case $ventest in - *:) - vendor=$ventest - continue - ;; - *) - vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" - ;; - esac + symbol_hiding="yes" + fi +fi + if test "x$symbol_hiding" = "xyes"; then + CARES_SYMBOL_HIDING_TRUE= + CARES_SYMBOL_HIDING_FALSE='#' +else + CARES_SYMBOL_HIDING_TRUE='#' + CARES_SYMBOL_HIDING_FALSE= +fi - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + + +if test "$enable_warnings" = "yes"; then + + + + +for flag in -Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wconversion -Wdeclaration-after-statement -Wdouble-promotion -Wfloat-equal -Wformat-security -Winit-self -Wjump-misses-init -Wlogical-op -Wmissing-braces -Wmissing-declarations -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-prototypes -Wnested-externs -Wno-coverage-mismatch -Wold-style-definition -Wpacked -Wpedantic -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow -Wstrict-prototypes -Wtrampolines -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wvla -Wwrite-strings -Werror=implicit-int -Werror=implicit-function-declaration -Werror=partial-availability -Wno-long-long ; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { -#if !($vencpp) - thisisanerror; -#endif - ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : - break + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - done - - ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` - + CFLAGS=$ax_check_save_flags fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 -printf "%s\n" "$ax_cv_c_compiler_vendor" >&6; } +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : +if test ${AM_CFLAGS+y} +then : -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this is native windows" >&5 -printf %s "checking whether this is native windows... " >&6; } -ac_cv_native_windows=no -ac_cv_windows=no -case $host_os in - mingw*) - ac_cv_native_windows=yes - ac_cv_windows=yes - ;; - cygwin*) - ac_cv_windows=yes - ;; + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + (: AM_CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; esac -if test "$ax_cv_c_compiler_vendor" = "microsoft" ; then - ac_cv_native_windows=yes - ac_cv_windows=yes -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_native_windows" >&5 -printf "%s\n" "$ac_cv_native_windows" >&6; } +else $as_nop + + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi -# Check whether --enable-shared was given. -if test ${enable_shared+y} -then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS=$lt_save_ifs - ;; - esac else $as_nop - enable_shared=yes + : fi +done +fi +case $host_os in + *qnx*|*android*) -if test "x$ac_cv_windows" = "xyes" +for flag in -std=c99; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : - # Check whether --enable-static was given. -if test ${enable_static+y} + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac + eval "$as_CACHEVAR=yes" else $as_nop - enable_static=no + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${AM_CFLAGS+y} +then : + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + (: AM_CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac +else $as_nop + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +fi else $as_nop - # Check whether --enable-static was given. -if test ${enable_static+y} -then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else $as_nop - enable_static=yes + : fi +done + + ;; + *) + +for flag in -std=c90; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -fi +int +main (void) +{ -# Check whether --enable-warnings was given. -if test ${enable_warnings+y} + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" then : - enableval=$enable_warnings; enable_warnings=${enableval} + eval "$as_CACHEVAR=yes" else $as_nop - enable_warnings=yes + eval "$as_CACHEVAR=no" fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : - -# Check whether --enable-symbol-hiding was given. -if test ${enable_symbol_hiding+y} +if test ${AM_CFLAGS+y} then : - enableval=$enable_symbol_hiding; - symbol_hiding="$enableval" - if test "$symbol_hiding" = "no" -a "x$enable_shared" = "xyes" ; then - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - as_fn_error $? "Cannot disable symbol hiding on windows" "$LINENO" 5 - ;; - esac - fi + + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + (: AM_CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac else $as_nop - if test "x$enable_shared" = "xyes" ; then - symbol_hiding="maybe" - else - symbol_hiding="no" - fi + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +fi +else $as_nop + : fi +done -# Check whether --enable-tests was given. -if test ${enable_tests+y} -then : - enableval=$enable_tests; build_tests="$enableval" -else $as_nop - if test "x$HAVE_CXX14" = "x1" && test "x$cross_compiling" = "xno" ; then - build_tests="maybe" - else - build_tests="no" - fi + ;; +esac +case $host_os in + *qnx*) -fi -# Check whether --enable-cares-threads was given. -if test ${enable_cares_threads+y} + +for flag in -D_QNX_SOURCE; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : - enableval=$enable_cares_threads; CARES_THREADS=${enableval} + printf %s "(cached) " >&6 else $as_nop - CARES_THREADS=yes -fi + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ -# Check whether --with-random was given. -if test ${with_random+y} + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" then : - withval=$with_random; CARES_RANDOM_FILE="$withval" + eval "$as_CACHEVAR=yes" else $as_nop - CARES_RANDOM_FILE="/dev/urandom" - + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : -if test -n "$CARES_RANDOM_FILE" && test X"$CARES_RANDOM_FILE" != Xno ; then +if test ${AM_CPPFLAGS+y} +then : + case " $AM_CPPFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains \$flag"; } >&5 + (: AM_CPPFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : -printf "%s\n" "#define CARES_RANDOM_FILE \"$CARES_RANDOM_FILE\"" >>confdefs.h + as_fn_append AM_CPPFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac -fi +else $as_nop + AM_CPPFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 -printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } - # Check whether --enable-maintainer-mode was given. -if test ${enable_maintainer_mode+y} -then : - enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else $as_nop - USE_MAINTAINER_MODE=no fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } - if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= +else $as_nop + : fi - MAINT=$MAINTAINER_MODE_TRUE +done + ;; +esac -# Check whether --enable-silent-rules was given. -if test ${enable_silent_rules+y} -then : - enableval=$enable_silent_rules; -fi +if test "$ax_cv_c_compiler_vendor" = "intel"; then -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=0;; -esac -am_make=${MAKE-make} -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -printf %s "checking whether $am_make supports nested variables... " >&6; } -if test ${am_cv_make_support_nested_variables+y} + + + +for flag in -shared-intel; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop - if printf "%s\n" 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - - + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : +if test ${AM_CFLAGS+y} +then : + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + (: AM_CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac +else $as_nop + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +fi +else $as_nop + : +fi +done +fi +if test "$ac_cv_native_windows" = "yes" ; then + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi - # allow to override gcov location + done + ac_cv_prog_CPP=$CPP -# Check whether --with-gcov was given. -if test ${with_gcov+y} +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov + else $as_nop - _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov + # Broken: fails on valid input. +continue fi +rm -f conftest.err conftest.i conftest.$ac_ext - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5 -printf %s "checking whether to build with code coverage support... " >&6; } - # Check whether --enable-code-coverage was given. -if test ${enable_code_coverage+y} + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO" then : - enableval=$enable_code_coverage; + # Broken: success on invalid input. +continue else $as_nop - enable_code_coverage=no + # Passes both tests. +ac_preproc_ok=: +break fi +rm -f conftest.err conftest.i conftest.$ac_ext +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : - if test "x$enable_code_coverage" = xyes; then - CODE_COVERAGE_ENABLED_TRUE= - CODE_COVERAGE_ENABLED_FALSE='#' -else - CODE_COVERAGE_ENABLED_TRUE='#' - CODE_COVERAGE_ENABLED_FALSE= +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } fi - CODE_COVERAGE_ENABLED=$enable_code_coverage +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5 -printf "%s\n" "$enable_code_coverage" >&6; } - if test "x$enable_code_coverage" = xyes +ac_fn_c_check_header_preproc "$LINENO" "windows.h" "ac_cv_header_windows_h" +if test "x$ac_cv_header_windows_h" = xyes then : + printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h - - for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AWK+y} +fi +ac_fn_c_check_header_preproc "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" +if test "x$ac_cv_header_winsock2_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -printf "%s\n" "$AWK" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - - test -n "$AWK" && break -done +ac_fn_c_check_header_preproc "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" +if test "x$ac_cv_header_ws2tcpip_h" = xyes +then : + printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU make" >&5 -printf %s "checking for GNU make... " >&6; } -if test ${_cv_gnu_make_command+y} +fi +ac_fn_c_check_header_preproc "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" +if test "x$ac_cv_header_iphlpapi_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop - _cv_gnu_make_command="" ; - for a in "$MAKE" make gmake gnumake ; do - if test -z "$a" ; then continue ; fi ; - if "$a" --version 2> /dev/null | grep GNU 2>&1 > /dev/null ; then - _cv_gnu_make_command=$a ; - AX_CHECK_GNU_MAKE_HEADLINE=$("$a" --version 2> /dev/null | grep "GNU Make") - ax_check_gnu_make_version=$(echo ${AX_CHECK_GNU_MAKE_HEADLINE} | ${AWK} -F " " '{ print $(NF); }') - break ; - fi - done ; + printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_cv_gnu_make_command" >&5 -printf "%s\n" "$_cv_gnu_make_command" >&6; } - if test "x$_cv_gnu_make_command" = x"" +ac_fn_c_check_header_preproc "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" +if test "x$ac_cv_header_netioapi_h" = xyes then : - ifGNUmake="#" -else $as_nop - ifGNUmake="" + printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h + fi - if test "x$_cv_gnu_make_command" = x"" +ac_fn_c_check_header_preproc "$LINENO" "ws2ipdef.h" "ac_cv_header_ws2ipdef_h" +if test "x$ac_cv_header_ws2ipdef_h" = xyes then : - ifnGNUmake="" -else $as_nop - ifnGNUmake="#" + printf "%s\n" "#define HAVE_WS2IPDEF_H 1" >>confdefs.h + fi - if test "x$_cv_gnu_make_command" = x"" +ac_fn_c_check_header_preproc "$LINENO" "winternl.h" "ac_cv_header_winternl_h" +if test "x$ac_cv_header_winternl_h" = xyes then : - { ax_cv_gnu_make_command=; unset ax_cv_gnu_make_command;} -else $as_nop - ax_cv_gnu_make_command=${_cv_gnu_make_command} + printf "%s\n" "#define HAVE_WINTERNL_H 1" >>confdefs.h + fi - if test "x$_cv_gnu_make_command" = x"" +ac_fn_c_check_header_preproc "$LINENO" "ntdef.h" "ac_cv_header_ntdef_h" +if test "x$ac_cv_header_ntdef_h" = xyes then : - as_fn_error $? "not using GNU make that is needed for coverage" "$LINENO" 5 + printf "%s\n" "#define HAVE_NTDEF_H 1" >>confdefs.h + fi +ac_fn_c_check_header_preproc "$LINENO" "ntstatus.h" "ac_cv_header_ntstatus_h" +if test "x$ac_cv_header_ntstatus_h" = xyes +then : + printf "%s\n" "#define HAVE_NTSTATUS_H 1" >>confdefs.h +fi +ac_fn_c_check_header_preproc "$LINENO" "mswsock.h" "ac_cv_header_mswsock_h" +if test "x$ac_cv_header_mswsock_h" = xyes +then : + printf "%s\n" "#define HAVE_MSWSOCK_H 1" >>confdefs.h +fi - # check for gcov - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. -set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_GCOV+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$GCOV"; then - ac_cv_prog_GCOV="$GCOV" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + if test "$ac_cv_header_winsock2_h" = "yes"; then + LIBS="$LIBS -lws2_32 -liphlpapi" fi -done - done -IFS=$as_save_IFS - -fi -fi -GCOV=$ac_cv_prog_GCOV -if test -n "$GCOV"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 -printf "%s\n" "$GCOV" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } fi -fi -if test -z "$ac_cv_prog_GCOV"; then - ac_ct_GCOV=$GCOV - # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. -set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_GCOV+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyport" >&5 +printf %s "checking for library containing getservbyport... " >&6; } +if test ${ac_cv_search_getservbyport+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$ac_ct_GCOV"; then - ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getservbyport (); +int +main (void) +{ +return getservbyport (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl socket resolv do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_getservbyport=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_getservbyport+y} +then : + break +fi done - done -IFS=$as_save_IFS +if test ${ac_cv_search_getservbyport+y} +then : +else $as_nop + ac_cv_search_getservbyport=no fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV -if test -n "$ac_ct_GCOV"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5 -printf "%s\n" "$ac_ct_GCOV" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyport" >&5 +printf "%s\n" "$ac_cv_search_getservbyport" >&6; } +ac_res=$ac_cv_search_getservbyport +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - if test "x$ac_ct_GCOV" = x; then - GCOV=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - GCOV=$ac_ct_GCOV - fi -else - GCOV="$ac_cv_prog_GCOV" fi - if test "X$GCOV" = "X:" -then : - as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5 -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libxnet is required" >&5 +printf %s "checking if libxnet is required... " >&6; } +need_xnet=no +case $host_os in + hpux*) + XNET_LIBS="" - if test "$GCC" = "no" -then : - as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5 -fi - # Extract the first word of "lcov", so it can be a program name with args. -set dummy lcov; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_LCOV+y} +for flag in -lxnet; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_ldflags__$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5 +printf %s "checking whether the linker accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$LCOV"; then - ac_cv_prog_LCOV="$LCOV" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_LCOV="lcov" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$ax_check_save_flags fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${XNET_LIBS+y} +then : + + case " $XNET_LIBS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS already contains \$flag"; } >&5 + (: XNET_LIBS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append XNET_LIBS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS\""; } >&5 + (: XNET_LIBS="$XNET_LIBS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else $as_nop + + XNET_LIBS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS\""; } >&5 + (: XNET_LIBS="$XNET_LIBS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi -LCOV=$ac_cv_prog_LCOV -if test -n "$LCOV"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 -printf "%s\n" "$LCOV" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + +else $as_nop + : fi +done - # Extract the first word of "genhtml", so it can be a program name with args. -set dummy genhtml; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_GENHTML+y} + if test "x$XNET_LIBS" != "x" ; then + LIBS="$LIBS $XNET_LIBS" + need_xnet=yes + fi + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $need_xnet" >&5 +printf "%s\n" "$need_xnet" >&6; } + +if test "x$host_vendor" = "xibm" -a "x$host_os" = "xopenedition" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 +printf %s "checking for library containing res_init... " >&6; } +if test ${ac_cv_search_res_init+y} then : printf %s "(cached) " >&6 else $as_nop - if test -n "$GENHTML"; then - ac_cv_prog_GENHTML="$GENHTML" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char res_init (); +int +main (void) +{ +return res_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_GENHTML="genhtml" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_res_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_res_init+y} +then : + break +fi done - done -IFS=$as_save_IFS +if test ${ac_cv_search_res_init+y} +then : +else $as_nop + ac_cv_search_res_init=no fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -GENHTML=$ac_cv_prog_GENHTML -if test -n "$GENHTML"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 -printf "%s\n" "$GENHTML" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_init" >&5 +printf "%s\n" "$ac_cv_search_res_init" >&6; } +ac_res=$ac_cv_search_res_init +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define CARES_USE_LIBRESOLV 1" >>confdefs.h - if test x"$LCOV" = x -then : +else $as_nop - as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5 + as_fn_error $? "Unable to find libresolv which is required for z/OS" "$LINENO" 5 fi - if test x"$GENHTML" = x + +fi + + +if test "x$host_vendor" = "xapple" then : - as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iOS minimum version 10 or later" >&5 +printf %s "checking for iOS minimum version 10 or later... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -fi - CODE_COVERAGE_CPPFLAGS="-DNDEBUG" - CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" - CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" - CODE_COVERAGE_LIBS="-lgcov" +#include <stdio.h> +#include <AvailabilityMacros.h> +#include <TargetConditionals.h> +int +main (void) +{ + +#if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 +#error Not iOS 10 or later +#endif +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ac_cv_ios_10="yes" +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +if test "x$host_vendor" = "xapple" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for macOS minimum version 10.12 or later" >&5 +printf %s "checking for macOS minimum version 10.12 or later... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +#include <AvailabilityMacros.h> +#include <TargetConditionals.h> +int +main (void) +{ +#ifndef MAC_OS_X_VERSION_10_12 +# define MAC_OS_X_VERSION_10_12 101200 +#endif +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 +#error Not macOS 10.12 or later +#endif +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ac_cv_macos_10_12="yes" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether user namespaces are supported" >&5 -printf %s "checking whether user namespaces are supported... " >&6; } -if test ${ax_cv_user_namespace+y} -then : - printf %s "(cached) " >&6 else $as_nop - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } - if test "$cross_compiling" = yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use libgcc" >&5 +printf %s "checking whether to use libgcc... " >&6; } +# Check whether --enable-libgcc was given. +if test ${enable_libgcc+y} then : - ax_cv_user_namespace=no + enableval=$enable_libgcc; case "$enableval" in + yes) + LIBS="$LIBS -lgcc" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } -#define _GNU_SOURCE -#include <fcntl.h> -#include <sched.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> +fi + + +ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> -#include <sys/wait.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -int userfn(void *d) { - usleep(100000); /* synchronize by sleep */ - return (getuid() != 0); -} -char userst[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} +" +if test "x$ac_cv_header_malloc_h" = xyes +then : + printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h -_ACEOF -if ac_fn_c_try_run "$LINENO" +fi +ac_fn_c_check_header_compile "$LINENO" "memory.h" "ac_cv_header_memory_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_memory_h" = xyes then : - ax_cv_user_namespace=yes -else $as_nop - ax_cv_user_namespace=no + printf "%s\n" "#define HAVE_MEMORY_H 1" >>confdefs.h + fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "AvailabilityMacros.h" "ac_cv_header_AvailabilityMacros_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_AvailabilityMacros_h" = xyes +then : + printf "%s\n" "#define HAVE_AVAILABILITYMACROS_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_user_namespace" >&5 -printf "%s\n" "$ax_cv_user_namespace" >&6; } - if test "$ax_cv_user_namespace" = yes; then -printf "%s\n" "#define HAVE_USER_NAMESPACE 1" >>confdefs.h +" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h - fi +fi +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UTS namespaces are supported" >&5 -printf %s "checking whether UTS namespaces are supported... " >&6; } -if test ${ax_cv_uts_namespace+y} -then : - printf %s "(cached) " >&6 -else $as_nop +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - if test "$cross_compiling" = yes +" +if test "x$ac_cv_header_sys_select_h" = xyes then : - ax_cv_uts_namespace=no -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h -#define _GNU_SOURCE -#include <sched.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> +fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> -#include <sys/wait.h> - -int utsfn(void *d) { - char buffer[1024]; - const char *name = "autoconftest"; - int rc = sethostname(name, strlen(name)); - if (rc != 0) return 1; - gethostname(buffer, 1024); - return (strcmp(buffer, name) != 0); -} - -char st2[1024*1024]; -int fn(void *d) { - pid_t child; - int rc, status; - usleep(100000); /* synchronize by sleep */ - if (getuid() != 0) return 1; - child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); - if (child < 0) return 1; - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} -char st[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; - - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -_ACEOF -if ac_fn_c_try_run "$LINENO" +" +if test "x$ac_cv_header_sys_socket_h" = xyes then : - ax_cv_uts_namespace=yes -else $as_nop - ax_cv_uts_namespace=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/filio.h" "ac_cv_header_sys_filio_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +" +if test "x$ac_cv_header_sys_filio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_FILIO_H 1" >>confdefs.h fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_uts_namespace" >&5 -printf "%s\n" "$ax_cv_uts_namespace" >&6; } - if test "$ax_cv_uts_namespace" = yes; then +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -printf "%s\n" "#define HAVE_UTS_NAMESPACE 1" >>confdefs.h +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - fi -# Check whether --enable-largefile was given. -if test ${enable_largefile+y} +" +if test "x$ac_cv_header_sys_ioctl_h" = xyes then : - enableval=$enable_largefile; + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -if test "$enable_largefile" != no; then +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 -printf %s "checking for special C compiler options needed for large files... " >&6; } -if test ${ac_cv_sys_largefile_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_cv_sys_largefile_CC=no - if test "$GCC" != yes; then - ac_save_CC=$CC - while :; do - # IRIX 6.2 and later do not support large files by default, - # so use the C compiler's -n32 option if that helps. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main (void) -{ - ; - return 0; -} -_ACEOF - if ac_fn_c_try_compile "$LINENO" -then : - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - CC="$CC -n32" - if ac_fn_c_try_compile "$LINENO" +" +if test "x$ac_cv_header_sys_param_h" = xyes then : - ac_cv_sys_largefile_CC=' -n32'; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - break - done - CC=$ac_save_CC - rm -f conftest.$ac_ext - fi + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 -printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } - if test "$ac_cv_sys_largefile_CC" != no; then - CC=$CC$ac_cv_sys_largefile_CC - fi +ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if test ${ac_cv_sys_file_offset_bits+y} +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_sys_uio_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main (void) -{ +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_sys_random_h" = xyes then : - ac_cv_sys_file_offset_bits=no; break + printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h + fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _FILE_OFFSET_BITS 64 +ac_fn_c_check_header_compile "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main (void) -{ +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_sys_event_h" = xyes then : - ac_cv_sys_file_offset_bits=64; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_cv_sys_file_offset_bits=unknown - break -done + printf "%s\n" "#define HAVE_SYS_EVENT_H 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 -printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } -case $ac_cv_sys_file_offset_bits in #( - no | unknown) ;; - *) -printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h -;; -esac -rm -rf conftest* - if test $ac_cv_sys_file_offset_bits = unknown; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 -printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } -if test ${ac_cv_sys_large_files+y} -then : - printf %s "(cached) " >&6 -else $as_nop - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +ac_fn_c_check_header_compile "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main (void) -{ +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_sys_epoll_h" = xyes then : - ac_cv_sys_large_files=no; break + printf "%s\n" "#define HAVE_SYS_EPOLL_H 1" >>confdefs.h + fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _LARGE_FILES 1 +ac_fn_c_check_header_compile "$LINENO" "assert.h" "ac_cv_header_assert_h" " +#ifdef HAVE_SYS_TYPES_H #include <sys/types.h> - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main (void) -{ +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_assert_h" = xyes then : - ac_cv_sys_large_files=1; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_cv_sys_large_files=unknown - break -done + printf "%s\n" "#define HAVE_ASSERT_H 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 -printf "%s\n" "$ac_cv_sys_large_files" >&6; } -case $ac_cv_sys_large_files in #( - no | unknown) ;; - *) -printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h -;; -esac -rm -rf conftest* - fi +ac_fn_c_check_header_compile "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_iphlpapi_h" = xyes +then : + printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +" +if test "x$ac_cv_header_netioapi_h" = xyes +then : + printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h -case $host_os in - solaris*) +fi +ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -printf "%s\n" "#define ETC_INET 1" >>confdefs.h +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ;; -esac -case $host_os in - solaris2*) - if test "x$GCC" = 'xyes'; then +" +if test "x$ac_cv_header_netdb_h" = xyes +then : + printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -for flag in -mimpure-text; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_ldflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5 -printf %s "checking whether the linker accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +" +if test "x$ac_cv_header_netinet_in_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop + printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h - ax_check_save_flags=$LDFLAGS - LDFLAGS="$LDFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "netinet6/in6.h" "ac_cv_header_netinet6_in6_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -int -main (void) -{ +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - eval "$as_CACHEVAR=yes" -else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if eval test \"x\$"$as_CACHEVAR"\" = x"yes" -then : - if test ${LDFLAGS+y} + +" +if test "x$ac_cv_header_netinet6_in6_h" = xyes then : - case " $LDFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains \$flag"; } >&5 - (: LDFLAGS already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS \$flag\""; } >&5 - (: LDFLAGS="$LDFLAGS $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - LDFLAGS="$LDFLAGS $flag" - ;; - esac -else $as_nop - LDFLAGS="$flag" -fi + printf "%s\n" "#define HAVE_NETINET6_IN6_H 1" >>confdefs.h -else $as_nop - : fi +ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -done +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - fi - ;; - *) - ;; -esac -cares_use_no_undefined=no -case $host_os in - cygwin* | mingw* | pw32* | cegcc* | os2* | aix*) - cares_use_no_undefined=yes - ;; - *) - ;; -esac - if test "$cares_use_no_undefined" = 'yes'; then - CARES_USE_NO_UNDEFINED_TRUE= - CARES_USE_NO_UNDEFINED_FALSE='#' -else - CARES_USE_NO_UNDEFINED_TRUE='#' - CARES_USE_NO_UNDEFINED_FALSE= +" +if test "x$ac_cv_header_netinet_tcp_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_TCP_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -if test "$ac_cv_native_windows" = "yes" ; then - AM_CPPFLAGS="$AM_CPPFLAGS -D_WIN32_WINNT=0x0602 -DWIN32_LEAN_AND_MEAN" -fi +" +if test "x$ac_cv_header_net_if_h" = xyes +then : + printf "%s\n" "#define HAVE_NET_IF_H 1" >>confdefs.h -if test "$ac_cv_native_windows" = "yes" -a "x$enable_shared" = "xyes" -a "x$enable_static" = "xyes" ; then - as_fn_error $? "Windows cannot build both static and shared simultaneously, specify --disable-shared or --disable-static" "$LINENO" 5 fi +ac_fn_c_check_header_compile "$LINENO" "ifaddrs.h" "ac_cv_header_ifaddrs_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -if test "x$enable_shared" = "xno" -a "x$enable_static" = "xyes" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need CARES_STATICLIB definition" >&5 -printf %s "checking whether we need CARES_STATICLIB definition... " >&6; } - if test "$ac_cv_native_windows" = "yes" ; then - if test ${AM_CPPFLAGS+y} -then : - case " $AM_CPPFLAGS " in - *" -DCARES_STATICLIB "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DCARES_STATICLIB"; } >&5 - (: AM_CPPFLAGS already contains -DCARES_STATICLIB) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS -DCARES_STATICLIB\""; } >&5 - (: AM_CPPFLAGS="$AM_CPPFLAGS -DCARES_STATICLIB") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - AM_CPPFLAGS="$AM_CPPFLAGS -DCARES_STATICLIB" - ;; - esac -else $as_nop - AM_CPPFLAGS="-DCARES_STATICLIB" -fi +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - PKGCONFIG_CFLAGS="-DCARES_STATICLIB" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - fi -fi -CARES_SYMBOL_HIDING_CFLAG="" -if test "$symbol_hiding" != "no" ; then - compiler_supports_symbol_hiding="no" - if test "$ac_cv_windows" = "yes" ; then - compiler_supports_symbol_hiding="yes" - else - case "$ax_cv_c_compiler_vendor" in - clang|gnu|intel) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts " >&5 -printf %s "checking whether C compiler accepts ... " >&6; } -if test ${ax_cv_check_cflags__+y} +" +if test "x$ac_cv_header_ifaddrs_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop + printf "%s\n" "#define HAVE_IFADDRS_H 1" >>confdefs.h - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS " - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -int -main (void) -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - ax_cv_check_cflags__=yes -else $as_nop - ax_cv_check_cflags__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__" >&5 -printf "%s\n" "$ax_cv_check_cflags__" >&6; } -if test x"$ax_cv_check_cflags__" = xyes +" +if test "x$ac_cv_header_fcntl_h" = xyes then : - : -else $as_nop - : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -for flag in -fvisibility=hidden; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +" +if test "x$ac_cv_header_errno_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop + printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "socket.h" "ac_cv_header_socket_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -int -main (void) -{ +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" + +" +if test "x$ac_cv_header_socket_h" = xyes then : - eval "$as_CACHEVAR=yes" -else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags + printf "%s\n" "#define HAVE_SOCKET_H 1" >>confdefs.h + fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes -then : - if test ${CARES_SYMBOL_HIDING_CFLAG+y} +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_strings_h" = xyes then : - case " $CARES_SYMBOL_HIDING_CFLAG " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG \$flag\""; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag" - ;; - esac -else $as_nop - CARES_SYMBOL_HIDING_CFLAG="$flag" -fi + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h -else $as_nop - : fi +ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -done - - if test "x$CARES_SYMBOL_HIDING_CFLAG" != "x" ; then - compiler_supports_symbol_hiding="yes" - fi - ;; - sun) +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -for flag in -xldscope=hidden; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +" +if test "x$ac_cv_header_stdbool_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop + printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "time.h" "ac_cv_header_time_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -int -main (void) -{ +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" + +" +if test "x$ac_cv_header_time_h" = xyes then : - eval "$as_CACHEVAR=yes" -else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags + printf "%s\n" "#define HAVE_TIME_H 1" >>confdefs.h + fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes -then : - if test ${CARES_SYMBOL_HIDING_CFLAG+y} +ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_poll_h" = xyes then : - case " $CARES_SYMBOL_HIDING_CFLAG " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG \$flag\""; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag" - ;; - esac -else $as_nop - CARES_SYMBOL_HIDING_CFLAG="$flag" + printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + + +" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h -else $as_nop - : fi +ac_fn_c_check_header_compile "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -done +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - if test "x$CARES_SYMBOL_HIDING_CFLAG" != "x" ; then - compiler_supports_symbol_hiding="yes" - fi - ;; - esac - fi - if test "$compiler_supports_symbol_hiding" = "no" ; then - if test "$symbol_hiding" = "yes" ; then - as_fn_error $? "Compiler does not support symbol hiding" "$LINENO" 5 - else - symbol_hiding="no" - fi - else -printf "%s\n" "#define CARES_SYMBOL_HIDING 1 " >>confdefs.h +" +if test "x$ac_cv_header_arpa_nameser_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_NAMESER_H 1" >>confdefs.h - symbol_hiding="yes" - fi -fi - if test "x$symbol_hiding" = "xyes"; then - CARES_SYMBOL_HIDING_TRUE= - CARES_SYMBOL_HIDING_FALSE='#' -else - CARES_SYMBOL_HIDING_TRUE='#' - CARES_SYMBOL_HIDING_FALSE= fi +ac_fn_c_check_header_compile "$LINENO" "arpa/nameser_compat.h" "ac_cv_header_arpa_nameser_compat_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +" +if test "x$ac_cv_header_arpa_nameser_compat_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_NAMESER_COMPAT_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -if test "$enable_warnings" = "yes"; then +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif -for flag in -Wall \ - -Wextra \ - -Wcast-align \ - -Wconversion \ - -Wdeclaration-after-statement \ - -Wdouble-promotion \ - -Wfloat-equal \ - -Wformat-security \ - -Winit-self \ - -Wjump-misses-init \ - -Wlogical-op \ - -Wmissing-braces \ - -Wmissing-declarations \ - -Wmissing-format-attribute \ - -Wmissing-include-dirs \ - -Wmissing-prototypes \ - -Wnested-externs \ - -Wno-coverage-mismatch \ - -Wold-style-definition \ - -Wpacked \ - -Wpointer-arith \ - -Wredundant-decls \ - -Wshadow \ - -Wsign-conversion \ - -Wstrict-overflow \ - -Wstrict-prototypes \ - -Wtrampolines \ - -Wundef \ - -Wunused \ - -Wvariadic-macros \ - -Wvla \ - -Wwrite-strings \ - -Werror=implicit-int \ - -Werror=implicit-function-declaration \ - -Werror=partial-availability \ - ; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +" +if test "x$ac_cv_header_arpa_inet_h" = xyes then : - printf %s "(cached) " >&6 -else $as_nop + printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/system_properties.h" "ac_cv_header_sys_system_properties_h" " +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include <arpa/nameser.h> +#endif -int -main (void) -{ +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - eval "$as_CACHEVAR=yes" -else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes -then : - if test ${AM_CFLAGS+y} + +" +if test "x$ac_cv_header_sys_system_properties_h" = xyes then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 - (: AM_CFLAGS already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac -else $as_nop - AM_CFLAGS="$flag" -fi + printf "%s\n" "#define HAVE_SYS_SYSTEM_PROPERTIES_H 1" >>confdefs.h -else $as_nop - : fi -done - -fi -if test "$ax_cv_c_compiler_vendor" = "intel"; then +cares_all_includes=" +#include <stdio.h> +#include <stdlib.h> +#ifdef HAVE_AVAILABILITYMACROS_H +# include <AvailabilityMacros.h> +#endif +#ifdef HAVE_SYS_UIO_H +# include <sys/uio.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_TCP_H +# include <tcp.h> +#endif +#ifdef HAVE_SYS_FILIO_H +# include <sys/filio.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifdef HAVE_STRING_H +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_TIME_H +# include <time.h> +#endif +#ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +#endif +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef HAVE_SYS_RANDOM_H +# include <sys/random.h> +#endif +#ifdef HAVE_SYS_EVENT_H +# include <sys/event.h> +#endif +#ifdef HAVE_SYS_EPOLL_H +# include <sys/epoll.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif +#ifdef HAVE_POLL_H +# include <poll.h> +#endif +#ifdef HAVE_NET_IF_H +# include <net/if.h> +#endif +#ifdef HAVE_IFADDRS_H +# include <ifaddrs.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETINET_TCP_H +# include <netinet/tcp.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#ifdef HAVE_RESOLV_H +# include <resolv.h> +#endif +#ifdef HAVE_SYS_SYSTEM_PROPERTIES_H +# include <sys/system_properties.h> +#endif +#ifdef HAVE_IPHLPAPI_H +# include <iphlpapi.h> +#endif +#ifdef HAVE_NETIOAPI_H +# include <netioapi.h> +#endif +#ifdef HAVE_WINSOCK2_H +# include <winsock2.h> +#endif +#ifdef HAVE_WS2IPDEF_H +# include <ws2ipdef.h> +#endif +#ifdef HAVE_WS2TCPIP_H +# include <ws2tcpip.h> +#endif +#ifdef HAVE_WINDOWS_H +# include <windows.h> +#endif +" -for flag in -shared-intel; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else $as_nop - - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { - +(void) strchr; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : - eval "$as_CACHEVAR=yes" + else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <float.h> +#include <limits.h> +#include <stdarg.h> +#include <stddef.h> +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" then : - if test ${AM_CFLAGS+y} + if test x"$ac_arg" = x then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 - (: AM_CFLAGS already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac + ac_cv_c_undeclared_builtin_options='none needed' else $as_nop - AM_CFLAGS="$flag" + ac_cv_c_undeclared_builtin_options=$ac_arg fi - -else $as_nop - : + break fi - -done - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS -if test "$ac_cv_native_windows" = "yes" ; then - - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -printf %s "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= fi -if test -z "$CPP"; then - if test ${ac_cv_prog_CPP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - # Double quotes because $CC needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_fn_check_decl "$LINENO" "HAVE_ARPA_NAMESER_H" "ac_cv_have_decl_HAVE_ARPA_NAMESER_H" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_HAVE_ARPA_NAMESER_H" = xyes then : -else $as_nop - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext +cat >>confdefs.h <<_EOF +#define CARES_HAVE_ARPA_NAMESER_H 1 +_EOF - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - # Broken: success on invalid input. -continue -else $as_nop - # Passes both tests. -ac_preproc_ok=: -break fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok +ac_fn_check_decl "$LINENO" "HAVE_ARPA_NAMESER_COMPAT_H" "ac_cv_have_decl_HAVE_ARPA_NAMESER_COMPAT_H" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_HAVE_ARPA_NAMESER_COMPAT_H" = xyes then : - break -fi - done - ac_cv_prog_CPP=$CPP +cat >>confdefs.h <<_EOF +#define CARES_HAVE_ARPA_NAMESER_COMPAT_H 1 +_EOF fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -printf "%s\n" "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO" +ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes then : -else $as_nop - # Broken: fails on valid input. -continue +printf "%s\n" "#define HAVE_LONGLONG 1" >>confdefs.h + fi -rm -f conftest.err conftest.i conftest.$ac_ext - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO" +ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" +if test "x$ac_cv_type_ssize_t" = xyes then : - # Broken: success on invalid input. -continue + CARES_TYPEOF_ARES_SSIZE_T=ssize_t else $as_nop - # Passes both tests. -ac_preproc_ok=: -break + CARES_TYPEOF_ARES_SSIZE_T=int fi -rm -f conftest.err conftest.i conftest.$ac_ext -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok -then : -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi +printf "%s\n" "#define CARES_TYPEOF_ARES_SSIZE_T ${CARES_TYPEOF_ARES_SSIZE_T}" >>confdefs.h -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$cares_all_includes -ac_fn_c_check_header_preproc "$LINENO" "windows.h" "ac_cv_header_windows_h" -if test "x$ac_cv_header_windows_h" = xyes +" +if test "x$ac_cv_type_socklen_t" = xyes then : - printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" -if test "x$ac_cv_header_winsock2_h" = xyes -then : - printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" -if test "x$ac_cv_header_ws2tcpip_h" = xyes -then : - printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_SOCKLEN_T /**/" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" -if test "x$ac_cv_header_iphlpapi_h" = xyes -then : - printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" -if test "x$ac_cv_header_netioapi_h" = xyes -then : - printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h +cat >>confdefs.h <<_EOF +#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t +_EOF -fi -ac_fn_c_check_header_preproc "$LINENO" "ws2ipdef.h" "ac_cv_header_ws2ipdef_h" -if test "x$ac_cv_header_ws2ipdef_h" = xyes -then : - printf "%s\n" "#define HAVE_WS2IPDEF_H 1" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "winternl.h" "ac_cv_header_winternl_h" -if test "x$ac_cv_header_winternl_h" = xyes -then : - printf "%s\n" "#define HAVE_WINTERNL_H 1" >>confdefs.h +else $as_nop -fi -ac_fn_c_check_header_preproc "$LINENO" "ntdef.h" "ac_cv_header_ntdef_h" -if test "x$ac_cv_header_ntdef_h" = xyes -then : - printf "%s\n" "#define HAVE_NTDEF_H 1" >>confdefs.h +cat >>confdefs.h <<_EOF +#define CARES_TYPEOF_ARES_SOCKLEN_T int +_EOF fi -ac_fn_c_check_header_preproc "$LINENO" "ntstatus.h" "ac_cv_header_ntstatus_h" -if test "x$ac_cv_header_ntstatus_h" = xyes -then : - printf "%s\n" "#define HAVE_NTSTATUS_H 1" >>confdefs.h -fi -ac_fn_c_check_header_preproc "$LINENO" "mswsock.h" "ac_cv_header_mswsock_h" -if test "x$ac_cv_header_mswsock_h" = xyes + +ac_fn_c_check_type "$LINENO" "SOCKET" "ac_cv_type_SOCKET" "$cares_all_includes +" +if test "x$ac_cv_type_SOCKET" = xyes then : - printf "%s\n" "#define HAVE_MSWSOCK_H 1" >>confdefs.h fi - if test "$ac_cv_header_winsock2_h" = "yes"; then - LIBS="$LIBS -lws2_32 -liphlpapi" - fi -fi - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyport" >&5 -printf %s "checking for library containing getservbyport... " >&6; } -if test ${ac_cv_search_getservbyport+y} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +printf %s "checking for library containing clock_gettime... " >&6; } +if test ${ac_cv_search_clock_gettime+y} then : printf %s "(cached) " >&6 else $as_nop @@ -20814,16 +23333,16 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char getservbyport (); +char clock_gettime (); int main (void) { -return getservbyport (); +return clock_gettime (); ; return 0; } _ACEOF -for ac_lib in '' nsl socket resolv +for ac_lib in '' rt posix4 do if test -z "$ac_lib"; then ac_res="none required" @@ -20833,27 +23352,27 @@ do fi if ac_fn_c_try_link "$LINENO" then : - ac_cv_search_getservbyport=$ac_res + ac_cv_search_clock_gettime=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if test ${ac_cv_search_getservbyport+y} + if test ${ac_cv_search_clock_gettime+y} then : break fi done -if test ${ac_cv_search_getservbyport+y} +if test ${ac_cv_search_clock_gettime+y} then : else $as_nop - ac_cv_search_getservbyport=no + ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyport" >&5 -printf "%s\n" "$ac_cv_search_getservbyport" >&6; } -ac_res=$ac_cv_search_getservbyport +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } +ac_res=$ac_cv_search_clock_gettime if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" @@ -20861,3270 +23380,3017 @@ then : fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libxnet is required" >&5 -printf %s "checking if libxnet is required... " >&6; } -need_xnet=no -case $host_os in - hpux*) - XNET_LIBS="" - +ac_fn_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strnlen" = xyes +then : +printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h -for flag in -lxnet; do - as_CACHEVAR=`printf "%s\n" "ax_cv_check_ldflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5 -printf %s "checking whether the linker accepts $flag... " >&6; } -if eval test \${$as_CACHEVAR+y} +fi +ac_fn_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_memmem" = xyes then : - printf %s "(cached) " >&6 -else $as_nop - - ax_check_save_flags=$LDFLAGS - LDFLAGS="$LDFLAGS $flag" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main (void) -{ +printf "%s\n" "#define HAVE_MEMMEM 1" >>confdefs.h - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - eval "$as_CACHEVAR=yes" -else $as_nop - eval "$as_CACHEVAR=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$ax_check_save_flags fi -eval ac_res=\$$as_CACHEVAR - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } -if eval test \"x\$"$as_CACHEVAR"\" = x"yes" -then : - if test ${XNET_LIBS+y} +ac_fn_check_decl "$LINENO" "recv" "ac_cv_have_decl_recv" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_recv" = xyes then : - case " $XNET_LIBS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS already contains \$flag"; } >&5 - (: XNET_LIBS already contains $flag) 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS \$flag\""; } >&5 - (: XNET_LIBS="$XNET_LIBS $flag") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - XNET_LIBS="$XNET_LIBS $flag" - ;; - esac -else $as_nop - XNET_LIBS="$flag" -fi -else $as_nop - : -fi +printf "%s\n" "#define HAVE_RECV 1" >>confdefs.h -done +fi +ac_fn_check_decl "$LINENO" "recvfrom" "ac_cv_have_decl_recvfrom" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_recvfrom" = xyes +then : - if test "x$XNET_LIBS" != "x" ; then - LIBS="$LIBS $XNET_LIBS" - need_xnet=yes - fi - ;; -esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $need_xnet" >&5 -printf "%s\n" "$need_xnet" >&6; } +printf "%s\n" "#define HAVE_RECVFROM 1" >>confdefs.h -if test "x$host_vendor" = "xapple" +fi +ac_fn_check_decl "$LINENO" "send" "ac_cv_have_decl_send" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_send" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_servicename" >&5 -printf %s "checking for library containing res_servicename... " >&6; } -if test ${ac_cv_search_res_servicename+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_SEND 1" >>confdefs.h -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char res_servicename (); -int -main (void) -{ -return res_servicename (); - ; - return 0; -} -_ACEOF -for ac_lib in '' resolv -do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO" -then : - ac_cv_search_res_servicename=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext - if test ${ac_cv_search_res_servicename+y} +ac_fn_check_decl "$LINENO" "sendto" "ac_cv_have_decl_sendto" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_sendto" = xyes then : - break + +printf "%s\n" "#define HAVE_SENDTO 1" >>confdefs.h + fi -done -if test ${ac_cv_search_res_servicename+y} +ac_fn_check_decl "$LINENO" "getnameinfo" "ac_cv_have_decl_getnameinfo" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getnameinfo" = xyes then : -else $as_nop - ac_cv_search_res_servicename=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_servicename" >&5 -printf "%s\n" "$ac_cv_search_res_servicename" >&6; } -ac_res=$ac_cv_search_res_servicename -if test "$ac_res" != no +ac_fn_check_decl "$LINENO" "gethostname" "ac_cv_have_decl_gethostname" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_gethostname" = xyes then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h -printf "%s\n" "#define CARES_USE_LIBRESOLV 1" >>confdefs.h +fi +ac_fn_check_decl "$LINENO" "connect" "ac_cv_have_decl_connect" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_connect" = xyes +then : +printf "%s\n" "#define HAVE_CONNECT 1" >>confdefs.h -else $as_nop +fi +ac_fn_check_decl "$LINENO" "connectx" "ac_cv_have_decl_connectx" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_connectx" = xyes +then : - as_fn_error $? "Unable to find libresolv which is required for iPhone targets" "$LINENO" 5 +printf "%s\n" "#define HAVE_CONNECTX 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "closesocket" "ac_cv_have_decl_closesocket" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_closesocket" = xyes +then : +printf "%s\n" "#define HAVE_CLOSESOCKET 1" >>confdefs.h fi - -if test "x$host_vendor" = "xibm" -a "x$host_os" = "xopenedition" +ac_fn_check_decl "$LINENO" "CloseSocket" "ac_cv_have_decl_CloseSocket" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_CloseSocket" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 -printf %s "checking for library containing res_init... " >&6; } -if test ${ac_cv_search_res_init+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_CLOSESOCKET_CAMEL 1" >>confdefs.h -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char res_init (); -int -main (void) -{ -return res_init (); - ; - return 0; -} -_ACEOF -for ac_lib in '' resolv -do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO" -then : - ac_cv_search_res_init=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext - if test ${ac_cv_search_res_init+y} +ac_fn_check_decl "$LINENO" "fcntl" "ac_cv_have_decl_fcntl" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_fcntl" = xyes then : - break + +printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h + fi -done -if test ${ac_cv_search_res_init+y} +ac_fn_check_decl "$LINENO" "getenv" "ac_cv_have_decl_getenv" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getenv" = xyes then : -else $as_nop - ac_cv_search_res_init=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +printf "%s\n" "#define HAVE_GETENV 1" >>confdefs.h + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_init" >&5 -printf "%s\n" "$ac_cv_search_res_init" >&6; } -ac_res=$ac_cv_search_res_init -if test "$ac_res" != no +ac_fn_check_decl "$LINENO" "gethostname" "ac_cv_have_decl_gethostname" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_gethostname" = xyes then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h -printf "%s\n" "#define CARES_USE_LIBRESOLV 1" >>confdefs.h +fi +ac_fn_check_decl "$LINENO" "getrandom" "ac_cv_have_decl_getrandom" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getrandom" = xyes +then : +printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h -else $as_nop +fi +ac_fn_check_decl "$LINENO" "getservbyport_r" "ac_cv_have_decl_getservbyport_r" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getservbyport_r" = xyes +then : - as_fn_error $? "Unable to find libresolv which is required for z/OS" "$LINENO" 5 +printf "%s\n" "#define HAVE_GETSERVBYPORT_R 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "inet_net_pton" "ac_cv_have_decl_inet_net_pton" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_inet_net_pton" = xyes +then : +printf "%s\n" "#define HAVE_INET_NET_PTON 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_inet_ntop" = xyes +then : +printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h -if test "x$host_vendor" = "xapple" +fi +ac_fn_check_decl "$LINENO" "inet_pton" "ac_cv_have_decl_inet_pton" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_inet_pton" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iOS minimum version 10 or later" >&5 -printf %s "checking for iOS minimum version 10 or later... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_INET_PTON 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "ioctl" "ac_cv_have_decl_ioctl" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ioctl" = xyes +then : +printf "%s\n" "#define HAVE_IOCTL 1" >>confdefs.h -#include <stdio.h> -#include <AvailabilityMacros.h> -#include <TargetConditionals.h> +fi +ac_fn_check_decl "$LINENO" "ioctlsocket" "ac_cv_have_decl_ioctlsocket" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ioctlsocket" = xyes +then : -int -main (void) -{ +printf "%s\n" "#define HAVE_IOCTLSOCKET 1" >>confdefs.h -#if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 -#error Not iOS 10 or later -#endif -return 0; +fi +ac_fn_check_decl "$LINENO" "IoctlSocket" "ac_cv_have_decl_IoctlSocket" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_IoctlSocket" = xyes +then : - ; - return 0; -} +printf "%s\n" "#define HAVE_IOCTLSOCKET_CAMEL 1" >>confdefs.h -_ACEOF -if ac_fn_c_try_compile "$LINENO" +fi +ac_fn_check_decl "$LINENO" "setsockopt" "ac_cv_have_decl_setsockopt" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_setsockopt" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - ac_cv_ios_10="yes" +printf "%s\n" "#define HAVE_SETSOCKOPT 1" >>confdefs.h -else $as_nop +fi +ac_fn_check_decl "$LINENO" "socket" "ac_cv_have_decl_socket" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_socket" = xyes +then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_fn_check_decl "$LINENO" "strcasecmp" "ac_cv_have_decl_strcasecmp" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strcasecmp" = xyes +then : + +printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strdup" = xyes +then : -if test "x$host_vendor" = "xapple" +printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "stricmp" "ac_cv_have_decl_stricmp" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_stricmp" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for macOS minimum version 10.12 or later" >&5 -printf %s "checking for macOS minimum version 10.12 or later... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_STRICMP 1" >>confdefs.h +fi +ac_fn_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strncasecmp" = xyes +then : -#include <stdio.h> -#include <AvailabilityMacros.h> -#include <TargetConditionals.h> +printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h -int -main (void) -{ +fi +ac_fn_check_decl "$LINENO" "strncmpi" "ac_cv_have_decl_strncmpi" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strncmpi" = xyes +then : -#ifndef MAC_OS_X_VERSION_10_12 -# define MAC_OS_X_VERSION_10_12 101200 -#endif -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 -#error Not macOS 10.12 or later -#endif -return 0; +printf "%s\n" "#define HAVE_STRNCMPI 1" >>confdefs.h - ; - return 0; -} +fi +ac_fn_check_decl "$LINENO" "strnicmp" "ac_cv_have_decl_strnicmp" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strnicmp" = xyes +then : -_ACEOF -if ac_fn_c_try_compile "$LINENO" +printf "%s\n" "#define HAVE_STRNICMP 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "writev" "ac_cv_have_decl_writev" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_writev" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - ac_cv_macos_10_12="yes" +printf "%s\n" "#define HAVE_WRITEV 1" >>confdefs.h -else $as_nop +fi +ac_fn_check_decl "$LINENO" "arc4random_buf" "ac_cv_have_decl_arc4random_buf" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_arc4random_buf" = xyes +then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_fn_check_decl "$LINENO" "stat" "ac_cv_have_decl_stat" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_stat" = xyes +then : + +printf "%s\n" "#define HAVE_STAT 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "gettimeofday" "ac_cv_have_decl_gettimeofday" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_gettimeofday" = xyes +then : -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use libgcc" >&5 -printf %s "checking whether to use libgcc... " >&6; } -# Check whether --enable-libgcc was given. -if test ${enable_libgcc+y} +printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "clock_gettime" "ac_cv_have_decl_clock_gettime" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_clock_gettime" = xyes then : - enableval=$enable_libgcc; case "$enableval" in - yes) - LIBS="$LIBS -lgcc" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - ;; - *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - ;; - esac -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + +printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h fi +ac_fn_check_decl "$LINENO" "if_indextoname" "ac_cv_have_decl_if_indextoname" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_if_indextoname" = xyes +then : +printf "%s\n" "#define HAVE_IF_INDEXTONAME 1" >>confdefs.h -ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +fi +ac_fn_check_decl "$LINENO" "if_nametoindex" "ac_cv_have_decl_if_nametoindex" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_if_nametoindex" = xyes +then : -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define HAVE_IF_NAMETOINDEX 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "getifaddrs" "ac_cv_have_decl_getifaddrs" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getifaddrs" = xyes +then : +printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h -" -if test "x$ac_cv_header_malloc_h" = xyes +fi +ac_fn_check_decl "$LINENO" "poll" "ac_cv_have_decl_poll" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_poll" = xyes then : - printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "memory.h" "ac_cv_header_memory_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_check_decl "$LINENO" "pipe" "ac_cv_have_decl_pipe" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_pipe" = xyes +then : +printf "%s\n" "#define HAVE_PIPE 1" >>confdefs.h -" -if test "x$ac_cv_header_memory_h" = xyes +fi +ac_fn_check_decl "$LINENO" "pipe2" "ac_cv_have_decl_pipe2" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_pipe2" = xyes then : - printf "%s\n" "#define HAVE_MEMORY_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "AvailabilityMacros.h" "ac_cv_header_AvailabilityMacros_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_PIPE2 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_check_decl "$LINENO" "kqueue" "ac_cv_have_decl_kqueue" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_kqueue" = xyes +then : +printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h -" -if test "x$ac_cv_header_AvailabilityMacros_h" = xyes +fi +ac_fn_check_decl "$LINENO" "epoll_create1" "ac_cv_have_decl_epoll_create1" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_epoll_create1" = xyes then : - printf "%s\n" "#define HAVE_AVAILABILITYMACROS_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_EPOLL 1" >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +ac_fn_check_decl "$LINENO" "GetBestRoute2" "ac_cv_have_decl_GetBestRoute2" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_GetBestRoute2" = xyes +then : -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define HAVE_GETBESTROUTE2 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "ConvertInterfaceIndexToLuid" "ac_cv_have_decl_ConvertInterfaceIndexToLuid" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ConvertInterfaceIndexToLuid" = xyes +then : +printf "%s\n" "#define HAVE_CONVERTINTERFACEINDEXTOLUID 1" >>confdefs.h -" -if test "x$ac_cv_header_sys_types_h" = xyes +fi +ac_fn_check_decl "$LINENO" "ConvertInterfaceLuidToNameA" "ac_cv_have_decl_ConvertInterfaceLuidToNameA" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ConvertInterfaceLuidToNameA" = xyes then : - printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_CONVERTINTERFACELUIDTONAMEA 1" >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +ac_fn_check_decl "$LINENO" "NotifyIpInterfaceChange" "ac_cv_have_decl_NotifyIpInterfaceChange" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_NotifyIpInterfaceChange" = xyes +then : -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define HAVE_NOTIFYIPINTERFACECHANGE 1" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "RegisterWaitForSingleObject" "ac_cv_have_decl_RegisterWaitForSingleObject" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_RegisterWaitForSingleObject" = xyes +then : +printf "%s\n" "#define HAVE_REGISTERWAITFORSINGLEOBJECT 1" >>confdefs.h -" -if test "x$ac_cv_header_sys_time_h" = xyes +fi +ac_fn_check_decl "$LINENO" "__system_property_get" "ac_cv_have_decl___system_property_get" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl___system_property_get" = xyes then : - printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE___SYSTEM_PROPERTY_GET 1" >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -" -if test "x$ac_cv_header_sys_select_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h +if test "x$ac_cv_type_ssize_t" = "xyes" -a "x$ac_cv_type_socklen_t" = "xyes" -a "x$ac_cv_native_windows" != "xyes" ; then + recvfrom_type_retv="ssize_t" + recvfrom_type_arg3="size_t" +else + recvfrom_type_retv="int" + recvfrom_type_arg3="int" +fi +if test "x$ac_cv_type_SOCKET" = "xyes" ; then + recvfrom_type_arg1="SOCKET" +else + recvfrom_type_arg1="int" fi -ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +if test "x$ac_cv_type_socklen_t" = "xyes" ; then + recvfrom_type_arg6="socklen_t *" + getnameinfo_type_arg2="socklen_t" + getnameinfo_type_arg46="socklen_t" +else + recvfrom_type_arg6="int *" + getnameinfo_type_arg2="int" + getnameinfo_type_arg46="int" +fi +if test "x$ac_cv_native_windows" = "xyes" ; then + recv_type_arg2="char *" +else + recv_type_arg2="void *" +fi -" -if test "x$ac_cv_header_sys_socket_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h +recv_type_retv=${recvfrom_type_retv} +send_type_retv=${recvfrom_type_retv} +recv_type_arg1=${recvfrom_type_arg1} +recvfrom_type_arg2=${recv_type_arg2} +send_type_arg1=${recvfrom_type_arg1} +recv_type_arg3=${recvfrom_type_arg3} +send_type_arg3=${recvfrom_type_arg3} +gethostname_type_arg2=${recvfrom_type_arg3} -fi -ac_fn_c_check_header_compile "$LINENO" "sys/filio.h" "ac_cv_header_sys_filio_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +recvfrom_qual_arg5= +recvfrom_type_arg4=int +recvfrom_type_arg5="struct sockaddr *" +recv_type_arg4=int +getnameinfo_type_arg1="struct sockaddr *" +getnameinfo_type_arg7=int +send_type_arg2="const void *" +send_type_arg4=int -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define RECVFROM_TYPE_RETV ${recvfrom_type_retv} " >>confdefs.h -" -if test "x$ac_cv_header_sys_filio_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_FILIO_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define RECVFROM_TYPE_ARG1 ${recvfrom_type_arg1} " >>confdefs.h + + +printf "%s\n" "#define RECVFROM_TYPE_ARG2 ${recvfrom_type_arg2} " >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define RECVFROM_TYPE_ARG3 ${recvfrom_type_arg3} " >>confdefs.h -" -if test "x$ac_cv_header_sys_ioctl_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define RECVFROM_TYPE_ARG4 ${recvfrom_type_arg4} " >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define RECVFROM_TYPE_ARG5 ${recvfrom_type_arg5} " >>confdefs.h -" -if test "x$ac_cv_header_sys_param_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define RECVFROM_QUAL_ARG5 ${recvfrom_qual_arg5}" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -" -if test "x$ac_cv_header_sys_uio_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h +printf "%s\n" "#define RECV_TYPE_RETV ${recv_type_retv} " >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define RECV_TYPE_ARG1 ${recv_type_arg1} " >>confdefs.h -" -if test "x$ac_cv_header_sys_random_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h +printf "%s\n" "#define RECV_TYPE_ARG2 ${recv_type_arg2} " >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define RECV_TYPE_ARG3 ${recv_type_arg3} " >>confdefs.h -" -if test "x$ac_cv_header_sys_event_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_EVENT_H 1" >>confdefs.h +printf "%s\n" "#define RECV_TYPE_ARG4 ${recv_type_arg4} " >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define SEND_TYPE_RETV ${send_type_retv} " >>confdefs.h -" -if test "x$ac_cv_header_sys_epoll_h" = xyes -then : - printf "%s\n" "#define HAVE_SYS_EPOLL_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "assert.h" "ac_cv_header_assert_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define SEND_TYPE_ARG1 ${send_type_arg1} " >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define SEND_TYPE_ARG2 ${send_type_arg2} " >>confdefs.h -" -if test "x$ac_cv_header_assert_h" = xyes -then : - printf "%s\n" "#define HAVE_ASSERT_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "iphlpapi.h" "ac_cv_header_iphlpapi_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define SEND_TYPE_ARG3 ${send_type_arg3} " >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define SEND_TYPE_ARG4 ${send_type_arg4} " >>confdefs.h -" -if test "x$ac_cv_header_iphlpapi_h" = xyes -then : - printf "%s\n" "#define HAVE_IPHLPAPI_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define GETNAMEINFO_TYPE_ARG1 ${getnameinfo_type_arg1} " >>confdefs.h -" -if test "x$ac_cv_header_netioapi_h" = xyes -then : - printf "%s\n" "#define HAVE_NETIOAPI_H 1" >>confdefs.h +printf "%s\n" "#define GETNAMEINFO_TYPE_ARG2 ${getnameinfo_type_arg2} " >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define GETNAMEINFO_TYPE_ARG7 ${getnameinfo_type_arg7} " >>confdefs.h -" -if test "x$ac_cv_header_netdb_h" = xyes -then : - printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h +printf "%s\n" "#define GETNAMEINFO_TYPE_ARG46 ${getnameinfo_type_arg46} " >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define GETHOSTNAME_TYPE_ARG2 ${gethostname_type_arg2} " >>confdefs.h -" -if test "x$ac_cv_header_netinet_in_h" = xyes -then : - printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h + + +if test "$ac_cv_have_decl_getservbyport_r" = "yes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking number of arguments for getservbyport_r()" >&5 +printf %s "checking number of arguments for getservbyport_r()... " >&6; } + getservbyport_r_args=6 + case $host_os in + solaris*) + getservbyport_r_args=5 + ;; + aix*|openbsd*) + getservbyport_r_args=4 + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $getservbyport_r_args" >&5 +printf "%s\n" "$getservbyport_r_args" >&6; } + +printf "%s\n" "#define GETSERVBYPORT_R_ARGS $getservbyport_r_args " >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "netinet6/in6.h" "ac_cv_header_netinet6_in6_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +if test "$ac_cv_have_decl_getservbyname_r" = "yes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking number of arguments for getservbyname_r()" >&5 +printf %s "checking number of arguments for getservbyname_r()... " >&6; } + getservbyname_r_args=6 + case $host_os in + solaris*) + getservbyname_r_args=5 + ;; + aix*|openbsd*) + getservbyname_r_args=4 + ;; + esac +printf "%s\n" "#define GETSERVBYNAME_R_ARGS $getservbyname_r_args " >>confdefs.h -" -if test "x$ac_cv_header_netinet6_in6_h" = xyes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $getservbyname_r_args" >&5 +printf "%s\n" "$getservbyname_r_args" >&6; } +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes then : - printf "%s\n" "#define HAVE_NETINET6_IN6_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +else $as_nop -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define size_t unsigned int" >>confdefs.h +fi -" -if test "x$ac_cv_header_netinet_tcp_h" = xyes +ac_fn_check_decl "$LINENO" "AF_INET6" "ac_cv_have_decl_AF_INET6" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_AF_INET6" = xyes then : - printf "%s\n" "#define HAVE_NETINET_TCP_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_AF_INET6 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_check_decl "$LINENO" "PF_INET6" "ac_cv_have_decl_PF_INET6" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_PF_INET6" = xyes +then : +printf "%s\n" "#define HAVE_PF_INET6 1" >>confdefs.h +fi +ac_fn_c_check_type "$LINENO" "struct in6_addr" "ac_cv_type_struct_in6_addr" "$cares_all_includes " -if test "x$ac_cv_header_net_if_h" = xyes +if test "x$ac_cv_type_struct_in6_addr" = xyes then : - printf "%s\n" "#define HAVE_NET_IF_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "ifaddrs.h" "ac_cv_header_ifaddrs_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_IN6_ADDR 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "$cares_all_includes " -if test "x$ac_cv_header_ifaddrs_h" = xyes +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes then : - printf "%s\n" "#define HAVE_IFADDRS_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "$cares_all_includes " -if test "x$ac_cv_header_fcntl_h" = xyes +if test "x$ac_cv_type_struct_sockaddr_storage" = xyes then : - printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" "$cares_all_includes " -if test "x$ac_cv_header_errno_h" = xyes +if test "x$ac_cv_type_struct_addrinfo" = xyes then : - printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "socket.h" "ac_cv_header_socket_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_ADDRINFO 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_type "$LINENO" "struct timeval" "ac_cv_type_struct_timeval" "$cares_all_includes " -if test "x$ac_cv_header_socket_h" = xyes +if test "x$ac_cv_type_struct_timeval" = xyes then : - printf "%s\n" "#define HAVE_SOCKET_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_TIMEVAL 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_scope_id" "ac_cv_member_struct_sockaddr_in6_sin6_scope_id" "$cares_all_includes " -if test "x$ac_cv_header_strings_h" = xyes +if test "x$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" = xyes then : - printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_c_check_member "$LINENO" "struct addrinfo" "ai_flags" "ac_cv_member_struct_addrinfo_ai_flags" "$cares_all_includes " -if test "x$ac_cv_header_stdbool_h" = xyes +if test "x$ac_cv_member_struct_addrinfo_ai_flags" = xyes then : - printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "time.h" "ac_cv_header_time_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +printf "%s\n" "#define HAVE_STRUCT_ADDRINFO_AI_FLAGS 1" >>confdefs.h -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi -" -if test "x$ac_cv_header_time_h" = xyes +ac_fn_check_decl "$LINENO" "FIONBIO" "ac_cv_have_decl_FIONBIO" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_FIONBIO" = xyes then : - printf "%s\n" "#define HAVE_TIME_H 1" >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +ac_fn_check_decl "$LINENO" "O_NONBLOCK" "ac_cv_have_decl_O_NONBLOCK" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_O_NONBLOCK" = xyes +then : -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +fi +ac_fn_check_decl "$LINENO" "SO_NONBLOCK" "ac_cv_have_decl_SO_NONBLOCK" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SO_NONBLOCK" = xyes +then : +fi +ac_fn_check_decl "$LINENO" "MSG_NOSIGNAL" "ac_cv_have_decl_MSG_NOSIGNAL" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_MSG_NOSIGNAL" = xyes +then : -" -if test "x$ac_cv_header_poll_h" = xyes +fi +ac_fn_check_decl "$LINENO" "CLOCK_MONOTONIC" "ac_cv_have_decl_CLOCK_MONOTONIC" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_CLOCK_MONOTONIC" = xyes then : - printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +if test "$ac_cv_have_decl_CLOCK_MONOTONIC" = "yes" -a "$ac_cv_have_decl_clock_gettime" = "yes" ; then +printf "%s\n" "#define HAVE_CLOCK_GETTIME_MONOTONIC 1 " >>confdefs.h -" -if test "x$ac_cv_header_limits_h" = xyes -then : - printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h +fi + +if test "$ac_cv_have_decl_FIONBIO" = "yes" -a "$ac_cv_have_decl_ioctl" = "yes" ; then + +printf "%s\n" "#define HAVE_IOCTL_FIONBIO 1 " >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +if test "$ac_cv_have_decl_FIONBIO" = "yes" -a "$ac_cv_have_decl_ioctlsocket" = "yes" ; then -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define HAVE_IOCTLSOCKET_FIONBIO 1 " >>confdefs.h +fi +if test "$ac_cv_have_decl_SO_NONBLOCK" = "yes" -a "$ac_cv_have_decl_setsockopt" = "yes" ; then -" -if test "x$ac_cv_header_arpa_nameser_h" = xyes -then : - printf "%s\n" "#define HAVE_ARPA_NAMESER_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_SETSOCKOPT_SO_NONBLOCK 1 " >>confdefs.h fi -ac_fn_c_check_header_compile "$LINENO" "arpa/nameser_compat.h" "ac_cv_header_arpa_nameser_compat_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +if test "$ac_cv_have_decl_O_NONBLOCK" = "yes" -a "$ac_cv_have_decl_fcntl" = "yes" ; then -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +printf "%s\n" "#define HAVE_FCNTL_O_NONBLOCK 1 " >>confdefs.h +fi -" -if test "x$ac_cv_header_arpa_nameser_compat_h" = xyes -then : - printf "%s\n" "#define HAVE_ARPA_NAMESER_COMPAT_H 1" >>confdefs.h +if test "x$ac_cv_header_sys_types_h" = "xyes" ; then + +cat >>confdefs.h <<_EOF +#define CARES_HAVE_SYS_TYPES_H 1 +_EOF fi -ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" " -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include <arpa/nameser.h> -#endif +if test "x$ac_cv_header_sys_socket_h" = "xyes" ; then -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif +cat >>confdefs.h <<_EOF +#define CARES_HAVE_SYS_SOCKET_H 1 +_EOF +fi +if test "x$ac_cv_header_sys_select_h" = "xyes" ; then -" -if test "x$ac_cv_header_arpa_inet_h" = xyes -then : - printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h +cat >>confdefs.h <<_EOF +#define CARES_HAVE_SYS_SELECT_H 1 +_EOF fi +if test "x$ac_cv_header_ws2tcpip_h" = "xyes" ; then +cat >>confdefs.h <<_EOF +#define CARES_HAVE_WS2TCPIP_H 1 +_EOF +fi +if test "x$ac_cv_header_winsock2_h" = "xyes" ; then -cares_all_includes=" -#include <stdio.h> -#include <stdlib.h> -#ifdef HAVE_AVAILABILITYMACROS_H -# include <AvailabilityMacros.h> -#endif -#ifdef HAVE_SYS_UIO_H -# include <sys/uio.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_TCP_H -# include <tcp.h> -#endif -#ifdef HAVE_SYS_FILIO_H -# include <sys/filio.h> -#endif -#ifdef HAVE_SYS_IOCTL_H -# include <sys/ioctl.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif -#ifdef HAVE_STRING_H -# include <string.h> -#endif -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif -#ifdef HAVE_TIME_H -# include <time.h> -#endif -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -#endif -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#ifdef HAVE_SYS_RANDOM_H -# include <sys/random.h> -#endif -#ifdef HAVE_SYS_EVENT_H -# include <sys/event.h> -#endif -#ifdef HAVE_SYS_EPOLL_H -# include <sys/epoll.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -# include <sys/socket.h> -#endif -#ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -#endif -#ifdef HAVE_FCNTL_H -# include <fcntl.h> -#endif -#ifdef HAVE_POLL_H -# include <poll.h> -#endif -#ifdef HAVE_NET_IF_H -# include <net/if.h> -#endif -#ifdef HAVE_IFADDRS_H -# include <ifaddrs.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETINET_TCP_H -# include <netinet/tcp.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#ifdef HAVE_RESOLV_H -# include <resolv.h> -#endif -#ifdef HAVE_IPHLPAPI_H -# include <iphlpapi.h> -#endif -#ifdef HAVE_NETIOAPI_H -# include <netioapi.h> -#endif -#ifdef HAVE_WINSOCK2_H -# include <winsock2.h> -#endif -#ifdef HAVE_WS2IPDEF_H -# include <ws2ipdef.h> -#endif -#ifdef HAVE_WS2TCPIP_H -# include <ws2tcpip.h> -#endif -#ifdef HAVE_WINDOWS_H -# include <windows.h> -#endif -" +cat >>confdefs.h <<_EOF +#define CARES_HAVE_WINSOCK2_H 1 +_EOF -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 -printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } -if test ${ac_cv_c_undeclared_builtin_options+y} +fi +if test "x$ac_cv_header_windows_h" = "xyes" ; then + +cat >>confdefs.h <<_EOF +#define CARES_HAVE_WINDOWS_H 1 +_EOF + +fi +if test "x$ac_cv_header_arpa_nameser_h" = "xyes" ; then + +cat >>confdefs.h <<_EOF +#define CARES_HAVE_ARPA_NAMESER_H 1 +_EOF + +fi +if test "x$ac_cv_header_arpa_nameser_compa_h" = "xyes" ; then + +cat >>confdefs.h <<_EOF +#define CARES_HAVE_ARPA_NAMESER_COMPA_H 1 +_EOF + +fi + + + +if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x" then : - printf %s "(cached) " >&6 -else $as_nop - ac_save_CFLAGS=$CFLAGS - ac_cv_c_undeclared_builtin_options='cannot detect' - for ac_arg in '' -fno-builtin; do - CFLAGS="$ac_save_CFLAGS $ac_arg" - # This test program should *not* compile successfully. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x" +then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pthread_join (); int main (void) { -(void) strchr; +return pthread_join (); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*|midnightbsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) -else $as_nop - # This test program should compile successfully. - # No library function is consistently available on - # freestanding implementations, so test against a dummy - # declaration. Include always-available headers on the - # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include <float.h> -#include <limits.h> -#include <stdarg.h> -#include <stddef.h> -extern void ac_decl (int, char *); -int -main (void) -{ -(void) ac_decl (0, (char *) 0); - (void) ac_decl; +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif - ; - return 0; -} _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - if test x"$ac_arg" = x +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : - ac_cv_c_undeclared_builtin_options='none needed' -else $as_nop - ac_cv_c_undeclared_builtin_options=$ac_arg -fi - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - done - CFLAGS=$ac_save_CFLAGS +rm -rf conftest* -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 -printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } - case $ac_cv_c_undeclared_builtin_options in #( - 'cannot detect') : - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot make $CC report undeclared builtins -See \`config.log' for more details" "$LINENO" 5; } ;; #( - 'none needed') : - ac_c_undeclared_builtin_options='' ;; #( - *) : - ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; -esac + ;; -ac_fn_check_decl "$LINENO" "HAVE_ARPA_NAMESER_H" "ac_cv_have_decl_HAVE_ARPA_NAMESER_H" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_HAVE_ARPA_NAMESER_H" = xyes -then : + solaris*) -cat >>confdefs.h <<_EOF -#define CARES_HAVE_ARPA_NAMESER_H 1 -_EOF + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). -fi -ac_fn_check_decl "$LINENO" "HAVE_ARPA_NAMESER_COMPAT_H" "ac_cv_have_decl_HAVE_ARPA_NAMESER_COMPAT_H" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_HAVE_ARPA_NAMESER_COMPAT_H" = xyes -then : + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac -cat >>confdefs.h <<_EOF -#define CARES_HAVE_ARPA_NAMESER_COMPAT_H 1 -_EOF +# Are we compiling with Clang? -fi -ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* -printf "%s\n" "#define HAVE_LONGLONG 1" >>confdefs.h + fi fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" -ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" -if test "x$ac_cv_type_ssize_t" = xyes -then : - CARES_TYPEOF_ARES_SSIZE_T=ssize_t -else $as_nop - CARES_TYPEOF_ARES_SSIZE_T=int -fi +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) -printf "%s\n" "#define CARES_TYPEOF_ARES_SSIZE_T ${CARES_TYPEOF_ARES_SSIZE_T}" >>confdefs.h +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC +if test "x$GCC" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi -ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$cares_all_includes +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first -" -if test "x$ac_cv_type_socklen_t" = xyes +if test "x$ax_pthread_clang" = "xyes" then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi -printf "%s\n" "#define HAVE_SOCKLEN_T /**/" >>confdefs.h - +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled -cat >>confdefs.h <<_EOF -#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t -_EOF +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--" +then : + ax_pthread_check_cond=0 else $as_nop - -cat >>confdefs.h <<_EOF -#define CARES_TYPEOF_ARES_SOCKLEN_T int -_EOF - + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi -ac_fn_c_check_type "$LINENO" "SOCKET" "ac_cv_type_SOCKET" "$cares_all_includes -" -if test "x$ac_cv_type_SOCKET" = xyes -then : +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do -fi + case $ax_pthread_try_flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 -printf %s "checking for library containing clock_gettime... " >&6; } -if test ${ac_cv_search_clock_gettime+y} + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 else $as_nop - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char clock_gettime (); -int -main (void) -{ -return clock_gettime (); - ; - return 0; -} -_ACEOF -for ac_lib in '' rt posix4 + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 fi - if ac_fn_c_try_link "$LINENO" -then : - ac_cv_search_clock_gettime=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext - if test ${ac_cv_search_clock_gettime+y} -then : - break -fi done -if test ${ac_cv_search_clock_gettime+y} -then : + done +IFS=$as_save_IFS -else $as_nop - ac_cv_search_clock_gettime=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 -printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } -ac_res=$ac_cv_search_clock_gettime -if test "$ac_res" != no -then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - fi - - - -ac_fn_check_decl "$LINENO" "recv" "ac_cv_have_decl_recv" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_recv" = xyes -then : - -printf "%s\n" "#define HAVE_RECV 1" >>confdefs.h - +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -ac_fn_check_decl "$LINENO" "recvfrom" "ac_cv_have_decl_recvfrom" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_recvfrom" = xyes -then : -printf "%s\n" "#define HAVE_RECVFROM 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "send" "ac_cv_have_decl_send" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_send" = xyes + if test "x$ax_pthread_config" = "xno" then : - -printf "%s\n" "#define HAVE_SEND 1" >>confdefs.h - + continue fi -ac_fn_check_decl "$LINENO" "getnameinfo" "ac_cv_have_decl_getnameinfo" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_getnameinfo" = xyes -then : + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; -printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac -fi -ac_fn_check_decl "$LINENO" "gethostname" "ac_cv_have_decl_gethostname" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_gethostname" = xyes -then : + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" -printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. -fi -ac_fn_check_decl "$LINENO" "connect" "ac_cv_have_decl_connect" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_connect" = xyes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <pthread.h> +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext -printf "%s\n" "#define HAVE_CONNECT 1" >>confdefs.h + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" -fi -ac_fn_check_decl "$LINENO" "closesocket" "ac_cv_have_decl_closesocket" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_closesocket" = xyes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" then : + break +fi -printf "%s\n" "#define HAVE_CLOSESOCKET 1" >>confdefs.h - + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done fi -ac_fn_check_decl "$LINENO" "CloseSocket" "ac_cv_have_decl_CloseSocket" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_CloseSocket" = xyes -then : -printf "%s\n" "#define HAVE_CLOSESOCKET_CAMEL 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "fcntl" "ac_cv_have_decl_fcntl" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_fcntl" = xyes -then : +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way -printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h +if test "x$ax_pthread_clang" = "xyes"; then -fi -ac_fn_check_decl "$LINENO" "getenv" "ac_cv_have_decl_getenv" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_getenv" = xyes -then : + # Clang takes -pthread; it has never supported any other flag -printf "%s\n" "#define HAVE_GETENV 1" >>confdefs.h + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) -fi -ac_fn_check_decl "$LINENO" "gethostname" "ac_cv_have_decl_gethostname" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_gethostname" = xyes -then : + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) -printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown" +then : + break fi -ac_fn_check_decl "$LINENO" "getrandom" "ac_cv_have_decl_getrandom" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_getrandom" = xyes + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" then : - -printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -ac_fn_check_decl "$LINENO" "getservbyport_r" "ac_cv_have_decl_getservbyport_r" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_getservbyport_r" = xyes +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x" then : - -printf "%s\n" "#define HAVE_GETSERVBYPORT_R 1" >>confdefs.h + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" fi -ac_fn_check_decl "$LINENO" "inet_net_pton" "ac_cv_have_decl_inet_net_pton" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_inet_net_pton" = xyes -then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } -printf "%s\n" "#define HAVE_INET_NET_PTON 1" >>confdefs.h + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac -fi -ac_fn_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_inet_ntop" = xyes -then : +fi # $ax_pthread_clang = yes -printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "inet_pton" "ac_cv_have_decl_inet_pton" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_inet_pton" = xyes -then : -printf "%s\n" "#define HAVE_INET_PTON 1" >>confdefs.h +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" -fi -ac_fn_check_decl "$LINENO" "ioctl" "ac_cv_have_decl_ioctl" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_ioctl" = xyes + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : - -printf "%s\n" "#define HAVE_IOCTL 1" >>confdefs.h + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <pthread.h> +int +main (void) +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done fi -ac_fn_check_decl "$LINENO" "ioctlsocket" "ac_cv_have_decl_ioctlsocket" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_ioctlsocket" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes" then : -printf "%s\n" "#define HAVE_IOCTLSOCKET 1" >>confdefs.h +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + + ax_pthread_joinable_attr_defined=yes fi -ac_fn_check_decl "$LINENO" "IoctlSocket" "ac_cv_have_decl_IoctlSocket" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_IoctlSocket" = xyes -then : -printf "%s\n" "#define HAVE_IOCTLSOCKET_CAMEL 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac fi -ac_fn_check_decl "$LINENO" "setsockopt" "ac_cv_have_decl_setsockopt" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_setsockopt" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes" then : - -printf "%s\n" "#define HAVE_SETSOCKOPT 1" >>confdefs.h - + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes fi -ac_fn_check_decl "$LINENO" "socket" "ac_cv_have_decl_socket" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_socket" = xyes + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <pthread.h> +int +main (void) +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" then : - -printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h - + ax_cv_PTHREAD_PRIO_INHERIT=yes +else $as_nop + ax_cv_PTHREAD_PRIO_INHERIT=no fi -ac_fn_check_decl "$LINENO" "strcasecmp" "ac_cv_have_decl_strcasecmp" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_strcasecmp" = xyes -then : - -printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -ac_fn_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_strdup" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes" then : -printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h - -fi -ac_fn_check_decl "$LINENO" "stricmp" "ac_cv_have_decl_stricmp" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_stricmp" = xyes -then : +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h -printf "%s\n" "#define HAVE_STRICMP 1" >>confdefs.h + ax_pthread_prio_inherit_defined=yes fi -ac_fn_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_strncasecmp" = xyes -then : -printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h - -fi -ac_fn_check_decl "$LINENO" "strncmpi" "ac_cv_have_decl_strncmpi" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_strncmpi" = xyes -then : + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" -printf "%s\n" "#define HAVE_STRNCMPI 1" >>confdefs.h + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : -fi -ac_fn_check_decl "$LINENO" "strnicmp" "ac_cv_have_decl_strnicmp" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_strnicmp" = xyes + if as_fn_executable_p ${CC}_r then : - -printf "%s\n" "#define HAVE_STRNICMP 1" >>confdefs.h - + PTHREAD_CC="${CC}_r" fi -ac_fn_check_decl "$LINENO" "writev" "ac_cv_have_decl_writev" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_writev" = xyes + if test "x${CXX}" != "x" then : - -printf "%s\n" "#define HAVE_WRITEV 1" >>confdefs.h - -fi -ac_fn_check_decl "$LINENO" "arc4random_buf" "ac_cv_have_decl_arc4random_buf" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_arc4random_buf" = xyes + if as_fn_executable_p ${CXX}_r then : - -printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h - + PTHREAD_CXX="${CXX}_r" fi -ac_fn_check_decl "$LINENO" "stat" "ac_cv_have_decl_stat" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_stat" = xyes -then : +fi + ;; #( + *) : -printf "%s\n" "#define HAVE_STAT 1" >>confdefs.h + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -ac_fn_check_decl "$LINENO" "gettimeofday" "ac_cv_have_decl_gettimeofday" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_gettimeofday" = xyes -then : +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "clock_gettime" "ac_cv_have_decl_clock_gettime" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_clock_gettime" = xyes -then : + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" -printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + if test "x${CXX}" != "x" +then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi -ac_fn_check_decl "$LINENO" "if_indextoname" "ac_cv_have_decl_if_indextoname" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_if_indextoname" = xyes -then : +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +printf "%s\n" "$PTHREAD_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -printf "%s\n" "#define HAVE_IF_INDEXTONAME 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "if_nametoindex" "ac_cv_have_decl_if_nametoindex" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_if_nametoindex" = xyes -then : + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" -printf "%s\n" "#define HAVE_IF_NAMETOINDEX 1" >>confdefs.h +fi + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi fi -ac_fn_check_decl "$LINENO" "getifaddrs" "ac_cv_have_decl_getifaddrs" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_getifaddrs" = xyes -then : -printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" -fi -ac_fn_check_decl "$LINENO" "poll" "ac_cv_have_decl_poll" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_poll" = xyes -then : -printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "pipe" "ac_cv_have_decl_pipe" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_pipe" = xyes -then : -printf "%s\n" "#define HAVE_PIPE 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "pipe2" "ac_cv_have_decl_pipe2" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_pipe2" = xyes -then : -printf "%s\n" "#define HAVE_PIPE2 1" >>confdefs.h +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then -fi -ac_fn_check_decl "$LINENO" "kqueue" "ac_cv_have_decl_kqueue" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_kqueue" = xyes -then : + : +else + ax_pthread_ok=no -printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: threads requested but not supported" >&5 +printf "%s\n" "$as_me: WARNING: threads requested but not supported" >&2;} + CARES_THREADS=no fi -ac_fn_check_decl "$LINENO" "epoll_create1" "ac_cv_have_decl_epoll_create1" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_epoll_create1" = xyes -then : +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -printf "%s\n" "#define HAVE_EPOLL 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "ConvertInterfaceIndexToLuid" "ac_cv_have_decl_ConvertInterfaceIndexToLuid" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_ConvertInterfaceIndexToLuid" = xyes -then : -printf "%s\n" "#define HAVE_CONVERTINTERFACEINDEXTOLUID 1" >>confdefs.h + if test "${CARES_THREADS}" = "yes" ; then + ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h fi -ac_fn_check_decl "$LINENO" "ConvertInterfaceLuidToNameA" "ac_cv_have_decl_ConvertInterfaceLuidToNameA" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_ConvertInterfaceLuidToNameA" = xyes +ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_np_h" = xyes then : + printf "%s\n" "#define HAVE_PTHREAD_NP_H 1" >>confdefs.h -printf "%s\n" "#define HAVE_CONVERTINTERFACELUIDTONAMEA 1" >>confdefs.h +fi + LIBS="$PTHREAD_LIBS $LIBS" + AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS" + CC="$PTHREAD_CC" + CXX="$PTHREAD_CXX" + fi fi -ac_fn_check_decl "$LINENO" "__system_property_get" "ac_cv_have_decl___system_property_get" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl___system_property_get" = xyes -then : -printf "%s\n" "#define HAVE___SYSTEM_PROPERTY_GET 1" >>confdefs.h +if test "${CARES_THREADS}" = "yes" ; then + +printf "%s\n" "#define CARES_THREADS 1 " >>confdefs.h fi +CARES_PRIVATE_LIBS="$LIBS" -if test "x$ac_cv_type_ssize_t" = "xyes" -a "x$ac_cv_type_socklen_t" = "xyes" -a "x$ac_cv_native_windows" != "xyes" ; then - recvfrom_type_retv="ssize_t" - recvfrom_type_arg3="size_t" -else - recvfrom_type_retv="int" - recvfrom_type_arg3="int" -fi +BUILD_SUBDIRS="include src docs" -if test "x$ac_cv_type_SOCKET" = "xyes" ; then - recvfrom_type_arg1="SOCKET" -else - recvfrom_type_arg1="int" -fi -if test "x$ac_cv_type_socklen_t" = "xyes" ; then - recvfrom_type_arg6="socklen_t *" - getnameinfo_type_arg2="socklen_t" - getnameinfo_type_arg46="socklen_t" -else - recvfrom_type_arg6="int *" - getnameinfo_type_arg2="int" - getnameinfo_type_arg46="int" + +if test "x$build_tests" != "xno" -a "x$cross_compiling" = "xyes" ; then + if test "x$build_tests" = "xmaybe" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot build tests when cross compiling" >&5 +printf "%s\n" "$as_me: WARNING: cannot build tests when cross compiling" >&2;} + build_tests=no + else + as_fn_error $? "*** Tests not supported when cross compiling" "$LINENO" 5 + fi fi -if test "x$ac_cv_native_windows" = "xyes" ; then - recv_type_arg2="char *" -else - recv_type_arg2="void *" +# Check whether --enable-tests-crossbuild was given. +if test ${enable_tests_crossbuild+y} +then : + enableval=$enable_tests_crossbuild; build_tests="$enableval" + fi -recv_type_retv=${recvfrom_type_retv} -send_type_retv=${recvfrom_type_retv} -recv_type_arg1=${recvfrom_type_arg1} -recvfrom_type_arg2=${recv_type_arg2} -send_type_arg1=${recvfrom_type_arg1} -recv_type_arg3=${recvfrom_type_arg3} -send_type_arg3=${recvfrom_type_arg3} -gethostname_type_arg2=${recvfrom_type_arg3} -recvfrom_qual_arg5= -recvfrom_type_arg4=int -recvfrom_type_arg5="struct sockaddr *" -recv_type_arg4=int -getnameinfo_type_arg1="struct sockaddr *" -getnameinfo_type_arg7=int -send_type_arg2="void *" -send_type_arg4=int +if test "x$build_tests" != "xno" ; then -printf "%s\n" "#define RECVFROM_TYPE_RETV ${recvfrom_type_retv} " >>confdefs.h -printf "%s\n" "#define RECVFROM_TYPE_ARG1 ${recvfrom_type_arg1} " >>confdefs.h -printf "%s\n" "#define RECVFROM_TYPE_ARG2 ${recvfrom_type_arg2} " >>confdefs.h +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -printf "%s\n" "#define RECVFROM_TYPE_ARG3 ${recvfrom_type_arg3} " >>confdefs.h + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +printf "%s\n" "$PKG_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -printf "%s\n" "#define RECVFROM_TYPE_ARG4 ${recvfrom_type_arg4} " >>confdefs.h +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -printf "%s\n" "#define RECVFROM_TYPE_ARG5 ${recvfrom_type_arg5} " >>confdefs.h + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + PKG_CONFIG="" + fi +fi +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmock" >&5 +printf %s "checking for gmock... " >&6; } -printf "%s\n" "#define RECVFROM_QUAL_ARG5 ${recvfrom_qual_arg5}" >>confdefs.h +if test -n "$GMOCK_CFLAGS"; then + pkg_cv_GMOCK_CFLAGS="$GMOCK_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK_CFLAGS=`$PKG_CONFIG --cflags "gmock" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GMOCK_LIBS"; then + pkg_cv_GMOCK_LIBS="$GMOCK_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK_LIBS=`$PKG_CONFIG --libs "gmock" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi -printf "%s\n" "#define RECV_TYPE_RETV ${recv_type_retv} " >>confdefs.h +if test $pkg_failed = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GMOCK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmock" 2>&1` + else + GMOCK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmock" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GMOCK_PKG_ERRORS" >&5 + have_gmock=no +elif test $pkg_failed = untried; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + have_gmock=no +else + GMOCK_CFLAGS=$pkg_cv_GMOCK_CFLAGS + GMOCK_LIBS=$pkg_cv_GMOCK_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_gmock=yes +fi + if test "x$have_gmock" = "xno" ; then + if test "x$build_tests" = "xmaybe" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: gmock could not be found, not building tests" >&5 +printf "%s\n" "$as_me: WARNING: gmock could not be found, not building tests" >&2;} + build_tests=no + else + as_fn_error $? "tests require gmock" "$LINENO" 5 + fi + else -printf "%s\n" "#define RECV_TYPE_ARG1 ${recv_type_arg1} " >>confdefs.h +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmock >= 1.12.0" >&5 +printf %s "checking for gmock >= 1.12.0... " >&6; } +if test -n "$GMOCK112_CFLAGS"; then + pkg_cv_GMOCK112_CFLAGS="$GMOCK112_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock >= 1.12.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock >= 1.12.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK112_CFLAGS=`$PKG_CONFIG --cflags "gmock >= 1.12.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GMOCK112_LIBS"; then + pkg_cv_GMOCK112_LIBS="$GMOCK112_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock >= 1.12.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock >= 1.12.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK112_LIBS=`$PKG_CONFIG --libs "gmock >= 1.12.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi -printf "%s\n" "#define RECV_TYPE_ARG2 ${recv_type_arg2} " >>confdefs.h -printf "%s\n" "#define RECV_TYPE_ARG3 ${recv_type_arg3} " >>confdefs.h +if test $pkg_failed = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GMOCK112_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmock >= 1.12.0" 2>&1` + else + GMOCK112_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmock >= 1.12.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GMOCK112_PKG_ERRORS" >&5 -printf "%s\n" "#define RECV_TYPE_ARG4 ${recv_type_arg4} " >>confdefs.h + have_gmock_v112=no +elif test $pkg_failed = untried; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + have_gmock_v112=no +else + GMOCK112_CFLAGS=$pkg_cv_GMOCK112_CFLAGS + GMOCK112_LIBS=$pkg_cv_GMOCK112_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_gmock_v112=yes +fi + if test "x$have_gmock_v112" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether user namespaces are supported" >&5 +printf %s "checking whether user namespaces are supported... " >&6; } +if test ${ares_cv_user_namespace+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test "$cross_compiling" = yes +then : + ares_cv_user_namespace=no +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -printf "%s\n" "#define SEND_TYPE_RETV ${send_type_retv} " >>confdefs.h +#define _GNU_SOURCE +#include <fcntl.h> +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/wait.h> +int userfn(void *d) { + usleep(100000); /* synchronize by sleep */ + return (getuid() != 0); +} +char userst[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; -printf "%s\n" "#define SEND_TYPE_ARG1 ${send_type_arg1} " >>confdefs.h + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} -printf "%s\n" "#define SEND_TYPE_ARG2 ${send_type_arg2} " >>confdefs.h +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ares_cv_user_namespace=yes +else $as_nop + ares_cv_user_namespace=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -printf "%s\n" "#define SEND_QUAL_ARG2 " >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ares_cv_user_namespace" >&5 +printf "%s\n" "$ares_cv_user_namespace" >&6; } + if test "$ares_cv_user_namespace" = yes; then -printf "%s\n" "#define SEND_TYPE_ARG3 ${send_type_arg3} " >>confdefs.h +printf "%s\n" "#define HAVE_USER_NAMESPACE 1" >>confdefs.h + fi -printf "%s\n" "#define SEND_TYPE_ARG4 ${send_type_arg4} " >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UTS namespaces are supported" >&5 +printf %s "checking whether UTS namespaces are supported... " >&6; } +if test ${ares_cv_uts_namespace+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test "$cross_compiling" = yes +then : + ares_cv_uts_namespace=no +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -printf "%s\n" "#define GETNAMEINFO_TYPE_ARG1 ${getnameinfo_type_arg1} " >>confdefs.h +#define _GNU_SOURCE +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> +int utsfn(void *d) { + char buffer[1024]; + const char *name = "autoconftest"; + int rc = sethostname(name, strlen(name)); + if (rc != 0) return 1; + gethostname(buffer, 1024); + return (strcmp(buffer, name) != 0); +} -printf "%s\n" "#define GETNAMEINFO_TYPE_ARG2 ${getnameinfo_type_arg2} " >>confdefs.h +char st2[1024*1024]; +int fn(void *d) { + pid_t child; + int rc, status; + usleep(100000); /* synchronize by sleep */ + if (getuid() != 0) return 1; + child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); + if (child < 0) return 1; + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} +char st[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); -printf "%s\n" "#define GETNAMEINFO_TYPE_ARG7 ${getnameinfo_type_arg7} " >>confdefs.h + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} -printf "%s\n" "#define GETNAMEINFO_TYPE_ARG46 ${getnameinfo_type_arg46} " >>confdefs.h +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ares_cv_uts_namespace=yes +else $as_nop + ares_cv_uts_namespace=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -printf "%s\n" "#define GETHOSTNAME_TYPE_ARG2 ${gethostname_type_arg2} " >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ares_cv_uts_namespace" >&5 +printf "%s\n" "$ares_cv_uts_namespace" >&6; } + if test "$ares_cv_uts_namespace" = yes; then +printf "%s\n" "#define HAVE_UTS_NAMESPACE 1" >>confdefs.h + fi -if test "$ac_cv_have_decl_getservbyport_r" = "yes" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking number of arguments for getservbyport_r()" >&5 -printf %s "checking number of arguments for getservbyport_r()... " >&6; } - getservbyport_r_args=6 - case $host_os in - solaris*) - getservbyport_r_args=5 - ;; - aix*|openbsd*) - getservbyport_r_args=4 - ;; - esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $getservbyport_r_args" >&5 -printf "%s\n" "$getservbyport_r_args" >&6; } + fi -printf "%s\n" "#define GETSERVBYPORT_R_ARGS $getservbyport_r_args " >>confdefs.h +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmock >= 1.17.0" >&5 +printf %s "checking for gmock >= 1.17.0... " >&6; } +if test -n "$GMOCK117_CFLAGS"; then + pkg_cv_GMOCK117_CFLAGS="$GMOCK117_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock >= 1.17.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock >= 1.17.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK117_CFLAGS=`$PKG_CONFIG --cflags "gmock >= 1.17.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GMOCK117_LIBS"; then + pkg_cv_GMOCK117_LIBS="$GMOCK117_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock >= 1.17.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmock >= 1.17.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMOCK117_LIBS=`$PKG_CONFIG --libs "gmock >= 1.17.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes fi - -if test "$ac_cv_have_decl_getservbyname_r" = "yes" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking number of arguments for getservbyname_r()" >&5 -printf %s "checking number of arguments for getservbyname_r()... " >&6; } - getservbyname_r_args=6 - case $host_os in - solaris*) - getservbyname_r_args=5 - ;; - aix*|openbsd*) - getservbyname_r_args=4 - ;; - esac - -printf "%s\n" "#define GETSERVBYNAME_R_ARGS $getservbyname_r_args " >>confdefs.h - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $getservbyname_r_args" >&5 -printf "%s\n" "$getservbyname_r_args" >&6; } + else + pkg_failed=untried fi -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes -then : -else $as_nop -printf "%s\n" "#define size_t unsigned int" >>confdefs.h +if test $pkg_failed = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no fi + if test $_pkg_short_errors_supported = yes; then + GMOCK117_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmock >= 1.17.0" 2>&1` + else + GMOCK117_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmock >= 1.17.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GMOCK117_PKG_ERRORS" >&5 -ac_fn_check_decl "$LINENO" "AF_INET6" "ac_cv_have_decl_AF_INET6" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_AF_INET6" = xyes -then : + have_gmock_v117=no +elif test $pkg_failed = untried; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + have_gmock_v117=no +else + GMOCK117_CFLAGS=$pkg_cv_GMOCK117_CFLAGS + GMOCK117_LIBS=$pkg_cv_GMOCK117_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_gmock_v117=yes +fi + if test "x$have_gmock_v117" = "xyes" ; then + ax_cxx_compile_alternatives="17 1z" ax_cxx_compile_cxx17_required=true + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ac_success=no -printf "%s\n" "#define HAVE_AF_INET6 1" >>confdefs.h -fi -ac_fn_check_decl "$LINENO" "PF_INET6" "ac_cv_have_decl_PF_INET6" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_PF_INET6" = xyes -then : -printf "%s\n" "#define HAVE_PF_INET6 1" >>confdefs.h -fi -ac_fn_c_check_type "$LINENO" "struct in6_addr" "ac_cv_type_struct_in6_addr" "$cares_all_includes -" -if test "x$ac_cv_type_struct_in6_addr" = xyes + + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do + if test x"$switch" = xMSVC; then + switch=-std:c++${alternative} + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_${switch}_MSVC" | $as_tr_sh` + else + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -printf "%s\n" "#define HAVE_STRUCT_IN6_ADDR 1" >>confdefs.h +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. -fi +#ifndef __cplusplus -ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "$cares_all_includes -" -if test "x$ac_cv_type_struct_sockaddr_in6" = xyes -then : +#error "This is not a C++ compiler" -printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6 1" >>confdefs.h +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. +#elif __cplusplus < 201103L && !defined _MSC_VER +#error "This is not a C++11 compiler" -fi +#else -ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "$cares_all_includes -" -if test "x$ac_cv_type_struct_sockaddr_storage" = xyes -then : +namespace cxx11 +{ -printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h + namespace test_static_assert + { + template <typename T> + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; -fi + } -ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" "$cares_all_includes -" -if test "x$ac_cv_type_struct_addrinfo" = xyes -then : + namespace test_final_override + { -printf "%s\n" "#define HAVE_STRUCT_ADDRINFO 1" >>confdefs.h + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; -fi + } -ac_fn_c_check_type "$LINENO" "struct timeval" "ac_cv_type_struct_timeval" "$cares_all_includes -" -if test "x$ac_cv_type_struct_timeval" = xyes -then : + namespace test_double_right_angle_brackets + { -printf "%s\n" "#define HAVE_STRUCT_TIMEVAL 1" >>confdefs.h + template < typename T > + struct check {}; + typedef check<void> single_type; + typedef check<check<void>> double_type; + typedef check<check<check<void>>> triple_type; + typedef check<check<check<check<void>>>> quadruple_type; -fi + } -ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_scope_id" "ac_cv_member_struct_sockaddr_in6_sin6_scope_id" "$cares_all_includes -" -if test "x$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" = xyes -then : + namespace test_decltype + { -printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1" >>confdefs.h + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + } -fi + namespace test_type_deduction + { -ac_fn_c_check_member "$LINENO" "struct addrinfo" "ai_flags" "ac_cv_member_struct_addrinfo_ai_flags" "$cares_all_includes -" -if test "x$ac_cv_member_struct_addrinfo_ai_flags" = xyes -then : + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; -printf "%s\n" "#define HAVE_STRUCT_ADDRINFO_AI_FLAGS 1" >>confdefs.h + template < typename T > + struct is_same<T, T> + { + static const bool value = true; + }; + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } -fi + int + test(const int c, volatile int v) + { + static_assert(is_same<int, decltype(0)>::value == true, ""); + static_assert(is_same<int, decltype(c)>::value == false, ""); + static_assert(is_same<int, decltype(v)>::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same<int, decltype(ac)>::value == true, ""); + static_assert(is_same<int, decltype(av)>::value == true, ""); + static_assert(is_same<int, decltype(sumi)>::value == true, ""); + static_assert(is_same<int, decltype(sumf)>::value == false, ""); + static_assert(is_same<int, decltype(add(c, v))>::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } -ac_fn_check_decl "$LINENO" "FIONBIO" "ac_cv_have_decl_FIONBIO" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_FIONBIO" = xyes -then : + } -fi -ac_fn_check_decl "$LINENO" "O_NONBLOCK" "ac_cv_have_decl_O_NONBLOCK" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_O_NONBLOCK" = xyes -then : + namespace test_noexcept + { -fi -ac_fn_check_decl "$LINENO" "SO_NONBLOCK" "ac_cv_have_decl_SO_NONBLOCK" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_SO_NONBLOCK" = xyes -then : + int f() { return 0; } + int g() noexcept { return 0; } -fi -ac_fn_check_decl "$LINENO" "MSG_NOSIGNAL" "ac_cv_have_decl_MSG_NOSIGNAL" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_MSG_NOSIGNAL" = xyes -then : + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); -fi -ac_fn_check_decl "$LINENO" "CLOCK_MONOTONIC" "ac_cv_have_decl_CLOCK_MONOTONIC" "$cares_all_includes -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_CLOCK_MONOTONIC" = xyes -then : + } -fi + namespace test_constexpr + { -if test "$ac_cv_have_decl_CLOCK_MONOTONIC" = "yes" -a "$ac_cv_have_decl_clock_gettime" = "yes" ; then + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } -printf "%s\n" "#define HAVE_CLOCK_GETTIME_MONOTONIC 1 " >>confdefs.h + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } -fi + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); -if test "$ac_cv_have_decl_FIONBIO" = "yes" -a "$ac_cv_have_decl_ioctl" = "yes" ; then + } -printf "%s\n" "#define HAVE_IOCTL_FIONBIO 1 " >>confdefs.h + namespace test_rvalue_references + { -fi -if test "$ac_cv_have_decl_FIONBIO" = "yes" -a "$ac_cv_have_decl_ioctlsocket" = "yes" ; then + template < int N > + struct answer + { + static constexpr int value = N; + }; -printf "%s\n" "#define HAVE_IOCTLSOCKET_FIONBIO 1 " >>confdefs.h + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } -fi -if test "$ac_cv_have_decl_SO_NONBLOCK" = "yes" -a "$ac_cv_have_decl_setsockopt" = "yes" ; then + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } -printf "%s\n" "#define HAVE_SETSOCKOPT_SO_NONBLOCK 1 " >>confdefs.h + } -fi -if test "$ac_cv_have_decl_O_NONBLOCK" = "yes" -a "$ac_cv_have_decl_fcntl" = "yes" ; then + namespace test_uniform_initialization + { -printf "%s\n" "#define HAVE_FCNTL_O_NONBLOCK 1 " >>confdefs.h + struct test + { + static const int zero {}; + static const int one {1}; + }; -fi + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); -if test "x$ac_cv_header_sys_types_h" = "xyes" ; then + } -cat >>confdefs.h <<_EOF -#define CARES_HAVE_SYS_TYPES_H 1 -_EOF + namespace test_lambdas + { -fi -if test "x$ac_cv_header_sys_socket_h" = "xyes" ; then + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } -cat >>confdefs.h <<_EOF -#define CARES_HAVE_SYS_SOCKET_H 1 -_EOF + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } -fi -if test "x$ac_cv_header_ws2tcpip_h" = "xyes" ; then + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } -cat >>confdefs.h <<_EOF -#define CARES_HAVE_WS2TCPIP_H 1 -_EOF + } -fi -if test "x$ac_cv_header_winsock2_h" = "xyes" ; then + namespace test_variadic_templates + { -cat >>confdefs.h <<_EOF -#define CARES_HAVE_WINSOCK2_H 1 -_EOF + template <int...> + struct sum; -fi -if test "x$ac_cv_header_windows_h" = "xyes" ; then + template <int N0, int... N1toN> + struct sum<N0, N1toN...> + { + static constexpr auto value = N0 + sum<N1toN...>::value; + }; -cat >>confdefs.h <<_EOF -#define CARES_HAVE_WINDOWS_H 1 -_EOF + template <> + struct sum<> + { + static constexpr auto value = 0; + }; -fi -if test "x$ac_cv_header_arpa_nameser_h" = "xyes" ; then + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); -cat >>confdefs.h <<_EOF -#define CARES_HAVE_ARPA_NAMESER_H 1 -_EOF + } -fi -if test "x$ac_cv_header_arpa_nameser_compa_h" = "xyes" ; then + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { -cat >>confdefs.h <<_EOF -#define CARES_HAVE_ARPA_NAMESER_COMPA_H 1 -_EOF + struct foo {}; -fi + template<typename T> + using member = typename T::member_type; + template<typename T> + void func(...) {} + template<typename T> + void func(member<T>*) {} -if test "${CARES_THREADS}" = "yes" -a "x${ac_cv_native_windows}" != "xyes" ; then + void test(); + void test() { func<foo>(0); } + } +} // namespace cxx11 -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +#endif // __cplusplus >= 201103L -ax_pthread_ok=no -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on Tru64 or Sequent). -# It gets checked for in the link test anyway. -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then - ax_pthread_save_CC="$CC" - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - if test "x$PTHREAD_CC" != "x" -then : - CC="$PTHREAD_CC" -fi - if test "x$PTHREAD_CXX" != "x" -then : - CXX="$PTHREAD_CXX" -fi - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 -printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -char pthread_join (); -int -main (void) -{ -return pthread_join (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ax_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -printf "%s\n" "$ax_pthread_ok" >&6; } - if test "x$ax_pthread_ok" = "xno"; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - CC="$ax_pthread_save_CC" - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" -fi +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). +#ifndef __cplusplus -# Create a list of thread flags to try. Items with a "," contain both -# C compiler flags (before ",") and linker flags (after ","). Other items -# starting with a "-" are C compiler flags, and remaining items are -# library names, except for "none" which indicates that we try without -# any flags at all, and "pthread-config" which is a program returning -# the flags for the Pth emulation library. +#error "This is not a C++ compiler" -ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +#elif __cplusplus < 201402L && !defined _MSC_VER -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: +#error "This is not a C++14 compiler" -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 -# (Note: HP C rejects this with "bad form for `-t' option") -# -pthreads: Solaris/gcc (Note: HP C also rejects) -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads and -# -D_REENTRANT too), HP C (must be checked before -lpthread, which -# is present but should not be used directly; and before -mthreads, -# because the compiler interprets this as "-mt" + "-hreads") -# -mthreads: Mingw32/gcc, Lynx/gcc -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) +#else -case $host_os in +namespace cxx14 +{ - freebsd*) + namespace test_polymorphic_lambdas + { - # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) - # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } - ax_pthread_flags="-kthread lthread $ax_pthread_flags" - ;; + } - hpux*) + namespace test_binary_literals + { - # From the cc(1) man page: "[-mt] Sets various -D flags to enable - # multi-threading and also sets -lpthread." + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); - ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" - ;; + } - openedition*) + namespace test_generalized_constexpr + { - # IBM z/OS requires a feature-test macro to be defined in order to - # enable POSIX threads at all, so give the user a hint if this is - # not set. (We don't define these ourselves, as they can affect - # other portions of the system API in unpredictable ways.) + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); -# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) - AX_PTHREAD_ZOS_MISSING -# endif + } -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 -printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} -fi -rm -rf conftest* + namespace test_lambda_init_capture + { - ;; + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } - solaris*) + } - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (N.B.: The stubs are missing - # pthread_cleanup_push, or rather a function called by this macro, - # so we could check for that, but who knows whether they'll stub - # that too in a future libc.) So we'll check first for the - # standard Solaris way of linking pthreads (-mt -lpthread). + namespace test_digit_separators + { - ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" - ;; -esac + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); -# Are we compiling with Clang? + } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 -printf %s "checking whether $CC is Clang... " >&6; } -if test ${ax_cv_PTHREAD_CLANG+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG=no - # Note that Autoconf sets GCC=yes for Clang as well as GCC - if test "x$GCC" = "xyes"; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ -# if defined(__clang__) && defined(__llvm__) - AX_PTHREAD_CC_IS_CLANG -# endif + namespace test_return_type_deduction + { -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 -then : - ax_cv_PTHREAD_CLANG=yes -fi -rm -rf conftest* + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } - fi + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 -printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } -ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + template < typename T > + struct is_same<T, T> + { + static constexpr auto value = true; + }; + int + test() + { + auto x = 0; + static_assert(is_same<int, decltype(f(x))>::value, ""); + static_assert(is_same<int&, decltype(g(x))>::value, ""); + return x; + } -# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + } -# Note that for GCC and Clang -pthread generally implies -lpthread, -# except when -nostdlib is passed. -# This is problematic using libtool to build C++ shared libraries with pthread: -# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 -# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 -# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 -# To solve this, first try -pthread together with -lpthread for GCC +} // namespace cxx14 -if test "x$GCC" = "xyes" -then : - ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" -fi +#endif // __cplusplus >= 201402L -# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first -if test "x$ax_pthread_clang" = "xyes" -then : - ax_pthread_flags="-pthread,-lpthread -pthread" -fi -# The presence of a feature test macro requesting re-entrant function -# definitions is, on some systems, a strong hint that pthreads support is -# correctly enabled +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. -case $host_os in - darwin* | hpux* | linux* | osf* | solaris*) - ax_pthread_check_macro="_REENTRANT" - ;; +#ifndef __cplusplus - aix*) - ax_pthread_check_macro="_THREAD_SAFE" - ;; +#error "This is not a C++ compiler" - *) - ax_pthread_check_macro="--" - ;; -esac -if test "x$ax_pthread_check_macro" = "x--" -then : - ax_pthread_check_cond=0 -else $as_nop - ax_pthread_check_cond="!defined($ax_pthread_check_macro)" -fi +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L +#error "This is not a C++17 compiler" -if test "x$ax_pthread_ok" = "xno"; then -for ax_pthread_try_flag in $ax_pthread_flags; do +#else - case $ax_pthread_try_flag in - none) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -printf %s "checking whether pthreads work without any flags... " >&6; } - ;; +#include <initializer_list> +#include <utility> +#include <type_traits> - *,*) - PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` - PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 -printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } - ;; +namespace cxx17 +{ - -*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 -printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } - PTHREAD_CFLAGS="$ax_pthread_try_flag" - ;; + namespace test_constexpr_lambdas + { - pthread-config) - # Extract the first word of "pthread-config", so it can be a program name with args. -set dummy pthread-config; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ax_pthread_config+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ax_pthread_config"; then - ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ax_pthread_config="yes" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + constexpr int foo = [](){return 42;}(); - test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" -fi -fi -ax_pthread_config=$ac_cv_prog_ax_pthread_config -if test -n "$ax_pthread_config"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 -printf "%s\n" "$ax_pthread_config" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + template<typename... Args> + int multiply(Args... args) + { + return (args * ... * 1); + } - if test "x$ax_pthread_config" = "xno" -then : - continue -fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + template<typename... Args> + bool all(Args... args) + { + return (args && ...); + } - *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 -printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } - PTHREAD_LIBS="-l$ax_pthread_try_flag" - ;; - esac + } - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" + namespace test_extended_static_assert + { - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. + static_assert (true); - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <pthread.h> -# if $ax_pthread_check_cond -# error "$ax_pthread_check_macro must be defined" -# endif - static void *some_global = NULL; - static void routine(void *a) - { - /* To avoid any unused-parameter or - unused-but-set-parameter warning. */ - some_global = a; - } - static void *start_routine(void *a) { return a; } -int -main (void) -{ -pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ax_pthread_ok=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + } - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" + namespace test_auto_brace_init_list + { - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -printf "%s\n" "$ax_pthread_ok" >&6; } - if test "x$ax_pthread_ok" = "xyes" -then : - break -fi + auto foo = {5}; + auto bar {5}; - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi + static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value); + static_assert(std::is_same<int, decltype(bar)>::value); + } + namespace test_typename_in_template_template_parameter + { -# Clang needs special handling, because older versions handle the -pthread -# option in a rather... idiosyncratic way + template<template<typename> typename X> struct D; -if test "x$ax_pthread_clang" = "xyes"; then + } - # Clang takes -pthread; it has never supported any other flag + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { - # (Note 1: This will need to be revisited if a system that Clang - # supports has POSIX threads in a separate library. This tends not - # to be the way of modern systems, but it's conceivable.) + int f1() + { + return 42; + } - # (Note 2: On some systems, notably Darwin, -pthread is not needed - # to get POSIX threads support; the API is always present and - # active. We could reasonably leave PTHREAD_CFLAGS empty. But - # -pthread does define _REENTRANT, and while the Darwin headers - # ignore this macro, third-party headers might not.) + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } - # However, older versions of Clang make a point of warning the user - # that, in an invocation where only linking and no compilation is - # taking place, the -pthread option has no effect ("argument unused - # during compilation"). They expect -pthread to be passed in only - # when source code is being compiled. - # - # Problem is, this is at odds with the way Automake and most other - # C build frameworks function, which is that the same flags used in - # compilation (CFLAGS) are also used in linking. Many systems - # supported by AX_PTHREAD require exactly this for POSIX threads - # support, and in fact it is often not straightforward to specify a - # flag that is used only in the compilation phase and not in - # linking. Such a scenario is extremely rare in practice. - # - # Even though use of the -pthread flag in linking would only print - # a warning, this can be a nuisance for well-run software projects - # that build with -Werror. So if the active version of Clang has - # this misfeature, we search for an option to squash it. + } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 -printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } -if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown - # Create an alternate version of $ac_link that compiles and - # links in two steps (.c -> .o, .o -> exe) instead of one - # (.c -> exe), because the warning occurs only in the second - # step - ax_pthread_save_ac_link="$ac_link" - ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' - ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` - ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" - ax_pthread_save_CFLAGS="$CFLAGS" - for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - if test "x$ax_pthread_try" = "xunknown" -then : - break -fi - CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" - ac_link="$ax_pthread_save_ac_link" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(void){return 0;} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_link="$ax_pthread_2step_ac_link" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(void){return 0;} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + namespace test_extended_aggregate_initialization + { -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - done - ac_link="$ax_pthread_save_ac_link" - CFLAGS="$ax_pthread_save_CFLAGS" - if test "x$ax_pthread_try" = "x" -then : - ax_pthread_try=no -fi - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + struct base1 + { + int b1, b2 = 42; + }; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 -printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; - case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in - no | unknown) ;; - *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; - esac + struct derived : base1, base2 + { + int d; + }; -fi # $ax_pthread_clang = yes + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + } + namespace test_general_range_based_for_loop + { -# Various other checks: -if test "x$ax_pthread_ok" = "xyes"; then - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" + struct iter + { + int i; - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -printf %s "checking for joinable pthread attribute... " >&6; } -if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_JOINABLE_ATTR=unknown - for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <pthread.h> -int -main (void) -{ -int attr = $ax_pthread_attr; return attr /* ; */ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - done + int& operator* () + { + return i; + } -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 -printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } - if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ - test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes" -then : + const int& operator* () const + { + return i; + } -printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + iter& operator++() + { + ++i; + return *this; + } + }; - ax_pthread_joinable_attr_defined=yes + struct sentinel + { + int i; + }; -fi + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 -printf %s "checking whether more special flags are required for pthreads... " >&6; } -if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ax_cv_PTHREAD_SPECIAL_FLAGS=no - case $host_os in - solaris*) - ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" - ;; - esac + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 -printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } - if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes" -then : - PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" - ax_pthread_special_flags_added=yes -fi + sentinel end() const + { + return {5}; + } + }; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 -printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } -if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <pthread.h> -int -main (void) -{ -int i = PTHREAD_PRIO_INHERIT; - return i; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ax_cv_PTHREAD_PRIO_INHERIT=yes -else $as_nop - ax_cv_PTHREAD_PRIO_INHERIT=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + void f() + { + range r {}; -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 -printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } - if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes" -then : + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } -printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + } - ax_pthread_prio_inherit_defined=yes + namespace test_lambda_capture_asterisk_this_by_value + { -fi + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" + } - # More AIX lossage: compile with *_r variant - if test "x$GCC" != "xyes"; then - case $host_os in - aix*) - case "x/$CC" in #( - x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : - #handle absolute path differently from PATH based program lookup - case "x$CC" in #( - x/*) : + namespace test_enum_class_construction + { - if as_fn_executable_p ${CC}_r -then : - PTHREAD_CC="${CC}_r" -fi - if test "x${CXX}" != "x" -then : - if as_fn_executable_p ${CXX}_r -then : - PTHREAD_CXX="${CXX}_r" -fi -fi - ;; #( - *) : + enum class byte : unsigned char + {}; - for ac_prog in ${CC}_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_PTHREAD_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CC"; then - ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CC="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + byte foo {42}; -fi -fi -PTHREAD_CC=$ac_cv_prog_PTHREAD_CC -if test -n "$PTHREAD_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -printf "%s\n" "$PTHREAD_CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + } + namespace test_constexpr_if + { - test -n "$PTHREAD_CC" && break -done -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + template <bool cond> + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } - if test "x${CXX}" != "x" -then : - for ac_prog in ${CXX}_r -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_PTHREAD_CXX+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$PTHREAD_CXX"; then - ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_PTHREAD_CXX="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + } -fi -fi -PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX -if test -n "$PTHREAD_CXX"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 -printf "%s\n" "$PTHREAD_CXX" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi + namespace test_selection_statement_with_initializer + { + int f() + { + return 13; + } - test -n "$PTHREAD_CXX" && break -done -test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } -fi + switch (auto i = f(); i + 4) + { + case 17: + return 2; - ;; -esac - ;; #( - *) : - ;; -esac - ;; - esac - fi -fi + default: + return 1; + } + } -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" -test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + } + namespace test_template_argument_deduction_for_class_templates + { + template <typename T1, typename T2> + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + T1 m1; + T2 m2; + }; + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + } -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test "x$ax_pthread_ok" = "xyes"; then + namespace test_non_type_auto_template_parameters + { - : -else - ax_pthread_ok=no + template <auto n> + struct B + {}; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: threads requested but not supported" >&5 -printf "%s\n" "$as_me: WARNING: threads requested but not supported" >&2;} - CARES_THREADS=no + B<5> b1; + B<'a'> b2; -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu + } + + namespace test_structured_bindings + { + int arr[2] = { 1, 2 }; + std::pair<int, int> pr = { 1, 2 }; + auto f1() -> int(&)[2] + { + return arr; + } - if test "${CARES_THREADS}" = "yes" ; then - ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" -if test "x$ac_cv_header_pthread_h" = xyes -then : - printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + auto f2() -> std::pair<int, int>& + { + return pr; + } -fi -ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" -if test "x$ac_cv_header_pthread_np_h" = xyes -then : - printf "%s\n" "#define HAVE_PTHREAD_NP_H 1" >>confdefs.h + struct S + { + int x1 : 2; + volatile double y1; + }; -fi + S f3() + { + return {}; + } - LIBS="$PTHREAD_LIBS $LIBS" - AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS" - CC="$PTHREAD_CC" - CXX="$PTHREAD_CXX" - fi -fi + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); -if test "${CARES_THREADS}" = "yes" ; then + } -printf "%s\n" "#define CARES_THREADS 1 " >>confdefs.h + namespace test_exception_spec_type_system + { -fi + struct Good {}; + struct Bad {}; -CARES_PRIVATE_LIBS="$LIBS" + void g1() noexcept; + void g2(); + template<typename T> + Bad + f(T*, T*); -BUILD_SUBDIRS="include src docs" + template<typename T1, typename T2> + Good + f(T1*, T2*); + static_assert (std::is_same_v<Good, decltype(f(g1, g2))>); + } -if test "x$build_tests" != "xno" -a "x$HAVE_CXX14" = "0" ; then - if test "x$build_tests" = "xmaybe" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot build tests without a CXX14 compiler" >&5 -printf "%s\n" "$as_me: WARNING: cannot build tests without a CXX14 compiler" >&2;} - build_tests=no - else - as_fn_error $? "*** Building tests requires a CXX14 compiler" "$LINENO" 5 - fi -fi -if test "x$build_tests" != "xno" -a "x$cross_compiling" = "xyes" ; then - if test "x$build_tests" = "xmaybe" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot build tests when cross compiling" >&5 -printf "%s\n" "$as_me: WARNING: cannot build tests when cross compiling" >&2;} - build_tests=no - else - as_fn_error $? "*** Tests not supported when cross compiling" "$LINENO" 5 - fi -fi -if test "x$build_tests" != "xno" ; then + namespace test_inline_variables + { + template<class T> void f(T) + {} + template<class T> inline T g(T) + { + return T{}; + } + template<> inline void f<>(int) + {} + template<> int g<>(int) + { + return 5; + } + } +} // namespace cxx17 -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_path_PKG_CONFIG+y} -then : - printf %s "(cached) " >&6 -else $as_nop - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L - ;; -esac -fi -PKG_CONFIG=$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -printf "%s\n" "$PKG_CONFIG" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" then : - printf %s "(cached) " >&6 + eval $cachevar=yes else $as_nop - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac + eval $cachevar=no fi -ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" fi - - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - PKG_CONFIG=$ac_pt_PKG_CONFIG +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done fi -else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -fi - -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=0.9.0 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - PKG_CONFIG="" - fi -fi - -pkg_failed=no -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmock" >&5 -printf %s "checking for gmock... " >&6; } - -if test -n "$GMOCK_CFLAGS"; then - pkg_cv_GMOCK_CFLAGS="$GMOCK_CFLAGS" - elif test -n "$PKG_CONFIG"; then - if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock\""; } >&5 - ($PKG_CONFIG --exists --print-errors "gmock") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_GMOCK_CFLAGS=`$PKG_CONFIG --cflags "gmock" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes -else - pkg_failed=yes -fi - else - pkg_failed=untried -fi -if test -n "$GMOCK_LIBS"; then - pkg_cv_GMOCK_LIBS="$GMOCK_LIBS" - elif test -n "$PKG_CONFIG"; then - if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmock\""; } >&5 - ($PKG_CONFIG --exists --print-errors "gmock") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_GMOCK_LIBS=`$PKG_CONFIG --libs "gmock" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes -else - pkg_failed=yes -fi - else - pkg_failed=untried -fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test x$ax_cxx_compile_cxx17_required = xtrue; then + if test x$ac_success = xno; then + as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 + fi + fi + if test x$ac_success = xno; then + HAVE_CXX17=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 +printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} + else + HAVE_CXX17=1 +printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h -if test $pkg_failed = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + fi -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - GMOCK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmock" 2>&1` - else - GMOCK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmock" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$GMOCK_PKG_ERRORS" >&5 - have_gmock=no -elif test $pkg_failed = untried; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - have_gmock=no -else - GMOCK_CFLAGS=$pkg_cv_GMOCK_CFLAGS - GMOCK_LIBS=$pkg_cv_GMOCK_LIBS - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - have_gmock=yes -fi - if test "x$have_gmock" = "xno" ; then - if test "x$build_tests" = "xmaybe" ; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: gmock could not be found, not building tests" >&5 -printf "%s\n" "$as_me: WARNING: gmock could not be found, not building tests" >&2;} - build_tests=no else - as_fn_error $? "tests require gmock" "$LINENO" 5 - fi - fi -fi -if test "x$build_tests" != "xno" ; then - build_tests=yes - - ax_cxx_compile_alternatives="14 1y" ax_cxx_compile_cxx14_required=true + ax_cxx_compile_alternatives="14 1y" ax_cxx_compile_cxx14_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -24167,7 +26433,17 @@ else $as_nop // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -24617,6 +26893,12 @@ printf "%s\n" "#define HAVE_CXX14 1" >>confdefs.h fi + fi + fi +fi +if test "x$build_tests" != "xno" ; then + build_tests=yes + if test "$ac_cv_native_windows" != "yes" ; then @@ -24721,7 +27003,7 @@ ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread -- case $host_os in - freebsd*) + freebsd*|midnightbsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) @@ -25956,7 +28238,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.28.1, which was +This file was extended by c-ares $as_me 1.34.6, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26024,7 +28306,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.28.1 +c-ares config.status 1.34.6 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac index 4d263a7f309017..744a99be56ab2f 100644 --- a/deps/cares/configure.ac +++ b/deps/cares/configure.ac @@ -2,10 +2,10 @@ dnl Copyright (C) The c-ares project and its contributors dnl SPDX-License-Identifier: MIT AC_PREREQ([2.69]) -AC_INIT([c-ares], [1.28.1], +AC_INIT([c-ares], [1.34.6], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="15:1:13" +CARES_VERSION_INFO="21:5:19" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. @@ -40,7 +40,8 @@ AC_CONFIG_HEADERS([src/lib/ares_config.h include/ares_build.h]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS -AX_CXX_COMPILE_STDCXX_14([noext],[optional]) +AX_CXX_COMPILE_STDCXX(14,[noext],[optional]) +AX_CXX_COMPILE_STDCXX(17,[noext],[optional]) AM_INIT_AUTOMAKE([foreign subdir-objects 1.9.6]) LT_INIT([win32-dll,pic,disable-fast-install,aix-soname=svr4]) AC_LANG([C]) @@ -153,8 +154,6 @@ _EOF ]) AX_CODE_COVERAGE -AX_CHECK_USER_NAMESPACE -AX_CHECK_UTS_NAMESPACE AC_SYS_LARGEFILE case $host_os in @@ -245,44 +244,27 @@ AC_SUBST(CARES_SYMBOL_HIDING_CFLAG) if test "$enable_warnings" = "yes"; then - AX_APPEND_COMPILE_FLAGS([-Wall \ - -Wextra \ - -Wcast-align \ - -Wconversion \ - -Wdeclaration-after-statement \ - -Wdouble-promotion \ - -Wfloat-equal \ - -Wformat-security \ - -Winit-self \ - -Wjump-misses-init \ - -Wlogical-op \ - -Wmissing-braces \ - -Wmissing-declarations \ - -Wmissing-format-attribute \ - -Wmissing-include-dirs \ - -Wmissing-prototypes \ - -Wnested-externs \ - -Wno-coverage-mismatch \ - -Wold-style-definition \ - -Wpacked \ - -Wpointer-arith \ - -Wredundant-decls \ - -Wshadow \ - -Wsign-conversion \ - -Wstrict-overflow \ - -Wstrict-prototypes \ - -Wtrampolines \ - -Wundef \ - -Wunused \ - -Wvariadic-macros \ - -Wvla \ - -Wwrite-strings \ - -Werror=implicit-int \ - -Werror=implicit-function-declaration \ - -Werror=partial-availability \ - ], [AM_CFLAGS], [-Werror]) + AX_APPEND_COMPILE_FLAGS([-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wconversion -Wdeclaration-after-statement -Wdouble-promotion -Wfloat-equal -Wformat-security -Winit-self -Wjump-misses-init -Wlogical-op -Wmissing-braces -Wmissing-declarations -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-prototypes -Wnested-externs -Wno-coverage-mismatch -Wold-style-definition -Wpacked -Wpedantic -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow -Wstrict-prototypes -Wtrampolines -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wvla -Wwrite-strings -Werror=implicit-int -Werror=implicit-function-declaration -Werror=partial-availability -Wno-long-long ], + [AM_CFLAGS], [-Werror]) fi +dnl Android and QNX require c99, all others should use c90 +case $host_os in + *qnx*|*android*) + AX_APPEND_COMPILE_FLAGS([-std=c99], [AM_CFLAGS], [-Werror]) + ;; + *) + AX_APPEND_COMPILE_FLAGS([-std=c90], [AM_CFLAGS], [-Werror]) + ;; +esac + +dnl QNX needs -D_QNX_SOURCE +case $host_os in + *qnx*) + AX_APPEND_COMPILE_FLAGS([-D_QNX_SOURCE], [AM_CPPFLAGS], [-Werror]) + ;; +esac + if test "$ax_cv_c_compiler_vendor" = "intel"; then AX_APPEND_COMPILE_FLAGS([-shared-intel], [AM_CFLAGS]) fi @@ -294,17 +276,7 @@ if test "$ac_cv_native_windows" = "yes" ; then dnl other headers, AC_CHECK_HEADERS only allows you to specify headers that dnl must be included *before* the header being checked. - AC_CHECK_HEADERS( - windows.h \ - winsock2.h \ - ws2tcpip.h \ - iphlpapi.h \ - netioapi.h \ - ws2ipdef.h \ - winternl.h \ - ntdef.h \ - ntstatus.h \ - mswsock.h, + AC_CHECK_HEADERS([windows.h winsock2.h ws2tcpip.h iphlpapi.h netioapi.h ws2ipdef.h winternl.h ntdef.h ntstatus.h mswsock.h ], [], [], [-]) dnl Windows builds require linking to iphlpapi @@ -334,15 +306,6 @@ case $host_os in esac AC_MSG_RESULT($need_xnet) -dnl resolv lib for Apple (MacOS and iOS) -AS_IF([test "x$host_vendor" = "xapple"], [ - AC_SEARCH_LIBS([res_servicename], [resolv], [ - AC_DEFINE([CARES_USE_LIBRESOLV], [1], [Use resolver library to configure cares]) - ], [ - AC_MSG_ERROR([Unable to find libresolv which is required for iPhone targets]) - ]) -]) - dnl resolv lib for z/OS AS_IF([test "x$host_vendor" = "xibm" -a "x$host_os" = "xopenedition" ], [ AC_SEARCH_LIBS([res_init], [resolv], [ @@ -415,42 +378,10 @@ AS_HELP_STRING([--enable-libgcc],[use libgcc when linking]), AC_MSG_RESULT(no) ) -dnl check for a few basic system headers we need -AC_CHECK_HEADERS( - malloc.h \ - memory.h \ - AvailabilityMacros.h \ - sys/types.h \ - sys/time.h \ - sys/select.h \ - sys/socket.h \ - sys/filio.h \ - sys/ioctl.h \ - sys/param.h \ - sys/uio.h \ - sys/random.h \ - sys/event.h \ - sys/epoll.h \ - assert.h \ - iphlpapi.h \ - netioapi.h \ - netdb.h \ - netinet/in.h \ - netinet6/in6.h \ - netinet/tcp.h \ - net/if.h \ - ifaddrs.h \ - fcntl.h \ - errno.h \ - socket.h \ - strings.h \ - stdbool.h \ - time.h \ - poll.h \ - limits.h \ - arpa/nameser.h \ - arpa/nameser_compat.h \ - arpa/inet.h, +dnl check for a few basic system headers we need. It would be nice if we could +dnl split these on separate lines, but for some reason autotools on Windows doesn't +dnl allow this, even tried ending lines with a backslash. +AC_CHECK_HEADERS([malloc.h memory.h AvailabilityMacros.h sys/types.h sys/time.h sys/select.h sys/socket.h sys/filio.h sys/ioctl.h sys/param.h sys/uio.h sys/random.h sys/event.h sys/epoll.h assert.h iphlpapi.h netioapi.h netdb.h netinet/in.h netinet6/in6.h netinet/tcp.h net/if.h ifaddrs.h fcntl.h errno.h socket.h strings.h stdbool.h time.h poll.h limits.h arpa/nameser.h arpa/nameser_compat.h arpa/inet.h sys/system_properties.h ], dnl to do if not found [], dnl to do if found @@ -565,6 +496,9 @@ cares_all_includes=" #ifdef HAVE_RESOLV_H # include <resolv.h> #endif +#ifdef HAVE_SYS_SYSTEM_PROPERTIES_H +# include <sys/system_properties.h> +#endif #ifdef HAVE_IPHLPAPI_H # include <iphlpapi.h> #endif @@ -617,12 +551,16 @@ dnl https://mailman.videolan.org/pipermail/vlc-devel/2015-March/101802.html dnl which would require we check each individually and provide function arguments dnl for the test. +AC_CHECK_DECL(strnlen, [AC_DEFINE([HAVE_STRNLEN], 1, [Define to 1 if you have `strnlen`] )], [], $cares_all_includes) +AC_CHECK_DECL(memmem, [AC_DEFINE([HAVE_MEMMEM], 1, [Define to 1 if you have `memmem`] )], [], $cares_all_includes) AC_CHECK_DECL(recv, [AC_DEFINE([HAVE_RECV], 1, [Define to 1 if you have `recv`] )], [], $cares_all_includes) AC_CHECK_DECL(recvfrom, [AC_DEFINE([HAVE_RECVFROM], 1, [Define to 1 if you have `recvfrom`] )], [], $cares_all_includes) AC_CHECK_DECL(send, [AC_DEFINE([HAVE_SEND], 1, [Define to 1 if you have `send`] )], [], $cares_all_includes) +AC_CHECK_DECL(sendto, [AC_DEFINE([HAVE_SENDTO], 1, [Define to 1 if you have `sendto`] )], [], $cares_all_includes) AC_CHECK_DECL(getnameinfo, [AC_DEFINE([HAVE_GETNAMEINFO], 1, [Define to 1 if you have `getnameinfo`] )], [], $cares_all_includes) AC_CHECK_DECL(gethostname, [AC_DEFINE([HAVE_GETHOSTNAME], 1, [Define to 1 if you have `gethostname`] )], [], $cares_all_includes) AC_CHECK_DECL(connect, [AC_DEFINE([HAVE_CONNECT], 1, [Define to 1 if you have `connect`] )], [], $cares_all_includes) +AC_CHECK_DECL(connectx, [AC_DEFINE([HAVE_CONNECTX], 1, [Define to 1 if you have `connectx`] )], [], $cares_all_includes) AC_CHECK_DECL(closesocket, [AC_DEFINE([HAVE_CLOSESOCKET], 1, [Define to 1 if you have `closesocket`] )], [], $cares_all_includes) AC_CHECK_DECL(CloseSocket, [AC_DEFINE([HAVE_CLOSESOCKET_CAMEL], 1, [Define to 1 if you have `CloseSocket`] )], [], $cares_all_includes) AC_CHECK_DECL(fcntl, [AC_DEFINE([HAVE_FCNTL], 1, [Define to 1 if you have `fcntl`] )], [], $cares_all_includes) @@ -657,8 +595,11 @@ AC_CHECK_DECL(pipe, [AC_DEFINE([HAVE_PIPE], 1, [Define t AC_CHECK_DECL(pipe2, [AC_DEFINE([HAVE_PIPE2], 1, [Define to 1 if you have `pipe2`] )], [], $cares_all_includes) AC_CHECK_DECL(kqueue, [AC_DEFINE([HAVE_KQUEUE], 1, [Define to 1 if you have `kqueue`] )], [], $cares_all_includes) AC_CHECK_DECL(epoll_create1, [AC_DEFINE([HAVE_EPOLL], 1, [Define to 1 if you have `epoll_{create1,ctl,wait}`])], [], $cares_all_includes) +AC_CHECK_DECL(GetBestRoute2, [AC_DEFINE([HAVE_GETBESTROUTE2], 1, [Define to 1 if you have `GetBestRoute2`] )], [], $cares_all_includes) AC_CHECK_DECL(ConvertInterfaceIndexToLuid, [AC_DEFINE([HAVE_CONVERTINTERFACEINDEXTOLUID], 1, [Define to 1 if you have `ConvertInterfaceIndexToLuid`])], [], $cares_all_includes) AC_CHECK_DECL(ConvertInterfaceLuidToNameA, [AC_DEFINE([HAVE_CONVERTINTERFACELUIDTONAMEA], 1, [Define to 1 if you have `ConvertInterfaceLuidToNameA`])], [], $cares_all_includes) +AC_CHECK_DECL(NotifyIpInterfaceChange, [AC_DEFINE([HAVE_NOTIFYIPINTERFACECHANGE], 1, [Define to 1 if you have `NotifyIpInterfaceChange`] )], [], $cares_all_includes) +AC_CHECK_DECL(RegisterWaitForSingleObject, [AC_DEFINE([HAVE_REGISTERWAITFORSINGLEOBJECT], 1, [Define to 1 if you have `RegisterWaitForSingleObject`])], [], $cares_all_includes) AC_CHECK_DECL(__system_property_get, [AC_DEFINE([HAVE___SYSTEM_PROPERTY_GET], 1, [Define to 1 if you have `__system_property_get`] )], [], $cares_all_includes) @@ -714,7 +655,7 @@ recvfrom_type_arg5="struct sockaddr *" recv_type_arg4=int getnameinfo_type_arg1="struct sockaddr *" getnameinfo_type_arg7=int -send_type_arg2="void *" +send_type_arg2="const void *" send_type_arg4=int AC_DEFINE_UNQUOTED([RECVFROM_TYPE_RETV], [ ${recvfrom_type_retv} ], [ recvfrom() return value ]) @@ -734,7 +675,6 @@ AC_DEFINE_UNQUOTED([RECV_TYPE_ARG4], [ ${recv_type_arg4} ], [ re AC_DEFINE_UNQUOTED([SEND_TYPE_RETV], [ ${send_type_retv} ], [ send() return value ]) AC_DEFINE_UNQUOTED([SEND_TYPE_ARG1], [ ${send_type_arg1} ], [ send() arg1 type ]) AC_DEFINE_UNQUOTED([SEND_TYPE_ARG2], [ ${send_type_arg2} ], [ send() arg2 type ]) -AC_DEFINE_UNQUOTED([SEND_QUAL_ARG2], [ ], [ send() arg2 qualifier ]) AC_DEFINE_UNQUOTED([SEND_TYPE_ARG3], [ ${send_type_arg3} ], [ send() arg3 type ]) AC_DEFINE_UNQUOTED([SEND_TYPE_ARG4], [ ${send_type_arg4} ], [ send() arg4 type ]) @@ -817,6 +757,9 @@ fi if test "x$ac_cv_header_sys_socket_h" = "xyes" ; then CARES_DEFINE_UNQUOTED([CARES_HAVE_SYS_SOCKET_H],[1]) fi +if test "x$ac_cv_header_sys_select_h" = "xyes" ; then + CARES_DEFINE_UNQUOTED([CARES_HAVE_SYS_SELECT_H],[1]) +fi if test "x$ac_cv_header_ws2tcpip_h" = "xyes" ; then CARES_DEFINE_UNQUOTED([CARES_HAVE_WS2TCPIP_H],[1]) fi @@ -864,14 +807,6 @@ BUILD_SUBDIRS="include src docs" dnl ******** TESTS ******* -if test "x$build_tests" != "xno" -a "x$HAVE_CXX14" = "0" ; then - if test "x$build_tests" = "xmaybe" ; then - AC_MSG_WARN([cannot build tests without a CXX14 compiler]) - build_tests=no - else - AC_MSG_ERROR([*** Building tests requires a CXX14 compiler]) - fi -fi if test "x$build_tests" != "xno" -a "x$cross_compiling" = "xyes" ; then if test "x$build_tests" = "xmaybe" ; then AC_MSG_WARN([cannot build tests when cross compiling]) @@ -880,6 +815,13 @@ if test "x$build_tests" != "xno" -a "x$cross_compiling" = "xyes" ; then AC_MSG_ERROR([*** Tests not supported when cross compiling]) fi fi + +dnl Forces compiling of tests even when cross-compiling. +AC_ARG_ENABLE(tests-crossbuild, + AS_HELP_STRING([--enable-tests-crossbuild], [Enable test building even when cross building]), + [build_tests="$enableval"] +) + if test "x$build_tests" != "xno" ; then PKG_CHECK_MODULES([GMOCK], [gmock], [ have_gmock=yes ], [ have_gmock=no ]) if test "x$have_gmock" = "xno" ; then @@ -889,12 +831,25 @@ if test "x$build_tests" != "xno" ; then else AC_MSG_ERROR([tests require gmock]) fi + else + PKG_CHECK_MODULES([GMOCK112], [gmock >= 1.12.0], [ have_gmock_v112=yes ], [ have_gmock_v112=no ]) + if test "x$have_gmock_v112" = "xyes" ; then + ARES_CHECK_USER_NAMESPACE + ARES_CHECK_UTS_NAMESPACE + fi + PKG_CHECK_MODULES([GMOCK117], [gmock >= 1.17.0], [ have_gmock_v117=yes ], [ have_gmock_v117=no ]) + if test "x$have_gmock_v117" = "xyes" ; then + dnl GMock v1.17.0 requires C++17 or higher + AX_CXX_COMPILE_STDCXX(17,[noext],[mandatory]) + else + dnl older version needed v1.14.0 + AX_CXX_COMPILE_STDCXX(14,[noext],[mandatory]) + fi fi fi if test "x$build_tests" != "xno" ; then build_tests=yes - AX_CXX_COMPILE_STDCXX_14([noext],[mandatory]) if test "$ac_cv_native_windows" != "yes" ; then AX_PTHREAD([ CARES_TEST_PTHREADS="yes" ], [ AC_MSG_ERROR([threading required for tests]) ]) fi @@ -911,12 +866,12 @@ AC_SUBST(AM_CPPFLAGS) AC_SUBST(PKGCONFIG_CFLAGS) AC_SUBST(BUILD_SUBDIRS) -AC_CONFIG_FILES([Makefile \ - include/Makefile \ - src/Makefile \ - src/lib/Makefile \ - src/tools/Makefile \ - docs/Makefile \ +AC_CONFIG_FILES([Makefile + include/Makefile + src/Makefile + src/lib/Makefile + src/tools/Makefile + docs/Makefile libcares.pc ]) AM_COND_IF([BUILD_TESTS], [AC_CONFIG_FILES([test/Makefile])]) diff --git a/deps/cares/depcomp b/deps/cares/depcomp deleted file mode 100755 index 715e34311ed2d2..00000000000000 --- a/deps/cares/depcomp +++ /dev/null @@ -1,791 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2018-03-07.03; # UTC - -# Copyright (C) 1999-2021 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <https://www.gnu.org/licenses/>. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. - -case $1 in - '') - echo "$0: No command. Try '$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by 'PROGRAMS ARGS'. - object Object file output by 'PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputting dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to <bug-automake@gnu.org>. -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -# Get the directory component of the given path, and save it in the -# global variables '$dir'. Note that this directory component will -# be either empty or ending with a '/' character. This is deliberate. -set_dir_from () -{ - case $1 in - */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; - *) dir=;; - esac -} - -# Get the suffix-stripped basename of the given path, and save it the -# global variable '$base'. -set_base_from () -{ - base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` -} - -# If no dependency file was actually created by the compiler invocation, -# we still have to create a dummy depfile, to avoid errors with the -# Makefile "include basename.Plo" scheme. -make_dummy_depfile () -{ - echo "#dummy" > "$depfile" -} - -# Factor out some common post-processing of the generated depfile. -# Requires the auxiliary global variable '$tmpdepfile' to be set. -aix_post_process_depfile () -{ - # If the compiler actually managed to produce a dependency file, - # post-process it. - if test -f "$tmpdepfile"; then - # Each line is of the form 'foo.o: dependency.h'. - # Do two passes, one to just change these to - # $object: dependency.h - # and one to simply output - # dependency.h: - # which is needed to avoid the deleted-header problem. - { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" - sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" - } > "$depfile" - rm -f "$tmpdepfile" - else - make_dummy_depfile - fi -} - -# A tabulation character. -tab=' ' -# A newline character. -nl=' -' -# Character ranges might be problematic outside the C locale. -# These definitions help. -upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ -lower=abcdefghijklmnopqrstuvwxyz -digits=0123456789 -alpha=${upper}${lower} - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Avoid interferences from the environment. -gccflag= dashmflag= - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvisualcpp -fi - -if test "$depmode" = msvc7msys; then - # This is just like msvc7 but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u='sed s,\\\\,/,g' - depmode=msvc7 -fi - -if test "$depmode" = xlc; then - # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. - gccflag=-qmakedep=gcc,-MF - depmode=gcc -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. -## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. -## (see the conditional assignment to $gccflag above). -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). Also, it might not be -## supported by the other compilers which use the 'gcc' depmode. -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The second -e expression handles DOS-style file names with drive - # letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the "deleted header file" problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. -## Some versions of gcc put a space before the ':'. On the theory -## that the space means something, we add a space to the output as -## well. hp depmode also adds that space, but also prefixes the VPATH -## to the object. Take care to not repeat it in the output. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like '#:fec' to the end of the - # dependency line. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ - | tr "$nl" ' ' >> "$depfile" - echo >> "$depfile" - # The second pass generates a dummy entry for each header file. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" - ;; - -xlc) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts '$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - aix_post_process_depfile - ;; - -tcc) - # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 - # FIXME: That version still under development at the moment of writing. - # Make that this statement remains true also for stable, released - # versions. - # It will wrap lines (doesn't matter whether long or short) with a - # trailing '\', as in: - # - # foo.o : \ - # foo.c \ - # foo.h \ - # - # It will put a trailing '\' even on the last line, and will use leading - # spaces rather than leading tabs (at least since its commit 0394caf7 - # "Emit spaces for -MD"). - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. - # We have to change lines of the first kind to '$object: \'. - sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" - # And for each line of the second kind, we have to emit a 'dep.h:' - # dummy dependency, to avoid the deleted-header problem. - sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" - rm -f "$tmpdepfile" - ;; - -## The order of this option in the case statement is important, since the -## shell code in configure will try each of these formats in the order -## listed in this file. A plain '-MD' option would be understood by many -## compilers, so we must ensure this comes after the gcc and icc options. -pgcc) - # Portland's C compiler understands '-MD'. - # Will always output deps to 'file.d' where file is the root name of the - # source file under compilation, even if file resides in a subdirectory. - # The object file name does not affect the name of the '.d' file. - # pgcc 10.2 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using '\' : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - set_dir_from "$object" - # Use the source, not the object, to determine the base name, since - # that's sadly what pgcc will do too. - set_base_from "$source" - tmpdepfile=$base.d - - # For projects that build the same source file twice into different object - # files, the pgcc approach of using the *source* file root name can cause - # problems in parallel builds. Use a locking strategy to avoid stomping on - # the same $tmpdepfile. - lockdir=$base.d-lock - trap " - echo '$0: caught signal, cleaning up...' >&2 - rmdir '$lockdir' - exit 1 - " 1 2 13 15 - numtries=100 - i=$numtries - while test $i -gt 0; do - # mkdir is a portable test-and-set. - if mkdir "$lockdir" 2>/dev/null; then - # This process acquired the lock. - "$@" -MD - stat=$? - # Release the lock. - rmdir "$lockdir" - break - else - # If the lock is being held by a different process, wait - # until the winning process is done or we timeout. - while test -d "$lockdir" && test $i -gt 0; do - sleep 1 - i=`expr $i - 1` - done - fi - i=`expr $i - 1` - done - trap - 1 2 13 15 - if test $i -le 0; then - echo "$0: failed to acquire lock after $numtries attempts" >&2 - echo "$0: check lockdir '$lockdir'" >&2 - exit 1 - fi - - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - set_dir_from "$object" - set_base_from "$object" - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" - # Add 'dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - make_dummy_depfile - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in 'foo.d' instead, so we check for that too. - # Subdirectories are respected. - set_dir_from "$object" - set_base_from "$object" - - if test "$libtool" = yes; then - # Libtool generates 2 separate objects for the 2 libraries. These - # two compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir$base.o.d # libtool 1.5 - tmpdepfile2=$dir.libs/$base.o.d # Likewise. - tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -ne 0; then - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - # Same post-processing that is required for AIX mode. - aix_post_process_depfile - ;; - -msvc7) - if test "$libtool" = yes; then - showIncludes=-Wc,-showIncludes - else - showIncludes=-showIncludes - fi - "$@" $showIncludes > "$tmpdepfile" - stat=$? - grep -v '^Note: including file: ' "$tmpdepfile" - if test $stat -ne 0; then - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - # The first sed program below extracts the file names and escapes - # backslashes for cygpath. The second sed program outputs the file - # name when reading, but also accumulates all include files in the - # hold buffer in order to output them again at the end. This only - # works with sed implementations that can handle large buffers. - sed < "$tmpdepfile" -n ' -/^Note: including file: *\(.*\)/ { - s//\1/ - s/\\/\\\\/g - p -}' | $cygpath_u | sort -u | sed -n ' -s/ /\\ /g -s/\(.*\)/'"$tab"'\1 \\/p -s/.\(.*\) \\/\1:/ -H -$ { - s/.*/'"$tab"'/ - G - p -}' >> "$depfile" - echo >> "$depfile" # make sure the fragment doesn't end with a backslash - rm -f "$tmpdepfile" - ;; - -msvc7msys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for ':' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. - "$@" $dashmflag | - sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this sed invocation - # correctly. Breaking it into two sed invocations is a workaround. - tr ' ' "$nl" < "$tmpdepfile" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - # makedepend may prepend the VPATH from the source file name to the object. - # No need to regex-escape $object, excess matching of '.' is harmless. - sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process the last invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed '1,2d' "$tmpdepfile" \ - | tr ' ' "$nl" \ - | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ - | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove '-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E \ - | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - | sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" - echo "$tab" >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/deps/cares/docs/Makefile.in b/deps/cares/docs/Makefile.in index 8cb46878fa59ee..501364eb8d9879 100644 --- a/deps/cares/docs/Makefile.in +++ b/deps/cares/docs/Makefile.in @@ -92,7 +92,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -102,12 +104,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -226,10 +225,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -374,9 +378,16 @@ MANPAGES = ares_cancel.3 \ ares_dns_record_rr_del.3 \ ares_dns_record_rr_get.3 \ ares_dns_record_rr_get_const.3 \ + ares_dns_record_set_id.3 \ ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_tostr.3 \ ares_dns_rec_type_t.3 \ ares_dns_rr.3 \ + ares_dns_rr_add_abin.3 \ + ares_dns_rr_del_abin.3 \ + ares_dns_rr_del_opt_byid.3 \ + ares_dns_rr_get_abin.3 \ + ares_dns_rr_get_abin_cnt.3 \ ares_dns_rr_get_addr.3 \ ares_dns_rr_get_addr6.3 \ ares_dns_rr_get_bin.3 \ @@ -446,6 +457,9 @@ MANPAGES = ares_cancel.3 \ ares_parse_txt_reply.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ + ares_process_fd.3 \ + ares_process_fds.3 \ + ares_process_pending_write.3 \ ares_query.3 \ ares_query_dnsrec.3 \ ares_queue.3 \ @@ -460,6 +474,8 @@ MANPAGES = ares_cancel.3 \ ares_set_local_dev.3 \ ares_set_local_ip4.3 \ ares_set_local_ip6.3 \ + ares_set_pending_write_cb.3 \ + ares_set_server_state_callback.3 \ ares_set_servers.3 \ ares_set_servers_csv.3 \ ares_set_servers_ports.3 \ @@ -467,6 +483,7 @@ MANPAGES = ares_cancel.3 \ ares_set_socket_callback.3 \ ares_set_socket_configure_callback.3 \ ares_set_socket_functions.3 \ + ares_set_socket_functions_ex.3 \ ares_set_sortlist.3 \ ares_strerror.3 \ ares_svcb_param_t.3 \ diff --git a/deps/cares/docs/Makefile.inc b/deps/cares/docs/Makefile.inc index 882bf2280446d5..b5519369aa9ea5 100644 --- a/deps/cares/docs/Makefile.inc +++ b/deps/cares/docs/Makefile.inc @@ -36,9 +36,16 @@ MANPAGES = ares_cancel.3 \ ares_dns_record_rr_del.3 \ ares_dns_record_rr_get.3 \ ares_dns_record_rr_get_const.3 \ + ares_dns_record_set_id.3 \ ares_dns_rec_type_fromstr.3 \ + ares_dns_rec_type_tostr.3 \ ares_dns_rec_type_t.3 \ ares_dns_rr.3 \ + ares_dns_rr_add_abin.3 \ + ares_dns_rr_del_abin.3 \ + ares_dns_rr_del_opt_byid.3 \ + ares_dns_rr_get_abin.3 \ + ares_dns_rr_get_abin_cnt.3 \ ares_dns_rr_get_addr.3 \ ares_dns_rr_get_addr6.3 \ ares_dns_rr_get_bin.3 \ @@ -108,6 +115,9 @@ MANPAGES = ares_cancel.3 \ ares_parse_txt_reply.3 \ ares_parse_uri_reply.3 \ ares_process.3 \ + ares_process_fd.3 \ + ares_process_fds.3 \ + ares_process_pending_write.3 \ ares_query.3 \ ares_query_dnsrec.3 \ ares_queue.3 \ @@ -122,6 +132,8 @@ MANPAGES = ares_cancel.3 \ ares_set_local_dev.3 \ ares_set_local_ip4.3 \ ares_set_local_ip6.3 \ + ares_set_pending_write_cb.3 \ + ares_set_server_state_callback.3 \ ares_set_servers.3 \ ares_set_servers_csv.3 \ ares_set_servers_ports.3 \ @@ -129,6 +141,7 @@ MANPAGES = ares_cancel.3 \ ares_set_socket_callback.3 \ ares_set_socket_configure_callback.3 \ ares_set_socket_functions.3 \ + ares_set_socket_functions_ex.3 \ ares_set_sortlist.3 \ ares_strerror.3 \ ares_svcb_param_t.3 \ diff --git a/deps/cares/docs/adig.1 b/deps/cares/docs/adig.1 index 59923790587ddd..e0b81c91e3f9fa 100644 --- a/deps/cares/docs/adig.1 +++ b/deps/cares/docs/adig.1 @@ -3,65 +3,177 @@ .\" Copyright (C) Daniel Stenberg .\" SPDX-License-Identifier: MIT .\" -.TH ADIG "1" "April 2011" "c-ares utilities" +.TH ADIG "1" "Sept 2024" "c-ares utilities" .SH NAME adig \- print information collected from Domain Name System (DNS) servers .SH SYNOPSIS -.B adig -[\fIOPTION\fR]... \fINAME\fR... +\fBadig\fP [\fI@server\fR] [\fI-c class\fR] [\fI-p port#\fR] [\fI-q name\fR] +[\fI-t type\fR] [\fI-x addr\fR] [\fIname\fR] [\fItype\fR] [\fIclass\fR] +[\fIqueryopt\fR...] + .SH DESCRIPTION .PP -.\" Add any additional description here -.PP -Send queries to DNS servers about \fINAME\fR and print received -information, where \fINAME\fR is a valid DNS name (e.g. www.example.com, +Send queries to DNS servers about \fUname\fR and print received +information, where \fIname\fR is a valid DNS name (e.g. www.example.com, 1.2.3.10.in-addr.arpa). .PP This utility comes with the \fBc\-ares\fR asynchronous resolver library. -.SH OPTIONS +.PP +It is possible to specify default arguments for \fBadig\fR via \fB${XDG_CONFIG_HOME}/adigrc\fR. +.SH ARGS +.TP +\fB@server\fR +Server ip address. May specify multiple in comma delimited format. May be +specified in URI format. +.TP +\fBname\fR +Name of the resource record that is to be looked up +.TP +\fBtype\fR +What type of query is required. e.g. - A, AAAA, MX, TXT, etc. If not +specified, A will be used. +.TP +\fBclass\fR +Sets the query class, defaults to IN. May also be HS or CH. + +.SH FLAGS .TP \fB\-c\fR class -Set the query class. -Possible values for class are -ANY, CHAOS, HS and IN (default). -.TP -\fB\-d\fR -Print some extra debugging output. -.TP -\fB\-f\fR flag -Add a behavior control flag. -Possible values for flag are - igntc - ignore query truncation, return answer as-is instead of retrying - via tcp. - noaliases - don't honor the HOSTALIASES environment variable, - norecurse - don't query upstream servers recursively, - primary - use the first server, - stayopen - don't close the communication sockets, and - usevc - always use TCP. -.TP -\fB\-h\fR, \fB\-?\fR -Display this help and exit. -.TP -\fB\-s\fR server -Connect to specified DNS server, instead of the system's default one(s). -Servers are tried in round-robin, if the previous one failed. +Sets the query class, defaults to IN. May also be HS or CH. +.TP +\fB\-h\fR +Prints the help. +.TP +\fB\-p\fR port +Sends query to a port other than 53. Often recommended to set the port using +\fI@server\fR instead. +.TP +\fB\-q\fR name +Specifies the domain name to query. Useful to distinguish name from other +arguments +.TP +\fB\-r\fR +Skip adigrc processing +.TP +\fB\-s\fR +Server (alias for @server syntax), compatibility with old cmdline .TP \fB\-t\fR type -Query records of specified type. -Possible values for type are -A (default), AAAA, ANY, AXFR, CNAME, HINFO, MX, NAPTR, NS, PTR, SOA, SRV, TXT, -URI, CAA, SVCB, and HTTPS. +Indicates resource record type to query. Useful to distinguish type from other +arguments +.TP +\fB\-x\fR addr +Simplified reverse lookups. Sets the type to PTR and forms a valid in-arpa +query string + +.SH QUERY OPTIONS +.TP +\fB+[no]aaonly\fR +Sets the aa flag in the query. Default is off. +.TP +\fB+[no]aaflag\fR +Alias for +[no]aaonly +.TP +\fB+[no]additional\fR +Toggles printing the additional section. On by default. +.TP +\fB+[no]adflag\fR +Sets the ad (authentic data) bit in the query. Default is off. +.TP +\fB+[no]aliases\fR +Whether or not to honor the HOSTALIASES file. Default is on. +.TP +\fB+[no]all\fR +Toggles all of +[no]cmd, +[no]stats, +[no]question, +[no]answer, ++[no]authority, +[no]additional, +[no]comments +.TP +\fB+[no]answer\fR +Toggles printing the answer. On by default. +.TP +\fB+[no]authority\fR +Toggles printing the authority. On by default. .TP -\fB\-T\fR port -Connect to the specified TCP port of DNS server. +\fB+bufsize=\fR# +UDP EDNS 0 packet size allowed. Defaults to 1232. .TP -\fB\-U\fR port -Connect to the specified UDP port of DNS server. +\fB+[no]cdflag\fR +Sets the CD (checking disabled) bit in the query. Default is off. +.TP +\fB+[no]class\fR +Display the class when printing the record. On by default. +.TP +\fB+[no]cmd\fR +Toggles printing the command requested. On by default. +.TP +\fB+[no]comments\fR +Toggles printing the comments. On by default +.TP +\fB+[no]defname\fR +Alias for +[no]search +.TP +\fB+domain=somename\fR +Sets the search list to a single domain. +.TP +\fB+[no]dns0x20\fR +Whether or not to use DNS 0x20 case randomization when sending queries. +Default is off. +.TP +\fB+[no]edns\fR[=#] +Enable or disable EDNS. Only allows a value of 0 if specified. Default is to +enable EDNS. +.TP +\fB+[no]ignore\fR +Ignore truncation on UDP, by default retried on TCP. +.TP +\fB+[no]keepopen\fR +Whether or not the server connection should be persistent. Default is off. +.TP +\fB+ndots\fR=# +Sets the number of dots that must appear before being considered absolute. +Defaults to 1. +.TP +\fB+[no]primary\fR +Whether or not to only use a single server if more than one server is available. +Defaults to using all servers. +.TP +\fB+[no]qr\fR +Toggles printing the request query. Off by default. +.TP +\fB+[no]question\fR +Toggles printing the question. On by default. +.TP +\fB+[no]recurse\fR +Toggles the RD (Recursion Desired) bit. On by default. +.TP +\fB+retry\fR=# +Same as +tries but does not include the initial attempt. +.TP +\fB+[no]search\fR +To use or not use the search list. Search list is not used by default. +.TP +\fB+[no]stats\fR +Toggles printing the statistics. On by default. +.TP +\fB+[no]tcp\fR +Whether to use TCP when querying name servers. Default is UDP. +.TP +\fB+tries\fR=# +Number of query tries. Defaults to 3. +.TP +\fB+[no]ttlid\fR +Display the TTL when printing the record. On by default. +.TP +\fB+[no]vc\fR +Alias for +[no]tcp + +.SH FILES + +${XDG_CONFIG_HOME}/adigrc .SH "REPORTING BUGS" -Report bugs to the c-ares mailing list: +Report bugs to the c-ares github issues tracker .br -\fBhttps://lists.haxx.se/listinfo/c-ares\fR +\fBhttps://github.com/c-ares/c-ares/issues\fR .SH "SEE ALSO" .PP ahost(1). diff --git a/deps/cares/docs/ares_cancel.3 b/deps/cares/docs/ares_cancel.3 index 4eecaade246312..967a946b491cd3 100644 --- a/deps/cares/docs/ares_cancel.3 +++ b/deps/cares/docs/ares_cancel.3 @@ -31,5 +31,3 @@ c-ares 1.6.0 and earlier pass a status of .BR ARES_ETIMEOUT instead of .BR ARES_ECANCELLED . -.SH AUTHOR -Dirk Manske diff --git a/deps/cares/docs/ares_create_query.3 b/deps/cares/docs/ares_create_query.3 index 5fb59f920616f4..3af6ba4cc3dc5b 100644 --- a/deps/cares/docs/ares_create_query.3 +++ b/deps/cares/docs/ares_create_query.3 @@ -19,6 +19,9 @@ int ares_create_query(const char *\fIname\fP, int \fImax_udp_size\fP) .fi .SH DESCRIPTION +This function is deprecated as of c-ares 1.22, please use +\fIares_dns_record_create(3)\fP instead. + The \fIares_create_query(3)\fP function composes a DNS query with a single question. The parameter \fIname\fP gives the query name as a NUL-terminated C string of period-separated labels optionally ending with a period; periods and @@ -70,4 +73,3 @@ Added in c-ares 1.10.0 .BR ares_expand_name (3), .BR ares_free_string (3), .BR ares_mkquery (3) -.SH AUTHOR diff --git a/deps/cares/docs/ares_destroy.3 b/deps/cares/docs/ares_destroy.3 index 8548d59c54182e..d1984b7cc98d26 100644 --- a/deps/cares/docs/ares_destroy.3 +++ b/deps/cares/docs/ares_destroy.3 @@ -27,7 +27,3 @@ using this channel may be made once this function is called. .BR ares_init (3), .BR ares_cancel (3), .BR ares_threadsafety (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_destroy_options.3 b/deps/cares/docs/ares_destroy_options.3 index 432c4b10d7f402..18340995b2c0fd 100644 --- a/deps/cares/docs/ares_destroy_options.3 +++ b/deps/cares/docs/ares_destroy_options.3 @@ -18,7 +18,3 @@ identified by \Ioptions\fP, freeing all memory allocated by .SH SEE ALSO .BR ares_save_options (3), .BR ares_init_options (3) -.SH AUTHOR -Brad House -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_dns_mapping.3 b/deps/cares/docs/ares_dns_mapping.3 index 6c2c905a5c5185..451839153c5172 100644 --- a/deps/cares/docs/ares_dns_mapping.3 +++ b/deps/cares/docs/ares_dns_mapping.3 @@ -89,6 +89,13 @@ set and \fIares_dns_rr_get_bin(3)\fP to get. - Array of options. 16bit identifier, Binary data. Use \fIares_dns_rr_set_opt(3)\fP to set and \fIares_dns_rr_get_opt(3)\fP to get. .br +.B ARES_DATATYPE_ABINP +- Array of binary data, but likely printable. Guaranteed to have a NULL terminator +for convenience (not included in length). Use \fIares_dns_rr_add_abin(3)\fP to +set and \fIares_dns_rr_get_abin(3)\fP to get. Can also use +\fIares_dns_rr_set_bin(3)\fP and \fIares_dns_rr_get_bin(3)\fP if only concatenated +strings are desired. +.br .RE .B ares_dns_opt_datatype_t - @@ -298,5 +305,3 @@ These functions were first introduced in c-ares version 1.22.0. .BR ares_dns_record (3), .BR ares_dns_rr (3), .BR ares_init (3) -.SH AUTHOR -Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_rec_type_tostr.3 b/deps/cares/docs/ares_dns_rec_type_tostr.3 new file mode 100644 index 00000000000000..4587b9a586ef8e --- /dev/null +++ b/deps/cares/docs/ares_dns_rec_type_tostr.3 @@ -0,0 +1,4 @@ +.\" +.\" Copyright (C) Daniel Stenberg +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_mapping.3 diff --git a/deps/cares/docs/ares_dns_record.3 b/deps/cares/docs/ares_dns_record.3 index 01ce7601aa3199..47ca95b057a246 100644 --- a/deps/cares/docs/ares_dns_record.3 +++ b/deps/cares/docs/ares_dns_record.3 @@ -32,6 +32,9 @@ ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec); unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec); +ares_bool_t ares_dns_record_set_id(ares_dns_record_t *dnsrec, + unsigned short id); + unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec); ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec); @@ -89,6 +92,9 @@ on requests, and some may only be valid on responses: .B ARES_REC_TYPE_TXT - Text strings .br +.B ARES_REC_TYPE_SIG +- RFC 2535. RFC 2931. SIG Record +.br .B ARES_REC_TYPE_AAAA - RFC 3596. Ip6 Address .br @@ -161,7 +167,7 @@ DNS Header Opcodes: - Zone change notification (RFC 1996) .br .B ARES_OPCODE_UPDATE -- Zone update message (RFC2136) +- Zone update message (RFC 2136) .br .RE @@ -340,6 +346,14 @@ message id from the DNS record provided in the .IR dnsrec parameter. +The \fIares_dns_record_set_id(3)\fP function is used to set the DNS +message id in the +.IR id +parameter from the DNS record provided in the +.IR dnsrec +parameter. This id will be overwritten when passing the record to c-ares, +so mostly exists for external purposes. + The \fIares_dns_record_get_flags(3)\fP function is used to retrieve the DNS message flags from the DNS record provided in the .IR dnsrec @@ -425,12 +439,12 @@ is returned on out of memory, .B ARES_EFORMERR is returned on misuse. -\fIares_dns_record_get_id(3)\fP, \fIares_dns_record_get_flags(3)\fP, -\fIares_dns_record_get_opcode(3)\fP, \fIares_dns_record_get_rcode(3)\fP, and -\fIares_dns_record_query_cnt(3)\fP all returned their prescribed datatype -values and in general can't fail except for misuse cases, in which a 0 may -be returned, however 0 can also be a valid return value for most of these -functions. +\fIares_dns_record_get_id(3)\fP, \fIares_dns_record_set_id(3)\fP, +\fIares_dns_record_get_flags(3)\fP, \fIares_dns_record_get_opcode(3)\fP, +\fIares_dns_record_get_rcode(3)\fP, and \fIares_dns_record_query_cnt(3)\fP +all returned their prescribed datatype values and in general can't fail except +for misuse cases, in which a 0 may be returned, however 0 can also be a valid +return value for most of these functions. .SH AVAILABILITY @@ -439,5 +453,3 @@ These functions were first introduced in c-ares version 1.22.0. .BR ares_dns_mapping (3), .BR ares_dns_rr (3), .BR ares_free_string (3) -.SH AUTHOR -Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_record_set_id.3 b/deps/cares/docs/ares_dns_record_set_id.3 new file mode 100644 index 00000000000000..4acc581d29789c --- /dev/null +++ b/deps/cares/docs/ares_dns_record_set_id.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_record.3 diff --git a/deps/cares/docs/ares_dns_rr.3 b/deps/cares/docs/ares_dns_rr.3 index 290859e838e7ef..4da768650b5cb8 100644 --- a/deps/cares/docs/ares_dns_rr.3 +++ b/deps/cares/docs/ares_dns_rr.3 @@ -5,12 +5,14 @@ .SH NAME ares_dns_record_rr_add, ares_dns_record_rr_cnt, ares_dns_record_rr_del, ares_dns_record_rr_get, ares_dns_record_rr_get_const, ares_dns_rr_get_addr, -ares_dns_rr_get_addr6, ares_dns_rr_get_bin, ares_dns_rr_get_class, +ares_dns_rr_get_addr6, ares_dns_rr_get_bin, ares_dns_rr_get_abin_cnt, +ares_dns_rr_get_abin, ares_dns_rr_get_class, ares_dns_rr_get_name, ares_dns_rr_get_opt, ares_dns_rr_get_opt_byid, ares_dns_rr_get_opt_cnt, ares_dns_rr_get_str, ares_dns_rr_get_ttl, ares_dns_rr_get_type, ares_dns_rr_get_u16, ares_dns_rr_get_u32, ares_dns_rr_get_u8, ares_dns_rr_key_t, ares_dns_rr_set_addr, -ares_dns_rr_set_addr6, ares_dns_rr_set_bin, ares_dns_rr_set_opt, +ares_dns_rr_set_addr6, ares_dns_rr_set_bin, ares_dns_rr_add_abin, +ares_dns_rr_del_abin, ares_dns_rr_set_opt, ares_dns_rr_set_str, ares_dns_rr_set_u16, ares_dns_rr_set_u32, ares_dns_rr_set_u8, ares_dns_section_t, ares_tlsa_match_t, ares_tlsa_selector_t, ares_tlsa_usage_t \- @@ -79,12 +81,25 @@ ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, const unsigned char *val, size_t len); +ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const unsigned char *val, + size_t len); + +ares_status_t ares_dns_rr_del_abin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + size_t idx); + ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, unsigned short opt, const unsigned char *val, size_t val_len); +ares_status_t ares_dns_rr_del_opt_byid(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt); + const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); @@ -107,6 +122,13 @@ const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, size_t *len); +size_t ares_dns_rr_get_abin_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +const unsigned char *ares_dns_rr_get_abin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t idx, + size_t *len); + size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); @@ -188,7 +210,34 @@ Keys used for handling RR record parameters: - MX Record. Exchange, domain. Datatype: \fIARES_DATATYPE_NAME\fP .br .B ARES_RR_TXT_DATA -- TXT Record. Data. Datatype: \fIARES_DATATYPE_BINP\fP +- TXT Record. Data. Datatype: \fIARES_DATATYPE_ABINP\fP +.br +.B ARES_RR_SIG_TYPE_COVERED +- SIG Record. Type Covered. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SIG_ALGORITHM +- SIG Record. Algorithm. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_SIG_LABELS +- SIG Record. Labels. Datatype: \fIARES_DATATYPE_U8\fP +.br +.B ARES_RR_SIG_ORIGINAL_TTL +- SIG Record. Original TTL. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SIG_EXPIRATION +- SIG Record. Signature Expiration. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SIG_INCEPTION +- SIG Record. Signature Inception. Datatype: \fIARES_DATATYPE_U32\fP +.br +.B ARES_RR_SIG_KEY_TAG +- SIG Record. Key Tag. Datatype: \fIARES_DATATYPE_U16\fP +.br +.B ARES_RR_SIG_SIGNERS_NAME +- SIG Record. Signer's Name. Datatype: \fIARES_DATATYPE_NAME\fP +.br +.B ARES_RR_SIG_SIGNATURE +- SIG Record. Signature. Datatype: \fIARES_DATATYPE_BIN\fP .br .B ARES_RR_AAAA_ADDR - AAAA Record. Address. Datatype: \fIARES_DATATYPE_INADDR6\fP @@ -470,7 +519,7 @@ parameter, and the value is provided in the .IR val parameter. -The \fIares_dns_rr_set_bin(3)\fP function is used to set an binary value for the +The \fIares_dns_rr_set_bin(3)\fP function is used to set a binary value for the associated resource record key/parameter when the datatype is \fIARES_DATATYPE_BIN\fP or \fIARES_DATATYPE_BINP\fP. The resource record to be modified is provided in the @@ -483,8 +532,32 @@ parameter. And the associated value length is provided in the .IR len parameter. +The \fIares_dns_rr_add_abin(3)\fP function is used to append a binary value in +the array for the associated resource record key/parameter when the datatype +is \fIARES_DATATYPE_ABINP\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the value is provided in the +.IR val +parameter. And the associated value length is provided in the +.IR len +parameter. + +The \fIares_dns_rr_del_abin(3)\fP function is used to delete a binary value in +the array for the associated resource record key/parameter when the datatype +is \fIARES_DATATYPE_ABINP\fP. +The resource record to be modified is provided in the +.IR dns_rr +parameter, the key/parameter is provided in the +.IR key +parameter, and the index to remove is provided in the +.IR idx +parameter. + The \fIares_dns_rr_set_opt(3)\fP function is used to set option/parameter keys and -values for the resource record when the datatype if \fIARES_DATATYPE_OPT\fP. The +values for the resource record when the datatype is \fIARES_DATATYPE_OPT\fP. The resource record to be modified is provided in the .IR dns_rr parameter. They key/parameter is provided in the @@ -499,6 +572,18 @@ enumerations. The value for the option is always provided in binary form in with length provided in .IR val_len. +The \fIares_dns_rr_del_opt_byid(3)\fP function is used to delete option/parameter +keys and values for the resource record when the datatype is +\fIARES_DATATYPE_OPT\fP. The resource record to be modified is provided in the +.IR dns_rr +parameter. They key/parameter is provided in the +.IR key +parameter. The option/parameter value specific to the resource record is provided +in the +.IR opt +parameter. This function returns \fIARES_SUCCESS\fP if the record is successfully +removed, or \fIARES_ENOTFOUND\fP if the record could not be found. + The \fIares_dns_rr_get_addr(3)\fP function is used to retrieve the IPv4 address from the resource record when the datatype is \fIARES_DATATYPE_INADDR\fP. The resource record is provided in the @@ -557,6 +642,26 @@ parameter and the key/parameter to retrieve is provided in the parameter, and length is stored into the variable pointed to by .IR len. +The \fIares_dns_rr_get_abin_cnt(3)\fP function is used to retrieve the count +of the array of stored binary values from the resource record when the datatype +is \fIARES_DATATYPE_ABINP\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter. + +The \fIares_dns_rr_get_abin(3)\fP function is used to retrieve binary data from +the resource record array when the datatype is \fIARES_DATATYPE_ABINP\fP. +The resource record is provided in the +.IR dns_rr +parameter and the key/parameter to retrieve is provided in the +.IR key +parameter, and the index to retrieve from the array is provided by the +.IR idx +parameter, and length is stored into the variable pointed to by +.IR len. + The \fIares_dns_rr_get_opt_cnt(3)\fP function is used to retrieve the count of options/parameters associated with the resource record when the datatype is \fIARES_DATATYPE_OPT\fP. @@ -603,8 +708,9 @@ respective counts. \fIares_dns_rr_set_addr(3)\fP, \fIares_dns_rr_set_addr6(3)\fP, \fIares_dns_rr_set_str(3)\fP, \fIares_dns_rr_set_u8(3)\fP, \fIares_dns_rr_set_u16(3)\fP, \fIares_dns_rr_set_u32(3)\fP, -\fIares_dns_rr_set_bin(3)\fP, and \fIares_dns_rr_set_opt(3)\fP all -return an \fIares_status_t\fP error code. +\fIares_dns_rr_set_bin(3)\fP, \fIares_dns_rr_add_abin(3)\fP, +\fIares_dns_rr_del_abin(3)\fP, +and \fIares_dns_rr_set_opt(3)\fP all return an \fIares_status_t\fP error code. .B ARES_SUCCESS is returned on success, .B ARES_ENOMEM @@ -618,7 +724,8 @@ is returned on misuse. \fIares_dns_rr_get_addr(3)\fP, \fIares_dns_rr_get_addr6(3)\fP, \fIares_dns_rr_get_str(3)\fP, \fIares_dns_rr_get_u8(3)\fP, \fIares_dns_rr_get_u16(3)\fP, \fIares_dns_rr_get_u32(3)\fP, -\fIares_dns_rr_get_bin(3)\fP, \fIares_dns_rr_get_opt(3)\fP all return their +\fIares_dns_rr_get_bin(3)\fP, \fIares_dns_rr_get_abin_cnt(3)\fP, +\fIares_dns_rr_get_abin(3)\fP, \fIares_dns_rr_get_opt(3)\fP all return their prescribed datatype values and in general can't fail except for misuse cases, in which a 0 (or NULL) may be returned, however 0 can also be a valid return value for most of these functions. @@ -635,5 +742,3 @@ These functions were first introduced in c-ares version 1.22.0. .BR ares_dns_mapping (3), .BR ares_dns_record (3), .BR ares_free_string (3) -.SH AUTHOR -Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_dns_rr_add_abin.3 b/deps/cares/docs/ares_dns_rr_add_abin.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_add_abin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_del_abin.3 b/deps/cares/docs/ares_dns_rr_del_abin.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_del_abin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_del_opt_byid.3 b/deps/cares/docs/ares_dns_rr_del_opt_byid.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_del_opt_byid.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_abin.3 b/deps/cares/docs/ares_dns_rr_get_abin.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_abin.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dns_rr_get_abin_cnt.3 b/deps/cares/docs/ares_dns_rr_get_abin_cnt.3 new file mode 100644 index 00000000000000..b93e4cd4e37fa8 --- /dev/null +++ b/deps/cares/docs/ares_dns_rr_get_abin_cnt.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_dns_rr.3 diff --git a/deps/cares/docs/ares_dup.3 b/deps/cares/docs/ares_dup.3 index 2395fe180a506a..8677005f5c2274 100644 --- a/deps/cares/docs/ares_dup.3 +++ b/deps/cares/docs/ares_dup.3 @@ -9,7 +9,7 @@ ares_dup \- Duplicate a resolver channel .nf #include <ares.h> -int ares_dup(ares_channel_t **\fIdest\fP, ares_channel_t *\fIsource\fP) +int ares_dup(ares_channel_t **\fIdest\fP, const ares_channel_t *\fIsource\fP) .fi .SH DESCRIPTION The \fBares_dup(3)\fP function duplicates an existing communications channel @@ -23,6 +23,3 @@ handle when the channel is no longer needed. .BR ares_library_init (3) .SH AVAILABILITY \fIares_dup(3)\fP was added in c-ares 1.6.0 -.SH AUTHOR -Daniel Stenberg - diff --git a/deps/cares/docs/ares_expand_name.3 b/deps/cares/docs/ares_expand_name.3 index 7bd43842a2782f..a8d08122335411 100644 --- a/deps/cares/docs/ares_expand_name.3 +++ b/deps/cares/docs/ares_expand_name.3 @@ -49,7 +49,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_mkquery (3), .BR ares_free_string (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_expand_string.3 b/deps/cares/docs/ares_expand_string.3 index 22d6654e50f38f..e4b1af9c90b672 100644 --- a/deps/cares/docs/ares_expand_string.3 +++ b/deps/cares/docs/ares_expand_string.3 @@ -46,5 +46,3 @@ The encoded string was malformed and could not be expanded. Memory was exhausted. .SH SEE ALSO .BR ares_free_string (3) -.SH AUTHOR -Dominick Meglio diff --git a/deps/cares/docs/ares_fds.3 b/deps/cares/docs/ares_fds.3 index 5871be5af6a201..6ac116e7a74119 100644 --- a/deps/cares/docs/ares_fds.3 +++ b/deps/cares/docs/ares_fds.3 @@ -9,7 +9,7 @@ ares_fds \- return file descriptors to select on (deprecated) .nf #include <ares.h> -int ares_fds(ares_channel_t *\fIchannel\fP, +int ares_fds(const ares_channel_t *\fIchannel\fP, fd_set *\fIread_fds\fP, fd_set *\fIwrite_fds\fP) .fi @@ -55,7 +55,3 @@ more modern methods to check for socket readable/writable state such as .BR ares_init_options (3), .BR ares_timeout (3), .BR ares_process (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_free_data.3 b/deps/cares/docs/ares_free_data.3 index a4de4dbf176593..98ebf6886bd8ac 100644 --- a/deps/cares/docs/ares_free_data.3 +++ b/deps/cares/docs/ares_free_data.3 @@ -60,9 +60,3 @@ This function was first introduced in c-ares version 1.7.0. .BR ares_parse_mx_reply (3), .BR ares_parse_txt_reply (3), .BR ares_parse_soa_reply (3) -.SH AUTHOR -Yang Tse -.PP -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2010 by Daniel Stenberg. diff --git a/deps/cares/docs/ares_free_hostent.3 b/deps/cares/docs/ares_free_hostent.3 index 973dc9dc557349..78d74d04a85237 100644 --- a/deps/cares/docs/ares_free_hostent.3 +++ b/deps/cares/docs/ares_free_hostent.3 @@ -28,7 +28,3 @@ structures when the callback returns. .BR ares_parse_aaaa_reply (3), .BR ares_parse_ptr_reply (3), .BR ares_parse_ns_reply (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_free_string.3 b/deps/cares/docs/ares_free_string.3 index 9871b48e26e8cb..17984ba9808024 100644 --- a/deps/cares/docs/ares_free_string.3 +++ b/deps/cares/docs/ares_free_string.3 @@ -17,7 +17,3 @@ function. .SH SEE ALSO .BR ares_mkquery (3) .BR ares_expand_string (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 2000 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_freeaddrinfo.3 b/deps/cares/docs/ares_freeaddrinfo.3 index 0f2a6ae0244bc8..b4b9e4c502a919 100644 --- a/deps/cares/docs/ares_freeaddrinfo.3 +++ b/deps/cares/docs/ares_freeaddrinfo.3 @@ -20,7 +20,3 @@ returned in \fIresult\fP of .B ares_addrinfo_callback .SH SEE ALSO .BR ares_getaddrinfo (3), -.SH AUTHOR -Christian Ammer -.BR -Andrew Selivanov <andrew.selivanov@gmail.com> diff --git a/deps/cares/docs/ares_get_servers.3 b/deps/cares/docs/ares_get_servers.3 index 7aeaa50ee15c1b..9b960f452bc8f0 100644 --- a/deps/cares/docs/ares_get_servers.3 +++ b/deps/cares/docs/ares_get_servers.3 @@ -10,10 +10,10 @@ ares_get_servers, ares_get_servers_ports \- Retrieve name servers from an initia .nf #include <ares.h> -int ares_get_servers(ares_channel_t *\fIchannel\fP, +int ares_get_servers(const ares_channel_t *\fIchannel\fP, struct ares_addr_node **\fIservers\fP) -int ares_get_servers_ports(ares_channel_t *\fIchannel\fP, +int ares_get_servers_ports(const ares_channel_t *\fIchannel\fP, struct ares_addr_port_node **\fIservers\fP) .fi .SH DESCRIPTION @@ -67,13 +67,3 @@ was invalid. .SH NOTES As of c-ares 1.24, these functions are deprecated due to their lack of ability to store the entire server configuration. Use \fBares_get_servers_csv(3)\fP. -.SH AUTHOR -Implementation of this function and associated library internals are based -on code, comments and feedback provided in November and December of 2008 by -Daniel Stenberg, Gregor Jasny, Phil Blundell and Yang Tse, December 2009 -by Cedric Bail, February 2010 by Jakub Hrozek. On March 2010 Yang Tse -shuffled all the bits and this function popped out. -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2008-2010 by Daniel Stenberg diff --git a/deps/cares/docs/ares_getaddrinfo.3 b/deps/cares/docs/ares_getaddrinfo.3 index 234e6568879b7c..5544ce20224eba 100644 --- a/deps/cares/docs/ares_getaddrinfo.3 +++ b/deps/cares/docs/ares_getaddrinfo.3 @@ -192,7 +192,3 @@ on each of the resolved addresses as per RFC6724. This function was added in c-ares 1.16.0, released in March 2020. .SH SEE ALSO .BR ares_freeaddrinfo (3) -.SH AUTHOR -Christian Ammer -.br -Andrew Selivanov <andrew.selivanov@gmail.com> diff --git a/deps/cares/docs/ares_gethostbyaddr.3 b/deps/cares/docs/ares_gethostbyaddr.3 index 8d79d903a5715d..cc4092285c0168 100644 --- a/deps/cares/docs/ares_gethostbyaddr.3 +++ b/deps/cares/docs/ares_gethostbyaddr.3 @@ -98,7 +98,3 @@ within the eventloop when notified. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyname (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_gethostbyname.3 b/deps/cares/docs/ares_gethostbyname.3 index 1067ac11006ecb..06d075ca6c5136 100644 --- a/deps/cares/docs/ares_gethostbyname.3 +++ b/deps/cares/docs/ares_gethostbyname.3 @@ -106,7 +106,3 @@ within the eventloop when notified. .SH SEE ALSO .BR ares_process (3), .BR ares_gethostbyaddr (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_gethostbyname_file.3 b/deps/cares/docs/ares_gethostbyname_file.3 index 98cb93fd8115cb..57dd7c43e95ebd 100644 --- a/deps/cares/docs/ares_gethostbyname_file.3 +++ b/deps/cares/docs/ares_gethostbyname_file.3 @@ -66,7 +66,3 @@ Added in c-ares 1.5.4 .BR ares_gethostbyname (3), .BR ares_free_hostent (3), .BR ares_init_options (3) -.SH AUTHOR -Brad Spencer -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_getnameinfo.3 b/deps/cares/docs/ares_getnameinfo.3 index b4161d4000f6ff..66b04f9efc11a7 100644 --- a/deps/cares/docs/ares_getnameinfo.3 +++ b/deps/cares/docs/ares_getnameinfo.3 @@ -145,7 +145,3 @@ will be .BR NULL . .SH SEE ALSO .BR ares_process (3), -.SH AUTHOR -Dominick Meglio -.br -Copyright 2005 by Dominick Meglio. diff --git a/deps/cares/docs/ares_getsock.3 b/deps/cares/docs/ares_getsock.3 index 126d7de69c038d..b5302a3906b58a 100644 --- a/deps/cares/docs/ares_getsock.3 +++ b/deps/cares/docs/ares_getsock.3 @@ -9,7 +9,7 @@ ares_getsock \- get socket descriptors to wait on (deprecated) .nf #include <ares.h> -int ares_getsock(ares_channel_t *\fIchannel\fP, ares_socket_t *\fIsocks\fP, +int ares_getsock(const ares_channel_t *\fIchannel\fP, ares_socket_t *\fIsocks\fP, int \fInumsocks\fP); .fi .SH DESCRIPTION diff --git a/deps/cares/docs/ares_inet_ntop.3 b/deps/cares/docs/ares_inet_ntop.3 index b5ae557a27e853..4a9f0049d31072 100644 --- a/deps/cares/docs/ares_inet_ntop.3 +++ b/deps/cares/docs/ares_inet_ntop.3 @@ -31,6 +31,4 @@ for IPv6). .BR ares_inet_pton (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 -.SH AUTHOR -Daniel Stenberg diff --git a/deps/cares/docs/ares_inet_pton.3 b/deps/cares/docs/ares_inet_pton.3 index ca95010b955531..34b2df063c6820 100644 --- a/deps/cares/docs/ares_inet_pton.3 +++ b/deps/cares/docs/ares_inet_pton.3 @@ -9,7 +9,7 @@ ares_inet_pton \- convert an IPv4 or IPv6 address from text to binary form .nf #include <ares.h> -const char *ares_inet_pton(int \fIaf\fP, const char *\fIsrc\fP, void *\fIdst\fP); +int ares_inet_pton(int \fIaf\fP, const char *\fIsrc\fP, void *\fIdst\fP); .fi .SH DESCRIPTION This is a portable version with the identical functionality of the commonly @@ -22,11 +22,14 @@ shall be supported. The \fBsrc\fP argument points to the string being passed in. The \fBdst\fP argument points to a buffer into which the function stores the numeric address; this shall be large enough to hold the numeric address (32 bits for AF_INET, 128 bits for AF_INET6). + +It returns 1 if the address was valid for the specified address family, or 0 +if the address was not parseable in the specified address family, or -1 if +some system error occurred (in which case errno will have been set). + .SH SEE ALSO .BR ares_init (3), .BR ares_inet_ntop (3) .SH AVAILABILITY made properly publicly available in c-ares for real in version 1.10.0 -.SH AUTHOR -Daniel Stenberg diff --git a/deps/cares/docs/ares_init_options.3 b/deps/cares/docs/ares_init_options.3 index 72889b5b4874ef..9b3b4815355659 100644 --- a/deps/cares/docs/ares_init_options.3 +++ b/deps/cares/docs/ares_init_options.3 @@ -11,6 +11,11 @@ ares_init_options, ares_init \- Initialize a resolver channel .nf #include <ares.h> +struct ares_server_failover_options { + unsigned short retry_chance; + size_t retry_delay; +}; + struct ares_options { int flags; int timeout; /* in seconds or milliseconds, depending on options */ @@ -36,6 +41,7 @@ struct ares_options { int maxtimeout; /* in milliseconds */ unsigned int qcache_max_ttl; /* in seconds */ ares_evsys_t evsys; + struct ares_server_failover_options server_failover_opts; }; int ares_init_options(ares_channel_t **\fIchannelptr\fP, @@ -124,27 +130,35 @@ v1.22, this is on by default if flags are otherwise not set. .B ARES_FLAG_NO_DFLT_SVR Do not attempt to add a default local named server if there are no other servers available. Instead, fail initialization with \fIARES_ENOSERVER\fP. +.TP 23 +.B ARES_FLAG_DNS0x20 +Enable support for DNS 0x20 as per https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 +which adds additional entropy to the request by randomizing the case of the +query name. Integrators need to ensure they treat DNS name responses as +case-insensitive. In rare circumstances this may cause the inability to lookup +certain domains if the upstream server or the authoritative server for the +domain is non-compliant. .RE .TP 18 .B ARES_OPT_TIMEOUT .B int \fItimeout\fP; .br The number of seconds each name server is given to respond to a query on the -first try. (After the first try, the timeout algorithm becomes more -complicated, but scales linearly with the value of \fItimeout\fP.) The -default is two seconds. This option is being deprecated by -\fIARES_OPT_TIMEOUTMS\fP starting in c-ares 1.5.2. +first try. See \fIARES_OPT_TIMEOUTMS\fP which this value is converted into. .TP 18 .B ARES_OPT_TIMEOUTMS .B int \fItimeout\fP; .br The number of milliseconds each name server is given to respond to a query on -the first try. (After the first try, the timeout algorithm becomes more -complicated, but scales linearly with the value of \fItimeout\fP.) The -default is two seconds. Note that this option is specified with the same -struct field as the former \fIARES_OPT_TIMEOUT\fP, it is but the option bits -that tell c-ares how to interpret the number. This option was added in c-ares -1.5.2. +the first try of any given server. The default is two seconds, however any +value below 250ms will automatically be set to 250ms (roughly the RTT half-way +around the world). Note that this option is specified with the same struct field +as the former \fIARES_OPT_TIMEOUT\fP, it is but the option bits that tell c-ares +how to interpret the number. This option was added in c-ares 1.5.2. + +As of c-ares 1.32.0, this option is only honored on the first successful query +to any given server, after that the timeout is automatically calculated based +on prior query history. .TP 18 .B ARES_OPT_TRIES .B int \fItries\fP; @@ -221,7 +235,9 @@ The value of .I sock_state_cb_data will be passed as the .I data -argument. +argument. The channel lock is held during this callback, if in a multithreaded +application, care must be taken to ensure lock order is correct to be able to +handle this and avoid deadlocks. Cannot be used with \fBARES_OPT_EVENT_THREAD\fP. .TP 18 @@ -285,13 +301,15 @@ or less will be considered unlimited, and is the default. .B ARES_OPT_QUERY_CACHE .B unsigned int \fIqcache_max_ttl\fP; .br -Enable the built-in query cache. Will cache queries based on the returned TTL -in the DNS message. Only fully successful and NXDOMAIN query results will be -cached. Fill in the \fIqcache_max_ttl\fP with the maximum number of seconds -a query result may be cached which will override a larger TTL in the response -message. This must be a non-zero value otherwise the cache will be disabled. -Choose a reasonable value for your application such as 300 (5 minutes) or -3600 (1 hour). +As of c-ares 1.31.0, the query cache is enabled by default with a TTL of 1hr. +To disable the query cache, specify this option with a TTL of 0. The query +cache is based on the returned TTL in the DNS message. Only fully successful +and NXDOMAIN query results will be cached. Fill in the \fIqcache_max_ttl\fP +with the maximum number of seconds a query result may be cached which will +override a larger TTL in the response message. This must be a non-zero value +otherwise the cache will be disabled. Choose a reasonable value for your +application such as 300 (5 minutes) or 3600 (1 hour). The query cache is +automatically flushed if a server configuration change is made. .br .TP 18 .B ARES_OPT_EVENT_THREAD @@ -309,6 +327,9 @@ When enabled, the integrator is no longer responsible for notifying c-ares of any events on the file descriptors, so \fIares_process(3)\fP nor \fIares_process_fd(3)\fP should ever be called when this option is enabled. +As of c-ares 1.29.0, when enabled, it will also automatically re-load the +system configuration when changes are detected. + Use \fIares_threadsafety(3)\fP to determine if this option is available to be used. @@ -316,6 +337,25 @@ Returns \fBARES_ENOTIMP\fP if this option is passed but not available, and \fBARES_ESERVFAIL\fP if there is a critical failure during initialization of the event thread. .br +.TP 18 +.B ARES_OPT_SERVER_FAILOVER +.B struct ares_server_failover_options \fIserver_failover_opts\fP; +.br +Configure server failover retry behavior. When a DNS server fails to +respond to a query, c-ares will deprioritize the server. On subsequent +queries, servers with fewer consecutive failures will be selected in +preference. However, in order to detect when such a server has recovered, +c-ares will occasionally retry failed servers by probing with a copy of +the query, without affecting the latency of the actual requested query. The +\fIares_server_failover_options\fP structure contains options to control this +behavior. +The \fIretry_chance\fP field gives the probability (1/N) of retrying a +failed server on any given query. Setting to a value of 0 disables retries. +The \fIretry_delay\fP field gives the minimum delay in milliseconds that c-ares +will wait before retrying a specific failed server. +If this option is not specificed then c-ares will use a probability of 10% +and a minimum delay of 5 seconds. +.br .PP The \fIoptmask\fP parameter also includes options without a corresponding field in the @@ -328,7 +368,9 @@ for each resolution. .TP 23 .B ARES_OPT_NOROTATE Do not perform round-robin nameserver selection; always use the list of -nameservers in the same order. +nameservers in the same order. The default is not to rotate servers, however +the system configuration can specify the desire to rotate and this +configuration value can negate such a system configuration. .PP .SH RETURN VALUES @@ -371,9 +413,3 @@ manual page. .BR ares_set_servers (3), .BR ares_set_sortlist (3), .BR ares_threadsafety (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2010 by Daniel Stenberg. diff --git a/deps/cares/docs/ares_library_cleanup.3 b/deps/cares/docs/ares_library_cleanup.3 index 5eccdbc669df66..ff7d946faeb420 100644 --- a/deps/cares/docs/ares_library_cleanup.3 +++ b/deps/cares/docs/ares_library_cleanup.3 @@ -64,9 +64,3 @@ a do-nothing function on non-Win32/64 platforms. .SH SEE ALSO .BR ares_library_init (3), .BR ares_cancel (3) -.SH AUTHOR -Yang Tse -.PP -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2009 by Daniel Stenberg. diff --git a/deps/cares/docs/ares_library_init.3 b/deps/cares/docs/ares_library_init.3 index f77effb85651ed..1c30faf29fc381 100644 --- a/deps/cares/docs/ares_library_init.3 +++ b/deps/cares/docs/ares_library_init.3 @@ -96,9 +96,3 @@ a do-nothing function on non-Win32/64 platforms at this point. .SH SEE ALSO .BR ares_library_cleanup (3), .BR ares_strerror (3) -.SH AUTHOR -Yang Tse -.PP -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2004-2009 by Daniel Stenberg. diff --git a/deps/cares/docs/ares_library_init_android.3 b/deps/cares/docs/ares_library_init_android.3 index 590fad5c811858..bf132d84f3e8fd 100644 --- a/deps/cares/docs/ares_library_init_android.3 +++ b/deps/cares/docs/ares_library_init_android.3 @@ -124,8 +124,4 @@ This function was first introduced in c-ares version 1.15.0. .SH SEE ALSO .BR ares_library_init (3), .BR ares_library_cleanup (3), -.SH AUTHOR -John Schember -.PP -Copyright (C) 2017 by John Schember diff --git a/deps/cares/docs/ares_mkquery.3 b/deps/cares/docs/ares_mkquery.3 index 0075347a617926..2f42d169210fef 100644 --- a/deps/cares/docs/ares_mkquery.3 +++ b/deps/cares/docs/ares_mkquery.3 @@ -14,7 +14,8 @@ int ares_mkquery(const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, int *\fIbuflen\fP) .fi .SH DESCRIPTION -Deprecated function. See \fIares_create_query(3)\fP instead! +This function is deprecated as of c-ares 1.10, please use +\fIares_dns_record_create(3)\fP instead. The .B ares_mkquery @@ -73,7 +74,3 @@ Memory was exhausted. .BR ares_expand_name (3), .BR ares_dns_record (3), .BR ares_free_string (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998, 2000 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_parse_a_reply.3 b/deps/cares/docs/ares_parse_a_reply.3 index 91f6a3fd8d724c..f4a0e8bb917fed 100644 --- a/deps/cares/docs/ares_parse_a_reply.3 +++ b/deps/cares/docs/ares_parse_a_reply.3 @@ -61,9 +61,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_gethostbyname (3), .BR ares_free_hostent (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Andrew Selivanov <andrew.selivanov@gmail.com> -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_parse_aaaa_reply.3 b/deps/cares/docs/ares_parse_aaaa_reply.3 index cc11f23439209b..364766f0d1d926 100644 --- a/deps/cares/docs/ares_parse_aaaa_reply.3 +++ b/deps/cares/docs/ares_parse_aaaa_reply.3 @@ -61,9 +61,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_gethostbyname (3), .BR ares_free_hostent (3) -.SH AUTHOR -Dominick Meglio -.br -Copyright 2005 by Dominick Meglio. -.BR -Andrew Selivanov <andrew.selivanov@gmail.com> diff --git a/deps/cares/docs/ares_parse_caa_reply.3 b/deps/cares/docs/ares_parse_caa_reply.3 index 740562c1f288a7..489d420127ca09 100644 --- a/deps/cares/docs/ares_parse_caa_reply.3 +++ b/deps/cares/docs/ares_parse_caa_reply.3 @@ -156,5 +156,3 @@ This function was first introduced in c-ares version 1.17.0. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Danny Sonnenschein <my.card.god@web.de>, on behalf of platynum, https://platynum.ch diff --git a/deps/cares/docs/ares_parse_mx_reply.3 b/deps/cares/docs/ares_parse_mx_reply.3 index 1516389931e870..c5c03e1a242be1 100644 --- a/deps/cares/docs/ares_parse_mx_reply.3 +++ b/deps/cares/docs/ares_parse_mx_reply.3 @@ -63,5 +63,3 @@ This function was first introduced in c-ares version 1.7.2. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Jeremy Lal <kapouer@melix.org> diff --git a/deps/cares/docs/ares_parse_naptr_reply.3 b/deps/cares/docs/ares_parse_naptr_reply.3 index 0b8d5f17feced0..d970b39fc037ae 100644 --- a/deps/cares/docs/ares_parse_naptr_reply.3 +++ b/deps/cares/docs/ares_parse_naptr_reply.3 @@ -68,5 +68,3 @@ This function was first introduced in c-ares version 1.7.6. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Jakub Hrozek <jhrozek@redhat.com>, on behalf of Red Hat, Inc http://www.redhat.com diff --git a/deps/cares/docs/ares_parse_ns_reply.3 b/deps/cares/docs/ares_parse_ns_reply.3 index 6ab2d9b51e41d2..c380f93fadbb9c 100644 --- a/deps/cares/docs/ares_parse_ns_reply.3 +++ b/deps/cares/docs/ares_parse_ns_reply.3 @@ -51,5 +51,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_query (3), .BR ares_free_hostent (3) -.SH AUTHOR -Written by Vlad Dinulescu <vlad.dinulescu@avira.com>, on behalf of AVIRA Gmbh http://www.avira.com diff --git a/deps/cares/docs/ares_parse_ptr_reply.3 b/deps/cares/docs/ares_parse_ptr_reply.3 index 4432e9e3c9aa85..5bdc072693cbf2 100644 --- a/deps/cares/docs/ares_parse_ptr_reply.3 +++ b/deps/cares/docs/ares_parse_ptr_reply.3 @@ -57,7 +57,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_gethostbyaddr (3), .BR ares_free_hostent (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_parse_srv_reply.3 b/deps/cares/docs/ares_parse_srv_reply.3 index 3d8e8437a03821..2e394a4359512e 100644 --- a/deps/cares/docs/ares_parse_srv_reply.3 +++ b/deps/cares/docs/ares_parse_srv_reply.3 @@ -66,5 +66,3 @@ This function was first introduced in c-ares version 1.7.0. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Jakub Hrozek <jhrozek@redhat.com>, on behalf of Red Hat, Inc http://www.redhat.com diff --git a/deps/cares/docs/ares_parse_txt_reply.3 b/deps/cares/docs/ares_parse_txt_reply.3 index f85c67fad97db8..eb08a3fa6f4473 100644 --- a/deps/cares/docs/ares_parse_txt_reply.3 +++ b/deps/cares/docs/ares_parse_txt_reply.3 @@ -94,7 +94,3 @@ This function was first introduced in c-ares version 1.7.0. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Jakub Hrozek <jhrozek@redhat.com>, on behalf of Red Hat, Inc http://www.redhat.com -.PP -Amended by Fedor Indutny <fedor@indutny.com>, on behalf of PayPal, Inc https://www.paypal.com diff --git a/deps/cares/docs/ares_parse_uri_reply.3 b/deps/cares/docs/ares_parse_uri_reply.3 index 3044d4ad6f0590..ad32821edceca9 100644 --- a/deps/cares/docs/ares_parse_uri_reply.3 +++ b/deps/cares/docs/ares_parse_uri_reply.3 @@ -60,5 +60,3 @@ Memory was exhausted. .SH SEE ALSO .BR ares_query (3) .BR ares_free_data (3) -.SH AUTHOR -Written by Jan Petrasek <petrasek@tes.eu> diff --git a/deps/cares/docs/ares_process.3 b/deps/cares/docs/ares_process.3 index 94c98f60a3a744..ce45a60d6c07d4 100644 --- a/deps/cares/docs/ares_process.3 +++ b/deps/cares/docs/ares_process.3 @@ -4,65 +4,106 @@ .\" .TH ARES_PROCESS 3 "25 July 1998" .SH NAME -ares_process \- Process events for name resolution +ares_process_fds, ares_process_fd, ares_process \- Process events for name resolution .SH SYNOPSIS .nf #include <ares.h> -void ares_process(ares_channel_t *\fIchannel\fP, - fd_set *\fIread_fds\fP, - fd_set *\fIwrite_fds\fP) +/*! Events used by ares_fd_events_t */ +typedef enum { + ARES_FD_EVENT_NONE = 0, /*!< No events */ + ARES_FD_EVENT_READ = 1 << 0, /*!< Read event (including disconnect/error) */ + ARES_FD_EVENT_WRITE = 1 << 1 /*!< Write event */ +} ares_fd_eventflag_t; + +/*! Type holding a file descriptor and mask of events, used by + * ares_process_fds() */ +typedef struct { + ares_socket_t fd; /*!< File descriptor */ + unsigned int events; /*!< Mask of ares_fd_event_t */ +} ares_fd_events_t; + +typedef enum { + ARES_PROCESS_FLAG_NONE = 0, + ARES_PROCESS_FLAG_SKIP_NON_FD = 1 << 0 +} ares_process_flag_t; + + +ares_status_t ares_process_fds(ares_channel_t *\fIchannel\fP, + const ares_fd_events_t *\fIevents\fP, + size_t \fInevents\fP, + unsigned int \fIflags\fP) void ares_process_fd(ares_channel_t *\fIchannel\fP, ares_socket_t \fIread_fd\fP, ares_socket_t \fIwrite_fd\fP) + +void ares_process(ares_channel_t *\fIchannel\fP, + fd_set *\fIread_fds\fP, + fd_set *\fIwrite_fds\fP) + .fi .SH DESCRIPTION -The \fBares_process(3)\fP function handles input/output events and timeouts -associated with queries pending on the name service channel identified by -.IR channel . -The file descriptor sets pointed to by \fIread_fds\fP and \fIwrite_fds\fP -should have file descriptors set in them according to whether the file -descriptors specified by \fIares_fds(3)\fP are ready for reading and writing. -(The easiest way to determine this information is to invoke \fBselect(3)\fP -with a timeout no greater than the timeout given by \fIares_timeout(3)\fP). - -The \fBares_process(3)\fP function will invoke callbacks for pending queries -if they complete successfully or fail. - -\fBares_process_fd(3)\fP works the same way but acts and operates only on the -specific file descriptors (sockets) you pass in to the function. Use -ARES_SOCKET_BAD for "no action". This function is provided to allow users of -c-ares to avoid \fIselect(3)\fP in their applications and within c-ares. - -To only process possible timeout conditions without a socket event occurring, -one may pass NULL as the values for both \fIread_fds\fP and \fIwrite_fds\fP for -\fBares_process(3)\fP, or ARES_SOCKET_BAD for both \fIread_fd\fP and -\fIwrite_fd\fP for \fBares_process_fd(3)\fP. -.SH EXAMPLE -The following code fragment waits for all pending queries on a channel -to complete: +These functions must be used by integrators choosing not to use the +EventThread enabled via \fBARES_OPT_EVENT_THREAD\fP passed to +\fBares_init_options\fP. This assumes integrators already have their own +event loop handling event notifications for various file descriptors and +wish to do the same with their integration with c-ares. + +The \fBares_process_fds(3)\fP function handles input/output events on file +descriptors and timeouts associated with queries pending on the channel +identified by \fIchannel\fP. The file descriptors to be processed are passed +in an array of \fIares_fd_events_t\fP data structures in the \fIfd\fP member, +and events are a bitwise mask of \fIares_fd_eventflag_t\fP in the \fIevent\fP +member. This function can also be used to process timeouts by passing NULL +to the \fIevents\fP member with \fInevents\fP value of 0. Flags may also be +specified in the \fIflags\fP field and are defined in \fBares_process_flag_t\fP. + +\fBARES_PROCESS_FLAG_SKIP_NON_FD\fP can be specified to specifically skip any +processing unrelated to the file descriptor events passed in, examples include +timeout processing and cleanup handling. This is useful if an integrator +knows they will be sending multiple \fIares_process_fds(3)\fP requests and +wants to skip that extra processing. However, the integrator must send the +final request with the flag so that timeout and other processing gets performed +before their event loop waits on additional events. + +It is allowable to use an \fIares_fd_events_t\fP with \fIevents\fP member of +value \fIARES_FD_EVENT_NONE\fP (0) if there are no events for a given file +descriptor if an integrator wishes to simply maintain an array with all +possible file descriptors and update readiness via the \fIevent\fP member. + +This function will return \fIARES_ENOMEM\fP in out of memory conditions, +otherwise will return \fIARES_SUCCESS\fP. + +This function is recommended over \fBares_process_fd(3)\fP since it can +handle processing of multiple file descriptors at once, thus skipping repeating +additional logic such as timeout processing which would be required if calling +\fBares_process_fd(3)\fP for multiple file descriptors notified at the same +time. + +This function is typically used with the \fIARES_OPT_SOCK_STATE_CB\fP option. + +\fBares_timeout(3)\fP should be used to retrieve the desired timeout, and when +the timeout expires, the integrator must call \fBares_process_fds(3)\fP with +a NULL \fIevents\fP array. (or \fBares_process_fd(3)\fP with both sockets set +to \fIARES_SOCKET_BAD\fP). There is no need to do this if events are also +delivered for any file descriptors as timeout processing will automatically be +handled by any call to \fBares_process_fds(3)\fP or \fBares_process_fd(3)\fP. + +The \fBares_process_fd(3)\fP function is the same as \fBares_process_fds(3)\fP +except can only process a single read and write file descriptor at a time. +New integrators should use \fBares_process_fds(3)\fP if possible. + +The \fBares_process(3)\fP function works in the same manner, except it works +on \fIfd_sets\fP as is used by \fBselect(3)\fP and retrieved by +\fBares_fds(3)\fP. This method is deprecated and should not be used in modern +applications due to known limitations to the \fBselect(3)\fP implementation. + +.SH AVAILABILITY +\fBares_process_fds(3)\fP was introduced in c-ares 1.34.0. -.nf -int nfds, count; -fd_set readers, writers; -struct timeval tv, *tvp; - -while (1) { - FD_ZERO(&readers); - FD_ZERO(&writers); - nfds = ares_fds(channel, &readers, &writers); - if (nfds == 0) - break; - tvp = ares_timeout(channel, NULL, &tv); - count = select(nfds, &readers, &writers, NULL, tvp); - ares_process(channel, &readers, &writers); -} -.fi .SH SEE ALSO .BR ares_fds (3), -.BR ares_timeout (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. +.BR ares_timeout (3), +.BR ares_init_options (3) +with \fIARES_OPT_EVENT_THREAD\fP or \fIARES_OPT_SOCK_STATE_CB\fP diff --git a/deps/cares/docs/ares_process_fd.3 b/deps/cares/docs/ares_process_fd.3 new file mode 100644 index 00000000000000..94e50f41a91717 --- /dev/null +++ b/deps/cares/docs/ares_process_fd.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_process.3 diff --git a/deps/cares/docs/ares_process_fds.3 b/deps/cares/docs/ares_process_fds.3 new file mode 100644 index 00000000000000..94e50f41a91717 --- /dev/null +++ b/deps/cares/docs/ares_process_fds.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_process.3 diff --git a/deps/cares/docs/ares_process_pending_write.3 b/deps/cares/docs/ares_process_pending_write.3 new file mode 100644 index 00000000000000..90843341950bbb --- /dev/null +++ b/deps/cares/docs/ares_process_pending_write.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2023 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_set_pending_write_cb.3 diff --git a/deps/cares/docs/ares_query.3 b/deps/cares/docs/ares_query.3 index 24decf7009441b..3aa428b00bb813 100644 --- a/deps/cares/docs/ares_query.3 +++ b/deps/cares/docs/ares_query.3 @@ -152,8 +152,3 @@ will be non-NULL, otherwise they will be NULL. .SH SEE ALSO .BR ares_process (3), .BR ares_dns_record (3) - -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_queue.3 b/deps/cares/docs/ares_queue.3 index 1212e8d3f8c3cc..276d31f6088a7b 100644 --- a/deps/cares/docs/ares_queue.3 +++ b/deps/cares/docs/ares_queue.3 @@ -1,4 +1,5 @@ .\" +.\" Copyright 2024 by the c-ares project and its contributors .\" SPDX-License-Identifier: MIT .\" .TH ARES_QUEUE 3 "16 February 2024" @@ -9,7 +10,7 @@ c-ares queue status .nf #include <ares.h> -size_t ares_queue_active_queries(ares_channel_t *channel); +size_t ares_queue_active_queries(const ares_channel_t *channel); ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms); @@ -49,5 +50,3 @@ c-ares library to be built with threading support. .SH SEE ALSO .BR ares_init_options (3), .BR ares_threadsafety (3) -.SH AUTHOR -Copyright (C) 2024 The c-ares project and its members. diff --git a/deps/cares/docs/ares_reinit.3 b/deps/cares/docs/ares_reinit.3 index 0b037127990293..020af1dbebb0f4 100644 --- a/deps/cares/docs/ares_reinit.3 +++ b/deps/cares/docs/ares_reinit.3 @@ -1,4 +1,5 @@ .\" +.\" Copyright 2023 by the c-ares project and its contributors .\" SPDX-License-Identifier: MIT .\" .TH ARES_REINIT 3 "12 November 2023" @@ -20,10 +21,13 @@ Any existing queries will be automatically requeued if the server they are currently assigned to is removed from the system configuration. This function may cause additional file descriptors to be created, and existing -ones to be destroyed if server configuration has changed. If this is called from -a thread other than which the main program event loop is running, care needs to -be taken to ensure any file descriptor lists are updated immediately within -the eventloop. +ones to be destroyed if server configuration has changed. + +\Bares_reinit(3)\fP, when compiled with thread safety, will spawn a background +thread to read the configuration and apply it. It is crucial that developers +use the \fBARES_OPT_SOCK_STATE_CB\fP or \fBARES_OPT_EVENT_THREAD\fP so that +notifications of changes are alerted. If using \fBares_getsock(3)\fP or +\fBares_fds(3)\fP, no notification is possible which could cause a stall. .SH RETURN VALUES \fIares_reinit(3)\fP can return any of the following values: @@ -47,5 +51,3 @@ This function was first introduced in c-ares version 1.22.0. .BR ares_library_init (3), .BR ares_set_servers (3), .BR ares_threadsafety (3) -.SH AUTHOR -Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_save_options.3 b/deps/cares/docs/ares_save_options.3 index ae171dc4c21ea5..1a1fbfdc1c750e 100644 --- a/deps/cares/docs/ares_save_options.3 +++ b/deps/cares/docs/ares_save_options.3 @@ -9,7 +9,7 @@ ares_save_options \- Save configuration values obtained from initialized ares_ch .nf #include <ares.h> -int ares_save_options(ares_channel_t *\fIchannel\fP, +int ares_save_options(const ares_channel_t *\fIchannel\fP, struct ares_options *\fIoptions\fP, int *\fIoptmask\fP) .fi .SH DESCRIPTION @@ -36,7 +36,7 @@ The channel data was successfully stored The memory was exhausted .TP 15 .B ARES_ENODATA -The channel data identified by +The channel data identified by .IR channel were invalid. .SH NOTE @@ -58,7 +58,3 @@ used instead. .BR ares_dup (3) .SH AVAILABILITY ares_save_options(3) was added in c-ares 1.4.0 -.SH AUTHOR -Brad House -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_search.3 b/deps/cares/docs/ares_search.3 index 1a324b0ff47db5..66791b47e908fb 100644 --- a/deps/cares/docs/ares_search.3 +++ b/deps/cares/docs/ares_search.3 @@ -179,8 +179,3 @@ enqueuing of the query. .SH SEE ALSO .BR ares_process (3), .BR ares_dns_record (3) - -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3 index 010bb2579174bd..df3e3bbe4136b0 100644 --- a/deps/cares/docs/ares_send.3 +++ b/deps/cares/docs/ares_send.3 @@ -113,6 +113,9 @@ is being destroyed; the query will not be completed. .B ARES_ENOSERVER The query will not be completed because no DNS servers were configured on the channel. +.TP 19 +.B ARES_EBADQUERY +Misformatted DNS query. .PP The callback argument @@ -151,8 +154,3 @@ does not reflect as much about the response as for other query functions. .BR ares_process (3), .BR ares_search (3), .BR ares_dns_record (3) - -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_set_local_dev.3 b/deps/cares/docs/ares_set_local_dev.3 index 2289339768925f..621cf35184fe10 100644 --- a/deps/cares/docs/ares_set_local_dev.3 +++ b/deps/cares/docs/ares_set_local_dev.3 @@ -2,7 +2,7 @@ .\" Copyright 2010 by Ben Greear <greearb@candelatech.com> .\" SPDX-License-Identifier: MIT .\" -.TH ARES_SET_LOCAL_DEV 3 "30 June 2010" +.TH ARES_SET_LOCAL_DEV 3 "23 September 2024" .SH NAME ares_set_local_dev \- Bind to a specific network device when creating sockets. .SH SYNOPSIS @@ -15,14 +15,14 @@ void ares_set_local_dev(ares_channel_t *\fIchannel\fP, const char* \fIlocal_dev_ The \fBares_set_local_dev\fP function causes all future sockets to be bound to this device with SO_BINDTODEVICE. This forces communications to go over a certain interface, which can be useful on multi-homed machines. -This option is only supported on Linux, and root privileges are required -for the option to work. If SO_BINDTODEVICE is not supported or the -setsocktop call fails (probably because of permissions), the error is +This option is only supported on Linux, the interface must not be already bound to the +socket or the current effective user must have CAP_NET_RAW capability in the current +network namespace for the option to work. If SO_BINDTODEVICE is not supported or the +setsockopt call fails (probably because of permissions), the error is silently ignored. .SH SEE ALSO .BR ares_set_local_ip4 (3) .BR ares_set_local_ip6 (3) +.BR network_namespaces (7) .SH NOTES This function was added in c-ares 1.7.4 -.SH AUTHOR -Ben Greear diff --git a/deps/cares/docs/ares_set_local_ip4.3 b/deps/cares/docs/ares_set_local_ip4.3 index 83ad8b86c19cfb..e311255b68dabe 100644 --- a/deps/cares/docs/ares_set_local_ip4.3 +++ b/deps/cares/docs/ares_set_local_ip4.3 @@ -19,5 +19,3 @@ allows users to specify outbound interfaces when used on multi-homed systems. .BR ares_set_local_ip6 (3) .SH NOTES This function was added in c-ares 1.7.4 -.SH AUTHOR -Ben Greear diff --git a/deps/cares/docs/ares_set_local_ip6.3 b/deps/cares/docs/ares_set_local_ip6.3 index fafae8dc913ec2..a43d28007ef87c 100644 --- a/deps/cares/docs/ares_set_local_ip6.3 +++ b/deps/cares/docs/ares_set_local_ip6.3 @@ -20,5 +20,3 @@ systems. The \fIlocal_ip6\fP argument must be 16 bytes in length. .BR ares_set_local_ip4 (3) .SH NOTES This function was added in c-ares 1.7.4 -.SH AUTHOR -Ben Greear diff --git a/deps/cares/docs/ares_set_pending_write_cb.3 b/deps/cares/docs/ares_set_pending_write_cb.3 new file mode 100644 index 00000000000000..3c7712a69d96e4 --- /dev/null +++ b/deps/cares/docs/ares_set_pending_write_cb.3 @@ -0,0 +1,62 @@ +.\" +.\" Copyright 2024 by the c-ares project and its contributors +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_SET_NOTIFY_PENDING_WRITE_CALLBACK 3 "13 Aug 2024" +.SH NAME +ares_set_pending_write_cb, ares_process_pending_write \- Function +for setting a callback which is triggered when there is potential pending data +which needs to be written. +.SH SYNOPSIS +.nf +#include <ares.h> + +typedef void (*ares_pending_write_cb)(void *\fIdata\fP); + +void ares_set_pending_write_cb( + ares_channel_t *\fIchannel\fP, + ares_pending_write_cb \fIcallback\fP, + void *\fIuser_data\fP); + +void ares_process_pending_write(ares_channel_t *\fIchannel\fP); + +.fi + +.SH DESCRIPTION +The \fBares_set_pending_write_cb(3)\fP function sets a callback +function \fIcallback\fP in the given ares channel handle \fIchannel\fP that +is invoked whenever there is new pending TCP data to be written. Since TCP +is stream based, if there are multiple queries being enqueued back to back they +can be sent as one large buffer. Normally a \fBsend(2)\fP syscall operation +would be triggered for each query. + +When setting this callback, an event will be triggered when data is buffered, +but not written. This event is used to wake the caller's event loop which +should call \fBares_process_pending_write(3)\fP using the channel associated +with the callback. Each time the callback is triggered must result in a call +to \fBares_process_pending_write(3)\fP from the caller's event loop otherwise +stalls and timeouts may occur. The callback \fBmust not\fP call +\fBares_process_pending_write(3)\fP directly as otherwise it would invalidate +any advantage of this use-case. + +This is considered an optimization, especially when using TLS-based connections +which add additional overhead to the data stream. Due to the asyncronous nature +of c-ares, there is no way to identify when a caller may be finished enqueuing +queries via any of the possible public API calls such as +\fBares_getaddrinfo(3)\fP or \fBares_search_dnsrec(3)\fP, so this is an +enhancement to try to group query send operations together and will rely on the +singaling latency involved in waking the user's event loop. + +If no callback is set, data will be written immediately to the socket, thus +bypassing this optimization. + +This option cannot be used with \fIARES_OPT_EVENT_THREAD\fP passed to +\fBares_init_options(3)\fP since the user has no event loop. This optimization +is automatically enabled when using the Event Thread as it sets the callback +for its own internal signaling. + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.34.0. + +.SH SEE ALSO +.BR ares_init_options (3) diff --git a/deps/cares/docs/ares_set_server_state_callback.3 b/deps/cares/docs/ares_set_server_state_callback.3 new file mode 100644 index 00000000000000..04fbde4c7afa76 --- /dev/null +++ b/deps/cares/docs/ares_set_server_state_callback.3 @@ -0,0 +1,62 @@ +.\" +.\" Copyright 2024 by the c-ares project and its contributors +.\" SPDX-License-Identifier: MIT +.\" +.TH ARES_SET_SERVER_STATE_CALLBACK 3 "26 Apr 2024" +.SH NAME +ares_set_server_state_callback \- Function for setting a server state callback +.SH SYNOPSIS +.nf +#include <ares.h> + +typedef void (*ares_server_state_callback)(const char *\fIserver_string\fP, + ares_bool_t \fIsuccess\fP, + int \fIflags\fP, + void *\fIdata\fP); + +void ares_set_server_state_callback(ares_channel_t *\fIchannel\fP, + ares_server_state_callback \fIcallback\fP, + void *\fIuser_data\fP); +.fi + +.SH DESCRIPTION +The \fBares_set_server_state_callback(3)\fP function sets a callback function +\fIcallback\fP in the given ares channel handle \fIchannel\fP that is invoked +whenever a query on the channel completes. This includes both successful and +unsuccessful queries (including hard errors and timeouts). The callback +function is invoked with a number of parameters describing the query, as +follows. + +The \fIserver_string\fP parameter indicates the DNS server that was used for +the query, given as a string with the same format returned by +\fBares_get_servers_csv(3)\fP. + +The \fIsuccess\fP parameter indicates whether the query succeeded or not. It is +set to \fBARES_TRUE\fP on success and \fBARES_FALSE\fP on failure. + +The \fIflags\fP parameter is a bitmask of flags describing various aspects of +the query (for example whether the query used UDP or TCP). These are described +below. + +The \fIdata\fP parameter is a reference to the custom user data \fIuser_data\fP +that was passed to \fBares_set_server_state_callback(3)\fP when setting the +server state callback. + +The server state callback can be used by applications to monitor the state of +the DNS servers used by an ares channel. For example, it can be used to track +metrics about the numbers and types of queries sent to each server or to +detect when a server is uncontactable or unhealthy. + +.SH FLAGS +.TP 5 +.B ARES_SERV_STATE_UDP +Indicates that the query was tried over UDP. +.TP 5 +.B ARES_SERV_STATE_TCP +Indicates that the query was tried over TCP. + +.SH AVAILABILITY +This function was first introduced in c-ares version 1.29.0. + +.SH SEE ALSO +.BR ares_get_servers_csv (3) diff --git a/deps/cares/docs/ares_set_servers.3 b/deps/cares/docs/ares_set_servers.3 index 410c279c806a41..24ef7879e17612 100644 --- a/deps/cares/docs/ares_set_servers.3 +++ b/deps/cares/docs/ares_set_servers.3 @@ -84,13 +84,3 @@ server options. Use \fBares_set_servers_csv(3)\fP. .SH AVAILABILITY \fBares_set_servers(3)\fP was added in c-ares 1.7.1; \fBares_set_servers_ports(3)\fP was added in c-ares 1.11.0. -.SH AUTHOR -Implementation of this function and associated library internals are based -on code, comments and feedback provided in November and December of 2008 by -Daniel Stenberg, Gregor Jasny, Phil Blundell and Yang Tse, December 2009 -by Cedric Bail, February 2010 by Jakub Hrozek. On March 2010 Yang Tse -shuffled all the bits and this function popped out. -.br -Copyright 1998 by the Massachusetts Institute of Technology. -.br -Copyright (C) 2008-2010 by Daniel Stenberg diff --git a/deps/cares/docs/ares_set_servers_csv.3 b/deps/cares/docs/ares_set_servers_csv.3 index 7d37a90fa43c65..f1435143f567a4 100644 --- a/deps/cares/docs/ares_set_servers_csv.3 +++ b/deps/cares/docs/ares_set_servers_csv.3 @@ -14,7 +14,7 @@ int ares_set_servers_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\f int ares_set_servers_ports_csv(ares_channel_t *\fIchannel\fP, const char* \fIservers\fP) -char *ares_get_servers_csv(ares_channel_t *\fIchannel\fP) +char *ares_get_servers_csv(const ares_channel_t *\fIchannel\fP) .fi .SH DESCRIPTION The \fBares_set_servers_csv\fP and \fBares_set_servers_ports_csv\fP functions set @@ -29,11 +29,18 @@ simulation but unlikely to be useful in production. The \fBares_get_servers_csv\fP retrieves the list of servers in comma delimited format. -The input and output format is a comma separated list of servers. Each server -entry may contain these forms: +The input and output format is a comma separated list of servers. Two formats +are available, the typical \fBresolv.conf(5)\fP \fInameserver\fP format, as +well as a \fIURI\fP format. Both formats can be used at the same time in the +provided CSV string. + +The \fInameserver\fP format is: +.nf ip[:port][%iface] +.fi +.RS 4 The \fBip\fP may be encapsulated in square brackets ([ ]), and must be if using ipv6 and also specifying a port. @@ -42,16 +49,88 @@ The \fBport\fP is optional, and will default to 53 or the value specified in The \fBiface\fP is specific to IPv6 link-local servers (fe80::/10) and should not otherwise be used. +.RE + +\fInameserver\fP format examples: +.nf + +192.168.1.100 +192.168.1.101:53 +[1:2:3::4]:53 +[fe80::1]:53%eth0 + +.fi +.PP + +The \fIURI\fP format is is made up of these defined schemes: +.RS 4 +\fIdns://\fP - Normal DNS server (UDP + TCP). We need to be careful not to +conflict with query params defined in RFC4501 since we'd technically be +extending this URI scheme. Port defaults to 53. + +\fIdns+tls://\fP - DNS over TLS. Port defaults to 853. + +\fIdns+https://\fP - DNS over HTTPS. Port defaults to 443. +.RE + +.PP +Query parameters are defined as below. Additional parameters may be defined +in the future. + +.RS 4 +\fItcpport\fP - TCP port to use, only for \fIdns://\fP scheme. The port +specified as part of the authority component of the URI will be used for both +UDP and TCP by default, this option will override the TCP port. + +\fIipaddr\fP - Only for \fIdns+tls://\fP and \fIdns+https://\fP. If the +authority component of the URI contains a hostname, this is used to specify the +ip address of the hostname. If not specified, will need to use a non-secure +server to perform a DNS lookup to retrieve this information. It is always +recommended to have both the ip address and fully qualified domain name +specified. + +\fIhostname\fP - Only for \fIdns+tls://\fP and \fIdns+https://\fP. If the +authority component of the URI contains an ip address, this is used to specify +the fully qualified domain name of the server. If not specified, will need to +use a non-secure server to perform a DNS reverse lookup to retrieve this +information. It is always recommended to have both the ip address and fully +qualified domain name specified. + +\fIdomain\fP - If specified, this server is a domain-specific server. Any +queries for this domain will be routed to this server. Multiple servers may be +tagged with the same domain. +.RE + +\fIURI\fP format Examples: +.nf -For example: +dns://8.8.8.8 +dns://[2001:4860:4860::8888] +dns://[fe80::b542:84df:1719:65e3%en0] +dns://192.168.1.1:55 +dns://192.168.1.1?tcpport=1153 +dns://10.0.1.1?domain=myvpn.com +dns+tls://8.8.8.8?hostname=dns.google +dns+tls://one.one.one.one?ipaddr=1.1.1.1 + +.fi + +\fBNOTE\fP: While we are defining the scheme for things like domain-specific +servers, DNS over TLS and DNS over HTTPS, the underlying implementations for +those features do not yet exist and therefore will result in errors if they are +attempted to be used. -192.168.1.100,192.168.1.101:53,[1:2:3::4]:53,[fe80::1]:53%eth0 .PP As of c-ares 1.24.0, \fBares_set_servers_csv\fP and \fBares_set_servers_ports_csv\fP are identical. Prior versions would simply omit ports in \fBares_set_servers_csv\fP but due to the addition of link local interface support, this difference was removed. +.SH EXAMPLE +.nf +192.168.1.100,[fe80::1]:53%eth0,dns://192.168.1.1?tcpport=1153 +.fi + .SH RETURN VALUES .B ares_set_servers_csv(3) and @@ -81,5 +160,4 @@ returns a string representing the servers configured which must be freed with \fBares_set_servers_csv\fP was added in c-ares 1.7.2 \fBares_set_servers_ports_csv\fP was added in c-ares 1.11.0. \fBares_get_servers_csv\fP was added in c-ares 1.24.0. -.SH AUTHOR -Ben Greear +\fIURI\fP support was added in c-ares 1.34.0. diff --git a/deps/cares/docs/ares_set_socket_callback.3 b/deps/cares/docs/ares_set_socket_callback.3 index 4eb04084e9a11d..d94b9885357a5e 100644 --- a/deps/cares/docs/ares_set_socket_callback.3 +++ b/deps/cares/docs/ares_set_socket_callback.3 @@ -31,6 +31,4 @@ abort the ares operation. .BR ares_set_socket_configure_callback (3) .SH AVAILABILITY ares_set_socket_callback(3) was added in c-ares 1.6.0 -.SH AUTHOR -Gregor Jasny diff --git a/deps/cares/docs/ares_set_socket_configure_callback.3 b/deps/cares/docs/ares_set_socket_configure_callback.3 index f5d7bb5d507d2f..d26e79f43f631a 100644 --- a/deps/cares/docs/ares_set_socket_configure_callback.3 +++ b/deps/cares/docs/ares_set_socket_configure_callback.3 @@ -31,6 +31,4 @@ abort the ares operation. .BR ares_set_socket_callback (3) .SH AVAILABILITY ares_set_socket_configure_callback(3) was added in c-ares 1.11.0 -.SH AUTHOR -Andrew Ayer diff --git a/deps/cares/docs/ares_set_socket_functions.3 b/deps/cares/docs/ares_set_socket_functions.3 index c92934ba82e5e3..8a903dc6521607 100644 --- a/deps/cares/docs/ares_set_socket_functions.3 +++ b/deps/cares/docs/ares_set_socket_functions.3 @@ -1,12 +1,63 @@ .\" Copyright (C) Daniel Stenberg .\" SPDX-License-Identifier: MIT -.TH ARES_SET_SOCKET_FUNCTIONS 3 "13 Dec 2016" +.TH ARES_SET_SOCKET_FUNCTIONS 3 "8 Oct 2024" .SH NAME -ares_set_socket_functions \- Set socket io callbacks +ares_set_socket_functions, ares_set_socket_functions_ex \- Set socket io callbacks .SH SYNOPSIS .nf #include <ares.h> +typedef enum { + ARES_SOCKFUNC_FLAG_NONBLOCKING = 1 << 0 +} ares_sockfunc_flags_t; + +typedef enum { + ARES_SOCKET_OPT_SENDBUF_SIZE, + ARES_SOCKET_OPT_RECVBUF_SIZE, + ARES_SOCKET_OPT_BIND_DEVICE, + ARES_SOCKET_OPT_TCP_FASTOPEN +} ares_socket_opt_t; + +typedef enum { + ARES_SOCKET_CONN_TCP_FASTOPEN = 1 << 0 +} ares_socket_connect_flags_t; + +typedef enum { + ARES_SOCKET_BIND_TCP = 1 << 0, + ARES_SOCKET_BIND_CLIENT = 1 << 1 +} ares_socket_bind_flags_t; + +struct ares_socket_functions_ex { + unsigned int version; /* ABI Version: must be "1" */ + unsigned int flags; + + ares_socket_t (*asocket)(int domain, int type, int protocol, void *user_data); + int (*aclose)(ares_socket_t sock, void *user_data); + int (*asetsockopt)(ares_socket_t sock, ares_socket_opt_t opt, const void *val, + ares_socklen_t val_size, void *user_data); + int (*aconnect)(ares_socket_t sock, const struct sockaddr *address, + ares_socklen_t address_len, unsigned int flags, + void *user_data); + ares_ssize_t (*arecvfrom)(ares_socket_t sock, void *buffer, size_t length, + int flags, struct sockaddr *address, + ares_socklen_t *address_len, void *user_data); + ares_ssize_t (*asendto)(ares_socket_t sock, const void *buffer, size_t length, + int flags, const struct sockaddr *address, + ares_socklen_t address_len, void *user_data); + int (*agetsockname)(ares_socket_t sock, struct sockaddr *address, + ares_socklen_t *address_len, void *user_data); + int (*abind)(ares_socket_t sock, unsigned int flags, + const struct sockaddr *address, socklen_t address_len, + void *user_data); + unsigned int (*aif_nametoindex)(const char *ifname, void *user_data); + const char *(*aif_indextoname)(unsigned int ifindex, char *ifname_buf, + size_t ifname_buf_len, void *user_data); +}; + +ares_status_t ares_set_socket_functions_ex(ares_channel_t *channel, + const struct ares_socket_functions_ex *funcs, void *user_data); + + struct ares_socket_functions { ares_socket_t (*\fIasocket\fP)(int, int, int, void *); int (*\fIaclose\fP)(ares_socket_t, void *); @@ -22,82 +73,262 @@ void ares_set_socket_functions(ares_channel_t *\fIchannel\fP, .fi .SH DESCRIPTION .PP -This function sets a set of callback \fIfunctions\fP in the given ares channel handle. -Cannot be used when \fBARES_OPT_EVENT_THREAD\fP is passed to \fIares_init_options(3)\fP. - -These callback functions will be invoked to create/destroy socket objects and perform -io, instead of the normal system calls. A client application can override normal network -operation fully through this functionality, and provide its own transport layer. You -can choose to only implement some of the socket functions, and provide NULL to any -others and c-ares will use its built-in system functions in that case. + +\fBares_set_socket_functions_ex(3)\fP sets a set of callback \fIfunctions\fP in +the given ares channel handle. Cannot be used when \fBARES_OPT_EVENT_THREAD\fP +is passed to \fIares_init_options(3)\fP. This function replaces the now +deprecated \fBares_set_socket_functions(3)\fP call. + +These callback functions will be invoked to create/destroy socket objects and +perform io, instead of the normal system calls. A client application can +override normal network operation fully through this functionality, and provide +its own transport layer. + +Some callbacks may be optional and are documented as such below, but failing +to implement such callbacks will disable certain features within c-ares. It +is strongly recommended to implement all callbacks. + +All callback functions are expected to operate like their system equivalents, +and to set \fBerrno(2)\fP or \fBWSASetLastError(2)\fP to an appropriate error +code on failure. It is strongly recommended that io callbacks are implemented +to be asynchronous and indicated as such in the \fIflags\fP member. The io +callbacks can return error codes of \fBEAGAIN\fP, \fBEWOULDBLOCK\fP, or +\fBWSAEWOULDBLOCK\fP when they would otherwise block. + +The \fIuser_data\fP value is provided to each callback function invocation to +serve as context. + +The \fBares_set_socket_functions_ex(3)\fP must provide the following structure +members and callbacks (which are different from the +\fBares_set_socket_functions(3)\fP members and callbacks): + +.RS 4 +.TP 8 +.B unsigned int \fIversion\fP +.br +ABI Version of structure. Must be set to a value of "1". + +.TP 8 +.B unsigned int \fIflags\fP +.br +Flags available are specified in \fIares_sockfunc_flags_t\fP. + +.TP 8 +.B ares_socket_t (*\fIasocket\fP)(int \fIdomain\fP, int \fItype\fP, int \fIprotocol\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Creates an endpoint for communication and returns a descriptor. \fIdomain\fP, +\fItype\fP, and \fIprotocol\fP each correspond to the parameters of +\fBsocket(2)\fP. Returns a handle to the newly created socket, or +\fBARES_SOCKET_BAD\fP on error. + +.TP 8 +.B int (*\fIaclose\fP)(ares_socket_t \fIfd\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Closes the socket endpoint indicated by \fIfd\fP. See \fBclose(2)\fP. + +.TP 8 +.B int (*\fIasetsockopt\fP)(ares_socket_t \fIfd\fP, ares_socket_opt_t \fIopt\fP, const void * \fIval\fP, ares_socklen_t \fIval_size\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Set socket option. This shares a similar syntax to the BSD \fIsetsockopt(2)\fP +call, however c-ares uses different options for portability. The value is +a pointer to the desired value, and each option has its own data type listed +in the options below defined in \fIares_socket_opt_t\fP. + +.TP 8 +.B int (*\fIaconnect\fP)(ares_socket_t \fIfd\fP, const struct sockaddr * \fIaddr\fP, ares_socklen_t \fIaddr_len\fP, unsigned int \fIflags\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Initiate a connection to the address indicated by \fIaddr\fP on +a socket. Additional flags controlling behavior are in +\fIares_socket_connect_flags_t\fP. See \fBconnect(2)\fP. + +.TP 8 +.B ares_ssize_t (*\fIarecvfrom\fP)(ares_socket_t \fIfd\fP, void * \fIbuffer\fP, size_t \fIbuf_size\fP, int \fIflags\fP, struct sockaddr * \fIaddr\fP, ares_socklen_t * \fIaddr_len\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Receives data from remote socket endpoint, if available. If the +\fIaddr\fP parameter is not NULL and the connection protocol provides the source +address, the callback should fill this in. The \fIflags\fP parameter is +currently unused. See \fBrecvfrom(2)\fP. + +.TP 8 +.B ares_ssize_t (*\fIasendto\fP)(ares_socket_t \fIfd\fP, const void * \fIbuffer\fP, size_t \fIlength\fP, int \fIflags\fP, const struct sockaddr * \fIaddress\fP, ares_socklen_t \fIaddress_len\fP, void * \fIuser_data\fP) +.br +\fIREQUIRED\fP. Send data, as provided by the \fIbuffer\fP, to the socket +endpoint. The \fIflags\fP member may be used on systems that have +\fBMSG_NOSIGNAL\fP defined but is otherwise unused. An \fIaddress\fP is +provided primarily to support TCP FastOpen scenarios, which will be NULL in +other circumstances. See \fBsendto(2)\fP. + +.TP 8 +.B int (*\fIagetsockname\fP)(ares_socket_t \fIfd\fP, struct sockaddr * \fIaddress\fP, ares_socklen_t * \fIaddress_len\fP, void * \fIuser_data\fP) +.br +\fIOptional\fP. Retrieve the local address of a socket and store it into the provided +\fIaddress\fP buffer. May impact DNS Cookies if not provided. See +\fBgetsockname(2)\fP. + +.TP 8 +.B int (*\fIabind\fP)(ares_socket_t \fIfd\fP, unsigned int \fIflags\fP, const struct sockaddr * \fIaddress\fP, ares_socklen_t \fIaddress_len\fP, void * \fIuser_data\fP) +.br +\fIOptional\fP. Bind the socket to an address. This can be used for client +connections to bind the source address for packets before connect, or +for server connections to bind to an address and port before listening. +Currently c-ares only supports client connections. \fIflags\fP from +\fIares_socket_bind_flags_t\fP can be specified. See \fBbind(2)\fP. + +.TP 8 +.B unsigned int (*\fIaif_nametoindex\fP)(const char * \fIifname\fP, void * \fIuser_data\fP) +.br +\fIOptional\fP. Convert an interface name into the interface index. If this +callback is not specified, then IPv6 Link-Local DNS servers cannot be used. +See \fBif_nametoindex(2)\fP. + +.TP 8 +.B const char * (*\fIaif_indextoname\fP)(unsigned int \fIifindex\fP, char * \fIifname_buf\fP, size_t \fIifname_buf_len\fP, void * \fIuser_data\fP) +.br +\fIOptional\fP. Convert an interface index into the interface name. If this +callback is not specified, then IPv6 Link-Local DNS servers cannot be used. +\fIifname_buf\fP must be at least \fBIF_NAMESIZE\fP or \fBIFNAMSIZ\fP in size. +See \fBif_indextoname(2)\fP. +.RE + +.PP +\fBares_sockfunc_flags_t\fP values: + +.RS 4 +.TP 8 +.B \fIARES_SOCKFUNC_FLAG_NONBLOCKING\fP +.br +Used to indicate the implementation of the io functions are asynchronous. +.RE + +.PP +\fBares_socket_opt_t\fP values: + +.RS 4 +.TP 8 +.B \fIARES_SOCKET_OPT_SENDBUF_SIZE\fP +.br +Set the Send Buffer size. Value is a pointer to an int. (SO_SNDBUF). + +.TP 8 +.B \fIARES_SOCKET_OPT_RECVBUF_SIZE\fP +.br +Set the Receive Buffer size. Value is a pointer to an int. (SO_RCVBUF). + +.TP 8 +.B \fIARES_SOCKET_OPT_BIND_DEVICE\fP +.br +Set the network interface to use as the source for communication. Value is a C +string. (SO_BINDTODEVICE) + +.TP 8 +.B \fIARES_SOCKET_OPT_TCP_FASTOPEN\fP +.br +Enable TCP Fast Open. Value is a pointer to an \fIares_bool_t\fP. On some +systems this could be a no-op if it is known it is on by default and +return success. Other systems may be a no-op if known the system does +not support the feature and returns failure with errno set to \fBENOSYS\fP or +\fBWSASetLastError(WSAEOPNOTSUPP);\fP. +.RE + +.PP +\fBares_socket_connect_flags_t\fP values: +.RS 4 +.TP 8 +.B \fIARES_SOCKET_CONN_TCP_FASTOPEN\fP +.br +Connect using TCP Fast Open. +.RE + +.PP +\fBares_socket_bind_flags_t\fP values: + +.RS 4 +.TP 8 +.B \fIARES_SOCKET_BIND_TCP\fP +.br +Bind is for a TCP connection. + +.TP 19 +.B \fIARES_SOCKET_BIND_CLIENT\fP +.br +Bind is for a client connection, not server. +.RE + +.PP + +\fBares_set_socket_functions(3)\fP sets a set of callback \fIfunctions\fP in the +given ares channel handle. Cannot be used when \fBARES_OPT_EVENT_THREAD\fP is +passed to \fIares_init_options(3)\fP. This function is deprecated as of +c-ares 1.34.0 in favor of \fIares_set_socket_functions_ex(3)\fP. + +\fBares_set_socket_functions(3)\fP allows you to choose to only implement +some of the socket functions, and provide NULL to any others and c-ares will use +its built-in system functions in that case. + .PP -All callback functions are expected to operate like their system equivalents, and to -set -.BR errno(3) -to an appropriate error code on failure. C-ares also expects all io functions to behave -asynchronously, i.e. as if the socket object has been set to non-blocking mode. Thus -read/write calls (for TCP connections) are expected to often generate -.BR EAGAIN -or -.BR EWOULDBLOCK. +All callback functions are expected to operate like their system equivalents, +and to set \fBerrno(2)\fP or \fBWSASetLastError(2)\fP to an appropriate error +code on failure. It is strongly recommended all io functions behave +asynchronously and return error codes of \fBEAGAIN\fP, \fBEWOULDBLOCK\fP, or +\fBWSAEWOULDBLOCK\fP when they would otherwise block. .PP -The \fIuser_data\fP value is provided to each callback function invocation to serve as -context. +The \fIuser_data\fP value is provided to each callback function invocation to +serve as context. .PP -The -.B ares_socket_functions -must provide the following callbacks: -.TP 18 -.B \fIasocket\fP -.B ares_socket_t(*)(int \fIdomain\fP, int \fItype\fP, int \fIprotocol\fP, void * \fIuser_data\fP) +The \fBares_set_socket_functions(3)\fP must provide the following callbacks (which +are different from the \fBares_set_socket_functions_ex(3)\fP callbacks): + +.RS 4 +.TP 8 +.B ares_socket_t (*\fIasocket\fP)(int \fIdomain\fP, int \fItype\fP, int \fIprotocol\fP, void * \fIuser_data\fP) .br Creates an endpoint for communication and returns a descriptor. \fIdomain\fP, \fItype\fP, and \fIprotocol\fP -each correspond to the parameters of -.BR socket(2). -Returns ahandle to the newly created socket, or -1 on error. -.TP 18 -.B \fIaclose\fP -.B int(*)(ares_socket_t \fIfd\fP, void * \fIuser_data\fP) -.br -Closes the socket endpoint indicated by \fIfd\fP. See -.BR close(2) -.TP 18 -.B \fIaconnect\fP -.B int(*)(ares_socket_t \fIfd\fP, const struct sockaddr * \fIaddr\fP, ares_socklen_t \fIaddr_len\fP, void * \fIuser_data\fP) +each correspond to the parameters of \fBsocket(2)\fP. Returns ahandle to the +newly created socket, or ARES_SOCKET_BAD on error. + +.TP 8 +.B int (*\fIaclose\fP)(ares_socket_t \fIfd\fP, void * \fIuser_data\fP) +.br +Closes the socket endpoint indicated by \fIfd\fP. See \fBclose(2)\fP. + +.TP 8 +.B int (*\fIaconnect\fP)(ares_socket_t \fIfd\fP, const struct sockaddr * \fIaddr\fP, ares_socklen_t \fIaddr_len\fP, void * \fIuser_data\fP) .br Initiate a connection to the address indicated by \fIaddr\fP on a socket. See -.BR connect(2) +\fBconnect(2)\fP -.TP 18 -.B \fIarecvfrom\fP -.B ares_ssize_t(*)(ares_socket_t \fIfd\fP, void * \fIbuffer\fP, size_t \fIbuf_size\fP, int \fIflags\fP, struct sockaddr * \fIaddr\fP, ares_socklen_t * \fIaddr_len\fP, void * \fIuser_data\fP) +.TP 8 +.B ares_ssize_t (*\fIarecvfrom\fP)(ares_socket_t \fIfd\fP, void * \fIbuffer\fP, size_t \fIbuf_size\fP, int \fIflags\fP, struct sockaddr * \fIaddr\fP, ares_socklen_t * \fIaddr_len\fP, void * \fIuser_data\fP) .br -Receives data from remote socket endpoint, if available. If the \fIaddr\fP parameter is not NULL and the connection protocol provides the source address, the callback should fill this in. See -.BR recvfrom(2) +Receives data from remote socket endpoint, if available. If the \fIaddr\fP +parameter is not NULL and the connection protocol provides the source address, +the callback should fill this in. See \fBrecvfrom(2)\fP -.TP 18 -.B \fIasendv\fP -.B ares_ssize_t(*)(ares_socket_t \fIfd\fP, const struct iovec * \fIdata\fP, int \fIlen\fP, void * \fIuser_data\fP) +.TP 8 +.B ares_ssize_t (*\fIasendv\fP)(ares_socket_t \fIfd\fP, const struct iovec * \fIdata\fP, int \fIlen\fP, void * \fIuser_data\fP) .br -Send data, as provided by the iovec array \fIdata\fP, to the socket endpoint. See -.BR writev(2), +Send data, as provided by the iovec array \fIdata\fP, to the socket endpoint. +See \fBwritev(2)\fP +.RE .PP -The -.B ares_socket_functions -struct provided is not copied but directly referenced, -and must thus remain valid through out the channels and any created socket's lifetime. +The \fBares_set_socket_functions(3)\fP struct provided is not copied but directly +referenced, and must thus remain valid through out the channels and any created +socket's lifetime. However, the \fBares_set_socket_functions_ex(3)\fP struct is +duplicated and does not need to survive past the call to the function. + .SH AVAILABILITY -Added in c-ares 1.13.0 +ares_socket_functions added in c-ares 1.13.0, ares_socket_functions_ex added in +c-ares 1.34.0 .SH SEE ALSO .BR ares_init_options (3), .BR socket (2), .BR close (2), .BR connect (2), -.BR recv (2), .BR recvfrom (2), -.BR send (2), +.BR sendto (2), +.BR bind (2), +.BR getsockname (2), +.BR setsockopt (2), .BR writev (2) -.SH AUTHOR -Carl Wilund diff --git a/deps/cares/docs/ares_set_socket_functions_ex.3 b/deps/cares/docs/ares_set_socket_functions_ex.3 new file mode 100644 index 00000000000000..a0f02456c320cb --- /dev/null +++ b/deps/cares/docs/ares_set_socket_functions_ex.3 @@ -0,0 +1,3 @@ +.\" Copyright (C) 2024 The c-ares project and its contributors. +.\" SPDX-License-Identifier: MIT +.so man3/ares_set_socket_functions.3 diff --git a/deps/cares/docs/ares_strerror.3 b/deps/cares/docs/ares_strerror.3 index 32eab05f311119..895af5f3e97311 100644 --- a/deps/cares/docs/ares_strerror.3 +++ b/deps/cares/docs/ares_strerror.3 @@ -20,7 +20,3 @@ returning the result as a NUL-terminated C string. .SH NOTES This function is not compatible with ares, it takes a different set of arguments. -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/docs/ares_threadsafety.3 b/deps/cares/docs/ares_threadsafety.3 index a3c29d5f6ecea5..d9c38d801ef483 100644 --- a/deps/cares/docs/ares_threadsafety.3 +++ b/deps/cares/docs/ares_threadsafety.3 @@ -1,4 +1,5 @@ .\" +.\" Copyright 2023 by the c-ares project and its contributors .\" SPDX-License-Identifier: MIT .\" .TH ARES_THREADSAFETY 3 "26 November 2023" @@ -41,5 +42,3 @@ This function was first introduced in c-ares version 1.23.0. .BR ares_dup (3), .BR ares_library_init (3), .BR ares_set_servers (3) -.SH AUTHOR -Copyright (C) 2023 The c-ares project and its members. diff --git a/deps/cares/docs/ares_timeout.3 b/deps/cares/docs/ares_timeout.3 index c1e39545993d53..bdcd6916802896 100644 --- a/deps/cares/docs/ares_timeout.3 +++ b/deps/cares/docs/ares_timeout.3 @@ -9,7 +9,7 @@ ares_timeout \- return maximum time to wait .nf #include <ares.h> -struct timeval *ares_timeout(ares_channel_t *\fIchannel\fP, +struct timeval *ares_timeout(const ares_channel_t *\fIchannel\fP, struct timeval *\fImaxtv\fP, struct timeval *\fItv\fP) .fi @@ -29,7 +29,3 @@ pointed to by \fItv\fP and returns the value of \fItv\fP. .BR ares_fds (3), .BR ares_process (3), .BR ares_process_fd (3) -.SH AUTHOR -Greg Hudson, MIT Information Systems -.br -Copyright 1998 by the Massachusetts Institute of Technology. diff --git a/deps/cares/get_ver.awk b/deps/cares/get_ver.awk deleted file mode 100644 index 263ca02ded084e..00000000000000 --- a/deps/cares/get_ver.awk +++ /dev/null @@ -1,29 +0,0 @@ -# *************************************************************************** -# * Project: c-ares -# * -# * Copyright (C) The c-ares project and its contributors -# * SPDX-License-Identifier: MIT -# *************************************************************************** -# awk script which fetches c-ares version number and string from input -# file and writes them to STDOUT. Here you can get an awk version for Win32: -# http://www.gknw.net/development/prgtools/awk-20100523.zip -# -BEGIN { - while ((getline < ARGV[1]) > 0) { - sub("\r", "") # make MSYS gawk work with CRLF header input. - if (match ($0, /^#define ARES_COPYRIGHT "[^"]+"$/)) - copyright_string = substr($0, 25, length($0)-25) - else if (match ($0, /^#define ARES_VERSION_STR "[^"]+"$/)) - version_string = substr($3, 2, length($3)-2) - else if (match ($0, /^#define ARES_VERSION_MAJOR [0-9]+$/)) - version_major = $3 - else if (match ($0, /^#define ARES_VERSION_MINOR [0-9]+$/)) - version_minor = $3 - else if (match ($0, /^#define ARES_VERSION_PATCH [0-9]+$/)) - version_patch = $3 - } - print "LIBCARES_VERSION = " version_major "," version_minor "," version_patch - print "LIBCARES_VERSION_STR = " version_string - print "LIBCARES_COPYRIGHT_STR = " copyright_string -} - diff --git a/deps/cares/include/CMakeLists.txt b/deps/cares/include/CMakeLists.txt index e95a94dda16464..e01885ea1f06ab 100644 --- a/deps/cares/include/CMakeLists.txt +++ b/deps/cares/include/CMakeLists.txt @@ -5,6 +5,6 @@ CONFIGURE_FILE (ares_build.h.cmake ${PROJECT_BINARY_DIR}/ares_build.h) # Headers installation target IF (CARES_INSTALL) - SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h) + SET (CARES_HEADERS ares.h ares_version.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_dns.h ares_dns_record.h ares_nameser.h) INSTALL (FILES ${CARES_HEADERS} COMPONENT Devel DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ENDIF () diff --git a/deps/cares/include/Makefile.am b/deps/cares/include/Makefile.am index e17790da4f4cc9..c2557d208bd1f2 100644 --- a/deps/cares/include/Makefile.am +++ b/deps/cares/include/Makefile.am @@ -4,6 +4,6 @@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt diff --git a/deps/cares/include/Makefile.in b/deps/cares/include/Makefile.in index 6e06995bfc5a3b..3588b27a927bee 100644 --- a/deps/cares/include/Makefile.in +++ b/deps/cares/include/Makefile.in @@ -90,7 +90,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -100,12 +102,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -237,10 +236,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -352,7 +356,7 @@ AUTOMAKE_OPTIONS = foreign nostdinc 1.9.6 ACLOCAL_AMFLAGS = -I m4 --install # what headers to install on 'make install': -include_HEADERS = ares.h ares_version.h ares_build.h ares_rules.h ares_dns.h ares_dns_record.h ares_nameser.h +include_HEADERS = ares.h ares_version.h ares_build.h ares_dns.h ares_dns_record.h ares_nameser.h EXTRA_DIST = ares_build.h.cmake ares_build.h.in ares_build.h.dist CMakeLists.txt all: ares_build.h $(MAKE) $(AM_MAKEFLAGS) all-am diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index bc17230e47262f..7fe3ec78f4e651 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -30,18 +30,43 @@ #include "ares_version.h" /* c-ares version defines */ #include "ares_build.h" /* c-ares build definitions */ -#include "ares_rules.h" /* c-ares rules enforcement */ -/* - * Define WIN32 when build target is Win32 API - */ +#if defined(_WIN32) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +#endif + +#ifdef CARES_HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#ifdef CARES_HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif + +#ifdef CARES_HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + +#ifdef CARES_HAVE_WINSOCK2_H +# include <winsock2.h> +/* To aid with linking against a static c-ares build, lets tell the microsoft + * compiler to pull in needed dependencies */ +# ifdef _MSC_VER +# pragma comment(lib, "ws2_32") +# pragma comment(lib, "advapi32") +# pragma comment(lib, "iphlpapi") +# endif +#endif -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \ - !defined(__SYMBIAN32__) -# define WIN32 +#ifdef CARES_HAVE_WS2TCPIP_H +# include <ws2tcpip.h> #endif -#include <sys/types.h> +#ifdef CARES_HAVE_WINDOWS_H +# include <windows.h> +#endif /* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish libc5-based Linux systems. Only include it on system that are known to @@ -49,46 +74,29 @@ #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) + defined(__QNX__) || defined(__MVS__) || defined(__HAIKU__) # include <sys/select.h> #endif + #if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) # include <sys/bsdskt.h> #endif -#if defined(WATT32) +#if !defined(_WIN32) # include <netinet/in.h> -# include <sys/socket.h> +#endif + +#ifdef WATT32 # include <tcp.h> -#elif defined(_WIN32_WCE) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include <windows.h> -# include <winsock.h> -#elif defined(WIN32) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include <windows.h> -# include <winsock2.h> -# include <ws2tcpip.h> -/* To aid with linking against a static c-ares build, lets tell the microsoft - * compiler to pull in needed dependencies */ -# ifdef _MSC_VER -# pragma comment(lib, "ws2_32") -# pragma comment(lib, "advapi32") -# pragma comment(lib, "iphlpapi") -# endif -#else -# include <sys/socket.h> -# include <netinet/in.h> #endif #if defined(ANDROID) || defined(__ANDROID__) # include <jni.h> #endif +typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; +typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; + #ifdef __cplusplus extern "C" { #endif @@ -230,6 +238,7 @@ typedef enum { #define ARES_FLAG_NOCHECKRESP (1 << 7) #define ARES_FLAG_EDNS (1 << 8) #define ARES_FLAG_NO_DFLT_SVR (1 << 9) +#define ARES_FLAG_DNS0x20 (1 << 10) /* Option mask values */ #define ARES_OPT_FLAGS (1 << 0) @@ -255,6 +264,7 @@ typedef enum { #define ARES_OPT_MAXTIMEOUTMS (1 << 20) #define ARES_OPT_QUERY_CACHE (1 << 21) #define ARES_OPT_EVENT_THREAD (1 << 22) +#define ARES_OPT_SERVER_FAILOVER (1 << 23) /* Nameinfo flag values */ #define ARES_NI_NOFQDN (1 << 0) @@ -305,13 +315,16 @@ typedef enum { #define ARES_LIB_INIT_WIN32 (1 << 0) #define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) +/* Server state callback flag values */ +#define ARES_SERV_STATE_UDP (1 << 0) /* Query used UDP */ +#define ARES_SERV_STATE_TCP (1 << 1) /* Query used TCP */ /* * Typedef our socket type */ #ifndef ares_socket_typedef -# ifdef WIN32 +# if defined(_WIN32) && !defined(WATT32) typedef SOCKET ares_socket_t; # define ARES_SOCKET_BAD INVALID_SOCKET # else @@ -326,6 +339,18 @@ typedef void (*ares_sock_state_cb)(void *data, ares_socket_t socket_fd, struct apattern; +/* Options controlling server failover behavior. + * The retry chance is the probability (1/N) by which we will retry a failed + * server instead of the best server when selecting a server to send queries + * to. + * The retry delay is the minimum time in milliseconds to wait between doing + * such retries (applied per-server). + */ +struct ares_server_failover_options { + unsigned short retry_chance; + size_t retry_delay; +}; + /* NOTE about the ares_options struct to users and developers. This struct will remain looking like this. It will not be extended nor @@ -368,6 +393,7 @@ struct ares_options { int maxtimeout; /* in milliseconds */ unsigned int qcache_max_ttl; /* Maximum TTL for query cache, 0=disabled */ ares_evsys_t evsys; + struct ares_server_failover_options server_failover_opts; }; struct hostent; @@ -430,6 +456,12 @@ typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, int type, typedef void (*ares_addrinfo_callback)(void *arg, int status, int timeouts, struct ares_addrinfo *res); +typedef void (*ares_server_state_callback)(const char *server_string, + ares_bool_t success, int flags, + void *data); + +typedef void (*ares_pending_write_cb)(void *data); + CARES_EXTERN int ares_library_init(int flags); CARES_EXTERN int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), @@ -443,6 +475,9 @@ CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); CARES_EXTERN int ares_library_android_initialized(void); #endif +#define CARES_HAVE_ARES_LIBRARY_INIT 1 +#define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 + CARES_EXTERN int ares_library_initialized(void); CARES_EXTERN void ares_library_cleanup(void); @@ -452,16 +487,16 @@ CARES_EXTERN const char *ares_version(int *version); CARES_EXTERN CARES_DEPRECATED_FOR(ares_init_options) int ares_init( ares_channel_t **channelptr); -CARES_EXTERN int ares_init_options(ares_channel_t **channelptr, - const struct ares_options *options, - int optmask); +CARES_EXTERN int ares_init_options(ares_channel_t **channelptr, + const struct ares_options *options, + int optmask); -CARES_EXTERN int ares_save_options(ares_channel_t *channel, - struct ares_options *options, int *optmask); +CARES_EXTERN int ares_save_options(const ares_channel_t *channel, + struct ares_options *options, int *optmask); -CARES_EXTERN void ares_destroy_options(struct ares_options *options); +CARES_EXTERN void ares_destroy_options(struct ares_options *options); -CARES_EXTERN int ares_dup(ares_channel_t **dest, ares_channel_t *src); +CARES_EXTERN int ares_dup(ares_channel_t **dest, const ares_channel_t *src); CARES_EXTERN ares_status_t ares_reinit(ares_channel_t *channel); @@ -491,6 +526,17 @@ CARES_EXTERN void ares_set_socket_callback(ares_channel_t *ch CARES_EXTERN void ares_set_socket_configure_callback( ares_channel_t *channel, ares_sock_config_callback callback, void *user_data); +CARES_EXTERN void + ares_set_server_state_callback(ares_channel_t *channel, + ares_server_state_callback callback, + void *user_data); + +CARES_EXTERN void ares_set_pending_write_cb(ares_channel_t *channel, + ares_pending_write_cb callback, + void *user_data); + +CARES_EXTERN void ares_process_pending_write(ares_channel_t *channel); + CARES_EXTERN int ares_set_sortlist(ares_channel_t *channel, const char *sortstr); @@ -521,10 +567,251 @@ struct ares_socket_functions { ares_ssize_t (*asendv)(ares_socket_t, const struct iovec *, int, void *); }; -CARES_EXTERN void - ares_set_socket_functions(ares_channel_t *channel, - const struct ares_socket_functions *funcs, - void *user_data); +CARES_EXTERN CARES_DEPRECATED_FOR( + ares_set_socket_functions_ex) void ares_set_socket_functions(ares_channel_t + *channel, + const struct + ares_socket_functions + *funcs, + void *user_data); + +/*! Flags defining behavior of socket functions */ +typedef enum { + /*! Strongly recommended to create sockets as non-blocking and set this + * flag */ + ARES_SOCKFUNC_FLAG_NONBLOCKING = 1 << 0 +} ares_sockfunc_flags_t; + +/*! Socket options in request to asetsockopt() in struct + * ares_socket_functions_ex */ +typedef enum { + /*! Set the send buffer size. Value is a pointer to an int. (SO_SNDBUF) */ + ARES_SOCKET_OPT_SENDBUF_SIZE, + /*! Set the recv buffer size. Value is a pointer to an int. (SO_RCVBUF) */ + ARES_SOCKET_OPT_RECVBUF_SIZE, + /*! Set the network interface to use as the source for communication. + * Value is a C string. (SO_BINDTODEVICE) */ + ARES_SOCKET_OPT_BIND_DEVICE, + /*! Enable TCP Fast Open. Value is a pointer to an ares_bool_t. On some + * systems this could be a no-op if it is known it is on by default and + * return success. Other systems may be a no-op if known the system does + * not support the feature and returns failure with errno set to ENOSYS or + * WSASetLastError(WSAEOPNOTSUPP). + */ + ARES_SOCKET_OPT_TCP_FASTOPEN +} ares_socket_opt_t; + +/*! Flags for behavior during connect */ +typedef enum { + /*! Connect using TCP Fast Open */ + ARES_SOCKET_CONN_TCP_FASTOPEN = 1 << 0 +} ares_socket_connect_flags_t; + +/*! Flags for behavior during bind */ +typedef enum { + /*! Bind is for a TCP connection */ + ARES_SOCKET_BIND_TCP = 1 << 0, + /*! Bind is for a client connection, not server */ + ARES_SOCKET_BIND_CLIENT = 1 << 1 +} ares_socket_bind_flags_t; + +/*! Socket functions to call rather than using OS-native functions */ +struct ares_socket_functions_ex { + /*! ABI Version: must be "1" */ + unsigned int version; + + /*! Flags indicating behavior of the subsystem. One or more + * ares_sockfunc_flags_t */ + unsigned int flags; + + /*! REQUIRED. Create a new socket file descriptor. The file descriptor must + * be opened in non-blocking mode (so that reads and writes never block). + * Recommended other options would be to disable signals on write errors + * (SO_NOSIGPIPE), Disable the Nagle algorithm on SOCK_STREAM (TCP_NODELAY), + * and to automatically close file descriptors on exec (FD_CLOEXEC). + * + * \param[in] domain Socket domain. Valid values are AF_INET, AF_INET6. + * \param[in] type Socket type. Valid values are SOCK_STREAM (tcp) and + * SOCK_DGRAM (udp). + * \param[in] protocol In general this should be ignored, may be passed as + * 0 (use as default for type), or may be IPPROTO_UDP + * or IPPROTO_TCP. + * \param[in] user_data Pointer provided to ares_set_socket_functions_ex(). + * \return ARES_SOCKET_BAD on error, or socket file descriptor on success. + * On error, it is expected to set errno (or WSASetLastError()) to an + * appropriate reason code such as EAFNOSUPPORT / WSAAFNOSUPPORT. */ + ares_socket_t (*asocket)(int domain, int type, int protocol, void *user_data); + + /*! REQUIRED. Close a socket file descriptor. + * \param[in] sock Socket file descriptor returned from asocket. + * \param[in] user_data Pointer provided to ares_set_socket_functions_ex(). + * \return 0 on success. On failure, should set errno (or WSASetLastError) + * to an appropriate code such as EBADF / WSAEBADF */ + int (*aclose)(ares_socket_t sock, void *user_data); + + + /*! REQUIRED. Set socket option. This shares a similar syntax to the BSD + * setsockopt() call, however we use our own options. The value is typically + * a pointer to the desired value and each option has its own data type it + * will express in the documentation. + * + * \param[in] sock Socket file descriptor returned from asocket. + * \param[in] opt Option to set. + * \param[in] val Pointer to value for option. + * \param[in] val_size Size of value. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return Return 0 on success, otherwise -1 should be returned with an + * appropriate errno (or WSASetLastError()) set. If error is ENOSYS / + * WSAEOPNOTSUPP an error will not be propagated as it will take it + * to mean it is an intentional decision to not support the feature. + */ + int (*asetsockopt)(ares_socket_t sock, ares_socket_opt_t opt, const void *val, + ares_socklen_t val_size, void *user_data); + + /*! REQUIRED. Connect to the remote using the supplied address. For UDP + * sockets this will bind the file descriptor to only send and receive packets + * from the remote address provided. + * + * \param[in] sock Socket file descriptor returned from asocket. + * \param[in] address Address to connect to + * \param[in] address_len Size of address structure passed + * \param[in] flags One or more ares_socket_connect_flags_t + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return Return 0 upon successful establishement, otherwise -1 should be + * returned with an appropriate errno (or WSASetLastError()) set. It + * is generally expected that most TCP connections (not using TCP Fast Open) + * will return -1 with an error of EINPROGRESS / WSAEINPROGRESS due to the + * non-blocking nature of the connection. It is then the responsibility of + * the implementation to notify of writability on the socket to indicate the + * connection has succeeded (or readability on failure to retrieve the + * appropriate error). + */ + int (*aconnect)(ares_socket_t sock, const struct sockaddr *address, + ares_socklen_t address_len, unsigned int flags, + void *user_data); + + /*! REQUIRED. Attempt to read data from the remote. + * + * \param[in] sock Socket file descriptor returned from asocket. + * \param[in,out] buffer Allocated buffer to place data read from + * socket. + * \param[in] length Size of buffer + * \param[in] flags Unused, always 0. + * \param[in,out] address Buffer to hold address data was received from. + * May be NULL if address not desired. + * \param[in,out] address_len Input size of address buffer, output actual + * written size. Must be NULL if address is NULL. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return -1 on error with appropriate errno (or WSASetLastError()) set, + * such as EWOULDBLOCK / EAGAIN / WSAEWOULDBLOCK, or ECONNRESET / + * WSAECONNRESET. + */ + ares_ssize_t (*arecvfrom)(ares_socket_t sock, void *buffer, size_t length, + int flags, struct sockaddr *address, + ares_socklen_t *address_len, void *user_data); + + /*! REQUIRED. Attempt to send data to the remote. Optional address may be + * specified which may be useful on unbound UDP sockets (though currently not + * used), and TCP FastOpen where the connection is delayed until first write. + * + * \param[in] sock Socket file descriptor returned from asocket. + * \param[in] buffer Containing data to place onto wire. + * \param[in] length Size of buffer + * \param[in] flags Flags for writing. Currently only used flag is + * MSG_NOSIGNAL if the host OS has such a flag. In + * general flags can be ignored. + * \param[in] address Buffer containing address to send data to. May + * be NULL. + * \param[in,out] address_len Size of address buffer. Must be 0 if address + * is NULL. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return Number of bytes written. -1 on error with appropriate errno (or + * WSASetLastError()) set. + */ + ares_ssize_t (*asendto)(ares_socket_t sock, const void *buffer, size_t length, + int flags, const struct sockaddr *address, + ares_socklen_t address_len, void *user_data); + + /*! Optional. Retrieve the local address of the socket. + * + * \param[in] sock Socket file descriptor returned from asocket + * \param[in,out] address Buffer to hold address + * \param[in,out] address_len Size of address buffer on input, written size + * on output. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return 0 on success. -1 on error with an appropriate errno (or + * WSASetLastError()) set. + */ + int (*agetsockname)(ares_socket_t sock, struct sockaddr *address, + ares_socklen_t *address_len, void *user_data); + + /*! Optional. Bind the socket to an address. This can be used for client + * connections to bind the source address for packets before connect, or + * for server connections to bind to an address and port before listening. + * Currently c-ares only supports client connections. + * + * \param[in] sock Socket file descriptor returned from asocket + * \param[in] flags ares_socket_bind_flags_t flags. + * \param[in] address Buffer containing address. + * \param[in] address_len Size of address buffer. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return 0 on success. -1 on error with an appropriate errno (or + * WSASetLastError()) set. + */ + int (*abind)(ares_socket_t sock, unsigned int flags, + const struct sockaddr *address, socklen_t address_len, + void *user_data); + + /* Optional. Convert an interface name into the interface index. If this + * callback is not specified, then IPv6 Link-Local DNS servers cannot be used. + * + * \param[in] ifname Interface Name as NULL-terminated string. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return 0 on failure, otherwise interface index. + */ + unsigned int (*aif_nametoindex)(const char *ifname, void *user_data); + + /* Optional. Convert an interface index into the interface name. If this + * callback is not specified, then IPv6 Link-Local DNS servers cannot be used. + * + * \param[in] ifindex Interface index, must be > 0 + * \param[in] ifname_buf Buffer to hold interface name. Must be at least + * IFNAMSIZ in length or 32 bytes if IFNAMSIZ isn't + * defined. + * \param[in] ifname_buf_len Size of ifname_buf for verification. + * \param[in] user_data Pointer provided to + * ares_set_socket_functions_ex(). + * \return NULL on failure, otherwise pointer to provided ifname_buf + */ + const char *(*aif_indextoname)(unsigned int ifindex, char *ifname_buf, + size_t ifname_buf_len, void *user_data); +}; + +/*! Override the native socket functions for the OS with the provided set. + * An optional user data thunk may be specified which will be passed to + * each registered callback. Replaces ares_set_socket_functions(). + * + * \param[in] channel An initialized c-ares channel. + * \param[in] funcs Structure registering the implementations for the + * various functions. See the structure definition. + * This will be duplicated and does not need to exist + * past the life of this call. + * \param[in] user_data User data thunk which will be passed to each call of + * the registered callbacks. + * \return ARES_SUCCESS on success, or another error code such as ARES_EFORMERR + * on misuse. + */ +CARES_EXTERN ares_status_t ares_set_socket_functions_ex( + ares_channel_t *channel, const struct ares_socket_functions_ex *funcs, + void *user_data); + CARES_EXTERN CARES_DEPRECATED_FOR(ares_send_dnsrec) void ares_send( ares_channel_t *channel, const unsigned char *qbuf, int qlen, @@ -608,24 +895,64 @@ CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel, CARES_EXTERN CARES_DEPRECATED_FOR( ARES_OPT_EVENT_THREAD or - ARES_OPT_SOCK_STATE_CB) int ares_fds(ares_channel_t *channel, + ARES_OPT_SOCK_STATE_CB) int ares_fds(const ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds); CARES_EXTERN CARES_DEPRECATED_FOR( ARES_OPT_EVENT_THREAD or - ARES_OPT_SOCK_STATE_CB) int ares_getsock(ares_channel_t *channel, + ARES_OPT_SOCK_STATE_CB) int ares_getsock(const ares_channel_t *channel, ares_socket_t *socks, int numsocks); -CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *channel, - struct timeval *maxtv, - struct timeval *tv); +CARES_EXTERN struct timeval *ares_timeout(const ares_channel_t *channel, + struct timeval *maxtv, + struct timeval *tv); -CARES_EXTERN CARES_DEPRECATED_FOR(ares_process_fd) void ares_process( +CARES_EXTERN CARES_DEPRECATED_FOR(ares_process_fds) void ares_process( ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds); -CARES_EXTERN void ares_process_fd(ares_channel_t *channel, - ares_socket_t read_fd, - ares_socket_t write_fd); +/*! Events used by ares_fd_events_t */ +typedef enum { + ARES_FD_EVENT_NONE = 0, /*!< No events */ + ARES_FD_EVENT_READ = 1 << 0, /*!< Read event (including disconnect/error) */ + ARES_FD_EVENT_WRITE = 1 << 1 /*!< Write event */ +} ares_fd_eventflag_t; + +/*! Type holding a file descriptor and mask of events, used by + * ares_process_fds() */ +typedef struct { + ares_socket_t fd; /*!< File descriptor */ + unsigned int events; /*!< Mask of ares_fd_eventflag_t */ +} ares_fd_events_t; + +/*! Flags used by ares_process_fds() */ +typedef enum { + ARES_PROCESS_FLAG_NONE = 0, /*!< No flag value */ + ARES_PROCESS_FLAG_SKIP_NON_FD = 1 << 0 /*!< skip any processing unrelated to + * the file descriptor events passed + * in */ +} ares_process_flag_t; + +/*! Process events on multiple file descriptors based on the event mask + * associated with each file descriptor. Recommended over calling + * ares_process_fd() multiple times since it would trigger additional logic + * such as timeout processing on each call. + * + * \param[in] channel Initialized ares channel + * \param[in] events Array of file descriptors with events. May be NULL if + * no events, but may have timeouts to process. + * \param[in] nevents Number of elements in the events array. May be 0 if + * no events, but may have timeouts to process. + * \param[in] flags Flags to alter behavior of the process command. + * \return ARES_ENOMEM on out of memory, ARES_EFORMERR on misuse, + * otherwise ARES_SUCCESS + */ +CARES_EXTERN ares_status_t ares_process_fds(ares_channel_t *channel, + const ares_fd_events_t *events, + size_t nevents, unsigned int flags); + +CARES_EXTERN void ares_process_fd(ares_channel_t *channel, + ares_socket_t read_fd, + ares_socket_t write_fd); CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) int ares_create_query( const char *name, int dnsclass, int type, unsigned short id, int rd, @@ -842,22 +1169,24 @@ CARES_EXTERN CARES_DEPRECATED_FOR(ares_set_servers_csv) int ares_set_servers( ares_channel_t *channel, const struct ares_addr_node *servers); CARES_EXTERN - CARES_DEPRECATED_FOR(ares_set_servers_ports_csv) int ares_set_servers_ports( - ares_channel_t *channel, const struct ares_addr_port_node *servers); +CARES_DEPRECATED_FOR(ares_set_servers_ports_csv) +int ares_set_servers_ports(ares_channel_t *channel, + const struct ares_addr_port_node *servers); /* Incoming string format: host[:port][,host[:port]]... */ CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel, const char *servers); CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel, const char *servers); -CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel); +CARES_EXTERN char *ares_get_servers_csv(const ares_channel_t *channel); CARES_EXTERN CARES_DEPRECATED_FOR(ares_get_servers_csv) int ares_get_servers( - ares_channel_t *channel, struct ares_addr_node **servers); + const ares_channel_t *channel, struct ares_addr_node **servers); CARES_EXTERN - CARES_DEPRECATED_FOR(ares_get_servers_ports_csv) int ares_get_servers_ports( - ares_channel_t *channel, struct ares_addr_port_node **servers); +CARES_DEPRECATED_FOR(ares_get_servers_csv) +int ares_get_servers_ports(const ares_channel_t *channel, + struct ares_addr_port_node **servers); CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size); @@ -891,7 +1220,7 @@ CARES_EXTERN ares_status_t ares_queue_wait_empty(ares_channel_t *channel, * \param[in] channel Initialized ares channel * \return Number of active queries to servers */ -CARES_EXTERN size_t ares_queue_active_queries(ares_channel_t *channel); +CARES_EXTERN size_t ares_queue_active_queries(const ares_channel_t *channel); #ifdef __cplusplus } diff --git a/deps/cares/include/ares_build.h b/deps/cares/include/ares_build.h index 0a2b7a711a3bf0..aca66bebcd9b5c 100644 --- a/deps/cares/include/ares_build.h +++ b/deps/cares/include/ares_build.h @@ -134,75 +134,60 @@ #elif defined(_WIN32_WCE) # define CARES_TYPEOF_ARES_SOCKLEN_T int -#elif defined(__MINGW32__) -# define CARES_TYPEOF_ARES_SOCKLEN_T int - #elif defined(__VMS) # define CARES_TYPEOF_ARES_SOCKLEN_T unsigned int #elif defined(__OS400__) # if defined(__ILEC400__) # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t -# define CARES_PULL_SYS_TYPES_H 1 -# define CARES_PULL_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_TYPES_H 1 +# define CARES_HAVE_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_SELECT_H 1 # endif #elif defined(__MVS__) # if defined(__IBMC__) || defined(__IBMCPP__) # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t -# define CARES_PULL_SYS_TYPES_H 1 -# define CARES_PULL_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_TYPES_H 1 +# define CARES_HAVE_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_SELECT_H 1 # endif #elif defined(__370__) # if defined(__IBMC__) || defined(__IBMCPP__) # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t -# define CARES_PULL_SYS_TYPES_H 1 -# define CARES_PULL_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_TYPES_H 1 +# define CARES_HAVE_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_SELECT_H 1 # endif #elif defined(TPF) # define CARES_TYPEOF_ARES_SOCKLEN_T int -/* ===================================== */ -/* KEEP MSVC THE PENULTIMATE ENTRY */ -/* ===================================== */ - -#elif defined(_MSC_VER) +#elif defined(_WIN32) # define CARES_TYPEOF_ARES_SOCKLEN_T int +# define CARES_HAVE_WINDOWS_H 1 +# define CARES_HAVE_SYS_TYPES_H 1 -/* ===================================== */ -/* KEEP GENERIC GCC THE LAST ENTRY */ -/* ===================================== */ +# if defined(WATT32) +# define CARES_HAVE_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_SELECT_H 1 +# else +# define CARES_HAVE_WS2TCPIP_H 1 +# define CARES_HAVE_WINSOCK2_H 1 +# endif #elif defined(__GNUC__) # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t -# define CARES_PULL_SYS_TYPES_H 1 -# define CARES_PULL_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_TYPES_H 1 +# define CARES_HAVE_SYS_SOCKET_H 1 +# define CARES_HAVE_SYS_SELECT_H 1 #else # error "Unknown non-configure build target!" Error Compilation_aborted_Unknown_non_configure_build_target #endif -/* CARES_PULL_SYS_TYPES_H is defined above when inclusion of header file */ -/* sys/types.h is required here to properly make type definitions below. */ -#ifdef CARES_PULL_SYS_TYPES_H -# include <sys/types.h> -#endif - -/* CARES_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ -/* sys/socket.h is required here to properly make type definitions below. */ -#ifdef CARES_PULL_SYS_SOCKET_H -# include <sys/socket.h> -#endif - -/* Data type definition of ares_socklen_t. */ - -#ifdef CARES_TYPEOF_ARES_SOCKLEN_T - typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; -#endif - /* Data type definition of ares_ssize_t. */ #ifdef _WIN32 # ifdef _WIN64 @@ -214,6 +199,4 @@ # define CARES_TYPEOF_ARES_SSIZE_T ssize_t #endif -typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; - #endif /* __CARES_BUILD_H */ diff --git a/deps/cares/include/ares_build.h.cmake b/deps/cares/include/ares_build.h.cmake index da8a7e064c0a45..2263c6c87ef18c 100644 --- a/deps/cares/include/ares_build.h.cmake +++ b/deps/cares/include/ares_build.h.cmake @@ -13,10 +13,10 @@ * for C-Ares */ #cmakedefine CARES_HAVE_SYS_TYPES_H #cmakedefine CARES_HAVE_SYS_SOCKET_H +#cmakedefine CARES_HAVE_SYS_SELECT_H #cmakedefine CARES_HAVE_WINDOWS_H #cmakedefine CARES_HAVE_WS2TCPIP_H #cmakedefine CARES_HAVE_WINSOCK2_H -#cmakedefine CARES_HAVE_WINDOWS_H #cmakedefine CARES_HAVE_ARPA_NAMESER_H #cmakedefine CARES_HAVE_ARPA_NAMESER_COMPAT_H @@ -28,6 +28,10 @@ # include <sys/socket.h> #endif +#ifdef CARES_HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + #ifdef CARES_HAVE_WINSOCK2_H # include <winsock2.h> #endif @@ -40,8 +44,4 @@ # include <windows.h> #endif - -typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; -typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; - #endif /* __CARES_BUILD_H */ diff --git a/deps/cares/include/ares_build.h.in b/deps/cares/include/ares_build.h.in index e55b39b0e3e5bd..1327ed6d990f00 100644 --- a/deps/cares/include/ares_build.h.in +++ b/deps/cares/include/ares_build.h.in @@ -13,10 +13,10 @@ * for C-Ares */ #undef CARES_HAVE_SYS_TYPES_H #undef CARES_HAVE_SYS_SOCKET_H +#undef CARES_HAVE_SYS_SELECT_H #undef CARES_HAVE_WINDOWS_H #undef CARES_HAVE_WS2TCPIP_H #undef CARES_HAVE_WINSOCK2_H -#undef CARES_HAVE_WINDOWS_H #undef CARES_HAVE_ARPA_NAMESER_H #undef CARES_HAVE_ARPA_NAMESER_COMPAT_H @@ -28,6 +28,10 @@ # include <sys/socket.h> #endif +#ifdef CARES_HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + #ifdef CARES_HAVE_WINSOCK2_H # include <winsock2.h> #endif @@ -40,8 +44,4 @@ # include <windows.h> #endif - -typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; -typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; - #endif /* __CARES_BUILD_H */ diff --git a/deps/cares/include/ares_dns_record.h b/deps/cares/include/ares_dns_record.h index 8d09bd0a464254..cec9f47f63d8f5 100644 --- a/deps/cares/include/ares_dns_record.h +++ b/deps/cares/include/ares_dns_record.h @@ -51,6 +51,7 @@ typedef enum { ARES_REC_TYPE_HINFO = 13, /*!< Host information. */ ARES_REC_TYPE_MX = 15, /*!< Mail routing information. */ ARES_REC_TYPE_TXT = 16, /*!< Text strings. */ + ARES_REC_TYPE_SIG = 24, /*!< RFC 2535 / RFC 2931. SIG Record */ ARES_REC_TYPE_AAAA = 28, /*!< RFC 3596. Ip6 Address. */ ARES_REC_TYPE_SRV = 33, /*!< RFC 2782. Server Selection. */ ARES_REC_TYPE_NAPTR = 35, /*!< RFC 3403. Naming Authority Pointer */ @@ -93,7 +94,7 @@ typedef enum { ARES_OPCODE_IQUERY = 1, /*!< Inverse query. Obsolete. */ ARES_OPCODE_STATUS = 2, /*!< Name server status query */ ARES_OPCODE_NOTIFY = 4, /*!< Zone change notification (RFC 1996) */ - ARES_OPCODE_UPDATE = 5, /*!< Zone update message (RFC2136) */ + ARES_OPCODE_UPDATE = 5 /*!< Zone update message (RFC2136) */ } ares_dns_opcode_t; /*! DNS Header flags */ @@ -107,7 +108,7 @@ typedef enum { ARES_FLAG_AD = 1 << 5, /*!< RFC 2065. Authentic Data bit indicates in a * response that the data included has been verified by * the server providing it */ - ARES_FLAG_CD = 1 << 6, /*!< RFC 2065. Checking Disabled bit indicates in a + ARES_FLAG_CD = 1 << 6 /*!< RFC 2065. Checking Disabled bit indicates in a * query that non-verified data is acceptable to the * resolver sending the query. */ } ares_dns_flags_t; @@ -151,7 +152,7 @@ typedef enum { ARES_RCODE_BADNAME = 20, /*!< RFC 2930. Duplicate Key Name */ ARES_RCODE_BADALG = 21, /*!< RFC 2930. Algorithm not supported */ ARES_RCODE_BADTRUNC = 22, /*!< RFC 8945. Bad Truncation */ - ARES_RCODE_BADCOOKIE = 23, /*!< RVC 7973. Bad/missing Server Cookie */ + ARES_RCODE_BADCOOKIE = 23 /*!< RFC 7873. Bad/missing Server Cookie */ } ares_dns_rcode_t; /*! Data types used */ @@ -170,6 +171,9 @@ typedef enum { * length) */ ARES_DATATYPE_OPT = 10, /*!< Array of options. 16bit identifier, BIN * data. */ + ARES_DATATYPE_ABINP = 11 /*!< Array of binary data, likely printable. + * Guaranteed to have a NULL terminator for + * convenience (not included in length) */ } ares_dns_datatype_t; /*! Keys used for all RR Types. We take the record type and multiply by 100 @@ -206,8 +210,26 @@ typedef enum { ARES_RR_MX_PREFERENCE = (ARES_REC_TYPE_MX * 100) + 1, /*! MX Record. Exchange, domain. Datatype: NAME */ ARES_RR_MX_EXCHANGE = (ARES_REC_TYPE_MX * 100) + 2, - /*! TXT Record. Data. Datatype: BINP */ + /*! TXT Record. Data. Datatype: ABINP */ ARES_RR_TXT_DATA = (ARES_REC_TYPE_TXT * 100) + 1, + /*! SIG Record. Type Covered. Datatype: U16 */ + ARES_RR_SIG_TYPE_COVERED = (ARES_REC_TYPE_SIG * 100) + 1, + /*! SIG Record. Algorithm. Datatype: U8 */ + ARES_RR_SIG_ALGORITHM = (ARES_REC_TYPE_SIG * 100) + 2, + /*! SIG Record. Labels. Datatype: U8 */ + ARES_RR_SIG_LABELS = (ARES_REC_TYPE_SIG * 100) + 3, + /*! SIG Record. Original TTL. Datatype: U32 */ + ARES_RR_SIG_ORIGINAL_TTL = (ARES_REC_TYPE_SIG * 100) + 4, + /*! SIG Record. Signature Expiration. Datatype: U32 */ + ARES_RR_SIG_EXPIRATION = (ARES_REC_TYPE_SIG * 100) + 5, + /*! SIG Record. Signature Inception. Datatype: U32 */ + ARES_RR_SIG_INCEPTION = (ARES_REC_TYPE_SIG * 100) + 6, + /*! SIG Record. Key Tag. Datatype: U16 */ + ARES_RR_SIG_KEY_TAG = (ARES_REC_TYPE_SIG * 100) + 7, + /*! SIG Record. Signers Name. Datatype: NAME */ + ARES_RR_SIG_SIGNERS_NAME = (ARES_REC_TYPE_SIG * 100) + 8, + /*! SIG Record. Signature. Datatype: BIN */ + ARES_RR_SIG_SIGNATURE = (ARES_REC_TYPE_SIG * 100) + 9, /*! AAAA Record. Address. Datatype: INADDR6 */ ARES_RR_AAAA_ADDR = (ARES_REC_TYPE_AAAA * 100) + 1, /*! SRV Record. Priority. Datatype: U16 */ @@ -273,7 +295,7 @@ typedef enum { /*! RAW Record. RR Type. Datatype: U16 */ ARES_RR_RAW_RR_TYPE = (ARES_REC_TYPE_RAW_RR * 100) + 1, /*! RAW Record. RR Data. Datatype: BIN */ - ARES_RR_RAW_RR_DATA = (ARES_REC_TYPE_RAW_RR * 100) + 2, + ARES_RR_RAW_RR_DATA = (ARES_REC_TYPE_RAW_RR * 100) + 2 } ares_dns_rr_key_t; /*! TLSA Record ARES_RR_TLSA_CERT_USAGE known values */ @@ -353,7 +375,7 @@ typedef enum { /*! RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC */ ARES_OPT_PARAM_EDNS_KEY_TAG = 14, /*! RFC 8914. Extended ERROR code and message */ - ARES_OPT_PARAM_EXTENDED_DNS_ERROR = 15, + ARES_OPT_PARAM_EXTENDED_DNS_ERROR = 15 } ares_opt_param_t; /*! Data type for option records for keys like ARES_RR_OPT_OPTIONS and @@ -581,6 +603,15 @@ CARES_EXTERN void ares_dns_record_destroy(ares_dns_record_t *dnsrec); CARES_EXTERN unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec); +/*! Overwrite the DNS query id + * + * \param[in] dnsrec Initialized record object + * \param[in] id DNS query id + * \return ARES_TRUE on success, ARES_FALSE on usage error + */ +CARES_EXTERN ares_bool_t ares_dns_record_set_id(ares_dns_record_t *dnsrec, + unsigned short id); + /*! Get the DNS Record Flags * * \param[in] dnsrec Initialized record object @@ -844,6 +875,34 @@ CARES_EXTERN ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, const unsigned char *val, size_t len); +/*! Add binary array value (ABINP) data for specified resource record and key. + * Can only be used on keys with datatype ARES_DATATYPE_ABINP. The value will + * Be added as the last element in the array. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] val Pointer to binary data. + * \param[in] len Length of binary data + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const unsigned char *val, + size_t len); + +/*! Delete binary array value (ABINP) data for specified resource record and + * key by specified index. Can only be used on keys with datatype + * ARES_DATATYPE_ABINP. The value at the index will be deleted. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] idx Index to delete + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_dns_rr_del_abin(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + size_t idx); + /*! Set the option for the RR * * \param[in] dns_rr Pointer to resource record @@ -859,6 +918,17 @@ CARES_EXTERN ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, const unsigned char *val, size_t val_len); +/*! Delete the option for the RR by id + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] opt Option record key id. + * \return ARES_SUCCESS if removed, ARES_ENOTFOUND if not found + */ +CARES_EXTERN ares_status_t ares_dns_rr_del_opt_byid(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt); + /*! Retrieve a pointer to the ipv4 address. Can only be used on keys with * datatype ARES_DATATYPE_INADDR. * @@ -920,8 +990,9 @@ CARES_EXTERN unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key); /*! Retrieve a pointer to the binary data. Can only be used on keys with - * datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. If BINP, the data is - * guaranteed to have a NULL terminator which is NOT included in the length. + * datatype ARES_DATATYPE_BIN, ARES_DATATYPE_BINP, or ARES_DATATYPE_ABINP. + * If BINP or ABINP, the data is guaranteed to have a NULL terminator which + * is NOT included in the length. * * \param[in] dns_rr Pointer to resource record * \param[in] key DNS Resource Record Key @@ -932,6 +1003,33 @@ CARES_EXTERN const unsigned char * ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, size_t *len); +/*! Retrieve the count of the array of stored binary values. Can only be used on + * keys with datatype ARES_DATATYPE_ABINP. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \return count of values + */ +CARES_EXTERN size_t ares_dns_rr_get_abin_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key); + +/*! Retrieve a pointer to the binary array data from the specified index. Can + * only be used on keys with datatype ARES_DATATYPE_ABINP. If ABINP, the data + * is guaranteed to have a NULL terminator which is NOT included in the length. + * If want all array membersconcatenated, may use ares_dns_rr_get_bin() + * instead. + * + * \param[in] dns_rr Pointer to resource record + * \param[in] key DNS Resource Record Key + * \param[in] idx Index of value to retrieve + * \param[out] len Length of binary data returned + * \return pointer binary data or NULL on error + */ +CARES_EXTERN const unsigned char * + ares_dns_rr_get_abin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t idx, size_t *len); + + /*! Retrieve the number of options stored for the RR. * * \param[in] dns_rr Pointer to resource record @@ -1006,7 +1104,7 @@ CARES_EXTERN ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, * (such as the ttl decrement capability). * * \param[in] dnsrec Pointer to initialized and filled DNS record object. - * \return duplicted DNS record object, or NULL on out of memory. + * \return duplicated DNS record object, or NULL on out of memory. */ CARES_EXTERN ares_dns_record_t * ares_dns_record_duplicate(const ares_dns_record_t *dnsrec); diff --git a/deps/cares/include/ares_rules.h b/deps/cares/include/ares_rules.h deleted file mode 100644 index 450dc8ab2d5fd2..00000000000000 --- a/deps/cares/include/ares_rules.h +++ /dev/null @@ -1,133 +0,0 @@ -/* MIT License - * - * Copyright (c) 2009 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __CARES_RULES_H -#define __CARES_RULES_H - -/* ================================================================ */ -/* COMPILE TIME SANITY CHECKS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * All checks done in this file are intentionally placed in a public - * header file which is pulled by ares.h when an application is - * being built using an already built c-ares library. Additionally - * this file is also included and used when building the library. - * - * If compilation fails on this file it is certainly sure that the - * problem is elsewhere. It could be a problem in the ares_build.h - * header file, or simply that you are using different compilation - * settings than those used to build the library. - * - * Nothing in this file is intended to be modified or adjusted by the - * c-ares library user nor by the c-ares library builder. - * - * Do not deactivate any check, these are done to make sure that the - * library is properly built and used. - * - * You can find further help on the c-ares development mailing list: - * http://lists.haxx.se/listinfo/c-ares/ - * - * NOTE 2 - * ------ - * - * Some of the following compile time checks are based on the fact - * that the dimension of a constant array can not be a negative one. - * In this way if the compile time verification fails, the compilation - * will fail issuing an error. The error description wording is compiler - * dependent but it will be quite similar to one of the following: - * - * "negative subscript or subscript is too large" - * "array must have at least one element" - * "-1 is an illegal array size" - * "size of array is negative" - * - * If you are building an application which tries to use an already - * built c-ares library and you are getting this kind of errors on - * this file, it is a clear indication that there is a mismatch between - * how the library was built and how you are trying to use it for your - * application. Your already compiled or binary library provider is the - * only one who can give you the details you need to properly use it. - */ - -/* - * Verify that some macros are actually defined. - */ - -#ifndef CARES_TYPEOF_ARES_SOCKLEN_T -# error "CARES_TYPEOF_ARES_SOCKLEN_T definition is missing!" -Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing -#endif - -/* - * Macros private to this header file. - */ - -#define CareschkszEQ(t, s) sizeof(t) == s ? 1 : -1 - -#define CareschkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 - - /* - * Verify that the size previously defined and expected for - * ares_socklen_t is actually the same as the one reported - * by sizeof() at compile time. - */ - - typedef char __cares_rule_02__[CareschkszEQ( - ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; - -/* - * Verify at compile time that the size of ares_socklen_t as reported - * by sizeof() is greater or equal than the one reported for int for - * the current compilation. - */ - -typedef char __cares_rule_03__[CareschkszGE(ares_socklen_t, int)]; - -/* ================================================================ */ -/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ -/* ================================================================ */ - -/* - * Get rid of macros private to this header file. - */ - -#undef CareschkszEQ -#undef CareschkszGE - -/* - * Get rid of macros not intended to exist beyond this point. - */ - -#undef CARES_PULL_WS2TCPIP_H -#undef CARES_PULL_SYS_TYPES_H -#undef CARES_PULL_SYS_SOCKET_H - -#undef CARES_TYPEOF_ARES_SOCKLEN_T - -#endif /* __CARES_RULES_H */ diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 0e94a98be8f280..006029c12dfe91 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -28,22 +28,20 @@ #define ARES__VERSION_H /* This is the global package copyright */ -#define ARES_COPYRIGHT "2004 - 2024 Daniel Stenberg, <daniel@haxx.se>." +#define ARES_COPYRIGHT "2004 - 2025 Daniel Stenberg, <daniel@haxx.se>." #define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 28 -#define ARES_VERSION_PATCH 1 +#define ARES_VERSION_MINOR 34 +#define ARES_VERSION_PATCH 6 +#define ARES_VERSION_STR "1.34.6" + +/* NOTE: We cannot make the version string a C preprocessor stringify operation + * due to assumptions made by integrators that aren't properly using + * pkgconf or cmake and are doing their own detection based on parsing + * this header */ + #define ARES_VERSION \ ((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \ (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.28.1" - -#if (ARES_VERSION >= 0x010700) -# define CARES_HAVE_ARES_LIBRARY_INIT 1 -# define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 -#else -# undef CARES_HAVE_ARES_LIBRARY_INIT -# undef CARES_HAVE_ARES_LIBRARY_CLEANUP -#endif #endif diff --git a/deps/cares/install-sh b/deps/cares/install-sh deleted file mode 100755 index ec298b53740270..00000000000000 --- a/deps/cares/install-sh +++ /dev/null @@ -1,541 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2020-11-14.01; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# 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 -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# 'make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -tab=' ' -nl=' -' -IFS=" $tab$nl" - -# Set DOITPROG to "echo" to test this script. - -doit=${DOITPROG-} -doit_exec=${doit:-exec} - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -# Create dirs (including intermediate dirs) using mode 755. -# This is like GNU 'install' as of coreutils 8.32 (2020). -mkdir_umask=22 - -backupsuffix= -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -is_target_a_directory=possibly - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -p pass -p to $cpprog. - -s $stripprog installed files. - -S SUFFIX attempt to back up existing files, with suffix SUFFIX. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG - -By default, rm is invoked with -f; when overridden with RMPROG, -it's up to you to specify -f if you want it. - -If -S is not specified, no backups are attempted. - -Email bug reports to bug-automake@gnu.org. -Automake home page: https://www.gnu.org/software/automake/ -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -p) cpprog="$cpprog -p";; - - -s) stripcmd=$stripprog;; - - -S) backupsuffix="$2" - shift;; - - -t) - is_target_a_directory=always - dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) is_target_a_directory=never;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -# We allow the use of options -d and -T together, by making -d -# take the precedence; this is for compatibility with GNU install. - -if test -n "$dir_arg"; then - if test -n "$dst_arg"; then - echo "$0: target directory not allowed when installing a directory." >&2 - exit 1 - fi -fi - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call 'install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - if test $# -gt 1 || test "$is_target_a_directory" = always; then - if test ! -d "$dst_arg"; then - echo "$0: $dst_arg: Is not a directory." >&2 - exit 1 - fi - fi -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for 'test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - # Don't chown directories that already exist. - if test $dstdir_status = 0; then - chowncmd="" - fi - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename. - if test -d "$dst"; then - if test "$is_target_a_directory" = never; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dstbase=`basename "$src"` - case $dst in - */) dst=$dst$dstbase;; - *) dst=$dst/$dstbase;; - esac - dstdir_status=0 - else - dstdir=`dirname "$dst"` - test -d "$dstdir" - dstdir_status=$? - fi - fi - - case $dstdir in - */) dstdirslash=$dstdir;; - *) dstdirslash=$dstdir/;; - esac - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - # The $RANDOM variable is not portable (e.g., dash). Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - - trap ' - ret=$? - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null - exit $ret - ' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p'. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - oIFS=$IFS - IFS=/ - set -f - set fnord $dstdir - shift - set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=${dstdirslash}_inst.$$_ - rmtmp=${dstdirslash}_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && - { test -z "$stripcmd" || { - # Create $dsttmp read-write so that cp doesn't create it read-only, - # which would cause strip to fail. - if test -z "$doit"; then - : >"$dsttmp" # No need to fork-exec 'touch'. - else - $doit touch "$dsttmp" - fi - } - } && - $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - set +f && - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # If $backupsuffix is set, and the file being installed - # already exists, attempt a backup. Don't worry if it fails, - # e.g., if mv doesn't support -f. - if test -n "$backupsuffix" && test -f "$dst"; then - $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null - fi - - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/deps/cares/libcares.pc.cmake b/deps/cares/libcares.pc.cmake index 74e4d0cf445978..257255d84d5ce9 100644 --- a/deps/cares/libcares.pc.cmake +++ b/deps/cares/libcares.pc.cmake @@ -7,9 +7,9 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_FULL_BINDIR@ -libdir=@CMAKE_INSTALL_FULL_LIBDIR@ -includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ +exec_prefix=${prefix}/@CMAKE_INSTALL_BINDIR@ +libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: c-ares URL: https://c-ares.org/ @@ -18,5 +18,6 @@ Version: @CARES_VERSION@ Requires: Requires.private: Cflags: -I${includedir} +Cflags.private: -DCARES_STATICLIB Libs: -L${libdir} -lcares Libs.private: @CARES_PRIVATE_LIBS@ diff --git a/deps/cares/ltmain.sh b/deps/cares/ltmain.sh deleted file mode 100755 index 1dea62ab78db21..00000000000000 --- a/deps/cares/ltmain.sh +++ /dev/null @@ -1,11436 +0,0 @@ -#! /usr/bin/env sh -## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2019-02-19.15 - -# libtool (GNU libtool) 2.4.7 -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 - -# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4.7 Debian-2.4.7-7" -package_revision=2.4.7 - - -## ------ ## -## Usage. ## -## ------ ## - -# Run './libtool --help' for help with using this script from the -# command line. - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# After configure completes, it has a better idea of some of the -# shell tools we need than the defaults used by the functions shared -# with bootstrap, so set those here where they can still be over- -# ridden by the user, but otherwise take precedence. - -: ${AUTOCONF="autoconf"} -: ${AUTOMAKE="automake"} - - -## -------------------------- ## -## Source external libraries. ## -## -------------------------- ## - -# Much of our low-level functionality needs to be sourced from external -# libraries, which are installed to $pkgauxdir. - -# Set a version string for this script. -scriptversion=2019-02-19.15; # UTC - -# General shell script boiler plate, and helper functions. -# Written by Gary V. Vaughan, 2004 - -# This is free software. There is NO warranty; not even for -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# Copyright (C) 2004-2019, 2021 Bootstrap Authors -# -# This file is dual licensed under the terms of the MIT license -# <https://opensource.org/license/MIT>, and GPL version 2 or later -# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of -# these licenses when using or redistributing this software or any of -# the files within it. See the URLs above, or the file `LICENSE` -# included in the Bootstrap distribution for the full license texts. - -# Please report bugs or propose patches to: -# <https://github.com/gnulib-modules/bootstrap/issues> - - -## ------ ## -## Usage. ## -## ------ ## - -# Evaluate this file near the top of your script to gain access to -# the functions and variables defined here: -# -# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh -# -# If you need to override any of the default environment variable -# settings, do that before evaluating this file. - - -## -------------------- ## -## Shell normalisation. ## -## -------------------- ## - -# Some shells need a little help to be as Bourne compatible as possible. -# Before doing anything else, make sure all that help has been provided! - -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac -fi - -# NLS nuisances: We save the old values in case they are required later. -_G_user_locale= -_G_safe_locale= -for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test set = \"\${$_G_var+set}\"; then - save_$_G_var=\$$_G_var - $_G_var=C - export $_G_var - _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" - _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" - fi" -done -# These NLS vars are set unconditionally (bootstrap issue #24). Unset those -# in case the environment reset is needed later and the $save_* variant is not -# defined (see the code above). -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -# Make sure IFS has a sensible default -sp=' ' -nl=' -' -IFS="$sp $nl" - -# There are apparently some retarded systems that use ';' as a PATH separator! -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# func_unset VAR -# -------------- -# Portably unset VAR. -# In some shells, an 'unset VAR' statement leaves a non-zero return -# status if VAR is already unset, which might be problematic if the -# statement is used at the end of a function (thus poisoning its return -# value) or when 'set -e' is active (causing even a spurious abort of -# the script in this case). -func_unset () -{ - { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } -} - - -# Make sure CDPATH doesn't cause `cd` commands to output the target dir. -func_unset CDPATH - -# Make sure ${,E,F}GREP behave sanely. -func_unset GREP_OPTIONS - - -## ------------------------- ## -## Locate command utilities. ## -## ------------------------- ## - - -# func_executable_p FILE -# ---------------------- -# Check that FILE is an executable regular file. -func_executable_p () -{ - test -f "$1" && test -x "$1" -} - - -# func_path_progs PROGS_LIST CHECK_FUNC [PATH] -# -------------------------------------------- -# Search for either a program that responds to --version with output -# containing "GNU", or else returned by CHECK_FUNC otherwise, by -# trying all the directories in PATH with each of the elements of -# PROGS_LIST. -# -# CHECK_FUNC should accept the path to a candidate program, and -# set $func_check_prog_result if it truncates its output less than -# $_G_path_prog_max characters. -func_path_progs () -{ - _G_progs_list=$1 - _G_check_func=$2 - _G_PATH=${3-"$PATH"} - - _G_path_prog_max=0 - _G_path_prog_found=false - _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} - for _G_dir in $_G_PATH; do - IFS=$_G_save_IFS - test -z "$_G_dir" && _G_dir=. - for _G_prog_name in $_G_progs_list; do - for _exeext in '' .EXE; do - _G_path_prog=$_G_dir/$_G_prog_name$_exeext - func_executable_p "$_G_path_prog" || continue - case `"$_G_path_prog" --version 2>&1` in - *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; - *) $_G_check_func $_G_path_prog - func_path_progs_result=$func_check_prog_result - ;; - esac - $_G_path_prog_found && break 3 - done - done - done - IFS=$_G_save_IFS - test -z "$func_path_progs_result" && { - echo "no acceptable sed could be found in \$PATH" >&2 - exit 1 - } -} - - -# We want to be able to use the functions in this file before configure -# has figured out where the best binaries are kept, which means we have -# to search for them ourselves - except when the results are already set -# where we skip the searches. - -# Unless the user overrides by setting SED, search the path for either GNU -# sed, or the sed that truncates its output the least. -test -z "$SED" && { - _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for _G_i in 1 2 3 4 5 6 7; do - _G_sed_script=$_G_sed_script$nl$_G_sed_script - done - echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed - _G_sed_script= - - func_check_prog_sed () - { - _G_path_prog=$1 - - _G_count=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo '' >> conftest.nl - "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" - rm -f conftest.sed - SED=$func_path_progs_result -} - - -# Unless the user overrides by setting GREP, search the path for either GNU -# grep, or the grep that truncates its output the least. -test -z "$GREP" && { - func_check_prog_grep () - { - _G_path_prog=$1 - - _G_count=0 - _G_path_prog_max=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo 'GREP' >> conftest.nl - "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" - GREP=$func_path_progs_result -} - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# All uppercase variable names are used for environment variables. These -# variables can be overridden by the user before calling a script that -# uses them if a suitable command of that name is not already available -# in the command search PATH. - -: ${CP="cp -f"} -: ${ECHO="printf %s\n"} -: ${EGREP="$GREP -E"} -: ${FGREP="$GREP -F"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} - - -## -------------------- ## -## Useful sed snippets. ## -## -------------------- ## - -sed_dirname='s|/[^/]*$||' -sed_basename='s|^.*/||' - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s|\([`"$\\]\)|\\\1|g' - -# Same as above, but do not quote variable references. -sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' - -# Sed substitution that converts a w32 file name or path -# that contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-'\' parameter expansions in output of sed_double_quote_subst that -# were '\'-ed in input to the same. If an odd number of '\' preceded a -# '$' in input to sed_double_quote_subst, that '$' was protected from -# expansion. Since each input '\' is now two '\'s, look for any number -# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. -_G_bs='\\' -_G_bs2='\\\\' -_G_bs4='\\\\\\\\' -_G_dollar='\$' -sed_double_backslash="\ - s/$_G_bs4/&\\ -/g - s/^$_G_bs2$_G_dollar/$_G_bs&/ - s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g - s/\n//g" - -# require_check_ifs_backslash -# --------------------------- -# Check if we can use backslash as IFS='\' separator, and set -# $check_ifs_backshlash_broken to ':' or 'false'. -require_check_ifs_backslash=func_require_check_ifs_backslash -func_require_check_ifs_backslash () -{ - _G_save_IFS=$IFS - IFS='\' - _G_check_ifs_backshlash='a\\b' - for _G_i in $_G_check_ifs_backshlash - do - case $_G_i in - a) - check_ifs_backshlash_broken=false - ;; - '') - break - ;; - *) - check_ifs_backshlash_broken=: - break - ;; - esac - done - IFS=$_G_save_IFS - require_check_ifs_backslash=: -} - - -## ----------------- ## -## Global variables. ## -## ----------------- ## - -# Except for the global variables explicitly listed below, the following -# functions in the '^func_' namespace, and the '^require_' namespace -# variables initialised in the 'Resource management' section, sourcing -# this file will not pollute your global namespace with anything -# else. There's no portable way to scope variables in Bourne shell -# though, so actually running these functions will sometimes place -# results into a variable named after the function, and often use -# temporary variables in the '^_G_' namespace. If you are careful to -# avoid using those namespaces casually in your sourcing script, things -# should continue to work as you expect. And, of course, you can freely -# overwrite any of the functions or variables defined here before -# calling anything to customize them. - -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -# Allow overriding, eg assuming that you follow the convention of -# putting '$debug_cmd' at the start of all your functions, you can get -# bash to show function call trace with: -# -# debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name -debug_cmd=${debug_cmd-":"} -exit_cmd=: - -# By convention, finish your script with: -# -# exit $exit_status -# -# so that you can set exit_status to non-zero if you want to indicate -# something went wrong during execution without actually bailing out at -# the point of failure. -exit_status=$EXIT_SUCCESS - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath=$0 - -# The name of this program. -progname=`$ECHO "$progpath" |$SED "$sed_basename"` - -# Make sure we have an absolute progpath for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` - progdir=`cd "$progdir" && pwd` - progpath=$progdir/$progname - ;; - *) - _G_IFS=$IFS - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS=$_G_IFS - test -x "$progdir/$progname" && break - done - IFS=$_G_IFS - test -n "$progdir" || progdir=`pwd` - progpath=$progdir/$progname - ;; -esac - - -## ----------------- ## -## Standard options. ## -## ----------------- ## - -# The following options affect the operation of the functions defined -# below, and should be set appropriately depending on run-time para- -# meters passed on the command line. - -opt_dry_run=false -opt_quiet=false -opt_verbose=false - -# Categories 'all' and 'none' are always available. Append any others -# you will pass as the first argument to func_warning from your own -# code. -warning_categories= - -# By default, display warnings according to 'opt_warning_types'. Set -# 'warning_func' to ':' to elide all warnings, or func_fatal_error to -# treat the next displayed warning as a fatal error. -warning_func=func_warn_and_continue - -# Set to 'all' to display all warnings, 'none' to suppress all -# warnings, or a space delimited list of some subset of -# 'warning_categories' to display only the listed warnings. -opt_warning_types=all - - -## -------------------- ## -## Resource management. ## -## -------------------- ## - -# This section contains definitions for functions that each ensure a -# particular resource (a file, or a non-empty configuration variable for -# example) is available, and if appropriate to extract default values -# from pertinent package files. Call them using their associated -# 'require_*' variable to ensure that they are executed, at most, once. -# -# It's entirely deliberate that calling these functions can set -# variables that don't obey the namespace limitations obeyed by the rest -# of this file, in order that that they be as useful as possible to -# callers. - - -# require_term_colors -# ------------------- -# Allow display of bold text on terminals that support it. -require_term_colors=func_require_term_colors -func_require_term_colors () -{ - $debug_cmd - - test -t 1 && { - # COLORTERM and USE_ANSI_COLORS environment variables take - # precedence, because most terminfo databases neglect to describe - # whether color sequences are supported. - test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} - - if test 1 = "$USE_ANSI_COLORS"; then - # Standard ANSI escape sequences - tc_reset='' - tc_bold=''; tc_standout='' - tc_red=''; tc_green='' - tc_blue=''; tc_cyan='' - else - # Otherwise trust the terminfo database after all. - test -n "`tput sgr0 2>/dev/null`" && { - tc_reset=`tput sgr0` - test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` - tc_standout=$tc_bold - test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` - test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` - test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` - test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` - test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` - } - fi - } - - require_term_colors=: -} - - -## ----------------- ## -## Function library. ## -## ----------------- ## - -# This section contains a variety of useful functions to call in your -# scripts. Take note of the portable wrappers for features provided by -# some modern shells, which will fall back to slower equivalents on -# less featureful shells. - - -# func_append VAR VALUE -# --------------------- -# Append VALUE onto the existing contents of VAR. - - # _G_HAVE_PLUSEQ_OP - # Can be empty, in which case the shell is probed, "yes" if += is - # useable or anything else if it does not work. - if test -z "$_G_HAVE_PLUSEQ_OP" && \ - __PLUSEQ_TEST="a" && \ - __PLUSEQ_TEST+=" b" 2>/dev/null && \ - test "a b" = "$__PLUSEQ_TEST"; then - _G_HAVE_PLUSEQ_OP=yes - fi - -if test yes = "$_G_HAVE_PLUSEQ_OP" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_append () - { - $debug_cmd - - eval "$1+=\$2" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_append () - { - $debug_cmd - - eval "$1=\$$1\$2" - } -fi - - -# func_append_quoted VAR VALUE -# ---------------------------- -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -if test yes = "$_G_HAVE_PLUSEQ_OP"; then - eval 'func_append_quoted () - { - $debug_cmd - - func_quote_arg pretty "$2" - eval "$1+=\\ \$func_quote_arg_result" - }' -else - func_append_quoted () - { - $debug_cmd - - func_quote_arg pretty "$2" - eval "$1=\$$1\\ \$func_quote_arg_result" - } -fi - - -# func_append_uniq VAR VALUE -# -------------------------- -# Append unique VALUE onto the existing contents of VAR, assuming -# entries are delimited by the first character of VALUE. For example: -# -# func_append_uniq options " --another-option option-argument" -# -# will only append to $options if " --another-option option-argument " -# is not already present somewhere in $options already (note spaces at -# each end implied by leading space in second argument). -func_append_uniq () -{ - $debug_cmd - - eval _G_current_value='`$ECHO $'$1'`' - _G_delim=`expr "$2" : '\(.\)'` - - case $_G_delim$_G_current_value$_G_delim in - *"$2$_G_delim"*) ;; - *) func_append "$@" ;; - esac -} - - -# func_arith TERM... -# ------------------ -# Set func_arith_result to the result of evaluating TERMs. - test -z "$_G_HAVE_ARITH_OP" \ - && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ - && _G_HAVE_ARITH_OP=yes - -if test yes = "$_G_HAVE_ARITH_OP"; then - eval 'func_arith () - { - $debug_cmd - - func_arith_result=$(( $* )) - }' -else - func_arith () - { - $debug_cmd - - func_arith_result=`expr "$@"` - } -fi - - -# func_basename FILE -# ------------------ -# Set func_basename_result to FILE with everything up to and including -# the last / stripped. -if test yes = "$_G_HAVE_XSI_OPS"; then - # If this shell supports suffix pattern removal, then use it to avoid - # forking. Hide the definitions single quotes in case the shell chokes - # on unsupported syntax... - _b='func_basename_result=${1##*/}' - _d='case $1 in - */*) func_dirname_result=${1%/*}$2 ;; - * ) func_dirname_result=$3 ;; - esac' - -else - # ...otherwise fall back to using sed. - _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' - _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` - if test "X$func_dirname_result" = "X$1"; then - func_dirname_result=$3 - else - func_append func_dirname_result "$2" - fi' -fi - -eval 'func_basename () -{ - $debug_cmd - - '"$_b"' -}' - - -# func_dirname FILE APPEND NONDIR_REPLACEMENT -# ------------------------------------------- -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -eval 'func_dirname () -{ - $debug_cmd - - '"$_d"' -}' - - -# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT -# -------------------------------------------------------- -# Perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# For efficiency, we do not delegate to the functions above but instead -# duplicate the functionality here. -eval 'func_dirname_and_basename () -{ - $debug_cmd - - '"$_b"' - '"$_d"' -}' - - -# func_echo ARG... -# ---------------- -# Echo program name prefixed message. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_echo_all ARG... -# -------------------- -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - - -# func_echo_infix_1 INFIX ARG... -# ------------------------------ -# Echo program name, followed by INFIX on the first line, with any -# additional lines not showing INFIX. -func_echo_infix_1 () -{ - $debug_cmd - - $require_term_colors - - _G_infix=$1; shift - _G_indent=$_G_infix - _G_prefix="$progname: $_G_infix: " - _G_message=$* - - # Strip color escape sequences before counting printable length - for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" - do - test -n "$_G_tc" && { - _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` - _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` - } - done - _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes - - func_echo_infix_1_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_infix_1_IFS - $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 - _G_prefix=$_G_indent - done - IFS=$func_echo_infix_1_IFS -} - - -# func_error ARG... -# ----------------- -# Echo program name prefixed message to standard error. -func_error () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 -} - - -# func_fatal_error ARG... -# ----------------------- -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - $debug_cmd - - func_error "$*" - exit $EXIT_FAILURE -} - - -# func_grep EXPRESSION FILENAME -# ----------------------------- -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $debug_cmd - - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_len STRING -# --------------- -# Set func_len_result to the length of STRING. STRING may not -# start with a hyphen. - test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_len () - { - $debug_cmd - - func_len_result=${#1} - }' -else - func_len () - { - $debug_cmd - - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` - } -fi - - -# func_mkdir_p DIRECTORY-PATH -# --------------------------- -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - $debug_cmd - - _G_directory_path=$1 - _G_dir_list= - - if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then - - # Protect directory names starting with '-' - case $_G_directory_path in - -*) _G_directory_path=./$_G_directory_path ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$_G_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - _G_dir_list=$_G_directory_path:$_G_dir_list - - # If the last portion added has no slash in it, the list is done - case $_G_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` - done - _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` - - func_mkdir_p_IFS=$IFS; IFS=: - for _G_dir in $_G_dir_list; do - IFS=$func_mkdir_p_IFS - # mkdir can fail with a 'File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$_G_dir" 2>/dev/null || : - done - IFS=$func_mkdir_p_IFS - - # Bail out if we (or some other process) failed to create a directory. - test -d "$_G_directory_path" || \ - func_fatal_error "Failed to create '$1'" - fi -} - - -# func_mktempdir [BASENAME] -# ------------------------- -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, BASENAME is the basename for that directory. -func_mktempdir () -{ - $debug_cmd - - _G_template=${TMPDIR-/tmp}/${1-$progname} - - if test : = "$opt_dry_run"; then - # Return a directory name, but don't create it in dry-run mode - _G_tmpdir=$_G_template-$$ - else - - # If mktemp works, use that first and foremost - _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - - if test ! -d "$_G_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - _G_tmpdir=$_G_template-${RANDOM-0}$$ - - func_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$_G_tmpdir" - umask $func_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$_G_tmpdir" || \ - func_fatal_error "cannot create temporary directory '$_G_tmpdir'" - fi - - $ECHO "$_G_tmpdir" -} - - -# func_normal_abspath PATH -# ------------------------ -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -func_normal_abspath () -{ - $debug_cmd - - # These SED scripts presuppose an absolute path with a trailing slash. - _G_pathcar='s|^/\([^/]*\).*$|\1|' - _G_pathcdr='s|^/[^/]*||' - _G_removedotparts=':dotsl - s|/\./|/|g - t dotsl - s|/\.$|/|' - _G_collapseslashes='s|/\{1,\}|/|g' - _G_finalslash='s|/*$|/|' - - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` - while :; do - # Processed it all yet? - if test / = "$func_normal_abspath_tpath"; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result"; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - - -# func_notquiet ARG... -# -------------------- -# Echo program name prefixed message only when not in quiet mode. -func_notquiet () -{ - $debug_cmd - - $opt_quiet || func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - - -# func_relative_path SRCDIR DSTDIR -# -------------------------------- -# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. -func_relative_path () -{ - $debug_cmd - - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=$func_dirname_result - if test -z "$func_relative_path_tlibdir"; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test -n "$func_stripname_result"; then - func_append func_relative_path_result "/$func_stripname_result" - fi - - # Normalisation. If bindir is libdir, return '.' else relative path. - if test -n "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - fi - - test -n "$func_relative_path_result" || func_relative_path_result=. - - : -} - - -# func_quote_portable EVAL ARG -# ---------------------------- -# Internal function to portably implement func_quote_arg. Note that we still -# keep attention to performance here so we as much as possible try to avoid -# calling sed binary (so far O(N) complexity as long as func_append is O(1)). -func_quote_portable () -{ - $debug_cmd - - $require_check_ifs_backslash - - func_quote_portable_result=$2 - - # one-time-loop (easy break) - while true - do - if $1; then - func_quote_portable_result=`$ECHO "$2" | $SED \ - -e "$sed_double_quote_subst" -e "$sed_double_backslash"` - break - fi - - # Quote for eval. - case $func_quote_portable_result in - *[\\\`\"\$]*) - # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string - # contains the shell wildcard characters. - case $check_ifs_backshlash_broken$func_quote_portable_result in - :*|*[\[\*\?]*) - func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ - | $SED "$sed_quote_subst"` - break - ;; - esac - - func_quote_portable_old_IFS=$IFS - for _G_char in '\' '`' '"' '$' - do - # STATE($1) PREV($2) SEPARATOR($3) - set start "" "" - func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy - IFS=$_G_char - for _G_part in $func_quote_portable_result - do - case $1 in - quote) - func_append func_quote_portable_result "$3$2" - set quote "$_G_part" "\\$_G_char" - ;; - start) - set first "" "" - func_quote_portable_result= - ;; - first) - set quote "$_G_part" "" - ;; - esac - done - done - IFS=$func_quote_portable_old_IFS - ;; - *) ;; - esac - break - done - - func_quote_portable_unquoted_result=$func_quote_portable_result - case $func_quote_portable_result in - # double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # many bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_portable_result=\"$func_quote_portable_result\" - ;; - esac -} - - -# func_quotefast_eval ARG -# ----------------------- -# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', -# but optimized for speed. Result is stored in $func_quotefast_eval. -if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then - printf -v _GL_test_printf_tilde %q '~' - if test '\~' = "$_GL_test_printf_tilde"; then - func_quotefast_eval () - { - printf -v func_quotefast_eval_result %q "$1" - } - else - # Broken older Bash implementations. Make those faster too if possible. - func_quotefast_eval () - { - case $1 in - '~'*) - func_quote_portable false "$1" - func_quotefast_eval_result=$func_quote_portable_result - ;; - *) - printf -v func_quotefast_eval_result %q "$1" - ;; - esac - } - fi -else - func_quotefast_eval () - { - func_quote_portable false "$1" - func_quotefast_eval_result=$func_quote_portable_result - } -fi - - -# func_quote_arg MODEs ARG -# ------------------------ -# Quote one ARG to be evaled later. MODEs argument may contain zero or more -# specifiers listed below separated by ',' character. This function returns two -# values: -# i) func_quote_arg_result -# double-quoted (when needed), suitable for a subsequent eval -# ii) func_quote_arg_unquoted_result -# has all characters that are still active within double -# quotes backslashified. Available only if 'unquoted' is specified. -# -# Available modes: -# ---------------- -# 'eval' (default) -# - escape shell special characters -# 'expand' -# - the same as 'eval'; but do not quote variable references -# 'pretty' -# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might -# be used later in func_quote to get output like: 'echo "a b"' instead -# of 'echo a\ b'. This is slower than default on some shells. -# 'unquoted' -# - produce also $func_quote_arg_unquoted_result which does not contain -# wrapping double-quotes. -# -# Examples for 'func_quote_arg pretty,unquoted string': -# -# string | *_result | *_unquoted_result -# ------------+-----------------------+------------------- -# " | \" | \" -# a b | "a b" | a b -# "a b" | "\"a b\"" | \"a b\" -# * | "*" | * -# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" -# -# Examples for 'func_quote_arg pretty,unquoted,expand string': -# -# string | *_result | *_unquoted_result -# --------------+---------------------+-------------------- -# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" -func_quote_arg () -{ - _G_quote_expand=false - case ,$1, in - *,expand,*) - _G_quote_expand=: - ;; - esac - - case ,$1, in - *,pretty,*|*,expand,*|*,unquoted,*) - func_quote_portable $_G_quote_expand "$2" - func_quote_arg_result=$func_quote_portable_result - func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result - ;; - *) - # Faster quote-for-eval for some shells. - func_quotefast_eval "$2" - func_quote_arg_result=$func_quotefast_eval_result - ;; - esac -} - - -# func_quote MODEs ARGs... -# ------------------------ -# Quote all ARGs to be evaled later and join them into single command. See -# func_quote_arg's description for more info. -func_quote () -{ - $debug_cmd - _G_func_quote_mode=$1 ; shift - func_quote_result= - while test 0 -lt $#; do - func_quote_arg "$_G_func_quote_mode" "$1" - if test -n "$func_quote_result"; then - func_append func_quote_result " $func_quote_arg_result" - else - func_append func_quote_result "$func_quote_arg_result" - fi - shift - done -} - - -# func_stripname PREFIX SUFFIX NAME -# --------------------------------- -# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_stripname () - { - $debug_cmd - - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary variable first. - func_stripname_result=$3 - func_stripname_result=${func_stripname_result#"$1"} - func_stripname_result=${func_stripname_result%"$2"} - }' -else - func_stripname () - { - $debug_cmd - - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; - esac - } -fi - - -# func_show_eval CMD [FAIL_EXP] -# ----------------------------- -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - func_quote_arg pretty,expand "$_G_cmd" - eval "func_notquiet $func_quote_arg_result" - - $opt_dry_run || { - eval "$_G_cmd" - _G_status=$? - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_show_eval_locale CMD [FAIL_EXP] -# ------------------------------------ -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - $opt_quiet || { - func_quote_arg expand,pretty "$_G_cmd" - eval "func_echo $func_quote_arg_result" - } - - $opt_dry_run || { - eval "$_G_user_locale - $_G_cmd" - _G_status=$? - eval "$_G_safe_locale" - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_tr_sh -# ---------- -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - $debug_cmd - - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_verbose ARG... -# ------------------- -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $debug_cmd - - $opt_verbose && func_echo "$*" - - : -} - - -# func_warn_and_continue ARG... -# ----------------------------- -# Echo program name prefixed warning message to standard error. -func_warn_and_continue () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 -} - - -# func_warning CATEGORY ARG... -# ---------------------------- -# Echo program name prefixed warning message to standard error. Warning -# messages can be filtered according to CATEGORY, where this function -# elides messages where CATEGORY is not listed in the global variable -# 'opt_warning_types'. -func_warning () -{ - $debug_cmd - - # CATEGORY must be in the warning_categories list! - case " $warning_categories " in - *" $1 "*) ;; - *) func_internal_error "invalid warning category '$1'" ;; - esac - - _G_category=$1 - shift - - case " $opt_warning_types " in - *" $_G_category "*) $warning_func ${1+"$@"} ;; - esac -} - - -# func_sort_ver VER1 VER2 -# ----------------------- -# 'sort -V' is not generally available. -# Note this deviates from the version comparison in automake -# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a -# but this should suffice as we won't be specifying old -# version formats or redundant trailing .0 in bootstrap.conf. -# If we did want full compatibility then we should probably -# use m4_version_compare from autoconf. -func_sort_ver () -{ - $debug_cmd - - printf '%s\n%s\n' "$1" "$2" \ - | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n -} - -# func_lt_ver PREV CURR -# --------------------- -# Return true if PREV and CURR are in the correct order according to -# func_sort_ver, otherwise false. Use it like this: -# -# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." -func_lt_ver () -{ - $debug_cmd - - test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: -#! /bin/sh - -# A portable, pluggable option parser for Bourne shell. -# Written by Gary V. Vaughan, 2010 - -# This is free software. There is NO warranty; not even for -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# Copyright (C) 2010-2019, 2021 Bootstrap Authors -# -# This file is dual licensed under the terms of the MIT license -# <https://opensource.org/license/MIT>, and GPL version 2 or later -# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of -# these licenses when using or redistributing this software or any of -# the files within it. See the URLs above, or the file `LICENSE` -# included in the Bootstrap distribution for the full license texts. - -# Please report bugs or propose patches to: -# <https://github.com/gnulib-modules/bootstrap/issues> - -# Set a version string for this script. -scriptversion=2019-02-19.15; # UTC - - -## ------ ## -## Usage. ## -## ------ ## - -# This file is a library for parsing options in your shell scripts along -# with assorted other useful supporting features that you can make use -# of too. -# -# For the simplest scripts you might need only: -# -# #!/bin/sh -# . relative/path/to/funclib.sh -# . relative/path/to/options-parser -# scriptversion=1.0 -# func_options ${1+"$@"} -# eval set dummy "$func_options_result"; shift -# ...rest of your script... -# -# In order for the '--version' option to work, you will need to have a -# suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# Copyright'. -# -# For '-h' and '--help' to work, you will also need a one line -# description of your script's purpose in a comment directly above the -# '# Written by ' line, like the one at the top of this file. -# -# The default options also support '--debug', which will turn on shell -# execution tracing (see the comment above debug_cmd below for another -# use), and '--verbose' and the func_verbose function to allow your script -# to display verbose messages only when your user has specified -# '--verbose'. -# -# After sourcing this file, you can plug in processing for additional -# options by amending the variables from the 'Configuration' section -# below, and following the instructions in the 'Option parsing' -# section further down. - -## -------------- ## -## Configuration. ## -## -------------- ## - -# You should override these variables in your script after sourcing this -# file so that they reflect the customisations you have added to the -# option parser. - -# The usage line for option parsing errors and the start of '-h' and -# '--help' output messages. You can embed shell variables for delayed -# expansion at the time the message is displayed, but you will need to -# quote other shell meta-characters carefully to prevent them being -# expanded when the contents are evaled. -usage='$progpath [OPTION]...' - -# Short help message in response to '-h' and '--help'. Add to this or -# override it after sourcing this library to reflect the full set of -# options your script accepts. -usage_message="\ - --debug enable verbose shell tracing - -W, --warnings=CATEGORY - report the warnings falling in CATEGORY [all] - -v, --verbose verbosely report processing - --version print version information and exit - -h, --help print short or long help message and exit -" - -# Additional text appended to 'usage_message' in response to '--help'. -long_help_message=" -Warning categories include: - 'all' show all warnings - 'none' turn off all the warnings - 'error' warnings are treated as fatal errors" - -# Help message printed before fatal option parsing errors. -fatal_help="Try '\$progname --help' for more information." - - - -## ------------------------- ## -## Hook function management. ## -## ------------------------- ## - -# This section contains functions for adding, removing, and running hooks -# in the main code. A hook is just a list of function names that can be -# run in order later on. - -# func_hookable FUNC_NAME -# ----------------------- -# Declare that FUNC_NAME will run hooks added with -# 'func_add_hook FUNC_NAME ...'. -func_hookable () -{ - $debug_cmd - - func_append hookable_fns " $1" -} - - -# func_add_hook FUNC_NAME HOOK_FUNC -# --------------------------------- -# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must -# first have been declared "hookable" by a call to 'func_hookable'. -func_add_hook () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not accept hook functions." ;; - esac - - eval func_append ${1}_hooks '" $2"' -} - - -# func_remove_hook FUNC_NAME HOOK_FUNC -# ------------------------------------ -# Remove HOOK_FUNC from the list of hook functions to be called by -# FUNC_NAME. -func_remove_hook () -{ - $debug_cmd - - eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' -} - - -# func_propagate_result FUNC_NAME_A FUNC_NAME_B -# --------------------------------------------- -# If the *_result variable of FUNC_NAME_A _is set_, assign its value to -# *_result variable of FUNC_NAME_B. -func_propagate_result () -{ - $debug_cmd - - func_propagate_result_result=: - if eval "test \"\${${1}_result+set}\" = set" - then - eval "${2}_result=\$${1}_result" - else - func_propagate_result_result=false - fi -} - - -# func_run_hooks FUNC_NAME [ARG]... -# --------------------------------- -# Run all hook functions registered to FUNC_NAME. -# It's assumed that the list of hook functions contains nothing more -# than a whitespace-delimited list of legal shell function names, and -# no effort is wasted trying to catch shell meta-characters or preserve -# whitespace. -func_run_hooks () -{ - $debug_cmd - - _G_rc_run_hooks=false - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook functions." ;; - esac - - eval _G_hook_fns=\$$1_hooks; shift - - for _G_hook in $_G_hook_fns; do - func_unset "${_G_hook}_result" - eval $_G_hook '${1+"$@"}' - func_propagate_result $_G_hook func_run_hooks - if $func_propagate_result_result; then - eval set dummy "$func_run_hooks_result"; shift - fi - done -} - - - -## --------------- ## -## Option parsing. ## -## --------------- ## - -# In order to add your own option parsing hooks, you must accept the -# full positional parameter list from your hook function. You may remove -# or edit any options that you action, and then pass back the remaining -# unprocessed options in '<hooked_function_name>_result', escaped -# suitably for 'eval'. -# -# The '<hooked_function_name>_result' variable is automatically unset -# before your hook gets called; for best performance, only set the -# *_result variable when necessary (i.e. don't call the 'func_quote' -# function unnecessarily because it can be an expensive operation on some -# machines). -# -# Like this: -# -# my_options_prep () -# { -# $debug_cmd -# -# # Extend the existing usage message. -# usage_message=$usage_message' -# -s, --silent don'\''t print informational messages -# ' -# # No change in '$@' (ignored completely by this hook). Leave -# # my_options_prep_result variable intact. -# } -# func_add_hook func_options_prep my_options_prep -# -# -# my_silent_option () -# { -# $debug_cmd -# -# args_changed=false -# -# # Note that, for efficiency, we parse as many options as we can -# # recognise in a loop before passing the remainder back to the -# # caller on the first unrecognised argument we encounter. -# while test $# -gt 0; do -# opt=$1; shift -# case $opt in -# --silent|-s) opt_silent=: -# args_changed=: -# ;; -# # Separate non-argument short options: -# -s*) func_split_short_opt "$_G_opt" -# set dummy "$func_split_short_opt_name" \ -# "-$func_split_short_opt_arg" ${1+"$@"} -# shift -# args_changed=: -# ;; -# *) # Make sure the first unrecognised option "$_G_opt" -# # is added back to "$@" in case we need it later, -# # if $args_changed was set to 'true'. -# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; -# esac -# done -# -# # Only call 'func_quote' here if we processed at least one argument. -# if $args_changed; then -# func_quote eval ${1+"$@"} -# my_silent_option_result=$func_quote_result -# fi -# } -# func_add_hook func_parse_options my_silent_option -# -# -# my_option_validation () -# { -# $debug_cmd -# -# $opt_silent && $opt_verbose && func_fatal_help "\ -# '--silent' and '--verbose' options are mutually exclusive." -# } -# func_add_hook func_validate_options my_option_validation -# -# You'll also need to manually amend $usage_message to reflect the extra -# options you parse. It's preferable to append if you can, so that -# multiple option parsing hooks can be added safely. - - -# func_options_finish [ARG]... -# ---------------------------- -# Finishing the option parse loop (call 'func_options' hooks ATM). -func_options_finish () -{ - $debug_cmd - - func_run_hooks func_options ${1+"$@"} - func_propagate_result func_run_hooks func_options_finish -} - - -# func_options [ARG]... -# --------------------- -# All the functions called inside func_options are hookable. See the -# individual implementations for details. -func_hookable func_options -func_options () -{ - $debug_cmd - - _G_options_quoted=false - - for my_func in options_prep parse_options validate_options options_finish - do - func_unset func_${my_func}_result - func_unset func_run_hooks_result - eval func_$my_func '${1+"$@"}' - func_propagate_result func_$my_func func_options - if $func_propagate_result_result; then - eval set dummy "$func_options_result"; shift - _G_options_quoted=: - fi - done - - $_G_options_quoted || { - # As we (func_options) are top-level options-parser function and - # nobody quoted "$@" for us yet, we need to do it explicitly for - # caller. - func_quote eval ${1+"$@"} - func_options_result=$func_quote_result - } -} - - -# func_options_prep [ARG]... -# -------------------------- -# All initialisations required before starting the option parse loop. -# Note that when calling hook functions, we pass through the list of -# positional parameters. If a hook function modifies that list, and -# needs to propagate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before returning. -func_hookable func_options_prep -func_options_prep () -{ - $debug_cmd - - # Option defaults: - opt_verbose=false - opt_warning_types= - - func_run_hooks func_options_prep ${1+"$@"} - func_propagate_result func_run_hooks func_options_prep -} - - -# func_parse_options [ARG]... -# --------------------------- -# The main option parsing loop. -func_hookable func_parse_options -func_parse_options () -{ - $debug_cmd - - _G_parse_options_requote=false - # this just eases exit handling - while test $# -gt 0; do - # Defer to hook functions for initial option parsing, so they - # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - func_propagate_result func_run_hooks func_parse_options - if $func_propagate_result_result; then - eval set dummy "$func_parse_options_result"; shift - # Even though we may have changed "$@", we passed the "$@" array - # down into the hook and it quoted it for us (because we are in - # this if-branch). No need to quote it again. - _G_parse_options_requote=false - fi - - # Break out of the loop if we already parsed every option. - test $# -gt 0 || break - - # We expect that one of the options parsed in this function matches - # and thus we remove _G_opt from "$@" and need to re-quote. - _G_match_parse_options=: - _G_opt=$1 - shift - case $_G_opt in - --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" >&2 - $debug_cmd - ;; - - --no-warnings|--no-warning|--no-warn) - set dummy --warnings none ${1+"$@"} - shift - ;; - - --warnings|--warning|-W) - if test $# = 0 && func_missing_arg $_G_opt; then - _G_parse_options_requote=: - break - fi - case " $warning_categories $1" in - *" $1 "*) - # trailing space prevents matching last $1 above - func_append_uniq opt_warning_types " $1" - ;; - *all) - opt_warning_types=$warning_categories - ;; - *none) - opt_warning_types=none - warning_func=: - ;; - *error) - opt_warning_types=$warning_categories - warning_func=func_fatal_error - ;; - *) - func_fatal_error \ - "unsupported warning category: '$1'" - ;; - esac - shift - ;; - - --verbose|-v) opt_verbose=: ;; - --version) func_version ;; - -\?|-h) func_usage ;; - --help) func_help ;; - - # Separate optargs to long options (plugins may need this): - --*=*) func_split_equals "$_G_opt" - set dummy "$func_split_equals_lhs" \ - "$func_split_equals_rhs" ${1+"$@"} - shift - ;; - - # Separate optargs to short options: - -W*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-v*|-x*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) _G_parse_options_requote=: ; break ;; - -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift - _G_match_parse_options=false - break - ;; - esac - - if $_G_match_parse_options; then - _G_parse_options_requote=: - fi - done - - if $_G_parse_options_requote; then - # save modified positional parameters for caller - func_quote eval ${1+"$@"} - func_parse_options_result=$func_quote_result - fi -} - - -# func_validate_options [ARG]... -# ------------------------------ -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -func_hookable func_validate_options -func_validate_options () -{ - $debug_cmd - - # Display all warnings if -W was not given. - test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - - func_run_hooks func_validate_options ${1+"$@"} - func_propagate_result func_run_hooks func_validate_options - - # Bail if the options were screwed! - $exit_cmd $EXIT_FAILURE -} - - - -## ----------------- ## -## Helper functions. ## -## ----------------- ## - -# This section contains the helper functions used by the rest of the -# hookable option parser framework in ascii-betical order. - - -# func_fatal_help ARG... -# ---------------------- -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - eval \$ECHO \""$fatal_help"\" - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - - -# func_help -# --------- -# Echo long help message to standard output and exit. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_help_message" - exit 0 -} - - -# func_missing_arg ARGNAME -# ------------------------ -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $debug_cmd - - func_error "Missing argument for '$1'." - exit_cmd=exit -} - - -# func_split_equals STRING -# ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables -# after splitting STRING at the '=' sign. -test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=${1%%=*} - func_split_equals_rhs=${1#*=} - if test "x$func_split_equals_lhs" = "x$1"; then - func_split_equals_rhs= - fi - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` - func_split_equals_rhs= - test "x$func_split_equals_lhs=" = "x$1" \ - || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` - } -fi #func_split_equals - - -# func_split_short_opt SHORTOPT -# ----------------------------- -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"} - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` - func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` - } -fi #func_split_short_opt - - -# func_usage -# ---------- -# Echo short help message to standard output and exit. -func_usage () -{ - $debug_cmd - - func_usage_message - $ECHO "Run '$progname --help |${PAGER-more}' for full usage" - exit 0 -} - - -# func_usage_message -# ------------------ -# Echo short help message to standard output. -func_usage_message () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - echo - $SED -n 's|^# || - /^Written by/{ - x;p;x - } - h - /^Written by/q' < "$progpath" - echo - eval \$ECHO \""$usage_message"\" -} - - -# func_version -# ------------ -# Echo version message to standard output and exit. -# The version message is extracted from the calling file's header -# comments, with leading '# ' stripped: -# 1. First display the progname and version -# 2. Followed by the header comment line matching /^# Written by / -# 3. Then a blank line followed by the first following line matching -# /^# Copyright / -# 4. Immediately followed by any lines between the previous matches, -# except lines preceding the intervening completely blank line. -# For example, see the header comments of this file. -func_version () -{ - $debug_cmd - - printf '%s\n' "$progname $scriptversion" - $SED -n ' - /^# Written by /!b - s|^# ||; p; n - - :fwd2blnk - /./ { - n - b fwd2blnk - } - p; n - - :holdwrnt - s|^# || - s|^# *$|| - /^Copyright /!{ - /./H - n - b holdwrnt - } - - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - G - s|\(\n\)\n*|\1|g - p; q' < "$progpath" - - exit $? -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: - -# Set a version string. -scriptversion='(GNU libtool) 2.4.7' - - -# func_echo ARG... -# ---------------- -# Libtool also displays the current mode in messages, so override -# funclib.sh func_echo with this custom definition. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - -## ---------------- ## -## Options parsing. ## -## ---------------- ## - -# Hook in the functions to make sure our own options are parsed during -# the option parsing loop. - -usage='$progpath [OPTION]... [MODE-ARG]...' - -# Short help message in response to '-h'. -usage_message="Options: - --config show all configuration variables - --debug enable verbose shell tracing - -n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --mode=MODE use operation mode MODE - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message -" - -# Additional text appended to 'usage_message' in response to '--help'. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_help_message - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. When passed as first option, -'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. -Try '$progname --help --mode=MODE' for a more detailed description of MODE. - -When reporting a bug, please describe a test case to reproduce it and -include the following information: - - host-triplet: $host - shell: $SHELL - compiler: $LTCC - compiler flags: $LTCFLAGS - linker: $LD (gnu? $with_gnu_ld) - version: $progname $scriptversion Debian-2.4.7-7 - automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` - autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` - -Report bugs to <bug-libtool@gnu.org>. -GNU libtool home page: <http://www.gnu.org/s/libtool/>. -General help using GNU software: <http://www.gnu.org/gethelp/>." - exit 0 -} - - -# func_lo2o OBJECT-NAME -# --------------------- -# Transform OBJECT-NAME from a '.lo' suffix to the platform specific -# object suffix. - -lo2o=s/\\.lo\$/.$objext/ -o2lo=s/\\.$objext\$/.lo/ - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_lo2o () - { - case $1 in - *.lo) func_lo2o_result=${1%.lo}.$objext ;; - * ) func_lo2o_result=$1 ;; - esac - }' - - # func_xform LIBOBJ-OR-SOURCE - # --------------------------- - # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) - # suffix to a '.lo' libtool-object suffix. - eval 'func_xform () - { - func_xform_result=${1%.*}.lo - }' -else - # ...otherwise fall back to using sed. - func_lo2o () - { - func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` - } - - func_xform () - { - func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` - } -fi - - -# func_fatal_configuration ARG... -# ------------------------------- -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_fatal_error ${1+"$@"} \ - "See the $PACKAGE documentation for more information." \ - "Fatal configuration error." -} - - -# func_config -# ----------- -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - - -# func_features -# ------------- -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test yes = "$build_libtool_libs"; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test yes = "$build_old_libs"; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - - -# func_enable_tag TAGNAME -# ----------------------- -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname=$1 - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf=/$re_begincf/,/$re_endcf/p - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - - -# func_check_version_match -# ------------------------ -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# libtool_options_prep [ARG]... -# ----------------------------- -# Preparation for options parsed by libtool. -libtool_options_prep () -{ - $debug_mode - - # Option defaults: - opt_config=false - opt_dlopen= - opt_dry_run=false - opt_help=false - opt_mode= - opt_preserve_dup_deps=false - opt_quiet=false - - nonopt= - preserve_args= - - _G_rc_lt_options_prep=: - - _G_rc_lt_options_prep=: - - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - *) - _G_rc_lt_options_prep=false - ;; - esac - - if $_G_rc_lt_options_prep; then - # Pass back the list of options. - func_quote eval ${1+"$@"} - libtool_options_prep_result=$func_quote_result - fi -} -func_add_hook func_options_prep libtool_options_prep - - -# libtool_parse_options [ARG]... -# --------------------------------- -# Provide handling for libtool specific options. -libtool_parse_options () -{ - $debug_cmd - - _G_rc_lt_parse_options=false - - # Perform our own loop to consume as many options as possible in - # each iteration. - while test $# -gt 0; do - _G_match_lt_parse_options=: - _G_opt=$1 - shift - case $_G_opt in - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - - --config) func_config ;; - - --dlopen|-dlopen) - opt_dlopen="${opt_dlopen+$opt_dlopen -}$1" - shift - ;; - - --preserve-dup-deps) - opt_preserve_dup_deps=: ;; - - --features) func_features ;; - - --finish) set dummy --mode finish ${1+"$@"}; shift ;; - - --help) opt_help=: ;; - - --help-all) opt_help=': help-all' ;; - - --mode) test $# = 0 && func_missing_arg $_G_opt && break - opt_mode=$1 - case $1 in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" - exit_cmd=exit - break - ;; - esac - shift - ;; - - --no-silent|--no-quiet) - opt_quiet=false - func_append preserve_args " $_G_opt" - ;; - - --no-warnings|--no-warning|--no-warn) - opt_warning=false - func_append preserve_args " $_G_opt" - ;; - - --no-verbose) - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --silent|--quiet) - opt_quiet=: - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --tag) test $# = 0 && func_missing_arg $_G_opt && break - opt_tag=$1 - func_append preserve_args " $_G_opt $1" - func_enable_tag "$1" - shift - ;; - - --verbose|-v) opt_quiet=false - opt_verbose=: - func_append preserve_args " $_G_opt" - ;; - - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"} ; shift - _G_match_lt_parse_options=false - break - ;; - esac - $_G_match_lt_parse_options && _G_rc_lt_parse_options=: - done - - if $_G_rc_lt_parse_options; then - # save modified positional parameters for caller - func_quote eval ${1+"$@"} - libtool_parse_options_result=$func_quote_result - fi -} -func_add_hook func_parse_options libtool_parse_options - - - -# libtool_validate_options [ARG]... -# --------------------------------- -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -libtool_validate_options () -{ - # save first non-option argument - if test 0 -lt $#; then - nonopt=$1 - shift - fi - - # preserve --debug - test : = "$debug_cmd" || func_append preserve_args " --debug" - - case $host in - # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 - # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 - *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - test yes != "$build_libtool_libs" \ - && test yes != "$build_old_libs" \ - && func_fatal_configuration "not configured to build any kind of library" - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test execute != "$opt_mode"; then - func_error "unrecognized option '-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help=$help - help="Try '$progname --help --mode=$opt_mode' for more information." - } - - # Pass back the unparsed argument list - func_quote eval ${1+"$@"} - libtool_validate_options_result=$func_quote_result -} -func_add_hook func_validate_options libtool_validate_options - - -# Process options as early as possible so that --help and --version -# can return quickly. -func_options ${1+"$@"} -eval set dummy "$func_options_result"; shift - - - -## ----------- ## -## Main. ## -## ----------- ## - -magic='%%%MAGIC variable%%%' -magic_exe='%%%MAGIC EXE variable%%%' - -# Global variables. -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# func_generated_by_libtool -# True iff stdin has been generated by Libtool. This function is only -# a basic sanity check; it will hardly flush out determined imposters. -func_generated_by_libtool_p () -{ - $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if 'file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case $lalib_p_line in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test yes = "$lalib_p" -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - test -f "$1" && - $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $debug_cmd - - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# 'FILE.' does not work on cygwin managed mounts. -func_source () -{ - $debug_cmd - - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case $lt_sysroot:$1 in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result='='$func_stripname_result - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $debug_cmd - - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with '--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=$1 - if test yes = "$build_libtool_libs"; then - write_lobj=\'$2\' - else - write_lobj=none - fi - - if test yes = "$build_old_libs"; then - write_oldobj=\'$3\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T <<EOF -# $write_libobj - a libtool object file -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object=$write_lobj - -# Name of the non-PIC object -non_pic_object=$write_oldobj - -EOF - $MV "${write_libobj}T" "$write_libobj" - } -} - - -################################################## -# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # -################################################## - -# func_convert_core_file_wine_to_w32 ARG -# Helper function used by file name conversion functions when $build is *nix, -# and $host is mingw, cygwin, or some other w32 environment. Relies on a -# correctly configured wine environment available, with the winepath program -# in $build's $PATH. -# -# ARG is the $build file name to be converted to w32 format. -# Result is available in $func_convert_core_file_wine_to_w32_result, and will -# be empty on error (or when ARG is empty) -func_convert_core_file_wine_to_w32 () -{ - $debug_cmd - - func_convert_core_file_wine_to_w32_result=$1 - if test -n "$1"; then - # Unfortunately, winepath does not exit with a non-zero error code, so we - # are forced to check the contents of stdout. On the other hand, if the - # command is not found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both error code of - # zero AND non-empty stdout, which explains the odd construction: - func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $debug_cmd - - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result= - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result"; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $debug_cmd - - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $debug_cmd - - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $debug_cmd - - if test -z "$2" && test -n "$1"; then - func_error "Could not determine host file name corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result=$1 - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $debug_cmd - - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " '$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result=$3 - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $debug_cmd - - case $4 in - $1 ) func_to_host_path_result=$3$func_to_host_path_result - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via '$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $debug_cmd - - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $debug_cmd - - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result=$1 -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result=$func_convert_core_msys_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result=$func_convert_core_file_wine_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via '$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $debug_cmd - - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd=func_convert_path_$func_stripname_result - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $debug_cmd - - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result=$1 -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_msys_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_path_wine_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_dll_def_p FILE -# True iff FILE is a Windows DLL '.def' file. -# Keep in sync with _LT_DLL_DEF_P in libtool.m4 -func_dll_def_p () -{ - $debug_cmd - - func_dll_def_p_tmp=`$SED -n \ - -e 's/^[ ]*//' \ - -e '/^\(;.*\)*$/d' \ - -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ - -e q \ - "$1"` - test DEF = "$func_dll_def_p_tmp" -} - - -# func_mode_compile arg... -func_mode_compile () -{ - $debug_cmd - - # Get the compilation command and the source file. - base_compile= - srcfile=$nonopt # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg=$arg - arg_mode=normal - ;; - - target ) - libobj=$arg - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify '-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs=$IFS; IFS=, - for arg in $args; do - IFS=$save_ifs - func_append_quoted lastarg "$arg" - done - IFS=$save_ifs - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg=$srcfile - srcfile=$arg - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with '-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj=$func_basename_result - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from '$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test yes = "$build_libtool_libs" \ - || func_fatal_configuration "cannot build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_arg pretty "$libobj" - test "X$libobj" != "X$func_quote_arg_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name '$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname=$func_basename_result - xdir=$func_dirname_result - lobj=$xdir$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test yes = "$build_old_libs"; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test no = "$compiler_c_o"; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext - lockfile=$output_obj.lock - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test yes = "$need_locks"; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test warn = "$need_locks"; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_arg pretty "$srcfile" - qsrcfile=$func_quote_arg_result - - # Only build a PIC object if we are building libtool libraries. - if test yes = "$build_libtool_libs"; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test no != "$pic_mode"; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test yes = "$suppress_opt"; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test yes = "$build_old_libs"; then - if test yes != "$pic_mode"; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test yes = "$compiler_c_o"; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test no != "$need_locks"; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test compile = "$opt_mode" && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a '.o' file suitable for static linking - -static only build a '.o' file suitable for static linking - -Wc,FLAG - -Xcompiler FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a 'standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix '.c' with the -library object suffix, '.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to '-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the '--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the 'install' or 'cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE use a list of object files found in FILE to specify objects - -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wa,FLAG - -Xassembler FLAG pass linker-specific FLAG directly to the assembler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with '-') are ignored. - -Every other argument is treated as a filename. Files ending in '.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in '.la', then a libtool library is created, -only library objects ('.lo' files) may be specified, and '-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created -using 'ar' and 'ranlib', or on Windows using 'lib'. - -If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode '$opt_mode'" - ;; - esac - - echo - $ECHO "Try '$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test : = "$opt_help"; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | $SED -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - $SED '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $debug_cmd - - # The first argument is the command name. - cmd=$nonopt - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "'$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "'$file' was not linked with '-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir=$func_dirname_result - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir=$func_dirname_result - ;; - - *) - func_warning "'-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir=$absdir - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic=$magic - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file=$progdir/$program - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file=$progdir/$program - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if $opt_dry_run; then - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - else - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd=\$cmd$args - fi -} - -test execute = "$opt_mode" && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $debug_cmd - - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "'$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument '$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and '=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_quiet && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the '-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the '$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the '$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the '$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test finish = "$opt_mode" && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $debug_cmd - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac - then - # Aesthetically quote it. - func_quote_arg pretty "$nonopt" - install_prog="$func_quote_arg_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_arg pretty "$arg" - func_append install_prog "$func_quote_arg_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=false - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=: ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test X-m = "X$prev" && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_arg pretty "$arg" - func_append install_prog " $func_quote_arg_result" - if test -n "$arg2"; then - func_quote_arg pretty "$arg2" - fi - func_append install_shared_prog " $func_quote_arg_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the '$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_arg pretty "$install_override_mode" - func_append install_shared_prog " -m $func_quote_arg_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=: - if $isdir; then - destdir=$dest - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir=$func_dirname_result - destname=$func_basename_result - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "'$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "'$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir=$func_dirname_result - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking '$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname=$1 - shift - - srcname=$realname - test -n "$relink_command" && srcname=${realname}T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme=$stripme - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme= - ;; - esac - ;; - os2*) - case $realname in - *_dll.a) - tstripme= - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try 'ln -sf' first, because the 'ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib=$destdir/$realname - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name=$func_basename_result - instname=$dir/${name}i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest=$destfile - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to '$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test yes = "$build_old_libs"; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext= - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=.exe - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script '$wrapper'" - - finalize=: - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "'$lib' has not been installed in '$libdir'" - finalize=false - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test no = "$fast_install" && test -n "$relink_command"; then - $opt_dry_run || { - if $finalize; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file=$func_basename_result - outputname=$tmpdir/$file - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_quiet || { - func_quote_arg expand,pretty "$relink_command" - eval "func_echo $func_quote_arg_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink '$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file=$outputname - else - func_warning "cannot relink '$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name=$func_basename_result - - # Set up the ranlib parameters. - oldlib=$destdir/$name - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run '$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test install = "$opt_mode" && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $debug_cmd - - my_outputname=$1 - my_originator=$2 - my_pic_p=${3-false} - my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms=${my_outputname}S.c - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist=$output_objdir/$my_outputname.nm - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* External symbol declarations for the compiler. */\ -" - - if test yes = "$dlself"; then - func_verbose "generating symbol list for '$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from '$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols=$output_objdir/$outputname.exp - $opt_dry_run || { - $RM $export_symbols - eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from '$dlprefile'" - func_basename "$dlprefile" - name=$func_basename_result - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename= - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname"; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename=$func_basename_result - else - # no lafile. user explicitly requested -dlpreopen <import library>. - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename"; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 </dev/null >/dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - func_show_eval '$RM "${nlist}I"' - if test -n "$global_symbol_to_import"; then - eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[];\ -" - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ -static void lt_syminit(void) -{ - LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; - for (; symbol->name; ++symbol) - {" - $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" - echo >> "$output_objdir/$my_dlsyms" "\ - } -}" - fi - echo >> "$output_objdir/$my_dlsyms" "\ -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{ {\"$my_originator\", (void *) 0}," - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ - {\"@INIT@\", (void *) <_syminit}," - fi - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - $my_pic_p && pic_flag_for_symtable=" $pic_flag" - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' - - # Transform the symbol file into the correct name. - symfileobj=$output_objdir/${my_outputname}S.$objext - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for '$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $debug_cmd - - win32_libid_type=unknown - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - case $nm_interface in - "MS dumpbin") - if func_cygming_ms_implib_p "$1" || - func_cygming_gnu_implib_p "$1" - then - win32_nmres=import - else - win32_nmres= - fi - ;; - *) - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s|.*|import| - p - q - } - }'` - ;; - esac - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $debug_cmd - - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $debug_cmd - - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive that possess that section. Heuristic: eliminate - # all those that have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $debug_cmd - - if func_cygming_gnu_implib_p "$1"; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1"; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result= - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $debug_cmd - - f_ex_an_ar_dir=$1; shift - f_ex_an_ar_oldlib=$1 - if test yes = "$lock_old_archive_extraction"; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test yes = "$lock_old_archive_extraction"; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $debug_cmd - - my_gentop=$1; shift - my_oldlibs=${1+"$@"} - my_oldobjs= - my_xlib= - my_xabs= - my_xdir= - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib=$func_basename_result - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir=$my_gentop/$my_xlib_u - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - func_basename "$darwin_archive" - darwin_base_archive=$func_basename_result - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches; do - func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" - $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" - cd "unfat-$$/$darwin_base_archive-$darwin_arch" - func_extract_an_archive "`pwd`" "$darwin_base_archive" - cd "$darwin_curdir" - $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result=$my_oldobjs -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory where it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - func_quote_arg pretty "$ECHO" - qECHO=$func_quote_arg_result - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=$qECHO - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ that is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options that match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test yes = "$fast_install"; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - \$ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat <<EOF - -/* $cwrappersource - temporary wrapper executable for $objdir/$outputname - Generated by $PROGRAM (GNU $PACKAGE) $VERSION - - The $output program cannot be directly executed until all the libtool - libraries that it depends on are installed. - - This wrapper executable should never be moved out of the build directory. - If it is, it will not operate correctly. -*/ -EOF - cat <<"EOF" -#ifdef _MSC_VER -# define _CRT_SECURE_NO_DEPRECATE 1 -#endif -#include <stdio.h> -#include <stdlib.h> -#ifdef _MSC_VER -# include <direct.h> -# include <process.h> -# include <io.h> -#else -# include <unistd.h> -# include <stdint.h> -# ifdef __CYGWIN__ -# include <io.h> -# endif -#endif -#include <malloc.h> -#include <stdarg.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/stat.h> - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* declarations of non-ANSI functions */ -#if defined __MINGW32__ -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined __CYGWIN__ -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined other_platform || defined ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined _MSC_VER -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -#elif defined __MINGW32__ -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined __CYGWIN__ -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined other platforms ... */ -#endif - -#if defined PATH_MAX -# define LT_PATHMAX PATH_MAX -#elif defined MAXPATHLEN -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ - defined __OS2__ -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free (stale); stale = 0; } \ -} while (0) - -#if defined LT_DEBUGWRAPPER -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <<EOF -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) -# define externally_visible volatile -#else -# define externally_visible __attribute__((externally_visible)) volatile -#endif -externally_visible const char * MAGIC_EXE = "$magic_exe"; -const char * LIB_PATH_VARNAME = "$shlibpath_var"; -EOF - - if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - func_to_host_path "$temp_rpath" - cat <<EOF -const char * LIB_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * LIB_PATH_VALUE = ""; -EOF - fi - - if test -n "$dllsearchpath"; then - func_to_host_path "$dllsearchpath:" - cat <<EOF -const char * EXE_PATH_VARNAME = "PATH"; -const char * EXE_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * EXE_PATH_VARNAME = ""; -const char * EXE_PATH_VALUE = ""; -EOF - fi - - if test yes = "$fast_install"; then - cat <<EOF -const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ -EOF - else - cat <<EOF -const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ -EOF - fi - - - cat <<"EOF" - -#define LTWRAPPER_OPTION_PREFIX "--lt-" - -static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; -static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; -static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; - -int -main (int argc, char *argv[]) -{ - char **newargz; - int newargc; - char *tmp_pathspec; - char *actual_cwrapper_path; - char *actual_cwrapper_name; - char *target_name; - char *lt_argv_zero; - int rval = 127; - - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - newargz = XMALLOC (char *, (size_t) argc + 1); - - /* very simple arg parsing; don't want to rely on getopt - * also, copy all non cwrapper options to newargz, except - * argz[0], which is handled differently - */ - newargc=0; - for (i = 1; i < argc; i++) - { - if (STREQ (argv[i], dumpscript_opt)) - { -EOF - case $host in - *mingw* | *cygwin* ) - # make stdout use "unix" line endings - echo " setmode(1,_O_BINARY);" - ;; - esac - - cat <<"EOF" - lt_dump_script (stdout); - return 0; - } - if (STREQ (argv[i], debug_opt)) - { - lt_debug = 1; - continue; - } - if (STREQ (argv[i], ltwrapper_option_prefix)) - { - /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX - namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then - report an error. Otherwise, targets might begin to believe - they are allowed to use options in the LTWRAPPER_OPTION_PREFIX - namespace. The first time any user complains about this, we'll - need to make LTWRAPPER_OPTION_PREFIX a configure-time option - or a configure.ac-settable value. - */ - lt_fatal (__FILE__, __LINE__, - "unrecognized %s option: '%s'", - ltwrapper_option_prefix, argv[i]); - } - /* otherwise ... */ - newargz[++newargc] = xstrdup (argv[i]); - } - newargz[++newargc] = NULL; - -EOF - cat <<EOF - /* The GNU banner must be the first non-error debug message */ - lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n"); -EOF - cat <<"EOF" - lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); - lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); - - tmp_pathspec = find_executable (argv[0]); - if (tmp_pathspec == NULL) - lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (before symlink chase) at: %s\n", - tmp_pathspec); - - actual_cwrapper_path = chase_symlinks (tmp_pathspec); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (after symlink chase) at: %s\n", - actual_cwrapper_path); - XFREE (tmp_pathspec); - - actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); - strendzap (actual_cwrapper_path, actual_cwrapper_name); - - /* wrapper name transforms */ - strendzap (actual_cwrapper_name, ".exe"); - tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); - XFREE (actual_cwrapper_name); - actual_cwrapper_name = tmp_pathspec; - tmp_pathspec = 0; - - /* target_name transforms -- use actual target program name; might have lt- prefix */ - target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); - strendzap (target_name, ".exe"); - tmp_pathspec = lt_extend_str (target_name, ".exe", 1); - XFREE (target_name); - target_name = tmp_pathspec; - tmp_pathspec = 0; - - lt_debugprintf (__FILE__, __LINE__, - "(main) libtool target name: %s\n", - target_name); -EOF - - cat <<EOF - newargz[0] = - XMALLOC (char, (strlen (actual_cwrapper_path) + - strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); - strcpy (newargz[0], actual_cwrapper_path); - strcat (newargz[0], "$objdir"); - strcat (newargz[0], "/"); -EOF - - cat <<"EOF" - /* stop here, and copy so we don't have to do this twice */ - tmp_pathspec = xstrdup (newargz[0]); - - /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ - strcat (newargz[0], actual_cwrapper_name); - - /* DO want the lt- prefix here if it exists, so use target_name */ - lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); - XFREE (tmp_pathspec); - tmp_pathspec = NULL; -EOF - - case $host_os in - mingw*) - cat <<"EOF" - { - char* p; - while ((p = strchr (newargz[0], '\\')) != NULL) - { - *p = '/'; - } - while ((p = strchr (lt_argv_zero, '\\')) != NULL) - { - *p = '/'; - } - } -EOF - ;; - esac - - cat <<"EOF" - XFREE (target_name); - XFREE (actual_cwrapper_path); - XFREE (actual_cwrapper_name); - - lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ - lt_setenv ("DUALCASE", "1"); /* for MSK sh */ - /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must - be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) - because on Windows, both *_VARNAMEs are PATH but uninstalled - libraries must come first. */ - lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); - lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); - - lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", - nonnull (lt_argv_zero)); - for (i = 0; i < newargc; i++) - { - lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", - i, nonnull (newargz[i])); - } - -EOF - - case $host_os in - mingw*) - cat <<"EOF" - /* execv doesn't actually work on mingw as expected on unix */ - newargz = prepare_spawn (newargz); - rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); - if (rval == -1) - { - /* failed to start process */ - lt_debugprintf (__FILE__, __LINE__, - "(main) failed to launch target \"%s\": %s\n", - lt_argv_zero, nonnull (strerror (errno))); - return 127; - } - return rval; -EOF - ;; - *) - cat <<"EOF" - execv (lt_argv_zero, newargz); - return rval; /* =127, but avoids unused variable warning */ -EOF - ;; - esac - - cat <<"EOF" -} - -void * -xmalloc (size_t num) -{ - void *p = (void *) malloc (num); - if (!p) - lt_fatal (__FILE__, __LINE__, "memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), - string) : NULL; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined HAVE_DOS_BASED_FILE_SYSTEM - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char) name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable (const char *path) -{ - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - size_t tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined HAVE_DOS_BASED_FILE_SYSTEM - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined HAVE_DOS_BASED_FILE_SYSTEM - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = (size_t) (q - p); - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (STREQ (str, pat)) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - size_t len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - size_t orig_value_len = strlen (orig_value); - size_t add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - size_t len = strlen (new_value); - while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[--len] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $debug_cmd - - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_suncc_cstd_abi -# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! -# Several compiler flags select an ABI that is incompatible with the -# Cstd library. Avoid specifying it if any are in CXXFLAGS. -func_suncc_cstd_abi () -{ - $debug_cmd - - case " $compile_command " in - *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) - suncc_use_cstd_abi=no - ;; - *) - suncc_use_cstd_abi=yes - ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $debug_cmd - - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # what system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll that has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - os2dllname= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=false - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module=$wl-single_module - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test yes != "$build_libtool_libs" \ - && func_fatal_configuration "cannot build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg=$1 - shift - func_quote_arg pretty,unquoted "$arg" - qarg=$func_quote_arg_unquoted_result - func_append libtool_args " $func_quote_arg_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir=$arg - prev= - continue - ;; - dlfiles|dlprefiles) - $preload || { - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=: - } - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test no = "$dlself"; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test dlprefiles = "$prev"; then - dlself=yes - elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test dlfiles = "$prev"; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols=$arg - test -f "$arg" \ - || func_fatal_error "symbol file '$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex=$arg - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir=$arg - prev= - continue - ;; - mllvm) - # Clang does not use LLVM to link, so we can simply discard any - # '-mllvm $arg' options when doing the link step. - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - if test none != "$pic_object"; then - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - fi - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file '$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - os2dllname) - os2dllname=$arg - prev= - continue - ;; - precious_regex) - precious_files_regex=$arg - prev= - continue - ;; - release) - release=-$arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test rpath = "$prev"; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds=$arg - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xassembler) - func_append compiler_flags " -Xassembler $qarg" - prev= - func_append compile_command " -Xassembler $qarg" - func_append finalize_command " -Xassembler $qarg" - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg=$arg - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "'-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test X-export-symbols = "X$arg"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between '-L' and '$1'" - else - func_fatal_error "need path for '-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of '$dir'" - dir=$absdir - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test X-lc = "X$arg" || test X-lm = "X$arg"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test X-lc = "X$arg" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) - # Do not include libc due to us having libc/libc_r. - test X-lc = "X$arg" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test X-lc = "X$arg" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test X-lc = "X$arg" && continue - ;; - esac - elif test X-lc_r = "X$arg"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -mllvm) - prev=mllvm - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. - -pthread) - case $host in - *solaris2*) ;; - *) - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - ;; - esac - continue - ;; - -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module=$wl-multi_module - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "'-no-install' is ignored for $host" - func_warning "assuming '-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -os2dllname) - prev=os2dllname - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_arg pretty "$flag" - func_append arg " $func_quote_arg_result" - func_append compiler_flags " $func_quote_arg_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_arg pretty "$flag" - func_append arg " $wl$func_quote_arg_result" - func_append compiler_flags " $wl$func_quote_arg_result" - func_append linker_flags " $func_quote_arg_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xassembler) - prev=xassembler - continue - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # -fstack-protector* stack protector flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - # -specs=* GCC specs files - # -stdlib=* select c++ std lib with clang - # -fsanitize=* Clang/GCC memory and address sanitizer - # -fuse-ld=* Linker select flags for GCC - # -static-* direct GCC to link specific libraries statically - # -fcilkplus Cilk Plus language extension features for C/C++ - # -Wa,* Pass flags directly to the assembler - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ - -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus|-Wa,*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - -Z*) - if test os2 = "`expr $host : '.*\(os2\)'`"; then - # OS/2 uses -Zxxx to specify OS/2-specific options - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case $arg in - -Zlinker | -Zstack) - prev=xcompiler - ;; - esac - continue - else - # Otherwise treat like 'Some other compiler flag' below - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - fi - ;; - - # Some other compiler flag. - -* | +*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - test none = "$pic_object" || { - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - } - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test dlfiles = "$prev"; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test dlprefiles = "$prev"; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the '$prevarg' option requires an argument" - - if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname=$func_basename_result - libobjs_save=$libobjs - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - # Definition is injected by LT_CONFIG during libtool generation. - func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" - - func_dirname "$output" "/" "" - output_objdir=$func_dirname_result$objdir - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test lib = "$linkmode"; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=false - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test lib,link = "$linkmode,$pass"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs=$tmp_deplibs - fi - - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass"; then - libs=$deplibs - deplibs= - fi - if test prog = "$linkmode"; then - case $pass in - dlopen) libs=$dlfiles ;; - dlpreopen) libs=$dlprefiles ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test lib,dlpreopen = "$linkmode,$pass"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs=$dlprefiles - fi - if test dlopen = "$pass"; then - # Collect dlpreopened libraries - save_deplibs=$deplibs - deplibs= - fi - - for deplib in $libs; do - lib= - found=false - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test lib != "$linkmode" && test prog != "$linkmode"; then - func_warning "'-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test lib = "$linkmode"; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib=$searchdir/lib$name$search_ext - if test -f "$lib"; then - if test .la = "$search_ext"; then - found=: - else - found=false - fi - break 2 - fi - done - done - if $found; then - # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll=$l - done - if test "X$ll" = "X$old_library"; then # only static version available - found=false - func_dirname "$lib" "" "." - ladir=$func_dirname_result - lib=$ladir/$old_library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - else - # deplib doesn't seem to be a libtool library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; # -l - *.ltframework) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test conv = "$pass" && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - if test scan = "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "'-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test link = "$pass"; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=false - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=: - fi - ;; - pass_all) - valid_a_lib=: - ;; - esac - if $valid_a_lib; then - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - else - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - fi - ;; - esac - continue - ;; - prog) - if test link != "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - elif test prog = "$linkmode"; then - if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=: - continue - ;; - esac # case $deplib - - $found || test -f "$lib" \ - || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "'$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir=$func_dirname_result - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass" || - { test prog != "$linkmode" && test lib != "$linkmode"; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test conv = "$pass"; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - elif test prog != "$linkmode" && test lib != "$linkmode"; then - func_fatal_error "'$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test yes = "$prefer_static_libs" || - test built,no = "$prefer_static_libs,$installed"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib=$l - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - - # This library was specified with -dlopen. - if test dlopen = "$pass"; then - test -z "$libdir" \ - && func_fatal_error "cannot -dlopen a convenience library: '$lib'" - if test -z "$dlname" || - test yes != "$dlopen_support" || - test no = "$build_libtool_libs" - then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of '$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir=$ladir - fi - ;; - esac - func_basename "$lib" - laname=$func_basename_result - - # Find the relevant object directory and library name. - if test yes = "$installed"; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library '$lib' was moved." - dir=$ladir - absdir=$abs_ladir - libdir=$abs_ladir - else - dir=$lt_sysroot$libdir - absdir=$lt_sysroot$libdir - fi - test yes = "$hardcode_automatic" && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir=$ladir - absdir=$abs_ladir - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir=$ladir/$objdir - absdir=$abs_ladir/$objdir - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test dlpreopen = "$pass"; then - if test -z "$libdir" && test prog = "$linkmode"; then - func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" - fi - case $host in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test lib = "$linkmode"; then - deplibs="$dir/$old_library $deplibs" - elif test prog,link = "$linkmode,$pass"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test prog = "$linkmode" && test link != "$pass"; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=false - if test no != "$link_all_deplibs" || test -z "$library_names" || - test no = "$build_libtool_libs"; then - linkalldeplibs=: - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if $linkalldeplibs; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test prog,link = "$linkmode,$pass"; then - if test -n "$library_names" && - { { test no = "$prefer_static_libs" || - test built,yes = "$prefer_static_libs,$installed"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then - # Make sure the rpath contains only unique directories. - case $temp_rpath: in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if $alldeplibs && - { test pass_all = "$deplibs_check_method" || - { test yes = "$build_libtool_libs" && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test built = "$use_static_libs" && test yes = "$installed"; then - use_static_libs=no - fi - if test -n "$library_names" && - { test no = "$use_static_libs" || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc* | *os2*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test no = "$installed"; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule= - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule=$dlpremoduletest - break - fi - done - if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then - echo - if test prog = "$linkmode"; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test lib = "$linkmode" && - test yes = "$hardcode_into_libs"; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname=$1 - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname=$dlname - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc* | *os2*) - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - esac - eval soname=\"$soname_spec\" - else - soname=$realname - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot=$soname - func_basename "$soroot" - soname=$func_basename_result - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from '$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for '$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test prog = "$linkmode" || test relink != "$opt_mode"; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test no = "$hardcode_direct"; then - add=$dir/$linklib - case $host in - *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; - *-*-sysv4*uw2*) add_dir=-L$dir ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir=-L$dir ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we cannot - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library"; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add=$dir/$old_library - fi - elif test -n "$old_library"; then - add=$dir/$old_library - fi - fi - esac - elif test no = "$hardcode_minus_L"; then - case $host in - *-*-sunos*) add_shlibpath=$dir ;; - esac - add_dir=-L$dir - add=-l$name - elif test no = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - relink) - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$dir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$absdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test yes != "$lib_linked"; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test prog = "$linkmode"; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test yes != "$hardcode_direct" && - test yes != "$hardcode_minus_L" && - test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test prog = "$linkmode" || test relink = "$opt_mode"; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$libdir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$libdir - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add=-l$name - elif test yes = "$hardcode_automatic"; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib"; then - add=$inst_prefix_dir$libdir/$linklib - else - add=$libdir/$linklib - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir=-L$libdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - fi - - if test prog = "$linkmode"; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test prog = "$linkmode"; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test unsupported != "$hardcode_direct"; then - test -n "$old_library" && linklib=$old_library - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test yes = "$build_libtool_libs"; then - # Not a shared library - if test pass_all != "$deplibs_check_method"; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system cannot link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test yes = "$module"; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test lib = "$linkmode"; then - if test -n "$dependency_libs" && - { test yes != "$hardcode_into_libs" || - test yes = "$build_old_libs" || - test yes = "$link_static"; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs=$temp_deplibs - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test no != "$link_all_deplibs"; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path=$deplib ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of '$dir'" - absdir=$dir - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names"; then - for tmp in $deplibrary_names; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl"; then - depdepl=$absdir/$objdir/$depdepl - darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" - func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" - path= - fi - fi - ;; - *) - path=-L$absdir/$objdir - ;; - esac - else - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "'$deplib' seems to be moved" - - path=-L$absdir - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test link = "$pass"; then - if test prog = "$linkmode"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs=$newdependency_libs - if test dlpreopen = "$pass"; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test dlopen != "$pass"; then - test conv = "$pass" || { - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - } - - if test prog,link = "$linkmode,$pass"; then - vars="compile_deplibs finalize_deplibs" - else - vars=deplibs - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - - # Add Sun CC postdeps if required: - test CXX = "$tagname" && { - case $host_os in - linux*) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) # Sun C++ 5.9 - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - - solaris*) - func_cc_basename "$CC" - case $func_cc_basename_result in - CC* | sunCC*) - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - esac - } - - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i= - ;; - esac - if test -n "$i"; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test prog = "$linkmode"; then - dlfiles=$newdlfiles - fi - if test prog = "$linkmode" || test lib = "$linkmode"; then - dlprefiles=$newdlprefiles - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "'-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "'-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs=$output - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form 'libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test no = "$module" \ - && func_fatal_help "libtool library '$output' must begin with 'lib'" - - if test no != "$need_lib_prefix"; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test pass_all != "$deplibs_check_method"; then - func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test no = "$dlself" \ - || func_warning "'-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test 1 -lt "$#" \ - && func_warning "ignoring multiple '-rpath's for a libtool library" - - install_libdir=$1 - - oldlibs= - if test -z "$rpath"; then - if test yes = "$build_libtool_libs"; then - # Building a libtool convenience library. - # Some compilers have problems with a '.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "'-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs=$IFS; IFS=: - set dummy $vinfo 0 0 0 - shift - IFS=$save_ifs - - test -n "$7" && \ - func_fatal_help "too many parameters to '-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major=$1 - number_minor=$2 - number_revision=$3 - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # that has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_revision - ;; - freebsd-aout|qnx|sunos) - current=$number_major - revision=$number_minor - age=0 - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_minor - lt_irix_increment=no - ;; - *) - func_fatal_configuration "$modename: unknown library version type '$version_type'" - ;; - esac - ;; - no) - current=$1 - revision=$2 - age=$3 - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT '$current' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION '$revision' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE '$age' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE '$age' is greater than the current interface number '$current'" - func_fatal_error "'$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - # On Darwin other compilers - case $CC in - nagfor*) - verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - ;; - *) - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - esac - ;; - - freebsd-aout) - major=.$current - versuffix=.$current.$revision - ;; - - freebsd-elf | midnightbsd-elf) - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - irix | nonstopux) - if test no = "$lt_irix_increment"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring=$verstring_prefix$major.$revision - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test 0 -ne "$loop"; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring_prefix$major.$iface:$verstring - done - - # Before this point, $major must not contain '.'. - major=.$major - versuffix=$major.$revision - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=.$current.$age.$revision - verstring=$current.$age.$revision - - # Add in all the interfaces that we are compatible with. - loop=$age - while test 0 -ne "$loop"; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring:$iface.0 - done - - # Make executables depend on our current version. - func_append verstring ":$current.0" - ;; - - qnx) - major=.$current - versuffix=.$current - ;; - - sco) - major=.$current - versuffix=.$current - ;; - - sunos) - major=.$current - versuffix=.$current.$revision - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 file systems. - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - - *) - func_fatal_configuration "unknown library version type '$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring=0.0 - ;; - esac - if test no = "$need_version"; then - versuffix= - else - versuffix=.0.0 - fi - fi - - # Remove version info from name if versioning should be avoided - if test yes,no = "$avoid_version,$need_version"; then - major= - versuffix= - verstring= - fi - - # Check to see if the archive will have undefined symbols. - if test yes = "$allow_undefined"; then - if test unsupported = "$allow_undefined_flag"; then - if test yes = "$build_old_libs"; then - func_warning "undefined symbols not allowed in $host shared libraries; building static only" - build_libtool_libs=no - else - func_fatal_error "can't build $host shared library unless -no-undefined is specified" - fi - fi - else - # Don't allow undefined symbols. - allow_undefined_flag=$no_undefined_flag - fi - - fi - - func_generate_dlsyms "$libname" "$libname" : - func_append libobjs " $symfileobj" - test " " = "$libobjs" && libobjs= - - if test relink != "$opt_mode"; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) - if test -n "$precious_files_regex"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles=$dlfiles - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles=$dlprefiles - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test yes = "$build_libtool_libs"; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test yes = "$build_libtool_need_lc"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release= - versuffix= - major= - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c <<EOF - int main() { return 0; } -EOF - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then - ldd_output=`ldd conftest` - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i= - ;; - esac - fi - if test -n "$i"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which I believe you do not have" - echo "*** because a test_compile did reveal that the linker did not use it for" - echo "*** its dynamic dependency list that programs get resolved with at runtime." - fi - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - else - # Error occurred in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $i; then - ldd_output=`ldd conftest` - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i= - ;; - esac - fi - if test -n "$i"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because a test_compile did reveal that the linker did not use this one" - echo "*** as a dynamic dependency that programs can get resolved with at runtime." - fi - fi - else - droppeddeps=yes - echo - $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - fi - ;; - file_magic*) - set dummy $deplibs_check_method; shift - file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib= - ;; - esac - fi - if test -n "$a_deplib"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - if test -n "$file_magic_glob"; then - libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` - else - libnameglob=$libname - fi - test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - if test yes = "$want_nocaseglob"; then - shopt -s nocaseglob - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib=$potent_lib - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | $SED 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; - *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib= - ;; - esac - fi - if test -n "$a_deplib"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib=$potent_lib # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs= - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - for i in $predeps $postdeps; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test none = "$deplibs_check_method"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test yes = "$droppeddeps"; then - if test yes = "$module"; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test no = "$allow_undefined"; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs=$new_libs - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test yes = "$build_libtool_libs"; then - # Remove $wl instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test yes = "$hardcode_into_libs"; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath=$finalize_rpath - test relink = "$opt_mode" || rpath=$compile_rpath$rpath - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath=$finalize_shlibpath - test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname=$1 - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname=$realname - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib=$output_objdir/$realname - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols=$output_objdir/$libname.uexp - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - func_dll_def_p "$export_symbols" || { - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols=$export_symbols - export_symbols= - always_export_symbols=yes - } - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs=$IFS; IFS='~' - for cmd1 in $cmds; do - IFS=$save_ifs - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test yes = "$try_normal_branch" \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=$output_objdir/$output_la.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS=$save_ifs - if test -n "$export_symbols_regex" && test : != "$skipped_export"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test : != "$skipped_export" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs=$tmp_deplibs - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test yes = "$compiler_needs_object" && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test : != "$skipped_export" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then - output=$output_objdir/$output_la.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then - output=$output_objdir/$output_la.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test yes = "$compiler_needs_object"; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-$k.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test -z "$objlist" || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test 1 -eq "$k"; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-$k.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-$k.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - ${skipped_export-false} && { - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - } - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs=$IFS; IFS='~' - for cmd in $concat_cmds; do - IFS=$save_ifs - $opt_quiet || { - func_quote_arg expand,pretty "$cmd" - eval "func_echo $func_quote_arg_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - ${skipped_export-false} && { - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - } - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs=$IFS; IFS='~' - for cmd in $cmds; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - $opt_quiet || { - func_quote_arg expand,pretty "$cmd" - eval "func_echo $func_quote_arg_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test yes = "$module" || test yes = "$export_dynamic"; then - # On all known operating systems, these are identical. - dlname=$soname - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "'-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object '$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj=$output - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # if reload_cmds runs $LD directly, get rid of -Wl from - # whole_archive_flag_spec and hope we can get by with turning comma - # into space. - case $reload_cmds in - *\$LD[\ \$]*) wl= ;; - esac - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags - else - gentop=$output_objdir/${obj}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test yes = "$build_libtool_libs" || libobjs=$non_pic_objects - - # Create the old-style object. - reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs - - output=$obj - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - test yes = "$build_libtool_libs" || { - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - } - - if test -n "$pic_flag" || test default != "$pic_mode"; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output=$libobj - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "'-release' is ignored for programs" - - $preload \ - && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ - && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test CXX = "$tagname"; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " $wl-bind_at_load" - func_append finalize_command " $wl-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs=$new_libs - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath=$rpath - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath=$rpath - - if test -n "$libobjs" && test yes = "$build_old_libs"; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" false - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=: - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=false - ;; - *cygwin* | *mingw* ) - test yes = "$build_libtool_libs" || wrappers_required=false - ;; - *) - if test no = "$need_relink" || test yes != "$build_libtool_libs"; then - wrappers_required=false - fi - ;; - esac - $wrappers_required || { - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command=$compile_command$compile_rpath - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.$objext"; then - func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' - fi - - exit $exit_status - } - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test yes = "$no_install"; then - # We don't need to create a wrapper script. - link_command=$compile_var$compile_command$compile_rpath - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - case $hardcode_action,$fast_install in - relink,*) - # Fast installation is not supported - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "'$output' will be relinked during installation" - ;; - *,yes) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - ;; - *,no) - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - ;; - *,needless) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command= - ;; - esac - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_arg pretty "$var_value" - relink_command="$var=$func_quote_arg_result; export $var; $relink_command" - fi - done - func_quote eval cd "`pwd`" - func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" - relink_command=$func_quote_arg_unquoted_result - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource=$output_path/$objdir/lt-$output_name.c - cwrapper=$output_path/$output_name.exe - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host"; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - case $build_libtool_libs in - convenience) - oldobjs="$libobjs_save $symfileobj" - addlibs=$convenience - build_libtool_libs=no - ;; - module) - oldobjs=$libobjs_save - addlibs=$old_convenience - build_libtool_libs=no - ;; - *) - oldobjs="$old_deplibs $non_pic_objects" - $preload && test -f "$symfileobj" \ - && func_append oldobjs " $symfileobj" - addlibs=$old_convenience - ;; - esac - - if test -n "$addlibs"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase=$func_basename_result - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj"; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test -z "$oldobjs"; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test yes = "$build_old_libs" && old_library=$libname.$libext - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_arg pretty,unquoted "$var_value" - relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - func_quote eval cd "`pwd`" - relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - func_quote_arg pretty,unquoted "$relink_command" - relink_command=$func_quote_arg_unquoted_result - if test yes = "$hardcode_automatic"; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test yes = "$installed"; then - if test -z "$install_libdir"; then - break - fi - output=$output_objdir/${outputname}i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name=$func_basename_result - func_resolve_sysroot "$deplib" - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs=$newdependency_libs - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles=$newdlprefiles - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles=$newdlprefiles - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test -n "$bindir"; then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result/$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test no,yes = "$installed,$need_relink"; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -if test link = "$opt_mode" || test relink = "$opt_mode"; then - func_mode_link ${1+"$@"} -fi - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $debug_cmd - - RM=$nonopt - files= - rmforce=false - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=: ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir=$func_dirname_result - if test . = "$dir"; then - odir=$objdir - else - odir=$dir/$objdir - fi - func_basename "$file" - name=$func_basename_result - test uninstall = "$opt_mode" && odir=$dir - - # Remember odir for removal later, being careful to avoid duplicates - if test clean = "$opt_mode"; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif $rmforce; then - continue - fi - - rmfiles=$file - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case $opt_mode in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && test none != "$pic_object"; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && test none != "$non_pic_object"; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test clean = "$opt_mode"; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.$objext" - if test yes = "$fast_install" && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name"; then - func_append rmfiles " $odir/lt-$noexename.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the $objdir's in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then - func_mode_uninstall ${1+"$@"} -fi - -test -z "$opt_mode" && { - help=$generic_help - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode '$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# where we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/deps/cares/m4/ares_check_user_namespace.m4 b/deps/cares/m4/ares_check_user_namespace.m4 new file mode 100644 index 00000000000000..a26b384fda5c54 --- /dev/null +++ b/deps/cares/m4/ares_check_user_namespace.m4 @@ -0,0 +1,57 @@ +# -*- Autoconf -*- + +# SYNOPSIS +# +# ARES_CHECK_USER_NAMESPACE +# +# DESCRIPTION +# +# This macro checks whether the local system supports Linux user namespaces. +# If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT + +AC_DEFUN([ARES_CHECK_USER_NAMESPACE],[dnl + AC_CACHE_CHECK([whether user namespaces are supported], + ares_cv_user_namespace,[ + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _GNU_SOURCE +#include <fcntl.h> +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/wait.h> + +int userfn(void *d) { + usleep(100000); /* synchronize by sleep */ + return (getuid() != 0); +} +char userst[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; + + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); + + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} + ]])],[ares_cv_user_namespace=yes],[ares_cv_user_namespace=no],[ares_cv_user_namespace=no]) + AC_LANG_POP([C]) + ]) + if test "$ares_cv_user_namespace" = yes; then + AC_DEFINE([HAVE_USER_NAMESPACE],[1],[Whether user namespaces are available]) + fi +]) # ARES_CHECK_USER_NAMESPACE diff --git a/deps/cares/m4/ares_check_uts_namespace.m4 b/deps/cares/m4/ares_check_uts_namespace.m4 new file mode 100644 index 00000000000000..0aeefe4a9b7b8b --- /dev/null +++ b/deps/cares/m4/ares_check_uts_namespace.m4 @@ -0,0 +1,79 @@ +# -*- Autoconf -*- + +# SYNOPSIS +# +# ARES_CHECK_UTS_NAMESPACE +# +# DESCRIPTION +# +# This macro checks whether the local system supports Linux UTS namespaces. +# Also requires user namespaces to be available, so that non-root users +# can enter the namespace. +# If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT + +AC_DEFUN([ARES_CHECK_UTS_NAMESPACE],[dnl + AC_CACHE_CHECK([whether UTS namespaces are supported], + ares_cv_uts_namespace,[ + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _GNU_SOURCE +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> + +int utsfn(void *d) { + char buffer[1024]; + const char *name = "autoconftest"; + int rc = sethostname(name, strlen(name)); + if (rc != 0) return 1; + gethostname(buffer, 1024); + return (strcmp(buffer, name) != 0); +} + +char st2[1024*1024]; +int fn(void *d) { + pid_t child; + int rc, status; + usleep(100000); /* synchronize by sleep */ + if (getuid() != 0) return 1; + child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); + if (child < 0) return 1; + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} +char st[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; + + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); + + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} +]]) + ],[ares_cv_uts_namespace=yes],[ares_cv_uts_namespace=no],[ares_cv_uts_namespace=no]) + AC_LANG_POP([C]) + ]) + if test "$ares_cv_uts_namespace" = yes; then + AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available]) + fi +]) # ARES_CHECK_UTS_NAMESPACE diff --git a/deps/cares/m4/ax_append_compile_flags.m4 b/deps/cares/m4/ax_append_compile_flags.m4 index 1f8e70845c20d9..9c856356c0cda6 100644 --- a/deps/cares/m4/ax_append_compile_flags.m4 +++ b/deps/cares/m4/ax_append_compile_flags.m4 @@ -1,10 +1,10 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html -# =========================================================================== +# ============================================================================ +# https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# ============================================================================ # # SYNOPSIS # -# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -20,6 +20,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: This macro depends on the AX_APPEND_FLAG and # AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with # AX_APPEND_LINK_FLAGS. @@ -28,38 +30,17 @@ # # Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> # -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 3 +#serial 7 AC_DEFUN([AX_APPEND_COMPILE_FLAGS], -[AC_REQUIRE([AX_CHECK_COMPILE_FLAG]) -AC_REQUIRE([AX_APPEND_FLAG]) +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) for flag in $1; do - AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3]) + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) done ])dnl AX_APPEND_COMPILE_FLAGS diff --git a/deps/cares/m4/ax_append_flag.m4 b/deps/cares/m4/ax_append_flag.m4 index 1d38b76fb8e157..dd6d8b61406c32 100644 --- a/deps/cares/m4/ax_append_flag.m4 +++ b/deps/cares/m4/ax_append_flag.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS @@ -23,47 +23,28 @@ # Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> # Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> # -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 2 +#serial 8 AC_DEFUN([AX_APPEND_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX -AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl -AS_VAR_SET_IF(FLAGS, - [case " AS_VAR_GET(FLAGS) " in - *" $1 "*) - AC_RUN_LOG([: FLAGS already contains $1]) - ;; - *) - AC_RUN_LOG([: FLAGS="$FLAGS $1"]) - AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) - ;; - esac], - [AS_VAR_SET(FLAGS,["$1"])]) +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG diff --git a/deps/cares/m4/ax_check_compile_flag.m4 b/deps/cares/m4/ax_check_compile_flag.m4 index c3a8d695a1bcda..54191c55353ee5 100644 --- a/deps/cares/m4/ax_check_compile_flag.m4 +++ b/deps/cares/m4/ax_check_compile_flag.m4 @@ -1,10 +1,10 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # @@ -27,45 +29,34 @@ # Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> # Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> # -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 2 +#serial 11 AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ +AC_CACHE_CHECK([whether the _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + if test x"m4_case(_AC_LANG, + [C], [$GCC], + [C++], [$GXX], + [Fortran], [$GFC], + [Fortran 77], [$G77], + [Objective C], [$GOBJC], + [Objective C++], [$GOBJCXX], + [no])" = xyes ; then + add_gnu_werror="-Werror" + fi + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1 $add_gnu_werror" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/deps/cares/m4/ax_check_user_namespace.m4 b/deps/cares/m4/ax_check_user_namespace.m4 deleted file mode 100644 index aca721626f2e89..00000000000000 --- a/deps/cares/m4/ax_check_user_namespace.m4 +++ /dev/null @@ -1,57 +0,0 @@ -# -*- Autoconf -*- - -# SYNOPSIS -# -# AX_CHECK_USER_NAMESPACE -# -# DESCRIPTION -# -# This macro checks whether the local system supports Linux user namespaces. -# If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). -# -# Copyright (C) The c-ares team -# SPDX-License-Identifier: MIT - -AC_DEFUN([AX_CHECK_USER_NAMESPACE],[dnl - AC_CACHE_CHECK([whether user namespaces are supported], - ax_cv_user_namespace,[ - AC_LANG_PUSH([C]) - AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#define _GNU_SOURCE -#include <fcntl.h> -#include <sched.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> - -int userfn(void *d) { - usleep(100000); /* synchronize by sleep */ - return (getuid() != 0); -} -char userst[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; - - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); - - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} - ]])],[ax_cv_user_namespace=yes],[ax_cv_user_namespace=no],[ax_cv_user_namespace=no]) - AC_LANG_POP([C]) - ]) - if test "$ax_cv_user_namespace" = yes; then - AC_DEFINE([HAVE_USER_NAMESPACE],[1],[Whether user namespaces are available]) - fi -]) # AX_CHECK_USER_NAMESPACE diff --git a/deps/cares/m4/ax_check_uts_namespace.m4 b/deps/cares/m4/ax_check_uts_namespace.m4 deleted file mode 100644 index 5708acf1b9f376..00000000000000 --- a/deps/cares/m4/ax_check_uts_namespace.m4 +++ /dev/null @@ -1,79 +0,0 @@ -# -*- Autoconf -*- - -# SYNOPSIS -# -# AX_CHECK_UTS_NAMESPACE -# -# DESCRIPTION -# -# This macro checks whether the local system supports Linux UTS namespaces. -# Also requires user namespaces to be available, so that non-root users -# can enter the namespace. -# If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE). -# -# Copyright (C) The c-ares team -# SPDX-License-Identifier: MIT - -AC_DEFUN([AX_CHECK_UTS_NAMESPACE],[dnl - AC_CACHE_CHECK([whether UTS namespaces are supported], - ax_cv_uts_namespace,[ - AC_LANG_PUSH([C]) - AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#define _GNU_SOURCE -#include <sched.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/wait.h> - -int utsfn(void *d) { - char buffer[1024]; - const char *name = "autoconftest"; - int rc = sethostname(name, strlen(name)); - if (rc != 0) return 1; - gethostname(buffer, 1024); - return (strcmp(buffer, name) != 0); -} - -char st2[1024*1024]; -int fn(void *d) { - pid_t child; - int rc, status; - usleep(100000); /* synchronize by sleep */ - if (getuid() != 0) return 1; - child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); - if (child < 0) return 1; - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} -char st[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; - - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); - - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} -]]) - ],[ax_cv_uts_namespace=yes],[ax_cv_uts_namespace=no],[ax_cv_uts_namespace=no]) - AC_LANG_POP([C]) - ]) - if test "$ax_cv_uts_namespace" = yes; then - AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available]) - fi -]) # AX_CHECK_UTS_NAMESPACE diff --git a/deps/cares/m4/ax_code_coverage.m4 b/deps/cares/m4/ax_code_coverage.m4 index ad4063305ebcdd..216708a41f10c9 100644 --- a/deps/cares/m4/ax_code_coverage.m4 +++ b/deps/cares/m4/ax_code_coverage.m4 @@ -74,7 +74,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. -#serial 34 +#serial 37 m4_define(_AX_CODE_COVERAGE_RULES,[ AX_ADD_AM_MACRO_STATIC([ @@ -144,7 +144,7 @@ code_coverage_v_lcov_cap_ = \$(code_coverage_v_lcov_cap_\$(AM_DEFAULT_VERBOSITY) code_coverage_v_lcov_cap_0 = @echo \" LCOV --capture\" \$(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = \$(code_coverage_v_lcov_ign_\$(V)) code_coverage_v_lcov_ign_ = \$(code_coverage_v_lcov_ign_\$(AM_DEFAULT_VERBOSITY)) -code_coverage_v_lcov_ign_0 = @echo \" LCOV --remove /tmp/*\" \$(CODE_COVERAGE_IGNORE_PATTERN); +code_coverage_v_lcov_ign_0 = @echo \" LCOV --remove\" \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = \$(code_coverage_v_genhtml_\$(V)) code_coverage_v_genhtml_ = \$(code_coverage_v_genhtml_\$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo \" GEN \" \"\$(CODE_COVERAGE_OUTPUT_DIRECTORY)\"; @@ -163,7 +163,7 @@ check-code-coverage: # Capture code coverage data code-coverage-capture: code-coverage-capture-hook \$(code_coverage_v_lcov_cap)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --capture --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" --test-name \"\$(call code_coverage_sanitize,\$(PACKAGE_NAME)-\$(PACKAGE_VERSION))\" --no-checksum --compat-libtool \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_OPTIONS) - \$(code_coverage_v_lcov_ign)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --remove \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \"/tmp/*\" \$(CODE_COVERAGE_IGNORE_PATTERN) --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_RMOPTS) + \$(code_coverage_v_lcov_ign)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --remove \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(CODE_COVERAGE_IGNORE_PATTERN) --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(code_coverage_v_genhtml)LANG=C \$(GENHTML) \$(code_coverage_quiet) \$(addprefix --prefix ,\$(CODE_COVERAGE_DIRECTORY)) --output-directory \"\$(CODE_COVERAGE_OUTPUT_DIRECTORY)\" --title \"\$(PACKAGE_NAME)-\$(PACKAGE_VERSION) Code Coverage\" --legend --show-details \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_GENHTML_OPTIONS) @echo \"file://\$(abs_builddir)/\$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html\" @@ -206,14 +206,14 @@ code-coverage-capture-hook: ]) AC_DEFUN([_AX_CODE_COVERAGE_ENABLED],[ - AX_CHECK_GNU_MAKE([],AC_MSG_ERROR([not using GNU make that is needed for coverage])) + AX_CHECK_GNU_MAKE([],[AC_MSG_ERROR([not using GNU make that is needed for coverage])]) AC_REQUIRE([AX_ADD_AM_MACRO_STATIC]) # check for gcov AC_CHECK_TOOL([GCOV], [$_AX_CODE_COVERAGE_GCOV_PROG_WITH], [:]) AS_IF([test "X$GCOV" = "X:"], - AC_MSG_ERROR([gcov is needed to do coverage])) + [AC_MSG_ERROR([gcov is needed to do coverage])]) AC_SUBST([GCOV]) dnl Check if gcc is being used @@ -232,12 +232,13 @@ AC_DEFUN([_AX_CODE_COVERAGE_ENABLED],[ AC_MSG_ERROR([Could not find genhtml from the lcov package]) ]) + AC_CHECK_LIB([gcov], [_gcov_init], [CODE_COVERAGE_LIBS="-lgcov"], [CODE_COVERAGE_LIBS=""]) + dnl Build the code coverage flags dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" - CODE_COVERAGE_LIBS="-lgcov" AC_SUBST([CODE_COVERAGE_CPPFLAGS]) AC_SUBST([CODE_COVERAGE_CFLAGS]) diff --git a/deps/cares/m4/ax_cxx_compile_stdcxx.m4 b/deps/cares/m4/ax_cxx_compile_stdcxx.m4 index 8edf5152ec7a91..fe6ae17e6c4d32 100644 --- a/deps/cares/m4/ax_cxx_compile_stdcxx.m4 +++ b/deps/cares/m4/ax_cxx_compile_stdcxx.m4 @@ -10,8 +10,8 @@ # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for -# the respective C++ standard version. +# CXXCPP to enable support. VERSION may be '11', '14', '17', '20', or +# '23' for the respective C++ standard version. # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. @@ -36,14 +36,15 @@ # Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com> # Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com> # Copyright (c) 2020 Jason Merrill <jason@redhat.com> -# Copyright (c) 2021 Jörn Heusipp <osmanx@problemloesungsmaschine.de> +# Copyright (c) 2021, 2024 Jörn Heusipp <osmanx@problemloesungsmaschine.de> +# Copyright (c) 2015, 2022, 2023, 2024 Olly Betts # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 18 +#serial 25 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). @@ -53,6 +54,7 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [$1], [20], [ax_cxx_compile_alternatives="20"], + [$1], [23], [ax_cxx_compile_alternatives="23"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], @@ -159,31 +161,41 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11] ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14] ) dnl Test body for checking C++17 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17] ) dnl Test body for checking C++20 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20] +) + +dnl Test body for checking C++23 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_23], + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_23] ) @@ -201,7 +213,17 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -617,7 +639,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 201703L && !defined _MSC_VER +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L #error "This is not a C++17 compiler" @@ -983,7 +1005,7 @@ namespace cxx17 } // namespace cxx17 -#endif // __cplusplus < 201703L && !defined _MSC_VER +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L ]]) @@ -996,7 +1018,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 202002L && !defined _MSC_VER +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L #error "This is not a C++20 compiler" @@ -1013,6 +1035,36 @@ namespace cxx20 } // namespace cxx20 -#endif // __cplusplus < 202002L && !defined _MSC_VER +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L + +]]) + + +dnl Tests for new features in C++23 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_23], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L + +#error "This is not a C++23 compiler" + +#else + +#include <version> + +namespace cxx23 +{ + +// As C++23 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx23 + +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L ]]) diff --git a/deps/cares/m4/ax_cxx_compile_stdcxx_14.m4 b/deps/cares/m4/ax_cxx_compile_stdcxx_14.m4 deleted file mode 100644 index 094db0d025cbb7..00000000000000 --- a/deps/cares/m4/ax_cxx_compile_stdcxx_14.m4 +++ /dev/null @@ -1,34 +0,0 @@ -# ============================================================================= -# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_14.html -# ============================================================================= -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX_14([ext|noext], [mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the C++14 -# standard; if necessary, add switches to CXX and CXXCPP to enable -# support. -# -# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX -# macro with the version set to C++14. The two optional arguments are -# forwarded literally as the second and third argument respectively. -# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for -# more information. If you want to use this macro, you also need to -# download the ax_cxx_compile_stdcxx.m4 file. -# -# LICENSE -# -# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu> -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 5 - -AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) -AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [AX_CXX_COMPILE_STDCXX([14], [$1], [$2])]) diff --git a/deps/cares/m4/ax_pthread.m4 b/deps/cares/m4/ax_pthread.m4 index 9f35d139149f8d..f882317660b9e4 100644 --- a/deps/cares/m4/ax_pthread.m4 +++ b/deps/cares/m4/ax_pthread.m4 @@ -160,7 +160,7 @@ ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread -- case $host_os in - freebsd*) + freebsd*|midnightbsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) diff --git a/deps/cares/m4/libtool.m4 b/deps/cares/m4/libtool.m4 old mode 100644 new mode 100755 diff --git a/deps/cares/m4/ltoptions.m4 b/deps/cares/m4/ltoptions.m4 old mode 100644 new mode 100755 diff --git a/deps/cares/m4/ltsugar.m4 b/deps/cares/m4/ltsugar.m4 old mode 100644 new mode 100755 diff --git a/deps/cares/m4/ltversion.m4 b/deps/cares/m4/ltversion.m4 old mode 100644 new mode 100755 diff --git a/deps/cares/m4/lt~obsolete.m4 b/deps/cares/m4/lt~obsolete.m4 old mode 100644 new mode 100755 diff --git a/deps/cares/maketgz b/deps/cares/maketgz deleted file mode 100755 index e97230b2da1624..00000000000000 --- a/deps/cares/maketgz +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env perl -# Copyright (C) Daniel Stenberg -# SPDX-License-Identifier: MIT - -$version = $ARGV[0]; - -if($version eq "") { - print "Enter version number!\n"; - exit; -} - -if(!-f "include/ares.h") { - print "run this script in the ares source root dir\n"; - exit; -} - -my ($major, $minor, $patch)=split(/\./, $version); - -$major += 0; -$minor += 0; -$patch += 0; - -open(VER, "<include/ares_version.h") || - die "can't open include/ares_version.h"; -open(NEWV, ">include/ares_version.h.dist"); -while(<VER>) { - $_ =~ s/^\#define ARES_VERSION_MAJOR .*/\#define ARES_VERSION_MAJOR $major/; - $_ =~ s/^\#define ARES_VERSION_MINOR .*/\#define ARES_VERSION_MINOR $minor/; - $_ =~ s/^\#define ARES_VERSION_PATCH .*/\#define ARES_VERSION_PATCH $patch/; - $_ =~ s/^\#define ARES_VERSION_STR .*/\#define ARES_VERSION_STR \"$version\"/; - - print NEWV $_; -} -close(VER); -close(NEWV); -print "include/ares_version.h.dist created\n"; - -if(!-f "configure") { - print "running buildconf\n"; - `./buildconf`; -} -print "adding $version in the configure.ac file\n"; -`sed -e 's/AC_INIT.*/AC_INIT([c-ares], [$version],/' < configure.ac > configure.ac.dist`; - -print "adding $version in the CMakeLists.txt file\n"; -`sed -e 's/SET.*CARES_VERSION.*/SET (CARES_VERSION "$version")/' < CMakeLists.txt > CMakeLists.txt.dist && rm -f CMakeLists.txt && mv CMakeLists.txt.dist CMakeLists.txt`; - -# now make a new configure script with this -print "makes a new configure script\n"; -`autoconf configure.ac.dist >configure`; - -# now run this new configure to get a fine makefile -print "running configure\n"; -`./configure`; - -print "produce CHANGES\n"; -`git log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./git2changes.pl > CHANGES.dist`; - -# now make the actual tarball -print "running make dist\n"; -`make dist VERSION=$version`; - -# remove temporary sourced man pages -`make -s clean-sourced-manpages`; - -print "removing temporary configure.ac file\n"; -`rm configure.ac.dist`; -print "removing temporary ares_version.h file\n"; -`rm include/ares_version.h.dist`; - -print "NOTE: now tag this release!\n"; diff --git a/deps/cares/missing b/deps/cares/missing deleted file mode 100755 index 1fe1611f18514b..00000000000000 --- a/deps/cares/missing +++ /dev/null @@ -1,215 +0,0 @@ -#! /bin/sh -# Common wrapper for a few potentially missing GNU programs. - -scriptversion=2018-03-07.03; # UTC - -# Copyright (C) 1996-2021 Free Software Foundation, Inc. -# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <https://www.gnu.org/licenses/>. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try '$0 --help' for more information" - exit 1 -fi - -case $1 in - - --is-lightweight) - # Used by our autoconf macros to check whether the available missing - # script is modern enough. - exit 0 - ;; - - --run) - # Back-compat with the calling convention used by older automake. - shift - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due -to PROGRAM being missing or too old. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal autoconf autoheader autom4te automake makeinfo - bison yacc flex lex help2man - -Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and -'g' are ignored when checking the name. - -Send bug reports to <bug-automake@gnu.org>." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: unknown '$1' option" - echo 1>&2 "Try '$0 --help' for more information" - exit 1 - ;; - -esac - -# Run the given program, remember its exit status. -"$@"; st=$? - -# If it succeeded, we are done. -test $st -eq 0 && exit 0 - -# Also exit now if we it failed (or wasn't found), and '--version' was -# passed; such an option is passed most likely to detect whether the -# program is present and works. -case $2 in --version|--help) exit $st;; esac - -# Exit code 63 means version mismatch. This often happens when the user -# tries to use an ancient version of a tool on a file that requires a -# minimum version. -if test $st -eq 63; then - msg="probably too old" -elif test $st -eq 127; then - # Program was missing. - msg="missing on your system" -else - # Program was found and executed, but failed. Give up. - exit $st -fi - -perl_URL=https://www.perl.org/ -flex_URL=https://github.com/westes/flex -gnu_software_URL=https://www.gnu.org/software - -program_details () -{ - case $1 in - aclocal|automake) - echo "The '$1' program is part of the GNU Automake package:" - echo "<$gnu_software_URL/automake>" - echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/autoconf>" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - autoconf|autom4te|autoheader) - echo "The '$1' program is part of the GNU Autoconf package:" - echo "<$gnu_software_URL/autoconf/>" - echo "It also requires GNU m4 and Perl in order to run:" - echo "<$gnu_software_URL/m4/>" - echo "<$perl_URL>" - ;; - esac -} - -give_advice () -{ - # Normalize program name to check for. - normalized_program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - - printf '%s\n' "'$1' is $msg." - - configure_deps="'configure.ac' or m4 files included by 'configure.ac'" - case $normalized_program in - autoconf*) - echo "You should only need it if you modified 'configure.ac'," - echo "or m4 files included by it." - program_details 'autoconf' - ;; - autoheader*) - echo "You should only need it if you modified 'acconfig.h' or" - echo "$configure_deps." - program_details 'autoheader' - ;; - automake*) - echo "You should only need it if you modified 'Makefile.am' or" - echo "$configure_deps." - program_details 'automake' - ;; - aclocal*) - echo "You should only need it if you modified 'acinclude.m4' or" - echo "$configure_deps." - program_details 'aclocal' - ;; - autom4te*) - echo "You might have modified some maintainer files that require" - echo "the 'autom4te' program to be rebuilt." - program_details 'autom4te' - ;; - bison*|yacc*) - echo "You should only need it if you modified a '.y' file." - echo "You may want to install the GNU Bison package:" - echo "<$gnu_software_URL/bison/>" - ;; - lex*|flex*) - echo "You should only need it if you modified a '.l' file." - echo "You may want to install the Fast Lexical Analyzer package:" - echo "<$flex_URL>" - ;; - help2man*) - echo "You should only need it if you modified a dependency" \ - "of a man page." - echo "You may want to install the GNU Help2man package:" - echo "<$gnu_software_URL/help2man/>" - ;; - makeinfo*) - echo "You should only need it if you modified a '.texi' file, or" - echo "any other file indirectly affecting the aspect of the manual." - echo "You might want to install the Texinfo package:" - echo "<$gnu_software_URL/texinfo/>" - echo "The spurious makeinfo call might also be the consequence of" - echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" - echo "want to install GNU make:" - echo "<$gnu_software_URL/make/>" - ;; - *) - echo "You might have modified some files without having the proper" - echo "tools for further handling them. Check the 'README' file, it" - echo "often tells you about the needed prerequisites for installing" - echo "this package. You may also peek at any GNU archive site, in" - echo "case some other package contains this missing '$1' program." - ;; - esac -} - -give_advice "$1" | sed -e '1s/^/WARNING: /' \ - -e '2,$s/^/ /' >&2 - -# Propagate the correct exit status (expected to be 127 for a program -# not found, 63 for a program that failed due to version mismatch). -exit $st - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/deps/cares/msvc_ver.inc b/deps/cares/msvc_ver.inc deleted file mode 100644 index 61bdb59ae2c124..00000000000000 --- a/deps/cares/msvc_ver.inc +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) The c-ares project and its contributors -# SPDX-License-Identifier: MIT -# ----------------------------------------------- -# Detect NMAKE version deducing old MSVC versions -# ----------------------------------------------- - -!IFNDEF _NMAKE_VER -! MESSAGE Macro _NMAKE_VER not defined. -! MESSAGE Use MSVC's NMAKE to process this makefile. -! ERROR See previous message. -!ENDIF - -!IF "$(_NMAKE_VER)" == "6.00.8168.0" -CC_VERS_NUM = 60 -!ELSEIF "$(_NMAKE_VER)" == "6.00.9782.0" -CC_VERS_NUM = 60 -!ELSEIF "$(_NMAKE_VER)" == "7.00.8882" -CC_VERS_NUM = 70 -!ELSEIF "$(_NMAKE_VER)" == "7.00.9466" -CC_VERS_NUM = 70 -!ELSEIF "$(_NMAKE_VER)" == "7.00.9955" -CC_VERS_NUM = 70 -!ELSE -# Pick an arbitrary bigger number for all later versions -CC_VERS_NUM = 199 -!ENDIF diff --git a/deps/cares/src/Makefile.in b/deps/cares/src/Makefile.in index f657ef0d43e7b9..ff4275b6baf522 100644 --- a/deps/cares/src/Makefile.in +++ b/deps/cares/src/Makefile.in @@ -89,7 +89,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -99,12 +101,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -248,10 +247,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt index de73f712f1d1ce..bdb2690fb673f9 100644 --- a/deps/cares/src/lib/CMakeLists.txt +++ b/deps/cares/src/lib/CMakeLists.txt @@ -15,6 +15,14 @@ IF (CARES_SHARED) # Include resource file in windows builds for versioned DLLs IF (WIN32) TARGET_SOURCES (${PROJECT_NAME} PRIVATE cares.rc) + + # Check for use of llvm-rc (implies clang is being used). We need to set the + # compile flags to use the correct codepage for the resource compiler. + # This is needed for the copyright symbol to be encoded correctly. + # The default codepage is 1252 (Windows Latin-1) but llvm-rc defaults to UTF-8. + if (CMAKE_RC_COMPILER MATCHES "llvm-rc") + set_source_files_properties(cares.rc PROPERTIES COMPILE_FLAGS "/C 1252") + endif() ENDIF() # Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION @@ -36,6 +44,10 @@ IF (CARES_SHARED) C_STANDARD 90 ) + IF (ANDROID) + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES C_STANDARD 99) + ENDIF () + IF (CARES_SYMBOL_HIDING) SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES C_VISIBILITY_PRESET hidden @@ -49,6 +61,7 @@ IF (CARES_SHARED) "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/include" ) TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) @@ -87,11 +100,27 @@ IF (CARES_STATIC) SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES EXPORT_NAME cares${STATIC_SUFFIX} - OUTPUT_NAME cares${STATIC_SUFFIX} COMPILE_PDB_NAME cares${STATIC_SUFFIX} C_STANDARD 90 ) + # On Windows, the output name should have a static suffix since otherwise + # we would have conflicting output names (libcares.lib) for the link + # library. + # However on Unix-like systems, we typically have something like + # libcares.so for shared libraries and libcares.a for static + # libraries, so these don't conflict. + # This behavior better emulates what happens with autotools builds + IF (WIN32) + SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares${STATIC_SUFFIX}) + ELSE () + SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares) + ENDIF() + + IF (ANDROID) + SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES C_STANDARD 99) + ENDIF () + IF (CARES_STATIC_PIC) SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES POSITION_INDEPENDENT_CODE True) ENDIF () @@ -102,6 +131,7 @@ IF (CARES_STATIC) "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/include" ) TARGET_COMPILE_DEFINITIONS (${LIBNAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) diff --git a/deps/cares/src/lib/Makefile.am b/deps/cares/src/lib/Makefile.am index 44e04bd35ccf7d..db4f2640f2bd40 100644 --- a/deps/cares/src/lib/Makefile.am +++ b/deps/cares/src/lib/Makefile.am @@ -11,7 +11,8 @@ ACLOCAL_AMFLAGS = -I m4 --install AM_CPPFLAGS += -I$(top_builddir)/include \ -I$(top_builddir)/src/lib \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/lib + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include lib_LTLIBRARIES = libcares.la diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in index 0060295c21e8ef..e92732eaf72c8d 100644 --- a/deps/cares/src/lib/Makefile.in +++ b/deps/cares/src/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sat Mar 30 16:15:43 CET 2024 +# from AX_AM_MACROS_STATIC on Mon Dec 8 16:21:41 UTC 2025 # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT @@ -100,7 +100,9 @@ host_triplet = @host@ subdir = src/lib SUBDIRS = ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -110,12 +112,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -160,61 +159,78 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libcares_la_LIBADD = -am__objects_1 = libcares_la-ares__addrinfo2hostent.lo \ - libcares_la-ares__addrinfo_localhost.lo \ - libcares_la-ares__buf.lo libcares_la-ares__close_sockets.lo \ - libcares_la-ares__hosts_file.lo libcares_la-ares__htable.lo \ - libcares_la-ares__htable_asvp.lo \ - libcares_la-ares__htable_strvp.lo \ - libcares_la-ares__htable_szvp.lo \ - libcares_la-ares__iface_ips.lo libcares_la-ares__llist.lo \ - libcares_la-ares__parse_into_addrinfo.lo \ - libcares_la-ares__slist.lo libcares_la-ares__socket.lo \ - libcares_la-ares__sortaddrinfo.lo libcares_la-ares__threads.lo \ - libcares_la-ares__timeval.lo libcares_la-ares_android.lo \ - libcares_la-ares_cancel.lo libcares_la-ares_data.lo \ - libcares_la-ares_destroy.lo libcares_la-ares_dns_mapping.lo \ - libcares_la-ares_dns_name.lo libcares_la-ares_dns_parse.lo \ - libcares_la-ares_dns_record.lo libcares_la-ares_dns_write.lo \ - libcares_la-ares_event_epoll.lo \ - libcares_la-ares_event_kqueue.lo \ - libcares_la-ares_event_poll.lo \ - libcares_la-ares_event_select.lo \ - libcares_la-ares_event_thread.lo \ - libcares_la-ares_event_wake_pipe.lo \ - libcares_la-ares_event_win32.lo \ - libcares_la-ares_expand_name.lo \ - libcares_la-ares_expand_string.lo libcares_la-ares_fds.lo \ - libcares_la-ares_free_hostent.lo \ +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = libcares_la-ares_addrinfo2hostent.lo \ + libcares_la-ares_addrinfo_localhost.lo \ + libcares_la-ares_android.lo libcares_la-ares_cancel.lo \ + libcares_la-ares_close_sockets.lo libcares_la-ares_conn.lo \ + libcares_la-ares_cookie.lo libcares_la-ares_data.lo \ + libcares_la-ares_destroy.lo libcares_la-ares_free_hostent.lo \ libcares_la-ares_free_string.lo \ libcares_la-ares_freeaddrinfo.lo \ libcares_la-ares_getaddrinfo.lo libcares_la-ares_getenv.lo \ libcares_la-ares_gethostbyaddr.lo \ libcares_la-ares_gethostbyname.lo \ - libcares_la-ares_getnameinfo.lo libcares_la-ares_getsock.lo \ + libcares_la-ares_getnameinfo.lo libcares_la-ares_hosts_file.lo \ libcares_la-ares_init.lo libcares_la-ares_library_init.lo \ - libcares_la-ares_math.lo libcares_la-ares_create_query.lo \ - libcares_la-ares_options.lo libcares_la-ares_parse_a_reply.lo \ - libcares_la-ares_parse_aaaa_reply.lo \ - libcares_la-ares_parse_caa_reply.lo \ - libcares_la-ares_parse_mx_reply.lo \ - libcares_la-ares_parse_naptr_reply.lo \ - libcares_la-ares_parse_ns_reply.lo \ - libcares_la-ares_parse_ptr_reply.lo \ - libcares_la-ares_parse_soa_reply.lo \ - libcares_la-ares_parse_srv_reply.lo \ - libcares_la-ares_parse_txt_reply.lo \ - libcares_la-ares_parse_uri_reply.lo \ - libcares_la-ares_platform.lo libcares_la-ares_process.lo \ - libcares_la-ares_qcache.lo libcares_la-ares_query.lo \ - libcares_la-ares_rand.lo libcares_la-ares_search.lo \ - libcares_la-ares_send.lo libcares_la-ares_strcasecmp.lo \ - libcares_la-ares_str.lo libcares_la-ares_strerror.lo \ - libcares_la-ares_strsplit.lo libcares_la-ares_sysconfig.lo \ + libcares_la-ares_metrics.lo libcares_la-ares_options.lo \ + libcares_la-ares_parse_into_addrinfo.lo \ + libcares_la-ares_process.lo libcares_la-ares_qcache.lo \ + libcares_la-ares_query.lo libcares_la-ares_search.lo \ + libcares_la-ares_send.lo \ + libcares_la-ares_set_socket_functions.lo \ + libcares_la-ares_socket.lo libcares_la-ares_sortaddrinfo.lo \ + libcares_la-ares_strerror.lo libcares_la-ares_sysconfig.lo \ libcares_la-ares_sysconfig_files.lo \ - libcares_la-ares_timeout.lo libcares_la-ares_update_servers.lo \ - libcares_la-ares_version.lo libcares_la-inet_net_pton.lo \ - libcares_la-inet_ntop.lo libcares_la-windows_port.lo + libcares_la-ares_sysconfig_mac.lo \ + libcares_la-ares_sysconfig_win.lo libcares_la-ares_timeout.lo \ + libcares_la-ares_update_servers.lo libcares_la-ares_version.lo \ + libcares_la-inet_net_pton.lo libcares_la-inet_ntop.lo \ + libcares_la-windows_port.lo dsa/libcares_la-ares_array.lo \ + dsa/libcares_la-ares_htable.lo \ + dsa/libcares_la-ares_htable_asvp.lo \ + dsa/libcares_la-ares_htable_dict.lo \ + dsa/libcares_la-ares_htable_strvp.lo \ + dsa/libcares_la-ares_htable_szvp.lo \ + dsa/libcares_la-ares_htable_vpstr.lo \ + dsa/libcares_la-ares_htable_vpvp.lo \ + dsa/libcares_la-ares_llist.lo dsa/libcares_la-ares_slist.lo \ + event/libcares_la-ares_event_configchg.lo \ + event/libcares_la-ares_event_epoll.lo \ + event/libcares_la-ares_event_kqueue.lo \ + event/libcares_la-ares_event_poll.lo \ + event/libcares_la-ares_event_select.lo \ + event/libcares_la-ares_event_thread.lo \ + event/libcares_la-ares_event_wake_pipe.lo \ + event/libcares_la-ares_event_win32.lo \ + legacy/libcares_la-ares_create_query.lo \ + legacy/libcares_la-ares_expand_name.lo \ + legacy/libcares_la-ares_expand_string.lo \ + legacy/libcares_la-ares_fds.lo \ + legacy/libcares_la-ares_getsock.lo \ + legacy/libcares_la-ares_parse_a_reply.lo \ + legacy/libcares_la-ares_parse_aaaa_reply.lo \ + legacy/libcares_la-ares_parse_caa_reply.lo \ + legacy/libcares_la-ares_parse_mx_reply.lo \ + legacy/libcares_la-ares_parse_naptr_reply.lo \ + legacy/libcares_la-ares_parse_ns_reply.lo \ + legacy/libcares_la-ares_parse_ptr_reply.lo \ + legacy/libcares_la-ares_parse_soa_reply.lo \ + legacy/libcares_la-ares_parse_srv_reply.lo \ + legacy/libcares_la-ares_parse_txt_reply.lo \ + legacy/libcares_la-ares_parse_uri_reply.lo \ + record/libcares_la-ares_dns_mapping.lo \ + record/libcares_la-ares_dns_multistring.lo \ + record/libcares_la-ares_dns_name.lo \ + record/libcares_la-ares_dns_parse.lo \ + record/libcares_la-ares_dns_record.lo \ + record/libcares_la-ares_dns_write.lo \ + str/libcares_la-ares_buf.lo str/libcares_la-ares_str.lo \ + str/libcares_la-ares_strsplit.lo \ + util/libcares_la-ares_iface_ips.lo \ + util/libcares_la-ares_threads.lo \ + util/libcares_la-ares_timeval.lo util/libcares_la-ares_math.lo \ + util/libcares_la-ares_rand.lo util/libcares_la-ares_uri.lo am__objects_2 = am_libcares_la_OBJECTS = $(am__objects_1) $(am__objects_2) libcares_la_OBJECTS = $(am_libcares_la_OBJECTS) @@ -241,43 +257,15 @@ DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = \ - ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo \ - ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo \ - ./$(DEPDIR)/libcares_la-ares__buf.Plo \ - ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo \ - ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo \ - ./$(DEPDIR)/libcares_la-ares__htable.Plo \ - ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo \ - ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo \ - ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo \ - ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo \ - ./$(DEPDIR)/libcares_la-ares__llist.Plo \ - ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo \ - ./$(DEPDIR)/libcares_la-ares__slist.Plo \ - ./$(DEPDIR)/libcares_la-ares__socket.Plo \ - ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo \ - ./$(DEPDIR)/libcares_la-ares__threads.Plo \ - ./$(DEPDIR)/libcares_la-ares__timeval.Plo \ + ./$(DEPDIR)/libcares_la-ares_addrinfo2hostent.Plo \ + ./$(DEPDIR)/libcares_la-ares_addrinfo_localhost.Plo \ ./$(DEPDIR)/libcares_la-ares_android.Plo \ ./$(DEPDIR)/libcares_la-ares_cancel.Plo \ - ./$(DEPDIR)/libcares_la-ares_create_query.Plo \ + ./$(DEPDIR)/libcares_la-ares_close_sockets.Plo \ + ./$(DEPDIR)/libcares_la-ares_conn.Plo \ + ./$(DEPDIR)/libcares_la-ares_cookie.Plo \ ./$(DEPDIR)/libcares_la-ares_data.Plo \ ./$(DEPDIR)/libcares_la-ares_destroy.Plo \ - ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo \ - ./$(DEPDIR)/libcares_la-ares_dns_name.Plo \ - ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo \ - ./$(DEPDIR)/libcares_la-ares_dns_record.Plo \ - ./$(DEPDIR)/libcares_la-ares_dns_write.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_epoll.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_kqueue.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_poll.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_select.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_thread.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo \ - ./$(DEPDIR)/libcares_la-ares_event_win32.Plo \ - ./$(DEPDIR)/libcares_la-ares_expand_name.Plo \ - ./$(DEPDIR)/libcares_la-ares_expand_string.Plo \ - ./$(DEPDIR)/libcares_la-ares_fds.Plo \ ./$(DEPDIR)/libcares_la-ares_free_hostent.Plo \ ./$(DEPDIR)/libcares_la-ares_free_string.Plo \ ./$(DEPDIR)/libcares_la-ares_freeaddrinfo.Plo \ @@ -286,41 +274,80 @@ am__depfiles_remade = \ ./$(DEPDIR)/libcares_la-ares_gethostbyaddr.Plo \ ./$(DEPDIR)/libcares_la-ares_gethostbyname.Plo \ ./$(DEPDIR)/libcares_la-ares_getnameinfo.Plo \ - ./$(DEPDIR)/libcares_la-ares_getsock.Plo \ + ./$(DEPDIR)/libcares_la-ares_hosts_file.Plo \ ./$(DEPDIR)/libcares_la-ares_init.Plo \ ./$(DEPDIR)/libcares_la-ares_library_init.Plo \ - ./$(DEPDIR)/libcares_la-ares_math.Plo \ + ./$(DEPDIR)/libcares_la-ares_metrics.Plo \ ./$(DEPDIR)/libcares_la-ares_options.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo \ - ./$(DEPDIR)/libcares_la-ares_platform.Plo \ + ./$(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Plo \ ./$(DEPDIR)/libcares_la-ares_process.Plo \ ./$(DEPDIR)/libcares_la-ares_qcache.Plo \ ./$(DEPDIR)/libcares_la-ares_query.Plo \ - ./$(DEPDIR)/libcares_la-ares_rand.Plo \ ./$(DEPDIR)/libcares_la-ares_search.Plo \ ./$(DEPDIR)/libcares_la-ares_send.Plo \ - ./$(DEPDIR)/libcares_la-ares_str.Plo \ - ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo \ + ./$(DEPDIR)/libcares_la-ares_set_socket_functions.Plo \ + ./$(DEPDIR)/libcares_la-ares_socket.Plo \ + ./$(DEPDIR)/libcares_la-ares_sortaddrinfo.Plo \ ./$(DEPDIR)/libcares_la-ares_strerror.Plo \ - ./$(DEPDIR)/libcares_la-ares_strsplit.Plo \ ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo \ ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig_mac.Plo \ + ./$(DEPDIR)/libcares_la-ares_sysconfig_win.Plo \ ./$(DEPDIR)/libcares_la-ares_timeout.Plo \ ./$(DEPDIR)/libcares_la-ares_update_servers.Plo \ ./$(DEPDIR)/libcares_la-ares_version.Plo \ ./$(DEPDIR)/libcares_la-inet_net_pton.Plo \ ./$(DEPDIR)/libcares_la-inet_ntop.Plo \ - ./$(DEPDIR)/libcares_la-windows_port.Plo + ./$(DEPDIR)/libcares_la-windows_port.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_array.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_llist.Plo \ + dsa/$(DEPDIR)/libcares_la-ares_slist.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_configchg.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_epoll.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_kqueue.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_poll.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_select.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_thread.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo \ + event/$(DEPDIR)/libcares_la-ares_event_win32.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_create_query.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_expand_name.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_expand_string.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_fds.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_getsock.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo \ + legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_mapping.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_multistring.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_name.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_parse.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_record.Plo \ + record/$(DEPDIR)/libcares_la-ares_dns_write.Plo \ + str/$(DEPDIR)/libcares_la-ares_buf.Plo \ + str/$(DEPDIR)/libcares_la-ares_str.Plo \ + str/$(DEPDIR)/libcares_la-ares_strsplit.Plo \ + util/$(DEPDIR)/libcares_la-ares_iface_ips.Plo \ + util/$(DEPDIR)/libcares_la-ares_math.Plo \ + util/$(DEPDIR)/libcares_la-ares_rand.Plo \ + util/$(DEPDIR)/libcares_la-ares_threads.Plo \ + util/$(DEPDIR)/libcares_la-ares_timeval.Plo \ + util/$(DEPDIR)/libcares_la-ares_uri.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -420,7 +447,7 @@ AM_CFLAGS = @AM_CFLAGS@ # might possibly already be installed in the system. AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/include \ -I$(top_builddir)/src/lib -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/lib + -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ @@ -465,10 +492,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -600,7 +632,7 @@ libcares_la_CPPFLAGS_EXTRA = -DCARES_BUILDING_LIBRARY $(am__append_3) \ @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_cap_0 = @echo " LCOV --capture" $(CODE_COVERAGE_OUTPUT_FILE); @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) -@CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN); +@CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_0 = @echo " LCOV --remove" "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN); @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml_0 = @echo " GEN " "$(CODE_COVERAGE_OUTPUT_DIRECTORY)"; @@ -614,42 +646,15 @@ libcares_la_CPPFLAGS_EXTRA = -DCARES_BUILDING_LIBRARY $(am__append_3) \ libcares_la_LIBS = $(CODE_COVERAGE_LIBS) libcares_la_CFLAGS = $(AM_CFLAGS) $(libcares_la_CFLAGS_EXTRA) libcares_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcares_la_CPPFLAGS_EXTRA) -CSOURCES = ares__addrinfo2hostent.c \ - ares__addrinfo_localhost.c \ - ares__buf.c \ - ares__close_sockets.c \ - ares__hosts_file.c \ - ares__htable.c \ - ares__htable_asvp.c \ - ares__htable_strvp.c \ - ares__htable_szvp.c \ - ares__iface_ips.c \ - ares__llist.c \ - ares__parse_into_addrinfo.c \ - ares__slist.c \ - ares__socket.c \ - ares__sortaddrinfo.c \ - ares__threads.c \ - ares__timeval.c \ +CSOURCES = ares_addrinfo2hostent.c \ + ares_addrinfo_localhost.c \ ares_android.c \ ares_cancel.c \ + ares_close_sockets.c \ + ares_conn.c \ + ares_cookie.c \ ares_data.c \ ares_destroy.c \ - ares_dns_mapping.c \ - ares_dns_name.c \ - ares_dns_parse.c \ - ares_dns_record.c \ - ares_dns_write.c \ - ares_event_epoll.c \ - ares_event_kqueue.c \ - ares_event_poll.c \ - ares_event_select.c \ - ares_event_thread.c \ - ares_event_wake_pipe.c \ - ares_event_win32.c \ - ares_expand_name.c \ - ares_expand_string.c \ - ares_fds.c \ ares_free_hostent.c \ ares_free_string.c \ ares_freeaddrinfo.c \ @@ -658,67 +663,115 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_gethostbyaddr.c \ ares_gethostbyname.c \ ares_getnameinfo.c \ - ares_getsock.c \ + ares_hosts_file.c \ ares_init.c \ ares_library_init.c \ - ares_math.c \ - ares_create_query.c \ + ares_metrics.c \ ares_options.c \ - ares_parse_a_reply.c \ - ares_parse_aaaa_reply.c \ - ares_parse_caa_reply.c \ - ares_parse_mx_reply.c \ - ares_parse_naptr_reply.c \ - ares_parse_ns_reply.c \ - ares_parse_ptr_reply.c \ - ares_parse_soa_reply.c \ - ares_parse_srv_reply.c \ - ares_parse_txt_reply.c \ - ares_parse_uri_reply.c \ - ares_platform.c \ + ares_parse_into_addrinfo.c \ ares_process.c \ - ares_qcache.c \ + ares_qcache.c \ ares_query.c \ - ares_rand.c \ ares_search.c \ ares_send.c \ - ares_strcasecmp.c \ - ares_str.c \ + ares_set_socket_functions.c \ + ares_socket.c \ + ares_sortaddrinfo.c \ ares_strerror.c \ - ares_strsplit.c \ - ares_sysconfig.c \ - ares_sysconfig_files.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ + ares_sysconfig_mac.c \ + ares_sysconfig_win.c \ ares_timeout.c \ - ares_update_servers.c \ + ares_update_servers.c \ ares_version.c \ inet_net_pton.c \ inet_ntop.c \ - windows_port.c - -HHEADERS = ares__buf.h \ - ares__htable.h \ - ares__htable_asvp.h \ - ares__htable_strvp.h \ - ares__htable_szvp.h \ - ares__iface_ips.h \ - ares__llist.h \ - ares__slist.h \ - ares__threads.h \ - ares_android.h \ + windows_port.c \ + dsa/ares_array.c \ + dsa/ares_htable.c \ + dsa/ares_htable_asvp.c \ + dsa/ares_htable_dict.c \ + dsa/ares_htable_strvp.c \ + dsa/ares_htable_szvp.c \ + dsa/ares_htable_vpstr.c \ + dsa/ares_htable_vpvp.c \ + dsa/ares_llist.c \ + dsa/ares_slist.c \ + event/ares_event_configchg.c \ + event/ares_event_epoll.c \ + event/ares_event_kqueue.c \ + event/ares_event_poll.c \ + event/ares_event_select.c \ + event/ares_event_thread.c \ + event/ares_event_wake_pipe.c \ + event/ares_event_win32.c \ + legacy/ares_create_query.c \ + legacy/ares_expand_name.c \ + legacy/ares_expand_string.c \ + legacy/ares_fds.c \ + legacy/ares_getsock.c \ + legacy/ares_parse_a_reply.c \ + legacy/ares_parse_aaaa_reply.c \ + legacy/ares_parse_caa_reply.c \ + legacy/ares_parse_mx_reply.c \ + legacy/ares_parse_naptr_reply.c \ + legacy/ares_parse_ns_reply.c \ + legacy/ares_parse_ptr_reply.c \ + legacy/ares_parse_soa_reply.c \ + legacy/ares_parse_srv_reply.c \ + legacy/ares_parse_txt_reply.c \ + legacy/ares_parse_uri_reply.c \ + record/ares_dns_mapping.c \ + record/ares_dns_multistring.c \ + record/ares_dns_name.c \ + record/ares_dns_parse.c \ + record/ares_dns_record.c \ + record/ares_dns_write.c \ + str/ares_buf.c \ + str/ares_str.c \ + str/ares_strsplit.c \ + util/ares_iface_ips.c \ + util/ares_threads.c \ + util/ares_timeval.c \ + util/ares_math.c \ + util/ares_rand.c \ + util/ares_uri.c + +HHEADERS = ares_android.h \ + ares_conn.h \ ares_data.h \ - ares_dns_private.h \ - ares_event.h \ - ares_event_win32.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_ipv6.h \ - ares_platform.h \ ares_private.h \ - ares_strcasecmp.h \ - ares_str.h \ - ares_strsplit.h \ ares_setup.h \ - setup_once.h + ares_socket.h \ + dsa/ares_htable.h \ + dsa/ares_slist.h \ + event/ares_event.h \ + event/ares_event_win32.h \ + include/ares_array.h \ + include/ares_buf.h \ + include/ares_htable_asvp.h \ + include/ares_htable_dict.h \ + include/ares_htable_strvp.h \ + include/ares_htable_szvp.h \ + include/ares_htable_vpstr.h \ + include/ares_htable_vpvp.h \ + include/ares_llist.h \ + include/ares_mem.h \ + include/ares_str.h \ + record/ares_dns_multistring.h \ + record/ares_dns_private.h \ + str/ares_strsplit.h \ + util/ares_iface_ips.h \ + util/ares_math.h \ + util/ares_rand.h \ + util/ares_time.h \ + util/ares_threads.h \ + util/ares_uri.h \ + thirdparty/apple/dnsinfo.h # Makefile.inc provides the CSOURCES and HHEADERS defines @@ -808,53 +861,171 @@ clean-libLTLIBRARIES: echo rm -f $${locs}; \ rm -f $${locs}; \ } +dsa/$(am__dirstamp): + @$(MKDIR_P) dsa + @: > dsa/$(am__dirstamp) +dsa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) dsa/$(DEPDIR) + @: > dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_array.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_asvp.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_dict.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_strvp.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_szvp.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_vpstr.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_htable_vpvp.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_llist.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +dsa/libcares_la-ares_slist.lo: dsa/$(am__dirstamp) \ + dsa/$(DEPDIR)/$(am__dirstamp) +event/$(am__dirstamp): + @$(MKDIR_P) event + @: > event/$(am__dirstamp) +event/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) event/$(DEPDIR) + @: > event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_configchg.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_epoll.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_kqueue.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_poll.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_select.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_thread.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_wake_pipe.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +event/libcares_la-ares_event_win32.lo: event/$(am__dirstamp) \ + event/$(DEPDIR)/$(am__dirstamp) +legacy/$(am__dirstamp): + @$(MKDIR_P) legacy + @: > legacy/$(am__dirstamp) +legacy/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) legacy/$(DEPDIR) + @: > legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_create_query.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_expand_name.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_expand_string.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_fds.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_getsock.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_a_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_aaaa_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_caa_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_mx_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_naptr_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_ns_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_ptr_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_soa_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_srv_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_txt_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +legacy/libcares_la-ares_parse_uri_reply.lo: legacy/$(am__dirstamp) \ + legacy/$(DEPDIR)/$(am__dirstamp) +record/$(am__dirstamp): + @$(MKDIR_P) record + @: > record/$(am__dirstamp) +record/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) record/$(DEPDIR) + @: > record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_mapping.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_multistring.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_name.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_parse.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_record.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +record/libcares_la-ares_dns_write.lo: record/$(am__dirstamp) \ + record/$(DEPDIR)/$(am__dirstamp) +str/$(am__dirstamp): + @$(MKDIR_P) str + @: > str/$(am__dirstamp) +str/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) str/$(DEPDIR) + @: > str/$(DEPDIR)/$(am__dirstamp) +str/libcares_la-ares_buf.lo: str/$(am__dirstamp) \ + str/$(DEPDIR)/$(am__dirstamp) +str/libcares_la-ares_str.lo: str/$(am__dirstamp) \ + str/$(DEPDIR)/$(am__dirstamp) +str/libcares_la-ares_strsplit.lo: str/$(am__dirstamp) \ + str/$(DEPDIR)/$(am__dirstamp) +util/$(am__dirstamp): + @$(MKDIR_P) util + @: > util/$(am__dirstamp) +util/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) util/$(DEPDIR) + @: > util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_iface_ips.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_threads.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_timeval.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_math.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_rand.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) +util/libcares_la-ares_uri.lo: util/$(am__dirstamp) \ + util/$(DEPDIR)/$(am__dirstamp) libcares.la: $(libcares_la_OBJECTS) $(libcares_la_DEPENDENCIES) $(EXTRA_libcares_la_DEPENDENCIES) $(AM_V_CCLD)$(libcares_la_LINK) -rpath $(libdir) $(libcares_la_OBJECTS) $(libcares_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) + -rm -f dsa/*.$(OBJEXT) + -rm -f dsa/*.lo + -rm -f event/*.$(OBJEXT) + -rm -f event/*.lo + -rm -f legacy/*.$(OBJEXT) + -rm -f legacy/*.lo + -rm -f record/*.$(OBJEXT) + -rm -f record/*.lo + -rm -f str/*.$(OBJEXT) + -rm -f str/*.lo + -rm -f util/*.$(OBJEXT) + -rm -f util/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__buf.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__close_sockets.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__hosts_file.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__iface_ips.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__llist.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__slist.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__socket.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__threads.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares__timeval.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_addrinfo2hostent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_addrinfo_localhost.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_android.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_cancel.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_create_query.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_close_sockets.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_conn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_cookie.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_destroy.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_name.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_parse.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_record.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_dns_write.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_epoll.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_kqueue.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_poll.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_select.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_thread.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_event_win32.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_name.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_expand_string.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_fds.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_free_hostent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_free_string.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_freeaddrinfo.Plo@am__quote@ # am--include-marker @@ -863,41 +1034,80 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_gethostbyaddr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_gethostbyname.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_getnameinfo.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_getsock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_hosts_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_library_init.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_metrics.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_options.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_platform.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_process.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_qcache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_query.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_rand.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_search.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_send.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_str.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_set_socket_functions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_socket.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sortaddrinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strerror.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_strsplit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig_mac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_sysconfig_win.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_timeout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_update_servers.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-ares_version.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-inet_net_pton.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-inet_ntop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcares_la-windows_port.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_array.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_llist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@dsa/$(DEPDIR)/libcares_la-ares_slist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_configchg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_epoll.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_kqueue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_poll.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_select.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_thread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@event/$(DEPDIR)/libcares_la-ares_event_win32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_create_query.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_expand_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_expand_string.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_fds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_getsock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_mapping.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_multistring.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_record.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@record/$(DEPDIR)/libcares_la-ares_dns_write.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@str/$(DEPDIR)/libcares_la-ares_buf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@str/$(DEPDIR)/libcares_la-ares_str.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@str/$(DEPDIR)/libcares_la-ares_strsplit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_iface_ips.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_math.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_threads.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_timeval.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@util/$(DEPDIR)/libcares_la-ares_uri.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @@ -929,124 +1139,19 @@ am--depfiles: $(am__depfiles_remade) @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -libcares_la-ares__addrinfo2hostent.lo: ares__addrinfo2hostent.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__addrinfo2hostent.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__addrinfo2hostent.Tpo -c -o libcares_la-ares__addrinfo2hostent.lo `test -f 'ares__addrinfo2hostent.c' || echo '$(srcdir)/'`ares__addrinfo2hostent.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__addrinfo2hostent.Tpo $(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__addrinfo2hostent.c' object='libcares_la-ares__addrinfo2hostent.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_addrinfo2hostent.lo: ares_addrinfo2hostent.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_addrinfo2hostent.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_addrinfo2hostent.Tpo -c -o libcares_la-ares_addrinfo2hostent.lo `test -f 'ares_addrinfo2hostent.c' || echo '$(srcdir)/'`ares_addrinfo2hostent.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_addrinfo2hostent.Tpo $(DEPDIR)/libcares_la-ares_addrinfo2hostent.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_addrinfo2hostent.c' object='libcares_la-ares_addrinfo2hostent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__addrinfo2hostent.lo `test -f 'ares__addrinfo2hostent.c' || echo '$(srcdir)/'`ares__addrinfo2hostent.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_addrinfo2hostent.lo `test -f 'ares_addrinfo2hostent.c' || echo '$(srcdir)/'`ares_addrinfo2hostent.c -libcares_la-ares__addrinfo_localhost.lo: ares__addrinfo_localhost.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__addrinfo_localhost.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__addrinfo_localhost.Tpo -c -o libcares_la-ares__addrinfo_localhost.lo `test -f 'ares__addrinfo_localhost.c' || echo '$(srcdir)/'`ares__addrinfo_localhost.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__addrinfo_localhost.Tpo $(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__addrinfo_localhost.c' object='libcares_la-ares__addrinfo_localhost.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_addrinfo_localhost.lo: ares_addrinfo_localhost.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_addrinfo_localhost.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_addrinfo_localhost.Tpo -c -o libcares_la-ares_addrinfo_localhost.lo `test -f 'ares_addrinfo_localhost.c' || echo '$(srcdir)/'`ares_addrinfo_localhost.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_addrinfo_localhost.Tpo $(DEPDIR)/libcares_la-ares_addrinfo_localhost.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_addrinfo_localhost.c' object='libcares_la-ares_addrinfo_localhost.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__addrinfo_localhost.lo `test -f 'ares__addrinfo_localhost.c' || echo '$(srcdir)/'`ares__addrinfo_localhost.c - -libcares_la-ares__buf.lo: ares__buf.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__buf.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__buf.Tpo -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__buf.Tpo $(DEPDIR)/libcares_la-ares__buf.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__buf.c' object='libcares_la-ares__buf.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__buf.lo `test -f 'ares__buf.c' || echo '$(srcdir)/'`ares__buf.c - -libcares_la-ares__close_sockets.lo: ares__close_sockets.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__close_sockets.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__close_sockets.Tpo -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__close_sockets.Tpo $(DEPDIR)/libcares_la-ares__close_sockets.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__close_sockets.c' object='libcares_la-ares__close_sockets.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__close_sockets.lo `test -f 'ares__close_sockets.c' || echo '$(srcdir)/'`ares__close_sockets.c - -libcares_la-ares__hosts_file.lo: ares__hosts_file.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__hosts_file.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__hosts_file.Tpo -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__hosts_file.Tpo $(DEPDIR)/libcares_la-ares__hosts_file.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__hosts_file.c' object='libcares_la-ares__hosts_file.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__hosts_file.lo `test -f 'ares__hosts_file.c' || echo '$(srcdir)/'`ares__hosts_file.c - -libcares_la-ares__htable.lo: ares__htable.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable.Tpo -c -o libcares_la-ares__htable.lo `test -f 'ares__htable.c' || echo '$(srcdir)/'`ares__htable.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable.Tpo $(DEPDIR)/libcares_la-ares__htable.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable.c' object='libcares_la-ares__htable.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable.lo `test -f 'ares__htable.c' || echo '$(srcdir)/'`ares__htable.c - -libcares_la-ares__htable_asvp.lo: ares__htable_asvp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_asvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_asvp.Tpo -c -o libcares_la-ares__htable_asvp.lo `test -f 'ares__htable_asvp.c' || echo '$(srcdir)/'`ares__htable_asvp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_asvp.Tpo $(DEPDIR)/libcares_la-ares__htable_asvp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_asvp.c' object='libcares_la-ares__htable_asvp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_asvp.lo `test -f 'ares__htable_asvp.c' || echo '$(srcdir)/'`ares__htable_asvp.c - -libcares_la-ares__htable_strvp.lo: ares__htable_strvp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_strvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_strvp.Tpo $(DEPDIR)/libcares_la-ares__htable_strvp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_strvp.c' object='libcares_la-ares__htable_strvp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_strvp.lo `test -f 'ares__htable_strvp.c' || echo '$(srcdir)/'`ares__htable_strvp.c - -libcares_la-ares__htable_szvp.lo: ares__htable_szvp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__htable_szvp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__htable_szvp.Tpo $(DEPDIR)/libcares_la-ares__htable_szvp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__htable_szvp.c' object='libcares_la-ares__htable_szvp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__htable_szvp.lo `test -f 'ares__htable_szvp.c' || echo '$(srcdir)/'`ares__htable_szvp.c - -libcares_la-ares__iface_ips.lo: ares__iface_ips.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__iface_ips.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__iface_ips.Tpo -c -o libcares_la-ares__iface_ips.lo `test -f 'ares__iface_ips.c' || echo '$(srcdir)/'`ares__iface_ips.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__iface_ips.Tpo $(DEPDIR)/libcares_la-ares__iface_ips.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__iface_ips.c' object='libcares_la-ares__iface_ips.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__iface_ips.lo `test -f 'ares__iface_ips.c' || echo '$(srcdir)/'`ares__iface_ips.c - -libcares_la-ares__llist.lo: ares__llist.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__llist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__llist.Tpo -c -o libcares_la-ares__llist.lo `test -f 'ares__llist.c' || echo '$(srcdir)/'`ares__llist.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__llist.Tpo $(DEPDIR)/libcares_la-ares__llist.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__llist.c' object='libcares_la-ares__llist.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__llist.lo `test -f 'ares__llist.c' || echo '$(srcdir)/'`ares__llist.c - -libcares_la-ares__parse_into_addrinfo.lo: ares__parse_into_addrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__parse_into_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Tpo -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Tpo $(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__parse_into_addrinfo.c' object='libcares_la-ares__parse_into_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__parse_into_addrinfo.lo `test -f 'ares__parse_into_addrinfo.c' || echo '$(srcdir)/'`ares__parse_into_addrinfo.c - -libcares_la-ares__slist.lo: ares__slist.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__slist.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__slist.Tpo -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__slist.Tpo $(DEPDIR)/libcares_la-ares__slist.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__slist.c' object='libcares_la-ares__slist.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__slist.lo `test -f 'ares__slist.c' || echo '$(srcdir)/'`ares__slist.c - -libcares_la-ares__socket.lo: ares__socket.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__socket.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__socket.Tpo -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__socket.Tpo $(DEPDIR)/libcares_la-ares__socket.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__socket.c' object='libcares_la-ares__socket.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__socket.lo `test -f 'ares__socket.c' || echo '$(srcdir)/'`ares__socket.c - -libcares_la-ares__sortaddrinfo.lo: ares__sortaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__sortaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__sortaddrinfo.Tpo -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__sortaddrinfo.Tpo $(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__sortaddrinfo.c' object='libcares_la-ares__sortaddrinfo.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__sortaddrinfo.lo `test -f 'ares__sortaddrinfo.c' || echo '$(srcdir)/'`ares__sortaddrinfo.c - -libcares_la-ares__threads.lo: ares__threads.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__threads.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__threads.Tpo -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__threads.Tpo $(DEPDIR)/libcares_la-ares__threads.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__threads.c' object='libcares_la-ares__threads.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__threads.lo `test -f 'ares__threads.c' || echo '$(srcdir)/'`ares__threads.c - -libcares_la-ares__timeval.lo: ares__timeval.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares__timeval.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares__timeval.Tpo -c -o libcares_la-ares__timeval.lo `test -f 'ares__timeval.c' || echo '$(srcdir)/'`ares__timeval.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares__timeval.Tpo $(DEPDIR)/libcares_la-ares__timeval.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares__timeval.c' object='libcares_la-ares__timeval.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares__timeval.lo `test -f 'ares__timeval.c' || echo '$(srcdir)/'`ares__timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_addrinfo_localhost.lo `test -f 'ares_addrinfo_localhost.c' || echo '$(srcdir)/'`ares_addrinfo_localhost.c libcares_la-ares_android.lo: ares_android.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_android.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_android.Tpo -c -o libcares_la-ares_android.lo `test -f 'ares_android.c' || echo '$(srcdir)/'`ares_android.c @@ -1062,6 +1167,27 @@ libcares_la-ares_cancel.lo: ares_cancel.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_cancel.lo `test -f 'ares_cancel.c' || echo '$(srcdir)/'`ares_cancel.c +libcares_la-ares_close_sockets.lo: ares_close_sockets.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_close_sockets.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_close_sockets.Tpo -c -o libcares_la-ares_close_sockets.lo `test -f 'ares_close_sockets.c' || echo '$(srcdir)/'`ares_close_sockets.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_close_sockets.Tpo $(DEPDIR)/libcares_la-ares_close_sockets.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_close_sockets.c' object='libcares_la-ares_close_sockets.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_close_sockets.lo `test -f 'ares_close_sockets.c' || echo '$(srcdir)/'`ares_close_sockets.c + +libcares_la-ares_conn.lo: ares_conn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_conn.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_conn.Tpo -c -o libcares_la-ares_conn.lo `test -f 'ares_conn.c' || echo '$(srcdir)/'`ares_conn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_conn.Tpo $(DEPDIR)/libcares_la-ares_conn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_conn.c' object='libcares_la-ares_conn.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_conn.lo `test -f 'ares_conn.c' || echo '$(srcdir)/'`ares_conn.c + +libcares_la-ares_cookie.lo: ares_cookie.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_cookie.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_cookie.Tpo -c -o libcares_la-ares_cookie.lo `test -f 'ares_cookie.c' || echo '$(srcdir)/'`ares_cookie.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_cookie.Tpo $(DEPDIR)/libcares_la-ares_cookie.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_cookie.c' object='libcares_la-ares_cookie.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_cookie.lo `test -f 'ares_cookie.c' || echo '$(srcdir)/'`ares_cookie.c + libcares_la-ares_data.lo: ares_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_data.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_data.Tpo -c -o libcares_la-ares_data.lo `test -f 'ares_data.c' || echo '$(srcdir)/'`ares_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_data.Tpo $(DEPDIR)/libcares_la-ares_data.Plo @@ -1076,111 +1202,6 @@ libcares_la-ares_destroy.lo: ares_destroy.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_destroy.lo `test -f 'ares_destroy.c' || echo '$(srcdir)/'`ares_destroy.c -libcares_la-ares_dns_mapping.lo: ares_dns_mapping.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_mapping.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_mapping.Tpo $(DEPDIR)/libcares_la-ares_dns_mapping.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_mapping.c' object='libcares_la-ares_dns_mapping.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_mapping.lo `test -f 'ares_dns_mapping.c' || echo '$(srcdir)/'`ares_dns_mapping.c - -libcares_la-ares_dns_name.lo: ares_dns_name.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_name.Tpo -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_name.Tpo $(DEPDIR)/libcares_la-ares_dns_name.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_name.c' object='libcares_la-ares_dns_name.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_name.lo `test -f 'ares_dns_name.c' || echo '$(srcdir)/'`ares_dns_name.c - -libcares_la-ares_dns_parse.lo: ares_dns_parse.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_parse.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_parse.Tpo -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_parse.Tpo $(DEPDIR)/libcares_la-ares_dns_parse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_parse.c' object='libcares_la-ares_dns_parse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_parse.lo `test -f 'ares_dns_parse.c' || echo '$(srcdir)/'`ares_dns_parse.c - -libcares_la-ares_dns_record.lo: ares_dns_record.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_record.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_record.Tpo -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_record.Tpo $(DEPDIR)/libcares_la-ares_dns_record.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_record.c' object='libcares_la-ares_dns_record.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_record.lo `test -f 'ares_dns_record.c' || echo '$(srcdir)/'`ares_dns_record.c - -libcares_la-ares_dns_write.lo: ares_dns_write.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_dns_write.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_dns_write.Tpo -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_dns_write.Tpo $(DEPDIR)/libcares_la-ares_dns_write.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_dns_write.c' object='libcares_la-ares_dns_write.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_dns_write.lo `test -f 'ares_dns_write.c' || echo '$(srcdir)/'`ares_dns_write.c - -libcares_la-ares_event_epoll.lo: ares_event_epoll.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_epoll.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_epoll.Tpo -c -o libcares_la-ares_event_epoll.lo `test -f 'ares_event_epoll.c' || echo '$(srcdir)/'`ares_event_epoll.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_epoll.Tpo $(DEPDIR)/libcares_la-ares_event_epoll.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_epoll.c' object='libcares_la-ares_event_epoll.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_epoll.lo `test -f 'ares_event_epoll.c' || echo '$(srcdir)/'`ares_event_epoll.c - -libcares_la-ares_event_kqueue.lo: ares_event_kqueue.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_kqueue.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_kqueue.Tpo -c -o libcares_la-ares_event_kqueue.lo `test -f 'ares_event_kqueue.c' || echo '$(srcdir)/'`ares_event_kqueue.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_kqueue.Tpo $(DEPDIR)/libcares_la-ares_event_kqueue.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_kqueue.c' object='libcares_la-ares_event_kqueue.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_kqueue.lo `test -f 'ares_event_kqueue.c' || echo '$(srcdir)/'`ares_event_kqueue.c - -libcares_la-ares_event_poll.lo: ares_event_poll.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_poll.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_poll.Tpo -c -o libcares_la-ares_event_poll.lo `test -f 'ares_event_poll.c' || echo '$(srcdir)/'`ares_event_poll.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_poll.Tpo $(DEPDIR)/libcares_la-ares_event_poll.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_poll.c' object='libcares_la-ares_event_poll.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_poll.lo `test -f 'ares_event_poll.c' || echo '$(srcdir)/'`ares_event_poll.c - -libcares_la-ares_event_select.lo: ares_event_select.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_select.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_select.Tpo -c -o libcares_la-ares_event_select.lo `test -f 'ares_event_select.c' || echo '$(srcdir)/'`ares_event_select.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_select.Tpo $(DEPDIR)/libcares_la-ares_event_select.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_select.c' object='libcares_la-ares_event_select.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_select.lo `test -f 'ares_event_select.c' || echo '$(srcdir)/'`ares_event_select.c - -libcares_la-ares_event_thread.lo: ares_event_thread.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_thread.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_thread.Tpo -c -o libcares_la-ares_event_thread.lo `test -f 'ares_event_thread.c' || echo '$(srcdir)/'`ares_event_thread.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_thread.Tpo $(DEPDIR)/libcares_la-ares_event_thread.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_thread.c' object='libcares_la-ares_event_thread.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_thread.lo `test -f 'ares_event_thread.c' || echo '$(srcdir)/'`ares_event_thread.c - -libcares_la-ares_event_wake_pipe.lo: ares_event_wake_pipe.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_wake_pipe.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_wake_pipe.Tpo -c -o libcares_la-ares_event_wake_pipe.lo `test -f 'ares_event_wake_pipe.c' || echo '$(srcdir)/'`ares_event_wake_pipe.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_wake_pipe.Tpo $(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_wake_pipe.c' object='libcares_la-ares_event_wake_pipe.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_wake_pipe.lo `test -f 'ares_event_wake_pipe.c' || echo '$(srcdir)/'`ares_event_wake_pipe.c - -libcares_la-ares_event_win32.lo: ares_event_win32.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_event_win32.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_event_win32.Tpo -c -o libcares_la-ares_event_win32.lo `test -f 'ares_event_win32.c' || echo '$(srcdir)/'`ares_event_win32.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_event_win32.Tpo $(DEPDIR)/libcares_la-ares_event_win32.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_event_win32.c' object='libcares_la-ares_event_win32.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_event_win32.lo `test -f 'ares_event_win32.c' || echo '$(srcdir)/'`ares_event_win32.c - -libcares_la-ares_expand_name.lo: ares_expand_name.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_expand_name.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_expand_name.Tpo -c -o libcares_la-ares_expand_name.lo `test -f 'ares_expand_name.c' || echo '$(srcdir)/'`ares_expand_name.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_expand_name.Tpo $(DEPDIR)/libcares_la-ares_expand_name.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_expand_name.c' object='libcares_la-ares_expand_name.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_expand_name.lo `test -f 'ares_expand_name.c' || echo '$(srcdir)/'`ares_expand_name.c - -libcares_la-ares_expand_string.lo: ares_expand_string.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_expand_string.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_expand_string.Tpo -c -o libcares_la-ares_expand_string.lo `test -f 'ares_expand_string.c' || echo '$(srcdir)/'`ares_expand_string.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_expand_string.Tpo $(DEPDIR)/libcares_la-ares_expand_string.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_expand_string.c' object='libcares_la-ares_expand_string.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_expand_string.lo `test -f 'ares_expand_string.c' || echo '$(srcdir)/'`ares_expand_string.c - -libcares_la-ares_fds.lo: ares_fds.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_fds.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_fds.Tpo -c -o libcares_la-ares_fds.lo `test -f 'ares_fds.c' || echo '$(srcdir)/'`ares_fds.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_fds.Tpo $(DEPDIR)/libcares_la-ares_fds.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_fds.c' object='libcares_la-ares_fds.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_fds.lo `test -f 'ares_fds.c' || echo '$(srcdir)/'`ares_fds.c - libcares_la-ares_free_hostent.lo: ares_free_hostent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_free_hostent.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_free_hostent.Tpo -c -o libcares_la-ares_free_hostent.lo `test -f 'ares_free_hostent.c' || echo '$(srcdir)/'`ares_free_hostent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_free_hostent.Tpo $(DEPDIR)/libcares_la-ares_free_hostent.Plo @@ -1237,12 +1258,12 @@ libcares_la-ares_getnameinfo.lo: ares_getnameinfo.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_getnameinfo.lo `test -f 'ares_getnameinfo.c' || echo '$(srcdir)/'`ares_getnameinfo.c -libcares_la-ares_getsock.lo: ares_getsock.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_getsock.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_getsock.Tpo -c -o libcares_la-ares_getsock.lo `test -f 'ares_getsock.c' || echo '$(srcdir)/'`ares_getsock.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_getsock.Tpo $(DEPDIR)/libcares_la-ares_getsock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_getsock.c' object='libcares_la-ares_getsock.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_hosts_file.lo: ares_hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_hosts_file.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_hosts_file.Tpo -c -o libcares_la-ares_hosts_file.lo `test -f 'ares_hosts_file.c' || echo '$(srcdir)/'`ares_hosts_file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_hosts_file.Tpo $(DEPDIR)/libcares_la-ares_hosts_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_hosts_file.c' object='libcares_la-ares_hosts_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_getsock.lo `test -f 'ares_getsock.c' || echo '$(srcdir)/'`ares_getsock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_hosts_file.lo `test -f 'ares_hosts_file.c' || echo '$(srcdir)/'`ares_hosts_file.c libcares_la-ares_init.lo: ares_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_init.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_init.Tpo -c -o libcares_la-ares_init.lo `test -f 'ares_init.c' || echo '$(srcdir)/'`ares_init.c @@ -1258,19 +1279,12 @@ libcares_la-ares_library_init.lo: ares_library_init.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_library_init.lo `test -f 'ares_library_init.c' || echo '$(srcdir)/'`ares_library_init.c -libcares_la-ares_math.lo: ares_math.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_math.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_math.Tpo -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_math.Tpo $(DEPDIR)/libcares_la-ares_math.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_math.c' object='libcares_la-ares_math.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_metrics.lo: ares_metrics.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_metrics.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_metrics.Tpo -c -o libcares_la-ares_metrics.lo `test -f 'ares_metrics.c' || echo '$(srcdir)/'`ares_metrics.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_metrics.Tpo $(DEPDIR)/libcares_la-ares_metrics.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_metrics.c' object='libcares_la-ares_metrics.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_math.lo `test -f 'ares_math.c' || echo '$(srcdir)/'`ares_math.c - -libcares_la-ares_create_query.lo: ares_create_query.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_create_query.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_create_query.Tpo -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_create_query.Tpo $(DEPDIR)/libcares_la-ares_create_query.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_create_query.c' object='libcares_la-ares_create_query.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_create_query.lo `test -f 'ares_create_query.c' || echo '$(srcdir)/'`ares_create_query.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_metrics.lo `test -f 'ares_metrics.c' || echo '$(srcdir)/'`ares_metrics.c libcares_la-ares_options.lo: ares_options.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_options.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_options.Tpo -c -o libcares_la-ares_options.lo `test -f 'ares_options.c' || echo '$(srcdir)/'`ares_options.c @@ -1279,89 +1293,12 @@ libcares_la-ares_options.lo: ares_options.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_options.lo `test -f 'ares_options.c' || echo '$(srcdir)/'`ares_options.c -libcares_la-ares_parse_a_reply.lo: ares_parse_a_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_a_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_a_reply.Tpo -c -o libcares_la-ares_parse_a_reply.lo `test -f 'ares_parse_a_reply.c' || echo '$(srcdir)/'`ares_parse_a_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_a_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_a_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_a_reply.c' object='libcares_la-ares_parse_a_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_a_reply.lo `test -f 'ares_parse_a_reply.c' || echo '$(srcdir)/'`ares_parse_a_reply.c - -libcares_la-ares_parse_aaaa_reply.lo: ares_parse_aaaa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_aaaa_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Tpo -c -o libcares_la-ares_parse_aaaa_reply.lo `test -f 'ares_parse_aaaa_reply.c' || echo '$(srcdir)/'`ares_parse_aaaa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_aaaa_reply.c' object='libcares_la-ares_parse_aaaa_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_aaaa_reply.lo `test -f 'ares_parse_aaaa_reply.c' || echo '$(srcdir)/'`ares_parse_aaaa_reply.c - -libcares_la-ares_parse_caa_reply.lo: ares_parse_caa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_caa_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_caa_reply.Tpo -c -o libcares_la-ares_parse_caa_reply.lo `test -f 'ares_parse_caa_reply.c' || echo '$(srcdir)/'`ares_parse_caa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_caa_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_caa_reply.c' object='libcares_la-ares_parse_caa_reply.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_parse_into_addrinfo.lo: ares_parse_into_addrinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_into_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Tpo -c -o libcares_la-ares_parse_into_addrinfo.lo `test -f 'ares_parse_into_addrinfo.c' || echo '$(srcdir)/'`ares_parse_into_addrinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Tpo $(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_into_addrinfo.c' object='libcares_la-ares_parse_into_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_caa_reply.lo `test -f 'ares_parse_caa_reply.c' || echo '$(srcdir)/'`ares_parse_caa_reply.c - -libcares_la-ares_parse_mx_reply.lo: ares_parse_mx_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_mx_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_mx_reply.Tpo -c -o libcares_la-ares_parse_mx_reply.lo `test -f 'ares_parse_mx_reply.c' || echo '$(srcdir)/'`ares_parse_mx_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_mx_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_mx_reply.c' object='libcares_la-ares_parse_mx_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_mx_reply.lo `test -f 'ares_parse_mx_reply.c' || echo '$(srcdir)/'`ares_parse_mx_reply.c - -libcares_la-ares_parse_naptr_reply.lo: ares_parse_naptr_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_naptr_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_naptr_reply.Tpo -c -o libcares_la-ares_parse_naptr_reply.lo `test -f 'ares_parse_naptr_reply.c' || echo '$(srcdir)/'`ares_parse_naptr_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_naptr_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_naptr_reply.c' object='libcares_la-ares_parse_naptr_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_naptr_reply.lo `test -f 'ares_parse_naptr_reply.c' || echo '$(srcdir)/'`ares_parse_naptr_reply.c - -libcares_la-ares_parse_ns_reply.lo: ares_parse_ns_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_ns_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_ns_reply.Tpo -c -o libcares_la-ares_parse_ns_reply.lo `test -f 'ares_parse_ns_reply.c' || echo '$(srcdir)/'`ares_parse_ns_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_ns_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_ns_reply.c' object='libcares_la-ares_parse_ns_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_ns_reply.lo `test -f 'ares_parse_ns_reply.c' || echo '$(srcdir)/'`ares_parse_ns_reply.c - -libcares_la-ares_parse_ptr_reply.lo: ares_parse_ptr_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_ptr_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_ptr_reply.Tpo -c -o libcares_la-ares_parse_ptr_reply.lo `test -f 'ares_parse_ptr_reply.c' || echo '$(srcdir)/'`ares_parse_ptr_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_ptr_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_ptr_reply.c' object='libcares_la-ares_parse_ptr_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_ptr_reply.lo `test -f 'ares_parse_ptr_reply.c' || echo '$(srcdir)/'`ares_parse_ptr_reply.c - -libcares_la-ares_parse_soa_reply.lo: ares_parse_soa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_soa_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_soa_reply.Tpo -c -o libcares_la-ares_parse_soa_reply.lo `test -f 'ares_parse_soa_reply.c' || echo '$(srcdir)/'`ares_parse_soa_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_soa_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_soa_reply.c' object='libcares_la-ares_parse_soa_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_soa_reply.lo `test -f 'ares_parse_soa_reply.c' || echo '$(srcdir)/'`ares_parse_soa_reply.c - -libcares_la-ares_parse_srv_reply.lo: ares_parse_srv_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_srv_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_srv_reply.Tpo -c -o libcares_la-ares_parse_srv_reply.lo `test -f 'ares_parse_srv_reply.c' || echo '$(srcdir)/'`ares_parse_srv_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_srv_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_srv_reply.c' object='libcares_la-ares_parse_srv_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_srv_reply.lo `test -f 'ares_parse_srv_reply.c' || echo '$(srcdir)/'`ares_parse_srv_reply.c - -libcares_la-ares_parse_txt_reply.lo: ares_parse_txt_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_txt_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_txt_reply.Tpo -c -o libcares_la-ares_parse_txt_reply.lo `test -f 'ares_parse_txt_reply.c' || echo '$(srcdir)/'`ares_parse_txt_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_txt_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_txt_reply.c' object='libcares_la-ares_parse_txt_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_txt_reply.lo `test -f 'ares_parse_txt_reply.c' || echo '$(srcdir)/'`ares_parse_txt_reply.c - -libcares_la-ares_parse_uri_reply.lo: ares_parse_uri_reply.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_parse_uri_reply.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_parse_uri_reply.Tpo -c -o libcares_la-ares_parse_uri_reply.lo `test -f 'ares_parse_uri_reply.c' || echo '$(srcdir)/'`ares_parse_uri_reply.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_parse_uri_reply.Tpo $(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_parse_uri_reply.c' object='libcares_la-ares_parse_uri_reply.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_uri_reply.lo `test -f 'ares_parse_uri_reply.c' || echo '$(srcdir)/'`ares_parse_uri_reply.c - -libcares_la-ares_platform.lo: ares_platform.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_platform.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_platform.Tpo -c -o libcares_la-ares_platform.lo `test -f 'ares_platform.c' || echo '$(srcdir)/'`ares_platform.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_platform.Tpo $(DEPDIR)/libcares_la-ares_platform.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_platform.c' object='libcares_la-ares_platform.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_platform.lo `test -f 'ares_platform.c' || echo '$(srcdir)/'`ares_platform.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_parse_into_addrinfo.lo `test -f 'ares_parse_into_addrinfo.c' || echo '$(srcdir)/'`ares_parse_into_addrinfo.c libcares_la-ares_process.lo: ares_process.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_process.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_process.Tpo -c -o libcares_la-ares_process.lo `test -f 'ares_process.c' || echo '$(srcdir)/'`ares_process.c @@ -1384,13 +1321,6 @@ libcares_la-ares_query.lo: ares_query.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_query.lo `test -f 'ares_query.c' || echo '$(srcdir)/'`ares_query.c -libcares_la-ares_rand.lo: ares_rand.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_rand.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_rand.Tpo -c -o libcares_la-ares_rand.lo `test -f 'ares_rand.c' || echo '$(srcdir)/'`ares_rand.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_rand.Tpo $(DEPDIR)/libcares_la-ares_rand.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_rand.c' object='libcares_la-ares_rand.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_rand.lo `test -f 'ares_rand.c' || echo '$(srcdir)/'`ares_rand.c - libcares_la-ares_search.lo: ares_search.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_search.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_search.Tpo -c -o libcares_la-ares_search.lo `test -f 'ares_search.c' || echo '$(srcdir)/'`ares_search.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_search.Tpo $(DEPDIR)/libcares_la-ares_search.Plo @@ -1405,19 +1335,26 @@ libcares_la-ares_send.lo: ares_send.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_send.lo `test -f 'ares_send.c' || echo '$(srcdir)/'`ares_send.c -libcares_la-ares_strcasecmp.lo: ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strcasecmp.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strcasecmp.Tpo -c -o libcares_la-ares_strcasecmp.lo `test -f 'ares_strcasecmp.c' || echo '$(srcdir)/'`ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_strcasecmp.Tpo $(DEPDIR)/libcares_la-ares_strcasecmp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_strcasecmp.c' object='libcares_la-ares_strcasecmp.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_set_socket_functions.lo: ares_set_socket_functions.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_set_socket_functions.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_set_socket_functions.Tpo -c -o libcares_la-ares_set_socket_functions.lo `test -f 'ares_set_socket_functions.c' || echo '$(srcdir)/'`ares_set_socket_functions.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_set_socket_functions.Tpo $(DEPDIR)/libcares_la-ares_set_socket_functions.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_set_socket_functions.c' object='libcares_la-ares_set_socket_functions.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_set_socket_functions.lo `test -f 'ares_set_socket_functions.c' || echo '$(srcdir)/'`ares_set_socket_functions.c + +libcares_la-ares_socket.lo: ares_socket.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_socket.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_socket.Tpo -c -o libcares_la-ares_socket.lo `test -f 'ares_socket.c' || echo '$(srcdir)/'`ares_socket.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_socket.Tpo $(DEPDIR)/libcares_la-ares_socket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_socket.c' object='libcares_la-ares_socket.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strcasecmp.lo `test -f 'ares_strcasecmp.c' || echo '$(srcdir)/'`ares_strcasecmp.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_socket.lo `test -f 'ares_socket.c' || echo '$(srcdir)/'`ares_socket.c -libcares_la-ares_str.lo: ares_str.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_str.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_str.Tpo -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_str.Tpo $(DEPDIR)/libcares_la-ares_str.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_str.c' object='libcares_la-ares_str.lo' libtool=yes @AMDEPBACKSLASH@ +libcares_la-ares_sortaddrinfo.lo: ares_sortaddrinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sortaddrinfo.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sortaddrinfo.Tpo -c -o libcares_la-ares_sortaddrinfo.lo `test -f 'ares_sortaddrinfo.c' || echo '$(srcdir)/'`ares_sortaddrinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sortaddrinfo.Tpo $(DEPDIR)/libcares_la-ares_sortaddrinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sortaddrinfo.c' object='libcares_la-ares_sortaddrinfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_str.lo `test -f 'ares_str.c' || echo '$(srcdir)/'`ares_str.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sortaddrinfo.lo `test -f 'ares_sortaddrinfo.c' || echo '$(srcdir)/'`ares_sortaddrinfo.c libcares_la-ares_strerror.lo: ares_strerror.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strerror.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strerror.Tpo -c -o libcares_la-ares_strerror.lo `test -f 'ares_strerror.c' || echo '$(srcdir)/'`ares_strerror.c @@ -1426,13 +1363,6 @@ libcares_la-ares_strerror.lo: ares_strerror.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strerror.lo `test -f 'ares_strerror.c' || echo '$(srcdir)/'`ares_strerror.c -libcares_la-ares_strsplit.lo: ares_strsplit.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_strsplit.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_strsplit.Tpo -c -o libcares_la-ares_strsplit.lo `test -f 'ares_strsplit.c' || echo '$(srcdir)/'`ares_strsplit.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_strsplit.Tpo $(DEPDIR)/libcares_la-ares_strsplit.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_strsplit.c' object='libcares_la-ares_strsplit.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_strsplit.lo `test -f 'ares_strsplit.c' || echo '$(srcdir)/'`ares_strsplit.c - libcares_la-ares_sysconfig.lo: ares_sysconfig.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig.Tpo -c -o libcares_la-ares_sysconfig.lo `test -f 'ares_sysconfig.c' || echo '$(srcdir)/'`ares_sysconfig.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig.Tpo $(DEPDIR)/libcares_la-ares_sysconfig.Plo @@ -1447,6 +1377,20 @@ libcares_la-ares_sysconfig_files.lo: ares_sysconfig_files.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig_files.lo `test -f 'ares_sysconfig_files.c' || echo '$(srcdir)/'`ares_sysconfig_files.c +libcares_la-ares_sysconfig_mac.lo: ares_sysconfig_mac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig_mac.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig_mac.Tpo -c -o libcares_la-ares_sysconfig_mac.lo `test -f 'ares_sysconfig_mac.c' || echo '$(srcdir)/'`ares_sysconfig_mac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig_mac.Tpo $(DEPDIR)/libcares_la-ares_sysconfig_mac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig_mac.c' object='libcares_la-ares_sysconfig_mac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig_mac.lo `test -f 'ares_sysconfig_mac.c' || echo '$(srcdir)/'`ares_sysconfig_mac.c + +libcares_la-ares_sysconfig_win.lo: ares_sysconfig_win.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_sysconfig_win.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_sysconfig_win.Tpo -c -o libcares_la-ares_sysconfig_win.lo `test -f 'ares_sysconfig_win.c' || echo '$(srcdir)/'`ares_sysconfig_win.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_sysconfig_win.Tpo $(DEPDIR)/libcares_la-ares_sysconfig_win.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_sysconfig_win.c' object='libcares_la-ares_sysconfig_win.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-ares_sysconfig_win.lo `test -f 'ares_sysconfig_win.c' || echo '$(srcdir)/'`ares_sysconfig_win.c + libcares_la-ares_timeout.lo: ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT libcares_la-ares_timeout.lo -MD -MP -MF $(DEPDIR)/libcares_la-ares_timeout.Tpo -c -o libcares_la-ares_timeout.lo `test -f 'ares_timeout.c' || echo '$(srcdir)/'`ares_timeout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcares_la-ares_timeout.Tpo $(DEPDIR)/libcares_la-ares_timeout.Plo @@ -1489,11 +1433,360 @@ libcares_la-windows_port.lo: windows_port.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o libcares_la-windows_port.lo `test -f 'windows_port.c' || echo '$(srcdir)/'`windows_port.c +dsa/libcares_la-ares_array.lo: dsa/ares_array.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_array.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_array.Tpo -c -o dsa/libcares_la-ares_array.lo `test -f 'dsa/ares_array.c' || echo '$(srcdir)/'`dsa/ares_array.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_array.Tpo dsa/$(DEPDIR)/libcares_la-ares_array.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_array.c' object='dsa/libcares_la-ares_array.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_array.lo `test -f 'dsa/ares_array.c' || echo '$(srcdir)/'`dsa/ares_array.c + +dsa/libcares_la-ares_htable.lo: dsa/ares_htable.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable.Tpo -c -o dsa/libcares_la-ares_htable.lo `test -f 'dsa/ares_htable.c' || echo '$(srcdir)/'`dsa/ares_htable.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable.c' object='dsa/libcares_la-ares_htable.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable.lo `test -f 'dsa/ares_htable.c' || echo '$(srcdir)/'`dsa/ares_htable.c + +dsa/libcares_la-ares_htable_asvp.lo: dsa/ares_htable_asvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_asvp.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Tpo -c -o dsa/libcares_la-ares_htable_asvp.lo `test -f 'dsa/ares_htable_asvp.c' || echo '$(srcdir)/'`dsa/ares_htable_asvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_asvp.c' object='dsa/libcares_la-ares_htable_asvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_asvp.lo `test -f 'dsa/ares_htable_asvp.c' || echo '$(srcdir)/'`dsa/ares_htable_asvp.c + +dsa/libcares_la-ares_htable_dict.lo: dsa/ares_htable_dict.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_dict.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Tpo -c -o dsa/libcares_la-ares_htable_dict.lo `test -f 'dsa/ares_htable_dict.c' || echo '$(srcdir)/'`dsa/ares_htable_dict.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_dict.c' object='dsa/libcares_la-ares_htable_dict.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_dict.lo `test -f 'dsa/ares_htable_dict.c' || echo '$(srcdir)/'`dsa/ares_htable_dict.c + +dsa/libcares_la-ares_htable_strvp.lo: dsa/ares_htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_strvp.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Tpo -c -o dsa/libcares_la-ares_htable_strvp.lo `test -f 'dsa/ares_htable_strvp.c' || echo '$(srcdir)/'`dsa/ares_htable_strvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_strvp.c' object='dsa/libcares_la-ares_htable_strvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_strvp.lo `test -f 'dsa/ares_htable_strvp.c' || echo '$(srcdir)/'`dsa/ares_htable_strvp.c + +dsa/libcares_la-ares_htable_szvp.lo: dsa/ares_htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_szvp.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Tpo -c -o dsa/libcares_la-ares_htable_szvp.lo `test -f 'dsa/ares_htable_szvp.c' || echo '$(srcdir)/'`dsa/ares_htable_szvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_szvp.c' object='dsa/libcares_la-ares_htable_szvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_szvp.lo `test -f 'dsa/ares_htable_szvp.c' || echo '$(srcdir)/'`dsa/ares_htable_szvp.c + +dsa/libcares_la-ares_htable_vpstr.lo: dsa/ares_htable_vpstr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_vpstr.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Tpo -c -o dsa/libcares_la-ares_htable_vpstr.lo `test -f 'dsa/ares_htable_vpstr.c' || echo '$(srcdir)/'`dsa/ares_htable_vpstr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_vpstr.c' object='dsa/libcares_la-ares_htable_vpstr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_vpstr.lo `test -f 'dsa/ares_htable_vpstr.c' || echo '$(srcdir)/'`dsa/ares_htable_vpstr.c + +dsa/libcares_la-ares_htable_vpvp.lo: dsa/ares_htable_vpvp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_htable_vpvp.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Tpo -c -o dsa/libcares_la-ares_htable_vpvp.lo `test -f 'dsa/ares_htable_vpvp.c' || echo '$(srcdir)/'`dsa/ares_htable_vpvp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Tpo dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_htable_vpvp.c' object='dsa/libcares_la-ares_htable_vpvp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_htable_vpvp.lo `test -f 'dsa/ares_htable_vpvp.c' || echo '$(srcdir)/'`dsa/ares_htable_vpvp.c + +dsa/libcares_la-ares_llist.lo: dsa/ares_llist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_llist.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_llist.Tpo -c -o dsa/libcares_la-ares_llist.lo `test -f 'dsa/ares_llist.c' || echo '$(srcdir)/'`dsa/ares_llist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_llist.Tpo dsa/$(DEPDIR)/libcares_la-ares_llist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_llist.c' object='dsa/libcares_la-ares_llist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_llist.lo `test -f 'dsa/ares_llist.c' || echo '$(srcdir)/'`dsa/ares_llist.c + +dsa/libcares_la-ares_slist.lo: dsa/ares_slist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT dsa/libcares_la-ares_slist.lo -MD -MP -MF dsa/$(DEPDIR)/libcares_la-ares_slist.Tpo -c -o dsa/libcares_la-ares_slist.lo `test -f 'dsa/ares_slist.c' || echo '$(srcdir)/'`dsa/ares_slist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) dsa/$(DEPDIR)/libcares_la-ares_slist.Tpo dsa/$(DEPDIR)/libcares_la-ares_slist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa/ares_slist.c' object='dsa/libcares_la-ares_slist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o dsa/libcares_la-ares_slist.lo `test -f 'dsa/ares_slist.c' || echo '$(srcdir)/'`dsa/ares_slist.c + +event/libcares_la-ares_event_configchg.lo: event/ares_event_configchg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_configchg.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_configchg.Tpo -c -o event/libcares_la-ares_event_configchg.lo `test -f 'event/ares_event_configchg.c' || echo '$(srcdir)/'`event/ares_event_configchg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_configchg.Tpo event/$(DEPDIR)/libcares_la-ares_event_configchg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_configchg.c' object='event/libcares_la-ares_event_configchg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_configchg.lo `test -f 'event/ares_event_configchg.c' || echo '$(srcdir)/'`event/ares_event_configchg.c + +event/libcares_la-ares_event_epoll.lo: event/ares_event_epoll.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_epoll.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_epoll.Tpo -c -o event/libcares_la-ares_event_epoll.lo `test -f 'event/ares_event_epoll.c' || echo '$(srcdir)/'`event/ares_event_epoll.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_epoll.Tpo event/$(DEPDIR)/libcares_la-ares_event_epoll.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_epoll.c' object='event/libcares_la-ares_event_epoll.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_epoll.lo `test -f 'event/ares_event_epoll.c' || echo '$(srcdir)/'`event/ares_event_epoll.c + +event/libcares_la-ares_event_kqueue.lo: event/ares_event_kqueue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_kqueue.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_kqueue.Tpo -c -o event/libcares_la-ares_event_kqueue.lo `test -f 'event/ares_event_kqueue.c' || echo '$(srcdir)/'`event/ares_event_kqueue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_kqueue.Tpo event/$(DEPDIR)/libcares_la-ares_event_kqueue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_kqueue.c' object='event/libcares_la-ares_event_kqueue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_kqueue.lo `test -f 'event/ares_event_kqueue.c' || echo '$(srcdir)/'`event/ares_event_kqueue.c + +event/libcares_la-ares_event_poll.lo: event/ares_event_poll.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_poll.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_poll.Tpo -c -o event/libcares_la-ares_event_poll.lo `test -f 'event/ares_event_poll.c' || echo '$(srcdir)/'`event/ares_event_poll.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_poll.Tpo event/$(DEPDIR)/libcares_la-ares_event_poll.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_poll.c' object='event/libcares_la-ares_event_poll.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_poll.lo `test -f 'event/ares_event_poll.c' || echo '$(srcdir)/'`event/ares_event_poll.c + +event/libcares_la-ares_event_select.lo: event/ares_event_select.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_select.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_select.Tpo -c -o event/libcares_la-ares_event_select.lo `test -f 'event/ares_event_select.c' || echo '$(srcdir)/'`event/ares_event_select.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_select.Tpo event/$(DEPDIR)/libcares_la-ares_event_select.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_select.c' object='event/libcares_la-ares_event_select.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_select.lo `test -f 'event/ares_event_select.c' || echo '$(srcdir)/'`event/ares_event_select.c + +event/libcares_la-ares_event_thread.lo: event/ares_event_thread.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_thread.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_thread.Tpo -c -o event/libcares_la-ares_event_thread.lo `test -f 'event/ares_event_thread.c' || echo '$(srcdir)/'`event/ares_event_thread.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_thread.Tpo event/$(DEPDIR)/libcares_la-ares_event_thread.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_thread.c' object='event/libcares_la-ares_event_thread.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_thread.lo `test -f 'event/ares_event_thread.c' || echo '$(srcdir)/'`event/ares_event_thread.c + +event/libcares_la-ares_event_wake_pipe.lo: event/ares_event_wake_pipe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_wake_pipe.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Tpo -c -o event/libcares_la-ares_event_wake_pipe.lo `test -f 'event/ares_event_wake_pipe.c' || echo '$(srcdir)/'`event/ares_event_wake_pipe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Tpo event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_wake_pipe.c' object='event/libcares_la-ares_event_wake_pipe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_wake_pipe.lo `test -f 'event/ares_event_wake_pipe.c' || echo '$(srcdir)/'`event/ares_event_wake_pipe.c + +event/libcares_la-ares_event_win32.lo: event/ares_event_win32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT event/libcares_la-ares_event_win32.lo -MD -MP -MF event/$(DEPDIR)/libcares_la-ares_event_win32.Tpo -c -o event/libcares_la-ares_event_win32.lo `test -f 'event/ares_event_win32.c' || echo '$(srcdir)/'`event/ares_event_win32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) event/$(DEPDIR)/libcares_la-ares_event_win32.Tpo event/$(DEPDIR)/libcares_la-ares_event_win32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='event/ares_event_win32.c' object='event/libcares_la-ares_event_win32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o event/libcares_la-ares_event_win32.lo `test -f 'event/ares_event_win32.c' || echo '$(srcdir)/'`event/ares_event_win32.c + +legacy/libcares_la-ares_create_query.lo: legacy/ares_create_query.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_create_query.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_create_query.Tpo -c -o legacy/libcares_la-ares_create_query.lo `test -f 'legacy/ares_create_query.c' || echo '$(srcdir)/'`legacy/ares_create_query.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_create_query.Tpo legacy/$(DEPDIR)/libcares_la-ares_create_query.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_create_query.c' object='legacy/libcares_la-ares_create_query.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_create_query.lo `test -f 'legacy/ares_create_query.c' || echo '$(srcdir)/'`legacy/ares_create_query.c + +legacy/libcares_la-ares_expand_name.lo: legacy/ares_expand_name.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_expand_name.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_expand_name.Tpo -c -o legacy/libcares_la-ares_expand_name.lo `test -f 'legacy/ares_expand_name.c' || echo '$(srcdir)/'`legacy/ares_expand_name.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_expand_name.Tpo legacy/$(DEPDIR)/libcares_la-ares_expand_name.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_expand_name.c' object='legacy/libcares_la-ares_expand_name.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_expand_name.lo `test -f 'legacy/ares_expand_name.c' || echo '$(srcdir)/'`legacy/ares_expand_name.c + +legacy/libcares_la-ares_expand_string.lo: legacy/ares_expand_string.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_expand_string.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_expand_string.Tpo -c -o legacy/libcares_la-ares_expand_string.lo `test -f 'legacy/ares_expand_string.c' || echo '$(srcdir)/'`legacy/ares_expand_string.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_expand_string.Tpo legacy/$(DEPDIR)/libcares_la-ares_expand_string.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_expand_string.c' object='legacy/libcares_la-ares_expand_string.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_expand_string.lo `test -f 'legacy/ares_expand_string.c' || echo '$(srcdir)/'`legacy/ares_expand_string.c + +legacy/libcares_la-ares_fds.lo: legacy/ares_fds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_fds.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_fds.Tpo -c -o legacy/libcares_la-ares_fds.lo `test -f 'legacy/ares_fds.c' || echo '$(srcdir)/'`legacy/ares_fds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_fds.Tpo legacy/$(DEPDIR)/libcares_la-ares_fds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_fds.c' object='legacy/libcares_la-ares_fds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_fds.lo `test -f 'legacy/ares_fds.c' || echo '$(srcdir)/'`legacy/ares_fds.c + +legacy/libcares_la-ares_getsock.lo: legacy/ares_getsock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_getsock.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_getsock.Tpo -c -o legacy/libcares_la-ares_getsock.lo `test -f 'legacy/ares_getsock.c' || echo '$(srcdir)/'`legacy/ares_getsock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_getsock.Tpo legacy/$(DEPDIR)/libcares_la-ares_getsock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_getsock.c' object='legacy/libcares_la-ares_getsock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_getsock.lo `test -f 'legacy/ares_getsock.c' || echo '$(srcdir)/'`legacy/ares_getsock.c + +legacy/libcares_la-ares_parse_a_reply.lo: legacy/ares_parse_a_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_a_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Tpo -c -o legacy/libcares_la-ares_parse_a_reply.lo `test -f 'legacy/ares_parse_a_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_a_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_a_reply.c' object='legacy/libcares_la-ares_parse_a_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_a_reply.lo `test -f 'legacy/ares_parse_a_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_a_reply.c + +legacy/libcares_la-ares_parse_aaaa_reply.lo: legacy/ares_parse_aaaa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_aaaa_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Tpo -c -o legacy/libcares_la-ares_parse_aaaa_reply.lo `test -f 'legacy/ares_parse_aaaa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_aaaa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_aaaa_reply.c' object='legacy/libcares_la-ares_parse_aaaa_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_aaaa_reply.lo `test -f 'legacy/ares_parse_aaaa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_aaaa_reply.c + +legacy/libcares_la-ares_parse_caa_reply.lo: legacy/ares_parse_caa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_caa_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Tpo -c -o legacy/libcares_la-ares_parse_caa_reply.lo `test -f 'legacy/ares_parse_caa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_caa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_caa_reply.c' object='legacy/libcares_la-ares_parse_caa_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_caa_reply.lo `test -f 'legacy/ares_parse_caa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_caa_reply.c + +legacy/libcares_la-ares_parse_mx_reply.lo: legacy/ares_parse_mx_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_mx_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Tpo -c -o legacy/libcares_la-ares_parse_mx_reply.lo `test -f 'legacy/ares_parse_mx_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_mx_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_mx_reply.c' object='legacy/libcares_la-ares_parse_mx_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_mx_reply.lo `test -f 'legacy/ares_parse_mx_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_mx_reply.c + +legacy/libcares_la-ares_parse_naptr_reply.lo: legacy/ares_parse_naptr_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_naptr_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Tpo -c -o legacy/libcares_la-ares_parse_naptr_reply.lo `test -f 'legacy/ares_parse_naptr_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_naptr_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_naptr_reply.c' object='legacy/libcares_la-ares_parse_naptr_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_naptr_reply.lo `test -f 'legacy/ares_parse_naptr_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_naptr_reply.c + +legacy/libcares_la-ares_parse_ns_reply.lo: legacy/ares_parse_ns_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_ns_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Tpo -c -o legacy/libcares_la-ares_parse_ns_reply.lo `test -f 'legacy/ares_parse_ns_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_ns_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_ns_reply.c' object='legacy/libcares_la-ares_parse_ns_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_ns_reply.lo `test -f 'legacy/ares_parse_ns_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_ns_reply.c + +legacy/libcares_la-ares_parse_ptr_reply.lo: legacy/ares_parse_ptr_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_ptr_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Tpo -c -o legacy/libcares_la-ares_parse_ptr_reply.lo `test -f 'legacy/ares_parse_ptr_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_ptr_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_ptr_reply.c' object='legacy/libcares_la-ares_parse_ptr_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_ptr_reply.lo `test -f 'legacy/ares_parse_ptr_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_ptr_reply.c + +legacy/libcares_la-ares_parse_soa_reply.lo: legacy/ares_parse_soa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_soa_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Tpo -c -o legacy/libcares_la-ares_parse_soa_reply.lo `test -f 'legacy/ares_parse_soa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_soa_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_soa_reply.c' object='legacy/libcares_la-ares_parse_soa_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_soa_reply.lo `test -f 'legacy/ares_parse_soa_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_soa_reply.c + +legacy/libcares_la-ares_parse_srv_reply.lo: legacy/ares_parse_srv_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_srv_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Tpo -c -o legacy/libcares_la-ares_parse_srv_reply.lo `test -f 'legacy/ares_parse_srv_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_srv_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_srv_reply.c' object='legacy/libcares_la-ares_parse_srv_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_srv_reply.lo `test -f 'legacy/ares_parse_srv_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_srv_reply.c + +legacy/libcares_la-ares_parse_txt_reply.lo: legacy/ares_parse_txt_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_txt_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Tpo -c -o legacy/libcares_la-ares_parse_txt_reply.lo `test -f 'legacy/ares_parse_txt_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_txt_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_txt_reply.c' object='legacy/libcares_la-ares_parse_txt_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_txt_reply.lo `test -f 'legacy/ares_parse_txt_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_txt_reply.c + +legacy/libcares_la-ares_parse_uri_reply.lo: legacy/ares_parse_uri_reply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT legacy/libcares_la-ares_parse_uri_reply.lo -MD -MP -MF legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Tpo -c -o legacy/libcares_la-ares_parse_uri_reply.lo `test -f 'legacy/ares_parse_uri_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_uri_reply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Tpo legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='legacy/ares_parse_uri_reply.c' object='legacy/libcares_la-ares_parse_uri_reply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o legacy/libcares_la-ares_parse_uri_reply.lo `test -f 'legacy/ares_parse_uri_reply.c' || echo '$(srcdir)/'`legacy/ares_parse_uri_reply.c + +record/libcares_la-ares_dns_mapping.lo: record/ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_mapping.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_mapping.Tpo -c -o record/libcares_la-ares_dns_mapping.lo `test -f 'record/ares_dns_mapping.c' || echo '$(srcdir)/'`record/ares_dns_mapping.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_mapping.Tpo record/$(DEPDIR)/libcares_la-ares_dns_mapping.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_mapping.c' object='record/libcares_la-ares_dns_mapping.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_mapping.lo `test -f 'record/ares_dns_mapping.c' || echo '$(srcdir)/'`record/ares_dns_mapping.c + +record/libcares_la-ares_dns_multistring.lo: record/ares_dns_multistring.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_multistring.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_multistring.Tpo -c -o record/libcares_la-ares_dns_multistring.lo `test -f 'record/ares_dns_multistring.c' || echo '$(srcdir)/'`record/ares_dns_multistring.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_multistring.Tpo record/$(DEPDIR)/libcares_la-ares_dns_multistring.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_multistring.c' object='record/libcares_la-ares_dns_multistring.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_multistring.lo `test -f 'record/ares_dns_multistring.c' || echo '$(srcdir)/'`record/ares_dns_multistring.c + +record/libcares_la-ares_dns_name.lo: record/ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_name.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_name.Tpo -c -o record/libcares_la-ares_dns_name.lo `test -f 'record/ares_dns_name.c' || echo '$(srcdir)/'`record/ares_dns_name.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_name.Tpo record/$(DEPDIR)/libcares_la-ares_dns_name.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_name.c' object='record/libcares_la-ares_dns_name.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_name.lo `test -f 'record/ares_dns_name.c' || echo '$(srcdir)/'`record/ares_dns_name.c + +record/libcares_la-ares_dns_parse.lo: record/ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_parse.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_parse.Tpo -c -o record/libcares_la-ares_dns_parse.lo `test -f 'record/ares_dns_parse.c' || echo '$(srcdir)/'`record/ares_dns_parse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_parse.Tpo record/$(DEPDIR)/libcares_la-ares_dns_parse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_parse.c' object='record/libcares_la-ares_dns_parse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_parse.lo `test -f 'record/ares_dns_parse.c' || echo '$(srcdir)/'`record/ares_dns_parse.c + +record/libcares_la-ares_dns_record.lo: record/ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_record.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_record.Tpo -c -o record/libcares_la-ares_dns_record.lo `test -f 'record/ares_dns_record.c' || echo '$(srcdir)/'`record/ares_dns_record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_record.Tpo record/$(DEPDIR)/libcares_la-ares_dns_record.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_record.c' object='record/libcares_la-ares_dns_record.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_record.lo `test -f 'record/ares_dns_record.c' || echo '$(srcdir)/'`record/ares_dns_record.c + +record/libcares_la-ares_dns_write.lo: record/ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT record/libcares_la-ares_dns_write.lo -MD -MP -MF record/$(DEPDIR)/libcares_la-ares_dns_write.Tpo -c -o record/libcares_la-ares_dns_write.lo `test -f 'record/ares_dns_write.c' || echo '$(srcdir)/'`record/ares_dns_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) record/$(DEPDIR)/libcares_la-ares_dns_write.Tpo record/$(DEPDIR)/libcares_la-ares_dns_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record/ares_dns_write.c' object='record/libcares_la-ares_dns_write.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o record/libcares_la-ares_dns_write.lo `test -f 'record/ares_dns_write.c' || echo '$(srcdir)/'`record/ares_dns_write.c + +str/libcares_la-ares_buf.lo: str/ares_buf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT str/libcares_la-ares_buf.lo -MD -MP -MF str/$(DEPDIR)/libcares_la-ares_buf.Tpo -c -o str/libcares_la-ares_buf.lo `test -f 'str/ares_buf.c' || echo '$(srcdir)/'`str/ares_buf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) str/$(DEPDIR)/libcares_la-ares_buf.Tpo str/$(DEPDIR)/libcares_la-ares_buf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='str/ares_buf.c' object='str/libcares_la-ares_buf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o str/libcares_la-ares_buf.lo `test -f 'str/ares_buf.c' || echo '$(srcdir)/'`str/ares_buf.c + +str/libcares_la-ares_str.lo: str/ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT str/libcares_la-ares_str.lo -MD -MP -MF str/$(DEPDIR)/libcares_la-ares_str.Tpo -c -o str/libcares_la-ares_str.lo `test -f 'str/ares_str.c' || echo '$(srcdir)/'`str/ares_str.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) str/$(DEPDIR)/libcares_la-ares_str.Tpo str/$(DEPDIR)/libcares_la-ares_str.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='str/ares_str.c' object='str/libcares_la-ares_str.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o str/libcares_la-ares_str.lo `test -f 'str/ares_str.c' || echo '$(srcdir)/'`str/ares_str.c + +str/libcares_la-ares_strsplit.lo: str/ares_strsplit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT str/libcares_la-ares_strsplit.lo -MD -MP -MF str/$(DEPDIR)/libcares_la-ares_strsplit.Tpo -c -o str/libcares_la-ares_strsplit.lo `test -f 'str/ares_strsplit.c' || echo '$(srcdir)/'`str/ares_strsplit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) str/$(DEPDIR)/libcares_la-ares_strsplit.Tpo str/$(DEPDIR)/libcares_la-ares_strsplit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='str/ares_strsplit.c' object='str/libcares_la-ares_strsplit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o str/libcares_la-ares_strsplit.lo `test -f 'str/ares_strsplit.c' || echo '$(srcdir)/'`str/ares_strsplit.c + +util/libcares_la-ares_iface_ips.lo: util/ares_iface_ips.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_iface_ips.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_iface_ips.Tpo -c -o util/libcares_la-ares_iface_ips.lo `test -f 'util/ares_iface_ips.c' || echo '$(srcdir)/'`util/ares_iface_ips.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_iface_ips.Tpo util/$(DEPDIR)/libcares_la-ares_iface_ips.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_iface_ips.c' object='util/libcares_la-ares_iface_ips.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_iface_ips.lo `test -f 'util/ares_iface_ips.c' || echo '$(srcdir)/'`util/ares_iface_ips.c + +util/libcares_la-ares_threads.lo: util/ares_threads.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_threads.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_threads.Tpo -c -o util/libcares_la-ares_threads.lo `test -f 'util/ares_threads.c' || echo '$(srcdir)/'`util/ares_threads.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_threads.Tpo util/$(DEPDIR)/libcares_la-ares_threads.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_threads.c' object='util/libcares_la-ares_threads.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_threads.lo `test -f 'util/ares_threads.c' || echo '$(srcdir)/'`util/ares_threads.c + +util/libcares_la-ares_timeval.lo: util/ares_timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_timeval.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_timeval.Tpo -c -o util/libcares_la-ares_timeval.lo `test -f 'util/ares_timeval.c' || echo '$(srcdir)/'`util/ares_timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_timeval.Tpo util/$(DEPDIR)/libcares_la-ares_timeval.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_timeval.c' object='util/libcares_la-ares_timeval.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_timeval.lo `test -f 'util/ares_timeval.c' || echo '$(srcdir)/'`util/ares_timeval.c + +util/libcares_la-ares_math.lo: util/ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_math.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_math.Tpo -c -o util/libcares_la-ares_math.lo `test -f 'util/ares_math.c' || echo '$(srcdir)/'`util/ares_math.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_math.Tpo util/$(DEPDIR)/libcares_la-ares_math.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_math.c' object='util/libcares_la-ares_math.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_math.lo `test -f 'util/ares_math.c' || echo '$(srcdir)/'`util/ares_math.c + +util/libcares_la-ares_rand.lo: util/ares_rand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_rand.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_rand.Tpo -c -o util/libcares_la-ares_rand.lo `test -f 'util/ares_rand.c' || echo '$(srcdir)/'`util/ares_rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_rand.Tpo util/$(DEPDIR)/libcares_la-ares_rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_rand.c' object='util/libcares_la-ares_rand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_rand.lo `test -f 'util/ares_rand.c' || echo '$(srcdir)/'`util/ares_rand.c + +util/libcares_la-ares_uri.lo: util/ares_uri.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -MT util/libcares_la-ares_uri.lo -MD -MP -MF util/$(DEPDIR)/libcares_la-ares_uri.Tpo -c -o util/libcares_la-ares_uri.lo `test -f 'util/ares_uri.c' || echo '$(srcdir)/'`util/ares_uri.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) util/$(DEPDIR)/libcares_la-ares_uri.Tpo util/$(DEPDIR)/libcares_la-ares_uri.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/ares_uri.c' object='util/libcares_la-ares_uri.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcares_la_CPPFLAGS) $(CPPFLAGS) $(libcares_la_CFLAGS) $(CFLAGS) -c -o util/libcares_la-ares_uri.lo `test -f 'util/ares_uri.c' || echo '$(srcdir)/'`util/ares_uri.c + mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs + -rm -rf dsa/.libs dsa/_libs + -rm -rf event/.libs event/_libs + -rm -rf legacy/.libs legacy/_libs + -rm -rf record/.libs record/_libs + -rm -rf str/.libs str/_libs + -rm -rf util/.libs util/_libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. @@ -1685,6 +1978,18 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f dsa/$(DEPDIR)/$(am__dirstamp) + -rm -f dsa/$(am__dirstamp) + -rm -f event/$(DEPDIR)/$(am__dirstamp) + -rm -f event/$(am__dirstamp) + -rm -f legacy/$(DEPDIR)/$(am__dirstamp) + -rm -f legacy/$(am__dirstamp) + -rm -f record/$(DEPDIR)/$(am__dirstamp) + -rm -f record/$(am__dirstamp) + -rm -f str/$(DEPDIR)/$(am__dirstamp) + -rm -f str/$(am__dirstamp) + -rm -f util/$(DEPDIR)/$(am__dirstamp) + -rm -f util/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -1696,43 +2001,15 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive - -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_addrinfo2hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_addrinfo_localhost.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_close_sockets.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_conn.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_cookie.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_epoll.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_kqueue.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_poll.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_select.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_thread.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_win32.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_free_hostent.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_free_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_freeaddrinfo.Plo @@ -1741,41 +2018,80 @@ distclean: distclean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_gethostbyaddr.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_gethostbyname.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_getnameinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_hosts_file.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_metrics.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_set_socket_functions.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_socket.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sortaddrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_mac.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_win.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_ntop.Plo -rm -f ./$(DEPDIR)/libcares_la-windows_port.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_array.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_llist.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_slist.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_configchg.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_epoll.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_kqueue.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_poll.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_select.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_thread.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_win32.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_create_query.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_expand_name.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_expand_string.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_fds.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_getsock.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_multistring.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_write.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_buf.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_str.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_iface_ips.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_math.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_rand.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_threads.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_timeval.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_uri.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags @@ -1821,43 +2137,15 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo2hostent.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__addrinfo_localhost.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__buf.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__close_sockets.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__hosts_file.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_asvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_strvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__htable_szvp.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__iface_ips.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__llist.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__parse_into_addrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__slist.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__socket.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__sortaddrinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__threads.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares__timeval.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_addrinfo2hostent.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_addrinfo_localhost.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_android.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_cancel.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_create_query.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_close_sockets.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_conn.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_cookie.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_data.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_destroy.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_mapping.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_name.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_parse.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_record.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_dns_write.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_epoll.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_kqueue.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_poll.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_select.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_thread.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_event_win32.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_expand_name.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_expand_string.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_fds.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_free_hostent.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_free_string.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_freeaddrinfo.Plo @@ -1866,41 +2154,80 @@ maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/libcares_la-ares_gethostbyaddr.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_gethostbyname.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_getnameinfo.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_getsock.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_hosts_file.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_init.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_library_init.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_math.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_metrics.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_options.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_platform.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_parse_into_addrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_process.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_qcache.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_query.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_rand.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_search.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_send.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_str.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strcasecmp.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_set_socket_functions.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_socket.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sortaddrinfo.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_strerror.Plo - -rm -f ./$(DEPDIR)/libcares_la-ares_strsplit.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_files.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_mac.Plo + -rm -f ./$(DEPDIR)/libcares_la-ares_sysconfig_win.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_timeout.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_update_servers.Plo -rm -f ./$(DEPDIR)/libcares_la-ares_version.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_net_pton.Plo -rm -f ./$(DEPDIR)/libcares_la-inet_ntop.Plo -rm -f ./$(DEPDIR)/libcares_la-windows_port.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_array.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_asvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_dict.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_strvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_szvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_vpstr.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_htable_vpvp.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_llist.Plo + -rm -f dsa/$(DEPDIR)/libcares_la-ares_slist.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_configchg.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_epoll.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_kqueue.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_poll.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_select.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_thread.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_wake_pipe.Plo + -rm -f event/$(DEPDIR)/libcares_la-ares_event_win32.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_create_query.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_expand_name.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_expand_string.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_fds.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_getsock.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_a_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_aaaa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_caa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_mx_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_naptr_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_ns_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_ptr_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_soa_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_srv_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_txt_reply.Plo + -rm -f legacy/$(DEPDIR)/libcares_la-ares_parse_uri_reply.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_mapping.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_multistring.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_name.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_parse.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_record.Plo + -rm -f record/$(DEPDIR)/libcares_la-ares_dns_write.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_buf.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_str.Plo + -rm -f str/$(DEPDIR)/libcares_la-ares_strsplit.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_iface_ips.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_math.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_rand.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_threads.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_timeval.Plo + -rm -f util/$(DEPDIR)/libcares_la-ares_uri.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -2004,7 +2331,7 @@ uninstall-am: uninstall-libLTLIBRARIES # Capture code coverage data @CODE_COVERAGE_ENABLED_TRUE@code-coverage-capture: code-coverage-capture-hook @CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) -@CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) +@CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) @CODE_COVERAGE_ENABLED_TRUE@ -@rm -f "$(CODE_COVERAGE_OUTPUT_FILE).tmp" @CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @CODE_COVERAGE_ENABLED_TRUE@ @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" diff --git a/deps/cares/src/lib/Makefile.inc b/deps/cares/src/lib/Makefile.inc index 38f7a115fe3598..10e4edf5c761a0 100644 --- a/deps/cares/src/lib/Makefile.inc +++ b/deps/cares/src/lib/Makefile.inc @@ -1,42 +1,15 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -CSOURCES = ares__addrinfo2hostent.c \ - ares__addrinfo_localhost.c \ - ares__buf.c \ - ares__close_sockets.c \ - ares__hosts_file.c \ - ares__htable.c \ - ares__htable_asvp.c \ - ares__htable_strvp.c \ - ares__htable_szvp.c \ - ares__iface_ips.c \ - ares__llist.c \ - ares__parse_into_addrinfo.c \ - ares__slist.c \ - ares__socket.c \ - ares__sortaddrinfo.c \ - ares__threads.c \ - ares__timeval.c \ +CSOURCES = ares_addrinfo2hostent.c \ + ares_addrinfo_localhost.c \ ares_android.c \ ares_cancel.c \ + ares_close_sockets.c \ + ares_conn.c \ + ares_cookie.c \ ares_data.c \ ares_destroy.c \ - ares_dns_mapping.c \ - ares_dns_name.c \ - ares_dns_parse.c \ - ares_dns_record.c \ - ares_dns_write.c \ - ares_event_epoll.c \ - ares_event_kqueue.c \ - ares_event_poll.c \ - ares_event_select.c \ - ares_event_thread.c \ - ares_event_wake_pipe.c \ - ares_event_win32.c \ - ares_expand_name.c \ - ares_expand_string.c \ - ares_fds.c \ ares_free_hostent.c \ ares_free_string.c \ ares_freeaddrinfo.c \ @@ -45,65 +18,112 @@ CSOURCES = ares__addrinfo2hostent.c \ ares_gethostbyaddr.c \ ares_gethostbyname.c \ ares_getnameinfo.c \ - ares_getsock.c \ + ares_hosts_file.c \ ares_init.c \ ares_library_init.c \ - ares_math.c \ - ares_create_query.c \ + ares_metrics.c \ ares_options.c \ - ares_parse_a_reply.c \ - ares_parse_aaaa_reply.c \ - ares_parse_caa_reply.c \ - ares_parse_mx_reply.c \ - ares_parse_naptr_reply.c \ - ares_parse_ns_reply.c \ - ares_parse_ptr_reply.c \ - ares_parse_soa_reply.c \ - ares_parse_srv_reply.c \ - ares_parse_txt_reply.c \ - ares_parse_uri_reply.c \ - ares_platform.c \ + ares_parse_into_addrinfo.c \ ares_process.c \ - ares_qcache.c \ + ares_qcache.c \ ares_query.c \ - ares_rand.c \ ares_search.c \ ares_send.c \ - ares_strcasecmp.c \ - ares_str.c \ + ares_set_socket_functions.c \ + ares_socket.c \ + ares_sortaddrinfo.c \ ares_strerror.c \ - ares_strsplit.c \ - ares_sysconfig.c \ - ares_sysconfig_files.c \ + ares_sysconfig.c \ + ares_sysconfig_files.c \ + ares_sysconfig_mac.c \ + ares_sysconfig_win.c \ ares_timeout.c \ - ares_update_servers.c \ + ares_update_servers.c \ ares_version.c \ inet_net_pton.c \ inet_ntop.c \ - windows_port.c + windows_port.c \ + dsa/ares_array.c \ + dsa/ares_htable.c \ + dsa/ares_htable_asvp.c \ + dsa/ares_htable_dict.c \ + dsa/ares_htable_strvp.c \ + dsa/ares_htable_szvp.c \ + dsa/ares_htable_vpstr.c \ + dsa/ares_htable_vpvp.c \ + dsa/ares_llist.c \ + dsa/ares_slist.c \ + event/ares_event_configchg.c \ + event/ares_event_epoll.c \ + event/ares_event_kqueue.c \ + event/ares_event_poll.c \ + event/ares_event_select.c \ + event/ares_event_thread.c \ + event/ares_event_wake_pipe.c \ + event/ares_event_win32.c \ + legacy/ares_create_query.c \ + legacy/ares_expand_name.c \ + legacy/ares_expand_string.c \ + legacy/ares_fds.c \ + legacy/ares_getsock.c \ + legacy/ares_parse_a_reply.c \ + legacy/ares_parse_aaaa_reply.c \ + legacy/ares_parse_caa_reply.c \ + legacy/ares_parse_mx_reply.c \ + legacy/ares_parse_naptr_reply.c \ + legacy/ares_parse_ns_reply.c \ + legacy/ares_parse_ptr_reply.c \ + legacy/ares_parse_soa_reply.c \ + legacy/ares_parse_srv_reply.c \ + legacy/ares_parse_txt_reply.c \ + legacy/ares_parse_uri_reply.c \ + record/ares_dns_mapping.c \ + record/ares_dns_multistring.c \ + record/ares_dns_name.c \ + record/ares_dns_parse.c \ + record/ares_dns_record.c \ + record/ares_dns_write.c \ + str/ares_buf.c \ + str/ares_str.c \ + str/ares_strsplit.c \ + util/ares_iface_ips.c \ + util/ares_threads.c \ + util/ares_timeval.c \ + util/ares_math.c \ + util/ares_rand.c \ + util/ares_uri.c -HHEADERS = ares__buf.h \ - ares__htable.h \ - ares__htable_asvp.h \ - ares__htable_strvp.h \ - ares__htable_szvp.h \ - ares__iface_ips.h \ - ares__llist.h \ - ares__slist.h \ - ares__threads.h \ - ares_android.h \ +HHEADERS = ares_android.h \ + ares_conn.h \ ares_data.h \ - ares_dns_private.h \ - ares_event.h \ - ares_event_win32.h \ ares_getenv.h \ ares_inet_net_pton.h \ ares_ipv6.h \ - ares_platform.h \ ares_private.h \ - ares_strcasecmp.h \ - ares_str.h \ - ares_strsplit.h \ ares_setup.h \ - setup_once.h - + ares_socket.h \ + dsa/ares_htable.h \ + dsa/ares_slist.h \ + event/ares_event.h \ + event/ares_event_win32.h \ + include/ares_array.h \ + include/ares_buf.h \ + include/ares_htable_asvp.h \ + include/ares_htable_dict.h \ + include/ares_htable_strvp.h \ + include/ares_htable_szvp.h \ + include/ares_htable_vpstr.h \ + include/ares_htable_vpvp.h \ + include/ares_llist.h \ + include/ares_mem.h \ + include/ares_str.h \ + record/ares_dns_multistring.h \ + record/ares_dns_private.h \ + str/ares_strsplit.h \ + util/ares_iface_ips.h \ + util/ares_math.h \ + util/ares_rand.h \ + util/ares_time.h \ + util/ares_threads.h \ + util/ares_uri.h \ + thirdparty/apple/dnsinfo.h diff --git a/deps/cares/src/lib/ares__addrinfo2hostent.c b/deps/cares/src/lib/ares__addrinfo2hostent.c deleted file mode 100644 index 95717890c2ff7c..00000000000000 --- a/deps/cares/src/lib/ares__addrinfo2hostent.c +++ /dev/null @@ -1,278 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) 2005 Dominick Meglio - * Copyright (c) 2019 Andrew Selivanov - * Copyright (c) 2021 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif - -#include "ares_nameser.h" - -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif - -#ifdef HAVE_LIMITS_H -# include <limits.h> -#endif - -#include "ares.h" -#include "ares_dns.h" -#include "ares_inet_net_pton.h" -#include "ares_private.h" - -ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, - struct hostent **host) -{ - struct ares_addrinfo_node *next; - struct ares_addrinfo_cname *next_cname; - char **aliases = NULL; - char *addrs = NULL; - size_t naliases = 0; - size_t naddrs = 0; - size_t alias = 0; - size_t i; - - if (ai == NULL || host == NULL) { - return ARES_EBADQUERY; - } - - /* Use the first node of the response as the family, since hostent can only - * represent one family. We assume getaddrinfo() returned a sorted list if - * the user requested AF_UNSPEC. */ - if (family == AF_UNSPEC && ai->nodes) { - family = ai->nodes->ai_family; - } - - if (family != AF_INET && family != AF_INET6) { - return ARES_EBADQUERY; - } - - *host = ares_malloc(sizeof(**host)); - if (!(*host)) { - goto enomem; - } - memset(*host, 0, sizeof(**host)); - - next = ai->nodes; - while (next) { - if (next->ai_family == family) { - ++naddrs; - } - next = next->ai_next; - } - - next_cname = ai->cnames; - while (next_cname) { - if (next_cname->alias) { - ++naliases; - } - next_cname = next_cname->next; - } - - aliases = ares_malloc((naliases + 1) * sizeof(char *)); - if (!aliases) { - goto enomem; - } - (*host)->h_aliases = aliases; - memset(aliases, 0, (naliases + 1) * sizeof(char *)); - - if (naliases) { - for (next_cname = ai->cnames; next_cname != NULL; - next_cname = next_cname->next) { - if (next_cname->alias == NULL) { - continue; - } - aliases[alias] = ares_strdup(next_cname->alias); - if (!aliases[alias]) { - goto enomem; - } - alias++; - } - } - - - (*host)->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *)); - if (!(*host)->h_addr_list) { - goto enomem; - } - - memset((*host)->h_addr_list, 0, (naddrs + 1) * sizeof(char *)); - - if (ai->cnames) { - (*host)->h_name = ares_strdup(ai->cnames->name); - if ((*host)->h_name == NULL && ai->cnames->name) { - goto enomem; - } - } else { - (*host)->h_name = ares_strdup(ai->name); - if ((*host)->h_name == NULL && ai->name) { - goto enomem; - } - } - - (*host)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family; - - if (family == AF_INET) { - (*host)->h_length = sizeof(struct in_addr); - } - - if (family == AF_INET6) { - (*host)->h_length = sizeof(struct ares_in6_addr); - } - - if (naddrs) { - addrs = ares_malloc(naddrs * (size_t)(*host)->h_length); - if (!addrs) { - goto enomem; - } - - i = 0; - for (next = ai->nodes; next != NULL; next = next->ai_next) { - if (next->ai_family != family) { - continue; - } - (*host)->h_addr_list[i] = addrs + (i * (size_t)(*host)->h_length); - if (family == AF_INET6) { - memcpy( - (*host)->h_addr_list[i], - &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), - (size_t)(*host)->h_length); - } - if (family == AF_INET) { - memcpy( - (*host)->h_addr_list[i], - &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), - (size_t)(*host)->h_length); - } - ++i; - } - - if (i == 0) { - ares_free(addrs); - } - } - - if (naddrs == 0 && naliases == 0) { - ares_free_hostent(*host); - *host = NULL; - return ARES_ENODATA; - } - - return ARES_SUCCESS; - -enomem: - ares_free_hostent(*host); - *host = NULL; - return ARES_ENOMEM; -} - -ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, - size_t req_naddrttls, - struct ares_addrttl *addrttls, - struct ares_addr6ttl *addr6ttls, - size_t *naddrttls) -{ - struct ares_addrinfo_node *next; - struct ares_addrinfo_cname *next_cname; - int cname_ttl = INT_MAX; - - if (family != AF_INET && family != AF_INET6) { - return ARES_EBADQUERY; - } - - if (ai == NULL || naddrttls == NULL) { - return ARES_EBADQUERY; - } - - if (family == AF_INET && addrttls == NULL) { - return ARES_EBADQUERY; - } - - if (family == AF_INET6 && addr6ttls == NULL) { - return ARES_EBADQUERY; - } - - if (req_naddrttls == 0) { - return ARES_EBADQUERY; - } - - *naddrttls = 0; - - next_cname = ai->cnames; - while (next_cname) { - if (next_cname->ttl < cname_ttl) { - cname_ttl = next_cname->ttl; - } - next_cname = next_cname->next; - } - - for (next = ai->nodes; next != NULL; next = next->ai_next) { - if (next->ai_family != family) { - continue; - } - - if (*naddrttls >= req_naddrttls) { - break; - } - - if (family == AF_INET6) { - if (next->ai_ttl > cname_ttl) { - addr6ttls[*naddrttls].ttl = cname_ttl; - } else { - addr6ttls[*naddrttls].ttl = next->ai_ttl; - } - - memcpy( - &addr6ttls[*naddrttls].ip6addr, - &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr), - sizeof(struct ares_in6_addr)); - } else { - if (next->ai_ttl > cname_ttl) { - addrttls[*naddrttls].ttl = cname_ttl; - } else { - addrttls[*naddrttls].ttl = next->ai_ttl; - } - memcpy( - &addrttls[*naddrttls].ipaddr, - &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr), - sizeof(struct in_addr)); - } - (*naddrttls)++; - } - - return ARES_SUCCESS; -} diff --git a/deps/cares/src/lib/ares__addrinfo_localhost.c b/deps/cares/src/lib/ares__addrinfo_localhost.c deleted file mode 100644 index baa9b37212bb94..00000000000000 --- a/deps/cares/src/lib/ares__addrinfo_localhost.c +++ /dev/null @@ -1,236 +0,0 @@ -/* MIT License - * - * Copyright (c) Massachusetts Institute of Technology - * Copyright (c) Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif - -#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 -# include <ws2ipdef.h> -#endif - -#if defined(USE_WINSOCK) -# if defined(HAVE_IPHLPAPI_H) -# include <iphlpapi.h> -# endif -# if defined(HAVE_NETIOAPI_H) -# include <netioapi.h> -# endif -#endif - -#include "ares.h" -#include "ares_inet_net_pton.h" -#include "ares_private.h" - -ares_status_t ares_append_ai_node(int aftype, unsigned short port, - unsigned int ttl, const void *adata, - struct ares_addrinfo_node **nodes) -{ - struct ares_addrinfo_node *node; - - node = ares__append_addrinfo_node(nodes); - if (!node) { - return ARES_ENOMEM; - } - - memset(node, 0, sizeof(*node)); - - if (aftype == AF_INET) { - struct sockaddr_in *sin = ares_malloc(sizeof(*sin)); - if (!sin) { - return ARES_ENOMEM; - } - - memset(sin, 0, sizeof(*sin)); - memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr)); - sin->sin_family = AF_INET; - sin->sin_port = htons(port); - - node->ai_addr = (struct sockaddr *)sin; - node->ai_family = AF_INET; - node->ai_addrlen = sizeof(*sin); - node->ai_addr = (struct sockaddr *)sin; - node->ai_ttl = (int)ttl; - } - - if (aftype == AF_INET6) { - struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6)); - if (!sin6) { - return ARES_ENOMEM; - } - - memset(sin6, 0, sizeof(*sin6)); - memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr)); - sin6->sin6_family = AF_INET6; - sin6->sin6_port = htons(port); - - node->ai_addr = (struct sockaddr *)sin6; - node->ai_family = AF_INET6; - node->ai_addrlen = sizeof(*sin6); - node->ai_addr = (struct sockaddr *)sin6; - node->ai_ttl = (int)ttl; - } - - return ARES_SUCCESS; -} - -static ares_status_t - ares__default_loopback_addrs(int aftype, unsigned short port, - struct ares_addrinfo_node **nodes) -{ - ares_status_t status = ARES_SUCCESS; - - if (aftype == AF_UNSPEC || aftype == AF_INET6) { - struct ares_in6_addr addr6; - ares_inet_pton(AF_INET6, "::1", &addr6); - status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes); - if (status != ARES_SUCCESS) { - return status; - } - } - - if (aftype == AF_UNSPEC || aftype == AF_INET) { - struct in_addr addr4; - ares_inet_pton(AF_INET, "127.0.0.1", &addr4); - status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes); - if (status != ARES_SUCCESS) { - return status; - } - } - - return status; -} - -static ares_status_t - ares__system_loopback_addrs(int aftype, unsigned short port, - struct ares_addrinfo_node **nodes) -{ -#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && \ - !defined(__WATCOMC__) - PMIB_UNICASTIPADDRESS_TABLE table; - unsigned int i; - ares_status_t status; - - *nodes = NULL; - - if (GetUnicastIpAddressTable((ADDRESS_FAMILY)aftype, &table) != NO_ERROR) { - return ARES_ENOTFOUND; - } - - for (i = 0; i < table->NumEntries; i++) { - if (table->Table[i].InterfaceLuid.Info.IfType != - IF_TYPE_SOFTWARE_LOOPBACK) { - continue; - } - - if (table->Table[i].Address.si_family == AF_INET) { - status = - ares_append_ai_node(table->Table[i].Address.si_family, port, 0, - &table->Table[i].Address.Ipv4.sin_addr, nodes); - } else if (table->Table[i].Address.si_family == AF_INET6) { - status = - ares_append_ai_node(table->Table[i].Address.si_family, port, 0, - &table->Table[i].Address.Ipv6.sin6_addr, nodes); - } else { - /* Ignore any others */ - continue; - } - - if (status != ARES_SUCCESS) { - goto fail; - } - } - - if (*nodes == NULL) { - status = ARES_ENOTFOUND; - } - -fail: - FreeMibTable(table); - - if (status != ARES_SUCCESS) { - ares__freeaddrinfo_nodes(*nodes); - *nodes = NULL; - } - - return status; - -#else - (void)aftype; - (void)port; - (void)nodes; - /* Not supported on any other OS at this time */ - return ARES_ENOTFOUND; -#endif -} - -ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai) -{ - struct ares_addrinfo_node *nodes = NULL; - ares_status_t status; - - /* Validate family */ - switch (hints->ai_family) { - case AF_INET: - case AF_INET6: - case AF_UNSPEC: - break; - default: - return ARES_EBADFAMILY; - } - - ai->name = ares_strdup(name); - if (!ai->name) { - goto enomem; - } - - status = ares__system_loopback_addrs(hints->ai_family, port, &nodes); - - if (status == ARES_ENOTFOUND) { - status = ares__default_loopback_addrs(hints->ai_family, port, &nodes); - } - - ares__addrinfo_cat_nodes(&ai->nodes, nodes); - - return status; - -enomem: - ares__freeaddrinfo_nodes(nodes); - ares_free(ai->name); - ai->name = NULL; - return ARES_ENOMEM; -} diff --git a/deps/cares/src/lib/ares__buf.c b/deps/cares/src/lib/ares__buf.c deleted file mode 100644 index 0663383df9e42e..00000000000000 --- a/deps/cares/src/lib/ares__buf.c +++ /dev/null @@ -1,1215 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__buf.h" -#include <limits.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif - -struct ares__buf { - const unsigned char *data; /*!< pointer to start of data buffer */ - size_t data_len; /*!< total size of data in buffer */ - - unsigned char *alloc_buf; /*!< Pointer to allocated data buffer, - * not used for const buffers */ - size_t alloc_buf_len; /*!< Size of allocated data buffer */ - - size_t offset; /*!< Current working offset in buffer */ - size_t tag_offset; /*!< Tagged offset in buffer. Uses - * SIZE_MAX if not set. */ -}; - -ares__buf_t *ares__buf_create(void) -{ - ares__buf_t *buf = ares_malloc_zero(sizeof(*buf)); - if (buf == NULL) { - return NULL; - } - - buf->tag_offset = SIZE_MAX; - return buf; -} - -ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len) -{ - ares__buf_t *buf; - - if (data == NULL || data_len == 0) { - return NULL; - } - - buf = ares__buf_create(); - if (buf == NULL) { - return NULL; - } - - buf->data = data; - buf->data_len = data_len; - - return buf; -} - -void ares__buf_destroy(ares__buf_t *buf) -{ - if (buf == NULL) { - return; - } - ares_free(buf->alloc_buf); - ares_free(buf); -} - -static ares_bool_t ares__buf_is_const(const ares__buf_t *buf) -{ - if (buf == NULL) { - return ARES_FALSE; - } - - if (buf->data != NULL && buf->alloc_buf == NULL) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -void ares__buf_reclaim(ares__buf_t *buf) -{ - size_t prefix_size; - size_t data_size; - - if (buf == NULL) { - return; - } - - if (ares__buf_is_const(buf)) { - return; - } - - /* Silence coverity. All lengths are zero so would bail out later but - * coverity doesn't know this */ - if (buf->alloc_buf == NULL) { - return; - } - - if (buf->tag_offset != SIZE_MAX && buf->tag_offset < buf->offset) { - prefix_size = buf->tag_offset; - } else { - prefix_size = buf->offset; - } - - if (prefix_size == 0) { - return; - } - - data_size = buf->data_len - prefix_size; - - memmove(buf->alloc_buf, buf->alloc_buf + prefix_size, data_size); - buf->data = buf->alloc_buf; - buf->data_len = data_size; - buf->offset -= prefix_size; - if (buf->tag_offset != SIZE_MAX) { - buf->tag_offset -= prefix_size; - } - - return; -} - -static ares_status_t ares__buf_ensure_space(ares__buf_t *buf, - size_t needed_size) -{ - size_t remaining_size; - size_t alloc_size; - unsigned char *ptr; - - if (buf == NULL) { - return ARES_EFORMERR; - } - - if (ares__buf_is_const(buf)) { - return ARES_EFORMERR; - } - - /* When calling ares__buf_finish_str() we end up adding a null terminator, - * so we want to ensure the size is always sufficient for this as we don't - * want an ARES_ENOMEM at that point */ - needed_size++; - - /* No need to do an expensive move operation, we have enough to just append */ - remaining_size = buf->alloc_buf_len - buf->data_len; - if (remaining_size >= needed_size) { - return ARES_SUCCESS; - } - - /* See if just moving consumed data frees up enough space */ - ares__buf_reclaim(buf); - - remaining_size = buf->alloc_buf_len - buf->data_len; - if (remaining_size >= needed_size) { - return ARES_SUCCESS; - } - - alloc_size = buf->alloc_buf_len; - - /* Not yet started */ - if (alloc_size == 0) { - alloc_size = 16; /* Always shifts 1, so ends up being 32 minimum */ - } - - /* Increase allocation by powers of 2 */ - do { - alloc_size <<= 1; - remaining_size = alloc_size - buf->data_len; - } while (remaining_size < needed_size); - - ptr = ares_realloc(buf->alloc_buf, alloc_size); - if (ptr == NULL) { - return ARES_ENOMEM; - } - - buf->alloc_buf = ptr; - buf->alloc_buf_len = alloc_size; - buf->data = ptr; - - return ARES_SUCCESS; -} - -ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len) -{ - if (buf == NULL || ares__buf_is_const(buf)) { - return ARES_EFORMERR; - } - - if (len >= buf->alloc_buf_len - buf->offset) { - return ARES_EFORMERR; - } - - buf->data_len = len; - return ARES_SUCCESS; -} - -ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data, - size_t data_len) -{ - ares_status_t status; - - if (data == NULL || data_len == 0) { - return ARES_EFORMERR; - } - - status = ares__buf_ensure_space(buf, data_len); - if (status != ARES_SUCCESS) { - return status; - } - - memcpy(buf->alloc_buf + buf->data_len, data, data_len); - buf->data_len += data_len; - return ARES_SUCCESS; -} - -ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte) -{ - return ares__buf_append(buf, &byte, 1); -} - -ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16) -{ - ares_status_t status; - - status = ares__buf_append_byte(buf, (unsigned char)((u16 >> 8) & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_byte(buf, (unsigned char)(u16 & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - return ARES_SUCCESS; -} - -ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32) -{ - ares_status_t status; - - status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 24) & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 16) & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 8) & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_byte(buf, ((unsigned char)u32 & 0xff)); - if (status != ARES_SUCCESS) { - return status; - } - - return ARES_SUCCESS; -} - -unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len) -{ - ares_status_t status; - - if (len == NULL || *len == 0) { - return NULL; - } - - status = ares__buf_ensure_space(buf, *len); - if (status != ARES_SUCCESS) { - return NULL; - } - - /* -1 for possible null terminator for ares__buf_finish_str() */ - *len = buf->alloc_buf_len - buf->data_len - 1; - return buf->alloc_buf + buf->data_len; -} - -void ares__buf_append_finish(ares__buf_t *buf, size_t len) -{ - if (buf == NULL) { - return; - } - - buf->data_len += len; -} - -unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len) -{ - unsigned char *ptr = NULL; - if (buf == NULL || len == NULL || ares__buf_is_const(buf)) { - return NULL; - } - - ares__buf_reclaim(buf); - - /* We don't want to return NULL except on failure, may be zero-length */ - if (buf->alloc_buf == NULL && - ares__buf_ensure_space(buf, 1) != ARES_SUCCESS) { - return NULL; - } - ptr = buf->alloc_buf; - *len = buf->data_len; - ares_free(buf); - return ptr; -} - -char *ares__buf_finish_str(ares__buf_t *buf, size_t *len) -{ - char *ptr; - size_t mylen; - - ptr = (char *)ares__buf_finish_bin(buf, &mylen); - if (ptr == NULL) { - return NULL; - } - - if (len != NULL) { - *len = mylen; - } - - /* NOTE: ensured via ares__buf_ensure_space() that there is always at least - * 1 extra byte available for this specific use-case */ - ptr[mylen] = 0; - - return ptr; -} - -void ares__buf_tag(ares__buf_t *buf) -{ - if (buf == NULL) { - return; - } - - buf->tag_offset = buf->offset; -} - -ares_status_t ares__buf_tag_rollback(ares__buf_t *buf) -{ - if (buf == NULL || buf->tag_offset == SIZE_MAX) { - return ARES_EFORMERR; - } - - buf->offset = buf->tag_offset; - buf->tag_offset = SIZE_MAX; - return ARES_SUCCESS; -} - -ares_status_t ares__buf_tag_clear(ares__buf_t *buf) -{ - if (buf == NULL || buf->tag_offset == SIZE_MAX) { - return ARES_EFORMERR; - } - - buf->tag_offset = SIZE_MAX; - return ARES_SUCCESS; -} - -const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len) -{ - if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL) { - return NULL; - } - - *len = buf->offset - buf->tag_offset; - return buf->data + buf->tag_offset; -} - -size_t ares__buf_tag_length(const ares__buf_t *buf) -{ - if (buf == NULL || buf->tag_offset == SIZE_MAX) { - return 0; - } - return buf->offset - buf->tag_offset; -} - -ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf, - unsigned char *bytes, size_t *len) -{ - size_t ptr_len = 0; - const unsigned char *ptr = ares__buf_tag_fetch(buf, &ptr_len); - - if (ptr == NULL || bytes == NULL || len == NULL) { - return ARES_EFORMERR; - } - - if (*len < ptr_len) { - return ARES_EFORMERR; - } - - *len = ptr_len; - - if (ptr_len > 0) { - memcpy(bytes, ptr, ptr_len); - } - return ARES_SUCCESS; -} - -ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str, - size_t len) -{ - size_t out_len; - ares_status_t status; - size_t i; - - if (str == NULL || len == 0) { - return ARES_EFORMERR; - } - - /* Space for NULL terminator */ - out_len = len - 1; - - status = ares__buf_tag_fetch_bytes(buf, (unsigned char *)str, &out_len); - if (status != ARES_SUCCESS) { - return status; - } - - /* NULL terminate */ - str[out_len] = 0; - - /* Validate string is printable */ - for (i = 0; i < out_len; i++) { - if (!ares__isprint(str[i])) { - return ARES_EBADSTR; - } - } - - return ARES_SUCCESS; -} - -static const unsigned char *ares__buf_fetch(const ares__buf_t *buf, size_t *len) -{ - if (len != NULL) { - *len = 0; - } - - if (buf == NULL || len == NULL || buf->data == NULL) { - return NULL; - } - - *len = buf->data_len - buf->offset; - if (*len == 0) { - return NULL; - } - - return buf->data + buf->offset; -} - -ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len) -{ - size_t remaining_len = ares__buf_len(buf); - - if (remaining_len < len) { - return ARES_EBADRESP; - } - - buf->offset += len; - return ARES_SUCCESS; -} - -ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - unsigned int u32; - - if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16)) { - return ARES_EBADRESP; - } - - /* Do math in an unsigned int in order to prevent warnings due to automatic - * conversion by the compiler from short to int during shifts */ - u32 = ((unsigned int)(ptr[0]) << 8 | (unsigned int)ptr[1]); - *u16 = (unsigned short)(u32 & 0xFFFF); - - return ares__buf_consume(buf, sizeof(*u16)); -} - -ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - - if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) { - return ARES_EBADRESP; - } - - *u32 = ((unsigned int)(ptr[0]) << 24 | (unsigned int)(ptr[1]) << 16 | - (unsigned int)(ptr[2]) << 8 | (unsigned int)(ptr[3])); - - return ares__buf_consume(buf, sizeof(*u32)); -} - -ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes, - size_t len) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - - if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { - return ARES_EBADRESP; - } - - memcpy(bytes, ptr, len); - return ares__buf_consume(buf, len); -} - -ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len, - ares_bool_t null_term, - unsigned char **bytes) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - - if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { - return ARES_EBADRESP; - } - - *bytes = ares_malloc(null_term ? len + 1 : len); - if (*bytes == NULL) { - return ARES_ENOMEM; - } - - memcpy(*bytes, ptr, len); - if (null_term) { - (*bytes)[len] = 0; - } - return ares__buf_consume(buf, len); -} - -ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - - if (buf == NULL || str == NULL || len == 0 || remaining_len < len) { - return ARES_EBADRESP; - } - - *str = ares_malloc(len + 1); - if (*str == NULL) { - return ARES_ENOMEM; - } - - memcpy(*str, ptr, len); - (*str)[len] = 0; - - return ares__buf_consume(buf, len); -} - -ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf, - ares__buf_t *dest, size_t len) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - ares_status_t status; - - if (buf == NULL || dest == NULL || len == 0 || remaining_len < len) { - return ARES_EBADRESP; - } - - status = ares__buf_append(dest, ptr, len); - if (status != ARES_SUCCESS) { - return status; - } - - return ares__buf_consume(buf, len); -} - -static ares_bool_t ares__is_whitespace(unsigned char c, - ares_bool_t include_linefeed) -{ - switch (c) { - case '\r': - case '\t': - case ' ': - case '\v': - case '\f': - return ARES_TRUE; - case '\n': - return include_linefeed; - default: - break; - } - return ARES_FALSE; -} - -size_t ares__buf_consume_whitespace(ares__buf_t *buf, - ares_bool_t include_linefeed) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - size_t i; - - if (ptr == NULL) { - return 0; - } - - for (i = 0; i < remaining_len; i++) { - if (!ares__is_whitespace(ptr[i], include_linefeed)) { - break; - } - } - - if (i > 0) { - ares__buf_consume(buf, i); - } - return i; -} - -size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - size_t i; - - if (ptr == NULL) { - return 0; - } - - for (i = 0; i < remaining_len; i++) { - if (ares__is_whitespace(ptr[i], ARES_TRUE)) { - break; - } - } - - if (i > 0) { - ares__buf_consume(buf, i); - } - return i; -} - -size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - size_t i; - - if (ptr == NULL) { - return 0; - } - - for (i = 0; i < remaining_len; i++) { - if (ptr[i] == '\n') { - goto done; - } - } - -done: - if (include_linefeed && i < remaining_len && ptr[i] == '\n') { - i++; - } - - if (i > 0) { - ares__buf_consume(buf, i); - } - return i; -} - -size_t ares__buf_consume_until_charset(ares__buf_t *buf, - const unsigned char *charset, size_t len, - ares_bool_t require_charset) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - size_t i; - ares_bool_t found = ARES_FALSE; - - if (ptr == NULL || charset == NULL || len == 0) { - return 0; - } - - for (i = 0; i < remaining_len; i++) { - size_t j; - for (j = 0; j < len; j++) { - if (ptr[i] == charset[j]) { - found = ARES_TRUE; - goto done; - } - } - } - -done: - if (require_charset && !found) { - return 0; - } - - if (i > 0) { - ares__buf_consume(buf, i); - } - return i; -} - -size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset, - size_t len) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - size_t i; - - if (ptr == NULL || charset == NULL || len == 0) { - return 0; - } - - for (i = 0; i < remaining_len; i++) { - size_t j; - for (j = 0; j < len; j++) { - if (ptr[i] == charset[j]) { - break; - } - } - /* Not found */ - if (j == len) { - break; - } - } - - if (i > 0) { - ares__buf_consume(buf, i); - } - return i; -} - -static void ares__buf_destroy_cb(void *arg) -{ - ares__buf_destroy(arg); -} - -static ares_bool_t ares__buf_split_isduplicate(ares__llist_t *list, - const unsigned char *val, - size_t len, - ares__buf_split_t flags) -{ - ares__llist_node_t *node; - - for (node = ares__llist_node_first(list); node != NULL; - node = ares__llist_node_next(node)) { - const ares__buf_t *buf = ares__llist_node_val(node); - size_t plen = 0; - const unsigned char *ptr = ares__buf_peek(buf, &plen); - - /* Can't be duplicate if lengths mismatch */ - if (plen != len) { - continue; - } - - if (flags & ARES_BUF_SPLIT_CASE_INSENSITIVE) { - if (ares__memeq_ci(ptr, val, len)) { - return ARES_TRUE; - } - } else { - if (memcmp(ptr, val, len) == 0) { - return ARES_TRUE; - } - } - } - return ARES_FALSE; -} - -ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, - size_t delims_len, ares__buf_split_t flags, - size_t max_sections, ares__llist_t **list) -{ - ares_status_t status = ARES_SUCCESS; - ares_bool_t first = ARES_TRUE; - - if (buf == NULL || delims == NULL || delims_len == 0 || list == NULL) { - return ARES_EFORMERR; - } - - *list = ares__llist_create(ares__buf_destroy_cb); - if (*list == NULL) { - status = ARES_ENOMEM; - goto done; - } - - while (ares__buf_len(buf)) { - size_t len = 0; - const unsigned char *ptr; - - if (first) { - /* No delimiter yet, just tag the start */ - ares__buf_tag(buf); - } else { - if (flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) { - /* tag then eat delimiter so its first byte in buffer */ - ares__buf_tag(buf); - ares__buf_consume(buf, 1); - } else { - /* throw away delimiter */ - ares__buf_consume(buf, 1); - ares__buf_tag(buf); - } - } - - if (max_sections && ares__llist_len(*list) >= max_sections - 1) { - ares__buf_consume(buf, ares__buf_len(buf)); - } else { - ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE); - } - - ptr = ares__buf_tag_fetch(buf, &len); - - /* Shouldn't be possible */ - if (ptr == NULL) { - status = ARES_EFORMERR; - goto done; - } - - if (flags & ARES_BUF_SPLIT_LTRIM) { - size_t i; - for (i = 0; i < len; i++) { - if (!ares__is_whitespace(ptr[i], ARES_TRUE)) { - break; - } - } - ptr += i; - len -= i; - } - - if (flags & ARES_BUF_SPLIT_RTRIM) { - while (len && ares__is_whitespace(ptr[len - 1], ARES_TRUE)) { - len--; - } - } - - if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) { - ares__buf_t *data; - - if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) || - !ares__buf_split_isduplicate(*list, ptr, len, flags)) { - /* Since we don't allow const buffers of 0 length, and user wants - * 0-length buffers, swap what we do here */ - if (len) { - data = ares__buf_create_const(ptr, len); - } else { - data = ares__buf_create(); - } - - if (data == NULL) { - status = ARES_ENOMEM; - goto done; - } - - if (ares__llist_insert_last(*list, data) == NULL) { - ares__buf_destroy(data); - status = ARES_ENOMEM; - goto done; - } - } - } - - first = ARES_FALSE; - } - -done: - if (status != ARES_SUCCESS) { - ares__llist_destroy(*list); - *list = NULL; - } - - return status; -} - -ares_bool_t ares__buf_begins_with(const ares__buf_t *buf, - const unsigned char *data, size_t data_len) -{ - size_t remaining_len = 0; - const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len); - - if (ptr == NULL || data == NULL || data_len == 0) { - return ARES_FALSE; - } - - if (data_len > remaining_len) { - return ARES_FALSE; - } - - if (memcmp(ptr, data, data_len) != 0) { - return ARES_FALSE; - } - - return ARES_TRUE; -} - -size_t ares__buf_len(const ares__buf_t *buf) -{ - if (buf == NULL) { - return 0; - } - - return buf->data_len - buf->offset; -} - -const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len) -{ - return ares__buf_fetch(buf, len); -} - -size_t ares__buf_get_position(const ares__buf_t *buf) -{ - if (buf == NULL) { - return 0; - } - return buf->offset; -} - -ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx) -{ - if (buf == NULL) { - return ARES_EFORMERR; - } - - if (idx > buf->data_len) { - return ARES_EFORMERR; - } - - buf->offset = idx; - return ARES_SUCCESS; -} - -ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len, - unsigned char **bin, size_t *bin_len, - ares_bool_t allow_multiple) -{ - unsigned char len; - ares_status_t status; - ares__buf_t *binbuf = NULL; - size_t orig_len = ares__buf_len(buf); - - if (buf == NULL) { - return ARES_EFORMERR; - } - - if (remaining_len == 0) { - return ARES_EBADRESP; - } - - binbuf = ares__buf_create(); - if (binbuf == NULL) { - return ARES_ENOMEM; - } - - while (orig_len - ares__buf_len(buf) < remaining_len) { - status = ares__buf_fetch_bytes(buf, &len, 1); - if (status != ARES_SUCCESS) { - break; - } - - if (len) { - /* XXX: Maybe we should scan to make sure it is printable? */ - if (bin != NULL) { - status = ares__buf_fetch_bytes_into_buf(buf, binbuf, len); - } else { - status = ares__buf_consume(buf, len); - } - if (status != ARES_SUCCESS) { - break; - } - } - - if (!allow_multiple) { - break; - } - } - - - if (status != ARES_SUCCESS) { - ares__buf_destroy(binbuf); - } else { - if (bin != NULL) { - size_t mylen = 0; - /* NOTE: we use ares__buf_finish_str() here as we guarantee NULL - * Termination even though we are technically returning binary data. - */ - *bin = (unsigned char *)ares__buf_finish_str(binbuf, &mylen); - *bin_len = mylen; - } - } - - return status; -} - -ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len, - char **str, ares_bool_t allow_multiple) -{ - size_t len; - return ares__buf_parse_dns_binstr(buf, remaining_len, (unsigned char **)str, - &len, allow_multiple); -} - -ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, size_t len) -{ - size_t i; - size_t mod; - - if (len == 0) { - len = ares__count_digits(num); - } - - mod = ares__pow(10, len); - - for (i = len; i > 0; i--) { - size_t digit = (num % mod); - ares_status_t status; - - mod /= 10; - - /* Silence coverity. Shouldn't be possible since we calculate it above */ - if (mod == 0) { - return ARES_EFORMERR; - } - - digit /= mod; - status = ares__buf_append_byte(buf, '0' + (unsigned char)(digit & 0xFF)); - if (status != ARES_SUCCESS) { - return status; - } - } - return ARES_SUCCESS; -} - -ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, size_t len) -{ - size_t i; - static const unsigned char hexbytes[] = "0123456789ABCDEF"; - - if (len == 0) { - len = ares__count_hexdigits(num); - } - - for (i = len; i > 0; i--) { - ares_status_t status; - status = ares__buf_append_byte(buf, hexbytes[(num >> ((i - 1) * 4)) & 0xF]); - if (status != ARES_SUCCESS) { - return status; - } - } - return ARES_SUCCESS; -} - -ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str) -{ - return ares__buf_append(buf, (const unsigned char *)str, ares_strlen(str)); -} - -static ares_status_t ares__buf_hexdump_line(ares__buf_t *buf, size_t idx, - const unsigned char *data, - size_t len) -{ - size_t i; - ares_status_t status; - - /* Address */ - status = ares__buf_append_num_hex(buf, idx, 6); - if (status != ARES_SUCCESS) { - return status; - } - - /* | */ - status = ares__buf_append_str(buf, " | "); - if (status != ARES_SUCCESS) { - return status; - } - - for (i = 0; i < 16; i++) { - if (i >= len) { - status = ares__buf_append_str(buf, " "); - } else { - status = ares__buf_append_num_hex(buf, data[i], 2); - } - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_byte(buf, ' '); - if (status != ARES_SUCCESS) { - return status; - } - } - - /* | */ - status = ares__buf_append_str(buf, " | "); - if (status != ARES_SUCCESS) { - return status; - } - - for (i = 0; i < 16; i++) { - if (i >= len) { - break; - } - status = ares__buf_append_byte(buf, ares__isprint(data[i]) ? data[i] : '.'); - if (status != ARES_SUCCESS) { - return status; - } - } - - return ares__buf_append_byte(buf, '\n'); -} - -ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, - size_t len) -{ - size_t i; - - /* Each line is 16 bytes */ - for (i = 0; i < len; i += 16) { - ares_status_t status; - status = ares__buf_hexdump_line(buf, i, data + i, len - i); - if (status != ARES_SUCCESS) { - return status; - } - } - - return ARES_SUCCESS; -} - -ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf) -{ - FILE *fp = NULL; - unsigned char *ptr = NULL; - size_t len = 0; - size_t ptr_len = 0; - long ftell_len = 0; - ares_status_t status; - - if (filename == NULL || buf == NULL) { - return ARES_EFORMERR; - } - - fp = fopen(filename, "rb"); - if (fp == NULL) { - int error = ERRNO; - switch (error) { - case ENOENT: - case ESRCH: - status = ARES_ENOTFOUND; - goto done; - default: - DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, - strerror(error))); - DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename)); - status = ARES_EFILE; - goto done; - } - } - - /* Get length portably, fstat() is POSIX, not C */ - if (fseek(fp, 0, SEEK_END) != 0) { - status = ARES_EFILE; - goto done; - } - - ftell_len = ftell(fp); - if (ftell_len < 0) { - status = ARES_EFILE; - goto done; - } - len = (size_t)ftell_len; - - if (fseek(fp, 0, SEEK_SET) != 0) { - status = ARES_EFILE; - goto done; - } - - if (len == 0) { - status = ARES_SUCCESS; - goto done; - } - - /* Read entire data into buffer */ - ptr_len = len; - ptr = ares__buf_append_start(buf, &ptr_len); - if (ptr == NULL) { - status = ARES_ENOMEM; - goto done; - } - - ptr_len = fread(ptr, 1, len, fp); - if (ptr_len != len) { - status = ARES_EFILE; - goto done; - } - - ares__buf_append_finish(buf, len); - status = ARES_SUCCESS; - -done: - if (fp != NULL) { - fclose(fp); - } - return status; -} diff --git a/deps/cares/src/lib/ares__buf.h b/deps/cares/src/lib/ares__buf.h deleted file mode 100644 index 4298814f7b4396..00000000000000 --- a/deps/cares/src/lib/ares__buf.h +++ /dev/null @@ -1,599 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__BUF_H -#define __ARES__BUF_H - -/*! \addtogroup ares__buf Safe Data Builder and buffer - * - * This is a buffer building and parsing framework with a focus on security over - * performance. All data to be read from the buffer will perform explicit length - * validation and return a success/fail result. There are also various helpers - * for writing data to the buffer which dynamically grows. - * - * All operations that fetch or consume data from the buffer will move forward - * the internal pointer, thus marking the data as processed which may no longer - * be accessible after certain operations (such as append). - * - * The helpers for this object are meant to be added as needed. If you can't - * find it, write it! - * - * @{ - */ -struct ares__buf; - -/*! Opaque data type for generic hash table implementation */ -typedef struct ares__buf ares__buf_t; - -/*! Create a new buffer object that dynamically allocates buffers for data. - * - * \return initialized buffer object or NULL if out of memory. - */ -ares__buf_t *ares__buf_create(void); - -/*! Create a new buffer object that uses a user-provided data pointer. The - * data provided will not be manipulated, and cannot be appended to. This - * is strictly used for parsing. - * - * \param[in] data Data to provide to buffer, must not be NULL. - * \param[in] data_len Size of buffer provided, must be > 0 - * - * \return initialized buffer object or NULL if out of memory or misuse. - */ -ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len); - - -/*! Destroy an initialized buffer object. - * - * \param[in] buf Initialized buf object - */ -void ares__buf_destroy(ares__buf_t *buf); - - -/*! Append multiple bytes to a dynamic buffer object - * - * \param[in] buf Initialized buffer object - * \param[in] data Data to copy to buffer object - * \param[in] data_len Length of data to copy to buffer object. - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data, - size_t data_len); - -/*! Append a single byte to the dynamic buffer object - * - * \param[in] buf Initialized buffer object - * \param[in] byte Single byte to append to buffer object. - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte); - -/*! Append a null-terminated string to the dynamic buffer object - * - * \param[in] buf Initialized buffer object - * \param[in] str String to append to buffer object. - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str); - -/*! Append a 16bit Big Endian number to the buffer. - * - * \param[in] buf Initialized buffer object - * \param[out] u16 16bit integer - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16); - -/*! Append a 32bit Big Endian number to the buffer. - * - * \param[in] buf Initialized buffer object - * \param[out] u32 32bit integer - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32); - -/*! Append a number in ASCII decimal form. - * - * \param[in] buf Initialized buffer object - * \param[in] num Number to print - * \param[in] len Length to output, use 0 for no padding - * \return ARES_SUCCESS on success - */ -ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, - size_t len); - -/*! Append a number in ASCII hexadecimal form. - * - * \param[in] buf Initialized buffer object - * \param[in] num Number to print - * \param[in] len Length to output, use 0 for no padding - * \return ARES_SUCCESS on success - */ -ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, - size_t len); - -/*! Sets the current buffer length. This *may* be used if there is a need to - * override a prior position in the buffer, such as if there is a length - * prefix that isn't easily predictable, and you must go back and overwrite - * that position. - * - * Only valid on non-const buffers. Length provided must not exceed current - * allocated buffer size, but otherwise there are very few protections on - * this function. Use cautiously. - * - * \param[in] buf Initialized buffer object - * \param[in] len Length to set - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len); - - -/*! Start a dynamic append operation that returns a buffer suitable for - * writing. A desired minimum length is passed in, and the actual allocated - * buffer size is returned which may be greater than the requested size. - * No operation other than ares__buf_append_finish() is allowed on the - * buffer after this request. - * - * \param[in] buf Initialized buffer object - * \param[in,out] len Desired non-zero length passed in, actual buffer size - * returned. - * \return Pointer to writable buffer or NULL on failure (usage, out of mem) - */ -unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len); - -/*! Finish a dynamic append operation. Called after - * ares__buf_append_start() once desired data is written. - * - * \param[in] buf Initialized buffer object. - * \param[in] len Length of data written. May be zero to terminate - * operation. Must not be greater than returned from - * ares__buf_append_start(). - */ -void ares__buf_append_finish(ares__buf_t *buf, size_t len); - -/*! Write the data provided to the buffer in a hexdump format. - * - * \param[in] buf Initialized buffer object. - * \param[in] data Data to hex dump - * \param[in] len Length of data to hexdump - * \return ARES_SUCCESS on success. - */ -ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data, - size_t len); - -/*! Clean up ares__buf_t and return allocated pointer to unprocessed data. It - * is the responsibility of the caller to ares_free() the returned buffer. - * The passed in buf parameter is invalidated by this call. - * - * \param[in] buf Initialized buffer object. Can not be a "const" buffer. - * \param[out] len Length of data returned - * \return pointer to unprocessed data (may be zero length) or NULL on error. - */ -unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len); - -/*! Clean up ares__buf_t and return allocated pointer to unprocessed data and - * return it as a string (null terminated). It is the responsibility of the - * caller to ares_free() the returned buffer. The passed in buf parameter is - * invalidated by this call. - * - * This function in no way validates the data in this buffer is actually - * a string, that characters are printable, or that there aren't multiple - * NULL terminators. It is assumed that the caller will either validate that - * themselves or has built this buffer with only a valid character set. - * - * \param[in] buf Initialized buffer object. Can not be a "const" buffer. - * \param[out] len Optional. Length of data returned, or NULL if not needed. - * \return pointer to unprocessed data or NULL on error. - */ -char *ares__buf_finish_str(ares__buf_t *buf, size_t *len); - -/*! Tag a position to save in the buffer in case parsing needs to rollback, - * such as if insufficient data is available, but more data may be added in - * the future. Only a single tag can be set per buffer object. Setting a - * tag will override any pre-existing tag. - * - * \param[in] buf Initialized buffer object - */ -void ares__buf_tag(ares__buf_t *buf); - -/*! Rollback to a tagged position. Will automatically clear the tag. - * - * \param[in] buf Initialized buffer object - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_tag_rollback(ares__buf_t *buf); - -/*! Clear the tagged position without rolling back. You should do this any - * time a tag is no longer needed as future append operations can reclaim - * buffer space. - * - * \param[in] buf Initialized buffer object - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_tag_clear(ares__buf_t *buf); - -/*! Fetch the buffer and length of data starting from the tagged position up - * to the _current_ position. It will not unset the tagged position. The - * data may be invalidated by any future ares__buf_*() calls. - * - * \param[in] buf Initialized buffer object - * \param[out] len Length between tag and current offset in buffer - * \return NULL on failure (such as no tag), otherwise pointer to start of - * buffer - */ -const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len); - -/*! Get the length of the current tag offset to the current position. - * - * \param[in] buf Initialized buffer object - * \return length - */ -size_t ares__buf_tag_length(const ares__buf_t *buf); - -/*! Fetch the bytes starting from the tagged position up to the _current_ - * position using the provided buffer. It will not unset the tagged position. - * - * \param[in] buf Initialized buffer object - * \param[in,out] bytes Buffer to hold data - * \param[in,out] len On input, buffer size, on output, bytes place in - * buffer. - * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size - */ -ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf, - unsigned char *bytes, size_t *len); - -/*! Fetch the bytes starting from the tagged position up to the _current_ - * position as a NULL-terminated string using the provided buffer. The data - * is validated to be ASCII-printable data. It will not unset the tagged - * poition. - * - * \param[in] buf Initialized buffer object - * \param[in,out] str Buffer to hold data - * \param[in] len On input, buffer size, on output, bytes place in - * buffer. - * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size, - * ARES_EBADSTR if not printable ASCII - */ -ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str, - size_t len); - -/*! Consume the given number of bytes without reading them. - * - * \param[in] buf Initialized buffer object - * \param[in] len Length to consume - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len); - -/*! Fetch a 16bit Big Endian number from the buffer. - * - * \param[in] buf Initialized buffer object - * \param[out] u16 Buffer to hold 16bit integer - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16); - -/*! Fetch a 32bit Big Endian number from the buffer. - * - * \param[in] buf Initialized buffer object - * \param[out] u32 Buffer to hold 32bit integer - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32); - - -/*! Fetch the requested number of bytes into the provided buffer - * - * \param[in] buf Initialized buffer object - * \param[out] bytes Buffer to hold data - * \param[in] len Requested number of bytes (must be > 0) - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes, - size_t len); - - -/*! Fetch the requested number of bytes and return a new buffer that must be - * ares_free()'d by the caller. - * - * \param[in] buf Initialized buffer object - * \param[in] len Requested number of bytes (must be > 0) - * \param[in] null_term Even though this is considered binary data, the user - * knows it may be a vald string, so add a null - * terminator. - * \param[out] bytes Pointer passed by reference. Will be allocated. - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len, - ares_bool_t null_term, - unsigned char **bytes); - -/*! Fetch the requested number of bytes and place them into the provided - * dest buffer object. - * - * \param[in] buf Initialized buffer object - * \param[out] dest Buffer object to append bytes. - * \param[in] len Requested number of bytes (must be > 0) - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf, - ares__buf_t *dest, size_t len); - -/*! Fetch the requested number of bytes and return a new buffer that must be - * ares_free()'d by the caller. The returned buffer is a null terminated - * string. - * - * \param[in] buf Initialized buffer object - * \param[in] len Requested number of bytes (must be > 0) - * \param[out] str Pointer passed by reference. Will be allocated. - * \return ARES_SUCCESS or one of the c-ares error codes - */ -ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str); - -/*! Consume whitespace characters (0x09, 0x0B, 0x0C, 0x0D, 0x20, and optionally - * 0x0A). - * - * \param[in] buf Initialized buffer object - * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, - * ARES_FALSE otherwise. - * \return number of whitespace characters consumed - */ -size_t ares__buf_consume_whitespace(ares__buf_t *buf, - ares_bool_t include_linefeed); - - -/*! Consume any non-whitespace character (anything other than 0x09, 0x0B, 0x0C, - * 0x0D, 0x20, and 0x0A). - * - * \param[in] buf Initialized buffer object - * \return number of characters consumed - */ -size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf); - - -/*! Consume until a character in the character set provided is reached. Does - * not include the character from the charset at the end. - * - * \param[in] buf Initialized buffer object - * \param[in] charset character set - * \param[in] len length of character set - * \param[in] require_charset require we find a character from the charset. - * if ARES_FALSE it will simply consume the - * rest of the buffer. If ARES_TRUE will return - * 0 if not found. - * \return number of characters consumed - */ -size_t ares__buf_consume_until_charset(ares__buf_t *buf, - const unsigned char *charset, size_t len, - ares_bool_t require_charset); - - -/*! Consume while the characters match the characters in the provided set. - * - * \param[in] buf Initialized buffer object - * \param[in] charset character set - * \param[in] len length of character set - * \return number of characters consumed - */ -size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset, - size_t len); - - -/*! Consume from the current position until the end of the line, and optionally - * the end of line character (0x0A) itself. - * - * \param[in] buf Initialized buffer object - * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, - * ARES_FALSE otherwise. - * \return number of characters consumed - */ -size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed); - -typedef enum { - /*! No flags */ - ARES_BUF_SPLIT_NONE = 0, - /*! The delimiter will be the first character in the buffer, except the - * first buffer since the start doesn't have a delimiter. This option is - * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always - * the first character. - */ - ARES_BUF_SPLIT_DONT_CONSUME_DELIMS = 1 << 0, - /*! Allow blank sections, by default blank sections are not emitted. If using - * ARES_BUF_SPLIT_DONT_CONSUME_DELIMS, the delimiter is not counted as part - * of the section */ - ARES_BUF_SPLIT_ALLOW_BLANK = 1 << 1, - /*! Remove duplicate entries */ - ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2, - /*! Perform case-insensitive matching when comparing values */ - ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3, - /*! Trim leading whitespace from buffer */ - ARES_BUF_SPLIT_LTRIM = 1 << 4, - /*! Trim trailing whitespace from buffer */ - ARES_BUF_SPLIT_RTRIM = 1 << 5, - /*! Trim leading and trailing whitespace from buffer */ - ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM) -} ares__buf_split_t; - -/*! Split the provided buffer into multiple sub-buffers stored in the variable - * pointed to by the linked list. The sub buffers are const buffers pointing - * into the buf provided. - * - * \param[in] buf Initialized buffer object - * \param[in] delims Possible delimiters - * \param[in] delims_len Length of possible delimiters - * \param[in] flags One more more flags - * \param[in] max_sections Maximum number of sections. Use 0 for - * unlimited. Useful for splitting key/value - * pairs where the delimiter may be a valid - * character in the value. A value of 1 would - * have little usefulness and would effectively - * ignore the delimiter itself. - * \param[out] list Result. Depending on flags, this may be a - * valid list with no elements. Use - * ares__llist_destroy() to free the memory which - * will also free the contained ares__buf_t - * objects. - * \return ARES_SUCCESS on success, or error like ARES_ENOMEM. - */ -ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims, - size_t delims_len, ares__buf_split_t flags, - size_t max_sections, ares__llist_t **list); - - -/*! Check the unprocessed buffer to see if it begins with the sequence of - * characters provided. - * - * \param[in] buf Initialized buffer object - * \param[in] data Bytes of data to compare. - * \param[in] data_len Length of data to compare. - * \return ARES_TRUE on match, ARES_FALSE otherwise. - */ -ares_bool_t ares__buf_begins_with(const ares__buf_t *buf, - const unsigned char *data, size_t data_len); - - -/*! Size of unprocessed remaining data length - * - * \param[in] buf Initialized buffer object - * \return length remaining - */ -size_t ares__buf_len(const ares__buf_t *buf); - -/*! Retrieve a pointer to the currently unprocessed data. Generally this isn't - * recommended to be used in practice. The returned pointer may be invalidated - * by any future ares__buf_*() calls. - * - * \param[in] buf Initialized buffer object - * \param[out] len Length of available data - * \return Pointer to buffer of unprocessed data - */ -const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len); - - -/*! Wipe any processed data from the beginning of the buffer. This will - * move any remaining data to the front of the internally allocated buffer. - * - * Can not be used on const buffer objects. - * - * Typically not needed to call, as any new append operation will automatically - * call this function if there is insufficient space to append the data in - * order to try to avoid another memory allocation. - * - * It may be useful to call in order to ensure the current message being - * processed is in the beginning of the buffer if there is an intent to use - * ares__buf_set_position() and ares__buf_get_position() as may be necessary - * when processing DNS compressed names. - * - * If there is an active tag, it will NOT clear the tag, it will use the tag - * as the start of the unprocessed data rather than the current offset. If - * a prior tag is no longer needed, may be wise to call ares__buf_tag_clear(). - * - * \param[in] buf Initialized buffer object - */ -void ares__buf_reclaim(ares__buf_t *buf); - -/*! Set the current offset within the internal buffer. - * - * Typically this should not be used, if possible, use the ares__buf_tag*() - * operations instead. - * - * One exception is DNS name compression which may backwards reference to - * an index in the message. It may be necessary in such a case to call - * ares__buf_reclaim() if using a dynamic (non-const) buffer before processing - * such a message. - * - * \param[in] buf Initialized buffer object - * \param[in] idx Index to set position - * \return ARES_SUCCESS if valid index - */ -ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx); - -/*! Get the current offset within the internal buffer. - * - * Typically this should not be used, if possible, use the ares__buf_tag*() - * operations instead. - * - * This can be used to get the current position, useful for saving if a - * jump via ares__buf_set_position() is performed and need to restore the - * current position for future operations. - * - * \param[in] buf Initialized buffer object - * \return index of current position - */ -size_t ares__buf_get_position(const ares__buf_t *buf); - -/*! Parse a character-string as defined in RFC1035, as a null-terminated - * string. - * - * \param[in] buf initialized buffer object - * \param[in] remaining_len maximum length that should be used for parsing - * the string, this is often less than the remaining - * buffer and is based on the RR record length. - * \param[out] name Pointer passed by reference to be filled in with - * allocated string of the parsed that must be - * ares_free()'d by the caller. - * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple - * strings back to back, and will concatenate in - * the returned str. - * \return ARES_SUCCESS on success - */ -ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len, - char **name, ares_bool_t allow_multiple); - -/*! Parse a character-string as defined in RFC1035, as binary, however for - * convenience this does guarantee a NULL terminator (that is not included - * in the returned length). - * - * \param[in] buf initialized buffer object - * \param[in] remaining_len maximum length that should be used for parsing - * the string, this is often less than the remaining - * buffer and is based on the RR record length. - * \param[out] bin Pointer passed by reference to be filled in with - * allocated string of the parsed that must be - * ares_free()'d by the caller. - * \param[out] bin_len Length of returned string. - * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple - * strings back to back, and will concatenate in - * the returned str. - * \return ARES_SUCCESS on success - */ -ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len, - unsigned char **bin, size_t *bin_len, - ares_bool_t allow_multiple); - -/*! Load data from specified file path into provided buffer. The entire file - * is loaded into memory. - * - * \param[in] filename complete path to file - * \param[in,out] buf Initialized (non-const) buffer object to load data - * into - * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading - * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success. - */ -ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf); - -/*! @} */ - -#endif /* __ARES__BUF_H */ diff --git a/deps/cares/src/lib/ares__close_sockets.c b/deps/cares/src/lib/ares__close_sockets.c deleted file mode 100644 index 3aba9f649eeae5..00000000000000 --- a/deps/cares/src/lib/ares__close_sockets.c +++ /dev/null @@ -1,111 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" -#include <assert.h> - -static void ares__requeue_queries(struct server_connection *conn) -{ - struct query *query; - struct timeval now = ares__tvnow(); - - while ((query = ares__llist_first_val(conn->queries_to_conn)) != NULL) { - ares__requeue_query(query, &now); - } -} - -void ares__close_connection(struct server_connection *conn) -{ - struct server_state *server = conn->server; - ares_channel_t *channel = server->channel; - - /* Unlink */ - ares__llist_node_claim( - ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd)); - ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd); - - if (conn->is_tcp) { - /* Reset any existing input and output buffer. */ - ares__buf_consume(server->tcp_parser, ares__buf_len(server->tcp_parser)); - ares__buf_consume(server->tcp_send, ares__buf_len(server->tcp_send)); - server->tcp_conn = NULL; - } - - /* Requeue queries to other connections */ - ares__requeue_queries(conn); - - ares__llist_destroy(conn->queries_to_conn); - - SOCK_STATE_CALLBACK(channel, conn->fd, 0, 0); - ares__close_socket(channel, conn->fd); - - ares_free(conn); -} - -void ares__close_sockets(struct server_state *server) -{ - ares__llist_node_t *node; - - while ((node = ares__llist_node_first(server->connections)) != NULL) { - struct server_connection *conn = ares__llist_node_val(node); - ares__close_connection(conn); - } -} - -void ares__check_cleanup_conn(const ares_channel_t *channel, - struct server_connection *conn) -{ - ares_bool_t do_cleanup = ARES_FALSE; - - if (channel == NULL || conn == NULL) { - return; - } - - if (ares__llist_len(conn->queries_to_conn)) { - return; - } - - /* If we are configured not to stay open, close it out */ - if (!(channel->flags & ARES_FLAG_STAYOPEN)) { - do_cleanup = ARES_TRUE; - } - - /* If the udp connection hit its max queries, always close it */ - if (!conn->is_tcp && channel->udp_max_queries > 0 && - conn->total_queries >= channel->udp_max_queries) { - do_cleanup = ARES_TRUE; - } - - if (!do_cleanup) { - return; - } - - ares__close_connection(conn); -} diff --git a/deps/cares/src/lib/ares__hosts_file.c b/deps/cares/src/lib/ares__hosts_file.c deleted file mode 100644 index e279623de37e64..00000000000000 --- a/deps/cares/src/lib/ares__hosts_file.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif -#include <time.h> -#include "ares_platform.h" - -/* HOSTS FILE PROCESSING OVERVIEW - * ============================== - * The hosts file on the system contains static entries to be processed locally - * rather than querying the nameserver. Each row is an IP address followed by - * a list of space delimited hostnames that match the ip address. This is used - * for both forward and reverse lookups. - * - * We are caching the entire parsed hosts file for performance reasons. Some - * files may be quite sizable and as per Issue #458 can approach 1/2MB in size, - * and the parse overhead on a rapid succession of queries can be quite large. - * The entries are stored in forwards and backwards hashtables so we can get - * O(1) performance on lookup. The file is cached until the file modification - * timestamp changes. - * - * The hosts file processing is quite unique. It has to merge all related hosts - * and ips into a single entry due to file formatting requirements. For - * instance take the below: - * - * 127.0.0.1 localhost.localdomain localhost - * ::1 localhost.localdomain localhost - * 192.168.1.1 host.example.com host - * 192.168.1.5 host.example.com host - * 2620:1234::1 host.example.com host6.example.com host6 host - * - * This will yield 2 entries. - * 1) ips: 127.0.0.1,::1 - * hosts: localhost.localdomain,localhost - * 2) ips: 192.168.1.1,192.168.1.5,2620:1234::1 - * hosts: host.example.com,host,host6.example.com,host6 - * - * It could be argued that if searching for 192.168.1.1 that the 'host6' - * hostnames should not be returned, but this implementation will return them - * since they are related. It is unlikely this will matter in the real world. - */ - -struct ares_hosts_file { - time_t ts; - /*! cache the filename so we know if the filename changes it automatically - * invalidates the cache */ - char *filename; - /*! iphash is the owner of the 'entry' object as there is only ever a single - * match to the object. */ - ares__htable_strvp_t *iphash; - /*! hosthash does not own the entry so won't free on destruction */ - ares__htable_strvp_t *hosthash; -}; - -struct ares_hosts_entry { - size_t refcnt; /*! If the entry is stored multiple times in the - * ip address hash, we have to reference count it */ - ares__llist_t *ips; - ares__llist_t *hosts; -}; - -const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr, - size_t *out_len) -{ - const void *ptr = NULL; - size_t ptr_len = 0; - - if (ipaddr == NULL || addr == NULL || out_len == NULL) { - return NULL; - } - - *out_len = 0; - - if (addr->family == AF_INET && - ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { - ptr = &addr->addr.addr4; - ptr_len = sizeof(addr->addr.addr4); - } else if (addr->family == AF_INET6 && - ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { - ptr = &addr->addr.addr6; - ptr_len = sizeof(addr->addr.addr6); - } else if (addr->family == AF_UNSPEC) { - if (ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { - addr->family = AF_INET; - ptr = &addr->addr.addr4; - ptr_len = sizeof(addr->addr.addr4); - } else if (ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { - addr->family = AF_INET6; - ptr = &addr->addr.addr6; - ptr_len = sizeof(addr->addr.addr6); - } - } - - *out_len = ptr_len; - return ptr; -} - -static ares_bool_t ares__normalize_ipaddr(const char *ipaddr, char *out, - size_t out_len) -{ - struct ares_addr data; - const void *addr; - size_t addr_len = 0; - - memset(&data, 0, sizeof(data)); - data.family = AF_UNSPEC; - - addr = ares_dns_pton(ipaddr, &data, &addr_len); - if (addr == NULL) { - return ARES_FALSE; - } - - if (!ares_inet_ntop(data.family, addr, out, (ares_socklen_t)out_len)) { - return ARES_FALSE; - } - - return ARES_TRUE; -} - -static void ares__hosts_entry_destroy(ares_hosts_entry_t *entry) -{ - if (entry == NULL) { - return; - } - - /* Honor reference counting */ - if (entry->refcnt != 0) { - entry->refcnt--; - } - - if (entry->refcnt > 0) { - return; - } - - ares__llist_destroy(entry->hosts); - ares__llist_destroy(entry->ips); - ares_free(entry); -} - -static void ares__hosts_entry_destroy_cb(void *entry) -{ - ares__hosts_entry_destroy(entry); -} - -void ares__hosts_file_destroy(ares_hosts_file_t *hf) -{ - if (hf == NULL) { - return; - } - - ares_free(hf->filename); - ares__htable_strvp_destroy(hf->hosthash); - ares__htable_strvp_destroy(hf->iphash); - ares_free(hf); -} - -static ares_hosts_file_t *ares__hosts_file_create(const char *filename) -{ - ares_hosts_file_t *hf = ares_malloc_zero(sizeof(*hf)); - if (hf == NULL) { - goto fail; - } - - hf->ts = time(NULL); - - hf->filename = ares_strdup(filename); - if (hf->filename == NULL) { - goto fail; - } - - hf->iphash = ares__htable_strvp_create(ares__hosts_entry_destroy_cb); - if (hf->iphash == NULL) { - goto fail; - } - - hf->hosthash = ares__htable_strvp_create(NULL); - if (hf->hosthash == NULL) { - goto fail; - } - - return hf; - -fail: - ares__hosts_file_destroy(hf); - return NULL; -} - -typedef enum { - ARES_MATCH_NONE = 0, - ARES_MATCH_IPADDR = 1, - ARES_MATCH_HOST = 2 -} ares_hosts_file_match_t; - -static ares_status_t ares__hosts_file_merge_entry( - const ares_hosts_file_t *hf, ares_hosts_entry_t *existing, - ares_hosts_entry_t *entry, ares_hosts_file_match_t matchtype) -{ - ares__llist_node_t *node; - - /* If we matched on IP address, we know there can only be 1, so there's no - * reason to do anything */ - if (matchtype != ARES_MATCH_IPADDR) { - while ((node = ares__llist_node_first(entry->ips)) != NULL) { - const char *ipaddr = ares__llist_node_val(node); - - if (ares__htable_strvp_get_direct(hf->iphash, ipaddr) != NULL) { - ares__llist_node_destroy(node); - continue; - } - - ares__llist_node_move_parent_last(node, existing->ips); - } - } - - - while ((node = ares__llist_node_first(entry->hosts)) != NULL) { - const char *hostname = ares__llist_node_val(node); - - if (ares__htable_strvp_get_direct(hf->hosthash, hostname) != NULL) { - ares__llist_node_destroy(node); - continue; - } - - ares__llist_node_move_parent_last(node, existing->hosts); - } - - ares__hosts_entry_destroy(entry); - return ARES_SUCCESS; -} - -static ares_hosts_file_match_t - ares__hosts_file_match(const ares_hosts_file_t *hf, ares_hosts_entry_t *entry, - ares_hosts_entry_t **match) -{ - ares__llist_node_t *node; - *match = NULL; - - for (node = ares__llist_node_first(entry->ips); node != NULL; - node = ares__llist_node_next(node)) { - const char *ipaddr = ares__llist_node_val(node); - *match = ares__htable_strvp_get_direct(hf->iphash, ipaddr); - if (*match != NULL) { - return ARES_MATCH_IPADDR; - } - } - - for (node = ares__llist_node_first(entry->hosts); node != NULL; - node = ares__llist_node_next(node)) { - const char *host = ares__llist_node_val(node); - *match = ares__htable_strvp_get_direct(hf->hosthash, host); - if (*match != NULL) { - return ARES_MATCH_HOST; - } - } - - return ARES_MATCH_NONE; -} - -/*! entry is invalidated upon calling this function, always, even on error */ -static ares_status_t ares__hosts_file_add(ares_hosts_file_t *hosts, - ares_hosts_entry_t *entry) -{ - ares_hosts_entry_t *match = NULL; - ares_status_t status = ARES_SUCCESS; - ares__llist_node_t *node; - ares_hosts_file_match_t matchtype; - size_t num_hostnames; - - /* Record the number of hostnames in this entry file. If we merge into an - * existing record, these will be *appended* to the entry, so we'll count - * backwards when adding to the hosts hashtable */ - num_hostnames = ares__llist_len(entry->hosts); - - matchtype = ares__hosts_file_match(hosts, entry, &match); - - if (matchtype != ARES_MATCH_NONE) { - status = ares__hosts_file_merge_entry(hosts, match, entry, matchtype); - if (status != ARES_SUCCESS) { - ares__hosts_entry_destroy(entry); - return status; - } - /* entry was invalidated above by merging */ - entry = match; - } - - if (matchtype != ARES_MATCH_IPADDR) { - const char *ipaddr = ares__llist_last_val(entry->ips); - - if (!ares__htable_strvp_get(hosts->iphash, ipaddr, NULL)) { - if (!ares__htable_strvp_insert(hosts->iphash, ipaddr, entry)) { - ares__hosts_entry_destroy(entry); - return ARES_ENOMEM; - } - entry->refcnt++; - } - } - - /* Go backwards, on a merge, hostnames are appended. Breakout once we've - * consumed all the hosts that we appended */ - for (node = ares__llist_node_last(entry->hosts); node != NULL; - node = ares__llist_node_prev(node)) { - const char *val = ares__llist_node_val(node); - - if (num_hostnames == 0) { - break; - } - - num_hostnames--; - - /* first hostname match wins. If we detect a duplicate hostname for another - * ip it will automatically be added to the same entry */ - if (ares__htable_strvp_get(hosts->hosthash, val, NULL)) { - continue; - } - - if (!ares__htable_strvp_insert(hosts->hosthash, val, entry)) { - return ARES_ENOMEM; - } - } - - return ARES_SUCCESS; -} - -static ares_bool_t ares__hosts_entry_isdup(ares_hosts_entry_t *entry, - const char *host) -{ - ares__llist_node_t *node; - - for (node = ares__llist_node_first(entry->ips); node != NULL; - node = ares__llist_node_next(node)) { - const char *myhost = ares__llist_node_val(node); - if (strcasecmp(myhost, host) == 0) { - return ARES_TRUE; - } - } - - return ARES_FALSE; -} - -static ares_status_t ares__parse_hosts_hostnames(ares__buf_t *buf, - ares_hosts_entry_t *entry) -{ - entry->hosts = ares__llist_create(ares_free); - if (entry->hosts == NULL) { - return ARES_ENOMEM; - } - - /* Parse hostnames and aliases */ - while (ares__buf_len(buf)) { - char hostname[256]; - char *temp; - ares_status_t status; - unsigned char comment = '#'; - - ares__buf_consume_whitespace(buf, ARES_FALSE); - - if (ares__buf_len(buf) == 0) { - break; - } - - /* See if it is a comment, if so stop processing */ - if (ares__buf_begins_with(buf, &comment, 1)) { - break; - } - - ares__buf_tag(buf); - - /* Must be at end of line */ - if (ares__buf_consume_nonwhitespace(buf) == 0) { - break; - } - - status = ares__buf_tag_fetch_string(buf, hostname, sizeof(hostname)); - if (status != ARES_SUCCESS) { - /* Bad entry, just ignore as long as its not the first. If its the first, - * it must be valid */ - if (ares__llist_len(entry->hosts) == 0) { - return ARES_EBADSTR; - } - - continue; - } - - /* Validate it is a valid hostname characterset */ - if (!ares__is_hostname(hostname)) { - continue; - } - - /* Don't add a duplicate to the same entry */ - if (ares__hosts_entry_isdup(entry, hostname)) { - continue; - } - - /* Add to list */ - temp = ares_strdup(hostname); - if (temp == NULL) { - return ARES_ENOMEM; - } - - if (ares__llist_insert_last(entry->hosts, temp) == NULL) { - ares_free(temp); - return ARES_ENOMEM; - } - } - - /* Must have at least 1 entry */ - if (ares__llist_len(entry->hosts) == 0) { - return ARES_EBADSTR; - } - - return ARES_SUCCESS; -} - -static ares_status_t ares__parse_hosts_ipaddr(ares__buf_t *buf, - ares_hosts_entry_t **entry_out) -{ - char addr[INET6_ADDRSTRLEN]; - char *temp; - ares_hosts_entry_t *entry = NULL; - ares_status_t status; - - *entry_out = NULL; - - ares__buf_tag(buf); - ares__buf_consume_nonwhitespace(buf); - status = ares__buf_tag_fetch_string(buf, addr, sizeof(addr)); - if (status != ARES_SUCCESS) { - return status; - } - - /* Validate and normalize the ip address format */ - if (!ares__normalize_ipaddr(addr, addr, sizeof(addr))) { - return ARES_EBADSTR; - } - - entry = ares_malloc_zero(sizeof(*entry)); - if (entry == NULL) { - return ARES_ENOMEM; - } - - entry->ips = ares__llist_create(ares_free); - if (entry->ips == NULL) { - ares__hosts_entry_destroy(entry); - return ARES_ENOMEM; - } - - temp = ares_strdup(addr); - if (temp == NULL) { - ares__hosts_entry_destroy(entry); - return ARES_ENOMEM; - } - - if (ares__llist_insert_first(entry->ips, temp) == NULL) { - ares_free(temp); - ares__hosts_entry_destroy(entry); - return ARES_ENOMEM; - } - - *entry_out = entry; - - return ARES_SUCCESS; -} - -static ares_status_t ares__parse_hosts(const char *filename, - ares_hosts_file_t **out) -{ - ares__buf_t *buf = NULL; - ares_status_t status = ARES_EBADRESP; - ares_hosts_file_t *hf = NULL; - ares_hosts_entry_t *entry = NULL; - - *out = NULL; - - buf = ares__buf_create(); - if (buf == NULL) { - status = ARES_ENOMEM; - goto done; - } - - status = ares__buf_load_file(filename, buf); - if (status != ARES_SUCCESS) { - goto done; - } - - hf = ares__hosts_file_create(filename); - if (hf == NULL) { - status = ARES_ENOMEM; - goto done; - } - - while (ares__buf_len(buf)) { - unsigned char comment = '#'; - - /* -- Start of new line here -- */ - - /* Consume any leading whitespace */ - ares__buf_consume_whitespace(buf, ARES_FALSE); - - if (ares__buf_len(buf) == 0) { - break; - } - - /* See if it is a comment, if so, consume remaining line */ - if (ares__buf_begins_with(buf, &comment, 1)) { - ares__buf_consume_line(buf, ARES_TRUE); - continue; - } - - /* Pull off ip address */ - status = ares__parse_hosts_ipaddr(buf, &entry); - if (status == ARES_ENOMEM) { - goto done; - } - if (status != ARES_SUCCESS) { - /* Bad line, consume and go onto next */ - ares__buf_consume_line(buf, ARES_TRUE); - continue; - } - - /* Parse of the hostnames */ - status = ares__parse_hosts_hostnames(buf, entry); - if (status == ARES_ENOMEM) { - goto done; - } else if (status != ARES_SUCCESS) { - /* Bad line, consume and go onto next */ - ares__hosts_entry_destroy(entry); - entry = NULL; - ares__buf_consume_line(buf, ARES_TRUE); - continue; - } - - /* Append the successful entry to the hosts file */ - status = ares__hosts_file_add(hf, entry); - entry = NULL; /* is always invalidated by this function, even on error */ - if (status != ARES_SUCCESS) { - goto done; - } - - /* Go to next line */ - ares__buf_consume_line(buf, ARES_TRUE); - } - - status = ARES_SUCCESS; - -done: - ares__hosts_entry_destroy(entry); - ares__buf_destroy(buf); - if (status != ARES_SUCCESS) { - ares__hosts_file_destroy(hf); - } else { - *out = hf; - } - return status; -} - -static ares_bool_t ares__hosts_expired(const char *filename, - const ares_hosts_file_t *hf) -{ - time_t mod_ts = 0; - -#ifdef HAVE_STAT - struct stat st; - if (stat(filename, &st) == 0) { - mod_ts = st.st_mtime; - } -#elif defined(_WIN32) - struct _stat st; - if (_stat(filename, &st) == 0) { - mod_ts = st.st_mtime; - } -#else - (void)filename; -#endif - - if (hf == NULL) { - return ARES_TRUE; - } - - /* Expire every 60s if we can't get a time */ - if (mod_ts == 0) { - mod_ts = time(NULL) - 60; - } - - /* If filenames are different, its expired */ - if (strcasecmp(hf->filename, filename) != 0) { - return ARES_TRUE; - } - - if (hf->ts <= mod_ts) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -static ares_status_t ares__hosts_path(const ares_channel_t *channel, - ares_bool_t use_env, char **path) -{ - char *path_hosts = NULL; - - *path = NULL; - - if (channel->hosts_path) { - path_hosts = ares_strdup(channel->hosts_path); - if (!path_hosts) { - return ARES_ENOMEM; - } - } - - if (use_env) { - if (path_hosts) { - ares_free(path_hosts); - } - - path_hosts = ares_strdup(getenv("CARES_HOSTS")); - if (!path_hosts) { - return ARES_ENOMEM; - } - } - - if (!path_hosts) { -#ifdef WIN32 - char PATH_HOSTS[MAX_PATH] = ""; - char tmp[MAX_PATH]; - HKEY hkeyHosts; - DWORD dwLength = sizeof(tmp); - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, - &hkeyHosts) != ERROR_SUCCESS) { - return ARES_ENOTFOUND; - } - RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, - &dwLength); - ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); - RegCloseKey(hkeyHosts); - strcat(PATH_HOSTS, WIN_PATH_HOSTS); -#elif defined(WATT32) - const char *PATH_HOSTS = _w32_GetHostsFile(); - - if (!PATH_HOSTS) { - return ARES_ENOTFOUND; - } -#endif - path_hosts = ares_strdup(PATH_HOSTS); - if (!path_hosts) { - return ARES_ENOMEM; - } - } - - *path = path_hosts; - return ARES_SUCCESS; -} - -static ares_status_t ares__hosts_update(ares_channel_t *channel, - ares_bool_t use_env) -{ - ares_status_t status; - char *filename = NULL; - - status = ares__hosts_path(channel, use_env, &filename); - if (status != ARES_SUCCESS) { - return status; - } - - if (!ares__hosts_expired(filename, channel->hf)) { - ares_free(filename); - return ARES_SUCCESS; - } - - ares__hosts_file_destroy(channel->hf); - channel->hf = NULL; - - status = ares__parse_hosts(filename, &channel->hf); - ares_free(filename); - return status; -} - -ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel, - ares_bool_t use_env, const char *ipaddr, - const ares_hosts_entry_t **entry) -{ - ares_status_t status; - char addr[INET6_ADDRSTRLEN]; - - *entry = NULL; - - status = ares__hosts_update(channel, use_env); - if (status != ARES_SUCCESS) { - return status; - } - - if (channel->hf == NULL) { - return ARES_ENOTFOUND; - } - - if (!ares__normalize_ipaddr(ipaddr, addr, sizeof(addr))) { - return ARES_EBADNAME; - } - - *entry = ares__htable_strvp_get_direct(channel->hf->iphash, addr); - if (*entry == NULL) { - return ARES_ENOTFOUND; - } - - return ARES_SUCCESS; -} - -ares_status_t ares__hosts_search_host(ares_channel_t *channel, - ares_bool_t use_env, const char *host, - const ares_hosts_entry_t **entry) -{ - ares_status_t status; - - *entry = NULL; - - status = ares__hosts_update(channel, use_env); - if (status != ARES_SUCCESS) { - return status; - } - - if (channel->hf == NULL) { - return ARES_ENOTFOUND; - } - - *entry = ares__htable_strvp_get_direct(channel->hf->hosthash, host); - if (*entry == NULL) { - return ARES_ENOTFOUND; - } - - return ARES_SUCCESS; -} - -ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry, - int family, struct hostent **hostent) -{ - ares_status_t status; - size_t naliases; - ares__llist_node_t *node; - size_t idx; - - *hostent = ares_malloc_zero(sizeof(**hostent)); - if (*hostent == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family; - - /* Copy IP addresses that match the address family */ - idx = 0; - for (node = ares__llist_node_first(entry->ips); node != NULL; - node = ares__llist_node_next(node)) { - struct ares_addr addr; - const void *ptr = NULL; - size_t ptr_len = 0; - const char *ipaddr = ares__llist_node_val(node); - char **temp = NULL; - - memset(&addr, 0, sizeof(addr)); - - addr.family = family; - ptr = ares_dns_pton(ipaddr, &addr, &ptr_len); - if (ptr == NULL) { - continue; - } - - /* If family == AF_UNSPEC, then we want to inherit this for future - * conversions as we can only support a single address class */ - if (family == AF_UNSPEC) { - family = addr.family; - (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)addr.family; - } - - temp = ares_realloc_zero((*hostent)->h_addr_list, - (idx + 1) * sizeof(*(*hostent)->h_addr_list), - (idx + 2) * sizeof(*(*hostent)->h_addr_list)); - if (temp == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - (*hostent)->h_addr_list = temp; - - (*hostent)->h_addr_list[idx] = ares_malloc(ptr_len); - if ((*hostent)->h_addr_list[idx] == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - memcpy((*hostent)->h_addr_list[idx], ptr, ptr_len); - idx++; - (*hostent)->h_length = (HOSTENT_LENGTH_TYPE)ptr_len; - } - - /* entry didn't match address class */ - if (idx == 0) { - status = ARES_ENOTFOUND; - goto fail; - } - - /* Copy main hostname */ - (*hostent)->h_name = ares_strdup(ares__llist_first_val(entry->hosts)); - if ((*hostent)->h_name == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - /* Copy aliases */ - naliases = ares__llist_len(entry->hosts) - 1; - - /* Cap at 100, some people use https://github.com/StevenBlack/hosts and we - * don't need 200k+ aliases */ - if (naliases > 100) { - naliases = 100; - } - - (*hostent)->h_aliases = - ares_malloc_zero((naliases + 1) * sizeof(*(*hostent)->h_aliases)); - if ((*hostent)->h_aliases == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - /* Copy all entries to the alias except the first */ - idx = 0; - node = ares__llist_node_first(entry->hosts); - node = ares__llist_node_next(node); - while (node != NULL) { - (*hostent)->h_aliases[idx] = ares_strdup(ares__llist_node_val(node)); - if ((*hostent)->h_aliases[idx] == NULL) { - status = ARES_ENOMEM; - goto fail; - } - idx++; - - /* Break out if artificially capped */ - if (idx == naliases) { - break; - } - node = ares__llist_node_next(node); - } - - return ARES_SUCCESS; - -fail: - ares_free_hostent(*hostent); - *hostent = NULL; - return status; -} - -static ares_status_t - ares__hosts_ai_append_cnames(const ares_hosts_entry_t *entry, - struct ares_addrinfo_cname **cnames_out) -{ - struct ares_addrinfo_cname *cname = NULL; - struct ares_addrinfo_cname *cnames = NULL; - const char *primaryhost; - ares__llist_node_t *node; - ares_status_t status; - size_t cnt = 0; - - node = ares__llist_node_first(entry->hosts); - primaryhost = ares__llist_node_val(node); - /* Skip to next node to start with aliases */ - node = ares__llist_node_next(node); - - while (node != NULL) { - const char *host = ares__llist_node_val(node); - - /* Cap at 100 entries. , some people use - * https://github.com/StevenBlack/hosts and we don't need 200k+ aliases */ - cnt++; - if (cnt > 100) { - break; - } - - cname = ares__append_addrinfo_cname(&cnames); - if (cname == NULL) { - status = ARES_ENOMEM; - goto done; - } - - cname->alias = ares_strdup(host); - if (cname->alias == NULL) { - status = ARES_ENOMEM; - goto done; - } - - cname->name = ares_strdup(primaryhost); - if (cname->name == NULL) { - status = ARES_ENOMEM; - goto done; - } - - node = ares__llist_node_next(node); - } - - /* No entries, add only primary */ - if (cnames == NULL) { - cname = ares__append_addrinfo_cname(&cnames); - if (cname == NULL) { - status = ARES_ENOMEM; - goto done; - } - - cname->name = ares_strdup(primaryhost); - if (cname->name == NULL) { - status = ARES_ENOMEM; - goto done; - } - } - status = ARES_SUCCESS; - -done: - if (status != ARES_SUCCESS) { - ares__freeaddrinfo_cnames(cnames); - return status; - } - - *cnames_out = cnames; - return ARES_SUCCESS; -} - -ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, - const char *name, int family, - unsigned short port, - ares_bool_t want_cnames, - struct ares_addrinfo *ai) -{ - ares_status_t status; - struct ares_addrinfo_cname *cnames = NULL; - struct ares_addrinfo_node *ainodes = NULL; - ares__llist_node_t *node; - - switch (family) { - case AF_INET: - case AF_INET6: - case AF_UNSPEC: - break; - default: - return ARES_EBADFAMILY; - } - - ai->name = ares_strdup(name); - if (ai->name == NULL) { - status = ARES_ENOMEM; - goto done; - } - - for (node = ares__llist_node_first(entry->ips); node != NULL; - node = ares__llist_node_next(node)) { - struct ares_addr addr; - const void *ptr = NULL; - size_t ptr_len = 0; - const char *ipaddr = ares__llist_node_val(node); - - memset(&addr, 0, sizeof(addr)); - addr.family = family; - ptr = ares_dns_pton(ipaddr, &addr, &ptr_len); - - if (ptr == NULL) { - continue; - } - - status = ares_append_ai_node(addr.family, port, 0, ptr, &ainodes); - if (status != ARES_SUCCESS) { - goto done; - } - } - - if (want_cnames) { - status = ares__hosts_ai_append_cnames(entry, &cnames); - if (status != ARES_SUCCESS) { - goto done; - } - } - - status = ARES_SUCCESS; - -done: - if (status != ARES_SUCCESS) { - ares__freeaddrinfo_cnames(cnames); - ares__freeaddrinfo_nodes(ainodes); - ares_free(ai->name); - ai->name = NULL; - return status; - } - ares__addrinfo_cat_cnames(&ai->cnames, cnames); - ares__addrinfo_cat_nodes(&ai->nodes, ainodes); - - return status; -} diff --git a/deps/cares/src/lib/ares__htable.c b/deps/cares/src/lib/ares__htable.c deleted file mode 100644 index 7aaf2d2089b231..00000000000000 --- a/deps/cares/src/lib/ares__htable.c +++ /dev/null @@ -1,446 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__llist.h" -#include "ares__htable.h" - -#define ARES__HTABLE_MAX_BUCKETS (1U << 24) -#define ARES__HTABLE_MIN_BUCKETS (1U << 4) -#define ARES__HTABLE_EXPAND_PERCENT 75 - -struct ares__htable { - ares__htable_hashfunc_t hash; - ares__htable_bucket_key_t bucket_key; - ares__htable_bucket_free_t bucket_free; - ares__htable_key_eq_t key_eq; - unsigned int seed; - unsigned int size; - size_t num_keys; - size_t num_collisions; - /* NOTE: if we converted buckets into ares__slist_t we could guarantee on - * hash collisions we would have O(log n) worst case insert and search - * performance. (We'd also need to make key_eq into a key_cmp to - * support sort). That said, risk with a random hash seed is near zero, - * and ares__slist_t is heavier weight, so I think using ares__llist_t - * is an overall win. */ - ares__llist_t **buckets; -}; - -static unsigned int ares__htable_generate_seed(ares__htable_t *htable) -{ - unsigned int seed = 0; - time_t t = time(NULL); - - /* Mix stack address, heap address, and time to generate a random seed, it - * doesn't have to be super secure, just quick. Likelihood of a hash - * collision attack is very low with a small amount of effort */ - seed |= (unsigned int)((size_t)htable & 0xFFFFFFFF); - seed |= (unsigned int)((size_t)&seed & 0xFFFFFFFF); - seed |= (unsigned int)(t & 0xFFFFFFFF); - return seed; -} - -static void ares__htable_buckets_destroy(ares__llist_t **buckets, - unsigned int size, - ares_bool_t destroy_vals) -{ - unsigned int i; - - if (buckets == NULL) { - return; - } - - for (i = 0; i < size; i++) { - if (buckets[i] == NULL) { - continue; - } - - if (!destroy_vals) { - ares__llist_replace_destructor(buckets[i], NULL); - } - - ares__llist_destroy(buckets[i]); - } - - ares_free(buckets); -} - -void ares__htable_destroy(ares__htable_t *htable) -{ - if (htable == NULL) { - return; - } - ares__htable_buckets_destroy(htable->buckets, htable->size, ARES_TRUE); - ares_free(htable); -} - -ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, - ares__htable_bucket_key_t bucket_key, - ares__htable_bucket_free_t bucket_free, - ares__htable_key_eq_t key_eq) -{ - ares__htable_t *htable = NULL; - - if (hash_func == NULL || bucket_key == NULL || bucket_free == NULL || - key_eq == NULL) { - goto fail; - } - - htable = ares_malloc_zero(sizeof(*htable)); - if (htable == NULL) { - goto fail; - } - - htable->hash = hash_func; - htable->bucket_key = bucket_key; - htable->bucket_free = bucket_free; - htable->key_eq = key_eq; - htable->seed = ares__htable_generate_seed(htable); - htable->size = ARES__HTABLE_MIN_BUCKETS; - htable->buckets = ares_malloc_zero(sizeof(*htable->buckets) * htable->size); - - if (htable->buckets == NULL) { - goto fail; - } - - return htable; - -fail: - ares__htable_destroy(htable); - return NULL; -} - -const void **ares__htable_all_buckets(const ares__htable_t *htable, size_t *num) -{ - const void **out = NULL; - size_t cnt = 0; - size_t i; - - if (htable == NULL || num == NULL) { - return NULL; - } - - *num = 0; - - out = ares_malloc_zero(sizeof(*out) * htable->num_keys); - if (out == NULL) { - return NULL; - } - - for (i = 0; i < htable->size; i++) { - ares__llist_node_t *node; - for (node = ares__llist_node_first(htable->buckets[i]); node != NULL; - node = ares__llist_node_next(node)) { - out[cnt++] = ares__llist_node_val(node); - } - } - - *num = cnt; - return out; -} - -/*! Grabs the Hashtable index from the key and length. The h index is - * the hash of the function reduced to the size of the bucket list. - * We are doing "hash & (size - 1)" since we are guaranteeing a power of - * 2 for size. This is equivalent to "hash % size", but should be more - * efficient */ -#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1) - -static ares__llist_node_t *ares__htable_find(const ares__htable_t *htable, - unsigned int idx, const void *key) -{ - ares__llist_node_t *node = NULL; - - for (node = ares__llist_node_first(htable->buckets[idx]); node != NULL; - node = ares__llist_node_next(node)) { - if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node)))) { - break; - } - } - - return node; -} - -static ares_bool_t ares__htable_expand(ares__htable_t *htable) -{ - ares__llist_t **buckets = NULL; - unsigned int old_size = htable->size; - size_t i; - ares__llist_t **prealloc_llist = NULL; - size_t prealloc_llist_len = 0; - ares_bool_t rv = ARES_FALSE; - - /* Not a failure, just won't expand */ - if (old_size == ARES__HTABLE_MAX_BUCKETS) { - return ARES_TRUE; - } - - htable->size <<= 1; - - /* We must pre-allocate all memory we'll need before moving entries to the - * new hash array. Otherwise if there's a memory allocation failure in the - * middle, we wouldn't be able to recover. */ - buckets = ares_malloc_zero(sizeof(*buckets) * htable->size); - if (buckets == NULL) { - goto done; - } - - /* The maximum number of new llists we'll need is the number of collisions - * that were recorded */ - prealloc_llist_len = htable->num_collisions; - if (prealloc_llist_len) { - prealloc_llist = - ares_malloc_zero(sizeof(*prealloc_llist) * prealloc_llist_len); - if (prealloc_llist == NULL) { - goto done; - } - } - for (i = 0; i < prealloc_llist_len; i++) { - prealloc_llist[i] = ares__llist_create(htable->bucket_free); - if (prealloc_llist[i] == NULL) { - goto done; - } - } - - /* Iterate across all buckets and move the entries to the new buckets */ - htable->num_collisions = 0; - for (i = 0; i < old_size; i++) { - ares__llist_node_t *node; - - /* Nothing in this bucket */ - if (htable->buckets[i] == NULL) { - continue; - } - - /* Fast path optimization (most likely case), there is likely only a single - * entry in both the source and destination, check for this to confirm and - * if so, just move the bucket over */ - if (ares__llist_len(htable->buckets[i]) == 1) { - const void *val = ares__llist_first_val(htable->buckets[i]); - size_t idx = HASH_IDX(htable, htable->bucket_key(val)); - - if (buckets[idx] == NULL) { - /* Swap! */ - buckets[idx] = htable->buckets[i]; - htable->buckets[i] = NULL; - continue; - } - } - - /* Slow path, collisions */ - while ((node = ares__llist_node_first(htable->buckets[i])) != NULL) { - const void *val = ares__llist_node_val(node); - size_t idx = HASH_IDX(htable, htable->bucket_key(val)); - - /* Try fast path again as maybe we popped one collision off and the - * next we can reuse the llist parent */ - if (buckets[idx] == NULL && ares__llist_len(htable->buckets[i]) == 1) { - /* Swap! */ - buckets[idx] = htable->buckets[i]; - htable->buckets[i] = NULL; - break; - } - - /* Grab one off our preallocated list */ - if (buckets[idx] == NULL) { - /* Silence static analysis, this isn't possible but it doesn't know */ - if (prealloc_llist == NULL || prealloc_llist_len == 0) { - goto done; - } - buckets[idx] = prealloc_llist[prealloc_llist_len - 1]; - prealloc_llist_len--; - } else { - /* Collision occurred since the bucket wasn't empty */ - htable->num_collisions++; - } - - ares__llist_node_move_parent_first(node, buckets[idx]); - } - - /* Abandoned bucket, destroy */ - if (htable->buckets[i] != NULL) { - ares__llist_destroy(htable->buckets[i]); - htable->buckets[i] = NULL; - } - } - - /* We have guaranteed all the buckets have either been moved or destroyed, - * so we just call ares_free() on the array and swap out the pointer */ - ares_free(htable->buckets); - htable->buckets = buckets; - buckets = NULL; - rv = ARES_TRUE; - -done: - ares_free(buckets); - /* destroy any unused preallocated buckets */ - ares__htable_buckets_destroy(prealloc_llist, (unsigned int)prealloc_llist_len, - ARES_FALSE); - - /* On failure, we need to restore the htable size */ - if (rv != ARES_TRUE) { - htable->size = old_size; - } - - return rv; -} - -ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket) -{ - unsigned int idx = 0; - ares__llist_node_t *node = NULL; - const void *key = NULL; - - if (htable == NULL || bucket == NULL) { - return ARES_FALSE; - } - - - key = htable->bucket_key(bucket); - idx = HASH_IDX(htable, key); - - /* See if we have a matching bucket already, if so, replace it */ - node = ares__htable_find(htable, idx, key); - if (node != NULL) { - ares__llist_node_replace(node, bucket); - return ARES_TRUE; - } - - /* Check to see if we should rehash because likelihood of collisions has - * increased beyond our threshold */ - if (htable->num_keys + 1 > - (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) { - if (!ares__htable_expand(htable)) { - return ARES_FALSE; - } - /* If we expanded, need to calculate a new index */ - idx = HASH_IDX(htable, key); - } - - /* We lazily allocate the linked list */ - if (htable->buckets[idx] == NULL) { - htable->buckets[idx] = ares__llist_create(htable->bucket_free); - if (htable->buckets[idx] == NULL) { - return ARES_FALSE; - } - } - - node = ares__llist_insert_first(htable->buckets[idx], bucket); - if (node == NULL) { - return ARES_FALSE; - } - - /* Track collisions for rehash stability */ - if (ares__llist_len(htable->buckets[idx]) > 1) { - htable->num_collisions++; - } - - htable->num_keys++; - - return ARES_TRUE; -} - -void *ares__htable_get(const ares__htable_t *htable, const void *key) -{ - unsigned int idx; - - if (htable == NULL || key == NULL) { - return NULL; - } - - idx = HASH_IDX(htable, key); - - return ares__llist_node_val(ares__htable_find(htable, idx, key)); -} - -ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key) -{ - ares__llist_node_t *node; - unsigned int idx; - - if (htable == NULL || key == NULL) { - return ARES_FALSE; - } - - idx = HASH_IDX(htable, key); - node = ares__htable_find(htable, idx, key); - if (node == NULL) { - return ARES_FALSE; - } - - htable->num_keys--; - - /* Reduce collisions */ - if (ares__llist_len(ares__llist_node_parent(node)) > 1) { - htable->num_collisions--; - } - - ares__llist_node_destroy(node); - return ARES_TRUE; -} - -size_t ares__htable_num_keys(const ares__htable_t *htable) -{ - if (htable == NULL) { - return 0; - } - return htable->num_keys; -} - -unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len, - unsigned int seed) -{ - /* recommended seed is 2166136261U, but we don't want collisions */ - unsigned int hv = seed; - size_t i; - - for (i = 0; i < key_len; i++) { - hv ^= (unsigned int)key[i]; - /* hv *= 0x01000193 */ - hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); - } - - return hv; -} - -/* Case insensitive version, meant for ASCII strings */ -unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, - size_t key_len, unsigned int seed) -{ - /* recommended seed is 2166136261U, but we don't want collisions */ - unsigned int hv = seed; - size_t i; - - for (i = 0; i < key_len; i++) { - hv ^= (unsigned int)ares__tolower(key[i]); - /* hv *= 0x01000193 */ - hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); - } - - return hv; -} diff --git a/deps/cares/src/lib/ares__htable.h b/deps/cares/src/lib/ares__htable.h deleted file mode 100644 index d09c865977cdae..00000000000000 --- a/deps/cares/src/lib/ares__htable.h +++ /dev/null @@ -1,176 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__HTABLE_H -#define __ARES__HTABLE_H - - -/*! \addtogroup ares__htable Base HashTable Data Structure - * - * This is a basic hashtable data structure that is meant to be wrapped - * by a higher level implementation. This data structure is designed to - * be callback-based in order to facilitate wrapping without needing to - * worry about any underlying complexities of the hashtable implementation. - * - * This implementation supports automatic growing by powers of 2 when reaching - * 75% capacity. A rehash will be performed on the expanded bucket list. - * - * Average time complexity: - * - Insert: O(1) - * - Search: O(1) - * - Delete: O(1) - * - * @{ - */ - -struct ares__htable; - -/*! Opaque data type for generic hash table implementation */ -typedef struct ares__htable ares__htable_t; - -/*! Callback for generating a hash of the key. - * - * \param[in] key pointer to key to be hashed - * \param[in] seed randomly generated seed used by hash function. - * value is specific to the hashtable instance - * but otherwise will not change between calls. - * \return hash - */ -typedef unsigned int (*ares__htable_hashfunc_t)(const void *key, - unsigned int seed); - -/*! Callback to free the bucket - * - * \param[in] bucket user provided bucket - */ -typedef void (*ares__htable_bucket_free_t)(void *bucket); - -/*! Callback to extract the key from the user-provided bucket - * - * \param[in] bucket user provided bucket - * \return pointer to key held in bucket - */ -typedef const void *(*ares__htable_bucket_key_t)(const void *bucket); - -/*! Callback to compare two keys for equality - * - * \param[in] key1 first key - * \param[in] key2 second key - * \return ARES_TRUE if equal, ARES_FALSE if not - */ -typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1, - const void *key2); - - -/*! Destroy the initialized hashtable - * - * \param[in] htable initialized hashtable - */ -void ares__htable_destroy(ares__htable_t *htable); - -/*! Create a new hashtable - * - * \param[in] hash_func Required. Callback for Hash function. - * \param[in] bucket_key Required. Callback to extract key from bucket. - * \param[in] bucket_free Required. Callback to free bucket. - * \param[in] key_eq Required. Callback to check for key equality. - * \return initialized hashtable. NULL if out of memory or misuse. - */ -ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func, - ares__htable_bucket_key_t bucket_key, - ares__htable_bucket_free_t bucket_free, - ares__htable_key_eq_t key_eq); - -/*! Count of keys from initialized hashtable - * - * \param[in] htable Initialized hashtable. - * \return count of keys - */ -size_t ares__htable_num_keys(const ares__htable_t *htable); - -/*! Retrieve an array of buckets from the hashtable. This is mainly used as - * a helper for retrieving an array of keys. - * - * \param[in] htable Initialized hashtable - * \param[out] num Count of returned buckets - * \return Array of pointers to the buckets. These are internal pointers - * to data within the hashtable, so if the key is removed, there - * will be a dangling pointer. It is expected wrappers will make - * such values safe by duplicating them. - */ -const void **ares__htable_all_buckets(const ares__htable_t *htable, - size_t *num); - -/*! Insert bucket into hashtable - * - * \param[in] htable Initialized hashtable. - * \param[in] bucket User-provided bucket to insert. Takes "ownership". Not - * allowed to be NULL. - * \return ARES_TRUE on success, ARES_FALSE if out of memory - */ -ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket); - -/*! Retrieve bucket from hashtable based on key. - * - * \param[in] htable Initialized hashtable - * \param[in] key Pointer to key to use for comparison. - * \return matching bucket, or NULL if not found. - */ -void *ares__htable_get(const ares__htable_t *htable, const void *key); - -/*! Remove bucket from hashtable by key - * - * \param[in] htable Initialized hashtable - * \param[in] key Pointer to key to use for comparison - * \return ARES_TRUE if found, ARES_FALSE if not found - */ -ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key); - -/*! FNV1a hash algorithm. Can be used as underlying primitive for building - * a wrapper hashtable. - * - * \param[in] key pointer to key - * \param[in] key_len Length of key - * \param[in] seed Seed for generating hash - * \return hash value - */ -unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len, - unsigned int seed); - -/*! FNV1a hash algorithm, but converts all characters to lowercase before - * hashing to make the hash case-insensitive. Can be used as underlying - * primitive for building a wrapper hashtable. Used on string-based keys. - * - * \param[in] key pointer to key - * \param[in] key_len Length of key - * \param[in] seed Seed for generating hash - * \return hash value - */ -unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, - size_t key_len, unsigned int seed); - -/*! @} */ - -#endif /* __ARES__HTABLE_H */ diff --git a/deps/cares/src/lib/ares__htable_asvp.c b/deps/cares/src/lib/ares__htable_asvp.c deleted file mode 100644 index 3c1d2a336fad35..00000000000000 --- a/deps/cares/src/lib/ares__htable_asvp.c +++ /dev/null @@ -1,228 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__htable.h" -#include "ares__htable_asvp.h" - -struct ares__htable_asvp { - ares__htable_asvp_val_free_t free_val; - ares__htable_t *hash; -}; - -typedef struct { - ares_socket_t key; - void *val; - ares__htable_asvp_t *parent; -} ares__htable_asvp_bucket_t; - -void ares__htable_asvp_destroy(ares__htable_asvp_t *htable) -{ - if (htable == NULL) { - return; - } - - ares__htable_destroy(htable->hash); - ares_free(htable); -} - -static unsigned int hash_func(const void *key, unsigned int seed) -{ - const ares_socket_t *arg = key; - return ares__htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), - seed); -} - -static const void *bucket_key(const void *bucket) -{ - const ares__htable_asvp_bucket_t *arg = bucket; - return &arg->key; -} - -static void bucket_free(void *bucket) -{ - ares__htable_asvp_bucket_t *arg = bucket; - - if (arg->parent->free_val) { - arg->parent->free_val(arg->val); - } - - ares_free(arg); -} - -static ares_bool_t key_eq(const void *key1, const void *key2) -{ - const ares_socket_t *k1 = key1; - const ares_socket_t *k2 = key2; - - if (*k1 == *k2) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -ares__htable_asvp_t * - ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free) -{ - ares__htable_asvp_t *htable = ares_malloc(sizeof(*htable)); - if (htable == NULL) { - goto fail; - } - - htable->hash = - ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); - if (htable->hash == NULL) { - goto fail; - } - - htable->free_val = val_free; - - return htable; - -fail: - if (htable) { - ares__htable_destroy(htable->hash); - ares_free(htable); - } - return NULL; -} - -ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable, - size_t *num) -{ - const void **buckets = NULL; - size_t cnt = 0; - ares_socket_t *out = NULL; - size_t i; - - if (htable == NULL || num == NULL) { - return NULL; - } - - *num = 0; - - buckets = ares__htable_all_buckets(htable->hash, &cnt); - if (buckets == NULL || cnt == 0) { - return NULL; - } - - out = ares_malloc_zero(sizeof(*out) * cnt); - if (out == NULL) { - ares_free(buckets); - return NULL; - } - - for (i = 0; i < cnt; i++) { - out[i] = ((const ares__htable_asvp_bucket_t *)buckets[i])->key; - } - - ares_free(buckets); - *num = cnt; - return out; -} - -ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable, - ares_socket_t key, void *val) -{ - ares__htable_asvp_bucket_t *bucket = NULL; - - if (htable == NULL) { - goto fail; - } - - bucket = ares_malloc(sizeof(*bucket)); - if (bucket == NULL) { - goto fail; - } - - bucket->parent = htable; - bucket->key = key; - bucket->val = val; - - if (!ares__htable_insert(htable->hash, bucket)) { - goto fail; - } - - return ARES_TRUE; - -fail: - if (bucket) { - ares_free(bucket); - } - return ARES_FALSE; -} - -ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable, - ares_socket_t key, void **val) -{ - ares__htable_asvp_bucket_t *bucket = NULL; - - if (val) { - *val = NULL; - } - - if (htable == NULL) { - return ARES_FALSE; - } - - bucket = ares__htable_get(htable->hash, &key); - if (bucket == NULL) { - return ARES_FALSE; - } - - if (val) { - *val = bucket->val; - } - return ARES_TRUE; -} - -void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable, - ares_socket_t key) -{ - void *val = NULL; - ares__htable_asvp_get(htable, key, &val); - return val; -} - -ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable, - ares_socket_t key) -{ - if (htable == NULL) { - return ARES_FALSE; - } - - return ares__htable_remove(htable->hash, &key); -} - -size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable) -{ - if (htable == NULL) { - return 0; - } - return ares__htable_num_keys(htable->hash); -} diff --git a/deps/cares/src/lib/ares__htable_asvp.h b/deps/cares/src/lib/ares__htable_asvp.h deleted file mode 100644 index 49a766d023091e..00000000000000 --- a/deps/cares/src/lib/ares__htable_asvp.h +++ /dev/null @@ -1,130 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__HTABLE_ASVP_H -#define __ARES__HTABLE_ASVP_H - -/*! \addtogroup ares__htable_asvp HashTable with ares_socket_t Key and - * void pointer Value - * - * This data structure wraps the base ares__htable data structure in order to - * split the key and value data types as ares_socket_t and void pointer, - * respectively. - * - * Average time complexity: - * - Insert: O(1) - * - Search: O(1) - * - Delete: O(1) - * - * @{ - */ - -struct ares__htable_asvp; - -/*! Opaque data type for ares_socket_t key, void pointer hash table - * implementation */ -typedef struct ares__htable_asvp ares__htable_asvp_t; - -/*! Callback to free value stored in hashtable - * - * \param[in] val user-supplied value - */ -typedef void (*ares__htable_asvp_val_free_t)(void *val); - -/*! Destroy hashtable - * - * \param[in] htable Initialized hashtable - */ -void ares__htable_asvp_destroy(ares__htable_asvp_t *htable); - -/*! Create size_t key, void pointer value hash table - * - * \param[in] val_free Optional. Call back to free user-supplied value. If - * NULL it is expected the caller will clean up any user - * supplied values. - */ -ares__htable_asvp_t * - ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free); - -/*! Retrieve an array of keys from the hashtable. - * - * \param[in] htable Initialized hashtable - * \param[out] num Count of returned keys - * \return Array of keys in the hashtable. Must be free'd with ares_free(). - */ -ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable, - size_t *num); - - -/*! Insert key/value into hash table - * - * \param[in] htable Initialized hash table - * \param[in] key key to associate with value - * \param[in] val value to store (takes ownership). May be NULL. - * \return ARES_TRUE on success, ARES_FALSE on out of memory or misuse - */ -ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable, - ares_socket_t key, void *val); - -/*! Retrieve value from hashtable based on key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \param[out] val Optional. Pointer to store value. - * \return ARES_TRUE on success, ARES_FALSE on failure - */ -ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable, - ares_socket_t key, void **val); - -/*! Retrieve value from hashtable directly as return value. Caveat to this - * function over ares__htable_asvp_get() is that if a NULL value is stored - * you cannot determine if the key is not found or the value is NULL. - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return value associated with key in hashtable or NULL - */ -void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable, - ares_socket_t key); - -/*! Remove a value from the hashtable by key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return ARES_TRUE if found, ARES_FALSE if not found - */ -ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable, - ares_socket_t key); - -/*! Retrieve the number of keys stored in the hash table - * - * \param[in] htable Initialized hash table - * \return count - */ -size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable); - -/*! @} */ - -#endif /* __ARES__HTABLE_ASVP_H */ diff --git a/deps/cares/src/lib/ares__htable_strvp.c b/deps/cares/src/lib/ares__htable_strvp.c deleted file mode 100644 index bfae4c3622891c..00000000000000 --- a/deps/cares/src/lib/ares__htable_strvp.c +++ /dev/null @@ -1,198 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__htable.h" -#include "ares__htable_strvp.h" - -struct ares__htable_strvp { - ares__htable_strvp_val_free_t free_val; - ares__htable_t *hash; -}; - -typedef struct { - char *key; - void *val; - ares__htable_strvp_t *parent; -} ares__htable_strvp_bucket_t; - -void ares__htable_strvp_destroy(ares__htable_strvp_t *htable) -{ - if (htable == NULL) { - return; - } - - ares__htable_destroy(htable->hash); - ares_free(htable); -} - -static unsigned int hash_func(const void *key, unsigned int seed) -{ - const char *arg = key; - return ares__htable_hash_FNV1a_casecmp((const unsigned char *)arg, - ares_strlen(arg), seed); -} - -static const void *bucket_key(const void *bucket) -{ - const ares__htable_strvp_bucket_t *arg = bucket; - return arg->key; -} - -static void bucket_free(void *bucket) -{ - ares__htable_strvp_bucket_t *arg = bucket; - - if (arg->parent->free_val) { - arg->parent->free_val(arg->val); - } - ares_free(arg->key); - ares_free(arg); -} - -static ares_bool_t key_eq(const void *key1, const void *key2) -{ - const char *k1 = key1; - const char *k2 = key2; - - if (strcasecmp(k1, k2) == 0) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -ares__htable_strvp_t * - ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free) -{ - ares__htable_strvp_t *htable = ares_malloc(sizeof(*htable)); - if (htable == NULL) { - goto fail; - } - - htable->hash = - ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); - if (htable->hash == NULL) { - goto fail; - } - - htable->free_val = val_free; - - return htable; - -fail: - if (htable) { - ares__htable_destroy(htable->hash); - ares_free(htable); - } - return NULL; -} - -ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable, - const char *key, void *val) -{ - ares__htable_strvp_bucket_t *bucket = NULL; - - if (htable == NULL || key == NULL) { - goto fail; - } - - bucket = ares_malloc(sizeof(*bucket)); - if (bucket == NULL) { - goto fail; - } - - bucket->parent = htable; - bucket->key = ares_strdup(key); - if (bucket->key == NULL) { - goto fail; - } - bucket->val = val; - - if (!ares__htable_insert(htable->hash, bucket)) { - goto fail; - } - - return ARES_TRUE; - -fail: - if (bucket) { - ares_free(bucket->key); - ares_free(bucket); - } - return ARES_FALSE; -} - -ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable, - const char *key, void **val) -{ - ares__htable_strvp_bucket_t *bucket = NULL; - - if (val) { - *val = NULL; - } - - if (htable == NULL || key == NULL) { - return ARES_FALSE; - } - - bucket = ares__htable_get(htable->hash, key); - if (bucket == NULL) { - return ARES_FALSE; - } - - if (val) { - *val = bucket->val; - } - return ARES_TRUE; -} - -void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable, - const char *key) -{ - void *val = NULL; - ares__htable_strvp_get(htable, key, &val); - return val; -} - -ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable, - const char *key) -{ - if (htable == NULL) { - return ARES_FALSE; - } - - return ares__htable_remove(htable->hash, key); -} - -size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable) -{ - if (htable == NULL) { - return 0; - } - return ares__htable_num_keys(htable->hash); -} diff --git a/deps/cares/src/lib/ares__htable_strvp.h b/deps/cares/src/lib/ares__htable_strvp.h deleted file mode 100644 index 25dd2b90777d8d..00000000000000 --- a/deps/cares/src/lib/ares__htable_strvp.h +++ /dev/null @@ -1,118 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__HTABLE_STRVP_H -#define __ARES__HTABLE_STRVP_H - -/*! \addtogroup ares__htable_strvp HashTable with string Key and void pointer - * Value - * - * This data structure wraps the base ares__htable data structure in order to - * split the key and value data types as string and void pointer, respectively. - * - * Average time complexity: - * - Insert: O(1) - * - Search: O(1) - * - Delete: O(1) - * - * @{ - */ - -struct ares__htable_strvp; - -/*! Opaque data type for size_t key, void pointer hash table implementation */ -typedef struct ares__htable_strvp ares__htable_strvp_t; - -/*! Callback to free value stored in hashtable - * - * \param[in] val user-supplied value - */ -typedef void (*ares__htable_strvp_val_free_t)(void *val); - -/*! Destroy hashtable - * - * \param[in] htable Initialized hashtable - */ -void ares__htable_strvp_destroy(ares__htable_strvp_t *htable); - -/*! Create string, void pointer value hash table - * - * \param[in] val_free Optional. Call back to free user-supplied value. If - * NULL it is expected the caller will clean up any user - * supplied values. - */ -ares__htable_strvp_t * - ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free); - -/*! Insert key/value into hash table - * - * \param[in] htable Initialized hash table - * \param[in] key key to associate with value - * \param[in] val value to store (takes ownership). May be NULL. - * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory - */ -ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable, - const char *key, void *val); - -/*! Retrieve value from hashtable based on key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \param[out] val Optional. Pointer to store value. - * \return ARES_TRUE on success, ARES_FALSE on failure - */ -ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable, - const char *key, void **val); - -/*! Retrieve value from hashtable directly as return value. Caveat to this - * function over ares__htable_strvp_get() is that if a NULL value is stored - * you cannot determine if the key is not found or the value is NULL. - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return value associated with key in hashtable or NULL - */ -void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable, - const char *key); - -/*! Remove a value from the hashtable by key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return ARES_TRUE if found, ARES_FALSE if not - */ -ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable, - const char *key); - -/*! Retrieve the number of keys stored in the hash table - * - * \param[in] htable Initialized hash table - * \return count - */ -size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable); - -/*! @} */ - -#endif /* __ARES__HTABLE_STVP_H */ diff --git a/deps/cares/src/lib/ares__htable_szvp.c b/deps/cares/src/lib/ares__htable_szvp.c deleted file mode 100644 index 2ff64784bcd6dd..00000000000000 --- a/deps/cares/src/lib/ares__htable_szvp.c +++ /dev/null @@ -1,193 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__htable.h" -#include "ares__htable_szvp.h" - -struct ares__htable_szvp { - ares__htable_szvp_val_free_t free_val; - ares__htable_t *hash; -}; - -typedef struct { - size_t key; - void *val; - ares__htable_szvp_t *parent; -} ares__htable_szvp_bucket_t; - -void ares__htable_szvp_destroy(ares__htable_szvp_t *htable) -{ - if (htable == NULL) { - return; - } - - ares__htable_destroy(htable->hash); - ares_free(htable); -} - -static unsigned int hash_func(const void *key, unsigned int seed) -{ - const size_t *arg = key; - return ares__htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), - seed); -} - -static const void *bucket_key(const void *bucket) -{ - const ares__htable_szvp_bucket_t *arg = bucket; - return &arg->key; -} - -static void bucket_free(void *bucket) -{ - ares__htable_szvp_bucket_t *arg = bucket; - - if (arg->parent->free_val) { - arg->parent->free_val(arg->val); - } - - ares_free(arg); -} - -static ares_bool_t key_eq(const void *key1, const void *key2) -{ - const size_t *k1 = key1; - const size_t *k2 = key2; - - if (*k1 == *k2) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -ares__htable_szvp_t * - ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free) -{ - ares__htable_szvp_t *htable = ares_malloc(sizeof(*htable)); - if (htable == NULL) { - goto fail; - } - - htable->hash = - ares__htable_create(hash_func, bucket_key, bucket_free, key_eq); - if (htable->hash == NULL) { - goto fail; - } - - htable->free_val = val_free; - - return htable; - -fail: - if (htable) { - ares__htable_destroy(htable->hash); - ares_free(htable); - } - return NULL; -} - -ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key, - void *val) -{ - ares__htable_szvp_bucket_t *bucket = NULL; - - if (htable == NULL) { - goto fail; - } - - bucket = ares_malloc(sizeof(*bucket)); - if (bucket == NULL) { - goto fail; - } - - bucket->parent = htable; - bucket->key = key; - bucket->val = val; - - if (!ares__htable_insert(htable->hash, bucket)) { - goto fail; - } - - return ARES_TRUE; - -fail: - if (bucket) { - ares_free(bucket); - } - return ARES_FALSE; -} - -ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key, - void **val) -{ - ares__htable_szvp_bucket_t *bucket = NULL; - - if (val) { - *val = NULL; - } - - if (htable == NULL) { - return ARES_FALSE; - } - - bucket = ares__htable_get(htable->hash, &key); - if (bucket == NULL) { - return ARES_FALSE; - } - - if (val) { - *val = bucket->val; - } - return ARES_TRUE; -} - -void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable, - size_t key) -{ - void *val = NULL; - ares__htable_szvp_get(htable, key, &val); - return val; -} - -ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key) -{ - if (htable == NULL) { - return ARES_FALSE; - } - - return ares__htable_remove(htable->hash, &key); -} - -size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable) -{ - if (htable == NULL) { - return 0; - } - return ares__htable_num_keys(htable->hash); -} diff --git a/deps/cares/src/lib/ares__htable_szvp.h b/deps/cares/src/lib/ares__htable_szvp.h deleted file mode 100644 index 62b1776be92b5b..00000000000000 --- a/deps/cares/src/lib/ares__htable_szvp.h +++ /dev/null @@ -1,117 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__HTABLE_STVP_H -#define __ARES__HTABLE_STVP_H - -/*! \addtogroup ares__htable_szvp HashTable with size_t Key and void pointer - * Value - * - * This data structure wraps the base ares__htable data structure in order to - * split the key and value data types as size_t and void pointer, respectively. - * - * Average time complexity: - * - Insert: O(1) - * - Search: O(1) - * - Delete: O(1) - * - * @{ - */ - -struct ares__htable_szvp; - -/*! Opaque data type for size_t key, void pointer hash table implementation */ -typedef struct ares__htable_szvp ares__htable_szvp_t; - -/*! Callback to free value stored in hashtable - * - * \param[in] val user-supplied value - */ -typedef void (*ares__htable_szvp_val_free_t)(void *val); - -/*! Destroy hashtable - * - * \param[in] htable Initialized hashtable - */ -void ares__htable_szvp_destroy(ares__htable_szvp_t *htable); - -/*! Create size_t key, void pointer value hash table - * - * \param[in] val_free Optional. Call back to free user-supplied value. If - * NULL it is expected the caller will clean up any user - * supplied values. - */ -ares__htable_szvp_t * - ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free); - -/*! Insert key/value into hash table - * - * \param[in] htable Initialized hash table - * \param[in] key key to associate with value - * \param[in] val value to store (takes ownership). May be NULL. - * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory - */ -ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key, - void *val); - -/*! Retrieve value from hashtable based on key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \param[out] val Optional. Pointer to store value. - * \return ARES_TRUE on success, ARES_FALSE on failure - */ -ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key, - void **val); - -/*! Retrieve value from hashtable directly as return value. Caveat to this - * function over ares__htable_szvp_get() is that if a NULL value is stored - * you cannot determine if the key is not found or the value is NULL. - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return value associated with key in hashtable or NULL - */ -void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable, - size_t key); - -/*! Remove a value from the hashtable by key - * - * \param[in] htable Initialized hash table - * \param[in] key key to use to search - * \return ARES_TRUE if found, ARES_FALSE if not - */ -ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key); - -/*! Retrieve the number of keys stored in the hash table - * - * \param[in] htable Initialized hash table - * \return count - */ -size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable); - -/*! @} */ - -#endif /* __ARES__HTABLE_STVP_H */ diff --git a/deps/cares/src/lib/ares__iface_ips.c b/deps/cares/src/lib/ares__iface_ips.c deleted file mode 100644 index b252a7ab492191..00000000000000 --- a/deps/cares/src/lib/ares__iface_ips.c +++ /dev/null @@ -1,592 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" - - -#ifdef USE_WINSOCK -# include <winsock2.h> -# include <ws2tcpip.h> -# if defined(HAVE_IPHLPAPI_H) -# include <iphlpapi.h> -# endif -# if defined(HAVE_NETIOAPI_H) -# include <netioapi.h> -# endif -#endif - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -# include <sys/socket.h> -#endif -#ifdef HAVE_NET_IF_H -# include <net/if.h> -#endif -#ifdef HAVE_IFADDRS_H -# include <ifaddrs.h> -#endif -#ifdef HAVE_SYS_IOCTL_H -# include <sys/ioctl.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif - -#include "ares.h" -#include "ares_private.h" - -static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips, - const char *name); - -typedef struct { - char *name; - struct ares_addr addr; - unsigned char netmask; - unsigned int ll_scope; - ares__iface_ip_flags_t flags; -} ares__iface_ip_t; - -struct ares__iface_ips { - ares__iface_ip_t *ips; - size_t cnt; - size_t alloc_size; - ares__iface_ip_flags_t enum_flags; -}; - -static ares__iface_ips_t *ares__iface_ips_alloc(ares__iface_ip_flags_t flags) -{ - ares__iface_ips_t *ips = ares_malloc_zero(sizeof(*ips)); - if (ips == NULL) { - return NULL; - } - - /* Prealloc 4 entries */ - ips->alloc_size = 4; - ips->ips = ares_malloc_zero(ips->alloc_size * sizeof(*ips->ips)); - if (ips->ips == NULL) { - ares_free(ips); - return NULL; - } - ips->enum_flags = flags; - return ips; -} - -static void ares__iface_ip_destroy(ares__iface_ip_t *ip) -{ - if (ip == NULL) { - return; - } - ares_free(ip->name); - memset(ip, 0, sizeof(*ip)); -} - -void ares__iface_ips_destroy(ares__iface_ips_t *ips) -{ - size_t i; - - if (ips == NULL) { - return; - } - - for (i = 0; i < ips->cnt; i++) { - ares__iface_ip_destroy(&ips->ips[i]); - } - ares_free(ips->ips); - ares_free(ips); -} - -ares_status_t ares__iface_ips(ares__iface_ips_t **ips, - ares__iface_ip_flags_t flags, const char *name) -{ - ares_status_t status; - - if (ips == NULL) { - return ARES_EFORMERR; - } - - *ips = ares__iface_ips_alloc(flags); - if (*ips == NULL) { - return ARES_ENOMEM; - } - - status = ares__iface_ips_enumerate(*ips, name); - if (status != ARES_SUCCESS) { - ares__iface_ips_destroy(*ips); - *ips = NULL; - return status; - } - - return ARES_SUCCESS; -} - -static ares_status_t - ares__iface_ips_add(ares__iface_ips_t *ips, ares__iface_ip_flags_t flags, - const char *name, const struct ares_addr *addr, - unsigned char netmask, unsigned int ll_scope) -{ - size_t idx; - - if (ips == NULL || name == NULL || addr == NULL) { - return ARES_EFORMERR; - } - - /* Don't want loopback */ - if (flags & ARES_IFACE_IP_LOOPBACK && - !(ips->enum_flags & ARES_IFACE_IP_LOOPBACK)) { - return ARES_SUCCESS; - } - - /* Don't want offline */ - if (flags & ARES_IFACE_IP_OFFLINE && - !(ips->enum_flags & ARES_IFACE_IP_OFFLINE)) { - return ARES_SUCCESS; - } - - /* Check for link-local */ - if (ares__addr_is_linklocal(addr)) { - flags |= ARES_IFACE_IP_LINKLOCAL; - } - if (flags & ARES_IFACE_IP_LINKLOCAL && - !(ips->enum_flags & ARES_IFACE_IP_LINKLOCAL)) { - return ARES_SUCCESS; - } - - /* Set address flag based on address provided */ - if (addr->family == AF_INET) { - flags |= ARES_IFACE_IP_V4; - } - - if (addr->family == AF_INET6) { - flags |= ARES_IFACE_IP_V6; - } - - /* If they specified either v4 or v6 validate flags otherwise assume they - * want to enumerate both */ - if (ips->enum_flags & (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6)) { - if (flags & ARES_IFACE_IP_V4 && !(ips->enum_flags & ARES_IFACE_IP_V4)) { - return ARES_SUCCESS; - } - if (flags & ARES_IFACE_IP_V6 && !(ips->enum_flags & ARES_IFACE_IP_V6)) { - return ARES_SUCCESS; - } - } - - /* Allocate more ips */ - if (ips->cnt + 1 > ips->alloc_size) { - void *temp; - size_t alloc_size; - - alloc_size = ares__round_up_pow2(ips->alloc_size + 1); - temp = ares_realloc_zero(ips->ips, ips->alloc_size * sizeof(*ips->ips), - alloc_size * sizeof(*ips->ips)); - if (temp == NULL) { - return ARES_ENOMEM; - } - ips->ips = temp; - ips->alloc_size = alloc_size; - } - - /* Add */ - idx = ips->cnt++; - - ips->ips[idx].flags = flags; - ips->ips[idx].netmask = netmask; - ips->ips[idx].ll_scope = ll_scope; - memcpy(&ips->ips[idx].addr, addr, sizeof(*addr)); - ips->ips[idx].name = ares_strdup(name); - if (ips->ips[idx].name == NULL) { - return ARES_ENOMEM; - } - - return ARES_SUCCESS; -} - -size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips) -{ - if (ips == NULL) { - return 0; - } - return ips->cnt; -} - -const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx) -{ - if (ips == NULL || idx >= ips->cnt) { - return NULL; - } - return ips->ips[idx].name; -} - -const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips, - size_t idx) -{ - if (ips == NULL || idx >= ips->cnt) { - return NULL; - } - return &ips->ips[idx].addr; -} - -ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips, - size_t idx) -{ - if (ips == NULL || idx >= ips->cnt) { - return 0; - } - return ips->ips[idx].flags; -} - -unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips, - size_t idx) -{ - if (ips == NULL || idx >= ips->cnt) { - return 0; - } - return ips->ips[idx].netmask; -} - -unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips, - size_t idx) -{ - if (ips == NULL || idx >= ips->cnt) { - return 0; - } - return ips->ips[idx].ll_scope; -} - - -#ifdef USE_WINSOCK - -# if 0 -static char *wcharp_to_charp(const wchar_t *in) -{ - char *out; - int len; - - len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL); - if (len == -1) { - return NULL; - } - - out = ares_malloc_zero((size_t)len + 1); - - if (WideCharToMultiByte(CP_UTF8, 0, in, -1, out, len, NULL, NULL) == -1) { - ares_free(out); - return NULL; - } - - return out; -} -# endif - -static ares_bool_t name_match(const char *name, const char *adapter_name, - unsigned int ll_scope) -{ - if (name == NULL || *name == 0) { - return ARES_TRUE; - } - - if (strcasecmp(name, adapter_name) == 0) { - return ARES_TRUE; - } - - if (ares_str_isnum(name) && (unsigned int)atoi(name) == ll_scope) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips, - const char *name) -{ - ULONG myflags = GAA_FLAG_INCLUDE_PREFIX /*|GAA_FLAG_INCLUDE_ALL_INTERFACES */; - ULONG outBufLen = 0; - DWORD retval; - IP_ADAPTER_ADDRESSES *addresses = NULL; - IP_ADAPTER_ADDRESSES *address = NULL; - ares_status_t status = ARES_SUCCESS; - - /* Get necessary buffer size */ - GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, NULL, &outBufLen); - if (outBufLen == 0) { - status = ARES_EFILE; - goto done; - } - - addresses = ares_malloc_zero(outBufLen); - if (addresses == NULL) { - status = ARES_ENOMEM; - goto done; - } - - retval = - GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, addresses, &outBufLen); - if (retval != ERROR_SUCCESS) { - status = ARES_EFILE; - goto done; - } - - for (address = addresses; address != NULL; address = address->Next) { - IP_ADAPTER_UNICAST_ADDRESS *ipaddr = NULL; - ares__iface_ip_flags_t addrflag = 0; - char ifname[64] = ""; - -# if defined(HAVE_CONVERTINTERFACEINDEXTOLUID) && \ - defined(HAVE_CONVERTINTERFACELUIDTONAMEA) - /* Retrieve name from interface index. - * address->AdapterName appears to be a GUID/UUID of some sort, not a name. - * address->FriendlyName is user-changeable. - * That said, this doesn't appear to help us out on systems that don't - * have if_nametoindex() or if_indextoname() as they don't have these - * functions either! */ - NET_LUID luid; - ConvertInterfaceIndexToLuid(address->IfIndex, &luid); - ConvertInterfaceLuidToNameA(&luid, ifname, sizeof(ifname)); -# else - ares_strcpy(ifname, address->AdapterName, sizeof(ifname)); -# endif - - if (address->OperStatus != IfOperStatusUp) { - addrflag |= ARES_IFACE_IP_OFFLINE; - } - - if (address->IfType == IF_TYPE_SOFTWARE_LOOPBACK) { - addrflag |= ARES_IFACE_IP_LOOPBACK; - } - - for (ipaddr = address->FirstUnicastAddress; ipaddr != NULL; - ipaddr = ipaddr->Next) { - struct ares_addr addr; - - if (ipaddr->Address.lpSockaddr->sa_family == AF_INET) { - const struct sockaddr_in *sockaddr_in = - (const struct sockaddr_in *)((void *)ipaddr->Address.lpSockaddr); - addr.family = AF_INET; - memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, - sizeof(addr.addr.addr4)); - } else if (ipaddr->Address.lpSockaddr->sa_family == AF_INET6) { - const struct sockaddr_in6 *sockaddr_in6 = - (const struct sockaddr_in6 *)((void *)ipaddr->Address.lpSockaddr); - addr.family = AF_INET6; - memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr, - sizeof(addr.addr.addr6)); - } else { - /* Unknown */ - continue; - } - - /* Sometimes windows may use numerics to indicate a DNS server's adapter, - * which corresponds to the index rather than the name. Check and - * validate both. */ - if (!name_match(name, ifname, address->Ipv6IfIndex)) { - continue; - } - - status = ares__iface_ips_add(ips, addrflag, ifname, &addr, - ipaddr->OnLinkPrefixLength /* netmask */, - address->Ipv6IfIndex /* ll_scope */); - - if (status != ARES_SUCCESS) { - goto done; - } - } - } - -done: - ares_free(addresses); - return status; -} - -#elif defined(HAVE_GETIFADDRS) - -static unsigned char count_addr_bits(const unsigned char *addr, size_t addr_len) -{ - size_t i; - unsigned char count = 0; - - for (i = 0; i < addr_len; i++) { - count += ares__count_bits_u8(addr[i]); - } - return count; -} - -static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips, - const char *name) -{ - struct ifaddrs *ifap = NULL; - struct ifaddrs *ifa = NULL; - ares_status_t status = ARES_SUCCESS; - - if (getifaddrs(&ifap) != 0) { - status = ARES_EFILE; - goto done; - } - - for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - ares__iface_ip_flags_t addrflag = 0; - struct ares_addr addr; - unsigned char netmask = 0; - unsigned int ll_scope = 0; - - if (ifa->ifa_addr == NULL) { - continue; - } - - if (!(ifa->ifa_flags & IFF_UP)) { - addrflag |= ARES_IFACE_IP_OFFLINE; - } - - if (ifa->ifa_flags & IFF_LOOPBACK) { - addrflag |= ARES_IFACE_IP_LOOPBACK; - } - - if (ifa->ifa_addr->sa_family == AF_INET) { - const struct sockaddr_in *sockaddr_in = - (const struct sockaddr_in *)((void *)ifa->ifa_addr); - addr.family = AF_INET; - memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, sizeof(addr.addr.addr4)); - /* netmask */ - sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask); - netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4); - } else if (ifa->ifa_addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *sockaddr_in6 = - (const struct sockaddr_in6 *)((void *)ifa->ifa_addr); - addr.family = AF_INET6; - memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr, - sizeof(addr.addr.addr6)); - /* netmask */ - sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask); - netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16); -# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID - ll_scope = sockaddr_in6->sin6_scope_id; -# endif - } else { - /* unknown */ - continue; - } - - /* Name mismatch */ - if (strcasecmp(ifa->ifa_name, name) != 0) { - continue; - } - - status = ares__iface_ips_add(ips, addrflag, ifa->ifa_name, &addr, netmask, - ll_scope); - if (status != ARES_SUCCESS) { - goto done; - } - } - -done: - freeifaddrs(ifap); - return status; -} - -#else - -static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips, - const char *name) -{ - (void)ips; - (void)name; - return ARES_ENOTIMP; -} - -#endif - - -unsigned int ares__if_nametoindex(const char *name) -{ -#ifdef HAVE_IF_NAMETOINDEX - return if_nametoindex(name); -#else - ares_status_t status; - ares__iface_ips_t *ips = NULL; - size_t i; - unsigned int index = 0; - - status = - ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, name); - if (status != ARES_SUCCESS) { - goto done; - } - - for (i = 0; i < ares__iface_ips_cnt(ips); i++) { - if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL) { - index = ares__iface_ips_get_ll_scope(ips, i); - goto done; - } - } - -done: - ares__iface_ips_destroy(ips); - return index; -#endif -} - -const char *ares__if_indextoname(unsigned int index, char *name, - size_t name_len) -{ -#ifdef HAVE_IF_INDEXTONAME - if (name_len < IF_NAMESIZE) { - return NULL; - } - return if_indextoname(index, name); -#else - ares_status_t status; - ares__iface_ips_t *ips = NULL; - size_t i; - const char *ptr = NULL; - - if (name_len < IF_NAMESIZE) { - goto done; - } - - if (index == 0) { - goto done; - } - - status = - ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, NULL); - if (status != ARES_SUCCESS) { - goto done; - } - - for (i = 0; i < ares__iface_ips_cnt(ips); i++) { - if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL && - ares__iface_ips_get_ll_scope(ips, i) == index) { - ares_strcpy(name, ares__iface_ips_get_name(ips, i), name_len); - ptr = name; - goto done; - } - } - -done: - ares__iface_ips_destroy(ips); - return ptr; -#endif -} diff --git a/deps/cares/src/lib/ares__iface_ips.h b/deps/cares/src/lib/ares__iface_ips.h deleted file mode 100644 index 61ff736a796361..00000000000000 --- a/deps/cares/src/lib/ares__iface_ips.h +++ /dev/null @@ -1,139 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__IFACE_IPS_H -#define __ARES__IFACE_IPS_H - -/*! Flags for interface ip addresses. */ -typedef enum { - ARES_IFACE_IP_V4 = 1 << 0, /*!< IPv4 address. During enumeration if - * this flag is set ARES_IFACE_IP_V6 - * is not, will only enumerate v4 - * addresses. */ - ARES_IFACE_IP_V6 = 1 << 1, /*!< IPv6 address. During enumeration if - * this flag is set ARES_IFACE_IP_V4 - * is not, will only enumerate v6 - * addresses. */ - ARES_IFACE_IP_LOOPBACK = 1 << 2, /*!< Loopback adapter */ - ARES_IFACE_IP_OFFLINE = 1 << 3, /*!< Adapter offline */ - ARES_IFACE_IP_LINKLOCAL = 1 << 4, /*!< Link-local ip address */ - /*! Default, enumerate all ips for online interfaces, including loopback */ - ARES_IFACE_IP_DEFAULT = (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6 | - ARES_IFACE_IP_LOOPBACK | ARES_IFACE_IP_LINKLOCAL) -} ares__iface_ip_flags_t; - -struct ares__iface_ips; - -/*! Opaque pointer for holding enumerated interface ip addresses */ -typedef struct ares__iface_ips ares__iface_ips_t; - -/*! Destroy ip address enumeration created by ares__iface_ips(). - * - * \param[in] ips Initialized IP address enumeration structure - */ -void ares__iface_ips_destroy(ares__iface_ips_t *ips); - -/*! Enumerate ip addresses on interfaces - * - * \param[out] ips Returns initialized ip address structure - * \param[in] flags Flags for enumeration - * \param[in] name Interface name to enumerate, or NULL to enumerate all - * \return ARES_ENOMEM on out of memory, ARES_ENOTIMP if not supported on - * the system, ARES_SUCCESS on success - */ -ares_status_t ares__iface_ips(ares__iface_ips_t **ips, - ares__iface_ip_flags_t flags, const char *name); - -/*! Count of ips enumerated - * - * \param[in] ips Initialized IP address enumeration structure - * \return count - */ -size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips); - -/*! Retrieve interface name - * - * \param[in] ips Initialized IP address enumeration structure - * \param[in] idx Index of entry to pull - * \return interface name - */ -const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx); - -/*! Retrieve interface address - * - * \param[in] ips Initialized IP address enumeration structure - * \param[in] idx Index of entry to pull - * \return interface address - */ -const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips, - size_t idx); - -/*! Retrieve interface address flags - * - * \param[in] ips Initialized IP address enumeration structure - * \param[in] idx Index of entry to pull - * \return interface address flags - */ -ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips, - size_t idx); - -/*! Retrieve interface address netmask - * - * \param[in] ips Initialized IP address enumeration structure - * \param[in] idx Index of entry to pull - * \return interface address netmask - */ -unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips, - size_t idx); - -/*! Retrieve interface ipv6 link local scope - * - * \param[in] ips Initialized IP address enumeration structure - * \param[in] idx Index of entry to pull - * \return interface ipv6 link local scope - */ -unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips, - size_t idx); - - -/*! Retrieve the interface index (aka link local scope) from the interface - * name. - * - * \param[in] name Interface name - * \return 0 on failure, index otherwise - */ -unsigned int ares__if_nametoindex(const char *name); - -/*! Retrieves the interface name from the index (aka link local scope) - * - * \param[in] index Interface index (> 0) - * \param[in] name Buffer to hold name - * \param[in] name_len Length of provided buffer, must be at least IF_NAMESIZE - * \return NULL on failure, or pointer to name on success - */ -const char *ares__if_indextoname(unsigned int index, char *name, - size_t name_len); - -#endif diff --git a/deps/cares/src/lib/ares__llist.c b/deps/cares/src/lib/ares__llist.c deleted file mode 100644 index d175da2bd3baf6..00000000000000 --- a/deps/cares/src/lib/ares__llist.c +++ /dev/null @@ -1,360 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__llist.h" - -struct ares__llist { - ares__llist_node_t *head; - ares__llist_node_t *tail; - ares__llist_destructor_t destruct; - size_t cnt; -}; - -struct ares__llist_node { - void *data; - ares__llist_node_t *prev; - ares__llist_node_t *next; - ares__llist_t *parent; -}; - -ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct) -{ - ares__llist_t *list = ares_malloc_zero(sizeof(*list)); - - if (list == NULL) { - return NULL; - } - - list->destruct = destruct; - - return list; -} - -void ares__llist_replace_destructor(ares__llist_t *list, - ares__llist_destructor_t destruct) -{ - if (list == NULL) { - return; - } - - list->destruct = destruct; -} - -typedef enum { - ARES__LLIST_INSERT_HEAD, - ARES__LLIST_INSERT_TAIL, - ARES__LLIST_INSERT_BEFORE -} ares__llist_insert_type_t; - -static void ares__llist_attach_at(ares__llist_t *list, - ares__llist_insert_type_t type, - ares__llist_node_t *at, - ares__llist_node_t *node) -{ - if (list == NULL || node == NULL) { - return; - } - - node->parent = list; - - if (type == ARES__LLIST_INSERT_BEFORE && (at == list->head || at == NULL)) { - type = ARES__LLIST_INSERT_HEAD; - } - - switch (type) { - case ARES__LLIST_INSERT_HEAD: - node->next = list->head; - node->prev = NULL; - if (list->head) { - list->head->prev = node; - } - list->head = node; - break; - case ARES__LLIST_INSERT_TAIL: - node->next = NULL; - node->prev = list->tail; - if (list->tail) { - list->tail->next = node; - } - list->tail = node; - break; - case ARES__LLIST_INSERT_BEFORE: - node->next = at; - node->prev = at->prev; - at->prev = node; - break; - } - if (list->tail == NULL) { - list->tail = node; - } - if (list->head == NULL) { - list->head = node; - } - - list->cnt++; -} - -static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list, - ares__llist_insert_type_t type, - ares__llist_node_t *at, - void *val) -{ - ares__llist_node_t *node = NULL; - - if (list == NULL || val == NULL) { - return NULL; - } - - node = ares_malloc_zero(sizeof(*node)); - - if (node == NULL) { - return NULL; - } - - node->data = val; - ares__llist_attach_at(list, type, at, node); - - return node; -} - -ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val) -{ - return ares__llist_insert_at(list, ARES__LLIST_INSERT_HEAD, NULL, val); -} - -ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val) -{ - return ares__llist_insert_at(list, ARES__LLIST_INSERT_TAIL, NULL, val); -} - -ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node, - void *val) -{ - if (node == NULL) { - return NULL; - } - - return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, node, - val); -} - -ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node, - void *val) -{ - if (node == NULL) { - return NULL; - } - - if (node->next == NULL) { - return ares__llist_insert_last(node->parent, val); - } - - return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, - node->next, val); -} - -ares__llist_node_t *ares__llist_node_first(ares__llist_t *list) -{ - if (list == NULL) { - return NULL; - } - return list->head; -} - -ares__llist_node_t *ares__llist_node_last(ares__llist_t *list) -{ - if (list == NULL) { - return NULL; - } - return list->tail; -} - -ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->next; -} - -ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->prev; -} - -void *ares__llist_node_val(ares__llist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - - return node->data; -} - -size_t ares__llist_len(const ares__llist_t *list) -{ - if (list == NULL) { - return 0; - } - return list->cnt; -} - -ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->parent; -} - -void *ares__llist_first_val(ares__llist_t *list) -{ - return ares__llist_node_val(ares__llist_node_first(list)); -} - -void *ares__llist_last_val(ares__llist_t *list) -{ - return ares__llist_node_val(ares__llist_node_last(list)); -} - -static void ares__llist_node_detach(ares__llist_node_t *node) -{ - ares__llist_t *list; - - if (node == NULL) { - return; - } - - list = node->parent; - - if (node->prev) { - node->prev->next = node->next; - } - - if (node->next) { - node->next->prev = node->prev; - } - - if (node == list->head) { - list->head = node->next; - } - - if (node == list->tail) { - list->tail = node->prev; - } - - node->parent = NULL; - list->cnt--; -} - -void *ares__llist_node_claim(ares__llist_node_t *node) -{ - void *val; - - if (node == NULL) { - return NULL; - } - - val = node->data; - ares__llist_node_detach(node); - ares_free(node); - - return val; -} - -void ares__llist_node_destroy(ares__llist_node_t *node) -{ - ares__llist_destructor_t destruct; - void *val; - - if (node == NULL) { - return; - } - - destruct = node->parent->destruct; - - val = ares__llist_node_claim(node); - if (val != NULL && destruct != NULL) { - destruct(val); - } -} - -void ares__llist_node_replace(ares__llist_node_t *node, void *val) -{ - ares__llist_destructor_t destruct; - - if (node == NULL) { - return; - } - - destruct = node->parent->destruct; - if (destruct != NULL) { - destruct(node->data); - } - - node->data = val; -} - -void ares__llist_destroy(ares__llist_t *list) -{ - ares__llist_node_t *node; - - if (list == NULL) { - return; - } - - while ((node = ares__llist_node_first(list)) != NULL) { - ares__llist_node_destroy(node); - } - ares_free(list); -} - -void ares__llist_node_move_parent_last(ares__llist_node_t *node, - ares__llist_t *new_parent) -{ - if (node == NULL || new_parent == NULL) { - return; - } - - ares__llist_node_detach(node); - ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_TAIL, NULL, node); -} - -void ares__llist_node_move_parent_first(ares__llist_node_t *node, - ares__llist_t *new_parent) -{ - if (node == NULL || new_parent == NULL) { - return; - } - - ares__llist_node_detach(node); - ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_HEAD, NULL, node); -} diff --git a/deps/cares/src/lib/ares__llist.h b/deps/cares/src/lib/ares__llist.h deleted file mode 100644 index 7d57bdab3b077c..00000000000000 --- a/deps/cares/src/lib/ares__llist.h +++ /dev/null @@ -1,220 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__LLIST_H -#define __ARES__LLIST_H - -/*! \addtogroup ares__llist LinkedList Data Structure - * - * This is a doubly-linked list data structure. - * - * Average time complexity: - * - Insert: O(1) -- head or tail - * - Search: O(n) - * - Delete: O(1) -- delete assumes you hold a node pointer - * - * @{ - */ - -struct ares__llist; - -/*! Opaque data structure for linked list */ -typedef struct ares__llist ares__llist_t; - -struct ares__llist_node; - -/*! Opaque data structure for a node in a linked list */ -typedef struct ares__llist_node ares__llist_node_t; - -/*! Callback to free user-defined node data - * - * \param[in] data user supplied data - */ -typedef void (*ares__llist_destructor_t)(void *data); - -/*! Create a linked list object - * - * \param[in] destruct Optional. Destructor to call on all removed nodes - * \return linked list object or NULL on out of memory - */ -ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct); - -/*! Replace destructor for linked list nodes. Typically this is used - * when wanting to disable the destructor by using NULL. - * - * \param[in] list Initialized linked list object - * \param[in] destruct replacement destructor, NULL is allowed - */ -void ares__llist_replace_destructor(ares__llist_t *list, - ares__llist_destructor_t destruct); - -/*! Insert value as the first node in the linked list - * - * \param[in] list Initialized linked list object - * \param[in] val user-supplied value. - * \return node object referencing place in list, or null if out of memory or - * misuse - */ -ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val); - -/*! Insert value as the last node in the linked list - * - * \param[in] list Initialized linked list object - * \param[in] val user-supplied value. - * \return node object referencing place in list, or null if out of memory or - * misuse - */ -ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val); - -/*! Insert value before specified node in the linked list - * - * \param[in] node node referenced to insert before - * \param[in] val user-supplied value. - * \return node object referencing place in list, or null if out of memory or - * misuse - */ -ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node, - void *val); - -/*! Insert value after specified node in the linked list - * - * \param[in] node node referenced to insert after - * \param[in] val user-supplied value. - * \return node object referencing place in list, or null if out of memory or - * misuse - */ -ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node, - void *val); - -/*! Obtain first node in list - * - * \param[in] list Initialized list object - * \return first node in list or NULL if none - */ -ares__llist_node_t *ares__llist_node_first(ares__llist_t *list); - -/*! Obtain last node in list - * - * \param[in] list Initialized list object - * \return last node in list or NULL if none - */ -ares__llist_node_t *ares__llist_node_last(ares__llist_t *list); - -/*! Obtain next node in respect to specified node - * - * \param[in] node Node referenced - * \return node or NULL if none - */ -ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node); - -/*! Obtain previous node in respect to specified node - * - * \param[in] node Node referenced - * \return node or NULL if none - */ -ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node); - -/*! Obtain value from node - * - * \param[in] node Node referenced - * \return user provided value from node - */ -void *ares__llist_node_val(ares__llist_node_t *node); - -/*! Obtain the number of entries in the list - * - * \param[in] list Initialized list object - * \return count - */ -size_t ares__llist_len(const ares__llist_t *list); - -/*! Obtain list object from referenced node - * - * \param[in] node Node referenced - * \return list object node belongs to - */ -ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node); - -/*! Obtain the first user-supplied value in the list - * - * \param[in] list Initialized list object - * \return first user supplied value or NULL if none - */ -void *ares__llist_first_val(ares__llist_t *list); - -/*! Obtain the last user-supplied value in the list - * - * \param[in] list Initialized list object - * \return last user supplied value or NULL if none - */ -void *ares__llist_last_val(ares__llist_t *list); - -/*! Take ownership of user-supplied value in list without calling destructor. - * Will unchain entry from list. - * - * \param[in] node Node referenced - * \return user supplied value - */ -void *ares__llist_node_claim(ares__llist_node_t *node); - -/*! Replace user-supplied value for node - * - * \param[in] node Node referenced - * \param[in] val new user-supplied value - */ -void ares__llist_node_replace(ares__llist_node_t *node, void *val); - -/*! Destroy the node, removing it from the list and calling destructor. - * - * \param[in] node Node referenced - */ -void ares__llist_node_destroy(ares__llist_node_t *node); - -/*! Destroy the list object and all nodes in the list. - * - * \param[in] list Initialized list object - */ -void ares__llist_destroy(ares__llist_t *list); - -/*! Detach node from the current list and re-attach it to the new list as the - * last entry. - * - * \param[in] node node to move - * \param[in] new_parent new list - */ -void ares__llist_node_move_parent_last(ares__llist_node_t *node, - ares__llist_t *new_parent); - -/*! Detach node from the current list and re-attach it to the new list as the - * first entry. - * - * \param[in] node node to move - * \param[in] new_parent new list - */ -void ares__llist_node_move_parent_first(ares__llist_node_t *node, - ares__llist_t *new_parent); -/*! @} */ - -#endif /* __ARES__LLIST_H */ diff --git a/deps/cares/src/lib/ares__parse_into_addrinfo.c b/deps/cares/src/lib/ares__parse_into_addrinfo.c deleted file mode 100644 index 90e951c02f3f6d..00000000000000 --- a/deps/cares/src/lib/ares__parse_into_addrinfo.c +++ /dev/null @@ -1,181 +0,0 @@ -/* MIT License - * - * Copyright (c) 2019 Andrew Selivanov - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif - -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif - -#ifdef HAVE_LIMITS_H -# include <limits.h> -#endif - -#include "ares.h" -#include "ares_private.h" - -ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec, - ares_bool_t cname_only_is_enodata, - unsigned short port, - struct ares_addrinfo *ai) -{ - ares_status_t status; - size_t i; - size_t ancount; - const char *hostname = NULL; - ares_bool_t got_a = ARES_FALSE; - ares_bool_t got_aaaa = ARES_FALSE; - ares_bool_t got_cname = ARES_FALSE; - struct ares_addrinfo_cname *cnames = NULL; - struct ares_addrinfo_node *nodes = NULL; - - /* Save question hostname */ - status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); - if (status != ARES_SUCCESS) { - goto done; - } - - ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); - if (ancount == 0) { - status = ARES_ENODATA; - goto done; - } - - for (i = 0; i < ancount; i++) { - ares_dns_rec_type_t rtype; - const ares_dns_rr_t *rr = - ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i); - - if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { - continue; - } - - rtype = ares_dns_rr_get_type(rr); - - /* Issue #683 - * Old code did this hostname sanity check, however it appears this is - * flawed logic. Other resolvers don't do this sanity check. Leaving - * this code commented out for future reference. - * - * rname = ares_dns_rr_get_name(rr); - * if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) && - * strcasecmp(rname, hostname) != 0) { - * continue; - * } - */ - - if (rtype == ARES_REC_TYPE_CNAME) { - struct ares_addrinfo_cname *cname; - - got_cname = ARES_TRUE; - /* replace hostname with data from cname - * SA: Seems wrong as it introduces order dependency. */ - hostname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME); - - cname = ares__append_addrinfo_cname(&cnames); - if (cname == NULL) { - status = ARES_ENOMEM; - goto done; - } - cname->ttl = (int)ares_dns_rr_get_ttl(rr); - cname->alias = ares_strdup(ares_dns_rr_get_name(rr)); - if (cname->alias == NULL) { - status = ARES_ENOMEM; - goto done; - } - cname->name = ares_strdup(hostname); - if (cname->name == NULL) { - status = ARES_ENOMEM; - goto done; - } - } else if (rtype == ARES_REC_TYPE_A) { - got_a = ARES_TRUE; - status = - ares_append_ai_node(AF_INET, port, ares_dns_rr_get_ttl(rr), - ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR), &nodes); - if (status != ARES_SUCCESS) { - goto done; - } - } else if (rtype == ARES_REC_TYPE_AAAA) { - got_aaaa = ARES_TRUE; - status = ares_append_ai_node(AF_INET6, port, ares_dns_rr_get_ttl(rr), - ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR), - &nodes); - if (status != ARES_SUCCESS) { - goto done; - } - } else { - continue; - } - } - - if (!got_a && !got_aaaa && - (!got_cname || (got_cname && cname_only_is_enodata))) { - status = ARES_ENODATA; - goto done; - } - - /* save the hostname as ai->name */ - if (ai->name == NULL || strcasecmp(ai->name, hostname) != 0) { - ares_free(ai->name); - ai->name = ares_strdup(hostname); - if (ai->name == NULL) { - status = ARES_ENOMEM; - goto done; - } - } - - if (got_a || got_aaaa) { - ares__addrinfo_cat_nodes(&ai->nodes, nodes); - nodes = NULL; - } - - if (got_cname) { - ares__addrinfo_cat_cnames(&ai->cnames, cnames); - cnames = NULL; - } - -done: - ares__freeaddrinfo_cnames(cnames); - ares__freeaddrinfo_nodes(nodes); - - /* compatibility */ - if (status == ARES_EBADNAME) { - status = ARES_EBADRESP; - } - - return status; -} diff --git a/deps/cares/src/lib/ares__slist.c b/deps/cares/src/lib/ares__slist.c deleted file mode 100644 index 5b8098435513ae..00000000000000 --- a/deps/cares/src/lib/ares__slist.c +++ /dev/null @@ -1,479 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares__slist.h" - -/* SkipList implementation */ - -#define ARES__SLIST_START_LEVELS 4 - -struct ares__slist { - ares_rand_state *rand_state; - unsigned char rand_data[8]; - size_t rand_bits; - - ares__slist_node_t **head; - size_t levels; - ares__slist_node_t *tail; - - ares__slist_cmp_t cmp; - ares__slist_destructor_t destruct; - size_t cnt; -}; - -struct ares__slist_node { - void *data; - ares__slist_node_t **prev; - ares__slist_node_t **next; - size_t levels; - ares__slist_t *parent; -}; - -ares__slist_t *ares__slist_create(ares_rand_state *rand_state, - ares__slist_cmp_t cmp, - ares__slist_destructor_t destruct) -{ - ares__slist_t *list; - - if (rand_state == NULL || cmp == NULL) { - return NULL; - } - - list = ares_malloc_zero(sizeof(*list)); - - if (list == NULL) { - return NULL; - } - - list->rand_state = rand_state; - list->cmp = cmp; - list->destruct = destruct; - - list->levels = ARES__SLIST_START_LEVELS; - list->head = ares_malloc_zero(sizeof(*list->head) * list->levels); - if (list->head == NULL) { - ares_free(list); - return NULL; - } - - return list; -} - -static ares_bool_t ares__slist_coin_flip(ares__slist_t *list) -{ - size_t total_bits = sizeof(list->rand_data) * 8; - size_t bit; - - /* Refill random data used for coin flips. We pull this in 8 byte chunks. - * ares__rand_bytes() has some built-in caching of its own so we don't need - * to be excessive in caching ourselves. Prefer to require less memory per - * skiplist */ - if (list->rand_bits == 0) { - ares__rand_bytes(list->rand_state, list->rand_data, - sizeof(list->rand_data)); - list->rand_bits = total_bits; - } - - bit = total_bits - list->rand_bits; - list->rand_bits--; - - return (list->rand_data[bit / 8] & (1 << (bit % 8))) ? ARES_TRUE : ARES_FALSE; -} - -void ares__slist_replace_destructor(ares__slist_t *list, - ares__slist_destructor_t destruct) -{ - if (list == NULL) { - return; - } - - list->destruct = destruct; -} - -static size_t ares__slist_max_level(const ares__slist_t *list) -{ - size_t max_level = 0; - - if (list->cnt + 1 <= (1 << ARES__SLIST_START_LEVELS)) { - max_level = ARES__SLIST_START_LEVELS; - } else { - max_level = ares__log2(ares__round_up_pow2(list->cnt + 1)); - } - - if (list->levels > max_level) { - max_level = list->levels; - } - - return max_level; -} - -static size_t ares__slist_calc_level(ares__slist_t *list) -{ - size_t max_level = ares__slist_max_level(list); - size_t level; - - for (level = 1; ares__slist_coin_flip(list) && level < max_level; level++) - ; - - return level; -} - -static void ares__slist_node_push(ares__slist_t *list, ares__slist_node_t *node) -{ - size_t i; - ares__slist_node_t *left = NULL; - - /* Scan from highest level in the slist, even if we're not using that number - * of levels for this entry as this is what makes it O(log n) */ - for (i = list->levels; i-- > 0;) { - /* set left if left is NULL and the current node value is greater than the - * head at this level */ - if (left == NULL && list->head[i] != NULL && - list->cmp(node->data, list->head[i]->data) > 0) { - left = list->head[i]; - } - - if (left != NULL) { - /* scan forward to find our insertion point */ - while (left->next[i] != NULL && - list->cmp(node->data, left->next[i]->data) > 0) { - left = left->next[i]; - } - } - - /* search only as we didn't randomly select this number of levels */ - if (i >= node->levels) { - continue; - } - - if (left == NULL) { - /* head insertion */ - node->next[i] = list->head[i]; - node->prev[i] = NULL; - list->head[i] = node; - } else { - /* Chain */ - node->next[i] = left->next[i]; - node->prev[i] = left; - left->next[i] = node; - } - - if (node->next[i] != NULL) { - /* chain prev */ - node->next[i]->prev[i] = node; - } else { - if (i == 0) { - /* update tail */ - list->tail = node; - } - } - } -} - -ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val) -{ - ares__slist_node_t *node = NULL; - - if (list == NULL || val == NULL) { - return NULL; - } - - node = ares_malloc_zero(sizeof(*node)); - - if (node == NULL) { - goto fail; - } - - node->data = val; - node->parent = list; - - /* Randomly determine the number of levels we want to use */ - node->levels = ares__slist_calc_level(list); - - /* Allocate array of next and prev nodes for linking each level */ - node->next = ares_malloc_zero(sizeof(*node->next) * node->levels); - if (node->next == NULL) { - goto fail; - } - - node->prev = ares_malloc_zero(sizeof(*node->prev) * node->levels); - if (node->prev == NULL) { - goto fail; - } - - /* If the number of levels is greater than we currently support in the slist, - * increase the count */ - if (list->levels < node->levels) { - void *ptr = - ares_realloc_zero(list->head, sizeof(*list->head) * list->levels, - sizeof(*list->head) * node->levels); - if (ptr == NULL) { - goto fail; - } - - list->head = ptr; - list->levels = node->levels; - } - - ares__slist_node_push(list, node); - - list->cnt++; - - return node; - -fail: - if (node) { - ares_free(node->prev); - ares_free(node->next); - ares_free(node); - } - return NULL; -} - -static void ares__slist_node_pop(ares__slist_node_t *node) -{ - ares__slist_t *list = node->parent; - size_t i; - - /* relink each node at each level */ - for (i = node->levels; i-- > 0;) { - if (node->next[i] == NULL) { - if (i == 0) { - list->tail = node->prev[0]; - } - } else { - node->next[i]->prev[i] = node->prev[i]; - } - - if (node->prev[i] == NULL) { - list->head[i] = node->next[i]; - } else { - node->prev[i]->next[i] = node->next[i]; - } - } - - memset(node->next, 0, sizeof(*node->next) * node->levels); - memset(node->prev, 0, sizeof(*node->prev) * node->levels); -} - -void *ares__slist_node_claim(ares__slist_node_t *node) -{ - ares__slist_t *list; - void *val; - - if (node == NULL) { - return NULL; - } - - list = node->parent; - val = node->data; - - ares__slist_node_pop(node); - - ares_free(node->next); - ares_free(node->prev); - ares_free(node); - - list->cnt--; - - return val; -} - -void ares__slist_node_reinsert(ares__slist_node_t *node) -{ - ares__slist_t *list; - - if (node == NULL) { - return; - } - - list = node->parent; - - ares__slist_node_pop(node); - ares__slist_node_push(list, node); -} - -ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val) -{ - size_t i; - ares__slist_node_t *node = NULL; - int rv = -1; - - if (list == NULL || val == NULL) { - return NULL; - } - - /* Scan nodes starting at the highest level. For each level scan forward - * until the value is between the prior and next node, or if equal quit - * as we found a match */ - for (i = list->levels; i-- > 0;) { - if (node == NULL) { - node = list->head[i]; - } - - if (node == NULL) { - continue; - } - - do { - rv = list->cmp(val, node->data); - - if (rv < 0) { - /* back off, our value is greater than current node reference */ - node = node->prev[i]; - } else if (rv > 0) { - /* move forward and try again. if it goes past, it will loop again and - * go to previous entry */ - node = node->next[i]; - } - - /* rv == 0 will terminate loop */ - - } while (node != NULL && rv > 0); - - /* Found a match, no need to continue */ - if (rv == 0) { - break; - } - } - - /* no match */ - if (rv != 0) { - return NULL; - } - - /* The list may have multiple entries that match. They're guaranteed to be - * in order, but we're not guaranteed to have selected the _first_ matching - * node. Lets scan backwards to find the first match */ - while (node->prev[0] != NULL && list->cmp(node->prev[0]->data, val) == 0) { - node = node->prev[0]; - } - - return node; -} - -ares__slist_node_t *ares__slist_node_first(ares__slist_t *list) -{ - if (list == NULL) { - return NULL; - } - - return list->head[0]; -} - -ares__slist_node_t *ares__slist_node_last(ares__slist_t *list) -{ - if (list == NULL) { - return NULL; - } - return list->tail; -} - -ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->next[0]; -} - -ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->prev[0]; -} - -void *ares__slist_node_val(ares__slist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - - return node->data; -} - -size_t ares__slist_len(const ares__slist_t *list) -{ - if (list == NULL) { - return 0; - } - return list->cnt; -} - -ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node) -{ - if (node == NULL) { - return NULL; - } - return node->parent; -} - -void *ares__slist_first_val(ares__slist_t *list) -{ - return ares__slist_node_val(ares__slist_node_first(list)); -} - -void *ares__slist_last_val(ares__slist_t *list) -{ - return ares__slist_node_val(ares__slist_node_last(list)); -} - -void ares__slist_node_destroy(ares__slist_node_t *node) -{ - ares__slist_destructor_t destruct; - void *val; - - if (node == NULL) { - return; - } - - destruct = node->parent->destruct; - val = ares__slist_node_claim(node); - - if (val != NULL && destruct != NULL) { - destruct(val); - } -} - -void ares__slist_destroy(ares__slist_t *list) -{ - ares__slist_node_t *node; - - if (list == NULL) { - return; - } - - while ((node = ares__slist_node_first(list)) != NULL) { - ares__slist_node_destroy(node); - } - - ares_free(list->head); - ares_free(list); -} diff --git a/deps/cares/src/lib/ares__slist.h b/deps/cares/src/lib/ares__slist.h deleted file mode 100644 index 26af88fa782499..00000000000000 --- a/deps/cares/src/lib/ares__slist.h +++ /dev/null @@ -1,206 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__SLIST_H -#define __ARES__SLIST_H - - -/*! \addtogroup ares__slist SkipList Data Structure - * - * This data structure is known as a Skip List, which in essence is a sorted - * linked list with multiple levels of linkage to gain some algorithmic - * advantages. The usage symantecs are almost identical to what you'd expect - * with a linked list. - * - * Average time complexity: - * - Insert: O(log n) - * - Search: O(log n) - * - Delete: O(1) -- delete assumes you hold a node pointer - * - * It should be noted, however, that "effort" involved with an insert or - * remove operation is higher than a normal linked list. For very small - * lists this may be less efficient, but for any list with a moderate number - * of entries this will prove much more efficient. - * - * This data structure is often compared with a Binary Search Tree in - * functionality and usage. - * - * @{ - */ -struct ares__slist; - -/*! SkipList Object, opaque */ -typedef struct ares__slist ares__slist_t; - -struct ares__slist_node; - -/*! SkipList Node Object, opaque */ -typedef struct ares__slist_node ares__slist_node_t; - -/*! SkipList Node Value destructor callback - * - * \param[in] data User-defined data to destroy - */ -typedef void (*ares__slist_destructor_t)(void *data); - -/*! SkipList comparison function - * - * \param[in] data1 First user-defined data object - * \param[in] data2 Second user-defined data object - * \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2 - */ -typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2); - -/*! Create SkipList - * - * \param[in] rand_state Initialized ares random state. - * \param[in] cmp SkipList comparison function - * \param[in] destruct SkipList Node Value Destructor. Optional, use NULL. - * \return Initialized SkipList Object or NULL on misuse or ENOMEM - */ -ares__slist_t *ares__slist_create(ares_rand_state *rand_state, - ares__slist_cmp_t cmp, - ares__slist_destructor_t destruct); - -/*! Replace SkipList Node Value Destructor - * - * \param[in] list Initialized SkipList Object - * \param[in] destruct Replacement destructor. May be NULL. - */ -void ares__slist_replace_destructor(ares__slist_t *list, - ares__slist_destructor_t destruct); - -/*! Insert Value into SkipList - * - * \param[in] list Initialized SkipList Object - * \param[in] val Node Value. Must not be NULL. Function takes ownership - * and will have destructor called. - * \return SkipList Node Object or NULL on misuse or ENOMEM - */ -ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val); - -/*! Fetch first node in SkipList - * - * \param[in] list Initialized SkipList Object - * \return SkipList Node Object or NULL if none - */ -ares__slist_node_t *ares__slist_node_first(ares__slist_t *list); - -/*! Fetch last node in SkipList - * - * \param[in] list Initialized SkipList Object - * \return SkipList Node Object or NULL if none - */ -ares__slist_node_t *ares__slist_node_last(ares__slist_t *list); - -/*! Fetch next node in SkipList - * - * \param[in] node SkipList Node Object - * \return SkipList Node Object or NULL if none - */ -ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node); - -/*! Fetch previous node in SkipList - * - * \param[in] node SkipList Node Object - * \return SkipList Node Object or NULL if none - */ -ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node); - -/*! Fetch SkipList Node Object by Value - * - * \param[in] list Initialized SkipList Object - * \param[in] val Object to use for comparison - * \return SkipList Node Object or NULL if not found - */ -ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val); - - -/*! Fetch Node Value - * - * \param[in] node SkipList Node Object - * \return user defined node value - */ -void *ares__slist_node_val(ares__slist_node_t *node); - -/*! Fetch number of entries in SkipList Object - * - * \param[in] list Initialized SkipList Object - * \return number of entries - */ -size_t ares__slist_len(const ares__slist_t *list); - -/*! Fetch SkipList Object from SkipList Node - * - * \param[in] node SkipList Node Object - * \return SkipList Object - */ -ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node); - -/*! Fetch first Node Value in SkipList - * - * \param[in] list Initialized SkipList Object - * \return user defined node value or NULL if none - */ -void *ares__slist_first_val(ares__slist_t *list); - -/*! Fetch last Node Value in SkipList - * - * \param[in] list Initialized SkipList Object - * \return user defined node value or NULL if none - */ -void *ares__slist_last_val(ares__slist_t *list); - -/*! Take back ownership of Node Value in SkipList, remove from SkipList. - * - * \param[in] node SkipList Node Object - * \return user defined node value - */ -void *ares__slist_node_claim(ares__slist_node_t *node); - -/*! The internals of the node have changed, thus its position in the sorted - * list is no longer valid. This function will remove it and re-add it to - * the proper position without needing to perform any memory allocations - * and thus cannot fail. - * - * \param[in] node SkipList Node Object - */ -void ares__slist_node_reinsert(ares__slist_node_t *node); - -/*! Remove Node from SkipList, calling destructor for Node Value. - * - * \param[in] node SkipList Node Object - */ -void ares__slist_node_destroy(ares__slist_node_t *node); - -/*! Destroy SkipList Object. If there are any nodes, they will be destroyed. - * - * \param[in] list Initialized SkipList Object - */ -void ares__slist_destroy(ares__slist_t *list); - -/*! @} */ - -#endif /* __ARES__SLIST_H */ diff --git a/deps/cares/src/lib/ares__socket.c b/deps/cares/src/lib/ares__socket.c deleted file mode 100644 index da03755a50db75..00000000000000 --- a/deps/cares/src/lib/ares__socket.c +++ /dev/null @@ -1,480 +0,0 @@ -/* MIT License - * - * Copyright (c) Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" - -#ifdef HAVE_SYS_UIO_H -# include <sys/uio.h> -#endif -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETINET_TCP_H -# include <netinet/tcp.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -# include <arpa/inet.h> -#endif - -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif -#ifdef HAVE_SYS_IOCTL_H -# include <sys/ioctl.h> -#endif -#ifdef NETWARE -# include <sys/filio.h> -#endif - -#include <assert.h> -#include <fcntl.h> -#include <limits.h> - -#include "ares.h" -#include "ares_private.h" - -ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s, - void *data, size_t data_len, int flags, - struct sockaddr *from, - ares_socklen_t *from_len) -{ - if (channel->sock_funcs && channel->sock_funcs->arecvfrom) { - return channel->sock_funcs->arecvfrom(s, data, data_len, flags, from, - from_len, channel->sock_func_cb_data); - } - -#ifdef HAVE_RECVFROM - return (ares_ssize_t)recvfrom(s, data, (RECVFROM_TYPE_ARG3)data_len, flags, - from, from_len); -#else - return sread(s, data, data_len); -#endif -} - -ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s, - void *data, size_t data_len) -{ - if (channel->sock_funcs && channel->sock_funcs->arecvfrom) { - return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0, - channel->sock_func_cb_data); - } - - /* sread() is a wrapper for read() or recv() depending on the system */ - return sread(s, data, data_len); -} - -/* - * setsocknonblock sets the given socket to either blocking or non-blocking - * mode based on the 'nonblock' boolean argument. This function is highly - * portable. - */ -static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ - int nonblock /* TRUE or FALSE */) -{ -#if defined(USE_BLOCKING_SOCKETS) - - return 0; /* returns success */ - -#elif defined(HAVE_FCNTL_O_NONBLOCK) - - /* most recent unix versions */ - int flags; - flags = fcntl(sockfd, F_GETFL, 0); - if (nonblock) { - return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); - } else { - return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */ - } - -#elif defined(HAVE_IOCTL_FIONBIO) - - /* older unix versions */ - int flags = nonblock ? 1 : 0; - return ioctl(sockfd, FIONBIO, &flags); - -#elif defined(HAVE_IOCTLSOCKET_FIONBIO) - -# ifdef WATT32 - char flags = nonblock ? 1 : 0; -# else - /* Windows */ - unsigned long flags = nonblock ? 1UL : 0UL; -# endif - return ioctlsocket(sockfd, (long)FIONBIO, &flags); - -#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) - - /* Amiga */ - long flags = nonblock ? 1L : 0L; - return IoctlSocket(sockfd, FIONBIO, flags); - -#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) - - /* BeOS */ - long b = nonblock ? 1L : 0L; - return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); - -#else -# error "no non-blocking method was found/used/set" -#endif -} - -#if defined(IPV6_V6ONLY) && defined(WIN32) -/* It makes support for IPv4-mapped IPv6 addresses. - * Linux kernel, NetBSD, FreeBSD and Darwin: default is off; - * Windows Vista and later: default is on; - * DragonFly BSD: acts like off, and dummy setting; - * OpenBSD and earlier Windows: unsupported. - * Linux: controlled by /proc/sys/net/ipv6/bindv6only. - */ -static void set_ipv6_v6only(ares_socket_t sockfd, int on) -{ - (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on)); -} -#else -# define set_ipv6_v6only(s, v) -#endif - -static int configure_socket(ares_socket_t s, struct server_state *server) -{ - union { - struct sockaddr sa; - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } local; - - ares_socklen_t bindlen = 0; - ares_channel_t *channel = server->channel; - - /* do not set options for user-managed sockets */ - if (channel->sock_funcs && channel->sock_funcs->asocket) { - return 0; - } - - (void)setsocknonblock(s, 1); - -#if defined(FD_CLOEXEC) && !defined(MSDOS) - /* Configure the socket fd as close-on-exec. */ - if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { - return -1; /* LCOV_EXCL_LINE */ - } -#endif - - /* Set the socket's send and receive buffer sizes. */ - if ((channel->socket_send_buffer_size > 0) && - setsockopt(s, SOL_SOCKET, SO_SNDBUF, - (void *)&channel->socket_send_buffer_size, - sizeof(channel->socket_send_buffer_size)) == -1) { - return -1; - } - - if ((channel->socket_receive_buffer_size > 0) && - setsockopt(s, SOL_SOCKET, SO_RCVBUF, - (void *)&channel->socket_receive_buffer_size, - sizeof(channel->socket_receive_buffer_size)) == -1) { - return -1; - } - -#ifdef SO_BINDTODEVICE - if (channel->local_dev_name[0] && - setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, channel->local_dev_name, - sizeof(channel->local_dev_name))) { - /* Only root can do this, and usually not fatal if it doesn't work, so */ - /* just continue on. */ - } -#endif - - if (server->addr.family == AF_INET && channel->local_ip4) { - memset(&local.sa4, 0, sizeof(local.sa4)); - local.sa4.sin_family = AF_INET; - local.sa4.sin_addr.s_addr = htonl(channel->local_ip4); - bindlen = sizeof(local.sa4); - } else if (server->addr.family == AF_INET6 && server->ll_scope == 0 && - memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8, - sizeof(channel->local_ip6)) != 0) { - /* Only if not link-local and an ip other than "::" is specified */ - memset(&local.sa6, 0, sizeof(local.sa6)); - local.sa6.sin6_family = AF_INET6; - memcpy(&local.sa6.sin6_addr, channel->local_ip6, - sizeof(channel->local_ip6)); - bindlen = sizeof(local.sa6); - } - - if (bindlen && bind(s, &local.sa, bindlen) < 0) { - return -1; - } - - if (server->addr.family == AF_INET6) { - set_ipv6_v6only(s, 0); - } - - return 0; -} - -ares_status_t ares__open_connection(ares_channel_t *channel, - struct server_state *server, - ares_bool_t is_tcp) -{ - ares_socket_t s; - int opt; - ares_socklen_t salen; - - union { - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } saddr; - struct sockaddr *sa; - struct server_connection *conn; - ares__llist_node_t *node; - int type = is_tcp ? SOCK_STREAM : SOCK_DGRAM; -#ifdef __OpenBSD__ - if ((is_tcp && server->tcp_port == 53) || - (!is_tcp && server->udp_port == 53)) { - type |= SOCK_DNS; - } -#endif - - switch (server->addr.family) { - case AF_INET: - sa = (void *)&saddr.sa4; - salen = sizeof(saddr.sa4); - memset(sa, 0, (size_t)salen); - saddr.sa4.sin_family = AF_INET; - saddr.sa4.sin_port = htons(is_tcp ? server->tcp_port : server->udp_port); - memcpy(&saddr.sa4.sin_addr, &server->addr.addr.addr4, - sizeof(saddr.sa4.sin_addr)); - break; - case AF_INET6: - sa = (void *)&saddr.sa6; - salen = sizeof(saddr.sa6); - memset(sa, 0, (size_t)salen); - saddr.sa6.sin6_family = AF_INET6; - saddr.sa6.sin6_port = htons(is_tcp ? server->tcp_port : server->udp_port); - memcpy(&saddr.sa6.sin6_addr, &server->addr.addr.addr6, - sizeof(saddr.sa6.sin6_addr)); -#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID - saddr.sa6.sin6_scope_id = server->ll_scope; -#endif - break; - default: - return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */ - } - - /* Acquire a socket. */ - s = ares__open_socket(channel, server->addr.family, type, 0); - if (s == ARES_SOCKET_BAD) { - return ARES_ECONNREFUSED; - } - - /* Configure it. */ - if (configure_socket(s, server) < 0) { - ares__close_socket(channel, s); - return ARES_ECONNREFUSED; - } - -#ifdef TCP_NODELAY - if (is_tcp) { - /* - * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not - * in configure_socket). In general, in DNS lookups we're pretty much - * interested in firing off a single request and then waiting for a reply, - * so batching isn't very interesting. - */ - opt = 1; - if ((!channel->sock_funcs || !channel->sock_funcs->asocket) && - setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt)) == - -1) { - ares__close_socket(channel, s); - return ARES_ECONNREFUSED; - } - } -#endif - - if (channel->sock_config_cb) { - int err = channel->sock_config_cb(s, type, channel->sock_config_cb_data); - if (err < 0) { - ares__close_socket(channel, s); - return ARES_ECONNREFUSED; - } - } - - /* Connect to the server. */ - if (ares__connect_socket(channel, s, sa, salen) == -1) { - int err = SOCKERRNO; - - if (err != EINPROGRESS && err != EWOULDBLOCK) { - ares__close_socket(channel, s); - return ARES_ECONNREFUSED; - } - } - - if (channel->sock_create_cb) { - int err = channel->sock_create_cb(s, type, channel->sock_create_cb_data); - if (err < 0) { - ares__close_socket(channel, s); - return ARES_ECONNREFUSED; - } - } - - conn = ares_malloc(sizeof(*conn)); - if (conn == NULL) { - ares__close_socket(channel, s); - return ARES_ENOMEM; - } - memset(conn, 0, sizeof(*conn)); - conn->fd = s; - conn->server = server; - conn->queries_to_conn = ares__llist_create(NULL); - conn->is_tcp = is_tcp; - if (conn->queries_to_conn == NULL) { - ares__close_socket(channel, s); - ares_free(conn); - return ARES_ENOMEM; - } - - /* TCP connections are thrown to the end as we don't spawn multiple TCP - * connections. UDP connections are put on front where the newest connection - * can be quickly pulled */ - if (is_tcp) { - node = ares__llist_insert_last(server->connections, conn); - } else { - node = ares__llist_insert_first(server->connections, conn); - } - if (node == NULL) { - ares__close_socket(channel, s); - ares__llist_destroy(conn->queries_to_conn); - ares_free(conn); - return ARES_ENOMEM; - } - - /* Register globally to quickly map event on file descriptor to connection - * node object */ - if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) { - ares__close_socket(channel, s); - ares__llist_destroy(conn->queries_to_conn); - ares__llist_node_claim(node); - ares_free(conn); - return ARES_ENOMEM; - } - - SOCK_STATE_CALLBACK(channel, s, 1, 0); - - if (is_tcp) { - server->tcp_conn = conn; - } - - return ARES_SUCCESS; -} - -ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type, - int protocol) -{ - if (channel->sock_funcs && channel->sock_funcs->asocket) { - return channel->sock_funcs->asocket(af, type, protocol, - channel->sock_func_cb_data); - } - - return socket(af, type, protocol); -} - -int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, - const struct sockaddr *addr, ares_socklen_t addrlen) -{ - if (channel->sock_funcs && channel->sock_funcs->aconnect) { - return channel->sock_funcs->aconnect(sockfd, addr, addrlen, - channel->sock_func_cb_data); - } - - return connect(sockfd, addr, addrlen); -} - -void ares__close_socket(ares_channel_t *channel, ares_socket_t s) -{ - if (s == ARES_SOCKET_BAD) { - return; - } - - if (channel->sock_funcs && channel->sock_funcs->aclose) { - channel->sock_funcs->aclose(s, channel->sock_func_cb_data); - } else { - sclose(s); - } -} - -#ifndef HAVE_WRITEV -/* Structure for scatter/gather I/O. */ -struct iovec { - void *iov_base; /* Pointer to data. */ - size_t iov_len; /* Length of data. */ -}; -#endif - -ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s, - const void *data, size_t len) -{ - if (channel->sock_funcs && channel->sock_funcs->asendv) { - struct iovec vec; - vec.iov_base = (void *)((size_t)data); /* Cast off const */ - vec.iov_len = len; - return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data); - } - return swrite(s, data, len); -} - -void ares_set_socket_callback(ares_channel_t *channel, - ares_sock_create_callback cb, void *data) -{ - if (channel == NULL) { - return; - } - channel->sock_create_cb = cb; - channel->sock_create_cb_data = data; -} - -void ares_set_socket_configure_callback(ares_channel_t *channel, - ares_sock_config_callback cb, - void *data) -{ - if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) { - return; - } - channel->sock_config_cb = cb; - channel->sock_config_cb_data = data; -} - -void ares_set_socket_functions(ares_channel_t *channel, - const struct ares_socket_functions *funcs, - void *data) -{ - if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) { - return; - } - channel->sock_funcs = funcs; - channel->sock_func_cb_data = data; -} diff --git a/deps/cares/src/lib/ares__sortaddrinfo.c b/deps/cares/src/lib/ares__sortaddrinfo.c deleted file mode 100644 index 155cc8caf4441d..00000000000000 --- a/deps/cares/src/lib/ares__sortaddrinfo.c +++ /dev/null @@ -1,452 +0,0 @@ -/* - * Original file name getaddrinfo.c - * Lifted from the 'Android Bionic' project with the BSD license. - */ - -/* - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. - * Copyright (C) 2018 The Android Open Source Project - * Copyright (C) 2019 Andrew Selivanov - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -#ifdef HAVE_NETDB_H -# include <netdb.h> -#endif -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif - -#include <assert.h> -#include <limits.h> - -#include "ares.h" -#include "ares_private.h" - -struct addrinfo_sort_elem { - struct ares_addrinfo_node *ai; - ares_bool_t has_src_addr; - ares_sockaddr src_addr; - size_t original_order; -}; - -#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) - -#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01 -#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 -#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02 -#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05 -#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08 -#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e - -#define ARES_IN_LOOPBACK(a) \ - ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000) - -/* RFC 4193. */ -#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc) - -/* These macros are modelled after the ones in <netinet/in6.h>. */ -/* RFC 4380, section 2.6 */ -#define ARES_IN6_IS_ADDR_TEREDO(a) \ - ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == \ - ntohl(0x20010000))) -/* RFC 3056, section 2. */ -#define ARES_IN6_IS_ADDR_6TO4(a) \ - (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) -/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ -#define ARES_IN6_IS_ADDR_6BONE(a) \ - (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) - -static int get_scope(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = - CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) { - return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr); - } else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) || - IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) { - /* - * RFC 4291 section 2.5.3 says loopback is to be treated as having - * link-local scope. - */ - return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; - } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { - return ARES_IPV6_ADDR_SCOPE_SITELOCAL; - } else { - return ARES_IPV6_ADDR_SCOPE_GLOBAL; - } - } else if (addr->sa_family == AF_INET) { - const struct sockaddr_in *addr4 = - CARES_INADDR_CAST(const struct sockaddr_in *, addr); - unsigned long int na = ntohl(addr4->sin_addr.s_addr); - if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */ - (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */ - { - return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; - } else { - /* - * RFC 6724 section 3.2. Other IPv4 addresses, including private - * addresses and shared addresses (100.64.0.0/10), are assigned global - * scope. - */ - return ARES_IPV6_ADDR_SCOPE_GLOBAL; - } - } else { - /* - * This should never happen. - * Return a scope with low priority as a last resort. - */ - return ARES_IPV6_ADDR_SCOPE_NODELOCAL; - } -} - -static int get_label(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) { - return 4; - } else if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = - CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 0; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 4; - } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 2; - } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { - return 5; - } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { - return 13; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { - return 3; - } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { - return 11; - } else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { - return 12; - } else { - /* All other IPv6 addresses, including global unicast addresses. */ - return 1; - } - } else { - /* - * This should never happen. - * Return a semi-random label as a last resort. - */ - return 1; - } -} - -/* - * Get the precedence for a given IPv4/IPv6 address. - * RFC 6724, section 2.1. - */ -static int get_precedence(const struct sockaddr *addr) -{ - if (addr->sa_family == AF_INET) { - return 35; - } else if (addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *addr6 = - CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); - if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { - return 50; - } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { - return 35; - } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { - return 30; - } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { - return 5; - } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { - return 3; - } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || - IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || - ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { - return 1; - } else { - /* All other IPv6 addresses, including global unicast addresses. */ - return 40; - } - } else { - return 1; - } -} - -/* - * Find number of matching initial bits between the two addresses a1 and a2. - */ -static size_t common_prefix_len(const struct in6_addr *a1, - const struct in6_addr *a2) -{ - const unsigned char *p1 = (const unsigned char *)a1; - const unsigned char *p2 = (const unsigned char *)a2; - size_t i; - for (i = 0; i < sizeof(*a1); ++i) { - unsigned char x; - size_t j; - if (p1[i] == p2[i]) { - continue; - } - x = p1[i] ^ p2[i]; - for (j = 0; j < CHAR_BIT; ++j) { - if (x & (1 << (CHAR_BIT - 1))) { - return i * CHAR_BIT + j; - } - x <<= 1; - } - } - return sizeof(*a1) * CHAR_BIT; -} - -/* - * Compare two source/destination address pairs. - * RFC 6724, section 6. - */ -static int rfc6724_compare(const void *ptr1, const void *ptr2) -{ - const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1; - const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2; - int scope_src1; - int scope_dst1; - int scope_match1; - int scope_src2; - int scope_dst2; - int scope_match2; - int label_src1; - int label_dst1; - int label_match1; - int label_src2; - int label_dst2; - int label_match2; - int precedence1; - int precedence2; - size_t prefixlen1; - size_t prefixlen2; - - /* Rule 1: Avoid unusable destinations. */ - if (a1->has_src_addr != a2->has_src_addr) { - return ((int)a2->has_src_addr) - ((int)a1->has_src_addr); - } - - /* Rule 2: Prefer matching scope. */ - scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; - if (a1->has_src_addr) { - scope_src1 = get_scope(&a1->src_addr.sa); - } - scope_dst1 = get_scope(a1->ai->ai_addr); - scope_match1 = (scope_src1 == scope_dst1); - - scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; - if (a2->has_src_addr) { - scope_src2 = get_scope(&a2->src_addr.sa); - } - scope_dst2 = get_scope(a2->ai->ai_addr); - scope_match2 = (scope_src2 == scope_dst2); - - if (scope_match1 != scope_match2) { - return scope_match2 - scope_match1; - } - - /* Rule 3: Avoid deprecated addresses. */ - - /* Rule 4: Prefer home addresses. */ - - /* Rule 5: Prefer matching label. */ - label_src1 = 1; - if (a1->has_src_addr) { - label_src1 = get_label(&a1->src_addr.sa); - } - label_dst1 = get_label(a1->ai->ai_addr); - label_match1 = (label_src1 == label_dst1); - - label_src2 = 1; - if (a2->has_src_addr) { - label_src2 = get_label(&a2->src_addr.sa); - } - label_dst2 = get_label(a2->ai->ai_addr); - label_match2 = (label_src2 == label_dst2); - - if (label_match1 != label_match2) { - return label_match2 - label_match1; - } - - /* Rule 6: Prefer higher precedence. */ - precedence1 = get_precedence(a1->ai->ai_addr); - precedence2 = get_precedence(a2->ai->ai_addr); - if (precedence1 != precedence2) { - return precedence2 - precedence1; - } - - /* Rule 7: Prefer native transport. */ - - /* Rule 8: Prefer smaller scope. */ - if (scope_dst1 != scope_dst2) { - return scope_dst1 - scope_dst2; - } - - /* Rule 9: Use longest matching prefix. */ - if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && - a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6; - const struct sockaddr_in6 *a1_dst = - CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr); - const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6; - const struct sockaddr_in6 *a2_dst = - CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr); - prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr); - prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr); - if (prefixlen1 != prefixlen2) { - return (int)prefixlen2 - (int)prefixlen1; - } - } - - /* - * Rule 10: Leave the order unchanged. - * We need this since qsort() is not necessarily stable. - */ - return ((int)a1->original_order) - ((int)a2->original_order); -} - -/* - * Find the source address that will be used if trying to connect to the given - * address. - * - * Returns 1 if a source address was found, 0 if the address is unreachable - * and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are - * undefined. - */ -static int find_src_addr(ares_channel_t *channel, const struct sockaddr *addr, - struct sockaddr *src_addr) -{ - ares_socket_t sock; - int ret; - ares_socklen_t len; - - switch (addr->sa_family) { - case AF_INET: - len = sizeof(struct sockaddr_in); - break; - case AF_INET6: - len = sizeof(struct sockaddr_in6); - break; - default: - /* No known usable source address for non-INET families. */ - return 0; - } - - sock = ares__open_socket(channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP); - if (sock == ARES_SOCKET_BAD) { - if (errno == EAFNOSUPPORT) { - return 0; - } else { - return -1; - } - } - - do { - ret = ares__connect_socket(channel, sock, addr, len); - } while (ret == -1 && errno == EINTR); - - if (ret == -1) { - ares__close_socket(channel, sock); - return 0; - } - - if (getsockname(sock, src_addr, &len) != 0) { - ares__close_socket(channel, sock); - return -1; - } - ares__close_socket(channel, sock); - return 1; -} - -/* - * Sort the linked list starting at sentinel->ai_next in RFC6724 order. - * Will leave the list unchanged if an error occurs. - */ -ares_status_t ares__sortaddrinfo(ares_channel_t *channel, - struct ares_addrinfo_node *list_sentinel) -{ - struct ares_addrinfo_node *cur; - size_t nelem = 0; - size_t i; - int has_src_addr; - struct addrinfo_sort_elem *elems; - - cur = list_sentinel->ai_next; - while (cur) { - ++nelem; - cur = cur->ai_next; - } - - if (!nelem) { - return ARES_ENODATA; - } - - elems = (struct addrinfo_sort_elem *)ares_malloc( - nelem * sizeof(struct addrinfo_sort_elem)); - if (!elems) { - return ARES_ENOMEM; - } - - /* - * Convert the linked list to an array that also contains the candidate - * source address for each destination address. - */ - for (i = 0, cur = list_sentinel->ai_next; i < nelem; - ++i, cur = cur->ai_next) { - assert(cur != NULL); - elems[i].ai = cur; - elems[i].original_order = i; - has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa); - if (has_src_addr == -1) { - ares_free(elems); - return ARES_ENOTFOUND; - } - elems[i].has_src_addr = (has_src_addr == 1) ? ARES_TRUE : ARES_FALSE; - } - - /* Sort the addresses, and rearrange the linked list so it matches the sorted - * order. */ - qsort((void *)elems, nelem, sizeof(struct addrinfo_sort_elem), - rfc6724_compare); - - list_sentinel->ai_next = elems[0].ai; - for (i = 0; i < nelem - 1; ++i) { - elems[i].ai->ai_next = elems[i + 1].ai; - } - elems[nelem - 1].ai->ai_next = NULL; - - ares_free(elems); - return ARES_SUCCESS; -} diff --git a/deps/cares/src/lib/ares__threads.c b/deps/cares/src/lib/ares__threads.c deleted file mode 100644 index f6de8c698e373d..00000000000000 --- a/deps/cares/src/lib/ares__threads.c +++ /dev/null @@ -1,607 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -#ifdef CARES_THREADS -# ifdef _WIN32 - -struct ares__thread_mutex { - CRITICAL_SECTION mutex; -}; - -ares__thread_mutex_t *ares__thread_mutex_create(void) -{ - ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); - if (mut == NULL) { - return NULL; - } - - InitializeCriticalSection(&mut->mutex); - return mut; -} - -void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - DeleteCriticalSection(&mut->mutex); - ares_free(mut); -} - -void ares__thread_mutex_lock(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - EnterCriticalSection(&mut->mutex); -} - -void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - LeaveCriticalSection(&mut->mutex); -} - -struct ares__thread_cond { - CONDITION_VARIABLE cond; -}; - -ares__thread_cond_t *ares__thread_cond_create(void) -{ - ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond)); - if (cond == NULL) { - return NULL; - } - InitializeConditionVariable(&cond->cond); - return cond; -} - -void ares__thread_cond_destroy(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - ares_free(cond); -} - -void ares__thread_cond_signal(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - WakeConditionVariable(&cond->cond); -} - -void ares__thread_cond_broadcast(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - WakeAllConditionVariable(&cond->cond); -} - -ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut) -{ - if (cond == NULL || mut == NULL) { - return ARES_EFORMERR; - } - - SleepConditionVariableCS(&cond->cond, &mut->mutex, INFINITE); - return ARES_SUCCESS; -} - -ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut, - unsigned long timeout_ms) -{ - if (cond == NULL || mut == NULL) { - return ARES_EFORMERR; - } - - if (!SleepConditionVariableCS(&cond->cond, &mut->mutex, timeout_ms)) { - return ARES_ETIMEOUT; - } - - return ARES_SUCCESS; -} - -struct ares__thread { - HANDLE thread; - DWORD id; - - void *(*func)(void *arg); - void *arg; - void *rv; -}; - -/* Wrap for pthread compatibility */ -static DWORD WINAPI ares__thread_func(LPVOID lpParameter) -{ - ares__thread_t *thread = lpParameter; - - thread->rv = thread->func(thread->arg); - return 0; -} - -ares_status_t ares__thread_create(ares__thread_t **thread, - ares__thread_func_t func, void *arg) -{ - ares__thread_t *thr = NULL; - - if (func == NULL || thread == NULL) { - return ARES_EFORMERR; - } - - thr = ares_malloc_zero(sizeof(*thr)); - if (thr == NULL) { - return ARES_ENOMEM; - } - - thr->func = func; - thr->arg = arg; - thr->thread = CreateThread(NULL, 0, ares__thread_func, thr, 0, &thr->id); - if (thr->thread == NULL) { - ares_free(thr); - return ARES_ESERVFAIL; - } - - *thread = thr; - return ARES_SUCCESS; -} - -ares_status_t ares__thread_join(ares__thread_t *thread, void **rv) -{ - ares_status_t status = ARES_SUCCESS; - - if (thread == NULL) { - return ARES_EFORMERR; - } - - if (WaitForSingleObject(thread->thread, INFINITE) != WAIT_OBJECT_0) { - status = ARES_ENOTFOUND; - } else { - CloseHandle(thread->thread); - } - - if (status == ARES_SUCCESS && rv != NULL) { - *rv = thread->rv; - } - ares_free(thread); - - return status; -} - -# else /* !WIN32 == PTHREAD */ -# include <pthread.h> - -/* for clock_gettime() */ -# ifdef HAVE_TIME_H -# include <time.h> -# endif - -/* for gettimeofday() */ -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# endif - -struct ares__thread_mutex { - pthread_mutex_t mutex; -}; - -ares__thread_mutex_t *ares__thread_mutex_create(void) -{ - pthread_mutexattr_t attr; - ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); - if (mut == NULL) { - return NULL; - } - - if (pthread_mutexattr_init(&attr) != 0) { - ares_free(mut); - return NULL; - } - - if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) { - goto fail; - } - - if (pthread_mutex_init(&mut->mutex, &attr) != 0) { - goto fail; - } - - pthread_mutexattr_destroy(&attr); - return mut; - -fail: - pthread_mutexattr_destroy(&attr); - ares_free(mut); - return NULL; -} - -void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - pthread_mutex_destroy(&mut->mutex); - ares_free(mut); -} - -void ares__thread_mutex_lock(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - pthread_mutex_lock(&mut->mutex); -} - -void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) -{ - if (mut == NULL) { - return; - } - pthread_mutex_unlock(&mut->mutex); -} - -struct ares__thread_cond { - pthread_cond_t cond; -}; - -ares__thread_cond_t *ares__thread_cond_create(void) -{ - ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond)); - if (cond == NULL) { - return NULL; - } - pthread_cond_init(&cond->cond, NULL); - return cond; -} - -void ares__thread_cond_destroy(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - pthread_cond_destroy(&cond->cond); - ares_free(cond); -} - -void ares__thread_cond_signal(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - pthread_cond_signal(&cond->cond); -} - -void ares__thread_cond_broadcast(ares__thread_cond_t *cond) -{ - if (cond == NULL) { - return; - } - pthread_cond_broadcast(&cond->cond); -} - -ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut) -{ - if (cond == NULL || mut == NULL) { - return ARES_EFORMERR; - } - - pthread_cond_wait(&cond->cond, &mut->mutex); - return ARES_SUCCESS; -} - -static void ares__timespec_timeout(struct timespec *ts, unsigned long add_ms) -{ -# if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME) - clock_gettime(CLOCK_REALTIME, ts); -# elif defined(HAVE_GETTIMEOFDAY) - struct timeval tv; - gettimeofday(&tv, NULL); - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; -# else -# error cannot determine current system time -# endif - - ts->tv_sec += (time_t)(add_ms / 1000); - ts->tv_nsec += (long)((add_ms % 1000) * 1000000); - - /* Normalize if needed */ - if (ts->tv_nsec >= 1000000000) { - ts->tv_sec += ts->tv_nsec / 1000000000; - ts->tv_nsec %= 1000000000; - } -} - -ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut, - unsigned long timeout_ms) -{ - struct timespec ts; - - if (cond == NULL || mut == NULL) { - return ARES_EFORMERR; - } - - ares__timespec_timeout(&ts, timeout_ms); - - if (pthread_cond_timedwait(&cond->cond, &mut->mutex, &ts) != 0) { - return ARES_ETIMEOUT; - } - - return ARES_SUCCESS; -} - -struct ares__thread { - pthread_t thread; -}; - -ares_status_t ares__thread_create(ares__thread_t **thread, - ares__thread_func_t func, void *arg) -{ - ares__thread_t *thr = NULL; - - if (func == NULL || thread == NULL) { - return ARES_EFORMERR; - } - - thr = ares_malloc_zero(sizeof(*thr)); - if (thr == NULL) { - return ARES_ENOMEM; - } - if (pthread_create(&thr->thread, NULL, func, arg) != 0) { - ares_free(thr); - return ARES_ESERVFAIL; - } - - *thread = thr; - return ARES_SUCCESS; -} - -ares_status_t ares__thread_join(ares__thread_t *thread, void **rv) -{ - void *ret = NULL; - ares_status_t status = ARES_SUCCESS; - - if (thread == NULL) { - return ARES_EFORMERR; - } - - if (pthread_join(thread->thread, &ret) != 0) { - status = ARES_ENOTFOUND; - } - ares_free(thread); - - if (status == ARES_SUCCESS && rv != NULL) { - *rv = ret; - } - return status; -} - -# endif - -ares_bool_t ares_threadsafety(void) -{ - return ARES_TRUE; -} - -#else /* !CARES_THREADS */ - -/* NoOp */ -ares__thread_mutex_t *ares__thread_mutex_create(void) -{ - return NULL; -} - -void ares__thread_mutex_destroy(ares__thread_mutex_t *mut) -{ - (void)mut; -} - -void ares__thread_mutex_lock(ares__thread_mutex_t *mut) -{ - (void)mut; -} - -void ares__thread_mutex_unlock(ares__thread_mutex_t *mut) -{ - (void)mut; -} - -ares__thread_cond_t *ares__thread_cond_create(void) -{ - return NULL; -} - -void ares__thread_cond_destroy(ares__thread_cond_t *cond) -{ - (void)cond; -} - -void ares__thread_cond_signal(ares__thread_cond_t *cond) -{ - (void)cond; -} - -void ares__thread_cond_broadcast(ares__thread_cond_t *cond) -{ - (void)cond; -} - -ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut) -{ - (void)cond; - (void)mut; - return ARES_ENOTIMP; -} - -ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut, - unsigned long timeout_ms) -{ - (void)cond; - (void)mut; - (void)timeout_ms; - return ARES_ENOTIMP; -} - -ares_status_t ares__thread_create(ares__thread_t **thread, - ares__thread_func_t func, void *arg) -{ - (void)thread; - (void)func; - (void)arg; - return ARES_ENOTIMP; -} - -ares_status_t ares__thread_join(ares__thread_t *thread, void **rv) -{ - (void)thread; - (void)rv; - return ARES_ENOTIMP; -} - -ares_bool_t ares_threadsafety(void) -{ - return ARES_FALSE; -} -#endif - - -ares_status_t ares__channel_threading_init(ares_channel_t *channel) -{ - ares_status_t status = ARES_SUCCESS; - - /* Threading is optional! */ - if (!ares_threadsafety()) { - return ARES_SUCCESS; - } - - channel->lock = ares__thread_mutex_create(); - if (channel->lock == NULL) { - status = ARES_ENOMEM; - goto done; - } - - channel->cond_empty = ares__thread_cond_create(); - if (channel->cond_empty == NULL) { - status = ARES_ENOMEM; - goto done; - } - -done: - if (status != ARES_SUCCESS) { - ares__channel_threading_destroy(channel); - } - return status; -} - -void ares__channel_threading_destroy(ares_channel_t *channel) -{ - ares__thread_mutex_destroy(channel->lock); - channel->lock = NULL; - ares__thread_cond_destroy(channel->cond_empty); - channel->cond_empty = NULL; -} - -void ares__channel_lock(ares_channel_t *channel) -{ - ares__thread_mutex_lock(channel->lock); -} - -void ares__channel_unlock(ares_channel_t *channel) -{ - ares__thread_mutex_unlock(channel->lock); -} - -/* Must not be holding a channel lock already, public function only */ -ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms) -{ - ares_status_t status = ARES_SUCCESS; - struct timeval tout; - - if (!ares_threadsafety()) { - return ARES_ENOTIMP; - } - - if (channel == NULL) { - return ARES_EFORMERR; - } - - if (timeout_ms >= 0) { - tout = ares__tvnow(); - tout.tv_sec += timeout_ms / 1000; - tout.tv_usec += (timeout_ms % 1000) * 1000; - } - - ares__thread_mutex_lock(channel->lock); - while (ares__llist_len(channel->all_queries)) { - if (timeout_ms < 0) { - ares__thread_cond_wait(channel->cond_empty, channel->lock); - } else { - struct timeval tv_remaining; - struct timeval tv_now = ares__tvnow(); - unsigned long tms; - - ares__timeval_remaining(&tv_remaining, &tv_now, &tout); - tms = (unsigned long)((tv_remaining.tv_sec * 1000) + - (tv_remaining.tv_usec / 1000)); - if (tms == 0) { - status = ARES_ETIMEOUT; - } else { - status = - ares__thread_cond_timedwait(channel->cond_empty, channel->lock, tms); - } - } - } - ares__thread_mutex_unlock(channel->lock); - return status; -} - -void ares_queue_notify_empty(ares_channel_t *channel) -{ - if (channel == NULL) { - return; - } - - /* We are guaranteed to be holding a channel lock already */ - if (ares__llist_len(channel->all_queries)) { - return; - } - - /* Notify all waiters of the conditional */ - ares__thread_cond_broadcast(channel->cond_empty); -} diff --git a/deps/cares/src/lib/ares__threads.h b/deps/cares/src/lib/ares__threads.h deleted file mode 100644 index 108354dfc1e17f..00000000000000 --- a/deps/cares/src/lib/ares__threads.h +++ /dev/null @@ -1,60 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES__THREADS_H -#define __ARES__THREADS_H - -struct ares__thread_mutex; -typedef struct ares__thread_mutex ares__thread_mutex_t; - -ares__thread_mutex_t *ares__thread_mutex_create(void); -void ares__thread_mutex_destroy(ares__thread_mutex_t *mut); -void ares__thread_mutex_lock(ares__thread_mutex_t *mut); -void ares__thread_mutex_unlock(ares__thread_mutex_t *mut); - - -struct ares__thread_cond; -typedef struct ares__thread_cond ares__thread_cond_t; - -ares__thread_cond_t *ares__thread_cond_create(void); -void ares__thread_cond_destroy(ares__thread_cond_t *cond); -void ares__thread_cond_signal(ares__thread_cond_t *cond); -void ares__thread_cond_broadcast(ares__thread_cond_t *cond); -ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut); -ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond, - ares__thread_mutex_t *mut, - unsigned long timeout_ms); - - -struct ares__thread; -typedef struct ares__thread ares__thread_t; - -typedef void *(*ares__thread_func_t)(void *arg); -ares_status_t ares__thread_create(ares__thread_t **thread, - ares__thread_func_t func, void *arg); -ares_status_t ares__thread_join(ares__thread_t *thread, void **rv); - -#endif diff --git a/deps/cares/src/lib/ares__timeval.c b/deps/cares/src/lib/ares__timeval.c deleted file mode 100644 index 11996f9f11ea35..00000000000000 --- a/deps/cares/src/lib/ares__timeval.c +++ /dev/null @@ -1,108 +0,0 @@ -/* MIT License - * - * Copyright (c) 2008 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -#if defined(WIN32) && !defined(MSDOS) - -struct timeval ares__tvnow(void) -{ - /* - ** GetTickCount() is available on _all_ Windows versions from W95 up - ** to nowadays. Returns milliseconds elapsed since last system boot, - ** increases monotonically and wraps once 49.7 days have elapsed. - */ - struct timeval now; - DWORD milliseconds = GetTickCount(); - now.tv_sec = (long)milliseconds / 1000; - now.tv_usec = (long)(milliseconds % 1000) * 1000; - return now; -} - -#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) - -struct timeval ares__tvnow(void) -{ - /* - ** clock_gettime() is granted to be increased monotonically when the - ** monotonic clock is queried. Time starting point is unspecified, it - ** could be the system start-up time, the Epoch, or something else, - ** in any case the time starting point does not change once that the - ** system has started up. - */ - struct timeval now; - struct timespec tsnow; - if (0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) { - now.tv_sec = tsnow.tv_sec; - now.tv_usec = (int)(tsnow.tv_nsec / 1000); - } - /* - ** Even when the configure process has truly detected monotonic clock - ** availability, it might happen that it is not actually available at - ** run-time. When this occurs simply fallback to other time source. - */ -# ifdef HAVE_GETTIMEOFDAY - else - (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */ -# else - else { - now.tv_sec = (long)time(NULL); - now.tv_usec = 0; - } -# endif - return now; -} - -#elif defined(HAVE_GETTIMEOFDAY) - -struct timeval ares__tvnow(void) -{ - /* - ** gettimeofday() is not granted to be increased monotonically, due to - ** clock drifting and external source time synchronization it can jump - ** forward or backward in time. - */ - struct timeval now; - (void)gettimeofday(&now, NULL); - return now; -} - -#else - -struct timeval ares__tvnow(void) -{ - /* - ** time() returns the value of time in seconds since the Epoch. - */ - struct timeval now; - now.tv_sec = (long)time(NULL); - now.tv_usec = 0; - return now; -} - -#endif diff --git a/deps/cares/src/lib/ares_addrinfo2hostent.c b/deps/cares/src/lib/ares_addrinfo2hostent.c new file mode 100644 index 00000000000000..239ca5bce7daec --- /dev/null +++ b/deps/cares/src/lib/ares_addrinfo2hostent.c @@ -0,0 +1,305 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2005 Dominick Meglio + * Copyright (c) 2019 Andrew Selivanov + * Copyright (c) 2021 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +static size_t hostent_nalias(const struct hostent *host) +{ + size_t i; + for (i=0; host->h_aliases != NULL && host->h_aliases[i] != NULL; i++) + ; + + return i; +} + +static size_t ai_nalias(const struct ares_addrinfo *ai) +{ + const struct ares_addrinfo_cname *cname; + size_t i = 0; + + for (cname = ai->cnames; cname != NULL; cname=cname->next) { + i++; + } + + return i; +} + +static size_t hostent_naddr(const struct hostent *host) +{ + size_t i; + for (i=0; host->h_addr_list != NULL && host->h_addr_list[i] != NULL; i++) + ; + + return i; +} + +static size_t ai_naddr(const struct ares_addrinfo *ai, int af) +{ + const struct ares_addrinfo_node *node; + size_t i = 0; + + for (node = ai->nodes; node != NULL; node=node->ai_next) { + if (af != AF_UNSPEC && af != node->ai_family) + continue; + i++; + } + + return i; +} + +ares_status_t ares_addrinfo2hostent(const struct ares_addrinfo *ai, int family, + struct hostent **host) +{ + struct ares_addrinfo_node *next; + char **aliases = NULL; + char **addrs = NULL; + size_t naliases = 0; + size_t naddrs = 0; + size_t i; + size_t ealiases = 0; + size_t eaddrs = 0; + + if (ai == NULL || host == NULL) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Use either the host set in the passed in hosts to be filled in, or the + * first node of the response as the family, since hostent can only + * represent one family. We assume getaddrinfo() returned a sorted list if + * the user requested AF_UNSPEC. */ + if (family == AF_UNSPEC) { + if (*host != NULL && (*host)->h_addrtype != AF_UNSPEC) { + family = (*host)->h_addrtype; + } else if (ai->nodes != NULL) { + family = ai->nodes->ai_family; + } + } + + if (family != AF_INET && family != AF_INET6) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (*host == NULL) { + *host = ares_malloc_zero(sizeof(**host)); + if (!(*host)) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + (*host)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family; + if (family == AF_INET) { + (*host)->h_length = sizeof(struct in_addr); + } else if (family == AF_INET6) { + (*host)->h_length = sizeof(struct ares_in6_addr); + } + + if ((*host)->h_name == NULL) { + if (ai->cnames) { + (*host)->h_name = ares_strdup(ai->cnames->name); + if ((*host)->h_name == NULL && ai->cnames->name) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } else { + (*host)->h_name = ares_strdup(ai->name); + if ((*host)->h_name == NULL && ai->name) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + } + + naliases = ai_nalias(ai); + ealiases = hostent_nalias(*host); + aliases = ares_realloc_zero((*host)->h_aliases, + ealiases * sizeof(char *), + (naliases + ealiases + 1) * sizeof(char *)); + if (!aliases) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + (*host)->h_aliases = aliases; + + if (naliases) { + const struct ares_addrinfo_cname *cname; + i = ealiases; + for (cname = ai->cnames; cname != NULL; cname = cname->next) { + if (cname->alias == NULL) { + continue; + } + (*host)->h_aliases[i] = ares_strdup(cname->alias); + if ((*host)->h_aliases[i] == NULL) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + i++; + } + } + + naddrs = ai_naddr(ai, family); + eaddrs = hostent_naddr(*host); + addrs = ares_realloc_zero((*host)->h_addr_list, eaddrs * sizeof(char *), + (naddrs + eaddrs + 1) * sizeof(char *)); + if (addrs == NULL) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + (*host)->h_addr_list = addrs; + + if (naddrs) { + i = eaddrs; + for (next = ai->nodes; next != NULL; next = next->ai_next) { + if (next->ai_family != family) { + continue; + } + (*host)->h_addr_list[i] = ares_malloc_zero((size_t)(*host)->h_length); + if ((*host)->h_addr_list[i] == NULL) { + goto enomem; /* LCOV_EXCL_LINE: OutOfMemory */ + } + if (family == AF_INET6) { + memcpy((*host)->h_addr_list[i], + &(CARES_INADDR_CAST(const struct sockaddr_in6 *, next->ai_addr) + ->sin6_addr), + (size_t)(*host)->h_length); + } + if (family == AF_INET) { + memcpy((*host)->h_addr_list[i], + &(CARES_INADDR_CAST(const struct sockaddr_in *, next->ai_addr) + ->sin_addr), + (size_t)(*host)->h_length); + } + i++; + } + } + + if (naddrs + eaddrs == 0 && naliases + ealiases == 0) { + ares_free_hostent(*host); + *host = NULL; + return ARES_ENODATA; + } + + return ARES_SUCCESS; + +/* LCOV_EXCL_START: OutOfMemory */ +enomem: + ares_free_hostent(*host); + *host = NULL; + return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ +} + +ares_status_t ares_addrinfo2addrttl(const struct ares_addrinfo *ai, int family, + size_t req_naddrttls, + struct ares_addrttl *addrttls, + struct ares_addr6ttl *addr6ttls, + size_t *naddrttls) +{ + struct ares_addrinfo_node *next; + struct ares_addrinfo_cname *next_cname; + int cname_ttl = INT_MAX; + + if (family != AF_INET && family != AF_INET6) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (ai == NULL || naddrttls == NULL) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (family == AF_INET && addrttls == NULL) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (family == AF_INET6 && addr6ttls == NULL) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (req_naddrttls == 0) { + return ARES_EBADQUERY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *naddrttls = 0; + + next_cname = ai->cnames; + while (next_cname) { + if (next_cname->ttl < cname_ttl) { + cname_ttl = next_cname->ttl; + } + next_cname = next_cname->next; + } + + for (next = ai->nodes; next != NULL; next = next->ai_next) { + if (next->ai_family != family) { + continue; + } + + if (*naddrttls >= req_naddrttls) { + break; + } + + if (family == AF_INET6) { + if (next->ai_ttl > cname_ttl) { + addr6ttls[*naddrttls].ttl = cname_ttl; + } else { + addr6ttls[*naddrttls].ttl = next->ai_ttl; + } + + memcpy(&addr6ttls[*naddrttls].ip6addr, + &(CARES_INADDR_CAST(const struct sockaddr_in6 *, next->ai_addr) + ->sin6_addr), + sizeof(struct ares_in6_addr)); + } else { + if (next->ai_ttl > cname_ttl) { + addrttls[*naddrttls].ttl = cname_ttl; + } else { + addrttls[*naddrttls].ttl = next->ai_ttl; + } + memcpy(&addrttls[*naddrttls].ipaddr, + &(CARES_INADDR_CAST(const struct sockaddr_in *, next->ai_addr) + ->sin_addr), + sizeof(struct in_addr)); + } + (*naddrttls)++; + } + + return ARES_SUCCESS; +} diff --git a/deps/cares/src/lib/ares_addrinfo_localhost.c b/deps/cares/src/lib/ares_addrinfo_localhost.c new file mode 100644 index 00000000000000..2abb0c48a6f601 --- /dev/null +++ b/deps/cares/src/lib/ares_addrinfo_localhost.c @@ -0,0 +1,245 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) Daniel Stenberg + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#if defined(USE_WINSOCK) +# if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 +# include <ws2ipdef.h> +# endif +# if defined(HAVE_IPHLPAPI_H) +# include <iphlpapi.h> +# endif +# if defined(HAVE_NETIOAPI_H) +# include <netioapi.h> +# endif +#endif + +static ares_bool_t ares_ai_has_family(int aftype, + const struct ares_addrinfo_node *nodes) +{ + const struct ares_addrinfo_node *node; + + for (node = nodes; node != NULL; node = node->ai_next) { + if (node->ai_family == aftype) + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_status_t ares_append_ai_node(int aftype, unsigned short port, + unsigned int ttl, const void *adata, + struct ares_addrinfo_node **nodes) +{ + struct ares_addrinfo_node *node; + + node = ares_append_addrinfo_node(nodes); + if (!node) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memset(node, 0, sizeof(*node)); + + if (aftype == AF_INET) { + struct sockaddr_in *sin = ares_malloc(sizeof(*sin)); + if (!sin) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memset(sin, 0, sizeof(*sin)); + memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr)); + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + + node->ai_addr = (struct sockaddr *)sin; + node->ai_family = AF_INET; + node->ai_addrlen = sizeof(*sin); + node->ai_addr = (struct sockaddr *)sin; + node->ai_ttl = (int)ttl; + } + + if (aftype == AF_INET6) { + struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6)); + if (!sin6) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memset(sin6, 0, sizeof(*sin6)); + memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr)); + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + + node->ai_addr = (struct sockaddr *)sin6; + node->ai_family = AF_INET6; + node->ai_addrlen = sizeof(*sin6); + node->ai_addr = (struct sockaddr *)sin6; + node->ai_ttl = (int)ttl; + } + + return ARES_SUCCESS; +} + +static ares_status_t + ares_default_loopback_addrs(int aftype, unsigned short port, + struct ares_addrinfo_node **nodes) +{ + ares_status_t status = ARES_SUCCESS; + + if ((aftype == AF_UNSPEC || aftype == AF_INET6) && + !ares_ai_has_family(AF_INET6, *nodes)) { + struct ares_in6_addr addr6; + ares_inet_pton(AF_INET6, "::1", &addr6); + status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if ((aftype == AF_UNSPEC || aftype == AF_INET) && + !ares_ai_has_family(AF_INET, *nodes)) { + struct in_addr addr4; + ares_inet_pton(AF_INET, "127.0.0.1", &addr4); + status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return status; +} + +static ares_status_t + ares_system_loopback_addrs(int aftype, unsigned short port, + struct ares_addrinfo_node **nodes) +{ +#if defined(USE_WINSOCK) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && \ + !defined(__WATCOMC__) + PMIB_UNICASTIPADDRESS_TABLE table; + unsigned int i; + ares_status_t status = ARES_ENOTFOUND; + + *nodes = NULL; + + if (GetUnicastIpAddressTable((ADDRESS_FAMILY)aftype, &table) != NO_ERROR) { + return ARES_ENOTFOUND; + } + + for (i = 0; i < table->NumEntries; i++) { + if (table->Table[i].InterfaceLuid.Info.IfType != + IF_TYPE_SOFTWARE_LOOPBACK) { + continue; + } + + if (table->Table[i].Address.si_family == AF_INET && + !ares_ai_has_family(AF_INET, *nodes)) { + status = + ares_append_ai_node(table->Table[i].Address.si_family, port, 0, + &table->Table[i].Address.Ipv4.sin_addr, nodes); + } else if (table->Table[i].Address.si_family == AF_INET6 && + !ares_ai_has_family(AF_INET6, *nodes)) { + status = + ares_append_ai_node(table->Table[i].Address.si_family, port, 0, + &table->Table[i].Address.Ipv6.sin6_addr, nodes); + } else { + /* Ignore any others */ + continue; + } + + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (*nodes == NULL) { + status = ARES_ENOTFOUND; + } + +fail: + FreeMibTable(table); + + if (status != ARES_SUCCESS) { + ares_freeaddrinfo_nodes(*nodes); + *nodes = NULL; + } + + return status; + +#else + (void)aftype; + (void)port; + (void)nodes; + /* Not supported on any other OS at this time */ + return ARES_ENOTFOUND; +#endif +} + +ares_status_t ares_addrinfo_localhost(const char *name, unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai) +{ + ares_status_t status; + + /* Validate family */ + switch (hints->ai_family) { + case AF_INET: + case AF_INET6: + case AF_UNSPEC: + break; + default: /* LCOV_EXCL_LINE: DefensiveCoding */ + return ARES_EBADFAMILY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (ai->name != NULL) { + ares_free(ai->name); + } + ai->name = ares_strdup(name); + if (ai->name == NULL) { + status = ARES_ENOMEM; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_system_loopback_addrs(hints->ai_family, port, &ai->nodes); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; + } + + status = ares_default_loopback_addrs(hints->ai_family, port, &ai->nodes); + +done: + return status; +} diff --git a/deps/cares/src/lib/ares_android.c b/deps/cares/src/lib/ares_android.c index 778d4d10607fa3..a8284c1e50235a 100644 --- a/deps/cares/src/lib/ares_android.c +++ b/deps/cares/src/lib/ares_android.c @@ -24,13 +24,10 @@ * SPDX-License-Identifier: MIT */ #if defined(ANDROID) || defined(__ANDROID__) - +# include "ares_private.h" # include <jni.h> - -# include "ares_setup.h" -# include "ares.h" +# include <sys/prctl.h> # include "ares_android.h" -# include "ares_private.h" static JavaVM *android_jvm = NULL; static jobject android_connectivity_manager = NULL; @@ -85,6 +82,23 @@ static jmethodID jni_get_method_id(JNIEnv *env, jclass cls, return mid; } +static int jvm_attach(JNIEnv **env) +{ + char name[17] = { 0 }; + + JavaVMAttachArgs args; + + args.version = JNI_VERSION_1_6; + if (prctl(PR_GET_NAME, name) == 0) { + args.name = name; + } else { + args.name = NULL; + } + args.group = NULL; + + return (*android_jvm)->AttachCurrentThread(android_jvm, env, &args); +} + void ares_library_init_jvm(JavaVM *jvm) { android_jvm = jvm; @@ -105,7 +119,7 @@ int ares_library_init_android(jobject connectivity_manager) res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); if (res == JNI_EDETACHED) { env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + res = jvm_attach(&env); need_detatch = 1; } if (res != JNI_OK || env == NULL) { @@ -214,7 +228,7 @@ int ares_library_init_android(jobject connectivity_manager) (*android_jvm)->DetachCurrentThread(android_jvm); } - return ret; + return (int)ret; } int ares_library_android_initialized(void) @@ -238,7 +252,7 @@ void ares_library_cleanup_android(void) res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); if (res == JNI_EDETACHED) { env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + res = jvm_attach(&env); need_detatch = 1; } if (res != JNI_OK || env == NULL) { @@ -290,7 +304,7 @@ char **ares_get_android_server_list(size_t max_servers, size_t *num_servers) res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); if (res == JNI_EDETACHED) { env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + res = jvm_attach(&env); need_detatch = 1; } if (res != JNI_OK || env == NULL) { @@ -408,7 +422,7 @@ char *ares_get_android_search_domains_list(void) res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6); if (res == JNI_EDETACHED) { env = NULL; - res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL); + res = jvm_attach(&env); need_detatch = 1; } if (res != JNI_OK || env == NULL) { diff --git a/deps/cares/src/lib/ares_cancel.c b/deps/cares/src/lib/ares_cancel.c index 5a9fb722cb7778..75600dea6bcdaf 100644 --- a/deps/cares/src/lib/ares_cancel.c +++ b/deps/cares/src/lib/ares_cancel.c @@ -24,10 +24,6 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include <assert.h> - -#include "ares.h" #include "ares_private.h" /* @@ -41,53 +37,51 @@ void ares_cancel(ares_channel_t *channel) return; } - ares__channel_lock(channel); + ares_channel_lock(channel); - if (ares__llist_len(channel->all_queries) > 0) { - ares__llist_node_t *node = NULL; - ares__llist_node_t *next = NULL; + if (ares_llist_len(channel->all_queries) > 0) { + ares_llist_node_t *node = NULL; + ares_llist_node_t *next = NULL; /* Swap list heads, so that only those queries which were present on entry * into this function are cancelled. New queries added by callbacks of * queries being cancelled will not be cancelled themselves. */ - ares__llist_t *list_copy = channel->all_queries; - channel->all_queries = ares__llist_create(NULL); + ares_llist_t *list_copy = channel->all_queries; + channel->all_queries = ares_llist_create(NULL); /* Out of memory, this function doesn't return a result code though so we * can't report to caller */ if (channel->all_queries == NULL) { - channel->all_queries = list_copy; - goto done; + channel->all_queries = list_copy; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - node = ares__llist_node_first(list_copy); + node = ares_llist_node_first(list_copy); while (node != NULL) { - struct query *query; - struct server_connection *conn; + ares_query_t *query; /* Cache next since this node is being deleted */ - next = ares__llist_node_next(node); + next = ares_llist_node_next(node); - query = ares__llist_node_claim(node); - conn = query->conn; + query = ares_llist_node_claim(node); query->node_all_queries = NULL; /* NOTE: its possible this may enqueue new queries */ query->callback(query->arg, ARES_ECANCELLED, 0, NULL); - ares__free_query(query); - - /* See if the connection should be cleaned up */ - ares__check_cleanup_conn(channel, conn); + ares_free_query(query); node = next; } - ares__llist_destroy(list_copy); + ares_llist_destroy(list_copy); } + /* See if the connections should be cleaned up */ + ares_check_cleanup_conns(channel); + ares_queue_notify_empty(channel); done: - ares__channel_unlock(channel); + ares_channel_unlock(channel); } diff --git a/deps/cares/src/lib/ares_close_sockets.c b/deps/cares/src/lib/ares_close_sockets.c new file mode 100644 index 00000000000000..347f43e6fcd88d --- /dev/null +++ b/deps/cares/src/lib/ares_close_sockets.c @@ -0,0 +1,137 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" +#include <assert.h> + +static void ares_requeue_queries(ares_conn_t *conn, + ares_status_t requeue_status) +{ + ares_query_t *query; + ares_timeval_t now; + + ares_tvnow(&now); + + while ((query = ares_llist_first_val(conn->queries_to_conn)) != NULL) { + ares_requeue_query(query, &now, requeue_status, ARES_TRUE, NULL, NULL); + } +} + +void ares_close_connection(ares_conn_t *conn, ares_status_t requeue_status) +{ + ares_server_t *server = conn->server; + ares_channel_t *channel = server->channel; + + /* Unlink */ + ares_llist_node_claim( + ares_htable_asvp_get_direct(channel->connnode_by_socket, conn->fd)); + ares_htable_asvp_remove(channel->connnode_by_socket, conn->fd); + + if (conn->flags & ARES_CONN_FLAG_TCP) { + server->tcp_conn = NULL; + } + + ares_buf_destroy(conn->in_buf); + ares_buf_destroy(conn->out_buf); + + /* Requeue queries to other connections */ + ares_requeue_queries(conn, requeue_status); + + ares_llist_destroy(conn->queries_to_conn); + + ares_conn_sock_state_cb_update(conn, ARES_CONN_STATE_NONE); + + ares_socket_close(channel, conn->fd); + + ares_free(conn); +} + +void ares_close_sockets(ares_server_t *server) +{ + ares_llist_node_t *node; + + while ((node = ares_llist_node_first(server->connections)) != NULL) { + ares_conn_t *conn = ares_llist_node_val(node); + ares_close_connection(conn, ARES_SUCCESS); + } +} + +void ares_check_cleanup_conns(const ares_channel_t *channel) +{ + ares_slist_node_t *snode; + + if (channel == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Iterate across each server */ + for (snode = ares_slist_node_first(channel->servers); snode != NULL; + snode = ares_slist_node_next(snode)) { + ares_server_t *server = ares_slist_node_val(snode); + ares_llist_node_t *cnode; + + /* Iterate across each connection */ + cnode = ares_llist_node_first(server->connections); + while (cnode != NULL) { + ares_llist_node_t *next = ares_llist_node_next(cnode); + ares_conn_t *conn = ares_llist_node_val(cnode); + ares_bool_t do_cleanup = ARES_FALSE; + cnode = next; + + /* Has connections, not eligible */ + if (ares_llist_len(conn->queries_to_conn)) { + continue; + } + + /* If we are configured not to stay open, close it out */ + if (!(channel->flags & ARES_FLAG_STAYOPEN)) { + do_cleanup = ARES_TRUE; + } + + /* If the associated server has failures, close it out. Resetting the + * connection (and specifically the source port number) can help resolve + * situations where packets are being dropped. + */ + if (conn->server->consec_failures > 0) { + do_cleanup = ARES_TRUE; + } + + /* If the udp connection hit its max queries, always close it */ + if (!(conn->flags & ARES_CONN_FLAG_TCP) && channel->udp_max_queries > 0 && + conn->total_queries >= channel->udp_max_queries) { + do_cleanup = ARES_TRUE; + } + + if (!do_cleanup) { + continue; + } + + /* Clean it up */ + ares_close_connection(conn, ARES_SUCCESS); + } + } +} diff --git a/deps/cares/src/lib/ares_config.h.cmake b/deps/cares/src/lib/ares_config.h.cmake index 10a1b7a971604b..cff18187212b0b 100644 --- a/deps/cares/src/lib/ares_config.h.cmake +++ b/deps/cares/src/lib/ares_config.h.cmake @@ -41,356 +41,371 @@ #define GETSERVBYNAME_R_ARGS @GETSERVBYNAME_R_ARGS@ /* Define to 1 if you have AF_INET6. */ -#cmakedefine HAVE_AF_INET6 +#cmakedefine HAVE_AF_INET6 1 /* Define to 1 if you have the <arpa/inet.h> header file. */ -#cmakedefine HAVE_ARPA_INET_H +#cmakedefine HAVE_ARPA_INET_H 1 /* Define to 1 if you have the <arpa/nameser_compat.h> header file. */ -#cmakedefine HAVE_ARPA_NAMESER_COMPAT_H +#cmakedefine HAVE_ARPA_NAMESER_COMPAT_H 1 /* Define to 1 if you have the <arpa/nameser.h> header file. */ -#cmakedefine HAVE_ARPA_NAMESER_H +#cmakedefine HAVE_ARPA_NAMESER_H 1 /* Define to 1 if you have the <assert.h> header file. */ -#cmakedefine HAVE_ASSERT_H +#cmakedefine HAVE_ASSERT_H 1 /* Define to 1 if you have the clock_gettime function and monotonic timer. */ -#cmakedefine HAVE_CLOCK_GETTIME_MONOTONIC +#cmakedefine HAVE_CLOCK_GETTIME_MONOTONIC 1 /* Define to 1 if you have the closesocket function. */ -#cmakedefine HAVE_CLOSESOCKET +#cmakedefine HAVE_CLOSESOCKET 1 /* Define to 1 if you have the CloseSocket camel case function. */ -#cmakedefine HAVE_CLOSESOCKET_CAMEL +#cmakedefine HAVE_CLOSESOCKET_CAMEL 1 /* Define to 1 if you have the connect function. */ -#cmakedefine HAVE_CONNECT +#cmakedefine HAVE_CONNECT 1 + +/* Define to 1 if you have the connectx function. */ +#cmakedefine HAVE_CONNECTX 1 /* define if the compiler supports basic C++11 syntax */ -#cmakedefine HAVE_CXX11 +#cmakedefine HAVE_CXX11 1 /* Define to 1 if you have the <dlfcn.h> header file. */ -#cmakedefine HAVE_DLFCN_H +#cmakedefine HAVE_DLFCN_H 1 /* Define to 1 if you have the <errno.h> header file. */ -#cmakedefine HAVE_ERRNO_H +#cmakedefine HAVE_ERRNO_H 1 /* Define to 1 if you have the <poll.h> header file. */ -#cmakedefine HAVE_POLL_H +#cmakedefine HAVE_POLL_H 1 + +/* Define to 1 if you have the memmem function. */ +#cmakedefine HAVE_MEMMEM 1 /* Define to 1 if you have the poll function. */ -#cmakedefine HAVE_POLL +#cmakedefine HAVE_POLL 1 /* Define to 1 if you have the pipe function. */ -#cmakedefine HAVE_PIPE +#cmakedefine HAVE_PIPE 1 /* Define to 1 if you have the pipe2 function. */ -#cmakedefine HAVE_PIPE2 +#cmakedefine HAVE_PIPE2 1 /* Define to 1 if you have the kqueue function. */ -#cmakedefine HAVE_KQUEUE +#cmakedefine HAVE_KQUEUE 1 /* Define to 1 if you have the epoll{_create,ctl,wait} functions. */ -#cmakedefine HAVE_EPOLL +#cmakedefine HAVE_EPOLL 1 /* Define to 1 if you have the fcntl function. */ -#cmakedefine HAVE_FCNTL +#cmakedefine HAVE_FCNTL 1 /* Define to 1 if you have the <fcntl.h> header file. */ -#cmakedefine HAVE_FCNTL_H +#cmakedefine HAVE_FCNTL_H 1 /* Define to 1 if you have a working fcntl O_NONBLOCK function. */ -#cmakedefine HAVE_FCNTL_O_NONBLOCK +#cmakedefine HAVE_FCNTL_O_NONBLOCK 1 /* Define to 1 if you have the freeaddrinfo function. */ -#cmakedefine HAVE_FREEADDRINFO +#cmakedefine HAVE_FREEADDRINFO 1 /* Define to 1 if you have a working getaddrinfo function. */ -#cmakedefine HAVE_GETADDRINFO +#cmakedefine HAVE_GETADDRINFO 1 /* Define to 1 if the getaddrinfo function is threadsafe. */ -#cmakedefine HAVE_GETADDRINFO_THREADSAFE +#cmakedefine HAVE_GETADDRINFO_THREADSAFE 1 /* Define to 1 if you have the getenv function. */ -#cmakedefine HAVE_GETENV +#cmakedefine HAVE_GETENV 1 /* Define to 1 if you have the gethostname function. */ -#cmakedefine HAVE_GETHOSTNAME +#cmakedefine HAVE_GETHOSTNAME 1 /* Define to 1 if you have the getnameinfo function. */ -#cmakedefine HAVE_GETNAMEINFO +#cmakedefine HAVE_GETNAMEINFO 1 /* Define to 1 if you have the getrandom function. */ -#cmakedefine HAVE_GETRANDOM +#cmakedefine HAVE_GETRANDOM 1 /* Define to 1 if you have the getservbyport_r function. */ -#cmakedefine HAVE_GETSERVBYPORT_R +#cmakedefine HAVE_GETSERVBYPORT_R 1 /* Define to 1 if you have the getservbyname_r function. */ -#cmakedefine HAVE_GETSERVBYNAME_R +#cmakedefine HAVE_GETSERVBYNAME_R 1 /* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY +#cmakedefine HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `if_indextoname' function. */ -#cmakedefine HAVE_IF_INDEXTONAME +#cmakedefine HAVE_IF_INDEXTONAME 1 /* Define to 1 if you have the `if_nametoindex' function. */ -#cmakedefine HAVE_IF_NAMETOINDEX +#cmakedefine HAVE_IF_NAMETOINDEX 1 + +/* Define to 1 if you have the `GetBestRoute2' function. */ +#cmakedefine HAVE_GETBESTROUTE2 1 /* Define to 1 if you have the `ConvertInterfaceIndexToLuid' function. */ -#cmakedefine HAVE_CONVERTINTERFACEINDEXTOLUID +#cmakedefine HAVE_CONVERTINTERFACEINDEXTOLUID 1 /* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */ -#cmakedefine HAVE_CONVERTINTERFACELUIDTONAMEA +#cmakedefine HAVE_CONVERTINTERFACELUIDTONAMEA 1 + +/* Define to 1 if you have the `NotifyIpInterfaceChange' function. */ +#cmakedefine HAVE_NOTIFYIPINTERFACECHANGE 1 + +/* Define to 1 if you have the `RegisterWaitForSingleObject' function. */ +#cmakedefine HAVE_REGISTERWAITFORSINGLEOBJECT 1 /* Define to 1 if you have a IPv6 capable working inet_net_pton function. */ -#cmakedefine HAVE_INET_NET_PTON +#cmakedefine HAVE_INET_NET_PTON 1 /* Define to 1 if you have a IPv6 capable working inet_ntop function. */ -#cmakedefine HAVE_INET_NTOP +#cmakedefine HAVE_INET_NTOP 1 /* Define to 1 if you have a IPv6 capable working inet_pton function. */ -#cmakedefine HAVE_INET_PTON +#cmakedefine HAVE_INET_PTON 1 /* Define to 1 if you have the <inttypes.h> header file. */ -#cmakedefine HAVE_INTTYPES_H +#cmakedefine HAVE_INTTYPES_H 1 /* Define to 1 if you have the ioctl function. */ -#cmakedefine HAVE_IOCTL +#cmakedefine HAVE_IOCTL 1 /* Define to 1 if you have the ioctlsocket function. */ -#cmakedefine HAVE_IOCTLSOCKET +#cmakedefine HAVE_IOCTLSOCKET 1 /* Define to 1 if you have the IoctlSocket camel case function. */ -#cmakedefine HAVE_IOCTLSOCKET_CAMEL +#cmakedefine HAVE_IOCTLSOCKET_CAMEL 1 /* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. */ -#cmakedefine HAVE_IOCTLSOCKET_CAMEL_FIONBIO +#cmakedefine HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1 /* Define to 1 if you have a working ioctlsocket FIONBIO function. */ -#cmakedefine HAVE_IOCTLSOCKET_FIONBIO +#cmakedefine HAVE_IOCTLSOCKET_FIONBIO 1 /* Define to 1 if you have a working ioctl FIONBIO function. */ -#cmakedefine HAVE_IOCTL_FIONBIO +#cmakedefine HAVE_IOCTL_FIONBIO 1 /* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ -#cmakedefine HAVE_IOCTL_SIOCGIFADDR +#cmakedefine HAVE_IOCTL_SIOCGIFADDR 1 /* Define to 1 if you have the `resolve' library (-lresolve). */ -#cmakedefine HAVE_LIBRESOLV +#cmakedefine HAVE_LIBRESOLV 1 /* Define to 1 if you have iphlpapi.h */ -#cmakedefine HAVE_IPHLPAPI_H +#cmakedefine HAVE_IPHLPAPI_H 1 /* Define to 1 if you have netioapi.h */ -#cmakedefine HAVE_NETIOAPI_H +#cmakedefine HAVE_NETIOAPI_H 1 /* Define to 1 if you have the <limits.h> header file. */ -#cmakedefine HAVE_LIMITS_H +#cmakedefine HAVE_LIMITS_H 1 /* Define to 1 if the compiler supports the 'long long' data type. */ -#cmakedefine HAVE_LONGLONG +#cmakedefine HAVE_LONGLONG 1 /* Define to 1 if you have the malloc.h header file. */ -#cmakedefine HAVE_MALLOC_H +#cmakedefine HAVE_MALLOC_H 1 /* Define to 1 if you have the memory.h header file. */ -#cmakedefine HAVE_MEMORY_H +#cmakedefine HAVE_MEMORY_H 1 /* Define to 1 if you have the AvailabilityMacros.h header file. */ -#cmakedefine HAVE_AVAILABILITYMACROS_H +#cmakedefine HAVE_AVAILABILITYMACROS_H 1 /* Define to 1 if you have the MSG_NOSIGNAL flag. */ -#cmakedefine HAVE_MSG_NOSIGNAL +#cmakedefine HAVE_MSG_NOSIGNAL 1 /* Define to 1 if you have the <netdb.h> header file. */ -#cmakedefine HAVE_NETDB_H +#cmakedefine HAVE_NETDB_H 1 /* Define to 1 if you have the <netinet/in.h> header file. */ -#cmakedefine HAVE_NETINET_IN_H +#cmakedefine HAVE_NETINET_IN_H 1 /* Define to 1 if you have the <netinet6/in6.h> header file. */ -#cmakedefine HAVE_NETINET6_IN6_H +#cmakedefine HAVE_NETINET6_IN6_H 1 /* Define to 1 if you have the <netinet/tcp.h> header file. */ -#cmakedefine HAVE_NETINET_TCP_H +#cmakedefine HAVE_NETINET_TCP_H 1 /* Define to 1 if you have the <net/if.h> header file. */ -#cmakedefine HAVE_NET_IF_H +#cmakedefine HAVE_NET_IF_H 1 /* Define to 1 if you have PF_INET6. */ -#cmakedefine HAVE_PF_INET6 +#cmakedefine HAVE_PF_INET6 1 /* Define to 1 if you have the recv function. */ -#cmakedefine HAVE_RECV +#cmakedefine HAVE_RECV 1 /* Define to 1 if you have the recvfrom function. */ -#cmakedefine HAVE_RECVFROM +#cmakedefine HAVE_RECVFROM 1 /* Define to 1 if you have the send function. */ -#cmakedefine HAVE_SEND +#cmakedefine HAVE_SEND 1 + +/* Define to 1 if you have the sendto function. */ +#cmakedefine HAVE_SENDTO 1 /* Define to 1 if you have the setsockopt function. */ -#cmakedefine HAVE_SETSOCKOPT +#cmakedefine HAVE_SETSOCKOPT 1 /* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ -#cmakedefine HAVE_SETSOCKOPT_SO_NONBLOCK +#cmakedefine HAVE_SETSOCKOPT_SO_NONBLOCK 1 /* Define to 1 if you have the <signal.h> header file. */ -#cmakedefine HAVE_SIGNAL_H +#cmakedefine HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the strnlen function. */ +#cmakedefine HAVE_STRNLEN 1 /* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ -#cmakedefine HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID +#cmakedefine HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 /* Define to 1 if you have the socket function. */ -#cmakedefine HAVE_SOCKET +#cmakedefine HAVE_SOCKET 1 /* Define to 1 if you have the <socket.h> header file. */ -#cmakedefine HAVE_SOCKET_H +#cmakedefine HAVE_SOCKET_H 1 /* Define to 1 if you have the <stdbool.h> header file. */ -#cmakedefine HAVE_STDBOOL_H +#cmakedefine HAVE_STDBOOL_H 1 /* Define to 1 if you have the <stdint.h> header file. */ -#cmakedefine HAVE_STDINT_H +#cmakedefine HAVE_STDINT_H 1 /* Define to 1 if you have the <stdlib.h> header file. */ -#cmakedefine HAVE_STDLIB_H +#cmakedefine HAVE_STDLIB_H 1 /* Define to 1 if you have the strcasecmp function. */ -#cmakedefine HAVE_STRCASECMP +#cmakedefine HAVE_STRCASECMP 1 /* Define to 1 if you have the strcmpi function. */ -#cmakedefine HAVE_STRCMPI +#cmakedefine HAVE_STRCMPI 1 /* Define to 1 if you have the strdup function. */ -#cmakedefine HAVE_STRDUP +#cmakedefine HAVE_STRDUP 1 /* Define to 1 if you have the stricmp function. */ -#cmakedefine HAVE_STRICMP +#cmakedefine HAVE_STRICMP 1 /* Define to 1 if you have the <strings.h> header file. */ -#cmakedefine HAVE_STRINGS_H +#cmakedefine HAVE_STRINGS_H 1 /* Define to 1 if you have the <string.h> header file. */ -#cmakedefine HAVE_STRING_H +#cmakedefine HAVE_STRING_H 1 /* Define to 1 if you have the strncasecmp function. */ -#cmakedefine HAVE_STRNCASECMP +#cmakedefine HAVE_STRNCASECMP 1 /* Define to 1 if you have the strncmpi function. */ -#cmakedefine HAVE_STRNCMPI +#cmakedefine HAVE_STRNCMPI 1 /* Define to 1 if you have the strnicmp function. */ -#cmakedefine HAVE_STRNICMP +#cmakedefine HAVE_STRNICMP 1 /* Define to 1 if you have the <stropts.h> header file. */ -#cmakedefine HAVE_STROPTS_H +#cmakedefine HAVE_STROPTS_H 1 /* Define to 1 if you have struct addrinfo. */ -#cmakedefine HAVE_STRUCT_ADDRINFO +#cmakedefine HAVE_STRUCT_ADDRINFO 1 /* Define to 1 if you have struct in6_addr. */ -#cmakedefine HAVE_STRUCT_IN6_ADDR +#cmakedefine HAVE_STRUCT_IN6_ADDR 1 /* Define to 1 if you have struct sockaddr_in6. */ -#cmakedefine HAVE_STRUCT_SOCKADDR_IN6 +#cmakedefine HAVE_STRUCT_SOCKADDR_IN6 1 /* if struct sockaddr_storage is defined */ -#cmakedefine HAVE_STRUCT_SOCKADDR_STORAGE +#cmakedefine HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define to 1 if you have the timeval struct. */ -#cmakedefine HAVE_STRUCT_TIMEVAL +#cmakedefine HAVE_STRUCT_TIMEVAL 1 /* Define to 1 if you have the <sys/ioctl.h> header file. */ -#cmakedefine HAVE_SYS_IOCTL_H +#cmakedefine HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the <sys/param.h> header file. */ -#cmakedefine HAVE_SYS_PARAM_H +#cmakedefine HAVE_SYS_PARAM_H 1 /* Define to 1 if you have the <sys/random.h> header file. */ -#cmakedefine HAVE_SYS_RANDOM_H +#cmakedefine HAVE_SYS_RANDOM_H 1 /* Define to 1 if you have the <sys/event.h> header file. */ -#cmakedefine HAVE_SYS_EVENT_H +#cmakedefine HAVE_SYS_EVENT_H 1 /* Define to 1 if you have the <sys/epoll.h> header file. */ -#cmakedefine HAVE_SYS_EPOLL_H +#cmakedefine HAVE_SYS_EPOLL_H 1 /* Define to 1 if you have the <sys/select.h> header file. */ -#cmakedefine HAVE_SYS_SELECT_H +#cmakedefine HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the <sys/socket.h> header file. */ -#cmakedefine HAVE_SYS_SOCKET_H +#cmakedefine HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the <sys/stat.h> header file. */ -#cmakedefine HAVE_SYS_STAT_H +#cmakedefine HAVE_SYS_STAT_H 1 /* Define to 1 if you have the <sys/time.h> header file. */ -#cmakedefine HAVE_SYS_TIME_H +#cmakedefine HAVE_SYS_TIME_H 1 /* Define to 1 if you have the <sys/types.h> header file. */ -#cmakedefine HAVE_SYS_TYPES_H +#cmakedefine HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the <sys/uio.h> header file. */ -#cmakedefine HAVE_SYS_UIO_H +#cmakedefine HAVE_SYS_UIO_H 1 /* Define to 1 if you have the <time.h> header file. */ -#cmakedefine HAVE_TIME_H +#cmakedefine HAVE_TIME_H 1 /* Define to 1 if you have the <ifaddrs.h> header file. */ -#cmakedefine HAVE_IFADDRS_H +#cmakedefine HAVE_IFADDRS_H 1 /* Define to 1 if you have the <unistd.h> header file. */ -#cmakedefine HAVE_UNISTD_H +#cmakedefine HAVE_UNISTD_H 1 /* Define to 1 if you have the windows.h header file. */ -#cmakedefine HAVE_WINDOWS_H +#cmakedefine HAVE_WINDOWS_H 1 /* Define to 1 if you have the winsock2.h header file. */ -#cmakedefine HAVE_WINSOCK2_H +#cmakedefine HAVE_WINSOCK2_H 1 /* Define to 1 if you have the winsock.h header file. */ -#cmakedefine HAVE_WINSOCK_H +#cmakedefine HAVE_WINSOCK_H 1 /* Define to 1 if you have the mswsock.h header file. */ -#cmakedefine HAVE_MSWSOCK_H +#cmakedefine HAVE_MSWSOCK_H 1 /* Define to 1 if you have the winternl.h header file. */ -#cmakedefine HAVE_WINTERNL_H +#cmakedefine HAVE_WINTERNL_H 1 /* Define to 1 if you have the ntstatus.h header file. */ -#cmakedefine HAVE_NTSTATUS_H +#cmakedefine HAVE_NTSTATUS_H 1 /* Define to 1 if you have the ntdef.h header file. */ -#cmakedefine HAVE_NTDEF_H +#cmakedefine HAVE_NTDEF_H 1 /* Define to 1 if you have the writev function. */ -#cmakedefine HAVE_WRITEV +#cmakedefine HAVE_WRITEV 1 /* Define to 1 if you have the ws2tcpip.h header file. */ -#cmakedefine HAVE_WS2TCPIP_H +#cmakedefine HAVE_WS2TCPIP_H 1 /* Define to 1 if you have the __system_property_get function */ -#cmakedefine HAVE___SYSTEM_PROPERTY_GET - -/* Define to 1 if you need the malloc.h header file even with stdlib.h */ -#cmakedefine NEED_MALLOC_H - -/* Define to 1 if you need the memory.h header file even with stdlib.h */ -#cmakedefine NEED_MEMORY_H +#cmakedefine HAVE___SYSTEM_PROPERTY_GET 1 /* Define if have arc4random_buf() */ -#cmakedefine HAVE_ARC4RANDOM_BUF +#cmakedefine HAVE_ARC4RANDOM_BUF 1 /* Define if have getifaddrs() */ -#cmakedefine HAVE_GETIFADDRS +#cmakedefine HAVE_GETIFADDRS 1 /* Define if have stat() */ -#cmakedefine HAVE_STAT +#cmakedefine HAVE_STAT 1 /* a suitable file/device to read random data from */ #cmakedefine CARES_RANDOM_FILE "@CARES_RANDOM_FILE@" @@ -443,9 +458,6 @@ /* Define to the function return type for recv. */ #define RECV_TYPE_RETV @RECV_TYPE_RETV@ -/* Define to the type qualifier of arg 2 for send. */ -#define SEND_QUAL_ARG2 @SEND_QUAL_ARG2@ - /* Define to the type of arg 1 for send. */ #define SEND_TYPE_ARG1 @SEND_TYPE_ARG1@ @@ -468,14 +480,14 @@ #undef WIN32_LEAN_AND_MEAN /* Define to 1 if you have the pthread.h header file. */ -#cmakedefine HAVE_PTHREAD_H +#cmakedefine HAVE_PTHREAD_H 1 /* Define to 1 if you have the pthread_np.h header file. */ -#cmakedefine HAVE_PTHREAD_NP_H +#cmakedefine HAVE_PTHREAD_NP_H 1 /* Define to 1 if threads are enabled */ -#cmakedefine CARES_THREADS +#cmakedefine CARES_THREADS 1 /* Define to 1 if pthread_init() exists */ -#cmakedefine HAVE_PTHREAD_INIT +#cmakedefine HAVE_PTHREAD_INIT 1 diff --git a/deps/cares/src/lib/ares_config.h.in b/deps/cares/src/lib/ares_config.h.in index f486b6b4f000b9..c56e426ea592da 100644 --- a/deps/cares/src/lib/ares_config.h.in +++ b/deps/cares/src/lib/ares_config.h.in @@ -75,6 +75,9 @@ /* Define to 1 if you have `connect` */ #undef HAVE_CONNECT +/* Define to 1 if you have `connectx` */ +#undef HAVE_CONNECTX + /* Define to 1 if you have `ConvertInterfaceIndexToLuid` */ #undef HAVE_CONVERTINTERFACEINDEXTOLUID @@ -84,6 +87,9 @@ /* define if the compiler supports basic C++14 syntax */ #undef HAVE_CXX14 +/* define if the compiler supports basic C++17 syntax */ +#undef HAVE_CXX17 + /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H @@ -102,6 +108,9 @@ /* fcntl() with O_NONBLOCK support */ #undef HAVE_FCNTL_O_NONBLOCK +/* Define to 1 if you have `GetBestRoute2` */ +#undef HAVE_GETBESTROUTE2 + /* Define to 1 if you have `getenv` */ #undef HAVE_GETENV @@ -174,6 +183,9 @@ /* Define to 1 if you have the <malloc.h> header file. */ #undef HAVE_MALLOC_H +/* Define to 1 if you have `memmem` */ +#undef HAVE_MEMMEM + /* Define to 1 if you have the <memory.h> header file. */ #undef HAVE_MEMORY_H @@ -201,6 +213,9 @@ /* Define to 1 if you have the <net/if.h> header file. */ #undef HAVE_NET_IF_H +/* Define to 1 if you have `NotifyIpInterfaceChange` */ +#undef HAVE_NOTIFYIPINTERFACECHANGE + /* Define to 1 if you have the <ntdef.h> header file. */ #undef HAVE_NTDEF_H @@ -237,9 +252,15 @@ /* Define to 1 if you have `recvfrom` */ #undef HAVE_RECVFROM +/* Define to 1 if you have `RegisterWaitForSingleObject` */ +#undef HAVE_REGISTERWAITFORSINGLEOBJECT + /* Define to 1 if you have `send` */ #undef HAVE_SEND +/* Define to 1 if you have `sendto` */ +#undef HAVE_SENDTO + /* Define to 1 if you have `setsockopt` */ #undef HAVE_SETSOCKOPT @@ -294,6 +315,9 @@ /* Define to 1 if you have `strnicmp` */ #undef HAVE_STRNICMP +/* Define to 1 if you have `strnlen` */ +#undef HAVE_STRNLEN + /* Define to 1 if the system has the type `struct addrinfo'. */ #undef HAVE_STRUCT_ADDRINFO @@ -342,6 +366,9 @@ /* Define to 1 if you have the <sys/stat.h> header file. */ #undef HAVE_SYS_STAT_H +/* Define to 1 if you have the <sys/system_properties.h> header file. */ +#undef HAVE_SYS_SYSTEM_PROPERTIES_H + /* Define to 1 if you have the <sys/time.h> header file. */ #undef HAVE_SYS_TIME_H @@ -451,9 +478,6 @@ /* recv() return value */ #undef RECV_TYPE_RETV -/* send() arg2 qualifier */ -#undef SEND_QUAL_ARG2 - /* send() arg1 type */ #undef SEND_TYPE_ARG1 diff --git a/deps/cares/src/lib/ares_conn.c b/deps/cares/src/lib/ares_conn.c new file mode 100644 index 00000000000000..6b315b05486d69 --- /dev/null +++ b/deps/cares/src/lib/ares_conn.c @@ -0,0 +1,511 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +void ares_conn_sock_state_cb_update(ares_conn_t *conn, + ares_conn_state_flags_t flags) +{ + ares_channel_t *channel = conn->server->channel; + + if ((conn->state_flags & ARES_CONN_STATE_CBFLAGS) != flags && + channel->sock_state_cb) { + channel->sock_state_cb(channel->sock_state_cb_data, conn->fd, + flags & ARES_CONN_STATE_READ ? 1 : 0, + flags & ARES_CONN_STATE_WRITE ? 1 : 0); + } + + conn->state_flags &= ~((unsigned int)ARES_CONN_STATE_CBFLAGS); + conn->state_flags |= flags; +} + +ares_conn_err_t ares_conn_read(ares_conn_t *conn, void *data, size_t len, + size_t *read_bytes) +{ + ares_channel_t *channel = conn->server->channel; + ares_conn_err_t err; + + if (!(conn->flags & ARES_CONN_FLAG_TCP)) { + struct sockaddr_storage sa_storage; + ares_socklen_t salen = sizeof(sa_storage); + + memset(&sa_storage, 0, sizeof(sa_storage)); + + err = + ares_socket_recvfrom(channel, conn->fd, ARES_FALSE, data, len, 0, + (struct sockaddr *)&sa_storage, &salen, read_bytes); + +#ifdef HAVE_RECVFROM + if (err == ARES_CONN_ERR_SUCCESS && + !ares_sockaddr_addr_eq((struct sockaddr *)&sa_storage, + &conn->server->addr)) { + err = ARES_CONN_ERR_WOULDBLOCK; + } +#endif + } else { + err = ares_socket_recv(channel, conn->fd, ARES_TRUE, data, len, read_bytes); + } + + /* Toggle connected state if needed */ + if (err == ARES_CONN_ERR_SUCCESS) { + conn->state_flags |= ARES_CONN_STATE_CONNECTED; + } + + return err; +} + +/* Use like: + * struct sockaddr_storage sa_storage; + * ares_socklen_t salen = sizeof(sa_storage); + * struct sockaddr *sa = (struct sockaddr *)&sa_storage; + * ares_conn_set_sockaddr(conn, sa, &salen); + */ +static ares_status_t ares_conn_set_sockaddr(const ares_conn_t *conn, + struct sockaddr *sa, + ares_socklen_t *salen) +{ + const ares_server_t *server = conn->server; + unsigned short port = + conn->flags & ARES_CONN_FLAG_TCP ? server->tcp_port : server->udp_port; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + + switch (server->addr.family) { + case AF_INET: + sin = (struct sockaddr_in *)(void *)sa; + if (*salen < (ares_socklen_t)sizeof(*sin)) { + return ARES_EFORMERR; + } + *salen = sizeof(*sin); + memset(sin, 0, sizeof(*sin)); + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + memcpy(&sin->sin_addr, &server->addr.addr.addr4, sizeof(sin->sin_addr)); + return ARES_SUCCESS; + case AF_INET6: + sin6 = (struct sockaddr_in6 *)(void *)sa; + if (*salen < (ares_socklen_t)sizeof(*sin6)) { + return ARES_EFORMERR; + } + *salen = sizeof(*sin6); + memset(sin6, 0, sizeof(*sin6)); + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + memcpy(&sin6->sin6_addr, &server->addr.addr.addr6, + sizeof(sin6->sin6_addr)); +#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID + sin6->sin6_scope_id = server->ll_scope; +#endif + return ARES_SUCCESS; + default: + break; + } + + return ARES_EBADFAMILY; +} + +static ares_status_t ares_conn_set_self_ip(ares_conn_t *conn, ares_bool_t early) +{ + ares_channel_t *channel = conn->server->channel; + struct sockaddr_storage sa_storage; + int rv; + ares_socklen_t len = sizeof(sa_storage); + + /* We call this twice on TFO, if we already have the IP we can go ahead and + * skip processing */ + if (!early && conn->self_ip.family != AF_UNSPEC) { + return ARES_SUCCESS; + } + + memset(&sa_storage, 0, sizeof(sa_storage)); + + if (channel->sock_funcs.agetsockname == NULL) { + /* Not specified, we can still use cookies cooked with an empty self_ip */ + memset(&conn->self_ip, 0, sizeof(conn->self_ip)); + return ARES_SUCCESS; + } + rv = channel->sock_funcs.agetsockname(conn->fd, + (struct sockaddr *)(void *)&sa_storage, + &len, channel->sock_func_cb_data); + if (rv != 0) { + /* During TCP FastOpen, we can't get the IP this early since connect() + * may not be called. That's ok, we'll try again later */ + if (early && conn->flags & ARES_CONN_FLAG_TCP && + conn->flags & ARES_CONN_FLAG_TFO) { + memset(&conn->self_ip, 0, sizeof(conn->self_ip)); + return ARES_SUCCESS; + } + return ARES_ECONNREFUSED; + } + + if (!ares_sockaddr_to_ares_addr(&conn->self_ip, NULL, + (struct sockaddr *)(void *)&sa_storage)) { + return ARES_ECONNREFUSED; + } + + return ARES_SUCCESS; +} + +ares_conn_err_t ares_conn_write(ares_conn_t *conn, const void *data, size_t len, + size_t *written) +{ + ares_channel_t *channel = conn->server->channel; + ares_bool_t is_tfo = ARES_FALSE; + ares_conn_err_t err = ARES_CONN_ERR_SUCCESS; + struct sockaddr_storage sa_storage; + ares_socklen_t salen = 0; + struct sockaddr *sa = NULL; + + *written = 0; + + /* Don't try to write if not doing initial TFO and not connected */ + if (conn->flags & ARES_CONN_FLAG_TCP && + !(conn->state_flags & ARES_CONN_STATE_CONNECTED) && + !(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) { + return ARES_CONN_ERR_WOULDBLOCK; + } + + /* On initial write during TFO we need to send an address */ + if (conn->flags & ARES_CONN_FLAG_TFO_INITIAL) { + salen = sizeof(sa_storage); + sa = (struct sockaddr *)&sa_storage; + + conn->flags &= ~((unsigned int)ARES_CONN_FLAG_TFO_INITIAL); + is_tfo = ARES_TRUE; + + if (ares_conn_set_sockaddr(conn, sa, &salen) != ARES_SUCCESS) { + return ARES_CONN_ERR_FAILURE; + } + } + + err = ares_socket_write(channel, conn->fd, data, len, written, sa, salen); + if (err != ARES_CONN_ERR_SUCCESS) { + goto done; + } + + if (is_tfo) { + /* If using TFO, we might not have been able to get an IP earlier, since + * we hadn't informed the OS of the destination. When using sendto() + * now we have so we should be able to fetch it */ + ares_conn_set_self_ip(conn, ARES_FALSE); + goto done; + } + +done: + if (err == ARES_CONN_ERR_SUCCESS && len == *written) { + /* Wrote all data, make sure we're not listening for write events unless + * using TFO, in which case we'll need a write event to know when + * we're connected. */ + ares_conn_sock_state_cb_update( + conn, ARES_CONN_STATE_READ | + (is_tfo ? ARES_CONN_STATE_WRITE : ARES_CONN_STATE_NONE)); + } else if (err == ARES_CONN_ERR_WOULDBLOCK) { + /* Need to wait on more buffer space to write */ + ares_conn_sock_state_cb_update(conn, ARES_CONN_STATE_READ | + ARES_CONN_STATE_WRITE); + } + + return err; +} + +ares_status_t ares_conn_flush(ares_conn_t *conn) +{ + const unsigned char *data; + size_t data_len; + size_t count; + ares_conn_err_t err; + ares_status_t status; + ares_bool_t tfo = ARES_FALSE; + + if (conn == NULL) { + return ARES_EFORMERR; + } + + if (conn->flags & ARES_CONN_FLAG_TFO_INITIAL) { + tfo = ARES_TRUE; + } + + do { + if (ares_buf_len(conn->out_buf) == 0) { + status = ARES_SUCCESS; + goto done; + } + + if (conn->flags & ARES_CONN_FLAG_TCP) { + data = ares_buf_peek(conn->out_buf, &data_len); + } else { + unsigned short msg_len; + + /* Read length, then provide buffer without length */ + ares_buf_tag(conn->out_buf); + status = ares_buf_fetch_be16(conn->out_buf, &msg_len); + if (status != ARES_SUCCESS) { + return status; + } + ares_buf_tag_rollback(conn->out_buf); + + data = ares_buf_peek(conn->out_buf, &data_len); + if (data_len < (size_t)(msg_len + 2)) { + status = ARES_EFORMERR; + goto done; + } + data += 2; + data_len = msg_len; + } + + err = ares_conn_write(conn, data, data_len, &count); + if (err != ARES_CONN_ERR_SUCCESS) { + if (err != ARES_CONN_ERR_WOULDBLOCK) { + status = ARES_ECONNREFUSED; + goto done; + } + status = ARES_SUCCESS; + goto done; + } + + /* UDP didn't send the length prefix so augment that here */ + if (!(conn->flags & ARES_CONN_FLAG_TCP)) { + count += 2; + } + + /* Strip data written from the buffer */ + ares_buf_consume(conn->out_buf, count); + status = ARES_SUCCESS; + + /* Loop only for UDP since we have to send per-packet. We already + * sent everything we could if using tcp */ + } while (!(conn->flags & ARES_CONN_FLAG_TCP)); + +done: + if (status == ARES_SUCCESS) { + ares_conn_state_flags_t flags = ARES_CONN_STATE_READ; + + /* When using TFO, the we need to enabling waiting on a write event to + * be notified of when a connection is actually established */ + if (tfo) { + flags |= ARES_CONN_STATE_WRITE; + } + + /* If using TCP and not all data was written (partial write), that means + * we need to also wait on a write event */ + if (conn->flags & ARES_CONN_FLAG_TCP && ares_buf_len(conn->out_buf)) { + flags |= ARES_CONN_STATE_WRITE; + } + + ares_conn_sock_state_cb_update(conn, flags); + } + + return status; +} + +static ares_status_t ares_conn_connect(ares_conn_t *conn, + const struct sockaddr *sa, + ares_socklen_t salen) +{ + ares_conn_err_t err; + + err = ares_socket_connect( + conn->server->channel, conn->fd, + (conn->flags & ARES_CONN_FLAG_TFO) ? ARES_TRUE : ARES_FALSE, sa, salen); + + if (err != ARES_CONN_ERR_WOULDBLOCK && err != ARES_CONN_ERR_SUCCESS) { + return ARES_ECONNREFUSED; + } + return ARES_SUCCESS; +} + +ares_status_t ares_open_connection(ares_conn_t **conn_out, + ares_channel_t *channel, + ares_server_t *server, ares_bool_t is_tcp) +{ + ares_status_t status; + struct sockaddr_storage sa_storage; + ares_socklen_t salen = sizeof(sa_storage); + struct sockaddr *sa = (struct sockaddr *)&sa_storage; + ares_conn_t *conn; + ares_llist_node_t *node = NULL; + int stype = is_tcp ? SOCK_STREAM : SOCK_DGRAM; + ares_conn_state_flags_t state_flags; + + *conn_out = NULL; + + conn = ares_malloc(sizeof(*conn)); + if (conn == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memset(conn, 0, sizeof(*conn)); + conn->fd = ARES_SOCKET_BAD; + conn->server = server; + conn->queries_to_conn = ares_llist_create(NULL); + conn->flags = is_tcp ? ARES_CONN_FLAG_TCP : ARES_CONN_FLAG_NONE; + conn->out_buf = ares_buf_create(); + conn->in_buf = ares_buf_create(); + + if (conn->queries_to_conn == NULL || conn->out_buf == NULL || + conn->in_buf == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ + status = ARES_ENOMEM; + goto done; + /* LCOV_EXCL_STOP */ + } + + /* Try to enable TFO always if using TCP. it will fail later on if its + * really not supported when we try to enable it on the socket. */ + if (conn->flags & ARES_CONN_FLAG_TCP) { + conn->flags |= ARES_CONN_FLAG_TFO; + } + + /* Convert into the struct sockaddr structure needed by the OS */ + status = ares_conn_set_sockaddr(conn, sa, &salen); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Acquire a socket. */ + if (ares_socket_open(&conn->fd, channel, server->addr.family, stype, 0) != + ARES_CONN_ERR_SUCCESS) { + status = ARES_ECONNREFUSED; + goto done; + } + + /* Configure channel configured options */ + status = ares_socket_configure( + channel, server->addr.family, + (conn->flags & ARES_CONN_FLAG_TCP) ? ARES_TRUE : ARES_FALSE, conn->fd); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Enable TFO if possible */ + if (conn->flags & ARES_CONN_FLAG_TFO && + ares_socket_enable_tfo(channel, conn->fd) != ARES_CONN_ERR_SUCCESS) { + conn->flags &= ~((unsigned int)ARES_CONN_FLAG_TFO); + } + + if (channel->sock_config_cb) { + int err = + channel->sock_config_cb(conn->fd, stype, channel->sock_config_cb_data); + if (err < 0) { + status = ARES_ECONNREFUSED; + goto done; + } + } + + /* Connect */ + status = ares_conn_connect(conn, sa, salen); + if (status != ARES_SUCCESS) { + goto done; + } + + if (channel->sock_create_cb) { + int err = + channel->sock_create_cb(conn->fd, stype, channel->sock_create_cb_data); + if (err < 0) { + status = ARES_ECONNREFUSED; + goto done; + } + } + + /* Let the connection know we haven't written our first packet yet for TFO */ + if (conn->flags & ARES_CONN_FLAG_TFO) { + conn->flags |= ARES_CONN_FLAG_TFO_INITIAL; + } + + /* Need to store our own ip for DNS cookie support */ + status = ares_conn_set_self_ip(conn, ARES_TRUE); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: UntestablePath */ + } + + /* TCP connections are thrown to the end as we don't spawn multiple TCP + * connections. UDP connections are put on front where the newest connection + * can be quickly pulled */ + if (is_tcp) { + node = ares_llist_insert_last(server->connections, conn); + } else { + node = ares_llist_insert_first(server->connections, conn); + } + if (node == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ + status = ARES_ENOMEM; + goto done; + /* LCOV_EXCL_STOP */ + } + + /* Register globally to quickly map event on file descriptor to connection + * node object */ + if (!ares_htable_asvp_insert(channel->connnode_by_socket, conn->fd, node)) { + /* LCOV_EXCL_START: OutOfMemory */ + status = ARES_ENOMEM; + goto done; + /* LCOV_EXCL_STOP */ + } + + state_flags = ARES_CONN_STATE_READ; + + /* Get notified on connect if using TCP */ + if (conn->flags & ARES_CONN_FLAG_TCP) { + state_flags |= ARES_CONN_STATE_WRITE; + } + + /* Dot no attempt to update sock state callbacks on TFO until *after* the + * initial write is performed. Due to the notification event, its possible + * an erroneous read can come in before the attempt to write the data which + * might be used to set the ip address */ + if (!(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) { + ares_conn_sock_state_cb_update(conn, state_flags); + } + + if (is_tcp) { + server->tcp_conn = conn; + } + +done: + if (status != ARES_SUCCESS) { + ares_llist_node_claim(node); + ares_llist_destroy(conn->queries_to_conn); + ares_socket_close(channel, conn->fd); + ares_buf_destroy(conn->out_buf); + ares_buf_destroy(conn->in_buf); + ares_free(conn); + } else { + *conn_out = conn; + } + return status; +} + +ares_conn_t *ares_conn_from_fd(const ares_channel_t *channel, ares_socket_t fd) +{ + ares_llist_node_t *node; + + node = ares_htable_asvp_get_direct(channel->connnode_by_socket, fd); + if (node == NULL) { + return NULL; + } + + return ares_llist_node_val(node); +} diff --git a/deps/cares/src/lib/ares_conn.h b/deps/cares/src/lib/ares_conn.h new file mode 100644 index 00000000000000..16ecefdd19fa67 --- /dev/null +++ b/deps/cares/src/lib/ares_conn.h @@ -0,0 +1,196 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_CONN_H +#define __ARES_CONN_H + +#include "ares_socket.h" + +struct ares_conn; +typedef struct ares_conn ares_conn_t; + +struct ares_server; +typedef struct ares_server ares_server_t; + +typedef enum { + /*! No flags */ + ARES_CONN_FLAG_NONE = 0, + /*! TCP connection, not UDP */ + ARES_CONN_FLAG_TCP = 1 << 0, + /*! TCP Fast Open is enabled and being used if supported by the OS */ + ARES_CONN_FLAG_TFO = 1 << 1, + /*! TCP Fast Open has not yet sent its first packet. Gets unset on first + * write to a connection */ + ARES_CONN_FLAG_TFO_INITIAL = 1 << 2 +} ares_conn_flags_t; + +typedef enum { + ARES_CONN_STATE_NONE = 0, + ARES_CONN_STATE_READ = 1 << 0, + ARES_CONN_STATE_WRITE = 1 << 1, + ARES_CONN_STATE_CONNECTED = 1 << 2, /* This doesn't get a callback */ + ARES_CONN_STATE_CBFLAGS = ARES_CONN_STATE_READ | ARES_CONN_STATE_WRITE +} ares_conn_state_flags_t; + +struct ares_conn { + ares_server_t *server; + ares_socket_t fd; + struct ares_addr self_ip; + ares_conn_flags_t flags; + ares_conn_state_flags_t state_flags; + + /*! Outbound buffered data that is not yet sent. Exists as one contiguous + * stream in TCP format (big endian 16bit length prefix followed by DNS + * wire-format message). For TCP this can be sent as-is, UDP this must + * be sent per-packet (stripping the length prefix) */ + ares_buf_t *out_buf; + + /*! Inbound buffered data that is not yet parsed. Exists as one contiguous + * stream in TCP format (big endian 16bit length prefix followed by DNS + * wire-format message). TCP may have partial data and this needs to be + * handled gracefully, but UDP will always have a full message */ + ares_buf_t *in_buf; + + /* total number of queries run on this connection since it was established */ + size_t total_queries; + + /* list of outstanding queries to this connection */ + ares_llist_t *queries_to_conn; +}; + +/*! Various buckets for grouping history */ +typedef enum { + ARES_METRIC_1MINUTE = 0, /*!< Bucket for tracking over the last minute */ + ARES_METRIC_15MINUTES, /*!< Bucket for tracking over the last 15 minutes */ + ARES_METRIC_1HOUR, /*!< Bucket for tracking over the last hour */ + ARES_METRIC_1DAY, /*!< Bucket for tracking over the last day */ + ARES_METRIC_INCEPTION, /*!< Bucket for tracking since inception */ + ARES_METRIC_COUNT /*!< Count of buckets, not a real bucket */ +} ares_server_bucket_t; + +/*! Data metrics collected for each bucket */ +typedef struct { + time_t ts; /*!< Timestamp divided by bucket divisor */ + unsigned int latency_min_ms; /*!< Minimum latency for queries */ + unsigned int latency_max_ms; /*!< Maximum latency for queries */ + ares_uint64_t total_ms; /*!< Cumulative query time for bucket */ + ares_uint64_t total_count; /*!< Number of queries for bucket */ + + time_t prev_ts; /*!< Previous period bucket timestamp */ + ares_uint64_t + prev_total_ms; /*!< Previous period bucket cumulative query time */ + ares_uint64_t prev_total_count; /*!< Previous period bucket query count */ +} ares_server_metrics_t; + +typedef enum { + ARES_COOKIE_INITIAL = 0, + ARES_COOKIE_GENERATED = 1, + ARES_COOKIE_SUPPORTED = 2, + ARES_COOKIE_UNSUPPORTED = 3 +} ares_cookie_state_t; + +/*! Structure holding tracking data for RFC 7873/9018 DNS cookies. + * Implementation plan for this feature is here: + * https://github.com/c-ares/c-ares/issues/620 + */ +typedef struct { + /*! starts at INITIAL, transitions as needed. */ + ares_cookie_state_t state; + /*! randomly-generate client cookie */ + unsigned char client[8]; + /*! timestamp client cookie was generated, used for rotation purposes */ + ares_timeval_t client_ts; + /*! IP address last used for client to connect to server. If this changes + * The client cookie gets invalidated */ + struct ares_addr client_ip; + /*! Server Cookie last received, 8-32 bytes in length */ + unsigned char server[32]; + /*! Length of server cookie on file. */ + size_t server_len; + /*! Timestamp of last attempt to use cookies, but it was determined that the + * server didn't support them */ + ares_timeval_t unsupported_ts; +} ares_cookie_t; + +struct ares_server { + /* Configuration */ + size_t idx; /* index for server in system configuration */ + struct ares_addr addr; + unsigned short udp_port; /* host byte order */ + unsigned short tcp_port; /* host byte order */ + char ll_iface[64]; /* IPv6 Link Local Interface */ + unsigned int ll_scope; /* IPv6 Link Local Scope */ + + size_t consec_failures; /* Consecutive query failure count + * can be hard errors or timeouts + */ + ares_bool_t probe_pending; /* Whether a probe is pending for this + * server due to prior failures */ + ares_llist_t *connections; + ares_conn_t *tcp_conn; + + /* The next time when we will retry this server if it has hit failures */ + ares_timeval_t next_retry_time; + + /*! Buckets for collecting metrics about the server */ + ares_server_metrics_t metrics[ARES_METRIC_COUNT]; + + /*! RFC 7873/9018 DNS Cookies */ + ares_cookie_t cookie; + + /* Link back to owning channel */ + ares_channel_t *channel; +}; + +void ares_close_connection(ares_conn_t *conn, ares_status_t requeue_status); +void ares_close_sockets(ares_server_t *server); +void ares_check_cleanup_conns(const ares_channel_t *channel); + +void ares_destroy_servers_state(ares_channel_t *channel); +ares_status_t ares_open_connection(ares_conn_t **conn_out, + ares_channel_t *channel, + ares_server_t *server, ares_bool_t is_tcp); + +ares_conn_err_t ares_conn_write(ares_conn_t *conn, const void *data, size_t len, + size_t *written); +ares_status_t ares_conn_flush(ares_conn_t *conn); +ares_conn_err_t ares_conn_read(ares_conn_t *conn, void *data, size_t len, + size_t *read_bytes); +ares_conn_t *ares_conn_from_fd(const ares_channel_t *channel, ares_socket_t fd); +void ares_conn_sock_state_cb_update(ares_conn_t *conn, + ares_conn_state_flags_t flags); +ares_conn_err_t ares_socket_recv(ares_channel_t *channel, ares_socket_t s, + ares_bool_t is_tcp, void *data, + size_t data_len, size_t *read_bytes); +ares_conn_err_t ares_socket_recvfrom(ares_channel_t *channel, ares_socket_t s, + ares_bool_t is_tcp, void *data, + size_t data_len, int flags, + struct sockaddr *from, + ares_socklen_t *from_len, + size_t *read_bytes); + +void ares_destroy_server(ares_server_t *server); + +#endif diff --git a/deps/cares/src/lib/ares_cookie.c b/deps/cares/src/lib/ares_cookie.c new file mode 100644 index 00000000000000..509e12050e0c00 --- /dev/null +++ b/deps/cares/src/lib/ares_cookie.c @@ -0,0 +1,461 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +/* DNS cookies are a simple form of learned mutual authentication supported by + * most DNS server implementations these days and can help prevent DNS Cache + * Poisoning attacks for clients and DNS amplification attacks for servers. + * + * A good overview is here: + * https://www.dotmagazine.online/issues/digital-responsibility-and-sustainability/dns-cookies-transaction-mechanism + * + * RFCs used for implementation are + * [RFC7873](https://datatracker.ietf.org/doc/html/rfc7873) which is extended by + * [RFC9018](https://datatracker.ietf.org/doc/html/rfc9018). + * + * Though this could be used on TCP, the likelihood of it being useful is small + * and could cause some issues. TCP is better used as a fallback in case there + * are issues with DNS Cookie support in the upstream servers (e.g. AnyCast + * cluster issues). + * + * While most recursive DNS servers support DNS Cookies, public DNS servers like + * Google (8.8.8.8, 8.8.4.4) and CloudFlare (1.1.1.1, 1.0.0.1) don't seem to + * have this enabled yet for unknown reasons. + * + * The risk to having DNS Cookie support always enabled is nearly zero as there + * is built-in detection support and it will simply bypass using cookies if the + * remote server doesn't support it. The problem arises if a remote server + * supports DNS cookies, then stops supporting them (such as if an administrator + * reconfigured the server, or maybe there are different servers in a cluster + * with different configurations). We need to detect this behavior by tracking + * how much time has gone by since we received our last valid cookie reply, and + * if we exceed the threshold, reset all cookie parameters like we haven't + * attempted a request yet. + * + * ## Implementation Plan + * + * ### Constants: + * - `COOKIE_CLIENT_TIMEOUT`: 86400s (1 day) + * - How often to regenerate the per-server client cookie, even if our + * source ip address hasn't changed. + * - `COOKIE_UNSUPPORTED_TIMEOUT`: 300s (5 minutes) + * - If a server responds without a cookie in the reply, this is how long to + * wait before attempting to send a client cookie again. + * - `COOKIE_REGRESSION_TIMEOUT`: 120s (2 minutes) + * - If a server was once known to return cookies, and all of a sudden stops + * returning cookies (but the reply is otherwise valid), this is how long + * to continue to attempt to use cookies before giving up and resetting. + * Such an event would cause an outage for this duration, but since a + * cache poisoning attack should be dropping invalid replies we should be + * able to still get the valid reply and not assume it is a server + * regression just because we received replies without cookies. + * - `COOKIE_RESEND_MAX`: 3 + * - Maximum times to resend a query to a server due to the server responding + * with `BAD_COOKIE`, after this, we switch to TCP. + * + * ### Per-server variables: + * - `cookie.state`: Known state of cookie support, enumeration. + * - `INITIAL` (0): Initial state, not yet determined. Used during startup. + * - `GENERATED` (1): Cookie has been generated and sent to a server, but no + * validated response yet. + * - `SUPPORTED` (2): Server has been determined to properly support cookies + * - `UNSUPPORTED` (3): Server has been determined to not support cookies + * - `cookie.client` : 8 byte randomly generated client cookie + * - `cookie.client_ts`: Timestamp client cookie was generated + * - `cookie.client_ip`: IP address client used to connect to server + * - `cookie.server`: 8 to 32 byte server cookie + * - `cookie.server_len`: length of server cookie + * - `cookie.unsupported_ts`: Timestamp of last attempt to use a cookies, but + * it was determined that the server didn't support them. + * + * ### Per-query variables: + * - `query.client_cookie`: Duplicate of `cookie.client` at the point in time + * the query is put on the wire. This should be available in the + * `ares_dns_record_t` for the request for verification purposes so we don't + * actually need to duplicate this, just naming it here for the ease of + * documentation below. + * - `query.cookie_try_count`: Number of tries to send a cookie but receive + * `BAD_COOKIE` responses. Used to know when we need to switch to TCP. + * + * ### Procedure: + * **NOTE**: These steps will all be done after obtaining a connection handle as + * some of these steps depend on determining the source ip address for the + * connection. + * + * 1. If the query is not using EDNS, then **skip any remaining processing**. + * 2. If using TCP, ensure there is no EDNS cookie opt (10) set (there may have + * been if this is a resend after upgrade to TCP), then **skip any remaining + * processing**. + * 3. If `cookie.state == SUPPORTED`, `cookie.unsupported_ts` is non-zero, and + * evaluates greater than `COOKIE_REGRESSION_TIMEOUT`, then clear all cookie + * settings, set `cookie.state = INITIAL`. Continue to next step (4) + * 4. If `cookie.state == UNSUPPORTED` + * - If `cookie.unsupported_ts` evaluates less than + * `COOKIE_UNSUPPORTED_TIMEOUT` + * - Ensure there is no EDNS cookie opt (10) set (shouldn't be unless + * requester had put this themselves), then **skip any remaining + * processing** as we don't want to try to send cookies. + * - Otherwise: + * - clear all cookie settings, set `cookie.state = INITIAL`. + * - Continue to next step (5) which will send a new cookie. + * 5. If `cookie.state == INITIAL`: + * - randomly generate new `cookie.client` + * - set `cookie.client_ts` to the current timestamp. + * - set `cookie.state = GENERATED`. + * - set `cookie.client_ip` to the current source ip address. + * 6. If `cookie.state == GENERATED || cookie.state == SUPPORTED` and + * `cookie.client_ip` does not match the current source ip address: + * - clear `cookie.server` + * - randomly generate new `cookie.client` + * - set `cookie.client_ts` to the current timestamp. + * - set `cookie.client_ip` to the current source ip address. + * - do not change the `cookie.state` + * 7. If `cookie.state == SUPPORTED` and `cookie.client_ts` evaluation exceeds + * `COOKIE_CLIENT_TIMEOUT`: + * - clear `cookie.server` + * - randomly generate new `cookie.client` + * - set `cookie.client_ts` to the current timestamp. + * - set `cookie.client_ip` to the current source ip address. + * - do not change the `cookie.state` + * 8. Generate EDNS OPT record (10) for client cookie. The option value will be + * the `cookie.client` concatenated with the `cookie.server`. If there is no + * known server cookie, it will not be appended. Copy `cookie.client` to + * `query.client_cookie` to handle possible client cookie changes by other + * queries before a reply is received (technically this is in the cached + * `ares_dns_record_t` so no need to manually do this). Send request to + * server. + * 9. Evaluate response: + * 1. If invalid EDNS OPT cookie (10) length sent back in response (valid + * length is 16-40), or bad client cookie value (validate first 8 bytes + * against `query.client_cookie` not `cookie.client`), **drop response** + * as if it hadn't been received. This is likely a spoofing attack. + * Wait for valid response up to normal response timeout. + * 2. If a EDNS OPT cookie (10) server cookie is returned: + * - set `cookie.unsupported_ts` to zero and `cookie.state = SUPPORTED`. + * We can confirm this server supports cookies based on the existence + * of this record. + * - If a new EDNS OPT cookie (10) server cookie is in the response, and + * the `client.cookie` matches the `query.client_cookie` still (hasn't + * been rotated by some other parallel query), save it as + * `cookie.server`. + * 3. If dns response `rcode` is `BAD_COOKIE`: + * - Ensure a EDNS OPT cookie (10) is returned, otherwise **drop + * response**, this is completely invalid and likely an spoof of some + * sort. + * - Otherwise + * - Increment `query.cookie_try_count` + * - If `query.cookie_try_count >= COOKIE_RESEND_MAX`, set + * `query.using_tcp` to force the next attempt to use TCP. + * - **Requeue the query**, but do not increment the normal + * `try_count` as a `BAD_COOKIE` reply isn't a normal try failure. + * This should end up going all the way back to step 1 on the next + * attempt. + * 4. If EDNS OPT cookie (10) is **NOT** returned in the response: + * - If `cookie.state == SUPPORTED` + * - if `cookie.unsupported_ts` is zero, set to the current timestamp. + * - Drop the response, wait for a valid response to be returned + * - if `cookie.state == GENERATED` + * - clear all cookie settings + * - set `cookie.state = UNSUPPORTED` + * - set `cookie.unsupported_ts` to the current time + * - Accept response (state should be `UNSUPPORTED` if we're here) + */ + +#include "ares_private.h" + +/* 1 day */ +#define COOKIE_CLIENT_TIMEOUT_MS (86400 * 1000) + +/* 5 minutes */ +#define COOKIE_UNSUPPORTED_TIMEOUT_MS (300 * 1000) + +/* 2 minutes */ +#define COOKIE_REGRESSION_TIMEOUT_MS (120 * 1000) + +#define COOKIE_RESEND_MAX 3 + +static const unsigned char * + ares_dns_cookie_fetch(const ares_dns_record_t *dnsrec, size_t *len) +{ + const ares_dns_rr_t *rr = ares_dns_get_opt_rr_const(dnsrec); + const unsigned char *val = NULL; + *len = 0; + + if (rr == NULL) { + return NULL; + } + + if (!ares_dns_rr_get_opt_byid(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE, + &val, len)) { + return NULL; + } + + return val; +} + +static ares_bool_t timeval_is_set(const ares_timeval_t *tv) +{ + if (tv->sec != 0 && tv->usec != 0) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +static ares_bool_t timeval_expired(const ares_timeval_t *tv, + const ares_timeval_t *now, + unsigned long millsecs) +{ + ares_int64_t tvdiff_ms; + ares_timeval_t tvdiff; + ares_timeval_diff(&tvdiff, tv, now); + + tvdiff_ms = tvdiff.sec * 1000 + tvdiff.usec / 1000; + if (tvdiff_ms >= (ares_int64_t)millsecs) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +static void ares_cookie_clear(ares_cookie_t *cookie) +{ + memset(cookie, 0, sizeof(*cookie)); + cookie->state = ARES_COOKIE_INITIAL; +} + +static void ares_cookie_generate(ares_cookie_t *cookie, ares_conn_t *conn, + const ares_timeval_t *now) +{ + ares_channel_t *channel = conn->server->channel; + + ares_rand_bytes(channel->rand_state, cookie->client, sizeof(cookie->client)); + memcpy(&cookie->client_ts, now, sizeof(cookie->client_ts)); + memcpy(&cookie->client_ip, &conn->self_ip, sizeof(cookie->client_ip)); +} + +static void ares_cookie_clear_server(ares_cookie_t *cookie) +{ + memset(cookie->server, 0, sizeof(cookie->server)); + cookie->server_len = 0; +} + +static ares_bool_t ares_addr_equal(const struct ares_addr *addr1, + const struct ares_addr *addr2) +{ + if (addr1->family != addr2->family) { + return ARES_FALSE; + } + + switch (addr1->family) { + case AF_INET: + if (memcmp(&addr1->addr.addr4, &addr2->addr.addr4, + sizeof(addr1->addr.addr4)) == 0) { + return ARES_TRUE; + } + break; + case AF_INET6: + /* This structure is weird, and due to padding SonarCloud complains if + * you don't punch all the way down. At some point we should rework + * this structure */ + if (memcmp(&addr1->addr.addr6._S6_un._S6_u8, + &addr2->addr.addr6._S6_un._S6_u8, + sizeof(addr1->addr.addr6._S6_un._S6_u8)) == 0) { + return ARES_TRUE; + } + break; + default: + break; /* LCOV_EXCL_LINE */ + } + + return ARES_FALSE; +} + +ares_status_t ares_cookie_apply(ares_dns_record_t *dnsrec, ares_conn_t *conn, + const ares_timeval_t *now) +{ + ares_server_t *server = conn->server; + ares_cookie_t *cookie = &server->cookie; + ares_dns_rr_t *rr = ares_dns_get_opt_rr(dnsrec); + unsigned char c[40]; + size_t c_len; + + /* If there is no OPT record, then EDNS isn't supported, and therefore + * cookies can't be supported */ + if (rr == NULL) { + return ARES_SUCCESS; + } + + /* No cookies on TCP, make sure we remove one if one is present */ + if (conn->flags & ARES_CONN_FLAG_TCP) { + ares_dns_rr_del_opt_byid(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE); + return ARES_SUCCESS; + } + + /* Look for regression */ + if (cookie->state == ARES_COOKIE_SUPPORTED && + timeval_is_set(&cookie->unsupported_ts) && + timeval_expired(&cookie->unsupported_ts, now, + COOKIE_REGRESSION_TIMEOUT_MS)) { + ares_cookie_clear(cookie); + } + + /* Handle unsupported state */ + if (cookie->state == ARES_COOKIE_UNSUPPORTED) { + /* If timer hasn't expired, just delete any possible cookie and return */ + if (!timeval_expired(&cookie->unsupported_ts, now, + COOKIE_REGRESSION_TIMEOUT_MS)) { + ares_dns_rr_del_opt_byid(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE); + return ARES_SUCCESS; + } + + /* We want to try to "learn" again */ + ares_cookie_clear(cookie); + } + + /* Generate a new cookie */ + if (cookie->state == ARES_COOKIE_INITIAL) { + ares_cookie_generate(cookie, conn, now); + cookie->state = ARES_COOKIE_GENERATED; + } + + /* Regenerate the cookie and clear the server cookie if the client ip has + * changed */ + if ((cookie->state == ARES_COOKIE_GENERATED || + cookie->state == ARES_COOKIE_SUPPORTED) && + !ares_addr_equal(&conn->self_ip, &cookie->client_ip)) { + ares_cookie_clear_server(cookie); + ares_cookie_generate(cookie, conn, now); + } + + /* If the client cookie has reached its maximum time, refresh it */ + if (cookie->state == ARES_COOKIE_SUPPORTED && + timeval_expired(&cookie->client_ts, now, COOKIE_CLIENT_TIMEOUT_MS)) { + ares_cookie_clear_server(cookie); + ares_cookie_generate(cookie, conn, now); + } + + /* Generate the full cookie which is the client cookie concatenated with the + * server cookie (if there is one) and apply it. */ + memcpy(c, cookie->client, sizeof(cookie->client)); + if (cookie->server_len) { + memcpy(c + sizeof(cookie->client), cookie->server, cookie->server_len); + } + c_len = sizeof(cookie->client) + cookie->server_len; + + return ares_dns_rr_set_opt(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE, c, + c_len); +} + +ares_status_t ares_cookie_validate(ares_query_t *query, + const ares_dns_record_t *dnsresp, + ares_conn_t *conn, const ares_timeval_t *now, + ares_array_t **requeue) +{ + ares_server_t *server = conn->server; + ares_cookie_t *cookie = &server->cookie; + const ares_dns_record_t *dnsreq = query->query; + const unsigned char *resp_cookie; + size_t resp_cookie_len; + const unsigned char *req_cookie; + size_t req_cookie_len; + + resp_cookie = ares_dns_cookie_fetch(dnsresp, &resp_cookie_len); + + /* Invalid cookie length, drop */ + if (resp_cookie && (resp_cookie_len < 8 || resp_cookie_len > 40)) { + return ARES_EBADRESP; + } + + req_cookie = ares_dns_cookie_fetch(dnsreq, &req_cookie_len); + + /* Didn't request cookies, so we can stop evaluating */ + if (req_cookie == NULL) { + return ARES_SUCCESS; + } + + /* If 8-byte prefix for returned cookie doesn't match the requested cookie, + * drop for spoofing */ + if (resp_cookie && memcmp(req_cookie, resp_cookie, 8) != 0) { + return ARES_EBADRESP; + } + + if (resp_cookie && resp_cookie_len > 8) { + /* Make sure we record that we successfully received a cookie response */ + cookie->state = ARES_COOKIE_SUPPORTED; + memset(&cookie->unsupported_ts, 0, sizeof(cookie->unsupported_ts)); + + /* If client cookie hasn't been rotated, save the returned server cookie */ + if (memcmp(cookie->client, req_cookie, sizeof(cookie->client)) == 0) { + cookie->server_len = resp_cookie_len - 8; + memcpy(cookie->server, resp_cookie + 8, cookie->server_len); + } + } + + if (ares_dns_record_get_rcode(dnsresp) == ARES_RCODE_BADCOOKIE) { + /* Illegal to return BADCOOKIE but no cookie, drop */ + if (resp_cookie == NULL) { + return ARES_EBADRESP; + } + + /* If we have too many attempts to send a cookie, we need to requeue as + * tcp */ + query->cookie_try_count++; + if (query->cookie_try_count >= COOKIE_RESEND_MAX) { + query->using_tcp = ARES_TRUE; + } + + /* Resend the request, hopefully it will work the next time as we should + * have recorded a server cookie */ + ares_requeue_query(query, now, ARES_SUCCESS, + ARES_FALSE /* Don't increment try count */, NULL, + requeue); + + /* Parent needs to drop this response */ + return ARES_EBADRESP; + } + + /* We've got a response with a server cookie, and we've done all the + * evaluation we can, return success */ + if (resp_cookie_len > 8) { + return ARES_SUCCESS; + } + + if (cookie->state == ARES_COOKIE_SUPPORTED) { + /* If we're not currently tracking an error time yet, start */ + if (!timeval_is_set(&cookie->unsupported_ts)) { + memcpy(&cookie->unsupported_ts, now, sizeof(cookie->unsupported_ts)); + } + /* Drop it since we expected a cookie */ + return ARES_EBADRESP; + } + + if (cookie->state == ARES_COOKIE_GENERATED) { + ares_cookie_clear(cookie); + cookie->state = ARES_COOKIE_UNSUPPORTED; + memcpy(&cookie->unsupported_ts, now, sizeof(cookie->unsupported_ts)); + } + + /* Cookie state should be UNSUPPORTED if we're here */ + return ARES_SUCCESS; +} diff --git a/deps/cares/src/lib/ares_data.c b/deps/cares/src/lib/ares_data.c index e37088283bafeb..d25c3fafff59a8 100644 --- a/deps/cares/src/lib/ares_data.c +++ b/deps/cares/src/lib/ares_data.c @@ -24,14 +24,10 @@ * SPDX-License-Identifier: MIT */ - -#include "ares_setup.h" - +#include "ares_private.h" #include <stddef.h> - -#include "ares.h" +#include <assert.h> #include "ares_data.h" -#include "ares_private.h" /* ** ares_free_data() - c-ares external API function. diff --git a/deps/cares/src/lib/ares_destroy.c b/deps/cares/src/lib/ares_destroy.c index 6965b601e76e07..1e5706e0e06b80 100644 --- a/deps/cares/src/lib/ares_destroy.c +++ b/deps/cares/src/lib/ares_destroy.c @@ -25,34 +25,59 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" - -#include <assert.h> - -#include "ares.h" #include "ares_private.h" +#include "event/ares_event.h" +#include <assert.h> void ares_destroy(ares_channel_t *channel) { - size_t i; - ares__llist_node_t *node = NULL; + size_t i; + ares_llist_node_t *node = NULL; if (channel == NULL) { return; } - /* Lock because callbacks will be triggered */ - ares__channel_lock(channel); + /* Mark as being shutdown */ + ares_channel_lock(channel); + channel->sys_up = ARES_FALSE; + ares_channel_unlock(channel); + + /* Disable configuration change monitoring. We can't hold a lock because + * some cleanup routines, such as on Windows, are synchronous operations. + * What we've observed is a system config change event was triggered right + * at shutdown time and it tries to take the channel lock and the destruction + * waits for that event to complete before it continues so we get a channel + * lock deadlock at shutdown if we hold a lock during this process. */ + if (channel->optmask & ARES_OPT_EVENT_THREAD) { + ares_event_thread_t *e = channel->sock_state_cb_data; + if (e && e->configchg) { + ares_event_configchg_destroy(e->configchg); + e->configchg = NULL; + } + } + + /* Wait for reinit thread to exit if there was one pending, can't be + * holding a lock as the thread may take locks. */ + if (channel->reinit_thread != NULL) { + void *rv; + ares_thread_join(channel->reinit_thread, &rv); + channel->reinit_thread = NULL; + } + + /* Lock because callbacks will be triggered, and any system-generated + * callbacks need to hold a channel lock. */ + ares_channel_lock(channel); /* Destroy all queries */ - node = ares__llist_node_first(channel->all_queries); + node = ares_llist_node_first(channel->all_queries); while (node != NULL) { - ares__llist_node_t *next = ares__llist_node_next(node); - struct query *query = ares__llist_node_claim(node); + ares_llist_node_t *next = ares_llist_node_next(node); + ares_query_t *query = ares_llist_node_claim(node); query->node_all_queries = NULL; query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL); - ares__free_query(query); + ares_free_query(query); node = next; } @@ -63,19 +88,19 @@ void ares_destroy(ares_channel_t *channel) /* Freeing the query should remove it from all the lists in which it sits, * so all query lists should be empty now. */ - assert(ares__llist_len(channel->all_queries) == 0); - assert(ares__htable_szvp_num_keys(channel->queries_by_qid) == 0); - assert(ares__slist_len(channel->queries_by_timeout) == 0); + assert(ares_llist_len(channel->all_queries) == 0); + assert(ares_htable_szvp_num_keys(channel->queries_by_qid) == 0); + assert(ares_slist_len(channel->queries_by_timeout) == 0); #endif - ares__destroy_servers_state(channel); + ares_destroy_servers_state(channel); #ifndef NDEBUG - assert(ares__htable_asvp_num_keys(channel->connnode_by_socket) == 0); + assert(ares_htable_asvp_num_keys(channel->connnode_by_socket) == 0); #endif /* No more callbacks will be triggered after this point, unlock */ - ares__channel_unlock(channel); + ares_channel_unlock(channel); /* Shut down the event thread */ if (channel->optmask & ARES_OPT_EVENT_THREAD) { @@ -89,48 +114,46 @@ void ares_destroy(ares_channel_t *channel) ares_free(channel->domains); } - ares__llist_destroy(channel->all_queries); - ares__slist_destroy(channel->queries_by_timeout); - ares__htable_szvp_destroy(channel->queries_by_qid); - ares__htable_asvp_destroy(channel->connnode_by_socket); + ares_llist_destroy(channel->all_queries); + ares_slist_destroy(channel->queries_by_timeout); + ares_htable_szvp_destroy(channel->queries_by_qid); + ares_htable_asvp_destroy(channel->connnode_by_socket); ares_free(channel->sortlist); ares_free(channel->lookups); ares_free(channel->resolvconf_path); ares_free(channel->hosts_path); - ares__destroy_rand_state(channel->rand_state); + ares_destroy_rand_state(channel->rand_state); - ares__hosts_file_destroy(channel->hf); + ares_hosts_file_destroy(channel->hf); - ares__qcache_destroy(channel->qcache); + ares_qcache_destroy(channel->qcache); - ares__channel_threading_destroy(channel); + ares_channel_threading_destroy(channel); ares_free(channel); } -void ares__destroy_server(struct server_state *server) +void ares_destroy_server(ares_server_t *server) { if (server == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__close_sockets(server); - ares__llist_destroy(server->connections); - ares__buf_destroy(server->tcp_parser); - ares__buf_destroy(server->tcp_send); + ares_close_sockets(server); + ares_llist_destroy(server->connections); ares_free(server); } -void ares__destroy_servers_state(ares_channel_t *channel) +void ares_destroy_servers_state(ares_channel_t *channel) { - ares__slist_node_t *node; + ares_slist_node_t *node; - while ((node = ares__slist_node_first(channel->servers)) != NULL) { - struct server_state *server = ares__slist_node_claim(node); - ares__destroy_server(server); + while ((node = ares_slist_node_first(channel->servers)) != NULL) { + ares_server_t *server = ares_slist_node_claim(node); + ares_destroy_server(server); } - ares__slist_destroy(channel->servers); + ares_slist_destroy(channel->servers); channel->servers = NULL; } diff --git a/deps/cares/src/lib/ares_dns_name.c b/deps/cares/src/lib/ares_dns_name.c deleted file mode 100644 index f4085ab2cb9d85..00000000000000 --- a/deps/cares/src/lib/ares_dns_name.c +++ /dev/null @@ -1,676 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -typedef struct { - char *name; - size_t name_len; - size_t idx; -} ares_nameoffset_t; - -static void ares__nameoffset_free(void *arg) -{ - ares_nameoffset_t *off = arg; - if (off == NULL) { - return; - } - ares_free(off->name); - ares_free(off); -} - -static ares_status_t ares__nameoffset_create(ares__llist_t **list, - const char *name, size_t idx) -{ - ares_status_t status; - ares_nameoffset_t *off = NULL; - - if (list == NULL || name == NULL || ares_strlen(name) == 0 || - ares_strlen(name) > 255) { - return ARES_EFORMERR; - } - - if (*list == NULL) { - *list = ares__llist_create(ares__nameoffset_free); - } - if (*list == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - off = ares_malloc_zero(sizeof(*off)); - if (off == NULL) { - return ARES_ENOMEM; - } - - off->name = ares_strdup(name); - off->name_len = ares_strlen(off->name); - off->idx = idx; - - if (ares__llist_insert_last(*list, off) == NULL) { - status = ARES_ENOMEM; - goto fail; - } - - return ARES_SUCCESS; - -fail: - ares__nameoffset_free(off); - return status; -} - -static const ares_nameoffset_t *ares__nameoffset_find(ares__llist_t *list, - const char *name) -{ - size_t name_len = ares_strlen(name); - ares__llist_node_t *node; - const ares_nameoffset_t *longest_match = NULL; - - if (list == NULL || name == NULL || name_len == 0) { - return NULL; - } - - for (node = ares__llist_node_first(list); node != NULL; - node = ares__llist_node_next(node)) { - const ares_nameoffset_t *val = ares__llist_node_val(node); - size_t prefix_len; - - /* Can't be a match if the stored name is longer */ - if (val->name_len > name_len) { - continue; - } - - /* Can't be the longest match if our existing longest match is longer */ - if (longest_match != NULL && longest_match->name_len > val->name_len) { - continue; - } - - prefix_len = name_len - val->name_len; - - if (strcasecmp(val->name, name + prefix_len) != 0) { - continue; - } - - /* We need to make sure if `val->name` is "example.com" that name is - * is separated by a label, e.g. "myexample.com" is not ok, however - * "my.example.com" is, so we look for the preceding "." */ - if (prefix_len != 0 && name[prefix_len - 1] != '.') { - continue; - } - - longest_match = val; - } - - return longest_match; -} - -typedef struct { - ares__buf_t **label; - size_t num; -} ares_dns_labels_t; - -static void ares_dns_labels_free(ares_dns_labels_t *labels) -{ - size_t i; - - if (labels == NULL) { - return; - } - - for (i = 0; i < labels->num; i++) { - ares__buf_destroy(labels->label[i]); - labels->label[i] = NULL; - } - ares_free(labels->label); - labels->label = NULL; - labels->num = 0; -} - -static ares__buf_t *ares_dns_labels_add(ares_dns_labels_t *labels) -{ - void *temp; - - if (labels == NULL) { - return NULL; - } - - temp = ares_realloc_zero(labels->label, sizeof(*labels->label) * labels->num, - sizeof(*labels->label) * (labels->num + 1)); - if (temp == NULL) { - return NULL; - } - - labels->label = temp; - - labels->label[labels->num] = ares__buf_create(); - if (labels->label[labels->num] == NULL) { - return NULL; - } - - labels->num++; - return labels->label[labels->num - 1]; -} - -static const ares__buf_t * - ares_dns_labels_get_last(const ares_dns_labels_t *labels) -{ - if (labels == NULL || labels->num == 0) { - return NULL; - } - - return labels->label[labels->num - 1]; -} - -static void ares_dns_name_labels_del_last(ares_dns_labels_t *labels) -{ - if (labels == NULL || labels->num == 0) { - return; - } - - ares__buf_destroy(labels->label[labels->num - 1]); - labels->label[labels->num - 1] = NULL; - labels->num--; -} - -static ares_status_t ares_parse_dns_name_escape(ares__buf_t *namebuf, - ares__buf_t *label, - ares_bool_t validate_hostname) -{ - ares_status_t status; - unsigned char c; - - status = ares__buf_fetch_bytes(namebuf, &c, 1); - if (status != ARES_SUCCESS) { - return ARES_EBADNAME; - } - - /* If next character is a digit, read 2 more digits */ - if (isdigit(c)) { - size_t i; - unsigned int val = 0; - - val = c - '0'; - - for (i = 0; i < 2; i++) { - status = ares__buf_fetch_bytes(namebuf, &c, 1); - if (status != ARES_SUCCESS) { - return ARES_EBADNAME; - } - - if (!isdigit(c)) { - return ARES_EBADNAME; - } - val *= 10; - val += c - '0'; - } - - /* Out of range */ - if (val > 255) { - return ARES_EBADNAME; - } - - if (validate_hostname && !ares__is_hostnamech((unsigned char)val)) { - return ARES_EBADNAME; - } - - return ares__buf_append_byte(label, (unsigned char)val); - } - - /* We can just output the character */ - if (validate_hostname && !ares__is_hostnamech(c)) { - return ARES_EBADNAME; - } - - return ares__buf_append_byte(label, c); -} - -static ares_status_t ares_split_dns_name(ares_dns_labels_t *labels, - ares_bool_t validate_hostname, - const char *name) -{ - ares_status_t status; - ares__buf_t *label = NULL; - ares__buf_t *namebuf = NULL; - size_t i; - size_t total_len = 0; - unsigned char c; - - if (name == NULL || labels == NULL) { - return ARES_EFORMERR; - } - - /* Put name into a buffer for parsing */ - namebuf = ares__buf_create(); - if (namebuf == NULL) { - status = ARES_ENOMEM; - goto done; - } - - if (*name != '\0') { - status = - ares__buf_append(namebuf, (const unsigned char *)name, ares_strlen(name)); - if (status != ARES_SUCCESS) { - goto done; - } - } - - /* Start with 1 label */ - label = ares_dns_labels_add(labels); - if (label == NULL) { - status = ARES_ENOMEM; - goto done; - } - - while (ares__buf_fetch_bytes(namebuf, &c, 1) == ARES_SUCCESS) { - /* New label */ - if (c == '.') { - label = ares_dns_labels_add(labels); - if (label == NULL) { - status = ARES_ENOMEM; - goto done; - } - continue; - } - - /* Escape */ - if (c == '\\') { - status = ares_parse_dns_name_escape(namebuf, label, validate_hostname); - if (status != ARES_SUCCESS) { - goto done; - } - continue; - } - - /* Output direct character */ - if (validate_hostname && !ares__is_hostnamech(c)) { - status = ARES_EBADNAME; - goto done; - } - - status = ares__buf_append_byte(label, c); - if (status != ARES_SUCCESS) { - goto done; - } - } - - /* Remove trailing blank label */ - if (ares__buf_len(ares_dns_labels_get_last(labels)) == 0) { - ares_dns_name_labels_del_last(labels); - } - - /* If someone passed in "." there could have been 2 blank labels, check for - * that */ - if (labels->num == 1 && - ares__buf_len(ares_dns_labels_get_last(labels)) == 0) { - ares_dns_name_labels_del_last(labels); - } - - /* Scan to make sure label lengths are valid */ - for (i = 0; i < labels->num; i++) { - size_t len = ares__buf_len(labels->label[i]); - /* No 0-length labels, and no labels over 63 bytes */ - if (len == 0 || len > 63) { - status = ARES_EBADNAME; - goto done; - } - total_len += len; - } - - /* Can't exceed maximum (unescaped) length */ - if (labels->num && total_len + labels->num - 1 > 255) { - status = ARES_EBADNAME; - goto done; - } - - status = ARES_SUCCESS; - -done: - ares__buf_destroy(namebuf); - if (status != ARES_SUCCESS) { - ares_dns_labels_free(labels); - } - return status; -} - -ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list, - ares_bool_t validate_hostname, - const char *name) -{ - const ares_nameoffset_t *off = NULL; - size_t name_len; - size_t pos = ares__buf_len(buf); - ares_dns_labels_t labels; - char name_copy[512]; - ares_status_t status; - - if (buf == NULL || name == NULL) { - return ARES_EFORMERR; - } - - memset(&labels, 0, sizeof(labels)); - - /* NOTE: due to possible escaping, name_copy buffer is > 256 to allow for - * this */ - name_len = ares_strcpy(name_copy, name, sizeof(name_copy)); - - /* Find longest match */ - if (list != NULL) { - off = ares__nameoffset_find(*list, name_copy); - if (off != NULL && off->name_len != name_len) { - /* truncate */ - name_len -= (off->name_len + 1); - name_copy[name_len] = 0; - } - } - - /* Output labels */ - if (off == NULL || off->name_len != name_len) { - size_t i; - - status = ares_split_dns_name(&labels, validate_hostname, name_copy); - if (status != ARES_SUCCESS) { - goto done; - } - - for (i = 0; i < labels.num; i++) { - size_t len = 0; - const unsigned char *ptr = ares__buf_peek(labels.label[i], &len); - - status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares__buf_append(buf, ptr, len); - if (status != ARES_SUCCESS) { - goto done; - } - } - - /* If we are NOT jumping to another label, output terminator */ - if (off == NULL) { - status = ares__buf_append_byte(buf, 0); - if (status != ARES_SUCCESS) { - goto done; - } - } - } - - /* Output name compression offset jump */ - if (off != NULL) { - unsigned short u16 = - (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF); - status = ares__buf_append_be16(buf, u16); - if (status != ARES_SUCCESS) { - goto done; - } - } - - /* Store pointer for future jumps as long as its not an exact match for - * a prior entry */ - if (list != NULL && (off == NULL || off->name_len != name_len) && - name_len > 0) { - status = ares__nameoffset_create(list, name /* not truncated copy! */, pos); - if (status != ARES_SUCCESS) { - goto done; - } - } - - status = ARES_SUCCESS; - -done: - ares_dns_labels_free(&labels); - return status; -} - -/* Reserved characters for names that need to be escaped */ -static ares_bool_t is_reservedch(int ch) -{ - switch (ch) { - case '"': - case '.': - case ';': - case '\\': - case '(': - case ')': - case '@': - case '$': - return ARES_TRUE; - default: - break; - } - - return ARES_FALSE; -} - -static ares_status_t ares__fetch_dnsname_into_buf(ares__buf_t *buf, - ares__buf_t *dest, size_t len, - ares_bool_t is_hostname) -{ - size_t remaining_len; - const unsigned char *ptr = ares__buf_peek(buf, &remaining_len); - ares_status_t status; - size_t i; - - if (buf == NULL || len == 0 || remaining_len < len) { - return ARES_EBADRESP; - } - - for (i = 0; i < len; i++) { - unsigned char c = ptr[i]; - - /* Hostnames have a very specific allowed character set. Anything outside - * of that (non-printable and reserved included) are disallowed */ - if (is_hostname && !ares__is_hostnamech(c)) { - status = ARES_EBADRESP; - goto fail; - } - - /* NOTE: dest may be NULL if the user is trying to skip the name. validation - * still occurs above. */ - if (dest == NULL) { - continue; - } - - /* Non-printable characters need to be output as \DDD */ - if (!ares__isprint(c)) { - unsigned char escape[4]; - - escape[0] = '\\'; - escape[1] = '0' + (c / 100); - escape[2] = '0' + ((c % 100) / 10); - escape[3] = '0' + (c % 10); - - status = ares__buf_append(dest, escape, sizeof(escape)); - if (status != ARES_SUCCESS) { - goto fail; - } - - continue; - } - - /* Reserved characters need to be escaped, otherwise normal */ - if (is_reservedch(c)) { - status = ares__buf_append_byte(dest, '\\'); - if (status != ARES_SUCCESS) { - goto fail; - } - } - - status = ares__buf_append_byte(dest, c); - if (status != ARES_SUCCESS) { - return status; - } - } - - return ares__buf_consume(buf, len); - -fail: - return status; -} - -ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name, - ares_bool_t is_hostname) -{ - size_t save_offset = 0; - unsigned char c; - ares_status_t status; - ares__buf_t *namebuf = NULL; - size_t label_start = ares__buf_get_position(buf); - - if (buf == NULL) { - return ARES_EFORMERR; - } - - if (name != NULL) { - namebuf = ares__buf_create(); - if (namebuf == NULL) { - status = ARES_ENOMEM; - goto fail; - } - } - - /* The compression scheme allows a domain name in a message to be - * represented as either: - * - * - a sequence of labels ending in a zero octet - * - a pointer - * - a sequence of labels ending with a pointer - */ - while (1) { - /* Keep track of the minimum label starting position to prevent forward - * jumping */ - if (label_start > ares__buf_get_position(buf)) { - label_start = ares__buf_get_position(buf); - } - - status = ares__buf_fetch_bytes(buf, &c, 1); - if (status != ARES_SUCCESS) { - goto fail; - } - - /* Pointer/Redirect */ - if ((c & 0xc0) == 0xc0) { - /* The pointer takes the form of a two octet sequence: - * - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | 1 1| OFFSET | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - * The first two bits are ones. This allows a pointer to be distinguished - * from a label, since the label must begin with two zero bits because - * labels are restricted to 63 octets or less. (The 10 and 01 - * combinations are reserved for future use.) The OFFSET field specifies - * an offset from the start of the message (i.e., the first octet of the - * ID field in the domain header). A zero offset specifies the first byte - * of the ID field, etc. - */ - size_t offset = (size_t)((c & 0x3F) << 8); - - /* Fetch second byte of the redirect length */ - status = ares__buf_fetch_bytes(buf, &c, 1); - if (status != ARES_SUCCESS) { - goto fail; - } - - offset |= ((size_t)c); - - /* According to RFC 1035 4.1.4: - * In this scheme, an entire domain name or a list of labels at - * the end of a domain name is replaced with a pointer to a prior - * occurrence of the same name. - * Note the word "prior", meaning it must go backwards. This was - * confirmed via the ISC BIND code that it also prevents forward - * pointers. - */ - if (offset >= label_start) { - status = ARES_EBADNAME; - goto fail; - } - - /* First time we make a jump, save the current position */ - if (save_offset == 0) { - save_offset = ares__buf_get_position(buf); - } - - status = ares__buf_set_position(buf, offset); - if (status != ARES_SUCCESS) { - status = ARES_EBADNAME; - goto fail; - } - - continue; - } else if ((c & 0xc0) != 0) { - /* 10 and 01 are reserved */ - status = ARES_EBADNAME; - goto fail; - } else if (c == 0) { - /* termination via zero octet*/ - break; - } - - /* New label */ - - /* Labels are separated by periods */ - if (ares__buf_len(namebuf) != 0 && name != NULL) { - status = ares__buf_append_byte(namebuf, '.'); - if (status != ARES_SUCCESS) { - goto fail; - } - } - - status = ares__fetch_dnsname_into_buf(buf, namebuf, c, is_hostname); - if (status != ARES_SUCCESS) { - goto fail; - } - } - - /* Restore offset read after first redirect/pointer as this is where the DNS - * message continues */ - if (save_offset) { - ares__buf_set_position(buf, save_offset); - } - - if (name != NULL) { - *name = ares__buf_finish_str(namebuf, NULL); - if (*name == NULL) { - status = ARES_ENOMEM; - goto fail; - } - } - - return ARES_SUCCESS; - -fail: - /* We want badname response if we couldn't parse */ - if (status == ARES_EBADRESP) { - status = ARES_EBADNAME; - } - - ares__buf_destroy(namebuf); - return status; -} diff --git a/deps/cares/src/lib/ares_dns_private.h b/deps/cares/src/lib/ares_dns_private.h deleted file mode 100644 index 3af4b3c9926e42..00000000000000 --- a/deps/cares/src/lib/ares_dns_private.h +++ /dev/null @@ -1,263 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES_DNS_PRIVATE_H -#define __ARES_DNS_PRIVATE_H - -ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type); -ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode); -ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode); -ares_bool_t ares_dns_flags_arevalid(unsigned short flags); -ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, - ares_bool_t is_query); -ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, - ares_bool_t is_query); -ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect); -ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, char *val); -ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, unsigned char *val, - size_t len); -ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, unsigned short opt, - unsigned char *val, size_t val_len); -ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, - ares_dns_section_t sect, size_t cnt); -ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec); -void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec, - unsigned int ttl_decrement); - -/*! Create a DNS record object for a query. The arguments are the same as - * those for ares_create_query(). - * - * \param[out] dnsrec DNS record object to create. - * \param[in] name NUL-terminated name for the query. - * \param[in] dnsclass Class for the query. - * \param[in] type Type for the query. - * \param[in] id Identifier for the query. - * \param[in] flags Flags for the query. - * \param[in] max_udp_size Maximum size of a UDP packet for EDNS. - * \return ARES_SUCCESS on success, otherwise an error code. - */ -ares_status_t - ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, - ares_dns_class_t dnsclass, - ares_dns_rec_type_t type, unsigned short id, - ares_dns_flags_t flags, size_t max_udp_size); - -/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code. - * - * \param[in] rcode The RCODE from the reply. - * \param[in] ancount The ANCOUNT from the reply. - * \return An appropriate status code. - */ -ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode, - size_t ancount); - -struct ares_dns_qd { - char *name; - ares_dns_rec_type_t qtype; - ares_dns_class_t qclass; -}; - -typedef struct { - struct in_addr addr; -} ares__dns_a_t; - -typedef struct { - char *nsdname; -} ares__dns_ns_t; - -typedef struct { - char *cname; -} ares__dns_cname_t; - -typedef struct { - char *mname; - char *rname; - unsigned int serial; - unsigned int refresh; - unsigned int retry; - unsigned int expire; - unsigned int minimum; -} ares__dns_soa_t; - -typedef struct { - char *dname; -} ares__dns_ptr_t; - -typedef struct { - char *cpu; - char *os; -} ares__dns_hinfo_t; - -typedef struct { - unsigned short preference; - char *exchange; -} ares__dns_mx_t; - -typedef struct { - char *data; - size_t data_len; -} ares__dns_txt_t; - -typedef struct { - struct ares_in6_addr addr; -} ares__dns_aaaa_t; - -typedef struct { - unsigned short priority; - unsigned short weight; - unsigned short port; - char *target; -} ares__dns_srv_t; - -typedef struct { - unsigned short order; - unsigned short preference; - char *flags; - char *services; - char *regexp; - char *replacement; -} ares__dns_naptr_t; - -typedef struct { - unsigned short opt; - unsigned char *val; - size_t val_len; -} ares__dns_optval_t; - -typedef struct { - ares__dns_optval_t *optval; /*!< Attribute/value pairs */ - size_t cnt; /*!< Count of Attribute/Value pairs */ - size_t alloc; /*!< Allocated count of attribute/value - * pairs */ -} ares__dns_options_t; - -typedef struct { - unsigned short udp_size; /*!< taken from class */ - unsigned char version; /*!< taken from bits 8-16 of ttl */ - unsigned short flags; /*!< Flags, remaining 16 bits, though only - * 1 currently defined */ - ares__dns_options_t *options; /*!< Attribute/Value pairs */ -} ares__dns_opt_t; - -typedef struct { - unsigned char cert_usage; - unsigned char selector; - unsigned char match; - unsigned char *data; - size_t data_len; -} ares__dns_tlsa_t; - -typedef struct { - unsigned short priority; - char *target; - ares__dns_options_t *params; -} ares__dns_svcb_t; - -typedef struct { - unsigned short priority; - unsigned short weight; - char *target; -} ares__dns_uri_t; - -typedef struct { - unsigned char critical; - char *tag; - unsigned char *value; - size_t value_len; -} ares__dns_caa_t; - -/*! Raw, unparsed RR data */ -typedef struct { - unsigned short type; /*!< Not ares_rec_type_t because it likely isn't one - * of those values since it wasn't parsed */ - unsigned char *data; /*!< Raw RR data */ - size_t length; /*!< Length of raw RR data */ -} ares__dns_raw_rr_t; - -/*! DNS RR data structure */ -struct ares_dns_rr { - ares_dns_record_t *parent; - char *name; - ares_dns_rec_type_t type; - ares_dns_class_t rclass; - unsigned int ttl; - - union { - ares__dns_a_t a; - ares__dns_ns_t ns; - ares__dns_cname_t cname; - ares__dns_soa_t soa; - ares__dns_ptr_t ptr; - ares__dns_hinfo_t hinfo; - ares__dns_mx_t mx; - ares__dns_txt_t txt; - ares__dns_aaaa_t aaaa; - ares__dns_srv_t srv; - ares__dns_naptr_t naptr; - ares__dns_opt_t opt; - ares__dns_tlsa_t tlsa; - ares__dns_svcb_t svcb; - ares__dns_svcb_t https; /*!< https is a type of svcb, so this is right */ - ares__dns_uri_t uri; - ares__dns_caa_t caa; - ares__dns_raw_rr_t raw_rr; - } r; -}; - -/*! DNS data structure */ -struct ares_dns_record { - unsigned short id; /*!< DNS query id */ - unsigned short flags; /*!< One or more ares_dns_flags_t */ - ares_dns_opcode_t opcode; /*!< DNS Opcode */ - ares_dns_rcode_t rcode; /*!< DNS RCODE */ - unsigned short raw_rcode; /*!< Raw rcode, used to ultimately form real - * rcode after reading OPT record if it - * exists */ - unsigned int ttl_decrement; /*!< Special case to apply to writing out - * this record, where it will decrement - * the ttl of any resource records by - * this amount. Used for cache */ - - ares_dns_qd_t *qd; - size_t qdcount; - size_t qdalloc; - - ares_dns_rr_t *an; - size_t ancount; - size_t analloc; - - ares_dns_rr_t *ns; - size_t nscount; - size_t nsalloc; - - ares_dns_rr_t *ar; - size_t arcount; - size_t aralloc; -}; - -#endif diff --git a/deps/cares/src/lib/ares_dns_record.c b/deps/cares/src/lib/ares_dns_record.c deleted file mode 100644 index ec7f7e734302de..00000000000000 --- a/deps/cares/src/lib/ares_dns_record.c +++ /dev/null @@ -1,1449 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include <limits.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif - - -ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, - unsigned short id, unsigned short flags, - ares_dns_opcode_t opcode, - ares_dns_rcode_t rcode) -{ - if (dnsrec == NULL) { - return ARES_EFORMERR; - } - - *dnsrec = NULL; - - if (!ares_dns_opcode_isvalid(opcode) || !ares_dns_rcode_isvalid(rcode) || - !ares_dns_flags_arevalid(flags)) { - return ARES_EFORMERR; - } - - *dnsrec = ares_malloc_zero(sizeof(**dnsrec)); - if (*dnsrec == NULL) { - return ARES_ENOMEM; - } - - (*dnsrec)->id = id; - (*dnsrec)->flags = flags; - (*dnsrec)->opcode = opcode; - (*dnsrec)->rcode = rcode; - return ARES_SUCCESS; -} - -unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec) -{ - if (dnsrec == NULL) { - return 0; - } - return dnsrec->id; -} - -unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec) -{ - if (dnsrec == NULL) { - return 0; - } - return dnsrec->flags; -} - -ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec) -{ - if (dnsrec == NULL) { - return 0; - } - return dnsrec->opcode; -} - -ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec) -{ - if (dnsrec == NULL) { - return 0; - } - return dnsrec->rcode; -} - -static void ares__dns_options_free(ares__dns_options_t *options) -{ - size_t i; - - if (options == NULL) { - return; - } - - for (i = 0; i < options->cnt; i++) { - ares_free(options->optval[i].val); - } - ares_free(options->optval); - ares_free(options); -} - -static void ares__dns_rr_free(ares_dns_rr_t *rr) -{ - ares_free(rr->name); - - switch (rr->type) { - case ARES_REC_TYPE_A: - case ARES_REC_TYPE_AAAA: - case ARES_REC_TYPE_ANY: - /* Nothing to free */ - break; - - case ARES_REC_TYPE_NS: - ares_free(rr->r.ns.nsdname); - break; - - case ARES_REC_TYPE_CNAME: - ares_free(rr->r.cname.cname); - break; - - case ARES_REC_TYPE_SOA: - ares_free(rr->r.soa.mname); - ares_free(rr->r.soa.rname); - break; - - case ARES_REC_TYPE_PTR: - ares_free(rr->r.ptr.dname); - break; - - case ARES_REC_TYPE_HINFO: - ares_free(rr->r.hinfo.cpu); - ares_free(rr->r.hinfo.os); - break; - - case ARES_REC_TYPE_MX: - ares_free(rr->r.mx.exchange); - break; - - case ARES_REC_TYPE_TXT: - ares_free(rr->r.txt.data); - break; - - case ARES_REC_TYPE_SRV: - ares_free(rr->r.srv.target); - break; - - case ARES_REC_TYPE_NAPTR: - ares_free(rr->r.naptr.flags); - ares_free(rr->r.naptr.services); - ares_free(rr->r.naptr.regexp); - ares_free(rr->r.naptr.replacement); - break; - - case ARES_REC_TYPE_OPT: - ares__dns_options_free(rr->r.opt.options); - break; - - case ARES_REC_TYPE_TLSA: - ares_free(rr->r.tlsa.data); - break; - - case ARES_REC_TYPE_SVCB: - ares_free(rr->r.svcb.target); - ares__dns_options_free(rr->r.svcb.params); - break; - - case ARES_REC_TYPE_HTTPS: - ares_free(rr->r.https.target); - ares__dns_options_free(rr->r.https.params); - break; - - case ARES_REC_TYPE_URI: - ares_free(rr->r.uri.target); - break; - - case ARES_REC_TYPE_CAA: - ares_free(rr->r.caa.tag); - ares_free(rr->r.caa.value); - break; - - case ARES_REC_TYPE_RAW_RR: - ares_free(rr->r.raw_rr.data); - break; - } -} - -void ares_dns_record_destroy(ares_dns_record_t *dnsrec) -{ - size_t i; - - if (dnsrec == NULL) { - return; - } - - /* Free questions */ - for (i = 0; i < dnsrec->qdcount; i++) { - ares_free(dnsrec->qd[i].name); - } - ares_free(dnsrec->qd); - - /* Free answers */ - for (i = 0; i < dnsrec->ancount; i++) { - ares__dns_rr_free(&dnsrec->an[i]); - } - ares_free(dnsrec->an); - - /* Free authority */ - for (i = 0; i < dnsrec->nscount; i++) { - ares__dns_rr_free(&dnsrec->ns[i]); - } - ares_free(dnsrec->ns); - - /* Free additional */ - for (i = 0; i < dnsrec->arcount; i++) { - ares__dns_rr_free(&dnsrec->ar[i]); - } - ares_free(dnsrec->ar); - - ares_free(dnsrec); -} - -size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec) -{ - if (dnsrec == NULL) { - return 0; - } - return dnsrec->qdcount; -} - -ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, - const char *name, - ares_dns_rec_type_t qtype, - ares_dns_class_t qclass) -{ - ares_dns_qd_t *temp = NULL; - size_t idx; - - if (dnsrec == NULL || name == NULL || - !ares_dns_rec_type_isvalid(qtype, ARES_TRUE) || - !ares_dns_class_isvalid(qclass, ARES_TRUE)) { - return ARES_EFORMERR; - } - - if (dnsrec->qdcount >= dnsrec->qdalloc) { - size_t alloc_cnt = ares__round_up_pow2(dnsrec->qdcount + 1); - - temp = ares_realloc_zero(dnsrec->qd, sizeof(*temp) * (dnsrec->qdalloc), - sizeof(*temp) * alloc_cnt); - if (temp == NULL) { - return ARES_ENOMEM; - } - - dnsrec->qdalloc = alloc_cnt; - dnsrec->qd = temp; - } - - idx = dnsrec->qdcount; - - dnsrec->qd[idx].name = ares_strdup(name); - if (dnsrec->qd[idx].name == NULL) { - /* No need to clean up anything */ - return ARES_ENOMEM; - } - - dnsrec->qd[idx].qtype = qtype; - dnsrec->qd[idx].qclass = qclass; - dnsrec->qdcount++; - return ARES_SUCCESS; -} - -ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec, - size_t idx, const char *name) -{ - char *orig_name = NULL; - - if (dnsrec == NULL || idx >= dnsrec->qdcount || name == NULL) { - return ARES_EFORMERR; - } - orig_name = dnsrec->qd[idx].name; - dnsrec->qd[idx].name = ares_strdup(name); - if (dnsrec->qd[idx].name == NULL) { - dnsrec->qd[idx].name = orig_name; - return ARES_ENOMEM; - } - - ares_free(orig_name); - return ARES_SUCCESS; -} - -ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec, - size_t idx, - ares_dns_rec_type_t qtype) -{ - if (dnsrec == NULL || idx >= dnsrec->qdcount || - !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) { - return ARES_EFORMERR; - } - - dnsrec->qd[idx].qtype = qtype; - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, - size_t idx, const char **name, - ares_dns_rec_type_t *qtype, - ares_dns_class_t *qclass) -{ - if (dnsrec == NULL || idx >= dnsrec->qdcount) { - return ARES_EFORMERR; - } - - if (name != NULL) { - *name = dnsrec->qd[idx].name; - } - - if (qtype != NULL) { - *qtype = dnsrec->qd[idx].qtype; - } - - if (qclass != NULL) { - *qclass = dnsrec->qd[idx].qclass; - } - - return ARES_SUCCESS; -} - -size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, - ares_dns_section_t sect) -{ - if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { - return 0; - } - - switch (sect) { - case ARES_SECTION_ANSWER: - return dnsrec->ancount; - case ARES_SECTION_AUTHORITY: - return dnsrec->nscount; - case ARES_SECTION_ADDITIONAL: - return dnsrec->arcount; - } - - return 0; -} - -ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, - ares_dns_section_t sect, size_t cnt) -{ - ares_dns_rr_t **rr_ptr = NULL; - size_t *rr_alloc = NULL; - ares_dns_rr_t *temp = NULL; - - if (dnsrec == NULL || cnt == 0 || !ares_dns_section_isvalid(sect)) { - return ARES_EFORMERR; - } - - switch (sect) { - case ARES_SECTION_ANSWER: - rr_ptr = &dnsrec->an; - rr_alloc = &dnsrec->analloc; - break; - case ARES_SECTION_AUTHORITY: - rr_ptr = &dnsrec->ns; - rr_alloc = &dnsrec->nsalloc; - break; - case ARES_SECTION_ADDITIONAL: - rr_ptr = &dnsrec->ar; - rr_alloc = &dnsrec->aralloc; - break; - } - - /* Round up cnt to a power of 2 */ - cnt = ares__round_up_pow2(cnt); - - /* Already have that */ - if (cnt <= *rr_alloc) { - return ARES_SUCCESS; - } - - temp = ares_realloc_zero(*rr_ptr, sizeof(*temp) * (*rr_alloc), - sizeof(*temp) * cnt); - if (temp == NULL) { - return ARES_ENOMEM; - } - - *rr_alloc = cnt; - *rr_ptr = temp; - return ARES_SUCCESS; -} - -ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out, - ares_dns_record_t *dnsrec, - ares_dns_section_t sect, const char *name, - ares_dns_rec_type_t type, - ares_dns_class_t rclass, unsigned int ttl) -{ - ares_dns_rr_t **rr_ptr = NULL; - ares_dns_rr_t *rr = NULL; - size_t *rr_len = NULL; - ares_status_t status; - size_t idx; - - if (dnsrec == NULL || name == NULL || rr_out == NULL || - !ares_dns_section_isvalid(sect) || - !ares_dns_rec_type_isvalid(type, ARES_FALSE) || - !ares_dns_class_isvalid(rclass, ARES_FALSE)) { - return ARES_EFORMERR; - } - - *rr_out = NULL; - - switch (sect) { - case ARES_SECTION_ANSWER: - rr_ptr = &dnsrec->an; - rr_len = &dnsrec->ancount; - break; - case ARES_SECTION_AUTHORITY: - rr_ptr = &dnsrec->ns; - rr_len = &dnsrec->nscount; - break; - case ARES_SECTION_ADDITIONAL: - rr_ptr = &dnsrec->ar; - rr_len = &dnsrec->arcount; - break; - } - - status = ares_dns_record_rr_prealloc(dnsrec, sect, *rr_len + 1); - if (status != ARES_SUCCESS) { - return status; - } - - idx = *rr_len; - rr = &(*rr_ptr)[idx]; - - rr->name = ares_strdup(name); - if (rr->name == NULL) { - /* No need to clean up anything */ - return ARES_ENOMEM; - } - - rr->parent = dnsrec; - rr->type = type; - rr->rclass = rclass; - rr->ttl = ttl; - (*rr_len)++; - - *rr_out = rr; - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, - ares_dns_section_t sect, size_t idx) -{ - ares_dns_rr_t *rr_ptr = NULL; - size_t *rr_len = NULL; - size_t cnt_after; - - if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { - return ARES_EFORMERR; - } - - switch (sect) { - case ARES_SECTION_ANSWER: - rr_ptr = dnsrec->an; - rr_len = &dnsrec->ancount; - break; - case ARES_SECTION_AUTHORITY: - rr_ptr = dnsrec->ns; - rr_len = &dnsrec->nscount; - break; - case ARES_SECTION_ADDITIONAL: - rr_ptr = dnsrec->ar; - rr_len = &dnsrec->arcount; - break; - } - - if (idx >= *rr_len) { - return ARES_EFORMERR; - } - - ares__dns_rr_free(&rr_ptr[idx]); - - cnt_after = *rr_len - idx - 1; - - if (cnt_after) { - memmove(&rr_ptr[idx], &rr_ptr[idx + 1], sizeof(*rr_ptr) * cnt_after); - } - - (*rr_len)--; - return ARES_SUCCESS; -} - -ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, - ares_dns_section_t sect, size_t idx) -{ - ares_dns_rr_t *rr_ptr = NULL; - size_t rr_len = 0; - - if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { - return NULL; - } - - switch (sect) { - case ARES_SECTION_ANSWER: - rr_ptr = dnsrec->an; - rr_len = dnsrec->ancount; - break; - case ARES_SECTION_AUTHORITY: - rr_ptr = dnsrec->ns; - rr_len = dnsrec->nscount; - break; - case ARES_SECTION_ADDITIONAL: - rr_ptr = dnsrec->ar; - rr_len = dnsrec->arcount; - break; - } - - if (idx >= rr_len) { - return NULL; - } - - return &rr_ptr[idx]; -} - -const ares_dns_rr_t * - ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, - ares_dns_section_t sect, size_t idx) -{ - return ares_dns_record_rr_get((void *)((size_t)dnsrec), sect, idx); -} - -const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr) -{ - if (rr == NULL) { - return NULL; - } - return rr->name; -} - -ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr) -{ - if (rr == NULL) { - return 0; - } - return rr->type; -} - -ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr) -{ - if (rr == NULL) { - return 0; - } - return rr->rclass; -} - -unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr) -{ - if (rr == NULL) { - return 0; - } - return rr->ttl; -} - -static void *ares_dns_rr_data_ptr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - size_t **lenptr) -{ - if (dns_rr == NULL || dns_rr->type != ares_dns_rr_key_to_rec_type(key)) { - return NULL; - } - - switch (key) { - case ARES_RR_A_ADDR: - return &dns_rr->r.a.addr; - - case ARES_RR_NS_NSDNAME: - return &dns_rr->r.ns.nsdname; - - case ARES_RR_CNAME_CNAME: - return &dns_rr->r.cname.cname; - - case ARES_RR_SOA_MNAME: - return &dns_rr->r.soa.mname; - - case ARES_RR_SOA_RNAME: - return &dns_rr->r.soa.rname; - - case ARES_RR_SOA_SERIAL: - return &dns_rr->r.soa.serial; - - case ARES_RR_SOA_REFRESH: - return &dns_rr->r.soa.refresh; - - case ARES_RR_SOA_RETRY: - return &dns_rr->r.soa.retry; - - case ARES_RR_SOA_EXPIRE: - return &dns_rr->r.soa.expire; - - case ARES_RR_SOA_MINIMUM: - return &dns_rr->r.soa.minimum; - - case ARES_RR_PTR_DNAME: - return &dns_rr->r.ptr.dname; - - case ARES_RR_AAAA_ADDR: - return &dns_rr->r.aaaa.addr; - - case ARES_RR_HINFO_CPU: - return &dns_rr->r.hinfo.cpu; - - case ARES_RR_HINFO_OS: - return &dns_rr->r.hinfo.os; - - case ARES_RR_MX_PREFERENCE: - return &dns_rr->r.mx.preference; - - case ARES_RR_MX_EXCHANGE: - return &dns_rr->r.mx.exchange; - - case ARES_RR_TXT_DATA: - if (lenptr == NULL) { - return NULL; - } - *lenptr = &dns_rr->r.txt.data_len; - return &dns_rr->r.txt.data; - - case ARES_RR_SRV_PRIORITY: - return &dns_rr->r.srv.priority; - - case ARES_RR_SRV_WEIGHT: - return &dns_rr->r.srv.weight; - - case ARES_RR_SRV_PORT: - return &dns_rr->r.srv.port; - - case ARES_RR_SRV_TARGET: - return &dns_rr->r.srv.target; - - case ARES_RR_NAPTR_ORDER: - return &dns_rr->r.naptr.order; - - case ARES_RR_NAPTR_PREFERENCE: - return &dns_rr->r.naptr.preference; - - case ARES_RR_NAPTR_FLAGS: - return &dns_rr->r.naptr.flags; - - case ARES_RR_NAPTR_SERVICES: - return &dns_rr->r.naptr.services; - - case ARES_RR_NAPTR_REGEXP: - return &dns_rr->r.naptr.regexp; - - case ARES_RR_NAPTR_REPLACEMENT: - return &dns_rr->r.naptr.replacement; - - case ARES_RR_OPT_UDP_SIZE: - return &dns_rr->r.opt.udp_size; - - case ARES_RR_OPT_VERSION: - return &dns_rr->r.opt.version; - - case ARES_RR_OPT_FLAGS: - return &dns_rr->r.opt.flags; - - case ARES_RR_OPT_OPTIONS: - return &dns_rr->r.opt.options; - - case ARES_RR_TLSA_CERT_USAGE: - return &dns_rr->r.tlsa.cert_usage; - - case ARES_RR_TLSA_SELECTOR: - return &dns_rr->r.tlsa.selector; - - case ARES_RR_TLSA_MATCH: - return &dns_rr->r.tlsa.match; - - case ARES_RR_TLSA_DATA: - if (lenptr == NULL) { - return NULL; - } - *lenptr = &dns_rr->r.tlsa.data_len; - return &dns_rr->r.tlsa.data; - - case ARES_RR_SVCB_PRIORITY: - return &dns_rr->r.svcb.priority; - - case ARES_RR_SVCB_TARGET: - return &dns_rr->r.svcb.target; - - case ARES_RR_SVCB_PARAMS: - return &dns_rr->r.svcb.params; - - case ARES_RR_HTTPS_PRIORITY: - return &dns_rr->r.https.priority; - - case ARES_RR_HTTPS_TARGET: - return &dns_rr->r.https.target; - - case ARES_RR_HTTPS_PARAMS: - return &dns_rr->r.https.params; - - case ARES_RR_URI_PRIORITY: - return &dns_rr->r.uri.priority; - - case ARES_RR_URI_WEIGHT: - return &dns_rr->r.uri.weight; - - case ARES_RR_URI_TARGET: - return &dns_rr->r.uri.target; - - case ARES_RR_CAA_CRITICAL: - return &dns_rr->r.caa.critical; - - case ARES_RR_CAA_TAG: - return &dns_rr->r.caa.tag; - - case ARES_RR_CAA_VALUE: - if (lenptr == NULL) { - return NULL; - } - *lenptr = &dns_rr->r.caa.value_len; - return &dns_rr->r.caa.value; - - case ARES_RR_RAW_RR_TYPE: - return &dns_rr->r.raw_rr.type; - - case ARES_RR_RAW_RR_DATA: - if (lenptr == NULL) { - return NULL; - } - *lenptr = &dns_rr->r.raw_rr.length; - return &dns_rr->r.raw_rr.data; - } - - return NULL; -} - -static const void *ares_dns_rr_data_ptr_const(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, - const size_t **lenptr) -{ - /* We're going to cast off the const */ - return ares_dns_rr_data_ptr((void *)((size_t)dns_rr), key, - (void *)((size_t)lenptr)); -} - -const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - const struct in_addr *addr; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR) { - return NULL; - } - - addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (addr == NULL) { - return NULL; - } - - return addr; -} - -const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - const struct ares_in6_addr *addr; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6) { - return NULL; - } - - addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (addr == NULL) { - return NULL; - } - - return addr; -} - -unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - const unsigned char *u8; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { - return 0; - } - - u8 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (u8 == NULL) { - return 0; - } - - return *u8; -} - -unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - const unsigned short *u16; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { - return 0; - } - - u16 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (u16 == NULL) { - return 0; - } - - return *u16; -} - -unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - const unsigned int *u32; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { - return 0; - } - - u32 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (u32 == NULL) { - return 0; - } - - return *u32; -} - -const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, size_t *len) -{ - unsigned char * const *bin = NULL; - size_t const *bin_len = NULL; - - if ((ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && - ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) || - len == NULL) { - return NULL; - } - - bin = ares_dns_rr_data_ptr_const(dns_rr, key, &bin_len); - if (bin == NULL) { - return 0; - } - - /* Shouldn't be possible */ - if (bin_len == NULL) { - return NULL; - } - - *len = *bin_len; - - return *bin; -} - -const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - char * const *str; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && - ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { - return NULL; - } - - str = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (str == NULL) { - return NULL; - } - - return *str; -} - -size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key) -{ - ares__dns_options_t * const *opts; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { - return 0; - } - - opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (opts == NULL || *opts == NULL) { - return 0; - } - - return (*opts)->cnt; -} - -unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, size_t idx, - const unsigned char **val, size_t *val_len) -{ - ares__dns_options_t * const *opts; - - if (val) { - *val = NULL; - } - if (val_len) { - *val_len = 0; - } - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { - return 65535; - } - - opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (opts == NULL || *opts == NULL) { - return 65535; - } - - if (idx >= (*opts)->cnt) { - return 65535; - } - - if (val) { - *val = (*opts)->optval[idx].val; - } - if (val_len) { - *val_len = (*opts)->optval[idx].val_len; - } - - return (*opts)->optval[idx].opt; -} - -ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, unsigned short opt, - const unsigned char **val, size_t *val_len) -{ - ares__dns_options_t * const *opts; - size_t i; - - if (val) { - *val = NULL; - } - if (val_len) { - *val_len = 0; - } - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { - return ARES_FALSE; - } - - opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); - if (opts == NULL || *opts == NULL) { - return ARES_FALSE; - } - - for (i = 0; i < (*opts)->cnt; i++) { - if ((*opts)->optval[i].opt == opt) { - break; - } - } - - if (i >= (*opts)->cnt) { - return ARES_FALSE; - } - - if (val) { - *val = (*opts)->optval[i].val; - } - if (val_len) { - *val_len = (*opts)->optval[i].val_len; - } - return ARES_TRUE; -} - -ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - const struct in_addr *addr) -{ - struct in_addr *a; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR || addr == NULL) { - return ARES_EFORMERR; - } - - a = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (a == NULL) { - return ARES_EFORMERR; - } - - memcpy(a, addr, sizeof(*a)); - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, - const struct ares_in6_addr *addr) -{ - struct ares_in6_addr *a; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6 || addr == NULL) { - return ARES_EFORMERR; - } - - a = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (a == NULL) { - return ARES_EFORMERR; - } - - memcpy(a, addr, sizeof(*a)); - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - unsigned char val) -{ - unsigned char *u8; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { - return ARES_EFORMERR; - } - - u8 = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (u8 == NULL) { - return ARES_EFORMERR; - } - - *u8 = val; - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - unsigned short val) -{ - unsigned short *u16; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { - return ARES_EFORMERR; - } - - u16 = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (u16 == NULL) { - return ARES_EFORMERR; - } - - *u16 = val; - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - unsigned int val) -{ - unsigned int *u32; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { - return ARES_EFORMERR; - } - - u32 = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (u32 == NULL) { - return ARES_EFORMERR; - } - - *u32 = val; - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, unsigned char *val, - size_t len) -{ - unsigned char **bin; - size_t *bin_len = NULL; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && - ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) { - return ARES_EFORMERR; - } - - bin = ares_dns_rr_data_ptr(dns_rr, key, &bin_len); - if (bin == NULL || bin_len == NULL) { - return ARES_EFORMERR; - } - - if (*bin) { - ares_free(*bin); - } - *bin = val; - *bin_len = len; - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - const unsigned char *val, size_t len) -{ - ares_status_t status; - ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key); - size_t alloclen = (datatype == ARES_DATATYPE_BINP) ? len + 1 : len; - unsigned char *temp = ares_malloc(alloclen); - - if (temp == NULL) { - return ARES_ENOMEM; - } - - memcpy(temp, val, len); - - /* NULL-term BINP */ - if (datatype == ARES_DATATYPE_BINP) { - temp[len] = 0; - } - - status = ares_dns_rr_set_bin_own(dns_rr, key, temp, len); - if (status != ARES_SUCCESS) { - ares_free(temp); - } - - return status; -} - -ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, char *val) -{ - char **str; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && - ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { - return ARES_EFORMERR; - } - - str = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (str == NULL) { - return ARES_EFORMERR; - } - - if (*str) { - ares_free(*str); - } - *str = val; - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - const char *val) -{ - ares_status_t status; - char *temp = NULL; - - if (val != NULL) { - temp = ares_strdup(val); - if (temp == NULL) { - return ARES_ENOMEM; - } - } - - status = ares_dns_rr_set_str_own(dns_rr, key, temp); - if (status != ARES_SUCCESS) { - ares_free(temp); - } - - return status; -} - -ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, - ares_dns_rr_key_t key, unsigned short opt, - unsigned char *val, size_t val_len) -{ - ares__dns_options_t **options; - size_t idx; - - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { - return ARES_EFORMERR; - } - - options = ares_dns_rr_data_ptr(dns_rr, key, NULL); - if (options == NULL) { - return ARES_EFORMERR; - } - - if (*options == NULL) { - *options = ares_malloc_zero(sizeof(**options)); - } - if (*options == NULL) { - return ARES_ENOMEM; - } - - for (idx = 0; idx < (*options)->cnt; idx++) { - if ((*options)->optval[idx].opt == opt) { - break; - } - } - - /* Duplicate entry, replace */ - if (idx != (*options)->cnt) { - goto done; - } - - idx = (*options)->cnt; - - /* Expand by powers of 2 */ - if (idx >= (*options)->alloc) { - size_t alloc_size = (*options)->alloc; - void *temp; - - if (alloc_size == 0) { - alloc_size = 1; - } else { - alloc_size <<= 1; - } - - temp = ares_realloc_zero((*options)->optval, - (*options)->alloc * sizeof(*(*options)->optval), - alloc_size * sizeof(*(*options)->optval)); - if (temp == NULL) { - return ARES_ENOMEM; - } - - (*options)->optval = temp; - (*options)->alloc = alloc_size; - } - - (*options)->cnt++; - -done: - ares_free((*options)->optval[idx].val); - (*options)->optval[idx].opt = opt; - (*options)->optval[idx].val = val; - (*options)->optval[idx].val_len = val_len; - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, - unsigned short opt, const unsigned char *val, - size_t val_len) -{ - unsigned char *temp = NULL; - ares_status_t status; - - if (val != NULL) { - temp = ares_malloc(val_len + 1); - if (temp == NULL) { - return ARES_ENOMEM; - } - memcpy(temp, val, val_len); - temp[val_len] = 0; - } - - status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len); - if (status != ARES_SUCCESS) { - ares_free(temp); - } - - return status; -} - -char *ares_dns_addr_to_ptr(const struct ares_addr *addr) -{ - ares__buf_t *buf = NULL; - const unsigned char *ptr = NULL; - size_t ptr_len = 0; - size_t i; - ares_status_t status; - static const unsigned char hexbytes[] = "0123456789abcdef"; - - if (addr->family != AF_INET && addr->family != AF_INET6) { - goto fail; - } - - buf = ares__buf_create(); - if (buf == NULL) { - goto fail; - } - - if (addr->family == AF_INET) { - ptr = (const unsigned char *)&addr->addr.addr4; - ptr_len = 4; - } else { - ptr = (const unsigned char *)&addr->addr.addr6; - ptr_len = 16; - } - - for (i = ptr_len; i > 0; i--) { - if (addr->family == AF_INET) { - status = ares__buf_append_num_dec(buf, (size_t)ptr[i - 1], 0); - } else { - unsigned char c; - - c = ptr[i - 1] & 0xF; - status = ares__buf_append_byte(buf, hexbytes[c]); - if (status != ARES_SUCCESS) { - goto fail; - } - - status = ares__buf_append_byte(buf, '.'); - if (status != ARES_SUCCESS) { - goto fail; - } - - c = (ptr[i - 1] >> 4) & 0xF; - status = ares__buf_append_byte(buf, hexbytes[c]); - } - if (status != ARES_SUCCESS) { - goto fail; - } - - status = ares__buf_append_byte(buf, '.'); - if (status != ARES_SUCCESS) { - goto fail; - } - } - - if (addr->family == AF_INET) { - status = ares__buf_append(buf, (const unsigned char *)"in-addr.arpa", 12); - } else { - status = ares__buf_append(buf, (const unsigned char *)"ip6.arpa", 8); - } - if (status != ARES_SUCCESS) { - goto fail; - } - - return ares__buf_finish_str(buf, NULL); - -fail: - ares__buf_destroy(buf); - return NULL; -} - -/* search for an OPT RR in the response */ -ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec) -{ - size_t i; - for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) { - const ares_dns_rr_t *rr = - ares_dns_record_rr_get_const(rec, ARES_SECTION_ADDITIONAL, i); - - if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { - return ARES_TRUE; - } - } - return ARES_FALSE; -} - -/* Construct a DNS record for a name with given class and type. Used internally - * by ares_search() and ares_create_query(). - */ -ares_status_t - ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, - ares_dns_class_t dnsclass, - ares_dns_rec_type_t type, unsigned short id, - ares_dns_flags_t flags, size_t max_udp_size) -{ - ares_status_t status; - ares_dns_rr_t *rr = NULL; - - if (dnsrec == NULL) { - return ARES_EFORMERR; - } - - *dnsrec = NULL; - - /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */ - if (ares__is_onion_domain(name)) { - status = ARES_ENOTFOUND; - goto done; - } - - status = ares_dns_record_create(dnsrec, id, (unsigned short)flags, - ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass); - if (status != ARES_SUCCESS) { - goto done; - } - - /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ - if (max_udp_size > 0) { - /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT - * RR, so check here that it fits - */ - if (max_udp_size > 65535) { - status = ARES_EFORMERR; - goto done; - } - - status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "", - ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, - (unsigned short)max_udp_size); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); - if (status != ARES_SUCCESS) { - goto done; - } - } - -done: - if (status != ARES_SUCCESS) { - ares_dns_record_destroy(*dnsrec); - *dnsrec = NULL; - } - return status; -} - -ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec) -{ - unsigned char *data = NULL; - size_t data_len = 0; - ares_dns_record_t *out = NULL; - ares_status_t status; - - if (dnsrec == NULL) { - return NULL; - } - - status = ares_dns_write(dnsrec, &data, &data_len); - if (status != ARES_SUCCESS) { - return NULL; - } - - status = ares_dns_parse(data, data_len, 0, &out); - ares_free(data); - if (status != ARES_SUCCESS) { - return NULL; - } - return out; -} diff --git a/deps/cares/src/lib/ares_dns_write.c b/deps/cares/src/lib/ares_dns_write.c deleted file mode 100644 index b49ec07bcb9b6b..00000000000000 --- a/deps/cares/src/lib/ares_dns_write.c +++ /dev/null @@ -1,1054 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include <limits.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif - - -static ares_status_t ares_dns_write_header(const ares_dns_record_t *dnsrec, - ares__buf_t *buf) -{ - unsigned short u16; - unsigned short opcode; - unsigned short rcode; - - ares_status_t status; - - /* ID */ - status = ares__buf_append_be16(buf, dnsrec->id); - if (status != ARES_SUCCESS) { - return status; - } - - /* Flags */ - u16 = 0; - - /* QR */ - if (dnsrec->flags & ARES_FLAG_QR) { - u16 |= 0x8000; - } - - /* OPCODE */ - opcode = (unsigned short)(dnsrec->opcode & 0xF); - opcode <<= 11; - u16 |= opcode; - - /* AA */ - if (dnsrec->flags & ARES_FLAG_AA) { - u16 |= 0x400; - } - - /* TC */ - if (dnsrec->flags & ARES_FLAG_TC) { - u16 |= 0x200; - } - - /* RD */ - if (dnsrec->flags & ARES_FLAG_RD) { - u16 |= 0x100; - } - - /* RA */ - if (dnsrec->flags & ARES_FLAG_RA) { - u16 |= 0x80; - } - - /* Z -- unused */ - - /* AD */ - if (dnsrec->flags & ARES_FLAG_AD) { - u16 |= 0x20; - } - - /* CD */ - if (dnsrec->flags & ARES_FLAG_CD) { - u16 |= 0x10; - } - - /* RCODE */ - if (dnsrec->rcode > 15 && !ares_dns_has_opt_rr(dnsrec)) { - /* Must have OPT RR in order to write extended error codes */ - rcode = ARES_RCODE_SERVFAIL; - } else { - rcode = (unsigned short)(dnsrec->rcode & 0xF); - } - u16 |= rcode; - - status = ares__buf_append_be16(buf, u16); - if (status != ARES_SUCCESS) { - return status; - } - - /* QDCOUNT */ - status = ares__buf_append_be16(buf, (unsigned short)dnsrec->qdcount); - if (status != ARES_SUCCESS) { - return status; - } - - /* ANCOUNT */ - status = ares__buf_append_be16(buf, (unsigned short)dnsrec->ancount); - if (status != ARES_SUCCESS) { - return status; - } - - /* NSCOUNT */ - status = ares__buf_append_be16(buf, (unsigned short)dnsrec->nscount); - if (status != ARES_SUCCESS) { - return status; - } - - /* ARCOUNT */ - status = ares__buf_append_be16(buf, (unsigned short)dnsrec->arcount); - if (status != ARES_SUCCESS) { - return status; - } - - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_questions(const ares_dns_record_t *dnsrec, - ares__llist_t **namelist, - ares__buf_t *buf) -{ - size_t i; - - for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { - ares_status_t status; - const char *name = NULL; - ares_dns_rec_type_t qtype; - ares_dns_class_t qclass; - - status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); - if (status != ARES_SUCCESS) { - return status; - } - - /* Name */ - status = ares__dns_name_write(buf, namelist, ARES_TRUE, name); - if (status != ARES_SUCCESS) { - return status; - } - - /* Type */ - status = ares__buf_append_be16(buf, (unsigned short)qtype); - if (status != ARES_SUCCESS) { - return status; - } - - /* Class */ - status = ares__buf_append_be16(buf, (unsigned short)qclass); - if (status != ARES_SUCCESS) { - return status; - } - } - - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_rr_name(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist, - ares_bool_t validate_hostname, - ares_dns_rr_key_t key) -{ - const char *name; - - name = ares_dns_rr_get_str(rr, key); - if (name == NULL) { - return ARES_EFORMERR; - } - - return ares__dns_name_write(buf, namelist, validate_hostname, name); -} - -static ares_status_t ares_dns_write_rr_str(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares_dns_rr_key_t key) -{ - const char *str; - size_t len; - ares_status_t status; - - str = ares_dns_rr_get_str(rr, key); - if (str == NULL) { - return ARES_EFORMERR; - } - - len = ares_strlen(str); - if (len > 255) { - return ARES_EFORMERR; - } - - /* Write 1 byte length */ - status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); - if (status != ARES_SUCCESS) { - return status; - } - - if (len == 0) { - return ARES_SUCCESS; - } - - /* Write string */ - return ares__buf_append(buf, (const unsigned char *)str, len); -} - -static ares_status_t ares_dns_write_rr_binstrs(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares_dns_rr_key_t key) -{ - const unsigned char *bin; - const unsigned char *ptr; - size_t bin_len; - size_t ptr_len; - ares_status_t status; - - bin = ares_dns_rr_get_bin(rr, key, &bin_len); - if (bin == NULL) { - return ARES_EFORMERR; - } - /* split into possible multiple 255-byte or less length strings */ - ptr = bin; - ptr_len = bin_len; - do { - size_t len = ptr_len; - if (len > 255) { - len = 255; - } - - /* Length */ - status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF)); - if (status != ARES_SUCCESS) { - return status; - } - - /* String */ - if (len) { - status = ares__buf_append(buf, ptr, len); - if (status != ARES_SUCCESS) { - return status; - } - } - - ptr += len; - ptr_len -= len; - } while (ptr_len > 0); - - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_rr_be32(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares_dns_rr_key_t key) -{ - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { - return ARES_EFORMERR; - } - return ares__buf_append_be32(buf, ares_dns_rr_get_u32(rr, key)); -} - -static ares_status_t ares_dns_write_rr_be16(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares_dns_rr_key_t key) -{ - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { - return ARES_EFORMERR; - } - return ares__buf_append_be16(buf, ares_dns_rr_get_u16(rr, key)); -} - -static ares_status_t ares_dns_write_rr_u8(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares_dns_rr_key_t key) -{ - if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { - return ARES_EFORMERR; - } - return ares__buf_append_byte(buf, ares_dns_rr_get_u8(rr, key)); -} - -static ares_status_t ares_dns_write_rr_a(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - const struct in_addr *addr; - (void)namelist; - - addr = ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR); - if (addr == NULL) { - return ARES_EFORMERR; - } - - return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); -} - -static ares_status_t ares_dns_write_rr_ns(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_NS_NSDNAME); -} - -static ares_status_t ares_dns_write_rr_cname(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_CNAME_CNAME); -} - -static ares_status_t ares_dns_write_rr_soa(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - - /* MNAME */ - status = - ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_MNAME); - if (status != ARES_SUCCESS) { - return status; - } - - /* RNAME */ - status = - ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_RNAME); - if (status != ARES_SUCCESS) { - return status; - } - - /* SERIAL */ - status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_SERIAL); - if (status != ARES_SUCCESS) { - return status; - } - - /* REFRESH */ - status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_REFRESH); - if (status != ARES_SUCCESS) { - return status; - } - - /* RETRY */ - status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_RETRY); - if (status != ARES_SUCCESS) { - return status; - } - - /* EXPIRE */ - status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_EXPIRE); - if (status != ARES_SUCCESS) { - return status; - } - - /* MINIMUM */ - return ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_MINIMUM); -} - -static ares_status_t ares_dns_write_rr_ptr(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_PTR_DNAME); -} - -static ares_status_t ares_dns_write_rr_hinfo(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - - (void)namelist; - - /* CPU */ - status = ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_CPU); - if (status != ARES_SUCCESS) { - return status; - } - - /* OS */ - return ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_OS); -} - -static ares_status_t ares_dns_write_rr_mx(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - - /* PREFERENCE */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_MX_PREFERENCE); - if (status != ARES_SUCCESS) { - return status; - } - - /* EXCHANGE */ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_MX_EXCHANGE); -} - -static ares_status_t ares_dns_write_rr_txt(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - (void)namelist; - return ares_dns_write_rr_binstrs(buf, rr, ARES_RR_TXT_DATA); -} - -static ares_status_t ares_dns_write_rr_aaaa(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - const struct ares_in6_addr *addr; - (void)namelist; - - addr = ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR); - if (addr == NULL) { - return ARES_EFORMERR; - } - - return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); -} - -static ares_status_t ares_dns_write_rr_srv(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - - /* PRIORITY */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PRIORITY); - if (status != ARES_SUCCESS) { - return status; - } - - /* WEIGHT */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_WEIGHT); - if (status != ARES_SUCCESS) { - return status; - } - - /* PORT */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PORT); - if (status != ARES_SUCCESS) { - return status; - } - - /* TARGET */ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_SRV_TARGET); -} - -static ares_status_t ares_dns_write_rr_naptr(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - - /* ORDER */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_ORDER); - if (status != ARES_SUCCESS) { - return status; - } - - /* PREFERENCE */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE); - if (status != ARES_SUCCESS) { - return status; - } - - /* FLAGS */ - status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_FLAGS); - if (status != ARES_SUCCESS) { - return status; - } - - /* SERVICES */ - status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_SERVICES); - if (status != ARES_SUCCESS) { - return status; - } - - /* REGEXP */ - status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_REGEXP); - if (status != ARES_SUCCESS) { - return status; - } - - /* REPLACEMENT */ - return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, - ARES_RR_NAPTR_REPLACEMENT); -} - -static ares_status_t ares_dns_write_rr_opt(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - size_t len = ares__buf_len(buf); - ares_status_t status; - unsigned int ttl = 0; - size_t i; - unsigned short rcode = (unsigned short)((rr->parent->rcode >> 4) & 0xFF); - - (void)namelist; - - /* We need to go back and overwrite the class and ttl that were emitted as - * the OPT record overloads them for its own use (yes, very strange!) */ - status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */ - - 4 /* TTL */ - - 2 /* CLASS */); - if (status != ARES_SUCCESS) { - return status; - } - - /* Class -> UDP Size */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_OPT_UDP_SIZE); - if (status != ARES_SUCCESS) { - return status; - } - - /* TTL -> rcode (u8) << 24 | version (u8) << 16 | flags (u16) */ - ttl |= (unsigned int)rcode << 24; - ttl |= (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION) << 16; - ttl |= (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS); - - status = ares__buf_append_be32(buf, ttl); - if (status != ARES_SUCCESS) { - return status; - } - - /* Now go back to real end */ - status = ares__buf_set_length(buf, len); - if (status != ARES_SUCCESS) { - return status; - } - - /* Append Options */ - for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS); i++) { - unsigned short opt; - size_t val_len; - const unsigned char *val; - - opt = ares_dns_rr_get_opt(rr, ARES_RR_OPT_OPTIONS, i, &val, &val_len); - - /* BE16 option */ - status = ares__buf_append_be16(buf, opt); - if (status != ARES_SUCCESS) { - return status; - } - - /* BE16 length */ - status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); - if (status != ARES_SUCCESS) { - return status; - } - - /* Value */ - if (val && val_len) { - status = ares__buf_append(buf, val, val_len); - if (status != ARES_SUCCESS) { - return status; - } - } - } - - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_rr_tlsa(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - const unsigned char *data; - size_t len = 0; - - (void)namelist; - - /* CERT_USAGE */ - status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE); - if (status != ARES_SUCCESS) { - return status; - } - - /* SELECTOR */ - status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_SELECTOR); - if (status != ARES_SUCCESS) { - return status; - } - - /* MATCH */ - status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_MATCH); - if (status != ARES_SUCCESS) { - return status; - } - - /* DATA -- binary, rest of buffer, required to be non-zero length */ - data = ares_dns_rr_get_bin(rr, ARES_RR_TLSA_DATA, &len); - if (data == NULL || len == 0) { - return ARES_EFORMERR; - } - - return ares__buf_append(buf, data, len); -} - -static ares_status_t ares_dns_write_rr_svcb(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - size_t i; - - /* PRIORITY */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SVCB_PRIORITY); - if (status != ARES_SUCCESS) { - return status; - } - - /* TARGET */ - status = - ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SVCB_TARGET); - if (status != ARES_SUCCESS) { - return status; - } - - /* Append Params */ - for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_SVCB_PARAMS); i++) { - unsigned short opt; - size_t val_len; - const unsigned char *val; - - opt = ares_dns_rr_get_opt(rr, ARES_RR_SVCB_PARAMS, i, &val, &val_len); - - /* BE16 option */ - status = ares__buf_append_be16(buf, opt); - if (status != ARES_SUCCESS) { - return status; - } - - /* BE16 length */ - status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); - if (status != ARES_SUCCESS) { - return status; - } - - /* Value */ - if (val && val_len) { - status = ares__buf_append(buf, val, val_len); - if (status != ARES_SUCCESS) { - return status; - } - } - } - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_rr_https(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - size_t i; - - /* PRIORITY */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_HTTPS_PRIORITY); - if (status != ARES_SUCCESS) { - return status; - } - - /* TARGET */ - status = - ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_HTTPS_TARGET); - if (status != ARES_SUCCESS) { - return status; - } - - /* Append Params */ - for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_HTTPS_PARAMS); i++) { - unsigned short opt; - size_t val_len; - const unsigned char *val; - - opt = ares_dns_rr_get_opt(rr, ARES_RR_HTTPS_PARAMS, i, &val, &val_len); - - /* BE16 option */ - status = ares__buf_append_be16(buf, opt); - if (status != ARES_SUCCESS) { - return status; - } - - /* BE16 length */ - status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); - if (status != ARES_SUCCESS) { - return status; - } - - /* Value */ - if (val && val_len) { - status = ares__buf_append(buf, val, val_len); - if (status != ARES_SUCCESS) { - return status; - } - } - } - return ARES_SUCCESS; -} - -static ares_status_t ares_dns_write_rr_uri(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - ares_status_t status; - const char *target; - - (void)namelist; - - /* PRIORITY */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_PRIORITY); - if (status != ARES_SUCCESS) { - return status; - } - - /* WEIGHT */ - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_WEIGHT); - if (status != ARES_SUCCESS) { - return status; - } - - /* TARGET -- not in DNS string format, rest of buffer, required to be - * non-zero length */ - target = ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET); - if (target == NULL || ares_strlen(target) == 0) { - return ARES_EFORMERR; - } - - return ares__buf_append(buf, (const unsigned char *)target, - ares_strlen(target)); -} - -static ares_status_t ares_dns_write_rr_caa(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - const unsigned char *data = NULL; - size_t data_len = 0; - ares_status_t status; - - (void)namelist; - - /* CRITICAL */ - status = ares_dns_write_rr_u8(buf, rr, ARES_RR_CAA_CRITICAL); - if (status != ARES_SUCCESS) { - return status; - } - - /* Tag */ - status = ares_dns_write_rr_str(buf, rr, ARES_RR_CAA_TAG); - if (status != ARES_SUCCESS) { - return status; - } - - /* Value - binary! (remaining buffer */ - data = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &data_len); - if (data == NULL || data_len == 0) { - return ARES_EFORMERR; - } - - return ares__buf_append(buf, data, data_len); -} - -static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf, - const ares_dns_rr_t *rr, - ares__llist_t **namelist) -{ - size_t len = ares__buf_len(buf); - ares_status_t status; - const unsigned char *data = NULL; - size_t data_len = 0; - - (void)namelist; - - /* We need to go back and overwrite the type that was emitted by the parent - * function */ - status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */ - - 4 /* TTL */ - - 2 /* CLASS */ - - 2 /* TYPE */); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares_dns_write_rr_be16(buf, rr, ARES_RR_RAW_RR_TYPE); - if (status != ARES_SUCCESS) { - return status; - } - - /* Now go back to real end */ - status = ares__buf_set_length(buf, len); - if (status != ARES_SUCCESS) { - return status; - } - - /* Output raw data */ - data = ares_dns_rr_get_bin(rr, ARES_RR_RAW_RR_DATA, &data_len); - if (data == NULL) { - return ARES_EFORMERR; - } - - if (data_len == 0) { - return ARES_SUCCESS; - } - - return ares__buf_append(buf, data, data_len); -} - -static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec, - ares__llist_t **namelist, - ares_dns_section_t section, - ares__buf_t *buf) -{ - size_t i; - - for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { - const ares_dns_rr_t *rr; - ares_dns_rec_type_t type; - ares_bool_t allow_compress; - ares__llist_t **namelistptr = NULL; - size_t pos_len; - ares_status_t status; - size_t rdlength; - size_t end_length; - unsigned int ttl; - - rr = ares_dns_record_rr_get_const(dnsrec, section, i); - if (rr == NULL) { - return ARES_EFORMERR; - } - - type = ares_dns_rr_get_type(rr); - allow_compress = ares_dns_rec_type_allow_name_compression(type); - if (allow_compress) { - namelistptr = namelist; - } - - /* Name */ - status = - ares__dns_name_write(buf, namelist, ARES_TRUE, ares_dns_rr_get_name(rr)); - if (status != ARES_SUCCESS) { - return status; - } - - /* Type */ - status = ares__buf_append_be16(buf, (unsigned short)type); - if (status != ARES_SUCCESS) { - return status; - } - - /* Class */ - status = - ares__buf_append_be16(buf, (unsigned short)ares_dns_rr_get_class(rr)); - if (status != ARES_SUCCESS) { - return status; - } - - /* TTL */ - ttl = ares_dns_rr_get_ttl(rr); - if (rr->parent->ttl_decrement > ttl) { - ttl = 0; - } else { - ttl -= rr->parent->ttl_decrement; - } - status = ares__buf_append_be32(buf, ttl); - if (status != ARES_SUCCESS) { - return status; - } - - /* Length */ - pos_len = ares__buf_len(buf); /* Save to write real length later */ - status = ares__buf_append_be16(buf, 0); - if (status != ARES_SUCCESS) { - return status; - } - - /* Data */ - switch (type) { - case ARES_REC_TYPE_A: - status = ares_dns_write_rr_a(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_NS: - status = ares_dns_write_rr_ns(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_CNAME: - status = ares_dns_write_rr_cname(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_SOA: - status = ares_dns_write_rr_soa(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_PTR: - status = ares_dns_write_rr_ptr(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_HINFO: - status = ares_dns_write_rr_hinfo(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_MX: - status = ares_dns_write_rr_mx(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_TXT: - status = ares_dns_write_rr_txt(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_AAAA: - status = ares_dns_write_rr_aaaa(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_SRV: - status = ares_dns_write_rr_srv(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_NAPTR: - status = ares_dns_write_rr_naptr(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_ANY: - status = ARES_EFORMERR; - break; - case ARES_REC_TYPE_OPT: - status = ares_dns_write_rr_opt(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_TLSA: - status = ares_dns_write_rr_tlsa(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_SVCB: - status = ares_dns_write_rr_svcb(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_HTTPS: - status = ares_dns_write_rr_https(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_URI: - status = ares_dns_write_rr_uri(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_CAA: - status = ares_dns_write_rr_caa(buf, rr, namelistptr); - break; - case ARES_REC_TYPE_RAW_RR: - status = ares_dns_write_rr_raw_rr(buf, rr, namelistptr); - break; - } - - if (status != ARES_SUCCESS) { - return status; - } - - /* Back off write pointer, write real length, then go back to proper - * position */ - end_length = ares__buf_len(buf); - rdlength = end_length - pos_len - 2; - - status = ares__buf_set_length(buf, pos_len); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_append_be16(buf, (unsigned short)(rdlength & 0xFFFF)); - if (status != ARES_SUCCESS) { - return status; - } - - status = ares__buf_set_length(buf, end_length); - if (status != ARES_SUCCESS) { - return status; - } - } - - return ARES_SUCCESS; -} - -ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, - unsigned char **buf, size_t *buf_len) -{ - ares__buf_t *b = NULL; - ares_status_t status; - ares__llist_t *namelist = NULL; - - if (buf == NULL || buf_len == NULL || dnsrec == NULL) { - return ARES_EFORMERR; - } - - *buf = NULL; - *buf_len = 0; - - b = ares__buf_create(); - if (b == NULL) { - return ARES_ENOMEM; - } - - status = ares_dns_write_header(dnsrec, b); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_write_questions(dnsrec, &namelist, b); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ANSWER, b); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_AUTHORITY, b); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ADDITIONAL, b); - if (status != ARES_SUCCESS) { - goto done; - } - -done: - ares__llist_destroy(namelist); - - if (status != ARES_SUCCESS) { - ares__buf_destroy(b); - return status; - } - - *buf = ares__buf_finish_bin(b, buf_len); - return status; -} - -void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec, - unsigned int ttl_decrement) -{ - if (dnsrec == NULL) { - return; - } - dnsrec->ttl_decrement = ttl_decrement; -} diff --git a/deps/cares/src/lib/ares_event_thread.c b/deps/cares/src/lib/ares_event_thread.c deleted file mode 100644 index 6dd7b502a35745..00000000000000 --- a/deps/cares/src/lib/ares_event_thread.c +++ /dev/null @@ -1,452 +0,0 @@ -/* MIT License - * - * Copyright (c) 2024 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares_event.h" - -static void ares_event_destroy_cb(void *arg) -{ - ares_event_t *event = arg; - if (event == NULL) { - return; - } - - /* Unregister from the event thread if it was registered with one */ - if (event->e) { - const ares_event_thread_t *e = event->e; - e->ev_sys->event_del(event); - event->e = NULL; - } - - if (event->free_data_cb && event->data) { - event->free_data_cb(event->data); - } - - ares_free(event); -} - -/* See if a pending update already exists. We don't want to enqueue multiple - * updates for the same event handle. Right now this is O(n) based on number - * of updates already enqueued. In the future, it might make sense to make - * this O(1) with a hashtable. - * NOTE: in some cases a delete then re-add of the same fd, but really pointing - * to a different destination can happen due to a quick close of a - * connection then creation of a new one. So we need to look at the - * flags and ignore any delete events when finding a match since we - * need to process the delete always, it can't be combined with other - * updates. */ -static ares_event_t *ares_event_update_find(ares_event_thread_t *e, - ares_socket_t fd, const void *data) -{ - ares__llist_node_t *node; - - for (node = ares__llist_node_first(e->ev_updates); node != NULL; - node = ares__llist_node_next(node)) { - ares_event_t *ev = ares__llist_node_val(node); - - if (fd != ARES_SOCKET_BAD && fd == ev->fd && ev->flags != 0) { - return ev; - } - - if (fd == ARES_SOCKET_BAD && ev->fd == ARES_SOCKET_BAD && - data == ev->data && ev->flags != 0) { - return ev; - } - } - - return NULL; -} - -ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e, - ares_event_flags_t flags, ares_event_cb_t cb, - ares_socket_t fd, void *data, - ares_event_free_data_t free_data_cb, - ares_event_signal_cb_t signal_cb) -{ - ares_event_t *ev = NULL; - - if (e == NULL || cb == NULL) { - return ARES_EFORMERR; - } - - if (event != NULL) { - *event = NULL; - } - - /* Validate flags */ - if (fd == ARES_SOCKET_BAD) { - if (flags & (ARES_EVENT_FLAG_READ | ARES_EVENT_FLAG_WRITE)) { - return ARES_EFORMERR; - } - if (!(flags & ARES_EVENT_FLAG_OTHER)) { - return ARES_EFORMERR; - } - } else { - if (flags & ARES_EVENT_FLAG_OTHER) { - return ARES_EFORMERR; - } - } - - /* That's all the validation we can really do */ - - /* See if we have a queued update already */ - ev = ares_event_update_find(e, fd, data); - if (ev == NULL) { - /* Allocate a new one */ - ev = ares_malloc_zero(sizeof(*ev)); - if (ev == NULL) { - return ARES_ENOMEM; - } - - if (ares__llist_insert_last(e->ev_updates, ev) == NULL) { - ares_free(ev); - return ARES_ENOMEM; - } - } - - ev->flags = flags; - ev->fd = fd; - if (ev->cb == NULL) { - ev->cb = cb; - } - if (ev->data == NULL) { - ev->data = data; - } - if (ev->free_data_cb == NULL) { - ev->free_data_cb = free_data_cb; - } - if (ev->signal_cb == NULL) { - ev->signal_cb = signal_cb; - } - - if (event != NULL) { - *event = ev; - } - - return ARES_SUCCESS; -} - -static void ares_event_signal(const ares_event_t *event) -{ - if (event == NULL || event->signal_cb == NULL) { - return; - } - event->signal_cb(event); -} - -static void ares_event_thread_wake(const ares_event_thread_t *e) -{ - if (e == NULL) { - return; - } - - ares_event_signal(e->ev_signal); -} - -static void ares_event_thread_process_fd(ares_event_thread_t *e, - ares_socket_t fd, void *data, - ares_event_flags_t flags) -{ - (void)data; - - ares_process_fd(e->channel, - (flags & ARES_EVENT_FLAG_READ) ? fd : ARES_SOCKET_BAD, - (flags & ARES_EVENT_FLAG_WRITE) ? fd : ARES_SOCKET_BAD); -} - -static void ares_event_thread_sockstate_cb(void *data, ares_socket_t socket_fd, - int readable, int writable) -{ - ares_event_thread_t *e = data; - ares_event_flags_t flags = ARES_EVENT_FLAG_NONE; - - if (readable) { - flags |= ARES_EVENT_FLAG_READ; - } - - if (writable) { - flags |= ARES_EVENT_FLAG_WRITE; - } - - /* Update channel fd */ - ares__thread_mutex_lock(e->mutex); - ares_event_update(NULL, e, flags, ares_event_thread_process_fd, socket_fd, - NULL, NULL, NULL); - - /* Wake the event thread so it properly enqueues any updates */ - ares_event_thread_wake(e); - - ares__thread_mutex_unlock(e->mutex); -} - -static void ares_event_process_updates(ares_event_thread_t *e) -{ - ares__llist_node_t *node; - - /* Iterate across all updates and apply to internal list, removing from update - * list */ - while ((node = ares__llist_node_first(e->ev_updates)) != NULL) { - ares_event_t *newev = ares__llist_node_claim(node); - ares_event_t *oldev = - ares__htable_asvp_get_direct(e->ev_handles, newev->fd); - - /* Adding new */ - if (oldev == NULL) { - newev->e = e; - /* Don't try to add a new event if all flags are cleared, that's basically - * someone trying to delete something already deleted. Also if it fails - * to add, cleanup. */ - if (newev->flags == ARES_EVENT_FLAG_NONE || - !e->ev_sys->event_add(newev)) { - newev->e = NULL; - ares_event_destroy_cb(newev); - } else { - ares__htable_asvp_insert(e->ev_handles, newev->fd, newev); - } - continue; - } - - /* Removal request */ - if (newev->flags == ARES_EVENT_FLAG_NONE) { - /* the callback for the removal will call e->ev_sys->event_del(e, event) - */ - ares__htable_asvp_remove(e->ev_handles, newev->fd); - ares_free(newev); - continue; - } - - /* Modify request -- only flags can be changed */ - e->ev_sys->event_mod(oldev, newev->flags); - oldev->flags = newev->flags; - ares_free(newev); - } -} - -static void *ares_event_thread(void *arg) -{ - ares_event_thread_t *e = arg; - ares__thread_mutex_lock(e->mutex); - - while (e->isup) { - struct timeval tv; - const struct timeval *tvout; - unsigned long timeout_ms = 0; /* 0 = unlimited */ - - tvout = ares_timeout(e->channel, NULL, &tv); - if (tvout != NULL) { - timeout_ms = - (unsigned long)((tvout->tv_sec * 1000) + (tvout->tv_usec / 1000) + 1); - } - - ares_event_process_updates(e); - - /* Don't hold a mutex while waiting on events */ - ares__thread_mutex_unlock(e->mutex); - e->ev_sys->wait(e, timeout_ms); - - /* Each iteration should do timeout processing */ - if (e->isup) { - ares_process_fd(e->channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD); - } - - /* Relock before we loop again */ - ares__thread_mutex_lock(e->mutex); - } - - ares__thread_mutex_unlock(e->mutex); - return NULL; -} - -static void ares_event_thread_destroy_int(ares_event_thread_t *e) -{ - ares__llist_node_t *node; - - /* Wake thread and tell it to shutdown if it exists */ - ares__thread_mutex_lock(e->mutex); - if (e->isup) { - e->isup = ARES_FALSE; - ares_event_thread_wake(e); - } - ares__thread_mutex_unlock(e->mutex); - - /* Wait for thread to shutdown */ - if (e->thread) { - ares__thread_join(e->thread, NULL); - e->thread = NULL; - } - - /* Manually free any updates that weren't processed */ - while ((node = ares__llist_node_first(e->ev_updates)) != NULL) { - ares_event_destroy_cb(ares__llist_node_claim(node)); - } - ares__llist_destroy(e->ev_updates); - e->ev_updates = NULL; - - ares__htable_asvp_destroy(e->ev_handles); - e->ev_handles = NULL; - - if (e->ev_sys->destroy) { - e->ev_sys->destroy(e); - } - - ares__thread_mutex_destroy(e->mutex); - e->mutex = NULL; - - ares_free(e); -} - -void ares_event_thread_destroy(ares_channel_t *channel) -{ - ares_event_thread_t *e = channel->sock_state_cb_data; - - if (e == NULL) { - return; - } - - ares_event_thread_destroy_int(e); -} - -static const ares_event_sys_t *ares_event_fetch_sys(ares_evsys_t evsys) -{ - switch (evsys) { - case ARES_EVSYS_WIN32: -#if defined(_WIN32) - return &ares_evsys_win32; -#else - return NULL; -#endif - - case ARES_EVSYS_EPOLL: -#if defined(HAVE_EPOLL) - return &ares_evsys_epoll; -#else - return NULL; -#endif - - case ARES_EVSYS_KQUEUE: -#if defined(HAVE_KQUEUE) - return &ares_evsys_kqueue; -#else - return NULL; -#endif - - case ARES_EVSYS_POLL: -#if defined(HAVE_POLL) - return &ares_evsys_poll; -#else - return NULL; -#endif - - case ARES_EVSYS_SELECT: -#if defined(HAVE_PIPE) - return &ares_evsys_select; -#else - return NULL; -#endif - - /* case ARES_EVSYS_DEFAULT: */ - default: -#if defined(_WIN32) - return &ares_evsys_win32; -#elif defined(HAVE_KQUEUE) - return &ares_evsys_kqueue; -#elif defined(HAVE_EPOLL) - return &ares_evsys_epoll; -#elif defined(HAVE_POLL) - return &ares_evsys_poll; -#elif defined(HAVE_PIPE) - return &ares_evsys_select; -#else - break; -#endif - } - - return NULL; -} - -ares_status_t ares_event_thread_init(ares_channel_t *channel) -{ - ares_event_thread_t *e; - - e = ares_malloc_zero(sizeof(*e)); - if (e == NULL) { - return ARES_ENOMEM; - } - - e->mutex = ares__thread_mutex_create(); - if (e->mutex == NULL) { - ares_event_thread_destroy_int(e); - return ARES_ENOMEM; - } - - e->ev_updates = ares__llist_create(NULL); - if (e->ev_updates == NULL) { - ares_event_thread_destroy_int(e); - return ARES_ENOMEM; - } - - e->ev_handles = ares__htable_asvp_create(ares_event_destroy_cb); - if (e->ev_handles == NULL) { - ares_event_thread_destroy_int(e); - return ARES_ENOMEM; - } - - e->channel = channel; - e->isup = ARES_TRUE; - e->ev_sys = ares_event_fetch_sys(channel->evsys); - if (e->ev_sys == NULL) { - ares_event_thread_destroy_int(e); - return ARES_ENOTIMP; - } - - channel->sock_state_cb = ares_event_thread_sockstate_cb; - channel->sock_state_cb_data = e; - - if (!e->ev_sys->init(e)) { - ares_event_thread_destroy_int(e); - channel->sock_state_cb = NULL; - channel->sock_state_cb_data = NULL; - return ARES_ESERVFAIL; - } - - /* Before starting the thread, process any possible events the initialization - * might have enqueued as we may actually depend on these being valid - * immediately upon return, which may mean before the thread is fully spawned - * and processed the list itself. We don't want any sort of race conditions - * (like the event system wake handle itself). */ - ares_event_process_updates(e); - - /* Start thread */ - if (ares__thread_create(&e->thread, ares_event_thread, e) != ARES_SUCCESS) { - ares_event_thread_destroy_int(e); - channel->sock_state_cb = NULL; - channel->sock_state_cb_data = NULL; - return ARES_ESERVFAIL; - } - - return ARES_SUCCESS; -} diff --git a/deps/cares/src/lib/ares_event_win32.c b/deps/cares/src/lib/ares_event_win32.c deleted file mode 100644 index 718e865085116c..00000000000000 --- a/deps/cares/src/lib/ares_event_win32.c +++ /dev/null @@ -1,601 +0,0 @@ -/* MIT License - * - * Copyright (c) 2024 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" -#include "ares_event.h" -#include "ares_event_win32.h" -#ifdef HAVE_LIMITS_H -# include <limits.h> -#endif - -#ifdef _WIN32 - -/* IMPLEMENTATION NOTES - * ==================== - * - * This implementation uses some undocumented functionality within Windows for - * monitoring sockets. The Ancillary Function Driver (AFD) is the low level - * implementation that Winsock2 sits on top of. Winsock2 unfortunately does - * not expose the equivalent of epoll() or kqueue(), but it is possible to - * access AFD directly and use along with IOCP to simulate the functionality. - * We want to use IOCP if possible as it gives us the ability to monitor more - * than just sockets (WSAPoll is not an option), and perform arbitrary callbacks - * which means we can hook in non-socket related events. - * - * The information for this implementation was gathered from "wepoll" and - * "libuv" which both use slight variants on this, but this implementation - * doesn't directly follow either methodology. - * - * Initialization: - * 1. Dynamically load the NtDeviceIoControlFile and NtCancelIoFileEx internal - * symbols from ntdll.dll. These functions are used to submit the AFD POLL - * request and to cancel a prior request, respectively. - * 2. Create an IO Completion Port base handle via CreateIoCompletionPort() - * that all socket events will be delivered through. - * 3. Create a callback to be used to be able to interrupt waiting for IOCP - * events, this may be called for allowing enqueuing of additional socket - * events or removing socket events. PostQueuedCompletionStatus() is the - * obvious choice. Use the same container structure as used with a Socket - * but tagged indicating it is not as the CompletionKey (important!). - * - * Socket Add: - * 1. Create/Allocate a container for holding metadata about a socket: - * - SOCKET base_socket; - * - SOCKET peer_socket; - * - OVERLAPPED overlapped; -- Used by AFD POLL - * - AFD_POLL_INFO afd_poll_info; -- Used by AFD POLL - * 2. Call WSAIoctl(..., SIO_BASE_HANDLE, ...) to unwrap the SOCKET and get - * the "base socket" we can use for polling. It appears this may fail so - * we should call WSAIoctl(..., SIO_BSP_HANDLE_POLL, ...) as a fallback. - * 3. The SOCKET handle we have is most likely not capable of supporting - * OVERLAPPED, and we need to have a way to unbind a socket from IOCP - * (which is done via a simple closesocket()) so we need to duplicate the - * "base socket" using WSADuplicateSocketW() followed by - * WSASocketW(..., WSA_FLAG_OVERLAPPED) to create this "peer socket" for - * submitting AFD POLL requests. - * 4. Bind to IOCP using CreateIoCompletionPort() referencing the "peer - * socket" and the base IOCP handle from "Initialization". Use the - * pointer to the socket container as the "CompletionKey" which will be - * returned when an event occurs. - * 5. Submit AFD POLL request (see "AFD POLL Request" section) - * - * Socket Delete: - * 1. Call "AFD Poll Cancel" (see Section of same name) - * 2. If a cancel was requested (not bypassed due to no events, etc), tag the - * "container" for the socket as pending delete, and when the next IOCP - * event for the socket is dequeued, cleanup. - * 3. Otherwise, call closesocket(peer_socket) then free() the container - * which will officially delete it. - * NOTE: Deferring delete may be completely unnecessary. In theory closing - * the peer_socket() should guarantee no additional events will be - * delivered. But maybe if there's a pending event that hasn't been - * read yet but already trigggered it would be an issue, so this is - * "safer" unless we can prove its not necessary. - * - * Socket Modify: - * 1. Call "AFD Poll Cancel" (see Section of same name) - * 2. If a cancel was not enqueued because there is no pending request, - * submit AFD POLL request (see "AFD POLL Request" section), otherwise - * defer until next socket event. - * - * Event Wait: - * 1. Call GetQueuedCompletionStatusEx() with the base IOCP handle, a - * stack allocated array of OVERLAPPED_ENTRY's, and an appropriate - * timeout. - * 2. Iterate across returned events, the CompletionKey is a pointer to the - * container registered with CreateIoCompletionPort() or - * PostQueuedCompletionStatus() - * 3. If object indicates it is pending delete, go ahead and - * closesocket(peer_socket) and free() the container. Go to the next event. - * 4. Submit AFD POLL Request (see "AFD POLL Request"). We must re-enable - * the request each time we receive a response, it is not persistent. - * 5. Notify of any events received as indicated in the AFD_POLL_INFO - * Handles[0].Events (NOTE: check NumberOfHandles first, make sure it is - * > 0, otherwise we might not have events such as if our last request - * was cancelled). - * - * AFD Poll Request: - * 1. Initialize the AFD_POLL_INFO structure: - * Exclusive = TRUE; // Auto cancel duplicates for same socket - * NumberOfHandles = 1; - * Timeout.QuadPart = LLONG_MAX; - * Handles[0].Handle = (HANDLE)base_socket; - * Handles[0].Status = 0; - * Handles[0].Events = ... set as appropriate AFD_POLL_RECEIVE, etc; - * 2. Zero out the OVERLAPPED structure - * 3. Create an IO_STATUS_BLOCK pointer (iosb) and set it to the address of - * the OVERLAPPED "Internal" member. - * 4. Set the "Status" member of IO_STATUS_BLOCK to STATUS_PENDING - * 5. Call - * NtDeviceIoControlFile((HANDLE)peer_socket, NULL, NULL, &overlapped, - * iosb, IOCTL_AFD_POLL - * &afd_poll_info, sizeof(afd_poll_info), - * &afd_poll_info, sizeof(afd_poll_info)); - * NOTE: Its not clear to me if the IO_STATUS_BLOCK pointing to OVERLAPPED - * is for efficiency or if its a requirement for AFD. This is what - * libuv does, so I'm doing it here too. - * - * AFD Poll Cancel: - * 1. Check to see if the IO_STATUS_BLOCK "Status" member for the socket - * is still STATUS_PENDING, if not, no cancel request is necessary. - * 2. Call - * NtCancelIoFileEx((HANDLE)peer_socket, iosb, &temp_iosb); - * - * - * References: - * - https://github.com/piscisaureus/wepoll/ - * - https://github.com/libuv/libuv/ - */ - -typedef struct { - /* Dynamically loaded symbols */ - NtDeviceIoControlFile_t NtDeviceIoControlFile; - NtCancelIoFileEx_t NtCancelIoFileEx; - - /* Implementation details */ - HANDLE iocp_handle; -} ares_evsys_win32_t; - -typedef struct { - /*! Pointer to parent event container */ - ares_event_t *event; - /*! Socket passed in to monitor */ - SOCKET socket; - /*! Base socket derived from provided socket */ - SOCKET base_socket; - /*! New socket (duplicate base_socket handle) supporting OVERLAPPED operation - */ - SOCKET peer_socket; - /*! Structure for submitting AFD POLL requests (Internals!) */ - AFD_POLL_INFO afd_poll_info; - /*! Overlapped structure submitted with AFD POLL requests and returned with - * IOCP results */ - OVERLAPPED overlapped; -} ares_evsys_win32_eventdata_t; - -static void ares_iocpevent_signal(const ares_event_t *event) -{ - ares_event_thread_t *e = event->e; - ares_evsys_win32_t *ew = e->ev_sys_data; - - if (e == NULL) { - return; - } - - PostQueuedCompletionStatus(ew->iocp_handle, 0, (ULONG_PTR)event->data, NULL); -} - -static void ares_iocpevent_cb(ares_event_thread_t *e, ares_socket_t fd, - void *data, ares_event_flags_t flags) -{ - (void)e; - (void)data; - (void)fd; - (void)flags; -} - -static ares_event_t *ares_iocpevent_create(ares_event_thread_t *e) -{ - ares_event_t *event = NULL; - ares_status_t status; - - status = - ares_event_update(&event, e, ARES_EVENT_FLAG_OTHER, ares_iocpevent_cb, - ARES_SOCKET_BAD, NULL, NULL, ares_iocpevent_signal); - if (status != ARES_SUCCESS) { - return NULL; - } - - return event; -} - -static void ares_evsys_win32_destroy(ares_event_thread_t *e) -{ - ares_evsys_win32_t *ew = NULL; - - if (e == NULL) { - return; - } - - ew = e->ev_sys_data; - if (ew == NULL) { - return; - } - - if (ew->iocp_handle != NULL) { - CloseHandle(ew->iocp_handle); - } - - ares_free(ew); - e->ev_sys_data = NULL; -} - -static ares_bool_t ares_evsys_win32_init(ares_event_thread_t *e) -{ - ares_evsys_win32_t *ew = NULL; - HMODULE ntdll; - - ew = ares_malloc_zero(sizeof(*ew)); - if (ew == NULL) { - return ARES_FALSE; - } - - e->ev_sys_data = ew; - - /* All apps should have ntdll.dll already loaded, so just get a handle to - * this */ - ntdll = GetModuleHandleA("ntdll.dll"); - if (ntdll == NULL) { - goto fail; - } - - /* Load Internal symbols not typically accessible */ - ew->NtDeviceIoControlFile = (NtDeviceIoControlFile_t)(void *)GetProcAddress( - ntdll, "NtDeviceIoControlFile"); - ew->NtCancelIoFileEx = - (NtCancelIoFileEx_t)(void *)GetProcAddress(ntdll, "NtCancelIoFileEx"); - - if (ew->NtCancelIoFileEx == NULL || ew->NtDeviceIoControlFile == NULL) { - goto fail; - } - - ew->iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); - if (ew->iocp_handle == NULL) { - goto fail; - } - - e->ev_signal = ares_iocpevent_create(e); - if (e->ev_signal == NULL) { - goto fail; - } - - return ARES_TRUE; - -fail: - ares_evsys_win32_destroy(e); - return ARES_FALSE; -} - -static ares_socket_t ares_evsys_win32_basesocket(ares_socket_t socket) -{ - while (1) { - DWORD bytes; /* Not used */ - ares_socket_t base_socket = ARES_SOCKET_BAD; - int rv; - - rv = WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket, - sizeof(base_socket), &bytes, NULL, NULL); - if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD) { - socket = base_socket; - break; - } - - /* If we're here, an error occurred */ - if (GetLastError() == WSAENOTSOCK) { - /* This is critical, exit */ - return ARES_SOCKET_BAD; - } - - /* Work around known bug in Komodia based LSPs, use ARES_BSP_HANDLE_POLL - * to retrieve the underlying socket to then loop and get the base socket: - * https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-ioctls - * https://www.komodia.com/newwiki/index.php?title=Komodia%27s_Redirector_bug_fixes#Version_2.2.2.6 - */ - base_socket = ARES_SOCKET_BAD; - rv = WSAIoctl(socket, SIO_BSP_HANDLE_POLL, NULL, 0, &base_socket, - sizeof(base_socket), &bytes, NULL, NULL); - - if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD && - base_socket != socket) { - socket = base_socket; - continue; /* loop! */ - } - - return ARES_SOCKET_BAD; - } - - return socket; -} - -static ares_bool_t ares_evsys_win32_afd_enqueue(ares_event_t *event, - ares_event_flags_t flags) -{ - ares_event_thread_t *e = event->e; - ares_evsys_win32_t *ew = e->ev_sys_data; - ares_evsys_win32_eventdata_t *ed = event->data; - NTSTATUS status; - IO_STATUS_BLOCK *iosb_ptr; - - if (e == NULL || ed == NULL || ew == NULL) { - return ARES_FALSE; - } - - /* Enqueue AFD Poll */ - ed->afd_poll_info.Exclusive = TRUE; - ed->afd_poll_info.NumberOfHandles = 1; - ed->afd_poll_info.Timeout.QuadPart = LLONG_MAX; - ed->afd_poll_info.Handles[0].Handle = (HANDLE)ed->base_socket; - ed->afd_poll_info.Handles[0].Status = 0; - ed->afd_poll_info.Handles[0].Events = 0; - - if (flags & ARES_EVENT_FLAG_READ) { - ed->afd_poll_info.Handles[0].Events |= - (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | - AFD_POLL_ABORT); - } - if (flags & ARES_EVENT_FLAG_WRITE) { - ed->afd_poll_info.Handles[0].Events |= - (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL); - } - if (flags == 0) { - ed->afd_poll_info.Handles[0].Events |= AFD_POLL_DISCONNECT; - } - - memset(&ed->overlapped, 0, sizeof(ed->overlapped)); - iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal; - iosb_ptr->Status = STATUS_PENDING; - - status = ew->NtDeviceIoControlFile( - (HANDLE)ed->peer_socket, NULL, NULL, &ed->overlapped, iosb_ptr, - IOCTL_AFD_POLL, &ed->afd_poll_info, sizeof(ed->afd_poll_info), - &ed->afd_poll_info, sizeof(ed->afd_poll_info)); - if (status != STATUS_SUCCESS && status != STATUS_PENDING) { - printf("%s(): failed to perform IOCTL_AFD_POLL operation\n", __FUNCTION__); - fflush(stdout); - return ARES_FALSE; - } - - return ARES_TRUE; -} - -static ares_bool_t ares_evsys_win32_afd_cancel(ares_evsys_win32_eventdata_t *ed) -{ - IO_STATUS_BLOCK *iosb_ptr; - IO_STATUS_BLOCK cancel_iosb; - ares_evsys_win32_t *ew; - NTSTATUS status; - - /* Detached due to destroy */ - if (ed->event == NULL) { - return ARES_FALSE; - } - - iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal; - /* Not pending, nothing to do */ - if (iosb_ptr->Status != STATUS_PENDING) { - return ARES_FALSE; - } - - ew = ed->event->e->ev_sys_data; - status = - ew->NtCancelIoFileEx((HANDLE)ed->peer_socket, iosb_ptr, &cancel_iosb); - - /* NtCancelIoFileEx() may return STATUS_NOT_FOUND if the operation completed - * just before calling NtCancelIoFileEx(), but we have not yet received the - * notifiction (but it should be queued for the next IOCP event). */ - if (status == STATUS_SUCCESS || status == STATUS_NOT_FOUND) { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -static void ares_evsys_win32_eventdata_destroy(ares_evsys_win32_eventdata_t *ed) -{ - if (ed == NULL) { - return; - } - - if (ed->peer_socket != ARES_SOCKET_BAD) { - closesocket(ed->peer_socket); - } - - ares_free(ed); -} - -static ares_bool_t ares_evsys_win32_event_add(ares_event_t *event) -{ - ares_event_thread_t *e = event->e; - ares_evsys_win32_t *ew = e->ev_sys_data; - ares_evsys_win32_eventdata_t *ed; - WSAPROTOCOL_INFOW protocol_info; - - ed = ares_malloc_zero(sizeof(*ed)); - ed->event = event; - ed->socket = event->fd; - ed->base_socket = ARES_SOCKET_BAD; - ed->peer_socket = ARES_SOCKET_BAD; - - /* Likely a signal event, not something we will directly handle. We create - * the ares_evsys_win32_eventdata_t as the placeholder to use as the - * IOCP Completion Key */ - if (ed->socket == ARES_SOCKET_BAD) { - event->data = ed; - return ARES_TRUE; - } - - ed->base_socket = ares_evsys_win32_basesocket(ed->socket); - if (ed->base_socket == ARES_SOCKET_BAD) { - fprintf(stderr, "%s(): could not determine base socket for fd %d\n", - __FUNCTION__, (int)event->fd); - ares_evsys_win32_eventdata_destroy(ed); - return ARES_FALSE; - } - - /* Create a peer socket that supports OVERLAPPED so we can use IOCP on the - * socket handle */ - if (WSADuplicateSocketW(ed->base_socket, GetCurrentProcessId(), - &protocol_info) != 0) { - fprintf(stderr, - "%s(): could not retrieve protocol info for creating peer socket\n", - __FUNCTION__); - ares_evsys_win32_eventdata_destroy(ed); - return ARES_FALSE; - } - - ed->peer_socket = - WSASocketW(protocol_info.iAddressFamily, protocol_info.iSocketType, - protocol_info.iProtocol, &protocol_info, 0, WSA_FLAG_OVERLAPPED); - if (ed->peer_socket == ARES_SOCKET_BAD) { - fprintf(stderr, "%s(): could not create peer socket\n", __FUNCTION__); - ares_evsys_win32_eventdata_destroy(ed); - return ARES_FALSE; - } - - SetHandleInformation((HANDLE)ed->peer_socket, HANDLE_FLAG_INHERIT, 0); - - if (CreateIoCompletionPort((HANDLE)ed->peer_socket, ew->iocp_handle, - (ULONG_PTR)ed, 0) == NULL) { - fprintf(stderr, "%s(): failed to bind peer socket to IOCP\n", __FUNCTION__); - ares_evsys_win32_eventdata_destroy(ed); - return ARES_FALSE; - } - - event->data = ed; - - if (!ares_evsys_win32_afd_enqueue(event, event->flags)) { - event->data = NULL; - ares_evsys_win32_eventdata_destroy(ed); - return ARES_FALSE; - } - - return ARES_TRUE; -} - -static void ares_evsys_win32_event_del(ares_event_t *event) -{ - ares_evsys_win32_eventdata_t *ed = event->data; - ares_event_thread_t *e = event->e; - - if (event->fd == ARES_SOCKET_BAD || !e->isup || ed == NULL || - !ares_evsys_win32_afd_cancel(ed)) { - /* Didn't need to enqueue a cancellation, for one of these reasons: - * - Not an IOCP socket - * - This is during shutdown of the event thread, no more signals can be - * delivered. - * - It has been determined there is no AFD POLL queued currently for the - * socket. - */ - ares_evsys_win32_eventdata_destroy(ed); - event->data = NULL; - } else { - /* Detach from event, so when the cancel event comes through, - * it will clean up */ - ed->event = NULL; - event->data = NULL; - } -} - -static void ares_evsys_win32_event_mod(ares_event_t *event, - ares_event_flags_t new_flags) -{ - ares_evsys_win32_eventdata_t *ed = event->data; - - /* Not for us */ - if (event->fd == ARES_SOCKET_BAD || ed == NULL) { - return; - } - - /* Try to cancel any current outstanding poll, if one is not running, - * go ahead and queue it up */ - if (!ares_evsys_win32_afd_cancel(ed)) { - ares_evsys_win32_afd_enqueue(event, new_flags); - } -} - -static size_t ares_evsys_win32_wait(ares_event_thread_t *e, - unsigned long timeout_ms) -{ - ares_evsys_win32_t *ew = e->ev_sys_data; - OVERLAPPED_ENTRY entries[16]; - ULONG nentries = sizeof(entries) / sizeof(*entries); - BOOL status; - size_t i; - size_t cnt = 0; - - status = GetQueuedCompletionStatusEx( - ew->iocp_handle, entries, nentries, &nentries, - (timeout_ms == 0) ? INFINITE : (DWORD)timeout_ms, FALSE); - - if (!status) { - return 0; - } - - for (i = 0; i < (size_t)nentries; i++) { - ares_event_flags_t flags = 0; - ares_evsys_win32_eventdata_t *ed = - (ares_evsys_win32_eventdata_t *)entries[i].lpCompletionKey; - ares_event_t *event = ed->event; - - if (ed->socket == ARES_SOCKET_BAD) { - /* Some sort of signal event */ - flags = ARES_EVENT_FLAG_OTHER; - } else { - /* Process events */ - if (ed->afd_poll_info.NumberOfHandles > 0) { - if (ed->afd_poll_info.Handles[0].Events & - (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | - AFD_POLL_ABORT)) { - flags |= ARES_EVENT_FLAG_READ; - } - if (ed->afd_poll_info.Handles[0].Events & - (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) { - flags |= ARES_EVENT_FLAG_WRITE; - } - - /* XXX: Handle ed->afd_poll_info.Handles[0].Events & - * AFD_POLL_LOCAL_CLOSE */ - } - - if (event == NULL) { - /* This means we need to cleanup the private event data as we've been - * detached */ - ares_evsys_win32_eventdata_destroy(ed); - } else { - /* Re-enqueue so we can get more events on the socket */ - ares_evsys_win32_afd_enqueue(event, event->flags); - } - } - - if (event != NULL && flags != 0) { - cnt++; - event->cb(e, event->fd, event->data, flags); - } - } - - return cnt; -} - -const ares_event_sys_t ares_evsys_win32 = { "win32", - ares_evsys_win32_init, - ares_evsys_win32_destroy, - ares_evsys_win32_event_add, - ares_evsys_win32_event_del, - ares_evsys_win32_event_mod, - ares_evsys_win32_wait }; -#endif diff --git a/deps/cares/src/lib/ares_event_win32.h b/deps/cares/src/lib/ares_event_win32.h deleted file mode 100644 index 99cd5c90f359c8..00000000000000 --- a/deps/cares/src/lib/ares_event_win32.h +++ /dev/null @@ -1,119 +0,0 @@ -/* MIT License - * - * Copyright (c) 2024 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES_EVENT_WIN32_H -#define __ARES_EVENT_WIN32_H - -#ifdef _WIN32 -# ifdef HAVE_WINSOCK2_H -# include <winsock2.h> -# endif -# ifdef HAVE_WS2TCPIP_H -# include <ws2tcpip.h> -# endif -# ifdef HAVE_MSWSOCK_H -# include <mswsock.h> -# endif -# ifdef HAVE_WINDOWS_H -# include <windows.h> -# endif - -/* From winternl.h */ - -/* If WDK is not installed and not using MinGW, provide the needed definitions - */ -typedef LONG NTSTATUS; - -typedef struct _IO_STATUS_BLOCK { - union { - NTSTATUS Status; - PVOID Pointer; - }; - - ULONG_PTR Information; -} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; - -typedef VOID(NTAPI *PIO_APC_ROUTINE)(PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - ULONG Reserved); - -/* From ntstatus.h */ -# define STATUS_SUCCESS ((NTSTATUS)0x00000000) -# ifndef STATUS_PENDING -# define STATUS_PENDING ((NTSTATUS)0x00000103L) -# endif -# define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) -# define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L) - -/* Not sure what headers might have these */ -# define IOCTL_AFD_POLL 0x00012024 - -# define AFD_POLL_RECEIVE 0x0001 -# define AFD_POLL_RECEIVE_EXPEDITED 0x0002 -# define AFD_POLL_SEND 0x0004 -# define AFD_POLL_DISCONNECT 0x0008 -# define AFD_POLL_ABORT 0x0010 -# define AFD_POLL_LOCAL_CLOSE 0x0020 -# define AFD_POLL_ACCEPT 0x0080 -# define AFD_POLL_CONNECT_FAIL 0x0100 - -typedef struct _AFD_POLL_HANDLE_INFO { - HANDLE Handle; - ULONG Events; - NTSTATUS Status; -} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; - -typedef struct _AFD_POLL_INFO { - LARGE_INTEGER Timeout; - ULONG NumberOfHandles; - ULONG Exclusive; - AFD_POLL_HANDLE_INFO Handles[1]; -} AFD_POLL_INFO, *PAFD_POLL_INFO; - -/* Prototypes for dynamically loaded functions from ntdll.dll */ -typedef NTSTATUS(NTAPI *NtCancelIoFileEx_t)(HANDLE FileHandle, - PIO_STATUS_BLOCK IoRequestToCancel, - PIO_STATUS_BLOCK IoStatusBlock); -typedef NTSTATUS(NTAPI *NtDeviceIoControlFile_t)( - HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer, - ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength); - -/* On UWP/Windows Store, these definitions aren't there for some reason */ -# ifndef SIO_BSP_HANDLE_POLL -# define SIO_BSP_HANDLE_POLL 0x4800001D -# endif - -# ifndef SIO_BASE_HANDLE -# define SIO_BASE_HANDLE 0x48000022 -# endif - -# ifndef HANDLE_FLAG_INHERIT -# define HANDLE_FLAG_INHERIT 0x00000001 -# endif - -#endif /* _WIN32 */ - -#endif /* __ARES_EVENT_WIN32_H */ diff --git a/deps/cares/src/lib/ares_expand_name.c b/deps/cares/src/lib/ares_expand_name.c deleted file mode 100644 index 280490b86a3310..00000000000000 --- a/deps/cares/src/lib/ares_expand_name.c +++ /dev/null @@ -1,118 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998, 2011 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#ifdef HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif - -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_private.h" /* for the memdebug */ - -ares_status_t ares__expand_name_validated(const unsigned char *encoded, - const unsigned char *abuf, - size_t alen, char **s, size_t *enclen, - ares_bool_t is_hostname) -{ - ares_status_t status; - ares__buf_t *buf = NULL; - size_t start_len; - - if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) { - return ARES_EBADNAME; /* EFORMERR would be better */ - } - - if (encoded < abuf || encoded >= abuf + alen) { - return ARES_EBADNAME; /* EFORMERR would be better */ - } - - *enclen = 0; - - /* NOTE: we allow 's' to be NULL to skip it */ - if (s) { - *s = NULL; - } - - buf = ares__buf_create_const(abuf, alen); - - if (buf == NULL) { - return ARES_ENOMEM; - } - - status = ares__buf_set_position(buf, (size_t)(encoded - abuf)); - if (status != ARES_SUCCESS) { - goto done; - } - - start_len = ares__buf_len(buf); - status = ares__dns_name_parse(buf, s, is_hostname); - if (status != ARES_SUCCESS) { - goto done; - } - - *enclen = start_len - ares__buf_len(buf); - -done: - ares__buf_destroy(buf); - return status; -} - -int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, - int alen, char **s, long *enclen) -{ - /* Keep public API compatible */ - size_t enclen_temp = 0; - ares_status_t status; - - if (alen < 0) { - return ARES_EBADRESP; - } - - status = ares__expand_name_validated(encoded, abuf, (size_t)alen, s, - &enclen_temp, ARES_FALSE); - *enclen = (long)enclen_temp; - return (int)status; -} - -/* Like ares_expand_name_validated but returns EBADRESP in case of invalid - * input. */ -ares_status_t ares__expand_name_for_response(const unsigned char *encoded, - const unsigned char *abuf, - size_t alen, char **s, - size_t *enclen, - ares_bool_t is_hostname) -{ - ares_status_t status = - ares__expand_name_validated(encoded, abuf, alen, s, enclen, is_hostname); - if (status == ARES_EBADNAME) { - status = ARES_EBADRESP; - } - return status; -} diff --git a/deps/cares/src/lib/ares_fds.c b/deps/cares/src/lib/ares_fds.c deleted file mode 100644 index e726d4f012879a..00000000000000 --- a/deps/cares/src/lib/ares_fds.c +++ /dev/null @@ -1,83 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -int ares_fds(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) -{ - ares_socket_t nfds; - ares__slist_node_t *snode; - /* Are there any active queries? */ - size_t active_queries; - - if (channel == NULL || read_fds == NULL || write_fds == NULL) { - return 0; - } - - ares__channel_lock(channel); - - active_queries = ares__llist_len(channel->all_queries); - - nfds = 0; - for (snode = ares__slist_node_first(channel->servers); snode != NULL; - snode = ares__slist_node_next(snode)) { - struct server_state *server = ares__slist_node_val(snode); - ares__llist_node_t *node; - - for (node = ares__llist_node_first(server->connections); node != NULL; - node = ares__llist_node_next(node)) { - const struct server_connection *conn = ares__llist_node_val(node); - - if (!active_queries && !conn->is_tcp) { - continue; - } - - /* Silence coverity, shouldn't be possible */ - if (conn->fd == ARES_SOCKET_BAD) { - continue; - } - - /* Always wait on read */ - FD_SET(conn->fd, read_fds); - - if (conn->fd >= nfds) { - nfds = conn->fd + 1; - } - - /* TCP only wait on write if we have buffered data */ - if (conn->is_tcp && ares__buf_len(server->tcp_send)) { - FD_SET(conn->fd, write_fds); - } - } - } - - ares__channel_unlock(channel); - return (int)nfds; -} diff --git a/deps/cares/src/lib/ares_free_hostent.c b/deps/cares/src/lib/ares_free_hostent.c index a088c1b15cdf8d..dfcbdf4910b665 100644 --- a/deps/cares/src/lib/ares_free_hostent.c +++ b/deps/cares/src/lib/ares_free_hostent.c @@ -24,16 +24,12 @@ * * SPDX-License-Identifier: MIT */ - -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETDB_H # include <netdb.h> #endif -#include "ares.h" -#include "ares_private.h" /* for memdebug */ - void ares_free_hostent(struct hostent *host) { char **p; @@ -48,9 +44,10 @@ void ares_free_hostent(struct hostent *host) } ares_free(host->h_aliases); if (host->h_addr_list) { - ares_free( - host->h_addr_list[0]); /* no matter if there is one or many entries, - there is only one malloc for all of them */ + size_t i; + for (i=0; host->h_addr_list[i] != NULL; i++) { + ares_free(host->h_addr_list[i]); + } ares_free(host->h_addr_list); } ares_free(host); diff --git a/deps/cares/src/lib/ares_free_string.c b/deps/cares/src/lib/ares_free_string.c index 39773067bd2d85..048ad5d2ae242e 100644 --- a/deps/cares/src/lib/ares_free_string.c +++ b/deps/cares/src/lib/ares_free_string.c @@ -25,9 +25,6 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" - -#include "ares.h" #include "ares_private.h" void ares_free_string(void *str) diff --git a/deps/cares/src/lib/ares_freeaddrinfo.c b/deps/cares/src/lib/ares_freeaddrinfo.c index 45d931a3f86f8e..c996df9104a18a 100644 --- a/deps/cares/src/lib/ares_freeaddrinfo.c +++ b/deps/cares/src/lib/ares_freeaddrinfo.c @@ -25,16 +25,13 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETDB_H # include <netdb.h> #endif -#include "ares.h" -#include "ares_private.h" - -void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *head) +void ares_freeaddrinfo_cnames(struct ares_addrinfo_cname *head) { struct ares_addrinfo_cname *current; while (head) { @@ -46,7 +43,7 @@ void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *head) } } -void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *head) +void ares_freeaddrinfo_nodes(struct ares_addrinfo_node *head) { struct ares_addrinfo_node *current; while (head) { @@ -62,8 +59,8 @@ void ares_freeaddrinfo(struct ares_addrinfo *ai) if (ai == NULL) { return; } - ares__freeaddrinfo_cnames(ai->cnames); - ares__freeaddrinfo_nodes(ai->nodes); + ares_freeaddrinfo_cnames(ai->cnames); + ares_freeaddrinfo_nodes(ai->nodes); ares_free(ai->name); ares_free(ai); diff --git a/deps/cares/src/lib/ares_getaddrinfo.c b/deps/cares/src/lib/ares_getaddrinfo.c index cfc889c70a84e2..6009de36a3d02d 100644 --- a/deps/cares/src/lib/ares_getaddrinfo.c +++ b/deps/cares/src/lib/ares_getaddrinfo.c @@ -26,7 +26,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_GETSERVBYNAME_R # if !defined(GETSERVBYNAME_R_ARGS) || (GETSERVBYNAME_R_ARGS < 4) || \ @@ -56,17 +56,8 @@ # include <limits.h> #endif -#include "ares.h" -#include "ares_private.h" #include "ares_dns.h" -#ifdef WATT32 -# undef WIN32 -#endif -#ifdef WIN32 -# include "ares_platform.h" -#endif - struct host_query { ares_channel_t *channel; char *name; @@ -106,13 +97,13 @@ static const struct ares_addrinfo_hints default_hints = { static ares_bool_t next_dns_lookup(struct host_query *hquery); struct ares_addrinfo_cname * - ares__append_addrinfo_cname(struct ares_addrinfo_cname **head) + ares_append_addrinfo_cname(struct ares_addrinfo_cname **head) { struct ares_addrinfo_cname *tail = ares_malloc_zero(sizeof(*tail)); struct ares_addrinfo_cname *last = *head; if (tail == NULL) { - return NULL; + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ } if (!last) { @@ -128,8 +119,8 @@ struct ares_addrinfo_cname * return tail; } -void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, - struct ares_addrinfo_cname *tail) +void ares_addrinfo_cat_cnames(struct ares_addrinfo_cname **head, + struct ares_addrinfo_cname *tail) { struct ares_addrinfo_cname *last = *head; if (!last) { @@ -146,13 +137,13 @@ void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, /* Allocate new addrinfo and append to the tail. */ struct ares_addrinfo_node * - ares__append_addrinfo_node(struct ares_addrinfo_node **head) + ares_append_addrinfo_node(struct ares_addrinfo_node **head) { struct ares_addrinfo_node *tail = ares_malloc_zero(sizeof(*tail)); struct ares_addrinfo_node *last = *head; if (tail == NULL) { - return NULL; + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ } if (!last) { @@ -168,8 +159,8 @@ struct ares_addrinfo_node * return tail; } -void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, - struct ares_addrinfo_node *tail) +void ares_addrinfo_cat_nodes(struct ares_addrinfo_node **head, + struct ares_addrinfo_node *tail) { struct ares_addrinfo_node *last = *head; if (!last) { @@ -257,7 +248,7 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, ares_bool_t valid = ARES_TRUE; const char *p; for (p = name; *p; p++) { - if (!ISDIGIT(*p) && *p != '.') { + if (!ares_isdigit(*p) && *p != '.') { valid = ARES_FALSE; break; } else if (*p == '.') { @@ -277,8 +268,8 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, if (result) { status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes); if (status != ARES_SUCCESS) { - callback(arg, (int)status, 0, NULL); - return ARES_TRUE; + callback(arg, (int)status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_TRUE; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -291,8 +282,8 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, if (result) { status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes); if (status != ARES_SUCCESS) { - callback(arg, (int)status, 0, NULL); - return ARES_TRUE; + callback(arg, (int)status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_TRUE; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -302,11 +293,13 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, } if (hints->ai_flags & ARES_AI_CANONNAME) { - cname = ares__append_addrinfo_cname(&ai->cnames); + cname = ares_append_addrinfo_cname(&ai->cnames); if (!cname) { + /* LCOV_EXCL_START: OutOfMemory */ ares_freeaddrinfo(ai); callback(arg, ARES_ENOMEM, 0, NULL); return ARES_TRUE; + /* LCOV_EXCL_STOP */ } /* Duplicate the name, to avoid a constness violation. */ @@ -330,7 +323,7 @@ static void hquery_free(struct host_query *hquery, ares_bool_t cleanup_ai) if (cleanup_ai) { ares_freeaddrinfo(hquery->ai); } - ares__strsplit_free(hquery->names, hquery->names_cnt); + ares_strsplit_free(hquery->names, hquery->names_cnt); ares_free(hquery->name); ares_free(hquery->lookups); ares_free(hquery); @@ -344,7 +337,7 @@ static void end_hquery(struct host_query *hquery, ares_status_t status) if (status == ARES_SUCCESS) { if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes) { sentinel.ai_next = hquery->ai->nodes; - ares__sortaddrinfo(hquery->channel, &sentinel); + ares_sortaddrinfo(hquery->channel, &sentinel); hquery->ai->nodes = sentinel.ai_next; } next = hquery->ai->nodes; @@ -364,17 +357,17 @@ static void end_hquery(struct host_query *hquery, ares_status_t status) hquery_free(hquery, ARES_FALSE); } -ares_bool_t ares__is_localhost(const char *name) +ares_bool_t ares_is_localhost(const char *name) { /* RFC6761 6.3 says : The domain "localhost." and any names falling within * ".localhost." */ size_t len; if (name == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } - if (strcmp(name, "localhost") == 0) { + if (ares_strcaseeq(name, "localhost")) { return ARES_TRUE; } @@ -383,7 +376,8 @@ ares_bool_t ares__is_localhost(const char *name) return ARES_FALSE; } - if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0) { + if (ares_strcaseeq(name + (len - 10 /* strlen(".localhost") */), + ".localhost")) { return ARES_TRUE; } @@ -396,11 +390,11 @@ static ares_status_t file_lookup(struct host_query *hquery) ares_status_t status; /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(hquery->name)) { + if (ares_is_onion_domain(hquery->name)) { return ARES_ENOTFOUND; } - status = ares__hosts_search_host( + status = ares_hosts_search_host( hquery->channel, (hquery->hints.ai_flags & ARES_AI_ENVHOSTS) ? ARES_TRUE : ARES_FALSE, hquery->name, &entry); @@ -409,13 +403,13 @@ static ares_status_t file_lookup(struct host_query *hquery) goto done; } - status = ares__hosts_entry_to_addrinfo( + status = ares_hosts_entry_to_addrinfo( entry, hquery->name, hquery->hints.ai_family, hquery->port, (hquery->hints.ai_flags & ARES_AI_CANONNAME) ? ARES_TRUE : ARES_FALSE, hquery->ai); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } @@ -424,11 +418,15 @@ static ares_status_t file_lookup(struct host_query *hquery) * SHOULD recognize localhost names as special and SHOULD always return the * IP loopback address for address queries". * We will also ignore ALL errors when trying to resolve localhost, such - * as permissions errors reading /etc/hosts or a malformed /etc/hosts */ - if (status != ARES_SUCCESS && status != ARES_ENOMEM && - ares__is_localhost(hquery->name)) { - return ares__addrinfo_localhost(hquery->name, hquery->port, &hquery->hints, - hquery->ai); + * as permissions errors reading /etc/hosts or a malformed /etc/hosts. + * + * Also, just because the query itself returned success from /etc/hosts + * lookup doesn't mean it returned everything it needed to for all requested + * address families. As long as we're not on a critical out of memory + * condition pass it through to fill in any other address classes. */ + if (status != ARES_ENOMEM && ares_is_localhost(hquery->name)) { + return ares_addrinfo_localhost(hquery->name, hquery->port, &hquery->hints, + hquery->ai); } return status; @@ -442,7 +440,7 @@ static void next_lookup(struct host_query *hquery, ares_status_t status) * queries for localhost names to their configured caching DNS * server(s)." * Otherwise, DNS lookup. */ - if (!ares__is_localhost(hquery->name) && next_dns_lookup(hquery)) { + if (!ares_is_localhost(hquery->name) && next_dns_lookup(hquery)) { break; } @@ -472,14 +470,14 @@ static void terminate_retries(const struct host_query *hquery, unsigned short term_qid = (qid == hquery->qid_a) ? hquery->qid_aaaa : hquery->qid_a; const ares_channel_t *channel = hquery->channel; - struct query *query = NULL; + ares_query_t *query = NULL; /* No other outstanding queries, nothing to do */ if (!hquery->remaining) { return; } - query = ares__htable_szvp_get_direct(channel->queries_by_qid, term_qid); + query = ares_htable_szvp_get_direct(channel->queries_by_qid, term_qid); if (query == NULL) { return; } @@ -487,6 +485,18 @@ static void terminate_retries(const struct host_query *hquery, query->no_retries = ARES_TRUE; } +static ares_bool_t ai_has_ipv4(struct ares_addrinfo *ai) +{ + struct ares_addrinfo_node *node; + + for (node = ai->nodes; node != NULL; node = node->ai_next) { + if (node->ai_family == AF_INET) { + return ARES_TRUE; + } + } + return ARES_FALSE; +} + static void host_callback(void *arg, ares_status_t status, size_t timeouts, const ares_dns_record_t *dnsrec) { @@ -497,12 +507,32 @@ static void host_callback(void *arg, ares_status_t status, size_t timeouts, if (status == ARES_SUCCESS) { if (dnsrec == NULL) { - addinfostatus = ARES_EBADRESP; + addinfostatus = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ } else { addinfostatus = - ares__parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai); + ares_parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai); } - if (addinfostatus == ARES_SUCCESS) { + + /* We sent out ipv4 and ipv6 requests simultaneously. If we got a + * successful ipv4 response, we want to go ahead and tell the ipv6 request + * that if it fails or times out to not try again since we have the data + * we need. + * + * Our initial implementation of this would terminate retries if we got any + * successful response (ipv4 _or_ ipv6). But we did get some user-reported + * issues with this that had bad system configs and odd behavior: + * https://github.com/alpinelinux/docker-alpine/issues/366 + * + * Essentially the ipv6 query succeeded but the ipv4 query failed or timed + * out, and so we only returned the ipv6 address, but the host couldn't + * use ipv6. If we continued to allow ipv4 retries it would have found a + * server that worked and returned both address classes (this is clearly + * unexpected behavior). + * + * At some point down the road if ipv6 actually becomes required and + * reliable we can drop this ipv4 check. + */ + if (addinfostatus == ARES_SUCCESS && ai_has_ipv4(hquery->ai)) { terminate_retries(hquery, ares_dns_record_get_id(dnsrec)); } } @@ -531,6 +561,12 @@ static void host_callback(void *arg, ares_status_t status, size_t timeouts, hquery->nodata_cnt++; } next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status); + } else if ((status == ARES_ESERVFAIL || status == ARES_EREFUSED) && + ares_name_label_cnt(hquery->names[hquery->next_name_idx - 1]) == + 1) { + /* Issue #852, systemd-resolved may return SERVFAIL or REFUSED on a + * single label domain name. */ + next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status); } else { end_hquery(hquery, status); } @@ -539,6 +575,23 @@ static void host_callback(void *arg, ares_status_t status, size_t timeouts, /* at this point we keep on waiting for the next query to finish */ } +static ares_bool_t numeric_service_to_port(const char *service, + unsigned short *port) +{ + char *end; + unsigned long val; + + errno = 0; + val = strtoul(service, &end, 10); + + if (errno == 0 && *end == '\0' && val <= 65535) { + *port = (unsigned short)val; + return ARES_TRUE; + } + + return ARES_FALSE; +} + static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, const char *service, const struct ares_addrinfo_hints *hints, @@ -563,32 +616,24 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, return; } - if (ares__is_onion_domain(name)) { + if (ares_is_onion_domain(name)) { callback(arg, ARES_ENOTFOUND, 0, NULL); return; } if (service) { if (hints->ai_flags & ARES_AI_NUMERICSERV) { - unsigned long val; - errno = 0; - val = strtoul(service, NULL, 0); - if ((val == 0 && errno != 0) || val > 65535) { + if (!numeric_service_to_port(service, &port)) { callback(arg, ARES_ESERVICE, 0, NULL); return; } - port = (unsigned short)val; } else { port = lookup_service(service, 0); if (!port) { - unsigned long val; - errno = 0; - val = strtoul(service, NULL, 0); - if ((val == 0 && errno != 0) || val > 65535) { + if (!numeric_service_to_port(service, &port)) { callback(arg, ARES_ESERVICE, 0, NULL); return; } - port = (unsigned short)val; } } } @@ -626,7 +671,7 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, } status = - ares__search_name_list(channel, name, &hquery->names, &hquery->names_cnt); + ares_search_name_list(channel, name, &hquery->names, &hquery->names_cnt); if (status != ARES_SUCCESS) { hquery_free(hquery, ARES_TRUE); callback(arg, (int)status, 0, NULL); @@ -655,9 +700,9 @@ void ares_getaddrinfo(ares_channel_t *channel, const char *name, if (channel == NULL) { return; } - ares__channel_lock(channel); + ares_channel_lock(channel); ares_getaddrinfo_int(channel, name, service, hints, callback, arg); - ares__channel_unlock(channel); + ares_channel_unlock(channel); } static ares_bool_t next_dns_lookup(struct host_query *hquery) @@ -675,20 +720,20 @@ static ares_bool_t next_dns_lookup(struct host_query *hquery) switch (hquery->hints.ai_family) { case AF_INET: hquery->remaining += 1; - ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, + ares_query_nolock(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, host_callback, hquery, &hquery->qid_a); break; case AF_INET6: hquery->remaining += 1; - ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, + ares_query_nolock(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_AAAA, host_callback, hquery, &hquery->qid_aaaa); break; case AF_UNSPEC: hquery->remaining += 2; - ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, + ares_query_nolock(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A, host_callback, hquery, &hquery->qid_a); - ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, + ares_query_nolock(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_AAAA, host_callback, hquery, &hquery->qid_aaaa); break; diff --git a/deps/cares/src/lib/ares_getenv.c b/deps/cares/src/lib/ares_getenv.c index 08601a61e54076..4f471673b9d3dd 100644 --- a/deps/cares/src/lib/ares_getenv.c +++ b/deps/cares/src/lib/ares_getenv.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #include "ares_getenv.h" #ifndef HAVE_GETENV diff --git a/deps/cares/src/lib/ares_getenv.h b/deps/cares/src/lib/ares_getenv.h index d8bd3a2195b417..490097fc8d35bc 100644 --- a/deps/cares/src/lib/ares_getenv.h +++ b/deps/cares/src/lib/ares_getenv.h @@ -27,8 +27,6 @@ #ifndef HEADER_CARES_GETENV_H #define HEADER_CARES_GETENV_H -#include "ares_setup.h" - #ifndef HAVE_GETENV extern char *ares_getenv(const char *name); #endif diff --git a/deps/cares/src/lib/ares_gethostbyaddr.c b/deps/cares/src/lib/ares_gethostbyaddr.c index 453673260dcee5..69c509ab11b977 100644 --- a/deps/cares/src/lib/ares_gethostbyaddr.c +++ b/deps/cares/src/lib/ares_gethostbyaddr.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -38,15 +38,7 @@ #endif #include "ares_nameser.h" - -#include "ares.h" #include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" - -#ifdef WATT32 -# undef WIN32 -#endif struct addr_query { /* Arguments passed to ares_gethostbyaddr() */ @@ -68,9 +60,9 @@ static ares_status_t file_lookup(ares_channel_t *channel, const struct ares_addr *addr, struct hostent **host); -static void ares_gethostbyaddr_int(ares_channel_t *channel, const void *addr, - int addrlen, int family, - ares_host_callback callback, void *arg) +void ares_gethostbyaddr_nolock(ares_channel_t *channel, const void *addr, + int addrlen, int family, + ares_host_callback callback, void *arg) { struct addr_query *aquery; @@ -92,9 +84,11 @@ static void ares_gethostbyaddr_int(ares_channel_t *channel, const void *addr, } aquery->lookups = ares_strdup(channel->lookups); if (aquery->lookups == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ ares_free(aquery); callback(arg, ARES_ENOMEM, 0, NULL); return; + /* LCOV_EXCL_STOP */ } aquery->channel = channel; if (family == AF_INET) { @@ -117,16 +111,16 @@ void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, int addrlen, if (channel == NULL) { return; } - ares__channel_lock(channel); - ares_gethostbyaddr_int(channel, addr, addrlen, family, callback, arg); - ares__channel_unlock(channel); + ares_channel_lock(channel); + ares_gethostbyaddr_nolock(channel, addr, addrlen, family, callback, arg); + ares_channel_unlock(channel); } static void next_lookup(struct addr_query *aquery) { const char *p; ares_status_t status; - struct hostent *host; + struct hostent *host = NULL; char *name; for (p = aquery->remaining_lookups; *p; p++) { @@ -134,11 +128,12 @@ static void next_lookup(struct addr_query *aquery) case 'b': name = ares_dns_addr_to_ptr(&aquery->addr); if (name == NULL) { - end_aquery(aquery, ARES_ENOMEM, NULL); - return; + end_aquery(aquery, ARES_ENOMEM, + NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return; /* LCOV_EXCL_LINE: OutOfMemory */ } aquery->remaining_lookups = p + 1; - ares_query_dnsrec(aquery->channel, name, ARES_CLASS_IN, + ares_query_nolock(aquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_PTR, addr_callback, aquery, NULL); ares_free(name); return; @@ -220,14 +215,14 @@ static ares_status_t file_lookup(ares_channel_t *channel, return ARES_ENOTFOUND; } - status = ares__hosts_search_ipaddr(channel, ARES_FALSE, ipaddr, &entry); + status = ares_hosts_search_ipaddr(channel, ARES_FALSE, ipaddr, &entry); if (status != ARES_SUCCESS) { return status; } - status = ares__hosts_entry_to_hostent(entry, addr->family, host); + status = ares_hosts_entry_to_hostent(entry, addr->family, host); if (status != ARES_SUCCESS) { - return status; + return status; /* LCOV_EXCL_LINE: OutOfMemory */ } return ARES_SUCCESS; diff --git a/deps/cares/src/lib/ares_gethostbyname.c b/deps/cares/src/lib/ares_gethostbyname.c index 299c35b4169c3d..d451b4685110ec 100644 --- a/deps/cares/src/lib/ares_gethostbyname.c +++ b/deps/cares/src/lib/ares_gethostbyname.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -43,10 +43,7 @@ # include <strings.h> #endif -#include "ares.h" #include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" static void sort_addresses(const struct hostent *host, const struct apattern *sortlist, size_t nsort); @@ -70,7 +67,7 @@ static void ares_gethostbyname_callback(void *arg, int status, int timeouts, struct host_query *ghbn_arg = arg; if (status == ARES_SUCCESS) { - status = (int)ares__addrinfo2hostent(result, AF_UNSPEC, &hostent); + status = (int)ares_addrinfo2hostent(result, AF_UNSPEC, &hostent); } /* addrinfo2hostent will only return ENODATA if there are no addresses _and_ @@ -102,13 +99,17 @@ static void ares_gethostbyname_callback(void *arg, int status, int timeouts, void ares_gethostbyname(ares_channel_t *channel, const char *name, int family, ares_host_callback callback, void *arg) { - const struct ares_addrinfo_hints hints = { ARES_AI_CANONNAME, family, 0, 0 }; - struct host_query *ghbn_arg; + struct ares_addrinfo_hints hints; + struct host_query *ghbn_arg; if (!callback) { return; } + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = ARES_AI_CANONNAME; + hints.ai_family = family; + ghbn_arg = ares_malloc(sizeof(*ghbn_arg)); if (!ghbn_arg) { callback(arg, ARES_ENOMEM, 0, NULL); @@ -173,7 +174,7 @@ static size_t get_address_index(const struct in_addr *addr, continue; } - if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) { + if (ares_subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) { break; } } @@ -229,15 +230,15 @@ static size_t get6_address_index(const struct ares_in6_addr *addr, continue; } - if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) { + if (ares_subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) { break; } } return i; } -static ares_status_t ares__hostent_localhost(const char *name, int family, - struct hostent **host_out) +static ares_status_t ares_hostent_localhost(const char *name, int family, + struct hostent **host_out) { ares_status_t status; struct ares_addrinfo *ai = NULL; @@ -248,18 +249,18 @@ static ares_status_t ares__hostent_localhost(const char *name, int family, ai = ares_malloc_zero(sizeof(*ai)); if (ai == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__addrinfo_localhost(name, 0, &hints, ai); + status = ares_addrinfo_localhost(name, 0, &hints, ai); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__addrinfo2hostent(ai, family, host_out); + status = ares_addrinfo2hostent(ai, family, host_out); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } done: @@ -286,19 +287,21 @@ static ares_status_t ares_gethostbyname_file_int(ares_channel_t *channel, return ARES_ENOTFOUND; } + *host = NULL; + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) { + if (ares_is_onion_domain(name)) { return ARES_ENOTFOUND; } - status = ares__hosts_search_host(channel, ARES_FALSE, name, &entry); + status = ares_hosts_search_host(channel, ARES_FALSE, name, &entry); if (status != ARES_SUCCESS) { goto done; } - status = ares__hosts_entry_to_hostent(entry, family, host); + status = ares_hosts_entry_to_hostent(entry, family, host); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } done: @@ -306,10 +309,14 @@ static ares_status_t ares_gethostbyname_file_int(ares_channel_t *channel, * SHOULD recognize localhost names as special and SHOULD always return the * IP loopback address for address queries". * We will also ignore ALL errors when trying to resolve localhost, such - * as permissions errors reading /etc/hosts or a malformed /etc/hosts */ - if (status != ARES_SUCCESS && status != ARES_ENOMEM && - ares__is_localhost(name)) { - return ares__hostent_localhost(name, family, host); + * as permissions errors reading /etc/hosts or a malformed /etc/hosts. + * + * Also, just because the query itself returned success from /etc/hosts + * lookup doesn't mean it returned everything it needed to for all requested + * address families. As long as we're not on a critical out of memory + * condition pass it through to fill in any other address classes. */ + if (status != ARES_ENOMEM && ares_is_localhost(name)) { + return ares_hostent_localhost(name, family, host); } return status; @@ -323,8 +330,8 @@ int ares_gethostbyname_file(ares_channel_t *channel, const char *name, return ARES_ENOTFOUND; } - ares__channel_lock(channel); + ares_channel_lock(channel); status = ares_gethostbyname_file_int(channel, name, family, host); - ares__channel_unlock(channel); + ares_channel_unlock(channel); return (int)status; } diff --git a/deps/cares/src/lib/ares_getnameinfo.c b/deps/cares/src/lib/ares_getnameinfo.c index 8889e9eec6fe51..01593545308cc4 100644 --- a/deps/cares/src/lib/ares_getnameinfo.c +++ b/deps/cares/src/lib/ares_getnameinfo.c @@ -23,7 +23,7 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_GETSERVBYPORT_R # if !defined(GETSERVBYPORT_R_ARGS) || (GETSERVBYPORT_R_ARGS < 4) || \ @@ -51,9 +51,7 @@ # include <iphlpapi.h> #endif -#include "ares.h" #include "ares_ipv6.h" -#include "ares_private.h" struct nameinfo_query { ares_nameinfo_callback callback; @@ -81,8 +79,8 @@ static void nameinfo_callback(void *arg, int status, int timeouts, static char *lookup_service(unsigned short port, unsigned int flags, char *buf, size_t buflen); #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID -static void append_scopeid(const struct sockaddr_in6 *addr6, - unsigned int scopeid, char *buf, size_t buflen); +static void append_scopeid(const struct sockaddr_in6 *addr6, unsigned int flags, + char *buf, size_t buflen); #endif static char *ares_striendstr(const char *s1, const char *s2); @@ -98,12 +96,13 @@ static void ares_getnameinfo_int(ares_channel_t *channel, unsigned int flags = (unsigned int)flags_int; /* Validate socket address family and length */ - if ((sa->sa_family == AF_INET) && (salen == sizeof(struct sockaddr_in))) { - addr = CARES_INADDR_CAST(struct sockaddr_in *, sa); + if (sa && sa->sa_family == AF_INET && + salen >= (ares_socklen_t)sizeof(struct sockaddr_in)) { + addr = CARES_INADDR_CAST(const struct sockaddr_in *, sa); port = addr->sin_port; - } else if ((sa->sa_family == AF_INET6) && - (salen == sizeof(struct sockaddr_in6))) { - addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa); + } else if (sa && sa->sa_family == AF_INET6 && + salen >= (ares_socklen_t)sizeof(struct sockaddr_in6)) { + addr6 = CARES_INADDR_CAST(const struct sockaddr_in6 *, sa); port = addr6->sin6_port; } else { callback(arg, ARES_ENOTIMP, 0, NULL, NULL); @@ -142,7 +141,7 @@ static void ares_getnameinfo_int(ares_channel_t *channel, callback(arg, ARES_EBADFLAGS, 0, NULL, NULL); return; } - if (salen == sizeof(struct sockaddr_in6)) { + if (sa->sa_family == AF_INET6) { ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); /* If the system supports scope IDs, use it */ #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID @@ -158,9 +157,8 @@ static void ares_getnameinfo_int(ares_channel_t *channel, } callback(arg, ARES_SUCCESS, 0, ipbuf, service); return; - } - /* This is where a DNS lookup becomes necessary */ - else { + } else { + /* This is where a DNS lookup becomes necessary */ niquery = ares_malloc(sizeof(struct nameinfo_query)); if (!niquery) { callback(arg, ARES_ENOMEM, 0, NULL, NULL); @@ -173,14 +171,15 @@ static void ares_getnameinfo_int(ares_channel_t *channel, if (sa->sa_family == AF_INET) { niquery->family = AF_INET; memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4)); - ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), - AF_INET, nameinfo_callback, niquery); + ares_gethostbyaddr_nolock(channel, &addr->sin_addr, + sizeof(struct in_addr), AF_INET, + nameinfo_callback, niquery); } else { niquery->family = AF_INET6; memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6)); - ares_gethostbyaddr(channel, &addr6->sin6_addr, - sizeof(struct ares_in6_addr), AF_INET6, - nameinfo_callback, niquery); + ares_gethostbyaddr_nolock(channel, &addr6->sin6_addr, + sizeof(struct ares_in6_addr), AF_INET6, + nameinfo_callback, niquery); } } } @@ -194,9 +193,9 @@ void ares_getnameinfo(ares_channel_t *channel, const struct sockaddr *sa, return; } - ares__channel_lock(channel); + ares_channel_lock(channel); ares_getnameinfo_int(channel, sa, salen, flags_int, callback, arg); - ares__channel_unlock(channel); + ares_channel_unlock(channel); } static void nameinfo_callback(void *arg, int status, int timeouts, @@ -411,8 +410,8 @@ static char *ares_striendstr(const char *s1, const char *s2) c1 = c1_begin; c2 = s2; while (c2 < s2 + s2_len) { - lo1 = TOLOWER(*c1); - lo2 = TOLOWER(*c2); + lo1 = ares_tolower((unsigned char)*c1); + lo2 = ares_tolower((unsigned char)*c2); if (lo1 != lo2) { return NULL; } else { @@ -424,7 +423,7 @@ static char *ares_striendstr(const char *s1, const char *s2) return (char *)((size_t)c1_begin); } -ares_bool_t ares__is_onion_domain(const char *name) +ares_bool_t ares_is_onion_domain(const char *name) { if (ares_striendstr(name, ".onion")) { return ARES_TRUE; diff --git a/deps/cares/src/lib/ares_getsock.c b/deps/cares/src/lib/ares_getsock.c deleted file mode 100644 index 0353bad6391e28..00000000000000 --- a/deps/cares/src/lib/ares_getsock.c +++ /dev/null @@ -1,88 +0,0 @@ -/* MIT License - * - * Copyright (c) 2005 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_private.h" - -int ares_getsock(ares_channel_t *channel, ares_socket_t *socks, - int numsocks) /* size of the 'socks' array */ -{ - ares__slist_node_t *snode; - size_t sockindex = 0; - unsigned int bitmap = 0; - unsigned int setbits = 0xffffffff; - - /* Are there any active queries? */ - size_t active_queries; - - if (channel == NULL || numsocks <= 0) { - return 0; - } - - ares__channel_lock(channel); - - active_queries = ares__llist_len(channel->all_queries); - - for (snode = ares__slist_node_first(channel->servers); snode != NULL; - snode = ares__slist_node_next(snode)) { - struct server_state *server = ares__slist_node_val(snode); - ares__llist_node_t *node; - - for (node = ares__llist_node_first(server->connections); node != NULL; - node = ares__llist_node_next(node)) { - const struct server_connection *conn = ares__llist_node_val(node); - - if (sockindex >= (size_t)numsocks || sockindex >= ARES_GETSOCK_MAXNUM) { - break; - } - - /* We only need to register interest in UDP sockets if we have - * outstanding queries. - */ - if (!active_queries && !conn->is_tcp) { - continue; - } - - socks[sockindex] = conn->fd; - - if (active_queries || conn->is_tcp) { - bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); - } - - if (conn->is_tcp && ares__buf_len(server->tcp_send)) { - /* then the tcp socket is also writable! */ - bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); - } - - sockindex++; - } - } - - ares__channel_unlock(channel); - return (int)bitmap; -} diff --git a/deps/cares/src/lib/ares_hosts_file.c b/deps/cares/src/lib/ares_hosts_file.c new file mode 100644 index 00000000000000..c0fb80766a7e9b --- /dev/null +++ b/deps/cares/src/lib/ares_hosts_file.c @@ -0,0 +1,957 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif +#include <time.h> + +#ifdef USE_WINSOCK +# define DATABASEPATH "DatabasePath" +# define WIN_PATH_HOSTS "\\hosts" +#endif + +/* HOSTS FILE PROCESSING OVERVIEW + * ============================== + * The hosts file on the system contains static entries to be processed locally + * rather than querying the nameserver. Each row is an IP address followed by + * a list of space delimited hostnames that match the ip address. This is used + * for both forward and reverse lookups. + * + * We are caching the entire parsed hosts file for performance reasons. Some + * files may be quite sizable and as per Issue #458 can approach 1/2MB in size, + * and the parse overhead on a rapid succession of queries can be quite large. + * The entries are stored in forwards and backwards hashtables so we can get + * O(1) performance on lookup. The file is cached until the file modification + * timestamp changes. + * + * The hosts file processing is quite unique. It has to merge all related hosts + * and ips into a single entry due to file formatting requirements. For + * instance take the below: + * + * 127.0.0.1 localhost.localdomain localhost + * ::1 localhost.localdomain localhost + * 192.168.1.1 host.example.com host + * 192.168.1.5 host.example.com host + * 2620:1234::1 host.example.com host6.example.com host6 host + * + * This will yield 2 entries. + * 1) ips: 127.0.0.1,::1 + * hosts: localhost.localdomain,localhost + * 2) ips: 192.168.1.1,192.168.1.5,2620:1234::1 + * hosts: host.example.com,host,host6.example.com,host6 + * + * It could be argued that if searching for 192.168.1.1 that the 'host6' + * hostnames should not be returned, but this implementation will return them + * since they are related. It is unlikely this will matter in the real world. + */ + +struct ares_hosts_file { + time_t ts; + /*! cache the filename so we know if the filename changes it automatically + * invalidates the cache */ + char *filename; + /*! iphash is the owner of the 'entry' object as there is only ever a single + * match to the object. */ + ares_htable_strvp_t *iphash; + /*! hosthash does not own the entry so won't free on destruction */ + ares_htable_strvp_t *hosthash; +}; + +struct ares_hosts_entry { + size_t refcnt; /*! If the entry is stored multiple times in the + * ip address hash, we have to reference count it */ + ares_llist_t *ips; + ares_llist_t *hosts; +}; + +const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr, + size_t *out_len) +{ + const void *ptr = NULL; + size_t ptr_len = 0; + + if (ipaddr == NULL || addr == NULL || out_len == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *out_len = 0; + + if (addr->family == AF_INET && + ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { + ptr = &addr->addr.addr4; + ptr_len = sizeof(addr->addr.addr4); + } else if (addr->family == AF_INET6 && + ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { + ptr = &addr->addr.addr6; + ptr_len = sizeof(addr->addr.addr6); + } else if (addr->family == AF_UNSPEC) { + if (ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) { + addr->family = AF_INET; + ptr = &addr->addr.addr4; + ptr_len = sizeof(addr->addr.addr4); + } else if (ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) { + addr->family = AF_INET6; + ptr = &addr->addr.addr6; + ptr_len = sizeof(addr->addr.addr6); + } + } + + *out_len = ptr_len; + return ptr; +} + +static ares_bool_t ares_normalize_ipaddr(const char *ipaddr, char *out, + size_t out_len) +{ + struct ares_addr data; + const void *addr; + size_t addr_len = 0; + + memset(&data, 0, sizeof(data)); + data.family = AF_UNSPEC; + + addr = ares_dns_pton(ipaddr, &data, &addr_len); + if (addr == NULL) { + return ARES_FALSE; + } + + if (!ares_inet_ntop(data.family, addr, out, (ares_socklen_t)out_len)) { + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + return ARES_TRUE; +} + +static void ares_hosts_entry_destroy(ares_hosts_entry_t *entry) +{ + if (entry == NULL) { + return; + } + + /* Honor reference counting */ + if (entry->refcnt != 0) { + entry->refcnt--; + } + + if (entry->refcnt > 0) { + return; + } + + ares_llist_destroy(entry->hosts); + ares_llist_destroy(entry->ips); + ares_free(entry); +} + +static void ares_hosts_entry_destroy_cb(void *entry) +{ + ares_hosts_entry_destroy(entry); +} + +void ares_hosts_file_destroy(ares_hosts_file_t *hf) +{ + if (hf == NULL) { + return; + } + + ares_free(hf->filename); + ares_htable_strvp_destroy(hf->hosthash); + ares_htable_strvp_destroy(hf->iphash); + ares_free(hf); +} + +static ares_hosts_file_t *ares_hosts_file_create(const char *filename) +{ + ares_hosts_file_t *hf = ares_malloc_zero(sizeof(*hf)); + if (hf == NULL) { + goto fail; + } + + hf->ts = time(NULL); + + hf->filename = ares_strdup(filename); + if (hf->filename == NULL) { + goto fail; + } + + hf->iphash = ares_htable_strvp_create(ares_hosts_entry_destroy_cb); + if (hf->iphash == NULL) { + goto fail; + } + + hf->hosthash = ares_htable_strvp_create(NULL); + if (hf->hosthash == NULL) { + goto fail; + } + + return hf; + +fail: + ares_hosts_file_destroy(hf); + return NULL; +} + +typedef enum { + ARES_MATCH_NONE = 0, + ARES_MATCH_IPADDR = 1, + ARES_MATCH_HOST = 2 +} ares_hosts_file_match_t; + +static ares_status_t ares_hosts_file_merge_entry( + const ares_hosts_file_t *hf, ares_hosts_entry_t *existing, + ares_hosts_entry_t *entry, ares_hosts_file_match_t matchtype) +{ + ares_llist_node_t *node; + + /* If we matched on IP address, we know there can only be 1, so there's no + * reason to do anything */ + if (matchtype != ARES_MATCH_IPADDR) { + while ((node = ares_llist_node_first(entry->ips)) != NULL) { + const char *ipaddr = ares_llist_node_val(node); + + if (ares_htable_strvp_get_direct(hf->iphash, ipaddr) != NULL) { + ares_llist_node_destroy(node); + continue; + } + + ares_llist_node_mvparent_last(node, existing->ips); + } + } + + + while ((node = ares_llist_node_first(entry->hosts)) != NULL) { + const char *hostname = ares_llist_node_val(node); + + if (ares_htable_strvp_get_direct(hf->hosthash, hostname) != NULL) { + ares_llist_node_destroy(node); + continue; + } + + ares_llist_node_mvparent_last(node, existing->hosts); + } + + ares_hosts_entry_destroy(entry); + return ARES_SUCCESS; +} + +static ares_hosts_file_match_t + ares_hosts_file_match(const ares_hosts_file_t *hf, ares_hosts_entry_t *entry, + ares_hosts_entry_t **match) +{ + ares_llist_node_t *node; + *match = NULL; + + for (node = ares_llist_node_first(entry->ips); node != NULL; + node = ares_llist_node_next(node)) { + const char *ipaddr = ares_llist_node_val(node); + *match = ares_htable_strvp_get_direct(hf->iphash, ipaddr); + if (*match != NULL) { + return ARES_MATCH_IPADDR; + } + } + + for (node = ares_llist_node_first(entry->hosts); node != NULL; + node = ares_llist_node_next(node)) { + const char *host = ares_llist_node_val(node); + *match = ares_htable_strvp_get_direct(hf->hosthash, host); + if (*match != NULL) { + return ARES_MATCH_HOST; + } + } + + return ARES_MATCH_NONE; +} + +/*! entry is invalidated upon calling this function, always, even on error */ +static ares_status_t ares_hosts_file_add(ares_hosts_file_t *hosts, + ares_hosts_entry_t *entry) +{ + ares_hosts_entry_t *match = NULL; + ares_status_t status = ARES_SUCCESS; + ares_llist_node_t *node; + ares_hosts_file_match_t matchtype; + size_t num_hostnames; + + /* Record the number of hostnames in this entry file. If we merge into an + * existing record, these will be *appended* to the entry, so we'll count + * backwards when adding to the hosts hashtable */ + num_hostnames = ares_llist_len(entry->hosts); + + matchtype = ares_hosts_file_match(hosts, entry, &match); + + if (matchtype != ARES_MATCH_NONE) { + status = ares_hosts_file_merge_entry(hosts, match, entry, matchtype); + if (status != ARES_SUCCESS) { + ares_hosts_entry_destroy(entry); /* LCOV_EXCL_LINE: DefensiveCoding */ + return status; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + /* entry was invalidated above by merging */ + entry = match; + } + + if (matchtype != ARES_MATCH_IPADDR) { + const char *ipaddr = ares_llist_last_val(entry->ips); + + if (!ares_htable_strvp_get(hosts->iphash, ipaddr, NULL)) { + if (!ares_htable_strvp_insert(hosts->iphash, ipaddr, entry)) { + ares_hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + entry->refcnt++; + } + } + + /* Go backwards, on a merge, hostnames are appended. Breakout once we've + * consumed all the hosts that we appended */ + for (node = ares_llist_node_last(entry->hosts); node != NULL; + node = ares_llist_node_prev(node)) { + const char *val = ares_llist_node_val(node); + + if (num_hostnames == 0) { + break; + } + + num_hostnames--; + + /* first hostname match wins. If we detect a duplicate hostname for another + * ip it will automatically be added to the same entry */ + if (ares_htable_strvp_get(hosts->hosthash, val, NULL)) { + continue; + } + + if (!ares_htable_strvp_insert(hosts->hosthash, val, entry)) { + return ARES_ENOMEM; + } + } + + return ARES_SUCCESS; +} + +static ares_bool_t ares_hosts_entry_isdup(ares_hosts_entry_t *entry, + const char *host) +{ + ares_llist_node_t *node; + + for (node = ares_llist_node_first(entry->ips); node != NULL; + node = ares_llist_node_next(node)) { + const char *myhost = ares_llist_node_val(node); + if (ares_strcaseeq(myhost, host)) { + return ARES_TRUE; + } + } + + return ARES_FALSE; +} + +static ares_status_t ares_parse_hosts_hostnames(ares_buf_t *buf, + ares_hosts_entry_t *entry) +{ + entry->hosts = ares_llist_create(ares_free); + if (entry->hosts == NULL) { + return ARES_ENOMEM; + } + + /* Parse hostnames and aliases */ + while (ares_buf_len(buf)) { + char hostname[256]; + char *temp; + ares_status_t status; + unsigned char comment = '#'; + + ares_buf_consume_whitespace(buf, ARES_FALSE); + + if (ares_buf_len(buf) == 0) { + break; + } + + /* See if it is a comment, if so stop processing */ + if (ares_buf_begins_with(buf, &comment, 1)) { + break; + } + + ares_buf_tag(buf); + + /* Must be at end of line */ + if (ares_buf_consume_nonwhitespace(buf) == 0) { + break; + } + + status = ares_buf_tag_fetch_string(buf, hostname, sizeof(hostname)); + if (status != ARES_SUCCESS) { + /* Bad entry, just ignore as long as its not the first. If its the first, + * it must be valid */ + if (ares_llist_len(entry->hosts) == 0) { + return ARES_EBADSTR; + } + + continue; + } + + /* Validate it is a valid hostname characterset */ + if (!ares_is_hostname(hostname)) { + continue; + } + + /* Don't add a duplicate to the same entry */ + if (ares_hosts_entry_isdup(entry, hostname)) { + continue; + } + + /* Add to list */ + temp = ares_strdup(hostname); + if (temp == NULL) { + return ARES_ENOMEM; + } + + if (ares_llist_insert_last(entry->hosts, temp) == NULL) { + ares_free(temp); + return ARES_ENOMEM; + } + } + + /* Must have at least 1 entry */ + if (ares_llist_len(entry->hosts) == 0) { + return ARES_EBADSTR; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_parse_hosts_ipaddr(ares_buf_t *buf, + ares_hosts_entry_t **entry_out) +{ + char addr[INET6_ADDRSTRLEN]; + char *temp; + ares_hosts_entry_t *entry = NULL; + ares_status_t status; + + *entry_out = NULL; + + ares_buf_tag(buf); + ares_buf_consume_nonwhitespace(buf); + status = ares_buf_tag_fetch_string(buf, addr, sizeof(addr)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Validate and normalize the ip address format */ + if (!ares_normalize_ipaddr(addr, addr, sizeof(addr))) { + return ARES_EBADSTR; + } + + entry = ares_malloc_zero(sizeof(*entry)); + if (entry == NULL) { + return ARES_ENOMEM; + } + + entry->ips = ares_llist_create(ares_free); + if (entry->ips == NULL) { + ares_hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + temp = ares_strdup(addr); + if (temp == NULL) { + ares_hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + if (ares_llist_insert_first(entry->ips, temp) == NULL) { + ares_free(temp); + ares_hosts_entry_destroy(entry); + return ARES_ENOMEM; + } + + *entry_out = entry; + + return ARES_SUCCESS; +} + +static ares_status_t ares_parse_hosts(const char *filename, + ares_hosts_file_t **out) +{ + ares_buf_t *buf = NULL; + ares_status_t status = ARES_EBADRESP; + ares_hosts_file_t *hf = NULL; + ares_hosts_entry_t *entry = NULL; + + *out = NULL; + + buf = ares_buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares_buf_load_file(filename, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + hf = ares_hosts_file_create(filename); + if (hf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + while (ares_buf_len(buf)) { + unsigned char comment = '#'; + + /* -- Start of new line here -- */ + + /* Consume any leading whitespace */ + ares_buf_consume_whitespace(buf, ARES_FALSE); + + if (ares_buf_len(buf) == 0) { + break; + } + + /* See if it is a comment, if so, consume remaining line */ + if (ares_buf_begins_with(buf, &comment, 1)) { + ares_buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Pull off ip address */ + status = ares_parse_hosts_ipaddr(buf, &entry); + if (status == ARES_ENOMEM) { + goto done; + } + if (status != ARES_SUCCESS) { + /* Bad line, consume and go onto next */ + ares_buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Parse of the hostnames */ + status = ares_parse_hosts_hostnames(buf, entry); + if (status == ARES_ENOMEM) { + goto done; + } else if (status != ARES_SUCCESS) { + /* Bad line, consume and go onto next */ + ares_hosts_entry_destroy(entry); + entry = NULL; + ares_buf_consume_line(buf, ARES_TRUE); + continue; + } + + /* Append the successful entry to the hosts file */ + status = ares_hosts_file_add(hf, entry); + entry = NULL; /* is always invalidated by this function, even on error */ + if (status != ARES_SUCCESS) { + goto done; + } + + /* Go to next line */ + ares_buf_consume_line(buf, ARES_TRUE); + } + + status = ARES_SUCCESS; + +done: + ares_hosts_entry_destroy(entry); + ares_buf_destroy(buf); + if (status != ARES_SUCCESS) { + ares_hosts_file_destroy(hf); + } else { + *out = hf; + } + return status; +} + +static ares_bool_t ares_hosts_expired(const char *filename, + const ares_hosts_file_t *hf) +{ + time_t mod_ts = 0; + +#ifdef HAVE_STAT + struct stat st; + if (stat(filename, &st) == 0) { + mod_ts = st.st_mtime; + } +#elif defined(_WIN32) + struct _stat st; + if (_stat(filename, &st) == 0) { + mod_ts = st.st_mtime; + } +#else + (void)filename; +#endif + + if (hf == NULL) { + return ARES_TRUE; + } + + /* Expire every 60s if we can't get a time */ + if (mod_ts == 0) { + mod_ts = + time(NULL) - 60; /* LCOV_EXCL_LINE: only on systems without stat() */ + } + + /* If filenames are different, its expired */ + if (!ares_strcaseeq(hf->filename, filename)) { + return ARES_TRUE; + } + + if (hf->ts <= mod_ts) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static ares_status_t ares_hosts_path(const ares_channel_t *channel, + ares_bool_t use_env, char **path) +{ + char *path_hosts = NULL; + + *path = NULL; + + if (channel->hosts_path) { + path_hosts = ares_strdup(channel->hosts_path); + if (!path_hosts) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if (use_env) { + if (path_hosts) { + ares_free(path_hosts); + } + + path_hosts = ares_strdup(getenv("CARES_HOSTS")); + if (!path_hosts) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if (!path_hosts) { +#if defined(USE_WINSOCK) + char PATH_HOSTS[MAX_PATH] = ""; + char tmp[MAX_PATH]; + HKEY hkeyHosts; + DWORD dwLength = sizeof(tmp); + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, + &hkeyHosts) != ERROR_SUCCESS) { + return ARES_ENOTFOUND; + } + RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, + &dwLength); + ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); + RegCloseKey(hkeyHosts); + strcat(PATH_HOSTS, WIN_PATH_HOSTS); +#elif defined(WATT32) + const char *PATH_HOSTS = _w32_GetHostsFile(); + + if (!PATH_HOSTS) { + return ARES_ENOTFOUND; + } +#endif + path_hosts = ares_strdup(PATH_HOSTS); + if (!path_hosts) { + return ARES_ENOMEM; + } + } + + *path = path_hosts; + return ARES_SUCCESS; +} + +static ares_status_t ares_hosts_update(ares_channel_t *channel, + ares_bool_t use_env) +{ + ares_status_t status; + char *filename = NULL; + + status = ares_hosts_path(channel, use_env, &filename); + if (status != ARES_SUCCESS) { + return status; + } + + if (!ares_hosts_expired(filename, channel->hf)) { + ares_free(filename); + return ARES_SUCCESS; + } + + ares_hosts_file_destroy(channel->hf); + channel->hf = NULL; + + status = ares_parse_hosts(filename, &channel->hf); + ares_free(filename); + return status; +} + +ares_status_t ares_hosts_search_ipaddr(ares_channel_t *channel, + ares_bool_t use_env, const char *ipaddr, + const ares_hosts_entry_t **entry) +{ + ares_status_t status; + char addr[INET6_ADDRSTRLEN]; + + *entry = NULL; + + status = ares_hosts_update(channel, use_env); + if (status != ARES_SUCCESS) { + return status; + } + + if (channel->hf == NULL) { + return ARES_ENOTFOUND; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (!ares_normalize_ipaddr(ipaddr, addr, sizeof(addr))) { + return ARES_EBADNAME; + } + + *entry = ares_htable_strvp_get_direct(channel->hf->iphash, addr); + if (*entry == NULL) { + return ARES_ENOTFOUND; + } + + return ARES_SUCCESS; +} + +ares_status_t ares_hosts_search_host(ares_channel_t *channel, + ares_bool_t use_env, const char *host, + const ares_hosts_entry_t **entry) +{ + ares_status_t status; + + *entry = NULL; + + status = ares_hosts_update(channel, use_env); + if (status != ARES_SUCCESS) { + return status; + } + + if (channel->hf == NULL) { + return ARES_ENOTFOUND; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *entry = ares_htable_strvp_get_direct(channel->hf->hosthash, host); + if (*entry == NULL) { + return ARES_ENOTFOUND; + } + + return ARES_SUCCESS; +} + +static ares_status_t + ares_hosts_ai_append_cnames(const ares_hosts_entry_t *entry, + struct ares_addrinfo_cname **cnames_out) +{ + struct ares_addrinfo_cname *cname = NULL; + struct ares_addrinfo_cname *cnames = NULL; + const char *primaryhost; + ares_llist_node_t *node; + ares_status_t status; + size_t cnt = 0; + + node = ares_llist_node_first(entry->hosts); + primaryhost = ares_llist_node_val(node); + /* Skip to next node to start with aliases */ + node = ares_llist_node_next(node); + + while (node != NULL) { + const char *host = ares_llist_node_val(node); + + /* Cap at 100 entries. , some people use + * https://github.com/StevenBlack/hosts and we don't need 200k+ aliases */ + cnt++; + if (cnt > 100) { + break; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + cname = ares_append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + cname->alias = ares_strdup(host); + if (cname->alias == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + cname->name = ares_strdup(primaryhost); + if (cname->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + node = ares_llist_node_next(node); + } + + /* No entries, add only primary */ + if (cnames == NULL) { + cname = ares_append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + cname->name = ares_strdup(primaryhost); + if (cname->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + status = ARES_SUCCESS; + +done: + if (status != ARES_SUCCESS) { + ares_freeaddrinfo_cnames(cnames); /* LCOV_EXCL_LINE: DefensiveCoding */ + return status; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *cnames_out = cnames; + return ARES_SUCCESS; +} + +ares_status_t ares_hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, + const char *name, int family, + unsigned short port, + ares_bool_t want_cnames, + struct ares_addrinfo *ai) +{ + ares_status_t status = ARES_ENOTFOUND; + struct ares_addrinfo_cname *cnames = NULL; + struct ares_addrinfo_node *ainodes = NULL; + ares_llist_node_t *node; + + switch (family) { + case AF_INET: + case AF_INET6: + case AF_UNSPEC: + break; + default: /* LCOV_EXCL_LINE: DefensiveCoding */ + return ARES_EBADFAMILY; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (name != NULL) { + ares_free(ai->name); + ai->name = ares_strdup(name); + if (ai->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + for (node = ares_llist_node_first(entry->ips); node != NULL; + node = ares_llist_node_next(node)) { + struct ares_addr addr; + const void *ptr = NULL; + size_t ptr_len = 0; + const char *ipaddr = ares_llist_node_val(node); + + memset(&addr, 0, sizeof(addr)); + addr.family = family; + ptr = ares_dns_pton(ipaddr, &addr, &ptr_len); + + if (ptr == NULL) { + continue; + } + + status = ares_append_ai_node(addr.family, port, 0, ptr, &ainodes); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + } + + /* Might be ARES_ENOTFOUND here if no ips matched requested address family */ + if (status != ARES_SUCCESS) { + goto done; + } + + if (want_cnames) { + status = ares_hosts_ai_append_cnames(entry, &cnames); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + } + + status = ARES_SUCCESS; + +done: + if (status != ARES_SUCCESS) { + /* LCOV_EXCL_START: defensive coding */ + ares_freeaddrinfo_cnames(cnames); + ares_freeaddrinfo_nodes(ainodes); + ares_free(ai->name); + ai->name = NULL; + return status; + /* LCOV_EXCL_STOP */ + } + ares_addrinfo_cat_cnames(&ai->cnames, cnames); + ares_addrinfo_cat_nodes(&ai->nodes, ainodes); + + return status; +} + +ares_status_t ares_hosts_entry_to_hostent(const ares_hosts_entry_t *entry, + int family, struct hostent **hostent) +{ + ares_status_t status; + struct ares_addrinfo *ai = ares_malloc_zero(sizeof(*ai)); + + *hostent = NULL; + + if (ai == NULL) { + return ARES_ENOMEM; + } + + status = ares_hosts_entry_to_addrinfo(entry, NULL, family, 0, ARES_TRUE, ai); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_addrinfo2hostent(ai, family, hostent); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_freeaddrinfo(ai); + if (status != ARES_SUCCESS) { + ares_free_hostent(*hostent); + *hostent = NULL; + } + + return status; +} diff --git a/deps/cares/src/lib/ares_inet_net_pton.h b/deps/cares/src/lib/ares_inet_net_pton.h index 0a52855bd8c966..e3ed83a3cb1166 100644 --- a/deps/cares/src/lib/ares_inet_net_pton.h +++ b/deps/cares/src/lib/ares_inet_net_pton.h @@ -26,10 +26,6 @@ #ifndef HEADER_CARES_INET_NET_PTON_H #define HEADER_CARES_INET_NET_PTON_H -#ifdef HAVE_INET_NET_PTON -# define ares_inet_net_pton(w, x, y, z) inet_net_pton(w, x, y, z) -#else int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); -#endif #endif /* HEADER_CARES_INET_NET_PTON_H */ diff --git a/deps/cares/src/lib/ares_init.c b/deps/cares/src/lib/ares_init.c index 28a509ea48a5af..dc094c4df6eb69 100644 --- a/deps/cares/src/lib/ares_init.c +++ b/deps/cares/src/lib/ares_init.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> @@ -61,15 +61,8 @@ # include <iphlpapi.h> #endif -#include "ares.h" #include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" - -#ifdef WATT32 -# undef WIN32 /* Redefined in MingW/MSVC headers */ -#endif - +#include "event/ares_event.h" int ares_init(ares_channel_t **channelptr) { @@ -78,20 +71,20 @@ int ares_init(ares_channel_t **channelptr) static int ares_query_timeout_cmp_cb(const void *arg1, const void *arg2) { - const struct query *q1 = arg1; - const struct query *q2 = arg2; + const ares_query_t *q1 = arg1; + const ares_query_t *q2 = arg2; - if (q1->timeout.tv_sec > q2->timeout.tv_sec) { + if (q1->timeout.sec > q2->timeout.sec) { return 1; } - if (q1->timeout.tv_sec < q2->timeout.tv_sec) { + if (q1->timeout.sec < q2->timeout.sec) { return -1; } - if (q1->timeout.tv_usec > q2->timeout.tv_usec) { + if (q1->timeout.usec > q2->timeout.usec) { return 1; } - if (q1->timeout.tv_usec < q2->timeout.tv_usec) { + if (q1->timeout.usec < q2->timeout.usec) { return -1; } @@ -100,8 +93,8 @@ static int ares_query_timeout_cmp_cb(const void *arg1, const void *arg2) static int server_sort_cb(const void *data1, const void *data2) { - const struct server_state *s1 = data1; - const struct server_state *s2 = data2; + const ares_server_t *s1 = data1; + const ares_server_t *s2 = data2; if (s1->consec_failures < s2->consec_failures) { return -1; @@ -121,9 +114,9 @@ static int server_sort_cb(const void *data1, const void *data2) static void server_destroy_cb(void *data) { if (data == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__destroy_server(data); + ares_destroy_server(data); } static ares_status_t init_by_defaults(ares_channel_t *channel) @@ -134,7 +127,7 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) const char *dot; #endif struct ares_addr addr; - ares__llist_t *sconfig = NULL; + ares_llist_t *sconfig = NULL; /* Enable EDNS by default */ if (!(channel->optmask & ARES_OPT_FLAGS)) { @@ -152,7 +145,7 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) channel->tries = DEFAULT_TRIES; } - if (ares__slist_len(channel->servers) == 0) { + if (ares_slist_len(channel->servers) == 0) { /* Add a default local named server to the channel unless configured not * to (in which case return an error). */ @@ -164,28 +157,19 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) addr.family = AF_INET; addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK); - rc = ares__sconfig_append(&sconfig, &addr, 0, 0, NULL); + rc = ares_sconfig_append(channel, &sconfig, &addr, 0, 0, NULL); if (rc != ARES_SUCCESS) { - goto error; + goto error; /* LCOV_EXCL_LINE: OutOfMemory */ } - rc = ares__servers_update(channel, sconfig, ARES_FALSE); - ares__llist_destroy(sconfig); + rc = ares_servers_update(channel, sconfig, ARES_FALSE); + ares_llist_destroy(sconfig); if (rc != ARES_SUCCESS) { goto error; } } -#if defined(USE_WINSOCK) -# define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT) -#elif defined(ENAMETOOLONG) -# define toolong(x) \ - (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || (SOCKERRNO == EINVAL)) -#else -# define toolong(x) (x == -1) && (SOCKERRNO == EINVAL) -#endif - if (channel->ndomains == 0) { /* Derive a default domain search list from the kernel hostname, * or set it to empty if the hostname isn't helpful. @@ -193,52 +177,33 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) #ifndef HAVE_GETHOSTNAME channel->ndomains = 0; /* default to none */ #else - GETHOSTNAME_TYPE_ARG2 lenv = 64; - size_t len = 64; - int res; + size_t len = 256; channel->ndomains = 0; /* default to none */ hostname = ares_malloc(len); if (!hostname) { - rc = ARES_ENOMEM; - goto error; + rc = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto error; /* LCOV_EXCL_LINE: OutOfMemory */ } - do { - res = gethostname(hostname, lenv); - - if (toolong(res)) { - char *p; - len *= 2; - lenv *= 2; - p = ares_realloc(hostname, len); - if (!p) { - rc = ARES_ENOMEM; - goto error; - } - hostname = p; - continue; - } else if (res) { - /* Lets not treat a gethostname failure as critical, since we - * are ok if gethostname doesn't even exist */ - *hostname = '\0'; - break; - } - - } while (res != 0); + if (gethostname(hostname, (GETHOSTNAME_TYPE_ARG2)len) != 0) { + /* Lets not treat a gethostname failure as critical, since we + * are ok if gethostname doesn't even exist */ + *hostname = '\0'; + } dot = strchr(hostname, '.'); if (dot) { /* a dot was found */ channel->domains = ares_malloc(sizeof(char *)); if (!channel->domains) { - rc = ARES_ENOMEM; - goto error; + rc = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto error; /* LCOV_EXCL_LINE: OutOfMemory */ } channel->domains[0] = ares_strdup(dot + 1); if (!channel->domains[0]) { - rc = ARES_ENOMEM; - goto error; + rc = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto error; /* LCOV_EXCL_LINE: OutOfMemory */ } channel->ndomains = 1; } @@ -252,10 +217,16 @@ static ares_status_t init_by_defaults(ares_channel_t *channel) if (!channel->lookups) { channel->lookups = ares_strdup("fb"); if (!channel->lookups) { - rc = ARES_ENOMEM; + rc = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } } + /* Set default fields for server failover behavior */ + if (!(channel->optmask & ARES_OPT_SERVER_FAILOVER)) { + channel->server_retry_chance = DEFAULT_SERVER_RETRY_CHANCE; + channel->server_retry_delay = DEFAULT_SERVER_RETRY_DELAY; + } + error: if (hostname) { ares_free(hostname); @@ -280,16 +251,19 @@ int ares_init_options(ares_channel_t **channelptr, return ARES_ENOMEM; } + /* We are in a good state */ + channel->sys_up = ARES_TRUE; + /* One option where zero is valid, so set default value here */ channel->ndots = 1; - status = ares__channel_threading_init(channel); + status = ares_channel_threading_init(channel); if (status != ARES_SUCCESS) { goto done; } /* Generate random key */ - channel->rand_state = ares__init_rand_state(); + channel->rand_state = ares_init_rand_state(); if (channel->rand_state == NULL) { status = ARES_ENOMEM; DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n", @@ -297,35 +271,37 @@ int ares_init_options(ares_channel_t **channelptr, goto done; } + ares_set_socket_functions_def(channel); + /* Initialize Server List */ channel->servers = - ares__slist_create(channel->rand_state, server_sort_cb, server_destroy_cb); + ares_slist_create(channel->rand_state, server_sort_cb, server_destroy_cb); if (channel->servers == NULL) { status = ARES_ENOMEM; goto done; } /* Initialize our lists of queries */ - channel->all_queries = ares__llist_create(NULL); + channel->all_queries = ares_llist_create(NULL); if (channel->all_queries == NULL) { status = ARES_ENOMEM; goto done; } - channel->queries_by_qid = ares__htable_szvp_create(NULL); + channel->queries_by_qid = ares_htable_szvp_create(NULL); if (channel->queries_by_qid == NULL) { status = ARES_ENOMEM; goto done; } channel->queries_by_timeout = - ares__slist_create(channel->rand_state, ares_query_timeout_cmp_cb, NULL); + ares_slist_create(channel->rand_state, ares_query_timeout_cmp_cb, NULL); if (channel->queries_by_timeout == NULL) { status = ARES_ENOMEM; goto done; } - channel->connnode_by_socket = ares__htable_asvp_create(NULL); + channel->connnode_by_socket = ares_htable_asvp_create(NULL); if (channel->connnode_by_socket == NULL) { status = ARES_ENOMEM; goto done; @@ -335,7 +311,7 @@ int ares_init_options(ares_channel_t **channelptr, * precedence to lowest. */ - status = ares__init_by_options(channel, options, optmask); + status = ares_init_by_options(channel, options, optmask); if (status != ARES_SUCCESS) { DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n", ares_strerror(status))); @@ -344,16 +320,17 @@ int ares_init_options(ares_channel_t **channelptr, goto done; } - if (channel->qcache_max_ttl > 0) { - status = ares__qcache_create(channel->rand_state, channel->qcache_max_ttl, - &channel->qcache); - if (status != ARES_SUCCESS) { - goto done; - } + /* Go ahead and let it initialize the query cache even if the ttl is 0 and + * completely unused. This reduces the number of different code paths that + * might be followed even if there is a minor performance hit. */ + status = ares_qcache_create(channel->rand_state, channel->qcache_max_ttl, + &channel->qcache); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } if (status == ARES_SUCCESS) { - status = ares__init_by_sysconfig(channel); + status = ares_init_by_sysconfig(channel); if (status != ARES_SUCCESS) { DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n", ares_strerror(status))); @@ -373,10 +350,22 @@ int ares_init_options(ares_channel_t **channelptr, /* Initialize the event thread */ if (channel->optmask & ARES_OPT_EVENT_THREAD) { + ares_event_thread_t *e = NULL; + status = ares_event_thread_init(channel); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: UntestablePath */ } + + /* Initialize monitor for configuration changes. In some rare cases, + * ARES_ENOTIMP may occur (OpenWatcom), ignore this. */ + e = channel->sock_state_cb_data; + status = ares_event_configchg_init(&e->configchg, e); + if (status != ARES_SUCCESS && status != ARES_ENOTIMP) { + DEBUGF(fprintf(stderr, "Error: ares_event_configchg_init failed: %s\n", + ares_strerror(status))); + } + status = ARES_SUCCESS; } done: @@ -389,35 +378,81 @@ int ares_init_options(ares_channel_t **channelptr, return ARES_SUCCESS; } +static void *ares_reinit_thread(void *arg) +{ + ares_channel_t *channel = arg; + ares_status_t status; + + /* ares_init_by_sysconfig() will lock when applying the config, but not + * when retrieving. */ + status = ares_init_by_sysconfig(channel); + if (status != ARES_SUCCESS) { + DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n", + ares_strerror(status))); + } + + ares_channel_lock(channel); + + /* Flush cached queries on reinit */ + if (status == ARES_SUCCESS && channel->qcache) { + ares_qcache_flush(channel->qcache); + } + + channel->reinit_pending = ARES_FALSE; + ares_channel_unlock(channel); + + return NULL; +} + ares_status_t ares_reinit(ares_channel_t *channel) { - ares_status_t status; + ares_status_t status = ARES_SUCCESS; if (channel == NULL) { return ARES_EFORMERR; } - ares__channel_lock(channel); + ares_channel_lock(channel); - status = ares__init_by_sysconfig(channel); - if (status != ARES_SUCCESS) { - DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n", - ares_strerror(status))); + /* If a reinit is already in process, lets not do it again. Or if we are + * shutting down, skip. */ + if (!channel->sys_up || channel->reinit_pending) { + ares_channel_unlock(channel); + return ARES_SUCCESS; } + channel->reinit_pending = ARES_TRUE; + ares_channel_unlock(channel); - /* Flush cached queries on reinit */ - if (channel->qcache) { - ares__qcache_flush(channel->qcache); - } + if (ares_threadsafety()) { + /* clean up the prior reinit process's thread. We know the thread isn't + * running since reinit_pending was false */ + if (channel->reinit_thread != NULL) { + void *rv; + ares_thread_join(channel->reinit_thread, &rv); + channel->reinit_thread = NULL; + } - ares__channel_unlock(channel); + /* Spawn a new thread */ + status = + ares_thread_create(&channel->reinit_thread, ares_reinit_thread, channel); + if (status != ARES_SUCCESS) { + /* LCOV_EXCL_START: UntestablePath */ + ares_channel_lock(channel); + channel->reinit_pending = ARES_FALSE; + ares_channel_unlock(channel); + /* LCOV_EXCL_STOP */ + } + } else { + /* Threading support not available, call directly */ + ares_reinit_thread(channel); + } return status; } /* ares_dup() duplicates a channel handle with all its options and returns a new channel handle */ -int ares_dup(ares_channel_t **dest, ares_channel_t *src) +int ares_dup(ares_channel_t **dest, const ares_channel_t *src) { struct ares_options opts; ares_status_t rc; @@ -429,7 +464,6 @@ int ares_dup(ares_channel_t **dest, ares_channel_t *src) *dest = NULL; /* in case of failure return NULL explicitly */ - ares__channel_lock(src); /* First get the options supported by the old ares_save_options() function, which is most of them */ rc = (ares_status_t)ares_save_options(src, &opts, &optmask); @@ -448,20 +482,29 @@ int ares_dup(ares_channel_t **dest, ares_channel_t *src) goto done; } + ares_channel_lock(src); /* Now clone the options that ares_save_options() doesn't support, but are * user-provided */ - (*dest)->sock_create_cb = src->sock_create_cb; - (*dest)->sock_create_cb_data = src->sock_create_cb_data; - (*dest)->sock_config_cb = src->sock_config_cb; - (*dest)->sock_config_cb_data = src->sock_config_cb_data; - (*dest)->sock_funcs = src->sock_funcs; - (*dest)->sock_func_cb_data = src->sock_func_cb_data; + (*dest)->sock_create_cb = src->sock_create_cb; + (*dest)->sock_create_cb_data = src->sock_create_cb_data; + (*dest)->sock_config_cb = src->sock_config_cb; + (*dest)->sock_config_cb_data = src->sock_config_cb_data; + memcpy(&(*dest)->sock_funcs, &(src->sock_funcs), sizeof((*dest)->sock_funcs)); + (*dest)->sock_func_cb_data = src->sock_func_cb_data; + (*dest)->legacy_sock_funcs = src->legacy_sock_funcs; + (*dest)->legacy_sock_funcs_cb_data = src->legacy_sock_funcs_cb_data; + (*dest)->server_state_cb = src->server_state_cb; + (*dest)->server_state_cb_data = src->server_state_cb_data; + (*dest)->notify_pending_write_cb = src->notify_pending_write_cb; + (*dest)->notify_pending_write_cb_data = src->notify_pending_write_cb_data; + (*dest)->query_enqueue_cb = src->query_enqueue_cb; + (*dest)->query_enqueue_cb_data = src->query_enqueue_cb_data; ares_strcpy((*dest)->local_dev_name, src->local_dev_name, sizeof((*dest)->local_dev_name)); (*dest)->local_ip4 = src->local_ip4; memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6)); - + ares_channel_unlock(src); /* Servers are a bit unique as ares_init_options() only allows ipv4 servers * and not a port per server, but there are other user specified ways, that @@ -476,24 +519,27 @@ int ares_dup(ares_channel_t **dest, ares_channel_t *src) if (optmask & ARES_OPT_SERVERS) { char *csv = ares_get_servers_csv(src); if (csv == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ ares_destroy(*dest); *dest = NULL; rc = ARES_ENOMEM; goto done; + /* LCOV_EXCL_STOP */ } rc = (ares_status_t)ares_set_servers_ports_csv(*dest, csv); ares_free_string(csv); if (rc != ARES_SUCCESS) { + /* LCOV_EXCL_START: OutOfMemory */ ares_destroy(*dest); *dest = NULL; goto done; + /* LCOV_EXCL_STOP */ } } rc = ARES_SUCCESS; done: - ares__channel_unlock(src); return (int)rc; /* everything went fine */ } @@ -502,9 +548,9 @@ void ares_set_local_ip4(ares_channel_t *channel, unsigned int local_ip) if (channel == NULL) { return; } - ares__channel_lock(channel); + ares_channel_lock(channel); channel->local_ip4 = local_ip; - ares__channel_unlock(channel); + ares_channel_unlock(channel); } /* local_ip6 should be 16 bytes in length */ @@ -513,9 +559,9 @@ void ares_set_local_ip6(ares_channel_t *channel, const unsigned char *local_ip6) if (channel == NULL) { return; } - ares__channel_lock(channel); + ares_channel_lock(channel); memcpy(&channel->local_ip6, local_ip6, sizeof(channel->local_ip6)); - ares__channel_unlock(channel); + ares_channel_unlock(channel); } /* local_dev_name should be null terminated. */ @@ -525,11 +571,11 @@ void ares_set_local_dev(ares_channel_t *channel, const char *local_dev_name) return; } - ares__channel_lock(channel); + ares_channel_lock(channel); ares_strcpy(channel->local_dev_name, local_dev_name, sizeof(channel->local_dev_name)); channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0; - ares__channel_unlock(channel); + ares_channel_unlock(channel); } int ares_set_sortlist(ares_channel_t *channel, const char *sortstr) @@ -541,9 +587,9 @@ int ares_set_sortlist(ares_channel_t *channel, const char *sortstr) if (!channel) { return ARES_ENODATA; } - ares__channel_lock(channel); + ares_channel_lock(channel); - status = ares__parse_sortlist(&sortlist, &nsort, sortstr); + status = ares_parse_sortlist(&sortlist, &nsort, sortstr); if (status == ARES_SUCCESS && sortlist) { if (channel->sortlist) { ares_free(channel->sortlist); @@ -554,6 +600,18 @@ int ares_set_sortlist(ares_channel_t *channel, const char *sortstr) /* Save sortlist as if it was passed in as an option */ channel->optmask |= ARES_OPT_SORTLIST; } - ares__channel_unlock(channel); + ares_channel_unlock(channel); return (int)status; } + +void ares_set_query_enqueue_cb(ares_channel_t *channel, + ares_query_enqueue_cb callback, + void *user_data) +{ + if (channel == NULL) { + return; + } + + channel->query_enqueue_cb = callback; + channel->query_enqueue_cb_data = user_data; +} diff --git a/deps/cares/src/lib/ares_ipv6.h b/deps/cares/src/lib/ares_ipv6.h index 28d7851ff3f051..d2007cc29ec4a0 100644 --- a/deps/cares/src/lib/ares_ipv6.h +++ b/deps/cares/src/lib/ares_ipv6.h @@ -31,6 +31,15 @@ # include <netinet6/in6.h> #endif +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include <iphlpapi.h> +# endif +# if defined(HAVE_NETIOAPI_H) +# include <netioapi.h> +# endif +#endif + #ifndef HAVE_PF_INET6 # define PF_INET6 AF_INET6 #endif @@ -81,11 +90,21 @@ struct addrinfo { # define NS_INT16SZ 2 #endif +/* Windows XP Compatibility with later MSVC/Mingw versions */ +#if defined(_WIN32) +# if !defined(IF_MAX_STRING_SIZE) +# define IF_MAX_STRING_SIZE 256 /* =256 in <ifdef.h> */ +# endif +# if !defined(NDIS_IF_MAX_STRING_SIZE) +# define NDIS_IF_MAX_STRING_SIZE IF_MAX_STRING_SIZE /* =256 in <ifdef.h> */ +# endif +#endif + #ifndef IF_NAMESIZE # ifdef IFNAMSIZ # define IF_NAMESIZE IFNAMSIZ # else -# define IF_NAMESIZE 256 +# define IF_NAMESIZE 32 # endif #endif diff --git a/deps/cares/src/lib/ares_library_init.c b/deps/cares/src/lib/ares_library_init.c index 2767f1f93c77e4..2b91692baec6d5 100644 --- a/deps/cares/src/lib/ares_library_init.c +++ b/deps/cares/src/lib/ares_library_init.c @@ -25,9 +25,6 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" - -#include "ares.h" #include "ares_private.h" /* library-private global and unique instance vars */ @@ -55,8 +52,6 @@ static void *default_malloc(size_t size) return malloc(size); } -#if defined(WIN32) -/* We need indirections to handle Windows DLL rules. */ static void *default_realloc(void *p, size_t size) { return realloc(p, size); @@ -66,13 +61,25 @@ static void default_free(void *p) { free(p); } -#else -# define default_realloc realloc -# define default_free free -#endif -void *(*ares_malloc)(size_t size) = default_malloc; -void *(*ares_realloc)(void *ptr, size_t size) = default_realloc; -void (*ares_free)(void *ptr) = default_free; + +static void *(*__ares_malloc)(size_t size) = default_malloc; +static void *(*__ares_realloc)(void *ptr, size_t size) = default_realloc; +static void (*__ares_free)(void *ptr) = default_free; + +void *ares_malloc(size_t size) +{ + return __ares_malloc(size); +} + +void *ares_realloc(void *ptr, size_t size) +{ + return __ares_realloc(ptr, size); +} + +void ares_free(void *ptr) +{ + __ares_free(ptr); +} void *ares_malloc_zero(size_t size) { @@ -118,13 +125,13 @@ int ares_library_init_mem(int flags, void *(*amalloc)(size_t size), void *(*arealloc)(void *ptr, size_t size)) { if (amalloc) { - ares_malloc = amalloc; + __ares_malloc = amalloc; } if (arealloc) { - ares_realloc = arealloc; + __ares_realloc = arealloc; } if (afree) { - ares_free = afree; + __ares_free = afree; } return ares_library_init(flags); } @@ -146,9 +153,9 @@ void ares_library_cleanup(void) #endif ares_init_flags = ARES_LIB_INIT_NONE; - ares_malloc = malloc; - ares_realloc = realloc; - ares_free = free; + __ares_malloc = default_malloc; + __ares_realloc = default_realloc; + __ares_free = default_free; } int ares_library_initialized(void) diff --git a/deps/cares/src/lib/ares_metrics.c b/deps/cares/src/lib/ares_metrics.c new file mode 100644 index 00000000000000..deb3b7febcc48a --- /dev/null +++ b/deps/cares/src/lib/ares_metrics.c @@ -0,0 +1,261 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + + +/* IMPLEMENTATION NOTES + * ==================== + * + * With very little effort we should be able to determine fairly proper timeouts + * we can use based on prior query history. We track in order to be able to + * auto-scale when network conditions change (e.g. maybe there is a provider + * failover and timings change due to that). Apple appears to do this within + * their system resolver in MacOS. Obviously we should have a minimum, maximum, + * and initial value to make sure the algorithm doesn't somehow go off the + * rails. + * + * Values: + * - Minimum Timeout: 250ms (approximate RTT half-way around the globe) + * - Maximum Timeout: 5000ms (Recommended timeout in RFC 1123), can be reduced + * by ARES_OPT_MAXTIMEOUTMS, but otherwise the bound specified by the option + * caps the retry timeout. + * - Initial Timeout: User-specified via configuration or ARES_OPT_TIMEOUTMS + * - Average latency multiplier: 5x (a local DNS server returning a cached value + * will be quicker than if it needs to recurse so we need to account for this) + * - Minimum Count for Average: 3. This is the minimum number of queries we + * need to form an average for the bucket. + * + * Per-server buckets for tracking latency over time (these are ephemeral + * meaning they don't persist once a channel is destroyed). We record both the + * current timespan for the bucket and the immediate preceding timespan in case + * of roll-overs we can still maintain recent metrics for calculations: + * - 1 minute + * - 15 minutes + * - 1 hr + * - 1 day + * - since inception + * + * Each bucket would contain: + * - timestamp (divided by interval) + * - minimum latency + * - maximum latency + * - total time + * - count + * NOTE: average latency is (total time / count), we will calculate this + * dynamically when needed + * + * Basic algorithm for calculating timeout to use would be: + * - Scan from most recent bucket to least recent + * - Check timestamp of bucket, if doesn't match current time, continue to next + * bucket + * - Check count of bucket, if its not at least the "Minimum Count for Average", + * check the previous bucket, otherwise continue to next bucket + * - If we reached the end with no bucket match, use "Initial Timeout" + * - If bucket is selected, take ("total time" / count) as Average latency, + * multiply by "Average Latency Multiplier", bound by "Minimum Timeout" and + * "Maximum Timeout" + * NOTE: The timeout calculated may not be the timeout used. If we are retrying + * the query on the same server another time, then it will use a larger value + * + * On each query reply where the response is legitimate (proper response or + * NXDOMAIN) and not something like a server error: + * - Cycle through each bucket in order + * - Check timestamp of bucket against current timestamp, if out of date + * overwrite previous entry with values, clear current values + * - Compare current minimum and maximum recorded latency against query time and + * adjust if necessary + * - Increment "count" by 1 and "total time" by the query time + * + * Other Notes: + * - This is always-on, the only user-configurable value is the initial + * timeout which will simply re-uses the current option. + * - Minimum and Maximum latencies for a bucket are currently unused but are + * there in case we find a need for them in the future. + */ + +#include "ares_private.h" + +/*! Minimum timeout value. Chosen due to it being approximately RTT half-way + * around the world */ +#define MIN_TIMEOUT_MS 250 + +/*! Multiplier to apply to average latency to come up with an initial timeout */ +#define AVG_TIMEOUT_MULTIPLIER 5 + +/*! Upper timeout bounds, only used if channel->maxtimeout not set */ +#define MAX_TIMEOUT_MS 5000 + +/*! Minimum queries required to form an average */ +#define MIN_COUNT_FOR_AVERAGE 3 + +static time_t ares_metric_timestamp(ares_server_bucket_t bucket, + const ares_timeval_t *now, + ares_bool_t is_previous) +{ + time_t divisor = 1; /* Silence bogus MSVC warning by setting default value */ + + switch (bucket) { + case ARES_METRIC_1MINUTE: + divisor = 60; + break; + case ARES_METRIC_15MINUTES: + divisor = 15 * 60; + break; + case ARES_METRIC_1HOUR: + divisor = 60 * 60; + break; + case ARES_METRIC_1DAY: + divisor = 24 * 60 * 60; + break; + case ARES_METRIC_INCEPTION: + return is_previous ? 0 : 1; + case ARES_METRIC_COUNT: + return 0; /* Invalid! */ + } + + if (is_previous) { + if (divisor >= now->sec) { + return 0; + } + return (time_t)((now->sec - divisor) / divisor); + } + + return (time_t)(now->sec / divisor); +} + +void ares_metrics_record(const ares_query_t *query, ares_server_t *server, + ares_status_t status, const ares_dns_record_t *dnsrec) +{ + ares_timeval_t now; + ares_timeval_t tvdiff; + unsigned int query_ms; + ares_dns_rcode_t rcode; + ares_server_bucket_t i; + + if (status != ARES_SUCCESS) { + return; + } + + if (server == NULL) { + return; + } + + ares_tvnow(&now); + + rcode = ares_dns_record_get_rcode(dnsrec); + if (rcode != ARES_RCODE_NOERROR && rcode != ARES_RCODE_NXDOMAIN) { + return; + } + + ares_timeval_diff(&tvdiff, &query->ts, &now); + query_ms = (unsigned int)((tvdiff.sec * 1000) + (tvdiff.usec / 1000)); + if (query_ms == 0) { + query_ms = 1; + } + + /* Place in each bucket */ + for (i = 0; i < ARES_METRIC_COUNT; i++) { + time_t ts = ares_metric_timestamp(i, &now, ARES_FALSE); + + /* Copy metrics to prev and clear */ + if (ts != server->metrics[i].ts) { + server->metrics[i].prev_ts = server->metrics[i].ts; + server->metrics[i].prev_total_ms = server->metrics[i].total_ms; + server->metrics[i].prev_total_count = server->metrics[i].total_count; + server->metrics[i].ts = ts; + server->metrics[i].latency_min_ms = 0; + server->metrics[i].latency_max_ms = 0; + server->metrics[i].total_ms = 0; + server->metrics[i].total_count = 0; + } + + if (server->metrics[i].latency_min_ms == 0 || + server->metrics[i].latency_min_ms > query_ms) { + server->metrics[i].latency_min_ms = query_ms; + } + + if (query_ms > server->metrics[i].latency_max_ms) { + server->metrics[i].latency_max_ms = query_ms; + } + + server->metrics[i].total_count++; + server->metrics[i].total_ms += (ares_uint64_t)query_ms; + } +} + +size_t ares_metrics_server_timeout(const ares_server_t *server, + const ares_timeval_t *now) +{ + const ares_channel_t *channel = server->channel; + ares_server_bucket_t i; + size_t timeout_ms = 0; + size_t max_timeout_ms; + + for (i = 0; i < ARES_METRIC_COUNT; i++) { + time_t ts = ares_metric_timestamp(i, now, ARES_FALSE); + + /* This ts has been invalidated, see if we should use the previous + * time period */ + if (ts != server->metrics[i].ts || + server->metrics[i].total_count < MIN_COUNT_FOR_AVERAGE) { + time_t prev_ts = ares_metric_timestamp(i, now, ARES_TRUE); + if (prev_ts != server->metrics[i].prev_ts || + server->metrics[i].prev_total_count < MIN_COUNT_FOR_AVERAGE) { + /* Move onto next bucket */ + continue; + } + /* Calculate average time for previous bucket */ + timeout_ms = (size_t)(server->metrics[i].prev_total_ms / + server->metrics[i].prev_total_count); + } else { + /* Calculate average time for current bucket*/ + timeout_ms = + (size_t)(server->metrics[i].total_ms / server->metrics[i].total_count); + } + + /* Multiply average by constant to get timeout value */ + timeout_ms *= AVG_TIMEOUT_MULTIPLIER; + break; + } + + /* If we're here, that means its the first query for the server, so we just + * use the initial default timeout */ + if (timeout_ms == 0) { + timeout_ms = channel->timeout; + } + + /* don't go below lower bounds */ + if (timeout_ms < MIN_TIMEOUT_MS) { + timeout_ms = MIN_TIMEOUT_MS; + } + + /* don't go above upper bounds */ + max_timeout_ms = channel->maxtimeout ? channel->maxtimeout : MAX_TIMEOUT_MS; + if (timeout_ms > max_timeout_ms) { + timeout_ms = max_timeout_ms; + } + + return timeout_ms; +} diff --git a/deps/cares/src/lib/ares_options.c b/deps/cares/src/lib/ares_options.c index adc3e062ac437e..3082f332457c22 100644 --- a/deps/cares/src/lib/ares_options.c +++ b/deps/cares/src/lib/ares_options.c @@ -25,16 +25,14 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_ARPA_INET_H # include <arpa/inet.h> #endif -#include "ares.h" #include "ares_data.h" #include "ares_inet_net_pton.h" -#include "ares_private.h" void ares_destroy_options(struct ares_options *options) { @@ -53,12 +51,12 @@ void ares_destroy_options(struct ares_options *options) ares_free(options->hosts_path); } -static struct in_addr *ares_save_opt_servers(ares_channel_t *channel, - int *nservers) +static struct in_addr *ares_save_opt_servers(const ares_channel_t *channel, + int *nservers) { - ares__slist_node_t *snode; - struct in_addr *out = - ares_malloc_zero(ares__slist_len(channel->servers) * sizeof(*out)); + ares_slist_node_t *snode; + struct in_addr *out = + ares_malloc_zero(ares_slist_len(channel->servers) * sizeof(*out)); *nservers = 0; @@ -66,9 +64,9 @@ static struct in_addr *ares_save_opt_servers(ares_channel_t *channel, return NULL; } - for (snode = ares__slist_node_first(channel->servers); snode != NULL; - snode = ares__slist_node_next(snode)) { - const struct server_state *server = ares__slist_node_val(snode); + for (snode = ares_slist_node_first(channel->servers); snode != NULL; + snode = ares_slist_node_next(snode)) { + const ares_server_t *server = ares_slist_node_val(snode); if (server->addr.family != AF_INET) { continue; @@ -82,8 +80,8 @@ static struct in_addr *ares_save_opt_servers(ares_channel_t *channel, } /* Save options from initialized channel */ -int ares_save_options(ares_channel_t *channel, struct ares_options *options, - int *optmask) +int ares_save_options(const ares_channel_t *channel, + struct ares_options *options, int *optmask) { size_t i; @@ -113,7 +111,7 @@ int ares_save_options(ares_channel_t *channel, struct ares_options *options, } /* We convert ARES_OPT_TIMEOUT to ARES_OPT_TIMEOUTMS in - * ares__init_by_options() */ + * ares_init_by_options() */ if (channel->optmask & ARES_OPT_TIMEOUTMS) { options->timeout = (int)channel->timeout; } @@ -229,43 +227,49 @@ int ares_save_options(ares_channel_t *channel, struct ares_options *options, options->evsys = channel->evsys; } + /* Set options for server failover behavior */ + if (channel->optmask & ARES_OPT_SERVER_FAILOVER) { + options->server_failover_opts.retry_chance = channel->server_retry_chance; + options->server_failover_opts.retry_delay = channel->server_retry_delay; + } + *optmask = (int)channel->optmask; return ARES_SUCCESS; } -static ares_status_t ares__init_options_servers(ares_channel_t *channel, - const struct in_addr *servers, - size_t nservers) +static ares_status_t ares_init_options_servers(ares_channel_t *channel, + const struct in_addr *servers, + size_t nservers) { - ares__llist_t *slist = NULL; - ares_status_t status; + ares_llist_t *slist = NULL; + ares_status_t status; - status = ares_in_addr_to_server_config_llist(servers, nservers, &slist); + status = ares_in_addr_to_sconfig_llist(servers, nservers, &slist); if (status != ARES_SUCCESS) { - return status; + return status; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__servers_update(channel, slist, ARES_TRUE); + status = ares_servers_update(channel, slist, ARES_TRUE); - ares__llist_destroy(slist); + ares_llist_destroy(slist); return status; } -ares_status_t ares__init_by_options(ares_channel_t *channel, - const struct ares_options *options, - int optmask) +ares_status_t ares_init_by_options(ares_channel_t *channel, + const struct ares_options *options, + int optmask) { size_t i; if (channel == NULL) { - return ARES_ENODATA; + return ARES_ENODATA; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (options == NULL) { if (optmask != 0) { - return ARES_ENODATA; + return ARES_ENODATA; /* LCOV_EXCL_LINE: DefensiveCoding */ } return ARES_SUCCESS; } @@ -383,13 +387,13 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, channel->domains = ares_malloc_zero((size_t)options->ndomains * sizeof(char *)); if (!channel->domains) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } channel->ndomains = (size_t)options->ndomains; for (i = 0; i < (size_t)options->ndomains; i++) { channel->domains[i] = ares_strdup(options->domains[i]); if (!channel->domains[i]) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -401,7 +405,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, } else { channel->lookups = ares_strdup(options->lookups); if (!channel->lookups) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -412,7 +416,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, channel->sortlist = ares_malloc((size_t)options->nsort * sizeof(struct apattern)); if (!channel->sortlist) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } for (i = 0; i < (size_t)options->nsort; i++) { channel->sortlist[i] = options->sortlist[i]; @@ -426,7 +430,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, } else { channel->resolvconf_path = ares_strdup(options->resolvconf_path); if (channel->resolvconf_path == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -438,7 +442,7 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, } else { channel->hosts_path = ares_strdup(options->hosts_path); if (channel->hosts_path == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } } } @@ -451,13 +455,15 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, } } + /* As of c-ares 1.31.0, the Query Cache is on by default. The only way to + * disable it is to set options->qcache_max_ttl = 0 while specifying the + * ARES_OPT_QUERY_CACHE which will actually disable it completely. */ if (optmask & ARES_OPT_QUERY_CACHE) { /* qcache_max_ttl is unsigned unlike the others */ - if (options->qcache_max_ttl == 0) { - optmask &= ~(ARES_OPT_QUERY_CACHE); - } else { - channel->qcache_max_ttl = options->qcache_max_ttl; - } + channel->qcache_max_ttl = options->qcache_max_ttl; + } else { + optmask |= ARES_OPT_QUERY_CACHE; + channel->qcache_max_ttl = 3600; } /* Initialize the ipv4 servers if provided */ @@ -466,14 +472,20 @@ ares_status_t ares__init_by_options(ares_channel_t *channel, optmask &= ~(ARES_OPT_SERVERS); } else { ares_status_t status; - status = ares__init_options_servers(channel, options->servers, - (size_t)options->nservers); + status = ares_init_options_servers(channel, options->servers, + (size_t)options->nservers); if (status != ARES_SUCCESS) { - return status; + return status; /* LCOV_EXCL_LINE: OutOfMemory */ } } } + /* Set fields for server failover behavior */ + if (optmask & ARES_OPT_SERVER_FAILOVER) { + channel->server_retry_chance = options->server_failover_opts.retry_chance; + channel->server_retry_delay = options->server_failover_opts.retry_delay; + } + channel->optmask = (unsigned int)optmask; return ARES_SUCCESS; diff --git a/deps/cares/src/lib/ares_parse_into_addrinfo.c b/deps/cares/src/lib/ares_parse_into_addrinfo.c new file mode 100644 index 00000000000000..2108f9b8615816 --- /dev/null +++ b/deps/cares/src/lib/ares_parse_into_addrinfo.c @@ -0,0 +1,179 @@ +/* MIT License + * + * Copyright (c) 2019 Andrew Selivanov + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + + +ares_status_t ares_parse_into_addrinfo(const ares_dns_record_t *dnsrec, + ares_bool_t cname_only_is_enodata, + unsigned short port, + struct ares_addrinfo *ai) +{ + ares_status_t status; + size_t i; + size_t ancount; + const char *hostname = NULL; + ares_bool_t got_a = ARES_FALSE; + ares_bool_t got_aaaa = ARES_FALSE; + ares_bool_t got_cname = ARES_FALSE; + struct ares_addrinfo_cname *cnames = NULL; + struct ares_addrinfo_node *nodes = NULL; + + /* Save question hostname */ + status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + if (ancount == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ancount; i++) { + ares_dns_rec_type_t rtype; + const ares_dns_rr_t *rr = + ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i); + + if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { + continue; + } + + rtype = ares_dns_rr_get_type(rr); + + /* Issue #683 + * Old code did this hostname sanity check, however it appears this is + * flawed logic. Other resolvers don't do this sanity check. Leaving + * this code commented out for future reference. + * + * rname = ares_dns_rr_get_name(rr); + * if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) && + * !ares_strcaseeq(rname, hostname)) { + * continue; + * } + */ + + if (rtype == ARES_REC_TYPE_CNAME) { + struct ares_addrinfo_cname *cname; + + got_cname = ARES_TRUE; + /* replace hostname with data from cname + * SA: Seems wrong as it introduces order dependency. */ + hostname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME); + + cname = ares_append_addrinfo_cname(&cnames); + if (cname == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + cname->ttl = (int)ares_dns_rr_get_ttl(rr); + cname->alias = ares_strdup(ares_dns_rr_get_name(rr)); + if (cname->alias == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + cname->name = ares_strdup(hostname); + if (cname->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } else if (rtype == ARES_REC_TYPE_A) { + got_a = ARES_TRUE; + status = + ares_append_ai_node(AF_INET, port, ares_dns_rr_get_ttl(rr), + ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR), &nodes); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } else if (rtype == ARES_REC_TYPE_AAAA) { + got_aaaa = ARES_TRUE; + status = ares_append_ai_node(AF_INET6, port, ares_dns_rr_get_ttl(rr), + ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR), + &nodes); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } else { + continue; + } + } + + if (!got_a && !got_aaaa && + (!got_cname || (got_cname && cname_only_is_enodata))) { + status = ARES_ENODATA; + goto done; + } + + /* save the hostname as ai->name */ + if (ai->name == NULL || !ares_strcaseeq(ai->name, hostname)) { + ares_free(ai->name); + ai->name = ares_strdup(hostname); + if (ai->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if (got_a || got_aaaa) { + ares_addrinfo_cat_nodes(&ai->nodes, nodes); + nodes = NULL; + } + + if (got_cname) { + ares_addrinfo_cat_cnames(&ai->cnames, cnames); + cnames = NULL; + } + +done: + ares_freeaddrinfo_cnames(cnames); + ares_freeaddrinfo_nodes(nodes); + + /* compatibility */ + if (status == ARES_EBADNAME) { + status = ARES_EBADRESP; + } + + return status; +} diff --git a/deps/cares/src/lib/ares_parse_txt_reply.c b/deps/cares/src/lib/ares_parse_txt_reply.c deleted file mode 100644 index 85c3644b8cbf34..00000000000000 --- a/deps/cares/src/lib/ares_parse_txt_reply.c +++ /dev/null @@ -1,137 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023 Brad House - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" -#include "ares_private.h" - -static int ares__parse_txt_reply(const unsigned char *abuf, size_t alen, - ares_bool_t ex, void **txt_out) -{ - ares_status_t status; - struct ares_txt_ext *txt_head = NULL; - struct ares_txt_ext *txt_last = NULL; - struct ares_txt_ext *txt_curr; - ares_dns_record_t *dnsrec = NULL; - size_t i; - - *txt_out = NULL; - - status = ares_dns_parse(abuf, alen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - goto done; - } - - if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { - status = ARES_ENODATA; - goto done; - } - - for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { - const ares_dns_rr_t *rr = - ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); - const unsigned char *ptr; - size_t ptr_len; - - if (rr == NULL) { - /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; - } - - /* XXX: Why Chaos? */ - if ((ares_dns_rr_get_class(rr) != ARES_CLASS_IN && - ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) || - ares_dns_rr_get_type(rr) != ARES_REC_TYPE_TXT) { - continue; - } - - /* Allocate storage for this TXT answer appending it to the list */ - txt_curr = - ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : ARES_DATATYPE_TXT_REPLY); - if (txt_curr == NULL) { - status = ARES_ENOMEM; - goto done; - } - - /* Link in the record */ - if (txt_last) { - txt_last->next = txt_curr; - } else { - txt_head = txt_curr; - } - txt_last = txt_curr; - - /* These days, records are joined, always tag as start */ - if (ex) { - txt_curr->record_start = 1; - } - - ptr = ares_dns_rr_get_bin(rr, ARES_RR_TXT_DATA, &ptr_len); - - txt_curr->txt = ares_malloc(ptr_len + 1); - if (txt_curr->txt == NULL) { - status = ARES_ENOMEM; - goto done; - } - memcpy(txt_curr->txt, ptr, ptr_len); - txt_curr->txt[ptr_len] = 0; - txt_curr->length = ptr_len; - } - -done: - /* clean up on error */ - if (status != ARES_SUCCESS) { - if (txt_head) { - ares_free_data(txt_head); - } - } else { - /* everything looks fine, return the data */ - *txt_out = txt_head; - } - ares_dns_record_destroy(dnsrec); - return (int)status; -} - -int ares_parse_txt_reply(const unsigned char *abuf, int alen, - struct ares_txt_reply **txt_out) -{ - if (alen < 0) { - return ARES_EBADRESP; - } - return ares__parse_txt_reply(abuf, (size_t)alen, ARES_FALSE, - (void **)txt_out); -} - -int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, - struct ares_txt_ext **txt_out) -{ - if (alen < 0) { - return ARES_EBADRESP; - } - return ares__parse_txt_reply(abuf, (size_t)alen, ARES_TRUE, (void **)txt_out); -} diff --git a/deps/cares/src/lib/ares_platform.c b/deps/cares/src/lib/ares_platform.c deleted file mode 100644 index 0727ae001c8432..00000000000000 --- a/deps/cares/src/lib/ares_platform.c +++ /dev/null @@ -1,11050 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) 2004 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" - -#include "ares.h" -#include "ares_platform.h" -#include "ares_private.h" - -#if defined(WIN32) && !defined(MSDOS) - -# define V_PLATFORM_WIN32s 0 -# define V_PLATFORM_WIN32_WINDOWS 1 -# define V_PLATFORM_WIN32_NT 2 -# define V_PLATFORM_WIN32_CE 3 - -win_platform ares__getplatform(void) -{ - OSVERSIONINFOEX OsvEx; - - memset(&OsvEx, 0, sizeof(OsvEx)); - OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); -# ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4996) /* warning C4996: 'GetVersionExW': was \ - declared deprecated */ -# endif - if (!GetVersionEx((void *)&OsvEx)) { - memset(&OsvEx, 0, sizeof(OsvEx)); - OsvEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx((void *)&OsvEx)) { - return WIN_UNKNOWN; - } - } -# ifdef _MSC_VER -# pragma warning(pop) -# endif - - switch (OsvEx.dwPlatformId) { - case V_PLATFORM_WIN32s: - return WIN_3X; - - case V_PLATFORM_WIN32_WINDOWS: - return WIN_9X; - - case V_PLATFORM_WIN32_NT: - return WIN_NT; - - case V_PLATFORM_WIN32_CE: - return WIN_CE; - - default: - return WIN_UNKNOWN; - } -} - -#endif /* WIN32 && ! MSDOS */ - -#if defined(_WIN32_WCE) - -/* IANA Well Known Ports are in range 0-1023 */ -# define USE_IANA_WELL_KNOWN_PORTS 1 - -/* IANA Registered Ports are in range 1024-49151 */ -# define USE_IANA_REGISTERED_PORTS 1 - -struct pvt_servent { - char *s_name; - char **s_aliases; - unsigned short s_port; - char *s_proto; -}; - -/* - * Ref: http://www.iana.org/assignments/port-numbers - */ - -static struct pvt_servent IANAports[] = { -# ifdef USE_IANA_WELL_KNOWN_PORTS - {"tcpmux", { NULL }, 1, "tcp" }, - { "tcpmux", { NULL }, 1, "udp" }, - { "compressnet", { NULL }, 2, "tcp" }, - { "compressnet", { NULL }, 2, "udp" }, - { "compressnet", { NULL }, 3, "tcp" }, - { "compressnet", { NULL }, 3, "udp" }, - { "rje", { NULL }, 5, "tcp" }, - { "rje", { NULL }, 5, "udp" }, - { "echo", { NULL }, 7, "tcp" }, - { "echo", { NULL }, 7, "udp" }, - { "discard", { NULL }, 9, "tcp" }, - { "discard", { NULL }, 9, "udp" }, - { "discard", { NULL }, 9, "sctp"}, - { "discard", { NULL }, 9, "dccp"}, - { "systat", { NULL }, 11, "tcp" }, - { "systat", { NULL }, 11, "udp" }, - { "daytime", { NULL }, 13, "tcp" }, - { "daytime", { NULL }, 13, "udp" }, - { "qotd", { NULL }, 17, "tcp" }, - { "qotd", { NULL }, 17, "udp" }, - { "msp", { NULL }, 18, "tcp" }, - { "msp", { NULL }, 18, "udp" }, - { "chargen", { NULL }, 19, "tcp" }, - { "chargen", { NULL }, 19, "udp" }, - { "ftp-data", { NULL }, 20, "tcp" }, - { "ftp-data", { NULL }, 20, "udp" }, - { "ftp-data", { NULL }, 20, "sctp"}, - { "ftp", { NULL }, 21, "tcp" }, - { "ftp", { NULL }, 21, "udp" }, - { "ftp", { NULL }, 21, "sctp"}, - { "ssh", { NULL }, 22, "tcp" }, - { "ssh", { NULL }, 22, "udp" }, - { "ssh", { NULL }, 22, "sctp"}, - { "telnet", { NULL }, 23, "tcp" }, - { "telnet", { NULL }, 23, "udp" }, - { "smtp", { NULL }, 25, "tcp" }, - { "smtp", { NULL }, 25, "udp" }, - { "nsw-fe", { NULL }, 27, "tcp" }, - { "nsw-fe", { NULL }, 27, "udp" }, - { "msg-icp", { NULL }, 29, "tcp" }, - { "msg-icp", { NULL }, 29, "udp" }, - { "msg-auth", { NULL }, 31, "tcp" }, - { "msg-auth", { NULL }, 31, "udp" }, - { "dsp", { NULL }, 33, "tcp" }, - { "dsp", { NULL }, 33, "udp" }, - { "time", { NULL }, 37, "tcp" }, - { "time", { NULL }, 37, "udp" }, - { "rap", { NULL }, 38, "tcp" }, - { "rap", { NULL }, 38, "udp" }, - { "rlp", { NULL }, 39, "tcp" }, - { "rlp", { NULL }, 39, "udp" }, - { "graphics", { NULL }, 41, "tcp" }, - { "graphics", { NULL }, 41, "udp" }, - { "name", { NULL }, 42, "tcp" }, - { "name", { NULL }, 42, "udp" }, - { "nameserver", { NULL }, 42, "tcp" }, - { "nameserver", { NULL }, 42, "udp" }, - { "nicname", { NULL }, 43, "tcp" }, - { "nicname", { NULL }, 43, "udp" }, - { "mpm-flags", { NULL }, 44, "tcp" }, - { "mpm-flags", { NULL }, 44, "udp" }, - { "mpm", { NULL }, 45, "tcp" }, - { "mpm", { NULL }, 45, "udp" }, - { "mpm-snd", { NULL }, 46, "tcp" }, - { "mpm-snd", { NULL }, 46, "udp" }, - { "ni-ftp", { NULL }, 47, "tcp" }, - { "ni-ftp", { NULL }, 47, "udp" }, - { "auditd", { NULL }, 48, "tcp" }, - { "auditd", { NULL }, 48, "udp" }, - { "tacacs", { NULL }, 49, "tcp" }, - { "tacacs", { NULL }, 49, "udp" }, - { "re-mail-ck", { NULL }, 50, "tcp" }, - { "re-mail-ck", { NULL }, 50, "udp" }, - { "la-maint", { NULL }, 51, "tcp" }, - { "la-maint", { NULL }, 51, "udp" }, - { "xns-time", { NULL }, 52, "tcp" }, - { "xns-time", { NULL }, 52, "udp" }, - { "domain", { NULL }, 53, "tcp" }, - { "domain", { NULL }, 53, "udp" }, - { "xns-ch", { NULL }, 54, "tcp" }, - { "xns-ch", { NULL }, 54, "udp" }, - { "isi-gl", { NULL }, 55, "tcp" }, - { "isi-gl", { NULL }, 55, "udp" }, - { "xns-auth", { NULL }, 56, "tcp" }, - { "xns-auth", { NULL }, 56, "udp" }, - { "xns-mail", { NULL }, 58, "tcp" }, - { "xns-mail", { NULL }, 58, "udp" }, - { "ni-mail", { NULL }, 61, "tcp" }, - { "ni-mail", { NULL }, 61, "udp" }, - { "acas", { NULL }, 62, "tcp" }, - { "acas", { NULL }, 62, "udp" }, - { "whois++", { NULL }, 63, "tcp" }, - { "whois++", { NULL }, 63, "udp" }, - { "covia", { NULL }, 64, "tcp" }, - { "covia", { NULL }, 64, "udp" }, - { "tacacs-ds", { NULL }, 65, "tcp" }, - { "tacacs-ds", { NULL }, 65, "udp" }, - { "sql*net", { NULL }, 66, "tcp" }, - { "sql*net", { NULL }, 66, "udp" }, - { "bootps", { NULL }, 67, "tcp" }, - { "bootps", { NULL }, 67, "udp" }, - { "bootpc", { NULL }, 68, "tcp" }, - { "bootpc", { NULL }, 68, "udp" }, - { "tftp", { NULL }, 69, "tcp" }, - { "tftp", { NULL }, 69, "udp" }, - { "gopher", { NULL }, 70, "tcp" }, - { "gopher", { NULL }, 70, "udp" }, - { "netrjs-1", { NULL }, 71, "tcp" }, - { "netrjs-1", { NULL }, 71, "udp" }, - { "netrjs-2", { NULL }, 72, "tcp" }, - { "netrjs-2", { NULL }, 72, "udp" }, - { "netrjs-3", { NULL }, 73, "tcp" }, - { "netrjs-3", { NULL }, 73, "udp" }, - { "netrjs-4", { NULL }, 74, "tcp" }, - { "netrjs-4", { NULL }, 74, "udp" }, - { "deos", { NULL }, 76, "tcp" }, - { "deos", { NULL }, 76, "udp" }, - { "vettcp", { NULL }, 78, "tcp" }, - { "vettcp", { NULL }, 78, "udp" }, - { "finger", { NULL }, 79, "tcp" }, - { "finger", { NULL }, 79, "udp" }, - { "http", { NULL }, 80, "tcp" }, - { "http", { NULL }, 80, "udp" }, - { "www", { NULL }, 80, "tcp" }, - { "www", { NULL }, 80, "udp" }, - { "www-http", { NULL }, 80, "tcp" }, - { "www-http", { NULL }, 80, "udp" }, - { "http", { NULL }, 80, "sctp"}, - { "xfer", { NULL }, 82, "tcp" }, - { "xfer", { NULL }, 82, "udp" }, - { "mit-ml-dev", { NULL }, 83, "tcp" }, - { "mit-ml-dev", { NULL }, 83, "udp" }, - { "ctf", { NULL }, 84, "tcp" }, - { "ctf", { NULL }, 84, "udp" }, - { "mit-ml-dev", { NULL }, 85, "tcp" }, - { "mit-ml-dev", { NULL }, 85, "udp" }, - { "mfcobol", { NULL }, 86, "tcp" }, - { "mfcobol", { NULL }, 86, "udp" }, - { "kerberos", { NULL }, 88, "tcp" }, - { "kerberos", { NULL }, 88, "udp" }, - { "su-mit-tg", { NULL }, 89, "tcp" }, - { "su-mit-tg", { NULL }, 89, "udp" }, - { "dnsix", { NULL }, 90, "tcp" }, - { "dnsix", { NULL }, 90, "udp" }, - { "mit-dov", { NULL }, 91, "tcp" }, - { "mit-dov", { NULL }, 91, "udp" }, - { "npp", { NULL }, 92, "tcp" }, - { "npp", { NULL }, 92, "udp" }, - { "dcp", { NULL }, 93, "tcp" }, - { "dcp", { NULL }, 93, "udp" }, - { "objcall", { NULL }, 94, "tcp" }, - { "objcall", { NULL }, 94, "udp" }, - { "supdup", { NULL }, 95, "tcp" }, - { "supdup", { NULL }, 95, "udp" }, - { "dixie", { NULL }, 96, "tcp" }, - { "dixie", { NULL }, 96, "udp" }, - { "swift-rvf", { NULL }, 97, "tcp" }, - { "swift-rvf", { NULL }, 97, "udp" }, - { "tacnews", { NULL }, 98, "tcp" }, - { "tacnews", { NULL }, 98, "udp" }, - { "metagram", { NULL }, 99, "tcp" }, - { "metagram", { NULL }, 99, "udp" }, - { "newacct", { NULL }, 100, "tcp" }, - { "hostname", { NULL }, 101, "tcp" }, - { "hostname", { NULL }, 101, "udp" }, - { "iso-tsap", { NULL }, 102, "tcp" }, - { "iso-tsap", { NULL }, 102, "udp" }, - { "gppitnp", { NULL }, 103, "tcp" }, - { "gppitnp", { NULL }, 103, "udp" }, - { "acr-nema", { NULL }, 104, "tcp" }, - { "acr-nema", { NULL }, 104, "udp" }, - { "cso", { NULL }, 105, "tcp" }, - { "cso", { NULL }, 105, "udp" }, - { "csnet-ns", { NULL }, 105, "tcp" }, - { "csnet-ns", { NULL }, 105, "udp" }, - { "3com-tsmux", { NULL }, 106, "tcp" }, - { "3com-tsmux", { NULL }, 106, "udp" }, - { "rtelnet", { NULL }, 107, "tcp" }, - { "rtelnet", { NULL }, 107, "udp" }, - { "snagas", { NULL }, 108, "tcp" }, - { "snagas", { NULL }, 108, "udp" }, - { "pop2", { NULL }, 109, "tcp" }, - { "pop2", { NULL }, 109, "udp" }, - { "pop3", { NULL }, 110, "tcp" }, - { "pop3", { NULL }, 110, "udp" }, - { "sunrpc", { NULL }, 111, "tcp" }, - { "sunrpc", { NULL }, 111, "udp" }, - { "mcidas", { NULL }, 112, "tcp" }, - { "mcidas", { NULL }, 112, "udp" }, - { "ident", { NULL }, 113, "tcp" }, - { "auth", { NULL }, 113, "tcp" }, - { "auth", { NULL }, 113, "udp" }, - { "sftp", { NULL }, 115, "tcp" }, - { "sftp", { NULL }, 115, "udp" }, - { "ansanotify", { NULL }, 116, "tcp" }, - { "ansanotify", { NULL }, 116, "udp" }, - { "uucp-path", { NULL }, 117, "tcp" }, - { "uucp-path", { NULL }, 117, "udp" }, - { "sqlserv", { NULL }, 118, "tcp" }, - { "sqlserv", { NULL }, 118, "udp" }, - { "nntp", { NULL }, 119, "tcp" }, - { "nntp", { NULL }, 119, "udp" }, - { "cfdptkt", { NULL }, 120, "tcp" }, - { "cfdptkt", { NULL }, 120, "udp" }, - { "erpc", { NULL }, 121, "tcp" }, - { "erpc", { NULL }, 121, "udp" }, - { "smakynet", { NULL }, 122, "tcp" }, - { "smakynet", { NULL }, 122, "udp" }, - { "ntp", { NULL }, 123, "tcp" }, - { "ntp", { NULL }, 123, "udp" }, - { "ansatrader", { NULL }, 124, "tcp" }, - { "ansatrader", { NULL }, 124, "udp" }, - { "locus-map", { NULL }, 125, "tcp" }, - { "locus-map", { NULL }, 125, "udp" }, - { "nxedit", { NULL }, 126, "tcp" }, - { "nxedit", { NULL }, 126, "udp" }, - { "locus-con", { NULL }, 127, "tcp" }, - { "locus-con", { NULL }, 127, "udp" }, - { "gss-xlicen", { NULL }, 128, "tcp" }, - { "gss-xlicen", { NULL }, 128, "udp" }, - { "pwdgen", { NULL }, 129, "tcp" }, - { "pwdgen", { NULL }, 129, "udp" }, - { "cisco-fna", { NULL }, 130, "tcp" }, - { "cisco-fna", { NULL }, 130, "udp" }, - { "cisco-tna", { NULL }, 131, "tcp" }, - { "cisco-tna", { NULL }, 131, "udp" }, - { "cisco-sys", { NULL }, 132, "tcp" }, - { "cisco-sys", { NULL }, 132, "udp" }, - { "statsrv", { NULL }, 133, "tcp" }, - { "statsrv", { NULL }, 133, "udp" }, - { "ingres-net", { NULL }, 134, "tcp" }, - { "ingres-net", { NULL }, 134, "udp" }, - { "epmap", { NULL }, 135, "tcp" }, - { "epmap", { NULL }, 135, "udp" }, - { "profile", { NULL }, 136, "tcp" }, - { "profile", { NULL }, 136, "udp" }, - { "netbios-ns", { NULL }, 137, "tcp" }, - { "netbios-ns", { NULL }, 137, "udp" }, - { "netbios-dgm", { NULL }, 138, "tcp" }, - { "netbios-dgm", { NULL }, 138, "udp" }, - { "netbios-ssn", { NULL }, 139, "tcp" }, - { "netbios-ssn", { NULL }, 139, "udp" }, - { "emfis-data", { NULL }, 140, "tcp" }, - { "emfis-data", { NULL }, 140, "udp" }, - { "emfis-cntl", { NULL }, 141, "tcp" }, - { "emfis-cntl", { NULL }, 141, "udp" }, - { "bl-idm", { NULL }, 142, "tcp" }, - { "bl-idm", { NULL }, 142, "udp" }, - { "imap", { NULL }, 143, "tcp" }, - { "imap", { NULL }, 143, "udp" }, - { "uma", { NULL }, 144, "tcp" }, - { "uma", { NULL }, 144, "udp" }, - { "uaac", { NULL }, 145, "tcp" }, - { "uaac", { NULL }, 145, "udp" }, - { "iso-tp0", { NULL }, 146, "tcp" }, - { "iso-tp0", { NULL }, 146, "udp" }, - { "iso-ip", { NULL }, 147, "tcp" }, - { "iso-ip", { NULL }, 147, "udp" }, - { "jargon", { NULL }, 148, "tcp" }, - { "jargon", { NULL }, 148, "udp" }, - { "aed-512", { NULL }, 149, "tcp" }, - { "aed-512", { NULL }, 149, "udp" }, - { "sql-net", { NULL }, 150, "tcp" }, - { "sql-net", { NULL }, 150, "udp" }, - { "hems", { NULL }, 151, "tcp" }, - { "hems", { NULL }, 151, "udp" }, - { "bftp", { NULL }, 152, "tcp" }, - { "bftp", { NULL }, 152, "udp" }, - { "sgmp", { NULL }, 153, "tcp" }, - { "sgmp", { NULL }, 153, "udp" }, - { "netsc-prod", { NULL }, 154, "tcp" }, - { "netsc-prod", { NULL }, 154, "udp" }, - { "netsc-dev", { NULL }, 155, "tcp" }, - { "netsc-dev", { NULL }, 155, "udp" }, - { "sqlsrv", { NULL }, 156, "tcp" }, - { "sqlsrv", { NULL }, 156, "udp" }, - { "knet-cmp", { NULL }, 157, "tcp" }, - { "knet-cmp", { NULL }, 157, "udp" }, - { "pcmail-srv", { NULL }, 158, "tcp" }, - { "pcmail-srv", { NULL }, 158, "udp" }, - { "nss-routing", { NULL }, 159, "tcp" }, - { "nss-routing", { NULL }, 159, "udp" }, - { "sgmp-traps", { NULL }, 160, "tcp" }, - { "sgmp-traps", { NULL }, 160, "udp" }, - { "snmp", { NULL }, 161, "tcp" }, - { "snmp", { NULL }, 161, "udp" }, - { "snmptrap", { NULL }, 162, "tcp" }, - { "snmptrap", { NULL }, 162, "udp" }, - { "cmip-man", { NULL }, 163, "tcp" }, - { "cmip-man", { NULL }, 163, "udp" }, - { "cmip-agent", { NULL }, 164, "tcp" }, - { "cmip-agent", { NULL }, 164, "udp" }, - { "xns-courier", { NULL }, 165, "tcp" }, - { "xns-courier", { NULL }, 165, "udp" }, - { "s-net", { NULL }, 166, "tcp" }, - { "s-net", { NULL }, 166, "udp" }, - { "namp", { NULL }, 167, "tcp" }, - { "namp", { NULL }, 167, "udp" }, - { "rsvd", { NULL }, 168, "tcp" }, - { "rsvd", { NULL }, 168, "udp" }, - { "send", { NULL }, 169, "tcp" }, - { "send", { NULL }, 169, "udp" }, - { "print-srv", { NULL }, 170, "tcp" }, - { "print-srv", { NULL }, 170, "udp" }, - { "multiplex", { NULL }, 171, "tcp" }, - { "multiplex", { NULL }, 171, "udp" }, - { "cl/1", { NULL }, 172, "tcp" }, - { "cl/1", { NULL }, 172, "udp" }, - { "xyplex-mux", { NULL }, 173, "tcp" }, - { "xyplex-mux", { NULL }, 173, "udp" }, - { "mailq", { NULL }, 174, "tcp" }, - { "mailq", { NULL }, 174, "udp" }, - { "vmnet", { NULL }, 175, "tcp" }, - { "vmnet", { NULL }, 175, "udp" }, - { "genrad-mux", { NULL }, 176, "tcp" }, - { "genrad-mux", { NULL }, 176, "udp" }, - { "xdmcp", { NULL }, 177, "tcp" }, - { "xdmcp", { NULL }, 177, "udp" }, - { "nextstep", { NULL }, 178, "tcp" }, - { "nextstep", { NULL }, 178, "udp" }, - { "bgp", { NULL }, 179, "tcp" }, - { "bgp", { NULL }, 179, "udp" }, - { "bgp", { NULL }, 179, "sctp"}, - { "ris", { NULL }, 180, "tcp" }, - { "ris", { NULL }, 180, "udp" }, - { "unify", { NULL }, 181, "tcp" }, - { "unify", { NULL }, 181, "udp" }, - { "audit", { NULL }, 182, "tcp" }, - { "audit", { NULL }, 182, "udp" }, - { "ocbinder", { NULL }, 183, "tcp" }, - { "ocbinder", { NULL }, 183, "udp" }, - { "ocserver", { NULL }, 184, "tcp" }, - { "ocserver", { NULL }, 184, "udp" }, - { "remote-kis", { NULL }, 185, "tcp" }, - { "remote-kis", { NULL }, 185, "udp" }, - { "kis", { NULL }, 186, "tcp" }, - { "kis", { NULL }, 186, "udp" }, - { "aci", { NULL }, 187, "tcp" }, - { "aci", { NULL }, 187, "udp" }, - { "mumps", { NULL }, 188, "tcp" }, - { "mumps", { NULL }, 188, "udp" }, - { "qft", { NULL }, 189, "tcp" }, - { "qft", { NULL }, 189, "udp" }, - { "gacp", { NULL }, 190, "tcp" }, - { "gacp", { NULL }, 190, "udp" }, - { "prospero", { NULL }, 191, "tcp" }, - { "prospero", { NULL }, 191, "udp" }, - { "osu-nms", { NULL }, 192, "tcp" }, - { "osu-nms", { NULL }, 192, "udp" }, - { "srmp", { NULL }, 193, "tcp" }, - { "srmp", { NULL }, 193, "udp" }, - { "irc", { NULL }, 194, "tcp" }, - { "irc", { NULL }, 194, "udp" }, - { "dn6-nlm-aud", { NULL }, 195, "tcp" }, - { "dn6-nlm-aud", { NULL }, 195, "udp" }, - { "dn6-smm-red", { NULL }, 196, "tcp" }, - { "dn6-smm-red", { NULL }, 196, "udp" }, - { "dls", { NULL }, 197, "tcp" }, - { "dls", { NULL }, 197, "udp" }, - { "dls-mon", { NULL }, 198, "tcp" }, - { "dls-mon", { NULL }, 198, "udp" }, - { "smux", { NULL }, 199, "tcp" }, - { "smux", { NULL }, 199, "udp" }, - { "src", { NULL }, 200, "tcp" }, - { "src", { NULL }, 200, "udp" }, - { "at-rtmp", { NULL }, 201, "tcp" }, - { "at-rtmp", { NULL }, 201, "udp" }, - { "at-nbp", { NULL }, 202, "tcp" }, - { "at-nbp", { NULL }, 202, "udp" }, - { "at-3", { NULL }, 203, "tcp" }, - { "at-3", { NULL }, 203, "udp" }, - { "at-echo", { NULL }, 204, "tcp" }, - { "at-echo", { NULL }, 204, "udp" }, - { "at-5", { NULL }, 205, "tcp" }, - { "at-5", { NULL }, 205, "udp" }, - { "at-zis", { NULL }, 206, "tcp" }, - { "at-zis", { NULL }, 206, "udp" }, - { "at-7", { NULL }, 207, "tcp" }, - { "at-7", { NULL }, 207, "udp" }, - { "at-8", { NULL }, 208, "tcp" }, - { "at-8", { NULL }, 208, "udp" }, - { "qmtp", { NULL }, 209, "tcp" }, - { "qmtp", { NULL }, 209, "udp" }, - { "z39.50", { NULL }, 210, "tcp" }, - { "z39.50", { NULL }, 210, "udp" }, - { "914c/g", { NULL }, 211, "tcp" }, - { "914c/g", { NULL }, 211, "udp" }, - { "anet", { NULL }, 212, "tcp" }, - { "anet", { NULL }, 212, "udp" }, - { "ipx", { NULL }, 213, "tcp" }, - { "ipx", { NULL }, 213, "udp" }, - { "vmpwscs", { NULL }, 214, "tcp" }, - { "vmpwscs", { NULL }, 214, "udp" }, - { "softpc", { NULL }, 215, "tcp" }, - { "softpc", { NULL }, 215, "udp" }, - { "CAIlic", { NULL }, 216, "tcp" }, - { "CAIlic", { NULL }, 216, "udp" }, - { "dbase", { NULL }, 217, "tcp" }, - { "dbase", { NULL }, 217, "udp" }, - { "mpp", { NULL }, 218, "tcp" }, - { "mpp", { NULL }, 218, "udp" }, - { "uarps", { NULL }, 219, "tcp" }, - { "uarps", { NULL }, 219, "udp" }, - { "imap3", { NULL }, 220, "tcp" }, - { "imap3", { NULL }, 220, "udp" }, - { "fln-spx", { NULL }, 221, "tcp" }, - { "fln-spx", { NULL }, 221, "udp" }, - { "rsh-spx", { NULL }, 222, "tcp" }, - { "rsh-spx", { NULL }, 222, "udp" }, - { "cdc", { NULL }, 223, "tcp" }, - { "cdc", { NULL }, 223, "udp" }, - { "masqdialer", { NULL }, 224, "tcp" }, - { "masqdialer", { NULL }, 224, "udp" }, - { "direct", { NULL }, 242, "tcp" }, - { "direct", { NULL }, 242, "udp" }, - { "sur-meas", { NULL }, 243, "tcp" }, - { "sur-meas", { NULL }, 243, "udp" }, - { "inbusiness", { NULL }, 244, "tcp" }, - { "inbusiness", { NULL }, 244, "udp" }, - { "link", { NULL }, 245, "tcp" }, - { "link", { NULL }, 245, "udp" }, - { "dsp3270", { NULL }, 246, "tcp" }, - { "dsp3270", { NULL }, 246, "udp" }, - { "subntbcst_tftp", { NULL }, 247, "tcp" }, - { "subntbcst_tftp", { NULL }, 247, "udp" }, - { "bhfhs", { NULL }, 248, "tcp" }, - { "bhfhs", { NULL }, 248, "udp" }, - { "rap", { NULL }, 256, "tcp" }, - { "rap", { NULL }, 256, "udp" }, - { "set", { NULL }, 257, "tcp" }, - { "set", { NULL }, 257, "udp" }, - { "esro-gen", { NULL }, 259, "tcp" }, - { "esro-gen", { NULL }, 259, "udp" }, - { "openport", { NULL }, 260, "tcp" }, - { "openport", { NULL }, 260, "udp" }, - { "nsiiops", { NULL }, 261, "tcp" }, - { "nsiiops", { NULL }, 261, "udp" }, - { "arcisdms", { NULL }, 262, "tcp" }, - { "arcisdms", { NULL }, 262, "udp" }, - { "hdap", { NULL }, 263, "tcp" }, - { "hdap", { NULL }, 263, "udp" }, - { "bgmp", { NULL }, 264, "tcp" }, - { "bgmp", { NULL }, 264, "udp" }, - { "x-bone-ctl", { NULL }, 265, "tcp" }, - { "x-bone-ctl", { NULL }, 265, "udp" }, - { "sst", { NULL }, 266, "tcp" }, - { "sst", { NULL }, 266, "udp" }, - { "td-service", { NULL }, 267, "tcp" }, - { "td-service", { NULL }, 267, "udp" }, - { "td-replica", { NULL }, 268, "tcp" }, - { "td-replica", { NULL }, 268, "udp" }, - { "manet", { NULL }, 269, "tcp" }, - { "manet", { NULL }, 269, "udp" }, - { "gist", { NULL }, 270, "udp" }, - { "http-mgmt", { NULL }, 280, "tcp" }, - { "http-mgmt", { NULL }, 280, "udp" }, - { "personal-link", { NULL }, 281, "tcp" }, - { "personal-link", { NULL }, 281, "udp" }, - { "cableport-ax", { NULL }, 282, "tcp" }, - { "cableport-ax", { NULL }, 282, "udp" }, - { "rescap", { NULL }, 283, "tcp" }, - { "rescap", { NULL }, 283, "udp" }, - { "corerjd", { NULL }, 284, "tcp" }, - { "corerjd", { NULL }, 284, "udp" }, - { "fxp", { NULL }, 286, "tcp" }, - { "fxp", { NULL }, 286, "udp" }, - { "k-block", { NULL }, 287, "tcp" }, - { "k-block", { NULL }, 287, "udp" }, - { "novastorbakcup", { NULL }, 308, "tcp" }, - { "novastorbakcup", { NULL }, 308, "udp" }, - { "entrusttime", { NULL }, 309, "tcp" }, - { "entrusttime", { NULL }, 309, "udp" }, - { "bhmds", { NULL }, 310, "tcp" }, - { "bhmds", { NULL }, 310, "udp" }, - { "asip-webadmin", { NULL }, 311, "tcp" }, - { "asip-webadmin", { NULL }, 311, "udp" }, - { "vslmp", { NULL }, 312, "tcp" }, - { "vslmp", { NULL }, 312, "udp" }, - { "magenta-logic", { NULL }, 313, "tcp" }, - { "magenta-logic", { NULL }, 313, "udp" }, - { "opalis-robot", { NULL }, 314, "tcp" }, - { "opalis-robot", { NULL }, 314, "udp" }, - { "dpsi", { NULL }, 315, "tcp" }, - { "dpsi", { NULL }, 315, "udp" }, - { "decauth", { NULL }, 316, "tcp" }, - { "decauth", { NULL }, 316, "udp" }, - { "zannet", { NULL }, 317, "tcp" }, - { "zannet", { NULL }, 317, "udp" }, - { "pkix-timestamp", { NULL }, 318, "tcp" }, - { "pkix-timestamp", { NULL }, 318, "udp" }, - { "ptp-event", { NULL }, 319, "tcp" }, - { "ptp-event", { NULL }, 319, "udp" }, - { "ptp-general", { NULL }, 320, "tcp" }, - { "ptp-general", { NULL }, 320, "udp" }, - { "pip", { NULL }, 321, "tcp" }, - { "pip", { NULL }, 321, "udp" }, - { "rtsps", { NULL }, 322, "tcp" }, - { "rtsps", { NULL }, 322, "udp" }, - { "texar", { NULL }, 333, "tcp" }, - { "texar", { NULL }, 333, "udp" }, - { "pdap", { NULL }, 344, "tcp" }, - { "pdap", { NULL }, 344, "udp" }, - { "pawserv", { NULL }, 345, "tcp" }, - { "pawserv", { NULL }, 345, "udp" }, - { "zserv", { NULL }, 346, "tcp" }, - { "zserv", { NULL }, 346, "udp" }, - { "fatserv", { NULL }, 347, "tcp" }, - { "fatserv", { NULL }, 347, "udp" }, - { "csi-sgwp", { NULL }, 348, "tcp" }, - { "csi-sgwp", { NULL }, 348, "udp" }, - { "mftp", { NULL }, 349, "tcp" }, - { "mftp", { NULL }, 349, "udp" }, - { "matip-type-a", { NULL }, 350, "tcp" }, - { "matip-type-a", { NULL }, 350, "udp" }, - { "matip-type-b", { NULL }, 351, "tcp" }, - { "matip-type-b", { NULL }, 351, "udp" }, - { "bhoetty", { NULL }, 351, "tcp" }, - { "bhoetty", { NULL }, 351, "udp" }, - { "dtag-ste-sb", { NULL }, 352, "tcp" }, - { "dtag-ste-sb", { NULL }, 352, "udp" }, - { "bhoedap4", { NULL }, 352, "tcp" }, - { "bhoedap4", { NULL }, 352, "udp" }, - { "ndsauth", { NULL }, 353, "tcp" }, - { "ndsauth", { NULL }, 353, "udp" }, - { "bh611", { NULL }, 354, "tcp" }, - { "bh611", { NULL }, 354, "udp" }, - { "datex-asn", { NULL }, 355, "tcp" }, - { "datex-asn", { NULL }, 355, "udp" }, - { "cloanto-net-1", { NULL }, 356, "tcp" }, - { "cloanto-net-1", { NULL }, 356, "udp" }, - { "bhevent", { NULL }, 357, "tcp" }, - { "bhevent", { NULL }, 357, "udp" }, - { "shrinkwrap", { NULL }, 358, "tcp" }, - { "shrinkwrap", { NULL }, 358, "udp" }, - { "nsrmp", { NULL }, 359, "tcp" }, - { "nsrmp", { NULL }, 359, "udp" }, - { "scoi2odialog", { NULL }, 360, "tcp" }, - { "scoi2odialog", { NULL }, 360, "udp" }, - { "semantix", { NULL }, 361, "tcp" }, - { "semantix", { NULL }, 361, "udp" }, - { "srssend", { NULL }, 362, "tcp" }, - { "srssend", { NULL }, 362, "udp" }, - { "rsvp_tunnel", { NULL }, 363, "tcp" }, - { "rsvp_tunnel", { NULL }, 363, "udp" }, - { "aurora-cmgr", { NULL }, 364, "tcp" }, - { "aurora-cmgr", { NULL }, 364, "udp" }, - { "dtk", { NULL }, 365, "tcp" }, - { "dtk", { NULL }, 365, "udp" }, - { "odmr", { NULL }, 366, "tcp" }, - { "odmr", { NULL }, 366, "udp" }, - { "mortgageware", { NULL }, 367, "tcp" }, - { "mortgageware", { NULL }, 367, "udp" }, - { "qbikgdp", { NULL }, 368, "tcp" }, - { "qbikgdp", { NULL }, 368, "udp" }, - { "rpc2portmap", { NULL }, 369, "tcp" }, - { "rpc2portmap", { NULL }, 369, "udp" }, - { "codaauth2", { NULL }, 370, "tcp" }, - { "codaauth2", { NULL }, 370, "udp" }, - { "clearcase", { NULL }, 371, "tcp" }, - { "clearcase", { NULL }, 371, "udp" }, - { "ulistproc", { NULL }, 372, "tcp" }, - { "ulistproc", { NULL }, 372, "udp" }, - { "legent-1", { NULL }, 373, "tcp" }, - { "legent-1", { NULL }, 373, "udp" }, - { "legent-2", { NULL }, 374, "tcp" }, - { "legent-2", { NULL }, 374, "udp" }, - { "hassle", { NULL }, 375, "tcp" }, - { "hassle", { NULL }, 375, "udp" }, - { "nip", { NULL }, 376, "tcp" }, - { "nip", { NULL }, 376, "udp" }, - { "tnETOS", { NULL }, 377, "tcp" }, - { "tnETOS", { NULL }, 377, "udp" }, - { "dsETOS", { NULL }, 378, "tcp" }, - { "dsETOS", { NULL }, 378, "udp" }, - { "is99c", { NULL }, 379, "tcp" }, - { "is99c", { NULL }, 379, "udp" }, - { "is99s", { NULL }, 380, "tcp" }, - { "is99s", { NULL }, 380, "udp" }, - { "hp-collector", { NULL }, 381, "tcp" }, - { "hp-collector", { NULL }, 381, "udp" }, - { "hp-managed-node", { NULL }, 382, "tcp" }, - { "hp-managed-node", { NULL }, 382, "udp" }, - { "hp-alarm-mgr", { NULL }, 383, "tcp" }, - { "hp-alarm-mgr", { NULL }, 383, "udp" }, - { "arns", { NULL }, 384, "tcp" }, - { "arns", { NULL }, 384, "udp" }, - { "ibm-app", { NULL }, 385, "tcp" }, - { "ibm-app", { NULL }, 385, "udp" }, - { "asa", { NULL }, 386, "tcp" }, - { "asa", { NULL }, 386, "udp" }, - { "aurp", { NULL }, 387, "tcp" }, - { "aurp", { NULL }, 387, "udp" }, - { "unidata-ldm", { NULL }, 388, "tcp" }, - { "unidata-ldm", { NULL }, 388, "udp" }, - { "ldap", { NULL }, 389, "tcp" }, - { "ldap", { NULL }, 389, "udp" }, - { "uis", { NULL }, 390, "tcp" }, - { "uis", { NULL }, 390, "udp" }, - { "synotics-relay", { NULL }, 391, "tcp" }, - { "synotics-relay", { NULL }, 391, "udp" }, - { "synotics-broker", { NULL }, 392, "tcp" }, - { "synotics-broker", { NULL }, 392, "udp" }, - { "meta5", { NULL }, 393, "tcp" }, - { "meta5", { NULL }, 393, "udp" }, - { "embl-ndt", { NULL }, 394, "tcp" }, - { "embl-ndt", { NULL }, 394, "udp" }, - { "netcp", { NULL }, 395, "tcp" }, - { "netcp", { NULL }, 395, "udp" }, - { "netware-ip", { NULL }, 396, "tcp" }, - { "netware-ip", { NULL }, 396, "udp" }, - { "mptn", { NULL }, 397, "tcp" }, - { "mptn", { NULL }, 397, "udp" }, - { "kryptolan", { NULL }, 398, "tcp" }, - { "kryptolan", { NULL }, 398, "udp" }, - { "iso-tsap-c2", { NULL }, 399, "tcp" }, - { "iso-tsap-c2", { NULL }, 399, "udp" }, - { "osb-sd", { NULL }, 400, "tcp" }, - { "osb-sd", { NULL }, 400, "udp" }, - { "ups", { NULL }, 401, "tcp" }, - { "ups", { NULL }, 401, "udp" }, - { "genie", { NULL }, 402, "tcp" }, - { "genie", { NULL }, 402, "udp" }, - { "decap", { NULL }, 403, "tcp" }, - { "decap", { NULL }, 403, "udp" }, - { "nced", { NULL }, 404, "tcp" }, - { "nced", { NULL }, 404, "udp" }, - { "ncld", { NULL }, 405, "tcp" }, - { "ncld", { NULL }, 405, "udp" }, - { "imsp", { NULL }, 406, "tcp" }, - { "imsp", { NULL }, 406, "udp" }, - { "timbuktu", { NULL }, 407, "tcp" }, - { "timbuktu", { NULL }, 407, "udp" }, - { "prm-sm", { NULL }, 408, "tcp" }, - { "prm-sm", { NULL }, 408, "udp" }, - { "prm-nm", { NULL }, 409, "tcp" }, - { "prm-nm", { NULL }, 409, "udp" }, - { "decladebug", { NULL }, 410, "tcp" }, - { "decladebug", { NULL }, 410, "udp" }, - { "rmt", { NULL }, 411, "tcp" }, - { "rmt", { NULL }, 411, "udp" }, - { "synoptics-trap", { NULL }, 412, "tcp" }, - { "synoptics-trap", { NULL }, 412, "udp" }, - { "smsp", { NULL }, 413, "tcp" }, - { "smsp", { NULL }, 413, "udp" }, - { "infoseek", { NULL }, 414, "tcp" }, - { "infoseek", { NULL }, 414, "udp" }, - { "bnet", { NULL }, 415, "tcp" }, - { "bnet", { NULL }, 415, "udp" }, - { "silverplatter", { NULL }, 416, "tcp" }, - { "silverplatter", { NULL }, 416, "udp" }, - { "onmux", { NULL }, 417, "tcp" }, - { "onmux", { NULL }, 417, "udp" }, - { "hyper-g", { NULL }, 418, "tcp" }, - { "hyper-g", { NULL }, 418, "udp" }, - { "ariel1", { NULL }, 419, "tcp" }, - { "ariel1", { NULL }, 419, "udp" }, - { "smpte", { NULL }, 420, "tcp" }, - { "smpte", { NULL }, 420, "udp" }, - { "ariel2", { NULL }, 421, "tcp" }, - { "ariel2", { NULL }, 421, "udp" }, - { "ariel3", { NULL }, 422, "tcp" }, - { "ariel3", { NULL }, 422, "udp" }, - { "opc-job-start", { NULL }, 423, "tcp" }, - { "opc-job-start", { NULL }, 423, "udp" }, - { "opc-job-track", { NULL }, 424, "tcp" }, - { "opc-job-track", { NULL }, 424, "udp" }, - { "icad-el", { NULL }, 425, "tcp" }, - { "icad-el", { NULL }, 425, "udp" }, - { "smartsdp", { NULL }, 426, "tcp" }, - { "smartsdp", { NULL }, 426, "udp" }, - { "svrloc", { NULL }, 427, "tcp" }, - { "svrloc", { NULL }, 427, "udp" }, - { "ocs_cmu", { NULL }, 428, "tcp" }, - { "ocs_cmu", { NULL }, 428, "udp" }, - { "ocs_amu", { NULL }, 429, "tcp" }, - { "ocs_amu", { NULL }, 429, "udp" }, - { "utmpsd", { NULL }, 430, "tcp" }, - { "utmpsd", { NULL }, 430, "udp" }, - { "utmpcd", { NULL }, 431, "tcp" }, - { "utmpcd", { NULL }, 431, "udp" }, - { "iasd", { NULL }, 432, "tcp" }, - { "iasd", { NULL }, 432, "udp" }, - { "nnsp", { NULL }, 433, "tcp" }, - { "nnsp", { NULL }, 433, "udp" }, - { "mobileip-agent", { NULL }, 434, "tcp" }, - { "mobileip-agent", { NULL }, 434, "udp" }, - { "mobilip-mn", { NULL }, 435, "tcp" }, - { "mobilip-mn", { NULL }, 435, "udp" }, - { "dna-cml", { NULL }, 436, "tcp" }, - { "dna-cml", { NULL }, 436, "udp" }, - { "comscm", { NULL }, 437, "tcp" }, - { "comscm", { NULL }, 437, "udp" }, - { "dsfgw", { NULL }, 438, "tcp" }, - { "dsfgw", { NULL }, 438, "udp" }, - { "dasp", { NULL }, 439, "tcp" }, - { "dasp", { NULL }, 439, "udp" }, - { "sgcp", { NULL }, 440, "tcp" }, - { "sgcp", { NULL }, 440, "udp" }, - { "decvms-sysmgt", { NULL }, 441, "tcp" }, - { "decvms-sysmgt", { NULL }, 441, "udp" }, - { "cvc_hostd", { NULL }, 442, "tcp" }, - { "cvc_hostd", { NULL }, 442, "udp" }, - { "https", { NULL }, 443, "tcp" }, - { "https", { NULL }, 443, "udp" }, - { "https", { NULL }, 443, "sctp"}, - { "snpp", { NULL }, 444, "tcp" }, - { "snpp", { NULL }, 444, "udp" }, - { "microsoft-ds", { NULL }, 445, "tcp" }, - { "microsoft-ds", { NULL }, 445, "udp" }, - { "ddm-rdb", { NULL }, 446, "tcp" }, - { "ddm-rdb", { NULL }, 446, "udp" }, - { "ddm-dfm", { NULL }, 447, "tcp" }, - { "ddm-dfm", { NULL }, 447, "udp" }, - { "ddm-ssl", { NULL }, 448, "tcp" }, - { "ddm-ssl", { NULL }, 448, "udp" }, - { "as-servermap", { NULL }, 449, "tcp" }, - { "as-servermap", { NULL }, 449, "udp" }, - { "tserver", { NULL }, 450, "tcp" }, - { "tserver", { NULL }, 450, "udp" }, - { "sfs-smp-net", { NULL }, 451, "tcp" }, - { "sfs-smp-net", { NULL }, 451, "udp" }, - { "sfs-config", { NULL }, 452, "tcp" }, - { "sfs-config", { NULL }, 452, "udp" }, - { "creativeserver", { NULL }, 453, "tcp" }, - { "creativeserver", { NULL }, 453, "udp" }, - { "contentserver", { NULL }, 454, "tcp" }, - { "contentserver", { NULL }, 454, "udp" }, - { "creativepartnr", { NULL }, 455, "tcp" }, - { "creativepartnr", { NULL }, 455, "udp" }, - { "macon-tcp", { NULL }, 456, "tcp" }, - { "macon-udp", { NULL }, 456, "udp" }, - { "scohelp", { NULL }, 457, "tcp" }, - { "scohelp", { NULL }, 457, "udp" }, - { "appleqtc", { NULL }, 458, "tcp" }, - { "appleqtc", { NULL }, 458, "udp" }, - { "ampr-rcmd", { NULL }, 459, "tcp" }, - { "ampr-rcmd", { NULL }, 459, "udp" }, - { "skronk", { NULL }, 460, "tcp" }, - { "skronk", { NULL }, 460, "udp" }, - { "datasurfsrv", { NULL }, 461, "tcp" }, - { "datasurfsrv", { NULL }, 461, "udp" }, - { "datasurfsrvsec", { NULL }, 462, "tcp" }, - { "datasurfsrvsec", { NULL }, 462, "udp" }, - { "alpes", { NULL }, 463, "tcp" }, - { "alpes", { NULL }, 463, "udp" }, - { "kpasswd", { NULL }, 464, "tcp" }, - { "kpasswd", { NULL }, 464, "udp" }, - { "urd", { NULL }, 465, "tcp" }, - { "igmpv3lite", { NULL }, 465, "udp" }, - { "digital-vrc", { NULL }, 466, "tcp" }, - { "digital-vrc", { NULL }, 466, "udp" }, - { "mylex-mapd", { NULL }, 467, "tcp" }, - { "mylex-mapd", { NULL }, 467, "udp" }, - { "photuris", { NULL }, 468, "tcp" }, - { "photuris", { NULL }, 468, "udp" }, - { "rcp", { NULL }, 469, "tcp" }, - { "rcp", { NULL }, 469, "udp" }, - { "scx-proxy", { NULL }, 470, "tcp" }, - { "scx-proxy", { NULL }, 470, "udp" }, - { "mondex", { NULL }, 471, "tcp" }, - { "mondex", { NULL }, 471, "udp" }, - { "ljk-login", { NULL }, 472, "tcp" }, - { "ljk-login", { NULL }, 472, "udp" }, - { "hybrid-pop", { NULL }, 473, "tcp" }, - { "hybrid-pop", { NULL }, 473, "udp" }, - { "tn-tl-w1", { NULL }, 474, "tcp" }, - { "tn-tl-w2", { NULL }, 474, "udp" }, - { "tcpnethaspsrv", { NULL }, 475, "tcp" }, - { "tcpnethaspsrv", { NULL }, 475, "udp" }, - { "tn-tl-fd1", { NULL }, 476, "tcp" }, - { "tn-tl-fd1", { NULL }, 476, "udp" }, - { "ss7ns", { NULL }, 477, "tcp" }, - { "ss7ns", { NULL }, 477, "udp" }, - { "spsc", { NULL }, 478, "tcp" }, - { "spsc", { NULL }, 478, "udp" }, - { "iafserver", { NULL }, 479, "tcp" }, - { "iafserver", { NULL }, 479, "udp" }, - { "iafdbase", { NULL }, 480, "tcp" }, - { "iafdbase", { NULL }, 480, "udp" }, - { "ph", { NULL }, 481, "tcp" }, - { "ph", { NULL }, 481, "udp" }, - { "bgs-nsi", { NULL }, 482, "tcp" }, - { "bgs-nsi", { NULL }, 482, "udp" }, - { "ulpnet", { NULL }, 483, "tcp" }, - { "ulpnet", { NULL }, 483, "udp" }, - { "integra-sme", { NULL }, 484, "tcp" }, - { "integra-sme", { NULL }, 484, "udp" }, - { "powerburst", { NULL }, 485, "tcp" }, - { "powerburst", { NULL }, 485, "udp" }, - { "avian", { NULL }, 486, "tcp" }, - { "avian", { NULL }, 486, "udp" }, - { "saft", { NULL }, 487, "tcp" }, - { "saft", { NULL }, 487, "udp" }, - { "gss-http", { NULL }, 488, "tcp" }, - { "gss-http", { NULL }, 488, "udp" }, - { "nest-protocol", { NULL }, 489, "tcp" }, - { "nest-protocol", { NULL }, 489, "udp" }, - { "micom-pfs", { NULL }, 490, "tcp" }, - { "micom-pfs", { NULL }, 490, "udp" }, - { "go-login", { NULL }, 491, "tcp" }, - { "go-login", { NULL }, 491, "udp" }, - { "ticf-1", { NULL }, 492, "tcp" }, - { "ticf-1", { NULL }, 492, "udp" }, - { "ticf-2", { NULL }, 493, "tcp" }, - { "ticf-2", { NULL }, 493, "udp" }, - { "pov-ray", { NULL }, 494, "tcp" }, - { "pov-ray", { NULL }, 494, "udp" }, - { "intecourier", { NULL }, 495, "tcp" }, - { "intecourier", { NULL }, 495, "udp" }, - { "pim-rp-disc", { NULL }, 496, "tcp" }, - { "pim-rp-disc", { NULL }, 496, "udp" }, - { "dantz", { NULL }, 497, "tcp" }, - { "dantz", { NULL }, 497, "udp" }, - { "siam", { NULL }, 498, "tcp" }, - { "siam", { NULL }, 498, "udp" }, - { "iso-ill", { NULL }, 499, "tcp" }, - { "iso-ill", { NULL }, 499, "udp" }, - { "isakmp", { NULL }, 500, "tcp" }, - { "isakmp", { NULL }, 500, "udp" }, - { "stmf", { NULL }, 501, "tcp" }, - { "stmf", { NULL }, 501, "udp" }, - { "asa-appl-proto", { NULL }, 502, "tcp" }, - { "asa-appl-proto", { NULL }, 502, "udp" }, - { "intrinsa", { NULL }, 503, "tcp" }, - { "intrinsa", { NULL }, 503, "udp" }, - { "citadel", { NULL }, 504, "tcp" }, - { "citadel", { NULL }, 504, "udp" }, - { "mailbox-lm", { NULL }, 505, "tcp" }, - { "mailbox-lm", { NULL }, 505, "udp" }, - { "ohimsrv", { NULL }, 506, "tcp" }, - { "ohimsrv", { NULL }, 506, "udp" }, - { "crs", { NULL }, 507, "tcp" }, - { "crs", { NULL }, 507, "udp" }, - { "xvttp", { NULL }, 508, "tcp" }, - { "xvttp", { NULL }, 508, "udp" }, - { "snare", { NULL }, 509, "tcp" }, - { "snare", { NULL }, 509, "udp" }, - { "fcp", { NULL }, 510, "tcp" }, - { "fcp", { NULL }, 510, "udp" }, - { "passgo", { NULL }, 511, "tcp" }, - { "passgo", { NULL }, 511, "udp" }, - { "exec", { NULL }, 512, "tcp" }, - { "comsat", { NULL }, 512, "udp" }, - { "biff", { NULL }, 512, "udp" }, - { "login", { NULL }, 513, "tcp" }, - { "who", { NULL }, 513, "udp" }, - { "shell", { NULL }, 514, "tcp" }, - { "syslog", { NULL }, 514, "udp" }, - { "printer", { NULL }, 515, "tcp" }, - { "printer", { NULL }, 515, "udp" }, - { "videotex", { NULL }, 516, "tcp" }, - { "videotex", { NULL }, 516, "udp" }, - { "talk", { NULL }, 517, "tcp" }, - { "talk", { NULL }, 517, "udp" }, - { "ntalk", { NULL }, 518, "tcp" }, - { "ntalk", { NULL }, 518, "udp" }, - { "utime", { NULL }, 519, "tcp" }, - { "utime", { NULL }, 519, "udp" }, - { "efs", { NULL }, 520, "tcp" }, - { "router", { NULL }, 520, "udp" }, - { "ripng", { NULL }, 521, "tcp" }, - { "ripng", { NULL }, 521, "udp" }, - { "ulp", { NULL }, 522, "tcp" }, - { "ulp", { NULL }, 522, "udp" }, - { "ibm-db2", { NULL }, 523, "tcp" }, - { "ibm-db2", { NULL }, 523, "udp" }, - { "ncp", { NULL }, 524, "tcp" }, - { "ncp", { NULL }, 524, "udp" }, - { "timed", { NULL }, 525, "tcp" }, - { "timed", { NULL }, 525, "udp" }, - { "tempo", { NULL }, 526, "tcp" }, - { "tempo", { NULL }, 526, "udp" }, - { "stx", { NULL }, 527, "tcp" }, - { "stx", { NULL }, 527, "udp" }, - { "custix", { NULL }, 528, "tcp" }, - { "custix", { NULL }, 528, "udp" }, - { "irc-serv", { NULL }, 529, "tcp" }, - { "irc-serv", { NULL }, 529, "udp" }, - { "courier", { NULL }, 530, "tcp" }, - { "courier", { NULL }, 530, "udp" }, - { "conference", { NULL }, 531, "tcp" }, - { "conference", { NULL }, 531, "udp" }, - { "netnews", { NULL }, 532, "tcp" }, - { "netnews", { NULL }, 532, "udp" }, - { "netwall", { NULL }, 533, "tcp" }, - { "netwall", { NULL }, 533, "udp" }, - { "windream", { NULL }, 534, "tcp" }, - { "windream", { NULL }, 534, "udp" }, - { "iiop", { NULL }, 535, "tcp" }, - { "iiop", { NULL }, 535, "udp" }, - { "opalis-rdv", { NULL }, 536, "tcp" }, - { "opalis-rdv", { NULL }, 536, "udp" }, - { "nmsp", { NULL }, 537, "tcp" }, - { "nmsp", { NULL }, 537, "udp" }, - { "gdomap", { NULL }, 538, "tcp" }, - { "gdomap", { NULL }, 538, "udp" }, - { "apertus-ldp", { NULL }, 539, "tcp" }, - { "apertus-ldp", { NULL }, 539, "udp" }, - { "uucp", { NULL }, 540, "tcp" }, - { "uucp", { NULL }, 540, "udp" }, - { "uucp-rlogin", { NULL }, 541, "tcp" }, - { "uucp-rlogin", { NULL }, 541, "udp" }, - { "commerce", { NULL }, 542, "tcp" }, - { "commerce", { NULL }, 542, "udp" }, - { "klogin", { NULL }, 543, "tcp" }, - { "klogin", { NULL }, 543, "udp" }, - { "kshell", { NULL }, 544, "tcp" }, - { "kshell", { NULL }, 544, "udp" }, - { "appleqtcsrvr", { NULL }, 545, "tcp" }, - { "appleqtcsrvr", { NULL }, 545, "udp" }, - { "dhcpv6-client", { NULL }, 546, "tcp" }, - { "dhcpv6-client", { NULL }, 546, "udp" }, - { "dhcpv6-server", { NULL }, 547, "tcp" }, - { "dhcpv6-server", { NULL }, 547, "udp" }, - { "afpovertcp", { NULL }, 548, "tcp" }, - { "afpovertcp", { NULL }, 548, "udp" }, - { "idfp", { NULL }, 549, "tcp" }, - { "idfp", { NULL }, 549, "udp" }, - { "new-rwho", { NULL }, 550, "tcp" }, - { "new-rwho", { NULL }, 550, "udp" }, - { "cybercash", { NULL }, 551, "tcp" }, - { "cybercash", { NULL }, 551, "udp" }, - { "devshr-nts", { NULL }, 552, "tcp" }, - { "devshr-nts", { NULL }, 552, "udp" }, - { "pirp", { NULL }, 553, "tcp" }, - { "pirp", { NULL }, 553, "udp" }, - { "rtsp", { NULL }, 554, "tcp" }, - { "rtsp", { NULL }, 554, "udp" }, - { "dsf", { NULL }, 555, "tcp" }, - { "dsf", { NULL }, 555, "udp" }, - { "remotefs", { NULL }, 556, "tcp" }, - { "remotefs", { NULL }, 556, "udp" }, - { "openvms-sysipc", { NULL }, 557, "tcp" }, - { "openvms-sysipc", { NULL }, 557, "udp" }, - { "sdnskmp", { NULL }, 558, "tcp" }, - { "sdnskmp", { NULL }, 558, "udp" }, - { "teedtap", { NULL }, 559, "tcp" }, - { "teedtap", { NULL }, 559, "udp" }, - { "rmonitor", { NULL }, 560, "tcp" }, - { "rmonitor", { NULL }, 560, "udp" }, - { "monitor", { NULL }, 561, "tcp" }, - { "monitor", { NULL }, 561, "udp" }, - { "chshell", { NULL }, 562, "tcp" }, - { "chshell", { NULL }, 562, "udp" }, - { "nntps", { NULL }, 563, "tcp" }, - { "nntps", { NULL }, 563, "udp" }, - { "9pfs", { NULL }, 564, "tcp" }, - { "9pfs", { NULL }, 564, "udp" }, - { "whoami", { NULL }, 565, "tcp" }, - { "whoami", { NULL }, 565, "udp" }, - { "streettalk", { NULL }, 566, "tcp" }, - { "streettalk", { NULL }, 566, "udp" }, - { "banyan-rpc", { NULL }, 567, "tcp" }, - { "banyan-rpc", { NULL }, 567, "udp" }, - { "ms-shuttle", { NULL }, 568, "tcp" }, - { "ms-shuttle", { NULL }, 568, "udp" }, - { "ms-rome", { NULL }, 569, "tcp" }, - { "ms-rome", { NULL }, 569, "udp" }, - { "meter", { NULL }, 570, "tcp" }, - { "meter", { NULL }, 570, "udp" }, - { "meter", { NULL }, 571, "tcp" }, - { "meter", { NULL }, 571, "udp" }, - { "sonar", { NULL }, 572, "tcp" }, - { "sonar", { NULL }, 572, "udp" }, - { "banyan-vip", { NULL }, 573, "tcp" }, - { "banyan-vip", { NULL }, 573, "udp" }, - { "ftp-agent", { NULL }, 574, "tcp" }, - { "ftp-agent", { NULL }, 574, "udp" }, - { "vemmi", { NULL }, 575, "tcp" }, - { "vemmi", { NULL }, 575, "udp" }, - { "ipcd", { NULL }, 576, "tcp" }, - { "ipcd", { NULL }, 576, "udp" }, - { "vnas", { NULL }, 577, "tcp" }, - { "vnas", { NULL }, 577, "udp" }, - { "ipdd", { NULL }, 578, "tcp" }, - { "ipdd", { NULL }, 578, "udp" }, - { "decbsrv", { NULL }, 579, "tcp" }, - { "decbsrv", { NULL }, 579, "udp" }, - { "sntp-heartbeat", { NULL }, 580, "tcp" }, - { "sntp-heartbeat", { NULL }, 580, "udp" }, - { "bdp", { NULL }, 581, "tcp" }, - { "bdp", { NULL }, 581, "udp" }, - { "scc-security", { NULL }, 582, "tcp" }, - { "scc-security", { NULL }, 582, "udp" }, - { "philips-vc", { NULL }, 583, "tcp" }, - { "philips-vc", { NULL }, 583, "udp" }, - { "keyserver", { NULL }, 584, "tcp" }, - { "keyserver", { NULL }, 584, "udp" }, - { "password-chg", { NULL }, 586, "tcp" }, - { "password-chg", { NULL }, 586, "udp" }, - { "submission", { NULL }, 587, "tcp" }, - { "submission", { NULL }, 587, "udp" }, - { "cal", { NULL }, 588, "tcp" }, - { "cal", { NULL }, 588, "udp" }, - { "eyelink", { NULL }, 589, "tcp" }, - { "eyelink", { NULL }, 589, "udp" }, - { "tns-cml", { NULL }, 590, "tcp" }, - { "tns-cml", { NULL }, 590, "udp" }, - { "http-alt", { NULL }, 591, "tcp" }, - { "http-alt", { NULL }, 591, "udp" }, - { "eudora-set", { NULL }, 592, "tcp" }, - { "eudora-set", { NULL }, 592, "udp" }, - { "http-rpc-epmap", { NULL }, 593, "tcp" }, - { "http-rpc-epmap", { NULL }, 593, "udp" }, - { "tpip", { NULL }, 594, "tcp" }, - { "tpip", { NULL }, 594, "udp" }, - { "cab-protocol", { NULL }, 595, "tcp" }, - { "cab-protocol", { NULL }, 595, "udp" }, - { "smsd", { NULL }, 596, "tcp" }, - { "smsd", { NULL }, 596, "udp" }, - { "ptcnameservice", { NULL }, 597, "tcp" }, - { "ptcnameservice", { NULL }, 597, "udp" }, - { "sco-websrvrmg3", { NULL }, 598, "tcp" }, - { "sco-websrvrmg3", { NULL }, 598, "udp" }, - { "acp", { NULL }, 599, "tcp" }, - { "acp", { NULL }, 599, "udp" }, - { "ipcserver", { NULL }, 600, "tcp" }, - { "ipcserver", { NULL }, 600, "udp" }, - { "syslog-conn", { NULL }, 601, "tcp" }, - { "syslog-conn", { NULL }, 601, "udp" }, - { "xmlrpc-beep", { NULL }, 602, "tcp" }, - { "xmlrpc-beep", { NULL }, 602, "udp" }, - { "idxp", { NULL }, 603, "tcp" }, - { "idxp", { NULL }, 603, "udp" }, - { "tunnel", { NULL }, 604, "tcp" }, - { "tunnel", { NULL }, 604, "udp" }, - { "soap-beep", { NULL }, 605, "tcp" }, - { "soap-beep", { NULL }, 605, "udp" }, - { "urm", { NULL }, 606, "tcp" }, - { "urm", { NULL }, 606, "udp" }, - { "nqs", { NULL }, 607, "tcp" }, - { "nqs", { NULL }, 607, "udp" }, - { "sift-uft", { NULL }, 608, "tcp" }, - { "sift-uft", { NULL }, 608, "udp" }, - { "npmp-trap", { NULL }, 609, "tcp" }, - { "npmp-trap", { NULL }, 609, "udp" }, - { "npmp-local", { NULL }, 610, "tcp" }, - { "npmp-local", { NULL }, 610, "udp" }, - { "npmp-gui", { NULL }, 611, "tcp" }, - { "npmp-gui", { NULL }, 611, "udp" }, - { "hmmp-ind", { NULL }, 612, "tcp" }, - { "hmmp-ind", { NULL }, 612, "udp" }, - { "hmmp-op", { NULL }, 613, "tcp" }, - { "hmmp-op", { NULL }, 613, "udp" }, - { "sshell", { NULL }, 614, "tcp" }, - { "sshell", { NULL }, 614, "udp" }, - { "sco-inetmgr", { NULL }, 615, "tcp" }, - { "sco-inetmgr", { NULL }, 615, "udp" }, - { "sco-sysmgr", { NULL }, 616, "tcp" }, - { "sco-sysmgr", { NULL }, 616, "udp" }, - { "sco-dtmgr", { NULL }, 617, "tcp" }, - { "sco-dtmgr", { NULL }, 617, "udp" }, - { "dei-icda", { NULL }, 618, "tcp" }, - { "dei-icda", { NULL }, 618, "udp" }, - { "compaq-evm", { NULL }, 619, "tcp" }, - { "compaq-evm", { NULL }, 619, "udp" }, - { "sco-websrvrmgr", { NULL }, 620, "tcp" }, - { "sco-websrvrmgr", { NULL }, 620, "udp" }, - { "escp-ip", { NULL }, 621, "tcp" }, - { "escp-ip", { NULL }, 621, "udp" }, - { "collaborator", { NULL }, 622, "tcp" }, - { "collaborator", { NULL }, 622, "udp" }, - { "oob-ws-http", { NULL }, 623, "tcp" }, - { "asf-rmcp", { NULL }, 623, "udp" }, - { "cryptoadmin", { NULL }, 624, "tcp" }, - { "cryptoadmin", { NULL }, 624, "udp" }, - { "dec_dlm", { NULL }, 625, "tcp" }, - { "dec_dlm", { NULL }, 625, "udp" }, - { "asia", { NULL }, 626, "tcp" }, - { "asia", { NULL }, 626, "udp" }, - { "passgo-tivoli", { NULL }, 627, "tcp" }, - { "passgo-tivoli", { NULL }, 627, "udp" }, - { "qmqp", { NULL }, 628, "tcp" }, - { "qmqp", { NULL }, 628, "udp" }, - { "3com-amp3", { NULL }, 629, "tcp" }, - { "3com-amp3", { NULL }, 629, "udp" }, - { "rda", { NULL }, 630, "tcp" }, - { "rda", { NULL }, 630, "udp" }, - { "ipp", { NULL }, 631, "tcp" }, - { "ipp", { NULL }, 631, "udp" }, - { "bmpp", { NULL }, 632, "tcp" }, - { "bmpp", { NULL }, 632, "udp" }, - { "servstat", { NULL }, 633, "tcp" }, - { "servstat", { NULL }, 633, "udp" }, - { "ginad", { NULL }, 634, "tcp" }, - { "ginad", { NULL }, 634, "udp" }, - { "rlzdbase", { NULL }, 635, "tcp" }, - { "rlzdbase", { NULL }, 635, "udp" }, - { "ldaps", { NULL }, 636, "tcp" }, - { "ldaps", { NULL }, 636, "udp" }, - { "lanserver", { NULL }, 637, "tcp" }, - { "lanserver", { NULL }, 637, "udp" }, - { "mcns-sec", { NULL }, 638, "tcp" }, - { "mcns-sec", { NULL }, 638, "udp" }, - { "msdp", { NULL }, 639, "tcp" }, - { "msdp", { NULL }, 639, "udp" }, - { "entrust-sps", { NULL }, 640, "tcp" }, - { "entrust-sps", { NULL }, 640, "udp" }, - { "repcmd", { NULL }, 641, "tcp" }, - { "repcmd", { NULL }, 641, "udp" }, - { "esro-emsdp", { NULL }, 642, "tcp" }, - { "esro-emsdp", { NULL }, 642, "udp" }, - { "sanity", { NULL }, 643, "tcp" }, - { "sanity", { NULL }, 643, "udp" }, - { "dwr", { NULL }, 644, "tcp" }, - { "dwr", { NULL }, 644, "udp" }, - { "pssc", { NULL }, 645, "tcp" }, - { "pssc", { NULL }, 645, "udp" }, - { "ldp", { NULL }, 646, "tcp" }, - { "ldp", { NULL }, 646, "udp" }, - { "dhcp-failover", { NULL }, 647, "tcp" }, - { "dhcp-failover", { NULL }, 647, "udp" }, - { "rrp", { NULL }, 648, "tcp" }, - { "rrp", { NULL }, 648, "udp" }, - { "cadview-3d", { NULL }, 649, "tcp" }, - { "cadview-3d", { NULL }, 649, "udp" }, - { "obex", { NULL }, 650, "tcp" }, - { "obex", { NULL }, 650, "udp" }, - { "ieee-mms", { NULL }, 651, "tcp" }, - { "ieee-mms", { NULL }, 651, "udp" }, - { "hello-port", { NULL }, 652, "tcp" }, - { "hello-port", { NULL }, 652, "udp" }, - { "repscmd", { NULL }, 653, "tcp" }, - { "repscmd", { NULL }, 653, "udp" }, - { "aodv", { NULL }, 654, "tcp" }, - { "aodv", { NULL }, 654, "udp" }, - { "tinc", { NULL }, 655, "tcp" }, - { "tinc", { NULL }, 655, "udp" }, - { "spmp", { NULL }, 656, "tcp" }, - { "spmp", { NULL }, 656, "udp" }, - { "rmc", { NULL }, 657, "tcp" }, - { "rmc", { NULL }, 657, "udp" }, - { "tenfold", { NULL }, 658, "tcp" }, - { "tenfold", { NULL }, 658, "udp" }, - { "mac-srvr-admin", { NULL }, 660, "tcp" }, - { "mac-srvr-admin", { NULL }, 660, "udp" }, - { "hap", { NULL }, 661, "tcp" }, - { "hap", { NULL }, 661, "udp" }, - { "pftp", { NULL }, 662, "tcp" }, - { "pftp", { NULL }, 662, "udp" }, - { "purenoise", { NULL }, 663, "tcp" }, - { "purenoise", { NULL }, 663, "udp" }, - { "oob-ws-https", { NULL }, 664, "tcp" }, - { "asf-secure-rmcp", { NULL }, 664, "udp" }, - { "sun-dr", { NULL }, 665, "tcp" }, - { "sun-dr", { NULL }, 665, "udp" }, - { "mdqs", { NULL }, 666, "tcp" }, - { "mdqs", { NULL }, 666, "udp" }, - { "doom", { NULL }, 666, "tcp" }, - { "doom", { NULL }, 666, "udp" }, - { "disclose", { NULL }, 667, "tcp" }, - { "disclose", { NULL }, 667, "udp" }, - { "mecomm", { NULL }, 668, "tcp" }, - { "mecomm", { NULL }, 668, "udp" }, - { "meregister", { NULL }, 669, "tcp" }, - { "meregister", { NULL }, 669, "udp" }, - { "vacdsm-sws", { NULL }, 670, "tcp" }, - { "vacdsm-sws", { NULL }, 670, "udp" }, - { "vacdsm-app", { NULL }, 671, "tcp" }, - { "vacdsm-app", { NULL }, 671, "udp" }, - { "vpps-qua", { NULL }, 672, "tcp" }, - { "vpps-qua", { NULL }, 672, "udp" }, - { "cimplex", { NULL }, 673, "tcp" }, - { "cimplex", { NULL }, 673, "udp" }, - { "acap", { NULL }, 674, "tcp" }, - { "acap", { NULL }, 674, "udp" }, - { "dctp", { NULL }, 675, "tcp" }, - { "dctp", { NULL }, 675, "udp" }, - { "vpps-via", { NULL }, 676, "tcp" }, - { "vpps-via", { NULL }, 676, "udp" }, - { "vpp", { NULL }, 677, "tcp" }, - { "vpp", { NULL }, 677, "udp" }, - { "ggf-ncp", { NULL }, 678, "tcp" }, - { "ggf-ncp", { NULL }, 678, "udp" }, - { "mrm", { NULL }, 679, "tcp" }, - { "mrm", { NULL }, 679, "udp" }, - { "entrust-aaas", { NULL }, 680, "tcp" }, - { "entrust-aaas", { NULL }, 680, "udp" }, - { "entrust-aams", { NULL }, 681, "tcp" }, - { "entrust-aams", { NULL }, 681, "udp" }, - { "xfr", { NULL }, 682, "tcp" }, - { "xfr", { NULL }, 682, "udp" }, - { "corba-iiop", { NULL }, 683, "tcp" }, - { "corba-iiop", { NULL }, 683, "udp" }, - { "corba-iiop-ssl", { NULL }, 684, "tcp" }, - { "corba-iiop-ssl", { NULL }, 684, "udp" }, - { "mdc-portmapper", { NULL }, 685, "tcp" }, - { "mdc-portmapper", { NULL }, 685, "udp" }, - { "hcp-wismar", { NULL }, 686, "tcp" }, - { "hcp-wismar", { NULL }, 686, "udp" }, - { "asipregistry", { NULL }, 687, "tcp" }, - { "asipregistry", { NULL }, 687, "udp" }, - { "realm-rusd", { NULL }, 688, "tcp" }, - { "realm-rusd", { NULL }, 688, "udp" }, - { "nmap", { NULL }, 689, "tcp" }, - { "nmap", { NULL }, 689, "udp" }, - { "vatp", { NULL }, 690, "tcp" }, - { "vatp", { NULL }, 690, "udp" }, - { "msexch-routing", { NULL }, 691, "tcp" }, - { "msexch-routing", { NULL }, 691, "udp" }, - { "hyperwave-isp", { NULL }, 692, "tcp" }, - { "hyperwave-isp", { NULL }, 692, "udp" }, - { "connendp", { NULL }, 693, "tcp" }, - { "connendp", { NULL }, 693, "udp" }, - { "ha-cluster", { NULL }, 694, "tcp" }, - { "ha-cluster", { NULL }, 694, "udp" }, - { "ieee-mms-ssl", { NULL }, 695, "tcp" }, - { "ieee-mms-ssl", { NULL }, 695, "udp" }, - { "rushd", { NULL }, 696, "tcp" }, - { "rushd", { NULL }, 696, "udp" }, - { "uuidgen", { NULL }, 697, "tcp" }, - { "uuidgen", { NULL }, 697, "udp" }, - { "olsr", { NULL }, 698, "tcp" }, - { "olsr", { NULL }, 698, "udp" }, - { "accessnetwork", { NULL }, 699, "tcp" }, - { "accessnetwork", { NULL }, 699, "udp" }, - { "epp", { NULL }, 700, "tcp" }, - { "epp", { NULL }, 700, "udp" }, - { "lmp", { NULL }, 701, "tcp" }, - { "lmp", { NULL }, 701, "udp" }, - { "iris-beep", { NULL }, 702, "tcp" }, - { "iris-beep", { NULL }, 702, "udp" }, - { "elcsd", { NULL }, 704, "tcp" }, - { "elcsd", { NULL }, 704, "udp" }, - { "agentx", { NULL }, 705, "tcp" }, - { "agentx", { NULL }, 705, "udp" }, - { "silc", { NULL }, 706, "tcp" }, - { "silc", { NULL }, 706, "udp" }, - { "borland-dsj", { NULL }, 707, "tcp" }, - { "borland-dsj", { NULL }, 707, "udp" }, - { "entrust-kmsh", { NULL }, 709, "tcp" }, - { "entrust-kmsh", { NULL }, 709, "udp" }, - { "entrust-ash", { NULL }, 710, "tcp" }, - { "entrust-ash", { NULL }, 710, "udp" }, - { "cisco-tdp", { NULL }, 711, "tcp" }, - { "cisco-tdp", { NULL }, 711, "udp" }, - { "tbrpf", { NULL }, 712, "tcp" }, - { "tbrpf", { NULL }, 712, "udp" }, - { "iris-xpc", { NULL }, 713, "tcp" }, - { "iris-xpc", { NULL }, 713, "udp" }, - { "iris-xpcs", { NULL }, 714, "tcp" }, - { "iris-xpcs", { NULL }, 714, "udp" }, - { "iris-lwz", { NULL }, 715, "tcp" }, - { "iris-lwz", { NULL }, 715, "udp" }, - { "pana", { NULL }, 716, "udp" }, - { "netviewdm1", { NULL }, 729, "tcp" }, - { "netviewdm1", { NULL }, 729, "udp" }, - { "netviewdm2", { NULL }, 730, "tcp" }, - { "netviewdm2", { NULL }, 730, "udp" }, - { "netviewdm3", { NULL }, 731, "tcp" }, - { "netviewdm3", { NULL }, 731, "udp" }, - { "netgw", { NULL }, 741, "tcp" }, - { "netgw", { NULL }, 741, "udp" }, - { "netrcs", { NULL }, 742, "tcp" }, - { "netrcs", { NULL }, 742, "udp" }, - { "flexlm", { NULL }, 744, "tcp" }, - { "flexlm", { NULL }, 744, "udp" }, - { "fujitsu-dev", { NULL }, 747, "tcp" }, - { "fujitsu-dev", { NULL }, 747, "udp" }, - { "ris-cm", { NULL }, 748, "tcp" }, - { "ris-cm", { NULL }, 748, "udp" }, - { "kerberos-adm", { NULL }, 749, "tcp" }, - { "kerberos-adm", { NULL }, 749, "udp" }, - { "rfile", { NULL }, 750, "tcp" }, - { "loadav", { NULL }, 750, "udp" }, - { "kerberos-iv", { NULL }, 750, "udp" }, - { "pump", { NULL }, 751, "tcp" }, - { "pump", { NULL }, 751, "udp" }, - { "qrh", { NULL }, 752, "tcp" }, - { "qrh", { NULL }, 752, "udp" }, - { "rrh", { NULL }, 753, "tcp" }, - { "rrh", { NULL }, 753, "udp" }, - { "tell", { NULL }, 754, "tcp" }, - { "tell", { NULL }, 754, "udp" }, - { "nlogin", { NULL }, 758, "tcp" }, - { "nlogin", { NULL }, 758, "udp" }, - { "con", { NULL }, 759, "tcp" }, - { "con", { NULL }, 759, "udp" }, - { "ns", { NULL }, 760, "tcp" }, - { "ns", { NULL }, 760, "udp" }, - { "rxe", { NULL }, 761, "tcp" }, - { "rxe", { NULL }, 761, "udp" }, - { "quotad", { NULL }, 762, "tcp" }, - { "quotad", { NULL }, 762, "udp" }, - { "cycleserv", { NULL }, 763, "tcp" }, - { "cycleserv", { NULL }, 763, "udp" }, - { "omserv", { NULL }, 764, "tcp" }, - { "omserv", { NULL }, 764, "udp" }, - { "webster", { NULL }, 765, "tcp" }, - { "webster", { NULL }, 765, "udp" }, - { "phonebook", { NULL }, 767, "tcp" }, - { "phonebook", { NULL }, 767, "udp" }, - { "vid", { NULL }, 769, "tcp" }, - { "vid", { NULL }, 769, "udp" }, - { "cadlock", { NULL }, 770, "tcp" }, - { "cadlock", { NULL }, 770, "udp" }, - { "rtip", { NULL }, 771, "tcp" }, - { "rtip", { NULL }, 771, "udp" }, - { "cycleserv2", { NULL }, 772, "tcp" }, - { "cycleserv2", { NULL }, 772, "udp" }, - { "submit", { NULL }, 773, "tcp" }, - { "notify", { NULL }, 773, "udp" }, - { "rpasswd", { NULL }, 774, "tcp" }, - { "acmaint_dbd", { NULL }, 774, "udp" }, - { "entomb", { NULL }, 775, "tcp" }, - { "acmaint_transd", { NULL }, 775, "udp" }, - { "wpages", { NULL }, 776, "tcp" }, - { "wpages", { NULL }, 776, "udp" }, - { "multiling-http", { NULL }, 777, "tcp" }, - { "multiling-http", { NULL }, 777, "udp" }, - { "wpgs", { NULL }, 780, "tcp" }, - { "wpgs", { NULL }, 780, "udp" }, - { "mdbs_daemon", { NULL }, 800, "tcp" }, - { "mdbs_daemon", { NULL }, 800, "udp" }, - { "device", { NULL }, 801, "tcp" }, - { "device", { NULL }, 801, "udp" }, - { "fcp-udp", { NULL }, 810, "tcp" }, - { "fcp-udp", { NULL }, 810, "udp" }, - { "itm-mcell-s", { NULL }, 828, "tcp" }, - { "itm-mcell-s", { NULL }, 828, "udp" }, - { "pkix-3-ca-ra", { NULL }, 829, "tcp" }, - { "pkix-3-ca-ra", { NULL }, 829, "udp" }, - { "netconf-ssh", { NULL }, 830, "tcp" }, - { "netconf-ssh", { NULL }, 830, "udp" }, - { "netconf-beep", { NULL }, 831, "tcp" }, - { "netconf-beep", { NULL }, 831, "udp" }, - { "netconfsoaphttp", { NULL }, 832, "tcp" }, - { "netconfsoaphttp", { NULL }, 832, "udp" }, - { "netconfsoapbeep", { NULL }, 833, "tcp" }, - { "netconfsoapbeep", { NULL }, 833, "udp" }, - { "dhcp-failover2", { NULL }, 847, "tcp" }, - { "dhcp-failover2", { NULL }, 847, "udp" }, - { "gdoi", { NULL }, 848, "tcp" }, - { "gdoi", { NULL }, 848, "udp" }, - { "iscsi", { NULL }, 860, "tcp" }, - { "iscsi", { NULL }, 860, "udp" }, - { "owamp-control", { NULL }, 861, "tcp" }, - { "owamp-control", { NULL }, 861, "udp" }, - { "twamp-control", { NULL }, 862, "tcp" }, - { "twamp-control", { NULL }, 862, "udp" }, - { "rsync", { NULL }, 873, "tcp" }, - { "rsync", { NULL }, 873, "udp" }, - { "iclcnet-locate", { NULL }, 886, "tcp" }, - { "iclcnet-locate", { NULL }, 886, "udp" }, - { "iclcnet_svinfo", { NULL }, 887, "tcp" }, - { "iclcnet_svinfo", { NULL }, 887, "udp" }, - { "accessbuilder", { NULL }, 888, "tcp" }, - { "accessbuilder", { NULL }, 888, "udp" }, - { "cddbp", { NULL }, 888, "tcp" }, - { "omginitialrefs", { NULL }, 900, "tcp" }, - { "omginitialrefs", { NULL }, 900, "udp" }, - { "smpnameres", { NULL }, 901, "tcp" }, - { "smpnameres", { NULL }, 901, "udp" }, - { "ideafarm-door", { NULL }, 902, "tcp" }, - { "ideafarm-door", { NULL }, 902, "udp" }, - { "ideafarm-panic", { NULL }, 903, "tcp" }, - { "ideafarm-panic", { NULL }, 903, "udp" }, - { "kink", { NULL }, 910, "tcp" }, - { "kink", { NULL }, 910, "udp" }, - { "xact-backup", { NULL }, 911, "tcp" }, - { "xact-backup", { NULL }, 911, "udp" }, - { "apex-mesh", { NULL }, 912, "tcp" }, - { "apex-mesh", { NULL }, 912, "udp" }, - { "apex-edge", { NULL }, 913, "tcp" }, - { "apex-edge", { NULL }, 913, "udp" }, - { "ftps-data", { NULL }, 989, "tcp" }, - { "ftps-data", { NULL }, 989, "udp" }, - { "ftps", { NULL }, 990, "tcp" }, - { "ftps", { NULL }, 990, "udp" }, - { "nas", { NULL }, 991, "tcp" }, - { "nas", { NULL }, 991, "udp" }, - { "telnets", { NULL }, 992, "tcp" }, - { "telnets", { NULL }, 992, "udp" }, - { "imaps", { NULL }, 993, "tcp" }, - { "imaps", { NULL }, 993, "udp" }, - { "ircs", { NULL }, 994, "tcp" }, - { "ircs", { NULL }, 994, "udp" }, - { "pop3s", { NULL }, 995, "tcp" }, - { "pop3s", { NULL }, 995, "udp" }, - { "vsinet", { NULL }, 996, "tcp" }, - { "vsinet", { NULL }, 996, "udp" }, - { "maitrd", { NULL }, 997, "tcp" }, - { "maitrd", { NULL }, 997, "udp" }, - { "busboy", { NULL }, 998, "tcp" }, - { "puparp", { NULL }, 998, "udp" }, - { "garcon", { NULL }, 999, "tcp" }, - { "applix", { NULL }, 999, "udp" }, - { "puprouter", { NULL }, 999, "tcp" }, - { "puprouter", { NULL }, 999, "udp" }, - { "cadlock2", { NULL }, 1000, "tcp" }, - { "cadlock2", { NULL }, 1000, "udp" }, - { "surf", { NULL }, 1010, "tcp" }, - { "surf", { NULL }, 1010, "udp" }, - { "exp1", { NULL }, 1021, "tcp" }, - { "exp1", { NULL }, 1021, "udp" }, - { "exp2", { NULL }, 1022, "tcp" }, - { "exp2", { NULL }, 1022, "udp" }, -# endif /* USE_IANA_WELL_KNOWN_PORTS */ -# ifdef USE_IANA_REGISTERED_PORTS - { "blackjack", { NULL }, 1025, "tcp" }, - { "blackjack", { NULL }, 1025, "udp" }, - { "cap", { NULL }, 1026, "tcp" }, - { "cap", { NULL }, 1026, "udp" }, - { "solid-mux", { NULL }, 1029, "tcp" }, - { "solid-mux", { NULL }, 1029, "udp" }, - { "iad1", { NULL }, 1030, "tcp" }, - { "iad1", { NULL }, 1030, "udp" }, - { "iad2", { NULL }, 1031, "tcp" }, - { "iad2", { NULL }, 1031, "udp" }, - { "iad3", { NULL }, 1032, "tcp" }, - { "iad3", { NULL }, 1032, "udp" }, - { "netinfo-local", { NULL }, 1033, "tcp" }, - { "netinfo-local", { NULL }, 1033, "udp" }, - { "activesync", { NULL }, 1034, "tcp" }, - { "activesync", { NULL }, 1034, "udp" }, - { "mxxrlogin", { NULL }, 1035, "tcp" }, - { "mxxrlogin", { NULL }, 1035, "udp" }, - { "nsstp", { NULL }, 1036, "tcp" }, - { "nsstp", { NULL }, 1036, "udp" }, - { "ams", { NULL }, 1037, "tcp" }, - { "ams", { NULL }, 1037, "udp" }, - { "mtqp", { NULL }, 1038, "tcp" }, - { "mtqp", { NULL }, 1038, "udp" }, - { "sbl", { NULL }, 1039, "tcp" }, - { "sbl", { NULL }, 1039, "udp" }, - { "netarx", { NULL }, 1040, "tcp" }, - { "netarx", { NULL }, 1040, "udp" }, - { "danf-ak2", { NULL }, 1041, "tcp" }, - { "danf-ak2", { NULL }, 1041, "udp" }, - { "afrog", { NULL }, 1042, "tcp" }, - { "afrog", { NULL }, 1042, "udp" }, - { "boinc-client", { NULL }, 1043, "tcp" }, - { "boinc-client", { NULL }, 1043, "udp" }, - { "dcutility", { NULL }, 1044, "tcp" }, - { "dcutility", { NULL }, 1044, "udp" }, - { "fpitp", { NULL }, 1045, "tcp" }, - { "fpitp", { NULL }, 1045, "udp" }, - { "wfremotertm", { NULL }, 1046, "tcp" }, - { "wfremotertm", { NULL }, 1046, "udp" }, - { "neod1", { NULL }, 1047, "tcp" }, - { "neod1", { NULL }, 1047, "udp" }, - { "neod2", { NULL }, 1048, "tcp" }, - { "neod2", { NULL }, 1048, "udp" }, - { "td-postman", { NULL }, 1049, "tcp" }, - { "td-postman", { NULL }, 1049, "udp" }, - { "cma", { NULL }, 1050, "tcp" }, - { "cma", { NULL }, 1050, "udp" }, - { "optima-vnet", { NULL }, 1051, "tcp" }, - { "optima-vnet", { NULL }, 1051, "udp" }, - { "ddt", { NULL }, 1052, "tcp" }, - { "ddt", { NULL }, 1052, "udp" }, - { "remote-as", { NULL }, 1053, "tcp" }, - { "remote-as", { NULL }, 1053, "udp" }, - { "brvread", { NULL }, 1054, "tcp" }, - { "brvread", { NULL }, 1054, "udp" }, - { "ansyslmd", { NULL }, 1055, "tcp" }, - { "ansyslmd", { NULL }, 1055, "udp" }, - { "vfo", { NULL }, 1056, "tcp" }, - { "vfo", { NULL }, 1056, "udp" }, - { "startron", { NULL }, 1057, "tcp" }, - { "startron", { NULL }, 1057, "udp" }, - { "nim", { NULL }, 1058, "tcp" }, - { "nim", { NULL }, 1058, "udp" }, - { "nimreg", { NULL }, 1059, "tcp" }, - { "nimreg", { NULL }, 1059, "udp" }, - { "polestar", { NULL }, 1060, "tcp" }, - { "polestar", { NULL }, 1060, "udp" }, - { "kiosk", { NULL }, 1061, "tcp" }, - { "kiosk", { NULL }, 1061, "udp" }, - { "veracity", { NULL }, 1062, "tcp" }, - { "veracity", { NULL }, 1062, "udp" }, - { "kyoceranetdev", { NULL }, 1063, "tcp" }, - { "kyoceranetdev", { NULL }, 1063, "udp" }, - { "jstel", { NULL }, 1064, "tcp" }, - { "jstel", { NULL }, 1064, "udp" }, - { "syscomlan", { NULL }, 1065, "tcp" }, - { "syscomlan", { NULL }, 1065, "udp" }, - { "fpo-fns", { NULL }, 1066, "tcp" }, - { "fpo-fns", { NULL }, 1066, "udp" }, - { "instl_boots", { NULL }, 1067, "tcp" }, - { "instl_boots", { NULL }, 1067, "udp" }, - { "instl_bootc", { NULL }, 1068, "tcp" }, - { "instl_bootc", { NULL }, 1068, "udp" }, - { "cognex-insight", { NULL }, 1069, "tcp" }, - { "cognex-insight", { NULL }, 1069, "udp" }, - { "gmrupdateserv", { NULL }, 1070, "tcp" }, - { "gmrupdateserv", { NULL }, 1070, "udp" }, - { "bsquare-voip", { NULL }, 1071, "tcp" }, - { "bsquare-voip", { NULL }, 1071, "udp" }, - { "cardax", { NULL }, 1072, "tcp" }, - { "cardax", { NULL }, 1072, "udp" }, - { "bridgecontrol", { NULL }, 1073, "tcp" }, - { "bridgecontrol", { NULL }, 1073, "udp" }, - { "warmspotMgmt", { NULL }, 1074, "tcp" }, - { "warmspotMgmt", { NULL }, 1074, "udp" }, - { "rdrmshc", { NULL }, 1075, "tcp" }, - { "rdrmshc", { NULL }, 1075, "udp" }, - { "dab-sti-c", { NULL }, 1076, "tcp" }, - { "dab-sti-c", { NULL }, 1076, "udp" }, - { "imgames", { NULL }, 1077, "tcp" }, - { "imgames", { NULL }, 1077, "udp" }, - { "avocent-proxy", { NULL }, 1078, "tcp" }, - { "avocent-proxy", { NULL }, 1078, "udp" }, - { "asprovatalk", { NULL }, 1079, "tcp" }, - { "asprovatalk", { NULL }, 1079, "udp" }, - { "socks", { NULL }, 1080, "tcp" }, - { "socks", { NULL }, 1080, "udp" }, - { "pvuniwien", { NULL }, 1081, "tcp" }, - { "pvuniwien", { NULL }, 1081, "udp" }, - { "amt-esd-prot", { NULL }, 1082, "tcp" }, - { "amt-esd-prot", { NULL }, 1082, "udp" }, - { "ansoft-lm-1", { NULL }, 1083, "tcp" }, - { "ansoft-lm-1", { NULL }, 1083, "udp" }, - { "ansoft-lm-2", { NULL }, 1084, "tcp" }, - { "ansoft-lm-2", { NULL }, 1084, "udp" }, - { "webobjects", { NULL }, 1085, "tcp" }, - { "webobjects", { NULL }, 1085, "udp" }, - { "cplscrambler-lg", { NULL }, 1086, "tcp" }, - { "cplscrambler-lg", { NULL }, 1086, "udp" }, - { "cplscrambler-in", { NULL }, 1087, "tcp" }, - { "cplscrambler-in", { NULL }, 1087, "udp" }, - { "cplscrambler-al", { NULL }, 1088, "tcp" }, - { "cplscrambler-al", { NULL }, 1088, "udp" }, - { "ff-annunc", { NULL }, 1089, "tcp" }, - { "ff-annunc", { NULL }, 1089, "udp" }, - { "ff-fms", { NULL }, 1090, "tcp" }, - { "ff-fms", { NULL }, 1090, "udp" }, - { "ff-sm", { NULL }, 1091, "tcp" }, - { "ff-sm", { NULL }, 1091, "udp" }, - { "obrpd", { NULL }, 1092, "tcp" }, - { "obrpd", { NULL }, 1092, "udp" }, - { "proofd", { NULL }, 1093, "tcp" }, - { "proofd", { NULL }, 1093, "udp" }, - { "rootd", { NULL }, 1094, "tcp" }, - { "rootd", { NULL }, 1094, "udp" }, - { "nicelink", { NULL }, 1095, "tcp" }, - { "nicelink", { NULL }, 1095, "udp" }, - { "cnrprotocol", { NULL }, 1096, "tcp" }, - { "cnrprotocol", { NULL }, 1096, "udp" }, - { "sunclustermgr", { NULL }, 1097, "tcp" }, - { "sunclustermgr", { NULL }, 1097, "udp" }, - { "rmiactivation", { NULL }, 1098, "tcp" }, - { "rmiactivation", { NULL }, 1098, "udp" }, - { "rmiregistry", { NULL }, 1099, "tcp" }, - { "rmiregistry", { NULL }, 1099, "udp" }, - { "mctp", { NULL }, 1100, "tcp" }, - { "mctp", { NULL }, 1100, "udp" }, - { "pt2-discover", { NULL }, 1101, "tcp" }, - { "pt2-discover", { NULL }, 1101, "udp" }, - { "adobeserver-1", { NULL }, 1102, "tcp" }, - { "adobeserver-1", { NULL }, 1102, "udp" }, - { "adobeserver-2", { NULL }, 1103, "tcp" }, - { "adobeserver-2", { NULL }, 1103, "udp" }, - { "xrl", { NULL }, 1104, "tcp" }, - { "xrl", { NULL }, 1104, "udp" }, - { "ftranhc", { NULL }, 1105, "tcp" }, - { "ftranhc", { NULL }, 1105, "udp" }, - { "isoipsigport-1", { NULL }, 1106, "tcp" }, - { "isoipsigport-1", { NULL }, 1106, "udp" }, - { "isoipsigport-2", { NULL }, 1107, "tcp" }, - { "isoipsigport-2", { NULL }, 1107, "udp" }, - { "ratio-adp", { NULL }, 1108, "tcp" }, - { "ratio-adp", { NULL }, 1108, "udp" }, - { "webadmstart", { NULL }, 1110, "tcp" }, - { "nfsd-keepalive", { NULL }, 1110, "udp" }, - { "lmsocialserver", { NULL }, 1111, "tcp" }, - { "lmsocialserver", { NULL }, 1111, "udp" }, - { "icp", { NULL }, 1112, "tcp" }, - { "icp", { NULL }, 1112, "udp" }, - { "ltp-deepspace", { NULL }, 1113, "tcp" }, - { "ltp-deepspace", { NULL }, 1113, "udp" }, - { "mini-sql", { NULL }, 1114, "tcp" }, - { "mini-sql", { NULL }, 1114, "udp" }, - { "ardus-trns", { NULL }, 1115, "tcp" }, - { "ardus-trns", { NULL }, 1115, "udp" }, - { "ardus-cntl", { NULL }, 1116, "tcp" }, - { "ardus-cntl", { NULL }, 1116, "udp" }, - { "ardus-mtrns", { NULL }, 1117, "tcp" }, - { "ardus-mtrns", { NULL }, 1117, "udp" }, - { "sacred", { NULL }, 1118, "tcp" }, - { "sacred", { NULL }, 1118, "udp" }, - { "bnetgame", { NULL }, 1119, "tcp" }, - { "bnetgame", { NULL }, 1119, "udp" }, - { "bnetfile", { NULL }, 1120, "tcp" }, - { "bnetfile", { NULL }, 1120, "udp" }, - { "rmpp", { NULL }, 1121, "tcp" }, - { "rmpp", { NULL }, 1121, "udp" }, - { "availant-mgr", { NULL }, 1122, "tcp" }, - { "availant-mgr", { NULL }, 1122, "udp" }, - { "murray", { NULL }, 1123, "tcp" }, - { "murray", { NULL }, 1123, "udp" }, - { "hpvmmcontrol", { NULL }, 1124, "tcp" }, - { "hpvmmcontrol", { NULL }, 1124, "udp" }, - { "hpvmmagent", { NULL }, 1125, "tcp" }, - { "hpvmmagent", { NULL }, 1125, "udp" }, - { "hpvmmdata", { NULL }, 1126, "tcp" }, - { "hpvmmdata", { NULL }, 1126, "udp" }, - { "kwdb-commn", { NULL }, 1127, "tcp" }, - { "kwdb-commn", { NULL }, 1127, "udp" }, - { "saphostctrl", { NULL }, 1128, "tcp" }, - { "saphostctrl", { NULL }, 1128, "udp" }, - { "saphostctrls", { NULL }, 1129, "tcp" }, - { "saphostctrls", { NULL }, 1129, "udp" }, - { "casp", { NULL }, 1130, "tcp" }, - { "casp", { NULL }, 1130, "udp" }, - { "caspssl", { NULL }, 1131, "tcp" }, - { "caspssl", { NULL }, 1131, "udp" }, - { "kvm-via-ip", { NULL }, 1132, "tcp" }, - { "kvm-via-ip", { NULL }, 1132, "udp" }, - { "dfn", { NULL }, 1133, "tcp" }, - { "dfn", { NULL }, 1133, "udp" }, - { "aplx", { NULL }, 1134, "tcp" }, - { "aplx", { NULL }, 1134, "udp" }, - { "omnivision", { NULL }, 1135, "tcp" }, - { "omnivision", { NULL }, 1135, "udp" }, - { "hhb-gateway", { NULL }, 1136, "tcp" }, - { "hhb-gateway", { NULL }, 1136, "udp" }, - { "trim", { NULL }, 1137, "tcp" }, - { "trim", { NULL }, 1137, "udp" }, - { "encrypted_admin", { NULL }, 1138, "tcp" }, - { "encrypted_admin", { NULL }, 1138, "udp" }, - { "evm", { NULL }, 1139, "tcp" }, - { "evm", { NULL }, 1139, "udp" }, - { "autonoc", { NULL }, 1140, "tcp" }, - { "autonoc", { NULL }, 1140, "udp" }, - { "mxomss", { NULL }, 1141, "tcp" }, - { "mxomss", { NULL }, 1141, "udp" }, - { "edtools", { NULL }, 1142, "tcp" }, - { "edtools", { NULL }, 1142, "udp" }, - { "imyx", { NULL }, 1143, "tcp" }, - { "imyx", { NULL }, 1143, "udp" }, - { "fuscript", { NULL }, 1144, "tcp" }, - { "fuscript", { NULL }, 1144, "udp" }, - { "x9-icue", { NULL }, 1145, "tcp" }, - { "x9-icue", { NULL }, 1145, "udp" }, - { "audit-transfer", { NULL }, 1146, "tcp" }, - { "audit-transfer", { NULL }, 1146, "udp" }, - { "capioverlan", { NULL }, 1147, "tcp" }, - { "capioverlan", { NULL }, 1147, "udp" }, - { "elfiq-repl", { NULL }, 1148, "tcp" }, - { "elfiq-repl", { NULL }, 1148, "udp" }, - { "bvtsonar", { NULL }, 1149, "tcp" }, - { "bvtsonar", { NULL }, 1149, "udp" }, - { "blaze", { NULL }, 1150, "tcp" }, - { "blaze", { NULL }, 1150, "udp" }, - { "unizensus", { NULL }, 1151, "tcp" }, - { "unizensus", { NULL }, 1151, "udp" }, - { "winpoplanmess", { NULL }, 1152, "tcp" }, - { "winpoplanmess", { NULL }, 1152, "udp" }, - { "c1222-acse", { NULL }, 1153, "tcp" }, - { "c1222-acse", { NULL }, 1153, "udp" }, - { "resacommunity", { NULL }, 1154, "tcp" }, - { "resacommunity", { NULL }, 1154, "udp" }, - { "nfa", { NULL }, 1155, "tcp" }, - { "nfa", { NULL }, 1155, "udp" }, - { "iascontrol-oms", { NULL }, 1156, "tcp" }, - { "iascontrol-oms", { NULL }, 1156, "udp" }, - { "iascontrol", { NULL }, 1157, "tcp" }, - { "iascontrol", { NULL }, 1157, "udp" }, - { "dbcontrol-oms", { NULL }, 1158, "tcp" }, - { "dbcontrol-oms", { NULL }, 1158, "udp" }, - { "oracle-oms", { NULL }, 1159, "tcp" }, - { "oracle-oms", { NULL }, 1159, "udp" }, - { "olsv", { NULL }, 1160, "tcp" }, - { "olsv", { NULL }, 1160, "udp" }, - { "health-polling", { NULL }, 1161, "tcp" }, - { "health-polling", { NULL }, 1161, "udp" }, - { "health-trap", { NULL }, 1162, "tcp" }, - { "health-trap", { NULL }, 1162, "udp" }, - { "sddp", { NULL }, 1163, "tcp" }, - { "sddp", { NULL }, 1163, "udp" }, - { "qsm-proxy", { NULL }, 1164, "tcp" }, - { "qsm-proxy", { NULL }, 1164, "udp" }, - { "qsm-gui", { NULL }, 1165, "tcp" }, - { "qsm-gui", { NULL }, 1165, "udp" }, - { "qsm-remote", { NULL }, 1166, "tcp" }, - { "qsm-remote", { NULL }, 1166, "udp" }, - { "cisco-ipsla", { NULL }, 1167, "tcp" }, - { "cisco-ipsla", { NULL }, 1167, "udp" }, - { "cisco-ipsla", { NULL }, 1167, "sctp"}, - { "vchat", { NULL }, 1168, "tcp" }, - { "vchat", { NULL }, 1168, "udp" }, - { "tripwire", { NULL }, 1169, "tcp" }, - { "tripwire", { NULL }, 1169, "udp" }, - { "atc-lm", { NULL }, 1170, "tcp" }, - { "atc-lm", { NULL }, 1170, "udp" }, - { "atc-appserver", { NULL }, 1171, "tcp" }, - { "atc-appserver", { NULL }, 1171, "udp" }, - { "dnap", { NULL }, 1172, "tcp" }, - { "dnap", { NULL }, 1172, "udp" }, - { "d-cinema-rrp", { NULL }, 1173, "tcp" }, - { "d-cinema-rrp", { NULL }, 1173, "udp" }, - { "fnet-remote-ui", { NULL }, 1174, "tcp" }, - { "fnet-remote-ui", { NULL }, 1174, "udp" }, - { "dossier", { NULL }, 1175, "tcp" }, - { "dossier", { NULL }, 1175, "udp" }, - { "indigo-server", { NULL }, 1176, "tcp" }, - { "indigo-server", { NULL }, 1176, "udp" }, - { "dkmessenger", { NULL }, 1177, "tcp" }, - { "dkmessenger", { NULL }, 1177, "udp" }, - { "sgi-storman", { NULL }, 1178, "tcp" }, - { "sgi-storman", { NULL }, 1178, "udp" }, - { "b2n", { NULL }, 1179, "tcp" }, - { "b2n", { NULL }, 1179, "udp" }, - { "mc-client", { NULL }, 1180, "tcp" }, - { "mc-client", { NULL }, 1180, "udp" }, - { "3comnetman", { NULL }, 1181, "tcp" }, - { "3comnetman", { NULL }, 1181, "udp" }, - { "accelenet", { NULL }, 1182, "tcp" }, - { "accelenet-data", { NULL }, 1182, "udp" }, - { "llsurfup-http", { NULL }, 1183, "tcp" }, - { "llsurfup-http", { NULL }, 1183, "udp" }, - { "llsurfup-https", { NULL }, 1184, "tcp" }, - { "llsurfup-https", { NULL }, 1184, "udp" }, - { "catchpole", { NULL }, 1185, "tcp" }, - { "catchpole", { NULL }, 1185, "udp" }, - { "mysql-cluster", { NULL }, 1186, "tcp" }, - { "mysql-cluster", { NULL }, 1186, "udp" }, - { "alias", { NULL }, 1187, "tcp" }, - { "alias", { NULL }, 1187, "udp" }, - { "hp-webadmin", { NULL }, 1188, "tcp" }, - { "hp-webadmin", { NULL }, 1188, "udp" }, - { "unet", { NULL }, 1189, "tcp" }, - { "unet", { NULL }, 1189, "udp" }, - { "commlinx-avl", { NULL }, 1190, "tcp" }, - { "commlinx-avl", { NULL }, 1190, "udp" }, - { "gpfs", { NULL }, 1191, "tcp" }, - { "gpfs", { NULL }, 1191, "udp" }, - { "caids-sensor", { NULL }, 1192, "tcp" }, - { "caids-sensor", { NULL }, 1192, "udp" }, - { "fiveacross", { NULL }, 1193, "tcp" }, - { "fiveacross", { NULL }, 1193, "udp" }, - { "openvpn", { NULL }, 1194, "tcp" }, - { "openvpn", { NULL }, 1194, "udp" }, - { "rsf-1", { NULL }, 1195, "tcp" }, - { "rsf-1", { NULL }, 1195, "udp" }, - { "netmagic", { NULL }, 1196, "tcp" }, - { "netmagic", { NULL }, 1196, "udp" }, - { "carrius-rshell", { NULL }, 1197, "tcp" }, - { "carrius-rshell", { NULL }, 1197, "udp" }, - { "cajo-discovery", { NULL }, 1198, "tcp" }, - { "cajo-discovery", { NULL }, 1198, "udp" }, - { "dmidi", { NULL }, 1199, "tcp" }, - { "dmidi", { NULL }, 1199, "udp" }, - { "scol", { NULL }, 1200, "tcp" }, - { "scol", { NULL }, 1200, "udp" }, - { "nucleus-sand", { NULL }, 1201, "tcp" }, - { "nucleus-sand", { NULL }, 1201, "udp" }, - { "caiccipc", { NULL }, 1202, "tcp" }, - { "caiccipc", { NULL }, 1202, "udp" }, - { "ssslic-mgr", { NULL }, 1203, "tcp" }, - { "ssslic-mgr", { NULL }, 1203, "udp" }, - { "ssslog-mgr", { NULL }, 1204, "tcp" }, - { "ssslog-mgr", { NULL }, 1204, "udp" }, - { "accord-mgc", { NULL }, 1205, "tcp" }, - { "accord-mgc", { NULL }, 1205, "udp" }, - { "anthony-data", { NULL }, 1206, "tcp" }, - { "anthony-data", { NULL }, 1206, "udp" }, - { "metasage", { NULL }, 1207, "tcp" }, - { "metasage", { NULL }, 1207, "udp" }, - { "seagull-ais", { NULL }, 1208, "tcp" }, - { "seagull-ais", { NULL }, 1208, "udp" }, - { "ipcd3", { NULL }, 1209, "tcp" }, - { "ipcd3", { NULL }, 1209, "udp" }, - { "eoss", { NULL }, 1210, "tcp" }, - { "eoss", { NULL }, 1210, "udp" }, - { "groove-dpp", { NULL }, 1211, "tcp" }, - { "groove-dpp", { NULL }, 1211, "udp" }, - { "lupa", { NULL }, 1212, "tcp" }, - { "lupa", { NULL }, 1212, "udp" }, - { "mpc-lifenet", { NULL }, 1213, "tcp" }, - { "mpc-lifenet", { NULL }, 1213, "udp" }, - { "kazaa", { NULL }, 1214, "tcp" }, - { "kazaa", { NULL }, 1214, "udp" }, - { "scanstat-1", { NULL }, 1215, "tcp" }, - { "scanstat-1", { NULL }, 1215, "udp" }, - { "etebac5", { NULL }, 1216, "tcp" }, - { "etebac5", { NULL }, 1216, "udp" }, - { "hpss-ndapi", { NULL }, 1217, "tcp" }, - { "hpss-ndapi", { NULL }, 1217, "udp" }, - { "aeroflight-ads", { NULL }, 1218, "tcp" }, - { "aeroflight-ads", { NULL }, 1218, "udp" }, - { "aeroflight-ret", { NULL }, 1219, "tcp" }, - { "aeroflight-ret", { NULL }, 1219, "udp" }, - { "qt-serveradmin", { NULL }, 1220, "tcp" }, - { "qt-serveradmin", { NULL }, 1220, "udp" }, - { "sweetware-apps", { NULL }, 1221, "tcp" }, - { "sweetware-apps", { NULL }, 1221, "udp" }, - { "nerv", { NULL }, 1222, "tcp" }, - { "nerv", { NULL }, 1222, "udp" }, - { "tgp", { NULL }, 1223, "tcp" }, - { "tgp", { NULL }, 1223, "udp" }, - { "vpnz", { NULL }, 1224, "tcp" }, - { "vpnz", { NULL }, 1224, "udp" }, - { "slinkysearch", { NULL }, 1225, "tcp" }, - { "slinkysearch", { NULL }, 1225, "udp" }, - { "stgxfws", { NULL }, 1226, "tcp" }, - { "stgxfws", { NULL }, 1226, "udp" }, - { "dns2go", { NULL }, 1227, "tcp" }, - { "dns2go", { NULL }, 1227, "udp" }, - { "florence", { NULL }, 1228, "tcp" }, - { "florence", { NULL }, 1228, "udp" }, - { "zented", { NULL }, 1229, "tcp" }, - { "zented", { NULL }, 1229, "udp" }, - { "periscope", { NULL }, 1230, "tcp" }, - { "periscope", { NULL }, 1230, "udp" }, - { "menandmice-lpm", { NULL }, 1231, "tcp" }, - { "menandmice-lpm", { NULL }, 1231, "udp" }, - { "univ-appserver", { NULL }, 1233, "tcp" }, - { "univ-appserver", { NULL }, 1233, "udp" }, - { "search-agent", { NULL }, 1234, "tcp" }, - { "search-agent", { NULL }, 1234, "udp" }, - { "mosaicsyssvc1", { NULL }, 1235, "tcp" }, - { "mosaicsyssvc1", { NULL }, 1235, "udp" }, - { "bvcontrol", { NULL }, 1236, "tcp" }, - { "bvcontrol", { NULL }, 1236, "udp" }, - { "tsdos390", { NULL }, 1237, "tcp" }, - { "tsdos390", { NULL }, 1237, "udp" }, - { "hacl-qs", { NULL }, 1238, "tcp" }, - { "hacl-qs", { NULL }, 1238, "udp" }, - { "nmsd", { NULL }, 1239, "tcp" }, - { "nmsd", { NULL }, 1239, "udp" }, - { "instantia", { NULL }, 1240, "tcp" }, - { "instantia", { NULL }, 1240, "udp" }, - { "nessus", { NULL }, 1241, "tcp" }, - { "nessus", { NULL }, 1241, "udp" }, - { "nmasoverip", { NULL }, 1242, "tcp" }, - { "nmasoverip", { NULL }, 1242, "udp" }, - { "serialgateway", { NULL }, 1243, "tcp" }, - { "serialgateway", { NULL }, 1243, "udp" }, - { "isbconference1", { NULL }, 1244, "tcp" }, - { "isbconference1", { NULL }, 1244, "udp" }, - { "isbconference2", { NULL }, 1245, "tcp" }, - { "isbconference2", { NULL }, 1245, "udp" }, - { "payrouter", { NULL }, 1246, "tcp" }, - { "payrouter", { NULL }, 1246, "udp" }, - { "visionpyramid", { NULL }, 1247, "tcp" }, - { "visionpyramid", { NULL }, 1247, "udp" }, - { "hermes", { NULL }, 1248, "tcp" }, - { "hermes", { NULL }, 1248, "udp" }, - { "mesavistaco", { NULL }, 1249, "tcp" }, - { "mesavistaco", { NULL }, 1249, "udp" }, - { "swldy-sias", { NULL }, 1250, "tcp" }, - { "swldy-sias", { NULL }, 1250, "udp" }, - { "servergraph", { NULL }, 1251, "tcp" }, - { "servergraph", { NULL }, 1251, "udp" }, - { "bspne-pcc", { NULL }, 1252, "tcp" }, - { "bspne-pcc", { NULL }, 1252, "udp" }, - { "q55-pcc", { NULL }, 1253, "tcp" }, - { "q55-pcc", { NULL }, 1253, "udp" }, - { "de-noc", { NULL }, 1254, "tcp" }, - { "de-noc", { NULL }, 1254, "udp" }, - { "de-cache-query", { NULL }, 1255, "tcp" }, - { "de-cache-query", { NULL }, 1255, "udp" }, - { "de-server", { NULL }, 1256, "tcp" }, - { "de-server", { NULL }, 1256, "udp" }, - { "shockwave2", { NULL }, 1257, "tcp" }, - { "shockwave2", { NULL }, 1257, "udp" }, - { "opennl", { NULL }, 1258, "tcp" }, - { "opennl", { NULL }, 1258, "udp" }, - { "opennl-voice", { NULL }, 1259, "tcp" }, - { "opennl-voice", { NULL }, 1259, "udp" }, - { "ibm-ssd", { NULL }, 1260, "tcp" }, - { "ibm-ssd", { NULL }, 1260, "udp" }, - { "mpshrsv", { NULL }, 1261, "tcp" }, - { "mpshrsv", { NULL }, 1261, "udp" }, - { "qnts-orb", { NULL }, 1262, "tcp" }, - { "qnts-orb", { NULL }, 1262, "udp" }, - { "dka", { NULL }, 1263, "tcp" }, - { "dka", { NULL }, 1263, "udp" }, - { "prat", { NULL }, 1264, "tcp" }, - { "prat", { NULL }, 1264, "udp" }, - { "dssiapi", { NULL }, 1265, "tcp" }, - { "dssiapi", { NULL }, 1265, "udp" }, - { "dellpwrappks", { NULL }, 1266, "tcp" }, - { "dellpwrappks", { NULL }, 1266, "udp" }, - { "epc", { NULL }, 1267, "tcp" }, - { "epc", { NULL }, 1267, "udp" }, - { "propel-msgsys", { NULL }, 1268, "tcp" }, - { "propel-msgsys", { NULL }, 1268, "udp" }, - { "watilapp", { NULL }, 1269, "tcp" }, - { "watilapp", { NULL }, 1269, "udp" }, - { "opsmgr", { NULL }, 1270, "tcp" }, - { "opsmgr", { NULL }, 1270, "udp" }, - { "excw", { NULL }, 1271, "tcp" }, - { "excw", { NULL }, 1271, "udp" }, - { "cspmlockmgr", { NULL }, 1272, "tcp" }, - { "cspmlockmgr", { NULL }, 1272, "udp" }, - { "emc-gateway", { NULL }, 1273, "tcp" }, - { "emc-gateway", { NULL }, 1273, "udp" }, - { "t1distproc", { NULL }, 1274, "tcp" }, - { "t1distproc", { NULL }, 1274, "udp" }, - { "ivcollector", { NULL }, 1275, "tcp" }, - { "ivcollector", { NULL }, 1275, "udp" }, - { "ivmanager", { NULL }, 1276, "tcp" }, - { "ivmanager", { NULL }, 1276, "udp" }, - { "miva-mqs", { NULL }, 1277, "tcp" }, - { "miva-mqs", { NULL }, 1277, "udp" }, - { "dellwebadmin-1", { NULL }, 1278, "tcp" }, - { "dellwebadmin-1", { NULL }, 1278, "udp" }, - { "dellwebadmin-2", { NULL }, 1279, "tcp" }, - { "dellwebadmin-2", { NULL }, 1279, "udp" }, - { "pictrography", { NULL }, 1280, "tcp" }, - { "pictrography", { NULL }, 1280, "udp" }, - { "healthd", { NULL }, 1281, "tcp" }, - { "healthd", { NULL }, 1281, "udp" }, - { "emperion", { NULL }, 1282, "tcp" }, - { "emperion", { NULL }, 1282, "udp" }, - { "productinfo", { NULL }, 1283, "tcp" }, - { "productinfo", { NULL }, 1283, "udp" }, - { "iee-qfx", { NULL }, 1284, "tcp" }, - { "iee-qfx", { NULL }, 1284, "udp" }, - { "neoiface", { NULL }, 1285, "tcp" }, - { "neoiface", { NULL }, 1285, "udp" }, - { "netuitive", { NULL }, 1286, "tcp" }, - { "netuitive", { NULL }, 1286, "udp" }, - { "routematch", { NULL }, 1287, "tcp" }, - { "routematch", { NULL }, 1287, "udp" }, - { "navbuddy", { NULL }, 1288, "tcp" }, - { "navbuddy", { NULL }, 1288, "udp" }, - { "jwalkserver", { NULL }, 1289, "tcp" }, - { "jwalkserver", { NULL }, 1289, "udp" }, - { "winjaserver", { NULL }, 1290, "tcp" }, - { "winjaserver", { NULL }, 1290, "udp" }, - { "seagulllms", { NULL }, 1291, "tcp" }, - { "seagulllms", { NULL }, 1291, "udp" }, - { "dsdn", { NULL }, 1292, "tcp" }, - { "dsdn", { NULL }, 1292, "udp" }, - { "pkt-krb-ipsec", { NULL }, 1293, "tcp" }, - { "pkt-krb-ipsec", { NULL }, 1293, "udp" }, - { "cmmdriver", { NULL }, 1294, "tcp" }, - { "cmmdriver", { NULL }, 1294, "udp" }, - { "ehtp", { NULL }, 1295, "tcp" }, - { "ehtp", { NULL }, 1295, "udp" }, - { "dproxy", { NULL }, 1296, "tcp" }, - { "dproxy", { NULL }, 1296, "udp" }, - { "sdproxy", { NULL }, 1297, "tcp" }, - { "sdproxy", { NULL }, 1297, "udp" }, - { "lpcp", { NULL }, 1298, "tcp" }, - { "lpcp", { NULL }, 1298, "udp" }, - { "hp-sci", { NULL }, 1299, "tcp" }, - { "hp-sci", { NULL }, 1299, "udp" }, - { "h323hostcallsc", { NULL }, 1300, "tcp" }, - { "h323hostcallsc", { NULL }, 1300, "udp" }, - { "ci3-software-1", { NULL }, 1301, "tcp" }, - { "ci3-software-1", { NULL }, 1301, "udp" }, - { "ci3-software-2", { NULL }, 1302, "tcp" }, - { "ci3-software-2", { NULL }, 1302, "udp" }, - { "sftsrv", { NULL }, 1303, "tcp" }, - { "sftsrv", { NULL }, 1303, "udp" }, - { "boomerang", { NULL }, 1304, "tcp" }, - { "boomerang", { NULL }, 1304, "udp" }, - { "pe-mike", { NULL }, 1305, "tcp" }, - { "pe-mike", { NULL }, 1305, "udp" }, - { "re-conn-proto", { NULL }, 1306, "tcp" }, - { "re-conn-proto", { NULL }, 1306, "udp" }, - { "pacmand", { NULL }, 1307, "tcp" }, - { "pacmand", { NULL }, 1307, "udp" }, - { "odsi", { NULL }, 1308, "tcp" }, - { "odsi", { NULL }, 1308, "udp" }, - { "jtag-server", { NULL }, 1309, "tcp" }, - { "jtag-server", { NULL }, 1309, "udp" }, - { "husky", { NULL }, 1310, "tcp" }, - { "husky", { NULL }, 1310, "udp" }, - { "rxmon", { NULL }, 1311, "tcp" }, - { "rxmon", { NULL }, 1311, "udp" }, - { "sti-envision", { NULL }, 1312, "tcp" }, - { "sti-envision", { NULL }, 1312, "udp" }, - { "bmc_patroldb", { NULL }, 1313, "tcp" }, - { "bmc_patroldb", { NULL }, 1313, "udp" }, - { "pdps", { NULL }, 1314, "tcp" }, - { "pdps", { NULL }, 1314, "udp" }, - { "els", { NULL }, 1315, "tcp" }, - { "els", { NULL }, 1315, "udp" }, - { "exbit-escp", { NULL }, 1316, "tcp" }, - { "exbit-escp", { NULL }, 1316, "udp" }, - { "vrts-ipcserver", { NULL }, 1317, "tcp" }, - { "vrts-ipcserver", { NULL }, 1317, "udp" }, - { "krb5gatekeeper", { NULL }, 1318, "tcp" }, - { "krb5gatekeeper", { NULL }, 1318, "udp" }, - { "amx-icsp", { NULL }, 1319, "tcp" }, - { "amx-icsp", { NULL }, 1319, "udp" }, - { "amx-axbnet", { NULL }, 1320, "tcp" }, - { "amx-axbnet", { NULL }, 1320, "udp" }, - { "pip", { NULL }, 1321, "tcp" }, - { "pip", { NULL }, 1321, "udp" }, - { "novation", { NULL }, 1322, "tcp" }, - { "novation", { NULL }, 1322, "udp" }, - { "brcd", { NULL }, 1323, "tcp" }, - { "brcd", { NULL }, 1323, "udp" }, - { "delta-mcp", { NULL }, 1324, "tcp" }, - { "delta-mcp", { NULL }, 1324, "udp" }, - { "dx-instrument", { NULL }, 1325, "tcp" }, - { "dx-instrument", { NULL }, 1325, "udp" }, - { "wimsic", { NULL }, 1326, "tcp" }, - { "wimsic", { NULL }, 1326, "udp" }, - { "ultrex", { NULL }, 1327, "tcp" }, - { "ultrex", { NULL }, 1327, "udp" }, - { "ewall", { NULL }, 1328, "tcp" }, - { "ewall", { NULL }, 1328, "udp" }, - { "netdb-export", { NULL }, 1329, "tcp" }, - { "netdb-export", { NULL }, 1329, "udp" }, - { "streetperfect", { NULL }, 1330, "tcp" }, - { "streetperfect", { NULL }, 1330, "udp" }, - { "intersan", { NULL }, 1331, "tcp" }, - { "intersan", { NULL }, 1331, "udp" }, - { "pcia-rxp-b", { NULL }, 1332, "tcp" }, - { "pcia-rxp-b", { NULL }, 1332, "udp" }, - { "passwrd-policy", { NULL }, 1333, "tcp" }, - { "passwrd-policy", { NULL }, 1333, "udp" }, - { "writesrv", { NULL }, 1334, "tcp" }, - { "writesrv", { NULL }, 1334, "udp" }, - { "digital-notary", { NULL }, 1335, "tcp" }, - { "digital-notary", { NULL }, 1335, "udp" }, - { "ischat", { NULL }, 1336, "tcp" }, - { "ischat", { NULL }, 1336, "udp" }, - { "menandmice-dns", { NULL }, 1337, "tcp" }, - { "menandmice-dns", { NULL }, 1337, "udp" }, - { "wmc-log-svc", { NULL }, 1338, "tcp" }, - { "wmc-log-svc", { NULL }, 1338, "udp" }, - { "kjtsiteserver", { NULL }, 1339, "tcp" }, - { "kjtsiteserver", { NULL }, 1339, "udp" }, - { "naap", { NULL }, 1340, "tcp" }, - { "naap", { NULL }, 1340, "udp" }, - { "qubes", { NULL }, 1341, "tcp" }, - { "qubes", { NULL }, 1341, "udp" }, - { "esbroker", { NULL }, 1342, "tcp" }, - { "esbroker", { NULL }, 1342, "udp" }, - { "re101", { NULL }, 1343, "tcp" }, - { "re101", { NULL }, 1343, "udp" }, - { "icap", { NULL }, 1344, "tcp" }, - { "icap", { NULL }, 1344, "udp" }, - { "vpjp", { NULL }, 1345, "tcp" }, - { "vpjp", { NULL }, 1345, "udp" }, - { "alta-ana-lm", { NULL }, 1346, "tcp" }, - { "alta-ana-lm", { NULL }, 1346, "udp" }, - { "bbn-mmc", { NULL }, 1347, "tcp" }, - { "bbn-mmc", { NULL }, 1347, "udp" }, - { "bbn-mmx", { NULL }, 1348, "tcp" }, - { "bbn-mmx", { NULL }, 1348, "udp" }, - { "sbook", { NULL }, 1349, "tcp" }, - { "sbook", { NULL }, 1349, "udp" }, - { "editbench", { NULL }, 1350, "tcp" }, - { "editbench", { NULL }, 1350, "udp" }, - { "equationbuilder", { NULL }, 1351, "tcp" }, - { "equationbuilder", { NULL }, 1351, "udp" }, - { "lotusnote", { NULL }, 1352, "tcp" }, - { "lotusnote", { NULL }, 1352, "udp" }, - { "relief", { NULL }, 1353, "tcp" }, - { "relief", { NULL }, 1353, "udp" }, - { "XSIP-network", { NULL }, 1354, "tcp" }, - { "XSIP-network", { NULL }, 1354, "udp" }, - { "intuitive-edge", { NULL }, 1355, "tcp" }, - { "intuitive-edge", { NULL }, 1355, "udp" }, - { "cuillamartin", { NULL }, 1356, "tcp" }, - { "cuillamartin", { NULL }, 1356, "udp" }, - { "pegboard", { NULL }, 1357, "tcp" }, - { "pegboard", { NULL }, 1357, "udp" }, - { "connlcli", { NULL }, 1358, "tcp" }, - { "connlcli", { NULL }, 1358, "udp" }, - { "ftsrv", { NULL }, 1359, "tcp" }, - { "ftsrv", { NULL }, 1359, "udp" }, - { "mimer", { NULL }, 1360, "tcp" }, - { "mimer", { NULL }, 1360, "udp" }, - { "linx", { NULL }, 1361, "tcp" }, - { "linx", { NULL }, 1361, "udp" }, - { "timeflies", { NULL }, 1362, "tcp" }, - { "timeflies", { NULL }, 1362, "udp" }, - { "ndm-requester", { NULL }, 1363, "tcp" }, - { "ndm-requester", { NULL }, 1363, "udp" }, - { "ndm-server", { NULL }, 1364, "tcp" }, - { "ndm-server", { NULL }, 1364, "udp" }, - { "adapt-sna", { NULL }, 1365, "tcp" }, - { "adapt-sna", { NULL }, 1365, "udp" }, - { "netware-csp", { NULL }, 1366, "tcp" }, - { "netware-csp", { NULL }, 1366, "udp" }, - { "dcs", { NULL }, 1367, "tcp" }, - { "dcs", { NULL }, 1367, "udp" }, - { "screencast", { NULL }, 1368, "tcp" }, - { "screencast", { NULL }, 1368, "udp" }, - { "gv-us", { NULL }, 1369, "tcp" }, - { "gv-us", { NULL }, 1369, "udp" }, - { "us-gv", { NULL }, 1370, "tcp" }, - { "us-gv", { NULL }, 1370, "udp" }, - { "fc-cli", { NULL }, 1371, "tcp" }, - { "fc-cli", { NULL }, 1371, "udp" }, - { "fc-ser", { NULL }, 1372, "tcp" }, - { "fc-ser", { NULL }, 1372, "udp" }, - { "chromagrafx", { NULL }, 1373, "tcp" }, - { "chromagrafx", { NULL }, 1373, "udp" }, - { "molly", { NULL }, 1374, "tcp" }, - { "molly", { NULL }, 1374, "udp" }, - { "bytex", { NULL }, 1375, "tcp" }, - { "bytex", { NULL }, 1375, "udp" }, - { "ibm-pps", { NULL }, 1376, "tcp" }, - { "ibm-pps", { NULL }, 1376, "udp" }, - { "cichlid", { NULL }, 1377, "tcp" }, - { "cichlid", { NULL }, 1377, "udp" }, - { "elan", { NULL }, 1378, "tcp" }, - { "elan", { NULL }, 1378, "udp" }, - { "dbreporter", { NULL }, 1379, "tcp" }, - { "dbreporter", { NULL }, 1379, "udp" }, - { "telesis-licman", { NULL }, 1380, "tcp" }, - { "telesis-licman", { NULL }, 1380, "udp" }, - { "apple-licman", { NULL }, 1381, "tcp" }, - { "apple-licman", { NULL }, 1381, "udp" }, - { "udt_os", { NULL }, 1382, "tcp" }, - { "udt_os", { NULL }, 1382, "udp" }, - { "gwha", { NULL }, 1383, "tcp" }, - { "gwha", { NULL }, 1383, "udp" }, - { "os-licman", { NULL }, 1384, "tcp" }, - { "os-licman", { NULL }, 1384, "udp" }, - { "atex_elmd", { NULL }, 1385, "tcp" }, - { "atex_elmd", { NULL }, 1385, "udp" }, - { "checksum", { NULL }, 1386, "tcp" }, - { "checksum", { NULL }, 1386, "udp" }, - { "cadsi-lm", { NULL }, 1387, "tcp" }, - { "cadsi-lm", { NULL }, 1387, "udp" }, - { "objective-dbc", { NULL }, 1388, "tcp" }, - { "objective-dbc", { NULL }, 1388, "udp" }, - { "iclpv-dm", { NULL }, 1389, "tcp" }, - { "iclpv-dm", { NULL }, 1389, "udp" }, - { "iclpv-sc", { NULL }, 1390, "tcp" }, - { "iclpv-sc", { NULL }, 1390, "udp" }, - { "iclpv-sas", { NULL }, 1391, "tcp" }, - { "iclpv-sas", { NULL }, 1391, "udp" }, - { "iclpv-pm", { NULL }, 1392, "tcp" }, - { "iclpv-pm", { NULL }, 1392, "udp" }, - { "iclpv-nls", { NULL }, 1393, "tcp" }, - { "iclpv-nls", { NULL }, 1393, "udp" }, - { "iclpv-nlc", { NULL }, 1394, "tcp" }, - { "iclpv-nlc", { NULL }, 1394, "udp" }, - { "iclpv-wsm", { NULL }, 1395, "tcp" }, - { "iclpv-wsm", { NULL }, 1395, "udp" }, - { "dvl-activemail", { NULL }, 1396, "tcp" }, - { "dvl-activemail", { NULL }, 1396, "udp" }, - { "audio-activmail", { NULL }, 1397, "tcp" }, - { "audio-activmail", { NULL }, 1397, "udp" }, - { "video-activmail", { NULL }, 1398, "tcp" }, - { "video-activmail", { NULL }, 1398, "udp" }, - { "cadkey-licman", { NULL }, 1399, "tcp" }, - { "cadkey-licman", { NULL }, 1399, "udp" }, - { "cadkey-tablet", { NULL }, 1400, "tcp" }, - { "cadkey-tablet", { NULL }, 1400, "udp" }, - { "goldleaf-licman", { NULL }, 1401, "tcp" }, - { "goldleaf-licman", { NULL }, 1401, "udp" }, - { "prm-sm-np", { NULL }, 1402, "tcp" }, - { "prm-sm-np", { NULL }, 1402, "udp" }, - { "prm-nm-np", { NULL }, 1403, "tcp" }, - { "prm-nm-np", { NULL }, 1403, "udp" }, - { "igi-lm", { NULL }, 1404, "tcp" }, - { "igi-lm", { NULL }, 1404, "udp" }, - { "ibm-res", { NULL }, 1405, "tcp" }, - { "ibm-res", { NULL }, 1405, "udp" }, - { "netlabs-lm", { NULL }, 1406, "tcp" }, - { "netlabs-lm", { NULL }, 1406, "udp" }, - { "dbsa-lm", { NULL }, 1407, "tcp" }, - { "dbsa-lm", { NULL }, 1407, "udp" }, - { "sophia-lm", { NULL }, 1408, "tcp" }, - { "sophia-lm", { NULL }, 1408, "udp" }, - { "here-lm", { NULL }, 1409, "tcp" }, - { "here-lm", { NULL }, 1409, "udp" }, - { "hiq", { NULL }, 1410, "tcp" }, - { "hiq", { NULL }, 1410, "udp" }, - { "af", { NULL }, 1411, "tcp" }, - { "af", { NULL }, 1411, "udp" }, - { "innosys", { NULL }, 1412, "tcp" }, - { "innosys", { NULL }, 1412, "udp" }, - { "innosys-acl", { NULL }, 1413, "tcp" }, - { "innosys-acl", { NULL }, 1413, "udp" }, - { "ibm-mqseries", { NULL }, 1414, "tcp" }, - { "ibm-mqseries", { NULL }, 1414, "udp" }, - { "dbstar", { NULL }, 1415, "tcp" }, - { "dbstar", { NULL }, 1415, "udp" }, - { "novell-lu6.2", { NULL }, 1416, "tcp" }, - { "novell-lu6.2", { NULL }, 1416, "udp" }, - { "timbuktu-srv1", { NULL }, 1417, "tcp" }, - { "timbuktu-srv1", { NULL }, 1417, "udp" }, - { "timbuktu-srv2", { NULL }, 1418, "tcp" }, - { "timbuktu-srv2", { NULL }, 1418, "udp" }, - { "timbuktu-srv3", { NULL }, 1419, "tcp" }, - { "timbuktu-srv3", { NULL }, 1419, "udp" }, - { "timbuktu-srv4", { NULL }, 1420, "tcp" }, - { "timbuktu-srv4", { NULL }, 1420, "udp" }, - { "gandalf-lm", { NULL }, 1421, "tcp" }, - { "gandalf-lm", { NULL }, 1421, "udp" }, - { "autodesk-lm", { NULL }, 1422, "tcp" }, - { "autodesk-lm", { NULL }, 1422, "udp" }, - { "essbase", { NULL }, 1423, "tcp" }, - { "essbase", { NULL }, 1423, "udp" }, - { "hybrid", { NULL }, 1424, "tcp" }, - { "hybrid", { NULL }, 1424, "udp" }, - { "zion-lm", { NULL }, 1425, "tcp" }, - { "zion-lm", { NULL }, 1425, "udp" }, - { "sais", { NULL }, 1426, "tcp" }, - { "sais", { NULL }, 1426, "udp" }, - { "mloadd", { NULL }, 1427, "tcp" }, - { "mloadd", { NULL }, 1427, "udp" }, - { "informatik-lm", { NULL }, 1428, "tcp" }, - { "informatik-lm", { NULL }, 1428, "udp" }, - { "nms", { NULL }, 1429, "tcp" }, - { "nms", { NULL }, 1429, "udp" }, - { "tpdu", { NULL }, 1430, "tcp" }, - { "tpdu", { NULL }, 1430, "udp" }, - { "rgtp", { NULL }, 1431, "tcp" }, - { "rgtp", { NULL }, 1431, "udp" }, - { "blueberry-lm", { NULL }, 1432, "tcp" }, - { "blueberry-lm", { NULL }, 1432, "udp" }, - { "ms-sql-s", { NULL }, 1433, "tcp" }, - { "ms-sql-s", { NULL }, 1433, "udp" }, - { "ms-sql-m", { NULL }, 1434, "tcp" }, - { "ms-sql-m", { NULL }, 1434, "udp" }, - { "ibm-cics", { NULL }, 1435, "tcp" }, - { "ibm-cics", { NULL }, 1435, "udp" }, - { "saism", { NULL }, 1436, "tcp" }, - { "saism", { NULL }, 1436, "udp" }, - { "tabula", { NULL }, 1437, "tcp" }, - { "tabula", { NULL }, 1437, "udp" }, - { "eicon-server", { NULL }, 1438, "tcp" }, - { "eicon-server", { NULL }, 1438, "udp" }, - { "eicon-x25", { NULL }, 1439, "tcp" }, - { "eicon-x25", { NULL }, 1439, "udp" }, - { "eicon-slp", { NULL }, 1440, "tcp" }, - { "eicon-slp", { NULL }, 1440, "udp" }, - { "cadis-1", { NULL }, 1441, "tcp" }, - { "cadis-1", { NULL }, 1441, "udp" }, - { "cadis-2", { NULL }, 1442, "tcp" }, - { "cadis-2", { NULL }, 1442, "udp" }, - { "ies-lm", { NULL }, 1443, "tcp" }, - { "ies-lm", { NULL }, 1443, "udp" }, - { "marcam-lm", { NULL }, 1444, "tcp" }, - { "marcam-lm", { NULL }, 1444, "udp" }, - { "proxima-lm", { NULL }, 1445, "tcp" }, - { "proxima-lm", { NULL }, 1445, "udp" }, - { "ora-lm", { NULL }, 1446, "tcp" }, - { "ora-lm", { NULL }, 1446, "udp" }, - { "apri-lm", { NULL }, 1447, "tcp" }, - { "apri-lm", { NULL }, 1447, "udp" }, - { "oc-lm", { NULL }, 1448, "tcp" }, - { "oc-lm", { NULL }, 1448, "udp" }, - { "peport", { NULL }, 1449, "tcp" }, - { "peport", { NULL }, 1449, "udp" }, - { "dwf", { NULL }, 1450, "tcp" }, - { "dwf", { NULL }, 1450, "udp" }, - { "infoman", { NULL }, 1451, "tcp" }, - { "infoman", { NULL }, 1451, "udp" }, - { "gtegsc-lm", { NULL }, 1452, "tcp" }, - { "gtegsc-lm", { NULL }, 1452, "udp" }, - { "genie-lm", { NULL }, 1453, "tcp" }, - { "genie-lm", { NULL }, 1453, "udp" }, - { "interhdl_elmd", { NULL }, 1454, "tcp" }, - { "interhdl_elmd", { NULL }, 1454, "udp" }, - { "esl-lm", { NULL }, 1455, "tcp" }, - { "esl-lm", { NULL }, 1455, "udp" }, - { "dca", { NULL }, 1456, "tcp" }, - { "dca", { NULL }, 1456, "udp" }, - { "valisys-lm", { NULL }, 1457, "tcp" }, - { "valisys-lm", { NULL }, 1457, "udp" }, - { "nrcabq-lm", { NULL }, 1458, "tcp" }, - { "nrcabq-lm", { NULL }, 1458, "udp" }, - { "proshare1", { NULL }, 1459, "tcp" }, - { "proshare1", { NULL }, 1459, "udp" }, - { "proshare2", { NULL }, 1460, "tcp" }, - { "proshare2", { NULL }, 1460, "udp" }, - { "ibm_wrless_lan", { NULL }, 1461, "tcp" }, - { "ibm_wrless_lan", { NULL }, 1461, "udp" }, - { "world-lm", { NULL }, 1462, "tcp" }, - { "world-lm", { NULL }, 1462, "udp" }, - { "nucleus", { NULL }, 1463, "tcp" }, - { "nucleus", { NULL }, 1463, "udp" }, - { "msl_lmd", { NULL }, 1464, "tcp" }, - { "msl_lmd", { NULL }, 1464, "udp" }, - { "pipes", { NULL }, 1465, "tcp" }, - { "pipes", { NULL }, 1465, "udp" }, - { "oceansoft-lm", { NULL }, 1466, "tcp" }, - { "oceansoft-lm", { NULL }, 1466, "udp" }, - { "csdmbase", { NULL }, 1467, "tcp" }, - { "csdmbase", { NULL }, 1467, "udp" }, - { "csdm", { NULL }, 1468, "tcp" }, - { "csdm", { NULL }, 1468, "udp" }, - { "aal-lm", { NULL }, 1469, "tcp" }, - { "aal-lm", { NULL }, 1469, "udp" }, - { "uaiact", { NULL }, 1470, "tcp" }, - { "uaiact", { NULL }, 1470, "udp" }, - { "csdmbase", { NULL }, 1471, "tcp" }, - { "csdmbase", { NULL }, 1471, "udp" }, - { "csdm", { NULL }, 1472, "tcp" }, - { "csdm", { NULL }, 1472, "udp" }, - { "openmath", { NULL }, 1473, "tcp" }, - { "openmath", { NULL }, 1473, "udp" }, - { "telefinder", { NULL }, 1474, "tcp" }, - { "telefinder", { NULL }, 1474, "udp" }, - { "taligent-lm", { NULL }, 1475, "tcp" }, - { "taligent-lm", { NULL }, 1475, "udp" }, - { "clvm-cfg", { NULL }, 1476, "tcp" }, - { "clvm-cfg", { NULL }, 1476, "udp" }, - { "ms-sna-server", { NULL }, 1477, "tcp" }, - { "ms-sna-server", { NULL }, 1477, "udp" }, - { "ms-sna-base", { NULL }, 1478, "tcp" }, - { "ms-sna-base", { NULL }, 1478, "udp" }, - { "dberegister", { NULL }, 1479, "tcp" }, - { "dberegister", { NULL }, 1479, "udp" }, - { "pacerforum", { NULL }, 1480, "tcp" }, - { "pacerforum", { NULL }, 1480, "udp" }, - { "airs", { NULL }, 1481, "tcp" }, - { "airs", { NULL }, 1481, "udp" }, - { "miteksys-lm", { NULL }, 1482, "tcp" }, - { "miteksys-lm", { NULL }, 1482, "udp" }, - { "afs", { NULL }, 1483, "tcp" }, - { "afs", { NULL }, 1483, "udp" }, - { "confluent", { NULL }, 1484, "tcp" }, - { "confluent", { NULL }, 1484, "udp" }, - { "lansource", { NULL }, 1485, "tcp" }, - { "lansource", { NULL }, 1485, "udp" }, - { "nms_topo_serv", { NULL }, 1486, "tcp" }, - { "nms_topo_serv", { NULL }, 1486, "udp" }, - { "localinfosrvr", { NULL }, 1487, "tcp" }, - { "localinfosrvr", { NULL }, 1487, "udp" }, - { "docstor", { NULL }, 1488, "tcp" }, - { "docstor", { NULL }, 1488, "udp" }, - { "dmdocbroker", { NULL }, 1489, "tcp" }, - { "dmdocbroker", { NULL }, 1489, "udp" }, - { "insitu-conf", { NULL }, 1490, "tcp" }, - { "insitu-conf", { NULL }, 1490, "udp" }, - { "stone-design-1", { NULL }, 1492, "tcp" }, - { "stone-design-1", { NULL }, 1492, "udp" }, - { "netmap_lm", { NULL }, 1493, "tcp" }, - { "netmap_lm", { NULL }, 1493, "udp" }, - { "ica", { NULL }, 1494, "tcp" }, - { "ica", { NULL }, 1494, "udp" }, - { "cvc", { NULL }, 1495, "tcp" }, - { "cvc", { NULL }, 1495, "udp" }, - { "liberty-lm", { NULL }, 1496, "tcp" }, - { "liberty-lm", { NULL }, 1496, "udp" }, - { "rfx-lm", { NULL }, 1497, "tcp" }, - { "rfx-lm", { NULL }, 1497, "udp" }, - { "sybase-sqlany", { NULL }, 1498, "tcp" }, - { "sybase-sqlany", { NULL }, 1498, "udp" }, - { "fhc", { NULL }, 1499, "tcp" }, - { "fhc", { NULL }, 1499, "udp" }, - { "vlsi-lm", { NULL }, 1500, "tcp" }, - { "vlsi-lm", { NULL }, 1500, "udp" }, - { "saiscm", { NULL }, 1501, "tcp" }, - { "saiscm", { NULL }, 1501, "udp" }, - { "shivadiscovery", { NULL }, 1502, "tcp" }, - { "shivadiscovery", { NULL }, 1502, "udp" }, - { "imtc-mcs", { NULL }, 1503, "tcp" }, - { "imtc-mcs", { NULL }, 1503, "udp" }, - { "evb-elm", { NULL }, 1504, "tcp" }, - { "evb-elm", { NULL }, 1504, "udp" }, - { "funkproxy", { NULL }, 1505, "tcp" }, - { "funkproxy", { NULL }, 1505, "udp" }, - { "utcd", { NULL }, 1506, "tcp" }, - { "utcd", { NULL }, 1506, "udp" }, - { "symplex", { NULL }, 1507, "tcp" }, - { "symplex", { NULL }, 1507, "udp" }, - { "diagmond", { NULL }, 1508, "tcp" }, - { "diagmond", { NULL }, 1508, "udp" }, - { "robcad-lm", { NULL }, 1509, "tcp" }, - { "robcad-lm", { NULL }, 1509, "udp" }, - { "mvx-lm", { NULL }, 1510, "tcp" }, - { "mvx-lm", { NULL }, 1510, "udp" }, - { "3l-l1", { NULL }, 1511, "tcp" }, - { "3l-l1", { NULL }, 1511, "udp" }, - { "wins", { NULL }, 1512, "tcp" }, - { "wins", { NULL }, 1512, "udp" }, - { "fujitsu-dtc", { NULL }, 1513, "tcp" }, - { "fujitsu-dtc", { NULL }, 1513, "udp" }, - { "fujitsu-dtcns", { NULL }, 1514, "tcp" }, - { "fujitsu-dtcns", { NULL }, 1514, "udp" }, - { "ifor-protocol", { NULL }, 1515, "tcp" }, - { "ifor-protocol", { NULL }, 1515, "udp" }, - { "vpad", { NULL }, 1516, "tcp" }, - { "vpad", { NULL }, 1516, "udp" }, - { "vpac", { NULL }, 1517, "tcp" }, - { "vpac", { NULL }, 1517, "udp" }, - { "vpvd", { NULL }, 1518, "tcp" }, - { "vpvd", { NULL }, 1518, "udp" }, - { "vpvc", { NULL }, 1519, "tcp" }, - { "vpvc", { NULL }, 1519, "udp" }, - { "atm-zip-office", { NULL }, 1520, "tcp" }, - { "atm-zip-office", { NULL }, 1520, "udp" }, - { "ncube-lm", { NULL }, 1521, "tcp" }, - { "ncube-lm", { NULL }, 1521, "udp" }, - { "ricardo-lm", { NULL }, 1522, "tcp" }, - { "ricardo-lm", { NULL }, 1522, "udp" }, - { "cichild-lm", { NULL }, 1523, "tcp" }, - { "cichild-lm", { NULL }, 1523, "udp" }, - { "ingreslock", { NULL }, 1524, "tcp" }, - { "ingreslock", { NULL }, 1524, "udp" }, - { "orasrv", { NULL }, 1525, "tcp" }, - { "orasrv", { NULL }, 1525, "udp" }, - { "prospero-np", { NULL }, 1525, "tcp" }, - { "prospero-np", { NULL }, 1525, "udp" }, - { "pdap-np", { NULL }, 1526, "tcp" }, - { "pdap-np", { NULL }, 1526, "udp" }, - { "tlisrv", { NULL }, 1527, "tcp" }, - { "tlisrv", { NULL }, 1527, "udp" }, - { "coauthor", { NULL }, 1529, "tcp" }, - { "coauthor", { NULL }, 1529, "udp" }, - { "rap-service", { NULL }, 1530, "tcp" }, - { "rap-service", { NULL }, 1530, "udp" }, - { "rap-listen", { NULL }, 1531, "tcp" }, - { "rap-listen", { NULL }, 1531, "udp" }, - { "miroconnect", { NULL }, 1532, "tcp" }, - { "miroconnect", { NULL }, 1532, "udp" }, - { "virtual-places", { NULL }, 1533, "tcp" }, - { "virtual-places", { NULL }, 1533, "udp" }, - { "micromuse-lm", { NULL }, 1534, "tcp" }, - { "micromuse-lm", { NULL }, 1534, "udp" }, - { "ampr-info", { NULL }, 1535, "tcp" }, - { "ampr-info", { NULL }, 1535, "udp" }, - { "ampr-inter", { NULL }, 1536, "tcp" }, - { "ampr-inter", { NULL }, 1536, "udp" }, - { "sdsc-lm", { NULL }, 1537, "tcp" }, - { "sdsc-lm", { NULL }, 1537, "udp" }, - { "3ds-lm", { NULL }, 1538, "tcp" }, - { "3ds-lm", { NULL }, 1538, "udp" }, - { "intellistor-lm", { NULL }, 1539, "tcp" }, - { "intellistor-lm", { NULL }, 1539, "udp" }, - { "rds", { NULL }, 1540, "tcp" }, - { "rds", { NULL }, 1540, "udp" }, - { "rds2", { NULL }, 1541, "tcp" }, - { "rds2", { NULL }, 1541, "udp" }, - { "gridgen-elmd", { NULL }, 1542, "tcp" }, - { "gridgen-elmd", { NULL }, 1542, "udp" }, - { "simba-cs", { NULL }, 1543, "tcp" }, - { "simba-cs", { NULL }, 1543, "udp" }, - { "aspeclmd", { NULL }, 1544, "tcp" }, - { "aspeclmd", { NULL }, 1544, "udp" }, - { "vistium-share", { NULL }, 1545, "tcp" }, - { "vistium-share", { NULL }, 1545, "udp" }, - { "abbaccuray", { NULL }, 1546, "tcp" }, - { "abbaccuray", { NULL }, 1546, "udp" }, - { "laplink", { NULL }, 1547, "tcp" }, - { "laplink", { NULL }, 1547, "udp" }, - { "axon-lm", { NULL }, 1548, "tcp" }, - { "axon-lm", { NULL }, 1548, "udp" }, - { "shivahose", { NULL }, 1549, "tcp" }, - { "shivasound", { NULL }, 1549, "udp" }, - { "3m-image-lm", { NULL }, 1550, "tcp" }, - { "3m-image-lm", { NULL }, 1550, "udp" }, - { "hecmtl-db", { NULL }, 1551, "tcp" }, - { "hecmtl-db", { NULL }, 1551, "udp" }, - { "pciarray", { NULL }, 1552, "tcp" }, - { "pciarray", { NULL }, 1552, "udp" }, - { "sna-cs", { NULL }, 1553, "tcp" }, - { "sna-cs", { NULL }, 1553, "udp" }, - { "caci-lm", { NULL }, 1554, "tcp" }, - { "caci-lm", { NULL }, 1554, "udp" }, - { "livelan", { NULL }, 1555, "tcp" }, - { "livelan", { NULL }, 1555, "udp" }, - { "veritas_pbx", { NULL }, 1556, "tcp" }, - { "veritas_pbx", { NULL }, 1556, "udp" }, - { "arbortext-lm", { NULL }, 1557, "tcp" }, - { "arbortext-lm", { NULL }, 1557, "udp" }, - { "xingmpeg", { NULL }, 1558, "tcp" }, - { "xingmpeg", { NULL }, 1558, "udp" }, - { "web2host", { NULL }, 1559, "tcp" }, - { "web2host", { NULL }, 1559, "udp" }, - { "asci-val", { NULL }, 1560, "tcp" }, - { "asci-val", { NULL }, 1560, "udp" }, - { "facilityview", { NULL }, 1561, "tcp" }, - { "facilityview", { NULL }, 1561, "udp" }, - { "pconnectmgr", { NULL }, 1562, "tcp" }, - { "pconnectmgr", { NULL }, 1562, "udp" }, - { "cadabra-lm", { NULL }, 1563, "tcp" }, - { "cadabra-lm", { NULL }, 1563, "udp" }, - { "pay-per-view", { NULL }, 1564, "tcp" }, - { "pay-per-view", { NULL }, 1564, "udp" }, - { "winddlb", { NULL }, 1565, "tcp" }, - { "winddlb", { NULL }, 1565, "udp" }, - { "corelvideo", { NULL }, 1566, "tcp" }, - { "corelvideo", { NULL }, 1566, "udp" }, - { "jlicelmd", { NULL }, 1567, "tcp" }, - { "jlicelmd", { NULL }, 1567, "udp" }, - { "tsspmap", { NULL }, 1568, "tcp" }, - { "tsspmap", { NULL }, 1568, "udp" }, - { "ets", { NULL }, 1569, "tcp" }, - { "ets", { NULL }, 1569, "udp" }, - { "orbixd", { NULL }, 1570, "tcp" }, - { "orbixd", { NULL }, 1570, "udp" }, - { "rdb-dbs-disp", { NULL }, 1571, "tcp" }, - { "rdb-dbs-disp", { NULL }, 1571, "udp" }, - { "chip-lm", { NULL }, 1572, "tcp" }, - { "chip-lm", { NULL }, 1572, "udp" }, - { "itscomm-ns", { NULL }, 1573, "tcp" }, - { "itscomm-ns", { NULL }, 1573, "udp" }, - { "mvel-lm", { NULL }, 1574, "tcp" }, - { "mvel-lm", { NULL }, 1574, "udp" }, - { "oraclenames", { NULL }, 1575, "tcp" }, - { "oraclenames", { NULL }, 1575, "udp" }, - { "moldflow-lm", { NULL }, 1576, "tcp" }, - { "moldflow-lm", { NULL }, 1576, "udp" }, - { "hypercube-lm", { NULL }, 1577, "tcp" }, - { "hypercube-lm", { NULL }, 1577, "udp" }, - { "jacobus-lm", { NULL }, 1578, "tcp" }, - { "jacobus-lm", { NULL }, 1578, "udp" }, - { "ioc-sea-lm", { NULL }, 1579, "tcp" }, - { "ioc-sea-lm", { NULL }, 1579, "udp" }, - { "tn-tl-r1", { NULL }, 1580, "tcp" }, - { "tn-tl-r2", { NULL }, 1580, "udp" }, - { "mil-2045-47001", { NULL }, 1581, "tcp" }, - { "mil-2045-47001", { NULL }, 1581, "udp" }, - { "msims", { NULL }, 1582, "tcp" }, - { "msims", { NULL }, 1582, "udp" }, - { "simbaexpress", { NULL }, 1583, "tcp" }, - { "simbaexpress", { NULL }, 1583, "udp" }, - { "tn-tl-fd2", { NULL }, 1584, "tcp" }, - { "tn-tl-fd2", { NULL }, 1584, "udp" }, - { "intv", { NULL }, 1585, "tcp" }, - { "intv", { NULL }, 1585, "udp" }, - { "ibm-abtact", { NULL }, 1586, "tcp" }, - { "ibm-abtact", { NULL }, 1586, "udp" }, - { "pra_elmd", { NULL }, 1587, "tcp" }, - { "pra_elmd", { NULL }, 1587, "udp" }, - { "triquest-lm", { NULL }, 1588, "tcp" }, - { "triquest-lm", { NULL }, 1588, "udp" }, - { "vqp", { NULL }, 1589, "tcp" }, - { "vqp", { NULL }, 1589, "udp" }, - { "gemini-lm", { NULL }, 1590, "tcp" }, - { "gemini-lm", { NULL }, 1590, "udp" }, - { "ncpm-pm", { NULL }, 1591, "tcp" }, - { "ncpm-pm", { NULL }, 1591, "udp" }, - { "commonspace", { NULL }, 1592, "tcp" }, - { "commonspace", { NULL }, 1592, "udp" }, - { "mainsoft-lm", { NULL }, 1593, "tcp" }, - { "mainsoft-lm", { NULL }, 1593, "udp" }, - { "sixtrak", { NULL }, 1594, "tcp" }, - { "sixtrak", { NULL }, 1594, "udp" }, - { "radio", { NULL }, 1595, "tcp" }, - { "radio", { NULL }, 1595, "udp" }, - { "radio-sm", { NULL }, 1596, "tcp" }, - { "radio-bc", { NULL }, 1596, "udp" }, - { "orbplus-iiop", { NULL }, 1597, "tcp" }, - { "orbplus-iiop", { NULL }, 1597, "udp" }, - { "picknfs", { NULL }, 1598, "tcp" }, - { "picknfs", { NULL }, 1598, "udp" }, - { "simbaservices", { NULL }, 1599, "tcp" }, - { "simbaservices", { NULL }, 1599, "udp" }, - { "issd", { NULL }, 1600, "tcp" }, - { "issd", { NULL }, 1600, "udp" }, - { "aas", { NULL }, 1601, "tcp" }, - { "aas", { NULL }, 1601, "udp" }, - { "inspect", { NULL }, 1602, "tcp" }, - { "inspect", { NULL }, 1602, "udp" }, - { "picodbc", { NULL }, 1603, "tcp" }, - { "picodbc", { NULL }, 1603, "udp" }, - { "icabrowser", { NULL }, 1604, "tcp" }, - { "icabrowser", { NULL }, 1604, "udp" }, - { "slp", { NULL }, 1605, "tcp" }, - { "slp", { NULL }, 1605, "udp" }, - { "slm-api", { NULL }, 1606, "tcp" }, - { "slm-api", { NULL }, 1606, "udp" }, - { "stt", { NULL }, 1607, "tcp" }, - { "stt", { NULL }, 1607, "udp" }, - { "smart-lm", { NULL }, 1608, "tcp" }, - { "smart-lm", { NULL }, 1608, "udp" }, - { "isysg-lm", { NULL }, 1609, "tcp" }, - { "isysg-lm", { NULL }, 1609, "udp" }, - { "taurus-wh", { NULL }, 1610, "tcp" }, - { "taurus-wh", { NULL }, 1610, "udp" }, - { "ill", { NULL }, 1611, "tcp" }, - { "ill", { NULL }, 1611, "udp" }, - { "netbill-trans", { NULL }, 1612, "tcp" }, - { "netbill-trans", { NULL }, 1612, "udp" }, - { "netbill-keyrep", { NULL }, 1613, "tcp" }, - { "netbill-keyrep", { NULL }, 1613, "udp" }, - { "netbill-cred", { NULL }, 1614, "tcp" }, - { "netbill-cred", { NULL }, 1614, "udp" }, - { "netbill-auth", { NULL }, 1615, "tcp" }, - { "netbill-auth", { NULL }, 1615, "udp" }, - { "netbill-prod", { NULL }, 1616, "tcp" }, - { "netbill-prod", { NULL }, 1616, "udp" }, - { "nimrod-agent", { NULL }, 1617, "tcp" }, - { "nimrod-agent", { NULL }, 1617, "udp" }, - { "skytelnet", { NULL }, 1618, "tcp" }, - { "skytelnet", { NULL }, 1618, "udp" }, - { "xs-openstorage", { NULL }, 1619, "tcp" }, - { "xs-openstorage", { NULL }, 1619, "udp" }, - { "faxportwinport", { NULL }, 1620, "tcp" }, - { "faxportwinport", { NULL }, 1620, "udp" }, - { "softdataphone", { NULL }, 1621, "tcp" }, - { "softdataphone", { NULL }, 1621, "udp" }, - { "ontime", { NULL }, 1622, "tcp" }, - { "ontime", { NULL }, 1622, "udp" }, - { "jaleosnd", { NULL }, 1623, "tcp" }, - { "jaleosnd", { NULL }, 1623, "udp" }, - { "udp-sr-port", { NULL }, 1624, "tcp" }, - { "udp-sr-port", { NULL }, 1624, "udp" }, - { "svs-omagent", { NULL }, 1625, "tcp" }, - { "svs-omagent", { NULL }, 1625, "udp" }, - { "shockwave", { NULL }, 1626, "tcp" }, - { "shockwave", { NULL }, 1626, "udp" }, - { "t128-gateway", { NULL }, 1627, "tcp" }, - { "t128-gateway", { NULL }, 1627, "udp" }, - { "lontalk-norm", { NULL }, 1628, "tcp" }, - { "lontalk-norm", { NULL }, 1628, "udp" }, - { "lontalk-urgnt", { NULL }, 1629, "tcp" }, - { "lontalk-urgnt", { NULL }, 1629, "udp" }, - { "oraclenet8cman", { NULL }, 1630, "tcp" }, - { "oraclenet8cman", { NULL }, 1630, "udp" }, - { "visitview", { NULL }, 1631, "tcp" }, - { "visitview", { NULL }, 1631, "udp" }, - { "pammratc", { NULL }, 1632, "tcp" }, - { "pammratc", { NULL }, 1632, "udp" }, - { "pammrpc", { NULL }, 1633, "tcp" }, - { "pammrpc", { NULL }, 1633, "udp" }, - { "loaprobe", { NULL }, 1634, "tcp" }, - { "loaprobe", { NULL }, 1634, "udp" }, - { "edb-server1", { NULL }, 1635, "tcp" }, - { "edb-server1", { NULL }, 1635, "udp" }, - { "isdc", { NULL }, 1636, "tcp" }, - { "isdc", { NULL }, 1636, "udp" }, - { "islc", { NULL }, 1637, "tcp" }, - { "islc", { NULL }, 1637, "udp" }, - { "ismc", { NULL }, 1638, "tcp" }, - { "ismc", { NULL }, 1638, "udp" }, - { "cert-initiator", { NULL }, 1639, "tcp" }, - { "cert-initiator", { NULL }, 1639, "udp" }, - { "cert-responder", { NULL }, 1640, "tcp" }, - { "cert-responder", { NULL }, 1640, "udp" }, - { "invision", { NULL }, 1641, "tcp" }, - { "invision", { NULL }, 1641, "udp" }, - { "isis-am", { NULL }, 1642, "tcp" }, - { "isis-am", { NULL }, 1642, "udp" }, - { "isis-ambc", { NULL }, 1643, "tcp" }, - { "isis-ambc", { NULL }, 1643, "udp" }, - { "saiseh", { NULL }, 1644, "tcp" }, - { "sightline", { NULL }, 1645, "tcp" }, - { "sightline", { NULL }, 1645, "udp" }, - { "sa-msg-port", { NULL }, 1646, "tcp" }, - { "sa-msg-port", { NULL }, 1646, "udp" }, - { "rsap", { NULL }, 1647, "tcp" }, - { "rsap", { NULL }, 1647, "udp" }, - { "concurrent-lm", { NULL }, 1648, "tcp" }, - { "concurrent-lm", { NULL }, 1648, "udp" }, - { "kermit", { NULL }, 1649, "tcp" }, - { "kermit", { NULL }, 1649, "udp" }, - { "nkd", { NULL }, 1650, "tcp" }, - { "nkd", { NULL }, 1650, "udp" }, - { "shiva_confsrvr", { NULL }, 1651, "tcp" }, - { "shiva_confsrvr", { NULL }, 1651, "udp" }, - { "xnmp", { NULL }, 1652, "tcp" }, - { "xnmp", { NULL }, 1652, "udp" }, - { "alphatech-lm", { NULL }, 1653, "tcp" }, - { "alphatech-lm", { NULL }, 1653, "udp" }, - { "stargatealerts", { NULL }, 1654, "tcp" }, - { "stargatealerts", { NULL }, 1654, "udp" }, - { "dec-mbadmin", { NULL }, 1655, "tcp" }, - { "dec-mbadmin", { NULL }, 1655, "udp" }, - { "dec-mbadmin-h", { NULL }, 1656, "tcp" }, - { "dec-mbadmin-h", { NULL }, 1656, "udp" }, - { "fujitsu-mmpdc", { NULL }, 1657, "tcp" }, - { "fujitsu-mmpdc", { NULL }, 1657, "udp" }, - { "sixnetudr", { NULL }, 1658, "tcp" }, - { "sixnetudr", { NULL }, 1658, "udp" }, - { "sg-lm", { NULL }, 1659, "tcp" }, - { "sg-lm", { NULL }, 1659, "udp" }, - { "skip-mc-gikreq", { NULL }, 1660, "tcp" }, - { "skip-mc-gikreq", { NULL }, 1660, "udp" }, - { "netview-aix-1", { NULL }, 1661, "tcp" }, - { "netview-aix-1", { NULL }, 1661, "udp" }, - { "netview-aix-2", { NULL }, 1662, "tcp" }, - { "netview-aix-2", { NULL }, 1662, "udp" }, - { "netview-aix-3", { NULL }, 1663, "tcp" }, - { "netview-aix-3", { NULL }, 1663, "udp" }, - { "netview-aix-4", { NULL }, 1664, "tcp" }, - { "netview-aix-4", { NULL }, 1664, "udp" }, - { "netview-aix-5", { NULL }, 1665, "tcp" }, - { "netview-aix-5", { NULL }, 1665, "udp" }, - { "netview-aix-6", { NULL }, 1666, "tcp" }, - { "netview-aix-6", { NULL }, 1666, "udp" }, - { "netview-aix-7", { NULL }, 1667, "tcp" }, - { "netview-aix-7", { NULL }, 1667, "udp" }, - { "netview-aix-8", { NULL }, 1668, "tcp" }, - { "netview-aix-8", { NULL }, 1668, "udp" }, - { "netview-aix-9", { NULL }, 1669, "tcp" }, - { "netview-aix-9", { NULL }, 1669, "udp" }, - { "netview-aix-10", { NULL }, 1670, "tcp" }, - { "netview-aix-10", { NULL }, 1670, "udp" }, - { "netview-aix-11", { NULL }, 1671, "tcp" }, - { "netview-aix-11", { NULL }, 1671, "udp" }, - { "netview-aix-12", { NULL }, 1672, "tcp" }, - { "netview-aix-12", { NULL }, 1672, "udp" }, - { "proshare-mc-1", { NULL }, 1673, "tcp" }, - { "proshare-mc-1", { NULL }, 1673, "udp" }, - { "proshare-mc-2", { NULL }, 1674, "tcp" }, - { "proshare-mc-2", { NULL }, 1674, "udp" }, - { "pdp", { NULL }, 1675, "tcp" }, - { "pdp", { NULL }, 1675, "udp" }, - { "netcomm1", { NULL }, 1676, "tcp" }, - { "netcomm2", { NULL }, 1676, "udp" }, - { "groupwise", { NULL }, 1677, "tcp" }, - { "groupwise", { NULL }, 1677, "udp" }, - { "prolink", { NULL }, 1678, "tcp" }, - { "prolink", { NULL }, 1678, "udp" }, - { "darcorp-lm", { NULL }, 1679, "tcp" }, - { "darcorp-lm", { NULL }, 1679, "udp" }, - { "microcom-sbp", { NULL }, 1680, "tcp" }, - { "microcom-sbp", { NULL }, 1680, "udp" }, - { "sd-elmd", { NULL }, 1681, "tcp" }, - { "sd-elmd", { NULL }, 1681, "udp" }, - { "lanyon-lantern", { NULL }, 1682, "tcp" }, - { "lanyon-lantern", { NULL }, 1682, "udp" }, - { "ncpm-hip", { NULL }, 1683, "tcp" }, - { "ncpm-hip", { NULL }, 1683, "udp" }, - { "snaresecure", { NULL }, 1684, "tcp" }, - { "snaresecure", { NULL }, 1684, "udp" }, - { "n2nremote", { NULL }, 1685, "tcp" }, - { "n2nremote", { NULL }, 1685, "udp" }, - { "cvmon", { NULL }, 1686, "tcp" }, - { "cvmon", { NULL }, 1686, "udp" }, - { "nsjtp-ctrl", { NULL }, 1687, "tcp" }, - { "nsjtp-ctrl", { NULL }, 1687, "udp" }, - { "nsjtp-data", { NULL }, 1688, "tcp" }, - { "nsjtp-data", { NULL }, 1688, "udp" }, - { "firefox", { NULL }, 1689, "tcp" }, - { "firefox", { NULL }, 1689, "udp" }, - { "ng-umds", { NULL }, 1690, "tcp" }, - { "ng-umds", { NULL }, 1690, "udp" }, - { "empire-empuma", { NULL }, 1691, "tcp" }, - { "empire-empuma", { NULL }, 1691, "udp" }, - { "sstsys-lm", { NULL }, 1692, "tcp" }, - { "sstsys-lm", { NULL }, 1692, "udp" }, - { "rrirtr", { NULL }, 1693, "tcp" }, - { "rrirtr", { NULL }, 1693, "udp" }, - { "rrimwm", { NULL }, 1694, "tcp" }, - { "rrimwm", { NULL }, 1694, "udp" }, - { "rrilwm", { NULL }, 1695, "tcp" }, - { "rrilwm", { NULL }, 1695, "udp" }, - { "rrifmm", { NULL }, 1696, "tcp" }, - { "rrifmm", { NULL }, 1696, "udp" }, - { "rrisat", { NULL }, 1697, "tcp" }, - { "rrisat", { NULL }, 1697, "udp" }, - { "rsvp-encap-1", { NULL }, 1698, "tcp" }, - { "rsvp-encap-1", { NULL }, 1698, "udp" }, - { "rsvp-encap-2", { NULL }, 1699, "tcp" }, - { "rsvp-encap-2", { NULL }, 1699, "udp" }, - { "mps-raft", { NULL }, 1700, "tcp" }, - { "mps-raft", { NULL }, 1700, "udp" }, - { "l2f", { NULL }, 1701, "tcp" }, - { "l2f", { NULL }, 1701, "udp" }, - { "l2tp", { NULL }, 1701, "tcp" }, - { "l2tp", { NULL }, 1701, "udp" }, - { "deskshare", { NULL }, 1702, "tcp" }, - { "deskshare", { NULL }, 1702, "udp" }, - { "hb-engine", { NULL }, 1703, "tcp" }, - { "hb-engine", { NULL }, 1703, "udp" }, - { "bcs-broker", { NULL }, 1704, "tcp" }, - { "bcs-broker", { NULL }, 1704, "udp" }, - { "slingshot", { NULL }, 1705, "tcp" }, - { "slingshot", { NULL }, 1705, "udp" }, - { "jetform", { NULL }, 1706, "tcp" }, - { "jetform", { NULL }, 1706, "udp" }, - { "vdmplay", { NULL }, 1707, "tcp" }, - { "vdmplay", { NULL }, 1707, "udp" }, - { "gat-lmd", { NULL }, 1708, "tcp" }, - { "gat-lmd", { NULL }, 1708, "udp" }, - { "centra", { NULL }, 1709, "tcp" }, - { "centra", { NULL }, 1709, "udp" }, - { "impera", { NULL }, 1710, "tcp" }, - { "impera", { NULL }, 1710, "udp" }, - { "pptconference", { NULL }, 1711, "tcp" }, - { "pptconference", { NULL }, 1711, "udp" }, - { "registrar", { NULL }, 1712, "tcp" }, - { "registrar", { NULL }, 1712, "udp" }, - { "conferencetalk", { NULL }, 1713, "tcp" }, - { "conferencetalk", { NULL }, 1713, "udp" }, - { "sesi-lm", { NULL }, 1714, "tcp" }, - { "sesi-lm", { NULL }, 1714, "udp" }, - { "houdini-lm", { NULL }, 1715, "tcp" }, - { "houdini-lm", { NULL }, 1715, "udp" }, - { "xmsg", { NULL }, 1716, "tcp" }, - { "xmsg", { NULL }, 1716, "udp" }, - { "fj-hdnet", { NULL }, 1717, "tcp" }, - { "fj-hdnet", { NULL }, 1717, "udp" }, - { "h323gatedisc", { NULL }, 1718, "tcp" }, - { "h323gatedisc", { NULL }, 1718, "udp" }, - { "h323gatestat", { NULL }, 1719, "tcp" }, - { "h323gatestat", { NULL }, 1719, "udp" }, - { "h323hostcall", { NULL }, 1720, "tcp" }, - { "h323hostcall", { NULL }, 1720, "udp" }, - { "caicci", { NULL }, 1721, "tcp" }, - { "caicci", { NULL }, 1721, "udp" }, - { "hks-lm", { NULL }, 1722, "tcp" }, - { "hks-lm", { NULL }, 1722, "udp" }, - { "pptp", { NULL }, 1723, "tcp" }, - { "pptp", { NULL }, 1723, "udp" }, - { "csbphonemaster", { NULL }, 1724, "tcp" }, - { "csbphonemaster", { NULL }, 1724, "udp" }, - { "iden-ralp", { NULL }, 1725, "tcp" }, - { "iden-ralp", { NULL }, 1725, "udp" }, - { "iberiagames", { NULL }, 1726, "tcp" }, - { "iberiagames", { NULL }, 1726, "udp" }, - { "winddx", { NULL }, 1727, "tcp" }, - { "winddx", { NULL }, 1727, "udp" }, - { "telindus", { NULL }, 1728, "tcp" }, - { "telindus", { NULL }, 1728, "udp" }, - { "citynl", { NULL }, 1729, "tcp" }, - { "citynl", { NULL }, 1729, "udp" }, - { "roketz", { NULL }, 1730, "tcp" }, - { "roketz", { NULL }, 1730, "udp" }, - { "msiccp", { NULL }, 1731, "tcp" }, - { "msiccp", { NULL }, 1731, "udp" }, - { "proxim", { NULL }, 1732, "tcp" }, - { "proxim", { NULL }, 1732, "udp" }, - { "siipat", { NULL }, 1733, "tcp" }, - { "siipat", { NULL }, 1733, "udp" }, - { "cambertx-lm", { NULL }, 1734, "tcp" }, - { "cambertx-lm", { NULL }, 1734, "udp" }, - { "privatechat", { NULL }, 1735, "tcp" }, - { "privatechat", { NULL }, 1735, "udp" }, - { "street-stream", { NULL }, 1736, "tcp" }, - { "street-stream", { NULL }, 1736, "udp" }, - { "ultimad", { NULL }, 1737, "tcp" }, - { "ultimad", { NULL }, 1737, "udp" }, - { "gamegen1", { NULL }, 1738, "tcp" }, - { "gamegen1", { NULL }, 1738, "udp" }, - { "webaccess", { NULL }, 1739, "tcp" }, - { "webaccess", { NULL }, 1739, "udp" }, - { "encore", { NULL }, 1740, "tcp" }, - { "encore", { NULL }, 1740, "udp" }, - { "cisco-net-mgmt", { NULL }, 1741, "tcp" }, - { "cisco-net-mgmt", { NULL }, 1741, "udp" }, - { "3Com-nsd", { NULL }, 1742, "tcp" }, - { "3Com-nsd", { NULL }, 1742, "udp" }, - { "cinegrfx-lm", { NULL }, 1743, "tcp" }, - { "cinegrfx-lm", { NULL }, 1743, "udp" }, - { "ncpm-ft", { NULL }, 1744, "tcp" }, - { "ncpm-ft", { NULL }, 1744, "udp" }, - { "remote-winsock", { NULL }, 1745, "tcp" }, - { "remote-winsock", { NULL }, 1745, "udp" }, - { "ftrapid-1", { NULL }, 1746, "tcp" }, - { "ftrapid-1", { NULL }, 1746, "udp" }, - { "ftrapid-2", { NULL }, 1747, "tcp" }, - { "ftrapid-2", { NULL }, 1747, "udp" }, - { "oracle-em1", { NULL }, 1748, "tcp" }, - { "oracle-em1", { NULL }, 1748, "udp" }, - { "aspen-services", { NULL }, 1749, "tcp" }, - { "aspen-services", { NULL }, 1749, "udp" }, - { "sslp", { NULL }, 1750, "tcp" }, - { "sslp", { NULL }, 1750, "udp" }, - { "swiftnet", { NULL }, 1751, "tcp" }, - { "swiftnet", { NULL }, 1751, "udp" }, - { "lofr-lm", { NULL }, 1752, "tcp" }, - { "lofr-lm", { NULL }, 1752, "udp" }, - { "oracle-em2", { NULL }, 1754, "tcp" }, - { "oracle-em2", { NULL }, 1754, "udp" }, - { "ms-streaming", { NULL }, 1755, "tcp" }, - { "ms-streaming", { NULL }, 1755, "udp" }, - { "capfast-lmd", { NULL }, 1756, "tcp" }, - { "capfast-lmd", { NULL }, 1756, "udp" }, - { "cnhrp", { NULL }, 1757, "tcp" }, - { "cnhrp", { NULL }, 1757, "udp" }, - { "tftp-mcast", { NULL }, 1758, "tcp" }, - { "tftp-mcast", { NULL }, 1758, "udp" }, - { "spss-lm", { NULL }, 1759, "tcp" }, - { "spss-lm", { NULL }, 1759, "udp" }, - { "www-ldap-gw", { NULL }, 1760, "tcp" }, - { "www-ldap-gw", { NULL }, 1760, "udp" }, - { "cft-0", { NULL }, 1761, "tcp" }, - { "cft-0", { NULL }, 1761, "udp" }, - { "cft-1", { NULL }, 1762, "tcp" }, - { "cft-1", { NULL }, 1762, "udp" }, - { "cft-2", { NULL }, 1763, "tcp" }, - { "cft-2", { NULL }, 1763, "udp" }, - { "cft-3", { NULL }, 1764, "tcp" }, - { "cft-3", { NULL }, 1764, "udp" }, - { "cft-4", { NULL }, 1765, "tcp" }, - { "cft-4", { NULL }, 1765, "udp" }, - { "cft-5", { NULL }, 1766, "tcp" }, - { "cft-5", { NULL }, 1766, "udp" }, - { "cft-6", { NULL }, 1767, "tcp" }, - { "cft-6", { NULL }, 1767, "udp" }, - { "cft-7", { NULL }, 1768, "tcp" }, - { "cft-7", { NULL }, 1768, "udp" }, - { "bmc-net-adm", { NULL }, 1769, "tcp" }, - { "bmc-net-adm", { NULL }, 1769, "udp" }, - { "bmc-net-svc", { NULL }, 1770, "tcp" }, - { "bmc-net-svc", { NULL }, 1770, "udp" }, - { "vaultbase", { NULL }, 1771, "tcp" }, - { "vaultbase", { NULL }, 1771, "udp" }, - { "essweb-gw", { NULL }, 1772, "tcp" }, - { "essweb-gw", { NULL }, 1772, "udp" }, - { "kmscontrol", { NULL }, 1773, "tcp" }, - { "kmscontrol", { NULL }, 1773, "udp" }, - { "global-dtserv", { NULL }, 1774, "tcp" }, - { "global-dtserv", { NULL }, 1774, "udp" }, - { "femis", { NULL }, 1776, "tcp" }, - { "femis", { NULL }, 1776, "udp" }, - { "powerguardian", { NULL }, 1777, "tcp" }, - { "powerguardian", { NULL }, 1777, "udp" }, - { "prodigy-intrnet", { NULL }, 1778, "tcp" }, - { "prodigy-intrnet", { NULL }, 1778, "udp" }, - { "pharmasoft", { NULL }, 1779, "tcp" }, - { "pharmasoft", { NULL }, 1779, "udp" }, - { "dpkeyserv", { NULL }, 1780, "tcp" }, - { "dpkeyserv", { NULL }, 1780, "udp" }, - { "answersoft-lm", { NULL }, 1781, "tcp" }, - { "answersoft-lm", { NULL }, 1781, "udp" }, - { "hp-hcip", { NULL }, 1782, "tcp" }, - { "hp-hcip", { NULL }, 1782, "udp" }, - { "finle-lm", { NULL }, 1784, "tcp" }, - { "finle-lm", { NULL }, 1784, "udp" }, - { "windlm", { NULL }, 1785, "tcp" }, - { "windlm", { NULL }, 1785, "udp" }, - { "funk-logger", { NULL }, 1786, "tcp" }, - { "funk-logger", { NULL }, 1786, "udp" }, - { "funk-license", { NULL }, 1787, "tcp" }, - { "funk-license", { NULL }, 1787, "udp" }, - { "psmond", { NULL }, 1788, "tcp" }, - { "psmond", { NULL }, 1788, "udp" }, - { "hello", { NULL }, 1789, "tcp" }, - { "hello", { NULL }, 1789, "udp" }, - { "nmsp", { NULL }, 1790, "tcp" }, - { "nmsp", { NULL }, 1790, "udp" }, - { "ea1", { NULL }, 1791, "tcp" }, - { "ea1", { NULL }, 1791, "udp" }, - { "ibm-dt-2", { NULL }, 1792, "tcp" }, - { "ibm-dt-2", { NULL }, 1792, "udp" }, - { "rsc-robot", { NULL }, 1793, "tcp" }, - { "rsc-robot", { NULL }, 1793, "udp" }, - { "cera-bcm", { NULL }, 1794, "tcp" }, - { "cera-bcm", { NULL }, 1794, "udp" }, - { "dpi-proxy", { NULL }, 1795, "tcp" }, - { "dpi-proxy", { NULL }, 1795, "udp" }, - { "vocaltec-admin", { NULL }, 1796, "tcp" }, - { "vocaltec-admin", { NULL }, 1796, "udp" }, - { "uma", { NULL }, 1797, "tcp" }, - { "uma", { NULL }, 1797, "udp" }, - { "etp", { NULL }, 1798, "tcp" }, - { "etp", { NULL }, 1798, "udp" }, - { "netrisk", { NULL }, 1799, "tcp" }, - { "netrisk", { NULL }, 1799, "udp" }, - { "ansys-lm", { NULL }, 1800, "tcp" }, - { "ansys-lm", { NULL }, 1800, "udp" }, - { "msmq", { NULL }, 1801, "tcp" }, - { "msmq", { NULL }, 1801, "udp" }, - { "concomp1", { NULL }, 1802, "tcp" }, - { "concomp1", { NULL }, 1802, "udp" }, - { "hp-hcip-gwy", { NULL }, 1803, "tcp" }, - { "hp-hcip-gwy", { NULL }, 1803, "udp" }, - { "enl", { NULL }, 1804, "tcp" }, - { "enl", { NULL }, 1804, "udp" }, - { "enl-name", { NULL }, 1805, "tcp" }, - { "enl-name", { NULL }, 1805, "udp" }, - { "musiconline", { NULL }, 1806, "tcp" }, - { "musiconline", { NULL }, 1806, "udp" }, - { "fhsp", { NULL }, 1807, "tcp" }, - { "fhsp", { NULL }, 1807, "udp" }, - { "oracle-vp2", { NULL }, 1808, "tcp" }, - { "oracle-vp2", { NULL }, 1808, "udp" }, - { "oracle-vp1", { NULL }, 1809, "tcp" }, - { "oracle-vp1", { NULL }, 1809, "udp" }, - { "jerand-lm", { NULL }, 1810, "tcp" }, - { "jerand-lm", { NULL }, 1810, "udp" }, - { "scientia-sdb", { NULL }, 1811, "tcp" }, - { "scientia-sdb", { NULL }, 1811, "udp" }, - { "radius", { NULL }, 1812, "tcp" }, - { "radius", { NULL }, 1812, "udp" }, - { "radius-acct", { NULL }, 1813, "tcp" }, - { "radius-acct", { NULL }, 1813, "udp" }, - { "tdp-suite", { NULL }, 1814, "tcp" }, - { "tdp-suite", { NULL }, 1814, "udp" }, - { "mmpft", { NULL }, 1815, "tcp" }, - { "mmpft", { NULL }, 1815, "udp" }, - { "harp", { NULL }, 1816, "tcp" }, - { "harp", { NULL }, 1816, "udp" }, - { "rkb-oscs", { NULL }, 1817, "tcp" }, - { "rkb-oscs", { NULL }, 1817, "udp" }, - { "etftp", { NULL }, 1818, "tcp" }, - { "etftp", { NULL }, 1818, "udp" }, - { "plato-lm", { NULL }, 1819, "tcp" }, - { "plato-lm", { NULL }, 1819, "udp" }, - { "mcagent", { NULL }, 1820, "tcp" }, - { "mcagent", { NULL }, 1820, "udp" }, - { "donnyworld", { NULL }, 1821, "tcp" }, - { "donnyworld", { NULL }, 1821, "udp" }, - { "es-elmd", { NULL }, 1822, "tcp" }, - { "es-elmd", { NULL }, 1822, "udp" }, - { "unisys-lm", { NULL }, 1823, "tcp" }, - { "unisys-lm", { NULL }, 1823, "udp" }, - { "metrics-pas", { NULL }, 1824, "tcp" }, - { "metrics-pas", { NULL }, 1824, "udp" }, - { "direcpc-video", { NULL }, 1825, "tcp" }, - { "direcpc-video", { NULL }, 1825, "udp" }, - { "ardt", { NULL }, 1826, "tcp" }, - { "ardt", { NULL }, 1826, "udp" }, - { "asi", { NULL }, 1827, "tcp" }, - { "asi", { NULL }, 1827, "udp" }, - { "itm-mcell-u", { NULL }, 1828, "tcp" }, - { "itm-mcell-u", { NULL }, 1828, "udp" }, - { "optika-emedia", { NULL }, 1829, "tcp" }, - { "optika-emedia", { NULL }, 1829, "udp" }, - { "net8-cman", { NULL }, 1830, "tcp" }, - { "net8-cman", { NULL }, 1830, "udp" }, - { "myrtle", { NULL }, 1831, "tcp" }, - { "myrtle", { NULL }, 1831, "udp" }, - { "tht-treasure", { NULL }, 1832, "tcp" }, - { "tht-treasure", { NULL }, 1832, "udp" }, - { "udpradio", { NULL }, 1833, "tcp" }, - { "udpradio", { NULL }, 1833, "udp" }, - { "ardusuni", { NULL }, 1834, "tcp" }, - { "ardusuni", { NULL }, 1834, "udp" }, - { "ardusmul", { NULL }, 1835, "tcp" }, - { "ardusmul", { NULL }, 1835, "udp" }, - { "ste-smsc", { NULL }, 1836, "tcp" }, - { "ste-smsc", { NULL }, 1836, "udp" }, - { "csoft1", { NULL }, 1837, "tcp" }, - { "csoft1", { NULL }, 1837, "udp" }, - { "talnet", { NULL }, 1838, "tcp" }, - { "talnet", { NULL }, 1838, "udp" }, - { "netopia-vo1", { NULL }, 1839, "tcp" }, - { "netopia-vo1", { NULL }, 1839, "udp" }, - { "netopia-vo2", { NULL }, 1840, "tcp" }, - { "netopia-vo2", { NULL }, 1840, "udp" }, - { "netopia-vo3", { NULL }, 1841, "tcp" }, - { "netopia-vo3", { NULL }, 1841, "udp" }, - { "netopia-vo4", { NULL }, 1842, "tcp" }, - { "netopia-vo4", { NULL }, 1842, "udp" }, - { "netopia-vo5", { NULL }, 1843, "tcp" }, - { "netopia-vo5", { NULL }, 1843, "udp" }, - { "direcpc-dll", { NULL }, 1844, "tcp" }, - { "direcpc-dll", { NULL }, 1844, "udp" }, - { "altalink", { NULL }, 1845, "tcp" }, - { "altalink", { NULL }, 1845, "udp" }, - { "tunstall-pnc", { NULL }, 1846, "tcp" }, - { "tunstall-pnc", { NULL }, 1846, "udp" }, - { "slp-notify", { NULL }, 1847, "tcp" }, - { "slp-notify", { NULL }, 1847, "udp" }, - { "fjdocdist", { NULL }, 1848, "tcp" }, - { "fjdocdist", { NULL }, 1848, "udp" }, - { "alpha-sms", { NULL }, 1849, "tcp" }, - { "alpha-sms", { NULL }, 1849, "udp" }, - { "gsi", { NULL }, 1850, "tcp" }, - { "gsi", { NULL }, 1850, "udp" }, - { "ctcd", { NULL }, 1851, "tcp" }, - { "ctcd", { NULL }, 1851, "udp" }, - { "virtual-time", { NULL }, 1852, "tcp" }, - { "virtual-time", { NULL }, 1852, "udp" }, - { "vids-avtp", { NULL }, 1853, "tcp" }, - { "vids-avtp", { NULL }, 1853, "udp" }, - { "buddy-draw", { NULL }, 1854, "tcp" }, - { "buddy-draw", { NULL }, 1854, "udp" }, - { "fiorano-rtrsvc", { NULL }, 1855, "tcp" }, - { "fiorano-rtrsvc", { NULL }, 1855, "udp" }, - { "fiorano-msgsvc", { NULL }, 1856, "tcp" }, - { "fiorano-msgsvc", { NULL }, 1856, "udp" }, - { "datacaptor", { NULL }, 1857, "tcp" }, - { "datacaptor", { NULL }, 1857, "udp" }, - { "privateark", { NULL }, 1858, "tcp" }, - { "privateark", { NULL }, 1858, "udp" }, - { "gammafetchsvr", { NULL }, 1859, "tcp" }, - { "gammafetchsvr", { NULL }, 1859, "udp" }, - { "sunscalar-svc", { NULL }, 1860, "tcp" }, - { "sunscalar-svc", { NULL }, 1860, "udp" }, - { "lecroy-vicp", { NULL }, 1861, "tcp" }, - { "lecroy-vicp", { NULL }, 1861, "udp" }, - { "mysql-cm-agent", { NULL }, 1862, "tcp" }, - { "mysql-cm-agent", { NULL }, 1862, "udp" }, - { "msnp", { NULL }, 1863, "tcp" }, - { "msnp", { NULL }, 1863, "udp" }, - { "paradym-31port", { NULL }, 1864, "tcp" }, - { "paradym-31port", { NULL }, 1864, "udp" }, - { "entp", { NULL }, 1865, "tcp" }, - { "entp", { NULL }, 1865, "udp" }, - { "swrmi", { NULL }, 1866, "tcp" }, - { "swrmi", { NULL }, 1866, "udp" }, - { "udrive", { NULL }, 1867, "tcp" }, - { "udrive", { NULL }, 1867, "udp" }, - { "viziblebrowser", { NULL }, 1868, "tcp" }, - { "viziblebrowser", { NULL }, 1868, "udp" }, - { "transact", { NULL }, 1869, "tcp" }, - { "transact", { NULL }, 1869, "udp" }, - { "sunscalar-dns", { NULL }, 1870, "tcp" }, - { "sunscalar-dns", { NULL }, 1870, "udp" }, - { "canocentral0", { NULL }, 1871, "tcp" }, - { "canocentral0", { NULL }, 1871, "udp" }, - { "canocentral1", { NULL }, 1872, "tcp" }, - { "canocentral1", { NULL }, 1872, "udp" }, - { "fjmpjps", { NULL }, 1873, "tcp" }, - { "fjmpjps", { NULL }, 1873, "udp" }, - { "fjswapsnp", { NULL }, 1874, "tcp" }, - { "fjswapsnp", { NULL }, 1874, "udp" }, - { "westell-stats", { NULL }, 1875, "tcp" }, - { "westell-stats", { NULL }, 1875, "udp" }, - { "ewcappsrv", { NULL }, 1876, "tcp" }, - { "ewcappsrv", { NULL }, 1876, "udp" }, - { "hp-webqosdb", { NULL }, 1877, "tcp" }, - { "hp-webqosdb", { NULL }, 1877, "udp" }, - { "drmsmc", { NULL }, 1878, "tcp" }, - { "drmsmc", { NULL }, 1878, "udp" }, - { "nettgain-nms", { NULL }, 1879, "tcp" }, - { "nettgain-nms", { NULL }, 1879, "udp" }, - { "vsat-control", { NULL }, 1880, "tcp" }, - { "vsat-control", { NULL }, 1880, "udp" }, - { "ibm-mqseries2", { NULL }, 1881, "tcp" }, - { "ibm-mqseries2", { NULL }, 1881, "udp" }, - { "ecsqdmn", { NULL }, 1882, "tcp" }, - { "ecsqdmn", { NULL }, 1882, "udp" }, - { "ibm-mqisdp", { NULL }, 1883, "tcp" }, - { "ibm-mqisdp", { NULL }, 1883, "udp" }, - { "idmaps", { NULL }, 1884, "tcp" }, - { "idmaps", { NULL }, 1884, "udp" }, - { "vrtstrapserver", { NULL }, 1885, "tcp" }, - { "vrtstrapserver", { NULL }, 1885, "udp" }, - { "leoip", { NULL }, 1886, "tcp" }, - { "leoip", { NULL }, 1886, "udp" }, - { "filex-lport", { NULL }, 1887, "tcp" }, - { "filex-lport", { NULL }, 1887, "udp" }, - { "ncconfig", { NULL }, 1888, "tcp" }, - { "ncconfig", { NULL }, 1888, "udp" }, - { "unify-adapter", { NULL }, 1889, "tcp" }, - { "unify-adapter", { NULL }, 1889, "udp" }, - { "wilkenlistener", { NULL }, 1890, "tcp" }, - { "wilkenlistener", { NULL }, 1890, "udp" }, - { "childkey-notif", { NULL }, 1891, "tcp" }, - { "childkey-notif", { NULL }, 1891, "udp" }, - { "childkey-ctrl", { NULL }, 1892, "tcp" }, - { "childkey-ctrl", { NULL }, 1892, "udp" }, - { "elad", { NULL }, 1893, "tcp" }, - { "elad", { NULL }, 1893, "udp" }, - { "o2server-port", { NULL }, 1894, "tcp" }, - { "o2server-port", { NULL }, 1894, "udp" }, - { "b-novative-ls", { NULL }, 1896, "tcp" }, - { "b-novative-ls", { NULL }, 1896, "udp" }, - { "metaagent", { NULL }, 1897, "tcp" }, - { "metaagent", { NULL }, 1897, "udp" }, - { "cymtec-port", { NULL }, 1898, "tcp" }, - { "cymtec-port", { NULL }, 1898, "udp" }, - { "mc2studios", { NULL }, 1899, "tcp" }, - { "mc2studios", { NULL }, 1899, "udp" }, - { "ssdp", { NULL }, 1900, "tcp" }, - { "ssdp", { NULL }, 1900, "udp" }, - { "fjicl-tep-a", { NULL }, 1901, "tcp" }, - { "fjicl-tep-a", { NULL }, 1901, "udp" }, - { "fjicl-tep-b", { NULL }, 1902, "tcp" }, - { "fjicl-tep-b", { NULL }, 1902, "udp" }, - { "linkname", { NULL }, 1903, "tcp" }, - { "linkname", { NULL }, 1903, "udp" }, - { "fjicl-tep-c", { NULL }, 1904, "tcp" }, - { "fjicl-tep-c", { NULL }, 1904, "udp" }, - { "sugp", { NULL }, 1905, "tcp" }, - { "sugp", { NULL }, 1905, "udp" }, - { "tpmd", { NULL }, 1906, "tcp" }, - { "tpmd", { NULL }, 1906, "udp" }, - { "intrastar", { NULL }, 1907, "tcp" }, - { "intrastar", { NULL }, 1907, "udp" }, - { "dawn", { NULL }, 1908, "tcp" }, - { "dawn", { NULL }, 1908, "udp" }, - { "global-wlink", { NULL }, 1909, "tcp" }, - { "global-wlink", { NULL }, 1909, "udp" }, - { "ultrabac", { NULL }, 1910, "tcp" }, - { "ultrabac", { NULL }, 1910, "udp" }, - { "mtp", { NULL }, 1911, "tcp" }, - { "mtp", { NULL }, 1911, "udp" }, - { "rhp-iibp", { NULL }, 1912, "tcp" }, - { "rhp-iibp", { NULL }, 1912, "udp" }, - { "armadp", { NULL }, 1913, "tcp" }, - { "armadp", { NULL }, 1913, "udp" }, - { "elm-momentum", { NULL }, 1914, "tcp" }, - { "elm-momentum", { NULL }, 1914, "udp" }, - { "facelink", { NULL }, 1915, "tcp" }, - { "facelink", { NULL }, 1915, "udp" }, - { "persona", { NULL }, 1916, "tcp" }, - { "persona", { NULL }, 1916, "udp" }, - { "noagent", { NULL }, 1917, "tcp" }, - { "noagent", { NULL }, 1917, "udp" }, - { "can-nds", { NULL }, 1918, "tcp" }, - { "can-nds", { NULL }, 1918, "udp" }, - { "can-dch", { NULL }, 1919, "tcp" }, - { "can-dch", { NULL }, 1919, "udp" }, - { "can-ferret", { NULL }, 1920, "tcp" }, - { "can-ferret", { NULL }, 1920, "udp" }, - { "noadmin", { NULL }, 1921, "tcp" }, - { "noadmin", { NULL }, 1921, "udp" }, - { "tapestry", { NULL }, 1922, "tcp" }, - { "tapestry", { NULL }, 1922, "udp" }, - { "spice", { NULL }, 1923, "tcp" }, - { "spice", { NULL }, 1923, "udp" }, - { "xiip", { NULL }, 1924, "tcp" }, - { "xiip", { NULL }, 1924, "udp" }, - { "discovery-port", { NULL }, 1925, "tcp" }, - { "discovery-port", { NULL }, 1925, "udp" }, - { "egs", { NULL }, 1926, "tcp" }, - { "egs", { NULL }, 1926, "udp" }, - { "videte-cipc", { NULL }, 1927, "tcp" }, - { "videte-cipc", { NULL }, 1927, "udp" }, - { "emsd-port", { NULL }, 1928, "tcp" }, - { "emsd-port", { NULL }, 1928, "udp" }, - { "bandwiz-system", { NULL }, 1929, "tcp" }, - { "bandwiz-system", { NULL }, 1929, "udp" }, - { "driveappserver", { NULL }, 1930, "tcp" }, - { "driveappserver", { NULL }, 1930, "udp" }, - { "amdsched", { NULL }, 1931, "tcp" }, - { "amdsched", { NULL }, 1931, "udp" }, - { "ctt-broker", { NULL }, 1932, "tcp" }, - { "ctt-broker", { NULL }, 1932, "udp" }, - { "xmapi", { NULL }, 1933, "tcp" }, - { "xmapi", { NULL }, 1933, "udp" }, - { "xaapi", { NULL }, 1934, "tcp" }, - { "xaapi", { NULL }, 1934, "udp" }, - { "macromedia-fcs", { NULL }, 1935, "tcp" }, - { "macromedia-fcs", { NULL }, 1935, "udp" }, - { "jetcmeserver", { NULL }, 1936, "tcp" }, - { "jetcmeserver", { NULL }, 1936, "udp" }, - { "jwserver", { NULL }, 1937, "tcp" }, - { "jwserver", { NULL }, 1937, "udp" }, - { "jwclient", { NULL }, 1938, "tcp" }, - { "jwclient", { NULL }, 1938, "udp" }, - { "jvserver", { NULL }, 1939, "tcp" }, - { "jvserver", { NULL }, 1939, "udp" }, - { "jvclient", { NULL }, 1940, "tcp" }, - { "jvclient", { NULL }, 1940, "udp" }, - { "dic-aida", { NULL }, 1941, "tcp" }, - { "dic-aida", { NULL }, 1941, "udp" }, - { "res", { NULL }, 1942, "tcp" }, - { "res", { NULL }, 1942, "udp" }, - { "beeyond-media", { NULL }, 1943, "tcp" }, - { "beeyond-media", { NULL }, 1943, "udp" }, - { "close-combat", { NULL }, 1944, "tcp" }, - { "close-combat", { NULL }, 1944, "udp" }, - { "dialogic-elmd", { NULL }, 1945, "tcp" }, - { "dialogic-elmd", { NULL }, 1945, "udp" }, - { "tekpls", { NULL }, 1946, "tcp" }, - { "tekpls", { NULL }, 1946, "udp" }, - { "sentinelsrm", { NULL }, 1947, "tcp" }, - { "sentinelsrm", { NULL }, 1947, "udp" }, - { "eye2eye", { NULL }, 1948, "tcp" }, - { "eye2eye", { NULL }, 1948, "udp" }, - { "ismaeasdaqlive", { NULL }, 1949, "tcp" }, - { "ismaeasdaqlive", { NULL }, 1949, "udp" }, - { "ismaeasdaqtest", { NULL }, 1950, "tcp" }, - { "ismaeasdaqtest", { NULL }, 1950, "udp" }, - { "bcs-lmserver", { NULL }, 1951, "tcp" }, - { "bcs-lmserver", { NULL }, 1951, "udp" }, - { "mpnjsc", { NULL }, 1952, "tcp" }, - { "mpnjsc", { NULL }, 1952, "udp" }, - { "rapidbase", { NULL }, 1953, "tcp" }, - { "rapidbase", { NULL }, 1953, "udp" }, - { "abr-api", { NULL }, 1954, "tcp" }, - { "abr-api", { NULL }, 1954, "udp" }, - { "abr-secure", { NULL }, 1955, "tcp" }, - { "abr-secure", { NULL }, 1955, "udp" }, - { "vrtl-vmf-ds", { NULL }, 1956, "tcp" }, - { "vrtl-vmf-ds", { NULL }, 1956, "udp" }, - { "unix-status", { NULL }, 1957, "tcp" }, - { "unix-status", { NULL }, 1957, "udp" }, - { "dxadmind", { NULL }, 1958, "tcp" }, - { "dxadmind", { NULL }, 1958, "udp" }, - { "simp-all", { NULL }, 1959, "tcp" }, - { "simp-all", { NULL }, 1959, "udp" }, - { "nasmanager", { NULL }, 1960, "tcp" }, - { "nasmanager", { NULL }, 1960, "udp" }, - { "bts-appserver", { NULL }, 1961, "tcp" }, - { "bts-appserver", { NULL }, 1961, "udp" }, - { "biap-mp", { NULL }, 1962, "tcp" }, - { "biap-mp", { NULL }, 1962, "udp" }, - { "webmachine", { NULL }, 1963, "tcp" }, - { "webmachine", { NULL }, 1963, "udp" }, - { "solid-e-engine", { NULL }, 1964, "tcp" }, - { "solid-e-engine", { NULL }, 1964, "udp" }, - { "tivoli-npm", { NULL }, 1965, "tcp" }, - { "tivoli-npm", { NULL }, 1965, "udp" }, - { "slush", { NULL }, 1966, "tcp" }, - { "slush", { NULL }, 1966, "udp" }, - { "sns-quote", { NULL }, 1967, "tcp" }, - { "sns-quote", { NULL }, 1967, "udp" }, - { "lipsinc", { NULL }, 1968, "tcp" }, - { "lipsinc", { NULL }, 1968, "udp" }, - { "lipsinc1", { NULL }, 1969, "tcp" }, - { "lipsinc1", { NULL }, 1969, "udp" }, - { "netop-rc", { NULL }, 1970, "tcp" }, - { "netop-rc", { NULL }, 1970, "udp" }, - { "netop-school", { NULL }, 1971, "tcp" }, - { "netop-school", { NULL }, 1971, "udp" }, - { "intersys-cache", { NULL }, 1972, "tcp" }, - { "intersys-cache", { NULL }, 1972, "udp" }, - { "dlsrap", { NULL }, 1973, "tcp" }, - { "dlsrap", { NULL }, 1973, "udp" }, - { "drp", { NULL }, 1974, "tcp" }, - { "drp", { NULL }, 1974, "udp" }, - { "tcoflashagent", { NULL }, 1975, "tcp" }, - { "tcoflashagent", { NULL }, 1975, "udp" }, - { "tcoregagent", { NULL }, 1976, "tcp" }, - { "tcoregagent", { NULL }, 1976, "udp" }, - { "tcoaddressbook", { NULL }, 1977, "tcp" }, - { "tcoaddressbook", { NULL }, 1977, "udp" }, - { "unisql", { NULL }, 1978, "tcp" }, - { "unisql", { NULL }, 1978, "udp" }, - { "unisql-java", { NULL }, 1979, "tcp" }, - { "unisql-java", { NULL }, 1979, "udp" }, - { "pearldoc-xact", { NULL }, 1980, "tcp" }, - { "pearldoc-xact", { NULL }, 1980, "udp" }, - { "p2pq", { NULL }, 1981, "tcp" }, - { "p2pq", { NULL }, 1981, "udp" }, - { "estamp", { NULL }, 1982, "tcp" }, - { "estamp", { NULL }, 1982, "udp" }, - { "lhtp", { NULL }, 1983, "tcp" }, - { "lhtp", { NULL }, 1983, "udp" }, - { "bb", { NULL }, 1984, "tcp" }, - { "bb", { NULL }, 1984, "udp" }, - { "hsrp", { NULL }, 1985, "tcp" }, - { "hsrp", { NULL }, 1985, "udp" }, - { "licensedaemon", { NULL }, 1986, "tcp" }, - { "licensedaemon", { NULL }, 1986, "udp" }, - { "tr-rsrb-p1", { NULL }, 1987, "tcp" }, - { "tr-rsrb-p1", { NULL }, 1987, "udp" }, - { "tr-rsrb-p2", { NULL }, 1988, "tcp" }, - { "tr-rsrb-p2", { NULL }, 1988, "udp" }, - { "tr-rsrb-p3", { NULL }, 1989, "tcp" }, - { "tr-rsrb-p3", { NULL }, 1989, "udp" }, - { "mshnet", { NULL }, 1989, "tcp" }, - { "mshnet", { NULL }, 1989, "udp" }, - { "stun-p1", { NULL }, 1990, "tcp" }, - { "stun-p1", { NULL }, 1990, "udp" }, - { "stun-p2", { NULL }, 1991, "tcp" }, - { "stun-p2", { NULL }, 1991, "udp" }, - { "stun-p3", { NULL }, 1992, "tcp" }, - { "stun-p3", { NULL }, 1992, "udp" }, - { "ipsendmsg", { NULL }, 1992, "tcp" }, - { "ipsendmsg", { NULL }, 1992, "udp" }, - { "snmp-tcp-port", { NULL }, 1993, "tcp" }, - { "snmp-tcp-port", { NULL }, 1993, "udp" }, - { "stun-port", { NULL }, 1994, "tcp" }, - { "stun-port", { NULL }, 1994, "udp" }, - { "perf-port", { NULL }, 1995, "tcp" }, - { "perf-port", { NULL }, 1995, "udp" }, - { "tr-rsrb-port", { NULL }, 1996, "tcp" }, - { "tr-rsrb-port", { NULL }, 1996, "udp" }, - { "gdp-port", { NULL }, 1997, "tcp" }, - { "gdp-port", { NULL }, 1997, "udp" }, - { "x25-svc-port", { NULL }, 1998, "tcp" }, - { "x25-svc-port", { NULL }, 1998, "udp" }, - { "tcp-id-port", { NULL }, 1999, "tcp" }, - { "tcp-id-port", { NULL }, 1999, "udp" }, - { "cisco-sccp", { NULL }, 2000, "tcp" }, - { "cisco-sccp", { NULL }, 2000, "udp" }, - { "dc", { NULL }, 2001, "tcp" }, - { "wizard", { NULL }, 2001, "udp" }, - { "globe", { NULL }, 2002, "tcp" }, - { "globe", { NULL }, 2002, "udp" }, - { "brutus", { NULL }, 2003, "tcp" }, - { "brutus", { NULL }, 2003, "udp" }, - { "mailbox", { NULL }, 2004, "tcp" }, - { "emce", { NULL }, 2004, "udp" }, - { "berknet", { NULL }, 2005, "tcp" }, - { "oracle", { NULL }, 2005, "udp" }, - { "invokator", { NULL }, 2006, "tcp" }, - { "raid-cd", { NULL }, 2006, "udp" }, - { "dectalk", { NULL }, 2007, "tcp" }, - { "raid-am", { NULL }, 2007, "udp" }, - { "conf", { NULL }, 2008, "tcp" }, - { "terminaldb", { NULL }, 2008, "udp" }, - { "news", { NULL }, 2009, "tcp" }, - { "whosockami", { NULL }, 2009, "udp" }, - { "search", { NULL }, 2010, "tcp" }, - { "pipe_server", { NULL }, 2010, "udp" }, - { "raid-cc", { NULL }, 2011, "tcp" }, - { "servserv", { NULL }, 2011, "udp" }, - { "ttyinfo", { NULL }, 2012, "tcp" }, - { "raid-ac", { NULL }, 2012, "udp" }, - { "raid-am", { NULL }, 2013, "tcp" }, - { "raid-cd", { NULL }, 2013, "udp" }, - { "troff", { NULL }, 2014, "tcp" }, - { "raid-sf", { NULL }, 2014, "udp" }, - { "cypress", { NULL }, 2015, "tcp" }, - { "raid-cs", { NULL }, 2015, "udp" }, - { "bootserver", { NULL }, 2016, "tcp" }, - { "bootserver", { NULL }, 2016, "udp" }, - { "cypress-stat", { NULL }, 2017, "tcp" }, - { "bootclient", { NULL }, 2017, "udp" }, - { "terminaldb", { NULL }, 2018, "tcp" }, - { "rellpack", { NULL }, 2018, "udp" }, - { "whosockami", { NULL }, 2019, "tcp" }, - { "about", { NULL }, 2019, "udp" }, - { "xinupageserver", { NULL }, 2020, "tcp" }, - { "xinupageserver", { NULL }, 2020, "udp" }, - { "servexec", { NULL }, 2021, "tcp" }, - { "xinuexpansion1", { NULL }, 2021, "udp" }, - { "down", { NULL }, 2022, "tcp" }, - { "xinuexpansion2", { NULL }, 2022, "udp" }, - { "xinuexpansion3", { NULL }, 2023, "tcp" }, - { "xinuexpansion3", { NULL }, 2023, "udp" }, - { "xinuexpansion4", { NULL }, 2024, "tcp" }, - { "xinuexpansion4", { NULL }, 2024, "udp" }, - { "ellpack", { NULL }, 2025, "tcp" }, - { "xribs", { NULL }, 2025, "udp" }, - { "scrabble", { NULL }, 2026, "tcp" }, - { "scrabble", { NULL }, 2026, "udp" }, - { "shadowserver", { NULL }, 2027, "tcp" }, - { "shadowserver", { NULL }, 2027, "udp" }, - { "submitserver", { NULL }, 2028, "tcp" }, - { "submitserver", { NULL }, 2028, "udp" }, - { "hsrpv6", { NULL }, 2029, "tcp" }, - { "hsrpv6", { NULL }, 2029, "udp" }, - { "device2", { NULL }, 2030, "tcp" }, - { "device2", { NULL }, 2030, "udp" }, - { "mobrien-chat", { NULL }, 2031, "tcp" }, - { "mobrien-chat", { NULL }, 2031, "udp" }, - { "blackboard", { NULL }, 2032, "tcp" }, - { "blackboard", { NULL }, 2032, "udp" }, - { "glogger", { NULL }, 2033, "tcp" }, - { "glogger", { NULL }, 2033, "udp" }, - { "scoremgr", { NULL }, 2034, "tcp" }, - { "scoremgr", { NULL }, 2034, "udp" }, - { "imsldoc", { NULL }, 2035, "tcp" }, - { "imsldoc", { NULL }, 2035, "udp" }, - { "e-dpnet", { NULL }, 2036, "tcp" }, - { "e-dpnet", { NULL }, 2036, "udp" }, - { "applus", { NULL }, 2037, "tcp" }, - { "applus", { NULL }, 2037, "udp" }, - { "objectmanager", { NULL }, 2038, "tcp" }, - { "objectmanager", { NULL }, 2038, "udp" }, - { "prizma", { NULL }, 2039, "tcp" }, - { "prizma", { NULL }, 2039, "udp" }, - { "lam", { NULL }, 2040, "tcp" }, - { "lam", { NULL }, 2040, "udp" }, - { "interbase", { NULL }, 2041, "tcp" }, - { "interbase", { NULL }, 2041, "udp" }, - { "isis", { NULL }, 2042, "tcp" }, - { "isis", { NULL }, 2042, "udp" }, - { "isis-bcast", { NULL }, 2043, "tcp" }, - { "isis-bcast", { NULL }, 2043, "udp" }, - { "rimsl", { NULL }, 2044, "tcp" }, - { "rimsl", { NULL }, 2044, "udp" }, - { "cdfunc", { NULL }, 2045, "tcp" }, - { "cdfunc", { NULL }, 2045, "udp" }, - { "sdfunc", { NULL }, 2046, "tcp" }, - { "sdfunc", { NULL }, 2046, "udp" }, - { "dls", { NULL }, 2047, "tcp" }, - { "dls", { NULL }, 2047, "udp" }, - { "dls-monitor", { NULL }, 2048, "tcp" }, - { "dls-monitor", { NULL }, 2048, "udp" }, - { "shilp", { NULL }, 2049, "tcp" }, - { "shilp", { NULL }, 2049, "udp" }, - { "nfs", { NULL }, 2049, "tcp" }, - { "nfs", { NULL }, 2049, "udp" }, - { "nfs", { NULL }, 2049, "sctp"}, - { "av-emb-config", { NULL }, 2050, "tcp" }, - { "av-emb-config", { NULL }, 2050, "udp" }, - { "epnsdp", { NULL }, 2051, "tcp" }, - { "epnsdp", { NULL }, 2051, "udp" }, - { "clearvisn", { NULL }, 2052, "tcp" }, - { "clearvisn", { NULL }, 2052, "udp" }, - { "lot105-ds-upd", { NULL }, 2053, "tcp" }, - { "lot105-ds-upd", { NULL }, 2053, "udp" }, - { "weblogin", { NULL }, 2054, "tcp" }, - { "weblogin", { NULL }, 2054, "udp" }, - { "iop", { NULL }, 2055, "tcp" }, - { "iop", { NULL }, 2055, "udp" }, - { "omnisky", { NULL }, 2056, "tcp" }, - { "omnisky", { NULL }, 2056, "udp" }, - { "rich-cp", { NULL }, 2057, "tcp" }, - { "rich-cp", { NULL }, 2057, "udp" }, - { "newwavesearch", { NULL }, 2058, "tcp" }, - { "newwavesearch", { NULL }, 2058, "udp" }, - { "bmc-messaging", { NULL }, 2059, "tcp" }, - { "bmc-messaging", { NULL }, 2059, "udp" }, - { "teleniumdaemon", { NULL }, 2060, "tcp" }, - { "teleniumdaemon", { NULL }, 2060, "udp" }, - { "netmount", { NULL }, 2061, "tcp" }, - { "netmount", { NULL }, 2061, "udp" }, - { "icg-swp", { NULL }, 2062, "tcp" }, - { "icg-swp", { NULL }, 2062, "udp" }, - { "icg-bridge", { NULL }, 2063, "tcp" }, - { "icg-bridge", { NULL }, 2063, "udp" }, - { "icg-iprelay", { NULL }, 2064, "tcp" }, - { "icg-iprelay", { NULL }, 2064, "udp" }, - { "dlsrpn", { NULL }, 2065, "tcp" }, - { "dlsrpn", { NULL }, 2065, "udp" }, - { "aura", { NULL }, 2066, "tcp" }, - { "aura", { NULL }, 2066, "udp" }, - { "dlswpn", { NULL }, 2067, "tcp" }, - { "dlswpn", { NULL }, 2067, "udp" }, - { "avauthsrvprtcl", { NULL }, 2068, "tcp" }, - { "avauthsrvprtcl", { NULL }, 2068, "udp" }, - { "event-port", { NULL }, 2069, "tcp" }, - { "event-port", { NULL }, 2069, "udp" }, - { "ah-esp-encap", { NULL }, 2070, "tcp" }, - { "ah-esp-encap", { NULL }, 2070, "udp" }, - { "acp-port", { NULL }, 2071, "tcp" }, - { "acp-port", { NULL }, 2071, "udp" }, - { "msync", { NULL }, 2072, "tcp" }, - { "msync", { NULL }, 2072, "udp" }, - { "gxs-data-port", { NULL }, 2073, "tcp" }, - { "gxs-data-port", { NULL }, 2073, "udp" }, - { "vrtl-vmf-sa", { NULL }, 2074, "tcp" }, - { "vrtl-vmf-sa", { NULL }, 2074, "udp" }, - { "newlixengine", { NULL }, 2075, "tcp" }, - { "newlixengine", { NULL }, 2075, "udp" }, - { "newlixconfig", { NULL }, 2076, "tcp" }, - { "newlixconfig", { NULL }, 2076, "udp" }, - { "tsrmagt", { NULL }, 2077, "tcp" }, - { "tsrmagt", { NULL }, 2077, "udp" }, - { "tpcsrvr", { NULL }, 2078, "tcp" }, - { "tpcsrvr", { NULL }, 2078, "udp" }, - { "idware-router", { NULL }, 2079, "tcp" }, - { "idware-router", { NULL }, 2079, "udp" }, - { "autodesk-nlm", { NULL }, 2080, "tcp" }, - { "autodesk-nlm", { NULL }, 2080, "udp" }, - { "kme-trap-port", { NULL }, 2081, "tcp" }, - { "kme-trap-port", { NULL }, 2081, "udp" }, - { "infowave", { NULL }, 2082, "tcp" }, - { "infowave", { NULL }, 2082, "udp" }, - { "radsec", { NULL }, 2083, "tcp" }, - { "radsec", { NULL }, 2083, "udp" }, - { "sunclustergeo", { NULL }, 2084, "tcp" }, - { "sunclustergeo", { NULL }, 2084, "udp" }, - { "ada-cip", { NULL }, 2085, "tcp" }, - { "ada-cip", { NULL }, 2085, "udp" }, - { "gnunet", { NULL }, 2086, "tcp" }, - { "gnunet", { NULL }, 2086, "udp" }, - { "eli", { NULL }, 2087, "tcp" }, - { "eli", { NULL }, 2087, "udp" }, - { "ip-blf", { NULL }, 2088, "tcp" }, - { "ip-blf", { NULL }, 2088, "udp" }, - { "sep", { NULL }, 2089, "tcp" }, - { "sep", { NULL }, 2089, "udp" }, - { "lrp", { NULL }, 2090, "tcp" }, - { "lrp", { NULL }, 2090, "udp" }, - { "prp", { NULL }, 2091, "tcp" }, - { "prp", { NULL }, 2091, "udp" }, - { "descent3", { NULL }, 2092, "tcp" }, - { "descent3", { NULL }, 2092, "udp" }, - { "nbx-cc", { NULL }, 2093, "tcp" }, - { "nbx-cc", { NULL }, 2093, "udp" }, - { "nbx-au", { NULL }, 2094, "tcp" }, - { "nbx-au", { NULL }, 2094, "udp" }, - { "nbx-ser", { NULL }, 2095, "tcp" }, - { "nbx-ser", { NULL }, 2095, "udp" }, - { "nbx-dir", { NULL }, 2096, "tcp" }, - { "nbx-dir", { NULL }, 2096, "udp" }, - { "jetformpreview", { NULL }, 2097, "tcp" }, - { "jetformpreview", { NULL }, 2097, "udp" }, - { "dialog-port", { NULL }, 2098, "tcp" }, - { "dialog-port", { NULL }, 2098, "udp" }, - { "h2250-annex-g", { NULL }, 2099, "tcp" }, - { "h2250-annex-g", { NULL }, 2099, "udp" }, - { "amiganetfs", { NULL }, 2100, "tcp" }, - { "amiganetfs", { NULL }, 2100, "udp" }, - { "rtcm-sc104", { NULL }, 2101, "tcp" }, - { "rtcm-sc104", { NULL }, 2101, "udp" }, - { "zephyr-srv", { NULL }, 2102, "tcp" }, - { "zephyr-srv", { NULL }, 2102, "udp" }, - { "zephyr-clt", { NULL }, 2103, "tcp" }, - { "zephyr-clt", { NULL }, 2103, "udp" }, - { "zephyr-hm", { NULL }, 2104, "tcp" }, - { "zephyr-hm", { NULL }, 2104, "udp" }, - { "minipay", { NULL }, 2105, "tcp" }, - { "minipay", { NULL }, 2105, "udp" }, - { "mzap", { NULL }, 2106, "tcp" }, - { "mzap", { NULL }, 2106, "udp" }, - { "bintec-admin", { NULL }, 2107, "tcp" }, - { "bintec-admin", { NULL }, 2107, "udp" }, - { "comcam", { NULL }, 2108, "tcp" }, - { "comcam", { NULL }, 2108, "udp" }, - { "ergolight", { NULL }, 2109, "tcp" }, - { "ergolight", { NULL }, 2109, "udp" }, - { "umsp", { NULL }, 2110, "tcp" }, - { "umsp", { NULL }, 2110, "udp" }, - { "dsatp", { NULL }, 2111, "tcp" }, - { "dsatp", { NULL }, 2111, "udp" }, - { "idonix-metanet", { NULL }, 2112, "tcp" }, - { "idonix-metanet", { NULL }, 2112, "udp" }, - { "hsl-storm", { NULL }, 2113, "tcp" }, - { "hsl-storm", { NULL }, 2113, "udp" }, - { "newheights", { NULL }, 2114, "tcp" }, - { "newheights", { NULL }, 2114, "udp" }, - { "kdm", { NULL }, 2115, "tcp" }, - { "kdm", { NULL }, 2115, "udp" }, - { "ccowcmr", { NULL }, 2116, "tcp" }, - { "ccowcmr", { NULL }, 2116, "udp" }, - { "mentaclient", { NULL }, 2117, "tcp" }, - { "mentaclient", { NULL }, 2117, "udp" }, - { "mentaserver", { NULL }, 2118, "tcp" }, - { "mentaserver", { NULL }, 2118, "udp" }, - { "gsigatekeeper", { NULL }, 2119, "tcp" }, - { "gsigatekeeper", { NULL }, 2119, "udp" }, - { "qencp", { NULL }, 2120, "tcp" }, - { "qencp", { NULL }, 2120, "udp" }, - { "scientia-ssdb", { NULL }, 2121, "tcp" }, - { "scientia-ssdb", { NULL }, 2121, "udp" }, - { "caupc-remote", { NULL }, 2122, "tcp" }, - { "caupc-remote", { NULL }, 2122, "udp" }, - { "gtp-control", { NULL }, 2123, "tcp" }, - { "gtp-control", { NULL }, 2123, "udp" }, - { "elatelink", { NULL }, 2124, "tcp" }, - { "elatelink", { NULL }, 2124, "udp" }, - { "lockstep", { NULL }, 2125, "tcp" }, - { "lockstep", { NULL }, 2125, "udp" }, - { "pktcable-cops", { NULL }, 2126, "tcp" }, - { "pktcable-cops", { NULL }, 2126, "udp" }, - { "index-pc-wb", { NULL }, 2127, "tcp" }, - { "index-pc-wb", { NULL }, 2127, "udp" }, - { "net-steward", { NULL }, 2128, "tcp" }, - { "net-steward", { NULL }, 2128, "udp" }, - { "cs-live", { NULL }, 2129, "tcp" }, - { "cs-live", { NULL }, 2129, "udp" }, - { "xds", { NULL }, 2130, "tcp" }, - { "xds", { NULL }, 2130, "udp" }, - { "avantageb2b", { NULL }, 2131, "tcp" }, - { "avantageb2b", { NULL }, 2131, "udp" }, - { "solera-epmap", { NULL }, 2132, "tcp" }, - { "solera-epmap", { NULL }, 2132, "udp" }, - { "zymed-zpp", { NULL }, 2133, "tcp" }, - { "zymed-zpp", { NULL }, 2133, "udp" }, - { "avenue", { NULL }, 2134, "tcp" }, - { "avenue", { NULL }, 2134, "udp" }, - { "gris", { NULL }, 2135, "tcp" }, - { "gris", { NULL }, 2135, "udp" }, - { "appworxsrv", { NULL }, 2136, "tcp" }, - { "appworxsrv", { NULL }, 2136, "udp" }, - { "connect", { NULL }, 2137, "tcp" }, - { "connect", { NULL }, 2137, "udp" }, - { "unbind-cluster", { NULL }, 2138, "tcp" }, - { "unbind-cluster", { NULL }, 2138, "udp" }, - { "ias-auth", { NULL }, 2139, "tcp" }, - { "ias-auth", { NULL }, 2139, "udp" }, - { "ias-reg", { NULL }, 2140, "tcp" }, - { "ias-reg", { NULL }, 2140, "udp" }, - { "ias-admind", { NULL }, 2141, "tcp" }, - { "ias-admind", { NULL }, 2141, "udp" }, - { "tdmoip", { NULL }, 2142, "tcp" }, - { "tdmoip", { NULL }, 2142, "udp" }, - { "lv-jc", { NULL }, 2143, "tcp" }, - { "lv-jc", { NULL }, 2143, "udp" }, - { "lv-ffx", { NULL }, 2144, "tcp" }, - { "lv-ffx", { NULL }, 2144, "udp" }, - { "lv-pici", { NULL }, 2145, "tcp" }, - { "lv-pici", { NULL }, 2145, "udp" }, - { "lv-not", { NULL }, 2146, "tcp" }, - { "lv-not", { NULL }, 2146, "udp" }, - { "lv-auth", { NULL }, 2147, "tcp" }, - { "lv-auth", { NULL }, 2147, "udp" }, - { "veritas-ucl", { NULL }, 2148, "tcp" }, - { "veritas-ucl", { NULL }, 2148, "udp" }, - { "acptsys", { NULL }, 2149, "tcp" }, - { "acptsys", { NULL }, 2149, "udp" }, - { "dynamic3d", { NULL }, 2150, "tcp" }, - { "dynamic3d", { NULL }, 2150, "udp" }, - { "docent", { NULL }, 2151, "tcp" }, - { "docent", { NULL }, 2151, "udp" }, - { "gtp-user", { NULL }, 2152, "tcp" }, - { "gtp-user", { NULL }, 2152, "udp" }, - { "ctlptc", { NULL }, 2153, "tcp" }, - { "ctlptc", { NULL }, 2153, "udp" }, - { "stdptc", { NULL }, 2154, "tcp" }, - { "stdptc", { NULL }, 2154, "udp" }, - { "brdptc", { NULL }, 2155, "tcp" }, - { "brdptc", { NULL }, 2155, "udp" }, - { "trp", { NULL }, 2156, "tcp" }, - { "trp", { NULL }, 2156, "udp" }, - { "xnds", { NULL }, 2157, "tcp" }, - { "xnds", { NULL }, 2157, "udp" }, - { "touchnetplus", { NULL }, 2158, "tcp" }, - { "touchnetplus", { NULL }, 2158, "udp" }, - { "gdbremote", { NULL }, 2159, "tcp" }, - { "gdbremote", { NULL }, 2159, "udp" }, - { "apc-2160", { NULL }, 2160, "tcp" }, - { "apc-2160", { NULL }, 2160, "udp" }, - { "apc-2161", { NULL }, 2161, "tcp" }, - { "apc-2161", { NULL }, 2161, "udp" }, - { "navisphere", { NULL }, 2162, "tcp" }, - { "navisphere", { NULL }, 2162, "udp" }, - { "navisphere-sec", { NULL }, 2163, "tcp" }, - { "navisphere-sec", { NULL }, 2163, "udp" }, - { "ddns-v3", { NULL }, 2164, "tcp" }, - { "ddns-v3", { NULL }, 2164, "udp" }, - { "x-bone-api", { NULL }, 2165, "tcp" }, - { "x-bone-api", { NULL }, 2165, "udp" }, - { "iwserver", { NULL }, 2166, "tcp" }, - { "iwserver", { NULL }, 2166, "udp" }, - { "raw-serial", { NULL }, 2167, "tcp" }, - { "raw-serial", { NULL }, 2167, "udp" }, - { "easy-soft-mux", { NULL }, 2168, "tcp" }, - { "easy-soft-mux", { NULL }, 2168, "udp" }, - { "brain", { NULL }, 2169, "tcp" }, - { "brain", { NULL }, 2169, "udp" }, - { "eyetv", { NULL }, 2170, "tcp" }, - { "eyetv", { NULL }, 2170, "udp" }, - { "msfw-storage", { NULL }, 2171, "tcp" }, - { "msfw-storage", { NULL }, 2171, "udp" }, - { "msfw-s-storage", { NULL }, 2172, "tcp" }, - { "msfw-s-storage", { NULL }, 2172, "udp" }, - { "msfw-replica", { NULL }, 2173, "tcp" }, - { "msfw-replica", { NULL }, 2173, "udp" }, - { "msfw-array", { NULL }, 2174, "tcp" }, - { "msfw-array", { NULL }, 2174, "udp" }, - { "airsync", { NULL }, 2175, "tcp" }, - { "airsync", { NULL }, 2175, "udp" }, - { "rapi", { NULL }, 2176, "tcp" }, - { "rapi", { NULL }, 2176, "udp" }, - { "qwave", { NULL }, 2177, "tcp" }, - { "qwave", { NULL }, 2177, "udp" }, - { "bitspeer", { NULL }, 2178, "tcp" }, - { "bitspeer", { NULL }, 2178, "udp" }, - { "vmrdp", { NULL }, 2179, "tcp" }, - { "vmrdp", { NULL }, 2179, "udp" }, - { "mc-gt-srv", { NULL }, 2180, "tcp" }, - { "mc-gt-srv", { NULL }, 2180, "udp" }, - { "eforward", { NULL }, 2181, "tcp" }, - { "eforward", { NULL }, 2181, "udp" }, - { "cgn-stat", { NULL }, 2182, "tcp" }, - { "cgn-stat", { NULL }, 2182, "udp" }, - { "cgn-config", { NULL }, 2183, "tcp" }, - { "cgn-config", { NULL }, 2183, "udp" }, - { "nvd", { NULL }, 2184, "tcp" }, - { "nvd", { NULL }, 2184, "udp" }, - { "onbase-dds", { NULL }, 2185, "tcp" }, - { "onbase-dds", { NULL }, 2185, "udp" }, - { "gtaua", { NULL }, 2186, "tcp" }, - { "gtaua", { NULL }, 2186, "udp" }, - { "ssmc", { NULL }, 2187, "tcp" }, - { "ssmd", { NULL }, 2187, "udp" }, - { "tivoconnect", { NULL }, 2190, "tcp" }, - { "tivoconnect", { NULL }, 2190, "udp" }, - { "tvbus", { NULL }, 2191, "tcp" }, - { "tvbus", { NULL }, 2191, "udp" }, - { "asdis", { NULL }, 2192, "tcp" }, - { "asdis", { NULL }, 2192, "udp" }, - { "drwcs", { NULL }, 2193, "tcp" }, - { "drwcs", { NULL }, 2193, "udp" }, - { "mnp-exchange", { NULL }, 2197, "tcp" }, - { "mnp-exchange", { NULL }, 2197, "udp" }, - { "onehome-remote", { NULL }, 2198, "tcp" }, - { "onehome-remote", { NULL }, 2198, "udp" }, - { "onehome-help", { NULL }, 2199, "tcp" }, - { "onehome-help", { NULL }, 2199, "udp" }, - { "ici", { NULL }, 2200, "tcp" }, - { "ici", { NULL }, 2200, "udp" }, - { "ats", { NULL }, 2201, "tcp" }, - { "ats", { NULL }, 2201, "udp" }, - { "imtc-map", { NULL }, 2202, "tcp" }, - { "imtc-map", { NULL }, 2202, "udp" }, - { "b2-runtime", { NULL }, 2203, "tcp" }, - { "b2-runtime", { NULL }, 2203, "udp" }, - { "b2-license", { NULL }, 2204, "tcp" }, - { "b2-license", { NULL }, 2204, "udp" }, - { "jps", { NULL }, 2205, "tcp" }, - { "jps", { NULL }, 2205, "udp" }, - { "hpocbus", { NULL }, 2206, "tcp" }, - { "hpocbus", { NULL }, 2206, "udp" }, - { "hpssd", { NULL }, 2207, "tcp" }, - { "hpssd", { NULL }, 2207, "udp" }, - { "hpiod", { NULL }, 2208, "tcp" }, - { "hpiod", { NULL }, 2208, "udp" }, - { "rimf-ps", { NULL }, 2209, "tcp" }, - { "rimf-ps", { NULL }, 2209, "udp" }, - { "noaaport", { NULL }, 2210, "tcp" }, - { "noaaport", { NULL }, 2210, "udp" }, - { "emwin", { NULL }, 2211, "tcp" }, - { "emwin", { NULL }, 2211, "udp" }, - { "leecoposserver", { NULL }, 2212, "tcp" }, - { "leecoposserver", { NULL }, 2212, "udp" }, - { "kali", { NULL }, 2213, "tcp" }, - { "kali", { NULL }, 2213, "udp" }, - { "rpi", { NULL }, 2214, "tcp" }, - { "rpi", { NULL }, 2214, "udp" }, - { "ipcore", { NULL }, 2215, "tcp" }, - { "ipcore", { NULL }, 2215, "udp" }, - { "vtu-comms", { NULL }, 2216, "tcp" }, - { "vtu-comms", { NULL }, 2216, "udp" }, - { "gotodevice", { NULL }, 2217, "tcp" }, - { "gotodevice", { NULL }, 2217, "udp" }, - { "bounzza", { NULL }, 2218, "tcp" }, - { "bounzza", { NULL }, 2218, "udp" }, - { "netiq-ncap", { NULL }, 2219, "tcp" }, - { "netiq-ncap", { NULL }, 2219, "udp" }, - { "netiq", { NULL }, 2220, "tcp" }, - { "netiq", { NULL }, 2220, "udp" }, - { "rockwell-csp1", { NULL }, 2221, "tcp" }, - { "rockwell-csp1", { NULL }, 2221, "udp" }, - { "EtherNet/IP-1", { NULL }, 2222, "tcp" }, - { "EtherNet/IP-1", { NULL }, 2222, "udp" }, - { "rockwell-csp2", { NULL }, 2223, "tcp" }, - { "rockwell-csp2", { NULL }, 2223, "udp" }, - { "efi-mg", { NULL }, 2224, "tcp" }, - { "efi-mg", { NULL }, 2224, "udp" }, - { "rcip-itu", { NULL }, 2225, "tcp" }, - { "rcip-itu", { NULL }, 2225, "sctp"}, - { "di-drm", { NULL }, 2226, "tcp" }, - { "di-drm", { NULL }, 2226, "udp" }, - { "di-msg", { NULL }, 2227, "tcp" }, - { "di-msg", { NULL }, 2227, "udp" }, - { "ehome-ms", { NULL }, 2228, "tcp" }, - { "ehome-ms", { NULL }, 2228, "udp" }, - { "datalens", { NULL }, 2229, "tcp" }, - { "datalens", { NULL }, 2229, "udp" }, - { "queueadm", { NULL }, 2230, "tcp" }, - { "queueadm", { NULL }, 2230, "udp" }, - { "wimaxasncp", { NULL }, 2231, "tcp" }, - { "wimaxasncp", { NULL }, 2231, "udp" }, - { "ivs-video", { NULL }, 2232, "tcp" }, - { "ivs-video", { NULL }, 2232, "udp" }, - { "infocrypt", { NULL }, 2233, "tcp" }, - { "infocrypt", { NULL }, 2233, "udp" }, - { "directplay", { NULL }, 2234, "tcp" }, - { "directplay", { NULL }, 2234, "udp" }, - { "sercomm-wlink", { NULL }, 2235, "tcp" }, - { "sercomm-wlink", { NULL }, 2235, "udp" }, - { "nani", { NULL }, 2236, "tcp" }, - { "nani", { NULL }, 2236, "udp" }, - { "optech-port1-lm", { NULL }, 2237, "tcp" }, - { "optech-port1-lm", { NULL }, 2237, "udp" }, - { "aviva-sna", { NULL }, 2238, "tcp" }, - { "aviva-sna", { NULL }, 2238, "udp" }, - { "imagequery", { NULL }, 2239, "tcp" }, - { "imagequery", { NULL }, 2239, "udp" }, - { "recipe", { NULL }, 2240, "tcp" }, - { "recipe", { NULL }, 2240, "udp" }, - { "ivsd", { NULL }, 2241, "tcp" }, - { "ivsd", { NULL }, 2241, "udp" }, - { "foliocorp", { NULL }, 2242, "tcp" }, - { "foliocorp", { NULL }, 2242, "udp" }, - { "magicom", { NULL }, 2243, "tcp" }, - { "magicom", { NULL }, 2243, "udp" }, - { "nmsserver", { NULL }, 2244, "tcp" }, - { "nmsserver", { NULL }, 2244, "udp" }, - { "hao", { NULL }, 2245, "tcp" }, - { "hao", { NULL }, 2245, "udp" }, - { "pc-mta-addrmap", { NULL }, 2246, "tcp" }, - { "pc-mta-addrmap", { NULL }, 2246, "udp" }, - { "antidotemgrsvr", { NULL }, 2247, "tcp" }, - { "antidotemgrsvr", { NULL }, 2247, "udp" }, - { "ums", { NULL }, 2248, "tcp" }, - { "ums", { NULL }, 2248, "udp" }, - { "rfmp", { NULL }, 2249, "tcp" }, - { "rfmp", { NULL }, 2249, "udp" }, - { "remote-collab", { NULL }, 2250, "tcp" }, - { "remote-collab", { NULL }, 2250, "udp" }, - { "dif-port", { NULL }, 2251, "tcp" }, - { "dif-port", { NULL }, 2251, "udp" }, - { "njenet-ssl", { NULL }, 2252, "tcp" }, - { "njenet-ssl", { NULL }, 2252, "udp" }, - { "dtv-chan-req", { NULL }, 2253, "tcp" }, - { "dtv-chan-req", { NULL }, 2253, "udp" }, - { "seispoc", { NULL }, 2254, "tcp" }, - { "seispoc", { NULL }, 2254, "udp" }, - { "vrtp", { NULL }, 2255, "tcp" }, - { "vrtp", { NULL }, 2255, "udp" }, - { "pcc-mfp", { NULL }, 2256, "tcp" }, - { "pcc-mfp", { NULL }, 2256, "udp" }, - { "simple-tx-rx", { NULL }, 2257, "tcp" }, - { "simple-tx-rx", { NULL }, 2257, "udp" }, - { "rcts", { NULL }, 2258, "tcp" }, - { "rcts", { NULL }, 2258, "udp" }, - { "acd-pm", { NULL }, 2259, "tcp" }, - { "acd-pm", { NULL }, 2259, "udp" }, - { "apc-2260", { NULL }, 2260, "tcp" }, - { "apc-2260", { NULL }, 2260, "udp" }, - { "comotionmaster", { NULL }, 2261, "tcp" }, - { "comotionmaster", { NULL }, 2261, "udp" }, - { "comotionback", { NULL }, 2262, "tcp" }, - { "comotionback", { NULL }, 2262, "udp" }, - { "ecwcfg", { NULL }, 2263, "tcp" }, - { "ecwcfg", { NULL }, 2263, "udp" }, - { "apx500api-1", { NULL }, 2264, "tcp" }, - { "apx500api-1", { NULL }, 2264, "udp" }, - { "apx500api-2", { NULL }, 2265, "tcp" }, - { "apx500api-2", { NULL }, 2265, "udp" }, - { "mfserver", { NULL }, 2266, "tcp" }, - { "mfserver", { NULL }, 2266, "udp" }, - { "ontobroker", { NULL }, 2267, "tcp" }, - { "ontobroker", { NULL }, 2267, "udp" }, - { "amt", { NULL }, 2268, "tcp" }, - { "amt", { NULL }, 2268, "udp" }, - { "mikey", { NULL }, 2269, "tcp" }, - { "mikey", { NULL }, 2269, "udp" }, - { "starschool", { NULL }, 2270, "tcp" }, - { "starschool", { NULL }, 2270, "udp" }, - { "mmcals", { NULL }, 2271, "tcp" }, - { "mmcals", { NULL }, 2271, "udp" }, - { "mmcal", { NULL }, 2272, "tcp" }, - { "mmcal", { NULL }, 2272, "udp" }, - { "mysql-im", { NULL }, 2273, "tcp" }, - { "mysql-im", { NULL }, 2273, "udp" }, - { "pcttunnell", { NULL }, 2274, "tcp" }, - { "pcttunnell", { NULL }, 2274, "udp" }, - { "ibridge-data", { NULL }, 2275, "tcp" }, - { "ibridge-data", { NULL }, 2275, "udp" }, - { "ibridge-mgmt", { NULL }, 2276, "tcp" }, - { "ibridge-mgmt", { NULL }, 2276, "udp" }, - { "bluectrlproxy", { NULL }, 2277, "tcp" }, - { "bluectrlproxy", { NULL }, 2277, "udp" }, - { "s3db", { NULL }, 2278, "tcp" }, - { "s3db", { NULL }, 2278, "udp" }, - { "xmquery", { NULL }, 2279, "tcp" }, - { "xmquery", { NULL }, 2279, "udp" }, - { "lnvpoller", { NULL }, 2280, "tcp" }, - { "lnvpoller", { NULL }, 2280, "udp" }, - { "lnvconsole", { NULL }, 2281, "tcp" }, - { "lnvconsole", { NULL }, 2281, "udp" }, - { "lnvalarm", { NULL }, 2282, "tcp" }, - { "lnvalarm", { NULL }, 2282, "udp" }, - { "lnvstatus", { NULL }, 2283, "tcp" }, - { "lnvstatus", { NULL }, 2283, "udp" }, - { "lnvmaps", { NULL }, 2284, "tcp" }, - { "lnvmaps", { NULL }, 2284, "udp" }, - { "lnvmailmon", { NULL }, 2285, "tcp" }, - { "lnvmailmon", { NULL }, 2285, "udp" }, - { "nas-metering", { NULL }, 2286, "tcp" }, - { "nas-metering", { NULL }, 2286, "udp" }, - { "dna", { NULL }, 2287, "tcp" }, - { "dna", { NULL }, 2287, "udp" }, - { "netml", { NULL }, 2288, "tcp" }, - { "netml", { NULL }, 2288, "udp" }, - { "dict-lookup", { NULL }, 2289, "tcp" }, - { "dict-lookup", { NULL }, 2289, "udp" }, - { "sonus-logging", { NULL }, 2290, "tcp" }, - { "sonus-logging", { NULL }, 2290, "udp" }, - { "eapsp", { NULL }, 2291, "tcp" }, - { "eapsp", { NULL }, 2291, "udp" }, - { "mib-streaming", { NULL }, 2292, "tcp" }, - { "mib-streaming", { NULL }, 2292, "udp" }, - { "npdbgmngr", { NULL }, 2293, "tcp" }, - { "npdbgmngr", { NULL }, 2293, "udp" }, - { "konshus-lm", { NULL }, 2294, "tcp" }, - { "konshus-lm", { NULL }, 2294, "udp" }, - { "advant-lm", { NULL }, 2295, "tcp" }, - { "advant-lm", { NULL }, 2295, "udp" }, - { "theta-lm", { NULL }, 2296, "tcp" }, - { "theta-lm", { NULL }, 2296, "udp" }, - { "d2k-datamover1", { NULL }, 2297, "tcp" }, - { "d2k-datamover1", { NULL }, 2297, "udp" }, - { "d2k-datamover2", { NULL }, 2298, "tcp" }, - { "d2k-datamover2", { NULL }, 2298, "udp" }, - { "pc-telecommute", { NULL }, 2299, "tcp" }, - { "pc-telecommute", { NULL }, 2299, "udp" }, - { "cvmmon", { NULL }, 2300, "tcp" }, - { "cvmmon", { NULL }, 2300, "udp" }, - { "cpq-wbem", { NULL }, 2301, "tcp" }, - { "cpq-wbem", { NULL }, 2301, "udp" }, - { "binderysupport", { NULL }, 2302, "tcp" }, - { "binderysupport", { NULL }, 2302, "udp" }, - { "proxy-gateway", { NULL }, 2303, "tcp" }, - { "proxy-gateway", { NULL }, 2303, "udp" }, - { "attachmate-uts", { NULL }, 2304, "tcp" }, - { "attachmate-uts", { NULL }, 2304, "udp" }, - { "mt-scaleserver", { NULL }, 2305, "tcp" }, - { "mt-scaleserver", { NULL }, 2305, "udp" }, - { "tappi-boxnet", { NULL }, 2306, "tcp" }, - { "tappi-boxnet", { NULL }, 2306, "udp" }, - { "pehelp", { NULL }, 2307, "tcp" }, - { "pehelp", { NULL }, 2307, "udp" }, - { "sdhelp", { NULL }, 2308, "tcp" }, - { "sdhelp", { NULL }, 2308, "udp" }, - { "sdserver", { NULL }, 2309, "tcp" }, - { "sdserver", { NULL }, 2309, "udp" }, - { "sdclient", { NULL }, 2310, "tcp" }, - { "sdclient", { NULL }, 2310, "udp" }, - { "messageservice", { NULL }, 2311, "tcp" }, - { "messageservice", { NULL }, 2311, "udp" }, - { "wanscaler", { NULL }, 2312, "tcp" }, - { "wanscaler", { NULL }, 2312, "udp" }, - { "iapp", { NULL }, 2313, "tcp" }, - { "iapp", { NULL }, 2313, "udp" }, - { "cr-websystems", { NULL }, 2314, "tcp" }, - { "cr-websystems", { NULL }, 2314, "udp" }, - { "precise-sft", { NULL }, 2315, "tcp" }, - { "precise-sft", { NULL }, 2315, "udp" }, - { "sent-lm", { NULL }, 2316, "tcp" }, - { "sent-lm", { NULL }, 2316, "udp" }, - { "attachmate-g32", { NULL }, 2317, "tcp" }, - { "attachmate-g32", { NULL }, 2317, "udp" }, - { "cadencecontrol", { NULL }, 2318, "tcp" }, - { "cadencecontrol", { NULL }, 2318, "udp" }, - { "infolibria", { NULL }, 2319, "tcp" }, - { "infolibria", { NULL }, 2319, "udp" }, - { "siebel-ns", { NULL }, 2320, "tcp" }, - { "siebel-ns", { NULL }, 2320, "udp" }, - { "rdlap", { NULL }, 2321, "tcp" }, - { "rdlap", { NULL }, 2321, "udp" }, - { "ofsd", { NULL }, 2322, "tcp" }, - { "ofsd", { NULL }, 2322, "udp" }, - { "3d-nfsd", { NULL }, 2323, "tcp" }, - { "3d-nfsd", { NULL }, 2323, "udp" }, - { "cosmocall", { NULL }, 2324, "tcp" }, - { "cosmocall", { NULL }, 2324, "udp" }, - { "ansysli", { NULL }, 2325, "tcp" }, - { "ansysli", { NULL }, 2325, "udp" }, - { "idcp", { NULL }, 2326, "tcp" }, - { "idcp", { NULL }, 2326, "udp" }, - { "xingcsm", { NULL }, 2327, "tcp" }, - { "xingcsm", { NULL }, 2327, "udp" }, - { "netrix-sftm", { NULL }, 2328, "tcp" }, - { "netrix-sftm", { NULL }, 2328, "udp" }, - { "nvd", { NULL }, 2329, "tcp" }, - { "nvd", { NULL }, 2329, "udp" }, - { "tscchat", { NULL }, 2330, "tcp" }, - { "tscchat", { NULL }, 2330, "udp" }, - { "agentview", { NULL }, 2331, "tcp" }, - { "agentview", { NULL }, 2331, "udp" }, - { "rcc-host", { NULL }, 2332, "tcp" }, - { "rcc-host", { NULL }, 2332, "udp" }, - { "snapp", { NULL }, 2333, "tcp" }, - { "snapp", { NULL }, 2333, "udp" }, - { "ace-client", { NULL }, 2334, "tcp" }, - { "ace-client", { NULL }, 2334, "udp" }, - { "ace-proxy", { NULL }, 2335, "tcp" }, - { "ace-proxy", { NULL }, 2335, "udp" }, - { "appleugcontrol", { NULL }, 2336, "tcp" }, - { "appleugcontrol", { NULL }, 2336, "udp" }, - { "ideesrv", { NULL }, 2337, "tcp" }, - { "ideesrv", { NULL }, 2337, "udp" }, - { "norton-lambert", { NULL }, 2338, "tcp" }, - { "norton-lambert", { NULL }, 2338, "udp" }, - { "3com-webview", { NULL }, 2339, "tcp" }, - { "3com-webview", { NULL }, 2339, "udp" }, - { "wrs_registry", { NULL }, 2340, "tcp" }, - { "wrs_registry", { NULL }, 2340, "udp" }, - { "xiostatus", { NULL }, 2341, "tcp" }, - { "xiostatus", { NULL }, 2341, "udp" }, - { "manage-exec", { NULL }, 2342, "tcp" }, - { "manage-exec", { NULL }, 2342, "udp" }, - { "nati-logos", { NULL }, 2343, "tcp" }, - { "nati-logos", { NULL }, 2343, "udp" }, - { "fcmsys", { NULL }, 2344, "tcp" }, - { "fcmsys", { NULL }, 2344, "udp" }, - { "dbm", { NULL }, 2345, "tcp" }, - { "dbm", { NULL }, 2345, "udp" }, - { "redstorm_join", { NULL }, 2346, "tcp" }, - { "redstorm_join", { NULL }, 2346, "udp" }, - { "redstorm_find", { NULL }, 2347, "tcp" }, - { "redstorm_find", { NULL }, 2347, "udp" }, - { "redstorm_info", { NULL }, 2348, "tcp" }, - { "redstorm_info", { NULL }, 2348, "udp" }, - { "redstorm_diag", { NULL }, 2349, "tcp" }, - { "redstorm_diag", { NULL }, 2349, "udp" }, - { "psbserver", { NULL }, 2350, "tcp" }, - { "psbserver", { NULL }, 2350, "udp" }, - { "psrserver", { NULL }, 2351, "tcp" }, - { "psrserver", { NULL }, 2351, "udp" }, - { "pslserver", { NULL }, 2352, "tcp" }, - { "pslserver", { NULL }, 2352, "udp" }, - { "pspserver", { NULL }, 2353, "tcp" }, - { "pspserver", { NULL }, 2353, "udp" }, - { "psprserver", { NULL }, 2354, "tcp" }, - { "psprserver", { NULL }, 2354, "udp" }, - { "psdbserver", { NULL }, 2355, "tcp" }, - { "psdbserver", { NULL }, 2355, "udp" }, - { "gxtelmd", { NULL }, 2356, "tcp" }, - { "gxtelmd", { NULL }, 2356, "udp" }, - { "unihub-server", { NULL }, 2357, "tcp" }, - { "unihub-server", { NULL }, 2357, "udp" }, - { "futrix", { NULL }, 2358, "tcp" }, - { "futrix", { NULL }, 2358, "udp" }, - { "flukeserver", { NULL }, 2359, "tcp" }, - { "flukeserver", { NULL }, 2359, "udp" }, - { "nexstorindltd", { NULL }, 2360, "tcp" }, - { "nexstorindltd", { NULL }, 2360, "udp" }, - { "tl1", { NULL }, 2361, "tcp" }, - { "tl1", { NULL }, 2361, "udp" }, - { "digiman", { NULL }, 2362, "tcp" }, - { "digiman", { NULL }, 2362, "udp" }, - { "mediacntrlnfsd", { NULL }, 2363, "tcp" }, - { "mediacntrlnfsd", { NULL }, 2363, "udp" }, - { "oi-2000", { NULL }, 2364, "tcp" }, - { "oi-2000", { NULL }, 2364, "udp" }, - { "dbref", { NULL }, 2365, "tcp" }, - { "dbref", { NULL }, 2365, "udp" }, - { "qip-login", { NULL }, 2366, "tcp" }, - { "qip-login", { NULL }, 2366, "udp" }, - { "service-ctrl", { NULL }, 2367, "tcp" }, - { "service-ctrl", { NULL }, 2367, "udp" }, - { "opentable", { NULL }, 2368, "tcp" }, - { "opentable", { NULL }, 2368, "udp" }, - { "l3-hbmon", { NULL }, 2370, "tcp" }, - { "l3-hbmon", { NULL }, 2370, "udp" }, - { "worldwire", { NULL }, 2371, "tcp" }, - { "worldwire", { NULL }, 2371, "udp" }, - { "lanmessenger", { NULL }, 2372, "tcp" }, - { "lanmessenger", { NULL }, 2372, "udp" }, - { "remographlm", { NULL }, 2373, "tcp" }, - { "hydra", { NULL }, 2374, "tcp" }, - { "compaq-https", { NULL }, 2381, "tcp" }, - { "compaq-https", { NULL }, 2381, "udp" }, - { "ms-olap3", { NULL }, 2382, "tcp" }, - { "ms-olap3", { NULL }, 2382, "udp" }, - { "ms-olap4", { NULL }, 2383, "tcp" }, - { "ms-olap4", { NULL }, 2383, "udp" }, - { "sd-request", { NULL }, 2384, "tcp" }, - { "sd-capacity", { NULL }, 2384, "udp" }, - { "sd-data", { NULL }, 2385, "tcp" }, - { "sd-data", { NULL }, 2385, "udp" }, - { "virtualtape", { NULL }, 2386, "tcp" }, - { "virtualtape", { NULL }, 2386, "udp" }, - { "vsamredirector", { NULL }, 2387, "tcp" }, - { "vsamredirector", { NULL }, 2387, "udp" }, - { "mynahautostart", { NULL }, 2388, "tcp" }, - { "mynahautostart", { NULL }, 2388, "udp" }, - { "ovsessionmgr", { NULL }, 2389, "tcp" }, - { "ovsessionmgr", { NULL }, 2389, "udp" }, - { "rsmtp", { NULL }, 2390, "tcp" }, - { "rsmtp", { NULL }, 2390, "udp" }, - { "3com-net-mgmt", { NULL }, 2391, "tcp" }, - { "3com-net-mgmt", { NULL }, 2391, "udp" }, - { "tacticalauth", { NULL }, 2392, "tcp" }, - { "tacticalauth", { NULL }, 2392, "udp" }, - { "ms-olap1", { NULL }, 2393, "tcp" }, - { "ms-olap1", { NULL }, 2393, "udp" }, - { "ms-olap2", { NULL }, 2394, "tcp" }, - { "ms-olap2", { NULL }, 2394, "udp" }, - { "lan900_remote", { NULL }, 2395, "tcp" }, - { "lan900_remote", { NULL }, 2395, "udp" }, - { "wusage", { NULL }, 2396, "tcp" }, - { "wusage", { NULL }, 2396, "udp" }, - { "ncl", { NULL }, 2397, "tcp" }, - { "ncl", { NULL }, 2397, "udp" }, - { "orbiter", { NULL }, 2398, "tcp" }, - { "orbiter", { NULL }, 2398, "udp" }, - { "fmpro-fdal", { NULL }, 2399, "tcp" }, - { "fmpro-fdal", { NULL }, 2399, "udp" }, - { "opequus-server", { NULL }, 2400, "tcp" }, - { "opequus-server", { NULL }, 2400, "udp" }, - { "cvspserver", { NULL }, 2401, "tcp" }, - { "cvspserver", { NULL }, 2401, "udp" }, - { "taskmaster2000", { NULL }, 2402, "tcp" }, - { "taskmaster2000", { NULL }, 2402, "udp" }, - { "taskmaster2000", { NULL }, 2403, "tcp" }, - { "taskmaster2000", { NULL }, 2403, "udp" }, - { "iec-104", { NULL }, 2404, "tcp" }, - { "iec-104", { NULL }, 2404, "udp" }, - { "trc-netpoll", { NULL }, 2405, "tcp" }, - { "trc-netpoll", { NULL }, 2405, "udp" }, - { "jediserver", { NULL }, 2406, "tcp" }, - { "jediserver", { NULL }, 2406, "udp" }, - { "orion", { NULL }, 2407, "tcp" }, - { "orion", { NULL }, 2407, "udp" }, - { "optimanet", { NULL }, 2408, "tcp" }, - { "optimanet", { NULL }, 2408, "udp" }, - { "sns-protocol", { NULL }, 2409, "tcp" }, - { "sns-protocol", { NULL }, 2409, "udp" }, - { "vrts-registry", { NULL }, 2410, "tcp" }, - { "vrts-registry", { NULL }, 2410, "udp" }, - { "netwave-ap-mgmt", { NULL }, 2411, "tcp" }, - { "netwave-ap-mgmt", { NULL }, 2411, "udp" }, - { "cdn", { NULL }, 2412, "tcp" }, - { "cdn", { NULL }, 2412, "udp" }, - { "orion-rmi-reg", { NULL }, 2413, "tcp" }, - { "orion-rmi-reg", { NULL }, 2413, "udp" }, - { "beeyond", { NULL }, 2414, "tcp" }, - { "beeyond", { NULL }, 2414, "udp" }, - { "codima-rtp", { NULL }, 2415, "tcp" }, - { "codima-rtp", { NULL }, 2415, "udp" }, - { "rmtserver", { NULL }, 2416, "tcp" }, - { "rmtserver", { NULL }, 2416, "udp" }, - { "composit-server", { NULL }, 2417, "tcp" }, - { "composit-server", { NULL }, 2417, "udp" }, - { "cas", { NULL }, 2418, "tcp" }, - { "cas", { NULL }, 2418, "udp" }, - { "attachmate-s2s", { NULL }, 2419, "tcp" }, - { "attachmate-s2s", { NULL }, 2419, "udp" }, - { "dslremote-mgmt", { NULL }, 2420, "tcp" }, - { "dslremote-mgmt", { NULL }, 2420, "udp" }, - { "g-talk", { NULL }, 2421, "tcp" }, - { "g-talk", { NULL }, 2421, "udp" }, - { "crmsbits", { NULL }, 2422, "tcp" }, - { "crmsbits", { NULL }, 2422, "udp" }, - { "rnrp", { NULL }, 2423, "tcp" }, - { "rnrp", { NULL }, 2423, "udp" }, - { "kofax-svr", { NULL }, 2424, "tcp" }, - { "kofax-svr", { NULL }, 2424, "udp" }, - { "fjitsuappmgr", { NULL }, 2425, "tcp" }, - { "fjitsuappmgr", { NULL }, 2425, "udp" }, - { "mgcp-gateway", { NULL }, 2427, "tcp" }, - { "mgcp-gateway", { NULL }, 2427, "udp" }, - { "ott", { NULL }, 2428, "tcp" }, - { "ott", { NULL }, 2428, "udp" }, - { "ft-role", { NULL }, 2429, "tcp" }, - { "ft-role", { NULL }, 2429, "udp" }, - { "venus", { NULL }, 2430, "tcp" }, - { "venus", { NULL }, 2430, "udp" }, - { "venus-se", { NULL }, 2431, "tcp" }, - { "venus-se", { NULL }, 2431, "udp" }, - { "codasrv", { NULL }, 2432, "tcp" }, - { "codasrv", { NULL }, 2432, "udp" }, - { "codasrv-se", { NULL }, 2433, "tcp" }, - { "codasrv-se", { NULL }, 2433, "udp" }, - { "pxc-epmap", { NULL }, 2434, "tcp" }, - { "pxc-epmap", { NULL }, 2434, "udp" }, - { "optilogic", { NULL }, 2435, "tcp" }, - { "optilogic", { NULL }, 2435, "udp" }, - { "topx", { NULL }, 2436, "tcp" }, - { "topx", { NULL }, 2436, "udp" }, - { "unicontrol", { NULL }, 2437, "tcp" }, - { "unicontrol", { NULL }, 2437, "udp" }, - { "msp", { NULL }, 2438, "tcp" }, - { "msp", { NULL }, 2438, "udp" }, - { "sybasedbsynch", { NULL }, 2439, "tcp" }, - { "sybasedbsynch", { NULL }, 2439, "udp" }, - { "spearway", { NULL }, 2440, "tcp" }, - { "spearway", { NULL }, 2440, "udp" }, - { "pvsw-inet", { NULL }, 2441, "tcp" }, - { "pvsw-inet", { NULL }, 2441, "udp" }, - { "netangel", { NULL }, 2442, "tcp" }, - { "netangel", { NULL }, 2442, "udp" }, - { "powerclientcsf", { NULL }, 2443, "tcp" }, - { "powerclientcsf", { NULL }, 2443, "udp" }, - { "btpp2sectrans", { NULL }, 2444, "tcp" }, - { "btpp2sectrans", { NULL }, 2444, "udp" }, - { "dtn1", { NULL }, 2445, "tcp" }, - { "dtn1", { NULL }, 2445, "udp" }, - { "bues_service", { NULL }, 2446, "tcp" }, - { "bues_service", { NULL }, 2446, "udp" }, - { "ovwdb", { NULL }, 2447, "tcp" }, - { "ovwdb", { NULL }, 2447, "udp" }, - { "hpppssvr", { NULL }, 2448, "tcp" }, - { "hpppssvr", { NULL }, 2448, "udp" }, - { "ratl", { NULL }, 2449, "tcp" }, - { "ratl", { NULL }, 2449, "udp" }, - { "netadmin", { NULL }, 2450, "tcp" }, - { "netadmin", { NULL }, 2450, "udp" }, - { "netchat", { NULL }, 2451, "tcp" }, - { "netchat", { NULL }, 2451, "udp" }, - { "snifferclient", { NULL }, 2452, "tcp" }, - { "snifferclient", { NULL }, 2452, "udp" }, - { "madge-ltd", { NULL }, 2453, "tcp" }, - { "madge-ltd", { NULL }, 2453, "udp" }, - { "indx-dds", { NULL }, 2454, "tcp" }, - { "indx-dds", { NULL }, 2454, "udp" }, - { "wago-io-system", { NULL }, 2455, "tcp" }, - { "wago-io-system", { NULL }, 2455, "udp" }, - { "altav-remmgt", { NULL }, 2456, "tcp" }, - { "altav-remmgt", { NULL }, 2456, "udp" }, - { "rapido-ip", { NULL }, 2457, "tcp" }, - { "rapido-ip", { NULL }, 2457, "udp" }, - { "griffin", { NULL }, 2458, "tcp" }, - { "griffin", { NULL }, 2458, "udp" }, - { "community", { NULL }, 2459, "tcp" }, - { "community", { NULL }, 2459, "udp" }, - { "ms-theater", { NULL }, 2460, "tcp" }, - { "ms-theater", { NULL }, 2460, "udp" }, - { "qadmifoper", { NULL }, 2461, "tcp" }, - { "qadmifoper", { NULL }, 2461, "udp" }, - { "qadmifevent", { NULL }, 2462, "tcp" }, - { "qadmifevent", { NULL }, 2462, "udp" }, - { "lsi-raid-mgmt", { NULL }, 2463, "tcp" }, - { "lsi-raid-mgmt", { NULL }, 2463, "udp" }, - { "direcpc-si", { NULL }, 2464, "tcp" }, - { "direcpc-si", { NULL }, 2464, "udp" }, - { "lbm", { NULL }, 2465, "tcp" }, - { "lbm", { NULL }, 2465, "udp" }, - { "lbf", { NULL }, 2466, "tcp" }, - { "lbf", { NULL }, 2466, "udp" }, - { "high-criteria", { NULL }, 2467, "tcp" }, - { "high-criteria", { NULL }, 2467, "udp" }, - { "qip-msgd", { NULL }, 2468, "tcp" }, - { "qip-msgd", { NULL }, 2468, "udp" }, - { "mti-tcs-comm", { NULL }, 2469, "tcp" }, - { "mti-tcs-comm", { NULL }, 2469, "udp" }, - { "taskman-port", { NULL }, 2470, "tcp" }, - { "taskman-port", { NULL }, 2470, "udp" }, - { "seaodbc", { NULL }, 2471, "tcp" }, - { "seaodbc", { NULL }, 2471, "udp" }, - { "c3", { NULL }, 2472, "tcp" }, - { "c3", { NULL }, 2472, "udp" }, - { "aker-cdp", { NULL }, 2473, "tcp" }, - { "aker-cdp", { NULL }, 2473, "udp" }, - { "vitalanalysis", { NULL }, 2474, "tcp" }, - { "vitalanalysis", { NULL }, 2474, "udp" }, - { "ace-server", { NULL }, 2475, "tcp" }, - { "ace-server", { NULL }, 2475, "udp" }, - { "ace-svr-prop", { NULL }, 2476, "tcp" }, - { "ace-svr-prop", { NULL }, 2476, "udp" }, - { "ssm-cvs", { NULL }, 2477, "tcp" }, - { "ssm-cvs", { NULL }, 2477, "udp" }, - { "ssm-cssps", { NULL }, 2478, "tcp" }, - { "ssm-cssps", { NULL }, 2478, "udp" }, - { "ssm-els", { NULL }, 2479, "tcp" }, - { "ssm-els", { NULL }, 2479, "udp" }, - { "powerexchange", { NULL }, 2480, "tcp" }, - { "powerexchange", { NULL }, 2480, "udp" }, - { "giop", { NULL }, 2481, "tcp" }, - { "giop", { NULL }, 2481, "udp" }, - { "giop-ssl", { NULL }, 2482, "tcp" }, - { "giop-ssl", { NULL }, 2482, "udp" }, - { "ttc", { NULL }, 2483, "tcp" }, - { "ttc", { NULL }, 2483, "udp" }, - { "ttc-ssl", { NULL }, 2484, "tcp" }, - { "ttc-ssl", { NULL }, 2484, "udp" }, - { "netobjects1", { NULL }, 2485, "tcp" }, - { "netobjects1", { NULL }, 2485, "udp" }, - { "netobjects2", { NULL }, 2486, "tcp" }, - { "netobjects2", { NULL }, 2486, "udp" }, - { "pns", { NULL }, 2487, "tcp" }, - { "pns", { NULL }, 2487, "udp" }, - { "moy-corp", { NULL }, 2488, "tcp" }, - { "moy-corp", { NULL }, 2488, "udp" }, - { "tsilb", { NULL }, 2489, "tcp" }, - { "tsilb", { NULL }, 2489, "udp" }, - { "qip-qdhcp", { NULL }, 2490, "tcp" }, - { "qip-qdhcp", { NULL }, 2490, "udp" }, - { "conclave-cpp", { NULL }, 2491, "tcp" }, - { "conclave-cpp", { NULL }, 2491, "udp" }, - { "groove", { NULL }, 2492, "tcp" }, - { "groove", { NULL }, 2492, "udp" }, - { "talarian-mqs", { NULL }, 2493, "tcp" }, - { "talarian-mqs", { NULL }, 2493, "udp" }, - { "bmc-ar", { NULL }, 2494, "tcp" }, - { "bmc-ar", { NULL }, 2494, "udp" }, - { "fast-rem-serv", { NULL }, 2495, "tcp" }, - { "fast-rem-serv", { NULL }, 2495, "udp" }, - { "dirgis", { NULL }, 2496, "tcp" }, - { "dirgis", { NULL }, 2496, "udp" }, - { "quaddb", { NULL }, 2497, "tcp" }, - { "quaddb", { NULL }, 2497, "udp" }, - { "odn-castraq", { NULL }, 2498, "tcp" }, - { "odn-castraq", { NULL }, 2498, "udp" }, - { "unicontrol", { NULL }, 2499, "tcp" }, - { "unicontrol", { NULL }, 2499, "udp" }, - { "rtsserv", { NULL }, 2500, "tcp" }, - { "rtsserv", { NULL }, 2500, "udp" }, - { "rtsclient", { NULL }, 2501, "tcp" }, - { "rtsclient", { NULL }, 2501, "udp" }, - { "kentrox-prot", { NULL }, 2502, "tcp" }, - { "kentrox-prot", { NULL }, 2502, "udp" }, - { "nms-dpnss", { NULL }, 2503, "tcp" }, - { "nms-dpnss", { NULL }, 2503, "udp" }, - { "wlbs", { NULL }, 2504, "tcp" }, - { "wlbs", { NULL }, 2504, "udp" }, - { "ppcontrol", { NULL }, 2505, "tcp" }, - { "ppcontrol", { NULL }, 2505, "udp" }, - { "jbroker", { NULL }, 2506, "tcp" }, - { "jbroker", { NULL }, 2506, "udp" }, - { "spock", { NULL }, 2507, "tcp" }, - { "spock", { NULL }, 2507, "udp" }, - { "jdatastore", { NULL }, 2508, "tcp" }, - { "jdatastore", { NULL }, 2508, "udp" }, - { "fjmpss", { NULL }, 2509, "tcp" }, - { "fjmpss", { NULL }, 2509, "udp" }, - { "fjappmgrbulk", { NULL }, 2510, "tcp" }, - { "fjappmgrbulk", { NULL }, 2510, "udp" }, - { "metastorm", { NULL }, 2511, "tcp" }, - { "metastorm", { NULL }, 2511, "udp" }, - { "citrixima", { NULL }, 2512, "tcp" }, - { "citrixima", { NULL }, 2512, "udp" }, - { "citrixadmin", { NULL }, 2513, "tcp" }, - { "citrixadmin", { NULL }, 2513, "udp" }, - { "facsys-ntp", { NULL }, 2514, "tcp" }, - { "facsys-ntp", { NULL }, 2514, "udp" }, - { "facsys-router", { NULL }, 2515, "tcp" }, - { "facsys-router", { NULL }, 2515, "udp" }, - { "maincontrol", { NULL }, 2516, "tcp" }, - { "maincontrol", { NULL }, 2516, "udp" }, - { "call-sig-trans", { NULL }, 2517, "tcp" }, - { "call-sig-trans", { NULL }, 2517, "udp" }, - { "willy", { NULL }, 2518, "tcp" }, - { "willy", { NULL }, 2518, "udp" }, - { "globmsgsvc", { NULL }, 2519, "tcp" }, - { "globmsgsvc", { NULL }, 2519, "udp" }, - { "pvsw", { NULL }, 2520, "tcp" }, - { "pvsw", { NULL }, 2520, "udp" }, - { "adaptecmgr", { NULL }, 2521, "tcp" }, - { "adaptecmgr", { NULL }, 2521, "udp" }, - { "windb", { NULL }, 2522, "tcp" }, - { "windb", { NULL }, 2522, "udp" }, - { "qke-llc-v3", { NULL }, 2523, "tcp" }, - { "qke-llc-v3", { NULL }, 2523, "udp" }, - { "optiwave-lm", { NULL }, 2524, "tcp" }, - { "optiwave-lm", { NULL }, 2524, "udp" }, - { "ms-v-worlds", { NULL }, 2525, "tcp" }, - { "ms-v-worlds", { NULL }, 2525, "udp" }, - { "ema-sent-lm", { NULL }, 2526, "tcp" }, - { "ema-sent-lm", { NULL }, 2526, "udp" }, - { "iqserver", { NULL }, 2527, "tcp" }, - { "iqserver", { NULL }, 2527, "udp" }, - { "ncr_ccl", { NULL }, 2528, "tcp" }, - { "ncr_ccl", { NULL }, 2528, "udp" }, - { "utsftp", { NULL }, 2529, "tcp" }, - { "utsftp", { NULL }, 2529, "udp" }, - { "vrcommerce", { NULL }, 2530, "tcp" }, - { "vrcommerce", { NULL }, 2530, "udp" }, - { "ito-e-gui", { NULL }, 2531, "tcp" }, - { "ito-e-gui", { NULL }, 2531, "udp" }, - { "ovtopmd", { NULL }, 2532, "tcp" }, - { "ovtopmd", { NULL }, 2532, "udp" }, - { "snifferserver", { NULL }, 2533, "tcp" }, - { "snifferserver", { NULL }, 2533, "udp" }, - { "combox-web-acc", { NULL }, 2534, "tcp" }, - { "combox-web-acc", { NULL }, 2534, "udp" }, - { "madcap", { NULL }, 2535, "tcp" }, - { "madcap", { NULL }, 2535, "udp" }, - { "btpp2audctr1", { NULL }, 2536, "tcp" }, - { "btpp2audctr1", { NULL }, 2536, "udp" }, - { "upgrade", { NULL }, 2537, "tcp" }, - { "upgrade", { NULL }, 2537, "udp" }, - { "vnwk-prapi", { NULL }, 2538, "tcp" }, - { "vnwk-prapi", { NULL }, 2538, "udp" }, - { "vsiadmin", { NULL }, 2539, "tcp" }, - { "vsiadmin", { NULL }, 2539, "udp" }, - { "lonworks", { NULL }, 2540, "tcp" }, - { "lonworks", { NULL }, 2540, "udp" }, - { "lonworks2", { NULL }, 2541, "tcp" }, - { "lonworks2", { NULL }, 2541, "udp" }, - { "udrawgraph", { NULL }, 2542, "tcp" }, - { "udrawgraph", { NULL }, 2542, "udp" }, - { "reftek", { NULL }, 2543, "tcp" }, - { "reftek", { NULL }, 2543, "udp" }, - { "novell-zen", { NULL }, 2544, "tcp" }, - { "novell-zen", { NULL }, 2544, "udp" }, - { "sis-emt", { NULL }, 2545, "tcp" }, - { "sis-emt", { NULL }, 2545, "udp" }, - { "vytalvaultbrtp", { NULL }, 2546, "tcp" }, - { "vytalvaultbrtp", { NULL }, 2546, "udp" }, - { "vytalvaultvsmp", { NULL }, 2547, "tcp" }, - { "vytalvaultvsmp", { NULL }, 2547, "udp" }, - { "vytalvaultpipe", { NULL }, 2548, "tcp" }, - { "vytalvaultpipe", { NULL }, 2548, "udp" }, - { "ipass", { NULL }, 2549, "tcp" }, - { "ipass", { NULL }, 2549, "udp" }, - { "ads", { NULL }, 2550, "tcp" }, - { "ads", { NULL }, 2550, "udp" }, - { "isg-uda-server", { NULL }, 2551, "tcp" }, - { "isg-uda-server", { NULL }, 2551, "udp" }, - { "call-logging", { NULL }, 2552, "tcp" }, - { "call-logging", { NULL }, 2552, "udp" }, - { "efidiningport", { NULL }, 2553, "tcp" }, - { "efidiningport", { NULL }, 2553, "udp" }, - { "vcnet-link-v10", { NULL }, 2554, "tcp" }, - { "vcnet-link-v10", { NULL }, 2554, "udp" }, - { "compaq-wcp", { NULL }, 2555, "tcp" }, - { "compaq-wcp", { NULL }, 2555, "udp" }, - { "nicetec-nmsvc", { NULL }, 2556, "tcp" }, - { "nicetec-nmsvc", { NULL }, 2556, "udp" }, - { "nicetec-mgmt", { NULL }, 2557, "tcp" }, - { "nicetec-mgmt", { NULL }, 2557, "udp" }, - { "pclemultimedia", { NULL }, 2558, "tcp" }, - { "pclemultimedia", { NULL }, 2558, "udp" }, - { "lstp", { NULL }, 2559, "tcp" }, - { "lstp", { NULL }, 2559, "udp" }, - { "labrat", { NULL }, 2560, "tcp" }, - { "labrat", { NULL }, 2560, "udp" }, - { "mosaixcc", { NULL }, 2561, "tcp" }, - { "mosaixcc", { NULL }, 2561, "udp" }, - { "delibo", { NULL }, 2562, "tcp" }, - { "delibo", { NULL }, 2562, "udp" }, - { "cti-redwood", { NULL }, 2563, "tcp" }, - { "cti-redwood", { NULL }, 2563, "udp" }, - { "hp-3000-telnet", { NULL }, 2564, "tcp" }, - { "coord-svr", { NULL }, 2565, "tcp" }, - { "coord-svr", { NULL }, 2565, "udp" }, - { "pcs-pcw", { NULL }, 2566, "tcp" }, - { "pcs-pcw", { NULL }, 2566, "udp" }, - { "clp", { NULL }, 2567, "tcp" }, - { "clp", { NULL }, 2567, "udp" }, - { "spamtrap", { NULL }, 2568, "tcp" }, - { "spamtrap", { NULL }, 2568, "udp" }, - { "sonuscallsig", { NULL }, 2569, "tcp" }, - { "sonuscallsig", { NULL }, 2569, "udp" }, - { "hs-port", { NULL }, 2570, "tcp" }, - { "hs-port", { NULL }, 2570, "udp" }, - { "cecsvc", { NULL }, 2571, "tcp" }, - { "cecsvc", { NULL }, 2571, "udp" }, - { "ibp", { NULL }, 2572, "tcp" }, - { "ibp", { NULL }, 2572, "udp" }, - { "trustestablish", { NULL }, 2573, "tcp" }, - { "trustestablish", { NULL }, 2573, "udp" }, - { "blockade-bpsp", { NULL }, 2574, "tcp" }, - { "blockade-bpsp", { NULL }, 2574, "udp" }, - { "hl7", { NULL }, 2575, "tcp" }, - { "hl7", { NULL }, 2575, "udp" }, - { "tclprodebugger", { NULL }, 2576, "tcp" }, - { "tclprodebugger", { NULL }, 2576, "udp" }, - { "scipticslsrvr", { NULL }, 2577, "tcp" }, - { "scipticslsrvr", { NULL }, 2577, "udp" }, - { "rvs-isdn-dcp", { NULL }, 2578, "tcp" }, - { "rvs-isdn-dcp", { NULL }, 2578, "udp" }, - { "mpfoncl", { NULL }, 2579, "tcp" }, - { "mpfoncl", { NULL }, 2579, "udp" }, - { "tributary", { NULL }, 2580, "tcp" }, - { "tributary", { NULL }, 2580, "udp" }, - { "argis-te", { NULL }, 2581, "tcp" }, - { "argis-te", { NULL }, 2581, "udp" }, - { "argis-ds", { NULL }, 2582, "tcp" }, - { "argis-ds", { NULL }, 2582, "udp" }, - { "mon", { NULL }, 2583, "tcp" }, - { "mon", { NULL }, 2583, "udp" }, - { "cyaserv", { NULL }, 2584, "tcp" }, - { "cyaserv", { NULL }, 2584, "udp" }, - { "netx-server", { NULL }, 2585, "tcp" }, - { "netx-server", { NULL }, 2585, "udp" }, - { "netx-agent", { NULL }, 2586, "tcp" }, - { "netx-agent", { NULL }, 2586, "udp" }, - { "masc", { NULL }, 2587, "tcp" }, - { "masc", { NULL }, 2587, "udp" }, - { "privilege", { NULL }, 2588, "tcp" }, - { "privilege", { NULL }, 2588, "udp" }, - { "quartus-tcl", { NULL }, 2589, "tcp" }, - { "quartus-tcl", { NULL }, 2589, "udp" }, - { "idotdist", { NULL }, 2590, "tcp" }, - { "idotdist", { NULL }, 2590, "udp" }, - { "maytagshuffle", { NULL }, 2591, "tcp" }, - { "maytagshuffle", { NULL }, 2591, "udp" }, - { "netrek", { NULL }, 2592, "tcp" }, - { "netrek", { NULL }, 2592, "udp" }, - { "mns-mail", { NULL }, 2593, "tcp" }, - { "mns-mail", { NULL }, 2593, "udp" }, - { "dts", { NULL }, 2594, "tcp" }, - { "dts", { NULL }, 2594, "udp" }, - { "worldfusion1", { NULL }, 2595, "tcp" }, - { "worldfusion1", { NULL }, 2595, "udp" }, - { "worldfusion2", { NULL }, 2596, "tcp" }, - { "worldfusion2", { NULL }, 2596, "udp" }, - { "homesteadglory", { NULL }, 2597, "tcp" }, - { "homesteadglory", { NULL }, 2597, "udp" }, - { "citriximaclient", { NULL }, 2598, "tcp" }, - { "citriximaclient", { NULL }, 2598, "udp" }, - { "snapd", { NULL }, 2599, "tcp" }, - { "snapd", { NULL }, 2599, "udp" }, - { "hpstgmgr", { NULL }, 2600, "tcp" }, - { "hpstgmgr", { NULL }, 2600, "udp" }, - { "discp-client", { NULL }, 2601, "tcp" }, - { "discp-client", { NULL }, 2601, "udp" }, - { "discp-server", { NULL }, 2602, "tcp" }, - { "discp-server", { NULL }, 2602, "udp" }, - { "servicemeter", { NULL }, 2603, "tcp" }, - { "servicemeter", { NULL }, 2603, "udp" }, - { "nsc-ccs", { NULL }, 2604, "tcp" }, - { "nsc-ccs", { NULL }, 2604, "udp" }, - { "nsc-posa", { NULL }, 2605, "tcp" }, - { "nsc-posa", { NULL }, 2605, "udp" }, - { "netmon", { NULL }, 2606, "tcp" }, - { "netmon", { NULL }, 2606, "udp" }, - { "connection", { NULL }, 2607, "tcp" }, - { "connection", { NULL }, 2607, "udp" }, - { "wag-service", { NULL }, 2608, "tcp" }, - { "wag-service", { NULL }, 2608, "udp" }, - { "system-monitor", { NULL }, 2609, "tcp" }, - { "system-monitor", { NULL }, 2609, "udp" }, - { "versa-tek", { NULL }, 2610, "tcp" }, - { "versa-tek", { NULL }, 2610, "udp" }, - { "lionhead", { NULL }, 2611, "tcp" }, - { "lionhead", { NULL }, 2611, "udp" }, - { "qpasa-agent", { NULL }, 2612, "tcp" }, - { "qpasa-agent", { NULL }, 2612, "udp" }, - { "smntubootstrap", { NULL }, 2613, "tcp" }, - { "smntubootstrap", { NULL }, 2613, "udp" }, - { "neveroffline", { NULL }, 2614, "tcp" }, - { "neveroffline", { NULL }, 2614, "udp" }, - { "firepower", { NULL }, 2615, "tcp" }, - { "firepower", { NULL }, 2615, "udp" }, - { "appswitch-emp", { NULL }, 2616, "tcp" }, - { "appswitch-emp", { NULL }, 2616, "udp" }, - { "cmadmin", { NULL }, 2617, "tcp" }, - { "cmadmin", { NULL }, 2617, "udp" }, - { "priority-e-com", { NULL }, 2618, "tcp" }, - { "priority-e-com", { NULL }, 2618, "udp" }, - { "bruce", { NULL }, 2619, "tcp" }, - { "bruce", { NULL }, 2619, "udp" }, - { "lpsrecommender", { NULL }, 2620, "tcp" }, - { "lpsrecommender", { NULL }, 2620, "udp" }, - { "miles-apart", { NULL }, 2621, "tcp" }, - { "miles-apart", { NULL }, 2621, "udp" }, - { "metricadbc", { NULL }, 2622, "tcp" }, - { "metricadbc", { NULL }, 2622, "udp" }, - { "lmdp", { NULL }, 2623, "tcp" }, - { "lmdp", { NULL }, 2623, "udp" }, - { "aria", { NULL }, 2624, "tcp" }, - { "aria", { NULL }, 2624, "udp" }, - { "blwnkl-port", { NULL }, 2625, "tcp" }, - { "blwnkl-port", { NULL }, 2625, "udp" }, - { "gbjd816", { NULL }, 2626, "tcp" }, - { "gbjd816", { NULL }, 2626, "udp" }, - { "moshebeeri", { NULL }, 2627, "tcp" }, - { "moshebeeri", { NULL }, 2627, "udp" }, - { "dict", { NULL }, 2628, "tcp" }, - { "dict", { NULL }, 2628, "udp" }, - { "sitaraserver", { NULL }, 2629, "tcp" }, - { "sitaraserver", { NULL }, 2629, "udp" }, - { "sitaramgmt", { NULL }, 2630, "tcp" }, - { "sitaramgmt", { NULL }, 2630, "udp" }, - { "sitaradir", { NULL }, 2631, "tcp" }, - { "sitaradir", { NULL }, 2631, "udp" }, - { "irdg-post", { NULL }, 2632, "tcp" }, - { "irdg-post", { NULL }, 2632, "udp" }, - { "interintelli", { NULL }, 2633, "tcp" }, - { "interintelli", { NULL }, 2633, "udp" }, - { "pk-electronics", { NULL }, 2634, "tcp" }, - { "pk-electronics", { NULL }, 2634, "udp" }, - { "backburner", { NULL }, 2635, "tcp" }, - { "backburner", { NULL }, 2635, "udp" }, - { "solve", { NULL }, 2636, "tcp" }, - { "solve", { NULL }, 2636, "udp" }, - { "imdocsvc", { NULL }, 2637, "tcp" }, - { "imdocsvc", { NULL }, 2637, "udp" }, - { "sybaseanywhere", { NULL }, 2638, "tcp" }, - { "sybaseanywhere", { NULL }, 2638, "udp" }, - { "aminet", { NULL }, 2639, "tcp" }, - { "aminet", { NULL }, 2639, "udp" }, - { "sai_sentlm", { NULL }, 2640, "tcp" }, - { "sai_sentlm", { NULL }, 2640, "udp" }, - { "hdl-srv", { NULL }, 2641, "tcp" }, - { "hdl-srv", { NULL }, 2641, "udp" }, - { "tragic", { NULL }, 2642, "tcp" }, - { "tragic", { NULL }, 2642, "udp" }, - { "gte-samp", { NULL }, 2643, "tcp" }, - { "gte-samp", { NULL }, 2643, "udp" }, - { "travsoft-ipx-t", { NULL }, 2644, "tcp" }, - { "travsoft-ipx-t", { NULL }, 2644, "udp" }, - { "novell-ipx-cmd", { NULL }, 2645, "tcp" }, - { "novell-ipx-cmd", { NULL }, 2645, "udp" }, - { "and-lm", { NULL }, 2646, "tcp" }, - { "and-lm", { NULL }, 2646, "udp" }, - { "syncserver", { NULL }, 2647, "tcp" }, - { "syncserver", { NULL }, 2647, "udp" }, - { "upsnotifyprot", { NULL }, 2648, "tcp" }, - { "upsnotifyprot", { NULL }, 2648, "udp" }, - { "vpsipport", { NULL }, 2649, "tcp" }, - { "vpsipport", { NULL }, 2649, "udp" }, - { "eristwoguns", { NULL }, 2650, "tcp" }, - { "eristwoguns", { NULL }, 2650, "udp" }, - { "ebinsite", { NULL }, 2651, "tcp" }, - { "ebinsite", { NULL }, 2651, "udp" }, - { "interpathpanel", { NULL }, 2652, "tcp" }, - { "interpathpanel", { NULL }, 2652, "udp" }, - { "sonus", { NULL }, 2653, "tcp" }, - { "sonus", { NULL }, 2653, "udp" }, - { "corel_vncadmin", { NULL }, 2654, "tcp" }, - { "corel_vncadmin", { NULL }, 2654, "udp" }, - { "unglue", { NULL }, 2655, "tcp" }, - { "unglue", { NULL }, 2655, "udp" }, - { "kana", { NULL }, 2656, "tcp" }, - { "kana", { NULL }, 2656, "udp" }, - { "sns-dispatcher", { NULL }, 2657, "tcp" }, - { "sns-dispatcher", { NULL }, 2657, "udp" }, - { "sns-admin", { NULL }, 2658, "tcp" }, - { "sns-admin", { NULL }, 2658, "udp" }, - { "sns-query", { NULL }, 2659, "tcp" }, - { "sns-query", { NULL }, 2659, "udp" }, - { "gcmonitor", { NULL }, 2660, "tcp" }, - { "gcmonitor", { NULL }, 2660, "udp" }, - { "olhost", { NULL }, 2661, "tcp" }, - { "olhost", { NULL }, 2661, "udp" }, - { "bintec-capi", { NULL }, 2662, "tcp" }, - { "bintec-capi", { NULL }, 2662, "udp" }, - { "bintec-tapi", { NULL }, 2663, "tcp" }, - { "bintec-tapi", { NULL }, 2663, "udp" }, - { "patrol-mq-gm", { NULL }, 2664, "tcp" }, - { "patrol-mq-gm", { NULL }, 2664, "udp" }, - { "patrol-mq-nm", { NULL }, 2665, "tcp" }, - { "patrol-mq-nm", { NULL }, 2665, "udp" }, - { "extensis", { NULL }, 2666, "tcp" }, - { "extensis", { NULL }, 2666, "udp" }, - { "alarm-clock-s", { NULL }, 2667, "tcp" }, - { "alarm-clock-s", { NULL }, 2667, "udp" }, - { "alarm-clock-c", { NULL }, 2668, "tcp" }, - { "alarm-clock-c", { NULL }, 2668, "udp" }, - { "toad", { NULL }, 2669, "tcp" }, - { "toad", { NULL }, 2669, "udp" }, - { "tve-announce", { NULL }, 2670, "tcp" }, - { "tve-announce", { NULL }, 2670, "udp" }, - { "newlixreg", { NULL }, 2671, "tcp" }, - { "newlixreg", { NULL }, 2671, "udp" }, - { "nhserver", { NULL }, 2672, "tcp" }, - { "nhserver", { NULL }, 2672, "udp" }, - { "firstcall42", { NULL }, 2673, "tcp" }, - { "firstcall42", { NULL }, 2673, "udp" }, - { "ewnn", { NULL }, 2674, "tcp" }, - { "ewnn", { NULL }, 2674, "udp" }, - { "ttc-etap", { NULL }, 2675, "tcp" }, - { "ttc-etap", { NULL }, 2675, "udp" }, - { "simslink", { NULL }, 2676, "tcp" }, - { "simslink", { NULL }, 2676, "udp" }, - { "gadgetgate1way", { NULL }, 2677, "tcp" }, - { "gadgetgate1way", { NULL }, 2677, "udp" }, - { "gadgetgate2way", { NULL }, 2678, "tcp" }, - { "gadgetgate2way", { NULL }, 2678, "udp" }, - { "syncserverssl", { NULL }, 2679, "tcp" }, - { "syncserverssl", { NULL }, 2679, "udp" }, - { "pxc-sapxom", { NULL }, 2680, "tcp" }, - { "pxc-sapxom", { NULL }, 2680, "udp" }, - { "mpnjsomb", { NULL }, 2681, "tcp" }, - { "mpnjsomb", { NULL }, 2681, "udp" }, - { "ncdloadbalance", { NULL }, 2683, "tcp" }, - { "ncdloadbalance", { NULL }, 2683, "udp" }, - { "mpnjsosv", { NULL }, 2684, "tcp" }, - { "mpnjsosv", { NULL }, 2684, "udp" }, - { "mpnjsocl", { NULL }, 2685, "tcp" }, - { "mpnjsocl", { NULL }, 2685, "udp" }, - { "mpnjsomg", { NULL }, 2686, "tcp" }, - { "mpnjsomg", { NULL }, 2686, "udp" }, - { "pq-lic-mgmt", { NULL }, 2687, "tcp" }, - { "pq-lic-mgmt", { NULL }, 2687, "udp" }, - { "md-cg-http", { NULL }, 2688, "tcp" }, - { "md-cg-http", { NULL }, 2688, "udp" }, - { "fastlynx", { NULL }, 2689, "tcp" }, - { "fastlynx", { NULL }, 2689, "udp" }, - { "hp-nnm-data", { NULL }, 2690, "tcp" }, - { "hp-nnm-data", { NULL }, 2690, "udp" }, - { "itinternet", { NULL }, 2691, "tcp" }, - { "itinternet", { NULL }, 2691, "udp" }, - { "admins-lms", { NULL }, 2692, "tcp" }, - { "admins-lms", { NULL }, 2692, "udp" }, - { "pwrsevent", { NULL }, 2694, "tcp" }, - { "pwrsevent", { NULL }, 2694, "udp" }, - { "vspread", { NULL }, 2695, "tcp" }, - { "vspread", { NULL }, 2695, "udp" }, - { "unifyadmin", { NULL }, 2696, "tcp" }, - { "unifyadmin", { NULL }, 2696, "udp" }, - { "oce-snmp-trap", { NULL }, 2697, "tcp" }, - { "oce-snmp-trap", { NULL }, 2697, "udp" }, - { "mck-ivpip", { NULL }, 2698, "tcp" }, - { "mck-ivpip", { NULL }, 2698, "udp" }, - { "csoft-plusclnt", { NULL }, 2699, "tcp" }, - { "csoft-plusclnt", { NULL }, 2699, "udp" }, - { "tqdata", { NULL }, 2700, "tcp" }, - { "tqdata", { NULL }, 2700, "udp" }, - { "sms-rcinfo", { NULL }, 2701, "tcp" }, - { "sms-rcinfo", { NULL }, 2701, "udp" }, - { "sms-xfer", { NULL }, 2702, "tcp" }, - { "sms-xfer", { NULL }, 2702, "udp" }, - { "sms-chat", { NULL }, 2703, "tcp" }, - { "sms-chat", { NULL }, 2703, "udp" }, - { "sms-remctrl", { NULL }, 2704, "tcp" }, - { "sms-remctrl", { NULL }, 2704, "udp" }, - { "sds-admin", { NULL }, 2705, "tcp" }, - { "sds-admin", { NULL }, 2705, "udp" }, - { "ncdmirroring", { NULL }, 2706, "tcp" }, - { "ncdmirroring", { NULL }, 2706, "udp" }, - { "emcsymapiport", { NULL }, 2707, "tcp" }, - { "emcsymapiport", { NULL }, 2707, "udp" }, - { "banyan-net", { NULL }, 2708, "tcp" }, - { "banyan-net", { NULL }, 2708, "udp" }, - { "supermon", { NULL }, 2709, "tcp" }, - { "supermon", { NULL }, 2709, "udp" }, - { "sso-service", { NULL }, 2710, "tcp" }, - { "sso-service", { NULL }, 2710, "udp" }, - { "sso-control", { NULL }, 2711, "tcp" }, - { "sso-control", { NULL }, 2711, "udp" }, - { "aocp", { NULL }, 2712, "tcp" }, - { "aocp", { NULL }, 2712, "udp" }, - { "raventbs", { NULL }, 2713, "tcp" }, - { "raventbs", { NULL }, 2713, "udp" }, - { "raventdm", { NULL }, 2714, "tcp" }, - { "raventdm", { NULL }, 2714, "udp" }, - { "hpstgmgr2", { NULL }, 2715, "tcp" }, - { "hpstgmgr2", { NULL }, 2715, "udp" }, - { "inova-ip-disco", { NULL }, 2716, "tcp" }, - { "inova-ip-disco", { NULL }, 2716, "udp" }, - { "pn-requester", { NULL }, 2717, "tcp" }, - { "pn-requester", { NULL }, 2717, "udp" }, - { "pn-requester2", { NULL }, 2718, "tcp" }, - { "pn-requester2", { NULL }, 2718, "udp" }, - { "scan-change", { NULL }, 2719, "tcp" }, - { "scan-change", { NULL }, 2719, "udp" }, - { "wkars", { NULL }, 2720, "tcp" }, - { "wkars", { NULL }, 2720, "udp" }, - { "smart-diagnose", { NULL }, 2721, "tcp" }, - { "smart-diagnose", { NULL }, 2721, "udp" }, - { "proactivesrvr", { NULL }, 2722, "tcp" }, - { "proactivesrvr", { NULL }, 2722, "udp" }, - { "watchdog-nt", { NULL }, 2723, "tcp" }, - { "watchdog-nt", { NULL }, 2723, "udp" }, - { "qotps", { NULL }, 2724, "tcp" }, - { "qotps", { NULL }, 2724, "udp" }, - { "msolap-ptp2", { NULL }, 2725, "tcp" }, - { "msolap-ptp2", { NULL }, 2725, "udp" }, - { "tams", { NULL }, 2726, "tcp" }, - { "tams", { NULL }, 2726, "udp" }, - { "mgcp-callagent", { NULL }, 2727, "tcp" }, - { "mgcp-callagent", { NULL }, 2727, "udp" }, - { "sqdr", { NULL }, 2728, "tcp" }, - { "sqdr", { NULL }, 2728, "udp" }, - { "tcim-control", { NULL }, 2729, "tcp" }, - { "tcim-control", { NULL }, 2729, "udp" }, - { "nec-raidplus", { NULL }, 2730, "tcp" }, - { "nec-raidplus", { NULL }, 2730, "udp" }, - { "fyre-messanger", { NULL }, 2731, "tcp" }, - { "fyre-messanger", { NULL }, 2731, "udp" }, - { "g5m", { NULL }, 2732, "tcp" }, - { "g5m", { NULL }, 2732, "udp" }, - { "signet-ctf", { NULL }, 2733, "tcp" }, - { "signet-ctf", { NULL }, 2733, "udp" }, - { "ccs-software", { NULL }, 2734, "tcp" }, - { "ccs-software", { NULL }, 2734, "udp" }, - { "netiq-mc", { NULL }, 2735, "tcp" }, - { "netiq-mc", { NULL }, 2735, "udp" }, - { "radwiz-nms-srv", { NULL }, 2736, "tcp" }, - { "radwiz-nms-srv", { NULL }, 2736, "udp" }, - { "srp-feedback", { NULL }, 2737, "tcp" }, - { "srp-feedback", { NULL }, 2737, "udp" }, - { "ndl-tcp-ois-gw", { NULL }, 2738, "tcp" }, - { "ndl-tcp-ois-gw", { NULL }, 2738, "udp" }, - { "tn-timing", { NULL }, 2739, "tcp" }, - { "tn-timing", { NULL }, 2739, "udp" }, - { "alarm", { NULL }, 2740, "tcp" }, - { "alarm", { NULL }, 2740, "udp" }, - { "tsb", { NULL }, 2741, "tcp" }, - { "tsb", { NULL }, 2741, "udp" }, - { "tsb2", { NULL }, 2742, "tcp" }, - { "tsb2", { NULL }, 2742, "udp" }, - { "murx", { NULL }, 2743, "tcp" }, - { "murx", { NULL }, 2743, "udp" }, - { "honyaku", { NULL }, 2744, "tcp" }, - { "honyaku", { NULL }, 2744, "udp" }, - { "urbisnet", { NULL }, 2745, "tcp" }, - { "urbisnet", { NULL }, 2745, "udp" }, - { "cpudpencap", { NULL }, 2746, "tcp" }, - { "cpudpencap", { NULL }, 2746, "udp" }, - { "fjippol-swrly", { NULL }, 2747, "tcp" }, - { "fjippol-swrly", { NULL }, 2747, "udp" }, - { "fjippol-polsvr", { NULL }, 2748, "tcp" }, - { "fjippol-polsvr", { NULL }, 2748, "udp" }, - { "fjippol-cnsl", { NULL }, 2749, "tcp" }, - { "fjippol-cnsl", { NULL }, 2749, "udp" }, - { "fjippol-port1", { NULL }, 2750, "tcp" }, - { "fjippol-port1", { NULL }, 2750, "udp" }, - { "fjippol-port2", { NULL }, 2751, "tcp" }, - { "fjippol-port2", { NULL }, 2751, "udp" }, - { "rsisysaccess", { NULL }, 2752, "tcp" }, - { "rsisysaccess", { NULL }, 2752, "udp" }, - { "de-spot", { NULL }, 2753, "tcp" }, - { "de-spot", { NULL }, 2753, "udp" }, - { "apollo-cc", { NULL }, 2754, "tcp" }, - { "apollo-cc", { NULL }, 2754, "udp" }, - { "expresspay", { NULL }, 2755, "tcp" }, - { "expresspay", { NULL }, 2755, "udp" }, - { "simplement-tie", { NULL }, 2756, "tcp" }, - { "simplement-tie", { NULL }, 2756, "udp" }, - { "cnrp", { NULL }, 2757, "tcp" }, - { "cnrp", { NULL }, 2757, "udp" }, - { "apollo-status", { NULL }, 2758, "tcp" }, - { "apollo-status", { NULL }, 2758, "udp" }, - { "apollo-gms", { NULL }, 2759, "tcp" }, - { "apollo-gms", { NULL }, 2759, "udp" }, - { "sabams", { NULL }, 2760, "tcp" }, - { "sabams", { NULL }, 2760, "udp" }, - { "dicom-iscl", { NULL }, 2761, "tcp" }, - { "dicom-iscl", { NULL }, 2761, "udp" }, - { "dicom-tls", { NULL }, 2762, "tcp" }, - { "dicom-tls", { NULL }, 2762, "udp" }, - { "desktop-dna", { NULL }, 2763, "tcp" }, - { "desktop-dna", { NULL }, 2763, "udp" }, - { "data-insurance", { NULL }, 2764, "tcp" }, - { "data-insurance", { NULL }, 2764, "udp" }, - { "qip-audup", { NULL }, 2765, "tcp" }, - { "qip-audup", { NULL }, 2765, "udp" }, - { "compaq-scp", { NULL }, 2766, "tcp" }, - { "compaq-scp", { NULL }, 2766, "udp" }, - { "uadtc", { NULL }, 2767, "tcp" }, - { "uadtc", { NULL }, 2767, "udp" }, - { "uacs", { NULL }, 2768, "tcp" }, - { "uacs", { NULL }, 2768, "udp" }, - { "exce", { NULL }, 2769, "tcp" }, - { "exce", { NULL }, 2769, "udp" }, - { "veronica", { NULL }, 2770, "tcp" }, - { "veronica", { NULL }, 2770, "udp" }, - { "vergencecm", { NULL }, 2771, "tcp" }, - { "vergencecm", { NULL }, 2771, "udp" }, - { "auris", { NULL }, 2772, "tcp" }, - { "auris", { NULL }, 2772, "udp" }, - { "rbakcup1", { NULL }, 2773, "tcp" }, - { "rbakcup1", { NULL }, 2773, "udp" }, - { "rbakcup2", { NULL }, 2774, "tcp" }, - { "rbakcup2", { NULL }, 2774, "udp" }, - { "smpp", { NULL }, 2775, "tcp" }, - { "smpp", { NULL }, 2775, "udp" }, - { "ridgeway1", { NULL }, 2776, "tcp" }, - { "ridgeway1", { NULL }, 2776, "udp" }, - { "ridgeway2", { NULL }, 2777, "tcp" }, - { "ridgeway2", { NULL }, 2777, "udp" }, - { "gwen-sonya", { NULL }, 2778, "tcp" }, - { "gwen-sonya", { NULL }, 2778, "udp" }, - { "lbc-sync", { NULL }, 2779, "tcp" }, - { "lbc-sync", { NULL }, 2779, "udp" }, - { "lbc-control", { NULL }, 2780, "tcp" }, - { "lbc-control", { NULL }, 2780, "udp" }, - { "whosells", { NULL }, 2781, "tcp" }, - { "whosells", { NULL }, 2781, "udp" }, - { "everydayrc", { NULL }, 2782, "tcp" }, - { "everydayrc", { NULL }, 2782, "udp" }, - { "aises", { NULL }, 2783, "tcp" }, - { "aises", { NULL }, 2783, "udp" }, - { "www-dev", { NULL }, 2784, "tcp" }, - { "www-dev", { NULL }, 2784, "udp" }, - { "aic-np", { NULL }, 2785, "tcp" }, - { "aic-np", { NULL }, 2785, "udp" }, - { "aic-oncrpc", { NULL }, 2786, "tcp" }, - { "aic-oncrpc", { NULL }, 2786, "udp" }, - { "piccolo", { NULL }, 2787, "tcp" }, - { "piccolo", { NULL }, 2787, "udp" }, - { "fryeserv", { NULL }, 2788, "tcp" }, - { "fryeserv", { NULL }, 2788, "udp" }, - { "media-agent", { NULL }, 2789, "tcp" }, - { "media-agent", { NULL }, 2789, "udp" }, - { "plgproxy", { NULL }, 2790, "tcp" }, - { "plgproxy", { NULL }, 2790, "udp" }, - { "mtport-regist", { NULL }, 2791, "tcp" }, - { "mtport-regist", { NULL }, 2791, "udp" }, - { "f5-globalsite", { NULL }, 2792, "tcp" }, - { "f5-globalsite", { NULL }, 2792, "udp" }, - { "initlsmsad", { NULL }, 2793, "tcp" }, - { "initlsmsad", { NULL }, 2793, "udp" }, - { "livestats", { NULL }, 2795, "tcp" }, - { "livestats", { NULL }, 2795, "udp" }, - { "ac-tech", { NULL }, 2796, "tcp" }, - { "ac-tech", { NULL }, 2796, "udp" }, - { "esp-encap", { NULL }, 2797, "tcp" }, - { "esp-encap", { NULL }, 2797, "udp" }, - { "tmesis-upshot", { NULL }, 2798, "tcp" }, - { "tmesis-upshot", { NULL }, 2798, "udp" }, - { "icon-discover", { NULL }, 2799, "tcp" }, - { "icon-discover", { NULL }, 2799, "udp" }, - { "acc-raid", { NULL }, 2800, "tcp" }, - { "acc-raid", { NULL }, 2800, "udp" }, - { "igcp", { NULL }, 2801, "tcp" }, - { "igcp", { NULL }, 2801, "udp" }, - { "veritas-tcp1", { NULL }, 2802, "tcp" }, - { "veritas-udp1", { NULL }, 2802, "udp" }, - { "btprjctrl", { NULL }, 2803, "tcp" }, - { "btprjctrl", { NULL }, 2803, "udp" }, - { "dvr-esm", { NULL }, 2804, "tcp" }, - { "dvr-esm", { NULL }, 2804, "udp" }, - { "wta-wsp-s", { NULL }, 2805, "tcp" }, - { "wta-wsp-s", { NULL }, 2805, "udp" }, - { "cspuni", { NULL }, 2806, "tcp" }, - { "cspuni", { NULL }, 2806, "udp" }, - { "cspmulti", { NULL }, 2807, "tcp" }, - { "cspmulti", { NULL }, 2807, "udp" }, - { "j-lan-p", { NULL }, 2808, "tcp" }, - { "j-lan-p", { NULL }, 2808, "udp" }, - { "corbaloc", { NULL }, 2809, "tcp" }, - { "corbaloc", { NULL }, 2809, "udp" }, - { "netsteward", { NULL }, 2810, "tcp" }, - { "netsteward", { NULL }, 2810, "udp" }, - { "gsiftp", { NULL }, 2811, "tcp" }, - { "gsiftp", { NULL }, 2811, "udp" }, - { "atmtcp", { NULL }, 2812, "tcp" }, - { "atmtcp", { NULL }, 2812, "udp" }, - { "llm-pass", { NULL }, 2813, "tcp" }, - { "llm-pass", { NULL }, 2813, "udp" }, - { "llm-csv", { NULL }, 2814, "tcp" }, - { "llm-csv", { NULL }, 2814, "udp" }, - { "lbc-measure", { NULL }, 2815, "tcp" }, - { "lbc-measure", { NULL }, 2815, "udp" }, - { "lbc-watchdog", { NULL }, 2816, "tcp" }, - { "lbc-watchdog", { NULL }, 2816, "udp" }, - { "nmsigport", { NULL }, 2817, "tcp" }, - { "nmsigport", { NULL }, 2817, "udp" }, - { "rmlnk", { NULL }, 2818, "tcp" }, - { "rmlnk", { NULL }, 2818, "udp" }, - { "fc-faultnotify", { NULL }, 2819, "tcp" }, - { "fc-faultnotify", { NULL }, 2819, "udp" }, - { "univision", { NULL }, 2820, "tcp" }, - { "univision", { NULL }, 2820, "udp" }, - { "vrts-at-port", { NULL }, 2821, "tcp" }, - { "vrts-at-port", { NULL }, 2821, "udp" }, - { "ka0wuc", { NULL }, 2822, "tcp" }, - { "ka0wuc", { NULL }, 2822, "udp" }, - { "cqg-netlan", { NULL }, 2823, "tcp" }, - { "cqg-netlan", { NULL }, 2823, "udp" }, - { "cqg-netlan-1", { NULL }, 2824, "tcp" }, - { "cqg-netlan-1", { NULL }, 2824, "udp" }, - { "slc-systemlog", { NULL }, 2826, "tcp" }, - { "slc-systemlog", { NULL }, 2826, "udp" }, - { "slc-ctrlrloops", { NULL }, 2827, "tcp" }, - { "slc-ctrlrloops", { NULL }, 2827, "udp" }, - { "itm-lm", { NULL }, 2828, "tcp" }, - { "itm-lm", { NULL }, 2828, "udp" }, - { "silkp1", { NULL }, 2829, "tcp" }, - { "silkp1", { NULL }, 2829, "udp" }, - { "silkp2", { NULL }, 2830, "tcp" }, - { "silkp2", { NULL }, 2830, "udp" }, - { "silkp3", { NULL }, 2831, "tcp" }, - { "silkp3", { NULL }, 2831, "udp" }, - { "silkp4", { NULL }, 2832, "tcp" }, - { "silkp4", { NULL }, 2832, "udp" }, - { "glishd", { NULL }, 2833, "tcp" }, - { "glishd", { NULL }, 2833, "udp" }, - { "evtp", { NULL }, 2834, "tcp" }, - { "evtp", { NULL }, 2834, "udp" }, - { "evtp-data", { NULL }, 2835, "tcp" }, - { "evtp-data", { NULL }, 2835, "udp" }, - { "catalyst", { NULL }, 2836, "tcp" }, - { "catalyst", { NULL }, 2836, "udp" }, - { "repliweb", { NULL }, 2837, "tcp" }, - { "repliweb", { NULL }, 2837, "udp" }, - { "starbot", { NULL }, 2838, "tcp" }, - { "starbot", { NULL }, 2838, "udp" }, - { "nmsigport", { NULL }, 2839, "tcp" }, - { "nmsigport", { NULL }, 2839, "udp" }, - { "l3-exprt", { NULL }, 2840, "tcp" }, - { "l3-exprt", { NULL }, 2840, "udp" }, - { "l3-ranger", { NULL }, 2841, "tcp" }, - { "l3-ranger", { NULL }, 2841, "udp" }, - { "l3-hawk", { NULL }, 2842, "tcp" }, - { "l3-hawk", { NULL }, 2842, "udp" }, - { "pdnet", { NULL }, 2843, "tcp" }, - { "pdnet", { NULL }, 2843, "udp" }, - { "bpcp-poll", { NULL }, 2844, "tcp" }, - { "bpcp-poll", { NULL }, 2844, "udp" }, - { "bpcp-trap", { NULL }, 2845, "tcp" }, - { "bpcp-trap", { NULL }, 2845, "udp" }, - { "aimpp-hello", { NULL }, 2846, "tcp" }, - { "aimpp-hello", { NULL }, 2846, "udp" }, - { "aimpp-port-req", { NULL }, 2847, "tcp" }, - { "aimpp-port-req", { NULL }, 2847, "udp" }, - { "amt-blc-port", { NULL }, 2848, "tcp" }, - { "amt-blc-port", { NULL }, 2848, "udp" }, - { "fxp", { NULL }, 2849, "tcp" }, - { "fxp", { NULL }, 2849, "udp" }, - { "metaconsole", { NULL }, 2850, "tcp" }, - { "metaconsole", { NULL }, 2850, "udp" }, - { "webemshttp", { NULL }, 2851, "tcp" }, - { "webemshttp", { NULL }, 2851, "udp" }, - { "bears-01", { NULL }, 2852, "tcp" }, - { "bears-01", { NULL }, 2852, "udp" }, - { "ispipes", { NULL }, 2853, "tcp" }, - { "ispipes", { NULL }, 2853, "udp" }, - { "infomover", { NULL }, 2854, "tcp" }, - { "infomover", { NULL }, 2854, "udp" }, - { "msrp", { NULL }, 2855, "tcp" }, - { "msrp", { NULL }, 2855, "udp" }, - { "cesdinv", { NULL }, 2856, "tcp" }, - { "cesdinv", { NULL }, 2856, "udp" }, - { "simctlp", { NULL }, 2857, "tcp" }, - { "simctlp", { NULL }, 2857, "udp" }, - { "ecnp", { NULL }, 2858, "tcp" }, - { "ecnp", { NULL }, 2858, "udp" }, - { "activememory", { NULL }, 2859, "tcp" }, - { "activememory", { NULL }, 2859, "udp" }, - { "dialpad-voice1", { NULL }, 2860, "tcp" }, - { "dialpad-voice1", { NULL }, 2860, "udp" }, - { "dialpad-voice2", { NULL }, 2861, "tcp" }, - { "dialpad-voice2", { NULL }, 2861, "udp" }, - { "ttg-protocol", { NULL }, 2862, "tcp" }, - { "ttg-protocol", { NULL }, 2862, "udp" }, - { "sonardata", { NULL }, 2863, "tcp" }, - { "sonardata", { NULL }, 2863, "udp" }, - { "astromed-main", { NULL }, 2864, "tcp" }, - { "astromed-main", { NULL }, 2864, "udp" }, - { "pit-vpn", { NULL }, 2865, "tcp" }, - { "pit-vpn", { NULL }, 2865, "udp" }, - { "iwlistener", { NULL }, 2866, "tcp" }, - { "iwlistener", { NULL }, 2866, "udp" }, - { "esps-portal", { NULL }, 2867, "tcp" }, - { "esps-portal", { NULL }, 2867, "udp" }, - { "npep-messaging", { NULL }, 2868, "tcp" }, - { "npep-messaging", { NULL }, 2868, "udp" }, - { "icslap", { NULL }, 2869, "tcp" }, - { "icslap", { NULL }, 2869, "udp" }, - { "daishi", { NULL }, 2870, "tcp" }, - { "daishi", { NULL }, 2870, "udp" }, - { "msi-selectplay", { NULL }, 2871, "tcp" }, - { "msi-selectplay", { NULL }, 2871, "udp" }, - { "radix", { NULL }, 2872, "tcp" }, - { "radix", { NULL }, 2872, "udp" }, - { "dxmessagebase1", { NULL }, 2874, "tcp" }, - { "dxmessagebase1", { NULL }, 2874, "udp" }, - { "dxmessagebase2", { NULL }, 2875, "tcp" }, - { "dxmessagebase2", { NULL }, 2875, "udp" }, - { "sps-tunnel", { NULL }, 2876, "tcp" }, - { "sps-tunnel", { NULL }, 2876, "udp" }, - { "bluelance", { NULL }, 2877, "tcp" }, - { "bluelance", { NULL }, 2877, "udp" }, - { "aap", { NULL }, 2878, "tcp" }, - { "aap", { NULL }, 2878, "udp" }, - { "ucentric-ds", { NULL }, 2879, "tcp" }, - { "ucentric-ds", { NULL }, 2879, "udp" }, - { "synapse", { NULL }, 2880, "tcp" }, - { "synapse", { NULL }, 2880, "udp" }, - { "ndsp", { NULL }, 2881, "tcp" }, - { "ndsp", { NULL }, 2881, "udp" }, - { "ndtp", { NULL }, 2882, "tcp" }, - { "ndtp", { NULL }, 2882, "udp" }, - { "ndnp", { NULL }, 2883, "tcp" }, - { "ndnp", { NULL }, 2883, "udp" }, - { "flashmsg", { NULL }, 2884, "tcp" }, - { "flashmsg", { NULL }, 2884, "udp" }, - { "topflow", { NULL }, 2885, "tcp" }, - { "topflow", { NULL }, 2885, "udp" }, - { "responselogic", { NULL }, 2886, "tcp" }, - { "responselogic", { NULL }, 2886, "udp" }, - { "aironetddp", { NULL }, 2887, "tcp" }, - { "aironetddp", { NULL }, 2887, "udp" }, - { "spcsdlobby", { NULL }, 2888, "tcp" }, - { "spcsdlobby", { NULL }, 2888, "udp" }, - { "rsom", { NULL }, 2889, "tcp" }, - { "rsom", { NULL }, 2889, "udp" }, - { "cspclmulti", { NULL }, 2890, "tcp" }, - { "cspclmulti", { NULL }, 2890, "udp" }, - { "cinegrfx-elmd", { NULL }, 2891, "tcp" }, - { "cinegrfx-elmd", { NULL }, 2891, "udp" }, - { "snifferdata", { NULL }, 2892, "tcp" }, - { "snifferdata", { NULL }, 2892, "udp" }, - { "vseconnector", { NULL }, 2893, "tcp" }, - { "vseconnector", { NULL }, 2893, "udp" }, - { "abacus-remote", { NULL }, 2894, "tcp" }, - { "abacus-remote", { NULL }, 2894, "udp" }, - { "natuslink", { NULL }, 2895, "tcp" }, - { "natuslink", { NULL }, 2895, "udp" }, - { "ecovisiong6-1", { NULL }, 2896, "tcp" }, - { "ecovisiong6-1", { NULL }, 2896, "udp" }, - { "citrix-rtmp", { NULL }, 2897, "tcp" }, - { "citrix-rtmp", { NULL }, 2897, "udp" }, - { "appliance-cfg", { NULL }, 2898, "tcp" }, - { "appliance-cfg", { NULL }, 2898, "udp" }, - { "powergemplus", { NULL }, 2899, "tcp" }, - { "powergemplus", { NULL }, 2899, "udp" }, - { "quicksuite", { NULL }, 2900, "tcp" }, - { "quicksuite", { NULL }, 2900, "udp" }, - { "allstorcns", { NULL }, 2901, "tcp" }, - { "allstorcns", { NULL }, 2901, "udp" }, - { "netaspi", { NULL }, 2902, "tcp" }, - { "netaspi", { NULL }, 2902, "udp" }, - { "suitcase", { NULL }, 2903, "tcp" }, - { "suitcase", { NULL }, 2903, "udp" }, - { "m2ua", { NULL }, 2904, "tcp" }, - { "m2ua", { NULL }, 2904, "udp" }, - { "m2ua", { NULL }, 2904, "sctp"}, - { "m3ua", { NULL }, 2905, "tcp" }, - { "m3ua", { NULL }, 2905, "sctp"}, - { "caller9", { NULL }, 2906, "tcp" }, - { "caller9", { NULL }, 2906, "udp" }, - { "webmethods-b2b", { NULL }, 2907, "tcp" }, - { "webmethods-b2b", { NULL }, 2907, "udp" }, - { "mao", { NULL }, 2908, "tcp" }, - { "mao", { NULL }, 2908, "udp" }, - { "funk-dialout", { NULL }, 2909, "tcp" }, - { "funk-dialout", { NULL }, 2909, "udp" }, - { "tdaccess", { NULL }, 2910, "tcp" }, - { "tdaccess", { NULL }, 2910, "udp" }, - { "blockade", { NULL }, 2911, "tcp" }, - { "blockade", { NULL }, 2911, "udp" }, - { "epicon", { NULL }, 2912, "tcp" }, - { "epicon", { NULL }, 2912, "udp" }, - { "boosterware", { NULL }, 2913, "tcp" }, - { "boosterware", { NULL }, 2913, "udp" }, - { "gamelobby", { NULL }, 2914, "tcp" }, - { "gamelobby", { NULL }, 2914, "udp" }, - { "tksocket", { NULL }, 2915, "tcp" }, - { "tksocket", { NULL }, 2915, "udp" }, - { "elvin_server", { NULL }, 2916, "tcp" }, - { "elvin_server", { NULL }, 2916, "udp" }, - { "elvin_client", { NULL }, 2917, "tcp" }, - { "elvin_client", { NULL }, 2917, "udp" }, - { "kastenchasepad", { NULL }, 2918, "tcp" }, - { "kastenchasepad", { NULL }, 2918, "udp" }, - { "roboer", { NULL }, 2919, "tcp" }, - { "roboer", { NULL }, 2919, "udp" }, - { "roboeda", { NULL }, 2920, "tcp" }, - { "roboeda", { NULL }, 2920, "udp" }, - { "cesdcdman", { NULL }, 2921, "tcp" }, - { "cesdcdman", { NULL }, 2921, "udp" }, - { "cesdcdtrn", { NULL }, 2922, "tcp" }, - { "cesdcdtrn", { NULL }, 2922, "udp" }, - { "wta-wsp-wtp-s", { NULL }, 2923, "tcp" }, - { "wta-wsp-wtp-s", { NULL }, 2923, "udp" }, - { "precise-vip", { NULL }, 2924, "tcp" }, - { "precise-vip", { NULL }, 2924, "udp" }, - { "mobile-file-dl", { NULL }, 2926, "tcp" }, - { "mobile-file-dl", { NULL }, 2926, "udp" }, - { "unimobilectrl", { NULL }, 2927, "tcp" }, - { "unimobilectrl", { NULL }, 2927, "udp" }, - { "redstone-cpss", { NULL }, 2928, "tcp" }, - { "redstone-cpss", { NULL }, 2928, "udp" }, - { "amx-webadmin", { NULL }, 2929, "tcp" }, - { "amx-webadmin", { NULL }, 2929, "udp" }, - { "amx-weblinx", { NULL }, 2930, "tcp" }, - { "amx-weblinx", { NULL }, 2930, "udp" }, - { "circle-x", { NULL }, 2931, "tcp" }, - { "circle-x", { NULL }, 2931, "udp" }, - { "incp", { NULL }, 2932, "tcp" }, - { "incp", { NULL }, 2932, "udp" }, - { "4-tieropmgw", { NULL }, 2933, "tcp" }, - { "4-tieropmgw", { NULL }, 2933, "udp" }, - { "4-tieropmcli", { NULL }, 2934, "tcp" }, - { "4-tieropmcli", { NULL }, 2934, "udp" }, - { "qtp", { NULL }, 2935, "tcp" }, - { "qtp", { NULL }, 2935, "udp" }, - { "otpatch", { NULL }, 2936, "tcp" }, - { "otpatch", { NULL }, 2936, "udp" }, - { "pnaconsult-lm", { NULL }, 2937, "tcp" }, - { "pnaconsult-lm", { NULL }, 2937, "udp" }, - { "sm-pas-1", { NULL }, 2938, "tcp" }, - { "sm-pas-1", { NULL }, 2938, "udp" }, - { "sm-pas-2", { NULL }, 2939, "tcp" }, - { "sm-pas-2", { NULL }, 2939, "udp" }, - { "sm-pas-3", { NULL }, 2940, "tcp" }, - { "sm-pas-3", { NULL }, 2940, "udp" }, - { "sm-pas-4", { NULL }, 2941, "tcp" }, - { "sm-pas-4", { NULL }, 2941, "udp" }, - { "sm-pas-5", { NULL }, 2942, "tcp" }, - { "sm-pas-5", { NULL }, 2942, "udp" }, - { "ttnrepository", { NULL }, 2943, "tcp" }, - { "ttnrepository", { NULL }, 2943, "udp" }, - { "megaco-h248", { NULL }, 2944, "tcp" }, - { "megaco-h248", { NULL }, 2944, "udp" }, - { "megaco-h248", { NULL }, 2944, "sctp"}, - { "h248-binary", { NULL }, 2945, "tcp" }, - { "h248-binary", { NULL }, 2945, "udp" }, - { "h248-binary", { NULL }, 2945, "sctp"}, - { "fjsvmpor", { NULL }, 2946, "tcp" }, - { "fjsvmpor", { NULL }, 2946, "udp" }, - { "gpsd", { NULL }, 2947, "tcp" }, - { "gpsd", { NULL }, 2947, "udp" }, - { "wap-push", { NULL }, 2948, "tcp" }, - { "wap-push", { NULL }, 2948, "udp" }, - { "wap-pushsecure", { NULL }, 2949, "tcp" }, - { "wap-pushsecure", { NULL }, 2949, "udp" }, - { "esip", { NULL }, 2950, "tcp" }, - { "esip", { NULL }, 2950, "udp" }, - { "ottp", { NULL }, 2951, "tcp" }, - { "ottp", { NULL }, 2951, "udp" }, - { "mpfwsas", { NULL }, 2952, "tcp" }, - { "mpfwsas", { NULL }, 2952, "udp" }, - { "ovalarmsrv", { NULL }, 2953, "tcp" }, - { "ovalarmsrv", { NULL }, 2953, "udp" }, - { "ovalarmsrv-cmd", { NULL }, 2954, "tcp" }, - { "ovalarmsrv-cmd", { NULL }, 2954, "udp" }, - { "csnotify", { NULL }, 2955, "tcp" }, - { "csnotify", { NULL }, 2955, "udp" }, - { "ovrimosdbman", { NULL }, 2956, "tcp" }, - { "ovrimosdbman", { NULL }, 2956, "udp" }, - { "jmact5", { NULL }, 2957, "tcp" }, - { "jmact5", { NULL }, 2957, "udp" }, - { "jmact6", { NULL }, 2958, "tcp" }, - { "jmact6", { NULL }, 2958, "udp" }, - { "rmopagt", { NULL }, 2959, "tcp" }, - { "rmopagt", { NULL }, 2959, "udp" }, - { "dfoxserver", { NULL }, 2960, "tcp" }, - { "dfoxserver", { NULL }, 2960, "udp" }, - { "boldsoft-lm", { NULL }, 2961, "tcp" }, - { "boldsoft-lm", { NULL }, 2961, "udp" }, - { "iph-policy-cli", { NULL }, 2962, "tcp" }, - { "iph-policy-cli", { NULL }, 2962, "udp" }, - { "iph-policy-adm", { NULL }, 2963, "tcp" }, - { "iph-policy-adm", { NULL }, 2963, "udp" }, - { "bullant-srap", { NULL }, 2964, "tcp" }, - { "bullant-srap", { NULL }, 2964, "udp" }, - { "bullant-rap", { NULL }, 2965, "tcp" }, - { "bullant-rap", { NULL }, 2965, "udp" }, - { "idp-infotrieve", { NULL }, 2966, "tcp" }, - { "idp-infotrieve", { NULL }, 2966, "udp" }, - { "ssc-agent", { NULL }, 2967, "tcp" }, - { "ssc-agent", { NULL }, 2967, "udp" }, - { "enpp", { NULL }, 2968, "tcp" }, - { "enpp", { NULL }, 2968, "udp" }, - { "essp", { NULL }, 2969, "tcp" }, - { "essp", { NULL }, 2969, "udp" }, - { "index-net", { NULL }, 2970, "tcp" }, - { "index-net", { NULL }, 2970, "udp" }, - { "netclip", { NULL }, 2971, "tcp" }, - { "netclip", { NULL }, 2971, "udp" }, - { "pmsm-webrctl", { NULL }, 2972, "tcp" }, - { "pmsm-webrctl", { NULL }, 2972, "udp" }, - { "svnetworks", { NULL }, 2973, "tcp" }, - { "svnetworks", { NULL }, 2973, "udp" }, - { "signal", { NULL }, 2974, "tcp" }, - { "signal", { NULL }, 2974, "udp" }, - { "fjmpcm", { NULL }, 2975, "tcp" }, - { "fjmpcm", { NULL }, 2975, "udp" }, - { "cns-srv-port", { NULL }, 2976, "tcp" }, - { "cns-srv-port", { NULL }, 2976, "udp" }, - { "ttc-etap-ns", { NULL }, 2977, "tcp" }, - { "ttc-etap-ns", { NULL }, 2977, "udp" }, - { "ttc-etap-ds", { NULL }, 2978, "tcp" }, - { "ttc-etap-ds", { NULL }, 2978, "udp" }, - { "h263-video", { NULL }, 2979, "tcp" }, - { "h263-video", { NULL }, 2979, "udp" }, - { "wimd", { NULL }, 2980, "tcp" }, - { "wimd", { NULL }, 2980, "udp" }, - { "mylxamport", { NULL }, 2981, "tcp" }, - { "mylxamport", { NULL }, 2981, "udp" }, - { "iwb-whiteboard", { NULL }, 2982, "tcp" }, - { "iwb-whiteboard", { NULL }, 2982, "udp" }, - { "netplan", { NULL }, 2983, "tcp" }, - { "netplan", { NULL }, 2983, "udp" }, - { "hpidsadmin", { NULL }, 2984, "tcp" }, - { "hpidsadmin", { NULL }, 2984, "udp" }, - { "hpidsagent", { NULL }, 2985, "tcp" }, - { "hpidsagent", { NULL }, 2985, "udp" }, - { "stonefalls", { NULL }, 2986, "tcp" }, - { "stonefalls", { NULL }, 2986, "udp" }, - { "identify", { NULL }, 2987, "tcp" }, - { "identify", { NULL }, 2987, "udp" }, - { "hippad", { NULL }, 2988, "tcp" }, - { "hippad", { NULL }, 2988, "udp" }, - { "zarkov", { NULL }, 2989, "tcp" }, - { "zarkov", { NULL }, 2989, "udp" }, - { "boscap", { NULL }, 2990, "tcp" }, - { "boscap", { NULL }, 2990, "udp" }, - { "wkstn-mon", { NULL }, 2991, "tcp" }, - { "wkstn-mon", { NULL }, 2991, "udp" }, - { "avenyo", { NULL }, 2992, "tcp" }, - { "avenyo", { NULL }, 2992, "udp" }, - { "veritas-vis1", { NULL }, 2993, "tcp" }, - { "veritas-vis1", { NULL }, 2993, "udp" }, - { "veritas-vis2", { NULL }, 2994, "tcp" }, - { "veritas-vis2", { NULL }, 2994, "udp" }, - { "idrs", { NULL }, 2995, "tcp" }, - { "idrs", { NULL }, 2995, "udp" }, - { "vsixml", { NULL }, 2996, "tcp" }, - { "vsixml", { NULL }, 2996, "udp" }, - { "rebol", { NULL }, 2997, "tcp" }, - { "rebol", { NULL }, 2997, "udp" }, - { "realsecure", { NULL }, 2998, "tcp" }, - { "realsecure", { NULL }, 2998, "udp" }, - { "remoteware-un", { NULL }, 2999, "tcp" }, - { "remoteware-un", { NULL }, 2999, "udp" }, - { "hbci", { NULL }, 3000, "tcp" }, - { "hbci", { NULL }, 3000, "udp" }, - { "remoteware-cl", { NULL }, 3000, "tcp" }, - { "remoteware-cl", { NULL }, 3000, "udp" }, - { "exlm-agent", { NULL }, 3002, "tcp" }, - { "exlm-agent", { NULL }, 3002, "udp" }, - { "remoteware-srv", { NULL }, 3002, "tcp" }, - { "remoteware-srv", { NULL }, 3002, "udp" }, - { "cgms", { NULL }, 3003, "tcp" }, - { "cgms", { NULL }, 3003, "udp" }, - { "csoftragent", { NULL }, 3004, "tcp" }, - { "csoftragent", { NULL }, 3004, "udp" }, - { "geniuslm", { NULL }, 3005, "tcp" }, - { "geniuslm", { NULL }, 3005, "udp" }, - { "ii-admin", { NULL }, 3006, "tcp" }, - { "ii-admin", { NULL }, 3006, "udp" }, - { "lotusmtap", { NULL }, 3007, "tcp" }, - { "lotusmtap", { NULL }, 3007, "udp" }, - { "midnight-tech", { NULL }, 3008, "tcp" }, - { "midnight-tech", { NULL }, 3008, "udp" }, - { "pxc-ntfy", { NULL }, 3009, "tcp" }, - { "pxc-ntfy", { NULL }, 3009, "udp" }, - { "gw", { NULL }, 3010, "tcp" }, - { "ping-pong", { NULL }, 3010, "udp" }, - { "trusted-web", { NULL }, 3011, "tcp" }, - { "trusted-web", { NULL }, 3011, "udp" }, - { "twsdss", { NULL }, 3012, "tcp" }, - { "twsdss", { NULL }, 3012, "udp" }, - { "gilatskysurfer", { NULL }, 3013, "tcp" }, - { "gilatskysurfer", { NULL }, 3013, "udp" }, - { "broker_service", { NULL }, 3014, "tcp" }, - { "broker_service", { NULL }, 3014, "udp" }, - { "nati-dstp", { NULL }, 3015, "tcp" }, - { "nati-dstp", { NULL }, 3015, "udp" }, - { "notify_srvr", { NULL }, 3016, "tcp" }, - { "notify_srvr", { NULL }, 3016, "udp" }, - { "event_listener", { NULL }, 3017, "tcp" }, - { "event_listener", { NULL }, 3017, "udp" }, - { "srvc_registry", { NULL }, 3018, "tcp" }, - { "srvc_registry", { NULL }, 3018, "udp" }, - { "resource_mgr", { NULL }, 3019, "tcp" }, - { "resource_mgr", { NULL }, 3019, "udp" }, - { "cifs", { NULL }, 3020, "tcp" }, - { "cifs", { NULL }, 3020, "udp" }, - { "agriserver", { NULL }, 3021, "tcp" }, - { "agriserver", { NULL }, 3021, "udp" }, - { "csregagent", { NULL }, 3022, "tcp" }, - { "csregagent", { NULL }, 3022, "udp" }, - { "magicnotes", { NULL }, 3023, "tcp" }, - { "magicnotes", { NULL }, 3023, "udp" }, - { "nds_sso", { NULL }, 3024, "tcp" }, - { "nds_sso", { NULL }, 3024, "udp" }, - { "arepa-raft", { NULL }, 3025, "tcp" }, - { "arepa-raft", { NULL }, 3025, "udp" }, - { "agri-gateway", { NULL }, 3026, "tcp" }, - { "agri-gateway", { NULL }, 3026, "udp" }, - { "LiebDevMgmt_C", { NULL }, 3027, "tcp" }, - { "LiebDevMgmt_C", { NULL }, 3027, "udp" }, - { "LiebDevMgmt_DM", { NULL }, 3028, "tcp" }, - { "LiebDevMgmt_DM", { NULL }, 3028, "udp" }, - { "LiebDevMgmt_A", { NULL }, 3029, "tcp" }, - { "LiebDevMgmt_A", { NULL }, 3029, "udp" }, - { "arepa-cas", { NULL }, 3030, "tcp" }, - { "arepa-cas", { NULL }, 3030, "udp" }, - { "eppc", { NULL }, 3031, "tcp" }, - { "eppc", { NULL }, 3031, "udp" }, - { "redwood-chat", { NULL }, 3032, "tcp" }, - { "redwood-chat", { NULL }, 3032, "udp" }, - { "pdb", { NULL }, 3033, "tcp" }, - { "pdb", { NULL }, 3033, "udp" }, - { "osmosis-aeea", { NULL }, 3034, "tcp" }, - { "osmosis-aeea", { NULL }, 3034, "udp" }, - { "fjsv-gssagt", { NULL }, 3035, "tcp" }, - { "fjsv-gssagt", { NULL }, 3035, "udp" }, - { "hagel-dump", { NULL }, 3036, "tcp" }, - { "hagel-dump", { NULL }, 3036, "udp" }, - { "hp-san-mgmt", { NULL }, 3037, "tcp" }, - { "hp-san-mgmt", { NULL }, 3037, "udp" }, - { "santak-ups", { NULL }, 3038, "tcp" }, - { "santak-ups", { NULL }, 3038, "udp" }, - { "cogitate", { NULL }, 3039, "tcp" }, - { "cogitate", { NULL }, 3039, "udp" }, - { "tomato-springs", { NULL }, 3040, "tcp" }, - { "tomato-springs", { NULL }, 3040, "udp" }, - { "di-traceware", { NULL }, 3041, "tcp" }, - { "di-traceware", { NULL }, 3041, "udp" }, - { "journee", { NULL }, 3042, "tcp" }, - { "journee", { NULL }, 3042, "udp" }, - { "brp", { NULL }, 3043, "tcp" }, - { "brp", { NULL }, 3043, "udp" }, - { "epp", { NULL }, 3044, "tcp" }, - { "epp", { NULL }, 3044, "udp" }, - { "responsenet", { NULL }, 3045, "tcp" }, - { "responsenet", { NULL }, 3045, "udp" }, - { "di-ase", { NULL }, 3046, "tcp" }, - { "di-ase", { NULL }, 3046, "udp" }, - { "hlserver", { NULL }, 3047, "tcp" }, - { "hlserver", { NULL }, 3047, "udp" }, - { "pctrader", { NULL }, 3048, "tcp" }, - { "pctrader", { NULL }, 3048, "udp" }, - { "nsws", { NULL }, 3049, "tcp" }, - { "nsws", { NULL }, 3049, "udp" }, - { "gds_db", { NULL }, 3050, "tcp" }, - { "gds_db", { NULL }, 3050, "udp" }, - { "galaxy-server", { NULL }, 3051, "tcp" }, - { "galaxy-server", { NULL }, 3051, "udp" }, - { "apc-3052", { NULL }, 3052, "tcp" }, - { "apc-3052", { NULL }, 3052, "udp" }, - { "dsom-server", { NULL }, 3053, "tcp" }, - { "dsom-server", { NULL }, 3053, "udp" }, - { "amt-cnf-prot", { NULL }, 3054, "tcp" }, - { "amt-cnf-prot", { NULL }, 3054, "udp" }, - { "policyserver", { NULL }, 3055, "tcp" }, - { "policyserver", { NULL }, 3055, "udp" }, - { "cdl-server", { NULL }, 3056, "tcp" }, - { "cdl-server", { NULL }, 3056, "udp" }, - { "goahead-fldup", { NULL }, 3057, "tcp" }, - { "goahead-fldup", { NULL }, 3057, "udp" }, - { "videobeans", { NULL }, 3058, "tcp" }, - { "videobeans", { NULL }, 3058, "udp" }, - { "qsoft", { NULL }, 3059, "tcp" }, - { "qsoft", { NULL }, 3059, "udp" }, - { "interserver", { NULL }, 3060, "tcp" }, - { "interserver", { NULL }, 3060, "udp" }, - { "cautcpd", { NULL }, 3061, "tcp" }, - { "cautcpd", { NULL }, 3061, "udp" }, - { "ncacn-ip-tcp", { NULL }, 3062, "tcp" }, - { "ncacn-ip-tcp", { NULL }, 3062, "udp" }, - { "ncadg-ip-udp", { NULL }, 3063, "tcp" }, - { "ncadg-ip-udp", { NULL }, 3063, "udp" }, - { "rprt", { NULL }, 3064, "tcp" }, - { "rprt", { NULL }, 3064, "udp" }, - { "slinterbase", { NULL }, 3065, "tcp" }, - { "slinterbase", { NULL }, 3065, "udp" }, - { "netattachsdmp", { NULL }, 3066, "tcp" }, - { "netattachsdmp", { NULL }, 3066, "udp" }, - { "fjhpjp", { NULL }, 3067, "tcp" }, - { "fjhpjp", { NULL }, 3067, "udp" }, - { "ls3bcast", { NULL }, 3068, "tcp" }, - { "ls3bcast", { NULL }, 3068, "udp" }, - { "ls3", { NULL }, 3069, "tcp" }, - { "ls3", { NULL }, 3069, "udp" }, - { "mgxswitch", { NULL }, 3070, "tcp" }, - { "mgxswitch", { NULL }, 3070, "udp" }, - { "csd-mgmt-port", { NULL }, 3071, "tcp" }, - { "csd-mgmt-port", { NULL }, 3071, "udp" }, - { "csd-monitor", { NULL }, 3072, "tcp" }, - { "csd-monitor", { NULL }, 3072, "udp" }, - { "vcrp", { NULL }, 3073, "tcp" }, - { "vcrp", { NULL }, 3073, "udp" }, - { "xbox", { NULL }, 3074, "tcp" }, - { "xbox", { NULL }, 3074, "udp" }, - { "orbix-locator", { NULL }, 3075, "tcp" }, - { "orbix-locator", { NULL }, 3075, "udp" }, - { "orbix-config", { NULL }, 3076, "tcp" }, - { "orbix-config", { NULL }, 3076, "udp" }, - { "orbix-loc-ssl", { NULL }, 3077, "tcp" }, - { "orbix-loc-ssl", { NULL }, 3077, "udp" }, - { "orbix-cfg-ssl", { NULL }, 3078, "tcp" }, - { "orbix-cfg-ssl", { NULL }, 3078, "udp" }, - { "lv-frontpanel", { NULL }, 3079, "tcp" }, - { "lv-frontpanel", { NULL }, 3079, "udp" }, - { "stm_pproc", { NULL }, 3080, "tcp" }, - { "stm_pproc", { NULL }, 3080, "udp" }, - { "tl1-lv", { NULL }, 3081, "tcp" }, - { "tl1-lv", { NULL }, 3081, "udp" }, - { "tl1-raw", { NULL }, 3082, "tcp" }, - { "tl1-raw", { NULL }, 3082, "udp" }, - { "tl1-telnet", { NULL }, 3083, "tcp" }, - { "tl1-telnet", { NULL }, 3083, "udp" }, - { "itm-mccs", { NULL }, 3084, "tcp" }, - { "itm-mccs", { NULL }, 3084, "udp" }, - { "pcihreq", { NULL }, 3085, "tcp" }, - { "pcihreq", { NULL }, 3085, "udp" }, - { "jdl-dbkitchen", { NULL }, 3086, "tcp" }, - { "jdl-dbkitchen", { NULL }, 3086, "udp" }, - { "asoki-sma", { NULL }, 3087, "tcp" }, - { "asoki-sma", { NULL }, 3087, "udp" }, - { "xdtp", { NULL }, 3088, "tcp" }, - { "xdtp", { NULL }, 3088, "udp" }, - { "ptk-alink", { NULL }, 3089, "tcp" }, - { "ptk-alink", { NULL }, 3089, "udp" }, - { "stss", { NULL }, 3090, "tcp" }, - { "stss", { NULL }, 3090, "udp" }, - { "1ci-smcs", { NULL }, 3091, "tcp" }, - { "1ci-smcs", { NULL }, 3091, "udp" }, - { "rapidmq-center", { NULL }, 3093, "tcp" }, - { "rapidmq-center", { NULL }, 3093, "udp" }, - { "rapidmq-reg", { NULL }, 3094, "tcp" }, - { "rapidmq-reg", { NULL }, 3094, "udp" }, - { "panasas", { NULL }, 3095, "tcp" }, - { "panasas", { NULL }, 3095, "udp" }, - { "ndl-aps", { NULL }, 3096, "tcp" }, - { "ndl-aps", { NULL }, 3096, "udp" }, - { "itu-bicc-stc", { NULL }, 3097, "sctp"}, - { "umm-port", { NULL }, 3098, "tcp" }, - { "umm-port", { NULL }, 3098, "udp" }, - { "chmd", { NULL }, 3099, "tcp" }, - { "chmd", { NULL }, 3099, "udp" }, - { "opcon-xps", { NULL }, 3100, "tcp" }, - { "opcon-xps", { NULL }, 3100, "udp" }, - { "hp-pxpib", { NULL }, 3101, "tcp" }, - { "hp-pxpib", { NULL }, 3101, "udp" }, - { "slslavemon", { NULL }, 3102, "tcp" }, - { "slslavemon", { NULL }, 3102, "udp" }, - { "autocuesmi", { NULL }, 3103, "tcp" }, - { "autocuesmi", { NULL }, 3103, "udp" }, - { "autocuelog", { NULL }, 3104, "tcp" }, - { "autocuetime", { NULL }, 3104, "udp" }, - { "cardbox", { NULL }, 3105, "tcp" }, - { "cardbox", { NULL }, 3105, "udp" }, - { "cardbox-http", { NULL }, 3106, "tcp" }, - { "cardbox-http", { NULL }, 3106, "udp" }, - { "business", { NULL }, 3107, "tcp" }, - { "business", { NULL }, 3107, "udp" }, - { "geolocate", { NULL }, 3108, "tcp" }, - { "geolocate", { NULL }, 3108, "udp" }, - { "personnel", { NULL }, 3109, "tcp" }, - { "personnel", { NULL }, 3109, "udp" }, - { "sim-control", { NULL }, 3110, "tcp" }, - { "sim-control", { NULL }, 3110, "udp" }, - { "wsynch", { NULL }, 3111, "tcp" }, - { "wsynch", { NULL }, 3111, "udp" }, - { "ksysguard", { NULL }, 3112, "tcp" }, - { "ksysguard", { NULL }, 3112, "udp" }, - { "cs-auth-svr", { NULL }, 3113, "tcp" }, - { "cs-auth-svr", { NULL }, 3113, "udp" }, - { "ccmad", { NULL }, 3114, "tcp" }, - { "ccmad", { NULL }, 3114, "udp" }, - { "mctet-master", { NULL }, 3115, "tcp" }, - { "mctet-master", { NULL }, 3115, "udp" }, - { "mctet-gateway", { NULL }, 3116, "tcp" }, - { "mctet-gateway", { NULL }, 3116, "udp" }, - { "mctet-jserv", { NULL }, 3117, "tcp" }, - { "mctet-jserv", { NULL }, 3117, "udp" }, - { "pkagent", { NULL }, 3118, "tcp" }, - { "pkagent", { NULL }, 3118, "udp" }, - { "d2000kernel", { NULL }, 3119, "tcp" }, - { "d2000kernel", { NULL }, 3119, "udp" }, - { "d2000webserver", { NULL }, 3120, "tcp" }, - { "d2000webserver", { NULL }, 3120, "udp" }, - { "vtr-emulator", { NULL }, 3122, "tcp" }, - { "vtr-emulator", { NULL }, 3122, "udp" }, - { "edix", { NULL }, 3123, "tcp" }, - { "edix", { NULL }, 3123, "udp" }, - { "beacon-port", { NULL }, 3124, "tcp" }, - { "beacon-port", { NULL }, 3124, "udp" }, - { "a13-an", { NULL }, 3125, "tcp" }, - { "a13-an", { NULL }, 3125, "udp" }, - { "ctx-bridge", { NULL }, 3127, "tcp" }, - { "ctx-bridge", { NULL }, 3127, "udp" }, - { "ndl-aas", { NULL }, 3128, "tcp" }, - { "ndl-aas", { NULL }, 3128, "udp" }, - { "netport-id", { NULL }, 3129, "tcp" }, - { "netport-id", { NULL }, 3129, "udp" }, - { "icpv2", { NULL }, 3130, "tcp" }, - { "icpv2", { NULL }, 3130, "udp" }, - { "netbookmark", { NULL }, 3131, "tcp" }, - { "netbookmark", { NULL }, 3131, "udp" }, - { "ms-rule-engine", { NULL }, 3132, "tcp" }, - { "ms-rule-engine", { NULL }, 3132, "udp" }, - { "prism-deploy", { NULL }, 3133, "tcp" }, - { "prism-deploy", { NULL }, 3133, "udp" }, - { "ecp", { NULL }, 3134, "tcp" }, - { "ecp", { NULL }, 3134, "udp" }, - { "peerbook-port", { NULL }, 3135, "tcp" }, - { "peerbook-port", { NULL }, 3135, "udp" }, - { "grubd", { NULL }, 3136, "tcp" }, - { "grubd", { NULL }, 3136, "udp" }, - { "rtnt-1", { NULL }, 3137, "tcp" }, - { "rtnt-1", { NULL }, 3137, "udp" }, - { "rtnt-2", { NULL }, 3138, "tcp" }, - { "rtnt-2", { NULL }, 3138, "udp" }, - { "incognitorv", { NULL }, 3139, "tcp" }, - { "incognitorv", { NULL }, 3139, "udp" }, - { "ariliamulti", { NULL }, 3140, "tcp" }, - { "ariliamulti", { NULL }, 3140, "udp" }, - { "vmodem", { NULL }, 3141, "tcp" }, - { "vmodem", { NULL }, 3141, "udp" }, - { "rdc-wh-eos", { NULL }, 3142, "tcp" }, - { "rdc-wh-eos", { NULL }, 3142, "udp" }, - { "seaview", { NULL }, 3143, "tcp" }, - { "seaview", { NULL }, 3143, "udp" }, - { "tarantella", { NULL }, 3144, "tcp" }, - { "tarantella", { NULL }, 3144, "udp" }, - { "csi-lfap", { NULL }, 3145, "tcp" }, - { "csi-lfap", { NULL }, 3145, "udp" }, - { "bears-02", { NULL }, 3146, "tcp" }, - { "bears-02", { NULL }, 3146, "udp" }, - { "rfio", { NULL }, 3147, "tcp" }, - { "rfio", { NULL }, 3147, "udp" }, - { "nm-game-admin", { NULL }, 3148, "tcp" }, - { "nm-game-admin", { NULL }, 3148, "udp" }, - { "nm-game-server", { NULL }, 3149, "tcp" }, - { "nm-game-server", { NULL }, 3149, "udp" }, - { "nm-asses-admin", { NULL }, 3150, "tcp" }, - { "nm-asses-admin", { NULL }, 3150, "udp" }, - { "nm-assessor", { NULL }, 3151, "tcp" }, - { "nm-assessor", { NULL }, 3151, "udp" }, - { "feitianrockey", { NULL }, 3152, "tcp" }, - { "feitianrockey", { NULL }, 3152, "udp" }, - { "s8-client-port", { NULL }, 3153, "tcp" }, - { "s8-client-port", { NULL }, 3153, "udp" }, - { "ccmrmi", { NULL }, 3154, "tcp" }, - { "ccmrmi", { NULL }, 3154, "udp" }, - { "jpegmpeg", { NULL }, 3155, "tcp" }, - { "jpegmpeg", { NULL }, 3155, "udp" }, - { "indura", { NULL }, 3156, "tcp" }, - { "indura", { NULL }, 3156, "udp" }, - { "e3consultants", { NULL }, 3157, "tcp" }, - { "e3consultants", { NULL }, 3157, "udp" }, - { "stvp", { NULL }, 3158, "tcp" }, - { "stvp", { NULL }, 3158, "udp" }, - { "navegaweb-port", { NULL }, 3159, "tcp" }, - { "navegaweb-port", { NULL }, 3159, "udp" }, - { "tip-app-server", { NULL }, 3160, "tcp" }, - { "tip-app-server", { NULL }, 3160, "udp" }, - { "doc1lm", { NULL }, 3161, "tcp" }, - { "doc1lm", { NULL }, 3161, "udp" }, - { "sflm", { NULL }, 3162, "tcp" }, - { "sflm", { NULL }, 3162, "udp" }, - { "res-sap", { NULL }, 3163, "tcp" }, - { "res-sap", { NULL }, 3163, "udp" }, - { "imprs", { NULL }, 3164, "tcp" }, - { "imprs", { NULL }, 3164, "udp" }, - { "newgenpay", { NULL }, 3165, "tcp" }, - { "newgenpay", { NULL }, 3165, "udp" }, - { "sossecollector", { NULL }, 3166, "tcp" }, - { "sossecollector", { NULL }, 3166, "udp" }, - { "nowcontact", { NULL }, 3167, "tcp" }, - { "nowcontact", { NULL }, 3167, "udp" }, - { "poweronnud", { NULL }, 3168, "tcp" }, - { "poweronnud", { NULL }, 3168, "udp" }, - { "serverview-as", { NULL }, 3169, "tcp" }, - { "serverview-as", { NULL }, 3169, "udp" }, - { "serverview-asn", { NULL }, 3170, "tcp" }, - { "serverview-asn", { NULL }, 3170, "udp" }, - { "serverview-gf", { NULL }, 3171, "tcp" }, - { "serverview-gf", { NULL }, 3171, "udp" }, - { "serverview-rm", { NULL }, 3172, "tcp" }, - { "serverview-rm", { NULL }, 3172, "udp" }, - { "serverview-icc", { NULL }, 3173, "tcp" }, - { "serverview-icc", { NULL }, 3173, "udp" }, - { "armi-server", { NULL }, 3174, "tcp" }, - { "armi-server", { NULL }, 3174, "udp" }, - { "t1-e1-over-ip", { NULL }, 3175, "tcp" }, - { "t1-e1-over-ip", { NULL }, 3175, "udp" }, - { "ars-master", { NULL }, 3176, "tcp" }, - { "ars-master", { NULL }, 3176, "udp" }, - { "phonex-port", { NULL }, 3177, "tcp" }, - { "phonex-port", { NULL }, 3177, "udp" }, - { "radclientport", { NULL }, 3178, "tcp" }, - { "radclientport", { NULL }, 3178, "udp" }, - { "h2gf-w-2m", { NULL }, 3179, "tcp" }, - { "h2gf-w-2m", { NULL }, 3179, "udp" }, - { "mc-brk-srv", { NULL }, 3180, "tcp" }, - { "mc-brk-srv", { NULL }, 3180, "udp" }, - { "bmcpatrolagent", { NULL }, 3181, "tcp" }, - { "bmcpatrolagent", { NULL }, 3181, "udp" }, - { "bmcpatrolrnvu", { NULL }, 3182, "tcp" }, - { "bmcpatrolrnvu", { NULL }, 3182, "udp" }, - { "cops-tls", { NULL }, 3183, "tcp" }, - { "cops-tls", { NULL }, 3183, "udp" }, - { "apogeex-port", { NULL }, 3184, "tcp" }, - { "apogeex-port", { NULL }, 3184, "udp" }, - { "smpppd", { NULL }, 3185, "tcp" }, - { "smpppd", { NULL }, 3185, "udp" }, - { "iiw-port", { NULL }, 3186, "tcp" }, - { "iiw-port", { NULL }, 3186, "udp" }, - { "odi-port", { NULL }, 3187, "tcp" }, - { "odi-port", { NULL }, 3187, "udp" }, - { "brcm-comm-port", { NULL }, 3188, "tcp" }, - { "brcm-comm-port", { NULL }, 3188, "udp" }, - { "pcle-infex", { NULL }, 3189, "tcp" }, - { "pcle-infex", { NULL }, 3189, "udp" }, - { "csvr-proxy", { NULL }, 3190, "tcp" }, - { "csvr-proxy", { NULL }, 3190, "udp" }, - { "csvr-sslproxy", { NULL }, 3191, "tcp" }, - { "csvr-sslproxy", { NULL }, 3191, "udp" }, - { "firemonrcc", { NULL }, 3192, "tcp" }, - { "firemonrcc", { NULL }, 3192, "udp" }, - { "spandataport", { NULL }, 3193, "tcp" }, - { "spandataport", { NULL }, 3193, "udp" }, - { "magbind", { NULL }, 3194, "tcp" }, - { "magbind", { NULL }, 3194, "udp" }, - { "ncu-1", { NULL }, 3195, "tcp" }, - { "ncu-1", { NULL }, 3195, "udp" }, - { "ncu-2", { NULL }, 3196, "tcp" }, - { "ncu-2", { NULL }, 3196, "udp" }, - { "embrace-dp-s", { NULL }, 3197, "tcp" }, - { "embrace-dp-s", { NULL }, 3197, "udp" }, - { "embrace-dp-c", { NULL }, 3198, "tcp" }, - { "embrace-dp-c", { NULL }, 3198, "udp" }, - { "dmod-workspace", { NULL }, 3199, "tcp" }, - { "dmod-workspace", { NULL }, 3199, "udp" }, - { "tick-port", { NULL }, 3200, "tcp" }, - { "tick-port", { NULL }, 3200, "udp" }, - { "cpq-tasksmart", { NULL }, 3201, "tcp" }, - { "cpq-tasksmart", { NULL }, 3201, "udp" }, - { "intraintra", { NULL }, 3202, "tcp" }, - { "intraintra", { NULL }, 3202, "udp" }, - { "netwatcher-mon", { NULL }, 3203, "tcp" }, - { "netwatcher-mon", { NULL }, 3203, "udp" }, - { "netwatcher-db", { NULL }, 3204, "tcp" }, - { "netwatcher-db", { NULL }, 3204, "udp" }, - { "isns", { NULL }, 3205, "tcp" }, - { "isns", { NULL }, 3205, "udp" }, - { "ironmail", { NULL }, 3206, "tcp" }, - { "ironmail", { NULL }, 3206, "udp" }, - { "vx-auth-port", { NULL }, 3207, "tcp" }, - { "vx-auth-port", { NULL }, 3207, "udp" }, - { "pfu-prcallback", { NULL }, 3208, "tcp" }, - { "pfu-prcallback", { NULL }, 3208, "udp" }, - { "netwkpathengine", { NULL }, 3209, "tcp" }, - { "netwkpathengine", { NULL }, 3209, "udp" }, - { "flamenco-proxy", { NULL }, 3210, "tcp" }, - { "flamenco-proxy", { NULL }, 3210, "udp" }, - { "avsecuremgmt", { NULL }, 3211, "tcp" }, - { "avsecuremgmt", { NULL }, 3211, "udp" }, - { "surveyinst", { NULL }, 3212, "tcp" }, - { "surveyinst", { NULL }, 3212, "udp" }, - { "neon24x7", { NULL }, 3213, "tcp" }, - { "neon24x7", { NULL }, 3213, "udp" }, - { "jmq-daemon-1", { NULL }, 3214, "tcp" }, - { "jmq-daemon-1", { NULL }, 3214, "udp" }, - { "jmq-daemon-2", { NULL }, 3215, "tcp" }, - { "jmq-daemon-2", { NULL }, 3215, "udp" }, - { "ferrari-foam", { NULL }, 3216, "tcp" }, - { "ferrari-foam", { NULL }, 3216, "udp" }, - { "unite", { NULL }, 3217, "tcp" }, - { "unite", { NULL }, 3217, "udp" }, - { "smartpackets", { NULL }, 3218, "tcp" }, - { "smartpackets", { NULL }, 3218, "udp" }, - { "wms-messenger", { NULL }, 3219, "tcp" }, - { "wms-messenger", { NULL }, 3219, "udp" }, - { "xnm-ssl", { NULL }, 3220, "tcp" }, - { "xnm-ssl", { NULL }, 3220, "udp" }, - { "xnm-clear-text", { NULL }, 3221, "tcp" }, - { "xnm-clear-text", { NULL }, 3221, "udp" }, - { "glbp", { NULL }, 3222, "tcp" }, - { "glbp", { NULL }, 3222, "udp" }, - { "digivote", { NULL }, 3223, "tcp" }, - { "digivote", { NULL }, 3223, "udp" }, - { "aes-discovery", { NULL }, 3224, "tcp" }, - { "aes-discovery", { NULL }, 3224, "udp" }, - { "fcip-port", { NULL }, 3225, "tcp" }, - { "fcip-port", { NULL }, 3225, "udp" }, - { "isi-irp", { NULL }, 3226, "tcp" }, - { "isi-irp", { NULL }, 3226, "udp" }, - { "dwnmshttp", { NULL }, 3227, "tcp" }, - { "dwnmshttp", { NULL }, 3227, "udp" }, - { "dwmsgserver", { NULL }, 3228, "tcp" }, - { "dwmsgserver", { NULL }, 3228, "udp" }, - { "global-cd-port", { NULL }, 3229, "tcp" }, - { "global-cd-port", { NULL }, 3229, "udp" }, - { "sftdst-port", { NULL }, 3230, "tcp" }, - { "sftdst-port", { NULL }, 3230, "udp" }, - { "vidigo", { NULL }, 3231, "tcp" }, - { "vidigo", { NULL }, 3231, "udp" }, - { "mdtp", { NULL }, 3232, "tcp" }, - { "mdtp", { NULL }, 3232, "udp" }, - { "whisker", { NULL }, 3233, "tcp" }, - { "whisker", { NULL }, 3233, "udp" }, - { "alchemy", { NULL }, 3234, "tcp" }, - { "alchemy", { NULL }, 3234, "udp" }, - { "mdap-port", { NULL }, 3235, "tcp" }, - { "mdap-port", { NULL }, 3235, "udp" }, - { "apparenet-ts", { NULL }, 3236, "tcp" }, - { "apparenet-ts", { NULL }, 3236, "udp" }, - { "apparenet-tps", { NULL }, 3237, "tcp" }, - { "apparenet-tps", { NULL }, 3237, "udp" }, - { "apparenet-as", { NULL }, 3238, "tcp" }, - { "apparenet-as", { NULL }, 3238, "udp" }, - { "apparenet-ui", { NULL }, 3239, "tcp" }, - { "apparenet-ui", { NULL }, 3239, "udp" }, - { "triomotion", { NULL }, 3240, "tcp" }, - { "triomotion", { NULL }, 3240, "udp" }, - { "sysorb", { NULL }, 3241, "tcp" }, - { "sysorb", { NULL }, 3241, "udp" }, - { "sdp-id-port", { NULL }, 3242, "tcp" }, - { "sdp-id-port", { NULL }, 3242, "udp" }, - { "timelot", { NULL }, 3243, "tcp" }, - { "timelot", { NULL }, 3243, "udp" }, - { "onesaf", { NULL }, 3244, "tcp" }, - { "onesaf", { NULL }, 3244, "udp" }, - { "vieo-fe", { NULL }, 3245, "tcp" }, - { "vieo-fe", { NULL }, 3245, "udp" }, - { "dvt-system", { NULL }, 3246, "tcp" }, - { "dvt-system", { NULL }, 3246, "udp" }, - { "dvt-data", { NULL }, 3247, "tcp" }, - { "dvt-data", { NULL }, 3247, "udp" }, - { "procos-lm", { NULL }, 3248, "tcp" }, - { "procos-lm", { NULL }, 3248, "udp" }, - { "ssp", { NULL }, 3249, "tcp" }, - { "ssp", { NULL }, 3249, "udp" }, - { "hicp", { NULL }, 3250, "tcp" }, - { "hicp", { NULL }, 3250, "udp" }, - { "sysscanner", { NULL }, 3251, "tcp" }, - { "sysscanner", { NULL }, 3251, "udp" }, - { "dhe", { NULL }, 3252, "tcp" }, - { "dhe", { NULL }, 3252, "udp" }, - { "pda-data", { NULL }, 3253, "tcp" }, - { "pda-data", { NULL }, 3253, "udp" }, - { "pda-sys", { NULL }, 3254, "tcp" }, - { "pda-sys", { NULL }, 3254, "udp" }, - { "semaphore", { NULL }, 3255, "tcp" }, - { "semaphore", { NULL }, 3255, "udp" }, - { "cpqrpm-agent", { NULL }, 3256, "tcp" }, - { "cpqrpm-agent", { NULL }, 3256, "udp" }, - { "cpqrpm-server", { NULL }, 3257, "tcp" }, - { "cpqrpm-server", { NULL }, 3257, "udp" }, - { "ivecon-port", { NULL }, 3258, "tcp" }, - { "ivecon-port", { NULL }, 3258, "udp" }, - { "epncdp2", { NULL }, 3259, "tcp" }, - { "epncdp2", { NULL }, 3259, "udp" }, - { "iscsi-target", { NULL }, 3260, "tcp" }, - { "iscsi-target", { NULL }, 3260, "udp" }, - { "winshadow", { NULL }, 3261, "tcp" }, - { "winshadow", { NULL }, 3261, "udp" }, - { "necp", { NULL }, 3262, "tcp" }, - { "necp", { NULL }, 3262, "udp" }, - { "ecolor-imager", { NULL }, 3263, "tcp" }, - { "ecolor-imager", { NULL }, 3263, "udp" }, - { "ccmail", { NULL }, 3264, "tcp" }, - { "ccmail", { NULL }, 3264, "udp" }, - { "altav-tunnel", { NULL }, 3265, "tcp" }, - { "altav-tunnel", { NULL }, 3265, "udp" }, - { "ns-cfg-server", { NULL }, 3266, "tcp" }, - { "ns-cfg-server", { NULL }, 3266, "udp" }, - { "ibm-dial-out", { NULL }, 3267, "tcp" }, - { "ibm-dial-out", { NULL }, 3267, "udp" }, - { "msft-gc", { NULL }, 3268, "tcp" }, - { "msft-gc", { NULL }, 3268, "udp" }, - { "msft-gc-ssl", { NULL }, 3269, "tcp" }, - { "msft-gc-ssl", { NULL }, 3269, "udp" }, - { "verismart", { NULL }, 3270, "tcp" }, - { "verismart", { NULL }, 3270, "udp" }, - { "csoft-prev", { NULL }, 3271, "tcp" }, - { "csoft-prev", { NULL }, 3271, "udp" }, - { "user-manager", { NULL }, 3272, "tcp" }, - { "user-manager", { NULL }, 3272, "udp" }, - { "sxmp", { NULL }, 3273, "tcp" }, - { "sxmp", { NULL }, 3273, "udp" }, - { "ordinox-server", { NULL }, 3274, "tcp" }, - { "ordinox-server", { NULL }, 3274, "udp" }, - { "samd", { NULL }, 3275, "tcp" }, - { "samd", { NULL }, 3275, "udp" }, - { "maxim-asics", { NULL }, 3276, "tcp" }, - { "maxim-asics", { NULL }, 3276, "udp" }, - { "awg-proxy", { NULL }, 3277, "tcp" }, - { "awg-proxy", { NULL }, 3277, "udp" }, - { "lkcmserver", { NULL }, 3278, "tcp" }, - { "lkcmserver", { NULL }, 3278, "udp" }, - { "admind", { NULL }, 3279, "tcp" }, - { "admind", { NULL }, 3279, "udp" }, - { "vs-server", { NULL }, 3280, "tcp" }, - { "vs-server", { NULL }, 3280, "udp" }, - { "sysopt", { NULL }, 3281, "tcp" }, - { "sysopt", { NULL }, 3281, "udp" }, - { "datusorb", { NULL }, 3282, "tcp" }, - { "datusorb", { NULL }, 3282, "udp" }, - { "net-assistant", { NULL }, 3283, "tcp" }, - { "net-assistant", { NULL }, 3283, "udp" }, - { "4talk", { NULL }, 3284, "tcp" }, - { "4talk", { NULL }, 3284, "udp" }, - { "plato", { NULL }, 3285, "tcp" }, - { "plato", { NULL }, 3285, "udp" }, - { "e-net", { NULL }, 3286, "tcp" }, - { "e-net", { NULL }, 3286, "udp" }, - { "directvdata", { NULL }, 3287, "tcp" }, - { "directvdata", { NULL }, 3287, "udp" }, - { "cops", { NULL }, 3288, "tcp" }, - { "cops", { NULL }, 3288, "udp" }, - { "enpc", { NULL }, 3289, "tcp" }, - { "enpc", { NULL }, 3289, "udp" }, - { "caps-lm", { NULL }, 3290, "tcp" }, - { "caps-lm", { NULL }, 3290, "udp" }, - { "sah-lm", { NULL }, 3291, "tcp" }, - { "sah-lm", { NULL }, 3291, "udp" }, - { "cart-o-rama", { NULL }, 3292, "tcp" }, - { "cart-o-rama", { NULL }, 3292, "udp" }, - { "fg-fps", { NULL }, 3293, "tcp" }, - { "fg-fps", { NULL }, 3293, "udp" }, - { "fg-gip", { NULL }, 3294, "tcp" }, - { "fg-gip", { NULL }, 3294, "udp" }, - { "dyniplookup", { NULL }, 3295, "tcp" }, - { "dyniplookup", { NULL }, 3295, "udp" }, - { "rib-slm", { NULL }, 3296, "tcp" }, - { "rib-slm", { NULL }, 3296, "udp" }, - { "cytel-lm", { NULL }, 3297, "tcp" }, - { "cytel-lm", { NULL }, 3297, "udp" }, - { "deskview", { NULL }, 3298, "tcp" }, - { "deskview", { NULL }, 3298, "udp" }, - { "pdrncs", { NULL }, 3299, "tcp" }, - { "pdrncs", { NULL }, 3299, "udp" }, - { "mcs-fastmail", { NULL }, 3302, "tcp" }, - { "mcs-fastmail", { NULL }, 3302, "udp" }, - { "opsession-clnt", { NULL }, 3303, "tcp" }, - { "opsession-clnt", { NULL }, 3303, "udp" }, - { "opsession-srvr", { NULL }, 3304, "tcp" }, - { "opsession-srvr", { NULL }, 3304, "udp" }, - { "odette-ftp", { NULL }, 3305, "tcp" }, - { "odette-ftp", { NULL }, 3305, "udp" }, - { "mysql", { NULL }, 3306, "tcp" }, - { "mysql", { NULL }, 3306, "udp" }, - { "opsession-prxy", { NULL }, 3307, "tcp" }, - { "opsession-prxy", { NULL }, 3307, "udp" }, - { "tns-server", { NULL }, 3308, "tcp" }, - { "tns-server", { NULL }, 3308, "udp" }, - { "tns-adv", { NULL }, 3309, "tcp" }, - { "tns-adv", { NULL }, 3309, "udp" }, - { "dyna-access", { NULL }, 3310, "tcp" }, - { "dyna-access", { NULL }, 3310, "udp" }, - { "mcns-tel-ret", { NULL }, 3311, "tcp" }, - { "mcns-tel-ret", { NULL }, 3311, "udp" }, - { "appman-server", { NULL }, 3312, "tcp" }, - { "appman-server", { NULL }, 3312, "udp" }, - { "uorb", { NULL }, 3313, "tcp" }, - { "uorb", { NULL }, 3313, "udp" }, - { "uohost", { NULL }, 3314, "tcp" }, - { "uohost", { NULL }, 3314, "udp" }, - { "cdid", { NULL }, 3315, "tcp" }, - { "cdid", { NULL }, 3315, "udp" }, - { "aicc-cmi", { NULL }, 3316, "tcp" }, - { "aicc-cmi", { NULL }, 3316, "udp" }, - { "vsaiport", { NULL }, 3317, "tcp" }, - { "vsaiport", { NULL }, 3317, "udp" }, - { "ssrip", { NULL }, 3318, "tcp" }, - { "ssrip", { NULL }, 3318, "udp" }, - { "sdt-lmd", { NULL }, 3319, "tcp" }, - { "sdt-lmd", { NULL }, 3319, "udp" }, - { "officelink2000", { NULL }, 3320, "tcp" }, - { "officelink2000", { NULL }, 3320, "udp" }, - { "vnsstr", { NULL }, 3321, "tcp" }, - { "vnsstr", { NULL }, 3321, "udp" }, - { "sftu", { NULL }, 3326, "tcp" }, - { "sftu", { NULL }, 3326, "udp" }, - { "bbars", { NULL }, 3327, "tcp" }, - { "bbars", { NULL }, 3327, "udp" }, - { "egptlm", { NULL }, 3328, "tcp" }, - { "egptlm", { NULL }, 3328, "udp" }, - { "hp-device-disc", { NULL }, 3329, "tcp" }, - { "hp-device-disc", { NULL }, 3329, "udp" }, - { "mcs-calypsoicf", { NULL }, 3330, "tcp" }, - { "mcs-calypsoicf", { NULL }, 3330, "udp" }, - { "mcs-messaging", { NULL }, 3331, "tcp" }, - { "mcs-messaging", { NULL }, 3331, "udp" }, - { "mcs-mailsvr", { NULL }, 3332, "tcp" }, - { "mcs-mailsvr", { NULL }, 3332, "udp" }, - { "dec-notes", { NULL }, 3333, "tcp" }, - { "dec-notes", { NULL }, 3333, "udp" }, - { "directv-web", { NULL }, 3334, "tcp" }, - { "directv-web", { NULL }, 3334, "udp" }, - { "directv-soft", { NULL }, 3335, "tcp" }, - { "directv-soft", { NULL }, 3335, "udp" }, - { "directv-tick", { NULL }, 3336, "tcp" }, - { "directv-tick", { NULL }, 3336, "udp" }, - { "directv-catlg", { NULL }, 3337, "tcp" }, - { "directv-catlg", { NULL }, 3337, "udp" }, - { "anet-b", { NULL }, 3338, "tcp" }, - { "anet-b", { NULL }, 3338, "udp" }, - { "anet-l", { NULL }, 3339, "tcp" }, - { "anet-l", { NULL }, 3339, "udp" }, - { "anet-m", { NULL }, 3340, "tcp" }, - { "anet-m", { NULL }, 3340, "udp" }, - { "anet-h", { NULL }, 3341, "tcp" }, - { "anet-h", { NULL }, 3341, "udp" }, - { "webtie", { NULL }, 3342, "tcp" }, - { "webtie", { NULL }, 3342, "udp" }, - { "ms-cluster-net", { NULL }, 3343, "tcp" }, - { "ms-cluster-net", { NULL }, 3343, "udp" }, - { "bnt-manager", { NULL }, 3344, "tcp" }, - { "bnt-manager", { NULL }, 3344, "udp" }, - { "influence", { NULL }, 3345, "tcp" }, - { "influence", { NULL }, 3345, "udp" }, - { "trnsprntproxy", { NULL }, 3346, "tcp" }, - { "trnsprntproxy", { NULL }, 3346, "udp" }, - { "phoenix-rpc", { NULL }, 3347, "tcp" }, - { "phoenix-rpc", { NULL }, 3347, "udp" }, - { "pangolin-laser", { NULL }, 3348, "tcp" }, - { "pangolin-laser", { NULL }, 3348, "udp" }, - { "chevinservices", { NULL }, 3349, "tcp" }, - { "chevinservices", { NULL }, 3349, "udp" }, - { "findviatv", { NULL }, 3350, "tcp" }, - { "findviatv", { NULL }, 3350, "udp" }, - { "btrieve", { NULL }, 3351, "tcp" }, - { "btrieve", { NULL }, 3351, "udp" }, - { "ssql", { NULL }, 3352, "tcp" }, - { "ssql", { NULL }, 3352, "udp" }, - { "fatpipe", { NULL }, 3353, "tcp" }, - { "fatpipe", { NULL }, 3353, "udp" }, - { "suitjd", { NULL }, 3354, "tcp" }, - { "suitjd", { NULL }, 3354, "udp" }, - { "ordinox-dbase", { NULL }, 3355, "tcp" }, - { "ordinox-dbase", { NULL }, 3355, "udp" }, - { "upnotifyps", { NULL }, 3356, "tcp" }, - { "upnotifyps", { NULL }, 3356, "udp" }, - { "adtech-test", { NULL }, 3357, "tcp" }, - { "adtech-test", { NULL }, 3357, "udp" }, - { "mpsysrmsvr", { NULL }, 3358, "tcp" }, - { "mpsysrmsvr", { NULL }, 3358, "udp" }, - { "wg-netforce", { NULL }, 3359, "tcp" }, - { "wg-netforce", { NULL }, 3359, "udp" }, - { "kv-server", { NULL }, 3360, "tcp" }, - { "kv-server", { NULL }, 3360, "udp" }, - { "kv-agent", { NULL }, 3361, "tcp" }, - { "kv-agent", { NULL }, 3361, "udp" }, - { "dj-ilm", { NULL }, 3362, "tcp" }, - { "dj-ilm", { NULL }, 3362, "udp" }, - { "nati-vi-server", { NULL }, 3363, "tcp" }, - { "nati-vi-server", { NULL }, 3363, "udp" }, - { "creativeserver", { NULL }, 3364, "tcp" }, - { "creativeserver", { NULL }, 3364, "udp" }, - { "contentserver", { NULL }, 3365, "tcp" }, - { "contentserver", { NULL }, 3365, "udp" }, - { "creativepartnr", { NULL }, 3366, "tcp" }, - { "creativepartnr", { NULL }, 3366, "udp" }, - { "tip2", { NULL }, 3372, "tcp" }, - { "tip2", { NULL }, 3372, "udp" }, - { "lavenir-lm", { NULL }, 3373, "tcp" }, - { "lavenir-lm", { NULL }, 3373, "udp" }, - { "cluster-disc", { NULL }, 3374, "tcp" }, - { "cluster-disc", { NULL }, 3374, "udp" }, - { "vsnm-agent", { NULL }, 3375, "tcp" }, - { "vsnm-agent", { NULL }, 3375, "udp" }, - { "cdbroker", { NULL }, 3376, "tcp" }, - { "cdbroker", { NULL }, 3376, "udp" }, - { "cogsys-lm", { NULL }, 3377, "tcp" }, - { "cogsys-lm", { NULL }, 3377, "udp" }, - { "wsicopy", { NULL }, 3378, "tcp" }, - { "wsicopy", { NULL }, 3378, "udp" }, - { "socorfs", { NULL }, 3379, "tcp" }, - { "socorfs", { NULL }, 3379, "udp" }, - { "sns-channels", { NULL }, 3380, "tcp" }, - { "sns-channels", { NULL }, 3380, "udp" }, - { "geneous", { NULL }, 3381, "tcp" }, - { "geneous", { NULL }, 3381, "udp" }, - { "fujitsu-neat", { NULL }, 3382, "tcp" }, - { "fujitsu-neat", { NULL }, 3382, "udp" }, - { "esp-lm", { NULL }, 3383, "tcp" }, - { "esp-lm", { NULL }, 3383, "udp" }, - { "hp-clic", { NULL }, 3384, "tcp" }, - { "hp-clic", { NULL }, 3384, "udp" }, - { "qnxnetman", { NULL }, 3385, "tcp" }, - { "qnxnetman", { NULL }, 3385, "udp" }, - { "gprs-data", { NULL }, 3386, "tcp" }, - { "gprs-sig", { NULL }, 3386, "udp" }, - { "backroomnet", { NULL }, 3387, "tcp" }, - { "backroomnet", { NULL }, 3387, "udp" }, - { "cbserver", { NULL }, 3388, "tcp" }, - { "cbserver", { NULL }, 3388, "udp" }, - { "ms-wbt-server", { NULL }, 3389, "tcp" }, - { "ms-wbt-server", { NULL }, 3389, "udp" }, - { "dsc", { NULL }, 3390, "tcp" }, - { "dsc", { NULL }, 3390, "udp" }, - { "savant", { NULL }, 3391, "tcp" }, - { "savant", { NULL }, 3391, "udp" }, - { "efi-lm", { NULL }, 3392, "tcp" }, - { "efi-lm", { NULL }, 3392, "udp" }, - { "d2k-tapestry1", { NULL }, 3393, "tcp" }, - { "d2k-tapestry1", { NULL }, 3393, "udp" }, - { "d2k-tapestry2", { NULL }, 3394, "tcp" }, - { "d2k-tapestry2", { NULL }, 3394, "udp" }, - { "dyna-lm", { NULL }, 3395, "tcp" }, - { "dyna-lm", { NULL }, 3395, "udp" }, - { "printer_agent", { NULL }, 3396, "tcp" }, - { "printer_agent", { NULL }, 3396, "udp" }, - { "cloanto-lm", { NULL }, 3397, "tcp" }, - { "cloanto-lm", { NULL }, 3397, "udp" }, - { "mercantile", { NULL }, 3398, "tcp" }, - { "mercantile", { NULL }, 3398, "udp" }, - { "csms", { NULL }, 3399, "tcp" }, - { "csms", { NULL }, 3399, "udp" }, - { "csms2", { NULL }, 3400, "tcp" }, - { "csms2", { NULL }, 3400, "udp" }, - { "filecast", { NULL }, 3401, "tcp" }, - { "filecast", { NULL }, 3401, "udp" }, - { "fxaengine-net", { NULL }, 3402, "tcp" }, - { "fxaengine-net", { NULL }, 3402, "udp" }, - { "nokia-ann-ch1", { NULL }, 3405, "tcp" }, - { "nokia-ann-ch1", { NULL }, 3405, "udp" }, - { "nokia-ann-ch2", { NULL }, 3406, "tcp" }, - { "nokia-ann-ch2", { NULL }, 3406, "udp" }, - { "ldap-admin", { NULL }, 3407, "tcp" }, - { "ldap-admin", { NULL }, 3407, "udp" }, - { "BESApi", { NULL }, 3408, "tcp" }, - { "BESApi", { NULL }, 3408, "udp" }, - { "networklens", { NULL }, 3409, "tcp" }, - { "networklens", { NULL }, 3409, "udp" }, - { "networklenss", { NULL }, 3410, "tcp" }, - { "networklenss", { NULL }, 3410, "udp" }, - { "biolink-auth", { NULL }, 3411, "tcp" }, - { "biolink-auth", { NULL }, 3411, "udp" }, - { "xmlblaster", { NULL }, 3412, "tcp" }, - { "xmlblaster", { NULL }, 3412, "udp" }, - { "svnet", { NULL }, 3413, "tcp" }, - { "svnet", { NULL }, 3413, "udp" }, - { "wip-port", { NULL }, 3414, "tcp" }, - { "wip-port", { NULL }, 3414, "udp" }, - { "bcinameservice", { NULL }, 3415, "tcp" }, - { "bcinameservice", { NULL }, 3415, "udp" }, - { "commandport", { NULL }, 3416, "tcp" }, - { "commandport", { NULL }, 3416, "udp" }, - { "csvr", { NULL }, 3417, "tcp" }, - { "csvr", { NULL }, 3417, "udp" }, - { "rnmap", { NULL }, 3418, "tcp" }, - { "rnmap", { NULL }, 3418, "udp" }, - { "softaudit", { NULL }, 3419, "tcp" }, - { "softaudit", { NULL }, 3419, "udp" }, - { "ifcp-port", { NULL }, 3420, "tcp" }, - { "ifcp-port", { NULL }, 3420, "udp" }, - { "bmap", { NULL }, 3421, "tcp" }, - { "bmap", { NULL }, 3421, "udp" }, - { "rusb-sys-port", { NULL }, 3422, "tcp" }, - { "rusb-sys-port", { NULL }, 3422, "udp" }, - { "xtrm", { NULL }, 3423, "tcp" }, - { "xtrm", { NULL }, 3423, "udp" }, - { "xtrms", { NULL }, 3424, "tcp" }, - { "xtrms", { NULL }, 3424, "udp" }, - { "agps-port", { NULL }, 3425, "tcp" }, - { "agps-port", { NULL }, 3425, "udp" }, - { "arkivio", { NULL }, 3426, "tcp" }, - { "arkivio", { NULL }, 3426, "udp" }, - { "websphere-snmp", { NULL }, 3427, "tcp" }, - { "websphere-snmp", { NULL }, 3427, "udp" }, - { "twcss", { NULL }, 3428, "tcp" }, - { "twcss", { NULL }, 3428, "udp" }, - { "gcsp", { NULL }, 3429, "tcp" }, - { "gcsp", { NULL }, 3429, "udp" }, - { "ssdispatch", { NULL }, 3430, "tcp" }, - { "ssdispatch", { NULL }, 3430, "udp" }, - { "ndl-als", { NULL }, 3431, "tcp" }, - { "ndl-als", { NULL }, 3431, "udp" }, - { "osdcp", { NULL }, 3432, "tcp" }, - { "osdcp", { NULL }, 3432, "udp" }, - { "alta-smp", { NULL }, 3433, "tcp" }, - { "alta-smp", { NULL }, 3433, "udp" }, - { "opencm", { NULL }, 3434, "tcp" }, - { "opencm", { NULL }, 3434, "udp" }, - { "pacom", { NULL }, 3435, "tcp" }, - { "pacom", { NULL }, 3435, "udp" }, - { "gc-config", { NULL }, 3436, "tcp" }, - { "gc-config", { NULL }, 3436, "udp" }, - { "autocueds", { NULL }, 3437, "tcp" }, - { "autocueds", { NULL }, 3437, "udp" }, - { "spiral-admin", { NULL }, 3438, "tcp" }, - { "spiral-admin", { NULL }, 3438, "udp" }, - { "hri-port", { NULL }, 3439, "tcp" }, - { "hri-port", { NULL }, 3439, "udp" }, - { "ans-console", { NULL }, 3440, "tcp" }, - { "ans-console", { NULL }, 3440, "udp" }, - { "connect-client", { NULL }, 3441, "tcp" }, - { "connect-client", { NULL }, 3441, "udp" }, - { "connect-server", { NULL }, 3442, "tcp" }, - { "connect-server", { NULL }, 3442, "udp" }, - { "ov-nnm-websrv", { NULL }, 3443, "tcp" }, - { "ov-nnm-websrv", { NULL }, 3443, "udp" }, - { "denali-server", { NULL }, 3444, "tcp" }, - { "denali-server", { NULL }, 3444, "udp" }, - { "monp", { NULL }, 3445, "tcp" }, - { "monp", { NULL }, 3445, "udp" }, - { "3comfaxrpc", { NULL }, 3446, "tcp" }, - { "3comfaxrpc", { NULL }, 3446, "udp" }, - { "directnet", { NULL }, 3447, "tcp" }, - { "directnet", { NULL }, 3447, "udp" }, - { "dnc-port", { NULL }, 3448, "tcp" }, - { "dnc-port", { NULL }, 3448, "udp" }, - { "hotu-chat", { NULL }, 3449, "tcp" }, - { "hotu-chat", { NULL }, 3449, "udp" }, - { "castorproxy", { NULL }, 3450, "tcp" }, - { "castorproxy", { NULL }, 3450, "udp" }, - { "asam", { NULL }, 3451, "tcp" }, - { "asam", { NULL }, 3451, "udp" }, - { "sabp-signal", { NULL }, 3452, "tcp" }, - { "sabp-signal", { NULL }, 3452, "udp" }, - { "pscupd", { NULL }, 3453, "tcp" }, - { "pscupd", { NULL }, 3453, "udp" }, - { "mira", { NULL }, 3454, "tcp" }, - { "prsvp", { NULL }, 3455, "tcp" }, - { "prsvp", { NULL }, 3455, "udp" }, - { "vat", { NULL }, 3456, "tcp" }, - { "vat", { NULL }, 3456, "udp" }, - { "vat-control", { NULL }, 3457, "tcp" }, - { "vat-control", { NULL }, 3457, "udp" }, - { "d3winosfi", { NULL }, 3458, "tcp" }, - { "d3winosfi", { NULL }, 3458, "udp" }, - { "integral", { NULL }, 3459, "tcp" }, - { "integral", { NULL }, 3459, "udp" }, - { "edm-manager", { NULL }, 3460, "tcp" }, - { "edm-manager", { NULL }, 3460, "udp" }, - { "edm-stager", { NULL }, 3461, "tcp" }, - { "edm-stager", { NULL }, 3461, "udp" }, - { "edm-std-notify", { NULL }, 3462, "tcp" }, - { "edm-std-notify", { NULL }, 3462, "udp" }, - { "edm-adm-notify", { NULL }, 3463, "tcp" }, - { "edm-adm-notify", { NULL }, 3463, "udp" }, - { "edm-mgr-sync", { NULL }, 3464, "tcp" }, - { "edm-mgr-sync", { NULL }, 3464, "udp" }, - { "edm-mgr-cntrl", { NULL }, 3465, "tcp" }, - { "edm-mgr-cntrl", { NULL }, 3465, "udp" }, - { "workflow", { NULL }, 3466, "tcp" }, - { "workflow", { NULL }, 3466, "udp" }, - { "rcst", { NULL }, 3467, "tcp" }, - { "rcst", { NULL }, 3467, "udp" }, - { "ttcmremotectrl", { NULL }, 3468, "tcp" }, - { "ttcmremotectrl", { NULL }, 3468, "udp" }, - { "pluribus", { NULL }, 3469, "tcp" }, - { "pluribus", { NULL }, 3469, "udp" }, - { "jt400", { NULL }, 3470, "tcp" }, - { "jt400", { NULL }, 3470, "udp" }, - { "jt400-ssl", { NULL }, 3471, "tcp" }, - { "jt400-ssl", { NULL }, 3471, "udp" }, - { "jaugsremotec-1", { NULL }, 3472, "tcp" }, - { "jaugsremotec-1", { NULL }, 3472, "udp" }, - { "jaugsremotec-2", { NULL }, 3473, "tcp" }, - { "jaugsremotec-2", { NULL }, 3473, "udp" }, - { "ttntspauto", { NULL }, 3474, "tcp" }, - { "ttntspauto", { NULL }, 3474, "udp" }, - { "genisar-port", { NULL }, 3475, "tcp" }, - { "genisar-port", { NULL }, 3475, "udp" }, - { "nppmp", { NULL }, 3476, "tcp" }, - { "nppmp", { NULL }, 3476, "udp" }, - { "ecomm", { NULL }, 3477, "tcp" }, - { "ecomm", { NULL }, 3477, "udp" }, - { "stun", { NULL }, 3478, "tcp" }, - { "stun", { NULL }, 3478, "udp" }, - { "turn", { NULL }, 3478, "tcp" }, - { "turn", { NULL }, 3478, "udp" }, - { "stun-behavior", { NULL }, 3478, "tcp" }, - { "stun-behavior", { NULL }, 3478, "udp" }, - { "twrpc", { NULL }, 3479, "tcp" }, - { "twrpc", { NULL }, 3479, "udp" }, - { "plethora", { NULL }, 3480, "tcp" }, - { "plethora", { NULL }, 3480, "udp" }, - { "cleanerliverc", { NULL }, 3481, "tcp" }, - { "cleanerliverc", { NULL }, 3481, "udp" }, - { "vulture", { NULL }, 3482, "tcp" }, - { "vulture", { NULL }, 3482, "udp" }, - { "slim-devices", { NULL }, 3483, "tcp" }, - { "slim-devices", { NULL }, 3483, "udp" }, - { "gbs-stp", { NULL }, 3484, "tcp" }, - { "gbs-stp", { NULL }, 3484, "udp" }, - { "celatalk", { NULL }, 3485, "tcp" }, - { "celatalk", { NULL }, 3485, "udp" }, - { "ifsf-hb-port", { NULL }, 3486, "tcp" }, - { "ifsf-hb-port", { NULL }, 3486, "udp" }, - { "ltctcp", { NULL }, 3487, "tcp" }, - { "ltcudp", { NULL }, 3487, "udp" }, - { "fs-rh-srv", { NULL }, 3488, "tcp" }, - { "fs-rh-srv", { NULL }, 3488, "udp" }, - { "dtp-dia", { NULL }, 3489, "tcp" }, - { "dtp-dia", { NULL }, 3489, "udp" }, - { "colubris", { NULL }, 3490, "tcp" }, - { "colubris", { NULL }, 3490, "udp" }, - { "swr-port", { NULL }, 3491, "tcp" }, - { "swr-port", { NULL }, 3491, "udp" }, - { "tvdumtray-port", { NULL }, 3492, "tcp" }, - { "tvdumtray-port", { NULL }, 3492, "udp" }, - { "nut", { NULL }, 3493, "tcp" }, - { "nut", { NULL }, 3493, "udp" }, - { "ibm3494", { NULL }, 3494, "tcp" }, - { "ibm3494", { NULL }, 3494, "udp" }, - { "seclayer-tcp", { NULL }, 3495, "tcp" }, - { "seclayer-tcp", { NULL }, 3495, "udp" }, - { "seclayer-tls", { NULL }, 3496, "tcp" }, - { "seclayer-tls", { NULL }, 3496, "udp" }, - { "ipether232port", { NULL }, 3497, "tcp" }, - { "ipether232port", { NULL }, 3497, "udp" }, - { "dashpas-port", { NULL }, 3498, "tcp" }, - { "dashpas-port", { NULL }, 3498, "udp" }, - { "sccip-media", { NULL }, 3499, "tcp" }, - { "sccip-media", { NULL }, 3499, "udp" }, - { "rtmp-port", { NULL }, 3500, "tcp" }, - { "rtmp-port", { NULL }, 3500, "udp" }, - { "isoft-p2p", { NULL }, 3501, "tcp" }, - { "isoft-p2p", { NULL }, 3501, "udp" }, - { "avinstalldisc", { NULL }, 3502, "tcp" }, - { "avinstalldisc", { NULL }, 3502, "udp" }, - { "lsp-ping", { NULL }, 3503, "tcp" }, - { "lsp-ping", { NULL }, 3503, "udp" }, - { "ironstorm", { NULL }, 3504, "tcp" }, - { "ironstorm", { NULL }, 3504, "udp" }, - { "ccmcomm", { NULL }, 3505, "tcp" }, - { "ccmcomm", { NULL }, 3505, "udp" }, - { "apc-3506", { NULL }, 3506, "tcp" }, - { "apc-3506", { NULL }, 3506, "udp" }, - { "nesh-broker", { NULL }, 3507, "tcp" }, - { "nesh-broker", { NULL }, 3507, "udp" }, - { "interactionweb", { NULL }, 3508, "tcp" }, - { "interactionweb", { NULL }, 3508, "udp" }, - { "vt-ssl", { NULL }, 3509, "tcp" }, - { "vt-ssl", { NULL }, 3509, "udp" }, - { "xss-port", { NULL }, 3510, "tcp" }, - { "xss-port", { NULL }, 3510, "udp" }, - { "webmail-2", { NULL }, 3511, "tcp" }, - { "webmail-2", { NULL }, 3511, "udp" }, - { "aztec", { NULL }, 3512, "tcp" }, - { "aztec", { NULL }, 3512, "udp" }, - { "arcpd", { NULL }, 3513, "tcp" }, - { "arcpd", { NULL }, 3513, "udp" }, - { "must-p2p", { NULL }, 3514, "tcp" }, - { "must-p2p", { NULL }, 3514, "udp" }, - { "must-backplane", { NULL }, 3515, "tcp" }, - { "must-backplane", { NULL }, 3515, "udp" }, - { "smartcard-port", { NULL }, 3516, "tcp" }, - { "smartcard-port", { NULL }, 3516, "udp" }, - { "802-11-iapp", { NULL }, 3517, "tcp" }, - { "802-11-iapp", { NULL }, 3517, "udp" }, - { "artifact-msg", { NULL }, 3518, "tcp" }, - { "artifact-msg", { NULL }, 3518, "udp" }, - { "nvmsgd", { NULL }, 3519, "tcp" }, - { "galileo", { NULL }, 3519, "udp" }, - { "galileolog", { NULL }, 3520, "tcp" }, - { "galileolog", { NULL }, 3520, "udp" }, - { "mc3ss", { NULL }, 3521, "tcp" }, - { "mc3ss", { NULL }, 3521, "udp" }, - { "nssocketport", { NULL }, 3522, "tcp" }, - { "nssocketport", { NULL }, 3522, "udp" }, - { "odeumservlink", { NULL }, 3523, "tcp" }, - { "odeumservlink", { NULL }, 3523, "udp" }, - { "ecmport", { NULL }, 3524, "tcp" }, - { "ecmport", { NULL }, 3524, "udp" }, - { "eisport", { NULL }, 3525, "tcp" }, - { "eisport", { NULL }, 3525, "udp" }, - { "starquiz-port", { NULL }, 3526, "tcp" }, - { "starquiz-port", { NULL }, 3526, "udp" }, - { "beserver-msg-q", { NULL }, 3527, "tcp" }, - { "beserver-msg-q", { NULL }, 3527, "udp" }, - { "jboss-iiop", { NULL }, 3528, "tcp" }, - { "jboss-iiop", { NULL }, 3528, "udp" }, - { "jboss-iiop-ssl", { NULL }, 3529, "tcp" }, - { "jboss-iiop-ssl", { NULL }, 3529, "udp" }, - { "gf", { NULL }, 3530, "tcp" }, - { "gf", { NULL }, 3530, "udp" }, - { "joltid", { NULL }, 3531, "tcp" }, - { "joltid", { NULL }, 3531, "udp" }, - { "raven-rmp", { NULL }, 3532, "tcp" }, - { "raven-rmp", { NULL }, 3532, "udp" }, - { "raven-rdp", { NULL }, 3533, "tcp" }, - { "raven-rdp", { NULL }, 3533, "udp" }, - { "urld-port", { NULL }, 3534, "tcp" }, - { "urld-port", { NULL }, 3534, "udp" }, - { "ms-la", { NULL }, 3535, "tcp" }, - { "ms-la", { NULL }, 3535, "udp" }, - { "snac", { NULL }, 3536, "tcp" }, - { "snac", { NULL }, 3536, "udp" }, - { "ni-visa-remote", { NULL }, 3537, "tcp" }, - { "ni-visa-remote", { NULL }, 3537, "udp" }, - { "ibm-diradm", { NULL }, 3538, "tcp" }, - { "ibm-diradm", { NULL }, 3538, "udp" }, - { "ibm-diradm-ssl", { NULL }, 3539, "tcp" }, - { "ibm-diradm-ssl", { NULL }, 3539, "udp" }, - { "pnrp-port", { NULL }, 3540, "tcp" }, - { "pnrp-port", { NULL }, 3540, "udp" }, - { "voispeed-port", { NULL }, 3541, "tcp" }, - { "voispeed-port", { NULL }, 3541, "udp" }, - { "hacl-monitor", { NULL }, 3542, "tcp" }, - { "hacl-monitor", { NULL }, 3542, "udp" }, - { "qftest-lookup", { NULL }, 3543, "tcp" }, - { "qftest-lookup", { NULL }, 3543, "udp" }, - { "teredo", { NULL }, 3544, "tcp" }, - { "teredo", { NULL }, 3544, "udp" }, - { "camac", { NULL }, 3545, "tcp" }, - { "camac", { NULL }, 3545, "udp" }, - { "symantec-sim", { NULL }, 3547, "tcp" }, - { "symantec-sim", { NULL }, 3547, "udp" }, - { "interworld", { NULL }, 3548, "tcp" }, - { "interworld", { NULL }, 3548, "udp" }, - { "tellumat-nms", { NULL }, 3549, "tcp" }, - { "tellumat-nms", { NULL }, 3549, "udp" }, - { "ssmpp", { NULL }, 3550, "tcp" }, - { "ssmpp", { NULL }, 3550, "udp" }, - { "apcupsd", { NULL }, 3551, "tcp" }, - { "apcupsd", { NULL }, 3551, "udp" }, - { "taserver", { NULL }, 3552, "tcp" }, - { "taserver", { NULL }, 3552, "udp" }, - { "rbr-discovery", { NULL }, 3553, "tcp" }, - { "rbr-discovery", { NULL }, 3553, "udp" }, - { "questnotify", { NULL }, 3554, "tcp" }, - { "questnotify", { NULL }, 3554, "udp" }, - { "razor", { NULL }, 3555, "tcp" }, - { "razor", { NULL }, 3555, "udp" }, - { "sky-transport", { NULL }, 3556, "tcp" }, - { "sky-transport", { NULL }, 3556, "udp" }, - { "personalos-001", { NULL }, 3557, "tcp" }, - { "personalos-001", { NULL }, 3557, "udp" }, - { "mcp-port", { NULL }, 3558, "tcp" }, - { "mcp-port", { NULL }, 3558, "udp" }, - { "cctv-port", { NULL }, 3559, "tcp" }, - { "cctv-port", { NULL }, 3559, "udp" }, - { "iniserve-port", { NULL }, 3560, "tcp" }, - { "iniserve-port", { NULL }, 3560, "udp" }, - { "bmc-onekey", { NULL }, 3561, "tcp" }, - { "bmc-onekey", { NULL }, 3561, "udp" }, - { "sdbproxy", { NULL }, 3562, "tcp" }, - { "sdbproxy", { NULL }, 3562, "udp" }, - { "watcomdebug", { NULL }, 3563, "tcp" }, - { "watcomdebug", { NULL }, 3563, "udp" }, - { "esimport", { NULL }, 3564, "tcp" }, - { "esimport", { NULL }, 3564, "udp" }, - { "m2pa", { NULL }, 3565, "tcp" }, - { "m2pa", { NULL }, 3565, "sctp"}, - { "quest-data-hub", { NULL }, 3566, "tcp" }, - { "oap", { NULL }, 3567, "tcp" }, - { "oap", { NULL }, 3567, "udp" }, - { "oap-s", { NULL }, 3568, "tcp" }, - { "oap-s", { NULL }, 3568, "udp" }, - { "mbg-ctrl", { NULL }, 3569, "tcp" }, - { "mbg-ctrl", { NULL }, 3569, "udp" }, - { "mccwebsvr-port", { NULL }, 3570, "tcp" }, - { "mccwebsvr-port", { NULL }, 3570, "udp" }, - { "megardsvr-port", { NULL }, 3571, "tcp" }, - { "megardsvr-port", { NULL }, 3571, "udp" }, - { "megaregsvrport", { NULL }, 3572, "tcp" }, - { "megaregsvrport", { NULL }, 3572, "udp" }, - { "tag-ups-1", { NULL }, 3573, "tcp" }, - { "tag-ups-1", { NULL }, 3573, "udp" }, - { "dmaf-server", { NULL }, 3574, "tcp" }, - { "dmaf-caster", { NULL }, 3574, "udp" }, - { "ccm-port", { NULL }, 3575, "tcp" }, - { "ccm-port", { NULL }, 3575, "udp" }, - { "cmc-port", { NULL }, 3576, "tcp" }, - { "cmc-port", { NULL }, 3576, "udp" }, - { "config-port", { NULL }, 3577, "tcp" }, - { "config-port", { NULL }, 3577, "udp" }, - { "data-port", { NULL }, 3578, "tcp" }, - { "data-port", { NULL }, 3578, "udp" }, - { "ttat3lb", { NULL }, 3579, "tcp" }, - { "ttat3lb", { NULL }, 3579, "udp" }, - { "nati-svrloc", { NULL }, 3580, "tcp" }, - { "nati-svrloc", { NULL }, 3580, "udp" }, - { "kfxaclicensing", { NULL }, 3581, "tcp" }, - { "kfxaclicensing", { NULL }, 3581, "udp" }, - { "press", { NULL }, 3582, "tcp" }, - { "press", { NULL }, 3582, "udp" }, - { "canex-watch", { NULL }, 3583, "tcp" }, - { "canex-watch", { NULL }, 3583, "udp" }, - { "u-dbap", { NULL }, 3584, "tcp" }, - { "u-dbap", { NULL }, 3584, "udp" }, - { "emprise-lls", { NULL }, 3585, "tcp" }, - { "emprise-lls", { NULL }, 3585, "udp" }, - { "emprise-lsc", { NULL }, 3586, "tcp" }, - { "emprise-lsc", { NULL }, 3586, "udp" }, - { "p2pgroup", { NULL }, 3587, "tcp" }, - { "p2pgroup", { NULL }, 3587, "udp" }, - { "sentinel", { NULL }, 3588, "tcp" }, - { "sentinel", { NULL }, 3588, "udp" }, - { "isomair", { NULL }, 3589, "tcp" }, - { "isomair", { NULL }, 3589, "udp" }, - { "wv-csp-sms", { NULL }, 3590, "tcp" }, - { "wv-csp-sms", { NULL }, 3590, "udp" }, - { "gtrack-server", { NULL }, 3591, "tcp" }, - { "gtrack-server", { NULL }, 3591, "udp" }, - { "gtrack-ne", { NULL }, 3592, "tcp" }, - { "gtrack-ne", { NULL }, 3592, "udp" }, - { "bpmd", { NULL }, 3593, "tcp" }, - { "bpmd", { NULL }, 3593, "udp" }, - { "mediaspace", { NULL }, 3594, "tcp" }, - { "mediaspace", { NULL }, 3594, "udp" }, - { "shareapp", { NULL }, 3595, "tcp" }, - { "shareapp", { NULL }, 3595, "udp" }, - { "iw-mmogame", { NULL }, 3596, "tcp" }, - { "iw-mmogame", { NULL }, 3596, "udp" }, - { "a14", { NULL }, 3597, "tcp" }, - { "a14", { NULL }, 3597, "udp" }, - { "a15", { NULL }, 3598, "tcp" }, - { "a15", { NULL }, 3598, "udp" }, - { "quasar-server", { NULL }, 3599, "tcp" }, - { "quasar-server", { NULL }, 3599, "udp" }, - { "trap-daemon", { NULL }, 3600, "tcp" }, - { "trap-daemon", { NULL }, 3600, "udp" }, - { "visinet-gui", { NULL }, 3601, "tcp" }, - { "visinet-gui", { NULL }, 3601, "udp" }, - { "infiniswitchcl", { NULL }, 3602, "tcp" }, - { "infiniswitchcl", { NULL }, 3602, "udp" }, - { "int-rcv-cntrl", { NULL }, 3603, "tcp" }, - { "int-rcv-cntrl", { NULL }, 3603, "udp" }, - { "bmc-jmx-port", { NULL }, 3604, "tcp" }, - { "bmc-jmx-port", { NULL }, 3604, "udp" }, - { "comcam-io", { NULL }, 3605, "tcp" }, - { "comcam-io", { NULL }, 3605, "udp" }, - { "splitlock", { NULL }, 3606, "tcp" }, - { "splitlock", { NULL }, 3606, "udp" }, - { "precise-i3", { NULL }, 3607, "tcp" }, - { "precise-i3", { NULL }, 3607, "udp" }, - { "trendchip-dcp", { NULL }, 3608, "tcp" }, - { "trendchip-dcp", { NULL }, 3608, "udp" }, - { "cpdi-pidas-cm", { NULL }, 3609, "tcp" }, - { "cpdi-pidas-cm", { NULL }, 3609, "udp" }, - { "echonet", { NULL }, 3610, "tcp" }, - { "echonet", { NULL }, 3610, "udp" }, - { "six-degrees", { NULL }, 3611, "tcp" }, - { "six-degrees", { NULL }, 3611, "udp" }, - { "hp-dataprotect", { NULL }, 3612, "tcp" }, - { "hp-dataprotect", { NULL }, 3612, "udp" }, - { "alaris-disc", { NULL }, 3613, "tcp" }, - { "alaris-disc", { NULL }, 3613, "udp" }, - { "sigma-port", { NULL }, 3614, "tcp" }, - { "sigma-port", { NULL }, 3614, "udp" }, - { "start-network", { NULL }, 3615, "tcp" }, - { "start-network", { NULL }, 3615, "udp" }, - { "cd3o-protocol", { NULL }, 3616, "tcp" }, - { "cd3o-protocol", { NULL }, 3616, "udp" }, - { "sharp-server", { NULL }, 3617, "tcp" }, - { "sharp-server", { NULL }, 3617, "udp" }, - { "aairnet-1", { NULL }, 3618, "tcp" }, - { "aairnet-1", { NULL }, 3618, "udp" }, - { "aairnet-2", { NULL }, 3619, "tcp" }, - { "aairnet-2", { NULL }, 3619, "udp" }, - { "ep-pcp", { NULL }, 3620, "tcp" }, - { "ep-pcp", { NULL }, 3620, "udp" }, - { "ep-nsp", { NULL }, 3621, "tcp" }, - { "ep-nsp", { NULL }, 3621, "udp" }, - { "ff-lr-port", { NULL }, 3622, "tcp" }, - { "ff-lr-port", { NULL }, 3622, "udp" }, - { "haipe-discover", { NULL }, 3623, "tcp" }, - { "haipe-discover", { NULL }, 3623, "udp" }, - { "dist-upgrade", { NULL }, 3624, "tcp" }, - { "dist-upgrade", { NULL }, 3624, "udp" }, - { "volley", { NULL }, 3625, "tcp" }, - { "volley", { NULL }, 3625, "udp" }, - { "bvcdaemon-port", { NULL }, 3626, "tcp" }, - { "bvcdaemon-port", { NULL }, 3626, "udp" }, - { "jamserverport", { NULL }, 3627, "tcp" }, - { "jamserverport", { NULL }, 3627, "udp" }, - { "ept-machine", { NULL }, 3628, "tcp" }, - { "ept-machine", { NULL }, 3628, "udp" }, - { "escvpnet", { NULL }, 3629, "tcp" }, - { "escvpnet", { NULL }, 3629, "udp" }, - { "cs-remote-db", { NULL }, 3630, "tcp" }, - { "cs-remote-db", { NULL }, 3630, "udp" }, - { "cs-services", { NULL }, 3631, "tcp" }, - { "cs-services", { NULL }, 3631, "udp" }, - { "distcc", { NULL }, 3632, "tcp" }, - { "distcc", { NULL }, 3632, "udp" }, - { "wacp", { NULL }, 3633, "tcp" }, - { "wacp", { NULL }, 3633, "udp" }, - { "hlibmgr", { NULL }, 3634, "tcp" }, - { "hlibmgr", { NULL }, 3634, "udp" }, - { "sdo", { NULL }, 3635, "tcp" }, - { "sdo", { NULL }, 3635, "udp" }, - { "servistaitsm", { NULL }, 3636, "tcp" }, - { "servistaitsm", { NULL }, 3636, "udp" }, - { "scservp", { NULL }, 3637, "tcp" }, - { "scservp", { NULL }, 3637, "udp" }, - { "ehp-backup", { NULL }, 3638, "tcp" }, - { "ehp-backup", { NULL }, 3638, "udp" }, - { "xap-ha", { NULL }, 3639, "tcp" }, - { "xap-ha", { NULL }, 3639, "udp" }, - { "netplay-port1", { NULL }, 3640, "tcp" }, - { "netplay-port1", { NULL }, 3640, "udp" }, - { "netplay-port2", { NULL }, 3641, "tcp" }, - { "netplay-port2", { NULL }, 3641, "udp" }, - { "juxml-port", { NULL }, 3642, "tcp" }, - { "juxml-port", { NULL }, 3642, "udp" }, - { "audiojuggler", { NULL }, 3643, "tcp" }, - { "audiojuggler", { NULL }, 3643, "udp" }, - { "ssowatch", { NULL }, 3644, "tcp" }, - { "ssowatch", { NULL }, 3644, "udp" }, - { "cyc", { NULL }, 3645, "tcp" }, - { "cyc", { NULL }, 3645, "udp" }, - { "xss-srv-port", { NULL }, 3646, "tcp" }, - { "xss-srv-port", { NULL }, 3646, "udp" }, - { "splitlock-gw", { NULL }, 3647, "tcp" }, - { "splitlock-gw", { NULL }, 3647, "udp" }, - { "fjcp", { NULL }, 3648, "tcp" }, - { "fjcp", { NULL }, 3648, "udp" }, - { "nmmp", { NULL }, 3649, "tcp" }, - { "nmmp", { NULL }, 3649, "udp" }, - { "prismiq-plugin", { NULL }, 3650, "tcp" }, - { "prismiq-plugin", { NULL }, 3650, "udp" }, - { "xrpc-registry", { NULL }, 3651, "tcp" }, - { "xrpc-registry", { NULL }, 3651, "udp" }, - { "vxcrnbuport", { NULL }, 3652, "tcp" }, - { "vxcrnbuport", { NULL }, 3652, "udp" }, - { "tsp", { NULL }, 3653, "tcp" }, - { "tsp", { NULL }, 3653, "udp" }, - { "vaprtm", { NULL }, 3654, "tcp" }, - { "vaprtm", { NULL }, 3654, "udp" }, - { "abatemgr", { NULL }, 3655, "tcp" }, - { "abatemgr", { NULL }, 3655, "udp" }, - { "abatjss", { NULL }, 3656, "tcp" }, - { "abatjss", { NULL }, 3656, "udp" }, - { "immedianet-bcn", { NULL }, 3657, "tcp" }, - { "immedianet-bcn", { NULL }, 3657, "udp" }, - { "ps-ams", { NULL }, 3658, "tcp" }, - { "ps-ams", { NULL }, 3658, "udp" }, - { "apple-sasl", { NULL }, 3659, "tcp" }, - { "apple-sasl", { NULL }, 3659, "udp" }, - { "can-nds-ssl", { NULL }, 3660, "tcp" }, - { "can-nds-ssl", { NULL }, 3660, "udp" }, - { "can-ferret-ssl", { NULL }, 3661, "tcp" }, - { "can-ferret-ssl", { NULL }, 3661, "udp" }, - { "pserver", { NULL }, 3662, "tcp" }, - { "pserver", { NULL }, 3662, "udp" }, - { "dtp", { NULL }, 3663, "tcp" }, - { "dtp", { NULL }, 3663, "udp" }, - { "ups-engine", { NULL }, 3664, "tcp" }, - { "ups-engine", { NULL }, 3664, "udp" }, - { "ent-engine", { NULL }, 3665, "tcp" }, - { "ent-engine", { NULL }, 3665, "udp" }, - { "eserver-pap", { NULL }, 3666, "tcp" }, - { "eserver-pap", { NULL }, 3666, "udp" }, - { "infoexch", { NULL }, 3667, "tcp" }, - { "infoexch", { NULL }, 3667, "udp" }, - { "dell-rm-port", { NULL }, 3668, "tcp" }, - { "dell-rm-port", { NULL }, 3668, "udp" }, - { "casanswmgmt", { NULL }, 3669, "tcp" }, - { "casanswmgmt", { NULL }, 3669, "udp" }, - { "smile", { NULL }, 3670, "tcp" }, - { "smile", { NULL }, 3670, "udp" }, - { "efcp", { NULL }, 3671, "tcp" }, - { "efcp", { NULL }, 3671, "udp" }, - { "lispworks-orb", { NULL }, 3672, "tcp" }, - { "lispworks-orb", { NULL }, 3672, "udp" }, - { "mediavault-gui", { NULL }, 3673, "tcp" }, - { "mediavault-gui", { NULL }, 3673, "udp" }, - { "wininstall-ipc", { NULL }, 3674, "tcp" }, - { "wininstall-ipc", { NULL }, 3674, "udp" }, - { "calltrax", { NULL }, 3675, "tcp" }, - { "calltrax", { NULL }, 3675, "udp" }, - { "va-pacbase", { NULL }, 3676, "tcp" }, - { "va-pacbase", { NULL }, 3676, "udp" }, - { "roverlog", { NULL }, 3677, "tcp" }, - { "roverlog", { NULL }, 3677, "udp" }, - { "ipr-dglt", { NULL }, 3678, "tcp" }, - { "ipr-dglt", { NULL }, 3678, "udp" }, - { "newton-dock", { NULL }, 3679, "tcp" }, - { "newton-dock", { NULL }, 3679, "udp" }, - { "npds-tracker", { NULL }, 3680, "tcp" }, - { "npds-tracker", { NULL }, 3680, "udp" }, - { "bts-x73", { NULL }, 3681, "tcp" }, - { "bts-x73", { NULL }, 3681, "udp" }, - { "cas-mapi", { NULL }, 3682, "tcp" }, - { "cas-mapi", { NULL }, 3682, "udp" }, - { "bmc-ea", { NULL }, 3683, "tcp" }, - { "bmc-ea", { NULL }, 3683, "udp" }, - { "faxstfx-port", { NULL }, 3684, "tcp" }, - { "faxstfx-port", { NULL }, 3684, "udp" }, - { "dsx-agent", { NULL }, 3685, "tcp" }, - { "dsx-agent", { NULL }, 3685, "udp" }, - { "tnmpv2", { NULL }, 3686, "tcp" }, - { "tnmpv2", { NULL }, 3686, "udp" }, - { "simple-push", { NULL }, 3687, "tcp" }, - { "simple-push", { NULL }, 3687, "udp" }, - { "simple-push-s", { NULL }, 3688, "tcp" }, - { "simple-push-s", { NULL }, 3688, "udp" }, - { "daap", { NULL }, 3689, "tcp" }, - { "daap", { NULL }, 3689, "udp" }, - { "svn", { NULL }, 3690, "tcp" }, - { "svn", { NULL }, 3690, "udp" }, - { "magaya-network", { NULL }, 3691, "tcp" }, - { "magaya-network", { NULL }, 3691, "udp" }, - { "intelsync", { NULL }, 3692, "tcp" }, - { "intelsync", { NULL }, 3692, "udp" }, - { "bmc-data-coll", { NULL }, 3695, "tcp" }, - { "bmc-data-coll", { NULL }, 3695, "udp" }, - { "telnetcpcd", { NULL }, 3696, "tcp" }, - { "telnetcpcd", { NULL }, 3696, "udp" }, - { "nw-license", { NULL }, 3697, "tcp" }, - { "nw-license", { NULL }, 3697, "udp" }, - { "sagectlpanel", { NULL }, 3698, "tcp" }, - { "sagectlpanel", { NULL }, 3698, "udp" }, - { "kpn-icw", { NULL }, 3699, "tcp" }, - { "kpn-icw", { NULL }, 3699, "udp" }, - { "lrs-paging", { NULL }, 3700, "tcp" }, - { "lrs-paging", { NULL }, 3700, "udp" }, - { "netcelera", { NULL }, 3701, "tcp" }, - { "netcelera", { NULL }, 3701, "udp" }, - { "ws-discovery", { NULL }, 3702, "tcp" }, - { "ws-discovery", { NULL }, 3702, "udp" }, - { "adobeserver-3", { NULL }, 3703, "tcp" }, - { "adobeserver-3", { NULL }, 3703, "udp" }, - { "adobeserver-4", { NULL }, 3704, "tcp" }, - { "adobeserver-4", { NULL }, 3704, "udp" }, - { "adobeserver-5", { NULL }, 3705, "tcp" }, - { "adobeserver-5", { NULL }, 3705, "udp" }, - { "rt-event", { NULL }, 3706, "tcp" }, - { "rt-event", { NULL }, 3706, "udp" }, - { "rt-event-s", { NULL }, 3707, "tcp" }, - { "rt-event-s", { NULL }, 3707, "udp" }, - { "sun-as-iiops", { NULL }, 3708, "tcp" }, - { "sun-as-iiops", { NULL }, 3708, "udp" }, - { "ca-idms", { NULL }, 3709, "tcp" }, - { "ca-idms", { NULL }, 3709, "udp" }, - { "portgate-auth", { NULL }, 3710, "tcp" }, - { "portgate-auth", { NULL }, 3710, "udp" }, - { "edb-server2", { NULL }, 3711, "tcp" }, - { "edb-server2", { NULL }, 3711, "udp" }, - { "sentinel-ent", { NULL }, 3712, "tcp" }, - { "sentinel-ent", { NULL }, 3712, "udp" }, - { "tftps", { NULL }, 3713, "tcp" }, - { "tftps", { NULL }, 3713, "udp" }, - { "delos-dms", { NULL }, 3714, "tcp" }, - { "delos-dms", { NULL }, 3714, "udp" }, - { "anoto-rendezv", { NULL }, 3715, "tcp" }, - { "anoto-rendezv", { NULL }, 3715, "udp" }, - { "wv-csp-sms-cir", { NULL }, 3716, "tcp" }, - { "wv-csp-sms-cir", { NULL }, 3716, "udp" }, - { "wv-csp-udp-cir", { NULL }, 3717, "tcp" }, - { "wv-csp-udp-cir", { NULL }, 3717, "udp" }, - { "opus-services", { NULL }, 3718, "tcp" }, - { "opus-services", { NULL }, 3718, "udp" }, - { "itelserverport", { NULL }, 3719, "tcp" }, - { "itelserverport", { NULL }, 3719, "udp" }, - { "ufastro-instr", { NULL }, 3720, "tcp" }, - { "ufastro-instr", { NULL }, 3720, "udp" }, - { "xsync", { NULL }, 3721, "tcp" }, - { "xsync", { NULL }, 3721, "udp" }, - { "xserveraid", { NULL }, 3722, "tcp" }, - { "xserveraid", { NULL }, 3722, "udp" }, - { "sychrond", { NULL }, 3723, "tcp" }, - { "sychrond", { NULL }, 3723, "udp" }, - { "blizwow", { NULL }, 3724, "tcp" }, - { "blizwow", { NULL }, 3724, "udp" }, - { "na-er-tip", { NULL }, 3725, "tcp" }, - { "na-er-tip", { NULL }, 3725, "udp" }, - { "array-manager", { NULL }, 3726, "tcp" }, - { "array-manager", { NULL }, 3726, "udp" }, - { "e-mdu", { NULL }, 3727, "tcp" }, - { "e-mdu", { NULL }, 3727, "udp" }, - { "e-woa", { NULL }, 3728, "tcp" }, - { "e-woa", { NULL }, 3728, "udp" }, - { "fksp-audit", { NULL }, 3729, "tcp" }, - { "fksp-audit", { NULL }, 3729, "udp" }, - { "client-ctrl", { NULL }, 3730, "tcp" }, - { "client-ctrl", { NULL }, 3730, "udp" }, - { "smap", { NULL }, 3731, "tcp" }, - { "smap", { NULL }, 3731, "udp" }, - { "m-wnn", { NULL }, 3732, "tcp" }, - { "m-wnn", { NULL }, 3732, "udp" }, - { "multip-msg", { NULL }, 3733, "tcp" }, - { "multip-msg", { NULL }, 3733, "udp" }, - { "synel-data", { NULL }, 3734, "tcp" }, - { "synel-data", { NULL }, 3734, "udp" }, - { "pwdis", { NULL }, 3735, "tcp" }, - { "pwdis", { NULL }, 3735, "udp" }, - { "rs-rmi", { NULL }, 3736, "tcp" }, - { "rs-rmi", { NULL }, 3736, "udp" }, - { "xpanel", { NULL }, 3737, "tcp" }, - { "versatalk", { NULL }, 3738, "tcp" }, - { "versatalk", { NULL }, 3738, "udp" }, - { "launchbird-lm", { NULL }, 3739, "tcp" }, - { "launchbird-lm", { NULL }, 3739, "udp" }, - { "heartbeat", { NULL }, 3740, "tcp" }, - { "heartbeat", { NULL }, 3740, "udp" }, - { "wysdma", { NULL }, 3741, "tcp" }, - { "wysdma", { NULL }, 3741, "udp" }, - { "cst-port", { NULL }, 3742, "tcp" }, - { "cst-port", { NULL }, 3742, "udp" }, - { "ipcs-command", { NULL }, 3743, "tcp" }, - { "ipcs-command", { NULL }, 3743, "udp" }, - { "sasg", { NULL }, 3744, "tcp" }, - { "sasg", { NULL }, 3744, "udp" }, - { "gw-call-port", { NULL }, 3745, "tcp" }, - { "gw-call-port", { NULL }, 3745, "udp" }, - { "linktest", { NULL }, 3746, "tcp" }, - { "linktest", { NULL }, 3746, "udp" }, - { "linktest-s", { NULL }, 3747, "tcp" }, - { "linktest-s", { NULL }, 3747, "udp" }, - { "webdata", { NULL }, 3748, "tcp" }, - { "webdata", { NULL }, 3748, "udp" }, - { "cimtrak", { NULL }, 3749, "tcp" }, - { "cimtrak", { NULL }, 3749, "udp" }, - { "cbos-ip-port", { NULL }, 3750, "tcp" }, - { "cbos-ip-port", { NULL }, 3750, "udp" }, - { "gprs-cube", { NULL }, 3751, "tcp" }, - { "gprs-cube", { NULL }, 3751, "udp" }, - { "vipremoteagent", { NULL }, 3752, "tcp" }, - { "vipremoteagent", { NULL }, 3752, "udp" }, - { "nattyserver", { NULL }, 3753, "tcp" }, - { "nattyserver", { NULL }, 3753, "udp" }, - { "timestenbroker", { NULL }, 3754, "tcp" }, - { "timestenbroker", { NULL }, 3754, "udp" }, - { "sas-remote-hlp", { NULL }, 3755, "tcp" }, - { "sas-remote-hlp", { NULL }, 3755, "udp" }, - { "canon-capt", { NULL }, 3756, "tcp" }, - { "canon-capt", { NULL }, 3756, "udp" }, - { "grf-port", { NULL }, 3757, "tcp" }, - { "grf-port", { NULL }, 3757, "udp" }, - { "apw-registry", { NULL }, 3758, "tcp" }, - { "apw-registry", { NULL }, 3758, "udp" }, - { "exapt-lmgr", { NULL }, 3759, "tcp" }, - { "exapt-lmgr", { NULL }, 3759, "udp" }, - { "adtempusclient", { NULL }, 3760, "tcp" }, - { "adtempusclient", { NULL }, 3760, "udp" }, - { "gsakmp", { NULL }, 3761, "tcp" }, - { "gsakmp", { NULL }, 3761, "udp" }, - { "gbs-smp", { NULL }, 3762, "tcp" }, - { "gbs-smp", { NULL }, 3762, "udp" }, - { "xo-wave", { NULL }, 3763, "tcp" }, - { "xo-wave", { NULL }, 3763, "udp" }, - { "mni-prot-rout", { NULL }, 3764, "tcp" }, - { "mni-prot-rout", { NULL }, 3764, "udp" }, - { "rtraceroute", { NULL }, 3765, "tcp" }, - { "rtraceroute", { NULL }, 3765, "udp" }, - { "listmgr-port", { NULL }, 3767, "tcp" }, - { "listmgr-port", { NULL }, 3767, "udp" }, - { "rblcheckd", { NULL }, 3768, "tcp" }, - { "rblcheckd", { NULL }, 3768, "udp" }, - { "haipe-otnk", { NULL }, 3769, "tcp" }, - { "haipe-otnk", { NULL }, 3769, "udp" }, - { "cindycollab", { NULL }, 3770, "tcp" }, - { "cindycollab", { NULL }, 3770, "udp" }, - { "paging-port", { NULL }, 3771, "tcp" }, - { "paging-port", { NULL }, 3771, "udp" }, - { "ctp", { NULL }, 3772, "tcp" }, - { "ctp", { NULL }, 3772, "udp" }, - { "ctdhercules", { NULL }, 3773, "tcp" }, - { "ctdhercules", { NULL }, 3773, "udp" }, - { "zicom", { NULL }, 3774, "tcp" }, - { "zicom", { NULL }, 3774, "udp" }, - { "ispmmgr", { NULL }, 3775, "tcp" }, - { "ispmmgr", { NULL }, 3775, "udp" }, - { "dvcprov-port", { NULL }, 3776, "tcp" }, - { "dvcprov-port", { NULL }, 3776, "udp" }, - { "jibe-eb", { NULL }, 3777, "tcp" }, - { "jibe-eb", { NULL }, 3777, "udp" }, - { "c-h-it-port", { NULL }, 3778, "tcp" }, - { "c-h-it-port", { NULL }, 3778, "udp" }, - { "cognima", { NULL }, 3779, "tcp" }, - { "cognima", { NULL }, 3779, "udp" }, - { "nnp", { NULL }, 3780, "tcp" }, - { "nnp", { NULL }, 3780, "udp" }, - { "abcvoice-port", { NULL }, 3781, "tcp" }, - { "abcvoice-port", { NULL }, 3781, "udp" }, - { "iso-tp0s", { NULL }, 3782, "tcp" }, - { "iso-tp0s", { NULL }, 3782, "udp" }, - { "bim-pem", { NULL }, 3783, "tcp" }, - { "bim-pem", { NULL }, 3783, "udp" }, - { "bfd-control", { NULL }, 3784, "tcp" }, - { "bfd-control", { NULL }, 3784, "udp" }, - { "bfd-echo", { NULL }, 3785, "tcp" }, - { "bfd-echo", { NULL }, 3785, "udp" }, - { "upstriggervsw", { NULL }, 3786, "tcp" }, - { "upstriggervsw", { NULL }, 3786, "udp" }, - { "fintrx", { NULL }, 3787, "tcp" }, - { "fintrx", { NULL }, 3787, "udp" }, - { "isrp-port", { NULL }, 3788, "tcp" }, - { "isrp-port", { NULL }, 3788, "udp" }, - { "remotedeploy", { NULL }, 3789, "tcp" }, - { "remotedeploy", { NULL }, 3789, "udp" }, - { "quickbooksrds", { NULL }, 3790, "tcp" }, - { "quickbooksrds", { NULL }, 3790, "udp" }, - { "tvnetworkvideo", { NULL }, 3791, "tcp" }, - { "tvnetworkvideo", { NULL }, 3791, "udp" }, - { "sitewatch", { NULL }, 3792, "tcp" }, - { "sitewatch", { NULL }, 3792, "udp" }, - { "dcsoftware", { NULL }, 3793, "tcp" }, - { "dcsoftware", { NULL }, 3793, "udp" }, - { "jaus", { NULL }, 3794, "tcp" }, - { "jaus", { NULL }, 3794, "udp" }, - { "myblast", { NULL }, 3795, "tcp" }, - { "myblast", { NULL }, 3795, "udp" }, - { "spw-dialer", { NULL }, 3796, "tcp" }, - { "spw-dialer", { NULL }, 3796, "udp" }, - { "idps", { NULL }, 3797, "tcp" }, - { "idps", { NULL }, 3797, "udp" }, - { "minilock", { NULL }, 3798, "tcp" }, - { "minilock", { NULL }, 3798, "udp" }, - { "radius-dynauth", { NULL }, 3799, "tcp" }, - { "radius-dynauth", { NULL }, 3799, "udp" }, - { "pwgpsi", { NULL }, 3800, "tcp" }, - { "pwgpsi", { NULL }, 3800, "udp" }, - { "ibm-mgr", { NULL }, 3801, "tcp" }, - { "ibm-mgr", { NULL }, 3801, "udp" }, - { "vhd", { NULL }, 3802, "tcp" }, - { "vhd", { NULL }, 3802, "udp" }, - { "soniqsync", { NULL }, 3803, "tcp" }, - { "soniqsync", { NULL }, 3803, "udp" }, - { "iqnet-port", { NULL }, 3804, "tcp" }, - { "iqnet-port", { NULL }, 3804, "udp" }, - { "tcpdataserver", { NULL }, 3805, "tcp" }, - { "tcpdataserver", { NULL }, 3805, "udp" }, - { "wsmlb", { NULL }, 3806, "tcp" }, - { "wsmlb", { NULL }, 3806, "udp" }, - { "spugna", { NULL }, 3807, "tcp" }, - { "spugna", { NULL }, 3807, "udp" }, - { "sun-as-iiops-ca", { NULL }, 3808, "tcp" }, - { "sun-as-iiops-ca", { NULL }, 3808, "udp" }, - { "apocd", { NULL }, 3809, "tcp" }, - { "apocd", { NULL }, 3809, "udp" }, - { "wlanauth", { NULL }, 3810, "tcp" }, - { "wlanauth", { NULL }, 3810, "udp" }, - { "amp", { NULL }, 3811, "tcp" }, - { "amp", { NULL }, 3811, "udp" }, - { "neto-wol-server", { NULL }, 3812, "tcp" }, - { "neto-wol-server", { NULL }, 3812, "udp" }, - { "rap-ip", { NULL }, 3813, "tcp" }, - { "rap-ip", { NULL }, 3813, "udp" }, - { "neto-dcs", { NULL }, 3814, "tcp" }, - { "neto-dcs", { NULL }, 3814, "udp" }, - { "lansurveyorxml", { NULL }, 3815, "tcp" }, - { "lansurveyorxml", { NULL }, 3815, "udp" }, - { "sunlps-http", { NULL }, 3816, "tcp" }, - { "sunlps-http", { NULL }, 3816, "udp" }, - { "tapeware", { NULL }, 3817, "tcp" }, - { "tapeware", { NULL }, 3817, "udp" }, - { "crinis-hb", { NULL }, 3818, "tcp" }, - { "crinis-hb", { NULL }, 3818, "udp" }, - { "epl-slp", { NULL }, 3819, "tcp" }, - { "epl-slp", { NULL }, 3819, "udp" }, - { "scp", { NULL }, 3820, "tcp" }, - { "scp", { NULL }, 3820, "udp" }, - { "pmcp", { NULL }, 3821, "tcp" }, - { "pmcp", { NULL }, 3821, "udp" }, - { "acp-discovery", { NULL }, 3822, "tcp" }, - { "acp-discovery", { NULL }, 3822, "udp" }, - { "acp-conduit", { NULL }, 3823, "tcp" }, - { "acp-conduit", { NULL }, 3823, "udp" }, - { "acp-policy", { NULL }, 3824, "tcp" }, - { "acp-policy", { NULL }, 3824, "udp" }, - { "ffserver", { NULL }, 3825, "tcp" }, - { "ffserver", { NULL }, 3825, "udp" }, - { "wormux", { NULL }, 3826, "tcp" }, - { "wormux", { NULL }, 3826, "udp" }, - { "netmpi", { NULL }, 3827, "tcp" }, - { "netmpi", { NULL }, 3827, "udp" }, - { "neteh", { NULL }, 3828, "tcp" }, - { "neteh", { NULL }, 3828, "udp" }, - { "neteh-ext", { NULL }, 3829, "tcp" }, - { "neteh-ext", { NULL }, 3829, "udp" }, - { "cernsysmgmtagt", { NULL }, 3830, "tcp" }, - { "cernsysmgmtagt", { NULL }, 3830, "udp" }, - { "dvapps", { NULL }, 3831, "tcp" }, - { "dvapps", { NULL }, 3831, "udp" }, - { "xxnetserver", { NULL }, 3832, "tcp" }, - { "xxnetserver", { NULL }, 3832, "udp" }, - { "aipn-auth", { NULL }, 3833, "tcp" }, - { "aipn-auth", { NULL }, 3833, "udp" }, - { "spectardata", { NULL }, 3834, "tcp" }, - { "spectardata", { NULL }, 3834, "udp" }, - { "spectardb", { NULL }, 3835, "tcp" }, - { "spectardb", { NULL }, 3835, "udp" }, - { "markem-dcp", { NULL }, 3836, "tcp" }, - { "markem-dcp", { NULL }, 3836, "udp" }, - { "mkm-discovery", { NULL }, 3837, "tcp" }, - { "mkm-discovery", { NULL }, 3837, "udp" }, - { "sos", { NULL }, 3838, "tcp" }, - { "sos", { NULL }, 3838, "udp" }, - { "amx-rms", { NULL }, 3839, "tcp" }, - { "amx-rms", { NULL }, 3839, "udp" }, - { "flirtmitmir", { NULL }, 3840, "tcp" }, - { "flirtmitmir", { NULL }, 3840, "udp" }, - { "zfirm-shiprush3", { NULL }, 3841, "tcp" }, - { "zfirm-shiprush3", { NULL }, 3841, "udp" }, - { "nhci", { NULL }, 3842, "tcp" }, - { "nhci", { NULL }, 3842, "udp" }, - { "quest-agent", { NULL }, 3843, "tcp" }, - { "quest-agent", { NULL }, 3843, "udp" }, - { "rnm", { NULL }, 3844, "tcp" }, - { "rnm", { NULL }, 3844, "udp" }, - { "v-one-spp", { NULL }, 3845, "tcp" }, - { "v-one-spp", { NULL }, 3845, "udp" }, - { "an-pcp", { NULL }, 3846, "tcp" }, - { "an-pcp", { NULL }, 3846, "udp" }, - { "msfw-control", { NULL }, 3847, "tcp" }, - { "msfw-control", { NULL }, 3847, "udp" }, - { "item", { NULL }, 3848, "tcp" }, - { "item", { NULL }, 3848, "udp" }, - { "spw-dnspreload", { NULL }, 3849, "tcp" }, - { "spw-dnspreload", { NULL }, 3849, "udp" }, - { "qtms-bootstrap", { NULL }, 3850, "tcp" }, - { "qtms-bootstrap", { NULL }, 3850, "udp" }, - { "spectraport", { NULL }, 3851, "tcp" }, - { "spectraport", { NULL }, 3851, "udp" }, - { "sse-app-config", { NULL }, 3852, "tcp" }, - { "sse-app-config", { NULL }, 3852, "udp" }, - { "sscan", { NULL }, 3853, "tcp" }, - { "sscan", { NULL }, 3853, "udp" }, - { "stryker-com", { NULL }, 3854, "tcp" }, - { "stryker-com", { NULL }, 3854, "udp" }, - { "opentrac", { NULL }, 3855, "tcp" }, - { "opentrac", { NULL }, 3855, "udp" }, - { "informer", { NULL }, 3856, "tcp" }, - { "informer", { NULL }, 3856, "udp" }, - { "trap-port", { NULL }, 3857, "tcp" }, - { "trap-port", { NULL }, 3857, "udp" }, - { "trap-port-mom", { NULL }, 3858, "tcp" }, - { "trap-port-mom", { NULL }, 3858, "udp" }, - { "nav-port", { NULL }, 3859, "tcp" }, - { "nav-port", { NULL }, 3859, "udp" }, - { "sasp", { NULL }, 3860, "tcp" }, - { "sasp", { NULL }, 3860, "udp" }, - { "winshadow-hd", { NULL }, 3861, "tcp" }, - { "winshadow-hd", { NULL }, 3861, "udp" }, - { "giga-pocket", { NULL }, 3862, "tcp" }, - { "giga-pocket", { NULL }, 3862, "udp" }, - { "asap-tcp", { NULL }, 3863, "tcp" }, - { "asap-udp", { NULL }, 3863, "udp" }, - { "asap-sctp", { NULL }, 3863, "sctp"}, - { "asap-tcp-tls", { NULL }, 3864, "tcp" }, - { "asap-sctp-tls", { NULL }, 3864, "sctp"}, - { "xpl", { NULL }, 3865, "tcp" }, - { "xpl", { NULL }, 3865, "udp" }, - { "dzdaemon", { NULL }, 3866, "tcp" }, - { "dzdaemon", { NULL }, 3866, "udp" }, - { "dzoglserver", { NULL }, 3867, "tcp" }, - { "dzoglserver", { NULL }, 3867, "udp" }, - { "diameter", { NULL }, 3868, "tcp" }, - { "diameter", { NULL }, 3868, "sctp"}, - { "ovsam-mgmt", { NULL }, 3869, "tcp" }, - { "ovsam-mgmt", { NULL }, 3869, "udp" }, - { "ovsam-d-agent", { NULL }, 3870, "tcp" }, - { "ovsam-d-agent", { NULL }, 3870, "udp" }, - { "avocent-adsap", { NULL }, 3871, "tcp" }, - { "avocent-adsap", { NULL }, 3871, "udp" }, - { "oem-agent", { NULL }, 3872, "tcp" }, - { "oem-agent", { NULL }, 3872, "udp" }, - { "fagordnc", { NULL }, 3873, "tcp" }, - { "fagordnc", { NULL }, 3873, "udp" }, - { "sixxsconfig", { NULL }, 3874, "tcp" }, - { "sixxsconfig", { NULL }, 3874, "udp" }, - { "pnbscada", { NULL }, 3875, "tcp" }, - { "pnbscada", { NULL }, 3875, "udp" }, - { "dl_agent", { NULL }, 3876, "tcp" }, - { "dl_agent", { NULL }, 3876, "udp" }, - { "xmpcr-interface", { NULL }, 3877, "tcp" }, - { "xmpcr-interface", { NULL }, 3877, "udp" }, - { "fotogcad", { NULL }, 3878, "tcp" }, - { "fotogcad", { NULL }, 3878, "udp" }, - { "appss-lm", { NULL }, 3879, "tcp" }, - { "appss-lm", { NULL }, 3879, "udp" }, - { "igrs", { NULL }, 3880, "tcp" }, - { "igrs", { NULL }, 3880, "udp" }, - { "idac", { NULL }, 3881, "tcp" }, - { "idac", { NULL }, 3881, "udp" }, - { "msdts1", { NULL }, 3882, "tcp" }, - { "msdts1", { NULL }, 3882, "udp" }, - { "vrpn", { NULL }, 3883, "tcp" }, - { "vrpn", { NULL }, 3883, "udp" }, - { "softrack-meter", { NULL }, 3884, "tcp" }, - { "softrack-meter", { NULL }, 3884, "udp" }, - { "topflow-ssl", { NULL }, 3885, "tcp" }, - { "topflow-ssl", { NULL }, 3885, "udp" }, - { "nei-management", { NULL }, 3886, "tcp" }, - { "nei-management", { NULL }, 3886, "udp" }, - { "ciphire-data", { NULL }, 3887, "tcp" }, - { "ciphire-data", { NULL }, 3887, "udp" }, - { "ciphire-serv", { NULL }, 3888, "tcp" }, - { "ciphire-serv", { NULL }, 3888, "udp" }, - { "dandv-tester", { NULL }, 3889, "tcp" }, - { "dandv-tester", { NULL }, 3889, "udp" }, - { "ndsconnect", { NULL }, 3890, "tcp" }, - { "ndsconnect", { NULL }, 3890, "udp" }, - { "rtc-pm-port", { NULL }, 3891, "tcp" }, - { "rtc-pm-port", { NULL }, 3891, "udp" }, - { "pcc-image-port", { NULL }, 3892, "tcp" }, - { "pcc-image-port", { NULL }, 3892, "udp" }, - { "cgi-starapi", { NULL }, 3893, "tcp" }, - { "cgi-starapi", { NULL }, 3893, "udp" }, - { "syam-agent", { NULL }, 3894, "tcp" }, - { "syam-agent", { NULL }, 3894, "udp" }, - { "syam-smc", { NULL }, 3895, "tcp" }, - { "syam-smc", { NULL }, 3895, "udp" }, - { "sdo-tls", { NULL }, 3896, "tcp" }, - { "sdo-tls", { NULL }, 3896, "udp" }, - { "sdo-ssh", { NULL }, 3897, "tcp" }, - { "sdo-ssh", { NULL }, 3897, "udp" }, - { "senip", { NULL }, 3898, "tcp" }, - { "senip", { NULL }, 3898, "udp" }, - { "itv-control", { NULL }, 3899, "tcp" }, - { "itv-control", { NULL }, 3899, "udp" }, - { "udt_os", { NULL }, 3900, "tcp" }, - { "udt_os", { NULL }, 3900, "udp" }, - { "nimsh", { NULL }, 3901, "tcp" }, - { "nimsh", { NULL }, 3901, "udp" }, - { "nimaux", { NULL }, 3902, "tcp" }, - { "nimaux", { NULL }, 3902, "udp" }, - { "charsetmgr", { NULL }, 3903, "tcp" }, - { "charsetmgr", { NULL }, 3903, "udp" }, - { "omnilink-port", { NULL }, 3904, "tcp" }, - { "omnilink-port", { NULL }, 3904, "udp" }, - { "mupdate", { NULL }, 3905, "tcp" }, - { "mupdate", { NULL }, 3905, "udp" }, - { "topovista-data", { NULL }, 3906, "tcp" }, - { "topovista-data", { NULL }, 3906, "udp" }, - { "imoguia-port", { NULL }, 3907, "tcp" }, - { "imoguia-port", { NULL }, 3907, "udp" }, - { "hppronetman", { NULL }, 3908, "tcp" }, - { "hppronetman", { NULL }, 3908, "udp" }, - { "surfcontrolcpa", { NULL }, 3909, "tcp" }, - { "surfcontrolcpa", { NULL }, 3909, "udp" }, - { "prnrequest", { NULL }, 3910, "tcp" }, - { "prnrequest", { NULL }, 3910, "udp" }, - { "prnstatus", { NULL }, 3911, "tcp" }, - { "prnstatus", { NULL }, 3911, "udp" }, - { "gbmt-stars", { NULL }, 3912, "tcp" }, - { "gbmt-stars", { NULL }, 3912, "udp" }, - { "listcrt-port", { NULL }, 3913, "tcp" }, - { "listcrt-port", { NULL }, 3913, "udp" }, - { "listcrt-port-2", { NULL }, 3914, "tcp" }, - { "listcrt-port-2", { NULL }, 3914, "udp" }, - { "agcat", { NULL }, 3915, "tcp" }, - { "agcat", { NULL }, 3915, "udp" }, - { "wysdmc", { NULL }, 3916, "tcp" }, - { "wysdmc", { NULL }, 3916, "udp" }, - { "aftmux", { NULL }, 3917, "tcp" }, - { "aftmux", { NULL }, 3917, "udp" }, - { "pktcablemmcops", { NULL }, 3918, "tcp" }, - { "pktcablemmcops", { NULL }, 3918, "udp" }, - { "hyperip", { NULL }, 3919, "tcp" }, - { "hyperip", { NULL }, 3919, "udp" }, - { "exasoftport1", { NULL }, 3920, "tcp" }, - { "exasoftport1", { NULL }, 3920, "udp" }, - { "herodotus-net", { NULL }, 3921, "tcp" }, - { "herodotus-net", { NULL }, 3921, "udp" }, - { "sor-update", { NULL }, 3922, "tcp" }, - { "sor-update", { NULL }, 3922, "udp" }, - { "symb-sb-port", { NULL }, 3923, "tcp" }, - { "symb-sb-port", { NULL }, 3923, "udp" }, - { "mpl-gprs-port", { NULL }, 3924, "tcp" }, - { "mpl-gprs-port", { NULL }, 3924, "udp" }, - { "zmp", { NULL }, 3925, "tcp" }, - { "zmp", { NULL }, 3925, "udp" }, - { "winport", { NULL }, 3926, "tcp" }, - { "winport", { NULL }, 3926, "udp" }, - { "natdataservice", { NULL }, 3927, "tcp" }, - { "natdataservice", { NULL }, 3927, "udp" }, - { "netboot-pxe", { NULL }, 3928, "tcp" }, - { "netboot-pxe", { NULL }, 3928, "udp" }, - { "smauth-port", { NULL }, 3929, "tcp" }, - { "smauth-port", { NULL }, 3929, "udp" }, - { "syam-webserver", { NULL }, 3930, "tcp" }, - { "syam-webserver", { NULL }, 3930, "udp" }, - { "msr-plugin-port", { NULL }, 3931, "tcp" }, - { "msr-plugin-port", { NULL }, 3931, "udp" }, - { "dyn-site", { NULL }, 3932, "tcp" }, - { "dyn-site", { NULL }, 3932, "udp" }, - { "plbserve-port", { NULL }, 3933, "tcp" }, - { "plbserve-port", { NULL }, 3933, "udp" }, - { "sunfm-port", { NULL }, 3934, "tcp" }, - { "sunfm-port", { NULL }, 3934, "udp" }, - { "sdp-portmapper", { NULL }, 3935, "tcp" }, - { "sdp-portmapper", { NULL }, 3935, "udp" }, - { "mailprox", { NULL }, 3936, "tcp" }, - { "mailprox", { NULL }, 3936, "udp" }, - { "dvbservdsc", { NULL }, 3937, "tcp" }, - { "dvbservdsc", { NULL }, 3937, "udp" }, - { "dbcontrol_agent", { NULL }, 3938, "tcp" }, - { "dbcontrol_agent", { NULL }, 3938, "udp" }, - { "aamp", { NULL }, 3939, "tcp" }, - { "aamp", { NULL }, 3939, "udp" }, - { "xecp-node", { NULL }, 3940, "tcp" }, - { "xecp-node", { NULL }, 3940, "udp" }, - { "homeportal-web", { NULL }, 3941, "tcp" }, - { "homeportal-web", { NULL }, 3941, "udp" }, - { "srdp", { NULL }, 3942, "tcp" }, - { "srdp", { NULL }, 3942, "udp" }, - { "tig", { NULL }, 3943, "tcp" }, - { "tig", { NULL }, 3943, "udp" }, - { "sops", { NULL }, 3944, "tcp" }, - { "sops", { NULL }, 3944, "udp" }, - { "emcads", { NULL }, 3945, "tcp" }, - { "emcads", { NULL }, 3945, "udp" }, - { "backupedge", { NULL }, 3946, "tcp" }, - { "backupedge", { NULL }, 3946, "udp" }, - { "ccp", { NULL }, 3947, "tcp" }, - { "ccp", { NULL }, 3947, "udp" }, - { "apdap", { NULL }, 3948, "tcp" }, - { "apdap", { NULL }, 3948, "udp" }, - { "drip", { NULL }, 3949, "tcp" }, - { "drip", { NULL }, 3949, "udp" }, - { "namemunge", { NULL }, 3950, "tcp" }, - { "namemunge", { NULL }, 3950, "udp" }, - { "pwgippfax", { NULL }, 3951, "tcp" }, - { "pwgippfax", { NULL }, 3951, "udp" }, - { "i3-sessionmgr", { NULL }, 3952, "tcp" }, - { "i3-sessionmgr", { NULL }, 3952, "udp" }, - { "xmlink-connect", { NULL }, 3953, "tcp" }, - { "xmlink-connect", { NULL }, 3953, "udp" }, - { "adrep", { NULL }, 3954, "tcp" }, - { "adrep", { NULL }, 3954, "udp" }, - { "p2pcommunity", { NULL }, 3955, "tcp" }, - { "p2pcommunity", { NULL }, 3955, "udp" }, - { "gvcp", { NULL }, 3956, "tcp" }, - { "gvcp", { NULL }, 3956, "udp" }, - { "mqe-broker", { NULL }, 3957, "tcp" }, - { "mqe-broker", { NULL }, 3957, "udp" }, - { "mqe-agent", { NULL }, 3958, "tcp" }, - { "mqe-agent", { NULL }, 3958, "udp" }, - { "treehopper", { NULL }, 3959, "tcp" }, - { "treehopper", { NULL }, 3959, "udp" }, - { "bess", { NULL }, 3960, "tcp" }, - { "bess", { NULL }, 3960, "udp" }, - { "proaxess", { NULL }, 3961, "tcp" }, - { "proaxess", { NULL }, 3961, "udp" }, - { "sbi-agent", { NULL }, 3962, "tcp" }, - { "sbi-agent", { NULL }, 3962, "udp" }, - { "thrp", { NULL }, 3963, "tcp" }, - { "thrp", { NULL }, 3963, "udp" }, - { "sasggprs", { NULL }, 3964, "tcp" }, - { "sasggprs", { NULL }, 3964, "udp" }, - { "ati-ip-to-ncpe", { NULL }, 3965, "tcp" }, - { "ati-ip-to-ncpe", { NULL }, 3965, "udp" }, - { "bflckmgr", { NULL }, 3966, "tcp" }, - { "bflckmgr", { NULL }, 3966, "udp" }, - { "ppsms", { NULL }, 3967, "tcp" }, - { "ppsms", { NULL }, 3967, "udp" }, - { "ianywhere-dbns", { NULL }, 3968, "tcp" }, - { "ianywhere-dbns", { NULL }, 3968, "udp" }, - { "landmarks", { NULL }, 3969, "tcp" }, - { "landmarks", { NULL }, 3969, "udp" }, - { "lanrevagent", { NULL }, 3970, "tcp" }, - { "lanrevagent", { NULL }, 3970, "udp" }, - { "lanrevserver", { NULL }, 3971, "tcp" }, - { "lanrevserver", { NULL }, 3971, "udp" }, - { "iconp", { NULL }, 3972, "tcp" }, - { "iconp", { NULL }, 3972, "udp" }, - { "progistics", { NULL }, 3973, "tcp" }, - { "progistics", { NULL }, 3973, "udp" }, - { "citysearch", { NULL }, 3974, "tcp" }, - { "citysearch", { NULL }, 3974, "udp" }, - { "airshot", { NULL }, 3975, "tcp" }, - { "airshot", { NULL }, 3975, "udp" }, - { "opswagent", { NULL }, 3976, "tcp" }, - { "opswagent", { NULL }, 3976, "udp" }, - { "opswmanager", { NULL }, 3977, "tcp" }, - { "opswmanager", { NULL }, 3977, "udp" }, - { "secure-cfg-svr", { NULL }, 3978, "tcp" }, - { "secure-cfg-svr", { NULL }, 3978, "udp" }, - { "smwan", { NULL }, 3979, "tcp" }, - { "smwan", { NULL }, 3979, "udp" }, - { "acms", { NULL }, 3980, "tcp" }, - { "acms", { NULL }, 3980, "udp" }, - { "starfish", { NULL }, 3981, "tcp" }, - { "starfish", { NULL }, 3981, "udp" }, - { "eis", { NULL }, 3982, "tcp" }, - { "eis", { NULL }, 3982, "udp" }, - { "eisp", { NULL }, 3983, "tcp" }, - { "eisp", { NULL }, 3983, "udp" }, - { "mapper-nodemgr", { NULL }, 3984, "tcp" }, - { "mapper-nodemgr", { NULL }, 3984, "udp" }, - { "mapper-mapethd", { NULL }, 3985, "tcp" }, - { "mapper-mapethd", { NULL }, 3985, "udp" }, - { "mapper-ws_ethd", { NULL }, 3986, "tcp" }, - { "mapper-ws_ethd", { NULL }, 3986, "udp" }, - { "centerline", { NULL }, 3987, "tcp" }, - { "centerline", { NULL }, 3987, "udp" }, - { "dcs-config", { NULL }, 3988, "tcp" }, - { "dcs-config", { NULL }, 3988, "udp" }, - { "bv-queryengine", { NULL }, 3989, "tcp" }, - { "bv-queryengine", { NULL }, 3989, "udp" }, - { "bv-is", { NULL }, 3990, "tcp" }, - { "bv-is", { NULL }, 3990, "udp" }, - { "bv-smcsrv", { NULL }, 3991, "tcp" }, - { "bv-smcsrv", { NULL }, 3991, "udp" }, - { "bv-ds", { NULL }, 3992, "tcp" }, - { "bv-ds", { NULL }, 3992, "udp" }, - { "bv-agent", { NULL }, 3993, "tcp" }, - { "bv-agent", { NULL }, 3993, "udp" }, - { "iss-mgmt-ssl", { NULL }, 3995, "tcp" }, - { "iss-mgmt-ssl", { NULL }, 3995, "udp" }, - { "abcsoftware", { NULL }, 3996, "tcp" }, - { "abcsoftware", { NULL }, 3996, "udp" }, - { "agentsease-db", { NULL }, 3997, "tcp" }, - { "agentsease-db", { NULL }, 3997, "udp" }, - { "dnx", { NULL }, 3998, "tcp" }, - { "dnx", { NULL }, 3998, "udp" }, - { "nvcnet", { NULL }, 3999, "tcp" }, - { "nvcnet", { NULL }, 3999, "udp" }, - { "terabase", { NULL }, 4000, "tcp" }, - { "terabase", { NULL }, 4000, "udp" }, - { "newoak", { NULL }, 4001, "tcp" }, - { "newoak", { NULL }, 4001, "udp" }, - { "pxc-spvr-ft", { NULL }, 4002, "tcp" }, - { "pxc-spvr-ft", { NULL }, 4002, "udp" }, - { "pxc-splr-ft", { NULL }, 4003, "tcp" }, - { "pxc-splr-ft", { NULL }, 4003, "udp" }, - { "pxc-roid", { NULL }, 4004, "tcp" }, - { "pxc-roid", { NULL }, 4004, "udp" }, - { "pxc-pin", { NULL }, 4005, "tcp" }, - { "pxc-pin", { NULL }, 4005, "udp" }, - { "pxc-spvr", { NULL }, 4006, "tcp" }, - { "pxc-spvr", { NULL }, 4006, "udp" }, - { "pxc-splr", { NULL }, 4007, "tcp" }, - { "pxc-splr", { NULL }, 4007, "udp" }, - { "netcheque", { NULL }, 4008, "tcp" }, - { "netcheque", { NULL }, 4008, "udp" }, - { "chimera-hwm", { NULL }, 4009, "tcp" }, - { "chimera-hwm", { NULL }, 4009, "udp" }, - { "samsung-unidex", { NULL }, 4010, "tcp" }, - { "samsung-unidex", { NULL }, 4010, "udp" }, - { "altserviceboot", { NULL }, 4011, "tcp" }, - { "altserviceboot", { NULL }, 4011, "udp" }, - { "pda-gate", { NULL }, 4012, "tcp" }, - { "pda-gate", { NULL }, 4012, "udp" }, - { "acl-manager", { NULL }, 4013, "tcp" }, - { "acl-manager", { NULL }, 4013, "udp" }, - { "taiclock", { NULL }, 4014, "tcp" }, - { "taiclock", { NULL }, 4014, "udp" }, - { "talarian-mcast1", { NULL }, 4015, "tcp" }, - { "talarian-mcast1", { NULL }, 4015, "udp" }, - { "talarian-mcast2", { NULL }, 4016, "tcp" }, - { "talarian-mcast2", { NULL }, 4016, "udp" }, - { "talarian-mcast3", { NULL }, 4017, "tcp" }, - { "talarian-mcast3", { NULL }, 4017, "udp" }, - { "talarian-mcast4", { NULL }, 4018, "tcp" }, - { "talarian-mcast4", { NULL }, 4018, "udp" }, - { "talarian-mcast5", { NULL }, 4019, "tcp" }, - { "talarian-mcast5", { NULL }, 4019, "udp" }, - { "trap", { NULL }, 4020, "tcp" }, - { "trap", { NULL }, 4020, "udp" }, - { "nexus-portal", { NULL }, 4021, "tcp" }, - { "nexus-portal", { NULL }, 4021, "udp" }, - { "dnox", { NULL }, 4022, "tcp" }, - { "dnox", { NULL }, 4022, "udp" }, - { "esnm-zoning", { NULL }, 4023, "tcp" }, - { "esnm-zoning", { NULL }, 4023, "udp" }, - { "tnp1-port", { NULL }, 4024, "tcp" }, - { "tnp1-port", { NULL }, 4024, "udp" }, - { "partimage", { NULL }, 4025, "tcp" }, - { "partimage", { NULL }, 4025, "udp" }, - { "as-debug", { NULL }, 4026, "tcp" }, - { "as-debug", { NULL }, 4026, "udp" }, - { "bxp", { NULL }, 4027, "tcp" }, - { "bxp", { NULL }, 4027, "udp" }, - { "dtserver-port", { NULL }, 4028, "tcp" }, - { "dtserver-port", { NULL }, 4028, "udp" }, - { "ip-qsig", { NULL }, 4029, "tcp" }, - { "ip-qsig", { NULL }, 4029, "udp" }, - { "jdmn-port", { NULL }, 4030, "tcp" }, - { "jdmn-port", { NULL }, 4030, "udp" }, - { "suucp", { NULL }, 4031, "tcp" }, - { "suucp", { NULL }, 4031, "udp" }, - { "vrts-auth-port", { NULL }, 4032, "tcp" }, - { "vrts-auth-port", { NULL }, 4032, "udp" }, - { "sanavigator", { NULL }, 4033, "tcp" }, - { "sanavigator", { NULL }, 4033, "udp" }, - { "ubxd", { NULL }, 4034, "tcp" }, - { "ubxd", { NULL }, 4034, "udp" }, - { "wap-push-http", { NULL }, 4035, "tcp" }, - { "wap-push-http", { NULL }, 4035, "udp" }, - { "wap-push-https", { NULL }, 4036, "tcp" }, - { "wap-push-https", { NULL }, 4036, "udp" }, - { "ravehd", { NULL }, 4037, "tcp" }, - { "ravehd", { NULL }, 4037, "udp" }, - { "fazzt-ptp", { NULL }, 4038, "tcp" }, - { "fazzt-ptp", { NULL }, 4038, "udp" }, - { "fazzt-admin", { NULL }, 4039, "tcp" }, - { "fazzt-admin", { NULL }, 4039, "udp" }, - { "yo-main", { NULL }, 4040, "tcp" }, - { "yo-main", { NULL }, 4040, "udp" }, - { "houston", { NULL }, 4041, "tcp" }, - { "houston", { NULL }, 4041, "udp" }, - { "ldxp", { NULL }, 4042, "tcp" }, - { "ldxp", { NULL }, 4042, "udp" }, - { "nirp", { NULL }, 4043, "tcp" }, - { "nirp", { NULL }, 4043, "udp" }, - { "ltp", { NULL }, 4044, "tcp" }, - { "ltp", { NULL }, 4044, "udp" }, - { "npp", { NULL }, 4045, "tcp" }, - { "npp", { NULL }, 4045, "udp" }, - { "acp-proto", { NULL }, 4046, "tcp" }, - { "acp-proto", { NULL }, 4046, "udp" }, - { "ctp-state", { NULL }, 4047, "tcp" }, - { "ctp-state", { NULL }, 4047, "udp" }, - { "wafs", { NULL }, 4049, "tcp" }, - { "wafs", { NULL }, 4049, "udp" }, - { "cisco-wafs", { NULL }, 4050, "tcp" }, - { "cisco-wafs", { NULL }, 4050, "udp" }, - { "cppdp", { NULL }, 4051, "tcp" }, - { "cppdp", { NULL }, 4051, "udp" }, - { "interact", { NULL }, 4052, "tcp" }, - { "interact", { NULL }, 4052, "udp" }, - { "ccu-comm-1", { NULL }, 4053, "tcp" }, - { "ccu-comm-1", { NULL }, 4053, "udp" }, - { "ccu-comm-2", { NULL }, 4054, "tcp" }, - { "ccu-comm-2", { NULL }, 4054, "udp" }, - { "ccu-comm-3", { NULL }, 4055, "tcp" }, - { "ccu-comm-3", { NULL }, 4055, "udp" }, - { "lms", { NULL }, 4056, "tcp" }, - { "lms", { NULL }, 4056, "udp" }, - { "wfm", { NULL }, 4057, "tcp" }, - { "wfm", { NULL }, 4057, "udp" }, - { "kingfisher", { NULL }, 4058, "tcp" }, - { "kingfisher", { NULL }, 4058, "udp" }, - { "dlms-cosem", { NULL }, 4059, "tcp" }, - { "dlms-cosem", { NULL }, 4059, "udp" }, - { "dsmeter_iatc", { NULL }, 4060, "tcp" }, - { "dsmeter_iatc", { NULL }, 4060, "udp" }, - { "ice-location", { NULL }, 4061, "tcp" }, - { "ice-location", { NULL }, 4061, "udp" }, - { "ice-slocation", { NULL }, 4062, "tcp" }, - { "ice-slocation", { NULL }, 4062, "udp" }, - { "ice-router", { NULL }, 4063, "tcp" }, - { "ice-router", { NULL }, 4063, "udp" }, - { "ice-srouter", { NULL }, 4064, "tcp" }, - { "ice-srouter", { NULL }, 4064, "udp" }, - { "avanti_cdp", { NULL }, 4065, "tcp" }, - { "avanti_cdp", { NULL }, 4065, "udp" }, - { "pmas", { NULL }, 4066, "tcp" }, - { "pmas", { NULL }, 4066, "udp" }, - { "idp", { NULL }, 4067, "tcp" }, - { "idp", { NULL }, 4067, "udp" }, - { "ipfltbcst", { NULL }, 4068, "tcp" }, - { "ipfltbcst", { NULL }, 4068, "udp" }, - { "minger", { NULL }, 4069, "tcp" }, - { "minger", { NULL }, 4069, "udp" }, - { "tripe", { NULL }, 4070, "tcp" }, - { "tripe", { NULL }, 4070, "udp" }, - { "aibkup", { NULL }, 4071, "tcp" }, - { "aibkup", { NULL }, 4071, "udp" }, - { "zieto-sock", { NULL }, 4072, "tcp" }, - { "zieto-sock", { NULL }, 4072, "udp" }, - { "iRAPP", { NULL }, 4073, "tcp" }, - { "iRAPP", { NULL }, 4073, "udp" }, - { "cequint-cityid", { NULL }, 4074, "tcp" }, - { "cequint-cityid", { NULL }, 4074, "udp" }, - { "perimlan", { NULL }, 4075, "tcp" }, - { "perimlan", { NULL }, 4075, "udp" }, - { "seraph", { NULL }, 4076, "tcp" }, - { "seraph", { NULL }, 4076, "udp" }, - { "ascomalarm", { NULL }, 4077, "udp" }, - { "cssp", { NULL }, 4078, "tcp" }, - { "santools", { NULL }, 4079, "tcp" }, - { "santools", { NULL }, 4079, "udp" }, - { "lorica-in", { NULL }, 4080, "tcp" }, - { "lorica-in", { NULL }, 4080, "udp" }, - { "lorica-in-sec", { NULL }, 4081, "tcp" }, - { "lorica-in-sec", { NULL }, 4081, "udp" }, - { "lorica-out", { NULL }, 4082, "tcp" }, - { "lorica-out", { NULL }, 4082, "udp" }, - { "lorica-out-sec", { NULL }, 4083, "tcp" }, - { "lorica-out-sec", { NULL }, 4083, "udp" }, - { "fortisphere-vm", { NULL }, 4084, "udp" }, - { "ezmessagesrv", { NULL }, 4085, "tcp" }, - { "ftsync", { NULL }, 4086, "udp" }, - { "applusservice", { NULL }, 4087, "tcp" }, - { "npsp", { NULL }, 4088, "tcp" }, - { "opencore", { NULL }, 4089, "tcp" }, - { "opencore", { NULL }, 4089, "udp" }, - { "omasgport", { NULL }, 4090, "tcp" }, - { "omasgport", { NULL }, 4090, "udp" }, - { "ewinstaller", { NULL }, 4091, "tcp" }, - { "ewinstaller", { NULL }, 4091, "udp" }, - { "ewdgs", { NULL }, 4092, "tcp" }, - { "ewdgs", { NULL }, 4092, "udp" }, - { "pvxpluscs", { NULL }, 4093, "tcp" }, - { "pvxpluscs", { NULL }, 4093, "udp" }, - { "sysrqd", { NULL }, 4094, "tcp" }, - { "sysrqd", { NULL }, 4094, "udp" }, - { "xtgui", { NULL }, 4095, "tcp" }, - { "xtgui", { NULL }, 4095, "udp" }, - { "bre", { NULL }, 4096, "tcp" }, - { "bre", { NULL }, 4096, "udp" }, - { "patrolview", { NULL }, 4097, "tcp" }, - { "patrolview", { NULL }, 4097, "udp" }, - { "drmsfsd", { NULL }, 4098, "tcp" }, - { "drmsfsd", { NULL }, 4098, "udp" }, - { "dpcp", { NULL }, 4099, "tcp" }, - { "dpcp", { NULL }, 4099, "udp" }, - { "igo-incognito", { NULL }, 4100, "tcp" }, - { "igo-incognito", { NULL }, 4100, "udp" }, - { "brlp-0", { NULL }, 4101, "tcp" }, - { "brlp-0", { NULL }, 4101, "udp" }, - { "brlp-1", { NULL }, 4102, "tcp" }, - { "brlp-1", { NULL }, 4102, "udp" }, - { "brlp-2", { NULL }, 4103, "tcp" }, - { "brlp-2", { NULL }, 4103, "udp" }, - { "brlp-3", { NULL }, 4104, "tcp" }, - { "brlp-3", { NULL }, 4104, "udp" }, - { "shofarplayer", { NULL }, 4105, "tcp" }, - { "shofarplayer", { NULL }, 4105, "udp" }, - { "synchronite", { NULL }, 4106, "tcp" }, - { "synchronite", { NULL }, 4106, "udp" }, - { "j-ac", { NULL }, 4107, "tcp" }, - { "j-ac", { NULL }, 4107, "udp" }, - { "accel", { NULL }, 4108, "tcp" }, - { "accel", { NULL }, 4108, "udp" }, - { "izm", { NULL }, 4109, "tcp" }, - { "izm", { NULL }, 4109, "udp" }, - { "g2tag", { NULL }, 4110, "tcp" }, - { "g2tag", { NULL }, 4110, "udp" }, - { "xgrid", { NULL }, 4111, "tcp" }, - { "xgrid", { NULL }, 4111, "udp" }, - { "apple-vpns-rp", { NULL }, 4112, "tcp" }, - { "apple-vpns-rp", { NULL }, 4112, "udp" }, - { "aipn-reg", { NULL }, 4113, "tcp" }, - { "aipn-reg", { NULL }, 4113, "udp" }, - { "jomamqmonitor", { NULL }, 4114, "tcp" }, - { "jomamqmonitor", { NULL }, 4114, "udp" }, - { "cds", { NULL }, 4115, "tcp" }, - { "cds", { NULL }, 4115, "udp" }, - { "smartcard-tls", { NULL }, 4116, "tcp" }, - { "smartcard-tls", { NULL }, 4116, "udp" }, - { "hillrserv", { NULL }, 4117, "tcp" }, - { "hillrserv", { NULL }, 4117, "udp" }, - { "netscript", { NULL }, 4118, "tcp" }, - { "netscript", { NULL }, 4118, "udp" }, - { "assuria-slm", { NULL }, 4119, "tcp" }, - { "assuria-slm", { NULL }, 4119, "udp" }, - { "e-builder", { NULL }, 4121, "tcp" }, - { "e-builder", { NULL }, 4121, "udp" }, - { "fprams", { NULL }, 4122, "tcp" }, - { "fprams", { NULL }, 4122, "udp" }, - { "z-wave", { NULL }, 4123, "tcp" }, - { "z-wave", { NULL }, 4123, "udp" }, - { "tigv2", { NULL }, 4124, "tcp" }, - { "tigv2", { NULL }, 4124, "udp" }, - { "opsview-envoy", { NULL }, 4125, "tcp" }, - { "opsview-envoy", { NULL }, 4125, "udp" }, - { "ddrepl", { NULL }, 4126, "tcp" }, - { "ddrepl", { NULL }, 4126, "udp" }, - { "unikeypro", { NULL }, 4127, "tcp" }, - { "unikeypro", { NULL }, 4127, "udp" }, - { "nufw", { NULL }, 4128, "tcp" }, - { "nufw", { NULL }, 4128, "udp" }, - { "nuauth", { NULL }, 4129, "tcp" }, - { "nuauth", { NULL }, 4129, "udp" }, - { "fronet", { NULL }, 4130, "tcp" }, - { "fronet", { NULL }, 4130, "udp" }, - { "stars", { NULL }, 4131, "tcp" }, - { "stars", { NULL }, 4131, "udp" }, - { "nuts_dem", { NULL }, 4132, "tcp" }, - { "nuts_dem", { NULL }, 4132, "udp" }, - { "nuts_bootp", { NULL }, 4133, "tcp" }, - { "nuts_bootp", { NULL }, 4133, "udp" }, - { "nifty-hmi", { NULL }, 4134, "tcp" }, - { "nifty-hmi", { NULL }, 4134, "udp" }, - { "cl-db-attach", { NULL }, 4135, "tcp" }, - { "cl-db-attach", { NULL }, 4135, "udp" }, - { "cl-db-request", { NULL }, 4136, "tcp" }, - { "cl-db-request", { NULL }, 4136, "udp" }, - { "cl-db-remote", { NULL }, 4137, "tcp" }, - { "cl-db-remote", { NULL }, 4137, "udp" }, - { "nettest", { NULL }, 4138, "tcp" }, - { "nettest", { NULL }, 4138, "udp" }, - { "thrtx", { NULL }, 4139, "tcp" }, - { "thrtx", { NULL }, 4139, "udp" }, - { "cedros_fds", { NULL }, 4140, "tcp" }, - { "cedros_fds", { NULL }, 4140, "udp" }, - { "oirtgsvc", { NULL }, 4141, "tcp" }, - { "oirtgsvc", { NULL }, 4141, "udp" }, - { "oidocsvc", { NULL }, 4142, "tcp" }, - { "oidocsvc", { NULL }, 4142, "udp" }, - { "oidsr", { NULL }, 4143, "tcp" }, - { "oidsr", { NULL }, 4143, "udp" }, - { "vvr-control", { NULL }, 4145, "tcp" }, - { "vvr-control", { NULL }, 4145, "udp" }, - { "tgcconnect", { NULL }, 4146, "tcp" }, - { "tgcconnect", { NULL }, 4146, "udp" }, - { "vrxpservman", { NULL }, 4147, "tcp" }, - { "vrxpservman", { NULL }, 4147, "udp" }, - { "hhb-handheld", { NULL }, 4148, "tcp" }, - { "hhb-handheld", { NULL }, 4148, "udp" }, - { "agslb", { NULL }, 4149, "tcp" }, - { "agslb", { NULL }, 4149, "udp" }, - { "PowerAlert-nsa", { NULL }, 4150, "tcp" }, - { "PowerAlert-nsa", { NULL }, 4150, "udp" }, - { "menandmice_noh", { NULL }, 4151, "tcp" }, - { "menandmice_noh", { NULL }, 4151, "udp" }, - { "idig_mux", { NULL }, 4152, "tcp" }, - { "idig_mux", { NULL }, 4152, "udp" }, - { "mbl-battd", { NULL }, 4153, "tcp" }, - { "mbl-battd", { NULL }, 4153, "udp" }, - { "atlinks", { NULL }, 4154, "tcp" }, - { "atlinks", { NULL }, 4154, "udp" }, - { "bzr", { NULL }, 4155, "tcp" }, - { "bzr", { NULL }, 4155, "udp" }, - { "stat-results", { NULL }, 4156, "tcp" }, - { "stat-results", { NULL }, 4156, "udp" }, - { "stat-scanner", { NULL }, 4157, "tcp" }, - { "stat-scanner", { NULL }, 4157, "udp" }, - { "stat-cc", { NULL }, 4158, "tcp" }, - { "stat-cc", { NULL }, 4158, "udp" }, - { "nss", { NULL }, 4159, "tcp" }, - { "nss", { NULL }, 4159, "udp" }, - { "jini-discovery", { NULL }, 4160, "tcp" }, - { "jini-discovery", { NULL }, 4160, "udp" }, - { "omscontact", { NULL }, 4161, "tcp" }, - { "omscontact", { NULL }, 4161, "udp" }, - { "omstopology", { NULL }, 4162, "tcp" }, - { "omstopology", { NULL }, 4162, "udp" }, - { "silverpeakpeer", { NULL }, 4163, "tcp" }, - { "silverpeakpeer", { NULL }, 4163, "udp" }, - { "silverpeakcomm", { NULL }, 4164, "tcp" }, - { "silverpeakcomm", { NULL }, 4164, "udp" }, - { "altcp", { NULL }, 4165, "tcp" }, - { "altcp", { NULL }, 4165, "udp" }, - { "joost", { NULL }, 4166, "tcp" }, - { "joost", { NULL }, 4166, "udp" }, - { "ddgn", { NULL }, 4167, "tcp" }, - { "ddgn", { NULL }, 4167, "udp" }, - { "pslicser", { NULL }, 4168, "tcp" }, - { "pslicser", { NULL }, 4168, "udp" }, - { "iadt", { NULL }, 4169, "tcp" }, - { "iadt-disc", { NULL }, 4169, "udp" }, - { "d-cinema-csp", { NULL }, 4170, "tcp" }, - { "ml-svnet", { NULL }, 4171, "tcp" }, - { "pcoip", { NULL }, 4172, "tcp" }, - { "pcoip", { NULL }, 4172, "udp" }, - { "smcluster", { NULL }, 4174, "tcp" }, - { "bccp", { NULL }, 4175, "tcp" }, - { "tl-ipcproxy", { NULL }, 4176, "tcp" }, - { "wello", { NULL }, 4177, "tcp" }, - { "wello", { NULL }, 4177, "udp" }, - { "storman", { NULL }, 4178, "tcp" }, - { "storman", { NULL }, 4178, "udp" }, - { "MaxumSP", { NULL }, 4179, "tcp" }, - { "MaxumSP", { NULL }, 4179, "udp" }, - { "httpx", { NULL }, 4180, "tcp" }, - { "httpx", { NULL }, 4180, "udp" }, - { "macbak", { NULL }, 4181, "tcp" }, - { "macbak", { NULL }, 4181, "udp" }, - { "pcptcpservice", { NULL }, 4182, "tcp" }, - { "pcptcpservice", { NULL }, 4182, "udp" }, - { "gmmp", { NULL }, 4183, "tcp" }, - { "gmmp", { NULL }, 4183, "udp" }, - { "universe_suite", { NULL }, 4184, "tcp" }, - { "universe_suite", { NULL }, 4184, "udp" }, - { "wcpp", { NULL }, 4185, "tcp" }, - { "wcpp", { NULL }, 4185, "udp" }, - { "boxbackupstore", { NULL }, 4186, "tcp" }, - { "csc_proxy", { NULL }, 4187, "tcp" }, - { "vatata", { NULL }, 4188, "tcp" }, - { "vatata", { NULL }, 4188, "udp" }, - { "pcep", { NULL }, 4189, "tcp" }, - { "sieve", { NULL }, 4190, "tcp" }, - { "dsmipv6", { NULL }, 4191, "udp" }, - { "azeti", { NULL }, 4192, "tcp" }, - { "azeti-bd", { NULL }, 4192, "udp" }, - { "pvxplusio", { NULL }, 4193, "tcp" }, - { "eims-admin", { NULL }, 4199, "tcp" }, - { "eims-admin", { NULL }, 4199, "udp" }, - { "corelccam", { NULL }, 4300, "tcp" }, - { "corelccam", { NULL }, 4300, "udp" }, - { "d-data", { NULL }, 4301, "tcp" }, - { "d-data", { NULL }, 4301, "udp" }, - { "d-data-control", { NULL }, 4302, "tcp" }, - { "d-data-control", { NULL }, 4302, "udp" }, - { "srcp", { NULL }, 4303, "tcp" }, - { "srcp", { NULL }, 4303, "udp" }, - { "owserver", { NULL }, 4304, "tcp" }, - { "owserver", { NULL }, 4304, "udp" }, - { "batman", { NULL }, 4305, "tcp" }, - { "batman", { NULL }, 4305, "udp" }, - { "pinghgl", { NULL }, 4306, "tcp" }, - { "pinghgl", { NULL }, 4306, "udp" }, - { "visicron-vs", { NULL }, 4307, "tcp" }, - { "visicron-vs", { NULL }, 4307, "udp" }, - { "compx-lockview", { NULL }, 4308, "tcp" }, - { "compx-lockview", { NULL }, 4308, "udp" }, - { "dserver", { NULL }, 4309, "tcp" }, - { "dserver", { NULL }, 4309, "udp" }, - { "mirrtex", { NULL }, 4310, "tcp" }, - { "mirrtex", { NULL }, 4310, "udp" }, - { "p6ssmc", { NULL }, 4311, "tcp" }, - { "pscl-mgt", { NULL }, 4312, "tcp" }, - { "perrla", { NULL }, 4313, "tcp" }, - { "fdt-rcatp", { NULL }, 4320, "tcp" }, - { "fdt-rcatp", { NULL }, 4320, "udp" }, - { "rwhois", { NULL }, 4321, "tcp" }, - { "rwhois", { NULL }, 4321, "udp" }, - { "trim-event", { NULL }, 4322, "tcp" }, - { "trim-event", { NULL }, 4322, "udp" }, - { "trim-ice", { NULL }, 4323, "tcp" }, - { "trim-ice", { NULL }, 4323, "udp" }, - { "balour", { NULL }, 4324, "tcp" }, - { "balour", { NULL }, 4324, "udp" }, - { "geognosisman", { NULL }, 4325, "tcp" }, - { "geognosisman", { NULL }, 4325, "udp" }, - { "geognosis", { NULL }, 4326, "tcp" }, - { "geognosis", { NULL }, 4326, "udp" }, - { "jaxer-web", { NULL }, 4327, "tcp" }, - { "jaxer-web", { NULL }, 4327, "udp" }, - { "jaxer-manager", { NULL }, 4328, "tcp" }, - { "jaxer-manager", { NULL }, 4328, "udp" }, - { "publiqare-sync", { NULL }, 4329, "tcp" }, - { "gaia", { NULL }, 4340, "tcp" }, - { "gaia", { NULL }, 4340, "udp" }, - { "lisp-data", { NULL }, 4341, "tcp" }, - { "lisp-data", { NULL }, 4341, "udp" }, - { "lisp-cons", { NULL }, 4342, "tcp" }, - { "lisp-control", { NULL }, 4342, "udp" }, - { "unicall", { NULL }, 4343, "tcp" }, - { "unicall", { NULL }, 4343, "udp" }, - { "vinainstall", { NULL }, 4344, "tcp" }, - { "vinainstall", { NULL }, 4344, "udp" }, - { "m4-network-as", { NULL }, 4345, "tcp" }, - { "m4-network-as", { NULL }, 4345, "udp" }, - { "elanlm", { NULL }, 4346, "tcp" }, - { "elanlm", { NULL }, 4346, "udp" }, - { "lansurveyor", { NULL }, 4347, "tcp" }, - { "lansurveyor", { NULL }, 4347, "udp" }, - { "itose", { NULL }, 4348, "tcp" }, - { "itose", { NULL }, 4348, "udp" }, - { "fsportmap", { NULL }, 4349, "tcp" }, - { "fsportmap", { NULL }, 4349, "udp" }, - { "net-device", { NULL }, 4350, "tcp" }, - { "net-device", { NULL }, 4350, "udp" }, - { "plcy-net-svcs", { NULL }, 4351, "tcp" }, - { "plcy-net-svcs", { NULL }, 4351, "udp" }, - { "pjlink", { NULL }, 4352, "tcp" }, - { "pjlink", { NULL }, 4352, "udp" }, - { "f5-iquery", { NULL }, 4353, "tcp" }, - { "f5-iquery", { NULL }, 4353, "udp" }, - { "qsnet-trans", { NULL }, 4354, "tcp" }, - { "qsnet-trans", { NULL }, 4354, "udp" }, - { "qsnet-workst", { NULL }, 4355, "tcp" }, - { "qsnet-workst", { NULL }, 4355, "udp" }, - { "qsnet-assist", { NULL }, 4356, "tcp" }, - { "qsnet-assist", { NULL }, 4356, "udp" }, - { "qsnet-cond", { NULL }, 4357, "tcp" }, - { "qsnet-cond", { NULL }, 4357, "udp" }, - { "qsnet-nucl", { NULL }, 4358, "tcp" }, - { "qsnet-nucl", { NULL }, 4358, "udp" }, - { "omabcastltkm", { NULL }, 4359, "tcp" }, - { "omabcastltkm", { NULL }, 4359, "udp" }, - { "matrix_vnet", { NULL }, 4360, "tcp" }, - { "nacnl", { NULL }, 4361, "udp" }, - { "afore-vdp-disc", { NULL }, 4362, "udp" }, - { "wxbrief", { NULL }, 4368, "tcp" }, - { "wxbrief", { NULL }, 4368, "udp" }, - { "epmd", { NULL }, 4369, "tcp" }, - { "epmd", { NULL }, 4369, "udp" }, - { "elpro_tunnel", { NULL }, 4370, "tcp" }, - { "elpro_tunnel", { NULL }, 4370, "udp" }, - { "l2c-control", { NULL }, 4371, "tcp" }, - { "l2c-disc", { NULL }, 4371, "udp" }, - { "l2c-data", { NULL }, 4372, "tcp" }, - { "l2c-data", { NULL }, 4372, "udp" }, - { "remctl", { NULL }, 4373, "tcp" }, - { "remctl", { NULL }, 4373, "udp" }, - { "psi-ptt", { NULL }, 4374, "tcp" }, - { "tolteces", { NULL }, 4375, "tcp" }, - { "tolteces", { NULL }, 4375, "udp" }, - { "bip", { NULL }, 4376, "tcp" }, - { "bip", { NULL }, 4376, "udp" }, - { "cp-spxsvr", { NULL }, 4377, "tcp" }, - { "cp-spxsvr", { NULL }, 4377, "udp" }, - { "cp-spxdpy", { NULL }, 4378, "tcp" }, - { "cp-spxdpy", { NULL }, 4378, "udp" }, - { "ctdb", { NULL }, 4379, "tcp" }, - { "ctdb", { NULL }, 4379, "udp" }, - { "xandros-cms", { NULL }, 4389, "tcp" }, - { "xandros-cms", { NULL }, 4389, "udp" }, - { "wiegand", { NULL }, 4390, "tcp" }, - { "wiegand", { NULL }, 4390, "udp" }, - { "apwi-imserver", { NULL }, 4391, "tcp" }, - { "apwi-rxserver", { NULL }, 4392, "tcp" }, - { "apwi-rxspooler", { NULL }, 4393, "tcp" }, - { "apwi-disc", { NULL }, 4394, "udp" }, - { "omnivisionesx", { NULL }, 4395, "tcp" }, - { "omnivisionesx", { NULL }, 4395, "udp" }, - { "fly", { NULL }, 4396, "tcp" }, - { "ds-srv", { NULL }, 4400, "tcp" }, - { "ds-srv", { NULL }, 4400, "udp" }, - { "ds-srvr", { NULL }, 4401, "tcp" }, - { "ds-srvr", { NULL }, 4401, "udp" }, - { "ds-clnt", { NULL }, 4402, "tcp" }, - { "ds-clnt", { NULL }, 4402, "udp" }, - { "ds-user", { NULL }, 4403, "tcp" }, - { "ds-user", { NULL }, 4403, "udp" }, - { "ds-admin", { NULL }, 4404, "tcp" }, - { "ds-admin", { NULL }, 4404, "udp" }, - { "ds-mail", { NULL }, 4405, "tcp" }, - { "ds-mail", { NULL }, 4405, "udp" }, - { "ds-slp", { NULL }, 4406, "tcp" }, - { "ds-slp", { NULL }, 4406, "udp" }, - { "nacagent", { NULL }, 4407, "tcp" }, - { "slscc", { NULL }, 4408, "tcp" }, - { "netcabinet-com", { NULL }, 4409, "tcp" }, - { "itwo-server", { NULL }, 4410, "tcp" }, - { "netrockey6", { NULL }, 4425, "tcp" }, - { "netrockey6", { NULL }, 4425, "udp" }, - { "beacon-port-2", { NULL }, 4426, "tcp" }, - { "beacon-port-2", { NULL }, 4426, "udp" }, - { "drizzle", { NULL }, 4427, "tcp" }, - { "omviserver", { NULL }, 4428, "tcp" }, - { "omviagent", { NULL }, 4429, "tcp" }, - { "rsqlserver", { NULL }, 4430, "tcp" }, - { "rsqlserver", { NULL }, 4430, "udp" }, - { "wspipe", { NULL }, 4431, "tcp" }, - { "netblox", { NULL }, 4441, "udp" }, - { "saris", { NULL }, 4442, "tcp" }, - { "saris", { NULL }, 4442, "udp" }, - { "pharos", { NULL }, 4443, "tcp" }, - { "pharos", { NULL }, 4443, "udp" }, - { "krb524", { NULL }, 4444, "tcp" }, - { "krb524", { NULL }, 4444, "udp" }, - { "nv-video", { NULL }, 4444, "tcp" }, - { "nv-video", { NULL }, 4444, "udp" }, - { "upnotifyp", { NULL }, 4445, "tcp" }, - { "upnotifyp", { NULL }, 4445, "udp" }, - { "n1-fwp", { NULL }, 4446, "tcp" }, - { "n1-fwp", { NULL }, 4446, "udp" }, - { "n1-rmgmt", { NULL }, 4447, "tcp" }, - { "n1-rmgmt", { NULL }, 4447, "udp" }, - { "asc-slmd", { NULL }, 4448, "tcp" }, - { "asc-slmd", { NULL }, 4448, "udp" }, - { "privatewire", { NULL }, 4449, "tcp" }, - { "privatewire", { NULL }, 4449, "udp" }, - { "camp", { NULL }, 4450, "tcp" }, - { "camp", { NULL }, 4450, "udp" }, - { "ctisystemmsg", { NULL }, 4451, "tcp" }, - { "ctisystemmsg", { NULL }, 4451, "udp" }, - { "ctiprogramload", { NULL }, 4452, "tcp" }, - { "ctiprogramload", { NULL }, 4452, "udp" }, - { "nssalertmgr", { NULL }, 4453, "tcp" }, - { "nssalertmgr", { NULL }, 4453, "udp" }, - { "nssagentmgr", { NULL }, 4454, "tcp" }, - { "nssagentmgr", { NULL }, 4454, "udp" }, - { "prchat-user", { NULL }, 4455, "tcp" }, - { "prchat-user", { NULL }, 4455, "udp" }, - { "prchat-server", { NULL }, 4456, "tcp" }, - { "prchat-server", { NULL }, 4456, "udp" }, - { "prRegister", { NULL }, 4457, "tcp" }, - { "prRegister", { NULL }, 4457, "udp" }, - { "mcp", { NULL }, 4458, "tcp" }, - { "mcp", { NULL }, 4458, "udp" }, - { "hpssmgmt", { NULL }, 4484, "tcp" }, - { "hpssmgmt", { NULL }, 4484, "udp" }, - { "assyst-dr", { NULL }, 4485, "tcp" }, - { "icms", { NULL }, 4486, "tcp" }, - { "icms", { NULL }, 4486, "udp" }, - { "prex-tcp", { NULL }, 4487, "tcp" }, - { "awacs-ice", { NULL }, 4488, "tcp" }, - { "awacs-ice", { NULL }, 4488, "udp" }, - { "ipsec-nat-t", { NULL }, 4500, "tcp" }, - { "ipsec-nat-t", { NULL }, 4500, "udp" }, - { "ehs", { NULL }, 4535, "tcp" }, - { "ehs", { NULL }, 4535, "udp" }, - { "ehs-ssl", { NULL }, 4536, "tcp" }, - { "ehs-ssl", { NULL }, 4536, "udp" }, - { "wssauthsvc", { NULL }, 4537, "tcp" }, - { "wssauthsvc", { NULL }, 4537, "udp" }, - { "swx-gate", { NULL }, 4538, "tcp" }, - { "swx-gate", { NULL }, 4538, "udp" }, - { "worldscores", { NULL }, 4545, "tcp" }, - { "worldscores", { NULL }, 4545, "udp" }, - { "sf-lm", { NULL }, 4546, "tcp" }, - { "sf-lm", { NULL }, 4546, "udp" }, - { "lanner-lm", { NULL }, 4547, "tcp" }, - { "lanner-lm", { NULL }, 4547, "udp" }, - { "synchromesh", { NULL }, 4548, "tcp" }, - { "synchromesh", { NULL }, 4548, "udp" }, - { "aegate", { NULL }, 4549, "tcp" }, - { "aegate", { NULL }, 4549, "udp" }, - { "gds-adppiw-db", { NULL }, 4550, "tcp" }, - { "gds-adppiw-db", { NULL }, 4550, "udp" }, - { "ieee-mih", { NULL }, 4551, "tcp" }, - { "ieee-mih", { NULL }, 4551, "udp" }, - { "menandmice-mon", { NULL }, 4552, "tcp" }, - { "menandmice-mon", { NULL }, 4552, "udp" }, - { "icshostsvc", { NULL }, 4553, "tcp" }, - { "msfrs", { NULL }, 4554, "tcp" }, - { "msfrs", { NULL }, 4554, "udp" }, - { "rsip", { NULL }, 4555, "tcp" }, - { "rsip", { NULL }, 4555, "udp" }, - { "dtn-bundle-tcp", { NULL }, 4556, "tcp" }, - { "dtn-bundle-udp", { NULL }, 4556, "udp" }, - { "mtcevrunqss", { NULL }, 4557, "udp" }, - { "mtcevrunqman", { NULL }, 4558, "udp" }, - { "hylafax", { NULL }, 4559, "tcp" }, - { "hylafax", { NULL }, 4559, "udp" }, - { "kwtc", { NULL }, 4566, "tcp" }, - { "kwtc", { NULL }, 4566, "udp" }, - { "tram", { NULL }, 4567, "tcp" }, - { "tram", { NULL }, 4567, "udp" }, - { "bmc-reporting", { NULL }, 4568, "tcp" }, - { "bmc-reporting", { NULL }, 4568, "udp" }, - { "iax", { NULL }, 4569, "tcp" }, - { "iax", { NULL }, 4569, "udp" }, - { "rid", { NULL }, 4590, "tcp" }, - { "l3t-at-an", { NULL }, 4591, "tcp" }, - { "l3t-at-an", { NULL }, 4591, "udp" }, - { "hrpd-ith-at-an", { NULL }, 4592, "udp" }, - { "ipt-anri-anri", { NULL }, 4593, "tcp" }, - { "ipt-anri-anri", { NULL }, 4593, "udp" }, - { "ias-session", { NULL }, 4594, "tcp" }, - { "ias-session", { NULL }, 4594, "udp" }, - { "ias-paging", { NULL }, 4595, "tcp" }, - { "ias-paging", { NULL }, 4595, "udp" }, - { "ias-neighbor", { NULL }, 4596, "tcp" }, - { "ias-neighbor", { NULL }, 4596, "udp" }, - { "a21-an-1xbs", { NULL }, 4597, "tcp" }, - { "a21-an-1xbs", { NULL }, 4597, "udp" }, - { "a16-an-an", { NULL }, 4598, "tcp" }, - { "a16-an-an", { NULL }, 4598, "udp" }, - { "a17-an-an", { NULL }, 4599, "tcp" }, - { "a17-an-an", { NULL }, 4599, "udp" }, - { "piranha1", { NULL }, 4600, "tcp" }, - { "piranha1", { NULL }, 4600, "udp" }, - { "piranha2", { NULL }, 4601, "tcp" }, - { "piranha2", { NULL }, 4601, "udp" }, - { "mtsserver", { NULL }, 4602, "tcp" }, - { "menandmice-upg", { NULL }, 4603, "tcp" }, - { "playsta2-app", { NULL }, 4658, "tcp" }, - { "playsta2-app", { NULL }, 4658, "udp" }, - { "playsta2-lob", { NULL }, 4659, "tcp" }, - { "playsta2-lob", { NULL }, 4659, "udp" }, - { "smaclmgr", { NULL }, 4660, "tcp" }, - { "smaclmgr", { NULL }, 4660, "udp" }, - { "kar2ouche", { NULL }, 4661, "tcp" }, - { "kar2ouche", { NULL }, 4661, "udp" }, - { "oms", { NULL }, 4662, "tcp" }, - { "oms", { NULL }, 4662, "udp" }, - { "noteit", { NULL }, 4663, "tcp" }, - { "noteit", { NULL }, 4663, "udp" }, - { "ems", { NULL }, 4664, "tcp" }, - { "ems", { NULL }, 4664, "udp" }, - { "contclientms", { NULL }, 4665, "tcp" }, - { "contclientms", { NULL }, 4665, "udp" }, - { "eportcomm", { NULL }, 4666, "tcp" }, - { "eportcomm", { NULL }, 4666, "udp" }, - { "mmacomm", { NULL }, 4667, "tcp" }, - { "mmacomm", { NULL }, 4667, "udp" }, - { "mmaeds", { NULL }, 4668, "tcp" }, - { "mmaeds", { NULL }, 4668, "udp" }, - { "eportcommdata", { NULL }, 4669, "tcp" }, - { "eportcommdata", { NULL }, 4669, "udp" }, - { "light", { NULL }, 4670, "tcp" }, - { "light", { NULL }, 4670, "udp" }, - { "acter", { NULL }, 4671, "tcp" }, - { "acter", { NULL }, 4671, "udp" }, - { "rfa", { NULL }, 4672, "tcp" }, - { "rfa", { NULL }, 4672, "udp" }, - { "cxws", { NULL }, 4673, "tcp" }, - { "cxws", { NULL }, 4673, "udp" }, - { "appiq-mgmt", { NULL }, 4674, "tcp" }, - { "appiq-mgmt", { NULL }, 4674, "udp" }, - { "dhct-status", { NULL }, 4675, "tcp" }, - { "dhct-status", { NULL }, 4675, "udp" }, - { "dhct-alerts", { NULL }, 4676, "tcp" }, - { "dhct-alerts", { NULL }, 4676, "udp" }, - { "bcs", { NULL }, 4677, "tcp" }, - { "bcs", { NULL }, 4677, "udp" }, - { "traversal", { NULL }, 4678, "tcp" }, - { "traversal", { NULL }, 4678, "udp" }, - { "mgesupervision", { NULL }, 4679, "tcp" }, - { "mgesupervision", { NULL }, 4679, "udp" }, - { "mgemanagement", { NULL }, 4680, "tcp" }, - { "mgemanagement", { NULL }, 4680, "udp" }, - { "parliant", { NULL }, 4681, "tcp" }, - { "parliant", { NULL }, 4681, "udp" }, - { "finisar", { NULL }, 4682, "tcp" }, - { "finisar", { NULL }, 4682, "udp" }, - { "spike", { NULL }, 4683, "tcp" }, - { "spike", { NULL }, 4683, "udp" }, - { "rfid-rp1", { NULL }, 4684, "tcp" }, - { "rfid-rp1", { NULL }, 4684, "udp" }, - { "autopac", { NULL }, 4685, "tcp" }, - { "autopac", { NULL }, 4685, "udp" }, - { "msp-os", { NULL }, 4686, "tcp" }, - { "msp-os", { NULL }, 4686, "udp" }, - { "nst", { NULL }, 4687, "tcp" }, - { "nst", { NULL }, 4687, "udp" }, - { "mobile-p2p", { NULL }, 4688, "tcp" }, - { "mobile-p2p", { NULL }, 4688, "udp" }, - { "altovacentral", { NULL }, 4689, "tcp" }, - { "altovacentral", { NULL }, 4689, "udp" }, - { "prelude", { NULL }, 4690, "tcp" }, - { "prelude", { NULL }, 4690, "udp" }, - { "mtn", { NULL }, 4691, "tcp" }, - { "mtn", { NULL }, 4691, "udp" }, - { "conspiracy", { NULL }, 4692, "tcp" }, - { "conspiracy", { NULL }, 4692, "udp" }, - { "netxms-agent", { NULL }, 4700, "tcp" }, - { "netxms-agent", { NULL }, 4700, "udp" }, - { "netxms-mgmt", { NULL }, 4701, "tcp" }, - { "netxms-mgmt", { NULL }, 4701, "udp" }, - { "netxms-sync", { NULL }, 4702, "tcp" }, - { "netxms-sync", { NULL }, 4702, "udp" }, - { "npqes-test", { NULL }, 4703, "tcp" }, - { "assuria-ins", { NULL }, 4704, "tcp" }, - { "truckstar", { NULL }, 4725, "tcp" }, - { "truckstar", { NULL }, 4725, "udp" }, - { "a26-fap-fgw", { NULL }, 4726, "udp" }, - { "fcis", { NULL }, 4727, "tcp" }, - { "fcis-disc", { NULL }, 4727, "udp" }, - { "capmux", { NULL }, 4728, "tcp" }, - { "capmux", { NULL }, 4728, "udp" }, - { "gsmtap", { NULL }, 4729, "udp" }, - { "gearman", { NULL }, 4730, "tcp" }, - { "gearman", { NULL }, 4730, "udp" }, - { "remcap", { NULL }, 4731, "tcp" }, - { "ohmtrigger", { NULL }, 4732, "udp" }, - { "resorcs", { NULL }, 4733, "tcp" }, - { "ipdr-sp", { NULL }, 4737, "tcp" }, - { "ipdr-sp", { NULL }, 4737, "udp" }, - { "solera-lpn", { NULL }, 4738, "tcp" }, - { "solera-lpn", { NULL }, 4738, "udp" }, - { "ipfix", { NULL }, 4739, "tcp" }, - { "ipfix", { NULL }, 4739, "udp" }, - { "ipfix", { NULL }, 4739, "sctp"}, - { "ipfixs", { NULL }, 4740, "tcp" }, - { "ipfixs", { NULL }, 4740, "sctp"}, - { "ipfixs", { NULL }, 4740, "udp" }, - { "lumimgrd", { NULL }, 4741, "tcp" }, - { "lumimgrd", { NULL }, 4741, "udp" }, - { "sicct", { NULL }, 4742, "tcp" }, - { "sicct-sdp", { NULL }, 4742, "udp" }, - { "openhpid", { NULL }, 4743, "tcp" }, - { "openhpid", { NULL }, 4743, "udp" }, - { "ifsp", { NULL }, 4744, "tcp" }, - { "ifsp", { NULL }, 4744, "udp" }, - { "fmp", { NULL }, 4745, "tcp" }, - { "fmp", { NULL }, 4745, "udp" }, - { "profilemac", { NULL }, 4749, "tcp" }, - { "profilemac", { NULL }, 4749, "udp" }, - { "ssad", { NULL }, 4750, "tcp" }, - { "ssad", { NULL }, 4750, "udp" }, - { "spocp", { NULL }, 4751, "tcp" }, - { "spocp", { NULL }, 4751, "udp" }, - { "snap", { NULL }, 4752, "tcp" }, - { "snap", { NULL }, 4752, "udp" }, - { "bfd-multi-ctl", { NULL }, 4784, "tcp" }, - { "bfd-multi-ctl", { NULL }, 4784, "udp" }, - { "cncp", { NULL }, 4785, "udp" }, - { "smart-install", { NULL }, 4786, "tcp" }, - { "sia-ctrl-plane", { NULL }, 4787, "tcp" }, - { "iims", { NULL }, 4800, "tcp" }, - { "iims", { NULL }, 4800, "udp" }, - { "iwec", { NULL }, 4801, "tcp" }, - { "iwec", { NULL }, 4801, "udp" }, - { "ilss", { NULL }, 4802, "tcp" }, - { "ilss", { NULL }, 4802, "udp" }, - { "notateit", { NULL }, 4803, "tcp" }, - { "notateit-disc", { NULL }, 4803, "udp" }, - { "aja-ntv4-disc", { NULL }, 4804, "udp" }, - { "htcp", { NULL }, 4827, "tcp" }, - { "htcp", { NULL }, 4827, "udp" }, - { "varadero-0", { NULL }, 4837, "tcp" }, - { "varadero-0", { NULL }, 4837, "udp" }, - { "varadero-1", { NULL }, 4838, "tcp" }, - { "varadero-1", { NULL }, 4838, "udp" }, - { "varadero-2", { NULL }, 4839, "tcp" }, - { "varadero-2", { NULL }, 4839, "udp" }, - { "opcua-tcp", { NULL }, 4840, "tcp" }, - { "opcua-udp", { NULL }, 4840, "udp" }, - { "quosa", { NULL }, 4841, "tcp" }, - { "quosa", { NULL }, 4841, "udp" }, - { "gw-asv", { NULL }, 4842, "tcp" }, - { "gw-asv", { NULL }, 4842, "udp" }, - { "opcua-tls", { NULL }, 4843, "tcp" }, - { "opcua-tls", { NULL }, 4843, "udp" }, - { "gw-log", { NULL }, 4844, "tcp" }, - { "gw-log", { NULL }, 4844, "udp" }, - { "wcr-remlib", { NULL }, 4845, "tcp" }, - { "wcr-remlib", { NULL }, 4845, "udp" }, - { "contamac_icm", { NULL }, 4846, "tcp" }, - { "contamac_icm", { NULL }, 4846, "udp" }, - { "wfc", { NULL }, 4847, "tcp" }, - { "wfc", { NULL }, 4847, "udp" }, - { "appserv-http", { NULL }, 4848, "tcp" }, - { "appserv-http", { NULL }, 4848, "udp" }, - { "appserv-https", { NULL }, 4849, "tcp" }, - { "appserv-https", { NULL }, 4849, "udp" }, - { "sun-as-nodeagt", { NULL }, 4850, "tcp" }, - { "sun-as-nodeagt", { NULL }, 4850, "udp" }, - { "derby-repli", { NULL }, 4851, "tcp" }, - { "derby-repli", { NULL }, 4851, "udp" }, - { "unify-debug", { NULL }, 4867, "tcp" }, - { "unify-debug", { NULL }, 4867, "udp" }, - { "phrelay", { NULL }, 4868, "tcp" }, - { "phrelay", { NULL }, 4868, "udp" }, - { "phrelaydbg", { NULL }, 4869, "tcp" }, - { "phrelaydbg", { NULL }, 4869, "udp" }, - { "cc-tracking", { NULL }, 4870, "tcp" }, - { "cc-tracking", { NULL }, 4870, "udp" }, - { "wired", { NULL }, 4871, "tcp" }, - { "wired", { NULL }, 4871, "udp" }, - { "tritium-can", { NULL }, 4876, "tcp" }, - { "tritium-can", { NULL }, 4876, "udp" }, - { "lmcs", { NULL }, 4877, "tcp" }, - { "lmcs", { NULL }, 4877, "udp" }, - { "inst-discovery", { NULL }, 4878, "udp" }, - { "wsdl-event", { NULL }, 4879, "tcp" }, - { "hislip", { NULL }, 4880, "tcp" }, - { "socp-t", { NULL }, 4881, "udp" }, - { "socp-c", { NULL }, 4882, "udp" }, - { "wmlserver", { NULL }, 4883, "tcp" }, - { "hivestor", { NULL }, 4884, "tcp" }, - { "hivestor", { NULL }, 4884, "udp" }, - { "abbs", { NULL }, 4885, "tcp" }, - { "abbs", { NULL }, 4885, "udp" }, - { "lyskom", { NULL }, 4894, "tcp" }, - { "lyskom", { NULL }, 4894, "udp" }, - { "radmin-port", { NULL }, 4899, "tcp" }, - { "radmin-port", { NULL }, 4899, "udp" }, - { "hfcs", { NULL }, 4900, "tcp" }, - { "hfcs", { NULL }, 4900, "udp" }, - { "flr_agent", { NULL }, 4901, "tcp" }, - { "magiccontrol", { NULL }, 4902, "tcp" }, - { "lutap", { NULL }, 4912, "tcp" }, - { "lutcp", { NULL }, 4913, "tcp" }, - { "bones", { NULL }, 4914, "tcp" }, - { "bones", { NULL }, 4914, "udp" }, - { "frcs", { NULL }, 4915, "tcp" }, - { "atsc-mh-ssc", { NULL }, 4937, "udp" }, - { "eq-office-4940", { NULL }, 4940, "tcp" }, - { "eq-office-4940", { NULL }, 4940, "udp" }, - { "eq-office-4941", { NULL }, 4941, "tcp" }, - { "eq-office-4941", { NULL }, 4941, "udp" }, - { "eq-office-4942", { NULL }, 4942, "tcp" }, - { "eq-office-4942", { NULL }, 4942, "udp" }, - { "munin", { NULL }, 4949, "tcp" }, - { "munin", { NULL }, 4949, "udp" }, - { "sybasesrvmon", { NULL }, 4950, "tcp" }, - { "sybasesrvmon", { NULL }, 4950, "udp" }, - { "pwgwims", { NULL }, 4951, "tcp" }, - { "pwgwims", { NULL }, 4951, "udp" }, - { "sagxtsds", { NULL }, 4952, "tcp" }, - { "sagxtsds", { NULL }, 4952, "udp" }, - { "dbsyncarbiter", { NULL }, 4953, "tcp" }, - { "ccss-qmm", { NULL }, 4969, "tcp" }, - { "ccss-qmm", { NULL }, 4969, "udp" }, - { "ccss-qsm", { NULL }, 4970, "tcp" }, - { "ccss-qsm", { NULL }, 4970, "udp" }, - { "webyast", { NULL }, 4984, "tcp" }, - { "gerhcs", { NULL }, 4985, "tcp" }, - { "mrip", { NULL }, 4986, "tcp" }, - { "mrip", { NULL }, 4986, "udp" }, - { "smar-se-port1", { NULL }, 4987, "tcp" }, - { "smar-se-port1", { NULL }, 4987, "udp" }, - { "smar-se-port2", { NULL }, 4988, "tcp" }, - { "smar-se-port2", { NULL }, 4988, "udp" }, - { "parallel", { NULL }, 4989, "tcp" }, - { "parallel", { NULL }, 4989, "udp" }, - { "busycal", { NULL }, 4990, "tcp" }, - { "busycal", { NULL }, 4990, "udp" }, - { "vrt", { NULL }, 4991, "tcp" }, - { "vrt", { NULL }, 4991, "udp" }, - { "hfcs-manager", { NULL }, 4999, "tcp" }, - { "hfcs-manager", { NULL }, 4999, "udp" }, - { "commplex-main", { NULL }, 5000, "tcp" }, - { "commplex-main", { NULL }, 5000, "udp" }, - { "commplex-link", { NULL }, 5001, "tcp" }, - { "commplex-link", { NULL }, 5001, "udp" }, - { "rfe", { NULL }, 5002, "tcp" }, - { "rfe", { NULL }, 5002, "udp" }, - { "fmpro-internal", { NULL }, 5003, "tcp" }, - { "fmpro-internal", { NULL }, 5003, "udp" }, - { "avt-profile-1", { NULL }, 5004, "tcp" }, - { "avt-profile-1", { NULL }, 5004, "udp" }, - { "avt-profile-1", { NULL }, 5004, "dccp"}, - { "avt-profile-2", { NULL }, 5005, "tcp" }, - { "avt-profile-2", { NULL }, 5005, "udp" }, - { "avt-profile-2", { NULL }, 5005, "dccp"}, - { "wsm-server", { NULL }, 5006, "tcp" }, - { "wsm-server", { NULL }, 5006, "udp" }, - { "wsm-server-ssl", { NULL }, 5007, "tcp" }, - { "wsm-server-ssl", { NULL }, 5007, "udp" }, - { "synapsis-edge", { NULL }, 5008, "tcp" }, - { "synapsis-edge", { NULL }, 5008, "udp" }, - { "winfs", { NULL }, 5009, "tcp" }, - { "winfs", { NULL }, 5009, "udp" }, - { "telelpathstart", { NULL }, 5010, "tcp" }, - { "telelpathstart", { NULL }, 5010, "udp" }, - { "telelpathattack", { NULL }, 5011, "tcp" }, - { "telelpathattack", { NULL }, 5011, "udp" }, - { "nsp", { NULL }, 5012, "tcp" }, - { "nsp", { NULL }, 5012, "udp" }, - { "fmpro-v6", { NULL }, 5013, "tcp" }, - { "fmpro-v6", { NULL }, 5013, "udp" }, - { "onpsocket", { NULL }, 5014, "udp" }, - { "fmwp", { NULL }, 5015, "tcp" }, - { "zenginkyo-1", { NULL }, 5020, "tcp" }, - { "zenginkyo-1", { NULL }, 5020, "udp" }, - { "zenginkyo-2", { NULL }, 5021, "tcp" }, - { "zenginkyo-2", { NULL }, 5021, "udp" }, - { "mice", { NULL }, 5022, "tcp" }, - { "mice", { NULL }, 5022, "udp" }, - { "htuilsrv", { NULL }, 5023, "tcp" }, - { "htuilsrv", { NULL }, 5023, "udp" }, - { "scpi-telnet", { NULL }, 5024, "tcp" }, - { "scpi-telnet", { NULL }, 5024, "udp" }, - { "scpi-raw", { NULL }, 5025, "tcp" }, - { "scpi-raw", { NULL }, 5025, "udp" }, - { "strexec-d", { NULL }, 5026, "tcp" }, - { "strexec-d", { NULL }, 5026, "udp" }, - { "strexec-s", { NULL }, 5027, "tcp" }, - { "strexec-s", { NULL }, 5027, "udp" }, - { "qvr", { NULL }, 5028, "tcp" }, - { "infobright", { NULL }, 5029, "tcp" }, - { "infobright", { NULL }, 5029, "udp" }, - { "surfpass", { NULL }, 5030, "tcp" }, - { "surfpass", { NULL }, 5030, "udp" }, - { "dmp", { NULL }, 5031, "udp" }, - { "asnaacceler8db", { NULL }, 5042, "tcp" }, - { "asnaacceler8db", { NULL }, 5042, "udp" }, - { "swxadmin", { NULL }, 5043, "tcp" }, - { "swxadmin", { NULL }, 5043, "udp" }, - { "lxi-evntsvc", { NULL }, 5044, "tcp" }, - { "lxi-evntsvc", { NULL }, 5044, "udp" }, - { "osp", { NULL }, 5045, "tcp" }, - { "vpm-udp", { NULL }, 5046, "udp" }, - { "iscape", { NULL }, 5047, "udp" }, - { "texai", { NULL }, 5048, "tcp" }, - { "ivocalize", { NULL }, 5049, "tcp" }, - { "ivocalize", { NULL }, 5049, "udp" }, - { "mmcc", { NULL }, 5050, "tcp" }, - { "mmcc", { NULL }, 5050, "udp" }, - { "ita-agent", { NULL }, 5051, "tcp" }, - { "ita-agent", { NULL }, 5051, "udp" }, - { "ita-manager", { NULL }, 5052, "tcp" }, - { "ita-manager", { NULL }, 5052, "udp" }, - { "rlm", { NULL }, 5053, "tcp" }, - { "rlm-admin", { NULL }, 5054, "tcp" }, - { "unot", { NULL }, 5055, "tcp" }, - { "unot", { NULL }, 5055, "udp" }, - { "intecom-ps1", { NULL }, 5056, "tcp" }, - { "intecom-ps1", { NULL }, 5056, "udp" }, - { "intecom-ps2", { NULL }, 5057, "tcp" }, - { "intecom-ps2", { NULL }, 5057, "udp" }, - { "locus-disc", { NULL }, 5058, "udp" }, - { "sds", { NULL }, 5059, "tcp" }, - { "sds", { NULL }, 5059, "udp" }, - { "sip", { NULL }, 5060, "tcp" }, - { "sip", { NULL }, 5060, "udp" }, - { "sip-tls", { NULL }, 5061, "tcp" }, - { "sip-tls", { NULL }, 5061, "udp" }, - { "na-localise", { NULL }, 5062, "tcp" }, - { "na-localise", { NULL }, 5062, "udp" }, - { "csrpc", { NULL }, 5063, "tcp" }, - { "ca-1", { NULL }, 5064, "tcp" }, - { "ca-1", { NULL }, 5064, "udp" }, - { "ca-2", { NULL }, 5065, "tcp" }, - { "ca-2", { NULL }, 5065, "udp" }, - { "stanag-5066", { NULL }, 5066, "tcp" }, - { "stanag-5066", { NULL }, 5066, "udp" }, - { "authentx", { NULL }, 5067, "tcp" }, - { "authentx", { NULL }, 5067, "udp" }, - { "bitforestsrv", { NULL }, 5068, "tcp" }, - { "i-net-2000-npr", { NULL }, 5069, "tcp" }, - { "i-net-2000-npr", { NULL }, 5069, "udp" }, - { "vtsas", { NULL }, 5070, "tcp" }, - { "vtsas", { NULL }, 5070, "udp" }, - { "powerschool", { NULL }, 5071, "tcp" }, - { "powerschool", { NULL }, 5071, "udp" }, - { "ayiya", { NULL }, 5072, "tcp" }, - { "ayiya", { NULL }, 5072, "udp" }, - { "tag-pm", { NULL }, 5073, "tcp" }, - { "tag-pm", { NULL }, 5073, "udp" }, - { "alesquery", { NULL }, 5074, "tcp" }, - { "alesquery", { NULL }, 5074, "udp" }, - { "cp-spxrpts", { NULL }, 5079, "udp" }, - { "onscreen", { NULL }, 5080, "tcp" }, - { "onscreen", { NULL }, 5080, "udp" }, - { "sdl-ets", { NULL }, 5081, "tcp" }, - { "sdl-ets", { NULL }, 5081, "udp" }, - { "qcp", { NULL }, 5082, "tcp" }, - { "qcp", { NULL }, 5082, "udp" }, - { "qfp", { NULL }, 5083, "tcp" }, - { "qfp", { NULL }, 5083, "udp" }, - { "llrp", { NULL }, 5084, "tcp" }, - { "llrp", { NULL }, 5084, "udp" }, - { "encrypted-llrp", { NULL }, 5085, "tcp" }, - { "encrypted-llrp", { NULL }, 5085, "udp" }, - { "aprigo-cs", { NULL }, 5086, "tcp" }, - { "car", { NULL }, 5090, "sctp"}, - { "cxtp", { NULL }, 5091, "sctp"}, - { "magpie", { NULL }, 5092, "udp" }, - { "sentinel-lm", { NULL }, 5093, "tcp" }, - { "sentinel-lm", { NULL }, 5093, "udp" }, - { "hart-ip", { NULL }, 5094, "tcp" }, - { "hart-ip", { NULL }, 5094, "udp" }, - { "sentlm-srv2srv", { NULL }, 5099, "tcp" }, - { "sentlm-srv2srv", { NULL }, 5099, "udp" }, - { "socalia", { NULL }, 5100, "tcp" }, - { "socalia", { NULL }, 5100, "udp" }, - { "talarian-tcp", { NULL }, 5101, "tcp" }, - { "talarian-udp", { NULL }, 5101, "udp" }, - { "oms-nonsecure", { NULL }, 5102, "tcp" }, - { "oms-nonsecure", { NULL }, 5102, "udp" }, - { "actifio-c2c", { NULL }, 5103, "tcp" }, - { "tinymessage", { NULL }, 5104, "udp" }, - { "hughes-ap", { NULL }, 5105, "udp" }, - { "taep-as-svc", { NULL }, 5111, "tcp" }, - { "taep-as-svc", { NULL }, 5111, "udp" }, - { "pm-cmdsvr", { NULL }, 5112, "tcp" }, - { "pm-cmdsvr", { NULL }, 5112, "udp" }, - { "ev-services", { NULL }, 5114, "tcp" }, - { "autobuild", { NULL }, 5115, "tcp" }, - { "emb-proj-cmd", { NULL }, 5116, "udp" }, - { "gradecam", { NULL }, 5117, "tcp" }, - { "nbt-pc", { NULL }, 5133, "tcp" }, - { "nbt-pc", { NULL }, 5133, "udp" }, - { "ppactivation", { NULL }, 5134, "tcp" }, - { "erp-scale", { NULL }, 5135, "tcp" }, - { "minotaur-sa", { NULL }, 5136, "udp" }, - { "ctsd", { NULL }, 5137, "tcp" }, - { "ctsd", { NULL }, 5137, "udp" }, - { "rmonitor_secure", { NULL }, 5145, "tcp" }, - { "rmonitor_secure", { NULL }, 5145, "udp" }, - { "social-alarm", { NULL }, 5146, "tcp" }, - { "atmp", { NULL }, 5150, "tcp" }, - { "atmp", { NULL }, 5150, "udp" }, - { "esri_sde", { NULL }, 5151, "tcp" }, - { "esri_sde", { NULL }, 5151, "udp" }, - { "sde-discovery", { NULL }, 5152, "tcp" }, - { "sde-discovery", { NULL }, 5152, "udp" }, - { "toruxserver", { NULL }, 5153, "tcp" }, - { "bzflag", { NULL }, 5154, "tcp" }, - { "bzflag", { NULL }, 5154, "udp" }, - { "asctrl-agent", { NULL }, 5155, "tcp" }, - { "asctrl-agent", { NULL }, 5155, "udp" }, - { "rugameonline", { NULL }, 5156, "tcp" }, - { "mediat", { NULL }, 5157, "tcp" }, - { "snmpssh", { NULL }, 5161, "tcp" }, - { "snmpssh-trap", { NULL }, 5162, "tcp" }, - { "sbackup", { NULL }, 5163, "tcp" }, - { "vpa", { NULL }, 5164, "tcp" }, - { "vpa-disc", { NULL }, 5164, "udp" }, - { "ife_icorp", { NULL }, 5165, "tcp" }, - { "ife_icorp", { NULL }, 5165, "udp" }, - { "winpcs", { NULL }, 5166, "tcp" }, - { "winpcs", { NULL }, 5166, "udp" }, - { "scte104", { NULL }, 5167, "tcp" }, - { "scte104", { NULL }, 5167, "udp" }, - { "scte30", { NULL }, 5168, "tcp" }, - { "scte30", { NULL }, 5168, "udp" }, - { "aol", { NULL }, 5190, "tcp" }, - { "aol", { NULL }, 5190, "udp" }, - { "aol-1", { NULL }, 5191, "tcp" }, - { "aol-1", { NULL }, 5191, "udp" }, - { "aol-2", { NULL }, 5192, "tcp" }, - { "aol-2", { NULL }, 5192, "udp" }, - { "aol-3", { NULL }, 5193, "tcp" }, - { "aol-3", { NULL }, 5193, "udp" }, - { "cpscomm", { NULL }, 5194, "tcp" }, - { "targus-getdata", { NULL }, 5200, "tcp" }, - { "targus-getdata", { NULL }, 5200, "udp" }, - { "targus-getdata1", { NULL }, 5201, "tcp" }, - { "targus-getdata1", { NULL }, 5201, "udp" }, - { "targus-getdata2", { NULL }, 5202, "tcp" }, - { "targus-getdata2", { NULL }, 5202, "udp" }, - { "targus-getdata3", { NULL }, 5203, "tcp" }, - { "targus-getdata3", { NULL }, 5203, "udp" }, - { "3exmp", { NULL }, 5221, "tcp" }, - { "xmpp-client", { NULL }, 5222, "tcp" }, - { "hpvirtgrp", { NULL }, 5223, "tcp" }, - { "hpvirtgrp", { NULL }, 5223, "udp" }, - { "hpvirtctrl", { NULL }, 5224, "tcp" }, - { "hpvirtctrl", { NULL }, 5224, "udp" }, - { "hp-server", { NULL }, 5225, "tcp" }, - { "hp-server", { NULL }, 5225, "udp" }, - { "hp-status", { NULL }, 5226, "tcp" }, - { "hp-status", { NULL }, 5226, "udp" }, - { "perfd", { NULL }, 5227, "tcp" }, - { "perfd", { NULL }, 5227, "udp" }, - { "hpvroom", { NULL }, 5228, "tcp" }, - { "csedaemon", { NULL }, 5232, "tcp" }, - { "enfs", { NULL }, 5233, "tcp" }, - { "eenet", { NULL }, 5234, "tcp" }, - { "eenet", { NULL }, 5234, "udp" }, - { "galaxy-network", { NULL }, 5235, "tcp" }, - { "galaxy-network", { NULL }, 5235, "udp" }, - { "padl2sim", { NULL }, 5236, "tcp" }, - { "padl2sim", { NULL }, 5236, "udp" }, - { "mnet-discovery", { NULL }, 5237, "tcp" }, - { "mnet-discovery", { NULL }, 5237, "udp" }, - { "downtools", { NULL }, 5245, "tcp" }, - { "downtools-disc", { NULL }, 5245, "udp" }, - { "capwap-control", { NULL }, 5246, "udp" }, - { "capwap-data", { NULL }, 5247, "udp" }, - { "caacws", { NULL }, 5248, "tcp" }, - { "caacws", { NULL }, 5248, "udp" }, - { "caaclang2", { NULL }, 5249, "tcp" }, - { "caaclang2", { NULL }, 5249, "udp" }, - { "soagateway", { NULL }, 5250, "tcp" }, - { "soagateway", { NULL }, 5250, "udp" }, - { "caevms", { NULL }, 5251, "tcp" }, - { "caevms", { NULL }, 5251, "udp" }, - { "movaz-ssc", { NULL }, 5252, "tcp" }, - { "movaz-ssc", { NULL }, 5252, "udp" }, - { "kpdp", { NULL }, 5253, "tcp" }, - { "3com-njack-1", { NULL }, 5264, "tcp" }, - { "3com-njack-1", { NULL }, 5264, "udp" }, - { "3com-njack-2", { NULL }, 5265, "tcp" }, - { "3com-njack-2", { NULL }, 5265, "udp" }, - { "xmpp-server", { NULL }, 5269, "tcp" }, - { "xmp", { NULL }, 5270, "tcp" }, - { "xmp", { NULL }, 5270, "udp" }, - { "cuelink", { NULL }, 5271, "tcp" }, - { "cuelink-disc", { NULL }, 5271, "udp" }, - { "pk", { NULL }, 5272, "tcp" }, - { "pk", { NULL }, 5272, "udp" }, - { "xmpp-bosh", { NULL }, 5280, "tcp" }, - { "undo-lm", { NULL }, 5281, "tcp" }, - { "transmit-port", { NULL }, 5282, "tcp" }, - { "transmit-port", { NULL }, 5282, "udp" }, - { "presence", { NULL }, 5298, "tcp" }, - { "presence", { NULL }, 5298, "udp" }, - { "nlg-data", { NULL }, 5299, "tcp" }, - { "nlg-data", { NULL }, 5299, "udp" }, - { "hacl-hb", { NULL }, 5300, "tcp" }, - { "hacl-hb", { NULL }, 5300, "udp" }, - { "hacl-gs", { NULL }, 5301, "tcp" }, - { "hacl-gs", { NULL }, 5301, "udp" }, - { "hacl-cfg", { NULL }, 5302, "tcp" }, - { "hacl-cfg", { NULL }, 5302, "udp" }, - { "hacl-probe", { NULL }, 5303, "tcp" }, - { "hacl-probe", { NULL }, 5303, "udp" }, - { "hacl-local", { NULL }, 5304, "tcp" }, - { "hacl-local", { NULL }, 5304, "udp" }, - { "hacl-test", { NULL }, 5305, "tcp" }, - { "hacl-test", { NULL }, 5305, "udp" }, - { "sun-mc-grp", { NULL }, 5306, "tcp" }, - { "sun-mc-grp", { NULL }, 5306, "udp" }, - { "sco-aip", { NULL }, 5307, "tcp" }, - { "sco-aip", { NULL }, 5307, "udp" }, - { "cfengine", { NULL }, 5308, "tcp" }, - { "cfengine", { NULL }, 5308, "udp" }, - { "jprinter", { NULL }, 5309, "tcp" }, - { "jprinter", { NULL }, 5309, "udp" }, - { "outlaws", { NULL }, 5310, "tcp" }, - { "outlaws", { NULL }, 5310, "udp" }, - { "permabit-cs", { NULL }, 5312, "tcp" }, - { "permabit-cs", { NULL }, 5312, "udp" }, - { "rrdp", { NULL }, 5313, "tcp" }, - { "rrdp", { NULL }, 5313, "udp" }, - { "opalis-rbt-ipc", { NULL }, 5314, "tcp" }, - { "opalis-rbt-ipc", { NULL }, 5314, "udp" }, - { "hacl-poll", { NULL }, 5315, "tcp" }, - { "hacl-poll", { NULL }, 5315, "udp" }, - { "hpdevms", { NULL }, 5316, "tcp" }, - { "hpdevms", { NULL }, 5316, "udp" }, - { "bsfserver-zn", { NULL }, 5320, "tcp" }, - { "bsfsvr-zn-ssl", { NULL }, 5321, "tcp" }, - { "kfserver", { NULL }, 5343, "tcp" }, - { "kfserver", { NULL }, 5343, "udp" }, - { "xkotodrcp", { NULL }, 5344, "tcp" }, - { "xkotodrcp", { NULL }, 5344, "udp" }, - { "stuns", { NULL }, 5349, "tcp" }, - { "stuns", { NULL }, 5349, "udp" }, - { "turns", { NULL }, 5349, "tcp" }, - { "turns", { NULL }, 5349, "udp" }, - { "stun-behaviors", { NULL }, 5349, "tcp" }, - { "stun-behaviors", { NULL }, 5349, "udp" }, - { "nat-pmp-status", { NULL }, 5350, "tcp" }, - { "nat-pmp-status", { NULL }, 5350, "udp" }, - { "nat-pmp", { NULL }, 5351, "tcp" }, - { "nat-pmp", { NULL }, 5351, "udp" }, - { "dns-llq", { NULL }, 5352, "tcp" }, - { "dns-llq", { NULL }, 5352, "udp" }, - { "mdns", { NULL }, 5353, "tcp" }, - { "mdns", { NULL }, 5353, "udp" }, - { "mdnsresponder", { NULL }, 5354, "tcp" }, - { "mdnsresponder", { NULL }, 5354, "udp" }, - { "llmnr", { NULL }, 5355, "tcp" }, - { "llmnr", { NULL }, 5355, "udp" }, - { "ms-smlbiz", { NULL }, 5356, "tcp" }, - { "ms-smlbiz", { NULL }, 5356, "udp" }, - { "wsdapi", { NULL }, 5357, "tcp" }, - { "wsdapi", { NULL }, 5357, "udp" }, - { "wsdapi-s", { NULL }, 5358, "tcp" }, - { "wsdapi-s", { NULL }, 5358, "udp" }, - { "ms-alerter", { NULL }, 5359, "tcp" }, - { "ms-alerter", { NULL }, 5359, "udp" }, - { "ms-sideshow", { NULL }, 5360, "tcp" }, - { "ms-sideshow", { NULL }, 5360, "udp" }, - { "ms-s-sideshow", { NULL }, 5361, "tcp" }, - { "ms-s-sideshow", { NULL }, 5361, "udp" }, - { "serverwsd2", { NULL }, 5362, "tcp" }, - { "serverwsd2", { NULL }, 5362, "udp" }, - { "net-projection", { NULL }, 5363, "tcp" }, - { "net-projection", { NULL }, 5363, "udp" }, - { "stresstester", { NULL }, 5397, "tcp" }, - { "stresstester", { NULL }, 5397, "udp" }, - { "elektron-admin", { NULL }, 5398, "tcp" }, - { "elektron-admin", { NULL }, 5398, "udp" }, - { "securitychase", { NULL }, 5399, "tcp" }, - { "securitychase", { NULL }, 5399, "udp" }, - { "excerpt", { NULL }, 5400, "tcp" }, - { "excerpt", { NULL }, 5400, "udp" }, - { "excerpts", { NULL }, 5401, "tcp" }, - { "excerpts", { NULL }, 5401, "udp" }, - { "mftp", { NULL }, 5402, "tcp" }, - { "mftp", { NULL }, 5402, "udp" }, - { "hpoms-ci-lstn", { NULL }, 5403, "tcp" }, - { "hpoms-ci-lstn", { NULL }, 5403, "udp" }, - { "hpoms-dps-lstn", { NULL }, 5404, "tcp" }, - { "hpoms-dps-lstn", { NULL }, 5404, "udp" }, - { "netsupport", { NULL }, 5405, "tcp" }, - { "netsupport", { NULL }, 5405, "udp" }, - { "systemics-sox", { NULL }, 5406, "tcp" }, - { "systemics-sox", { NULL }, 5406, "udp" }, - { "foresyte-clear", { NULL }, 5407, "tcp" }, - { "foresyte-clear", { NULL }, 5407, "udp" }, - { "foresyte-sec", { NULL }, 5408, "tcp" }, - { "foresyte-sec", { NULL }, 5408, "udp" }, - { "salient-dtasrv", { NULL }, 5409, "tcp" }, - { "salient-dtasrv", { NULL }, 5409, "udp" }, - { "salient-usrmgr", { NULL }, 5410, "tcp" }, - { "salient-usrmgr", { NULL }, 5410, "udp" }, - { "actnet", { NULL }, 5411, "tcp" }, - { "actnet", { NULL }, 5411, "udp" }, - { "continuus", { NULL }, 5412, "tcp" }, - { "continuus", { NULL }, 5412, "udp" }, - { "wwiotalk", { NULL }, 5413, "tcp" }, - { "wwiotalk", { NULL }, 5413, "udp" }, - { "statusd", { NULL }, 5414, "tcp" }, - { "statusd", { NULL }, 5414, "udp" }, - { "ns-server", { NULL }, 5415, "tcp" }, - { "ns-server", { NULL }, 5415, "udp" }, - { "sns-gateway", { NULL }, 5416, "tcp" }, - { "sns-gateway", { NULL }, 5416, "udp" }, - { "sns-agent", { NULL }, 5417, "tcp" }, - { "sns-agent", { NULL }, 5417, "udp" }, - { "mcntp", { NULL }, 5418, "tcp" }, - { "mcntp", { NULL }, 5418, "udp" }, - { "dj-ice", { NULL }, 5419, "tcp" }, - { "dj-ice", { NULL }, 5419, "udp" }, - { "cylink-c", { NULL }, 5420, "tcp" }, - { "cylink-c", { NULL }, 5420, "udp" }, - { "netsupport2", { NULL }, 5421, "tcp" }, - { "netsupport2", { NULL }, 5421, "udp" }, - { "salient-mux", { NULL }, 5422, "tcp" }, - { "salient-mux", { NULL }, 5422, "udp" }, - { "virtualuser", { NULL }, 5423, "tcp" }, - { "virtualuser", { NULL }, 5423, "udp" }, - { "beyond-remote", { NULL }, 5424, "tcp" }, - { "beyond-remote", { NULL }, 5424, "udp" }, - { "br-channel", { NULL }, 5425, "tcp" }, - { "br-channel", { NULL }, 5425, "udp" }, - { "devbasic", { NULL }, 5426, "tcp" }, - { "devbasic", { NULL }, 5426, "udp" }, - { "sco-peer-tta", { NULL }, 5427, "tcp" }, - { "sco-peer-tta", { NULL }, 5427, "udp" }, - { "telaconsole", { NULL }, 5428, "tcp" }, - { "telaconsole", { NULL }, 5428, "udp" }, - { "base", { NULL }, 5429, "tcp" }, - { "base", { NULL }, 5429, "udp" }, - { "radec-corp", { NULL }, 5430, "tcp" }, - { "radec-corp", { NULL }, 5430, "udp" }, - { "park-agent", { NULL }, 5431, "tcp" }, - { "park-agent", { NULL }, 5431, "udp" }, - { "postgresql", { NULL }, 5432, "tcp" }, - { "postgresql", { NULL }, 5432, "udp" }, - { "pyrrho", { NULL }, 5433, "tcp" }, - { "pyrrho", { NULL }, 5433, "udp" }, - { "sgi-arrayd", { NULL }, 5434, "tcp" }, - { "sgi-arrayd", { NULL }, 5434, "udp" }, - { "sceanics", { NULL }, 5435, "tcp" }, - { "sceanics", { NULL }, 5435, "udp" }, - { "pmip6-cntl", { NULL }, 5436, "udp" }, - { "pmip6-data", { NULL }, 5437, "udp" }, - { "spss", { NULL }, 5443, "tcp" }, - { "spss", { NULL }, 5443, "udp" }, - { "surebox", { NULL }, 5453, "tcp" }, - { "surebox", { NULL }, 5453, "udp" }, - { "apc-5454", { NULL }, 5454, "tcp" }, - { "apc-5454", { NULL }, 5454, "udp" }, - { "apc-5455", { NULL }, 5455, "tcp" }, - { "apc-5455", { NULL }, 5455, "udp" }, - { "apc-5456", { NULL }, 5456, "tcp" }, - { "apc-5456", { NULL }, 5456, "udp" }, - { "silkmeter", { NULL }, 5461, "tcp" }, - { "silkmeter", { NULL }, 5461, "udp" }, - { "ttl-publisher", { NULL }, 5462, "tcp" }, - { "ttl-publisher", { NULL }, 5462, "udp" }, - { "ttlpriceproxy", { NULL }, 5463, "tcp" }, - { "ttlpriceproxy", { NULL }, 5463, "udp" }, - { "quailnet", { NULL }, 5464, "tcp" }, - { "quailnet", { NULL }, 5464, "udp" }, - { "netops-broker", { NULL }, 5465, "tcp" }, - { "netops-broker", { NULL }, 5465, "udp" }, - { "fcp-addr-srvr1", { NULL }, 5500, "tcp" }, - { "fcp-addr-srvr1", { NULL }, 5500, "udp" }, - { "fcp-addr-srvr2", { NULL }, 5501, "tcp" }, - { "fcp-addr-srvr2", { NULL }, 5501, "udp" }, - { "fcp-srvr-inst1", { NULL }, 5502, "tcp" }, - { "fcp-srvr-inst1", { NULL }, 5502, "udp" }, - { "fcp-srvr-inst2", { NULL }, 5503, "tcp" }, - { "fcp-srvr-inst2", { NULL }, 5503, "udp" }, - { "fcp-cics-gw1", { NULL }, 5504, "tcp" }, - { "fcp-cics-gw1", { NULL }, 5504, "udp" }, - { "checkoutdb", { NULL }, 5505, "tcp" }, - { "checkoutdb", { NULL }, 5505, "udp" }, - { "amc", { NULL }, 5506, "tcp" }, - { "amc", { NULL }, 5506, "udp" }, - { "sgi-eventmond", { NULL }, 5553, "tcp" }, - { "sgi-eventmond", { NULL }, 5553, "udp" }, - { "sgi-esphttp", { NULL }, 5554, "tcp" }, - { "sgi-esphttp", { NULL }, 5554, "udp" }, - { "personal-agent", { NULL }, 5555, "tcp" }, - { "personal-agent", { NULL }, 5555, "udp" }, - { "freeciv", { NULL }, 5556, "tcp" }, - { "freeciv", { NULL }, 5556, "udp" }, - { "farenet", { NULL }, 5557, "tcp" }, - { "westec-connect", { NULL }, 5566, "tcp" }, - { "m-oap", { NULL }, 5567, "tcp" }, - { "m-oap", { NULL }, 5567, "udp" }, - { "sdt", { NULL }, 5568, "tcp" }, - { "sdt", { NULL }, 5568, "udp" }, - { "sdmmp", { NULL }, 5573, "tcp" }, - { "sdmmp", { NULL }, 5573, "udp" }, - { "lsi-bobcat", { NULL }, 5574, "tcp" }, - { "ora-oap", { NULL }, 5575, "tcp" }, - { "fdtracks", { NULL }, 5579, "tcp" }, - { "tmosms0", { NULL }, 5580, "tcp" }, - { "tmosms0", { NULL }, 5580, "udp" }, - { "tmosms1", { NULL }, 5581, "tcp" }, - { "tmosms1", { NULL }, 5581, "udp" }, - { "fac-restore", { NULL }, 5582, "tcp" }, - { "fac-restore", { NULL }, 5582, "udp" }, - { "tmo-icon-sync", { NULL }, 5583, "tcp" }, - { "tmo-icon-sync", { NULL }, 5583, "udp" }, - { "bis-web", { NULL }, 5584, "tcp" }, - { "bis-web", { NULL }, 5584, "udp" }, - { "bis-sync", { NULL }, 5585, "tcp" }, - { "bis-sync", { NULL }, 5585, "udp" }, - { "ininmessaging", { NULL }, 5597, "tcp" }, - { "ininmessaging", { NULL }, 5597, "udp" }, - { "mctfeed", { NULL }, 5598, "tcp" }, - { "mctfeed", { NULL }, 5598, "udp" }, - { "esinstall", { NULL }, 5599, "tcp" }, - { "esinstall", { NULL }, 5599, "udp" }, - { "esmmanager", { NULL }, 5600, "tcp" }, - { "esmmanager", { NULL }, 5600, "udp" }, - { "esmagent", { NULL }, 5601, "tcp" }, - { "esmagent", { NULL }, 5601, "udp" }, - { "a1-msc", { NULL }, 5602, "tcp" }, - { "a1-msc", { NULL }, 5602, "udp" }, - { "a1-bs", { NULL }, 5603, "tcp" }, - { "a1-bs", { NULL }, 5603, "udp" }, - { "a3-sdunode", { NULL }, 5604, "tcp" }, - { "a3-sdunode", { NULL }, 5604, "udp" }, - { "a4-sdunode", { NULL }, 5605, "tcp" }, - { "a4-sdunode", { NULL }, 5605, "udp" }, - { "ninaf", { NULL }, 5627, "tcp" }, - { "ninaf", { NULL }, 5627, "udp" }, - { "htrust", { NULL }, 5628, "tcp" }, - { "htrust", { NULL }, 5628, "udp" }, - { "symantec-sfdb", { NULL }, 5629, "tcp" }, - { "symantec-sfdb", { NULL }, 5629, "udp" }, - { "precise-comm", { NULL }, 5630, "tcp" }, - { "precise-comm", { NULL }, 5630, "udp" }, - { "pcanywheredata", { NULL }, 5631, "tcp" }, - { "pcanywheredata", { NULL }, 5631, "udp" }, - { "pcanywherestat", { NULL }, 5632, "tcp" }, - { "pcanywherestat", { NULL }, 5632, "udp" }, - { "beorl", { NULL }, 5633, "tcp" }, - { "beorl", { NULL }, 5633, "udp" }, - { "xprtld", { NULL }, 5634, "tcp" }, - { "xprtld", { NULL }, 5634, "udp" }, - { "sfmsso", { NULL }, 5635, "tcp" }, - { "sfm-db-server", { NULL }, 5636, "tcp" }, - { "cssc", { NULL }, 5637, "tcp" }, - { "amqps", { NULL }, 5671, "tcp" }, - { "amqps", { NULL }, 5671, "udp" }, - { "amqp", { NULL }, 5672, "tcp" }, - { "amqp", { NULL }, 5672, "udp" }, - { "amqp", { NULL }, 5672, "sctp"}, - { "jms", { NULL }, 5673, "tcp" }, - { "jms", { NULL }, 5673, "udp" }, - { "hyperscsi-port", { NULL }, 5674, "tcp" }, - { "hyperscsi-port", { NULL }, 5674, "udp" }, - { "v5ua", { NULL }, 5675, "tcp" }, - { "v5ua", { NULL }, 5675, "udp" }, - { "v5ua", { NULL }, 5675, "sctp"}, - { "raadmin", { NULL }, 5676, "tcp" }, - { "raadmin", { NULL }, 5676, "udp" }, - { "questdb2-lnchr", { NULL }, 5677, "tcp" }, - { "questdb2-lnchr", { NULL }, 5677, "udp" }, - { "rrac", { NULL }, 5678, "tcp" }, - { "rrac", { NULL }, 5678, "udp" }, - { "dccm", { NULL }, 5679, "tcp" }, - { "dccm", { NULL }, 5679, "udp" }, - { "auriga-router", { NULL }, 5680, "tcp" }, - { "auriga-router", { NULL }, 5680, "udp" }, - { "ncxcp", { NULL }, 5681, "tcp" }, - { "ncxcp", { NULL }, 5681, "udp" }, - { "brightcore", { NULL }, 5682, "udp" }, - { "ggz", { NULL }, 5688, "tcp" }, - { "ggz", { NULL }, 5688, "udp" }, - { "qmvideo", { NULL }, 5689, "tcp" }, - { "qmvideo", { NULL }, 5689, "udp" }, - { "proshareaudio", { NULL }, 5713, "tcp" }, - { "proshareaudio", { NULL }, 5713, "udp" }, - { "prosharevideo", { NULL }, 5714, "tcp" }, - { "prosharevideo", { NULL }, 5714, "udp" }, - { "prosharedata", { NULL }, 5715, "tcp" }, - { "prosharedata", { NULL }, 5715, "udp" }, - { "prosharerequest", { NULL }, 5716, "tcp" }, - { "prosharerequest", { NULL }, 5716, "udp" }, - { "prosharenotify", { NULL }, 5717, "tcp" }, - { "prosharenotify", { NULL }, 5717, "udp" }, - { "dpm", { NULL }, 5718, "tcp" }, - { "dpm", { NULL }, 5718, "udp" }, - { "dpm-agent", { NULL }, 5719, "tcp" }, - { "dpm-agent", { NULL }, 5719, "udp" }, - { "ms-licensing", { NULL }, 5720, "tcp" }, - { "ms-licensing", { NULL }, 5720, "udp" }, - { "dtpt", { NULL }, 5721, "tcp" }, - { "dtpt", { NULL }, 5721, "udp" }, - { "msdfsr", { NULL }, 5722, "tcp" }, - { "msdfsr", { NULL }, 5722, "udp" }, - { "omhs", { NULL }, 5723, "tcp" }, - { "omhs", { NULL }, 5723, "udp" }, - { "omsdk", { NULL }, 5724, "tcp" }, - { "omsdk", { NULL }, 5724, "udp" }, - { "ms-ilm", { NULL }, 5725, "tcp" }, - { "ms-ilm-sts", { NULL }, 5726, "tcp" }, - { "asgenf", { NULL }, 5727, "tcp" }, - { "io-dist-data", { NULL }, 5728, "tcp" }, - { "io-dist-group", { NULL }, 5728, "udp" }, - { "openmail", { NULL }, 5729, "tcp" }, - { "openmail", { NULL }, 5729, "udp" }, - { "unieng", { NULL }, 5730, "tcp" }, - { "unieng", { NULL }, 5730, "udp" }, - { "ida-discover1", { NULL }, 5741, "tcp" }, - { "ida-discover1", { NULL }, 5741, "udp" }, - { "ida-discover2", { NULL }, 5742, "tcp" }, - { "ida-discover2", { NULL }, 5742, "udp" }, - { "watchdoc-pod", { NULL }, 5743, "tcp" }, - { "watchdoc-pod", { NULL }, 5743, "udp" }, - { "watchdoc", { NULL }, 5744, "tcp" }, - { "watchdoc", { NULL }, 5744, "udp" }, - { "fcopy-server", { NULL }, 5745, "tcp" }, - { "fcopy-server", { NULL }, 5745, "udp" }, - { "fcopys-server", { NULL }, 5746, "tcp" }, - { "fcopys-server", { NULL }, 5746, "udp" }, - { "tunatic", { NULL }, 5747, "tcp" }, - { "tunatic", { NULL }, 5747, "udp" }, - { "tunalyzer", { NULL }, 5748, "tcp" }, - { "tunalyzer", { NULL }, 5748, "udp" }, - { "rscd", { NULL }, 5750, "tcp" }, - { "rscd", { NULL }, 5750, "udp" }, - { "openmailg", { NULL }, 5755, "tcp" }, - { "openmailg", { NULL }, 5755, "udp" }, - { "x500ms", { NULL }, 5757, "tcp" }, - { "x500ms", { NULL }, 5757, "udp" }, - { "openmailns", { NULL }, 5766, "tcp" }, - { "openmailns", { NULL }, 5766, "udp" }, - { "s-openmail", { NULL }, 5767, "tcp" }, - { "s-openmail", { NULL }, 5767, "udp" }, - { "openmailpxy", { NULL }, 5768, "tcp" }, - { "openmailpxy", { NULL }, 5768, "udp" }, - { "spramsca", { NULL }, 5769, "tcp" }, - { "spramsca", { NULL }, 5769, "udp" }, - { "spramsd", { NULL }, 5770, "tcp" }, - { "spramsd", { NULL }, 5770, "udp" }, - { "netagent", { NULL }, 5771, "tcp" }, - { "netagent", { NULL }, 5771, "udp" }, - { "dali-port", { NULL }, 5777, "tcp" }, - { "dali-port", { NULL }, 5777, "udp" }, - { "vts-rpc", { NULL }, 5780, "tcp" }, - { "3par-evts", { NULL }, 5781, "tcp" }, - { "3par-evts", { NULL }, 5781, "udp" }, - { "3par-mgmt", { NULL }, 5782, "tcp" }, - { "3par-mgmt", { NULL }, 5782, "udp" }, - { "3par-mgmt-ssl", { NULL }, 5783, "tcp" }, - { "3par-mgmt-ssl", { NULL }, 5783, "udp" }, - { "ibar", { NULL }, 5784, "udp" }, - { "3par-rcopy", { NULL }, 5785, "tcp" }, - { "3par-rcopy", { NULL }, 5785, "udp" }, - { "cisco-redu", { NULL }, 5786, "udp" }, - { "waascluster", { NULL }, 5787, "udp" }, - { "xtreamx", { NULL }, 5793, "tcp" }, - { "xtreamx", { NULL }, 5793, "udp" }, - { "spdp", { NULL }, 5794, "udp" }, - { "icmpd", { NULL }, 5813, "tcp" }, - { "icmpd", { NULL }, 5813, "udp" }, - { "spt-automation", { NULL }, 5814, "tcp" }, - { "spt-automation", { NULL }, 5814, "udp" }, - { "wherehoo", { NULL }, 5859, "tcp" }, - { "wherehoo", { NULL }, 5859, "udp" }, - { "ppsuitemsg", { NULL }, 5863, "tcp" }, - { "ppsuitemsg", { NULL }, 5863, "udp" }, - { "rfb", { NULL }, 5900, "tcp" }, - { "rfb", { NULL }, 5900, "udp" }, - { "cm", { NULL }, 5910, "tcp" }, - { "cm", { NULL }, 5910, "udp" }, - { "cpdlc", { NULL }, 5911, "tcp" }, - { "cpdlc", { NULL }, 5911, "udp" }, - { "fis", { NULL }, 5912, "tcp" }, - { "fis", { NULL }, 5912, "udp" }, - { "ads-c", { NULL }, 5913, "tcp" }, - { "ads-c", { NULL }, 5913, "udp" }, - { "indy", { NULL }, 5963, "tcp" }, - { "indy", { NULL }, 5963, "udp" }, - { "mppolicy-v5", { NULL }, 5968, "tcp" }, - { "mppolicy-v5", { NULL }, 5968, "udp" }, - { "mppolicy-mgr", { NULL }, 5969, "tcp" }, - { "mppolicy-mgr", { NULL }, 5969, "udp" }, - { "couchdb", { NULL }, 5984, "tcp" }, - { "couchdb", { NULL }, 5984, "udp" }, - { "wsman", { NULL }, 5985, "tcp" }, - { "wsman", { NULL }, 5985, "udp" }, - { "wsmans", { NULL }, 5986, "tcp" }, - { "wsmans", { NULL }, 5986, "udp" }, - { "wbem-rmi", { NULL }, 5987, "tcp" }, - { "wbem-rmi", { NULL }, 5987, "udp" }, - { "wbem-http", { NULL }, 5988, "tcp" }, - { "wbem-http", { NULL }, 5988, "udp" }, - { "wbem-https", { NULL }, 5989, "tcp" }, - { "wbem-https", { NULL }, 5989, "udp" }, - { "wbem-exp-https", { NULL }, 5990, "tcp" }, - { "wbem-exp-https", { NULL }, 5990, "udp" }, - { "nuxsl", { NULL }, 5991, "tcp" }, - { "nuxsl", { NULL }, 5991, "udp" }, - { "consul-insight", { NULL }, 5992, "tcp" }, - { "consul-insight", { NULL }, 5992, "udp" }, - { "cvsup", { NULL }, 5999, "tcp" }, - { "cvsup", { NULL }, 5999, "udp" }, - { "ndl-ahp-svc", { NULL }, 6064, "tcp" }, - { "ndl-ahp-svc", { NULL }, 6064, "udp" }, - { "winpharaoh", { NULL }, 6065, "tcp" }, - { "winpharaoh", { NULL }, 6065, "udp" }, - { "ewctsp", { NULL }, 6066, "tcp" }, - { "ewctsp", { NULL }, 6066, "udp" }, - { "gsmp", { NULL }, 6068, "tcp" }, - { "gsmp", { NULL }, 6068, "udp" }, - { "trip", { NULL }, 6069, "tcp" }, - { "trip", { NULL }, 6069, "udp" }, - { "messageasap", { NULL }, 6070, "tcp" }, - { "messageasap", { NULL }, 6070, "udp" }, - { "ssdtp", { NULL }, 6071, "tcp" }, - { "ssdtp", { NULL }, 6071, "udp" }, - { "diagnose-proc", { NULL }, 6072, "tcp" }, - { "diagnose-proc", { NULL }, 6072, "udp" }, - { "directplay8", { NULL }, 6073, "tcp" }, - { "directplay8", { NULL }, 6073, "udp" }, - { "max", { NULL }, 6074, "tcp" }, - { "max", { NULL }, 6074, "udp" }, - { "dpm-acm", { NULL }, 6075, "tcp" }, - { "miami-bcast", { NULL }, 6083, "udp" }, - { "p2p-sip", { NULL }, 6084, "tcp" }, - { "konspire2b", { NULL }, 6085, "tcp" }, - { "konspire2b", { NULL }, 6085, "udp" }, - { "pdtp", { NULL }, 6086, "tcp" }, - { "pdtp", { NULL }, 6086, "udp" }, - { "ldss", { NULL }, 6087, "tcp" }, - { "ldss", { NULL }, 6087, "udp" }, - { "raxa-mgmt", { NULL }, 6099, "tcp" }, - { "synchronet-db", { NULL }, 6100, "tcp" }, - { "synchronet-db", { NULL }, 6100, "udp" }, - { "synchronet-rtc", { NULL }, 6101, "tcp" }, - { "synchronet-rtc", { NULL }, 6101, "udp" }, - { "synchronet-upd", { NULL }, 6102, "tcp" }, - { "synchronet-upd", { NULL }, 6102, "udp" }, - { "rets", { NULL }, 6103, "tcp" }, - { "rets", { NULL }, 6103, "udp" }, - { "dbdb", { NULL }, 6104, "tcp" }, - { "dbdb", { NULL }, 6104, "udp" }, - { "primaserver", { NULL }, 6105, "tcp" }, - { "primaserver", { NULL }, 6105, "udp" }, - { "mpsserver", { NULL }, 6106, "tcp" }, - { "mpsserver", { NULL }, 6106, "udp" }, - { "etc-control", { NULL }, 6107, "tcp" }, - { "etc-control", { NULL }, 6107, "udp" }, - { "sercomm-scadmin", { NULL }, 6108, "tcp" }, - { "sercomm-scadmin", { NULL }, 6108, "udp" }, - { "globecast-id", { NULL }, 6109, "tcp" }, - { "globecast-id", { NULL }, 6109, "udp" }, - { "softcm", { NULL }, 6110, "tcp" }, - { "softcm", { NULL }, 6110, "udp" }, - { "spc", { NULL }, 6111, "tcp" }, - { "spc", { NULL }, 6111, "udp" }, - { "dtspcd", { NULL }, 6112, "tcp" }, - { "dtspcd", { NULL }, 6112, "udp" }, - { "dayliteserver", { NULL }, 6113, "tcp" }, - { "wrspice", { NULL }, 6114, "tcp" }, - { "xic", { NULL }, 6115, "tcp" }, - { "xtlserv", { NULL }, 6116, "tcp" }, - { "daylitetouch", { NULL }, 6117, "tcp" }, - { "spdy", { NULL }, 6121, "tcp" }, - { "bex-webadmin", { NULL }, 6122, "tcp" }, - { "bex-webadmin", { NULL }, 6122, "udp" }, - { "backup-express", { NULL }, 6123, "tcp" }, - { "backup-express", { NULL }, 6123, "udp" }, - { "pnbs", { NULL }, 6124, "tcp" }, - { "pnbs", { NULL }, 6124, "udp" }, - { "nbt-wol", { NULL }, 6133, "tcp" }, - { "nbt-wol", { NULL }, 6133, "udp" }, - { "pulsonixnls", { NULL }, 6140, "tcp" }, - { "pulsonixnls", { NULL }, 6140, "udp" }, - { "meta-corp", { NULL }, 6141, "tcp" }, - { "meta-corp", { NULL }, 6141, "udp" }, - { "aspentec-lm", { NULL }, 6142, "tcp" }, - { "aspentec-lm", { NULL }, 6142, "udp" }, - { "watershed-lm", { NULL }, 6143, "tcp" }, - { "watershed-lm", { NULL }, 6143, "udp" }, - { "statsci1-lm", { NULL }, 6144, "tcp" }, - { "statsci1-lm", { NULL }, 6144, "udp" }, - { "statsci2-lm", { NULL }, 6145, "tcp" }, - { "statsci2-lm", { NULL }, 6145, "udp" }, - { "lonewolf-lm", { NULL }, 6146, "tcp" }, - { "lonewolf-lm", { NULL }, 6146, "udp" }, - { "montage-lm", { NULL }, 6147, "tcp" }, - { "montage-lm", { NULL }, 6147, "udp" }, - { "ricardo-lm", { NULL }, 6148, "tcp" }, - { "ricardo-lm", { NULL }, 6148, "udp" }, - { "tal-pod", { NULL }, 6149, "tcp" }, - { "tal-pod", { NULL }, 6149, "udp" }, - { "efb-aci", { NULL }, 6159, "tcp" }, - { "patrol-ism", { NULL }, 6161, "tcp" }, - { "patrol-ism", { NULL }, 6161, "udp" }, - { "patrol-coll", { NULL }, 6162, "tcp" }, - { "patrol-coll", { NULL }, 6162, "udp" }, - { "pscribe", { NULL }, 6163, "tcp" }, - { "pscribe", { NULL }, 6163, "udp" }, - { "lm-x", { NULL }, 6200, "tcp" }, - { "lm-x", { NULL }, 6200, "udp" }, - { "radmind", { NULL }, 6222, "tcp" }, - { "radmind", { NULL }, 6222, "udp" }, - { "jeol-nsdtp-1", { NULL }, 6241, "tcp" }, - { "jeol-nsddp-1", { NULL }, 6241, "udp" }, - { "jeol-nsdtp-2", { NULL }, 6242, "tcp" }, - { "jeol-nsddp-2", { NULL }, 6242, "udp" }, - { "jeol-nsdtp-3", { NULL }, 6243, "tcp" }, - { "jeol-nsddp-3", { NULL }, 6243, "udp" }, - { "jeol-nsdtp-4", { NULL }, 6244, "tcp" }, - { "jeol-nsddp-4", { NULL }, 6244, "udp" }, - { "tl1-raw-ssl", { NULL }, 6251, "tcp" }, - { "tl1-raw-ssl", { NULL }, 6251, "udp" }, - { "tl1-ssh", { NULL }, 6252, "tcp" }, - { "tl1-ssh", { NULL }, 6252, "udp" }, - { "crip", { NULL }, 6253, "tcp" }, - { "crip", { NULL }, 6253, "udp" }, - { "gld", { NULL }, 6267, "tcp" }, - { "grid", { NULL }, 6268, "tcp" }, - { "grid", { NULL }, 6268, "udp" }, - { "grid-alt", { NULL }, 6269, "tcp" }, - { "grid-alt", { NULL }, 6269, "udp" }, - { "bmc-grx", { NULL }, 6300, "tcp" }, - { "bmc-grx", { NULL }, 6300, "udp" }, - { "bmc_ctd_ldap", { NULL }, 6301, "tcp" }, - { "bmc_ctd_ldap", { NULL }, 6301, "udp" }, - { "ufmp", { NULL }, 6306, "tcp" }, - { "ufmp", { NULL }, 6306, "udp" }, - { "scup", { NULL }, 6315, "tcp" }, - { "scup-disc", { NULL }, 6315, "udp" }, - { "abb-escp", { NULL }, 6316, "tcp" }, - { "abb-escp", { NULL }, 6316, "udp" }, - { "repsvc", { NULL }, 6320, "tcp" }, - { "repsvc", { NULL }, 6320, "udp" }, - { "emp-server1", { NULL }, 6321, "tcp" }, - { "emp-server1", { NULL }, 6321, "udp" }, - { "emp-server2", { NULL }, 6322, "tcp" }, - { "emp-server2", { NULL }, 6322, "udp" }, - { "sflow", { NULL }, 6343, "tcp" }, - { "sflow", { NULL }, 6343, "udp" }, - { "gnutella-svc", { NULL }, 6346, "tcp" }, - { "gnutella-svc", { NULL }, 6346, "udp" }, - { "gnutella-rtr", { NULL }, 6347, "tcp" }, - { "gnutella-rtr", { NULL }, 6347, "udp" }, - { "adap", { NULL }, 6350, "tcp" }, - { "adap", { NULL }, 6350, "udp" }, - { "pmcs", { NULL }, 6355, "tcp" }, - { "pmcs", { NULL }, 6355, "udp" }, - { "metaedit-mu", { NULL }, 6360, "tcp" }, - { "metaedit-mu", { NULL }, 6360, "udp" }, - { "metaedit-se", { NULL }, 6370, "tcp" }, - { "metaedit-se", { NULL }, 6370, "udp" }, - { "metatude-mds", { NULL }, 6382, "tcp" }, - { "metatude-mds", { NULL }, 6382, "udp" }, - { "clariion-evr01", { NULL }, 6389, "tcp" }, - { "clariion-evr01", { NULL }, 6389, "udp" }, - { "metaedit-ws", { NULL }, 6390, "tcp" }, - { "metaedit-ws", { NULL }, 6390, "udp" }, - { "faxcomservice", { NULL }, 6417, "tcp" }, - { "faxcomservice", { NULL }, 6417, "udp" }, - { "syserverremote", { NULL }, 6418, "tcp" }, - { "svdrp", { NULL }, 6419, "tcp" }, - { "nim-vdrshell", { NULL }, 6420, "tcp" }, - { "nim-vdrshell", { NULL }, 6420, "udp" }, - { "nim-wan", { NULL }, 6421, "tcp" }, - { "nim-wan", { NULL }, 6421, "udp" }, - { "pgbouncer", { NULL }, 6432, "tcp" }, - { "sun-sr-https", { NULL }, 6443, "tcp" }, - { "sun-sr-https", { NULL }, 6443, "udp" }, - { "sge_qmaster", { NULL }, 6444, "tcp" }, - { "sge_qmaster", { NULL }, 6444, "udp" }, - { "sge_execd", { NULL }, 6445, "tcp" }, - { "sge_execd", { NULL }, 6445, "udp" }, - { "mysql-proxy", { NULL }, 6446, "tcp" }, - { "mysql-proxy", { NULL }, 6446, "udp" }, - { "skip-cert-recv", { NULL }, 6455, "tcp" }, - { "skip-cert-send", { NULL }, 6456, "udp" }, - { "lvision-lm", { NULL }, 6471, "tcp" }, - { "lvision-lm", { NULL }, 6471, "udp" }, - { "sun-sr-http", { NULL }, 6480, "tcp" }, - { "sun-sr-http", { NULL }, 6480, "udp" }, - { "servicetags", { NULL }, 6481, "tcp" }, - { "servicetags", { NULL }, 6481, "udp" }, - { "ldoms-mgmt", { NULL }, 6482, "tcp" }, - { "ldoms-mgmt", { NULL }, 6482, "udp" }, - { "SunVTS-RMI", { NULL }, 6483, "tcp" }, - { "SunVTS-RMI", { NULL }, 6483, "udp" }, - { "sun-sr-jms", { NULL }, 6484, "tcp" }, - { "sun-sr-jms", { NULL }, 6484, "udp" }, - { "sun-sr-iiop", { NULL }, 6485, "tcp" }, - { "sun-sr-iiop", { NULL }, 6485, "udp" }, - { "sun-sr-iiops", { NULL }, 6486, "tcp" }, - { "sun-sr-iiops", { NULL }, 6486, "udp" }, - { "sun-sr-iiop-aut", { NULL }, 6487, "tcp" }, - { "sun-sr-iiop-aut", { NULL }, 6487, "udp" }, - { "sun-sr-jmx", { NULL }, 6488, "tcp" }, - { "sun-sr-jmx", { NULL }, 6488, "udp" }, - { "sun-sr-admin", { NULL }, 6489, "tcp" }, - { "sun-sr-admin", { NULL }, 6489, "udp" }, - { "boks", { NULL }, 6500, "tcp" }, - { "boks", { NULL }, 6500, "udp" }, - { "boks_servc", { NULL }, 6501, "tcp" }, - { "boks_servc", { NULL }, 6501, "udp" }, - { "boks_servm", { NULL }, 6502, "tcp" }, - { "boks_servm", { NULL }, 6502, "udp" }, - { "boks_clntd", { NULL }, 6503, "tcp" }, - { "boks_clntd", { NULL }, 6503, "udp" }, - { "badm_priv", { NULL }, 6505, "tcp" }, - { "badm_priv", { NULL }, 6505, "udp" }, - { "badm_pub", { NULL }, 6506, "tcp" }, - { "badm_pub", { NULL }, 6506, "udp" }, - { "bdir_priv", { NULL }, 6507, "tcp" }, - { "bdir_priv", { NULL }, 6507, "udp" }, - { "bdir_pub", { NULL }, 6508, "tcp" }, - { "bdir_pub", { NULL }, 6508, "udp" }, - { "mgcs-mfp-port", { NULL }, 6509, "tcp" }, - { "mgcs-mfp-port", { NULL }, 6509, "udp" }, - { "mcer-port", { NULL }, 6510, "tcp" }, - { "mcer-port", { NULL }, 6510, "udp" }, - { "netconf-tls", { NULL }, 6513, "tcp" }, - { "syslog-tls", { NULL }, 6514, "tcp" }, - { "syslog-tls", { NULL }, 6514, "udp" }, - { "syslog-tls", { NULL }, 6514, "dccp"}, - { "elipse-rec", { NULL }, 6515, "tcp" }, - { "elipse-rec", { NULL }, 6515, "udp" }, - { "lds-distrib", { NULL }, 6543, "tcp" }, - { "lds-distrib", { NULL }, 6543, "udp" }, - { "lds-dump", { NULL }, 6544, "tcp" }, - { "lds-dump", { NULL }, 6544, "udp" }, - { "apc-6547", { NULL }, 6547, "tcp" }, - { "apc-6547", { NULL }, 6547, "udp" }, - { "apc-6548", { NULL }, 6548, "tcp" }, - { "apc-6548", { NULL }, 6548, "udp" }, - { "apc-6549", { NULL }, 6549, "tcp" }, - { "apc-6549", { NULL }, 6549, "udp" }, - { "fg-sysupdate", { NULL }, 6550, "tcp" }, - { "fg-sysupdate", { NULL }, 6550, "udp" }, - { "sum", { NULL }, 6551, "tcp" }, - { "sum", { NULL }, 6551, "udp" }, - { "xdsxdm", { NULL }, 6558, "tcp" }, - { "xdsxdm", { NULL }, 6558, "udp" }, - { "sane-port", { NULL }, 6566, "tcp" }, - { "sane-port", { NULL }, 6566, "udp" }, - { "esp", { NULL }, 6567, "tcp" }, - { "esp", { NULL }, 6567, "udp" }, - { "canit_store", { NULL }, 6568, "tcp" }, - { "rp-reputation", { NULL }, 6568, "udp" }, - { "affiliate", { NULL }, 6579, "tcp" }, - { "affiliate", { NULL }, 6579, "udp" }, - { "parsec-master", { NULL }, 6580, "tcp" }, - { "parsec-master", { NULL }, 6580, "udp" }, - { "parsec-peer", { NULL }, 6581, "tcp" }, - { "parsec-peer", { NULL }, 6581, "udp" }, - { "parsec-game", { NULL }, 6582, "tcp" }, - { "parsec-game", { NULL }, 6582, "udp" }, - { "joaJewelSuite", { NULL }, 6583, "tcp" }, - { "joaJewelSuite", { NULL }, 6583, "udp" }, - { "mshvlm", { NULL }, 6600, "tcp" }, - { "mstmg-sstp", { NULL }, 6601, "tcp" }, - { "wsscomfrmwk", { NULL }, 6602, "tcp" }, - { "odette-ftps", { NULL }, 6619, "tcp" }, - { "odette-ftps", { NULL }, 6619, "udp" }, - { "kftp-data", { NULL }, 6620, "tcp" }, - { "kftp-data", { NULL }, 6620, "udp" }, - { "kftp", { NULL }, 6621, "tcp" }, - { "kftp", { NULL }, 6621, "udp" }, - { "mcftp", { NULL }, 6622, "tcp" }, - { "mcftp", { NULL }, 6622, "udp" }, - { "ktelnet", { NULL }, 6623, "tcp" }, - { "ktelnet", { NULL }, 6623, "udp" }, - { "datascaler-db", { NULL }, 6624, "tcp" }, - { "datascaler-ctl", { NULL }, 6625, "tcp" }, - { "wago-service", { NULL }, 6626, "tcp" }, - { "wago-service", { NULL }, 6626, "udp" }, - { "nexgen", { NULL }, 6627, "tcp" }, - { "nexgen", { NULL }, 6627, "udp" }, - { "afesc-mc", { NULL }, 6628, "tcp" }, - { "afesc-mc", { NULL }, 6628, "udp" }, - { "mxodbc-connect", { NULL }, 6632, "tcp" }, - { "pcs-sf-ui-man", { NULL }, 6655, "tcp" }, - { "emgmsg", { NULL }, 6656, "tcp" }, - { "palcom-disc", { NULL }, 6657, "udp" }, - { "vocaltec-gold", { NULL }, 6670, "tcp" }, - { "vocaltec-gold", { NULL }, 6670, "udp" }, - { "p4p-portal", { NULL }, 6671, "tcp" }, - { "p4p-portal", { NULL }, 6671, "udp" }, - { "vision_server", { NULL }, 6672, "tcp" }, - { "vision_server", { NULL }, 6672, "udp" }, - { "vision_elmd", { NULL }, 6673, "tcp" }, - { "vision_elmd", { NULL }, 6673, "udp" }, - { "vfbp", { NULL }, 6678, "tcp" }, - { "vfbp-disc", { NULL }, 6678, "udp" }, - { "osaut", { NULL }, 6679, "tcp" }, - { "osaut", { NULL }, 6679, "udp" }, - { "clever-ctrace", { NULL }, 6687, "tcp" }, - { "clever-tcpip", { NULL }, 6688, "tcp" }, - { "tsa", { NULL }, 6689, "tcp" }, - { "tsa", { NULL }, 6689, "udp" }, - { "babel", { NULL }, 6697, "udp" }, - { "kti-icad-srvr", { NULL }, 6701, "tcp" }, - { "kti-icad-srvr", { NULL }, 6701, "udp" }, - { "e-design-net", { NULL }, 6702, "tcp" }, - { "e-design-net", { NULL }, 6702, "udp" }, - { "e-design-web", { NULL }, 6703, "tcp" }, - { "e-design-web", { NULL }, 6703, "udp" }, - { "frc-hp", { NULL }, 6704, "sctp"}, - { "frc-mp", { NULL }, 6705, "sctp"}, - { "frc-lp", { NULL }, 6706, "sctp"}, - { "ibprotocol", { NULL }, 6714, "tcp" }, - { "ibprotocol", { NULL }, 6714, "udp" }, - { "fibotrader-com", { NULL }, 6715, "tcp" }, - { "fibotrader-com", { NULL }, 6715, "udp" }, - { "bmc-perf-agent", { NULL }, 6767, "tcp" }, - { "bmc-perf-agent", { NULL }, 6767, "udp" }, - { "bmc-perf-mgrd", { NULL }, 6768, "tcp" }, - { "bmc-perf-mgrd", { NULL }, 6768, "udp" }, - { "adi-gxp-srvprt", { NULL }, 6769, "tcp" }, - { "adi-gxp-srvprt", { NULL }, 6769, "udp" }, - { "plysrv-http", { NULL }, 6770, "tcp" }, - { "plysrv-http", { NULL }, 6770, "udp" }, - { "plysrv-https", { NULL }, 6771, "tcp" }, - { "plysrv-https", { NULL }, 6771, "udp" }, - { "dgpf-exchg", { NULL }, 6785, "tcp" }, - { "dgpf-exchg", { NULL }, 6785, "udp" }, - { "smc-jmx", { NULL }, 6786, "tcp" }, - { "smc-jmx", { NULL }, 6786, "udp" }, - { "smc-admin", { NULL }, 6787, "tcp" }, - { "smc-admin", { NULL }, 6787, "udp" }, - { "smc-http", { NULL }, 6788, "tcp" }, - { "smc-http", { NULL }, 6788, "udp" }, - { "smc-https", { NULL }, 6789, "tcp" }, - { "smc-https", { NULL }, 6789, "udp" }, - { "hnmp", { NULL }, 6790, "tcp" }, - { "hnmp", { NULL }, 6790, "udp" }, - { "hnm", { NULL }, 6791, "tcp" }, - { "hnm", { NULL }, 6791, "udp" }, - { "acnet", { NULL }, 6801, "tcp" }, - { "acnet", { NULL }, 6801, "udp" }, - { "pentbox-sim", { NULL }, 6817, "tcp" }, - { "ambit-lm", { NULL }, 6831, "tcp" }, - { "ambit-lm", { NULL }, 6831, "udp" }, - { "netmo-default", { NULL }, 6841, "tcp" }, - { "netmo-default", { NULL }, 6841, "udp" }, - { "netmo-http", { NULL }, 6842, "tcp" }, - { "netmo-http", { NULL }, 6842, "udp" }, - { "iccrushmore", { NULL }, 6850, "tcp" }, - { "iccrushmore", { NULL }, 6850, "udp" }, - { "acctopus-cc", { NULL }, 6868, "tcp" }, - { "acctopus-st", { NULL }, 6868, "udp" }, - { "muse", { NULL }, 6888, "tcp" }, - { "muse", { NULL }, 6888, "udp" }, - { "jetstream", { NULL }, 6901, "tcp" }, - { "xsmsvc", { NULL }, 6936, "tcp" }, - { "xsmsvc", { NULL }, 6936, "udp" }, - { "bioserver", { NULL }, 6946, "tcp" }, - { "bioserver", { NULL }, 6946, "udp" }, - { "otlp", { NULL }, 6951, "tcp" }, - { "otlp", { NULL }, 6951, "udp" }, - { "jmact3", { NULL }, 6961, "tcp" }, - { "jmact3", { NULL }, 6961, "udp" }, - { "jmevt2", { NULL }, 6962, "tcp" }, - { "jmevt2", { NULL }, 6962, "udp" }, - { "swismgr1", { NULL }, 6963, "tcp" }, - { "swismgr1", { NULL }, 6963, "udp" }, - { "swismgr2", { NULL }, 6964, "tcp" }, - { "swismgr2", { NULL }, 6964, "udp" }, - { "swistrap", { NULL }, 6965, "tcp" }, - { "swistrap", { NULL }, 6965, "udp" }, - { "swispol", { NULL }, 6966, "tcp" }, - { "swispol", { NULL }, 6966, "udp" }, - { "acmsoda", { NULL }, 6969, "tcp" }, - { "acmsoda", { NULL }, 6969, "udp" }, - { "MobilitySrv", { NULL }, 6997, "tcp" }, - { "MobilitySrv", { NULL }, 6997, "udp" }, - { "iatp-highpri", { NULL }, 6998, "tcp" }, - { "iatp-highpri", { NULL }, 6998, "udp" }, - { "iatp-normalpri", { NULL }, 6999, "tcp" }, - { "iatp-normalpri", { NULL }, 6999, "udp" }, - { "afs3-fileserver", { NULL }, 7000, "tcp" }, - { "afs3-fileserver", { NULL }, 7000, "udp" }, - { "afs3-callback", { NULL }, 7001, "tcp" }, - { "afs3-callback", { NULL }, 7001, "udp" }, - { "afs3-prserver", { NULL }, 7002, "tcp" }, - { "afs3-prserver", { NULL }, 7002, "udp" }, - { "afs3-vlserver", { NULL }, 7003, "tcp" }, - { "afs3-vlserver", { NULL }, 7003, "udp" }, - { "afs3-kaserver", { NULL }, 7004, "tcp" }, - { "afs3-kaserver", { NULL }, 7004, "udp" }, - { "afs3-volser", { NULL }, 7005, "tcp" }, - { "afs3-volser", { NULL }, 7005, "udp" }, - { "afs3-errors", { NULL }, 7006, "tcp" }, - { "afs3-errors", { NULL }, 7006, "udp" }, - { "afs3-bos", { NULL }, 7007, "tcp" }, - { "afs3-bos", { NULL }, 7007, "udp" }, - { "afs3-update", { NULL }, 7008, "tcp" }, - { "afs3-update", { NULL }, 7008, "udp" }, - { "afs3-rmtsys", { NULL }, 7009, "tcp" }, - { "afs3-rmtsys", { NULL }, 7009, "udp" }, - { "ups-onlinet", { NULL }, 7010, "tcp" }, - { "ups-onlinet", { NULL }, 7010, "udp" }, - { "talon-disc", { NULL }, 7011, "tcp" }, - { "talon-disc", { NULL }, 7011, "udp" }, - { "talon-engine", { NULL }, 7012, "tcp" }, - { "talon-engine", { NULL }, 7012, "udp" }, - { "microtalon-dis", { NULL }, 7013, "tcp" }, - { "microtalon-dis", { NULL }, 7013, "udp" }, - { "microtalon-com", { NULL }, 7014, "tcp" }, - { "microtalon-com", { NULL }, 7014, "udp" }, - { "talon-webserver", { NULL }, 7015, "tcp" }, - { "talon-webserver", { NULL }, 7015, "udp" }, - { "dpserve", { NULL }, 7020, "tcp" }, - { "dpserve", { NULL }, 7020, "udp" }, - { "dpserveadmin", { NULL }, 7021, "tcp" }, - { "dpserveadmin", { NULL }, 7021, "udp" }, - { "ctdp", { NULL }, 7022, "tcp" }, - { "ctdp", { NULL }, 7022, "udp" }, - { "ct2nmcs", { NULL }, 7023, "tcp" }, - { "ct2nmcs", { NULL }, 7023, "udp" }, - { "vmsvc", { NULL }, 7024, "tcp" }, - { "vmsvc", { NULL }, 7024, "udp" }, - { "vmsvc-2", { NULL }, 7025, "tcp" }, - { "vmsvc-2", { NULL }, 7025, "udp" }, - { "op-probe", { NULL }, 7030, "tcp" }, - { "op-probe", { NULL }, 7030, "udp" }, - { "arcp", { NULL }, 7070, "tcp" }, - { "arcp", { NULL }, 7070, "udp" }, - { "iwg1", { NULL }, 7071, "tcp" }, - { "iwg1", { NULL }, 7071, "udp" }, - { "empowerid", { NULL }, 7080, "tcp" }, - { "empowerid", { NULL }, 7080, "udp" }, - { "lazy-ptop", { NULL }, 7099, "tcp" }, - { "lazy-ptop", { NULL }, 7099, "udp" }, - { "font-service", { NULL }, 7100, "tcp" }, - { "font-service", { NULL }, 7100, "udp" }, - { "elcn", { NULL }, 7101, "tcp" }, - { "elcn", { NULL }, 7101, "udp" }, - { "aes-x170", { NULL }, 7107, "udp" }, - { "virprot-lm", { NULL }, 7121, "tcp" }, - { "virprot-lm", { NULL }, 7121, "udp" }, - { "scenidm", { NULL }, 7128, "tcp" }, - { "scenidm", { NULL }, 7128, "udp" }, - { "scenccs", { NULL }, 7129, "tcp" }, - { "scenccs", { NULL }, 7129, "udp" }, - { "cabsm-comm", { NULL }, 7161, "tcp" }, - { "cabsm-comm", { NULL }, 7161, "udp" }, - { "caistoragemgr", { NULL }, 7162, "tcp" }, - { "caistoragemgr", { NULL }, 7162, "udp" }, - { "cacsambroker", { NULL }, 7163, "tcp" }, - { "cacsambroker", { NULL }, 7163, "udp" }, - { "fsr", { NULL }, 7164, "tcp" }, - { "fsr", { NULL }, 7164, "udp" }, - { "doc-server", { NULL }, 7165, "tcp" }, - { "doc-server", { NULL }, 7165, "udp" }, - { "aruba-server", { NULL }, 7166, "tcp" }, - { "aruba-server", { NULL }, 7166, "udp" }, - { "casrmagent", { NULL }, 7167, "tcp" }, - { "cnckadserver", { NULL }, 7168, "tcp" }, - { "ccag-pib", { NULL }, 7169, "tcp" }, - { "ccag-pib", { NULL }, 7169, "udp" }, - { "nsrp", { NULL }, 7170, "tcp" }, - { "nsrp", { NULL }, 7170, "udp" }, - { "drm-production", { NULL }, 7171, "tcp" }, - { "drm-production", { NULL }, 7171, "udp" }, - { "zsecure", { NULL }, 7173, "tcp" }, - { "clutild", { NULL }, 7174, "tcp" }, - { "clutild", { NULL }, 7174, "udp" }, - { "fodms", { NULL }, 7200, "tcp" }, - { "fodms", { NULL }, 7200, "udp" }, - { "dlip", { NULL }, 7201, "tcp" }, - { "dlip", { NULL }, 7201, "udp" }, - { "ramp", { NULL }, 7227, "tcp" }, - { "ramp", { NULL }, 7227, "udp" }, - { "citrixupp", { NULL }, 7228, "tcp" }, - { "citrixuppg", { NULL }, 7229, "tcp" }, - { "pads", { NULL }, 7237, "tcp" }, - { "cnap", { NULL }, 7262, "tcp" }, - { "cnap", { NULL }, 7262, "udp" }, - { "watchme-7272", { NULL }, 7272, "tcp" }, - { "watchme-7272", { NULL }, 7272, "udp" }, - { "oma-rlp", { NULL }, 7273, "tcp" }, - { "oma-rlp", { NULL }, 7273, "udp" }, - { "oma-rlp-s", { NULL }, 7274, "tcp" }, - { "oma-rlp-s", { NULL }, 7274, "udp" }, - { "oma-ulp", { NULL }, 7275, "tcp" }, - { "oma-ulp", { NULL }, 7275, "udp" }, - { "oma-ilp", { NULL }, 7276, "tcp" }, - { "oma-ilp", { NULL }, 7276, "udp" }, - { "oma-ilp-s", { NULL }, 7277, "tcp" }, - { "oma-ilp-s", { NULL }, 7277, "udp" }, - { "oma-dcdocbs", { NULL }, 7278, "tcp" }, - { "oma-dcdocbs", { NULL }, 7278, "udp" }, - { "ctxlic", { NULL }, 7279, "tcp" }, - { "ctxlic", { NULL }, 7279, "udp" }, - { "itactionserver1", { NULL }, 7280, "tcp" }, - { "itactionserver1", { NULL }, 7280, "udp" }, - { "itactionserver2", { NULL }, 7281, "tcp" }, - { "itactionserver2", { NULL }, 7281, "udp" }, - { "mzca-action", { NULL }, 7282, "tcp" }, - { "mzca-alert", { NULL }, 7282, "udp" }, - { "lcm-server", { NULL }, 7365, "tcp" }, - { "lcm-server", { NULL }, 7365, "udp" }, - { "mindfilesys", { NULL }, 7391, "tcp" }, - { "mindfilesys", { NULL }, 7391, "udp" }, - { "mrssrendezvous", { NULL }, 7392, "tcp" }, - { "mrssrendezvous", { NULL }, 7392, "udp" }, - { "nfoldman", { NULL }, 7393, "tcp" }, - { "nfoldman", { NULL }, 7393, "udp" }, - { "fse", { NULL }, 7394, "tcp" }, - { "fse", { NULL }, 7394, "udp" }, - { "winqedit", { NULL }, 7395, "tcp" }, - { "winqedit", { NULL }, 7395, "udp" }, - { "hexarc", { NULL }, 7397, "tcp" }, - { "hexarc", { NULL }, 7397, "udp" }, - { "rtps-discovery", { NULL }, 7400, "tcp" }, - { "rtps-discovery", { NULL }, 7400, "udp" }, - { "rtps-dd-ut", { NULL }, 7401, "tcp" }, - { "rtps-dd-ut", { NULL }, 7401, "udp" }, - { "rtps-dd-mt", { NULL }, 7402, "tcp" }, - { "rtps-dd-mt", { NULL }, 7402, "udp" }, - { "ionixnetmon", { NULL }, 7410, "tcp" }, - { "ionixnetmon", { NULL }, 7410, "udp" }, - { "mtportmon", { NULL }, 7421, "tcp" }, - { "mtportmon", { NULL }, 7421, "udp" }, - { "pmdmgr", { NULL }, 7426, "tcp" }, - { "pmdmgr", { NULL }, 7426, "udp" }, - { "oveadmgr", { NULL }, 7427, "tcp" }, - { "oveadmgr", { NULL }, 7427, "udp" }, - { "ovladmgr", { NULL }, 7428, "tcp" }, - { "ovladmgr", { NULL }, 7428, "udp" }, - { "opi-sock", { NULL }, 7429, "tcp" }, - { "opi-sock", { NULL }, 7429, "udp" }, - { "xmpv7", { NULL }, 7430, "tcp" }, - { "xmpv7", { NULL }, 7430, "udp" }, - { "pmd", { NULL }, 7431, "tcp" }, - { "pmd", { NULL }, 7431, "udp" }, - { "faximum", { NULL }, 7437, "tcp" }, - { "faximum", { NULL }, 7437, "udp" }, - { "oracleas-https", { NULL }, 7443, "tcp" }, - { "oracleas-https", { NULL }, 7443, "udp" }, - { "rise", { NULL }, 7473, "tcp" }, - { "rise", { NULL }, 7473, "udp" }, - { "telops-lmd", { NULL }, 7491, "tcp" }, - { "telops-lmd", { NULL }, 7491, "udp" }, - { "silhouette", { NULL }, 7500, "tcp" }, - { "silhouette", { NULL }, 7500, "udp" }, - { "ovbus", { NULL }, 7501, "tcp" }, - { "ovbus", { NULL }, 7501, "udp" }, - { "acplt", { NULL }, 7509, "tcp" }, - { "ovhpas", { NULL }, 7510, "tcp" }, - { "ovhpas", { NULL }, 7510, "udp" }, - { "pafec-lm", { NULL }, 7511, "tcp" }, - { "pafec-lm", { NULL }, 7511, "udp" }, - { "saratoga", { NULL }, 7542, "tcp" }, - { "saratoga", { NULL }, 7542, "udp" }, - { "atul", { NULL }, 7543, "tcp" }, - { "atul", { NULL }, 7543, "udp" }, - { "nta-ds", { NULL }, 7544, "tcp" }, - { "nta-ds", { NULL }, 7544, "udp" }, - { "nta-us", { NULL }, 7545, "tcp" }, - { "nta-us", { NULL }, 7545, "udp" }, - { "cfs", { NULL }, 7546, "tcp" }, - { "cfs", { NULL }, 7546, "udp" }, - { "cwmp", { NULL }, 7547, "tcp" }, - { "cwmp", { NULL }, 7547, "udp" }, - { "tidp", { NULL }, 7548, "tcp" }, - { "tidp", { NULL }, 7548, "udp" }, - { "nls-tl", { NULL }, 7549, "tcp" }, - { "nls-tl", { NULL }, 7549, "udp" }, - { "sncp", { NULL }, 7560, "tcp" }, - { "sncp", { NULL }, 7560, "udp" }, - { "cfw", { NULL }, 7563, "tcp" }, - { "vsi-omega", { NULL }, 7566, "tcp" }, - { "vsi-omega", { NULL }, 7566, "udp" }, - { "dell-eql-asm", { NULL }, 7569, "tcp" }, - { "aries-kfinder", { NULL }, 7570, "tcp" }, - { "aries-kfinder", { NULL }, 7570, "udp" }, - { "sun-lm", { NULL }, 7588, "tcp" }, - { "sun-lm", { NULL }, 7588, "udp" }, - { "indi", { NULL }, 7624, "tcp" }, - { "indi", { NULL }, 7624, "udp" }, - { "simco", { NULL }, 7626, "tcp" }, - { "simco", { NULL }, 7626, "sctp"}, - { "soap-http", { NULL }, 7627, "tcp" }, - { "soap-http", { NULL }, 7627, "udp" }, - { "zen-pawn", { NULL }, 7628, "tcp" }, - { "zen-pawn", { NULL }, 7628, "udp" }, - { "xdas", { NULL }, 7629, "tcp" }, - { "xdas", { NULL }, 7629, "udp" }, - { "hawk", { NULL }, 7630, "tcp" }, - { "tesla-sys-msg", { NULL }, 7631, "tcp" }, - { "pmdfmgt", { NULL }, 7633, "tcp" }, - { "pmdfmgt", { NULL }, 7633, "udp" }, - { "cuseeme", { NULL }, 7648, "tcp" }, - { "cuseeme", { NULL }, 7648, "udp" }, - { "imqstomp", { NULL }, 7672, "tcp" }, - { "imqstomps", { NULL }, 7673, "tcp" }, - { "imqtunnels", { NULL }, 7674, "tcp" }, - { "imqtunnels", { NULL }, 7674, "udp" }, - { "imqtunnel", { NULL }, 7675, "tcp" }, - { "imqtunnel", { NULL }, 7675, "udp" }, - { "imqbrokerd", { NULL }, 7676, "tcp" }, - { "imqbrokerd", { NULL }, 7676, "udp" }, - { "sun-user-https", { NULL }, 7677, "tcp" }, - { "sun-user-https", { NULL }, 7677, "udp" }, - { "pando-pub", { NULL }, 7680, "tcp" }, - { "pando-pub", { NULL }, 7680, "udp" }, - { "collaber", { NULL }, 7689, "tcp" }, - { "collaber", { NULL }, 7689, "udp" }, - { "klio", { NULL }, 7697, "tcp" }, - { "klio", { NULL }, 7697, "udp" }, - { "em7-secom", { NULL }, 7700, "tcp" }, - { "sync-em7", { NULL }, 7707, "tcp" }, - { "sync-em7", { NULL }, 7707, "udp" }, - { "scinet", { NULL }, 7708, "tcp" }, - { "scinet", { NULL }, 7708, "udp" }, - { "medimageportal", { NULL }, 7720, "tcp" }, - { "medimageportal", { NULL }, 7720, "udp" }, - { "nsdeepfreezectl", { NULL }, 7724, "tcp" }, - { "nsdeepfreezectl", { NULL }, 7724, "udp" }, - { "nitrogen", { NULL }, 7725, "tcp" }, - { "nitrogen", { NULL }, 7725, "udp" }, - { "freezexservice", { NULL }, 7726, "tcp" }, - { "freezexservice", { NULL }, 7726, "udp" }, - { "trident-data", { NULL }, 7727, "tcp" }, - { "trident-data", { NULL }, 7727, "udp" }, - { "smip", { NULL }, 7734, "tcp" }, - { "smip", { NULL }, 7734, "udp" }, - { "aiagent", { NULL }, 7738, "tcp" }, - { "aiagent", { NULL }, 7738, "udp" }, - { "scriptview", { NULL }, 7741, "tcp" }, - { "scriptview", { NULL }, 7741, "udp" }, - { "msss", { NULL }, 7742, "tcp" }, - { "sstp-1", { NULL }, 7743, "tcp" }, - { "sstp-1", { NULL }, 7743, "udp" }, - { "raqmon-pdu", { NULL }, 7744, "tcp" }, - { "raqmon-pdu", { NULL }, 7744, "udp" }, - { "prgp", { NULL }, 7747, "tcp" }, - { "prgp", { NULL }, 7747, "udp" }, - { "cbt", { NULL }, 7777, "tcp" }, - { "cbt", { NULL }, 7777, "udp" }, - { "interwise", { NULL }, 7778, "tcp" }, - { "interwise", { NULL }, 7778, "udp" }, - { "vstat", { NULL }, 7779, "tcp" }, - { "vstat", { NULL }, 7779, "udp" }, - { "accu-lmgr", { NULL }, 7781, "tcp" }, - { "accu-lmgr", { NULL }, 7781, "udp" }, - { "minivend", { NULL }, 7786, "tcp" }, - { "minivend", { NULL }, 7786, "udp" }, - { "popup-reminders", { NULL }, 7787, "tcp" }, - { "popup-reminders", { NULL }, 7787, "udp" }, - { "office-tools", { NULL }, 7789, "tcp" }, - { "office-tools", { NULL }, 7789, "udp" }, - { "q3ade", { NULL }, 7794, "tcp" }, - { "q3ade", { NULL }, 7794, "udp" }, - { "pnet-conn", { NULL }, 7797, "tcp" }, - { "pnet-conn", { NULL }, 7797, "udp" }, - { "pnet-enc", { NULL }, 7798, "tcp" }, - { "pnet-enc", { NULL }, 7798, "udp" }, - { "altbsdp", { NULL }, 7799, "tcp" }, - { "altbsdp", { NULL }, 7799, "udp" }, - { "asr", { NULL }, 7800, "tcp" }, - { "asr", { NULL }, 7800, "udp" }, - { "ssp-client", { NULL }, 7801, "tcp" }, - { "ssp-client", { NULL }, 7801, "udp" }, - { "rbt-wanopt", { NULL }, 7810, "tcp" }, - { "rbt-wanopt", { NULL }, 7810, "udp" }, - { "apc-7845", { NULL }, 7845, "tcp" }, - { "apc-7845", { NULL }, 7845, "udp" }, - { "apc-7846", { NULL }, 7846, "tcp" }, - { "apc-7846", { NULL }, 7846, "udp" }, - { "mobileanalyzer", { NULL }, 7869, "tcp" }, - { "rbt-smc", { NULL }, 7870, "tcp" }, - { "pss", { NULL }, 7880, "tcp" }, - { "pss", { NULL }, 7880, "udp" }, - { "ubroker", { NULL }, 7887, "tcp" }, - { "ubroker", { NULL }, 7887, "udp" }, - { "mevent", { NULL }, 7900, "tcp" }, - { "mevent", { NULL }, 7900, "udp" }, - { "tnos-sp", { NULL }, 7901, "tcp" }, - { "tnos-sp", { NULL }, 7901, "udp" }, - { "tnos-dp", { NULL }, 7902, "tcp" }, - { "tnos-dp", { NULL }, 7902, "udp" }, - { "tnos-dps", { NULL }, 7903, "tcp" }, - { "tnos-dps", { NULL }, 7903, "udp" }, - { "qo-secure", { NULL }, 7913, "tcp" }, - { "qo-secure", { NULL }, 7913, "udp" }, - { "t2-drm", { NULL }, 7932, "tcp" }, - { "t2-drm", { NULL }, 7932, "udp" }, - { "t2-brm", { NULL }, 7933, "tcp" }, - { "t2-brm", { NULL }, 7933, "udp" }, - { "supercell", { NULL }, 7967, "tcp" }, - { "supercell", { NULL }, 7967, "udp" }, - { "micromuse-ncps", { NULL }, 7979, "tcp" }, - { "micromuse-ncps", { NULL }, 7979, "udp" }, - { "quest-vista", { NULL }, 7980, "tcp" }, - { "quest-vista", { NULL }, 7980, "udp" }, - { "sossd-collect", { NULL }, 7981, "tcp" }, - { "sossd-agent", { NULL }, 7982, "tcp" }, - { "sossd-disc", { NULL }, 7982, "udp" }, - { "pushns", { NULL }, 7997, "tcp" }, - { "usicontentpush", { NULL }, 7998, "udp" }, - { "irdmi2", { NULL }, 7999, "tcp" }, - { "irdmi2", { NULL }, 7999, "udp" }, - { "irdmi", { NULL }, 8000, "tcp" }, - { "irdmi", { NULL }, 8000, "udp" }, - { "vcom-tunnel", { NULL }, 8001, "tcp" }, - { "vcom-tunnel", { NULL }, 8001, "udp" }, - { "teradataordbms", { NULL }, 8002, "tcp" }, - { "teradataordbms", { NULL }, 8002, "udp" }, - { "mcreport", { NULL }, 8003, "tcp" }, - { "mcreport", { NULL }, 8003, "udp" }, - { "mxi", { NULL }, 8005, "tcp" }, - { "mxi", { NULL }, 8005, "udp" }, - { "http-alt", { NULL }, 8008, "tcp" }, - { "http-alt", { NULL }, 8008, "udp" }, - { "qbdb", { NULL }, 8019, "tcp" }, - { "qbdb", { NULL }, 8019, "udp" }, - { "intu-ec-svcdisc", { NULL }, 8020, "tcp" }, - { "intu-ec-svcdisc", { NULL }, 8020, "udp" }, - { "intu-ec-client", { NULL }, 8021, "tcp" }, - { "intu-ec-client", { NULL }, 8021, "udp" }, - { "oa-system", { NULL }, 8022, "tcp" }, - { "oa-system", { NULL }, 8022, "udp" }, - { "ca-audit-da", { NULL }, 8025, "tcp" }, - { "ca-audit-da", { NULL }, 8025, "udp" }, - { "ca-audit-ds", { NULL }, 8026, "tcp" }, - { "ca-audit-ds", { NULL }, 8026, "udp" }, - { "pro-ed", { NULL }, 8032, "tcp" }, - { "pro-ed", { NULL }, 8032, "udp" }, - { "mindprint", { NULL }, 8033, "tcp" }, - { "mindprint", { NULL }, 8033, "udp" }, - { "vantronix-mgmt", { NULL }, 8034, "tcp" }, - { "vantronix-mgmt", { NULL }, 8034, "udp" }, - { "ampify", { NULL }, 8040, "tcp" }, - { "ampify", { NULL }, 8040, "udp" }, - { "fs-agent", { NULL }, 8042, "tcp" }, - { "fs-server", { NULL }, 8043, "tcp" }, - { "fs-mgmt", { NULL }, 8044, "tcp" }, - { "senomix01", { NULL }, 8052, "tcp" }, - { "senomix01", { NULL }, 8052, "udp" }, - { "senomix02", { NULL }, 8053, "tcp" }, - { "senomix02", { NULL }, 8053, "udp" }, - { "senomix03", { NULL }, 8054, "tcp" }, - { "senomix03", { NULL }, 8054, "udp" }, - { "senomix04", { NULL }, 8055, "tcp" }, - { "senomix04", { NULL }, 8055, "udp" }, - { "senomix05", { NULL }, 8056, "tcp" }, - { "senomix05", { NULL }, 8056, "udp" }, - { "senomix06", { NULL }, 8057, "tcp" }, - { "senomix06", { NULL }, 8057, "udp" }, - { "senomix07", { NULL }, 8058, "tcp" }, - { "senomix07", { NULL }, 8058, "udp" }, - { "senomix08", { NULL }, 8059, "tcp" }, - { "senomix08", { NULL }, 8059, "udp" }, - { "gadugadu", { NULL }, 8074, "tcp" }, - { "gadugadu", { NULL }, 8074, "udp" }, - { "http-alt", { NULL }, 8080, "tcp" }, - { "http-alt", { NULL }, 8080, "udp" }, - { "sunproxyadmin", { NULL }, 8081, "tcp" }, - { "sunproxyadmin", { NULL }, 8081, "udp" }, - { "us-cli", { NULL }, 8082, "tcp" }, - { "us-cli", { NULL }, 8082, "udp" }, - { "us-srv", { NULL }, 8083, "tcp" }, - { "us-srv", { NULL }, 8083, "udp" }, - { "d-s-n", { NULL }, 8086, "tcp" }, - { "d-s-n", { NULL }, 8086, "udp" }, - { "simplifymedia", { NULL }, 8087, "tcp" }, - { "simplifymedia", { NULL }, 8087, "udp" }, - { "radan-http", { NULL }, 8088, "tcp" }, - { "radan-http", { NULL }, 8088, "udp" }, - { "jamlink", { NULL }, 8091, "tcp" }, - { "sac", { NULL }, 8097, "tcp" }, - { "sac", { NULL }, 8097, "udp" }, - { "xprint-server", { NULL }, 8100, "tcp" }, - { "xprint-server", { NULL }, 8100, "udp" }, - { "ldoms-migr", { NULL }, 8101, "tcp" }, - { "mtl8000-matrix", { NULL }, 8115, "tcp" }, - { "mtl8000-matrix", { NULL }, 8115, "udp" }, - { "cp-cluster", { NULL }, 8116, "tcp" }, - { "cp-cluster", { NULL }, 8116, "udp" }, - { "privoxy", { NULL }, 8118, "tcp" }, - { "privoxy", { NULL }, 8118, "udp" }, - { "apollo-data", { NULL }, 8121, "tcp" }, - { "apollo-data", { NULL }, 8121, "udp" }, - { "apollo-admin", { NULL }, 8122, "tcp" }, - { "apollo-admin", { NULL }, 8122, "udp" }, - { "paycash-online", { NULL }, 8128, "tcp" }, - { "paycash-online", { NULL }, 8128, "udp" }, - { "paycash-wbp", { NULL }, 8129, "tcp" }, - { "paycash-wbp", { NULL }, 8129, "udp" }, - { "indigo-vrmi", { NULL }, 8130, "tcp" }, - { "indigo-vrmi", { NULL }, 8130, "udp" }, - { "indigo-vbcp", { NULL }, 8131, "tcp" }, - { "indigo-vbcp", { NULL }, 8131, "udp" }, - { "dbabble", { NULL }, 8132, "tcp" }, - { "dbabble", { NULL }, 8132, "udp" }, - { "isdd", { NULL }, 8148, "tcp" }, - { "isdd", { NULL }, 8148, "udp" }, - { "patrol", { NULL }, 8160, "tcp" }, - { "patrol", { NULL }, 8160, "udp" }, - { "patrol-snmp", { NULL }, 8161, "tcp" }, - { "patrol-snmp", { NULL }, 8161, "udp" }, - { "vmware-fdm", { NULL }, 8182, "tcp" }, - { "vmware-fdm", { NULL }, 8182, "udp" }, - { "proremote", { NULL }, 8183, "tcp" }, - { "itach", { NULL }, 8184, "tcp" }, - { "itach", { NULL }, 8184, "udp" }, - { "spytechphone", { NULL }, 8192, "tcp" }, - { "spytechphone", { NULL }, 8192, "udp" }, - { "blp1", { NULL }, 8194, "tcp" }, - { "blp1", { NULL }, 8194, "udp" }, - { "blp2", { NULL }, 8195, "tcp" }, - { "blp2", { NULL }, 8195, "udp" }, - { "vvr-data", { NULL }, 8199, "tcp" }, - { "vvr-data", { NULL }, 8199, "udp" }, - { "trivnet1", { NULL }, 8200, "tcp" }, - { "trivnet1", { NULL }, 8200, "udp" }, - { "trivnet2", { NULL }, 8201, "tcp" }, - { "trivnet2", { NULL }, 8201, "udp" }, - { "lm-perfworks", { NULL }, 8204, "tcp" }, - { "lm-perfworks", { NULL }, 8204, "udp" }, - { "lm-instmgr", { NULL }, 8205, "tcp" }, - { "lm-instmgr", { NULL }, 8205, "udp" }, - { "lm-dta", { NULL }, 8206, "tcp" }, - { "lm-dta", { NULL }, 8206, "udp" }, - { "lm-sserver", { NULL }, 8207, "tcp" }, - { "lm-sserver", { NULL }, 8207, "udp" }, - { "lm-webwatcher", { NULL }, 8208, "tcp" }, - { "lm-webwatcher", { NULL }, 8208, "udp" }, - { "rexecj", { NULL }, 8230, "tcp" }, - { "rexecj", { NULL }, 8230, "udp" }, - { "synapse-nhttps", { NULL }, 8243, "tcp" }, - { "synapse-nhttps", { NULL }, 8243, "udp" }, - { "pando-sec", { NULL }, 8276, "tcp" }, - { "pando-sec", { NULL }, 8276, "udp" }, - { "synapse-nhttp", { NULL }, 8280, "tcp" }, - { "synapse-nhttp", { NULL }, 8280, "udp" }, - { "blp3", { NULL }, 8292, "tcp" }, - { "blp3", { NULL }, 8292, "udp" }, - { "hiperscan-id", { NULL }, 8293, "tcp" }, - { "blp4", { NULL }, 8294, "tcp" }, - { "blp4", { NULL }, 8294, "udp" }, - { "tmi", { NULL }, 8300, "tcp" }, - { "tmi", { NULL }, 8300, "udp" }, - { "amberon", { NULL }, 8301, "tcp" }, - { "amberon", { NULL }, 8301, "udp" }, - { "tnp-discover", { NULL }, 8320, "tcp" }, - { "tnp-discover", { NULL }, 8320, "udp" }, - { "tnp", { NULL }, 8321, "tcp" }, - { "tnp", { NULL }, 8321, "udp" }, - { "server-find", { NULL }, 8351, "tcp" }, - { "server-find", { NULL }, 8351, "udp" }, - { "cruise-enum", { NULL }, 8376, "tcp" }, - { "cruise-enum", { NULL }, 8376, "udp" }, - { "cruise-swroute", { NULL }, 8377, "tcp" }, - { "cruise-swroute", { NULL }, 8377, "udp" }, - { "cruise-config", { NULL }, 8378, "tcp" }, - { "cruise-config", { NULL }, 8378, "udp" }, - { "cruise-diags", { NULL }, 8379, "tcp" }, - { "cruise-diags", { NULL }, 8379, "udp" }, - { "cruise-update", { NULL }, 8380, "tcp" }, - { "cruise-update", { NULL }, 8380, "udp" }, - { "m2mservices", { NULL }, 8383, "tcp" }, - { "m2mservices", { NULL }, 8383, "udp" }, - { "cvd", { NULL }, 8400, "tcp" }, - { "cvd", { NULL }, 8400, "udp" }, - { "sabarsd", { NULL }, 8401, "tcp" }, - { "sabarsd", { NULL }, 8401, "udp" }, - { "abarsd", { NULL }, 8402, "tcp" }, - { "abarsd", { NULL }, 8402, "udp" }, - { "admind", { NULL }, 8403, "tcp" }, - { "admind", { NULL }, 8403, "udp" }, - { "svcloud", { NULL }, 8404, "tcp" }, - { "svbackup", { NULL }, 8405, "tcp" }, - { "espeech", { NULL }, 8416, "tcp" }, - { "espeech", { NULL }, 8416, "udp" }, - { "espeech-rtp", { NULL }, 8417, "tcp" }, - { "espeech-rtp", { NULL }, 8417, "udp" }, - { "cybro-a-bus", { NULL }, 8442, "tcp" }, - { "cybro-a-bus", { NULL }, 8442, "udp" }, - { "pcsync-https", { NULL }, 8443, "tcp" }, - { "pcsync-https", { NULL }, 8443, "udp" }, - { "pcsync-http", { NULL }, 8444, "tcp" }, - { "pcsync-http", { NULL }, 8444, "udp" }, - { "npmp", { NULL }, 8450, "tcp" }, - { "npmp", { NULL }, 8450, "udp" }, - { "cisco-avp", { NULL }, 8470, "tcp" }, - { "pim-port", { NULL }, 8471, "tcp" }, - { "pim-port", { NULL }, 8471, "sctp"}, - { "otv", { NULL }, 8472, "tcp" }, - { "otv", { NULL }, 8472, "udp" }, - { "vp2p", { NULL }, 8473, "tcp" }, - { "vp2p", { NULL }, 8473, "udp" }, - { "noteshare", { NULL }, 8474, "tcp" }, - { "noteshare", { NULL }, 8474, "udp" }, - { "fmtp", { NULL }, 8500, "tcp" }, - { "fmtp", { NULL }, 8500, "udp" }, - { "rtsp-alt", { NULL }, 8554, "tcp" }, - { "rtsp-alt", { NULL }, 8554, "udp" }, - { "d-fence", { NULL }, 8555, "tcp" }, - { "d-fence", { NULL }, 8555, "udp" }, - { "oap-admin", { NULL }, 8567, "tcp" }, - { "oap-admin", { NULL }, 8567, "udp" }, - { "asterix", { NULL }, 8600, "tcp" }, - { "asterix", { NULL }, 8600, "udp" }, - { "canon-mfnp", { NULL }, 8610, "tcp" }, - { "canon-mfnp", { NULL }, 8610, "udp" }, - { "canon-bjnp1", { NULL }, 8611, "tcp" }, - { "canon-bjnp1", { NULL }, 8611, "udp" }, - { "canon-bjnp2", { NULL }, 8612, "tcp" }, - { "canon-bjnp2", { NULL }, 8612, "udp" }, - { "canon-bjnp3", { NULL }, 8613, "tcp" }, - { "canon-bjnp3", { NULL }, 8613, "udp" }, - { "canon-bjnp4", { NULL }, 8614, "tcp" }, - { "canon-bjnp4", { NULL }, 8614, "udp" }, - { "sun-as-jmxrmi", { NULL }, 8686, "tcp" }, - { "sun-as-jmxrmi", { NULL }, 8686, "udp" }, - { "vnyx", { NULL }, 8699, "tcp" }, - { "vnyx", { NULL }, 8699, "udp" }, - { "dtp-net", { NULL }, 8732, "udp" }, - { "ibus", { NULL }, 8733, "tcp" }, - { "ibus", { NULL }, 8733, "udp" }, - { "mc-appserver", { NULL }, 8763, "tcp" }, - { "mc-appserver", { NULL }, 8763, "udp" }, - { "openqueue", { NULL }, 8764, "tcp" }, - { "openqueue", { NULL }, 8764, "udp" }, - { "ultraseek-http", { NULL }, 8765, "tcp" }, - { "ultraseek-http", { NULL }, 8765, "udp" }, - { "dpap", { NULL }, 8770, "tcp" }, - { "dpap", { NULL }, 8770, "udp" }, - { "msgclnt", { NULL }, 8786, "tcp" }, - { "msgclnt", { NULL }, 8786, "udp" }, - { "msgsrvr", { NULL }, 8787, "tcp" }, - { "msgsrvr", { NULL }, 8787, "udp" }, - { "sunwebadmin", { NULL }, 8800, "tcp" }, - { "sunwebadmin", { NULL }, 8800, "udp" }, - { "truecm", { NULL }, 8804, "tcp" }, - { "truecm", { NULL }, 8804, "udp" }, - { "dxspider", { NULL }, 8873, "tcp" }, - { "dxspider", { NULL }, 8873, "udp" }, - { "cddbp-alt", { NULL }, 8880, "tcp" }, - { "cddbp-alt", { NULL }, 8880, "udp" }, - { "secure-mqtt", { NULL }, 8883, "tcp" }, - { "secure-mqtt", { NULL }, 8883, "udp" }, - { "ddi-tcp-1", { NULL }, 8888, "tcp" }, - { "ddi-udp-1", { NULL }, 8888, "udp" }, - { "ddi-tcp-2", { NULL }, 8889, "tcp" }, - { "ddi-udp-2", { NULL }, 8889, "udp" }, - { "ddi-tcp-3", { NULL }, 8890, "tcp" }, - { "ddi-udp-3", { NULL }, 8890, "udp" }, - { "ddi-tcp-4", { NULL }, 8891, "tcp" }, - { "ddi-udp-4", { NULL }, 8891, "udp" }, - { "ddi-tcp-5", { NULL }, 8892, "tcp" }, - { "ddi-udp-5", { NULL }, 8892, "udp" }, - { "ddi-tcp-6", { NULL }, 8893, "tcp" }, - { "ddi-udp-6", { NULL }, 8893, "udp" }, - { "ddi-tcp-7", { NULL }, 8894, "tcp" }, - { "ddi-udp-7", { NULL }, 8894, "udp" }, - { "ospf-lite", { NULL }, 8899, "tcp" }, - { "ospf-lite", { NULL }, 8899, "udp" }, - { "jmb-cds1", { NULL }, 8900, "tcp" }, - { "jmb-cds1", { NULL }, 8900, "udp" }, - { "jmb-cds2", { NULL }, 8901, "tcp" }, - { "jmb-cds2", { NULL }, 8901, "udp" }, - { "manyone-http", { NULL }, 8910, "tcp" }, - { "manyone-http", { NULL }, 8910, "udp" }, - { "manyone-xml", { NULL }, 8911, "tcp" }, - { "manyone-xml", { NULL }, 8911, "udp" }, - { "wcbackup", { NULL }, 8912, "tcp" }, - { "wcbackup", { NULL }, 8912, "udp" }, - { "dragonfly", { NULL }, 8913, "tcp" }, - { "dragonfly", { NULL }, 8913, "udp" }, - { "twds", { NULL }, 8937, "tcp" }, - { "cumulus-admin", { NULL }, 8954, "tcp" }, - { "cumulus-admin", { NULL }, 8954, "udp" }, - { "sunwebadmins", { NULL }, 8989, "tcp" }, - { "sunwebadmins", { NULL }, 8989, "udp" }, - { "http-wmap", { NULL }, 8990, "tcp" }, - { "http-wmap", { NULL }, 8990, "udp" }, - { "https-wmap", { NULL }, 8991, "tcp" }, - { "https-wmap", { NULL }, 8991, "udp" }, - { "bctp", { NULL }, 8999, "tcp" }, - { "bctp", { NULL }, 8999, "udp" }, - { "cslistener", { NULL }, 9000, "tcp" }, - { "cslistener", { NULL }, 9000, "udp" }, - { "etlservicemgr", { NULL }, 9001, "tcp" }, - { "etlservicemgr", { NULL }, 9001, "udp" }, - { "dynamid", { NULL }, 9002, "tcp" }, - { "dynamid", { NULL }, 9002, "udp" }, - { "ogs-client", { NULL }, 9007, "udp" }, - { "ogs-server", { NULL }, 9008, "tcp" }, - { "pichat", { NULL }, 9009, "tcp" }, - { "pichat", { NULL }, 9009, "udp" }, - { "sdr", { NULL }, 9010, "tcp" }, - { "tambora", { NULL }, 9020, "tcp" }, - { "tambora", { NULL }, 9020, "udp" }, - { "panagolin-ident", { NULL }, 9021, "tcp" }, - { "panagolin-ident", { NULL }, 9021, "udp" }, - { "paragent", { NULL }, 9022, "tcp" }, - { "paragent", { NULL }, 9022, "udp" }, - { "swa-1", { NULL }, 9023, "tcp" }, - { "swa-1", { NULL }, 9023, "udp" }, - { "swa-2", { NULL }, 9024, "tcp" }, - { "swa-2", { NULL }, 9024, "udp" }, - { "swa-3", { NULL }, 9025, "tcp" }, - { "swa-3", { NULL }, 9025, "udp" }, - { "swa-4", { NULL }, 9026, "tcp" }, - { "swa-4", { NULL }, 9026, "udp" }, - { "versiera", { NULL }, 9050, "tcp" }, - { "fio-cmgmt", { NULL }, 9051, "tcp" }, - { "glrpc", { NULL }, 9080, "tcp" }, - { "glrpc", { NULL }, 9080, "udp" }, - { "lcs-ap", { NULL }, 9082, "sctp"}, - { "emc-pp-mgmtsvc", { NULL }, 9083, "tcp" }, - { "aurora", { NULL }, 9084, "tcp" }, - { "aurora", { NULL }, 9084, "udp" }, - { "aurora", { NULL }, 9084, "sctp"}, - { "ibm-rsyscon", { NULL }, 9085, "tcp" }, - { "ibm-rsyscon", { NULL }, 9085, "udp" }, - { "net2display", { NULL }, 9086, "tcp" }, - { "net2display", { NULL }, 9086, "udp" }, - { "classic", { NULL }, 9087, "tcp" }, - { "classic", { NULL }, 9087, "udp" }, - { "sqlexec", { NULL }, 9088, "tcp" }, - { "sqlexec", { NULL }, 9088, "udp" }, - { "sqlexec-ssl", { NULL }, 9089, "tcp" }, - { "sqlexec-ssl", { NULL }, 9089, "udp" }, - { "websm", { NULL }, 9090, "tcp" }, - { "websm", { NULL }, 9090, "udp" }, - { "xmltec-xmlmail", { NULL }, 9091, "tcp" }, - { "xmltec-xmlmail", { NULL }, 9091, "udp" }, - { "XmlIpcRegSvc", { NULL }, 9092, "tcp" }, - { "XmlIpcRegSvc", { NULL }, 9092, "udp" }, - { "hp-pdl-datastr", { NULL }, 9100, "tcp" }, - { "hp-pdl-datastr", { NULL }, 9100, "udp" }, - { "pdl-datastream", { NULL }, 9100, "tcp" }, - { "pdl-datastream", { NULL }, 9100, "udp" }, - { "bacula-dir", { NULL }, 9101, "tcp" }, - { "bacula-dir", { NULL }, 9101, "udp" }, - { "bacula-fd", { NULL }, 9102, "tcp" }, - { "bacula-fd", { NULL }, 9102, "udp" }, - { "bacula-sd", { NULL }, 9103, "tcp" }, - { "bacula-sd", { NULL }, 9103, "udp" }, - { "peerwire", { NULL }, 9104, "tcp" }, - { "peerwire", { NULL }, 9104, "udp" }, - { "xadmin", { NULL }, 9105, "tcp" }, - { "xadmin", { NULL }, 9105, "udp" }, - { "astergate", { NULL }, 9106, "tcp" }, - { "astergate-disc", { NULL }, 9106, "udp" }, - { "astergatefax", { NULL }, 9107, "tcp" }, - { "mxit", { NULL }, 9119, "tcp" }, - { "mxit", { NULL }, 9119, "udp" }, - { "dddp", { NULL }, 9131, "tcp" }, - { "dddp", { NULL }, 9131, "udp" }, - { "apani1", { NULL }, 9160, "tcp" }, - { "apani1", { NULL }, 9160, "udp" }, - { "apani2", { NULL }, 9161, "tcp" }, - { "apani2", { NULL }, 9161, "udp" }, - { "apani3", { NULL }, 9162, "tcp" }, - { "apani3", { NULL }, 9162, "udp" }, - { "apani4", { NULL }, 9163, "tcp" }, - { "apani4", { NULL }, 9163, "udp" }, - { "apani5", { NULL }, 9164, "tcp" }, - { "apani5", { NULL }, 9164, "udp" }, - { "sun-as-jpda", { NULL }, 9191, "tcp" }, - { "sun-as-jpda", { NULL }, 9191, "udp" }, - { "wap-wsp", { NULL }, 9200, "tcp" }, - { "wap-wsp", { NULL }, 9200, "udp" }, - { "wap-wsp-wtp", { NULL }, 9201, "tcp" }, - { "wap-wsp-wtp", { NULL }, 9201, "udp" }, - { "wap-wsp-s", { NULL }, 9202, "tcp" }, - { "wap-wsp-s", { NULL }, 9202, "udp" }, - { "wap-wsp-wtp-s", { NULL }, 9203, "tcp" }, - { "wap-wsp-wtp-s", { NULL }, 9203, "udp" }, - { "wap-vcard", { NULL }, 9204, "tcp" }, - { "wap-vcard", { NULL }, 9204, "udp" }, - { "wap-vcal", { NULL }, 9205, "tcp" }, - { "wap-vcal", { NULL }, 9205, "udp" }, - { "wap-vcard-s", { NULL }, 9206, "tcp" }, - { "wap-vcard-s", { NULL }, 9206, "udp" }, - { "wap-vcal-s", { NULL }, 9207, "tcp" }, - { "wap-vcal-s", { NULL }, 9207, "udp" }, - { "rjcdb-vcards", { NULL }, 9208, "tcp" }, - { "rjcdb-vcards", { NULL }, 9208, "udp" }, - { "almobile-system", { NULL }, 9209, "tcp" }, - { "almobile-system", { NULL }, 9209, "udp" }, - { "oma-mlp", { NULL }, 9210, "tcp" }, - { "oma-mlp", { NULL }, 9210, "udp" }, - { "oma-mlp-s", { NULL }, 9211, "tcp" }, - { "oma-mlp-s", { NULL }, 9211, "udp" }, - { "serverviewdbms", { NULL }, 9212, "tcp" }, - { "serverviewdbms", { NULL }, 9212, "udp" }, - { "serverstart", { NULL }, 9213, "tcp" }, - { "serverstart", { NULL }, 9213, "udp" }, - { "ipdcesgbs", { NULL }, 9214, "tcp" }, - { "ipdcesgbs", { NULL }, 9214, "udp" }, - { "insis", { NULL }, 9215, "tcp" }, - { "insis", { NULL }, 9215, "udp" }, - { "acme", { NULL }, 9216, "tcp" }, - { "acme", { NULL }, 9216, "udp" }, - { "fsc-port", { NULL }, 9217, "tcp" }, - { "fsc-port", { NULL }, 9217, "udp" }, - { "teamcoherence", { NULL }, 9222, "tcp" }, - { "teamcoherence", { NULL }, 9222, "udp" }, - { "mon", { NULL }, 9255, "tcp" }, - { "mon", { NULL }, 9255, "udp" }, - { "pegasus", { NULL }, 9278, "tcp" }, - { "pegasus", { NULL }, 9278, "udp" }, - { "pegasus-ctl", { NULL }, 9279, "tcp" }, - { "pegasus-ctl", { NULL }, 9279, "udp" }, - { "pgps", { NULL }, 9280, "tcp" }, - { "pgps", { NULL }, 9280, "udp" }, - { "swtp-port1", { NULL }, 9281, "tcp" }, - { "swtp-port1", { NULL }, 9281, "udp" }, - { "swtp-port2", { NULL }, 9282, "tcp" }, - { "swtp-port2", { NULL }, 9282, "udp" }, - { "callwaveiam", { NULL }, 9283, "tcp" }, - { "callwaveiam", { NULL }, 9283, "udp" }, - { "visd", { NULL }, 9284, "tcp" }, - { "visd", { NULL }, 9284, "udp" }, - { "n2h2server", { NULL }, 9285, "tcp" }, - { "n2h2server", { NULL }, 9285, "udp" }, - { "n2receive", { NULL }, 9286, "udp" }, - { "cumulus", { NULL }, 9287, "tcp" }, - { "cumulus", { NULL }, 9287, "udp" }, - { "armtechdaemon", { NULL }, 9292, "tcp" }, - { "armtechdaemon", { NULL }, 9292, "udp" }, - { "storview", { NULL }, 9293, "tcp" }, - { "storview", { NULL }, 9293, "udp" }, - { "armcenterhttp", { NULL }, 9294, "tcp" }, - { "armcenterhttp", { NULL }, 9294, "udp" }, - { "armcenterhttps", { NULL }, 9295, "tcp" }, - { "armcenterhttps", { NULL }, 9295, "udp" }, - { "vrace", { NULL }, 9300, "tcp" }, - { "vrace", { NULL }, 9300, "udp" }, - { "sphinxql", { NULL }, 9306, "tcp" }, - { "sphinxapi", { NULL }, 9312, "tcp" }, - { "secure-ts", { NULL }, 9318, "tcp" }, - { "secure-ts", { NULL }, 9318, "udp" }, - { "guibase", { NULL }, 9321, "tcp" }, - { "guibase", { NULL }, 9321, "udp" }, - { "mpidcmgr", { NULL }, 9343, "tcp" }, - { "mpidcmgr", { NULL }, 9343, "udp" }, - { "mphlpdmc", { NULL }, 9344, "tcp" }, - { "mphlpdmc", { NULL }, 9344, "udp" }, - { "ctechlicensing", { NULL }, 9346, "tcp" }, - { "ctechlicensing", { NULL }, 9346, "udp" }, - { "fjdmimgr", { NULL }, 9374, "tcp" }, - { "fjdmimgr", { NULL }, 9374, "udp" }, - { "boxp", { NULL }, 9380, "tcp" }, - { "boxp", { NULL }, 9380, "udp" }, - { "d2dconfig", { NULL }, 9387, "tcp" }, - { "d2ddatatrans", { NULL }, 9388, "tcp" }, - { "adws", { NULL }, 9389, "tcp" }, - { "otp", { NULL }, 9390, "tcp" }, - { "fjinvmgr", { NULL }, 9396, "tcp" }, - { "fjinvmgr", { NULL }, 9396, "udp" }, - { "mpidcagt", { NULL }, 9397, "tcp" }, - { "mpidcagt", { NULL }, 9397, "udp" }, - { "sec-t4net-srv", { NULL }, 9400, "tcp" }, - { "sec-t4net-srv", { NULL }, 9400, "udp" }, - { "sec-t4net-clt", { NULL }, 9401, "tcp" }, - { "sec-t4net-clt", { NULL }, 9401, "udp" }, - { "sec-pc2fax-srv", { NULL }, 9402, "tcp" }, - { "sec-pc2fax-srv", { NULL }, 9402, "udp" }, - { "git", { NULL }, 9418, "tcp" }, - { "git", { NULL }, 9418, "udp" }, - { "tungsten-https", { NULL }, 9443, "tcp" }, - { "tungsten-https", { NULL }, 9443, "udp" }, - { "wso2esb-console", { NULL }, 9444, "tcp" }, - { "wso2esb-console", { NULL }, 9444, "udp" }, - { "sntlkeyssrvr", { NULL }, 9450, "tcp" }, - { "sntlkeyssrvr", { NULL }, 9450, "udp" }, - { "ismserver", { NULL }, 9500, "tcp" }, - { "ismserver", { NULL }, 9500, "udp" }, - { "sma-spw", { NULL }, 9522, "udp" }, - { "mngsuite", { NULL }, 9535, "tcp" }, - { "mngsuite", { NULL }, 9535, "udp" }, - { "laes-bf", { NULL }, 9536, "tcp" }, - { "laes-bf", { NULL }, 9536, "udp" }, - { "trispen-sra", { NULL }, 9555, "tcp" }, - { "trispen-sra", { NULL }, 9555, "udp" }, - { "ldgateway", { NULL }, 9592, "tcp" }, - { "ldgateway", { NULL }, 9592, "udp" }, - { "cba8", { NULL }, 9593, "tcp" }, - { "cba8", { NULL }, 9593, "udp" }, - { "msgsys", { NULL }, 9594, "tcp" }, - { "msgsys", { NULL }, 9594, "udp" }, - { "pds", { NULL }, 9595, "tcp" }, - { "pds", { NULL }, 9595, "udp" }, - { "mercury-disc", { NULL }, 9596, "tcp" }, - { "mercury-disc", { NULL }, 9596, "udp" }, - { "pd-admin", { NULL }, 9597, "tcp" }, - { "pd-admin", { NULL }, 9597, "udp" }, - { "vscp", { NULL }, 9598, "tcp" }, - { "vscp", { NULL }, 9598, "udp" }, - { "robix", { NULL }, 9599, "tcp" }, - { "robix", { NULL }, 9599, "udp" }, - { "micromuse-ncpw", { NULL }, 9600, "tcp" }, - { "micromuse-ncpw", { NULL }, 9600, "udp" }, - { "streamcomm-ds", { NULL }, 9612, "tcp" }, - { "streamcomm-ds", { NULL }, 9612, "udp" }, - { "iadt-tls", { NULL }, 9614, "tcp" }, - { "erunbook_agent", { NULL }, 9616, "tcp" }, - { "erunbook_server", { NULL }, 9617, "tcp" }, - { "condor", { NULL }, 9618, "tcp" }, - { "condor", { NULL }, 9618, "udp" }, - { "odbcpathway", { NULL }, 9628, "tcp" }, - { "odbcpathway", { NULL }, 9628, "udp" }, - { "uniport", { NULL }, 9629, "tcp" }, - { "uniport", { NULL }, 9629, "udp" }, - { "peoctlr", { NULL }, 9630, "tcp" }, - { "peocoll", { NULL }, 9631, "tcp" }, - { "mc-comm", { NULL }, 9632, "udp" }, - { "pqsflows", { NULL }, 9640, "tcp" }, - { "xmms2", { NULL }, 9667, "tcp" }, - { "xmms2", { NULL }, 9667, "udp" }, - { "tec5-sdctp", { NULL }, 9668, "tcp" }, - { "tec5-sdctp", { NULL }, 9668, "udp" }, - { "client-wakeup", { NULL }, 9694, "tcp" }, - { "client-wakeup", { NULL }, 9694, "udp" }, - { "ccnx", { NULL }, 9695, "tcp" }, - { "ccnx", { NULL }, 9695, "udp" }, - { "board-roar", { NULL }, 9700, "tcp" }, - { "board-roar", { NULL }, 9700, "udp" }, - { "l5nas-parchan", { NULL }, 9747, "tcp" }, - { "l5nas-parchan", { NULL }, 9747, "udp" }, - { "board-voip", { NULL }, 9750, "tcp" }, - { "board-voip", { NULL }, 9750, "udp" }, - { "rasadv", { NULL }, 9753, "tcp" }, - { "rasadv", { NULL }, 9753, "udp" }, - { "tungsten-http", { NULL }, 9762, "tcp" }, - { "tungsten-http", { NULL }, 9762, "udp" }, - { "davsrc", { NULL }, 9800, "tcp" }, - { "davsrc", { NULL }, 9800, "udp" }, - { "sstp-2", { NULL }, 9801, "tcp" }, - { "sstp-2", { NULL }, 9801, "udp" }, - { "davsrcs", { NULL }, 9802, "tcp" }, - { "davsrcs", { NULL }, 9802, "udp" }, - { "sapv1", { NULL }, 9875, "tcp" }, - { "sapv1", { NULL }, 9875, "udp" }, - { "sd", { NULL }, 9876, "tcp" }, - { "sd", { NULL }, 9876, "udp" }, - { "cyborg-systems", { NULL }, 9888, "tcp" }, - { "cyborg-systems", { NULL }, 9888, "udp" }, - { "gt-proxy", { NULL }, 9889, "tcp" }, - { "gt-proxy", { NULL }, 9889, "udp" }, - { "monkeycom", { NULL }, 9898, "tcp" }, - { "monkeycom", { NULL }, 9898, "udp" }, - { "sctp-tunneling", { NULL }, 9899, "tcp" }, - { "sctp-tunneling", { NULL }, 9899, "udp" }, - { "iua", { NULL }, 9900, "tcp" }, - { "iua", { NULL }, 9900, "udp" }, - { "iua", { NULL }, 9900, "sctp"}, - { "enrp", { NULL }, 9901, "udp" }, - { "enrp-sctp", { NULL }, 9901, "sctp"}, - { "enrp-sctp-tls", { NULL }, 9902, "sctp"}, - { "domaintime", { NULL }, 9909, "tcp" }, - { "domaintime", { NULL }, 9909, "udp" }, - { "sype-transport", { NULL }, 9911, "tcp" }, - { "sype-transport", { NULL }, 9911, "udp" }, - { "apc-9950", { NULL }, 9950, "tcp" }, - { "apc-9950", { NULL }, 9950, "udp" }, - { "apc-9951", { NULL }, 9951, "tcp" }, - { "apc-9951", { NULL }, 9951, "udp" }, - { "apc-9952", { NULL }, 9952, "tcp" }, - { "apc-9952", { NULL }, 9952, "udp" }, - { "acis", { NULL }, 9953, "tcp" }, - { "acis", { NULL }, 9953, "udp" }, - { "odnsp", { NULL }, 9966, "tcp" }, - { "odnsp", { NULL }, 9966, "udp" }, - { "dsm-scm-target", { NULL }, 9987, "tcp" }, - { "dsm-scm-target", { NULL }, 9987, "udp" }, - { "nsesrvr", { NULL }, 9988, "tcp" }, - { "osm-appsrvr", { NULL }, 9990, "tcp" }, - { "osm-appsrvr", { NULL }, 9990, "udp" }, - { "osm-oev", { NULL }, 9991, "tcp" }, - { "osm-oev", { NULL }, 9991, "udp" }, - { "palace-1", { NULL }, 9992, "tcp" }, - { "palace-1", { NULL }, 9992, "udp" }, - { "palace-2", { NULL }, 9993, "tcp" }, - { "palace-2", { NULL }, 9993, "udp" }, - { "palace-3", { NULL }, 9994, "tcp" }, - { "palace-3", { NULL }, 9994, "udp" }, - { "palace-4", { NULL }, 9995, "tcp" }, - { "palace-4", { NULL }, 9995, "udp" }, - { "palace-5", { NULL }, 9996, "tcp" }, - { "palace-5", { NULL }, 9996, "udp" }, - { "palace-6", { NULL }, 9997, "tcp" }, - { "palace-6", { NULL }, 9997, "udp" }, - { "distinct32", { NULL }, 9998, "tcp" }, - { "distinct32", { NULL }, 9998, "udp" }, - { "distinct", { NULL }, 9999, "tcp" }, - { "distinct", { NULL }, 9999, "udp" }, - { "ndmp", { NULL }, 10000, "tcp" }, - { "ndmp", { NULL }, 10000, "udp" }, - { "scp-config", { NULL }, 10001, "tcp" }, - { "scp-config", { NULL }, 10001, "udp" }, - { "documentum", { NULL }, 10002, "tcp" }, - { "documentum", { NULL }, 10002, "udp" }, - { "documentum_s", { NULL }, 10003, "tcp" }, - { "documentum_s", { NULL }, 10003, "udp" }, - { "emcrmirccd", { NULL }, 10004, "tcp" }, - { "emcrmird", { NULL }, 10005, "tcp" }, - { "mvs-capacity", { NULL }, 10007, "tcp" }, - { "mvs-capacity", { NULL }, 10007, "udp" }, - { "octopus", { NULL }, 10008, "tcp" }, - { "octopus", { NULL }, 10008, "udp" }, - { "swdtp-sv", { NULL }, 10009, "tcp" }, - { "swdtp-sv", { NULL }, 10009, "udp" }, - { "rxapi", { NULL }, 10010, "tcp" }, - { "zabbix-agent", { NULL }, 10050, "tcp" }, - { "zabbix-agent", { NULL }, 10050, "udp" }, - { "zabbix-trapper", { NULL }, 10051, "tcp" }, - { "zabbix-trapper", { NULL }, 10051, "udp" }, - { "qptlmd", { NULL }, 10055, "tcp" }, - { "amanda", { NULL }, 10080, "tcp" }, - { "amanda", { NULL }, 10080, "udp" }, - { "famdc", { NULL }, 10081, "tcp" }, - { "famdc", { NULL }, 10081, "udp" }, - { "itap-ddtp", { NULL }, 10100, "tcp" }, - { "itap-ddtp", { NULL }, 10100, "udp" }, - { "ezmeeting-2", { NULL }, 10101, "tcp" }, - { "ezmeeting-2", { NULL }, 10101, "udp" }, - { "ezproxy-2", { NULL }, 10102, "tcp" }, - { "ezproxy-2", { NULL }, 10102, "udp" }, - { "ezrelay", { NULL }, 10103, "tcp" }, - { "ezrelay", { NULL }, 10103, "udp" }, - { "swdtp", { NULL }, 10104, "tcp" }, - { "swdtp", { NULL }, 10104, "udp" }, - { "bctp-server", { NULL }, 10107, "tcp" }, - { "bctp-server", { NULL }, 10107, "udp" }, - { "nmea-0183", { NULL }, 10110, "tcp" }, - { "nmea-0183", { NULL }, 10110, "udp" }, - { "netiq-endpoint", { NULL }, 10113, "tcp" }, - { "netiq-endpoint", { NULL }, 10113, "udp" }, - { "netiq-qcheck", { NULL }, 10114, "tcp" }, - { "netiq-qcheck", { NULL }, 10114, "udp" }, - { "netiq-endpt", { NULL }, 10115, "tcp" }, - { "netiq-endpt", { NULL }, 10115, "udp" }, - { "netiq-voipa", { NULL }, 10116, "tcp" }, - { "netiq-voipa", { NULL }, 10116, "udp" }, - { "iqrm", { NULL }, 10117, "tcp" }, - { "iqrm", { NULL }, 10117, "udp" }, - { "bmc-perf-sd", { NULL }, 10128, "tcp" }, - { "bmc-perf-sd", { NULL }, 10128, "udp" }, - { "bmc-gms", { NULL }, 10129, "tcp" }, - { "qb-db-server", { NULL }, 10160, "tcp" }, - { "qb-db-server", { NULL }, 10160, "udp" }, - { "snmptls", { NULL }, 10161, "tcp" }, - { "snmpdtls", { NULL }, 10161, "udp" }, - { "snmptls-trap", { NULL }, 10162, "tcp" }, - { "snmpdtls-trap", { NULL }, 10162, "udp" }, - { "trisoap", { NULL }, 10200, "tcp" }, - { "trisoap", { NULL }, 10200, "udp" }, - { "rsms", { NULL }, 10201, "tcp" }, - { "rscs", { NULL }, 10201, "udp" }, - { "apollo-relay", { NULL }, 10252, "tcp" }, - { "apollo-relay", { NULL }, 10252, "udp" }, - { "axis-wimp-port", { NULL }, 10260, "tcp" }, - { "axis-wimp-port", { NULL }, 10260, "udp" }, - { "blocks", { NULL }, 10288, "tcp" }, - { "blocks", { NULL }, 10288, "udp" }, - { "cosir", { NULL }, 10321, "tcp" }, - { "hip-nat-t", { NULL }, 10500, "udp" }, - { "MOS-lower", { NULL }, 10540, "tcp" }, - { "MOS-lower", { NULL }, 10540, "udp" }, - { "MOS-upper", { NULL }, 10541, "tcp" }, - { "MOS-upper", { NULL }, 10541, "udp" }, - { "MOS-aux", { NULL }, 10542, "tcp" }, - { "MOS-aux", { NULL }, 10542, "udp" }, - { "MOS-soap", { NULL }, 10543, "tcp" }, - { "MOS-soap", { NULL }, 10543, "udp" }, - { "MOS-soap-opt", { NULL }, 10544, "tcp" }, - { "MOS-soap-opt", { NULL }, 10544, "udp" }, - { "gap", { NULL }, 10800, "tcp" }, - { "gap", { NULL }, 10800, "udp" }, - { "lpdg", { NULL }, 10805, "tcp" }, - { "lpdg", { NULL }, 10805, "udp" }, - { "nbd", { NULL }, 10809, "tcp" }, - { "nmc-disc", { NULL }, 10810, "udp" }, - { "helix", { NULL }, 10860, "tcp" }, - { "helix", { NULL }, 10860, "udp" }, - { "rmiaux", { NULL }, 10990, "tcp" }, - { "rmiaux", { NULL }, 10990, "udp" }, - { "irisa", { NULL }, 11000, "tcp" }, - { "irisa", { NULL }, 11000, "udp" }, - { "metasys", { NULL }, 11001, "tcp" }, - { "metasys", { NULL }, 11001, "udp" }, - { "netapp-icmgmt", { NULL }, 11104, "tcp" }, - { "netapp-icdata", { NULL }, 11105, "tcp" }, - { "sgi-lk", { NULL }, 11106, "tcp" }, - { "sgi-lk", { NULL }, 11106, "udp" }, - { "vce", { NULL }, 11111, "tcp" }, - { "vce", { NULL }, 11111, "udp" }, - { "dicom", { NULL }, 11112, "tcp" }, - { "dicom", { NULL }, 11112, "udp" }, - { "suncacao-snmp", { NULL }, 11161, "tcp" }, - { "suncacao-snmp", { NULL }, 11161, "udp" }, - { "suncacao-jmxmp", { NULL }, 11162, "tcp" }, - { "suncacao-jmxmp", { NULL }, 11162, "udp" }, - { "suncacao-rmi", { NULL }, 11163, "tcp" }, - { "suncacao-rmi", { NULL }, 11163, "udp" }, - { "suncacao-csa", { NULL }, 11164, "tcp" }, - { "suncacao-csa", { NULL }, 11164, "udp" }, - { "suncacao-websvc", { NULL }, 11165, "tcp" }, - { "suncacao-websvc", { NULL }, 11165, "udp" }, - { "snss", { NULL }, 11171, "udp" }, - { "oemcacao-jmxmp", { NULL }, 11172, "tcp" }, - { "oemcacao-rmi", { NULL }, 11174, "tcp" }, - { "oemcacao-websvc", { NULL }, 11175, "tcp" }, - { "smsqp", { NULL }, 11201, "tcp" }, - { "smsqp", { NULL }, 11201, "udp" }, - { "wifree", { NULL }, 11208, "tcp" }, - { "wifree", { NULL }, 11208, "udp" }, - { "memcache", { NULL }, 11211, "tcp" }, - { "memcache", { NULL }, 11211, "udp" }, - { "imip", { NULL }, 11319, "tcp" }, - { "imip", { NULL }, 11319, "udp" }, - { "imip-channels", { NULL }, 11320, "tcp" }, - { "imip-channels", { NULL }, 11320, "udp" }, - { "arena-server", { NULL }, 11321, "tcp" }, - { "arena-server", { NULL }, 11321, "udp" }, - { "atm-uhas", { NULL }, 11367, "tcp" }, - { "atm-uhas", { NULL }, 11367, "udp" }, - { "hkp", { NULL }, 11371, "tcp" }, - { "hkp", { NULL }, 11371, "udp" }, - { "asgcypresstcps", { NULL }, 11489, "tcp" }, - { "tempest-port", { NULL }, 11600, "tcp" }, - { "tempest-port", { NULL }, 11600, "udp" }, - { "h323callsigalt", { NULL }, 11720, "tcp" }, - { "h323callsigalt", { NULL }, 11720, "udp" }, - { "intrepid-ssl", { NULL }, 11751, "tcp" }, - { "intrepid-ssl", { NULL }, 11751, "udp" }, - { "xoraya", { NULL }, 11876, "tcp" }, - { "xoraya", { NULL }, 11876, "udp" }, - { "x2e-disc", { NULL }, 11877, "udp" }, - { "sysinfo-sp", { NULL }, 11967, "tcp" }, - { "sysinfo-sp", { NULL }, 11967, "udp" }, - { "wmereceiving", { NULL }, 11997, "sctp"}, - { "wmedistribution", { NULL }, 11998, "sctp"}, - { "wmereporting", { NULL }, 11999, "sctp"}, - { "entextxid", { NULL }, 12000, "tcp" }, - { "entextxid", { NULL }, 12000, "udp" }, - { "entextnetwk", { NULL }, 12001, "tcp" }, - { "entextnetwk", { NULL }, 12001, "udp" }, - { "entexthigh", { NULL }, 12002, "tcp" }, - { "entexthigh", { NULL }, 12002, "udp" }, - { "entextmed", { NULL }, 12003, "tcp" }, - { "entextmed", { NULL }, 12003, "udp" }, - { "entextlow", { NULL }, 12004, "tcp" }, - { "entextlow", { NULL }, 12004, "udp" }, - { "dbisamserver1", { NULL }, 12005, "tcp" }, - { "dbisamserver1", { NULL }, 12005, "udp" }, - { "dbisamserver2", { NULL }, 12006, "tcp" }, - { "dbisamserver2", { NULL }, 12006, "udp" }, - { "accuracer", { NULL }, 12007, "tcp" }, - { "accuracer", { NULL }, 12007, "udp" }, - { "accuracer-dbms", { NULL }, 12008, "tcp" }, - { "accuracer-dbms", { NULL }, 12008, "udp" }, - { "edbsrvr", { NULL }, 12010, "tcp" }, - { "vipera", { NULL }, 12012, "tcp" }, - { "vipera", { NULL }, 12012, "udp" }, - { "vipera-ssl", { NULL }, 12013, "tcp" }, - { "vipera-ssl", { NULL }, 12013, "udp" }, - { "rets-ssl", { NULL }, 12109, "tcp" }, - { "rets-ssl", { NULL }, 12109, "udp" }, - { "nupaper-ss", { NULL }, 12121, "tcp" }, - { "nupaper-ss", { NULL }, 12121, "udp" }, - { "cawas", { NULL }, 12168, "tcp" }, - { "cawas", { NULL }, 12168, "udp" }, - { "hivep", { NULL }, 12172, "tcp" }, - { "hivep", { NULL }, 12172, "udp" }, - { "linogridengine", { NULL }, 12300, "tcp" }, - { "linogridengine", { NULL }, 12300, "udp" }, - { "warehouse-sss", { NULL }, 12321, "tcp" }, - { "warehouse-sss", { NULL }, 12321, "udp" }, - { "warehouse", { NULL }, 12322, "tcp" }, - { "warehouse", { NULL }, 12322, "udp" }, - { "italk", { NULL }, 12345, "tcp" }, - { "italk", { NULL }, 12345, "udp" }, - { "tsaf", { NULL }, 12753, "tcp" }, - { "tsaf", { NULL }, 12753, "udp" }, - { "i-zipqd", { NULL }, 13160, "tcp" }, - { "i-zipqd", { NULL }, 13160, "udp" }, - { "bcslogc", { NULL }, 13216, "tcp" }, - { "bcslogc", { NULL }, 13216, "udp" }, - { "rs-pias", { NULL }, 13217, "tcp" }, - { "rs-pias", { NULL }, 13217, "udp" }, - { "emc-vcas-tcp", { NULL }, 13218, "tcp" }, - { "emc-vcas-udp", { NULL }, 13218, "udp" }, - { "powwow-client", { NULL }, 13223, "tcp" }, - { "powwow-client", { NULL }, 13223, "udp" }, - { "powwow-server", { NULL }, 13224, "tcp" }, - { "powwow-server", { NULL }, 13224, "udp" }, - { "doip-data", { NULL }, 13400, "tcp" }, - { "doip-disc", { NULL }, 13400, "udp" }, - { "bprd", { NULL }, 13720, "tcp" }, - { "bprd", { NULL }, 13720, "udp" }, - { "bpdbm", { NULL }, 13721, "tcp" }, - { "bpdbm", { NULL }, 13721, "udp" }, - { "bpjava-msvc", { NULL }, 13722, "tcp" }, - { "bpjava-msvc", { NULL }, 13722, "udp" }, - { "vnetd", { NULL }, 13724, "tcp" }, - { "vnetd", { NULL }, 13724, "udp" }, - { "bpcd", { NULL }, 13782, "tcp" }, - { "bpcd", { NULL }, 13782, "udp" }, - { "vopied", { NULL }, 13783, "tcp" }, - { "vopied", { NULL }, 13783, "udp" }, - { "nbdb", { NULL }, 13785, "tcp" }, - { "nbdb", { NULL }, 13785, "udp" }, - { "nomdb", { NULL }, 13786, "tcp" }, - { "nomdb", { NULL }, 13786, "udp" }, - { "dsmcc-config", { NULL }, 13818, "tcp" }, - { "dsmcc-config", { NULL }, 13818, "udp" }, - { "dsmcc-session", { NULL }, 13819, "tcp" }, - { "dsmcc-session", { NULL }, 13819, "udp" }, - { "dsmcc-passthru", { NULL }, 13820, "tcp" }, - { "dsmcc-passthru", { NULL }, 13820, "udp" }, - { "dsmcc-download", { NULL }, 13821, "tcp" }, - { "dsmcc-download", { NULL }, 13821, "udp" }, - { "dsmcc-ccp", { NULL }, 13822, "tcp" }, - { "dsmcc-ccp", { NULL }, 13822, "udp" }, - { "bmdss", { NULL }, 13823, "tcp" }, - { "dta-systems", { NULL }, 13929, "tcp" }, - { "dta-systems", { NULL }, 13929, "udp" }, - { "medevolve", { NULL }, 13930, "tcp" }, - { "scotty-ft", { NULL }, 14000, "tcp" }, - { "scotty-ft", { NULL }, 14000, "udp" }, - { "sua", { NULL }, 14001, "tcp" }, - { "sua", { NULL }, 14001, "udp" }, - { "sua", { NULL }, 14001, "sctp"}, - { "sage-best-com1", { NULL }, 14033, "tcp" }, - { "sage-best-com1", { NULL }, 14033, "udp" }, - { "sage-best-com2", { NULL }, 14034, "tcp" }, - { "sage-best-com2", { NULL }, 14034, "udp" }, - { "vcs-app", { NULL }, 14141, "tcp" }, - { "vcs-app", { NULL }, 14141, "udp" }, - { "icpp", { NULL }, 14142, "tcp" }, - { "icpp", { NULL }, 14142, "udp" }, - { "gcm-app", { NULL }, 14145, "tcp" }, - { "gcm-app", { NULL }, 14145, "udp" }, - { "vrts-tdd", { NULL }, 14149, "tcp" }, - { "vrts-tdd", { NULL }, 14149, "udp" }, - { "vcscmd", { NULL }, 14150, "tcp" }, - { "vad", { NULL }, 14154, "tcp" }, - { "vad", { NULL }, 14154, "udp" }, - { "cps", { NULL }, 14250, "tcp" }, - { "cps", { NULL }, 14250, "udp" }, - { "ca-web-update", { NULL }, 14414, "tcp" }, - { "ca-web-update", { NULL }, 14414, "udp" }, - { "hde-lcesrvr-1", { NULL }, 14936, "tcp" }, - { "hde-lcesrvr-1", { NULL }, 14936, "udp" }, - { "hde-lcesrvr-2", { NULL }, 14937, "tcp" }, - { "hde-lcesrvr-2", { NULL }, 14937, "udp" }, - { "hydap", { NULL }, 15000, "tcp" }, - { "hydap", { NULL }, 15000, "udp" }, - { "xpilot", { NULL }, 15345, "tcp" }, - { "xpilot", { NULL }, 15345, "udp" }, - { "3link", { NULL }, 15363, "tcp" }, - { "3link", { NULL }, 15363, "udp" }, - { "cisco-snat", { NULL }, 15555, "tcp" }, - { "cisco-snat", { NULL }, 15555, "udp" }, - { "bex-xr", { NULL }, 15660, "tcp" }, - { "bex-xr", { NULL }, 15660, "udp" }, - { "ptp", { NULL }, 15740, "tcp" }, - { "ptp", { NULL }, 15740, "udp" }, - { "2ping", { NULL }, 15998, "udp" }, - { "programmar", { NULL }, 15999, "tcp" }, - { "fmsas", { NULL }, 16000, "tcp" }, - { "fmsascon", { NULL }, 16001, "tcp" }, - { "gsms", { NULL }, 16002, "tcp" }, - { "alfin", { NULL }, 16003, "udp" }, - { "jwpc", { NULL }, 16020, "tcp" }, - { "jwpc-bin", { NULL }, 16021, "tcp" }, - { "sun-sea-port", { NULL }, 16161, "tcp" }, - { "sun-sea-port", { NULL }, 16161, "udp" }, - { "solaris-audit", { NULL }, 16162, "tcp" }, - { "etb4j", { NULL }, 16309, "tcp" }, - { "etb4j", { NULL }, 16309, "udp" }, - { "pduncs", { NULL }, 16310, "tcp" }, - { "pduncs", { NULL }, 16310, "udp" }, - { "pdefmns", { NULL }, 16311, "tcp" }, - { "pdefmns", { NULL }, 16311, "udp" }, - { "netserialext1", { NULL }, 16360, "tcp" }, - { "netserialext1", { NULL }, 16360, "udp" }, - { "netserialext2", { NULL }, 16361, "tcp" }, - { "netserialext2", { NULL }, 16361, "udp" }, - { "netserialext3", { NULL }, 16367, "tcp" }, - { "netserialext3", { NULL }, 16367, "udp" }, - { "netserialext4", { NULL }, 16368, "tcp" }, - { "netserialext4", { NULL }, 16368, "udp" }, - { "connected", { NULL }, 16384, "tcp" }, - { "connected", { NULL }, 16384, "udp" }, - { "xoms", { NULL }, 16619, "tcp" }, - { "newbay-snc-mc", { NULL }, 16900, "tcp" }, - { "newbay-snc-mc", { NULL }, 16900, "udp" }, - { "sgcip", { NULL }, 16950, "tcp" }, - { "sgcip", { NULL }, 16950, "udp" }, - { "intel-rci-mp", { NULL }, 16991, "tcp" }, - { "intel-rci-mp", { NULL }, 16991, "udp" }, - { "amt-soap-http", { NULL }, 16992, "tcp" }, - { "amt-soap-http", { NULL }, 16992, "udp" }, - { "amt-soap-https", { NULL }, 16993, "tcp" }, - { "amt-soap-https", { NULL }, 16993, "udp" }, - { "amt-redir-tcp", { NULL }, 16994, "tcp" }, - { "amt-redir-tcp", { NULL }, 16994, "udp" }, - { "amt-redir-tls", { NULL }, 16995, "tcp" }, - { "amt-redir-tls", { NULL }, 16995, "udp" }, - { "isode-dua", { NULL }, 17007, "tcp" }, - { "isode-dua", { NULL }, 17007, "udp" }, - { "soundsvirtual", { NULL }, 17185, "tcp" }, - { "soundsvirtual", { NULL }, 17185, "udp" }, - { "chipper", { NULL }, 17219, "tcp" }, - { "chipper", { NULL }, 17219, "udp" }, - { "integrius-stp", { NULL }, 17234, "tcp" }, - { "integrius-stp", { NULL }, 17234, "udp" }, - { "ssh-mgmt", { NULL }, 17235, "tcp" }, - { "ssh-mgmt", { NULL }, 17235, "udp" }, - { "db-lsp", { NULL }, 17500, "tcp" }, - { "db-lsp-disc", { NULL }, 17500, "udp" }, - { "ea", { NULL }, 17729, "tcp" }, - { "ea", { NULL }, 17729, "udp" }, - { "zep", { NULL }, 17754, "tcp" }, - { "zep", { NULL }, 17754, "udp" }, - { "zigbee-ip", { NULL }, 17755, "tcp" }, - { "zigbee-ip", { NULL }, 17755, "udp" }, - { "zigbee-ips", { NULL }, 17756, "tcp" }, - { "zigbee-ips", { NULL }, 17756, "udp" }, - { "sw-orion", { NULL }, 17777, "tcp" }, - { "biimenu", { NULL }, 18000, "tcp" }, - { "biimenu", { NULL }, 18000, "udp" }, - { "radpdf", { NULL }, 18104, "tcp" }, - { "racf", { NULL }, 18136, "tcp" }, - { "opsec-cvp", { NULL }, 18181, "tcp" }, - { "opsec-cvp", { NULL }, 18181, "udp" }, - { "opsec-ufp", { NULL }, 18182, "tcp" }, - { "opsec-ufp", { NULL }, 18182, "udp" }, - { "opsec-sam", { NULL }, 18183, "tcp" }, - { "opsec-sam", { NULL }, 18183, "udp" }, - { "opsec-lea", { NULL }, 18184, "tcp" }, - { "opsec-lea", { NULL }, 18184, "udp" }, - { "opsec-omi", { NULL }, 18185, "tcp" }, - { "opsec-omi", { NULL }, 18185, "udp" }, - { "ohsc", { NULL }, 18186, "tcp" }, - { "ohsc", { NULL }, 18186, "udp" }, - { "opsec-ela", { NULL }, 18187, "tcp" }, - { "opsec-ela", { NULL }, 18187, "udp" }, - { "checkpoint-rtm", { NULL }, 18241, "tcp" }, - { "checkpoint-rtm", { NULL }, 18241, "udp" }, - { "gv-pf", { NULL }, 18262, "tcp" }, - { "gv-pf", { NULL }, 18262, "udp" }, - { "ac-cluster", { NULL }, 18463, "tcp" }, - { "ac-cluster", { NULL }, 18463, "udp" }, - { "rds-ib", { NULL }, 18634, "tcp" }, - { "rds-ib", { NULL }, 18634, "udp" }, - { "rds-ip", { NULL }, 18635, "tcp" }, - { "rds-ip", { NULL }, 18635, "udp" }, - { "ique", { NULL }, 18769, "tcp" }, - { "ique", { NULL }, 18769, "udp" }, - { "infotos", { NULL }, 18881, "tcp" }, - { "infotos", { NULL }, 18881, "udp" }, - { "apc-necmp", { NULL }, 18888, "tcp" }, - { "apc-necmp", { NULL }, 18888, "udp" }, - { "igrid", { NULL }, 19000, "tcp" }, - { "igrid", { NULL }, 19000, "udp" }, - { "j-link", { NULL }, 19020, "tcp" }, - { "opsec-uaa", { NULL }, 19191, "tcp" }, - { "opsec-uaa", { NULL }, 19191, "udp" }, - { "ua-secureagent", { NULL }, 19194, "tcp" }, - { "ua-secureagent", { NULL }, 19194, "udp" }, - { "keysrvr", { NULL }, 19283, "tcp" }, - { "keysrvr", { NULL }, 19283, "udp" }, - { "keyshadow", { NULL }, 19315, "tcp" }, - { "keyshadow", { NULL }, 19315, "udp" }, - { "mtrgtrans", { NULL }, 19398, "tcp" }, - { "mtrgtrans", { NULL }, 19398, "udp" }, - { "hp-sco", { NULL }, 19410, "tcp" }, - { "hp-sco", { NULL }, 19410, "udp" }, - { "hp-sca", { NULL }, 19411, "tcp" }, - { "hp-sca", { NULL }, 19411, "udp" }, - { "hp-sessmon", { NULL }, 19412, "tcp" }, - { "hp-sessmon", { NULL }, 19412, "udp" }, - { "fxuptp", { NULL }, 19539, "tcp" }, - { "fxuptp", { NULL }, 19539, "udp" }, - { "sxuptp", { NULL }, 19540, "tcp" }, - { "sxuptp", { NULL }, 19540, "udp" }, - { "jcp", { NULL }, 19541, "tcp" }, - { "jcp", { NULL }, 19541, "udp" }, - { "iec-104-sec", { NULL }, 19998, "tcp" }, - { "dnp-sec", { NULL }, 19999, "tcp" }, - { "dnp-sec", { NULL }, 19999, "udp" }, - { "dnp", { NULL }, 20000, "tcp" }, - { "dnp", { NULL }, 20000, "udp" }, - { "microsan", { NULL }, 20001, "tcp" }, - { "microsan", { NULL }, 20001, "udp" }, - { "commtact-http", { NULL }, 20002, "tcp" }, - { "commtact-http", { NULL }, 20002, "udp" }, - { "commtact-https", { NULL }, 20003, "tcp" }, - { "commtact-https", { NULL }, 20003, "udp" }, - { "openwebnet", { NULL }, 20005, "tcp" }, - { "openwebnet", { NULL }, 20005, "udp" }, - { "ss-idi-disc", { NULL }, 20012, "udp" }, - { "ss-idi", { NULL }, 20013, "tcp" }, - { "opendeploy", { NULL }, 20014, "tcp" }, - { "opendeploy", { NULL }, 20014, "udp" }, - { "nburn_id", { NULL }, 20034, "tcp" }, - { "nburn_id", { NULL }, 20034, "udp" }, - { "tmophl7mts", { NULL }, 20046, "tcp" }, - { "tmophl7mts", { NULL }, 20046, "udp" }, - { "mountd", { NULL }, 20048, "tcp" }, - { "mountd", { NULL }, 20048, "udp" }, - { "nfsrdma", { NULL }, 20049, "tcp" }, - { "nfsrdma", { NULL }, 20049, "udp" }, - { "nfsrdma", { NULL }, 20049, "sctp"}, - { "tolfab", { NULL }, 20167, "tcp" }, - { "tolfab", { NULL }, 20167, "udp" }, - { "ipdtp-port", { NULL }, 20202, "tcp" }, - { "ipdtp-port", { NULL }, 20202, "udp" }, - { "ipulse-ics", { NULL }, 20222, "tcp" }, - { "ipulse-ics", { NULL }, 20222, "udp" }, - { "emwavemsg", { NULL }, 20480, "tcp" }, - { "emwavemsg", { NULL }, 20480, "udp" }, - { "track", { NULL }, 20670, "tcp" }, - { "track", { NULL }, 20670, "udp" }, - { "athand-mmp", { NULL }, 20999, "tcp" }, - { "athand-mmp", { NULL }, 20999, "udp" }, - { "irtrans", { NULL }, 21000, "tcp" }, - { "irtrans", { NULL }, 21000, "udp" }, - { "dfserver", { NULL }, 21554, "tcp" }, - { "dfserver", { NULL }, 21554, "udp" }, - { "vofr-gateway", { NULL }, 21590, "tcp" }, - { "vofr-gateway", { NULL }, 21590, "udp" }, - { "tvpm", { NULL }, 21800, "tcp" }, - { "tvpm", { NULL }, 21800, "udp" }, - { "webphone", { NULL }, 21845, "tcp" }, - { "webphone", { NULL }, 21845, "udp" }, - { "netspeak-is", { NULL }, 21846, "tcp" }, - { "netspeak-is", { NULL }, 21846, "udp" }, - { "netspeak-cs", { NULL }, 21847, "tcp" }, - { "netspeak-cs", { NULL }, 21847, "udp" }, - { "netspeak-acd", { NULL }, 21848, "tcp" }, - { "netspeak-acd", { NULL }, 21848, "udp" }, - { "netspeak-cps", { NULL }, 21849, "tcp" }, - { "netspeak-cps", { NULL }, 21849, "udp" }, - { "snapenetio", { NULL }, 22000, "tcp" }, - { "snapenetio", { NULL }, 22000, "udp" }, - { "optocontrol", { NULL }, 22001, "tcp" }, - { "optocontrol", { NULL }, 22001, "udp" }, - { "optohost002", { NULL }, 22002, "tcp" }, - { "optohost002", { NULL }, 22002, "udp" }, - { "optohost003", { NULL }, 22003, "tcp" }, - { "optohost003", { NULL }, 22003, "udp" }, - { "optohost004", { NULL }, 22004, "tcp" }, - { "optohost004", { NULL }, 22004, "udp" }, - { "optohost004", { NULL }, 22005, "tcp" }, - { "optohost004", { NULL }, 22005, "udp" }, - { "dcap", { NULL }, 22125, "tcp" }, - { "gsidcap", { NULL }, 22128, "tcp" }, - { "wnn6", { NULL }, 22273, "tcp" }, - { "wnn6", { NULL }, 22273, "udp" }, - { "cis", { NULL }, 22305, "tcp" }, - { "cis", { NULL }, 22305, "udp" }, - { "cis-secure", { NULL }, 22343, "tcp" }, - { "cis-secure", { NULL }, 22343, "udp" }, - { "WibuKey", { NULL }, 22347, "tcp" }, - { "WibuKey", { NULL }, 22347, "udp" }, - { "CodeMeter", { NULL }, 22350, "tcp" }, - { "CodeMeter", { NULL }, 22350, "udp" }, - { "vocaltec-wconf", { NULL }, 22555, "tcp" }, - { "vocaltec-phone", { NULL }, 22555, "udp" }, - { "talikaserver", { NULL }, 22763, "tcp" }, - { "talikaserver", { NULL }, 22763, "udp" }, - { "aws-brf", { NULL }, 22800, "tcp" }, - { "aws-brf", { NULL }, 22800, "udp" }, - { "brf-gw", { NULL }, 22951, "tcp" }, - { "brf-gw", { NULL }, 22951, "udp" }, - { "inovaport1", { NULL }, 23000, "tcp" }, - { "inovaport1", { NULL }, 23000, "udp" }, - { "inovaport2", { NULL }, 23001, "tcp" }, - { "inovaport2", { NULL }, 23001, "udp" }, - { "inovaport3", { NULL }, 23002, "tcp" }, - { "inovaport3", { NULL }, 23002, "udp" }, - { "inovaport4", { NULL }, 23003, "tcp" }, - { "inovaport4", { NULL }, 23003, "udp" }, - { "inovaport5", { NULL }, 23004, "tcp" }, - { "inovaport5", { NULL }, 23004, "udp" }, - { "inovaport6", { NULL }, 23005, "tcp" }, - { "inovaport6", { NULL }, 23005, "udp" }, - { "s102", { NULL }, 23272, "udp" }, - { "elxmgmt", { NULL }, 23333, "tcp" }, - { "elxmgmt", { NULL }, 23333, "udp" }, - { "novar-dbase", { NULL }, 23400, "tcp" }, - { "novar-dbase", { NULL }, 23400, "udp" }, - { "novar-alarm", { NULL }, 23401, "tcp" }, - { "novar-alarm", { NULL }, 23401, "udp" }, - { "novar-global", { NULL }, 23402, "tcp" }, - { "novar-global", { NULL }, 23402, "udp" }, - { "aequus", { NULL }, 23456, "tcp" }, - { "aequus-alt", { NULL }, 23457, "tcp" }, - { "med-ltp", { NULL }, 24000, "tcp" }, - { "med-ltp", { NULL }, 24000, "udp" }, - { "med-fsp-rx", { NULL }, 24001, "tcp" }, - { "med-fsp-rx", { NULL }, 24001, "udp" }, - { "med-fsp-tx", { NULL }, 24002, "tcp" }, - { "med-fsp-tx", { NULL }, 24002, "udp" }, - { "med-supp", { NULL }, 24003, "tcp" }, - { "med-supp", { NULL }, 24003, "udp" }, - { "med-ovw", { NULL }, 24004, "tcp" }, - { "med-ovw", { NULL }, 24004, "udp" }, - { "med-ci", { NULL }, 24005, "tcp" }, - { "med-ci", { NULL }, 24005, "udp" }, - { "med-net-svc", { NULL }, 24006, "tcp" }, - { "med-net-svc", { NULL }, 24006, "udp" }, - { "filesphere", { NULL }, 24242, "tcp" }, - { "filesphere", { NULL }, 24242, "udp" }, - { "vista-4gl", { NULL }, 24249, "tcp" }, - { "vista-4gl", { NULL }, 24249, "udp" }, - { "ild", { NULL }, 24321, "tcp" }, - { "ild", { NULL }, 24321, "udp" }, - { "intel_rci", { NULL }, 24386, "tcp" }, - { "intel_rci", { NULL }, 24386, "udp" }, - { "tonidods", { NULL }, 24465, "tcp" }, - { "tonidods", { NULL }, 24465, "udp" }, - { "binkp", { NULL }, 24554, "tcp" }, - { "binkp", { NULL }, 24554, "udp" }, - { "canditv", { NULL }, 24676, "tcp" }, - { "canditv", { NULL }, 24676, "udp" }, - { "flashfiler", { NULL }, 24677, "tcp" }, - { "flashfiler", { NULL }, 24677, "udp" }, - { "proactivate", { NULL }, 24678, "tcp" }, - { "proactivate", { NULL }, 24678, "udp" }, - { "tcc-http", { NULL }, 24680, "tcp" }, - { "tcc-http", { NULL }, 24680, "udp" }, - { "cslg", { NULL }, 24754, "tcp" }, - { "find", { NULL }, 24922, "tcp" }, - { "find", { NULL }, 24922, "udp" }, - { "icl-twobase1", { NULL }, 25000, "tcp" }, - { "icl-twobase1", { NULL }, 25000, "udp" }, - { "icl-twobase2", { NULL }, 25001, "tcp" }, - { "icl-twobase2", { NULL }, 25001, "udp" }, - { "icl-twobase3", { NULL }, 25002, "tcp" }, - { "icl-twobase3", { NULL }, 25002, "udp" }, - { "icl-twobase4", { NULL }, 25003, "tcp" }, - { "icl-twobase4", { NULL }, 25003, "udp" }, - { "icl-twobase5", { NULL }, 25004, "tcp" }, - { "icl-twobase5", { NULL }, 25004, "udp" }, - { "icl-twobase6", { NULL }, 25005, "tcp" }, - { "icl-twobase6", { NULL }, 25005, "udp" }, - { "icl-twobase7", { NULL }, 25006, "tcp" }, - { "icl-twobase7", { NULL }, 25006, "udp" }, - { "icl-twobase8", { NULL }, 25007, "tcp" }, - { "icl-twobase8", { NULL }, 25007, "udp" }, - { "icl-twobase9", { NULL }, 25008, "tcp" }, - { "icl-twobase9", { NULL }, 25008, "udp" }, - { "icl-twobase10", { NULL }, 25009, "tcp" }, - { "icl-twobase10", { NULL }, 25009, "udp" }, - { "rna", { NULL }, 25471, "sctp"}, - { "sauterdongle", { NULL }, 25576, "tcp" }, - { "vocaltec-hos", { NULL }, 25793, "tcp" }, - { "vocaltec-hos", { NULL }, 25793, "udp" }, - { "tasp-net", { NULL }, 25900, "tcp" }, - { "tasp-net", { NULL }, 25900, "udp" }, - { "niobserver", { NULL }, 25901, "tcp" }, - { "niobserver", { NULL }, 25901, "udp" }, - { "nilinkanalyst", { NULL }, 25902, "tcp" }, - { "nilinkanalyst", { NULL }, 25902, "udp" }, - { "niprobe", { NULL }, 25903, "tcp" }, - { "niprobe", { NULL }, 25903, "udp" }, - { "quake", { NULL }, 26000, "tcp" }, - { "quake", { NULL }, 26000, "udp" }, - { "scscp", { NULL }, 26133, "tcp" }, - { "scscp", { NULL }, 26133, "udp" }, - { "wnn6-ds", { NULL }, 26208, "tcp" }, - { "wnn6-ds", { NULL }, 26208, "udp" }, - { "ezproxy", { NULL }, 26260, "tcp" }, - { "ezproxy", { NULL }, 26260, "udp" }, - { "ezmeeting", { NULL }, 26261, "tcp" }, - { "ezmeeting", { NULL }, 26261, "udp" }, - { "k3software-svr", { NULL }, 26262, "tcp" }, - { "k3software-svr", { NULL }, 26262, "udp" }, - { "k3software-cli", { NULL }, 26263, "tcp" }, - { "k3software-cli", { NULL }, 26263, "udp" }, - { "exoline-tcp", { NULL }, 26486, "tcp" }, - { "exoline-udp", { NULL }, 26486, "udp" }, - { "exoconfig", { NULL }, 26487, "tcp" }, - { "exoconfig", { NULL }, 26487, "udp" }, - { "exonet", { NULL }, 26489, "tcp" }, - { "exonet", { NULL }, 26489, "udp" }, - { "imagepump", { NULL }, 27345, "tcp" }, - { "imagepump", { NULL }, 27345, "udp" }, - { "jesmsjc", { NULL }, 27442, "tcp" }, - { "jesmsjc", { NULL }, 27442, "udp" }, - { "kopek-httphead", { NULL }, 27504, "tcp" }, - { "kopek-httphead", { NULL }, 27504, "udp" }, - { "ars-vista", { NULL }, 27782, "tcp" }, - { "ars-vista", { NULL }, 27782, "udp" }, - { "tw-auth-key", { NULL }, 27999, "tcp" }, - { "tw-auth-key", { NULL }, 27999, "udp" }, - { "nxlmd", { NULL }, 28000, "tcp" }, - { "nxlmd", { NULL }, 28000, "udp" }, - { "pqsp", { NULL }, 28001, "tcp" }, - { "siemensgsm", { NULL }, 28240, "tcp" }, - { "siemensgsm", { NULL }, 28240, "udp" }, - { "sgsap", { NULL }, 29118, "sctp"}, - { "otmp", { NULL }, 29167, "tcp" }, - { "otmp", { NULL }, 29167, "udp" }, - { "sbcap", { NULL }, 29168, "sctp"}, - { "iuhsctpassoc", { NULL }, 29169, "sctp"}, - { "pago-services1", { NULL }, 30001, "tcp" }, - { "pago-services1", { NULL }, 30001, "udp" }, - { "pago-services2", { NULL }, 30002, "tcp" }, - { "pago-services2", { NULL }, 30002, "udp" }, - { "kingdomsonline", { NULL }, 30260, "tcp" }, - { "kingdomsonline", { NULL }, 30260, "udp" }, - { "ovobs", { NULL }, 30999, "tcp" }, - { "ovobs", { NULL }, 30999, "udp" }, - { "autotrac-acp", { NULL }, 31020, "tcp" }, - { "yawn", { NULL }, 31029, "udp" }, - { "xqosd", { NULL }, 31416, "tcp" }, - { "xqosd", { NULL }, 31416, "udp" }, - { "tetrinet", { NULL }, 31457, "tcp" }, - { "tetrinet", { NULL }, 31457, "udp" }, - { "lm-mon", { NULL }, 31620, "tcp" }, - { "lm-mon", { NULL }, 31620, "udp" }, - { "dsx_monitor", { NULL }, 31685, "tcp" }, - { "gamesmith-port", { NULL }, 31765, "tcp" }, - { "gamesmith-port", { NULL }, 31765, "udp" }, - { "iceedcp_tx", { NULL }, 31948, "tcp" }, - { "iceedcp_tx", { NULL }, 31948, "udp" }, - { "iceedcp_rx", { NULL }, 31949, "tcp" }, - { "iceedcp_rx", { NULL }, 31949, "udp" }, - { "iracinghelper", { NULL }, 32034, "tcp" }, - { "iracinghelper", { NULL }, 32034, "udp" }, - { "t1distproc60", { NULL }, 32249, "tcp" }, - { "t1distproc60", { NULL }, 32249, "udp" }, - { "apm-link", { NULL }, 32483, "tcp" }, - { "apm-link", { NULL }, 32483, "udp" }, - { "sec-ntb-clnt", { NULL }, 32635, "tcp" }, - { "sec-ntb-clnt", { NULL }, 32635, "udp" }, - { "DMExpress", { NULL }, 32636, "tcp" }, - { "DMExpress", { NULL }, 32636, "udp" }, - { "filenet-powsrm", { NULL }, 32767, "tcp" }, - { "filenet-powsrm", { NULL }, 32767, "udp" }, - { "filenet-tms", { NULL }, 32768, "tcp" }, - { "filenet-tms", { NULL }, 32768, "udp" }, - { "filenet-rpc", { NULL }, 32769, "tcp" }, - { "filenet-rpc", { NULL }, 32769, "udp" }, - { "filenet-nch", { NULL }, 32770, "tcp" }, - { "filenet-nch", { NULL }, 32770, "udp" }, - { "filenet-rmi", { NULL }, 32771, "tcp" }, - { "filenet-rmi", { NULL }, 32771, "udp" }, - { "filenet-pa", { NULL }, 32772, "tcp" }, - { "filenet-pa", { NULL }, 32772, "udp" }, - { "filenet-cm", { NULL }, 32773, "tcp" }, - { "filenet-cm", { NULL }, 32773, "udp" }, - { "filenet-re", { NULL }, 32774, "tcp" }, - { "filenet-re", { NULL }, 32774, "udp" }, - { "filenet-pch", { NULL }, 32775, "tcp" }, - { "filenet-pch", { NULL }, 32775, "udp" }, - { "filenet-peior", { NULL }, 32776, "tcp" }, - { "filenet-peior", { NULL }, 32776, "udp" }, - { "filenet-obrok", { NULL }, 32777, "tcp" }, - { "filenet-obrok", { NULL }, 32777, "udp" }, - { "mlsn", { NULL }, 32801, "tcp" }, - { "mlsn", { NULL }, 32801, "udp" }, - { "retp", { NULL }, 32811, "tcp" }, - { "idmgratm", { NULL }, 32896, "tcp" }, - { "idmgratm", { NULL }, 32896, "udp" }, - { "aurora-balaena", { NULL }, 33123, "tcp" }, - { "aurora-balaena", { NULL }, 33123, "udp" }, - { "diamondport", { NULL }, 33331, "tcp" }, - { "diamondport", { NULL }, 33331, "udp" }, - { "dgi-serv", { NULL }, 33333, "tcp" }, - { "traceroute", { NULL }, 33434, "tcp" }, - { "traceroute", { NULL }, 33434, "udp" }, - { "snip-slave", { NULL }, 33656, "tcp" }, - { "snip-slave", { NULL }, 33656, "udp" }, - { "turbonote-2", { NULL }, 34249, "tcp" }, - { "turbonote-2", { NULL }, 34249, "udp" }, - { "p-net-local", { NULL }, 34378, "tcp" }, - { "p-net-local", { NULL }, 34378, "udp" }, - { "p-net-remote", { NULL }, 34379, "tcp" }, - { "p-net-remote", { NULL }, 34379, "udp" }, - { "dhanalakshmi", { NULL }, 34567, "tcp" }, - { "profinet-rt", { NULL }, 34962, "tcp" }, - { "profinet-rt", { NULL }, 34962, "udp" }, - { "profinet-rtm", { NULL }, 34963, "tcp" }, - { "profinet-rtm", { NULL }, 34963, "udp" }, - { "profinet-cm", { NULL }, 34964, "tcp" }, - { "profinet-cm", { NULL }, 34964, "udp" }, - { "ethercat", { NULL }, 34980, "tcp" }, - { "ethercat", { NULL }, 34980, "udp" }, - { "allpeers", { NULL }, 36001, "tcp" }, - { "allpeers", { NULL }, 36001, "udp" }, - { "s1-control", { NULL }, 36412, "sctp"}, - { "x2-control", { NULL }, 36422, "sctp"}, - { "m2ap", { NULL }, 36443, "sctp"}, - { "m3ap", { NULL }, 36444, "sctp"}, - { "kastenxpipe", { NULL }, 36865, "tcp" }, - { "kastenxpipe", { NULL }, 36865, "udp" }, - { "neckar", { NULL }, 37475, "tcp" }, - { "neckar", { NULL }, 37475, "udp" }, - { "unisys-eportal", { NULL }, 37654, "tcp" }, - { "unisys-eportal", { NULL }, 37654, "udp" }, - { "galaxy7-data", { NULL }, 38201, "tcp" }, - { "galaxy7-data", { NULL }, 38201, "udp" }, - { "fairview", { NULL }, 38202, "tcp" }, - { "fairview", { NULL }, 38202, "udp" }, - { "agpolicy", { NULL }, 38203, "tcp" }, - { "agpolicy", { NULL }, 38203, "udp" }, - { "turbonote-1", { NULL }, 39681, "tcp" }, - { "turbonote-1", { NULL }, 39681, "udp" }, - { "safetynetp", { NULL }, 40000, "tcp" }, - { "safetynetp", { NULL }, 40000, "udp" }, - { "cscp", { NULL }, 40841, "tcp" }, - { "cscp", { NULL }, 40841, "udp" }, - { "csccredir", { NULL }, 40842, "tcp" }, - { "csccredir", { NULL }, 40842, "udp" }, - { "csccfirewall", { NULL }, 40843, "tcp" }, - { "csccfirewall", { NULL }, 40843, "udp" }, - { "ortec-disc", { NULL }, 40853, "udp" }, - { "fs-qos", { NULL }, 41111, "tcp" }, - { "fs-qos", { NULL }, 41111, "udp" }, - { "tentacle", { NULL }, 41121, "tcp" }, - { "crestron-cip", { NULL }, 41794, "tcp" }, - { "crestron-cip", { NULL }, 41794, "udp" }, - { "crestron-ctp", { NULL }, 41795, "tcp" }, - { "crestron-ctp", { NULL }, 41795, "udp" }, - { "candp", { NULL }, 42508, "tcp" }, - { "candp", { NULL }, 42508, "udp" }, - { "candrp", { NULL }, 42509, "tcp" }, - { "candrp", { NULL }, 42509, "udp" }, - { "caerpc", { NULL }, 42510, "tcp" }, - { "caerpc", { NULL }, 42510, "udp" }, - { "reachout", { NULL }, 43188, "tcp" }, - { "reachout", { NULL }, 43188, "udp" }, - { "ndm-agent-port", { NULL }, 43189, "tcp" }, - { "ndm-agent-port", { NULL }, 43189, "udp" }, - { "ip-provision", { NULL }, 43190, "tcp" }, - { "ip-provision", { NULL }, 43190, "udp" }, - { "noit-transport", { NULL }, 43191, "tcp" }, - { "ew-mgmt", { NULL }, 43440, "tcp" }, - { "ew-disc-cmd", { NULL }, 43440, "udp" }, - { "ciscocsdb", { NULL }, 43441, "tcp" }, - { "ciscocsdb", { NULL }, 43441, "udp" }, - { "pmcd", { NULL }, 44321, "tcp" }, - { "pmcd", { NULL }, 44321, "udp" }, - { "pmcdproxy", { NULL }, 44322, "tcp" }, - { "pmcdproxy", { NULL }, 44322, "udp" }, - { "pcp", { NULL }, 44323, "udp" }, - { "rbr-debug", { NULL }, 44553, "tcp" }, - { "rbr-debug", { NULL }, 44553, "udp" }, - { "EtherNet/IP-2", { NULL }, 44818, "tcp" }, - { "EtherNet/IP-2", { NULL }, 44818, "udp" }, - { "invision-ag", { NULL }, 45054, "tcp" }, - { "invision-ag", { NULL }, 45054, "udp" }, - { "eba", { NULL }, 45678, "tcp" }, - { "eba", { NULL }, 45678, "udp" }, - { "qdb2service", { NULL }, 45825, "tcp" }, - { "qdb2service", { NULL }, 45825, "udp" }, - { "ssr-servermgr", { NULL }, 45966, "tcp" }, - { "ssr-servermgr", { NULL }, 45966, "udp" }, - { "mediabox", { NULL }, 46999, "tcp" }, - { "mediabox", { NULL }, 46999, "udp" }, - { "mbus", { NULL }, 47000, "tcp" }, - { "mbus", { NULL }, 47000, "udp" }, - { "winrm", { NULL }, 47001, "tcp" }, - { "dbbrowse", { NULL }, 47557, "tcp" }, - { "dbbrowse", { NULL }, 47557, "udp" }, - { "directplaysrvr", { NULL }, 47624, "tcp" }, - { "directplaysrvr", { NULL }, 47624, "udp" }, - { "ap", { NULL }, 47806, "tcp" }, - { "ap", { NULL }, 47806, "udp" }, - { "bacnet", { NULL }, 47808, "tcp" }, - { "bacnet", { NULL }, 47808, "udp" }, - { "nimcontroller", { NULL }, 48000, "tcp" }, - { "nimcontroller", { NULL }, 48000, "udp" }, - { "nimspooler", { NULL }, 48001, "tcp" }, - { "nimspooler", { NULL }, 48001, "udp" }, - { "nimhub", { NULL }, 48002, "tcp" }, - { "nimhub", { NULL }, 48002, "udp" }, - { "nimgtw", { NULL }, 48003, "tcp" }, - { "nimgtw", { NULL }, 48003, "udp" }, - { "nimbusdb", { NULL }, 48004, "tcp" }, - { "nimbusdbctrl", { NULL }, 48005, "tcp" }, - { "3gpp-cbsp", { NULL }, 48049, "tcp" }, - { "isnetserv", { NULL }, 48128, "tcp" }, - { "isnetserv", { NULL }, 48128, "udp" }, - { "blp5", { NULL }, 48129, "tcp" }, - { "blp5", { NULL }, 48129, "udp" }, - { "com-bardac-dw", { NULL }, 48556, "tcp" }, - { "com-bardac-dw", { NULL }, 48556, "udp" }, - { "iqobject", { NULL }, 48619, "tcp" }, - { "iqobject", { NULL }, 48619, "udp" }, -# endif /* USE_IANA_REGISTERED_PORTS */ - { NULL, { NULL }, 0, NULL } -}; - -struct servent *getservbyport(int port, const char *proto) -{ - unsigned short u_port; - const char *protocol = NULL; - int error = 0; - size_t i; - - u_port = ntohs((unsigned short)port); - - if (proto) { - switch (ares_strlen(proto)) { - case 3: - if (!strncasecmp(proto, "tcp", 3)) { - protocol = "tcp"; - } else if (!strncasecmp(proto, "udp", 3)) { - protocol = "udp"; - } else { - error = WSAEFAULT; - } - break; - case 4: - if (!strncasecmp(proto, "sctp", 4)) { - protocol = "sctp"; - } else if (!strncasecmp(proto, "dccp", 4)) { - protocol = "dccp"; - } else { - error = WSAEFAULT; - } - break; - default: - error = WSAEFAULT; - } - } - - if (!error) { - for (i = 0; i < (sizeof(IANAports) / sizeof(IANAports[0])) - 1; i++) { - if (u_port == IANAports[i].s_port) { - if (!protocol || !strcasecmp(protocol, IANAports[i].s_proto)) { - return (struct servent *)&IANAports[i]; - } - } - } - error = WSANO_DATA; - } - - SET_SOCKERRNO(error); - return NULL; -} - -#endif /* _WIN32_WCE */ diff --git a/deps/cares/src/lib/ares_platform.h b/deps/cares/src/lib/ares_platform.h deleted file mode 100644 index 44b2c036443c52..00000000000000 --- a/deps/cares/src/lib/ares_platform.h +++ /dev/null @@ -1,52 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) 2004 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef HEADER_CARES_PLATFORM_H -#define HEADER_CARES_PLATFORM_H - -#include "ares_setup.h" - -#if defined(WIN32) && !defined(MSDOS) - -typedef enum { - WIN_UNKNOWN, - WIN_3X, - WIN_9X, - WIN_NT, - WIN_CE -} win_platform; - -win_platform ares__getplatform(void); - -#endif - -#if defined(_WIN32_WCE) - -struct servent *getservbyport(int port, const char *proto); - -#endif - -#endif /* HEADER_CARES_PLATFORM_H */ diff --git a/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h index 6a9e04af2eb633..d6bd426d39c180 100644 --- a/deps/cares/src/lib/ares_private.h +++ b/deps/cares/src/lib/ares_private.h @@ -27,21 +27,47 @@ #ifndef __ARES_PRIVATE_H #define __ARES_PRIVATE_H -/* - * Define WIN32 when build target is Win32 API +/* ============================================================================ + * NOTE: All c-ares source files should include ares_private.h as the first + * header. + * ============================================================================ */ -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif +#include "ares_setup.h" +#include "ares.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> #endif -#ifdef WATT32 -# include <tcp.h> -# include <sys/ioctl.h> +#include "ares_mem.h" +#include "ares_ipv6.h" +#include "util/ares_math.h" +#include "util/ares_time.h" +#include "util/ares_rand.h" +#include "ares_array.h" +#include "ares_llist.h" +#include "dsa/ares_slist.h" +#include "ares_htable_strvp.h" +#include "ares_htable_szvp.h" +#include "ares_htable_asvp.h" +#include "ares_htable_dict.h" +#include "ares_htable_vpvp.h" +#include "ares_htable_vpstr.h" +#include "record/ares_dns_multistring.h" +#include "ares_buf.h" +#include "record/ares_dns_private.h" +#include "util/ares_iface_ips.h" +#include "util/ares_threads.h" +#include "ares_socket.h" +#include "ares_conn.h" +#include "ares_str.h" +#include "str/ares_strsplit.h" +#include "util/ares_uri.h" + +#ifndef HAVE_GETENV +# include "ares_getenv.h" +# define getenv(ptr) ares_getenv(ptr) #endif #define DEFAULT_TIMEOUT 2000 /* milliseconds */ @@ -54,24 +80,10 @@ * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *' * increases required alignment from 1 to 4 [-Wcast-align] */ -#define CARES_INADDR_CAST(type, var) ((type)((void *)var)) +#define CARES_INADDR_CAST(type, var) ((type)((const void *)var)) -#if defined(WIN32) && !defined(WATT32) - -# define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP" +#if defined(USE_WINSOCK) # define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters" -# define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient" -# define WIN_NT_DNSCLIENT \ - "Software\\Policies\\Microsoft\\Windows NT\\DNSClient" -# define NAMESERVER "NameServer" -# define DHCPNAMESERVER "DhcpNameServer" -# define DATABASEPATH "DatabasePath" -# define WIN_PATH_HOSTS "\\hosts" -# define SEARCHLIST_KEY "SearchList" -# define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix" -# define INTERFACES_KEY "Interfaces" -# define DOMAIN_KEY "Domain" -# define DHCPDOMAIN_KEY "DhcpDomain" # define PATH_RESOLV_CONF "" #elif defined(WATT32) @@ -104,39 +116,6 @@ W32_FUNC const char *_w32_GetHostsFile(void); #endif -#include "ares_ipv6.h" - -struct ares_rand_state; -typedef struct ares_rand_state ares_rand_state; - -#include "ares__llist.h" -#include "ares__slist.h" -#include "ares__htable_strvp.h" -#include "ares__htable_szvp.h" -#include "ares__htable_asvp.h" -#include "ares__buf.h" -#include "ares_dns_private.h" -#include "ares__iface_ips.h" -#include "ares__threads.h" - -#ifndef HAVE_GETENV -# include "ares_getenv.h" -# define getenv(ptr) ares_getenv(ptr) -#endif - -#include "ares_str.h" -#include "ares_strsplit.h" - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) -#endif - /********* EDNS defines section ******/ #define EDNSPACKETSZ \ 1232 /* Reasonable UDP payload size, as agreed by operators \ @@ -146,79 +125,50 @@ typedef struct ares_rand_state ares_rand_state; /********* EDNS defines section ******/ +/* Default values for server failover behavior. We retry failed servers with + * a 10% probability and a minimum delay of 5 seconds between retries. + */ +#define DEFAULT_SERVER_RETRY_CHANCE 10 +#define DEFAULT_SERVER_RETRY_DELAY 5000 -struct query; - -struct server_state; +typedef void (*ares_query_enqueue_cb)(void *data); -struct server_connection { - struct server_state *server; - ares_socket_t fd; - ares_bool_t is_tcp; - /* total number of queries run on this connection since it was established */ - size_t total_queries; - /* list of outstanding queries to this connection */ - ares__llist_t *queries_to_conn; -}; - -struct server_state { - /* Configuration */ - size_t idx; /* index for server in system configuration */ - struct ares_addr addr; - unsigned short udp_port; /* host byte order */ - unsigned short tcp_port; /* host byte order */ - char ll_iface[64]; /* IPv6 Link Local Interface */ - unsigned int ll_scope; /* IPv6 Link Local Scope */ - - size_t consec_failures; /* Consecutive query failure count - * can be hard errors or timeouts - */ - ares__llist_t *connections; - struct server_connection *tcp_conn; - - /* TCP buffer since multiple responses can come back in one read, or partial - * in a read */ - ares__buf_t *tcp_parser; - - /* TCP output queue */ - ares__buf_t *tcp_send; - - /* Link back to owning channel */ - ares_channel_t *channel; -}; +struct ares_query; +typedef struct ares_query ares_query_t; /* State to represent a DNS query */ -struct query { +struct ares_query { /* Query ID from qbuf, for faster lookup, and current timeout */ - unsigned short qid; /* host byte order */ - struct timeval timeout; - ares_channel_t *channel; + unsigned short qid; /* host byte order */ + ares_timeval_t ts; /*!< Timestamp query was sent */ + ares_timeval_t timeout; + ares_channel_t *channel; /* * Node object for each list entry the query belongs to in order to * make removal operations O(1). */ - ares__slist_node_t *node_queries_by_timeout; - ares__llist_node_t *node_queries_to_conn; - ares__llist_node_t *node_all_queries; + ares_slist_node_t *node_queries_by_timeout; + ares_llist_node_t *node_queries_to_conn; + ares_llist_node_t *node_all_queries; /* connection handle query is associated with */ - struct server_connection *conn; + ares_conn_t *conn; - /* Arguments passed to ares_send() */ - unsigned char *qbuf; - size_t qlen; + /* Query */ + ares_dns_record_t *query; - ares_callback_dnsrec callback; - void *arg; + ares_callback_dnsrec callback; + void *arg; /* Query status */ size_t try_count; /* Number of times we tried this query already. */ + size_t cookie_try_count; /* Attempt count for cookie resends */ ares_bool_t using_tcp; ares_status_t error_status; - size_t timeouts; /* number of timeouts we saw for this request */ - ares_bool_t no_retries; /* do not perform any additional retries, this is set - * when a query is to be canceled */ + size_t timeouts; /* number of timeouts we saw for this request */ + ares_bool_t no_retries; /* do not perform any additional retries, this is + * set when a query is to be canceled */ }; struct apattern { @@ -226,71 +176,71 @@ struct apattern { unsigned char mask; }; -struct ares__qcache; -typedef struct ares__qcache ares__qcache_t; +struct ares_qcache; +typedef struct ares_qcache ares_qcache_t; struct ares_hosts_file; typedef struct ares_hosts_file ares_hosts_file_t; struct ares_channeldata { /* Configuration data */ - unsigned int flags; - size_t timeout; /* in milliseconds */ - size_t tries; - size_t ndots; - size_t maxtimeout; /* in milliseconds */ - ares_bool_t rotate; - unsigned short udp_port; /* stored in network order */ - unsigned short tcp_port; /* stored in network order */ - int socket_send_buffer_size; /* setsockopt takes int */ - int socket_receive_buffer_size; /* setsockopt takes int */ - char **domains; - size_t ndomains; - struct apattern *sortlist; - size_t nsort; - char *lookups; - size_t ednspsz; - unsigned int qcache_max_ttl; - ares_evsys_t evsys; - unsigned int optmask; + unsigned int flags; + size_t timeout; /* in milliseconds */ + size_t tries; + size_t ndots; + size_t maxtimeout; /* in milliseconds */ + ares_bool_t rotate; + unsigned short udp_port; /* stored in network order */ + unsigned short tcp_port; /* stored in network order */ + int socket_send_buffer_size; /* setsockopt takes int */ + int socket_receive_buffer_size; /* setsockopt takes int */ + char **domains; + size_t ndomains; + struct apattern *sortlist; + size_t nsort; + char *lookups; + size_t ednspsz; + unsigned int qcache_max_ttl; + ares_evsys_t evsys; + unsigned int optmask; /* For binding to local devices and/or IP addresses. Leave * them null/zero for no binding. */ - char local_dev_name[32]; - unsigned int local_ip4; - unsigned char local_ip6[16]; + char local_dev_name[32]; + unsigned int local_ip4; + unsigned char local_ip6[16]; /* Thread safety lock */ - ares__thread_mutex_t *lock; + ares_thread_mutex_t *lock; /* Conditional to wake waiters when queue is empty */ - ares__thread_cond_t *cond_empty; + ares_thread_cond_t *cond_empty; /* Server addresses and communications state. Sorted by least consecutive * failures, followed by the configuration order if failures are equal. */ - ares__slist_t *servers; + ares_slist_t *servers; /* random state to use when generating new ids and generating retry penalties */ - ares_rand_state *rand_state; + ares_rand_state *rand_state; /* All active queries in a single list */ - ares__llist_t *all_queries; + ares_llist_t *all_queries; /* Queries bucketed by qid, for quickly dispatching DNS responses: */ - ares__htable_szvp_t *queries_by_qid; + ares_htable_szvp_t *queries_by_qid; /* Queries bucketed by timeout, for quickly handling timeouts: */ - ares__slist_t *queries_by_timeout; + ares_slist_t *queries_by_timeout; /* Map linked list node member for connection to file descriptor. We use * the node instead of the connection object itself so we can quickly look * up a connection and remove it if necessary (as otherwise we'd have to * scan all connections) */ - ares__htable_asvp_t *connnode_by_socket; + ares_htable_asvp_t *connnode_by_socket; - ares_sock_state_cb sock_state_cb; - void *sock_state_cb_data; + ares_sock_state_cb sock_state_cb; + void *sock_state_cb_data; ares_sock_create_callback sock_create_cb; void *sock_create_cb_data; @@ -298,8 +248,17 @@ struct ares_channeldata { ares_sock_config_callback sock_config_cb; void *sock_config_cb_data; - const struct ares_socket_functions *sock_funcs; + struct ares_socket_functions_ex sock_funcs; void *sock_func_cb_data; + const struct ares_socket_functions *legacy_sock_funcs; + void *legacy_sock_funcs_cb_data; + + ares_pending_write_cb notify_pending_write_cb; + void *notify_pending_write_cb_data; + ares_bool_t notify_pending_write; + + ares_query_enqueue_cb query_enqueue_cb; + void *query_enqueue_cb_data; /* Path for resolv.conf file, configurable via ares_options */ char *resolvconf_path; @@ -314,26 +273,50 @@ struct ares_channeldata { ares_hosts_file_t *hf; /* Query Cache */ - ares__qcache_t *qcache; + ares_qcache_t *qcache; + + /* Fields controlling server failover behavior. + * The retry chance is the probability (1/N) by which we will retry a failed + * server instead of the best server when selecting a server to send queries + * to. + * The retry delay is the minimum time in milliseconds to wait between doing + * such retries (applied per-server). + */ + unsigned short server_retry_chance; + size_t server_retry_delay; + + /* Callback triggered when a server has a successful or failed response */ + ares_server_state_callback server_state_cb; + void *server_state_cb_data; + + /* TRUE if a reinit is pending. Reinit spawns a thread to read the system + * configuration and then apply the configuration since configuration + * reading may block. The thread handle is provided for waiting on thread + * exit. */ + ares_bool_t reinit_pending; + ares_thread_t *reinit_thread; + + /* Whether the system is up or not. This is mainly to prevent deadlocks + * and access violations during the cleanup process. Some things like + * system config changes might get triggered and we need a flag to make + * sure we don't take action. */ + ares_bool_t sys_up; }; /* Does the domain end in ".onion" or ".onion."? Case-insensitive. */ -ares_bool_t ares__is_onion_domain(const char *name); - -/* Memory management functions */ -extern void *(*ares_malloc)(size_t size); -extern void *(*ares_realloc)(void *ptr, size_t size); -extern void (*ares_free)(void *ptr); -void *ares_malloc_zero(size_t size); -void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size); - -/* return true if now is exactly check time or later */ -ares_bool_t ares__timedout(const struct timeval *now, - const struct timeval *check); +ares_bool_t ares_is_onion_domain(const char *name); /* Returns one of the normal ares status codes like ARES_SUCCESS */ -ares_status_t ares__send_query(struct query *query, struct timeval *now); -ares_status_t ares__requeue_query(struct query *query, struct timeval *now); +ares_status_t ares_send_query(ares_server_t *requested_server /* Optional */, + ares_query_t *query, const ares_timeval_t *now); +ares_status_t ares_requeue_query(ares_query_t *query, const ares_timeval_t *now, + ares_status_t status, + ares_bool_t inc_try_count, + ares_dns_record_t *dnsrec, + ares_array_t **requeue); + +/*! Count the number of labels (dots+1) in a domain */ +size_t ares_name_label_cnt(const char *name); /*! Retrieve a list of names to use for searching. The first successful * query in the list wins. This function also uses the HOSTSALIASES file @@ -341,61 +324,48 @@ ares_status_t ares__requeue_query(struct query *query, struct timeval *now); * * \param[in] channel initialized ares channel * \param[in] name initial name being searched - * \param[out] names array of names to attempt, use ares__strsplit_free() + * \param[out] names array of names to attempt, use ares_strsplit_free() * when no longer needed. * \param[out] names_len number of names in array * \return ARES_SUCCESS on success, otherwise one of the other error codes. */ -ares_status_t ares__search_name_list(const ares_channel_t *channel, - const char *name, char ***names, - size_t *names_len); +ares_status_t ares_search_name_list(const ares_channel_t *channel, + const char *name, char ***names, + size_t *names_len); /*! Function to create callback arg for converting from ares_callback_dnsrec * to ares_calback */ -void *ares__dnsrec_convert_arg(ares_callback callback, void *arg); +void *ares_dnsrec_convert_arg(ares_callback callback, void *arg); /*! Callback function used to convert from the ares_callback_dnsrec prototype to * the ares_callback prototype, by writing the result and passing that to * the inner callback. */ -void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, - const ares_dns_record_t *dnsrec); - -void ares__close_connection(struct server_connection *conn); -void ares__close_sockets(struct server_state *server); -void ares__check_cleanup_conn(const ares_channel_t *channel, - struct server_connection *conn); -void ares__free_query(struct query *query); - -ares_rand_state *ares__init_rand_state(void); -void ares__destroy_rand_state(ares_rand_state *state); -void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len); - -unsigned short ares__generate_new_id(ares_rand_state *state); -struct timeval ares__tvnow(void); -void ares__timeval_remaining(struct timeval *remaining, - const struct timeval *now, - const struct timeval *tout); -ares_status_t ares__expand_name_validated(const unsigned char *encoded, - const unsigned char *abuf, - size_t alen, char **s, size_t *enclen, - ares_bool_t is_hostname); -ares_status_t ares__expand_name_for_response(const unsigned char *encoded, - const unsigned char *abuf, - size_t alen, char **s, - size_t *enclen, - ares_bool_t is_hostname); +void ares_dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec); + +void ares_free_query(ares_query_t *query); + +unsigned short ares_generate_new_id(ares_rand_state *state); +ares_status_t ares_expand_name_validated(const unsigned char *encoded, + const unsigned char *abuf, size_t alen, + char **s, size_t *enclen, + ares_bool_t is_hostname); ares_status_t ares_expand_string_ex(const unsigned char *encoded, const unsigned char *abuf, size_t alen, unsigned char **s, size_t *enclen); -ares_status_t ares__init_servers_state(ares_channel_t *channel); -ares_status_t ares__init_by_options(ares_channel_t *channel, - const struct ares_options *options, - int optmask); -ares_status_t ares__init_by_sysconfig(ares_channel_t *channel); +ares_status_t ares_init_servers_state(ares_channel_t *channel); +ares_status_t ares_init_by_options(ares_channel_t *channel, + const struct ares_options *options, + int optmask); +void ares_set_query_enqueue_cb(ares_channel_t *channel, + ares_query_enqueue_cb callback, + void *user_data); +ares_status_t ares_init_by_sysconfig(ares_channel_t *channel); +void ares_set_socket_functions_def(ares_channel_t *channel); typedef struct { - ares__llist_t *sconfig; + ares_llist_t *sconfig; struct apattern *sortlist; size_t nsortlist; char **domains; @@ -408,121 +378,160 @@ typedef struct { ares_bool_t usevc; } ares_sysconfig_t; -ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig); +ares_status_t ares_sysconfig_set_options(ares_sysconfig_t *sysconfig, + const char *str); + +ares_status_t ares_init_by_environment(ares_sysconfig_t *sysconfig); + + +typedef ares_status_t (*ares_sysconfig_line_cb_t)(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line); -ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig); -ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, - const char *str); +ares_status_t ares_sysconfig_parse_resolv_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line); -void ares__destroy_servers_state(ares_channel_t *channel); +ares_status_t ares_sysconfig_process_buf(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *buf, + ares_sysconfig_line_cb_t cb); + +ares_status_t ares_init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_bool_t process_resolvconf); +#ifdef __APPLE__ +ares_status_t ares_init_sysconfig_macos(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig); +#endif +#ifdef USE_WINSOCK +ares_status_t ares_init_sysconfig_windows(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig); +#endif + +ares_status_t ares_parse_sortlist(struct apattern **sortlist, size_t *nsort, + const char *str); /* Returns ARES_SUCCESS if alias found, alias is set. Returns ARES_ENOTFOUND * if not alias found. Returns other errors on critical failure like * ARES_ENOMEM */ -ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, - const char *name, char **alias); +ares_status_t ares_lookup_hostaliases(const ares_channel_t *channel, + const char *name, char **alias); -ares_status_t ares__cat_domain(const char *name, const char *domain, char **s); -ares_status_t ares__sortaddrinfo(ares_channel_t *channel, - struct ares_addrinfo_node *ai_node); +ares_status_t ares_cat_domain(const char *name, const char *domain, char **s); +ares_status_t ares_sortaddrinfo(ares_channel_t *channel, + struct ares_addrinfo_node *ai_node); -void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node); -ares_bool_t ares__is_localhost(const char *name); +void ares_freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node); +ares_bool_t ares_is_localhost(const char *name); struct ares_addrinfo_node * - ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node); -void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head, - struct ares_addrinfo_node *tail); + ares_append_addrinfo_node(struct ares_addrinfo_node **ai_node); +void ares_addrinfo_cat_nodes(struct ares_addrinfo_node **head, + struct ares_addrinfo_node *tail); -void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname); +void ares_freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname); -struct ares_addrinfo_cname * - ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname); +struct ares_addrinfo_cname * + ares_append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname); ares_status_t ares_append_ai_node(int aftype, unsigned short port, unsigned int ttl, const void *adata, struct ares_addrinfo_node **nodes); -void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head, - struct ares_addrinfo_cname *tail); +void ares_addrinfo_cat_cnames(struct ares_addrinfo_cname **head, + struct ares_addrinfo_cname *tail); -ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec, - ares_bool_t cname_only_is_enodata, - unsigned short port, - struct ares_addrinfo *ai); +ares_status_t ares_parse_into_addrinfo(const ares_dns_record_t *dnsrec, + ares_bool_t cname_only_is_enodata, + unsigned short port, + struct ares_addrinfo *ai); ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, const void *addr, int addrlen, int family, struct hostent **host); -ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family, - struct hostent **host); -ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family, - size_t req_naddrttls, - struct ares_addrttl *addrttls, - struct ares_addr6ttl *addr6ttls, - size_t *naddrttls); -ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port, - const struct ares_addrinfo_hints *hints, - struct ares_addrinfo *ai); -ares_status_t ares__open_connection(ares_channel_t *channel, - struct server_state *server, - ares_bool_t is_tcp); -ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type, - int protocol); -ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s, - const void *data, size_t len); -ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s, - void *data, size_t data_len, int flags, - struct sockaddr *from, - ares_socklen_t *from_len); -ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s, - void *data, size_t data_len); -void ares__close_socket(ares_channel, ares_socket_t); -int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd, - const struct sockaddr *addr, ares_socklen_t addrlen); -void ares__destroy_server(struct server_state *server); - -ares_status_t ares__servers_update(ares_channel_t *channel, - ares__llist_t *server_list, - ares_bool_t user_specified); -ares_status_t ares__sconfig_append(ares__llist_t **sconfig, - const struct ares_addr *addr, - unsigned short udp_port, - unsigned short tcp_port, - const char *ll_iface); -ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, - const char *str, - ares_bool_t ignore_invalid); -ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers, - size_t nservers, - ares__llist_t **llist); +/* host address must be valid or NULL as will create or append */ +ares_status_t ares_addrinfo2hostent(const struct ares_addrinfo *ai, int family, + struct hostent **host); + +ares_status_t ares_addrinfo2addrttl(const struct ares_addrinfo *ai, int family, + size_t req_naddrttls, + struct ares_addrttl *addrttls, + struct ares_addr6ttl *addr6ttls, + size_t *naddrttls); +ares_status_t ares_addrinfo_localhost(const char *name, unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai); + +ares_status_t ares_servers_update(ares_channel_t *channel, + ares_llist_t *server_list, + ares_bool_t user_specified); +ares_status_t + ares_sconfig_append(const ares_channel_t *channel, ares_llist_t **sconfig, + const struct ares_addr *addr, unsigned short udp_port, + unsigned short tcp_port, const char *ll_iface); +ares_status_t ares_sconfig_append_fromstr(const ares_channel_t *channel, + ares_llist_t **sconfig, + const char *str, + ares_bool_t ignore_invalid); +ares_status_t ares_in_addr_to_sconfig_llist(const struct in_addr *servers, + size_t nservers, + ares_llist_t **llist); +ares_status_t ares_get_server_addr(const ares_server_t *server, + ares_buf_t *buf); struct ares_hosts_entry; typedef struct ares_hosts_entry ares_hosts_entry_t; -void ares__hosts_file_destroy(ares_hosts_file_t *hf); -ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel, - ares_bool_t use_env, const char *ipaddr, - const ares_hosts_entry_t **entry); -ares_status_t ares__hosts_search_host(ares_channel_t *channel, - ares_bool_t use_env, const char *host, - const ares_hosts_entry_t **entry); -ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry, - int family, - struct hostent **hostent); -ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, - const char *name, int family, - unsigned short port, - ares_bool_t want_cnames, - struct ares_addrinfo *ai); - +void ares_hosts_file_destroy(ares_hosts_file_t *hf); +ares_status_t ares_hosts_search_ipaddr(ares_channel_t *channel, + ares_bool_t use_env, const char *ipaddr, + const ares_hosts_entry_t **entry); +ares_status_t ares_hosts_search_host(ares_channel_t *channel, + ares_bool_t use_env, const char *host, + const ares_hosts_entry_t **entry); +ares_status_t ares_hosts_entry_to_hostent(const ares_hosts_entry_t *entry, + int family, struct hostent **hostent); +ares_status_t ares_hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, + const char *name, int family, + unsigned short port, + ares_bool_t want_cnames, + struct ares_addrinfo *ai); + +/* Same as ares_query_dnsrec() except does not take a channel lock. Use this + * if a channel lock is already held */ +ares_status_t ares_query_nolock(ares_channel_t *channel, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid); + +/*! Flags controlling behavior for ares_send_nolock() */ +typedef enum { + ARES_SEND_FLAG_NOCACHE = 1 << 0, /*!< Do not query the cache */ + ARES_SEND_FLAG_NORETRY = 1 << 1 /*!< Do not retry this query on error */ +} ares_send_flags_t; + +/* Similar to ares_send_dnsrec() except does not take a channel lock, allows + * specifying a particular server to use, and also flags controlling behavior. + */ +ares_status_t ares_send_nolock(ares_channel_t *channel, ares_server_t *server, + ares_send_flags_t flags, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid); + +/* Same as ares_gethostbyaddr() except does not take a channel lock. Use this + * if a channel lock is already held */ +void ares_gethostbyaddr_nolock(ares_channel_t *channel, const void *addr, + int addrlen, int family, + ares_host_callback callback, void *arg); /*! Parse a compressed DNS name as defined in RFC1035 starting at the current * offset within the buffer. * * It is assumed that either a const buffer is being used, or before - * the message processing was started that ares__buf_reclaim() was called. + * the message processing was started that ares_buf_reclaim() was called. * * \param[in] buf Initialized buffer object * \param[out] name Pointer passed by reference to be filled in with @@ -532,8 +541,8 @@ ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry, * a valid hostname or will return error. * \return ARES_SUCCESS on success */ -ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name, - ares_bool_t is_hostname); +ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, + ares_bool_t is_hostname); /*! Write the DNS name to the buffer in the DNS domain-name syntax as a * series of labels. The maximum domain name length is 255 characters with @@ -552,9 +561,9 @@ ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name, * \return ARES_SUCCESS on success, most likely ARES_EBADNAME if the name is * bad. */ -ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list, - ares_bool_t validate_hostname, - const char *name); +ares_status_t ares_dns_name_write(ares_buf_t *buf, ares_llist_t **list, + ares_bool_t validate_hostname, + const char *name); /*! Check if the queue is empty, if so, wake any waiters. This is only * effective if built with threading support. @@ -565,54 +574,46 @@ ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list, */ void ares_queue_notify_empty(ares_channel_t *channel); - -#define ARES_SWAP_BYTE(a, b) \ - do { \ - unsigned char swapByte = *(a); \ - *(a) = *(b); \ - *(b) = swapByte; \ - } while (0) - -#define SOCK_STATE_CALLBACK(c, s, r, w) \ - do { \ - if ((c)->sock_state_cb) { \ - (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \ - } \ - } while (0) - -#define ARES_CONFIG_CHECK(x) \ - (x && x->lookups && ares__slist_len(x->servers) > 0 && \ - x->timeout > 0 && x->tries > 0) - -ares_bool_t ares__subnet_match(const struct ares_addr *addr, - const struct ares_addr *subnet, - unsigned char netmask); -ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr); - -size_t ares__round_up_pow2(size_t n); -size_t ares__log2(size_t n); -size_t ares__pow(size_t x, size_t y); -size_t ares__count_digits(size_t n); -size_t ares__count_hexdigits(size_t n); -unsigned char ares__count_bits_u8(unsigned char x); -void ares__qcache_destroy(ares__qcache_t *cache); -ares_status_t ares__qcache_create(ares_rand_state *rand_state, - unsigned int max_ttl, - ares__qcache_t **cache_out); -void ares__qcache_flush(ares__qcache_t *cache); -ares_status_t ares_qcache_insert(ares_channel_t *channel, - const struct timeval *now, - const struct query *query, - ares_dns_record_t *dnsrec); +#define ARES_CONFIG_CHECK(x) \ + (x && x->lookups && ares_slist_len(x->servers) > 0 && x->timeout > 0 && \ + x->tries > 0) + +ares_bool_t ares_subnet_match(const struct ares_addr *addr, + const struct ares_addr *subnet, + unsigned char netmask); +ares_bool_t ares_addr_is_linklocal(const struct ares_addr *addr); + +void ares_qcache_destroy(ares_qcache_t *cache); +ares_status_t ares_qcache_create(ares_rand_state *rand_state, + unsigned int max_ttl, + ares_qcache_t **cache_out); +void ares_qcache_flush(ares_qcache_t *cache); +ares_status_t ares_qcache_insert(ares_channel_t *channel, + const ares_timeval_t *now, + const ares_query_t *query, + const ares_dns_record_t *dnsrec); ares_status_t ares_qcache_fetch(ares_channel_t *channel, - const struct timeval *now, + const ares_timeval_t *now, const ares_dns_record_t *dnsrec, const ares_dns_record_t **dnsrec_resp); -ares_status_t ares__channel_threading_init(ares_channel_t *channel); -void ares__channel_threading_destroy(ares_channel_t *channel); -void ares__channel_lock(ares_channel_t *channel); -void ares__channel_unlock(ares_channel_t *channel); +void ares_metrics_record(const ares_query_t *query, ares_server_t *server, + ares_status_t status, const ares_dns_record_t *dnsrec); +size_t ares_metrics_server_timeout(const ares_server_t *server, + const ares_timeval_t *now); + +ares_status_t ares_cookie_apply(ares_dns_record_t *dnsrec, ares_conn_t *conn, + const ares_timeval_t *now); +ares_status_t ares_cookie_validate(ares_query_t *query, + const ares_dns_record_t *dnsresp, + ares_conn_t *conn, + const ares_timeval_t *now, + ares_array_t **requeue); + +ares_status_t ares_channel_threading_init(ares_channel_t *channel); +void ares_channel_threading_destroy(ares_channel_t *channel); +void ares_channel_lock(const ares_channel_t *channel); +void ares_channel_unlock(const ares_channel_t *channel); struct ares_event_thread; typedef struct ares_event_thread ares_event_thread_t; @@ -621,14 +622,6 @@ void ares_event_thread_destroy(ares_channel_t *channel); ares_status_t ares_event_thread_init(ares_channel_t *channel); -#ifdef _MSC_VER -typedef __int64 ares_int64_t; -typedef unsigned __int64 ares_uint64_t; -#else -typedef long long ares_int64_t; -typedef unsigned long long ares_uint64_t; -#endif - #ifdef _WIN32 # define HOSTENT_ADDRTYPE_TYPE short # define HOSTENT_LENGTH_TYPE short diff --git a/deps/cares/src/lib/ares_process.c b/deps/cares/src/lib/ares_process.c index b9705ae882b9ff..9352968419ef8e 100644 --- a/deps/cares/src/lib/ares_process.c +++ b/deps/cares/src/lib/ares_process.c @@ -25,8 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" - +#include "ares_private.h" #ifdef HAVE_STRINGS_H # include <strings.h> @@ -45,67 +44,126 @@ #include <fcntl.h> #include <limits.h> -#include "ares.h" -#include "ares_private.h" -#include "ares_nameser.h" -#include "ares_dns.h" - -static ares_bool_t try_again(int errnum); -static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds, - ares_socket_t write_fd); -static void read_packets(ares_channel_t *channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now); -static void process_timeouts(ares_channel_t *channel, struct timeval *now); + +static void timeadd(ares_timeval_t *now, size_t millisecs); +static ares_status_t process_write(ares_channel_t *channel, + ares_socket_t write_fd); +static ares_status_t process_read(ares_channel_t *channel, + ares_socket_t read_fd, + const ares_timeval_t *now); +static ares_status_t process_timeouts(ares_channel_t *channel, + const ares_timeval_t *now); static ares_status_t process_answer(ares_channel_t *channel, const unsigned char *abuf, size_t alen, - struct server_connection *conn, - ares_bool_t tcp, struct timeval *now); -static void handle_conn_error(struct server_connection *conn, - ares_bool_t critical_failure); - -static ares_bool_t same_questions(const ares_dns_record_t *qrec, - const ares_dns_record_t *arec); -static ares_bool_t same_address(const struct sockaddr *sa, - const struct ares_addr *aa); -static void end_query(ares_channel_t *channel, struct query *query, - ares_status_t status, const ares_dns_record_t *dnsrec); - -static void server_increment_failures(struct server_state *server) + ares_conn_t *conn, + const ares_timeval_t *now, + ares_array_t **requeue); +static void handle_conn_error(ares_conn_t *conn, ares_bool_t critical_failure, + ares_status_t failure_status); +static ares_bool_t same_questions(const ares_query_t *query, + const ares_dns_record_t *arec); +static void end_query(ares_channel_t *channel, ares_server_t *server, + ares_query_t *query, ares_status_t status, + ares_dns_record_t *dnsrec, + ares_array_t **requeue); + +static void ares_query_remove_from_conn(ares_query_t *query) +{ + /* If its not part of a connection, it can't be tracked for timeouts either */ + ares_slist_node_destroy(query->node_queries_by_timeout); + ares_llist_node_destroy(query->node_queries_to_conn); + query->node_queries_by_timeout = NULL; + query->node_queries_to_conn = NULL; + query->conn = NULL; +} + +/* Invoke the server state callback after a success or failure */ +static void invoke_server_state_cb(const ares_server_t *server, + ares_bool_t success, int flags) { - ares__slist_node_t *node; const ares_channel_t *channel = server->channel; + ares_buf_t *buf; + ares_status_t status; + char *server_string; - node = ares__slist_node_find(channel->servers, server); - if (node == NULL) { + if (channel->server_state_cb == NULL) { return; } - server->consec_failures++; - ares__slist_node_reinsert(node); + + buf = ares_buf_create(); + if (buf == NULL) { + return; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_get_server_addr(server, buf); + if (status != ARES_SUCCESS) { + ares_buf_destroy(buf); /* LCOV_EXCL_LINE: OutOfMemory */ + return; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + server_string = ares_buf_finish_str(buf, NULL); + buf = NULL; + if (server_string == NULL) { + return; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + channel->server_state_cb(server_string, success, flags, + channel->server_state_cb_data); + ares_free(server_string); } -static void server_set_good(struct server_state *server) +static void server_increment_failures(ares_server_t *server, + ares_bool_t used_tcp) { - ares__slist_node_t *node; + ares_slist_node_t *node; const ares_channel_t *channel = server->channel; + ares_timeval_t next_retry_time; - if (!server->consec_failures) { - return; + node = ares_slist_node_find(channel->servers, server); + if (node == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - node = ares__slist_node_find(channel->servers, server); + server->consec_failures++; + ares_slist_node_reinsert(node); + + ares_tvnow(&next_retry_time); + timeadd(&next_retry_time, channel->server_retry_delay); + server->next_retry_time = next_retry_time; + + invoke_server_state_cb(server, ARES_FALSE, + used_tcp == ARES_TRUE ? ARES_SERV_STATE_TCP + : ARES_SERV_STATE_UDP); +} + +static void server_set_good(ares_server_t *server, ares_bool_t used_tcp) +{ + ares_slist_node_t *node; + const ares_channel_t *channel = server->channel; + + node = ares_slist_node_find(channel->servers, server); if (node == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - server->consec_failures = 0; - ares__slist_node_reinsert(node); + if (server->consec_failures > 0) { + server->consec_failures = 0; + ares_slist_node_reinsert(node); + } + + server->next_retry_time.sec = 0; + server->next_retry_time.usec = 0; + + invoke_server_state_cb(server, ARES_TRUE, + used_tcp == ARES_TRUE ? ARES_SERV_STATE_TCP + : ARES_SERV_STATE_UDP); } /* return true if now is exactly check time or later */ -ares_bool_t ares__timedout(const struct timeval *now, - const struct timeval *check) +ares_bool_t ares_timedout(const ares_timeval_t *now, + const ares_timeval_t *check) { - ares_int64_t secs = ((ares_int64_t)now->tv_sec - (ares_int64_t)check->tv_sec); + ares_int64_t secs = (now->sec - check->sec); if (secs > 0) { return ARES_TRUE; /* yes, timed out */ @@ -115,219 +173,439 @@ ares_bool_t ares__timedout(const struct timeval *now, } /* if the full seconds were identical, check the sub second parts */ - return ((ares_int64_t)now->tv_usec - (ares_int64_t)check->tv_usec) >= 0 + return ((ares_int64_t)now->usec - (ares_int64_t)check->usec) >= 0 ? ARES_TRUE : ARES_FALSE; } /* add the specific number of milliseconds to the time in the first argument */ -static void timeadd(struct timeval *now, size_t millisecs) +static void timeadd(ares_timeval_t *now, size_t millisecs) { - now->tv_sec += (time_t)millisecs / 1000; - now->tv_usec += (time_t)((millisecs % 1000) * 1000); + now->sec += (ares_int64_t)millisecs / 1000; + now->usec += (unsigned int)((millisecs % 1000) * 1000); - if (now->tv_usec >= 1000000) { - ++(now->tv_sec); - now->tv_usec -= 1000000; + if (now->usec >= 1000000) { + now->sec += now->usec / 1000000; + now->usec %= 1000000; } } -/* - * generic process function - */ -static void processfds(ares_channel_t *channel, fd_set *read_fds, - ares_socket_t read_fd, fd_set *write_fds, - ares_socket_t write_fd) +static ares_status_t ares_process_fds_nolock(ares_channel_t *channel, + const ares_fd_events_t *events, + size_t nevents, unsigned int flags) +{ + ares_timeval_t now; + size_t i; + ares_status_t status = ARES_SUCCESS; + + if (channel == NULL || (events == NULL && nevents != 0)) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_tvnow(&now); + + /* Process write events */ + for (i = 0; i < nevents; i++) { + if (events[i].fd == ARES_SOCKET_BAD || + !(events[i].events & ARES_FD_EVENT_WRITE)) { + continue; + } + status = process_write(channel, events[i].fd); + /* We only care about ENOMEM, anything else is handled via connection + * retries, etc */ + if (status == ARES_ENOMEM) { + goto done; + } + } + + /* Process read events */ + for (i = 0; i < nevents; i++) { + if (events[i].fd == ARES_SOCKET_BAD || + !(events[i].events & ARES_FD_EVENT_READ)) { + continue; + } + status = process_read(channel, events[i].fd, &now); + if (status == ARES_ENOMEM) { + goto done; + } + } + + if (!(flags & ARES_PROCESS_FLAG_SKIP_NON_FD)) { + status = process_timeouts(channel, &now); + if (status == ARES_ENOMEM) { + goto done; + } + + /* Cleanup should be done after processing timeouts as it may invalidate + * connections */ + ares_check_cleanup_conns(channel); + } + +done: + if (status == ARES_ENOMEM) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +ares_status_t ares_process_fds(ares_channel_t *channel, + const ares_fd_events_t *events, size_t nevents, + unsigned int flags) { - struct timeval now; + ares_status_t status; if (channel == NULL) { - return; + return ARES_EFORMERR; } - ares__channel_lock(channel); + ares_channel_lock(channel); + status = ares_process_fds_nolock(channel, events, nevents, flags); + ares_channel_unlock(channel); + return status; +} - now = ares__tvnow(); - read_packets(channel, read_fds, read_fd, &now); - process_timeouts(channel, &now); - /* Write last as the other 2 operations might have triggered writes */ - write_tcp_data(channel, write_fds, write_fd); +void ares_process_fd(ares_channel_t *channel, ares_socket_t read_fd, + ares_socket_t write_fd) +{ + ares_fd_events_t events[2]; + size_t nevents = 0; - ares__channel_unlock(channel); + memset(events, 0, sizeof(events)); + + if (read_fd != ARES_SOCKET_BAD) { + nevents++; + events[nevents - 1].fd = read_fd; + events[nevents - 1].events |= ARES_FD_EVENT_READ; + } + + if (write_fd != ARES_SOCKET_BAD) { + if (write_fd != read_fd) { + nevents++; + } + events[nevents - 1].fd = write_fd; + events[nevents - 1].events |= ARES_FD_EVENT_WRITE; + } + + ares_process_fds(channel, events, nevents, ARES_PROCESS_FLAG_NONE); } -/* Something interesting happened on the wire, or there was a timeout. - * See what's up and respond accordingly. - */ -void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) +static ares_socket_t *channel_socket_list(const ares_channel_t *channel, + size_t *num) { - processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD); + ares_slist_node_t *snode; + ares_array_t *arr = ares_array_create(sizeof(ares_socket_t), NULL); + + *num = 0; + + if (arr == NULL) { + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (snode = ares_slist_node_first(channel->servers); snode != NULL; + snode = ares_slist_node_next(snode)) { + ares_server_t *server = ares_slist_node_val(snode); + ares_llist_node_t *node; + + for (node = ares_llist_node_first(server->connections); node != NULL; + node = ares_llist_node_next(node)) { + const ares_conn_t *conn = ares_llist_node_val(node); + ares_socket_t *sptr; + ares_status_t status; + + if (conn->fd == ARES_SOCKET_BAD) { + continue; + } + + status = ares_array_insert_last((void **)&sptr, arr); + if (status != ARES_SUCCESS) { + ares_array_destroy(arr); /* LCOV_EXCL_LINE: OutOfMemory */ + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + *sptr = conn->fd; + } + } + + return ares_array_finish(arr, num); } /* Something interesting happened on the wire, or there was a timeout. * See what's up and respond accordingly. */ -void ares_process_fd(ares_channel_t *channel, - ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid - file descriptors */ - ares_socket_t write_fd) +void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) { - processfds(channel, NULL, read_fd, NULL, write_fd); + size_t i; + size_t num_sockets; + ares_socket_t *socketlist; + ares_fd_events_t *events = NULL; + size_t nevents = 0; + + if (channel == NULL) { + return; + } + + ares_channel_lock(channel); + + /* There is no good way to iterate across an fd_set, instead we must pull a + * list of all known fds, and iterate across that checking against the fd_set. + */ + socketlist = channel_socket_list(channel, &num_sockets); + + /* Lets create an events array, maximum number is the number of sockets in + * the list, so we'll use that and just track entries with nevents */ + if (num_sockets) { + events = ares_malloc_zero(sizeof(*events) * num_sockets); + if (events == NULL) { + goto done; + } + } + + for (i = 0; i < num_sockets; i++) { + ares_bool_t had_read = ARES_FALSE; + if (read_fds && FD_ISSET(socketlist[i], read_fds)) { + nevents++; + events[nevents - 1].fd = socketlist[i]; + events[nevents - 1].events |= ARES_FD_EVENT_READ; + had_read = ARES_TRUE; + } + if (write_fds && FD_ISSET(socketlist[i], write_fds)) { + if (!had_read) { + nevents++; + } + events[nevents - 1].fd = socketlist[i]; + events[nevents - 1].events |= ARES_FD_EVENT_WRITE; + } + } + +done: + ares_process_fds_nolock(channel, events, nevents, ARES_PROCESS_FLAG_NONE); + ares_free(events); + ares_free(socketlist); + ares_channel_unlock(channel); } -/* Return 1 if the specified error number describes a readiness error, or 0 - * otherwise. This is mostly for HP-UX, which could return EAGAIN or - * EWOULDBLOCK. See this man page - * - * http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html? - * manpage=/usr/share/man/man2.Z/send.2 - */ -static ares_bool_t try_again(int errnum) +static ares_status_t process_write(ares_channel_t *channel, + ares_socket_t write_fd) { -#if !defined EWOULDBLOCK && !defined EAGAIN -# error "Neither EWOULDBLOCK nor EAGAIN defined" -#endif + ares_conn_t *conn = ares_conn_from_fd(channel, write_fd); + ares_status_t status; -#ifdef EWOULDBLOCK - if (errnum == EWOULDBLOCK) { - return ARES_TRUE; + if (conn == NULL) { + return ARES_SUCCESS; } -#endif -#if defined EAGAIN && EAGAIN != EWOULDBLOCK - if (errnum == EAGAIN) { - return ARES_TRUE; + /* Mark as connected if we got here and TFO Initial not set */ + if (!(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) { + conn->state_flags |= ARES_CONN_STATE_CONNECTED; } -#endif - return ARES_FALSE; + status = ares_conn_flush(conn); + if (status != ARES_SUCCESS) { + handle_conn_error(conn, ARES_TRUE, status); + } + return status; } -/* If any TCP sockets select true for writing, write out queued data - * we have for them. - */ -static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds, - ares_socket_t write_fd) +void ares_process_pending_write(ares_channel_t *channel) { - ares__slist_node_t *node; + ares_slist_node_t *node; + + if (channel == NULL) { + return; + } - if (!write_fds && (write_fd == ARES_SOCKET_BAD)) { - /* no possible action */ + ares_channel_lock(channel); + if (!channel->notify_pending_write) { + ares_channel_unlock(channel); return; } - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { - struct server_state *server = ares__slist_node_val(node); - const unsigned char *data; - size_t data_len; - ares_ssize_t count; + /* Set as untriggerd before calling into ares_conn_flush(), this is + * because its possible ares_conn_flush() might cause additional data to + * be enqueued if there is some form of exception so it will need to recurse. + */ + channel->notify_pending_write = ARES_FALSE; + + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + ares_server_t *server = ares_slist_node_val(node); + ares_conn_t *conn = server->tcp_conn; + ares_status_t status; - /* Make sure server has data to send and is selected in write_fds or - write_fd. */ - if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL) { + if (conn == NULL) { continue; } - if (write_fds) { - if (!FD_ISSET(server->tcp_conn->fd, write_fds)) { - continue; - } - } else { - if (server->tcp_conn->fd != write_fd) { - continue; - } + /* Enqueue any pending data if there is any */ + status = ares_conn_flush(conn); + if (status != ARES_SUCCESS) { + handle_conn_error(conn, ARES_TRUE, status); } + } + + ares_channel_unlock(channel); +} + +static ares_status_t read_conn_packets(ares_conn_t *conn) +{ + ares_bool_t read_again; + ares_conn_err_t err; + const ares_channel_t *channel = conn->server->channel; - if (write_fds) { - /* If there's an error and we close this socket, then open - * another with the same fd to talk to another server, then we - * don't want to think that it was the new socket that was - * ready. This is not disastrous, but is likely to result in - * extra system calls and confusion. */ - FD_CLR(server->tcp_conn->fd, write_fds); + do { + size_t count; + size_t len = 65535; + unsigned char *ptr; + size_t start_len = ares_buf_len(conn->in_buf); + + /* If UDP, lets write out a placeholder for the length indicator */ + if (!(conn->flags & ARES_CONN_FLAG_TCP) && + ares_buf_append_be16(conn->in_buf, 0) != ARES_SUCCESS) { + handle_conn_error(conn, ARES_FALSE /* not critical to connection */, + ARES_SUCCESS); + return ARES_ENOMEM; + } + + /* Get a buffer of sufficient size */ + ptr = ares_buf_append_start(conn->in_buf, &len); + + if (ptr == NULL) { + handle_conn_error(conn, ARES_FALSE /* not critical to connection */, + ARES_SUCCESS); + return ARES_ENOMEM; } - data = ares__buf_peek(server->tcp_send, &data_len); - count = ares__socket_write(channel, server->tcp_conn->fd, data, data_len); - if (count <= 0) { - if (!try_again(SOCKERRNO)) { - handle_conn_error(server->tcp_conn, ARES_TRUE); + /* Read from socket */ + err = ares_conn_read(conn, ptr, len, &count); + + if (err != ARES_CONN_ERR_SUCCESS) { + ares_buf_append_finish(conn->in_buf, 0); + if (!(conn->flags & ARES_CONN_FLAG_TCP)) { + ares_buf_set_length(conn->in_buf, start_len); } - continue; + break; } - /* Strip data written from the buffer */ - ares__buf_consume(server->tcp_send, (size_t)count); + /* Record amount of data read */ + ares_buf_append_finish(conn->in_buf, count); - /* Notify state callback all data is written */ - if (ares__buf_len(server->tcp_send) == 0) { - SOCK_STATE_CALLBACK(channel, server->tcp_conn->fd, 1, 0); + /* Only loop if sockets support non-blocking operation, and are using UDP + * or are using TCP and read the maximum buffer size */ + read_again = ARES_FALSE; + if (channel->sock_funcs.flags & ARES_SOCKFUNC_FLAG_NONBLOCKING && + (!(conn->flags & ARES_CONN_FLAG_TCP) || count == len)) { + read_again = ARES_TRUE; } + + /* If UDP, overwrite length */ + if (!(conn->flags & ARES_CONN_FLAG_TCP)) { + len = ares_buf_len(conn->in_buf); + ares_buf_set_length(conn->in_buf, start_len); + ares_buf_append_be16(conn->in_buf, (unsigned short)count); + ares_buf_set_length(conn->in_buf, len); + } + /* Try to read again only if *we* set up the socket, otherwise it may be + * a blocking socket and would cause recvfrom to hang. */ + } while (read_again); + + if (err != ARES_CONN_ERR_SUCCESS && err != ARES_CONN_ERR_WOULDBLOCK) { + handle_conn_error(conn, ARES_TRUE, ARES_ECONNREFUSED); + return ARES_ECONNREFUSED; } + + return ARES_SUCCESS; } -/* If any TCP socket selects true for reading, read some data, - * allocate a buffer if we finish reading the length word, and process - * a packet if we finish reading one. - */ -static void read_tcp_data(ares_channel_t *channel, - struct server_connection *conn, struct timeval *now) +typedef enum { + REQUEUE_REQUEUE = 1, + REQUEUE_ENDQUERY = 2 +} requeue_type_t; + +/* Simple data structure to store a query that needs to be requeued with + * optional server */ +typedef struct { + requeue_type_t type; /* type of entry, requeue or endquery */ + unsigned short qid; /* query id */ + ares_server_t *server; /* requeue only: optional */ + ares_status_t status; /* endquery only */ + ares_dns_record_t *dnsrec; /* endquery only: optional */ +} ares_requeue_t; + +static ares_status_t ares_append_requeue_int(ares_array_t **requeue, + requeue_type_t type, + ares_query_t *query, + ares_server_t *server, + ares_status_t status, + ares_dns_record_t *dnsrec) { - ares_ssize_t count; - struct server_state *server = conn->server; + ares_requeue_t entry; - /* Fetch buffer to store data we are reading */ - size_t ptr_len = 65535; - unsigned char *ptr; + if (*requeue == NULL) { + *requeue = ares_array_create(sizeof(ares_requeue_t), NULL); + if (*requeue == NULL) { + return ARES_ENOMEM; + } + } - ptr = ares__buf_append_start(server->tcp_parser, &ptr_len); + ares_query_remove_from_conn(query); - if (ptr == NULL) { - handle_conn_error(conn, ARES_FALSE /* not critical to connection */); - return; /* bail out on malloc failure. TODO: make this - function return error codes */ - } + entry.type = type; + entry.qid = query->qid; + entry.server = server; + entry.status = status; + entry.dnsrec = dnsrec; + return ares_array_insertdata_last(*requeue, &entry); +} - /* Read from socket */ - count = ares__socket_recv(channel, conn->fd, ptr, ptr_len); - if (count <= 0) { - ares__buf_append_finish(server->tcp_parser, 0); - if (!(count == -1 && try_again(SOCKERRNO))) { - handle_conn_error(conn, ARES_TRUE); - } - return; - } +static ares_status_t ares_append_requeue(ares_array_t **requeue, + ares_query_t *query, + ares_server_t *server) +{ + return ares_append_requeue_int(requeue, REQUEUE_REQUEUE, query, server, 0, + NULL); +} - /* Record amount of data read */ - ares__buf_append_finish(server->tcp_parser, (size_t)count); +static ares_status_t ares_append_endqueue(ares_array_t **requeue, + ares_query_t *query, + ares_status_t status, + ares_dns_record_t *dnsrec) +{ + return ares_append_requeue_int(requeue, REQUEUE_ENDQUERY, query, NULL, status, + dnsrec); +} + +static ares_status_t read_answers(ares_conn_t *conn, const ares_timeval_t *now) +{ + ares_status_t status; + ares_channel_t *channel = conn->server->channel; + ares_array_t *requeue = NULL; /* Process all queued answers */ while (1) { unsigned short dns_len = 0; const unsigned char *data = NULL; size_t data_len = 0; - ares_status_t status; /* Tag so we can roll back */ - ares__buf_tag(server->tcp_parser); + ares_buf_tag(conn->in_buf); /* Read length indicator */ - if (ares__buf_fetch_be16(server->tcp_parser, &dns_len) != ARES_SUCCESS) { - ares__buf_tag_rollback(server->tcp_parser); + status = ares_buf_fetch_be16(conn->in_buf, &dns_len); + if (status != ARES_SUCCESS) { + ares_buf_tag_rollback(conn->in_buf); break; } /* Not enough data for a full response yet */ - if (ares__buf_consume(server->tcp_parser, dns_len) != ARES_SUCCESS) { - ares__buf_tag_rollback(server->tcp_parser); + status = ares_buf_consume(conn->in_buf, dns_len); + if (status != ARES_SUCCESS) { + ares_buf_tag_rollback(conn->in_buf); break; } /* Can't fail except for misuse */ - data = ares__buf_tag_fetch(server->tcp_parser, &data_len); - if (data == NULL) { - ares__buf_tag_clear(server->tcp_parser); + data = ares_buf_tag_fetch(conn->in_buf, &data_len); + if (data == NULL || data_len < 2) { + ares_buf_tag_clear(conn->in_buf); break; } @@ -336,255 +614,133 @@ static void read_tcp_data(ares_channel_t *channel, data_len -= 2; /* We finished reading this answer; process it */ - status = process_answer(channel, data, data_len, conn, ARES_TRUE, now); + status = process_answer(channel, data, data_len, conn, now, &requeue); if (status != ARES_SUCCESS) { - handle_conn_error(conn, ARES_TRUE); - return; + handle_conn_error(conn, ARES_TRUE, status); + goto cleanup; } /* Since we processed the answer, clear the tag so space can be reclaimed */ - ares__buf_tag_clear(server->tcp_parser); + ares_buf_tag_clear(conn->in_buf); } - ares__check_cleanup_conn(channel, conn); -} - -static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd, - size_t *alloc_cnt, size_t *num) -{ - if (*num >= *alloc_cnt) { - /* Grow by powers of 2 */ - size_t new_alloc = (*alloc_cnt) << 1; - ares_socket_t *new_list = - ares_realloc(socketlist, new_alloc * sizeof(*new_list)); - if (new_list == NULL) { - return 0; - } - *alloc_cnt = new_alloc; - *socketlist = new_list; - } - - (*socketlist)[(*num)++] = fd; - return 1; -} - -static ares_socket_t *channel_socket_list(const ares_channel_t *channel, - size_t *num) -{ - size_t alloc_cnt = 1 << 4; - ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out)); - ares__slist_node_t *snode; - - *num = 0; +cleanup: - if (out == NULL) { - return NULL; - } + /* Flush requeue */ + while (ares_array_len(requeue) > 0) { + ares_query_t *query; + ares_requeue_t entry; + ares_status_t internal_status; - for (snode = ares__slist_node_first(channel->servers); snode != NULL; - snode = ares__slist_node_next(snode)) { - struct server_state *server = ares__slist_node_val(snode); - ares__llist_node_t *node; + internal_status = ares_array_claim_at(&entry, sizeof(entry), requeue, 0); + if (internal_status != ARES_SUCCESS) { + break; + } - for (node = ares__llist_node_first(server->connections); node != NULL; - node = ares__llist_node_next(node)) { - const struct server_connection *conn = ares__llist_node_val(node); + query = ares_htable_szvp_get_direct(channel->queries_by_qid, entry.qid); - if (conn->fd == ARES_SOCKET_BAD) { + if (entry.type == REQUEUE_REQUEUE) { + /* query disappeared */ + if (query == NULL) { continue; } - - if (!socket_list_append(&out, conn->fd, &alloc_cnt, num)) { - goto fail; + internal_status = ares_send_query(entry.server, query, now); + /* We only care about ARES_ENOMEM */ + if (internal_status == ARES_ENOMEM) { + status = ARES_ENOMEM; } - } - } - - return out; - -fail: - ares_free(out); - *num = 0; - return NULL; -} - -/* If any UDP sockets select true for reading, process them. */ -static void read_udp_packets_fd(ares_channel_t *channel, - struct server_connection *conn, - struct timeval *now) -{ - ares_ssize_t read_len; - unsigned char buf[MAXENDSSZ + 1]; - -#ifdef HAVE_RECVFROM - ares_socklen_t fromlen; - - union { - struct sockaddr sa; - struct sockaddr_in sa4; - struct sockaddr_in6 sa6; - } from; - - memset(&from, 0, sizeof(from)); -#endif - - /* To reduce event loop overhead, read and process as many - * packets as we can. */ - do { - if (conn->fd == ARES_SOCKET_BAD) { - read_len = -1; - } else { - if (conn->server->addr.family == AF_INET) { - fromlen = sizeof(from.sa4); - } else { - fromlen = sizeof(from.sa6); + } else { /* REQUEUE_ENDQUERY */ + if (query != NULL) { + query->callback(query->arg, entry.status, query->timeouts, entry.dnsrec); + ares_free_query(query); } - read_len = ares__socket_recvfrom(channel, conn->fd, (void *)buf, - sizeof(buf), 0, &from.sa, &fromlen); + ares_dns_record_destroy(entry.dnsrec); } + } + /* Don't forget to send notification if queue emptied */ + if (requeue != NULL) { + ares_queue_notify_empty(channel); + } + ares_array_destroy(requeue); - if (read_len == 0) { - /* UDP is connectionless, so result code of 0 is a 0-length UDP - * packet, and not an indication the connection is closed like on - * tcp */ - continue; - } else if (read_len < 0) { - if (try_again(SOCKERRNO)) { - break; - } - - handle_conn_error(conn, ARES_TRUE); - return; -#ifdef HAVE_RECVFROM - } else if (!same_address(&from.sa, &conn->server->addr)) { - /* The address the response comes from does not match the address we - * sent the request to. Someone may be attempting to perform a cache - * poisoning attack. */ - continue; -#endif - - } else { - process_answer(channel, buf, (size_t)read_len, conn, ARES_FALSE, now); - } - - /* Try to read again only if *we* set up the socket, otherwise it may be - * a blocking socket and would cause recvfrom to hang. */ - } while (read_len >= 0 && channel->sock_funcs == NULL); - - ares__check_cleanup_conn(channel, conn); + return status; } -static void read_packets(ares_channel_t *channel, fd_set *read_fds, - ares_socket_t read_fd, struct timeval *now) +static ares_status_t process_read(ares_channel_t *channel, + ares_socket_t read_fd, + const ares_timeval_t *now) { - size_t i; - ares_socket_t *socketlist = NULL; - size_t num_sockets = 0; - struct server_connection *conn = NULL; - ares__llist_node_t *node = NULL; - - if (!read_fds && (read_fd == ARES_SOCKET_BAD)) { - /* no possible action */ - return; - } - - /* Single socket specified */ - if (!read_fds) { - node = ares__htable_asvp_get_direct(channel->connnode_by_socket, read_fd); - if (node == NULL) { - return; - } - - conn = ares__llist_node_val(node); - - if (conn->is_tcp) { - read_tcp_data(channel, conn, now); - } else { - read_udp_packets_fd(channel, conn, now); - } + ares_conn_t *conn = ares_conn_from_fd(channel, read_fd); + ares_status_t status; - return; + if (conn == NULL) { + return ARES_SUCCESS; } - /* There is no good way to iterate across an fd_set, instead we must pull a - * list of all known fds, and iterate across that checking against the fd_set. - */ - socketlist = channel_socket_list(channel, &num_sockets); - - for (i = 0; i < num_sockets; i++) { - if (!FD_ISSET(socketlist[i], read_fds)) { - continue; - } - - /* If there's an error and we close this socket, then open - * another with the same fd to talk to another server, then we - * don't want to think that it was the new socket that was - * ready. This is not disastrous, but is likely to result in - * extra system calls and confusion. */ - FD_CLR(socketlist[i], read_fds); - - node = - ares__htable_asvp_get_direct(channel->connnode_by_socket, socketlist[i]); - if (node == NULL) { - return; - } - - conn = ares__llist_node_val(node); + /* TODO: There might be a potential issue here where there was a read that + * read some data, then looped and read again and got a disconnect. + * Right now, that would cause a resend instead of processing the data + * we have. This is fairly unlikely to occur due to only looping if + * a full buffer of 65535 bytes was read. */ + status = read_conn_packets(conn); - if (conn->is_tcp) { - read_tcp_data(channel, conn, now); - } else { - read_udp_packets_fd(channel, conn, now); - } + if (status != ARES_SUCCESS) { + return status; } - ares_free(socketlist); + return read_answers(conn, now); } /* If any queries have timed out, note the timeout and move them on. */ -static void process_timeouts(ares_channel_t *channel, struct timeval *now) +static ares_status_t process_timeouts(ares_channel_t *channel, + const ares_timeval_t *now) { - ares__slist_node_t *node = - ares__slist_node_first(channel->queries_by_timeout); - while (node != NULL) { - struct query *query = ares__slist_node_val(node); - /* Node might be removed, cache next */ - ares__slist_node_t *next = ares__slist_node_next(node); - struct server_connection *conn; + ares_slist_node_t *node; + ares_status_t status = ARES_SUCCESS; + + /* Just keep popping off the first as this list will re-sort as things come + * and go. We don't want to try to rely on 'next' as some operation might + * cause a cleanup of that pointer and would become invalid */ + while ((node = ares_slist_node_first(channel->queries_by_timeout)) != NULL) { + ares_query_t *query = ares_slist_node_val(node); + ares_conn_t *conn; + /* Since this is sorted, as soon as we hit a query that isn't timed out, * break */ - if (!ares__timedout(now, &query->timeout)) { + if (!ares_timedout(now, &query->timeout)) { break; } - query->error_status = ARES_ETIMEOUT; query->timeouts++; conn = query->conn; - server_increment_failures(conn->server); - ares__requeue_query(query, now); - ares__check_cleanup_conn(channel, conn); - - node = next; + server_increment_failures(conn->server, query->using_tcp); + status = ares_requeue_query(query, now, ARES_ETIMEOUT, ARES_TRUE, NULL, + NULL); + if (status == ARES_ENOMEM) { + goto done; + } } +done: + if (status == ARES_ENOMEM) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; } -static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec, - struct query *query) +static ares_status_t rewrite_without_edns(ares_query_t *query) { - ares_status_t status; - size_t i; - ares_bool_t found_opt_rr = ARES_FALSE; - unsigned char *msg = NULL; - size_t msglen = 0; + ares_status_t status = ARES_SUCCESS; + size_t i; + ares_bool_t found_opt_rr = ARES_FALSE; /* Find and remove the OPT RR record */ - for (i = 0; i < ares_dns_record_rr_cnt(qdnsrec, ARES_SECTION_ADDITIONAL); + for (i = 0; i < ares_dns_record_rr_cnt(query->query, ARES_SECTION_ADDITIONAL); i++) { const ares_dns_rr_t *rr; - rr = ares_dns_record_rr_get(qdnsrec, ARES_SECTION_ADDITIONAL, i); + rr = ares_dns_record_rr_get(query->query, ARES_SECTION_ADDITIONAL, i); if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { - ares_dns_record_rr_del(qdnsrec, ARES_SECTION_ADDITIONAL, i); + ares_dns_record_rr_del(query->query, ARES_SECTION_ADDITIONAL, i); found_opt_rr = ARES_TRUE; break; } @@ -595,18 +751,53 @@ static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec, goto done; } - /* Rewrite the DNS message */ - status = ares_dns_write(qdnsrec, &msg, &msglen); - if (status != ARES_SUCCESS) { - goto done; +done: + return status; +} + +static ares_bool_t issue_might_be_edns(const ares_dns_record_t *req, + const ares_dns_record_t *rsp) +{ + const ares_dns_rr_t *rr; + + /* If we use EDNS and server answers with FORMERR without an OPT RR, the + * protocol extension is not understood by the responder. We must retry the + * query without EDNS enabled. */ + if (ares_dns_record_get_rcode(rsp) != ARES_RCODE_FORMERR) { + return ARES_FALSE; } - ares_free(query->qbuf); - query->qbuf = msg; - query->qlen = msglen; + rr = ares_dns_get_opt_rr_const(req); + if (rr == NULL) { + /* We didn't send EDNS */ + return ARES_FALSE; + } -done: - return status; + if (ares_dns_get_opt_rr_const(rsp) == NULL) { + /* Spec says EDNS won't be echo'd back on non-supporting servers, so + * retry without EDNS */ + return ARES_TRUE; + } + + /* As per issue #911 some non-compliant servers that do indeed support EDNS + * but don't support unrecognized option codes exist. At this point we + * expect them to have also returned an EDNS opt record, but we may remove + * that check in the future. Lets detect this situation if we're sending + * option codes */ + if (ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS) == 0) { + /* We didn't send any option codes */ + return ARES_FALSE; + } + + if (ares_dns_get_opt_rr_const(rsp) != NULL) { + /* At this time we're requiring the server to respond with EDNS opt + * records since that's what has been observed in the field. We might + * find in the future we have to remove this, who knows. Lets go + * ahead and force a retry without EDNS*/ + return ARES_TRUE; + } + + return ARES_FALSE; } /* Handle an answer from a server. This must NEVER cleanup the @@ -614,17 +805,22 @@ static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec, * the connection to be terminated after this call. */ static ares_status_t process_answer(ares_channel_t *channel, const unsigned char *abuf, size_t alen, - struct server_connection *conn, - ares_bool_t tcp, struct timeval *now) + ares_conn_t *conn, + const ares_timeval_t *now, + ares_array_t **requeue) { - struct query *query; - /* Cache these as once ares__send_query() gets called, it may end up + ares_query_t *query; + /* Cache these as once ares_send_query() gets called, it may end up * invalidating the connection all-together */ - struct server_state *server = conn->server; - ares_dns_record_t *rdnsrec = NULL; - ares_dns_record_t *qdnsrec = NULL; - ares_status_t status; - ares_bool_t is_cached = ARES_FALSE; + ares_server_t *server = conn->server; + ares_dns_record_t *rdnsrec = NULL; + ares_status_t status; + ares_bool_t is_cached = ARES_FALSE; + + /* UDP can have 0-byte messages, drop them to the ground */ + if (alen == 0) { + return ARES_SUCCESS; + } /* Parse the response */ status = ares_dns_parse(abuf, alen, 0, &rdnsrec); @@ -637,49 +833,50 @@ static ares_status_t process_answer(ares_channel_t *channel, /* Find the query corresponding to this packet. The queries are * hashed/bucketed by query id, so this lookup should be quick. */ - query = ares__htable_szvp_get_direct(channel->queries_by_qid, - ares_dns_record_get_id(rdnsrec)); + query = ares_htable_szvp_get_direct(channel->queries_by_qid, + ares_dns_record_get_id(rdnsrec)); if (!query) { /* We may have stopped listening for this query, that's ok */ status = ARES_SUCCESS; goto cleanup; } - /* Parse the question we sent as we use it to compare */ - status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec); - if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL); - goto cleanup; - } - /* Both the query id and the questions must be the same. We will drop any * replies that aren't for the same query as this is considered invalid. */ - if (!same_questions(qdnsrec, rdnsrec)) { + if (!same_questions(query, rdnsrec)) { /* Possible qid conflict due to delayed response, that's ok */ status = ARES_SUCCESS; goto cleanup; } + /* Validate DNS cookie in response. This function may need to requeue the + * query. */ + if (ares_cookie_validate(query, rdnsrec, conn, now, requeue) + != ARES_SUCCESS) { + /* Drop response and return */ + status = ARES_SUCCESS; + goto cleanup; + } + /* At this point we know we've received an answer for this query, so we should * remove it from the connection's queue so we can possibly invalidate the * connection. Delay cleaning up the connection though as we may enqueue * something new. */ - ares__llist_node_destroy(query->node_queries_to_conn); + ares_llist_node_destroy(query->node_queries_to_conn); query->node_queries_to_conn = NULL; - /* If we use EDNS and server answers with FORMERR without an OPT RR, the - * protocol extension is not understood by the responder. We must retry the - * query without EDNS enabled. */ - if (ares_dns_record_get_rcode(rdnsrec) == ARES_RCODE_FORMERR && - ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) { - status = rewrite_without_edns(qdnsrec, query); + /* There are old servers that don't understand EDNS at all, then some servers + * that have non-compliant implementations. Lets try to detect this sort + * of thing. */ + if (issue_might_be_edns(query->query, rdnsrec)) { + status = rewrite_without_edns(query); if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL); + end_query(channel, server, query, status, NULL, NULL); goto cleanup; } - ares__send_query(query, now); - status = ARES_SUCCESS; + /* Requeue to same server */ + status = ares_append_requeue(requeue, query, server); goto cleanup; } @@ -687,11 +884,13 @@ static ares_status_t process_answer(ares_channel_t *channel, * don't accept the packet, and switch the query to TCP if we hadn't * done so already. */ - if (ares_dns_record_get_flags(rdnsrec) & ARES_FLAG_TC && !tcp && + if (ares_dns_record_get_flags(rdnsrec) & ARES_FLAG_TC && + !(conn->flags & ARES_CONN_FLAG_TCP) && !(channel->flags & ARES_FLAG_IGNTC)) { query->using_tcp = ARES_TRUE; - ares__send_query(query, now); - status = ARES_SUCCESS; /* Switched to TCP is ok */ + status = ares_append_requeue(requeue, query, NULL); + /* Status will reflect success except on memory error, which is good since + * requeuing to TCP is ok */ goto cleanup; } @@ -704,36 +903,39 @@ static ares_status_t process_answer(ares_channel_t *channel, rcode == ARES_RCODE_REFUSED) { switch (rcode) { case ARES_RCODE_SERVFAIL: - query->error_status = ARES_ESERVFAIL; + status = ARES_ESERVFAIL; break; case ARES_RCODE_NOTIMP: - query->error_status = ARES_ENOTIMP; + status = ARES_ENOTIMP; break; case ARES_RCODE_REFUSED: - query->error_status = ARES_EREFUSED; + status = ARES_EREFUSED; break; default: break; } - server_increment_failures(server); - ares__requeue_query(query, now); + server_increment_failures(server, query->using_tcp); + status = ares_requeue_query(query, now, status, ARES_TRUE, rdnsrec, + requeue); + rdnsrec = NULL; /* Free'd by ares_requeue_query() */ - /* Should any of these cause a connection termination? - * Maybe SERVER_FAILURE? */ - status = ARES_SUCCESS; + if (status != ARES_ENOMEM) { + /* Should any of these cause a connection termination? + * Maybe SERVER_FAILURE? */ + status = ARES_SUCCESS; + } goto cleanup; } } /* If cache insertion was successful, it took ownership. We ignore * other cache insertion failures. */ - if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) { - is_cached = ARES_TRUE; - } + ares_qcache_insert(channel, now, query, rdnsrec); - server_set_good(server); - end_query(channel, query, ARES_SUCCESS, rdnsrec); + server_set_good(server, query->using_tcp); + end_query(channel, server, query, ARES_SUCCESS, rdnsrec, requeue); + rdnsrec = NULL; /* Free'd by the requeue */ status = ARES_SUCCESS; @@ -743,34 +945,53 @@ static ares_status_t process_answer(ares_channel_t *channel, ares_dns_record_destroy(rdnsrec); } - ares_dns_record_destroy(qdnsrec); return status; } -static void handle_conn_error(struct server_connection *conn, - ares_bool_t critical_failure) +static void handle_conn_error(ares_conn_t *conn, ares_bool_t critical_failure, + ares_status_t failure_status) { - struct server_state *server = conn->server; + ares_server_t *server = conn->server; /* Increment failures first before requeue so it is unlikely to requeue * to the same server */ if (critical_failure) { - server_increment_failures(server); + server_increment_failures( + server, (conn->flags & ARES_CONN_FLAG_TCP) ? ARES_TRUE : ARES_FALSE); } /* This will requeue any connections automatically */ - ares__close_connection(conn); + ares_close_connection(conn, failure_status); } -ares_status_t ares__requeue_query(struct query *query, struct timeval *now) +/* Requeue query will normally call ares_send_query() but in some circumstances + * this needs to be delayed, so if requeue is not NULL, it will add the query + * to the queue instead */ +ares_status_t ares_requeue_query(ares_query_t *query, const ares_timeval_t *now, + ares_status_t status, + ares_bool_t inc_try_count, + ares_dns_record_t *dnsrec, + ares_array_t **requeue) { - ares_channel_t *channel = query->channel; - size_t max_tries = ares__slist_len(channel->servers) * channel->tries; + ares_channel_t *channel = query->channel; + size_t max_tries = ares_slist_len(channel->servers) * channel->tries; - query->try_count++; + ares_query_remove_from_conn(query); + + if (status != ARES_SUCCESS) { + query->error_status = status; + } + + if (inc_try_count) { + query->try_count++; + } if (query->try_count < max_tries && !query->no_retries) { - return ares__send_query(query, now); + ares_dns_record_destroy(dnsrec); + if (requeue != NULL) { + return ares_append_requeue(requeue, query, NULL); + } + return ares_send_query(NULL, query, now); } /* If we are here, all attempts to perform query failed. */ @@ -778,36 +999,62 @@ ares_status_t ares__requeue_query(struct query *query, struct timeval *now) query->error_status = ARES_ETIMEOUT; } - end_query(channel, query, query->error_status, NULL); + end_query(channel, NULL, query, query->error_status, dnsrec, requeue); return ARES_ETIMEOUT; } -/* Pick a random server from the list, we first get a random number in the - * range of the number of servers, then scan until we find that server in - * the list */ -static struct server_state *ares__random_server(ares_channel_t *channel) +/*! Count the number of servers that share the same highest priority (lowest + * consecutive failures). Since they are sorted in priority order, we just + * stop when the consecutive failure count changes. Used for random selection + * of good servers. */ +static size_t count_highest_prio_servers(const ares_channel_t *channel) { - unsigned char c; - size_t cnt; - size_t idx; - ares__slist_node_t *node; - size_t num_servers = ares__slist_len(channel->servers); + ares_slist_node_t *node; + size_t cnt = 0; + size_t last_consec_failures = SIZE_MAX; + + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + const ares_server_t *server = ares_slist_node_val(node); + + if (last_consec_failures != SIZE_MAX && + last_consec_failures < server->consec_failures) { + break; + } + + last_consec_failures = server->consec_failures; + cnt++; + } + + return cnt; +} + +/* Pick a random *best* server from the list, we first get a random number in + * the range of the number of *best* servers, then scan until we find that + * server in the list */ +static ares_server_t *ares_random_server(ares_channel_t *channel) +{ + unsigned char c; + size_t cnt; + size_t idx; + ares_slist_node_t *node; + size_t num_servers = count_highest_prio_servers(channel); /* Silence coverity, not possible */ if (num_servers == 0) { return NULL; } - ares__rand_bytes(channel->rand_state, &c, 1); + ares_rand_bytes(channel->rand_state, &c, 1); cnt = c; idx = cnt % num_servers; cnt = 0; - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { if (cnt == idx) { - return ares__slist_node_val(node); + return ares_slist_node_val(node); } cnt++; @@ -816,27 +1063,85 @@ static struct server_state *ares__random_server(ares_channel_t *channel) return NULL; } -static ares_status_t ares__append_tcpbuf(struct server_state *server, - const struct query *query) +static void server_probe_cb(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) { - ares_status_t status; + (void)arg; + (void)status; + (void)timeouts; + (void)dnsrec; + /* Nothing to do, the logic internally will handle success/fail of this */ +} - status = ares__buf_append_be16(server->tcp_send, (unsigned short)query->qlen); - if (status != ARES_SUCCESS) { - return status; +/* Determine if we should probe a downed server */ +static void ares_probe_failed_server(ares_channel_t *channel, + const ares_server_t *server, + const ares_query_t *query) +{ + const ares_server_t *last_server = ares_slist_last_val(channel->servers); + unsigned short r; + ares_timeval_t now; + ares_slist_node_t *node; + ares_server_t *probe_server = NULL; + + /* If no servers have failures, or we're not configured with a server retry + * chance, then nothing to probe */ + if ((last_server != NULL && last_server->consec_failures == 0) || + channel->server_retry_chance == 0) { + return; } - return ares__buf_append(server->tcp_send, query->qbuf, query->qlen); + + /* Generate a random value to decide whether to retry a failed server. The + * probability to use is 1/channel->server_retry_chance, rounded up to a + * precision of 1/2^B where B is the number of bits in the random value. + * We use an unsigned short for the random value for increased precision. + */ + ares_rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r)); + if (r % channel->server_retry_chance != 0) { + return; + } + + /* Select the first server with failures to retry that has passed the retry + * timeout and doesn't already have a pending probe */ + ares_tvnow(&now); + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + ares_server_t *node_val = ares_slist_node_val(node); + if (node_val != NULL && node_val->consec_failures > 0 && + !node_val->probe_pending && + ares_timedout(&now, &node_val->next_retry_time)) { + probe_server = node_val; + break; + } + } + + /* Either nothing to probe or the query was enqueud to the same server + * we were going to probe. Do nothing. */ + if (probe_server == NULL || server == probe_server) { + return; + } + + /* Enqueue an identical query onto the specified server without honoring + * the cache or allowing retries. We want to make sure it only attempts to + * use the server in question */ + probe_server->probe_pending = ARES_TRUE; + ares_send_nolock(channel, probe_server, + ARES_SEND_FLAG_NOCACHE | ARES_SEND_FLAG_NORETRY, + query->query, server_probe_cb, NULL, NULL); } -static size_t ares__calc_query_timeout(const struct query *query) +static size_t ares_calc_query_timeout(const ares_query_t *query, + const ares_server_t *server, + const ares_timeval_t *now) { const ares_channel_t *channel = query->channel; - size_t timeplus = channel->timeout; + size_t timeout = ares_metrics_server_timeout(server, now); + size_t timeplus = timeout; size_t rounds; - size_t num_servers = ares__slist_len(channel->servers); + size_t num_servers = ares_slist_len(channel->servers); if (num_servers == 0) { - return 0; + return 0; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* For each trip through the entire server list, we want to double the @@ -863,193 +1168,239 @@ static size_t ares__calc_query_timeout(const struct query *query) unsigned short r; float delta_multiplier; - ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r)); + ares_rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r)); delta_multiplier = ((float)r / USHRT_MAX) * 0.5f; timeplus -= (size_t)((float)timeplus * delta_multiplier); } /* We want explicitly guarantee that timeplus is greater or equal to timeout * specified in channel options. */ - if (timeplus < channel->timeout) { - timeplus = channel->timeout; + if (timeplus < timeout) { + timeplus = timeout; } return timeplus; } -ares_status_t ares__send_query(struct query *query, struct timeval *now) +static ares_conn_t *ares_fetch_connection(const ares_channel_t *channel, + ares_server_t *server, + const ares_query_t *query) { - ares_channel_t *channel = query->channel; - struct server_state *server; - struct server_connection *conn; - size_t timeplus; - ares_status_t status; - ares_bool_t new_connection = ARES_FALSE; + ares_llist_node_t *node; + ares_conn_t *conn; - query->conn = NULL; + if (query->using_tcp) { + return server->tcp_conn; + } - /* Choose the server to send the query to */ - if (channel->rotate) { - server = ares__random_server(channel); - } else { - /* Pull first */ - server = ares__slist_first_val(channel->servers); + /* Fetch existing UDP connection */ + node = ares_llist_node_first(server->connections); + if (node == NULL) { + return NULL; } - if (server == NULL) { - end_query(channel, query, ARES_ENOSERVER /* ? */, NULL); - return ARES_ENOSERVER; + conn = ares_llist_node_val(node); + /* Not UDP, skip */ + if (conn->flags & ARES_CONN_FLAG_TCP) { + return NULL; } - if (query->using_tcp) { - size_t prior_len = 0; - /* Make sure the TCP socket for this server is set up and queue - * a send request. - */ - if (server->tcp_conn == NULL) { - new_connection = ARES_TRUE; - status = ares__open_connection(channel, server, ARES_TRUE); - switch (status) { - /* Good result, continue on */ - case ARES_SUCCESS: - break; + /* If the associated server has failures, don't use it. It should be cleaned + * up later. */ + if (conn->server->consec_failures > 0) { + return NULL; + } - /* These conditions are retryable as they are server-specific - * error codes */ - case ARES_ECONNREFUSED: - case ARES_EBADFAMILY: - server_increment_failures(server); - query->error_status = status; - return ares__requeue_query(query, now); + /* Used too many times */ + if (channel->udp_max_queries > 0 && + conn->total_queries >= channel->udp_max_queries) { + return NULL; + } - /* Anything else is not retryable, likely ENOMEM */ - default: - end_query(channel, query, status, NULL); - return status; - } - } + return conn; +} - conn = server->tcp_conn; +static ares_status_t ares_conn_query_write(ares_conn_t *conn, + ares_query_t *query, + const ares_timeval_t *now) +{ + ares_server_t *server = conn->server; + ares_channel_t *channel = server->channel; + ares_status_t status; - prior_len = ares__buf_len(server->tcp_send); + status = ares_cookie_apply(query->query, conn, now); + if (status != ARES_SUCCESS) { + return status; + } - status = ares__append_tcpbuf(server, query); - if (status != ARES_SUCCESS) { - end_query(channel, query, status, NULL); + /* We write using the TCP format even for UDP, we just strip the length + * before putting on the wire */ + status = ares_dns_write_buf_tcp(query->query, conn->out_buf); + if (status != ARES_SUCCESS) { + return status; + } - /* Only safe to kill connection if it was new, otherwise it should be - * cleaned up by another process later */ - if (new_connection) { - ares__close_connection(conn); - } - return status; - } + /* Not pending a TFO write and not connected, so we can't even try to + * write until we get a signal */ + if (conn->flags & ARES_CONN_FLAG_TCP && + !(conn->state_flags & ARES_CONN_STATE_CONNECTED) && + !(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) { + return ARES_SUCCESS; + } - if (prior_len == 0) { - SOCK_STATE_CALLBACK(channel, conn->fd, 1, 1); - } + /* Delay actual write if possible (TCP only, and only if callback + * configured) */ + if (channel->notify_pending_write_cb && !channel->notify_pending_write && + conn->flags & ARES_CONN_FLAG_TCP) { + channel->notify_pending_write = ARES_TRUE; + channel->notify_pending_write_cb(channel->notify_pending_write_cb_data); + return ARES_SUCCESS; + } + + /* Unfortunately we need to write right away and can't aggregate multiple + * queries into a single write. */ + return ares_conn_flush(conn); +} +ares_status_t ares_send_query(ares_server_t *requested_server, + ares_query_t *query, const ares_timeval_t *now) +{ + ares_channel_t *channel = query->channel; + ares_server_t *server; + ares_conn_t *conn; + size_t timeplus; + ares_status_t status; + ares_bool_t probe_downed_server = ARES_TRUE; + + /* Choose the server to send the query to */ + if (requested_server != NULL) { + server = requested_server; } else { - ares__llist_node_t *node = ares__llist_node_first(server->connections); - - /* Don't use the found connection if we've gone over the maximum number - * of queries. Also, skip over the TCP connection if it is the first in - * the list */ - if (node != NULL) { - conn = ares__llist_node_val(node); - if (conn->is_tcp) { - node = NULL; - } else if (channel->udp_max_queries > 0 && - conn->total_queries >= channel->udp_max_queries) { - node = NULL; - } + /* If rotate is turned on, do a random selection */ + if (channel->rotate) { + server = ares_random_server(channel); + } else { + /* First server in list */ + server = ares_slist_first_val(channel->servers); } + } - if (node == NULL) { - new_connection = ARES_TRUE; - status = ares__open_connection(channel, server, ARES_FALSE); - switch (status) { - /* Good result, continue on */ - case ARES_SUCCESS: - break; + if (server == NULL) { + end_query(channel, server, query, ARES_ENOSERVER /* ? */, NULL, NULL); + return ARES_ENOSERVER; + } - /* These conditions are retryable as they are server-specific - * error codes */ - case ARES_ECONNREFUSED: - case ARES_EBADFAMILY: - server_increment_failures(server); - query->error_status = status; - return ares__requeue_query(query, now); + /* If a query is directed to a specific query, or the server chosen has + * failures, or the query is being retried, don't probe for downed servers */ + if (requested_server != NULL || server->consec_failures > 0 || + query->try_count != 0) { + probe_downed_server = ARES_FALSE; + } - /* Anything else is not retryable, likely ENOMEM */ - default: - end_query(channel, query, status, NULL); - return status; - } - node = ares__llist_node_first(server->connections); + conn = ares_fetch_connection(channel, server, query); + if (conn == NULL) { + status = ares_open_connection(&conn, channel, server, query->using_tcp); + switch (status) { + /* Good result, continue on */ + case ARES_SUCCESS: + break; + + /* These conditions are retryable as they are server-specific + * error codes */ + case ARES_ECONNREFUSED: + case ARES_EBADFAMILY: + server_increment_failures(server, query->using_tcp); + return ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); + + /* Anything else is not retryable, likely ENOMEM */ + default: + end_query(channel, server, query, status, NULL, NULL); + return status; } + } - conn = ares__llist_node_val(node); - if (ares__socket_write(channel, conn->fd, query->qbuf, query->qlen) == -1) { - /* FIXME: Handle EAGAIN here since it likely can happen. */ - server_increment_failures(server); - status = ares__requeue_query(query, now); + /* Write the query */ + status = ares_conn_query_write(conn, query, now); + switch (status) { + /* Good result, continue on */ + case ARES_SUCCESS: + break; - /* Only safe to kill connection if it was new, otherwise it should be - * cleaned up by another process later */ - if (new_connection) { - ares__close_connection(conn); + case ARES_ENOMEM: + /* Not retryable */ + end_query(channel, server, query, status, NULL, NULL); + return status; + + /* These conditions are retryable as they are server-specific + * error codes */ + case ARES_ECONNREFUSED: + case ARES_EBADFAMILY: + handle_conn_error(conn, ARES_TRUE, status); + status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); + if (status == ARES_ETIMEOUT) { + status = ARES_ECONNREFUSED; } + return status; + default: + server_increment_failures(server, query->using_tcp); + status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); return status; - } } - timeplus = ares__calc_query_timeout(query); + timeplus = ares_calc_query_timeout(query, server, now); /* Keep track of queries bucketed by timeout, so we can process * timeout events quickly. */ - ares__slist_node_destroy(query->node_queries_by_timeout); + ares_slist_node_destroy(query->node_queries_by_timeout); + query->ts = *now; query->timeout = *now; timeadd(&query->timeout, timeplus); query->node_queries_by_timeout = - ares__slist_insert(channel->queries_by_timeout, query); + ares_slist_insert(channel->queries_by_timeout, query); if (!query->node_queries_by_timeout) { - end_query(channel, query, ARES_ENOMEM, NULL); - /* Only safe to kill connection if it was new, otherwise it should be - * cleaned up by another process later */ - if (new_connection) { - ares__close_connection(conn); - } + /* LCOV_EXCL_START: OutOfMemory */ + end_query(channel, server, query, ARES_ENOMEM, NULL, NULL); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } /* Keep track of queries bucketed by connection, so we can process errors * quickly. */ - ares__llist_node_destroy(query->node_queries_to_conn); + ares_llist_node_destroy(query->node_queries_to_conn); query->node_queries_to_conn = - ares__llist_insert_last(conn->queries_to_conn, query); + ares_llist_insert_last(conn->queries_to_conn, query); if (query->node_queries_to_conn == NULL) { - end_query(channel, query, ARES_ENOMEM, NULL); - /* Only safe to kill connection if it was new, otherwise it should be - * cleaned up by another process later */ - if (new_connection) { - ares__close_connection(conn); - } + /* LCOV_EXCL_START: OutOfMemory */ + end_query(channel, server, query, ARES_ENOMEM, NULL, NULL); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } query->conn = conn; conn->total_queries++; + + /* We just successfully enqueud a query, see if we should probe downed + * servers. */ + if (probe_downed_server) { + ares_probe_failed_server(channel, server, query); + } + + if (channel->query_enqueue_cb) { + channel->query_enqueue_cb(channel->query_enqueue_cb_data); + } + return ARES_SUCCESS; } -static ares_bool_t same_questions(const ares_dns_record_t *qrec, +static ares_bool_t same_questions(const ares_query_t *query, const ares_dns_record_t *arec) { - size_t i; - ares_bool_t rv = ARES_FALSE; + size_t i; + ares_bool_t rv = ARES_FALSE; + const ares_dns_record_t *qrec = query->query; + const ares_channel_t *channel = query->channel; if (ares_dns_record_query_cnt(qrec) != ares_dns_record_query_cnt(arec)) { @@ -1075,9 +1426,26 @@ static ares_bool_t same_questions(const ares_dns_record_t *qrec, aname == NULL) { goto done; } - if (strcasecmp(qname, aname) != 0 || qtype != atype || qclass != aclass) { + + if (qtype != atype || qclass != aclass) { goto done; } + + if (channel->flags & ARES_FLAG_DNS0x20 && !query->using_tcp) { + /* NOTE: for DNS 0x20, part of the protection is to use a case-sensitive + * comparison of the DNS query name. This expects the upstream DNS + * server to preserve the case of the name in the response packet. + * https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 + */ + if (!ares_streq(qname, aname)) { + goto done; + } + } else { + /* without DNS0x20 use case-insensitive matching */ + if (!ares_strcaseeq(qname, aname)) { + goto done; + } + } } rv = ARES_TRUE; @@ -1086,53 +1454,36 @@ static ares_bool_t same_questions(const ares_dns_record_t *qrec, return rv; } -static ares_bool_t same_address(const struct sockaddr *sa, - const struct ares_addr *aa) -{ - const void *addr1; - const void *addr2; - - if (sa->sa_family == aa->family) { - switch (aa->family) { - case AF_INET: - addr1 = &aa->addr.addr4; - addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr; - if (memcmp(addr1, addr2, sizeof(aa->addr.addr4)) == 0) { - return ARES_TRUE; /* match */ - } - break; - case AF_INET6: - addr1 = &aa->addr.addr6; - addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr; - if (memcmp(addr1, addr2, sizeof(aa->addr.addr6)) == 0) { - return ARES_TRUE; /* match */ - } - break; - default: - break; /* LCOV_EXCL_LINE */ - } - } - return ARES_FALSE; /* different */ -} - -static void ares_detach_query(struct query *query) +static void ares_detach_query(ares_query_t *query) { /* Remove the query from all the lists in which it is linked */ - ares__htable_szvp_remove(query->channel->queries_by_qid, query->qid); - ares__slist_node_destroy(query->node_queries_by_timeout); - ares__llist_node_destroy(query->node_queries_to_conn); - ares__llist_node_destroy(query->node_all_queries); - query->node_queries_by_timeout = NULL; - query->node_queries_to_conn = NULL; - query->node_all_queries = NULL; + ares_query_remove_from_conn(query); + ares_htable_szvp_remove(query->channel->queries_by_qid, query->qid); + ares_llist_node_destroy(query->node_all_queries); + query->node_all_queries = NULL; } -static void end_query(ares_channel_t *channel, struct query *query, - ares_status_t status, const ares_dns_record_t *dnsrec) +static void end_query(ares_channel_t *channel, ares_server_t *server, + ares_query_t *query, ares_status_t status, + ares_dns_record_t *dnsrec, ares_array_t **requeue) { + /* If we were probing for the server to come back online, lets mark it as + * no longer being probed */ + if (server != NULL) { + server->probe_pending = ARES_FALSE; + } + + ares_metrics_record(query, server, status, dnsrec); + + /* Delay calling the query callback */ + if (requeue != NULL) { + ares_append_endqueue(requeue, query, status, dnsrec); + return; + } + /* Invoke the callback. */ query->callback(query->arg, status, query->timeouts, dnsrec); - ares__free_query(query); + ares_free_query(query); /* Check and notify if no other queries are enqueued on the channel. This * must come after the callback and freeing the query for 2 reasons. @@ -1142,14 +1493,14 @@ static void end_query(ares_channel_t *channel, struct query *query, ares_queue_notify_empty(channel); } -void ares__free_query(struct query *query) +void ares_free_query(ares_query_t *query) { ares_detach_query(query); /* Zero out some important stuff, to help catch bugs */ query->callback = NULL; query->arg = NULL; /* Deallocate the memory associated with the query */ - ares_free(query->qbuf); + ares_dns_record_destroy(query->query); ares_free(query); } diff --git a/deps/cares/src/lib/ares_qcache.c b/deps/cares/src/lib/ares_qcache.c index 2af1125a0d299f..4050ff54bf1667 100644 --- a/deps/cares/src/lib/ares_qcache.c +++ b/deps/cares/src/lib/ares_qcache.c @@ -23,14 +23,12 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" -struct ares__qcache { - ares__htable_strvp_t *cache; - ares__slist_t *expire; - unsigned int max_ttl; +struct ares_qcache { + ares_htable_strvp_t *cache; + ares_slist_t *expire; + unsigned int max_ttl; }; typedef struct { @@ -38,44 +36,44 @@ typedef struct { ares_dns_record_t *dnsrec; time_t expire_ts; time_t insert_ts; -} ares__qcache_entry_t; +} ares_qcache_entry_t; -static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) +static char *ares_qcache_calc_key(const ares_dns_record_t *dnsrec) { - ares__buf_t *buf = ares__buf_create(); + ares_buf_t *buf = ares_buf_create(); size_t i; ares_status_t status; ares_dns_flags_t flags; if (dnsrec == NULL || buf == NULL) { - return NULL; + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* Format is OPCODE|FLAGS[|QTYPE1|QCLASS1|QNAME1]... */ - status = ares__buf_append_str( + status = ares_buf_append_str( buf, ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec))); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_append_byte(buf, '|'); + status = ares_buf_append_byte(buf, '|'); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } flags = ares_dns_record_get_flags(dnsrec); /* Only care about RD and CD */ if (flags & ARES_FLAG_RD) { - status = ares__buf_append_str(buf, "rd"); + status = ares_buf_append_str(buf, "rd"); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } if (flags & ARES_FLAG_CD) { - status = ares__buf_append_str(buf, "cd"); + status = ares_buf_append_str(buf, "cd"); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -87,32 +85,32 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: DefensiveCoding */ } - status = ares__buf_append_byte(buf, '|'); + status = ares_buf_append_byte(buf, '|'); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_append_str(buf, ares_dns_rec_type_tostr(qtype)); + status = ares_buf_append_str(buf, ares_dns_rec_type_tostr(qtype)); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_append_byte(buf, '|'); + status = ares_buf_append_byte(buf, '|'); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_append_str(buf, ares_dns_class_tostr(qclass)); + status = ares_buf_append_str(buf, ares_dns_class_tostr(qclass)); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_append_byte(buf, '|'); + status = ares_buf_append_byte(buf, '|'); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } /* On queries, a '.' may be appended to the name to indicate an explicit @@ -123,61 +121,64 @@ static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec) name_len--; } - status = ares__buf_append(buf, (const unsigned char *)name, name_len); - if (status != ARES_SUCCESS) { - goto fail; + if (name_len > 0) { + status = ares_buf_append(buf, (const unsigned char *)name, name_len); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } } } - return ares__buf_finish_str(buf, NULL); + return ares_buf_finish_str(buf, NULL); +/* LCOV_EXCL_START: OutOfMemory */ fail: - ares__buf_destroy(buf); + ares_buf_destroy(buf); return NULL; + /* LCOV_EXCL_STOP */ } -static void ares__qcache_expire(ares__qcache_t *cache, - const struct timeval *now) +static void ares_qcache_expire(ares_qcache_t *cache, const ares_timeval_t *now) { - ares__slist_node_t *node; + ares_slist_node_t *node; if (cache == NULL) { return; } - while ((node = ares__slist_node_first(cache->expire)) != NULL) { - const ares__qcache_entry_t *entry = ares__slist_node_val(node); - if (entry->expire_ts > now->tv_sec) { + while ((node = ares_slist_node_first(cache->expire)) != NULL) { + const ares_qcache_entry_t *entry = ares_slist_node_val(node); + + /* If now is NULL, we're flushing everything, so don't break */ + if (now != NULL && entry->expire_ts > now->sec) { break; } - ares__htable_strvp_remove(cache->cache, entry->key); - ares__slist_node_destroy(node); + ares_htable_strvp_remove(cache->cache, entry->key); + ares_slist_node_destroy(node); } } -void ares__qcache_flush(ares__qcache_t *cache) +void ares_qcache_flush(ares_qcache_t *cache) { - struct timeval now; - memset(&now, 0, sizeof(now)); - ares__qcache_expire(cache, &now); + ares_qcache_expire(cache, NULL /* flush all */); } -void ares__qcache_destroy(ares__qcache_t *cache) +void ares_qcache_destroy(ares_qcache_t *cache) { if (cache == NULL) { return; } - ares__htable_strvp_destroy(cache->cache); - ares__slist_destroy(cache->expire); + ares_htable_strvp_destroy(cache->cache); + ares_slist_destroy(cache->expire); ares_free(cache); } -static int ares__qcache_entry_sort_cb(const void *arg1, const void *arg2) +static int ares_qcache_entry_sort_cb(const void *arg1, const void *arg2) { - const ares__qcache_entry_t *entry1 = arg1; - const ares__qcache_entry_t *entry2 = arg2; + const ares_qcache_entry_t *entry1 = arg1; + const ares_qcache_entry_t *entry2 = arg2; if (entry1->expire_ts > entry2->expire_ts) { return 1; @@ -190,11 +191,11 @@ static int ares__qcache_entry_sort_cb(const void *arg1, const void *arg2) return 0; } -static void ares__qcache_entry_destroy_cb(void *arg) +static void ares_qcache_entry_destroy_cb(void *arg) { - ares__qcache_entry_t *entry = arg; + ares_qcache_entry_t *entry = arg; if (entry == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } ares_free(entry->key); @@ -202,30 +203,30 @@ static void ares__qcache_entry_destroy_cb(void *arg) ares_free(entry); } -ares_status_t ares__qcache_create(ares_rand_state *rand_state, - unsigned int max_ttl, - ares__qcache_t **cache_out) +ares_status_t ares_qcache_create(ares_rand_state *rand_state, + unsigned int max_ttl, + ares_qcache_t **cache_out) { - ares_status_t status = ARES_SUCCESS; - ares__qcache_t *cache; + ares_status_t status = ARES_SUCCESS; + ares_qcache_t *cache; cache = ares_malloc_zero(sizeof(*cache)); if (cache == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - cache->cache = ares__htable_strvp_create(NULL); + cache->cache = ares_htable_strvp_create(NULL); if (cache->cache == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - cache->expire = ares__slist_create(rand_state, ares__qcache_entry_sort_cb, - ares__qcache_entry_destroy_cb); + cache->expire = ares_slist_create(rand_state, ares_qcache_entry_sort_cb, + ares_qcache_entry_destroy_cb); if (cache->expire == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } cache->max_ttl = max_ttl; @@ -233,7 +234,7 @@ ares_status_t ares__qcache_create(ares_rand_state *rand_state, done: if (status != ARES_SUCCESS) { *cache_out = NULL; - ares__qcache_destroy(cache); + ares_qcache_destroy(cache); return status; } @@ -241,7 +242,7 @@ ares_status_t ares__qcache_create(ares_rand_state *rand_state, return status; } -static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec) +static unsigned int ares_qcache_calc_minttl(ares_dns_record_t *dnsrec) { unsigned int minttl = 0xFFFFFFFF; size_t sect; @@ -254,7 +255,10 @@ static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec) ares_dns_record_rr_get(dnsrec, (ares_dns_section_t)sect, i); ares_dns_rec_type_t type = ares_dns_rr_get_type(rr); unsigned int ttl = ares_dns_rr_get_ttl(rr); - if (type == ARES_REC_TYPE_OPT || type == ARES_REC_TYPE_SOA) { + + /* TTL is meaningless on these record types */ + if (type == ARES_REC_TYPE_OPT || type == ARES_REC_TYPE_SOA || + type == ARES_REC_TYPE_SIG) { continue; } @@ -267,7 +271,7 @@ static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec) return minttl; } -static unsigned int ares__qcache_soa_minimum(ares_dns_record_t *dnsrec) +static unsigned int ares_qcache_soa_minimum(ares_dns_record_t *dnsrec) { size_t i; @@ -296,37 +300,18 @@ static unsigned int ares__qcache_soa_minimum(ares_dns_record_t *dnsrec) return 0; } -static char *ares__qcache_calc_key_frombuf(const unsigned char *qbuf, - size_t qlen) -{ - ares_status_t status; - ares_dns_record_t *dnsrec = NULL; - char *key = NULL; - - status = ares_dns_parse(qbuf, qlen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - goto done; - } - - key = ares__qcache_calc_key(dnsrec); - -done: - ares_dns_record_destroy(dnsrec); - return key; -} - /* On success, takes ownership of dnsrec */ -static ares_status_t ares__qcache_insert(ares__qcache_t *qcache, - ares_dns_record_t *dnsrec, - const unsigned char *qbuf, size_t qlen, - const struct timeval *now) +static ares_status_t ares_qcache_insert_int(ares_qcache_t *qcache, + ares_dns_record_t *qresp, + const ares_dns_record_t *qreq, + const ares_timeval_t *now) { - ares__qcache_entry_t *entry; - unsigned int ttl; - ares_dns_rcode_t rcode = ares_dns_record_get_rcode(dnsrec); - ares_dns_flags_t flags = ares_dns_record_get_flags(dnsrec); + ares_qcache_entry_t *entry; + unsigned int ttl; + ares_dns_rcode_t rcode = ares_dns_record_get_rcode(qresp); + ares_dns_flags_t flags = ares_dns_record_get_flags(qresp); - if (qcache == NULL || dnsrec == NULL) { + if (qcache == NULL || qresp == NULL) { return ARES_EFORMERR; } @@ -342,9 +327,13 @@ static ares_status_t ares__qcache_insert(ares__qcache_t *qcache, /* Look at SOA for NXDOMAIN for minimum */ if (rcode == ARES_RCODE_NXDOMAIN) { - ttl = ares__qcache_soa_minimum(dnsrec); + ttl = ares_qcache_soa_minimum(qresp); } else { - ttl = ares__qcache_calc_minttl(dnsrec); + ttl = ares_qcache_calc_minttl(qresp); + } + + if (ttl > qcache->max_ttl) { + ttl = qcache->max_ttl; } /* Don't cache something that is already expired */ @@ -352,55 +341,53 @@ static ares_status_t ares__qcache_insert(ares__qcache_t *qcache, return ARES_EREFUSED; } - if (ttl > qcache->max_ttl) { - ttl = qcache->max_ttl; - } - entry = ares_malloc_zero(sizeof(*entry)); if (entry == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - entry->dnsrec = dnsrec; - entry->expire_ts = now->tv_sec + (time_t)ttl; - entry->insert_ts = now->tv_sec; + entry->dnsrec = qresp; + entry->expire_ts = (time_t)now->sec + (time_t)ttl; + entry->insert_ts = (time_t)now->sec; /* We can't guarantee the server responded with the same flags as the * request had, so we have to re-parse the request in order to generate the * key for caching, but we'll only do this once we know for sure we really * want to cache it */ - entry->key = ares__qcache_calc_key_frombuf(qbuf, qlen); + entry->key = ares_qcache_calc_key(qreq); if (entry->key == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - if (!ares__htable_strvp_insert(qcache->cache, entry->key, entry)) { - goto fail; + if (!ares_htable_strvp_insert(qcache->cache, entry->key, entry)) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } - if (ares__slist_insert(qcache->expire, entry) == NULL) { - goto fail; + if (ares_slist_insert(qcache->expire, entry) == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } return ARES_SUCCESS; +/* LCOV_EXCL_START: OutOfMemory */ fail: if (entry != NULL && entry->key != NULL) { - ares__htable_strvp_remove(qcache->cache, entry->key); + ares_htable_strvp_remove(qcache->cache, entry->key); ares_free(entry->key); ares_free(entry); } return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } ares_status_t ares_qcache_fetch(ares_channel_t *channel, - const struct timeval *now, + const ares_timeval_t *now, const ares_dns_record_t *dnsrec, const ares_dns_record_t **dnsrec_resp) { - char *key = NULL; - ares__qcache_entry_t *entry; - ares_status_t status = ARES_SUCCESS; + char *key = NULL; + ares_qcache_entry_t *entry; + ares_status_t status = ARES_SUCCESS; if (channel == NULL || dnsrec == NULL || dnsrec_resp == NULL) { return ARES_EFORMERR; @@ -410,22 +397,22 @@ ares_status_t ares_qcache_fetch(ares_channel_t *channel, return ARES_ENOTFOUND; } - ares__qcache_expire(channel->qcache, now); + ares_qcache_expire(channel->qcache, now); - key = ares__qcache_calc_key(dnsrec); + key = ares_qcache_calc_key(dnsrec); if (key == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - entry = ares__htable_strvp_get_direct(channel->qcache->cache, key); + entry = ares_htable_strvp_get_direct(channel->qcache->cache, key); if (entry == NULL) { status = ARES_ENOTFOUND; goto done; } - ares_dns_record_write_ttl_decrement( - entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts)); + ares_dns_record_ttl_decrement(entry->dnsrec, + (unsigned int)(now->sec - entry->insert_ts)); *dnsrec_resp = entry->dnsrec; @@ -434,11 +421,20 @@ ares_status_t ares_qcache_fetch(ares_channel_t *channel, return status; } -ares_status_t ares_qcache_insert(ares_channel_t *channel, - const struct timeval *now, - const struct query *query, - ares_dns_record_t *dnsrec) +ares_status_t ares_qcache_insert(ares_channel_t *channel, + const ares_timeval_t *now, + const ares_query_t *query, + const ares_dns_record_t *dnsrec) { - return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen, - now); + ares_dns_record_t *dupdns = ares_dns_record_duplicate(dnsrec); + ares_status_t status; + + if (dupdns == NULL) { + return ARES_ENOMEM; + } + status = ares_qcache_insert_int(channel->qcache, dupdns, query->query, now); + if (status != ARES_SUCCESS) { + ares_dns_record_destroy(dupdns); + } + return status; } diff --git a/deps/cares/src/lib/ares_query.c b/deps/cares/src/lib/ares_query.c index 0eea80e7fc1e59..ca3b6a9b732add 100644 --- a/deps/cares/src/lib/ares_query.c +++ b/deps/cares/src/lib/ares_query.c @@ -25,18 +25,12 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> #endif -#include "ares_nameser.h" - -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - typedef struct { ares_callback_dnsrec callback; void *arg; @@ -64,11 +58,11 @@ static void ares_query_dnsrec_cb(void *arg, ares_status_t status, ares_free(qquery); } -static ares_status_t ares_query_int(ares_channel_t *channel, const char *name, - ares_dns_class_t dnsclass, - ares_dns_rec_type_t type, - ares_callback_dnsrec callback, void *arg, - unsigned short *qid) +ares_status_t ares_query_nolock(ares_channel_t *channel, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid) { ares_status_t status; ares_dns_record_t *dnsrec = NULL; @@ -76,11 +70,13 @@ static ares_status_t ares_query_int(ares_channel_t *channel, const char *name, ares_query_dnsrec_arg_t *qquery = NULL; if (channel == NULL || name == NULL || callback == NULL) { + /* LCOV_EXCL_START: DefensiveCoding */ status = ARES_EFORMERR; if (callback != NULL) { callback(arg, status, 0, NULL); } return status; + /* LCOV_EXCL_STOP */ } if (!(channel->flags & ARES_FLAG_NORECURSE)) { @@ -91,23 +87,26 @@ static ares_status_t ares_query_int(ares_channel_t *channel, const char *name, &dnsrec, name, dnsclass, type, 0, flags, (size_t)(channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0); if (status != ARES_SUCCESS) { - callback(arg, status, 0, NULL); - return status; + callback(arg, status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return status; /* LCOV_EXCL_LINE: OutOfMemory */ } qquery = ares_malloc(sizeof(*qquery)); if (qquery == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ status = ARES_ENOMEM; callback(arg, status, 0, NULL); ares_dns_record_destroy(dnsrec); return status; + /* LCOV_EXCL_STOP */ } qquery->callback = callback; qquery->arg = arg; /* Send it off. qcallback will be called when we get an answer. */ - status = ares_send_dnsrec(channel, dnsrec, ares_query_dnsrec_cb, qquery, qid); + status = ares_send_nolock(channel, NULL, 0, dnsrec, ares_query_dnsrec_cb, + qquery, qid); ares_dns_record_destroy(dnsrec); return status; @@ -125,9 +124,9 @@ ares_status_t ares_query_dnsrec(ares_channel_t *channel, const char *name, return ARES_EFORMERR; } - ares__channel_lock(channel); - status = ares_query_int(channel, name, dnsclass, type, callback, arg, qid); - ares__channel_unlock(channel); + ares_channel_lock(channel); + status = ares_query_nolock(channel, name, dnsclass, type, callback, arg, qid); + ares_channel_unlock(channel); return status; } @@ -140,13 +139,13 @@ void ares_query(ares_channel_t *channel, const char *name, int dnsclass, return; } - carg = ares__dnsrec_convert_arg(callback, arg); + carg = ares_dnsrec_convert_arg(callback, arg); if (carg == NULL) { - callback(arg, ARES_ENOMEM, 0, NULL, 0); - return; + callback(arg, ARES_ENOMEM, 0, NULL, 0); /* LCOV_EXCL_LINE: OutOfMemory */ + return; /* LCOV_EXCL_LINE: OutOfMemory */ } ares_query_dnsrec(channel, name, (ares_dns_class_t)dnsclass, - (ares_dns_rec_type_t)type, ares__dnsrec_convert_cb, carg, + (ares_dns_rec_type_t)type, ares_dnsrec_convert_cb, carg, NULL); } diff --git a/deps/cares/src/lib/ares_search.c b/deps/cares/src/lib/ares_search.c index 4fd909cd4f8b9f..c605caf42cb7a8 100644 --- a/deps/cares/src/lib/ares_search.c +++ b/deps/cares/src/lib/ares_search.c @@ -25,16 +25,12 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_STRINGS_H # include <strings.h> #endif -#include "ares.h" -#include "ares_private.h" -#include "ares_dns.h" - struct search_query { /* Arguments passed to ares_search_dnsrec() */ ares_channel_t *channel; @@ -57,9 +53,9 @@ struct search_query { static void squery_free(struct search_query *squery) { if (squery == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__strsplit_free(squery->names, squery->names_cnt); + ares_strsplit_free(squery->names, squery->names_cnt); ares_dns_record_destroy(squery->dnsrec); ares_free(squery); } @@ -87,7 +83,7 @@ static ares_status_t ares_search_next(ares_channel_t *channel, /* Misuse check */ if (squery->next_name_idx >= squery->names_cnt) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } status = ares_dns_record_query_set_name( @@ -96,8 +92,8 @@ static ares_status_t ares_search_next(ares_channel_t *channel, return status; } - status = - ares_send_dnsrec(channel, squery->dnsrec, search_callback, squery, NULL); + status = ares_send_nolock(channel, NULL, 0, squery->dnsrec, search_callback, + squery, NULL); if (status != ARES_EFORMERR) { *skip_cleanup = ARES_TRUE; @@ -111,26 +107,36 @@ static void search_callback(void *arg, ares_status_t status, size_t timeouts, { struct search_query *squery = (struct search_query *)arg; ares_channel_t *channel = squery->channel; - ares_dns_rcode_t rcode; - size_t ancount; + ares_status_t mystatus; ares_bool_t skip_cleanup = ARES_FALSE; squery->timeouts += timeouts; - if (status != ARES_SUCCESS) { - end_squery(squery, status, dnsrec); - return; - } - - rcode = ares_dns_record_get_rcode(dnsrec); - ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); - mystatus = ares_dns_query_reply_tostatus(rcode, ancount); - - if (mystatus != ARES_ENODATA && mystatus != ARES_ESERVFAIL && - mystatus != ARES_ENOTFOUND) { - end_squery(squery, mystatus, dnsrec); - return; + if (dnsrec) { + ares_dns_rcode_t rcode = ares_dns_record_get_rcode(dnsrec); + size_t ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); + mystatus = ares_dns_query_reply_tostatus(rcode, ancount); + } else { + mystatus = status; + } + + switch (mystatus) { + case ARES_ENODATA: + case ARES_ENOTFOUND: + break; + case ARES_ESERVFAIL: + case ARES_EREFUSED: + /* Issue #852, systemd-resolved may return SERVFAIL or REFUSED on a + * single label domain name. */ + if (ares_name_label_cnt(squery->names[squery->next_name_idx - 1]) != 1) { + end_squery(squery, mystatus, dnsrec); + return; + } + break; + default: + end_squery(squery, mystatus, dnsrec); + return; } /* If we ever get ARES_ENODATA along the way, record that; if the search @@ -151,7 +157,6 @@ static void search_callback(void *arg, ares_status_t status, size_t timeouts, return; } - /* We have no more domains to search, return an appropriate response. */ if (mystatus == ARES_ENOTFOUND && squery->ever_got_nodata) { end_squery(squery, ARES_ENODATA, NULL); @@ -163,8 +168,8 @@ static void search_callback(void *arg, ares_status_t status, size_t timeouts, /* Determine if the domain should be looked up as-is, or if it is eligible * for search by appending domains */ -static ares_bool_t ares__search_eligible(const ares_channel_t *channel, - const char *name) +static ares_bool_t ares_search_eligible(const ares_channel_t *channel, + const char *name) { size_t len = ares_strlen(name); @@ -180,9 +185,28 @@ static ares_bool_t ares__search_eligible(const ares_channel_t *channel, return ARES_TRUE; } -ares_status_t ares__search_name_list(const ares_channel_t *channel, - const char *name, char ***names, - size_t *names_len) +size_t ares_name_label_cnt(const char *name) +{ + const char *p; + size_t ndots = 0; + + if (name == NULL) { + return 0; + } + + for (p = name; p != NULL && *p != 0; p++) { + if (*p == '.') { + ndots++; + } + } + + /* Label count is 1 greater than ndots */ + return ndots + 1; +} + +ares_status_t ares_search_name_list(const ares_channel_t *channel, + const char *name, char ***names, + size_t *names_len) { ares_status_t status; char **list = NULL; @@ -190,18 +214,17 @@ ares_status_t ares__search_name_list(const ares_channel_t *channel, char *alias = NULL; size_t ndots = 0; size_t idx = 0; - const char *p; size_t i; /* Perform HOSTALIASES resolution */ - status = ares__lookup_hostaliases(channel, name, &alias); + status = ares_lookup_hostaliases(channel, name, &alias); if (status == ARES_SUCCESS) { /* If hostalias succeeds, there is no searching, it is used as-is */ list_len = 1; list = ares_malloc_zero(sizeof(*list) * list_len); if (list == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } list[0] = alias; alias = NULL; @@ -211,28 +234,26 @@ ares_status_t ares__search_name_list(const ares_channel_t *channel, } /* See if searching is eligible at all, if not, look up as-is only */ - if (!ares__search_eligible(channel, name)) { + if (!ares_search_eligible(channel, name)) { list_len = 1; list = ares_malloc_zero(sizeof(*list) * list_len); if (list == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } list[0] = ares_strdup(name); if (list[0] == NULL) { - status = ARES_ENOMEM; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } else { status = ARES_SUCCESS; } goto done; } - /* Count the number of dots in name */ - ndots = 0; - for (p = name; *p != 0; p++) { - if (*p == '.') { - ndots++; - } + /* Count the number of dots in name, 1 less than label count */ + ndots = ares_name_label_cnt(name); + if (ndots > 0) { + ndots--; } /* Allocate an entry for each search domain, plus one for as-is */ @@ -244,7 +265,7 @@ ares_status_t ares__search_name_list(const ares_channel_t *channel, } /* Set status here, its possible there are no search domains at all, so - * status may be ARES_ENOTFOUND from ares__lookup_hostaliases(). */ + * status may be ARES_ENOTFOUND from ares_lookup_hostaliases(). */ status = ARES_SUCCESS; /* Try as-is first */ @@ -259,7 +280,7 @@ ares_status_t ares__search_name_list(const ares_channel_t *channel, /* Append each search suffix to the name */ for (i = 0; i < channel->ndomains; i++) { - status = ares__cat_domain(name, channel->domains[i], &list[idx]); + status = ares_cat_domain(name, channel->domains[i], &list[idx]); if (status != ARES_SUCCESS) { goto done; } @@ -282,7 +303,7 @@ ares_status_t ares__search_name_list(const ares_channel_t *channel, *names = list; *names_len = list_len; } else { - ares__strsplit_free(list, list_len); + ares_strsplit_free(list, list_len); } ares_free(alias); @@ -312,7 +333,7 @@ static ares_status_t ares_search_int(ares_channel_t *channel, } /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */ - if (ares__is_onion_domain(name)) { + if (ares_is_onion_domain(name)) { status = ARES_ENOTFOUND; goto fail; } @@ -322,8 +343,8 @@ static ares_status_t ares_search_int(ares_channel_t *channel, */ squery = ares_malloc_zero(sizeof(*squery)); if (squery == NULL) { - status = ARES_ENOMEM; - goto fail; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } squery->channel = channel; @@ -331,8 +352,8 @@ static ares_status_t ares_search_int(ares_channel_t *channel, /* Duplicate DNS record since, name will need to be rewritten */ squery->dnsrec = ares_dns_record_duplicate(dnsrec); if (squery->dnsrec == NULL) { - status = ARES_ENOMEM; - goto fail; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } squery->callback = callback; @@ -341,7 +362,7 @@ static ares_status_t ares_search_int(ares_channel_t *channel, squery->ever_got_nodata = ARES_FALSE; status = - ares__search_name_list(channel, name, &squery->names, &squery->names_cnt); + ares_search_name_list(channel, name, &squery->names, &squery->names_cnt); if (status != ARES_SUCCESS) { goto fail; } @@ -361,7 +382,7 @@ static ares_status_t ares_search_int(ares_channel_t *channel, return status; } -/* Callback argument structure passed to ares__dnsrec_convert_cb(). */ +/* Callback argument structure passed to ares_dnsrec_convert_cb(). */ typedef struct { ares_callback callback; void *arg; @@ -369,7 +390,7 @@ typedef struct { /*! Function to create callback arg for converting from ares_callback_dnsrec * to ares_calback */ -void *ares__dnsrec_convert_arg(ares_callback callback, void *arg) +void *ares_dnsrec_convert_arg(ares_callback callback, void *arg) { dnsrec_convert_arg_t *carg = ares_malloc_zero(sizeof(*carg)); if (carg == NULL) { @@ -384,8 +405,8 @@ void *ares__dnsrec_convert_arg(ares_callback callback, void *arg) * the ares_callback prototype, by writing the result and passing that to * the inner callback. */ -void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, - const ares_dns_record_t *dnsrec) +void ares_dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) { dnsrec_convert_arg_t *carg = arg; unsigned char *abuf = NULL; @@ -420,11 +441,11 @@ void ares_search(ares_channel_t *channel, const char *name, int dnsclass, } /* For now, ares_search_int() uses the ares_callback prototype. We need to - * wrap the callback passed to this function in ares__dnsrec_convert_cb, to + * wrap the callback passed to this function in ares_dnsrec_convert_cb, to * convert from ares_callback_dnsrec to ares_callback. Allocate the convert * arg structure here. */ - carg = ares__dnsrec_convert_arg(callback, arg); + carg = ares_dnsrec_convert_arg(callback, arg); if (carg == NULL) { callback(arg, ARES_ENOMEM, 0, NULL, 0); return; @@ -441,9 +462,9 @@ void ares_search(ares_channel_t *channel, const char *name, int dnsclass, return; } - ares__channel_lock(channel); - ares_search_int(channel, dnsrec, ares__dnsrec_convert_cb, carg); - ares__channel_unlock(channel); + ares_channel_lock(channel); + ares_search_int(channel, dnsrec, ares_dnsrec_convert_cb, carg); + ares_channel_unlock(channel); ares_dns_record_destroy(dnsrec); } @@ -456,18 +477,18 @@ ares_status_t ares_search_dnsrec(ares_channel_t *channel, ares_status_t status; if (channel == NULL || dnsrec == NULL || callback == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__channel_lock(channel); + ares_channel_lock(channel); status = ares_search_int(channel, dnsrec, callback, arg); - ares__channel_unlock(channel); + ares_channel_unlock(channel); return status; } /* Concatenate two domains. */ -ares_status_t ares__cat_domain(const char *name, const char *domain, char **s) +ares_status_t ares_cat_domain(const char *name, const char *domain, char **s) { size_t nlen = ares_strlen(name); size_t dlen = ares_strlen(domain); @@ -478,7 +499,7 @@ ares_status_t ares__cat_domain(const char *name, const char *domain, char **s) } memcpy(*s, name, nlen); (*s)[nlen] = '.'; - if (strcmp(domain, ".") == 0) { + if (ares_streq(domain, ".")) { /* Avoid appending the root domain to the separator, which would set *s to an ill-formed value (ending in two consecutive dots). */ dlen = 0; @@ -488,17 +509,18 @@ ares_status_t ares__cat_domain(const char *name, const char *domain, char **s) return ARES_SUCCESS; } -ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, - const char *name, char **alias) +ares_status_t ares_lookup_hostaliases(const ares_channel_t *channel, + const char *name, char **alias) { - ares_status_t status = ARES_SUCCESS; - const char *hostaliases = NULL; - ares__buf_t *buf = NULL; - ares__llist_t *lines = NULL; - ares__llist_node_t *node; + ares_status_t status = ARES_SUCCESS; + const char *hostaliases = NULL; + ares_buf_t *buf = NULL; + ares_array_t *lines = NULL; + size_t num; + size_t i; if (channel == NULL || name == NULL || alias == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } *alias = NULL; @@ -519,13 +541,13 @@ ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, goto done; } - buf = ares__buf_create(); + buf = ares_buf_create(); if (buf == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - status = ares__buf_load_file(hostaliases, buf); + status = ares_buf_load_file(hostaliases, buf); if (status != ARES_SUCCESS) { goto done; } @@ -538,51 +560,52 @@ ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, * curl www.curl.se */ - status = ares__buf_split(buf, (const unsigned char *)"\n", 1, - ARES_BUF_SPLIT_TRIM, 0, &lines); + status = ares_buf_split(buf, (const unsigned char *)"\n", 1, + ARES_BUF_SPLIT_TRIM, 0, &lines); if (status != ARES_SUCCESS) { goto done; } - for (node = ares__llist_node_first(lines); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *line = ares__llist_node_val(node); + num = ares_array_len(lines); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(lines, i); + ares_buf_t *line = *bufptr; char hostname[64] = ""; char fqdn[256] = ""; /* Pull off hostname */ - ares__buf_tag(line); - ares__buf_consume_nonwhitespace(line); - if (ares__buf_tag_fetch_string(line, hostname, sizeof(hostname)) != + ares_buf_tag(line); + ares_buf_consume_nonwhitespace(line); + if (ares_buf_tag_fetch_string(line, hostname, sizeof(hostname)) != ARES_SUCCESS) { continue; } /* Match hostname */ - if (strcasecmp(hostname, name) != 0) { + if (!ares_strcaseeq(hostname, name)) { continue; } /* consume whitespace */ - ares__buf_consume_whitespace(line, ARES_TRUE); + ares_buf_consume_whitespace(line, ARES_TRUE); /* pull off fqdn */ - ares__buf_tag(line); - ares__buf_consume_nonwhitespace(line); - if (ares__buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS || + ares_buf_tag(line); + ares_buf_consume_nonwhitespace(line); + if (ares_buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS || ares_strlen(fqdn) == 0) { continue; } /* Validate characterset */ - if (!ares__is_hostname(fqdn)) { + if (!ares_is_hostname(fqdn)) { continue; } *alias = ares_strdup(fqdn); if (*alias == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Good! */ @@ -593,8 +616,8 @@ ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel, status = ARES_ENOTFOUND; done: - ares__buf_destroy(buf); - ares__llist_destroy(lines); + ares_buf_destroy(buf); + ares_array_destroy(lines); return status; } diff --git a/deps/cares/src/lib/ares_send.c b/deps/cares/src/lib/ares_send.c index 54f2b504d50cac..6efa9580b22165 100644 --- a/deps/cares/src/lib/ares_send.c +++ b/deps/cares/src/lib/ares_send.c @@ -25,79 +25,156 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> #endif - #include "ares_nameser.h" -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - static unsigned short generate_unique_qid(ares_channel_t *channel) { unsigned short id; do { - id = ares__generate_new_id(channel->rand_state); - } while (ares__htable_szvp_get(channel->queries_by_qid, id, NULL)); + id = ares_generate_new_id(channel->rand_state); + } while (ares_htable_szvp_get(channel->queries_by_qid, id, NULL)); return id; } -static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel, - const ares_dns_record_t *dnsrec, - ares_callback_dnsrec callback, - void *arg, unsigned short *qid) +/* https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 */ +static ares_status_t ares_apply_dns0x20(ares_channel_t *channel, + ares_dns_record_t *dnsrec) +{ + ares_status_t status = ARES_SUCCESS; + const char *name = NULL; + char dns0x20name[256]; + unsigned char randdata[256 / 8]; + size_t len; + size_t remaining_bits; + size_t total_bits; + size_t i; + + status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL); + if (status != ARES_SUCCESS) { + goto done; + } + + len = ares_strlen(name); + if (len == 0) { + return ARES_SUCCESS; + } + + if (len >= sizeof(dns0x20name)) { + status = ARES_EBADNAME; + goto done; + } + + memset(dns0x20name, 0, sizeof(dns0x20name)); + + /* Fetch the minimum amount of random data we'd need for the string, which + * is 1 bit per byte */ + total_bits = ((len + 7) / 8) * 8; + remaining_bits = total_bits; + ares_rand_bytes(channel->rand_state, randdata, total_bits / 8); + + /* Randomly apply 0x20 to name */ + for (i = 0; i < len; i++) { + size_t bit; + + /* Only apply 0x20 to alpha characters */ + if (!ares_isalpha(name[i])) { + dns0x20name[i] = name[i]; + continue; + } + + /* coin flip */ + bit = total_bits - remaining_bits; + if (randdata[bit / 8] & (1 << (bit % 8))) { + dns0x20name[i] = name[i] | 0x20; /* Set 0x20 */ + } else { + dns0x20name[i] = (char)(((unsigned char)name[i]) & 0xDF); /* Unset 0x20 */ + } + remaining_bits--; + } + + status = ares_dns_record_query_set_name(dnsrec, 0, dns0x20name); + +done: + return status; +} + +ares_status_t ares_send_nolock(ares_channel_t *channel, ares_server_t *server, + ares_send_flags_t flags, + const ares_dns_record_t *dnsrec, + ares_callback_dnsrec callback, void *arg, + unsigned short *qid) { - struct query *query; - size_t packetsz; - struct timeval now = ares__tvnow(); + ares_query_t *query; + ares_timeval_t now; ares_status_t status; unsigned short id = generate_unique_qid(channel); const ares_dns_record_t *dnsrec_resp = NULL; - if (ares__slist_len(channel->servers) == 0) { + ares_tvnow(&now); + + if (ares_slist_len(channel->servers) == 0) { callback(arg, ARES_ENOSERVER, 0, NULL); return ARES_ENOSERVER; } - /* Check query cache */ - status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp); - if (status != ARES_ENOTFOUND) { - /* ARES_SUCCESS means we retrieved the cache, anything else is a critical - * failure, all result in termination */ - callback(arg, status, 0, dnsrec_resp); - return status; + if (!(flags & ARES_SEND_FLAG_NOCACHE)) { + /* Check query cache */ + status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp); + if (status != ARES_ENOTFOUND) { + /* ARES_SUCCESS means we retrieved the cache, anything else is a critical + * failure, all result in termination */ + callback(arg, status, 0, dnsrec_resp); + return status; + } } /* Allocate space for query and allocated fields. */ - query = ares_malloc(sizeof(struct query)); + query = ares_malloc(sizeof(ares_query_t)); if (!query) { - callback(arg, ARES_ENOMEM, 0, NULL); - return ARES_ENOMEM; + callback(arg, ARES_ENOMEM, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } memset(query, 0, sizeof(*query)); - query->channel = channel; + query->channel = channel; + query->qid = id; + query->timeout.sec = 0; + query->timeout.usec = 0; + query->using_tcp = + (channel->flags & ARES_FLAG_USEVC) ? ARES_TRUE : ARES_FALSE; - status = ares_dns_write(dnsrec, &query->qbuf, &query->qlen); + /* Duplicate Query */ + status = ares_dns_record_duplicate_ex(&query->query, dnsrec); if (status != ARES_SUCCESS) { + /* Sometimes we might get a EBADRESP response from duplicate due to + * the way it works (write and parse), rewrite it to EBADQUERY. */ + if (status == ARES_EBADRESP) { + status = ARES_EBADQUERY; + } ares_free(query); callback(arg, status, 0, NULL); return status; } - query->qid = id; - query->timeout.tv_sec = 0; - query->timeout.tv_usec = 0; - - /* Ignore first 2 bytes, assign our own query id */ - query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF); - query->qbuf[1] = (unsigned char)(id & 0xFF); + ares_dns_record_set_id(query->query, id); + + if (channel->flags & ARES_FLAG_DNS0x20 && !query->using_tcp) { + status = ares_apply_dns0x20(channel, query->query); + if (status != ARES_SUCCESS) { + /* LCOV_EXCL_START: OutOfMemory */ + callback(arg, status, 0, NULL); + ares_free_query(query); + return status; + /* LCOV_EXCL_STOP */ + } + } /* Fill in query arguments. */ query->callback = callback; @@ -106,9 +183,9 @@ static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel, /* Initialize query status. */ query->try_count = 0; - packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ; - query->using_tcp = - (channel->flags & ARES_FLAG_USEVC) || query->qlen > packetsz; + if (flags & ARES_SEND_FLAG_NORETRY) { + query->no_retries = ARES_TRUE; + } query->error_status = ARES_SUCCESS; query->timeouts = 0; @@ -118,26 +195,29 @@ static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel, query->node_queries_to_conn = NULL; /* Chain the query into the list of all queries. */ - query->node_all_queries = - ares__llist_insert_last(channel->all_queries, query); + query->node_all_queries = ares_llist_insert_last(channel->all_queries, query); if (query->node_all_queries == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ callback(arg, ARES_ENOMEM, 0, NULL); - ares__free_query(query); + ares_free_query(query); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } /* Keep track of queries bucketed by qid, so we can process DNS * responses quickly. */ - if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) { + if (!ares_htable_szvp_insert(channel->queries_by_qid, query->qid, query)) { + /* LCOV_EXCL_START: OutOfMemory */ callback(arg, ARES_ENOMEM, 0, NULL); - ares__free_query(query); + ares_free_query(query); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } /* Perform the first query action. */ - status = ares__send_query(query, &now); + status = ares_send_query(server, query, &now); if (status == ARES_SUCCESS && qid) { *qid = id; } @@ -152,14 +232,14 @@ ares_status_t ares_send_dnsrec(ares_channel_t *channel, ares_status_t status; if (channel == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__channel_lock(channel); + ares_channel_lock(channel); - status = ares_send_dnsrec_int(channel, dnsrec, callback, arg, qid); + status = ares_send_nolock(channel, NULL, 0, dnsrec, callback, arg, qid); - ares__channel_unlock(channel); + ares_channel_unlock(channel); return status; } @@ -187,20 +267,22 @@ void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen, return; } - carg = ares__dnsrec_convert_arg(callback, arg); + carg = ares_dnsrec_convert_arg(callback, arg); if (carg == NULL) { + /* LCOV_EXCL_START: OutOfMemory */ status = ARES_ENOMEM; ares_dns_record_destroy(dnsrec); callback(arg, (int)status, 0, NULL, 0); return; + /* LCOV_EXCL_STOP */ } - ares_send_dnsrec(channel, dnsrec, ares__dnsrec_convert_cb, carg, NULL); + ares_send_dnsrec(channel, dnsrec, ares_dnsrec_convert_cb, carg, NULL); ares_dns_record_destroy(dnsrec); } -size_t ares_queue_active_queries(ares_channel_t *channel) +size_t ares_queue_active_queries(const ares_channel_t *channel) { size_t len; @@ -208,11 +290,11 @@ size_t ares_queue_active_queries(ares_channel_t *channel) return 0; } - ares__channel_lock(channel); + ares_channel_lock(channel); - len = ares__llist_len(channel->all_queries); + len = ares_llist_len(channel->all_queries); - ares__channel_unlock(channel); + ares_channel_unlock(channel); return len; } diff --git a/deps/cares/src/lib/ares_set_socket_functions.c b/deps/cares/src/lib/ares_set_socket_functions.c new file mode 100644 index 00000000000000..9994e81df51844 --- /dev/null +++ b/deps/cares/src/lib/ares_set_socket_functions.c @@ -0,0 +1,590 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#ifdef HAVE_SYS_UIO_H +# include <sys/uio.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETINET_TCP_H +# include <netinet/tcp.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif +#ifdef NETWARE +# include <sys/filio.h> +#endif + +#include <assert.h> +#include <fcntl.h> +#include <limits.h> + + +#if defined(__linux__) && defined(TCP_FASTOPEN_CONNECT) +# define TFO_SUPPORTED 1 +# define TFO_SKIP_CONNECT 0 +# define TFO_USE_SENDTO 0 +# define TFO_USE_CONNECTX 0 +# define TFO_CLIENT_SOCKOPT TCP_FASTOPEN_CONNECT +#elif (defined(__MidnightBSD__) || defined(__FreeBSD__)) && defined(TCP_FASTOPEN) +# define TFO_SUPPORTED 1 +# define TFO_SKIP_CONNECT 1 +# define TFO_USE_SENDTO 1 +# define TFO_USE_CONNECTX 0 +# define TFO_CLIENT_SOCKOPT TCP_FASTOPEN +#elif defined(__APPLE__) && defined(HAVE_CONNECTX) +# define TFO_SUPPORTED 1 +# define TFO_SKIP_CONNECT 0 +# define TFO_USE_SENDTO 0 +# define TFO_USE_CONNECTX 1 +# undef TFO_CLIENT_SOCKOPT +#else +# define TFO_SUPPORTED 0 +#endif + +#ifndef HAVE_WRITEV +/* Structure for scatter/gather I/O. */ +struct iovec { + void *iov_base; /* Pointer to data. */ + size_t iov_len; /* Length of data. */ +}; +#endif + +ares_status_t + ares_set_socket_functions_ex(ares_channel_t *channel, + const struct ares_socket_functions_ex *funcs, + void *user_data) +{ + unsigned int known_versions[] = { 1 }; + size_t i; + + if (channel == NULL || funcs == NULL) { + return ARES_EFORMERR; + } + + /* Check to see if we know the version referenced */ + for (i = 0; i < sizeof(known_versions) / sizeof(*known_versions); i++) { + if (funcs->version == known_versions[i]) { + break; + } + } + if (i == sizeof(known_versions) / sizeof(*known_versions)) { + return ARES_EFORMERR; + } + + memset(&channel->sock_funcs, 0, sizeof(channel->sock_funcs)); + + /* Copy individually for ABI compliance. memcpy() with a sizeof would do + * invalid reads */ + if (funcs->version >= 1) { + if (funcs->asocket == NULL || funcs->aclose == NULL || + funcs->asetsockopt == NULL || funcs->aconnect == NULL || + funcs->arecvfrom == NULL || funcs->asendto == NULL) { + return ARES_EFORMERR; + } + channel->sock_funcs.version = funcs->version; + channel->sock_funcs.flags = funcs->flags; + channel->sock_funcs.asocket = funcs->asocket; + channel->sock_funcs.aclose = funcs->aclose; + channel->sock_funcs.asetsockopt = funcs->asetsockopt; + channel->sock_funcs.aconnect = funcs->aconnect; + channel->sock_funcs.arecvfrom = funcs->arecvfrom; + channel->sock_funcs.asendto = funcs->asendto; + channel->sock_funcs.agetsockname = funcs->agetsockname; + channel->sock_funcs.abind = funcs->abind; + channel->sock_funcs.aif_nametoindex = funcs->aif_nametoindex; + channel->sock_funcs.aif_indextoname = funcs->aif_indextoname; + } + + /* Implement newer versions here ...*/ + + + channel->sock_func_cb_data = user_data; + + return ARES_SUCCESS; +} + +static int setsocknonblock(ares_socket_t sockfd, /* operate on this */ + int nonblock /* TRUE or FALSE */) +{ +#if defined(HAVE_FCNTL_O_NONBLOCK) + + /* most recent unix versions */ + int flags; + flags = fcntl(sockfd, F_GETFL, 0); + if (nonblock) { + return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); + } else { + return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */ + } + +#elif defined(HAVE_IOCTL_FIONBIO) + + /* older unix versions */ + int flags = nonblock ? 1 : 0; + return ioctl(sockfd, FIONBIO, &flags); + +#elif defined(HAVE_IOCTLSOCKET_FIONBIO) + +# ifdef WATT32 + char flags = nonblock ? 1 : 0; +# else + /* Windows */ + unsigned long flags = nonblock ? 1UL : 0UL; +# endif + return ioctlsocket(sockfd, (long)FIONBIO, &flags); + +#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) + + /* Amiga */ + long flags = nonblock ? 1L : 0L; + return IoctlSocket(sockfd, FIONBIO, flags); + +#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) + + /* BeOS */ + long b = nonblock ? 1L : 0L; + return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); + +#else +# error "no non-blocking method was found/used/set" +#endif +} + +static int default_aclose(ares_socket_t sock, void *user_data) +{ + (void)user_data; + +#if defined(HAVE_CLOSESOCKET) + return closesocket(sock); +#elif defined(HAVE_CLOSESOCKET_CAMEL) + return CloseSocket(sock); +#elif defined(HAVE_CLOSE_S) + return close_s(sock); +#else + return close(sock); +#endif +} + +static ares_socket_t default_asocket(int domain, int type, int protocol, + void *user_data) +{ + ares_socket_t s; + (void)user_data; + + s = socket(domain, type, protocol); + if (s == ARES_SOCKET_BAD) { + return s; + } + + if (setsocknonblock(s, 1) != 0) { + goto fail; /* LCOV_EXCL_LINE */ + } + +#if defined(FD_CLOEXEC) && !defined(MSDOS) + /* Configure the socket fd as close-on-exec. */ + if (fcntl(s, F_SETFD, FD_CLOEXEC) != 0) { + goto fail; /* LCOV_EXCL_LINE */ + } +#endif + + /* No need to emit SIGPIPE on socket errors */ +#if defined(SO_NOSIGPIPE) + { + int opt = 1; + (void)setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, (void *)&opt, sizeof(opt)); + } +#endif + + + if (type == SOCK_STREAM) { + int opt = 1; + +#ifdef TCP_NODELAY + /* + * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not + * in configure_socket). In general, in DNS lookups we're pretty much + * interested in firing off a single request and then waiting for a reply, + * so batching isn't very interesting. + */ + if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt)) != + 0) { + goto fail; + } +#endif + } + +#if defined(IPV6_V6ONLY) && defined(USE_WINSOCK) + /* Support for IPv4-mapped IPv6 addresses. + * Linux kernel, NetBSD, FreeBSD and Darwin: default is off; + * Windows Vista and later: default is on; + * DragonFly BSD: acts like off, and dummy setting; + * OpenBSD and earlier Windows: unsupported. + * Linux: controlled by /proc/sys/net/ipv6/bindv6only. + */ + if (domain == PF_INET6) { + int on = 0; + (void)setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on)); + } +#endif + + return s; + +fail: + default_aclose(s, user_data); + return ARES_SOCKET_BAD; +} + +static int default_asetsockopt(ares_socket_t sock, ares_socket_opt_t opt, + const void *val, ares_socklen_t val_size, + void *user_data) +{ + switch (opt) { + case ARES_SOCKET_OPT_SENDBUF_SIZE: + if (val_size != sizeof(int)) { + SET_SOCKERRNO(EINVAL); + return -1; + } + return setsockopt(sock, SOL_SOCKET, SO_SNDBUF, val, val_size); + + case ARES_SOCKET_OPT_RECVBUF_SIZE: + if (val_size != sizeof(int)) { + SET_SOCKERRNO(EINVAL); + return -1; + } + return setsockopt(sock, SOL_SOCKET, SO_RCVBUF, val, val_size); + + case ARES_SOCKET_OPT_BIND_DEVICE: + /* Count the number of characters before NULL terminator then + * validate those are all printable */ + if (!ares_str_isprint(val, ares_strnlen(val, (size_t)val_size))) { + SET_SOCKERRNO(EINVAL); + return -1; + } +#ifdef SO_BINDTODEVICE + return setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, val, val_size); +#else + SET_SOCKERRNO(ENOSYS); + return -1; +#endif + + case ARES_SOCKET_OPT_TCP_FASTOPEN: + if (val_size != sizeof(ares_bool_t)) { + SET_SOCKERRNO(EINVAL); + return -1; + } +#if defined(TFO_CLIENT_SOCKOPT) + { + int oval; + const ares_bool_t *pval = val; + oval = (int)*pval; + return setsockopt(sock, IPPROTO_TCP, TFO_CLIENT_SOCKOPT, (void *)&oval, + sizeof(oval)); + } +#elif TFO_SUPPORTED + return 0; +#else + SET_SOCKERRNO(ENOSYS); + return -1; +#endif + } + + (void)user_data; + SET_SOCKERRNO(ENOSYS); + return -1; +} + +static int default_aconnect(ares_socket_t sock, const struct sockaddr *address, + ares_socklen_t address_len, unsigned int flags, + void *user_data) +{ + (void)user_data; + +#if defined(TFO_SKIP_CONNECT) && TFO_SKIP_CONNECT + if (flags & ARES_SOCKET_CONN_TCP_FASTOPEN) { + return 0; + } + return connect(sock, address, address_len); +#elif defined(TFO_USE_CONNECTX) && TFO_USE_CONNECTX + if (flags & ARES_SOCKET_CONN_TCP_FASTOPEN) { + sa_endpoints_t endpoints; + + memset(&endpoints, 0, sizeof(endpoints)); + endpoints.sae_dstaddr = address; + endpoints.sae_dstaddrlen = address_len; + + return connectx(sock, &endpoints, SAE_ASSOCID_ANY, + CONNECT_DATA_IDEMPOTENT | CONNECT_RESUME_ON_READ_WRITE, + NULL, 0, NULL, NULL); + } else { + return connect(sock, address, address_len); + } +#else + (void)flags; + return connect(sock, address, address_len); +#endif +} + +static ares_ssize_t default_arecvfrom(ares_socket_t sock, void *buffer, + size_t length, int flags, + struct sockaddr *address, + ares_socklen_t *address_len, + void *user_data) +{ + (void)user_data; + +#ifdef HAVE_RECVFROM + return (ares_ssize_t)recvfrom(sock, buffer, (RECVFROM_TYPE_ARG3)length, flags, + address, address_len); +#else + if (address != NULL && address_len != NULL) { + memset(address, 0, (size_t)*address_len); + address->sa_family = AF_UNSPEC; + } + return (ares_ssize_t)recv(sock, buffer, (RECVFROM_TYPE_ARG3)length, flags); +#endif +} + +static ares_ssize_t default_asendto(ares_socket_t sock, const void *buffer, + size_t length, int flags, + const struct sockaddr *address, + ares_socklen_t address_len, void *user_data) +{ + (void)user_data; + + if (address != NULL) { +#ifdef HAVE_SENDTO + return (ares_ssize_t)sendto((SEND_TYPE_ARG1)sock, (SEND_TYPE_ARG2)buffer, + (SEND_TYPE_ARG3)length, (SEND_TYPE_ARG4)flags, + address, address_len); +#else + (void)address_len; +#endif + } + + return (ares_ssize_t)send((SEND_TYPE_ARG1)sock, (SEND_TYPE_ARG2)buffer, + (SEND_TYPE_ARG3)length, (SEND_TYPE_ARG4)flags); +} + +static int default_agetsockname(ares_socket_t sock, struct sockaddr *address, + ares_socklen_t *address_len, void *user_data) +{ + (void)user_data; + return getsockname(sock, address, address_len); +} + +static int default_abind(ares_socket_t sock, unsigned int flags, + const struct sockaddr *address, socklen_t address_len, + void *user_data) +{ + (void)user_data; + +#ifdef IP_BIND_ADDRESS_NO_PORT + if (flags & ARES_SOCKET_BIND_TCP && flags & ARES_SOCKET_BIND_CLIENT) { + int opt = 1; + (void)setsockopt(sock, SOL_IP, IP_BIND_ADDRESS_NO_PORT, &opt, sizeof(opt)); + } +#else + (void)flags; +#endif + + return bind(sock, address, address_len); +} + +static unsigned int default_aif_nametoindex(const char *ifname, void *user_data) +{ + (void)user_data; + return ares_os_if_nametoindex(ifname); +} + +static const char *default_aif_indextoname(unsigned int ifindex, + char *ifname_buf, + size_t ifname_buf_len, + void *user_data) +{ + (void)user_data; + return ares_os_if_indextoname(ifindex, ifname_buf, ifname_buf_len); +} + +static const struct ares_socket_functions_ex default_socket_functions = { + 1, + ARES_SOCKFUNC_FLAG_NONBLOCKING, + default_asocket, + default_aclose, + default_asetsockopt, + default_aconnect, + default_arecvfrom, + default_asendto, + default_agetsockname, + default_abind, + default_aif_nametoindex, + default_aif_indextoname +}; + +void ares_set_socket_functions_def(ares_channel_t *channel) +{ + ares_set_socket_functions_ex(channel, &default_socket_functions, NULL); +} + +static int legacycb_aclose(ares_socket_t sock, void *user_data) +{ + ares_channel_t *channel = user_data; + + if (channel->legacy_sock_funcs != NULL && + channel->legacy_sock_funcs->aclose != NULL) { + return channel->legacy_sock_funcs->aclose( + sock, channel->legacy_sock_funcs_cb_data); + } + + return default_aclose(sock, NULL); +} + +static ares_socket_t legacycb_asocket(int domain, int type, int protocol, + void *user_data) +{ + ares_channel_t *channel = user_data; + + if (channel->legacy_sock_funcs != NULL && + channel->legacy_sock_funcs->asocket != NULL) { + return channel->legacy_sock_funcs->asocket( + domain, type, protocol, channel->legacy_sock_funcs_cb_data); + } + + return default_asocket(domain, type, protocol, NULL); +} + +static int legacycb_asetsockopt(ares_socket_t sock, ares_socket_opt_t opt, + const void *val, ares_socklen_t val_size, + void *user_data) +{ + (void)sock; + (void)opt; + (void)val; + (void)val_size; + (void)user_data; + SET_SOCKERRNO(ENOSYS); + return -1; +} + +static int legacycb_aconnect(ares_socket_t sock, const struct sockaddr *address, + ares_socklen_t address_len, unsigned int flags, + void *user_data) +{ + ares_channel_t *channel = user_data; + + if (channel->legacy_sock_funcs != NULL && + channel->legacy_sock_funcs->aconnect != NULL) { + return channel->legacy_sock_funcs->aconnect( + sock, address, address_len, channel->legacy_sock_funcs_cb_data); + } + + return default_aconnect(sock, address, address_len, flags, NULL); +} + +static ares_ssize_t legacycb_arecvfrom(ares_socket_t sock, void *buffer, + size_t length, int flags, + struct sockaddr *address, + ares_socklen_t *address_len, + void *user_data) +{ + ares_channel_t *channel = user_data; + + if (channel->legacy_sock_funcs != NULL && + channel->legacy_sock_funcs->arecvfrom != NULL) { + if (address != NULL && address_len != NULL) { + memset(address, 0, (size_t)*address_len); + address->sa_family = AF_UNSPEC; + } + return channel->legacy_sock_funcs->arecvfrom( + sock, buffer, length, flags, address, address_len, + channel->legacy_sock_funcs_cb_data); + } + + return default_arecvfrom(sock, buffer, length, flags, address, address_len, + NULL); +} + +static ares_ssize_t legacycb_asendto(ares_socket_t sock, const void *buffer, + size_t length, int flags, + const struct sockaddr *address, + ares_socklen_t address_len, + void *user_data) +{ + ares_channel_t *channel = user_data; + + if (channel->legacy_sock_funcs != NULL && + channel->legacy_sock_funcs->asendv != NULL) { + struct iovec vec; + vec.iov_base = (void *)((size_t)buffer); /* Cast off const */ + vec.iov_len = length; + return channel->legacy_sock_funcs->asendv( + sock, &vec, 1, channel->legacy_sock_funcs_cb_data); + } + + return default_asendto(sock, buffer, length, flags, address, address_len, + NULL); +} + + +static const struct ares_socket_functions_ex legacy_socket_functions = { + 1, + 0, + legacycb_asocket, + legacycb_aclose, + legacycb_asetsockopt, + legacycb_aconnect, + legacycb_arecvfrom, + legacycb_asendto, + NULL, /* agetsockname */ + NULL, /* abind */ + NULL, /* aif_nametoindex */ + NULL /* aif_indextoname */ +}; + +void ares_set_socket_functions(ares_channel_t *channel, + const struct ares_socket_functions *funcs, + void *data) +{ + if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) { + return; + } + + channel->legacy_sock_funcs = funcs; + channel->legacy_sock_funcs_cb_data = data; + ares_set_socket_functions_ex(channel, &legacy_socket_functions, channel); +} diff --git a/deps/cares/src/lib/ares_setup.h b/deps/cares/src/lib/ares_setup.h index 0387f3e35f7577..8890c3c338bf15 100644 --- a/deps/cares/src/lib/ares_setup.h +++ b/deps/cares/src/lib/ares_setup.h @@ -23,17 +23,17 @@ * * SPDX-License-Identifier: MIT */ -#ifndef HEADER_CARES_SETUP_H -#define HEADER_CARES_SETUP_H - -/* - * Define WIN32 when build target is Win32 API +#ifndef __ARES_SETUP_H +#define __ARES_SETUP_H + +/* ============================================================================ + * NOTE: This file is automatically included by ares_private.h and should not + * typically be included directly. + * All c-ares source files should include ares_private.h as the + * first header. + * ============================================================================ */ -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) -# define WIN32 -#endif - /* * Include configuration script results or hand-crafted * configuration file for platforms which lack config tool. @@ -42,62 +42,17 @@ #ifdef HAVE_CONFIG_H # include "ares_config.h" #else - -# ifdef WIN32 +# ifdef _WIN32 # include "config-win32.h" # endif - #endif /* HAVE_CONFIG_H */ -/* ================================================================ */ -/* Definition of preprocessor macros/symbols which modify compiler */ -/* behaviour or generated code characteristics must be done here, */ -/* as appropriate, before any system header file is included. It is */ -/* also possible to have them defined in the config file included */ -/* before this point. As a result of all this we frown inclusion of */ -/* system header files in our config files, avoid this at any cost. */ -/* ================================================================ */ - -/* - * AIX 4.3 and newer needs _THREAD_SAFE defined to build - * proper reentrant code. Others may also need it. - */ - -#ifdef NEED_THREAD_SAFE -# ifndef _THREAD_SAFE -# define _THREAD_SAFE -# endif -#endif - -/* - * Tru64 needs _REENTRANT set for a few function prototypes and - * things to appear in the system header files. Unixware needs it - * to build proper reentrant code. Others may also need it. - */ - -#ifdef NEED_REENTRANT -# ifndef _REENTRANT -# define _REENTRANT -# endif -#endif - -/* ================================================================ */ -/* If you need to include a system header file for your platform, */ -/* please, do it beyond the point further indicated in this file. */ -/* ================================================================ */ - /* * c-ares external interface definitions are also used internally, * and might also include required system header files to define them. */ -#include <ares_build.h> - -/* - * Compile time sanity checks must also be done when building the library. - */ - -#include <ares_rules.h> +#include "ares_build.h" /* ================================================================= */ /* No system header file shall be included in this file before this */ @@ -115,6 +70,10 @@ * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined. */ +#ifdef USE_WINSOCK +# undef USE_WINSOCK +#endif + #ifdef HAVE_WINDOWS_H # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN @@ -122,52 +81,56 @@ # include <windows.h> # ifdef HAVE_WINSOCK2_H # include <winsock2.h> +# define USE_WINSOCK 2 # ifdef HAVE_WS2TCPIP_H # include <ws2tcpip.h> # endif # else # ifdef HAVE_WINSOCK_H # include <winsock.h> +# define USE_WINSOCK 1 # endif # endif #endif -/* - * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else - * define USE_WINSOCK to 1 if we have and use WINSOCK API, else - * undefine USE_WINSOCK. - */ -#ifdef USE_WINSOCK -# undef USE_WINSOCK +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> + +#ifdef HAVE_ERRNO_H +# include <errno.h> #endif -#ifdef HAVE_WINSOCK2_H -# define USE_WINSOCK 2 -#else -# ifdef HAVE_WINSOCK_H -# define USE_WINSOCK 1 -# endif + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> #endif -/* - * Work-arounds for systems without configure support - */ +#ifdef HAVE_MALLOC_H +# include <malloc.h> +#endif -#ifndef HAVE_CONFIG_H +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif -# if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) -# define HAVE_SYS_TIME_H -# endif +#ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +#endif -# if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) -# define HAVE_UNISTD_H 1 -# endif +#ifdef HAVE_TIME_H +# include <time.h> +#endif -# if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) -# define HAVE_SYS_UIO_H -# endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif -#endif /* HAVE_CONFIG_H */ +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif /* * Arg 2 type for gethostname in case it hasn't been defined in config file. @@ -235,12 +198,27 @@ # endif #endif + +/* Definition of timeval struct for platforms that don't have it. */ + +#ifndef HAVE_STRUCT_TIMEVAL +struct timeval { + ares_int64_t tv_sec; + long tv_usec; +}; +#endif + + /* - * Include macros and defines that should only be processed once. + * Macro used to include code only in debug builds. */ -#ifndef __SETUP_ONCE_H -# include "setup_once.h" +#ifdef DEBUGBUILD +# define DEBUGF(x) x +#else +# define DEBUGF(x) \ + do { \ + } while (0) #endif -#endif /* HEADER_CARES_SETUP_H */ +#endif /* __ARES_SETUP_H */ diff --git a/deps/cares/src/lib/ares_socket.c b/deps/cares/src/lib/ares_socket.c new file mode 100644 index 00000000000000..516852a84abfb8 --- /dev/null +++ b/deps/cares/src/lib/ares_socket.c @@ -0,0 +1,425 @@ +/* MIT License + * + * Copyright (c) Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#ifdef HAVE_SYS_UIO_H +# include <sys/uio.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETINET_TCP_H +# include <netinet/tcp.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif +#ifdef NETWARE +# include <sys/filio.h> +#endif + +#include <assert.h> +#include <fcntl.h> +#include <limits.h> + +static ares_conn_err_t ares_socket_deref_error(int err) +{ + switch (err) { +#if defined(EWOULDBLOCK) + case EWOULDBLOCK: + return ARES_CONN_ERR_WOULDBLOCK; +#endif +#if defined(EAGAIN) && (!defined(EWOULDBLOCK) || EAGAIN != EWOULDBLOCK) + case EAGAIN: + return ARES_CONN_ERR_WOULDBLOCK; +#endif + case EINPROGRESS: + return ARES_CONN_ERR_WOULDBLOCK; + case ENETDOWN: + return ARES_CONN_ERR_NETDOWN; + case ENETUNREACH: + return ARES_CONN_ERR_NETUNREACH; + case ECONNABORTED: + return ARES_CONN_ERR_CONNABORTED; + case ECONNRESET: + return ARES_CONN_ERR_CONNRESET; + case ECONNREFUSED: + return ARES_CONN_ERR_CONNREFUSED; + case ETIMEDOUT: + return ARES_CONN_ERR_CONNTIMEDOUT; + case EHOSTDOWN: + return ARES_CONN_ERR_HOSTDOWN; + case EHOSTUNREACH: + return ARES_CONN_ERR_HOSTUNREACH; + case EINTR: + return ARES_CONN_ERR_INTERRUPT; + case EAFNOSUPPORT: + return ARES_CONN_ERR_AFNOSUPPORT; + case EADDRNOTAVAIL: + return ARES_CONN_ERR_BADADDR; + default: + break; + } + + return ARES_CONN_ERR_FAILURE; +} + +ares_bool_t ares_sockaddr_addr_eq(const struct sockaddr *sa, + const struct ares_addr *aa) +{ + const void *addr1; + const void *addr2; + + if (sa->sa_family == aa->family) { + switch (aa->family) { + case AF_INET: + addr1 = &aa->addr.addr4; + addr2 = &(CARES_INADDR_CAST(const struct sockaddr_in *, sa))->sin_addr; + if (memcmp(addr1, addr2, sizeof(aa->addr.addr4)) == 0) { + return ARES_TRUE; /* match */ + } + break; + case AF_INET6: + addr1 = &aa->addr.addr6; + addr2 = + &(CARES_INADDR_CAST(const struct sockaddr_in6 *, sa))->sin6_addr; + if (memcmp(addr1, addr2, sizeof(aa->addr.addr6)) == 0) { + return ARES_TRUE; /* match */ + } + break; + default: + break; /* LCOV_EXCL_LINE */ + } + } + return ARES_FALSE; /* different */ +} + +ares_conn_err_t ares_socket_write(ares_channel_t *channel, ares_socket_t fd, + const void *data, size_t len, size_t *written, + const struct sockaddr *sa, + ares_socklen_t salen) +{ + int flags = 0; + ares_ssize_t rv; + ares_conn_err_t err = ARES_CONN_ERR_SUCCESS; + +#ifdef HAVE_MSG_NOSIGNAL + flags |= MSG_NOSIGNAL; +#endif + + rv = channel->sock_funcs.asendto(fd, data, len, flags, sa, salen, + channel->sock_func_cb_data); + if (rv <= 0) { + err = ares_socket_deref_error(SOCKERRNO); + } else { + *written = (size_t)rv; + } + return err; +} + +ares_conn_err_t ares_socket_recv(ares_channel_t *channel, ares_socket_t s, + ares_bool_t is_tcp, void *data, + size_t data_len, size_t *read_bytes) +{ + ares_ssize_t rv; + + *read_bytes = 0; + + rv = channel->sock_funcs.arecvfrom(s, data, data_len, 0, NULL, 0, + channel->sock_func_cb_data); + + if (rv > 0) { + *read_bytes = (size_t)rv; + return ARES_CONN_ERR_SUCCESS; + } + + if (rv == 0) { + /* UDP allows 0-byte packets and is connectionless, so this is success */ + if (!is_tcp) { + return ARES_CONN_ERR_SUCCESS; + } else { + return ARES_CONN_ERR_CONNCLOSED; + } + } + + /* If we're here, rv<0 */ + return ares_socket_deref_error(SOCKERRNO); +} + +ares_conn_err_t ares_socket_recvfrom(ares_channel_t *channel, ares_socket_t s, + ares_bool_t is_tcp, void *data, + size_t data_len, int flags, + struct sockaddr *from, + ares_socklen_t *from_len, + size_t *read_bytes) +{ + ares_ssize_t rv; + + rv = channel->sock_funcs.arecvfrom(s, data, data_len, flags, from, from_len, + channel->sock_func_cb_data); + + if (rv > 0) { + *read_bytes = (size_t)rv; + return ARES_CONN_ERR_SUCCESS; + } + + if (rv == 0) { + /* UDP allows 0-byte packets and is connectionless, so this is success */ + if (!is_tcp) { + return ARES_CONN_ERR_SUCCESS; + } else { + return ARES_CONN_ERR_CONNCLOSED; + } + } + + /* If we're here, rv<0 */ + return ares_socket_deref_error(SOCKERRNO); +} + +ares_conn_err_t ares_socket_enable_tfo(const ares_channel_t *channel, + ares_socket_t fd) +{ + ares_bool_t opt = ARES_TRUE; + + if (channel->sock_funcs.asetsockopt(fd, ARES_SOCKET_OPT_TCP_FASTOPEN, + (void *)&opt, sizeof(opt), + channel->sock_func_cb_data) != 0) { + return ARES_CONN_ERR_NOTIMP; + } + + return ARES_CONN_ERR_SUCCESS; +} + +ares_status_t ares_socket_configure(ares_channel_t *channel, int family, + ares_bool_t is_tcp, ares_socket_t fd) +{ + union { + struct sockaddr sa; + struct sockaddr_in sa4; + struct sockaddr_in6 sa6; + } local; + + ares_socklen_t bindlen = 0; + int rv; + unsigned int bind_flags = 0; + + /* Set the socket's send and receive buffer sizes. */ + if (channel->socket_send_buffer_size > 0) { + rv = channel->sock_funcs.asetsockopt( + fd, ARES_SOCKET_OPT_SENDBUF_SIZE, + (void *)&channel->socket_send_buffer_size, + sizeof(channel->socket_send_buffer_size), channel->sock_func_cb_data); + if (rv != 0 && SOCKERRNO != ENOSYS) { + return ARES_ECONNREFUSED; /* LCOV_EXCL_LINE: UntestablePath */ + } + } + + if (channel->socket_receive_buffer_size > 0) { + rv = channel->sock_funcs.asetsockopt( + fd, ARES_SOCKET_OPT_RECVBUF_SIZE, + (void *)&channel->socket_receive_buffer_size, + sizeof(channel->socket_receive_buffer_size), channel->sock_func_cb_data); + if (rv != 0 && SOCKERRNO != ENOSYS) { + return ARES_ECONNREFUSED; /* LCOV_EXCL_LINE: UntestablePath */ + } + } + + /* Bind to network interface if configured */ + if (ares_strlen(channel->local_dev_name)) { + /* Prior versions silently ignored failure, so we need to maintain that + * compatibility */ + (void)channel->sock_funcs.asetsockopt( + fd, ARES_SOCKET_OPT_BIND_DEVICE, channel->local_dev_name, + (ares_socklen_t)ares_strlen(channel->local_dev_name), + channel->sock_func_cb_data); + } + + /* Bind to ip address if configured */ + if (family == AF_INET && channel->local_ip4) { + memset(&local.sa4, 0, sizeof(local.sa4)); + local.sa4.sin_family = AF_INET; + local.sa4.sin_addr.s_addr = htonl(channel->local_ip4); + bindlen = sizeof(local.sa4); + } else if (family == AF_INET6 && + memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8, + sizeof(channel->local_ip6)) != 0) { + /* Only if not link-local and an ip other than "::" is specified */ + memset(&local.sa6, 0, sizeof(local.sa6)); + local.sa6.sin6_family = AF_INET6; + memcpy(&local.sa6.sin6_addr, channel->local_ip6, + sizeof(channel->local_ip6)); + bindlen = sizeof(local.sa6); + } + + + if (bindlen && channel->sock_funcs.abind != NULL) { + bind_flags |= ARES_SOCKET_BIND_CLIENT; + if (is_tcp) { + bind_flags |= ARES_SOCKET_BIND_TCP; + } + if (channel->sock_funcs.abind(fd, bind_flags, &local.sa, bindlen, + channel->sock_func_cb_data) != 0) { + return ARES_ECONNREFUSED; + } + } + + return ARES_SUCCESS; +} + +ares_bool_t ares_sockaddr_to_ares_addr(struct ares_addr *ares_addr, + unsigned short *port, + const struct sockaddr *sockaddr) +{ + if (sockaddr->sa_family == AF_INET) { + /* NOTE: memcpy sockaddr_in due to alignment issues found by UBSAN due to + * dnsinfo packing on MacOS */ + struct sockaddr_in sockaddr_in; + memcpy(&sockaddr_in, sockaddr, sizeof(sockaddr_in)); + + ares_addr->family = AF_INET; + memcpy(&ares_addr->addr.addr4, &(sockaddr_in.sin_addr), + sizeof(ares_addr->addr.addr4)); + + if (port) { + *port = ntohs(sockaddr_in.sin_port); + } + return ARES_TRUE; + } + + if (sockaddr->sa_family == AF_INET6) { + /* NOTE: memcpy sockaddr_in6 due to alignment issues found by UBSAN due to + * dnsinfo packing on MacOS */ + struct sockaddr_in6 sockaddr_in6; + memcpy(&sockaddr_in6, sockaddr, sizeof(sockaddr_in6)); + + ares_addr->family = AF_INET6; + memcpy(&ares_addr->addr.addr6, &(sockaddr_in6.sin6_addr), + sizeof(ares_addr->addr.addr6)); + if (port) { + *port = ntohs(sockaddr_in6.sin6_port); + } + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_conn_err_t ares_socket_open(ares_socket_t *sock, ares_channel_t *channel, + int af, int type, int protocol) +{ + ares_socket_t s; + + *sock = ARES_SOCKET_BAD; + + s = + channel->sock_funcs.asocket(af, type, protocol, channel->sock_func_cb_data); + + if (s == ARES_SOCKET_BAD) { + return ares_socket_deref_error(SOCKERRNO); + } + + *sock = s; + + return ARES_CONN_ERR_SUCCESS; +} + +ares_conn_err_t ares_socket_connect(ares_channel_t *channel, + ares_socket_t sockfd, ares_bool_t is_tfo, + const struct sockaddr *addr, + ares_socklen_t addrlen) +{ + ares_conn_err_t err = ARES_CONN_ERR_SUCCESS; + unsigned int flags = 0; + + if (is_tfo) { + flags |= ARES_SOCKET_CONN_TCP_FASTOPEN; + } + + do { + int rv; + + rv = channel->sock_funcs.aconnect(sockfd, addr, addrlen, flags, + channel->sock_func_cb_data); + + if (rv < 0) { + err = ares_socket_deref_error(SOCKERRNO); + } else { + err = ARES_CONN_ERR_SUCCESS; + } + } while (err == ARES_CONN_ERR_INTERRUPT); + + return err; +} + +void ares_socket_close(ares_channel_t *channel, ares_socket_t s) +{ + if (channel == NULL || s == ARES_SOCKET_BAD) { + return; + } + + channel->sock_funcs.aclose(s, channel->sock_func_cb_data); +} + +void ares_set_socket_callback(ares_channel_t *channel, + ares_sock_create_callback cb, void *data) +{ + if (channel == NULL) { + return; + } + channel->sock_create_cb = cb; + channel->sock_create_cb_data = data; +} + +void ares_set_socket_configure_callback(ares_channel_t *channel, + ares_sock_config_callback cb, + void *data) +{ + if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) { + return; + } + channel->sock_config_cb = cb; + channel->sock_config_cb_data = data; +} + +void ares_set_pending_write_cb(ares_channel_t *channel, + ares_pending_write_cb callback, void *user_data) +{ + if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) { + return; + } + channel->notify_pending_write_cb = callback; + channel->notify_pending_write_cb_data = user_data; +} diff --git a/deps/cares/src/lib/ares_socket.h b/deps/cares/src/lib/ares_socket.h new file mode 100644 index 00000000000000..24a99ab3316943 --- /dev/null +++ b/deps/cares/src/lib/ares_socket.h @@ -0,0 +1,163 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef __ARES_SOCKET_H +#define __ARES_SOCKET_H + +/* Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno + * (or equivalent) on this platform to hide platform details to code using it. + */ +#ifdef USE_WINSOCK +# define SOCKERRNO ((int)WSAGetLastError()) +# define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) +#else +# define SOCKERRNO (errno) +# define SET_SOCKERRNO(x) (errno = (x)) +#endif + +/* Portable error number symbolic names defined to Winsock error codes. */ +#ifdef USE_WINSOCK +# undef EBADF /* override definition in errno.h */ +# define EBADF WSAEBADF +# undef EINTR /* override definition in errno.h */ +# define EINTR WSAEINTR +# undef EINVAL /* override definition in errno.h */ +# define EINVAL WSAEINVAL +# undef EWOULDBLOCK /* override definition in errno.h */ +# define EWOULDBLOCK WSAEWOULDBLOCK +# undef EINPROGRESS /* override definition in errno.h */ +# define EINPROGRESS WSAEINPROGRESS +# undef EALREADY /* override definition in errno.h */ +# define EALREADY WSAEALREADY +# undef ENOTSOCK /* override definition in errno.h */ +# define ENOTSOCK WSAENOTSOCK +# undef EDESTADDRREQ /* override definition in errno.h */ +# define EDESTADDRREQ WSAEDESTADDRREQ +# undef EMSGSIZE /* override definition in errno.h */ +# define EMSGSIZE WSAEMSGSIZE +# undef EPROTOTYPE /* override definition in errno.h */ +# define EPROTOTYPE WSAEPROTOTYPE +# undef ENOPROTOOPT /* override definition in errno.h */ +# define ENOPROTOOPT WSAENOPROTOOPT +# undef EPROTONOSUPPORT /* override definition in errno.h */ +# define EPROTONOSUPPORT WSAEPROTONOSUPPORT +# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT +# undef EOPNOTSUPP /* override definition in errno.h */ +# define EOPNOTSUPP WSAEOPNOTSUPP +# undef ENOSYS /* override definition in errno.h */ +# define ENOSYS WSAEOPNOTSUPP +# define EPFNOSUPPORT WSAEPFNOSUPPORT +# undef EAFNOSUPPORT /* override definition in errno.h */ +# define EAFNOSUPPORT WSAEAFNOSUPPORT +# undef EADDRINUSE /* override definition in errno.h */ +# define EADDRINUSE WSAEADDRINUSE +# undef EADDRNOTAVAIL /* override definition in errno.h */ +# define EADDRNOTAVAIL WSAEADDRNOTAVAIL +# undef ENETDOWN /* override definition in errno.h */ +# define ENETDOWN WSAENETDOWN +# undef ENETUNREACH /* override definition in errno.h */ +# define ENETUNREACH WSAENETUNREACH +# undef ENETRESET /* override definition in errno.h */ +# define ENETRESET WSAENETRESET +# undef ECONNABORTED /* override definition in errno.h */ +# define ECONNABORTED WSAECONNABORTED +# undef ECONNRESET /* override definition in errno.h */ +# define ECONNRESET WSAECONNRESET +# undef ENOBUFS /* override definition in errno.h */ +# define ENOBUFS WSAENOBUFS +# undef EISCONN /* override definition in errno.h */ +# define EISCONN WSAEISCONN +# undef ENOTCONN /* override definition in errno.h */ +# define ENOTCONN WSAENOTCONN +# define ESHUTDOWN WSAESHUTDOWN +# define ETOOMANYREFS WSAETOOMANYREFS +# undef ETIMEDOUT /* override definition in errno.h */ +# define ETIMEDOUT WSAETIMEDOUT +# undef ECONNREFUSED /* override definition in errno.h */ +# define ECONNREFUSED WSAECONNREFUSED +# undef ELOOP /* override definition in errno.h */ +# define ELOOP WSAELOOP +# ifndef ENAMETOOLONG /* possible previous definition in errno.h */ +# define ENAMETOOLONG WSAENAMETOOLONG +# endif +# define EHOSTDOWN WSAEHOSTDOWN +# undef EHOSTUNREACH /* override definition in errno.h */ +# define EHOSTUNREACH WSAEHOSTUNREACH +# ifndef ENOTEMPTY /* possible previous definition in errno.h */ +# define ENOTEMPTY WSAENOTEMPTY +# endif +# define EPROCLIM WSAEPROCLIM +# define EUSERS WSAEUSERS +# define EDQUOT WSAEDQUOT +# define ESTALE WSAESTALE +# define EREMOTE WSAEREMOTE +#endif + +/*! Socket errors */ +typedef enum { + ARES_CONN_ERR_SUCCESS = 0, /*!< Success */ + ARES_CONN_ERR_WOULDBLOCK = 1, /*!< Operation would block */ + ARES_CONN_ERR_CONNCLOSED = 2, /*!< Connection closed (gracefully) */ + ARES_CONN_ERR_CONNABORTED = 3, /*!< Connection Aborted */ + ARES_CONN_ERR_CONNRESET = 4, /*!< Connection Reset */ + ARES_CONN_ERR_CONNREFUSED = 5, /*!< Connection Refused */ + ARES_CONN_ERR_CONNTIMEDOUT = 6, /*!< Connection Timed Out */ + ARES_CONN_ERR_HOSTDOWN = 7, /*!< Host Down */ + ARES_CONN_ERR_HOSTUNREACH = 8, /*!< Host Unreachable */ + ARES_CONN_ERR_NETDOWN = 9, /*!< Network Down */ + ARES_CONN_ERR_NETUNREACH = 10, /*!< Network Unreachable */ + ARES_CONN_ERR_INTERRUPT = 11, /*!< Call interrupted by signal, repeat */ + ARES_CONN_ERR_AFNOSUPPORT = 12, /*!< Address family not supported */ + ARES_CONN_ERR_BADADDR = 13, /*!< Bad Address / Unavailable */ + ARES_CONN_ERR_NOMEM = 14, /*!< Out of memory */ + ARES_CONN_ERR_INVALID = 15, /*!< Invalid Usage */ + ARES_CONN_ERR_TOOLARGE = 16, /*!< Request size too large */ + ARES_CONN_ERR_NOTIMP = 17, /*!< Not implemented */ + ARES_CONN_ERR_FAILURE = 99 /*!< Generic failure */ +} ares_conn_err_t; + +ares_bool_t ares_sockaddr_addr_eq(const struct sockaddr *sa, + const struct ares_addr *aa); +ares_status_t ares_socket_configure(ares_channel_t *channel, int family, + ares_bool_t is_tcp, ares_socket_t fd); +ares_conn_err_t ares_socket_enable_tfo(const ares_channel_t *channel, + ares_socket_t fd); +ares_conn_err_t ares_socket_open(ares_socket_t *sock, ares_channel_t *channel, + int af, int type, int protocol); +ares_bool_t ares_socket_try_again(int errnum); +void ares_socket_close(ares_channel_t *channel, ares_socket_t s); +ares_conn_err_t ares_socket_connect(ares_channel_t *channel, + ares_socket_t sockfd, ares_bool_t is_tfo, + const struct sockaddr *addr, + ares_socklen_t addrlen); +ares_bool_t ares_sockaddr_to_ares_addr(struct ares_addr *ares_addr, + unsigned short *port, + const struct sockaddr *sockaddr); +ares_conn_err_t ares_socket_write(ares_channel_t *channel, ares_socket_t fd, + const void *data, size_t len, size_t *written, + const struct sockaddr *sa, + ares_socklen_t salen); +#endif diff --git a/deps/cares/src/lib/ares_sortaddrinfo.c b/deps/cares/src/lib/ares_sortaddrinfo.c new file mode 100644 index 00000000000000..e6c21ea0ad712a --- /dev/null +++ b/deps/cares/src/lib/ares_sortaddrinfo.c @@ -0,0 +1,447 @@ +/* + * Original file name getaddrinfo.c + * Lifted from the 'Android Bionic' project with the BSD license. + */ + +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * Copyright (C) 2018 The Android Open Source Project + * Copyright (C) 2019 Andrew Selivanov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "ares_private.h" + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif + +#include <assert.h> +#include <limits.h> + +struct addrinfo_sort_elem { + struct ares_addrinfo_node *ai; + ares_bool_t has_src_addr; + ares_sockaddr src_addr; + size_t original_order; +}; + +#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) + +#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 +#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08 +#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e + +#define ARES_IN_LOOPBACK(a) \ + ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000) + +/* RFC 4193. */ +#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc) + +/* These macros are modelled after the ones in <netinet/in6.h>. */ +/* RFC 4380, section 2.6 */ +#define ARES_IN6_IS_ADDR_TEREDO(a) \ + ((*(const unsigned int *)(const void *)(&(a)->s6_addr[0]) == \ + ntohl(0x20010000))) +/* RFC 3056, section 2. */ +#define ARES_IN6_IS_ADDR_6TO4(a) \ + (((a)->s6_addr[0] == 0x20) && ((a)->s6_addr[1] == 0x02)) +/* 6bone testing address area (3ffe::/16), deprecated in RFC 3701. */ +#define ARES_IN6_IS_ADDR_6BONE(a) \ + (((a)->s6_addr[0] == 0x3f) && ((a)->s6_addr[1] == 0xfe)) + +static int get_scope(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr)) { + return ARES_IPV6_ADDR_MC_SCOPE(&addr6->sin6_addr); + } else if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr) || + IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)) { + /* + * RFC 4291 section 2.5.3 says loopback is to be treated as having + * link-local scope. + */ + return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; + } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { + return ARES_IPV6_ADDR_SCOPE_SITELOCAL; + } else { + return ARES_IPV6_ADDR_SCOPE_GLOBAL; + } + } else if (addr->sa_family == AF_INET) { + const struct sockaddr_in *addr4 = + CARES_INADDR_CAST(const struct sockaddr_in *, addr); + unsigned long int na = ntohl(addr4->sin_addr.s_addr); + if (ARES_IN_LOOPBACK(na) || /* 127.0.0.0/8 */ + (na & 0xffff0000) == 0xa9fe0000) /* 169.254.0.0/16 */ + { + return ARES_IPV6_ADDR_SCOPE_LINKLOCAL; + } else { + /* + * RFC 6724 section 3.2. Other IPv4 addresses, including private + * addresses and shared addresses (100.64.0.0/10), are assigned global + * scope. + */ + return ARES_IPV6_ADDR_SCOPE_GLOBAL; + } + } else { + /* + * This should never happen. + * Return a scope with low priority as a last resort. + */ + return ARES_IPV6_ADDR_SCOPE_NODELOCAL; + } +} + +static int get_label(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET) { + return 4; + } else if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { + return 0; + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { + return 4; + } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { + return 2; + } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { + return 5; + } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { + return 13; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr)) { + return 3; + } else if (IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr)) { + return 11; + } else if (ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 12; + } else { + /* All other IPv6 addresses, including global unicast addresses. */ + return 1; + } + } else { + /* + * This should never happen. + * Return a semi-random label as a last resort. + */ + return 1; + } +} + +/* + * Get the precedence for a given IPv4/IPv6 address. + * RFC 6724, section 2.1. + */ +static int get_precedence(const struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET) { + return 35; + } else if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *addr6 = + CARES_INADDR_CAST(const struct sockaddr_in6 *, addr); + if (IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr)) { + return 50; + } else if (IN6_IS_ADDR_V4MAPPED(&addr6->sin6_addr)) { + return 35; + } else if (ARES_IN6_IS_ADDR_6TO4(&addr6->sin6_addr)) { + return 30; + } else if (ARES_IN6_IS_ADDR_TEREDO(&addr6->sin6_addr)) { + return 5; + } else if (ARES_IN6_IS_ADDR_ULA(&addr6->sin6_addr)) { + return 3; + } else if (IN6_IS_ADDR_V4COMPAT(&addr6->sin6_addr) || + IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr) || + ARES_IN6_IS_ADDR_6BONE(&addr6->sin6_addr)) { + return 1; + } else { + /* All other IPv6 addresses, including global unicast addresses. */ + return 40; + } + } else { + return 1; + } +} + +/* + * Find number of matching initial bits between the two addresses a1 and a2. + */ +static size_t common_prefix_len(const struct in6_addr *a1, + const struct in6_addr *a2) +{ + const unsigned char *p1 = (const unsigned char *)a1; + const unsigned char *p2 = (const unsigned char *)a2; + size_t i; + for (i = 0; i < sizeof(*a1); ++i) { + unsigned char x; + size_t j; + if (p1[i] == p2[i]) { + continue; + } + x = p1[i] ^ p2[i]; + for (j = 0; j < CHAR_BIT; ++j) { + if (x & (1 << (CHAR_BIT - 1))) { + return i * CHAR_BIT + j; + } + x <<= 1; + } + } + return sizeof(*a1) * CHAR_BIT; +} + +/* + * Compare two source/destination address pairs. + * RFC 6724, section 6. + */ +static int rfc6724_compare(const void *ptr1, const void *ptr2) +{ + const struct addrinfo_sort_elem *a1 = (const struct addrinfo_sort_elem *)ptr1; + const struct addrinfo_sort_elem *a2 = (const struct addrinfo_sort_elem *)ptr2; + int scope_src1; + int scope_dst1; + int scope_match1; + int scope_src2; + int scope_dst2; + int scope_match2; + int label_src1; + int label_dst1; + int label_match1; + int label_src2; + int label_dst2; + int label_match2; + int precedence1; + int precedence2; + size_t prefixlen1; + size_t prefixlen2; + + /* Rule 1: Avoid unusable destinations. */ + if (a1->has_src_addr != a2->has_src_addr) { + return ((int)a2->has_src_addr) - ((int)a1->has_src_addr); + } + + /* Rule 2: Prefer matching scope. */ + scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; + if (a1->has_src_addr) { + scope_src1 = get_scope(&a1->src_addr.sa); + } + scope_dst1 = get_scope(a1->ai->ai_addr); + scope_match1 = (scope_src1 == scope_dst1); + + scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL; + if (a2->has_src_addr) { + scope_src2 = get_scope(&a2->src_addr.sa); + } + scope_dst2 = get_scope(a2->ai->ai_addr); + scope_match2 = (scope_src2 == scope_dst2); + + if (scope_match1 != scope_match2) { + return scope_match2 - scope_match1; + } + + /* Rule 3: Avoid deprecated addresses. */ + + /* Rule 4: Prefer home addresses. */ + + /* Rule 5: Prefer matching label. */ + label_src1 = 1; + if (a1->has_src_addr) { + label_src1 = get_label(&a1->src_addr.sa); + } + label_dst1 = get_label(a1->ai->ai_addr); + label_match1 = (label_src1 == label_dst1); + + label_src2 = 1; + if (a2->has_src_addr) { + label_src2 = get_label(&a2->src_addr.sa); + } + label_dst2 = get_label(a2->ai->ai_addr); + label_match2 = (label_src2 == label_dst2); + + if (label_match1 != label_match2) { + return label_match2 - label_match1; + } + + /* Rule 6: Prefer higher precedence. */ + precedence1 = get_precedence(a1->ai->ai_addr); + precedence2 = get_precedence(a2->ai->ai_addr); + if (precedence1 != precedence2) { + return precedence2 - precedence1; + } + + /* Rule 7: Prefer native transport. */ + + /* Rule 8: Prefer smaller scope. */ + if (scope_dst1 != scope_dst2) { + return scope_dst1 - scope_dst2; + } + + /* Rule 9: Use longest matching prefix. */ + if (a1->has_src_addr && a1->ai->ai_addr->sa_family == AF_INET6 && + a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6; + const struct sockaddr_in6 *a1_dst = + CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr); + const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6; + const struct sockaddr_in6 *a2_dst = + CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr); + prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr); + prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr); + if (prefixlen1 != prefixlen2) { + return (int)prefixlen2 - (int)prefixlen1; + } + } + + /* + * Rule 10: Leave the order unchanged. + * We need this since qsort() is not necessarily stable. + */ + return ((int)a1->original_order) - ((int)a2->original_order); +} + +/* + * Find the source address that will be used if trying to connect to the given + * address. + * + * Returns 1 if a source address was found, 0 if the address is unreachable + * and -1 if a fatal error occurred. If 0 or 1, the contents of src_addr are + * undefined. + */ +static int find_src_addr(ares_channel_t *channel, const struct sockaddr *addr, + struct sockaddr *src_addr) +{ + ares_socket_t sock; + ares_socklen_t len; + ares_conn_err_t err; + + switch (addr->sa_family) { + case AF_INET: + len = sizeof(struct sockaddr_in); + break; + case AF_INET6: + len = sizeof(struct sockaddr_in6); + break; + default: + /* No known usable source address for non-INET families. */ + return 0; + } + + err = + ares_socket_open(&sock, channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP); + if (err == ARES_CONN_ERR_AFNOSUPPORT) { + return 0; + } else if (err != ARES_CONN_ERR_SUCCESS) { + return -1; + } + + err = ares_socket_connect(channel, sock, ARES_FALSE, addr, len); + if (err != ARES_CONN_ERR_SUCCESS && err != ARES_CONN_ERR_WOULDBLOCK) { + ares_socket_close(channel, sock); + return 0; + } + + if (channel->sock_funcs.agetsockname == NULL || + channel->sock_funcs.agetsockname(sock, src_addr, &len, + channel->sock_func_cb_data) != 0) { + ares_socket_close(channel, sock); + return -1; + } + ares_socket_close(channel, sock); + return 1; +} + +/* + * Sort the linked list starting at sentinel->ai_next in RFC6724 order. + * Will leave the list unchanged if an error occurs. + */ +ares_status_t ares_sortaddrinfo(ares_channel_t *channel, + struct ares_addrinfo_node *list_sentinel) +{ + struct ares_addrinfo_node *cur; + size_t nelem = 0; + size_t i; + int has_src_addr; + struct addrinfo_sort_elem *elems; + + cur = list_sentinel->ai_next; + while (cur) { + ++nelem; + cur = cur->ai_next; + } + + if (!nelem) { + return ARES_ENODATA; + } + + elems = (struct addrinfo_sort_elem *)ares_malloc( + nelem * sizeof(struct addrinfo_sort_elem)); + if (!elems) { + return ARES_ENOMEM; + } + + /* + * Convert the linked list to an array that also contains the candidate + * source address for each destination address. + */ + for (i = 0, cur = list_sentinel->ai_next; i < nelem; + ++i, cur = cur->ai_next) { + assert(cur != NULL); + elems[i].ai = cur; + elems[i].original_order = i; + has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa); + if (has_src_addr == -1) { + ares_free(elems); + return ARES_ENOTFOUND; + } + elems[i].has_src_addr = (has_src_addr == 1) ? ARES_TRUE : ARES_FALSE; + } + + /* Sort the addresses, and rearrange the linked list so it matches the sorted + * order. */ + qsort((void *)elems, nelem, sizeof(struct addrinfo_sort_elem), + rfc6724_compare); + + list_sentinel->ai_next = elems[0].ai; + for (i = 0; i < nelem - 1; ++i) { + elems[i].ai->ai_next = elems[i + 1].ai; + } + elems[nelem - 1].ai->ai_next = NULL; + + ares_free(elems); + return ARES_SUCCESS; +} diff --git a/deps/cares/src/lib/ares_str.c b/deps/cares/src/lib/ares_str.c deleted file mode 100644 index 5f25cfeaff041e..00000000000000 --- a/deps/cares/src/lib/ares_str.c +++ /dev/null @@ -1,269 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares_str.h" -#include "ares.h" -#include "ares_private.h" - -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif - -size_t ares_strlen(const char *str) -{ - if (str == NULL) { - return 0; - } - - return strlen(str); -} - -char *ares_strdup(const char *s1) -{ - size_t len; - char *out; - - if (s1 == NULL) { - return NULL; - } - - len = ares_strlen(s1); - - /* Don't see how this is possible */ - if (len == SIZE_MAX) { - return NULL; - } - - out = ares_malloc(len + 1); - if (out == NULL) { - return NULL; - } - - if (len) { - memcpy(out, s1, len); - } - - out[len] = 0; - return out; -} - -size_t ares_strcpy(char *dest, const char *src, size_t dest_size) -{ - size_t len = 0; - - if (dest == NULL || dest_size == 0) { - return 0; - } - - len = ares_strlen(src); - - if (len >= dest_size) { - len = dest_size - 1; - } - - if (len) { - memcpy(dest, src, len); - } - - dest[len] = 0; - return len; -} - -ares_bool_t ares_str_isnum(const char *str) -{ - size_t i; - - if (str == NULL || *str == 0) { - return ARES_FALSE; - } - - for (i = 0; str[i] != 0; i++) { - if (str[i] < '0' || str[i] > '9') { - return ARES_FALSE; - } - } - return ARES_TRUE; -} - -void ares__str_rtrim(char *str) -{ - size_t len; - size_t i; - - if (str == NULL) { - return; - } - - len = ares_strlen(str); - for (i = len; i > 0; i--) { - if (!ares__isspace(str[i - 1])) { - break; - } - } - str[i] = 0; -} - -void ares__str_ltrim(char *str) -{ - size_t i; - size_t len; - - if (str == NULL) { - return; - } - - for (i = 0; str[i] != 0 && ares__isspace(str[i]); i++) { - /* Do nothing */ - } - - if (i == 0) { - return; - } - - len = ares_strlen(str); - if (i != len) { - memmove(str, str + i, len - i); - } - str[len - i] = 0; -} - -void ares__str_trim(char *str) -{ - ares__str_ltrim(str); - ares__str_rtrim(str); -} - -/* tolower() is locale-specific. Use a lookup table fast conversion that only - * operates on ASCII */ -static const unsigned char ares__tolower_lookup[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, - 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, - 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, - 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, - 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, - 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, - 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, - 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, - 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, - 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, - 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, - 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, - 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, - 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, - 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, - 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, - 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -unsigned char ares__tolower(unsigned char c) -{ - return ares__tolower_lookup[c]; -} - -ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val, - size_t len) -{ - size_t i; - for (i = 0; i < len; i++) { - if (ares__tolower_lookup[ptr[i]] != ares__tolower_lookup[val[i]]) { - return ARES_FALSE; - } - } - return ARES_TRUE; -} - -ares_bool_t ares__isspace(int ch) -{ - switch (ch) { - case '\r': - case '\t': - case ' ': - case '\v': - case '\f': - case '\n': - return ARES_TRUE; - default: - break; - } - return ARES_FALSE; -} - -ares_bool_t ares__isprint(int ch) -{ - if (ch >= 0x20 && ch <= 0x7E) { - return ARES_TRUE; - } - return ARES_FALSE; -} - -/* Character set allowed by hostnames. This is to include the normal - * domain name character set plus: - * - underscores which are used in SRV records. - * - Forward slashes such as are used for classless in-addr.arpa - * delegation (CNAMEs) - * - Asterisks may be used for wildcard domains in CNAMEs as seen in the - * real world. - * While RFC 2181 section 11 does state not to do validation, - * that applies to servers, not clients. Vulnerabilities have been - * reported when this validation is not performed. Security is more - * important than edge-case compatibility (which is probably invalid - * anyhow). */ -ares_bool_t ares__is_hostnamech(int ch) -{ - /* [A-Za-z0-9-*._/] - * Don't use isalnum() as it is locale-specific - */ - if (ch >= 'A' && ch <= 'Z') { - return ARES_TRUE; - } - if (ch >= 'a' && ch <= 'z') { - return ARES_TRUE; - } - if (ch >= '0' && ch <= '9') { - return ARES_TRUE; - } - if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') { - return ARES_TRUE; - } - - return ARES_FALSE; -} - -ares_bool_t ares__is_hostname(const char *str) -{ - size_t i; - for (i = 0; str[i] != 0; i++) { - if (!ares__is_hostnamech(str[i])) { - return ARES_FALSE; - } - } - return ARES_TRUE; -} diff --git a/deps/cares/src/lib/ares_str.h b/deps/cares/src/lib/ares_str.h deleted file mode 100644 index 8d869073d8153c..00000000000000 --- a/deps/cares/src/lib/ares_str.h +++ /dev/null @@ -1,66 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __ARES_STR_H -#define __ARES_STR_H - -#include "ares_setup.h" -#include "ares.h" - -char *ares_strdup(const char *s1); - -size_t ares_strlen(const char *str); - -/*! Copy string from source to destination with destination buffer size - * provided. The destination is guaranteed to be null terminated, if the - * provided buffer isn't large enough, only those bytes from the source that - * will fit will be copied. - * - * \param[out] dest Destination buffer - * \param[in] src Source to copy - * \param[in] dest_size Size of destination buffer - * \return String length. Will be at most dest_size-1 - */ -size_t ares_strcpy(char *dest, const char *src, size_t dest_size); - -ares_bool_t ares_str_isnum(const char *str); - -void ares__str_ltrim(char *str); -void ares__str_rtrim(char *str); -void ares__str_trim(char *str); - -unsigned char ares__tolower(unsigned char c); -ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val, - size_t len); - -ares_bool_t ares__isspace(int ch); -ares_bool_t ares__isprint(int ch); -ares_bool_t ares__is_hostnamech(int ch); - -ares_bool_t ares__is_hostname(const char *str); - - -#endif /* __ARES_STR_H */ diff --git a/deps/cares/src/lib/ares_strcasecmp.c b/deps/cares/src/lib/ares_strcasecmp.c deleted file mode 100644 index b91cbbe1544a84..00000000000000 --- a/deps/cares/src/lib/ares_strcasecmp.c +++ /dev/null @@ -1,79 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#include "ares_setup.h" -#include "ares_strcasecmp.h" - -#ifndef HAVE_STRCASECMP -int ares_strcasecmp(const char *a, const char *b) -{ -# if defined(HAVE_STRCMPI) - return strcmpi(a, b); -# elif defined(HAVE_STRICMP) - return stricmp(a, b); -# else - size_t i; - - for (i = 0; i < (size_t)-1; i++) { - int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; - int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; - if (c1 != c2) { - return c1 - c2; - } - if (!c1) { - break; - } - } - return 0; -# endif -} -#endif - -#ifndef HAVE_STRNCASECMP -int ares_strncasecmp(const char *a, const char *b, size_t n) -{ -# if defined(HAVE_STRNCMPI) - return strncmpi(a, b, n); -# elif defined(HAVE_STRNICMP) - return strnicmp(a, b, n); -# else - size_t i; - - for (i = 0; i < n; i++) { - int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; - int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; - if (c1 != c2) { - return c1 - c2; - } - if (!c1) { - break; - } - } - return 0; -# endif -} -#endif diff --git a/deps/cares/src/lib/ares_strcasecmp.h b/deps/cares/src/lib/ares_strcasecmp.h deleted file mode 100644 index 31a66be7179d4e..00000000000000 --- a/deps/cares/src/lib/ares_strcasecmp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* MIT License - * - * Copyright (c) 1998 Massachusetts Institute of Technology - * Copyright (c) The c-ares project and its contributors - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef HEADER_CARES_STRCASECMP_H -#define HEADER_CARES_STRCASECMP_H - -#include "ares_setup.h" - -#ifndef HAVE_STRCASECMP -extern int ares_strcasecmp(const char *a, const char *b); -#endif - -#ifndef HAVE_STRNCASECMP -extern int ares_strncasecmp(const char *a, const char *b, size_t n); -#endif - -#endif /* HEADER_CARES_STRCASECMP_H */ diff --git a/deps/cares/src/lib/ares_strerror.c b/deps/cares/src/lib/ares_strerror.c index ae94f9619efa45..d9f641162026c0 100644 --- a/deps/cares/src/lib/ares_strerror.c +++ b/deps/cares/src/lib/ares_strerror.c @@ -25,9 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include <assert.h> -#include "ares.h" +#include "ares_private.h" const char *ares_strerror(int code) { diff --git a/deps/cares/src/lib/ares_strsplit.c b/deps/cares/src/lib/ares_strsplit.c deleted file mode 100644 index 395bf1ebb9a5ec..00000000000000 --- a/deps/cares/src/lib/ares_strsplit.c +++ /dev/null @@ -1,140 +0,0 @@ -/* MIT License - * - * Copyright (c) 2018 John Schember - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ - -#if defined(__MVS__) -# include <strings.h> -#endif - -#include "ares_setup.h" -#include "ares.h" -#include "ares_private.h" - -void ares__strsplit_free(char **elms, size_t num_elm) -{ - size_t i; - - if (elms == NULL) { - return; - } - - for (i = 0; i < num_elm; i++) { - ares_free(elms[i]); - } - ares_free(elms); -} - -char **ares__strsplit_duplicate(char **elms, size_t num_elm) -{ - size_t i; - char **out; - - if (elms == NULL || num_elm == 0) { - return NULL; - } - - out = ares_malloc_zero(sizeof(*elms) * num_elm); - if (out == NULL) { - return NULL; - } - - for (i = 0; i < num_elm; i++) { - out[i] = ares_strdup(elms[i]); - if (out[i] == NULL) { - ares__strsplit_free(out, num_elm); - return NULL; - } - } - - return out; -} - -char **ares__strsplit(const char *in, const char *delms, size_t *num_elm) -{ - ares_status_t status; - ares__buf_t *buf = NULL; - ares__llist_t *llist = NULL; - ares__llist_node_t *node; - char **out = NULL; - size_t cnt = 0; - size_t idx = 0; - - if (in == NULL || delms == NULL || num_elm == NULL) { - return NULL; - } - - *num_elm = 0; - - buf = ares__buf_create_const((const unsigned char *)in, ares_strlen(in)); - if (buf == NULL) { - return NULL; - } - - status = ares__buf_split( - buf, (const unsigned char *)delms, ares_strlen(delms), - ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &llist); - if (status != ARES_SUCCESS) { - goto done; - } - - cnt = ares__llist_len(llist); - if (cnt == 0) { - status = ARES_EFORMERR; - goto done; - } - - - out = ares_malloc_zero(cnt * sizeof(*out)); - if (out == NULL) { - status = ARES_ENOMEM; - goto done; - } - - for (node = ares__llist_node_first(llist); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *val = ares__llist_node_val(node); - char *temp = NULL; - - status = ares__buf_fetch_str_dup(val, ares__buf_len(val), &temp); - if (status != ARES_SUCCESS) { - goto done; - } - - out[idx++] = temp; - } - - *num_elm = cnt; - status = ARES_SUCCESS; - -done: - ares__llist_destroy(llist); - ares__buf_destroy(buf); - if (status != ARES_SUCCESS) { - ares__strsplit_free(out, cnt); - out = NULL; - } - - return out; -} diff --git a/deps/cares/src/lib/ares_sysconfig.c b/deps/cares/src/lib/ares_sysconfig.c index 474534512af191..286db60328f45b 100644 --- a/deps/cares/src/lib/ares_sysconfig.c +++ b/deps/cares/src/lib/ares_sysconfig.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> @@ -43,8 +43,6 @@ # include <arpa/inet.h> #endif -#include "ares_nameser.h" - #if defined(ANDROID) || defined(__ANDROID__) # include <sys/system_properties.h> # include "ares_android.h" @@ -57,589 +55,12 @@ # include <resolv.h> #endif -#if defined(USE_WINSOCK) -# if defined(HAVE_IPHLPAPI_H) -# include <iphlpapi.h> -# endif -# if defined(HAVE_NETIOAPI_H) -# include <netioapi.h> -# endif -#endif - -#include "ares.h" #include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" - -#ifdef WATT32 -# undef WIN32 /* Redefined in MingW/MSVC headers */ -#endif - - -#ifdef WIN32 -/* - * get_REG_SZ() - * - * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer - * to the name of the registry leaf key to be queried, fetch it's string - * value and return a pointer in *outptr to a newly allocated memory area - * holding it as a null-terminated string. - * - * Returns 0 and nullifies *outptr upon inability to return a string value. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Supported on Windows NT 3.5 and newer. - */ -static ares_bool_t get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr) -{ - DWORD size = 0; - int res; - - *outptr = NULL; - - /* Find out size of string stored in registry */ - res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size); - if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) { - return ARES_FALSE; - } - - /* Allocate buffer of indicated size plus one given that string - might have been stored without null termination */ - *outptr = ares_malloc(size + 1); - if (!*outptr) { - return ARES_FALSE; - } - - /* Get the value for real */ - res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, (unsigned char *)*outptr, - &size); - if ((res != ERROR_SUCCESS) || (size == 1)) { - ares_free(*outptr); - *outptr = NULL; - return ARES_FALSE; - } - - /* Null terminate buffer always */ - *(*outptr + size) = '\0'; - - return ARES_TRUE; -} - -static void commanjoin(char **dst, const char * const src, const size_t len) -{ - char *newbuf; - size_t newsize; - - /* 1 for terminating 0 and 2 for , and terminating 0 */ - newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1); - newbuf = ares_realloc(*dst, newsize); - if (!newbuf) { - return; - } - if (*dst == NULL) { - *newbuf = '\0'; - } - *dst = newbuf; - if (ares_strlen(*dst) != 0) { - strcat(*dst, ","); - } - strncat(*dst, src, len); -} - -/* - * commajoin() - * - * RTF code. - */ -static void commajoin(char **dst, const char *src) -{ - commanjoin(dst, src, ares_strlen(src)); -} - -/* A structure to hold the string form of IPv4 and IPv6 addresses so we can - * sort them by a metric. - */ -typedef struct { - /* The metric we sort them by. */ - ULONG metric; - - /* Original index of the item, used as a secondary sort parameter to make - * qsort() stable if the metrics are equal */ - size_t orig_idx; - - /* Room enough for the string form of any IPv4 or IPv6 address that - * ares_inet_ntop() will create. Based on the existing c-ares practice. - */ - char text[INET6_ADDRSTRLEN + 8 + 64]; /* [%s]:NNNNN%iface */ -} Address; - -/* Sort Address values \a left and \a right by metric, returning the usual - * indicators for qsort(). - */ -static int compareAddresses(const void *arg1, const void *arg2) -{ - const Address * const left = arg1; - const Address * const right = arg2; - /* Lower metric the more preferred */ - if (left->metric < right->metric) { - return -1; - } - if (left->metric > right->metric) { - return 1; - } - /* If metrics are equal, lower original index more preferred */ - if (left->orig_idx < right->orig_idx) { - return -1; - } - if (left->orig_idx > right->orig_idx) { - return 1; - } - return 0; -} - -/* There can be multiple routes to "the Internet". And there can be different - * DNS servers associated with each of the interfaces that offer those routes. - * We have to assume that any DNS server can serve any request. But, some DNS - * servers may only respond if requested over their associated interface. But - * we also want to use "the preferred route to the Internet" whenever possible - * (and not use DNS servers on a non-preferred route even by forcing request - * to go out on the associated non-preferred interface). i.e. We want to use - * the DNS servers associated with the same interface that we would use to - * make a general request to anything else. - * - * But, Windows won't sort the DNS servers by the metrics associated with the - * routes and interfaces _even_ though it obviously sends IP packets based on - * those same routes and metrics. So, we must do it ourselves. - * - * So, we sort the DNS servers by the same metric values used to determine how - * an outgoing IP packet will go, thus effectively using the DNS servers - * associated with the interface that the DNS requests themselves will - * travel. This gives us optimal routing and avoids issues where DNS servers - * won't respond to requests that don't arrive via some specific subnetwork - * (and thus some specific interface). - * - * This function computes the metric we use to sort. On the interface - * identified by \a luid, it determines the best route to \a dest and combines - * that route's metric with \a interfaceMetric to compute a metric for the - * destination address on that interface. This metric can be used as a weight - * to sort the DNS server addresses associated with each interface (lower is - * better). - * - * Note that by restricting the route search to the specific interface with - * which the DNS servers are associated, this function asks the question "What - * is the metric for sending IP packets to this DNS server?" which allows us - * to sort the DNS servers correctly. - */ -static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */ - const SOCKADDR_INET * const dest, - const ULONG interfaceMetric) -{ - /* On this interface, get the best route to that destination. */ -# if defined(__WATCOMC__) - /* OpenWatcom's builtin Windows SDK does not have a definition for - * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET - * as a variable. Let's work around this by returning the worst possible - * metric, but only when using the OpenWatcom compiler. - * It may be worth investigating using a different version of the Windows - * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom - * 2.0. - */ - return (ULONG)-1; -# else - MIB_IPFORWARD_ROW2 row; - SOCKADDR_INET ignored; - if (GetBestRoute2(/* The interface to use. The index is ignored since we are - * passing a LUID. - */ - luid, 0, - /* No specific source address. */ - NULL, - /* Our destination address. */ - dest, - /* No options. */ - 0, - /* The route row. */ - &row, - /* The best source address, which we don't need. */ - &ignored) != NO_ERROR - /* If the metric is "unused" (-1) or too large for us to add the two - * metrics, use the worst possible, thus sorting this last. - */ - || row.Metric == (ULONG)-1 || - row.Metric > ((ULONG)-1) - interfaceMetric) { - /* Return the worst possible metric. */ - return (ULONG)-1; - } - - /* Return the metric value from that row, plus the interface metric. - * - * See - * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx - * which describes the combination as a "sum". - */ - return row.Metric + interfaceMetric; -# endif /* __WATCOMC__ */ -} - -/* - * get_DNS_Windows() - * - * Locates DNS info using GetAdaptersAddresses() function from the Internet - * Protocol Helper (IP Helper) API. When located, this returns a pointer - * in *outptr to a newly allocated memory area holding a null-terminated - * string with a space or comma separated list of DNS IP addresses. - * - * Returns 0 and nullifies *outptr upon inability to return DNSes string. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Implementation supports Windows XP and newer. - */ -# define IPAA_INITIAL_BUF_SZ 15 * 1024 -# define IPAA_MAX_TRIES 3 - -static ares_bool_t get_DNS_Windows(char **outptr) -{ - IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr; - IP_ADAPTER_ADDRESSES *ipaa; - IP_ADAPTER_ADDRESSES *newipaa; - IP_ADAPTER_ADDRESSES *ipaaEntry; - ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ; - ULONG Bufsz = IPAA_INITIAL_BUF_SZ; - ULONG AddrFlags = 0; - int trying = IPAA_MAX_TRIES; - ULONG res; - - /* The capacity of addresses, in elements. */ - size_t addressesSize; - /* The number of elements in addresses. */ - size_t addressesIndex = 0; - /* The addresses we will sort. */ - Address *addresses; - - union { - struct sockaddr *sa; - struct sockaddr_in *sa4; - struct sockaddr_in6 *sa6; - } namesrvr; - - *outptr = NULL; - - ipaa = ares_malloc(Bufsz); - if (!ipaa) { - return ARES_FALSE; - } - - /* Start with enough room for a few DNS server addresses and we'll grow it - * as we encounter more. - */ - addressesSize = 4; - addresses = (Address *)ares_malloc(sizeof(Address) * addressesSize); - if (addresses == NULL) { - /* We need room for at least some addresses to function. */ - ares_free(ipaa); - return ARES_FALSE; - } - - /* Usually this call succeeds with initial buffer size */ - res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); - if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) { - goto done; - } - - while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) { - if (Bufsz < ReqBufsz) { - newipaa = ares_realloc(ipaa, ReqBufsz); - if (!newipaa) { - goto done; - } - Bufsz = ReqBufsz; - ipaa = newipaa; - } - res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); - if (res == ERROR_SUCCESS) { - break; - } - } - if (res != ERROR_SUCCESS) { - goto done; - } - - for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) { - if (ipaaEntry->OperStatus != IfOperStatusUp) { - continue; - } - - /* For each interface, find any associated DNS servers as IPv4 or IPv6 - * addresses. For each found address, find the best route to that DNS - * server address _on_ _that_ _interface_ (at this moment in time) and - * compute the resulting total metric, just as Windows routing will do. - * Then, sort all the addresses found by the metric. - */ - for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; ipaDNSAddr; - ipaDNSAddr = ipaDNSAddr->Next) { - char ipaddr[INET6_ADDRSTRLEN] = ""; - namesrvr.sa = ipaDNSAddr->Address.lpSockaddr; - - if (namesrvr.sa->sa_family == AF_INET) { - if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) || - (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) { - continue; - } - - /* Allocate room for another address, if necessary, else skip. */ - if (addressesIndex == addressesSize) { - const size_t newSize = addressesSize + 4; - Address * const newMem = - (Address *)ares_realloc(addresses, sizeof(Address) * newSize); - if (newMem == NULL) { - continue; - } - addresses = newMem; - addressesSize = newSize; - } - - addresses[addressesIndex].metric = getBestRouteMetric( - &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)), - ipaaEntry->Ipv4Metric); - - /* Record insertion index to make qsort stable */ - addresses[addressesIndex].orig_idx = addressesIndex; - - if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, ipaddr, - sizeof(ipaddr))) { - continue; - } - snprintf(addresses[addressesIndex].text, - sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, - ntohs(namesrvr.sa4->sin_port)); - ++addressesIndex; - } else if (namesrvr.sa->sa_family == AF_INET6) { - unsigned int ll_scope = 0; - struct ares_addr addr; - - if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any, - sizeof(namesrvr.sa6->sin6_addr)) == 0) { - continue; - } - - /* Allocate room for another address, if necessary, else skip. */ - if (addressesIndex == addressesSize) { - const size_t newSize = addressesSize + 4; - Address * const newMem = - (Address *)ares_realloc(addresses, sizeof(Address) * newSize); - if (newMem == NULL) { - continue; - } - addresses = newMem; - addressesSize = newSize; - } - - /* See if its link-local */ - memset(&addr, 0, sizeof(addr)); - addr.family = AF_INET6; - memcpy(&addr.addr.addr6, &namesrvr.sa6->sin6_addr, 16); - if (ares__addr_is_linklocal(&addr)) { - ll_scope = ipaaEntry->Ipv6IfIndex; - } - - addresses[addressesIndex].metric = getBestRouteMetric( - &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)), - ipaaEntry->Ipv6Metric); - - /* Record insertion index to make qsort stable */ - addresses[addressesIndex].orig_idx = addressesIndex; - - if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, ipaddr, - sizeof(ipaddr))) { - continue; - } - - if (ll_scope) { - snprintf(addresses[addressesIndex].text, - sizeof(addresses[addressesIndex].text), "[%s]:%u%%%u", - ipaddr, ntohs(namesrvr.sa6->sin6_port), ll_scope); - } else { - snprintf(addresses[addressesIndex].text, - sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, - ntohs(namesrvr.sa6->sin6_port)); - } - ++addressesIndex; - } else { - /* Skip non-IPv4/IPv6 addresses completely. */ - continue; - } - } - } - - /* Sort all of the textual addresses by their metric (and original index if - * metrics are equal). */ - qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses); - - /* Join them all into a single string, removing duplicates. */ - { - size_t i; - for (i = 0; i < addressesIndex; ++i) { - size_t j; - /* Look for this address text appearing previously in the results. */ - for (j = 0; j < i; ++j) { - if (strcmp(addresses[j].text, addresses[i].text) == 0) { - break; - } - } - /* Iff we didn't emit this address already, emit it now. */ - if (j == i) { - /* Add that to outptr (if we can). */ - commajoin(outptr, addresses[i].text); - } - } - } - -done: - ares_free(addresses); - - if (ipaa) { - ares_free(ipaa); - } - - if (!*outptr) { - return ARES_FALSE; - } - - return ARES_TRUE; -} - -/* - * get_SuffixList_Windows() - * - * Reads the "DNS Suffix Search List" from registry and writes the list items - * whitespace separated to outptr. If the Search List is empty, the - * "Primary Dns Suffix" is written to outptr. - * - * Returns 0 and nullifies *outptr upon inability to return the suffix list. - * - * Returns 1 and sets *outptr when returning a dynamically allocated string. - * - * Implementation supports Windows Server 2003 and newer - */ -static ares_bool_t get_SuffixList_Windows(char **outptr) -{ - HKEY hKey; - HKEY hKeyEnum; - char keyName[256]; - DWORD keyNameBuffSize; - DWORD keyIdx = 0; - char *p = NULL; - - *outptr = NULL; - - if (ares__getplatform() != WIN_NT) { - return ARES_FALSE; - } - - /* 1. Global DNS Suffix Search List */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) == - ERROR_SUCCESS) { - get_REG_SZ(hKey, SEARCHLIST_KEY, outptr); - if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) == - ERROR_SUCCESS) { - if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - /* 2. Connection Specific Search List composed of: - * a. Primary DNS Suffix */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) == - ERROR_SUCCESS) { - if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKey); - } - - /* b. Interface SearchList, Domain, DhcpDomain */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, - KEY_READ, &hKey) == ERROR_SUCCESS) { - for (;;) { - keyNameBuffSize = sizeof(keyName); - if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, 0, NULL, - NULL, NULL) != ERROR_SUCCESS) { - break; - } - if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) != - ERROR_SUCCESS) { - continue; - } - /* p can be comma separated (SearchList) */ - if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) { - commajoin(outptr, p); - ares_free(p); - p = NULL; - } - RegCloseKey(hKeyEnum); - } - RegCloseKey(hKey); - } - - return *outptr != NULL ? ARES_TRUE : ARES_FALSE; -} - -static ares_status_t ares__init_sysconfig_windows(ares_sysconfig_t *sysconfig) -{ - char *line = NULL; - ares_status_t status = ARES_SUCCESS; - if (get_DNS_Windows(&line)) { - status = ares__sconfig_append_fromstr(&sysconfig->sconfig, line, ARES_TRUE); - ares_free(line); - if (status != ARES_SUCCESS) { - goto done; - } - } - - if (get_SuffixList_Windows(&line)) { - sysconfig->domains = ares__strsplit(line, ", ", &sysconfig->ndomains); - ares_free(line); - if (sysconfig->domains == NULL) { - status = ARES_EFILE; - } - if (status != ARES_SUCCESS) { - goto done; - } - } - -done: - return status; -} -#endif #if defined(__MVS__) -static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig) +static ares_status_t ares_init_sysconfig_mvs(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) { struct __res_state *res = 0; size_t count4; @@ -678,9 +99,9 @@ static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig) addr.addr.addr4.s_addr = addr_in->sin_addr.s_addr; addr.family = AF_INET; - status = - ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port), - htons(addr_in->sin_port), NULL); + status = ares_sconfig_append(channel, &sysconfig->sconfig, &addr, + htons(addr_in->sin_port), + htons(addr_in->sin_port), NULL); if (status != ARES_SUCCESS) { return status; @@ -695,9 +116,9 @@ static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig) memcpy(&(addr.addr.addr6), &(addr_in->sin6_addr), sizeof(addr_in->sin6_addr)); - status = - ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port), - htons(addr_in->sin_port), NULL); + status = ares_sconfig_append(channel, &sysconfig->sconfig, &addr, + htons(addr_in->sin_port), + htons(addr_in->sin_port), NULL); if (status != ARES_SUCCESS) { return status; @@ -709,7 +130,8 @@ static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig) #endif #if defined(__riscos__) -static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig) +static ares_status_t ares_init_sysconfig_riscos(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) { char *line; ares_status_t status = ARES_SUCCESS; @@ -732,8 +154,8 @@ static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig) if (space) { *space = '\0'; } - status = - ares__sconfig_append_fromstr(&sysconfig->sconfig, pos, ARES_TRUE); + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, pos, + ARES_TRUE); if (status != ARES_SUCCESS) { break; } @@ -748,7 +170,8 @@ static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig) #endif #if defined(WATT32) -static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig) +static ares_status_t ares_init_sysconfig_watt32(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) { size_t i; ares_status_t status; @@ -761,7 +184,8 @@ static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig) addr.family = AF_INET; addr.addr.addr4.s_addr = htonl(def_nameservers[i]); - status = ares__sconfig_append(&sysconfig->sconfig, &addr, 0, 0, NULL); + status = + ares_sconfig_append(channel, &sysconfig->sconfig, &addr, 0, 0, NULL); if (status != ARES_SUCCESS) { return status; @@ -773,7 +197,8 @@ static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig) #endif #if defined(ANDROID) || defined(__ANDROID__) -static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) +static ares_status_t ares_init_sysconfig_android(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) { size_t i; char **dns_servers; @@ -790,8 +215,8 @@ static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers); if (dns_servers != NULL) { for (i = 0; i < num_servers; i++) { - status = ares__sconfig_append_fromstr(&sysconfig->sconfig, dns_servers[i], - ARES_TRUE); + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, + dns_servers[i], ARES_TRUE); if (status != ARES_SUCCESS) { return status; } @@ -803,7 +228,7 @@ static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) } domains = ares_get_android_search_domains_list(); - sysconfig->domains = ares__strsplit(domains, ", ", &sysconfig->ndomains); + sysconfig->domains = ares_strsplit(domains, ", ", &sysconfig->ndomains); ares_free(domains); # ifdef HAVE___SYSTEM_PROPERTY_GET @@ -818,12 +243,12 @@ static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) char propname[PROP_NAME_MAX]; char propvalue[PROP_VALUE_MAX] = ""; for (i = 1; i <= MAX_DNS_PROPERTIES; i++) { - snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i); + snprintf(propname, sizeof(propname), "%s%zu", DNS_PROP_NAME_PREFIX, i); if (__system_property_get(propname, propvalue) < 1) { break; } - status = - ares__sconfig_append_fromstr(&sysconfig->sconfig, propvalue, ARES_TRUE); + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, + propvalue, ARES_TRUE); if (status != ARES_SUCCESS) { return status; } @@ -835,8 +260,98 @@ static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig) } #endif +#if defined(__QNX__) +static ares_status_t + ares_init_sysconfig_qnx(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + /* QNX: + * 1. use confstr(_CS_RESOLVE, ...) as primary resolv.conf data, replacing + * "_" with " ". If that is empty, then do normal /etc/resolv.conf + * processing. + * 2. We want to process /etc/nsswitch.conf as normal. + * 3. if confstr(_CS_DOMAIN, ...) this is the domain name. Use this as + * preference over anything else found. + */ + ares_buf_t *buf = ares_buf_create(); + unsigned char *data = NULL; + size_t data_size = 0; + ares_bool_t process_resolvconf = ARES_TRUE; + ares_status_t status = ARES_SUCCESS; + + /* Prefer confstr(_CS_RESOLVE, ...) */ + buf = ares_buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + data_size = 1024; + data = ares_buf_append_start(buf, &data_size); + if (data == NULL) { + status = ARES_ENOMEM; + goto done; + } + + data_size = confstr(_CS_RESOLVE, (char *)data, data_size); + if (data_size > 1) { + /* confstr returns byte for NULL terminator, strip */ + data_size--; + + ares_buf_append_finish(buf, data_size); + /* Its odd, this uses _ instead of " " between keywords, otherwise the + * format is the same as resolv.conf, replace. */ + ares_buf_replace(buf, (const unsigned char *)"_", 1, + (const unsigned char *)" ", 1); + + status = ares_sysconfig_process_buf(channel, sysconfig, buf, + ares_sysconfig_parse_resolv_line); + if (status != ARES_SUCCESS) { + /* ENOMEM is really the only error we'll get here */ + goto done; + } + + /* don't read resolv.conf if we processed *any* nameservers */ + if (ares_llist_len(sysconfig->sconfig) != 0) { + process_resolvconf = ARES_FALSE; + } + } + + /* Process files */ + status = ares_init_sysconfig_files(channel, sysconfig, process_resolvconf); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Read confstr(_CS_DOMAIN, ...), but if we had a search path specified with + * more than one domain, lets prefer that instead. Its not exactly clear + * the best way to handle this. */ + if (sysconfig->ndomains <= 1) { + char domain[256]; + size_t domain_len; + + domain_len = confstr(_CS_DOMAIN, domain, sizeof(domain_len)); + if (domain_len != 0) { + ares_strsplit_free(sysconfig->domains, sysconfig->ndomains); + sysconfig->domains = ares_strsplit(domain, ", ", &sysconfig->ndomains); + if (sysconfig->domains == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + } + +done: + ares_buf_destroy(buf); + + return status; +} +#endif + #if defined(CARES_USE_LIBRESOLV) -static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) +static ares_status_t + ares_init_sysconfig_libresolv(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) { struct __res_state res; ares_status_t status = ARES_SUCCESS; @@ -844,7 +359,7 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) int nscount; size_t i; size_t entries = 0; - ares__buf_t *ipbuf = NULL; + ares_buf_t *ipbuf = NULL; memset(&res, 0, sizeof(res)); @@ -874,58 +389,58 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) /* [ip]:port%iface */ - ipbuf = ares__buf_create(); + ipbuf = ares_buf_create(); if (ipbuf == NULL) { status = ARES_ENOMEM; goto done; } - status = ares__buf_append_str(ipbuf, "["); + status = ares_buf_append_str(ipbuf, "["); if (status != ARES_SUCCESS) { goto done; } - status = ares__buf_append_str(ipbuf, ipaddr); + status = ares_buf_append_str(ipbuf, ipaddr); if (status != ARES_SUCCESS) { goto done; } - status = ares__buf_append_str(ipbuf, "]"); + status = ares_buf_append_str(ipbuf, "]"); if (status != ARES_SUCCESS) { goto done; } if (port) { - status = ares__buf_append_str(ipbuf, ":"); + status = ares_buf_append_str(ipbuf, ":"); if (status != ARES_SUCCESS) { goto done; } - status = ares__buf_append_num_dec(ipbuf, port, 0); + status = ares_buf_append_num_dec(ipbuf, port, 0); if (status != ARES_SUCCESS) { goto done; } } if (ll_scope) { - status = ares__buf_append_str(ipbuf, "%"); + status = ares_buf_append_str(ipbuf, "%"); if (status != ARES_SUCCESS) { goto done; } - status = ares__buf_append_num_dec(ipbuf, ll_scope, 0); + status = ares_buf_append_num_dec(ipbuf, ll_scope, 0); if (status != ARES_SUCCESS) { goto done; } } - ipstr = ares__buf_finish_str(ipbuf, NULL); + ipstr = ares_buf_finish_str(ipbuf, NULL); ipbuf = NULL; if (ipstr == NULL) { status = ARES_ENOMEM; goto done; } - status = - ares__sconfig_append_fromstr(&sysconfig->sconfig, ipstr, ARES_TRUE); + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, ipstr, + ARES_TRUE); ares_free(ipstr); if (status != ARES_SUCCESS) { @@ -957,28 +472,29 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) if (res.ndots >= 0) { sysconfig->ndots = (size_t)res.ndots; } +/* Apple does not allow configuration of retry, so this is a static dummy + * value, ignore */ +# ifndef __APPLE__ if (res.retry > 0) { sysconfig->tries = (size_t)res.retry; } +# endif if (res.options & RES_ROTATE) { sysconfig->rotate = ARES_TRUE; } if (res.retrans > 0) { +/* Apple does not allow configuration of retrans, so this is a dummy value + * that is extremely high (5s) */ +# ifndef __APPLE__ if (res.retrans > 0) { sysconfig->timeout_ms = (unsigned int)res.retrans * 1000; } -# ifdef __APPLE__ - if (res.retry >= 0) { - sysconfig->timeout_ms /= - ((unsigned int)res.retry + 1) * - (unsigned int)(res.nscount > 0 ? res.nscount : 1); - } # endif } done: - ares__buf_destroy(ipbuf); + ares_buf_destroy(ipbuf); res_ndestroy(&res); return status; } @@ -986,8 +502,8 @@ static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig) static void ares_sysconfig_free(ares_sysconfig_t *sysconfig) { - ares__llist_destroy(sysconfig->sconfig); - ares__strsplit_free(sysconfig->domains, sysconfig->ndomains); + ares_llist_destroy(sysconfig->sconfig); + ares_strsplit_free(sysconfig->domains, sysconfig->ndomains); ares_free(sysconfig->sortlist); ares_free(sysconfig->lookups); memset(sysconfig, 0, sizeof(*sysconfig)); @@ -999,7 +515,7 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, ares_status_t status; if (sysconfig->sconfig && !(channel->optmask & ARES_OPT_SERVERS)) { - status = ares__servers_update(channel, sysconfig->sconfig, ARES_FALSE); + status = ares_servers_update(channel, sysconfig->sconfig, ARES_FALSE); if (status != ARES_SUCCESS) { return status; } @@ -1009,12 +525,12 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, /* Make sure we duplicate first then replace so even if there is * ARES_ENOMEM, the channel stays in a good state */ char **temp = - ares__strsplit_duplicate(sysconfig->domains, sysconfig->ndomains); + ares_strsplit_duplicate(sysconfig->domains, sysconfig->ndomains); if (temp == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } - ares__strsplit_free(channel->domains, channel->ndomains); + ares_strsplit_free(channel->domains, channel->ndomains); channel->domains = temp; channel->ndomains = sysconfig->ndomains; } @@ -1022,7 +538,7 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, if (sysconfig->lookups && !(channel->optmask & ARES_OPT_LOOKUPS)) { char *temp = ares_strdup(sysconfig->lookups); if (temp == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } ares_free(channel->lookups); @@ -1033,7 +549,7 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, struct apattern *temp = ares_malloc(sizeof(*channel->sortlist) * sysconfig->nsortlist); if (temp == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } memcpy(temp, sysconfig->sortlist, sizeof(*channel->sortlist) * sysconfig->nsortlist); @@ -1043,7 +559,7 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, channel->nsort = sysconfig->nsortlist; } - if (sysconfig->ndots && !(channel->optmask & ARES_OPT_NDOTS)) { + if (!(channel->optmask & ARES_OPT_NDOTS)) { channel->ndots = sysconfig->ndots; } @@ -1066,27 +582,32 @@ static ares_status_t ares_sysconfig_apply(ares_channel_t *channel, return ARES_SUCCESS; } -ares_status_t ares__init_by_sysconfig(ares_channel_t *channel) +ares_status_t ares_init_by_sysconfig(ares_channel_t *channel) { ares_status_t status; ares_sysconfig_t sysconfig; memset(&sysconfig, 0, sizeof(sysconfig)); + sysconfig.ndots = 1; /* Default value if not otherwise set */ -#ifdef _WIN32 - status = ares__init_sysconfig_windows(&sysconfig); +#if defined(USE_WINSOCK) + status = ares_init_sysconfig_windows(channel, &sysconfig); #elif defined(__MVS__) - status = ares__init_sysconfig_mvs(&sysconfig); + status = ares_init_sysconfig_mvs(channel, &sysconfig); #elif defined(__riscos__) - status = ares__init_sysconfig_riscos(&sysconfig); + status = ares_init_sysconfig_riscos(channel, &sysconfig); #elif defined(WATT32) - status = ares__init_sysconfig_watt32(&sysconfig); + status = ares_init_sysconfig_watt32(channel, &sysconfig); #elif defined(ANDROID) || defined(__ANDROID__) - status = ares__init_sysconfig_android(&sysconfig); + status = ares_init_sysconfig_android(channel, &sysconfig); +#elif defined(__APPLE__) + status = ares_init_sysconfig_macos(channel, &sysconfig); #elif defined(CARES_USE_LIBRESOLV) - status = ares__init_sysconfig_libresolv(&sysconfig); + status = ares_init_sysconfig_libresolv(channel, &sysconfig); +#elif defined(__QNX__) + status = ares_init_sysconfig_qnx(channel, &sysconfig); #else - status = ares__init_sysconfig_files(channel, &sysconfig); + status = ares_init_sysconfig_files(channel, &sysconfig, ARES_TRUE); #endif if (status != ARES_SUCCESS) { @@ -1094,12 +615,19 @@ ares_status_t ares__init_by_sysconfig(ares_channel_t *channel) } /* Environment is supposed to override sysconfig */ - status = ares__init_by_environment(&sysconfig); + status = ares_init_by_environment(&sysconfig); if (status != ARES_SUCCESS) { goto done; } + /* Lock when applying the configuration to the channel. Don't need to + * lock prior to this. */ + + ares_channel_lock(channel); + status = ares_sysconfig_apply(channel, &sysconfig); + ares_channel_unlock(channel); + if (status != ARES_SUCCESS) { goto done; } diff --git a/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c index 557888bc740a39..a6c2a8e62bb34f 100644 --- a/deps/cares/src/lib/ares_sysconfig_files.c +++ b/deps/cares/src/lib/ares_sysconfig_files.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> @@ -43,8 +43,6 @@ # include <arpa/inet.h> #endif -#include "ares_nameser.h" - #if defined(ANDROID) || defined(__ANDROID__) # include <sys/system_properties.h> # include "ares_android.h" @@ -61,10 +59,7 @@ # include <iphlpapi.h> #endif -#include "ares.h" #include "ares_inet_net_pton.h" -#include "ares_platform.h" -#include "ares_private.h" static unsigned char ip_natural_mask(const struct ares_addr *addr) { @@ -103,7 +98,7 @@ static ares_bool_t sortlist_append(struct apattern **sortlist, size_t *nsort, newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(*newsort)); if (newsort == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: OutOfMemory */ } *sortlist = newsort; @@ -114,7 +109,7 @@ static ares_bool_t sortlist_append(struct apattern **sortlist, size_t *nsort, return ARES_TRUE; } -static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) +static ares_status_t parse_sort(ares_buf_t *buf, struct apattern *pat) { ares_status_t status; const unsigned char ip_charset[] = "ABCDEFabcdef0123456789.:"; @@ -124,22 +119,22 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) memset(pat, 0, sizeof(*pat)); /* Consume any leading whitespace */ - ares__buf_consume_whitespace(buf, ARES_TRUE); + ares_buf_consume_whitespace(buf, ARES_TRUE); /* If no length, just ignore, return ENOTFOUND as an indicator */ - if (ares__buf_len(buf) == 0) { + if (ares_buf_len(buf) == 0) { return ARES_ENOTFOUND; } - ares__buf_tag(buf); + ares_buf_tag(buf); /* Consume ip address */ - if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) { + if (ares_buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) { return ARES_EBADSTR; } /* Fetch ip address */ - status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); + status = ares_buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); if (status != ARES_SUCCESS) { return status; } @@ -151,24 +146,24 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) } /* See if there is a subnet mask */ - if (ares__buf_begins_with(buf, (const unsigned char *)"/", 1)) { + if (ares_buf_begins_with(buf, (const unsigned char *)"/", 1)) { char maskstr[16]; const unsigned char ipv4_charset[] = "0123456789."; /* Consume / */ - ares__buf_consume(buf, 1); + ares_buf_consume(buf, 1); - ares__buf_tag(buf); + ares_buf_tag(buf); /* Consume mask */ - if (ares__buf_consume_charset(buf, ipv4_charset, - sizeof(ipv4_charset) - 1) == 0) { + if (ares_buf_consume_charset(buf, ipv4_charset, sizeof(ipv4_charset) - 1) == + 0) { return ARES_EBADSTR; } /* Fetch mask */ - status = ares__buf_tag_fetch_string(buf, maskstr, sizeof(maskstr)); + status = ares_buf_tag_fetch_string(buf, maskstr, sizeof(maskstr)); if (status != ARES_SUCCESS) { return status; } @@ -194,36 +189,37 @@ static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat) return ARES_EBADSTR; } ptr = (const unsigned char *)&maskaddr.addr.addr4; - pat->mask = (unsigned char)(ares__count_bits_u8(ptr[0]) + - ares__count_bits_u8(ptr[1]) + - ares__count_bits_u8(ptr[2]) + - ares__count_bits_u8(ptr[3])); + pat->mask = (unsigned char)(ares_count_bits_u8(ptr[0]) + + ares_count_bits_u8(ptr[1]) + + ares_count_bits_u8(ptr[2]) + + ares_count_bits_u8(ptr[3])); } } else { pat->mask = ip_natural_mask(&pat->addr); } /* Consume any trailing whitespace */ - ares__buf_consume_whitespace(buf, ARES_TRUE); + ares_buf_consume_whitespace(buf, ARES_TRUE); /* If we have any trailing bytes other than whitespace, its a parse failure */ - if (ares__buf_len(buf) != 0) { + if (ares_buf_len(buf) != 0) { return ARES_EBADSTR; } return ARES_SUCCESS; } -ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, - const char *str) +ares_status_t ares_parse_sortlist(struct apattern **sortlist, size_t *nsort, + const char *str) { - ares__buf_t *buf = NULL; - ares__llist_t *list = NULL; - ares_status_t status = ARES_SUCCESS; - ares__llist_node_t *node = NULL; + ares_buf_t *buf = NULL; + ares_status_t status = ARES_SUCCESS; + ares_array_t *arr = NULL; + size_t num = 0; + size_t i; if (sortlist == NULL || nsort == NULL || str == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (*sortlist != NULL) { @@ -233,22 +229,23 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, *sortlist = NULL; *nsort = 0; - buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str)); + buf = ares_buf_create_const((const unsigned char *)str, ares_strlen(str)); if (buf == NULL) { status = ARES_ENOMEM; goto done; } /* Split on space or semicolon */ - status = ares__buf_split(buf, (const unsigned char *)" ;", 2, - ARES_BUF_SPLIT_NONE, 0, &list); + status = ares_buf_split(buf, (const unsigned char *)" ;", 2, + ARES_BUF_SPLIT_NONE, 0, &arr); if (status != ARES_SUCCESS) { goto done; } - for (node = ares__llist_node_first(list); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *entry = ares__llist_node_val(node); + num = ares_array_len(arr); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(arr, i); + ares_buf_t *entry = *bufptr; struct apattern pat; @@ -262,16 +259,16 @@ ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort, } if (!sortlist_append(sortlist, nsort, &pat)) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } status = ARES_SUCCESS; done: - ares__buf_destroy(buf); - ares__llist_destroy(list); + ares_buf_destroy(buf); + ares_array_destroy(arr); if (status != ARES_SUCCESS) { ares_free(*sortlist); @@ -287,12 +284,12 @@ static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str, { if (sysconfig->domains && sysconfig->ndomains > 0) { /* if we already have some domains present, free them first */ - ares__strsplit_free(sysconfig->domains, sysconfig->ndomains); + ares_strsplit_free(sysconfig->domains, sysconfig->ndomains); sysconfig->domains = NULL; sysconfig->ndomains = 0; } - sysconfig->domains = ares__strsplit(str, ", ", &sysconfig->ndomains); + sysconfig->domains = ares_strsplit(str, ", ", &sysconfig->ndomains); if (sysconfig->domains == NULL) { return ARES_ENOMEM; } @@ -310,52 +307,45 @@ static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str, return ARES_SUCCESS; } -static ares_status_t buf_fetch_string(ares__buf_t *buf, char *str, +static ares_status_t buf_fetch_string(ares_buf_t *buf, char *str, size_t str_len) { ares_status_t status; - ares__buf_tag(buf); - ares__buf_consume(buf, ares__buf_len(buf)); + ares_buf_tag(buf); + ares_buf_consume(buf, ares_buf_len(buf)); - status = ares__buf_tag_fetch_string(buf, str, str_len); + status = ares_buf_tag_fetch_string(buf, str, str_len); return status; } -static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, - ares__buf_t *buf, const char *separators) +static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, ares_buf_t *buf, + const char *separators) { - ares_status_t status; - char lookupstr[32]; - size_t lookupstr_cnt = 0; - ares__llist_t *lookups = NULL; - ares__llist_node_t *node; - size_t separators_len = ares_strlen(separators); - - status = ares__buf_split(buf, (const unsigned char *)separators, - separators_len, ARES_BUF_SPLIT_TRIM, 0, &lookups); + ares_status_t status; + char lookupstr[32]; + size_t lookupstr_cnt = 0; + char **lookups = NULL; + size_t num = 0; + size_t i; + size_t separators_len = ares_strlen(separators); + + status = + ares_buf_split_str(buf, (const unsigned char *)separators, separators_len, + ARES_BUF_SPLIT_TRIM, 0, &lookups, &num); if (status != ARES_SUCCESS) { goto done; } - memset(lookupstr, 0, sizeof(lookupstr)); + for (i = 0; i < num; i++) { + const char *value = lookups[i]; + char ch; - for (node = ares__llist_node_first(lookups); node != NULL; - node = ares__llist_node_next(node)) { - char value[128]; - char ch; - ares__buf_t *valbuf = ares__llist_node_val(node); - - status = buf_fetch_string(valbuf, value, sizeof(value)); - if (status != ARES_SUCCESS) { - continue; - } - - if (strcasecmp(value, "dns") == 0 || strcasecmp(value, "bind") == 0 || - strcasecmp(value, "resolv") == 0 || strcasecmp(value, "resolve") == 0) { + if (ares_strcaseeq(value, "dns") || ares_strcaseeq(value, "bind") || + ares_strcaseeq(value, "resolv") || ares_strcaseeq(value, "resolve")) { ch = 'b'; - } else if (strcasecmp(value, "files") == 0 || - strcasecmp(value, "file") == 0 || - strcasecmp(value, "local") == 0) { + } else if (ares_strcaseeq(value, "files") || + ares_strcaseeq(value, "file") || + ares_strcaseeq(value, "local")) { ch = 'f'; } else { continue; @@ -368,10 +358,12 @@ static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, } if (lookupstr_cnt) { + lookupstr[lookupstr_cnt] = 0; ares_free(sysconfig->lookups); sysconfig->lookups = ares_strdup(lookupstr); if (sysconfig->lookups == NULL) { - return ARES_ENOMEM; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -381,99 +373,102 @@ static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, if (status != ARES_ENOMEM) { status = ARES_SUCCESS; } - ares__llist_destroy(lookups); + ares_free_array(lookups, num, ares_free); return status; } static ares_status_t process_option(ares_sysconfig_t *sysconfig, - ares__buf_t *option) + ares_buf_t *option) { - ares__llist_t *kv = NULL; - char key[32] = ""; - char val[32] = ""; - unsigned int valint = 0; - ares_status_t status; + char **kv = NULL; + size_t num = 0; + const char *key; + const char *val; + unsigned int valint = 0; + ares_status_t status; /* Split on : */ - status = ares__buf_split(option, (const unsigned char *)":", 1, - ARES_BUF_SPLIT_TRIM, 2, &kv); + status = ares_buf_split_str(option, (const unsigned char *)":", 1, + ARES_BUF_SPLIT_TRIM, 2, &kv, &num); if (status != ARES_SUCCESS) { goto done; } - status = buf_fetch_string(ares__llist_first_val(kv), key, sizeof(key)); - if (status != ARES_SUCCESS) { + if (num < 1) { + status = ARES_EBADSTR; goto done; } - if (ares__llist_len(kv) == 2) { - status = buf_fetch_string(ares__llist_last_val(kv), val, sizeof(val)); - if (status != ARES_SUCCESS) { - goto done; - } + + key = kv[0]; + if (num == 2) { + val = kv[1]; valint = (unsigned int)strtoul(val, NULL, 10); } - if (strcmp(key, "ndots") == 0) { + if (ares_streq(key, "ndots")) { sysconfig->ndots = valint; - } else if (strcmp(key, "retrans") == 0 || strcmp(key, "timeout") == 0) { + } else if (ares_streq(key, "retrans") || ares_streq(key, "timeout")) { if (valint == 0) { return ARES_EFORMERR; } sysconfig->timeout_ms = valint * 1000; - } else if (strcmp(key, "retry") == 0 || strcmp(key, "attempts") == 0) { + } else if (ares_streq(key, "retry") || ares_streq(key, "attempts")) { if (valint == 0) { return ARES_EFORMERR; } sysconfig->tries = valint; - } else if (strcmp(key, "rotate") == 0) { + } else if (ares_streq(key, "rotate")) { sysconfig->rotate = ARES_TRUE; - } else if (strcmp(key, "use-vc") == 0 || strcmp(key, "usevc") == 0) { + } else if (ares_streq(key, "use-vc") || ares_streq(key, "usevc")) { sysconfig->usevc = ARES_TRUE; } done: - ares__llist_destroy(kv); + ares_free_array(kv, num, ares_free); return status; } -static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str) +ares_status_t ares_sysconfig_set_options(ares_sysconfig_t *sysconfig, + const char *str) { - ares__buf_t *buf = NULL; - ares__llist_t *options = NULL; - ares_status_t status; - ares__llist_node_t *node; + ares_buf_t *buf = NULL; + ares_array_t *options = NULL; + size_t num; + size_t i; + ares_status_t status; - buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str)); + buf = ares_buf_create_const((const unsigned char *)str, ares_strlen(str)); if (buf == NULL) { return ARES_ENOMEM; } - status = ares__buf_split(buf, (const unsigned char *)" \t", 2, - ARES_BUF_SPLIT_TRIM, 0, &options); + status = ares_buf_split(buf, (const unsigned char *)" \t", 2, + ARES_BUF_SPLIT_TRIM, 0, &options); if (status != ARES_SUCCESS) { goto done; } - for (node = ares__llist_node_first(options); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *valbuf = ares__llist_node_val(node); + num = ares_array_len(options); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(options, i); + ares_buf_t *valbuf = *bufptr; status = process_option(sysconfig, valbuf); /* Out of memory is the only fatal condition */ if (status == ARES_ENOMEM) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } status = ARES_SUCCESS; done: - ares__llist_destroy(options); - ares__buf_destroy(buf); + ares_array_destroy(options); + ares_buf_destroy(buf); return status; } -ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) +ares_status_t ares_init_by_environment(ares_sysconfig_t *sysconfig) { const char *localdomain; const char *res_options; @@ -483,7 +478,7 @@ ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) if (localdomain) { char *temp = ares_strdup(localdomain); if (temp == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } status = config_search(sysconfig, temp, 1); ares_free(temp); @@ -494,7 +489,7 @@ ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) res_options = getenv("RES_OPTIONS"); if (res_options) { - status = set_options(sysconfig, res_options); + status = ares_sysconfig_set_options(sysconfig, res_options); if (status != ARES_SUCCESS) { return status; } @@ -554,70 +549,71 @@ ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig) /* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other * conditions are ignored. Users may mess up config files, but we want to * process anything we can. */ -static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig, - ares__buf_t *line) +ares_status_t ares_sysconfig_parse_resolv_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line) { char option[32]; char value[512]; ares_status_t status = ARES_SUCCESS; /* Ignore lines beginning with a comment */ - if (ares__buf_begins_with(line, (const unsigned char *)"#", 1) || - ares__buf_begins_with(line, (const unsigned char *)";", 1)) { + if (ares_buf_begins_with(line, (const unsigned char *)"#", 1) || + ares_buf_begins_with(line, (const unsigned char *)";", 1)) { return ARES_SUCCESS; } - ares__buf_tag(line); + ares_buf_tag(line); /* Shouldn't be possible, but if it happens, ignore the line. */ - if (ares__buf_consume_nonwhitespace(line) == 0) { + if (ares_buf_consume_nonwhitespace(line) == 0) { return ARES_SUCCESS; } - status = ares__buf_tag_fetch_string(line, option, sizeof(option)); + status = ares_buf_tag_fetch_string(line, option, sizeof(option)); if (status != ARES_SUCCESS) { return ARES_SUCCESS; } - ares__buf_consume_whitespace(line, ARES_TRUE); + ares_buf_consume_whitespace(line, ARES_TRUE); status = buf_fetch_string(line, value, sizeof(value)); if (status != ARES_SUCCESS) { return ARES_SUCCESS; } - ares__str_trim(value); + ares_str_trim(value); if (*value == 0) { return ARES_SUCCESS; } /* At this point we have a string option and a string value, both trimmed * of leading and trailing whitespace. Lets try to evaluate them */ - if (strcmp(option, "domain") == 0) { + if (ares_streq(option, "domain")) { /* Domain is legacy, don't overwrite an existing config set by search */ if (sysconfig->domains == NULL) { status = config_search(sysconfig, value, 1); } - } else if (strcmp(option, "lookup") == 0 || - strcmp(option, "hostresorder") == 0) { - ares__buf_tag_rollback(line); + } else if (ares_streq(option, "lookup") || + ares_streq(option, "hostresorder")) { + ares_buf_tag_rollback(line); status = config_lookup(sysconfig, line, " \t"); - } else if (strcmp(option, "search") == 0) { + } else if (ares_streq(option, "search")) { status = config_search(sysconfig, value, 0); - } else if (strcmp(option, "nameserver") == 0) { - status = - ares__sconfig_append_fromstr(&sysconfig->sconfig, value, ARES_TRUE); - } else if (strcmp(option, "sortlist") == 0) { + } else if (ares_streq(option, "nameserver")) { + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, value, + ARES_TRUE); + } else if (ares_streq(option, "sortlist")) { /* Ignore all failures except ENOMEM. If the sysadmin set a bad * sortlist, just ignore the sortlist, don't cause an inoperable * channel */ status = - ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value); + ares_parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value); if (status != ARES_ENOMEM) { status = ARES_SUCCESS; } - } else if (strcmp(option, "options") == 0) { - status = set_options(sysconfig, value); + } else if (ares_streq(option, "options")) { + status = ares_sysconfig_set_options(sysconfig, value); } return status; @@ -626,44 +622,51 @@ static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig, /* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other * conditions are ignored. Users may mess up config files, but we want to * process anything we can. */ -static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig, - ares__buf_t *line) +static ares_status_t parse_nsswitch_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line) { - char option[32]; - ares__buf_t *buf; - ares_status_t status = ARES_SUCCESS; - ares__llist_t *sects = NULL; + char option[32]; + ares_status_t status = ARES_SUCCESS; + ares_array_t *sects = NULL; + ares_buf_t **bufptr; + ares_buf_t *buf; + + (void)channel; /* Ignore lines beginning with a comment */ - if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) { + if (ares_buf_begins_with(line, (const unsigned char *)"#", 1)) { return ARES_SUCCESS; } /* database : values (space delimited) */ - status = ares__buf_split(line, (const unsigned char *)":", 1, - ARES_BUF_SPLIT_TRIM, 2, §s); + status = ares_buf_split(line, (const unsigned char *)":", 1, + ARES_BUF_SPLIT_TRIM, 2, §s); - if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) { + if (status != ARES_SUCCESS || ares_array_len(sects) != 2) { goto done; } - buf = ares__llist_first_val(sects); + bufptr = ares_array_at(sects, 0); + buf = *bufptr; + status = buf_fetch_string(buf, option, sizeof(option)); if (status != ARES_SUCCESS) { goto done; } /* Only support "hosts:" */ - if (strcmp(option, "hosts") != 0) { + if (!ares_streq(option, "hosts")) { goto done; } /* Values are space separated */ - buf = ares__llist_last_val(sects); + bufptr = ares_array_at(sects, 1); + buf = *bufptr; status = config_lookup(sysconfig, buf, " \t"); done: - ares__llist_destroy(sects); + ares_array_destroy(sects); if (status != ARES_ENOMEM) { status = ARES_SUCCESS; } @@ -673,52 +676,88 @@ static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig, /* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other * conditions are ignored. Users may mess up config files, but we want to * process anything we can. */ -static ares_status_t parse_svcconf_line(ares_sysconfig_t *sysconfig, - ares__buf_t *line) +static ares_status_t parse_svcconf_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line) { - char option[32]; - ares__buf_t *buf; - ares_status_t status = ARES_SUCCESS; - ares__llist_t *sects = NULL; + char option[32]; + ares_buf_t **bufptr; + ares_buf_t *buf; + ares_status_t status = ARES_SUCCESS; + ares_array_t *sects = NULL; + + (void)channel; /* Ignore lines beginning with a comment */ - if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) { + if (ares_buf_begins_with(line, (const unsigned char *)"#", 1)) { return ARES_SUCCESS; } /* database = values (comma delimited)*/ - status = ares__buf_split(line, (const unsigned char *)"=", 1, - ARES_BUF_SPLIT_TRIM, 2, §s); + status = ares_buf_split(line, (const unsigned char *)"=", 1, + ARES_BUF_SPLIT_TRIM, 2, §s); - if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) { + if (status != ARES_SUCCESS || ares_array_len(sects) != 2) { goto done; } - buf = ares__llist_first_val(sects); + bufptr = ares_array_at(sects, 0); + buf = *bufptr; status = buf_fetch_string(buf, option, sizeof(option)); if (status != ARES_SUCCESS) { goto done; } /* Only support "hosts=" */ - if (strcmp(option, "hosts") != 0) { + if (!ares_streq(option, "hosts")) { goto done; } /* Values are comma separated */ - buf = ares__llist_last_val(sects); + bufptr = ares_array_at(sects, 1); + buf = *bufptr; status = config_lookup(sysconfig, buf, ","); done: - ares__llist_destroy(sects); + ares_array_destroy(sects); if (status != ARES_ENOMEM) { status = ARES_SUCCESS; } return status; } -typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig, - ares__buf_t *line); + +ares_status_t ares_sysconfig_process_buf(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *buf, + ares_sysconfig_line_cb_t cb) +{ + ares_array_t *lines = NULL; + size_t num; + size_t i; + ares_status_t status; + + status = ares_buf_split(buf, (const unsigned char *)"\n", 1, + ARES_BUF_SPLIT_TRIM, 0, &lines); + if (status != ARES_SUCCESS) { + goto done; + } + + num = ares_array_len(lines); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(lines, i); + ares_buf_t *line = *bufptr; + + status = cb(channel, sysconfig, line); + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + ares_array_destroy(lines); + return status; +} /* Should only return: * ARES_ENOTFOUND - file not found @@ -727,79 +766,68 @@ typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig, * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good * file, but we're not erroring out if we can't parse * something (or anything at all) */ -static ares_status_t process_config_lines(const char *filename, - ares_sysconfig_t *sysconfig, - line_callback_t cb) +static ares_status_t process_config_lines(const ares_channel_t *channel, + const char *filename, + ares_sysconfig_t *sysconfig, + ares_sysconfig_line_cb_t cb) { - ares_status_t status = ARES_SUCCESS; - ares__llist_node_t *node; - ares__llist_t *lines = NULL; - ares__buf_t *buf = NULL; + ares_status_t status = ARES_SUCCESS; + ares_buf_t *buf = NULL; - buf = ares__buf_create(); + buf = ares_buf_create(); if (buf == NULL) { status = ARES_ENOMEM; goto done; } - status = ares__buf_load_file(filename, buf); + status = ares_buf_load_file(filename, buf); if (status != ARES_SUCCESS) { goto done; } - status = ares__buf_split(buf, (const unsigned char *)"\n", 1, - ARES_BUF_SPLIT_TRIM, 0, &lines); - if (status != ARES_SUCCESS) { - goto done; - } - - for (node = ares__llist_node_first(lines); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *line = ares__llist_node_val(node); - - status = cb(sysconfig, line); - if (status != ARES_SUCCESS) { - goto done; - } - } + status = ares_sysconfig_process_buf(channel, sysconfig, buf, cb); done: - ares__buf_destroy(buf); - ares__llist_destroy(lines); + ares_buf_destroy(buf); return status; } -ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig) +ares_status_t ares_init_sysconfig_files(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_bool_t process_resolvconf) { ares_status_t status = ARES_SUCCESS; /* Resolv.conf */ - status = process_config_lines((channel->resolvconf_path != NULL) - ? channel->resolvconf_path - : PATH_RESOLV_CONF, - sysconfig, parse_resolvconf_line); - if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { - goto done; + if (process_resolvconf) { + status = process_config_lines(channel, + (channel->resolvconf_path != NULL) + ? channel->resolvconf_path + : PATH_RESOLV_CONF, + sysconfig, ares_sysconfig_parse_resolv_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; + } } /* Nsswitch.conf */ - status = - process_config_lines("/etc/nsswitch.conf", sysconfig, parse_nsswitch_line); + status = process_config_lines(channel, "/etc/nsswitch.conf", sysconfig, + parse_nsswitch_line); if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { goto done; } /* netsvc.conf */ - status = - process_config_lines("/etc/netsvc.conf", sysconfig, parse_svcconf_line); + status = process_config_lines(channel, "/etc/netsvc.conf", sysconfig, + parse_svcconf_line); if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { goto done; } /* svc.conf */ - status = process_config_lines("/etc/svc.conf", sysconfig, parse_svcconf_line); + status = process_config_lines(channel, "/etc/svc.conf", sysconfig, + parse_svcconf_line); if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { goto done; } diff --git a/deps/cares/src/lib/ares_sysconfig_mac.c b/deps/cares/src/lib/ares_sysconfig_mac.c new file mode 100644 index 00000000000000..4d46ffd58df53b --- /dev/null +++ b/deps/cares/src/lib/ares_sysconfig_mac.c @@ -0,0 +1,373 @@ +/* MIT License + * + * Copyright (c) 2024 The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#ifdef __APPLE__ + +/* The DNS configuration for apple is stored in the system configuration + * database. Apple does provide an emulated `/etc/resolv.conf` on MacOS (but + * not iOS), it cannot, however, represent the entirety of the DNS + * configuration. Alternatively, libresolv could be used to also retrieve some + * system configuration, but it too is not capable of retrieving the entirety + * of the DNS configuration. + * + * Attempts to use the preferred public API of `SCDynamicStoreCreate()` and + * friends yielded incomplete DNS information. Instead, that leaves some apple + * "internal" symbols from `configd` that we need to access in order to get the + * entire configuration. We can see that we're not the only ones to do this as + * Google Chrome also does: + * https://chromium.googlesource.com/chromium/src/+/HEAD/net/dns/dns_config_watcher_mac.cc + * These internal functions are what `libresolv` and `scutil` use to retrieve + * the dns configuration. Since these symbols are not publicly available, we + * will dynamically load the symbols from `libSystem` and import the `dnsinfo.h` + * private header extracted from: + * https://opensource.apple.com/source/configd/configd-1109.140.1/dnsinfo/dnsinfo.h + */ + +/* The apple header uses anonymous unions which came with C11 */ +# if defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wc11-extensions" +# endif + +# include "ares_private.h" +# include <stdio.h> +# include <stdlib.h> +# include <string.h> +# include <dlfcn.h> +# include <arpa/inet.h> +# include "thirdparty/apple/dnsinfo.h" +# include <AvailabilityMacros.h> +# if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 /* MacOS 10.8 */ +# include <SystemConfiguration/SCNetworkConfiguration.h> +# endif + +typedef struct { + void *handle; + dns_config_t *(*dns_configuration_copy)(void); + void (*dns_configuration_free)(dns_config_t *config); +} dnsinfo_t; + +static void dnsinfo_destroy(dnsinfo_t *dnsinfo) +{ + if (dnsinfo == NULL) { + return; + } + + if (dnsinfo->handle) { + dlclose(dnsinfo->handle); + } + + ares_free(dnsinfo); +} + +static ares_status_t dnsinfo_init(dnsinfo_t **dnsinfo_out) +{ + dnsinfo_t *dnsinfo = NULL; + ares_status_t status = ARES_SUCCESS; + size_t i; + const char *searchlibs[] = { + "/usr/lib/libSystem.dylib", + "/System/Library/Frameworks/SystemConfiguration.framework/" + "SystemConfiguration", + NULL + }; + + if (dnsinfo_out == NULL) { + status = ARES_EFORMERR; + goto done; + } + + *dnsinfo_out = NULL; + + dnsinfo = ares_malloc_zero(sizeof(*dnsinfo)); + if (dnsinfo == NULL) { + status = ARES_ENOMEM; + goto done; + } + + for (i = 0; searchlibs[i] != NULL; i++) { + dnsinfo->handle = dlopen(searchlibs[i], RTLD_LAZY /* | RTLD_NOLOAD */); + if (dnsinfo->handle == NULL) { + /* Fail, loop */ + continue; + } + + dnsinfo->dns_configuration_copy = (dns_config_t * (*)(void)) + dlsym(dnsinfo->handle, "dns_configuration_copy"); + + dnsinfo->dns_configuration_free = (void (*)(dns_config_t *))dlsym( + dnsinfo->handle, "dns_configuration_free"); + + if (dnsinfo->dns_configuration_copy != NULL && + dnsinfo->dns_configuration_free != NULL) { + break; + } + + /* Fail, loop */ + dlclose(dnsinfo->handle); + dnsinfo->handle = NULL; + } + + + if (dnsinfo->dns_configuration_copy == NULL || + dnsinfo->dns_configuration_free == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + +done: + if (status == ARES_SUCCESS) { + *dnsinfo_out = dnsinfo; + } else { + dnsinfo_destroy(dnsinfo); + } + + return status; +} + +static ares_bool_t search_is_duplicate(const ares_sysconfig_t *sysconfig, + const char *name) +{ + size_t i; + for (i = 0; i < sysconfig->ndomains; i++) { + if (ares_strcaseeq(sysconfig->domains[i], name)) { + return ARES_TRUE; + } + } + return ARES_FALSE; +} + +static ares_status_t read_resolver(const ares_channel_t *channel, + const dns_resolver_t *resolver, + ares_sysconfig_t *sysconfig) +{ + int i; + unsigned short port = 0; + ares_status_t status = ARES_SUCCESS; + +# if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 /* MacOS 10.8 */ + /* XXX: resolver->domain is for domain-specific servers. When we implement + * this support, we'll want to use this. But for now, we're going to + * skip any servers which set this since we can't properly route. + * MacOS used to use this setting for a different purpose in the + * past however, so on versions of MacOS < 10.8 just ignore this + * completely. */ + if (resolver->domain != NULL) { + return ARES_SUCCESS; + } +# endif + +# if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 /* MacOS 10.8 */ + /* Check to see if DNS server should be used, base this on if the server is + * reachable or can be reachable automatically if we send traffic that + * direction. */ + if (!(resolver->reach_flags & + (kSCNetworkFlagsReachable | + kSCNetworkReachabilityFlagsConnectionOnTraffic))) { + return ARES_SUCCESS; + } +# endif + + /* NOTE: it doesn't look like resolver->flags is relevant */ + + /* If there's no nameservers, nothing to do */ + if (resolver->n_nameserver <= 0) { + return ARES_SUCCESS; + } + + /* Default port */ + port = resolver->port; + + /* Append search list */ + if (resolver->n_search > 0) { + char **new_domains = ares_realloc_zero( + sysconfig->domains, sizeof(*sysconfig->domains) * sysconfig->ndomains, + sizeof(*sysconfig->domains) * + (sysconfig->ndomains + (size_t)resolver->n_search)); + if (new_domains == NULL) { + return ARES_ENOMEM; + } + sysconfig->domains = new_domains; + + for (i = 0; i < resolver->n_search; i++) { + const char *search; + /* UBSAN: copy pointer using memcpy due to misalignment */ + memcpy(&search, resolver->search + i, sizeof(search)); + + /* Skip duplicates */ + if (search_is_duplicate(sysconfig, search)) { + continue; + } + sysconfig->domains[sysconfig->ndomains] = ares_strdup(search); + if (sysconfig->domains[sysconfig->ndomains] == NULL) { + return ARES_ENOMEM; + } + sysconfig->ndomains++; + } + } + + /* NOTE: we're going to skip importing the sort addresses for now. Its + * likely not used, its not obvious how to even configure such a thing. + */ +# if 0 + for (i=0; i<resolver->n_sortaddr; i++) { + char val[256]; + inet_ntop(AF_INET, &resolver->sortaddr[i]->address, val, sizeof(val)); + printf("\t\t%s/", val); + inet_ntop(AF_INET, &resolver->sortaddr[i]->mask, val, sizeof(val)); + printf("%s\n", val); + } +# endif + + if (resolver->options != NULL) { + status = ares_sysconfig_set_options(sysconfig, resolver->options); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* NOTE: + * - resolver->timeout appears unused, always 0, so we ignore this + * - resolver->service_identifier doesn't appear relevant to us + * - resolver->cid also isn't relevant + * - resolver->if_name we won't use since it isn't available in MacOS 10.8 + * or earlier, use resolver->if_index instead to then lookup the name. + */ + + /* XXX: resolver->search_order appears like it might be relevant, we might + * need to sort the resulting list by this metric if we find in the future we + * need to. That said, due to the automatic re-sorting we do, I'm not sure it + * matters. Here's an article on this search order stuff: + * https://www.cnet.com/tech/computing/os-x-10-6-3-and-dns-server-priority-changes/ + */ + + for (i = 0; i < resolver->n_nameserver; i++) { + struct ares_addr addr; + unsigned short addrport; + const struct sockaddr *sockaddr; + char if_name_str[256] = ""; + const char *if_name = NULL; + + /* UBSAN alignment workaround to fetch memory address */ + memcpy(&sockaddr, resolver->nameserver + i, sizeof(sockaddr)); + + if (!ares_sockaddr_to_ares_addr(&addr, &addrport, sockaddr)) { + continue; + } + + if (addrport == 0) { + addrport = port; + } + + if (channel->sock_funcs.aif_indextoname != NULL) { + if_name = channel->sock_funcs.aif_indextoname( + resolver->if_index, if_name_str, sizeof(if_name_str), + channel->sock_func_cb_data); + } + + status = ares_sconfig_append(channel, &sysconfig->sconfig, &addr, addrport, + addrport, if_name); + if (status != ARES_SUCCESS) { + return status; + } + } + + return status; +} + +static ares_status_t read_resolvers(const ares_channel_t *channel, + dns_resolver_t **resolvers, int nresolvers, + ares_sysconfig_t *sysconfig) +{ + ares_status_t status = ARES_SUCCESS; + int i; + + for (i = 0; status == ARES_SUCCESS && i < nresolvers; i++) { + const dns_resolver_t *resolver_ptr; + + /* UBSAN doesn't like that this is unaligned, lets use memcpy to get the + * address. Equivalent to: + * resolver = resolvers[i] + */ + memcpy(&resolver_ptr, resolvers + i, sizeof(resolver_ptr)); + + status = read_resolver(channel, resolver_ptr, sysconfig); + } + + return status; +} + +ares_status_t ares_init_sysconfig_macos(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + dnsinfo_t *dnsinfo = NULL; + dns_config_t *sc_dns = NULL; + ares_status_t status = ARES_SUCCESS; + + status = dnsinfo_init(&dnsinfo); + + if (status != ARES_SUCCESS) { + goto done; + } + + sc_dns = dnsinfo->dns_configuration_copy(); + if (sc_dns == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + /* There are `resolver`, `scoped_resolver`, and `service_specific_resolver` + * settings. The `scoped_resolver` settings appear to be already available via + * the `resolver` settings and likely are only relevant to link-local dns + * servers which we can already detect via the address itself, so we'll ignore + * the `scoped_resolver` section. It isn't clear what the + * `service_specific_resolver` is used for, I haven't personally seen it + * in use so we'll ignore this until at some point where we find we need it. + * Likely this wasn't available via `/etc/resolv.conf` nor `libresolv` anyhow + * so its not worse to prior configuration methods, worst case. */ + + status = + read_resolvers(channel, sc_dns->resolver, sc_dns->n_resolver, sysconfig); + +done: + if (dnsinfo) { + dnsinfo->dns_configuration_free(sc_dns); + dnsinfo_destroy(dnsinfo); + } + return status; +} + +# if defined(__clang__) +# pragma GCC diagnostic pop +# endif + +#else + +/* Prevent compiler warnings due to empty translation unit */ +typedef int make_iso_compilers_happy; + +#endif diff --git a/deps/cares/src/lib/ares_sysconfig_win.c b/deps/cares/src/lib/ares_sysconfig_win.c new file mode 100644 index 00000000000000..35f4bd8e72ac9c --- /dev/null +++ b/deps/cares/src/lib/ares_sysconfig_win.c @@ -0,0 +1,652 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) 2007 Daniel Stenberg + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif + +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif + +#ifdef HAVE_ARPA_INET_H +# include <arpa/inet.h> +#endif + +#if defined(USE_WINSOCK) +# if defined(HAVE_IPHLPAPI_H) +# include <iphlpapi.h> +# endif +# if defined(HAVE_NETIOAPI_H) +# include <netioapi.h> +# endif +#endif + +#include "ares_inet_net_pton.h" + +#if defined(USE_WINSOCK) + +# define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP" +# define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient" +# define WIN_NT_DNSCLIENT \ + "Software\\Policies\\Microsoft\\Windows NT\\DNSClient" +# define NAMESERVER "NameServer" +# define DHCPNAMESERVER "DhcpNameServer" +# define SEARCHLIST_KEY L"SearchList" +# define PRIMARYDNSSUFFIX_KEY L"PrimaryDNSSuffix" +# define INTERFACES_KEY "Interfaces" +# define DOMAIN_KEY L"Domain" +# define DHCPDOMAIN_KEY L"DhcpDomain" + +/* + * get_REG_SZ() + * + * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer + * to the name of the registry leaf key to be queried, fetch it's string + * value and return a pointer in *outptr to a newly allocated memory area + * holding it as a null-terminated string. + * + * Returns 0 and nullifies *outptr upon inability to return a string value. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Supported on Windows NT 3.5 and newer. + */ +static ares_bool_t get_REG_SZ(HKEY hKey, const WCHAR *leafKeyName, char **outptr) +{ + DWORD size = 0; + int res; + int len; + WCHAR *val = NULL; + + *outptr = NULL; + + /* Find out size of string stored in registry */ + res = RegQueryValueExW(hKey, leafKeyName, 0, NULL, NULL, &size); + if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) { + return ARES_FALSE; + } + + /* Allocate buffer of indicated size plus one given that string + might have been stored without null termination */ + val = ares_malloc_zero(size + sizeof(WCHAR)); + if (val == NULL) { + return ARES_FALSE; + } + + /* Get the value for real */ + res = RegQueryValueExW(hKey, leafKeyName, 0, NULL, (BYTE *)val, &size); + if (res != ERROR_SUCCESS || size == 1) { + ares_free(val); + return ARES_FALSE; + } + + /* Convert to UTF8 */ + len = WideCharToMultiByte(CP_UTF8, 0, val, -1, NULL, 0, NULL, NULL); + if (len == 0) { + return ARES_FALSE; + } + *outptr = ares_malloc_zero((size_t)len + 1); + if (WideCharToMultiByte(CP_UTF8, 0, val, -1, *outptr, len, NULL, NULL) + == 0) { + ares_free(*outptr); + *outptr = NULL; + return ARES_FALSE; + } + + return ARES_TRUE; +} + +static void commanjoin(char **dst, const char * const src, const size_t len) +{ + char *newbuf; + size_t newsize; + + /* 1 for terminating 0 and 2 for , and terminating 0 */ + newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1); + newbuf = ares_realloc(*dst, newsize); + if (!newbuf) { + return; + } + if (*dst == NULL) { + *newbuf = '\0'; + } + *dst = newbuf; + if (ares_strlen(*dst) != 0) { + strcat(*dst, ","); + } + strncat(*dst, src, len); +} + +/* + * commajoin() + * + * RTF code. + */ +static void commajoin(char **dst, const char *src) +{ + commanjoin(dst, src, ares_strlen(src)); +} + +static void commajoin_asciionly(char **dst, const char *src) +{ + if (!ares_str_isprint(src, ares_strlen(src))) { + return; + } + commanjoin(dst, src, ares_strlen(src)); +} + +/* A structure to hold the string form of IPv4 and IPv6 addresses so we can + * sort them by a metric. + */ +typedef struct { + /* The metric we sort them by. */ + ULONG metric; + + /* Original index of the item, used as a secondary sort parameter to make + * qsort() stable if the metrics are equal */ + size_t orig_idx; + + /* Room enough for the string form of any IPv4 or IPv6 address that + * ares_inet_ntop() will create. Based on the existing c-ares practice. + */ + char text[INET6_ADDRSTRLEN + 8 + 64]; /* [%s]:NNNNN%iface */ +} Address; + +/* Sort Address values \a left and \a right by metric, returning the usual + * indicators for qsort(). + */ +static int compareAddresses(const void *arg1, const void *arg2) +{ + const Address * const left = arg1; + const Address * const right = arg2; + /* Lower metric the more preferred */ + if (left->metric < right->metric) { + return -1; + } + if (left->metric > right->metric) { + return 1; + } + /* If metrics are equal, lower original index more preferred */ + if (left->orig_idx < right->orig_idx) { + return -1; + } + if (left->orig_idx > right->orig_idx) { + return 1; + } + return 0; +} + +#if defined(HAVE_GETBESTROUTE2) && !defined(__WATCOMC__) +/* There can be multiple routes to "the Internet". And there can be different + * DNS servers associated with each of the interfaces that offer those routes. + * We have to assume that any DNS server can serve any request. But, some DNS + * servers may only respond if requested over their associated interface. But + * we also want to use "the preferred route to the Internet" whenever possible + * (and not use DNS servers on a non-preferred route even by forcing request + * to go out on the associated non-preferred interface). i.e. We want to use + * the DNS servers associated with the same interface that we would use to + * make a general request to anything else. + * + * But, Windows won't sort the DNS servers by the metrics associated with the + * routes and interfaces _even_ though it obviously sends IP packets based on + * those same routes and metrics. So, we must do it ourselves. + * + * So, we sort the DNS servers by the same metric values used to determine how + * an outgoing IP packet will go, thus effectively using the DNS servers + * associated with the interface that the DNS requests themselves will + * travel. This gives us optimal routing and avoids issues where DNS servers + * won't respond to requests that don't arrive via some specific subnetwork + * (and thus some specific interface). + * + * This function computes the metric we use to sort. On the interface + * identified by \a luid, it determines the best route to \a dest and combines + * that route's metric with \a interfaceMetric to compute a metric for the + * destination address on that interface. This metric can be used as a weight + * to sort the DNS server addresses associated with each interface (lower is + * better). + * + * Note that by restricting the route search to the specific interface with + * which the DNS servers are associated, this function asks the question "What + * is the metric for sending IP packets to this DNS server?" which allows us + * to sort the DNS servers correctly. + */ +static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */ + const SOCKADDR_INET * const dest, + const ULONG interfaceMetric) +{ + MIB_IPFORWARD_ROW2 row; + SOCKADDR_INET ignored; + if (GetBestRoute2(/* The interface to use. The index is ignored since we are + * passing a LUID. + */ + luid, 0, + /* No specific source address. */ + NULL, + /* Our destination address. */ + dest, + /* No options. */ + 0, + /* The route row. */ + &row, + /* The best source address, which we don't need. */ + &ignored) != NO_ERROR + /* If the metric is "unused" (-1) or too large for us to add the two + * metrics, use the worst possible, thus sorting this last. + */ + || row.Metric == (ULONG)-1 || + row.Metric > ((ULONG)-1) - interfaceMetric) { + /* Return the worst possible metric. */ + return (ULONG)-1; + } + + /* Return the metric value from that row, plus the interface metric. + * + * See + * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx + * which describes the combination as a "sum". + */ + return row.Metric + interfaceMetric; +} +#endif + +/* + * get_DNS_Windows() + * + * Locates DNS info using GetAdaptersAddresses() function from the Internet + * Protocol Helper (IP Helper) API. When located, this returns a pointer + * in *outptr to a newly allocated memory area holding a null-terminated + * string with a space or comma separated list of DNS IP addresses. + * + * Returns 0 and nullifies *outptr upon inability to return DNSes string. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Implementation supports Windows XP and newer. + */ +# define IPAA_INITIAL_BUF_SZ 15 * 1024 +# define IPAA_MAX_TRIES 3 + +static ares_bool_t get_DNS_Windows(char **outptr) +{ + IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr; + IP_ADAPTER_ADDRESSES *ipaa; + IP_ADAPTER_ADDRESSES *newipaa; + IP_ADAPTER_ADDRESSES *ipaaEntry; + ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ; + ULONG Bufsz = IPAA_INITIAL_BUF_SZ; + ULONG AddrFlags = 0; + int trying = IPAA_MAX_TRIES; + ULONG res; + + /* The capacity of addresses, in elements. */ + size_t addressesSize; + /* The number of elements in addresses. */ + size_t addressesIndex = 0; + /* The addresses we will sort. */ + Address *addresses; + + union { + struct sockaddr *sa; + struct sockaddr_in *sa4; + struct sockaddr_in6 *sa6; + } namesrvr; + + *outptr = NULL; + + ipaa = ares_malloc(Bufsz); + if (!ipaa) { + return ARES_FALSE; + } + + /* Start with enough room for a few DNS server addresses and we'll grow it + * as we encounter more. + */ + addressesSize = 4; + addresses = (Address *)ares_malloc(sizeof(Address) * addressesSize); + if (addresses == NULL) { + /* We need room for at least some addresses to function. */ + ares_free(ipaa); + return ARES_FALSE; + } + + /* Usually this call succeeds with initial buffer size */ + res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); + if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) { + goto done; + } + + while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) { + if (Bufsz < ReqBufsz) { + newipaa = ares_realloc(ipaa, ReqBufsz); + if (!newipaa) { + goto done; + } + Bufsz = ReqBufsz; + ipaa = newipaa; + } + res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz); + if (res == ERROR_SUCCESS) { + break; + } + } + if (res != ERROR_SUCCESS) { + goto done; + } + + for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) { + if (ipaaEntry->OperStatus != IfOperStatusUp) { + continue; + } + + /* For each interface, find any associated DNS servers as IPv4 or IPv6 + * addresses. For each found address, find the best route to that DNS + * server address _on_ _that_ _interface_ (at this moment in time) and + * compute the resulting total metric, just as Windows routing will do. + * Then, sort all the addresses found by the metric. + */ + for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; ipaDNSAddr != NULL; + ipaDNSAddr = ipaDNSAddr->Next) { + char ipaddr[INET6_ADDRSTRLEN] = ""; + + namesrvr.sa = ipaDNSAddr->Address.lpSockaddr; + + if (namesrvr.sa->sa_family == AF_INET) { + if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) || + (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) { + continue; + } + + /* Allocate room for another address, if necessary, else skip. */ + if (addressesIndex == addressesSize) { + const size_t newSize = addressesSize + 4; + Address * const newMem = + (Address *)ares_realloc(addresses, sizeof(Address) * newSize); + if (newMem == NULL) { + continue; + } + addresses = newMem; + addressesSize = newSize; + } + +# if defined(HAVE_GETBESTROUTE2) && !defined(__WATCOMC__) + /* OpenWatcom's builtin Windows SDK does not have a definition for + * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET + * as a variable. Let's work around this by returning the worst possible + * metric, but only when using the OpenWatcom compiler. + * It may be worth investigating using a different version of the Windows + * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom + * 2.0. + */ + addresses[addressesIndex].metric = getBestRouteMetric( + &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)), + ipaaEntry->Ipv4Metric); +# else + addresses[addressesIndex].metric = (ULONG)-1; +# endif + + /* Record insertion index to make qsort stable */ + addresses[addressesIndex].orig_idx = addressesIndex; + + if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, ipaddr, + sizeof(ipaddr))) { + continue; + } + snprintf(addresses[addressesIndex].text, + sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, + ntohs(namesrvr.sa4->sin_port)); + ++addressesIndex; + } else if (namesrvr.sa->sa_family == AF_INET6) { + unsigned int ll_scope = 0; + struct ares_addr addr; + + if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any, + sizeof(namesrvr.sa6->sin6_addr)) == 0) { + continue; + } + + /* Allocate room for another address, if necessary, else skip. */ + if (addressesIndex == addressesSize) { + const size_t newSize = addressesSize + 4; + Address * const newMem = + (Address *)ares_realloc(addresses, sizeof(Address) * newSize); + if (newMem == NULL) { + continue; + } + addresses = newMem; + addressesSize = newSize; + } + + /* See if its link-local */ + memset(&addr, 0, sizeof(addr)); + addr.family = AF_INET6; + memcpy(&addr.addr.addr6, &namesrvr.sa6->sin6_addr, 16); + if (ares_addr_is_linklocal(&addr)) { + ll_scope = ipaaEntry->Ipv6IfIndex; + } + +# if defined(HAVE_GETBESTROUTE2) && !defined(__WATCOMC__) + addresses[addressesIndex].metric = getBestRouteMetric( + &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)), + ipaaEntry->Ipv6Metric); +# else + addresses[addressesIndex].metric = (ULONG)-1; +# endif + + /* Record insertion index to make qsort stable */ + addresses[addressesIndex].orig_idx = addressesIndex; + + if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, ipaddr, + sizeof(ipaddr))) { + continue; + } + + if (ll_scope) { + snprintf(addresses[addressesIndex].text, + sizeof(addresses[addressesIndex].text), "[%s]:%u%%%u", + ipaddr, ntohs(namesrvr.sa6->sin6_port), ll_scope); + } else { + snprintf(addresses[addressesIndex].text, + sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr, + ntohs(namesrvr.sa6->sin6_port)); + } + ++addressesIndex; + } else { + /* Skip non-IPv4/IPv6 addresses completely. */ + continue; + } + } + } + + /* Sort all of the textual addresses by their metric (and original index if + * metrics are equal). */ + qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses); + + /* Join them all into a single string, removing duplicates. */ + { + size_t i; + for (i = 0; i < addressesIndex; ++i) { + size_t j; + /* Look for this address text appearing previously in the results. */ + for (j = 0; j < i; ++j) { + if (strcmp(addresses[j].text, addresses[i].text) == 0) { + break; + } + } + /* Iff we didn't emit this address already, emit it now. */ + if (j == i) { + /* Add that to outptr (if we can). */ + commajoin(outptr, addresses[i].text); + } + } + } + +done: + ares_free(addresses); + + if (ipaa) { + ares_free(ipaa); + } + + if (!*outptr) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +/* + * get_SuffixList_Windows() + * + * Reads the "DNS Suffix Search List" from registry and writes the list items + * whitespace separated to outptr. If the Search List is empty, the + * "Primary Dns Suffix" is written to outptr. + * + * Returns 0 and nullifies *outptr upon inability to return the suffix list. + * + * Returns 1 and sets *outptr when returning a dynamically allocated string. + * + * Implementation supports Windows Server 2003 and newer + */ +static ares_bool_t get_SuffixList_Windows(char **outptr) +{ + HKEY hKey; + HKEY hKeyEnum; + char keyName[256]; + DWORD keyNameBuffSize; + DWORD keyIdx = 0; + char *p = NULL; + + *outptr = NULL; + + /* 1. Global DNS Suffix Search List */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + get_REG_SZ(hKey, SEARCHLIST_KEY, outptr); + if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + /* 2. Connection Specific Search List composed of: + * a. Primary DNS Suffix */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKey); + } + + /* b. Interface SearchList, Domain, DhcpDomain */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, + KEY_READ, &hKey) == ERROR_SUCCESS) { + for (;;) { + keyNameBuffSize = sizeof(keyName); + if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, 0, NULL, + NULL, NULL) != ERROR_SUCCESS) { + break; + } + if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) != + ERROR_SUCCESS) { + continue; + } + /* p can be comma separated (SearchList) */ + if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) { + commajoin_asciionly(outptr, p); + ares_free(p); + p = NULL; + } + RegCloseKey(hKeyEnum); + } + RegCloseKey(hKey); + } + + return *outptr != NULL ? ARES_TRUE : ARES_FALSE; +} + +ares_status_t ares_init_sysconfig_windows(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + char *line = NULL; + ares_status_t status = ARES_SUCCESS; + + if (get_DNS_Windows(&line)) { + status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, line, + ARES_TRUE); + ares_free(line); + if (status != ARES_SUCCESS) { + goto done; + } + } + + if (get_SuffixList_Windows(&line)) { + sysconfig->domains = ares_strsplit(line, ", ", &sysconfig->ndomains); + ares_free(line); + if (sysconfig->domains == NULL) { + status = ARES_EFILE; + } + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + return status; +} +#endif diff --git a/deps/cares/src/lib/ares_timeout.c b/deps/cares/src/lib/ares_timeout.c index 4e80580b5e0aa4..0d2fdcff21f657 100644 --- a/deps/cares/src/lib/ares_timeout.c +++ b/deps/cares/src/lib/ares_timeout.c @@ -25,73 +25,127 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_LIMITS_H # include <limits.h> #endif -#include "ares.h" -#include "ares_private.h" -void ares__timeval_remaining(struct timeval *remaining, - const struct timeval *now, - const struct timeval *tout) +void ares_timeval_remaining(ares_timeval_t *remaining, + const ares_timeval_t *now, + const ares_timeval_t *tout) { memset(remaining, 0, sizeof(*remaining)); /* Expired! */ - if (tout->tv_sec < now->tv_sec || - (tout->tv_sec == now->tv_sec && tout->tv_usec < now->tv_usec)) { + if (tout->sec < now->sec || + (tout->sec == now->sec && tout->usec < now->usec)) { return; } - remaining->tv_sec = tout->tv_sec - now->tv_sec; - if (tout->tv_usec < now->tv_usec) { - remaining->tv_sec -= 1; - remaining->tv_usec = (tout->tv_usec + 1000000) - now->tv_usec; + remaining->sec = tout->sec - now->sec; + if (tout->usec < now->usec) { + remaining->sec -= 1; + remaining->usec = (tout->usec + 1000000) - now->usec; + } else { + remaining->usec = tout->usec - now->usec; + } +} + +void ares_timeval_diff(ares_timeval_t *tvdiff, const ares_timeval_t *tvstart, + const ares_timeval_t *tvstop) +{ + tvdiff->sec = tvstop->sec - tvstart->sec; + if (tvstop->usec > tvstart->usec) { + tvdiff->usec = tvstop->usec - tvstart->usec; } else { - remaining->tv_usec = tout->tv_usec - now->tv_usec; + tvdiff->sec -= 1; + tvdiff->usec = tvstop->usec + 1000000 - tvstart->usec; } } -struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv, - struct timeval *tvbuf) +static void ares_timeval_to_struct_timeval(struct timeval *tv, + const ares_timeval_t *atv) { - const struct query *query; - ares__slist_node_t *node; - struct timeval now; +#ifdef USE_WINSOCK + tv->tv_sec = (long)atv->sec; +#else + tv->tv_sec = (time_t)atv->sec; +#endif + + tv->tv_usec = (int)atv->usec; +} + +static void struct_timeval_to_ares_timeval(ares_timeval_t *atv, + const struct timeval *tv) +{ + atv->sec = (ares_int64_t)tv->tv_sec; + atv->usec = (unsigned int)tv->tv_usec; +} + +static struct timeval *ares_timeout_int(const ares_channel_t *channel, + struct timeval *maxtv, + struct timeval *tvbuf) +{ + const ares_query_t *query; + ares_slist_node_t *node; + ares_timeval_t now; + ares_timeval_t atvbuf; + ares_timeval_t amaxtv; /* The minimum timeout of all queries is always the first entry in * channel->queries_by_timeout */ - node = ares__slist_node_first(channel->queries_by_timeout); + node = ares_slist_node_first(channel->queries_by_timeout); /* no queries/timeout */ if (node == NULL) { - return maxtv; /* <-- maxtv can be null though, hrm */ + return maxtv; } - query = ares__slist_node_val(node); + query = ares_slist_node_val(node); - now = ares__tvnow(); + ares_tvnow(&now); - ares__timeval_remaining(tvbuf, &now, &query->timeout); + ares_timeval_remaining(&atvbuf, &now, &query->timeout); + + ares_timeval_to_struct_timeval(tvbuf, &atvbuf); if (maxtv == NULL) { return tvbuf; } /* Return the minimum time between maxtv and tvbuf */ + struct_timeval_to_ares_timeval(&amaxtv, maxtv); - if (tvbuf->tv_sec > maxtv->tv_sec) { + if (atvbuf.sec > amaxtv.sec) { return maxtv; } - if (tvbuf->tv_sec < maxtv->tv_sec) { + + if (atvbuf.sec < amaxtv.sec) { return tvbuf; } - if (tvbuf->tv_usec > maxtv->tv_usec) { + if (atvbuf.usec > amaxtv.usec) { return maxtv; } return tvbuf; } + +struct timeval *ares_timeout(const ares_channel_t *channel, + struct timeval *maxtv, struct timeval *tvbuf) +{ + struct timeval *rv; + + if (channel == NULL || tvbuf == NULL) { + return NULL; + } + + ares_channel_lock(channel); + + rv = ares_timeout_int(channel, maxtv, tvbuf); + + ares_channel_unlock(channel); + + return rv; +} diff --git a/deps/cares/src/lib/ares_update_servers.c b/deps/cares/src/lib/ares_update_servers.c index fce791476327c3..70a9381499f8c2 100644 --- a/deps/cares/src/lib/ares_update_servers.c +++ b/deps/cares/src/lib/ares_update_servers.c @@ -25,7 +25,7 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_ARPA_INET_H # include <arpa/inet.h> @@ -39,6 +39,9 @@ #ifdef HAVE_NET_IF_H # include <net/if.h> #endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif #if defined(USE_WINSOCK) # if defined(HAVE_IPHLPAPI_H) @@ -49,10 +52,8 @@ # endif #endif -#include "ares.h" #include "ares_data.h" #include "ares_inet_net_pton.h" -#include "ares_private.h" typedef struct { struct ares_addr addr; @@ -63,15 +64,15 @@ typedef struct { unsigned int ll_scope; } ares_sconfig_t; -static ares_bool_t ares__addr_match(const struct ares_addr *addr1, - const struct ares_addr *addr2) +static ares_bool_t ares_addr_match(const struct ares_addr *addr1, + const struct ares_addr *addr2) { if (addr1 == NULL && addr2 == NULL) { - return ARES_TRUE; + return ARES_TRUE; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (addr1 == NULL || addr2 == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (addr1->family != addr2->family) { @@ -92,9 +93,9 @@ static ares_bool_t ares__addr_match(const struct ares_addr *addr1, return ARES_FALSE; } -ares_bool_t ares__subnet_match(const struct ares_addr *addr, - const struct ares_addr *subnet, - unsigned char netmask) +ares_bool_t ares_subnet_match(const struct ares_addr *addr, + const struct ares_addr *subnet, + unsigned char netmask) { const unsigned char *addr_ptr; const unsigned char *subnet_ptr; @@ -102,7 +103,7 @@ ares_bool_t ares__subnet_match(const struct ares_addr *addr, size_t i; if (addr == NULL || subnet == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (addr->family != subnet->family) { @@ -115,7 +116,7 @@ ares_bool_t ares__subnet_match(const struct ares_addr *addr, len = 4; if (netmask > 32) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } } else if (addr->family == AF_INET6) { addr_ptr = (const unsigned char *)&addr->addr.addr6; @@ -123,10 +124,10 @@ ares_bool_t ares__subnet_match(const struct ares_addr *addr, len = 16; if (netmask > 128) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } } else { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ } for (i = 0; i < len && netmask > 0; i++) { @@ -146,7 +147,7 @@ ares_bool_t ares__subnet_match(const struct ares_addr *addr, return ARES_TRUE; } -ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr) +ares_bool_t ares_addr_is_linklocal(const struct ares_addr *addr) { struct ares_addr subnet; const unsigned char subnetaddr[16] = { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, @@ -157,7 +158,7 @@ ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr) subnet.family = AF_INET6; memcpy(&subnet.addr.addr6, subnetaddr, 16); - return ares__subnet_match(addr, &subnet, 10); + return ares_subnet_match(addr, &subnet, 10); } static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr) @@ -167,13 +168,13 @@ static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr) const unsigned char netbase[16]; unsigned char netmask; } blacklist_v6[] = { - /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a - * Site-Local scoped address prefix. These are never valid DNS servers, - * but are known to be returned at least sometimes on Windows and Android. - */ - {{ 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a + * Site-Local scoped address prefix. These are never valid DNS servers, + * but are known to be returned at least sometimes on Windows and Android. + */ + { { 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - 10} + 10 } }; size_t i; @@ -187,13 +188,60 @@ static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr) struct ares_addr subnet; subnet.family = AF_INET6; memcpy(&subnet.addr.addr6, blacklist_v6[i].netbase, 16); - if (ares__subnet_match(addr, &subnet, blacklist_v6[i].netmask)) { + if (ares_subnet_match(addr, &subnet, blacklist_v6[i].netmask)) { return ARES_TRUE; } } return ARES_FALSE; } +static ares_status_t parse_nameserver_uri(ares_buf_t *buf, + ares_sconfig_t *sconfig) +{ + ares_uri_t *uri = NULL; + ares_status_t status = ARES_SUCCESS; + const char *port; + char *ll_scope; + char hoststr[256]; + size_t addrlen; + + status = ares_uri_parse_buf(&uri, buf); + if (status != ARES_SUCCESS) { + return status; + } + + if (!ares_streq("dns", ares_uri_get_scheme(uri))) { + status = ARES_EBADSTR; + goto done; + } + + ares_strcpy(hoststr, ares_uri_get_host(uri), sizeof(hoststr)); + ll_scope = strchr(hoststr, '%'); + if (ll_scope != NULL) { + *ll_scope = 0; + ll_scope++; + ares_strcpy(sconfig->ll_iface, ll_scope, sizeof(sconfig->ll_iface)); + } + + /* Convert ip address from string to network byte order */ + sconfig->addr.family = AF_UNSPEC; + if (ares_dns_pton(hoststr, &sconfig->addr, &addrlen) == NULL) { + status = ARES_EBADSTR; + goto done; + } + + sconfig->udp_port = ares_uri_get_port(uri); + sconfig->tcp_port = sconfig->udp_port; + port = ares_uri_get_query_key(uri, "tcpport"); + if (port != NULL) { + sconfig->tcp_port = (unsigned short)atoi(port); + } + +done: + ares_uri_destroy(uri); + return status; +} + /* Parse address and port in these formats, either ipv4 or ipv6 addresses * are allowed: * ipaddr @@ -213,7 +261,7 @@ static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr) * Returns an error code on failure, else ARES_SUCCESS */ -static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) +static ares_status_t parse_nameserver(ares_buf_t *buf, ares_sconfig_t *sconfig) { ares_status_t status; char ipaddr[INET6_ADDRSTRLEN] = ""; @@ -222,57 +270,57 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) memset(sconfig, 0, sizeof(*sconfig)); /* Consume any leading whitespace */ - ares__buf_consume_whitespace(buf, ARES_TRUE); + ares_buf_consume_whitespace(buf, ARES_TRUE); /* pop off IP address. If it is in [ ] then it can be ipv4 or ipv6. If * not, ipv4 only */ - if (ares__buf_begins_with(buf, (const unsigned char *)"[", 1)) { + if (ares_buf_begins_with(buf, (const unsigned char *)"[", 1)) { /* Consume [ */ - ares__buf_consume(buf, 1); + ares_buf_consume(buf, 1); - ares__buf_tag(buf); + ares_buf_tag(buf); /* Consume until ] */ - if (ares__buf_consume_until_charset(buf, (const unsigned char *)"]", 1, - ARES_TRUE) == 0) { + if (ares_buf_consume_until_charset(buf, (const unsigned char *)"]", 1, + ARES_TRUE) == SIZE_MAX) { return ARES_EBADSTR; } - status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); + status = ares_buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); if (status != ARES_SUCCESS) { return status; } /* Skip over ] */ - ares__buf_consume(buf, 1); + ares_buf_consume(buf, 1); } else { size_t offset; /* Not in [ ], see if '.' is in first 4 characters, if it is, then its ipv4, * otherwise treat as ipv6 */ - ares__buf_tag(buf); + ares_buf_tag(buf); - offset = ares__buf_consume_until_charset(buf, (const unsigned char *)".", 1, - ARES_TRUE); - ares__buf_tag_rollback(buf); - ares__buf_tag(buf); + offset = ares_buf_consume_until_charset(buf, (const unsigned char *)".", 1, + ARES_TRUE); + ares_buf_tag_rollback(buf); + ares_buf_tag(buf); if (offset > 0 && offset < 4) { /* IPv4 */ - if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789.", - 11) == 0) { + if (ares_buf_consume_charset(buf, (const unsigned char *)"0123456789.", + 11) == 0) { return ARES_EBADSTR; } } else { /* IPv6 */ const unsigned char ipv6_charset[] = "ABCDEFabcdef0123456789.:"; - if (ares__buf_consume_charset(buf, ipv6_charset, - sizeof(ipv6_charset) - 1) == 0) { + if (ares_buf_consume_charset(buf, ipv6_charset, + sizeof(ipv6_charset) - 1) == 0) { return ARES_EBADSTR; } } - status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); + status = ares_buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr)); if (status != ARES_SUCCESS) { return status; } @@ -285,21 +333,21 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) } /* Pull off port */ - if (ares__buf_begins_with(buf, (const unsigned char *)":", 1)) { + if (ares_buf_begins_with(buf, (const unsigned char *)":", 1)) { char portstr[6]; /* Consume : */ - ares__buf_consume(buf, 1); + ares_buf_consume(buf, 1); - ares__buf_tag(buf); + ares_buf_tag(buf); /* Read numbers */ - if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789", - 10) == 0) { + if (ares_buf_consume_charset(buf, (const unsigned char *)"0123456789", + 10) == 0) { return ARES_EBADSTR; } - status = ares__buf_tag_fetch_string(buf, portstr, sizeof(portstr)); + status = ares_buf_tag_fetch_string(buf, portstr, sizeof(portstr)); if (status != ARES_SUCCESS) { return status; } @@ -309,22 +357,22 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) } /* Pull off interface modifier */ - if (ares__buf_begins_with(buf, (const unsigned char *)"%", 1)) { + if (ares_buf_begins_with(buf, (const unsigned char *)"%", 1)) { const unsigned char iface_charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789.-_\\:{}"; /* Consume % */ - ares__buf_consume(buf, 1); + ares_buf_consume(buf, 1); - ares__buf_tag(buf); + ares_buf_tag(buf); - if (ares__buf_consume_charset(buf, iface_charset, - sizeof(iface_charset) - 1) == 0) { + if (ares_buf_consume_charset(buf, iface_charset, + sizeof(iface_charset) - 1) == 0) { return ARES_EBADSTR; } - status = ares__buf_tag_fetch_string(buf, sconfig->ll_iface, - sizeof(sconfig->ll_iface)); + status = ares_buf_tag_fetch_string(buf, sconfig->ll_iface, + sizeof(sconfig->ll_iface)); if (status != ARES_SUCCESS) { return status; } @@ -332,24 +380,29 @@ static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig) /* Consume any trailing whitespace so we can bail out if there is something * after we didn't read */ - ares__buf_consume_whitespace(buf, ARES_TRUE); + ares_buf_consume_whitespace(buf, ARES_TRUE); - if (ares__buf_len(buf) != 0) { + if (ares_buf_len(buf) != 0) { return ARES_EBADSTR; } return ARES_SUCCESS; } -static ares_status_t ares__sconfig_linklocal(ares_sconfig_t *s, - const char *ll_iface) +static ares_status_t ares_sconfig_linklocal(const ares_channel_t *channel, + ares_sconfig_t *s, + const char *ll_iface) { unsigned int ll_scope = 0; + if (ares_str_isnum(ll_iface)) { char ifname[IF_NAMESIZE] = ""; ll_scope = (unsigned int)atoi(ll_iface); - if (ares__if_indextoname(ll_scope, ifname, sizeof(ifname)) == NULL) { + if (channel->sock_funcs.aif_indextoname == NULL || + channel->sock_funcs.aif_indextoname(ll_scope, ifname, sizeof(ifname), + channel->sock_func_cb_data) == + NULL) { DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n", ll_iface)); return ARES_ENOTFOUND; @@ -359,7 +412,10 @@ static ares_status_t ares__sconfig_linklocal(ares_sconfig_t *s, return ARES_SUCCESS; } - ll_scope = ares__if_nametoindex(ll_iface); + if (channel->sock_funcs.aif_nametoindex != NULL) { + ll_scope = + channel->sock_funcs.aif_nametoindex(ll_iface, channel->sock_func_cb_data); + } if (ll_scope == 0) { DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n", ll_iface)); @@ -370,17 +426,17 @@ static ares_status_t ares__sconfig_linklocal(ares_sconfig_t *s, return ARES_SUCCESS; } -ares_status_t ares__sconfig_append(ares__llist_t **sconfig, - const struct ares_addr *addr, - unsigned short udp_port, - unsigned short tcp_port, - const char *ll_iface) +ares_status_t ares_sconfig_append(const ares_channel_t *channel, + ares_llist_t **sconfig, + const struct ares_addr *addr, + unsigned short udp_port, + unsigned short tcp_port, const char *ll_iface) { ares_sconfig_t *s; ares_status_t status; if (sconfig == NULL || addr == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* Silently skip blacklisted IPv6 servers. */ @@ -390,14 +446,14 @@ ares_status_t ares__sconfig_append(ares__llist_t **sconfig, s = ares_malloc_zero(sizeof(*s)); if (s == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } if (*sconfig == NULL) { - *sconfig = ares__llist_create(ares_free); + *sconfig = ares_llist_create(ares_free); if (*sconfig == NULL) { - status = ARES_ENOMEM; - goto fail; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -405,19 +461,25 @@ ares_status_t ares__sconfig_append(ares__llist_t **sconfig, s->udp_port = udp_port; s->tcp_port = tcp_port; - /* Handle link-local enumeration */ - if (ares_strlen(ll_iface) && ares__addr_is_linklocal(&s->addr)) { - status = ares__sconfig_linklocal(s, ll_iface); - /* Silently ignore this entry */ + /* Handle link-local enumeration. If an interface is specified on a + * non-link-local address, we'll simply end up ignoring that */ + if (ares_addr_is_linklocal(&s->addr)) { + if (ares_strlen(ll_iface) == 0) { + /* Silently ignore this entry, we require an interface */ + status = ARES_SUCCESS; + goto fail; + } + status = ares_sconfig_linklocal(channel, s, ll_iface); + /* Silently ignore this entry, we can't validate the interface */ if (status != ARES_SUCCESS) { status = ARES_SUCCESS; goto fail; } } - if (ares__llist_insert_last(*sconfig, s) == NULL) { - status = ARES_ENOMEM; - goto fail; + if (ares_llist_insert_last(*sconfig, s) == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } return ARES_SUCCESS; @@ -444,36 +506,43 @@ ares_status_t ares__sconfig_append(ares__llist_t **sconfig, * * Returns an error code on failure, else ARES_SUCCESS. */ -ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, - const char *str, - ares_bool_t ignore_invalid) +ares_status_t ares_sconfig_append_fromstr(const ares_channel_t *channel, + ares_llist_t **sconfig, + const char *str, + ares_bool_t ignore_invalid) { - ares_status_t status = ARES_SUCCESS; - ares__buf_t *buf = NULL; - ares__llist_t *list = NULL; - ares__llist_node_t *node; + ares_status_t status = ARES_SUCCESS; + ares_buf_t *buf = NULL; + ares_array_t *list = NULL; + size_t num; + size_t i; /* On Windows, there may be more than one nameserver specified in the same * registry key, so we parse input as a space or comma separated list. */ - buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str)); + buf = ares_buf_create_const((const unsigned char *)str, ares_strlen(str)); if (buf == NULL) { status = ARES_ENOMEM; goto done; } - status = ares__buf_split(buf, (const unsigned char *)" ,", 2, - ARES_BUF_SPLIT_NONE, 0, &list); + status = ares_buf_split(buf, (const unsigned char *)" ,", 2, + ARES_BUF_SPLIT_NONE, 0, &list); if (status != ARES_SUCCESS) { goto done; } - for (node = ares__llist_node_first(list); node != NULL; - node = ares__llist_node_next(node)) { - ares__buf_t *entry = ares__llist_node_val(node); + num = ares_array_len(list); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(list, i); + ares_buf_t *entry = *bufptr; ares_sconfig_t s; - status = parse_nameserver(entry, &s); + status = parse_nameserver_uri(entry, &s); + if (status != ARES_SUCCESS) { + status = parse_nameserver(entry, &s); + } + if (status != ARES_SUCCESS) { if (ignore_invalid) { continue; @@ -482,24 +551,24 @@ ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig, } } - status = ares__sconfig_append(sconfig, &s.addr, s.udp_port, s.tcp_port, - s.ll_iface); + status = ares_sconfig_append(channel, sconfig, &s.addr, s.udp_port, + s.tcp_port, s.ll_iface); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } status = ARES_SUCCESS; done: - ares__llist_destroy(list); - ares__buf_destroy(buf); + ares_array_destroy(list); + ares_buf_destroy(buf); return status; } -static unsigned short ares__sconfig_get_port(const ares_channel_t *channel, - const ares_sconfig_t *s, - ares_bool_t is_tcp) +static unsigned short ares_sconfig_get_port(const ares_channel_t *channel, + const ares_sconfig_t *s, + ares_bool_t is_tcp) { unsigned short port = is_tcp ? s->tcp_port : s->udp_port; @@ -514,24 +583,24 @@ static unsigned short ares__sconfig_get_port(const ares_channel_t *channel, return port; } -static ares__slist_node_t *ares__server_find(ares_channel_t *channel, - const ares_sconfig_t *s) +static ares_slist_node_t *ares_server_find(const ares_channel_t *channel, + const ares_sconfig_t *s) { - ares__slist_node_t *node; + ares_slist_node_t *node; - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { - const struct server_state *server = ares__slist_node_val(node); + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + const ares_server_t *server = ares_slist_node_val(node); - if (!ares__addr_match(&server->addr, &s->addr)) { + if (!ares_addr_match(&server->addr, &s->addr)) { continue; } - if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) { + if (server->tcp_port != ares_sconfig_get_port(channel, s, ARES_TRUE)) { continue; } - if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) { + if (server->udp_port != ares_sconfig_get_port(channel, s, ARES_FALSE)) { continue; } @@ -540,28 +609,28 @@ static ares__slist_node_t *ares__server_find(ares_channel_t *channel, return NULL; } -static ares_bool_t ares__server_isdup(const ares_channel_t *channel, - ares__llist_node_t *s) +static ares_bool_t ares_server_isdup(const ares_channel_t *channel, + ares_llist_node_t *s) { /* Scan backwards to see if this is a duplicate */ - ares__llist_node_t *prev; - const ares_sconfig_t *server = ares__llist_node_val(s); + ares_llist_node_t *prev; + const ares_sconfig_t *server = ares_llist_node_val(s); - for (prev = ares__llist_node_prev(s); prev != NULL; - prev = ares__llist_node_prev(prev)) { - const ares_sconfig_t *p = ares__llist_node_val(prev); + for (prev = ares_llist_node_prev(s); prev != NULL; + prev = ares_llist_node_prev(prev)) { + const ares_sconfig_t *p = ares_llist_node_val(prev); - if (!ares__addr_match(&server->addr, &p->addr)) { + if (!ares_addr_match(&server->addr, &p->addr)) { continue; } - if (ares__sconfig_get_port(channel, server, ARES_TRUE) != - ares__sconfig_get_port(channel, p, ARES_TRUE)) { + if (ares_sconfig_get_port(channel, server, ARES_TRUE) != + ares_sconfig_get_port(channel, p, ARES_TRUE)) { continue; } - if (ares__sconfig_get_port(channel, server, ARES_FALSE) != - ares__sconfig_get_port(channel, p, ARES_FALSE)) { + if (ares_sconfig_get_port(channel, server, ARES_FALSE) != + ares_sconfig_get_port(channel, p, ARES_FALSE)) { continue; } @@ -571,22 +640,24 @@ static ares_bool_t ares__server_isdup(const ares_channel_t *channel, return ARES_FALSE; } -static ares_status_t ares__server_create(ares_channel_t *channel, - const ares_sconfig_t *sconfig, - size_t idx) +static ares_status_t ares_server_create(ares_channel_t *channel, + const ares_sconfig_t *sconfig, + size_t idx) { - ares_status_t status; - struct server_state *server = ares_malloc_zero(sizeof(*server)); + ares_status_t status; + ares_server_t *server = ares_malloc_zero(sizeof(*server)); if (server == NULL) { - return ARES_ENOMEM; + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } server->idx = idx; server->channel = channel; - server->udp_port = ares__sconfig_get_port(channel, sconfig, ARES_FALSE); - server->tcp_port = ares__sconfig_get_port(channel, sconfig, ARES_TRUE); + server->udp_port = ares_sconfig_get_port(channel, sconfig, ARES_FALSE); + server->tcp_port = ares_sconfig_get_port(channel, sconfig, ARES_TRUE); server->addr.family = sconfig->addr.family; + server->next_retry_time.sec = 0; + server->next_retry_time.usec = 0; if (sconfig->addr.family == AF_INET) { memcpy(&server->addr.addr.addr4, &sconfig->addr.addr.addr4, @@ -602,58 +673,46 @@ static ares_status_t ares__server_create(ares_channel_t *channel, server->ll_scope = sconfig->ll_scope; } - server->tcp_parser = ares__buf_create(); - if (server->tcp_parser == NULL) { - status = ARES_ENOMEM; - goto done; - } - - server->tcp_send = ares__buf_create(); - if (server->tcp_send == NULL) { - status = ARES_ENOMEM; - goto done; - } - - server->connections = ares__llist_create(NULL); + server->connections = ares_llist_create(NULL); if (server->connections == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - if (ares__slist_insert(channel->servers, server) == NULL) { - status = ARES_ENOMEM; - goto done; + if (ares_slist_insert(channel->servers, server) == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } status = ARES_SUCCESS; done: if (status != ARES_SUCCESS) { - ares__destroy_server(server); + ares_destroy_server(server); /* LCOV_EXCL_LINE: OutOfMemory */ } return status; } -static ares_bool_t ares__server_in_newconfig(const struct server_state *server, - ares__llist_t *srvlist) +static ares_bool_t ares_server_in_newconfig(const ares_server_t *server, + ares_llist_t *srvlist) { - ares__llist_node_t *node; + ares_llist_node_t *node; const ares_channel_t *channel = server->channel; - for (node = ares__llist_node_first(srvlist); node != NULL; - node = ares__llist_node_next(node)) { - const ares_sconfig_t *s = ares__llist_node_val(node); + for (node = ares_llist_node_first(srvlist); node != NULL; + node = ares_llist_node_next(node)) { + const ares_sconfig_t *s = ares_llist_node_val(node); - if (!ares__addr_match(&server->addr, &s->addr)) { + if (!ares_addr_match(&server->addr, &s->addr)) { continue; } - if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) { + if (server->tcp_port != ares_sconfig_get_port(channel, s, ARES_TRUE)) { continue; } - if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) { + if (server->udp_port != ares_sconfig_get_port(channel, s, ARES_FALSE)) { continue; } @@ -663,62 +722,64 @@ static ares_bool_t ares__server_in_newconfig(const struct server_state *server, return ARES_FALSE; } -static void ares__servers_remove_stale(ares_channel_t *channel, - ares__llist_t *srvlist) +static ares_bool_t ares_servers_remove_stale(ares_channel_t *channel, + ares_llist_t *srvlist) { - ares__slist_node_t *snode = ares__slist_node_first(channel->servers); + ares_bool_t stale_removed = ARES_FALSE; + ares_slist_node_t *snode = ares_slist_node_first(channel->servers); while (snode != NULL) { - ares__slist_node_t *snext = ares__slist_node_next(snode); - const struct server_state *server = ares__slist_node_val(snode); - if (!ares__server_in_newconfig(server, srvlist)) { + ares_slist_node_t *snext = ares_slist_node_next(snode); + const ares_server_t *server = ares_slist_node_val(snode); + if (!ares_server_in_newconfig(server, srvlist)) { /* This will clean up all server state via the destruction callback and * move any queries to new servers */ - ares__slist_node_destroy(snode); + ares_slist_node_destroy(snode); + stale_removed = ARES_TRUE; } snode = snext; } + return stale_removed; } -static void ares__servers_trim_single(ares_channel_t *channel) +static void ares_servers_trim_single(ares_channel_t *channel) { - while (ares__slist_len(channel->servers) > 1) { - ares__slist_node_destroy(ares__slist_node_last(channel->servers)); + while (ares_slist_len(channel->servers) > 1) { + ares_slist_node_destroy(ares_slist_node_last(channel->servers)); } } -ares_status_t ares__servers_update(ares_channel_t *channel, - ares__llist_t *server_list, - ares_bool_t user_specified) +ares_status_t ares_servers_update(ares_channel_t *channel, + ares_llist_t *server_list, + ares_bool_t user_specified) { - ares__llist_node_t *node; - size_t idx = 0; - ares_status_t status; + ares_llist_node_t *node; + size_t idx = 0; + ares_status_t status; + ares_bool_t list_changed = ARES_FALSE; if (channel == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } - ares__channel_lock(channel); - /* NOTE: a NULL or zero entry server list is considered valid due to * real-world people needing support for this for their test harnesses */ /* Add new entries */ - for (node = ares__llist_node_first(server_list); node != NULL; - node = ares__llist_node_next(node)) { - const ares_sconfig_t *sconfig = ares__llist_node_val(node); - ares__slist_node_t *snode; + for (node = ares_llist_node_first(server_list); node != NULL; + node = ares_llist_node_next(node)) { + const ares_sconfig_t *sconfig = ares_llist_node_val(node); + ares_slist_node_t *snode; - /* Don't add duplicate servers! */ - if (ares__server_isdup(channel, node)) { + /* If a server has already appeared in the list of new servers, skip it. */ + if (ares_server_isdup(channel, node)) { continue; } - snode = ares__server_find(channel, sconfig); + snode = ares_server_find(channel, sconfig); if (snode != NULL) { - struct server_state *server = ares__slist_node_val(snode); + ares_server_t *server = ares_slist_node_val(snode); /* Copy over link-local settings. Its possible some of this data has * changed, maybe ... */ @@ -732,24 +793,28 @@ ares_status_t ares__servers_update(ares_channel_t *channel, server->idx = idx; /* Index changed, reinsert node, doesn't require any memory * allocations so can't fail. */ - ares__slist_node_reinsert(snode); + ares_slist_node_reinsert(snode); } } else { - status = ares__server_create(channel, sconfig, idx); + status = ares_server_create(channel, sconfig, idx); if (status != ARES_SUCCESS) { goto done; } + + list_changed = ARES_TRUE; } idx++; } /* Remove any servers that don't exist in the current configuration */ - ares__servers_remove_stale(channel, server_list); + if (ares_servers_remove_stale(channel, server_list)) { + list_changed = ARES_TRUE; + } /* Trim to one server if ARES_FLAG_PRIMARY is set. */ if (channel->flags & ARES_FLAG_PRIMARY) { - ares__servers_trim_single(channel); + ares_servers_trim_single(channel); } if (user_specified) { @@ -757,28 +822,29 @@ ares_status_t ares__servers_update(ares_channel_t *channel, channel->optmask |= ARES_OPT_SERVERS; } - /* Clear any cached query results */ - ares__qcache_flush(channel->qcache); + /* Clear any cached query results only if the server list changed */ + if (list_changed) { + ares_qcache_flush(channel->qcache); + } status = ARES_SUCCESS; done: - ares__channel_unlock(channel); return status; } static ares_status_t - ares_addr_node_to_server_config_llist(const struct ares_addr_node *servers, - ares__llist_t **llist) + ares_addr_node_to_sconfig_llist(const struct ares_addr_node *servers, + ares_llist_t **llist) { const struct ares_addr_node *node; - ares__llist_t *s; + ares_llist_t *s; *llist = NULL; - s = ares__llist_create(ares_free); + s = ares_llist_create(ares_free); if (s == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } for (node = servers; node != NULL; node = node->next) { @@ -791,7 +857,7 @@ static ares_status_t sconfig = ares_malloc_zero(sizeof(*sconfig)); if (sconfig == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } sconfig->addr.family = node->family; @@ -803,31 +869,34 @@ static ares_status_t sizeof(sconfig->addr.addr.addr6)); } - if (ares__llist_insert_last(s, sconfig) == NULL) { - ares_free(sconfig); - goto fail; + if (ares_llist_insert_last(s, sconfig) == NULL) { + ares_free(sconfig); /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } *llist = s; return ARES_SUCCESS; +/* LCOV_EXCL_START: OutOfMemory */ fail: - ares__llist_destroy(s); + ares_llist_destroy(s); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } -static ares_status_t ares_addr_port_node_to_server_config_llist( - const struct ares_addr_port_node *servers, ares__llist_t **llist) +static ares_status_t + ares_addrpnode_to_sconfig_llist(const struct ares_addr_port_node *servers, + ares_llist_t **llist) { const struct ares_addr_port_node *node; - ares__llist_t *s; + ares_llist_t *s; *llist = NULL; - s = ares__llist_create(ares_free); + s = ares_llist_create(ares_free); if (s == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } for (node = servers; node != NULL; node = node->next) { @@ -840,7 +909,7 @@ static ares_status_t ares_addr_port_node_to_server_config_llist( sconfig = ares_malloc_zero(sizeof(*sconfig)); if (sconfig == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } sconfig->addr.family = node->family; @@ -855,32 +924,34 @@ static ares_status_t ares_addr_port_node_to_server_config_llist( sconfig->tcp_port = (unsigned short)node->tcp_port; sconfig->udp_port = (unsigned short)node->udp_port; - if (ares__llist_insert_last(s, sconfig) == NULL) { - ares_free(sconfig); - goto fail; + if (ares_llist_insert_last(s, sconfig) == NULL) { + ares_free(sconfig); /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } *llist = s; return ARES_SUCCESS; +/* LCOV_EXCL_START: OutOfMemory */ fail: - ares__llist_destroy(s); + ares_llist_destroy(s); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } -ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers, - size_t nservers, - ares__llist_t **llist) +ares_status_t ares_in_addr_to_sconfig_llist(const struct in_addr *servers, + size_t nservers, + ares_llist_t **llist) { - size_t i; - ares__llist_t *s; + size_t i; + ares_llist_t *s; *llist = NULL; - s = ares__llist_create(ares_free); + s = ares_llist_create(ares_free); if (s == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } for (i = 0; servers != NULL && i < nservers; i++) { @@ -888,43 +959,171 @@ ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers, sconfig = ares_malloc_zero(sizeof(*sconfig)); if (sconfig == NULL) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } sconfig->addr.family = AF_INET; memcpy(&sconfig->addr.addr.addr4, &servers[i], sizeof(sconfig->addr.addr.addr4)); - if (ares__llist_insert_last(s, sconfig) == NULL) { - goto fail; + if (ares_llist_insert_last(s, sconfig) == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } *llist = s; return ARES_SUCCESS; +/* LCOV_EXCL_START: OutOfMemory */ fail: - ares__llist_destroy(s); + ares_llist_destroy(s); return ARES_ENOMEM; + /* LCOV_EXCL_STOP */ } -int ares_get_servers(ares_channel_t *channel, struct ares_addr_node **servers) +static ares_bool_t ares_server_use_uri(const ares_server_t *server) +{ + /* Currently only reason to use new format is if the ports for udp and tcp + * are different */ + if (server->tcp_port != server->udp_port) { + return ARES_TRUE; + } + return ARES_FALSE; +} + +static ares_status_t ares_get_server_addr_uri(const ares_server_t *server, + ares_buf_t *buf) +{ + ares_uri_t *uri = NULL; + ares_status_t status; + char addr[INET6_ADDRSTRLEN]; + + uri = ares_uri_create(); + if (uri == NULL) { + return ARES_ENOMEM; + } + + status = ares_uri_set_scheme(uri, "dns"); + if (status != ARES_SUCCESS) { + goto done; + } + + ares_inet_ntop(server->addr.family, &server->addr.addr, addr, sizeof(addr)); + + if (ares_strlen(server->ll_iface)) { + char addr_iface[256]; + + snprintf(addr_iface, sizeof(addr_iface), "%s%%%s", addr, server->ll_iface); + status = ares_uri_set_host(uri, addr_iface); + } else { + status = ares_uri_set_host(uri, addr); + } + + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_set_port(uri, server->udp_port); + if (status != ARES_SUCCESS) { + goto done; + } + + if (server->udp_port != server->tcp_port) { + char port[6]; + snprintf(port, sizeof(port), "%d", server->tcp_port); + status = ares_uri_set_query_key(uri, "tcpport", port); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ares_uri_write_buf(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_uri_destroy(uri); + return status; +} + +/* Write out the details of a server to a buffer */ +ares_status_t ares_get_server_addr(const ares_server_t *server, ares_buf_t *buf) +{ + ares_status_t status; + char addr[INET6_ADDRSTRLEN]; + + if (ares_server_use_uri(server)) { + return ares_get_server_addr_uri(server, buf); + } + + /* ipv4addr or [ipv6addr] */ + if (server->addr.family == AF_INET6) { + status = ares_buf_append_byte(buf, '['); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + ares_inet_ntop(server->addr.family, &server->addr.addr, addr, sizeof(addr)); + + status = ares_buf_append_str(buf, addr); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + if (server->addr.family == AF_INET6) { + status = ares_buf_append_byte(buf, ']'); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* :port */ + status = ares_buf_append_byte(buf, ':'); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_num_dec(buf, server->udp_port, 0); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* %iface */ + if (ares_strlen(server->ll_iface)) { + status = ares_buf_append_byte(buf, '%'); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_str(buf, server->ll_iface); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ARES_SUCCESS; +} + +int ares_get_servers(const ares_channel_t *channel, + struct ares_addr_node **servers) { struct ares_addr_node *srvr_head = NULL; struct ares_addr_node *srvr_last = NULL; struct ares_addr_node *srvr_curr; ares_status_t status = ARES_SUCCESS; - ares__slist_node_t *node; + ares_slist_node_t *node; if (channel == NULL) { return ARES_ENODATA; } - ares__channel_lock(channel); + ares_channel_lock(channel); - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { - const struct server_state *server = ares__slist_node_val(node); + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + const ares_server_t *server = ares_slist_node_val(node); /* Allocate storage for this server node appending it to the list */ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE); @@ -957,29 +1156,29 @@ int ares_get_servers(ares_channel_t *channel, struct ares_addr_node **servers) *servers = srvr_head; - ares__channel_unlock(channel); + ares_channel_unlock(channel); return (int)status; } -int ares_get_servers_ports(ares_channel_t *channel, +int ares_get_servers_ports(const ares_channel_t *channel, struct ares_addr_port_node **servers) { struct ares_addr_port_node *srvr_head = NULL; struct ares_addr_port_node *srvr_last = NULL; struct ares_addr_port_node *srvr_curr; ares_status_t status = ARES_SUCCESS; - ares__slist_node_t *node; + ares_slist_node_t *node; if (channel == NULL) { return ARES_ENODATA; } - ares__channel_lock(channel); + ares_channel_lock(channel); - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { - const struct server_state *server = ares__slist_node_val(node); + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + const ares_server_t *server = ares_slist_node_val(node); /* Allocate storage for this server node appending it to the list */ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE); @@ -1015,29 +1214,30 @@ int ares_get_servers_ports(ares_channel_t *channel, *servers = srvr_head; - ares__channel_unlock(channel); + ares_channel_unlock(channel); return (int)status; } int ares_set_servers(ares_channel_t *channel, const struct ares_addr_node *servers) { - ares__llist_t *slist; - ares_status_t status; + ares_llist_t *slist; + ares_status_t status; if (channel == NULL) { return ARES_ENODATA; } - status = ares_addr_node_to_server_config_llist(servers, &slist); + status = ares_addr_node_to_sconfig_llist(servers, &slist); if (status != ARES_SUCCESS) { return (int)status; } - /* NOTE: lock is in ares__servers_update() */ - status = ares__servers_update(channel, slist, ARES_TRUE); + ares_channel_lock(channel); + status = ares_servers_update(channel, slist, ARES_TRUE); + ares_channel_unlock(channel); - ares__llist_destroy(slist); + ares_llist_destroy(slist); return (int)status; } @@ -1045,22 +1245,23 @@ int ares_set_servers(ares_channel_t *channel, int ares_set_servers_ports(ares_channel_t *channel, const struct ares_addr_port_node *servers) { - ares__llist_t *slist; - ares_status_t status; + ares_llist_t *slist; + ares_status_t status; if (channel == NULL) { return ARES_ENODATA; } - status = ares_addr_port_node_to_server_config_llist(servers, &slist); + status = ares_addrpnode_to_sconfig_llist(servers, &slist); if (status != ARES_SUCCESS) { return (int)status; } - /* NOTE: lock is in ares__servers_update() */ - status = ares__servers_update(channel, slist, ARES_TRUE); + ares_channel_lock(channel); + status = ares_servers_update(channel, slist, ARES_TRUE); + ares_channel_unlock(channel); - ares__llist_destroy(slist); + ares_llist_destroy(slist); return (int)status; } @@ -1069,30 +1270,32 @@ int ares_set_servers_ports(ares_channel_t *channel, /* IPv6 addresses with ports require square brackets [fe80::1]:53 */ static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv) { - ares_status_t status; - ares__llist_t *slist = NULL; + ares_status_t status; + ares_llist_t *slist = NULL; if (channel == NULL) { return ARES_ENODATA; } - /* NOTE: lock is in ares__servers_update() */ - if (ares_strlen(_csv) == 0) { /* blank all servers */ - return ares__servers_update(channel, NULL, ARES_TRUE); + ares_channel_lock(channel); + status = ares_servers_update(channel, NULL, ARES_TRUE); + ares_channel_unlock(channel); + return status; } - status = ares__sconfig_append_fromstr(&slist, _csv, ARES_FALSE); + status = ares_sconfig_append_fromstr(channel, &slist, _csv, ARES_FALSE); if (status != ARES_SUCCESS) { - ares__llist_destroy(slist); + ares_llist_destroy(slist); return status; } - /* NOTE: lock is in ares__servers_update() */ - status = ares__servers_update(channel, slist, ARES_TRUE); + ares_channel_lock(channel); + status = ares_servers_update(channel, slist, ARES_TRUE); + ares_channel_unlock(channel); - ares__llist_destroy(slist); + ares_llist_destroy(slist); return status; } @@ -1100,94 +1303,60 @@ static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv) /* We'll go ahead and honor ports anyhow */ int ares_set_servers_csv(ares_channel_t *channel, const char *_csv) { - /* NOTE: lock is in ares__servers_update() */ return (int)set_servers_csv(channel, _csv); } int ares_set_servers_ports_csv(ares_channel_t *channel, const char *_csv) { - /* NOTE: lock is in ares__servers_update() */ return (int)set_servers_csv(channel, _csv); } -char *ares_get_servers_csv(ares_channel_t *channel) +char *ares_get_servers_csv(const ares_channel_t *channel) { - ares__buf_t *buf = NULL; - char *out = NULL; - ares__slist_node_t *node; + ares_buf_t *buf = NULL; + char *out = NULL; + ares_slist_node_t *node; - ares__channel_lock(channel); + ares_channel_lock(channel); - buf = ares__buf_create(); + buf = ares_buf_create(); if (buf == NULL) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - for (node = ares__slist_node_first(channel->servers); node != NULL; - node = ares__slist_node_next(node)) { - ares_status_t status; - const struct server_state *server = ares__slist_node_val(node); - char addr[64]; + for (node = ares_slist_node_first(channel->servers); node != NULL; + node = ares_slist_node_next(node)) { + ares_status_t status; + const ares_server_t *server = ares_slist_node_val(node); - if (ares__buf_len(buf)) { - status = ares__buf_append_byte(buf, ','); + if (ares_buf_len(buf)) { + status = ares_buf_append_byte(buf, ','); if (status != ARES_SUCCESS) { - goto done; - } - } - - /* ipv4addr or [ipv6addr] */ - if (server->addr.family == AF_INET6) { - status = ares__buf_append_byte(buf, '['); - if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } - ares_inet_ntop(server->addr.family, &server->addr.addr, addr, sizeof(addr)); - - status = ares__buf_append_str(buf, addr); + status = ares_get_server_addr(server, buf); if (status != ARES_SUCCESS) { - goto done; - } - - if (server->addr.family == AF_INET6) { - status = ares__buf_append_byte(buf, ']'); - if (status != ARES_SUCCESS) { - goto done; - } - } - - /* :port */ - status = ares__buf_append_byte(buf, ':'); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares__buf_append_num_dec(buf, server->udp_port, 0); - if (status != ARES_SUCCESS) { - goto done; - } - - /* %iface */ - if (ares_strlen(server->ll_iface)) { - status = ares__buf_append_byte(buf, '%'); - if (status != ARES_SUCCESS) { - goto done; - } - - status = ares__buf_append_str(buf, server->ll_iface); - if (status != ARES_SUCCESS) { - goto done; - } + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } - out = ares__buf_finish_str(buf, NULL); + out = ares_buf_finish_str(buf, NULL); buf = NULL; done: - ares__channel_unlock(channel); - ares__buf_destroy(buf); + ares_channel_unlock(channel); + ares_buf_destroy(buf); return out; } + +void ares_set_server_state_callback(ares_channel_t *channel, + ares_server_state_callback cb, void *data) +{ + if (channel == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + channel->server_state_cb = cb; + channel->server_state_cb_data = data; +} diff --git a/deps/cares/src/lib/ares_version.c b/deps/cares/src/lib/ares_version.c index ca15fa77dcfbe6..f50f65b0d61389 100644 --- a/deps/cares/src/lib/ares_version.c +++ b/deps/cares/src/lib/ares_version.c @@ -24,8 +24,7 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" +#include "ares_private.h" const char *ares_version(int *version) { diff --git a/deps/cares/src/lib/cares.rc b/deps/cares/src/lib/cares.rc index 9275b0796bf4d5..49fa71ceec3ba9 100644 --- a/deps/cares/src/lib/cares.rc +++ b/deps/cares/src/lib/cares.rc @@ -63,7 +63,7 @@ BEGIN #endif VALUE "ProductName", "The c-ares library\0" VALUE "ProductVersion", ARES_VERSION_STR "\0" - VALUE "LegalCopyright", " " ARES_COPYRIGHT "\0" + VALUE "LegalCopyright", "Copyright (c) " ARES_COPYRIGHT "\0" VALUE "License", "https://c-ares.org/license.html\0" END END diff --git a/deps/cares/src/lib/config-dos.h b/deps/cares/src/lib/config-dos.h index 6d99bd681c4621..afbcfb2858ea0b 100644 --- a/deps/cares/src/lib/config-dos.h +++ b/deps/cares/src/lib/config-dos.h @@ -21,6 +21,7 @@ #define HAVE_RECV 1 #define HAVE_RECVFROM 1 #define HAVE_SEND 1 +#define HAVE_SENDTO 1 #define HAVE_STRDUP 1 #define HAVE_STRICMP 1 #define HAVE_STRUCT_IN6_ADDR 1 @@ -32,14 +33,13 @@ #define HAVE_TIME_H 1 #define HAVE_UNISTD_H 1 #define HAVE_WRITEV 1 - -#define NEED_MALLOC_H 1 +#define HAVE_STAT 1 +#define HAVE_MALLOC_H 1 /* Qualifiers for send(), recv(), recvfrom() and getnameinfo(). */ #define SEND_TYPE_ARG1 int -#define SEND_QUAL_ARG2 const -#define SEND_TYPE_ARG2 void * +#define SEND_TYPE_ARG2 const void * #define SEND_TYPE_ARG3 int #define SEND_TYPE_ARG4 int #define SEND_TYPE_RETV int @@ -73,7 +73,7 @@ # define HAVE_VARIADIC_MACROS_GCC 1 /* Because djgpp <= 2.03 doesn't have snprintf() etc. */ -# if (DJGPP_MINOR < 4) +# if defined(DJGPP_MINOR) && DJGPP_MINOR < 4 # define _MPRINTF_REPLACE # endif @@ -85,30 +85,30 @@ # define strerror(e) strerror_s_((e)) #endif +/* This seems odd, can DOS build without WATT32? */ #ifdef WATT32 -# define HAVE_AF_INET6 1 -# define HAVE_ARPA_INET_H 1 -# define HAVE_ARPA_NAMESER_H 1 -# define HAVE_CLOSE_S 1 -# define HAVE_GETHOSTNAME 1 -# define HAVE_NETDB_H 1 -# define HAVE_NETINET_IN_H 1 -# define HAVE_NETINET_TCP_H 1 -# define HAVE_PF_INET6 1 -# define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 -# define HAVE_STRUCT_ADDRINFO 1 -# define HAVE_STRUCT_IN6_ADDR 1 -# define HAVE_STRUCT_SOCKADDR_IN6 1 -# define HAVE_SYS_SOCKET_H 1 -# define HAVE_SYS_UIO_H 1 -# define NS_INADDRSZ 4 -# define HAVE_STRUCT_SOCKADDR_IN6 1 - -# define HAVE_GETSERVBYPORT_R 1 -# define GETSERVBYPORT_R_ARGS 5 +# define HAVE_AF_INET6 1 +# define HAVE_ARPA_INET_H 1 +# define HAVE_ARPA_NAMESER_H 1 +# define HAVE_CLOSE_S 1 +# define HAVE_GETHOSTNAME 1 +# define HAVE_NETDB_H 1 +# define HAVE_NETINET_IN_H 1 +# define HAVE_NETINET_TCP_H 1 +# define HAVE_PF_INET6 1 +# define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +# define HAVE_STRUCT_ADDRINFO 1 +# define HAVE_STRUCT_IN6_ADDR 1 +# define HAVE_STRUCT_SOCKADDR_IN6 1 +# define HAVE_SYS_SOCKET_H 1 +# define HAVE_SYS_IOCTL_H 1 +# define HAVE_SYS_UIO_H 1 +# define NS_INADDRSZ 4 +# define HAVE_GETSERVBYPORT_R 1 +# define GETSERVBYPORT_R_ARGS 6 +# define HAVE_WRITEV 1 +# define HAVE_IF_NAMETOINDEX 1 +# define HAVE_IF_INDEXTONAME 1 #endif -#undef word -#undef byte - #endif /* HEADER_CONFIG_DOS_H */ diff --git a/deps/cares/src/lib/config-win32.h b/deps/cares/src/lib/config-win32.h index 50d77313675b6e..fc533c75516ea3 100644 --- a/deps/cares/src/lib/config-win32.h +++ b/deps/cares/src/lib/config-win32.h @@ -88,7 +88,7 @@ #define HAVE_IPHLPAPI_H 1 /* Define if you have <netioapi.h> header file */ -#ifndef __WATCOMC__ +#if !defined(__WATCOMC__) && !defined(WATT32) # define HAVE_NETIOAPI_H 1 #endif @@ -187,14 +187,14 @@ /* Define if you have the send function. */ #define HAVE_SEND 1 +/* Define if you have the sendto function. */ +#define HAVE_SENDTO 1 + /* Define to the type of arg 1 for send. */ #define SEND_TYPE_ARG1 SOCKET -/* Define to the type qualifier of arg 2 for send. */ -#define SEND_QUAL_ARG2 const - /* Define to the type of arg 2 for send. */ -#define SEND_TYPE_ARG2 char * +#define SEND_TYPE_ARG2 const char * /* Define to the type of arg 3 for send. */ #define SEND_TYPE_ARG3 int @@ -207,25 +207,40 @@ /* Specifics for the Watt-32 tcp/ip stack. */ #ifdef WATT32 -# define SOCKET int +# undef RECV_TYPE_ARG1 +# define RECV_TYPE_ARG1 int +# undef SEND_TYPE_ARG1 +# define SEND_TYPE_ARG1 int +# undef RECVFROM_TYPE_ARG1 +# define RECVFROM_TYPE_ARG1 int # define NS_INADDRSZ 4 # define HAVE_ARPA_NAMESER_H 1 # define HAVE_ARPA_INET_H 1 # define HAVE_NETDB_H 1 # define HAVE_NETINET_IN_H 1 # define HAVE_SYS_SOCKET_H 1 +# define HAVE_SYS_IOCTL_H 1 # define HAVE_NETINET_TCP_H 1 # define HAVE_AF_INET6 1 # define HAVE_PF_INET6 1 # define HAVE_STRUCT_IN6_ADDR 1 # define HAVE_STRUCT_SOCKADDR_IN6 1 +# define HAVE_WRITEV 1 +# define HAVE_IF_NAMETOINDEX 1 +# define HAVE_IF_INDEXTONAME 1 +# define HAVE_GETSERVBYPORT_R 1 +# define GETSERVBYPORT_R_ARGS 6 # undef HAVE_WINSOCK_H # undef HAVE_WINSOCK2_H # undef HAVE_WS2TCPIP_H +# undef HAVE_IPHLPAPI_H +# undef HAVE_NETIOAPI_H #endif -/* Threading support enabled */ -#define CARES_THREADS 1 +/* Threading support enabled for Vista+ */ +#if !defined(_WIN32_WINNT) || _WIN32_WINNT >= 0x0600 +# define CARES_THREADS 1 +#endif /* ---------------------------------------------------------------- */ /* TYPEDEF REPLACEMENTS */ @@ -342,7 +357,11 @@ # define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 #endif -#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && !defined(__WATCOMC__) +/* Define to 1 if you have the `RegisterWaitForSingleObject' function. */ +#define HAVE_REGISTERWAITFORSINGLEOBJECT 1 + +#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && \ + !defined(__WATCOMC__) && !defined(WATT32) /* Define if you have if_nametoindex() */ # define HAVE_IF_NAMETOINDEX 1 /* Define if you have if_indextoname() */ @@ -351,6 +370,10 @@ # define HAVE_CONVERTINTERFACEINDEXTOLUID 1 /* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */ # define HAVE_CONVERTINTERFACELUIDTONAMEA 1 +/* Define to 1 if you have the `NotifyIpInterfaceChange' function. */ +# define HAVE_NOTIFYIPINTERFACECHANGE 1 +/* Define to 1 if you have the `GetBestRoute2` function */ +# define HAVE_GETBESTROUTE2 1 #endif /* ---------------------------------------------------------------- */ diff --git a/deps/cares/src/lib/dsa/ares_array.c b/deps/cares/src/lib/dsa/ares_array.c new file mode 100644 index 00000000000000..c421d5c5f670bd --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_array.c @@ -0,0 +1,394 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_array.h" + +#define ARES__ARRAY_MIN 4 + +struct ares_array { + ares_array_destructor_t destruct; + void *arr; + size_t member_size; + size_t cnt; + size_t offset; + size_t alloc_cnt; +}; + +ares_array_t *ares_array_create(size_t member_size, + ares_array_destructor_t destruct) +{ + ares_array_t *arr; + + if (member_size == 0) { + return NULL; + } + + arr = ares_malloc_zero(sizeof(*arr)); + if (arr == NULL) { + return NULL; + } + + arr->member_size = member_size; + arr->destruct = destruct; + return arr; +} + +size_t ares_array_len(const ares_array_t *arr) +{ + if (arr == NULL) { + return 0; + } + return arr->cnt; +} + +void *ares_array_at(ares_array_t *arr, size_t idx) +{ + if (arr == NULL || idx >= arr->cnt) { + return NULL; + } + return (unsigned char *)arr->arr + ((idx + arr->offset) * arr->member_size); +} + +const void *ares_array_at_const(const ares_array_t *arr, size_t idx) +{ + if (arr == NULL || idx >= arr->cnt) { + return NULL; + } + return (unsigned char *)arr->arr + ((idx + arr->offset) * arr->member_size); +} + +ares_status_t ares_array_sort(ares_array_t *arr, ares_array_cmp_t cmp) +{ + if (arr == NULL || cmp == NULL) { + return ARES_EFORMERR; + } + + /* Nothing to sort */ + if (arr->cnt < 2) { + return ARES_SUCCESS; + } + + qsort((unsigned char *)arr->arr + (arr->offset * arr->member_size), arr->cnt, + arr->member_size, cmp); + return ARES_SUCCESS; +} + +void ares_array_destroy(ares_array_t *arr) +{ + size_t i; + + if (arr == NULL) { + return; + } + + if (arr->destruct != NULL) { + for (i = 0; i < arr->cnt; i++) { + arr->destruct(ares_array_at(arr, i)); + } + } + + ares_free(arr->arr); + ares_free(arr); +} + +/* NOTE: this function operates on actual indexes, NOT indexes using the + * arr->offset */ +static ares_status_t ares_array_move(ares_array_t *arr, size_t dest_idx, + size_t src_idx) +{ + void *dest_ptr; + const void *src_ptr; + size_t nmembers; + + if (arr == NULL || dest_idx >= arr->alloc_cnt || src_idx >= arr->alloc_cnt) { + return ARES_EFORMERR; + } + + /* Nothing to do */ + if (dest_idx == src_idx) { + return ARES_SUCCESS; + } + + dest_ptr = (unsigned char *)arr->arr + (dest_idx * arr->member_size); + src_ptr = (unsigned char *)arr->arr + (src_idx * arr->member_size); + + /* Check to make sure shifting to the right won't overflow our allocation + * boundary */ + if (dest_idx > src_idx && arr->cnt + (dest_idx - src_idx) > arr->alloc_cnt) { + return ARES_EFORMERR; + } + + nmembers = arr->cnt - (src_idx - arr->offset); + memmove(dest_ptr, src_ptr, nmembers * arr->member_size); + + return ARES_SUCCESS; +} + +void *ares_array_finish(ares_array_t *arr, size_t *num_members) +{ + void *ptr; + + if (arr == NULL || num_members == NULL) { + return NULL; + } + + /* Make sure we move data to beginning of allocation */ + if (arr->offset != 0) { + if (ares_array_move(arr, 0, arr->offset) != ARES_SUCCESS) { + return NULL; + } + arr->offset = 0; + } + + ptr = arr->arr; + *num_members = arr->cnt; + ares_free(arr); + return ptr; +} + +ares_status_t ares_array_set_size(ares_array_t *arr, size_t size) +{ + void *temp; + + if (arr == NULL || size == 0 || size < arr->cnt) { + return ARES_EFORMERR; + } + + /* Always operate on powers of 2 */ + size = ares_round_up_pow2(size); + + if (size < ARES__ARRAY_MIN) { + size = ARES__ARRAY_MIN; + } + + /* If our allocation size is already large enough, skip */ + if (size <= arr->alloc_cnt) { + return ARES_SUCCESS; + } + + temp = ares_realloc_zero(arr->arr, arr->alloc_cnt * arr->member_size, + size * arr->member_size); + if (temp == NULL) { + return ARES_ENOMEM; + } + arr->alloc_cnt = size; + arr->arr = temp; + return ARES_SUCCESS; +} + +ares_status_t ares_array_insert_at(void **elem_ptr, ares_array_t *arr, + size_t idx) +{ + void *ptr; + ares_status_t status; + + if (arr == NULL) { + return ARES_EFORMERR; + } + + /* Not >= since we are allowed to append to the end */ + if (idx > arr->cnt) { + return ARES_EFORMERR; + } + + /* Allocate more if needed */ + status = ares_array_set_size(arr, arr->cnt + 1); + if (status != ARES_SUCCESS) { + return status; + } + + /* Shift if we have memory but not enough room at the end */ + if (arr->cnt + 1 + arr->offset > arr->alloc_cnt) { + status = ares_array_move(arr, 0, arr->offset); + if (status != ARES_SUCCESS) { + return status; + } + arr->offset = 0; + } + + /* If we're inserting anywhere other than the end, we need to move some + * elements out of the way */ + if (idx != arr->cnt) { + status = ares_array_move(arr, idx + arr->offset + 1, idx + arr->offset); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* Ok, we're guaranteed to have a gap where we need it, lets zero it out, + * and return it */ + ptr = (unsigned char *)arr->arr + ((idx + arr->offset) * arr->member_size); + memset(ptr, 0, arr->member_size); + arr->cnt++; + + if (elem_ptr) { + *elem_ptr = ptr; + } + + return ARES_SUCCESS; +} + +ares_status_t ares_array_insert_last(void **elem_ptr, ares_array_t *arr) +{ + return ares_array_insert_at(elem_ptr, arr, ares_array_len(arr)); +} + +ares_status_t ares_array_insert_first(void **elem_ptr, ares_array_t *arr) +{ + return ares_array_insert_at(elem_ptr, arr, 0); +} + +ares_status_t ares_array_insertdata_at(ares_array_t *arr, size_t idx, + const void *data_ptr) +{ + ares_status_t status; + void *ptr = NULL; + + status = ares_array_insert_at(&ptr, arr, idx); + if (status != ARES_SUCCESS) { + return status; + } + memcpy(ptr, data_ptr, arr->member_size); + return ARES_SUCCESS; +} + +ares_status_t ares_array_insertdata_last(ares_array_t *arr, + const void *data_ptr) +{ + ares_status_t status; + void *ptr = NULL; + + status = ares_array_insert_last(&ptr, arr); + if (status != ARES_SUCCESS) { + return status; + } + memcpy(ptr, data_ptr, arr->member_size); + return ARES_SUCCESS; +} + +ares_status_t ares_array_insertdata_first(ares_array_t *arr, + const void *data_ptr) +{ + ares_status_t status; + void *ptr = NULL; + + status = ares_array_insert_last(&ptr, arr); + if (status != ARES_SUCCESS) { + return status; + } + memcpy(ptr, data_ptr, arr->member_size); + return ARES_SUCCESS; +} + +void *ares_array_first(ares_array_t *arr) +{ + return ares_array_at(arr, 0); +} + +void *ares_array_last(ares_array_t *arr) +{ + size_t cnt = ares_array_len(arr); + if (cnt == 0) { + return NULL; + } + return ares_array_at(arr, cnt - 1); +} + +const void *ares_array_first_const(const ares_array_t *arr) +{ + return ares_array_at_const(arr, 0); +} + +const void *ares_array_last_const(const ares_array_t *arr) +{ + size_t cnt = ares_array_len(arr); + if (cnt == 0) { + return NULL; + } + return ares_array_at_const(arr, cnt - 1); +} + +ares_status_t ares_array_claim_at(void *dest, size_t dest_size, + ares_array_t *arr, size_t idx) +{ + ares_status_t status; + + if (arr == NULL || idx >= arr->cnt) { + return ARES_EFORMERR; + } + + if (dest != NULL && dest_size < arr->member_size) { + return ARES_EFORMERR; + } + + if (dest) { + memcpy(dest, ares_array_at(arr, idx), arr->member_size); + } + + if (idx == 0) { + /* Optimization, if first element, just increment offset, makes removing a + * lot from the start quick */ + arr->offset++; + } else if (idx != arr->cnt - 1) { + /* Must shift entire array if removing an element from the middle. Does + * nothing if removing last element other than decrement count. */ + status = ares_array_move(arr, idx + arr->offset, idx + arr->offset + 1); + if (status != ARES_SUCCESS) { + return status; + } + } + + arr->cnt--; + return ARES_SUCCESS; +} + +ares_status_t ares_array_remove_at(ares_array_t *arr, size_t idx) +{ + void *ptr = ares_array_at(arr, idx); + if (arr == NULL || ptr == NULL) { + return ARES_EFORMERR; + } + + if (arr->destruct != NULL) { + arr->destruct(ptr); + } + + return ares_array_claim_at(NULL, 0, arr, idx); +} + +ares_status_t ares_array_remove_first(ares_array_t *arr) +{ + return ares_array_remove_at(arr, 0); +} + +ares_status_t ares_array_remove_last(ares_array_t *arr) +{ + size_t cnt = ares_array_len(arr); + if (cnt == 0) { + return ARES_EFORMERR; + } + return ares_array_remove_at(arr, cnt - 1); +} diff --git a/deps/cares/src/lib/dsa/ares_htable.c b/deps/cares/src/lib/dsa/ares_htable.c new file mode 100644 index 00000000000000..f76b67cae9a668 --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable.c @@ -0,0 +1,447 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_llist.h" +#include "ares_htable.h" + +#define ARES__HTABLE_MAX_BUCKETS (1U << 24) +#define ARES__HTABLE_MIN_BUCKETS (1U << 4) +#define ARES__HTABLE_EXPAND_PERCENT 75 + +struct ares_htable { + ares_htable_hashfunc_t hash; + ares_htable_bucket_key_t bucket_key; + ares_htable_bucket_free_t bucket_free; + ares_htable_key_eq_t key_eq; + unsigned int seed; + unsigned int size; + size_t num_keys; + size_t num_collisions; + /* NOTE: if we converted buckets into ares_slist_t we could guarantee on + * hash collisions we would have O(log n) worst case insert and search + * performance. (We'd also need to make key_eq into a key_cmp to + * support sort). That said, risk with a random hash seed is near zero, + * and ares_slist_t is heavier weight, so I think using ares_llist_t + * is an overall win. */ + ares_llist_t **buckets; +}; + +static unsigned int ares_htable_generate_seed(ares_htable_t *htable) +{ +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Seed needs to be static for fuzzing */ + return 0; +#else + unsigned int seed = 0; + time_t t = time(NULL); + + /* Mix stack address, heap address, and time to generate a random seed, it + * doesn't have to be super secure, just quick. Likelihood of a hash + * collision attack is very low with a small amount of effort */ + seed |= (unsigned int)((size_t)htable & 0xFFFFFFFF); + seed |= (unsigned int)((size_t)&seed & 0xFFFFFFFF); + seed |= (unsigned int)(((ares_uint64_t)t) & 0xFFFFFFFF); + return seed; +#endif +} + +static void ares_htable_buckets_destroy(ares_llist_t **buckets, + unsigned int size, + ares_bool_t destroy_vals) +{ + unsigned int i; + + if (buckets == NULL) { + return; + } + + for (i = 0; i < size; i++) { + if (buckets[i] == NULL) { + continue; + } + + if (!destroy_vals) { + ares_llist_replace_destructor(buckets[i], NULL); + } + + ares_llist_destroy(buckets[i]); + } + + ares_free(buckets); +} + +void ares_htable_destroy(ares_htable_t *htable) +{ + if (htable == NULL) { + return; + } + ares_htable_buckets_destroy(htable->buckets, htable->size, ARES_TRUE); + ares_free(htable); +} + +ares_htable_t *ares_htable_create(ares_htable_hashfunc_t hash_func, + ares_htable_bucket_key_t bucket_key, + ares_htable_bucket_free_t bucket_free, + ares_htable_key_eq_t key_eq) +{ + ares_htable_t *htable = NULL; + + if (hash_func == NULL || bucket_key == NULL || bucket_free == NULL || + key_eq == NULL) { + goto fail; + } + + htable = ares_malloc_zero(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = hash_func; + htable->bucket_key = bucket_key; + htable->bucket_free = bucket_free; + htable->key_eq = key_eq; + htable->seed = ares_htable_generate_seed(htable); + htable->size = ARES__HTABLE_MIN_BUCKETS; + htable->buckets = ares_malloc_zero(sizeof(*htable->buckets) * htable->size); + + if (htable->buckets == NULL) { + goto fail; + } + + return htable; + +fail: + ares_htable_destroy(htable); + return NULL; +} + +const void **ares_htable_all_buckets(const ares_htable_t *htable, size_t *num) +{ + const void **out = NULL; + size_t cnt = 0; + size_t i; + + if (htable == NULL || num == NULL) { + return NULL; /* LCOV_EXCL_LINE */ + } + + *num = 0; + + out = ares_malloc_zero(sizeof(*out) * htable->num_keys); + if (out == NULL) { + return NULL; /* LCOV_EXCL_LINE */ + } + + for (i = 0; i < htable->size; i++) { + ares_llist_node_t *node; + for (node = ares_llist_node_first(htable->buckets[i]); node != NULL; + node = ares_llist_node_next(node)) { + out[cnt++] = ares_llist_node_val(node); + } + } + + *num = cnt; + return out; +} + +/*! Grabs the Hashtable index from the key and length. The h index is + * the hash of the function reduced to the size of the bucket list. + * We are doing "hash & (size - 1)" since we are guaranteeing a power of + * 2 for size. This is equivalent to "hash % size", but should be more + * efficient */ +#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1) + +static ares_llist_node_t *ares_htable_find(const ares_htable_t *htable, + unsigned int idx, const void *key) +{ + ares_llist_node_t *node = NULL; + + for (node = ares_llist_node_first(htable->buckets[idx]); node != NULL; + node = ares_llist_node_next(node)) { + if (htable->key_eq(key, htable->bucket_key(ares_llist_node_val(node)))) { + break; + } + } + + return node; +} + +static ares_bool_t ares_htable_expand(ares_htable_t *htable) +{ + ares_llist_t **buckets = NULL; + unsigned int old_size = htable->size; + size_t i; + ares_llist_t **prealloc_llist = NULL; + size_t prealloc_llist_len = 0; + ares_bool_t rv = ARES_FALSE; + + /* Not a failure, just won't expand */ + if (old_size == ARES__HTABLE_MAX_BUCKETS) { + return ARES_TRUE; /* LCOV_EXCL_LINE */ + } + + htable->size <<= 1; + + /* We must pre-allocate all memory we'll need before moving entries to the + * new hash array. Otherwise if there's a memory allocation failure in the + * middle, we wouldn't be able to recover. */ + buckets = ares_malloc_zero(sizeof(*buckets) * htable->size); + if (buckets == NULL) { + goto done; /* LCOV_EXCL_LINE */ + } + + /* The maximum number of new llists we'll need is the number of collisions + * that were recorded */ + prealloc_llist_len = htable->num_collisions; + if (prealloc_llist_len) { + prealloc_llist = + ares_malloc_zero(sizeof(*prealloc_llist) * prealloc_llist_len); + if (prealloc_llist == NULL) { + goto done; /* LCOV_EXCL_LINE */ + } + } + for (i = 0; i < prealloc_llist_len; i++) { + prealloc_llist[i] = ares_llist_create(htable->bucket_free); + if (prealloc_llist[i] == NULL) { + goto done; + } + } + + /* Iterate across all buckets and move the entries to the new buckets */ + htable->num_collisions = 0; + for (i = 0; i < old_size; i++) { + ares_llist_node_t *node; + + /* Nothing in this bucket */ + if (htable->buckets[i] == NULL) { + continue; + } + + /* Fast path optimization (most likely case), there is likely only a single + * entry in both the source and destination, check for this to confirm and + * if so, just move the bucket over */ + if (ares_llist_len(htable->buckets[i]) == 1) { + const void *val = ares_llist_first_val(htable->buckets[i]); + size_t idx = HASH_IDX(htable, htable->bucket_key(val)); + + if (buckets[idx] == NULL) { + /* Swap! */ + buckets[idx] = htable->buckets[i]; + htable->buckets[i] = NULL; + continue; + } + } + + /* Slow path, collisions */ + while ((node = ares_llist_node_first(htable->buckets[i])) != NULL) { + const void *val = ares_llist_node_val(node); + size_t idx = HASH_IDX(htable, htable->bucket_key(val)); + + /* Try fast path again as maybe we popped one collision off and the + * next we can reuse the llist parent */ + if (buckets[idx] == NULL && ares_llist_len(htable->buckets[i]) == 1) { + /* Swap! */ + buckets[idx] = htable->buckets[i]; + htable->buckets[i] = NULL; + break; + } + + /* Grab one off our preallocated list */ + if (buckets[idx] == NULL) { + /* Silence static analysis, this isn't possible but it doesn't know */ + if (prealloc_llist == NULL || prealloc_llist_len == 0) { + goto done; /* LCOV_EXCL_LINE */ + } + buckets[idx] = prealloc_llist[prealloc_llist_len - 1]; + prealloc_llist_len--; + } else { + /* Collision occurred since the bucket wasn't empty */ + htable->num_collisions++; + } + + ares_llist_node_mvparent_first(node, buckets[idx]); + } + + /* Abandoned bucket, destroy */ + if (htable->buckets[i] != NULL) { + ares_llist_destroy(htable->buckets[i]); + htable->buckets[i] = NULL; + } + } + + /* We have guaranteed all the buckets have either been moved or destroyed, + * so we just call ares_free() on the array and swap out the pointer */ + ares_free(htable->buckets); + htable->buckets = buckets; + buckets = NULL; + rv = ARES_TRUE; + +done: + ares_free(buckets); + /* destroy any unused preallocated buckets */ + ares_htable_buckets_destroy(prealloc_llist, (unsigned int)prealloc_llist_len, + ARES_FALSE); + + /* On failure, we need to restore the htable size */ + if (rv != ARES_TRUE) { + htable->size = old_size; /* LCOV_EXCL_LINE */ + } + + return rv; +} + +ares_bool_t ares_htable_insert(ares_htable_t *htable, void *bucket) +{ + unsigned int idx = 0; + ares_llist_node_t *node = NULL; + const void *key = NULL; + + if (htable == NULL || bucket == NULL) { + return ARES_FALSE; + } + + + key = htable->bucket_key(bucket); + idx = HASH_IDX(htable, key); + + /* See if we have a matching bucket already, if so, replace it */ + node = ares_htable_find(htable, idx, key); + if (node != NULL) { + ares_llist_node_replace(node, bucket); + return ARES_TRUE; + } + + /* Check to see if we should rehash because likelihood of collisions has + * increased beyond our threshold */ + if (htable->num_keys + 1 > + (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) { + if (!ares_htable_expand(htable)) { + return ARES_FALSE; /* LCOV_EXCL_LINE */ + } + /* If we expanded, need to calculate a new index */ + idx = HASH_IDX(htable, key); + } + + /* We lazily allocate the linked list */ + if (htable->buckets[idx] == NULL) { + htable->buckets[idx] = ares_llist_create(htable->bucket_free); + if (htable->buckets[idx] == NULL) { + return ARES_FALSE; + } + } + + node = ares_llist_insert_first(htable->buckets[idx], bucket); + if (node == NULL) { + return ARES_FALSE; + } + + /* Track collisions for rehash stability */ + if (ares_llist_len(htable->buckets[idx]) > 1) { + htable->num_collisions++; + } + + htable->num_keys++; + + return ARES_TRUE; +} + +void *ares_htable_get(const ares_htable_t *htable, const void *key) +{ + unsigned int idx; + + if (htable == NULL || key == NULL) { + return NULL; + } + + idx = HASH_IDX(htable, key); + + return ares_llist_node_val(ares_htable_find(htable, idx, key)); +} + +ares_bool_t ares_htable_remove(ares_htable_t *htable, const void *key) +{ + ares_llist_node_t *node; + unsigned int idx; + + if (htable == NULL || key == NULL) { + return ARES_FALSE; + } + + idx = HASH_IDX(htable, key); + node = ares_htable_find(htable, idx, key); + if (node == NULL) { + return ARES_FALSE; + } + + htable->num_keys--; + + /* Reduce collisions */ + if (ares_llist_len(ares_llist_node_parent(node)) > 1) { + htable->num_collisions--; + } + + ares_llist_node_destroy(node); + return ARES_TRUE; +} + +size_t ares_htable_num_keys(const ares_htable_t *htable) +{ + if (htable == NULL) { + return 0; + } + return htable->num_keys; +} + +unsigned int ares_htable_hash_FNV1a(const unsigned char *key, size_t key_len, + unsigned int seed) +{ + unsigned int hv = seed ^ 2166136261U; + size_t i; + + for (i = 0; i < key_len; i++) { + hv ^= (unsigned int)key[i]; + /* hv *= 16777619 (0x01000193) */ + hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); + } + + return hv; +} + +/* Case insensitive version, meant for ASCII strings */ +unsigned int ares_htable_hash_FNV1a_casecmp(const unsigned char *key, + size_t key_len, unsigned int seed) +{ + unsigned int hv = seed ^ 2166136261U; + size_t i; + + for (i = 0; i < key_len; i++) { + hv ^= (unsigned int)ares_tolower(key[i]); + /* hv *= 16777619 (0x01000193) */ + hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24); + } + + return hv; +} diff --git a/deps/cares/src/lib/dsa/ares_htable.h b/deps/cares/src/lib/dsa/ares_htable.h new file mode 100644 index 00000000000000..5700286eb0fabf --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable.h @@ -0,0 +1,174 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_H +#define __ARES__HTABLE_H + + +/*! \addtogroup ares_htable Base HashTable Data Structure + * + * This is a basic hashtable data structure that is meant to be wrapped + * by a higher level implementation. This data structure is designed to + * be callback-based in order to facilitate wrapping without needing to + * worry about any underlying complexities of the hashtable implementation. + * + * This implementation supports automatic growing by powers of 2 when reaching + * 75% capacity. A rehash will be performed on the expanded bucket list. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable; + +/*! Opaque data type for generic hash table implementation */ +typedef struct ares_htable ares_htable_t; + +/*! Callback for generating a hash of the key. + * + * \param[in] key pointer to key to be hashed + * \param[in] seed randomly generated seed used by hash function. + * value is specific to the hashtable instance + * but otherwise will not change between calls. + * \return hash + */ +typedef unsigned int (*ares_htable_hashfunc_t)(const void *key, + unsigned int seed); + +/*! Callback to free the bucket + * + * \param[in] bucket user provided bucket + */ +typedef void (*ares_htable_bucket_free_t)(void *bucket); + +/*! Callback to extract the key from the user-provided bucket + * + * \param[in] bucket user provided bucket + * \return pointer to key held in bucket + */ +typedef const void *(*ares_htable_bucket_key_t)(const void *bucket); + +/*! Callback to compare two keys for equality + * + * \param[in] key1 first key + * \param[in] key2 second key + * \return ARES_TRUE if equal, ARES_FALSE if not + */ +typedef ares_bool_t (*ares_htable_key_eq_t)(const void *key1, const void *key2); + + +/*! Destroy the initialized hashtable + * + * \param[in] htable initialized hashtable + */ +void ares_htable_destroy(ares_htable_t *htable); + +/*! Create a new hashtable + * + * \param[in] hash_func Required. Callback for Hash function. + * \param[in] bucket_key Required. Callback to extract key from bucket. + * \param[in] bucket_free Required. Callback to free bucket. + * \param[in] key_eq Required. Callback to check for key equality. + * \return initialized hashtable. NULL if out of memory or misuse. + */ +ares_htable_t *ares_htable_create(ares_htable_hashfunc_t hash_func, + ares_htable_bucket_key_t bucket_key, + ares_htable_bucket_free_t bucket_free, + ares_htable_key_eq_t key_eq); + +/*! Count of keys from initialized hashtable + * + * \param[in] htable Initialized hashtable. + * \return count of keys + */ +size_t ares_htable_num_keys(const ares_htable_t *htable); + +/*! Retrieve an array of buckets from the hashtable. This is mainly used as + * a helper for retrieving an array of keys. + * + * \param[in] htable Initialized hashtable + * \param[out] num Count of returned buckets + * \return Array of pointers to the buckets. These are internal pointers + * to data within the hashtable, so if the key is removed, there + * will be a dangling pointer. It is expected wrappers will make + * such values safe by duplicating them. + */ +const void **ares_htable_all_buckets(const ares_htable_t *htable, size_t *num); + +/*! Insert bucket into hashtable + * + * \param[in] htable Initialized hashtable. + * \param[in] bucket User-provided bucket to insert. Takes "ownership". Not + * allowed to be NULL. + * \return ARES_TRUE on success, ARES_FALSE if out of memory + */ +ares_bool_t ares_htable_insert(ares_htable_t *htable, void *bucket); + +/*! Retrieve bucket from hashtable based on key. + * + * \param[in] htable Initialized hashtable + * \param[in] key Pointer to key to use for comparison. + * \return matching bucket, or NULL if not found. + */ +void *ares_htable_get(const ares_htable_t *htable, const void *key); + +/*! Remove bucket from hashtable by key + * + * \param[in] htable Initialized hashtable + * \param[in] key Pointer to key to use for comparison + * \return ARES_TRUE if found, ARES_FALSE if not found + */ +ares_bool_t ares_htable_remove(ares_htable_t *htable, const void *key); + +/*! FNV1a hash algorithm. Can be used as underlying primitive for building + * a wrapper hashtable. + * + * \param[in] key pointer to key + * \param[in] key_len Length of key + * \param[in] seed Seed for generating hash + * \return hash value + */ +unsigned int ares_htable_hash_FNV1a(const unsigned char *key, size_t key_len, + unsigned int seed); + +/*! FNV1a hash algorithm, but converts all characters to lowercase before + * hashing to make the hash case-insensitive. Can be used as underlying + * primitive for building a wrapper hashtable. Used on string-based keys. + * + * \param[in] key pointer to key + * \param[in] key_len Length of key + * \param[in] seed Seed for generating hash + * \return hash value + */ +unsigned int ares_htable_hash_FNV1a_casecmp(const unsigned char *key, + size_t key_len, unsigned int seed); + +/*! @} */ + +#endif /* __ARES__HTABLE_H */ diff --git a/deps/cares/src/lib/dsa/ares_htable_asvp.c b/deps/cares/src/lib/dsa/ares_htable_asvp.c new file mode 100644 index 00000000000000..32f4d2c9949962 --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_asvp.c @@ -0,0 +1,224 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_asvp.h" + +struct ares_htable_asvp { + ares_htable_asvp_val_free_t free_val; + ares_htable_t *hash; +}; + +typedef struct { + ares_socket_t key; + void *val; + ares_htable_asvp_t *parent; +} ares_htable_asvp_bucket_t; + +void ares_htable_asvp_destroy(ares_htable_asvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const ares_socket_t *arg = key; + return ares_htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_asvp_bucket_t *arg = bucket; + return &arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_asvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + const ares_socket_t *k1 = key1; + const ares_socket_t *k2 = key2; + + if (*k1 == *k2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_htable_asvp_t * + ares_htable_asvp_create(ares_htable_asvp_val_free_t val_free) +{ + ares_htable_asvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_socket_t *ares_htable_asvp_keys(const ares_htable_asvp_t *htable, + size_t *num) +{ + const void **buckets = NULL; + size_t cnt = 0; + ares_socket_t *out = NULL; + size_t i; + + if (htable == NULL || num == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *num = 0; + + buckets = ares_htable_all_buckets(htable->hash, &cnt); + if (buckets == NULL || cnt == 0) { + return NULL; + } + + out = ares_malloc_zero(sizeof(*out) * cnt); + if (out == NULL) { + ares_free(buckets); /* LCOV_EXCL_LINE: OutOfMemory */ + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (i = 0; i < cnt; i++) { + out[i] = ((const ares_htable_asvp_bucket_t *)buckets[i])->key; + } + + ares_free(buckets); + *num = cnt; + return out; +} + +ares_bool_t ares_htable_asvp_insert(ares_htable_asvp_t *htable, + ares_socket_t key, void *val) +{ + ares_htable_asvp_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = val; + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket); /* LCOV_EXCL_LINE: OutOfMemory */ + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_asvp_get(const ares_htable_asvp_t *htable, + ares_socket_t key, void **val) +{ + ares_htable_asvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, &key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares_htable_asvp_get_direct(const ares_htable_asvp_t *htable, + ares_socket_t key) +{ + void *val = NULL; + ares_htable_asvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_asvp_remove(ares_htable_asvp_t *htable, + ares_socket_t key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, &key); +} + +size_t ares_htable_asvp_num_keys(const ares_htable_asvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} diff --git a/deps/cares/src/lib/dsa/ares_htable_dict.c b/deps/cares/src/lib/dsa/ares_htable_dict.c new file mode 100644 index 00000000000000..93d7a20137c8db --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_dict.c @@ -0,0 +1,228 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_dict.h" + +struct ares_htable_dict { + ares_htable_t *hash; +}; + +typedef struct { + char *key; + char *val; + ares_htable_dict_t *parent; +} ares_htable_dict_bucket_t; + +void ares_htable_dict_destroy(ares_htable_dict_t *htable) +{ + if (htable == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + return ares_htable_hash_FNV1a_casecmp(key, ares_strlen(key), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_dict_bucket_t *arg = bucket; + return arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_dict_bucket_t *arg = bucket; + + ares_free(arg->key); + ares_free(arg->val); + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + return ares_strcaseeq(key1, key2); +} + +ares_htable_dict_t *ares_htable_dict_create(void) +{ + ares_htable_dict_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return htable; + +/* LCOV_EXCL_START: OutOfMemory */ +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; + /* LCOV_EXCL_STOP */ +} + +ares_bool_t ares_htable_dict_insert(ares_htable_dict_t *htable, const char *key, + const char *val) +{ + ares_htable_dict_bucket_t *bucket = NULL; + + if (htable == NULL || ares_strlen(key) == 0) { + goto fail; + } + + bucket = ares_malloc_zero(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = ares_strdup(key); + if (bucket->key == NULL) { + goto fail; + } + + if (val != NULL) { + bucket->val = ares_strdup(val); + if (bucket->val == NULL) { + goto fail; + } + } + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket->val); + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_dict_get(const ares_htable_dict_t *htable, + const char *key, const char **val) +{ + const ares_htable_dict_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +const char *ares_htable_dict_get_direct(const ares_htable_dict_t *htable, + const char *key) +{ + const char *val = NULL; + ares_htable_dict_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_dict_remove(ares_htable_dict_t *htable, const char *key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, key); +} + +size_t ares_htable_dict_num_keys(const ares_htable_dict_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} + +char **ares_htable_dict_keys(const ares_htable_dict_t *htable, size_t *num) +{ + const void **buckets = NULL; + size_t cnt = 0; + char **out = NULL; + size_t i; + + if (htable == NULL || num == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *num = 0; + + buckets = ares_htable_all_buckets(htable->hash, &cnt); + if (buckets == NULL || cnt == 0) { + return NULL; + } + + out = ares_malloc_zero(sizeof(*out) * cnt); + if (out == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (i = 0; i < cnt; i++) { + out[i] = ares_strdup(((const ares_htable_dict_bucket_t *)buckets[i])->key); + if (out[i] == NULL) { + goto fail; + } + } + + ares_free(buckets); + *num = cnt; + return out; + +fail: + *num = 0; + ares_free_array(out, cnt, ares_free); + return NULL; +} diff --git a/deps/cares/src/lib/dsa/ares_htable_strvp.c b/deps/cares/src/lib/dsa/ares_htable_strvp.c new file mode 100644 index 00000000000000..daca117e80f3bb --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_strvp.c @@ -0,0 +1,210 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_strvp.h" + +struct ares_htable_strvp { + ares_htable_strvp_val_free_t free_val; + ares_htable_t *hash; +}; + +typedef struct { + char *key; + void *val; + ares_htable_strvp_t *parent; +} ares_htable_strvp_bucket_t; + +void ares_htable_strvp_destroy(ares_htable_strvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const char *arg = key; + return ares_htable_hash_FNV1a_casecmp((const unsigned char *)arg, + ares_strlen(arg), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_strvp_bucket_t *arg = bucket; + return arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_strvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + ares_free(arg->key); + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + return ares_strcaseeq(key1, key2); +} + +ares_htable_strvp_t * + ares_htable_strvp_create(ares_htable_strvp_val_free_t val_free) +{ + ares_htable_strvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_bool_t ares_htable_strvp_insert(ares_htable_strvp_t *htable, + const char *key, void *val) +{ + ares_htable_strvp_bucket_t *bucket = NULL; + + if (htable == NULL || key == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = ares_strdup(key); + if (bucket->key == NULL) { + goto fail; + } + bucket->val = val; + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket->key); + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_strvp_get(const ares_htable_strvp_t *htable, + const char *key, void **val) +{ + ares_htable_strvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL || key == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares_htable_strvp_get_direct(const ares_htable_strvp_t *htable, + const char *key) +{ + void *val = NULL; + ares_htable_strvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_strvp_remove(ares_htable_strvp_t *htable, + const char *key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, key); +} + +void *ares_htable_strvp_claim(ares_htable_strvp_t *htable, const char *key) +{ + ares_htable_strvp_bucket_t *bucket = NULL; + void *val; + + if (htable == NULL || key == NULL) { + return NULL; + } + + bucket = ares_htable_get(htable->hash, key); + if (bucket == NULL) { + return NULL; + } + + /* Unassociate value from bucket */ + val = bucket->val; + bucket->val = NULL; + + ares_htable_strvp_remove(htable, key); + return val; +} + +size_t ares_htable_strvp_num_keys(const ares_htable_strvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} diff --git a/deps/cares/src/lib/dsa/ares_htable_szvp.c b/deps/cares/src/lib/dsa/ares_htable_szvp.c new file mode 100644 index 00000000000000..fdaae0a571c80c --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_szvp.c @@ -0,0 +1,188 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_szvp.h" + +struct ares_htable_szvp { + ares_htable_szvp_val_free_t free_val; + ares_htable_t *hash; +}; + +typedef struct { + size_t key; + void *val; + ares_htable_szvp_t *parent; +} ares_htable_szvp_bucket_t; + +void ares_htable_szvp_destroy(ares_htable_szvp_t *htable) +{ + if (htable == NULL) { + return; + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + const size_t *arg = key; + return ares_htable_hash_FNV1a((const unsigned char *)arg, sizeof(*arg), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_szvp_bucket_t *arg = bucket; + return &arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_szvp_bucket_t *arg = bucket; + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + const size_t *k1 = key1; + const size_t *k2 = key2; + + if (*k1 == *k2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_htable_szvp_t * + ares_htable_szvp_create(ares_htable_szvp_val_free_t val_free) +{ + ares_htable_szvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; + } + + htable->free_val = val_free; + + return htable; + +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; +} + +ares_bool_t ares_htable_szvp_insert(ares_htable_szvp_t *htable, size_t key, + void *val) +{ + ares_htable_szvp_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = val; + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket); /* LCOV_EXCL_LINE: OutOfMemory */ + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_szvp_get(const ares_htable_szvp_t *htable, size_t key, + void **val) +{ + ares_htable_szvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, &key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares_htable_szvp_get_direct(const ares_htable_szvp_t *htable, size_t key) +{ + void *val = NULL; + ares_htable_szvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_szvp_remove(ares_htable_szvp_t *htable, size_t key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, &key); +} + +size_t ares_htable_szvp_num_keys(const ares_htable_szvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} diff --git a/deps/cares/src/lib/dsa/ares_htable_vpstr.c b/deps/cares/src/lib/dsa/ares_htable_vpstr.c new file mode 100644 index 00000000000000..86c881f768613b --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_vpstr.c @@ -0,0 +1,186 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_vpstr.h" + +struct ares_htable_vpstr { + ares_htable_t *hash; +}; + +typedef struct { + void *key; + char *val; + ares_htable_vpstr_t *parent; +} ares_htable_vpstr_bucket_t; + +void ares_htable_vpstr_destroy(ares_htable_vpstr_t *htable) +{ + if (htable == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + return ares_htable_hash_FNV1a((const unsigned char *)&key, sizeof(key), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_vpstr_bucket_t *arg = bucket; + return arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_vpstr_bucket_t *arg = bucket; + + ares_free(arg->val); + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + if (key1 == key2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_htable_vpstr_t *ares_htable_vpstr_create(void) +{ + ares_htable_vpstr_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return htable; + +/* LCOV_EXCL_START: OutOfMemory */ +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; + /* LCOV_EXCL_STOP */ +} + +ares_bool_t ares_htable_vpstr_insert(ares_htable_vpstr_t *htable, void *key, + const char *val) +{ + ares_htable_vpstr_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = ares_strdup(val); + if (bucket->val == NULL) { + goto fail; + } + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket->val); + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_vpstr_get(const ares_htable_vpstr_t *htable, + const void *key, const char **val) +{ + const ares_htable_vpstr_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +const char *ares_htable_vpstr_get_direct(const ares_htable_vpstr_t *htable, + const void *key) +{ + const char *val = NULL; + ares_htable_vpstr_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_vpstr_remove(ares_htable_vpstr_t *htable, + const void *key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, key); +} + +size_t ares_htable_vpstr_num_keys(const ares_htable_vpstr_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} diff --git a/deps/cares/src/lib/dsa/ares_htable_vpvp.c b/deps/cares/src/lib/dsa/ares_htable_vpvp.c new file mode 100644 index 00000000000000..14fd6e9da097ed --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_htable_vpvp.c @@ -0,0 +1,194 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_htable.h" +#include "ares_htable_vpvp.h" + +struct ares_htable_vpvp { + ares_htable_vpvp_key_free_t free_key; + ares_htable_vpvp_val_free_t free_val; + ares_htable_t *hash; +}; + +typedef struct { + void *key; + void *val; + ares_htable_vpvp_t *parent; +} ares_htable_vpvp_bucket_t; + +void ares_htable_vpvp_destroy(ares_htable_vpvp_t *htable) +{ + if (htable == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_htable_destroy(htable->hash); + ares_free(htable); +} + +static unsigned int hash_func(const void *key, unsigned int seed) +{ + return ares_htable_hash_FNV1a((const unsigned char *)&key, sizeof(key), seed); +} + +static const void *bucket_key(const void *bucket) +{ + const ares_htable_vpvp_bucket_t *arg = bucket; + return arg->key; +} + +static void bucket_free(void *bucket) +{ + ares_htable_vpvp_bucket_t *arg = bucket; + + if (arg->parent->free_key) { + arg->parent->free_key(arg->key); + } + + if (arg->parent->free_val) { + arg->parent->free_val(arg->val); + } + + ares_free(arg); +} + +static ares_bool_t key_eq(const void *key1, const void *key2) +{ + if (key1 == key2) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +ares_htable_vpvp_t * + ares_htable_vpvp_create(ares_htable_vpvp_key_free_t key_free, + ares_htable_vpvp_val_free_t val_free) +{ + ares_htable_vpvp_t *htable = ares_malloc(sizeof(*htable)); + if (htable == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + htable->hash = ares_htable_create(hash_func, bucket_key, bucket_free, key_eq); + if (htable->hash == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + htable->free_key = key_free; + htable->free_val = val_free; + + return htable; + +/* LCOV_EXCL_START: OutOfMemory */ +fail: + if (htable) { + ares_htable_destroy(htable->hash); + ares_free(htable); + } + return NULL; + /* LCOV_EXCL_STOP */ +} + +ares_bool_t ares_htable_vpvp_insert(ares_htable_vpvp_t *htable, void *key, + void *val) +{ + ares_htable_vpvp_bucket_t *bucket = NULL; + + if (htable == NULL) { + goto fail; + } + + bucket = ares_malloc(sizeof(*bucket)); + if (bucket == NULL) { + goto fail; + } + + bucket->parent = htable; + bucket->key = key; + bucket->val = val; + + if (!ares_htable_insert(htable->hash, bucket)) { + goto fail; + } + + return ARES_TRUE; + +fail: + if (bucket) { + ares_free(bucket); + } + return ARES_FALSE; +} + +ares_bool_t ares_htable_vpvp_get(const ares_htable_vpvp_t *htable, + const void *key, void **val) +{ + ares_htable_vpvp_bucket_t *bucket = NULL; + + if (val) { + *val = NULL; + } + + if (htable == NULL) { + return ARES_FALSE; + } + + bucket = ares_htable_get(htable->hash, key); + if (bucket == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = bucket->val; + } + return ARES_TRUE; +} + +void *ares_htable_vpvp_get_direct(const ares_htable_vpvp_t *htable, + const void *key) +{ + void *val = NULL; + ares_htable_vpvp_get(htable, key, &val); + return val; +} + +ares_bool_t ares_htable_vpvp_remove(ares_htable_vpvp_t *htable, const void *key) +{ + if (htable == NULL) { + return ARES_FALSE; + } + + return ares_htable_remove(htable->hash, key); +} + +size_t ares_htable_vpvp_num_keys(const ares_htable_vpvp_t *htable) +{ + if (htable == NULL) { + return 0; + } + return ares_htable_num_keys(htable->hash); +} diff --git a/deps/cares/src/lib/dsa/ares_llist.c b/deps/cares/src/lib/dsa/ares_llist.c new file mode 100644 index 00000000000000..6bd7de269a43fb --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_llist.c @@ -0,0 +1,382 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_llist.h" + +struct ares_llist { + ares_llist_node_t *head; + ares_llist_node_t *tail; + ares_llist_destructor_t destruct; + size_t cnt; +}; + +struct ares_llist_node { + void *data; + ares_llist_node_t *prev; + ares_llist_node_t *next; + ares_llist_t *parent; +}; + +ares_llist_t *ares_llist_create(ares_llist_destructor_t destruct) +{ + ares_llist_t *list = ares_malloc_zero(sizeof(*list)); + + if (list == NULL) { + return NULL; + } + + list->destruct = destruct; + + return list; +} + +void ares_llist_replace_destructor(ares_llist_t *list, + ares_llist_destructor_t destruct) +{ + if (list == NULL) { + return; + } + + list->destruct = destruct; +} + +typedef enum { + ARES__LLIST_INSERT_HEAD, + ARES__LLIST_INSERT_TAIL, + ARES__LLIST_INSERT_BEFORE +} ares_llist_insert_type_t; + +static void ares_llist_attach_at(ares_llist_t *list, + ares_llist_insert_type_t type, + ares_llist_node_t *at, ares_llist_node_t *node) +{ + if (list == NULL || node == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + node->parent = list; + + if (type == ARES__LLIST_INSERT_BEFORE && (at == list->head || at == NULL)) { + type = ARES__LLIST_INSERT_HEAD; + } + + switch (type) { + case ARES__LLIST_INSERT_HEAD: + node->next = list->head; + node->prev = NULL; + if (list->head) { + list->head->prev = node; + } + list->head = node; + break; + case ARES__LLIST_INSERT_TAIL: + node->next = NULL; + node->prev = list->tail; + if (list->tail) { + list->tail->next = node; + } + list->tail = node; + break; + case ARES__LLIST_INSERT_BEFORE: + node->next = at; + node->prev = at->prev; + at->prev = node; + break; + } + if (list->tail == NULL) { + list->tail = node; + } + if (list->head == NULL) { + list->head = node; + } + + list->cnt++; +} + +static ares_llist_node_t *ares_llist_insert_at(ares_llist_t *list, + ares_llist_insert_type_t type, + ares_llist_node_t *at, void *val) +{ + ares_llist_node_t *node = NULL; + + if (list == NULL || val == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + node = ares_malloc_zero(sizeof(*node)); + + if (node == NULL) { + return NULL; + } + + node->data = val; + ares_llist_attach_at(list, type, at, node); + + return node; +} + +ares_llist_node_t *ares_llist_insert_first(ares_llist_t *list, void *val) +{ + return ares_llist_insert_at(list, ARES__LLIST_INSERT_HEAD, NULL, val); +} + +ares_llist_node_t *ares_llist_insert_last(ares_llist_t *list, void *val) +{ + return ares_llist_insert_at(list, ARES__LLIST_INSERT_TAIL, NULL, val); +} + +ares_llist_node_t *ares_llist_insert_before(ares_llist_node_t *node, void *val) +{ + if (node == NULL) { + return NULL; + } + + return ares_llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, node, + val); +} + +ares_llist_node_t *ares_llist_insert_after(ares_llist_node_t *node, void *val) +{ + if (node == NULL) { + return NULL; + } + + if (node->next == NULL) { + return ares_llist_insert_last(node->parent, val); + } + + return ares_llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, + node->next, val); +} + +ares_llist_node_t *ares_llist_node_first(ares_llist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->head; +} + +ares_llist_node_t *ares_llist_node_idx(ares_llist_t *list, size_t idx) +{ + ares_llist_node_t *node; + size_t cnt; + + if (list == NULL) { + return NULL; + } + if (idx >= list->cnt) { + return NULL; + } + + node = list->head; + for (cnt = 0; node != NULL && cnt < idx; cnt++) { + node = node->next; + } + + return node; +} + +ares_llist_node_t *ares_llist_node_last(ares_llist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->tail; +} + +ares_llist_node_t *ares_llist_node_next(ares_llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->next; +} + +ares_llist_node_t *ares_llist_node_prev(ares_llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->prev; +} + +void *ares_llist_node_val(ares_llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + + return node->data; +} + +size_t ares_llist_len(const ares_llist_t *list) +{ + if (list == NULL) { + return 0; + } + return list->cnt; +} + +ares_llist_t *ares_llist_node_parent(ares_llist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->parent; +} + +void *ares_llist_first_val(ares_llist_t *list) +{ + return ares_llist_node_val(ares_llist_node_first(list)); +} + +void *ares_llist_last_val(ares_llist_t *list) +{ + return ares_llist_node_val(ares_llist_node_last(list)); +} + +static void ares_llist_node_detach(ares_llist_node_t *node) +{ + ares_llist_t *list; + + if (node == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + list = node->parent; + + if (node->prev) { + node->prev->next = node->next; + } + + if (node->next) { + node->next->prev = node->prev; + } + + if (node == list->head) { + list->head = node->next; + } + + if (node == list->tail) { + list->tail = node->prev; + } + + node->parent = NULL; + list->cnt--; +} + +void *ares_llist_node_claim(ares_llist_node_t *node) +{ + void *val; + + if (node == NULL) { + return NULL; + } + + val = node->data; + ares_llist_node_detach(node); + ares_free(node); + + return val; +} + +void ares_llist_node_destroy(ares_llist_node_t *node) +{ + ares_llist_destructor_t destruct; + void *val; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + + val = ares_llist_node_claim(node); + if (val != NULL && destruct != NULL) { + destruct(val); + } +} + +void ares_llist_node_replace(ares_llist_node_t *node, void *val) +{ + ares_llist_destructor_t destruct; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + if (destruct != NULL) { + destruct(node->data); + } + + node->data = val; +} + +void ares_llist_clear(ares_llist_t *list) +{ + ares_llist_node_t *node; + + if (list == NULL) { + return; + } + + while ((node = ares_llist_node_first(list)) != NULL) { + ares_llist_node_destroy(node); + } +} + +void ares_llist_destroy(ares_llist_t *list) +{ + if (list == NULL) { + return; + } + ares_llist_clear(list); + ares_free(list); +} + +void ares_llist_node_mvparent_last(ares_llist_node_t *node, + ares_llist_t *new_parent) +{ + if (node == NULL || new_parent == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_llist_node_detach(node); + ares_llist_attach_at(new_parent, ARES__LLIST_INSERT_TAIL, NULL, node); +} + +void ares_llist_node_mvparent_first(ares_llist_node_t *node, + ares_llist_t *new_parent) +{ + if (node == NULL || new_parent == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_llist_node_detach(node); + ares_llist_attach_at(new_parent, ARES__LLIST_INSERT_HEAD, NULL, node); +} diff --git a/deps/cares/src/lib/dsa/ares_slist.c b/deps/cares/src/lib/dsa/ares_slist.c new file mode 100644 index 00000000000000..7e68347994ce4c --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_slist.c @@ -0,0 +1,479 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_slist.h" + +/* SkipList implementation */ + +#define ARES__SLIST_START_LEVELS 4 + +struct ares_slist { + ares_rand_state *rand_state; + unsigned char rand_data[8]; + size_t rand_bits; + + ares_slist_node_t **head; + size_t levels; + ares_slist_node_t *tail; + + ares_slist_cmp_t cmp; + ares_slist_destructor_t destruct; + size_t cnt; +}; + +struct ares_slist_node { + void *data; + ares_slist_node_t **prev; + ares_slist_node_t **next; + size_t levels; + ares_slist_t *parent; +}; + +ares_slist_t *ares_slist_create(ares_rand_state *rand_state, + ares_slist_cmp_t cmp, + ares_slist_destructor_t destruct) +{ + ares_slist_t *list; + + if (rand_state == NULL || cmp == NULL) { + return NULL; + } + + list = ares_malloc_zero(sizeof(*list)); + + if (list == NULL) { + return NULL; + } + + list->rand_state = rand_state; + list->cmp = cmp; + list->destruct = destruct; + + list->levels = ARES__SLIST_START_LEVELS; + list->head = ares_malloc_zero(sizeof(*list->head) * list->levels); + if (list->head == NULL) { + ares_free(list); + return NULL; + } + + return list; +} + +static ares_bool_t ares_slist_coin_flip(ares_slist_t *list) +{ + size_t total_bits = sizeof(list->rand_data) * 8; + size_t bit; + + /* Refill random data used for coin flips. We pull this in 8 byte chunks. + * ares_rand_bytes() has some built-in caching of its own so we don't need + * to be excessive in caching ourselves. Prefer to require less memory per + * skiplist */ + if (list->rand_bits == 0) { + ares_rand_bytes(list->rand_state, list->rand_data, sizeof(list->rand_data)); + list->rand_bits = total_bits; + } + + bit = total_bits - list->rand_bits; + list->rand_bits--; + + return (list->rand_data[bit / 8] & (1 << (bit % 8))) ? ARES_TRUE : ARES_FALSE; +} + +void ares_slist_replace_destructor(ares_slist_t *list, + ares_slist_destructor_t destruct) +{ + if (list == NULL) { + return; + } + + list->destruct = destruct; +} + +static size_t ares_slist_max_level(const ares_slist_t *list) +{ + size_t max_level = 0; + + if (list->cnt + 1 <= (1 << ARES__SLIST_START_LEVELS)) { + max_level = ARES__SLIST_START_LEVELS; + } else { + max_level = ares_log2(ares_round_up_pow2(list->cnt + 1)); + } + + if (list->levels > max_level) { + max_level = list->levels; + } + + return max_level; +} + +static size_t ares_slist_calc_level(ares_slist_t *list) +{ + size_t max_level = ares_slist_max_level(list); + size_t level; + + for (level = 1; ares_slist_coin_flip(list) && level < max_level; level++) + ; + + return level; +} + +static void ares_slist_node_push(ares_slist_t *list, ares_slist_node_t *node) +{ + size_t i; + ares_slist_node_t *left = NULL; + + /* Scan from highest level in the slist, even if we're not using that number + * of levels for this entry as this is what makes it O(log n) */ + for (i = list->levels; i-- > 0;) { + /* set left if left is NULL and the current node value is greater than the + * head at this level */ + if (left == NULL && list->head[i] != NULL && + list->cmp(node->data, list->head[i]->data) > 0) { + left = list->head[i]; + } + + if (left != NULL) { + /* scan forward to find our insertion point */ + while (left->next[i] != NULL && + list->cmp(node->data, left->next[i]->data) > 0) { + left = left->next[i]; + } + } + + /* search only as we didn't randomly select this number of levels */ + if (i >= node->levels) { + continue; + } + + if (left == NULL) { + /* head insertion */ + node->next[i] = list->head[i]; + node->prev[i] = NULL; + list->head[i] = node; + } else { + /* Chain */ + node->next[i] = left->next[i]; + node->prev[i] = left; + left->next[i] = node; + } + + if (node->next[i] != NULL) { + /* chain prev */ + node->next[i]->prev[i] = node; + } else { + if (i == 0) { + /* update tail */ + list->tail = node; + } + } + } +} + +ares_slist_node_t *ares_slist_insert(ares_slist_t *list, void *val) +{ + ares_slist_node_t *node = NULL; + + if (list == NULL || val == NULL) { + return NULL; + } + + node = ares_malloc_zero(sizeof(*node)); + + if (node == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + node->data = val; + node->parent = list; + + /* Randomly determine the number of levels we want to use */ + node->levels = ares_slist_calc_level(list); + + /* Allocate array of next and prev nodes for linking each level */ + node->next = ares_malloc_zero(sizeof(*node->next) * node->levels); + if (node->next == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + node->prev = ares_malloc_zero(sizeof(*node->prev) * node->levels); + if (node->prev == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* If the number of levels is greater than we currently support in the slist, + * increase the count */ + if (list->levels < node->levels) { + void *ptr = + ares_realloc_zero(list->head, sizeof(*list->head) * list->levels, + sizeof(*list->head) * node->levels); + if (ptr == NULL) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + list->head = ptr; + list->levels = node->levels; + } + + ares_slist_node_push(list, node); + + list->cnt++; + + return node; + +/* LCOV_EXCL_START: OutOfMemory */ +fail: + if (node) { + ares_free(node->prev); + ares_free(node->next); + ares_free(node); + } + return NULL; + /* LCOV_EXCL_STOP */ +} + +static void ares_slist_node_pop(ares_slist_node_t *node) +{ + ares_slist_t *list = node->parent; + size_t i; + + /* relink each node at each level */ + for (i = node->levels; i-- > 0;) { + if (node->next[i] == NULL) { + if (i == 0) { + list->tail = node->prev[0]; + } + } else { + node->next[i]->prev[i] = node->prev[i]; + } + + if (node->prev[i] == NULL) { + list->head[i] = node->next[i]; + } else { + node->prev[i]->next[i] = node->next[i]; + } + } + + memset(node->next, 0, sizeof(*node->next) * node->levels); + memset(node->prev, 0, sizeof(*node->prev) * node->levels); +} + +void *ares_slist_node_claim(ares_slist_node_t *node) +{ + ares_slist_t *list; + void *val; + + if (node == NULL) { + return NULL; + } + + list = node->parent; + val = node->data; + + ares_slist_node_pop(node); + + ares_free(node->next); + ares_free(node->prev); + ares_free(node); + + list->cnt--; + + return val; +} + +void ares_slist_node_reinsert(ares_slist_node_t *node) +{ + ares_slist_t *list; + + if (node == NULL) { + return; + } + + list = node->parent; + + ares_slist_node_pop(node); + ares_slist_node_push(list, node); +} + +ares_slist_node_t *ares_slist_node_find(const ares_slist_t *list, + const void *val) +{ + size_t i; + ares_slist_node_t *node = NULL; + int rv = -1; + + if (list == NULL || val == NULL) { + return NULL; + } + + /* Scan nodes starting at the highest level. For each level scan forward + * until the value is between the prior and next node, or if equal quit + * as we found a match */ + for (i = list->levels; i-- > 0;) { + if (node == NULL) { + node = list->head[i]; + } + + if (node == NULL) { + continue; + } + + do { + rv = list->cmp(val, node->data); + + if (rv < 0) { + /* back off, our value is greater than current node reference */ + node = node->prev[i]; + } else if (rv > 0) { + /* move forward and try again. if it goes past, it will loop again and + * go to previous entry */ + node = node->next[i]; + } + + /* rv == 0 will terminate loop */ + + } while (node != NULL && rv > 0); + + /* Found a match, no need to continue */ + if (rv == 0) { + break; + } + } + + /* no match */ + if (rv != 0) { + return NULL; + } + + /* The list may have multiple entries that match. They're guaranteed to be + * in order, but we're not guaranteed to have selected the _first_ matching + * node. Lets scan backwards to find the first match */ + while (node->prev[0] != NULL && list->cmp(node->prev[0]->data, val) == 0) { + node = node->prev[0]; + } + + return node; +} + +ares_slist_node_t *ares_slist_node_first(const ares_slist_t *list) +{ + if (list == NULL) { + return NULL; + } + + return list->head[0]; +} + +ares_slist_node_t *ares_slist_node_last(const ares_slist_t *list) +{ + if (list == NULL) { + return NULL; + } + return list->tail; +} + +ares_slist_node_t *ares_slist_node_next(const ares_slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->next[0]; +} + +ares_slist_node_t *ares_slist_node_prev(const ares_slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->prev[0]; +} + +void *ares_slist_node_val(ares_slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + + return node->data; +} + +size_t ares_slist_len(const ares_slist_t *list) +{ + if (list == NULL) { + return 0; + } + return list->cnt; +} + +ares_slist_t *ares_slist_node_parent(ares_slist_node_t *node) +{ + if (node == NULL) { + return NULL; + } + return node->parent; +} + +void *ares_slist_first_val(const ares_slist_t *list) +{ + return ares_slist_node_val(ares_slist_node_first(list)); +} + +void *ares_slist_last_val(const ares_slist_t *list) +{ + return ares_slist_node_val(ares_slist_node_last(list)); +} + +void ares_slist_node_destroy(ares_slist_node_t *node) +{ + ares_slist_destructor_t destruct; + void *val; + + if (node == NULL) { + return; + } + + destruct = node->parent->destruct; + val = ares_slist_node_claim(node); + + if (val != NULL && destruct != NULL) { + destruct(val); + } +} + +void ares_slist_destroy(ares_slist_t *list) +{ + ares_slist_node_t *node; + + if (list == NULL) { + return; + } + + while ((node = ares_slist_node_first(list)) != NULL) { + ares_slist_node_destroy(node); + } + + ares_free(list->head); + ares_free(list); +} diff --git a/deps/cares/src/lib/dsa/ares_slist.h b/deps/cares/src/lib/dsa/ares_slist.h new file mode 100644 index 00000000000000..a89c2652f2d4d4 --- /dev/null +++ b/deps/cares/src/lib/dsa/ares_slist.h @@ -0,0 +1,207 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__SLIST_H +#define __ARES__SLIST_H + + +/*! \addtogroup ares_slist SkipList Data Structure + * + * This data structure is known as a Skip List, which in essence is a sorted + * linked list with multiple levels of linkage to gain some algorithmic + * advantages. The usage symantecs are almost identical to what you'd expect + * with a linked list. + * + * Average time complexity: + * - Insert: O(log n) + * - Search: O(log n) + * - Delete: O(1) -- delete assumes you hold a node pointer + * + * It should be noted, however, that "effort" involved with an insert or + * remove operation is higher than a normal linked list. For very small + * lists this may be less efficient, but for any list with a moderate number + * of entries this will prove much more efficient. + * + * This data structure is often compared with a Binary Search Tree in + * functionality and usage. + * + * @{ + */ +struct ares_slist; + +/*! SkipList Object, opaque */ +typedef struct ares_slist ares_slist_t; + +struct ares_slist_node; + +/*! SkipList Node Object, opaque */ +typedef struct ares_slist_node ares_slist_node_t; + +/*! SkipList Node Value destructor callback + * + * \param[in] data User-defined data to destroy + */ +typedef void (*ares_slist_destructor_t)(void *data); + +/*! SkipList comparison function + * + * \param[in] data1 First user-defined data object + * \param[in] data2 Second user-defined data object + * \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2 + */ +typedef int (*ares_slist_cmp_t)(const void *data1, const void *data2); + +/*! Create SkipList + * + * \param[in] rand_state Initialized ares random state. + * \param[in] cmp SkipList comparison function + * \param[in] destruct SkipList Node Value Destructor. Optional, use NULL. + * \return Initialized SkipList Object or NULL on misuse or ENOMEM + */ +ares_slist_t *ares_slist_create(ares_rand_state *rand_state, + ares_slist_cmp_t cmp, + ares_slist_destructor_t destruct); + +/*! Replace SkipList Node Value Destructor + * + * \param[in] list Initialized SkipList Object + * \param[in] destruct Replacement destructor. May be NULL. + */ +void ares_slist_replace_destructor(ares_slist_t *list, + ares_slist_destructor_t destruct); + +/*! Insert Value into SkipList + * + * \param[in] list Initialized SkipList Object + * \param[in] val Node Value. Must not be NULL. Function takes ownership + * and will have destructor called. + * \return SkipList Node Object or NULL on misuse or ENOMEM + */ +ares_slist_node_t *ares_slist_insert(ares_slist_t *list, void *val); + +/*! Fetch first node in SkipList + * + * \param[in] list Initialized SkipList Object + * \return SkipList Node Object or NULL if none + */ +ares_slist_node_t *ares_slist_node_first(const ares_slist_t *list); + +/*! Fetch last node in SkipList + * + * \param[in] list Initialized SkipList Object + * \return SkipList Node Object or NULL if none + */ +ares_slist_node_t *ares_slist_node_last(const ares_slist_t *list); + +/*! Fetch next node in SkipList + * + * \param[in] node SkipList Node Object + * \return SkipList Node Object or NULL if none + */ +ares_slist_node_t *ares_slist_node_next(const ares_slist_node_t *node); + +/*! Fetch previous node in SkipList + * + * \param[in] node SkipList Node Object + * \return SkipList Node Object or NULL if none + */ +ares_slist_node_t *ares_slist_node_prev(const ares_slist_node_t *node); + +/*! Fetch SkipList Node Object by Value + * + * \param[in] list Initialized SkipList Object + * \param[in] val Object to use for comparison + * \return SkipList Node Object or NULL if not found + */ +ares_slist_node_t *ares_slist_node_find(const ares_slist_t *list, + const void *val); + + +/*! Fetch Node Value + * + * \param[in] node SkipList Node Object + * \return user defined node value + */ +void *ares_slist_node_val(ares_slist_node_t *node); + +/*! Fetch number of entries in SkipList Object + * + * \param[in] list Initialized SkipList Object + * \return number of entries + */ +size_t ares_slist_len(const ares_slist_t *list); + +/*! Fetch SkipList Object from SkipList Node + * + * \param[in] node SkipList Node Object + * \return SkipList Object + */ +ares_slist_t *ares_slist_node_parent(ares_slist_node_t *node); + +/*! Fetch first Node Value in SkipList + * + * \param[in] list Initialized SkipList Object + * \return user defined node value or NULL if none + */ +void *ares_slist_first_val(const ares_slist_t *list); + +/*! Fetch last Node Value in SkipList + * + * \param[in] list Initialized SkipList Object + * \return user defined node value or NULL if none + */ +void *ares_slist_last_val(const ares_slist_t *list); + +/*! Take back ownership of Node Value in SkipList, remove from SkipList. + * + * \param[in] node SkipList Node Object + * \return user defined node value + */ +void *ares_slist_node_claim(ares_slist_node_t *node); + +/*! The internals of the node have changed, thus its position in the sorted + * list is no longer valid. This function will remove it and re-add it to + * the proper position without needing to perform any memory allocations + * and thus cannot fail. + * + * \param[in] node SkipList Node Object + */ +void ares_slist_node_reinsert(ares_slist_node_t *node); + +/*! Remove Node from SkipList, calling destructor for Node Value. + * + * \param[in] node SkipList Node Object + */ +void ares_slist_node_destroy(ares_slist_node_t *node); + +/*! Destroy SkipList Object. If there are any nodes, they will be destroyed. + * + * \param[in] list Initialized SkipList Object + */ +void ares_slist_destroy(ares_slist_t *list); + +/*! @} */ + +#endif /* __ARES__SLIST_H */ diff --git a/deps/cares/src/lib/ares_event.h b/deps/cares/src/lib/event/ares_event.h similarity index 85% rename from deps/cares/src/lib/ares_event.h rename to deps/cares/src/lib/event/ares_event.h index 23e9637924ba07..bf298dfb6196ba 100644 --- a/deps/cares/src/lib/ares_event.h +++ b/deps/cares/src/lib/event/ares_event.h @@ -26,8 +26,6 @@ #ifndef __ARES__EVENT_H #define __ARES__EVENT_H -#include "ares_setup.h" - struct ares_event; typedef struct ares_event ares_event_t; @@ -79,28 +77,43 @@ typedef struct { size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms); } ares_event_sys_t; +struct ares_event_configchg; +typedef struct ares_event_configchg ares_event_configchg_t; + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e); + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg); + struct ares_event_thread { /*! Whether the event thread should be online or not. Checked on every wake * event before sleeping. */ ares_bool_t isup; /*! Handle to the thread for joining during shutdown */ - ares__thread_t *thread; + ares_thread_t *thread; /*! Lock to protect the data contained within the event thread itself */ - ares__thread_mutex_t *mutex; + ares_thread_mutex_t *mutex; /*! Reference to the ares channel, for being able to call things like * ares_timeout() and ares_process_fd(). */ ares_channel_t *channel; + /*! Whether or not on the next loop we should process a pending write */ + ares_bool_t process_pending_write; /*! Not-yet-processed event handle updates. These will get enqueued by a * thread other than the event thread itself. The event thread will then * be woken then process these updates itself */ - ares__llist_t *ev_updates; - /*! Registered event handles. */ - ares__htable_asvp_t *ev_handles; + ares_llist_t *ev_updates; + /*! Registered socket event handles */ + ares_htable_asvp_t *ev_sock_handles; + /*! Registered custom event handles. Typically used for external triggering. + */ + ares_htable_vpvp_t *ev_cust_handles; /*! Pointer to the event handle which is used to signal and wake the event * thread itself. This is needed to be able to do things like update the * file descriptors being waited on and to wake the event subsystem during * shutdown */ ares_event_t *ev_signal; + /*! Handle for configuration change monitoring */ + ares_event_configchg_t *configchg; /* Event subsystem callbacks */ const ares_event_sys_t *ev_sys; /* Event subsystem private data */ @@ -124,7 +137,8 @@ struct ares_event_thread { * Non-socket events cannot be removed, and must have * ARES_EVENT_FLAG_OTHER set. * \param[in] cb Callback to call when - * event is triggered. Required. Not allowed to be + * event is triggered. Required if flags is not + * ARES_EVENT_FLAG_NONE. Not allowed to be * changed, ignored on modification. * \param[in] fd File descriptor/socket to monitor. May * be ARES_SOCKET_BAD if not monitoring file @@ -145,30 +159,33 @@ ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e, ares_event_signal_cb_t signal_cb); -#ifdef HAVE_PIPE +#ifdef CARES_THREADS +# ifdef HAVE_PIPE ares_event_t *ares_pipeevent_create(ares_event_thread_t *e); -#endif +# endif -#ifdef HAVE_POLL +# ifdef HAVE_POLL extern const ares_event_sys_t ares_evsys_poll; -#endif +# endif -#ifdef HAVE_KQUEUE +# ifdef HAVE_KQUEUE extern const ares_event_sys_t ares_evsys_kqueue; -#endif +# endif -#ifdef HAVE_EPOLL +# ifdef HAVE_EPOLL extern const ares_event_sys_t ares_evsys_epoll; -#endif +# endif -#ifdef _WIN32 +# ifdef _WIN32 extern const ares_event_sys_t ares_evsys_win32; -#endif +# endif /* All systems have select(), but not all have a way to wake, so we require * pipe() to wake the select() */ -#ifdef HAVE_PIPE +# ifdef HAVE_PIPE extern const ares_event_sys_t ares_evsys_select; +# endif + #endif #endif diff --git a/deps/cares/src/lib/event/ares_event_configchg.c b/deps/cares/src/lib/event/ares_event_configchg.c new file mode 100644 index 00000000000000..add729574e46c3 --- /dev/null +++ b/deps/cares/src/lib/event/ares_event_configchg.c @@ -0,0 +1,744 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_event.h" + +#if defined(__ANDROID__) && defined(CARES_THREADS) + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + (void)configchg; + (void)e; + /* No ability */ + return ARES_ENOTIMP; +} + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + /* No-op */ + (void)configchg; +} + +#elif defined(__linux__) && defined(CARES_THREADS) + +# include <sys/inotify.h> + +struct ares_event_configchg { + int inotify_fd; + ares_event_thread_t *e; +}; + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + if (configchg == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Tell event system to stop monitoring for changes. This will cause the + * cleanup to be called */ + ares_event_update(NULL, configchg->e, ARES_EVENT_FLAG_NONE, NULL, + configchg->inotify_fd, NULL, NULL, NULL); +} + +static void ares_event_configchg_free(void *data) +{ + ares_event_configchg_t *configchg = data; + if (configchg == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (configchg->inotify_fd >= 0) { + close(configchg->inotify_fd); + configchg->inotify_fd = -1; + } + + ares_free(configchg); +} + +static void ares_event_configchg_cb(ares_event_thread_t *e, ares_socket_t fd, + void *data, ares_event_flags_t flags) +{ + const ares_event_configchg_t *configchg = data; + + /* Some systems cannot read integer variables if they are not + * properly aligned. On other systems, incorrect alignment may + * decrease performance. Hence, the buffer used for reading from + * the inotify file descriptor should have the same alignment as + * struct inotify_event. */ + unsigned char buf[4096] + __attribute__((aligned(__alignof__(struct inotify_event)))); + const struct inotify_event *event; + ssize_t len; + ares_bool_t triggered = ARES_FALSE; + + (void)fd; + (void)flags; + + while (1) { + const unsigned char *ptr; + + len = read(configchg->inotify_fd, buf, sizeof(buf)); + if (len <= 0) { + break; + } + + /* Loop over all events in the buffer. Says kernel will check the buffer + * size provided, so I assume it won't ever return partial events. */ + for (ptr = buf; ptr < buf + len; + ptr += sizeof(struct inotify_event) + event->len) { + event = (const struct inotify_event *)((const void *)ptr); + + if (event->len == 0 || ares_strlen(event->name) == 0) { + continue; + } + + if (ares_strcaseeq(event->name, "resolv.conf") || + ares_strcaseeq(event->name, "nsswitch.conf")) { + triggered = ARES_TRUE; + } + } + } + + /* Only process after all events are read. No need to process more often as + * we don't want to reload the config back to back */ + if (triggered) { + ares_reinit(e->channel); + } +} + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + ares_status_t status = ARES_SUCCESS; + ares_event_configchg_t *c; + + (void)e; + + /* Not used by this implementation */ + *configchg = NULL; + + c = ares_malloc_zero(sizeof(*c)); + if (c == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + c->e = e; + c->inotify_fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); + if (c->inotify_fd == -1) { + status = ARES_ESERVFAIL; /* LCOV_EXCL_LINE: UntestablePath */ + goto done; /* LCOV_EXCL_LINE: UntestablePath */ + } + + /* We need to monitor /etc/resolv.conf, /etc/nsswitch.conf */ + if (inotify_add_watch(c->inotify_fd, "/etc", + IN_CREATE | IN_MODIFY | IN_MOVED_TO | IN_ONLYDIR) == + -1) { + status = ARES_ESERVFAIL; /* LCOV_EXCL_LINE: UntestablePath */ + goto done; /* LCOV_EXCL_LINE: UntestablePath */ + } + + status = + ares_event_update(NULL, e, ARES_EVENT_FLAG_READ, ares_event_configchg_cb, + c->inotify_fd, c, ares_event_configchg_free, NULL); + +done: + if (status != ARES_SUCCESS) { + ares_event_configchg_free(c); + } else { + *configchg = c; + } + return status; +} + +#elif defined(USE_WINSOCK) && defined(CARES_THREADS) + +# include <winsock2.h> +# include <iphlpapi.h> +# include <stdio.h> +# include <windows.h> + +struct ares_event_configchg { + HANDLE ifchg_hnd; + HKEY regip4; + HANDLE regip4_event; + HANDLE regip4_wait; + HKEY regip6; + HANDLE regip6_event; + HANDLE regip6_wait; + ares_event_thread_t *e; +}; + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + if (configchg == NULL) { + return; + } + +# ifdef HAVE_NOTIFYIPINTERFACECHANGE + if (configchg->ifchg_hnd != NULL) { + CancelMibChangeNotify2(configchg->ifchg_hnd); + configchg->ifchg_hnd = NULL; + } +# endif + +# ifdef HAVE_REGISTERWAITFORSINGLEOBJECT + if (configchg->regip4_wait != NULL) { + UnregisterWait(configchg->regip4_wait); + configchg->regip4_wait = NULL; + } + + if (configchg->regip6_wait != NULL) { + UnregisterWait(configchg->regip6_wait); + configchg->regip6_wait = NULL; + } + + if (configchg->regip4 != NULL) { + RegCloseKey(configchg->regip4); + configchg->regip4 = NULL; + } + + if (configchg->regip6 != NULL) { + RegCloseKey(configchg->regip6); + configchg->regip6 = NULL; + } + + if (configchg->regip4_event != NULL) { + CloseHandle(configchg->regip4_event); + configchg->regip4_event = NULL; + } + + if (configchg->regip6_event != NULL) { + CloseHandle(configchg->regip6_event); + configchg->regip6_event = NULL; + } +# endif + + ares_free(configchg); +} + + +# ifdef HAVE_NOTIFYIPINTERFACECHANGE +static void NETIOAPI_API_ + ares_event_configchg_ip_cb(PVOID CallerContext, PMIB_IPINTERFACE_ROW Row, + MIB_NOTIFICATION_TYPE NotificationType) +{ + ares_event_configchg_t *configchg = CallerContext; + (void)Row; + (void)NotificationType; + ares_reinit(configchg->e->channel); +} +# endif + +static ares_bool_t + ares_event_configchg_regnotify(ares_event_configchg_t *configchg) +{ +# ifdef HAVE_REGISTERWAITFORSINGLEOBJECT +# if defined(__WATCOMC__) && !defined(REG_NOTIFY_THREAD_AGNOSTIC) +# define REG_NOTIFY_THREAD_AGNOSTIC 0x10000000L +# endif + DWORD flags = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET | + REG_NOTIFY_THREAD_AGNOSTIC; + + if (RegNotifyChangeKeyValue(configchg->regip4, TRUE, flags, + configchg->regip4_event, TRUE) != ERROR_SUCCESS) { + return ARES_FALSE; + } + + if (RegNotifyChangeKeyValue(configchg->regip6, TRUE, flags, + configchg->regip6_event, TRUE) != ERROR_SUCCESS) { + return ARES_FALSE; + } +# else + (void)configchg; +# endif + return ARES_TRUE; +} + +static VOID CALLBACK ares_event_configchg_reg_cb(PVOID lpParameter, + BOOLEAN TimerOrWaitFired) +{ + ares_event_configchg_t *configchg = lpParameter; + (void)TimerOrWaitFired; + + ares_reinit(configchg->e->channel); + + /* Re-arm, as its single-shot. However, we don't know which one needs to + * be re-armed, so we just do both */ + ares_event_configchg_regnotify(configchg); +} + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + ares_status_t status = ARES_SUCCESS; + ares_event_configchg_t *c = NULL; + + c = ares_malloc_zero(sizeof(**configchg)); + if (c == NULL) { + return ARES_ENOMEM; + } + + c->e = e; + +# ifdef HAVE_NOTIFYIPINTERFACECHANGE + /* NOTE: If a user goes into the control panel and changes the network + * adapter DNS addresses manually, this will NOT trigger a notification. + * We've also tried listening on NotifyUnicastIpAddressChange(), but + * that didn't get triggered either. + */ + if (NotifyIpInterfaceChange(AF_UNSPEC, ares_event_configchg_ip_cb, c, FALSE, + &c->ifchg_hnd) != NO_ERROR) { + status = ARES_ESERVFAIL; + goto done; + } +# endif + +# ifdef HAVE_REGISTERWAITFORSINGLEOBJECT + /* Monitor HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Interfaces + * and HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces + * for changes via RegNotifyChangeKeyValue() */ + if (RegOpenKeyExW( + HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces", + 0, KEY_NOTIFY, &c->regip4) != ERROR_SUCCESS) { + status = ARES_ESERVFAIL; + goto done; + } + + if (RegOpenKeyExW( + HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters\\Interfaces", + 0, KEY_NOTIFY, &c->regip6) != ERROR_SUCCESS) { + status = ARES_ESERVFAIL; + goto done; + } + + c->regip4_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (c->regip4_event == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + c->regip6_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (c->regip6_event == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + if (!RegisterWaitForSingleObject(&c->regip4_wait, c->regip4_event, + ares_event_configchg_reg_cb, c, INFINITE, + WT_EXECUTEDEFAULT)) { + status = ARES_ESERVFAIL; + goto done; + } + + if (!RegisterWaitForSingleObject(&c->regip6_wait, c->regip6_event, + ares_event_configchg_reg_cb, c, INFINITE, + WT_EXECUTEDEFAULT)) { + status = ARES_ESERVFAIL; + goto done; + } +# endif + + if (!ares_event_configchg_regnotify(c)) { + status = ARES_ESERVFAIL; + goto done; + } + +done: + if (status != ARES_SUCCESS) { + ares_event_configchg_destroy(c); + } else { + *configchg = c; + } + + return status; +} + +#elif defined(__APPLE__) && defined(CARES_THREADS) + +# include <sys/types.h> +# include <unistd.h> +# include <stdbool.h> +# include <notify.h> +# include <dlfcn.h> +# include <fcntl.h> + +struct ares_event_configchg { + int fd; + int token; +}; + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + (void)configchg; + + /* Cleanup happens automatically */ +} + +static void ares_event_configchg_free(void *data) +{ + ares_event_configchg_t *configchg = data; + if (configchg == NULL) { + return; + } + + if (configchg->fd >= 0) { + notify_cancel(configchg->token); + /* automatically closes fd */ + configchg->fd = -1; + } + + ares_free(configchg); +} + +static void ares_event_configchg_cb(ares_event_thread_t *e, ares_socket_t fd, + void *data, ares_event_flags_t flags) +{ + ares_event_configchg_t *configchg = data; + ares_bool_t triggered = ARES_FALSE; + + (void)fd; + (void)flags; + + while (1) { + int t = 0; + ssize_t len; + + len = read(configchg->fd, &t, sizeof(t)); + + if (len < (ssize_t)sizeof(t)) { + break; + } + + /* Token is read in network byte order (yeah, docs don't mention this) */ + t = (int)ntohl(t); + + if (t != configchg->token) { + continue; + } + + triggered = ARES_TRUE; + } + + /* Only process after all events are read. No need to process more often as + * we don't want to reload the config back to back */ + if (triggered) { + ares_reinit(e->channel); + } +} + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + ares_status_t status = ARES_SUCCESS; + void *handle = NULL; + const char *(*pdns_configuration_notify_key)(void) = NULL; + const char *notify_key = NULL; + int flags; + size_t i; + const char *searchlibs[] = { + "/usr/lib/libSystem.dylib", + "/System/Library/Frameworks/SystemConfiguration.framework/" + "SystemConfiguration", + NULL + }; + + *configchg = ares_malloc_zero(sizeof(**configchg)); + if (*configchg == NULL) { + return ARES_ENOMEM; + } + + /* Load symbol as it isn't normally public */ + for (i = 0; searchlibs[i] != NULL; i++) { + handle = dlopen(searchlibs[i], RTLD_LAZY); + if (handle == NULL) { + /* Fail, loop! */ + continue; + } + + pdns_configuration_notify_key = + (const char *(*)(void))dlsym(handle, "dns_configuration_notify_key"); + if (pdns_configuration_notify_key != NULL) { + break; + } + + /* Fail, loop! */ + dlclose(handle); + handle = NULL; + } + + if (pdns_configuration_notify_key == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + notify_key = pdns_configuration_notify_key(); + if (notify_key == NULL) { + status = ARES_ESERVFAIL; + goto done; + } + + if (notify_register_file_descriptor(notify_key, &(*configchg)->fd, 0, + &(*configchg)->token) != + NOTIFY_STATUS_OK) { + status = ARES_ESERVFAIL; + goto done; + } + + /* Set file descriptor to non-blocking */ + flags = fcntl((*configchg)->fd, F_GETFL, 0); + fcntl((*configchg)->fd, F_SETFL, flags | O_NONBLOCK); + + /* Register file descriptor with event subsystem */ + status = ares_event_update(NULL, e, ARES_EVENT_FLAG_READ, + ares_event_configchg_cb, (*configchg)->fd, + *configchg, ares_event_configchg_free, NULL); + +done: + if (status != ARES_SUCCESS) { + ares_event_configchg_free(*configchg); + *configchg = NULL; + } + + if (handle) { + dlclose(handle); + } + + return status; +} + +#elif defined(HAVE_STAT) && !defined(_WIN32) && defined(CARES_THREADS) +# ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +# endif +# ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +# endif + +typedef struct { + size_t size; + time_t mtime; +} fileinfo_t; + +struct ares_event_configchg { + ares_bool_t isup; + ares_thread_t *thread; + ares_htable_strvp_t *filestat; + ares_thread_mutex_t *lock; + ares_thread_cond_t *wake; + const char *resolvconf_path; + ares_event_thread_t *e; +}; + +static ares_status_t config_change_check(ares_htable_strvp_t *filestat, + const char *resolvconf_path) +{ + size_t i; + const char *configfiles[16]; + ares_bool_t changed = ARES_FALSE; + size_t cnt = 0; + + memset(configfiles, 0, sizeof(configfiles)); + + configfiles[cnt++] = resolvconf_path; + configfiles[cnt++] = "/etc/nsswitch.conf"; +#ifdef _AIX + configfiles[cnt++] = "/etc/netsvc.conf"; +#endif +#ifdef __osf /* Tru64 */ + configfiles[cnt++] = "/etc/svc.conf"; +#endif +#ifdef __QNX__ + configfiles[cnt++] = "/etc/net.cfg"; +#endif + configfiles[cnt++] = NULL; + + for (i = 0; configfiles[i] != NULL; i++) { + fileinfo_t *fi = ares_htable_strvp_get_direct(filestat, configfiles[i]); + struct stat st; + + if (stat(configfiles[i], &st) == 0) { + if (fi == NULL) { + fi = ares_malloc_zero(sizeof(*fi)); + if (fi == NULL) { + return ARES_ENOMEM; + } + if (!ares_htable_strvp_insert(filestat, configfiles[i], fi)) { + ares_free(fi); + return ARES_ENOMEM; + } + } + if (fi->size != (size_t)st.st_size || fi->mtime != (time_t)st.st_mtime) { + changed = ARES_TRUE; + } + fi->size = (size_t)st.st_size; + fi->mtime = (time_t)st.st_mtime; + } else if (fi != NULL) { + /* File no longer exists, remove */ + ares_htable_strvp_remove(filestat, configfiles[i]); + changed = ARES_TRUE; + } + } + + if (changed) { + return ARES_SUCCESS; + } + return ARES_ENOTFOUND; +} + +static void *ares_event_configchg_thread(void *arg) +{ + ares_event_configchg_t *c = arg; + + ares_thread_mutex_lock(c->lock); + while (c->isup) { + ares_status_t status; + + if (ares_thread_cond_timedwait(c->wake, c->lock, 30000) != ARES_ETIMEOUT) { + continue; + } + + /* make sure status didn't change even though we got a timeout */ + if (!c->isup) { + break; + } + + status = config_change_check(c->filestat, c->resolvconf_path); + if (status == ARES_SUCCESS) { + ares_reinit(c->e->channel); + } + } + + ares_thread_mutex_unlock(c->lock); + return NULL; +} + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + ares_status_t status = ARES_SUCCESS; + ares_event_configchg_t *c = NULL; + + *configchg = NULL; + + c = ares_malloc_zero(sizeof(*c)); + if (c == NULL) { + status = ARES_ENOMEM; + goto done; + } + + c->e = e; + + c->filestat = ares_htable_strvp_create(ares_free); + if (c->filestat == NULL) { + status = ARES_ENOMEM; + goto done; + } + + c->wake = ares_thread_cond_create(); + if (c->wake == NULL) { + status = ARES_ENOMEM; + goto done; + } + + c->lock = ares_thread_mutex_create(); + if (c->lock == NULL) { + status = ARES_ENOMEM; + goto done; + } + + c->resolvconf_path = c->e->channel->resolvconf_path; + if (c->resolvconf_path == NULL) { + c->resolvconf_path = PATH_RESOLV_CONF; + } + + status = config_change_check(c->filestat, c->resolvconf_path); + if (status == ARES_ENOMEM) { + goto done; + } + + c->isup = ARES_TRUE; + status = ares_thread_create(&c->thread, ares_event_configchg_thread, c); + +done: + if (status != ARES_SUCCESS) { + ares_event_configchg_destroy(c); + } else { + *configchg = c; + } + return status; +} + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + if (configchg == NULL) { + return; + } + + if (configchg->lock) { + ares_thread_mutex_lock(configchg->lock); + } + + configchg->isup = ARES_FALSE; + if (configchg->wake) { + ares_thread_cond_signal(configchg->wake); + } + + if (configchg->lock) { + ares_thread_mutex_unlock(configchg->lock); + } + + if (configchg->thread) { + void *rv = NULL; + ares_thread_join(configchg->thread, &rv); + } + + ares_thread_mutex_destroy(configchg->lock); + ares_thread_cond_destroy(configchg->wake); + ares_htable_strvp_destroy(configchg->filestat); + ares_free(configchg); +} + +#else + +ares_status_t ares_event_configchg_init(ares_event_configchg_t **configchg, + ares_event_thread_t *e) +{ + (void)configchg; + (void)e; + /* No ability */ + return ARES_ENOTIMP; +} + +void ares_event_configchg_destroy(ares_event_configchg_t *configchg) +{ + /* No-op */ + (void)configchg; +} + +#endif diff --git a/deps/cares/src/lib/ares_event_epoll.c b/deps/cares/src/lib/event/ares_event_epoll.c similarity index 85% rename from deps/cares/src/lib/ares_event_epoll.c rename to deps/cares/src/lib/event/ares_event_epoll.c index 9d3c097f8e4346..d451c86a3d57e8 100644 --- a/deps/cares/src/lib/ares_event_epoll.c +++ b/deps/cares/src/lib/event/ares_event_epoll.c @@ -23,11 +23,11 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include "ares_event.h" +#if defined(HAVE_EPOLL) && defined(CARES_THREADS) + #ifdef HAVE_SYS_EPOLL_H # include <sys/epoll.h> #endif @@ -35,8 +35,6 @@ # include <fcntl.h> #endif -#ifdef HAVE_EPOLL - typedef struct { int epoll_fd; } ares_evsys_epoll_t; @@ -46,12 +44,12 @@ static void ares_evsys_epoll_destroy(ares_event_thread_t *e) ares_evsys_epoll_t *ep = NULL; if (e == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } ep = e->ev_sys_data; if (ep == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ep->epoll_fd != -1) { @@ -68,25 +66,21 @@ static ares_bool_t ares_evsys_epoll_init(ares_event_thread_t *e) ep = ares_malloc_zero(sizeof(*ep)); if (ep == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: OutOfMemory */ } e->ev_sys_data = ep; - ep->epoll_fd = epoll_create1(0); + ep->epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (ep->epoll_fd == -1) { - ares_evsys_epoll_destroy(e); - return ARES_FALSE; + ares_evsys_epoll_destroy(e); /* LCOV_EXCL_LINE: UntestablePath */ + return ARES_FALSE; /* LCOV_EXCL_LINE: UntestablePath */ } -# ifdef FD_CLOEXEC - fcntl(ep->epoll_fd, F_SETFD, FD_CLOEXEC); -# endif - e->ev_signal = ares_pipeevent_create(e); if (e->ev_signal == NULL) { - ares_evsys_epoll_destroy(e); - return ARES_FALSE; + ares_evsys_epoll_destroy(e); /* LCOV_EXCL_LINE: UntestablePath */ + return ARES_FALSE; /* LCOV_EXCL_LINE: UntestablePath */ } return ARES_TRUE; @@ -108,7 +102,7 @@ static ares_bool_t ares_evsys_epoll_event_add(ares_event_t *event) epev.events |= EPOLLOUT; } if (epoll_ctl(ep->epoll_fd, EPOLL_CTL_ADD, event->fd, &epev) != 0) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: UntestablePath */ } return ARES_TRUE; } @@ -158,7 +152,7 @@ static size_t ares_evsys_epoll_wait(ares_event_thread_t *e, rv = epoll_wait(ep->epoll_fd, events, (int)nevents, (timeout_ms == 0) ? -1 : (int)timeout_ms); if (rv < 0) { - return 0; + return 0; /* LCOV_EXCL_LINE: UntestablePath */ } nevents = (size_t)rv; @@ -167,10 +161,10 @@ static size_t ares_evsys_epoll_wait(ares_event_thread_t *e, ares_event_t *ev; ares_event_flags_t flags = 0; - ev = ares__htable_asvp_get_direct(e->ev_handles, - (ares_socket_t)events[i].data.fd); + ev = ares_htable_asvp_get_direct(e->ev_sock_handles, + (ares_socket_t)events[i].data.fd); if (ev == NULL || ev->cb == NULL) { - continue; + continue; /* LCOV_EXCL_LINE: DefensiveCoding */ } cnt++; diff --git a/deps/cares/src/lib/ares_event_kqueue.c b/deps/cares/src/lib/event/ares_event_kqueue.c similarity index 93% rename from deps/cares/src/lib/ares_event_kqueue.c rename to deps/cares/src/lib/event/ares_event_kqueue.c index 944c4b003bc5a4..00cdcbe9c2a912 100644 --- a/deps/cares/src/lib/ares_event_kqueue.c +++ b/deps/cares/src/lib/event/ares_event_kqueue.c @@ -23,11 +23,11 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include "ares_event.h" +#if defined(HAVE_KQUEUE) && defined(CARES_THREADS) + #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif @@ -41,8 +41,6 @@ # include <fcntl.h> #endif -#ifdef HAVE_KQUEUE - typedef struct { int kqueue_fd; struct kevent *changelist; @@ -95,7 +93,7 @@ static ares_bool_t ares_evsys_kqueue_init(ares_event_thread_t *e) kq->nchanges_alloc = 8; kq->changelist = - ares_malloc_zero(sizeof(*kq->changelist) * kq->nchanges_alloc); + ares_malloc_zero(kq->nchanges_alloc * sizeof(*kq->changelist)); if (kq->changelist == NULL) { ares_evsys_kqueue_destroy(e); return ARES_FALSE; @@ -125,8 +123,9 @@ static void ares_evsys_kqueue_enqueue(ares_evsys_kqueue_t *kq, int fd, if (kq->nchanges > kq->nchanges_alloc) { kq->nchanges_alloc <<= 1; - kq->changelist = ares_realloc_zero(kq->changelist, kq->nchanges_alloc >> 1, - kq->nchanges_alloc); + kq->changelist = ares_realloc_zero( + kq->changelist, (kq->nchanges_alloc >> 1) * sizeof(*kq->changelist), + kq->nchanges_alloc * sizeof(*kq->changelist)); } EV_SET(&kq->changelist[idx], fd, filter, flags, 0, 0, 0); @@ -197,7 +196,7 @@ static size_t ares_evsys_kqueue_wait(ares_event_thread_t *e, size_t cnt = 0; if (timeout_ms != 0) { - ts.tv_sec = timeout_ms / 1000; + ts.tv_sec = (time_t)timeout_ms / 1000; ts.tv_nsec = (timeout_ms % 1000) * 1000 * 1000; timeout = &ts; } @@ -218,8 +217,8 @@ static size_t ares_evsys_kqueue_wait(ares_event_thread_t *e, ares_event_t *ev; ares_event_flags_t flags = 0; - ev = ares__htable_asvp_get_direct(e->ev_handles, - (ares_socket_t)events[i].ident); + ev = ares_htable_asvp_get_direct(e->ev_sock_handles, + (ares_socket_t)events[i].ident); if (ev == NULL || ev->cb == NULL) { continue; } diff --git a/deps/cares/src/lib/ares_event_poll.c b/deps/cares/src/lib/event/ares_event_poll.c similarity index 89% rename from deps/cares/src/lib/ares_event_poll.c rename to deps/cares/src/lib/event/ares_event_poll.c index 33b1d6dfd58ec7..28e3c096576751 100644 --- a/deps/cares/src/lib/ares_event_poll.c +++ b/deps/cares/src/lib/event/ares_event_poll.c @@ -23,21 +23,20 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include "ares_event.h" + +#if defined(HAVE_POLL) && defined(CARES_THREADS) + #ifdef HAVE_POLL_H # include <poll.h> #endif -#if defined(HAVE_POLL) - static ares_bool_t ares_evsys_poll_init(ares_event_thread_t *e) { e->ev_signal = ares_pipeevent_create(e); if (e->ev_signal == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: UntestablePath */ } return ARES_TRUE; } @@ -69,7 +68,7 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e, unsigned long timeout_ms) { size_t num_fds = 0; - ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds); + ares_socket_t *fdlist = ares_htable_asvp_keys(e->ev_sock_handles, &num_fds); struct pollfd *pollfd = NULL; int rv; size_t cnt = 0; @@ -78,11 +77,11 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e, if (fdlist != NULL && num_fds) { pollfd = ares_malloc_zero(sizeof(*pollfd) * num_fds); if (pollfd == NULL) { - goto done; + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } for (i = 0; i < num_fds; i++) { const ares_event_t *ev = - ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]); + ares_htable_asvp_get_direct(e->ev_sock_handles, fdlist[i]); pollfd[i].fd = ev->fd; if (ev->flags & ARES_EVENT_FLAG_READ) { pollfd[i].events |= POLLIN; @@ -109,9 +108,9 @@ static size_t ares_evsys_poll_wait(ares_event_thread_t *e, cnt++; - ev = ares__htable_asvp_get_direct(e->ev_handles, pollfd[i].fd); + ev = ares_htable_asvp_get_direct(e->ev_sock_handles, pollfd[i].fd); if (ev == NULL || ev->cb == NULL) { - continue; + continue; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (pollfd[i].revents & (POLLERR | POLLHUP | POLLIN)) { diff --git a/deps/cares/src/lib/ares_event_select.c b/deps/cares/src/lib/event/ares_event_select.c similarity index 81% rename from deps/cares/src/lib/ares_event_select.c rename to deps/cares/src/lib/event/ares_event_select.c index 4823e808f10df6..df758b5a1e5172 100644 --- a/deps/cares/src/lib/ares_event_select.c +++ b/deps/cares/src/lib/event/ares_event_select.c @@ -23,23 +23,28 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" + +/* Some systems might default to something low like 256 (NetBSD), lets define + * this to assist. Really, no one should be using select, but lets be safe + * anyhow */ +#define FD_SETSIZE 4096 + #include "ares_private.h" #include "ares_event.h" -#ifdef HAVE_SYS_SELECT_H -# include <sys/select.h> -#endif /* All systems have select(), but not all have a way to wake, so we require * pipe() to wake the select() */ -#if defined(HAVE_PIPE) +#if defined(HAVE_PIPE) && defined(CARES_THREADS) + +#ifdef HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif static ares_bool_t ares_evsys_select_init(ares_event_thread_t *e) { e->ev_signal = ares_pipeevent_create(e); if (e->ev_signal == NULL) { - return ARES_FALSE; + return ARES_FALSE; /* LCOV_EXCL_LINE: UntestablePath */ } return ARES_TRUE; } @@ -71,28 +76,31 @@ static size_t ares_evsys_select_wait(ares_event_thread_t *e, unsigned long timeout_ms) { size_t num_fds = 0; - ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds); + ares_socket_t *fdlist = ares_htable_asvp_keys(e->ev_sock_handles, &num_fds); int rv; size_t cnt = 0; size_t i; fd_set read_fds; fd_set write_fds; + fd_set except_fds; int nfds = 0; struct timeval tv; struct timeval *tout = NULL; FD_ZERO(&read_fds); FD_ZERO(&write_fds); + FD_ZERO(&except_fds); for (i = 0; i < num_fds; i++) { const ares_event_t *ev = - ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]); + ares_htable_asvp_get_direct(e->ev_sock_handles, fdlist[i]); if (ev->flags & ARES_EVENT_FLAG_READ) { FD_SET(ev->fd, &read_fds); } if (ev->flags & ARES_EVENT_FLAG_WRITE) { FD_SET(ev->fd, &write_fds); } + FD_SET(ev->fd, &except_fds); if (ev->fd + 1 > nfds) { nfds = ev->fd + 1; } @@ -104,18 +112,18 @@ static size_t ares_evsys_select_wait(ares_event_thread_t *e, tout = &tv; } - rv = select(nfds, &read_fds, &write_fds, NULL, tout); + rv = select(nfds, &read_fds, &write_fds, &except_fds, tout); if (rv > 0) { for (i = 0; i < num_fds; i++) { ares_event_t *ev; ares_event_flags_t flags = 0; - ev = ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]); + ev = ares_htable_asvp_get_direct(e->ev_sock_handles, fdlist[i]); if (ev == NULL || ev->cb == NULL) { - continue; + continue; /* LCOV_EXCL_LINE: DefensiveCoding */ } - if (FD_ISSET(fdlist[i], &read_fds)) { + if (FD_ISSET(fdlist[i], &read_fds) || FD_ISSET(fdlist[i], &except_fds)) { flags |= ARES_EVENT_FLAG_READ; } diff --git a/deps/cares/src/lib/event/ares_event_thread.c b/deps/cares/src/lib/event/ares_event_thread.c new file mode 100644 index 00000000000000..35e86377c29272 --- /dev/null +++ b/deps/cares/src/lib/event/ares_event_thread.c @@ -0,0 +1,575 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_event.h" + +#ifdef CARES_THREADS +static void ares_event_destroy_cb(void *arg) +{ + ares_event_t *event = arg; + if (event == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Unregister from the event thread if it was registered with one */ + if (event->e) { + const ares_event_thread_t *e = event->e; + e->ev_sys->event_del(event); + event->e = NULL; + } + + if (event->free_data_cb && event->data) { + event->free_data_cb(event->data); + } + + ares_free(event); +} + +static void ares_event_signal(const ares_event_t *event) +{ + if (event == NULL || event->signal_cb == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + event->signal_cb(event); +} + +static void ares_event_thread_wake(const ares_event_thread_t *e) +{ + if (e == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_event_signal(e->ev_signal); +} + +/* See if a pending update already exists. We don't want to enqueue multiple + * updates for the same event handle. Right now this is O(n) based on number + * of updates already enqueued. In the future, it might make sense to make + * this O(1) with a hashtable. + * NOTE: in some cases a delete then re-add of the same fd, but really pointing + * to a different destination can happen due to a quick close of a + * connection then creation of a new one. So we need to look at the + * flags and ignore any delete events when finding a match since we + * need to process the delete always, it can't be combined with other + * updates. */ +static ares_event_t *ares_event_update_find(ares_event_thread_t *e, + ares_socket_t fd, const void *data) +{ + ares_llist_node_t *node; + + for (node = ares_llist_node_first(e->ev_updates); node != NULL; + node = ares_llist_node_next(node)) { + ares_event_t *ev = ares_llist_node_val(node); + + if (fd != ARES_SOCKET_BAD && fd == ev->fd && ev->flags != 0) { + return ev; + } + + if (fd == ARES_SOCKET_BAD && ev->fd == ARES_SOCKET_BAD && + data == ev->data && ev->flags != 0) { + return ev; + } + } + + return NULL; +} + +ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e, + ares_event_flags_t flags, ares_event_cb_t cb, + ares_socket_t fd, void *data, + ares_event_free_data_t free_data_cb, + ares_event_signal_cb_t signal_cb) +{ + ares_event_t *ev = NULL; + ares_status_t status; + + if (e == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Callback must be specified if not a removal event. */ + if (flags != ARES_EVENT_FLAG_NONE && cb == NULL) { + return ARES_EFORMERR; + } + + if (event != NULL) { + *event = NULL; + } + + /* Validate flags */ + if (fd == ARES_SOCKET_BAD) { + if (flags & (ARES_EVENT_FLAG_READ | ARES_EVENT_FLAG_WRITE)) { + return ARES_EFORMERR; + } + if (!(flags & ARES_EVENT_FLAG_OTHER)) { + return ARES_EFORMERR; + } + } else { + if (flags & ARES_EVENT_FLAG_OTHER) { + return ARES_EFORMERR; + } + } + + /* That's all the validation we can really do */ + + ares_thread_mutex_lock(e->mutex); + + /* See if we have a queued update already */ + ev = ares_event_update_find(e, fd, data); + if (ev == NULL) { + /* Allocate a new one */ + ev = ares_malloc_zero(sizeof(*ev)); + if (ev == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + if (ares_llist_insert_last(e->ev_updates, ev) == NULL) { + ares_free(ev); /* LCOV_EXCL_LINE: OutOfMemory */ + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + ev->flags = flags; + ev->fd = fd; + if (ev->cb == NULL) { + ev->cb = cb; + } + if (ev->data == NULL) { + ev->data = data; + } + if (ev->free_data_cb == NULL) { + ev->free_data_cb = free_data_cb; + } + if (ev->signal_cb == NULL) { + ev->signal_cb = signal_cb; + } + + if (event != NULL) { + *event = ev; + } + + status = ARES_SUCCESS; + +done: + if (status == ARES_SUCCESS) { + /* Wake event thread if successful so it can pull the updates */ + ares_event_thread_wake(e); + } + + ares_thread_mutex_unlock(e->mutex); + + return status; +} + +static void ares_event_thread_process_fd(ares_event_thread_t *e, + ares_socket_t fd, void *data, + ares_event_flags_t flags) +{ + ares_fd_events_t event; + (void)data; + + event.fd = fd; + event.events = 0; + if (flags & ARES_EVENT_FLAG_READ) { + event.events |= ARES_FD_EVENT_READ; + } + if (flags & ARES_EVENT_FLAG_WRITE) { + event.events |= ARES_FD_EVENT_WRITE; + } + ares_process_fds(e->channel, &event, 1, ARES_PROCESS_FLAG_SKIP_NON_FD); +} + +static void ares_event_thread_sockstate_cb(void *data, ares_socket_t socket_fd, + int readable, int writable) +{ + ares_event_thread_t *e = data; + ares_event_flags_t flags = ARES_EVENT_FLAG_NONE; + + if (readable) { + flags |= ARES_EVENT_FLAG_READ; + } + + if (writable) { + flags |= ARES_EVENT_FLAG_WRITE; + } + + /* Update channel fd. This function will lock e->mutex and also wake the + * event thread to process the update */ + ares_event_update(NULL, e, flags, ares_event_thread_process_fd, socket_fd, + NULL, NULL, NULL); +} + +static void notifywrite_cb(void *data) +{ + ares_event_thread_t *e = data; + + ares_thread_mutex_lock(e->mutex); + e->process_pending_write = ARES_TRUE; + ares_thread_mutex_unlock(e->mutex); + + ares_event_thread_wake(e); +} + +static void notifyenqueue_cb(void *data) +{ + ares_event_thread_t *e = data; + ares_event_thread_wake(e); +} + +static void ares_event_process_updates(ares_event_thread_t *e) +{ + ares_llist_node_t *node; + + /* Iterate across all updates and apply to internal list, removing from update + * list */ + while ((node = ares_llist_node_first(e->ev_updates)) != NULL) { + ares_event_t *newev = ares_llist_node_claim(node); + ares_event_t *oldev; + + if (newev->fd == ARES_SOCKET_BAD) { + oldev = ares_htable_vpvp_get_direct(e->ev_cust_handles, newev->data); + } else { + oldev = ares_htable_asvp_get_direct(e->ev_sock_handles, newev->fd); + } + + /* Adding new */ + if (oldev == NULL) { + newev->e = e; + /* Don't try to add a new event if all flags are cleared, that's basically + * someone trying to delete something already deleted. Also if it fails + * to add, cleanup. */ + if (newev->flags == ARES_EVENT_FLAG_NONE || + !e->ev_sys->event_add(newev)) { + newev->e = NULL; + ares_event_destroy_cb(newev); + } else { + if (newev->fd == ARES_SOCKET_BAD) { + ares_htable_vpvp_insert(e->ev_cust_handles, newev->data, newev); + } else { + ares_htable_asvp_insert(e->ev_sock_handles, newev->fd, newev); + } + } + continue; + } + + /* Removal request */ + if (newev->flags == ARES_EVENT_FLAG_NONE) { + /* the callback for the removal will call e->ev_sys->event_del(e, event) + */ + if (newev->fd == ARES_SOCKET_BAD) { + ares_htable_vpvp_remove(e->ev_cust_handles, newev->data); + } else { + ares_htable_asvp_remove(e->ev_sock_handles, newev->fd); + } + ares_free(newev); + continue; + } + + /* Modify request -- only flags can be changed */ + e->ev_sys->event_mod(oldev, newev->flags); + oldev->flags = newev->flags; + ares_free(newev); + } +} + +static void ares_event_thread_cleanup(ares_event_thread_t *e) +{ + /* Manually free any updates that weren't processed */ + if (e->ev_updates != NULL) { + ares_llist_node_t *node; + + while ((node = ares_llist_node_first(e->ev_updates)) != NULL) { + ares_event_destroy_cb(ares_llist_node_claim(node)); + } + ares_llist_destroy(e->ev_updates); + e->ev_updates = NULL; + } + + if (e->ev_sock_handles != NULL) { + ares_htable_asvp_destroy(e->ev_sock_handles); + e->ev_sock_handles = NULL; + } + + if (e->ev_cust_handles != NULL) { + ares_htable_vpvp_destroy(e->ev_cust_handles); + e->ev_cust_handles = NULL; + } + + if (e->ev_sys != NULL && e->ev_sys->destroy != NULL) { + e->ev_sys->destroy(e); + e->ev_sys = NULL; + } +} + +static void *ares_event_thread(void *arg) +{ + ares_event_thread_t *e = arg; + ares_thread_mutex_lock(e->mutex); + + while (e->isup) { + struct timeval tv; + const struct timeval *tvout; + unsigned long timeout_ms = 0; /* 0 = unlimited */ + ares_bool_t process_pending_write; + + ares_event_process_updates(e); + + /* Don't hold a mutex while waiting on events or calling into anything + * that might require a c-ares channel lock since a callback could be + * triggered cross-thread */ + ares_thread_mutex_unlock(e->mutex); + + tvout = ares_timeout(e->channel, NULL, &tv); + if (tvout != NULL) { + timeout_ms = + (unsigned long)((tvout->tv_sec * 1000) + (tvout->tv_usec / 1000) + 1); + } + + e->ev_sys->wait(e, timeout_ms); + + /* Process pending write operation */ + ares_thread_mutex_lock(e->mutex); + process_pending_write = e->process_pending_write; + e->process_pending_write = ARES_FALSE; + ares_thread_mutex_unlock(e->mutex); + if (process_pending_write) { + ares_process_pending_write(e->channel); + } + + /* Relock before we loop again */ + ares_thread_mutex_lock(e->mutex); + + /* Each iteration should do timeout processing and any other cleanup + * that may not have been performed */ + if (e->isup) { + ares_thread_mutex_unlock(e->mutex); + ares_process_fds(e->channel, NULL, 0, ARES_PROCESS_FLAG_NONE); + ares_thread_mutex_lock(e->mutex); + } + } + + /* Lets cleanup while we're in the thread itself */ + ares_event_thread_cleanup(e); + + ares_thread_mutex_unlock(e->mutex); + + return NULL; +} + +static void ares_event_thread_destroy_int(ares_event_thread_t *e) +{ + /* Wake thread and tell it to shutdown if it exists */ + ares_thread_mutex_lock(e->mutex); + if (e->isup) { + e->isup = ARES_FALSE; + ares_event_thread_wake(e); + } + ares_thread_mutex_unlock(e->mutex); + + /* Wait for thread to shutdown */ + if (e->thread) { + void *rv = NULL; + ares_thread_join(e->thread, &rv); + e->thread = NULL; + } + + /* If the event thread ever got to the point of starting, this is a no-op + * as it runs this same cleanup when it shuts down */ + ares_event_thread_cleanup(e); + + ares_thread_mutex_destroy(e->mutex); + e->mutex = NULL; + + ares_free(e); +} + +void ares_event_thread_destroy(ares_channel_t *channel) +{ + ares_event_thread_t *e = channel->sock_state_cb_data; + + if (e == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_event_thread_destroy_int(e); + channel->sock_state_cb_data = NULL; + channel->sock_state_cb = NULL; + channel->notify_pending_write_cb = NULL; + channel->notify_pending_write_cb_data = NULL; + ares_set_query_enqueue_cb(channel, NULL, NULL); +} + +static const ares_event_sys_t *ares_event_fetch_sys(ares_evsys_t evsys) +{ + switch (evsys) { + case ARES_EVSYS_WIN32: +#if defined(USE_WINSOCK) + return &ares_evsys_win32; +#else + return NULL; +#endif + + case ARES_EVSYS_EPOLL: +#if defined(HAVE_EPOLL) + return &ares_evsys_epoll; +#else + return NULL; +#endif + + case ARES_EVSYS_KQUEUE: +#if defined(HAVE_KQUEUE) + return &ares_evsys_kqueue; +#else + return NULL; +#endif + + case ARES_EVSYS_POLL: +#if defined(HAVE_POLL) + return &ares_evsys_poll; +#else + return NULL; +#endif + + case ARES_EVSYS_SELECT: +#if defined(HAVE_PIPE) + return &ares_evsys_select; +#else + return NULL; +#endif + + /* case ARES_EVSYS_DEFAULT: */ + default: + break; + } + + /* default */ +#if defined(USE_WINSOCK) + return &ares_evsys_win32; +#elif defined(HAVE_KQUEUE) + return &ares_evsys_kqueue; +#elif defined(HAVE_EPOLL) + return &ares_evsys_epoll; +#elif defined(HAVE_POLL) + return &ares_evsys_poll; +#elif defined(HAVE_PIPE) + return &ares_evsys_select; +#else + return NULL; +#endif +} + +ares_status_t ares_event_thread_init(ares_channel_t *channel) +{ + ares_event_thread_t *e; + + e = ares_malloc_zero(sizeof(*e)); + if (e == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + e->mutex = ares_thread_mutex_create(); + if (e->mutex == NULL) { + ares_event_thread_destroy_int(e); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + e->ev_updates = ares_llist_create(NULL); + if (e->ev_updates == NULL) { + ares_event_thread_destroy_int(e); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + e->ev_sock_handles = ares_htable_asvp_create(ares_event_destroy_cb); + if (e->ev_sock_handles == NULL) { + ares_event_thread_destroy_int(e); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + e->ev_cust_handles = ares_htable_vpvp_create(NULL, ares_event_destroy_cb); + if (e->ev_cust_handles == NULL) { + ares_event_thread_destroy_int(e); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + e->channel = channel; + e->isup = ARES_TRUE; + e->ev_sys = ares_event_fetch_sys(channel->evsys); + if (e->ev_sys == NULL) { + ares_event_thread_destroy_int(e); /* LCOV_EXCL_LINE: UntestablePath */ + return ARES_ENOTIMP; /* LCOV_EXCL_LINE: UntestablePath */ + } + + channel->sock_state_cb = ares_event_thread_sockstate_cb; + channel->sock_state_cb_data = e; + channel->notify_pending_write_cb = notifywrite_cb; + channel->notify_pending_write_cb_data = e; + ares_set_query_enqueue_cb(channel, notifyenqueue_cb, e); + + if (!e->ev_sys->init(e)) { + /* LCOV_EXCL_START: UntestablePath */ + ares_event_thread_destroy_int(e); + channel->sock_state_cb = NULL; + channel->sock_state_cb_data = NULL; + return ARES_ESERVFAIL; + /* LCOV_EXCL_STOP */ + } + + /* Before starting the thread, process any possible events the initialization + * might have enqueued as we may actually depend on these being valid + * immediately upon return, which may mean before the thread is fully spawned + * and processed the list itself. We don't want any sort of race conditions + * (like the event system wake handle itself). */ + ares_event_process_updates(e); + + /* Start thread */ + if (ares_thread_create(&e->thread, ares_event_thread, e) != ARES_SUCCESS) { + /* LCOV_EXCL_START: UntestablePath */ + ares_event_thread_destroy_int(e); + channel->sock_state_cb = NULL; + channel->sock_state_cb_data = NULL; + return ARES_ESERVFAIL; + /* LCOV_EXCL_STOP */ + } + + return ARES_SUCCESS; +} + +#else + +ares_status_t ares_event_thread_init(ares_channel_t *channel) +{ + (void)channel; + return ARES_ENOTIMP; +} + +void ares_event_thread_destroy(ares_channel_t *channel) +{ + (void)channel; +} + +#endif diff --git a/deps/cares/src/lib/ares_event_wake_pipe.c b/deps/cares/src/lib/event/ares_event_wake_pipe.c similarity index 83% rename from deps/cares/src/lib/ares_event_wake_pipe.c rename to deps/cares/src/lib/event/ares_event_wake_pipe.c index a2cd6f609a4c30..cd1534bbbd586c 100644 --- a/deps/cares/src/lib/ares_event_wake_pipe.c +++ b/deps/cares/src/lib/event/ares_event_wake_pipe.c @@ -23,18 +23,18 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include "ares_event.h" -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif -#ifdef HAVE_FCNTL_H -# include <fcntl.h> -#endif -#ifdef HAVE_PIPE +#if defined(HAVE_PIPE) && defined(CARES_THREADS) + +# ifdef HAVE_UNISTD_H +# include <unistd.h> +# endif +# ifdef HAVE_FCNTL_H +# include <fcntl.h> +# endif + typedef struct { int filedes[2]; } ares_pipeevent_t; @@ -60,7 +60,7 @@ static ares_pipeevent_t *ares_pipeevent_init(void) { ares_pipeevent_t *p = ares_malloc_zero(sizeof(*p)); if (p == NULL) { - return NULL; + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ } p->filedes[0] = -1; @@ -68,8 +68,8 @@ static ares_pipeevent_t *ares_pipeevent_init(void) # ifdef HAVE_PIPE2 if (pipe2(p->filedes, O_NONBLOCK | O_CLOEXEC) != 0) { - ares_pipeevent_destroy(p); - return NULL; + ares_pipeevent_destroy(p); /* LCOV_EXCL_LINE: UntestablePath */ + return NULL; /* LCOV_EXCL_LINE: UntestablePath */ } # else if (pipe(p->filedes) != 0) { @@ -94,9 +94,9 @@ static ares_pipeevent_t *ares_pipeevent_init(void) } # endif -# ifdef O_CLOEXEC - fcntl(p->filedes[0], F_SETFD, O_CLOEXEC); - fcntl(p->filedes[1], F_SETFD, O_CLOEXEC); +# ifdef FD_CLOEXEC + fcntl(p->filedes[0], F_SETFD, FD_CLOEXEC); + fcntl(p->filedes[1], F_SETFD, FD_CLOEXEC); # endif # endif @@ -113,7 +113,7 @@ static void ares_pipeevent_signal(const ares_event_t *e) const ares_pipeevent_t *p; if (e == NULL || e->data == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } p = e->data; @@ -131,7 +131,7 @@ static void ares_pipeevent_cb(ares_event_thread_t *e, ares_socket_t fd, (void)flags; if (data == NULL) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } p = data; @@ -156,8 +156,8 @@ ares_event_t *ares_pipeevent_create(ares_event_thread_t *e) p->filedes[0], p, ares_pipeevent_destroy_cb, ares_pipeevent_signal); if (status != ARES_SUCCESS) { - ares_pipeevent_destroy(p); - return NULL; + ares_pipeevent_destroy(p); /* LCOV_EXCL_LINE: DefensiveCoding */ + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ } return event; diff --git a/deps/cares/src/lib/event/ares_event_win32.c b/deps/cares/src/lib/event/ares_event_win32.c new file mode 100644 index 00000000000000..d7d1d65735082d --- /dev/null +++ b/deps/cares/src/lib/event/ares_event_win32.c @@ -0,0 +1,978 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +/* Uses an anonymous union */ +#if defined(__clang__) || defined(__GNUC__) +# pragma GCC diagnostic push +# if defined(__clang__) +# pragma GCC diagnostic ignored "-Wc11-extensions" +# else +# pragma GCC diagnostic ignored "-Wpedantic" +# endif +#endif + +#include "ares_private.h" +#include "ares_event.h" +#include "ares_event_win32.h" + + +#if defined(USE_WINSOCK) && defined(CARES_THREADS) + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +/* IMPLEMENTATION NOTES + * ==================== + * + * This implementation uses some undocumented functionality within Windows for + * monitoring sockets. The Ancillary Function Driver (AFD) is the low level + * implementation that Winsock2 sits on top of. Winsock2 unfortunately does + * not expose the equivalent of epoll() or kqueue(), but it is possible to + * access AFD directly and use along with IOCP to simulate the functionality. + * We want to use IOCP if possible as it gives us the ability to monitor more + * than just sockets (WSAPoll is not an option), and perform arbitrary callbacks + * which means we can hook in non-socket related events. + * + * The information for this implementation was gathered from "wepoll" and + * "libuv" which both use slight variants on this. We originally went with + * an implementation methodology more similar to "libuv", but we had a few + * user reports of crashes during shutdown and memory leaks due to some + * events not being delivered for cleanup of closed sockets. + * + * Initialization: + * 1. Dynamically load the NtDeviceIoControlFile, NtCreateFile, and + * NtCancelIoFileEx internal symbols from ntdll.dll. (Don't believe + * Microsoft's documentation for NtCancelIoFileEx as it documents an + * invalid prototype). These functions are to open a reference to the + * Ancillary Function Driver (AFD), and to submit and cancel POLL + * requests. + * 2. Create an IO Completion Port base handle via CreateIoCompletionPort() + * that all socket events will be delivered through. + * 3. Create a list of AFD Handles and track the number of poll requests + * per AFD handle. When we exceed a pre-determined limit of poll requests + * for a handle (128), we will automatically create a new handle. The + * reason behind this is NtCancelIoFileEx uses a horrible algorithm for + * issuing cancellations. See: + * https://github.com/python-trio/trio/issues/52#issuecomment-548215128 + * 4. Create a callback to be used to be able to interrupt waiting for IOCP + * events, this may be called for allowing enqueuing of additional socket + * events or removing socket events. PostQueuedCompletionStatus() is the + * obvious choice. We can use the same container format, the event + * delivered won't have an OVERLAPPED pointer so we can differentiate from + * socket events. Use the container as the completion key. + * + * Socket Add: + * 1. Create/Allocate a container for holding metadata about a socket + * including: + * - SOCKET base_socket; + * - IO_STATUS_BLOCK iosb; -- Used by AFD POLL, returned as OVERLAPPED + * - AFD_POLL_INFO afd_poll_info; -- Used by AFD POLL + * - afd list node -- for tracking which AFD handle a POLL request was + * submitted to. + * 2. Call WSAIoctl(..., SIO_BASE_HANDLE, ...) to unwrap the SOCKET and get + * the "base socket" we can use for polling. It appears this may fail so + * we should call WSAIoctl(..., SIO_BSP_HANDLE_POLL, ...) as a fallback. + * 3. Submit AFD POLL request (see "AFD POLL Request" section) + * 4. Record a mapping between the "IO Status Block" and the socket container + * so when events are delivered we can dereference. + * + * Socket Delete: + * 1. Call + * NtCancelIoFileEx(afd, iosb, &temp_iosb); + * to cancel any pending operations. + * 2. Tag the socket container as being queued for deletion + * 3. Wait for an event to be delivered for the socket (cancel isn't + * immediate, it delivers an event to know its complete). Delete only once + * that event has been delivered. If we don't do this we could try to + * access free()'d memory at a later point. + * + * Socket Modify: + * 1. Call + * NtCancelIoFileEx(afd, iosb, &temp_iosb) + * to cancel any pending operation. + * 2. When the event comes through that the cancel is complete, enqueue + * another "AFD Poll Request" for the desired events. + * + * Event Wait: + * 1. Call GetQueuedCompletionStatusEx() with the base IOCP handle, a + * stack allocated array of OVERLAPPED_ENTRY's, and an appropriate + * timeout. + * 2. Iterate across returned events, if the lpOverlapped is NULL, then the + * the CompletionKey is a pointer to the container registered via + * PostQueuedCompletionStatus(), otherwise it is the "IO Status Block" + * registered with the "AFD Poll Request" which needs to be dereferenced + * to the "socket container". + * 3. If it is a "socket container", disassociate it from the afd list node + * it was previously submitted to. + * 4. If it is a "socket container" check to see if we are cleaning up, if so, + * clean it up. + * 5. If it is a "socket container" that is still valid, Submit an + * AFD POLL Request (see "AFD POLL Request"). We must re-enable the request + * each time we receive a response, it is not persistent. + * 6. Notify of any events received as indicated in the AFD_POLL_INFO + * Handles[0].Events (NOTE: check NumberOfHandles > 0, and the status in + * the IO_STATUS_BLOCK. If we received an AFD_POLL_LOCAL_CLOSE, clean up + * the connection like the integrator requested it to be cleaned up. + * + * AFD Poll Request: + * 1. Find an afd poll handle in the list that has fewer pending requests than + * the limit. + * 2. If an afd poll handle was not associated (e.g. due to all being over + * limit), create a new afd poll handle by calling NtCreateFile() + * with path \Device\Afd , then add the AFD handle to the IO Completion + * Port. We can leave the completion key as blank since events for + * multiple sockets will be delivered through this and we need to + * differentiate via the OVERLAPPED member returned. Add the new AFD + * handle to the list of handles. + * 3. Initialize the AFD_POLL_INFO structure: + * Exclusive = FALSE; // allow multiple requests + * NumberOfHandles = 1; + * Timeout.QuadPart = LLONG_MAX; + * Handles[0].Handle = (HANDLE)base_socket; + * Handles[0].Status = 0; + * Handles[0].Events = AFD_POLL_LOCAL_CLOSE + additional events to wait for + * such as AFD_POLL_RECEIVE, etc; + * 4. Zero out the IO_STATUS_BLOCK structures + * 5. Set the "Status" member of IO_STATUS_BLOCK to STATUS_PENDING + * 6. Call + * NtDeviceIoControlFile(afd, NULL, NULL, &iosb, + * &iosb, IOCTL_AFD_POLL + * &afd_poll_info, sizeof(afd_poll_info), + * &afd_poll_info, sizeof(afd_poll_info)); + * + * + * References: + * - https://github.com/piscisaureus/wepoll/ + * - https://github.com/libuv/libuv/ + */ + +/* Cap the number of outstanding AFD poll requests per AFD handle due to known + * slowdowns with large lists and NtCancelIoFileEx() */ +# define AFD_POLL_PER_HANDLE 128 + +# include <stdarg.h> + +/* # define CARES_DEBUG 1 */ + +# ifdef __GNUC__ +# define CARES_PRINTF_LIKE(fmt, args) \ + __attribute__((format(printf, fmt, args))) +# else +# define CARES_PRINTF_LIKE(fmt, args) +# endif + +static void CARES_DEBUG_LOG(const char *fmt, ...) CARES_PRINTF_LIKE(1, 2); + +static void CARES_DEBUG_LOG(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); +# ifdef CARES_DEBUG + vfprintf(stderr, fmt, ap); + fflush(stderr); +# endif + va_end(ap); +} + +typedef struct { + /* Dynamically loaded symbols */ + NtCreateFile_t NtCreateFile; + NtDeviceIoControlFile_t NtDeviceIoControlFile; + NtCancelIoFileEx_t NtCancelIoFileEx; + + /* Implementation details */ + ares_slist_t *afd_handles; + HANDLE iocp_handle; + + /* IO_STATUS_BLOCK * -> ares_evsys_win32_eventdata_t * mapping. There is + * no completion key passed to IOCP with this method so we have to look + * up based on the lpOverlapped returned (which is mapped to IO_STATUS_BLOCK) + */ + ares_htable_vpvp_t *sockets; + + /* Flag about whether or not we are shutting down */ + ares_bool_t is_shutdown; +} ares_evsys_win32_t; + +typedef enum { + POLL_STATUS_NONE = 0, + POLL_STATUS_PENDING = 1, + POLL_STATUS_CANCEL = 2, + POLL_STATUS_DESTROY = 3 +} poll_status_t; + +typedef struct { + /*! Pointer to parent event container */ + ares_event_t *event; + /*! Socket passed in to monitor */ + SOCKET socket; + /*! Base socket derived from provided socket */ + SOCKET base_socket; + /*! Structure for submitting AFD POLL requests (Internals!) */ + AFD_POLL_INFO afd_poll_info; + /*! Status of current polling operation */ + poll_status_t poll_status; + /*! IO Status Block structure submitted with AFD POLL requests and returned + * with IOCP results as lpOverlapped (even though its a different structure) + */ + IO_STATUS_BLOCK iosb; + /*! AFD handle node an outstanding poll request is associated with */ + ares_slist_node_t *afd_handle_node; + /* Lock is only for PostQueuedCompletionStatus() to prevent multiple + * signals. Tracking via POLL_STATUS_PENDING/POLL_STATUS_NONE */ + ares_thread_mutex_t *lock; +} ares_evsys_win32_eventdata_t; + +static size_t ares_evsys_win32_wait(ares_event_thread_t *e, + unsigned long timeout_ms); + +static void ares_iocpevent_signal(const ares_event_t *event) +{ + ares_event_thread_t *e = event->e; + ares_evsys_win32_t *ew = e->ev_sys_data; + ares_evsys_win32_eventdata_t *ed = event->data; + ares_bool_t queue_event = ARES_FALSE; + + ares_thread_mutex_lock(ed->lock); + if (ed->poll_status != POLL_STATUS_PENDING) { + ed->poll_status = POLL_STATUS_PENDING; + queue_event = ARES_TRUE; + } + ares_thread_mutex_unlock(ed->lock); + + if (!queue_event) { + return; + } + + PostQueuedCompletionStatus(ew->iocp_handle, 0, (ULONG_PTR)event->data, NULL); +} + +static void ares_iocpevent_cb(ares_event_thread_t *e, ares_socket_t fd, + void *data, ares_event_flags_t flags) +{ + ares_evsys_win32_eventdata_t *ed = data; + (void)e; + (void)fd; + (void)flags; + ares_thread_mutex_lock(ed->lock); + ed->poll_status = POLL_STATUS_NONE; + ares_thread_mutex_unlock(ed->lock); +} + +static ares_event_t *ares_iocpevent_create(ares_event_thread_t *e) +{ + ares_event_t *event = NULL; + ares_status_t status; + + status = + ares_event_update(&event, e, ARES_EVENT_FLAG_OTHER, ares_iocpevent_cb, + ARES_SOCKET_BAD, NULL, NULL, ares_iocpevent_signal); + if (status != ARES_SUCCESS) { + return NULL; + } + + return event; +} + +static void ares_evsys_win32_destroy(ares_event_thread_t *e) +{ + ares_evsys_win32_t *ew = NULL; + + if (e == NULL) { + return; + } + + CARES_DEBUG_LOG("** Win32 Event Destroy\n"); + + ew = e->ev_sys_data; + if (ew == NULL) { + return; + } + + ew->is_shutdown = ARES_TRUE; + CARES_DEBUG_LOG(" ** waiting on %lu remaining sockets to be destroyed\n", + (unsigned long)ares_htable_vpvp_num_keys(ew->sockets)); + while (ares_htable_vpvp_num_keys(ew->sockets)) { + ares_evsys_win32_wait(e, 0); + } + CARES_DEBUG_LOG(" ** all sockets cleaned up\n"); + + + if (ew->iocp_handle != NULL) { + CloseHandle(ew->iocp_handle); + } + + ares_slist_destroy(ew->afd_handles); + + ares_htable_vpvp_destroy(ew->sockets); + + ares_free(ew); + e->ev_sys_data = NULL; +} + +typedef struct { + size_t poll_cnt; + HANDLE afd_handle; +} ares_afd_handle_t; + +static void ares_afd_handle_destroy(void *arg) +{ + ares_afd_handle_t *hnd = arg; + if (hnd != NULL && hnd->afd_handle != NULL) { + CloseHandle(hnd->afd_handle); + } + ares_free(hnd); +} + +static int ares_afd_handle_cmp(const void *data1, const void *data2) +{ + const ares_afd_handle_t *hnd1 = data1; + const ares_afd_handle_t *hnd2 = data2; + + if (hnd1->poll_cnt > hnd2->poll_cnt) { + return 1; + } + if (hnd1->poll_cnt < hnd2->poll_cnt) { + return -1; + } + return 0; +} + +static void fill_object_attributes(OBJECT_ATTRIBUTES *attr, + UNICODE_STRING *name, ULONG attributes) +{ + memset(attr, 0, sizeof(*attr)); + attr->Length = sizeof(*attr); + attr->ObjectName = name; + attr->Attributes = attributes; +} + +# define UNICODE_STRING_CONSTANT(s) \ + { (sizeof(s) - 1) * sizeof(wchar_t), sizeof(s) * sizeof(wchar_t), L##s } + +static ares_slist_node_t *ares_afd_handle_create(ares_evsys_win32_t *ew) +{ + UNICODE_STRING afd_device_name = UNICODE_STRING_CONSTANT("\\Device\\Afd"); + OBJECT_ATTRIBUTES afd_attributes; + NTSTATUS status; + IO_STATUS_BLOCK iosb; + ares_afd_handle_t *afd = ares_malloc_zero(sizeof(*afd)); + ares_slist_node_t *node = NULL; + if (afd == NULL) { + goto fail; + } + + /* Open a handle to the AFD subsystem */ + fill_object_attributes(&afd_attributes, &afd_device_name, 0); + memset(&iosb, 0, sizeof(iosb)); + iosb.Status = STATUS_PENDING; + status = ew->NtCreateFile(&afd->afd_handle, SYNCHRONIZE, &afd_attributes, + &iosb, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, 0, NULL, 0); + if (status != STATUS_SUCCESS) { + CARES_DEBUG_LOG("** Failed to create AFD endpoint\n"); + goto fail; + } + + if (CreateIoCompletionPort(afd->afd_handle, ew->iocp_handle, + 0 /* CompletionKey */, 0) == NULL) { + goto fail; + } + + if (!SetFileCompletionNotificationModes(afd->afd_handle, + FILE_SKIP_SET_EVENT_ON_HANDLE)) { + goto fail; + } + + node = ares_slist_insert(ew->afd_handles, afd); + if (node == NULL) { + goto fail; + } + + return node; + +fail: + + ares_afd_handle_destroy(afd); + return NULL; +} + +/* Fetch the lowest poll count entry, but if it exceeds the limit, create a + * new one and return that */ +static ares_slist_node_t *ares_afd_handle_fetch(ares_evsys_win32_t *ew) +{ + ares_slist_node_t *node = ares_slist_node_first(ew->afd_handles); + ares_afd_handle_t *afd = ares_slist_node_val(node); + + if (afd != NULL && afd->poll_cnt < AFD_POLL_PER_HANDLE) { + return node; + } + + return ares_afd_handle_create(ew); +} + +static ares_bool_t ares_evsys_win32_init(ares_event_thread_t *e) +{ + ares_evsys_win32_t *ew = NULL; + HMODULE ntdll; + + CARES_DEBUG_LOG("** Win32 Event Init\n"); + + ew = ares_malloc_zero(sizeof(*ew)); + if (ew == NULL) { + return ARES_FALSE; + } + + e->ev_sys_data = ew; + + /* All apps should have ntdll.dll already loaded, so just get a handle to + * this */ + ntdll = GetModuleHandleA("ntdll.dll"); + if (ntdll == NULL) { + goto fail; + } + +# ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpedantic" +/* Without the (void *) cast we get: + * warning: cast between incompatible function types from 'FARPROC' {aka 'long + * long int (*)()'} to 'NTSTATUS (*)(...)'} [-Wcast-function-type] but with it + * we get: warning: ISO C forbids conversion of function pointer to object + * pointer type [-Wpedantic] look unsolvable short of killing the warning. + */ +# endif + + /* Load Internal symbols not typically accessible */ + ew->NtCreateFile = + (NtCreateFile_t)(void *)GetProcAddress(ntdll, "NtCreateFile"); + ew->NtDeviceIoControlFile = (NtDeviceIoControlFile_t)(void *)GetProcAddress( + ntdll, "NtDeviceIoControlFile"); + ew->NtCancelIoFileEx = + (NtCancelIoFileEx_t)(void *)GetProcAddress(ntdll, "NtCancelIoFileEx"); + +# ifdef __GNUC__ +# pragma GCC diagnostic pop +# endif + + if (ew->NtCreateFile == NULL || ew->NtCancelIoFileEx == NULL || + ew->NtDeviceIoControlFile == NULL) { + goto fail; + } + + ew->iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); + if (ew->iocp_handle == NULL) { + goto fail; + } + + ew->afd_handles = ares_slist_create( + e->channel->rand_state, ares_afd_handle_cmp, ares_afd_handle_destroy); + if (ew->afd_handles == NULL) { + goto fail; + } + + /* Create at least the first afd handle, so we know of any critical system + * issues during startup */ + if (ares_afd_handle_create(ew) == NULL) { + goto fail; + } + + e->ev_signal = ares_iocpevent_create(e); + if (e->ev_signal == NULL) { + goto fail; + } + + ew->sockets = ares_htable_vpvp_create(NULL, NULL); + if (ew->sockets == NULL) { + goto fail; + } + + return ARES_TRUE; + +fail: + ares_evsys_win32_destroy(e); + return ARES_FALSE; +} + +static ares_socket_t ares_evsys_win32_basesocket(ares_socket_t socket) +{ + while (1) { + DWORD bytes; /* Not used */ + ares_socket_t base_socket = ARES_SOCKET_BAD; + int rv; + + rv = WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket, + sizeof(base_socket), &bytes, NULL, NULL); + if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD) { + socket = base_socket; + break; + } + + /* If we're here, an error occurred */ + if (GetLastError() == WSAENOTSOCK) { + /* This is critical, exit */ + return ARES_SOCKET_BAD; + } + + /* Work around known bug in Komodia based LSPs, use ARES_BSP_HANDLE_POLL + * to retrieve the underlying socket to then loop and get the base socket: + * https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-ioctls + * https://www.komodia.com/newwiki/index.php?title=Komodia%27s_Redirector_bug_fixes#Version_2.2.2.6 + */ + base_socket = ARES_SOCKET_BAD; + rv = WSAIoctl(socket, SIO_BSP_HANDLE_POLL, NULL, 0, &base_socket, + sizeof(base_socket), &bytes, NULL, NULL); + + if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD && + base_socket != socket) { + socket = base_socket; + continue; /* loop! */ + } + + return ARES_SOCKET_BAD; + } + + return socket; +} + +static ares_bool_t ares_evsys_win32_afd_enqueue(ares_event_t *event, + ares_event_flags_t flags) +{ + ares_event_thread_t *e = event->e; + ares_evsys_win32_t *ew = e->ev_sys_data; + ares_evsys_win32_eventdata_t *ed = event->data; + ares_afd_handle_t *afd; + NTSTATUS status; + + if (e == NULL || ed == NULL || ew == NULL) { + return ARES_FALSE; + } + + /* Misuse */ + if (ed->poll_status != POLL_STATUS_NONE) { + return ARES_FALSE; + } + + ed->afd_handle_node = ares_afd_handle_fetch(ew); + /* System resource issue? */ + if (ed->afd_handle_node == NULL) { + return ARES_FALSE; + } + + afd = ares_slist_node_val(ed->afd_handle_node); + + /* Enqueue AFD Poll */ + ed->afd_poll_info.Exclusive = FALSE; + ed->afd_poll_info.NumberOfHandles = 1; + ed->afd_poll_info.Timeout.QuadPart = LLONG_MAX; + ed->afd_poll_info.Handles[0].Handle = (HANDLE)ed->base_socket; + ed->afd_poll_info.Handles[0].Status = 0; + ed->afd_poll_info.Handles[0].Events = AFD_POLL_LOCAL_CLOSE; + + if (flags & ARES_EVENT_FLAG_READ) { + ed->afd_poll_info.Handles[0].Events |= + (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | + AFD_POLL_ABORT); + } + if (flags & ARES_EVENT_FLAG_WRITE) { + ed->afd_poll_info.Handles[0].Events |= + (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL); + } + if (flags == 0) { + ed->afd_poll_info.Handles[0].Events |= AFD_POLL_DISCONNECT; + } + + memset(&ed->iosb, 0, sizeof(ed->iosb)); + ed->iosb.Status = STATUS_PENDING; + + status = ew->NtDeviceIoControlFile( + afd->afd_handle, NULL, NULL, &ed->iosb, &ed->iosb, IOCTL_AFD_POLL, + &ed->afd_poll_info, sizeof(ed->afd_poll_info), &ed->afd_poll_info, + sizeof(ed->afd_poll_info)); + if (status != STATUS_SUCCESS && status != STATUS_PENDING) { + CARES_DEBUG_LOG("** afd_enqueue ed=%p FAILED\n", (void *)ed); + ed->afd_handle_node = NULL; + return ARES_FALSE; + } + + /* Record that we submitted a poll request to this handle and tell it to + * re-sort the node since we changed its sort value */ + afd->poll_cnt++; + ares_slist_node_reinsert(ed->afd_handle_node); + + ed->poll_status = POLL_STATUS_PENDING; + CARES_DEBUG_LOG("++ afd_enqueue ed=%p flags=%X\n", (void *)ed, + (unsigned int)flags); + return ARES_TRUE; +} + +static ares_bool_t ares_evsys_win32_afd_cancel(ares_evsys_win32_eventdata_t *ed) +{ + IO_STATUS_BLOCK cancel_iosb; + ares_evsys_win32_t *ew; + NTSTATUS status; + ares_afd_handle_t *afd; + + ew = ed->event->e->ev_sys_data; + + /* Misuse */ + if (ed->poll_status != POLL_STATUS_PENDING) { + return ARES_FALSE; + } + + afd = ares_slist_node_val(ed->afd_handle_node); + + /* Misuse */ + if (afd == NULL) { + return ARES_FALSE; + } + + ed->poll_status = POLL_STATUS_CANCEL; + + /* Not pending, nothing to do. Most likely that means there is a pending + * event that hasn't yet been delivered otherwise it would be re-armed + * already */ + if (ed->iosb.Status != STATUS_PENDING) { + CARES_DEBUG_LOG("** cancel not needed for ed=%p\n", (void *)ed); + return ARES_FALSE; + } + + status = ew->NtCancelIoFileEx(afd->afd_handle, &ed->iosb, &cancel_iosb); + + CARES_DEBUG_LOG("** Enqueued cancel for ed=%p, status = %lX\n", (void *)ed, + status); + + /* NtCancelIoFileEx() may return STATUS_NOT_FOUND if the operation completed + * just before calling NtCancelIoFileEx(), but we have not yet received the + * notification (but it should be queued for the next IOCP event). */ + if (status == STATUS_SUCCESS || status == STATUS_NOT_FOUND) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static void ares_evsys_win32_eventdata_destroy(ares_evsys_win32_t *ew, + ares_evsys_win32_eventdata_t *ed) +{ + if (ew == NULL || ed == NULL) { + return; + } + CARES_DEBUG_LOG("-- deleting ed=%p (%s)\n", (void *)ed, + (ed->socket == ARES_SOCKET_BAD) ? "data" : "socket"); + /* These type of handles are deferred destroy. Update tracking. */ + if (ed->socket != ARES_SOCKET_BAD) { + ares_htable_vpvp_remove(ew->sockets, &ed->iosb); + } + + ares_thread_mutex_destroy(ed->lock); + + if (ed->event != NULL) { + ed->event->data = NULL; + } + + ares_free(ed); +} + +static ares_bool_t ares_evsys_win32_event_add(ares_event_t *event) +{ + ares_event_thread_t *e = event->e; + ares_evsys_win32_t *ew = e->ev_sys_data; + ares_evsys_win32_eventdata_t *ed; + ares_bool_t rc = ARES_FALSE; + + ed = ares_malloc_zero(sizeof(*ed)); + ed->event = event; + ed->socket = event->fd; + ed->base_socket = ARES_SOCKET_BAD; + event->data = ed; + + CARES_DEBUG_LOG("++ add ed=%p (%s) flags=%X\n", (void *)ed, + (ed->socket == ARES_SOCKET_BAD) ? "data" : "socket", + (unsigned int)event->flags); + + /* Likely a signal event, not something we will directly handle. We create + * the ares_evsys_win32_eventdata_t as the placeholder to use as the + * IOCP Completion Key */ + if (ed->socket == ARES_SOCKET_BAD) { + ed->lock = ares_thread_mutex_create(); + if (ed->lock == NULL) { + goto done; + } + rc = ARES_TRUE; + goto done; + } + + ed->base_socket = ares_evsys_win32_basesocket(ed->socket); + if (ed->base_socket == ARES_SOCKET_BAD) { + goto done; + } + + if (!ares_htable_vpvp_insert(ew->sockets, &ed->iosb, ed)) { + goto done; + } + + if (!ares_evsys_win32_afd_enqueue(event, event->flags)) { + goto done; + } + + rc = ARES_TRUE; + +done: + if (!rc) { + ares_evsys_win32_eventdata_destroy(ew, ed); + event->data = NULL; + } + return rc; +} + +static void ares_evsys_win32_event_del(ares_event_t *event) +{ + ares_evsys_win32_eventdata_t *ed = event->data; + + /* Already cleaned up, likely a LOCAL_CLOSE */ + if (ed == NULL) { + return; + } + + CARES_DEBUG_LOG("-- DELETE requested for ed=%p (%s)\n", (void *)ed, + (ed->socket != ARES_SOCKET_BAD) ? "socket" : "data"); + + /* + * Cancel pending AFD Poll operation. + */ + if (ed->socket != ARES_SOCKET_BAD) { + ares_evsys_win32_afd_cancel(ed); + ed->poll_status = POLL_STATUS_DESTROY; + ed->event = NULL; + } else { + ares_evsys_win32_eventdata_destroy(event->e->ev_sys_data, ed); + } + + event->data = NULL; +} + +static void ares_evsys_win32_event_mod(ares_event_t *event, + ares_event_flags_t new_flags) +{ + ares_evsys_win32_eventdata_t *ed = event->data; + + /* Not for us */ + if (event->fd == ARES_SOCKET_BAD || ed == NULL) { + return; + } + + CARES_DEBUG_LOG("** mod ed=%p new_flags=%X\n", (void *)ed, + (unsigned int)new_flags); + + /* All we need to do is cancel the pending operation. When the event gets + * delivered for the cancellation, it will automatically re-enqueue a new + * event */ + ares_evsys_win32_afd_cancel(ed); +} + +static ares_bool_t ares_evsys_win32_process_other_event( + ares_evsys_win32_t *ew, ares_evsys_win32_eventdata_t *ed, size_t i) +{ + ares_event_t *event; + + /* NOTE: do NOT dereference 'ed' if during shutdown as this could be an + * invalid pointer if the signal handle was cleaned up, but there was still a + * pending event! */ + + if (ew->is_shutdown) { + CARES_DEBUG_LOG("\t\t** i=%lu, skip non-socket handle during shutdown\n", + (unsigned long)i); + return ARES_FALSE; + } + + event = ed->event; + CARES_DEBUG_LOG("\t\t** i=%lu, ed=%p (data)\n", (unsigned long)i, (void *)ed); + + event->cb(event->e, event->fd, event->data, ARES_EVENT_FLAG_OTHER); + return ARES_TRUE; +} + +static ares_bool_t ares_evsys_win32_process_socket_event( + ares_evsys_win32_t *ew, ares_evsys_win32_eventdata_t *ed, size_t i) +{ + ares_event_flags_t flags = 0; + ares_event_t *event = NULL; + ares_afd_handle_t *afd = NULL; + + /* Shouldn't be possible */ + if (ed == NULL) { + CARES_DEBUG_LOG("\t\t** i=%lu, Invalid handle.\n", (unsigned long)i); + return ARES_FALSE; + } + + event = ed->event; + + CARES_DEBUG_LOG("\t\t** i=%lu, ed=%p (socket)\n", (unsigned long)i, + (void *)ed); + + /* Process events */ + if (ed->poll_status == POLL_STATUS_PENDING && + ed->iosb.Status == STATUS_SUCCESS && + ed->afd_poll_info.NumberOfHandles > 0) { + if (ed->afd_poll_info.Handles[0].Events & + (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | + AFD_POLL_ABORT)) { + flags |= ARES_EVENT_FLAG_READ; + } + if (ed->afd_poll_info.Handles[0].Events & + (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) { + flags |= ARES_EVENT_FLAG_WRITE; + } + if (ed->afd_poll_info.Handles[0].Events & AFD_POLL_LOCAL_CLOSE) { + CARES_DEBUG_LOG("\t\t** ed=%p LOCAL CLOSE\n", (void *)ed); + ed->poll_status = POLL_STATUS_DESTROY; + } + } + + CARES_DEBUG_LOG("\t\t** ed=%p, iosb status=%lX, poll_status=%d, flags=%X\n", + (void *)ed, (unsigned long)ed->iosb.Status, + (int)ed->poll_status, (unsigned int)flags); + + /* Decrement poll count for AFD handle then resort, also disassociate + * with socket */ + afd = ares_slist_node_val(ed->afd_handle_node); + afd->poll_cnt--; + ares_slist_node_reinsert(ed->afd_handle_node); + ed->afd_handle_node = NULL; + + /* Pending destroy, go ahead and kill it */ + if (ed->poll_status == POLL_STATUS_DESTROY) { + ares_evsys_win32_eventdata_destroy(ew, ed); + return ARES_FALSE; + } + + ed->poll_status = POLL_STATUS_NONE; + + /* Mask flags against current desired flags. We could have an event + * queued that is outdated. */ + flags &= event->flags; + + /* Don't actually do anything with the event that was delivered as we are + * in a shutdown/cleanup process. Mostly just handling the delayed + * destruction of sockets */ + if (ew->is_shutdown) { + return ARES_FALSE; + } + + /* Re-enqueue so we can get more events on the socket, we either + * received a real event, or a cancellation notice. Both cases we + * re-queue using the current configured event flags. + * + * If we can't re-enqueue, that likely means the socket has been + * closed, so we want to kill our reference to it + */ + if (!ares_evsys_win32_afd_enqueue(event, event->flags)) { + ares_evsys_win32_eventdata_destroy(ew, ed); + return ARES_FALSE; + } + + /* No events we recognize to deliver */ + if (flags == 0) { + return ARES_FALSE; + } + + event->cb(event->e, event->fd, event->data, flags); + return ARES_TRUE; +} + +static size_t ares_evsys_win32_wait(ares_event_thread_t *e, + unsigned long timeout_ms) +{ + ares_evsys_win32_t *ew = e->ev_sys_data; + OVERLAPPED_ENTRY entries[16]; + ULONG maxentries = sizeof(entries) / sizeof(*entries); + ULONG nentries; + BOOL status; + size_t i; + size_t cnt = 0; + DWORD tout = (timeout_ms == 0) ? INFINITE : (DWORD)timeout_ms; + + CARES_DEBUG_LOG("** Wait Enter\n"); + /* Process in a loop for as long as it fills the entire entries buffer, and + * on subsequent attempts, ensure the timeout is 0 */ + do { + nentries = maxentries; + status = GetQueuedCompletionStatusEx(ew->iocp_handle, entries, nentries, + &nentries, tout, FALSE); + + /* Next loop around, we want to return instantly if there are no events to + * be processed */ + tout = 0; + + if (!status) { + break; + } + + CARES_DEBUG_LOG("\t** GetQueuedCompletionStatusEx returned %lu entries\n", + (unsigned long)nentries); + for (i = 0; i < (size_t)nentries; i++) { + ares_evsys_win32_eventdata_t *ed = NULL; + ares_bool_t rc; + + /* For things triggered via PostQueuedCompletionStatus() we have an + * lpCompletionKey we can just use. Otherwise we need to dereference the + * pointer returned in lpOverlapped to determine the referenced + * socket */ + if (entries[i].lpCompletionKey) { + ed = (ares_evsys_win32_eventdata_t *)entries[i].lpCompletionKey; + rc = ares_evsys_win32_process_other_event(ew, ed, i); + } else { + ed = ares_htable_vpvp_get_direct(ew->sockets, entries[i].lpOverlapped); + rc = ares_evsys_win32_process_socket_event(ew, ed, i); + } + + /* We processed actual events */ + if (rc) { + cnt++; + } + } + } while (nentries == maxentries); + + CARES_DEBUG_LOG("** Wait Exit\n"); + + return cnt; +} + +const ares_event_sys_t ares_evsys_win32 = { "win32", + ares_evsys_win32_init, + ares_evsys_win32_destroy, + ares_evsys_win32_event_add, + ares_evsys_win32_event_del, + ares_evsys_win32_event_mod, + ares_evsys_win32_wait }; +#endif + +#if defined(__clang__) || defined(__GNUC__) +# pragma GCC diagnostic pop +#endif diff --git a/deps/cares/src/lib/event/ares_event_win32.h b/deps/cares/src/lib/event/ares_event_win32.h new file mode 100644 index 00000000000000..5d0274cd85cd61 --- /dev/null +++ b/deps/cares/src/lib/event/ares_event_win32.h @@ -0,0 +1,161 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_EVENT_WIN32_H +#define __ARES_EVENT_WIN32_H + +#ifdef _WIN32 +# ifdef HAVE_WINSOCK2_H +# include <winsock2.h> +# endif +# ifdef HAVE_WS2TCPIP_H +# include <ws2tcpip.h> +# endif +# ifdef HAVE_MSWSOCK_H +# include <mswsock.h> +# endif +# ifdef HAVE_WINDOWS_H +# include <windows.h> +# endif + +/* From winternl.h */ + +/* If WDK is not installed and not using MinGW, provide the needed definitions + */ +typedef LONG NTSTATUS; + +typedef struct _IO_STATUS_BLOCK { + union { + NTSTATUS Status; + PVOID Pointer; + }; + + ULONG_PTR Information; +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + +typedef VOID(NTAPI *PIO_APC_ROUTINE)(PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + ULONG Reserved); + +/* From ntstatus.h */ +# define STATUS_SUCCESS ((NTSTATUS)0x00000000) +# ifndef STATUS_PENDING +# define STATUS_PENDING ((NTSTATUS)0x00000103L) +# endif +# define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) +# define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L) + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + LPCWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; + +typedef struct _OBJECT_ATTRIBUTES { + ULONG Length; + HANDLE RootDirectory; + PUNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; +} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; + +# ifndef FILE_OPEN +# define FILE_OPEN 0x00000001UL +# endif + +/* Not sure what headers might have these */ +# define IOCTL_AFD_POLL 0x00012024 + +# define AFD_POLL_RECEIVE_BIT 0 +# define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) +# define AFD_POLL_RECEIVE_EXPEDITED_BIT 1 +# define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) +# define AFD_POLL_SEND_BIT 2 +# define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) +# define AFD_POLL_DISCONNECT_BIT 3 +# define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) +# define AFD_POLL_ABORT_BIT 4 +# define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) +# define AFD_POLL_LOCAL_CLOSE_BIT 5 +# define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) +# define AFD_POLL_CONNECT_BIT 6 +# define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) +# define AFD_POLL_ACCEPT_BIT 7 +# define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) +# define AFD_POLL_CONNECT_FAIL_BIT 8 +# define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) +# define AFD_POLL_QOS_BIT 9 +# define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) +# define AFD_POLL_GROUP_QOS_BIT 10 +# define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) + +# define AFD_NUM_POLL_EVENTS 11 +# define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) + +typedef struct _AFD_POLL_HANDLE_INFO { + HANDLE Handle; + ULONG Events; + NTSTATUS Status; +} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; + +typedef struct _AFD_POLL_INFO { + LARGE_INTEGER Timeout; + ULONG NumberOfHandles; + ULONG Exclusive; + AFD_POLL_HANDLE_INFO Handles[1]; +} AFD_POLL_INFO, *PAFD_POLL_INFO; + +/* Prototypes for dynamically loaded functions from ntdll.dll */ +typedef NTSTATUS(NTAPI *NtCancelIoFileEx_t)(HANDLE FileHandle, + PIO_STATUS_BLOCK IoRequestToCancel, + PIO_STATUS_BLOCK IoStatusBlock); +typedef NTSTATUS(NTAPI *NtDeviceIoControlFile_t)( + HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer, + ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength); + +typedef NTSTATUS(NTAPI *NtCreateFile_t)( + PHANDLE FileHandle, ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, + PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess, + ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength); + +/* On UWP/Windows Store, these definitions aren't there for some reason */ +# ifndef SIO_BSP_HANDLE_POLL +# define SIO_BSP_HANDLE_POLL 0x4800001D +# endif + +# ifndef SIO_BASE_HANDLE +# define SIO_BASE_HANDLE 0x48000022 +# endif + +# ifndef HANDLE_FLAG_INHERIT +# define HANDLE_FLAG_INHERIT 0x00000001 +# endif + +#endif /* _WIN32 */ + +#endif /* __ARES_EVENT_WIN32_H */ diff --git a/deps/cares/src/lib/include/ares_array.h b/deps/cares/src/lib/include/ares_array.h new file mode 100644 index 00000000000000..f1a2e155f37f82 --- /dev/null +++ b/deps/cares/src/lib/include/ares_array.h @@ -0,0 +1,276 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__ARRAY_H +#define __ARES__ARRAY_H + +#include "ares.h" + +/*! \addtogroup ares_array Array Data Structure + * + * This is an array with helpers. It is meant to have as little overhead + * as possible over direct array management by applications but to provide + * safety and some optimization features. It can also return the array in + * native form once all manipulation has been performed. + * + * @{ + */ + +struct ares_array; + +/*! Opaque data structure for array */ +typedef struct ares_array ares_array_t; + +/*! Callback to free user-defined member data + * + * \param[in] data pointer to member of array to be destroyed. The pointer + * itself must not be destroyed, just the data it contains. + */ +typedef void (*ares_array_destructor_t)(void *data); + +/*! Callback to compare two array elements used for sorting + * + * \param[in] data1 array member 1 + * \param[in] data2 array member 2 + * \return < 0 if data1 < data2, > 0 if data1 > data2, 0 if data1 == data2 + */ +typedef int (*ares_array_cmp_t)(const void *data1, const void *data2); + +/*! Create an array object + * + * NOTE: members of the array are typically going to be an going to be a + * struct with compiler/ABI specific padding to ensure proper alignment. + * Care needs to be taken if using primitive types, especially floating + * point numbers which size may not indicate the required alignment. + * For example, a double may be 80 bits (10 bytes), but required + * alignment of 16 bytes. In such a case, a member_size of 16 would be + * required to be used. + * + * \param[in] destruct Optional. Destructor to call on a removed member + * \param[in] member_size Size of array member, usually determined using + * sizeof() for the member such as a struct. + * + * \return array object or NULL on out of memory + */ +CARES_EXTERN ares_array_t *ares_array_create(size_t member_size, + ares_array_destructor_t destruct); + + +/*! Request the array be at least the requested size. Useful if the desired + * array size is known prior to populating the array to prevent reallocations. + * + * \param[in] arr Initialized array object. + * \param[in] size Minimum number of members + * \return ARES_SUCCESS on success, ARES_EFORMERR on misuse, + * ARES_ENOMEM on out of memory */ +CARES_EXTERN ares_status_t ares_array_set_size(ares_array_t *arr, size_t size); + +/*! Sort the array using the given comparison function. This is not + * persistent, any future elements inserted will not maintain this sort. + * + * \param[in] arr Initialized array object. + * \param[in] cb Sort callback + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_array_sort(ares_array_t *arr, + ares_array_cmp_t cmp); + +/*! Destroy an array object. If a destructor is set, will be called on each + * member of the array. + * + * \param[in] arr Initialized array object. + */ +CARES_EXTERN void ares_array_destroy(ares_array_t *arr); + +/*! Retrieve the array in the native format. This will also destroy the + * container. It is the responsibility of the caller to free the returned + * pointer and also any data within each array element. + * + * \param[in] arr Initialized array object + * \param[out] num_members the number of members in the returned array + * \return pointer to native array on success, NULL on failure. + */ +CARES_EXTERN void *ares_array_finish(ares_array_t *arr, size_t *num_members); + +/*! Retrieve the number of members in the array + * + * \param[in] arr Initialized array object. + * \return numbrer of members + */ +CARES_EXTERN size_t ares_array_len(const ares_array_t *arr); + +/*! Insert a new array member at the given index + * + * \param[out] elem_ptr Optional. Pointer to the returned array element. + * \param[in] arr Initialized array object. + * \param[in] idx Index in array to place new element, will shift any + * elements down that exist after this point. + * \return ARES_SUCCESS on success, ARES_EFORMERR on bad index, + * ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insert_at(void **elem_ptr, + ares_array_t *arr, size_t idx); + +/*! Insert a new array member at the end of the array + * + * \param[out] elem_ptr Optional. Pointer to the returned array element. + * \param[in] arr Initialized array object. + * \return ARES_SUCCESS on success, ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insert_last(void **elem_ptr, + ares_array_t *arr); + +/*! Insert a new array member at the beginning of the array + * + * \param[out] elem_ptr Optional. Pointer to the returned array element. + * \param[in] arr Initialized array object. + * \return ARES_SUCCESS on success, ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insert_first(void **elem_ptr, + ares_array_t *arr); + + +/*! Insert a new array member at the given index and copy the data pointed + * to by the data pointer into the array. This will copy member_size bytes + * from the provided pointer, this may not be safe for some data types + * that may have a smaller size than the provided member_size which includes + * padding as discussed in ares_array_create(). + * + * \param[in] arr Initialized array object. + * \param[in] idx Index in array to place new element, will shift any + * elements down that exist after this point. + * \param[in] data_ptr Pointer to data to copy into array. + * \return ARES_SUCCESS on success, ARES_EFORMERR on bad index or null data + * ptr, ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insertdata_at(ares_array_t *arr, + size_t idx, + const void *data_ptr); + +/*! Insert a new array member at the end of the array and copy the data pointed + * to by the data pointer into the array. This will copy member_size bytes + * from the provided pointer, this may not be safe for some data types + * that may have a smaller size than the provided member_size which includes + * padding as discussed in ares_array_create(). + * + * \param[in] arr Initialized array object. + * \param[in] data_ptr Pointer to data to copy into array. + * \return ARES_SUCCESS on success, ARES_EFORMERR on bad index or null data + * ptr, ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insertdata_last(ares_array_t *arr, + const void *data_ptr); + +/*! Insert a new array member at the beginning of the array and copy the data + * pointed to by the data pointer into the array. This will copy member_size + * bytes from the provided pointer, this may not be safe for some data types + * that may have a smaller size than the provided member_size which includes + * padding as discussed in ares_array_create(). + * + * \param[in] arr Initialized array object. + * \param[in] data_ptr Pointer to data to copy into array. + * \return ARES_SUCCESS on success, ARES_EFORMERR on bad index or null data + * ptr, ARES_ENOMEM on out of memory. + */ +CARES_EXTERN ares_status_t ares_array_insertdata_first(ares_array_t *arr, + const void *data_ptr); + +/*! Fetch a pointer to the given element in the array + * \param[in] array Initialized array object + * \param[in] idx Index to fetch + * \return pointer on success, NULL on failure */ +CARES_EXTERN void *ares_array_at(ares_array_t *arr, size_t idx); + +/*! Fetch a pointer to the first element in the array + * \param[in] array Initialized array object + * \return pointer on success, NULL on failure */ +CARES_EXTERN void *ares_array_first(ares_array_t *arr); + +/*! Fetch a pointer to the last element in the array + * \param[in] array Initialized array object + * \return pointer on success, NULL on failure */ +CARES_EXTERN void *ares_array_last(ares_array_t *arr); + +/*! Fetch a constant pointer to the given element in the array + * \param[in] array Initialized array object + * \param[in] idx Index to fetch + * \return pointer on success, NULL on failure */ +CARES_EXTERN const void *ares_array_at_const(const ares_array_t *arr, + size_t idx); + +/*! Fetch a constant pointer to the first element in the array + * \param[in] array Initialized array object + * \return pointer on success, NULL on failure */ +CARES_EXTERN const void *ares_array_first_const(const ares_array_t *arr); + +/*! Fetch a constant pointer to the last element in the array + * \param[in] array Initialized array object + * \return pointer on success, NULL on failure */ +CARES_EXTERN const void *ares_array_last_const(const ares_array_t *arr); + +/*! Claim the data from the specified array index, copying it to the buffer + * provided by the caller. The index specified in the array will then be + * removed (without calling any possible destructor) + * + * \param[in,out] dest Optional. Buffer to hold array member. Pass NULL + * if not needed. This could leak memory if array + * member needs destructor if not provided. + * \param[in] dest_size Size of buffer provided, used as a sanity check. + * Must match member_size provided to + * ares_array_create() if dest_size specified. + * \param[in] arr Initialized array object + * \param[in] idx Index to claim + * \return ARES_SUCCESS on success, ARES_EFORMERR on usage failure. + */ +CARES_EXTERN ares_status_t ares_array_claim_at(void *dest, size_t dest_size, + ares_array_t *arr, size_t idx); + +/*! Remove the member at the specified array index. The destructor will be + * called. + * + * \param[in] arr Initialized array object + * \param[in] idx Index to remove + * \return ARES_SUCCESS if removed, ARES_EFORMERR on invalid use + */ +CARES_EXTERN ares_status_t ares_array_remove_at(ares_array_t *arr, size_t idx); + +/*! Remove the first member of the array. + * + * \param[in] arr Initialized array object + * \return ARES_SUCCESS if removed, ARES_EFORMERR on invalid use + */ +CARES_EXTERN ares_status_t ares_array_remove_first(ares_array_t *arr); + +/*! Remove the last member of the array. + * + * \param[in] arr Initialized array object + * \return ARES_SUCCESS if removed, ARES_EFORMERR on invalid use + */ +CARES_EXTERN ares_status_t ares_array_remove_last(ares_array_t *arr); + + +/*! @} */ + +#endif /* __ARES__ARRAY_H */ diff --git a/deps/cares/src/lib/include/ares_buf.h b/deps/cares/src/lib/include/ares_buf.h new file mode 100644 index 00000000000000..10d29eaf83bd8e --- /dev/null +++ b/deps/cares/src/lib/include/ares_buf.h @@ -0,0 +1,732 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__BUF_H +#define __ARES__BUF_H + +#include "ares.h" +#include "ares_array.h" + +/*! \addtogroup ares_buf Safe Data Builder and buffer + * + * This is a buffer building and parsing framework with a focus on security over + * performance. All data to be read from the buffer will perform explicit length + * validation and return a success/fail result. There are also various helpers + * for writing data to the buffer which dynamically grows. + * + * All operations that fetch or consume data from the buffer will move forward + * the internal pointer, thus marking the data as processed which may no longer + * be accessible after certain operations (such as append). + * + * The helpers for this object are meant to be added as needed. If you can't + * find it, write it! + * + * @{ + */ +struct ares_buf; + +/*! Opaque data type for generic hash table implementation */ +typedef struct ares_buf ares_buf_t; + +/*! Create a new buffer object that dynamically allocates buffers for data. + * + * \return initialized buffer object or NULL if out of memory. + */ +CARES_EXTERN ares_buf_t *ares_buf_create(void); + +/*! Create a new buffer object that uses a user-provided data pointer. The + * data provided will not be manipulated, and cannot be appended to. This + * is strictly used for parsing. + * + * \param[in] data Data to provide to buffer, must not be NULL. + * \param[in] data_len Size of buffer provided, must be > 0 + * + * \return initialized buffer object or NULL if out of memory or misuse. + */ +CARES_EXTERN ares_buf_t *ares_buf_create_const(const unsigned char *data, + size_t data_len); + + +/*! Destroy an initialized buffer object. + * + * \param[in] buf Initialized buf object + */ +CARES_EXTERN void ares_buf_destroy(ares_buf_t *buf); + + +/*! Append multiple bytes to a dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] data Data to copy to buffer object + * \param[in] data_len Length of data to copy to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_append(ares_buf_t *buf, + const unsigned char *data, + size_t data_len); + +/*! Append a single byte to the dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] b Single byte to append to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_append_byte(ares_buf_t *buf, + unsigned char b); + +/*! Append a null-terminated string to the dynamic buffer object + * + * \param[in] buf Initialized buffer object + * \param[in] str String to append to buffer object. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_append_str(ares_buf_t *buf, + const char *str); + +/*! Append a 16bit Big Endian number to the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u16 16bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_append_be16(ares_buf_t *buf, + unsigned short u16); + +/*! Append a 32bit Big Endian number to the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u32 32bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_append_be32(ares_buf_t *buf, + unsigned int u32); + +/*! Append a number in ASCII decimal form. + * + * \param[in] buf Initialized buffer object + * \param[in] num Number to print + * \param[in] len Length to output, use 0 for no padding + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_buf_append_num_dec(ares_buf_t *buf, size_t num, + size_t len); + +/*! Append a number in ASCII hexadecimal form. + * + * \param[in] buf Initialized buffer object + * \param[in] num Number to print + * \param[in] len Length to output, use 0 for no padding + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_buf_append_num_hex(ares_buf_t *buf, size_t num, + size_t len); + +/*! Sets the current buffer length. This *may* be used if there is a need to + * override a prior position in the buffer, such as if there is a length + * prefix that isn't easily predictable, and you must go back and overwrite + * that position. + * + * Only valid on non-const buffers. Length provided must not exceed current + * allocated buffer size, but otherwise there are very few protections on + * this function. Use cautiously. + * + * \param[in] buf Initialized buffer object + * \param[in] len Length to set + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_set_length(ares_buf_t *buf, size_t len); + + +/*! Start a dynamic append operation that returns a buffer suitable for + * writing. A desired minimum length is passed in, and the actual allocated + * buffer size is returned which may be greater than the requested size. + * No operation other than ares_buf_append_finish() is allowed on the + * buffer after this request. + * + * \param[in] buf Initialized buffer object + * \param[in,out] len Desired non-zero length passed in, actual buffer size + * returned. + * \return Pointer to writable buffer or NULL on failure (usage, out of mem) + */ +CARES_EXTERN unsigned char *ares_buf_append_start(ares_buf_t *buf, size_t *len); + +/*! Finish a dynamic append operation. Called after + * ares_buf_append_start() once desired data is written. + * + * \param[in] buf Initialized buffer object. + * \param[in] len Length of data written. May be zero to terminate + * operation. Must not be greater than returned from + * ares_buf_append_start(). + */ +CARES_EXTERN void ares_buf_append_finish(ares_buf_t *buf, size_t len); + +/*! Write the data provided to the buffer in a hexdump format. + * + * \param[in] buf Initialized buffer object. + * \param[in] data Data to hex dump + * \param[in] len Length of data to hexdump + * \return ARES_SUCCESS on success. + */ +CARES_EXTERN ares_status_t ares_buf_hexdump(ares_buf_t *buf, + const unsigned char *data, + size_t len); + +/*! Clean up ares_buf_t and return allocated pointer to unprocessed data. It + * is the responsibility of the caller to ares_free() the returned buffer. + * The passed in buf parameter is invalidated by this call. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[out] len Length of data returned + * \return pointer to unprocessed data (may be zero length) or NULL on error. + */ +CARES_EXTERN unsigned char *ares_buf_finish_bin(ares_buf_t *buf, size_t *len); + +/*! Clean up ares_buf_t and return allocated pointer to unprocessed data and + * return it as a string (null terminated). It is the responsibility of the + * caller to ares_free() the returned buffer. The passed in buf parameter is + * invalidated by this call. + * + * This function in no way validates the data in this buffer is actually + * a string, that characters are printable, or that there aren't multiple + * NULL terminators. It is assumed that the caller will either validate that + * themselves or has built this buffer with only a valid character set. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[out] len Optional. Length of data returned, or NULL if not needed. + * \return pointer to unprocessed data or NULL on error. + */ +CARES_EXTERN char *ares_buf_finish_str(ares_buf_t *buf, size_t *len); + +/*! Replace the given search byte sequence with the replacement byte sequence. + * This is only valid for allocated buffers, not const buffers. Will replace + * all byte sequences starting at the current offset to the end of the buffer. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[in] srch Search byte sequence, must not be NULL. + * \param[in] srch_size Size of byte sequence, must not be zero. + * \param[in] rplc Byte sequence to use as replacement. May be NULL if + * rplc_size is zero. + * \param[in] rplc_size Size of replacement byte sequence, may be 0. + * \return ARES_SUCCESS on success, otherwise on may return failure only on + * memory allocation failure or misuse. Will not return indication + * if any replacements occurred + */ +CARES_EXTERN ares_status_t ares_buf_replace(ares_buf_t *buf, + const unsigned char *srch, + size_t srch_size, + const unsigned char *rplc, + size_t rplc_size); + +/*! Tag a position to save in the buffer in case parsing needs to rollback, + * such as if insufficient data is available, but more data may be added in + * the future. Only a single tag can be set per buffer object. Setting a + * tag will override any pre-existing tag. + * + * \param[in] buf Initialized buffer object + */ +CARES_EXTERN void ares_buf_tag(ares_buf_t *buf); + +/*! Rollback to a tagged position. Will automatically clear the tag. + * + * \param[in] buf Initialized buffer object + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_tag_rollback(ares_buf_t *buf); + +/*! Clear the tagged position without rolling back. You should do this any + * time a tag is no longer needed as future append operations can reclaim + * buffer space. + * + * \param[in] buf Initialized buffer object + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_tag_clear(ares_buf_t *buf); + +/*! Fetch the buffer and length of data starting from the tagged position up + * to the _current_ position. It will not unset the tagged position. The + * data may be invalidated by any future ares_buf_*() calls. + * + * \param[in] buf Initialized buffer object + * \param[out] len Length between tag and current offset in buffer + * \return NULL on failure (such as no tag), otherwise pointer to start of + * buffer + */ +CARES_EXTERN const unsigned char *ares_buf_tag_fetch(const ares_buf_t *buf, + size_t *len); + +/*! Get the length of the current tag offset to the current position. + * + * \param[in] buf Initialized buffer object + * \return length + */ +CARES_EXTERN size_t ares_buf_tag_length(const ares_buf_t *buf); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position using the provided buffer. It will not unset the tagged position. + * + * \param[in] buf Initialized buffer object + * \param[in,out] bytes Buffer to hold data + * \param[in,out] len On input, buffer size, on output, bytes place in + * buffer. + * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size + */ +CARES_EXTERN ares_status_t ares_buf_tag_fetch_bytes(const ares_buf_t *buf, + unsigned char *bytes, + size_t *len); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position as a NULL-terminated string using the provided buffer. The data + * is validated to be ASCII-printable data. It will not unset the tagged + * position. + * + * \param[in] buf Initialized buffer object + * \param[in,out] str Buffer to hold data + * \param[in] len buffer size + * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size, + * ARES_EBADSTR if not printable ASCII + */ +CARES_EXTERN ares_status_t ares_buf_tag_fetch_string(const ares_buf_t *buf, + char *str, size_t len); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position as a NULL-terminated string and placed into a newly allocated + * buffer. The data is validated to be ASCII-printable data. It will not + * unset the tagged position. + * + * \param[in] buf Initialized buffer object + * \param[out] str New buffer to hold output, free with ares_free() + * + * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size, + * ARES_EBADSTR if not printable ASCII + */ +CARES_EXTERN ares_status_t ares_buf_tag_fetch_strdup(const ares_buf_t *buf, + char **str); + +/*! Fetch the bytes starting from the tagged position up to the _current_ + * position as const buffer. Care must be taken to not append or destroy the + * passed in buffer until the newly fetched buffer is no longer needed since + * it points to memory inside the passed in buffer which could be invalidated. + * + * \param[in] buf Initialized buffer object + * \param[out] newbuf New const buffer object, must be destroyed when done. + + * \return ARES_SUCCESS if fetched + */ +CARES_EXTERN ares_status_t ares_buf_tag_fetch_constbuf(const ares_buf_t *buf, + ares_buf_t **newbuf); + +/*! Consume the given number of bytes without reading them. + * + * \param[in] buf Initialized buffer object + * \param[in] len Length to consume + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_consume(ares_buf_t *buf, size_t len); + +/*! Fetch a 16bit Big Endian number from the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u16 Buffer to hold 16bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_be16(ares_buf_t *buf, + unsigned short *u16); + +/*! Fetch a 32bit Big Endian number from the buffer. + * + * \param[in] buf Initialized buffer object + * \param[out] u32 Buffer to hold 32bit integer + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_be32(ares_buf_t *buf, + unsigned int *u32); + + +/*! Fetch the requested number of bytes into the provided buffer + * + * \param[in] buf Initialized buffer object + * \param[out] bytes Buffer to hold data + * \param[in] len Requested number of bytes (must be > 0) + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_bytes(ares_buf_t *buf, + unsigned char *bytes, + size_t len); + + +/*! Fetch the requested number of bytes and return a new buffer that must be + * ares_free()'d by the caller. + * + * \param[in] buf Initialized buffer object + * \param[in] len Requested number of bytes (must be > 0) + * \param[in] null_term Even though this is considered binary data, the user + * knows it may be a vald string, so add a null + * terminator. + * \param[out] bytes Pointer passed by reference. Will be allocated. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_bytes_dup(ares_buf_t *buf, size_t len, + ares_bool_t null_term, + unsigned char **bytes); + +/*! Fetch the requested number of bytes and place them into the provided + * dest buffer object. + * + * \param[in] buf Initialized buffer object + * \param[out] dest Buffer object to append bytes. + * \param[in] len Requested number of bytes (must be > 0) + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_bytes_into_buf(ares_buf_t *buf, + ares_buf_t *dest, + size_t len); + +/*! Fetch the requested number of bytes and return a new buffer that must be + * ares_free()'d by the caller. The returned buffer is a null terminated + * string. The data is validated to be ASCII-printable. + * + * \param[in] buf Initialized buffer object + * \param[in] len Requested number of bytes (must be > 0) + * \param[out] str Pointer passed by reference. Will be allocated. + * \return ARES_SUCCESS or one of the c-ares error codes + */ +CARES_EXTERN ares_status_t ares_buf_fetch_str_dup(ares_buf_t *buf, size_t len, + char **str); + +/*! Consume whitespace characters (0x09, 0x0B, 0x0C, 0x0D, 0x20, and optionally + * 0x0A). + * + * \param[in] buf Initialized buffer object + * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, + * ARES_FALSE otherwise. + * \return number of whitespace characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_whitespace(ares_buf_t *buf, + ares_bool_t include_linefeed); + + +/*! Consume any non-whitespace character (anything other than 0x09, 0x0B, 0x0C, + * 0x0D, 0x20, and 0x0A). + * + * \param[in] buf Initialized buffer object + * \return number of characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_nonwhitespace(ares_buf_t *buf); + + +/*! Consume until a character in the character set provided is reached. Does + * not include the character from the charset at the end. + * + * \param[in] buf Initialized buffer object + * \param[in] charset character set + * \param[in] len length of character set + * \param[in] require_charset require we find a character from the charset. + * if ARES_FALSE it will simply consume the + * rest of the buffer. If ARES_TRUE will return + * SIZE_MAX if not found. + * \return number of characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_until_charset(ares_buf_t *buf, + const unsigned char *charset, + size_t len, + ares_bool_t require_charset); + + +/*! Consume until a sequence of bytes is encountered. Does not include the + * sequence of characters itself. + * + * \param[in] buf Initialized buffer object + * \param[in] seq sequence of bytes + * \param[in] len length of sequence + * \param[in] require_charset require we find the sequence. + * if ARES_FALSE it will simply consume the + * rest of the buffer. If ARES_TRUE will return + * SIZE_MAX if not found. + * \return number of characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_until_seq(ares_buf_t *buf, + const unsigned char *seq, + size_t len, + ares_bool_t require_seq); + +/*! Consume while the characters match the characters in the provided set. + * + * \param[in] buf Initialized buffer object + * \param[in] charset character set + * \param[in] len length of character set + * \return number of characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_charset(ares_buf_t *buf, + const unsigned char *charset, + size_t len); + + +/*! Consume from the current position until the end of the line, and optionally + * the end of line character (0x0A) itself. + * + * \param[in] buf Initialized buffer object + * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A, + * ARES_FALSE otherwise. + * \return number of characters consumed + */ +CARES_EXTERN size_t ares_buf_consume_line(ares_buf_t *buf, + ares_bool_t include_linefeed); + +typedef enum { + /*! No flags */ + ARES_BUF_SPLIT_NONE = 0, + /*! The delimiter will be the first character in the buffer, except the + * first buffer since the start doesn't have a delimiter. This option is + * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always + * the first character. + */ + ARES_BUF_SPLIT_KEEP_DELIMS = 1 << 0, + /*! Allow blank sections, by default blank sections are not emitted. If using + * ARES_BUF_SPLIT_KEEP_DELIMS, the delimiter is not counted as part + * of the section */ + ARES_BUF_SPLIT_ALLOW_BLANK = 1 << 1, + /*! Remove duplicate entries */ + ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2, + /*! Perform case-insensitive matching when comparing values */ + ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3, + /*! Trim leading whitespace from buffer */ + ARES_BUF_SPLIT_LTRIM = 1 << 4, + /*! Trim trailing whitespace from buffer */ + ARES_BUF_SPLIT_RTRIM = 1 << 5, + /*! Trim leading and trailing whitespace from buffer */ + ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM) +} ares_buf_split_t; + +/*! Split the provided buffer into multiple sub-buffers stored in the variable + * pointed to by the linked list. The sub buffers are const buffers pointing + * into the buf provided. + * + * \param[in] buf Initialized buffer object + * \param[in] delims Possible delimiters + * \param[in] delims_len Length of possible delimiters + * \param[in] flags One more more flags + * \param[in] max_sections Maximum number of sections. Use 0 for + * unlimited. Useful for splitting key/value + * pairs where the delimiter may be a valid + * character in the value. A value of 1 would + * have little usefulness and would effectively + * ignore the delimiter itself. + * \param[out] arr Result. Depending on flags, this may be a + * valid array with no elements. Use + * ares_array_destroy() to free the memory which + * will also free the contained ares_buf_t * + * objects. Each buf object returned by + * ares_array_at() or similar is a pointer to + * an ares_buf_t * object, meaning you need to + * accept it as "ares_buf_t **" then dereference. + * \return ARES_SUCCESS on success, or error like ARES_ENOMEM. + */ +CARES_EXTERN ares_status_t ares_buf_split( + ares_buf_t *buf, const unsigned char *delims, size_t delims_len, + ares_buf_split_t flags, size_t max_sections, ares_array_t **arr); + +/*! Split the provided buffer into an ares_array_t of C strings. + * + * \param[in] buf Initialized buffer object + * \param[in] delims Possible delimiters + * \param[in] delims_len Length of possible delimiters + * \param[in] flags One more more flags + * \param[in] max_sections Maximum number of sections. Use 0 for + * unlimited. Useful for splitting key/value + * pairs where the delimiter may be a valid + * character in the value. A value of 1 would + * have little usefulness and would effectively + * ignore the delimiter itself. + * \param[out] arr Array of strings. Free using + * ares_array_destroy(). + * \return ARES_SUCCESS on success, or error like ARES_ENOMEM. + */ +CARES_EXTERN ares_status_t ares_buf_split_str_array( + ares_buf_t *buf, const unsigned char *delims, size_t delims_len, + ares_buf_split_t flags, size_t max_sections, ares_array_t **arr); + +/*! Split the provided buffer into a C array of C strings. + * + * \param[in] buf Initialized buffer object + * \param[in] delims Possible delimiters + * \param[in] delims_len Length of possible delimiters + * \param[in] flags One more more flags + * \param[in] max_sections Maximum number of sections. Use 0 for + * unlimited. Useful for splitting key/value + * pairs where the delimiter may be a valid + * character in the value. A value of 1 would + * have little usefulness and would effectively + * ignore the delimiter itself. + * \param[out] strs Array of strings. Free using + * ares_free_array(strs, nstrs, ares_free) + * \param[out] nstrs Number of elements in the array. + * \return ARES_SUCCESS on success, or error like ARES_ENOMEM. + */ +CARES_EXTERN ares_status_t ares_buf_split_str( + ares_buf_t *buf, const unsigned char *delims, size_t delims_len, + ares_buf_split_t flags, size_t max_sections, char ***strs, size_t *nstrs); + +/*! Check the unprocessed buffer to see if it begins with the sequence of + * characters provided. + * + * \param[in] buf Initialized buffer object + * \param[in] data Bytes of data to compare. + * \param[in] data_len Length of data to compare. + * \return ARES_TRUE on match, ARES_FALSE otherwise. + */ +CARES_EXTERN ares_bool_t ares_buf_begins_with(const ares_buf_t *buf, + const unsigned char *data, + size_t data_len); + + +/*! Size of unprocessed remaining data length + * + * \param[in] buf Initialized buffer object + * \return length remaining + */ +CARES_EXTERN size_t ares_buf_len(const ares_buf_t *buf); + +/*! Retrieve a pointer to the currently unprocessed data. Generally this isn't + * recommended to be used in practice. The returned pointer may be invalidated + * by any future ares_buf_*() calls. + * + * \param[in] buf Initialized buffer object + * \param[out] len Length of available data + * \return Pointer to buffer of unprocessed data + */ +CARES_EXTERN const unsigned char *ares_buf_peek(const ares_buf_t *buf, + size_t *len); + +/*! Retrieve the next byte in the buffer without moving forward. + * + * \param[in] buf Initialized buffer object + * \param[out] b Single byte + * \return \return ARES_SUCCESS on success, or error + */ +CARES_EXTERN ares_status_t ares_buf_peek_byte(const ares_buf_t *buf, + unsigned char *b); + +/*! Wipe any processed data from the beginning of the buffer. This will + * move any remaining data to the front of the internally allocated buffer. + * + * Can not be used on const buffer objects. + * + * Typically not needed to call, as any new append operation will automatically + * call this function if there is insufficient space to append the data in + * order to try to avoid another memory allocation. + * + * It may be useful to call in order to ensure the current message being + * processed is in the beginning of the buffer if there is an intent to use + * ares_buf_set_position() and ares_buf_get_position() as may be necessary + * when processing DNS compressed names. + * + * If there is an active tag, it will NOT clear the tag, it will use the tag + * as the start of the unprocessed data rather than the current offset. If + * a prior tag is no longer needed, may be wise to call ares_buf_tag_clear(). + * + * \param[in] buf Initialized buffer object + */ +CARES_EXTERN void ares_buf_reclaim(ares_buf_t *buf); + +/*! Set the current offset within the internal buffer. + * + * Typically this should not be used, if possible, use the ares_buf_tag*() + * operations instead. + * + * One exception is DNS name compression which may backwards reference to + * an index in the message. It may be necessary in such a case to call + * ares_buf_reclaim() if using a dynamic (non-const) buffer before processing + * such a message. + * + * \param[in] buf Initialized buffer object + * \param[in] idx Index to set position + * \return ARES_SUCCESS if valid index + */ +CARES_EXTERN ares_status_t ares_buf_set_position(ares_buf_t *buf, size_t idx); + +/*! Get the current offset within the internal buffer. + * + * Typically this should not be used, if possible, use the ares_buf_tag*() + * operations instead. + * + * This can be used to get the current position, useful for saving if a + * jump via ares_buf_set_position() is performed and need to restore the + * current position for future operations. + * + * \param[in] buf Initialized buffer object + * \return index of current position + */ +CARES_EXTERN size_t ares_buf_get_position(const ares_buf_t *buf); + +/*! Parse a character-string as defined in RFC1035, as a null-terminated + * string. + * + * \param[in] buf initialized buffer object + * \param[in] remaining_len maximum length that should be used for parsing + * the string, this is often less than the remaining + * buffer and is based on the RR record length. + * \param[out] name Pointer passed by reference to be filled in with + * allocated string of the parsed that must be + * ares_free()'d by the caller. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_buf_parse_dns_str(ares_buf_t *buf, + size_t remaining_len, + char **name); + +/*! Parse a character-string as defined in RFC1035, as binary, however for + * convenience this does guarantee a NULL terminator (that is not included + * in the returned length). + * + * \param[in] buf initialized buffer object + * \param[in] remaining_len maximum length that should be used for parsing + * the string, this is often less than the remaining + * buffer and is based on the RR record length. + * \param[out] bin Pointer passed by reference to be filled in with + * allocated string of the parsed that must be + * ares_free()'d by the caller. + * \param[out] bin_len Length of returned string. + * \return ARES_SUCCESS on success + */ +CARES_EXTERN ares_status_t ares_buf_parse_dns_binstr(ares_buf_t *buf, + size_t remaining_len, + unsigned char **bin, + size_t *bin_len); + +/*! Load data from specified file path into provided buffer. The entire file + * is loaded into memory. + * + * \param[in] filename complete path to file + * \param[in,out] buf Initialized (non-const) buffer object to load data + * into + * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading + * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success. + */ +CARES_EXTERN ares_status_t ares_buf_load_file(const char *filename, + ares_buf_t *buf); + +/*! @} */ + +#endif /* __ARES__BUF_H */ diff --git a/deps/cares/src/lib/include/ares_htable_asvp.h b/deps/cares/src/lib/include/ares_htable_asvp.h new file mode 100644 index 00000000000000..89a99fc9eec541 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_asvp.h @@ -0,0 +1,130 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_ASVP_H +#define __ARES__HTABLE_ASVP_H + +/*! \addtogroup ares_htable_asvp HashTable with ares_socket_t Key and + * void pointer Value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as ares_socket_t and void pointer, + * respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_asvp; + +/*! Opaque data type for ares_socket_t key, void pointer hash table + * implementation */ +typedef struct ares_htable_asvp ares_htable_asvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares_htable_asvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_asvp_destroy(ares_htable_asvp_t *htable); + +/*! Create size_t key, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +CARES_EXTERN ares_htable_asvp_t * + ares_htable_asvp_create(ares_htable_asvp_val_free_t val_free); + +/*! Retrieve an array of keys from the hashtable. + * + * \param[in] htable Initialized hashtable + * \param[out] num Count of returned keys + * \return Array of keys in the hashtable. Must be free'd with ares_free(). + */ +CARES_EXTERN ares_socket_t * + ares_htable_asvp_keys(const ares_htable_asvp_t *htable, size_t *num); + + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on out of memory or misuse + */ +CARES_EXTERN ares_bool_t ares_htable_asvp_insert(ares_htable_asvp_t *htable, + ares_socket_t key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_asvp_get(const ares_htable_asvp_t *htable, + ares_socket_t key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_asvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN void *ares_htable_asvp_get_direct(const ares_htable_asvp_t *htable, + ares_socket_t key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not found + */ +CARES_EXTERN ares_bool_t ares_htable_asvp_remove(ares_htable_asvp_t *htable, + ares_socket_t key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t ares_htable_asvp_num_keys(const ares_htable_asvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_ASVP_H */ diff --git a/deps/cares/src/lib/include/ares_htable_dict.h b/deps/cares/src/lib/include/ares_htable_dict.h new file mode 100644 index 00000000000000..cb6f1f048ca023 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_dict.h @@ -0,0 +1,123 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_DICT_H +#define __ARES__HTABLE_DICT_H + +/*! \addtogroup ares_htable_dict HashTable with case-insensitive string Key and + * string value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as string and string, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_dict; + +/*! Opaque data type for string key, string value hash table + * implementation */ +typedef struct ares_htable_dict ares_htable_dict_t; + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_dict_destroy(ares_htable_dict_t *htable); + +/*! Create void pointer key, string value hash table + * + */ +CARES_EXTERN ares_htable_dict_t *ares_htable_dict_create(void); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (duplicates). + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +CARES_EXTERN ares_bool_t ares_htable_dict_insert(ares_htable_dict_t *htable, + const char *key, + const char *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_dict_get(const ares_htable_dict_t *htable, + const char *key, + const char **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_dict_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN const char * + ares_htable_dict_get_direct(const ares_htable_dict_t *htable, + const char *key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_htable_dict_remove(ares_htable_dict_t *htable, + const char *key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t ares_htable_dict_num_keys(const ares_htable_dict_t *htable); + +/*! Retrieve an array of keys from the hashtable. + * + * \param[in] htable Initialized hashtable + * \param[out] num Count of returned keys + * \return Array of keys in the hashtable. Must be free'd with + * ares_free_array(strs, num, ares_free); + */ +CARES_EXTERN char **ares_htable_dict_keys(const ares_htable_dict_t *htable, + size_t *num); + + +/*! @} */ + +#endif /* __ARES__HTABLE_DICT_H */ diff --git a/deps/cares/src/lib/include/ares_htable_strvp.h b/deps/cares/src/lib/include/ares_htable_strvp.h new file mode 100644 index 00000000000000..eaaf6d3be0d188 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_strvp.h @@ -0,0 +1,130 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_STRVP_H +#define __ARES__HTABLE_STRVP_H + +/*! \addtogroup ares_htable_strvp HashTable with string Key and void pointer + * Value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as string and void pointer, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_strvp; + +/*! Opaque data type for size_t key, void pointer hash table implementation */ +typedef struct ares_htable_strvp ares_htable_strvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares_htable_strvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_strvp_destroy(ares_htable_strvp_t *htable); + +/*! Create string, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +CARES_EXTERN ares_htable_strvp_t * + ares_htable_strvp_create(ares_htable_strvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +CARES_EXTERN ares_bool_t ares_htable_strvp_insert(ares_htable_strvp_t *htable, + const char *key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_strvp_get( + const ares_htable_strvp_t *htable, const char *key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_strvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN void * + ares_htable_strvp_get_direct(const ares_htable_strvp_t *htable, + const char *key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_htable_strvp_remove(ares_htable_strvp_t *htable, + const char *key); + +/*! Remove the value from the hashtable, and return the value instead of + * calling the val_free passed to ares_htable_strvp_create(). + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value in hashtable or NULL on error + */ +CARES_EXTERN void *ares_htable_strvp_claim(ares_htable_strvp_t *htable, + const char *key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t + ares_htable_strvp_num_keys(const ares_htable_strvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_STRVP_H */ diff --git a/deps/cares/src/lib/include/ares_htable_szvp.h b/deps/cares/src/lib/include/ares_htable_szvp.h new file mode 100644 index 00000000000000..927b9a5ec9f780 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_szvp.h @@ -0,0 +1,118 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_STVP_H +#define __ARES__HTABLE_STVP_H + +/*! \addtogroup ares_htable_szvp HashTable with size_t Key and void pointer + * Value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as size_t and void pointer, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_szvp; + +/*! Opaque data type for size_t key, void pointer hash table implementation */ +typedef struct ares_htable_szvp ares_htable_szvp_t; + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares_htable_szvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_szvp_destroy(ares_htable_szvp_t *htable); + +/*! Create size_t key, void pointer value hash table + * + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +CARES_EXTERN ares_htable_szvp_t * + ares_htable_szvp_create(ares_htable_szvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +CARES_EXTERN ares_bool_t ares_htable_szvp_insert(ares_htable_szvp_t *htable, + size_t key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_szvp_get(const ares_htable_szvp_t *htable, + size_t key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_szvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN void *ares_htable_szvp_get_direct(const ares_htable_szvp_t *htable, + size_t key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_htable_szvp_remove(ares_htable_szvp_t *htable, + size_t key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t ares_htable_szvp_num_keys(const ares_htable_szvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_STVP_H */ diff --git a/deps/cares/src/lib/include/ares_htable_vpstr.h b/deps/cares/src/lib/include/ares_htable_vpstr.h new file mode 100644 index 00000000000000..9f51b877452b72 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_vpstr.h @@ -0,0 +1,111 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_VPSTR_H +#define __ARES__HTABLE_VPSTR_H + +/*! \addtogroup ares_htable_vpstr HashTable with void pointer Key and string + * value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as void pointer and string, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_vpstr; + +/*! Opaque data type for void pointer key, string value hash table + * implementation */ +typedef struct ares_htable_vpstr ares_htable_vpstr_t; + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_vpstr_destroy(ares_htable_vpstr_t *htable); + +/*! Create void pointer key, string value hash table + * + */ +CARES_EXTERN ares_htable_vpstr_t *ares_htable_vpstr_create(void); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (duplicates). + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +CARES_EXTERN ares_bool_t ares_htable_vpstr_insert(ares_htable_vpstr_t *htable, + void *key, const char *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_vpstr_get( + const ares_htable_vpstr_t *htable, const void *key, const char **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_vpstr_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN const char * + ares_htable_vpstr_get_direct(const ares_htable_vpstr_t *htable, + const void *key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_htable_vpstr_remove(ares_htable_vpstr_t *htable, + const void *key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t + ares_htable_vpstr_num_keys(const ares_htable_vpstr_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_VPSTR_H */ diff --git a/deps/cares/src/lib/include/ares_htable_vpvp.h b/deps/cares/src/lib/include/ares_htable_vpvp.h new file mode 100644 index 00000000000000..1ebe6145765793 --- /dev/null +++ b/deps/cares/src/lib/include/ares_htable_vpvp.h @@ -0,0 +1,128 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__HTABLE_VPVP_H +#define __ARES__HTABLE_VPVP_H + +/*! \addtogroup ares_htable_vpvp HashTable with void pointer Key and void + * pointer Value + * + * This data structure wraps the base ares_htable data structure in order to + * split the key and value data types as size_t and void pointer, respectively. + * + * Average time complexity: + * - Insert: O(1) + * - Search: O(1) + * - Delete: O(1) + * + * @{ + */ + +struct ares_htable_vpvp; + +/*! Opaque data type for size_t key, void pointer hash table implementation */ +typedef struct ares_htable_vpvp ares_htable_vpvp_t; + +/*! Callback to free key stored in hashtable + * + * \param[in] key user-supplied key + */ +typedef void (*ares_htable_vpvp_key_free_t)(void *key); + +/*! Callback to free value stored in hashtable + * + * \param[in] val user-supplied value + */ +typedef void (*ares_htable_vpvp_val_free_t)(void *val); + +/*! Destroy hashtable + * + * \param[in] htable Initialized hashtable + */ +CARES_EXTERN void ares_htable_vpvp_destroy(ares_htable_vpvp_t *htable); + +/*! Create size_t key, void pointer value hash table + * + * \param[in] key_free Optional. Call back to free user-supplied key. If + * NULL it is expected the caller will clean up any user + * supplied keys. + * \param[in] val_free Optional. Call back to free user-supplied value. If + * NULL it is expected the caller will clean up any user + * supplied values. + */ +CARES_EXTERN ares_htable_vpvp_t * + ares_htable_vpvp_create(ares_htable_vpvp_key_free_t key_free, + ares_htable_vpvp_val_free_t val_free); + +/*! Insert key/value into hash table + * + * \param[in] htable Initialized hash table + * \param[in] key key to associate with value + * \param[in] val value to store (takes ownership). May be NULL. + * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory + */ +CARES_EXTERN ares_bool_t ares_htable_vpvp_insert(ares_htable_vpvp_t *htable, + void *key, void *val); + +/*! Retrieve value from hashtable based on key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \param[out] val Optional. Pointer to store value. + * \return ARES_TRUE on success, ARES_FALSE on failure + */ +CARES_EXTERN ares_bool_t ares_htable_vpvp_get(const ares_htable_vpvp_t *htable, + const void *key, void **val); + +/*! Retrieve value from hashtable directly as return value. Caveat to this + * function over ares_htable_vpvp_get() is that if a NULL value is stored + * you cannot determine if the key is not found or the value is NULL. + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return value associated with key in hashtable or NULL + */ +CARES_EXTERN void *ares_htable_vpvp_get_direct(const ares_htable_vpvp_t *htable, + const void *key); + +/*! Remove a value from the hashtable by key + * + * \param[in] htable Initialized hash table + * \param[in] key key to use to search + * \return ARES_TRUE if found, ARES_FALSE if not + */ +CARES_EXTERN ares_bool_t ares_htable_vpvp_remove(ares_htable_vpvp_t *htable, + const void *key); + +/*! Retrieve the number of keys stored in the hash table + * + * \param[in] htable Initialized hash table + * \return count + */ +CARES_EXTERN size_t ares_htable_vpvp_num_keys(const ares_htable_vpvp_t *htable); + +/*! @} */ + +#endif /* __ARES__HTABLE_VPVP_H */ diff --git a/deps/cares/src/lib/include/ares_llist.h b/deps/cares/src/lib/include/ares_llist.h new file mode 100644 index 00000000000000..6aa0c78370401f --- /dev/null +++ b/deps/cares/src/lib/include/ares_llist.h @@ -0,0 +1,239 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__LLIST_H +#define __ARES__LLIST_H + +/*! \addtogroup ares_llist LinkedList Data Structure + * + * This is a doubly-linked list data structure. + * + * Average time complexity: + * - Insert: O(1) -- head or tail + * - Search: O(n) + * - Delete: O(1) -- delete assumes you hold a node pointer + * + * @{ + */ + +struct ares_llist; + +/*! Opaque data structure for linked list */ +typedef struct ares_llist ares_llist_t; + +struct ares_llist_node; + +/*! Opaque data structure for a node in a linked list */ +typedef struct ares_llist_node ares_llist_node_t; + +/*! Callback to free user-defined node data + * + * \param[in] data user supplied data + */ +typedef void (*ares_llist_destructor_t)(void *data); + +/*! Create a linked list object + * + * \param[in] destruct Optional. Destructor to call on all removed nodes + * \return linked list object or NULL on out of memory + */ +CARES_EXTERN ares_llist_t *ares_llist_create(ares_llist_destructor_t destruct); + +/*! Replace destructor for linked list nodes. Typically this is used + * when wanting to disable the destructor by using NULL. + * + * \param[in] list Initialized linked list object + * \param[in] destruct replacement destructor, NULL is allowed + */ +CARES_EXTERN void + ares_llist_replace_destructor(ares_llist_t *list, + ares_llist_destructor_t destruct); + +/*! Insert value as the first node in the linked list + * + * \param[in] list Initialized linked list object + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +CARES_EXTERN ares_llist_node_t *ares_llist_insert_first(ares_llist_t *list, + void *val); + +/*! Insert value as the last node in the linked list + * + * \param[in] list Initialized linked list object + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +CARES_EXTERN ares_llist_node_t *ares_llist_insert_last(ares_llist_t *list, + void *val); + +/*! Insert value before specified node in the linked list + * + * \param[in] node node referenced to insert before + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +CARES_EXTERN ares_llist_node_t * + ares_llist_insert_before(ares_llist_node_t *node, void *val); + +/*! Insert value after specified node in the linked list + * + * \param[in] node node referenced to insert after + * \param[in] val user-supplied value. + * \return node object referencing place in list, or null if out of memory or + * misuse + */ +CARES_EXTERN ares_llist_node_t *ares_llist_insert_after(ares_llist_node_t *node, + void *val); + +/*! Obtain first node in list + * + * \param[in] list Initialized list object + * \return first node in list or NULL if none + */ +CARES_EXTERN ares_llist_node_t *ares_llist_node_first(ares_llist_t *list); + +/*! Obtain last node in list + * + * \param[in] list Initialized list object + * \return last node in list or NULL if none + */ +CARES_EXTERN ares_llist_node_t *ares_llist_node_last(ares_llist_t *list); + +/*! Obtain a node based on its index. This is an O(n) operation. + * + * \param[in] list Initialized list object + * \param[in] idx Index of node to retrieve + * \return node at index or NULL if invalid index + */ +CARES_EXTERN ares_llist_node_t *ares_llist_node_idx(ares_llist_t *list, + size_t idx); + +/*! Obtain next node in respect to specified node + * + * \param[in] node Node referenced + * \return node or NULL if none + */ +CARES_EXTERN ares_llist_node_t *ares_llist_node_next(ares_llist_node_t *node); + +/*! Obtain previous node in respect to specified node + * + * \param[in] node Node referenced + * \return node or NULL if none + */ +CARES_EXTERN ares_llist_node_t *ares_llist_node_prev(ares_llist_node_t *node); + + +/*! Obtain value from node + * + * \param[in] node Node referenced + * \return user provided value from node + */ +CARES_EXTERN void *ares_llist_node_val(ares_llist_node_t *node); + +/*! Obtain the number of entries in the list + * + * \param[in] list Initialized list object + * \return count + */ +CARES_EXTERN size_t ares_llist_len(const ares_llist_t *list); + +/*! Clear all entries in the list, but don't destroy the list object. + * + * \param[in] list Initialized list object + */ +CARES_EXTERN void ares_llist_clear(ares_llist_t *list); + +/*! Obtain list object from referenced node + * + * \param[in] node Node referenced + * \return list object node belongs to + */ +CARES_EXTERN ares_llist_t *ares_llist_node_parent(ares_llist_node_t *node); + +/*! Obtain the first user-supplied value in the list + * + * \param[in] list Initialized list object + * \return first user supplied value or NULL if none + */ +CARES_EXTERN void *ares_llist_first_val(ares_llist_t *list); + +/*! Obtain the last user-supplied value in the list + * + * \param[in] list Initialized list object + * \return last user supplied value or NULL if none + */ +CARES_EXTERN void *ares_llist_last_val(ares_llist_t *list); + +/*! Take ownership of user-supplied value in list without calling destructor. + * Will unchain entry from list. + * + * \param[in] node Node referenced + * \return user supplied value + */ +CARES_EXTERN void *ares_llist_node_claim(ares_llist_node_t *node); + +/*! Replace user-supplied value for node + * + * \param[in] node Node referenced + * \param[in] val new user-supplied value + */ +CARES_EXTERN void ares_llist_node_replace(ares_llist_node_t *node, void *val); + +/*! Destroy the node, removing it from the list and calling destructor. + * + * \param[in] node Node referenced + */ +CARES_EXTERN void ares_llist_node_destroy(ares_llist_node_t *node); + +/*! Destroy the list object and all nodes in the list. + * + * \param[in] list Initialized list object + */ +CARES_EXTERN void ares_llist_destroy(ares_llist_t *list); + +/*! Detach node from the current list and re-attach it to the new list as the + * last entry. + * + * \param[in] node node to move + * \param[in] new_parent new list + */ +CARES_EXTERN void ares_llist_node_mvparent_last(ares_llist_node_t *node, + ares_llist_t *new_parent); + +/*! Detach node from the current list and re-attach it to the new list as the + * first entry. + * + * \param[in] node node to move + * \param[in] new_parent new list + */ +CARES_EXTERN void ares_llist_node_mvparent_first(ares_llist_node_t *node, + ares_llist_t *new_parent); +/*! @} */ + +#endif /* __ARES__LLIST_H */ diff --git a/deps/cares/src/lib/include/ares_mem.h b/deps/cares/src/lib/include/ares_mem.h new file mode 100644 index 00000000000000..371cd4266dc720 --- /dev/null +++ b/deps/cares/src/lib/include/ares_mem.h @@ -0,0 +1,38 @@ +/* MIT License + * + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef __ARES_MEM_H +#define __ARES_MEM_H + +/* Memory management functions */ +CARES_EXTERN void *ares_malloc(size_t size); +CARES_EXTERN void *ares_realloc(void *ptr, size_t size); +CARES_EXTERN void ares_free(void *ptr); +CARES_EXTERN void *ares_malloc_zero(size_t size); +CARES_EXTERN void *ares_realloc_zero(void *ptr, size_t orig_size, + size_t new_size); + +#endif diff --git a/deps/cares/src/lib/include/ares_str.h b/deps/cares/src/lib/include/ares_str.h new file mode 100644 index 00000000000000..4ee339510bf026 --- /dev/null +++ b/deps/cares/src/lib/include/ares_str.h @@ -0,0 +1,244 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_STR_H +#define __ARES_STR_H + +CARES_EXTERN char *ares_strdup(const char *s1); + +/*! Scan up to maxlen bytes for the first NULL character and return + * its index, or maxlen if not found. The function only returns + * maxlen if the first maxlen bytes were not NULL characters; it + * makes no guarantee for what \c str[maxlen] (if defined) is, and + * does not access it. It is behaving like the POSIX \c strnlen() + * function, except that it returns 0 if the \p str pointer is \c + * NULL. + * + * \param[in] str The string to scan for the NULL character + * \param[in] maxlen The maximum number of bytes to scan + * \return Index of first NULL byte. Between 0 and maxlen (inclusive). + */ +CARES_EXTERN size_t ares_strnlen(const char *str, size_t maxlen); + +CARES_EXTERN size_t ares_strlen(const char *str); + +/*! Copy string from source to destination with destination buffer size + * provided. The destination is guaranteed to be null terminated, if the + * provided buffer isn't large enough, only those bytes from the source that + * will fit will be copied. + * + * \param[out] dest Destination buffer + * \param[in] src Source to copy + * \param[in] dest_size Size of destination buffer + * \return String length. Will be at most dest_size-1 + */ +CARES_EXTERN size_t ares_strcpy(char *dest, const char *src, size_t dest_size); + +CARES_EXTERN ares_bool_t ares_str_isnum(const char *str); +CARES_EXTERN ares_bool_t ares_str_isalnum(const char *str); + +CARES_EXTERN void ares_str_ltrim(char *str); +CARES_EXTERN void ares_str_rtrim(char *str); +CARES_EXTERN void ares_str_trim(char *str); +CARES_EXTERN void ares_str_lower(char *str); + +CARES_EXTERN unsigned char ares_tolower(unsigned char c); +CARES_EXTERN unsigned char *ares_memmem(const unsigned char *big, + size_t big_len, + const unsigned char *little, + size_t little_len); +CARES_EXTERN ares_bool_t ares_memeq(const unsigned char *ptr, + const unsigned char *val, size_t len); +CARES_EXTERN ares_bool_t ares_memeq_ci(const unsigned char *ptr, + const unsigned char *val, size_t len); +CARES_EXTERN ares_bool_t ares_is_hostname(const char *str); + +/*! Validate the string provided is printable. The length specified must be + * at least the size of the buffer provided. If a NULL-terminator is hit + * before the length provided is hit, this will not be considered a valid + * printable string. This does not validate that the string is actually + * NULL terminated. + * + * \param[in] str Buffer containing string to evaluate. + * \param[in] len Number of characters to evaluate within provided buffer. + * If 0, will return TRUE since it did not hit an exception. + * \return ARES_TRUE if the entire string is printable, ARES_FALSE if not. + */ +CARES_EXTERN ares_bool_t ares_str_isprint(const char *str, size_t len); + +/* We only care about ASCII rules */ +#define ares_isascii(x) (((unsigned char)x) <= 127) + +#define ares_isdigit(x) (((unsigned char)x) >= '0' && ((unsigned char)x) <= '9') + +#define ares_isxdigit(x) \ + (ares_isdigit(x) || \ + (((unsigned char)x) >= 'a' && ((unsigned char)x) <= 'f') || \ + (((unsigned char)x) >= 'A' && ((unsigned char)x) <= 'F')) + +#define ares_isupper(x) (((unsigned char)x) >= 'A' && ((unsigned char)x) <= 'Z') + +#define ares_islower(x) (((unsigned char)x) >= 'a' && ((unsigned char)x) <= 'z') + +#define ares_isalpha(x) (ares_islower(x) || ares_isupper(x)) + +#define ares_isspace(x) \ + (((unsigned char)(x)) == '\r' || ((unsigned char)(x)) == '\t' || \ + ((unsigned char)(x)) == ' ' || ((unsigned char)(x)) == '\v' || \ + ((unsigned char)(x)) == '\f' || ((unsigned char)(x)) == '\n') + +#define ares_isprint(x) \ + (((unsigned char)(x)) >= 0x20 && ((unsigned char)(x)) <= 0x7E) + +/* Character set allowed by hostnames. This is to include the normal + * domain name character set plus: + * - underscores which are used in SRV records. + * - Forward slashes such as are used for classless in-addr.arpa + * delegation (CNAMEs) + * - Asterisks may be used for wildcard domains in CNAMEs as seen in the + * real world. + * While RFC 2181 section 11 does state not to do validation, + * that applies to servers, not clients. Vulnerabilities have been + * reported when this validation is not performed. Security is more + * important than edge-case compatibility (which is probably invalid + * anyhow). + * [A-Za-z0-9-*._/] + */ +#define ares_is_hostnamech(x) \ + (ares_isalpha(x) || ares_isdigit(x) || ((unsigned char)(x)) == '-' || \ + ((unsigned char)(x)) == '.' || ((unsigned char)(x)) == '_' || \ + ((unsigned char)(x)) == '/' || ((unsigned char)(x)) == '*') + + +/*! Compare two strings (for sorting) + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \return < 0 if First String less than Second String, + * 0 if First String equal to Second String, + * > 0 if First String greater than Second String + */ +CARES_EXTERN int ares_strcmp(const char *a, const char *b); + +/*! Compare two strings up to specified length (for sorting) + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \param[in] n Length + * \return < 0 if First String less than Second String, + * 0 if First String equal to Second String, + * > 0 if First String greater than Second String + */ +CARES_EXTERN int ares_strncmp(const char *a, const char *b, size_t n); + + +/*! Compare two strings in a case-insensitive manner (for sorting) + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \return < 0 if First String less than Second String, + * 0 if First String equal to Second String, + * > 0 if First String greater than Second String + */ +CARES_EXTERN int ares_strcasecmp(const char *a, const char *b); + +/*! Compare two strings in a case-insensitive manner up to specified length + * (for sorting) + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \param[in] n Length + * \return < 0 if First String less than Second String, + * 0 if First String equal to Second String, + * > 0 if First String greater than Second String + */ +CARES_EXTERN int ares_strncasecmp(const char *a, const char *b, size_t n); + +/*! Compare two strings for equality + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \return ARES_TRUE on match, or ARES_FALSE if no match + */ +CARES_EXTERN ares_bool_t ares_streq(const char *a, const char *b); + +/*! Compare two strings for equality up to specified length + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \param[in] n Length + * \return ARES_TRUE on match, or ARES_FALSE if no match + */ +CARES_EXTERN ares_bool_t ares_streq_max(const char *a, const char *b, size_t n); + +/*! Compare two strings for equality in a case insensitive manner + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \return ARES_TRUE on match, or ARES_FALSE if no match + */ +CARES_EXTERN ares_bool_t ares_strcaseeq(const char *a, const char *b); + +/*! Compare two strings for equality up to specified length in a case + * insensitive manner + * + * Treats NULL and "" strings as equivalent + * + * \param[in] a First String + * \param[in] b Second String + * \param[in] n Length + * \return ARES_TRUE on match, or ARES_FALSE if no match + */ +CARES_EXTERN ares_bool_t ares_strcaseeq_max(const char *a, const char *b, + size_t n); + +/*! Free a C array, each element in the array will be freed by the provided + * free function. Both NULL-terminated arrays and known length arrays are + * supported. + * + * \param[in] arr Array to be freed. + * \param[in] nmembers Number of members in the array, or SIZE_MAX for + * NULL-terminated arrays + * \param[in] freefunc Function to call on each array member (e.g. ares_free) + */ +CARES_EXTERN void ares_free_array(void *arr, size_t nmembers, + void (*freefunc)(void *)); + +#endif /* __ARES_STR_H */ diff --git a/deps/cares/src/lib/inet_net_pton.c b/deps/cares/src/lib/inet_net_pton.c index 19429f205d86ab..e1f76ef834a6f9 100644 --- a/deps/cares/src/lib/inet_net_pton.c +++ b/deps/cares/src/lib/inet_net_pton.c @@ -18,7 +18,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -29,11 +29,22 @@ #include "ares_nameser.h" -#include "ares.h" #include "ares_ipv6.h" #include "ares_inet_net_pton.h" -#include "ares_private.h" +#ifdef USE_WINSOCK +# define SOCKERRNO ((int)WSAGetLastError()) +# define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) +# undef EMSGSIZE +# define EMSGSIZE WSAEMSGSIZE +# undef ENOENT +# define ENOENT WSA_INVALID_PARAMETER +# undef EAFNOSUPPORT +# define EAFNOSUPPORT WSAEAFNOSUPPORT +#else +# define SOCKERRNO (errno) +# define SET_SOCKERRNO(x) (errno = (x)) +#endif const struct ares_in6_addr ares_in6addr_any = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } }; @@ -72,17 +83,17 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, const unsigned char *odst = dst; ch = *src++; - if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && ISASCII(src[1]) && - ISXDIGIT(src[1])) { + if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && ares_isascii(src[1]) && + ares_isxdigit(src[1])) { /* Hexadecimal: Eat nybble string. */ if (!size) { goto emsgsize; } dirty = 0; src++; /* skip x or X. */ - while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) { - if (ISUPPER(ch)) { - ch = tolower(ch); + while ((ch = *src++) != '\0' && ares_isascii(ch) && ares_isxdigit(ch)) { + if (ares_isupper(ch)) { + ch = ares_tolower((unsigned char)ch); } n = (int)(strchr(xdigits, ch) - xdigits); if (dirty == 0) { @@ -104,7 +115,7 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, } *dst++ = (unsigned char)(tmp << 4); } - } else if (ISASCII(ch) && ISDIGIT(ch)) { + } else if (ares_isascii(ch) && ares_isdigit(ch)) { /* Decimal: eat dotted digit string. */ for (;;) { tmp = 0; @@ -115,7 +126,7 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, if (tmp > 255) { goto enoent; } - } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch)); + } while ((ch = *src++) != '\0' && ares_isascii(ch) && ares_isdigit(ch)); if (!size--) { goto emsgsize; } @@ -127,7 +138,7 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, goto enoent; } ch = *src++; - if (!ISASCII(ch) || !ISDIGIT(ch)) { + if (!ares_isascii(ch) || !ares_isdigit(ch)) { goto enoent; } } @@ -136,7 +147,7 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, } bits = -1; - if (ch == '/' && ISASCII(src[0]) && ISDIGIT(src[0]) && dst > odst) { + if (ch == '/' && ares_isascii(src[0]) && ares_isdigit(src[0]) && dst > odst) { /* CIDR width specifier. Nothing can follow it. */ ch = *src++; /* Skip over the /. */ bits = 0; @@ -147,7 +158,7 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, if (bits > 32) { goto enoent; } - } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch)); + } while ((ch = *src++) != '\0' && ares_isascii(ch) && ares_isdigit(ch)); if (ch != '\0') { goto enoent; } @@ -197,11 +208,11 @@ static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, return bits; enoent: - SET_ERRNO(ENOENT); + SET_SOCKERRNO(ENOENT); return -1; emsgsize: - SET_ERRNO(EMSGSIZE); + SET_SOCKERRNO(EMSGSIZE); return -1; } @@ -345,7 +356,7 @@ static int ares_inet_pton6(const char *src, unsigned char *dst) return 1; enoent: - SET_ERRNO(ENOENT); + SET_SOCKERRNO(ENOENT); return -1; } @@ -360,7 +371,7 @@ static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, char *sep; if (ares_strlen(src) >= sizeof buf) { - SET_ERRNO(EMSGSIZE); + SET_SOCKERRNO(EMSGSIZE); return -1; } ares_strcpy(buf, src, sizeof buf); @@ -379,14 +390,14 @@ static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, bits = 128; } else { if (!getbits(sep, &bits)) { - SET_ERRNO(ENOENT); + SET_SOCKERRNO(ENOENT); return -1; } } bytes = (bits + 7) / 8; if (bytes > size) { - SET_ERRNO(EMSGSIZE); + SET_SOCKERRNO(EMSGSIZE); return -1; } memcpy(dst, &in6, bytes); @@ -403,13 +414,9 @@ static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, * number of bits, either imputed classfully or specified with /CIDR, * or -1 if some failure occurred (check errno). ENOENT means it was * not a valid network specification. - * note: - * On Windows we store the error in the thread errno, not - * in the winsock error code. This is to avoid losing the - * actual last winsock error. So use macro ERRNO to fetch the - * errno this function sets when returning (-1), not SOCKERRNO. * author: * Paul Vixie (ISC), June 1996 + * */ int ares_inet_net_pton(int af, const char *src, void *dst, size_t size) { @@ -419,7 +426,6 @@ int ares_inet_net_pton(int af, const char *src, void *dst, size_t size) case AF_INET6: return ares_inet_net_pton_ipv6(src, dst, size); default: - SET_ERRNO(EAFNOSUPPORT); return -1; } } @@ -434,11 +440,11 @@ int ares_inet_pton(int af, const char *src, void *dst) } else if (af == AF_INET6) { size = sizeof(struct ares_in6_addr); } else { - SET_ERRNO(EAFNOSUPPORT); + SET_SOCKERRNO(EAFNOSUPPORT); return -1; } result = ares_inet_net_pton(af, src, dst, size); - if (result == -1 && ERRNO == ENOENT) { + if (result == -1 && SOCKERRNO == ENOENT) { return 0; } return (result > -1) ? 1 : -1; diff --git a/deps/cares/src/lib/inet_ntop.c b/deps/cares/src/lib/inet_ntop.c index 622befa99582e2..79b6c0fa9393d7 100644 --- a/deps/cares/src/lib/inet_ntop.c +++ b/deps/cares/src/lib/inet_ntop.c @@ -17,7 +17,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -27,12 +27,23 @@ #endif #include "ares_nameser.h" - -#include "ares.h" #include "ares_ipv6.h" -#include "ares_private.h" -#ifndef HAVE_INET_NTOP +#ifdef USE_WINSOCK +# define SOCKERRNO ((int)WSAGetLastError()) +# define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) +# undef EMSGSIZE +# define EMSGSIZE WSAEMSGSIZE +# undef ENOENT +# define ENOENT WSA_INVALID_PARAMETER +# undef EAFNOSUPPORT +# define EAFNOSUPPORT WSAEAFNOSUPPORT +# undef ENOSPC +# define ENOSPC WSA_INVALID_PARAMETER +#else +# define SOCKERRNO (errno) +# define SET_SOCKERRNO(x) (errno = (x)) +#endif /* * WARNING: Don't even consider trying to compile this on a system where @@ -47,11 +58,6 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); * convert a network format address to presentation format. * return: * pointer to presentation format address (`dst'), or NULL (see errno). - * note: - * On Windows we store the error in the thread errno, not - * in the winsock error code. This is to avoid losing the - * actual last winsock error. So use macro ERRNO to fetch the - * errno this function sets when returning NULL, not SOCKERRNO. * author: * Paul Vixie, 1996. */ @@ -60,14 +66,14 @@ const char *ares_inet_ntop(int af, const void *src, char *dst, { switch (af) { case AF_INET: - return (inet_ntop4(src, dst, (size_t)size)); + return inet_ntop4(src, dst, (size_t)size); case AF_INET6: - return (inet_ntop6(src, dst, (size_t)size)); + return inet_ntop6(src, dst, (size_t)size); default: - SET_ERRNO(EAFNOSUPPORT); - return (NULL); + break; } - /* NOTREACHED */ + SET_SOCKERRNO(EAFNOSUPPORT); + return NULL; } /* const char * @@ -86,13 +92,18 @@ static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size) static const char fmt[] = "%u.%u.%u.%u"; char tmp[sizeof("255.255.255.255")]; + if (size < sizeof(tmp)) { + SET_SOCKERRNO(ENOSPC); + return NULL; + } + if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >= size) { - SET_ERRNO(ENOSPC); - return (NULL); + SET_SOCKERRNO(ENOSPC); + return NULL; } ares_strcpy(dst, tmp, size); - return (dst); + return dst; } /* const char * @@ -114,11 +125,12 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) char *tp; struct { - int base, len; + ares_ssize_t base; + size_t len; } best, cur; unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; + size_t i; /* * Preprocess: @@ -136,7 +148,8 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) { - cur.base = i, cur.len = 1; + cur.base = (ares_ssize_t)i; + cur.len = 1; } else { cur.len++; } @@ -164,8 +177,9 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) tp = tmp; for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { - if (i == best.base) { + if (best.base != -1 && i >= (size_t)best.base && + i < ((size_t)best.base + best.len)) { + if (i == (size_t)best.base) { *tp++ = ':'; } continue; @@ -188,7 +202,7 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && - (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) { + ((size_t)best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) { *tp++ = ':'; } *tp++ = '\0'; @@ -197,20 +211,9 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size) * Check for overflow, copy, and we're done. */ if ((size_t)(tp - tmp) > size) { - SET_ERRNO(ENOSPC); - return (NULL); + SET_SOCKERRNO(ENOSPC); + return NULL; } ares_strcpy(dst, tmp, size); - return (dst); -} - -#else /* HAVE_INET_NTOP */ - -const char *ares_inet_ntop(int af, const void *src, char *dst, - ares_socklen_t size) -{ - /* just relay this to the underlying function */ - return inet_ntop(af, src, dst, size); + return dst; } - -#endif /* HAVE_INET_NTOP */ diff --git a/deps/cares/src/lib/ares_create_query.c b/deps/cares/src/lib/legacy/ares_create_query.c similarity index 98% rename from deps/cares/src/lib/ares_create_query.c rename to deps/cares/src/lib/legacy/ares_create_query.c index a2f2caac6e95d9..f71a71c95136c4 100644 --- a/deps/cares/src/lib/ares_create_query.c +++ b/deps/cares/src/lib/legacy/ares_create_query.c @@ -24,8 +24,6 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" static int ares_create_query_int(const char *name, int dnsclass, int type, diff --git a/deps/cares/src/lib/legacy/ares_expand_name.c b/deps/cares/src/lib/legacy/ares_expand_name.c new file mode 100644 index 00000000000000..72668f4cb60a07 --- /dev/null +++ b/deps/cares/src/lib/legacy/ares_expand_name.c @@ -0,0 +1,99 @@ +/* MIT License + * + * Copyright (c) 1998, 2011 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif + +#include "ares_nameser.h" + +ares_status_t ares_expand_name_validated(const unsigned char *encoded, + const unsigned char *abuf, size_t alen, + char **s, size_t *enclen, + ares_bool_t is_hostname) +{ + ares_status_t status; + ares_buf_t *buf = NULL; + size_t start_len; + + if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) { + return ARES_EBADNAME; /* EFORMERR would be better */ + } + + if (encoded < abuf || encoded >= abuf + alen) { + return ARES_EBADNAME; /* EFORMERR would be better */ + } + + *enclen = 0; + + /* NOTE: we allow 's' to be NULL to skip it */ + if (s) { + *s = NULL; + } + + buf = ares_buf_create_const(abuf, alen); + + if (buf == NULL) { + return ARES_ENOMEM; + } + + status = ares_buf_set_position(buf, (size_t)(encoded - abuf)); + if (status != ARES_SUCCESS) { + goto done; + } + + start_len = ares_buf_len(buf); + status = ares_dns_name_parse(buf, s, is_hostname); + if (status != ARES_SUCCESS) { + goto done; + } + + *enclen = start_len - ares_buf_len(buf); + +done: + ares_buf_destroy(buf); + return status; +} + +int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, + int alen, char **s, long *enclen) +{ + /* Keep public API compatible */ + size_t enclen_temp = 0; + ares_status_t status; + + if (encoded == NULL || abuf == NULL || alen <= 0 || enclen == NULL) { + return ARES_EBADNAME; + } + + status = ares_expand_name_validated(encoded, abuf, (size_t)alen, s, + &enclen_temp, ARES_FALSE); + *enclen = (long)enclen_temp; + return (int)status; +} diff --git a/deps/cares/src/lib/ares_expand_string.c b/deps/cares/src/lib/legacy/ares_expand_string.c similarity index 87% rename from deps/cares/src/lib/ares_expand_string.c rename to deps/cares/src/lib/legacy/ares_expand_string.c index be7034e2719df1..e1deb1932f43b4 100644 --- a/deps/cares/src/lib/ares_expand_string.c +++ b/deps/cares/src/lib/legacy/ares_expand_string.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -33,9 +33,6 @@ #include "ares_nameser.h" -#include "ares.h" -#include "ares_private.h" /* for the memdebug */ - /* Simply decodes a length-encoded character string. The first byte of the * input is the length of the string to be returned and the bytes thereafter * are the characters of the string. The returned result will be NULL @@ -46,7 +43,7 @@ ares_status_t ares_expand_string_ex(const unsigned char *encoded, unsigned char **s, size_t *enclen) { ares_status_t status; - ares__buf_t *buf = NULL; + ares_buf_t *buf = NULL; size_t start_len; size_t len = 0; @@ -65,29 +62,28 @@ ares_status_t ares_expand_string_ex(const unsigned char *encoded, *s = NULL; } - buf = ares__buf_create_const(abuf, alen); + buf = ares_buf_create_const(abuf, alen); if (buf == NULL) { return ARES_ENOMEM; } - status = ares__buf_set_position(buf, (size_t)(encoded - abuf)); + status = ares_buf_set_position(buf, (size_t)(encoded - abuf)); if (status != ARES_SUCCESS) { goto done; } - start_len = ares__buf_len(buf); - status = - ares__buf_parse_dns_binstr(buf, ares__buf_len(buf), s, &len, ARES_FALSE); + start_len = ares_buf_len(buf); + status = ares_buf_parse_dns_binstr(buf, ares_buf_len(buf), s, &len); /* hrm, no way to pass back 'len' with the prototype */ if (status != ARES_SUCCESS) { goto done; } - *enclen = start_len - ares__buf_len(buf); + *enclen = start_len - ares_buf_len(buf); done: - ares__buf_destroy(buf); + ares_buf_destroy(buf); if (status == ARES_EBADNAME || status == ARES_EBADRESP) { status = ARES_EBADSTR; } @@ -100,7 +96,7 @@ int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf, ares_status_t status; size_t temp_enclen = 0; - if (alen < 0) { + if (encoded == NULL || abuf == NULL || alen <= 0 || enclen == NULL) { return ARES_EBADRESP; } diff --git a/deps/cares/src/lib/legacy/ares_fds.c b/deps/cares/src/lib/legacy/ares_fds.c new file mode 100644 index 00000000000000..112ebac60ad0a7 --- /dev/null +++ b/deps/cares/src/lib/legacy/ares_fds.c @@ -0,0 +1,80 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +int ares_fds(const ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds) +{ + ares_socket_t nfds; + ares_slist_node_t *snode; + /* Are there any active queries? */ + size_t active_queries; + + if (channel == NULL || read_fds == NULL || write_fds == NULL) { + return 0; + } + + ares_channel_lock(channel); + + active_queries = ares_llist_len(channel->all_queries); + + nfds = 0; + for (snode = ares_slist_node_first(channel->servers); snode != NULL; + snode = ares_slist_node_next(snode)) { + ares_server_t *server = ares_slist_node_val(snode); + ares_llist_node_t *node; + + for (node = ares_llist_node_first(server->connections); node != NULL; + node = ares_llist_node_next(node)) { + const ares_conn_t *conn = ares_llist_node_val(node); + + if (!active_queries && !(conn->flags & ARES_CONN_FLAG_TCP)) { + continue; + } + + /* Silence coverity, shouldn't be possible */ + if (conn->fd == ARES_SOCKET_BAD) { + continue; + } + + /* Always wait on read */ + FD_SET(conn->fd, read_fds); + + if (conn->fd >= nfds) { + nfds = conn->fd + 1; + } + + /* TCP only wait on write if we have the flag set */ + if (conn->state_flags & ARES_CONN_STATE_WRITE) { + FD_SET(conn->fd, write_fds); + } + } + } + + ares_channel_unlock(channel); + return (int)nfds; +} diff --git a/deps/cares/src/lib/legacy/ares_getsock.c b/deps/cares/src/lib/legacy/ares_getsock.c new file mode 100644 index 00000000000000..cec9258abb095a --- /dev/null +++ b/deps/cares/src/lib/legacy/ares_getsock.c @@ -0,0 +1,85 @@ +/* MIT License + * + * Copyright (c) 2005 Daniel Stenberg + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +int ares_getsock(const ares_channel_t *channel, ares_socket_t *socks, + int numsocks) /* size of the 'socks' array */ +{ + ares_slist_node_t *snode; + size_t sockindex = 0; + unsigned int bitmap = 0; + unsigned int setbits = 0xffffffff; + + /* Are there any active queries? */ + size_t active_queries; + + if (channel == NULL || numsocks <= 0) { + return 0; + } + + ares_channel_lock(channel); + + active_queries = ares_llist_len(channel->all_queries); + + for (snode = ares_slist_node_first(channel->servers); snode != NULL; + snode = ares_slist_node_next(snode)) { + ares_server_t *server = ares_slist_node_val(snode); + ares_llist_node_t *node; + + for (node = ares_llist_node_first(server->connections); node != NULL; + node = ares_llist_node_next(node)) { + const ares_conn_t *conn = ares_llist_node_val(node); + + if (sockindex >= (size_t)numsocks || sockindex >= ARES_GETSOCK_MAXNUM) { + break; + } + + /* We only need to register interest in UDP sockets if we have + * outstanding queries. + */ + if (!active_queries && !(conn->flags & ARES_CONN_FLAG_TCP)) { + continue; + } + + socks[sockindex] = conn->fd; + + if (active_queries || conn->flags & ARES_CONN_FLAG_TCP) { + bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); + } + + if (conn->state_flags & ARES_CONN_STATE_WRITE) { + /* then the tcp socket is also writable! */ + bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); + } + + sockindex++; + } + } + + ares_channel_unlock(channel); + return (int)bitmap; +} diff --git a/deps/cares/src/lib/ares_parse_a_reply.c b/deps/cares/src/lib/legacy/ares_parse_a_reply.c similarity index 86% rename from deps/cares/src/lib/ares_parse_a_reply.c rename to deps/cares/src/lib/legacy/ares_parse_a_reply.c index da841f0da9af36..9fd4a07ac0fccc 100644 --- a/deps/cares/src/lib/ares_parse_a_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_a_reply.c @@ -25,7 +25,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -37,8 +37,6 @@ # include <arpa/inet.h> #endif -#include "ares_nameser.h" - #ifdef HAVE_STRINGS_H # include <strings.h> #endif @@ -47,10 +45,6 @@ # include <limits.h> #endif -#include "ares.h" -#include "ares_dns.h" -#include "ares_private.h" - int ares_parse_a_reply(const unsigned char *abuf, int alen, struct hostent **host, struct ares_addrttl *addrttls, int *naddrttls) @@ -77,29 +71,30 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen, goto fail; } - status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai); + status = ares_parse_into_addrinfo(dnsrec, 0, 0, &ai); if (status != ARES_SUCCESS && status != ARES_ENODATA) { goto fail; } if (host != NULL) { - status = ares__addrinfo2hostent(&ai, AF_INET, host); + *host = NULL; + status = ares_addrinfo2hostent(&ai, AF_INET, host); if (status != ARES_SUCCESS && status != ARES_ENODATA) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: DefensiveCoding */ } } if (addrttls != NULL && req_naddrttls) { size_t temp_naddrttls = 0; - ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, NULL, - &temp_naddrttls); + ares_addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, NULL, + &temp_naddrttls); *naddrttls = (int)temp_naddrttls; } fail: - ares__freeaddrinfo_cnames(ai.cnames); - ares__freeaddrinfo_nodes(ai.nodes); + ares_freeaddrinfo_cnames(ai.cnames); + ares_freeaddrinfo_nodes(ai.nodes); ares_free(ai.name); ares_free(question_hostname); ares_dns_record_destroy(dnsrec); diff --git a/deps/cares/src/lib/ares_parse_aaaa_reply.c b/deps/cares/src/lib/legacy/ares_parse_aaaa_reply.c similarity index 86% rename from deps/cares/src/lib/ares_parse_aaaa_reply.c rename to deps/cares/src/lib/legacy/ares_parse_aaaa_reply.c index b3eba166be6ad6..4c177ec9cbbe55 100644 --- a/deps/cares/src/lib/ares_parse_aaaa_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_aaaa_reply.c @@ -26,7 +26,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -38,8 +38,6 @@ # include <arpa/inet.h> #endif -#include "ares_nameser.h" - #ifdef HAVE_STRINGS_H # include <strings.h> #endif @@ -48,10 +46,7 @@ # include <limits.h> #endif -#include "ares.h" -#include "ares_dns.h" #include "ares_inet_net_pton.h" -#include "ares_private.h" int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, struct hostent **host, struct ares_addr6ttl *addrttls, @@ -79,28 +74,29 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, goto fail; } - status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai); + status = ares_parse_into_addrinfo(dnsrec, 0, 0, &ai); if (status != ARES_SUCCESS && status != ARES_ENODATA) { goto fail; } if (host != NULL) { - status = ares__addrinfo2hostent(&ai, AF_INET6, host); + *host = NULL; + status = ares_addrinfo2hostent(&ai, AF_INET6, host); if (status != ARES_SUCCESS && status != ARES_ENODATA) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: DefensiveCoding */ } } if (addrttls != NULL && req_naddrttls) { size_t temp_naddrttls = 0; - ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, addrttls, - &temp_naddrttls); + ares_addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, addrttls, + &temp_naddrttls); *naddrttls = (int)temp_naddrttls; } fail: - ares__freeaddrinfo_cnames(ai.cnames); - ares__freeaddrinfo_nodes(ai.nodes); + ares_freeaddrinfo_cnames(ai.cnames); + ares_freeaddrinfo_nodes(ai.nodes); ares_free(question_hostname); ares_free(ai.name); ares_dns_record_destroy(dnsrec); diff --git a/deps/cares/src/lib/ares_parse_caa_reply.c b/deps/cares/src/lib/legacy/ares_parse_caa_reply.c similarity index 85% rename from deps/cares/src/lib/ares_parse_caa_reply.c rename to deps/cares/src/lib/legacy/ares_parse_caa_reply.c index 6c30305ee18935..f74358f4566965 100644 --- a/deps/cares/src/lib/ares_parse_caa_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_caa_reply.c @@ -24,10 +24,8 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, struct ares_caa_reply **caa_out) @@ -66,8 +64,8 @@ int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* XXX: Why do we allow Chaos class? */ @@ -84,8 +82,8 @@ int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, /* Allocate storage for this CAA answer appending it to the list */ caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY); if (caa_curr == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Link in the record */ @@ -100,8 +98,8 @@ int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, caa_curr->property = (unsigned char *)ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_CAA_TAG)); if (caa_curr->property == NULL) { - status = ARES_ENOMEM; - break; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + break; /* LCOV_EXCL_LINE: OutOfMemory */ } /* RFC6844 says this can only be ascii, so not sure why we're recording a * length */ @@ -109,15 +107,15 @@ int ares_parse_caa_reply(const unsigned char *abuf, int alen_int, ptr = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &ptr_len); if (ptr == NULL) { - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* Wants NULL termination for some reason */ caa_curr->value = ares_malloc(ptr_len + 1); if (caa_curr->value == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } memcpy(caa_curr->value, ptr, ptr_len); caa_curr->value[ptr_len] = 0; diff --git a/deps/cares/src/lib/ares_parse_mx_reply.c b/deps/cares/src/lib/legacy/ares_parse_mx_reply.c similarity index 88% rename from deps/cares/src/lib/ares_parse_mx_reply.c rename to deps/cares/src/lib/legacy/ares_parse_mx_reply.c index db7155d2e8fe4b..480074f670c665 100644 --- a/deps/cares/src/lib/ares_parse_mx_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_mx_reply.c @@ -24,10 +24,8 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_mx_reply(const unsigned char *abuf, int alen_int, struct ares_mx_reply **mx_out) @@ -64,8 +62,8 @@ int ares_parse_mx_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -76,8 +74,8 @@ int ares_parse_mx_reply(const unsigned char *abuf, int alen_int, /* Allocate storage for this MX answer appending it to the list */ mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY); if (mx_curr == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Link in the record */ @@ -92,8 +90,8 @@ int ares_parse_mx_reply(const unsigned char *abuf, int alen_int, mx_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_MX_EXCHANGE)); if (mx_curr->host == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } diff --git a/deps/cares/src/lib/ares_parse_naptr_reply.c b/deps/cares/src/lib/legacy/ares_parse_naptr_reply.c similarity index 83% rename from deps/cares/src/lib/ares_parse_naptr_reply.c rename to deps/cares/src/lib/legacy/ares_parse_naptr_reply.c index 1a304ccdd3a12d..c00ce710666ab9 100644 --- a/deps/cares/src/lib/ares_parse_naptr_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_naptr_reply.c @@ -23,10 +23,8 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int, struct ares_naptr_reply **naptr_out) @@ -63,8 +61,8 @@ int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -75,8 +73,8 @@ int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int, /* Allocate storage for this NAPTR answer appending it to the list */ naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY); if (naptr_curr == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Link in the record */ @@ -94,28 +92,28 @@ int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int, naptr_curr->flags = (unsigned char *)ares_strdup( ares_dns_rr_get_str(rr, ARES_RR_NAPTR_FLAGS)); if (naptr_curr->flags == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* XXX: Why is this unsigned char * ? */ naptr_curr->service = (unsigned char *)ares_strdup( ares_dns_rr_get_str(rr, ARES_RR_NAPTR_SERVICES)); if (naptr_curr->service == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* XXX: Why is this unsigned char * ? */ naptr_curr->regexp = (unsigned char *)ares_strdup( ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REGEXP)); if (naptr_curr->regexp == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } naptr_curr->replacement = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REPLACEMENT)); if (naptr_curr->replacement == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } diff --git a/deps/cares/src/lib/ares_parse_ns_reply.c b/deps/cares/src/lib/legacy/ares_parse_ns_reply.c similarity index 82% rename from deps/cares/src/lib/ares_parse_ns_reply.c rename to deps/cares/src/lib/legacy/ares_parse_ns_reply.c index 18fda82f412174..fc9ab9219d399c 100644 --- a/deps/cares/src/lib/ares_parse_ns_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_ns_reply.c @@ -24,7 +24,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -36,9 +36,6 @@ # include <arpa/inet.h> #endif -#include "ares.h" -#include "ares_private.h" - int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, struct hostent **host) { @@ -73,16 +70,16 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, /* Response structure */ hostent = ares_malloc(sizeof(*hostent)); if (hostent == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } memset(hostent, 0, sizeof(*hostent)); hostent->h_addr_list = ares_malloc(sizeof(*hostent->h_addr_list)); if (hostent->h_addr_list == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } hostent->h_addr_list[0] = NULL; hostent->h_addrtype = AF_INET; @@ -91,19 +88,19 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, /* Fill in hostname */ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL); if (status != ARES_SUCCESS) { - goto done; + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } hostent->h_name = ares_strdup(hostname); if (hostent->h_name == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Preallocate the maximum number + 1 */ hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases)); if (hostent->h_aliases == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases)); @@ -113,8 +110,8 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -124,8 +121,8 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, hostname = ares_dns_rr_get_str(rr, ARES_RR_NS_NSDNAME); if (hostname == NULL) { - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } hostent->h_aliases[nscount] = ares_strdup(hostname); diff --git a/deps/cares/src/lib/ares_parse_ptr_reply.c b/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c similarity index 90% rename from deps/cares/src/lib/ares_parse_ptr_reply.c rename to deps/cares/src/lib/legacy/ares_parse_ptr_reply.c index 6ee20f722e3d01..0e52f9db09bbc7 100644 --- a/deps/cares/src/lib/ares_parse_ptr_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c @@ -24,7 +24,7 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" +#include "ares_private.h" #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> @@ -33,8 +33,6 @@ # include <netdb.h> #endif -#include "ares.h" -#include "ares_private.h" ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, const void *addr, int addrlen, @@ -105,8 +103,8 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) { @@ -117,8 +115,8 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_CNAME) { ptrname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME); if (ptrname == NULL) { - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } } @@ -137,7 +135,7 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, * status = ARES_EBADRESP; * goto done; * } - * if (strcasecmp(ptrname, rname) != 0) { + * if (!ares_strcaseeq(ptrname, rname)) { * continue; * } */ @@ -145,8 +143,8 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, /* Save most recent PTR record as the hostname */ hostname = ares_dns_rr_get_str(rr, ARES_RR_PTR_DNAME); if (hostname == NULL) { - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* Append as an alias */ @@ -168,8 +166,8 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, /* Fill in hostname */ hostent->h_name = ares_strdup(hostname); if (hostent->h_name == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } done: diff --git a/deps/cares/src/lib/ares_parse_soa_reply.c b/deps/cares/src/lib/legacy/ares_parse_soa_reply.c similarity index 86% rename from deps/cares/src/lib/ares_parse_soa_reply.c rename to deps/cares/src/lib/legacy/ares_parse_soa_reply.c index 2777dbcb0bbe11..46b40dedc4d3e2 100644 --- a/deps/cares/src/lib/ares_parse_soa_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_soa_reply.c @@ -24,10 +24,8 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_soa_reply(const unsigned char *abuf, int alen_int, struct ares_soa_reply **soa_out) @@ -62,8 +60,8 @@ int ares_parse_soa_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -74,8 +72,8 @@ int ares_parse_soa_reply(const unsigned char *abuf, int alen_int, /* allocate result struct */ soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY); if (soa == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } soa->serial = ares_dns_rr_get_u32(rr, ARES_RR_SOA_SERIAL); @@ -85,13 +83,13 @@ int ares_parse_soa_reply(const unsigned char *abuf, int alen_int, soa->minttl = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM); soa->nsname = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_MNAME)); if (soa->nsname == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } soa->hostmaster = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_RNAME)); if (soa->hostmaster == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } break; } diff --git a/deps/cares/src/lib/ares_parse_srv_reply.c b/deps/cares/src/lib/legacy/ares_parse_srv_reply.c similarity index 89% rename from deps/cares/src/lib/ares_parse_srv_reply.c rename to deps/cares/src/lib/legacy/ares_parse_srv_reply.c index f27bcce7330eb0..3f9fd95ebf684a 100644 --- a/deps/cares/src/lib/ares_parse_srv_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_srv_reply.c @@ -24,10 +24,8 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_srv_reply(const unsigned char *abuf, int alen_int, struct ares_srv_reply **srv_out) @@ -64,8 +62,8 @@ int ares_parse_srv_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -76,8 +74,8 @@ int ares_parse_srv_reply(const unsigned char *abuf, int alen_int, /* Allocate storage for this SRV answer appending it to the list */ srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY); if (srv_curr == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Link in the record */ @@ -96,8 +94,8 @@ int ares_parse_srv_reply(const unsigned char *abuf, int alen_int, srv_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SRV_TARGET)); if (srv_curr->host == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } } diff --git a/deps/cares/src/lib/legacy/ares_parse_txt_reply.c b/deps/cares/src/lib/legacy/ares_parse_txt_reply.c new file mode 100644 index 00000000000000..d276f6ab390753 --- /dev/null +++ b/deps/cares/src/lib/legacy/ares_parse_txt_reply.c @@ -0,0 +1,144 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" +#include "ares_data.h" + +static int ares_parse_txt_reply_int(const unsigned char *abuf, size_t alen, + ares_bool_t ex, void **txt_out) +{ + ares_status_t status; + struct ares_txt_ext *txt_head = NULL; + struct ares_txt_ext *txt_last = NULL; + struct ares_txt_ext *txt_curr; + ares_dns_record_t *dnsrec = NULL; + size_t i; + + *txt_out = NULL; + + status = ares_dns_parse(abuf, alen, 0, &dnsrec); + if (status != ARES_SUCCESS) { + goto done; + } + + if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) { + status = ARES_ENODATA; + goto done; + } + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i); + size_t j; + size_t cnt; + + + if (rr == NULL) { + /* Shouldn't be possible */ + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* XXX: Why Chaos? */ + if ((ares_dns_rr_get_class(rr) != ARES_CLASS_IN && + ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) || + ares_dns_rr_get_type(rr) != ARES_REC_TYPE_TXT) { + continue; + } + + cnt = ares_dns_rr_get_abin_cnt(rr, ARES_RR_TXT_DATA); + + for (j = 0; j < cnt; j++) { + const unsigned char *ptr; + size_t ptr_len; + + /* Allocate storage for this TXT answer appending it to the list */ + txt_curr = + ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : ARES_DATATYPE_TXT_REPLY); + if (txt_curr == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Link in the record */ + if (txt_last) { + txt_last->next = txt_curr; + } else { + txt_head = txt_curr; + } + txt_last = txt_curr; + + /* Tag start on first for each TXT record */ + if (ex && j == 0) { + txt_curr->record_start = 1; + } + + ptr = ares_dns_rr_get_abin(rr, ARES_RR_TXT_DATA, j, &ptr_len); + + txt_curr->txt = ares_malloc(ptr_len + 1); + if (txt_curr->txt == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + memcpy(txt_curr->txt, ptr, ptr_len); + txt_curr->txt[ptr_len] = 0; + txt_curr->length = ptr_len; + } + } + +done: + /* clean up on error */ + if (status != ARES_SUCCESS) { + if (txt_head) { + ares_free_data(txt_head); + } + } else { + /* everything looks fine, return the data */ + *txt_out = txt_head; + } + ares_dns_record_destroy(dnsrec); + return (int)status; +} + +int ares_parse_txt_reply(const unsigned char *abuf, int alen, + struct ares_txt_reply **txt_out) +{ + if (alen < 0) { + return ARES_EBADRESP; + } + return ares_parse_txt_reply_int(abuf, (size_t)alen, ARES_FALSE, + (void **)txt_out); +} + +int ares_parse_txt_reply_ext(const unsigned char *abuf, int alen, + struct ares_txt_ext **txt_out) +{ + if (alen < 0) { + return ARES_EBADRESP; + } + return ares_parse_txt_reply_int(abuf, (size_t)alen, ARES_TRUE, + (void **)txt_out); +} diff --git a/deps/cares/src/lib/ares_parse_uri_reply.c b/deps/cares/src/lib/legacy/ares_parse_uri_reply.c similarity index 92% rename from deps/cares/src/lib/ares_parse_uri_reply.c rename to deps/cares/src/lib/legacy/ares_parse_uri_reply.c index bff7023f78a29a..317e204d5d80d1 100644 --- a/deps/cares/src/lib/ares_parse_uri_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_uri_reply.c @@ -24,10 +24,8 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" -#include "ares_data.h" #include "ares_private.h" +#include "ares_data.h" int ares_parse_uri_reply(const unsigned char *abuf, int alen_int, struct ares_uri_reply **uri_out) @@ -64,8 +62,8 @@ int ares_parse_uri_reply(const unsigned char *abuf, int alen_int, if (rr == NULL) { /* Shouldn't be possible */ - status = ARES_EBADRESP; - goto done; + status = ARES_EBADRESP; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ } if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN || @@ -76,8 +74,8 @@ int ares_parse_uri_reply(const unsigned char *abuf, int alen_int, /* Allocate storage for this URI answer appending it to the list */ uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY); if (uri_curr == NULL) { - status = ARES_ENOMEM; - goto done; + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } /* Link in the record */ diff --git a/deps/cares/src/lib/ares_dns_mapping.c b/deps/cares/src/lib/record/ares_dns_mapping.c similarity index 87% rename from deps/cares/src/lib/ares_dns_mapping.c rename to deps/cares/src/lib/record/ares_dns_mapping.c index 2b463fe83128a7..5a3ec28abf130b 100644 --- a/deps/cares/src/lib/ares_dns_mapping.c +++ b/deps/cares/src/lib/record/ares_dns_mapping.c @@ -23,8 +23,6 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode) @@ -93,6 +91,7 @@ ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, case ARES_REC_TYPE_HINFO: case ARES_REC_TYPE_MX: case ARES_REC_TYPE_TXT: + case ARES_REC_TYPE_SIG: case ARES_REC_TYPE_AAAA: case ARES_REC_TYPE_SRV: case ARES_REC_TYPE_NAPTR: @@ -112,7 +111,7 @@ ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, return is_query ? ARES_TRUE : ARES_FALSE; } -ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type) +ares_bool_t ares_dns_rec_allow_name_comp(ares_dns_rec_type_t type) { /* Only record types defined in RFC1035 allow name compression within the * RDATA. Otherwise nameservers that don't understand an RR may not be @@ -133,9 +132,18 @@ ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type) return ARES_FALSE; } -ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, - ares_bool_t is_query) +ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, + ares_dns_rec_type_t type, + ares_bool_t is_query) { + /* If we don't understand the record type, we shouldn't validate the class + * as there are some instances like on RFC 2391 (SIG RR) the class is + * meaningless, but since we didn't support that record type, we didn't + * know it shouldn't be validated */ + if (type == ARES_REC_TYPE_RAW_RR) { + return ARES_TRUE; + } + switch (qclass) { case ARES_CLASS_IN: case ARES_CLASS_CHAOS: @@ -143,7 +151,13 @@ ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, case ARES_CLASS_NONE: return ARES_TRUE; case ARES_CLASS_ANY: - return is_query ? ARES_TRUE : ARES_FALSE; + if (type == ARES_REC_TYPE_SIG) { + return ARES_TRUE; + } + if (is_query) { + return ARES_TRUE; + } + return ARES_FALSE; } return ARES_FALSE; } @@ -191,6 +205,8 @@ const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type) return "MX"; case ARES_REC_TYPE_TXT: return "TXT"; + case ARES_REC_TYPE_SIG: + return "SIG"; case ARES_REC_TYPE_AAAA: return "AAAA"; case ARES_REC_TYPE_SRV: @@ -305,6 +321,33 @@ const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key) case ARES_RR_TXT_DATA: return "DATA"; + case ARES_RR_SIG_TYPE_COVERED: + return "TYPE_COVERED"; + + case ARES_RR_SIG_ALGORITHM: + return "ALGORITHM"; + + case ARES_RR_SIG_LABELS: + return "LABELS"; + + case ARES_RR_SIG_ORIGINAL_TTL: + return "ORIGINAL_TTL"; + + case ARES_RR_SIG_EXPIRATION: + return "EXPIRATION"; + + case ARES_RR_SIG_INCEPTION: + return "INCEPTION"; + + case ARES_RR_SIG_KEY_TAG: + return "KEY_TAG"; + + case ARES_RR_SIG_SIGNERS_NAME: + return "SIGNERS_NAME"; + + case ARES_RR_SIG_SIGNATURE: + return "SIGNATURE"; + case ARES_RR_SRV_PRIORITY: return "PRIORITY"; @@ -420,6 +463,7 @@ ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) case ARES_RR_SOA_RNAME: case ARES_RR_PTR_DNAME: case ARES_RR_MX_EXCHANGE: + case ARES_RR_SIG_SIGNERS_NAME: case ARES_RR_SRV_TARGET: case ARES_RR_SVCB_TARGET: case ARES_RR_HTTPS_TARGET: @@ -440,9 +484,14 @@ ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) case ARES_RR_SOA_RETRY: case ARES_RR_SOA_EXPIRE: case ARES_RR_SOA_MINIMUM: + case ARES_RR_SIG_ORIGINAL_TTL: + case ARES_RR_SIG_EXPIRATION: + case ARES_RR_SIG_INCEPTION: return ARES_DATATYPE_U32; case ARES_RR_MX_PREFERENCE: + case ARES_RR_SIG_TYPE_COVERED: + case ARES_RR_SIG_KEY_TAG: case ARES_RR_SRV_PRIORITY: case ARES_RR_SRV_WEIGHT: case ARES_RR_SRV_PORT: @@ -457,6 +506,8 @@ ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) case ARES_RR_RAW_RR_TYPE: return ARES_DATATYPE_U16; + case ARES_RR_SIG_ALGORITHM: + case ARES_RR_SIG_LABELS: case ARES_RR_OPT_VERSION: case ARES_RR_TLSA_CERT_USAGE: case ARES_RR_TLSA_SELECTOR: @@ -465,9 +516,12 @@ ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key) return ARES_DATATYPE_U8; case ARES_RR_CAA_VALUE: - case ARES_RR_TXT_DATA: return ARES_DATATYPE_BINP; + case ARES_RR_TXT_DATA: + return ARES_DATATYPE_ABINP; + + case ARES_RR_SIG_SIGNATURE: case ARES_RR_TLSA_DATA: case ARES_RR_RAW_RR_DATA: return ARES_DATATYPE_BIN; @@ -494,9 +548,14 @@ static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU, ARES_RR_HINFO_OS }; static const ares_dns_rr_key_t rr_mx_keys[] = { ARES_RR_MX_PREFERENCE, ARES_RR_MX_EXCHANGE }; -static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA }; -static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR }; -static const ares_dns_rr_key_t rr_srv_keys[] = { +static const ares_dns_rr_key_t rr_sig_keys[] = { + ARES_RR_SIG_TYPE_COVERED, ARES_RR_SIG_ALGORITHM, ARES_RR_SIG_LABELS, + ARES_RR_SIG_ORIGINAL_TTL, ARES_RR_SIG_EXPIRATION, ARES_RR_SIG_INCEPTION, + ARES_RR_SIG_KEY_TAG, ARES_RR_SIG_SIGNERS_NAME, ARES_RR_SIG_SIGNATURE +}; +static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA }; +static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR }; +static const ares_dns_rr_key_t rr_srv_keys[] = { ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET }; static const ares_dns_rr_key_t rr_naptr_keys[] = { @@ -560,6 +619,9 @@ const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type, case ARES_REC_TYPE_TXT: *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys); return rr_txt_keys; + case ARES_REC_TYPE_SIG: + *cnt = sizeof(rr_sig_keys) / sizeof(*rr_sig_keys); + return rr_sig_keys; case ARES_REC_TYPE_AAAA: *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys); return rr_aaaa_keys; @@ -606,12 +668,12 @@ ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str) const char *name; ares_dns_class_t qclass; } list[] = { - {"IN", ARES_CLASS_IN }, - { "CH", ARES_CLASS_CHAOS }, - { "HS", ARES_CLASS_HESOID}, - { "NONE", ARES_CLASS_NONE }, - { "ANY", ARES_CLASS_ANY }, - { NULL, 0 } + { "IN", ARES_CLASS_IN }, + { "CH", ARES_CLASS_CHAOS }, + { "HS", ARES_CLASS_HESOID }, + { "NONE", ARES_CLASS_NONE }, + { "ANY", ARES_CLASS_ANY }, + { NULL, 0 } }; if (qclass == NULL || str == NULL) { @@ -619,7 +681,7 @@ ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str) } for (i = 0; list[i].name != NULL; i++) { - if (strcasecmp(list[i].name, str) == 0) { + if (ares_strcaseeq(list[i].name, str)) { *qclass = list[i].qclass; return ARES_TRUE; } @@ -636,26 +698,27 @@ ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, const char *name; ares_dns_rec_type_t type; } list[] = { - {"A", ARES_REC_TYPE_A }, - { "NS", ARES_REC_TYPE_NS }, - { "CNAME", ARES_REC_TYPE_CNAME }, - { "SOA", ARES_REC_TYPE_SOA }, - { "PTR", ARES_REC_TYPE_PTR }, - { "HINFO", ARES_REC_TYPE_HINFO }, - { "MX", ARES_REC_TYPE_MX }, - { "TXT", ARES_REC_TYPE_TXT }, - { "AAAA", ARES_REC_TYPE_AAAA }, - { "SRV", ARES_REC_TYPE_SRV }, - { "NAPTR", ARES_REC_TYPE_NAPTR }, - { "OPT", ARES_REC_TYPE_OPT }, - { "TLSA", ARES_REC_TYPE_TLSA }, - { "SVCB", ARES_REC_TYPE_SVCB }, - { "HTTPS", ARES_REC_TYPE_HTTPS }, - { "ANY", ARES_REC_TYPE_ANY }, - { "URI", ARES_REC_TYPE_URI }, - { "CAA", ARES_REC_TYPE_CAA }, - { "RAW_RR", ARES_REC_TYPE_RAW_RR}, - { NULL, 0 } + { "A", ARES_REC_TYPE_A }, + { "NS", ARES_REC_TYPE_NS }, + { "CNAME", ARES_REC_TYPE_CNAME }, + { "SOA", ARES_REC_TYPE_SOA }, + { "PTR", ARES_REC_TYPE_PTR }, + { "HINFO", ARES_REC_TYPE_HINFO }, + { "MX", ARES_REC_TYPE_MX }, + { "TXT", ARES_REC_TYPE_TXT }, + { "SIG", ARES_REC_TYPE_SIG }, + { "AAAA", ARES_REC_TYPE_AAAA }, + { "SRV", ARES_REC_TYPE_SRV }, + { "NAPTR", ARES_REC_TYPE_NAPTR }, + { "OPT", ARES_REC_TYPE_OPT }, + { "TLSA", ARES_REC_TYPE_TLSA }, + { "SVCB", ARES_REC_TYPE_SVCB }, + { "HTTPS", ARES_REC_TYPE_HTTPS }, + { "ANY", ARES_REC_TYPE_ANY }, + { "URI", ARES_REC_TYPE_URI }, + { "CAA", ARES_REC_TYPE_CAA }, + { "RAW_RR", ARES_REC_TYPE_RAW_RR }, + { NULL, 0 } }; if (qtype == NULL || str == NULL) { @@ -663,7 +726,7 @@ ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype, } for (i = 0; list[i].name != NULL; i++) { - if (strcasecmp(list[i].name, str) == 0) { + if (ares_strcaseeq(list[i].name, str)) { *qtype = list[i].type; return ARES_TRUE; } diff --git a/deps/cares/src/lib/record/ares_dns_multistring.c b/deps/cares/src/lib/record/ares_dns_multistring.c new file mode 100644 index 00000000000000..44fcaccd65bb6a --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_multistring.c @@ -0,0 +1,307 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_dns_private.h" + +typedef struct { + unsigned char *data; + size_t len; +} multistring_data_t; + +struct ares_dns_multistring { + /*! whether or not cached concatenated string is valid */ + ares_bool_t cache_invalidated; + /*! combined/concatenated string cache */ + unsigned char *cache_str; + /*! length of combined/concatenated string */ + size_t cache_str_len; + /*! Data making up strings */ + ares_array_t *strs; /*!< multistring_data_t type */ +}; + +static void ares_dns_multistring_free_cb(void *arg) +{ + multistring_data_t *data = arg; + if (data == NULL) { + return; + } + ares_free(data->data); +} + +ares_dns_multistring_t *ares_dns_multistring_create(void) +{ + ares_dns_multistring_t *strs = ares_malloc_zero(sizeof(*strs)); + if (strs == NULL) { + return NULL; + } + + strs->strs = + ares_array_create(sizeof(multistring_data_t), ares_dns_multistring_free_cb); + if (strs->strs == NULL) { + ares_free(strs); + return NULL; + } + + return strs; +} + +void ares_dns_multistring_clear(ares_dns_multistring_t *strs) +{ + if (strs == NULL) { + return; + } + + while (ares_array_len(strs->strs)) { + ares_array_remove_last(strs->strs); + } +} + +void ares_dns_multistring_destroy(ares_dns_multistring_t *strs) +{ + if (strs == NULL) { + return; + } + ares_dns_multistring_clear(strs); + ares_array_destroy(strs->strs); + ares_free(strs->cache_str); + ares_free(strs); +} + +ares_status_t ares_dns_multistring_swap_own(ares_dns_multistring_t *strs, + size_t idx, unsigned char *str, + size_t len) +{ + multistring_data_t *data; + + if (strs == NULL || str == NULL || len == 0) { + return ARES_EFORMERR; + } + + strs->cache_invalidated = ARES_TRUE; + + data = ares_array_at(strs->strs, idx); + if (data == NULL) { + return ARES_EFORMERR; + } + + ares_free(data->data); + data->data = str; + data->len = len; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_multistring_del(ares_dns_multistring_t *strs, size_t idx) +{ + if (strs == NULL) { + return ARES_EFORMERR; + } + + strs->cache_invalidated = ARES_TRUE; + + return ares_array_remove_at(strs->strs, idx); +} + +ares_status_t ares_dns_multistring_add_own(ares_dns_multistring_t *strs, + unsigned char *str, size_t len) +{ + multistring_data_t *data; + ares_status_t status; + + if (strs == NULL) { + return ARES_EFORMERR; + } + + strs->cache_invalidated = ARES_TRUE; + + /* NOTE: its ok to have an empty string added */ + if (str == NULL && len != 0) { + return ARES_EFORMERR; + } + + status = ares_array_insert_last((void **)&data, strs->strs); + if (status != ARES_SUCCESS) { + return status; + } + + /* Issue #921, ares_dns_multistring_get() doesn't have a way to indicate + * success or fail on a zero-length string which is actually valid. So we + * are going to allocate a 1-byte buffer to use as a placeholder in this + * case */ + if (str == NULL) { + str = ares_malloc_zero(1); + if (str == NULL) { + ares_array_remove_last(strs->strs); + return ARES_ENOMEM; + } + } + + data->data = str; + data->len = len; + + return ARES_SUCCESS; +} + +size_t ares_dns_multistring_cnt(const ares_dns_multistring_t *strs) +{ + if (strs == NULL) { + return 0; + } + return ares_array_len(strs->strs); +} + +const unsigned char * + ares_dns_multistring_get(const ares_dns_multistring_t *strs, size_t idx, + size_t *len) +{ + const multistring_data_t *data; + + if (strs == NULL || len == NULL) { + return NULL; + } + + data = ares_array_at_const(strs->strs, idx); + if (data == NULL) { + return NULL; + } + + *len = data->len; + return data->data; +} + +const unsigned char *ares_dns_multistring_combined(ares_dns_multistring_t *strs, + size_t *len) +{ + ares_buf_t *buf = NULL; + size_t i; + + if (strs == NULL || len == NULL) { + return NULL; + } + + *len = 0; + + /* Return cache if possible */ + if (!strs->cache_invalidated) { + *len = strs->cache_str_len; + return strs->cache_str; + } + + /* Clear cache */ + ares_free(strs->cache_str); + strs->cache_str = NULL; + strs->cache_str_len = 0; + + buf = ares_buf_create(); + + for (i = 0; i < ares_array_len(strs->strs); i++) { + const multistring_data_t *data = ares_array_at_const(strs->strs, i); + if (data == NULL || + ares_buf_append(buf, data->data, data->len) != ARES_SUCCESS) { + ares_buf_destroy(buf); + return NULL; + } + } + + strs->cache_str = + (unsigned char *)ares_buf_finish_str(buf, &strs->cache_str_len); + if (strs->cache_str != NULL) { + strs->cache_invalidated = ARES_FALSE; + } + *len = strs->cache_str_len; + return strs->cache_str; +} + +ares_status_t ares_dns_multistring_parse_buf(ares_buf_t *buf, + size_t remaining_len, + ares_dns_multistring_t **strs, + ares_bool_t validate_printable) +{ + unsigned char len; + ares_status_t status = ARES_EBADRESP; + size_t orig_len = ares_buf_len(buf); + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (remaining_len == 0) { + return ARES_EBADRESP; + } + + if (strs != NULL) { + *strs = ares_dns_multistring_create(); + if (*strs == NULL) { + return ARES_ENOMEM; + } + } + + while (orig_len - ares_buf_len(buf) < remaining_len) { + status = ares_buf_fetch_bytes(buf, &len, 1); + if (status != ARES_SUCCESS) { + break; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + + /* When used by the _str() parser, it really needs to be validated to + * be a valid printable ascii string. Do that here */ + if (len && validate_printable && ares_buf_len(buf) >= len) { + size_t mylen; + const char *data = (const char *)ares_buf_peek(buf, &mylen); + if (!ares_str_isprint(data, len)) { + status = ARES_EBADSTR; + break; + } + } + + if (strs != NULL) { + unsigned char *data = NULL; + if (len) { + status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &data); + if (status != ARES_SUCCESS) { + break; + } + } + status = ares_dns_multistring_add_own(*strs, data, len); + if (status != ARES_SUCCESS) { + ares_free(data); + break; + } + } else { + status = ares_buf_consume(buf, len); + if (status != ARES_SUCCESS) { + break; + } + } + + } + + if (status != ARES_SUCCESS && strs != NULL) { + ares_dns_multistring_destroy(*strs); + *strs = NULL; + } + + return status; +} diff --git a/deps/cares/src/lib/record/ares_dns_multistring.h b/deps/cares/src/lib/record/ares_dns_multistring.h new file mode 100644 index 00000000000000..70834491b52116 --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_multistring.h @@ -0,0 +1,72 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_DNS_MULTISTRING_H +#define __ARES_DNS_MULTISTRING_H + +#include "ares_buf.h" + +struct ares_dns_multistring; +typedef struct ares_dns_multistring ares_dns_multistring_t; + +ares_dns_multistring_t *ares_dns_multistring_create(void); +void ares_dns_multistring_clear(ares_dns_multistring_t *strs); +void ares_dns_multistring_destroy(ares_dns_multistring_t *strs); +ares_status_t ares_dns_multistring_swap_own(ares_dns_multistring_t *strs, + size_t idx, unsigned char *str, + size_t len); +ares_status_t ares_dns_multistring_del(ares_dns_multistring_t *strs, + size_t idx); +ares_status_t ares_dns_multistring_add_own(ares_dns_multistring_t *strs, + unsigned char *str, size_t len); +size_t ares_dns_multistring_cnt(const ares_dns_multistring_t *strs); +const unsigned char * + ares_dns_multistring_get(const ares_dns_multistring_t *strs, size_t idx, + size_t *len); +const unsigned char *ares_dns_multistring_combined(ares_dns_multistring_t *strs, + size_t *len); + +/*! Parse an array of character strings as defined in RFC1035, as binary, + * however, for convenience this does guarantee a NULL terminator (that is + * not included in the length for each value). + * + * \param[in] buf initialized buffer object + * \param[in] remaining_len maximum length that should be used for + * parsing the string, this is often less than + * the remaining buffer and is based on the RR + * record length. + * \param[out] strs Pointer passed by reference to be filled in + * with + * the array of values. + * \param[out] validate_printable Validate the strings contain only printable + * data. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_dns_multistring_parse_buf(ares_buf_t *buf, + size_t remaining_len, + ares_dns_multistring_t **strs, + ares_bool_t validate_printable); + +#endif diff --git a/deps/cares/src/lib/record/ares_dns_name.c b/deps/cares/src/lib/record/ares_dns_name.c new file mode 100644 index 00000000000000..a9b92e03ca9353 --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_name.c @@ -0,0 +1,673 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +typedef struct { + char *name; + size_t name_len; + size_t idx; +} ares_nameoffset_t; + +static void ares_nameoffset_free(void *arg) +{ + ares_nameoffset_t *off = arg; + if (off == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + ares_free(off->name); + ares_free(off); +} + +static ares_status_t ares_nameoffset_create(ares_llist_t **list, + const char *name, size_t idx) +{ + ares_status_t status; + ares_nameoffset_t *off = NULL; + + if (list == NULL || name == NULL || ares_strlen(name) == 0 || + ares_strlen(name) > 255) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (*list == NULL) { + *list = ares_llist_create(ares_nameoffset_free); + } + if (*list == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + off = ares_malloc_zero(sizeof(*off)); + if (off == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + off->name = ares_strdup(name); + off->name_len = ares_strlen(off->name); + off->idx = idx; + + if (ares_llist_insert_last(*list, off) == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_SUCCESS; + +/* LCOV_EXCL_START: OutOfMemory */ +fail: + ares_nameoffset_free(off); + return status; + /* LCOV_EXCL_STOP */ +} + +static const ares_nameoffset_t *ares_nameoffset_find(ares_llist_t *list, + const char *name) +{ + size_t name_len = ares_strlen(name); + ares_llist_node_t *node; + const ares_nameoffset_t *longest_match = NULL; + + if (list == NULL || name == NULL || name_len == 0) { + return NULL; + } + + for (node = ares_llist_node_first(list); node != NULL; + node = ares_llist_node_next(node)) { + const ares_nameoffset_t *val = ares_llist_node_val(node); + size_t prefix_len; + + /* Can't be a match if the stored name is longer */ + if (val->name_len > name_len) { + continue; + } + + /* Can't be the longest match if our existing longest match is longer */ + if (longest_match != NULL && longest_match->name_len > val->name_len) { + continue; + } + + prefix_len = name_len - val->name_len; + + /* Due to DNS 0x20, lets not inadvertently mangle things, use case-sensitive + * matching instead of case-insensitive. This may result in slightly + * larger DNS queries overall. */ + if (!ares_streq(val->name, name + prefix_len)) { + continue; + } + + /* We need to make sure if `val->name` is "example.com" that name is + * is separated by a label, e.g. "myexample.com" is not ok, however + * "my.example.com" is, so we look for the preceding "." */ + if (prefix_len != 0 && name[prefix_len - 1] != '.') { + continue; + } + + longest_match = val; + } + + return longest_match; +} + +static void ares_dns_labels_free_cb(void *arg) +{ + ares_buf_t **buf = arg; + if (buf == NULL) { + return; + } + + ares_buf_destroy(*buf); +} + +static ares_buf_t *ares_dns_labels_add(ares_array_t *labels) +{ + ares_buf_t **buf; + + if (labels == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (ares_array_insert_last((void **)&buf, labels) != ARES_SUCCESS) { + return NULL; + } + + *buf = ares_buf_create(); + if (*buf == NULL) { + ares_array_remove_last(labels); + return NULL; + } + + return *buf; +} + +static ares_buf_t *ares_dns_labels_get_last(ares_array_t *labels) +{ + ares_buf_t **buf = ares_array_last(labels); + + if (buf == NULL) { + return NULL; + } + + return *buf; +} + +static ares_buf_t *ares_dns_labels_get_at(ares_array_t *labels, size_t idx) +{ + ares_buf_t **buf = ares_array_at(labels, idx); + + if (buf == NULL) { + return NULL; + } + + return *buf; +} + +static void ares_dns_name_labels_del_last(ares_array_t *labels) +{ + ares_array_remove_last(labels); +} + +static ares_status_t ares_parse_dns_name_escape(ares_buf_t *namebuf, + ares_buf_t *label, + ares_bool_t validate_hostname) +{ + ares_status_t status; + unsigned char c; + + status = ares_buf_fetch_bytes(namebuf, &c, 1); + if (status != ARES_SUCCESS) { + return ARES_EBADNAME; + } + + /* If next character is a digit, read 2 more digits */ + if (ares_isdigit(c)) { + size_t i; + unsigned int val = 0; + + val = c - '0'; + + for (i = 0; i < 2; i++) { + status = ares_buf_fetch_bytes(namebuf, &c, 1); + if (status != ARES_SUCCESS) { + return ARES_EBADNAME; + } + + if (!ares_isdigit(c)) { + return ARES_EBADNAME; + } + val *= 10; + val += c - '0'; + } + + /* Out of range */ + if (val > 255) { + return ARES_EBADNAME; + } + + if (validate_hostname && !ares_is_hostnamech((unsigned char)val)) { + return ARES_EBADNAME; + } + + return ares_buf_append_byte(label, (unsigned char)val); + } + + /* We can just output the character */ + if (validate_hostname && !ares_is_hostnamech(c)) { + return ARES_EBADNAME; + } + + return ares_buf_append_byte(label, c); +} + +static ares_status_t ares_split_dns_name(ares_array_t *labels, + ares_bool_t validate_hostname, + const char *name) +{ + ares_status_t status; + ares_buf_t *label = NULL; + ares_buf_t *namebuf = NULL; + size_t i; + size_t total_len = 0; + unsigned char c; + + if (name == NULL || labels == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Put name into a buffer for parsing */ + namebuf = ares_buf_create(); + if (namebuf == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + if (*name != '\0') { + status = + ares_buf_append(namebuf, (const unsigned char *)name, ares_strlen(name)); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* Start with 1 label */ + label = ares_dns_labels_add(labels); + if (label == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + while (ares_buf_fetch_bytes(namebuf, &c, 1) == ARES_SUCCESS) { + /* New label */ + if (c == '.') { + label = ares_dns_labels_add(labels); + if (label == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + continue; + } + + /* Escape */ + if (c == '\\') { + status = ares_parse_dns_name_escape(namebuf, label, validate_hostname); + if (status != ARES_SUCCESS) { + goto done; + } + continue; + } + + /* Output direct character */ + if (validate_hostname && !ares_is_hostnamech(c)) { + status = ARES_EBADNAME; + goto done; + } + + status = ares_buf_append_byte(label, c); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* Remove trailing blank label */ + if (ares_buf_len(ares_dns_labels_get_last(labels)) == 0) { + ares_dns_name_labels_del_last(labels); + } + + /* If someone passed in "." there could have been 2 blank labels, check for + * that */ + if (ares_array_len(labels) == 1 && + ares_buf_len(ares_dns_labels_get_last(labels)) == 0) { + ares_dns_name_labels_del_last(labels); + } + + /* Scan to make sure label lengths are valid */ + for (i = 0; i < ares_array_len(labels); i++) { + const ares_buf_t *buf = ares_dns_labels_get_at(labels, i); + size_t len = ares_buf_len(buf); + /* No 0-length labels, and no labels over 63 bytes */ + if (len == 0 || len > 63) { + status = ARES_EBADNAME; + goto done; + } + total_len += len; + } + + /* Can't exceed maximum (unescaped) length */ + if (ares_array_len(labels) && total_len + ares_array_len(labels) - 1 > 255) { + status = ARES_EBADNAME; + goto done; + } + + status = ARES_SUCCESS; + +done: + ares_buf_destroy(namebuf); + return status; +} + +ares_status_t ares_dns_name_write(ares_buf_t *buf, ares_llist_t **list, + ares_bool_t validate_hostname, + const char *name) +{ + const ares_nameoffset_t *off = NULL; + size_t name_len; + size_t orig_name_len; + size_t pos = ares_buf_len(buf); + ares_array_t *labels = NULL; + char name_copy[512]; + ares_status_t status; + + if (buf == NULL || name == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + labels = ares_array_create(sizeof(ares_buf_t *), ares_dns_labels_free_cb); + if (labels == NULL) { + return ARES_ENOMEM; + } + + /* NOTE: due to possible escaping, name_copy buffer is > 256 to allow for + * this */ + name_len = ares_strcpy(name_copy, name, sizeof(name_copy)); + orig_name_len = name_len; + + /* Find longest match */ + if (list != NULL) { + off = ares_nameoffset_find(*list, name_copy); + if (off != NULL && off->name_len != name_len) { + /* truncate */ + name_len -= (off->name_len + 1); + name_copy[name_len] = 0; + } + } + + /* Output labels */ + if (off == NULL || off->name_len != orig_name_len) { + size_t i; + + status = ares_split_dns_name(labels, validate_hostname, name_copy); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < ares_array_len(labels); i++) { + size_t len = 0; + const ares_buf_t *lbuf = ares_dns_labels_get_at(labels, i); + const unsigned char *ptr = ares_buf_peek(lbuf, &len); + + status = ares_buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append(buf, ptr, len); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* If we are NOT jumping to another label, output terminator */ + if (off == NULL) { + status = ares_buf_append_byte(buf, 0); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + } + + /* Output name compression offset jump */ + if (off != NULL) { + unsigned short u16 = + (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF); + status = ares_buf_append_be16(buf, u16); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* Store pointer for future jumps as long as its not an exact match for + * a prior entry */ + if (list != NULL && (off == NULL || off->name_len != orig_name_len) && + name_len > 0) { + status = ares_nameoffset_create(list, name /* not truncated copy! */, pos); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + status = ARES_SUCCESS; + +done: + ares_array_destroy(labels); + return status; +} + +/* Reserved characters for names that need to be escaped */ +static ares_bool_t is_reservedch(int ch) +{ + switch (ch) { + case '"': + case '.': + case ';': + case '\\': + case '(': + case ')': + case '@': + case '$': + return ARES_TRUE; + default: + break; + } + + return ARES_FALSE; +} + +static ares_status_t ares_fetch_dnsname_into_buf(ares_buf_t *buf, + ares_buf_t *dest, size_t len, + ares_bool_t is_hostname) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_peek(buf, &remaining_len); + ares_status_t status; + size_t i; + + if (buf == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + for (i = 0; i < len; i++) { + unsigned char c = ptr[i]; + + /* Hostnames have a very specific allowed character set. Anything outside + * of that (non-printable and reserved included) are disallowed */ + if (is_hostname && !ares_is_hostnamech(c)) { + status = ARES_EBADRESP; + goto fail; + } + + /* NOTE: dest may be NULL if the user is trying to skip the name. validation + * still occurs above. */ + if (dest == NULL) { + continue; + } + + /* Non-printable characters need to be output as \DDD */ + if (!ares_isprint(c)) { + unsigned char escape[4]; + + escape[0] = '\\'; + escape[1] = '0' + (c / 100); + escape[2] = '0' + ((c % 100) / 10); + escape[3] = '0' + (c % 10); + + status = ares_buf_append(dest, escape, sizeof(escape)); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + continue; + } + + /* Reserved characters need to be escaped, otherwise normal */ + if (is_reservedch(c)) { + status = ares_buf_append_byte(dest, '\\'); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + status = ares_buf_append_byte(dest, c); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ares_buf_consume(buf, len); + +fail: + return status; +} + +ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, + ares_bool_t is_hostname) +{ + size_t save_offset = 0; + unsigned char c; + ares_status_t status; + ares_buf_t *namebuf = NULL; + size_t label_start = ares_buf_get_position(buf); + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (name != NULL) { + namebuf = ares_buf_create(); + if (namebuf == NULL) { + status = ARES_ENOMEM; + goto fail; + } + } + + /* The compression scheme allows a domain name in a message to be + * represented as either: + * + * - a sequence of labels ending in a zero octet + * - a pointer + * - a sequence of labels ending with a pointer + */ + while (1) { + /* Keep track of the minimum label starting position to prevent forward + * jumping */ + if (label_start > ares_buf_get_position(buf)) { + label_start = ares_buf_get_position(buf); + } + + status = ares_buf_fetch_bytes(buf, &c, 1); + if (status != ARES_SUCCESS) { + goto fail; + } + + /* Pointer/Redirect */ + if ((c & 0xc0) == 0xc0) { + /* The pointer takes the form of a two octet sequence: + * + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * | 1 1| OFFSET | + * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + * + * The first two bits are ones. This allows a pointer to be distinguished + * from a label, since the label must begin with two zero bits because + * labels are restricted to 63 octets or less. (The 10 and 01 + * combinations are reserved for future use.) The OFFSET field specifies + * an offset from the start of the message (i.e., the first octet of the + * ID field in the domain header). A zero offset specifies the first byte + * of the ID field, etc. + */ + size_t offset = (size_t)((c & 0x3F) << 8); + + /* Fetch second byte of the redirect length */ + status = ares_buf_fetch_bytes(buf, &c, 1); + if (status != ARES_SUCCESS) { + goto fail; + } + + offset |= ((size_t)c); + + /* According to RFC 1035 4.1.4: + * In this scheme, an entire domain name or a list of labels at + * the end of a domain name is replaced with a pointer to a prior + * occurrence of the same name. + * Note the word "prior", meaning it must go backwards. This was + * confirmed via the ISC BIND code that it also prevents forward + * pointers. + */ + if (offset >= label_start) { + status = ARES_EBADNAME; + goto fail; + } + + /* First time we make a jump, save the current position */ + if (save_offset == 0) { + save_offset = ares_buf_get_position(buf); + } + + status = ares_buf_set_position(buf, offset); + if (status != ARES_SUCCESS) { + status = ARES_EBADNAME; + goto fail; + } + + continue; + } else if ((c & 0xc0) != 0) { + /* 10 and 01 are reserved */ + status = ARES_EBADNAME; + goto fail; + } else if (c == 0) { + /* termination via zero octet*/ + break; + } + + /* New label */ + + /* Labels are separated by periods */ + if (ares_buf_len(namebuf) != 0 && name != NULL) { + status = ares_buf_append_byte(namebuf, '.'); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + status = ares_fetch_dnsname_into_buf(buf, namebuf, c, is_hostname); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + /* Restore offset read after first redirect/pointer as this is where the DNS + * message continues */ + if (save_offset) { + ares_buf_set_position(buf, save_offset); + } + + if (name != NULL) { + *name = ares_buf_finish_str(namebuf, NULL); + if (*name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ARES_SUCCESS; + +fail: + /* We want badname response if we couldn't parse */ + if (status == ARES_EBADRESP) { + status = ARES_EBADNAME; + } + + ares_buf_destroy(namebuf); + return status; +} diff --git a/deps/cares/src/lib/ares_dns_parse.c b/deps/cares/src/lib/record/ares_dns_parse.c similarity index 77% rename from deps/cares/src/lib/ares_dns_parse.c rename to deps/cares/src/lib/record/ares_dns_parse.c index 169fd5b63d7eb1..0c545d7aa18ada 100644 --- a/deps/cares/src/lib/ares_dns_parse.c +++ b/deps/cares/src/lib/record/ares_dns_parse.c @@ -23,25 +23,23 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include <limits.h> #ifdef HAVE_STDINT_H # include <stdint.h> #endif -static size_t ares_dns_rr_remaining_len(const ares__buf_t *buf, size_t orig_len, +static size_t ares_dns_rr_remaining_len(const ares_buf_t *buf, size_t orig_len, size_t rdlength) { - size_t used_len = orig_len - ares__buf_len(buf); + size_t used_len = orig_len - ares_buf_len(buf); if (used_len >= rdlength) { return 0; } return rdlength - used_len; } -static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf, +static ares_status_t ares_dns_parse_and_set_dns_name(ares_buf_t *buf, ares_bool_t is_hostname, ares_dns_rr_t *rr, ares_dns_rr_key_t key) @@ -49,7 +47,7 @@ static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf, ares_status_t status; char *name = NULL; - status = ares__dns_name_parse(buf, &name, is_hostname); + status = ares_dns_name_parse(buf, &name, is_hostname); if (status != ARES_SUCCESS) { return status; } @@ -62,14 +60,16 @@ static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_and_set_dns_str( - ares__buf_t *buf, size_t max_len, ares_bool_t allow_multiple, - ares_dns_rr_t *rr, ares_dns_rr_key_t key, ares_bool_t blank_allowed) +static ares_status_t ares_dns_parse_and_set_dns_str(ares_buf_t *buf, + size_t max_len, + ares_dns_rr_t *rr, + ares_dns_rr_key_t key, + ares_bool_t blank_allowed) { ares_status_t status; char *str = NULL; - status = ares__buf_parse_dns_str(buf, max_len, &str, allow_multiple); + status = ares_buf_parse_dns_str(buf, max_len, &str); if (status != ARES_SUCCESS) { return status; } @@ -88,36 +88,35 @@ static ares_status_t ares_dns_parse_and_set_dns_str( } static ares_status_t - ares_dns_parse_and_set_dns_binstr(ares__buf_t *buf, size_t max_len, - ares_bool_t allow_multiple, - ares_dns_rr_t *rr, ares_dns_rr_key_t key) + ares_dns_parse_and_set_dns_abin(ares_buf_t *buf, size_t max_len, + ares_dns_rr_t *rr, ares_dns_rr_key_t key, + ares_bool_t validate_printable) { - ares_status_t status; - unsigned char *bin = NULL; - size_t bin_len = 0; + ares_status_t status; + ares_dns_multistring_t *strs = NULL; status = - ares__buf_parse_dns_binstr(buf, max_len, &bin, &bin_len, allow_multiple); + ares_dns_multistring_parse_buf(buf, max_len, &strs, validate_printable); if (status != ARES_SUCCESS) { return status; } - status = ares_dns_rr_set_bin_own(rr, key, bin, bin_len); + status = ares_dns_rr_set_abin_own(rr, key, strs); if (status != ARES_SUCCESS) { - ares_free(bin); + ares_dns_multistring_destroy(strs); return status; } return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_and_set_be32(ares__buf_t *buf, +static ares_status_t ares_dns_parse_and_set_be32(ares_buf_t *buf, ares_dns_rr_t *rr, ares_dns_rr_key_t key) { ares_status_t status; unsigned int u32; - status = ares__buf_fetch_be32(buf, &u32); + status = ares_buf_fetch_be32(buf, &u32); if (status != ARES_SUCCESS) { return status; } @@ -125,14 +124,14 @@ static ares_status_t ares_dns_parse_and_set_be32(ares__buf_t *buf, return ares_dns_rr_set_u32(rr, key, u32); } -static ares_status_t ares_dns_parse_and_set_be16(ares__buf_t *buf, +static ares_status_t ares_dns_parse_and_set_be16(ares_buf_t *buf, ares_dns_rr_t *rr, ares_dns_rr_key_t key) { ares_status_t status; unsigned short u16; - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { return status; } @@ -140,14 +139,14 @@ static ares_status_t ares_dns_parse_and_set_be16(ares__buf_t *buf, return ares_dns_rr_set_u16(rr, key, u16); } -static ares_status_t ares_dns_parse_and_set_u8(ares__buf_t *buf, +static ares_status_t ares_dns_parse_and_set_u8(ares_buf_t *buf, ares_dns_rr_t *rr, ares_dns_rr_key_t key) { ares_status_t status; unsigned char u8; - status = ares__buf_fetch_bytes(buf, &u8, 1); + status = ares_buf_fetch_bytes(buf, &u8, 1); if (status != ARES_SUCCESS) { return status; } @@ -155,7 +154,7 @@ static ares_status_t ares_dns_parse_and_set_u8(ares__buf_t *buf, return ares_dns_rr_set_u8(rr, key, u8); } -static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_a(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { struct in_addr addr; @@ -163,7 +162,7 @@ static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr, (void)rdlength; /* Not needed */ - status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); + status = ares_buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); if (status != ARES_SUCCESS) { return status; } @@ -171,7 +170,7 @@ static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr, return ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr); } -static ares_status_t ares_dns_parse_rr_ns(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_ns(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { (void)rdlength; /* Not needed */ @@ -180,8 +179,8 @@ static ares_status_t ares_dns_parse_rr_ns(ares__buf_t *buf, ares_dns_rr_t *rr, ARES_RR_NS_NSDNAME); } -static ares_status_t ares_dns_parse_rr_cname(ares__buf_t *buf, - ares_dns_rr_t *rr, size_t rdlength) +static ares_status_t ares_dns_parse_rr_cname(ares_buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) { (void)rdlength; /* Not needed */ @@ -189,7 +188,7 @@ static ares_status_t ares_dns_parse_rr_cname(ares__buf_t *buf, ARES_RR_CNAME_CNAME); } -static ares_status_t ares_dns_parse_rr_soa(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_soa(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { ares_status_t status; @@ -238,7 +237,7 @@ static ares_status_t ares_dns_parse_rr_soa(ares__buf_t *buf, ares_dns_rr_t *rr, return ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_MINIMUM); } -static ares_status_t ares_dns_parse_rr_ptr(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_ptr(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { (void)rdlength; /* Not needed */ @@ -247,17 +246,17 @@ static ares_status_t ares_dns_parse_rr_ptr(ares__buf_t *buf, ares_dns_rr_t *rr, ARES_RR_PTR_DNAME); } -static ares_status_t ares_dns_parse_rr_hinfo(ares__buf_t *buf, - ares_dns_rr_t *rr, size_t rdlength) +static ares_status_t ares_dns_parse_rr_hinfo(ares_buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); (void)rdlength; /* Not needed */ /* CPU */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_HINFO_CPU, ARES_TRUE); if (status != ARES_SUCCESS) { return status; @@ -265,13 +264,13 @@ static ares_status_t ares_dns_parse_rr_hinfo(ares__buf_t *buf, /* OS */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_HINFO_OS, ARES_TRUE); return status; } -static ares_status_t ares_dns_parse_rr_mx(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_mx(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { ares_status_t status; @@ -289,14 +288,82 @@ static ares_status_t ares_dns_parse_rr_mx(ares__buf_t *buf, ares_dns_rr_t *rr, ARES_RR_MX_EXCHANGE); } -static ares_status_t ares_dns_parse_rr_txt(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_txt(ares_buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) +{ + return ares_dns_parse_and_set_dns_abin(buf, rdlength, rr, ARES_RR_TXT_DATA, + ARES_FALSE); +} + +static ares_status_t ares_dns_parse_rr_sig(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { - return ares_dns_parse_and_set_dns_binstr(buf, rdlength, ARES_TRUE, rr, - ARES_RR_TXT_DATA); + ares_status_t status; + size_t orig_len = ares_buf_len(buf); + size_t len; + unsigned char *data; + + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SIG_TYPE_COVERED); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_SIG_ALGORITHM); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_SIG_LABELS); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_ORIGINAL_TTL); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_EXPIRATION); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SIG_INCEPTION); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SIG_KEY_TAG); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, + ARES_RR_SIG_SIGNERS_NAME); + if (status != ARES_SUCCESS) { + return status; + } + + len = ares_dns_rr_remaining_len(buf, orig_len, rdlength); + if (len == 0) { + return ARES_EBADRESP; + } + + status = ares_buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_rr_set_bin_own(rr, ARES_RR_SIG_SIGNATURE, data, len); + if (status != ARES_SUCCESS) { + ares_free(data); + return status; + } + + return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_aaaa(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { struct ares_in6_addr addr; @@ -304,7 +371,7 @@ static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr, (void)rdlength; /* Not needed */ - status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); + status = ares_buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr)); if (status != ARES_SUCCESS) { return status; } @@ -312,7 +379,7 @@ static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr, return ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr); } -static ares_status_t ares_dns_parse_rr_srv(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_srv(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { ares_status_t status; @@ -342,11 +409,11 @@ static ares_status_t ares_dns_parse_rr_srv(ares__buf_t *buf, ares_dns_rr_t *rr, ARES_RR_SRV_TARGET); } -static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, - ares_dns_rr_t *rr, size_t rdlength) +static ares_status_t ares_dns_parse_rr_naptr(ares_buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); /* ORDER */ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_ORDER); @@ -362,7 +429,7 @@ static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, /* FLAGS */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_NAPTR_FLAGS, ARES_TRUE); if (status != ARES_SUCCESS) { return status; @@ -370,7 +437,7 @@ static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, /* SERVICES */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_NAPTR_SERVICES, ARES_TRUE); if (status != ARES_SUCCESS) { return status; @@ -378,7 +445,7 @@ static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, /* REGEXP */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_NAPTR_REGEXP, ARES_TRUE); if (status != ARES_SUCCESS) { return status; @@ -389,13 +456,13 @@ static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf, ARES_RR_NAPTR_REPLACEMENT); } -static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_opt(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength, unsigned short raw_class, unsigned int raw_ttl) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); unsigned short rcode_high; status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, raw_class); @@ -427,19 +494,19 @@ static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr, unsigned char *val = NULL; /* Fetch be16 option */ - status = ares__buf_fetch_be16(buf, &opt); + status = ares_buf_fetch_be16(buf, &opt); if (status != ARES_SUCCESS) { return status; } /* Fetch be16 length */ - status = ares__buf_fetch_be16(buf, &len); + status = ares_buf_fetch_be16(buf, &len); if (status != ARES_SUCCESS) { return status; } if (len) { - status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); if (status != ARES_SUCCESS) { return status; } @@ -454,11 +521,11 @@ static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_tlsa(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); size_t len; unsigned char *data; @@ -482,7 +549,7 @@ static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_EBADRESP; } - status = ares__buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data); + status = ares_buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data); if (status != ARES_SUCCESS) { return status; } @@ -496,11 +563,11 @@ static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_svcb(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SVCB_PRIORITY); if (status != ARES_SUCCESS) { @@ -520,19 +587,19 @@ static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr, unsigned char *val = NULL; /* Fetch be16 option */ - status = ares__buf_fetch_be16(buf, &opt); + status = ares_buf_fetch_be16(buf, &opt); if (status != ARES_SUCCESS) { return status; } /* Fetch be16 length */ - status = ares__buf_fetch_be16(buf, &len); + status = ares_buf_fetch_be16(buf, &len); if (status != ARES_SUCCESS) { return status; } if (len) { - status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); if (status != ARES_SUCCESS) { return status; } @@ -547,11 +614,11 @@ static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf, - ares_dns_rr_t *rr, size_t rdlength) +static ares_status_t ares_dns_parse_rr_https(ares_buf_t *buf, ares_dns_rr_t *rr, + size_t rdlength) { ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_HTTPS_PRIORITY); if (status != ARES_SUCCESS) { @@ -571,19 +638,19 @@ static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf, unsigned char *val = NULL; /* Fetch be16 option */ - status = ares__buf_fetch_be16(buf, &opt); + status = ares_buf_fetch_be16(buf, &opt); if (status != ARES_SUCCESS) { return status; } /* Fetch be16 length */ - status = ares__buf_fetch_be16(buf, &len); + status = ares_buf_fetch_be16(buf, &len); if (status != ARES_SUCCESS) { return status; } if (len) { - status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); + status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val); if (status != ARES_SUCCESS) { return status; } @@ -598,12 +665,12 @@ static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_uri(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { char *name = NULL; ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); size_t remaining_len; /* PRIORITY */ @@ -627,11 +694,16 @@ static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr, } /* NOTE: Not in DNS string format */ - status = ares__buf_fetch_str_dup(buf, remaining_len, &name); + status = ares_buf_fetch_str_dup(buf, remaining_len, &name); if (status != ARES_SUCCESS) { return status; } + if (!ares_str_isprint(name, remaining_len)) { + ares_free(name); + return ARES_EBADRESP; + } + status = ares_dns_rr_set_str_own(rr, ARES_RR_URI_TARGET, name); if (status != ARES_SUCCESS) { ares_free(name); @@ -642,13 +714,13 @@ static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr, +static ares_status_t ares_dns_parse_rr_caa(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength) { unsigned char *data = NULL; size_t data_len = 0; ares_status_t status; - size_t orig_len = ares__buf_len(buf); + size_t orig_len = ares_buf_len(buf); /* CRITICAL */ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_CAA_CRITICAL); @@ -658,7 +730,7 @@ static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr, /* Tag */ status = ares_dns_parse_and_set_dns_str( - buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr, + buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), rr, ARES_RR_CAA_TAG, ARES_FALSE); if (status != ARES_SUCCESS) { return status; @@ -670,7 +742,7 @@ static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr, status = ARES_EBADRESP; return status; } - status = ares__buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data); + status = ares_buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data); if (status != ARES_SUCCESS) { return status; } @@ -685,7 +757,7 @@ static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf, +static ares_status_t ares_dns_parse_rr_raw_rr(ares_buf_t *buf, ares_dns_rr_t *rr, size_t rdlength, unsigned short raw_type) @@ -697,7 +769,7 @@ static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf, return ARES_SUCCESS; } - status = ares__buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes); + status = ares_buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes); if (status != ARES_SUCCESS) { return status; } @@ -718,7 +790,7 @@ static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf, return ARES_SUCCESS; } -static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, +static ares_status_t ares_dns_parse_header(ares_buf_t *buf, unsigned int flags, ares_dns_record_t **dnsrec, unsigned short *qdcount, unsigned short *ancount, @@ -762,13 +834,13 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, */ /* ID */ - status = ares__buf_fetch_be16(buf, &id); + status = ares_buf_fetch_be16(buf, &id); if (status != ARES_SUCCESS) { goto fail; } /* Flags */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto fail; } @@ -817,25 +889,25 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, rcode = u16 & 0xf; /* QDCOUNT */ - status = ares__buf_fetch_be16(buf, qdcount); + status = ares_buf_fetch_be16(buf, qdcount); if (status != ARES_SUCCESS) { goto fail; } /* ANCOUNT */ - status = ares__buf_fetch_be16(buf, ancount); + status = ares_buf_fetch_be16(buf, ancount); if (status != ARES_SUCCESS) { goto fail; } /* NSCOUNT */ - status = ares__buf_fetch_be16(buf, nscount); + status = ares_buf_fetch_be16(buf, nscount); if (status != ARES_SUCCESS) { goto fail; } /* ARCOUNT */ - status = ares__buf_fetch_be16(buf, arcount); + status = ares_buf_fetch_be16(buf, arcount); if (status != ARES_SUCCESS) { goto fail; } @@ -852,7 +924,7 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, status = ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -860,7 +932,7 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, status = ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -868,7 +940,7 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, status = ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount); if (status != ARES_SUCCESS) { - goto fail; + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } @@ -886,7 +958,7 @@ static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags, } static ares_status_t - ares_dns_parse_rr_data(ares__buf_t *buf, size_t rdlength, ares_dns_rr_t *rr, + ares_dns_parse_rr_data(ares_buf_t *buf, size_t rdlength, ares_dns_rr_t *rr, ares_dns_rec_type_t type, unsigned short raw_type, unsigned short raw_class, unsigned int raw_ttl) { @@ -907,6 +979,8 @@ static ares_status_t return ares_dns_parse_rr_mx(buf, rr, rdlength); case ARES_REC_TYPE_TXT: return ares_dns_parse_rr_txt(buf, rr, rdlength); + case ARES_REC_TYPE_SIG: + return ares_dns_parse_rr_sig(buf, rr, rdlength); case ARES_REC_TYPE_AAAA: return ares_dns_parse_rr_aaaa(buf, rr, rdlength); case ARES_REC_TYPE_SRV: @@ -933,7 +1007,7 @@ static ares_status_t return ARES_EFORMERR; } -static ares_status_t ares_dns_parse_qd(ares__buf_t *buf, +static ares_status_t ares_dns_parse_qd(ares_buf_t *buf, ares_dns_record_t *dnsrec) { char *name = NULL; @@ -958,20 +1032,20 @@ static ares_status_t ares_dns_parse_qd(ares__buf_t *buf, */ /* Name */ - status = ares__dns_name_parse(buf, &name, ARES_FALSE); + status = ares_dns_name_parse(buf, &name, ARES_FALSE); if (status != ARES_SUCCESS) { goto done; } /* Type */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto done; } type = u16; /* Class */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto done; } @@ -988,7 +1062,7 @@ static ares_status_t ares_dns_parse_qd(ares__buf_t *buf, return status; } -static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, +static ares_status_t ares_dns_parse_rr(ares_buf_t *buf, unsigned int flags, ares_dns_section_t sect, ares_dns_record_t *dnsrec) { @@ -1029,13 +1103,13 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, */ /* Name */ - status = ares__dns_name_parse(buf, &name, ARES_FALSE); + status = ares_dns_name_parse(buf, &name, ARES_FALSE); if (status != ARES_SUCCESS) { goto done; } /* Type */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto done; } @@ -1043,20 +1117,20 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, raw_type = u16; /* Only used for raw rr data */ /* Class */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto done; } qclass = u16; /* TTL */ - status = ares__buf_fetch_be32(buf, &ttl); + status = ares_buf_fetch_be32(buf, &ttl); if (status != ARES_SUCCESS) { goto done; } /* Length */ - status = ares__buf_fetch_be16(buf, &u16); + status = ares_buf_fetch_be16(buf, &u16); if (status != ARES_SUCCESS) { goto done; } @@ -1066,7 +1140,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, type = ARES_REC_TYPE_RAW_RR; } - namecomp = ares_dns_rec_type_allow_name_compression(type); + namecomp = ares_dns_rec_allow_name_comp(type); if (sect == ARES_SECTION_ANSWER && (flags & (namecomp ? ARES_DNS_PARSE_AN_BASE_RAW : ARES_DNS_PARSE_AN_EXT_RAW))) { @@ -1084,7 +1158,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, } /* Pull into another buffer for safety */ - if (rdlength > ares__buf_len(buf)) { + if (rdlength > ares_buf_len(buf)) { status = ARES_EBADRESP; goto done; } @@ -1100,7 +1174,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, /* Record the current remaining length in the buffer so we can tell how * much was processed */ - remaining_len = ares__buf_len(buf); + remaining_len = ares_buf_len(buf); /* Fill in the data for the rr */ status = ares_dns_parse_rr_data(buf, rdlength, rr, type, raw_type, @@ -1110,7 +1184,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, } /* Determine how many bytes were processed */ - processed_len = remaining_len - ares__buf_len(buf); + processed_len = remaining_len - ares_buf_len(buf); /* If too many bytes were processed, error! */ if (processed_len > rdlength) { @@ -1121,7 +1195,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, /* If too few bytes were processed, consume the unprocessed data for this * record as the parser may not have wanted/needed to use it */ if (processed_len < rdlength) { - ares__buf_consume(buf, rdlength - processed_len); + ares_buf_consume(buf, rdlength - processed_len); } @@ -1130,7 +1204,7 @@ static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags, return status; } -static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags, +static ares_status_t ares_dns_parse_buf(ares_buf_t *buf, unsigned int flags, ares_dns_record_t **dnsrec) { ares_status_t status; @@ -1141,11 +1215,11 @@ static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags, unsigned short i; if (buf == NULL || dnsrec == NULL) { - return ARES_EFORMERR; + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } /* Maximum DNS packet size is 64k, even over TCP */ - if (ares__buf_len(buf) > 0xFFFF) { + if (ares_buf_len(buf) > 0xFFFF) { return ARES_EFORMERR; } @@ -1236,20 +1310,20 @@ static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags, ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len, unsigned int flags, ares_dns_record_t **dnsrec) { - ares__buf_t *parser = NULL; + ares_buf_t *parser = NULL; ares_status_t status; if (buf == NULL || buf_len == 0 || dnsrec == NULL) { return ARES_EFORMERR; } - parser = ares__buf_create_const(buf, buf_len); + parser = ares_buf_create_const(buf, buf_len); if (parser == NULL) { return ARES_ENOMEM; } status = ares_dns_parse_buf(parser, flags, dnsrec); - ares__buf_destroy(parser); + ares_buf_destroy(parser); return status; } diff --git a/deps/cares/src/lib/record/ares_dns_private.h b/deps/cares/src/lib/record/ares_dns_private.h new file mode 100644 index 00000000000000..e8fd600d1d2008 --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_private.h @@ -0,0 +1,273 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_DNS_PRIVATE_H +#define __ARES_DNS_PRIVATE_H + +ares_status_t ares_dns_record_duplicate_ex(ares_dns_record_t **dest, + const ares_dns_record_t *src); +ares_bool_t ares_dns_rec_allow_name_comp(ares_dns_rec_type_t type); +ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode); +ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode); +ares_bool_t ares_dns_flags_arevalid(unsigned short flags); +ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type, + ares_bool_t is_query); +ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, + ares_dns_rec_type_t type, + ares_bool_t is_query); +ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect); +ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, char *val); +ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned char *val, + size_t len); +ares_status_t ares_dns_rr_set_abin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + ares_dns_multistring_t *strs); +ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + unsigned char *val, size_t val_len); +ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t cnt); +ares_dns_rr_t *ares_dns_get_opt_rr(ares_dns_record_t *rec); +const ares_dns_rr_t *ares_dns_get_opt_rr_const(const ares_dns_record_t *rec); +void ares_dns_record_ttl_decrement(ares_dns_record_t *dnsrec, + unsigned int ttl_decrement); + +/* Same as ares_dns_write() but appends to an existing buffer object */ +ares_status_t ares_dns_write_buf(const ares_dns_record_t *dnsrec, + ares_buf_t *buf); + +/* Same as ares_dns_write_buf(), but prepends a 16bit length */ +ares_status_t ares_dns_write_buf_tcp(const ares_dns_record_t *dnsrec, + ares_buf_t *buf); + +/*! Create a DNS record object for a query. The arguments are the same as + * those for ares_create_query(). + * + * \param[out] dnsrec DNS record object to create. + * \param[in] name NUL-terminated name for the query. + * \param[in] dnsclass Class for the query. + * \param[in] type Type for the query. + * \param[in] id Identifier for the query. + * \param[in] flags Flags for the query. + * \param[in] max_udp_size Maximum size of a UDP packet for EDNS. + * \return ARES_SUCCESS on success, otherwise an error code. + */ +ares_status_t + ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, unsigned short id, + ares_dns_flags_t flags, size_t max_udp_size); + +/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code. + * + * \param[in] rcode The RCODE from the reply. + * \param[in] ancount The ANCOUNT from the reply. + * \return An appropriate status code. + */ +ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode, + size_t ancount); + +struct ares_dns_qd { + char *name; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; +}; + +typedef struct { + struct in_addr addr; +} ares_dns_a_t; + +typedef struct { + char *nsdname; +} ares_dns_ns_t; + +typedef struct { + char *cname; +} ares_dns_cname_t; + +typedef struct { + char *mname; + char *rname; + unsigned int serial; + unsigned int refresh; + unsigned int retry; + unsigned int expire; + unsigned int minimum; +} ares_dns_soa_t; + +typedef struct { + char *dname; +} ares_dns_ptr_t; + +typedef struct { + char *cpu; + char *os; +} ares_dns_hinfo_t; + +typedef struct { + unsigned short preference; + char *exchange; +} ares_dns_mx_t; + +typedef struct { + ares_dns_multistring_t *strs; +} ares_dns_txt_t; + +typedef struct { + unsigned short type_covered; + unsigned char algorithm; + unsigned char labels; + unsigned int original_ttl; + unsigned int expiration; + unsigned int inception; + unsigned short key_tag; + char *signers_name; + unsigned char *signature; + size_t signature_len; +} ares_dns_sig_t; + +typedef struct { + struct ares_in6_addr addr; +} ares_dns_aaaa_t; + +typedef struct { + unsigned short priority; + unsigned short weight; + unsigned short port; + char *target; +} ares_dns_srv_t; + +typedef struct { + unsigned short order; + unsigned short preference; + char *flags; + char *services; + char *regexp; + char *replacement; +} ares_dns_naptr_t; + +typedef struct { + unsigned short opt; + unsigned char *val; + size_t val_len; +} ares_dns_optval_t; + +typedef struct { + unsigned short udp_size; /*!< taken from class */ + unsigned char version; /*!< taken from bits 8-16 of ttl */ + unsigned short flags; /*!< Flags, remaining 16 bits, though only + * 1 currently defined */ + ares_array_t *options; /*!< Type is ares_dns_optval_t */ +} ares_dns_opt_t; + +typedef struct { + unsigned char cert_usage; + unsigned char selector; + unsigned char match; + unsigned char *data; + size_t data_len; +} ares_dns_tlsa_t; + +typedef struct { + unsigned short priority; + char *target; + ares_array_t *params; /*!< Type is ares_dns_optval_t */ +} ares_dns_svcb_t; + +typedef struct { + unsigned short priority; + unsigned short weight; + char *target; +} ares_dns_uri_t; + +typedef struct { + unsigned char critical; + char *tag; + unsigned char *value; + size_t value_len; +} ares_dns_caa_t; + +/*! Raw, unparsed RR data */ +typedef struct { + unsigned short type; /*!< Not ares_rec_type_t because it likely isn't one + * of those values since it wasn't parsed */ + unsigned char *data; /*!< Raw RR data */ + size_t length; /*!< Length of raw RR data */ +} ares_dns_raw_rr_t; + +/*! DNS RR data structure */ +struct ares_dns_rr { + ares_dns_record_t *parent; + char *name; + ares_dns_rec_type_t type; + ares_dns_class_t rclass; + unsigned int ttl; + + union { + ares_dns_a_t a; + ares_dns_ns_t ns; + ares_dns_cname_t cname; + ares_dns_soa_t soa; + ares_dns_ptr_t ptr; + ares_dns_hinfo_t hinfo; + ares_dns_mx_t mx; + ares_dns_txt_t txt; + ares_dns_sig_t sig; + ares_dns_aaaa_t aaaa; + ares_dns_srv_t srv; + ares_dns_naptr_t naptr; + ares_dns_opt_t opt; + ares_dns_tlsa_t tlsa; + ares_dns_svcb_t svcb; + ares_dns_svcb_t https; /*!< https is a type of svcb, so this is right */ + ares_dns_uri_t uri; + ares_dns_caa_t caa; + ares_dns_raw_rr_t raw_rr; + } r; +}; + +/*! DNS data structure */ +struct ares_dns_record { + unsigned short id; /*!< DNS query id */ + unsigned short flags; /*!< One or more ares_dns_flags_t */ + ares_dns_opcode_t opcode; /*!< DNS Opcode */ + ares_dns_rcode_t rcode; /*!< DNS RCODE */ + unsigned short raw_rcode; /*!< Raw rcode, used to ultimately form real + * rcode after reading OPT record if it + * exists */ + unsigned int ttl_decrement; /*!< Special case to apply to writing out + * this record, where it will decrement + * the ttl of any resource records by + * this amount. Used for cache */ + + ares_array_t *qd; /*!< Type is ares_dns_qd_t */ + ares_array_t *an; /*!< Type is ares_dns_rr_t */ + ares_array_t *ns; /*!< Type is ares_dns_rr_t */ + ares_array_t *ar; /*!< Type is ares_dns_rr_t */ +}; + +#endif diff --git a/deps/cares/src/lib/record/ares_dns_record.c b/deps/cares/src/lib/record/ares_dns_record.c new file mode 100644 index 00000000000000..ec0dfbd13c49f3 --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_record.c @@ -0,0 +1,1661 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include <limits.h> +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +static void ares_dns_rr_free(ares_dns_rr_t *rr); + +static void ares_dns_qd_free_cb(void *arg) +{ + ares_dns_qd_t *qd = arg; + if (qd == NULL) { + return; + } + ares_free(qd->name); +} + +static void ares_dns_rr_free_cb(void *arg) +{ + ares_dns_rr_t *rr = arg; + if (rr == NULL) { + return; + } + ares_dns_rr_free(rr); +} + +ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec, + unsigned short id, unsigned short flags, + ares_dns_opcode_t opcode, + ares_dns_rcode_t rcode) +{ + if (dnsrec == NULL) { + return ARES_EFORMERR; + } + + *dnsrec = NULL; + + if (!ares_dns_opcode_isvalid(opcode) || !ares_dns_rcode_isvalid(rcode) || + !ares_dns_flags_arevalid(flags)) { + return ARES_EFORMERR; + } + + *dnsrec = ares_malloc_zero(sizeof(**dnsrec)); + if (*dnsrec == NULL) { + return ARES_ENOMEM; + } + + (*dnsrec)->id = id; + (*dnsrec)->flags = flags; + (*dnsrec)->opcode = opcode; + (*dnsrec)->rcode = rcode; + (*dnsrec)->qd = ares_array_create(sizeof(ares_dns_qd_t), ares_dns_qd_free_cb); + (*dnsrec)->an = ares_array_create(sizeof(ares_dns_rr_t), ares_dns_rr_free_cb); + (*dnsrec)->ns = ares_array_create(sizeof(ares_dns_rr_t), ares_dns_rr_free_cb); + (*dnsrec)->ar = ares_array_create(sizeof(ares_dns_rr_t), ares_dns_rr_free_cb); + + if ((*dnsrec)->qd == NULL || (*dnsrec)->an == NULL || (*dnsrec)->ns == NULL || + (*dnsrec)->ar == NULL) { + ares_dns_record_destroy(*dnsrec); + *dnsrec = NULL; + return ARES_ENOMEM; + } + + return ARES_SUCCESS; +} + +unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->id; +} + +ares_bool_t ares_dns_record_set_id(ares_dns_record_t *dnsrec, unsigned short id) +{ + if (dnsrec == NULL) { + return ARES_FALSE; + } + dnsrec->id = id; + return ARES_TRUE; +} + +unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->flags; +} + +ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->opcode; +} + +ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return dnsrec->rcode; +} + +static void ares_dns_rr_free(ares_dns_rr_t *rr) +{ + ares_free(rr->name); + + switch (rr->type) { + case ARES_REC_TYPE_A: + case ARES_REC_TYPE_AAAA: + case ARES_REC_TYPE_ANY: + /* Nothing to free */ + break; + + case ARES_REC_TYPE_NS: + ares_free(rr->r.ns.nsdname); + break; + + case ARES_REC_TYPE_CNAME: + ares_free(rr->r.cname.cname); + break; + + case ARES_REC_TYPE_SOA: + ares_free(rr->r.soa.mname); + ares_free(rr->r.soa.rname); + break; + + case ARES_REC_TYPE_PTR: + ares_free(rr->r.ptr.dname); + break; + + case ARES_REC_TYPE_HINFO: + ares_free(rr->r.hinfo.cpu); + ares_free(rr->r.hinfo.os); + break; + + case ARES_REC_TYPE_MX: + ares_free(rr->r.mx.exchange); + break; + + case ARES_REC_TYPE_TXT: + ares_dns_multistring_destroy(rr->r.txt.strs); + break; + + case ARES_REC_TYPE_SIG: + ares_free(rr->r.sig.signers_name); + ares_free(rr->r.sig.signature); + break; + + case ARES_REC_TYPE_SRV: + ares_free(rr->r.srv.target); + break; + + case ARES_REC_TYPE_NAPTR: + ares_free(rr->r.naptr.flags); + ares_free(rr->r.naptr.services); + ares_free(rr->r.naptr.regexp); + ares_free(rr->r.naptr.replacement); + break; + + case ARES_REC_TYPE_OPT: + ares_array_destroy(rr->r.opt.options); + break; + + case ARES_REC_TYPE_TLSA: + ares_free(rr->r.tlsa.data); + break; + + case ARES_REC_TYPE_SVCB: + ares_free(rr->r.svcb.target); + ares_array_destroy(rr->r.svcb.params); + break; + + case ARES_REC_TYPE_HTTPS: + ares_free(rr->r.https.target); + ares_array_destroy(rr->r.https.params); + break; + + case ARES_REC_TYPE_URI: + ares_free(rr->r.uri.target); + break; + + case ARES_REC_TYPE_CAA: + ares_free(rr->r.caa.tag); + ares_free(rr->r.caa.value); + break; + + case ARES_REC_TYPE_RAW_RR: + ares_free(rr->r.raw_rr.data); + break; + } +} + +void ares_dns_record_destroy(ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return; + } + + /* Free questions */ + ares_array_destroy(dnsrec->qd); + + /* Free answers */ + ares_array_destroy(dnsrec->an); + + /* Free authority */ + ares_array_destroy(dnsrec->ns); + + /* Free additional */ + ares_array_destroy(dnsrec->ar); + + ares_free(dnsrec); +} + +size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec) +{ + if (dnsrec == NULL) { + return 0; + } + return ares_array_len(dnsrec->qd); +} + +ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec, + const char *name, + ares_dns_rec_type_t qtype, + ares_dns_class_t qclass) +{ + size_t idx; + ares_dns_qd_t *qd; + ares_status_t status; + + if (dnsrec == NULL || name == NULL || + !ares_dns_rec_type_isvalid(qtype, ARES_TRUE) || + !ares_dns_class_isvalid(qclass, qtype, ARES_TRUE)) { + return ARES_EFORMERR; + } + + idx = ares_array_len(dnsrec->qd); + status = ares_array_insert_last((void **)&qd, dnsrec->qd); + if (status != ARES_SUCCESS) { + return status; + } + + qd->name = ares_strdup(name); + if (qd->name == NULL) { + ares_array_remove_at(dnsrec->qd, idx); + return ARES_ENOMEM; + } + qd->qtype = qtype; + qd->qclass = qclass; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec, + size_t idx, const char *name) +{ + char *orig_name = NULL; + ares_dns_qd_t *qd; + + if (dnsrec == NULL || idx >= ares_array_len(dnsrec->qd) || name == NULL) { + return ARES_EFORMERR; + } + + qd = ares_array_at(dnsrec->qd, idx); + + orig_name = qd->name; + qd->name = ares_strdup(name); + if (qd->name == NULL) { + qd->name = orig_name; /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + ares_free(orig_name); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec, + size_t idx, + ares_dns_rec_type_t qtype) +{ + ares_dns_qd_t *qd; + + if (dnsrec == NULL || idx >= ares_array_len(dnsrec->qd) || + !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) { + return ARES_EFORMERR; + } + + qd = ares_array_at(dnsrec->qd, idx); + qd->qtype = qtype; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec, + size_t idx, const char **name, + ares_dns_rec_type_t *qtype, + ares_dns_class_t *qclass) +{ + const ares_dns_qd_t *qd; + if (dnsrec == NULL || idx >= ares_array_len(dnsrec->qd)) { + return ARES_EFORMERR; + } + + qd = ares_array_at(dnsrec->qd, idx); + if (name != NULL) { + *name = qd->name; + } + + if (qtype != NULL) { + *qtype = qd->qtype; + } + + if (qclass != NULL) { + *qclass = qd->qclass; + } + + return ARES_SUCCESS; +} + +size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect) +{ + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return 0; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + return ares_array_len(dnsrec->an); + case ARES_SECTION_AUTHORITY: + return ares_array_len(dnsrec->ns); + case ARES_SECTION_ADDITIONAL: + return ares_array_len(dnsrec->ar); + } + + return 0; /* LCOV_EXCL_LINE: DefensiveCoding */ +} + +ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t cnt) +{ + ares_array_t *arr = NULL; + + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return ARES_EFORMERR; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + arr = dnsrec->an; + break; + case ARES_SECTION_AUTHORITY: + arr = dnsrec->ns; + break; + case ARES_SECTION_ADDITIONAL: + arr = dnsrec->ar; + break; + } + + if (cnt < ares_array_len(arr)) { + return ARES_EFORMERR; + } + + return ares_array_set_size(arr, cnt); +} + +ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out, + ares_dns_record_t *dnsrec, + ares_dns_section_t sect, const char *name, + ares_dns_rec_type_t type, + ares_dns_class_t rclass, unsigned int ttl) +{ + ares_dns_rr_t *rr = NULL; + ares_array_t *arr = NULL; + ares_status_t status; + size_t idx; + + if (dnsrec == NULL || name == NULL || rr_out == NULL || + !ares_dns_section_isvalid(sect) || + !ares_dns_rec_type_isvalid(type, ARES_FALSE) || + !ares_dns_class_isvalid(rclass, type, ARES_FALSE)) { + return ARES_EFORMERR; + } + + *rr_out = NULL; + + switch (sect) { + case ARES_SECTION_ANSWER: + arr = dnsrec->an; + break; + case ARES_SECTION_AUTHORITY: + arr = dnsrec->ns; + break; + case ARES_SECTION_ADDITIONAL: + arr = dnsrec->ar; + break; + } + + idx = ares_array_len(arr); + status = ares_array_insert_last((void **)&rr, arr); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + rr->name = ares_strdup(name); + if (rr->name == NULL) { + ares_array_remove_at(arr, idx); + return ARES_ENOMEM; + } + + rr->parent = dnsrec; + rr->type = type; + rr->rclass = rclass; + rr->ttl = ttl; + + *rr_out = rr; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + ares_array_t *arr = NULL; + + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return ARES_EFORMERR; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + arr = dnsrec->an; + break; + case ARES_SECTION_AUTHORITY: + arr = dnsrec->ns; + break; + case ARES_SECTION_ADDITIONAL: + arr = dnsrec->ar; + break; + } + + return ares_array_remove_at(arr, idx); +} + +ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + ares_array_t *arr = NULL; + + if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) { + return NULL; + } + + switch (sect) { + case ARES_SECTION_ANSWER: + arr = dnsrec->an; + break; + case ARES_SECTION_AUTHORITY: + arr = dnsrec->ns; + break; + case ARES_SECTION_ADDITIONAL: + arr = dnsrec->ar; + break; + } + + return ares_array_at(arr, idx); +} + +const ares_dns_rr_t * + ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec, + ares_dns_section_t sect, size_t idx) +{ + return ares_dns_record_rr_get((void *)((size_t)dnsrec), sect, idx); +} + +const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return NULL; + } + return rr->name; +} + +ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->type; +} + +ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->rclass; +} + +unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr) +{ + if (rr == NULL) { + return 0; + } + return rr->ttl; +} + +static void *ares_dns_rr_data_ptr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t **lenptr) +{ + if (dns_rr == NULL || dns_rr->type != ares_dns_rr_key_to_rec_type(key)) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + switch (key) { + case ARES_RR_A_ADDR: + return &dns_rr->r.a.addr; + + case ARES_RR_NS_NSDNAME: + return &dns_rr->r.ns.nsdname; + + case ARES_RR_CNAME_CNAME: + return &dns_rr->r.cname.cname; + + case ARES_RR_SOA_MNAME: + return &dns_rr->r.soa.mname; + + case ARES_RR_SOA_RNAME: + return &dns_rr->r.soa.rname; + + case ARES_RR_SOA_SERIAL: + return &dns_rr->r.soa.serial; + + case ARES_RR_SOA_REFRESH: + return &dns_rr->r.soa.refresh; + + case ARES_RR_SOA_RETRY: + return &dns_rr->r.soa.retry; + + case ARES_RR_SOA_EXPIRE: + return &dns_rr->r.soa.expire; + + case ARES_RR_SOA_MINIMUM: + return &dns_rr->r.soa.minimum; + + case ARES_RR_PTR_DNAME: + return &dns_rr->r.ptr.dname; + + case ARES_RR_AAAA_ADDR: + return &dns_rr->r.aaaa.addr; + + case ARES_RR_HINFO_CPU: + return &dns_rr->r.hinfo.cpu; + + case ARES_RR_HINFO_OS: + return &dns_rr->r.hinfo.os; + + case ARES_RR_MX_PREFERENCE: + return &dns_rr->r.mx.preference; + + case ARES_RR_MX_EXCHANGE: + return &dns_rr->r.mx.exchange; + + case ARES_RR_SIG_TYPE_COVERED: + return &dns_rr->r.sig.type_covered; + + case ARES_RR_SIG_ALGORITHM: + return &dns_rr->r.sig.algorithm; + + case ARES_RR_SIG_LABELS: + return &dns_rr->r.sig.labels; + + case ARES_RR_SIG_ORIGINAL_TTL: + return &dns_rr->r.sig.original_ttl; + + case ARES_RR_SIG_EXPIRATION: + return &dns_rr->r.sig.expiration; + + case ARES_RR_SIG_INCEPTION: + return &dns_rr->r.sig.inception; + + case ARES_RR_SIG_KEY_TAG: + return &dns_rr->r.sig.key_tag; + + case ARES_RR_SIG_SIGNERS_NAME: + return &dns_rr->r.sig.signers_name; + + case ARES_RR_SIG_SIGNATURE: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.sig.signature_len; + return &dns_rr->r.sig.signature; + + case ARES_RR_TXT_DATA: + return &dns_rr->r.txt.strs; + + case ARES_RR_SRV_PRIORITY: + return &dns_rr->r.srv.priority; + + case ARES_RR_SRV_WEIGHT: + return &dns_rr->r.srv.weight; + + case ARES_RR_SRV_PORT: + return &dns_rr->r.srv.port; + + case ARES_RR_SRV_TARGET: + return &dns_rr->r.srv.target; + + case ARES_RR_NAPTR_ORDER: + return &dns_rr->r.naptr.order; + + case ARES_RR_NAPTR_PREFERENCE: + return &dns_rr->r.naptr.preference; + + case ARES_RR_NAPTR_FLAGS: + return &dns_rr->r.naptr.flags; + + case ARES_RR_NAPTR_SERVICES: + return &dns_rr->r.naptr.services; + + case ARES_RR_NAPTR_REGEXP: + return &dns_rr->r.naptr.regexp; + + case ARES_RR_NAPTR_REPLACEMENT: + return &dns_rr->r.naptr.replacement; + + case ARES_RR_OPT_UDP_SIZE: + return &dns_rr->r.opt.udp_size; + + case ARES_RR_OPT_VERSION: + return &dns_rr->r.opt.version; + + case ARES_RR_OPT_FLAGS: + return &dns_rr->r.opt.flags; + + case ARES_RR_OPT_OPTIONS: + return &dns_rr->r.opt.options; + + case ARES_RR_TLSA_CERT_USAGE: + return &dns_rr->r.tlsa.cert_usage; + + case ARES_RR_TLSA_SELECTOR: + return &dns_rr->r.tlsa.selector; + + case ARES_RR_TLSA_MATCH: + return &dns_rr->r.tlsa.match; + + case ARES_RR_TLSA_DATA: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.tlsa.data_len; + return &dns_rr->r.tlsa.data; + + case ARES_RR_SVCB_PRIORITY: + return &dns_rr->r.svcb.priority; + + case ARES_RR_SVCB_TARGET: + return &dns_rr->r.svcb.target; + + case ARES_RR_SVCB_PARAMS: + return &dns_rr->r.svcb.params; + + case ARES_RR_HTTPS_PRIORITY: + return &dns_rr->r.https.priority; + + case ARES_RR_HTTPS_TARGET: + return &dns_rr->r.https.target; + + case ARES_RR_HTTPS_PARAMS: + return &dns_rr->r.https.params; + + case ARES_RR_URI_PRIORITY: + return &dns_rr->r.uri.priority; + + case ARES_RR_URI_WEIGHT: + return &dns_rr->r.uri.weight; + + case ARES_RR_URI_TARGET: + return &dns_rr->r.uri.target; + + case ARES_RR_CAA_CRITICAL: + return &dns_rr->r.caa.critical; + + case ARES_RR_CAA_TAG: + return &dns_rr->r.caa.tag; + + case ARES_RR_CAA_VALUE: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.caa.value_len; + return &dns_rr->r.caa.value; + + case ARES_RR_RAW_RR_TYPE: + return &dns_rr->r.raw_rr.type; + + case ARES_RR_RAW_RR_DATA: + if (lenptr == NULL) { + return NULL; + } + *lenptr = &dns_rr->r.raw_rr.length; + return &dns_rr->r.raw_rr.data; + } + + return NULL; +} + +static const void *ares_dns_rr_data_ptr_const(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const size_t **lenptr) +{ + /* We're going to cast off the const */ + return ares_dns_rr_data_ptr((void *)((size_t)dns_rr), key, + (void *)((size_t)lenptr)); +} + +const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const struct in_addr *addr; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR) { + return NULL; + } + + addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (addr == NULL) { + return NULL; + } + + return addr; +} + +const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const struct ares_in6_addr *addr; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6) { + return NULL; + } + + addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (addr == NULL) { + return NULL; + } + + return addr; +} + +unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned char *u8; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return 0; + } + + u8 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u8 == NULL) { + return 0; + } + + return *u8; +} + +unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned short *u16; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return 0; + } + + u16 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u16 == NULL) { + return 0; + } + + return *u16; +} + +unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + const unsigned int *u32; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return 0; + } + + u32 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (u32 == NULL) { + return 0; + } + + return *u32; +} + +const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t *len) +{ + unsigned char * const *bin = NULL; + size_t const *bin_len = NULL; + + if ((ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) || + len == NULL) { + return NULL; + } + + /* Array of strings, return concatenated version */ + if (ares_dns_rr_key_datatype(key) == ARES_DATATYPE_ABINP) { + ares_dns_multistring_t * const *strs = + ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + + if (strs == NULL) { + return NULL; + } + + return ares_dns_multistring_combined(*strs, len); + } + + /* Not a multi-string, just straight binary data */ + bin = ares_dns_rr_data_ptr_const(dns_rr, key, &bin_len); + if (bin == NULL) { + return NULL; + } + + /* Shouldn't be possible */ + if (bin_len == NULL) { + return NULL; + } + *len = *bin_len; + + return *bin; +} + +size_t ares_dns_rr_get_abin_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + ares_dns_multistring_t * const *strs; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return 0; + } + + strs = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (strs == NULL) { + return 0; + } + + return ares_dns_multistring_cnt(*strs); +} + +const unsigned char *ares_dns_rr_get_abin(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t idx, + size_t *len) +{ + ares_dns_multistring_t * const *strs; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return NULL; + } + + strs = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (strs == NULL) { + return NULL; + } + + return ares_dns_multistring_get(*strs, idx, len); +} + +ares_status_t ares_dns_rr_del_abin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + size_t idx) +{ + ares_dns_multistring_t **strs; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return ARES_EFORMERR; + } + + strs = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (strs == NULL) { + return ARES_EFORMERR; + } + + return ares_dns_multistring_del(*strs, idx); +} + +ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const unsigned char *val, size_t len) +{ + ares_status_t status; + ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key); + ares_bool_t is_nullterm = + (datatype == ARES_DATATYPE_ABINP) ? ARES_TRUE : ARES_FALSE; + size_t alloclen = is_nullterm ? len + 1 : len; + unsigned char *temp; + ares_dns_multistring_t **strs; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return ARES_EFORMERR; + } + + strs = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (strs == NULL) { + return ARES_EFORMERR; + } + + if (*strs == NULL) { + *strs = ares_dns_multistring_create(); + if (*strs == NULL) { + return ARES_ENOMEM; + } + } + + temp = ares_malloc(alloclen); + if (temp == NULL) { + return ARES_ENOMEM; + } + + memcpy(temp, val, len); + + /* NULL-term ABINP */ + if (is_nullterm) { + temp[len] = 0; + } + + status = ares_dns_multistring_add_own(*strs, temp, len); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + char * const *str; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { + return NULL; + } + + str = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (str == NULL) { + return NULL; + } + + return *str; +} + +size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key) +{ + ares_array_t * const *opts; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return 0; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return 0; + } + + return ares_array_len(*opts); +} + +unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, size_t idx, + const unsigned char **val, size_t *val_len) +{ + ares_array_t * const *opts; + const ares_dns_optval_t *opt; + + if (val) { + *val = NULL; + } + if (val_len) { + *val_len = 0; + } + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return 65535; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return 65535; + } + + opt = ares_array_at(*opts, idx); + if (opt == NULL) { + return 65535; + } + + if (val) { + *val = opt->val; + } + if (val_len) { + *val_len = opt->val_len; + } + + return opt->opt; +} + +ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + const unsigned char **val, size_t *val_len) +{ + ares_array_t * const *opts; + size_t i; + size_t cnt; + const ares_dns_optval_t *optptr = NULL; + + if (val) { + *val = NULL; + } + if (val_len) { + *val_len = 0; + } + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return ARES_FALSE; + } + + opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); + if (opts == NULL || *opts == NULL) { + return ARES_FALSE; + } + + cnt = ares_array_len(*opts); + for (i = 0; i < cnt; i++) { + optptr = ares_array_at(*opts, i); + if (optptr == NULL) { + return ARES_FALSE; + } + if (optptr->opt == opt) { + break; + } + } + + if (i >= cnt || optptr == NULL) { + return ARES_FALSE; + } + + if (val) { + *val = optptr->val; + } + if (val_len) { + *val_len = optptr->val_len; + } + return ARES_TRUE; +} + +ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const struct in_addr *addr) +{ + struct in_addr *a; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR || addr == NULL) { + return ARES_EFORMERR; + } + + a = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (a == NULL) { + return ARES_EFORMERR; + } + + memcpy(a, addr, sizeof(*a)); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + const struct ares_in6_addr *addr) +{ + struct ares_in6_addr *a; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6 || addr == NULL) { + return ARES_EFORMERR; + } + + a = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (a == NULL) { + return ARES_EFORMERR; + } + + memcpy(a, addr, sizeof(*a)); + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned char val) +{ + unsigned char *u8; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return ARES_EFORMERR; + } + + u8 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u8 == NULL) { + return ARES_EFORMERR; + } + + *u8 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned short val) +{ + unsigned short *u16; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return ARES_EFORMERR; + } + + u16 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u16 == NULL) { + return ARES_EFORMERR; + } + + *u16 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned int val) +{ + unsigned int *u32; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return ARES_EFORMERR; + } + + u32 = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (u32 == NULL) { + return ARES_EFORMERR; + } + + *u32 = val; + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned char *val, + size_t len) +{ + unsigned char **bin; + size_t *bin_len = NULL; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return ARES_EFORMERR; + } + + if (ares_dns_rr_key_datatype(key) == ARES_DATATYPE_ABINP) { + ares_dns_multistring_t **strs = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (strs == NULL) { + return ARES_EFORMERR; + } + + if (*strs == NULL) { + *strs = ares_dns_multistring_create(); + if (*strs == NULL) { + return ARES_ENOMEM; + } + } + + /* Clear all existing entries as this is an override */ + ares_dns_multistring_clear(*strs); + + return ares_dns_multistring_add_own(*strs, val, len); + } + + bin = ares_dns_rr_data_ptr(dns_rr, key, &bin_len); + if (bin == NULL || bin_len == NULL) { + return ARES_EFORMERR; + } + + if (*bin) { + ares_free(*bin); + } + *bin = val; + *bin_len = len; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const unsigned char *val, size_t len) +{ + ares_status_t status; + ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key); + ares_bool_t is_nullterm = + (datatype == ARES_DATATYPE_BINP || datatype == ARES_DATATYPE_ABINP) + ? ARES_TRUE + : ARES_FALSE; + size_t alloclen = is_nullterm ? len + 1 : len; + unsigned char *temp = ares_malloc(alloclen); + + if (temp == NULL) { + return ARES_ENOMEM; + } + + memcpy(temp, val, len); + + /* NULL-term BINP */ + if (is_nullterm) { + temp[len] = 0; + } + + status = ares_dns_rr_set_bin_own(dns_rr, key, temp, len); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, char *val) +{ + char **str; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR && + ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) { + return ARES_EFORMERR; + } + + str = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (str == NULL) { + return ARES_EFORMERR; + } + + if (*str) { + ares_free(*str); + } + *str = val; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + const char *val) +{ + ares_status_t status; + char *temp = NULL; + + if (val != NULL) { + temp = ares_strdup(val); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + status = ares_dns_rr_set_str_own(dns_rr, key, temp); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +ares_status_t ares_dns_rr_set_abin_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + ares_dns_multistring_t *strs) +{ + ares_dns_multistring_t **strs_ptr; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_ABINP) { + return ARES_EFORMERR; + } + + strs_ptr = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (strs_ptr == NULL) { + return ARES_EFORMERR; + } + + if (*strs_ptr != NULL) { + ares_dns_multistring_destroy(*strs_ptr); + } + *strs_ptr = strs; + + return ARES_SUCCESS; +} + +static void ares_dns_opt_free_cb(void *arg) +{ + ares_dns_optval_t *opt = arg; + if (opt == NULL) { + return; + } + ares_free(opt->val); +} + +ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, unsigned short opt, + unsigned char *val, size_t val_len) +{ + ares_array_t **options; + ares_dns_optval_t *optptr = NULL; + size_t idx; + size_t cnt; + ares_status_t status; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return ARES_EFORMERR; + } + + options = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (options == NULL) { + return ARES_EFORMERR; + } + + if (*options == NULL) { + *options = + ares_array_create(sizeof(ares_dns_optval_t), ares_dns_opt_free_cb); + } + if (*options == NULL) { + return ARES_ENOMEM; + } + + cnt = ares_array_len(*options); + for (idx = 0; idx < cnt; idx++) { + optptr = ares_array_at(*options, idx); + if (optptr == NULL) { + return ARES_EFORMERR; + } + if (optptr->opt == opt) { + break; + } + } + + /* Duplicate entry, replace */ + if (idx != cnt && optptr != NULL) { + goto done; + } + + status = ares_array_insert_last((void **)&optptr, *options); + if (status != ARES_SUCCESS) { + return status; + } + +done: + ares_free(optptr->val); + optptr->opt = opt; + optptr->val = val; + optptr->val_len = val_len; + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, + unsigned short opt, const unsigned char *val, + size_t val_len) +{ + unsigned char *temp = NULL; + ares_status_t status; + + if (val != NULL) { + temp = ares_malloc(val_len + 1); + if (temp == NULL) { + return ARES_ENOMEM; + } + memcpy(temp, val, val_len); + temp[val_len] = 0; + } + + status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +ares_status_t ares_dns_rr_del_opt_byid(ares_dns_rr_t *dns_rr, + ares_dns_rr_key_t key, + unsigned short opt) +{ + ares_array_t **options; + const ares_dns_optval_t *optptr; + size_t idx; + size_t cnt; + + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { + return ARES_EFORMERR; + } + + options = ares_dns_rr_data_ptr(dns_rr, key, NULL); + if (options == NULL) { + return ARES_EFORMERR; + } + + /* No options */ + if (*options == NULL) { + return ARES_SUCCESS; + } + + cnt = ares_array_len(*options); + for (idx = 0; idx < cnt; idx++) { + optptr = ares_array_at_const(*options, idx); + if (optptr == NULL) { + return ARES_ENOTFOUND; + } + if (optptr->opt == opt) { + return ares_array_remove_at(*options, idx); + } + } + + return ARES_ENOTFOUND; +} + +char *ares_dns_addr_to_ptr(const struct ares_addr *addr) +{ + ares_buf_t *buf = NULL; + const unsigned char *ptr = NULL; + size_t ptr_len = 0; + size_t i; + ares_status_t status; + static const unsigned char hexbytes[] = "0123456789abcdef"; + + if (addr->family != AF_INET && addr->family != AF_INET6) { + goto fail; + } + + buf = ares_buf_create(); + if (buf == NULL) { + goto fail; + } + + if (addr->family == AF_INET) { + ptr = (const unsigned char *)&addr->addr.addr4; + ptr_len = 4; + } else { + ptr = (const unsigned char *)&addr->addr.addr6; + ptr_len = 16; + } + + for (i = ptr_len; i > 0; i--) { + if (addr->family == AF_INET) { + status = ares_buf_append_num_dec(buf, (size_t)ptr[i - 1], 0); + } else { + unsigned char c; + + c = ptr[i - 1] & 0xF; + status = ares_buf_append_byte(buf, hexbytes[c]); + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares_buf_append_byte(buf, '.'); + if (status != ARES_SUCCESS) { + goto fail; + } + + c = (ptr[i - 1] >> 4) & 0xF; + status = ares_buf_append_byte(buf, hexbytes[c]); + } + if (status != ARES_SUCCESS) { + goto fail; + } + + status = ares_buf_append_byte(buf, '.'); + if (status != ARES_SUCCESS) { + goto fail; + } + } + + if (addr->family == AF_INET) { + status = ares_buf_append(buf, (const unsigned char *)"in-addr.arpa", 12); + } else { + status = ares_buf_append(buf, (const unsigned char *)"ip6.arpa", 8); + } + if (status != ARES_SUCCESS) { + goto fail; + } + + return ares_buf_finish_str(buf, NULL); + +fail: + ares_buf_destroy(buf); + return NULL; +} + +ares_dns_rr_t *ares_dns_get_opt_rr(ares_dns_record_t *rec) +{ + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) { + ares_dns_rr_t *rr = ares_dns_record_rr_get(rec, ARES_SECTION_ADDITIONAL, i); + + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + return rr; + } + } + return NULL; +} + +const ares_dns_rr_t *ares_dns_get_opt_rr_const(const ares_dns_record_t *rec) +{ + size_t i; + for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get_const(rec, ARES_SECTION_ADDITIONAL, i); + + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { + return rr; + } + } + return NULL; +} + +/* Construct a DNS record for a name with given class and type. Used internally + * by ares_search() and ares_create_query(). + */ +ares_status_t + ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type, unsigned short id, + ares_dns_flags_t flags, size_t max_udp_size) +{ + ares_status_t status; + ares_dns_rr_t *rr = NULL; + + if (dnsrec == NULL) { + return ARES_EFORMERR; + } + + *dnsrec = NULL; + + /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */ + if (ares_is_onion_domain(name)) { + status = ARES_ENOTFOUND; + goto done; + } + + status = ares_dns_record_create(dnsrec, id, (unsigned short)flags, + ARES_OPCODE_QUERY, ARES_RCODE_NOERROR); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass); + if (status != ARES_SUCCESS) { + goto done; + } + + /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */ + if (max_udp_size > 0) { + /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT + * RR, so check here that it fits + */ + if (max_udp_size > 65535) { + status = ARES_EFORMERR; + goto done; + } + + status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, + (unsigned short)max_udp_size); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0); + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + if (status != ARES_SUCCESS) { + ares_dns_record_destroy(*dnsrec); + *dnsrec = NULL; + } + return status; +} + +ares_status_t ares_dns_record_duplicate_ex(ares_dns_record_t **dest, + const ares_dns_record_t *src) +{ + unsigned char *data = NULL; + size_t data_len = 0; + ares_status_t status; + + if (dest == NULL || src == NULL) { + return ARES_EFORMERR; + } + + *dest = NULL; + + status = ares_dns_write(src, &data, &data_len); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_parse(data, data_len, 0, dest); + ares_free(data); + + return status; +} + +ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec) +{ + ares_dns_record_t *dest = NULL; + + ares_dns_record_duplicate_ex(&dest, dnsrec); + return dest; +} diff --git a/deps/cares/src/lib/record/ares_dns_write.c b/deps/cares/src/lib/record/ares_dns_write.c new file mode 100644 index 00000000000000..549017ffbc1768 --- /dev/null +++ b/deps/cares/src/lib/record/ares_dns_write.c @@ -0,0 +1,1229 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include <limits.h> +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + + +static ares_status_t ares_dns_write_header(const ares_dns_record_t *dnsrec, + ares_buf_t *buf) +{ + unsigned short u16; + unsigned short opcode; + unsigned short rcode; + + ares_status_t status; + + /* ID */ + status = ares_buf_append_be16(buf, dnsrec->id); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Flags */ + u16 = 0; + + /* QR */ + if (dnsrec->flags & ARES_FLAG_QR) { + u16 |= 0x8000; + } + + /* OPCODE */ + opcode = (unsigned short)(dnsrec->opcode & 0xF); + opcode <<= 11; + u16 |= opcode; + + /* AA */ + if (dnsrec->flags & ARES_FLAG_AA) { + u16 |= 0x400; + } + + /* TC */ + if (dnsrec->flags & ARES_FLAG_TC) { + u16 |= 0x200; + } + + /* RD */ + if (dnsrec->flags & ARES_FLAG_RD) { + u16 |= 0x100; + } + + /* RA */ + if (dnsrec->flags & ARES_FLAG_RA) { + u16 |= 0x80; + } + + /* Z -- unused */ + + /* AD */ + if (dnsrec->flags & ARES_FLAG_AD) { + u16 |= 0x20; + } + + /* CD */ + if (dnsrec->flags & ARES_FLAG_CD) { + u16 |= 0x10; + } + + /* RCODE */ + if (dnsrec->rcode > 15 && ares_dns_get_opt_rr_const(dnsrec) == NULL) { + /* Must have OPT RR in order to write extended error codes */ + rcode = ARES_RCODE_SERVFAIL; + } else { + rcode = (unsigned short)(dnsrec->rcode & 0xF); + } + u16 |= rcode; + + status = ares_buf_append_be16(buf, u16); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* QDCOUNT */ + status = ares_buf_append_be16( + buf, (unsigned short)ares_dns_record_query_cnt(dnsrec)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* ANCOUNT */ + status = ares_buf_append_be16( + buf, (unsigned short)ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* NSCOUNT */ + status = ares_buf_append_be16(buf, (unsigned short)ares_dns_record_rr_cnt( + dnsrec, ARES_SECTION_AUTHORITY)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* ARCOUNT */ + status = ares_buf_append_be16(buf, (unsigned short)ares_dns_record_rr_cnt( + dnsrec, ARES_SECTION_ADDITIONAL)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_questions(const ares_dns_record_t *dnsrec, + ares_llist_t **namelist, + ares_buf_t *buf) +{ + size_t i; + + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { + ares_status_t status; + const char *name = NULL; + ares_dns_rec_type_t qtype; + ares_dns_class_t qclass; + + status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass); + if (status != ARES_SUCCESS) { + return status; + } + + /* Name */ + status = ares_dns_name_write(buf, namelist, ARES_TRUE, name); + if (status != ARES_SUCCESS) { + return status; + } + + /* Type */ + status = ares_buf_append_be16(buf, (unsigned short)qtype); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Class */ + status = ares_buf_append_be16(buf, (unsigned short)qclass); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_name(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist, + ares_bool_t validate_hostname, + ares_dns_rr_key_t key) +{ + const char *name; + + name = ares_dns_rr_get_str(rr, key); + if (name == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + return ares_dns_name_write(buf, namelist, validate_hostname, name); +} + +static ares_status_t ares_dns_write_rr_str(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + const char *str; + size_t len; + ares_status_t status; + + str = ares_dns_rr_get_str(rr, key); + if (str == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + len = ares_strlen(str); + if (len > 255) { + return ARES_EFORMERR; + } + + /* Write 1 byte length */ + status = ares_buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + if (len == 0) { + return ARES_SUCCESS; + } + + /* Write string */ + return ares_buf_append(buf, (const unsigned char *)str, len); +} + +static ares_status_t ares_dns_write_binstr(ares_buf_t *buf, + const unsigned char *bin, + size_t bin_len) +{ + const unsigned char *ptr; + size_t ptr_len; + ares_status_t status; + + /* split into possible multiple 255-byte or less length strings */ + ptr = bin; + ptr_len = bin_len; + do { + size_t len = ptr_len; + if (len > 255) { + len = 255; + } + + /* Length */ + status = ares_buf_append_byte(buf, (unsigned char)(len & 0xFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* String */ + if (len) { + status = ares_buf_append(buf, ptr, len); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + ptr += len; + ptr_len -= len; + } while (ptr_len > 0); + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_abin(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + ares_status_t status = ARES_EFORMERR; + size_t i; + size_t cnt = ares_dns_rr_get_abin_cnt(rr, key); + + if (cnt == 0) { + return ARES_EFORMERR; + } + + for (i = 0; i < cnt; i++) { + const unsigned char *bin; + size_t bin_len; + + bin = ares_dns_rr_get_abin(rr, key, i, &bin_len); + + status = ares_dns_write_binstr(buf, bin, bin_len); + if (status != ARES_SUCCESS) { + break; + } + } + + return status; +} + +static ares_status_t ares_dns_write_rr_be32(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + return ares_buf_append_be32(buf, ares_dns_rr_get_u32(rr, key)); +} + +static ares_status_t ares_dns_write_rr_be16(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + return ares_buf_append_be16(buf, ares_dns_rr_get_u16(rr, key)); +} + +static ares_status_t ares_dns_write_rr_u8(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_dns_rr_key_t key) +{ + if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + return ares_buf_append_byte(buf, ares_dns_rr_get_u8(rr, key)); +} + +static ares_status_t ares_dns_write_rr_a(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + const struct in_addr *addr; + (void)namelist; + + addr = ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR); + if (addr == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + return ares_buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); +} + +static ares_status_t ares_dns_write_rr_ns(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_NS_NSDNAME); +} + +static ares_status_t ares_dns_write_rr_cname(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_CNAME_CNAME); +} + +static ares_status_t ares_dns_write_rr_soa(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + + /* MNAME */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_MNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* RNAME */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_RNAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* SERIAL */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_SERIAL); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* REFRESH */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_REFRESH); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* RETRY */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_RETRY); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* EXPIRE */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_EXPIRE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* MINIMUM */ + return ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_MINIMUM); +} + +static ares_status_t ares_dns_write_rr_ptr(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_PTR_DNAME); +} + +static ares_status_t ares_dns_write_rr_hinfo(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + + (void)namelist; + + /* CPU */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_CPU); + if (status != ARES_SUCCESS) { + return status; + } + + /* OS */ + return ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_OS); +} + +static ares_status_t ares_dns_write_rr_mx(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + + /* PREFERENCE */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_MX_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* EXCHANGE */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_MX_EXCHANGE); +} + +static ares_status_t ares_dns_write_rr_txt(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + (void)namelist; + return ares_dns_write_rr_abin(buf, rr, ARES_RR_TXT_DATA); +} + +static ares_status_t ares_dns_write_rr_sig(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + const unsigned char *data; + size_t len = 0; + + (void)namelist; + + /* TYPE COVERED */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SIG_TYPE_COVERED); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* ALGORITHM */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_SIG_ALGORITHM); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* LABELS */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_SIG_LABELS); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* ORIGINAL TTL */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SIG_ORIGINAL_TTL); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* EXPIRATION */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SIG_EXPIRATION); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* INCEPTION */ + status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SIG_INCEPTION); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* KEY TAG */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SIG_KEY_TAG); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* SIGNERS NAME */ + status = ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_SIG_SIGNERS_NAME); + if (status != ARES_SUCCESS) { + return status; + } + + /* SIGNATURE -- binary, rest of buffer, required to be non-zero length */ + data = ares_dns_rr_get_bin(rr, ARES_RR_SIG_SIGNATURE, &len); + if (data == NULL || len == 0) { + return ARES_EFORMERR; + } + + return ares_buf_append(buf, data, len); +} + +static ares_status_t ares_dns_write_rr_aaaa(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + const struct ares_in6_addr *addr; + (void)namelist; + + addr = ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR); + if (addr == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + return ares_buf_append(buf, (const unsigned char *)addr, sizeof(*addr)); +} + +static ares_status_t ares_dns_write_rr_srv(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PRIORITY); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* WEIGHT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_WEIGHT); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* PORT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PORT); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TARGET */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_SRV_TARGET); +} + +static ares_status_t ares_dns_write_rr_naptr(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + + /* ORDER */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_ORDER); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* PREFERENCE */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* FLAGS */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_FLAGS); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* SERVICES */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_SERVICES); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* REGEXP */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_REGEXP); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* REPLACEMENT */ + return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, + ARES_RR_NAPTR_REPLACEMENT); +} + +static ares_status_t ares_dns_write_rr_opt(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + size_t len = ares_buf_len(buf); + ares_status_t status; + unsigned int ttl = 0; + size_t i; + unsigned short rcode = (unsigned short)((rr->parent->rcode >> 4) & 0xFF); + + (void)namelist; + + /* Coverity reports on this even though its not possible when taken + * into context */ + if (len == 0) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* We need to go back and overwrite the class and ttl that were emitted as + * the OPT record overloads them for its own use (yes, very strange!) */ + status = ares_buf_set_length(buf, len - 2 /* RDLENGTH */ + - 4 /* TTL */ + - 2 /* CLASS */); + if (status != ARES_SUCCESS) { + return status; + } + + /* Class -> UDP Size */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_OPT_UDP_SIZE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TTL -> rcode (u8) << 24 | version (u8) << 16 | flags (u16) */ + ttl |= (unsigned int)rcode << 24; + ttl |= (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION) << 16; + ttl |= (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS); + + status = ares_buf_append_be32(buf, ttl); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Now go back to real end */ + status = ares_buf_set_length(buf, len); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Options */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_OPT_OPTIONS, i, &val, &val_len); + + /* BE16 option */ + status = ares_buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* BE16 length */ + status = ares_buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Value */ + if (val && val_len) { + status = ares_buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_tlsa(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + const unsigned char *data; + size_t len = 0; + + (void)namelist; + + /* CERT_USAGE */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* SELECTOR */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_SELECTOR); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* MATCH */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_MATCH); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* DATA -- binary, rest of buffer, required to be non-zero length */ + data = ares_dns_rr_get_bin(rr, ARES_RR_TLSA_DATA, &len); + if (data == NULL || len == 0) { + return ARES_EFORMERR; + } + + return ares_buf_append(buf, data, len); +} + +static ares_status_t ares_dns_write_rr_svcb(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + size_t i; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SVCB_PRIORITY); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TARGET */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SVCB_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Params */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_SVCB_PARAMS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_SVCB_PARAMS, i, &val, &val_len); + + /* BE16 option */ + status = ares_buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* BE16 length */ + status = ares_buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Value */ + if (val && val_len) { + status = ares_buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_https(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + size_t i; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_HTTPS_PRIORITY); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TARGET */ + status = + ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_HTTPS_TARGET); + if (status != ARES_SUCCESS) { + return status; + } + + /* Append Params */ + for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_HTTPS_PARAMS); i++) { + unsigned short opt; + size_t val_len; + const unsigned char *val; + + opt = ares_dns_rr_get_opt(rr, ARES_RR_HTTPS_PARAMS, i, &val, &val_len); + + /* BE16 option */ + status = ares_buf_append_be16(buf, opt); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* BE16 length */ + status = ares_buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Value */ + if (val && val_len) { + status = ares_buf_append(buf, val, val_len); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + } + return ARES_SUCCESS; +} + +static ares_status_t ares_dns_write_rr_uri(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + ares_status_t status; + const char *target; + + (void)namelist; + + /* PRIORITY */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_PRIORITY); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* WEIGHT */ + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_WEIGHT); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TARGET -- not in DNS string format, rest of buffer, required to be + * non-zero length */ + target = ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET); + if (target == NULL || ares_strlen(target) == 0) { + return ARES_EFORMERR; + } + + return ares_buf_append(buf, (const unsigned char *)target, + ares_strlen(target)); +} + +static ares_status_t ares_dns_write_rr_caa(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + const unsigned char *data = NULL; + size_t data_len = 0; + ares_status_t status; + + (void)namelist; + + /* CRITICAL */ + status = ares_dns_write_rr_u8(buf, rr, ARES_RR_CAA_CRITICAL); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Tag */ + status = ares_dns_write_rr_str(buf, rr, ARES_RR_CAA_TAG); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Value - binary! (remaining buffer */ + data = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &data_len); + if (data == NULL || data_len == 0) { + return ARES_EFORMERR; + } + + return ares_buf_append(buf, data, data_len); +} + +static ares_status_t ares_dns_write_rr_raw_rr(ares_buf_t *buf, + const ares_dns_rr_t *rr, + ares_llist_t **namelist) +{ + size_t len = ares_buf_len(buf); + ares_status_t status; + const unsigned char *data = NULL; + size_t data_len = 0; + + (void)namelist; + + /* Coverity reports on this even though its not possible when taken + * into context */ + if (len == 0) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* We need to go back and overwrite the type that was emitted by the parent + * function */ + status = ares_buf_set_length(buf, len - 2 /* RDLENGTH */ + - 4 /* TTL */ + - 2 /* CLASS */ + - 2 /* TYPE */); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_dns_write_rr_be16(buf, rr, ARES_RR_RAW_RR_TYPE); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Now go back to real end */ + status = ares_buf_set_length(buf, len); + if (status != ARES_SUCCESS) { + return status; + } + + /* Output raw data */ + data = ares_dns_rr_get_bin(rr, ARES_RR_RAW_RR_DATA, &data_len); + if (data == NULL) { + return ARES_EFORMERR; + } + + if (data_len == 0) { + return ARES_SUCCESS; + } + + return ares_buf_append(buf, data, data_len); +} + +static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec, + ares_llist_t **namelist, + ares_dns_section_t section, + ares_buf_t *buf) +{ + size_t i; + + for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { + const ares_dns_rr_t *rr; + ares_dns_rec_type_t type; + ares_bool_t allow_compress; + ares_llist_t **namelistptr = NULL; + size_t pos_len; + ares_status_t status; + size_t rdlength; + size_t end_length; + unsigned int ttl; + + rr = ares_dns_record_rr_get_const(dnsrec, section, i); + if (rr == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + type = ares_dns_rr_get_type(rr); + allow_compress = ares_dns_rec_allow_name_comp(type); + if (allow_compress) { + namelistptr = namelist; + } + + /* Name */ + status = + ares_dns_name_write(buf, namelist, ARES_TRUE, ares_dns_rr_get_name(rr)); + if (status != ARES_SUCCESS) { + return status; + } + + /* Type */ + status = ares_buf_append_be16(buf, (unsigned short)type); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Class */ + status = + ares_buf_append_be16(buf, (unsigned short)ares_dns_rr_get_class(rr)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* TTL */ + ttl = ares_dns_rr_get_ttl(rr); + if (rr->parent->ttl_decrement > ttl) { + ttl = 0; + } else { + ttl -= rr->parent->ttl_decrement; + } + status = ares_buf_append_be32(buf, ttl); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Length */ + pos_len = ares_buf_len(buf); /* Save to write real length later */ + status = ares_buf_append_be16(buf, 0); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Data */ + switch (type) { + case ARES_REC_TYPE_A: + status = ares_dns_write_rr_a(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_NS: + status = ares_dns_write_rr_ns(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_CNAME: + status = ares_dns_write_rr_cname(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SOA: + status = ares_dns_write_rr_soa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_PTR: + status = ares_dns_write_rr_ptr(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_HINFO: + status = ares_dns_write_rr_hinfo(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_MX: + status = ares_dns_write_rr_mx(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_TXT: + status = ares_dns_write_rr_txt(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SIG: + status = ares_dns_write_rr_sig(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_AAAA: + status = ares_dns_write_rr_aaaa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SRV: + status = ares_dns_write_rr_srv(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_NAPTR: + status = ares_dns_write_rr_naptr(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_ANY: + status = ARES_EFORMERR; + break; + case ARES_REC_TYPE_OPT: + status = ares_dns_write_rr_opt(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_TLSA: + status = ares_dns_write_rr_tlsa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_SVCB: + status = ares_dns_write_rr_svcb(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_HTTPS: + status = ares_dns_write_rr_https(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_URI: + status = ares_dns_write_rr_uri(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_CAA: + status = ares_dns_write_rr_caa(buf, rr, namelistptr); + break; + case ARES_REC_TYPE_RAW_RR: + status = ares_dns_write_rr_raw_rr(buf, rr, namelistptr); + break; + } + + if (status != ARES_SUCCESS) { + return status; + } + + /* Back off write pointer, write real length, then go back to proper + * position */ + end_length = ares_buf_len(buf); + rdlength = end_length - pos_len - 2; + + status = ares_buf_set_length(buf, pos_len); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_buf_append_be16(buf, (unsigned short)(rdlength & 0xFFFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_set_length(buf, end_length); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ARES_SUCCESS; +} + +ares_status_t ares_dns_write_buf(const ares_dns_record_t *dnsrec, + ares_buf_t *buf) +{ + ares_llist_t *namelist = NULL; + size_t orig_len; + ares_status_t status; + + if (dnsrec == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + orig_len = ares_buf_len(buf); + + status = ares_dns_write_header(dnsrec, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_questions(dnsrec, &namelist, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ANSWER, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_AUTHORITY, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ADDITIONAL, buf); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_llist_destroy(namelist); + if (status != ARES_SUCCESS) { + ares_buf_set_length(buf, orig_len); + } + + return status; +} + +ares_status_t ares_dns_write_buf_tcp(const ares_dns_record_t *dnsrec, + ares_buf_t *buf) +{ + ares_status_t status; + size_t orig_len; + size_t msg_len; + size_t len; + + if (dnsrec == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + orig_len = ares_buf_len(buf); + + /* Write placeholder for length */ + status = ares_buf_append_be16(buf, 0); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* Write message */ + status = ares_dns_write_buf(dnsrec, buf); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + len = ares_buf_len(buf); + msg_len = len - orig_len - 2; + if (msg_len > 65535) { + status = ARES_EBADQUERY; + goto done; + } + + /* Now we need to overwrite the length, so we jump back to the original + * message length, overwrite the section and jump back */ + ares_buf_set_length(buf, orig_len); + status = ares_buf_append_be16(buf, (unsigned short)(msg_len & 0xFFFF)); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: UntestablePath */ + } + ares_buf_set_length(buf, len); + +done: + if (status != ARES_SUCCESS) { + ares_buf_set_length(buf, orig_len); + } + return status; +} + +ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec, + unsigned char **buf, size_t *buf_len) +{ + ares_buf_t *b = NULL; + ares_status_t status; + + if (buf == NULL || buf_len == NULL || dnsrec == NULL) { + return ARES_EFORMERR; + } + + *buf = NULL; + *buf_len = 0; + + b = ares_buf_create(); + if (b == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_dns_write_buf(dnsrec, b); + + if (status != ARES_SUCCESS) { + ares_buf_destroy(b); + return status; + } + + *buf = ares_buf_finish_bin(b, buf_len); + return status; +} + +void ares_dns_record_ttl_decrement(ares_dns_record_t *dnsrec, + unsigned int ttl_decrement) +{ + if (dnsrec == NULL) { + return; + } + dnsrec->ttl_decrement = ttl_decrement; +} diff --git a/deps/cares/src/lib/setup_once.h b/deps/cares/src/lib/setup_once.h deleted file mode 100644 index a6168c9aed5365..00000000000000 --- a/deps/cares/src/lib/setup_once.h +++ /dev/null @@ -1,469 +0,0 @@ -/* MIT License - * - * Copyright (c) 2004 Daniel Stenberg - * - * 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 (including the next - * paragraph) 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. - * - * SPDX-License-Identifier: MIT - */ -#ifndef __SETUP_ONCE_H -#define __SETUP_ONCE_H - - -/******************************************************************** - * NOTICE * - * ======== * - * * - * Content of header files lib/setup_once.h and ares/setup_once.h * - * must be kept in sync. Modify the other one if you change this. * - * * - ********************************************************************/ - - -/* - * Inclusion of common header files. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <ctype.h> - -#ifdef HAVE_ERRNO_H -# include <errno.h> -#endif - -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif - -#ifdef NEED_MALLOC_H -# include <malloc.h> -#endif - -#ifdef NEED_MEMORY_H -# include <memory.h> -#endif - -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif - -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -#endif - -#ifdef HAVE_TIME_H -# include <time.h> -#endif - -#ifdef WIN32 -# include <io.h> -# include <fcntl.h> -#endif - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifdef __hpux -# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) -# ifdef _APP32_64BIT_OFF_T -# define OLD_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T -# undef _APP32_64BIT_OFF_T -# else -# undef OLD_APP32_64BIT_OFF_T -# endif -# endif -#endif - -#ifdef HAVE_SYS_SOCKET_H -# include <sys/socket.h> -#endif - -#ifdef __hpux -# if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) -# ifdef OLD_APP32_64BIT_OFF_T -# define _APP32_64BIT_OFF_T OLD_APP32_64BIT_OFF_T -# undef OLD_APP32_64BIT_OFF_T -# endif -# endif -#endif - - -/* - * Definition of timeval struct for platforms that don't have it. - */ - -#ifndef HAVE_STRUCT_TIMEVAL -struct timeval { - long tv_sec; - long tv_usec; -}; -#endif - - -/* - * If we have the MSG_NOSIGNAL define, make sure we use - * it as the fourth argument of function send() - */ - -#ifdef HAVE_MSG_NOSIGNAL -# define SEND_4TH_ARG MSG_NOSIGNAL -#else -# define SEND_4TH_ARG 0 -#endif - - -#if defined(__minix) -/* Minix doesn't support recv on TCP sockets */ -# define sread(x, y, z) \ - (ares_ssize_t) \ - read((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), (RECV_TYPE_ARG3)(z)) - -#elif defined(HAVE_RECV) -/* - * The definitions for the return type and arguments types - * of functions recv() and send() belong and come from the - * configuration file. Do not define them in any other place. - * - * HAVE_RECV is defined if you have a function named recv() - * which is used to read incoming data from sockets. If your - * function has another name then don't define HAVE_RECV. - * - * If HAVE_RECV is defined then RECV_TYPE_ARG1, RECV_TYPE_ARG2, - * RECV_TYPE_ARG3, RECV_TYPE_ARG4 and RECV_TYPE_RETV must also - * be defined. - * - * HAVE_SEND is defined if you have a function named send() - * which is used to write outgoing data on a connected socket. - * If yours has another name then don't define HAVE_SEND. - * - * If HAVE_SEND is defined then SEND_TYPE_ARG1, SEND_QUAL_ARG2, - * SEND_TYPE_ARG2, SEND_TYPE_ARG3, SEND_TYPE_ARG4 and - * SEND_TYPE_RETV must also be defined. - */ - -# if !defined(RECV_TYPE_ARG1) || !defined(RECV_TYPE_ARG2) || \ - !defined(RECV_TYPE_ARG3) || !defined(RECV_TYPE_ARG4) || \ - !defined(RECV_TYPE_RETV) -/* */ -Error Missing_definition_of_return_and_arguments_types_of_recv -/* */ -# else -# define sread(x, y, z) \ - (ares_ssize_t) recv((RECV_TYPE_ARG1)(x), (RECV_TYPE_ARG2)(y), \ - (RECV_TYPE_ARG3)(z), (RECV_TYPE_ARG4)(0)) -# endif -#else /* HAVE_RECV */ -# ifndef sread -/* */ -Error Missing_definition_of_macro_sread -/* */ -# endif -#endif /* HAVE_RECV */ - - -#if defined(__minix) -/* Minix doesn't support send on TCP sockets */ -# define swrite(x, y, z) \ - (ares_ssize_t) \ - write((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), (SEND_TYPE_ARG3)(z)) - -#elif defined(HAVE_SEND) -# if !defined(SEND_TYPE_ARG1) || !defined(SEND_QUAL_ARG2) || \ - !defined(SEND_TYPE_ARG2) || !defined(SEND_TYPE_ARG3) || \ - !defined(SEND_TYPE_ARG4) || !defined(SEND_TYPE_RETV) - /* */ - Error Missing_definition_of_return_and_arguments_types_of_send -/* */ -# else -# define swrite(x, y, z) \ - (ares_ssize_t) send((SEND_TYPE_ARG1)(x), (SEND_TYPE_ARG2)(y), \ - (SEND_TYPE_ARG3)(z), (SEND_TYPE_ARG4)(SEND_4TH_ARG)) -# endif -#else /* HAVE_SEND */ -# ifndef swrite - /* */ - Error Missing_definition_of_macro_swrite -/* */ -# endif -#endif /* HAVE_SEND */ - - -#if 0 -# if defined(HAVE_RECVFROM) -/* - * Currently recvfrom is only used on udp sockets. - */ -# if !defined(RECVFROM_TYPE_ARG1) || !defined(RECVFROM_TYPE_ARG2) || \ - !defined(RECVFROM_TYPE_ARG3) || !defined(RECVFROM_TYPE_ARG4) || \ - !defined(RECVFROM_TYPE_ARG5) || !defined(RECVFROM_TYPE_ARG6) || \ - !defined(RECVFROM_TYPE_RETV) - /* */ - Error Missing_definition_of_return_and_arguments_types_of_recvfrom - /* */ -# else -# define sreadfrom(s, b, bl, f, fl) \ - (ares_ssize_t) \ - recvfrom((RECVFROM_TYPE_ARG1)(s), (RECVFROM_TYPE_ARG2 *)(b), \ - (RECVFROM_TYPE_ARG3)(bl), (RECVFROM_TYPE_ARG4)(0), \ - (RECVFROM_TYPE_ARG5 *)(f), (RECVFROM_TYPE_ARG6 *)(fl)) -# endif -# else /* HAVE_RECVFROM */ -# ifndef sreadfrom - /* */ - Error Missing_definition_of_macro_sreadfrom - /* */ -# endif -# endif /* HAVE_RECVFROM */ - - -# ifdef RECVFROM_TYPE_ARG6_IS_VOID -# define RECVFROM_ARG6_T int -# else -# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6 -# endif -#endif /* if 0 */ - - -/* - * Function-like macro definition used to close a socket. - */ - -#if defined(HAVE_CLOSESOCKET) -# define sclose(x) closesocket((x)) -#elif defined(HAVE_CLOSESOCKET_CAMEL) -# define sclose(x) CloseSocket((x)) -#elif defined(HAVE_CLOSE_S) -# define sclose(x) close_s((x)) -#else -# define sclose(x) close((x)) -#endif - - -/* - * Uppercase macro versions of ANSI/ISO is*() functions/macros which - * avoid negative number inputs with argument byte codes > 127. - */ - -#define ISSPACE(x) (isspace((int)((unsigned char)x))) -#define ISDIGIT(x) (isdigit((int)((unsigned char)x))) -#define ISALNUM(x) (isalnum((int)((unsigned char)x))) -#define ISXDIGIT(x) (isxdigit((int)((unsigned char)x))) -#define ISGRAPH(x) (isgraph((int)((unsigned char)x))) -#define ISALPHA(x) (isalpha((int)((unsigned char)x))) -#define ISPRINT(x) (isprint((int)((unsigned char)x))) -#define ISUPPER(x) (isupper((int)((unsigned char)x))) -#define ISLOWER(x) (islower((int)((unsigned char)x))) -#define ISASCII(x) (((unsigned char)x) <= 127 ? 1 : 0) - -#define ISBLANK(x) \ - (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t')) - -#define TOLOWER(x) (tolower((int)((unsigned char)x))) - - -/* - * Macro WHILE_FALSE may be used to build single-iteration do-while loops, - * avoiding compiler warnings. Mostly intended for other macro definitions. - */ - -#define WHILE_FALSE while (0) - -#if defined(_MSC_VER) && !defined(__POCC__) -# undef WHILE_FALSE -# if (_MSC_VER < 1500) -# define WHILE_FALSE while (1, 0) -# else -# define WHILE_FALSE \ - __pragma(warning(push)) __pragma(warning(disable : 4127)) while (0) \ - __pragma(warning(pop)) -# endif -#endif - - -/* - * Macro used to include code only in debug builds. - */ - -#ifdef DEBUGBUILD -# define DEBUGF(x) x -#else -# define DEBUGF(x) \ - do { \ - } \ - WHILE_FALSE -#endif - - -/* - * Macro used to include assertion code only in debug builds. - */ - -#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H) -# define DEBUGASSERT(x) assert(x) -#else -# define DEBUGASSERT(x) \ - do { \ - } \ - WHILE_FALSE -#endif - - -/* - * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno - * (or equivalent) on this platform to hide platform details to code using it. - */ - -#ifdef USE_WINSOCK -# define SOCKERRNO ((int)WSAGetLastError()) -# define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) -#else -# define SOCKERRNO (errno) -# define SET_SOCKERRNO(x) (errno = (x)) -#endif - - -/* - * Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno - * (or equivalent) on this platform to hide platform details to code using it. - */ - -#if defined(WIN32) && !defined(WATT32) -# define ERRNO ((int)GetLastError()) -# define SET_ERRNO(x) (SetLastError((DWORD)(x))) -#else -# define ERRNO (errno) -# define SET_ERRNO(x) (errno = (x)) -#endif - - -/* - * Portable error number symbolic names defined to Winsock error codes. - */ - -#ifdef USE_WINSOCK -# undef EBADF /* override definition in errno.h */ -# define EBADF WSAEBADF -# undef EINTR /* override definition in errno.h */ -# define EINTR WSAEINTR -# undef EINVAL /* override definition in errno.h */ -# define EINVAL WSAEINVAL -# undef EWOULDBLOCK /* override definition in errno.h */ -# define EWOULDBLOCK WSAEWOULDBLOCK -# undef EINPROGRESS /* override definition in errno.h */ -# define EINPROGRESS WSAEINPROGRESS -# undef EALREADY /* override definition in errno.h */ -# define EALREADY WSAEALREADY -# undef ENOTSOCK /* override definition in errno.h */ -# define ENOTSOCK WSAENOTSOCK -# undef EDESTADDRREQ /* override definition in errno.h */ -# define EDESTADDRREQ WSAEDESTADDRREQ -# undef EMSGSIZE /* override definition in errno.h */ -# define EMSGSIZE WSAEMSGSIZE -# undef EPROTOTYPE /* override definition in errno.h */ -# define EPROTOTYPE WSAEPROTOTYPE -# undef ENOPROTOOPT /* override definition in errno.h */ -# define ENOPROTOOPT WSAENOPROTOOPT -# undef EPROTONOSUPPORT /* override definition in errno.h */ -# define EPROTONOSUPPORT WSAEPROTONOSUPPORT -# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT -# undef EOPNOTSUPP /* override definition in errno.h */ -# define EOPNOTSUPP WSAEOPNOTSUPP -# define EPFNOSUPPORT WSAEPFNOSUPPORT -# undef EAFNOSUPPORT /* override definition in errno.h */ -# define EAFNOSUPPORT WSAEAFNOSUPPORT -# undef EADDRINUSE /* override definition in errno.h */ -# define EADDRINUSE WSAEADDRINUSE -# undef EADDRNOTAVAIL /* override definition in errno.h */ -# define EADDRNOTAVAIL WSAEADDRNOTAVAIL -# undef ENETDOWN /* override definition in errno.h */ -# define ENETDOWN WSAENETDOWN -# undef ENETUNREACH /* override definition in errno.h */ -# define ENETUNREACH WSAENETUNREACH -# undef ENETRESET /* override definition in errno.h */ -# define ENETRESET WSAENETRESET -# undef ECONNABORTED /* override definition in errno.h */ -# define ECONNABORTED WSAECONNABORTED -# undef ECONNRESET /* override definition in errno.h */ -# define ECONNRESET WSAECONNRESET -# undef ENOBUFS /* override definition in errno.h */ -# define ENOBUFS WSAENOBUFS -# undef EISCONN /* override definition in errno.h */ -# define EISCONN WSAEISCONN -# undef ENOTCONN /* override definition in errno.h */ -# define ENOTCONN WSAENOTCONN -# define ESHUTDOWN WSAESHUTDOWN -# define ETOOMANYREFS WSAETOOMANYREFS -# undef ETIMEDOUT /* override definition in errno.h */ -# define ETIMEDOUT WSAETIMEDOUT -# undef ECONNREFUSED /* override definition in errno.h */ -# define ECONNREFUSED WSAECONNREFUSED -# undef ELOOP /* override definition in errno.h */ -# define ELOOP WSAELOOP -# ifndef ENAMETOOLONG /* possible previous definition in errno.h */ -# define ENAMETOOLONG WSAENAMETOOLONG -# endif -# define EHOSTDOWN WSAEHOSTDOWN -# undef EHOSTUNREACH /* override definition in errno.h */ -# define EHOSTUNREACH WSAEHOSTUNREACH -# ifndef ENOTEMPTY /* possible previous definition in errno.h */ -# define ENOTEMPTY WSAENOTEMPTY -# endif -# define EPROCLIM WSAEPROCLIM -# define EUSERS WSAEUSERS -# define EDQUOT WSAEDQUOT -# define ESTALE WSAESTALE -# define EREMOTE WSAEREMOTE -#endif - - -/* - * Actually use __32_getpwuid() on 64-bit VMS builds for getpwuid() - */ - -#if defined(__VMS) && defined(__INITIAL_POINTER_SIZE) && \ - (__INITIAL_POINTER_SIZE == 64) -# define getpwuid __32_getpwuid -#endif - - -/* - * Macro argv_item_t hides platform details to code using it. - */ - -#ifdef __VMS -# define argv_item_t __char_ptr32 -#else -# define argv_item_t char * -#endif - - -/* - * We use this ZERO_NULL to avoid picky compiler warnings, - * when assigning a NULL pointer to a function pointer var. - */ - -#define ZERO_NULL 0 - - -#endif /* __SETUP_ONCE_H */ diff --git a/deps/cares/src/lib/str/ares_buf.c b/deps/cares/src/lib/str/ares_buf.c new file mode 100644 index 00000000000000..63acc6cf7714d3 --- /dev/null +++ b/deps/cares/src/lib/str/ares_buf.c @@ -0,0 +1,1498 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" +#include "ares_buf.h" +#include <limits.h> +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +struct ares_buf { + const unsigned char *data; /*!< pointer to start of data buffer */ + size_t data_len; /*!< total size of data in buffer */ + + unsigned char *alloc_buf; /*!< Pointer to allocated data buffer, + * not used for const buffers */ + size_t alloc_buf_len; /*!< Size of allocated data buffer */ + + size_t offset; /*!< Current working offset in buffer */ + size_t tag_offset; /*!< Tagged offset in buffer. Uses + * SIZE_MAX if not set. */ +}; + +ares_buf_t *ares_buf_create(void) +{ + ares_buf_t *buf = ares_malloc_zero(sizeof(*buf)); + if (buf == NULL) { + return NULL; + } + + buf->tag_offset = SIZE_MAX; + return buf; +} + +ares_buf_t *ares_buf_create_const(const unsigned char *data, size_t data_len) +{ + ares_buf_t *buf; + + if (data == NULL || data_len == 0) { + return NULL; + } + + buf = ares_buf_create(); + if (buf == NULL) { + return NULL; + } + + buf->data = data; + buf->data_len = data_len; + + return buf; +} + +void ares_buf_destroy(ares_buf_t *buf) +{ + if (buf == NULL) { + return; + } + ares_free(buf->alloc_buf); + ares_free(buf); +} + +static ares_bool_t ares_buf_is_const(const ares_buf_t *buf) +{ + if (buf == NULL) { + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (buf->data != NULL && buf->alloc_buf == NULL) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +void ares_buf_reclaim(ares_buf_t *buf) +{ + size_t prefix_size; + size_t data_size; + + if (buf == NULL) { + return; + } + + if (ares_buf_is_const(buf)) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Silence coverity. All lengths are zero so would bail out later but + * coverity doesn't know this */ + if (buf->alloc_buf == NULL) { + return; + } + + if (buf->tag_offset != SIZE_MAX && buf->tag_offset < buf->offset) { + prefix_size = buf->tag_offset; + } else { + prefix_size = buf->offset; + } + + if (prefix_size == 0) { + return; + } + + data_size = buf->data_len - prefix_size; + + memmove(buf->alloc_buf, buf->alloc_buf + prefix_size, data_size); + buf->data = buf->alloc_buf; + buf->data_len = data_size; + buf->offset -= prefix_size; + if (buf->tag_offset != SIZE_MAX) { + buf->tag_offset -= prefix_size; + } +} + +static ares_status_t ares_buf_ensure_space(ares_buf_t *buf, size_t needed_size) +{ + size_t remaining_size; + size_t alloc_size; + unsigned char *ptr; + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (ares_buf_is_const(buf)) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* When calling ares_buf_finish_str() we end up adding a null terminator, + * so we want to ensure the size is always sufficient for this as we don't + * want an ARES_ENOMEM at that point */ + needed_size++; + + /* No need to do an expensive move operation, we have enough to just append */ + remaining_size = buf->alloc_buf_len - buf->data_len; + if (remaining_size >= needed_size) { + return ARES_SUCCESS; + } + + /* See if just moving consumed data frees up enough space */ + ares_buf_reclaim(buf); + + remaining_size = buf->alloc_buf_len - buf->data_len; + if (remaining_size >= needed_size) { + return ARES_SUCCESS; + } + + alloc_size = buf->alloc_buf_len; + + /* Not yet started */ + if (alloc_size == 0) { + alloc_size = 16; /* Always shifts 1, so ends up being 32 minimum */ + } + + /* Increase allocation by powers of 2 */ + do { + alloc_size <<= 1; + remaining_size = alloc_size - buf->data_len; + } while (remaining_size < needed_size); + + ptr = ares_realloc(buf->alloc_buf, alloc_size); + if (ptr == NULL) { + return ARES_ENOMEM; + } + + buf->alloc_buf = ptr; + buf->alloc_buf_len = alloc_size; + buf->data = ptr; + + return ARES_SUCCESS; +} + +ares_status_t ares_buf_set_length(ares_buf_t *buf, size_t len) +{ + if (buf == NULL || ares_buf_is_const(buf)) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (len >= buf->alloc_buf_len - buf->offset) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + buf->data_len = len + buf->offset; + return ARES_SUCCESS; +} + +ares_status_t ares_buf_append(ares_buf_t *buf, const unsigned char *data, + size_t data_len) +{ + ares_status_t status; + + if (data == NULL && data_len != 0) { + return ARES_EFORMERR; + } + + if (data_len == 0) { + return ARES_SUCCESS; + } + + status = ares_buf_ensure_space(buf, data_len); + if (status != ARES_SUCCESS) { + return status; + } + + memcpy(buf->alloc_buf + buf->data_len, data, data_len); + buf->data_len += data_len; + return ARES_SUCCESS; +} + +ares_status_t ares_buf_append_byte(ares_buf_t *buf, unsigned char b) +{ + return ares_buf_append(buf, &b, 1); +} + +ares_status_t ares_buf_append_be16(ares_buf_t *buf, unsigned short u16) +{ + ares_status_t status; + + status = ares_buf_append_byte(buf, (unsigned char)((u16 >> 8) & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_byte(buf, (unsigned char)(u16 & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_SUCCESS; +} + +ares_status_t ares_buf_append_be32(ares_buf_t *buf, unsigned int u32) +{ + ares_status_t status; + + status = ares_buf_append_byte(buf, ((unsigned char)(u32 >> 24) & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_byte(buf, ((unsigned char)(u32 >> 16) & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_byte(buf, ((unsigned char)(u32 >> 8) & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_byte(buf, ((unsigned char)u32 & 0xff)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_SUCCESS; +} + +unsigned char *ares_buf_append_start(ares_buf_t *buf, size_t *len) +{ + ares_status_t status; + + if (len == NULL || *len == 0) { + return NULL; + } + + status = ares_buf_ensure_space(buf, *len); + if (status != ARES_SUCCESS) { + return NULL; + } + + /* -1 for possible null terminator for ares_buf_finish_str() */ + *len = buf->alloc_buf_len - buf->data_len - 1; + return buf->alloc_buf + buf->data_len; +} + +void ares_buf_append_finish(ares_buf_t *buf, size_t len) +{ + if (buf == NULL) { + return; + } + + buf->data_len += len; +} + +unsigned char *ares_buf_finish_bin(ares_buf_t *buf, size_t *len) +{ + unsigned char *ptr = NULL; + if (buf == NULL || len == NULL || ares_buf_is_const(buf)) { + return NULL; + } + + ares_buf_reclaim(buf); + + /* We don't want to return NULL except on failure, may be zero-length */ + if (buf->alloc_buf == NULL && ares_buf_ensure_space(buf, 1) != ARES_SUCCESS) { + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + ptr = buf->alloc_buf; + *len = buf->data_len; + ares_free(buf); + return ptr; +} + +char *ares_buf_finish_str(ares_buf_t *buf, size_t *len) +{ + char *ptr; + size_t mylen; + + ptr = (char *)ares_buf_finish_bin(buf, &mylen); + if (ptr == NULL) { + return NULL; + } + + if (len != NULL) { + *len = mylen; + } + + /* NOTE: ensured via ares_buf_ensure_space() that there is always at least + * 1 extra byte available for this specific use-case */ + ptr[mylen] = 0; + + return ptr; +} + +void ares_buf_tag(ares_buf_t *buf) +{ + if (buf == NULL) { + return; + } + + buf->tag_offset = buf->offset; +} + +ares_status_t ares_buf_tag_rollback(ares_buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return ARES_EFORMERR; + } + + buf->offset = buf->tag_offset; + buf->tag_offset = SIZE_MAX; + return ARES_SUCCESS; +} + +ares_status_t ares_buf_tag_clear(ares_buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return ARES_EFORMERR; + } + + buf->tag_offset = SIZE_MAX; + return ARES_SUCCESS; +} + +const unsigned char *ares_buf_tag_fetch(const ares_buf_t *buf, size_t *len) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL) { + return NULL; + } + + *len = buf->offset - buf->tag_offset; + return buf->data + buf->tag_offset; +} + +size_t ares_buf_tag_length(const ares_buf_t *buf) +{ + if (buf == NULL || buf->tag_offset == SIZE_MAX) { + return 0; + } + return buf->offset - buf->tag_offset; +} + +ares_status_t ares_buf_tag_fetch_bytes(const ares_buf_t *buf, + unsigned char *bytes, size_t *len) +{ + size_t ptr_len = 0; + const unsigned char *ptr = ares_buf_tag_fetch(buf, &ptr_len); + + if (ptr == NULL || bytes == NULL || len == NULL) { + return ARES_EFORMERR; + } + + if (*len < ptr_len) { + return ARES_EFORMERR; + } + + *len = ptr_len; + + if (ptr_len > 0) { + memcpy(bytes, ptr, ptr_len); + } + return ARES_SUCCESS; +} + +ares_status_t ares_buf_tag_fetch_constbuf(const ares_buf_t *buf, + ares_buf_t **newbuf) +{ + size_t ptr_len = 0; + const unsigned char *ptr = ares_buf_tag_fetch(buf, &ptr_len); + + if (ptr == NULL || newbuf == NULL) { + return ARES_EFORMERR; + } + + *newbuf = ares_buf_create_const(ptr, ptr_len); + if (*newbuf == NULL) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +ares_status_t ares_buf_tag_fetch_string(const ares_buf_t *buf, char *str, + size_t len) +{ + size_t out_len; + ares_status_t status; + size_t i; + + if (str == NULL || len == 0) { + return ARES_EFORMERR; + } + + /* Space for NULL terminator */ + out_len = len - 1; + + status = ares_buf_tag_fetch_bytes(buf, (unsigned char *)str, &out_len); + if (status != ARES_SUCCESS) { + return status; + } + + /* NULL terminate */ + str[out_len] = 0; + + /* Validate string is printable */ + for (i = 0; i < out_len; i++) { + if (!ares_isprint(str[i])) { + return ARES_EBADSTR; + } + } + + return ARES_SUCCESS; +} + +ares_status_t ares_buf_tag_fetch_strdup(const ares_buf_t *buf, char **str) +{ + size_t ptr_len = 0; + const unsigned char *ptr = ares_buf_tag_fetch(buf, &ptr_len); + + if (ptr == NULL || str == NULL) { + return ARES_EFORMERR; + } + + if (!ares_str_isprint((const char *)ptr, ptr_len)) { + return ARES_EBADSTR; + } + + *str = ares_malloc(ptr_len + 1); + if (*str == NULL) { + return ARES_ENOMEM; + } + + if (ptr_len > 0) { + memcpy(*str, ptr, ptr_len); + } + (*str)[ptr_len] = 0; + return ARES_SUCCESS; +} + +static const unsigned char *ares_buf_fetch(const ares_buf_t *buf, size_t *len) +{ + if (len != NULL) { + *len = 0; + } + + if (buf == NULL || len == NULL || buf->data == NULL) { + return NULL; + } + + *len = buf->data_len - buf->offset; + if (*len == 0) { + return NULL; + } + + return buf->data + buf->offset; +} + +ares_status_t ares_buf_consume(ares_buf_t *buf, size_t len) +{ + size_t remaining_len = ares_buf_len(buf); + + if (remaining_len < len) { + return ARES_EBADRESP; + } + + buf->offset += len; + return ARES_SUCCESS; +} + +ares_status_t ares_buf_fetch_be16(ares_buf_t *buf, unsigned short *u16) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + unsigned int u32; + + if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16)) { + return ARES_EBADRESP; + } + + /* Do math in an unsigned int in order to prevent warnings due to automatic + * conversion by the compiler from short to int during shifts */ + u32 = ((unsigned int)(ptr[0]) << 8 | (unsigned int)ptr[1]); + *u16 = (unsigned short)(u32 & 0xFFFF); + + return ares_buf_consume(buf, sizeof(*u16)); +} + +ares_status_t ares_buf_fetch_be32(ares_buf_t *buf, unsigned int *u32) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) { + return ARES_EBADRESP; + } + + *u32 = ((unsigned int)(ptr[0]) << 24 | (unsigned int)(ptr[1]) << 16 | + (unsigned int)(ptr[2]) << 8 | (unsigned int)(ptr[3])); + + return ares_buf_consume(buf, sizeof(*u32)); +} + +ares_status_t ares_buf_fetch_bytes(ares_buf_t *buf, unsigned char *bytes, + size_t len) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + memcpy(bytes, ptr, len); + return ares_buf_consume(buf, len); +} + +ares_status_t ares_buf_fetch_bytes_dup(ares_buf_t *buf, size_t len, + ares_bool_t null_term, + unsigned char **bytes) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + *bytes = ares_malloc(null_term ? len + 1 : len); + if (*bytes == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memcpy(*bytes, ptr, len); + if (null_term) { + (*bytes)[len] = 0; + } + return ares_buf_consume(buf, len); +} + +ares_status_t ares_buf_fetch_str_dup(ares_buf_t *buf, size_t len, char **str) +{ + size_t remaining_len; + size_t i; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (buf == NULL || str == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + /* Validate string is printable */ + for (i = 0; i < len; i++) { + if (!ares_isprint(ptr[i])) { + return ARES_EBADSTR; + } + } + + *str = ares_malloc(len + 1); + if (*str == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + memcpy(*str, ptr, len); + (*str)[len] = 0; + + return ares_buf_consume(buf, len); +} + +ares_status_t ares_buf_fetch_bytes_into_buf(ares_buf_t *buf, ares_buf_t *dest, + size_t len) +{ + size_t remaining_len; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + ares_status_t status; + + if (buf == NULL || dest == NULL || len == 0 || remaining_len < len) { + return ARES_EBADRESP; + } + + status = ares_buf_append(dest, ptr, len); + if (status != ARES_SUCCESS) { + return status; + } + + return ares_buf_consume(buf, len); +} + +static ares_bool_t ares_is_whitespace(unsigned char c, + ares_bool_t include_linefeed) +{ + switch (c) { + case '\r': + case '\t': + case ' ': + case '\v': + case '\f': + return ARES_TRUE; + case '\n': + return include_linefeed; + default: + break; + } + return ARES_FALSE; +} + +size_t ares_buf_consume_whitespace(ares_buf_t *buf, + ares_bool_t include_linefeed) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + if (!ares_is_whitespace(ptr[i], include_linefeed)) { + break; + } + } + + if (i > 0) { + ares_buf_consume(buf, i); + } + return i; +} + +size_t ares_buf_consume_nonwhitespace(ares_buf_t *buf) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + if (ares_is_whitespace(ptr[i], ARES_TRUE)) { + break; + } + } + + if (i > 0) { + ares_buf_consume(buf, i); + } + return i; +} + +size_t ares_buf_consume_line(ares_buf_t *buf, ares_bool_t include_linefeed) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + if (ptr[i] == '\n') { + goto done; + } + } + +done: + if (include_linefeed && i < remaining_len && ptr[i] == '\n') { + i++; + } + + if (i > 0) { + ares_buf_consume(buf, i); + } + return i; +} + +size_t ares_buf_consume_until_charset(ares_buf_t *buf, + const unsigned char *charset, size_t len, + ares_bool_t require_charset) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + size_t pos; + ares_bool_t found = ARES_FALSE; + + if (ptr == NULL || charset == NULL || len == 0) { + return 0; + } + + /* Optimize for single character searches */ + if (len == 1) { + const unsigned char *p = memchr(ptr, charset[0], remaining_len); + if (p != NULL) { + found = ARES_TRUE; + pos = (size_t)(p - ptr); + } else { + pos = remaining_len; + } + goto done; + } + + for (pos = 0; pos < remaining_len; pos++) { + size_t j; + for (j = 0; j < len; j++) { + if (ptr[pos] == charset[j]) { + found = ARES_TRUE; + goto done; + } + } + } + +done: + if (require_charset && !found) { + return SIZE_MAX; + } + + if (pos > 0) { + ares_buf_consume(buf, pos); + } + return pos; +} + +size_t ares_buf_consume_until_seq(ares_buf_t *buf, const unsigned char *seq, + size_t len, ares_bool_t require_seq) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + const unsigned char *p; + size_t consume_len = 0; + + if (ptr == NULL || seq == NULL || len == 0) { + return 0; + } + + p = ares_memmem(ptr, remaining_len, seq, len); + if (require_seq && p == NULL) { + return SIZE_MAX; + } + + if (p != NULL) { + consume_len = (size_t)(p - ptr); + } else { + consume_len = remaining_len; + } + + if (consume_len > 0) { + ares_buf_consume(buf, consume_len); + } + + return consume_len; +} + +size_t ares_buf_consume_charset(ares_buf_t *buf, const unsigned char *charset, + size_t len) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + size_t i; + + if (ptr == NULL || charset == NULL || len == 0) { + return 0; + } + + for (i = 0; i < remaining_len; i++) { + size_t j; + for (j = 0; j < len; j++) { + if (ptr[i] == charset[j]) { + break; + } + } + /* Not found */ + if (j == len) { + break; + } + } + + if (i > 0) { + ares_buf_consume(buf, i); + } + return i; +} + +static void ares_buf_destroy_cb(void *arg) +{ + ares_buf_t **buf = arg; + ares_buf_destroy(*buf); +} + +static ares_bool_t ares_buf_split_isduplicate(ares_array_t *arr, + const unsigned char *val, + size_t len, + ares_buf_split_t flags) +{ + size_t i; + size_t num = ares_array_len(arr); + + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(arr, i); + const ares_buf_t *buf = *bufptr; + size_t plen = 0; + const unsigned char *ptr = ares_buf_peek(buf, &plen); + + /* Can't be duplicate if lengths mismatch */ + if (plen != len) { + continue; + } + + if (flags & ARES_BUF_SPLIT_CASE_INSENSITIVE) { + if (ares_memeq_ci(ptr, val, len)) { + return ARES_TRUE; + } + } else { + if (ares_memeq(ptr, val, len)) { + return ARES_TRUE; + } + } + } + + return ARES_FALSE; +} + +ares_status_t ares_buf_split(ares_buf_t *buf, const unsigned char *delims, + size_t delims_len, ares_buf_split_t flags, + size_t max_sections, ares_array_t **arr) +{ + ares_status_t status = ARES_SUCCESS; + ares_bool_t first = ARES_TRUE; + + if (buf == NULL || delims == NULL || delims_len == 0 || arr == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *arr = ares_array_create(sizeof(ares_buf_t *), ares_buf_destroy_cb); + if (*arr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + while (ares_buf_len(buf)) { + size_t len = 0; + const unsigned char *ptr; + + if (first) { + /* No delimiter yet, just tag the start */ + ares_buf_tag(buf); + } else { + if (flags & ARES_BUF_SPLIT_KEEP_DELIMS) { + /* tag then eat delimiter so its first byte in buffer */ + ares_buf_tag(buf); + ares_buf_consume(buf, 1); + } else { + /* throw away delimiter */ + ares_buf_consume(buf, 1); + ares_buf_tag(buf); + } + } + + if (max_sections && ares_array_len(*arr) >= max_sections - 1) { + ares_buf_consume(buf, ares_buf_len(buf)); + } else { + ares_buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE); + } + + ptr = ares_buf_tag_fetch(buf, &len); + + /* Shouldn't be possible */ + if (ptr == NULL) { + status = ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; + } + + if (flags & ARES_BUF_SPLIT_LTRIM) { + size_t i; + for (i = 0; i < len; i++) { + if (!ares_is_whitespace(ptr[i], ARES_TRUE)) { + break; + } + } + ptr += i; + len -= i; + } + + if (flags & ARES_BUF_SPLIT_RTRIM) { + while (len > 0 && ares_is_whitespace(ptr[len - 1], ARES_TRUE)) { + len--; + } + } + + if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) { + ares_buf_t *data; + + if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) || + !ares_buf_split_isduplicate(*arr, ptr, len, flags)) { + /* Since we don't allow const buffers of 0 length, and user wants + * 0-length buffers, swap what we do here */ + if (len) { + data = ares_buf_create_const(ptr, len); + } else { + data = ares_buf_create(); + } + + if (data == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares_array_insertdata_last(*arr, &data); + if (status != ARES_SUCCESS) { + ares_buf_destroy(data); + goto done; + } + } + } + + first = ARES_FALSE; + } + +done: + if (status != ARES_SUCCESS) { + ares_array_destroy(*arr); + *arr = NULL; + } + + return status; +} + +static void ares_free_split_array(void *arg) +{ + void **ptr = arg; + ares_free(*ptr); +} + +ares_status_t ares_buf_split_str_array(ares_buf_t *buf, + const unsigned char *delims, + size_t delims_len, + ares_buf_split_t flags, + size_t max_sections, ares_array_t **arr) +{ + ares_status_t status; + ares_array_t *split = NULL; + size_t i; + size_t len; + + if (arr == NULL) { + return ARES_EFORMERR; + } + + *arr = NULL; + + status = ares_buf_split(buf, delims, delims_len, flags, max_sections, &split); + if (status != ARES_SUCCESS) { + goto done; + } + + *arr = ares_array_create(sizeof(char *), ares_free_split_array); + if (*arr == NULL) { + status = ARES_ENOMEM; + goto done; + } + + len = ares_array_len(split); + for (i = 0; i < len; i++) { + ares_buf_t **bufptr = ares_array_at(split, i); + ares_buf_t *lbuf = *bufptr; + char *str = NULL; + + status = ares_buf_fetch_str_dup(lbuf, ares_buf_len(lbuf), &str); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_array_insertdata_last(*arr, &str); + if (status != ARES_SUCCESS) { + ares_free(str); + goto done; + } + } + +done: + ares_array_destroy(split); + if (status != ARES_SUCCESS) { + ares_array_destroy(*arr); + *arr = NULL; + } + return status; +} + +ares_status_t ares_buf_split_str(ares_buf_t *buf, const unsigned char *delims, + size_t delims_len, ares_buf_split_t flags, + size_t max_sections, char ***strs, + size_t *nstrs) +{ + ares_status_t status; + ares_array_t *arr = NULL; + + if (strs == NULL || nstrs == NULL) { + return ARES_EFORMERR; + } + + *strs = NULL; + *nstrs = 0; + + status = ares_buf_split_str_array(buf, delims, delims_len, flags, + max_sections, &arr); + + if (status != ARES_SUCCESS) { + goto done; + } + +done: + if (status == ARES_SUCCESS) { + *strs = ares_array_finish(arr, nstrs); + } else { + ares_array_destroy(arr); + } + return status; +} + +ares_bool_t ares_buf_begins_with(const ares_buf_t *buf, + const unsigned char *data, size_t data_len) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (ptr == NULL || data == NULL || data_len == 0) { + return ARES_FALSE; + } + + if (data_len > remaining_len) { + return ARES_FALSE; + } + + if (memcmp(ptr, data, data_len) != 0) { + return ARES_FALSE; + } + + return ARES_TRUE; +} + +size_t ares_buf_len(const ares_buf_t *buf) +{ + if (buf == NULL) { + return 0; + } + + return buf->data_len - buf->offset; +} + +const unsigned char *ares_buf_peek(const ares_buf_t *buf, size_t *len) +{ + return ares_buf_fetch(buf, len); +} + +ares_status_t ares_buf_replace(ares_buf_t *buf, const unsigned char *srch, + size_t srch_size, const unsigned char *rplc, + size_t rplc_size) +{ + size_t processed_len = 0; + ares_status_t status; + + if (buf->alloc_buf == NULL || srch == NULL || srch_size == 0 || + (rplc == NULL && rplc_size != 0)) { + return ARES_EFORMERR; + } + + while (1) { + unsigned char *ptr = buf->alloc_buf + buf->offset + processed_len; + size_t remaining_len = buf->data_len - buf->offset - processed_len; + size_t found_offset = 0; + size_t move_data_len; + + /* Find pattern */ + ptr = ares_memmem(ptr, remaining_len, srch, srch_size); + if (ptr == NULL) { + break; + } + + /* Store the offset this was found because our actual pointer might be + * switched out from under us by the call to ensure_space() if the + * replacement pattern is larger than the search pattern */ + found_offset = (size_t)(ptr - (size_t)(buf->alloc_buf + buf->offset)); + if (rplc_size > srch_size) { + status = ares_buf_ensure_space(buf, rplc_size - srch_size); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* Impossible, but silence clang */ + if (buf->alloc_buf == NULL) { + return ARES_ENOMEM; + } + + /* Recalculate actual pointer */ + ptr = buf->alloc_buf + buf->offset + found_offset; + + /* Move the data */ + move_data_len = buf->data_len - buf->offset - found_offset - srch_size; + memmove(ptr + rplc_size, + ptr + srch_size, + move_data_len); + + /* Copy in the replacement data */ + if (rplc != NULL && rplc_size > 0) { + memcpy(ptr, rplc, rplc_size); + } + + if (rplc_size > srch_size) { + buf->data_len += rplc_size - srch_size; + } else { + buf->data_len -= srch_size - rplc_size; + } + + processed_len = found_offset + rplc_size; + } + + return ARES_SUCCESS; +} + +ares_status_t ares_buf_peek_byte(const ares_buf_t *buf, unsigned char *b) +{ + size_t remaining_len = 0; + const unsigned char *ptr = ares_buf_fetch(buf, &remaining_len); + + if (buf == NULL || b == NULL) { + return ARES_EFORMERR; + } + + if (remaining_len == 0) { + return ARES_EBADRESP; + } + *b = ptr[0]; + return ARES_SUCCESS; +} + +size_t ares_buf_get_position(const ares_buf_t *buf) +{ + if (buf == NULL) { + return 0; + } + return buf->offset; +} + +ares_status_t ares_buf_set_position(ares_buf_t *buf, size_t idx) +{ + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (idx > buf->data_len) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + buf->offset = idx; + return ARES_SUCCESS; +} + +static ares_status_t + ares_buf_parse_dns_binstr_int(ares_buf_t *buf, size_t remaining_len, + unsigned char **bin, size_t *bin_len, + ares_bool_t validate_printable) +{ + unsigned char len; + ares_status_t status = ARES_EBADRESP; + ares_buf_t *binbuf = NULL; + + if (buf == NULL) { + return ARES_EFORMERR; + } + + if (remaining_len == 0) { + return ARES_EBADRESP; + } + + binbuf = ares_buf_create(); + if (binbuf == NULL) { + return ARES_ENOMEM; + } + + status = ares_buf_fetch_bytes(buf, &len, 1); + if (status != ARES_SUCCESS) { + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + remaining_len--; + + if (len > remaining_len) { + status = ARES_EBADRESP; + goto done; + } + + if (len) { + /* When used by the _str() parser, it really needs to be validated to + * be a valid printable ascii string. Do that here */ + if (validate_printable && ares_buf_len(buf) >= len) { + size_t mylen; + const char *data = (const char *)ares_buf_peek(buf, &mylen); + if (!ares_str_isprint(data, len)) { + status = ARES_EBADSTR; + goto done; + } + } + + if (bin != NULL) { + status = ares_buf_fetch_bytes_into_buf(buf, binbuf, len); + } else { + status = ares_buf_consume(buf, len); + } + } + +done: + if (status != ARES_SUCCESS) { + ares_buf_destroy(binbuf); + } else { + if (bin != NULL) { + size_t mylen = 0; + /* NOTE: we use ares_buf_finish_str() here as we guarantee NULL + * Termination even though we are technically returning binary data. + */ + *bin = (unsigned char *)ares_buf_finish_str(binbuf, &mylen); + *bin_len = mylen; + } + } + + return status; +} + +ares_status_t ares_buf_parse_dns_binstr(ares_buf_t *buf, size_t remaining_len, + unsigned char **bin, size_t *bin_len) +{ + return ares_buf_parse_dns_binstr_int(buf, remaining_len, bin, bin_len, + ARES_FALSE); +} + +ares_status_t ares_buf_parse_dns_str(ares_buf_t *buf, size_t remaining_len, + char **str) +{ + size_t len; + + return ares_buf_parse_dns_binstr_int(buf, remaining_len, + (unsigned char **)str, &len, ARES_TRUE); +} + +ares_status_t ares_buf_append_num_dec(ares_buf_t *buf, size_t num, size_t len) +{ + size_t i; + size_t mod; + + if (len == 0) { + len = ares_count_digits(num); + } + + mod = ares_pow(10, len); + + for (i = len; i > 0; i--) { + size_t digit = (num % mod); + ares_status_t status; + + mod /= 10; + + /* Silence coverity. Shouldn't be possible since we calculate it above */ + if (mod == 0) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + digit /= mod; + status = ares_buf_append_byte(buf, '0' + (unsigned char)(digit & 0xFF)); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + return ARES_SUCCESS; +} + +ares_status_t ares_buf_append_num_hex(ares_buf_t *buf, size_t num, size_t len) +{ + size_t i; + static const unsigned char hexbytes[] = "0123456789ABCDEF"; + + if (len == 0) { + len = ares_count_hexdigits(num); + } + + for (i = len; i > 0; i--) { + ares_status_t status; + status = ares_buf_append_byte(buf, hexbytes[(num >> ((i - 1) * 4)) & 0xF]); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + return ARES_SUCCESS; +} + +ares_status_t ares_buf_append_str(ares_buf_t *buf, const char *str) +{ + return ares_buf_append(buf, (const unsigned char *)str, ares_strlen(str)); +} + +static ares_status_t ares_buf_hexdump_line(ares_buf_t *buf, size_t idx, + const unsigned char *data, + size_t len) +{ + size_t i; + ares_status_t status; + + /* Address */ + status = ares_buf_append_num_hex(buf, idx, 6); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + /* | */ + status = ares_buf_append_str(buf, " | "); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (i = 0; i < 16; i++) { + if (i >= len) { + status = ares_buf_append_str(buf, " "); + } else { + status = ares_buf_append_num_hex(buf, data[i], 2); + } + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_buf_append_byte(buf, ' '); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + /* | */ + status = ares_buf_append_str(buf, " | "); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (i = 0; i < 16; i++) { + if (i >= len) { + break; + } + status = ares_buf_append_byte(buf, ares_isprint(data[i]) ? data[i] : '.'); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ares_buf_append_byte(buf, '\n'); +} + +ares_status_t ares_buf_hexdump(ares_buf_t *buf, const unsigned char *data, + size_t len) +{ + size_t i; + + /* Each line is 16 bytes */ + for (i = 0; i < len; i += 16) { + ares_status_t status; + status = ares_buf_hexdump_line(buf, i, data + i, len - i); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return ARES_SUCCESS; +} + +ares_status_t ares_buf_load_file(const char *filename, ares_buf_t *buf) +{ + FILE *fp = NULL; + unsigned char *ptr = NULL; + size_t len = 0; + size_t ptr_len = 0; + long ftell_len = 0; + ares_status_t status; + + if (filename == NULL || buf == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + fp = fopen(filename, "rb"); + if (fp == NULL) { + int error = errno; + switch (error) { + case ENOENT: + case ESRCH: + status = ARES_ENOTFOUND; + goto done; + default: + DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error, + strerror(error))); + DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename)); + status = ARES_EFILE; + goto done; + } + } + + /* Get length portably, fstat() is POSIX, not C */ + if (fseek(fp, 0, SEEK_END) != 0) { + status = ARES_EFILE; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ftell_len = ftell(fp); + if (ftell_len < 0) { + status = ARES_EFILE; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + len = (size_t)ftell_len; + + if (fseek(fp, 0, SEEK_SET) != 0) { + status = ARES_EFILE; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + if (len == 0) { + status = ARES_SUCCESS; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Read entire data into buffer */ + ptr_len = len; + ptr = ares_buf_append_start(buf, &ptr_len); + if (ptr == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto done; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + ptr_len = fread(ptr, 1, len, fp); + if (ptr_len != len) { + status = ARES_EFILE; /* LCOV_EXCL_LINE: DefensiveCoding */ + goto done; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + ares_buf_append_finish(buf, len); + status = ARES_SUCCESS; + +done: + if (fp != NULL) { + fclose(fp); + } + return status; +} diff --git a/deps/cares/src/lib/str/ares_str.c b/deps/cares/src/lib/str/ares_str.c new file mode 100644 index 00000000000000..0eda1ab9f15783 --- /dev/null +++ b/deps/cares/src/lib/str/ares_str.c @@ -0,0 +1,508 @@ +/* MIT License + * + * Copyright (c) 1998 Massachusetts Institute of Technology + * Copyright (c) The c-ares project and its contributors + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" +#include "ares_str.h" + +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +size_t ares_strnlen(const char *str, size_t maxlen) { + const char *p = NULL; + if (str == NULL) { + return 0; + } +#ifdef HAVE_STRNLEN + (void)p; + return strnlen(str, maxlen); +#else + if ((p = memchr(str, 0, maxlen)) == NULL) { + return maxlen; + } else { + return (size_t)(p - str); + } +#endif /* HAVE_STRNLEN */ +} + +size_t ares_strlen(const char *str) +{ + if (str == NULL) { + return 0; + } + + return strlen(str); +} + +char *ares_strdup(const char *s1) +{ + size_t len; + char *out; + + if (s1 == NULL) { + return NULL; + } + + len = ares_strlen(s1); + + /* Don't see how this is possible */ + if (len == SIZE_MAX) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + out = ares_malloc(len + 1); + if (out == NULL) { + return NULL; + } + + if (len) { + memcpy(out, s1, len); + } + + out[len] = 0; + return out; +} + +size_t ares_strcpy(char *dest, const char *src, size_t dest_size) +{ + size_t len = 0; + + if (dest == NULL || dest_size == 0) { + return 0; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + len = ares_strlen(src); + + if (len >= dest_size) { + len = dest_size - 1; + } + + if (len) { + memcpy(dest, src, len); + } + + dest[len] = 0; + return len; +} + +ares_bool_t ares_str_isnum(const char *str) +{ + size_t i; + + if (str == NULL || *str == 0) { + return ARES_FALSE; + } + + for (i = 0; str[i] != 0; i++) { + if (!ares_isdigit(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +ares_bool_t ares_str_isalnum(const char *str) +{ + size_t i; + + if (str == NULL || *str == 0) { + return ARES_FALSE; + } + + for (i = 0; str[i] != 0; i++) { + if (!ares_isdigit(str[i]) && !ares_isalpha(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +void ares_str_rtrim(char *str) +{ + size_t len; + size_t i; + + if (str == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + len = ares_strlen(str); + for (i = len; i > 0; i--) { + if (!ares_isspace(str[i - 1])) { + break; + } + } + str[i] = 0; +} + +void ares_str_ltrim(char *str) +{ + size_t i; + size_t len; + + if (str == NULL) { + return; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + for (i = 0; str[i] != 0 && ares_isspace(str[i]); i++) { + /* Do nothing */ + } + + if (i == 0) { + return; + } + + len = ares_strlen(str); + if (i != len) { + memmove(str, str + i, len - i); + } + str[len - i] = 0; +} + +void ares_str_trim(char *str) +{ + ares_str_ltrim(str); + ares_str_rtrim(str); +} + +/* tolower() is locale-specific. Use a lookup table fast conversion that only + * operates on ASCII */ +static const unsigned char ares_tolower_lookup[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, + 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, + 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, + 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, + 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, + 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, + 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, + 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, + 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, + 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, + 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, + 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +unsigned char ares_tolower(unsigned char c) +{ + return ares_tolower_lookup[c]; +} + +void ares_str_lower(char *str) +{ + size_t i; + + if (str == NULL) { + return; + } + + for (i = 0; str[i] != 0; i++) { + str[i] = (char)ares_tolower((unsigned char)str[i]); + } +} + +unsigned char *ares_memmem(const unsigned char *big, size_t big_len, + const unsigned char *little, size_t little_len) +{ + unsigned char *ptr; + + if (big == NULL || little == NULL || big_len == 0 || little_len == 0) { + return NULL; + } + +#ifdef HAVE_MEMMEM + ptr = memmem(big, big_len, little, little_len); + return ptr; +#else + while (1) { + ptr = memchr(big, little[0], big_len); + if (ptr == NULL) { + break; + } + + big_len -= (size_t)(ptr - big); + big = ptr; + if (big_len < little_len) { + break; + } + + if (memcmp(big, little, little_len) == 0) { + return ptr; + } + + big++; + big_len--; + } + + return NULL; +#endif +} + +ares_bool_t ares_memeq(const unsigned char *ptr, const unsigned char *val, + size_t len) +{ + return memcmp(ptr, val, len) == 0 ? ARES_TRUE : ARES_FALSE; +} + +ares_bool_t ares_memeq_ci(const unsigned char *ptr, const unsigned char *val, + size_t len) +{ + size_t i; + for (i = 0; i < len; i++) { + if (ares_tolower_lookup[ptr[i]] != ares_tolower_lookup[val[i]]) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +ares_bool_t ares_is_hostname(const char *str) +{ + size_t i; + + if (str == NULL) { + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + for (i = 0; str[i] != 0; i++) { + if (!ares_is_hostnamech(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +ares_bool_t ares_str_isprint(const char *str, size_t len) +{ + size_t i; + + if (str == NULL && len != 0) { + return ARES_FALSE; + } + + for (i = 0; i < len; i++) { + if (!ares_isprint(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +int ares_strcmp(const char *a, const char *b) +{ + if (a == NULL && b == NULL) { + return 0; + } + + if (a != NULL && b == NULL) { + if (*a == 0) { + return 0; + } + return 1; + } + + if (a == NULL && b != NULL) { + if (*b == 0) { + return 0; + } + return -1; + } + + return strcmp(a, b); +} + +int ares_strncmp(const char *a, const char *b, size_t n) +{ + if (n == 0) { + return 0; + } + + if (a == NULL && b == NULL) { + return 0; + } + + if (a != NULL && b == NULL) { + if (*a == 0) { + return 0; + } + return 1; + } + + if (a == NULL && b != NULL) { + if (*b == 0) { + return 0; + } + return -1; + } + + return strncmp(a, b, n); +} + +int ares_strcasecmp(const char *a, const char *b) +{ + if (a == NULL && b == NULL) { + return 0; + } + + if (a != NULL && b == NULL) { + if (*a == 0) { + return 0; + } + return 1; + } + + if (a == NULL && b != NULL) { + if (*b == 0) { + return 0; + } + return -1; + } + +#if defined(HAVE_STRCASECMP) + return strcasecmp(a, b); +#elif defined(HAVE_STRCMPI) + return strcmpi(a, b); +#elif defined(HAVE_STRICMP) + return stricmp(a, b); +#else + { + size_t i; + + for (i = 0; i < (size_t)-1; i++) { + int c1 = ares_tolower(a[i]); + int c2 = ares_tolower(b[i]); + if (c1 != c2) { + return c1 - c2; + } + if (!c1) { + break; + } + } + } + return 0; +#endif +} + +int ares_strncasecmp(const char *a, const char *b, size_t n) +{ + if (n == 0) { + return 0; + } + + if (a == NULL && b == NULL) { + return 0; + } + + if (a != NULL && b == NULL) { + if (*a == 0) { + return 0; + } + return 1; + } + + if (a == NULL && b != NULL) { + if (*b == 0) { + return 0; + } + return -1; + } + +#if defined(HAVE_STRNCASECMP) + return strncasecmp(a, b, n); +#elif defined(HAVE_STRNCMPI) + return strncmpi(a, b, n); +#elif defined(HAVE_STRNICMP) + return strnicmp(a, b, n); +#else + { + size_t i; + + for (i = 0; i < n; i++) { + int c1 = ares_tolower(a[i]); + int c2 = ares_tolower(b[i]); + if (c1 != c2) { + return c1 - c2; + } + if (!c1) { + break; + } + } + } + return 0; +#endif +} + +ares_bool_t ares_strcaseeq(const char *a, const char *b) +{ + return ares_strcasecmp(a, b) == 0 ? ARES_TRUE : ARES_FALSE; +} + +ares_bool_t ares_strcaseeq_max(const char *a, const char *b, size_t n) +{ + return ares_strncasecmp(a, b, n) == 0 ? ARES_TRUE : ARES_FALSE; +} + +ares_bool_t ares_streq(const char *a, const char *b) +{ + return ares_strcmp(a, b) == 0 ? ARES_TRUE : ARES_FALSE; +} + +ares_bool_t ares_streq_max(const char *a, const char *b, size_t n) +{ + return ares_strncmp(a, b, n) == 0 ? ARES_TRUE : ARES_FALSE; +} + +void ares_free_array(void *arrp, size_t nmembers, void (*freefunc)(void *)) +{ + size_t i; + void **arr = arrp; + + if (arr == NULL) { + return; + } + + if (freefunc != NULL) { + if (nmembers == SIZE_MAX) { + for (i = 0; arr[i] != NULL; i++) { + freefunc(arr[i]); + } + } else { + for (i = 0; i < nmembers; i++) { + freefunc(arr[i]); + } + } + } + + ares_free(arr); +} diff --git a/deps/cares/src/lib/str/ares_strsplit.c b/deps/cares/src/lib/str/ares_strsplit.c new file mode 100644 index 00000000000000..4431c5044d5d3c --- /dev/null +++ b/deps/cares/src/lib/str/ares_strsplit.c @@ -0,0 +1,90 @@ +/* MIT License + * + * Copyright (c) 2018 John Schember + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +void ares_strsplit_free(char **elms, size_t num_elm) +{ + ares_free_array(elms, num_elm, ares_free); +} + +char **ares_strsplit_duplicate(char **elms, size_t num_elm) +{ + size_t i; + char **out; + + if (elms == NULL || num_elm == 0) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + out = ares_malloc_zero(sizeof(*elms) * num_elm); + if (out == NULL) { + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + for (i = 0; i < num_elm; i++) { + out[i] = ares_strdup(elms[i]); + if (out[i] == NULL) { + ares_strsplit_free(out, num_elm); /* LCOV_EXCL_LINE: OutOfMemory */ + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + return out; +} + +char **ares_strsplit(const char *in, const char *delms, size_t *num_elm) +{ + ares_status_t status; + ares_buf_t *buf = NULL; + char **out = NULL; + + if (in == NULL || delms == NULL || num_elm == NULL) { + return NULL; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + *num_elm = 0; + + buf = ares_buf_create_const((const unsigned char *)in, ares_strlen(in)); + if (buf == NULL) { + return NULL; + } + + status = ares_buf_split_str( + buf, (const unsigned char *)delms, ares_strlen(delms), + ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &out, + num_elm); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_buf_destroy(buf); + if (status != ARES_SUCCESS) { + out = NULL; + } + + return out; +} diff --git a/deps/cares/src/lib/ares_strsplit.h b/deps/cares/src/lib/str/ares_strsplit.h similarity index 87% rename from deps/cares/src/lib/ares_strsplit.h rename to deps/cares/src/lib/str/ares_strsplit.h index af650eee534809..0da090263af691 100644 --- a/deps/cares/src/lib/ares_strsplit.h +++ b/deps/cares/src/lib/str/ares_strsplit.h @@ -26,8 +26,6 @@ #ifndef HEADER_CARES_STRSPLIT_H #define HEADER_CARES_STRSPLIT_H -#include "ares_setup.h" - /* Split a string on delms skipping empty or duplicate elements. * * param in String to split. @@ -42,12 +40,12 @@ * returns an allocated array of allocated string elements. * */ -char **ares__strsplit(const char *in, const char *delms, size_t *num_elm); +char **ares_strsplit(const char *in, const char *delms, size_t *num_elm); -/* Frees the result returned from ares__strsplit(). */ -void ares__strsplit_free(char **elms, size_t num_elm); +/* Frees the result returned from ares_strsplit(). */ +void ares_strsplit_free(char **elms, size_t num_elm); /* Duplicate the array */ -char **ares__strsplit_duplicate(char **elms, size_t num_elm); +char **ares_strsplit_duplicate(char **elms, size_t num_elm); #endif /* HEADER_CARES_STRSPLIT_H */ diff --git a/deps/cares/src/lib/thirdparty/apple/dnsinfo.h b/deps/cares/src/lib/thirdparty/apple/dnsinfo.h new file mode 100644 index 00000000000000..d92a1d80305ddf --- /dev/null +++ b/deps/cares/src/lib/thirdparty/apple/dnsinfo.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2004-2006, 2008, 2009, 2011 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef __DNSINFO_H__ +#define __DNSINFO_H__ + +/* + * These routines provide access to the systems DNS configuration + */ + +#include <Availability.h> +#include <sys/cdefs.h> +#include <stdint.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <AvailabilityMacros.h> + +#define DNSINFO_VERSION 20111104 + +#define DEFAULT_SEARCH_ORDER 200000 /* search order for the "default" resolver domain name */ + +#define DNS_PTR(type, name) \ + union { \ + type name; \ + uint64_t _ ## name ## _p; \ + } + +#define DNS_VAR(type, name) \ + type name + + +#pragma pack(4) +typedef struct { + struct in_addr address; + struct in_addr mask; +} dns_sortaddr_t; +#pragma pack() + + +#pragma pack(4) +typedef struct { + DNS_PTR(char *, domain); /* domain */ + DNS_VAR(int32_t, n_nameserver); /* # nameserver */ + DNS_PTR(struct sockaddr **, nameserver); + DNS_VAR(uint16_t, port); /* port (in host byte order) */ + DNS_VAR(int32_t, n_search); /* # search */ + DNS_PTR(char **, search); + DNS_VAR(int32_t, n_sortaddr); /* # sortaddr */ + DNS_PTR(dns_sortaddr_t **, sortaddr); + DNS_PTR(char *, options); /* options */ + DNS_VAR(uint32_t, timeout); /* timeout */ + DNS_VAR(uint32_t, search_order); /* search_order */ + DNS_VAR(uint32_t, if_index); + DNS_VAR(uint32_t, flags); +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1080 /* MacOS 10.8 */ + DNS_VAR(uint32_t, reserved[6]); +#else + DNS_VAR(uint32_t, reach_flags); /* SCNetworkReachabilityFlags */ + DNS_VAR(uint32_t, reserved[5]); +#endif +} dns_resolver_t; +#pragma pack() + + +#define DNS_RESOLVER_FLAGS_SCOPED 1 /* configuration is for scoped questions */ + + +#pragma pack(4) +typedef struct { + DNS_VAR(int32_t, n_resolver); /* resolver configurations */ + DNS_PTR(dns_resolver_t **, resolver); + DNS_VAR(int32_t, n_scoped_resolver); /* "scoped" resolver configurations */ + DNS_PTR(dns_resolver_t **, scoped_resolver); + DNS_VAR(uint32_t, reserved[5]); +} dns_config_t; +#pragma pack() + + +__BEGIN_DECLS + +/* + * DNS configuration access APIs + */ +const char * +dns_configuration_notify_key (void) __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); + +dns_config_t * +dns_configuration_copy (void) __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); + +void +dns_configuration_free (dns_config_t *config) __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 +void +_dns_configuration_ack (dns_config_t *config, + const char *bundle_id) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); +#endif + +__END_DECLS + +#endif /* __DNSINFO_H__ */ diff --git a/deps/cares/src/lib/util/ares_iface_ips.c b/deps/cares/src/lib/util/ares_iface_ips.c new file mode 100644 index 00000000000000..c5f507f87e1476 --- /dev/null +++ b/deps/cares/src/lib/util/ares_iface_ips.c @@ -0,0 +1,628 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +#ifdef USE_WINSOCK +# include <winsock2.h> +# include <ws2tcpip.h> +# if defined(HAVE_IPHLPAPI_H) +# include <iphlpapi.h> +# endif +# if defined(HAVE_NETIOAPI_H) +# include <netioapi.h> +# endif +#endif + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif +#ifdef HAVE_NET_IF_H +# include <net/if.h> +#endif +#ifdef HAVE_IFADDRS_H +# include <ifaddrs.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif +#ifdef HAVE_NETINET_IN_H +# include <netinet/in.h> +#endif +#ifdef HAVE_NETDB_H +# include <netdb.h> +#endif + + +static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, + const char *name); + +typedef struct { + char *name; + struct ares_addr addr; + unsigned char netmask; + unsigned int ll_scope; + ares_iface_ip_flags_t flags; +} ares_iface_ip_t; + +struct ares_iface_ips { + ares_array_t *ips; /*!< Type is ares_iface_ip_t */ + ares_iface_ip_flags_t enum_flags; +}; + +static void ares_iface_ip_free_cb(void *arg) +{ + ares_iface_ip_t *ip = arg; + if (ip == NULL) { + return; + } + ares_free(ip->name); +} + +static ares_iface_ips_t *ares_iface_ips_alloc(ares_iface_ip_flags_t flags) +{ + ares_iface_ips_t *ips = ares_malloc_zero(sizeof(*ips)); + if (ips == NULL) { + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + ips->enum_flags = flags; + ips->ips = ares_array_create(sizeof(ares_iface_ip_t), ares_iface_ip_free_cb); + if (ips->ips == NULL) { + ares_free(ips); /* LCOV_EXCL_LINE: OutOfMemory */ + return NULL; /* LCOV_EXCL_LINE: OutOfMemory */ + } + return ips; +} + +void ares_iface_ips_destroy(ares_iface_ips_t *ips) +{ + if (ips == NULL) { + return; + } + + ares_array_destroy(ips->ips); + ares_free(ips); +} + +ares_status_t ares_iface_ips(ares_iface_ips_t **ips, + ares_iface_ip_flags_t flags, const char *name) +{ + ares_status_t status; + + if (ips == NULL) { + return ARES_EFORMERR; + } + + *ips = ares_iface_ips_alloc(flags); + if (*ips == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + status = ares_iface_ips_enumerate(*ips, name); + if (status != ARES_SUCCESS) { + /* LCOV_EXCL_START: UntestablePath */ + ares_iface_ips_destroy(*ips); + *ips = NULL; + return status; + /* LCOV_EXCL_STOP */ + } + + return ARES_SUCCESS; +} + +static ares_status_t + ares_iface_ips_add(ares_iface_ips_t *ips, ares_iface_ip_flags_t flags, + const char *name, const struct ares_addr *addr, + unsigned char netmask, unsigned int ll_scope) +{ + ares_iface_ip_t *ip; + ares_status_t status; + + if (ips == NULL || name == NULL || addr == NULL) { + return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + /* Don't want loopback */ + if (flags & ARES_IFACE_IP_LOOPBACK && + !(ips->enum_flags & ARES_IFACE_IP_LOOPBACK)) { + return ARES_SUCCESS; + } + + /* Don't want offline */ + if (flags & ARES_IFACE_IP_OFFLINE && + !(ips->enum_flags & ARES_IFACE_IP_OFFLINE)) { + return ARES_SUCCESS; + } + + /* Check for link-local */ + if (ares_addr_is_linklocal(addr)) { + flags |= ARES_IFACE_IP_LINKLOCAL; + } + if (flags & ARES_IFACE_IP_LINKLOCAL && + !(ips->enum_flags & ARES_IFACE_IP_LINKLOCAL)) { + return ARES_SUCCESS; + } + + /* Set address flag based on address provided */ + if (addr->family == AF_INET) { + flags |= ARES_IFACE_IP_V4; + } + + if (addr->family == AF_INET6) { + flags |= ARES_IFACE_IP_V6; + } + + /* If they specified either v4 or v6 validate flags otherwise assume they + * want to enumerate both */ + if (ips->enum_flags & (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6)) { + if (flags & ARES_IFACE_IP_V4 && !(ips->enum_flags & ARES_IFACE_IP_V4)) { + return ARES_SUCCESS; + } + if (flags & ARES_IFACE_IP_V6 && !(ips->enum_flags & ARES_IFACE_IP_V6)) { + return ARES_SUCCESS; + } + } + + status = ares_array_insert_last((void **)&ip, ips->ips); + if (status != ARES_SUCCESS) { + return status; + } + + ip->flags = flags; + ip->netmask = netmask; + if (flags & ARES_IFACE_IP_LINKLOCAL) { + ip->ll_scope = ll_scope; + } + memcpy(&ip->addr, addr, sizeof(*addr)); + ip->name = ares_strdup(name); + if (ip->name == NULL) { + ares_array_remove_last(ips->ips); + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + + return ARES_SUCCESS; +} + +size_t ares_iface_ips_cnt(const ares_iface_ips_t *ips) +{ + if (ips == NULL) { + return 0; + } + return ares_array_len(ips->ips); +} + +const char *ares_iface_ips_get_name(const ares_iface_ips_t *ips, size_t idx) +{ + const ares_iface_ip_t *ip; + + if (ips == NULL) { + return NULL; + } + + ip = ares_array_at_const(ips->ips, idx); + if (ip == NULL) { + return NULL; + } + + return ip->name; +} + +const struct ares_addr *ares_iface_ips_get_addr(const ares_iface_ips_t *ips, + size_t idx) +{ + const ares_iface_ip_t *ip; + + if (ips == NULL) { + return NULL; + } + + ip = ares_array_at_const(ips->ips, idx); + if (ip == NULL) { + return NULL; + } + + return &ip->addr; +} + +ares_iface_ip_flags_t ares_iface_ips_get_flags(const ares_iface_ips_t *ips, + size_t idx) +{ + const ares_iface_ip_t *ip; + + if (ips == NULL) { + return 0; + } + + ip = ares_array_at_const(ips->ips, idx); + if (ip == NULL) { + return 0; + } + + return ip->flags; +} + +unsigned char ares_iface_ips_get_netmask(const ares_iface_ips_t *ips, + size_t idx) +{ + const ares_iface_ip_t *ip; + + if (ips == NULL) { + return 0; + } + + ip = ares_array_at_const(ips->ips, idx); + if (ip == NULL) { + return 0; + } + + return ip->netmask; +} + +unsigned int ares_iface_ips_get_ll_scope(const ares_iface_ips_t *ips, + size_t idx) +{ + const ares_iface_ip_t *ip; + + if (ips == NULL) { + return 0; + } + + ip = ares_array_at_const(ips->ips, idx); + if (ip == NULL) { + return 0; + } + + return ip->ll_scope; +} + + +#ifdef USE_WINSOCK + +# if 0 +static char *wcharp_to_charp(const wchar_t *in) +{ + char *out; + int len; + + len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL); + if (len == -1) { + return NULL; + } + + out = ares_malloc_zero((size_t)len + 1); + + if (WideCharToMultiByte(CP_UTF8, 0, in, -1, out, len, NULL, NULL) == -1) { + ares_free(out); + return NULL; + } + + return out; +} +# endif + +static ares_bool_t name_match(const char *name, const char *adapter_name, + unsigned int ll_scope) +{ + if (name == NULL || *name == 0) { + return ARES_TRUE; + } + + if (ares_strcaseeq(name, adapter_name)) { + return ARES_TRUE; + } + + if (ares_str_isnum(name) && (unsigned int)atoi(name) == ll_scope) { + return ARES_TRUE; + } + + return ARES_FALSE; +} + +static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, + const char *name) +{ + ULONG myflags = GAA_FLAG_INCLUDE_PREFIX /*|GAA_FLAG_INCLUDE_ALL_INTERFACES */; + ULONG outBufLen = 0; + DWORD retval; + IP_ADAPTER_ADDRESSES *addresses = NULL; + IP_ADAPTER_ADDRESSES *address = NULL; + ares_status_t status = ARES_SUCCESS; + + /* Get necessary buffer size */ + GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, NULL, &outBufLen); + if (outBufLen == 0) { + status = ARES_EFILE; + goto done; + } + + addresses = ares_malloc_zero(outBufLen); + if (addresses == NULL) { + status = ARES_ENOMEM; + goto done; + } + + retval = + GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, addresses, &outBufLen); + if (retval != ERROR_SUCCESS) { + status = ARES_EFILE; + goto done; + } + + for (address = addresses; address != NULL; address = address->Next) { + IP_ADAPTER_UNICAST_ADDRESS *ipaddr = NULL; + ares_iface_ip_flags_t addrflag = 0; + char ifname[64] = ""; + +# if defined(HAVE_CONVERTINTERFACEINDEXTOLUID) && \ + defined(HAVE_CONVERTINTERFACELUIDTONAMEA) + /* Retrieve name from interface index. + * address->AdapterName appears to be a GUID/UUID of some sort, not a name. + * address->FriendlyName is user-changeable. + * That said, this doesn't appear to help us out on systems that don't + * have if_nametoindex() or if_indextoname() as they don't have these + * functions either! */ + NET_LUID luid; + ConvertInterfaceIndexToLuid(address->IfIndex, &luid); + ConvertInterfaceLuidToNameA(&luid, ifname, sizeof(ifname)); +# else + ares_strcpy(ifname, address->AdapterName, sizeof(ifname)); +# endif + + if (address->OperStatus != IfOperStatusUp) { + addrflag |= ARES_IFACE_IP_OFFLINE; + } + + if (address->IfType == IF_TYPE_SOFTWARE_LOOPBACK) { + addrflag |= ARES_IFACE_IP_LOOPBACK; + } + + for (ipaddr = address->FirstUnicastAddress; ipaddr != NULL; + ipaddr = ipaddr->Next) { + struct ares_addr addr; + + if (ipaddr->Address.lpSockaddr->sa_family == AF_INET) { + const struct sockaddr_in *sockaddr_in = + (const struct sockaddr_in *)((void *)ipaddr->Address.lpSockaddr); + addr.family = AF_INET; + memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, + sizeof(addr.addr.addr4)); + } else if (ipaddr->Address.lpSockaddr->sa_family == AF_INET6) { + const struct sockaddr_in6 *sockaddr_in6 = + (const struct sockaddr_in6 *)((void *)ipaddr->Address.lpSockaddr); + addr.family = AF_INET6; + memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr, + sizeof(addr.addr.addr6)); + } else { + /* Unknown */ + continue; + } + + /* Sometimes windows may use numerics to indicate a DNS server's adapter, + * which corresponds to the index rather than the name. Check and + * validate both. */ + if (!name_match(name, ifname, address->Ipv6IfIndex)) { + continue; + } + + status = ares_iface_ips_add(ips, addrflag, ifname, &addr, +#if _WIN32_WINNT >= 0x0600 + ipaddr->OnLinkPrefixLength /* netmask */, +#else + ipaddr->Address.lpSockaddr->sa_family + == AF_INET?32:128, +#endif + address->Ipv6IfIndex /* ll_scope */ + ); + + if (status != ARES_SUCCESS) { + goto done; + } + } + } + +done: + ares_free(addresses); + return status; +} + +#elif defined(HAVE_GETIFADDRS) + +static unsigned char count_addr_bits(const unsigned char *addr, size_t addr_len) +{ + size_t i; + unsigned char count = 0; + + for (i = 0; i < addr_len; i++) { + count += ares_count_bits_u8(addr[i]); + } + return count; +} + +static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, + const char *name) +{ + struct ifaddrs *ifap = NULL; + struct ifaddrs *ifa = NULL; + ares_status_t status = ARES_SUCCESS; + + if (getifaddrs(&ifap) != 0) { + status = ARES_EFILE; + goto done; + } + + for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { + ares_iface_ip_flags_t addrflag = 0; + struct ares_addr addr; + unsigned char netmask = 0; + unsigned int ll_scope = 0; + + if (ifa->ifa_addr == NULL) { + continue; + } + + if (!(ifa->ifa_flags & IFF_UP)) { + addrflag |= ARES_IFACE_IP_OFFLINE; + } + + if (ifa->ifa_flags & IFF_LOOPBACK) { + addrflag |= ARES_IFACE_IP_LOOPBACK; + } + + if (ifa->ifa_addr->sa_family == AF_INET) { + const struct sockaddr_in *sockaddr_in = + (const struct sockaddr_in *)((void *)ifa->ifa_addr); + addr.family = AF_INET; + memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, sizeof(addr.addr.addr4)); + /* netmask */ + sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask); + netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4); + } else if (ifa->ifa_addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *sockaddr_in6 = + (const struct sockaddr_in6 *)((void *)ifa->ifa_addr); + addr.family = AF_INET6; + memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr, + sizeof(addr.addr.addr6)); + /* netmask */ + sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask); + netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16); +# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID + ll_scope = sockaddr_in6->sin6_scope_id; +# endif + } else { + /* unknown */ + continue; + } + + /* Name mismatch */ + if (name != NULL && !ares_strcaseeq(ifa->ifa_name, name)) { + continue; + } + + status = ares_iface_ips_add(ips, addrflag, ifa->ifa_name, &addr, netmask, + ll_scope); + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + freeifaddrs(ifap); + return status; +} + +#else + +static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, + const char *name) +{ + (void)ips; + (void)name; + return ARES_ENOTIMP; +} + +#endif + + +unsigned int ares_os_if_nametoindex(const char *name) +{ +#ifdef HAVE_IF_NAMETOINDEX + if (name == NULL) { + return 0; + } + return if_nametoindex(name); +#else + ares_status_t status; + ares_iface_ips_t *ips = NULL; + size_t i; + unsigned int index = 0; + + if (name == NULL) { + return 0; + } + + status = + ares_iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, name); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < ares_iface_ips_cnt(ips); i++) { + if (ares_iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL) { + index = ares_iface_ips_get_ll_scope(ips, i); + goto done; + } + } + +done: + ares_iface_ips_destroy(ips); + return index; +#endif +} + +const char *ares_os_if_indextoname(unsigned int index, char *name, size_t name_len) +{ +#ifdef HAVE_IF_INDEXTONAME + if (name_len < IF_NAMESIZE) { + return NULL; + } + return if_indextoname(index, name); +#else + ares_status_t status; + ares_iface_ips_t *ips = NULL; + size_t i; + const char *ptr = NULL; + + if (name == NULL || name_len < IF_NAMESIZE) { + goto done; + } + + if (index == 0) { + goto done; + } + + status = + ares_iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, NULL); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < ares_iface_ips_cnt(ips); i++) { + if (ares_iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL && + ares_iface_ips_get_ll_scope(ips, i) == index) { + ares_strcpy(name, ares_iface_ips_get_name(ips, i), name_len); + ptr = name; + goto done; + } + } + +done: + ares_iface_ips_destroy(ips); + return ptr; +#endif +} diff --git a/deps/cares/src/lib/util/ares_iface_ips.h b/deps/cares/src/lib/util/ares_iface_ips.h new file mode 100644 index 00000000000000..f22e09046a065b --- /dev/null +++ b/deps/cares/src/lib/util/ares_iface_ips.h @@ -0,0 +1,139 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__IFACE_IPS_H +#define __ARES__IFACE_IPS_H + +/*! Flags for interface ip addresses. */ +typedef enum { + ARES_IFACE_IP_V4 = 1 << 0, /*!< IPv4 address. During enumeration if + * this flag is set ARES_IFACE_IP_V6 + * is not, will only enumerate v4 + * addresses. */ + ARES_IFACE_IP_V6 = 1 << 1, /*!< IPv6 address. During enumeration if + * this flag is set ARES_IFACE_IP_V4 + * is not, will only enumerate v6 + * addresses. */ + ARES_IFACE_IP_LOOPBACK = 1 << 2, /*!< Loopback adapter */ + ARES_IFACE_IP_OFFLINE = 1 << 3, /*!< Adapter offline */ + ARES_IFACE_IP_LINKLOCAL = 1 << 4, /*!< Link-local ip address */ + /*! Default, enumerate all ips for online interfaces, including loopback */ + ARES_IFACE_IP_DEFAULT = (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6 | + ARES_IFACE_IP_LOOPBACK | ARES_IFACE_IP_LINKLOCAL) +} ares_iface_ip_flags_t; + +struct ares_iface_ips; + +/*! Opaque pointer for holding enumerated interface ip addresses */ +typedef struct ares_iface_ips ares_iface_ips_t; + +/*! Destroy ip address enumeration created by ares_iface_ips(). + * + * \param[in] ips Initialized IP address enumeration structure + */ +void ares_iface_ips_destroy(ares_iface_ips_t *ips); + +/*! Enumerate ip addresses on interfaces + * + * \param[out] ips Returns initialized ip address structure + * \param[in] flags Flags for enumeration + * \param[in] name Interface name to enumerate, or NULL to enumerate all + * \return ARES_ENOMEM on out of memory, ARES_ENOTIMP if not supported on + * the system, ARES_SUCCESS on success + */ +ares_status_t ares_iface_ips(ares_iface_ips_t **ips, + ares_iface_ip_flags_t flags, const char *name); + +/*! Count of ips enumerated + * + * \param[in] ips Initialized IP address enumeration structure + * \return count + */ +size_t ares_iface_ips_cnt(const ares_iface_ips_t *ips); + +/*! Retrieve interface name + * + * \param[in] ips Initialized IP address enumeration structure + * \param[in] idx Index of entry to pull + * \return interface name + */ +const char *ares_iface_ips_get_name(const ares_iface_ips_t *ips, size_t idx); + +/*! Retrieve interface address + * + * \param[in] ips Initialized IP address enumeration structure + * \param[in] idx Index of entry to pull + * \return interface address + */ +const struct ares_addr *ares_iface_ips_get_addr(const ares_iface_ips_t *ips, + size_t idx); + +/*! Retrieve interface address flags + * + * \param[in] ips Initialized IP address enumeration structure + * \param[in] idx Index of entry to pull + * \return interface address flags + */ +ares_iface_ip_flags_t ares_iface_ips_get_flags(const ares_iface_ips_t *ips, + size_t idx); + +/*! Retrieve interface address netmask + * + * \param[in] ips Initialized IP address enumeration structure + * \param[in] idx Index of entry to pull + * \return interface address netmask + */ +unsigned char ares_iface_ips_get_netmask(const ares_iface_ips_t *ips, + size_t idx); + +/*! Retrieve interface ipv6 link local scope + * + * \param[in] ips Initialized IP address enumeration structure + * \param[in] idx Index of entry to pull + * \return interface ipv6 link local scope + */ +unsigned int ares_iface_ips_get_ll_scope(const ares_iface_ips_t *ips, + size_t idx); + + +/*! Retrieve the interface index (aka link local scope) from the interface + * name. + * + * \param[in] name Interface name + * \return 0 on failure, index otherwise + */ +unsigned int ares_os_if_nametoindex(const char *name); + +/*! Retrieves the interface name from the index (aka link local scope) + * + * \param[in] index Interface index (> 0) + * \param[in] name Buffer to hold name + * \param[in] name_len Length of provided buffer, must be at least IF_NAMESIZE + * \return NULL on failure, or pointer to name on success + */ +const char *ares_os_if_indextoname(unsigned int index, char *name, + size_t name_len); + +#endif diff --git a/deps/cares/src/lib/ares_math.c b/deps/cares/src/lib/util/ares_math.c similarity index 81% rename from deps/cares/src/lib/ares_math.c rename to deps/cares/src/lib/util/ares_math.c index eaefd6c5de7fac..1106bf6bf151f8 100644 --- a/deps/cares/src/lib/ares_math.c +++ b/deps/cares/src/lib/util/ares_math.c @@ -23,14 +23,13 @@ * * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" + #include "ares_private.h" /* Uses public domain code snippets from * http://graphics.stanford.edu/~seander/bithacks.html */ -static unsigned int ares__round_up_pow2_u32(unsigned int n) +static unsigned int ares_round_up_pow2_u32(unsigned int n) { /* NOTE: if already a power of 2, will return itself, not the next */ n--; @@ -43,7 +42,7 @@ static unsigned int ares__round_up_pow2_u32(unsigned int n) return n; } -static ares_int64_t ares__round_up_pow2_u64(ares_int64_t n) +static ares_int64_t ares_round_up_pow2_u64(ares_int64_t n) { /* NOTE: if already a power of 2, will return itself, not the next */ n--; @@ -57,16 +56,30 @@ static ares_int64_t ares__round_up_pow2_u64(ares_int64_t n) return n; } -size_t ares__round_up_pow2(size_t n) +ares_bool_t ares_is_64bit(void) +{ +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4127) +#endif + + return (sizeof(size_t) == 4) ? ARES_FALSE : ARES_TRUE; + +#ifdef _MSC_VER +# pragma warning(pop) +#endif +} + +size_t ares_round_up_pow2(size_t n) { - if (sizeof(size_t) > 4) { - return (size_t)ares__round_up_pow2_u64((ares_int64_t)n); + if (ares_is_64bit()) { + return (size_t)ares_round_up_pow2_u64((ares_int64_t)n); } - return (size_t)ares__round_up_pow2_u32((unsigned int)n); + return (size_t)ares_round_up_pow2_u32((unsigned int)n); } -size_t ares__log2(size_t n) +size_t ares_log2(size_t n) { static const unsigned char tab32[32] = { 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, @@ -79,7 +92,7 @@ size_t ares__log2(size_t n) 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5 }; - if (sizeof(size_t) == 4) { + if (!ares_is_64bit()) { return tab32[(n * 0x077CB531) >> 27]; } @@ -87,7 +100,7 @@ size_t ares__log2(size_t n) } /* x^y */ -size_t ares__pow(size_t x, size_t y) +size_t ares_pow(size_t x, size_t y) { size_t res = 1; @@ -105,7 +118,7 @@ size_t ares__pow(size_t x, size_t y) return res; } -size_t ares__count_digits(size_t n) +size_t ares_count_digits(size_t n) { size_t digits; @@ -119,7 +132,7 @@ size_t ares__count_digits(size_t n) return digits; } -size_t ares__count_hexdigits(size_t n) +size_t ares_count_hexdigits(size_t n) { size_t digits; @@ -133,7 +146,7 @@ size_t ares__count_hexdigits(size_t n) return digits; } -unsigned char ares__count_bits_u8(unsigned char x) +unsigned char ares_count_bits_u8(unsigned char x) { /* Implementation obtained from: * http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable */ diff --git a/deps/cares/src/lib/util/ares_math.h b/deps/cares/src/lib/util/ares_math.h new file mode 100644 index 00000000000000..3b60b00bdbb6ce --- /dev/null +++ b/deps/cares/src/lib/util/ares_math.h @@ -0,0 +1,53 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_MATH_H +#define __ARES_MATH_H + +#include "ares_setup.h" + +#ifdef HAVE_STDINT_H +# include <stdint.h> + typedef int64_t ares_int64_t; + typedef uint64_t ares_uint64_t; +#else /* HAVE_STDINT_H */ +# ifdef _MSC_VER + typedef __int64 ares_int64_t; + typedef unsigned __int64 ares_uint64_t; +# else + typedef long long ares_int64_t; + typedef unsigned long long ares_uint64_t; +# endif /* _MSC_VER */ +#endif /* HAVE_STDINT_H */ + +ares_bool_t ares_is_64bit(void); +size_t ares_round_up_pow2(size_t n); +size_t ares_log2(size_t n); +size_t ares_pow(size_t x, size_t y); +size_t ares_count_digits(size_t n); +size_t ares_count_hexdigits(size_t n); +unsigned char ares_count_bits_u8(unsigned char x); + +#endif diff --git a/deps/cares/src/lib/ares_rand.c b/deps/cares/src/lib/util/ares_rand.c similarity index 76% rename from deps/cares/src/lib/ares_rand.c rename to deps/cares/src/lib/util/ares_rand.c index a7a74c9a8d7081..367dfa21ab1701 100644 --- a/deps/cares/src/lib/ares_rand.c +++ b/deps/cares/src/lib/util/ares_rand.c @@ -24,8 +24,6 @@ * SPDX-License-Identifier: MIT */ -#include "ares_setup.h" -#include "ares.h" #include "ares_private.h" #include <stdlib.h> @@ -43,7 +41,7 @@ typedef enum { ARES_RAND_OS = 1 << 0, /* OS-provided such as RtlGenRandom or arc4random */ ARES_RAND_FILE = 1 << 1, /* OS file-backed random number generator */ - ARES_RAND_RC4 = 1 << 2, /* Internal RC4 based PRNG */ + ARES_RAND_RC4 = 1 << 2 /* Internal RC4 based PRNG */ } ares_rand_backend; #define ARES_RC4_KEY_LEN 32 /* 256 bits */ @@ -56,29 +54,36 @@ typedef struct ares_rand_rc4 { static unsigned int ares_u32_from_ptr(void *addr) { - if (sizeof(void *) == 8) { - return (unsigned int)((((ares_uint64_t)addr >> 32) & 0xFFFFFFFF) | + /* LCOV_EXCL_START: FallbackCode */ + if (ares_is_64bit()) { + return (unsigned int)((((ares_uint64_t)addr >> 32) & 0xFFFFFFFF) ^ ((ares_uint64_t)addr & 0xFFFFFFFF)); } return (unsigned int)((size_t)addr & 0xFFFFFFFF); + /* LCOV_EXCL_STOP */ } /* initialize an rc4 key as the last possible fallback. */ static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, size_t key_len) { + /* LCOV_EXCL_START: FallbackCode */ size_t i; size_t len = 0; unsigned int data; - struct timeval tv; + ares_timeval_t tv; if (key_len != ARES_RC4_KEY_LEN) { return; } +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* For fuzzing, random should be deterministic */ + srand(0); +#else /* Randomness is hard to come by. Maybe the system randomizes heap and stack * addresses. Maybe the current timestamp give us some randomness. Use - * rc4_state (heap), &i (stack), and ares__tvnow() + * rc4_state (heap), &i (stack), and ares_tvnow() */ data = ares_u32_from_ptr(rc4_state); memcpy(key + len, &data, sizeof(data)); @@ -88,21 +93,31 @@ static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, memcpy(key + len, &data, sizeof(data)); len += sizeof(data); - tv = ares__tvnow(); - data = (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF); + ares_tvnow(&tv); + data = (unsigned int)((tv.sec ^ tv.usec) & 0xFFFFFFFF); memcpy(key + len, &data, sizeof(data)); len += sizeof(data); - srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) | - (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF)); + srand(ares_u32_from_ptr(rc4_state) ^ ares_u32_from_ptr(&i) ^ + (unsigned int)((tv.sec ^ tv.usec) & 0xFFFFFFFF)); +#endif for (i = len; i < key_len; i++) { key[i] = (unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */ } + /* LCOV_EXCL_STOP */ } +#define ARES_SWAP_BYTE(a, b) \ + do { \ + unsigned char swapByte = *(a); \ + *(a) = *(b); \ + *(b) = swapByte; \ + } while (0) + static void ares_rc4_init(ares_rand_rc4 *rc4_state) { + /* LCOV_EXCL_START: FallbackCode */ unsigned char key[ARES_RC4_KEY_LEN]; size_t i; size_t j; @@ -120,6 +135,7 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state) rc4_state->i = 0; rc4_state->j = 0; + /* LCOV_EXCL_STOP */ } /* Just outputs the key schedule, no need to XOR with any data since we have @@ -127,6 +143,7 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state) static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t len) { + /* LCOV_EXCL_START: FallbackCode */ unsigned char *S = rc4_state->S; size_t i = rc4_state->i; size_t j = rc4_state->j; @@ -142,6 +159,7 @@ static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, rc4_state->i = i; rc4_state->j = j; + /* LCOV_EXCL_STOP */ } struct ares_rand_state { @@ -175,10 +193,15 @@ BOOLEAN WINAPI SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength); #endif -static ares_bool_t ares__init_rand_engine(ares_rand_state *state) +static ares_bool_t ares_init_rand_engine(ares_rand_state *state) { state->cache_remaining = 0; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* For fuzzing, random should be deterministic */ + state->bad_backends |= ARES_RAND_OS | ARES_RAND_FILE; +#endif + #if defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_GETRANDOM) || defined(_WIN32) if (!(state->bad_backends & ARES_RAND_OS)) { state->type = ARES_RAND_OS; @@ -187,6 +210,7 @@ static ares_bool_t ares__init_rand_engine(ares_rand_state *state) #endif #if defined(CARES_RANDOM_FILE) + /* LCOV_EXCL_START: FallbackCode */ if (!(state->bad_backends & ARES_RAND_FILE)) { state->type = ARES_RAND_FILE; state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb"); @@ -195,17 +219,21 @@ static ares_bool_t ares__init_rand_engine(ares_rand_state *state) return ARES_TRUE; } } + /* LCOV_EXCL_STOP */ + /* Fall-Thru on failure to RC4 */ #endif + /* LCOV_EXCL_START: FallbackCode */ state->type = ARES_RAND_RC4; ares_rc4_init(&state->state.rc4); + /* LCOV_EXCL_STOP */ /* Currently cannot fail */ - return ARES_TRUE; + return ARES_TRUE; /* LCOV_EXCL_LINE: UntestablePath */ } -ares_rand_state *ares__init_rand_state(void) +ares_rand_state *ares_init_rand_state(void) { ares_rand_state *state = NULL; @@ -214,49 +242,53 @@ ares_rand_state *ares__init_rand_state(void) return NULL; } - if (!ares__init_rand_engine(state)) { - ares_free(state); - return NULL; + if (!ares_init_rand_engine(state)) { + ares_free(state); /* LCOV_EXCL_LINE: UntestablePath */ + return NULL; /* LCOV_EXCL_LINE: UntestablePath */ } return state; } -static void ares__clear_rand_state(ares_rand_state *state) +static void ares_clear_rand_state(ares_rand_state *state) { if (!state) { - return; + return; /* LCOV_EXCL_LINE: DefensiveCoding */ } switch (state->type) { case ARES_RAND_OS: break; + /* LCOV_EXCL_START: FallbackCode */ case ARES_RAND_FILE: fclose(state->state.rand_file); break; case ARES_RAND_RC4: break; + /* LCOV_EXCL_STOP */ } } -static void ares__reinit_rand(ares_rand_state *state) +static void ares_reinit_rand(ares_rand_state *state) { - ares__clear_rand_state(state); - ares__init_rand_engine(state); + /* LCOV_EXCL_START: UntestablePath */ + ares_clear_rand_state(state); + ares_init_rand_engine(state); + /* LCOV_EXCL_STOP */ } -void ares__destroy_rand_state(ares_rand_state *state) +void ares_destroy_rand_state(ares_rand_state *state) { if (!state) { return; } - ares__clear_rand_state(state); + ares_clear_rand_state(state); ares_free(state); } -static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf, - size_t len) +static void ares_rand_bytes_fetch(ares_rand_state *state, unsigned char *buf, + size_t len) { while (1) { size_t bytes_read = 0; @@ -296,6 +328,8 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf, break; #endif + /* LCOV_EXCL_START: FallbackCode */ + case ARES_RAND_FILE: while (1) { size_t rv = fread(buf + bytes_read, 1, len - bytes_read, @@ -314,21 +348,23 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf, case ARES_RAND_RC4: ares_rc4_prng(&state->state.rc4, buf, len); return; + + /* LCOV_EXCL_STOP */ } /* If we didn't return before we got here, that means we had a critical rand * failure and need to reinitialized */ - ares__reinit_rand(state); + ares_reinit_rand(state); /* LCOV_EXCL_LINE: UntestablePath */ } } -void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len) +void ares_rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len) { /* See if we need to refill the cache to serve the request, but if len is * excessive, we're not going to update our cache or serve from cache */ if (len > state->cache_remaining && len < sizeof(state->cache)) { size_t fetch_size = sizeof(state->cache) - state->cache_remaining; - ares__rand_bytes_fetch(state, state->cache, fetch_size); + ares_rand_bytes_fetch(state, state->cache, fetch_size); state->cache_remaining = sizeof(state->cache); } @@ -341,13 +377,13 @@ void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len) } /* Serve direct due to excess size of request */ - ares__rand_bytes_fetch(state, buf, len); + ares_rand_bytes_fetch(state, buf, len); } -unsigned short ares__generate_new_id(ares_rand_state *state) +unsigned short ares_generate_new_id(ares_rand_state *state) { unsigned short r = 0; - ares__rand_bytes(state, (unsigned char *)&r, sizeof(r)); + ares_rand_bytes(state, (unsigned char *)&r, sizeof(r)); return r; } diff --git a/deps/cares/src/lib/util/ares_rand.h b/deps/cares/src/lib/util/ares_rand.h new file mode 100644 index 00000000000000..81c61bf46488ae --- /dev/null +++ b/deps/cares/src/lib/util/ares_rand.h @@ -0,0 +1,36 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_RAND_H +#define __ARES_RAND_H + +struct ares_rand_state; +typedef struct ares_rand_state ares_rand_state; + +ares_rand_state *ares_init_rand_state(void); +void ares_destroy_rand_state(ares_rand_state *state); +void ares_rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len); + +#endif diff --git a/deps/cares/src/lib/util/ares_threads.c b/deps/cares/src/lib/util/ares_threads.c new file mode 100644 index 00000000000000..ab0b51afb70577 --- /dev/null +++ b/deps/cares/src/lib/util/ares_threads.c @@ -0,0 +1,614 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#include "ares_private.h" + +#ifdef CARES_THREADS +# ifdef _WIN32 + +struct ares_thread_mutex { + CRITICAL_SECTION mutex; +}; + +ares_thread_mutex_t *ares_thread_mutex_create(void) +{ + ares_thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); + if (mut == NULL) { + return NULL; + } + + InitializeCriticalSection(&mut->mutex); + return mut; +} + +void ares_thread_mutex_destroy(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + DeleteCriticalSection(&mut->mutex); + ares_free(mut); +} + +void ares_thread_mutex_lock(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + EnterCriticalSection(&mut->mutex); +} + +void ares_thread_mutex_unlock(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + LeaveCriticalSection(&mut->mutex); +} + +struct ares_thread_cond { + CONDITION_VARIABLE cond; +}; + +ares_thread_cond_t *ares_thread_cond_create(void) +{ + ares_thread_cond_t *cond = ares_malloc_zero(sizeof(*cond)); + if (cond == NULL) { + return NULL; + } + InitializeConditionVariable(&cond->cond); + return cond; +} + +void ares_thread_cond_destroy(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + ares_free(cond); +} + +void ares_thread_cond_signal(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + WakeConditionVariable(&cond->cond); +} + +void ares_thread_cond_broadcast(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + WakeAllConditionVariable(&cond->cond); +} + +ares_status_t ares_thread_cond_wait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut) +{ + if (cond == NULL || mut == NULL) { + return ARES_EFORMERR; + } + + SleepConditionVariableCS(&cond->cond, &mut->mutex, INFINITE); + return ARES_SUCCESS; +} + +ares_status_t ares_thread_cond_timedwait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut, + unsigned long timeout_ms) +{ + if (cond == NULL || mut == NULL) { + return ARES_EFORMERR; + } + + if (!SleepConditionVariableCS(&cond->cond, &mut->mutex, timeout_ms)) { + return ARES_ETIMEOUT; + } + + return ARES_SUCCESS; +} + +struct ares_thread { + HANDLE thread; + DWORD id; + + void *(*func)(void *arg); + void *arg; + void *rv; +}; + +/* Wrap for pthread compatibility */ +static DWORD WINAPI ares_thread_func(LPVOID lpParameter) +{ + ares_thread_t *thread = lpParameter; + + thread->rv = thread->func(thread->arg); + return 0; +} + +ares_status_t ares_thread_create(ares_thread_t **thread, + ares_thread_func_t func, void *arg) +{ + ares_thread_t *thr = NULL; + + if (func == NULL || thread == NULL) { + return ARES_EFORMERR; + } + + thr = ares_malloc_zero(sizeof(*thr)); + if (thr == NULL) { + return ARES_ENOMEM; + } + + thr->func = func; + thr->arg = arg; + thr->thread = CreateThread(NULL, 0, ares_thread_func, thr, 0, &thr->id); + if (thr->thread == NULL) { + ares_free(thr); + return ARES_ESERVFAIL; + } + + *thread = thr; + return ARES_SUCCESS; +} + +ares_status_t ares_thread_join(ares_thread_t *thread, void **rv) +{ + ares_status_t status = ARES_SUCCESS; + + if (thread == NULL) { + return ARES_EFORMERR; + } + + if (WaitForSingleObject(thread->thread, INFINITE) != WAIT_OBJECT_0) { + status = ARES_ENOTFOUND; + } else { + CloseHandle(thread->thread); + } + + if (status == ARES_SUCCESS && rv != NULL) { + *rv = thread->rv; + } + ares_free(thread); + + return status; +} + +# else /* !WIN32 == PTHREAD */ +# include <pthread.h> + +/* for clock_gettime() */ +# ifdef HAVE_TIME_H +# include <time.h> +# endif + +/* for gettimeofday() */ +# ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +# endif + +struct ares_thread_mutex { + pthread_mutex_t mutex; +}; + +ares_thread_mutex_t *ares_thread_mutex_create(void) +{ + pthread_mutexattr_t attr; + ares_thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut)); + if (mut == NULL) { + return NULL; + } + + if (pthread_mutexattr_init(&attr) != 0) { + ares_free(mut); /* LCOV_EXCL_LINE: UntestablePath */ + return NULL; /* LCOV_EXCL_LINE: UntestablePath */ + } + + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) { + goto fail; /* LCOV_EXCL_LINE: UntestablePath */ + } + + if (pthread_mutex_init(&mut->mutex, &attr) != 0) { + goto fail; /* LCOV_EXCL_LINE: UntestablePath */ + } + + pthread_mutexattr_destroy(&attr); + return mut; + +/* LCOV_EXCL_START: UntestablePath */ +fail: + pthread_mutexattr_destroy(&attr); + ares_free(mut); + return NULL; + /* LCOV_EXCL_STOP */ +} + +void ares_thread_mutex_destroy(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_destroy(&mut->mutex); + ares_free(mut); +} + +void ares_thread_mutex_lock(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_lock(&mut->mutex); +} + +void ares_thread_mutex_unlock(ares_thread_mutex_t *mut) +{ + if (mut == NULL) { + return; + } + pthread_mutex_unlock(&mut->mutex); +} + +struct ares_thread_cond { + pthread_cond_t cond; +}; + +ares_thread_cond_t *ares_thread_cond_create(void) +{ + ares_thread_cond_t *cond = ares_malloc_zero(sizeof(*cond)); + if (cond == NULL) { + return NULL; + } + pthread_cond_init(&cond->cond, NULL); + return cond; +} + +void ares_thread_cond_destroy(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + pthread_cond_destroy(&cond->cond); + ares_free(cond); +} + +void ares_thread_cond_signal(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + pthread_cond_signal(&cond->cond); +} + +void ares_thread_cond_broadcast(ares_thread_cond_t *cond) +{ + if (cond == NULL) { + return; + } + pthread_cond_broadcast(&cond->cond); +} + +ares_status_t ares_thread_cond_wait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut) +{ + if (cond == NULL || mut == NULL) { + return ARES_EFORMERR; + } + + pthread_cond_wait(&cond->cond, &mut->mutex); + return ARES_SUCCESS; +} + +static void ares_timespec_timeout(struct timespec *ts, unsigned long add_ms) +{ +# if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME) + clock_gettime(CLOCK_REALTIME, ts); +# elif defined(HAVE_GETTIMEOFDAY) + struct timeval tv; + gettimeofday(&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; +# else +# error cannot determine current system time +# endif + + ts->tv_sec += (time_t)(add_ms / 1000); + ts->tv_nsec += (long)((add_ms % 1000) * 1000000); + + /* Normalize if needed */ + if (ts->tv_nsec >= 1000000000) { + ts->tv_sec += ts->tv_nsec / 1000000000; + ts->tv_nsec %= 1000000000; + } +} + +ares_status_t ares_thread_cond_timedwait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut, + unsigned long timeout_ms) +{ + struct timespec ts; + + if (cond == NULL || mut == NULL) { + return ARES_EFORMERR; + } + + ares_timespec_timeout(&ts, timeout_ms); + + if (pthread_cond_timedwait(&cond->cond, &mut->mutex, &ts) != 0) { + return ARES_ETIMEOUT; + } + + return ARES_SUCCESS; +} + +struct ares_thread { + pthread_t thread; +}; + +ares_status_t ares_thread_create(ares_thread_t **thread, + ares_thread_func_t func, void *arg) +{ + ares_thread_t *thr = NULL; + + if (func == NULL || thread == NULL) { + return ARES_EFORMERR; + } + + thr = ares_malloc_zero(sizeof(*thr)); + if (thr == NULL) { + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + } + if (pthread_create(&thr->thread, NULL, func, arg) != 0) { + ares_free(thr); /* LCOV_EXCL_LINE: UntestablePath */ + return ARES_ESERVFAIL; /* LCOV_EXCL_LINE: UntestablePath */ + } + + *thread = thr; + return ARES_SUCCESS; +} + +ares_status_t ares_thread_join(ares_thread_t *thread, void **rv) +{ + void *ret = NULL; + ares_status_t status = ARES_SUCCESS; + + if (thread == NULL) { + return ARES_EFORMERR; + } + + if (pthread_join(thread->thread, &ret) != 0) { + status = ARES_ENOTFOUND; + } + ares_free(thread); + + if (status == ARES_SUCCESS && rv != NULL) { + *rv = ret; + } + return status; +} + +# endif + +ares_bool_t ares_threadsafety(void) +{ + return ARES_TRUE; +} + +#else /* !CARES_THREADS */ + +/* NoOp */ +ares_thread_mutex_t *ares_thread_mutex_create(void) +{ + return NULL; +} + +void ares_thread_mutex_destroy(ares_thread_mutex_t *mut) +{ + (void)mut; +} + +void ares_thread_mutex_lock(ares_thread_mutex_t *mut) +{ + (void)mut; +} + +void ares_thread_mutex_unlock(ares_thread_mutex_t *mut) +{ + (void)mut; +} + +ares_thread_cond_t *ares_thread_cond_create(void) +{ + return NULL; +} + +void ares_thread_cond_destroy(ares_thread_cond_t *cond) +{ + (void)cond; +} + +void ares_thread_cond_signal(ares_thread_cond_t *cond) +{ + (void)cond; +} + +void ares_thread_cond_broadcast(ares_thread_cond_t *cond) +{ + (void)cond; +} + +ares_status_t ares_thread_cond_wait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut) +{ + (void)cond; + (void)mut; + return ARES_ENOTIMP; +} + +ares_status_t ares_thread_cond_timedwait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut, + unsigned long timeout_ms) +{ + (void)cond; + (void)mut; + (void)timeout_ms; + return ARES_ENOTIMP; +} + +ares_status_t ares_thread_create(ares_thread_t **thread, + ares_thread_func_t func, void *arg) +{ + (void)thread; + (void)func; + (void)arg; + return ARES_ENOTIMP; +} + +ares_status_t ares_thread_join(ares_thread_t *thread, void **rv) +{ + (void)thread; + (void)rv; + return ARES_ENOTIMP; +} + +ares_bool_t ares_threadsafety(void) +{ + return ARES_FALSE; +} +#endif + + +ares_status_t ares_channel_threading_init(ares_channel_t *channel) +{ + ares_status_t status = ARES_SUCCESS; + + /* Threading is optional! */ + if (!ares_threadsafety()) { + return ARES_SUCCESS; + } + + channel->lock = ares_thread_mutex_create(); + if (channel->lock == NULL) { + status = ARES_ENOMEM; + goto done; + } + + channel->cond_empty = ares_thread_cond_create(); + if (channel->cond_empty == NULL) { + status = ARES_ENOMEM; + goto done; + } + +done: + if (status != ARES_SUCCESS) { + ares_channel_threading_destroy(channel); + } + return status; +} + +void ares_channel_threading_destroy(ares_channel_t *channel) +{ + ares_thread_mutex_destroy(channel->lock); + channel->lock = NULL; + ares_thread_cond_destroy(channel->cond_empty); + channel->cond_empty = NULL; +} + +void ares_channel_lock(const ares_channel_t *channel) +{ + ares_thread_mutex_lock(channel->lock); +} + +void ares_channel_unlock(const ares_channel_t *channel) +{ + ares_thread_mutex_unlock(channel->lock); +} + +/* Must not be holding a channel lock already, public function only */ +ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms) +{ + ares_status_t status = ARES_SUCCESS; + ares_timeval_t tout; + + if (!ares_threadsafety()) { + return ARES_ENOTIMP; + } + + if (channel == NULL) { + return ARES_EFORMERR; + } + + if (timeout_ms >= 0) { + ares_tvnow(&tout); + tout.sec += (ares_int64_t)(timeout_ms / 1000); + tout.usec += (unsigned int)(timeout_ms % 1000) * 1000; + } + + ares_thread_mutex_lock(channel->lock); + while (ares_llist_len(channel->all_queries)) { + if (timeout_ms < 0) { + ares_thread_cond_wait(channel->cond_empty, channel->lock); + } else { + ares_timeval_t tv_remaining; + ares_timeval_t tv_now; + unsigned long tms; + + ares_tvnow(&tv_now); + ares_timeval_remaining(&tv_remaining, &tv_now, &tout); + tms = + (unsigned long)((tv_remaining.sec * 1000) + (tv_remaining.usec / 1000)); + if (tms == 0) { + status = ARES_ETIMEOUT; + } else { + status = + ares_thread_cond_timedwait(channel->cond_empty, channel->lock, tms); + } + + /* If there was a timeout, don't loop. Otherwise, make sure this wasn't + * a spurious wakeup by looping and checking the condition. */ + if (status == ARES_ETIMEOUT) { + break; + } + } + } + ares_thread_mutex_unlock(channel->lock); + return status; +} + +void ares_queue_notify_empty(ares_channel_t *channel) +{ + if (channel == NULL) { + return; + } + + /* We are guaranteed to be holding a channel lock already */ + if (ares_llist_len(channel->all_queries)) { + return; + } + + /* Notify all waiters of the conditional */ + ares_thread_cond_broadcast(channel->cond_empty); +} diff --git a/deps/cares/src/lib/util/ares_threads.h b/deps/cares/src/lib/util/ares_threads.h new file mode 100644 index 00000000000000..95c543e6e994f5 --- /dev/null +++ b/deps/cares/src/lib/util/ares_threads.h @@ -0,0 +1,60 @@ +/* MIT License + * + * Copyright (c) 2023 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES__THREADS_H +#define __ARES__THREADS_H + +struct ares_thread_mutex; +typedef struct ares_thread_mutex ares_thread_mutex_t; + +ares_thread_mutex_t *ares_thread_mutex_create(void); +void ares_thread_mutex_destroy(ares_thread_mutex_t *mut); +void ares_thread_mutex_lock(ares_thread_mutex_t *mut); +void ares_thread_mutex_unlock(ares_thread_mutex_t *mut); + + +struct ares_thread_cond; +typedef struct ares_thread_cond ares_thread_cond_t; + +ares_thread_cond_t *ares_thread_cond_create(void); +void ares_thread_cond_destroy(ares_thread_cond_t *cond); +void ares_thread_cond_signal(ares_thread_cond_t *cond); +void ares_thread_cond_broadcast(ares_thread_cond_t *cond); +ares_status_t ares_thread_cond_wait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut); +ares_status_t ares_thread_cond_timedwait(ares_thread_cond_t *cond, + ares_thread_mutex_t *mut, + unsigned long timeout_ms); + + +struct ares_thread; +typedef struct ares_thread ares_thread_t; + +typedef void *(*ares_thread_func_t)(void *arg); +ares_status_t ares_thread_create(ares_thread_t **thread, + ares_thread_func_t func, void *arg); +ares_status_t ares_thread_join(ares_thread_t *thread, void **rv); + +#endif diff --git a/deps/cares/src/lib/util/ares_time.h b/deps/cares/src/lib/util/ares_time.h new file mode 100644 index 00000000000000..c6eaf97366379e --- /dev/null +++ b/deps/cares/src/lib/util/ares_time.h @@ -0,0 +1,48 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_TIME_H +#define __ARES_TIME_H + +/*! struct timeval on some systems like Windows doesn't support 64bit time so + * therefore can't be used due to Y2K38 issues. Make our own that does have + * 64bit time. */ +typedef struct { + ares_int64_t sec; /*!< Seconds */ + unsigned int usec; /*!< Microseconds. Can't be negative. */ +} ares_timeval_t; + +/* return true if now is exactly check time or later */ +ares_bool_t ares_timedout(const ares_timeval_t *now, + const ares_timeval_t *check); + +void ares_tvnow(ares_timeval_t *now); +void ares_timeval_remaining(ares_timeval_t *remaining, + const ares_timeval_t *now, + const ares_timeval_t *tout); +void ares_timeval_diff(ares_timeval_t *tvdiff, const ares_timeval_t *tvstart, + const ares_timeval_t *tvstop); + +#endif diff --git a/deps/cares/src/lib/util/ares_timeval.c b/deps/cares/src/lib/util/ares_timeval.c new file mode 100644 index 00000000000000..0b0845b6fb7ffe --- /dev/null +++ b/deps/cares/src/lib/util/ares_timeval.c @@ -0,0 +1,95 @@ +/* MIT License + * + * Copyright (c) 2008 Daniel Stenberg + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + +#include "ares_private.h" + +#if defined(_WIN32) && !defined(MSDOS) + +void ares_tvnow(ares_timeval_t *now) +{ + /* QueryPerformanceCounters() has been around since Windows 2000, though + * significant fixes were made in later versions. Documentation states + * 1 microsecond or better resolution with a rollover not less than 100 years. + * This differs from GetTickCount{64}() which has a resolution between 10 and + * 16 ms. */ + LARGE_INTEGER freq; + LARGE_INTEGER current; + + /* Not sure how long it takes to get the frequency, I see it recommended to + * cache it */ + QueryPerformanceFrequency(&freq); + QueryPerformanceCounter(¤t); + + now->sec = current.QuadPart / freq.QuadPart; + /* We want to prevent overflows so we get the remainder, then multiply to + * microseconds before dividing */ + now->usec = (unsigned int)(((current.QuadPart % freq.QuadPart) * 1000000) / + freq.QuadPart); +} + +#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) + +void ares_tvnow(ares_timeval_t *now) +{ + /* clock_gettime() is guaranteed to be increased monotonically when the + * monotonic clock is queried. Time starting point is unspecified, it + * could be the system start-up time, the Epoch, or something else, + * in any case the time starting point does not change once that the + * system has started up. */ + struct timespec tsnow; + + if (clock_gettime(CLOCK_MONOTONIC, &tsnow) == 0) { + now->sec = (ares_int64_t)tsnow.tv_sec; + now->usec = (unsigned int)(tsnow.tv_nsec / 1000); + } else { + /* LCOV_EXCL_START: FallbackCode */ + struct timeval tv; + (void)gettimeofday(&tv, NULL); + now->sec = (ares_int64_t)tv.tv_sec; + now->usec = (unsigned int)tv.tv_usec; + /* LCOV_EXCL_STOP */ + } +} + +#elif defined(HAVE_GETTIMEOFDAY) + +void ares_tvnow(ares_timeval_t *now) +{ + /* gettimeofday() is not granted to be increased monotonically, due to + * clock drifting and external source time synchronization it can jump + * forward or backward in time. */ + struct timeval tv; + + (void)gettimeofday(&tv, NULL); + now->sec = (ares_int64_t)tv.tv_sec; + now->usec = (unsigned int)tv.tv_usec; +} + +#else + +# error missing sub-second time retrieval function + +#endif diff --git a/deps/cares/src/lib/util/ares_uri.c b/deps/cares/src/lib/util/ares_uri.c new file mode 100644 index 00000000000000..04bad0074a79e2 --- /dev/null +++ b/deps/cares/src/lib/util/ares_uri.c @@ -0,0 +1,1626 @@ +/* MIT License + * + * Copyright (c) 2024 Brad house + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ + + +#include "ares_private.h" +#include "ares_uri.h" +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +struct ares_uri { + char scheme[16]; + char *username; + char *password; + unsigned short port; + char host[256]; + char *path; + ares_htable_dict_t *query; + char *fragment; +}; + +/* RFC3986 character set notes: + * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + * reserved = gen-delims / sub-delims + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + * authority = [ userinfo "@" ] host [ ":" port ] + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + * NOTE: Use of the format "user:password" in the userinfo field is + * deprecated. Applications should not render as clear text any data + * after the first colon (":") character found within a userinfo + * subcomponent unless the data after the colon is the empty string + * (indicating no password). + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * query = *( pchar / "/" / "?" ) + * fragment = *( pchar / "/" / "?" ) + * + * NOTE: Due to ambiguity, "+" in a query must be percent-encoded, as old + * URLs used that for spaces. + */ + + +static ares_bool_t ares_uri_chis_subdelim(char x) +{ + switch (x) { + case '!': + return ARES_TRUE; + case '$': + return ARES_TRUE; + case '&': + return ARES_TRUE; + case '\'': + return ARES_TRUE; + case '(': + return ARES_TRUE; + case ')': + return ARES_TRUE; + case '*': + return ARES_TRUE; + case '+': + return ARES_TRUE; + case ',': + return ARES_TRUE; + case ';': + return ARES_TRUE; + case '=': + return ARES_TRUE; + default: + break; + } + return ARES_FALSE; +} + +/* These don't actually appear to be referenced in any logic */ +#if 0 +static ares_bool_t ares_uri_chis_gendelim(char x) +{ + switch (x) { + case ':': + return ARES_TRUE; + case '/': + return ARES_TRUE; + case '?': + return ARES_TRUE; + case '#': + return ARES_TRUE; + case '[': + return ARES_TRUE; + case ']': + return ARES_TRUE; + case '@': + return ARES_TRUE; + default: + break; + } + return ARES_FALSE; +} + + +static ares_bool_t ares_uri_chis_reserved(char x) +{ + return ares_uri_chis_gendelim(x) || ares_uri_chis_subdelim(x); +} +#endif + +static ares_bool_t ares_uri_chis_unreserved(char x) +{ + switch (x) { + case '-': + return ARES_TRUE; + case '.': + return ARES_TRUE; + case '_': + return ARES_TRUE; + case '~': + return ARES_TRUE; + default: + break; + } + return ares_isalpha(x) || ares_isdigit(x); +} + +static ares_bool_t ares_uri_chis_scheme(char x) +{ + switch (x) { + case '+': + return ARES_TRUE; + case '-': + return ARES_TRUE; + case '.': + return ARES_TRUE; + default: + break; + } + return ares_isalpha(x) || ares_isdigit(x); +} + +static ares_bool_t ares_uri_chis_authority(char x) +{ + /* This one here isn't well defined. We are going to include the valid + * characters of the subfields plus known delimiters */ + return ares_uri_chis_unreserved(x) || ares_uri_chis_subdelim(x) || x == '%' || + x == '[' || x == ']' || x == '@' || x == ':'; +} + +static ares_bool_t ares_uri_chis_userinfo(char x) +{ + /* NOTE: we don't include ':' here since we are using that as our + * username/password delimiter */ + return ares_uri_chis_unreserved(x) || ares_uri_chis_subdelim(x); +} + +static ares_bool_t ares_uri_chis_path(char x) +{ + switch (x) { + case ':': + return ARES_TRUE; + case '@': + return ARES_TRUE; + /* '/' isn't in the spec as a path character since its technically a + * delimiter but we're not splitting on '/' so we accept it as valid */ + case '/': + return ARES_TRUE; + default: + break; + } + return ares_uri_chis_unreserved(x) || ares_uri_chis_subdelim(x); +} + +static ares_bool_t ares_uri_chis_path_enc(char x) +{ + return ares_uri_chis_path(x) || x == '%'; +} + +static ares_bool_t ares_uri_chis_query(char x) +{ + switch (x) { + case '/': + return ARES_TRUE; + case '?': + return ARES_TRUE; + default: + break; + } + + /* Exclude & and = used as delimiters, they're valid characters in the + * set, just not for the individual pieces */ + return ares_uri_chis_path(x) && x != '&' && x != '='; +} + +static ares_bool_t ares_uri_chis_query_enc(char x) +{ + return ares_uri_chis_query(x) || x == '%'; +} + +static ares_bool_t ares_uri_chis_fragment(char x) +{ + switch (x) { + case '/': + return ARES_TRUE; + case '?': + return ARES_TRUE; + default: + break; + } + return ares_uri_chis_path(x); +} + +static ares_bool_t ares_uri_chis_fragment_enc(char x) +{ + return ares_uri_chis_fragment(x) || x == '%'; +} + +ares_uri_t *ares_uri_create(void) +{ + ares_uri_t *uri = ares_malloc_zero(sizeof(*uri)); + + if (uri == NULL) { + return NULL; + } + + uri->query = ares_htable_dict_create(); + if (uri->query == NULL) { + ares_free(uri); + return NULL; + } + + return uri; +} + +void ares_uri_destroy(ares_uri_t *uri) +{ + if (uri == NULL) { + return; + } + + ares_free(uri->username); + ares_free(uri->password); + ares_free(uri->path); + ares_free(uri->fragment); + ares_htable_dict_destroy(uri->query); + ares_free(uri); +} + +static ares_bool_t ares_uri_scheme_is_valid(const char *uri) +{ + size_t i; + + if (ares_strlen(uri) == 0) { + return ARES_FALSE; + } + + if (!ares_isalpha(*uri)) { + return ARES_FALSE; + } + + for (i = 0; uri[i] != 0; i++) { + if (!ares_uri_chis_scheme(uri[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +static ares_bool_t ares_uri_str_isvalid(const char *str, size_t max_len, + ares_bool_t (*ischr)(char)) +{ + size_t i; + + if (str == NULL) { + return ARES_FALSE; + } + + for (i = 0; i != max_len && str[i] != 0; i++) { + if (!ischr(str[i])) { + return ARES_FALSE; + } + } + return ARES_TRUE; +} + +ares_status_t ares_uri_set_scheme(ares_uri_t *uri, const char *scheme) +{ + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (!ares_uri_scheme_is_valid(scheme)) { + return ARES_EBADSTR; + } + + ares_strcpy(uri->scheme, scheme, sizeof(uri->scheme)); + ares_str_lower(uri->scheme); + + return ARES_SUCCESS; +} + +const char *ares_uri_get_scheme(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + + return uri->scheme; +} + +static ares_status_t ares_uri_set_username_own(ares_uri_t *uri, char *username) +{ + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (username != NULL && (!ares_str_isprint(username, ares_strlen(username)) || + ares_strlen(username) == 0)) { + return ARES_EBADSTR; + } + + + ares_free(uri->username); + uri->username = username; + return ARES_SUCCESS; +} + +ares_status_t ares_uri_set_username(ares_uri_t *uri, const char *username) +{ + ares_status_t status; + char *temp = NULL; + + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (username != NULL) { + temp = ares_strdup(username); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + status = ares_uri_set_username_own(uri, temp); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +const char *ares_uri_get_username(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + + return uri->username; +} + +static ares_status_t ares_uri_set_password_own(ares_uri_t *uri, char *password) +{ + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (password != NULL && !ares_str_isprint(password, ares_strlen(password))) { + return ARES_EBADSTR; + } + + ares_free(uri->password); + uri->password = password; + return ARES_SUCCESS; +} + +ares_status_t ares_uri_set_password(ares_uri_t *uri, const char *password) +{ + ares_status_t status; + char *temp = NULL; + + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (password != NULL) { + temp = ares_strdup(password); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + status = ares_uri_set_password_own(uri, temp); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +const char *ares_uri_get_password(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + + return uri->password; +} + +ares_status_t ares_uri_set_host(ares_uri_t *uri, const char *host) +{ + struct ares_addr addr; + size_t addrlen; + char hoststr[256]; + char *ll_scope; + + if (uri == NULL || ares_strlen(host) == 0 || + ares_strlen(host) >= sizeof(hoststr)) { + return ARES_EFORMERR; + } + + ares_strcpy(hoststr, host, sizeof(hoststr)); + + /* Look for '%' which could be a link-local scope for ipv6 addresses and + * parse it off */ + ll_scope = strchr(hoststr, '%'); + if (ll_scope != NULL) { + *ll_scope = 0; + ll_scope++; + if (!ares_str_isalnum(ll_scope)) { + return ARES_EBADNAME; + } + } + + /* If its an IP address, normalize it */ + memset(&addr, 0, sizeof(addr)); + addr.family = AF_UNSPEC; + if (ares_dns_pton(hoststr, &addr, &addrlen) != NULL) { + char ipaddr[INET6_ADDRSTRLEN]; + ares_inet_ntop(addr.family, &addr.addr, ipaddr, sizeof(ipaddr)); + /* Only IPv6 is allowed to have a scope */ + if (ll_scope != NULL && addr.family != AF_INET6) { + return ARES_EBADNAME; + } + + if (ll_scope != NULL) { + snprintf(uri->host, sizeof(uri->host), "%s%%%s", ipaddr, ll_scope); + } else { + ares_strcpy(uri->host, ipaddr, sizeof(uri->host)); + } + return ARES_SUCCESS; + } + + /* If its a hostname, make sure its a valid charset */ + if (!ares_is_hostname(host)) { + return ARES_EBADNAME; + } + + ares_strcpy(uri->host, host, sizeof(uri->host)); + return ARES_SUCCESS; +} + +const char *ares_uri_get_host(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + + return uri->host; +} + +ares_status_t ares_uri_set_port(ares_uri_t *uri, unsigned short port) +{ + if (uri == NULL) { + return ARES_EFORMERR; + } + uri->port = port; + return ARES_SUCCESS; +} + +unsigned short ares_uri_get_port(const ares_uri_t *uri) +{ + if (uri == NULL) { + return 0; + } + return uri->port; +} + +/* URI spec says path normalization is a requirement */ +static char *ares_uri_path_normalize(const char *path) +{ + ares_status_t status; + ares_array_t *arr = NULL; + ares_buf_t *outpath = NULL; + ares_buf_t *inpath = NULL; + ares_ssize_t i; + size_t j; + size_t len; + + inpath = + ares_buf_create_const((const unsigned char *)path, ares_strlen(path)); + if (inpath == NULL) { + status = ARES_ENOMEM; + goto done; + } + + outpath = ares_buf_create(); + if (outpath == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares_buf_split_str_array(inpath, (const unsigned char *)"/", 1, + ARES_BUF_SPLIT_TRIM, 0, &arr); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < (ares_ssize_t)ares_array_len(arr); i++) { + const char **strptr = ares_array_at(arr, (size_t)i); + const char *str = *strptr; + + if (ares_streq(str, ".")) { + ares_array_remove_at(arr, (size_t)i); + i--; + } else if (ares_streq(str, "..")) { + if (i != 0) { + ares_array_remove_at(arr, (size_t)i - 1); + i--; + } + ares_array_remove_at(arr, (size_t)i); + i--; + } + } + + status = ares_buf_append_byte(outpath, '/'); + if (status != ARES_SUCCESS) { + goto done; + } + + len = ares_array_len(arr); + for (j = 0; j < len; j++) { + const char **strptr = ares_array_at(arr, j); + const char *str = *strptr; + status = ares_buf_append_str(outpath, str); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Path separator, but on the last entry, we need to check if it was + * originally terminated or not because they have different meanings */ + if (j != len - 1 || path[ares_strlen(path) - 1] == '/') { + status = ares_buf_append_byte(outpath, '/'); + if (status != ARES_SUCCESS) { + goto done; + } + } + } + +done: + ares_array_destroy(arr); + ares_buf_destroy(inpath); + if (status != ARES_SUCCESS) { + ares_buf_destroy(outpath); + return NULL; + } + + return ares_buf_finish_str(outpath, NULL); +} + +ares_status_t ares_uri_set_path(ares_uri_t *uri, const char *path) +{ + char *temp = NULL; + + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (path != NULL && !ares_str_isprint(path, ares_strlen(path))) { + return ARES_EBADSTR; + } + + if (path != NULL) { + temp = ares_uri_path_normalize(path); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + ares_free(uri->path); + uri->path = temp; + + return ARES_SUCCESS; +} + +const char *ares_uri_get_path(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + + return uri->path; +} + +ares_status_t ares_uri_set_query_key(ares_uri_t *uri, const char *key, + const char *val) +{ + if (uri == NULL || key == NULL || *key == 0) { + return ARES_EFORMERR; + } + + if (!ares_str_isprint(key, ares_strlen(key)) || + (val != NULL && !ares_str_isprint(val, ares_strlen(val)))) { + return ARES_EBADSTR; + } + + if (!ares_htable_dict_insert(uri->query, key, val)) { + return ARES_ENOMEM; + } + return ARES_SUCCESS; +} + +ares_status_t ares_uri_del_query_key(ares_uri_t *uri, const char *key) +{ + if (uri == NULL || key == NULL || *key == 0 || + !ares_str_isprint(key, ares_strlen(key))) { + return ARES_EFORMERR; + } + + if (!ares_htable_dict_remove(uri->query, key)) { + return ARES_ENOTFOUND; + } + + return ARES_SUCCESS; +} + +const char *ares_uri_get_query_key(const ares_uri_t *uri, const char *key) +{ + if (uri == NULL || key == NULL || *key == 0 || + !ares_str_isprint(key, ares_strlen(key))) { + return NULL; + } + + return ares_htable_dict_get_direct(uri->query, key); +} + +char **ares_uri_get_query_keys(const ares_uri_t *uri, size_t *num) +{ + if (uri == NULL || num == NULL) { + return NULL; + } + + return ares_htable_dict_keys(uri->query, num); +} + +static ares_status_t ares_uri_set_fragment_own(ares_uri_t *uri, char *fragment) +{ + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (fragment != NULL && !ares_str_isprint(fragment, ares_strlen(fragment))) { + return ARES_EBADSTR; + } + + ares_free(uri->fragment); + uri->fragment = fragment; + return ARES_SUCCESS; +} + +ares_status_t ares_uri_set_fragment(ares_uri_t *uri, const char *fragment) +{ + ares_status_t status; + char *temp = NULL; + + if (uri == NULL) { + return ARES_EFORMERR; + } + + if (fragment != NULL) { + temp = ares_strdup(fragment); + if (temp == NULL) { + return ARES_ENOMEM; + } + } + + status = ares_uri_set_fragment_own(uri, temp); + if (status != ARES_SUCCESS) { + ares_free(temp); + } + + return status; +} + +const char *ares_uri_get_fragment(const ares_uri_t *uri) +{ + if (uri == NULL) { + return NULL; + } + return uri->fragment; +} + +static ares_status_t ares_uri_encode_buf(ares_buf_t *buf, const char *str, + ares_bool_t (*ischr)(char)) +{ + size_t i; + + if (buf == NULL || str == NULL) { + return ARES_EFORMERR; + } + + for (i = 0; str[i] != 0; i++) { + if (ischr(str[i])) { + if (ares_buf_append_byte(buf, (unsigned char)str[i]) != ARES_SUCCESS) { + return ARES_ENOMEM; + } + } else { + if (ares_buf_append_byte(buf, '%') != ARES_SUCCESS) { + return ARES_ENOMEM; + } + if (ares_buf_append_num_hex(buf, (size_t)str[i], 2) != ARES_SUCCESS) { + return ARES_ENOMEM; + } + } + } + return ARES_SUCCESS; +} + +static ares_status_t ares_uri_write_scheme(const ares_uri_t *uri, + ares_buf_t *buf) +{ + ares_status_t status; + + status = ares_buf_append_str(buf, uri->scheme); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_buf_append_str(buf, "://"); + + return status; +} + +static ares_status_t ares_uri_write_authority(const ares_uri_t *uri, + ares_buf_t *buf) +{ + ares_status_t status; + ares_bool_t is_ipv6 = ARES_FALSE; + + if (ares_strlen(uri->username)) { + status = ares_uri_encode_buf(buf, uri->username, ares_uri_chis_userinfo); + if (status != ARES_SUCCESS) { + return status; + } + } + + if (ares_strlen(uri->password)) { + status = ares_buf_append_byte(buf, ':'); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_uri_encode_buf(buf, uri->password, ares_uri_chis_userinfo); + if (status != ARES_SUCCESS) { + return status; + } + } + + if (ares_strlen(uri->username) || ares_strlen(uri->password)) { + status = ares_buf_append_byte(buf, '@'); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* We need to write ipv6 addresses with [ ] */ + if (strchr(uri->host, '%') != NULL) { + /* If we have a % in the name, it must be ipv6 link local scope, so we + * don't need to check anything else */ + is_ipv6 = ARES_TRUE; + } else { + /* Parse the host to see if it is an ipv6 address */ + struct ares_addr addr; + size_t addrlen; + memset(&addr, 0, sizeof(addr)); + addr.family = AF_INET6; + if (ares_dns_pton(uri->host, &addr, &addrlen) != NULL) { + is_ipv6 = ARES_TRUE; + } + } + + if (is_ipv6) { + status = ares_buf_append_byte(buf, '['); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_buf_append_str(buf, uri->host); + if (status != ARES_SUCCESS) { + return status; + } + + if (is_ipv6) { + status = ares_buf_append_byte(buf, ']'); + if (status != ARES_SUCCESS) { + return status; + } + } + + if (uri->port > 0) { + status = ares_buf_append_byte(buf, ':'); + if (status != ARES_SUCCESS) { + return status; + } + status = ares_buf_append_num_dec(buf, uri->port, 0); + if (status != ARES_SUCCESS) { + return status; + } + } + + return status; +} + +static ares_status_t ares_uri_write_path(const ares_uri_t *uri, ares_buf_t *buf) +{ + ares_status_t status; + + if (ares_strlen(uri->path) == 0) { + return ARES_SUCCESS; + } + + if (*uri->path != '/') { + status = ares_buf_append_byte(buf, '/'); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_uri_encode_buf(buf, uri->path, ares_uri_chis_path); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_uri_write_query(const ares_uri_t *uri, + ares_buf_t *buf) +{ + ares_status_t status; + char **keys; + size_t num_keys = 0; + size_t i; + + if (ares_htable_dict_num_keys(uri->query) == 0) { + return ARES_SUCCESS; + } + + keys = ares_uri_get_query_keys(uri, &num_keys); + if (keys == NULL || num_keys == 0) { + return ARES_ENOMEM; + } + + status = ares_buf_append_byte(buf, '?'); + if (status != ARES_SUCCESS) { + goto done; + } + + for (i = 0; i < num_keys; i++) { + const char *val; + + if (i != 0) { + status = ares_buf_append_byte(buf, '&'); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ares_uri_encode_buf(buf, keys[i], ares_uri_chis_query); + if (status != ARES_SUCCESS) { + goto done; + } + + val = ares_uri_get_query_key(uri, keys[i]); + if (val != NULL) { + status = ares_buf_append_byte(buf, '='); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_encode_buf(buf, val, ares_uri_chis_query); + if (status != ARES_SUCCESS) { + goto done; + } + } + } + +done: + ares_free_array(keys, num_keys, ares_free); + return status; +} + +static ares_status_t ares_uri_write_fragment(const ares_uri_t *uri, + ares_buf_t *buf) +{ + ares_status_t status; + + if (!ares_strlen(uri->fragment)) { + return ARES_SUCCESS; + } + + status = ares_buf_append_byte(buf, '#'); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_uri_encode_buf(buf, uri->fragment, ares_uri_chis_fragment); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +ares_status_t ares_uri_write_buf(const ares_uri_t *uri, ares_buf_t *buf) +{ + ares_status_t status; + size_t orig_len; + + if (uri == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + if (ares_strlen(uri->scheme) == 0 || ares_strlen(uri->host) == 0) { + return ARES_ENODATA; + } + + orig_len = ares_buf_len(buf); + + status = ares_uri_write_scheme(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_write_authority(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_write_path(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_write_query(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_write_fragment(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + if (status != ARES_SUCCESS) { + ares_buf_set_length(buf, orig_len); + } + return status; +} + +ares_status_t ares_uri_write(char **out, const ares_uri_t *uri) +{ + ares_buf_t *buf; + ares_status_t status; + + if (out == NULL || uri == NULL) { + return ARES_EFORMERR; + } + + *out = NULL; + + buf = ares_buf_create(); + if (buf == NULL) { + return ARES_ENOMEM; + } + + status = ares_uri_write_buf(uri, buf); + if (status != ARES_SUCCESS) { + ares_buf_destroy(buf); + return status; + } + + *out = ares_buf_finish_str(buf, NULL); + return ARES_SUCCESS; +} + +#define xdigit_val(x) \ + ((x >= '0' && x <= '9') \ + ? (x - '0') \ + : ((x >= 'A' && x <= 'F') ? (x - 'A' + 10) : (x - 'a' + 10))) + +static ares_status_t ares_uri_decode_inplace(char *str, ares_bool_t is_query, + ares_bool_t must_be_printable, + size_t *out_len) +{ + size_t i; + size_t len = 0; + + for (i = 0; str[i] != 0; i++) { + if (is_query && str[i] == '+') { + str[len++] = ' '; + continue; + } + + if (str[i] != '%') { + str[len++] = str[i]; + continue; + } + + if (!ares_isxdigit(str[i + 1]) || !ares_isxdigit(str[i + 2])) { + return ARES_EBADSTR; + } + + str[len] = (char)(xdigit_val(str[i + 1]) << 4 | xdigit_val(str[i + 2])); + + if (must_be_printable && !ares_isprint(str[len])) { + return ARES_EBADSTR; + } + + len++; + + i += 2; + } + + str[len] = 0; + + *out_len = len; + return ARES_SUCCESS; +} + +static ares_status_t ares_uri_parse_scheme(ares_uri_t *uri, ares_buf_t *buf) +{ + ares_status_t status; + size_t bytes; + char scheme[sizeof(uri->scheme)]; + + ares_buf_tag(buf); + + bytes = + ares_buf_consume_until_seq(buf, (const unsigned char *)"://", 3, ARES_TRUE); + if (bytes == SIZE_MAX || bytes > sizeof(uri->scheme)) { + return ARES_EBADSTR; + } + + status = ares_buf_tag_fetch_string(buf, scheme, sizeof(scheme)); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_uri_set_scheme(uri, scheme); + if (status != ARES_SUCCESS) { + return status; + } + + /* Consume :// */ + ares_buf_consume(buf, 3); + + return ARES_SUCCESS; +} + +static ares_status_t ares_uri_parse_userinfo(ares_uri_t *uri, ares_buf_t *buf) +{ + size_t userinfo_len; + size_t username_len; + ares_bool_t has_password = ARES_FALSE; + char *temp = NULL; + ares_status_t status; + size_t len; + + ares_buf_tag(buf); + + /* Search for @, if its not found, return */ + userinfo_len = ares_buf_consume_until_charset(buf, (const unsigned char *)"@", + 1, ARES_TRUE); + + if (userinfo_len == SIZE_MAX) { + return ARES_SUCCESS; + } + + /* Rollback since now we know there really is userinfo */ + ares_buf_tag_rollback(buf); + + /* Search for ':', if it isn't found or its past the '@' then we only have + * a username and no password */ + ares_buf_tag(buf); + username_len = ares_buf_consume_until_charset(buf, (const unsigned char *)":", + 1, ARES_TRUE); + if (username_len < userinfo_len) { + has_password = ARES_TRUE; + status = ares_buf_tag_fetch_strdup(buf, &temp); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_decode_inplace(temp, ARES_FALSE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_set_username_own(uri, temp); + if (status != ARES_SUCCESS) { + goto done; + } + temp = NULL; + + /* Consume : */ + ares_buf_consume(buf, 1); + } + + ares_buf_tag(buf); + ares_buf_consume_until_charset(buf, (const unsigned char *)"@", 1, ARES_TRUE); + status = ares_buf_tag_fetch_strdup(buf, &temp); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_decode_inplace(temp, ARES_FALSE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + if (has_password) { + status = ares_uri_set_password_own(uri, temp); + } else { + status = ares_uri_set_username_own(uri, temp); + } + if (status != ARES_SUCCESS) { + goto done; + } + temp = NULL; + + /* Consume @ */ + ares_buf_consume(buf, 1); + +done: + ares_free(temp); + return status; +} + +static ares_status_t ares_uri_parse_hostport(ares_uri_t *uri, ares_buf_t *buf) +{ + unsigned char b; + char host[256]; + char port[6]; + size_t len; + ares_status_t status; + + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + return status; + } + + /* Bracketed syntax for ipv6 addresses */ + if (b == '[') { + ares_buf_consume(buf, 1); + ares_buf_tag(buf); + len = ares_buf_consume_until_charset(buf, (const unsigned char *)"]", 1, + ARES_TRUE); + if (len == SIZE_MAX) { + return ARES_EBADSTR; + } + + status = ares_buf_tag_fetch_string(buf, host, sizeof(host)); + if (status != ARES_SUCCESS) { + return status; + } + /* Consume ']' */ + ares_buf_consume(buf, 1); + } else { + /* Either ipv4 or hostname */ + ares_buf_tag(buf); + ares_buf_consume_until_charset(buf, (const unsigned char *)":", 1, + ARES_FALSE); + + status = ares_buf_tag_fetch_string(buf, host, sizeof(host)); + if (status != ARES_SUCCESS) { + return status; + } + } + + status = ares_uri_set_host(uri, host); + if (status != ARES_SUCCESS) { + return status; + } + + /* No port if nothing left to consume */ + if (!ares_buf_len(buf)) { + return status; + } + + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + return status; + } + + /* Only valid extra character at this point is ':' */ + if (b != ':') { + return ARES_EBADSTR; + } + ares_buf_consume(buf, 1); + + len = ares_buf_len(buf); + if (len == 0 || len > sizeof(port) - 1) { + return ARES_EBADSTR; + } + + status = ares_buf_fetch_bytes(buf, (unsigned char *)port, len); + if (status != ARES_SUCCESS) { + return status; + } + port[len] = 0; + + if (!ares_str_isnum(port)) { + return ARES_EBADSTR; + } + + status = ares_uri_set_port(uri, (unsigned short)atoi(port)); + if (status != ARES_SUCCESS) { + return status; + } + + return ARES_SUCCESS; +} + +static ares_status_t ares_uri_parse_authority(ares_uri_t *uri, ares_buf_t *buf) +{ + ares_status_t status; + size_t bytes; + ares_buf_t *auth = NULL; + const unsigned char *ptr; + size_t ptr_len; + + ares_buf_tag(buf); + + bytes = ares_buf_consume_until_charset(buf, (const unsigned char *)"/?#", 3, + ARES_FALSE); + if (bytes == 0) { + return ARES_EBADSTR; + } + + status = ares_buf_tag_fetch_constbuf(buf, &auth); + if (status != ARES_SUCCESS) { + goto done; + } + + ptr = ares_buf_peek(auth, &ptr_len); + if (!ares_uri_str_isvalid((const char *)ptr, ptr_len, + ares_uri_chis_authority)) { + status = ARES_EBADSTR; + goto done; + } + + status = ares_uri_parse_userinfo(uri, auth); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_hostport(uri, auth); + if (status != ARES_SUCCESS) { + goto done; + } + + /* NOTE: the /, ?, or # is still in the buffer at this point so it can + * be used to determine what parser should be called next */ + +done: + ares_buf_destroy(auth); + return status; +} + +static ares_status_t ares_uri_parse_path(ares_uri_t *uri, ares_buf_t *buf) +{ + unsigned char b; + char *path = NULL; + ares_status_t status; + size_t len; + + if (ares_buf_len(buf) == 0) { + return ARES_SUCCESS; + } + + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + return status; + } + + /* Not a path, must be one of the others */ + if (b != '/') { + return ARES_SUCCESS; + } + + ares_buf_tag(buf); + ares_buf_consume_until_charset(buf, (const unsigned char *)"?#", 2, + ARES_FALSE); + status = ares_buf_tag_fetch_strdup(buf, &path); + if (status != ARES_SUCCESS) { + goto done; + } + + if (!ares_uri_str_isvalid(path, SIZE_MAX, ares_uri_chis_path_enc)) { + status = ARES_EBADSTR; + goto done; + } + + status = ares_uri_decode_inplace(path, ARES_FALSE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_set_path(uri, path); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_free(path); + return status; +} + +static ares_status_t ares_uri_parse_query_buf(ares_uri_t *uri, ares_buf_t *buf) +{ + ares_status_t status = ARES_SUCCESS; + char *key = NULL; + char *val = NULL; + + while (ares_buf_len(buf) > 0) { + unsigned char b = 0; + size_t len; + + ares_buf_tag(buf); + + /* Its valid to have only a key with no value, so we search for both + * delims */ + len = ares_buf_consume_until_charset(buf, (const unsigned char *)"&=", 2, + ARES_FALSE); + if (len == 0) { + /* If we're here, we have a zero length key which is invalid */ + status = ARES_EBADSTR; + goto done; + } + + if (ares_buf_len(buf) > 0) { + /* Determine if we stopped on & or = */ + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + goto done; + } + } + + status = ares_buf_tag_fetch_strdup(buf, &key); + if (status != ARES_SUCCESS) { + goto done; + } + + if (!ares_uri_str_isvalid(key, SIZE_MAX, ares_uri_chis_query_enc)) { + status = ARES_EBADSTR; + goto done; + } + + status = ares_uri_decode_inplace(key, ARES_TRUE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Fetch Value */ + if (b == '=') { + /* Skip delimiter */ + ares_buf_consume(buf, 1); + ares_buf_tag(buf); + len = ares_buf_consume_until_charset(buf, (const unsigned char *)"&", 1, + ARES_FALSE); + if (len > 0) { + status = ares_buf_tag_fetch_strdup(buf, &val); + if (status != ARES_SUCCESS) { + goto done; + } + + if (!ares_uri_str_isvalid(val, SIZE_MAX, ares_uri_chis_query_enc)) { + status = ARES_EBADSTR; + goto done; + } + + status = ares_uri_decode_inplace(val, ARES_TRUE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + } + } + + if (b != 0) { + /* Consume '&' */ + ares_buf_consume(buf, 1); + } + + status = ares_uri_set_query_key(uri, key, val); + if (status != ARES_SUCCESS) { + goto done; + } + + ares_free(key); + key = NULL; + ares_free(val); + val = NULL; + } + +done: + ares_free(key); + ares_free(val); + return status; +} + +static ares_status_t ares_uri_parse_query(ares_uri_t *uri, ares_buf_t *buf) +{ + unsigned char b; + ares_status_t status; + ares_buf_t *query = NULL; + size_t len; + + if (ares_buf_len(buf) == 0) { + return ARES_SUCCESS; + } + + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + return status; + } + + /* Not a query, must be one of the others */ + if (b != '?') { + return ARES_SUCCESS; + } + + /* Only possible terminator is fragment indicator of '#' */ + ares_buf_consume(buf, 1); + ares_buf_tag(buf); + len = ares_buf_consume_until_charset(buf, (const unsigned char *)"#", 1, + ARES_FALSE); + if (len == 0) { + /* No data, return */ + return ARES_SUCCESS; + } + + status = ares_buf_tag_fetch_constbuf(buf, &query); + if (status != ARES_SUCCESS) { + return status; + } + + status = ares_uri_parse_query_buf(uri, query); + ares_buf_destroy(query); + + return status; +} + +static ares_status_t ares_uri_parse_fragment(ares_uri_t *uri, ares_buf_t *buf) +{ + unsigned char b; + char *fragment = NULL; + ares_status_t status; + size_t len; + + if (ares_buf_len(buf) == 0) { + return ARES_SUCCESS; + } + + status = ares_buf_peek_byte(buf, &b); + if (status != ARES_SUCCESS) { + return status; + } + + /* Not a fragment, must be one of the others */ + if (b != '#') { + return ARES_SUCCESS; + } + + ares_buf_consume(buf, 1); + + if (ares_buf_len(buf) == 0) { + return ARES_SUCCESS; + } + + /* Rest of the buffer is the fragment */ + status = ares_buf_fetch_str_dup(buf, ares_buf_len(buf), &fragment); + if (status != ARES_SUCCESS) { + goto done; + } + + if (!ares_uri_str_isvalid(fragment, SIZE_MAX, ares_uri_chis_fragment_enc)) { + status = ARES_EBADSTR; + goto done; + } + + status = ares_uri_decode_inplace(fragment, ARES_FALSE, ARES_TRUE, &len); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_set_fragment_own(uri, fragment); + if (status != ARES_SUCCESS) { + goto done; + } + fragment = NULL; + +done: + ares_free(fragment); + return status; +} + +ares_status_t ares_uri_parse_buf(ares_uri_t **out, ares_buf_t *buf) +{ + ares_status_t status; + ares_uri_t *uri = NULL; + size_t orig_pos; + + if (out == NULL || buf == NULL) { + return ARES_EFORMERR; + } + + *out = NULL; + + orig_pos = ares_buf_get_position(buf); + + uri = ares_uri_create(); + if (uri == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares_uri_parse_scheme(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_authority(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_path(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_query(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_fragment(uri, buf); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + if (status != ARES_SUCCESS) { + ares_buf_set_position(buf, orig_pos); + ares_uri_destroy(uri); + } else { + *out = uri; + } + return status; +} + +ares_status_t ares_uri_parse(ares_uri_t **out, const char *str) +{ + ares_status_t status; + ares_buf_t *buf = NULL; + + if (out == NULL || str == NULL) { + return ARES_EFORMERR; + } + + *out = NULL; + + buf = ares_buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + status = ares_buf_append_str(buf, str); + if (status != ARES_SUCCESS) { + goto done; + } + + status = ares_uri_parse_buf(out, buf); + if (status != ARES_SUCCESS) { + goto done; + } + +done: + ares_buf_destroy(buf); + + return status; +} diff --git a/deps/cares/src/lib/util/ares_uri.h b/deps/cares/src/lib/util/ares_uri.h new file mode 100644 index 00000000000000..2d8138fdc3e3d0 --- /dev/null +++ b/deps/cares/src/lib/util/ares_uri.h @@ -0,0 +1,252 @@ +/* MIT License + * + * Copyright (c) 2024 Brad House + * + * 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 (including the next + * paragraph) 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. + * + * SPDX-License-Identifier: MIT + */ +#ifndef __ARES_URI_H +#define __ARES_URI_H + +/*! \addtogroup ares_uri URI parser and writer implementation + * + * This is a fairly complete URI parser and writer implementation (RFC 3986) for + * schemes which use the :// syntax. Does not currently support URIs without an + * authority section, such as "mailto:person@example.com". + * + * Its implementation is overkill for our current needs to be able to express + * DNS server configuration, but there was really no reason not to support + * a greater subset of the specification. + * + * @{ + */ + + +struct ares_uri; + +/*! URI object */ +typedef struct ares_uri ares_uri_t; + +/*! Create a new URI object + * + * \return new ares_uri_t, must be freed with ares_uri_destroy() + */ +ares_uri_t *ares_uri_create(void); + +/*! Destroy an initialized URI object + * + * \param[in] uri Initialized URI object + */ +void ares_uri_destroy(ares_uri_t *uri); + +/*! Set the URI scheme. Automatically lower-cases the scheme provided. + * Only allows Alpha, Digit, +, -, and . characters. Maximum length is + * 15 characters. This is required to be set to write a URI. + * + * \param[in] uri Initialized URI object + * \param[in] scheme Scheme to set the object to use + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_scheme(ares_uri_t *uri, const char *scheme); + +/*! Retrieve the currently configured URI scheme. + * + * \param[in] uri Initialized URI object + * \return string containing URI scheme + */ +const char *ares_uri_get_scheme(const ares_uri_t *uri); + +/*! Set the username in the URI object + * + * \param[in] uri Initialized URI object + * \param[in] username Username to set. May be NULL to unset existing username. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_username(ares_uri_t *uri, const char *username); + +/*! Retrieve the currently configured username. + * + * \param[in] uri Initialized URI object + * \return string containing username, maybe NULL if not set. + */ +const char *ares_uri_get_username(const ares_uri_t *uri); + +/*! Set the password in the URI object + * + * \param[in] uri Initialized URI object + * \param[in] password Password to set. May be NULL to unset existing password. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_password(ares_uri_t *uri, const char *password); + +/*! Retrieve the currently configured password. + * + * \param[in] uri Initialized URI object + * \return string containing password, maybe NULL if not set. + */ +const char *ares_uri_get_password(const ares_uri_t *uri); + +/*! Set the host or ip address in the URI object. This is required to be + * set to write a URI. The character set is strictly validated. + * + * \param[in] uri Initialized URI object + * \param[in] host IPv4, IPv6, or hostname to set. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_host(ares_uri_t *uri, const char *host); + +/*! Retrieve the currently configured host (or ip address). IPv6 addresses + * May include a link-local scope (e.g. fe80::b542:84df:1719:65e3%en0). + * + * \param[in] uri Initialized URI object + * \return string containing host, maybe NULL if not set. + */ +const char *ares_uri_get_host(const ares_uri_t *uri); + +/*! Set the port to use in the URI object. A port value of 0 will omit + * the port from the URI when written, thus using the scheme's default. + * + * \param[in] uri Initialized URI object + * \param[in] port Port to set. Use 0 to unset. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_port(ares_uri_t *uri, unsigned short port); + +/*! Retrieve the currently configured port + * + * \param[in] uri Initialized URI object + * \return port number, or 0 if not set. + */ +unsigned short ares_uri_get_port(const ares_uri_t *uri); + +/*! Set the path in the URI object. Unsupported characters will be URI-encoded + * when written. + * + * \param[in] uri Initialized URI object + * \param[in] path Path to set. May be NULL to unset existing path. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_path(ares_uri_t *uri, const char *path); + +/*! Retrieves the path in the URI object. If retrieved after parse, this + * value will be URI-decoded already. + * + * \param[in] uri Initialized URI object + * \return path string, or NULL if not set. + */ +const char *ares_uri_get_path(const ares_uri_t *uri); + +/*! Set a new query key/value pair. There is no set order for query keys + * when output in the URI, they will be emitted in a random order. Keys are + * case-insensitive. Query keys and values will be automatically URI-encoded + * when written. + * + * \param[in] uri Initialized URI object + * \param[in] key Query key to use, must be non-zero length. + * \param[in] val Query value to use, may be NULL. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_query_key(ares_uri_t *uri, const char *key, + const char *val); + +/*! Delete a specific query key. + * + * \param[in] uri Initialized URI object + * \param[in] key Key to delete. + * \return ARES_SUCCESS if deleted, ARES_ENOTFOUND if not found + */ +ares_status_t ares_uri_del_query_key(ares_uri_t *uri, const char *key); + +/*! Retrieve the value associated with a query key. Keys are case-insensitive. + * + * \param[in] uri Initialized URI object + * \param[in] key Key to retrieve. + * \return string representing value, may be NULL if either not found or + * NULL value set. There is currently no way to indicate the + * difference. + */ +const char *ares_uri_get_query_key(const ares_uri_t *uri, const char *key); + +/*! Retrieve a complete list of query keys. + * + * \param[in] uri Initialized URI object + * \param[out] num Number of keys. + * \return NULL on failure or no keys. Use + * ares_free_array(keys, num, ares_free) when done with array. + */ +char **ares_uri_get_query_keys(const ares_uri_t *uri, size_t *num); + +/*! Set the fragment in the URI object. Unsupported characters will be + * URI-encoded when written. + * + * \param[in] uri Initialized URI object + * \param[in] fragment Fragment to set. May be NULL to unset existing fragment. + * \return ARES_SUCCESS on success + */ +ares_status_t ares_uri_set_fragment(ares_uri_t *uri, const char *fragment); + +/*! Retrieves the fragment in the URI object. If retrieved after parse, this + * value will be URI-decoded already. + * + * \param[in] uri Initialized URI object + * \return fragment string, or NULL if not set. + */ +const char *ares_uri_get_fragment(const ares_uri_t *uri); + +/*! Parse the provided URI buffer into a new URI object. + * + * \param[out] out Returned new URI object. free with ares_uri_destroy(). + * \param[in] buf Buffer object containing the URI + * \return ARES_SUCCESS on successful parse. On failure the 'buf' object will + * be restored to its initial state in case another parser needs to + * be attempted. + */ +ares_status_t ares_uri_parse_buf(ares_uri_t **out, ares_buf_t *buf); + +/*! Parse the provided URI string into a new URI object. + * + * \param[out] out Returned new URI object. free with ares_uri_destroy(). + * \param[in] uri URI string to parse + * \return ARES_SUCCESS on successful parse + */ +ares_status_t ares_uri_parse(ares_uri_t **out, const char *uri); + +/*! Write URI object to a new string buffer. Requires at least the scheme + * and host to be set for this to succeed. + * + * \param[out] out Returned new URI string. Free with ares_free(). + * \param[in] uri Initialized URI object. + * \return ARES_SUCCESS on successful write. + */ +ares_status_t ares_uri_write(char **out, const ares_uri_t *uri); + +/*! Write URI object to an existing ares_buf_t object. Requires at least the + * scheme and host to be set for this to succeed. + * + * \param[in] uri Initialized URI object. + * \param[in,out] buf Destination buf object. + * \return ARES_SUCCESS on successful write. + */ +ares_status_t ares_uri_write_buf(const ares_uri_t *uri, ares_buf_t *buf); + +/*! @} */ + +#endif /* __ARES_URI_H */ diff --git a/deps/cares/src/lib/windows_port.c b/deps/cares/src/lib/windows_port.c index d5f0ad3abf608b..22f0dc020a0730 100644 --- a/deps/cares/src/lib/windows_port.c +++ b/deps/cares/src/lib/windows_port.c @@ -6,12 +6,12 @@ * SPDX-License-Identifier: MIT * */ -#include "ares_setup.h" +#include "ares_private.h" /* only do the following on windows */ -#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) +#if defined(_WIN32) && !defined(MSDOS) # ifdef __WATCOMC__ /* diff --git a/deps/cares/src/tools/CMakeLists.txt b/deps/cares/src/tools/CMakeLists.txt index fb795a91741aaf..c8c0041e54de81 100644 --- a/deps/cares/src/tools/CMakeLists.txt +++ b/deps/cares/src/tools/CMakeLists.txt @@ -11,6 +11,7 @@ IF (CARES_BUILD_TOOLS) PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/lib>" + "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/lib/include>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" @@ -19,19 +20,32 @@ IF (CARES_BUILD_TOOLS) C_STANDARD 90 ) + IF (ANDROID) + SET_TARGET_PROPERTIES (ahost PROPERTIES C_STANDARD 99) + ENDIF () + TARGET_COMPILE_DEFINITIONS (ahost PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED) TARGET_LINK_LIBRARIES (ahost PRIVATE ${PROJECT_NAME}) + + # Avoid "fatal error C1041: cannot open program database" due to multiple + # targets trying to use the same PDB. /FS does NOT resolve this issue. + SET_TARGET_PROPERTIES(ahost PROPERTIES COMPILE_PDB_NAME ahost.pdb) + IF (CARES_INSTALL) INSTALL (TARGETS ahost COMPONENT Tools ${TARGETS_INST_DEST}) ENDIF () # Build adig - ADD_EXECUTABLE (adig adig.c ${SAMPLESOURCES}) + ADD_EXECUTABLE (adig adig.c) + # Don't build adig and ahost in parallel. This is to prevent a Windows MSVC + # build error due to them both using the same source files. + ADD_DEPENDENCIES(adig ahost) TARGET_INCLUDE_DIRECTORIES (adig PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/lib>" + "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/lib/include>" "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" @@ -40,8 +54,17 @@ IF (CARES_BUILD_TOOLS) C_STANDARD 90 ) + IF (ANDROID) + SET_TARGET_PROPERTIES (adig PROPERTIES C_STANDARD 99) + ENDIF () + TARGET_COMPILE_DEFINITIONS (adig PRIVATE HAVE_CONFIG_H=1 CARES_NO_DEPRECATED) TARGET_LINK_LIBRARIES (adig PRIVATE ${PROJECT_NAME}) + + # Avoid "fatal error C1041: cannot open program database" due to multiple + # targets trying to use the same PDB. /FS does NOT resolve this issue. + SET_TARGET_PROPERTIES(adig PROPERTIES COMPILE_PDB_NAME adig.pdb) + IF (CARES_INSTALL) INSTALL (TARGETS adig COMPONENT Tools ${TARGETS_INST_DEST}) ENDIF () diff --git a/deps/cares/src/tools/Makefile.am b/deps/cares/src/tools/Makefile.am index ba7a672f89faf5..439b40b192a880 100644 --- a/deps/cares/src/tools/Makefile.am +++ b/deps/cares/src/tools/Makefile.am @@ -16,6 +16,7 @@ AM_CPPFLAGS += -I$(top_builddir)/include \ -I$(top_builddir)/src/lib \ -I$(top_srcdir)/include \ -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ -DCARES_NO_DEPRECATED include Makefile.inc @@ -28,6 +29,6 @@ ahost_SOURCES = ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) ahost_CFLAGS = $(AM_CFLAGS) ahost_CPPFLAGS = $(AM_CPPFLAGS) -adig_SOURCES = adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) +adig_SOURCES = adig.c adig_CFLAGS = $(AM_CFLAGS) adig_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/deps/cares/src/tools/Makefile.in b/deps/cares/src/tools/Makefile.in index 0b7a310baaab5d..b3f8333f090d78 100644 --- a/deps/cares/src/tools/Makefile.in +++ b/deps/cares/src/tools/Makefile.in @@ -91,7 +91,9 @@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) subdir = src/tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -101,12 +103,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ - $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_file_escapes.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_require_defined.m4 \ @@ -124,12 +123,7 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = ahost$(EXEEXT) adig$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) -am__dirstamp = $(am__leading_dot)dirstamp -am__objects_1 = adig-ares_getopt.$(OBJEXT) \ - ../lib/adig-ares_strcasecmp.$(OBJEXT) -am__objects_2 = -am_adig_OBJECTS = adig-adig.$(OBJEXT) $(am__objects_1) \ - $(am__objects_2) +am_adig_OBJECTS = adig-adig.$(OBJEXT) adig_OBJECTS = $(am_adig_OBJECTS) adig_LDADD = $(LDADD) am__DEPENDENCIES_1 = @@ -142,9 +136,9 @@ am__v_lt_1 = adig_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(adig_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -am__objects_3 = ahost-ares_getopt.$(OBJEXT) \ - ../lib/ahost-ares_strcasecmp.$(OBJEXT) -am_ahost_OBJECTS = ahost-ahost.$(OBJEXT) $(am__objects_3) \ +am__objects_1 = ahost-ares_getopt.$(OBJEXT) +am__objects_2 = +am_ahost_OBJECTS = ahost-ahost.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) ahost_OBJECTS = $(am_ahost_OBJECTS) ahost_LDADD = $(LDADD) @@ -168,9 +162,7 @@ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles -am__depfiles_remade = ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po \ - ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po \ - ./$(DEPDIR)/adig-adig.Po ./$(DEPDIR)/adig-ares_getopt.Po \ +am__depfiles_remade = ./$(DEPDIR)/adig-adig.Po \ ./$(DEPDIR)/ahost-ahost.Po ./$(DEPDIR)/ahost-ares_getopt.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -228,7 +220,8 @@ AM_CFLAGS = @AM_CFLAGS@ # might possibly already be installed in the system. AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/include \ -I$(top_builddir)/src/lib -I$(top_srcdir)/include \ - -I$(top_srcdir)/src/lib -DCARES_NO_DEPRECATED + -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include \ + -DCARES_NO_DEPRECATED AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ @@ -273,10 +266,15 @@ FGREP = @FGREP@ FILECMD = @FILECMD@ GCOV = @GCOV@ GENHTML = @GENHTML@ +GMOCK112_CFLAGS = @GMOCK112_CFLAGS@ +GMOCK112_LIBS = @GMOCK112_LIBS@ +GMOCK117_CFLAGS = @GMOCK117_CFLAGS@ +GMOCK117_LIBS = @GMOCK117_LIBS@ GMOCK_CFLAGS = @GMOCK_CFLAGS@ GMOCK_LIBS = @GMOCK_LIBS@ GREP = @GREP@ HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX17 = @HAVE_CXX17@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -390,12 +388,8 @@ EXTRA_DIST = CMakeLists.txt Makefile.inc # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_strcasecmp.c - -SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_strcasecmp.h - +SAMPLESOURCES = ares_getopt.c +SAMPLEHEADERS = ares_getopt.h # We're not interested in code coverage of the test apps themselves, but need # to link with gcov if building with code coverage enabled @@ -403,7 +397,7 @@ LDADD = $(top_builddir)/src/lib/libcares.la $(CODE_COVERAGE_LIBS) ahost_SOURCES = ahost.c $(SAMPLESOURCES) $(SAMPLEHEADERS) ahost_CFLAGS = $(AM_CFLAGS) ahost_CPPFLAGS = $(AM_CPPFLAGS) -adig_SOURCES = adig.c $(SAMPLESOURCES) $(SAMPLEHEADERS) +adig_SOURCES = adig.c adig_CFLAGS = $(AM_CFLAGS) adig_CPPFLAGS = $(AM_CPPFLAGS) all: all-am @@ -449,20 +443,10 @@ clean-noinstPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -../lib/$(am__dirstamp): - @$(MKDIR_P) ../lib - @: > ../lib/$(am__dirstamp) -../lib/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) ../lib/$(DEPDIR) - @: > ../lib/$(DEPDIR)/$(am__dirstamp) -../lib/adig-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) adig$(EXEEXT): $(adig_OBJECTS) $(adig_DEPENDENCIES) $(EXTRA_adig_DEPENDENCIES) @rm -f adig$(EXEEXT) $(AM_V_CCLD)$(adig_LINK) $(adig_OBJECTS) $(adig_LDADD) $(LIBS) -../lib/ahost-ares_strcasecmp.$(OBJEXT): ../lib/$(am__dirstamp) \ - ../lib/$(DEPDIR)/$(am__dirstamp) ahost$(EXEEXT): $(ahost_OBJECTS) $(ahost_DEPENDENCIES) $(EXTRA_ahost_DEPENDENCIES) @rm -f ahost$(EXEEXT) @@ -470,15 +454,11 @@ ahost$(EXEEXT): $(ahost_OBJECTS) $(ahost_DEPENDENCIES) $(EXTRA_ahost_DEPENDENCIE mostlyclean-compile: -rm -f *.$(OBJEXT) - -rm -f ../lib/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/adig-ares_strcasecmp.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-adig.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adig-ares_getopt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ahost-ahost.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ahost-ares_getopt.Po@am__quote@ # am--include-marker @@ -526,34 +506,6 @@ adig-adig.obj: adig.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o adig-adig.obj `if test -f 'adig.c'; then $(CYGPATH_W) 'adig.c'; else $(CYGPATH_W) '$(srcdir)/adig.c'; fi` -adig-ares_getopt.o: ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT adig-ares_getopt.o -MD -MP -MF $(DEPDIR)/adig-ares_getopt.Tpo -c -o adig-ares_getopt.o `test -f 'ares_getopt.c' || echo '$(srcdir)/'`ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adig-ares_getopt.Tpo $(DEPDIR)/adig-ares_getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_getopt.c' object='adig-ares_getopt.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o adig-ares_getopt.o `test -f 'ares_getopt.c' || echo '$(srcdir)/'`ares_getopt.c - -adig-ares_getopt.obj: ares_getopt.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT adig-ares_getopt.obj -MD -MP -MF $(DEPDIR)/adig-ares_getopt.Tpo -c -o adig-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adig-ares_getopt.Tpo $(DEPDIR)/adig-ares_getopt.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ares_getopt.c' object='adig-ares_getopt.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o adig-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` - -../lib/adig-ares_strcasecmp.o: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo -c -o ../lib/adig-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/adig-ares_strcasecmp.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c - -../lib/adig-ares_strcasecmp.obj: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -MT ../lib/adig-ares_strcasecmp.obj -MD -MP -MF ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo -c -o ../lib/adig-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/adig-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/adig-ares_strcasecmp.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(adig_CPPFLAGS) $(CPPFLAGS) $(adig_CFLAGS) $(CFLAGS) -c -o ../lib/adig-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` - ahost-ahost.o: ahost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ahost-ahost.o -MD -MP -MF $(DEPDIR)/ahost-ahost.Tpo -c -o ahost-ahost.o `test -f 'ahost.c' || echo '$(srcdir)/'`ahost.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ahost-ahost.Tpo $(DEPDIR)/ahost-ahost.Po @@ -582,20 +534,6 @@ ahost-ares_getopt.obj: ares_getopt.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ahost-ares_getopt.obj `if test -f 'ares_getopt.c'; then $(CYGPATH_W) 'ares_getopt.c'; else $(CYGPATH_W) '$(srcdir)/ares_getopt.c'; fi` -../lib/ahost-ares_strcasecmp.o: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_strcasecmp.o -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo -c -o ../lib/ahost-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/ahost-ares_strcasecmp.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_strcasecmp.o `test -f '../lib/ares_strcasecmp.c' || echo '$(srcdir)/'`../lib/ares_strcasecmp.c - -../lib/ahost-ares_strcasecmp.obj: ../lib/ares_strcasecmp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -MT ../lib/ahost-ares_strcasecmp.obj -MD -MP -MF ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo -c -o ../lib/ahost-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Tpo ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../lib/ares_strcasecmp.c' object='../lib/ahost-ares_strcasecmp.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ahost_CPPFLAGS) $(CPPFLAGS) $(ahost_CFLAGS) $(CFLAGS) -c -o ../lib/ahost-ares_strcasecmp.obj `if test -f '../lib/ares_strcasecmp.c'; then $(CYGPATH_W) '../lib/ares_strcasecmp.c'; else $(CYGPATH_W) '$(srcdir)/../lib/ares_strcasecmp.c'; fi` - mostlyclean-libtool: -rm -f *.lo @@ -716,8 +654,6 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -rm -f ../lib/$(DEPDIR)/$(am__dirstamp) - -rm -f ../lib/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -728,10 +664,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po - -rm -f ./$(DEPDIR)/adig-adig.Po - -rm -f ./$(DEPDIR)/adig-ares_getopt.Po + -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/ahost-ahost.Po -rm -f ./$(DEPDIR)/ahost-ares_getopt.Po -rm -f Makefile @@ -779,10 +712,7 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -f ../lib/$(DEPDIR)/adig-ares_strcasecmp.Po - -rm -f ../lib/$(DEPDIR)/ahost-ares_strcasecmp.Po - -rm -f ./$(DEPDIR)/adig-adig.Po - -rm -f ./$(DEPDIR)/adig-ares_getopt.Po + -rm -f ./$(DEPDIR)/adig-adig.Po -rm -f ./$(DEPDIR)/ahost-ahost.Po -rm -f ./$(DEPDIR)/ahost-ares_getopt.Po -rm -f Makefile diff --git a/deps/cares/src/tools/Makefile.inc b/deps/cares/src/tools/Makefile.inc index dd081b3005d436..088c7d4e06206d 100644 --- a/deps/cares/src/tools/Makefile.inc +++ b/deps/cares/src/tools/Makefile.inc @@ -1,7 +1,5 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -SAMPLESOURCES = ares_getopt.c \ - ../lib/ares_strcasecmp.c +SAMPLESOURCES = ares_getopt.c -SAMPLEHEADERS = ares_getopt.h \ - ../lib/ares_strcasecmp.h +SAMPLEHEADERS = ares_getopt.h diff --git a/deps/cares/src/tools/adig.c b/deps/cares/src/tools/adig.c index cd427f4b193526..fce210a8053578 100644 --- a/deps/cares/src/tools/adig.c +++ b/deps/cares/src/tools/adig.c @@ -43,212 +43,159 @@ #endif #include "ares.h" +#include "ares_array.h" +#include "ares_buf.h" #include "ares_dns.h" - -#ifndef HAVE_STRDUP -# include "ares_str.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) -#endif - #include "ares_getopt.h" +#include "ares_mem.h" +#include "ares_str.h" + +#include "limits.h" -#ifdef WATT32 -# undef WIN32 /* Redefined in MingW headers */ +#ifndef PATH_MAX +# define PATH_MAX 1024 #endif +typedef struct { + unsigned short port; + size_t tries; + size_t ndots; + ares_bool_t tcp; + ares_bool_t ignore_tc; + char *search; + ares_bool_t do_search; + ares_bool_t aa_flag; + ares_bool_t ad_flag; + ares_bool_t cd_flag; + ares_bool_t rd_flag; + /* ares_bool_t do_flag; */ + ares_bool_t edns; + size_t udp_size; + ares_bool_t primary; + ares_bool_t aliases; + ares_bool_t stayopen; + ares_bool_t dns0x20; + ares_bool_t display_class; + ares_bool_t display_ttl; + ares_bool_t display_command; + ares_bool_t display_stats; + ares_bool_t display_query; + ares_bool_t display_question; + ares_bool_t display_answer; + ares_bool_t display_authority; + ares_bool_t display_additional; + ares_bool_t display_comments; +} dns_options_t; typedef struct { + dns_options_t opts; ares_bool_t is_help; + ares_bool_t no_rcfile; struct ares_options options; int optmask; ares_dns_class_t qclass; ares_dns_rec_type_t qtype; - int args_processed; + char *name; char *servers; char error[256]; } adig_config_t; -typedef struct { - const char *name; - int value; -} nv_t; - -static const nv_t configflags[] = { - {"usevc", ARES_FLAG_USEVC }, - { "primary", ARES_FLAG_PRIMARY }, - { "igntc", ARES_FLAG_IGNTC }, - { "norecurse", ARES_FLAG_NORECURSE}, - { "stayopen", ARES_FLAG_STAYOPEN }, - { "noaliases", ARES_FLAG_NOALIASES} +static adig_config_t global_config; + + +static const char *helpstr[] = { + "usage: adig [@server] [-c class] [-p port#] [-q name] [-t type] [-x addr]", + " [name] [type] [class] [queryopt...]", + "", + "@server: server ip address. May specify multiple in comma delimited " + "format.", + " may be specified in URI format", + "name: name of the resource record that is to be looked up", + "type: what type of query is required. e.g. - A, AAAA, MX, TXT, etc. If", + " no specified, A will be used.", + "class: Sets the query class, defaults to IN. May also be HS or CH.", + "", + "FLAGS", + "-c class: Sets the query class, defaults to IN. May also be HS or CH.", + "-h: Prints this help.", + "-p port: Sends query to a port other than 53. Often recommended to set", + " the port using @server instead.", + "-q name: Specifies the domain name to query. Useful to distinguish name", + " from other arguments", + "-r: Skip adigrc processing", + "-s: Server (alias for @server syntax), compatibility with old cmdline", + "-t type: Indicates resource record type to query. Useful to distinguish", + " type from other arguments", + "-x addr: Simplified reverse lookups. Sets the type to PTR and forms a", + " valid in-arpa query string", + "", + "QUERY OPTIONS", + "+[no]aaonly: Sets the aa flag in the query. Default is off.", + "+[no]aaflag: Alias for +[no]aaonly", + "+[no]additional: Toggles printing the additional section. On by default.", + "+[no]adflag: Sets the ad (authentic data) bit in the query. Default is", + " off.", + "+[no]aliases: Whether or not to honor the HOSTALIASES file. Default is", + " on.", + "+[no]all: Toggles all of +[no]cmd, +[no]stats, +[no]question,", + " +[no]answer, +[no]authority, +[no]additional, " + "+[no]comments", + "+[no]answer: Toggles printing the answer. On by default.", + "+[no]authority: Toggles printing the authority. On by default.", + "+bufsize=#: UDP EDNS 0 packet size allowed. Defaults to 1232.", + "+[no]cdflag: Sets the CD (checking disabled) bit in the query. Default", + " is off.", + "+[no]class: Display the class when printing the record. On by " + "default.", + "+[no]cmd: Toggles printing the command requested. On by default.", + "+[no]comments: Toggles printing the comments. On by default", + "+[no]defname: Alias for +[no]search", + "+domain=somename: Sets the search list to a single domain.", + "+[no]dns0x20: Whether or not to use DNS 0x20 case randomization when", + " sending queries. Default is off.", + "+[no]edns[=#]: Enable or disable EDNS. Only allows a value of 0 if", + " specified. Default is to enable EDNS.", + "+[no]ignore: Ignore truncation on UDP, by default retried on TCP.", + "+[no]keepopen: Whether or not the server connection should be " + "persistent.", + " Default is off.", + "+ndots=#: Sets the number of dots that must appear before being", + " considered absolute. Defaults to 1.", + "+[no]primary: Whether or not to only use a single server if more than " + "one", + " server is available. Defaults to using all servers.", + "+[no]qr: Toggles printing the request query. Off by default.", + "+[no]question: Toggles printing the question. On by default.", + "+[no]recurse: Toggles the RD (Recursion Desired) bit. On by default.", + "+retry=#: Same as +tries but does not include the initial attempt.", + "+[no]search: To use or not use the search list. Search list is not " + "used", + " by default.", + "+[no]stats: Toggles printing the statistics. On by default.", + "+[no]tcp: Whether to use TCP when querying name servers. Default is", + " UDP.", + "+tries=#: Number of query tries. Defaults to 3.", + "+[no]ttlid: Display the TTL when printing the record. On by default.", + "+[no]vc: Alias for +[no]tcp", + "", + NULL }; -static const size_t nconfigflags = sizeof(configflags) / sizeof(*configflags); -static int lookup_flag(const nv_t *nv, size_t num_nv, const char *name) +static void free_config(void) { - size_t i; - - if (name == NULL) { - return 0; - } - - for (i = 0; i < num_nv; i++) { - if (strcasecmp(nv[i].name, name) == 0) { - return nv[i].value; - } - } - - return 0; -} - -static void free_config(adig_config_t *config) -{ - free(config->servers); - memset(config, 0, sizeof(*config)); + free(global_config.servers); + free(global_config.name); + free(global_config.opts.search); + memset(&global_config, 0, sizeof(global_config)); } static void print_help(void) { + size_t i; printf("adig version %s\n\n", ares_version(NULL)); - printf( - "usage: adig [-h] [-d] [-f flag] [[-s server] ...] [-T|U port] [-c class]\n" - " [-t type] name ...\n\n" - " -h : Display this help and exit.\n" - " -d : Print some extra debugging output.\n" - " -f flag : Add a behavior control flag. Possible values are\n" - " igntc - do not retry a truncated query as TCP, just\n" - " return the truncated answer\n" - " noaliases - don't honor the HOSTALIASES environment\n" - " variable\n" - " norecurse - don't query upstream servers recursively\n" - " primary - use the first server\n" - " stayopen - don't close the communication sockets\n" - " usevc - use TCP only\n" - " -s server : Connect to the specified DNS server, instead of the\n" - " system's default one(s). Servers are tried in round-robin,\n" - " if the previous one failed.\n" - " -T port : Connect to the specified TCP port of DNS server.\n" - " -U port : Connect to the specified UDP port of DNS server.\n" - " -c class : Set the query class. Possible values for class are:\n" - " ANY, CHAOS, HS and IN (default)\n" - " -t type : Query records of the specified type. Possible values for\n" - " type are:\n" - " A (default), AAAA, ANY, CNAME, HINFO, MX, NAPTR, NS, PTR,\n" - " SOA, SRV, TXT, TLSA, URI, CAA, SVCB, HTTPS\n\n"); -} - -static ares_bool_t read_cmdline(int argc, const char **argv, - adig_config_t *config) -{ - ares_getopt_state_t state; - int c; - - ares_getopt_init(&state, argc, argv); - state.opterr = 0; - - while ((c = ares_getopt(&state, "dh?f:s:c:t:T:U:")) != -1) { - int f; - - switch (c) { - case 'd': -#ifdef WATT32 - dbug_init(); -#endif - break; - - case 'h': - config->is_help = ARES_TRUE; - return ARES_TRUE; - - case 'f': - f = lookup_flag(configflags, nconfigflags, state.optarg); - if (f == 0) { - snprintf(config->error, sizeof(config->error), "flag %s unknown", - state.optarg); - } - - config->options.flags |= f; - config->optmask |= ARES_OPT_FLAGS; - break; - - case 's': - if (state.optarg == NULL) { - snprintf(config->error, sizeof(config->error), "%s", - "missing servers"); - return ARES_FALSE; - } - if (config->servers) { - free(config->servers); - } - config->servers = strdup(state.optarg); - break; - - case 'c': - if (!ares_dns_class_fromstr(&config->qclass, state.optarg)) { - snprintf(config->error, sizeof(config->error), - "unrecognized class %s", state.optarg); - return ARES_FALSE; - } - break; - - case 't': - if (!ares_dns_rec_type_fromstr(&config->qtype, state.optarg)) { - snprintf(config->error, sizeof(config->error), "unrecognized type %s", - state.optarg); - return ARES_FALSE; - } - break; - - case 'T': - /* Set the TCP port number. */ - if (!isdigit(*state.optarg)) { - snprintf(config->error, sizeof(config->error), "invalid port number"); - return ARES_FALSE; - } - config->options.tcp_port = - (unsigned short)strtol(state.optarg, NULL, 0); - config->options.flags |= ARES_FLAG_USEVC; - config->optmask |= ARES_OPT_TCP_PORT; - break; - - case 'U': - /* Set the UDP port number. */ - if (!isdigit(*state.optarg)) { - snprintf(config->error, sizeof(config->error), "invalid port number"); - return ARES_FALSE; - } - config->options.udp_port = - (unsigned short)strtol(state.optarg, NULL, 0); - config->optmask |= ARES_OPT_UDP_PORT; - break; - - case ':': - snprintf(config->error, sizeof(config->error), - "%c requires an argument", state.optopt); - return ARES_FALSE; - - default: - snprintf(config->error, sizeof(config->error), - "unrecognized option: %c", state.optopt); - return ARES_FALSE; - } + for (i = 0; helpstr[i] != NULL; i++) { + printf("%s\n", helpstr[i]); } - - config->args_processed = state.optind; - if (config->args_processed >= argc) { - snprintf(config->error, sizeof(config->error), "missing query name"); - return ARES_FALSE; - } - return ARES_TRUE; } static void print_flags(ares_dns_flags_t flags) @@ -294,7 +241,11 @@ static void print_header(const ares_dns_record_t *dnsrec) static void print_question(const ares_dns_record_t *dnsrec) { size_t i; - printf(";; QUESTION SECTION:\n"); + + if (global_config.opts.display_comments) { + printf(";; QUESTION SECTION:\n"); + } + for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) { const char *name; ares_dns_rec_type_t qtype; @@ -315,10 +266,17 @@ static void print_question(const ares_dns_record_t *dnsrec) if (len + 1 < 16) { printf("\t"); } - printf("%s\t%s\n", ares_dns_class_tostr(qclass), - ares_dns_rec_type_tostr(qtype)); + + if (global_config.opts.display_class) { + printf("%s\t", ares_dns_class_tostr(qclass)); + } + + printf("%s\n", ares_dns_rec_type_tostr(qtype)); + } + + if (global_config.opts.display_comments) { + printf("\n"); } - printf("\n"); } static void print_opt_none(const unsigned char *val, size_t val_len) @@ -618,6 +576,21 @@ static void print_binp(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) print_opt_binp(binp, len); } +static void print_abinp(const ares_dns_rr_t *rr, ares_dns_rr_key_t key) +{ + size_t i; + size_t cnt = ares_dns_rr_get_abin_cnt(rr, key); + + for (i = 0; i < cnt; i++) { + size_t len; + const unsigned char *binp = ares_dns_rr_get_abin(rr, key, i, &len); + if (i != 0) { + printf(" "); + } + print_opt_binp(binp, len); + } +} + static void print_rr(const ares_dns_rr_t *rr) { const char *name = ares_dns_rr_get_name(rr); @@ -638,9 +611,15 @@ static void print_rr(const ares_dns_rr_t *rr) printf("\t"); } - printf("%u\t%s\t%s\t", ares_dns_rr_get_ttl(rr), - ares_dns_class_tostr(ares_dns_rr_get_class(rr)), - ares_dns_rec_type_tostr(rtype)); + if (global_config.opts.display_ttl) { + printf("%u\t", ares_dns_rr_get_ttl(rr)); + } + + if (global_config.opts.display_class) { + printf("%s\t", ares_dns_class_tostr(ares_dns_rr_get_class(rr))); + } + + printf("%s\t", ares_dns_rec_type_tostr(rtype)); /* Output params here */ for (i = 0; i < keys_cnt; i++) { @@ -677,6 +656,9 @@ static void print_rr(const ares_dns_rr_t *rr) case ARES_DATATYPE_BINP: print_binp(rr, keys[i]); break; + case ARES_DATATYPE_ABINP: + print_abinp(rr, keys[i]); + break; case ARES_DATATYPE_OPT: print_opts(rr, keys[i]); break; @@ -686,12 +668,12 @@ static void print_rr(const ares_dns_rr_t *rr) printf("\n"); } -static const ares_dns_rr_t *has_opt(ares_dns_record_t *dnsrec, - ares_dns_section_t section) +static const ares_dns_rr_t *has_opt(const ares_dns_record_t *dnsrec, + ares_dns_section_t section) { size_t i; for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { - const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + const ares_dns_rr_t *rr = ares_dns_record_rr_get_const(dnsrec, section, i); if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { return rr; } @@ -699,7 +681,8 @@ static const ares_dns_rr_t *has_opt(ares_dns_record_t *dnsrec, return NULL; } -static void print_section(ares_dns_record_t *dnsrec, ares_dns_section_t section) +static void print_section(const ares_dns_record_t *dnsrec, + ares_dns_section_t section) { size_t i; @@ -709,87 +692,125 @@ static void print_section(ares_dns_record_t *dnsrec, ares_dns_section_t section) return; } - printf(";; %s SECTION:\n", ares_dns_section_tostr(section)); + if (global_config.opts.display_comments) { + printf(";; %s SECTION:\n", ares_dns_section_tostr(section)); + } for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) { - const ares_dns_rr_t *rr = ares_dns_record_rr_get(dnsrec, section, i); + const ares_dns_rr_t *rr = ares_dns_record_rr_get_const(dnsrec, section, i); if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) { continue; } print_rr(rr); } - printf("\n"); + if (global_config.opts.display_comments) { + printf("\n"); + } } -static void print_opt_psuedosection(ares_dns_record_t *dnsrec) +static void print_opt_psuedosection(const ares_dns_record_t *dnsrec) { - const ares_dns_rr_t *rr = has_opt(dnsrec, ARES_SECTION_ADDITIONAL); + const ares_dns_rr_t *rr = has_opt(dnsrec, ARES_SECTION_ADDITIONAL); + const unsigned char *cookie = NULL; + size_t cookie_len = 0; + if (rr == NULL) { return; } + if (!ares_dns_rr_get_opt_byid(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE, + &cookie, &cookie_len)) { + cookie = NULL; + } + printf(";; OPT PSEUDOSECTION:\n"); - printf("; EDNS: version: %u, flags: %u; udp: %u\t", + printf("; EDNS: version: %u, flags: %u; udp: %u\n", (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION), (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS), (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_UDP_SIZE)); - printf("\n"); + if (cookie) { + printf("; COOKIE: "); + print_opt_bin(cookie, cookie_len); + printf(" (good)\n"); + } } -static void callback(void *arg, int status, int timeouts, unsigned char *abuf, - int alen) +static void print_record(const ares_dns_record_t *dnsrec) { - ares_dns_record_t *dnsrec = NULL; - (void)arg; - (void)timeouts; + if (global_config.opts.display_comments) { + print_header(dnsrec); + print_opt_psuedosection(dnsrec); + } - /* We got a "Server status" */ - if (status >= ARES_SUCCESS && status <= ARES_EREFUSED) { - printf(";; Got answer:"); - } else { - printf(";;"); + if (global_config.opts.display_question) { + print_question(dnsrec); } - if (status != ARES_SUCCESS) { - printf(" %s", ares_strerror(status)); + if (global_config.opts.display_answer) { + print_section(dnsrec, ARES_SECTION_ANSWER); } - printf("\n"); - if (abuf == NULL || alen == 0) { - return; + if (global_config.opts.display_additional) { + print_section(dnsrec, ARES_SECTION_ADDITIONAL); } - status = (int)ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec); - if (status != ARES_SUCCESS) { - fprintf(stderr, ";; FAILED TO PARSE DNS PACKET: %s\n", - ares_strerror(status)); - return; + if (global_config.opts.display_authority) { + print_section(dnsrec, ARES_SECTION_AUTHORITY); } - print_header(dnsrec); - print_opt_psuedosection(dnsrec); - print_question(dnsrec); - print_section(dnsrec, ARES_SECTION_ANSWER); - print_section(dnsrec, ARES_SECTION_ADDITIONAL); - print_section(dnsrec, ARES_SECTION_AUTHORITY); + if (global_config.opts.display_stats) { + unsigned char *abuf = NULL; + size_t alen = 0; + ares_dns_write(dnsrec, &abuf, &alen); + printf(";; MSG SIZE rcvd: %d\n\n", (int)alen); + ares_free_string(abuf); + } +} - printf(";; MSG SIZE rcvd: %d\n\n", alen); - ares_dns_record_destroy(dnsrec); +static void callback(void *arg, ares_status_t status, size_t timeouts, + const ares_dns_record_t *dnsrec) +{ + (void)arg; + (void)timeouts; + + if (global_config.opts.display_comments) { + /* We got a "Server status" */ + if (status >= ARES_SUCCESS && status <= ARES_EREFUSED) { + printf(";; Got answer:"); + } else { + printf(";;"); + } + if (status != ARES_SUCCESS) { + printf(" %s", ares_strerror((int)status)); + } + printf("\n"); + } + + print_record(dnsrec); } -static ares_status_t enqueue_query(ares_channel_t *channel, - const adig_config_t *config, - const char *name) +static ares_status_t enqueue_query(ares_channel_t *channel) { ares_dns_record_t *dnsrec = NULL; ares_dns_rr_t *rr = NULL; ares_status_t status; - unsigned char *buf = NULL; - size_t buf_len = 0; unsigned short flags = 0; char *nametemp = NULL; + const char *name = global_config.name; + + if (global_config.opts.aa_flag) { + flags |= ARES_FLAG_AA; + } + + if (global_config.opts.ad_flag) { + flags |= ARES_FLAG_AD; + } - if (!(config->options.flags & ARES_FLAG_NORECURSE)) { + if (global_config.opts.cd_flag) { + flags |= ARES_FLAG_CD; + } + + if (global_config.opts.rd_flag) { flags |= ARES_FLAG_RD; } @@ -801,7 +822,7 @@ static ares_status_t enqueue_query(ares_channel_t *channel, /* If it is a PTR record, convert from ip address into in-arpa form * automatically */ - if (config->qtype == ARES_REC_TYPE_PTR) { + if (global_config.qtype == ARES_REC_TYPE_PTR) { struct ares_addr addr; size_t len; addr.family = AF_UNSPEC; @@ -812,27 +833,33 @@ static ares_status_t enqueue_query(ares_channel_t *channel, } } - status = - ares_dns_record_query_add(dnsrec, name, config->qtype, config->qclass); + status = ares_dns_record_query_add(dnsrec, name, global_config.qtype, + global_config.qclass); if (status != ARES_SUCCESS) { goto done; } - status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", - ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); - if (status != ARES_SUCCESS) { - goto done; + if (global_config.opts.edns) { + status = ares_dns_record_rr_add(&rr, dnsrec, ARES_SECTION_ADDITIONAL, "", + ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0); + if (status != ARES_SUCCESS) { + goto done; + } + ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, + (unsigned short)global_config.opts.udp_size); + ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); } - ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, 1280); - ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0); - status = ares_dns_write(dnsrec, &buf, &buf_len); - if (status != ARES_SUCCESS) { - goto done; + if (global_config.opts.display_query) { + printf(";; Sending:\n"); + print_record(dnsrec); } - ares_send(channel, buf, (int)buf_len, callback, NULL); - ares_free_string(buf); + if (global_config.opts.do_search) { + status = ares_search_dnsrec(channel, dnsrec, callback, NULL); + } else { + status = ares_send_dnsrec(channel, dnsrec, callback, NULL, NULL); + } done: ares_free_string(nametemp); @@ -879,12 +906,584 @@ static int event_loop(ares_channel_t *channel) return 0; } +typedef enum { + OPT_TYPE_BOOL, + OPT_TYPE_STRING, + OPT_TYPE_SIZE_T, + OPT_TYPE_U16, + OPT_TYPE_FUNC +} opt_type_t; + +/* Callback called with OPT_TYPE_FUNC when processing options. + * \param[in] prefix prefix character for option + * \param[in] name name for option + * \param[in] is_true ARES_TRUE unless option was prefixed with 'no' + * \param[in] value value for option + * \return ARES_TRUE on success, ARES_FALSE on failure. Should fill in + * global_config.error on error */ +typedef ares_bool_t (*dig_opt_cb_t)(char prefix, const char *name, + ares_bool_t is_true, const char *value); + +static ares_bool_t opt_class_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)is_true; + + if (!ares_dns_class_fromstr(&global_config.qclass, value)) { + snprintf(global_config.error, sizeof(global_config.error), + "unrecognized class %s", value); + return ARES_FALSE; + } + + return ARES_TRUE; +} + +static ares_bool_t opt_type_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)is_true; + + if (!ares_dns_rec_type_fromstr(&global_config.qtype, value)) { + snprintf(global_config.error, sizeof(global_config.error), + "unrecognized record type %s", value); + return ARES_FALSE; + } + return ARES_TRUE; +} + +static ares_bool_t opt_ptr_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)is_true; + global_config.qtype = ARES_REC_TYPE_PTR; + ares_free(global_config.name); + global_config.name = strdup(value); + return ARES_TRUE; +} + +static ares_bool_t opt_all_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)value; + + global_config.opts.display_command = is_true; + global_config.opts.display_stats = is_true; + global_config.opts.display_question = is_true; + global_config.opts.display_answer = is_true; + global_config.opts.display_authority = is_true; + global_config.opts.display_additional = is_true; + global_config.opts.display_comments = is_true; + return ARES_TRUE; +} + +static ares_bool_t opt_edns_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + + global_config.opts.edns = is_true; + if (is_true && value != NULL && atoi(value) > 0) { + snprintf(global_config.error, sizeof(global_config.error), + "edns 0 only supported"); + return ARES_FALSE; + } + return ARES_TRUE; +} + +static ares_bool_t opt_retry_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)is_true; + + if (!ares_str_isnum(value)) { + snprintf(global_config.error, sizeof(global_config.error), + "value not numeric"); + return ARES_FALSE; + } + + global_config.opts.tries = strtoul(value, NULL, 10) + 1; + return ARES_TRUE; +} + +static ares_bool_t opt_dig_bare_cb(char prefix, const char *name, + ares_bool_t is_true, const char *value) +{ + (void)prefix; + (void)name; + (void)is_true; + + /* Handle @servers */ + if (*value == '@') { + free(global_config.servers); + global_config.servers = strdup(value + 1); + return ARES_TRUE; + } + + /* Make sure we don't pass options */ + if (*value == '-' || *value == '+') { + snprintf(global_config.error, sizeof(global_config.error), + "unrecognized argument %s", value); + return ARES_FALSE; + } + + /* See if it is a DNS class */ + if (ares_dns_class_fromstr(&global_config.qclass, value)) { + return ARES_TRUE; + } + + /* See if it is a DNS record type */ + if (ares_dns_rec_type_fromstr(&global_config.qtype, value)) { + return ARES_TRUE; + } + + /* See if it is a domain name */ + if (ares_is_hostname(value)) { + free(global_config.name); + global_config.name = strdup(value); + return ARES_TRUE; + } + + snprintf(global_config.error, sizeof(global_config.error), + "unrecognized argument %s", value); + return ARES_FALSE; +} + +static const struct { + /* Prefix for option. If 0 then this param is a non-option and type must be + * OPT_TYPE_FUNC where the entire value for the param will be passed */ + char prefix; + /* Name of option. If null, there is none and the value is expected to be + * immediately after the prefix character */ + const char *name; + /* Separator between key and value. If 0 then uses the next argument as the + * value, otherwise splits on the separator. BOOL types won't ever use a + * separator and is ignored.*/ + char separator; + /* Type of parameter passed in. If it is OPT_TYPE_FUNC, then it calls the + * dig_opt_cb_t callback */ + opt_type_t type; + /* Pointer to argument to fill in */ + void *opt; + /* Callback if OPT_TYPE_FUNC */ + dig_opt_cb_t cb; +} dig_options[] = { + /* -4 (ipv4 only) */ + /* -6 (ipv6 only) */ + /* { '-', "b", 0, OPT_TYPE_FUNC, NULL, opt_bind_address_cb }, + */ + { '-', "c", 0, OPT_TYPE_FUNC, NULL, opt_class_cb }, + /* -f file */ + { '-', "h", 0, OPT_TYPE_BOOL, &global_config.is_help, NULL }, + /* -k keyfile */ + /* -m (memory usage debugging) */ + { '-', "p", 0, OPT_TYPE_U16, &global_config.opts.port, NULL }, + { '-', "q", 0, OPT_TYPE_STRING, &global_config.name, NULL }, + { '-', "r", 0, OPT_TYPE_BOOL, &global_config.no_rcfile, NULL }, + { '-', "s", 0, OPT_TYPE_STRING, &global_config.servers, NULL }, + { '-', "t", 0, OPT_TYPE_FUNC, NULL, opt_type_cb }, + /* -u (print microseconds instead of milliseconds) */ + { '-', "x", 0, OPT_TYPE_FUNC, NULL, opt_ptr_cb }, + /* -y [hmac:]keynam:secret */ + { '+', "aaflag", 0, OPT_TYPE_BOOL, &global_config.opts.aa_flag, NULL }, + { '+', "aaonly", 0, OPT_TYPE_BOOL, &global_config.opts.aa_flag, NULL }, + { '+', "additional", 0, OPT_TYPE_BOOL, &global_config.opts.display_additional, + NULL }, + { '+', "adflag", 0, OPT_TYPE_BOOL, &global_config.opts.ad_flag, NULL }, + { '+', "aliases", 0, OPT_TYPE_BOOL, &global_config.opts.aliases, NULL }, + { '+', "all", '=', OPT_TYPE_FUNC, NULL, opt_all_cb }, + { '+', "answer", 0, OPT_TYPE_BOOL, &global_config.opts.display_answer, NULL }, + { '+', "authority", 0, OPT_TYPE_BOOL, &global_config.opts.display_authority, + NULL }, + { '+', "bufsize", '=', OPT_TYPE_SIZE_T, &global_config.opts.udp_size, NULL }, + { '+', "cdflag", 0, OPT_TYPE_BOOL, &global_config.opts.cd_flag, NULL }, + { '+', "class", 0, OPT_TYPE_BOOL, &global_config.opts.display_class, NULL }, + { '+', "cmd", 0, OPT_TYPE_BOOL, &global_config.opts.display_command, NULL }, + { '+', "comments", 0, OPT_TYPE_BOOL, &global_config.opts.display_comments, + NULL }, + { '+', "defname", 0, OPT_TYPE_BOOL, &global_config.opts.do_search, NULL }, + { '+', "dns0x20", 0, OPT_TYPE_BOOL, &global_config.opts.dns0x20, NULL }, + { '+', "domain", '=', OPT_TYPE_STRING, &global_config.opts.search, NULL }, + { '+', "edns", '=', OPT_TYPE_FUNC, NULL, opt_edns_cb }, + { '+', "keepopen", 0, OPT_TYPE_BOOL, &global_config.opts.stayopen, NULL }, + { '+', "ignore", 0, OPT_TYPE_BOOL, &global_config.opts.ignore_tc, NULL }, + { '+', "ndots", '=', OPT_TYPE_SIZE_T, &global_config.opts.ndots, NULL }, + { '+', "primary", 0, OPT_TYPE_BOOL, &global_config.opts.primary, NULL }, + { '+', "qr", 0, OPT_TYPE_BOOL, &global_config.opts.display_query, NULL }, + { '+', "question", 0, OPT_TYPE_BOOL, &global_config.opts.display_question, + NULL }, + { '+', "recurse", 0, OPT_TYPE_BOOL, &global_config.opts.rd_flag, NULL }, + { '+', "retry", '=', OPT_TYPE_FUNC, NULL, opt_retry_cb }, + { '+', "search", 0, OPT_TYPE_BOOL, &global_config.opts.do_search, NULL }, + { '+', "stats", 0, OPT_TYPE_BOOL, &global_config.opts.display_stats, NULL }, + { '+', "tcp", 0, OPT_TYPE_BOOL, &global_config.opts.tcp, NULL }, + { '+', "tries", '=', OPT_TYPE_SIZE_T, &global_config.opts.tries, NULL }, + { '+', "ttlid", 0, OPT_TYPE_BOOL, &global_config.opts.display_ttl, NULL }, + { '+', "vc", 0, OPT_TYPE_BOOL, &global_config.opts.tcp, NULL }, + { 0, NULL, 0, OPT_TYPE_FUNC, NULL, opt_dig_bare_cb }, + { 0, NULL, 0, 0, NULL, NULL } +}; + +static ares_bool_t read_cmdline(int argc, const char * const *argv, + int start_idx) +{ + int arg; + size_t opt; + + for (arg = start_idx; arg < argc; arg++) { + ares_bool_t option_handled = ARES_FALSE; + + for (opt = 0; !option_handled && + (dig_options[opt].opt != NULL || dig_options[opt].cb != NULL); + opt++) { + ares_bool_t is_true = ARES_TRUE; + const char *value = NULL; + const char *nameptr = NULL; + size_t namelen; + + /* Match prefix character */ + if (dig_options[opt].prefix != 0 && + dig_options[opt].prefix != *(argv[arg])) { + continue; + } + + nameptr = argv[arg]; + + /* skip prefix */ + if (dig_options[opt].prefix != 0) { + nameptr++; + } + + /* Negated option if it has a 'no' prefix */ + if (ares_streq_max(nameptr, "no", 2)) { + is_true = ARES_FALSE; + nameptr += 2; + } + + if (dig_options[opt].separator != 0) { + const char *ptr = strchr(nameptr, dig_options[opt].separator); + if (ptr == NULL) { + namelen = ares_strlen(nameptr); + } else { + namelen = (size_t)(ptr - nameptr); + value = ptr + 1; + } + } else { + namelen = ares_strlen(nameptr); + } + + /* Match name */ + if (dig_options[opt].name != NULL && + !ares_streq_max(nameptr, dig_options[opt].name, namelen)) { + continue; + } + + if (dig_options[opt].name == NULL) { + value = nameptr; + } + + /* We need another argument for the value */ + if (dig_options[opt].type != OPT_TYPE_BOOL && + dig_options[opt].prefix != 0 && dig_options[opt].separator == 0) { + if (arg == argc - 1) { + snprintf(global_config.error, sizeof(global_config.error), + "insufficient arguments for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + arg++; + value = argv[arg]; + } + + switch (dig_options[opt].type) { + case OPT_TYPE_BOOL: + { + ares_bool_t *b = dig_options[opt].opt; + if (b == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "invalid use for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + *b = is_true; + } + break; + case OPT_TYPE_STRING: + { + char **str = dig_options[opt].opt; + if (str == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "invalid use for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (value == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "missing value for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (*str != NULL) { + free(*str); + } + *str = strdup(value); + break; + } + case OPT_TYPE_SIZE_T: + { + size_t *s = dig_options[opt].opt; + if (s == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "invalid use for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (value == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "missing value for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (!ares_str_isnum(value)) { + snprintf(global_config.error, sizeof(global_config.error), + "%c%s is not a numeric value", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + *s = strtoul(value, NULL, 10); + break; + } + case OPT_TYPE_U16: + { + unsigned short *s = dig_options[opt].opt; + if (s == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "invalid use for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (value == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "missing value for %c%s", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + if (!ares_str_isnum(value)) { + snprintf(global_config.error, sizeof(global_config.error), + "%c%s is not a numeric value", dig_options[opt].prefix, + dig_options[opt].name); + return ARES_FALSE; + } + *s = (unsigned short)strtoul(value, NULL, 10); + break; + } + case OPT_TYPE_FUNC: + if (dig_options[opt].cb == NULL) { + snprintf(global_config.error, sizeof(global_config.error), + "missing callback"); + return ARES_FALSE; + } + if (!dig_options[opt].cb(dig_options[opt].prefix, + dig_options[opt].name, is_true, value)) { + return ARES_FALSE; + } + break; + } + option_handled = ARES_TRUE; + } + + if (!option_handled) { + snprintf(global_config.error, sizeof(global_config.error), + "unrecognized option %s", argv[arg]); + return ARES_FALSE; + } + } + + return ARES_TRUE; +} + +static ares_bool_t read_rcfile(void) +{ + char configdir[PATH_MAX]; + unsigned int cdlen = 0; + +#if !defined(WIN32) +# if !defined(__APPLE__) + char *configdir_xdg; +# endif + char *homedir; +#endif + + char rcfile[PATH_MAX]; + unsigned int rclen; + + size_t rcargc; + char **rcargv; + ares_buf_t *rcbuf; + ares_status_t rcstatus; + +#if defined(WIN32) + cdlen = (unsigned int)snprintf(configdir, sizeof(configdir), "%s/%s", + getenv("APPDATA"), "c-ares"); + +#elif defined(__APPLE__) + homedir = getenv("HOME"); + if (homedir != NULL) { + cdlen = (unsigned int)snprintf(configdir, sizeof(configdir), "%s/%s/%s/%s", + homedir, "Library", "Application Support", + "c-ares"); + } + +#else + configdir_xdg = getenv("XDG_CONFIG_HOME"); + + if (configdir_xdg == NULL) { + homedir = getenv("HOME"); + if (homedir != NULL) { + cdlen = (unsigned int)snprintf(configdir, sizeof(configdir), "%s/%s", + homedir, ".config"); + } + } else { + cdlen = + (unsigned int)snprintf(configdir, sizeof(configdir), "%s", configdir_xdg); + } + +#endif + + DEBUGF(fprintf(stderr, "read_cmdline() configdir: %s\n", configdir)); + + if (cdlen == 0 || cdlen > sizeof(configdir)) { + DEBUGF( + fprintf(stderr, "read_cmdline() skipping rcfile parsing on directory\n")); + return ARES_TRUE; + } + + rclen = + (unsigned int)snprintf(rcfile, sizeof(rcfile), "%s/adigrc", configdir); + + if (rclen > sizeof(rcfile)) { + DEBUGF(fprintf(stderr, "read_cmdline() skipping rcfile parsing on file\n")); + return ARES_TRUE; + } + + rcbuf = ares_buf_create(); + if (ares_buf_load_file(rcfile, rcbuf) == ARES_SUCCESS) { + rcstatus = ares_buf_split_str(rcbuf, (const unsigned char *)"\n ", 2, + ARES_BUF_SPLIT_TRIM, 0, &rcargv, &rcargc); + + if (rcstatus == ARES_SUCCESS) { + read_cmdline((int)rcargc, (const char * const *)rcargv, 0); + + } else { + snprintf(global_config.error, sizeof(global_config.error), + "rcfile is invalid: %s", ares_strerror((int)rcstatus)); + } + + ares_free_array(rcargv, rcargc, ares_free); + + if (rcstatus != ARES_SUCCESS) { + ares_buf_destroy(rcbuf); + return ARES_FALSE; + } + + } else { + DEBUGF(fprintf(stderr, "read_cmdline() failed to load rcfile")); + } + ares_buf_destroy(rcbuf); + + return ARES_TRUE; +} + +static void config_defaults(void) +{ + memset(&global_config, 0, sizeof(global_config)); + + global_config.opts.tries = 3; + global_config.opts.ndots = 1; + global_config.opts.rd_flag = ARES_TRUE; + global_config.opts.edns = ARES_TRUE; + global_config.opts.udp_size = 1232; + global_config.opts.aliases = ARES_TRUE; + global_config.opts.display_class = ARES_TRUE; + global_config.opts.display_ttl = ARES_TRUE; + global_config.opts.display_command = ARES_TRUE; + global_config.opts.display_stats = ARES_TRUE; + global_config.opts.display_question = ARES_TRUE; + global_config.opts.display_answer = ARES_TRUE; + global_config.opts.display_authority = ARES_TRUE; + global_config.opts.display_additional = ARES_TRUE; + global_config.opts.display_comments = ARES_TRUE; + global_config.qclass = ARES_CLASS_IN; + global_config.qtype = ARES_REC_TYPE_A; +} + +static void config_opts(void) +{ + global_config.optmask = ARES_OPT_FLAGS; + if (global_config.opts.tcp) { + global_config.options.flags |= ARES_FLAG_USEVC; + } + if (global_config.opts.primary) { + global_config.options.flags |= ARES_FLAG_PRIMARY; + } + if (global_config.opts.edns) { + global_config.options.flags |= ARES_FLAG_EDNS; + } + if (global_config.opts.stayopen) { + global_config.options.flags |= ARES_FLAG_STAYOPEN; + } + if (global_config.opts.dns0x20) { + global_config.options.flags |= ARES_FLAG_DNS0x20; + } + if (!global_config.opts.aliases) { + global_config.options.flags |= ARES_FLAG_NOALIASES; + } + if (!global_config.opts.rd_flag) { + global_config.options.flags |= ARES_FLAG_NORECURSE; + } + if (!global_config.opts.do_search) { + global_config.options.flags |= ARES_FLAG_NOSEARCH; + } + if (global_config.opts.ignore_tc) { + global_config.options.flags |= ARES_FLAG_IGNTC; + } + if (global_config.opts.port) { + global_config.optmask |= ARES_OPT_UDP_PORT; + global_config.optmask |= ARES_OPT_TCP_PORT; + global_config.options.udp_port = global_config.opts.port; + global_config.options.tcp_port = global_config.opts.port; + } + + global_config.optmask |= ARES_OPT_TRIES; + global_config.options.tries = (int)global_config.opts.tries; + + global_config.optmask |= ARES_OPT_NDOTS; + global_config.options.ndots = (int)global_config.opts.ndots; + + global_config.optmask |= ARES_OPT_EDNSPSZ; + global_config.options.ednspsz = (int)global_config.opts.udp_size; + + if (global_config.opts.search != NULL) { + global_config.optmask |= ARES_OPT_DOMAINS; + global_config.options.domains = &global_config.opts.search; + global_config.options.ndomains = 1; + } +} + int main(int argc, char **argv) { ares_channel_t *channel = NULL; ares_status_t status; - adig_config_t config; - int i; int rv = 0; #ifdef USE_WINSOCK @@ -899,62 +1498,73 @@ int main(int argc, char **argv) return 1; } - memset(&config, 0, sizeof(config)); - config.qclass = ARES_CLASS_IN; - config.qtype = ARES_REC_TYPE_A; - if (!read_cmdline(argc, (const char **)argv, &config)) { - printf("\n** ERROR: %s\n\n", config.error); + config_defaults(); + + if (!read_cmdline(argc, (const char * const *)argv, 1)) { + printf("\n** ERROR: %s\n\n", global_config.error); print_help(); rv = 1; goto done; } - if (config.is_help) { + if (global_config.no_rcfile && !read_rcfile()) { + fprintf(stderr, "\n** ERROR: %s\n", global_config.error); + } + + if (global_config.is_help) { + print_help(); + goto done; + } + + if (global_config.name == NULL) { + printf("missing query name\n"); print_help(); + rv = 1; goto done; } - status = - (ares_status_t)ares_init_options(&channel, &config.options, config.optmask); + config_opts(); + + status = (ares_status_t)ares_init_options(&channel, &global_config.options, + global_config.optmask); if (status != ARES_SUCCESS) { fprintf(stderr, "ares_init_options: %s\n", ares_strerror((int)status)); rv = 1; goto done; } - if (config.servers) { - status = (ares_status_t)ares_set_servers_ports_csv(channel, config.servers); + if (global_config.servers) { + status = + (ares_status_t)ares_set_servers_ports_csv(channel, global_config.servers); if (status != ARES_SUCCESS) { - fprintf(stderr, "ares_set_servers_ports_csv: %s\n", - ares_strerror((int)status)); + fprintf(stderr, "ares_set_servers_ports_csv: %s: %s\n", + ares_strerror((int)status), global_config.servers); rv = 1; goto done; } } - /* Enqueue a query for each separate name */ - for (i = config.args_processed; i < argc; i++) { - status = enqueue_query(channel, &config, argv[i]); - if (status != ARES_SUCCESS) { - fprintf(stderr, "Failed to create query for %s: %s\n", argv[i], - ares_strerror((int)status)); - rv = 1; - goto done; - } + /* Debug */ + if (global_config.opts.display_command) { + printf("\n; <<>> c-ares DiG %s <<>>", ares_version(NULL)); + printf(" %s", global_config.name); + printf("\n"); } - /* Debug */ - printf("\n; <<>> c-ares DiG %s <<>>", ares_version(NULL)); - for (i = config.args_processed; i < argc; i++) { - printf(" %s", argv[i]); + /* Enqueue a query for each separate name */ + status = enqueue_query(channel); + if (status != ARES_SUCCESS) { + fprintf(stderr, "Failed to create query for %s: %s\n", global_config.name, + ares_strerror((int)status)); + rv = 1; + goto done; } - printf("\n"); /* Process events */ rv = event_loop(channel); done: - free_config(&config); + free_config(); ares_destroy(channel); ares_library_cleanup(); diff --git a/deps/cares/src/tools/ahost.c b/deps/cares/src/tools/ahost.c index bbcd2b1d633c32..7d1d4a86dc7a2d 100644 --- a/deps/cares/src/tools/ahost.c +++ b/deps/cares/src/tools/ahost.c @@ -27,7 +27,7 @@ #include "ares_setup.h" -#if !defined(WIN32) || defined(WATT32) +#if !defined(_WIN32) || defined(WATT32) # include <netinet/in.h> # include <arpa/inet.h> # include <netdb.h> @@ -42,20 +42,7 @@ #include "ares_getopt.h" #include "ares_ipv6.h" -#ifndef HAVE_STRDUP -# include "ares_str.h" -# define strdup(ptr) ares_strdup(ptr) -#endif - -#ifndef HAVE_STRCASECMP -# include "ares_strcasecmp.h" -# define strcasecmp(p1, p2) ares_strcasecmp(p1, p2) -#endif - -#ifndef HAVE_STRNCASECMP -# include "ares_strcasecmp.h" -# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n) -#endif +#include "ares_str.h" static void callback(void *arg, int status, int timeouts, struct hostent *host); static void ai_callback(void *arg, int status, int timeouts, @@ -95,7 +82,7 @@ int main(int argc, char **argv) return 1; } - ares_getopt_init(&state, argc, (const char **)argv); + ares_getopt_init(&state, argc, (const char * const *)argv); while ((c = ares_getopt(&state, "dt:h?D:s:")) != -1) { switch (c) { case 'd': @@ -111,11 +98,11 @@ int main(int argc, char **argv) options.domains[options.ndomains - 1] = strdup(state.optarg); break; case 't': - if (!strcasecmp(state.optarg, "a")) { + if (ares_strcaseeq(state.optarg, "a")) { addr_family = AF_INET; - } else if (!strcasecmp(state.optarg, "aaaa")) { + } else if (ares_strcaseeq(state.optarg, "aaaa")) { addr_family = AF_INET6; - } else if (!strcasecmp(state.optarg, "u")) { + } else if (ares_strcaseeq(state.optarg, "u")) { addr_family = AF_UNSPEC; } else { usage(); @@ -276,18 +263,22 @@ static void usage(void) /* Information from the man page. Formatting taken from man -h */ static void print_help_info_ahost(void) { + /* Split due to maximum c89 string literal of 509 bytes */ printf("ahost, version %s\n\n", ARES_VERSION_STR); printf( "usage: ahost [-h] [-d] [-D domain] [-s server] [-t a|aaaa|u] host|addr " - "...\n\n" + "...\n\n"); + printf( " -h : Display this help and exit.\n" " -d : Print some extra debugging output.\n\n" " -D domain : Specify the domain to search instead of using the default " - "values\n" + "values\n"); + printf( " -s server : Connect to the specified DNS server, instead of the\n" " system's default one(s). Servers are tried in round-robin,\n" " if the previous one failed.\n" - " -t type : If type is \"a\", print the A record.\n" + " -t type : If type is \"a\", print the A record.\n"); + printf( " If type is \"aaaa\", print the AAAA record.\n" " If type is \"u\" (default), print both A and AAAA records.\n" "\n"); diff --git a/deps/cares/src/tools/ares_getopt.c b/deps/cares/src/tools/ares_getopt.c index ad0b8ae8826c85..262bf0de03ad6a 100644 --- a/deps/cares/src/tools/ares_getopt.c +++ b/deps/cares/src/tools/ares_getopt.c @@ -47,9 +47,10 @@ #define BADCH (int)'?' #define BADARG (int)':' -#define EMSG (char *)"" +#define EMSG "" -void ares_getopt_init(ares_getopt_state_t *state, int nargc, const char **nargv) +void ares_getopt_init(ares_getopt_state_t *state, int nargc, + const char * const *nargv) { memset(state, 0, sizeof(*state)); state->opterr = 1; diff --git a/deps/cares/src/tools/ares_getopt.h b/deps/cares/src/tools/ares_getopt.h index a14f7ab42d41f7..a8007b2dee05c3 100644 --- a/deps/cares/src/tools/ares_getopt.h +++ b/deps/cares/src/tools/ares_getopt.h @@ -34,16 +34,17 @@ typedef struct { - const char *optarg; /* argument associated with option */ - int optind; /* index into parent argv vector */ - int opterr; /* if error message should be printed */ - int optopt; /* character checked for validity */ - const char *place; - int argc; - const char **argv; + const char *optarg; /* argument associated with option */ + int optind; /* index into parent argv vector */ + int opterr; /* if error message should be printed */ + int optopt; /* character checked for validity */ + const char *place; + int argc; + const char * const *argv; } ares_getopt_state_t; -void ares_getopt_init(ares_getopt_state_t *state, int argc, const char **argv); +void ares_getopt_init(ares_getopt_state_t *state, int argc, + const char * const *argv); int ares_getopt(ares_getopt_state_t *state, const char *ostr); #endif /* ARES_GETOPT_H */ diff --git a/deps/cares/unofficial.gni b/deps/cares/unofficial.gni index a925eb14f33361..e02d7f425194c9 100644 --- a/deps/cares/unofficial.gni +++ b/deps/cares/unofficial.gni @@ -38,7 +38,10 @@ template("cares_gn_build") { ] } - include_dirs = [ "src/lib" ] + include_dirs = [ + "src/lib", + "src/lib/include", + ] if (is_win) { include_dirs += [ "config/win32" ] } else if (is_linux) { @@ -55,21 +58,24 @@ template("cares_gn_build") { } sources = gypi_values.cares_sources_common - if (is_win) { - sources += gypi_values.cares_sources_win - } if (is_linux) { sources += [ "config/linux/ares_config.h" ] } if (is_mac) { - sources += [ "config/darwin/ares_config.h" ] + sources += gypi_values.cares_sources_mac } - if (is_clang || !is_win) { - cflags_c = [ - "-Wno-implicit-fallthrough", - "-Wno-unreachable-code", - ] + if (is_clang) { + if (is_win) { + cflags_c = [ + "-Wno-macro-redefined", + ] + } else { + cflags_c = [ + "-Wno-implicit-fallthrough", + "-Wno-unreachable-code", + ] + } } } } diff --git a/deps/cjs-module-lexer/.gitignore b/deps/cjs-module-lexer/.gitignore deleted file mode 100755 index 55ee2f0d6cfb5d..00000000000000 --- a/deps/cjs-module-lexer/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules -*.lock -test -.* -Makefile -bench -build.js -include-wasm -include -lib -src diff --git a/deps/cjs-module-lexer/CHANGELOG.md b/deps/cjs-module-lexer/CHANGELOG.md deleted file mode 100644 index e7d12a70f1a329..00000000000000 --- a/deps/cjs-module-lexer/CHANGELOG.md +++ /dev/null @@ -1,40 +0,0 @@ -1.2.2 -- Fix RollupJS reexports bug (https://github.com/guybedford/cjs-module-lexer/pull/59) - -1.2.1 -- Support Unicode escapes in strings (https://github.com/guybedford/cjs-module-lexer/pull/55) -- Filter export strings to valid surrogate pairs (https://github.com/guybedford/cjs-module-lexer/pull/56) - -1.2.0 -- Support for non-identifier exports (https://github.com/guybedford/cjs-module-lexer/pull/54, @nicolo-ribaudo) - -1.1.1 -- Better support for Babel reexport getter function forms (https://github.com/guybedford/cjs-module-lexer/issues/50) -- Support Babel interopRequireWildcard reexports patterns (https://github.com/guybedford/cjs-module-lexer/issues/52) - -1.1.0 -- Support for Babel reexport conflict filter (https://github.com/guybedford/cjs-module-lexer/issues/36, @nicolo-ribaudo) -- Support trailing commas in getter patterns (https://github.com/guybedford/cjs-module-lexer/issues/31) -- Support for RollupJS reexports property checks (https://github.com/guybedford/cjs-module-lexer/issues/38) - -1.0.0 -- Unsafe getter tracking (https://github.com/guybedford/cjs-module-lexer/pull/29) - -0.6.0 -- API-only breaking change: Unify JS and Wasm interfaces (https://github.com/guybedford/cjs-module-lexer/pull/27) -- Add type definitions (https://github.com/guybedford/cjs-module-lexer/pull/28) - -0.5.2 -- Support named getter functions (https://github.com/guybedford/cjs-module-lexer/pull/26) - -0.5.1: -- Feature: Implement specific reexport getter forms (https://github.com/guybedford/cjs-module-lexer/pull/25) - -0.5.0 -- Breaking Change: No longer emit Object.defineProperty exports (https://github.com/guybedford/cjs-module-lexer/pull/24) -- Doc: Update link to WASI SDK (https://github.com/guybedford/cjs-module-lexer/pull/19) - -0.4.3 -- Support for Babel 7.12 reexports (https://github.com/guybedford/cjs-module-lexer/pull/16) -- Support module.exports = { ...require('x') } reexports (https://github.com/guybedford/cjs-module-lexer/pull/18) -- "if" keyword space parsing in exports matching (https://github.com/guybedford/cjs-module-lexer/pull/17) diff --git a/deps/cjs-module-lexer/LICENSE b/deps/cjs-module-lexer/LICENSE old mode 100755 new mode 100644 diff --git a/deps/cjs-module-lexer/README.md b/deps/cjs-module-lexer/README.md old mode 100755 new mode 100644 index a761c0c7dfd714..addf5edc6b1193 --- a/deps/cjs-module-lexer/README.md +++ b/deps/cjs-module-lexer/README.md @@ -10,6 +10,14 @@ Forked from https://github.com/guybedford/es-module-lexer. _Comprehensively handles the JS language grammar while remaining small and fast. - ~90ms per MB of JS cold and ~15ms per MB of JS warm, [see benchmarks](#benchmarks) for more info._ +### Project Status + +This project is used in Node.js core for detecting the named exports available when importing a CJS module into ESM, and is maintained for this purpose. + +PRs will be accepted and upstreamed for parser bugs, performance improvements or new syntax support only. + +_Detection patterns for this project are **frozen**_. This is because adding any new export detection patterns would result in fragmented backwards-compatibility. Specifically, it would be very difficult to figure out why an ES module named export for CommonJS might work in newer Node.js versions but not older versions. This problem would only be discovered downstream of module authors, with the fix for module authors being to then have to understand which patterns in this project provide full backwards-compatibily. Rather, by fully freezing the detected patterns, if it works in any Node.js version it will work in any other. Build tools can also reliably treat the supported syntax for this project as a part of their output target for ensuring syntax support. + ### Usage ``` @@ -51,7 +59,8 @@ When using the ESM version, Wasm is supported instead: ```js import { parse, init } from 'cjs-module-lexer'; -// init needs to be called and waited upon +// init() needs to be called and waited upon, or use initSync() to compile +// Wasm blockingly and synchronously. await init(); const { exports, reexports } = parse(source); ``` @@ -433,18 +442,39 @@ test/samples/*.js (3635 KiB) ### Wasm Build Steps -To build download the WASI SDK from https://github.com/WebAssembly/wasi-sdk/releases. - -The Makefile assumes the existence of "wasi-sdk-11.0" and "wabt" (optional) as sibling folders to this project. - -The build through the Makefile is then run via `make lib/lexer.wasm`, which can also be triggered via `npm run build-wasm` to create `dist/lexer.js`. - -On Windows it may be preferable to use the Linux subsystem. - -After the Web Assembly build, the CJS build can be triggered via `npm run build`. - -Optimization passes are run with [Binaryen](https://github.com/WebAssembly/binaryen) prior to publish to reduce the Web Assembly footprint. - +The build uses docker and make, they must be installed first. + +To build the lexer wasm run `npm run build-wasm`. + +Optimization passes are run with [Binaryen](https://github.com/WebAssembly/binaryen) +prior to publish to reduce the Web Assembly footprint. + +After building the lexer wasm, build the final distribution components +(lexer.js and lexer.mjs) by running `npm run build`. + +If you need to build lib/lexer.wat (optional) you must first install +[wabt](https://github.com/WebAssembly/wabt) as a sibling folder to this +project. The wat file is then build by running `make lib/lexer.wat` + +### Creating a Release +These are the steps to create and publish a release. You will need docker +installed as well as having installed [wabt](https://github.com/WebAssembly/wabt) +as outlined above: + +- [ ] Figure out if the release should be semver patch, minor or major based on the changes since + the last release and determine the new version. +- [ ] Update the package.json version, and run a full build and test + - npm install + - npm run build + - npm run test +- [ ] Commit and tag the changes, pushing up to main and the tag + - For example + - `git tag -a 1.4.2 -m "1.4.2"` + - `git push origin tag 1.4.2` +- [ ] Create the GitHub release +- [ ] Run npm publish from an account with access (asking somebody with access + the nodejs-foundation account is an option if you don't have access. + ### License MIT diff --git a/deps/cjs-module-lexer/dist/lexer.js b/deps/cjs-module-lexer/dist/lexer.js index 391bc5624ee495..e1a05b5b260684 100644 --- a/deps/cjs-module-lexer/dist/lexer.js +++ b/deps/cjs-module-lexer/dist/lexer.js @@ -1 +1 @@ -"use strict";exports.parse=parse;exports.init=init;let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,o=new Set,J=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&o.add(Q)}for(;A.ru();)J.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||J.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...o]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A<Q.length;A++){const B=64512&Q.charCodeAt(A);if(!(B<55296)){if(55296!==B)return;if(56320!=(64512&Q.charCodeAt(++A)))return}}return Q}catch{}}function E(A,Q){const B=A.length;let E=0;for(;E<B;){const B=A.charCodeAt(E);Q[E++]=(255&B)<<8|B>>>8}}function C(A,Q){const B=A.length;let E=0;for(;E<B;)Q[E]=A.charCodeAt(E++)}let g;function init(){return g||(g=(async()=>{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLpCYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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ASADLwEGQQpGGyEBDAALC0EAIAE2ArygARAdDwtBACABNgK8oAELOAEBf0EAQQE6APAfQQAoArygASEAQQBBACgCwKABQQJqNgK8oAFBACAAQQAoApgfa0EBdTYC7B8LzgEBBX9BACgCvKABIQBBACgCwKABIQEDQCAAIgJBAmohAAJAAkAgAiABTw0AIAAvAQAiA0Gkf2oiBEEETQ0BIANBJEcNAiACLwEEQfsARw0CQQBBAC8BhEAiAEEBajsBhEBBACgCoGAgAEEBdGpBAC8BiEA7AQBBACACQQRqNgK8oAFBAEEALwGGQEEBaiIAOwGIQEEAIAA7AYZADwtBACAANgK8oAEQHQ8LAkACQCAEDgUBAgICAAELQQAgADYCvKABDwsgAkEEaiEADAALC7YCAQJ/QQBBACgCvKABIgFBDmo2ArygAQJAAkACQBAnIgJB2wBGDQAgAkE9Rg0BIAJBLkcNAkEAQQAoArygAUECajYCvKABECchAkEAKAK8oAEhACACEC1FDQJBACgCvKABIQIQJ0E9Rw0CIAAgAkEAKAKcHxEAAA8LQQBBACgCvKABQQJqNgK8oAECQBAnIgJBJ0YNACACQSJHDQILQQAoArygASEAIAIQHEEAQQAoArygAUECaiICNgK8oAEQJ0HdAEcNAUEAQQAoArygAUECajYCvKABECdBPUcNASAAIAJBACgCnB8RAAAMAQsgAEUNAEEAKAKoHxEBAEEAQQAoArygAUECajYCvKABAkAQJyICQfIARg0AIAJB+wBHDQEQLg8LQQEQEBoLQQAgAUEMajYCvKABCzYBAn9BAEEAKAK8oAFBDGoiADYCvKABECchAQJAAkBBACgCvKABIABHDQAgARA/RQ0BCxAdCwtsAQF/QQBBACgCvKABIgBBDGo2ArygAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABECdB5QBHDQBBACgCvKABQQJqQfgAQfAAQe8AQfIAQfQAQfMAECZFDQBBARAfDwtBACAAQQpqNgK8oAEL6QEBAX9BACEXAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlHDQAgAC8BEiAKRw0AIAAvARQgC0cN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ACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUYhDgsgDguoAQECf0EAIQFBACgCvKABIQICQAJAIABB7QBHDQAgAkECakHvAEHkAEH1AEHsAEHlABATRQ0BQQAgAkEMajYCvKABAkAQJ0EuRg0AQQAhAQwCC0EAQQAoArygAUECajYCvKABECchAAsgAEHlAEcNAEEAKAK8oAEiAEEOaiACIABBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJiIBGyECC0EAIAI2ArygASABC2cBAX9BACEKAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlGIQoLIAoLcQEBf0EAIQsCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApGIQsLIAsLgwQBAn9BACECAkAQJ0HPAEcNAEEAIQJBACgCvKABIgNBAmpB4gBB6gBB5QBB4wBB9AAQE0UNAEEAIQJBACADQQxqNgK8oAEQJ0EuRw0AQQBBACgCvKABQQJqNgK8oAECQBAnIgNB8ABHDQBBACECQQAoArygASIDQQJqQfIAQe8AQfQAQe8AQfQAQfkAQfAAQeUAED1FDQFBACECQQAgA0ESajYCvKABECdBLkcNAUEAQQAoArygAUECajYCvKABECchAwtBACECIANB6ABHDQBBACECQQAoArygASIDQQJqQeEAQfMAQc8AQfcAQe4AQdAAQfIAQe8AQfAAQeUAQfIAQfQAQfkAEC9FDQBBACECQQAgA0EcajYCvKABECdBLkcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnQeMARw0AQQAhAkEAKAK8oAEiAy8BAkHhAEcNACADLwEEQewARw0AIAMvAQZB7ABHDQBBACECQQAgA0EIajYCvKABECdBKEcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnEC1FDQAQJ0EsRw0AQQAhAkEAQQAoArygAUECajYCvKABECcaQQAoArygASIDIAAgAUEBdCIBEEENAEEAIQJBACAD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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file +"use strict";exports.init=init;exports.initSync=initSync;exports.parse=parse;let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];function parse(E,g="@"){if(!A)throw new Error("Not initialized");const w=E.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?C:I)(E,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,E.length,0,0,0);if(S){const B=new Error(`Parse error ${g}${A.e()}:${E.slice(0,A.e()).split("\n").length}:${A.e()-E.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let o=new Set,R=new Set,y=new Set;for(;A.rre();){const B=Q(E.slice(A.res(),A.ree()));B&&R.add(B)}for(;A.ru();)y.add(Q(E.slice(A.us(),A.ue())));for(;A.re();){let B=Q(E.slice(A.es(),A.ee()));void 0===B||y.has(B)||o.add(B)}return{exports:[...o],reexports:[...R]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=function(A){const B=A[0];if('"'===B)try{return JSON.parse(A)}catch{}else if("'"===B&&A.length>1&&"'"===A[A.length-1]&&-1===A.indexOf('"'))try{return JSON.parse('"'+A.slice(1,-1)+'"')}catch{}let Q="",g={v:1};for(;g.v<A.length;){const I=A[g.v];switch(I){case B:return Q;case"\\":++g.v,Q+=E(A,g);break;case"\r":case"\n":throw new SyntaxError;default:++g.v,Q+=I}}throw new SyntaxError}(A);for(let A=0;A<B.length;A++){const Q=64512&B.charCodeAt(A);if(!(Q<55296)){if(55296!==Q)return;if(56320!=(64512&B.charCodeAt(++A)))return}}return B}catch{}}function E(A,B){if(B.v===A.length)throw new SyntaxError;const Q=A[B.v];switch(++B.v,Q){case"\r":"\n"===A[B.v]&&++B.v;case"\n":case"\u2028":case"\u2029":return"";case"r":return"\r";case"n":return"\n";case"t":return"\t";case"b":return"\b";case"f":return"\f";case"v":return"\v";case"x":return function(A,B){const Q=g(A[B.v]);++B.v;const E=g(A[B.v]);return++B.v,String.fromCodePoint(16*Q+E)}(A,B);case"u":return function(A,B){let Q=0;if("{"===A[B.v]){++B.v;do{if(Q=16*Q+g(A[B.v]),Q>1114111)throw new SyntaxError;++B.v}while("}"!==A[B.v]);++B.v}else for(let E=0;E<4;++E)Q=16*Q+g(A[B.v]),++B.v;return String.fromCodePoint(Q)}(A,B);case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":return function(A,B,Q){let E=A<="3"?2:1,g=+A;do{if((A=B[Q.v])<"0"||A>"7")break;g=8*g+ +A,++Q.v,--E}while(E>0);return String.fromCodePoint(g)}(Q,A,B);default:return Q}}function g(A){if(A>="0"&&A<="9")return+A;if(A>="a"&&A<="f")return A.charCodeAt(0)-87;if(A>="A"&&A<="F")return A.charCodeAt(0)-55;throw new SyntaxError}function I(A,B){const Q=A.length;let E=0;for(;E<Q;){const Q=A.charCodeAt(E);B[E++]=(255&Q)<<8|Q>>>8}}function C(A,B){const Q=A.length;let E=0;for(;E<Q;)B[E]=A.charCodeAt(E++)}function w(){const A="AGFzbQEAAAABXA1gAX8Bf2ACf38AYAABf2AAAGABfwBgBn9/f39/fwF/YAJ/fwF/YAd/f39/f39/AX9gA39/fwF/YAh/f39/f39/fwF/YAV/f39/fwF/YAR/f39/AX9gBH9/f38AAzMyAQEBAwAABAUJBAAEBAMDAAcCAAAICgAFAAAGBQsHBgAAAAAIAAICAgICAgICAgIFDAYEBQFwAQUFBQMBAAEGCAF/AEHQmAILB1wOBm1lbW9yeQIAC19faGVhcF9iYXNlAwACc2EAJAFlACUCZXMAJgJlZQAnA3JlcwAoA3JlZQApAnVzACoCdWUAKwJyZQAsA3JyZQAtAnJ1AC4IcGFyc2VDSlMALwkKAQBBAQsEAAECAwrJkwEyDgAgACABQcgfQcAfEDALDgAgACABQdQfQcwfEDALDgAgACABQeAfQdgfEDALEgBBzB9BADYCAEHUH0EANgIAC8wBAQN/AkBBvKABKAIAIgNBAmpB5QBB8QBB9QBB6QBB8gBB5QAQEARAQbygASADQQ5qNgIAAkAQEUEoRw0AQbygAUG8oAEoAgBBAmo2AgAQESEBQbygASgCACECIAFBJ0cgAUEiR3ENACABEAxBvKABQbygASgCAEECaiIBNgIAEBFBKUcNAAJAIABBAWsOAgMDAAtBtKABKAIAIAI2AgBBtKABKAIAIAE2AgRBAQ8LQbygASADNgIAC0EADwsgAiABQaAfKAIAEQEAQQELGwAgAEGYHygCAEYEQEEBDwsgAEECay8BABAPC/8CAQV/QZgfKAIAIQQDQAJAIABBAmshASAALwEAIgJBIEcNACAAIARLIAEhAA0BCwsCQCACQT1HDQADQAJAIAFBAmshACABLwEAQSBHDQAgASAESyAAIQENAQsLIABBAmohASAAQQRqIQNBACECA0ACQCABLwEAIgBBgPgDcUGAuANGBEAgAEH/B3EgAUECay8BAEH/B3FBCnRyQYCABGohAAsgAEUgASAETXINACAAQdwARg0CIAAQEkUNACABQX5BfCAAQYCABEkbaiEBIAAQEyECDAELCyACQQFxRQ0AIAEvAQBBIEcNAEG0oAEoAgAiAkGwHygCAEYNACACIAM2AgwgAiABQQJqNgIIA0ACQCABQQJrIQAgAS8BACIDQSBHDQAgASAESyAAIQENAQsLAkACQAJAIANB8gBrDgMAAwEDCyAAQfYAQeEAEBQNAQwCCyAAQewAQeUAEBQNACAAQeMAQe8AQe4AQfMAEBVFDQELQbSgASACQRBqNgIACws7AQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUYhBgsgBgtPAQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRiEICyAIC7MFAQN/QbygAUG8oAEoAgAiAkEOajYCAAJAAkAQESIBQdsARwRAIAFBPUYNASABQS5HDQJBvKABQbygASgCAEECajYCABARQbygASgCACEBEBZFDQJBvKABKAIAIQAQEUE9Rw0CIAEgAEGcHygCABEBAA8LQbygAUG8oAEoAgBBAmo2AgAQESIAQSdHIABBIkdxDQFBvKABKAIAIAAQDEG8oAFBvKABKAIAQQJqIgA2AgAQEUHdAEcNAUG8oAFBvKABKAIAQQJqNgIAEBFBPUcNASAAQZwfKAIAEQEADAELIABFDQBBqB8oAgARAwBBvKABQbygASgCAEECajYCABARIgBB8gBHBEAgAEH7AEcNAUG8oAEoAgBBAmshAQJAAkADQEG8oAFBvKABKAIAIgBBAmo2AgAgAEHAoAEoAgBPDQIQESEAQbygASgCACECAkAgABAWBEBBvKABKAIAIQMQESIAQTpGBEBBvKABQbygASgCAEECajYCABAREBZFDQRBvKABKAIALwEAIQALIAIgA0GcHygCABEBAAwBCwJAIABBIkcEQCAAQS5GDQEgAEEnRw0EC0G8oAEoAgAgABAMQbygAUG8oAEoAgBBAmoiAzYCABARIgBBOkcNAUG8oAFBvKABKAIAQQJqNgIAEBEQFkUNA0G8oAEoAgAvAQAhACADQZwfKAIAEQEADAELQbygASgCACIALwECQS5HDQIgAC8BBEEuRw0CQbygASAAQQZqNgIAAkACQCAALwEGIgBB8gBGBH9BARAEQbygASgCACEADQEgAC8BAAUgAAtB//8DcRAWRQ0EDAELQbygASAAQQJqNgIACxARIQALIABB//8DcSIAQSxGDQALIABB/QBGDQELQbygASABNgIACw8LQQEQBBoLQbygASACQQxq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6wBHcg0BQbygASgCACIALwECQeUARw0BIAAvAQRB+QBHDQEgAC8BBkHzAEcNASAAQQZqIQJBvKABIABBCGo2AgAQEUEoRw0BQbygAUG8oAEoAgBBAmo2AgAQEUG8oAEoAgAhBhAWRQ0BQbygASgCABARQSlHDQFBvKABQbygASgCACICQQJqNgIAEBFBLkcNAUG8oAFBvKABKAIAQQJqNgIAEBFB5gBHDQFBvKABKAIAIgBBAmpB7wBB8gBBxQBB4QBB4wBB6AAQEEUNAUG8oAEgAEEOajYCABARQbygASgCACIAQQJrIQJBKEcNAUG8oAEgAEECajYCABARQeYARw0BQbygASgCACIAQQJqQfUAQe4AQeMAQfQAQekAQe8AQe4AEAhFDQFBvKABIABBEGo2AgAQEUEoRw0BQbygAUG8oAEoAgBBAmo2AgAQEUG8oAEoAgAhBxAWRQ0BQbygASgCACEBEBFBKUcNAUG8oAFBvKABKAIAQQJqNgIAEBFB+wBHDQFBvKABQbygASgCAEECajYCABARQekARw0BQbygASgCACIALwECQeYARw0BQbygASAAQQRqNgIAEBFBKEcNAUG8oAFBvKABKAIAQQJqNgIAEBEaQbygASgCACIAIAcgASAHayIJECMNASAGayIFQQF1IQRBvKABIAAgCUEBdSIIQQF0ajYCAAJAAkACQBARIgBBIUcEQCAAQT1HDQVBvKABKAIAIgAvAQJBPUcNBSAALwEEQT1HDQVBvKABIABBBmo2AgAQESIBQSdHIAFBIkdxDQVBvKABKAIAIgBBAmpB5ABB5QBB5gBB4QBB9QBB7ABB9AAQCEUNBUG8oAEgAEEQajYCABARIAFHDQVBvKABQbygASgCAEECajYCABARQfwARw0FQbygASgCACIALwECQfwARw0FQbygASAAQQRqNgIAEBEaQbygASgCACIAIAcgCRAjDQVBvKABIAAgCEEBdGo2AgAQEUE9Rw0FQbygASgCACIALwECQT1HDQUgAC8BBEE9Rw0FQbygASAAQQZqNgIAEBEiA0EnRyADQSJHcQ0FQQAhAQJAQbygASgCACIAQQJqIgovAQBB3wBHDQAgCi8BAkHfAEcNACAKLwEEQeUARw0AIAovAQZB8wBHDQAgCi8BCEHNAEcNACAKLwEKQe8ARw0AIAovAQxB5ABH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IAAgCEEBdGo2AgAQEUEsRw0DQbygAUG8oAEoAgBBAmo2AgAQEUH7AEcNA0G8oAFBvKABKAIAQQJqNgIAEBFB5QBHDQNBvKABKAIAIgBBAmoQGUUNA0G8oAEgAEEUajYCABARQTpHDQNBvKABQbygASgCAEECajYCABARQbygASgCACEBQfQARwRAIAEvAQJB8gBHDQQgAS8BBEH1AEcNBCABLwEGQeUARw0EC0G8oAEgAUEIajYCABARQSxHDQNBvKABQbygASgCAEECajYCABARQecARw0DQbygASgCACIALwECQeUARw0DIAAvAQRB9ABHDQNBvKABIABBBmo2AgAQESIAQTpGBH9BvKABQbygASgCAEECajYCABARQeYARw0EQbygASgCACIAQQJqQfUAQe4AQeMAQfQAQekAQe8AQe4AEAhFDQRBvKABIABBEGoiATYCABARIgBBKEcEQCABQbygASgCAEYNBSAAEBZFDQULEBEFIAALQShHDQNBvKABQbygASgCAEECajYCABARQSlHDQNBvKABQbygASgCAEECajYCABARQfsARw0DQbygAUG8oAEoAgBBAmo2AgAQEUHyAEcNA0G8oAEoAgAiAEECakHlAEH0AEH1AEHyAEHuABAHRQ0DQbygASAAQQxqNgIAEBEaQbygASgCACIAIAYgBRAjDQNBvKABIAAgBEEBdGo2AgAQEUHbAEcNA0G8oAFBvKABKAIAQQJqNgIAEBEaQbygASgCACIAIAcgCRAjDQNBvKABIAAgCEEBdGo2AgAQEUHdAEcNA0G8oAFBvKABKAIAQQJqNgIAEBEiAEE7RgR/QbygAUG8oAEoAgBBAmo2AgAQEQUgAAtB/QBHDQNBvKABQbygASgCAEECajYCABARIgBBLEYEf0G8oAFBvKABKAIAQQJqNgIAEBEFIAALQf0ARw0DQbygAUG8oAEoAgBBAmo2AgAQEUEpRw0DQbygAUG8oAEoAgBBAmo2AgAQESIAQTtHDQELQbygAUG8oAEoAgBBAmo2AgAQESEACyAAQf0ARw0BQbygAUG8oAEoAgBBAmo2AgAQEUEpRw0BQbSgASgCACEDQYAgIQADQAJAIAAgA0cEQCAEIABBDGooAgAgAEEIaigCACIBa0EBdUcNASAGIAEgBRAjDQEgACgCACAAQQRqKAIAQaAfKAIA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";return"undefined"!=typeof Buffer?Buffer.from(A,"base64"):Uint8Array.from(atob(A),A=>A.charCodeAt(0))}let D;function init(){return D||(D=(async()=>{const B=await WebAssembly.compile(w()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}function initSync(){if(A)return;const B=new WebAssembly.Module(w()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file diff --git a/deps/cjs-module-lexer/dist/lexer.mjs b/deps/cjs-module-lexer/dist/lexer.mjs index 5dc4052af6965e..44a2f3eb0d1c35 100644 --- a/deps/cjs-module-lexer/dist/lexer.mjs +++ b/deps/cjs-module-lexer/dist/lexer.mjs @@ -1,2 +1,2 @@ -/* cjs-module-lexer 1.2.2 */ -let A;const Q=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(g,I="@"){if(!A)throw new Error("Not initialized");const D=g.length+1,N=(A.__heap_base.value||A.__heap_base)+4*D-A.memory.buffer.byteLength;N>0&&A.memory.grow(Math.ceil(N/65536));const k=A.sa(D);if((Q?C:E)(g,new Uint16Array(A.memory.buffer,k,D)),!A.parseCJS(k,g.length,0,0,0))throw Object.assign(new Error(`Parse error ${I}${A.e()}:${g.slice(0,A.e()).split("\n").length}:${A.e()-g.lastIndexOf("\n",A.e()-1)}`),{idx:A.e()});let w=new Set,o=new Set,J=new Set;for(;A.rre();){const Q=B(g.slice(A.res(),A.ree()));Q&&o.add(Q)}for(;A.ru();)J.add(B(g.slice(A.us(),A.ue())));for(;A.re();){let Q=B(g.slice(A.es(),A.ee()));void 0===Q||J.has(Q)||w.add(Q)}return{exports:[...w],reexports:[...o]}}function B(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const Q=(0,eval)(A);for(let A=0;A<Q.length;A++){const B=64512&Q.charCodeAt(A);if(!(B<55296)){if(55296!==B)return;if(56320!=(64512&Q.charCodeAt(++A)))return}}return Q}catch{}}function E(A,Q){const B=A.length;let E=0;for(;E<B;){const B=A.charCodeAt(E);Q[E++]=(255&B)<<8|B>>>8}}function C(A,Q){const B=A.length;let E=0;for(;E<B;)Q[E]=A.charCodeAt(E++)}let g;export function init(){return g||(g=(async()=>{const Q=await WebAssembly.compile((B="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EBENACACLwEAQS5HDQELQQAgAkESajYCvKABAkAgAi8BEiIDQdMARw0AIAIvARRB9ABHDQEgAi8BFkHhAEcNASACLwEYQfIARw0BQQAgAkEaajYCvKABIAIvARohAwsgA0H//wNxQShHDQBBACgCsKABQQAoAoxANgIAQQBBATsBhkBBAEEAKAK8oAEiAkECajYCvKABIAIvAQJB8gBHDQBBAhAQGgtBAEEAKAK8oAE2AoxADAELAkAgAkEEakHtAEHwAEHvAEHyAEH0ABATRQ0AIAAQEUUNABAkQQAoArygASEAC0EAIAA2AoxAC0EAKALAoAEhA0EAKAK8oAEhAgwACwsgAgv3AQEEf0EAIQECQEEAKAK8oAEiAkECakHlAEHxAEH1AEHpAEHyAEHlABAmRQ0AQQAhAUEAIAJBDmo2ArygAQJAECdBKEcNAEEAQQAoArygAUECajYCvKABECchA0EAKAK8oAEhBAJAIANBJ0YNACADQSJHDQELIAMQHEEAQQAoArygAUECaiIDNgK8oAEQJ0EpRw0AAkAgAEF/aiIBQQFLDQACQAJAIAEOAgEAAQsgBCADQQAoAqAfEQAAQQEPCyAEIANBACgCoB8RAABBAQ8LQQAoArSgASAENgIAQQAoArSgASADNgIEQQEPC0EAIAI2ArygAQsgAQsdAAJAQQAoApgfIABHDQBBAQ8LIABBfmovAQAQJQv+AgEEf0EAKAKYHyEBAkADQCAAQX5qIQIgAC8BACIDQSBHDQEgACABSyEEIAIhACAEDQALCwJAIANBPUcNAAJAA0AgAkF+aiEAIAIvAQBBIEcNASACIAFLIQQgACECIAQNAAsLIABBAmohAiAAQQRqIQNBACEEAkADQCACECghACACIAFNDQEgAEUNASAAQdwARg0CIAAQKUUNASACQX5BfCAAQYCABEkbaiECIAAQKiEEDAALCyAEQQFxRQ0AIAIvAQBBIEcNAEEAKAK0oAEiBEEAKAKwH0YNACAEIAM2AgwgBCACQQJqNgIIIAJBfmohAEEgIQICQANAIABBAmogAU0NASACQf//A3FBIEcNASAALwEAIQIgAEF+aiEADAALCyACQf//A3FBjn9qIgJBAksNAAJAAkACQCACDgMAAwEACyAAQfYAQeEAECsNAQwCCyAAQewAQeUAECsNACAAQeMAQe8AQe4AQfMAECxFDQELQQAgBEEQajYCtKABCws/AQF/QQAhBgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVGIQYLIAYLpCYBCH9BAEEAKAK8oAEiAUEMajYCvKABIAFBCmohAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABAkACQBAnIgJB5ABHDQBBACgCvKABIgBBAmpB5QBB5gBB6QBB7gBB5QBB0ABB8gBB7wBB8ABB5QBB8gBB9ABB+QAQL0UNAkEAIABBHGo2ArygASAAQRpqIQEQJ0EoRw0CQQBBACgCvKABQQJqNgK8oAEQJxAwRQ0CECdBLEcNAkEAQQAoArygAUECajYCvKABAkAQJyIAQSdGDQAgAEEiRw0DC0EAKAK8oAEhAiAAEBxBAEEAKAK8oAFBAmoiADYCvKABECdBLEcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0HlAEcNAEEAKAK8oAEiA0ECakHuAEH1AEHtAEHlAEHyAEHhAEHiAEHsAEHlABAxRQ0CQQAgA0EUajYCvKABECdBOkcNAkEAQQAoArygAUECajYCvKABECdB9ABHDQJBACgCvKABIgMvAQJB8gBHDQIgAy8BBEH1AEcNAiADLwEGQeUARw0CQQAgA0EIajYCvKABECdBLEcNAkEAQQAoArygAUECajYCvKABECchAwsCQCADQecARg0AIANB9gBHDQJBACgCvKABIgMvAQJB4QBHDQIgAy8BBEHsAEcNAiADLwEGQfUARw0CIAMvAQhB5QBHDQJBACADQQpqNgK8oAEQJ0E6Rw0CIAIgAEEAKAKcHxEAAEEAIAE2ArygAQ8LQQAoArygASIDLwECQeUARw0BIAMvAQRB9ABHDQFBACADQQZqNgK8oAECQBAnIgNBOkcNAEEAQQAoArygAUECajYCvKABECdB5gBHDQJBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAkEAIANBEGoiAzYCvKABAkAQJyIEQShGDQAgA0EAKAK8oAFGDQMgBBAtRQ0DCxAnIQMLIANBKEcNAUEAQQAoArygAUECajYCvKABECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQfIARw0BQQAoArygASIDQQJqQeUAQfQAQfUAQfIAQe4AEBNFDQFBACADQQxqNgK8oAEQJxAtRQ0BAkACQAJAECciA0HbAEYNACADQS5HDQJBAEEAKAK8oAFBAmo2ArygARAnEC0NAQwEC0EAQQAoArygAUECajYCvKABAkAQJyIDQSdGDQAgA0EiRw0ECyADEBxBAEEAKAK8oAFBAmo2ArygARAnQd0ARw0DQQBBACgCvKABQQJqNgK8oAELECchAwsCQCADQTtHDQBBAEEAKAK8oAFBAmo2ArygARAnIQMLIANB/QBHDQFBAEEAKAK8oAFBAmo2ArygAQJAECciA0EsRw0AQQBBACgCvKABQQJqNgK8oAEQJyEDCyADQf0ARw0BQQBBACgCvKABQQJqNgK8oAEQJ0EpRw0BIAIgAEEAKAKcHxEAAA8LIAJB6wBHDQEgAEUNAUEAKAK8oAEiAC8BAkHlAEcNASAALwEEQfkARw0BIAAvAQZB8wBHDQEgAEEGaiEBQQAgAEEIajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECchAEEAKAK8oAEhAiAAEC1FDQFBACgCvKABIQAQJ0EpRw0BQQBBACgCvKABIgFBAmo2ArygARAnQS5HDQFBAEEAKAK8oAFBAmo2ArygARAnQeYARw0BQQAoArygASIDQQJqQe8AQfIAQcUAQeEAQeMAQegAECZFDQFBACADQQ5qNgK8oAEQJyEDQQAoArygASIEQX5qIQEgA0EoRw0BQQAgBEECajYCvKABECdB5gBHDQFBACgCvKABIgNBAmpB9QBB7gBB4wBB9ABB6QBB7wBB7gAQI0UNAUEAIANBEGo2ArygARAnQShHDQFBAEEAKAK8oAFBAmo2ArygARAnIQNBACgCvKABIQQgAxAtRQ0BQQAoArygASEDECdBKUcNAUEAQQAoArygAUECajYCvKABECdB+wBHDQFBAEEAKAK8oAFBAmo2ArygARAnQekARw0BQQAoArygASIFLwECQeYARw0BQQAgBUEEajYCvKABECdBKEcNAUEAQQAoArygAUECajYCvKABECcaQQAoArygASIFIAQgAyAEayIDEEENASAAIAJrIgZBAXUhB0EAIAUgA0EBdSIIQQF0ajYCvKAB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ASADLwEGQQpGGyEBDAALC0EAIAE2ArygARAdDwtBACABNgK8oAELOAEBf0EAQQE6APAfQQAoArygASEAQQBBACgCwKABQQJqNgK8oAFBACAAQQAoApgfa0EBdTYC7B8LzgEBBX9BACgCvKABIQBBACgCwKABIQEDQCAAIgJBAmohAAJAAkAgAiABTw0AIAAvAQAiA0Gkf2oiBEEETQ0BIANBJEcNAiACLwEEQfsARw0CQQBBAC8BhEAiAEEBajsBhEBBACgCoGAgAEEBdGpBAC8BiEA7AQBBACACQQRqNgK8oAFBAEEALwGGQEEBaiIAOwGIQEEAIAA7AYZADwtBACAANgK8oAEQHQ8LAkACQCAEDgUBAgICAAELQQAgADYCvKABDwsgAkEEaiEADAALC7YCAQJ/QQBBACgCvKABIgFBDmo2ArygAQJAAkACQBAnIgJB2wBGDQAgAkE9Rg0BIAJBLkcNAkEAQQAoArygAUECajYCvKABECchAkEAKAK8oAEhACACEC1FDQJBACgCvKABIQIQJ0E9Rw0CIAAgAkEAKAKcHxEAAA8LQQBBACgCvKABQQJqNgK8oAECQBAnIgJBJ0YNACACQSJHDQILQQAoArygASEAIAIQHEEAQQAoArygAUECaiICNgK8oAEQJ0HdAEcNAUEAQQAoArygAUECajYCvKABECdBPUcNASAAIAJBACgCnB8RAAAMAQsgAEUNAEEAKAKoHxEBAEEAQQAoArygAUECajYCvKABAkAQJyICQfIARg0AIAJB+wBHDQEQLg8LQQEQEBoLQQAgAUEMajYCvKABCzYBAn9BAEEAKAK8oAFBDGoiADYCvKABECchAQJAAkBBACgCvKABIABHDQAgARA/RQ0BCxAdCwtsAQF/QQBBACgCvKABIgBBDGo2ArygAQJAECdBLkcNAEEAQQAoArygAUECajYCvKABECdB5QBHDQBBACgCvKABQQJqQfgAQfAAQe8AQfIAQfQAQfMAECZFDQBBARAfDwtBACAAQQpqNgK8oAEL6QEBAX9BACEXAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlHDQAgAC8BEiAKRw0AIAAvARQgC0cNACAALwEWIAxHDQAgAC8BGCANRw0AIAAvARogDkcNACAALwEcIA9HDQAgAC8BHiAQRw0AIAAvASAgEUcNACAALwEiIBJHDQAgAC8BJCATRw0AIAAvASYgFEcNACAALwEoIBVHDQAgAC8BKiAWRiEXCyAXC1MBAX9BACEIAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRiEICyAIC6QBAQR/QQBBACgCvKABIgBBDGoiATYCvKABAkACQAJAAkACQBAnIgJBWWoiA0EHTQ0AIAJBIkYNAiACQfsARg0CDAELAkAgAw4IAgABAgEBAQMCC0EAQQAvAYZAIgNBAWo7AYZAQQAoArCgASADQQJ0aiAANgIADwtBACgCvKABIAFGDQILQQAvAYZARQ0AQQBBACgCvKABQX5qNgK8oAEPCxAdCws0AQF/QQEhAQJAIABBd2pB//8DcUEFSQ0AIABBgAFyQaABRg0AIABBLkcgABA/cSEBCyABC0kBAX9BACEHAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZGIQcLIAcLegEDf0EAKAK8oAEhAAJAA0ACQCAALwEAIgFBd2pBBUkNACABQSBGDQAgAUGgAUYNACABQS9HDQICQCAALwECIgBBKkYNACAAQS9HDQMQFQwBCxAWC0EAQQAoArygASICQQJqIgA2ArygASACQQAoAsCgAUkNAAsLIAELOQEBfwJAIAAvAQAiAUGA+ANxQYC4A0cNACAAQX5qLwEAQf8HcUEKdCABQf8HcXJBgIAEaiEBCyABC30BAX8CQCAAQS9LDQAgAEEkRg8LAkAgAEE6SQ0AQQAhAQJAIABBwQBJDQAgAEHbAEkNAQJAIABB4ABLDQAgAEHfAEYPCyAAQfsASQ0BAkAgAEH//wNLDQAgAEGqAUkNASAAEDkPC0EBIQEgABA6DQAgABA7IQELIAEPC0EBC2MBAX8CQCAAQcAASw0AIABBJEYPC0EBIQECQCAAQdsASQ0AAkAgAEHgAEsNACAAQd8ARg8LIABB+wBJDQACQCAAQf//A0sNAEEAIQEgAEGqAUkNASAAEDwPCyAAEDohAQsgAQtMAQN/QQAhAwJAIABBfmoiBEEAKAKYHyIFSQ0AIAQvAQAgAUcNACAALwEAIAJHDQACQCAEIAVHDQBBAQ8LIABBfGovAQAQJSEDCyADC2YBA39BACEFAkAgAEF6aiIGQQAoApgfIgdJDQAgBi8BACABRw0AIABBfGovAQAgAkcNACAAQX5qLwEAIANHDQAgAC8BACAERw0AAkAgBiAHRw0AQQEPCyAAQXhqLwEAECUhBQsgBQuFAQECfyAAED4iABAqIQECQAJAIABB3ABGDQBBACECIAFFDQELQQAoArygAUECQQQgAEGAgARJG2ohAAJAA0BBACAANgK8oAEgAC8BABA+IgFFDQECQCABEClFDQAgAEECQQQgAUGAgARJG2ohAAwBCwtBACECIAFB3ABGDQELQQEhAgsgAgvaAwEEf0EAKAK8oAEiAEF+aiEBA0BBACAAQQJqNgK8oAECQAJAAkAgAEEAKALAoAFPDQAQJyEAQQAoArygASECAkACQCAAEC1FDQBBACgCvKABIQMCQAJAECciAEE6Rw0AQQBBACgCvKABQQJqNgK8oAEQJxAtRQ0BQQAoArygAS8BACEACyACIANBACgCnB8RAAAMAgtBACABNgK8oAEPCwJAAkAgAEEiRg0AIABBLkYNASAAQSdHDQQLQQAoArygASECIAAQHEEAQQAoArygAUECaiIDNgK8oAEQJyIAQTpHDQFBAEEAKAK8oAFBAmo2ArygAQJAECcQLUUNAEEAKAK8oAEvAQAhACACIANBACgCnB8RAAAMAgtBACABNgK8oAEPC0EAKAK8oAEiAC8BAkEuRw0CIAAvAQRBLkcNAkEAIABBBmo2ArygAQJAAkACQCAALwEGIgBB8gBHDQBBARAQIQBBACgCvKABIQIgAA0BIAIvAQAhAAsgAEH//wNxEC0NAUEAIAE2ArygAQ8LQQAgAkECajYCvKABCxAnIQALIABB//8DcSIAQSxGDQIgAEH9AEYNAEEAIAE2ArygAQsPC0EAIAE2ArygAQ8LQQAoArygASEADAALC48BAQF/QQAhDgJAIAAvAQAgAUcNACAALwECIAJHDQAgAC8BBCADRw0AIAAvAQYgBEcNACAALwEIIAVHDQAgAC8BCiAGRw0AIAAvAQwgB0cNACAALwEOIAhHDQAgAC8BECAJRw0AIAAvARIgCkcNACAALwEUIAtHDQAgAC8BFiAMRw0AIAAvARggDUYhDgsgDguoAQECf0EAIQFBACgCvKABIQICQAJAIABB7QBHDQAgAkECakHvAEHkAEH1AEHsAEHlABATRQ0BQQAgAkEMajYCvKABAkAQJ0EuRg0AQQAhAQwCC0EAQQAoArygAUECajYCvKABECchAAsgAEHlAEcNAEEAKAK8oAEiAEEOaiACIABBAmpB+ABB8ABB7wBB8gBB9ABB8wAQJiIBGyECC0EAIAI2ArygASABC2cBAX9BACEKAkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRw0AIAAvAQ4gCEcNACAALwEQIAlGIQoLIAoLcQEBf0EAIQsCQCAALwEAIAFHDQAgAC8BAiACRw0AIAAvAQQgA0cNACAALwEGIARHDQAgAC8BCCAFRw0AIAAvAQogBkcNACAALwEMIAdHDQAgAC8BDiAIRw0AIAAvARAgCUcNACAALwESIApGIQsLIAsLgwQBAn9BACECAkAQJ0HPAEcNAEEAIQJBACgCvKABIgNBAmpB4gBB6gBB5QBB4wBB9AAQE0UNAEEAIQJBACADQQxqNgK8oAEQJ0EuRw0AQQBBACgCvKABQQJqNgK8oAECQBAnIgNB8ABHDQBBACECQQAoArygASIDQQJqQfIAQe8AQfQAQe8AQfQAQfkAQfAAQeUAED1FDQFBACECQQAgA0ESajYCvKABECdBLkcNAUEAQQAoArygAUECajYCvKABECchAwtBACECIANB6ABHDQBBACECQQAoArygASIDQQJqQeEAQfMAQc8AQfcAQe4AQdAAQfIAQe8AQfAAQeUAQfIAQfQAQfkAEC9FDQBBACECQQAgA0EcajYCvKABECdBLkcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnQeMARw0AQQAhAkEAKAK8oAEiAy8BAkHhAEcNACADLwEEQewARw0AIAMvAQZB7ABHDQBBACECQQAgA0EIajYCvKABECdBKEcNAEEAIQJBAEEAKAK8oAFBAmo2ArygARAnEC1FDQAQJ0EsRw0AQQAhAkEAQQAoArygAUECajYCvKABECcaQQAoArygASIDIAAgAUEBdCIBEEENAEEAIQJBACAD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","undefined"!=typeof window&&"function"==typeof atob?Uint8Array.from(atob(B),A=>A.charCodeAt(0)):Buffer.from(B,"base64")));var B;const{exports:E}=await WebAssembly.instantiate(Q);A=E})())} \ No newline at end of file +/* cjs-module-lexer 2.2.0 */ +let A;const B=1===new Uint8Array(new Uint16Array([1]).buffer)[0];export function parse(E,g="@"){if(!A)throw new Error("Not initialized");const w=E.length+1,D=(A.__heap_base.value||A.__heap_base)+4*w-A.memory.buffer.byteLength;D>0&&A.memory.grow(Math.ceil(D/65536));const G=A.sa(w);(B?C:I)(E,new Uint16Array(A.memory.buffer,G,w));const S=A.parseCJS(G,E.length,0,0,0);if(S){const B=new Error(`Parse error ${g}${A.e()}:${E.slice(0,A.e()).split("\n").length}:${A.e()-E.lastIndexOf("\n",A.e()-1)}`);throw Object.assign(B,{idx:A.e()}),5!==S&&6!==S&&7!==S||Object.assign(B,{code:"ERR_LEXER_ESM_SYNTAX"}),B}let o=new Set,R=new Set,y=new Set;for(;A.rre();){const B=Q(E.slice(A.res(),A.ree()));B&&R.add(B)}for(;A.ru();)y.add(Q(E.slice(A.us(),A.ue())));for(;A.re();){let B=Q(E.slice(A.es(),A.ee()));void 0===B||y.has(B)||o.add(B)}return{exports:[...o],reexports:[...R]}}function Q(A){if('"'!==A[0]&&"'"!==A[0])return A;try{const B=function(A){const B=A[0];if('"'===B)try{return JSON.parse(A)}catch{}else if("'"===B&&A.length>1&&"'"===A[A.length-1]&&-1===A.indexOf('"'))try{return JSON.parse('"'+A.slice(1,-1)+'"')}catch{}let Q="",g={v:1};for(;g.v<A.length;){const I=A[g.v];switch(I){case B:return Q;case"\\":++g.v,Q+=E(A,g);break;case"\r":case"\n":throw new SyntaxError;default:++g.v,Q+=I}}throw new SyntaxError}(A);for(let A=0;A<B.length;A++){const Q=64512&B.charCodeAt(A);if(!(Q<55296)){if(55296!==Q)return;if(56320!=(64512&B.charCodeAt(++A)))return}}return B}catch{}}function E(A,B){if(B.v===A.length)throw new SyntaxError;const Q=A[B.v];switch(++B.v,Q){case"\r":"\n"===A[B.v]&&++B.v;case"\n":case"\u2028":case"\u2029":return"";case"r":return"\r";case"n":return"\n";case"t":return"\t";case"b":return"\b";case"f":return"\f";case"v":return"\v";case"x":return function(A,B){const Q=g(A[B.v]);++B.v;const E=g(A[B.v]);return++B.v,String.fromCodePoint(16*Q+E)}(A,B);case"u":return function(A,B){let Q=0;if("{"===A[B.v]){++B.v;do{if(Q=16*Q+g(A[B.v]),Q>1114111)throw new SyntaxError;++B.v}while("}"!==A[B.v]);++B.v}else for(let E=0;E<4;++E)Q=16*Q+g(A[B.v]),++B.v;return String.fromCodePoint(Q)}(A,B);case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":return function(A,B,Q){let E=A<="3"?2:1,g=+A;do{if((A=B[Q.v])<"0"||A>"7")break;g=8*g+ +A,++Q.v,--E}while(E>0);return String.fromCodePoint(g)}(Q,A,B);default:return Q}}function g(A){if(A>="0"&&A<="9")return+A;if(A>="a"&&A<="f")return A.charCodeAt(0)-87;if(A>="A"&&A<="F")return A.charCodeAt(0)-55;throw new SyntaxError}function I(A,B){const Q=A.length;let E=0;for(;E<Q;){const Q=A.charCodeAt(E);B[E++]=(255&Q)<<8|Q>>>8}}function C(A,B){const Q=A.length;let E=0;for(;E<Q;)B[E]=A.charCodeAt(E++)}function w(){const A="AGFzbQEAAAABXA1gAX8Bf2ACf38AYAABf2AAAGABfwBgBn9/f39/fwF/YAJ/fwF/YAd/f39/f39/AX9gA39/fwF/YAh/f39/f39/fwF/YAV/f39/fwF/YAR/f39/AX9gBH9/f38AAzMyAQEBAwAABAUJBAAEBAMDAAcCAAAICgAFAAAGBQsHBgAAAAAIAAICAgICAgICAgIFDAYEBQFwAQUFBQMBAAEGCAF/AEHQmAILB1wOBm1lbW9yeQIAC19faGVhcF9iYXNlAwACc2EAJAFlACUCZXMAJgJlZQAnA3JlcwAoA3JlZQApAnVzACoCdWUAKwJyZQAsA3JyZQAtAnJ1AC4IcGFyc2VDSlMALwkKAQBBAQsEAAECAwrJkwEyDgAgACABQcgfQcAfEDALDgAgACABQdQfQcwfEDALDgAgACABQeAfQdgfEDALEgBBzB9BADYCAEHUH0EANgIAC8wBAQN/AkBBvKABKAIAIgNBAmpB5QBB8QBB9QBB6QBB8gBB5QAQEARAQbygASADQQ5qNgIAAkAQEUEoRw0AQbygAUG8oAEoAgBBAmo2AgAQESEBQbygASgCACECIAFBJ0cgAUEiR3ENACABEAxBvKABQbygASgCAEECaiIBNgIAEBFBKUcNAAJAIABBAWsOAgMDAAtBtKABKAIAIAI2AgBBtKABKAIAIAE2AgRBAQ8LQbygASADNgIAC0EADwsgAiABQaAfKAIAEQEAQQELGwAgAEGYHygCAEYEQEEBDwsgAEECay8BABAPC/8CAQV/QZgfKAIAIQQDQAJAIABBAmshASAALwEAIgJBIEcNACAAIARLIAEhAA0BCwsCQCACQT1HDQADQAJAIAFBAmshACABLwEAQSBHDQAgASAESyAAIQENAQsLIABBAmohASAAQQRqIQNBACECA0ACQCABLwEAIgBBgPgDcUGAuANGBEAgAEH/B3EgAUECay8BAEH/B3FBCnRyQYCABGohAAsgAEUgASAETXINACAAQdwARg0CIAAQEkUNACABQX5BfCAAQYCABEkbaiEBIAAQEyECDAELCyACQQFxRQ0AIAEvAQBBIEcNAEG0oAEoAgAiAkGwHygCAEYNACACIAM2AgwgAiABQQJqNgIIA0ACQCABQQJrIQAgAS8BACIDQSBHDQAgASAESyAAIQENAQsLAkACQAJAIANB8gBrDgMAAwEDCyAAQfYAQeEAEBQNAQwCCyAAQewAQeUAEBQNACAAQeMAQe8AQe4AQfMAEBVFDQELQbSgASACQRBqNgIACws7AQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUYhBgsgBgtPAQF/AkAgAC8BACABRw0AIAAvAQIgAkcNACAALwEEIANHDQAgAC8BBiAERw0AIAAvAQggBUcNACAALwEKIAZHDQAgAC8BDCAHRiEICyAIC7MFAQN/QbygAUG8oAEoAgAiAkEOajYCAAJAAkAQESIBQdsARwRAIAFBPUYNASABQS5HDQJBvKABQbygASgCAEECajYCABARQbygASgCACEBEBZFDQJBvKABKAIAIQAQEUE9Rw0CIAEgAEGcHygCABEBAA8LQbygAUG8oAEoAgBBAmo2AgAQESIAQSdHIABBIkdxDQFBvKABKAIAIAAQDEG8oAFBvKABKAIAQQJqIgA2AgAQEUHdAEcNAUG8oAFBvKABKAIAQQJqNgIAEBFBPUcNASAAQZwfKAIAEQEADAELIABFDQBBqB8oAgARAwBBvKABQbygASgCAEECajYCABARIgBB8gBHBEAgAEH7AEcNAUG8oAEoAgBBAmshAQJAAkADQEG8oAFBvKABKAIAIgBBAmo2AgAgAEHAoAEoAgBPDQIQESEAQbygASgCACECAkAgABAWBEBBvKABKAIAIQMQESIAQTpGBEBBvKABQbygASgCAEECajYCABAREBZFDQRBvKABKAIALwEAIQALIAIgA0GcHygCABEBAAwBCwJAIABBIkcEQCAAQS5GDQEgAEEnRw0EC0G8oAEoAgAgABAMQbygAUG8oAEoAgBBAmoiAzYCABARIgBBOkcNAUG8oAFBvKABKAIAQQJqNgIAEBEQFkUNA0G8oAEoAgAvAQAhACADQZwfKAIAEQEADAELQbygASgCACIALwECQS5HDQIgAC8BBEEuRw0CQbygASAAQQZqNgIAAkACQCAALwEGIgBB8gBGBH9BARAEQbygASgCACEADQEgAC8BAAUgAAtB//8DcRAWRQ0EDAELQbygASAAQQJqNgIACxARIQALIABB//8DcSIAQSxGDQALIABB/QBGDQELQbygASABNgIACw8LQQEQBBoLQbygASACQQxq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6wBHcg0BQbygASgCACIALwECQeUARw0BIAAvAQRB+QBHDQEgAC8BBkHzAEcNASAAQQZqIQJBvKABIABBCGo2AgAQEUEoRw0BQbygAUG8oAEoAgBBAmo2AgAQEUG8oAEoAgAhBhAWRQ0BQbygASgCABARQSlHDQFBvKABQbygASgCACICQQJqNgIAEBFBLkcNAUG8oAFBvKABKAIAQQJqNgIAEBFB5gBHDQFBvKABKAIAIgBBAmpB7wBB8gBBxQBB4QBB4wBB6AAQEEUNAUG8oAEgAEEOajYCABARQbygASgCACIAQQJrIQJBKEcNAUG8oAEgAEECajYCABARQeYARw0BQbygASgCACIAQQJqQfUAQe4AQeMAQfQAQekAQe8AQe4AEAhFDQFBvKABIABBEGo2AgAQEUEoRw0BQbygAUG8oAEoAgBBAmo2AgAQEUG8oAEoAgAhBxAWRQ0BQbygASgCACEBEBFBKUcNAUG8oAFBvKABKAIAQQJqNgIAEBFB+wBHDQFBvKABQbygASgCAEECajYCABARQekARw0BQbygASgCACIALwECQeYARw0BQbygASAAQQRqNgIAEBFBKEcNAUG8oAFBvKABKAIAQQJqNgIAEBEaQbygASgCACIAIAcgASAHayIJECMNASAGayIFQQF1IQRBvKABIAAgCUEBdSIIQQF0ajYCAAJAAkACQBARIgBBIUcEQCAAQT1HDQVBvKABKAIAIgAvAQJBPUcNBSAALwEEQT1HDQVBvKABIABBBmo2AgAQESIBQSdHIAFBIkdxDQVBvKABKAIAIgBBAmpB5ABB5QBB5gBB4QBB9QBB7ABB9AAQCEUNBUG8oAEgAEEQajYCABARIAFHDQVBvKABQbygASgCAEECajYCABARQfwARw0FQbygASgCACIALwECQfwARw0FQbygASAAQQRqNgIAEBEaQbygASgCACIAIAcgCRAjDQVBvKABIAAgCEEBdGo2AgAQEUE9Rw0FQbygASgCACIALwECQT1HDQUgAC8BBEE9Rw0FQbygASAAQQZqNgIAEBEiA0EnRyADQSJHcQ0FQQAhAQJAQbygASgCACIAQQJqIgovAQBB3wBHDQAgCi8BAkHfAEcNACAKLwEEQeUARw0AIAovAQZB8wBHDQAgCi8BCEHNAEcNACAKLwEKQe8ARw0AIAovAQxB5ABH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IAAgCEEBdGo2AgAQEUEsRw0DQbygAUG8oAEoAgBBAmo2AgAQEUH7AEcNA0G8oAFBvKABKAIAQQJqNgIAEBFB5QBHDQNBvKABKAIAIgBBAmoQGUUNA0G8oAEgAEEUajYCABARQTpHDQNBvKABQbygASgCAEECajYCABARQbygASgCACEBQfQARwRAIAEvAQJB8gBHDQQgAS8BBEH1AEcNBCABLwEGQeUARw0EC0G8oAEgAUEIajYCABARQSxHDQNBvKABQbygASgCAEECajYCABARQecARw0DQbygASgCACIALwECQeUARw0DIAAvAQRB9ABHDQNBvKABIABBBmo2AgAQESIAQTpGBH9BvKABQbygASgCAEECajYCABARQeYARw0EQbygASgCACIAQQJqQfUAQe4AQeMAQfQAQekAQe8AQe4AEAhFDQRBvKABIABBEGoiATYCABARIgBBKEcEQCABQbygASgCAEYNBSAAEBZFDQULEBEFIAALQShHDQNBvKABQbygASgCAEECajYCABARQSlHDQNBvKABQbygASgCAEECajYCABARQfsARw0DQbygAUG8oAEoAgBBAmo2AgAQEUHyAEcNA0G8oAEoAgAiAEECakHlAEH0AEH1AEHyAEHuABAHRQ0DQbygASAAQQxqNgIAEBEaQbygASgCACIAIAYgBRAjDQNBvKABIAAgBEEBdGo2AgAQEUHbAEcNA0G8oAFBvKABKAIAQQJqNgIAEBEaQbygASgCACIAIAcgCRAjDQNBvKABIAAgCEEBdGo2AgAQEUHdAEcNA0G8oAFBvKABKAIAQQJqNgIAEBEiAEE7RgR/QbygAUG8oAEoAgBBAmo2AgAQEQUgAAtB/QBHDQNBvKABQbygASgCAEECajYCABARIgBBLEYEf0G8oAFBvKABKAIAQQJqNgIAEBEFIAALQf0ARw0DQbygAUG8oAEoAgBBAmo2AgAQEUEpRw0DQbygAUG8oAEoAgBBAmo2AgAQESIAQTtHDQELQbygAUG8oAEoAgBBAmo2AgAQESEACyAAQf0ARw0BQbygAUG8oAEoAgBBAmo2AgAQEUEpRw0BQbSgASgCACEDQYAgIQADQAJAIAAgA0cEQCAEIABBDGooAgAgAEEIaigCACIBa0EBdUcNASAGIAEgBRAjDQEgACgCACAAQQRqKAIAQaAfKAIA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";return"undefined"!=typeof Buffer?Buffer.from(A,"base64"):Uint8Array.from(atob(A),A=>A.charCodeAt(0))}let D;export function init(){return D||(D=(async()=>{const B=await WebAssembly.compile(w()),{exports:Q}=await WebAssembly.instantiate(B);A=Q})())}export function initSync(){if(A)return;const B=new WebAssembly.Module(w()),{exports:Q}=new WebAssembly.Instance(B);A=Q} \ No newline at end of file diff --git a/deps/cjs-module-lexer/lexer.js b/deps/cjs-module-lexer/lexer.js index 1bf3123c172c39..1614fd9e62d88f 100755 --- a/deps/cjs-module-lexer/lexer.js +++ b/deps/cjs-module-lexer/lexer.js @@ -55,7 +55,7 @@ function parseCJS (source, name = '@') { function decode (str) { if (str[0] === '"' || str[0] === '\'') { try { - const decoded = (0, eval)(str); + const decoded = scanStringLiteral(str); // Filter to exclude non-matching UTF-16 surrogate strings for (let i = 0; i < decoded.length; i++) { const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; @@ -137,8 +137,10 @@ function parseSource (cjsSource) { pos += 4; if (source.charCodeAt(pos) === 40/*(*/) { openTokenPosStack[openTokenDepth++] = lastTokenPos; - if (source.charCodeAt(++pos) === 114/*r*/) + if (source.charCodeAt(pos + 1) === 114/*r*/) { + pos++; tryParseRequire(ExportStar); + } } } lastTokenPos = pos; @@ -288,7 +290,7 @@ function tryBacktrackAddStarExportBinding (bPos) { // `Object.` `prototype.`? hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)` function tryParseObjectHasOwnProperty (it_id) { - ch = commentWhitespace(); + let ch = commentWhitespace(); if (ch !== 79/*O*/ || !source.startsWith('bject', pos + 1)) return false; pos += 6; ch = commentWhitespace(); @@ -1025,6 +1027,168 @@ function tryParseLiteralExports () { } } +// This function and it's callees are duplicated in src/lexer.js +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + // --- Extracted from AcornJS --- //(https://github.com/acornjs/acorn/blob/master/acorn/src/identifier.js#L23 // @@ -1149,6 +1313,10 @@ function codePointAtLast (bPos) { return ch; } +function esmSyntaxErr (msg) { + return Object.assign(new Error(msg), { code: 'ERR_LEXER_ESM_SYNTAX' }); +} + function throwIfImportStatement () { const startPos = pos; pos += 6; @@ -1160,7 +1328,7 @@ function throwIfImportStatement () { return; // import.meta case 46/*.*/: - throw new Error('Unexpected import.meta in CJS module.'); + throw esmSyntaxErr('Unexpected import.meta in CJS module.'); default: // no space after "import" -> not an import keyword @@ -1176,7 +1344,7 @@ function throwIfImportStatement () { return; } // import statements are a syntax error in CommonJS - throw new Error('Unexpected import statement in CJS module.'); + throw esmSyntaxErr('Unexpected import statement in CJS module.'); } } @@ -1186,7 +1354,7 @@ function throwIfExportStatement () { const ch = commentWhitespace(); if (pos === curPos && !isPunctuator(ch)) return; - throw new Error('Unexpected export statement in CJS module.'); + throw esmSyntaxErr('Unexpected export statement in CJS module.'); } function commentWhitespace () { @@ -1435,4 +1603,5 @@ function isExpressionTerminator (curPos) { const initPromise = Promise.resolve(); module.exports.init = () => initPromise; +module.exports.initSync = () => {}; module.exports.parse = parseCJS; diff --git a/deps/cjs-module-lexer/package.json b/deps/cjs-module-lexer/package.json deleted file mode 100755 index 13d13ca93c8d7d..00000000000000 --- a/deps/cjs-module-lexer/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "cjs-module-lexer", - "version": "1.2.2", - "description": "Lexes CommonJS modules, returning their named exports metadata", - "main": "lexer.js", - "exports": { - "import": "./dist/lexer.mjs", - "default": "./lexer.js" - }, - "types": "lexer.d.ts", - "scripts": { - "test-js": "mocha -b -u tdd test/*.js", - "test-wasm": "WASM=1 mocha -b -u tdd test/*.js", - "test": "npm run test-wasm && npm run test-js", - "bench": "node --expose-gc bench/index.mjs", - "build": "node build.js && babel dist/lexer.mjs | terser -o dist/lexer.js", - "build-wasm": "make lib/lexer.wasm && node build.js", - "prepublishOnly": "make && npm run build", - "footprint": "npm run build && cat dist/lexer.js | gzip -9f | wc -c" - }, - "author": "Guy Bedford", - "license": "MIT", - "devDependencies": { - "@babel/cli": "^7.5.5", - "@babel/core": "^7.5.5", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "kleur": "^2.0.2", - "mocha": "^5.2.0", - "terser": "^4.1.4" - }, - "files": [ - "dist", - "lexer.d.ts" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/guybedford/cjs-module-lexer.git" - }, - "bugs": { - "url": "https://github.com/guybedford/cjs-module-lexer/issues" - }, - "homepage": "https://github.com/guybedford/cjs-module-lexer#readme" -} diff --git a/deps/cjs-module-lexer/src/.babelrc b/deps/cjs-module-lexer/src/.babelrc new file mode 100755 index 00000000000000..ac89f952694c6e --- /dev/null +++ b/deps/cjs-module-lexer/src/.babelrc @@ -0,0 +1,10 @@ +{ + "plugins": [ + [ + "@babel/plugin-transform-modules-commonjs", + { + "strict": true + }, + ] + ] +} diff --git a/deps/cjs-module-lexer/src/CHANGELOG.md b/deps/cjs-module-lexer/src/CHANGELOG.md new file mode 100644 index 00000000000000..5a24d193fd487f --- /dev/null +++ b/deps/cjs-module-lexer/src/CHANGELOG.md @@ -0,0 +1,40 @@ +1.2.2 +- Fix RollupJS reexports bug (https://github.com/nodejs/cjs-module-lexer/pull/59) + +1.2.1 +- Support Unicode escapes in strings (https://github.com/nodejs/cjs-module-lexer/pull/55) +- Filter export strings to valid surrogate pairs (https://github.com/nodejs/cjs-module-lexer/pull/56) + +1.2.0 +- Support for non-identifier exports (https://github.com/nodejs/cjs-module-lexer/pull/54, @nicolo-ribaudo) + +1.1.1 +- Better support for Babel reexport getter function forms (https://github.com/nodejs/cjs-module-lexer/issues/50) +- Support Babel interopRequireWildcard reexports patterns (https://github.com/nodejs/cjs-module-lexer/issues/52) + +1.1.0 +- Support for Babel reexport conflict filter (https://github.com/nodejs/cjs-module-lexer/issues/36, @nicolo-ribaudo) +- Support trailing commas in getter patterns (https://github.com/nodejs/cjs-module-lexer/issues/31) +- Support for RollupJS reexports property checks (https://github.com/nodejs/cjs-module-lexer/issues/38) + +1.0.0 +- Unsafe getter tracking (https://github.com/nodejs/cjs-module-lexer/pull/29) + +0.6.0 +- API-only breaking change: Unify JS and Wasm interfaces (https://github.com/nodejs/cjs-module-lexer/pull/27) +- Add type definitions (https://github.com/nodejs/cjs-module-lexer/pull/28) + +0.5.2 +- Support named getter functions (https://github.com/nodejs/cjs-module-lexer/pull/26) + +0.5.1: +- Feature: Implement specific reexport getter forms (https://github.com/nodejs/cjs-module-lexer/pull/25) + +0.5.0 +- Breaking Change: No longer emit Object.defineProperty exports (https://github.com/nodejs/cjs-module-lexer/pull/24) +- Doc: Update link to WASI SDK (https://github.com/nodejs/cjs-module-lexer/pull/19) + +0.4.3 +- Support for Babel 7.12 reexports (https://github.com/nodejs/cjs-module-lexer/pull/16) +- Support module.exports = { ...require('x') } reexports (https://github.com/nodejs/cjs-module-lexer/pull/18) +- "if" keyword space parsing in exports matching (https://github.com/nodejs/cjs-module-lexer/pull/17) diff --git a/deps/cjs-module-lexer/src/LICENSE b/deps/cjs-module-lexer/src/LICENSE new file mode 100755 index 00000000000000..935b357962d08b --- /dev/null +++ b/deps/cjs-module-lexer/src/LICENSE @@ -0,0 +1,10 @@ +MIT License +----------- + +Copyright (C) 2018-2020 Guy Bedford + +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/cjs-module-lexer/src/Makefile b/deps/cjs-module-lexer/src/Makefile new file mode 100755 index 00000000000000..bf45b6270a5b9c --- /dev/null +++ b/deps/cjs-module-lexer/src/Makefile @@ -0,0 +1,19 @@ +WASM2WAT ?= ../wabt/bin/wasm2wat +WASM_OPT ?= ../binaryen/bin/wasm-opt + +.PHONY: optimize clean + +lib/lexer.wat: lib/lexer.wasm + $(WASM2WAT) lib/lexer.wasm -o lib/lexer.wat + +lib/lexer.wasm: include-wasm/cjs-module-lexer.h src/lexer.c | lib/ + node build/wasm.js --docker + +lib/: + @mkdir -p $@ + +optimize: lib/lexer.wasm + $(WASM_OPT) -Oz --enable-bulk-memory --strip-debug lib/lexer.wasm -o lib/lexer.wasm + +clean: + $(RM) lib/* diff --git a/deps/cjs-module-lexer/src/README.md b/deps/cjs-module-lexer/src/README.md new file mode 100755 index 00000000000000..addf5edc6b1193 --- /dev/null +++ b/deps/cjs-module-lexer/src/README.md @@ -0,0 +1,483 @@ +# CJS Module Lexer + +[![Build Status][travis-image]][travis-url] + +A [very fast](#benchmarks) JS CommonJS module syntax lexer used to detect the most likely list of named exports of a CommonJS module. + +Outputs the list of named exports (`exports.name = ...`) and possible module reexports (`module.exports = require('...')`), including the common transpiler variations of these cases. + +Forked from https://github.com/guybedford/es-module-lexer. + +_Comprehensively handles the JS language grammar while remaining small and fast. - ~90ms per MB of JS cold and ~15ms per MB of JS warm, [see benchmarks](#benchmarks) for more info._ + +### Project Status + +This project is used in Node.js core for detecting the named exports available when importing a CJS module into ESM, and is maintained for this purpose. + +PRs will be accepted and upstreamed for parser bugs, performance improvements or new syntax support only. + +_Detection patterns for this project are **frozen**_. This is because adding any new export detection patterns would result in fragmented backwards-compatibility. Specifically, it would be very difficult to figure out why an ES module named export for CommonJS might work in newer Node.js versions but not older versions. This problem would only be discovered downstream of module authors, with the fix for module authors being to then have to understand which patterns in this project provide full backwards-compatibily. Rather, by fully freezing the detected patterns, if it works in any Node.js version it will work in any other. Build tools can also reliably treat the supported syntax for this project as a part of their output target for ensuring syntax support. + +### Usage + +``` +npm install cjs-module-lexer +``` + +For use in CommonJS: + +```js +const { parse } = require('cjs-module-lexer'); + +// `init` return a promise for parity with the ESM API, but you do not have to call it + +const { exports, reexports } = parse(` + // named exports detection + module.exports.a = 'a'; + (function () { + exports.b = 'b'; + })(); + Object.defineProperty(exports, 'c', { value: 'c' }); + /* exports.d = 'not detected'; */ + + // reexports detection + if (maybe) module.exports = require('./dep1.js'); + if (another) module.exports = require('./dep2.js'); + + // literal exports assignments + module.exports = { a, b: c, d, 'e': f } + + // __esModule detection + Object.defineProperty(module.exports, '__esModule', { value: true }) +`); + +// exports === ['a', 'b', 'c', '__esModule'] +// reexports === ['./dep1.js', './dep2.js'] +``` + +When using the ESM version, Wasm is supported instead: + +```js +import { parse, init } from 'cjs-module-lexer'; +// init() needs to be called and waited upon, or use initSync() to compile +// Wasm blockingly and synchronously. +await init(); +const { exports, reexports } = parse(source); +``` + +The Wasm build is around 1.5x faster and without a cold start. + +### Grammar + +CommonJS exports matches are run against the source token stream. + +The token grammar is: + +``` +IDENTIFIER: As defined by ECMA-262, without support for identifier `\` escapes, filtered to remove strict reserved words: + "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield", "enum" + +STRING_LITERAL: A `"` or `'` bounded ECMA-262 string literal. + +MODULE_EXPORTS: `module` `.` `exports` + +EXPORTS_IDENTIFIER: MODULE_EXPORTS_IDENTIFIER | `exports` + +EXPORTS_DOT_ASSIGN: EXPORTS_IDENTIFIER `.` IDENTIFIER `=` + +EXPORTS_LITERAL_COMPUTED_ASSIGN: EXPORTS_IDENTIFIER `[` STRING_LITERAL `]` `=` + +EXPORTS_LITERAL_PROP: (IDENTIFIER (`:` IDENTIFIER)?) | (STRING_LITERAL `:` IDENTIFIER) + +EXPORTS_SPREAD: `...` (IDENTIFIER | REQUIRE) + +EXPORTS_MEMBER: EXPORTS_DOT_ASSIGN | EXPORTS_LITERAL_COMPUTED_ASSIGN + +EXPORTS_DEFINE: `Object` `.` `defineProperty `(` EXPORTS_IDENFITIER `,` STRING_LITERAL + +EXPORTS_DEFINE_VALUE: EXPORTS_DEFINE `, {` + (`enumerable: true,`)? + ( + `value:` | + `get` (`: function` IDENTIFIER? )? `() {` return IDENTIFIER (`.` IDENTIFIER | `[` STRING_LITERAL `]`)? `;`? `}` `,`? + ) + `})` + +EXPORTS_LITERAL: MODULE_EXPORTS `=` `{` (EXPORTS_LITERAL_PROP | EXPORTS_SPREAD) `,`)+ `}` + +REQUIRE: `require` `(` STRING_LITERAL `)` + +EXPORTS_ASSIGN: (`var` | `const` | `let`) IDENTIFIER `=` (`_interopRequireWildcard (`)? REQUIRE + +MODULE_EXPORTS_ASSIGN: MODULE_EXPORTS `=` REQUIRE + +EXPORT_STAR: (`__export` | `__exportStar`) `(` REQUIRE + +EXPORT_STAR_LIB: `Object.keys(` IDENTIFIER$1 `).forEach(function (` IDENTIFIER$2 `) {` + ( + ( + `if (` IDENTIFIER$2 `===` ( `'default'` | `"default"` ) `||` IDENTIFIER$2 `===` ( '__esModule' | `"__esModule"` ) `) return` `;`? + ( + (`if (Object` `.prototype`? `.hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)) return` `;`?)? + (`if (` IDENTIFIER$2 `in` EXPORTS_IDENTIFIER `&&` EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] ===` IDENTIFIER$1 `[` IDENTIFIER$2 `]) return` `;`)? + )? + ) | + `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) (`&& !` (`Object` `.prototype`? `.hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)` | IDENTIFIER `.hasOwnProperty(` IDENTIFIER$2 `)`))? `)` + ) + ( + EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] =` IDENTIFIER$1 `[` IDENTIFIER$2 `]` `;`? | + `Object.defineProperty(` EXPORTS_IDENTIFIER `, ` IDENTIFIER$2 `, { enumerable: true, get` (`: function` IDENTIFIER? )? `() { return ` IDENTIFIER$1 `[` IDENTIFIER$2 `]` `;`? `}` `,`? `})` `;`? + ) + `})` +``` + +Spacing between tokens is taken to be any ECMA-262 whitespace, ECMA-262 block comment or ECMA-262 line comment. + +* The returned export names are taken to be the combination of: + 1. All `IDENTIFIER` and `STRING_LITERAL` slots for `EXPORTS_MEMBER` and `EXPORTS_LITERAL` matches. + 2. The first `STRING_LITERAL` slot for all `EXPORTS_DEFINE_VALUE` matches where that same string is not an `EXPORTS_DEFINE` match that is not also an `EXPORTS_DEFINE_VALUE` match. +* The reexport specifiers are taken to be the combination of: + 1. The `REQUIRE` matches of the last matched of either `MODULE_EXPORTS_ASSIGN` or `EXPORTS_LITERAL`. + 2. All _top-level_ `EXPORT_STAR` `REQUIRE` matches and `EXPORTS_ASSIGN` matches whose `IDENTIFIER` also matches the first `IDENTIFIER` in `EXPORT_STAR_LIB`. + +### Parsing Examples + +#### Named Exports Parsing + +The basic matching rules for named exports are `exports.name`, `exports['name']` or `Object.defineProperty(exports, 'name', ...)`. This matching is done without scope analysis and regardless of the expression position: + +```js +// DETECTS EXPORTS: a, b +(function (exports) { + exports.a = 'a'; + exports['b'] = 'b'; +})(exports); +``` + +Because there is no scope analysis, the above detection may overclassify: + +```js +// DETECTS EXPORTS: a, b, c +(function (exports, Object) { + exports.a = 'a'; + exports['b'] = 'b'; + if (false) + exports.c = 'c'; +})(NOT_EXPORTS, NOT_OBJECT); +``` + +It will in turn underclassify in cases where the identifiers are renamed: + +```js +// DETECTS: NO EXPORTS +(function (e) { + e.a = 'a'; + e['b'] = 'b'; +})(exports); +``` + +#### Getter Exports Parsing + +`Object.defineProperty` is detected for specifically value and getter forms returning an identifier or member expression: + +```js +// DETECTS: a, b, c, d, __esModule +Object.defineProperty(exports, 'a', { + enumerable: true, + get: function () { + return q.p; + } +}); +Object.defineProperty(exports, 'b', { + enumerable: true, + get: function () { + return q['p']; + } +}); +Object.defineProperty(exports, 'c', { + enumerable: true, + get () { + return b; + } +}); +Object.defineProperty(exports, 'd', { value: 'd' }); +Object.defineProperty(exports, '__esModule', { value: true }); +``` + +Value properties are also detected specifically: + +```js +Object.defineProperty(exports, 'a', { + value: 'no problem' +}); +``` + +To avoid matching getters that have side effects, any getter for an export name that does not support the forms above will +opt-out of the getter matching: + +```js +// DETECTS: NO EXPORTS +Object.defineProperty(exports, 'a', { + get () { + return 'nope'; + } +}); + +if (false) { + Object.defineProperty(module.exports, 'a', { + get () { + return dynamic(); + } + }) +} +``` + +Alternative object definition structures or getter function bodies are not detected: + +```js +// DETECTS: NO EXPORTS +Object.defineProperty(exports, 'a', { + enumerable: false, + get () { + return p; + } +}); +Object.defineProperty(exports, 'b', { + configurable: true, + get () { + return p; + } +}); +Object.defineProperty(exports, 'c', { + get: () => p +}); +Object.defineProperty(exports, 'd', { + enumerable: true, + get: function () { + return dynamic(); + } +}); +Object.defineProperty(exports, 'e', { + enumerable: true, + get () { + return 'str'; + } +}); +``` + +`Object.defineProperties` is also not supported. + +#### Exports Object Assignment + +A best-effort is made to detect `module.exports` object assignments, but because this is not a full parser, arbitrary expressions are not handled in the +object parsing process. + +Simple object definitions are supported: + +```js +// DETECTS EXPORTS: a, b, c +module.exports = { + a, + 'b': b, + c: c, + ...d +}; +``` + +Object properties that are not identifiers or string expressions will bail out of the object detection, while spreads are ignored: + +```js +// DETECTS EXPORTS: a, b +module.exports = { + a, + ...d, + b: require('c'), + c: "not detected since require('c') above bails the object detection" +} +``` + +`Object.defineProperties` is not currently supported either. + +#### module.exports reexport assignment + +Any `module.exports = require('mod')` assignment is detected as a reexport, but only the last one is returned: + +```js +// DETECTS REEXPORTS: c +module.exports = require('a'); +(module => module.exports = require('b'))(NOT_MODULE); +if (false) module.exports = require('c'); +``` + +This is to avoid over-classification in Webpack bundles with externals which include `module.exports = require('external')` in their source for every external dependency. + +In exports object assignment, any spread of `require()` are detected as multiple separate reexports: + +```js +// DETECTS REEXPORTS: a, b +module.exports = require('ignored'); +module.exports = { + ...require('a'), + ...require('b') +}; +``` + +#### Transpiler Re-exports + +For named exports, transpiler output works well with the rules described above. + +But for star re-exports, special care is taken to support common patterns of transpiler outputs from Babel and TypeScript as well as bundlers like RollupJS. +These reexport and star reexport patterns are restricted to only be detected at the top-level as provided by the direct output of these tools. + +For example, `export * from 'external'` is output by Babel as: + +```js +"use strict"; + +exports.__esModule = true; + +var _external = require("external"); + +Object.keys(_external).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + exports[key] = _external[key]; +}); +``` + +Where the `var _external = require("external")` is specifically detected as well as the `Object.keys(_external)` statement, down to the exact +for of that entire expression including minor variations of the output. The `_external` and `key` identifiers are carefully matched in this +detection. + +Similarly for TypeScript, `export * from 'external'` is output as: + +```js +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("external")); +``` + +Where the `__export(require("external"))` statement is explicitly detected as a reexport, including variations `tslib.__export` and `__exportStar`. + +### Environment Support + +Node.js 10+, and [all browsers with Web Assembly support](https://caniuse.com/#feat=wasm). + +### JS Grammar Support + +* Token state parses all line comments, block comments, strings, template strings, blocks, parens and punctuators. +* Division operator / regex token ambiguity is handled via backtracking checks against punctuator prefixes, including closing brace or paren backtracking. +* Always correctly parses valid JS source, but may parse invalid JS source without errors. + +### Benchmarks + +Benchmarks can be run with `npm run bench`. + +Current results: + +JS Build: + +``` +Module load time +> 4ms +Cold Run, All Samples +test/samples/*.js (3635 KiB) +> 299ms + +Warm Runs (average of 25 runs) +test/samples/angular.js (1410 KiB) +> 13.96ms +test/samples/angular.min.js (303 KiB) +> 4.72ms +test/samples/d3.js (553 KiB) +> 6.76ms +test/samples/d3.min.js (250 KiB) +> 4ms +test/samples/magic-string.js (34 KiB) +> 0.64ms +test/samples/magic-string.min.js (20 KiB) +> 0ms +test/samples/rollup.js (698 KiB) +> 8.48ms +test/samples/rollup.min.js (367 KiB) +> 5.36ms + +Warm Runs, All Samples (average of 25 runs) +test/samples/*.js (3635 KiB) +> 40.28ms +``` + +Wasm Build: +``` +Module load time +> 10ms +Cold Run, All Samples +test/samples/*.js (3635 KiB) +> 43ms + +Warm Runs (average of 25 runs) +test/samples/angular.js (1410 KiB) +> 9.32ms +test/samples/angular.min.js (303 KiB) +> 3.16ms +test/samples/d3.js (553 KiB) +> 5ms +test/samples/d3.min.js (250 KiB) +> 2.32ms +test/samples/magic-string.js (34 KiB) +> 0.16ms +test/samples/magic-string.min.js (20 KiB) +> 0ms +test/samples/rollup.js (698 KiB) +> 6.28ms +test/samples/rollup.min.js (367 KiB) +> 3.6ms + +Warm Runs, All Samples (average of 25 runs) +test/samples/*.js (3635 KiB) +> 27.76ms +``` + +### Wasm Build Steps + +The build uses docker and make, they must be installed first. + +To build the lexer wasm run `npm run build-wasm`. + +Optimization passes are run with [Binaryen](https://github.com/WebAssembly/binaryen) +prior to publish to reduce the Web Assembly footprint. + +After building the lexer wasm, build the final distribution components +(lexer.js and lexer.mjs) by running `npm run build`. + +If you need to build lib/lexer.wat (optional) you must first install +[wabt](https://github.com/WebAssembly/wabt) as a sibling folder to this +project. The wat file is then build by running `make lib/lexer.wat` + +### Creating a Release +These are the steps to create and publish a release. You will need docker +installed as well as having installed [wabt](https://github.com/WebAssembly/wabt) +as outlined above: + +- [ ] Figure out if the release should be semver patch, minor or major based on the changes since + the last release and determine the new version. +- [ ] Update the package.json version, and run a full build and test + - npm install + - npm run build + - npm run test +- [ ] Commit and tag the changes, pushing up to main and the tag + - For example + - `git tag -a 1.4.2 -m "1.4.2"` + - `git push origin tag 1.4.2` +- [ ] Create the GitHub release +- [ ] Run npm publish from an account with access (asking somebody with access + the nodejs-foundation account is an option if you don't have access. + +### License + +MIT + +[travis-url]: https://travis-ci.org/guybedford/es-module-lexer +[travis-image]: https://travis-ci.org/guybedford/es-module-lexer.svg?branch=master diff --git a/deps/cjs-module-lexer/src/build.js b/deps/cjs-module-lexer/src/build.js new file mode 100755 index 00000000000000..da024d1a6cb780 --- /dev/null +++ b/deps/cjs-module-lexer/src/build.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const terser = require('terser'); + +const MINIFY = true; + +try { fs.mkdirSync('./dist'); } +catch (e) {} + +const wasmBuffer = fs.readFileSync('./lib/lexer.wasm'); +const jsSource = fs.readFileSync('./src/lexer.js').toString(); +const pjson = JSON.parse(fs.readFileSync('./package.json').toString()); + +const jsSourceProcessed = jsSource.replace('WASM_BINARY', wasmBuffer.toString('base64')); + +const minified = MINIFY && terser.minify(jsSourceProcessed, { + module: true, + output: { + preamble: `/* cjs-module-lexer ${pjson.version} */` + } +}); + +if (minified.error) + throw minified.error; + +fs.writeFileSync('./dist/lexer.mjs', minified ? minified.code : jsSourceProcessed); diff --git a/deps/cjs-module-lexer/src/build/Makefile b/deps/cjs-module-lexer/src/build/Makefile new file mode 100755 index 00000000000000..b8e96d82534f7d --- /dev/null +++ b/deps/cjs-module-lexer/src/build/Makefile @@ -0,0 +1,24 @@ +# These flags depend on the system and may be overridden +WASM_CC := clang +WASM_CFLAGS := --sysroot=/usr/share/wasi-sysroot +WASM_LDFLAGS := -nostartfiles + +# These are project-specific and are expected to be kept intact +WASM_TARGET := -target wasm32-unknown-wasi +WASM_EXTRA_CFLAGS := -I include-wasm/ -Wno-logical-op-parentheses -Wno-parentheses -Oz +WASM_EXTRA_LDFLAGS := -Wl,-z,stack-size=13312,--no-entry,--compress-relocations,--strip-all +WASM_EXTRA_LDFLAGS += -Wl,--export=__heap_base,--export=parseCJS,--export=sa +WASM_EXTRA_LDFLAGS += -Wl,--export=e,--export=re,--export=es,--export=ee +WASM_EXTRA_LDFLAGS += -Wl,--export=rre,--export=ree,--export=res,--export=ru,--export=us,--export=ue + +lib/lexer.wasm: include-wasm/cjs-module-lexer.h src/lexer.c + @mkdir -p lib + $(WASM_CC) $(WASM_CFLAGS) $(WASM_TARGET) $(WASM_EXTRA_CFLAGS) \ + src/lexer.c -o lib/lexer.wasm \ + $(WASM_LDFLAGS) $(WASM_EXTRA_LDFLAGS) + +optimize: lib/lexer.wasm + ${WASM_OPT} -Oz lib/lexer.wasm -o lib/lexer.wasm + +clean: + rm lib/* diff --git a/deps/cjs-module-lexer/src/build/wasm.js b/deps/cjs-module-lexer/src/build/wasm.js new file mode 100644 index 00000000000000..ad83d5992863b7 --- /dev/null +++ b/deps/cjs-module-lexer/src/build/wasm.js @@ -0,0 +1,54 @@ +'use strict' + +const WASM_BUILDER_CONTAINER = 'ghcr.io/nodejs/wasm-builder@sha256:975f391d907e42a75b8c72eb77c782181e941608687d4d8694c3e9df415a0970' // v0.0.9 + +const WASM_OPT = process.env.WASM_OPT || './wasm-opt' + +const { execSync } = require('node:child_process') +const { writeFileSync, readFileSync, existsSync, mkdirSync } = require('node:fs') +const { join, resolve } = require('node:path') + +const ROOT = resolve(__dirname, '../') + +let platform = process.env.WASM_PLATFORM +if (!platform && process.argv[2]) { + platform = execSync('docker info -f "{{.OSType}}/{{.Architecture}}"').toString().trim() +} + +if (process.argv[2] === '--docker') { + let cmd = `docker run --rm --platform=${platform.toString().trim()} ` + if (process.platform === 'linux') { + cmd += ` --user ${process.getuid()}:${process.getegid()}` + } + + if (!existsSync(`${ROOT}/dist`)){ + mkdirSync(`${ROOT}/dist`); + } + + cmd += ` --mount type=bind,source=${ROOT}/lib,target=/home/node/build/lib \ + --mount type=bind,source=${ROOT}/src,target=/home/node/build/src \ + --mount type=bind,source=${ROOT}/dist,target=/home/node/build/dist \ + --mount type=bind,source=${ROOT}/node_modules,target=/home/node/build/node_modules \ + --mount type=bind,source=${ROOT}/build/wasm.js,target=/home/node/build/wasm.js \ + --mount type=bind,source=${ROOT}/build/Makefile,target=/home/node/build/Makefile \ + --mount type=bind,source=${ROOT}/build.js,target=/home/node/build/build.js \ + --mount type=bind,source=${ROOT}/package.json,target=/home/node/build/package.json \ + --mount type=bind,source=${ROOT}/include-wasm,target=/home/node/build/include-wasm \ + -t ${WASM_BUILDER_CONTAINER} node wasm.js` + console.log(`> ${cmd}\n\n`) + execSync(cmd, { stdio: 'inherit' }) + process.exit(0) +} + +const hasOptimizer = (function () { + try { execSync(`${WASM_OPT} --version`); return true } catch (error) { return false } +})() + +// Build wasm binary +console.log('Building wasm'); +execSync(`make lib/lexer.wasm`, { stdio: 'inherit' }) +if (hasOptimizer) { + console.log('Optimizing wasm'); + execSync(`make optimize`, { stdio: 'inherit' }) +} +execSync(`node build.js`, { stdio: 'inherit' }) diff --git a/deps/cjs-module-lexer/src/include-wasm/cjs-module-lexer.h b/deps/cjs-module-lexer/src/include-wasm/cjs-module-lexer.h new file mode 100755 index 00000000000000..ab2adca3c751ab --- /dev/null +++ b/deps/cjs-module-lexer/src/include-wasm/cjs-module-lexer.h @@ -0,0 +1,238 @@ +#include <stdint.h> +#include <stdbool.h> +#include <stddef.h> +#include <limits.h> +#include <string.h> + +extern unsigned char __heap_base; + +const uint16_t* source = (void*)&__heap_base; +uint32_t parse_error; + +struct Slice { + const uint16_t* start; + const uint16_t* end; + struct Slice* next; +}; +typedef struct Slice Slice; + +struct StarExportBinding { + const uint16_t* specifier_start; + const uint16_t* specifier_end; + const uint16_t* id_start; + const uint16_t* id_end; +}; +typedef struct StarExportBinding StarExportBinding; + +Slice* first_export = NULL; +Slice* export_read_head = NULL; +Slice* export_write_head = NULL; +Slice* first_reexport = NULL; +Slice* reexport_read_head = NULL; +Slice* reexport_write_head = NULL; +Slice* first_unsafe_getter = NULL; +Slice* unsafe_getter_read_head = NULL; +Slice* unsafe_getter_write_head = NULL; +void* analysis_base; +void* analysis_head; + +void bail (uint32_t err); + +// allocateSource +const uint16_t* sa (uint32_t utf16Len) { + const uint16_t* sourceEnd = source + utf16Len + 1; + // ensure source is null terminated + *(uint16_t*)(source + utf16Len) = '\0'; + analysis_base = (void*)sourceEnd; + analysis_head = analysis_base; + first_export = NULL; + export_write_head = NULL; + export_read_head = NULL; + first_reexport = NULL; + reexport_write_head = NULL; + reexport_read_head = NULL; + first_unsafe_getter = NULL; + unsafe_getter_write_head = NULL; + unsafe_getter_read_head = NULL; + return source; +} + +// getErr +uint32_t e () { + return parse_error; +} + +// getExportStart +uint32_t es () { + return export_read_head->start - source; +} +// getExportEnd +uint32_t ee () { + return export_read_head->end - source; +} +// getReexportStart +uint32_t res () { + return reexport_read_head->start - source; +} +// getReexportEnd +uint32_t ree () { + return reexport_read_head->end - source; +} +// getUnsafeGetterStart +uint32_t us () { + return unsafe_getter_read_head->start - source; +} +// getUnsafeGetterEnd +uint32_t ue () { + return unsafe_getter_read_head->end - source; +} +// readExport +bool re () { + if (export_read_head == NULL) + export_read_head = first_export; + else + export_read_head = export_read_head->next; + if (export_read_head == NULL) + return false; + return true; +} +// readReexport +bool rre () { + if (reexport_read_head == NULL) + reexport_read_head = first_reexport; + else + reexport_read_head = reexport_read_head->next; + if (reexport_read_head == NULL) + return false; + return true; +} +// readUnsafeGetter +bool ru () { + if (unsafe_getter_read_head == NULL) + unsafe_getter_read_head = first_unsafe_getter; + else + unsafe_getter_read_head = unsafe_getter_read_head->next; + if (unsafe_getter_read_head == NULL) + return false; + return true; +} + +void _addExport (const uint16_t* start, const uint16_t* end) { + Slice* export = (Slice*)(analysis_head); + analysis_head = analysis_head + sizeof(Slice); + if (export_write_head == NULL) + first_export = export; + else + export_write_head->next = export; + export_write_head = export; + export->start = start; + export->end = end; + export->next = NULL; +} +void _addReexport (const uint16_t* start, const uint16_t* end) { + Slice* reexport = (Slice*)(analysis_head); + analysis_head = analysis_head + sizeof(Slice); + if (reexport_write_head == NULL) + first_reexport = reexport; + else + reexport_write_head->next = reexport; + reexport_write_head = reexport; + reexport->start = start; + reexport->end = end; + reexport->next = NULL; +} +void _addUnsafeGetter (const uint16_t* start, const uint16_t* end) { + Slice* unsafe_getter = (Slice*)(analysis_head); + analysis_head = analysis_head + sizeof(Slice); + if (unsafe_getter_write_head == NULL) + first_unsafe_getter = unsafe_getter; + else + unsafe_getter_write_head->next = unsafe_getter; + unsafe_getter_write_head = unsafe_getter; + unsafe_getter->start = start; + unsafe_getter->end = end; + unsafe_getter->next = NULL; +} +void _clearReexports () { + reexport_write_head = NULL; + first_reexport = NULL; +} +void (*addExport)(const uint16_t*, const uint16_t*) = &_addExport; +void (*addReexport)(const uint16_t*, const uint16_t*) = &_addReexport; +void (*addUnsafeGetter)(const uint16_t*, const uint16_t*) = &_addUnsafeGetter; +void (*clearReexports)() = &_clearReexports; +uint32_t parseCJS (uint16_t* source, uint32_t sourceLen, void (*addExport)(const uint16_t* start, const uint16_t* end), void (*addReexport)(const uint16_t* start, const uint16_t* end), void (*addUnsafeGetter)(const uint16_t*, const uint16_t*), void (*clearReexports)()); + +enum RequireType { + Import, + ExportAssign, + ExportStar +}; + +void tryBacktrackAddStarExportBinding (uint16_t* pos); +bool tryParseRequire (enum RequireType requireType); +void tryParseLiteralExports (); +bool readExportsOrModuleDotExports (uint16_t ch); +void tryParseModuleExportsDotAssign (); +void tryParseExportsDotAssign (bool assign); +void tryParseObjectDefineOrKeys (bool keys); +bool identifier (uint16_t ch); + +void throwIfImportStatement (); +void throwIfExportStatement (); + +void readImportString (const uint16_t* ss, uint16_t ch); +uint16_t readExportAs (uint16_t* startPos, uint16_t* endPos); + +uint16_t commentWhitespace (); +void stringLiteral (uint16_t quote); +void regularExpression (); +void templateString (); +void blockComment (); +void lineComment (); + +uint16_t readToWsOrPunctuator (uint16_t ch); + +uint32_t fullCharCode (uint16_t ch); +uint32_t fullCharCodeAtLast (uint16_t* pos); +bool isIdentifierStart (uint32_t code); +bool isIdentifierChar (uint32_t code); +int charCodeByteLen (uint32_t ch); + +bool isBr (uint16_t c); +bool isBrOrWs (uint16_t c); +bool isBrOrWsOrPunctuator (uint16_t c); +bool isBrOrWsOrPunctuatorNotDot (uint16_t c); + +bool str_eq2 (uint16_t* pos, uint16_t c1, uint16_t c2); +bool str_eq3 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3); +bool str_eq4 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4); +bool str_eq5 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5); +bool str_eq6 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6); +bool str_eq7 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7); +bool str_eq8 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8); +bool str_eq9 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9); +bool str_eq10 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10); +bool str_eq13 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13); +bool str_eq18 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13, uint16_t c14, uint16_t c15, uint16_t c16, uint16_t c17, uint16_t c18); +bool str_eq22 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13, uint16_t c14, uint16_t c15, uint16_t c16, uint16_t c17, uint16_t c18, uint16_t c19, uint16_t c20, uint16_t c21, uint16_t c22); + +bool readPrecedingKeyword2(uint16_t* pos, uint16_t c1, uint16_t c2); +bool readPrecedingKeyword3(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3); +bool readPrecedingKeyword4(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4); +bool readPrecedingKeyword5(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5); +bool readPrecedingKeyword6(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6); +bool readPrecedingKeyword7(uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7); + +bool keywordStart (uint16_t* pos); +bool isExpressionKeyword (uint16_t* pos); +bool isParenKeyword (uint16_t* pos); +bool isPunctuator (uint16_t charCode); +bool isExpressionPunctuator (uint16_t charCode); +bool isExpressionTerminator (uint16_t* pos); + +void nextChar (uint16_t ch); +void nextCharSurrogate (uint16_t ch); +uint16_t readChar (); + +void syntaxError (uint32_t code); diff --git a/deps/cjs-module-lexer/src/lexer.d.mts b/deps/cjs-module-lexer/src/lexer.d.mts new file mode 100644 index 00000000000000..98e01424641336 --- /dev/null +++ b/deps/cjs-module-lexer/src/lexer.d.mts @@ -0,0 +1 @@ +export * from './lexer.js' diff --git a/deps/cjs-module-lexer/src/lexer.d.ts b/deps/cjs-module-lexer/src/lexer.d.ts new file mode 100755 index 00000000000000..cda07d80af9d58 --- /dev/null +++ b/deps/cjs-module-lexer/src/lexer.d.ts @@ -0,0 +1,8 @@ +export interface Exports { + exports: string[]; + reexports: string[]; +} + +export declare function parse(source: string, name?: string): Exports; +export declare function init(): Promise<void>; +export declare function initSync(): void; diff --git a/deps/cjs-module-lexer/src/lexer.js b/deps/cjs-module-lexer/src/lexer.js new file mode 100755 index 00000000000000..1614fd9e62d88f --- /dev/null +++ b/deps/cjs-module-lexer/src/lexer.js @@ -0,0 +1,1607 @@ +let source, pos, end; +let openTokenDepth, + templateDepth, + lastTokenPos, + lastSlashWasDivision, + templateStack, + templateStackDepth, + openTokenPosStack, + openClassPosStack, + nextBraceIsClass, + starExportMap, + lastStarExportSpecifier, + _exports, + unsafeGetters, + reexports; + +function resetState () { + openTokenDepth = 0; + templateDepth = -1; + lastTokenPos = -1; + lastSlashWasDivision = false; + templateStack = new Array(1024); + templateStackDepth = 0; + openTokenPosStack = new Array(1024); + openClassPosStack = new Array(1024); + nextBraceIsClass = false; + starExportMap = Object.create(null); + lastStarExportSpecifier = null; + + _exports = new Set(); + unsafeGetters = new Set(); + reexports = new Set(); +} + +// RequireType +const Import = 0; +const ExportAssign = 1; +const ExportStar = 2; + +function parseCJS (source, name = '@') { + resetState(); + try { + parseSource(source); + } + catch (e) { + e.message += `\n at ${name}:${source.slice(0, pos).split('\n').length}:${pos - source.lastIndexOf('\n', pos - 1)}`; + e.loc = pos; + throw e; + } + const result = { exports: [..._exports].filter(expt => expt !== undefined && !unsafeGetters.has(expt)), reexports: [...reexports].filter(reexpt => reexpt !== undefined) }; + resetState(); + return result; +} + +function decode (str) { + if (str[0] === '"' || str[0] === '\'') { + try { + const decoded = scanStringLiteral(str); + // Filter to exclude non-matching UTF-16 surrogate strings + for (let i = 0; i < decoded.length; i++) { + const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; + if (surrogatePrefix < 0xD800) { + // Not a surrogate + continue; + } + else if (surrogatePrefix === 0xD800) { + // Validate surrogate pair + if ((decoded.charCodeAt(++i) & 0xFC00) !== 0xDC00) + return; + } + else { + // Out-of-range surrogate code (above 0xD800) + return; + } + } + return decoded; + } + catch {} + } + else { + return str; + } +} + +function parseSource (cjsSource) { + source = cjsSource; + pos = -1; + end = source.length - 1; + let ch = 0; + + // Handle #! + if (source.charCodeAt(0) === 35/*#*/ && source.charCodeAt(1) === 33/*!*/) { + if (source.length === 2) + return true; + pos += 2; + while (pos++ < end) { + ch = source.charCodeAt(pos); + if (ch === 10/*\n*/ || ch === 13/*\r*/) + break; + } + } + + while (pos++ < end) { + ch = source.charCodeAt(pos); + + if (ch === 32 || ch < 14 && ch > 8) + continue; + + if (openTokenDepth === 0) { + switch (ch) { + case 105/*i*/: + if (source.startsWith('mport', pos + 1) && keywordStart(pos)) + throwIfImportStatement(); + lastTokenPos = pos; + continue; + case 114/*r*/: + const startPos = pos; + if (tryParseRequire(Import) && keywordStart(startPos)) + tryBacktrackAddStarExportBinding(startPos - 1); + lastTokenPos = pos; + continue; + case 95/*_*/: + if (source.startsWith('interopRequireWildcard', pos + 1) && (keywordStart(pos) || source.charCodeAt(pos - 1) === 46/*.*/)) { + const startPos = pos; + pos += 23; + if (source.charCodeAt(pos) === 40/*(*/) { + pos++; + openTokenPosStack[openTokenDepth++] = lastTokenPos; + if (tryParseRequire(Import) && keywordStart(startPos)) { + tryBacktrackAddStarExportBinding(startPos - 1); + } + } + } + else if (source.startsWith('_export', pos + 1) && (keywordStart(pos) || source.charCodeAt(pos - 1) === 46/*.*/)) { + pos += 8; + if (source.startsWith('Star', pos)) + pos += 4; + if (source.charCodeAt(pos) === 40/*(*/) { + openTokenPosStack[openTokenDepth++] = lastTokenPos; + if (source.charCodeAt(pos + 1) === 114/*r*/) { + pos++; + tryParseRequire(ExportStar); + } + } + } + lastTokenPos = pos; + continue; + } + } + + switch (ch) { + case 101/*e*/: + if (source.startsWith('xport', pos + 1) && keywordStart(pos)) { + if (source.charCodeAt(pos + 6) === 115/*s*/) + tryParseExportsDotAssign(false); + else if (openTokenDepth === 0) + throwIfExportStatement(); + } + break; + case 99/*c*/: + if (keywordStart(pos) && source.startsWith('lass', pos + 1) && isBrOrWs(source.charCodeAt(pos + 5))) + nextBraceIsClass = true; + break; + case 109/*m*/: + if (source.startsWith('odule', pos + 1) && keywordStart(pos)) + tryParseModuleExportsDotAssign(); + break; + case 79/*O*/: + if (source.startsWith('bject', pos + 1) && keywordStart(pos)) + tryParseObjectDefineOrKeys(openTokenDepth === 0); + break; + case 40/*(*/: + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case 41/*)*/: + if (openTokenDepth === 0) + throw new Error('Unexpected closing bracket.'); + openTokenDepth--; + break; + case 123/*{*/: + openClassPosStack[openTokenDepth] = nextBraceIsClass; + nextBraceIsClass = false; + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case 125/*}*/: + if (openTokenDepth === 0) + throw new Error('Unexpected closing brace.'); + if (openTokenDepth-- === templateDepth) { + templateDepth = templateStack[--templateStackDepth]; + templateString(); + } + else { + if (templateDepth !== -1 && openTokenDepth < templateDepth) + throw new Error('Unexpected closing brace.'); + } + break; + case 60/*>*/: + // TODO: <!-- XML comment support + break; + case 39/*'*/: + case 34/*"*/: + stringLiteral(ch); + break; + case 47/*/*/: { + const next_ch = source.charCodeAt(pos + 1); + if (next_ch === 47/*/*/) { + lineComment(); + // dont update lastToken + continue; + } + else if (next_ch === 42/***/) { + blockComment(); + // dont update lastToken + continue; + } + else { + // Division / regex ambiguity handling based on checking backtrack analysis of: + // - what token came previously (lastToken) + // - if a closing brace or paren, what token came before the corresponding + // opening brace or paren (lastOpenTokenIndex) + const lastToken = source.charCodeAt(lastTokenPos); + if (isExpressionPunctuator(lastToken) && + !(lastToken === 46/*.*/ && (source.charCodeAt(lastTokenPos - 1) >= 48/*0*/ && source.charCodeAt(lastTokenPos - 1) <= 57/*9*/)) && + !(lastToken === 43/*+*/ && source.charCodeAt(lastTokenPos - 1) === 43/*+*/) && !(lastToken === 45/*-*/ && source.charCodeAt(lastTokenPos - 1) === 45/*-*/) || + lastToken === 41/*)*/ && isParenKeyword(openTokenPosStack[openTokenDepth]) || + lastToken === 125/*}*/ && (isExpressionTerminator(openTokenPosStack[openTokenDepth]) || openClassPosStack[openTokenDepth]) || + lastToken === 47/*/*/ && lastSlashWasDivision || + isExpressionKeyword(lastTokenPos) || + !lastToken) { + regularExpression(); + lastSlashWasDivision = false; + } + else { + lastSlashWasDivision = true; + } + } + break; + } + case 96/*`*/: + templateString(); + break; + } + lastTokenPos = pos; + } + + if (templateDepth !== -1) + throw new Error('Unterminated template.'); + + if (openTokenDepth) + throw new Error('Unterminated braces.'); +} + +function tryBacktrackAddStarExportBinding (bPos) { + while (source.charCodeAt(bPos) === 32/* */ && bPos >= 0) + bPos--; + if (source.charCodeAt(bPos) === 61/*=*/) { + bPos--; + while (source.charCodeAt(bPos) === 32/* */ && bPos >= 0) + bPos--; + let codePoint; + const id_end = bPos; + let identifierStart = false; + while ((codePoint = codePointAtLast(bPos)) && bPos >= 0) { + if (codePoint === 92/*\*/) + return; + if (!isIdentifierChar(codePoint, true)) + break; + identifierStart = isIdentifierStart(codePoint, true); + bPos -= codePointLen(codePoint); + } + if (identifierStart && source.charCodeAt(bPos) === 32/* */) { + const starExportId = source.slice(bPos + 1, id_end + 1); + while (source.charCodeAt(bPos) === 32/* */ && bPos >= 0) + bPos--; + switch (source.charCodeAt(bPos)) { + case 114/*r*/: + if (!source.startsWith('va', bPos - 2)) + return; + break; + case 116/*t*/: + if (!source.startsWith('le', bPos - 2) && !source.startsWith('cons', bPos - 4)) + return; + break; + default: return; + } + starExportMap[starExportId] = lastStarExportSpecifier; + } + } +} + +// `Object.` `prototype.`? hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)` +function tryParseObjectHasOwnProperty (it_id) { + let ch = commentWhitespace(); + if (ch !== 79/*O*/ || !source.startsWith('bject', pos + 1)) return false; + pos += 6; + ch = commentWhitespace(); + if (ch !== 46/*.*/) return false; + pos++; + ch = commentWhitespace(); + if (ch === 112/*p*/) { + if (!source.startsWith('rototype', pos + 1)) return false; + pos += 9; + ch = commentWhitespace(); + if (ch !== 46/*.*/) return false; + pos++; + ch = commentWhitespace(); + } + if (ch !== 104/*h*/ || !source.startsWith('asOwnProperty', pos + 1)) return false; + pos += 14; + ch = commentWhitespace(); + if (ch !== 46/*.*/) return false; + pos++; + ch = commentWhitespace(); + if (ch !== 99/*c*/ || !source.startsWith('all', pos + 1)) return false; + pos += 4; + ch = commentWhitespace(); + if (ch !== 40/*(*/) return false; + pos++; + ch = commentWhitespace(); + if (!identifier()) return false; + ch = commentWhitespace(); + if (ch !== 44/*,*/) return false; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) return false; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 41/*)*/) return false; + pos++; + return true; +} + +function tryParseObjectDefineOrKeys (keys) { + pos += 6; + let revertPos = pos - 1; + let ch = commentWhitespace(); + if (ch === 46/*.*/) { + pos++; + ch = commentWhitespace(); + if (ch === 100/*d*/ && source.startsWith('efineProperty', pos + 1)) { + let expt; + while (true) { + pos += 14; + revertPos = pos - 1; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch !== 44/*,*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 39/*'*/ && ch !== 34/*"*/) break; + const exportPos = pos; + stringLiteral(ch); + expt = source.slice(exportPos, ++pos); + ch = commentWhitespace(); + if (ch !== 44/*,*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 123/*{*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 101/*e*/) { + if (!source.startsWith('numerable', pos + 1)) break; + pos += 10; + ch = commentWhitespace(); + if (ch !== 58/*:*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 116/*t*/ || !source.startsWith('rue', pos + 1)) break; + pos += 4; + ch = commentWhitespace(); + if (ch !== 44) break; + pos++; + ch = commentWhitespace(); + } + if (ch === 118/*v*/) { + if (!source.startsWith('alue', pos + 1)) break; + pos += 5; + ch = commentWhitespace(); + if (ch !== 58/*:*/) break; + _exports.add(decode(expt)); + pos = revertPos; + return; + } + else if (ch === 103/*g*/) { + if (!source.startsWith('et', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (ch === 58/*:*/) { + pos++; + ch = commentWhitespace(); + if (ch !== 102/*f*/) break; + if (!source.startsWith('unction', pos + 1)) break; + pos += 8; + let lastPos = pos; + ch = commentWhitespace(); + if (ch !== 40 && (lastPos === pos || !identifier())) break; + ch = commentWhitespace(); + } + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 123/*{*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 114/*r*/) break; + if (!source.startsWith('eturn', pos + 1)) break; + pos += 6; + ch = commentWhitespace(); + if (!identifier()) break; + ch = commentWhitespace(); + if (ch === 46/*.*/) { + pos++; + commentWhitespace(); + if (!identifier()) break; + ch = commentWhitespace(); + } + else if (ch === 91/*[*/) { + pos++; + ch = commentWhitespace(); + if (ch === 39/*'*/ || ch === 34/*"*/) stringLiteral(ch); + else break; + pos++; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + } + if (ch === 59/*;*/) { + pos++; + ch = commentWhitespace(); + } + if (ch !== 125/*}*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 44/*,*/) { + pos++; + ch = commentWhitespace(); + } + if (ch !== 125/*}*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + _exports.add(decode(expt)); + return; + } + break; + } + if (expt) { + unsafeGetters.add(decode(expt)); + } + } + else if (keys && ch === 107/*k*/ && source.startsWith('eys', pos + 1)) { + while (true) { + pos += 4; + revertPos = pos - 1; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + const id_start = pos; + if (!identifier()) break; + const id = source.slice(id_start, pos); + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + + revertPos = pos++; + ch = commentWhitespace(); + if (ch !== 46/*.*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 102/*f*/ || !source.startsWith('orEach', pos + 1)) break; + pos += 7; + ch = commentWhitespace(); + revertPos = pos - 1; + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 102/*f*/ || !source.startsWith('unction', pos + 1)) break; + pos += 8; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + const it_id_start = pos; + if (!identifier()) break; + const it_id = source.slice(it_id_start, pos); + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 123/*{*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 105/*i*/ || source.charCodeAt(pos + 1) !== 102/*f*/) break; + pos += 2; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + // `if (` IDENTIFIER$2 `===` ( `'default'` | `"default"` ) `||` IDENTIFIER$2 `===` ( '__esModule' | `"__esModule"` ) `) return` `;`? | + if (ch === 61/*=*/) { + if (!source.startsWith('==', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (ch !== 34/*"*/ && ch !== 39/*'*/) break; + let quot = ch; + if (!source.startsWith('default', pos + 1)) break; + pos += 8; + ch = commentWhitespace(); + if (ch !== quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch !== 124/*|*/ || source.charCodeAt(pos + 1) !== 124/*|*/) break; + pos += 2; + ch = commentWhitespace(); + if (source.slice(pos, pos + it_id.length) !== it_id) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 61/*=*/ || source.slice(pos + 1, pos + 3) !== '==') break; + pos += 3; + ch = commentWhitespace(); + if (ch !== 34/*"*/ && ch !== 39/*'*/) break; + quot = ch; + if (!source.startsWith('__esModule', pos + 1)) break; + pos += 11; + ch = commentWhitespace(); + if (ch !== quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos += 1; + ch = commentWhitespace(); + if (ch !== 114/*r*/ || !source.startsWith('eturn', pos + 1)) break; + pos += 6; + ch = commentWhitespace(); + if (ch === 59/*;*/) + pos++; + ch = commentWhitespace(); + + // `if (` + if (ch === 105/*i*/ && source.charCodeAt(pos + 1) === 102/*f*/) { + let inIf = true; + pos += 2; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + const ifInnerPos = pos; + // `Object.prototype.hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)) return` `;`? + if (tryParseObjectHasOwnProperty(it_id)) { + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 114/*r*/ || !source.startsWith('eturn', pos + 1)) break; + pos += 6; + ch = commentWhitespace(); + if (ch === 59/*;*/) + pos++; + ch = commentWhitespace(); + // match next if + if (ch === 105/*i*/ && source.charCodeAt(pos + 1) === 102/*f*/) { + pos += 2; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + } + else { + inIf = false; + } + } + else { + pos = ifInnerPos; + } + + // IDENTIFIER$2 `in` EXPORTS_IDENTIFIER `&&` EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] ===` IDENTIFIER$1 `[` IDENTIFIER$2 `]) return` `;`? + if (inIf) { + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 105/*i*/ || !source.startsWith('n ', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch !== 38/*&*/ || source.charCodeAt(pos + 1) !== 38/*&*/) break; + pos += 2; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch !== 91/*[*/) break; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 61/*=*/ || !source.startsWith('==', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (!source.startsWith(id, pos)) break; + pos += id.length; + ch = commentWhitespace(); + if (ch !== 91/*[*/) break; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 114/*r*/ || !source.startsWith('eturn', pos + 1)) break; + pos += 6; + ch = commentWhitespace(); + if (ch === 59/*;*/) + pos++; + ch = commentWhitespace(); + } + } + } + // `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) (`&& !` IDENTIFIER `.hasOwnProperty(` IDENTIFIER$2 `)` )? `)` + else if (ch === 33/*!*/) { + if (!source.startsWith('==', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (ch !== 34/*"*/ && ch !== 39/*'*/) break; + const quot = ch; + if (!source.startsWith('default', pos + 1)) break; + pos += 8; + ch = commentWhitespace(); + if (ch !== quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch === 38/*&*/) { + if (source.charCodeAt(pos + 1) !== 38/*&*/) break; + pos += 2; + ch = commentWhitespace(); + if (ch !== 33/*!*/) break; + pos += 1; + ch = commentWhitespace(); + if (ch === 79/*O*/ && source.startsWith('bject', pos + 1) && source[pos + 6] === '.') { + if (!tryParseObjectHasOwnProperty(it_id)) break; + } + else if (identifier()) { + ch = commentWhitespace(); + if (ch !== 46/*.*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 104/*h*/ || !source.startsWith('asOwnProperty', pos + 1)) break; + pos += 14; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos += 1; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos += 1; + } + else break; + ch = commentWhitespace(); + } + if (ch !== 41/*)*/) break; + pos += 1; + ch = commentWhitespace(); + } + else break; + + // EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] =` IDENTIFIER$1 `[` IDENTIFIER$2 `]` + if (readExportsOrModuleDotExports(ch)) { + ch = commentWhitespace(); + if (ch !== 91/*[*/) break; + pos++; + ch = commentWhitespace(); + if (source.slice(pos, pos + it_id.length) !== it_id) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 61/*=*/) break; + pos++; + ch = commentWhitespace(); + if (source.slice(pos, pos + id.length) !== id) break; + pos += id.length; + ch = commentWhitespace(); + if (ch !== 91/*[*/) break; + pos++; + ch = commentWhitespace(); + if (source.slice(pos, pos + it_id.length) !== it_id) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 59/*;*/) { + pos++; + ch = commentWhitespace(); + } + } + // `Object.defineProperty(` EXPORTS_IDENTIFIER `, ` IDENTIFIER$2 `, { enumerable: true, get: function () { return ` IDENTIFIER$1 `[` IDENTIFIER$2 `]; } })` + else if (ch === 79/*O*/) { + if (source.slice(pos + 1, pos + 6) !== 'bject') break; + pos += 6; + ch = commentWhitespace(); + if (ch !== 46/*.*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 100/*d*/ || !source.startsWith('efineProperty', pos + 1)) break; + pos += 14; + ch = commentWhitespace(); + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch !== 44/*,*/) break; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 44/*,*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 123/*{*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 101/*e*/ || !source.startsWith('numerable', pos + 1)) break; + pos += 10; + ch = commentWhitespace(); + if (ch !== 58/*:*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 116/*t*/ && !source.startsWith('rue', pos + 1)) break; + pos += 4; + ch = commentWhitespace(); + if (ch !== 44/*,*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 103/*g*/ || !source.startsWith('et', pos + 1)) break; + pos += 3; + ch = commentWhitespace(); + if (ch === 58/*:*/) { + pos++; + ch = commentWhitespace(); + if (ch !== 102/*f*/) break; + if (!source.startsWith('unction', pos + 1)) break; + pos += 8; + let lastPos = pos; + ch = commentWhitespace(); + if (ch !== 40 && (lastPos === pos || !identifier())) break; + ch = commentWhitespace(); + } + if (ch !== 40/*(*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 123/*{*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 114/*r*/ || !source.startsWith('eturn', pos + 1)) break; + pos += 6; + ch = commentWhitespace(); + if (!source.startsWith(id, pos)) break; + pos += id.length; + ch = commentWhitespace(); + if (ch !== 91/*[*/) break; + pos++; + ch = commentWhitespace(); + if (!source.startsWith(it_id, pos)) break; + pos += it_id.length; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 59/*;*/) { + pos++; + ch = commentWhitespace(); + } + if (ch !== 125/*}*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 44/*,*/) { + pos++; + ch = commentWhitespace(); + } + if (ch !== 125/*}*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + pos++; + ch = commentWhitespace(); + if (ch === 59/*;*/) { + pos++; + ch = commentWhitespace(); + } + } + else break; + + if (ch !== 125/*}*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 41/*)*/) break; + + const starExportSpecifier = starExportMap[id]; + if (starExportSpecifier) { + reexports.add(decode(starExportSpecifier)); + pos = revertPos; + return; + } + return; + } + } + } + pos = revertPos; +} + +function readExportsOrModuleDotExports (ch) { + const revertPos = pos; + if (ch === 109/*m*/ && source.startsWith('odule', pos + 1)) { + pos += 6; + ch = commentWhitespace(); + if (ch !== 46/*.*/) { + pos = revertPos; + return false; + } + pos++; + ch = commentWhitespace(); + } + if (ch === 101/*e*/ && source.startsWith('xports', pos + 1)) { + pos += 7; + return true; + } + else { + pos = revertPos; + return false; + } +} + +function tryParseModuleExportsDotAssign () { + pos += 6; + const revertPos = pos - 1; + let ch = commentWhitespace(); + if (ch === 46/*.*/) { + pos++; + ch = commentWhitespace(); + if (ch === 101/*e*/ && source.startsWith('xports', pos + 1)) { + tryParseExportsDotAssign(true); + return; + } + } + pos = revertPos; +} + +function tryParseExportsDotAssign (assign) { + pos += 7; + const revertPos = pos - 1; + let ch = commentWhitespace(); + switch (ch) { + // exports.asdf + case 46/*.*/: { + pos++; + ch = commentWhitespace(); + const startPos = pos; + if (identifier()) { + const endPos = pos; + ch = commentWhitespace(); + if (ch === 61/*=*/) { + _exports.add(decode(source.slice(startPos, endPos))); + return; + } + } + break; + } + // exports['asdf'] + case 91/*[*/: { + pos++; + ch = commentWhitespace(); + if (ch === 39/*'*/ || ch === 34/*"*/) { + const startPos = pos; + stringLiteral(ch); + const endPos = ++pos; + ch = commentWhitespace(); + if (ch !== 93/*]*/) break; + pos++; + ch = commentWhitespace(); + if (ch !== 61/*=*/) break; + _exports.add(decode(source.slice(startPos, endPos))); + } + break; + } + // module.exports = + case 61/*=*/: { + if (assign) { + if (reexports.size) + reexports = new Set(); + pos++; + ch = commentWhitespace(); + // { ... } + if (ch === 123/*{*/) { + tryParseLiteralExports(); + return; + } + + // require('...') + if (ch === 114/*r*/) + tryParseRequire(ExportAssign); + } + } + } + pos = revertPos; +} + +function tryParseRequire (requireType) { + // require('...') + const revertPos = pos; + if (source.startsWith('equire', pos + 1)) { + pos += 7; + let ch = commentWhitespace(); + if (ch === 40/*(*/) { + pos++; + ch = commentWhitespace(); + const reexportStart = pos; + if (ch === 39/*'*/ || ch === 34/*"*/) { + stringLiteral(ch); + const reexportEnd = ++pos; + ch = commentWhitespace(); + if (ch === 41/*)*/) { + switch (requireType) { + case ExportAssign: + reexports.add(decode(source.slice(reexportStart, reexportEnd))); + return true; + case ExportStar: + reexports.add(decode(source.slice(reexportStart, reexportEnd))); + return true; + default: + lastStarExportSpecifier = decode(source.slice(reexportStart, reexportEnd)); + return true; + } + } + } + } + pos = revertPos; + } + return false; +} + +function tryParseLiteralExports () { + const revertPos = pos - 1; + while (pos++ < end) { + let ch = commentWhitespace(); + const startPos = pos; + if (identifier()) { + const endPos = pos; + ch = commentWhitespace(); + if (ch === 58/*:*/) { + pos++; + ch = commentWhitespace(); + // nothing more complex than identifier expressions for now + if (!identifier()) { + pos = revertPos; + return; + } + ch = source.charCodeAt(pos); + } + _exports.add(decode(source.slice(startPos, endPos))); + } + else if (ch === 46/*.*/ && source.startsWith('..', pos + 1)) { + pos += 3; + if (source.charCodeAt(pos) === 114/*r*/ && tryParseRequire(ExportAssign)) { + pos++; + } + else if (!identifier()) { + pos = revertPos; + return; + } + ch = commentWhitespace(); + } + else if (ch === 39/*'*/ || ch === 34/*"*/) { + const startPos = pos; + stringLiteral(ch); + const endPos = ++pos; + ch = commentWhitespace(); + if (ch === 58/*:*/) { + pos++; + ch = commentWhitespace(); + // nothing more complex than identifier expressions for now + if (!identifier()) { + pos = revertPos; + return; + } + ch = source.charCodeAt(pos); + _exports.add(decode(source.slice(startPos, endPos))); + } + } + else { + pos = revertPos; + return; + } + + if (ch === 125/*}*/) + return; + + if (ch !== 44/*,*/) { + pos = revertPos; + return; + } + } +} + +// This function and it's callees are duplicated in src/lexer.js +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + +// --- Extracted from AcornJS --- +//(https://github.com/acornjs/acorn/blob/master/acorn/src/identifier.js#L23 +// +// MIT License + +// Copyright (C) 2012-2018 by various contributors (see AUTHORS) + +// 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. + +// ## Character categories + +// Big ugly regular expressions that match characters in the +// whitespace, identifier, and identifier-start categories. These +// are only applied when a character is found to actually have a +// code point above 128. +// Generated by `bin/generate-identifier-regex.js`. +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc" +let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f" + +const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]") +const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]") + +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null + +// These are a run-length and offset encoded representation of the +// >0xffff code points that are a valid part of identifiers. The +// offset starts at 0x10000, and each pair of numbers represents an +// offset to the next range, and then a size of the range. They were +// generated by bin/generate-identifier-regex.js + +// eslint-disable-next-line comma-spacing +const astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938] + +// eslint-disable-next-line comma-spacing +const astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239] + +// This has a complexity linear to the value of the code. The +// assumption is that looking up astral identifier characters is +// rare. +function isInAstralSet(code, set) { + let pos = 0x10000 + for (let i = 0; i < set.length; i += 2) { + pos += set[i] + if (pos > code) return false + pos += set[i + 1] + if (pos >= code) return true + } +} + +// Test whether a given character code starts an identifier. + +function isIdentifierStart(code, astral) { + if (code < 65) return code === 36 + if (code < 91) return true + if (code < 97) return code === 95 + if (code < 123) return true + if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) + if (astral === false) return false + return isInAstralSet(code, astralIdentifierStartCodes) +} + +// Test whether a given character is part of an identifier. + +function isIdentifierChar(code, astral) { + if (code < 48) return code === 36 + if (code < 58) return true + if (code < 65) return false + if (code < 91) return true + if (code < 97) return code === 95 + if (code < 123) return true + if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) + if (astral === false) return false + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) +} + +function identifier () { + let ch = source.codePointAt(pos); + if (!isIdentifierStart(ch, true) || ch === '\\') + return false; + pos += codePointLen(ch); + while (ch = source.codePointAt(pos)) { + if (isIdentifierChar(ch, true)) { + pos += codePointLen(ch); + } + else if (ch === '\\') { + // no identifier escapes support for now + return false; + } + else { + break; + } + } + return true; +} + +function codePointLen (ch) { + if (ch < 0x10000) return 1; + return 2; +} + +function codePointAtLast (bPos) { + // Gives the UTF char for backtracking surrogates + const ch = source.charCodeAt(bPos); + if ((ch & 0xFC00) === 0xDC00) + return (((source.charCodeAt(bPos - 1) & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; + return ch; +} + +function esmSyntaxErr (msg) { + return Object.assign(new Error(msg), { code: 'ERR_LEXER_ESM_SYNTAX' }); +} + +function throwIfImportStatement () { + const startPos = pos; + pos += 6; + const ch = commentWhitespace(); + switch (ch) { + // dynamic import + case 40/*(*/: + openTokenPosStack[openTokenDepth++] = startPos; + return; + // import.meta + case 46/*.*/: + throw esmSyntaxErr('Unexpected import.meta in CJS module.'); + + default: + // no space after "import" -> not an import keyword + if (pos === startPos + 6) + break; + case 34/*"*/: + case 39/*'*/: + case 123/*{*/: + case 42/***/: + // import statement only permitted at base-level + if (openTokenDepth !== 0) { + pos--; + return; + } + // import statements are a syntax error in CommonJS + throw esmSyntaxErr('Unexpected import statement in CJS module.'); + } +} + +function throwIfExportStatement () { + pos += 6; + const curPos = pos; + const ch = commentWhitespace(); + if (pos === curPos && !isPunctuator(ch)) + return; + throw esmSyntaxErr('Unexpected export statement in CJS module.'); +} + +function commentWhitespace () { + let ch; + do { + ch = source.charCodeAt(pos); + if (ch === 47/*/*/) { + const next_ch = source.charCodeAt(pos + 1); + if (next_ch === 47/*/*/) + lineComment(); + else if (next_ch === 42/***/) + blockComment(); + else + return ch; + } + else if (!isBrOrWs(ch)) { + return ch; + } + } while (pos++ < end); + return ch; +} + +function templateString () { + while (pos++ < end) { + const ch = source.charCodeAt(pos); + if (ch === 36/*$*/ && source.charCodeAt(pos + 1) === 123/*{*/) { + pos++; + templateStack[templateStackDepth++] = templateDepth; + templateDepth = ++openTokenDepth; + return; + } + if (ch === 96/*`*/) + return; + if (ch === 92/*\*/) + pos++; + } + syntaxError(); +} + +function blockComment () { + pos++; + while (pos++ < end) { + const ch = source.charCodeAt(pos); + if (ch === 42/***/ && source.charCodeAt(pos + 1) === 47/*/*/) { + pos++; + return; + } + } +} + +function lineComment () { + while (pos++ < end) { + const ch = source.charCodeAt(pos); + if (ch === 10/*\n*/ || ch === 13/*\r*/) + return; + } +} + +function stringLiteral (quote) { + while (pos++ < end) { + let ch = source.charCodeAt(pos); + if (ch === quote) + return; + if (ch === 92/*\*/) { + ch = source.charCodeAt(++pos); + if (ch === 13/*\r*/ && source.charCodeAt(pos + 1) === 10/*\n*/) + pos++; + } + else if (isBr(ch)) + break; + } + throw new Error('Unterminated string.'); +} + +function regexCharacterClass () { + while (pos++ < end) { + let ch = source.charCodeAt(pos); + if (ch === 93/*]*/) + return ch; + if (ch === 92/*\*/) + pos++; + else if (ch === 10/*\n*/ || ch === 13/*\r*/) + break; + } + throw new Error('Syntax error reading regular expression class.'); +} + +function regularExpression () { + while (pos++ < end) { + let ch = source.charCodeAt(pos); + if (ch === 47/*/*/) + return; + if (ch === 91/*[*/) + ch = regexCharacterClass(); + else if (ch === 92/*\*/) + pos++; + else if (ch === 10/*\n*/ || ch === 13/*\r*/) + break; + } + throw new Error('Syntax error reading regular expression.'); +} + +// Note: non-asii BR and whitespace checks omitted for perf / footprint +// if there is a significant user need this can be reconsidered +function isBr (c) { + return c === 13/*\r*/ || c === 10/*\n*/; +} + +function isBrOrWs (c) { + return c > 8 && c < 14 || c === 32 || c === 160; +} + +function isBrOrWsOrPunctuatorNotDot (c) { + return c > 8 && c < 14 || c === 32 || c === 160 || isPunctuator(c) && c !== 46/*.*/; +} + +function keywordStart (pos) { + return pos === 0 || isBrOrWsOrPunctuatorNotDot(source.charCodeAt(pos - 1)); +} + +function readPrecedingKeyword (pos, match) { + if (pos < match.length - 1) + return false; + return source.startsWith(match, pos - match.length + 1) && (pos === 0 || isBrOrWsOrPunctuatorNotDot(source.charCodeAt(pos - match.length))); +} + +function readPrecedingKeyword1 (pos, ch) { + return source.charCodeAt(pos) === ch && (pos === 0 || isBrOrWsOrPunctuatorNotDot(source.charCodeAt(pos - 1))); +} + +// Detects one of case, debugger, delete, do, else, in, instanceof, new, +// return, throw, typeof, void, yield, await +function isExpressionKeyword (pos) { + switch (source.charCodeAt(pos)) { + case 100/*d*/: + switch (source.charCodeAt(pos - 1)) { + case 105/*i*/: + // void + return readPrecedingKeyword(pos - 2, 'vo'); + case 108/*l*/: + // yield + return readPrecedingKeyword(pos - 2, 'yie'); + default: + return false; + } + case 101/*e*/: + switch (source.charCodeAt(pos - 1)) { + case 115/*s*/: + switch (source.charCodeAt(pos - 2)) { + case 108/*l*/: + // else + return readPrecedingKeyword1(pos - 3, 101/*e*/); + case 97/*a*/: + // case + return readPrecedingKeyword1(pos - 3, 99/*c*/); + default: + return false; + } + case 116/*t*/: + // delete + return readPrecedingKeyword(pos - 2, 'dele'); + default: + return false; + } + case 102/*f*/: + if (source.charCodeAt(pos - 1) !== 111/*o*/ || source.charCodeAt(pos - 2) !== 101/*e*/) + return false; + switch (source.charCodeAt(pos - 3)) { + case 99/*c*/: + // instanceof + return readPrecedingKeyword(pos - 4, 'instan'); + case 112/*p*/: + // typeof + return readPrecedingKeyword(pos - 4, 'ty'); + default: + return false; + } + case 110/*n*/: + // in, return + return readPrecedingKeyword1(pos - 1, 105/*i*/) || readPrecedingKeyword(pos - 1, 'retur'); + case 111/*o*/: + // do + return readPrecedingKeyword1(pos - 1, 100/*d*/); + case 114/*r*/: + // debugger + return readPrecedingKeyword(pos - 1, 'debugge'); + case 116/*t*/: + // await + return readPrecedingKeyword(pos - 1, 'awai'); + case 119/*w*/: + switch (source.charCodeAt(pos - 1)) { + case 101/*e*/: + // new + return readPrecedingKeyword1(pos - 2, 110/*n*/); + case 111/*o*/: + // throw + return readPrecedingKeyword(pos - 2, 'thr'); + default: + return false; + } + } + return false; +} + +function isParenKeyword (curPos) { + return source.charCodeAt(curPos) === 101/*e*/ && source.startsWith('whil', curPos - 4) || + source.charCodeAt(curPos) === 114/*r*/ && source.startsWith('fo', curPos - 2) || + source.charCodeAt(curPos - 1) === 105/*i*/ && source.charCodeAt(curPos) === 102/*f*/; +} + +function isPunctuator (ch) { + // 23 possible punctuator endings: !%&()*+,-./:;<=>?[]^{}|~ + return ch === 33/*!*/ || ch === 37/*%*/ || ch === 38/*&*/ || + ch > 39 && ch < 48 || ch > 57 && ch < 64 || + ch === 91/*[*/ || ch === 93/*]*/ || ch === 94/*^*/ || + ch > 122 && ch < 127; +} + +function isExpressionPunctuator (ch) { + // 20 possible expression endings: !%&(*+,-.:;<=>?[^{|~ + return ch === 33/*!*/ || ch === 37/*%*/ || ch === 38/*&*/ || + ch > 39 && ch < 47 && ch !== 41 || ch > 57 && ch < 64 || + ch === 91/*[*/ || ch === 94/*^*/ || ch > 122 && ch < 127 && ch !== 125/*}*/; +} + +function isExpressionTerminator (curPos) { + // detects: + // => ; ) finally catch else + // as all of these followed by a { will indicate a statement brace + switch (source.charCodeAt(curPos)) { + case 62/*>*/: + return source.charCodeAt(curPos - 1) === 61/*=*/; + case 59/*;*/: + case 41/*)*/: + return true; + case 104/*h*/: + return source.startsWith('catc', curPos - 4); + case 121/*y*/: + return source.startsWith('finall', curPos - 6); + case 101/*e*/: + return source.startsWith('els', curPos - 3); + } + return false; +} + +const initPromise = Promise.resolve(); + +module.exports.init = () => initPromise; +module.exports.initSync = () => {}; +module.exports.parse = parseCJS; diff --git a/deps/cjs-module-lexer/src/lib/lexer.wasm b/deps/cjs-module-lexer/src/lib/lexer.wasm new file mode 100755 index 00000000000000..d58cc87e730790 Binary files /dev/null and b/deps/cjs-module-lexer/src/lib/lexer.wasm differ diff --git a/deps/cjs-module-lexer/src/package-lock.json b/deps/cjs-module-lexer/src/package-lock.json new file mode 100644 index 00000000000000..61fd2b65fdfc51 --- /dev/null +++ b/deps/cjs-module-lexer/src/package-lock.json @@ -0,0 +1,1901 @@ +{ + "name": "cjs-module-lexer", + "version": "2.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cjs-module-lexer", + "version": "2.2.0", + "license": "MIT", + "devDependencies": { + "@babel/cli": "^7.5.5", + "@babel/core": "^7.5.5", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "cross-env": "^7.0.3", + "kleur": "^2.0.2", + "mocha": "^9.1.3", + "terser": "^4.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.5.tgz", + "integrity": "sha512-N5d7MjzwsQ2wppwjhrsicVDhJSqF9labEP/swYiHhio4Ca2XjEehpgPmerjnLQl7BPE59BLud0PTWGYwqFl/cQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001498", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001498.tgz", + "integrity": "sha512-LFInN2zAwx3ANrGCDZ5AKKJroHqNKyjXitdV5zRIVIaQlXKj3GmxUKagoKsjqUfckpAObPCEWnk5EeMlyMWcgw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz", + "integrity": "sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "deprecated": "Please upgrade to kleur@3 or migrate to 'ansi-colors' if you prefer the old syntax. Visit <https://github.com/lukeed/kleur/releases/tag/v3.0.0\\> for migration path(s).", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/deps/cjs-module-lexer/src/package.json b/deps/cjs-module-lexer/src/package.json new file mode 100755 index 00000000000000..0e1bbf829f8acd --- /dev/null +++ b/deps/cjs-module-lexer/src/package.json @@ -0,0 +1,48 @@ +{ + "name": "cjs-module-lexer", + "version": "2.2.0", + "description": "Lexes CommonJS modules, returning their named exports metadata", + "main": "lexer.js", + "exports": { + "import": { + "types": "./lexer.d.mts", + "default": "./dist/lexer.mjs" + }, + "default": "./lexer.js" + }, + "types": "lexer.d.ts", + "scripts": { + "test-js": "cross-env NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test-wasm": "cross-env WASM=1 NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test-wasm-sync": "cross-env WASM_SYNC=1 NODE_OPTIONS=--disallow-code-generation-from-strings mocha -b -u tdd test/*.js", + "test": "npm run test-wasm && npm run test-wasm-sync && npm run test-js", + "bench": "node --expose-gc bench/index.mjs", + "build": "node build.js ; babel dist/lexer.mjs -o dist/lexer.js ; terser dist/lexer.js -o dist/lexer.js", + "build-wasm": "make lib/lexer.wasm ; node build.js", + "prepublishOnly": "make && npm run build", + "footprint": "npm run build && cat dist/lexer.js | gzip -9f | wc -c" + }, + "author": "Guy Bedford", + "license": "MIT", + "devDependencies": { + "@babel/cli": "^7.5.5", + "@babel/core": "^7.5.5", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "cross-env": "^7.0.3", + "kleur": "^2.0.2", + "mocha": "^9.1.3", + "terser": "^4.1.4" + }, + "files": [ + "dist", + "lexer.d.ts" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/nodejs/cjs-module-lexer.git" + }, + "bugs": { + "url": "https://github.com/nodejs/cjs-module-lexer/issues" + }, + "homepage": "https://github.com/nodejs/cjs-module-lexer#readme" +} diff --git a/deps/cjs-module-lexer/src/src/lexer.c b/deps/cjs-module-lexer/src/src/lexer.c new file mode 100755 index 00000000000000..fd7ba8b4e7e7ea --- /dev/null +++ b/deps/cjs-module-lexer/src/src/lexer.c @@ -0,0 +1,1518 @@ +#include "cjs-module-lexer.h" + +const uint16_t* STANDARD_IMPORT = (uint16_t*)0x1; +const uint16_t* IMPORT_META = (uint16_t*)0x2; +const uint16_t __empty_char = '\0'; +const uint16_t* EMPTY_CHAR = &__empty_char; +// tracked depth of template and brackets +#define STACK_DEPTH 2048 +// tracked number of star exports +#define MAX_STAR_EXPORTS 256 +const uint16_t* source; + +bool lastSlashWasDivision; +uint16_t templateStackDepth; +uint16_t openTokenDepth; +uint16_t templateDepth; +uint16_t braceDepth; +uint16_t* lastTokenPos; +uint16_t* pos; +uint16_t* end; +uint16_t* templateStack; +uint16_t** openTokenPosStack; +StarExportBinding* starExportStack; +bool nextBraceIsClass; + +uint16_t* lastReexportStart; +uint16_t* lastReexportEnd; + +// Memory Structure: +// -> source +// -> analysis starts after source +uint32_t parse_error; +uint32_t error = 0; +uint32_t sourceLen; + +uint16_t templateStack_[STACK_DEPTH]; +uint16_t* openTokenPosStack_[STACK_DEPTH]; +bool openClassPosStack[STACK_DEPTH]; +StarExportBinding starExportStack_[MAX_STAR_EXPORTS]; +const StarExportBinding* STAR_EXPORT_STACK_END = &starExportStack_[MAX_STAR_EXPORTS - 1]; + +void (*addExport)(const uint16_t*, const uint16_t*); +void (*addReexport)(const uint16_t*, const uint16_t*); +void (*addUnsafeGetter)(const uint16_t*, const uint16_t*); +void (*clearReexports)(); + +// Note: parsing is based on the _assumption_ that the source is already valid +uint32_t parseCJS (uint16_t* _source, uint32_t _sourceLen, void (*_addExport)(const uint16_t*, const uint16_t*), void (*_addReexport)(const uint16_t*, const uint16_t*), void (*_addUnsafeGetter)(const uint16_t*, const uint16_t*), void (*_clearReexports)()) { + source = _source; + sourceLen = _sourceLen; + if (_addExport) + addExport = _addExport; + if (_addReexport) + addReexport = _addReexport; + if (_addUnsafeGetter) + addUnsafeGetter = _addUnsafeGetter; + + templateStackDepth = 0; + openTokenDepth = 0; + templateDepth = UINT16_MAX; + lastTokenPos = (uint16_t*)EMPTY_CHAR; + lastSlashWasDivision = false; + parse_error = 0; + error = 0; + templateStack = &templateStack_[0]; + openTokenPosStack = &openTokenPosStack_[0]; + starExportStack = &starExportStack_[0]; + nextBraceIsClass = false; + + pos = (uint16_t*)(source - 1); + uint16_t ch = '\0'; + end = pos + sourceLen; + + // Handle #! + if (*source == '#' && *(source + 1) == '!') { + if (sourceLen == 2) + return 0; + pos += 2; + while (pos++ < end) { + ch = *pos; + if (ch == '\n' || ch == '\r') + break; + } + } + + while (pos++ < end) { + ch = *pos; + + if (ch == 32 || ch < 14 && ch > 8) + continue; + + if (openTokenDepth == 0) { + switch (ch) { + case 'i': + if (str_eq5(pos + 1, 'm', 'p', 'o', 'r', 't') && keywordStart(pos)) + throwIfImportStatement(); + lastTokenPos = pos; + continue; + case 'r': { + uint16_t* startPos = pos; + if (tryParseRequire(Import) && keywordStart(startPos)) + tryBacktrackAddStarExportBinding(startPos - 1); + lastTokenPos = pos; + continue; + } + case '_': + if (str_eq22(pos + 1, 'i', 'n', 't', 'e', 'r', 'o', 'p', 'R', 'e', 'q', 'u', 'i', 'r', 'e', 'W', 'i', 'l', 'd', 'c', 'a', 'r', 'd') && (keywordStart(pos) || *(pos - 1) == '.')) { + uint16_t* startPos = pos; + pos += 23; + if (*pos == '(') { + pos++; + openTokenPosStack[openTokenDepth++] = lastTokenPos; + if (tryParseRequire(Import) && keywordStart(startPos)) + tryBacktrackAddStarExportBinding(startPos - 1); + } + } + else if (str_eq7(pos + 1, '_', 'e', 'x', 'p', 'o', 'r', 't') && (keywordStart(pos) || *(pos - 1) == '.')) { + pos += 8; + if (str_eq4(pos, 'S', 't', 'a', 'r')) + pos += 4; + if (*pos == '(') { + openTokenPosStack[openTokenDepth++] = lastTokenPos; + if (*(pos + 1) == 'r') { + pos++; + tryParseRequire(ExportStar); + } + } + } + lastTokenPos = pos; + continue; + } + } + + switch (ch) { + case 'e': + if (str_eq5(pos + 1, 'x', 'p', 'o', 'r', 't') && keywordStart(pos)) { + if (*(pos + 6) == 's') + tryParseExportsDotAssign(false); + else if (openTokenDepth == 0) + throwIfExportStatement(); + } + break; + case 'c': + if (keywordStart(pos) && str_eq4(pos + 1, 'l', 'a', 's', 's') && isBrOrWs(*(pos + 5))) + nextBraceIsClass = true; + break; + case 'm': + if (str_eq5(pos + 1, 'o', 'd', 'u', 'l', 'e') && keywordStart(pos)) + tryParseModuleExportsDotAssign(); + break; + case 'O': + if (str_eq5(pos + 1, 'b', 'j', 'e', 'c', 't') && keywordStart(pos)) + tryParseObjectDefineOrKeys(openTokenDepth == 0); + break; + case '(': + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case ')': + if (openTokenDepth == 0) + return syntaxError(8), error; + openTokenDepth--; + break; + case '{': + openClassPosStack[openTokenDepth] = nextBraceIsClass; + nextBraceIsClass = false; + openTokenPosStack[openTokenDepth++] = lastTokenPos; + break; + case '}': + if (openTokenDepth == 0) + return syntaxError(2), false; + if (openTokenDepth-- == templateDepth) { + templateDepth = templateStack[--templateStackDepth]; + templateString(); + } + else { + if (templateDepth != UINT16_MAX && openTokenDepth < templateDepth) + return syntaxError(3), error; + } + break; + case '<': + // TODO: <!-- XML comment support + break; + case '\'': + case '"': + stringLiteral(ch); + break; + case '/': { + uint16_t next_ch = *(pos + 1); + if (next_ch == '/') { + lineComment(); + // dont update lastToken + continue; + } + else if (next_ch == '*') { + blockComment(); + // dont update lastToken + continue; + } + else { + // Division / regex ambiguity handling based on checking backtrack analysis of: + // - what token came previously (lastToken) + // - if a closing brace or paren, what token came before the corresponding + // opening brace or paren (lastOpenTokenIndex) + uint16_t lastToken = *lastTokenPos; + if (isExpressionPunctuator(lastToken) && + !(lastToken == '.' && (*(lastTokenPos - 1) >= '0' && *(lastTokenPos - 1) <= '9')) && + !(lastToken == '+' && *(lastTokenPos - 1) == '+') && !(lastToken == '-' && *(lastTokenPos - 1) == '-') || + lastToken == ')' && isParenKeyword(openTokenPosStack[openTokenDepth]) || + lastToken == '}' && (isExpressionTerminator(openTokenPosStack[openTokenDepth]) || openClassPosStack[openTokenDepth]) || + lastToken == '/' && lastSlashWasDivision || + isExpressionKeyword(lastTokenPos) || + !lastToken) { + regularExpression(); + lastSlashWasDivision = false; + } + else { + lastSlashWasDivision = true; + } + } + break; + } + case '`': + if (templateDepth == UINT16_MAX - 1) + return syntaxError(4), error; + templateString(); + break; + } + lastTokenPos = pos; + } + + if (templateDepth != UINT16_MAX || openTokenDepth || error) + return error; + + // success + return 0; +} + +void tryBacktrackAddStarExportBinding (uint16_t* bPos) { + while (*bPos == ' ' && bPos > source) + bPos--; + if (*bPos == '=') { + bPos--; + while (*bPos == ' ' && bPos > source) + bPos--; + uint32_t charCode; + uint16_t* id_end = bPos; + bool identifierStart = false; + while ((charCode = fullCharCodeAtLast(bPos)) && bPos > source) { + if (charCode == '\\') + return; + if (!isIdentifierChar(charCode)) + break; + identifierStart = isIdentifierStart(charCode); + bPos -= charCodeByteLen(charCode); + } + if (identifierStart && *bPos == ' ') { + // gracefully overflow if there are too many star export bindings to track + if (starExportStack == STAR_EXPORT_STACK_END) + return; + starExportStack->id_start = bPos + 1; + starExportStack->id_end = id_end + 1; + while (*bPos == ' ' && bPos > source) + bPos--; + switch (*bPos) { + case 'r': + if (!readPrecedingKeyword2(bPos - 1, 'v', 'a')) + return; + break; + case 't': + if (!readPrecedingKeyword2(bPos - 1, 'l', 'e') && !readPrecedingKeyword4(bPos - 1, 'c', 'o', 'n', 's')) + return; + break; + default: return; + } + starExportStack++; + } + } +} + +bool tryParseObjectHasOwnProperty (uint16_t* it_id_start, ptrdiff_t it_id_len) { + uint16_t ch = commentWhitespace(); + if (ch != 'O' || !str_eq5(pos + 1, 'b', 'j', 'e', 'c', 't')) return false; + pos += 6; + ch = commentWhitespace(); + if (ch != '.') return false; + pos++; + ch = commentWhitespace(); + if (ch == 'p') { + if (!str_eq8(pos + 1, 'r', 'o', 't', 'o', 't', 'y', 'p', 'e')) return false; + pos += 9; + ch = commentWhitespace(); + if (ch != '.') return false; + pos++; + ch = commentWhitespace(); + } + if (ch != 'h' || !str_eq13(pos + 1, 'a', 's', 'O', 'w', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y')) return false; + pos += 14; + ch = commentWhitespace(); + if (ch != '.') return false; + pos++; + ch = commentWhitespace(); + if (ch != 'c' || !str_eq3(pos + 1, 'a', 'l', 'l')) return false; + pos += 4; + ch = commentWhitespace(); + if (ch != '(') return false; + pos++; + ch = commentWhitespace(); + if (!identifier(ch)) return false; + ch = commentWhitespace(); + if (ch != ',') return false; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) return false; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ')') return false; + pos++; + return true; +} + +void tryParseObjectDefineOrKeys (bool keys) { + pos += 6; + uint16_t* revertPos = pos - 1; + uint16_t ch = commentWhitespace(); + if (ch == '.') { + pos++; + ch = commentWhitespace(); + if (ch == 'd' && str_eq13(pos + 1, 'e', 'f', 'i', 'n', 'e', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y')) { + uint16_t* exportStart = 0; + uint16_t* exportEnd = 0; + while (true) { + pos += 14; + revertPos = pos - 1; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch != ',') break; + pos++; + ch = commentWhitespace(); + if (ch != '\'' && ch != '"') break; + exportStart = pos; + stringLiteral(ch); + exportEnd = ++pos; + ch = commentWhitespace(); + if (ch != ',') break; + pos++; + ch = commentWhitespace(); + if (ch != '{') break; + pos++; + ch = commentWhitespace(); + if (ch == 'e') { + if (!str_eq9(pos + 1, 'n', 'u', 'm', 'e', 'r', 'a', 'b', 'l', 'e')) break; + pos += 10; + ch = commentWhitespace(); + if (ch != ':') break; + pos++; + ch = commentWhitespace(); + if (ch != 't' || !str_eq3(pos + 1, 'r', 'u', 'e')) break; + pos += 4; + ch = commentWhitespace(); + if (ch != 44) break; + pos++; + ch = commentWhitespace(); + } + if (ch == 'v') { + if (!str_eq4(pos + 1, 'a', 'l', 'u', 'e')) break; + pos += 5; + ch = commentWhitespace(); + if (ch != ':') break; + addExport(exportStart, exportEnd); + pos = revertPos; + return; + } + else if (ch == 'g') { + if (!str_eq2(pos + 1, 'e', 't')) break; + pos += 3; + ch = commentWhitespace(); + if (ch == ':') { + pos++; + ch = commentWhitespace(); + if (ch != 'f') break; + if (!str_eq7(pos + 1, 'u', 'n', 'c', 't', 'i', 'o', 'n')) break; + pos += 8; + uint16_t* lastPos = pos; + ch = commentWhitespace(); + if (ch != '(' && (lastPos == pos || !identifier(ch))) break; + ch = commentWhitespace(); + } + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch != '{') break; + pos++; + ch = commentWhitespace(); + if (ch != 'r') break; + if (!str_eq5(pos + 1, 'e', 't', 'u', 'r', 'n')) break; + pos += 6; + ch = commentWhitespace(); + if (!identifier(ch)) break; + ch = commentWhitespace(); + if (ch == '.') { + pos++; + ch = commentWhitespace(); + if (!identifier(ch)) break; + ch = commentWhitespace(); + } + else if (ch == '[') { + pos++; + ch = commentWhitespace(); + if (ch == '\'' || ch == '"') stringLiteral(ch); + else break; + pos++; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + } + if (ch == ';') { + pos++; + ch = commentWhitespace(); + } + if (ch != '}') break; + pos++; + ch = commentWhitespace(); + if (ch == ',') { + pos++; + ch = commentWhitespace(); + } + if (ch != '}') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + addExport(exportStart, exportEnd); + return; + } + break; + } + if (exportEnd > 0) { + addUnsafeGetter(exportStart, exportEnd); + } + } + else if (keys && ch == 'k' && str_eq3(pos + 1, 'e', 'y', 's')) { + while (true) { + pos += 4; + revertPos = pos - 1; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + uint16_t* id_start = pos; + if (!identifier(ch)) break; + ptrdiff_t id_len = pos - id_start; + ch = commentWhitespace(); + if (ch != ')') break; + + revertPos = pos++; + ch = commentWhitespace(); + if (ch != '.') break; + pos++; + ch = commentWhitespace(); + if (ch != 'f' || !str_eq6(pos + 1, 'o', 'r', 'E', 'a', 'c', 'h')) break; + pos += 7; + ch = commentWhitespace(); + revertPos = pos - 1; + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (ch != 'f' || !str_eq7(pos + 1, 'u', 'n', 'c', 't', 'i', 'o', 'n')) break; + pos += 8; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + uint16_t* it_id_start = pos; + if (!identifier(ch)) break; + ptrdiff_t it_id_len = pos - it_id_start; + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch != '{') break; + pos++; + ch = commentWhitespace(); + if (ch != 'i' || *(pos + 1) != 'f') break; + pos += 2; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + // `if (` IDENTIFIER$2 `===` ( `'default'` | `"default"` ) `||` IDENTIFIER$2 `===` ( '__esModule' | `"__esModule"` ) `) return` `;`? | + if (ch == '=') { + if (!str_eq2(pos + 1, '=', '=')) break; + pos += 3; + ch = commentWhitespace(); + if (ch != '"' && ch != '\'') break; + uint16_t quot = ch; + if (!str_eq7(pos + 1, 'd', 'e', 'f', 'a', 'u', 'l', 't')) break; + pos += 8; + ch = commentWhitespace(); + if (ch != quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch != '|' || *(pos + 1) != '|') break; + pos += 2; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != '=' || !str_eq2(pos + 1, '=', '=')) break; + pos += 3; + ch = commentWhitespace(); + if (ch != '"' && ch != '\'') break; + quot = ch; + if (!str_eq10(pos + 1, '_', '_', 'e', 's', 'M', 'o', 'd', 'u', 'l', 'e')) break; + pos += 11; + ch = commentWhitespace(); + if (ch != quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch != ')') break; + pos += 1; + ch = commentWhitespace(); + if (ch != 'r' || !str_eq5(pos + 1, 'e', 't', 'u', 'r', 'n')) break; + pos += 6; + ch = commentWhitespace(); + if (ch == ';') + pos++; + ch = commentWhitespace(); + + // `if (` + if (ch == 'i' && *(pos + 1) == 'f') { + bool inIf = true; + pos += 2; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + uint16_t *ifInnerPos = pos; + + // `Object.prototype.hasOwnProperty.call(` IDENTIFIER `, ` IDENTIFIER$2 `)) return` `;`? + if (tryParseObjectHasOwnProperty(it_id_start, it_id_len)) { + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch != 'r' || !str_eq5(pos + 1, 'e', 't', 'u', 'r', 'n')) break; + pos += 6; + ch = commentWhitespace(); + if (ch == ';') + pos++; + ch = commentWhitespace(); + // match next if + if (ch == 'i' && *(pos + 1) == 'f') { + pos += 2; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + } + else { + inIf = false; + } + } + else { + pos = ifInnerPos; + } + + // `if (` IDENTIFIER$2 `in` EXPORTS_IDENTIFIER `&&` EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] ===` IDENTIFIER$1 `[` IDENTIFIER$2 `]) return` `;`? + if (inIf) { + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != 'i' || !str_eq2(pos + 1, 'n', ' ')) break; + pos += 3; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch != '&' || *(pos + 1) != '&') break; + pos += 2; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch != '[') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch != '=' || !str_eq2(pos + 1, '=', '=')) break; + pos += 3; + ch = commentWhitespace(); + if (memcmp(pos, id_start, id_len * sizeof(uint16_t)) != 0) break; + pos += id_len; + ch = commentWhitespace(); + if (ch != '[') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch != 'r' || !str_eq5(pos + 1, 'e', 't', 'u', 'r', 'n')) break; + pos += 6; + ch = commentWhitespace(); + if (ch == ';') + pos++; + ch = commentWhitespace(); + } + } + } + // `if (` IDENTIFIER$2 `!==` ( `'default'` | `"default"` ) (`&& !` IDENTIFIER `.hasOwnProperty(` IDENTIFIER$2 `)` )? `)` + else if (ch == '!') { + if (!str_eq2(pos + 1, '=', '=')) break; + pos += 3; + ch = commentWhitespace(); + if (ch != '"' && ch != '\'') break; + uint16_t quot = ch; + if (!str_eq7(pos + 1, 'd', 'e', 'f', 'a', 'u', 'l', 't')) break; + pos += 8; + ch = commentWhitespace(); + if (ch != quot) break; + pos += 1; + ch = commentWhitespace(); + if (ch == '&') { + if (*(pos + 1) != '&') break; + pos += 2; + ch = commentWhitespace(); + if (ch != '!') break; + pos += 1; + ch = commentWhitespace(); + if (ch == 'O' && str_eq6(pos + 1, 'b', 'j', 'e', 'c', 't', '.')) { + if (!tryParseObjectHasOwnProperty(it_id_start, it_id_len)) break; + } + else if (identifier(ch)) { + ch = commentWhitespace(); + if (ch != '.') break; + pos++; + ch = commentWhitespace(); + if (ch != 'h' || !str_eq13(pos + 1, 'a', 's', 'O', 'w', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y')) break; + pos += 14; + ch = commentWhitespace(); + if (ch != '(') break; + pos += 1; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ')') break; + pos += 1; + } + ch = commentWhitespace(); + } + if (ch != ')') break; + pos += 1; + ch = commentWhitespace(); + } + else break; + + // EXPORTS_IDENTIFIER `[` IDENTIFIER$2 `] =` IDENTIFIER$1 `[` IDENTIFIER$2 `]` + if (readExportsOrModuleDotExports(ch)) { + ch = commentWhitespace(); + if (ch != '[') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch != '=') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, id_start, id_len * sizeof(uint16_t)) != 0) break; + pos += id_len; + ch = commentWhitespace(); + if (ch != '[') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch == ';') { + pos++; + ch = commentWhitespace(); + } + } + // `Object.defineProperty(` EXPORTS_IDENTIFIER `, ` IDENTIFIER$2 `, { enumerable: true, get: function () { return ` IDENTIFIER$1 `[` IDENTIFIER$2 `]; } })` + else if (ch == 'O') { + if (!str_eq5(pos + 1, 'b', 'j', 'e', 'c', 't')) break; + pos += 6; + ch = commentWhitespace(); + if (ch != '.') break; + pos++; + ch = commentWhitespace(); + if (ch != 'd' || !str_eq13(pos + 1, 'e', 'f', 'i', 'n', 'e', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'y')) break; + pos += 14; + ch = commentWhitespace(); + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (!readExportsOrModuleDotExports(ch)) break; + ch = commentWhitespace(); + if (ch != ',') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ',') break; + pos++; + ch = commentWhitespace(); + if (ch != '{') break; + pos++; + ch = commentWhitespace(); + if (ch != 'e' || !str_eq9(pos + 1, 'n', 'u', 'm', 'e', 'r', 'a', 'b', 'l', 'e')) break; + pos += 10; + ch = commentWhitespace(); + if (ch != ':') break; + pos++; + ch = commentWhitespace(); + if (ch != 't' && !str_eq3(pos + 1, 'r', 'u', 'e')) break; + pos += 4; + ch = commentWhitespace(); + if (ch != ',') break; + pos++; + ch = commentWhitespace(); + if (ch != 'g' || !str_eq2(pos + 1, 'e', 't')) break; + pos += 3; + ch = commentWhitespace(); + if (ch == ':') { + pos++; + ch = commentWhitespace(); + if (ch != 'f') break; + if (!str_eq7(pos + 1, 'u', 'n', 'c', 't', 'i', 'o', 'n')) break; + pos += 8; + uint16_t* lastPos = pos; + ch = commentWhitespace(); + if (ch != '(' && (lastPos == pos || !identifier(ch))) break; + ch = commentWhitespace(); + } + if (ch != '(') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch != '{') break; + pos++; + ch = commentWhitespace(); + if (ch != 'r' || !str_eq5(pos + 1, 'e', 't', 'u', 'r', 'n')) break; + pos += 6; + ch = commentWhitespace(); + if (memcmp(pos, id_start, id_len * sizeof(uint16_t)) != 0) break; + pos += id_len; + ch = commentWhitespace(); + if (ch != '[') break; + pos++; + ch = commentWhitespace(); + if (memcmp(pos, it_id_start, it_id_len * sizeof(uint16_t)) != 0) break; + pos += it_id_len; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch == ';') { + pos++; + ch = commentWhitespace(); + } + if (ch != '}') break; + pos++; + ch = commentWhitespace(); + if (ch == ',') { + pos++; + ch = commentWhitespace(); + } + if (ch != '}') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + pos++; + ch = commentWhitespace(); + if (ch == ';') { + pos++; + ch = commentWhitespace(); + } + } + else break; + + if (ch != '}') break; + pos++; + ch = commentWhitespace(); + if (ch != ')') break; + + // search through export bindings to see if this is a star export + // this is done last because it is a linear search through all require bindings + // and by doing this search last after verifying the structure match, + // we don't have to worry about the slow search algorithm + StarExportBinding* curCheckBinding = &starExportStack_[0]; + while (curCheckBinding != starExportStack) { + if (id_len == curCheckBinding->id_end - curCheckBinding->id_start && + 0 == memcmp(id_start, curCheckBinding->id_start, id_len * sizeof(uint16_t))) { + addReexport(curCheckBinding->specifier_start, curCheckBinding->specifier_end); + pos = revertPos; + return; + } + curCheckBinding++; + } + return; + } + } + } + pos = revertPos; +} + +bool readExportsOrModuleDotExports (uint16_t ch) { + uint16_t* revertPos = pos; + if (ch == 'm' && str_eq5(pos + 1, 'o', 'd', 'u', 'l', 'e')) { + pos += 6; + ch = commentWhitespace(); + if (ch != '.') { + pos = revertPos; + return false; + } + pos++; + ch = commentWhitespace(); + } + if (ch == 'e' && str_eq6(pos + 1, 'x', 'p', 'o', 'r', 't', 's')) { + pos += 7; + return true; + } + else { + pos = revertPos; + return false; + } +} + +void tryParseModuleExportsDotAssign () { + pos += 6; + uint16_t* revertPos = pos - 1; + uint16_t ch = commentWhitespace(); + if (ch == '.') { + pos++; + ch = commentWhitespace(); + if (ch == 'e' && str_eq6(pos + 1, 'x', 'p', 'o', 'r', 't', 's')) { + tryParseExportsDotAssign(true); + return; + } + } + pos = revertPos; +} + +void tryParseExportsDotAssign (bool assign) { + pos += 7; + uint16_t* revertPos = pos - 1; + uint16_t ch = commentWhitespace(); + switch (ch) { + // exports.asdf + case '.': { + pos++; + ch = commentWhitespace(); + uint16_t* startPos = pos; + if (identifier(ch)) { + uint16_t* endPos = pos; + ch = commentWhitespace(); + if (ch == '=') { + addExport(startPos, endPos); + return; + } + } + break; + } + // exports['asdf'] + case '[': { + pos++; + ch = commentWhitespace(); + if (ch == '\'' || ch == '"') { + uint16_t* startPos = pos; + stringLiteral(ch); + uint16_t* endPos = ++pos; + ch = commentWhitespace(); + if (ch != ']') break; + pos++; + ch = commentWhitespace(); + if (ch != '=') break; + addExport(startPos, endPos); + } + break; + } + // module.exports = + case '=': { + if (assign) { + clearReexports(); + pos++; + ch = commentWhitespace(); + // { ... } + if (ch == '{') { + tryParseLiteralExports(); + return; + } + + // require('...') + if (ch == 'r') + tryParseRequire(ExportAssign); + } + } + } + pos = revertPos; +} + +bool tryParseRequire (enum RequireType requireType) { + uint16_t* revertPos = pos; + // require('...') + if (str_eq6(pos + 1, 'e', 'q', 'u', 'i', 'r', 'e')) { + pos += 7; + uint16_t ch = commentWhitespace(); + if (ch == '(') { + pos++; + ch = commentWhitespace(); + uint16_t* reexportStart = pos; + if (ch == '\'' || ch == '"') { + stringLiteral(ch); + uint16_t* reexportEnd = ++pos; + ch = commentWhitespace(); + if (ch == ')') { + switch (requireType) { + case ExportStar: + addReexport(reexportStart, reexportEnd); + return true; + case ExportAssign: + addReexport(reexportStart, reexportEnd); + return true; + default: + starExportStack->specifier_start = reexportStart; + starExportStack->specifier_end = reexportEnd; + return true; + } + } + } + } + pos = revertPos; + } + return false; +} + +void tryParseLiteralExports () { + uint16_t* revertPos = pos - 1; + while (pos++ < end) { + uint16_t ch = commentWhitespace(); + uint16_t* startPos = pos; + if (identifier(ch)) { + uint16_t* endPos = pos; + ch = commentWhitespace(); + if (ch == ':') { + pos++; + ch = commentWhitespace(); + // nothing more complex than identifier expressions for now + if (!identifier(ch)) { + pos = revertPos; + return; + } + ch = *pos; + } + addExport(startPos, endPos); + } + else if (ch == '\'' || ch == '"') { + uint16_t* startPos = pos; + stringLiteral(ch); + uint16_t* endPos = ++pos; + ch = commentWhitespace(); + if (ch == ':') { + pos++; + ch = commentWhitespace(); + // nothing more complex than identifier expressions for now + if (!identifier(ch)) { + pos = revertPos; + return; + } + ch = *pos; + addExport(startPos, endPos); + } + } + else if (ch == '.' && str_eq2(pos + 1, '.', '.')) { + pos += 3; + if (*pos == 'r' && tryParseRequire(ExportAssign)) { + pos++; + } + else if (!identifier(*pos)) { + pos = revertPos; + return; + } + ch = commentWhitespace(); + } + else { + pos = revertPos; + return; + } + + if (ch == '}') + return; + + if (ch != ',') { + pos = revertPos; + return; + } + } +} + +// Identifier detection, ported from Acorn +// ## Character categories + +// Big ugly regular expressions that match characters in the +// whitespace, identifier, and identifier-start categories. These +// are only applied when a character is found to actually have a +// code point above 128. +// Generated by `bin/generate-identifier-regex.js`. + +bool isNonASCIIidentifierStartChar (uint32_t ch) { + return ch == 0xaa || ch == 0xb5 || ch == 0xba || ch >= 0xc0 && ch <= 0xd6 || ch >= 0xd8 && ch <= 0xf6 || ch >= 0xf8 && ch <= 0x02c1 || + ch >= 0x02c6 && ch <= 0x02d1 || ch >= 0x02e0 && ch <= 0x02e4 || ch == 0x02ec || ch == 0x02ee || ch >= 0x0370 && ch <= 0x0374 || ch == 0x0376 || ch == 0x0377 || ch >= 0x037a && ch <= 0x037d || ch == 0x037f || ch == 0x0386 || ch >= 0x0388 && ch <= 0x038a || ch == 0x038c || ch >= 0x038e && ch <= 0x03a1 || ch >= 0x03a3 && ch <= 0x03f5 || ch >= 0x03f7 && ch <= 0x0481 || ch >= 0x048a && ch <= 0x052f || ch >= 0x0531 && ch <= 0x0556 || ch == 0x0559 || ch >= 0x0560 && ch <= 0x0588 || ch >= 0x05d0 && ch <= 0x05ea || ch >= 0x05ef && ch <= 0x05f2 || ch >= 0x0620 && ch <= 0x064a || ch == 0x066e || ch == 0x066f || ch >= 0x0671 && ch <= 0x06d3 || ch == 0x06d5 || ch == 0x06e5 || ch == 0x06e6 || ch == 0x06ee || ch == 0x06ef || ch >= 0x06fa && ch <= 0x06fc || ch == 0x06ff || ch == 0x0710 || ch >= 0x0712 && ch <= 0x072f || ch >= 0x074d && ch <= 0x07a5 || ch == 0x07b1 || ch >= 0x07ca && ch <= 0x07ea || ch == 0x07f4 || ch == 0x07f5 || ch == 0x07fa || ch >= 0x0800 && ch <= 0x0815 || ch == 0x081a || ch == 0x0824 || ch == 0x0828 || ch >= 0x0840 && ch <= 0x0858 || ch >= 0x0860 && ch <= 0x086a || ch >= 0x08a0 && ch <= 0x08b4 || ch >= 0x08b6 && ch <= 0x08bd || ch >= 0x0904 && ch <= 0x0939 || ch == 0x093d || ch == 0x0950 || ch >= 0x0958 && ch <= 0x0961 || ch >= 0x0971 && ch <= 0x0980 || ch >= 0x0985 && ch <= 0x098c || ch == 0x098f || ch == 0x0990 || ch >= 0x0993 && ch <= 0x09a8 || ch >= 0x09aa && ch <= 0x09b0 || ch == 0x09b2 || ch >= 0x09b6 && ch <= 0x09b9 || ch == 0x09bd || ch == 0x09ce || ch == 0x09dc || ch == 0x09dd || ch >= 0x09df && ch <= 0x09e1 || ch == 0x09f0 || ch == 0x09f1 || ch == 0x09fc || ch >= 0x0a05 && ch <= 0x0a0a || ch == 0x0a0f || ch == 0x0a10 || ch >= 0x0a13 && ch <= 0x0a28 || ch >= 0x0a2a && ch <= 0x0a30 || ch == 0x0a32 || ch == 0x0a33 || ch == 0x0a35 || ch == 0x0a36 || ch == 0x0a38 || ch == 0x0a39 || ch >= 0x0a59 && ch <= 0x0a5c || ch == 0x0a5e || ch >= 0x0a72 && ch <= 0x0a74 || ch >= 0x0a85 && ch <= 0x0a8d || ch >= 0x0a8f && ch <= 0x0a91 || ch >= 0x0a93 && ch <= 0x0aa8 || ch >= 0x0aaa && ch <= 0x0ab0 || ch == 0x0ab2 || ch == 0x0ab3 || ch >= 0x0ab5 && ch <= 0x0ab9 || ch == 0x0abd || ch == 0x0ad0 || ch == 0x0ae0 || ch == 0x0ae1 || ch == 0x0af9 || ch >= 0x0b05 && ch <= 0x0b0c || ch == 0x0b0f || ch == 0x0b10 || ch >= 0x0b13 && ch <= 0x0b28 || ch >= 0x0b2a && ch <= 0x0b30 || ch == 0x0b32 || ch == 0x0b33 || ch >= 0x0b35 && ch <= 0x0b39 || ch == 0x0b3d || ch == 0x0b5c || ch == 0x0b5d || ch >= 0x0b5f && ch <= 0x0b61 || ch == 0x0b71 || ch == 0x0b83 || ch >= 0x0b85 && ch <= 0x0b8a || ch >= 0x0b8e && ch <= 0x0b90 || ch >= 0x0b92 && ch <= 0x0b95 || ch == 0x0b99 || ch == 0x0b9a || ch == 0x0b9c || ch == 0x0b9e || ch == 0x0b9f || ch == 0x0ba3 || ch == 0x0ba4 || ch >= 0x0ba8 && ch <= 0x0baa || ch >= 0x0bae && ch <= 0x0bb9 || ch == 0x0bd0 || ch >= 0x0c05 && ch <= 0x0c0c || ch >= 0x0c0e && ch <= 0x0c10 || ch >= 0x0c12 && ch <= 0x0c28 || ch >= 0x0c2a && ch <= 0x0c39 || ch == 0x0c3d || ch >= 0x0c58 && ch <= 0x0c5a || ch == 0x0c60 || ch == 0x0c61 || ch == 0x0c80 || ch >= 0x0c85 && ch <= 0x0c8c || ch >= 0x0c8e && ch <= 0x0c90 || ch >= 0x0c92 && ch <= 0x0ca8 || ch >= 0x0caa && ch <= 0x0cb3 || ch >= 0x0cb5 && ch <= 0x0cb9 || ch == 0x0cbd || ch == 0x0cde || ch == 0x0ce0 || ch == 0x0ce1 || ch == 0x0cf1 || ch == 0x0cf2 || ch >= 0x0d05 && ch <= 0x0d0c || ch >= 0x0d0e && ch <= 0x0d10 || ch >= 0x0d12 && ch <= 0x0d3a || ch == 0x0d3d || ch == 0x0d4e || ch >= 0x0d54 && ch <= 0x0d56 || ch >= 0x0d5f && ch <= 0x0d61 || ch >= 0x0d7a && ch <= 0x0d7f || ch >= 0x0d85 && ch <= 0x0d96 || ch >= 0x0d9a && ch <= 0x0db1 || ch >= 0x0db3 && ch <= 0x0dbb || ch == 0x0dbd || ch >= 0x0dc0 && ch <= 0x0dc6 || ch >= 0x0e01 && ch <= 0x0e30 || ch == 0x0e32 || ch == 0x0e33 || ch >= 0x0e40 && ch <= 0x0e46 || ch == 0x0e81 || ch == 0x0e82 || ch == 0x0e84 || ch == 0x0e87 || ch == 0x0e88 || ch == 0x0e8a || ch == 0x0e8d || ch >= 0x0e94 && ch <= 0x0e97 || ch >= 0x0e99 && ch <= 0x0e9f || ch >= 0x0ea1 && ch <= 0x0ea3 || ch == 0x0ea5 || ch == 0x0ea7 || ch == 0x0eaa || ch == 0x0eab || ch >= 0x0ead && ch <= 0x0eb0 || ch == 0x0eb2 || ch == 0x0eb3 || ch == 0x0ebd || ch >= 0x0ec0 && ch <= 0x0ec4 || ch == 0x0ec6 || ch >= 0x0edc && ch <= 0x0edf || ch == 0x0f00 || ch >= 0x0f40 && ch <= 0x0f47 || ch >= 0x0f49 && ch <= 0x0f6c || ch >= 0x0f88 && ch <= 0x0f8c || ch >= 0x1000 && ch <= 0x102a || ch == 0x103f || ch >= 0x1050 && ch <= 0x1055 || ch >= 0x105a && ch <= 0x105d || ch == 0x1061 || ch == 0x1065 || ch == 0x1066 || ch >= 0x106e && ch <= 0x1070 || ch >= 0x1075 && ch <= 0x1081 || ch == 0x108e || ch >= 0x10a0 && ch <= 0x10c5 || ch == 0x10c7 || ch == 0x10cd || ch >= 0x10d0 && ch <= 0x10fa || ch >= 0x10fc && ch <= 0x1248 || ch >= 0x124a && ch <= 0x124d || ch >= 0x1250 && ch <= 0x1256 || ch == 0x1258 || ch >= 0x125a && ch <= 0x125d || ch >= 0x1260 && ch <= 0x1288 || ch >= 0x128a && ch <= 0x128d || ch >= 0x1290 && ch <= 0x12b0 || ch >= 0x12b2 && ch <= 0x12b5 || ch >= 0x12b8 && ch <= 0x12be || ch == 0x12c0 || ch >= 0x12c2 && ch <= 0x12c5 || ch >= 0x12c8 && ch <= 0x12d6 || ch >= 0x12d8 && ch <= 0x1310 || ch >= 0x1312 && ch <= 0x1315 || ch >= 0x1318 && ch <= 0x135a || ch >= 0x1380 && ch <= 0x138f || ch >= 0x13a0 && ch <= 0x13f5 || ch >= 0x13f8 && ch <= 0x13fd || ch >= 0x1401 && ch <= 0x166c || ch >= 0x166f && ch <= 0x167f || ch >= 0x1681 && ch <= 0x169a || ch >= 0x16a0 && ch <= 0x16ea || ch >= 0x16ee && ch <= 0x16f8 || ch >= 0x1700 && ch <= 0x170c || ch >= 0x170e && ch <= 0x1711 || ch >= 0x1720 && ch <= 0x1731 || ch >= 0x1740 && ch <= 0x1751 || ch >= 0x1760 && ch <= 0x176c || ch >= 0x176e && ch <= 0x1770 || ch >= 0x1780 && ch <= 0x17b3 || ch == 0x17d7 || ch == 0x17dc || ch >= 0x1820 && ch <= 0x1878 || ch >= 0x1880 && ch <= 0x18a8 || ch == 0x18aa || ch >= 0x18b0 && ch <= 0x18f5 || ch >= 0x1900 && ch <= 0x191e || ch >= 0x1950 && ch <= 0x196d || ch >= 0x1970 && ch <= 0x1974 || ch >= 0x1980 && ch <= 0x19ab || ch >= 0x19b0 && ch <= 0x19c9 || ch >= 0x1a00 && ch <= 0x1a16 || ch >= 0x1a20 && ch <= 0x1a54 || ch == 0x1aa7 || ch >= 0x1b05 && ch <= 0x1b33 || ch >= 0x1b45 && ch <= 0x1b4b || ch >= 0x1b83 && ch <= 0x1ba0 || ch == 0x1bae || ch == 0x1baf || ch >= 0x1bba && ch <= 0x1be5 || ch >= 0x1c00 && ch <= 0x1c23 || ch >= 0x1c4d && ch <= 0x1c4f || ch >= 0x1c5a && ch <= 0x1c7d || ch >= 0x1c80 && ch <= 0x1c88 || ch >= 0x1c90 && ch <= 0x1cba || ch >= 0x1cbd && ch <= 0x1cbf || ch >= 0x1ce9 && ch <= 0x1cec || ch >= 0x1cee && ch <= 0x1cf1 || ch == 0x1cf5 || ch == 0x1cf6 || ch >= 0x1d00 && ch <= 0x1dbf || ch >= 0x1e00 && ch <= 0x1f15 || ch >= 0x1f18 && ch <= 0x1f1d || ch >= 0x1f20 && ch <= 0x1f45 || ch >= 0x1f48 && ch <= 0x1f4d || ch >= 0x1f50 && ch <= 0x1f57 || ch == 0x1f59 || ch == 0x1f5b || ch == 0x1f5d || ch >= 0x1f5f && ch <= 0x1f7d || ch >= 0x1f80 && ch <= 0x1fb4 || ch >= 0x1fb6 && ch <= 0x1fbc || ch == 0x1fbe || ch >= 0x1fc2 && ch <= 0x1fc4 || ch >= 0x1fc6 && ch <= 0x1fcc || ch >= 0x1fd0 && ch <= 0x1fd3 || ch >= 0x1fd6 && ch <= 0x1fdb || ch >= 0x1fe0 && ch <= 0x1fec || ch >= 0x1ff2 && ch <= 0x1ff4 || ch >= 0x1ff6 && ch <= 0x1ffc || ch == 0x2071 || ch == 0x207f || ch >= 0x2090 && ch <= 0x209c || ch == 0x2102 || ch == 0x2107 || ch >= 0x210a && ch <= 0x2113 || ch == 0x2115 || ch >= 0x2118 && ch <= 0x211d || ch == 0x2124 || ch == 0x2126 || ch == 0x2128 || ch >= 0x212a && ch <= 0x2139 || ch >= 0x213c && ch <= 0x213f || ch >= 0x2145 && ch <= 0x2149 || ch == 0x214e || ch >= 0x2160 && ch <= 0x2188 || ch >= 0x2c00 && ch <= 0x2c2e || ch >= 0x2c30 && ch <= 0x2c5e || ch >= 0x2c60 && ch <= 0x2ce4 || ch >= 0x2ceb && ch <= 0x2cee || ch == 0x2cf2 || ch == 0x2cf3 || ch >= 0x2d00 && ch <= 0x2d25 || ch == 0x2d27 || ch == 0x2d2d || ch >= 0x2d30 && ch <= 0x2d67 || ch == 0x2d6f || ch >= 0x2d80 && ch <= 0x2d96 || ch >= 0x2da0 && ch <= 0x2da6 || ch >= 0x2da8 && ch <= 0x2dae || ch >= 0x2db0 && ch <= 0x2db6 || ch >= 0x2db8 && ch <= 0x2dbe || ch >= 0x2dc0 && ch <= 0x2dc6 || ch >= 0x2dc8 && ch <= 0x2dce || ch >= 0x2dd0 && ch <= 0x2dd6 || ch >= 0x2dd8 && ch <= 0x2dde || ch >= 0x3005 && ch <= 0x3007 || ch >= 0x3021 && ch <= 0x3029 || ch >= 0x3031 && ch <= 0x3035 || ch >= 0x3038 && ch <= 0x303c || ch >= 0x3041 && ch <= 0x3096 || ch >= 0x309b && ch <= 0x309f || ch >= 0x30a1 && ch <= 0x30fa || ch >= 0x30fc && ch <= 0x30ff || ch >= 0x3105 && ch <= 0x312f || ch >= 0x3131 && ch <= 0x318e || ch >= 0x31a0 && ch <= 0x31ba || ch >= 0x31f0 && ch <= 0x31ff || ch >= 0x3400 && ch <= 0x4db5 || ch >= 0x4e00 && ch <= 0x9fef || ch >= 0xa000 && ch <= 0xa48c || ch >= 0xa4d0 && ch <= 0xa4fd || ch >= 0xa500 && ch <= 0xa60c || ch >= 0xa610 && ch <= 0xa61f || ch == 0xa62a || ch == 0xa62b || ch >= 0xa640 && ch <= 0xa66e || ch >= 0xa67f && ch <= 0xa69d || ch >= 0xa6a0 && ch <= 0xa6ef || ch >= 0xa717 && ch <= 0xa71f || ch >= 0xa722 && ch <= 0xa788 || ch >= 0xa78b && ch <= 0xa7b9 || ch >= 0xa7f7 && ch <= 0xa801 || ch >= 0xa803 && ch <= 0xa805 || ch >= 0xa807 && ch <= 0xa80a || ch >= 0xa80c && ch <= 0xa822 || ch >= 0xa840 && ch <= 0xa873 || ch >= 0xa882 && ch <= 0xa8b3 || ch >= 0xa8f2 && ch <= 0xa8f7 || ch == 0xa8fb || ch == 0xa8fd || ch == 0xa8fe || ch >= 0xa90a && ch <= 0xa925 || ch >= 0xa930 && ch <= 0xa946 || ch >= 0xa960 && ch <= 0xa97c || ch >= 0xa984 && ch <= 0xa9b2 || ch == 0xa9cf || ch >= 0xa9e0 && ch <= 0xa9e4 || ch >= 0xa9e6 && ch <= 0xa9ef || ch >= 0xa9fa && ch <= 0xa9fe || ch >= 0xaa00 && ch <= 0xaa28 || ch >= 0xaa40 && ch <= 0xaa42 || ch >= 0xaa44 && ch <= 0xaa4b || ch >= 0xaa60 && ch <= 0xaa76 || ch == 0xaa7a || ch >= 0xaa7e && ch <= 0xaaaf || ch == 0xaab1 || ch == 0xaab5 || ch == 0xaab6 || ch >= 0xaab9 && ch <= 0xaabd || ch == 0xaac0 || ch == 0xaac2 || ch >= 0xaadb && ch <= 0xaadd || ch >= 0xaae0 && ch <= 0xaaea || ch >= 0xaaf2 && ch <= 0xaaf4 || ch >= 0xab01 && ch <= 0xab06 || ch >= 0xab09 && ch <= 0xab0e || ch >= 0xab11 && ch <= 0xab16 || ch >= 0xab20 && ch <= 0xab26 || ch >= 0xab28 && ch <= 0xab2e || + ch >= 0xab30 && ch <= 0xab5a || ch >= 0xab5c && ch <= 0xab65 || ch >= 0xab70 && ch <= 0xabe2 || ch >= 0xac00 && ch <= 0xd7a3 || ch >= 0xd7b0 && ch <= 0xd7c6 || ch >= 0xd7cb && ch <= 0xd7fb || ch >= 0xf900 && ch <= 0xfa6d || ch >= 0xfa70 && ch <= 0xfad9 || ch >= 0xfb00 && ch <= 0xfb06 || ch >= 0xfb13 && ch <= 0xfb17 || ch == 0xfb1d || ch >= 0xfb1f && ch <= 0xfb28 || ch >= 0xfb2a && ch <= 0xfb36 || ch >= 0xfb38 && ch <= 0xfb3c || ch == 0xfb3e || ch == 0xfb40 || ch == 0xfb41 || ch == 0xfb43 || ch == 0xfb44 || ch >= 0xfb46 && ch <= 0xfbb1 || ch >= 0xfbd3 && ch <= 0xfd3d || ch >= 0xfd50 && ch <= 0xfd8f || ch >= 0xfd92 && ch <= 0xfdc7 || ch >= 0xfdf0 && ch <= 0xfdfb || ch >= 0xfe70 && ch <= 0xfe74 || ch >= 0xfe76 && ch <= 0xfefc || ch >= 0xff21 && ch <= 0xff3a || ch >= 0xff41 && ch <= 0xff5a || ch >= 0xff66 && ch <= 0xffbe || ch >= 0xffc2 && ch <= 0xffc7 || ch >= 0xffca && ch <= 0xffcf || ch >= 0xffd2 && ch <= 0xffd7 || ch >= 0xffda && ch <= 0xffdc; +} + +bool isNonASCIIidentifierChar (uint32_t ch) { + return isNonASCIIidentifierStartChar(ch) || ch == 0x200c || ch == 0x200d || ch == 0xb7 || ch >= 0x0300 && ch <= 0x036f || ch == 0x0387 || ch >= 0x0483 && ch <= 0x0487 || ch >= 0x0591 && ch <= 0x05bd || ch == 0x05bf || ch == 0x05c1 || ch == 0x05c2 || ch == 0x05c4 || ch == 0x05c5 || ch == 0x05c7 || ch >= 0x0610 && ch <= 0x061a || ch >= 0x064b && ch <= 0x0669 || ch == 0x0670 || ch >= 0x06d6 && ch <= 0x06dc || ch >= 0x06df && ch <= 0x06e4 || ch == 0x06e7 || ch == 0x06e8 || ch >= 0x06ea && ch <= 0x06ed || ch >= 0x06f0 && ch <= 0x06f9 || ch == 0x0711 || ch >= 0x0730 && ch <= 0x074a || ch >= 0x07a6 && ch <= 0x07b0 || ch >= 0x07c0 && ch <= 0x07c9 || ch >= 0x07eb && ch <= 0x07f3 || ch == 0x07fd || ch >= 0x0816 && ch <= 0x0819 || ch >= 0x081b && ch <= 0x0823 || ch >= 0x0825 && ch <= 0x0827 || ch >= 0x0829 && ch <= 0x082d || ch >= 0x0859 && ch <= 0x085b || ch >= 0x08d3 && ch <= 0x08e1 || ch >= 0x08e3 && ch <= 0x0903 || ch >= 0x093a && ch <= 0x093c || ch >= 0x093e && ch <= 0x094f || ch >= 0x0951 && ch <= 0x0957 || ch == 0x0962 || ch == 0x0963 || ch >= 0x0966 && ch <= 0x096f || ch >= 0x0981 && ch <= 0x0983 || ch == 0x09bc || ch >= 0x09be && ch <= 0x09c4 || ch == 0x09c7 || ch == 0x09c8 || ch >= 0x09cb && ch <= 0x09cd || ch == 0x09d7 || ch == 0x09e2 || ch == 0x09e3 || ch >= 0x09e6 && ch <= 0x09ef || ch == 0x09fe || ch >= 0x0a01 && ch <= 0x0a03 || ch == 0x0a3c || ch >= 0x0a3e && ch <= 0x0a42 || ch == 0x0a47 || ch == 0x0a48 || ch >= 0x0a4b && ch <= 0x0a4d || ch == 0x0a51 || ch >= 0x0a66 && ch <= 0x0a71 || ch == 0x0a75 || ch >= 0x0a81 && ch <= 0x0a83 || ch == 0x0abc || ch >= 0x0abe && ch <= 0x0ac5 || ch >= 0x0ac7 && ch <= 0x0ac9 || ch >= 0x0acb && ch <= 0x0acd || ch == 0x0ae2 || ch == 0x0ae3 || ch >= 0x0ae6 && ch <= 0x0aef || ch >= 0x0afa && ch <= 0x0aff || ch >= 0x0b01 && ch <= 0x0b03 || ch == 0x0b3c || ch >= 0x0b3e && ch <= 0x0b44 || ch == 0x0b47 || ch == 0x0b48 || ch >= 0x0b4b && ch <= 0x0b4d || ch == 0x0b56 || ch == 0x0b57 || ch == 0x0b62 || ch == 0x0b63 || ch >= 0x0b66 && ch <= 0x0b6f || ch == 0x0b82 || ch >= 0x0bbe && ch <= 0x0bc2 || ch >= 0x0bc6 && ch <= 0x0bc8 || ch >= 0x0bca && ch <= 0x0bcd || ch == 0x0bd7 || ch >= 0x0be6 && ch <= 0x0bef || ch >= 0x0c00 && ch <= 0x0c04 || ch >= 0x0c3e && ch <= 0x0c44 || ch >= 0x0c46 && ch <= 0x0c48 || ch >= 0x0c4a && ch <= 0x0c4d || ch == 0x0c55 || ch == 0x0c56 || ch == 0x0c62 || ch == 0x0c63 || ch >= 0x0c66 && ch <= 0x0c6f || ch >= 0x0c81 && ch <= 0x0c83 || ch == 0x0cbc || ch >= 0x0cbe && ch <= 0x0cc4 || ch >= 0x0cc6 && ch <= 0x0cc8 || ch >= 0x0cca && ch <= 0x0ccd || ch == 0x0cd5 || ch == 0x0cd6 || ch == 0x0ce2 || ch == 0x0ce3 || ch >= 0x0ce6 && ch <= 0x0cef || ch >= 0x0d00 && ch <= 0x0d03 || ch == 0x0d3b || ch == 0x0d3c || ch >= 0x0d3e && ch <= 0x0d44 || ch >= 0x0d46 && ch <= 0x0d48 || ch >= 0x0d4a && ch <= 0x0d4d || ch == 0x0d57 || ch == 0x0d62 || ch == 0x0d63 || ch >= 0x0d66 && ch <= 0x0d6f || ch == 0x0d82 || ch == 0x0d83 || ch == 0x0dca || ch >= 0x0dcf && ch <= 0x0dd4 || ch == 0x0dd6 || ch >= 0x0dd8 && ch <= 0x0ddf || ch >= 0x0de6 && ch <= 0x0def || ch == 0x0df2 || ch == 0x0df3 || ch == 0x0e31 || ch >= 0x0e34 && ch <= 0x0e3a || ch >= 0x0e47 && ch <= 0x0e4e || ch >= 0x0e50 && ch <= 0x0e59 || ch == 0x0eb1 || ch >= 0x0eb4 && ch <= 0x0eb9 || ch == 0x0ebb || ch == 0x0ebc || ch >= 0x0ec8 && ch <= 0x0ecd || ch >= 0x0ed0 && ch <= 0x0ed9 || ch == 0x0f18 || ch == 0x0f19 || ch >= 0x0f20 && ch <= 0x0f29 || ch == 0x0f35 || ch == 0x0f37 || ch == 0x0f39 || ch == 0x0f3e || ch == 0x0f3f || ch >= 0x0f71 && ch <= 0x0f84 || ch == 0x0f86 || ch == 0x0f87 || ch >= 0x0f8d && ch <= 0x0f97 || ch >= 0x0f99 && ch <= 0x0fbc || ch == 0x0fc6 || ch >= 0x102b && ch <= 0x103e || ch >= 0x1040 && ch <= 0x1049 || ch >= 0x1056 && ch <= 0x1059 || ch >= 0x105e && ch <= 0x1060 || ch >= 0x1062 && ch <= 0x1064 || ch >= 0x1067 && ch <= 0x106d || ch >= 0x1071 && ch <= 0x1074 || ch >= 0x1082 && ch <= 0x108d || ch >= 0x108f && ch <= 0x109d || ch >= 0x135d && ch <= 0x135f || ch >= 0x1369 && ch <= 0x1371 || ch >= 0x1712 && ch <= 0x1714 || ch >= 0x1732 && ch <= 0x1734 || ch == 0x1752 || ch == 0x1753 || ch == 0x1772 || ch == 0x1773 || ch >= 0x17b4 && ch <= 0x17d3 || ch == 0x17dd || ch >= 0x17e0 && ch <= 0x17e9 || ch >= 0x180b && ch <= 0x180d || ch >= 0x1810 && ch <= 0x1819 || ch == 0x18a9 || ch >= 0x1920 && ch <= 0x192b || ch >= 0x1930 && ch <= 0x193b || ch >= 0x1946 && ch <= 0x194f || ch >= 0x19d0 && ch <= 0x19da || ch >= 0x1a17 && ch <= 0x1a1b || ch >= 0x1a55 && ch <= 0x1a5e || ch >= 0x1a60 && ch <= 0x1a7c || ch >= 0x1a7f && ch <= 0x1a89 || ch >= 0x1a90 && ch <= 0x1a99 || ch >= 0x1ab0 && ch <= 0x1abd || ch >= 0x1b00 && ch <= 0x1b04 || ch >= 0x1b34 && ch <= 0x1b44 || ch >= 0x1b50 && ch <= 0x1b59 || ch >= 0x1b6b && ch <= 0x1b73 || ch >= 0x1b80 && ch <= 0x1b82 || ch >= 0x1ba1 && ch <= 0x1bad || ch >= 0x1bb0 && ch <= 0x1bb9 || ch >= 0x1be6 && ch <= 0x1bf3 || ch >= 0x1c24 && ch <= 0x1c37 || ch >= 0x1c40 && ch <= 0x1c49 || ch >= 0x1c50 && ch <= 0x1c59 || ch >= 0x1cd0 && ch <= 0x1cd2 || ch >= 0x1cd4 && ch <= 0x1ce8 || ch == 0x1ced || ch >= 0x1cf2 && ch <= 0x1cf4 || ch >= 0x1cf7 && ch <= 0x1cf9 || ch >= 0x1dc0 && ch <= 0x1df9 || ch >= 0x1dfb && ch <= 0x1dff || ch == 0x203f || ch == 0x2040 || ch == 0x2054 || ch >= 0x20d0 && ch <= 0x20dc || ch == 0x20e1 || ch >= 0x20e5 && ch <= 0x20f0 || ch >= 0x2cef && ch <= 0x2cf1 || ch == 0x2d7f || ch >= 0x2de0 && ch <= 0x2dff || ch >= 0x302a && ch <= 0x302f || ch == 0x3099 || ch == 0x309a || ch >= 0xa620 && ch <= 0xa629 || ch == 0xa66f || ch >= 0xa674 && ch <= 0xa67d || ch == 0xa69e || ch == 0xa69f || ch == 0xa6f0 || ch == 0xa6f1 || ch == 0xa802 || ch == 0xa806 || ch == 0xa80b || ch >= 0xa823 && ch <= 0xa827 || ch == 0xa880 || ch == 0xa881 || ch >= 0xa8b4 && ch <= 0xa8c5 || ch >= 0xa8d0 && ch <= 0xa8d9 || ch >= 0xa8e0 && ch <= 0xa8f1 || ch >= 0xa8ff && ch <= 0xa909 || ch >= 0xa926 && ch <= 0xa92d || ch >= 0xa947 && ch <= 0xa953 || ch >= 0xa980 && ch <= 0xa983 || ch >= 0xa9b3 && ch <= 0xa9c0 || ch >= 0xa9d0 && ch <= 0xa9d9 || ch == 0xa9e5 || ch >= 0xa9f0 && ch <= 0xa9f9 || ch >= 0xaa29 && ch <= 0xaa36 || ch == 0xaa43 || ch == 0xaa4c || ch == 0xaa4d || ch >= 0xaa50 && ch <= 0xaa59 || ch >= 0xaa7b && ch <= 0xaa7d || ch == 0xaab0 || ch >= 0xaab2 && ch <= 0xaab4 || ch == 0xaab7 || ch == 0xaab8 || ch == 0xaabe || ch == 0xaabf || ch == 0xaac1 || ch >= 0xaaeb && ch <= 0xaaef || ch == 0xaaf5 || ch == 0xaaf6 || ch >= 0xabe3 && ch <= 0xabea || ch == 0xabec || ch == 0xabed || ch >= 0xabf0 && ch <= 0xabf9 || ch == 0xfb1e || ch >= 0xfe00 && ch <= 0xfe0f || ch >= 0xfe20 && ch <= 0xfe2f || ch == 0xfe33 || ch == 0xfe34 || ch >= 0xfe4d && ch <= 0xfe4f || ch >= 0xff10 && ch <= 0xff19 || ch == 0xff3f; +} + +// These are a run-length and offset encoded representation of the +// >0xffff code points that are a valid part of identifiers. The +// offset starts at 0x10000, and each pair of numbers represents an +// offset to the next range, and then a size of the range. They were +// generated by bin/generate-identifier-regex.js + +static uint32_t astralIdentifierStartCodes[] = { 0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938 }; + +static uint32_t astralIdentifierCodes[] = { 509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239 }; + +// This has a complexity linear to the value of the code. The +// assumption is that looking up astral identifier characters is +// rare. +bool isInAstralIdentifierStartCodes (uint32_t code) { + uint32_t cur = 0x10000; + for (unsigned int i = 0; i < sizeof(astralIdentifierStartCodes) / sizeof(uint32_t); i += 2) { + cur += astralIdentifierStartCodes[i]; + if (cur > code) + return false; + cur += astralIdentifierStartCodes[i + 1]; + if (cur >= code) + return true; + } + return false; +} + +bool isInAstralIdentifierCodes (uint32_t code) { + uint32_t cur = 0x10000; + for (unsigned int i = 0; i < sizeof(astralIdentifierCodes) / sizeof(uint32_t); i += 2) { + cur += astralIdentifierCodes[i]; + if (cur > code) + return false; + cur += astralIdentifierCodes[i + 1]; + if (cur >= code) + return true; + } + return false; +} + +// Test whether a given character code starts an identifier. +bool isIdentifierStart(uint32_t code) { + if (code < 65) return code == 36; + if (code < 91) return true; + if (code < 97) return code == 95; + if (code < 123) return true; + if (code <= 0xffff) return code >= 0xaa && isNonASCIIidentifierStartChar(code); + return isInAstralIdentifierStartCodes(code); +} + +// Test whether a given character is part of an identifier. + +bool isIdentifierChar(uint32_t code) { + if (code < 48) return code == 36; + if (code < 58) return true; + if (code < 65) return false; + if (code < 91) return true; + if (code < 97) return code == 95; + if (code < 123) return true; + if (code <= 0xffff) return code >= 0xaa && isNonASCIIidentifierChar(code); + return isInAstralIdentifierStartCodes(code) || isInAstralIdentifierCodes(code); +} + +inline int charCodeByteLen(uint32_t ch) { + if (ch < 0x10000) return 1; + return 2; +} + +uint32_t fullCharCodeAtLast(uint16_t* bPos) { + // Gives the UTF char for backtracking surrogates + uint16_t ch = *bPos; + if ((ch & 0xFC00) == 0xDC00) + return (((*(bPos - 1) & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; + return ch; +} + +uint32_t fullCharCode(uint16_t ch) { + // Read UTF Surrogates if necessary + if ((ch & 0xFC00) == 0xD800) + return (((ch & 0x3FF) << 10) | (*(pos + 1) & 0x3FF)) + 0x10000; + return ch; +} + +bool identifier (uint16_t startCh) { + uint32_t ch = fullCharCode(startCh); + if (!isIdentifierStart(ch) && ch != '\\') + return false; + pos += charCodeByteLen(ch); + while (ch = fullCharCode(*pos)) { + if (isIdentifierChar(ch)) { + pos += charCodeByteLen(ch); + } + else if (ch == '\\') { + // no identifier escapes support for now + return false; + } + else { + break; + } + } + return true; +} + +void throwIfImportStatement () { + uint16_t* startPos = pos; + pos += 6; + uint16_t ch = commentWhitespace(); + switch (ch) { + // dynamic import + case '(': + openTokenPosStack[openTokenDepth++] = startPos; + return; + // import.meta + case '.': + syntaxError(5); + return; + + default: + // no space after "import" -> not an import keyword + if (pos == startPos + 6) + break; + case '"': + case '\'': + case '{': + case '*': + // import statement only permitted at base-level + if (openTokenDepth != 0) { + pos--; + return; + } + // import statements are a syntax error in CommonJS + syntaxError(6); + } +} + +void throwIfExportStatement () { + pos += 6; + uint16_t* curPos = pos; + uint16_t ch = commentWhitespace(); + if (pos == curPos && !isPunctuator(ch)) + return; + syntaxError(7); +} + +uint16_t commentWhitespace () { + uint16_t ch; + do { + ch = *pos; + if (ch == '/') { + uint16_t next_ch = *(pos + 1); + if (next_ch == '/') + lineComment(); + else if (next_ch == '*') + blockComment(); + else + return ch; + } + else if (!isBrOrWs(ch)) { + return ch; + } + } while (pos++ < end); + return ch; +} + +void templateString () { + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == '$' && *(pos + 1) == '{') { + pos++; + templateStack[templateStackDepth++] = templateDepth; + templateDepth = ++openTokenDepth; + return; + } + if (ch == '`') + return; + if (ch == '\\') + pos++; + } + syntaxError(8); +} + +void blockComment () { + pos++; + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == '*' && *(pos + 1) == '/') { + pos++; + return; + } + } +} + +void lineComment () { + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == '\n' || ch == '\r') + return; + } +} + +void stringLiteral (uint16_t quote) { + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == quote) + return; + if (ch == '\\') { + ch = *++pos; + if (ch == '\r' && *(pos + 1) == '\n') + pos++; + } + else if (isBr(ch)) + break; + } + syntaxError(9); +} + +uint16_t regexCharacterClass () { + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == ']') + return ch; + if (ch == '\\') + pos++; + else if (ch == '\n' || ch == '\r') + break; + } + syntaxError(10); + return '\0'; +} + +void regularExpression () { + while (pos++ < end) { + uint16_t ch = *pos; + if (ch == '/') + return; + if (ch == '[') + ch = regexCharacterClass(); + else if (ch == '\\') + pos++; + else if (ch == '\n' || ch == '\r') + break; + } + syntaxError(11); +} + +uint16_t readToWsOrPunctuator (uint16_t ch) { + do { + if (isBrOrWs(ch) || isPunctuator(ch)) + return ch; + } while (ch = *(++pos)); + return ch; +} + +// Note: non-asii BR and whitespace checks omitted for perf / footprint +// if there is a significant user need this can be reconsidered +bool isBr (uint16_t c) { + return c == '\r' || c == '\n'; +} + +bool isBrOrWs (uint16_t c) { + return c > 8 && c < 14 || c == 32 || c == 160; +} + +bool isBrOrWsOrPunctuatorNotDot (uint16_t c) { + return c > 8 && c < 14 || c == 32 || c == 160 || isPunctuator(c) && c != '.'; +} + +bool str_eq2 (uint16_t* pos, uint16_t c1, uint16_t c2) { + return *pos == c1 && *(pos + 1) == c2; +} + +bool str_eq3 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3; +} + +bool str_eq4 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4; +} + +bool str_eq5 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5; +} + +bool str_eq6 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6; +} + +bool str_eq7 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7; +} + +bool str_eq8 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8; +} + +bool str_eq9 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8 && *(pos + 8) == c9; +} + +bool str_eq10 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8 && *(pos + 8) == c9 && *(pos + 9) == c10; +} + +bool str_eq13 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8 && *(pos + 8) == c9 && *(pos + 9) == c10 && *(pos + 10) == c11 && *(pos + 11) == c12 && *(pos + 12) == c13; +} + +bool str_eq18 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13, uint16_t c14, uint16_t c15, uint16_t c16, uint16_t c17, uint16_t c18) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8 && *(pos + 8) == c9 && *(pos + 9) == c10 && *(pos + 10) == c11 && *(pos + 11) == c12 && *(pos + 12) == c13 && *(pos + 13) == c14 && *(pos + 14) == c15 && *(pos + 15) == c16 && *(pos + 16) == c17 && *(pos + 17) == c18; +} + +bool str_eq22 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7, uint16_t c8, uint16_t c9, uint16_t c10, uint16_t c11, uint16_t c12, uint16_t c13, uint16_t c14, uint16_t c15, uint16_t c16, uint16_t c17, uint16_t c18, uint16_t c19, uint16_t c20, uint16_t c21, uint16_t c22) { + return *pos == c1 && *(pos + 1) == c2 && *(pos + 2) == c3 && *(pos + 3) == c4 && *(pos + 4) == c5 && *(pos + 5) == c6 && *(pos + 6) == c7 && *(pos + 7) == c8 && *(pos + 8) == c9 && *(pos + 9) == c10 && *(pos + 10) == c11 && *(pos + 11) == c12 && *(pos + 12) == c13 && *(pos + 13) == c14 && *(pos + 14) == c15 && *(pos + 15) == c16 && *(pos + 16) == c17 && *(pos + 17) == c18 && *(pos + 18) == c19 && *(pos + 19) == c20 && *(pos + 20) == c21 && *(pos + 21) == c22; +} + +bool keywordStart (uint16_t* pos) { + return pos == source || isBrOrWsOrPunctuatorNotDot(*(pos - 1)); +} + +bool readPrecedingKeyword1 (uint16_t* pos, uint16_t c1) { + if (pos < source) return false; + return *pos == c1 && (pos == source || isBrOrWsOrPunctuatorNotDot(*(pos - 1))); +} +bool readPrecedingKeyword2 (uint16_t* pos, uint16_t c1, uint16_t c2) { + if (pos - 1 < source) return false; + return str_eq2(pos - 1, c1, c2) && (pos - 1 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 2))); +} +bool readPrecedingKeyword3 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3) { + if (pos - 2 < source) return false; + return str_eq3(pos - 2, c1, c2, c3) && (pos - 2 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 3))); +} +bool readPrecedingKeyword4 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4) { + if (pos - 3 < source) return false; + return str_eq4(pos - 3, c1, c2, c3, c4) && (pos - 3 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 4))); +} +bool readPrecedingKeyword5 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5) { + if (pos - 4 < source) return false; + return str_eq5(pos - 4, c1, c2, c3, c4, c5) && (pos - 4 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 5))); +} +bool readPrecedingKeyword6 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6) { + if (pos - 5 < source) return false; + return str_eq6(pos - 5, c1, c2, c3, c4, c5, c6) && (pos - 5 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 6))); +} +bool readPrecedingKeyword7 (uint16_t* pos, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7) { + if (pos - 6 < source) return false; + return str_eq7(pos - 6, c1, c2, c3, c4, c5, c6, c7) && (pos - 6 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 7))); +} + +// Detects one of case, debugger, delete, do, else, in, instanceof, new, +// return, throw, typeof, void, yield ,await +bool isExpressionKeyword (uint16_t* pos) { + switch (*pos) { + case 'd': + switch (*(pos - 1)) { + case 'i': + // void + return readPrecedingKeyword2(pos - 2, 'v', 'o'); + case 'l': + // yield + return readPrecedingKeyword3(pos - 2, 'y', 'i', 'e'); + default: + return false; + } + case 'e': + switch (*(pos - 1)) { + case 's': + switch (*(pos - 2)) { + case 'l': + // else + return readPrecedingKeyword1(pos - 3, 'e'); + case 'a': + // case + return readPrecedingKeyword1(pos - 3, 'c'); + default: + return false; + } + case 't': + // delete + return readPrecedingKeyword4(pos - 2, 'd', 'e', 'l', 'e'); + default: + return false; + } + case 'f': + if (*(pos - 1) != 'o' || *(pos - 2) != 'e') + return false; + switch (*(pos - 3)) { + case 'c': + // instanceof + return readPrecedingKeyword6(pos - 4, 'i', 'n', 's', 't', 'a', 'n'); + case 'p': + // typeof + return readPrecedingKeyword2(pos - 4, 't', 'y'); + default: + return false; + } + case 'n': + // in, return + return readPrecedingKeyword1(pos - 1, 'i') || readPrecedingKeyword5(pos - 1, 'r', 'e', 't', 'u', 'r'); + case 'o': + // do + return readPrecedingKeyword1(pos - 1, 'd'); + case 'r': + // debugger + return readPrecedingKeyword7(pos - 1, 'd', 'e', 'b', 'u', 'g', 'g', 'e'); + case 't': + // await + return readPrecedingKeyword4(pos - 1, 'a', 'w', 'a', 'i'); + case 'w': + switch (*(pos - 1)) { + case 'e': + // new + return readPrecedingKeyword1(pos - 2, 'n'); + case 'o': + // throw + return readPrecedingKeyword3(pos - 2, 't', 'h', 'r'); + default: + return false; + } + } + return false; +} + +bool isParenKeyword (uint16_t* curPos) { + return readPrecedingKeyword5(curPos, 'w', 'h', 'i', 'l', 'e') || + readPrecedingKeyword3(curPos, 'f', 'o', 'r') || + readPrecedingKeyword2(curPos, 'i', 'f'); +} + +bool isPunctuator (uint16_t ch) { + // 23 possible punctuator endings: !%&()*+,-./:;<=>?[]^{}|~ + return ch == '!' || ch == '%' || ch == '&' || + ch > 39 && ch < 48 || ch > 57 && ch < 64 || + ch == '[' || ch == ']' || ch == '^' || + ch > 122 && ch < 127; +} + +bool isExpressionPunctuator (uint16_t ch) { + // 20 possible expression endings: !%&(*+,-.:;<=>?[^{|~ + return ch == '!' || ch == '%' || ch == '&' || + ch > 39 && ch < 47 && ch != 41 || ch > 57 && ch < 64 || + ch == '[' || ch == '^' || ch > 122 && ch < 127 && ch != '}'; +} + +bool isExpressionTerminator (uint16_t* curPos) { + // detects: + // > ; ) -1 finally catch + // as all of these followed by a { will indicate a statement brace + switch (*curPos) { + case '>': + return *(curPos - 1) == '='; + case ';': + case ')': + return true; + case 'h': + return readPrecedingKeyword4(curPos - 1, 'c', 'a', 't', 'c'); + case 'y': + return readPrecedingKeyword6(curPos - 1, 'f', 'i', 'n', 'a', 'l', 'l'); + case 'e': + return readPrecedingKeyword3(curPos - 1, 'e', 'l', 's'); + } + return false; +} + +void bail (uint32_t err) { + error = 1; + parse_error = err; + pos = end + 1; +} + +void syntaxError (uint32_t code) { + if (error == 0) error = code; + parse_error = pos - source; + pos = end + 1; +} diff --git a/deps/cjs-module-lexer/src/src/lexer.js b/deps/cjs-module-lexer/src/src/lexer.js new file mode 100755 index 00000000000000..30bca50218e07a --- /dev/null +++ b/deps/cjs-module-lexer/src/src/lexer.js @@ -0,0 +1,282 @@ +let wasm; + +const isLE = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; + +export function parse (source, name = '@') { + if (!wasm) + throw new Error('Not initialized'); + + const len = source.length + 1; + + // need 2 bytes per code point plus analysis space so we double again + const extraMem = (wasm.__heap_base.value || wasm.__heap_base) + len * 4 - wasm.memory.buffer.byteLength; + if (extraMem > 0) + wasm.memory.grow(Math.ceil(extraMem / 65536)); + + const addr = wasm.sa(len); + (isLE ? copyLE : copyBE)(source, new Uint16Array(wasm.memory.buffer, addr, len)); + + const err_code = wasm.parseCJS(addr, source.length, 0, 0, 0); + + if (err_code) { + const err = new Error(`Parse error ${name}${wasm.e()}:${source.slice(0, wasm.e()).split('\n').length}:${wasm.e() - source.lastIndexOf('\n', wasm.e() - 1)}`); + Object.assign(err, { idx: wasm.e() }); + if (err_code === 5 || err_code === 6 || err_code === 7) + Object.assign(err, { code: 'ERR_LEXER_ESM_SYNTAX' }); + throw err; + } + + let exports = new Set(), reexports = new Set(), unsafeGetters = new Set(); + + while (wasm.rre()) { + const reexptStr = decode(source.slice(wasm.res(), wasm.ree())); + if (reexptStr) + reexports.add(reexptStr); + } + while (wasm.ru()) + unsafeGetters.add(decode(source.slice(wasm.us(), wasm.ue()))); + while (wasm.re()) { + let exptStr = decode(source.slice(wasm.es(), wasm.ee())); + if (exptStr !== undefined && !unsafeGetters.has(exptStr)) + exports.add(exptStr); + } + + return { exports: [...exports], reexports: [...reexports] }; +} + +function decode (str) { + if (str[0] === '"' || str[0] === '\'') { + try { + const decoded = scanStringLiteral(str); + // Filter to exclude non-matching UTF-16 surrogate strings + for (let i = 0; i < decoded.length; i++) { + const surrogatePrefix = decoded.charCodeAt(i) & 0xFC00; + if (surrogatePrefix < 0xD800) { + // Not a surrogate + continue; + } + else if (surrogatePrefix === 0xD800) { + // Validate surrogate pair + if ((decoded.charCodeAt(++i) & 0xFC00) !== 0xDC00) + return; + } + else { + // Out-of-range surrogate code (above 0xD800) + return; + } + } + return decoded; + } + catch {} + } + else { + return str; + } +} + + +function scanStringLiteral (source) { + const quote = source[0]; + + // try JSON.parse first for performance + if (quote === '"') { + try { + return JSON.parse(source); + } catch { + // ignored + } + } else if (quote === "'" && source.length > 1 && source[source.length - 1] === "'" && source.indexOf('"') === -1) { + try { + return JSON.parse('"' + source.slice(1, -1) + '"'); + } catch { + // ignored + } + } + + // fall back to doing it the hard way + let parsed = ''; + let index = { v: 1 }; + + while (index.v < source.length) { + const char = source[index.v]; + switch (char) { + case quote: { + return parsed; + } + case '\\': { + ++index.v; + parsed += scanEscapeSequence(source, index); + break; + } + case '\r': + case '\n': { + throw new SyntaxError(); + } + default: { + ++index.v; + parsed += char; + } + } + } + + throw new SyntaxError(); +} + +function scanEscapeSequence (source, index) { + if (index.v === source.length) { + throw new SyntaxError(); + } + const char = source[index.v]; + ++index.v; + switch (char) { + case '\r': { + if (source[index.v] === '\n') { + ++index.v; + } + // fall through + } + case '\n': + case '\u2028': + case '\u2029': { + return ''; + } + case 'r': { + return '\r'; + } + case 'n': { + return '\n'; + } + case 't': { + return '\t'; + } + case 'b': { + return '\b'; + } + case 'f': { + return '\f'; + } + case 'v': { + return '\v'; + } + case 'x': { + return scanHexEscapeSequence(source, index); + } + case 'u': { + return scanUnicodeEscapeSequence(source, index); + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + return scanOctalEscapeSequence(char, source, index); + } + default: { + return char; + } + } +} + +function scanHexEscapeSequence (source, index) { + const a = readHex(source[index.v]); + ++index.v; + const b = readHex(source[index.v]); + ++index.v; + return String.fromCodePoint(a * 16 + b); +} + +function scanUnicodeEscapeSequence (source, index) { + let result = 0; + if (source[index.v] === '{') { + ++index.v; + do { + result = result * 16 + readHex(source[index.v]); + if (result > 0x10FFFF) { + throw new SyntaxError(); + } + ++index.v; + } while (source[index.v] !== '}'); + ++index.v; + } else { + for (let i = 0; i < 4; ++i) { + result = result * 16 + readHex(source[index.v]); + ++index.v; + } + } + return String.fromCodePoint(result); +} + +function scanOctalEscapeSequence (char, source, index) { + let toRead = char <= '3' ? 2 : 1; + let result = +char; + do { + char = source[index.v]; + if (char < '0' || char > '7') { + break; + } + result = result * 8 + (+char); + ++index.v; + --toRead; + } while (toRead > 0); + return String.fromCodePoint(result); +} + +function readHex (char) { + if (char >= '0' && char <= '9') { + return +char; + } else if (char >= 'a' && char <= 'f') { + return char.charCodeAt(0) - 87; + } else if (char >= 'A' && char <= 'F') { + return char.charCodeAt(0) - 55; + } + throw new SyntaxError(); +} + + + +function copyBE (src, outBuf16) { + const len = src.length; + let i = 0; + while (i < len) { + const ch = src.charCodeAt(i); + outBuf16[i++] = (ch & 0xff) << 8 | ch >>> 8; + } +} + +function copyLE (src, outBuf16) { + const len = src.length; + let i = 0; + while (i < len) + outBuf16[i] = src.charCodeAt(i++); +} + +function getWasmBytes() { + const binary = 'WASM_BINARY'; // This string will be replaced by build.js. + if (typeof Buffer !== 'undefined') + return Buffer.from(binary, 'base64'); + return Uint8Array.from(atob(binary), x => x.charCodeAt(0)); +} + +let initPromise; +export function init () { + if (initPromise) + return initPromise; + return initPromise = (async () => { + const compiled = await WebAssembly.compile(getWasmBytes()); + const { exports } = await WebAssembly.instantiate(compiled); + wasm = exports; + })(); +} + +export function initSync () { + if (wasm) { + return; + } + const compiled = new WebAssembly.Module(getWasmBytes()); + const { exports } = new WebAssembly.Instance(compiled); + wasm = exports; + return; +} diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md index b17f502afde01f..dfc1dddd7b6a32 100644 --- a/deps/corepack/CHANGELOG.md +++ b/deps/corepack/CHANGELOG.md @@ -1,5 +1,233 @@ # Changelog +## [0.34.6](https://github.com/nodejs/corepack/compare/v0.34.5...v0.34.6) (2026-01-23) + + +### Bug Fixes + +* **docs:** fix PowerShell functions suggestions ([#784](https://github.com/nodejs/corepack/issues/784)) ([b1544c8](https://github.com/nodejs/corepack/commit/b1544c82a63781bd77d49f7b566fefd0104b7d6d)) +* update package manager versions ([#778](https://github.com/nodejs/corepack/issues/778)) ([efed597](https://github.com/nodejs/corepack/commit/efed59797d30caa362a1fa8475cd7d17dc3b7282)) + +## [0.34.5](https://github.com/nodejs/corepack/compare/v0.34.4...v0.34.5) (2025-11-24) + + +### Bug Fixes + +* **pnpm:** fix bin path for v11 ([#776](https://github.com/nodejs/corepack/issues/776)) ([0c8048a](https://github.com/nodejs/corepack/commit/0c8048adc61651f6eb798448675d3ecc4a7e26a9)) +* update package manager versions ([#773](https://github.com/nodejs/corepack/issues/773)) ([06c286b](https://github.com/nodejs/corepack/commit/06c286b5fc171e43090b5eed5cd501bc9580927f)) + +## [0.34.4](https://github.com/nodejs/corepack/compare/v0.34.3...v0.34.4) (2025-11-14) + + +### Bug Fixes + +* bump pnpm version in `config.json` ([#768](https://github.com/nodejs/corepack/issues/768)) ([99a9a6e](https://github.com/nodejs/corepack/commit/99a9a6eb1b6e918ceb896b3d558bb5ed583bdc70)) +* ignore devEngines version range when CLI provides a version ([#762](https://github.com/nodejs/corepack/issues/762)) ([ac518c4](https://github.com/nodejs/corepack/commit/ac518c4106f8d9ceb4e85e6c3614b1eba5d03fcb)) +* use `lstatSync` in `generatePosixLink` ([#767](https://github.com/nodejs/corepack/issues/767)) ([a02bea0](https://github.com/nodejs/corepack/commit/a02bea078eb584ed7492ec561626987e35386bae)) + +## [0.34.3](https://github.com/nodejs/corepack/compare/v0.34.2...v0.34.3) (2025-11-07) + + +### Bug Fixes + +* update package manager versions ([#765](https://github.com/nodejs/corepack/issues/765)) ([13a2e98](https://github.com/nodejs/corepack/commit/13a2e989ee37694a7ec1b1d60acdaa28f90642d1)) +* Yarn switch install support and tests ([#761](https://github.com/nodejs/corepack/issues/761)) ([d04d483](https://github.com/nodejs/corepack/commit/d04d4839aeecaf4fca989c577f6c000dc90be933)) + +## [0.34.2](https://github.com/nodejs/corepack/compare/v0.34.1...v0.34.2) (2025-10-31) + + +### Bug Fixes + +* bump package manager versions ([#754](https://github.com/nodejs/corepack/issues/754)) ([35e3869](https://github.com/nodejs/corepack/commit/35e3869f3f4d21bbfccdf78ea564ab0723d6f36f)) +* fix potential race condition in `node-tar` ([#757](https://github.com/nodejs/corepack/pull/757)) ([78808a7](78808a72691655fe5140c02ae41d4baef88cd9fa)) + +## [0.34.1](https://github.com/nodejs/corepack/compare/v0.34.0...v0.34.1) (2025-10-17) + + +### Bug Fixes + +* incorrect registry origin check ([#743](https://github.com/nodejs/corepack/issues/743)) ([cc840b2](https://github.com/nodejs/corepack/commit/cc840b2d232a29c225d2436d350640f0035ed28b)) +* update package manager versions ([#728](https://github.com/nodejs/corepack/issues/728)) ([78ce029](https://github.com/nodejs/corepack/commit/78ce0297a9152bb5c68f724821a9a0095b408334)) + +## [0.34.0](https://github.com/nodejs/corepack/compare/v0.33.0...v0.34.0) (2025-07-19) + + +### ⚠ BREAKING CHANGES + +* drop Node.js 18.x and 23.x support + +### Features + +* update package manager versions ([#719](https://github.com/nodejs/corepack/issues/719)) ([7707ea7](https://github.com/nodejs/corepack/commit/7707ea7350c129ad3aae8ca08e9e80fcf164dcb6)) + + +### Miscellaneous Chores + +* remove Node.js 18.x and 23.x usage, add 24.x ([#718](https://github.com/nodejs/corepack/issues/718)) ([783a42f](https://github.com/nodejs/corepack/commit/783a42fbe35371964e9dde75e2263b179f53bc0c)) + +## [0.33.0](https://github.com/nodejs/corepack/compare/v0.32.0...v0.33.0) (2025-06-02) + + +### Features + +* Adds guard to avoid stepping on Yarn's feet ([#714](https://github.com/nodejs/corepack/issues/714)) ([5fc3691](https://github.com/nodejs/corepack/commit/5fc3691354eb5bdeca17a9495b234584353f0151)) +* update package manager versions ([#671](https://github.com/nodejs/corepack/issues/671)) ([b45b3a3](https://github.com/nodejs/corepack/commit/b45b3a3244bacfbaf65188ae8c04209a1e98307d)) + + +### Bug Fixes + +* debug text typo ([#698](https://github.com/nodejs/corepack/issues/698)) ([0b94797](https://github.com/nodejs/corepack/commit/0b94797f96e30e46e466873fe7d437d0471cd92c)) + +## [0.32.0](https://github.com/nodejs/corepack/compare/v0.31.0...v0.32.0) (2025-02-28) + + +### Features + +* add limited support for `devEngines` ([#643](https://github.com/nodejs/corepack/issues/643)) ([b456268](https://github.com/nodejs/corepack/commit/b4562688513f23e37e37b0d69a0daff33ca84c8d)) +* add more informative error when fetching latest stable fails ([#644](https://github.com/nodejs/corepack/issues/644)) ([53b1fe7](https://github.com/nodejs/corepack/commit/53b1fe75c47c06bd72a8b8f8bb699a47c9ca32fb)) +* add support for `.corepack.env` ([#642](https://github.com/nodejs/corepack/issues/642)) ([9b95b46](https://github.com/nodejs/corepack/commit/9b95b46f05e50fe1c60f05309c210ba8fe4e23c5)) +* update package manager versions ([#617](https://github.com/nodejs/corepack/issues/617)) ([b83bb5e](https://github.com/nodejs/corepack/commit/b83bb5ec150980c998b9c7053dff307d912cb508)) + + +### Bug Fixes + +* do not resolve fallback descriptor when `packageManager` is defined ([#632](https://github.com/nodejs/corepack/issues/632)) ([12e77e5](https://github.com/nodejs/corepack/commit/12e77e506946d42a0de9ce8e68d75af8454d6776)) +* **doc:** fix link to proxy library ([#636](https://github.com/nodejs/corepack/issues/636)) ([bae0839](https://github.com/nodejs/corepack/commit/bae08397943d4b99437389b4286546361091f4b3)) +* replace explicit with specify as verb ([#665](https://github.com/nodejs/corepack/issues/665)) ([351d86c](https://github.com/nodejs/corepack/commit/351d86c20226a8c18bfe212be27401f2908b1595)) +* **use:** do not throw on invalid `packageManager` ([#663](https://github.com/nodejs/corepack/issues/663)) ([4be72f6](https://github.com/nodejs/corepack/commit/4be72f6941afa0c9b2b7d26635016bb7b560df8a)) + +## [0.31.0](https://github.com/nodejs/corepack/compare/v0.30.0...v0.31.0) (2025-01-27) + + +### ⚠ BREAKING CHANGES + +* drop support for Node.js 21.x ([#594](https://github.com/nodejs/corepack/issues/594)) + +### Features + +* update package manager versions ([#595](https://github.com/nodejs/corepack/issues/595)) ([c7a9bde](https://github.com/nodejs/corepack/commit/c7a9bde16dcbbb7e6ef03fef740656cde7ade360)) + + +### Bug Fixes + +* only print message for `UsageError`s ([#602](https://github.com/nodejs/corepack/issues/602)) ([72a588c](https://github.com/nodejs/corepack/commit/72a588c2370c17e415b24fe389efdafb3c84e90b)) +* update npm registry keys ([#614](https://github.com/nodejs/corepack/issues/614)) ([8c90caa](https://github.com/nodejs/corepack/commit/8c90caab7f1c5c9b89f1de113bc1dfc441bf25d2)) + + +### Miscellaneous Chores + +* drop support for Node.js 21.x ([#594](https://github.com/nodejs/corepack/issues/594)) ([8bebc0c](https://github.com/nodejs/corepack/commit/8bebc0c0a5cbcdeec41673dcbaf581e6e1c1be11)) + +## [0.30.0](https://github.com/nodejs/corepack/compare/v0.29.4...v0.30.0) (2024-11-23) + + +### Features + +* update package manager versions ([#578](https://github.com/nodejs/corepack/issues/578)) ([a286c8f](https://github.com/nodejs/corepack/commit/a286c8f5537ea9ecf9b6ff53c7bc3e8da4e3c8bb)) + + +### Performance Improvements + +* prefer `module.enableCompileCache` over `v8-compile-cache` ([#574](https://github.com/nodejs/corepack/issues/574)) ([cba6905](https://github.com/nodejs/corepack/commit/cba690575bd606faeee54bd512ccb8797d49055f)) + +## [0.29.4](https://github.com/nodejs/corepack/compare/v0.29.3...v0.29.4) (2024-09-07) + + +### Features + +* update package manager versions ([#543](https://github.com/nodejs/corepack/issues/543)) ([b819e40](https://github.com/nodejs/corepack/commit/b819e404dbb23c4ae3d5dbe55e21de74d714ee9c)) + +## [0.29.3](https://github.com/nodejs/corepack/compare/v0.29.2...v0.29.3) (2024-07-21) + + +### Bug Fixes + +* fallback to `shasum` when `integrity` is not defined ([#542](https://github.com/nodejs/corepack/issues/542)) ([eb63873](https://github.com/nodejs/corepack/commit/eb63873c6c617a2f8ac7106e26ccfe8aa3ae1fb9)) +* make `DEBUG=corepack` more useful ([#538](https://github.com/nodejs/corepack/issues/538)) ([6019d7b](https://github.com/nodejs/corepack/commit/6019d7b56e85bd8b7b58a1a487922c707e70e30e)) + +## [0.29.2](https://github.com/nodejs/corepack/compare/v0.29.1...v0.29.2) (2024-07-13) + + +### Bug Fixes + +* trigger release after 0.29.1 failed to publish ([18e29ce](https://github.com/nodejs/corepack/commit/18e29ce3c465b64d48ccf3feef7cd1be94da70b0)) + +## [0.29.1](https://github.com/nodejs/corepack/compare/v0.29.0...v0.29.1) (2024-07-13) + + +### Bug Fixes + +* trigger release after 0.29.0 failed to publish ([e6ba066](https://github.com/nodejs/corepack/commit/e6ba06657b0985c112f288932ca39c0562129566)) + +## [0.29.0](https://github.com/nodejs/corepack/compare/v0.28.2...v0.29.0) (2024-07-12) + + +### Features + +* parallelize linking, unlinking and installing ([#524](https://github.com/nodejs/corepack/issues/524)) ([f0734e6](https://github.com/nodejs/corepack/commit/f0734e6e8023ff361dac179c0d8656740d550c27)) +* update package manager versions ([#492](https://github.com/nodejs/corepack/issues/492)) ([3e3b046](https://github.com/nodejs/corepack/commit/3e3b04619cb4a91f207a72fb450f6fc4e2f01aec)) + + +### Bug Fixes + +* replace npm registry domain in tarball URL ([#502](https://github.com/nodejs/corepack/issues/502)) ([db6fae5](https://github.com/nodejs/corepack/commit/db6fae50cf44884d1e9a6f7e99402e7e807ba3ca)) +* selectively import required semver functions ([#511](https://github.com/nodejs/corepack/issues/511)) ([e7ad533](https://github.com/nodejs/corepack/commit/e7ad533d43dc9495493f0d883c3cbbb94caa1d41)) + +## [0.28.2](https://github.com/nodejs/corepack/compare/v0.28.1...v0.28.2) (2024-05-31) + + +### Features + +* update package manager versions ([#481](https://github.com/nodejs/corepack/issues/481)) ([e1abb83](https://github.com/nodejs/corepack/commit/e1abb832416a793b490b2b51b4082fe822fc932c)) + +## [0.28.1](https://github.com/nodejs/corepack/compare/v0.28.0...v0.28.1) (2024-05-10) + + +### Features + +* add support for `COREPACK_INTEGRITY_KEYS=0` ([#470](https://github.com/nodejs/corepack/issues/470)) ([f15ebc2](https://github.com/nodejs/corepack/commit/f15ebc289ebcd6a86580f15ae3c4ef0e1be37c4b)) +* update package manager versions ([#469](https://github.com/nodejs/corepack/issues/469)) ([985895b](https://github.com/nodejs/corepack/commit/985895bccb5ec68b3645c540d8500c572e1ccadb)) + + +### Bug Fixes + +* COREPACK_NPM_REGISTRY should allow for username/password auth ([#466](https://github.com/nodejs/corepack/issues/466)) ([6efa349](https://github.com/nodejs/corepack/commit/6efa34988229918debe6e881d45ba6715282f283)) + +## [0.28.0](https://github.com/nodejs/corepack/compare/v0.27.0...v0.28.0) (2024-04-20) + + +### ⚠ BREAKING CHANGES + +* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430)) + +### Bug Fixes + +* call `executePackageManagerRequest` directly ([#430](https://github.com/nodejs/corepack/issues/430)) ([0f9b748](https://github.com/nodejs/corepack/commit/0f9b74864048d5dc150a63cc582966af0c5f363f)) + +## [0.27.0](https://github.com/nodejs/corepack/compare/v0.26.0...v0.27.0) (2024-04-19) + + +### ⚠ BREAKING CHANGES + +* attempting to download a version from the npm registry (or a mirror) that was published using the now deprecated PGP signature without providing a hash will trigger an error. Users can disable the signature verification using a environment variable. + +### Features + +* separate read and write operations on lastKnownGood.json ([#446](https://github.com/nodejs/corepack/issues/446)) ([c449adc](https://github.com/nodejs/corepack/commit/c449adc81822a604ee8f00ae2b53fc411535f96d)) +* update package manager versions ([#425](https://github.com/nodejs/corepack/issues/425)) ([1423190](https://github.com/nodejs/corepack/commit/142319056424b1e0da2bdbe801c52c5910023707)) +* update package manager versions ([#462](https://github.com/nodejs/corepack/issues/462)) ([56816c2](https://github.com/nodejs/corepack/commit/56816c2b7ebc9926f07048b0ec4ff6025bb4e293)) +* verify integrity signature when downloading from npm registry ([#432](https://github.com/nodejs/corepack/issues/432)) ([e561dd0](https://github.com/nodejs/corepack/commit/e561dd00bbacc5bc15a492fc36574fa0e37bff7b)) + + +### Bug Fixes + +* add path to `package.json` in error message ([#456](https://github.com/nodejs/corepack/issues/456)) ([32a93ea](https://github.com/nodejs/corepack/commit/32a93ea4f51eb7db7dc95a16c5719695edf4b53e)) +* correctly set `Dispatcher` prototype for `ProxyAgent` ([#451](https://github.com/nodejs/corepack/issues/451)) ([73d9a1e](https://github.com/nodejs/corepack/commit/73d9a1e2d2f84906bf01952f1dca8adab576b7bf)) +* download fewer metadata from npm registry ([#436](https://github.com/nodejs/corepack/issues/436)) ([082fabf](https://github.com/nodejs/corepack/commit/082fabf8b15658e69e4fb62bb854fe9aace78b70)) +* hash check when downloading Yarn Berry from npm ([#439](https://github.com/nodejs/corepack/issues/439)) ([4672162](https://github.com/nodejs/corepack/commit/467216281e1719a739d0eeea370b335adfb37b8d)) +* Incorrect authorization prefix for basic auth, and undocumented env var ([#454](https://github.com/nodejs/corepack/issues/454)) ([2d63536](https://github.com/nodejs/corepack/commit/2d63536413971d43f570deb035845aa0bd5202f0)) +* re-add support for custom registries with auth ([#397](https://github.com/nodejs/corepack/issues/397)) ([d267753](https://github.com/nodejs/corepack/commit/d2677538cdb613fcab6d2a45bb07f349bdc65c2b)) + ## [0.26.0](https://github.com/nodejs/corepack/compare/v0.25.2...v0.26.0) (2024-03-08) diff --git a/deps/corepack/README.md b/deps/corepack/README.md index 4d65c2b1a6c3f3..1920174797a5dc 100644 --- a/deps/corepack/README.md +++ b/deps/corepack/README.md @@ -1,5 +1,7 @@ # <img src="./icon.svg" height="25" /> corepack +[![Join us on OpenJS slack (channel #nodejs-corepack)](https://img.shields.io/badge/OpenJS%20Slack-%23nodejs--corepack-blue)](https://slack-invite.openjsf.org/) + Corepack is a zero-runtime-dependency Node.js script that acts as a bridge between Node.js projects and the package managers they are intended to be used with during development. In practical terms, **Corepack lets you use Yarn, npm, @@ -9,7 +11,7 @@ and pnpm without having to install them**. ### Default Installs -Corepack is [distributed by default with all recent Node.js versions](https://nodejs.org/api/corepack.html). +Corepack is distributed with Node.js from version 14.19.0 up to (but not including) 25.0.0. Run `corepack enable` to install the required Yarn and pnpm binaries on your path. ### Manual Installs @@ -39,6 +41,25 @@ is distributed along with Node.js itself. </details> +<details><summary>Update Corepack using npm</summary> + +To install the latest version of Corepack, use: + +```shell +npm install -g corepack@latest +``` + +If Corepack was installed on your system using a Node.js Windows Installer +`.msi` package then you might need to remove it before attempting to install a +different version of Corepack using npm. You can select the Modify option of the +Node.js app settings to access the Windows Installer feature selection, and on +the "corepack manager" feature of the Node.js `.msi` package by selecting +"Entire feature will be unavailable". See +[Repair apps and programs in Windows](https://support.microsoft.com/en-us/windows/repair-apps-and-programs-in-windows-e90eefe4-d0a2-7c1b-dd59-949a9030f317) +for instructions on accessing the Windows apps page to modify settings. + +</details> + <details><summary>Install Corepack from source</summary> See [`CONTRIBUTING.md`](./CONTRIBUTING.md). @@ -54,7 +75,7 @@ projects, `pnpm install` in pnpm projects, and `npm` in npm projects. Corepack will catch these calls, and depending on the situation: - **If the local project is configured for the package manager you're using**, - Corepack will silently download and cache the latest compatible version. + Corepack will download and cache the latest compatible version. - **If the local project is configured for a different package manager**, Corepack will request you to run the command again using the right package @@ -92,6 +113,35 @@ use in the archive). } ``` +#### `devEngines.packageManager` + +When a `devEngines.packageManager` field is defined, and is an object containing +a `"name"` field (can also optionally contain `version` and `onFail` fields), +Corepack will use it to validate you're using a compatible package manager. + +Depending on the value of `devEngines.packageManager.onFail`: + +- if set to `ignore`, Corepack won't print any warning or error. +- if unset or set to `error`, Corepack will throw an error in case of a mismatch. +- if set to `warn` or some other value, Corepack will print a warning in case + of mismatch. + +If the top-level `packageManager` field is missing, Corepack will use the +package manager defined in `devEngines.packageManager` – in which case you must +provide a specific version in `devEngines.packageManager.version`, ideally with +a hash, as explained in the previous section: + +```json +{ + "devEngines":{ + "packageManager": { + "name": "yarn", + "version": "3.2.3+sha224.953c8233f7a92884eee2de69a1b92d1f2ec1655e66d08071ba9a02fa" + } + } +} +``` + ## Known Good Releases When running Corepack within projects that don't list a supported package @@ -169,12 +219,12 @@ On Windows PowerShell, you can add functions using the `$PROFILE` automatic variable: ```powershell -echo "function yarn { corepack yarn `$args }" >> $PROFILE -echo "function yarnpkg { corepack yarnpkg `$args }" >> $PROFILE -echo "function pnpm { corepack pnpm `$args }" >> $PROFILE -echo "function pnpx { corepack pnpx `$args }" >> $PROFILE -echo "function npm { corepack npm `$args }" >> $PROFILE -echo "function npx { corepack npx `$args }" >> $PROFILE +echo 'function yarn { corepack yarn @args }' >> $PROFILE +echo 'function yarnpkg { corepack yarnpkg @args }' >> $PROFILE +echo 'function pnpm { corepack pnpm @args }' >> $PROFILE +echo 'function pnpx { corepack pnpx @args }' >> $PROFILE +echo 'function npm { corepack npm @args }' >> $PROFILE +echo 'function npx { corepack npx @args }' >> $PROFILE ``` ### `corepack disable [... name]` @@ -225,6 +275,7 @@ it. Unlike `corepack use` this command doesn't take a package manager name nor a version range, as it will always select the latest available version from the +range specified in `devEngines.packageManager.version`, or fallback to the same major line. Should you need to upgrade to a new major, use an explicit `corepack use {name}@latest` call (or simply `corepack use {name}`). @@ -235,8 +286,8 @@ same major line. Should you need to upgrade to a new major, use an explicit package manager, and to not update the Last Known Good version when it downloads a new version of the same major line. -- `COREPACK_ENABLE_AUTO_PIN` can be set to `0` to prevent Corepack from - updating the `packageManager` field when it detects that the local package +- `COREPACK_ENABLE_AUTO_PIN` can be set to `1` to instruct Corepack to + update the `packageManager` field when it detects that the local package doesn't list it. In general we recommend to always list a `packageManager` field (which you can easily set through `corepack use [name]@[version]`), as it ensures that your project installs are always deterministic. @@ -245,7 +296,8 @@ same major line. Should you need to upgrade to a new major, use an explicit prevent Corepack showing the URL when it needs to download software, or can be set to `1` to have the URL shown. By default, when Corepack is called explicitly (e.g. `corepack pnpm …`), it is set to `0`; when Corepack is called - implicitely (e.g. `pnpm …`), it is set to `1`. + implicitly (e.g. `pnpm …`), it is set to `1`. + The default value cannot be overridden in a `.corepack.env` file. When standard input is a TTY and no CI environment is detected, Corepack will ask for user input before starting the download. @@ -271,6 +323,14 @@ same major line. Should you need to upgrade to a new major, use an explicit project. This means that it will always use the system-wide package manager regardless of what is being specified in the project's `packageManager` field. +- `COREPACK_ENV_FILE` can be set to `0` to request Corepack to not attempt to + load `.corepack.env`; it can be set to a path to specify a different env file. + Only keys that start with `COREPACK_` and are not in the exception list + (`COREPACK_ENABLE_DOWNLOAD_PROMPT` and `COREPACK_ENV_FILE` are ignored) + will be taken into account. + For Node.js 18.x users, this setting has no effect as that version doesn't + support parsing of `.env` files. + - `COREPACK_HOME` can be set in order to define where Corepack should install the package managers. By default it is set to `%LOCALAPPDATA%\node\corepack` on Windows, and to `$HOME/.cache/node/corepack` everywhere else. @@ -292,13 +352,20 @@ same major line. Should you need to upgrade to a new major, use an explicit empty password, explicitly set `COREPACK_NPM_PASSWORD` to an empty string. - `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` are supported through - [`node-proxy-agent`](https://github.com/TooTallNate/node-proxy-agent). + [`proxy-from-env`](https://github.com/Rob--W/proxy-from-env). + +- `COREPACK_INTEGRITY_KEYS` can be set to an empty string or `0` to + instruct Corepack to skip integrity checks, or to a JSON string containing + custom keys. ## Troubleshooting +The environment variable `DEBUG` can be set to `corepack` to enable additional debug logging. + ### Networking -There are a wide variety of networking issues that can occur while running `corepack` commands. Things to check: +There are a wide variety of networking issues that can occur while running +`corepack` commands. Things to check: - Make sure your network connection is active. - Make sure the host for your request can be resolved by your DNS; try using diff --git a/deps/corepack/dist/corepack.js b/deps/corepack/dist/corepack.js index b1b22662466f86..6179b11c083cb5 100755 --- a/deps/corepack/dist/corepack.js +++ b/deps/corepack/dist/corepack.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='0'; +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(process.argv.slice(2)); \ No newline at end of file diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs index 7b378339d0577f..2d570f7b70233c 100644 --- a/deps/corepack/dist/lib/corepack.cjs +++ b/deps/corepack/dist/lib/corepack.cjs @@ -12,14 +12,14 @@ var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); + for (var name2 in all) + __defProp(target, name2, { get: all[name2], enumerable: true }); }; -var __copyProps = (to, from, except, desc) => { +var __copyProps = (to, from, except, desc2) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable }); } return to; }; @@ -604,12 +604,12 @@ function as(value, validator, { coerce = false, errors: storeErrors, throw: thro } function fn(validators, fn2) { const isValidArgList = isTuple(validators); - return (...args) => { + return ((...args) => { const check = isValidArgList(args); if (!check) throw new TypeAssertionError(); return fn2(...args); - }; + }); } function hasMinLength(length) { return makeValidator({ @@ -1037,9 +1037,73 @@ var init_lib = __esm({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/constants.js +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/platform/node.js +var require_node = __commonJS({ + ".yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/platform/node.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + var tty2 = require("tty"); + function _interopDefaultLegacy(e) { + return e && typeof e === "object" && "default" in e ? e : { "default": e }; + } + var tty__default = /* @__PURE__ */ _interopDefaultLegacy(tty2); + function getDefaultColorDepth2() { + if (tty__default["default"] && `getColorDepth` in tty__default["default"].WriteStream.prototype) + return tty__default["default"].WriteStream.prototype.getColorDepth(); + if (process.env.FORCE_COLOR === `0`) + return 1; + if (process.env.FORCE_COLOR === `1`) + return 8; + if (typeof process.stdout !== `undefined` && process.stdout.isTTY) + return 8; + return 1; + } + var gContextStorage; + function getCaptureActivator2(context) { + let contextStorage = gContextStorage; + if (typeof contextStorage === `undefined`) { + if (context.stdout === process.stdout && context.stderr === process.stderr) + return null; + const { AsyncLocalStorage: LazyAsyncLocalStorage } = require("async_hooks"); + contextStorage = gContextStorage = new LazyAsyncLocalStorage(); + const origStdoutWrite = process.stdout._write; + process.stdout._write = function(chunk, encoding, cb) { + const context2 = contextStorage.getStore(); + if (typeof context2 === `undefined`) + return origStdoutWrite.call(this, chunk, encoding, cb); + return context2.stdout.write(chunk, encoding, cb); + }; + const origStderrWrite = process.stderr._write; + process.stderr._write = function(chunk, encoding, cb) { + const context2 = contextStorage.getStore(); + if (typeof context2 === `undefined`) + return origStderrWrite.call(this, chunk, encoding, cb); + return context2.stderr.write(chunk, encoding, cb); + }; + } + return (fn2) => { + return contextStorage.run(context, fn2); + }; + } + exports2.getCaptureActivator = getCaptureActivator2; + exports2.getDefaultColorDepth = getDefaultColorDepth2; + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js +var require_debug = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js"(exports2, module2) { + "use strict"; + var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { + }; + module2.exports = debug2; + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js var require_constants = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/constants.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js"(exports2, module2) { + "use strict"; var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -1068,29 +1132,22 @@ var require_constants = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/debug.js -var require_debug = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/debug.js"(exports, module2) { - var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { - }; - module2.exports = debug2; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/re.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js var require_re = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/re.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js"(exports2, module2) { + "use strict"; var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH } = require_constants(); var debug2 = require_debug(); - exports = module2.exports = {}; - var re = exports.re = []; - var safeRe = exports.safeRe = []; - var src = exports.src = []; - var t = exports.t = {}; + exports2 = module2.exports = {}; + var re = exports2.re = []; + var safeRe = exports2.safeRe = []; + var src = exports2.src = []; + var safeSrc = exports2.safeSrc = []; + var t = exports2.t = {}; var R = 0; var LETTERDASHNUMBER = "[a-zA-Z0-9-]"; var safeRegexReplacements = [ @@ -1104,12 +1161,13 @@ var require_re = __commonJS({ } return value; }; - var createToken = (name, value, isGlobal) => { + var createToken = (name2, value, isGlobal) => { const safe = makeSafeRegex(value); const index = R++; - debug2(name, index, value); - t[name] = index; + debug2(name2, index, value); + t[name2] = index; src[index] = value; + safeSrc[index] = safe; re[index] = new RegExp(value, isGlobal ? "g" : void 0); safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0); }; @@ -1118,8 +1176,8 @@ var require_re = __commonJS({ createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`); createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`); createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`); - createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`); - createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`); createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`); createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`); createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`); @@ -1135,22 +1193,25 @@ var require_re = __commonJS({ createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`); createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`); createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`); - createToken("COERCE", `${"(^|[^\\d])(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:$|[^\\d])`); + createToken("COERCEPLAIN", `${"(^|[^\\d])(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`); + createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`); + createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`); createToken("COERCERTL", src[t.COERCE], true); + createToken("COERCERTLFULL", src[t.COERCEFULL], true); createToken("LONETILDE", "(?:~>?)"); createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true); - exports.tildeTrimReplace = "$1~"; + exports2.tildeTrimReplace = "$1~"; createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`); createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`); createToken("LONECARET", "(?:\\^)"); createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true); - exports.caretTrimReplace = "$1^"; + exports2.caretTrimReplace = "$1^"; createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`); createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`); createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`); createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`); createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true); - exports.comparatorTrimReplace = "$1$2$3"; + exports2.comparatorTrimReplace = "$1$2$3"; createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`); createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`); createToken("STAR", "(<|>)?=?\\s*\\*"); @@ -1159,9 +1220,10 @@ var require_re = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/parse-options.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js var require_parse_options = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/parse-options.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js"(exports2, module2) { + "use strict"; var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -1177,11 +1239,15 @@ var require_parse_options = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/identifiers.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js var require_identifiers = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/internal/identifiers.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js"(exports2, module2) { + "use strict"; var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { + if (typeof a === "number" && typeof b === "number") { + return a === b ? 0 : a < b ? -1 : 1; + } const anum = numeric.test(a); const bnum = numeric.test(b); if (anum && bnum) { @@ -1198,15 +1264,16 @@ var require_identifiers = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/semver.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js var require_semver = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/semver.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js"(exports2, module2) { + "use strict"; var debug2 = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); var { safeRe: re, t } = require_re(); var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); - var SemVer = class _SemVer { + var SemVer3 = class _SemVer { constructor(version2, options) { options = parseOptions(options); if (version2 instanceof _SemVer) { @@ -1287,7 +1354,25 @@ var require_semver = __commonJS({ if (!(other instanceof _SemVer)) { other = new _SemVer(other, this.options); } - return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); + if (this.major < other.major) { + return -1; + } + if (this.major > other.major) { + return 1; + } + if (this.minor < other.minor) { + return -1; + } + if (this.minor > other.minor) { + return 1; + } + if (this.patch < other.patch) { + return -1; + } + if (this.patch > other.patch) { + return 1; + } + return 0; } comparePre(other) { if (!(other instanceof _SemVer)) { @@ -1326,7 +1411,7 @@ var require_semver = __commonJS({ do { const a = this.build[i]; const b = other.build[i]; - debug2("prerelease compare", i, a, b); + debug2("build compare", i, a, b); if (a === void 0 && b === void 0) { return 0; } else if (b === void 0) { @@ -1343,6 +1428,17 @@ var require_semver = __commonJS({ // preminor will bump the version up to the next minor release, and immediately // down to pre-release. premajor and prepatch work the same way. inc(release, identifier, identifierBase) { + if (release.startsWith("pre")) { + if (!identifier && identifierBase === false) { + throw new Error("invalid increment argument: identifier is empty"); + } + if (identifier) { + const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]); + if (!match || match[1] !== identifier) { + throw new Error(`invalid identifier: ${identifier}`); + } + } + } switch (release) { case "premajor": this.prerelease.length = 0; @@ -1362,12 +1458,20 @@ var require_semver = __commonJS({ this.inc("patch", identifier, identifierBase); this.inc("pre", identifier, identifierBase); break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. case "prerelease": if (this.prerelease.length === 0) { this.inc("patch", identifier, identifierBase); } this.inc("pre", identifier, identifierBase); break; + case "release": + if (this.prerelease.length === 0) { + throw new Error(`version ${this.raw} is not a prerelease`); + } + this.prerelease.length = 0; + break; case "major": if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) { this.major++; @@ -1389,11 +1493,10 @@ var require_semver = __commonJS({ } this.prerelease = []; break; + // This probably shouldn't be used publicly. + // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. case "pre": { const base = Number(identifierBase) ? 1 : 0; - if (!identifier && identifierBase === false) { - throw new Error("invalid increment argument: identifier is empty"); - } if (this.prerelease.length === 0) { this.prerelease = [base]; } else { @@ -1436,20 +1539,41 @@ var require_semver = __commonJS({ return this; } }; - module2.exports = SemVer; + module2.exports = SemVer3; + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js +var require_compare = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js"(exports2, module2) { + "use strict"; + var SemVer3 = require_semver(); + var compare = (a, b, loose) => new SemVer3(a, loose).compare(new SemVer3(b, loose)); + module2.exports = compare; + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js +var require_rcompare = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js"(exports2, module2) { + "use strict"; + var compare = require_compare(); + var rcompare = (a, b, loose) => compare(b, a, loose); + module2.exports = rcompare; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/parse.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js var require_parse = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/parse.js"(exports, module2) { - var SemVer = require_semver(); - var parse = (version2, options, throwErrors = false) => { - if (version2 instanceof SemVer) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js"(exports2, module2) { + "use strict"; + var SemVer3 = require_semver(); + var parse4 = (version2, options, throwErrors = false) => { + if (version2 instanceof SemVer3) { return version2; } try { - return new SemVer(version2, options); + return new SemVer3(version2, options); } catch (er) { if (!throwErrors) { return null; @@ -1457,255 +1581,125 @@ var require_parse = __commonJS({ throw er; } }; - module2.exports = parse; + module2.exports = parse4; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/valid.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js var require_valid = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/valid.js"(exports, module2) { - var parse = require_parse(); + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js"(exports2, module2) { + "use strict"; + var parse4 = require_parse(); var valid = (version2, options) => { - const v = parse(version2, options); + const v = parse4(version2, options); return v ? v.version : null; }; module2.exports = valid; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/clean.js -var require_clean = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/clean.js"(exports, module2) { - var parse = require_parse(); - var clean = (version2, options) => { - const s = parse(version2.trim().replace(/^[=v]+/, ""), options); - return s ? s.version : null; - }; - module2.exports = clean; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/inc.js -var require_inc = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/inc.js"(exports, module2) { - var SemVer = require_semver(); - var inc = (version2, release, options, identifier, identifierBase) => { - if (typeof options === "string") { - identifierBase = identifier; - identifier = options; - options = void 0; - } - try { - return new SemVer( - version2 instanceof SemVer ? version2.version : version2, - options - ).inc(release, identifier, identifierBase).version; - } catch (er) { - return null; - } - }; - module2.exports = inc; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/diff.js -var require_diff = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/diff.js"(exports, module2) { - var parse = require_parse(); - var diff = (version1, version2) => { - const v1 = parse(version1, null, true); - const v2 = parse(version2, null, true); - const comparison = v1.compare(v2); - if (comparison === 0) { - return null; +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js +var require_lrucache = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js"(exports2, module2) { + "use strict"; + var LRUCache = class { + constructor() { + this.max = 1e3; + this.map = /* @__PURE__ */ new Map(); } - const v1Higher = comparison > 0; - const highVersion = v1Higher ? v1 : v2; - const lowVersion = v1Higher ? v2 : v1; - const highHasPre = !!highVersion.prerelease.length; - const lowHasPre = !!lowVersion.prerelease.length; - if (lowHasPre && !highHasPre) { - if (!lowVersion.patch && !lowVersion.minor) { - return "major"; - } - if (highVersion.patch) { - return "patch"; - } - if (highVersion.minor) { - return "minor"; + get(key) { + const value = this.map.get(key); + if (value === void 0) { + return void 0; + } else { + this.map.delete(key); + this.map.set(key, value); + return value; } - return "major"; } - const prefix = highHasPre ? "pre" : ""; - if (v1.major !== v2.major) { - return prefix + "major"; - } - if (v1.minor !== v2.minor) { - return prefix + "minor"; + delete(key) { + return this.map.delete(key); } - if (v1.patch !== v2.patch) { - return prefix + "patch"; + set(key, value) { + const deleted = this.delete(key); + if (!deleted && value !== void 0) { + if (this.map.size >= this.max) { + const firstKey = this.map.keys().next().value; + this.delete(firstKey); + } + this.map.set(key, value); + } + return this; } - return "prerelease"; - }; - module2.exports = diff; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/major.js -var require_major = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/major.js"(exports, module2) { - var SemVer = require_semver(); - var major = (a, loose) => new SemVer(a, loose).major; - module2.exports = major; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/minor.js -var require_minor = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/minor.js"(exports, module2) { - var SemVer = require_semver(); - var minor = (a, loose) => new SemVer(a, loose).minor; - module2.exports = minor; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/patch.js -var require_patch = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/patch.js"(exports, module2) { - var SemVer = require_semver(); - var patch = (a, loose) => new SemVer(a, loose).patch; - module2.exports = patch; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/prerelease.js -var require_prerelease = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/prerelease.js"(exports, module2) { - var parse = require_parse(); - var prerelease = (version2, options) => { - const parsed = parse(version2, options); - return parsed && parsed.prerelease.length ? parsed.prerelease : null; }; - module2.exports = prerelease; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare.js -var require_compare = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare.js"(exports, module2) { - var SemVer = require_semver(); - var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose)); - module2.exports = compare; + module2.exports = LRUCache; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/rcompare.js -var require_rcompare = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/rcompare.js"(exports, module2) { +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js +var require_eq = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); - var rcompare = (a, b, loose) => compare(b, a, loose); - module2.exports = rcompare; + var eq = (a, b, loose) => compare(a, b, loose) === 0; + module2.exports = eq; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare-loose.js -var require_compare_loose = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare-loose.js"(exports, module2) { +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js +var require_neq = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); - var compareLoose = (a, b) => compare(a, b, true); - module2.exports = compareLoose; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare-build.js -var require_compare_build = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/compare-build.js"(exports, module2) { - var SemVer = require_semver(); - var compareBuild = (a, b, loose) => { - const versionA = new SemVer(a, loose); - const versionB = new SemVer(b, loose); - return versionA.compare(versionB) || versionA.compareBuild(versionB); - }; - module2.exports = compareBuild; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/sort.js -var require_sort = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/sort.js"(exports, module2) { - var compareBuild = require_compare_build(); - var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)); - module2.exports = sort; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/rsort.js -var require_rsort = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/rsort.js"(exports, module2) { - var compareBuild = require_compare_build(); - var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)); - module2.exports = rsort; + var neq = (a, b, loose) => compare(a, b, loose) !== 0; + module2.exports = neq; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/gt.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js var require_gt = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/gt.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module2.exports = gt; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/lt.js -var require_lt = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/lt.js"(exports, module2) { - var compare = require_compare(); - var lt = (a, b, loose) => compare(a, b, loose) < 0; - module2.exports = lt; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/eq.js -var require_eq = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/eq.js"(exports, module2) { - var compare = require_compare(); - var eq = (a, b, loose) => compare(a, b, loose) === 0; - module2.exports = eq; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/neq.js -var require_neq = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/neq.js"(exports, module2) { +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js +var require_gte = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); - var neq = (a, b, loose) => compare(a, b, loose) !== 0; - module2.exports = neq; + var gte = (a, b, loose) => compare(a, b, loose) >= 0; + module2.exports = gte; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/gte.js -var require_gte = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/gte.js"(exports, module2) { +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js +var require_lt = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); - var gte = (a, b, loose) => compare(a, b, loose) >= 0; - module2.exports = gte; + var lt = (a, b, loose) => compare(a, b, loose) < 0; + module2.exports = lt; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/lte.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js var require_lte = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/lte.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module2.exports = lte; } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/cmp.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js var require_cmp = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/cmp.js"(exports, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js"(exports2, module2) { + "use strict"; var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -1752,702 +1746,125 @@ var require_cmp = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/coerce.js -var require_coerce = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/coerce.js"(exports, module2) { - var SemVer = require_semver(); - var parse = require_parse(); - var { safeRe: re, t } = require_re(); - var coerce = (version2, options) => { - if (version2 instanceof SemVer) { - return version2; - } - if (typeof version2 === "number") { - version2 = String(version2); - } - if (typeof version2 !== "string") { - return null; +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js +var require_comparator = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js"(exports2, module2) { + "use strict"; + var ANY = Symbol("SemVer ANY"); + var Comparator = class _Comparator { + static get ANY() { + return ANY; } - options = options || {}; - let match = null; - if (!options.rtl) { - match = version2.match(re[t.COERCE]); - } else { - let next; - while ((next = re[t.COERCERTL].exec(version2)) && (!match || match.index + match[0].length !== version2.length)) { - if (!match || next.index + next[0].length !== match.index + match[0].length) { - match = next; + constructor(comp, options) { + options = parseOptions(options); + if (comp instanceof _Comparator) { + if (comp.loose === !!options.loose) { + return comp; + } else { + comp = comp.value; } - re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length; } - re[t.COERCERTL].lastIndex = -1; - } - if (match === null) { - return null; + comp = comp.trim().split(/\s+/).join(" "); + debug2("comparator", comp, options); + this.options = options; + this.loose = !!options.loose; + this.parse(comp); + if (this.semver === ANY) { + this.value = ""; + } else { + this.value = this.operator + this.semver.version; + } + debug2("comp", this); } - return parse(`${match[2]}.${match[3] || "0"}.${match[4] || "0"}`, options); - }; - module2.exports = coerce; - } -}); - -// .yarn/cache/yallist-npm-4.0.0-b493d9e907-2286b5e8db.zip/node_modules/yallist/iterator.js -var require_iterator = __commonJS({ - ".yarn/cache/yallist-npm-4.0.0-b493d9e907-2286b5e8db.zip/node_modules/yallist/iterator.js"(exports, module2) { - "use strict"; - module2.exports = function(Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value; + parse(comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; + const m = comp.match(r); + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`); } - }; - }; - } -}); - -// .yarn/cache/yallist-npm-4.0.0-b493d9e907-2286b5e8db.zip/node_modules/yallist/yallist.js -var require_yallist = __commonJS({ - ".yarn/cache/yallist-npm-4.0.0-b493d9e907-2286b5e8db.zip/node_modules/yallist/yallist.js"(exports, module2) { - "use strict"; - module2.exports = Yallist; - Yallist.Node = Node; - Yallist.create = Yallist; - function Yallist(list) { - var self2 = this; - if (!(self2 instanceof Yallist)) { - self2 = new Yallist(); - } - self2.tail = null; - self2.head = null; - self2.length = 0; - if (list && typeof list.forEach === "function") { - list.forEach(function(item) { - self2.push(item); - }); - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self2.push(arguments[i]); + this.operator = m[1] !== void 0 ? m[1] : ""; + if (this.operator === "=") { + this.operator = ""; + } + if (!m[2]) { + this.semver = ANY; + } else { + this.semver = new SemVer3(m[2], this.options.loose); } } - return self2; - } - Yallist.prototype.removeNode = function(node) { - if (node.list !== this) { - throw new Error("removing node which does not belong to this list"); - } - var next = node.next; - var prev = node.prev; - if (next) { - next.prev = prev; - } - if (prev) { - prev.next = next; - } - if (node === this.head) { - this.head = next; + toString() { + return this.value; } - if (node === this.tail) { - this.tail = prev; + test(version2) { + debug2("Comparator.test", version2, this.options.loose); + if (this.semver === ANY || version2 === ANY) { + return true; + } + if (typeof version2 === "string") { + try { + version2 = new SemVer3(version2, this.options); + } catch (er) { + return false; + } + } + return cmp(version2, this.operator, this.semver, this.options); } - node.list.length--; - node.next = null; - node.prev = null; - node.list = null; - return next; - }; - Yallist.prototype.unshiftNode = function(node) { - if (node === this.head) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - var head = this.head; - node.list = this; - node.next = head; - if (head) { - head.prev = node; - } - this.head = node; - if (!this.tail) { - this.tail = node; - } - this.length++; - }; - Yallist.prototype.pushNode = function(node) { - if (node === this.tail) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - var tail = this.tail; - node.list = this; - node.prev = tail; - if (tail) { - tail.next = node; - } - this.tail = node; - if (!this.head) { - this.head = node; - } - this.length++; - }; - Yallist.prototype.push = function() { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]); - } - return this.length; - }; - Yallist.prototype.unshift = function() { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]); - } - return this.length; - }; - Yallist.prototype.pop = function() { - if (!this.tail) { - return void 0; - } - var res = this.tail.value; - this.tail = this.tail.prev; - if (this.tail) { - this.tail.next = null; - } else { - this.head = null; - } - this.length--; - return res; - }; - Yallist.prototype.shift = function() { - if (!this.head) { - return void 0; - } - var res = this.head.value; - this.head = this.head.next; - if (this.head) { - this.head.prev = null; - } else { - this.tail = null; - } - this.length--; - return res; - }; - Yallist.prototype.forEach = function(fn2, thisp) { - thisp = thisp || this; - for (var walker = this.head, i = 0; walker !== null; i++) { - fn2.call(thisp, walker.value, i, this); - walker = walker.next; - } - }; - Yallist.prototype.forEachReverse = function(fn2, thisp) { - thisp = thisp || this; - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn2.call(thisp, walker.value, i, this); - walker = walker.prev; - } - }; - Yallist.prototype.get = function(n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - walker = walker.next; - } - if (i === n && walker !== null) { - return walker.value; - } - }; - Yallist.prototype.getReverse = function(n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - walker = walker.prev; - } - if (i === n && walker !== null) { - return walker.value; - } - }; - Yallist.prototype.map = function(fn2, thisp) { - thisp = thisp || this; - var res = new Yallist(); - for (var walker = this.head; walker !== null; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.next; - } - return res; - }; - Yallist.prototype.mapReverse = function(fn2, thisp) { - thisp = thisp || this; - var res = new Yallist(); - for (var walker = this.tail; walker !== null; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.prev; - } - return res; - }; - Yallist.prototype.reduce = function(fn2, initial) { - var acc; - var walker = this.head; - if (arguments.length > 1) { - acc = initial; - } else if (this.head) { - walker = this.head.next; - acc = this.head.value; - } else { - throw new TypeError("Reduce of empty list with no initial value"); - } - for (var i = 0; walker !== null; i++) { - acc = fn2(acc, walker.value, i); - walker = walker.next; - } - return acc; - }; - Yallist.prototype.reduceReverse = function(fn2, initial) { - var acc; - var walker = this.tail; - if (arguments.length > 1) { - acc = initial; - } else if (this.tail) { - walker = this.tail.prev; - acc = this.tail.value; - } else { - throw new TypeError("Reduce of empty list with no initial value"); - } - for (var i = this.length - 1; walker !== null; i--) { - acc = fn2(acc, walker.value, i); - walker = walker.prev; - } - return acc; - }; - Yallist.prototype.toArray = function() { - var arr = new Array(this.length); - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value; - walker = walker.next; - } - return arr; - }; - Yallist.prototype.toArrayReverse = function() { - var arr = new Array(this.length); - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value; - walker = walker.prev; - } - return arr; - }; - Yallist.prototype.slice = function(from, to) { - to = to || this.length; - if (to < 0) { - to += this.length; - } - from = from || 0; - if (from < 0) { - from += this.length; - } - var ret = new Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next; - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value); - } - return ret; - }; - Yallist.prototype.sliceReverse = function(from, to) { - to = to || this.length; - if (to < 0) { - to += this.length; - } - from = from || 0; - if (from < 0) { - from += this.length; - } - var ret = new Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev; - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value); - } - return ret; - }; - Yallist.prototype.splice = function(start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1; - } - if (start < 0) { - start = this.length + start; - } - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next; - } - var ret = []; - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value); - walker = this.removeNode(walker); - } - if (walker === null) { - walker = this.tail; - } - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev; - } - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]); - } - return ret; - }; - Yallist.prototype.reverse = function() { - var head = this.head; - var tail = this.tail; - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev; - walker.prev = walker.next; - walker.next = p; - } - this.head = tail; - this.tail = head; - return this; - }; - function insert(self2, node, value) { - var inserted = node === self2.head ? new Node(value, null, node, self2) : new Node(value, node, node.next, self2); - if (inserted.next === null) { - self2.tail = inserted; - } - if (inserted.prev === null) { - self2.head = inserted; - } - self2.length++; - return inserted; - } - function push(self2, item) { - self2.tail = new Node(item, self2.tail, null, self2); - if (!self2.head) { - self2.head = self2.tail; - } - self2.length++; - } - function unshift(self2, item) { - self2.head = new Node(item, null, self2.head, self2); - if (!self2.tail) { - self2.tail = self2.head; - } - self2.length++; - } - function Node(value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list); - } - this.list = list; - this.value = value; - if (prev) { - prev.next = this; - this.prev = prev; - } else { - this.prev = null; - } - if (next) { - next.prev = this; - this.next = next; - } else { - this.next = null; - } - } - try { - require_iterator()(Yallist); - } catch (er) { - } - } -}); - -// .yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-cb53e58278.zip/node_modules/lru-cache/index.js -var require_lru_cache = __commonJS({ - ".yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-cb53e58278.zip/node_modules/lru-cache/index.js"(exports, module2) { - "use strict"; - var Yallist = require_yallist(); - var MAX = Symbol("max"); - var LENGTH = Symbol("length"); - var LENGTH_CALCULATOR = Symbol("lengthCalculator"); - var ALLOW_STALE = Symbol("allowStale"); - var MAX_AGE = Symbol("maxAge"); - var DISPOSE = Symbol("dispose"); - var NO_DISPOSE_ON_SET = Symbol("noDisposeOnSet"); - var LRU_LIST = Symbol("lruList"); - var CACHE = Symbol("cache"); - var UPDATE_AGE_ON_GET = Symbol("updateAgeOnGet"); - var naiveLength = () => 1; - var LRUCache = class { - constructor(options) { - if (typeof options === "number") - options = { max: options }; - if (!options) - options = {}; - if (options.max && (typeof options.max !== "number" || options.max < 0)) - throw new TypeError("max must be a non-negative number"); - const max = this[MAX] = options.max || Infinity; - const lc = options.length || naiveLength; - this[LENGTH_CALCULATOR] = typeof lc !== "function" ? naiveLength : lc; - this[ALLOW_STALE] = options.stale || false; - if (options.maxAge && typeof options.maxAge !== "number") - throw new TypeError("maxAge must be a number"); - this[MAX_AGE] = options.maxAge || 0; - this[DISPOSE] = options.dispose; - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false; - this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false; - this.reset(); - } - // resize the cache when the max changes. - set max(mL) { - if (typeof mL !== "number" || mL < 0) - throw new TypeError("max must be a non-negative number"); - this[MAX] = mL || Infinity; - trim(this); - } - get max() { - return this[MAX]; - } - set allowStale(allowStale) { - this[ALLOW_STALE] = !!allowStale; - } - get allowStale() { - return this[ALLOW_STALE]; - } - set maxAge(mA) { - if (typeof mA !== "number") - throw new TypeError("maxAge must be a non-negative number"); - this[MAX_AGE] = mA; - trim(this); - } - get maxAge() { - return this[MAX_AGE]; - } - // resize the cache when the lengthCalculator changes. - set lengthCalculator(lC) { - if (typeof lC !== "function") - lC = naiveLength; - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC; - this[LENGTH] = 0; - this[LRU_LIST].forEach((hit) => { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key); - this[LENGTH] += hit.length; - }); - } - trim(this); - } - get lengthCalculator() { - return this[LENGTH_CALCULATOR]; - } - get length() { - return this[LENGTH]; - } - get itemCount() { - return this[LRU_LIST].length; - } - rforEach(fn2, thisp) { - thisp = thisp || this; - for (let walker = this[LRU_LIST].tail; walker !== null; ) { - const prev = walker.prev; - forEachStep(this, fn2, walker, thisp); - walker = prev; - } - } - forEach(fn2, thisp) { - thisp = thisp || this; - for (let walker = this[LRU_LIST].head; walker !== null; ) { - const next = walker.next; - forEachStep(this, fn2, walker, thisp); - walker = next; + intersects(comp, options) { + if (!(comp instanceof _Comparator)) { + throw new TypeError("a Comparator is required"); } - } - keys() { - return this[LRU_LIST].toArray().map((k) => k.key); - } - values() { - return this[LRU_LIST].toArray().map((k) => k.value); - } - reset() { - if (this[DISPOSE] && this[LRU_LIST] && this[LRU_LIST].length) { - this[LRU_LIST].forEach((hit) => this[DISPOSE](hit.key, hit.value)); - } - this[CACHE] = /* @__PURE__ */ new Map(); - this[LRU_LIST] = new Yallist(); - this[LENGTH] = 0; - } - dump() { - return this[LRU_LIST].map((hit) => isStale(this, hit) ? false : { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - }).toArray().filter((h) => h); - } - dumpLru() { - return this[LRU_LIST]; - } - set(key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE]; - if (maxAge && typeof maxAge !== "number") - throw new TypeError("maxAge must be a number"); - const now = maxAge ? Date.now() : 0; - const len = this[LENGTH_CALCULATOR](value, key); - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)); - return false; + if (this.operator === "") { + if (this.value === "") { + return true; } - const node = this[CACHE].get(key); - const item = node.value; - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) - this[DISPOSE](key, item.value); - } - item.now = now; - item.maxAge = maxAge; - item.value = value; - this[LENGTH] += len - item.length; - item.length = len; - this.get(key); - trim(this); - return true; + return new Range3(comp.value, options).test(this.value); + } else if (comp.operator === "") { + if (comp.value === "") { + return true; + } + return new Range3(this.value, options).test(comp.semver); } - const hit = new Entry(key, value, len, now, maxAge); - if (hit.length > this[MAX]) { - if (this[DISPOSE]) - this[DISPOSE](key, value); + options = parseOptions(options); + if (options.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) { return false; } - this[LENGTH] += hit.length; - this[LRU_LIST].unshift(hit); - this[CACHE].set(key, this[LRU_LIST].head); - trim(this); - return true; - } - has(key) { - if (!this[CACHE].has(key)) + if (!options.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) { return false; - const hit = this[CACHE].get(key).value; - return !isStale(this, hit); - } - get(key) { - return get(this, key, true); - } - peek(key) { - return get(this, key, false); - } - pop() { - const node = this[LRU_LIST].tail; - if (!node) - return null; - del(this, node); - return node.value; - } - del(key) { - del(this, this[CACHE].get(key)); - } - load(arr) { - this.reset(); - const now = Date.now(); - for (let l = arr.length - 1; l >= 0; l--) { - const hit = arr[l]; - const expiresAt = hit.e || 0; - if (expiresAt === 0) - this.set(hit.k, hit.v); - else { - const maxAge = expiresAt - now; - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge); - } - } } - } - prune() { - this[CACHE].forEach((value, key) => get(this, key, false)); - } - }; - var get = (self2, key, doUse) => { - const node = self2[CACHE].get(key); - if (node) { - const hit = node.value; - if (isStale(self2, hit)) { - del(self2, node); - if (!self2[ALLOW_STALE]) - return void 0; - } else { - if (doUse) { - if (self2[UPDATE_AGE_ON_GET]) - node.value.now = Date.now(); - self2[LRU_LIST].unshiftNode(node); - } + if (this.operator.startsWith(">") && comp.operator.startsWith(">")) { + return true; } - return hit.value; - } - }; - var isStale = (self2, hit) => { - if (!hit || !hit.maxAge && !self2[MAX_AGE]) - return false; - const diff = Date.now() - hit.now; - return hit.maxAge ? diff > hit.maxAge : self2[MAX_AGE] && diff > self2[MAX_AGE]; - }; - var trim = (self2) => { - if (self2[LENGTH] > self2[MAX]) { - for (let walker = self2[LRU_LIST].tail; self2[LENGTH] > self2[MAX] && walker !== null; ) { - const prev = walker.prev; - del(self2, walker); - walker = prev; + if (this.operator.startsWith("<") && comp.operator.startsWith("<")) { + return true; } + if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) { + return true; + } + if (cmp(this.semver, "<", comp.semver, options) && this.operator.startsWith(">") && comp.operator.startsWith("<")) { + return true; + } + if (cmp(this.semver, ">", comp.semver, options) && this.operator.startsWith("<") && comp.operator.startsWith(">")) { + return true; + } + return false; } }; - var del = (self2, node) => { - if (node) { - const hit = node.value; - if (self2[DISPOSE]) - self2[DISPOSE](hit.key, hit.value); - self2[LENGTH] -= hit.length; - self2[CACHE].delete(hit.key); - self2[LRU_LIST].removeNode(node); - } - }; - var Entry = class { - constructor(key, value, length, now, maxAge) { - this.key = key; - this.value = value; - this.length = length; - this.now = now; - this.maxAge = maxAge || 0; - } - }; - var forEachStep = (self2, fn2, node, thisp) => { - let hit = node.value; - if (isStale(self2, hit)) { - del(self2, node); - if (!self2[ALLOW_STALE]) - hit = void 0; - } - if (hit) - fn2.call(thisp, hit.value, hit.key, self2); - }; - module2.exports = LRUCache; + module2.exports = Comparator; + var parseOptions = require_parse_options(); + var { safeRe: re, t } = require_re(); + var cmp = require_cmp(); + var debug2 = require_debug(); + var SemVer3 = require_semver(); + var Range3 = require_range(); } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/range.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js var require_range = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/range.js"(exports, module2) { - var Range = class _Range { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js"(exports2, module2) { + "use strict"; + var SPACE_CHARACTERS = /\s+/g; + var Range3 = class _Range { constructor(range, options) { options = parseOptions(options); if (range instanceof _Range) { @@ -2460,13 +1877,13 @@ var require_range = __commonJS({ if (range instanceof Comparator) { this.raw = range.value; this.set = [[range]]; - this.format(); + this.formatted = void 0; return this; } this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - this.raw = range.trim().split(/\s+/).join(" "); + this.raw = range.trim().replace(SPACE_CHARACTERS, " "); this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length); if (!this.set.length) { throw new TypeError(`Invalid SemVer Range: ${this.raw}`); @@ -2485,10 +1902,27 @@ var require_range = __commonJS({ } } } - this.format(); + this.formatted = void 0; + } + get range() { + if (this.formatted === void 0) { + this.formatted = ""; + for (let i = 0; i < this.set.length; i++) { + if (i > 0) { + this.formatted += "||"; + } + const comps = this.set[i]; + for (let k = 0; k < comps.length; k++) { + if (k > 0) { + this.formatted += " "; + } + this.formatted += comps[k].toString().trim(); + } + } + } + return this.formatted; } format() { - this.range = this.set.map((comps) => comps.join(" ").trim()).join("||").trim(); return this.range; } toString() { @@ -2497,7 +1931,7 @@ var require_range = __commonJS({ parseRange(range) { const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE); const memoKey = memoOpts + ":" + range; - const cached = cache.get(memoKey); + const cached = cache2.get(memoKey); if (cached) { return cached; } @@ -2531,7 +1965,7 @@ var require_range = __commonJS({ rangeMap.delete(""); } const result = [...rangeMap.values()]; - cache.set(memoKey, result); + cache2.set(memoKey, result); return result; } intersects(range, options) { @@ -2555,7 +1989,7 @@ var require_range = __commonJS({ } if (typeof version2 === "string") { try { - version2 = new SemVer(version2, this.options); + version2 = new SemVer3(version2, this.options); } catch (er) { return false; } @@ -2568,13 +2002,13 @@ var require_range = __commonJS({ return false; } }; - module2.exports = Range; - var LRU = require_lru_cache(); - var cache = new LRU({ max: 1e3 }); + module2.exports = Range3; + var LRU = require_lrucache(); + var cache2 = new LRU(); var parseOptions = require_parse_options(); var Comparator = require_comparator(); var debug2 = require_debug(); - var SemVer = require_semver(); + var SemVer3 = require_semver(); var { safeRe: re, t, @@ -2598,6 +2032,7 @@ var require_range = __commonJS({ return result; }; var parseComparator = (comp, options) => { + comp = comp.replace(re[t.BUILD], ""); debug2("comp", comp, options); comp = replaceCarets(comp, options); debug2("caret", comp); @@ -2748,7 +2183,7 @@ var require_range = __commonJS({ debug2("replaceGTE0", comp, options); return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], ""); }; - var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) => { + var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => { if (isX(fM)) { from = ""; } else if (isX(fm)) { @@ -2801,815 +2236,163 @@ var require_range = __commonJS({ } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/comparator.js -var require_comparator = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/classes/comparator.js"(exports, module2) { - var ANY = Symbol("SemVer ANY"); - var Comparator = class _Comparator { - static get ANY() { - return ANY; - } - constructor(comp, options) { - options = parseOptions(options); - if (comp instanceof _Comparator) { - if (comp.loose === !!options.loose) { - return comp; - } else { - comp = comp.value; - } - } - comp = comp.trim().split(/\s+/).join(" "); - debug2("comparator", comp, options); - this.options = options; - this.loose = !!options.loose; - this.parse(comp); - if (this.semver === ANY) { - this.value = ""; - } else { - this.value = this.operator + this.semver.version; - } - debug2("comp", this); - } - parse(comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]; - const m = comp.match(r); - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`); - } - this.operator = m[1] !== void 0 ? m[1] : ""; - if (this.operator === "=") { - this.operator = ""; - } - if (!m[2]) { - this.semver = ANY; - } else { - this.semver = new SemVer(m[2], this.options.loose); - } +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js +var require_valid2 = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js"(exports2, module2) { + "use strict"; + var Range3 = require_range(); + var validRange = (range, options) => { + try { + return new Range3(range, options).range || "*"; + } catch (er) { + return null; } - toString() { - return this.value; + }; + module2.exports = validRange; + } +}); + +// .yarn/cache/ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip/node_modules/ms/index.js +var require_ms = __commonJS({ + ".yarn/cache/ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip/node_modules/ms/index.js"(exports2, module2) { + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + module2.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse4(val); + } else if (type === "number" && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); } - test(version2) { - debug2("Comparator.test", version2, this.options.loose); - if (this.semver === ANY || version2 === ANY) { - return true; - } - if (typeof version2 === "string") { - try { - version2 = new SemVer(version2, this.options); - } catch (er) { - return false; - } - } - return cmp(version2, this.operator, this.semver, this.options); + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse4(str) { + str = String(str); + if (str.length > 100) { + return; } - intersects(comp, options) { - if (!(comp instanceof _Comparator)) { - throw new TypeError("a Comparator is required"); - } - if (this.operator === "") { - if (this.value === "") { - return true; - } - return new Range(comp.value, options).test(this.value); - } else if (comp.operator === "") { - if (comp.value === "") { - return true; - } - return new Range(this.value, options).test(comp.semver); - } - options = parseOptions(options); - if (options.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) { - return false; - } - if (!options.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) { - return false; - } - if (this.operator.startsWith(">") && comp.operator.startsWith(">")) { - return true; - } - if (this.operator.startsWith("<") && comp.operator.startsWith("<")) { - return true; - } - if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) { - return true; - } - if (cmp(this.semver, "<", comp.semver, options) && this.operator.startsWith(">") && comp.operator.startsWith("<")) { - return true; - } - if (cmp(this.semver, ">", comp.semver, options) && this.operator.startsWith("<") && comp.operator.startsWith(">")) { - return true; - } - return false; + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; } - }; - module2.exports = Comparator; - var parseOptions = require_parse_options(); - var { safeRe: re, t } = require_re(); - var cmp = require_cmp(); - var debug2 = require_debug(); - var SemVer = require_semver(); - var Range = require_range(); - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/satisfies.js -var require_satisfies = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/functions/satisfies.js"(exports, module2) { - var Range = require_range(); - var satisfies = (version2, range, options) => { - try { - range = new Range(range, options); - } catch (er) { - return false; + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; } - return range.test(version2); - }; - module2.exports = satisfies; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/to-comparators.js -var require_to_comparators = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/to-comparators.js"(exports, module2) { - var Range = require_range(); - var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" ")); - module2.exports = toComparators; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/max-satisfying.js -var require_max_satisfying = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/max-satisfying.js"(exports, module2) { - var SemVer = require_semver(); - var Range = require_range(); - var maxSatisfying = (versions, range, options) => { - let max = null; - let maxSV = null; - let rangeObj = null; - try { - rangeObj = new Range(range, options); - } catch (er) { - return null; + } + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + "d"; } - versions.forEach((v) => { - if (rangeObj.test(v)) { - if (!max || maxSV.compare(v) === -1) { - max = v; - maxSV = new SemVer(max, options); - } - } - }); - return max; - }; - module2.exports = maxSatisfying; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/min-satisfying.js -var require_min_satisfying = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/min-satisfying.js"(exports, module2) { - var SemVer = require_semver(); - var Range = require_range(); - var minSatisfying = (versions, range, options) => { - let min = null; - let minSV = null; - let rangeObj = null; - try { - rangeObj = new Range(range, options); - } catch (er) { - return null; + if (msAbs >= h) { + return Math.round(ms / h) + "h"; } - versions.forEach((v) => { - if (rangeObj.test(v)) { - if (!min || minSV.compare(v) === 1) { - min = v; - minSV = new SemVer(min, options); - } - } - }); - return min; - }; - module2.exports = minSatisfying; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/min-version.js -var require_min_version = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/min-version.js"(exports, module2) { - var SemVer = require_semver(); - var Range = require_range(); - var gt = require_gt(); - var minVersion = (range, loose) => { - range = new Range(range, loose); - let minver = new SemVer("0.0.0"); - if (range.test(minver)) { - return minver; - } - minver = new SemVer("0.0.0-0"); - if (range.test(minver)) { - return minver; - } - minver = null; - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i]; - let setMin = null; - comparators.forEach((comparator) => { - const compver = new SemVer(comparator.semver.version); - switch (comparator.operator) { - case ">": - if (compver.prerelease.length === 0) { - compver.patch++; - } else { - compver.prerelease.push(0); - } - compver.raw = compver.format(); - case "": - case ">=": - if (!setMin || gt(compver, setMin)) { - setMin = compver; - } - break; - case "<": - case "<=": - break; - default: - throw new Error(`Unexpected operation: ${comparator.operator}`); - } - }); - if (setMin && (!minver || gt(minver, setMin))) { - minver = setMin; - } + if (msAbs >= m) { + return Math.round(ms / m) + "m"; } - if (minver && range.test(minver)) { - return minver; + if (msAbs >= s) { + return Math.round(ms / s) + "s"; } - return null; - }; - module2.exports = minVersion; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/valid.js -var require_valid2 = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/valid.js"(exports, module2) { - var Range = require_range(); - var validRange = (range, options) => { - try { - return new Range(range, options).range || "*"; - } catch (er) { - return null; + return ms + "ms"; + } + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural2(ms, msAbs, d, "day"); } - }; - module2.exports = validRange; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/outside.js -var require_outside = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/outside.js"(exports, module2) { - var SemVer = require_semver(); - var Comparator = require_comparator(); - var { ANY } = Comparator; - var Range = require_range(); - var satisfies = require_satisfies(); - var gt = require_gt(); - var lt = require_lt(); - var lte = require_lte(); - var gte = require_gte(); - var outside = (version2, range, hilo, options) => { - version2 = new SemVer(version2, options); - range = new Range(range, options); - let gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case ">": - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = ">"; - ecomp = ">="; - break; - case "<": - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = "<"; - ecomp = "<="; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); + if (msAbs >= h) { + return plural2(ms, msAbs, h, "hour"); } - if (satisfies(version2, range, options)) { - return false; + if (msAbs >= m) { + return plural2(ms, msAbs, m, "minute"); } - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i]; - let high = null; - let low = null; - comparators.forEach((comparator) => { - if (comparator.semver === ANY) { - comparator = new Comparator(">=0.0.0"); - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator; - } - }); - if (high.operator === comp || high.operator === ecomp) { - return false; - } - if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) { - return false; - } else if (low.operator === ecomp && ltfn(version2, low.semver)) { - return false; - } + if (msAbs >= s) { + return plural2(ms, msAbs, s, "second"); } - return true; - }; - module2.exports = outside; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/gtr.js -var require_gtr = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/gtr.js"(exports, module2) { - var outside = require_outside(); - var gtr = (version2, range, options) => outside(version2, range, ">", options); - module2.exports = gtr; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/ltr.js -var require_ltr = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/ltr.js"(exports, module2) { - var outside = require_outside(); - var ltr = (version2, range, options) => outside(version2, range, "<", options); - module2.exports = ltr; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/intersects.js -var require_intersects = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/intersects.js"(exports, module2) { - var Range = require_range(); - var intersects = (r1, r2, options) => { - r1 = new Range(r1, options); - r2 = new Range(r2, options); - return r1.intersects(r2, options); - }; - module2.exports = intersects; + return ms + " ms"; + } + function plural2(ms, msAbs, n, name2) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + " " + name2 + (isPlural ? "s" : ""); + } } }); -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/simplify.js -var require_simplify = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/simplify.js"(exports, module2) { - var satisfies = require_satisfies(); - var compare = require_compare(); - module2.exports = (versions, range, options) => { - const set = []; - let first = null; - let prev = null; - const v = versions.sort((a, b) => compare(a, b, options)); - for (const version2 of v) { - const included = satisfies(version2, range, options); - if (included) { - prev = version2; - if (!first) { - first = version2; - } - } else { - if (prev) { - set.push([first, prev]); - } - prev = null; - first = null; - } - } - if (first) { - set.push([first, null]); - } - const ranges = []; - for (const [min, max] of set) { - if (min === max) { - ranges.push(min); - } else if (!max && min === v[0]) { - ranges.push("*"); - } else if (!max) { - ranges.push(`>=${min}`); - } else if (min === v[0]) { - ranges.push(`<=${max}`); - } else { - ranges.push(`${min} - ${max}`); +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js +var require_common = __commonJS({ + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js"(exports2, module2) { + function setup(env2) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require_ms(); + createDebug.destroy = destroy; + Object.keys(env2).forEach((key) => { + createDebug[key] = env2[key]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash = 0; + for (let i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; } - } - const simplified = ranges.join(" || "); - const original = typeof range.raw === "string" ? range.raw : String(range); - return simplified.length < original.length ? simplified : range; - }; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/subset.js -var require_subset = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/ranges/subset.js"(exports, module2) { - var Range = require_range(); - var Comparator = require_comparator(); - var { ANY } = Comparator; - var satisfies = require_satisfies(); - var compare = require_compare(); - var subset = (sub, dom, options = {}) => { - if (sub === dom) { - return true; - } - sub = new Range(sub, options); - dom = new Range(dom, options); - let sawNonNull = false; - OUTER: - for (const simpleSub of sub.set) { - for (const simpleDom of dom.set) { - const isSub = simpleSubset(simpleSub, simpleDom, options); - sawNonNull = sawNonNull || isSub !== null; - if (isSub) { - continue OUTER; - } - } - if (sawNonNull) { - return false; - } - } - return true; - }; - var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")]; - var minimumVersion = [new Comparator(">=0.0.0")]; - var simpleSubset = (sub, dom, options) => { - if (sub === dom) { - return true; - } - if (sub.length === 1 && sub[0].semver === ANY) { - if (dom.length === 1 && dom[0].semver === ANY) { - return true; - } else if (options.includePrerelease) { - sub = minimumVersionWithPreRelease; - } else { - sub = minimumVersion; - } - } - if (dom.length === 1 && dom[0].semver === ANY) { - if (options.includePrerelease) { - return true; - } else { - dom = minimumVersion; - } - } - const eqSet = /* @__PURE__ */ new Set(); - let gt, lt; - for (const c of sub) { - if (c.operator === ">" || c.operator === ">=") { - gt = higherGT(gt, c, options); - } else if (c.operator === "<" || c.operator === "<=") { - lt = lowerLT(lt, c, options); - } else { - eqSet.add(c.semver); - } - } - if (eqSet.size > 1) { - return null; - } - let gtltComp; - if (gt && lt) { - gtltComp = compare(gt.semver, lt.semver, options); - if (gtltComp > 0) { - return null; - } else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<=")) { - return null; - } - } - for (const eq of eqSet) { - if (gt && !satisfies(eq, String(gt), options)) { - return null; - } - if (lt && !satisfies(eq, String(lt), options)) { - return null; - } - for (const c of dom) { - if (!satisfies(eq, String(c), options)) { - return false; - } - } - return true; - } - let higher, lower; - let hasDomLT, hasDomGT; - let needDomLTPre = lt && !options.includePrerelease && lt.semver.prerelease.length ? lt.semver : false; - let needDomGTPre = gt && !options.includePrerelease && gt.semver.prerelease.length ? gt.semver : false; - if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) { - needDomLTPre = false; - } - for (const c of dom) { - hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">="; - hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<="; - if (gt) { - if (needDomGTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) { - needDomGTPre = false; - } - } - if (c.operator === ">" || c.operator === ">=") { - higher = higherGT(gt, c, options); - if (higher === c && higher !== gt) { - return false; - } - } else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options)) { - return false; - } - } - if (lt) { - if (needDomLTPre) { - if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) { - needDomLTPre = false; - } - } - if (c.operator === "<" || c.operator === "<=") { - lower = lowerLT(lt, c, options); - if (lower === c && lower !== lt) { - return false; - } - } else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options)) { - return false; - } - } - if (!c.operator && (lt || gt) && gtltComp !== 0) { - return false; - } - } - if (gt && hasDomLT && !lt && gtltComp !== 0) { - return false; - } - if (lt && hasDomGT && !gt && gtltComp !== 0) { - return false; - } - if (needDomGTPre || needDomLTPre) { - return false; - } - return true; - }; - var higherGT = (a, b, options) => { - if (!a) { - return b; - } - const comp = compare(a.semver, b.semver, options); - return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a; - }; - var lowerLT = (a, b, options) => { - if (!a) { - return b; - } - const comp = compare(a.semver, b.semver, options); - return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a; - }; - module2.exports = subset; - } -}); - -// .yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/index.js -var require_semver2 = __commonJS({ - ".yarn/cache/semver-npm-7.5.4-c4ad957fcd-5160b06975.zip/node_modules/semver/index.js"(exports, module2) { - var internalRe = require_re(); - var constants = require_constants(); - var SemVer = require_semver(); - var identifiers = require_identifiers(); - var parse = require_parse(); - var valid = require_valid(); - var clean = require_clean(); - var inc = require_inc(); - var diff = require_diff(); - var major = require_major(); - var minor = require_minor(); - var patch = require_patch(); - var prerelease = require_prerelease(); - var compare = require_compare(); - var rcompare = require_rcompare(); - var compareLoose = require_compare_loose(); - var compareBuild = require_compare_build(); - var sort = require_sort(); - var rsort = require_rsort(); - var gt = require_gt(); - var lt = require_lt(); - var eq = require_eq(); - var neq = require_neq(); - var gte = require_gte(); - var lte = require_lte(); - var cmp = require_cmp(); - var coerce = require_coerce(); - var Comparator = require_comparator(); - var Range = require_range(); - var satisfies = require_satisfies(); - var toComparators = require_to_comparators(); - var maxSatisfying = require_max_satisfying(); - var minSatisfying = require_min_satisfying(); - var minVersion = require_min_version(); - var validRange = require_valid2(); - var outside = require_outside(); - var gtr = require_gtr(); - var ltr = require_ltr(); - var intersects = require_intersects(); - var simplifyRange = require_simplify(); - var subset = require_subset(); - module2.exports = { - parse, - valid, - clean, - inc, - diff, - major, - minor, - patch, - prerelease, - compare, - rcompare, - compareLoose, - compareBuild, - sort, - rsort, - gt, - lt, - eq, - neq, - gte, - lte, - cmp, - coerce, - Comparator, - Range, - satisfies, - toComparators, - maxSatisfying, - minSatisfying, - minVersion, - validRange, - outside, - gtr, - ltr, - intersects, - simplifyRange, - subset, - SemVer, - re: internalRe.re, - src: internalRe.src, - tokens: internalRe.t, - SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, - RELEASE_TYPES: constants.RELEASE_TYPES, - compareIdentifiers: identifiers.compareIdentifiers, - rcompareIdentifiers: identifiers.rcompareIdentifiers - }; - } -}); - -// .yarn/cache/ms-npm-2.1.2-ec0c1512ff-a437714e2f.zip/node_modules/ms/index.js -var require_ms = __commonJS({ - ".yarn/cache/ms-npm-2.1.2-ec0c1512ff-a437714e2f.zip/node_modules/ms/index.js"(exports, module2) { - var s = 1e3; - var m = s * 60; - var h = m * 60; - var d = h * 24; - var w = d * 7; - var y = d * 365.25; - module2.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === "string" && val.length > 0) { - return parse(val); - } else if (type === "number" && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) - ); - }; - function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || "ms").toLowerCase(); - switch (type) { - case "years": - case "year": - case "yrs": - case "yr": - case "y": - return n * y; - case "weeks": - case "week": - case "w": - return n * w; - case "days": - case "day": - case "d": - return n * d; - case "hours": - case "hour": - case "hrs": - case "hr": - case "h": - return n * h; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - return n * m; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - return n * s; - case "milliseconds": - case "millisecond": - case "msecs": - case "msec": - case "ms": - return n; - default: - return void 0; - } - } - function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + "d"; - } - if (msAbs >= h) { - return Math.round(ms / h) + "h"; - } - if (msAbs >= m) { - return Math.round(ms / m) + "m"; - } - if (msAbs >= s) { - return Math.round(ms / s) + "s"; - } - return ms + "ms"; - } - function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural2(ms, msAbs, d, "day"); - } - if (msAbs >= h) { - return plural2(ms, msAbs, h, "hour"); - } - if (msAbs >= m) { - return plural2(ms, msAbs, m, "minute"); - } - if (msAbs >= s) { - return plural2(ms, msAbs, s, "second"); - } - return ms + " ms"; - } - function plural2(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); - } - } -}); - -// .yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/common.js -var require_common = __commonJS({ - ".yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/common.js"(exports, module2) { - function setup(env2) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require_ms(); - createDebug.destroy = destroy; - Object.keys(env2).forEach((key) => { - createDebug[key] = env2[key]; - }); - createDebug.names = []; - createDebug.skips = []; - createDebug.formatters = {}; - function selectColor(namespace) { - let hash = 0; - for (let i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; - } - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; } createDebug.selectColor = selectColor; function createDebug(namespace) { @@ -3688,50 +2471,64 @@ var require_common = __commonJS({ createDebug.namespaces = namespaces; createDebug.names = []; createDebug.skips = []; - let i; - const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); - const len = split.length; - for (i = 0; i < len; i++) { - if (!split[i]) { - continue; + const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean); + for (const ns of split) { + if (ns[0] === "-") { + createDebug.skips.push(ns.slice(1)); + } else { + createDebug.names.push(ns); } - namespaces = split[i].replace(/\*/g, ".*?"); - if (namespaces[0] === "-") { - createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); + } + } + function matchesTemplate(search, template) { + let searchIndex = 0; + let templateIndex = 0; + let starIndex = -1; + let matchIndex = 0; + while (searchIndex < search.length) { + if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*")) { + if (template[templateIndex] === "*") { + starIndex = templateIndex; + matchIndex = searchIndex; + templateIndex++; + } else { + searchIndex++; + templateIndex++; + } + } else if (starIndex !== -1) { + templateIndex = starIndex + 1; + matchIndex++; + searchIndex = matchIndex; } else { - createDebug.names.push(new RegExp("^" + namespaces + "$")); + return false; } } + while (templateIndex < template.length && template[templateIndex] === "*") { + templateIndex++; + } + return templateIndex === template.length; } function disable() { const namespaces = [ - ...createDebug.names.map(toNamespace), - ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) + ...createDebug.names, + ...createDebug.skips.map((namespace) => "-" + namespace) ].join(","); createDebug.enable(""); return namespaces; } - function enabled(name) { - if (name[name.length - 1] === "*") { - return true; - } - let i; - let len; - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { + function enabled(name2) { + for (const skip of createDebug.skips) { + if (matchesTemplate(name2, skip)) { return false; } } - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { + for (const ns of createDebug.names) { + if (matchesTemplate(name2, ns)) { return true; } } return false; } - function toNamespace(regexp) { - return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); - } function coerce(val) { if (val instanceof Error) { return val.stack || val.message; @@ -3748,15 +2545,15 @@ var require_common = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/browser.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js var require_browser = __commonJS({ - ".yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/browser.js"(exports, module2) { - exports.formatArgs = formatArgs; - exports.save = save; - exports.load = load; - exports.useColors = useColors; - exports.storage = localstorage(); - exports.destroy = (() => { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js"(exports2, module2) { + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.storage = localstorage(); + exports2.destroy = /* @__PURE__ */ (() => { let warned = false; return () => { if (!warned) { @@ -3765,7 +2562,7 @@ var require_browser = __commonJS({ } }; })(); - exports.colors = [ + exports2.colors = [ "#0000CC", "#0000FF", "#0033CC", @@ -3850,10 +2647,11 @@ var require_browser = __commonJS({ if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { return false; } + let m; return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); } function formatArgs(args) { @@ -3876,14 +2674,14 @@ var require_browser = __commonJS({ }); args.splice(lastC, 0, c); } - exports.log = console.debug || console.log || (() => { + exports2.log = console.debug || console.log || (() => { }); function save(namespaces) { try { if (namespaces) { - exports.storage.setItem("debug", namespaces); + exports2.storage.setItem("debug", namespaces); } else { - exports.storage.removeItem("debug"); + exports2.storage.removeItem("debug"); } } catch (error) { } @@ -3891,7 +2689,7 @@ var require_browser = __commonJS({ function load() { let r; try { - r = exports.storage.getItem("debug"); + r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG"); } catch (error) { } if (!r && typeof process !== "undefined" && "env" in process) { @@ -3905,7 +2703,7 @@ var require_browser = __commonJS({ } catch (error) { } } - module2.exports = require_common()(exports); + module2.exports = require_common()(exports2); var { formatters } = module2.exports; formatters.j = function(v) { try { @@ -3917,7 +2715,7 @@ var require_browser = __commonJS({ } }); -// .yarn/cache/supports-color-npm-9.4.0-a415f39758-6c24e6b2b6.zip/node_modules/supports-color/index.js +// .yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js var supports_color_exports = {}; __export(supports_color_exports, { createSupportsColor: () => createSupportsColor, @@ -3930,15 +2728,23 @@ function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : import_no return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); } function envForceColor() { - if ("FORCE_COLOR" in env) { - if (env.FORCE_COLOR === "true") { - return 1; - } - if (env.FORCE_COLOR === "false") { - return 0; - } - return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3); + if (!("FORCE_COLOR" in env)) { + return; + } + if (env.FORCE_COLOR === "true") { + return 1; + } + if (env.FORCE_COLOR === "false") { + return 0; } + if (env.FORCE_COLOR.length === 0) { + return 1; + } + const level = Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3); + if (![0, 1, 2, 3].includes(level)) { + return; + } + return level; } function translateLevel(level) { if (level === 0) { @@ -3986,10 +2792,10 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { return 1; } if ("CI" in env) { - if ("GITHUB_ACTIONS" in env || "GITEA_ACTIONS" in env) { + if (["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env)) { return 3; } - if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env) || env.CI_NAME === "codeship") { + if (["TRAVIS", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env) || env.CI_NAME === "codeship") { return 1; } return min; @@ -4003,6 +2809,12 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { if (env.TERM === "xterm-kitty") { return 3; } + if (env.TERM === "xterm-ghostty") { + return 3; + } + if (env.TERM === "wezterm") { + return 3; + } if ("TERM_PROGRAM" in env) { const version2 = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); switch (env.TERM_PROGRAM) { @@ -4034,7 +2846,7 @@ function createSupportsColor(stream, options = {}) { } var import_node_process, import_node_os, import_node_tty, env, flagForceColor, supportsColor, supports_color_default; var init_supports_color = __esm({ - ".yarn/cache/supports-color-npm-9.4.0-a415f39758-6c24e6b2b6.zip/node_modules/supports-color/index.js"() { + ".yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js"() { import_node_process = __toESM(require("node:process"), 1); import_node_os = __toESM(require("node:os"), 1); import_node_tty = __toESM(require("node:tty"), 1); @@ -4052,27 +2864,27 @@ var init_supports_color = __esm({ } }); -// .yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/node.js -var require_node = __commonJS({ - ".yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/node.js"(exports, module2) { - var tty3 = require("tty"); +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js +var require_node2 = __commonJS({ + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js"(exports2, module2) { + var tty2 = require("tty"); var util = require("util"); - exports.init = init; - exports.log = log2; - exports.formatArgs = formatArgs; - exports.save = save; - exports.load = load; - exports.useColors = useColors; - exports.destroy = util.deprecate( + exports2.init = init; + exports2.log = log2; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.destroy = util.deprecate( () => { }, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." ); - exports.colors = [6, 2, 3, 4, 5, 1]; + exports2.colors = [6, 2, 3, 4, 5, 1]; try { const supportsColor2 = (init_supports_color(), __toCommonJS(supports_color_exports)); if (supportsColor2 && (supportsColor2.stderr || supportsColor2).level >= 2) { - exports.colors = [ + exports2.colors = [ 20, 21, 26, @@ -4153,7 +2965,7 @@ var require_node = __commonJS({ } } catch (error) { } - exports.inspectOpts = Object.keys(process.env).filter((key) => { + exports2.inspectOpts = Object.keys(process.env).filter((key) => { return /^debug_/i.test(key); }).reduce((obj, key) => { const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_, k) => { @@ -4173,28 +2985,28 @@ var require_node = __commonJS({ return obj; }, {}); function useColors() { - return "colors" in exports.inspectOpts ? Boolean(exports.inspectOpts.colors) : tty3.isatty(process.stderr.fd); + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty2.isatty(process.stderr.fd); } function formatArgs(args) { - const { namespace: name, useColors: useColors2 } = this; + const { namespace: name2, useColors: useColors2 } = this; if (useColors2) { const c = this.color; const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); - const prefix = ` ${colorCode};1m${name} \x1B[0m`; + const prefix = ` ${colorCode};1m${name2} \x1B[0m`; args[0] = prefix + args[0].split("\n").join("\n" + prefix); args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); } else { - args[0] = getDate() + name + " " + args[0]; + args[0] = getDate() + name2 + " " + args[0]; } } function getDate() { - if (exports.inspectOpts.hideDate) { + if (exports2.inspectOpts.hideDate) { return ""; } return (/* @__PURE__ */ new Date()).toISOString() + " "; } function log2(...args) { - return process.stderr.write(util.format(...args) + "\n"); + return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args) + "\n"); } function save(namespaces) { if (namespaces) { @@ -4208,12 +3020,12 @@ var require_node = __commonJS({ } function init(debug2) { debug2.inspectOpts = {}; - const keys = Object.keys(exports.inspectOpts); + const keys = Object.keys(exports2.inspectOpts); for (let i = 0; i < keys.length; i++) { - debug2.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + debug2.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; } } - module2.exports = require_common()(exports); + module2.exports = require_common()(exports2); var { formatters } = module2.exports; formatters.o = function(v) { this.inspectOpts.colors = this.useColors; @@ -4226,20 +3038,20 @@ var require_node = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/index.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js var require_src = __commonJS({ - ".yarn/__virtual__/debug-virtual-80c19f725b/0/cache/debug-npm-4.3.4-4513954577-cedbec4529.zip/node_modules/debug/src/index.js"(exports, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js"(exports2, module2) { if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { module2.exports = require_browser(); } else { - module2.exports = require_node(); + module2.exports = require_node2(); } } }); // .yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-fe7dd8b1bd.zip/node_modules/proxy-from-env/index.js var require_proxy_from_env = __commonJS({ - ".yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-fe7dd8b1bd.zip/node_modules/proxy-from-env/index.js"(exports) { + ".yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-fe7dd8b1bd.zip/node_modules/proxy-from-env/index.js"(exports2) { "use strict"; var parseUrl = require("url").parse; var DEFAULT_PORTS = { @@ -4303,90 +3115,27 @@ var require_proxy_from_env = __commonJS({ function getEnv(key) { return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || ""; } - exports.getProxyForUrl = getProxyForUrl; + exports2.getProxyForUrl = getProxyForUrl; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/symbols.js"(exports, module2) { - module2.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size"), - kHTTP2Session: Symbol("http2Session"), - kHTTP2SessionState: Symbol("http2Session state"), - kHTTP2BuildRequest: Symbol("http2 build request"), - kHTTP1BuildRequest: Symbol("http1 build request"), - kHTTP2CopyHeaders: Symbol("http2 copy headers"), - kHTTPConnVersion: Symbol("http connection version"), - kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), - kConstruct: Symbol("constructable") - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js var require_errors = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/errors.js"(exports, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js"(exports2, module2) { "use strict"; + var kUndiciError = Symbol.for("undici.error.UND_ERR"); var UndiciError = class extends Error { constructor(message) { super(message); this.name = "UndiciError"; this.code = "UND_ERR"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kUndiciError] === true; + } + [kUndiciError] = true; }; + var kConnectTimeoutError = Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); var ConnectTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -4394,7 +3143,12 @@ var require_errors = __commonJS({ this.message = message || "Connect Timeout Error"; this.code = "UND_ERR_CONNECT_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kConnectTimeoutError] === true; + } + [kConnectTimeoutError] = true; }; + var kHeadersTimeoutError = Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); var HeadersTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -4402,7 +3156,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Timeout Error"; this.code = "UND_ERR_HEADERS_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersTimeoutError] === true; + } + [kHeadersTimeoutError] = true; }; + var kHeadersOverflowError = Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); var HeadersOverflowError = class extends UndiciError { constructor(message) { super(message); @@ -4410,7 +3169,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Overflow Error"; this.code = "UND_ERR_HEADERS_OVERFLOW"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersOverflowError] === true; + } + [kHeadersOverflowError] = true; }; + var kBodyTimeoutError = Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); var BodyTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -4418,7 +3182,12 @@ var require_errors = __commonJS({ this.message = message || "Body Timeout Error"; this.code = "UND_ERR_BODY_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBodyTimeoutError] === true; + } + [kBodyTimeoutError] = true; }; + var kResponseStatusCodeError = Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"); var ResponseStatusCodeError = class extends UndiciError { constructor(message, statusCode, headers, body) { super(message); @@ -4430,7 +3199,12 @@ var require_errors = __commonJS({ this.statusCode = statusCode; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseStatusCodeError] === true; + } + [kResponseStatusCodeError] = true; }; + var kInvalidArgumentError = Symbol.for("undici.error.UND_ERR_INVALID_ARG"); var InvalidArgumentError = class extends UndiciError { constructor(message) { super(message); @@ -4438,7 +3212,12 @@ var require_errors = __commonJS({ this.message = message || "Invalid Argument Error"; this.code = "UND_ERR_INVALID_ARG"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidArgumentError] === true; + } + [kInvalidArgumentError] = true; }; + var kInvalidReturnValueError = Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); var InvalidReturnValueError = class extends UndiciError { constructor(message) { super(message); @@ -4446,14 +3225,25 @@ var require_errors = __commonJS({ this.message = message || "Invalid Return Value Error"; this.code = "UND_ERR_INVALID_RETURN_VALUE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidReturnValueError] === true; + } + [kInvalidReturnValueError] = true; }; + var kAbortError = Symbol.for("undici.error.UND_ERR_ABORT"); var AbortError = class extends UndiciError { constructor(message) { super(message); this.name = "AbortError"; this.message = message || "The operation was aborted"; + this.code = "UND_ERR_ABORT"; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kAbortError] === true; } + [kAbortError] = true; }; + var kRequestAbortedError = Symbol.for("undici.error.UND_ERR_ABORTED"); var RequestAbortedError = class extends AbortError { constructor(message) { super(message); @@ -4461,7 +3251,12 @@ var require_errors = __commonJS({ this.message = message || "Request aborted"; this.code = "UND_ERR_ABORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestAbortedError] === true; + } + [kRequestAbortedError] = true; }; + var kInformationalError = Symbol.for("undici.error.UND_ERR_INFO"); var InformationalError = class extends UndiciError { constructor(message) { super(message); @@ -4469,7 +3264,12 @@ var require_errors = __commonJS({ this.message = message || "Request information"; this.code = "UND_ERR_INFO"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInformationalError] === true; + } + [kInformationalError] = true; }; + var kRequestContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); var RequestContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -4477,7 +3277,12 @@ var require_errors = __commonJS({ this.message = message || "Request body length does not match content-length header"; this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestContentLengthMismatchError] === true; + } + [kRequestContentLengthMismatchError] = true; }; + var kResponseContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); var ResponseContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -4485,7 +3290,12 @@ var require_errors = __commonJS({ this.message = message || "Response body length does not match content-length header"; this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseContentLengthMismatchError] === true; + } + [kResponseContentLengthMismatchError] = true; }; + var kClientDestroyedError = Symbol.for("undici.error.UND_ERR_DESTROYED"); var ClientDestroyedError = class extends UndiciError { constructor(message) { super(message); @@ -4493,7 +3303,12 @@ var require_errors = __commonJS({ this.message = message || "The client is destroyed"; this.code = "UND_ERR_DESTROYED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientDestroyedError] === true; + } + [kClientDestroyedError] = true; }; + var kClientClosedError = Symbol.for("undici.error.UND_ERR_CLOSED"); var ClientClosedError = class extends UndiciError { constructor(message) { super(message); @@ -4501,7 +3316,12 @@ var require_errors = __commonJS({ this.message = message || "The client is closed"; this.code = "UND_ERR_CLOSED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientClosedError] === true; + } + [kClientClosedError] = true; }; + var kSocketError = Symbol.for("undici.error.UND_ERR_SOCKET"); var SocketError = class extends UndiciError { constructor(message, socket) { super(message); @@ -4510,7 +3330,12 @@ var require_errors = __commonJS({ this.code = "UND_ERR_SOCKET"; this.socket = socket; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSocketError] === true; + } + [kSocketError] = true; }; + var kNotSupportedError = Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); var NotSupportedError = class extends UndiciError { constructor(message) { super(message); @@ -4518,7 +3343,12 @@ var require_errors = __commonJS({ this.message = message || "Not supported error"; this.code = "UND_ERR_NOT_SUPPORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kNotSupportedError] === true; + } + [kNotSupportedError] = true; }; + var kBalancedPoolMissingUpstreamError = Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); var BalancedPoolMissingUpstreamError = class extends UndiciError { constructor(message) { super(message); @@ -4526,15 +3356,25 @@ var require_errors = __commonJS({ this.message = message || "No upstream has been added to the BalancedPool"; this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true; + } + [kBalancedPoolMissingUpstreamError] = true; }; + var kHTTPParserError = Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); var HTTPParserError = class extends Error { - constructor(message, code, data) { + constructor(message, code2, data) { super(message); this.name = "HTTPParserError"; - this.code = code ? `HPE_${code}` : void 0; + this.code = code2 ? `HPE_${code2}` : void 0; this.data = data ? data.toString() : void 0; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHTTPParserError] === true; + } + [kHTTPParserError] = true; }; + var kResponseExceededMaxSizeError = Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); var ResponseExceededMaxSizeError = class extends UndiciError { constructor(message) { super(message); @@ -4542,17 +3382,56 @@ var require_errors = __commonJS({ this.message = message || "Response content exceeded max size"; this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseExceededMaxSizeError] === true; + } + [kResponseExceededMaxSizeError] = true; }; + var kRequestRetryError = Symbol.for("undici.error.UND_ERR_REQ_RETRY"); var RequestRetryError = class extends UndiciError { - constructor(message, code, { headers, data }) { + constructor(message, code2, { headers, data }) { super(message); this.name = "RequestRetryError"; this.message = message || "Request retry error"; this.code = "UND_ERR_REQ_RETRY"; - this.statusCode = code; + this.statusCode = code2; + this.data = data; + this.headers = headers; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestRetryError] === true; + } + [kRequestRetryError] = true; + }; + var kResponseError = Symbol.for("undici.error.UND_ERR_RESPONSE"); + var ResponseError = class extends UndiciError { + constructor(message, code2, { headers, data }) { + super(message); + this.name = "ResponseError"; + this.message = message || "Response error"; + this.code = "UND_ERR_RESPONSE"; + this.statusCode = code2; this.data = data; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseError] === true; + } + [kResponseError] = true; + }; + var kSecureProxyConnectionError = Symbol.for("undici.error.UND_ERR_PRX_TLS"); + var SecureProxyConnectionError = class extends UndiciError { + constructor(cause, message, options) { + super(message, { cause, ...options ?? {} }); + this.name = "SecureProxyConnectionError"; + this.message = message || "Secure Proxy Connection failed"; + this.code = "UND_ERR_PRX_TLS"; + this.cause = cause; + } + static [Symbol.hasInstance](instance) { + return instance && instance[kSecureProxyConnectionError] === true; + } + [kSecureProxyConnectionError] = true; }; module2.exports = { AbortError, @@ -4575,797 +3454,512 @@ var require_errors = __commonJS({ ResponseContentLengthMismatchError, BalancedPoolMissingUpstreamError, ResponseExceededMaxSizeError, - RequestRetryError + RequestRetryError, + ResponseError, + SecureProxyConnectionError }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js -var require_dispatcher = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher.js"(exports, module2) { - "use strict"; - var EventEmitter = require("node:events"); - var Dispatcher = class extends EventEmitter { - dispatch() { - throw new Error("not implemented"); - } - close() { - throw new Error("not implemented"); - } - destroy() { - throw new Error("not implemented"); - } +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js +var require_symbols = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js"(exports2, module2) { + module2.exports = { + kClose: Symbol("close"), + kDestroy: Symbol("destroy"), + kDispatch: Symbol("dispatch"), + kUrl: Symbol("url"), + kWriting: Symbol("writing"), + kResuming: Symbol("resuming"), + kQueue: Symbol("queue"), + kConnect: Symbol("connect"), + kConnecting: Symbol("connecting"), + kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: Symbol("keep alive timeout"), + kKeepAlive: Symbol("keep alive"), + kHeadersTimeout: Symbol("headers timeout"), + kBodyTimeout: Symbol("body timeout"), + kServerName: Symbol("server name"), + kLocalAddress: Symbol("local address"), + kHost: Symbol("host"), + kNoRef: Symbol("no ref"), + kBodyUsed: Symbol("used"), + kBody: Symbol("abstracted request body"), + kRunning: Symbol("running"), + kBlocking: Symbol("blocking"), + kPending: Symbol("pending"), + kSize: Symbol("size"), + kBusy: Symbol("busy"), + kQueued: Symbol("queued"), + kFree: Symbol("free"), + kConnected: Symbol("connected"), + kClosed: Symbol("closed"), + kNeedDrain: Symbol("need drain"), + kReset: Symbol("reset"), + kDestroyed: Symbol.for("nodejs.stream.destroyed"), + kResume: Symbol("resume"), + kOnError: Symbol("on error"), + kMaxHeadersSize: Symbol("max headers size"), + kRunningIdx: Symbol("running index"), + kPendingIdx: Symbol("pending index"), + kError: Symbol("error"), + kClients: Symbol("clients"), + kClient: Symbol("client"), + kParser: Symbol("parser"), + kOnDestroyed: Symbol("destroy callbacks"), + kPipelining: Symbol("pipelining"), + kSocket: Symbol("socket"), + kHostHeader: Symbol("host header"), + kConnector: Symbol("connector"), + kStrictContentLength: Symbol("strict content length"), + kMaxRedirections: Symbol("maxRedirections"), + kMaxRequests: Symbol("maxRequestsPerClient"), + kProxy: Symbol("proxy agent options"), + kCounter: Symbol("socket request counter"), + kInterceptors: Symbol("dispatch interceptors"), + kMaxResponseSize: Symbol("max response size"), + kHTTP2Session: Symbol("http2Session"), + kHTTP2SessionState: Symbol("http2Session state"), + kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), + kConstruct: Symbol("constructable"), + kListeners: Symbol("listeners"), + kHTTPContext: Symbol("http context"), + kMaxConcurrentStreams: Symbol("max concurrent streams"), + kNoProxyAgent: Symbol("no proxy agent"), + kHttpProxyAgent: Symbol("http proxy agent"), + kHttpsProxyAgent: Symbol("https proxy agent") }; - module2.exports = Dispatcher; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js -var require_dispatcher_base = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/dispatcher-base.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js +var require_constants2 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js"(exports2, module2) { "use strict"; - var Dispatcher = require_dispatcher(); - var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - var DispatcherBase = class extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } - } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); - return; - } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); - } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? ( - /* istanbul ignore next: should never error */ - reject(err2) - ) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - if (!err) { - err = new ClientDestroyedError(); - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler); + var headerNameLowerCasedRecord = {}; + var wellknownHeaderNames = [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ]; + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + module2.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js +var require_tree = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js"(exports2, module2) { + "use strict"; + var { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = require_constants2(); + var TstNode = class _TstNode { + /** @type {any} */ + value = null; + /** @type {null | TstNode} */ + left = null; + /** @type {null | TstNode} */ + middle = null; + /** @type {null | TstNode} */ + right = null; + /** @type {number} */ + code; + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor(key, value, index) { + if (index === void 0 || index >= key.length) { + throw new TypeError("Unreachable"); } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); + const code2 = this.code = key.charCodeAt(index); + if (code2 > 127) { + throw new TypeError("key must be ascii string"); + } + if (key.length !== ++index) { + this.middle = new _TstNode(key, value, index); + } else { + this.value = value; } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler); } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); + /** + * @param {string} key + * @param {any} value + */ + add(key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError("Unreachable"); } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); + let index = 0; + let node = this; + while (true) { + const code2 = key.charCodeAt(index); + if (code2 > 127) { + throw new TypeError("key must be ascii string"); } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); + if (node.code === code2) { + if (length === ++index) { + node.value = value; + break; + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new _TstNode(key, value, index); + break; + } + } else if (node.code < code2) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new _TstNode(key, value, index); + break; + } + } else if (node.right !== null) { + node = node.right; + } else { + node.right = new _TstNode(key, value, index); + break; } - if (this[kClosed]) { - throw new ClientClosedError(); + } + } + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search(key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code2 = key[index]; + if (code2 <= 90 && code2 >= 65) { + code2 |= 32; } - return this[kInterceptedDispatch](opts, handler); - } catch (err) { - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); + while (node !== null) { + if (code2 === node.code) { + if (keylength === ++index) { + return node; + } + node = node.middle; + break; + } + node = node.code < code2 ? node.left : node.right; } - handler.onError(err); - return false; } + return null; } }; - module2.exports = DispatcherBase; + var TernarySearchTree = class { + /** @type {TstNode | null} */ + node = null; + /** + * @param {string} key + * @param {any} value + * */ + insert(key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); + } + } + /** + * @param {Uint8Array} key + * @return {any} + */ + lookup(key) { + return this.node?.search(key)?.value ?? null; + } + }; + var tree = new TernarySearchTree(); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + module2.exports = { + TernarySearchTree, + tree + }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js -var require_fixed_queue = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/node/fixed-queue.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js +var require_util = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js"(exports2, module2) { "use strict"; - var kSize = 2048; - var kMask = kSize - 1; - var FixedCircularBuffer = class { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; + var assert5 = require("node:assert"); + var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); + var { IncomingMessage } = require("node:http"); + var stream = require("node:stream"); + var net = require("node:net"); + var { Blob: Blob2 } = require("node:buffer"); + var nodeUtil = require("node:util"); + var { stringify } = require("node:querystring"); + var { EventEmitter: EE3 } = require("node:events"); + var { InvalidArgumentError } = require_errors(); + var { headerNameLowerCasedRecord } = require_constants2(); + var { tree } = require_tree(); + var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + var BodyAsyncIterable = class { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) - return null; - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; + async *[Symbol.asyncIterator]() { + assert5(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; } }; - module2.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } - isEmpty() { - return this.head.isEmpty(); - } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); + function wrapRequestBody(body) { + if (isStream2(body)) { + if (bodyLength(body) === 0) { + body.on("data", function() { + assert5(false); + }); } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; + if (typeof body.readableDidRead !== "boolean") { + body[kBodyUsed] = false; + EE3.prototype.on.call(body, "data", function() { + this[kBodyUsed] = true; + }); } - return next; - } - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js -var require_pool_stats = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-stats.js"(exports, module2) { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - var PoolStats = class { - constructor(pool) { - this[kPool] = pool; - } - get connected() { - return this[kPool][kConnected]; - } - get free() { - return this[kPool][kFree]; - } - get pending() { - return this[kPool][kPending]; - } - get queued() { - return this[kPool][kQueued]; - } - get running() { - return this[kPool][kRunning]; + return body; + } else if (body && typeof body.pipeTo === "function") { + return new BodyAsyncIterable(body); + } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) { + return new BodyAsyncIterable(body); + } else { + return body; } - get size() { - return this[kPool][kSize]; + } + function nop() { + } + function isStream2(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + function isBlobLike(object) { + if (object === null) { + return false; + } else if (object instanceof Blob2) { + return true; + } else if (typeof object !== "object") { + return false; + } else { + const sTag = object[Symbol.toStringTag]; + return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function"); } - }; - module2.exports = PoolStats; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js -var require_pool_base = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool-base.js"(exports, module2) { - "use strict"; - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - var PoolBase = class extends DispatcherBase { - constructor() { - super(); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); - } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); - } - }; - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); + } + function buildURL(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); } - get [kBusy]() { - return this[kNeedDrain]; + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; + return url; + } + function isValidPort(port) { + const value = parseInt(port, 10); + return value === Number(port) && value >= 0 && value <= 65535; + } + function isHttpOrHttpsPrefixed(value) { + return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); } - return ret; - } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); } - return ret; - } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); } - return ret; - } - get stats() { - return this[kStats]; - } - async [kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); } - } - async [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } - return !this[kNeedDrain]; - } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; + let path16 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin[origin.length - 1] === "/") { + origin = origin.slice(0, origin.length - 1); } - return this; + if (path16 && path16[0] !== "/") { + path16 = `/${path16}`; + } + return new URL(`${origin}${path16}`); } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } - }; - module2.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js -var require_constants2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/constants.js"(exports, module2) { - "use strict"; - var headerNameLowerCasedRecord = {}; - var wellknownHeaderNames = [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ]; - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + return url; } - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - module2.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js -var require_tree = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/tree.js"(exports, module2) { - "use strict"; - var { - wellknownHeaderNames, - headerNameLowerCasedRecord - } = require_constants2(); - var TstNode = class _TstNode { - /** @type {any} */ - value = null; - /** @type {null | TstNode} */ - left = null; - /** @type {null | TstNode} */ - middle = null; - /** @type {null | TstNode} */ - right = null; - /** @type {number} */ - code; - /** - * @param {Uint8Array} key - * @param {any} value - * @param {number} index - */ - constructor(key, value, index) { - if (index === void 0 || index >= key.length) { - throw new TypeError("Unreachable"); - } - this.code = key[index]; - if (key.length !== ++index) { - this.middle = new _TstNode(key, value, index); - } else { - this.value = value; - } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); } - /** - * @param {Uint8Array} key - * @param {any} value - * @param {number} index - */ - add(key, value, index) { - if (index === void 0 || index >= key.length) { - throw new TypeError("Unreachable"); - } - const code = key[index]; - if (this.code === code) { - if (key.length === ++index) { - this.value = value; - } else if (this.middle !== null) { - this.middle.add(key, value, index); - } else { - this.middle = new _TstNode(key, value, index); - } - } else if (this.code < code) { - if (this.left !== null) { - this.left.add(key, value, index); - } else { - this.left = new _TstNode(key, value, index); - } - } else if (this.right !== null) { - this.right.add(key, value, index); - } else { - this.right = new _TstNode(key, value, index); - } + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert5(idx2 !== -1); + return host.substring(1, idx2); } - /** - * @param {Uint8Array} key - * @return {TstNode | null} - */ - search(key) { - const keylength = key.length; - let index = 0; - let node = this; - while (node !== null && index < keylength) { - let code = key[index]; - if (code >= 65 && code <= 90) { - code |= 32; - } - while (node !== null) { - if (code === node.code) { - if (keylength === ++index) { - return node; - } - node = node.middle; - break; - } - node = node.code < code ? node.left : node.right; - } - } + const idx = host.indexOf(":"); + if (idx === -1) return host; + return host.substring(0, idx); + } + function getServerName(host) { + if (!host) { return null; } - }; - var TernarySearchTree = class { - /** @type {TstNode | null} */ - node = null; - /** - * @param {Uint8Array} key - * @param {any} value - * */ - insert(key, value) { - if (this.node === null) { - this.node = new TstNode(key, value, 0); - } else { - this.node.add(key, value, 0); - } - } - /** - * @param {Uint8Array} key - */ - lookup(key) { - return this.node?.search(key)?.value ?? null; + assert5(typeof host === "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; } - }; - var tree = new TernarySearchTree(); - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; - tree.insert(Buffer.from(key), key); + return servername; } - module2.exports = { - TernarySearchTree, - tree - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js -var require_util = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/util.js"(exports, module2) { - "use strict"; - var assert3 = require("node:assert"); - var { kDestroyed, kBodyUsed } = require_symbols(); - var { IncomingMessage } = require("node:http"); - var stream = require("node:stream"); - var net = require("node:net"); - var { InvalidArgumentError } = require_errors(); - var { Blob: Blob2 } = require("node:buffer"); - var nodeUtil = require("node:util"); - var { stringify } = require("node:querystring"); - var { headerNameLowerCasedRecord } = require_constants2(); - var { tree } = require_tree(); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - function nop() { + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); } - function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); - } - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); - } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; - } - return url; - } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; - let path10 = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); - } - if (path10 && !path10.startsWith("/")) { - path10 = `/${path10}`; - } - url = new URL(origin + path10); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); - } - return url; - } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert3(idx2 !== -1); - return host.substring(1, idx2); - } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substring(0, idx); - } - function getServerName(host) { - if (!host) { - return null; - } - assert3.strictEqual(typeof host, "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; - } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); } function bodyLength(body) { if (body == null) { return 0; - } else if (isStream(body)) { + } else if (isStream2(body)) { const state = body._readableState; return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; } else if (isBlobLike(body)) { @@ -5375,15 +3969,11 @@ var require_util = __commonJS({ } return null; } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2?._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; + function isDestroyed(body) { + return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); } function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + if (stream2 == null || !isStream2(stream2) || isDestroyed(stream2)) { return; } if (typeof stream2.destroy === "function") { @@ -5392,9 +3982,9 @@ var require_util = __commonJS({ } stream2.destroy(err); } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); + queueMicrotask(() => { + stream2.emit("error", err); + }); } if (stream2.destroyed !== true) { stream2[kDestroyed] = true; @@ -5412,10 +4002,7 @@ var require_util = __commonJS({ return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); } function parseHeaders(headers, obj) { - if (!Array.isArray(headers)) - return headers; - if (obj === void 0) - obj = {}; + if (obj === void 0) obj = {}; for (let i = 0; i < headers.length; i += 2) { const key = headerNameToString(headers[i]); let val = obj[key]; @@ -5440,20 +4027,26 @@ var require_util = __commonJS({ return obj; } function parseRawHeaders(headers) { - const ret = []; + const len = headers.length; + const ret = new Array(len); let hasContentLength = false; let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); + key = headers[n]; + val = headers[n + 1]; + typeof key !== "string" && (key = key.toString()); + typeof val !== "string" && (val = val.toString("utf8")); + kLen = key.length; + if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) { hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); + } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = n + 1; } + ret[n] = key; + ret[n + 1] = val; } if (hasContentLength && contentDispositionIdx !== -1) { ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); @@ -5498,7 +4091,7 @@ var require_util = __commonJS({ function isErrored(body) { return !!(body && stream.isErrored(body)); } - function isReadable(body) { + function isReadable2(body) { return !!(body && stream.isReadable(body)); } function getSocketInfo(socket) { @@ -5553,14 +4146,13 @@ var require_util = __commonJS({ signal.addListener("abort", listener); return () => signal.removeListener("abort", listener); } - var hasToWellFormed = !!String.prototype.toWellFormed; + var hasToWellFormed = typeof String.prototype.toWellFormed === "function"; + var hasIsWellFormed = typeof String.prototype.isWellFormed === "function"; function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); - } - return `${val}`; + return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val); + } + function isUSVString(val) { + return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`; } function isTokenCharCode(c) { switch (c) { @@ -5597,9 +4189,12 @@ var require_util = __commonJS({ } return true; } + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + function isValidHeaderValue(characters) { + return !headerCharRegex.test(characters); + } function parseRangeHeader(range) { - if (range == null || range === "") - return { start: 0, end: null, size: null }; + if (range == null || range === "") return { start: 0, end: null, size: null }; const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; return m ? { start: parseInt(m[1]), @@ -5607,26 +4202,70 @@ var require_util = __commonJS({ size: m[3] ? parseInt(m[3]) : null } : null; } + function addListener(obj, name2, listener) { + const listeners = obj[kListeners] ??= []; + listeners.push([name2, listener]); + obj.on(name2, listener); + return obj; + } + function removeAllListeners(obj) { + for (const [name2, listener] of obj[kListeners] ?? []) { + obj.removeListener(name2, listener); + } + obj[kListeners] = null; + } + function errorRequest(client, request, err) { + try { + request.onError(err); + assert5(request.aborted); + } catch (err2) { + client.emit("error", err2); + } + } var kEnumerableProperty = /* @__PURE__ */ Object.create(null); kEnumerableProperty.enumerable = true; + var normalizedMethodRecordsBase = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + var normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: "patch", + PATCH: "PATCH" + }; + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); module2.exports = { kEnumerableProperty, nop, isDisturbed, isErrored, - isReadable, + isReadable: isReadable2, toUSVString, - isReadableAborted, + isUSVString, isBlobLike, parseOrigin, parseURL, getServerName, - isStream, + isStream: isStream2, isIterable, isAsyncIterable, isDestroyed, headerNameToString, bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -5641,6118 +4280,5661 @@ var require_util = __commonJS({ buildURL, addAbortListener, isValidHTTPToken, + isValidHeaderValue, isTokenCharCode, parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, nodeMajor, nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] + safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"], + wrapRequestBody }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js -var require_diagnostics = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/diagnostics.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js +var require_readable = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js"(exports2, module2) { "use strict"; - var diagnosticsChannel = require("node:diagnostics_channel"); - var util = require("node:util"); - var undiciDebugLog = util.debuglog("undici"); - var fetchDebuglog = util.debuglog("fetch"); - var websocketDebuglog = util.debuglog("websocket"); - var isClientSet = false; - var channels = { - // Client - beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), - connected: diagnosticsChannel.channel("undici:client:connected"), - connectError: diagnosticsChannel.channel("undici:client:connectError"), - sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), - // Request - create: diagnosticsChannel.channel("undici:request:create"), - bodySent: diagnosticsChannel.channel("undici:request:bodySent"), - headers: diagnosticsChannel.channel("undici:request:headers"), - trailers: diagnosticsChannel.channel("undici:request:trailers"), - error: diagnosticsChannel.channel("undici:request:error"), - // WebSocket - open: diagnosticsChannel.channel("undici:websocket:open"), - close: diagnosticsChannel.channel("undici:websocket:close"), - socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), - ping: diagnosticsChannel.channel("undici:websocket:ping"), - pong: diagnosticsChannel.channel("undici:websocket:pong") - }; - if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connecting to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connected to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host }, - error - } = evt; - debuglog( - "connection to %s using %s%s errored - %s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version2, - error.message - ); - }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("sending request to %s %s/%s", method, origin, path10); - }); - diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { - const { - request: { method, path: path10, origin }, - response: { statusCode } - } = evt; - debuglog( - "received response to %s %s/%s - HTTP %d", - method, - origin, - path10, - statusCode - ); - }); - diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("trailers received from %s %s/%s", method, origin, path10); - }); - diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { - const { - request: { method, path: path10, origin }, - error - } = evt; - debuglog( - "request to %s %s/%s errored - %s", - method, - origin, - path10, - error.message - ); - }); - isClientSet = true; - } - if (websocketDebuglog.enabled) { - if (!isClientSet) { - const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connecting to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host } - } = evt; - debuglog( - "connected to %s%s using %s%s", - host, - port ? `:${port}` : "", - protocol, - version2 - ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { - const { - connectParams: { version: version2, protocol, port, host }, - error - } = evt; - debuglog( - "connection to %s%s using %s%s errored - %s", - host, - port ? `:${port}` : "", - protocol, - version2, - error.message - ); - }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { - const { - request: { method, path: path10, origin } - } = evt; - debuglog("sending request to %s %s/%s", method, origin, path10); + var assert5 = require("node:assert"); + var { Readable: Readable2 } = require("node:stream"); + var { RequestAbortedError, NotSupportedError, InvalidArgumentError, AbortError } = require_errors(); + var util = require_util(); + var { ReadableStreamFrom } = require_util(); + var kConsume = Symbol("kConsume"); + var kReading = Symbol("kReading"); + var kBody = Symbol("kBody"); + var kAbort = Symbol("kAbort"); + var kContentType = Symbol("kContentType"); + var kContentLength = Symbol("kContentLength"); + var noop3 = () => { + }; + var BodyReadable = class extends Readable2 { + constructor({ + resume, + abort, + contentType = "", + contentLength, + highWaterMark = 64 * 1024 + // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kContentLength] = contentLength; + this[kReading] = false; } - diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { - const { - address: { address, port } - } = evt; - websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); - }); - diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { - const { websocket, code, reason } = evt; - websocketDebuglog( - "closed connection to %s - %s %s", - websocket.url, - code, - reason - ); - }); - diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { - websocketDebuglog("connection errored - %s", err.message); - }); - diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { - websocketDebuglog("ping received"); - }); - diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { - websocketDebuglog("pong received"); - }); - } - module2.exports = { - channels - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js -var require_timers = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/timers.js"(exports, module2) { - "use strict"; - var fastNow = Date.now(); - var fastNowTimeout; - var fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; + destroy(err) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (err) { + this[kAbort](); } + return super.destroy(err); } - if (fastTimers.length > 0) { - refreshTimeout(); + _destroy(err, callback) { + if (!this[kReading]) { + setImmediate(() => { + callback(err); + }); + } else { + callback(err); + } } - } - function refreshTimeout() { - if (fastNowTimeout?.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); + on(ev, ...args) { + if (ev === "data" || ev === "readable") { + this[kReading] = true; } + return super.on(ev, ...args); } - } - var Timeout = class { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); + addListener(ev, ...args) { + return this.on(ev, ...args); } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } + off(ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === "data" || ev === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; } - this.state = 0; + return ret; } - clear() { - this.state = -1; + removeListener(ev, ...args) { + return this.off(ev, ...args); } - }; - module2.exports = { - setTimeout(callback, delay, opaque) { - return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); + push(chunk) { + if (this[kConsume] && chunk !== null) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; } + return super.push(chunk); } - }; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js -var require_sbmh = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/streamsearch/sbmh.js"(exports, module2) { - "use strict"; - var EventEmitter = require("node:events").EventEmitter; - var inherits = require("node:util").inherits; - function SBMH(needle) { - if (typeof needle === "string") { - needle = Buffer.from(needle); - } - if (!Buffer.isBuffer(needle)) { - throw new TypeError("The needle has to be a String or a Buffer."); - } - const needleLength = needle.length; - if (needleLength === 0) { - throw new Error("The needle cannot be an empty String/Buffer."); - } - if (needleLength > 256) { - throw new Error("The needle cannot have a length bigger than 256."); - } - this.maxMatches = Infinity; - this.matches = 0; - this._occ = new Array(256).fill(needleLength); - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; - this._lookbehind = Buffer.alloc(needleLength); - for (var i = 0; i < needleLength - 1; ++i) { - this._occ[needle[i]] = needleLength - 1 - i; - } - } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function() { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; - }; - SBMH.prototype.push = function(chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, "binary"); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { - r = this._sbmh_feed(chunk); + // https://fetch.spec.whatwg.org/#dom-body-text + async text() { + return consume(this, "text"); } - return r; - }; - SBMH.prototype._sbmh_feed = function(data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; - let pos = -this._lookbehind_size; - let ch; - if (pos < 0) { - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); - if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { - this._lookbehind_size = 0; - ++this.matches; - this.emit("info", true); - return this._bufpos = pos + needleLength; - } - pos += this._occ[ch]; - } - if (pos < 0) { - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { - ++pos; - } - } - if (pos >= 0) { - this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - this.emit("info", false, this._lookbehind, 0, bytesToCutOff); - } - this._lookbehind.copy( - this._lookbehind, - 0, - bytesToCutOff, - this._lookbehind_size - bytesToCutOff - ); - this._lookbehind_size -= bytesToCutOff; - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - this._bufpos = len; - return len; - } - } - pos += (pos >= 0) * this._bufpos; - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { - this.emit("info", true, data, this._bufpos, pos); - } else { - this.emit("info", true); - } - return this._bufpos = pos + needleLength; - } else { - pos = len - needleLength; + // https://fetch.spec.whatwg.org/#dom-body-json + async json() { + return consume(this, "json"); } - while (pos < len && (data[pos] !== needle[0] || Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0)) { - ++pos; + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob() { + return consume(this, "blob"); } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; + // https://fetch.spec.whatwg.org/#dom-body-bytes + async bytes() { + return consume(this, "bytes"); } - if (pos > 0) { - this.emit("info", false, data, this._bufpos, pos < len ? pos : len); + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer() { + return consume(this, "arrayBuffer"); } - this._bufpos = len; - return len; - }; - SBMH.prototype._sbmh_lookup_char = function(data, pos) { - return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; - }; - SBMH.prototype._sbmh_memcmp = function(data, pos, len) { - for (var i = 0; i < len; ++i) { - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { - return false; - } + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData() { + throw new NotSupportedError(); } - return true; - }; - module2.exports = SBMH; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js -var require_PartStream = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js"(exports, module2) { - "use strict"; - var inherits = require("node:util").inherits; - var ReadableStream2 = require("node:stream").Readable; - function PartStream(opts) { - ReadableStream2.call(this, opts); - } - inherits(PartStream, ReadableStream2); - PartStream.prototype._read = function(n) { - }; - module2.exports = PartStream; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js -var require_getLimit = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/getLimit.js"(exports, module2) { - "use strict"; - module2.exports = function getLimit(limits, name, defaultLimit) { - if (!limits || limits[name] === void 0 || limits[name] === null) { - return defaultLimit; + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed() { + return util.isDisturbed(this); } - if (typeof limits[name] !== "number" || isNaN(limits[name])) { - throw new TypeError("Limit " + name + " is not a valid number"); + // https://fetch.spec.whatwg.org/#dom-body-body + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert5(this[kBody].locked); + } + } + return this[kBody]; + } + async dump(opts) { + let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024; + const signal = opts?.signal; + if (signal != null && (typeof signal !== "object" || !("aborted" in signal))) { + throw new InvalidArgumentError("signal must be an AbortSignal"); + } + signal?.throwIfAborted(); + if (this._readableState.closeEmitted) { + return null; + } + return await new Promise((resolve, reject) => { + if (this[kContentLength] > limit) { + this.destroy(new AbortError()); + } + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()); + }; + signal?.addEventListener("abort", onAbort); + this.on("close", function() { + signal?.removeEventListener("abort", onAbort); + if (signal?.aborted) { + reject(signal.reason ?? new AbortError()); + } else { + resolve(null); + } + }).on("error", noop3).on("data", function(chunk) { + limit -= chunk.length; + if (limit <= 0) { + this.destroy(); + } + }).resume(); + }); } - return limits[name]; }; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js -var require_HeaderParser = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js"(exports, module2) { - "use strict"; - var EventEmitter = require("node:events").EventEmitter; - var inherits = require("node:util").inherits; - var getLimit = require_getLimit(); - var StreamSearch = require_sbmh(); - var B_DCRLF = Buffer.from("\r\n\r\n"); - var RE_CRLF = /\r\n/g; - var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; - function HeaderParser(cfg) { - EventEmitter.call(this); - cfg = cfg || {}; - const self2 = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2e3); - this.maxHeaderSize = getLimit(cfg, "maxHeaderSize", 80 * 1024); - this.buffer = ""; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on("info", function(isMatch, data, start, end) { - if (data && !self2.maxed) { - if (self2.nread + end - start >= self2.maxHeaderSize) { - end = self2.maxHeaderSize - self2.nread + start; - self2.nread = self2.maxHeaderSize; - self2.maxed = true; + function isLocked(self2) { + return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; + } + function isUnusable(self2) { + return util.isDisturbed(self2) || isLocked(self2); + } + async function consume(stream, type) { + assert5(!stream[kConsume]); + return new Promise((resolve, reject) => { + if (isUnusable(stream)) { + const rState = stream._readableState; + if (rState.destroyed && rState.closeEmitted === false) { + stream.on("error", (err) => { + reject(err); + }).on("close", () => { + reject(new TypeError("unusable")); + }); } else { - self2.nread += end - start; + reject(rState.errored ?? new TypeError("unusable")); } - self2.buffer += data.toString("binary", start, end); - } - if (isMatch) { - self2._finish(); + } else { + queueMicrotask(() => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + consumeStart(stream[kConsume]); + }); } }); } - inherits(HeaderParser, EventEmitter); - HeaderParser.prototype.push = function(data) { - const r = this.ss.push(data); - if (this.finished) { - return r; - } - }; - HeaderParser.prototype.reset = function() { - this.finished = false; - this.buffer = ""; - this.header = {}; - this.ss.reset(); - }; - HeaderParser.prototype._finish = function() { - if (this.buffer) { - this._parseHeader(); - } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ""; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit("header", header); - }; - HeaderParser.prototype._parseHeader = function() { - if (this.npairs === this.maxHeaderPairs) { + function consumeStart(consume2) { + if (consume2.body === null) { return; } - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; - for (var i = 0; i < len; ++i) { - if (lines[i].length === 0) { - continue; - } - if (lines[i][0] === " " || lines[i][0] === " ") { - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue; - } - } - const posColon = lines[i].indexOf(":"); - if (posColon === -1 || posColon === 0) { - return; + const { _readableState: state } = consume2.stream; + if (state.bufferIndex) { + const start = state.bufferIndex; + const end = state.buffer.length; + for (let n = start; n < end; n++) { + consumePush(consume2, state.buffer[n]); } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push(m[2] || ""); - if (++this.npairs === this.maxHeaderPairs) { - break; + } else { + for (const chunk of state.buffer) { + consumePush(consume2, chunk); } } - }; - module2.exports = HeaderParser; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js -var require_Dicer = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js"(exports, module2) { - "use strict"; - var WritableStream = require("node:stream").Writable; - var inherits = require("node:util").inherits; - var StreamSearch = require_sbmh(); - var PartStream = require_PartStream(); - var HeaderParser = require_HeaderParser(); - var DASH = 45; - var B_ONEDASH = Buffer.from("-"); - var B_CRLF = Buffer.from("\r\n"); - var EMPTY_FN = function() { - }; - function Dicer(cfg) { - if (!(this instanceof Dicer)) { - return new Dicer(cfg); - } - WritableStream.call(this, cfg); - if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { - throw new TypeError("Boundary required"); - } - if (typeof cfg.boundary === "string") { - this.setBoundary(cfg.boundary); + if (state.endEmitted) { + consumeEnd(this[kConsume]); } else { - this._bparser = void 0; - } - this._headerFirst = cfg.headerFirst; - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = void 0; - this._cb = void 0; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; - const self2 = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on("header", function(header) { - self2._inHeader = false; - self2._part.emit("header", header); - }); + consume2.stream.on("end", function() { + consumeEnd(this[kConsume]); + }); + } + consume2.stream.resume(); + while (consume2.stream.read() != null) { + } } - inherits(Dicer, WritableStream); - Dicer.prototype.emit = function(ev) { - if (ev === "finish" && !this._realFinish) { - if (!this._finished) { - const self2 = this; - process.nextTick(function() { - self2.emit("error", new Error("Unexpected end of multipart data")); - if (self2._part && !self2._ignoreData) { - const type = self2._isPreamble ? "Preamble" : "Part"; - self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); - self2._part.push(null); - process.nextTick(function() { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - }); - return; - } - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - }); - } - } else { - WritableStream.prototype.emit.apply(this, arguments); + function chunksDecode(chunks, length) { + if (chunks.length === 0 || length === 0) { + return ""; } - }; - Dicer.prototype._write = function(data, encoding, cb) { - if (!this._hparser && !this._bparser) { - return cb(); + const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks, length); + const bufferLength = buffer.length; + const start = bufferLength > 2 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191 ? 3 : 0; + return buffer.utf8Slice(start, bufferLength); + } + function chunksConcat(chunks, length) { + if (chunks.length === 0 || length === 0) { + return new Uint8Array(0); } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this._events.preamble) { - this.emit("preamble", this._part); - } else { - this._ignore(); - } - } - const r = this._hparser.push(data); - if (!this._inHeader && r !== void 0 && r < data.length) { - data = data.slice(r); - } else { - return cb(); - } + if (chunks.length === 1) { + return new Uint8Array(chunks[0]); } - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; + const buffer = new Uint8Array(Buffer.allocUnsafeSlow(length).buffer); + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + const chunk = chunks[i]; + buffer.set(chunk, offset); + offset += chunk.length; } - this._bparser.push(data); - if (this._pause) { - this._cb = cb; - } else { - cb(); + return buffer; + } + function consumeEnd(consume2) { + const { type, body, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(chunksDecode(body, length)); + } else if (type === "json") { + resolve(JSON.parse(chunksDecode(body, length))); + } else if (type === "arrayBuffer") { + resolve(chunksConcat(body, length).buffer); + } else if (type === "blob") { + resolve(new Blob(body, { type: stream[kContentType] })); + } else if (type === "bytes") { + resolve(chunksConcat(body, length)); + } + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); } - }; - Dicer.prototype.reset = function() { - this._part = void 0; - this._bparser = void 0; - this._hparser = void 0; - }; - Dicer.prototype.setBoundary = function(boundary) { - const self2 = this; - this._bparser = new StreamSearch("\r\n--" + boundary); - this._bparser.on("info", function(isMatch, data, start, end) { - self2._oninfo(isMatch, data, start, end); - }); - }; - Dicer.prototype._ignore = function() { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on("error", EMPTY_FN); - this._part.resume(); + } + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); + } + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; } - }; - Dicer.prototype._oninfo = function(isMatch, data, start, end) { - let buf; - const self2 = this; - let i = 0; - let r; - let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && start + i < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { - buf = B_ONEDASH; - } - this._dashes = 0; + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); + } + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; + } + module2.exports = { Readable: BodyReadable, chunksDecode }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js +var require_util2 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js"(exports2, module2) { + var assert5 = require("node:assert"); + var { + ResponseStatusCodeError + } = require_errors(); + var { chunksDecode } = require_readable(); + var CHUNK_LIMIT = 128 * 1024; + async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert5(body); + let chunks = []; + let length = 0; + try { + for await (const chunk of body) { + chunks.push(chunk); + length += chunk.length; + if (length > CHUNK_LIMIT) { + chunks = []; + length = 0; break; } } - if (this._dashes === 2) { - if (start + i < end && this._events.trailer) { - this.emit("trailer", data.slice(start + i, end)); - } - this.reset(); - this._finished = true; - if (self2._parts === 0) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - } - } - if (this._dashes) { - return; - } + } catch { + chunks = []; + length = 0; } - if (this._justMatched) { - this._justMatched = false; + const message = `Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`; + if (statusCode === 204 || !contentType || !length) { + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers))); + return; } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function(n) { - self2._unpause(); - }; - if (this._isPreamble && this._events.preamble) { - this.emit("preamble", this._part); - } else if (this._isPreamble !== true && this._events.part) { - this.emit("part", this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { - this._inHeader = true; + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + let payload; + try { + if (isContentTypeApplicationJson(contentType)) { + payload = JSON.parse(chunksDecode(chunks, length)); + } else if (isContentTypeText(contentType)) { + payload = chunksDecode(chunks, length); } + } catch { + } finally { + Error.stackTraceLimit = stackTraceLimit; } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { - shouldWriteMore = this._part.push(buf); + queueMicrotask(() => callback(new ResponseStatusCodeError(message, statusCode, headers, payload))); + } + var isContentTypeApplicationJson = (contentType) => { + return contentType.length > 15 && contentType[11] === "/" && contentType[0] === "a" && contentType[1] === "p" && contentType[2] === "p" && contentType[3] === "l" && contentType[4] === "i" && contentType[5] === "c" && contentType[6] === "a" && contentType[7] === "t" && contentType[8] === "i" && contentType[9] === "o" && contentType[10] === "n" && contentType[12] === "j" && contentType[13] === "s" && contentType[14] === "o" && contentType[15] === "n"; + }; + var isContentTypeText = (contentType) => { + return contentType.length > 4 && contentType[4] === "/" && contentType[0] === "t" && contentType[1] === "e" && contentType[2] === "x" && contentType[3] === "t"; + }; + module2.exports = { + getResolveErrorBodyCallback, + isContentTypeApplicationJson, + isContentTypeText + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js +var require_api_request = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js"(exports2, module2) { + "use strict"; + var assert5 = require("node:assert"); + var { Readable: Readable2 } = require_readable(); + var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util2(); + var { AsyncResource } = require("node:async_hooks"); + var RequestHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { - this._pause = true; + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { - this._hparser.push(buf); + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== void 0 && r < end) { - this._oninfo(false, data, start + r, end); + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_REQUEST"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { - this._isPreamble = false; - } else { - if (start !== end) { - ++this._parts; - this._part.on("end", function() { - if (--self2._parts === 0) { - if (self2._finished) { - self2._realFinish = true; - self2.emit("finish"); - self2._realFinish = false; - } else { - self2._unpause(); - } + this.method = method; + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + this.signal = signal; + this.reason = null; + this.removeAbortListener = null; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + if (this.signal) { + if (this.signal.aborted) { + this.reason = this.signal.reason ?? new RequestAbortedError(); + } else { + this.removeAbortListener = util.addAbortListener(this.signal, () => { + this.reason = this.signal.reason ?? new RequestAbortedError(); + if (this.res) { + util.destroy(this.res.on("error", util.nop), this.reason); + } else if (this.abort) { + this.abort(this.reason); + } + if (this.removeAbortListener) { + this.res?.off("close", this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; } }); } } - this._part.push(null); - this._part = void 0; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; } - }; - Dicer.prototype._unpause = function() { - if (!this._pause) { - return; - } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = void 0; - cb(); - } - }; - module2.exports = Dicer; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js -var require_decodeText = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/decodeText.js"(exports, module2) { - "use strict"; - var utf8Decoder = new TextDecoder("utf-8"); - var textDecoders = /* @__PURE__ */ new Map([ - ["utf-8", utf8Decoder], - ["utf8", utf8Decoder] - ]); - function getDecoder(charset) { - let lc; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc === void 0) { - lc = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; } + assert5(this.callback); + this.abort = abort; + this.context = context; } - } - var decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.utf8Slice(0, data.length); - }, - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; } - if (typeof data === "string") { - return data; + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + const contentLength = parsedHeaders["content-length"]; + const res = new Readable2({ + resume, + abort, + contentType, + contentLength: this.method !== "HEAD" && contentLength ? Number(contentLength) : null, + highWaterMark + }); + if (this.removeAbortListener) { + res.on("close", this.removeAbortListener); + } + this.callback = null; + this.res = res; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body: res, + context + }); + } } - return data.latin1Slice(0, data.length); - }, - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.ucs2Slice(0, data.length); - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + } + onData(chunk) { + return this.res.push(chunk); + } + onComplete(trailers) { + util.parseHeaders(trailers, this.trailers); + this.res.push(null); + } + onError(err) { + const { res, callback, body, opaque } = this; + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } - return data.base64Slice(0, data.length); - }, - other: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; + if (res) { + this.res = null; + queueMicrotask(() => { + util.destroy(res, err); + }); } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); + if (body) { + this.body = null; + util.destroy(body, err); } - if (textDecoders.has(exports.toString())) { - try { - return textDecoders.get(exports).decode(data); - } catch (e) { - } + if (this.removeAbortListener) { + res?.off("close", this.removeAbortListener); + this.removeAbortListener(); + this.removeAbortListener = null; } - return typeof data === "string" ? data : data.toString(); } }; - function decodeText(text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding); + function request(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = request; + module2.exports.RequestHandler = RequestHandler; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js +var require_abort_signal = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { + var { addAbortListener } = require_util(); + var { RequestAbortedError } = require_errors(); + var kListener = Symbol("kListener"); + var kSignal = Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(self2[kSignal]?.reason); + } else { + self2.reason = self2[kSignal]?.reason ?? new RequestAbortedError(); + } + removeSignal(self2); + } + function addSignal(self2, signal) { + self2.reason = null; + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self2); + return; + } + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); + } + function removeSignal(self2) { + if (!self2[kSignal]) { + return; + } + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); } - return text; + self2[kSignal] = null; + self2[kListener] = null; } - module2.exports = decodeText; + module2.exports = { + addSignal, + removeSignal + }; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js -var require_parseParams = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/parseParams.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js +var require_api_stream = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js"(exports2, module2) { "use strict"; - var decodeText = require_decodeText(); - var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - var EncodedLookup = { - "%00": "\0", - "%01": "", - "%02": "", - "%03": "", - "%04": "", - "%05": "", - "%06": "", - "%07": "\x07", - "%08": "\b", - "%09": " ", - "%0a": "\n", - "%0A": "\n", - "%0b": "\v", - "%0B": "\v", - "%0c": "\f", - "%0C": "\f", - "%0d": "\r", - "%0D": "\r", - "%0e": "", - "%0E": "", - "%0f": "", - "%0F": "", - "%10": "", - "%11": "", - "%12": "", - "%13": "", - "%14": "", - "%15": "", - "%16": "", - "%17": "", - "%18": "", - "%19": "", - "%1a": "", - "%1A": "", - "%1b": "\x1B", - "%1B": "\x1B", - "%1c": "", - "%1C": "", - "%1d": "", - "%1D": "", - "%1e": "", - "%1E": "", - "%1f": "", - "%1F": "", - "%20": " ", - "%21": "!", - "%22": '"', - "%23": "#", - "%24": "$", - "%25": "%", - "%26": "&", - "%27": "'", - "%28": "(", - "%29": ")", - "%2a": "*", - "%2A": "*", - "%2b": "+", - "%2B": "+", - "%2c": ",", - "%2C": ",", - "%2d": "-", - "%2D": "-", - "%2e": ".", - "%2E": ".", - "%2f": "/", - "%2F": "/", - "%30": "0", - "%31": "1", - "%32": "2", - "%33": "3", - "%34": "4", - "%35": "5", - "%36": "6", - "%37": "7", - "%38": "8", - "%39": "9", - "%3a": ":", - "%3A": ":", - "%3b": ";", - "%3B": ";", - "%3c": "<", - "%3C": "<", - "%3d": "=", - "%3D": "=", - "%3e": ">", - "%3E": ">", - "%3f": "?", - "%3F": "?", - "%40": "@", - "%41": "A", - "%42": "B", - "%43": "C", - "%44": "D", - "%45": "E", - "%46": "F", - "%47": "G", - "%48": "H", - "%49": "I", - "%4a": "J", - "%4A": "J", - "%4b": "K", - "%4B": "K", - "%4c": "L", - "%4C": "L", - "%4d": "M", - "%4D": "M", - "%4e": "N", - "%4E": "N", - "%4f": "O", - "%4F": "O", - "%50": "P", - "%51": "Q", - "%52": "R", - "%53": "S", - "%54": "T", - "%55": "U", - "%56": "V", - "%57": "W", - "%58": "X", - "%59": "Y", - "%5a": "Z", - "%5A": "Z", - "%5b": "[", - "%5B": "[", - "%5c": "\\", - "%5C": "\\", - "%5d": "]", - "%5D": "]", - "%5e": "^", - "%5E": "^", - "%5f": "_", - "%5F": "_", - "%60": "`", - "%61": "a", - "%62": "b", - "%63": "c", - "%64": "d", - "%65": "e", - "%66": "f", - "%67": "g", - "%68": "h", - "%69": "i", - "%6a": "j", - "%6A": "j", - "%6b": "k", - "%6B": "k", - "%6c": "l", - "%6C": "l", - "%6d": "m", - "%6D": "m", - "%6e": "n", - "%6E": "n", - "%6f": "o", - "%6F": "o", - "%70": "p", - "%71": "q", - "%72": "r", - "%73": "s", - "%74": "t", - "%75": "u", - "%76": "v", - "%77": "w", - "%78": "x", - "%79": "y", - "%7a": "z", - "%7A": "z", - "%7b": "{", - "%7B": "{", - "%7c": "|", - "%7C": "|", - "%7d": "}", - "%7D": "}", - "%7e": "~", - "%7E": "~", - "%7f": "\x7F", - "%7F": "\x7F", - "%80": "\x80", - "%81": "\x81", - "%82": "\x82", - "%83": "\x83", - "%84": "\x84", - "%85": "\x85", - "%86": "\x86", - "%87": "\x87", - "%88": "\x88", - "%89": "\x89", - "%8a": "\x8A", - "%8A": "\x8A", - "%8b": "\x8B", - "%8B": "\x8B", - "%8c": "\x8C", - "%8C": "\x8C", - "%8d": "\x8D", - "%8D": "\x8D", - "%8e": "\x8E", - "%8E": "\x8E", - "%8f": "\x8F", - "%8F": "\x8F", - "%90": "\x90", - "%91": "\x91", - "%92": "\x92", - "%93": "\x93", - "%94": "\x94", - "%95": "\x95", - "%96": "\x96", - "%97": "\x97", - "%98": "\x98", - "%99": "\x99", - "%9a": "\x9A", - "%9A": "\x9A", - "%9b": "\x9B", - "%9B": "\x9B", - "%9c": "\x9C", - "%9C": "\x9C", - "%9d": "\x9D", - "%9D": "\x9D", - "%9e": "\x9E", - "%9E": "\x9E", - "%9f": "\x9F", - "%9F": "\x9F", - "%a0": "\xA0", - "%A0": "\xA0", - "%a1": "\xA1", - "%A1": "\xA1", - "%a2": "\xA2", - "%A2": "\xA2", - "%a3": "\xA3", - "%A3": "\xA3", - "%a4": "\xA4", - "%A4": "\xA4", - "%a5": "\xA5", - "%A5": "\xA5", - "%a6": "\xA6", - "%A6": "\xA6", - "%a7": "\xA7", - "%A7": "\xA7", - "%a8": "\xA8", - "%A8": "\xA8", - "%a9": "\xA9", - "%A9": "\xA9", - "%aa": "\xAA", - "%Aa": "\xAA", - "%aA": "\xAA", - "%AA": "\xAA", - "%ab": "\xAB", - "%Ab": "\xAB", - "%aB": "\xAB", - "%AB": "\xAB", - "%ac": "\xAC", - "%Ac": "\xAC", - "%aC": "\xAC", - "%AC": "\xAC", - "%ad": "\xAD", - "%Ad": "\xAD", - "%aD": "\xAD", - "%AD": "\xAD", - "%ae": "\xAE", - "%Ae": "\xAE", - "%aE": "\xAE", - "%AE": "\xAE", - "%af": "\xAF", - "%Af": "\xAF", - "%aF": "\xAF", - "%AF": "\xAF", - "%b0": "\xB0", - "%B0": "\xB0", - "%b1": "\xB1", - "%B1": "\xB1", - "%b2": "\xB2", - "%B2": "\xB2", - "%b3": "\xB3", - "%B3": "\xB3", - "%b4": "\xB4", - "%B4": "\xB4", - "%b5": "\xB5", - "%B5": "\xB5", - "%b6": "\xB6", - "%B6": "\xB6", - "%b7": "\xB7", - "%B7": "\xB7", - "%b8": "\xB8", - "%B8": "\xB8", - "%b9": "\xB9", - "%B9": "\xB9", - "%ba": "\xBA", - "%Ba": "\xBA", - "%bA": "\xBA", - "%BA": "\xBA", - "%bb": "\xBB", - "%Bb": "\xBB", - "%bB": "\xBB", - "%BB": "\xBB", - "%bc": "\xBC", - "%Bc": "\xBC", - "%bC": "\xBC", - "%BC": "\xBC", - "%bd": "\xBD", - "%Bd": "\xBD", - "%bD": "\xBD", - "%BD": "\xBD", - "%be": "\xBE", - "%Be": "\xBE", - "%bE": "\xBE", - "%BE": "\xBE", - "%bf": "\xBF", - "%Bf": "\xBF", - "%bF": "\xBF", - "%BF": "\xBF", - "%c0": "\xC0", - "%C0": "\xC0", - "%c1": "\xC1", - "%C1": "\xC1", - "%c2": "\xC2", - "%C2": "\xC2", - "%c3": "\xC3", - "%C3": "\xC3", - "%c4": "\xC4", - "%C4": "\xC4", - "%c5": "\xC5", - "%C5": "\xC5", - "%c6": "\xC6", - "%C6": "\xC6", - "%c7": "\xC7", - "%C7": "\xC7", - "%c8": "\xC8", - "%C8": "\xC8", - "%c9": "\xC9", - "%C9": "\xC9", - "%ca": "\xCA", - "%Ca": "\xCA", - "%cA": "\xCA", - "%CA": "\xCA", - "%cb": "\xCB", - "%Cb": "\xCB", - "%cB": "\xCB", - "%CB": "\xCB", - "%cc": "\xCC", - "%Cc": "\xCC", - "%cC": "\xCC", - "%CC": "\xCC", - "%cd": "\xCD", - "%Cd": "\xCD", - "%cD": "\xCD", - "%CD": "\xCD", - "%ce": "\xCE", - "%Ce": "\xCE", - "%cE": "\xCE", - "%CE": "\xCE", - "%cf": "\xCF", - "%Cf": "\xCF", - "%cF": "\xCF", - "%CF": "\xCF", - "%d0": "\xD0", - "%D0": "\xD0", - "%d1": "\xD1", - "%D1": "\xD1", - "%d2": "\xD2", - "%D2": "\xD2", - "%d3": "\xD3", - "%D3": "\xD3", - "%d4": "\xD4", - "%D4": "\xD4", - "%d5": "\xD5", - "%D5": "\xD5", - "%d6": "\xD6", - "%D6": "\xD6", - "%d7": "\xD7", - "%D7": "\xD7", - "%d8": "\xD8", - "%D8": "\xD8", - "%d9": "\xD9", - "%D9": "\xD9", - "%da": "\xDA", - "%Da": "\xDA", - "%dA": "\xDA", - "%DA": "\xDA", - "%db": "\xDB", - "%Db": "\xDB", - "%dB": "\xDB", - "%DB": "\xDB", - "%dc": "\xDC", - "%Dc": "\xDC", - "%dC": "\xDC", - "%DC": "\xDC", - "%dd": "\xDD", - "%Dd": "\xDD", - "%dD": "\xDD", - "%DD": "\xDD", - "%de": "\xDE", - "%De": "\xDE", - "%dE": "\xDE", - "%DE": "\xDE", - "%df": "\xDF", - "%Df": "\xDF", - "%dF": "\xDF", - "%DF": "\xDF", - "%e0": "\xE0", - "%E0": "\xE0", - "%e1": "\xE1", - "%E1": "\xE1", - "%e2": "\xE2", - "%E2": "\xE2", - "%e3": "\xE3", - "%E3": "\xE3", - "%e4": "\xE4", - "%E4": "\xE4", - "%e5": "\xE5", - "%E5": "\xE5", - "%e6": "\xE6", - "%E6": "\xE6", - "%e7": "\xE7", - "%E7": "\xE7", - "%e8": "\xE8", - "%E8": "\xE8", - "%e9": "\xE9", - "%E9": "\xE9", - "%ea": "\xEA", - "%Ea": "\xEA", - "%eA": "\xEA", - "%EA": "\xEA", - "%eb": "\xEB", - "%Eb": "\xEB", - "%eB": "\xEB", - "%EB": "\xEB", - "%ec": "\xEC", - "%Ec": "\xEC", - "%eC": "\xEC", - "%EC": "\xEC", - "%ed": "\xED", - "%Ed": "\xED", - "%eD": "\xED", - "%ED": "\xED", - "%ee": "\xEE", - "%Ee": "\xEE", - "%eE": "\xEE", - "%EE": "\xEE", - "%ef": "\xEF", - "%Ef": "\xEF", - "%eF": "\xEF", - "%EF": "\xEF", - "%f0": "\xF0", - "%F0": "\xF0", - "%f1": "\xF1", - "%F1": "\xF1", - "%f2": "\xF2", - "%F2": "\xF2", - "%f3": "\xF3", - "%F3": "\xF3", - "%f4": "\xF4", - "%F4": "\xF4", - "%f5": "\xF5", - "%F5": "\xF5", - "%f6": "\xF6", - "%F6": "\xF6", - "%f7": "\xF7", - "%F7": "\xF7", - "%f8": "\xF8", - "%F8": "\xF8", - "%f9": "\xF9", - "%F9": "\xF9", - "%fa": "\xFA", - "%Fa": "\xFA", - "%fA": "\xFA", - "%FA": "\xFA", - "%fb": "\xFB", - "%Fb": "\xFB", - "%fB": "\xFB", - "%FB": "\xFB", - "%fc": "\xFC", - "%Fc": "\xFC", - "%fC": "\xFC", - "%FC": "\xFC", - "%fd": "\xFD", - "%Fd": "\xFD", - "%fD": "\xFD", - "%FD": "\xFD", - "%fe": "\xFE", - "%Fe": "\xFE", - "%fE": "\xFE", - "%FE": "\xFE", - "%ff": "\xFF", - "%Ff": "\xFF", - "%fF": "\xFF", - "%FF": "\xFF" - }; - function encodedReplacer(match) { - return EncodedLookup[match]; - } - var STATE_KEY = 0; - var STATE_VALUE = 1; - var STATE_CHARSET = 2; - var STATE_LANG = 3; - function parseParams(str) { - const res = []; - let state = STATE_KEY; - let charset = ""; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ""; - const len = str.length; - for (var i = 0; i < len; ++i) { - const char = str[i]; - if (char === "\\" && inquote) { - if (escaping) { - escaping = false; - } else { - escaping = true; - continue; + var assert5 = require("node:assert"); + var { finished, PassThrough } = require("node:stream"); + var { InvalidArgumentError, InvalidReturnValueError } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util2(); + var { AsyncResource } = require("node:async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var StreamHandler = class extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { - inquote = true; - } - continue; - } else { - escaping = false; + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert5(this.callback); + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); } + return; + } + this.factory = null; + let res; + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + res = new PassThrough(); + this.callback = null; + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); } else { - if (escaping && inquote) { - tmp += "\\"; - } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { - state = STATE_VALUE; - } - tmp = ""; - continue; - } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { - state = char === "*" ? STATE_CHARSET : STATE_VALUE; - res[p] = [tmp, void 0]; - tmp = ""; - continue; - } else if (!inquote && char === ";") { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } - charset = ""; - } else if (tmp.length) { - tmp = decodeText(tmp, "binary", "utf8"); + if (factory === null) { + return; + } + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); + } + finished(res, { readable: false }, (err) => { + const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2.readable) { + util.destroy(res2, err); } - if (res[p] === void 0) { - res[p] = tmp; - } else { - res[p][1] = tmp; + this.callback = null; + this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); } - tmp = ""; - ++p; - continue; - } else if (!inquote && (char === " " || char === " ")) { - continue; - } + }); } - tmp += char; + res.on("drain", resume); + this.res = res; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState?.needDrain; + return needDrain !== true; } - if (charset && tmp.length) { - tmp = decodeText( - tmp.replace(RE_ENCODED, encodedReplacer), - "binary", - charset - ); - } else if (tmp) { - tmp = decodeText(tmp, "binary", "utf8"); + onData(chunk) { + const { res } = this; + return res ? res.write(chunk) : true; } - if (res[p] === void 0) { - if (tmp) { - res[p] = tmp; + onComplete(trailers) { + const { res } = this; + removeSignal(this); + if (!res) { + return; + } + this.trailers = util.parseHeaders(trailers); + res.end(); + } + onError(err) { + const { res, callback, opaque, body } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); } - } else { - res[p][1] = tmp; } - return res; + }; + function stream(opts, factory, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } } - module2.exports = parseParams; + module2.exports = stream; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js -var require_basename = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/basename.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js +var require_api_pipeline = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { "use strict"; - module2.exports = function basename(path10) { - if (typeof path10 !== "string") { - return ""; + var { + Readable: Readable2, + Duplex, + PassThrough + } = require("node:stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util(); + var { AsyncResource } = require("node:async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var assert5 = require("node:assert"); + var kResume = Symbol("resume"); + var PipelineRequest = class extends Readable2 { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; } - for (var i = path10.length - 1; i >= 0; --i) { - switch (path10.charCodeAt(i)) { - case 47: - case 92: - path10 = path10.slice(i + 1); - return path10 === ".." || path10 === "." ? "" : path10; + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); } } - return path10 === ".." || path10 === "." ? "" : path10; + _destroy(err, callback) { + this._read(); + callback(err); + } }; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js -var require_multipart = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/multipart.js"(exports, module2) { - "use strict"; - var { Readable: Readable2 } = require("node:stream"); - var { inherits } = require("node:util"); - var Dicer = require_Dicer(); - var parseParams = require_parseParams(); - var decodeText = require_decodeText(); - var basename = require_basename(); - var getLimit = require_getLimit(); - var RE_BOUNDARY = /^boundary$/i; - var RE_FIELD = /^form-data$/i; - var RE_CHARSET = /^charset$/i; - var RE_FILENAME = /^filename$/i; - var RE_NAME = /^name$/i; - Multipart.detect = /^multipart\/form-data/i; - function Multipart(boy, cfg) { - let i; - let len; - const self2 = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== void 0); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break; - } + var PipelineResponse = class extends Readable2 { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; } - function checkFinished() { - if (nends === 0 && finished && !boy._done) { - finished = false; - self2.end(); - } + _read() { + this[kResume](); } - if (typeof boundary !== "string") { - throw new Error("Multipart: Boundary not found"); + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + callback(err); } - const fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, "fileSize", Infinity); - const filesLimit = getLimit(limits, "files", Infinity); - const fieldsLimit = getLimit(limits, "fields", Infinity); - const partsLimit = getLimit(limits, "parts", Infinity); - const headerPairsLimit = getLimit(limits, "headerPairs", 2e3); - const headerSizeLimit = getLimit(limits, "headerSize", 80 * 1024); - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; - this._needDrain = false; - this._pause = false; - this._cb = void 0; - this._nparts = 0; - this._boy = boy; - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; - this.parser = new Dicer(parserCfg); - this.parser.on("drain", function() { - self2._needDrain = false; - if (self2._cb && !self2._pause) { - const cb = self2._cb; - self2._cb = void 0; - cb(); + }; + var PipelineHandler = class extends AsyncResource { + constructor(opts, handler) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); } - }).on("part", function onPart(part) { - if (++self2._nparts > partsLimit) { - self2.parser.removeListener("part", onPart); - self2.parser.on("part", skipPart); - boy.hitPartsLimit = true; - boy.emit("partsLimit"); - return skipPart(part); - } - if (curField) { - const field = curField; - field.emit("end"); - field.removeAllListeners("end"); - } - part.on("header", function(header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - if (header["content-type"]) { - parsed = parseParams(header["content-type"][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break; - } - } - } - } - if (contype === void 0) { - contype = "text/plain"; - } - if (charset === void 0) { - charset = defCharset; - } - if (header["content-disposition"]) { - parsed = parseParams(header["content-disposition"][0]); - if (!RE_FIELD.test(parsed[0])) { - return skipPart(part); - } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { - filename = basename(filename); - } - } + if (typeof handler !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", util.nop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + if (body?.resume) { + body.resume(); } - } else { - return skipPart(part); - } - if (header["content-transfer-encoding"]) { - encoding = header["content-transfer-encoding"][0].toLowerCase(); - } else { - encoding = "7bit"; - } - let onData, onEnd; - if (isPartAFile(fieldname, contype, filename)) { - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit("filesLimit"); - } - return skipPart(part); + }, + write: (chunk, encoding, callback) => { + const { req } = this; + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; } - ++nfiles; - if (!boy._events.file) { - self2.parser._ignore(); - return; + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on("end", function() { - --nends; - self2._pause = false; - checkFinished(); - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }); - file._read = function(n) { - if (!self2._pause) { - return; - } - self2._pause = false; - if (self2._cb && !self2._needDrain) { - const cb = self2._cb; - self2._cb = void 0; - cb(); - } - }; - boy.emit("file", fieldname, file, filename, encoding, contype); - onData = function(data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { - file.push(data.slice(0, extralen)); - } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners("data"); - file.emit("limit"); - return; - } else if (!file.push(data)) { - self2._pause = true; - } - file.bytesRead = nsize; - }; - onEnd = function() { - curFile = void 0; - file.push(null); - }; - } else { - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit("fieldsLimit"); - } - return skipPart(part); + if (abort && err) { + abort(); } - ++nfields; - ++nends; - let buffer = ""; - let truncated = false; - curField = part; - onData = function(data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = fieldSizeLimit - (nsize - data.length); - buffer += data.toString("binary", 0, extralen); - truncated = true; - part.removeAllListeners("data"); - } else { - buffer += data.toString("binary"); - } - }; - onEnd = function() { - curField = void 0; - if (buffer.length) { - buffer = decodeText(buffer, "binary", charset); - } - boy.emit("field", fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; + util.destroy(body, err); + util.destroy(req, err); + util.destroy(res, err); + removeSignal(this); + callback(err); + } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); + } + onConnect(abort, context) { + const { ret, res } = this; + if (this.reason) { + abort(this.reason); + return; + } + assert5(!res, "pipeline cannot be retried"); + assert5(!ret.destroyed); + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this; + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers }); } - part._readableState.sync = false; - part.on("data", onData); - part.on("end", onEnd); - }).on("error", function(err) { - if (curFile) { - curFile.emit("error", err); + return; + } + this.res = new PipelineResponse(resume); + let body; + try { + this.handler = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on("error", util.nop); + throw err; + } + if (!body || typeof body.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); + } + body.on("data", (chunk) => { + const { ret, body: body2 } = this; + if (!ret.push(chunk) && body2.pause) { + body2.pause(); + } + }).on("error", (err) => { + const { ret } = this; + util.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()); } }); - }).on("error", function(err) { - boy.emit("error", err); - }).on("finish", function() { - finished = true; - checkFinished(); - }); - } - Multipart.prototype.write = function(chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; - } - }; - Multipart.prototype.end = function() { - const self2 = this; - if (self2.parser.writable) { - self2.parser.end(); - } else if (!self2._boy._done) { - process.nextTick(function() { - self2._boy._done = true; - self2._boy.emit("finish"); - }); + this.body = body; + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + res.push(null); + } + onError(err) { + const { ret } = this; + this.handler = null; + util.destroy(ret, err); } }; - function skipPart(part) { - part.resume(); - } - function FileStream(opts) { - Readable2.call(this, opts); - this.bytesRead = 0; - this.truncated = false; + function pipeline(opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); + } } - inherits(FileStream, Readable2); - FileStream.prototype._read = function(n) { - }; - module2.exports = Multipart; + module2.exports = pipeline; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js -var require_Decoder = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/utils/Decoder.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js +var require_api_upgrade = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { "use strict"; - var RE_PLUS = /\+/g; - var HEX = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 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, - 1, - 1, - 1, - 1, - 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 - ]; - function Decoder() { - this.buffer = void 0; - } - Decoder.prototype.write = function(str) { - str = str.replace(RE_PLUS, " "); - let res = ""; - let i = 0; - let p = 0; - const len = str.length; - for (; i < len; ++i) { - if (this.buffer !== void 0) { - if (!HEX[str.charCodeAt(i)]) { - res += "%" + this.buffer; - this.buffer = void 0; - --i; - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = void 0; - } - } - } else if (str[i] === "%") { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ""; - ++p; + var { InvalidArgumentError, SocketError } = require_errors(); + var { AsyncResource } = require("node:async_hooks"); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + var assert5 = require("node:assert"); + var UpgradeHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); } - if (p < len && this.buffer === void 0) { - res += str.substring(p); + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; + } + assert5(this.callback); + this.abort = abort; + this.context = null; + } + onHeaders() { + throw new SocketError("bad upgrade", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + assert5(statusCode === 101); + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } } - return res; - }; - Decoder.prototype.reset = function() { - this.buffer = void 0; }; - module2.exports = Decoder; + function upgrade(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = upgrade; } }); -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js -var require_urlencoded = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/types/urlencoded.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js +var require_api_connect = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js"(exports2, module2) { "use strict"; - var Decoder = require_Decoder(); - var decodeText = require_decodeText(); - var getLimit = require_getLimit(); - var RE_CHARSET = /^charset$/i; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded(boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; - this.fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, "fieldNameSize", 100); - this.fieldsLimit = getLimit(limits, "fields", Infinity); - let charset; - for (var i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break; + var assert5 = require("node:assert"); + var { AsyncResource } = require("node:async_hooks"); + var { InvalidArgumentError, SocketError } = require_errors(); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + var ConnectHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); } + super("UNDICI_CONNECT"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + addSignal(this, signal); } - if (charset === void 0) { - charset = cfg.defCharset || "utf8"; - } - this.decoder = new Decoder(); - this.charset = charset; - this._fields = 0; - this._state = "key"; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } - UrlEncoded.prototype.write = function(data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit("fieldsLimit"); - } - return cb(); - } - let idxeq; - let idxamp; - let i; - let p = 0; - const len = data.length; - while (p < len) { - if (this._state === "key") { - idxeq = idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 61) { - idxeq = i; - break; - } else if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesKey; - } - } - if (idxeq !== void 0) { - if (idxeq > p) { - this._key += this.decoder.write(data.toString("binary", p, idxeq)); - } - this._state = "val"; - this._hitLimit = false; - this._checkingBytes = true; - this._val = ""; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - p = idxeq + 1; - } else if (idxamp !== void 0) { - ++this._fields; - let key; - const keyTrunc = this._keyTrunc; - if (idxamp > p) { - key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); - } else { - key = this._key; - } - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - if (key.length) { - this.boy.emit( - "field", - decodeText(key, "binary", this.charset), - "", - keyTrunc, - false - ); - } - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._key += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { - this._key += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } else { - idxamp = void 0; - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesVal; - } - } - if (idxamp !== void 0) { - ++this._fields; - if (idxamp > p) { - this._val += this.decoder.write(data.toString("binary", p, idxamp)); - } - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); - this._state = "key"; - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._val += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { - this._val += this.decoder.write(data.toString("binary", p)); - } - p = len; - } + onConnect(abort, context) { + if (this.reason) { + abort(this.reason); + return; } + assert5(this.callback); + this.abort = abort; + this.context = context; + } + onHeaders() { + throw new SocketError("bad connect", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + let headers = rawHeaders; + if (headers != null) { + headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }); } - cb(); - }; - UrlEncoded.prototype.end = function() { - if (this.boy._done) { - return; - } - if (this._state === "key" && this._key.length > 0) { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - "", - this._keyTrunc, - false - ); - } else if (this._state === "val") { - this.boy.emit( - "field", - decodeText(this._key, "binary", this.charset), - decodeText(this._val, "binary", this.charset), - this._keyTrunc, - this._valTrunc - ); - } - this.boy._done = true; - this.boy.emit("finish"); - }; - module2.exports = UrlEncoded; - } -}); - -// .yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js -var require_main = __commonJS({ - ".yarn/cache/@fastify-busboy-npm-2.1.0-960844a007-7bb641080a.zip/node_modules/@fastify/busboy/lib/main.js"(exports, module2) { - "use strict"; - var WritableStream = require("node:stream").Writable; - var { inherits } = require("node:util"); - var Dicer = require_Dicer(); - var MultipartParser = require_multipart(); - var UrlencodedParser = require_urlencoded(); - var parseParams = require_parseParams(); - function Busboy(opts) { - if (!(this instanceof Busboy)) { - return new Busboy(opts); - } - if (typeof opts !== "object") { - throw new TypeError("Busboy expected an options-Object."); - } - if (typeof opts.headers !== "object") { - throw new TypeError("Busboy expected an options-Object with headers-attribute."); - } - if (typeof opts.headers["content-type"] !== "string") { - throw new TypeError("Missing Content-Type-header."); - } - const { - headers, - ...streamOptions - } = opts; - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); - Busboy.prototype.emit = function(ev) { - if (ev === "finish") { - if (!this._done) { - this._parser?.end(); - return; - } else if (this._finished) { - return; + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); } - this._finished = true; } - WritableStream.prototype.emit.apply(this, arguments); }; - Busboy.prototype.getParserByHeaders = function(headers) { - const parsed = parseParams(headers["content-type"]); - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg); + function connect(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg); + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts?.opaque; + queueMicrotask(() => callback(err, { opaque })); } - throw new Error("Unsupported Content-Type."); - }; - Busboy.prototype._write = function(chunk, encoding, cb) { - this._parser.write(chunk, cb); - }; - module2.exports = Busboy; - module2.exports.default = Busboy; - module2.exports.Busboy = Busboy; - module2.exports.Dicer = Dicer; + } + module2.exports = connect; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js -var require_constants3 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/constants.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js +var require_api = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js"(exports2, module2) { "use strict"; - var corsSafeListedMethods = ["GET", "HEAD", "POST"]; - var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - var nullBodyStatus = [101, 204, 205, 304]; - var redirectStatus = [301, 302, 303, 307, 308]; - var redirectStatusSet = new Set(redirectStatus); - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - var badPortsSet = new Set(badPorts); - var referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - var referrerPolicySet = new Set(referrerPolicy); - var requestRedirect = ["follow", "manual", "error"]; - var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - var safeMethodsSet = new Set(safeMethods); - var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - var requestCredentials = ["omit", "same-origin", "include"]; - var requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - var requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - "content-length" - ]; - var requestDuplex = [ - "half" - ]; - var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - var forbiddenMethodsSet = new Set(forbiddenMethods); - var subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - var subresourceSet = new Set(subresource); - module2.exports = { - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicySet - }; + module2.exports.request = require_api_request(); + module2.exports.stream = require_api_stream(); + module2.exports.pipeline = require_api_pipeline(); + module2.exports.upgrade = require_api_upgrade(); + module2.exports.connect = require_api_connect(); } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js -var require_global = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/global.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js +var require_dispatcher = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) { "use strict"; - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false - }); - return; + var EventEmitter2 = require("node:events"); + var Dispatcher = class extends EventEmitter2 { + dispatch() { + throw new Error("not implemented"); } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + close() { + throw new Error("not implemented"); } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - module2.exports = { - getGlobalOrigin, - setGlobalOrigin - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js -var require_dataURL = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/dataURL.js"(exports, module2) { - var assert3 = require("node:assert"); - var encoder = new TextEncoder(); - var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - var HTTP_WHITESPACE_REGEX = /[\u000A|\u000D|\u0009|\u0020]/; - var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; - var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; - function dataURLProcessor(dataURL) { - assert3(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast( - ",", - input, - position - ); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; + destroy() { + throw new Error("not implemented"); } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; + compose(...args) { + const interceptors = Array.isArray(args[0]) ? args[0] : args; + let dispatch = this.dispatch.bind(this); + for (const interceptor of interceptors) { + if (interceptor == null) { + continue; + } + if (typeof interceptor !== "function") { + throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); + } + dispatch = interceptor(dispatch); + if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { + throw new TypeError("invalid interceptor"); + } } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020)+$/, ""); - mimeType = mimeType.slice(0, -1); + return new ComposedDispatcher(this, dispatch); } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; + }; + var ComposedDispatcher = class extends Dispatcher { + #dispatcher = null; + #dispatch = null; + constructor(dispatcher, dispatch) { + super(); + this.#dispatcher = dispatcher; + this.#dispatch = dispatch; } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + dispatch(...args) { + this.#dispatch(...args); } - return { mimeType: mimeTypeRecord, body }; - } - function URLSerializer(url, excludeFragment = false) { - if (!excludeFragment) { - return url.href; + close(...args) { + return this.#dispatcher.close(...args); } - const href = url.href; - const hashLength = url.hash.length; - const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); - if (!hashLength && href.endsWith("#")) { - return serialized.slice(0, -1); + destroy(...args) { + return this.#dispatcher.destroy(...args); } - return serialized; - } - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; + }; + module2.exports = Dispatcher; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js +var require_dispatcher_base = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) { + "use strict"; + var Dispatcher = require_dispatcher(); + var { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = require_symbols(); + var kOnDestroyed = Symbol("onDestroyed"); + var kOnClosed = Symbol("onClosed"); + var kInterceptedDispatch = Symbol("Intercepted Dispatch"); + var DispatcherBase = class extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - return result; - } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); + get destroyed() { + return this[kDestroyed]; } - position.position = idx; - return input.slice(start, position.position); - } - function stringPercentDecode(input) { - const bytes = encoder.encode(input); - return percentDecode(bytes); - } - function isHexCharByte(byte) { - return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; - } - function hexByteToNumber(byte) { - return ( - // 0-9 - byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 - ); - } - function percentDecode(input) { - const length = input.length; - const output = new Uint8Array(length); - let j = 0; - for (let i = 0; i < length; ++i) { - const byte = input[i]; - if (byte !== 37) { - output[j++] = byte; - } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { - output[j++] = 37; - } else { - output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); - i += 2; - } - } - return length === j ? output : output.subarray(0, j); - } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast( - "/", - input, - position - ); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position > input.length) { - return "failure"; + get closed() { + return this[kClosed]; } - position.position++; - let subtype = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; + get interceptors() { + return this[kInterceptors]; } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map<string, string>} */ - parameters: /* @__PURE__ */ new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - (char) => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ";" && char !== "=", - input, - position - ); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); + } } - position.position++; } - if (position.position > input.length) { - break; + this[kInterceptors] = newInterceptors; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast( - ";", - input, - position - ); - } else { - parameterValue = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; } - } - return mimeType; - } - function forgivingBase64(data) { - data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); - let dataLength = data.length; - if (dataLength % 4 === 0) { - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; - if (data.charCodeAt(dataLength - 1) === 61) { - --dataLength; + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); } + return; } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); } - if (dataLength % 4 === 1) { - return "failure"; - } - if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { - return "failure"; - } - const buffer = Buffer.from(data, "base64"); - return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); - } - function collectAnHTTPQuotedString(input, position, extractValue) { - const positionStart = position.position; - let value = ""; - assert3(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== "\\", - input, - position - ); - if (position.position >= input.length) { - break; + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); } - value += input[position.position]; - position.position++; - } else { - assert3(quoteOrBackslash === '"'); - break; + return; + } + if (!err) { + err = new ClientDestroyedError(); } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); } - if (extractValue) { - return value; + [kInterceptedDispatch](opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler); + } + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler); } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert3(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/(\\|")/g, "\\$1"); - value = '"' + value; - value += '"'; + dispatch(opts, handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kInterceptedDispatch](opts, handler); + } catch (err) { + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + handler.onError(err); + return false; } - serialization += value; } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === 13 || char === 10 || char === 9 || char === 32; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isHTTPWhiteSpace); - } - function isASCIIWhitespace(char) { - return char === 13 || char === 10 || char === 9 || char === 12 || char === 32; - } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - return removeChars(str, leading, trailing, isASCIIWhitespace); - } - function removeChars(str, leading, trailing, predicate) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - while (lead < str.length && predicate(str.charCodeAt(lead))) - lead++; + }; + module2.exports = DispatcherBase; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js +var require_fixed_queue = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) { + "use strict"; + var kSize = 2048; + var kMask = kSize - 1; + var FixedCircularBuffer = class { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - if (trailing) { - while (trail > 0 && predicate(str.charCodeAt(trail))) - trail--; + isEmpty() { + return this.top === this.bottom; } - return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); - } - function isomorphicDecode(input) { - const length = input.length; - if ((2 << 15) - 1 > length) { - return String.fromCharCode.apply(null, input); + isFull() { + return (this.top + 1 & kMask) === this.bottom; } - let result = ""; - let i = 0; - let addition = (2 << 15) - 1; - while (i < length) { - if (i + addition > length) { - addition = length - i; - } - result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; } - return result; - } - function minimizeSupportedMimeType(mimeType) { - switch (mimeType.essence) { - case "application/ecmascript": - case "application/javascript": - case "application/x-ecmascript": - case "application/x-javascript": - case "text/ecmascript": - case "text/javascript": - case "text/javascript1.0": - case "text/javascript1.1": - case "text/javascript1.2": - case "text/javascript1.3": - case "text/javascript1.4": - case "text/javascript1.5": - case "text/jscript": - case "text/livescript": - case "text/x-ecmascript": - case "text/x-javascript": - return "text/javascript"; - case "application/json": - case "text/json": - return "application/json"; - case "image/svg+xml": - return "image/svg+xml"; - case "text/xml": - case "application/xml": - return "application/xml"; + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) + return null; + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; } - if (mimeType.subtype.endsWith("+json")) { - return "application/json"; + }; + module2.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - if (mimeType.subtype.endsWith("+xml")) { - return "application/xml"; + isEmpty() { + return this.head.isEmpty(); + } + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + } + return next; } - return ""; - } - module2.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType, - removeChars, - minimizeSupportedMimeType }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js -var require_util2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/util.js"(exports, module2) { - "use strict"; - var { Transform } = require("node:stream"); - var zlib = require("node:zlib"); - var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants3(); - var { getGlobalOrigin } = require_global(); - var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_dataURL(); - var { performance } = require("node:perf_hooks"); - var { isBlobLike, toUSVString, ReadableStreamFrom, isValidHTTPToken } = require_util(); - var assert3 = require("node:assert"); - var { isUint8Array } = require("util/types"); - var crypto; - try { - crypto = require("node:crypto"); - } catch { - } - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatusSet.has(response.status)) { - return null; +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js +var require_pool_stats = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) { + var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); + var kPool = Symbol("pool"); + var PoolStats = class { + constructor(pool) { + this[kPool] = pool; } - let location = response.headersList.get("location", true); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); + get connected() { + return this[kPool][kConnected]; } - if (location && !location.hash) { - location.hash = requestFragment; + get free() { + return this[kPool][kFree]; } - return location; - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; - } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; + get pending() { + return this[kPool][kPending]; } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || // HTAB - c >= 32 && c <= 126 || // SP / VCHAR - c >= 128 && c <= 255)) { - return false; - } + get queued() { + return this[kPool][kQueued]; } - return true; - } - function isValidHeaderName(potentialValue) { - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { - return false; + get running() { + return this[kPool][kRunning]; } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; + get size() { + return this[kPool][kSize]; } - return true; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; + }; + module2.exports = PoolStats; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js +var require_pool_base = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) { + "use strict"; + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var PoolStats = require_pool_stats(); + var kClients = Symbol("clients"); + var kNeedDrain = Symbol("needDrain"); + var kQueue = Symbol("queue"); + var kClosedResolve = Symbol("closed resolve"); + var kOnDrain = Symbol("onDrain"); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kGetDispatcher = Symbol("get dispatcher"); + var kAddClient = Symbol("add client"); + var kRemoveClient = Symbol("remove client"); + var kStats = Symbol("stats"); + var PoolBase = class extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); } - } - } - if (policy !== "") { - request.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header, true); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (request.responseTainting === "cors" || request.mode === "websocket") { - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin, true); - } - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: - } - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin, true); - } - } - } - function coarsenTime(timestamp, crossOriginIsolatedCapability) { - return timestamp; - } - function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { - if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { - return { - domainLookupStartTime: defaultStartTime, - domainLookupEndTime: defaultStartTime, - connectionStartTime: defaultStartTime, - connectionEndTime: defaultStartTime, - secureConnectionStartTime: defaultStartTime, - ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol - }; - } - return { - domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), - domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), - connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), - connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), - secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), - ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol - }; - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return coarsenTime(performance.now(), crossOriginIsolatedCapability); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert3(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; - } - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - referrerSource = request.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit("drain", origin, [pool, ...targets]); } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); } - return referrerOrigin; - } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert3(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; + }; + this[kOnConnect] = (origin, targets) => { + pool.emit("connect", origin, [pool, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit("disconnect", origin, [pool, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit("connectionError", origin, [pool, ...targets], err); + }; + this[kStats] = new PoolStats(this); } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; + get [kBusy]() { + return this[kNeedDrain]; } - return url; - } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; + get [kConnected]() { + return this[kClients].filter((client) => client[kConnected]).length; } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; + get [kFree]() { + return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; } - if (url.protocol === "data:") - return true; - if (url.protocol === "file:") - return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; } - return false; + return ret; } - } - function bytesMatch(bytes, metadataList) { - if (crypto === void 0) { - return true; + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; } - if (parsedMetadata.length === 0) { - return true; + get stats() { + return this[kStats]; } - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)); - const strongest = list[0].algo; - const metadata = list.filter((item) => item.algo === strongest); - for (const item of metadata) { - const algorithm = item.algo; - let expectedValue = item.hash; - if (expectedValue.endsWith("==")) { - expectedValue = expectedValue.slice(0, -2); - } - let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue.endsWith("==")) { - actualValue = actualValue.slice(0, -2); - } - if (actualValue === expectedValue) { - return true; - } - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest("base64url"); - if (actualBase64URL.endsWith("==")) { - actualBase64URL = actualBase64URL.slice(0, -2); + async [kClose]() { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map((c) => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); } - if (actualBase64URL === expectedValue) { - return true; + } + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); } + await Promise.all(this[kClients].map((c) => c.destroy(err))); } - return false; - } - var parseHashWithOptions = /(?<algo>sha256|sha384|sha512)-(?<hash>[A-Za-z0-9+/]+={0,2}(?=\s|$))( +[!-~]*)?/i; - function parseMetadata(metadata) { - const result = []; - let empty = true; - const supportedHashes = crypto.getHashes(); - for (const token of metadata.split(" ")) { - empty = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === void 0) { - continue; + [kDispatch](opts, handler) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); } - const algorithm = parsedToken.groups.algo; - if (supportedHashes.includes(algorithm.toLowerCase())) { - result.push(parsedToken.groups); + return !this[kNeedDrain]; + } + [kAddClient](client) { + client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); } + return this; } - if (empty === true) { - return "no metadata"; - } - return result; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { - } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - var normalizeMethodRecordBase = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" }; - var normalizeMethodRecord = { - ...normalizeMethodRecordBase, - patch: "patch", - PATCH: "PATCH" + module2.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher }; - Object.setPrototypeOf(normalizeMethodRecordBase, null); - Object.setPrototypeOf(normalizeMethodRecord, null); - function normalizeMethod(method) { - return normalizeMethodRecordBase[method.toLowerCase()] ?? method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === void 0) { - throw new TypeError("Value is not JSON serializable"); - } - assert3(typeof result === "string"); - return result; - } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator, name, kind, keyIndex = 0, valueIndex = 1) { - const object = { - index: 0, - kind, - target: iterator - }; - const iteratorObject = Object.create(esIteratorPrototype); - Object.defineProperty(iteratorObject, "next", { - value: function next() { - if (Object.getPrototypeOf(this) !== iteratorObject) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: void 0, done: true }; - } - const { [keyIndex]: key, [valueIndex]: value } = values[index]; - object.index = index + 1; - let result; - switch (kind2) { - case "key": - result = key; - break; - case "value": - result = value; - break; - case "key+value": - result = [key, value]; - break; - } - return { - value: result, - done: false - }; - }, - writable: true, - enumerable: true, - configurable: true + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js +var require_diagnostics = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js"(exports2, module2) { + "use strict"; + var diagnosticsChannel = require("node:diagnostics_channel"); + var util = require("node:util"); + var undiciDebugLog = util.debuglog("undici"); + var fetchDebuglog = util.debuglog("fetch"); + var websocketDebuglog = util.debuglog("websocket"); + var isClientSet = false; + var channels = { + // Client + beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), + connected: diagnosticsChannel.channel("undici:client:connected"), + connectError: diagnosticsChannel.channel("undici:client:connectError"), + sendHeaders: diagnosticsChannel.channel("undici:client:sendHeaders"), + // Request + create: diagnosticsChannel.channel("undici:request:create"), + bodySent: diagnosticsChannel.channel("undici:request:bodySent"), + headers: diagnosticsChannel.channel("undici:request:headers"), + trailers: diagnosticsChannel.channel("undici:request:trailers"), + error: diagnosticsChannel.channel("undici:request:error"), + // WebSocket + open: diagnosticsChannel.channel("undici:websocket:open"), + close: diagnosticsChannel.channel("undici:websocket:close"), + socketError: diagnosticsChannel.channel("undici:websocket:socket_error"), + ping: diagnosticsChannel.channel("undici:websocket:ping"), + pong: diagnosticsChannel.channel("undici:websocket:pong") + }; + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connecting to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2 + ); }); - Object.defineProperty(iteratorObject, Symbol.toStringTag, { - value: `${name} Iterator`, - writable: false, - enumerable: false, - configurable: true + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connected to %s using %s%s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2 + ); }); - return Object.create(iteratorObject); - } - async function fullyReadBody(body, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - let reader; - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - function isReadableStreamLike(stream) { - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - function readableStreamClose(controller) { - try { - controller.close(); - controller.byobRequest?.respond(0); - } catch (err) { - if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { - throw err; - } - } - } - function isomorphicEncode(input) { - for (let i = 0; i < input.length; i++) { - assert3(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader) { - const bytes = []; - let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); - } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert3("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert3("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - function simpleRangeHeaderValue(value, allowWhitespace) { - const data = value; - if (!data.startsWith("bytes")) { - return "failure"; - } - const position = { position: 5 }; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s using %s%s errored - %s", + `${host}${port ? `:${port}` : ""}`, + protocol, + version2, + error.message ); - } - if (data.charCodeAt(position.position) !== 61) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path: path16, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path16); + }); + diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { + const { + request: { method, path: path16, origin }, + response: { statusCode } + } = evt; + debuglog( + "received response to %s %s/%s - HTTP %d", + method, + origin, + path16, + statusCode ); - } - const rangeStart = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position + }); + diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { + const { + request: { method, path: path16, origin } + } = evt; + debuglog("trailers received from %s %s/%s", method, origin, path16); + }); + diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { + const { + request: { method, path: path16, origin }, + error + } = evt; + debuglog( + "request to %s %s/%s errored - %s", + method, + origin, + path16, + error.message ); + }); + isClientSet = true; + } + if (websocketDebuglog.enabled) { + if (!isClientSet) { + const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; + diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connecting to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host } + } = evt; + debuglog( + "connected to %s%s using %s%s", + host, + port ? `:${port}` : "", + protocol, + version2 + ); + }); + diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + const { + connectParams: { version: version2, protocol, port, host }, + error + } = evt; + debuglog( + "connection to %s%s using %s%s errored - %s", + host, + port ? `:${port}` : "", + protocol, + version2, + error.message + ); + }); + diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + const { + request: { method, path: path16, origin } + } = evt; + debuglog("sending request to %s %s/%s", method, origin, path16); + }); } - if (data.charCodeAt(position.position) !== 45) { - return "failure"; - } - position.position++; - if (allowWhitespace) { - collectASequenceOfCodePoints( - (char) => char === " " || char === " ", - data, - position + diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { + const { + address: { address, port } + } = evt; + websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); + }); + diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { + const { websocket, code: code2, reason } = evt; + websocketDebuglog( + "closed connection to %s - %s %s", + websocket.url, + code2, + reason ); - } - const rangeEnd = collectASequenceOfCodePoints( - (char) => { - const code = char.charCodeAt(0); - return code >= 48 && code <= 57; - }, - data, - position - ); - const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; - if (position.position < data.length) { - return "failure"; - } - if (rangeEndValue === null && rangeStartValue === null) { - return "failure"; - } - if (rangeStartValue > rangeEndValue) { - return "failure"; - } - return { rangeStartValue, rangeEndValue }; - } - function buildContentRange(rangeStart, rangeEnd, fullLength) { - let contentRange = "bytes "; - contentRange += isomorphicEncode(`${rangeStart}`); - contentRange += "-"; - contentRange += isomorphicEncode(`${rangeEnd}`); - contentRange += "/"; - contentRange += isomorphicEncode(`${fullLength}`); - return contentRange; + }); + diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { + websocketDebuglog("connection errored - %s", err.message); + }); + diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { + websocketDebuglog("ping received"); + }); + diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { + websocketDebuglog("pong received"); + }); } - var InflateStream = class extends Transform { - _transform(chunk, encoding, callback) { - if (!this._inflateStream) { - if (chunk.length === 0) { - callback(); - return; - } - this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate() : zlib.createInflateRaw(); - this._inflateStream.on("data", this.push.bind(this)); - this._inflateStream.on("end", () => this.push(null)); - this._inflateStream.on("error", (err) => this.destroy(err)); + module2.exports = { + channels + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js +var require_request = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js"(exports2, module2) { + "use strict"; + var { + InvalidArgumentError, + NotSupportedError + } = require_errors(); + var assert5 = require("node:assert"); + var { + isValidHTTPToken, + isValidHeaderValue, + isStream: isStream2, + destroy, + isBuffer, + isFormDataLike, + isIterable, + isBlobLike, + buildURL, + validateHandler, + getServerName, + normalizedMethodRecords + } = require_util(); + var { channels } = require_diagnostics(); + var { headerNameLowerCasedRecord } = require_constants2(); + var invalidPathRegex = /[^\u0021-\u00ff]/; + var kHandler = Symbol("handler"); + var Request = class { + constructor(origin, { + path: path16, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue, + servername + }, handler) { + if (typeof path16 !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path16[0] !== "/" && !(path16.startsWith("http://") || path16.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.test(path16)) { + throw new InvalidArgumentError("invalid request path"); } - this._inflateStream.write(chunk, encoding, callback); - } - _final(callback) { - if (this._inflateStream) { - this._inflateStream.end(); - this._inflateStream = null; + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (normalizedMethodRecords[method] === void 0 && !isValidHTTPToken(method)) { + throw new InvalidArgumentError("invalid request method"); } - callback(); - } - }; - function createInflate() { - return new InflateStream(); - } - function extractMimeType(headers) { - let charset = null; - let essence = null; - let mimeType = null; - const values = getDecodeSplit("content-type", headers); - if (values === null) { - return "failure"; - } - for (const value of values) { - const temporaryMimeType = parseMIMEType(value); - if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { - continue; + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); } - mimeType = temporaryMimeType; - if (mimeType.essence !== essence) { - charset = null; - if (mimeType.parameters.has("charset")) { - charset = mimeType.parameters.get("charset"); - } - essence = mimeType.essence; - } else if (!mimeType.parameters.has("charset") && charset !== null) { - mimeType.parameters.set("charset", charset); + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); } - } - if (mimeType == null) { - return "failure"; - } - return mimeType; - } - function gettingDecodingSplitting(value) { - const input = value; - const position = { position: 0 }; - const values = []; - let temporaryValue = ""; - while (position.position < input.length) { - temporaryValue += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== ",", - input, - position - ); - if (position.position < input.length) { - if (input.charCodeAt(position.position) === 34) { - temporaryValue += collectAnHTTPQuotedString( - input, - position - ); - if (position.position < input.length) { - continue; - } - } else { - assert3(input.charCodeAt(position.position) === 44); - position.position++; - } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); } - temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); - values.push(temporaryValue); - temporaryValue = ""; - } - return values; - } - function getDecodeSplit(name, list) { - const value = list.get(name, true); - if (value === null) { - return null; - } - return gettingDecodingSplitting(value); - } - module2.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - clampAndCoarsenConnectionTimingInfo, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - simpleRangeHeaderValue, - buildContentRange, - parseMetadata, - createInflate, - extractMimeType - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js -var require_symbols2 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/symbols.js"(exports, module2) { - "use strict"; - module2.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js -var require_webidl = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/webidl.js"(exports, module2) { - "use strict"; - var { types } = require("node:util"); - var { toUSVString } = require_util2(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context) { - const plural2 = context.types.length === 1 ? "" : " one of"; - const message = `${context.argument} could not be converted to${plural2}: ${context.types.join(", ")}.`; - return webidl.errors.exception({ - header: context.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = void 0) { - if (opts?.strict !== false) { - if (!(V instanceof I)) { - throw new TypeError("Illegal invocation"); + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); } - } else { - if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { - throw new TypeError("Illegal invocation"); + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + this.abort = null; + if (body == null) { + this.body = null; + } else if (isStream2(body)) { + this.body = body; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + destroy(this); + }; + this.body.on("end", this.endHandler); + } + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === "string") { + this.body = body.length ? Buffer.from(body) : null; + } else if (isFormDataLike(body) || isIterable(body) || isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? buildURL(path16, query) : path16; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = []; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === "object") { + if (headers[Symbol.iterator]) { + for (const header of headers) { + if (!Array.isArray(header) || header.length !== 2) { + throw new InvalidArgumentError("headers must be in key-value pair format"); + } + processHeader(this, header[0], header[1]); + } + } else { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; ++i) { + processHeader(this, keys[i], headers[keys[i]]); + } + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + validateHandler(handler, method, upgrade); + this.servername = servername || getServerName(this.host); + this[kHandler] = handler; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); } } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, - ...ctx - }); + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } + } } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); } - return "Object"; } } - }; - webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; + onConnect(abort) { + assert5(!this.aborted); + assert5(!this.completed); + if (this.error) { + abort(this.error); } else { - lowerBound = Math.pow(-2, 53) + 1; + this.abort = abort; + return this[kHandler].onConnect(abort); } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; } - let x = Number(V); - if (x === 0) { - x = 0; + onResponseStarted() { + return this[kHandler].onResponseStarted?.(); } - if (opts.enforceRange === true) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${V} to an integer.` - }); + onHeaders(statusCode, headers, resume, statusText) { + assert5(!this.aborted); + assert5(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }); + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText); + } catch (err) { + this.abort(err); } - return x; } - if (!Number.isNaN(x) && opts.clamp === true) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); + onData(chunk) { + assert5(!this.aborted); + assert5(!this.completed); + try { + return this[kHandler].onData(chunk); + } catch (err) { + this.abort(err); + return false; } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; + onUpgrade(statusCode, headers, socket) { + assert5(!this.aborted); + assert5(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers, socket); } - return r; - }; - webidl.sequenceConverter = function(converter) { - return (V) => { - if (webidl.util.Type(V) !== "Object") { - throw webidl.errors.exception({ - header: "Sequence", - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }); - } - const method = V?.[Symbol.iterator]?.(); - const seq = []; - if (method === void 0 || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: "Sequence", - message: "Object is not an iterator." - }); + onComplete(trailers) { + this.onFinally(); + assert5(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value)); + try { + return this[kHandler].onComplete(trailers); + } catch (err) { + this.onError(err); } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O) => { - if (webidl.util.Type(O) !== "Object") { - throw webidl.errors.exception({ - header: "Record", - message: `Value of type ${webidl.util.Type(O)} is not an Object.` - }); + } + onError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); } - const result = {}; - if (!types.isProxy(O)) { - const keys2 = Object.keys(O); - for (const key of keys2) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - return result; + if (this.aborted) { + return; } - const keys = Reflect.ownKeys(O); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } + this.aborted = true; + return this[kHandler].onError(error); + } + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; } - return result; - }; - }; - webidl.interfaceConverter = function(i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }); + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; } - return V; - }; + } + addHeader(key, value) { + processHeader(this, key, value); + return this; + } }; - webidl.dictionaryConverter = function(converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary); - const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); + function processHeader(request, key, val) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { + return; + } + let headerName = headerNameLowerCasedRecord[key]; + if (headerName === void 0) { + headerName = key.toLowerCase(); + if (headerNameLowerCasedRecord[headerName] === void 0 && !isValidHTTPToken(headerName)) { + throw new InvalidArgumentError("invalid header key"); } - for (const options of converters) { - const { key, defaultValue, required, converter } = options; - if (required === true) { - if (!Object.hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Missing required key "${key}".` - }); - } - } - let value = dictionary[key]; - const hasDefault = Object.hasOwn(options, "defaultValue"); - if (hasDefault && value !== null) { - value = value ?? defaultValue; - } - if (required || hasDefault || value !== void 0) { - value = converter(value); - if (options.allowedValues && !options.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` - }); + } + if (Array.isArray(val)) { + const arr = []; + for (let i = 0; i < val.length; i++) { + if (typeof val[i] === "string") { + if (!isValidHeaderValue(val[i])) { + throw new InvalidArgumentError(`invalid ${key} header`); } - dict[key] = value; + arr.push(val[i]); + } else if (val[i] === null) { + arr.push(""); + } else if (typeof val[i] === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } else { + arr.push(`${val[i]}`); } } - return dict; - }; - }; - webidl.nullableConverter = function(converter) { - return (V) => { - if (V === null) { - return V; + val = arr; + } else if (typeof val === "string") { + if (!isValidHeaderValue(val)) { + throw new InvalidArgumentError(`invalid ${key} header`); } - return converter(V); - }; - }; - webidl.converters.DOMString = function(V, opts = {}) { - if (V === null && opts.legacyNullToEmptyString) { - return ""; + } else if (val === null) { + val = ""; + } else { + val = `${val}`; } - if (typeof V === "symbol") { - throw new TypeError("Could not convert argument of type symbol to string."); + if (request.host === null && headerName === "host") { + if (typeof val !== "string") { + throw new InvalidArgumentError("invalid host header"); + } + request.host = val; + } else if (request.contentLength === null && headerName === "content-length") { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request.contentType === null && headerName === "content-type") { + request.contentType = val; + request.headers.push(key, val); + } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { + throw new InvalidArgumentError(`invalid ${headerName} header`); + } else if (headerName === "connection") { + const value = typeof val === "string" ? val.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } + if (value === "close") { + request.reset = true; + } + } else if (headerName === "expect") { + throw new NotSupportedError("expect header not supported"); + } else { + request.headers.push(key, val); } - return String(V); - }; - webidl.converters.ByteString = function(V) { - const x = webidl.converters.DOMString(V); - for (let index = 0; index < x.length; index++) { - if (x.charCodeAt(index) > 255) { - throw new TypeError( - `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` - ); + } + module2.exports = Request; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js +var require_timers = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js"(exports2, module2) { + "use strict"; + var fastNow = 0; + var RESOLUTION_MS = 1e3; + var TICK_MS = (RESOLUTION_MS >> 1) - 1; + var fastNowTimeout; + var kFastTimer = Symbol("kFastTimer"); + var fastTimers = []; + var NOT_IN_LIST = -2; + var TO_BE_CLEARED = -1; + var PENDING2 = 0; + var ACTIVE = 1; + function onTick() { + fastNow += TICK_MS; + let idx = 0; + let len = fastTimers.length; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer._state === PENDING2) { + timer._idleStart = fastNow - TICK_MS; + timer._state = ACTIVE; + } else if (timer._state === ACTIVE && fastNow >= timer._idleStart + timer._idleTimeout) { + timer._state = TO_BE_CLEARED; + timer._idleStart = -1; + timer._onTimeout(timer._timerArg); + } + if (timer._state === TO_BE_CLEARED) { + timer._state = NOT_IN_LIST; + if (--len !== 0) { + fastTimers[idx] = fastTimers[len]; + } + } else { + ++idx; } } - return x; - }; - webidl.converters.USVString = toUSVString; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "signed"); - return x; - }; - webidl.converters["unsigned long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned"); - return x; - }; - webidl.converters["unsigned long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned"); - return x; - }; - webidl.converters["unsigned short"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); - return x; - }; - webidl.converters.ArrayBuffer = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ["ArrayBuffer"] - }); + fastTimers.length = len; + if (fastTimers.length !== 0) { + refreshTimeout(); } - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); + } + function refreshTimeout() { + if (fastNowTimeout) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTick, TICK_MS); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } } - return V; - }; - webidl.converters.TypedArray = function(V, T, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { - throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, - types: [T.name] - }); + } + var FastTimer = class { + [kFastTimer] = true; + /** + * The state of the timer, which can be one of the following: + * - NOT_IN_LIST (-2) + * - TO_BE_CLEARED (-1) + * - PENDING (0) + * - ACTIVE (1) + * + * @type {-2|-1|0|1} + * @private + */ + _state = NOT_IN_LIST; + /** + * The number of milliseconds to wait before calling the callback. + * + * @type {number} + * @private + */ + _idleTimeout = -1; + /** + * The time in milliseconds when the timer was started. This value is used to + * calculate when the timer should expire. + * + * @type {number} + * @default -1 + * @private + */ + _idleStart = -1; + /** + * The function to be executed when the timer expires. + * @type {Function} + * @private + */ + _onTimeout; + /** + * The argument to be passed to the callback when the timer expires. + * + * @type {*} + * @private + */ + _timerArg; + /** + * @constructor + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should wait + * before the specified function or code is executed. + * @param {*} arg + */ + constructor(callback, delay, arg) { + this._onTimeout = callback; + this._idleTimeout = delay; + this._timerArg = arg; + this.refresh(); } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.DataView = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: "DataView", - message: "Object is not a DataView." - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, { ...opts, allowShared: false }); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor, { ...opts, allowShared: false }); + /** + * Sets the timer's start time to the current time, and reschedules the timer + * to call its callback at the previously specified duration adjusted to the + * current time. + * Using this on a timer that has already called its callback will reactivate + * the timer. + * + * @returns {void} + */ + refresh() { + if (this._state === NOT_IN_LIST) { + fastTimers.push(this); + } + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + this._state = PENDING2; } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts, { ...opts, allowShared: false }); + /** + * The `clear` method cancels the timer, preventing it from executing. + * + * @returns {void} + * @private + */ + clear() { + this._state = TO_BE_CLEARED; + this._idleStart = -1; } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); }; - webidl.converters["sequence<ByteString>"] = webidl.sequenceConverter( - webidl.converters.ByteString - ); - webidl.converters["sequence<sequence<ByteString>>"] = webidl.sequenceConverter( - webidl.converters["sequence<ByteString>"] - ); - webidl.converters["record<ByteString, ByteString>"] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString - ); module2.exports = { - webidl + /** + * The setTimeout() method sets a timer which executes a function once the + * timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {NodeJS.Timeout|FastTimer} + */ + setTimeout(callback, delay, arg) { + return delay <= RESOLUTION_MS ? setTimeout(callback, delay, arg) : new FastTimer(callback, delay, arg); + }, + /** + * The clearTimeout method cancels an instantiated Timer previously created + * by calling setTimeout. + * + * @param {NodeJS.Timeout|FastTimer} timeout + */ + clearTimeout(timeout) { + if (timeout[kFastTimer]) { + timeout.clear(); + } else { + clearTimeout(timeout); + } + }, + /** + * The setFastTimeout() method sets a fastTimer which executes a function once + * the timer expires. + * @param {Function} callback A function to be executed after the timer + * expires. + * @param {number} delay The time, in milliseconds that the timer should + * wait before the specified function or code is executed. + * @param {*} [arg] An optional argument to be passed to the callback function + * when the timer expires. + * @returns {FastTimer} + */ + setFastTimeout(callback, delay, arg) { + return new FastTimer(callback, delay, arg); + }, + /** + * The clearTimeout method cancels an instantiated FastTimer previously + * created by calling setFastTimeout. + * + * @param {FastTimer} timeout + */ + clearFastTimeout(timeout) { + timeout.clear(); + }, + /** + * The now method returns the value of the internal fast timer clock. + * + * @returns {number} + */ + now() { + return fastNow; + }, + /** + * Trigger the onTick function to process the fastTimers array. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + * @param {number} [delay=0] The delay in milliseconds to add to the now value. + */ + tick(delay = 0) { + fastNow += delay - RESOLUTION_MS + 1; + onTick(); + onTick(); + }, + /** + * Reset FastTimers. + * Exported for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + reset() { + fastNow = 0; + fastTimers.length = 0; + clearTimeout(fastNowTimeout); + fastNowTimeout = null; + }, + /** + * Exporting for testing purposes only. + * Marking as deprecated to discourage any use outside of testing. + * @deprecated + */ + kFastTimer }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js -var require_file = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/file.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js +var require_connect = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js"(exports2, module2) { "use strict"; - var { Blob: Blob2, File: NativeFile } = require("node:buffer"); - var { types } = require("node:util"); - var { kState } = require_symbols2(); - var { isBlobLike } = require_util2(); - var { webidl } = require_webidl(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var { kEnumerableProperty } = require_util(); - var encoder = new TextEncoder(); - var File = class _File extends Blob2 { - constructor(fileBits, fileName, options = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence<BlobPart>"](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); - const n = fileName; - let t = options.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; + var net = require("node:net"); + var assert5 = require("node:assert"); + var util = require_util(); + var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); + var timers = require_timers(); + function noop3() { + } + var tls; + var SessionCache; + if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; } - t = serializeAMimeType(t).toLowerCase(); - } - d = options.lastModified; + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); } - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } - get name() { - webidl.brandCheck(this, _File); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _File); - return this[kState].lastModified; - } - get type() { - webidl.brandCheck(this, _File); - return this[kState].type; - } - }; - var FileLike = class _FileLike { - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, _FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } - }; - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); } - } - return webidl.converters.USVString(V, opts); - }; - webidl.converters["sequence<BlobPart>"] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; + get(sessionKey) { + return this._sessionCache.get(sessionKey); + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; } - return value; - }, - defaultValue: "transparent" - } - ]); - function processBlobParts(parts, options) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(encoder.encode(s)); - } else if (ArrayBuffer.isView(element) || types.isArrayBuffer(element)) { - if (element.buffer) { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } else { - bytes.push(new Uint8Array(element)); + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); } - } else if (isBlobLike(element)) { - bytes.push(element); + this._sessionCache.set(sessionKey, session); } - } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; - } - return s.replace(/\r?\n/g, nativeLineEnding); - } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + }; } - module2.exports = { File, FileLike, isFileLike }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js -var require_formdata = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/formdata.js"(exports, module2) { - "use strict"; - var { isBlobLike, toUSVString, makeIterator } = require_util2(); - var { kState } = require_symbols2(); - var { kEnumerableProperty } = require_util(); - var { File: UndiciFile, FileLike, isFileLike } = require_file(); - var { webidl } = require_webidl(); - var { File: NativeFile } = require("node:buffer"); - var File = NativeFile ?? UndiciFile; - var FormData = class _FormData { - constructor(form) { - if (form !== void 0) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); - } - this[kState] = []; - } - append(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); - } - delete(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); - } - get(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; - } - return this[kState][idx].value; - } - getAll(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, session: customSession, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); } - has(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; - } - set(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require("node:tls"); + } + servername = servername || options.servername || util.getServerName(host) || null; + const sessionKey = servername || hostname; + assert5(sessionKey); + const session = customSession || sessionCache.get(sessionKey) || null; + port = port || 443; + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + // upgrade socket connection + port, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); } else { - this[kState].push(entry); - } - } - entries() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "key+value", - "name", - "value" - ); - } - keys() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "key", - "name", - "value" - ); - } - values() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState], - "FormData", - "value", - "name", - "value" - ); - } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ); + assert5(!httpSocket, "httpSocket can only be sent on TLS update"); + port = port || 80; + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options, + localAddress, + port, + host: hostname + }); } - for (const [key, value] of this) { - callbackFn.call(thisArg, value, key, this); + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); } + const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + queueMicrotask(clearConnectTimeout); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop3; + } + let s1 = null; + let s2 = null; + const fastTimer = timers.setFastTimeout(() => { + s1 = setImmediate(() => { + s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts)); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + clearImmediate(s2); + }; + } : (socketWeakRef, opts) => { + if (!opts.timeout) { + return noop3; } + let s1 = null; + const fastTimer = timers.setFastTimeout(() => { + s1 = setImmediate(() => { + onConnectTimeout(socketWeakRef.deref(), opts); + }); + }, opts.timeout); + return () => { + timers.clearFastTimeout(fastTimer); + clearImmediate(s1); + }; }; - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - getAll: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - entries: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: "FormData", - configurable: true + function onConnectTimeout(socket, opts) { + if (socket == null) { + return; } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); + let message = "Connect Timeout Error"; + if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { + message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")},`; } else { - if (!isFileLike(value)) { - value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== void 0) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); - } + message += ` (attempted address: ${opts.hostname}:${opts.port},`; } - return { name, value }; + message += ` timeout: ${opts.timeout}ms)`; + util.destroy(socket, new ConnectTimeoutError(message)); } - module2.exports = { FormData }; + module2.exports = buildConnector; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js -var require_body = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/fetch/body.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js +var require_utils = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js"(exports2) { "use strict"; - var Busboy = require_main(); - var util = require_util(); - var { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody, - extractMimeType - } = require_util2(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var { Blob: Blob2, File: NativeFile } = require("node:buffer"); - var { kBodyUsed } = require_symbols(); - var assert3 = require("node:assert"); - var { isErrored } = require_util(); - var { isUint8Array, isArrayBuffer } = require("util/types"); - var { File: UndiciFile } = require_file(); - var { serializeAMimeType } = require_dataURL(); - var File = NativeFile ?? UndiciFile; - var textEncoder = new TextEncoder(); - var textDecoder = new TextDecoder(); - function extractBody(object, keepalive = false) { - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - const buffer = typeof source === "string" ? textEncoder.encode(source) : source; - if (buffer.byteLength) { - controller.enqueue(buffer); - } - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: "bytes" - }); - } - assert3(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r -Content-Disposition: form-data`; - const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r -\r -${normalizeLinefeeds(value)}\r -`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r -Content-Type: ${value.type || "application/octet-stream"}\r -\r -`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } - } - } - const chunk = textEncoder.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } - } - }; - type = `multipart/form-data; boundary=${boundary}`; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util.isDisturbed(object) || object.locked) { - throw new TypeError( - "Response body object should not be disturbed or locked" - ); + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || util.isBuffer(source)) { - length = Buffer.byteLength(source); - } - if (action != null) { - let iterator; - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - controller.byobRequest?.respond(0); - }); - } else { - if (!isErrored(stream)) { - const buffer = new Uint8Array(value); - if (buffer.byteLength) { - controller.enqueue(buffer); - } - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: "bytes" - }); - } - const body = { stream, source, length }; - return [body, type]; - } - function safelyExtractBody(object, keepalive = false) { - if (object instanceof ReadableStream) { - assert3(!util.isDisturbed(object), "The body has already been consumed."); - assert3(!object.locked, "The stream is locked."); - } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body.stream = out1; - return { - stream: finalClone, - length: body.length, - source: body.source - }; - } - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - if (util.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); - } - stream[kBodyUsed] = true; - yield* stream; - } - } - } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException("The operation was aborted.", "AbortError"); - } - } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === null) { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const mimeType = bodyMimeType(this); - if (mimeType !== null && mimeType.essence === "multipart/form-data") { - const headers = {}; - for (const [key, value] of this.headers) - headers[key] = value; - const responseFormData = new FormData(); - let busboy; - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, filename, encoding, mimeType2) => { - const chunks = []; - if (encoding === "base64" || encoding.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType2 })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType2 })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) - for await (const chunk of consumeBody(this[kState].body)) - busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (mimeType !== null && mimeType.essence === "application/x-www-form-urlencoded") { - let entries; - try { - let text = ""; - const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += streamingDecoder.decode(chunk, { stream: true }); - } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw new TypeError(void 0, { cause: err }); - } - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } - } - }; - return methods; - } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); - } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); - } - const promise = createDeferredPromise(); - const errorSteps = (error) => promise.reject(error); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); - } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array()); - return promise.promise; - } - await fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; - } - function bodyUnusable(body) { - return body != null && (body.stream.locked || util.isDisturbed(body.stream)); - } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; - } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); - } - const output = textDecoder.decode(buffer); - return output; - } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); - } - function bodyMimeType(requestOrResponse) { - const headers = requestOrResponse[kState].headersList; - const mimeType = extractMimeType(headers); - if (mimeType === "failure") { - return null; - } - return mimeType; + }); + return res; } - module2.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; + exports2.enumToMap = enumToMap; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js -var require_request = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/request.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js +var require_constants3 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js"(exports2) { "use strict"; - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert3 = require("node:assert"); - var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols(); - var util = require_util(); - var { channels } = require_diagnostics(); - var { headerNameLowerCasedRecord } = require_constants2(); - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); - var extractBody; - var Request = class _Request { - constructor(origin, { - path: path10, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path10 !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path10[0] !== "/" && !(path10.startsWith("http://") || path10.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path10) !== null) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (!util.isValidHTTPToken(method)) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - this.abort = null; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util.destroy(this); - }; - this.body.on("end", this.endHandler); - } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } - }; - this.body.on("error", this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); - } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util.buildURL(path10, query) : path10; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - if (util.isFormDataLike(this.body)) { - if (!extractBody) { - extractBody = require_body().extractBody; - } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r -`; - } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r -`; - } - util.validateHandler(handler, method, upgrade); - this.servername = util.getServerName(this.host); - this[kHandler] = handler; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } - } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; + var utils_1 = require_utils(); + var ERROR2; + (function(ERROR3) { + ERROR3[ERROR3["OK"] = 0] = "OK"; + ERROR3[ERROR3["INTERNAL"] = 1] = "INTERNAL"; + ERROR3[ERROR3["STRICT"] = 2] = "STRICT"; + ERROR3[ERROR3["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR3[ERROR3["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR3[ERROR3["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR3[ERROR3["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR3[ERROR3["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR3[ERROR3["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR3[ERROR3["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR3[ERROR3["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR3[ERROR3["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR3[ERROR3["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR3[ERROR3["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR3[ERROR3["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR3[ERROR3["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR3[ERROR3["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR3[ERROR3["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR3[ERROR3["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR3[ERROR3["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR3[ERROR3["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR3[ERROR3["PAUSED"] = 21] = "PAUSED"; + ERROR3[ERROR3["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR3[ERROR3["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR3[ERROR3["USER"] = 24] = "USER"; + })(ERROR2 = exports2.ERROR || (exports2.ERROR = {})); + var TYPE; + (function(TYPE2) { + TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; + TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; + TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; + })(TYPE = exports2.TYPE || (exports2.TYPE = {})); + var FLAGS; + (function(FLAGS2) { + FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; + FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; + FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; + FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(FLAGS = exports2.FLAGS || (exports2.FLAGS = {})); + var LENIENT_FLAGS; + (function(LENIENT_FLAGS2) { + LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports2.METHODS || (exports2.METHODS = {})); + exports2.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE + ]; + exports2.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports2.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST + ]; + exports2.METHOD_MAP = utils_1.enumToMap(METHODS); + exports2.H_METHOD_MAP = {}; + Object.keys(exports2.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key]; + } + }); + var FINISH; + (function(FINISH2) { + FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; + FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; + })(FINISH = exports2.FINISH || (exports2.FINISH = {})); + exports2.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports2.ALPHA.push(String.fromCharCode(i)); + exports2.ALPHA.push(String.fromCharCode(i + 32)); + } + exports2.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + }; + exports2.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }; + exports2.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM); + exports2.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports2.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports2.ALPHANUM); + exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat([" ", "\f"]); + for (let i = 128; i <= 255; i++) { + exports2.URL_CHAR.push(i); + } + exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports2.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports2.ALPHANUM); + exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]); + exports2.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports2.HEADER_CHARS.push(i); + } + } + exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44); + exports2.MAJOR = exports2.NUM_MAP; + exports2.MINOR = exports2.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {})); + exports2.SPECIAL_HEADERS = { + "connection": HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + "upgrade": HEADER_STATE.UPGRADE + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js +var require_llhttp_wasm = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { + "use strict"; + var { Buffer: Buffer3 } = require("node:buffer"); + module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64"); + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +var require_llhttp_simd_wasm = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { + "use strict"; + var { Buffer: Buffer3 } = require("node:buffer"); + module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js +var require_constants4 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) { + "use strict"; + var corsSafeListedMethods = ( + /** @type {const} */ + ["GET", "HEAD", "POST"] + ); + var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + var nullBodyStatus = ( + /** @type {const} */ + [101, 204, 205, 304] + ); + var redirectStatus = ( + /** @type {const} */ + [301, 302, 303, 307, 308] + ); + var redirectStatusSet = new Set(redirectStatus); + var badPorts = ( + /** @type {const} */ + [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "4190", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6679", + "6697", + "10080" + ] + ); + var badPortsSet = new Set(badPorts); + var referrerPolicy = ( + /** @type {const} */ + [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ] + ); + var referrerPolicySet = new Set(referrerPolicy); + var requestRedirect = ( + /** @type {const} */ + ["follow", "manual", "error"] + ); + var safeMethods = ( + /** @type {const} */ + ["GET", "HEAD", "OPTIONS", "TRACE"] + ); + var safeMethodsSet = new Set(safeMethods); + var requestMode = ( + /** @type {const} */ + ["navigate", "same-origin", "no-cors", "cors"] + ); + var requestCredentials = ( + /** @type {const} */ + ["omit", "same-origin", "include"] + ); + var requestCache = ( + /** @type {const} */ + [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ] + ); + var requestBodyHeader = ( + /** @type {const} */ + [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ] + ); + var requestDuplex = ( + /** @type {const} */ + [ + "half" + ] + ); + var forbiddenMethods = ( + /** @type {const} */ + ["CONNECT", "TRACE", "TRACK"] + ); + var forbiddenMethodsSet = new Set(forbiddenMethods); + var subresource = ( + /** @type {const} */ + [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ] + ); + var subresourceSet = new Set(subresource); + module2.exports = { + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js +var require_global = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js"(exports2, module2) { + "use strict"; + var globalOrigin = Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + module2.exports = { + getGlobalOrigin, + setGlobalOrigin + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js +var require_data_url = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) { + "use strict"; + var assert5 = require("node:assert"); + var encoder = new TextEncoder(); + var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+\-.^_|~A-Za-z0-9]+$/; + var HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/; + var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g; + var HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/; + function dataURLProcessor(dataURL) { + assert5(dataURL.protocol === "data:"); + let input = URLSerializer(dataURL, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast( + ",", + input, + position + ); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; + } + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body = stringPercentDecode(encodedBody); + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64(stringBody); + if (body === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020)+$/, ""); + mimeType = mimeType.slice(0, -1); + } + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; + } + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } + return { mimeType: mimeTypeRecord, body }; + } + function URLSerializer(url, excludeFragment = false) { + if (!excludeFragment) { + return url.href; + } + const href = url.href; + const hashLength = url.hash.length; + const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength); + if (!hashLength && href.endsWith("#")) { + return serialized.slice(0, -1); + } + return serialized; + } + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; + } + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); + } + position.position = idx; + return input.slice(start, position.position); + } + function stringPercentDecode(input) { + const bytes = encoder.encode(input); + return percentDecode(bytes); + } + function isHexCharByte(byte) { + return byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102; + } + function hexByteToNumber(byte) { + return ( + // 0-9 + byte >= 48 && byte <= 57 ? byte - 48 : (byte & 223) - 55 + ); + } + function percentDecode(input) { + const length = input.length; + const output = new Uint8Array(length); + let j = 0; + for (let i = 0; i < length; ++i) { + const byte = input[i]; + if (byte !== 37) { + output[j++] = byte; + } else if (byte === 37 && !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))) { + output[j++] = 37; + } else { + output[j++] = hexByteToNumber(input[i + 1]) << 4 | hexByteToNumber(input[i + 2]); + i += 2; + } + } + return length === j ? output : output.subarray(0, j); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast( + "/", + input, + position + ); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; + } + if (position.position > input.length) { + return "failure"; + } + position.position++; + let subtype = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; + } + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map<string, string>} */ + parameters: /* @__PURE__ */ new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + (char) => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ";" && char !== "=", + input, + position + ); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; + } + position.position++; + } + if (position.position > input.length) { + break; + } + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast( + ";", + input, + position + ); + } else { + parameterValue = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; + } + } + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + return mimeType; + } + function forgivingBase64(data) { + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, ""); + let dataLength = data.length; + if (dataLength % 4 === 0) { + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + if (data.charCodeAt(dataLength - 1) === 61) { + --dataLength; + } + } + } + if (dataLength % 4 === 1) { + return "failure"; + } + if (/[^+/0-9A-Za-z]/.test(data.length === dataLength ? data : data.substring(0, dataLength))) { + return "failure"; + } + const buffer = Buffer.from(data, "base64"); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); + } + function collectAnHTTPQuotedString(input, position, extractValue) { + const positionStart = position.position; + let value = ""; + assert5(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== "\\", + input, + position + ); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; + } else { + assert5(quoteOrBackslash === '"'); + break; + } + } + if (extractValue) { + return value; + } + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert5(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name2, value] of parameters.entries()) { + serialization += ";"; + serialization += name2; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/(\\|")/g, "\\$1"); + value = '"' + value; + value += '"'; + } + serialization += value; + } + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === 13 || char === 10 || char === 9 || char === 32; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isHTTPWhiteSpace); + } + function isASCIIWhitespace(char) { + return char === 13 || char === 10 || char === 9 || char === 12 || char === 32; + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + return removeChars(str, leading, trailing, isASCIIWhitespace); + } + function removeChars(str, leading, trailing, predicate) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; + } + if (trailing) { + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; + } + return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); + } + function isomorphicDecode(input) { + const length = input.length; + if ((2 << 15) - 1 > length) { + return String.fromCharCode.apply(null, input); + } + let result = ""; + let i = 0; + let addition = (2 << 15) - 1; + while (i < length) { + if (i + addition > length) { + addition = length - i; + } + result += String.fromCharCode.apply(null, input.subarray(i, i += addition)); + } + return result; + } + function minimizeSupportedMimeType(mimeType) { + switch (mimeType.essence) { + case "application/ecmascript": + case "application/javascript": + case "application/x-ecmascript": + case "application/x-javascript": + case "text/ecmascript": + case "text/javascript": + case "text/javascript1.0": + case "text/javascript1.1": + case "text/javascript1.2": + case "text/javascript1.3": + case "text/javascript1.4": + case "text/javascript1.5": + case "text/jscript": + case "text/livescript": + case "text/x-ecmascript": + case "text/x-javascript": + return "text/javascript"; + case "application/json": + case "text/json": + return "application/json"; + case "image/svg+xml": + return "image/svg+xml"; + case "text/xml": + case "application/xml": + return "application/xml"; + } + if (mimeType.subtype.endsWith("+json")) { + return "application/json"; + } + if (mimeType.subtype.endsWith("+xml")) { + return "application/xml"; + } + return ""; + } + module2.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType, + removeChars, + removeHTTPWhitespace, + minimizeSupportedMimeType, + HTTP_TOKEN_CODEPOINTS, + isomorphicDecode + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js +var require_webidl = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) { + "use strict"; + var { types, inspect } = require("node:util"); + var { markAsUncloneable } = require("node:worker_threads"); + var { toUSVString } = require_util(); + var webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context) { + const plural2 = context.types.length === 1 ? "" : " one of"; + const message = `${context.argument} could not be converted to${plural2}: ${context.types.join(", ")}.`; + return webidl.errors.exception({ + header: context.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts) { + if (opts?.strict !== false) { + if (!(V instanceof I)) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + } else { + if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + header: ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; + } + return "Object"; + } + } + }; + webidl.util.markAsUncloneable = markAsUncloneable || (() => { + }); + webidl.util.ConvertToInt = function(V, bitLength, signedness, opts) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (opts?.enforceRange === true) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${webidl.util.Stringify(V)} to an integer.` + }); + } + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); + } + return x; + } + if (!Number.isNaN(x) && opts?.clamp === true) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + return x; + } + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; + } + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); + } + return x; + }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; + } + return r; + }; + webidl.util.Stringify = function(V) { + const type = webidl.util.Type(V); + switch (type) { + case "Symbol": + return `Symbol(${V.description})`; + case "Object": + return inspect(V); + case "String": + return `"${V}"`; + default: + return `${V}`; + } + }; + webidl.sequenceConverter = function(converter) { + return (V, prefix, argument, Iterable) => { + if (webidl.util.Type(V) !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` + }); + } + const method = typeof Iterable === "function" ? Iterable() : V?.[Symbol.iterator]?.(); + const seq = []; + let index = 0; + if (method === void 0 || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is not iterable.` + }); + } + while (true) { + const { done, value } = method.next(); + if (done) { + break; + } + seq.push(converter(value, prefix, `${argument}[${index++}]`)); + } + return seq; + }; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O, prefix, argument) => { + if (webidl.util.Type(O) !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` + }); + } + const result = {}; + if (!types.isProxy(O)) { + const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; + for (const key of keys2) { + const typedKey = keyConverter(key, prefix, argument); + const typedValue = valueConverter(O[key], prefix, argument); + result[typedKey] = typedValue; + } + return result; + } + const keys = Reflect.ownKeys(O); + for (const key of keys) { + const desc2 = Reflect.getOwnPropertyDescriptor(O, key); + if (desc2?.enumerable) { + const typedKey = keyConverter(key, prefix, argument); + const typedValue = valueConverter(O[key], prefix, argument); + result[typedKey] = typedValue; + } + } + return result; + }; + }; + webidl.interfaceConverter = function(i) { + return (V, prefix, argument, opts) => { + if (opts?.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` + }); + } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + return (dictionary, prefix, argument) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + if (type === "Null" || type === "Undefined") { + return dict; + } else if (type !== "Object") { + throw webidl.errors.exception({ + header: prefix, + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); + } + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + if (required === true) { + if (!Object.hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: prefix, + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary[key]; + const hasDefault = Object.hasOwn(options, "defaultValue"); + if (hasDefault && value !== null) { + value ??= defaultValue(); + } + if (required || hasDefault || value !== void 0) { + value = converter(value, prefix, `${argument}.${key}`); + if (options.allowedValues && !options.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: prefix, + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` + }); + } + dict[key] = value; } } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V, prefix, argument) => { + if (V === null) { + return V; + } + return converter(V, prefix, argument); + }; + }; + webidl.converters.DOMString = function(V, prefix, argument, opts) { + if (V === null && opts?.legacyNullToEmptyString) { + return ""; + } + if (typeof V === "symbol") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a DOMString.` + }); + } + return String(V); + }; + webidl.converters.ByteString = function(V, prefix, argument) { + const x = webidl.converters.DOMString(V, prefix, argument); + for (let index = 0; index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError( + `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` + ); + } + } + return x; + }; + webidl.converters.USVString = toUSVString; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "signed", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned long"] = function(V, prefix, argument) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned", void 0, prefix, argument); + return x; + }; + webidl.converters["unsigned short"] = function(V, prefix, argument, opts) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts, prefix, argument); + return x; + }; + webidl.converters.ArrayBuffer = function(V, prefix, argument, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${argument} ("${webidl.util.Stringify(V)}")`, + types: ["ArrayBuffer"] + }); + } + if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); - } - } + if (V.resizable || V.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); } - onConnect(abort) { - assert3(!this.aborted); - assert3(!this.completed); - if (this.error) { - abort(this.error); - } else { - this.abort = abort; - return this[kHandler].onConnect(abort); - } + return V; + }; + webidl.converters.TypedArray = function(V, T, prefix, name2, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name2} ("${webidl.util.Stringify(V)}")`, + types: [T.name] + }); } - onResponseStarted() { - return this[kHandler].onResponseStarted?.(); + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); } - onHeaders(statusCode, headers, resume, statusText) { - assert3(!this.aborted); - assert3(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); - } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText); - } catch (err) { - this.abort(err); + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); + } + return V; + }; + webidl.converters.DataView = function(V, prefix, name2, opts) { + if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: prefix, + message: `${name2} is not a DataView.` + }); + } + if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + if (V.buffer.resizable || V.buffer.growable) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "Received a resizable ArrayBuffer." + }); + } + return V; + }; + webidl.converters.BufferSource = function(V, prefix, name2, opts) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, prefix, name2, { ...opts, allowShared: false }); + } + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor, prefix, name2, { ...opts, allowShared: false }); + } + if (types.isDataView(V)) { + return webidl.converters.DataView(V, prefix, name2, { ...opts, allowShared: false }); + } + throw webidl.errors.conversionFailed({ + prefix, + argument: `${name2} ("${webidl.util.Stringify(V)}")`, + types: ["BufferSource"] + }); + }; + webidl.converters["sequence<ByteString>"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence<sequence<ByteString>>"] = webidl.sequenceConverter( + webidl.converters["sequence<ByteString>"] + ); + webidl.converters["record<ByteString, ByteString>"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + module2.exports = { + webidl + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js +var require_util3 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) { + "use strict"; + var { Transform } = require("node:stream"); + var zlib = require("node:zlib"); + var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants4(); + var { getGlobalOrigin } = require_global(); + var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_data_url(); + var { performance } = require("node:perf_hooks"); + var { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require_util(); + var assert5 = require("node:assert"); + var { isUint8Array } = require("node:util/types"); + var { webidl } = require_webidl(); + var supportedHashes = []; + var crypto; + try { + crypto = require("node:crypto"); + const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + } catch { + } + function responseURL(response) { + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); + } + function responseLocationURL(response, requestFragment) { + if (!redirectStatusSet.has(response.status)) { + return null; + } + let location = response.headersList.get("location", true); + if (location !== null && isValidHeaderValue(location)) { + if (!isValidEncodedURL(location)) { + location = normalizeBinaryStringToUtf8(location); } + location = new URL(location, responseURL(response)); } - onData(chunk) { - assert3(!this.aborted); - assert3(!this.completed); - try { - return this[kHandler].onData(chunk); - } catch (err) { - this.abort(err); + if (location && !location.hash) { + location.hash = requestFragment; + } + return location; + } + function isValidEncodedURL(url) { + for (let i = 0; i < url.length; ++i) { + const code2 = url.charCodeAt(i); + if (code2 > 126 || // Non-US-ASCII + DEL + code2 < 32) { return false; } } - onUpgrade(statusCode, headers, socket) { - assert3(!this.aborted); - assert3(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers, socket); + return true; + } + function normalizeBinaryStringToUtf8(value) { + return Buffer.from(value, "binary").toString("utf8"); + } + function requestCurrentURL(request) { + return request.urlList[request.urlList.length - 1]; + } + function requestBadPort(request) { + const url = requestCurrentURL(request); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; } - onComplete(trailers) { - this.onFinally(); - assert3(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - try { - return this[kHandler].onComplete(trailers); - } catch (err) { - this.onError(err); + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || // HTAB + c >= 32 && c <= 126 || // SP / VCHAR + c >= 128 && c <= 255)) { + return false; } } - onError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; + return true; + } + var isValidHeaderName = isValidHTTPToken; + function isValidHeaderValue(potentialValue) { + return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; + } + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } } - this.aborted = true; - return this[kHandler].onError(error); } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; + if (policy !== "") { + request.referrerPolicy = policy; + } + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header, true); + } + function appendRequestOriginHeader(request) { + let serializedOrigin = request.origin; + if (serializedOrigin === "client" || serializedOrigin === void 0) { + return; + } + if (request.responseTainting === "cors" || request.mode === "websocket") { + request.headersList.append("origin", serializedOrigin, true); + } else if (request.method !== "GET" && request.method !== "HEAD") { + switch (request.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + default: } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; + request.headersList.append("origin", serializedOrigin, true); + } + } + function coarsenTime(timestamp, crossOriginIsolatedCapability) { + return timestamp; + } + function clampAndCoarsenConnectionTimingInfo(connectionTimingInfo, defaultStartTime, crossOriginIsolatedCapability) { + if (!connectionTimingInfo?.startTime || connectionTimingInfo.startTime < defaultStartTime) { + return { + domainLookupStartTime: defaultStartTime, + domainLookupEndTime: defaultStartTime, + connectionStartTime: defaultStartTime, + connectionEndTime: defaultStartTime, + secureConnectionStartTime: defaultStartTime, + ALPNNegotiatedProtocol: connectionTimingInfo?.ALPNNegotiatedProtocol + }; + } + return { + domainLookupStartTime: coarsenTime(connectionTimingInfo.domainLookupStartTime, crossOriginIsolatedCapability), + domainLookupEndTime: coarsenTime(connectionTimingInfo.domainLookupEndTime, crossOriginIsolatedCapability), + connectionStartTime: coarsenTime(connectionTimingInfo.connectionStartTime, crossOriginIsolatedCapability), + connectionEndTime: coarsenTime(connectionTimingInfo.connectionEndTime, crossOriginIsolatedCapability), + secureConnectionStartTime: coarsenTime(connectionTimingInfo.secureConnectionStartTime, crossOriginIsolatedCapability), + ALPNNegotiatedProtocol: connectionTimingInfo.ALPNNegotiatedProtocol + }; + } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return coarsenTime(performance.now(), crossOriginIsolatedCapability); + } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request) { + const policy = request.referrerPolicy; + assert5(policy); + let referrerSource = null; + if (request.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; } + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + referrerSource = request.referrer; } - // TODO: adjust to support H2 - addHeader(key, value) { - processHeader(this, key, value); - return this; - } - static [kHTTP1BuildRequest](origin, opts, handler) { - return new _Request(origin, opts, handler); + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; } - static [kHTTP2BuildRequest](origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; - const request = new _Request(origin, opts, handler); - request.headers = {}; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - return request; - } - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split("\r\n"); - const headers = {}; - for (const header of rawHeaders) { - const [key, value] = header.split(": "); - if (value == null || value.length === 0) - continue; - if (headers[key]) { - headers[key] += `,${value}`; - } else { - headers[key] = value; + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; } + return referrerOrigin; } - return headers; + case "strict-origin": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case "no-referrer-when-downgrade": + // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; } - }; - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); + } + function stripURLForReferrer(url, originOnly) { + assert5(url instanceof URL); + url = new URL(url); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; } - return skipAppend ? val : `${key}: ${val}\r -`; + return url; } - function processHeader(request, key, val, skipAppend = false) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === void 0) { - return; + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; } - let headerName = headerNameLowerCasedRecord[key]; - if (headerName === void 0) { - headerName = key.toLowerCase(); - if (headerNameLowerCasedRecord[headerName] === void 0 && !util.isValidHTTPToken(headerName)) { - throw new InvalidArgumentError("invalid header key"); - } + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; } - if (request.host === null && headerName === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request.host = val; - } else if (request.contentLength === null && headerName === "content-length") { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && headerName === "content-type") { - request.contentType = val; - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") { - throw new InvalidArgumentError(`invalid ${headerName} header`); - } else if (headerName === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request.reset = true; + if (url.protocol === "data:") return true; + if (url.protocol === "file:") return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; } - } else if (headerName === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) { - request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - } else { - request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } - } else { - request.headers += processHeaderValue(key, val[i]); - } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; } - } else if (skipAppend) { - request.headers[key] = processHeaderValue(key, val, skipAppend); - } else { - request.headers += processHeaderValue(key, val); + return false; } } - module2.exports = Request; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js -var require_connect = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/core/connect.js"(exports, module2) { - "use strict"; - var net = require("node:net"); - var assert3 = require("node:assert"); - var util = require_util(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var tls; - var SessionCache; - if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; + function bytesMatch(bytes, metadataList) { + if (crypto === void 0) { + return true; + } + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue[actualValue.length - 1] === "=") { + if (actualValue[actualValue.length - 2] === "=") { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - } - get(sessionKey) { - return this._sessionCache.get(sessionKey); } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); + if (compareBase64Mixed(actualValue, expectedValue)) { + return true; } - }; - } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = require("node:tls"); - } - servername = servername || options.servername || util.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert3(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - // upgrade socket connection - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert3(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }); + return false; + } + var parseHashWithOptions = /(?<algo>sha256|sha384|sha512)-((?<hash>[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty = true; + for (const token of metadata.split(" ")) { + empty = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === void 0 || parsedToken.groups.algo === void 0) { + continue; } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === void 0 ? 6e4 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); + const algorithm = parsedToken.groups.algo.toLowerCase(); + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; + } + if (empty === true) { + return "no metadata"; + } + return result; } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; + function getStrongestMetadata(metadataList) { + let algorithm = metadataList[0].algo; + if (algorithm[3] === "5") { + return algorithm; } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i]; + if (metadata.algo[3] === "5") { + algorithm = "sha512"; + break; + } else if (algorithm[3] === "3") { + continue; + } else if (metadata.algo[3] === "3") { + algorithm = "sha384"; + } + } + return algorithm; } - function onConnectTimeout(socket) { - let message = "Connect Timeout Error"; - if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { - message = +` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(", ")})`; + function filterMetadataListByAlgorithm(metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList; } - util.destroy(socket, new ConnectTimeoutError(message)); + let pos2 = 0; + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos2++] = metadataList[i]; + } + } + metadataList.length = pos2; + return metadataList; } - module2.exports = buildConnector; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js -var require_utils = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/utils.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; + function compareBase64Mixed(actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false; + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; } + } + return true; + } + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { + } + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; + } + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; + } + return false; + } + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; }); - return res; + return { promise, resolve: res, reject: rej }; } - exports.enumToMap = enumToMap; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js -var require_constants4 = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/constants.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; - var utils_1 = require_utils(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports.ERROR || (exports.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports.TYPE || (exports.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports.FLAGS || (exports.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports.METHODS || (exports.METHODS = {})); - exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE - ]; - exports.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST - ]; - exports.METHOD_MAP = utils_1.enumToMap(METHODS); - exports.H_METHOD_MAP = {}; - Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + function normalizeMethod(method) { + return normalizedMethodRecordsBase[method.toLowerCase()] ?? method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); + } + assert5(typeof result === "string"); + return result; + } + var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function createIterator(name2, kInternalIterator, keyIndex = 0, valueIndex = 1) { + class FastIterableIterator { + /** @type {any} */ + #target; + /** @type {'key' | 'value' | 'key+value'} */ + #kind; + /** @type {number} */ + #index; + /** + * @see https://webidl.spec.whatwg.org/#dfn-default-iterator-object + * @param {unknown} target + * @param {'key' | 'value' | 'key+value'} kind + */ + constructor(target, kind) { + this.#target = target; + this.#kind = kind; + this.#index = 0; + } + next() { + if (typeof this !== "object" || this === null || !(#target in this)) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name2} Iterator.` + ); + } + const index = this.#index; + const values = this.#target[kInternalIterator]; + const len = values.length; + if (index >= len) { + return { + value: void 0, + done: true + }; + } + const { [keyIndex]: key, [valueIndex]: value } = values[index]; + this.#index = index + 1; + let result; + switch (this.#kind) { + case "key": + result = key; + break; + case "value": + result = value; + break; + case "key+value": + result = [key, value]; + break; + } + return { + value: result, + done: false + }; + } } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports.FINISH || (exports.FINISH = {})); - exports.ALPHA = []; - for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { - exports.ALPHA.push(String.fromCharCode(i)); - exports.ALPHA.push(String.fromCharCode(i + 32)); + delete FastIterableIterator.prototype.constructor; + Object.setPrototypeOf(FastIterableIterator.prototype, esIteratorPrototype); + Object.defineProperties(FastIterableIterator.prototype, { + [Symbol.toStringTag]: { + writable: false, + enumerable: false, + configurable: true, + value: `${name2} Iterator` + }, + next: { writable: true, enumerable: true, configurable: true } + }); + return function(target, kind) { + return new FastIterableIterator(target, kind); + }; } - exports.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); - exports.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; - exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports.ALPHANUM); - exports.URL_CHAR = exports.STRICT_URL_CHAR.concat([" ", "\f"]); - for (let i = 128; i <= 255; i++) { - exports.URL_CHAR.push(i); + function iteratorMixin(name2, object, kInternalIterator, keyIndex = 0, valueIndex = 1) { + const makeIterator = createIterator(name2, kInternalIterator, keyIndex, valueIndex); + const properties = { + keys: { + writable: true, + enumerable: true, + configurable: true, + value: function keys() { + webidl.brandCheck(this, object); + return makeIterator(this, "key"); + } + }, + values: { + writable: true, + enumerable: true, + configurable: true, + value: function values() { + webidl.brandCheck(this, object); + return makeIterator(this, "value"); + } + }, + entries: { + writable: true, + enumerable: true, + configurable: true, + value: function entries() { + webidl.brandCheck(this, object); + return makeIterator(this, "key+value"); + } + }, + forEach: { + writable: true, + enumerable: true, + configurable: true, + value: function forEach(callbackfn, thisArg = globalThis) { + webidl.brandCheck(this, object); + webidl.argumentLengthCheck(arguments, 1, `${name2}.forEach`); + if (typeof callbackfn !== "function") { + throw new TypeError( + `Failed to execute 'forEach' on '${name2}': parameter 1 is not of type 'Function'.` + ); + } + for (const { 0: key, 1: value } of makeIterator(this, "key+value")) { + callbackfn.call(thisArg, value, key, this); + } + } + } + }; + return Object.defineProperties(object.prototype, { + ...properties, + [Symbol.iterator]: { + writable: true, + enumerable: false, + configurable: true, + value: properties.entries.value + } + }); } - exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports.ALPHANUM); - exports.TOKEN = exports.STRICT_TOKEN.concat([" "]); - exports.HEADER_CHARS = [" "]; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); + async function fullyReadBody(body, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + let reader; + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + try { + successSteps(await readAllBytes(reader)); + } catch (e) { + errorSteps(e); + } + } + function isReadableStreamLike(stream) { + return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + function readableStreamClose(controller) { + try { + controller.close(); + controller.byobRequest?.respond(0); + } catch (err) { + if (!err.message.includes("Controller is already closed") && !err.message.includes("ReadableStream is already closed")) { + throw err; + } + } + } + var invalidIsomorphicEncodeValueRegex = /[^\x00-\xFF]/; + function isomorphicEncode(input) { + assert5(!invalidIsomorphicEncodeValueRegex.test(input)); + return input; + } + async function readAllBytes(reader) { + const bytes = []; + let byteLength = 0; + while (true) { + const { done, value: chunk } = await reader.read(); + if (done) { + return Buffer.concat(bytes, byteLength); + } + if (!isUint8Array(chunk)) { + throw new TypeError("Received non-Uint8Array chunk"); + } + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert5("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + return typeof url === "string" && url[5] === ":" && url[0] === "h" && url[1] === "t" && url[2] === "t" && url[3] === "p" && url[4] === "s" || url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert5("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + function simpleRangeHeaderValue(value, allowWhitespace) { + const data = value; + if (!data.startsWith("bytes")) { + return "failure"; + } + const position = { position: 5 }; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 61) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeStart = collectASequenceOfCodePoints( + (char) => { + const code2 = char.charCodeAt(0); + return code2 >= 48 && code2 <= 57; + }, + data, + position + ); + const rangeStartValue = rangeStart.length ? Number(rangeStart) : null; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + if (data.charCodeAt(position.position) !== 45) { + return "failure"; + } + position.position++; + if (allowWhitespace) { + collectASequenceOfCodePoints( + (char) => char === " " || char === " ", + data, + position + ); + } + const rangeEnd = collectASequenceOfCodePoints( + (char) => { + const code2 = char.charCodeAt(0); + return code2 >= 48 && code2 <= 57; + }, + data, + position + ); + const rangeEndValue = rangeEnd.length ? Number(rangeEnd) : null; + if (position.position < data.length) { + return "failure"; + } + if (rangeEndValue === null && rangeStartValue === null) { + return "failure"; + } + if (rangeStartValue > rangeEndValue) { + return "failure"; } + return { rangeStartValue, rangeEndValue }; + } + function buildContentRange(rangeStart, rangeEnd, fullLength) { + let contentRange = "bytes "; + contentRange += isomorphicEncode(`${rangeStart}`); + contentRange += "-"; + contentRange += isomorphicEncode(`${rangeEnd}`); + contentRange += "/"; + contentRange += isomorphicEncode(`${fullLength}`); + return contentRange; } - exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); - exports.MAJOR = exports.NUM_MAP; - exports.MINOR = exports.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); - exports.SPECIAL_HEADERS = { - "connection": HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - "upgrade": HEADER_STATE.UPGRADE - }; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js -var require_RedirectHandler = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/handler/RedirectHandler.js"(exports, module2) { - "use strict"; - var util = require_util(); - var { kBodyUsed } = require_symbols(); - var assert3 = require("node:assert"); - var { InvalidArgumentError } = require_errors(); - var EE = require("node:events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - var BodyAsyncIterable = class { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; + var InflateStream = class extends Transform { + #zlibOptions; + /** @param {zlib.ZlibOptions} [zlibOptions] */ + constructor(zlibOptions) { + super(); + this.#zlibOptions = zlibOptions; } - async *[Symbol.asyncIterator]() { - assert3(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; + _transform(chunk, encoding, callback) { + if (!this._inflateStream) { + if (chunk.length === 0) { + callback(); + return; + } + this._inflateStream = (chunk[0] & 15) === 8 ? zlib.createInflate(this.#zlibOptions) : zlib.createInflateRaw(this.#zlibOptions); + this._inflateStream.on("data", this.push.bind(this)); + this._inflateStream.on("end", () => this.push(null)); + this._inflateStream.on("error", (err) => this.destroy(err)); + } + this._inflateStream.write(chunk, encoding, callback); + } + _final(callback) { + if (this._inflateStream) { + this._inflateStream.end(); + this._inflateStream = null; + } + callback(); } }; - var RedirectHandler = class { - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + function createInflate(zlibOptions) { + return new InflateStream(zlibOptions); + } + function extractMimeType(headers) { + let charset = null; + let essence = null; + let mimeType = null; + const values = getDecodeSplit("content-type", headers); + if (values === null) { + return "failure"; + } + for (const value of values) { + const temporaryMimeType = parseMIMEType(value); + if (temporaryMimeType === "failure" || temporaryMimeType.essence === "*/*") { + continue; } - util.validateHandler(handler, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; - this.redirectionLimitReached = false; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert3(false); - }); + mimeType = temporaryMimeType; + if (mimeType.essence !== essence) { + charset = null; + if (mimeType.parameters.has("charset")) { + charset = mimeType.parameters.get("charset"); } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); + essence = mimeType.essence; + } else if (!mimeType.parameters.has("charset") && charset !== null) { + mimeType.parameters.set("charset", charset); + } + } + if (mimeType == null) { + return "failure"; + } + return mimeType; + } + function gettingDecodingSplitting(value) { + const input = value; + const position = { position: 0 }; + const values = []; + let temporaryValue = ""; + while (position.position < input.length) { + temporaryValue += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== ",", + input, + position + ); + if (position.position < input.length) { + if (input.charCodeAt(position.position) === 34) { + temporaryValue += collectAnHTTPQuotedString( + input, + position + ); + if (position.position < input.length) { + continue; + } + } else { + assert5(input.charCodeAt(position.position) === 44); + position.position++; } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); } + temporaryValue = removeChars(temporaryValue, true, true, (char) => char === 9 || char === 32); + values.push(temporaryValue); + temporaryValue = ""; } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); + return values; + } + function getDecodeSplit(name2, list2) { + const value = list2.get(name2, true); + if (value === null) { + return null; } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); + return gettingDecodingSplitting(value); + } + var textDecoder = new TextDecoder(); + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; } - onError(error) { - this.handler.onError(error); + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - if (this.request) { - this.request.abort(new Error("max redirects")); - } - this.redirectionLimitReached = true; - this.abort(new Error("max redirects")); - return; - } - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); - } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path10 = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path10; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } + const output = textDecoder.decode(buffer); + return output; + } + var EnvironmentSettingsObjectBase = class { + get baseUrl() { + return getGlobalOrigin(); + } + get origin() { + return this.baseUrl?.origin; + } + policyContainer = makePolicyContainer(); + }; + var EnvironmentSettingsObject = class { + settingsObject = new EnvironmentSettingsObjectBase(); + }; + var environmentSettingsObject = new EnvironmentSettingsObject(); + module2.exports = { + isAborted, + isCancelled, + isValidEncodedURL, + createDeferredPromise, + ReadableStreamFrom, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + clampAndCoarsenConnectionTimingInfo, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + iteratorMixin, + createIterator, + isValidHeaderName, + isValidHeaderValue, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + simpleRangeHeaderValue, + buildContentRange, + parseMetadata, + createInflate, + extractMimeType, + getDecodeSplit, + utf8DecodeBytes, + environmentSettingsObject + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js +var require_symbols2 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kUrl: Symbol("url"), + kHeaders: Symbol("headers"), + kSignal: Symbol("signal"), + kState: Symbol("state"), + kDispatcher: Symbol("dispatcher") + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js +var require_file = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js"(exports2, module2) { + "use strict"; + var { Blob: Blob2, File } = require("node:buffer"); + var { kState } = require_symbols2(); + var { webidl } = require_webidl(); + var FileLike = class _FileLike { + constructor(blobLike, fileName, options = {}) { + const n = fileName; + const t = options.type; + const d = options.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); - } + stream(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.stream(...args); } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); - } + arrayBuffer(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.arrayBuffer(...args); } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } + slice(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.slice(...args); } - }; - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; + text(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.text(...args); } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") { - return headers[i + 1]; - } + get size() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.size; } - } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === "host"; + get type() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.type; } - if (removeContent && util.headerNameToString(header).startsWith("content-")) { - return true; + get name() { + webidl.brandCheck(this, _FileLike); + return this[kState].name; } - if (unknownOrigin && (header.length === 13 || header.length === 6)) { - const name = util.headerNameToString(header); - return name === "authorization" || name === "cookie"; + get lastModified() { + webidl.brandCheck(this, _FileLike); + return this[kState].lastModified; } - return false; - } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } - } - } else { - assert3(headers == null, "headers must be an object or an array"); + get [Symbol.toStringTag]() { + return "File"; } - return ret; - } - module2.exports = RedirectHandler; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js -var require_redirectInterceptor = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/interceptor/redirectInterceptor.js"(exports, module2) { - "use strict"; - var RedirectHandler = require_RedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; - }; + }; + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + function isFileLike(object) { + return object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; } - module2.exports = createRedirectInterceptor; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports, module2) { - var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=", "base64"); - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports, module2) { - var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + module2.exports = { FileLike, isFileLike }; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js -var require_client = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/client.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js +var require_formdata = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) { "use strict"; - var assert3 = require("node:assert"); - var net = require("node:net"); - var http = require("node:http"); - var { pipeline } = require("node:stream"); - var util = require_util(); - var { channels } = require_diagnostics(); - var timers = require_timers(); - var Request = require_request(); - var DispatcherBase = require_dispatcher_base(); - var { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = require_errors(); - var buildConnector = require_connect(); - var { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = require_symbols(); - var http2; - try { - http2 = require("node:http2"); - } catch { - http2 = { constants: {} }; - } - var { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS + var { isBlobLike, iteratorMixin } = require_util3(); + var { kState } = require_symbols2(); + var { kEnumerableProperty } = require_util(); + var { FileLike, isFileLike } = require_file(); + var { webidl } = require_webidl(); + var { File: NativeFile } = require("node:buffer"); + var nodeUtil = require("node:util"); + var File = globalThis.File ?? NativeFile; + var FormData = class _FormData { + constructor(form) { + webidl.util.markAsUncloneable(this); + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); + } + this[kState] = []; } - } = http2; - var h2ExperimentalWarned = false; - var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); - var Client = class extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super(); - if (keepAlive !== void 0) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + append(name2, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.append"; + webidl.argumentLengthCheck(arguments, 2, prefix); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name2 = webidl.converters.USVString(name2, prefix, "name"); + value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "value", { strict: false }) : webidl.converters.USVString(value, prefix, "value"); + filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "filename") : void 0; + const entry = makeEntry(name2, value, filename); + this[kState].push(entry); + } + delete(name2) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.delete"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name2 = webidl.converters.USVString(name2, prefix, "name"); + this[kState] = this[kState].filter((entry) => entry.name !== name2); + } + get(name2) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.get"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name2 = webidl.converters.USVString(name2, prefix, "name"); + const idx = this[kState].findIndex((entry) => entry.name === name2); + if (idx === -1) { + return null; } - if (socketTimeout !== void 0) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + return this[kState][idx].value; + } + getAll(name2) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.getAll"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name2 = webidl.converters.USVString(name2, prefix, "name"); + return this[kState].filter((entry) => entry.name === name2).map((entry) => entry.value); + } + has(name2) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.has"; + webidl.argumentLengthCheck(arguments, 1, prefix); + name2 = webidl.converters.USVString(name2, prefix, "name"); + return this[kState].findIndex((entry) => entry.name === name2) !== -1; + } + set(name2, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + const prefix = "FormData.set"; + webidl.argumentLengthCheck(arguments, 2, prefix); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ); } - if (requestTimeout !== void 0) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + name2 = webidl.converters.USVString(name2, prefix, "name"); + value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "name", { strict: false }) : webidl.converters.USVString(value, prefix, "name"); + filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "name") : void 0; + const entry = makeEntry(name2, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name2); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name2) + ]; + } else { + this[kState].push(entry); } - if (idleTimeout !== void 0) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + [nodeUtil.inspect.custom](depth, options) { + const state = this[kState].reduce((a, b) => { + if (a[b.name]) { + if (Array.isArray(a[b.name])) { + a[b.name].push(b.value); + } else { + a[b.name] = [a[b.name], b.value]; + } + } else { + a[b.name] = b.value; + } + return a; + }, { __proto__: null }); + options.depth ??= depth; + options.colors ??= true; + const output = nodeUtil.formatWithOptions(options, state); + return `FormData ${output.slice(output.indexOf("]") + 2)}`; + } + }; + iteratorMixin("FormData", FormData, kState, "name", "value"); + Object.defineProperties(FormData.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + getAll: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name2, value, filename) { + if (typeof value === "string") { + } else { + if (!isFileLike(value)) { + value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); } - if (maxKeepAliveTimeout !== void 0) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + if (filename !== void 0) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = value instanceof NativeFile ? new File([value], filename, options) : new FileLike(value, filename, options); } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); + } + return { name: name2, value }; + } + module2.exports = { FormData, makeEntry }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js +var require_formdata_parser = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) { + "use strict"; + var { isUSVString, bufferToLowerCasedHeaderName } = require_util(); + var { utf8DecodeBytes } = require_util3(); + var { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = require_data_url(); + var { isFileLike } = require_file(); + var { makeEntry } = require_formdata(); + var assert5 = require("node:assert"); + var { File: NodeFile } = require("node:buffer"); + var File = globalThis.File ?? NodeFile; + var formDataNameBuffer = Buffer.from('form-data; name="'); + var filenameBuffer = Buffer.from("; filename"); + var dd = Buffer.from("--"); + var ddcrlf = Buffer.from("--\r\n"); + function isAsciiString(chars) { + for (let i = 0; i < chars.length; ++i) { + if ((chars.charCodeAt(i) & ~127) !== 0) { + return false; } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); + } + return true; + } + function validateBoundary(boundary) { + const length = boundary.length; + if (length < 27 || length > 70) { + return false; + } + for (let i = 0; i < length; ++i) { + const cp = boundary.charCodeAt(i); + if (!(cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 39 || cp === 45 || cp === 95)) { + return false; } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); + } + return true; + } + function multipartFormDataParser(input, mimeType) { + assert5(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); + const boundaryString = mimeType.parameters.get("boundary"); + if (boundaryString === void 0) { + return "failure"; + } + const boundary = Buffer.from(`--${boundaryString}`, "utf8"); + const entryList = []; + const position = { position: 0 }; + while (input[position.position] === 13 && input[position.position + 1] === 10) { + position.position += 2; + } + let trailing = input.length; + while (input[trailing - 1] === 10 && input[trailing - 2] === 13) { + trailing -= 2; + } + if (trailing !== input.length) { + input = input.subarray(0, trailing); + } + while (true) { + if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { + position.position += boundary.length; + } else { + return "failure"; } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); + if (position.position === input.length - 2 && bufferStartsWith(input, dd, position) || position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) { + return entryList; } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + position.position += 2; + const result = parseMultipartFormDataHeaders(input, position); + if (result === "failure") { + return "failure"; } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + let { name: name2, filename, contentType, encoding } = result; + position.position += 2; + let body; + { + const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); + if (boundaryIndex === -1) { + return "failure"; + } + body = input.subarray(position.position, boundaryIndex - 4); + position.position += body.length; + if (encoding === "base64") { + body = Buffer.from(body.toString(), "base64"); + } } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + if (input[position.position] !== 13 || input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + let value; + if (filename !== null) { + contentType ??= "text/plain"; + if (!isAsciiString(contentType)) { + contentType = ""; + } + value = new File([body], filename, { type: contentType }); + } else { + value = utf8DecodeBytes(Buffer.from(body)); } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + assert5(isUSVString(name2)); + assert5(typeof value === "string" && isUSVString(value) || isFileLike(value)); + entryList.push(makeEntry(name2, value, filename)); + } + } + function parseMultipartFormDataHeaders(input, position) { + let name2 = null; + let filename = null; + let contentType = null; + let encoding = null; + while (true) { + if (input[position.position] === 13 && input[position.position + 1] === 10) { + if (name2 === null) { + return "failure"; + } + return { name: name2, filename, contentType, encoding }; } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + let headerName = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 58, + input, + position + ); + headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); + if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { + return "failure"; } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); + if (input[position.position] !== 58) { + return "failure"; } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); + position.position++; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + switch (bufferToLowerCasedHeaderName(headerName)) { + case "content-disposition": { + name2 = filename = null; + if (!bufferStartsWith(input, formDataNameBuffer, position)) { + return "failure"; + } + position.position += 17; + name2 = parseMultipartFormDataName(input, position); + if (name2 === null) { + return "failure"; + } + if (bufferStartsWith(input, filenameBuffer, position)) { + let check = position.position + filenameBuffer.length; + if (input[check] === 42) { + position.position += 1; + check += 1; + } + if (input[check] !== 61 || input[check + 1] !== 34) { + return "failure"; + } + position.position += 12; + filename = parseMultipartFormDataName(input, position); + if (filename === null) { + return "failure"; + } + } + break; + } + case "content-type": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + contentType = isomorphicDecode(headerValue); + break; + } + case "content-transfer-encoding": { + let headerValue = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + headerValue = removeChars(headerValue, false, true, (char) => char === 9 || char === 32); + encoding = isomorphicDecode(headerValue); + break; + } + default: { + collectASequenceOfBytes( + (char) => char !== 10 && char !== 13, + input, + position + ); + } } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + if (input[position.position] !== 13 && input[position.position + 1] !== 10) { + return "failure"; + } else { + position.position += 2; } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); + } + } + function parseMultipartFormDataName(input, position) { + assert5(input[position.position - 1] === 34); + let name2 = collectASequenceOfBytes( + (char) => char !== 10 && char !== 13 && char !== 34, + input, + position + ); + if (input[position.position] !== 34) { + return null; + } else { + position.position++; + } + name2 = new TextDecoder().decode(name2).replace(/%0A/ig, "\n").replace(/%0D/ig, "\r").replace(/%22/g, '"'); + return name2; + } + function collectASequenceOfBytes(condition, input, position) { + let start = position.position; + while (start < input.length && condition(input[start])) { + ++start; + } + return input.subarray(position.position, position.position = start); + } + function removeChars(buf, leading, trailing, predicate) { + let lead = 0; + let trail = buf.length - 1; + if (leading) { + while (lead < buf.length && predicate(buf[lead])) lead++; + } + if (trailing) { + while (trail > 0 && predicate(buf[trail])) trail--; + } + return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); + } + function bufferStartsWith(buffer, start, position) { + if (buffer.length < start.length) { + return false; + } + for (let i = 0; i < start.length; i++) { + if (start[i] !== buffer[position.position + i]) { + return false; } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); + } + return true; + } + module2.exports = { + multipartFormDataParser, + validateBoundary + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js +var require_body = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js"(exports2, module2) { + "use strict"; + var util = require_util(); + var { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody, + extractMimeType, + utf8DecodeBytes + } = require_util3(); + var { FormData } = require_formdata(); + var { kState } = require_symbols2(); + var { webidl } = require_webidl(); + var { Blob: Blob2 } = require("node:buffer"); + var assert5 = require("node:assert"); + var { isErrored, isDisturbed } = require("node:stream"); + var { isArrayBuffer } = require("node:util/types"); + var { serializeAMimeType } = require_data_url(); + var { multipartFormDataParser } = require_formdata_parser(); + var random; + try { + const crypto = require("node:crypto"); + random = (max) => crypto.randomInt(0, max); + } catch { + random = (max) => Math.floor(Math.random(max)); + } + var textEncoder = new TextEncoder(); + function noop3() { + } + var hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf("v18") !== 0; + var streamRegistry; + if (hasFinalizationRegistry) { + streamRegistry = new FinalizationRegistry((weakRef) => { + const stream = weakRef.deref(); + if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { + stream.cancel("Response object has been garbage collected").catch(noop3); + } + }); + } + function extractBody(object, keepalive = false) { + let stream = null; + if (object instanceof ReadableStream) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream({ + async pull(controller) { + const buffer = typeof source === "string" ? textEncoder.encode(source) : source; + if (buffer.byteLength) { + controller.enqueue(buffer); + } + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: "bytes" + }); + } + assert5(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name2, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name2))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name2))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect2 - }); + const chunk = textEncoder.encode(`--${boundary}--\r +`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; } - this[kInterceptors] = interceptors?.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect2; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r -`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = "h1"; - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 ? null : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, - // Keep track of them to decide whether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 - // Max peerConcurrentStreams for a Node h2 server + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; - } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; - } - /* istanbul ignore: only used for test */ - [kConnect](cb) { - connect(this); - this.once("connect", cb); - } - [kDispatch](opts, handler) { - const origin = opts.origin || this[kUrl].origin; - const request = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler) : Request[kHTTP1BuildRequest](origin, opts, handler); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); + type = `multipart/form-data; boundary=${boundary}`; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); } - return this[kNeedDrain] < 2; + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); + } + stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); } - async [kClose]() { - return new Promise((resolve) => { - if (this[kSize]) { - this[kClosedResolve] = resolve; - } else { - resolve(null); - } - }); + if (typeof source === "string" || util.isBuffer(source)) { + length = Buffer.byteLength(source); } - async [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; + if (action != null) { + let iterator; + stream = new ReadableStream({ + async start() { + iterator = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + if (!isErrored(stream)) { + const buffer = new Uint8Array(value); + if (buffer.byteLength) { + controller.enqueue(buffer); + } + } } - resolve(); - }; - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; - } - if (this[kSocket]) { - util.destroy(this[kSocket].on("close", callback), err); - } else { - queueMicrotask(callback); - } - resume(this); + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + }, + type: "bytes" }); } - }; - function onHttp2SessionError(err) { - assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kSocket][kError] = err; - onError(this[kClient], err); + const body = { stream, source, length }; + return [body, type]; } - function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); + function safelyExtractBody(object, keepalive = false) { + if (object instanceof ReadableStream) { + assert5(!util.isDisturbed(object), "The body has already been consumed."); + assert5(!object.locked, "The stream is locked."); } + return extractBody(object, keepalive); } - function onHttp2SessionEnd() { - util.destroy(this, new SocketError("other side closed")); - util.destroy(this[kSocket], new SocketError("other side closed")); + function cloneBody(instance, body) { + const [out1, out2] = body.stream.tee(); + body.stream = out1; + return { + stream: out2, + length: body.length, + source: body.source + }; } - function onHTTP2GoAway(code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; - if (client.destroyed) { - assert3(this[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException("The operation was aborted.", "AbortError"); + } + } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return consumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === null) { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return consumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return consumeBody(this, parseJSONFromBytes, instance); + }, + formData() { + return consumeBody(this, (value) => { + const mimeType = bodyMimeType(this); + if (mimeType !== null) { + switch (mimeType.essence) { + case "multipart/form-data": { + const parsed = multipartFormDataParser(value, mimeType); + if (parsed === "failure") { + throw new TypeError("Failed to parse body as FormData."); + } + const fd = new FormData(); + fd[kState] = parsed; + return fd; + } + case "application/x-www-form-urlencoded": { + const entries = new URLSearchParams(value.toString()); + const fd = new FormData(); + for (const [name2, value2] of entries) { + fd.append(name2, value2); + } + return fd; + } + } + } + throw new TypeError( + 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' + ); + }, instance); + }, + bytes() { + return consumeBody(this, (bytes) => { + return new Uint8Array(bytes); + }, instance); } - } else if (client[kRunning] > 0) { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert3(client[kRunning] === 0); - client.emit( - "disconnect", - client[kUrl], - [client], - err - ); - resume(client); + }; + return methods; + } + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function consumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + if (bodyUnusable(object)) { + throw new TypeError("Body is unusable: Body has already been read"); + } + throwIfAborted(object[kState]); + const promise = createDeferredPromise(); + const errorSteps = (error) => promise.reject(error); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + if (object[kState].body == null) { + successSteps(Buffer.allocUnsafe(0)); + return promise.promise; + } + await fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(object) { + const body = object[kState].body; + return body != null && (body.stream.locked || util.isDisturbed(body.stream)); + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(requestOrResponse) { + const headers = requestOrResponse[kState].headersList; + const mimeType = extractMimeType(headers); + if (mimeType === "failure") { + return null; + } + return mimeType; } - var constants = require_constants4(); - var createRedirectInterceptor = require_redirectInterceptor(); + module2.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody, + streamRegistry, + hasFinalizationRegistry, + bodyUnusable + }; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js +var require_client_h1 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) { + "use strict"; + var assert5 = require("node:assert"); + var util = require_util(); + var { channels } = require_diagnostics(); + var timers = require_timers(); + var { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError + } = require_errors(); + var { + kUrl, + kReset, + kClient, + kParser, + kBlocking, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kMaxRequests, + kCounter, + kMaxResponseSize, + kOnError, + kResume, + kHTTPContext + } = require_symbols(); + var constants2 = require_constants3(); var EMPTY_BUF = Buffer.alloc(0); + var FastBuffer = Buffer[Symbol.species]; + var addListener = util.addListener; + var removeAllListeners = util.removeAllListeners; + var extractBody; async function lazyllhttp() { const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; let mod; @@ -11768,35 +9950,35 @@ var require_client = __commonJS({ return 0; }, wasm_on_status: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; }, wasm_on_message_begin: (p) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); return currentParser.onMessageBegin() || 0; }, wasm_on_header_field: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; }, wasm_on_header_value: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; }, wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; }, wasm_on_body: (p, at, len) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; }, wasm_on_message_complete: (p) => { - assert3.strictEqual(currentParser.ptr, p); + assert5(currentParser.ptr === p); return currentParser.onMessageComplete() || 0; } /* eslint-enable camelcase */ @@ -11810,14 +9992,16 @@ var require_client = __commonJS({ var currentBufferRef = null; var currentBufferSize = 0; var currentBufferPtr = null; - var TIMEOUT_HEADERS = 1; - var TIMEOUT_BODY = 2; - var TIMEOUT_IDLE = 3; - var Parser = class { - constructor(client, socket, { exports: exports2 }) { - assert3(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - this.llhttp = exports2; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + var USE_NATIVE_TIMER = 0; + var USE_FAST_TIMER = 1; + var TIMEOUT_HEADERS = 2 | USE_FAST_TIMER; + var TIMEOUT_BODY = 4 | USE_FAST_TIMER; + var TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER; + var Parser2 = class { + constructor(client, socket, { exports: exports3 }) { + assert5(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + this.llhttp = exports3; + this.ptr = this.llhttp.llhttp_alloc(constants2.TYPE.RESPONSE); this.client = client; this.socket = socket; this.timeout = null; @@ -11838,33 +10022,36 @@ var require_client = __commonJS({ this.connection = ""; this.maxResponseSize = client[kMaxResponseSize]; } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { + setTimeout(delay, type) { + if (delay !== this.timeoutValue || type & USE_FAST_TIMER ^ this.timeoutType & USE_FAST_TIMER) { + if (this.timeout) { + timers.clearTimeout(this.timeout); + this.timeout = null; + } + if (delay) { + if (type & USE_FAST_TIMER) { + this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)); + } else { + this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)); this.timeout.unref(); } - } else { - this.timeout = null; } - this.timeoutValue = value; + this.timeoutValue = delay; } else if (this.timeout) { if (this.timeout.refresh) { this.timeout.refresh(); } } + this.timeoutType = type; } resume() { if (this.socket.destroyed || !this.paused) { return; } - assert3(this.ptr != null); - assert3(currentParser == null); + assert5(this.ptr != null); + assert5(currentParser == null); this.llhttp.llhttp_resume(this.ptr); - assert3(this.timeoutType === TIMEOUT_BODY); + assert5(this.timeoutType === TIMEOUT_BODY); if (this.timeout) { if (this.timeout.refresh) { this.timeout.refresh(); @@ -11884,9 +10071,9 @@ var require_client = __commonJS({ } } execute(data) { - assert3(this.ptr != null); - assert3(currentParser == null); - assert3(!this.paused); + assert5(this.ptr != null); + assert5(currentParser == null); + assert5(!this.paused); const { socket, llhttp } = this; if (data.length > currentBufferSize) { if (currentBufferPtr) { @@ -11909,30 +10096,30 @@ var require_client = __commonJS({ currentBufferRef = null; } const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { + if (ret === constants2.ERROR.PAUSED_UPGRADE) { this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { + } else if (ret === constants2.ERROR.PAUSED) { this.paused = true; socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { + } else if (ret !== constants2.ERROR.OK) { const ptr = llhttp.llhttp_get_error_reason(this.ptr); let message = ""; if (ptr) { const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); + throw new HTTPParserError(message, constants2.ERROR[ret], data.slice(offset)); } } catch (err) { util.destroy(socket, err); } } destroy() { - assert3(this.ptr != null); - assert3(currentParser == null); + assert5(this.ptr != null); + assert5(currentParser == null); this.llhttp.llhttp_free(this.ptr); this.ptr = null; - timers.clearTimeout(this.timeout); + this.timeout && timers.clearTimeout(this.timeout); this.timeout = null; this.timeoutValue = null; this.timeoutType = null; @@ -11990,17 +10177,17 @@ var require_client = __commonJS({ } onUpgrade(head) { const { upgrade, client, socket, headers, statusCode } = this; - assert3(upgrade); + assert5(upgrade); + assert5(client[kSocket] === socket); + assert5(!socket.destroyed); + assert5(!this.paused); + assert5((headers.length & 1) === 0); const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3(!socket.destroyed); - assert3(socket === client[kSocket]); - assert3(!this.paused); - assert3(request.upgrade || request.method === "CONNECT"); + assert5(request); + assert5(request.upgrade || request.method === "CONNECT"); this.statusCode = null; this.statusText = ""; this.shouldKeepAlive = null; - assert3(this.headers.length % 2 === 0); this.headers = []; this.headersSize = 0; socket.unshift(head); @@ -12008,8 +10195,9 @@ var require_client = __commonJS({ socket[kParser] = null; socket[kClient] = null; socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); + removeAllListeners(socket); client[kSocket] = null; + client[kHTTPContext] = null; client[kQueue][client[kRunningIdx]++] = null; client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); try { @@ -12017,7 +10205,7 @@ var require_client = __commonJS({ } catch (err) { util.destroy(socket, err); } - resume(client); + client[kResume](); } onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { const { client, socket, headers, statusText } = this; @@ -12028,8 +10216,8 @@ var require_client = __commonJS({ if (!request) { return -1; } - assert3(!this.upgrade); - assert3(this.statusCode < 200); + assert5(!this.upgrade); + assert5(this.statusCode < 200); if (statusCode === 100) { util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); return -1; @@ -12038,7 +10226,7 @@ var require_client = __commonJS({ util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); return -1; } - assert3.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + assert5(this.timeoutType === TIMEOUT_HEADERS); this.statusCode = statusCode; this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; @@ -12051,16 +10239,16 @@ var require_client = __commonJS({ } } if (request.method === "CONNECT") { - assert3(client[kRunning] === 1); + assert5(client[kRunning] === 1); this.upgrade = true; return 2; } if (upgrade) { - assert3(client[kRunning] === 1); + assert5(client[kRunning] === 1); this.upgrade = true; return 2; } - assert3(this.headers.length % 2 === 0); + assert5((this.headers.length & 1) === 0); this.headers = []; this.headersSize = 0; if (this.shouldKeepAlive && client[kPipelining]) { @@ -12093,9 +10281,9 @@ var require_client = __commonJS({ } if (socket[kBlocking]) { socket[kBlocking] = false; - resume(client); + client[kResume](); } - return pause ? constants.ERROR.PAUSED : 0; + return pause ? constants2.ERROR.PAUSED : 0; } onBody(buf) { const { client, socket, statusCode, maxResponseSize } = this; @@ -12103,21 +10291,21 @@ var require_client = __commonJS({ return -1; } const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3.strictEqual(this.timeoutType, TIMEOUT_BODY); + assert5(request); + assert5(this.timeoutType === TIMEOUT_BODY); if (this.timeout) { if (this.timeout.refresh) { this.timeout.refresh(); } } - assert3(statusCode >= 200); + assert5(statusCode >= 200); if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { util.destroy(socket, new ResponseExceededMaxSizeError()); return -1; } this.bytesRead += buf.length; if (request.onData(buf) === false) { - return constants.ERROR.PAUSED; + return constants2.ERROR.PAUSED; } } onMessageComplete() { @@ -12128,16 +10316,16 @@ var require_client = __commonJS({ if (upgrade) { return; } + assert5(statusCode >= 100); + assert5((this.headers.length & 1) === 0); const request = client[kQueue][client[kRunningIdx]]; - assert3(request); - assert3(statusCode >= 100); + assert5(request); this.statusCode = null; this.statusText = ""; this.bytesRead = 0; this.contentLength = ""; this.keepAlive = ""; this.connection = ""; - assert3(this.headers.length % 2 === 0); this.headers = []; this.headersSize = 0; if (statusCode < 200) { @@ -12150,531 +10338,847 @@ var require_client = __commonJS({ request.onComplete(headers); client[kQueue][client[kRunningIdx]++] = null; if (socket[kWriting]) { - assert3.strictEqual(client[kRunning], 0); + assert5(client[kRunning] === 0); util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; + return constants2.ERROR.PAUSED; } else if (!shouldKeepAlive) { util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; + return constants2.ERROR.PAUSED; } else if (socket[kReset] && client[kRunning] === 0) { util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] === 1) { - setImmediate(resume, client); + return constants2.ERROR.PAUSED; + } else if (client[kPipelining] == null || client[kPipelining] === 1) { + setImmediate(() => client[kResume]()); } else { - resume(client); + client[kResume](); } } }; function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser; + const { socket, timeoutType, client, paused } = parser.deref(); if (timeoutType === TIMEOUT_HEADERS) { if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert3(!parser.paused, "cannot be paused while waiting for headers"); + assert5(!paused, "cannot be paused while waiting for headers"); util.destroy(socket, new HeadersTimeoutError()); } } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { + if (!paused) { util.destroy(socket, new BodyTimeoutError()); } - } else if (timeoutType === TIMEOUT_IDLE) { - assert3(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + } else if (timeoutType === TIMEOUT_KEEP_ALIVE) { + assert5(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); util.destroy(socket, new InformationalError("socket idle timeout")); } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); + } + async function connectH1(client, socket) { + client[kSocket] = socket; + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser2(client, socket, llhttpInstance); + addListener(socket, "error", function(err) { + assert5(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + const parser = this[kParser]; + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + this[kError] = err; + this[kClient][kOnError](err); + }); + addListener(socket, "readable", function() { + const parser = this[kParser]; + if (parser) { + parser.readMore(); + } + }); + addListener(socket, "end", function() { + const parser = this[kParser]; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + }); + addListener(socket, "close", function() { + const client2 = this[kClient]; + const parser = this[kParser]; + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client2[kSocket] = null; + client2[kHTTPContext] = null; + if (client2.destroyed) { + assert5(client2[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client2, request, err); + } + } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client2[kQueue][client2[kRunningIdx]]; + client2[kQueue][client2[kRunningIdx]++] = null; + util.errorRequest(client2, request, err); + } + client2[kPendingIdx] = client2[kRunningIdx]; + assert5(client2[kRunning] === 0); + client2.emit("disconnect", client2[kUrl], [client2], err); + client2[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h1", + defaultPipelining: 1, + write(...args) { + return writeH1(client, ...args); + }, + resume() { + resumeH1(client); + }, + destroy(err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); + } + }, + get destroyed() { + return socket.destroyed; + }, + busy(request) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return true; + } + if (request) { + if (client[kRunning] > 0 && !request.idempotent) { + return true; + } + if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { + return true; + } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) { + return true; + } + } + return false; + } + }; + } + function resumeH1(client) { + const socket = client[kSocket]; + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request.headersTimeout != null ? request.headersTimeout : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH1(client, request) { + const { method, path: path16, host, upgrade, blocking, reset } = request; + let { body, headers, contentLength } = request; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH" || method === "QUERY" || method === "PROPFIND" || method === "PROPPATCH"; + if (util.isFormDataLike(body)) { + if (!extractBody) { + extractBody = require_body().extractBody; + } + const [bodyStream, contentType] = extractBody(body); + if (request.contentType == null) { + headers.push("content-type", contentType); + } + body = bodyStream.stream; + contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && request.contentType == null && body.type) { + headers.push("content-type", body.type); + } + if (body && typeof body.read === "function") { + body.read(0); + } + const bodyLength = util.bodyLength(body); + contentLength = bodyLength ?? contentLength; + if (contentLength === null) { + contentLength = request.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + util.errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + const socket = client[kSocket]; + const abort = (err) => { + if (request.aborted || request.completed) { + return; + } + util.errorRequest(client, request, err || new RequestAbortedError()); + util.destroy(body); + util.destroy(socket, new InformationalError("aborted")); + }; + try { + request.onConnect(abort); + } catch (err) { + util.errorRequest(client, request, err); + } + if (request.aborted) { + return false; + } + if (method === "HEAD") { + socket[kReset] = true; + } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; + } + if (reset != null) { + socket[kReset] = reset; + } + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path16} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (Array.isArray(headers)) { + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0]; + const val = headers[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + header += `${key}: ${val[i]}\r +`; + } + } else { + header += `${key}: ${val}\r +`; + } + } + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + if (!body || bodyLength === 0) { + writeBuffer(abort, null, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBuffer(body)) { + writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable(abort, body.stream(), client, request, socket, contentLength, header, expectsPayload); + } else { + writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload); + } + } else if (util.isStream(body)) { + writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else if (util.isIterable(body)) { + writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload); + } else { + assert5(false); + } + return true; + } + function writeStream(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert5(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + let finished = false; + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function() { + if (finished) { + return; + } + if (body.resume) { + body.resume(); + } + }; + const onClose = function() { + queueMicrotask(() => { + body.removeListener("error", onFinished); + }); + if (!finished) { + const err = new RequestAbortedError(); + queueMicrotask(() => onFinished(err)); + } + }; + const onFinished = function(err) { + if (finished) { + return; + } + finished = true; + assert5(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; + body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); + if (body.resume) { + body.resume(); + } + socket.on("drain", onDrain).on("error", onFinished); + if (body.errorEmitted ?? body.errored) { + setImmediate(() => onFinished(body.errored)); + } else if (body.endEmitted ?? body.readableEnded) { + setImmediate(() => onFinished(null)); } - } - function onSocketError(err) { - const { [kClient]: client, [kParser]: parser } = this; - assert3(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (client[kHTTPConnVersion] !== "h2") { - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } + if (body.closeEmitted ?? body.closed) { + setImmediate(onClose); } - this[kError] = err; - onError(this[kClient], err); } - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert3(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + function writeBuffer(abort, body, client, request, socket, contentLength, header, expectsPayload) { + try { + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert5(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + } else if (util.isBuffer(body)) { + assert5(contentLength === body.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } } - assert3(client[kSize] === 0); + request.onRequestSent(); + client[kResume](); + } catch (err) { + abort(err); } } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client } = this; - if (client[kHTTPConnVersion] !== "h2") { - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; + async function writeBlob(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert5(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); + } + const buffer = Buffer.from(await body.arrayBuffer()); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer); + socket.uncork(); + request.onBodySent(buffer); + request.onRequestSent(); + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; } + client[kResume](); + } catch (err) { + abort(err); } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); } - function onSocketClose() { - const { [kClient]: client, [kParser]: parser } = this; - if (client[kHTTPConnVersion] === "h1" && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); + async function writeIterable(abort, body, client, request, socket, contentLength, header, expectsPayload) { + assert5(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); } - this[kParser].destroy(); - this[kParser] = null; } - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (client.destroyed) { - assert3(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); + const waitForDrain = () => new Promise((resolve, reject) => { + assert5(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); + }); + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); + } + } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); } - client[kPendingIdx] = client[kRunningIdx]; - assert3(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); } - async function connect(client) { - assert3(!client[kConnecting]); - assert3(!client[kSocket]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert3(idx !== -1); - const ip = hostname.substring(1, idx); - assert3(net.isIP(ip)); - hostname = ip; - } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); + var AsyncWriter = class { + constructor({ abort, socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + this.abort = abort; + socket[kWriting] = true; } - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket2) => { - if (err) { - reject(err); - } else { - resolve(socket2); - } - }); - }); - if (client.destroyed) { - util.destroy(socket.on("error", () => { - }), new ClientDestroyedError()); - return; + write(chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; } - client[kConnecting] = false; - assert3(socket); - const isH2 = socket.alpnProtocol === "h2"; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" - }); - } - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - client[kHTTPConnVersion] = "h2"; - session[kClient] = client; - session[kSocket] = socket; - session.on("error", onHttp2SessionError); - session.on("frameError", onHttp2FrameError); - session.on("end", onHttp2SessionEnd); - session.on("goaway", onHTTP2GoAway); - session.on("close", onSocketClose); - session.unref(); - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); + if (socket.destroyed) { + return false; } - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket[kClient] = client; - socket[kError] = null; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); + const len = Buffer.byteLength(chunk); + if (!len) { + return true; } - client.emit("connect", client[kUrl], [client]); - } catch (err) { - if (client.destroyed) { - return; + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - version: client[kHTTPConnVersion], - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload && request.reset !== false) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert3(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } } - } else { - onError(client, err); } - client.emit("connectionError", client[kUrl], [client], err); - } - resume(client); - } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); - } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; - } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; + return ret; } - } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert3(client[kPending] === 0); - return; + end() { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; + if (socket.destroyed) { return; } - const socket = client[kSocket]; - if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request2 = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + socket.write(`${header}\r +`, "latin1"); } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); } else { - emitDrain(client); + process.emitWarning(new RequestContentLengthMismatchError()); } - continue; - } - if (client[kPending] === 0) { - return; } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return; - } - const request = client[kQueue][client[kPendingIdx]]; - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError("servername changed")); - return; + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); } } - if (client[kConnecting]) { - return; - } - if (!socket && !client[kHTTP2Session]) { - connect(client); - return; - } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; - } - if (client[kRunning] > 0 && !request.idempotent) { - return; - } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return; - } - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - return; - } - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); + client[kResume](); + } + destroy(err) { + const { socket, client, abort } = this; + socket[kWriting] = false; + if (err) { + assert5(client[kRunning] <= 1, "pipeline should only contain this request"); + abort(err); } } + }; + module2.exports = connectH1; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js +var require_client_h2 = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) { + "use strict"; + var assert5 = require("node:assert"); + var { pipeline } = require("node:stream"); + var util = require_util(); + var { + RequestContentLengthMismatchError, + RequestAbortedError, + SocketError, + InformationalError + } = require_errors(); + var { + kUrl, + kReset, + kClient, + kRunning, + kPending, + kQueue, + kPendingIdx, + kRunningIdx, + kError, + kSocket, + kStrictContentLength, + kOnError, + kMaxConcurrentStreams, + kHTTP2Session, + kResume, + kSize, + kHTTPContext + } = require_symbols(); + var kOpenStreams = Symbol("open streams"); + var extractBody; + var h2ExperimentalWarned = false; + var http2; + try { + http2 = require("node:http2"); + } catch { + http2 = { constants: {} }; } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function write(client, request) { - if (client[kHTTPConnVersion] === "h2") { - writeH2(client, client[kHTTP2Session], request); - return; - } - const { body, method, path: path10, host, upgrade, headers, blocking, reset } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - const bodyLength = util.bodyLength(body); - let contentLength = bodyLength; - if (contentLength === null) { - contentLength = request.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; + var { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; + } = http2; + function parseH2Headers(headers) { + const result = []; + for (const [name2, value] of Object.entries(headers)) { + if (Array.isArray(value)) { + for (const subvalue of value) { + result.push(Buffer.from(name2), Buffer.from(subvalue)); + } + } else { + result.push(Buffer.from(name2), Buffer.from(value)); } - process.emitWarning(new RequestContentLengthMismatchError()); } - const socket = client[kSocket]; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError()); - util.destroy(socket, new InformationalError("aborted")); + return result; + } + async function connectH2(client, socket) { + client[kSocket] = socket; + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning("H2 support is experimental, expect them to change at any time.", { + code: "UNDICI-H2" }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path10} HTTP/1.1\r -`; - if (typeof host === "string") { - header += `host: ${host}\r -`; - } else { - header += client[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r -upgrade: ${upgrade}\r -`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers) { - header += headers; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); } - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - assert3(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r -`, "latin1"); + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + }); + session[kOpenStreams] = 0; + session[kClient] = client; + session[kSocket] = socket; + util.addListener(session, "error", onHttp2SessionError); + util.addListener(session, "frameError", onHttp2FrameError); + util.addListener(session, "end", onHttp2SessionEnd); + util.addListener(session, "goaway", onHTTP2GoAway); + util.addListener(session, "close", function() { + const { [kClient]: client2 } = this; + const { [kSocket]: socket2 } = client2; + const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket2)); + client2[kHTTP2Session] = null; + if (client2.destroyed) { + assert5(client2[kPending] === 0); + const requests = client2[kQueue].splice(client2[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client2, request, err); + } } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert3(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; + }); + session.unref(); + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + util.addListener(socket, "error", function(err) { + assert5(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kError] = err; + this[kClient][kOnError](err); + }); + util.addListener(socket, "end", function() { + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + }); + util.addListener(socket, "close", function() { + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client[kSocket] = null; + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); + client[kPendingIdx] = client[kRunningIdx]; + assert5(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + }); + let closed = false; + socket.on("close", () => { + closed = true; + }); + return { + version: "h2", + defaultPipelining: Infinity, + write(...args) { + return writeH2(client, ...args); + }, + resume() { + resumeH2(client); + }, + destroy(err, callback) { + if (closed) { + queueMicrotask(callback); + } else { + socket.destroy(err).on("close", callback); + } + }, + get destroyed() { + return socket.destroyed; + }, + busy() { + return false; + } + }; + } + function resumeH2(client) { + const socket = client[kSocket]; + if (socket?.destroyed === false) { + if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + socket.unref(); + client[kHTTP2Session].unref(); } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); + socket.ref(); + client[kHTTP2Session].ref(); } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert3(false); } - return true; } - function writeH2(client, session, request) { - const { body, method, path: path10, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; - let headers; - if (typeof reqHeaders === "string") - headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else - headers = reqHeaders; + function onHttp2SessionError(err) { + assert5(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } + function onHttp2FrameError(type, code2, id) { + if (id === 0) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code2}`); + this[kSocket][kError] = err; + this[kClient][kOnError](err); + } + } + function onHttp2SessionEnd() { + const err = new SocketError("other side closed", util.getSocketInfo(this[kSocket])); + this.destroy(err); + util.destroy(this[kSocket], err); + } + function onHTTP2GoAway(code2) { + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code2}`, util.getSocketInfo(this)); + const client = this[kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + if (this[kHTTP2Session] != null) { + this[kHTTP2Session].destroy(err); + this[kHTTP2Session] = null; + } + util.destroy(this[kSocket], err); + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; + } + assert5(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function writeH2(client, request) { + const session = client[kHTTP2Session]; + const { method, path: path16, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let { body } = request; if (upgrade) { - errorRequest(client, request, new Error("Upgrade not supported for H2")); + util.errorRequest(client, request, new Error("Upgrade not supported for H2")); return false; } - if (request.aborted) { - return false; + const headers = {}; + for (let n = 0; n < reqHeaders.length; n += 2) { + const key = reqHeaders[n + 0]; + const val = reqHeaders[n + 1]; + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (headers[key]) { + headers[key] += `,${val[i]}`; + } else { + headers[key] = val[i]; + } + } + } else { + headers[key] = val; + } } let stream; - const h2State = client[kHTTP2SessionState]; - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; + const { hostname, port } = client[kUrl]; + headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; headers[HTTP2_HEADER_METHOD] = method; + const abort = (err) => { + if (request.aborted || request.completed) { + return; + } + err = err || new RequestAbortedError(); + util.errorRequest(client, request, err); + if (stream != null) { + util.destroy(stream, err); + } + util.destroy(body, err); + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + }; try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - err = err || new RequestAbortedError(); - if (stream != null) { - util.destroy(stream, err); - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); - } - } - errorRequest(client, request, err); - }); + request.onConnect(abort); } catch (err) { - errorRequest(client, request, err); + util.errorRequest(client, request, err); + } + if (request.aborted) { + return false; } if (method === "CONNECT") { session.ref(); stream = session.request(headers, { endStream: false, signal }); if (stream.id && !stream.pending) { request.onUpgrade(null, null, stream); - ++h2State.openStreams; + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; } else { stream.once("ready", () => { request.onUpgrade(null, null, stream); - ++h2State.openStreams; + ++session[kOpenStreams]; + client[kQueue][client[kRunningIdx]++] = null; }); } stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) - session.unref(); + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) session.unref(); }); return true; } - headers[HTTP2_HEADER_PATH] = path10; + headers[HTTP2_HEADER_PATH] = path16; headers[HTTP2_HEADER_SCHEME] = "https"; const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; if (body && typeof body.read === "function") { body.read(0); } let contentLength = util.bodyLength(body); + if (util.isFormDataLike(body)) { + extractBody ??= require_body().extractBody; + const [bodyStream, contentType] = extractBody(body); + headers["content-type"] = contentType; + body = bodyStream.stream; + contentLength = bodyStream.length; + } if (contentLength == null) { contentLength = request.contentLength; } @@ -12683,13 +11187,13 @@ upgrade: ${upgrade}\r } if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); + util.errorRequest(client, request, new RequestContentLengthMismatchError()); return false; } process.emitWarning(new RequestContentLengthMismatchError()); } if (contentLength != null) { - assert3(body, "no body must not have content length"); + assert5(body, "no body must not have content length"); headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; } session.ref(); @@ -12705,221 +11209,190 @@ upgrade: ${upgrade}\r }); writeBodyH2(); } - ++h2State.openStreams; + ++session[kOpenStreams]; stream.once("response", (headers2) => { const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; request.onResponseStarted(); - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { + if (request.aborted) { + const err = new RequestAbortedError(); + util.errorRequest(client, request, err); + util.destroy(stream, err); + return; + } + if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { stream.pause(); } + stream.on("data", (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); + } + }); }); stream.once("end", () => { - request.onComplete([]); - }); - stream.on("data", (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); + if (stream.state?.state == null || stream.state.state < 6) { + request.onComplete([]); + } + if (session[kOpenStreams] === 0) { + session.unref(); } + abort(new InformationalError("HTTP/2: stream half-closed (remote)")); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); }); stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { session.unref(); } }); stream.once("error", function(err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } + abort(err); }); - stream.once("frameError", (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } + stream.once("frameError", (type, code2) => { + abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code2}`)); }); return true; function writeBodyH2() { - if (!body) { - request.onRequestSent(); + if (!body || contentLength === 0) { + writeBuffer( + abort, + stream, + null, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } else if (util.isBuffer(body)) { - assert3(contentLength === body.byteLength, "buffer body must have content length"); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); + writeBuffer( + abort, + stream, + body, + client, + request, + client[kSocket], + contentLength, + expectsPayload + ); } else if (util.isBlobLike(body)) { if (typeof body.stream === "function") { - writeIterable({ + writeIterable( + abort, + stream, + body.stream(), client, request, + client[kSocket], contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: "" - }); + expectsPayload + ); } else { - writeBlob({ + writeBlob( + abort, + stream, body, client, request, + client[kSocket], contentLength, - expectsPayload, - h2stream: stream, - header: "", - socket: client[kSocket] - }); + expectsPayload + ); } } else if (util.isStream(body)) { - writeStream({ + writeStream( + abort, + client[kSocket], + expectsPayload, + stream, body, client, request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: "" - }); + contentLength + ); } else if (util.isIterable(body)) { - writeIterable({ + writeIterable( + abort, + stream, body, client, request, + client[kSocket], contentLength, - expectsPayload, - header: "", - h2stream: stream, - socket: client[kSocket] - }); + expectsPayload + ); } else { - assert3(false); + assert5(false); } } } - function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - if (client[kHTTPConnVersion] === "h2") { - let onPipeData = function(chunk) { - request.onBodySent(chunk); - }; - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); - } else { - request.onRequestSent(); - } - } - ); - pipe.on("data", onPipeData); - pipe.once("end", () => { - pipe.removeListener("data", onPipeData); - util.destroy(pipe); - }); - return; - } - let finished = false; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onClose = function() { - queueMicrotask(() => { - body.removeListener("error", onFinished); - }); - if (!finished) { - const err = new RequestAbortedError(); - queueMicrotask(() => onFinished(err)); + function writeBuffer(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + try { + if (body != null && util.isBuffer(body)) { + assert5(contentLength === body.byteLength, "buffer body must have content length"); + h2stream.cork(); + h2stream.write(body); + h2stream.uncork(); + h2stream.end(); + request.onBodySent(body); } - }; - const onFinished = function(err) { - if (finished) { - return; + if (!expectsPayload) { + socket[kReset] = true; } - finished = true; - assert3(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("close", onClose); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; + request.onRequestSent(); + client[kResume](); + } catch (error) { + abort(error); + } + } + function writeStream(abort, socket, expectsPayload, h2stream, body, client, request, contentLength) { + assert5(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(pipe, err); + abort(err); + } else { + util.removeAllListeners(pipe); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); } } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util.destroy(body, err); - } else { - util.destroy(body); - } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onClose); - if (body.resume) { - body.resume(); + ); + util.addListener(pipe, "data", onPipeData); + function onPipeData(chunk) { + request.onBodySent(chunk); } - socket.on("drain", onDrain).on("error", onFinished); } - async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength === body.size, "blob body must have content length"); - const isH2 = client[kHTTPConnVersion] === "h2"; + async function writeBlob(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert5(contentLength === body.size, "blob body must have content length"); try { if (contentLength != null && contentLength !== body.size) { throw new RequestContentLengthMismatchError(); } const buffer = Buffer.from(await body.arrayBuffer()); - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(buffer); - socket.uncork(); - } + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + h2stream.end(); request.onBodySent(buffer); request.onRequestSent(); if (!expectsPayload) { socket[kReset] = true; } - resume(client); + client[kResume](); } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); + abort(err); } } - async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert3(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + async function writeIterable(abort, h2stream, body, client, request, socket, contentLength, expectsPayload) { + assert5(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); let callback = null; function onDrain() { if (callback) { @@ -12929,1320 +11402,1211 @@ upgrade: ${upgrade}\r } } const waitForDrain = () => new Promise((resolve, reject) => { - assert3(callback === null); + assert5(callback === null); if (socket[kError]) { reject(socket[kError]); } else { callback = resolve; } }); - if (client[kHTTPConnVersion] === "h2") { - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream.off("close", onDrain).off("drain", onDrain); - } - return; - } - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + h2stream.on("close", onDrain).on("drain", onDrain); try { for await (const chunk of body) { if (socket[kError]) { throw socket[kError]; } - if (!writer.write(chunk)) { + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { await waitForDrain(); } } - writer.end(); + h2stream.end(); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + client[kResume](); } catch (err) { - writer.destroy(err); + abort(err); } finally { - socket.off("close", onDrain).off("drain", onDrain); + h2stream.off("close", onDrain).off("drain", onDrain); } } - var AsyncWriter = class { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; + module2.exports = connectH2; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js +var require_redirect_handler = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) { + "use strict"; + var util = require_util(); + var { kBodyUsed } = require_symbols(); + var assert5 = require("node:assert"); + var { InvalidArgumentError } = require_errors(); + var EE3 = require("node:events"); + var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + var kBody = Symbol("body"); + var BodyAsyncIterable = class { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; } - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; - } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; - } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } - process.emitWarning(new RequestContentLengthMismatchError()); + async *[Symbol.asyncIterator]() { + assert5(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + }; + var RedirectHandler = class { + constructor(dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; + util.validateHandler(handler, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + this.redirectionLimitReached = false; + if (util.isStream(this.opts.body)) { + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert5(false); + }); } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r -`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE3.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); } + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); } - if (contentLength === null) { - socket.write(`\r -${len.toString(16)}\r -`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } + } + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + onUpgrade(statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } + onError(error) { + this.handler.onError(error); + } + onHeaders(statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); + if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { + if (this.request) { + this.request.abort(new Error("max redirects")); } + this.redirectionLimitReached = true; + this.abort(new Error("max redirects")); + return; } - return ret; - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); } - if (socket.destroyed) { - return; + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText); } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - socket.write(`${header}\r -`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path16 = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path16; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } + } + onData(chunk) { + if (this.location) { + } else { + return this.handler.onData(chunk); } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } + } + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); } - resume(client); } - destroy(err) { - const { socket, client } = this; - socket[kWriting] = false; - if (err) { - assert3(client[kRunning] <= 1, "pipeline should only contain this request"); - util.destroy(socket, err); + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); } } }; - function errorRequest(client, request, err) { - try { - request.onError(err); - assert3(request.aborted); - } catch (err2) { - client.emit("error", err2); + function parseLocation(statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") { + return headers[i + 1]; + } } } - module2.exports = Client; + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === "host"; + } + if (removeContent && util.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name2 = util.headerNameToString(header); + return name2 === "authorization" || name2 === "cookie" || name2 === "proxy-authorization"; + } + return false; + } + function cleanRequestHeaders(headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } + } + } else if (headers && typeof headers === "object") { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } + } + } else { + assert5(headers == null, "headers must be an object or an array"); + } + return ret; + } + module2.exports = RedirectHandler; } }); -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js -var require_pool = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/pool.js"(exports, module2) { +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js +var require_redirect_interceptor = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, module2) { "use strict"; + var RedirectHandler = require_redirect_handler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler); + } + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler); + }; + }; + } + module2.exports = createRedirectInterceptor; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js +var require_client = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js"(exports2, module2) { + "use strict"; + var assert5 = require("node:assert"); + var net = require("node:net"); + var http = require("node:http"); + var util = require_util(); + var { channels } = require_diagnostics(); + var Request = require_request(); + var DispatcherBase = require_dispatcher_base(); var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = require_pool_base(); - var Client = require_client(); - var { - InvalidArgumentError + InvalidArgumentError, + InformationalError, + ClientDestroyedError } = require_errors(); - var util = require_util(); - var { kUrl, kInterceptors } = require_symbols(); var buildConnector = require_connect(); - var kOptions = Symbol("options"); - var kConnections = Symbol("connections"); - var kFactory = Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); + var { + kUrl, + kServerName, + kClient, + kBusy, + kConnect, + kResuming, + kRunning, + kPending, + kSize, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kOnError, + kHTTPContext, + kMaxConcurrentStreams, + kResume + } = require_symbols(); + var connectH1 = require_client_h1(); + var connectH2 = require_client_h2(); + var deprecatedInterceptorWarned = false; + var kClosedResolve = Symbol("kClosedResolve"); + var noop3 = () => { + }; + function getPipelining(client) { + return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; } - var Pool = class extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, + var Client = class extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../../types/client.js').Client.Options} options + */ + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, tls, + strictContentLength, maxCachedSessions, - socketPath, + maxRedirections, + connect: connect2, + maxRequestsPerClient, + localAddress, + maxResponseSize, autoSelectFamily, autoSelectFamilyAttemptTimeout, - allowH2, - ...options + // h2 + maxConcurrentStreams, + allowH2 } = {}) { super(); - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + } + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect - }); + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); } - this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; - this[kFactory] = factory; - } - [kGetDispatcher]() { - for (const client of this[kClients]) { - if (!client[kNeedDrain]) { - return client; - } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - const dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - return dispatcher; + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); } - } - }; - module2.exports = Pool; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js -var require_agent = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/agent.js"(exports, module2) { - "use strict"; - var { InvalidArgumentError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); - var DispatcherBase = require_dispatcher_base(); - var Pool = require_pool(); - var Client = require_client(); - var util = require_util(); - var createRedirectInterceptor = require_redirectInterceptor(); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); - var kOnDrain = Symbol("onDrain"); - var kFactory = Symbol("factory"); - var kOptions = Symbol("options"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - var Agent = class extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); } - if (connect && typeof connect !== "function") { - connect = { ...connect }; + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); } - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; - this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = /* @__PURE__ */ new Map(); - this[kOnDrain] = (origin, targets) => { - this.emit("drain", origin, [this, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - this.emit("connect", origin, [this, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - this.emit("disconnect", origin, [this, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - this.emit("connectionError", origin, [this, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const client of this[kClients].values()) { - ret += client[kRunning]; + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - return ret; - } - [kDispatch](opts, handler) { - let key; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); } - let dispatcher = this[kClients].get(key); - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].set(key, dispatcher); + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); } - return dispatcher.dispatch(opts, handler); - } - async [kClose]() { - const closePromises = []; - for (const client of this[kClients].values()) { - closePromises.push(client.close()); + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); } - this[kClients].clear(); - await Promise.all(closePromises); - } - async [kDestroy](err) { - const destroyPromises = []; - for (const client of this[kClients].values()) { - destroyPromises.push(client.destroy(err)); + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); } - this[kClients].clear(); - await Promise.all(destroyPromises); - } - }; - module2.exports = Agent; - } -}); - -// .yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js -var require_proxy_agent = __commonJS({ - ".yarn/cache/undici-npm-6.6.2-a0bd6785a6-c8c8a43605.zip/node_modules/undici/lib/proxy-agent.js"(exports, module2) { - "use strict"; - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); - var { URL: URL2 } = require("node:url"); - var Agent = require_agent(); - var Pool = require_pool(); - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var buildConnector = require_connect(); - var kAgent = Symbol("proxy agent"); - var kClient = Symbol("proxy client"); - var kProxyHeaders = Symbol("proxy headers"); - var kRequestTls = Symbol("request tls settings"); - var kProxyTls = Symbol("proxy tls settings"); - var kConnectEndpoint = Symbol("connect endpoint function"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - var ProxyAgent = class extends DispatcherBase { - constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - const resolvedUrl = new URL2(opts.uri); - const { origin, port, username, password } = resolvedUrl; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } else if (username && password) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); } - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts2, callback) => { - let requestedHost = opts2.host; - if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host: requestedHost - } - }); - if (statusCode !== 200) { - socket.on("error", () => { - }).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } + if (interceptors?.Client && Array.isArray(interceptors.Client)) { + this[kInterceptors] = interceptors.Client; + if (!deprecatedInterceptorWarned) { + deprecatedInterceptorWarned = true; + process.emitWarning("Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.", { + code: "UNDICI-CLIENT-INTERCEPTOR-DEPRECATED" + }); } - }); + } else { + this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; + } + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect2; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; + this[kHTTPContext] = null; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + this[kResume] = (sync) => resume(this, sync); + this[kOnError] = (err) => onError(this, err); } - dispatch(opts, handler) { - const { host } = new URL2(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers, - host - } - }, - handler - ); + get pipelining() { + return this[kPipelining]; } - async [kClose]() { - await this[kAgent].close(); - await this[kClient].close(); + set pipelining(value) { + this[kPipelining] = value; + this[kResume](true); } - async [kDestroy]() { - await this[kAgent].destroy(); - await this[kClient].destroy(); + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; } - }; - function buildHeaders(headers) { - if (Array.isArray(headers)) { - const headersPair = {}; - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } - return headersPair; + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; } - return headers; - } - function throwIfProxyAuthIsSent(headers) { - const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; } - } - module2.exports = ProxyAgent; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js -var require_high_level_opt = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/high-level-opt.js"(exports, module2) { - "use strict"; - var argmap = /* @__PURE__ */ new Map([ - ["C", "cwd"], - ["f", "file"], - ["z", "gzip"], - ["P", "preservePaths"], - ["U", "unlink"], - ["strip-components", "strip"], - ["stripComponents", "strip"], - ["keep-newer", "newer"], - ["keepNewer", "newer"], - ["keep-newer-files", "newer"], - ["keepNewerFiles", "newer"], - ["k", "keep"], - ["keep-existing", "keep"], - ["keepExisting", "keep"], - ["m", "noMtime"], - ["no-mtime", "noMtime"], - ["p", "preserveOwner"], - ["L", "follow"], - ["h", "follow"] - ]); - module2.exports = (opt) => opt ? Object.keys(opt).map((k) => [ - argmap.has(k) ? argmap.get(k) : k, - opt[k] - ]).reduce((set, kv) => (set[kv[0]] = kv[1], set), /* @__PURE__ */ Object.create(null)) : {}; - } -}); - -// .yarn/cache/minipass-npm-5.0.0-c64fb63c92-a91d8043f6.zip/node_modules/minipass/index.js -var require_minipass = __commonJS({ - ".yarn/cache/minipass-npm-5.0.0-c64fb63c92-a91d8043f6.zip/node_modules/minipass/index.js"(exports) { - "use strict"; - var proc = typeof process === "object" && process ? process : { - stdout: null, - stderr: null - }; - var EE = require("events"); - var Stream = require("stream"); - var stringdecoder = require("string_decoder"); - var SD = stringdecoder.StringDecoder; - var EOF = Symbol("EOF"); - var MAYBE_EMIT_END = Symbol("maybeEmitEnd"); - var EMITTED_END = Symbol("emittedEnd"); - var EMITTING_END = Symbol("emittingEnd"); - var EMITTED_ERROR = Symbol("emittedError"); - var CLOSED = Symbol("closed"); - var READ = Symbol("read"); - var FLUSH = Symbol("flush"); - var FLUSHCHUNK = Symbol("flushChunk"); - var ENCODING = Symbol("encoding"); - var DECODER = Symbol("decoder"); - var FLOWING = Symbol("flowing"); - var PAUSED = Symbol("paused"); - var RESUME = Symbol("resume"); - var BUFFER = Symbol("buffer"); - var PIPES = Symbol("pipes"); - var BUFFERLENGTH = Symbol("bufferLength"); - var BUFFERPUSH = Symbol("bufferPush"); - var BUFFERSHIFT = Symbol("bufferShift"); - var OBJECTMODE = Symbol("objectMode"); - var DESTROYED = Symbol("destroyed"); - var ERROR = Symbol("error"); - var EMITDATA = Symbol("emitData"); - var EMITEND = Symbol("emitEnd"); - var EMITEND2 = Symbol("emitEnd2"); - var ASYNC = Symbol("async"); - var ABORT = Symbol("abort"); - var ABORTED = Symbol("aborted"); - var SIGNAL = Symbol("signal"); - var defer = (fn2) => Promise.resolve().then(fn2); - var doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== "1"; - var ASYNCITERATOR = doIter && Symbol.asyncIterator || Symbol("asyncIterator not implemented"); - var ITERATOR = doIter && Symbol.iterator || Symbol("iterator not implemented"); - var isEndish = (ev) => ev === "end" || ev === "finish" || ev === "prefinish"; - var isArrayBuffer = (b) => b instanceof ArrayBuffer || typeof b === "object" && b.constructor && b.constructor.name === "ArrayBuffer" && b.byteLength >= 0; - var isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); - var Pipe = class { - constructor(src, dest, opts) { - this.src = src; - this.dest = dest; - this.opts = opts; - this.ondrain = () => src[RESUME](); - dest.on("drain", this.ondrain); + get [kConnected]() { + return !!this[kHTTPContext] && !this[kConnecting] && !this[kHTTPContext].destroyed; } - unpipe() { - this.dest.removeListener("drain", this.ondrain); + get [kBusy]() { + return Boolean( + this[kHTTPContext]?.busy(null) || this[kSize] >= (getPipelining(this) || 1) || this[kPending] > 0 + ); } - // istanbul ignore next - only here for the prototype - proxyErrors() { + /* istanbul ignore: only used for test */ + [kConnect](cb) { + connect(this); + this.once("connect", cb); } - end() { - this.unpipe(); - if (this.opts.end) - this.dest.end(); + [kDispatch](opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler); + this[kQueue].push(request); + if (this[kResuming]) { + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + this[kResuming] = 1; + queueMicrotask(() => resume(this)); + } else { + this[kResume](true); + } + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + return this[kNeedDrain] < 2; } - }; - var PipeProxyErrors = class extends Pipe { - unpipe() { - this.src.removeListener("error", this.proxyErrors); - super.unpipe(); + async [kClose]() { + return new Promise((resolve) => { + if (this[kSize]) { + this[kClosedResolve] = resolve; + } else { + resolve(null); + } + }); } - constructor(src, dest, opts) { - super(src, dest, opts); - this.proxyErrors = (er) => dest.emit("error", er); - src.on("error", this.proxyErrors); + async [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(this, request, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(null); + }; + if (this[kHTTPContext]) { + this[kHTTPContext].destroy(err, callback); + this[kHTTPContext] = null; + } else { + queueMicrotask(callback); + } + this[kResume](); + }); } }; - var Minipass = class _Minipass extends Stream { - constructor(options) { - super(); - this[FLOWING] = false; - this[PAUSED] = false; - this[PIPES] = []; - this[BUFFER] = []; - this[OBJECTMODE] = options && options.objectMode || false; - if (this[OBJECTMODE]) - this[ENCODING] = null; - else - this[ENCODING] = options && options.encoding || null; - if (this[ENCODING] === "buffer") - this[ENCODING] = null; - this[ASYNC] = options && !!options.async || false; - this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null; - this[EOF] = false; - this[EMITTED_END] = false; - this[EMITTING_END] = false; - this[CLOSED] = false; - this[EMITTED_ERROR] = null; - this.writable = true; - this.readable = true; - this[BUFFERLENGTH] = 0; - this[DESTROYED] = false; - if (options && options.debugExposeBuffer === true) { - Object.defineProperty(this, "buffer", { get: () => this[BUFFER] }); - } - if (options && options.debugExposePipes === true) { - Object.defineProperty(this, "pipes", { get: () => this[PIPES] }); - } - this[SIGNAL] = options && options.signal; - this[ABORTED] = false; - if (this[SIGNAL]) { - this[SIGNAL].addEventListener("abort", () => this[ABORT]()); - if (this[SIGNAL].aborted) { - this[ABORT](); - } + var createRedirectInterceptor = require_redirect_interceptor(); + function onError(client, err) { + if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert5(client[kPendingIdx] === client[kRunningIdx]); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); } + assert5(client[kSize] === 0); } - get bufferLength() { - return this[BUFFERLENGTH]; + } + async function connect(client) { + assert5(!client[kConnecting]); + assert5(!client[kHTTPContext]); + let { host, hostname, protocol, port } = client[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert5(idx !== -1); + const ip = hostname.substring(1, idx); + assert5(net.isIP(ip)); + hostname = ip; } - get encoding() { - return this[ENCODING]; + client[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); } - set encoding(enc) { - if (this[OBJECTMODE]) - throw new Error("cannot set encoding in objectMode"); - if (this[ENCODING] && enc !== this[ENCODING] && (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH])) - throw new Error("cannot change encoding"); - if (this[ENCODING] !== enc) { - this[DECODER] = enc ? new SD(enc) : null; - if (this[BUFFER].length) - this[BUFFER] = this[BUFFER].map((chunk) => this[DECODER].write(chunk)); + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket2) => { + if (err) { + reject(err); + } else { + resolve(socket2); + } + }); + }); + if (client.destroyed) { + util.destroy(socket.on("error", noop3), new ClientDestroyedError()); + return; + } + assert5(socket); + try { + client[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client, socket) : await connectH1(client, socket); + } catch (err) { + socket.destroy().on("error", noop3); + throw err; + } + client[kConnecting] = false; + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket[kClient] = client; + socket[kError] = null; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); + } + client.emit("connect", client[kUrl], [client]); + } catch (err) { + if (client.destroyed) { + return; + } + client[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + version: client[kHTTPContext]?.version, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); + } + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert5(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + util.errorRequest(client, request, err); + } + } else { + onError(client, err); } - this[ENCODING] = enc; - } - setEncoding(enc) { - this.encoding = enc; - } - get objectMode() { - return this[OBJECTMODE]; - } - set objectMode(om) { - this[OBJECTMODE] = this[OBJECTMODE] || !!om; - } - get ["async"]() { - return this[ASYNC]; - } - set ["async"](a) { - this[ASYNC] = this[ASYNC] || !!a; - } - // drop everything and get out of the flow completely - [ABORT]() { - this[ABORTED] = true; - this.emit("abort", this[SIGNAL].reason); - this.destroy(this[SIGNAL].reason); + client.emit("connectionError", client[kUrl], [client], err); } - get aborted() { - return this[ABORTED]; + client[kResume](); + } + function emitDrain(client) { + client[kNeedDrain] = 0; + client.emit("drain", client[kUrl], [client]); + } + function resume(client, sync) { + if (client[kResuming] === 2) { + return; } - set aborted(_) { + client[kResuming] = 2; + _resume(client, sync); + client[kResuming] = 0; + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; } - write(chunk, encoding, cb) { - if (this[ABORTED]) - return false; - if (this[EOF]) - throw new Error("write after end"); - if (this[DESTROYED]) { - this.emit( - "error", - Object.assign( - new Error("Cannot call write after a stream was destroyed"), - { code: "ERR_STREAM_DESTROYED" } - ) - ); - return true; + } + function _resume(client, sync) { + while (true) { + if (client.destroyed) { + assert5(client[kPending] === 0); + return; } - if (typeof encoding === "function") - cb = encoding, encoding = "utf8"; - if (!encoding) - encoding = "utf8"; - const fn2 = this[ASYNC] ? defer : (f) => f(); - if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { - if (isArrayBufferView(chunk)) - chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); - else if (isArrayBuffer(chunk)) - chunk = Buffer.from(chunk); - else if (typeof chunk !== "string") - this.objectMode = true; + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return; } - if (this[OBJECTMODE]) { - if (this.flowing && this[BUFFERLENGTH] !== 0) - this[FLUSH](true); - if (this.flowing) - this.emit("data", chunk); - else - this[BUFFERPUSH](chunk); - if (this[BUFFERLENGTH] !== 0) - this.emit("readable"); - if (cb) - fn2(cb); - return this.flowing; + if (client[kHTTPContext]) { + client[kHTTPContext].resume(); } - if (!chunk.length) { - if (this[BUFFERLENGTH] !== 0) - this.emit("readable"); - if (cb) - fn2(cb); - return this.flowing; + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + queueMicrotask(() => emitDrain(client)); + } else { + emitDrain(client); + } + continue; } - if (typeof chunk === "string" && // unless it is a string already ready for us to use - !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) { - chunk = Buffer.from(chunk, encoding); + if (client[kPending] === 0) { + return; } - if (Buffer.isBuffer(chunk) && this[ENCODING]) - chunk = this[DECODER].write(chunk); - if (this.flowing && this[BUFFERLENGTH] !== 0) - this[FLUSH](true); - if (this.flowing) - this.emit("data", chunk); - else - this[BUFFERPUSH](chunk); - if (this[BUFFERLENGTH] !== 0) - this.emit("readable"); - if (cb) - fn2(cb); - return this.flowing; - } - read(n) { - if (this[DESTROYED]) - return null; - if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) { - this[MAYBE_EMIT_END](); - return null; + if (client[kRunning] >= (getPipelining(client) || 1)) { + return; } - if (this[OBJECTMODE]) - n = null; - if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { - if (this.encoding) - this[BUFFER] = [this[BUFFER].join("")]; - else - this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])]; + const request = client[kQueue][client[kPendingIdx]]; + if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return; + } + client[kServerName] = request.servername; + client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => { + client[kHTTPContext] = null; + resume(client); + }); } - const ret = this[READ](n || null, this[BUFFER][0]); - this[MAYBE_EMIT_END](); - return ret; - } - [READ](n, chunk) { - if (n === chunk.length || n === null) - this[BUFFERSHIFT](); - else { - this[BUFFER][0] = chunk.slice(n); - chunk = chunk.slice(0, n); - this[BUFFERLENGTH] -= n; + if (client[kConnecting]) { + return; } - this.emit("data", chunk); - if (!this[BUFFER].length && !this[EOF]) - this.emit("drain"); - return chunk; - } - end(chunk, encoding, cb) { - if (typeof chunk === "function") - cb = chunk, chunk = null; - if (typeof encoding === "function") - cb = encoding, encoding = "utf8"; - if (chunk) - this.write(chunk, encoding); - if (cb) - this.once("end", cb); - this[EOF] = true; - this.writable = false; - if (this.flowing || !this[PAUSED]) - this[MAYBE_EMIT_END](); - return this; - } - // don't let the internal resume be overwritten - [RESUME]() { - if (this[DESTROYED]) + if (!client[kHTTPContext]) { + connect(client); return; - this[PAUSED] = false; - this[FLOWING] = true; - this.emit("resume"); - if (this[BUFFER].length) - this[FLUSH](); - else if (this[EOF]) - this[MAYBE_EMIT_END](); - else - this.emit("drain"); - } - resume() { - return this[RESUME](); - } - pause() { - this[FLOWING] = false; - this[PAUSED] = true; - } - get destroyed() { - return this[DESTROYED]; - } - get flowing() { - return this[FLOWING]; - } - get paused() { - return this[PAUSED]; - } - [BUFFERPUSH](chunk) { - if (this[OBJECTMODE]) - this[BUFFERLENGTH] += 1; - else - this[BUFFERLENGTH] += chunk.length; - this[BUFFER].push(chunk); - } - [BUFFERSHIFT]() { - if (this[OBJECTMODE]) - this[BUFFERLENGTH] -= 1; - else - this[BUFFERLENGTH] -= this[BUFFER][0].length; - return this[BUFFER].shift(); - } - [FLUSH](noDrain) { - do { - } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length); - if (!noDrain && !this[BUFFER].length && !this[EOF]) - this.emit("drain"); - } - [FLUSHCHUNK](chunk) { - this.emit("data", chunk); - return this.flowing; - } - pipe(dest, opts) { - if (this[DESTROYED]) + } + if (client[kHTTPContext].destroyed) { return; - const ended = this[EMITTED_END]; - opts = opts || {}; - if (dest === proc.stdout || dest === proc.stderr) - opts.end = false; - else - opts.end = opts.end !== false; - opts.proxyErrors = !!opts.proxyErrors; - if (ended) { - if (opts.end) - dest.end(); + } + if (client[kHTTPContext].busy(request)) { + return; + } + if (!request.aborted && client[kHTTPContext].write(request)) { + client[kPendingIdx]++; } else { - this[PIPES].push( - !opts.proxyErrors ? new Pipe(this, dest, opts) : new PipeProxyErrors(this, dest, opts) - ); - if (this[ASYNC]) - defer(() => this[RESUME]()); - else - this[RESUME](); + client[kQueue].splice(client[kPendingIdx], 1); + } + } + } + module2.exports = Client; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js +var require_pool = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) { + "use strict"; + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = require_pool_base(); + var Client = require_client(); + var { + InvalidArgumentError + } = require_errors(); + var util = require_util(); + var { kUrl, kInterceptors } = require_symbols(); + var buildConnector = require_connect(); + var kOptions = Symbol("options"); + var kConnections = Symbol("connections"); + var kFactory = Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + var Pool = class extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); } - return dest; - } - unpipe(dest) { - const p = this[PIPES].find((p2) => p2.dest === dest); - if (p) { - this[PIPES].splice(this[PIPES].indexOf(p), 1); - p.unpipe(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - } - addListener(ev, fn2) { - return this.on(ev, fn2); - } - on(ev, fn2) { - const ret = super.on(ev, fn2); - if (ev === "data" && !this[PIPES].length && !this.flowing) - this[RESUME](); - else if (ev === "readable" && this[BUFFERLENGTH] !== 0) - super.emit("readable"); - else if (isEndish(ev) && this[EMITTED_END]) { - super.emit(ev); - this.removeAllListeners(ev); - } else if (ev === "error" && this[EMITTED_ERROR]) { - if (this[ASYNC]) - defer(() => fn2.call(this, this[EMITTED_ERROR])); - else - fn2.call(this, this[EMITTED_ERROR]); + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - return ret; - } - get emittedEnd() { - return this[EMITTED_END]; - } - [MAYBE_EMIT_END]() { - if (!this[EMITTING_END] && !this[EMITTED_END] && !this[DESTROYED] && this[BUFFER].length === 0 && this[EOF]) { - this[EMITTING_END] = true; - this.emit("end"); - this.emit("prefinish"); - this.emit("finish"); - if (this[CLOSED]) - this.emit("close"); - this[EMITTING_END] = false; + if (typeof connect !== "function") { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect + }); } + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kFactory] = factory; + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); } - emit(ev, data, ...extra) { - if (ev !== "error" && ev !== "close" && ev !== DESTROYED && this[DESTROYED]) - return; - else if (ev === "data") { - return !this[OBJECTMODE] && !data ? false : this[ASYNC] ? defer(() => this[EMITDATA](data)) : this[EMITDATA](data); - } else if (ev === "end") { - return this[EMITEND](); - } else if (ev === "close") { - this[CLOSED] = true; - if (!this[EMITTED_END] && !this[DESTROYED]) - return; - const ret2 = super.emit("close"); - this.removeAllListeners("close"); - return ret2; - } else if (ev === "error") { - this[EMITTED_ERROR] = data; - super.emit(ERROR, data); - const ret2 = !this[SIGNAL] || this.listeners("error").length ? super.emit("error", data) : false; - this[MAYBE_EMIT_END](); - return ret2; - } else if (ev === "resume") { - const ret2 = super.emit("resume"); - this[MAYBE_EMIT_END](); - return ret2; - } else if (ev === "finish" || ev === "prefinish") { - const ret2 = super.emit(ev); - this.removeAllListeners(ev); - return ret2; + [kGetDispatcher]() { + for (const client of this[kClients]) { + if (!client[kNeedDrain]) { + return client; + } } - const ret = super.emit(ev, data, ...extra); - this[MAYBE_EMIT_END](); - return ret; - } - [EMITDATA](data) { - for (const p of this[PIPES]) { - if (p.dest.write(data) === false) - this.pause(); + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + const dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + return dispatcher; } - const ret = super.emit("data", data); - this[MAYBE_EMIT_END](); - return ret; - } - [EMITEND]() { - if (this[EMITTED_END]) - return; - this[EMITTED_END] = true; - this.readable = false; - if (this[ASYNC]) - defer(() => this[EMITEND2]()); - else - this[EMITEND2](); } - [EMITEND2]() { - if (this[DECODER]) { - const data = this[DECODER].end(); - if (data) { - for (const p of this[PIPES]) { - p.dest.write(data); - } - super.emit("data", data); - } + }; + module2.exports = Pool; + } +}); + +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js +var require_agent = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) { + "use strict"; + var { InvalidArgumentError } = require_errors(); + var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); + var DispatcherBase = require_dispatcher_base(); + var Pool = require_pool(); + var Client = require_client(); + var util = require_util(); + var createRedirectInterceptor = require_redirect_interceptor(); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kMaxRedirections = Symbol("maxRedirections"); + var kOnDrain = Symbol("onDrain"); + var kFactory = Symbol("factory"); + var kOptions = Symbol("options"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + var Agent = class extends DispatcherBase { + constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); } - for (const p of this[PIPES]) { - p.end(); + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); } - const ret = super.emit("end"); - this.removeAllListeners("end"); - return ret; - } - // const all = await stream.collect() - collect() { - const buf = []; - if (!this[OBJECTMODE]) - buf.dataLength = 0; - const p = this.promise(); - this.on("data", (c) => { - buf.push(c); - if (!this[OBJECTMODE]) - buf.dataLength += c.length; - }); - return p.then(() => buf); - } - // const data = await stream.concat() - concat() { - return this[OBJECTMODE] ? Promise.reject(new Error("cannot concat in objectMode")) : this.collect().then( - (buf) => this[OBJECTMODE] ? Promise.reject(new Error("cannot concat in objectMode")) : this[ENCODING] ? buf.join("") : Buffer.concat(buf, buf.dataLength) - ); - } - // stream.promise().then(() => done, er => emitted error) - promise() { - return new Promise((resolve, reject) => { - this.on(DESTROYED, () => reject(new Error("stream destroyed"))); - this.on("error", (er) => reject(er)); - this.on("end", () => resolve()); - }); - } - // for await (let chunk of stream) - [ASYNCITERATOR]() { - let stopped = false; - const stop = () => { - this.pause(); - stopped = true; - return Promise.resolve({ done: true }); - }; - const next = () => { - if (stopped) - return stop(); - const res = this.read(); - if (res !== null) - return Promise.resolve({ done: false, value: res }); - if (this[EOF]) - return stop(); - let resolve = null; - let reject = null; - const onerr = (er) => { - this.removeListener("data", ondata); - this.removeListener("end", onend); - this.removeListener(DESTROYED, ondestroy); - stop(); - reject(er); - }; - const ondata = (value) => { - this.removeListener("error", onerr); - this.removeListener("end", onend); - this.removeListener(DESTROYED, ondestroy); - this.pause(); - resolve({ value, done: !!this[EOF] }); - }; - const onend = () => { - this.removeListener("error", onerr); - this.removeListener("data", ondata); - this.removeListener(DESTROYED, ondestroy); - stop(); - resolve({ done: true }); - }; - const ondestroy = () => onerr(new Error("stream destroyed")); - return new Promise((res2, rej) => { - reject = rej; - resolve = res2; - this.once(DESTROYED, ondestroy); - this.once("error", onerr); - this.once("end", onend); - this.once("data", ondata); - }); - }; - return { - next, - throw: stop, - return: stop, - [ASYNCITERATOR]() { - return this; - } + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (connect && typeof connect !== "function") { + connect = { ...connect }; + } + this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; + this[kOptions] = { ...util.deepClone(options), connect }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = /* @__PURE__ */ new Map(); + this[kOnDrain] = (origin, targets) => { + this.emit("drain", origin, [this, ...targets]); }; - } - // for (let chunk of stream) - [ITERATOR]() { - let stopped = false; - const stop = () => { - this.pause(); - this.removeListener(ERROR, stop); - this.removeListener(DESTROYED, stop); - this.removeListener("end", stop); - stopped = true; - return { done: true }; + this[kOnConnect] = (origin, targets) => { + this.emit("connect", origin, [this, ...targets]); }; - const next = () => { - if (stopped) - return stop(); - const value = this.read(); - return value === null ? stop() : { value }; + this[kOnDisconnect] = (origin, targets, err) => { + this.emit("disconnect", origin, [this, ...targets], err); }; - this.once("end", stop); - this.once(ERROR, stop); - this.once(DESTROYED, stop); - return { - next, - throw: stop, - return: stop, - [ITERATOR]() { - return this; - } + this[kOnConnectionError] = (origin, targets, err) => { + this.emit("connectionError", origin, [this, ...targets], err); }; } - destroy(er) { - if (this[DESTROYED]) { - if (er) - this.emit("error", er); - else - this.emit(DESTROYED); - return this; + get [kRunning]() { + let ret = 0; + for (const client of this[kClients].values()) { + ret += client[kRunning]; + } + return ret; + } + [kDispatch](opts, handler) { + let key; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + } + let dispatcher = this[kClients].get(key); + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].set(key, dispatcher); + } + return dispatcher.dispatch(opts, handler); + } + async [kClose]() { + const closePromises = []; + for (const client of this[kClients].values()) { + closePromises.push(client.close()); } - this[DESTROYED] = true; - this[BUFFER].length = 0; - this[BUFFERLENGTH] = 0; - if (typeof this.close === "function" && !this[CLOSED]) - this.close(); - if (er) - this.emit("error", er); - else - this.emit(DESTROYED); - return this; + this[kClients].clear(); + await Promise.all(closePromises); } - static isStream(s) { - return !!s && (s instanceof _Minipass || s instanceof Stream || s instanceof EE && // readable - (typeof s.pipe === "function" || // writable - typeof s.write === "function" && typeof s.end === "function")); + async [kDestroy](err) { + const destroyPromises = []; + for (const client of this[kClients].values()) { + destroyPromises.push(client.destroy(err)); + } + this[kClients].clear(); + await Promise.all(destroyPromises); } }; - exports.Minipass = Minipass; + module2.exports = Agent; } }); -// .yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-64fae024e1.zip/node_modules/minizlib/constants.js -var require_constants5 = __commonJS({ - ".yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-64fae024e1.zip/node_modules/minizlib/constants.js"(exports, module2) { - var realZlibConstants = require("zlib").constants || /* istanbul ignore next */ - { ZLIB_VERNUM: 4736 }; - module2.exports = Object.freeze(Object.assign(/* @__PURE__ */ Object.create(null), { - Z_NO_FLUSH: 0, - Z_PARTIAL_FLUSH: 1, - Z_SYNC_FLUSH: 2, - Z_FULL_FLUSH: 3, - Z_FINISH: 4, - Z_BLOCK: 5, - Z_OK: 0, - Z_STREAM_END: 1, - Z_NEED_DICT: 2, - Z_ERRNO: -1, - Z_STREAM_ERROR: -2, - Z_DATA_ERROR: -3, - Z_MEM_ERROR: -4, - Z_BUF_ERROR: -5, - Z_VERSION_ERROR: -6, - Z_NO_COMPRESSION: 0, - Z_BEST_SPEED: 1, - Z_BEST_COMPRESSION: 9, - Z_DEFAULT_COMPRESSION: -1, - Z_FILTERED: 1, - Z_HUFFMAN_ONLY: 2, - Z_RLE: 3, - Z_FIXED: 4, - Z_DEFAULT_STRATEGY: 0, - DEFLATE: 1, - INFLATE: 2, - GZIP: 3, - GUNZIP: 4, - DEFLATERAW: 5, - INFLATERAW: 6, - UNZIP: 7, - BROTLI_DECODE: 8, - BROTLI_ENCODE: 9, - Z_MIN_WINDOWBITS: 8, - Z_MAX_WINDOWBITS: 15, - Z_DEFAULT_WINDOWBITS: 15, - Z_MIN_CHUNK: 64, - Z_MAX_CHUNK: Infinity, - Z_DEFAULT_CHUNK: 16384, - Z_MIN_MEMLEVEL: 1, - Z_MAX_MEMLEVEL: 9, - Z_DEFAULT_MEMLEVEL: 8, - Z_MIN_LEVEL: -1, - Z_MAX_LEVEL: 9, - Z_DEFAULT_LEVEL: -1, - BROTLI_OPERATION_PROCESS: 0, - BROTLI_OPERATION_FLUSH: 1, - BROTLI_OPERATION_FINISH: 2, - BROTLI_OPERATION_EMIT_METADATA: 3, - BROTLI_MODE_GENERIC: 0, - BROTLI_MODE_TEXT: 1, - BROTLI_MODE_FONT: 2, - BROTLI_DEFAULT_MODE: 0, - BROTLI_MIN_QUALITY: 0, - BROTLI_MAX_QUALITY: 11, - BROTLI_DEFAULT_QUALITY: 11, - BROTLI_MIN_WINDOW_BITS: 10, - BROTLI_MAX_WINDOW_BITS: 24, - BROTLI_LARGE_MAX_WINDOW_BITS: 30, - BROTLI_DEFAULT_WINDOW: 22, - BROTLI_MIN_INPUT_BLOCK_BITS: 16, - BROTLI_MAX_INPUT_BLOCK_BITS: 24, - BROTLI_PARAM_MODE: 0, - BROTLI_PARAM_QUALITY: 1, - BROTLI_PARAM_LGWIN: 2, - BROTLI_PARAM_LGBLOCK: 3, - BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4, - BROTLI_PARAM_SIZE_HINT: 5, - BROTLI_PARAM_LARGE_WINDOW: 6, - BROTLI_PARAM_NPOSTFIX: 7, - BROTLI_PARAM_NDIRECT: 8, - BROTLI_DECODER_RESULT_ERROR: 0, - BROTLI_DECODER_RESULT_SUCCESS: 1, - BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2, - BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3, - BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0, - BROTLI_DECODER_PARAM_LARGE_WINDOW: 1, - BROTLI_DECODER_NO_ERROR: 0, - BROTLI_DECODER_SUCCESS: 1, - BROTLI_DECODER_NEEDS_MORE_INPUT: 2, - BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3, - BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1, - BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2, - BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3, - BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4, - BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5, - BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6, - BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7, - BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8, - BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9, - BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10, - BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11, - BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12, - BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13, - BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14, - BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15, - BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16, - BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19, - BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20, - BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21, - BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22, - BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25, - BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26, - BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27, - BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30, - BROTLI_DECODER_ERROR_UNREACHABLE: -31 - }, realZlibConstants)); +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js +var require_proxy_agent = __commonJS({ + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) { + "use strict"; + var { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); + var { URL: URL2 } = require("node:url"); + var Agent = require_agent(); + var Pool = require_pool(); + var DispatcherBase = require_dispatcher_base(); + var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); + var buildConnector = require_connect(); + var Client = require_client(); + var kAgent = Symbol("proxy agent"); + var kClient = Symbol("proxy client"); + var kProxyHeaders = Symbol("proxy headers"); + var kRequestTls = Symbol("request tls settings"); + var kProxyTls = Symbol("proxy tls settings"); + var kConnectEndpoint = Symbol("connect endpoint function"); + var kTunnelProxy = Symbol("tunnel proxy"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + var noop3 = () => { + }; + function defaultAgentFactory(origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts); + } + return new Pool(origin, opts); + } + var Http1ProxyWrapper = class extends DispatcherBase { + #client; + constructor(proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); + } + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } + [kDispatch](opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function(statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === "function") { + handler.onError(new InvalidArgumentError("Proxy Authentication Required (407)")); + } + return; + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); + }; + const { + origin, + path: path16 = "/", + headers = {} + } = opts; + opts.path = origin + path16; + if (!("host" in headers) && !("Host" in headers)) { + const { host } = new URL2(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; + return this.#client[kDispatch](opts, handler); + } + async [kClose]() { + return this.#client.close(); + } + async [kDestroy](err) { + return this.#client.destroy(err); + } + }; + var ProxyAgent2 = class extends DispatcherBase { + constructor(opts) { + super(); + if (!opts || typeof opts === "object" && !(opts instanceof URL2) && !opts.uri) { + throw new InvalidArgumentError("Proxy uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + const { proxyTunnel = true } = opts; + const url = this.#getUrl(opts); + const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; + this[kProxy] = { uri: href, protocol }; + this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } else if (username && password) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + } + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin2, options) => { + const { protocol: protocol2 } = new URL2(origin2); + if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }); + } + return agentFactory(origin2, options); + }; + this[kClient] = clientFactory(url, { connect }); + this[kAgent] = new Agent({ + ...opts, + factory, + connect: async (opts2, callback) => { + let requestedPath = opts2.host; + if (!opts2.port) { + requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedPath, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host: opts2.host + }, + servername: this[kProxyTls]?.servername || proxyHostname + }); + if (statusCode !== 200) { + socket.on("error", noop3).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + callback(new SecureProxyConnectionError(err)); + } else { + callback(err); + } + } + } + }); + } + dispatch(opts, handler) { + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + if (headers && !("host" in headers) && !("Host" in headers)) { + const { host } = new URL2(opts.origin); + headers.host = host; + } + return this[kAgent].dispatch( + { + ...opts, + headers + }, + handler + ); + } + /** + * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts + * @returns {URL} + */ + #getUrl(opts) { + if (typeof opts === "string") { + return new URL2(opts); + } else if (opts instanceof URL2) { + return opts; + } else { + return new URL2(opts.uri); + } + } + async [kClose]() { + await this[kAgent].close(); + await this[kClient].close(); + } + async [kDestroy]() { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + }; + function buildHeaders(headers) { + if (Array.isArray(headers)) { + const headersPair = {}; + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; + } + return headersPair; + } + return headers; + } + function throwIfProxyAuthIsSent(headers) { + const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + } + } + module2.exports = ProxyAgent2; } }); -// .yarn/cache/minipass-npm-3.3.6-b8d93a945b-a114746943.zip/node_modules/minipass/index.js -var require_minipass2 = __commonJS({ - ".yarn/cache/minipass-npm-3.3.6-b8d93a945b-a114746943.zip/node_modules/minipass/index.js"(exports, module2) { - "use strict"; - var proc = typeof process === "object" && process ? process : { +// .yarn/cache/minipass-npm-7.1.2-3a5327d36d-b0fd20bb9f.zip/node_modules/minipass/dist/esm/index.js +var import_node_events, import_node_stream, import_node_string_decoder, proc, isStream, isReadable, isWritable, EOF, MAYBE_EMIT_END, EMITTED_END, EMITTING_END, EMITTED_ERROR, CLOSED, READ, FLUSH, FLUSHCHUNK, ENCODING, DECODER, FLOWING, PAUSED, RESUME, BUFFER, PIPES, BUFFERLENGTH, BUFFERPUSH, BUFFERSHIFT, OBJECTMODE, DESTROYED, ERROR, EMITDATA, EMITEND, EMITEND2, ASYNC, ABORT, ABORTED, SIGNAL, DATALISTENERS, DISCARDED, defer, nodefer, isEndish, isArrayBufferLike, isArrayBufferView, Pipe, PipeProxyErrors, isObjectModeOptions, isEncodingOptions, Minipass; +var init_esm = __esm({ + ".yarn/cache/minipass-npm-7.1.2-3a5327d36d-b0fd20bb9f.zip/node_modules/minipass/dist/esm/index.js"() { + import_node_events = require("node:events"); + import_node_stream = __toESM(require("node:stream"), 1); + import_node_string_decoder = require("node:string_decoder"); + proc = typeof process === "object" && process ? process : { stdout: null, stderr: null }; - var EE = require("events"); - var Stream = require("stream"); - var SD = require("string_decoder").StringDecoder; - var EOF = Symbol("EOF"); - var MAYBE_EMIT_END = Symbol("maybeEmitEnd"); - var EMITTED_END = Symbol("emittedEnd"); - var EMITTING_END = Symbol("emittingEnd"); - var EMITTED_ERROR = Symbol("emittedError"); - var CLOSED = Symbol("closed"); - var READ = Symbol("read"); - var FLUSH = Symbol("flush"); - var FLUSHCHUNK = Symbol("flushChunk"); - var ENCODING = Symbol("encoding"); - var DECODER = Symbol("decoder"); - var FLOWING = Symbol("flowing"); - var PAUSED = Symbol("paused"); - var RESUME = Symbol("resume"); - var BUFFERLENGTH = Symbol("bufferLength"); - var BUFFERPUSH = Symbol("bufferPush"); - var BUFFERSHIFT = Symbol("bufferShift"); - var OBJECTMODE = Symbol("objectMode"); - var DESTROYED = Symbol("destroyed"); - var EMITDATA = Symbol("emitData"); - var EMITEND = Symbol("emitEnd"); - var EMITEND2 = Symbol("emitEnd2"); - var ASYNC = Symbol("async"); - var defer = (fn2) => Promise.resolve().then(fn2); - var doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== "1"; - var ASYNCITERATOR = doIter && Symbol.asyncIterator || Symbol("asyncIterator not implemented"); - var ITERATOR = doIter && Symbol.iterator || Symbol("iterator not implemented"); - var isEndish = (ev) => ev === "end" || ev === "finish" || ev === "prefinish"; - var isArrayBuffer = (b) => b instanceof ArrayBuffer || typeof b === "object" && b.constructor && b.constructor.name === "ArrayBuffer" && b.byteLength >= 0; - var isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); - var Pipe = class { + isStream = (s) => !!s && typeof s === "object" && (s instanceof Minipass || s instanceof import_node_stream.default || isReadable(s) || isWritable(s)); + isReadable = (s) => !!s && typeof s === "object" && s instanceof import_node_events.EventEmitter && typeof s.pipe === "function" && // node core Writable streams have a pipe() method, but it throws + s.pipe !== import_node_stream.default.Writable.prototype.pipe; + isWritable = (s) => !!s && typeof s === "object" && s instanceof import_node_events.EventEmitter && typeof s.write === "function" && typeof s.end === "function"; + EOF = Symbol("EOF"); + MAYBE_EMIT_END = Symbol("maybeEmitEnd"); + EMITTED_END = Symbol("emittedEnd"); + EMITTING_END = Symbol("emittingEnd"); + EMITTED_ERROR = Symbol("emittedError"); + CLOSED = Symbol("closed"); + READ = Symbol("read"); + FLUSH = Symbol("flush"); + FLUSHCHUNK = Symbol("flushChunk"); + ENCODING = Symbol("encoding"); + DECODER = Symbol("decoder"); + FLOWING = Symbol("flowing"); + PAUSED = Symbol("paused"); + RESUME = Symbol("resume"); + BUFFER = Symbol("buffer"); + PIPES = Symbol("pipes"); + BUFFERLENGTH = Symbol("bufferLength"); + BUFFERPUSH = Symbol("bufferPush"); + BUFFERSHIFT = Symbol("bufferShift"); + OBJECTMODE = Symbol("objectMode"); + DESTROYED = Symbol("destroyed"); + ERROR = Symbol("error"); + EMITDATA = Symbol("emitData"); + EMITEND = Symbol("emitEnd"); + EMITEND2 = Symbol("emitEnd2"); + ASYNC = Symbol("async"); + ABORT = Symbol("abort"); + ABORTED = Symbol("aborted"); + SIGNAL = Symbol("signal"); + DATALISTENERS = Symbol("dataListeners"); + DISCARDED = Symbol("discarded"); + defer = (fn2) => Promise.resolve().then(fn2); + nodefer = (fn2) => fn2(); + isEndish = (ev) => ev === "end" || ev === "finish" || ev === "prefinish"; + isArrayBufferLike = (b) => b instanceof ArrayBuffer || !!b && typeof b === "object" && b.constructor && b.constructor.name === "ArrayBuffer" && b.byteLength >= 0; + isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); + Pipe = class { + src; + dest; + opts; + ondrain; constructor(src, dest, opts) { this.src = src; this.dest = dest; this.opts = opts; this.ondrain = () => src[RESUME](); - dest.on("drain", this.ondrain); + this.dest.on("drain", this.ondrain); } unpipe() { this.dest.removeListener("drain", this.ondrain); } - // istanbul ignore next - only here for the prototype - proxyErrors() { + // only here for the prototype + /* c8 ignore start */ + proxyErrors(_er) { } + /* c8 ignore stop */ end() { this.unpipe(); if (this.opts.end) this.dest.end(); } }; - var PipeProxyErrors = class extends Pipe { + PipeProxyErrors = class extends Pipe { unpipe() { this.src.removeListener("error", this.proxyErrors); super.unpipe(); @@ -14253,92 +12617,181 @@ var require_minipass2 = __commonJS({ src.on("error", this.proxyErrors); } }; - module2.exports = class Minipass extends Stream { - constructor(options) { + isObjectModeOptions = (o) => !!o.objectMode; + isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== "buffer"; + Minipass = class extends import_node_events.EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + /** + * true if the stream can be written + */ + writable = true; + /** + * true if the stream can be read + */ + readable = true; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args) { + const options = args[0] || {}; super(); - this[FLOWING] = false; - this[PAUSED] = false; - this.pipes = []; - this.buffer = []; - this[OBJECTMODE] = options && options.objectMode || false; - if (this[OBJECTMODE]) + if (options.objectMode && typeof options.encoding === "string") { + throw new TypeError("Encoding and objectMode may not be used together"); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; this[ENCODING] = null; - else - this[ENCODING] = options && options.encoding || null; - if (this[ENCODING] === "buffer") + } else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } else { + this[OBJECTMODE] = false; this[ENCODING] = null; - this[ASYNC] = options && !!options.async || false; - this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null; - this[EOF] = false; - this[EMITTED_END] = false; - this[EMITTING_END] = false; - this[CLOSED] = false; - this[EMITTED_ERROR] = null; - this.writable = true; - this.readable = true; - this[BUFFERLENGTH] = 0; - this[DESTROYED] = false; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] ? new import_node_string_decoder.StringDecoder(this[ENCODING]) : null; + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, "buffer", { get: () => this[BUFFER] }); + } + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, "pipes", { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } else { + signal.addEventListener("abort", () => this[ABORT]()); + } + } } + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ get bufferLength() { return this[BUFFERLENGTH]; } + /** + * The `BufferEncoding` currently in use, or `null` + */ get encoding() { return this[ENCODING]; } - set encoding(enc) { - if (this[OBJECTMODE]) - throw new Error("cannot set encoding in objectMode"); - if (this[ENCODING] && enc !== this[ENCODING] && (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH])) - throw new Error("cannot change encoding"); - if (this[ENCODING] !== enc) { - this[DECODER] = enc ? new SD(enc) : null; - if (this.buffer.length) - this.buffer = this.buffer.map((chunk) => this[DECODER].write(chunk)); - } - this[ENCODING] = enc; + /** + * @deprecated - This is a read only property + */ + set encoding(_enc) { + throw new Error("Encoding must be set at instantiation time"); } - setEncoding(enc) { - this.encoding = enc; + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc) { + throw new Error("Encoding must be set at instantiation time"); } + /** + * True if this is an objectMode stream + */ get objectMode() { return this[OBJECTMODE]; } - set objectMode(om) { - this[OBJECTMODE] = this[OBJECTMODE] || !!om; + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om) { + throw new Error("objectMode must be set at instantiation time"); } + /** + * true if this is an async stream + */ get ["async"]() { return this[ASYNC]; } + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ set ["async"](a) { this[ASYNC] = this[ASYNC] || !!a; } + // drop everything and get out of the flow completely + [ABORT]() { + this[ABORTED] = true; + this.emit("abort", this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + /** + * True if the stream has been aborted. + */ + get aborted() { + return this[ABORTED]; + } + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_) { + } write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; if (this[EOF]) throw new Error("write after end"); if (this[DESTROYED]) { - this.emit("error", Object.assign( - new Error("Cannot call write after a stream was destroyed"), - { code: "ERR_STREAM_DESTROYED" } - )); + this.emit("error", Object.assign(new Error("Cannot call write after a stream was destroyed"), { code: "ERR_STREAM_DESTROYED" })); return true; } - if (typeof encoding === "function") - cb = encoding, encoding = "utf8"; + if (typeof encoding === "function") { + cb = encoding; + encoding = "utf8"; + } if (!encoding) encoding = "utf8"; - const fn2 = this[ASYNC] ? defer : (f) => f(); + const fn2 = this[ASYNC] ? defer : nodefer; if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { - if (isArrayBufferView(chunk)) + if (isArrayBufferView(chunk)) { chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); - else if (isArrayBuffer(chunk)) + } else if (isArrayBufferLike(chunk)) { chunk = Buffer.from(chunk); - else if (typeof chunk !== "string") - this.objectMode = true; + } else if (typeof chunk !== "string") { + throw new Error("Non-contiguous data written to non-objectMode stream"); + } } if (this[OBJECTMODE]) { - if (this.flowing && this[BUFFERLENGTH] !== 0) + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true); - if (this.flowing) + if (this[FLOWING]) this.emit("data", chunk); else this[BUFFERPUSH](chunk); @@ -14346,24 +12799,25 @@ var require_minipass2 = __commonJS({ this.emit("readable"); if (cb) fn2(cb); - return this.flowing; + return this[FLOWING]; } if (!chunk.length) { if (this[BUFFERLENGTH] !== 0) this.emit("readable"); if (cb) fn2(cb); - return this.flowing; + return this[FLOWING]; } if (typeof chunk === "string" && // unless it is a string already ready for us to use - !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) { + !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { chunk = Buffer.from(chunk, encoding); } - if (Buffer.isBuffer(chunk) && this[ENCODING]) + if (Buffer.isBuffer(chunk) && this[ENCODING]) { chunk = this[DECODER].write(chunk); - if (this.flowing && this[BUFFERLENGTH] !== 0) + } + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true); - if (this.flowing) + if (this[FLOWING]) this.emit("data", chunk); else this[BUFFERPUSH](chunk); @@ -14371,52 +12825,78 @@ var require_minipass2 = __commonJS({ this.emit("readable"); if (cb) fn2(cb); - return this.flowing; + return this[FLOWING]; } + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ read(n) { if (this[DESTROYED]) return null; - if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) { + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || n === 0 || n && n > this[BUFFERLENGTH]) { this[MAYBE_EMIT_END](); return null; } if (this[OBJECTMODE]) n = null; - if (this.buffer.length > 1 && !this[OBJECTMODE]) { - if (this.encoding) - this.buffer = [this.buffer.join("")]; - else - this.buffer = [Buffer.concat(this.buffer, this[BUFFERLENGTH])]; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + this[BUFFER] = [ + this[ENCODING] ? this[BUFFER].join("") : Buffer.concat(this[BUFFER], this[BUFFERLENGTH]) + ]; } - const ret = this[READ](n || null, this.buffer[0]); + const ret = this[READ](n || null, this[BUFFER][0]); this[MAYBE_EMIT_END](); return ret; } [READ](n, chunk) { - if (n === chunk.length || n === null) + if (this[OBJECTMODE]) this[BUFFERSHIFT](); else { - this.buffer[0] = chunk.slice(n); - chunk = chunk.slice(0, n); - this[BUFFERLENGTH] -= n; + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === "string") { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } } this.emit("data", chunk); - if (!this.buffer.length && !this[EOF]) + if (!this[BUFFER].length && !this[EOF]) this.emit("drain"); return chunk; } end(chunk, encoding, cb) { - if (typeof chunk === "function") - cb = chunk, chunk = null; - if (typeof encoding === "function") - cb = encoding, encoding = "utf8"; - if (chunk) + if (typeof chunk === "function") { + cb = chunk; + chunk = void 0; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = "utf8"; + } + if (chunk !== void 0) this.write(chunk, encoding); if (cb) this.once("end", cb); this[EOF] = true; this.writable = false; - if (this.flowing || !this[PAUSED]) + if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END](); return this; } @@ -14424,29 +12904,55 @@ var require_minipass2 = __commonJS({ [RESUME]() { if (this[DESTROYED]) return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } this[PAUSED] = false; this[FLOWING] = true; this.emit("resume"); - if (this.buffer.length) + if (this[BUFFER].length) this[FLUSH](); else if (this[EOF]) this[MAYBE_EMIT_END](); else this.emit("drain"); } + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ resume() { return this[RESUME](); } + /** + * Pause the stream + */ pause() { this[FLOWING] = false; this[PAUSED] = true; + this[DISCARDED] = false; } + /** + * true if the stream has been forcibly destroyed + */ get destroyed() { return this[DESTROYED]; } + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ get flowing() { return this[FLOWING]; } + /** + * true if the stream is currently in a paused state + */ get paused() { return this[PAUSED]; } @@ -14455,29 +12961,34 @@ var require_minipass2 = __commonJS({ this[BUFFERLENGTH] += 1; else this[BUFFERLENGTH] += chunk.length; - this.buffer.push(chunk); + this[BUFFER].push(chunk); } [BUFFERSHIFT]() { - if (this.buffer.length) { - if (this[OBJECTMODE]) - this[BUFFERLENGTH] -= 1; - else - this[BUFFERLENGTH] -= this.buffer[0].length; - } - return this.buffer.shift(); + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); } - [FLUSH](noDrain) { + [FLUSH](noDrain = false) { do { - } while (this[FLUSHCHUNK](this[BUFFERSHIFT]())); - if (!noDrain && !this.buffer.length && !this[EOF]) + } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit("drain"); } [FLUSHCHUNK](chunk) { - return chunk ? (this.emit("data", chunk), this.flowing) : false; + this.emit("data", chunk); + return this[FLOWING]; } + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ pipe(dest, opts) { if (this[DESTROYED]) - return; + return dest; + this[DISCARDED] = false; const ended = this[EMITTED_END]; opts = opts || {}; if (dest === proc.stdout || dest === proc.stderr) @@ -14489,7 +13000,7 @@ var require_minipass2 = __commonJS({ if (opts.end) dest.end(); } else { - this.pipes.push(!opts.proxyErrors ? new Pipe(this, dest, opts) : new PipeProxyErrors(this, dest, opts)); + this[PIPES].push(!opts.proxyErrors ? new Pipe(this, dest, opts) : new PipeProxyErrors(this, dest, opts)); if (this[ASYNC]) defer(() => this[RESUME]()); else @@ -14497,38 +13008,122 @@ var require_minipass2 = __commonJS({ } return dest; } + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ unpipe(dest) { - const p = this.pipes.find((p2) => p2.dest === dest); + const p = this[PIPES].find((p2) => p2.dest === dest); if (p) { - this.pipes.splice(this.pipes.indexOf(p), 1); + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } else + this[PIPES].splice(this[PIPES].indexOf(p), 1); p.unpipe(); } } - addListener(ev, fn2) { - return this.on(ev, fn2); + /** + * Alias for {@link Minipass#on} + */ + addListener(ev, handler) { + return this.on(ev, handler); } - on(ev, fn2) { - const ret = super.on(ev, fn2); - if (ev === "data" && !this.pipes.length && !this.flowing) - this[RESUME](); - else if (ev === "readable" && this[BUFFERLENGTH] !== 0) + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === "data") { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } else if (ev === "readable" && this[BUFFERLENGTH] !== 0) { super.emit("readable"); - else if (isEndish(ev) && this[EMITTED_END]) { + } else if (isEndish(ev) && this[EMITTED_END]) { super.emit(ev); this.removeAllListeners(ev); } else if (ev === "error" && this[EMITTED_ERROR]) { + const h = handler; if (this[ASYNC]) - defer(() => fn2.call(this, this[EMITTED_ERROR])); + defer(() => h.call(this, this[EMITTED_ERROR])); else - fn2.call(this, this[EMITTED_ERROR]); + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev, handler) { + return this.off(ev, handler); + } + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev, handler) { + const ret = super.off(ev, handler); + if (ev === "data") { + this[DATALISTENERS] = this.listeners("data").length; + if (this[DATALISTENERS] === 0 && !this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } } return ret; } + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === "data" || ev === void 0) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * true if the 'end' event has been emitted + */ get emittedEnd() { return this[EMITTED_END]; } [MAYBE_EMIT_END]() { - if (!this[EMITTING_END] && !this[EMITTED_END] && !this[DESTROYED] && this.buffer.length === 0 && this[EOF]) { + if (!this[EMITTING_END] && !this[EMITTED_END] && !this[DESTROYED] && this[BUFFER].length === 0 && this[EOF]) { this[EMITTING_END] = true; this.emit("end"); this.emit("prefinish"); @@ -14538,23 +13133,49 @@ var require_minipass2 = __commonJS({ this[EMITTING_END] = false; } } - emit(ev, data, ...extra) { - if (ev !== "error" && ev !== "close" && ev !== DESTROYED && this[DESTROYED]) - return; - else if (ev === "data") { - return !data ? false : this[ASYNC] ? defer(() => this[EMITDATA](data)) : this[EMITDATA](data); + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev, ...args) { + const data = args[0]; + if (ev !== "error" && ev !== "close" && ev !== DESTROYED && this[DESTROYED]) { + return false; + } else if (ev === "data") { + return !this[OBJECTMODE] && !data ? false : this[ASYNC] ? (defer(() => this[EMITDATA](data)), true) : this[EMITDATA](data); } else if (ev === "end") { return this[EMITEND](); } else if (ev === "close") { this[CLOSED] = true; if (!this[EMITTED_END] && !this[DESTROYED]) - return; + return false; const ret2 = super.emit("close"); this.removeAllListeners("close"); return ret2; } else if (ev === "error") { this[EMITTED_ERROR] = data; - const ret2 = super.emit("error", data); + super.emit(ERROR, data); + const ret2 = !this[SIGNAL] || this.listeners("error").length ? super.emit("error", data) : false; this[MAYBE_EMIT_END](); return ret2; } else if (ev === "resume") { @@ -14566,49 +13187,52 @@ var require_minipass2 = __commonJS({ this.removeAllListeners(ev); return ret2; } - const ret = super.emit(ev, data, ...extra); + const ret = super.emit(ev, ...args); this[MAYBE_EMIT_END](); return ret; } [EMITDATA](data) { - for (const p of this.pipes) { + for (const p of this[PIPES]) { if (p.dest.write(data) === false) this.pause(); } - const ret = super.emit("data", data); + const ret = this[DISCARDED] ? false : super.emit("data", data); this[MAYBE_EMIT_END](); return ret; } [EMITEND]() { if (this[EMITTED_END]) - return; + return false; this[EMITTED_END] = true; this.readable = false; - if (this[ASYNC]) - defer(() => this[EMITEND2]()); - else - this[EMITEND2](); + return this[ASYNC] ? (defer(() => this[EMITEND2]()), true) : this[EMITEND2](); } [EMITEND2]() { if (this[DECODER]) { const data = this[DECODER].end(); if (data) { - for (const p of this.pipes) { + for (const p of this[PIPES]) { p.dest.write(data); } - super.emit("data", data); + if (!this[DISCARDED]) + super.emit("data", data); } } - for (const p of this.pipes) { + for (const p of this[PIPES]) { p.end(); } const ret = super.emit("end"); this.removeAllListeners("end"); return ret; } - // const all = await stream.collect() - collect() { - const buf = []; + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + async collect() { + const buf = Object.assign([], { + dataLength: 0 + }); if (!this[OBJECTMODE]) buf.dataLength = 0; const p = this.promise(); @@ -14617,45 +13241,75 @@ var require_minipass2 = __commonJS({ if (!this[OBJECTMODE]) buf.dataLength += c.length; }); - return p.then(() => buf); + await p; + return buf; } - // const data = await stream.concat() - concat() { - return this[OBJECTMODE] ? Promise.reject(new Error("cannot concat in objectMode")) : this.collect().then((buf) => this[OBJECTMODE] ? Promise.reject(new Error("cannot concat in objectMode")) : this[ENCODING] ? buf.join("") : Buffer.concat(buf, buf.dataLength)); + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + async concat() { + if (this[OBJECTMODE]) { + throw new Error("cannot concat in objectMode"); + } + const buf = await this.collect(); + return this[ENCODING] ? buf.join("") : Buffer.concat(buf, buf.dataLength); } - // stream.promise().then(() => done, er => emitted error) - promise() { + /** + * Return a void Promise that resolves once the stream ends. + */ + async promise() { return new Promise((resolve, reject) => { this.on(DESTROYED, () => reject(new Error("stream destroyed"))); this.on("error", (er) => reject(er)); this.on("end", () => resolve()); }); } - // for await (let chunk of stream) - [ASYNCITERATOR]() { + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator]() { + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: void 0, done: true }; + }; const next = () => { + if (stopped) + return stop(); const res = this.read(); if (res !== null) return Promise.resolve({ done: false, value: res }); if (this[EOF]) - return Promise.resolve({ done: true }); - let resolve = null; - let reject = null; + return stop(); + let resolve; + let reject; const onerr = (er) => { - this.removeListener("data", ondata); - this.removeListener("end", onend); + this.off("data", ondata); + this.off("end", onend); + this.off(DESTROYED, ondestroy); + stop(); reject(er); }; const ondata = (value) => { - this.removeListener("error", onerr); - this.removeListener("end", onend); + this.off("error", onerr); + this.off("end", onend); + this.off(DESTROYED, ondestroy); this.pause(); resolve({ value, done: !!this[EOF] }); }; const onend = () => { - this.removeListener("error", onerr); - this.removeListener("data", ondata); - resolve({ done: true }); + this.off("error", onerr); + this.off("data", ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: void 0 }); }; const ondestroy = () => onerr(new Error("stream destroyed")); return new Promise((res2, rej) => { @@ -14667,17 +13321,62 @@ var require_minipass2 = __commonJS({ this.once("data", ondata); }); }; - return { next }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + } + }; } - // for (let chunk of stream) - [ITERATOR]() { + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator]() { + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off("end", stop); + stopped = true; + return { done: true, value: void 0 }; + }; const next = () => { + if (stopped) + return stop(); const value = this.read(); - const done = value === null; - return { value, done }; + return value === null ? stop() : { done: false, value }; + }; + this.once("end", stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + } }; - return { next }; } + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ destroy(er) { if (this[DESTROYED]) { if (er) @@ -14687,6242 +13386,6657 @@ var require_minipass2 = __commonJS({ return this; } this[DESTROYED] = true; - this.buffer.length = 0; + this[DISCARDED] = true; + this[BUFFER].length = 0; this[BUFFERLENGTH] = 0; - if (typeof this.close === "function" && !this[CLOSED]) - this.close(); + const wc = this; + if (typeof wc.close === "function" && !this[CLOSED]) + wc.close(); if (er) this.emit("error", er); else this.emit(DESTROYED); return this; } - static isStream(s) { - return !!s && (s instanceof Minipass || s instanceof Stream || s instanceof EE && (typeof s.pipe === "function" || // readable - typeof s.write === "function" && typeof s.end === "function")); + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream() { + return isStream; } }; } }); -// .yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-64fae024e1.zip/node_modules/minizlib/index.js -var require_minizlib = __commonJS({ - ".yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-64fae024e1.zip/node_modules/minizlib/index.js"(exports) { - "use strict"; - var assert3 = require("assert"); - var Buffer2 = require("buffer").Buffer; - var realZlib = require("zlib"); - var constants = exports.constants = require_constants5(); - var Minipass = require_minipass2(); - var OriginalBufferConcat = Buffer2.concat; - var _superWrite = Symbol("_superWrite"); - var ZlibError = class extends Error { - constructor(err) { - super("zlib: " + err.message); - this.code = err.code; - this.errno = err.errno; - if (!this.code) - this.code = "ZLIB_ERROR"; - this.message = "zlib: " + err.message; - Error.captureStackTrace(this, this.constructor); +// .yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-c25b6dc159.zip/node_modules/@isaacs/fs-minipass/dist/esm/index.js +var import_events2, import_fs2, writev, _autoClose, _close, _ended, _fd, _finished, _flags, _flush, _handleChunk, _makeBuf, _mode, _needDrain, _onerror, _onopen, _onread, _onwrite, _open, _path, _pos, _queue, _read, _readSize, _reading, _remain, _size, _write, _writing, _defaultFlag, _errored, ReadStream, ReadStreamSync, WriteStream, WriteStreamSync; +var init_esm2 = __esm({ + ".yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-c25b6dc159.zip/node_modules/@isaacs/fs-minipass/dist/esm/index.js"() { + import_events2 = __toESM(require("events"), 1); + import_fs2 = __toESM(require("fs"), 1); + init_esm(); + writev = import_fs2.default.writev; + _autoClose = Symbol("_autoClose"); + _close = Symbol("_close"); + _ended = Symbol("_ended"); + _fd = Symbol("_fd"); + _finished = Symbol("_finished"); + _flags = Symbol("_flags"); + _flush = Symbol("_flush"); + _handleChunk = Symbol("_handleChunk"); + _makeBuf = Symbol("_makeBuf"); + _mode = Symbol("_mode"); + _needDrain = Symbol("_needDrain"); + _onerror = Symbol("_onerror"); + _onopen = Symbol("_onopen"); + _onread = Symbol("_onread"); + _onwrite = Symbol("_onwrite"); + _open = Symbol("_open"); + _path = Symbol("_path"); + _pos = Symbol("_pos"); + _queue = Symbol("_queue"); + _read = Symbol("_read"); + _readSize = Symbol("_readSize"); + _reading = Symbol("_reading"); + _remain = Symbol("_remain"); + _size = Symbol("_size"); + _write = Symbol("_write"); + _writing = Symbol("_writing"); + _defaultFlag = Symbol("_defaultFlag"); + _errored = Symbol("_errored"); + ReadStream = class extends Minipass { + [_errored] = false; + [_fd]; + [_path]; + [_readSize]; + [_reading] = false; + [_size]; + [_remain]; + [_autoClose]; + constructor(path16, opt) { + opt = opt || {}; + super(opt); + this.readable = true; + this.writable = false; + if (typeof path16 !== "string") { + throw new TypeError("path must be a string"); + } + this[_errored] = false; + this[_fd] = typeof opt.fd === "number" ? opt.fd : void 0; + this[_path] = path16; + this[_readSize] = opt.readSize || 16 * 1024 * 1024; + this[_reading] = false; + this[_size] = typeof opt.size === "number" ? opt.size : Infinity; + this[_remain] = this[_size]; + this[_autoClose] = typeof opt.autoClose === "boolean" ? opt.autoClose : true; + if (typeof this[_fd] === "number") { + this[_read](); + } else { + this[_open](); + } } - get name() { - return "ZlibError"; + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + //@ts-ignore + write() { + throw new TypeError("this is a readable stream"); + } + //@ts-ignore + end() { + throw new TypeError("this is a readable stream"); + } + [_open]() { + import_fs2.default.open(this[_path], "r", (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (er) { + this[_onerror](er); + } else { + this[_fd] = fd; + this.emit("open", fd); + this[_read](); + } + } + [_makeBuf]() { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])); + } + [_read]() { + if (!this[_reading]) { + this[_reading] = true; + const buf = this[_makeBuf](); + if (buf.length === 0) { + return process.nextTick(() => this[_onread](null, 0, buf)); + } + import_fs2.default.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b)); + } + } + [_onread](er, br, buf) { + this[_reading] = false; + if (er) { + this[_onerror](er); + } else if (this[_handleChunk](br, buf)) { + this[_read](); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === "number") { + const fd = this[_fd]; + this[_fd] = void 0; + import_fs2.default.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); + } + } + [_onerror](er) { + this[_reading] = true; + this[_close](); + this.emit("error", er); + } + [_handleChunk](br, buf) { + let ret = false; + this[_remain] -= br; + if (br > 0) { + ret = super.write(br < buf.length ? buf.subarray(0, br) : buf); + } + if (br === 0 || this[_remain] <= 0) { + ret = false; + this[_close](); + super.end(); + } + return ret; + } + emit(ev, ...args) { + switch (ev) { + case "prefinish": + case "finish": + return false; + case "drain": + if (typeof this[_fd] === "number") { + this[_read](); + } + return false; + case "error": + if (this[_errored]) { + return false; + } + this[_errored] = true; + return super.emit(ev, ...args); + default: + return super.emit(ev, ...args); + } } }; - var _opts = Symbol("opts"); - var _flushFlag = Symbol("flushFlag"); - var _finishFlushFlag = Symbol("finishFlushFlag"); - var _fullFlushFlag = Symbol("fullFlushFlag"); - var _handle = Symbol("handle"); - var _onError = Symbol("onError"); - var _sawError = Symbol("sawError"); - var _level = Symbol("level"); - var _strategy = Symbol("strategy"); - var _ended = Symbol("ended"); - var _defaultFullFlush = Symbol("_defaultFullFlush"); - var ZlibBase = class extends Minipass { - constructor(opts, mode) { - if (!opts || typeof opts !== "object") - throw new TypeError("invalid options for ZlibBase constructor"); - super(opts); - this[_sawError] = false; - this[_ended] = false; - this[_opts] = opts; - this[_flushFlag] = opts.flush; - this[_finishFlushFlag] = opts.finishFlush; + ReadStreamSync = class extends ReadStream { + [_open]() { + let threw = true; try { - this[_handle] = new realZlib[mode](opts); - } catch (er) { - throw new ZlibError(er); + this[_onopen](null, import_fs2.default.openSync(this[_path], "r")); + threw = false; + } finally { + if (threw) { + this[_close](); + } } - this[_onError] = (err) => { - if (this[_sawError]) - return; - this[_sawError] = true; - this.close(); - this.emit("error", err); - }; - this[_handle].on("error", (er) => this[_onError](new ZlibError(er))); - this.once("end", () => this.close); } - close() { - if (this[_handle]) { - this[_handle].close(); - this[_handle] = null; + [_read]() { + let threw = true; + try { + if (!this[_reading]) { + this[_reading] = true; + do { + const buf = this[_makeBuf](); + const br = buf.length === 0 ? 0 : import_fs2.default.readSync(this[_fd], buf, 0, buf.length, null); + if (!this[_handleChunk](br, buf)) { + break; + } + } while (true); + this[_reading] = false; + } + threw = false; + } finally { + if (threw) { + this[_close](); + } + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === "number") { + const fd = this[_fd]; + this[_fd] = void 0; + import_fs2.default.closeSync(fd); this.emit("close"); } } - reset() { - if (!this[_sawError]) { - assert3(this[_handle], "zlib binding closed"); - return this[_handle].reset(); + }; + WriteStream = class extends import_events2.default { + readable = false; + writable = true; + [_errored] = false; + [_writing] = false; + [_ended] = false; + [_queue] = []; + [_needDrain] = false; + [_path]; + [_mode]; + [_autoClose]; + [_fd]; + [_defaultFlag]; + [_flags]; + [_finished] = false; + [_pos]; + constructor(path16, opt) { + opt = opt || {}; + super(opt); + this[_path] = path16; + this[_fd] = typeof opt.fd === "number" ? opt.fd : void 0; + this[_mode] = opt.mode === void 0 ? 438 : opt.mode; + this[_pos] = typeof opt.start === "number" ? opt.start : void 0; + this[_autoClose] = typeof opt.autoClose === "boolean" ? opt.autoClose : true; + const defaultFlag = this[_pos] !== void 0 ? "r+" : "w"; + this[_defaultFlag] = opt.flags === void 0; + this[_flags] = opt.flags === void 0 ? defaultFlag : opt.flags; + if (this[_fd] === void 0) { + this[_open](); } } - flush(flushFlag) { - if (this.ended) - return; - if (typeof flushFlag !== "number") - flushFlag = this[_fullFlushFlag]; - this.write(Object.assign(Buffer2.alloc(0), { [_flushFlag]: flushFlag })); + emit(ev, ...args) { + if (ev === "error") { + if (this[_errored]) { + return false; + } + this[_errored] = true; + } + return super.emit(ev, ...args); } - end(chunk, encoding, cb) { - if (chunk) - this.write(chunk, encoding); - this.flush(this[_finishFlushFlag]); - this[_ended] = true; - return super.end(null, null, cb); + get fd() { + return this[_fd]; } - get ended() { - return this[_ended]; + get path() { + return this[_path]; } - write(chunk, encoding, cb) { - if (typeof encoding === "function") - cb = encoding, encoding = "utf8"; - if (typeof chunk === "string") - chunk = Buffer2.from(chunk, encoding); - if (this[_sawError]) - return; - assert3(this[_handle], "zlib binding closed"); - const nativeHandle = this[_handle]._handle; - const originalNativeClose = nativeHandle.close; - nativeHandle.close = () => { - }; - const originalClose = this[_handle].close; - this[_handle].close = () => { - }; - Buffer2.concat = (args) => args; - let result; - try { - const flushFlag = typeof chunk[_flushFlag] === "number" ? chunk[_flushFlag] : this[_flushFlag]; - result = this[_handle]._processChunk(chunk, flushFlag); - Buffer2.concat = OriginalBufferConcat; - } catch (err) { - Buffer2.concat = OriginalBufferConcat; - this[_onError](new ZlibError(err)); - } finally { - if (this[_handle]) { - this[_handle]._handle = nativeHandle; - nativeHandle.close = originalNativeClose; - this[_handle].close = originalClose; - this[_handle].removeAllListeners("error"); + [_onerror](er) { + this[_close](); + this[_writing] = true; + this.emit("error", er); + } + [_open]() { + import_fs2.default.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (this[_defaultFlag] && this[_flags] === "r+" && er && er.code === "ENOENT") { + this[_flags] = "w"; + this[_open](); + } else if (er) { + this[_onerror](er); + } else { + this[_fd] = fd; + this.emit("open", fd); + if (!this[_writing]) { + this[_flush](); } } - if (this[_handle]) - this[_handle].on("error", (er) => this[_onError](new ZlibError(er))); - let writeReturn; - if (result) { - if (Array.isArray(result) && result.length > 0) { - writeReturn = this[_superWrite](Buffer2.from(result[0])); - for (let i = 1; i < result.length; i++) { - writeReturn = this[_superWrite](result[i]); - } + } + end(buf, enc) { + if (buf) { + this.write(buf, enc); + } + this[_ended] = true; + if (!this[_writing] && !this[_queue].length && typeof this[_fd] === "number") { + this[_onwrite](null, 0); + } + return this; + } + write(buf, enc) { + if (typeof buf === "string") { + buf = Buffer.from(buf, enc); + } + if (this[_ended]) { + this.emit("error", new Error("write() after end()")); + return false; + } + if (this[_fd] === void 0 || this[_writing] || this[_queue].length) { + this[_queue].push(buf); + this[_needDrain] = true; + return false; + } + this[_writing] = true; + this[_write](buf); + return true; + } + [_write](buf) { + import_fs2.default.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + [_onwrite](er, bw) { + if (er) { + this[_onerror](er); + } else { + if (this[_pos] !== void 0 && typeof bw === "number") { + this[_pos] += bw; + } + if (this[_queue].length) { + this[_flush](); } else { - writeReturn = this[_superWrite](Buffer2.from(result)); + this[_writing] = false; + if (this[_ended] && !this[_finished]) { + this[_finished] = true; + this[_close](); + this.emit("finish"); + } else if (this[_needDrain]) { + this[_needDrain] = false; + this.emit("drain"); + } + } + } + } + [_flush]() { + if (this[_queue].length === 0) { + if (this[_ended]) { + this[_onwrite](null, 0); } + } else if (this[_queue].length === 1) { + this[_write](this[_queue].pop()); + } else { + const iovec = this[_queue]; + this[_queue] = []; + writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw)); } - if (cb) - cb(); - return writeReturn; } - [_superWrite](data) { - return super.write(data); + [_close]() { + if (this[_autoClose] && typeof this[_fd] === "number") { + const fd = this[_fd]; + this[_fd] = void 0; + import_fs2.default.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); + } } }; - var Zlib = class extends ZlibBase { - constructor(opts, mode) { - opts = opts || {}; - opts.flush = opts.flush || constants.Z_NO_FLUSH; - opts.finishFlush = opts.finishFlush || constants.Z_FINISH; - super(opts, mode); - this[_fullFlushFlag] = constants.Z_FULL_FLUSH; - this[_level] = opts.level; - this[_strategy] = opts.strategy; - } - params(level, strategy) { - if (this[_sawError]) - return; - if (!this[_handle]) - throw new Error("cannot switch params when binding is closed"); - if (!this[_handle].params) - throw new Error("not supported in this implementation"); - if (this[_level] !== level || this[_strategy] !== strategy) { - this.flush(constants.Z_SYNC_FLUSH); - assert3(this[_handle], "zlib binding closed"); - const origFlush = this[_handle].flush; - this[_handle].flush = (flushFlag, cb) => { - this.flush(flushFlag); - cb(); - }; + WriteStreamSync = class extends WriteStream { + [_open]() { + let fd; + if (this[_defaultFlag] && this[_flags] === "r+") { try { - this[_handle].params(level, strategy); - } finally { - this[_handle].flush = origFlush; - } - if (this[_handle]) { - this[_level] = level; - this[_strategy] = strategy; + fd = import_fs2.default.openSync(this[_path], this[_flags], this[_mode]); + } catch (er) { + if (er?.code === "ENOENT") { + this[_flags] = "w"; + return this[_open](); + } else { + throw er; + } } + } else { + fd = import_fs2.default.openSync(this[_path], this[_flags], this[_mode]); } + this[_onopen](null, fd); } - }; - var Deflate = class extends Zlib { - constructor(opts) { - super(opts, "Deflate"); - } - }; - var Inflate = class extends Zlib { - constructor(opts) { - super(opts, "Inflate"); - } - }; - var _portable = Symbol("_portable"); - var Gzip = class extends Zlib { - constructor(opts) { - super(opts, "Gzip"); - this[_portable] = opts && !!opts.portable; - } - [_superWrite](data) { - if (!this[_portable]) - return super[_superWrite](data); - this[_portable] = false; - data[9] = 255; - return super[_superWrite](data); - } - }; - var Gunzip = class extends Zlib { - constructor(opts) { - super(opts, "Gunzip"); - } - }; - var DeflateRaw = class extends Zlib { - constructor(opts) { - super(opts, "DeflateRaw"); - } - }; - var InflateRaw = class extends Zlib { - constructor(opts) { - super(opts, "InflateRaw"); - } - }; - var Unzip = class extends Zlib { - constructor(opts) { - super(opts, "Unzip"); - } - }; - var Brotli = class extends ZlibBase { - constructor(opts, mode) { - opts = opts || {}; - opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS; - opts.finishFlush = opts.finishFlush || constants.BROTLI_OPERATION_FINISH; - super(opts, mode); - this[_fullFlushFlag] = constants.BROTLI_OPERATION_FLUSH; - } - }; - var BrotliCompress = class extends Brotli { - constructor(opts) { - super(opts, "BrotliCompress"); + [_close]() { + if (this[_autoClose] && typeof this[_fd] === "number") { + const fd = this[_fd]; + this[_fd] = void 0; + import_fs2.default.closeSync(fd); + this.emit("close"); + } } - }; - var BrotliDecompress = class extends Brotli { - constructor(opts) { - super(opts, "BrotliDecompress"); + [_write](buf) { + let threw = true; + try { + this[_onwrite](null, import_fs2.default.writeSync(this[_fd], buf, 0, buf.length, this[_pos])); + threw = false; + } finally { + if (threw) { + try { + this[_close](); + } catch { + } + } + } } }; - exports.Deflate = Deflate; - exports.Inflate = Inflate; - exports.Gzip = Gzip; - exports.Gunzip = Gunzip; - exports.DeflateRaw = DeflateRaw; - exports.InflateRaw = InflateRaw; - exports.Unzip = Unzip; - if (typeof realZlib.BrotliCompress === "function") { - exports.BrotliCompress = BrotliCompress; - exports.BrotliDecompress = BrotliDecompress; - } else { - exports.BrotliCompress = exports.BrotliDecompress = class { - constructor() { - throw new Error("Brotli is not supported in this version of Node.js"); - } - }; - } } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js -var require_normalize_windows_path = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-windows-path.js"(exports, module2) { - var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - module2.exports = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/options.js +var argmap, isSyncFile, isAsyncFile, isSyncNoFile, isAsyncNoFile, dealiasKey, dealias; +var init_options = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/options.js"() { + argmap = /* @__PURE__ */ new Map([ + ["C", "cwd"], + ["f", "file"], + ["z", "gzip"], + ["P", "preservePaths"], + ["U", "unlink"], + ["strip-components", "strip"], + ["stripComponents", "strip"], + ["keep-newer", "newer"], + ["keepNewer", "newer"], + ["keep-newer-files", "newer"], + ["keepNewerFiles", "newer"], + ["k", "keep"], + ["keep-existing", "keep"], + ["keepExisting", "keep"], + ["m", "noMtime"], + ["no-mtime", "noMtime"], + ["p", "preserveOwner"], + ["L", "follow"], + ["h", "follow"], + ["onentry", "onReadEntry"] + ]); + isSyncFile = (o) => !!o.sync && !!o.file; + isAsyncFile = (o) => !o.sync && !!o.file; + isSyncNoFile = (o) => !!o.sync && !o.file; + isAsyncNoFile = (o) => !o.sync && !o.file; + dealiasKey = (k) => { + const d = argmap.get(k); + if (d) + return d; + return k; + }; + dealias = (opt = {}) => { + if (!opt) + return {}; + const result = {}; + for (const [key, v] of Object.entries(opt)) { + const k = dealiasKey(key); + result[k] = v; + } + if (result.chmod === void 0 && result.noChmod === false) { + result.chmod = true; + } + delete result.noChmod; + return result; + }; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js -var require_read_entry = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/read-entry.js"(exports, module2) { - "use strict"; - var { Minipass } = require_minipass(); - var normPath = require_normalize_windows_path(); - var SLURP = Symbol("slurp"); - module2.exports = class ReadEntry extends Minipass { - constructor(header, ex, gex) { - super(); - this.pause(); - this.extended = ex; - this.globalExtended = gex; - this.header = header; - this.startBlockSize = 512 * Math.ceil(header.size / 512); - this.blockRemain = this.startBlockSize; - this.remain = header.size; - this.type = header.type; - this.meta = false; - this.ignore = false; - switch (this.type) { - case "File": - case "OldFile": - case "Link": - case "SymbolicLink": - case "CharacterDevice": - case "BlockDevice": - case "Directory": - case "FIFO": - case "ContiguousFile": - case "GNUDumpDir": - break; - case "NextFileHasLongLinkpath": - case "NextFileHasLongPath": - case "OldGnuLongPath": - case "GlobalExtendedHeader": - case "ExtendedHeader": - case "OldExtendedHeader": - this.meta = true; - break; - default: - this.ignore = true; - } - this.path = normPath(header.path); - this.mode = header.mode; - if (this.mode) { - this.mode = this.mode & 4095; - } - this.uid = header.uid; - this.gid = header.gid; - this.uname = header.uname; - this.gname = header.gname; - this.size = header.size; - this.mtime = header.mtime; - this.atime = header.atime; - this.ctime = header.ctime; - this.linkpath = normPath(header.linkpath); - this.uname = header.uname; - this.gname = header.gname; - if (ex) { - this[SLURP](ex); - } - if (gex) { - this[SLURP](gex, true); - } - } - write(data) { - const writeLen = data.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); - } - const r = this.remain; - const br = this.blockRemain; - this.remain = Math.max(0, r - writeLen); - this.blockRemain = Math.max(0, br - writeLen); - if (this.ignore) { - return true; - } - if (r >= writeLen) { - return super.write(data); - } - return super.write(data.slice(0, r)); - } - [SLURP](ex, global2) { - for (const k in ex) { - if (ex[k] !== null && ex[k] !== void 0 && !(global2 && k === "path")) { - this[k] = k === "path" || k === "linkpath" ? normPath(ex[k]) : ex[k]; - } - } - } +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/make-command.js +var makeCommand; +var init_make_command = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/make-command.js"() { + init_options(); + makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { + return Object.assign((opt_ = [], entries, cb) => { + if (Array.isArray(opt_)) { + entries = opt_; + opt_ = {}; + } + if (typeof entries === "function") { + cb = entries; + entries = void 0; + } + if (!entries) { + entries = []; + } else { + entries = Array.from(entries); + } + const opt = dealias(opt_); + validate?.(opt, entries); + if (isSyncFile(opt)) { + if (typeof cb === "function") { + throw new TypeError("callback not supported for sync tar functions"); + } + return syncFile(opt, entries); + } else if (isAsyncFile(opt)) { + const p = asyncFile(opt, entries); + const c = cb ? cb : void 0; + return c ? p.then(() => c(), c) : p; + } else if (isSyncNoFile(opt)) { + if (typeof cb === "function") { + throw new TypeError("callback not supported for sync tar functions"); + } + return syncNoFile(opt, entries); + } else if (isAsyncNoFile(opt)) { + if (typeof cb === "function") { + throw new TypeError("callback only supported with file option"); + } + return asyncNoFile(opt, entries); + } else { + throw new Error("impossible options??"); + } + }, { + syncFile, + asyncFile, + syncNoFile, + asyncNoFile, + validate + }); }; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js -var require_types = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/types.js"(exports) { - "use strict"; - exports.name = /* @__PURE__ */ new Map([ - ["0", "File"], - // same as File - ["", "OldFile"], - ["1", "Link"], - ["2", "SymbolicLink"], - // Devices and FIFOs aren't fully supported - // they are parsed, but skipped when unpacking - ["3", "CharacterDevice"], - ["4", "BlockDevice"], - ["5", "Directory"], - ["6", "FIFO"], - // same as File - ["7", "ContiguousFile"], - // pax headers - ["g", "GlobalExtendedHeader"], - ["x", "ExtendedHeader"], - // vendor-specific stuff - // skip - ["A", "SolarisACL"], - // like 5, but with data, which should be skipped - ["D", "GNUDumpDir"], - // metadata only, skip - ["I", "Inode"], - // data = link path of next file - ["K", "NextFileHasLongLinkpath"], - // data = path of next file - ["L", "NextFileHasLongPath"], - // skip - ["M", "ContinuationFile"], - // like L - ["N", "OldGnuLongPath"], - // skip - ["S", "SparseFile"], - // skip - ["V", "TapeVolumeHeader"], - // like x - ["X", "OldExtendedHeader"] - ]); - exports.code = new Map(Array.from(exports.name).map((kv) => [kv[1], kv[0]])); +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js +var import_zlib, realZlibConstants, constants; +var init_constants = __esm({ + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js"() { + import_zlib = __toESM(require("zlib"), 1); + realZlibConstants = import_zlib.default.constants || { ZLIB_VERNUM: 4736 }; + constants = Object.freeze(Object.assign(/* @__PURE__ */ Object.create(null), { + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + Z_VERSION_ERROR: -6, + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + DEFLATE: 1, + INFLATE: 2, + GZIP: 3, + GUNZIP: 4, + DEFLATERAW: 5, + INFLATERAW: 6, + UNZIP: 7, + BROTLI_DECODE: 8, + BROTLI_ENCODE: 9, + Z_MIN_WINDOWBITS: 8, + Z_MAX_WINDOWBITS: 15, + Z_DEFAULT_WINDOWBITS: 15, + Z_MIN_CHUNK: 64, + Z_MAX_CHUNK: Infinity, + Z_DEFAULT_CHUNK: 16384, + Z_MIN_MEMLEVEL: 1, + Z_MAX_MEMLEVEL: 9, + Z_DEFAULT_MEMLEVEL: 8, + Z_MIN_LEVEL: -1, + Z_MAX_LEVEL: 9, + Z_DEFAULT_LEVEL: -1, + BROTLI_OPERATION_PROCESS: 0, + BROTLI_OPERATION_FLUSH: 1, + BROTLI_OPERATION_FINISH: 2, + BROTLI_OPERATION_EMIT_METADATA: 3, + BROTLI_MODE_GENERIC: 0, + BROTLI_MODE_TEXT: 1, + BROTLI_MODE_FONT: 2, + BROTLI_DEFAULT_MODE: 0, + BROTLI_MIN_QUALITY: 0, + BROTLI_MAX_QUALITY: 11, + BROTLI_DEFAULT_QUALITY: 11, + BROTLI_MIN_WINDOW_BITS: 10, + BROTLI_MAX_WINDOW_BITS: 24, + BROTLI_LARGE_MAX_WINDOW_BITS: 30, + BROTLI_DEFAULT_WINDOW: 22, + BROTLI_MIN_INPUT_BLOCK_BITS: 16, + BROTLI_MAX_INPUT_BLOCK_BITS: 24, + BROTLI_PARAM_MODE: 0, + BROTLI_PARAM_QUALITY: 1, + BROTLI_PARAM_LGWIN: 2, + BROTLI_PARAM_LGBLOCK: 3, + BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4, + BROTLI_PARAM_SIZE_HINT: 5, + BROTLI_PARAM_LARGE_WINDOW: 6, + BROTLI_PARAM_NPOSTFIX: 7, + BROTLI_PARAM_NDIRECT: 8, + BROTLI_DECODER_RESULT_ERROR: 0, + BROTLI_DECODER_RESULT_SUCCESS: 1, + BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0, + BROTLI_DECODER_PARAM_LARGE_WINDOW: 1, + BROTLI_DECODER_NO_ERROR: 0, + BROTLI_DECODER_SUCCESS: 1, + BROTLI_DECODER_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1, + BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5, + BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6, + BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7, + BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10, + BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11, + BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12, + BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13, + BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14, + BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15, + BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16, + BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19, + BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21, + BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27, + BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30, + BROTLI_DECODER_ERROR_UNREACHABLE: -31 + }, realZlibConstants)); } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js -var require_large_numbers = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/large-numbers.js"(exports, module2) { - "use strict"; - var encode = (num, buf) => { - if (!Number.isSafeInteger(num)) { - throw Error("cannot encode number outside of javascript safe integer range"); - } else if (num < 0) { - encodeNegative(num, buf); - } else { - encodePositive(num, buf); - } - return buf; - }; - var encodePositive = (num, buf) => { - buf[0] = 128; - for (var i = buf.length; i > 1; i--) { - buf[i - 1] = num & 255; - num = Math.floor(num / 256); +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js +var import_assert2, import_buffer, realZlib2, OriginalBufferConcat, desc, noop, passthroughBufferConcat, _superWrite, ZlibError, _flushFlag, ZlibBase, Zlib, Gzip, Unzip, Brotli, BrotliCompress, BrotliDecompress, Zstd, ZstdCompress, ZstdDecompress; +var init_esm3 = __esm({ + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js"() { + import_assert2 = __toESM(require("assert"), 1); + import_buffer = require("buffer"); + init_esm(); + realZlib2 = __toESM(require("zlib"), 1); + init_constants(); + init_constants(); + OriginalBufferConcat = import_buffer.Buffer.concat; + desc = Object.getOwnPropertyDescriptor(import_buffer.Buffer, "concat"); + noop = (args) => args; + passthroughBufferConcat = desc?.writable === true || desc?.set !== void 0 ? (makeNoOp) => { + import_buffer.Buffer.concat = makeNoOp ? noop : OriginalBufferConcat; + } : (_) => { + }; + _superWrite = Symbol("_superWrite"); + ZlibError = class extends Error { + code; + errno; + constructor(err, origin) { + super("zlib: " + err.message, { cause: err }); + this.code = err.code; + this.errno = err.errno; + if (!this.code) + this.code = "ZLIB_ERROR"; + this.message = "zlib: " + err.message; + Error.captureStackTrace(this, origin ?? this.constructor); } - }; - var encodeNegative = (num, buf) => { - buf[0] = 255; - var flipped = false; - num = num * -1; - for (var i = buf.length; i > 1; i--) { - var byte = num & 255; - num = Math.floor(num / 256); - if (flipped) { - buf[i - 1] = onesComp(byte); - } else if (byte === 0) { - buf[i - 1] = 0; - } else { - flipped = true; - buf[i - 1] = twosComp(byte); - } + get name() { + return "ZlibError"; } }; - var parse = (buf) => { - const pre = buf[0]; - const value = pre === 128 ? pos(buf.slice(1, buf.length)) : pre === 255 ? twos(buf) : null; - if (value === null) { - throw Error("invalid base256 encoding"); + _flushFlag = Symbol("flushFlag"); + ZlibBase = class extends Minipass { + #sawError = false; + #ended = false; + #flushFlag; + #finishFlushFlag; + #fullFlushFlag; + #handle; + #onError; + get sawError() { + return this.#sawError; } - if (!Number.isSafeInteger(value)) { - throw Error("parsed number outside of javascript safe integer range"); + get handle() { + return this.#handle; } - return value; - }; - var twos = (buf) => { - var len = buf.length; - var sum = 0; - var flipped = false; - for (var i = len - 1; i > -1; i--) { - var byte = buf[i]; - var f; - if (flipped) { - f = onesComp(byte); - } else if (byte === 0) { - f = byte; - } else { - flipped = true; - f = twosComp(byte); - } - if (f !== 0) { - sum -= f * Math.pow(256, len - i - 1); - } + /* c8 ignore start */ + get flushFlag() { + return this.#flushFlag; } - return sum; - }; - var pos = (buf) => { - var len = buf.length; - var sum = 0; - for (var i = len - 1; i > -1; i--) { - var byte = buf[i]; - if (byte !== 0) { - sum += byte * Math.pow(256, len - i - 1); + /* c8 ignore stop */ + constructor(opts, mode) { + if (!opts || typeof opts !== "object") + throw new TypeError("invalid options for ZlibBase constructor"); + super(opts); + this.#flushFlag = opts.flush ?? 0; + this.#finishFlushFlag = opts.finishFlush ?? 0; + this.#fullFlushFlag = opts.fullFlushFlag ?? 0; + if (typeof realZlib2[mode] !== "function") { + throw new TypeError("Compression method not supported: " + mode); } - } - return sum; - }; - var onesComp = (byte) => (255 ^ byte) & 255; - var twosComp = (byte) => (255 ^ byte) + 1 & 255; - module2.exports = { - encode, - parse - }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js -var require_header = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/header.js"(exports, module2) { - "use strict"; - var types = require_types(); - var pathModule = require("path").posix; - var large = require_large_numbers(); - var SLURP = Symbol("slurp"); - var TYPE = Symbol("type"); - var Header = class { - constructor(data, off, ex, gex) { - this.cksumValid = false; - this.needPax = false; - this.nullBlock = false; - this.block = null; - this.path = null; - this.mode = null; - this.uid = null; - this.gid = null; - this.size = null; - this.mtime = null; - this.cksum = null; - this[TYPE] = "0"; - this.linkpath = null; - this.uname = null; - this.gname = null; - this.devmaj = 0; - this.devmin = 0; - this.atime = null; - this.ctime = null; - if (Buffer.isBuffer(data)) { - this.decode(data, off || 0, ex, gex); - } else if (data) { - this.set(data); + try { + this.#handle = new realZlib2[mode](opts); + } catch (er) { + throw new ZlibError(er, this.constructor); } + this.#onError = (err) => { + if (this.#sawError) + return; + this.#sawError = true; + this.close(); + this.emit("error", err); + }; + this.#handle?.on("error", (er) => this.#onError(new ZlibError(er))); + this.once("end", () => this.close); } - decode(buf, off, ex, gex) { - if (!off) { - off = 0; - } - 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.cksum = decNumber(buf, off + 148, 12); - this[SLURP](ex); - this[SLURP](gex, true); - this[TYPE] = decString(buf, off + 156, 1); - if (this[TYPE] === "") { - this[TYPE] = "0"; - } - if (this[TYPE] === "0" && this.path.slice(-1) === "/") { - this[TYPE] = "5"; - } - if (this[TYPE] === "5") { - this.size = 0; - } - this.linkpath = decString(buf, off + 157, 100); - if (buf.slice(off + 257, off + 265).toString() === "ustar\x0000") { - this.uname = decString(buf, off + 265, 32); - this.gname = decString(buf, off + 297, 32); - this.devmaj = decNumber(buf, off + 329, 8); - this.devmin = decNumber(buf, off + 337, 8); - if (buf[off + 475] !== 0) { - const prefix = decString(buf, off + 345, 155); - this.path = prefix + "/" + this.path; - } else { - const prefix = decString(buf, off + 345, 130); - if (prefix) { - this.path = prefix + "/" + this.path; - } - this.atime = decDate(buf, off + 476, 12); - this.ctime = decDate(buf, off + 488, 12); - } - } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; - } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; - } - this.cksumValid = sum === this.cksum; - if (this.cksum === null && sum === 8 * 32) { - this.nullBlock = true; + close() { + if (this.#handle) { + this.#handle.close(); + this.#handle = void 0; + this.emit("close"); } } - [SLURP](ex, global2) { - for (const k in ex) { - if (ex[k] !== null && ex[k] !== void 0 && !(global2 && k === "path")) { - this[k] = ex[k]; - } + reset() { + if (!this.#sawError) { + (0, import_assert2.default)(this.#handle, "zlib binding closed"); + return this.#handle.reset?.(); } } - encode(buf, off) { - if (!buf) { - buf = this.block = Buffer.alloc(512); - off = 0; - } - if (!off) { - off = 0; - } - if (!(buf.length >= off + 512)) { - throw new Error("need 512 bytes for header"); - } - const prefixSize = this.ctime || this.atime ? 130 : 155; - const split = splitPrefix(this.path || "", prefixSize); - const path10 = split[0]; - const prefix = split[1]; - this.needPax = split[2]; - this.needPax = encString(buf, off, 100, path10) || this.needPax; - this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; - this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; - this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; - this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; - this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; - buf[off + 156] = this[TYPE].charCodeAt(0); - this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; - buf.write("ustar\x0000", off + 257, 8); - this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; - this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; - this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; - this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; - this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; - if (buf[off + 475] !== 0) { - this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; - } else { - this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; - this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; - this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; - } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; - } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; - } - this.cksum = sum; - encNumber(buf, off + 148, 8, this.cksum); - this.cksumValid = true; - return this.needPax; + flush(flushFlag) { + if (this.ended) + return; + if (typeof flushFlag !== "number") + flushFlag = this.#fullFlushFlag; + this.write(Object.assign(import_buffer.Buffer.alloc(0), { [_flushFlag]: flushFlag })); } - set(data) { - for (const i in data) { - if (data[i] !== null && data[i] !== void 0) { - this[i] = data[i]; - } + end(chunk, encoding, cb) { + if (typeof chunk === "function") { + cb = chunk; + encoding = void 0; + chunk = void 0; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (chunk) { + if (encoding) + this.write(chunk, encoding); + else + this.write(chunk); } + this.flush(this.#finishFlushFlag); + this.#ended = true; + return super.end(cb); } - get type() { - return types.name.get(this[TYPE]) || this[TYPE]; + get ended() { + return this.#ended; } - get typeKey() { - return this[TYPE]; + // overridden in the gzip classes to do portable writes + [_superWrite](data) { + return super.write(data); } - set type(type) { - if (types.code.has(type)) { - this[TYPE] = types.code.get(type); - } else { - this[TYPE] = type; + write(chunk, encoding, cb) { + if (typeof encoding === "function") + cb = encoding, encoding = "utf8"; + if (typeof chunk === "string") + chunk = import_buffer.Buffer.from(chunk, encoding); + if (this.#sawError) + return; + (0, import_assert2.default)(this.#handle, "zlib binding closed"); + const nativeHandle = this.#handle._handle; + const originalNativeClose = nativeHandle.close; + nativeHandle.close = () => { + }; + const originalClose = this.#handle.close; + this.#handle.close = () => { + }; + passthroughBufferConcat(true); + let result = void 0; + try { + const flushFlag = typeof chunk[_flushFlag] === "number" ? chunk[_flushFlag] : this.#flushFlag; + result = this.#handle._processChunk(chunk, flushFlag); + passthroughBufferConcat(false); + } catch (err) { + passthroughBufferConcat(false); + this.#onError(new ZlibError(err, this.write)); + } finally { + if (this.#handle) { + ; + this.#handle._handle = nativeHandle; + nativeHandle.close = originalNativeClose; + this.#handle.close = originalClose; + this.#handle.removeAllListeners("error"); + } } - } - }; - var splitPrefix = (p, prefixSize) => { - const pathSize = 100; - let pp = p; - let prefix = ""; - let ret; - const root = pathModule.parse(p).root || "."; - if (Buffer.byteLength(pp) < pathSize) { - ret = [pp, prefix, false]; - } else { - prefix = pathModule.dirname(pp); - pp = pathModule.basename(pp); - do { - if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp, prefix, false]; - } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp.slice(0, pathSize - 1), prefix, true]; + if (this.#handle) + this.#handle.on("error", (er) => this.#onError(new ZlibError(er, this.write))); + let writeReturn; + if (result) { + if (Array.isArray(result) && result.length > 0) { + const r = result[0]; + writeReturn = this[_superWrite](import_buffer.Buffer.from(r)); + for (let i = 1; i < result.length; i++) { + writeReturn = this[_superWrite](result[i]); + } } else { - pp = pathModule.join(pathModule.basename(prefix), pp); - prefix = pathModule.dirname(prefix); + writeReturn = this[_superWrite](import_buffer.Buffer.from(result)); } - } while (prefix !== root && !ret); - if (!ret) { - ret = [p.slice(0, pathSize - 1), "", true]; } + if (cb) + cb(); + return writeReturn; } - return ret; - }; - var decString = (buf, off, size) => buf.slice(off, off + size).toString("utf8").replace(/\0.*/, ""); - var decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); - var numToDate = (num) => num === null ? null : new Date(num * 1e3); - var decNumber = (buf, off, size) => buf[off] & 128 ? large.parse(buf.slice(off, off + size)) : decSmallNumber(buf, off, size); - var nanNull = (value) => isNaN(value) ? null : value; - var decSmallNumber = (buf, off, size) => nanNull(parseInt( - buf.slice(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), - 8 - )); - var MAXNUM = { - 12: 8589934591, - 8: 2097151 }; - var encNumber = (buf, off, size, number) => number === null ? false : number > MAXNUM[size] || number < 0 ? (large.encode(number, buf.slice(off, off + size)), true) : (encSmallNumber(buf, off, size, number), false); - var encSmallNumber = (buf, off, size, number) => buf.write(octalString(number, size), off, size, "ascii"); - var octalString = (number, size) => padOctal(Math.floor(number).toString(8), size); - var padOctal = (string, size) => (string.length === size - 1 ? string : new Array(size - string.length - 1).join("0") + string + " ") + "\0"; - var encDate = (buf, off, size, date) => date === null ? false : encNumber(buf, off, size, date.getTime() / 1e3); - var NULLS = new Array(156).join("\0"); - var encString = (buf, off, size, string) => string === null ? false : (buf.write(string + NULLS, off, size, "utf8"), string.length !== Buffer.byteLength(string) || string.length > size); - module2.exports = Header; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js -var require_pax = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pax.js"(exports, module2) { - "use strict"; - var Header = require_header(); - var path10 = require("path"); - var Pax = class { - constructor(obj, global2) { - this.atime = obj.atime || null; - this.charset = obj.charset || null; - this.comment = obj.comment || null; - this.ctime = obj.ctime || null; - this.gid = obj.gid || null; - this.gname = obj.gname || null; - this.linkpath = obj.linkpath || null; - this.mtime = obj.mtime || null; - this.path = obj.path || null; - this.size = obj.size || null; - this.uid = obj.uid || null; - this.uname = obj.uname || null; - this.dev = obj.dev || null; - this.ino = obj.ino || null; - this.nlink = obj.nlink || null; - this.global = global2 || false; + Zlib = class extends ZlibBase { + #level; + #strategy; + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.Z_NO_FLUSH; + opts.finishFlush = opts.finishFlush || constants.Z_FINISH; + opts.fullFlushFlag = constants.Z_FULL_FLUSH; + super(opts, mode); + this.#level = opts.level; + this.#strategy = opts.strategy; } - encode() { - const body = this.encodeBody(); - if (body === "") { - return null; - } - const bodyLen = Buffer.byteLength(body); - const bufLen = 512 * Math.ceil(1 + bodyLen / 512); - const buf = Buffer.allocUnsafe(bufLen); - for (let i = 0; i < 512; i++) { - buf[i] = 0; - } - new Header({ - // XXX split the path - // then the path should be PaxHeader + basename, but less than 99, - // prepend with the dirname - path: ("PaxHeader/" + path10.basename(this.path)).slice(0, 99), - mode: this.mode || 420, - uid: this.uid || null, - gid: this.gid || null, - size: bodyLen, - mtime: this.mtime || null, - type: this.global ? "GlobalExtendedHeader" : "ExtendedHeader", - linkpath: "", - uname: this.uname || "", - gname: this.gname || "", - devmaj: 0, - devmin: 0, - atime: this.atime || null, - ctime: this.ctime || null - }).encode(buf); - buf.write(body, 512, bodyLen, "utf8"); - for (let i = bodyLen + 512; i < buf.length; i++) { - buf[i] = 0; + params(level, strategy) { + if (this.sawError) + return; + if (!this.handle) + throw new Error("cannot switch params when binding is closed"); + if (!this.handle.params) + throw new Error("not supported in this implementation"); + if (this.#level !== level || this.#strategy !== strategy) { + this.flush(constants.Z_SYNC_FLUSH); + (0, import_assert2.default)(this.handle, "zlib binding closed"); + const origFlush = this.handle.flush; + this.handle.flush = (flushFlag, cb) => { + if (typeof flushFlag === "function") { + cb = flushFlag; + flushFlag = this.flushFlag; + } + this.flush(flushFlag); + cb?.(); + }; + try { + ; + this.handle.params(level, strategy); + } finally { + this.handle.flush = origFlush; + } + if (this.handle) { + this.#level = level; + this.#strategy = strategy; + } } - return buf; } - encodeBody() { - return this.encodeField("path") + this.encodeField("ctime") + this.encodeField("atime") + this.encodeField("dev") + this.encodeField("ino") + this.encodeField("nlink") + this.encodeField("charset") + this.encodeField("comment") + this.encodeField("gid") + this.encodeField("gname") + this.encodeField("linkpath") + this.encodeField("mtime") + this.encodeField("size") + this.encodeField("uid") + this.encodeField("uname"); + }; + Gzip = class extends Zlib { + #portable; + constructor(opts) { + super(opts, "Gzip"); + this.#portable = opts && !!opts.portable; } - encodeField(field) { - if (this[field] === null || this[field] === void 0) { - return ""; - } - const v = this[field] instanceof Date ? this[field].getTime() / 1e3 : this[field]; - const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; - const byteLen = Buffer.byteLength(s); - let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; - if (byteLen + digits >= Math.pow(10, digits)) { - digits += 1; - } - const len = digits + byteLen; - return len + s; + [_superWrite](data) { + if (!this.#portable) + return super[_superWrite](data); + this.#portable = false; + data[9] = 255; + return super[_superWrite](data); } }; - Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g); - var merge = (a, b) => b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a; - var parseKV = (string) => string.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); - var parseKVLine = (set, line) => { - const n = parseInt(line, 10); - if (n !== Buffer.byteLength(line) + 1) { - return set; + Unzip = class extends Zlib { + constructor(opts) { + super(opts, "Unzip"); } - line = line.slice((n + " ").length); - const kv = line.split("="); - const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); - if (!k) { - return set; + }; + Brotli = class extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS; + opts.finishFlush = opts.finishFlush || constants.BROTLI_OPERATION_FINISH; + opts.fullFlushFlag = constants.BROTLI_OPERATION_FLUSH; + super(opts, mode); } - const v = kv.join("="); - set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(v * 1e3) : /^[0-9]+$/.test(v) ? +v : v; - return set; }; - module2.exports = Pax; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js -var require_strip_trailing_slashes = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-trailing-slashes.js"(exports, module2) { - module2.exports = (str) => { - let i = str.length - 1; - let slashesStart = -1; - while (i > -1 && str.charAt(i) === "/") { - slashesStart = i; - i--; + BrotliCompress = class extends Brotli { + constructor(opts) { + super(opts, "BrotliCompress"); } - return slashesStart === -1 ? str : str.slice(0, slashesStart); }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js -var require_warn_mixin = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/warn-mixin.js"(exports, module2) { - "use strict"; - module2.exports = (Base) => class extends Base { - warn(code, message, data = {}) { - if (this.file) { - data.file = this.file; - } - if (this.cwd) { - data.cwd = this.cwd; - } - data.code = message instanceof Error && message.code || code; - data.tarCode = code; - if (!this.strict && data.recoverable !== false) { - if (message instanceof Error) { - data = Object.assign(message, data); - message = message.message; - } - this.emit("warn", data.tarCode, message, data); - } else if (message instanceof Error) { - this.emit("error", Object.assign(message, data)); - } else { - this.emit("error", Object.assign(new Error(`${code}: ${message}`), data)); - } + BrotliDecompress = class extends Brotli { + constructor(opts) { + super(opts, "BrotliDecompress"); } }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js -var require_winchars = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/winchars.js"(exports, module2) { - "use strict"; - var raw = [ - "|", - "<", - ">", - "?", - ":" - ]; - var win = raw.map((char) => String.fromCharCode(61440 + char.charCodeAt(0))); - var toWin = new Map(raw.map((char, i) => [char, win[i]])); - var toRaw = new Map(win.map((char, i) => [char, raw[i]])); - module2.exports = { - encode: (s) => raw.reduce((s2, c) => s2.split(c).join(toWin.get(c)), s), - decode: (s) => win.reduce((s2, c) => s2.split(c).join(toRaw.get(c)), s) + Zstd = class extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.ZSTD_e_continue; + opts.finishFlush = opts.finishFlush || constants.ZSTD_e_end; + opts.fullFlushFlag = constants.ZSTD_e_flush; + super(opts, mode); + } }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js -var require_strip_absolute_path = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/strip-absolute-path.js"(exports, module2) { - var { isAbsolute, parse } = require("path").win32; - module2.exports = (path10) => { - let r = ""; - let parsed = parse(path10); - while (isAbsolute(path10) || parsed.root) { - const root = path10.charAt(0) === "/" && path10.slice(0, 4) !== "//?/" ? "/" : parsed.root; - path10 = path10.slice(root.length); - r += root; - parsed = parse(path10); + ZstdCompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdCompress"); + } + }; + ZstdDecompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdDecompress"); } - return [r, path10]; }; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js -var require_mode_fix = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mode-fix.js"(exports, module2) { - "use strict"; - module2.exports = (mode, isDir, portable) => { - mode &= 4095; - if (portable) { - mode = (mode | 384) & ~18; +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/large-numbers.js +var encode, encodePositive, encodeNegative, parse, twos, pos, onesComp, twosComp; +var init_large_numbers = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/large-numbers.js"() { + encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + throw Error("cannot encode number outside of javascript safe integer range"); + } else if (num < 0) { + encodeNegative(num, buf); + } else { + encodePositive(num, buf); } - if (isDir) { - if (mode & 256) { - mode |= 64; - } - if (mode & 32) { - mode |= 8; - } - if (mode & 4) { - mode |= 1; - } + return buf; + }; + encodePositive = (num, buf) => { + buf[0] = 128; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 255; + num = Math.floor(num / 256); } - return mode; }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js -var require_write_entry = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/write-entry.js"(exports, module2) { - "use strict"; - var { Minipass } = require_minipass(); - var Pax = require_pax(); - var Header = require_header(); - var fs8 = require("fs"); - var path10 = require("path"); - var normPath = require_normalize_windows_path(); - var stripSlash = require_strip_trailing_slashes(); - var prefixPath = (path11, prefix) => { - if (!prefix) { - return normPath(path11); - } - path11 = normPath(path11).replace(/^\.(\/|$)/, ""); - return stripSlash(prefix) + "/" + path11; - }; - var maxReadSize = 16 * 1024 * 1024; - var PROCESS = Symbol("process"); - var FILE = Symbol("file"); - var DIRECTORY = Symbol("directory"); - var SYMLINK = Symbol("symlink"); - var HARDLINK = Symbol("hardlink"); - var HEADER = Symbol("header"); - var READ = Symbol("read"); - var LSTAT = Symbol("lstat"); - var ONLSTAT = Symbol("onlstat"); - var ONREAD = Symbol("onread"); - var ONREADLINK = Symbol("onreadlink"); - var OPENFILE = Symbol("openfile"); - var ONOPENFILE = Symbol("onopenfile"); - var CLOSE = Symbol("close"); - var MODE = Symbol("mode"); - var AWAITDRAIN = Symbol("awaitDrain"); - var ONDRAIN = Symbol("ondrain"); - var PREFIX = Symbol("prefix"); - var HAD_ERROR = Symbol("hadError"); - var warner = require_warn_mixin(); - var winchars = require_winchars(); - var stripAbsolutePath = require_strip_absolute_path(); - var modeFix = require_mode_fix(); - var WriteEntry = warner(class WriteEntry extends Minipass { - constructor(p, opt) { - opt = opt || {}; - super(opt); - if (typeof p !== "string") { - throw new TypeError("path is required"); - } - this.path = normPath(p); - this.portable = !!opt.portable; - this.myuid = process.getuid && process.getuid() || 0; - this.myuser = process.env.USER || ""; - this.maxReadSize = opt.maxReadSize || maxReadSize; - this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); - this.statCache = opt.statCache || /* @__PURE__ */ new Map(); - this.preservePaths = !!opt.preservePaths; - this.cwd = normPath(opt.cwd || process.cwd()); - this.strict = !!opt.strict; - this.noPax = !!opt.noPax; - this.noMtime = !!opt.noMtime; - this.mtime = opt.mtime || null; - this.prefix = opt.prefix ? normPath(opt.prefix) : null; - this.fd = null; - this.blockLen = null; - this.blockRemain = null; - this.buf = null; - this.offset = null; - this.length = null; - this.pos = null; - this.remain = null; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); - } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root) { - this.path = stripped; - pathWarn = root; - } - } - this.win32 = !!opt.win32 || process.platform === "win32"; - if (this.win32) { - this.path = winchars.decode(this.path.replace(/\\/g, "/")); - p = p.replace(/\\/g, "/"); - } - this.absolute = normPath(opt.absolute || path10.resolve(this.cwd, p)); - if (this.path === "") { - this.path = "./"; - } - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); - } - if (this.statCache.has(this.absolute)) { - this[ONLSTAT](this.statCache.get(this.absolute)); + encodeNegative = (num, buf) => { + buf[0] = 255; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 255; + num = Math.floor(num / 256); + if (flipped) { + buf[i - 1] = onesComp(byte); + } else if (byte === 0) { + buf[i - 1] = 0; } else { - this[LSTAT](); + flipped = true; + buf[i - 1] = twosComp(byte); } } - emit(ev, ...data) { - if (ev === "error") { - this[HAD_ERROR] = true; - } - return super.emit(ev, ...data); + }; + parse = (buf) => { + const pre = buf[0]; + const value = pre === 128 ? pos(buf.subarray(1, buf.length)) : pre === 255 ? twos(buf) : null; + if (value === null) { + throw Error("invalid base256 encoding"); } - [LSTAT]() { - fs8.lstat(this.absolute, (er, stat) => { - if (er) { - return this.emit("error", er); - } - this[ONLSTAT](stat); - }); + if (!Number.isSafeInteger(value)) { + throw Error("parsed number outside of javascript safe integer range"); } - [ONLSTAT](stat) { - this.statCache.set(this.absolute, stat); - this.stat = stat; - if (!stat.isFile()) { - stat.size = 0; + return value; + }; + twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } else if (byte === 0) { + f = byte; + } else { + flipped = true; + f = twosComp(byte); } - this.type = getType(stat); - this.emit("stat", stat); - this[PROCESS](); - } - [PROCESS]() { - switch (this.type) { - case "File": - return this[FILE](); - case "Directory": - return this[DIRECTORY](); - case "SymbolicLink": - return this[SYMLINK](); - default: - return this.end(); + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); } } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); - } - [PREFIX](path11) { - return prefixPath(path11, this.prefix); - } - [HEADER]() { - if (this.type === "Directory" && this.portable) { - this.noMtime = true; - } - this.header = new Header({ - path: this[PREFIX](this.path), - // only apply the prefix to hard links. - linkpath: this.type === "Link" ? this[PREFIX](this.linkpath) : this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - mode: this[MODE](this.stat.mode), - uid: this.portable ? null : this.stat.uid, - gid: this.portable ? null : this.stat.gid, - size: this.stat.size, - mtime: this.noMtime ? null : this.mtime || this.stat.mtime, - type: this.type, - uname: this.portable ? null : this.stat.uid === this.myuid ? this.myuser : "", - atime: this.portable ? null : this.stat.atime, - ctime: this.portable ? null : this.stat.ctime - }); - if (this.header.encode() && !this.noPax) { - super.write(new Pax({ - atime: this.portable ? null : this.header.atime, - ctime: this.portable ? null : this.header.ctime, - gid: this.portable ? null : this.header.gid, - mtime: this.noMtime ? null : this.mtime || this.header.mtime, - path: this[PREFIX](this.path), - linkpath: this.type === "Link" ? this[PREFIX](this.linkpath) : this.linkpath, - size: this.header.size, - uid: this.portable ? null : this.header.uid, - uname: this.portable ? null : this.header.uname, - dev: this.portable ? null : this.stat.dev, - ino: this.portable ? null : this.stat.ino, - nlink: this.portable ? null : this.stat.nlink - }).encode()); + return sum; + }; + pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); } - super.write(this.header.block); } - [DIRECTORY]() { - if (this.path.slice(-1) !== "/") { - this.path += "/"; + return sum; + }; + onesComp = (byte) => (255 ^ byte) & 255; + twosComp = (byte) => (255 ^ byte) + 1 & 255; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/types.js +var isCode, name, code; +var init_types = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/types.js"() { + isCode = (c) => name.has(c); + name = /* @__PURE__ */ new Map([ + ["0", "File"], + // same as File + ["", "OldFile"], + ["1", "Link"], + ["2", "SymbolicLink"], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ["3", "CharacterDevice"], + ["4", "BlockDevice"], + ["5", "Directory"], + ["6", "FIFO"], + // same as File + ["7", "ContiguousFile"], + // pax headers + ["g", "GlobalExtendedHeader"], + ["x", "ExtendedHeader"], + // vendor-specific stuff + // skip + ["A", "SolarisACL"], + // like 5, but with data, which should be skipped + ["D", "GNUDumpDir"], + // metadata only, skip + ["I", "Inode"], + // data = link path of next file + ["K", "NextFileHasLongLinkpath"], + // data = path of next file + ["L", "NextFileHasLongPath"], + // skip + ["M", "ContinuationFile"], + // like L + ["N", "OldGnuLongPath"], + // skip + ["S", "SparseFile"], + // skip + ["V", "TapeVolumeHeader"], + // like x + ["X", "OldExtendedHeader"] + ]); + code = new Map(Array.from(name).map((kv) => [kv[1], kv[0]])); + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/header.js +var import_node_path, Header, splitPrefix, decString, decDate, numToDate, decNumber, nanUndef, decSmallNumber, MAXNUM, encNumber, encSmallNumber, octalString, padOctal, encDate, NULLS, encString; +var init_header = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/header.js"() { + import_node_path = require("node:path"); + init_large_numbers(); + init_types(); + Header = class { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = "Unsupported"; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } else if (data) { + this.#slurp(data); } - this.stat.size = 0; - this[HEADER](); - this.end(); - } - [SYMLINK]() { - fs8.readlink(this.absolute, (er, linkpath) => { - if (er) { - return this.emit("error", er); - } - this[ONREADLINK](linkpath); - }); - } - [ONREADLINK](linkpath) { - this.linkpath = normPath(linkpath); - this[HEADER](); - this.end(); - } - [HARDLINK](linkpath) { - this.type = "Link"; - this.linkpath = normPath(path10.relative(this.cwd, linkpath)); - this.stat.size = 0; - this[HEADER](); - this.end(); } - [FILE]() { - if (this.stat.nlink > 1) { - const linkKey = this.stat.dev + ":" + this.stat.ino; - if (this.linkCache.has(linkKey)) { - const linkpath = this.linkCache.get(linkKey); - if (linkpath.indexOf(this.cwd) === 0) { - return this[HARDLINK](linkpath); - } - } - this.linkCache.set(linkKey, this.absolute); + decode(buf, off, ex, gex) { + if (!off) { + off = 0; } - this[HEADER](); - if (this.stat.size === 0) { - return this.end(); + if (!buf || !(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); } - this[OPENFILE](); - } - [OPENFILE]() { - fs8.open(this.absolute, "r", (er, fd) => { - if (er) { - return this.emit("error", er); - } - this[ONOPENFILE](fd); - }); - } - [ONOPENFILE](fd) { - this.fd = fd; - if (this[HAD_ERROR]) { - return this[CLOSE](); + 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 (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + const t = decString(buf, off + 156, 1); + if (isCode(t)) { + this.#type = t || "0"; + } + if (this.#type === "0" && this.path.slice(-1) === "/") { + this.#type = "5"; + } + if (this.#type === "5") { + this.size = 0; } - this.blockLen = 512 * Math.ceil(this.stat.size / 512); - this.blockRemain = this.blockLen; - const bufLen = Math.min(this.blockLen, this.maxReadSize); - this.buf = Buffer.allocUnsafe(bufLen); - this.offset = 0; - this.pos = 0; - this.remain = this.stat.size; - this.length = this.buf.length; - this[READ](); - } - [READ]() { - const { fd, buf, offset, length, pos } = this; - fs8.read(fd, buf, offset, length, pos, (er, bytesRead) => { - if (er) { - return this[CLOSE](() => this.emit("error", er)); + this.linkpath = decString(buf, off + 157, 100); + if (buf.subarray(off + 257, off + 265).toString() === "ustar\x0000") { + 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; + if (buf[off + 475] !== 0) { + const prefix = decString(buf, off + 345, 155); + this.path = prefix + "/" + this.path; + } else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + "/" + this.path; + } + this.atime = ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12); + this.ctime = ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12); } - this[ONREAD](bytesRead); - }); - } - [CLOSE](cb) { - fs8.close(this.fd, cb); - } - [ONREAD](bytesRead) { - if (bytesRead <= 0 && this.remain > 0) { - const er = new Error("encountered unexpected EOF"); - er.path = this.absolute; - er.syscall = "read"; - er.code = "EOF"; - return this[CLOSE](() => this.emit("error", er)); } - if (bytesRead > this.remain) { - const er = new Error("did not encounter expected EOF"); - er.path = this.absolute; - er.syscall = "read"; - er.code = "EOF"; - return this[CLOSE](() => this.emit("error", er)); + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - if (bytesRead === this.remain) { - for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { - this.buf[i + this.offset] = 0; - bytesRead++; - this.remain++; - } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; } - const writeBuf = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.slice(this.offset, this.offset + bytesRead); - const flushed = this.write(writeBuf); - if (!flushed) { - this[AWAITDRAIN](() => this[ONDRAIN]()); - } else { - this[ONDRAIN](); + this.cksumValid = sum === this.cksum; + if (this.cksum === void 0 && sum === 8 * 32) { + this.nullBlock = true; } } - [AWAITDRAIN](cb) { - this.once("drain", cb); + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + return !(v === null || v === void 0 || k === "path" && gex || k === "linkpath" && gex || k === "global"); + }))); } - write(writeBuf) { - if (this.blockRemain < writeBuf.length) { - const er = new Error("writing more data than expected"); - er.path = this.absolute; - return this.emit("error", er); + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); } - this.remain -= writeBuf.length; - this.blockRemain -= writeBuf.length; - this.pos += writeBuf.length; - this.offset += writeBuf.length; - return super.write(writeBuf); - } - [ONDRAIN]() { - if (!this.remain) { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); - } - return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); + if (this.#type === "Unsupported") { + this.#type = "0"; + } + if (!(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); + } + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || "", prefixSize); + const path16 = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path16) || this.needPax; + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write("ustar\x0000", off + 257, 8); + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; + } else { + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; } - if (this.offset >= this.length) { - this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); - this.offset = 0; + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - this.length = this.buf.length - this.offset; - this[READ](); + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; } - }); - var WriteEntrySync = class extends WriteEntry { - [LSTAT]() { - this[ONLSTAT](fs8.lstatSync(this.absolute)); + get type() { + return this.#type === "Unsupported" ? this.#type : name.get(this.#type); } - [SYMLINK]() { - this[ONREADLINK](fs8.readlinkSync(this.absolute)); + get typeKey() { + return this.#type; } - [OPENFILE]() { - this[ONOPENFILE](fs8.openSync(this.absolute, "r")); + set type(type) { + const c = String(code.get(type)); + if (isCode(c) || c === "Unsupported") { + this.#type = c; + } else if (isCode(type)) { + this.#type = type; + } else { + throw new TypeError("invalid entry type: " + type); + } } - [READ]() { - let threw = true; - try { - const { fd, buf, offset, length, pos } = this; - const bytesRead = fs8.readSync(fd, buf, offset, length, pos); - this[ONREAD](bytesRead); - threw = false; - } finally { - if (threw) { - try { - this[CLOSE](() => { - }); - } catch (er) { - } + }; + splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ""; + let ret = void 0; + const root = import_node_path.posix.parse(p).root || "."; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } else { + prefix = import_node_path.posix.dirname(pp); + pp = import_node_path.posix.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp, prefix, false]; + } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } else { + pp = import_node_path.posix.join(import_node_path.posix.basename(prefix), pp); + prefix = import_node_path.posix.dirname(prefix); } + } while (prefix !== root && ret === void 0); + if (!ret) { + ret = [p.slice(0, pathSize - 1), "", true]; } } - [AWAITDRAIN](cb) { - cb(); - } - [CLOSE](cb) { - fs8.closeSync(this.fd); - cb(); - } + return ret; }; - var WriteEntryTar = warner(class WriteEntryTar extends Minipass { - constructor(readEntry, opt) { - opt = opt || {}; - super(opt); - this.preservePaths = !!opt.preservePaths; - this.portable = !!opt.portable; - this.strict = !!opt.strict; - this.noPax = !!opt.noPax; - this.noMtime = !!opt.noMtime; - this.readEntry = readEntry; - this.type = readEntry.type; - if (this.type === "Directory" && this.portable) { - this.noMtime = true; + decString = (buf, off, size) => buf.subarray(off, off + size).toString("utf8").replace(/\0.*/, ""); + decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); + numToDate = (num) => num === void 0 ? void 0 : new Date(num * 1e3); + decNumber = (buf, off, size) => Number(buf[off]) & 128 ? parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); + nanUndef = (value) => isNaN(value) ? void 0 : value; + decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf.subarray(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), 8)); + MAXNUM = { + 12: 8589934591, + 8: 2097151 + }; + encNumber = (buf, off, size, num) => num === void 0 ? false : num > MAXNUM[size] || num < 0 ? (encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); + encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, "ascii"); + octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); + padOctal = (str, size) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join("0") + str + " ") + "\0"; + encDate = (buf, off, size, date) => date === void 0 ? false : encNumber(buf, off, size, date.getTime() / 1e3); + NULLS = new Array(156).join("\0"); + encString = (buf, off, size, str) => str === void 0 ? false : (buf.write(str + NULLS, off, size, "utf8"), str.length !== Buffer.byteLength(str) || str.length > size); + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/pax.js +var import_node_path2, Pax, merge, parseKV, parseKVLine; +var init_pax = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/pax.js"() { + import_node_path2 = require("node:path"); + init_header(); + Pax = class _Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global2 = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global2; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; + } + encode() { + const body = this.encodeBody(); + if (body === "") { + return Buffer.allocUnsafe(0); } - this.prefix = opt.prefix || null; - this.path = normPath(readEntry.path); - this.mode = this[MODE](readEntry.mode); - this.uid = this.portable ? null : readEntry.uid; - this.gid = this.portable ? null : readEntry.gid; - this.uname = this.portable ? null : readEntry.uname; - this.gname = this.portable ? null : readEntry.gname; - this.size = readEntry.size; - this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime; - this.atime = this.portable ? null : readEntry.atime; - this.ctime = this.portable ? null : readEntry.ctime; - this.linkpath = normPath(readEntry.linkpath); - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); + const bodyLen = Buffer.byteLength(body); + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + for (let i = 0; i < 512; i++) { + buf[i] = 0; } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root) { - this.path = stripped; - pathWarn = root; - } + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ("PaxHeader/" + (0, import_node_path2.basename)(this.path ?? "")).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 420, + uid: this.uid, + gid: this.gid, + size: bodyLen, + mtime: this.mtime, + type: this.global ? "GlobalExtendedHeader" : "ExtendedHeader", + linkpath: "", + uname: this.uname || "", + gname: this.gname || "", + devmaj: 0, + devmin: 0, + atime: this.atime, + ctime: this.ctime + }).encode(buf); + buf.write(body, 512, bodyLen, "utf8"); + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; } - this.remain = readEntry.size; - this.blockRemain = readEntry.startBlockSize; - this.header = new Header({ - path: this[PREFIX](this.path), - linkpath: this.type === "Link" ? this[PREFIX](this.linkpath) : this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - mode: this.mode, - uid: this.portable ? null : this.uid, - gid: this.portable ? null : this.gid, - size: this.size, - mtime: this.noMtime ? null : this.mtime, - type: this.type, - uname: this.portable ? null : this.uname, - atime: this.portable ? null : this.atime, - ctime: this.portable ? null : this.ctime - }); - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); + return buf; + } + encodeBody() { + return this.encodeField("path") + this.encodeField("ctime") + this.encodeField("atime") + this.encodeField("dev") + this.encodeField("ino") + this.encodeField("nlink") + this.encodeField("charset") + this.encodeField("comment") + this.encodeField("gid") + this.encodeField("gname") + this.encodeField("linkpath") + this.encodeField("mtime") + this.encodeField("size") + this.encodeField("uid") + this.encodeField("uname"); + } + encodeField(field) { + if (this[field] === void 0) { + return ""; } - if (this.header.encode() && !this.noPax) { - super.write(new Pax({ - atime: this.portable ? null : this.atime, - ctime: this.portable ? null : this.ctime, - gid: this.portable ? null : this.gid, - mtime: this.noMtime ? null : this.mtime, - path: this[PREFIX](this.path), - linkpath: this.type === "Link" ? this[PREFIX](this.linkpath) : this.linkpath, - size: this.size, - uid: this.portable ? null : this.uid, - uname: this.portable ? null : this.uname, - dev: this.portable ? null : this.readEntry.dev, - ino: this.portable ? null : this.readEntry.ino, - nlink: this.portable ? null : this.readEntry.nlink - }).encode()); + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1e3 : r; + const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; + const byteLen = Buffer.byteLength(s); + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; } - super.write(this.header.block); - readEntry.pipe(this); - } - [PREFIX](path11) { - return prefixPath(path11, this.prefix); + const len = digits + byteLen; + return len + s; } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); + static parse(str, ex, g = false) { + return new _Pax(merge(parseKV(str), ex), g); } - write(data) { - const writeLen = data.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); - } - this.blockRemain -= writeLen; - return super.write(data); + }; + merge = (a, b) => b ? Object.assign({}, b, a) : a; + parseKV = (str) => str.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); + parseKVLine = (set, line) => { + const n = parseInt(line, 10); + if (n !== Buffer.byteLength(line) + 1) { + return set; } - end() { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); - } - return super.end(); + line = line.slice((n + " ").length); + const kv = line.split("="); + const r = kv.shift(); + if (!r) { + return set; } - }); - WriteEntry.Sync = WriteEntrySync; - WriteEntry.Tar = WriteEntryTar; - var getType = (stat) => stat.isFile() ? "File" : stat.isDirectory() ? "Directory" : stat.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; - module2.exports = WriteEntry; + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); + const v = kv.join("="); + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(Number(v) * 1e3) : /^[0-9]+$/.test(v) ? +v : v; + return set; + }; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js -var require_pack = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/pack.js"(exports, module2) { - "use strict"; - var PackJob = class { - constructor(path11, absolute) { - this.path = path11 || "./"; - this.absolute = absolute; - this.entry = null; - this.stat = null; - this.readdir = null; - this.pending = false; - this.ignore = false; - this.piped = false; - } - }; - var { Minipass } = require_minipass(); - var zlib = require_minizlib(); - var ReadEntry = require_read_entry(); - var WriteEntry = require_write_entry(); - var WriteEntrySync = WriteEntry.Sync; - var WriteEntryTar = WriteEntry.Tar; - var Yallist = require_yallist(); - var EOF = Buffer.alloc(1024); - var ONSTAT = Symbol("onStat"); - var ENDED = Symbol("ended"); - var QUEUE = Symbol("queue"); - var CURRENT = Symbol("current"); - var PROCESS = Symbol("process"); - var PROCESSING = Symbol("processing"); - var PROCESSJOB = Symbol("processJob"); - var JOBS = Symbol("jobs"); - var JOBDONE = Symbol("jobDone"); - var ADDFSENTRY = Symbol("addFSEntry"); - var ADDTARENTRY = Symbol("addTarEntry"); - var STAT = Symbol("stat"); - var READDIR = Symbol("readdir"); - var ONREADDIR = Symbol("onreaddir"); - var PIPE = Symbol("pipe"); - var ENTRY = Symbol("entry"); - var ENTRYOPT = Symbol("entryOpt"); - var WRITEENTRYCLASS = Symbol("writeEntryClass"); - var WRITE = Symbol("write"); - var ONDRAIN = Symbol("ondrain"); - var fs8 = require("fs"); - var path10 = require("path"); - var warner = require_warn_mixin(); - var normPath = require_normalize_windows_path(); - var Pack = warner(class Pack extends Minipass { - constructor(opt) { - super(opt); - opt = opt || /* @__PURE__ */ Object.create(null); - this.opt = opt; - this.file = opt.file || ""; - this.cwd = opt.cwd || process.cwd(); - this.maxReadSize = opt.maxReadSize; - this.preservePaths = !!opt.preservePaths; - this.strict = !!opt.strict; - this.noPax = !!opt.noPax; - this.prefix = normPath(opt.prefix || ""); - this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); - this.statCache = opt.statCache || /* @__PURE__ */ new Map(); - this.readdirCache = opt.readdirCache || /* @__PURE__ */ new Map(); - this[WRITEENTRYCLASS] = WriteEntry; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/normalize-windows-path.js +var platform, normalizeWindowsPath; +var init_normalize_windows_path = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/normalize-windows-path.js"() { + platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + normalizeWindowsPath = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/read-entry.js +var ReadEntry; +var init_read_entry = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/read-entry.js"() { + init_esm(); + init_normalize_windows_path(); + ReadEntry = class extends Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; + path; + mode; + uid; + gid; + uname; + gname; + size = 0; + mtime; + atime; + ctime; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + this.remain = header.size ?? 0; + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (this.type) { + case "File": + case "OldFile": + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + case "ContiguousFile": + case "GNUDumpDir": + break; + case "NextFileHasLongLinkpath": + case "NextFileHasLongPath": + case "OldGnuLongPath": + case "GlobalExtendedHeader": + case "ExtendedHeader": + case "OldExtendedHeader": + this.meta = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; } - this.portable = !!opt.portable; - this.zip = null; - if (opt.gzip || opt.brotli) { - if (opt.gzip && opt.brotli) { - throw new TypeError("gzip and brotli are mutually exclusive"); - } - if (opt.gzip) { - if (typeof opt.gzip !== "object") { - opt.gzip = {}; - } - if (this.portable) { - opt.gzip.portable = true; - } - this.zip = new zlib.Gzip(opt.gzip); - } - if (opt.brotli) { - if (typeof opt.brotli !== "object") { - opt.brotli = {}; - } - this.zip = new zlib.BrotliCompress(opt.brotli); - } - this.zip.on("data", (chunk) => super.write(chunk)); - this.zip.on("end", (_) => super.end()); - this.zip.on("drain", (_) => this[ONDRAIN]()); - this.on("resume", (_) => this.zip.resume()); - } else { - this.on("drain", this[ONDRAIN]); + if (!header.path) { + throw new Error("no path provided for tar.ReadEntry"); } - this.noDirRecurse = !!opt.noDirRecurse; - this.follow = !!opt.follow; - this.noMtime = !!opt.noMtime; - this.mtime = opt.mtime || null; - this.filter = typeof opt.filter === "function" ? opt.filter : (_) => true; - this[QUEUE] = new Yallist(); - this[JOBS] = 0; - this.jobs = +opt.jobs || 4; - this[PROCESSING] = false; - this[ENDED] = false; - } - [WRITE](chunk) { - return super.write(chunk); - } - add(path11) { - this.write(path11); - return this; - } - end(path11) { - if (path11) { - this.write(path11); + this.path = normalizeWindowsPath(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 4095; + } + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : void 0; + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); + } + if (gex) { + this.#slurp(gex, true); } - this[ENDED] = true; - this[PROCESS](); - return this; } - write(path11) { - if (this[ENDED]) { - throw new Error("write after end"); + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); } - if (path11 instanceof ReadEntry) { - this[ADDTARENTRY](path11); - } else { - this[ADDFSENTRY](path11); + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; } - return this.flowing; - } - [ADDTARENTRY](p) { - const absolute = normPath(path10.resolve(this.cwd, p.path)); - if (!this.filter(p.path, p)) { - p.resume(); - } else { - const job = new PackJob(p.path, absolute, false); - job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)); - job.entry.on("end", (_) => this[JOBDONE](job)); - this[JOBS] += 1; - this[QUEUE].push(job); + if (r >= writeLen) { + return super.write(data); } - this[PROCESS](); - } - [ADDFSENTRY](p) { - const absolute = normPath(path10.resolve(this.cwd, p)); - this[QUEUE].push(new PackJob(p, absolute)); - this[PROCESS](); + return super.write(data.subarray(0, r)); } - [STAT](job) { - job.pending = true; - this[JOBS] += 1; - const stat = this.follow ? "stat" : "lstat"; - fs8[stat](job.absolute, (er, stat2) => { - job.pending = false; - this[JOBS] -= 1; - if (er) { - this.emit("error", er); - } else { - this[ONSTAT](job, stat2); - } - }); + #slurp(ex, gex = false) { + if (ex.path) + ex.path = normalizeWindowsPath(ex.path); + if (ex.linkpath) + ex.linkpath = normalizeWindowsPath(ex.linkpath); + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + return !(v === null || v === void 0 || k === "path" && gex); + }))); } - [ONSTAT](job, stat) { - this.statCache.set(job.absolute, stat); - job.stat = stat; - if (!this.filter(job.path, stat)) { - job.ignore = true; - } - this[PROCESS](); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/warn-method.js +var warnMethod; +var init_warn_method = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/warn-method.js"() { + warnMethod = (self2, code2, message, data = {}) => { + if (self2.file) { + data.file = self2.file; + } + if (self2.cwd) { + data.cwd = self2.cwd; + } + data.code = message instanceof Error && message.code || code2; + data.tarCode = code2; + if (!self2.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; + } + self2.emit("warn", code2, message, data); + } else if (message instanceof Error) { + self2.emit("error", Object.assign(message, data)); + } else { + self2.emit("error", Object.assign(new Error(`${code2}: ${message}`), data)); } - [READDIR](job) { - job.pending = true; - this[JOBS] += 1; - fs8.readdir(job.absolute, (er, entries) => { - job.pending = false; - this[JOBS] -= 1; - if (er) { - return this.emit("error", er); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/parse.js +var import_events3, maxMetaEntrySize, gzipHeader, zstdHeader, ZIP_HEADER_LEN, STATE, WRITEENTRY, READENTRY, NEXTENTRY, PROCESSENTRY, EX, GEX, META, EMITMETA, BUFFER2, QUEUE, ENDED, EMITTEDEND, EMIT, UNZIP, CONSUMECHUNK, CONSUMECHUNKSUB, CONSUMEBODY, CONSUMEMETA, CONSUMEHEADER, CONSUMING, BUFFERCONCAT, MAYBEEND, WRITING, ABORTED2, DONE, SAW_VALID_ENTRY, SAW_NULL_BLOCK, SAW_EOF, CLOSESTREAM, noop2, Parser; +var init_parse = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/parse.js"() { + import_events3 = require("events"); + init_esm3(); + init_header(); + init_pax(); + init_read_entry(); + init_warn_method(); + maxMetaEntrySize = 1024 * 1024; + gzipHeader = Buffer.from([31, 139]); + zstdHeader = Buffer.from([40, 181, 47, 253]); + ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length); + STATE = Symbol("state"); + WRITEENTRY = Symbol("writeEntry"); + READENTRY = Symbol("readEntry"); + NEXTENTRY = Symbol("nextEntry"); + PROCESSENTRY = Symbol("processEntry"); + EX = Symbol("extendedHeader"); + GEX = Symbol("globalExtendedHeader"); + META = Symbol("meta"); + EMITMETA = Symbol("emitMeta"); + BUFFER2 = Symbol("buffer"); + QUEUE = Symbol("queue"); + ENDED = Symbol("ended"); + EMITTEDEND = Symbol("emittedEnd"); + EMIT = Symbol("emit"); + UNZIP = Symbol("unzip"); + CONSUMECHUNK = Symbol("consumeChunk"); + CONSUMECHUNKSUB = Symbol("consumeChunkSub"); + CONSUMEBODY = Symbol("consumeBody"); + CONSUMEMETA = Symbol("consumeMeta"); + CONSUMEHEADER = Symbol("consumeHeader"); + CONSUMING = Symbol("consuming"); + BUFFERCONCAT = Symbol("bufferConcat"); + MAYBEEND = Symbol("maybeEnd"); + WRITING = Symbol("writing"); + ABORTED2 = Symbol("aborted"); + DONE = Symbol("onDone"); + SAW_VALID_ENTRY = Symbol("sawValidEntry"); + SAW_NULL_BLOCK = Symbol("sawNullBlock"); + SAW_EOF = Symbol("sawEOF"); + CLOSESTREAM = Symbol("closeStream"); + noop2 = () => true; + Parser = class extends import_events3.EventEmitter { + file; + strict; + maxMetaEntrySize; + filter; + brotli; + zstd; + writable = true; + readable = false; + [QUEUE] = []; + [BUFFER2]; + [READENTRY]; + [WRITEENTRY]; + [STATE] = "begin"; + [META] = ""; + [EX]; + [GEX]; + [ENDED] = false; + [UNZIP]; + [ABORTED2] = false; + [SAW_VALID_ENTRY]; + [SAW_NULL_BLOCK] = false; + [SAW_EOF] = false; + [WRITING] = false; + [CONSUMING] = false; + [EMITTEDEND] = false; + constructor(opt = {}) { + super(); + this.file = opt.file || ""; + this.on(DONE, () => { + if (this[STATE] === "begin" || this[SAW_VALID_ENTRY] === false) { + this.warn("TAR_BAD_ARCHIVE", "Unrecognized archive format"); } - this[ONREADDIR](job, entries); }); - } - [ONREADDIR](job, entries) { - this.readdirCache.set(job.absolute, entries); - job.readdir = entries; - this[PROCESS](); - } - [PROCESS]() { - if (this[PROCESSING]) { - return; + if (opt.ondone) { + this.on(DONE, opt.ondone); + } else { + this.on(DONE, () => { + this.emit("prefinish"); + this.emit("finish"); + this.emit("end"); + }); } - this[PROCESSING] = true; - for (let w = this[QUEUE].head; w !== null && this[JOBS] < this.jobs; w = w.next) { - this[PROCESSJOB](w.value); - if (w.value.ignore) { - const p = w.next; - this[QUEUE].removeNode(w); - w.next = p; - } + this.strict = !!opt.strict; + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; + this.filter = typeof opt.filter === "function" ? opt.filter : noop2; + const isTBR = opt.file && (opt.file.endsWith(".tar.br") || opt.file.endsWith(".tbr")); + this.brotli = !(opt.gzip || opt.zstd) && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; + const isTZST = opt.file && (opt.file.endsWith(".tar.zst") || opt.file.endsWith(".tzst")); + this.zstd = !(opt.gzip || opt.brotli) && opt.zstd !== void 0 ? opt.zstd : isTZST ? true : void 0; + this.on("end", () => this[CLOSESTREAM]()); + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - this[PROCESSING] = false; - if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { - if (this.zip) { - this.zip.end(EOF); - } else { - super.write(EOF); - super.end(); - } + if (typeof opt.onReadEntry === "function") { + this.on("entry", opt.onReadEntry); } } - get [CURRENT]() { - return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value; - } - [JOBDONE](job) { - this[QUEUE].shift(); - this[JOBS] -= 1; - this[PROCESS](); + warn(code2, message, data = {}) { + warnMethod(this, code2, message, data); } - [PROCESSJOB](job) { - if (job.pending) { - return; + [CONSUMEHEADER](chunk, position) { + if (this[SAW_VALID_ENTRY] === void 0) { + this[SAW_VALID_ENTRY] = false; } - if (job.entry) { - if (job === this[CURRENT] && !job.piped) { - this[PIPE](job); - } - return; + let header; + try { + header = new Header(chunk, position, this[EX], this[GEX]); + } catch (er) { + return this.warn("TAR_ENTRY_INVALID", er); } - if (!job.stat) { - if (this.statCache.has(job.absolute)) { - this[ONSTAT](job, this.statCache.get(job.absolute)); + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true; + if (this[STATE] === "begin") { + this[STATE] = "header"; + } + this[EMIT]("eof"); } else { - this[STAT](job); + this[SAW_NULL_BLOCK] = true; + this[EMIT]("nullBlock"); } - } - if (!job.stat) { - return; - } - if (job.ignore) { - return; - } - if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { - if (this.readdirCache.has(job.absolute)) { - this[ONREADDIR](job, this.readdirCache.get(job.absolute)); + } else { + this[SAW_NULL_BLOCK] = false; + if (!header.cksumValid) { + this.warn("TAR_ENTRY_INVALID", "checksum failure", { header }); + } else if (!header.path) { + this.warn("TAR_ENTRY_INVALID", "path is required", { header }); } else { - this[READDIR](job); - } - if (!job.readdir) { - return; + const type = header.type; + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { + this.warn("TAR_ENTRY_INVALID", "linkpath required", { + header + }); + } else if (!/^(Symbolic)?Link$/.test(type) && !/^(Global)?ExtendedHeader$/.test(type) && header.linkpath) { + this.warn("TAR_ENTRY_INVALID", "linkpath forbidden", { + header + }); + } else { + const entry = this[WRITEENTRY] = new ReadEntry(header, this[EX], this[GEX]); + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + const onend = () => { + if (!entry.invalid) { + this[SAW_VALID_ENTRY] = true; + } + }; + entry.on("end", onend); + } else { + this[SAW_VALID_ENTRY] = true; + } + } + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true; + this[EMIT]("ignoredEntry", entry); + this[STATE] = "ignore"; + entry.resume(); + } else if (entry.size > 0) { + this[META] = ""; + entry.on("data", (c) => this[META] += c); + this[STATE] = "meta"; + } + } else { + this[EX] = void 0; + entry.ignore = entry.ignore || !this.filter(entry.path, entry); + if (entry.ignore) { + this[EMIT]("ignoredEntry", entry); + this[STATE] = entry.remain ? "ignore" : "header"; + entry.resume(); + } else { + if (entry.remain) { + this[STATE] = "body"; + } else { + this[STATE] = "header"; + entry.end(); + } + if (!this[READENTRY]) { + this[QUEUE].push(entry); + this[NEXTENTRY](); + } else { + this[QUEUE].push(entry); + } + } + } + } } } - job.entry = this[ENTRY](job); - if (!job.entry) { - job.ignore = true; - return; - } - if (job === this[CURRENT] && !job.piped) { - this[PIPE](job); - } } - [ENTRYOPT](job) { - return { - onwarn: (code, msg, data) => this.warn(code, msg, data), - noPax: this.noPax, - cwd: this.cwd, - absolute: job.absolute, - preservePaths: this.preservePaths, - maxReadSize: this.maxReadSize, - strict: this.strict, - portable: this.portable, - linkCache: this.linkCache, - statCache: this.statCache, - noMtime: this.noMtime, - mtime: this.mtime, - prefix: this.prefix - }; + [CLOSESTREAM]() { + queueMicrotask(() => this.emit("close")); } - [ENTRY](job) { - this[JOBS] += 1; - try { - return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)).on("end", () => this[JOBDONE](job)).on("error", (er) => this.emit("error", er)); - } catch (er) { - this.emit("error", er); + [PROCESSENTRY](entry) { + let go = true; + if (!entry) { + this[READENTRY] = void 0; + go = false; + } else if (Array.isArray(entry)) { + const [ev, ...args] = entry; + this.emit(ev, ...args); + } else { + this[READENTRY] = entry; + this.emit("entry", entry); + if (!entry.emittedEnd) { + entry.on("end", () => this[NEXTENTRY]()); + go = false; + } + } + return go; + } + [NEXTENTRY]() { + do { + } while (this[PROCESSENTRY](this[QUEUE].shift())); + if (!this[QUEUE].length) { + const re = this[READENTRY]; + const drainNow = !re || re.flowing || re.size === re.remain; + if (drainNow) { + if (!this[WRITING]) { + this.emit("drain"); + } + } else { + re.once("drain", () => this.emit("drain")); + } } } - [ONDRAIN]() { - if (this[CURRENT] && this[CURRENT].entry) { - this[CURRENT].entry.resume(); + [CONSUMEBODY](chunk, position) { + const entry = this[WRITEENTRY]; + if (!entry) { + throw new Error("attempt to consume body without entry??"); + } + const br = entry.blockRemain ?? 0; + const c = br >= chunk.length && position === 0 ? chunk : chunk.subarray(position, position + br); + entry.write(c); + if (!entry.blockRemain) { + this[STATE] = "header"; + this[WRITEENTRY] = void 0; + entry.end(); } + return c.length; } - // like .pipe() but using super, because our write() is special - [PIPE](job) { - job.piped = true; - if (job.readdir) { - job.readdir.forEach((entry) => { - const p = job.path; - const base = p === "./" ? "" : p.replace(/\/*$/, "/"); - this[ADDFSENTRY](base + entry); - }); + [CONSUMEMETA](chunk, position) { + const entry = this[WRITEENTRY]; + const ret = this[CONSUMEBODY](chunk, position); + if (!this[WRITEENTRY] && entry) { + this[EMITMETA](entry); } - const source = job.entry; - const zip = this.zip; - if (zip) { - source.on("data", (chunk) => { - if (!zip.write(chunk)) { - source.pause(); - } - }); + return ret; + } + [EMIT](ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) { + this.emit(ev, data, extra); } else { - source.on("data", (chunk) => { - if (!super.write(chunk)) { - source.pause(); - } - }); + this[QUEUE].push([ev, data, extra]); } } - pause() { - if (this.zip) { - this.zip.pause(); + [EMITMETA](entry) { + this[EMIT]("meta", this[META]); + switch (entry.type) { + case "ExtendedHeader": + case "OldExtendedHeader": + this[EX] = Pax.parse(this[META], this[EX], false); + break; + case "GlobalExtendedHeader": + this[GEX] = Pax.parse(this[META], this[GEX], true); + break; + case "NextFileHasLongPath": + case "OldGnuLongPath": { + const ex = this[EX] ?? /* @__PURE__ */ Object.create(null); + this[EX] = ex; + ex.path = this[META].replace(/\0.*/, ""); + break; + } + case "NextFileHasLongLinkpath": { + const ex = this[EX] || /* @__PURE__ */ Object.create(null); + this[EX] = ex; + ex.linkpath = this[META].replace(/\0.*/, ""); + break; + } + /* c8 ignore start */ + default: + throw new Error("unknown meta: " + entry.type); } - return super.pause(); - } - }); - var PackSync = class extends Pack { - constructor(opt) { - super(opt); - this[WRITEENTRYCLASS] = WriteEntrySync; - } - // pause/resume are no-ops in sync streams. - pause() { - } - resume() { } - [STAT](job) { - const stat = this.follow ? "statSync" : "lstatSync"; - this[ONSTAT](job, fs8[stat](job.absolute)); - } - [READDIR](job, stat) { - this[ONREADDIR](job, fs8.readdirSync(job.absolute)); + abort(error) { + this[ABORTED2] = true; + this.emit("abort", error); + this.warn("TAR_ABORT", error, { recoverable: false }); } - // gotta get it all in this tick - [PIPE](job) { - const source = job.entry; - const zip = this.zip; - if (job.readdir) { - job.readdir.forEach((entry) => { - const p = job.path; - const base = p === "./" ? "" : p.replace(/\/*$/, "/"); - this[ADDFSENTRY](base + entry); - }); + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from( + chunk, + /* c8 ignore next */ + typeof encoding === "string" ? encoding : "utf8" + ); } - if (zip) { - source.on("data", (chunk) => { - zip.write(chunk); - }); + if (this[ABORTED2]) { + cb?.(); + return false; + } + const needSniff = this[UNZIP] === void 0 || this.brotli === void 0 && this[UNZIP] === false; + if (needSniff && chunk) { + if (this[BUFFER2]) { + chunk = Buffer.concat([this[BUFFER2], chunk]); + this[BUFFER2] = void 0; + } + if (chunk.length < ZIP_HEADER_LEN) { + this[BUFFER2] = chunk; + cb?.(); + return true; + } + for (let i = 0; this[UNZIP] === void 0 && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) { + this[UNZIP] = false; + } + } + let isZstd = false; + if (this[UNZIP] === false && this.zstd !== false) { + isZstd = true; + for (let i = 0; i < zstdHeader.length; i++) { + if (chunk[i] !== zstdHeader[i]) { + isZstd = false; + break; + } + } + } + const maybeBrotli = this.brotli === void 0 && !isZstd; + if (this[UNZIP] === false && maybeBrotli) { + if (chunk.length < 512) { + if (this[ENDED]) { + this.brotli = true; + } else { + this[BUFFER2] = chunk; + cb?.(); + return true; + } + } else { + try { + new Header(chunk.subarray(0, 512)); + this.brotli = false; + } catch (_) { + this.brotli = true; + } + } + } + if (this[UNZIP] === void 0 || this[UNZIP] === false && (this.brotli || isZstd)) { + const ended = this[ENDED]; + this[ENDED] = false; + this[UNZIP] = this[UNZIP] === void 0 ? new Unzip({}) : isZstd ? new ZstdDecompress({}) : new BrotliDecompress({}); + this[UNZIP].on("data", (chunk2) => this[CONSUMECHUNK](chunk2)); + this[UNZIP].on("error", (er) => this.abort(er)); + this[UNZIP].on("end", () => { + this[ENDED] = true; + this[CONSUMECHUNK](); + }); + this[WRITING] = true; + const ret2 = !!this[UNZIP][ended ? "end" : "write"](chunk); + this[WRITING] = false; + cb?.(); + return ret2; + } + } + this[WRITING] = true; + if (this[UNZIP]) { + this[UNZIP].write(chunk); } else { - source.on("data", (chunk) => { - super[WRITE](chunk); - }); + this[CONSUMECHUNK](chunk); } + this[WRITING] = false; + const ret = this[QUEUE].length ? false : this[READENTRY] ? this[READENTRY].flowing : true; + if (!ret && !this[QUEUE].length) { + this[READENTRY]?.once("drain", () => this.emit("drain")); + } + cb?.(); + return ret; } - }; - Pack.Sync = PackSync; - module2.exports = Pack; - } -}); - -// .yarn/cache/fs-minipass-npm-2.1.0-501ef87306-703d16522b.zip/node_modules/fs-minipass/index.js -var require_fs_minipass = __commonJS({ - ".yarn/cache/fs-minipass-npm-2.1.0-501ef87306-703d16522b.zip/node_modules/fs-minipass/index.js"(exports) { - "use strict"; - var MiniPass = require_minipass2(); - var EE = require("events").EventEmitter; - var fs8 = require("fs"); - var writev = fs8.writev; - if (!writev) { - const binding = process.binding("fs"); - const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback; - writev = (fd, iovec, pos, cb) => { - const done = (er, bw) => cb(er, bw, iovec); - const req = new FSReqWrap(); - req.oncomplete = done; - binding.writeBuffers(fd, iovec, pos, req); - }; - } - var _autoClose = Symbol("_autoClose"); - var _close = Symbol("_close"); - var _ended = Symbol("_ended"); - var _fd = Symbol("_fd"); - var _finished = Symbol("_finished"); - var _flags = Symbol("_flags"); - var _flush = Symbol("_flush"); - var _handleChunk = Symbol("_handleChunk"); - var _makeBuf = Symbol("_makeBuf"); - var _mode = Symbol("_mode"); - var _needDrain = Symbol("_needDrain"); - var _onerror = Symbol("_onerror"); - var _onopen = Symbol("_onopen"); - var _onread = Symbol("_onread"); - var _onwrite = Symbol("_onwrite"); - var _open = Symbol("_open"); - var _path = Symbol("_path"); - var _pos = Symbol("_pos"); - var _queue = Symbol("_queue"); - var _read = Symbol("_read"); - var _readSize = Symbol("_readSize"); - var _reading = Symbol("_reading"); - var _remain = Symbol("_remain"); - var _size = Symbol("_size"); - var _write = Symbol("_write"); - var _writing = Symbol("_writing"); - var _defaultFlag = Symbol("_defaultFlag"); - var _errored = Symbol("_errored"); - var ReadStream = class extends MiniPass { - constructor(path10, opt) { - opt = opt || {}; - super(opt); - this.readable = true; - this.writable = false; - if (typeof path10 !== "string") - throw new TypeError("path must be a string"); - this[_errored] = false; - this[_fd] = typeof opt.fd === "number" ? opt.fd : null; - this[_path] = path10; - this[_readSize] = opt.readSize || 16 * 1024 * 1024; - this[_reading] = false; - this[_size] = typeof opt.size === "number" ? opt.size : Infinity; - this[_remain] = this[_size]; - this[_autoClose] = typeof opt.autoClose === "boolean" ? opt.autoClose : true; - if (typeof this[_fd] === "number") - this[_read](); - else - this[_open](); - } - get fd() { - return this[_fd]; - } - get path() { - return this[_path]; - } - write() { - throw new TypeError("this is a readable stream"); - } - end() { - throw new TypeError("this is a readable stream"); - } - [_open]() { - fs8.open(this[_path], "r", (er, fd) => this[_onopen](er, fd)); - } - [_onopen](er, fd) { - if (er) - this[_onerror](er); - else { - this[_fd] = fd; - this.emit("open", fd); - this[_read](); + [BUFFERCONCAT](c) { + if (c && !this[ABORTED2]) { + this[BUFFER2] = this[BUFFER2] ? Buffer.concat([this[BUFFER2], c]) : c; } } - [_makeBuf]() { - return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])); + [MAYBEEND]() { + if (this[ENDED] && !this[EMITTEDEND] && !this[ABORTED2] && !this[CONSUMING]) { + this[EMITTEDEND] = true; + const entry = this[WRITEENTRY]; + if (entry && entry.blockRemain) { + const have = this[BUFFER2] ? this[BUFFER2].length : 0; + this.warn("TAR_BAD_ARCHIVE", `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); + if (this[BUFFER2]) { + entry.write(this[BUFFER2]); + } + entry.end(); + } + this[EMIT](DONE); + } } - [_read]() { - if (!this[_reading]) { - this[_reading] = true; - const buf = this[_makeBuf](); - if (buf.length === 0) - return process.nextTick(() => this[_onread](null, 0, buf)); - fs8.read(this[_fd], buf, 0, buf.length, null, (er, br, buf2) => this[_onread](er, br, buf2)); + [CONSUMECHUNK](chunk) { + if (this[CONSUMING] && chunk) { + this[BUFFERCONCAT](chunk); + } else if (!chunk && !this[BUFFER2]) { + this[MAYBEEND](); + } else if (chunk) { + this[CONSUMING] = true; + if (this[BUFFER2]) { + this[BUFFERCONCAT](chunk); + const c = this[BUFFER2]; + this[BUFFER2] = void 0; + this[CONSUMECHUNKSUB](c); + } else { + this[CONSUMECHUNKSUB](chunk); + } + while (this[BUFFER2] && this[BUFFER2]?.length >= 512 && !this[ABORTED2] && !this[SAW_EOF]) { + const c = this[BUFFER2]; + this[BUFFER2] = void 0; + this[CONSUMECHUNKSUB](c); + } + this[CONSUMING] = false; + } + if (!this[BUFFER2] || this[ENDED]) { + this[MAYBEEND](); } } - [_onread](er, br, buf) { - this[_reading] = false; - if (er) - this[_onerror](er); - else if (this[_handleChunk](br, buf)) - this[_read](); + [CONSUMECHUNKSUB](chunk) { + let position = 0; + const length = chunk.length; + while (position + 512 <= length && !this[ABORTED2] && !this[SAW_EOF]) { + switch (this[STATE]) { + case "begin": + case "header": + this[CONSUMEHEADER](chunk, position); + position += 512; + break; + case "ignore": + case "body": + position += this[CONSUMEBODY](chunk, position); + break; + case "meta": + position += this[CONSUMEMETA](chunk, position); + break; + /* c8 ignore start */ + default: + throw new Error("invalid state: " + this[STATE]); + } + } + if (position < length) { + if (this[BUFFER2]) { + this[BUFFER2] = Buffer.concat([ + chunk.subarray(position), + this[BUFFER2] + ]); + } else { + this[BUFFER2] = chunk.subarray(position); + } + } } - [_close]() { - if (this[_autoClose] && typeof this[_fd] === "number") { - const fd = this[_fd]; - this[_fd] = null; - fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); + end(chunk, encoding, cb) { + if (typeof chunk === "function") { + cb = chunk; + encoding = void 0; + chunk = void 0; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding); + } + if (cb) + this.once("finish", cb); + if (!this[ABORTED2]) { + if (this[UNZIP]) { + if (chunk) + this[UNZIP].write(chunk); + this[UNZIP].end(); + } else { + this[ENDED] = true; + if (this.brotli === void 0 || this.zstd === void 0) + chunk = chunk || Buffer.alloc(0); + if (chunk) + this.write(chunk); + this[MAYBEEND](); + } } + return this; } - [_onerror](er) { - this[_reading] = true; - this[_close](); - this.emit("error", er); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js +var stripTrailingSlashes; +var init_strip_trailing_slashes = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js"() { + stripTrailingSlashes = (str) => { + let i = str.length - 1; + let slashesStart = -1; + while (i > -1 && str.charAt(i) === "/") { + slashesStart = i; + i--; } - [_handleChunk](br, buf) { - let ret = false; - this[_remain] -= br; - if (br > 0) - ret = super.write(br < buf.length ? buf.slice(0, br) : buf); - if (br === 0 || this[_remain] <= 0) { + return slashesStart === -1 ? str : str.slice(0, slashesStart); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/list.js +var list_exports = {}; +__export(list_exports, { + filesFilter: () => filesFilter, + list: () => list +}); +var import_node_fs, import_path2, onReadEntryFunction, filesFilter, listFileSync, listFile, list; +var init_list = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/list.js"() { + init_esm2(); + import_node_fs = __toESM(require("node:fs"), 1); + import_path2 = require("path"); + init_make_command(); + init_parse(); + init_strip_trailing_slashes(); + onReadEntryFunction = (opt) => { + const onReadEntry = opt.onReadEntry; + opt.onReadEntry = onReadEntry ? (e) => { + onReadEntry(e); + e.resume(); + } : (e) => e.resume(); + }; + filesFilter = (opt, files) => { + const map = new Map(files.map((f) => [stripTrailingSlashes(f), true])); + const filter = opt.filter; + const mapHas = (file, r = "") => { + const root = r || (0, import_path2.parse)(file).root || "."; + let ret; + if (file === root) ret = false; - this[_close](); - super.end(); + else { + const m = map.get(file); + if (m !== void 0) { + ret = m; + } else { + ret = mapHas((0, import_path2.dirname)(file), root); + } } + map.set(file, ret); return ret; - } - emit(ev, data) { - switch (ev) { - case "prefinish": - case "finish": - break; - case "drain": - if (typeof this[_fd] === "number") - this[_read](); - break; - case "error": - if (this[_errored]) - return; - this[_errored] = true; - return super.emit(ev, data); - default: - return super.emit(ev, data); - } - } + }; + opt.filter = filter ? (file, entry) => filter(file, entry) && mapHas(stripTrailingSlashes(file)) : (file) => mapHas(stripTrailingSlashes(file)); }; - var ReadStreamSync = class extends ReadStream { - [_open]() { - let threw = true; - try { - this[_onopen](null, fs8.openSync(this[_path], "r")); - threw = false; - } finally { - if (threw) - this[_close](); + listFileSync = (opt) => { + const p = new Parser(opt); + const file = opt.file; + let fd; + try { + fd = import_node_fs.default.openSync(file, "r"); + const stat = import_node_fs.default.fstatSync(fd); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + if (stat.size < readSize) { + const buf = Buffer.allocUnsafe(stat.size); + const read = import_node_fs.default.readSync(fd, buf, 0, stat.size, 0); + p.end(read === buf.byteLength ? buf : buf.subarray(0, read)); + } else { + let pos2 = 0; + const buf = Buffer.allocUnsafe(readSize); + while (pos2 < stat.size) { + const bytesRead = import_node_fs.default.readSync(fd, buf, 0, readSize, pos2); + if (bytesRead === 0) + break; + pos2 += bytesRead; + p.write(buf.subarray(0, bytesRead)); + } + p.end(); } - } - [_read]() { - let threw = true; - try { - if (!this[_reading]) { - this[_reading] = true; - do { - const buf = this[_makeBuf](); - const br = buf.length === 0 ? 0 : fs8.readSync(this[_fd], buf, 0, buf.length, null); - if (!this[_handleChunk](br, buf)) - break; - } while (true); - this[_reading] = false; + } finally { + if (typeof fd === "number") { + try { + import_node_fs.default.closeSync(fd); + } catch (er) { } - threw = false; - } finally { - if (threw) - this[_close](); } } - [_close]() { - if (this[_autoClose] && typeof this[_fd] === "number") { - const fd = this[_fd]; - this[_fd] = null; - fs8.closeSync(fd); - this.emit("close"); - } + }; + listFile = (opt, _files) => { + const parse4 = new Parser(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + parse4.on("error", reject); + parse4.on("end", resolve); + import_node_fs.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } else { + const stream = new ReadStream(file, { + readSize, + size: stat.size + }); + stream.on("error", reject); + stream.pipe(parse4); + } + }); + }); + return p; + }; + list = makeCommand(listFileSync, listFile, (opt) => new Parser(opt), (opt) => new Parser(opt), (opt, files) => { + if (files?.length) + filesFilter(opt, files); + if (!opt.noResume) + onReadEntryFunction(opt); + }); + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/get-write-flag.js +var import_fs3, platform2, isWindows, O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP, fMapEnabled, fMapLimit, fMapFlag, getWriteFlag; +var init_get_write_flag = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/get-write-flag.js"() { + import_fs3 = __toESM(require("fs"), 1); + platform2 = process.env.__FAKE_PLATFORM__ || process.platform; + isWindows = platform2 === "win32"; + ({ O_CREAT, O_TRUNC, O_WRONLY } = import_fs3.default.constants); + UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || import_fs3.default.constants.UV_FS_O_FILEMAP || 0; + fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; + fMapLimit = 512 * 1024; + fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; + getWriteFlag = !fMapEnabled ? () => "w" : (size) => size < fMapLimit ? fMapFlag : "w"; + } +}); + +// .yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js +var import_node_fs2, import_node_path3, lchownSync, chown, chownrKid, chownr, chownrKidSync, chownrSync; +var init_esm4 = __esm({ + ".yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js"() { + import_node_fs2 = __toESM(require("node:fs"), 1); + import_node_path3 = __toESM(require("node:path"), 1); + lchownSync = (path16, uid, gid) => { + try { + return import_node_fs2.default.lchownSync(path16, uid, gid); + } catch (er) { + if (er?.code !== "ENOENT") + throw er; } }; - var WriteStream = class extends EE { - constructor(path10, opt) { - opt = opt || {}; - super(opt); - this.readable = false; - this.writable = true; - this[_errored] = false; - this[_writing] = false; - this[_ended] = false; - this[_needDrain] = false; - this[_queue] = []; - this[_path] = path10; - this[_fd] = typeof opt.fd === "number" ? opt.fd : null; - this[_mode] = opt.mode === void 0 ? 438 : opt.mode; - this[_pos] = typeof opt.start === "number" ? opt.start : null; - this[_autoClose] = typeof opt.autoClose === "boolean" ? opt.autoClose : true; - const defaultFlag = this[_pos] !== null ? "r+" : "w"; - this[_defaultFlag] = opt.flags === void 0; - this[_flags] = this[_defaultFlag] ? defaultFlag : opt.flags; - if (this[_fd] === null) - this[_open](); + chown = (cpath, uid, gid, cb) => { + import_node_fs2.default.lchown(cpath, uid, gid, (er) => { + cb(er && er?.code !== "ENOENT" ? er : null); + }); + }; + chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + chownr(import_node_path3.default.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = import_node_path3.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } else { + const cpath = import_node_path3.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); } - emit(ev, data) { - if (ev === "error") { - if (this[_errored]) + }; + chownr = (p, uid, gid, cb) => { + import_node_fs2.default.readdir(p, { withFileTypes: true }, (er, children) => { + if (er) { + if (er.code === "ENOENT") + return cb(); + else if (er.code !== "ENOTDIR" && er.code !== "ENOTSUP") + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er2) => { + if (errState) return; - this[_errored] = true; + if (er2) + return cb(errState = er2); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); } - return super.emit(ev, data); - } - get fd() { - return this[_fd]; + }); + }; + chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + chownrSync(import_node_path3.default.resolve(p, child.name), uid, gid); + lchownSync(import_node_path3.default.resolve(p, child.name), uid, gid); + }; + chownrSync = (p, uid, gid) => { + let children; + try { + children = import_node_fs2.default.readdirSync(p, { withFileTypes: true }); + } catch (er) { + const e = er; + if (e?.code === "ENOENT") + return; + else if (e?.code === "ENOTDIR" || e?.code === "ENOTSUP") + return lchownSync(p, uid, gid); + else + throw e; } - get path() { - return this[_path]; + for (const child of children) { + chownrKidSync(p, child, uid, gid); } - [_onerror](er) { - this[_close](); - this[_writing] = true; - this.emit("error", er); + return lchownSync(p, uid, gid); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/cwd-error.js +var CwdError; +var init_cwd_error = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/cwd-error.js"() { + CwdError = class extends Error { + path; + code; + syscall = "chdir"; + constructor(path16, code2) { + super(`${code2}: Cannot cd into '${path16}'`); + this.path = path16; + this.code = code2; } - [_open]() { - fs8.open( - this[_path], - this[_flags], - this[_mode], - (er, fd) => this[_onopen](er, fd) - ); + get name() { + return "CwdError"; } - [_onopen](er, fd) { - if (this[_defaultFlag] && this[_flags] === "r+" && er && er.code === "ENOENT") { - this[_flags] = "w"; - this[_open](); - } else if (er) - this[_onerror](er); - else { - this[_fd] = fd; - this.emit("open", fd); - this[_flush](); - } + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/symlink-error.js +var SymlinkError; +var init_symlink_error = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/symlink-error.js"() { + SymlinkError = class extends Error { + path; + symlink; + syscall = "symlink"; + code = "TAR_SYMLINK_ERROR"; + constructor(symlink, path16) { + super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"); + this.symlink = symlink; + this.path = path16; } - end(buf, enc) { - if (buf) - this.write(buf, enc); - this[_ended] = true; - if (!this[_writing] && !this[_queue].length && typeof this[_fd] === "number") - this[_onwrite](null, 0); - return this; + get name() { + return "SymlinkError"; } - write(buf, enc) { - if (typeof buf === "string") - buf = Buffer.from(buf, enc); - if (this[_ended]) { - this.emit("error", new Error("write() after end()")); - return false; - } - if (this[_fd] === null || this[_writing] || this[_queue].length) { - this[_queue].push(buf); - this[_needDrain] = true; - return false; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/mkdir.js +var import_node_fs3, import_promises, import_node_path4, checkCwd, mkdir, mkdir_, onmkdir, checkCwdSync, mkdirSync2; +var init_mkdir = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/mkdir.js"() { + init_esm4(); + import_node_fs3 = __toESM(require("node:fs"), 1); + import_promises = __toESM(require("node:fs/promises"), 1); + import_node_path4 = __toESM(require("node:path"), 1); + init_cwd_error(); + init_normalize_windows_path(); + init_symlink_error(); + checkCwd = (dir, cb) => { + import_node_fs3.default.stat(dir, (er, st) => { + if (er || !st.isDirectory()) { + er = new CwdError(dir, er?.code || "ENOTDIR"); } - this[_writing] = true; - this[_write](buf); - return true; - } - [_write](buf) { - fs8.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); - } - [_onwrite](er, bw) { - if (er) - this[_onerror](er); - else { - if (this[_pos] !== null) - this[_pos] += bw; - if (this[_queue].length) - this[_flush](); - else { - this[_writing] = false; - if (this[_ended] && !this[_finished]) { - this[_finished] = true; - this[_close](); - this.emit("finish"); - } else if (this[_needDrain]) { - this[_needDrain] = false; - this.emit("drain"); - } + cb(er); + }); + }; + mkdir = (dir, opt, cb) => { + dir = normalizeWindowsPath(dir); + const umask = opt.umask ?? 18; + const mode = opt.mode | 448; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cwd = normalizeWindowsPath(opt.cwd); + const done = (er, created) => { + if (er) { + cb(er); + } else { + if (created && doChown) { + chownr(created, uid, gid, (er2) => done(er2)); + } else if (needChmod) { + import_node_fs3.default.chmod(dir, mode, cb); + } else { + cb(); } } + }; + if (dir === cwd) { + return checkCwd(dir, done); } - [_flush]() { - if (this[_queue].length === 0) { - if (this[_ended]) - this[_onwrite](null, 0); - } else if (this[_queue].length === 1) - this[_write](this[_queue].pop()); - else { - const iovec = this[_queue]; - this[_queue] = []; - writev( - this[_fd], - iovec, - this[_pos], - (er, bw) => this[_onwrite](er, bw) - ); - } + if (preserve) { + return import_promises.default.mkdir(dir, { mode, recursive: true }).then( + (made) => done(null, made ?? void 0), + // oh, ts + done + ); } - [_close]() { - if (this[_autoClose] && typeof this[_fd] === "number") { - const fd = this[_fd]; - this[_fd] = null; - fs8.close(fd, (er) => er ? this.emit("error", er) : this.emit("close")); - } + const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); + const parts = sub.split("/"); + mkdir_(cwd, parts, mode, unlink, cwd, void 0, done); + }; + mkdir_ = (base, parts, mode, unlink, cwd, created, cb) => { + if (!parts.length) { + return cb(null, created); } + const p = parts.shift(); + const part = normalizeWindowsPath(import_node_path4.default.resolve(base + "/" + p)); + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); }; - var WriteStreamSync = class extends WriteStream { - [_open]() { - let fd; - if (this[_defaultFlag] && this[_flags] === "r+") { - try { - fd = fs8.openSync(this[_path], this[_flags], this[_mode]); - } catch (er) { - if (er.code === "ENOENT") { - this[_flags] = "w"; - return this[_open](); - } else - throw er; + onmkdir = (part, parts, mode, unlink, cwd, created, cb) => (er) => { + if (er) { + import_node_fs3.default.lstat(part, (statEr, st) => { + if (statEr) { + statEr.path = statEr.path && normalizeWindowsPath(statEr.path); + cb(statEr); + } else if (st.isDirectory()) { + mkdir_(part, parts, mode, unlink, cwd, created, cb); + } else if (unlink) { + import_node_fs3.default.unlink(part, (er2) => { + if (er2) { + return cb(er2); + } + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); + }); + } else if (st.isSymbolicLink()) { + return cb(new SymlinkError(part, part + "/" + parts.join("/"))); + } else { + cb(er); } - } else - fd = fs8.openSync(this[_path], this[_flags], this[_mode]); - this[_onopen](null, fd); + }); + } else { + created = created || part; + mkdir_(part, parts, mode, unlink, cwd, created, cb); } - [_close]() { - if (this[_autoClose] && typeof this[_fd] === "number") { - const fd = this[_fd]; - this[_fd] = null; - fs8.closeSync(fd); - this.emit("close"); + }; + checkCwdSync = (dir) => { + let ok = false; + let code2 = void 0; + try { + ok = import_node_fs3.default.statSync(dir).isDirectory(); + } catch (er) { + code2 = er?.code; + } finally { + if (!ok) { + throw new CwdError(dir, code2 ?? "ENOTDIR"); } } - [_write](buf) { - let threw = true; + }; + mkdirSync2 = (dir, opt) => { + dir = normalizeWindowsPath(dir); + const umask = opt.umask ?? 18; + const mode = opt.mode | 448; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cwd = normalizeWindowsPath(opt.cwd); + const done = (created2) => { + if (created2 && doChown) { + chownrSync(created2, uid, gid); + } + if (needChmod) { + import_node_fs3.default.chmodSync(dir, mode); + } + }; + if (dir === cwd) { + checkCwdSync(cwd); + return done(); + } + if (preserve) { + return done(import_node_fs3.default.mkdirSync(dir, { mode, recursive: true }) ?? void 0); + } + const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); + const parts = sub.split("/"); + let created = void 0; + for (let p = parts.shift(), part = cwd; p && (part += "/" + p); p = parts.shift()) { + part = normalizeWindowsPath(import_node_path4.default.resolve(part)); try { - this[_onwrite]( - null, - fs8.writeSync(this[_fd], buf, 0, buf.length, this[_pos]) - ); - threw = false; - } finally { - if (threw) - try { - this[_close](); - } catch (_) { - } + import_node_fs3.default.mkdirSync(part, mode); + created = created || part; + } catch (er) { + const st = import_node_fs3.default.lstatSync(part); + if (st.isDirectory()) { + continue; + } else if (unlink) { + import_node_fs3.default.unlinkSync(part); + import_node_fs3.default.mkdirSync(part, mode); + created = created || part; + continue; + } else if (st.isSymbolicLink()) { + return new SymlinkError(part, part + "/" + parts.join("/")); + } } } + return done(created); }; - exports.ReadStream = ReadStream; - exports.ReadStreamSync = ReadStreamSync; - exports.WriteStream = WriteStream; - exports.WriteStreamSync = WriteStreamSync; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js -var require_parse2 = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/parse.js"(exports, module2) { - "use strict"; - var warner = require_warn_mixin(); - var Header = require_header(); - var EE = require("events"); - var Yallist = require_yallist(); - var maxMetaEntrySize = 1024 * 1024; - var Entry = require_read_entry(); - var Pax = require_pax(); - var zlib = require_minizlib(); - var { nextTick } = require("process"); - var gzipHeader = Buffer.from([31, 139]); - var STATE = Symbol("state"); - var WRITEENTRY = Symbol("writeEntry"); - var READENTRY = Symbol("readEntry"); - var NEXTENTRY = Symbol("nextEntry"); - var PROCESSENTRY = Symbol("processEntry"); - var EX = Symbol("extendedHeader"); - var GEX = Symbol("globalExtendedHeader"); - var META = Symbol("meta"); - var EMITMETA = Symbol("emitMeta"); - var BUFFER = Symbol("buffer"); - var QUEUE = Symbol("queue"); - var ENDED = Symbol("ended"); - var EMITTEDEND = Symbol("emittedEnd"); - var EMIT = Symbol("emit"); - var UNZIP = Symbol("unzip"); - var CONSUMECHUNK = Symbol("consumeChunk"); - var CONSUMECHUNKSUB = Symbol("consumeChunkSub"); - var CONSUMEBODY = Symbol("consumeBody"); - var CONSUMEMETA = Symbol("consumeMeta"); - var CONSUMEHEADER = Symbol("consumeHeader"); - var CONSUMING = Symbol("consuming"); - var BUFFERCONCAT = Symbol("bufferConcat"); - var MAYBEEND = Symbol("maybeEnd"); - var WRITING = Symbol("writing"); - var ABORTED = Symbol("aborted"); - var DONE = Symbol("onDone"); - var SAW_VALID_ENTRY = Symbol("sawValidEntry"); - var SAW_NULL_BLOCK = Symbol("sawNullBlock"); - var SAW_EOF = Symbol("sawEOF"); - var CLOSESTREAM = Symbol("closeStream"); - var noop = (_) => true; - module2.exports = warner(class Parser extends EE { - constructor(opt) { - opt = opt || {}; - super(opt); - this.file = opt.file || ""; - this[SAW_VALID_ENTRY] = null; - this.on(DONE, (_) => { - if (this[STATE] === "begin" || this[SAW_VALID_ENTRY] === false) { - this.warn("TAR_BAD_ARCHIVE", "Unrecognized archive format"); - } - }); - if (opt.ondone) { - this.on(DONE, opt.ondone); - } else { - this.on(DONE, (_) => { - this.emit("prefinish"); - this.emit("finish"); - this.emit("end"); - }); - } - this.strict = !!opt.strict; - this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; - this.filter = typeof opt.filter === "function" ? opt.filter : noop; - const isTBR = opt.file && (opt.file.endsWith(".tar.br") || opt.file.endsWith(".tbr")); - this.brotli = !opt.gzip && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; - this.writable = true; - this.readable = false; - this[QUEUE] = new Yallist(); - this[BUFFER] = null; - this[READENTRY] = null; - this[WRITEENTRY] = null; - this[STATE] = "begin"; - this[META] = ""; - this[EX] = null; - this[GEX] = null; - this[ENDED] = false; - this[UNZIP] = null; - this[ABORTED] = false; - this[SAW_NULL_BLOCK] = false; - this[SAW_EOF] = false; - this.on("end", () => this[CLOSESTREAM]()); - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); - } - if (typeof opt.onentry === "function") { - this.on("entry", opt.onentry); - } +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/strip-absolute-path.js +var import_node_path5, isAbsolute, parse3, stripAbsolutePath; +var init_strip_absolute_path = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/strip-absolute-path.js"() { + import_node_path5 = require("node:path"); + ({ isAbsolute, parse: parse3 } = import_node_path5.win32); + stripAbsolutePath = (path16) => { + let r = ""; + let parsed = parse3(path16); + while (isAbsolute(path16) || parsed.root) { + const root = path16.charAt(0) === "/" && path16.slice(0, 4) !== "//?/" ? "/" : parsed.root; + path16 = path16.slice(root.length); + r += root; + parsed = parse3(path16); } - [CONSUMEHEADER](chunk, position) { - if (this[SAW_VALID_ENTRY] === null) { - this[SAW_VALID_ENTRY] = false; - } - let header; - try { - header = new Header(chunk, position, this[EX], this[GEX]); - } catch (er) { - return this.warn("TAR_ENTRY_INVALID", er); + return [r, path16]; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/winchars.js +var raw, win, toWin, toRaw, encode2, decode; +var init_winchars = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/winchars.js"() { + raw = ["|", "<", ">", "?", ":"]; + win = raw.map((char) => String.fromCharCode(61440 + char.charCodeAt(0))); + toWin = new Map(raw.map((char, i) => [char, win[i]])); + toRaw = new Map(win.map((char, i) => [char, raw[i]])); + encode2 = (s) => raw.reduce((s2, c) => s2.split(c).join(toWin.get(c)), s); + decode = (s) => win.reduce((s2, c) => s2.split(c).join(toRaw.get(c)), s); + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/normalize-unicode.js +var normalizeCache, MAX, cache, normalizeUnicode; +var init_normalize_unicode = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/normalize-unicode.js"() { + normalizeCache = /* @__PURE__ */ Object.create(null); + MAX = 1e4; + cache = /* @__PURE__ */ new Set(); + normalizeUnicode = (s) => { + if (!cache.has(s)) { + normalizeCache[s] = s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"); + } else { + cache.delete(s); + } + cache.add(s); + const ret = normalizeCache[s]; + let i = cache.size - MAX; + if (i > MAX / 10) { + for (const s2 of cache) { + cache.delete(s2); + delete normalizeCache[s2]; + if (--i <= 0) + break; } - if (header.nullBlock) { - if (this[SAW_NULL_BLOCK]) { - this[SAW_EOF] = true; - if (this[STATE] === "begin") { - this[STATE] = "header"; - } - this[EMIT]("eof"); + } + return ret; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/path-reservations.js +var import_node_path6, platform3, isWindows2, getDirs, PathReservations; +var init_path_reservations = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/path-reservations.js"() { + import_node_path6 = require("node:path"); + init_normalize_unicode(); + init_strip_trailing_slashes(); + platform3 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows2 = platform3 === "win32"; + getDirs = (path16) => { + const dirs = path16.split("/").slice(0, -1).reduce((set, path17) => { + const s = set[set.length - 1]; + if (s !== void 0) { + path17 = (0, import_node_path6.join)(s, path17); + } + set.push(path17 || "/"); + return set; + }, []); + return dirs; + }; + PathReservations = class { + // path => [function or Set] + // A Set object means a directory reservation + // A fn is a direct reservation on that path + #queues = /* @__PURE__ */ new Map(); + // fn => {paths:[path,...], dirs:[path, ...]} + #reservations = /* @__PURE__ */ new Map(); + // functions currently running + #running = /* @__PURE__ */ new Set(); + reserve(paths, fn2) { + paths = isWindows2 ? ["win32 parallelization disabled"] : paths.map((p) => { + return stripTrailingSlashes((0, import_node_path6.join)(normalizeUnicode(p))); + }); + const dirs = new Set(paths.map((path16) => getDirs(path16)).reduce((a, b) => a.concat(b))); + this.#reservations.set(fn2, { dirs, paths }); + for (const p of paths) { + const q = this.#queues.get(p); + if (!q) { + this.#queues.set(p, [fn2]); } else { - this[SAW_NULL_BLOCK] = true; - this[EMIT]("nullBlock"); + q.push(fn2); } - } else { - this[SAW_NULL_BLOCK] = false; - if (!header.cksumValid) { - this.warn("TAR_ENTRY_INVALID", "checksum failure", { header }); - } else if (!header.path) { - this.warn("TAR_ENTRY_INVALID", "path is required", { header }); + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + if (!q) { + this.#queues.set(dir, [/* @__PURE__ */ new Set([fn2])]); } else { - const type = header.type; - if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { - this.warn("TAR_ENTRY_INVALID", "linkpath required", { header }); - } else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath) { - this.warn("TAR_ENTRY_INVALID", "linkpath forbidden", { header }); + const l = q[q.length - 1]; + if (l instanceof Set) { + l.add(fn2); } else { - const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX]); - if (!this[SAW_VALID_ENTRY]) { - if (entry.remain) { - const onend = () => { - if (!entry.invalid) { - this[SAW_VALID_ENTRY] = true; - } - }; - entry.on("end", onend); - } else { - this[SAW_VALID_ENTRY] = true; - } - } - if (entry.meta) { - if (entry.size > this.maxMetaEntrySize) { - entry.ignore = true; - this[EMIT]("ignoredEntry", entry); - this[STATE] = "ignore"; - entry.resume(); - } else if (entry.size > 0) { - this[META] = ""; - entry.on("data", (c) => this[META] += c); - this[STATE] = "meta"; - } - } else { - this[EX] = null; - entry.ignore = entry.ignore || !this.filter(entry.path, entry); - if (entry.ignore) { - this[EMIT]("ignoredEntry", entry); - this[STATE] = entry.remain ? "ignore" : "header"; - entry.resume(); - } else { - if (entry.remain) { - this[STATE] = "body"; - } else { - this[STATE] = "header"; - entry.end(); - } - if (!this[READENTRY]) { - this[QUEUE].push(entry); - this[NEXTENTRY](); - } else { - this[QUEUE].push(entry); - } - } - } + q.push(/* @__PURE__ */ new Set([fn2])); } } } + return this.#run(fn2); } - [CLOSESTREAM]() { - nextTick(() => this.emit("close")); + // return the queues for each path the function cares about + // fn => {paths, dirs} + #getQueues(fn2) { + const res = this.#reservations.get(fn2); + if (!res) { + throw new Error("function does not have any path reservations"); + } + return { + paths: res.paths.map((path16) => this.#queues.get(path16)), + dirs: [...res.dirs].map((path16) => this.#queues.get(path16)) + }; } - [PROCESSENTRY](entry) { - let go = true; - if (!entry) { - this[READENTRY] = null; - go = false; - } else if (Array.isArray(entry)) { - this.emit.apply(this, entry); - } else { - this[READENTRY] = entry; - this.emit("entry", entry); - if (!entry.emittedEnd) { - entry.on("end", (_) => this[NEXTENTRY]()); - go = false; + // check if fn is first in line for all its paths, and is + // included in the first set for all its dir queues + check(fn2) { + const { paths, dirs } = this.#getQueues(fn2); + return paths.every((q) => q && q[0] === fn2) && dirs.every((q) => q && q[0] instanceof Set && q[0].has(fn2)); + } + // run the function if it's first in line and not already running + #run(fn2) { + if (this.#running.has(fn2) || !this.check(fn2)) { + return false; + } + this.#running.add(fn2); + fn2(() => this.#clear(fn2)); + return true; + } + #clear(fn2) { + if (!this.#running.has(fn2)) { + return false; + } + const res = this.#reservations.get(fn2); + if (!res) { + throw new Error("invalid reservation"); + } + const { paths, dirs } = res; + const next = /* @__PURE__ */ new Set(); + for (const path16 of paths) { + const q = this.#queues.get(path16); + if (!q || q?.[0] !== fn2) { + continue; + } + const q0 = q[1]; + if (!q0) { + this.#queues.delete(path16); + continue; + } + q.shift(); + if (typeof q0 === "function") { + next.add(q0); + } else { + for (const f of q0) { + next.add(f); + } } } - return go; - } - [NEXTENTRY]() { - do { - } while (this[PROCESSENTRY](this[QUEUE].shift())); - if (!this[QUEUE].length) { - const re = this[READENTRY]; - const drainNow = !re || re.flowing || re.size === re.remain; - if (drainNow) { - if (!this[WRITING]) { - this.emit("drain"); + for (const dir of dirs) { + const q = this.#queues.get(dir); + const q0 = q?.[0]; + if (!q || !(q0 instanceof Set)) + continue; + if (q0.size === 1 && q.length === 1) { + this.#queues.delete(dir); + continue; + } else if (q0.size === 1) { + q.shift(); + const n = q[0]; + if (typeof n === "function") { + next.add(n); } } else { - re.once("drain", (_) => this.emit("drain")); + q0.delete(fn2); } } + this.#running.delete(fn2); + next.forEach((fn3) => this.#run(fn3)); + return true; } - [CONSUMEBODY](chunk, position) { - const entry = this[WRITEENTRY]; - const br = entry.blockRemain; - const c = br >= chunk.length && position === 0 ? chunk : chunk.slice(position, position + br); - entry.write(c); - if (!entry.blockRemain) { - this[STATE] = "header"; - this[WRITEENTRY] = null; - entry.end(); + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/unpack.js +var import_node_assert, import_node_crypto, import_node_fs4, import_node_path7, ONENTRY, CHECKFS, CHECKFS2, ISREUSABLE, MAKEFS, FILE, DIRECTORY, LINK, SYMLINK, HARDLINK, UNSUPPORTED, CHECKPATH, STRIPABSOLUTEPATH, MKDIR, ONERROR, PENDING, PEND, UNPEND, ENDED2, MAYBECLOSE, SKIP, DOCHOWN, UID, GID, CHECKED_CWD, platform4, isWindows3, DEFAULT_MAX_DEPTH, unlinkFile, unlinkFileSync, uint32, Unpack, callSync, UnpackSync; +var init_unpack = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/unpack.js"() { + init_esm2(); + import_node_assert = __toESM(require("node:assert"), 1); + import_node_crypto = require("node:crypto"); + import_node_fs4 = __toESM(require("node:fs"), 1); + import_node_path7 = __toESM(require("node:path"), 1); + init_get_write_flag(); + init_mkdir(); + init_normalize_windows_path(); + init_parse(); + init_strip_absolute_path(); + init_winchars(); + init_path_reservations(); + ONENTRY = Symbol("onEntry"); + CHECKFS = Symbol("checkFs"); + CHECKFS2 = Symbol("checkFs2"); + ISREUSABLE = Symbol("isReusable"); + MAKEFS = Symbol("makeFs"); + FILE = Symbol("file"); + DIRECTORY = Symbol("directory"); + LINK = Symbol("link"); + SYMLINK = Symbol("symlink"); + HARDLINK = Symbol("hardlink"); + UNSUPPORTED = Symbol("unsupported"); + CHECKPATH = Symbol("checkPath"); + STRIPABSOLUTEPATH = Symbol("stripAbsolutePath"); + MKDIR = Symbol("mkdir"); + ONERROR = Symbol("onError"); + PENDING = Symbol("pending"); + PEND = Symbol("pend"); + UNPEND = Symbol("unpend"); + ENDED2 = Symbol("ended"); + MAYBECLOSE = Symbol("maybeClose"); + SKIP = Symbol("skip"); + DOCHOWN = Symbol("doChown"); + UID = Symbol("uid"); + GID = Symbol("gid"); + CHECKED_CWD = Symbol("checkedCwd"); + platform4 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows3 = platform4 === "win32"; + DEFAULT_MAX_DEPTH = 1024; + unlinkFile = (path16, cb) => { + if (!isWindows3) { + return import_node_fs4.default.unlink(path16, cb); + } + const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); + import_node_fs4.default.rename(path16, name2, (er) => { + if (er) { + return cb(er); } - return c.length; - } - [CONSUMEMETA](chunk, position) { - const entry = this[WRITEENTRY]; - const ret = this[CONSUMEBODY](chunk, position); - if (!this[WRITEENTRY]) { - this[EMITMETA](entry); + import_node_fs4.default.unlink(name2, cb); + }); + }; + unlinkFileSync = (path16) => { + if (!isWindows3) { + return import_node_fs4.default.unlinkSync(path16); + } + const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); + import_node_fs4.default.renameSync(path16, name2); + import_node_fs4.default.unlinkSync(name2); + }; + uint32 = (a, b, c) => a !== void 0 && a === a >>> 0 ? a : b !== void 0 && b === b >>> 0 ? b : c; + Unpack = class extends Parser { + [ENDED2] = false; + [CHECKED_CWD] = false; + [PENDING] = 0; + reservations = new PathReservations(); + transform; + writable = true; + readable = false; + uid; + gid; + setOwner; + preserveOwner; + processGid; + processUid; + maxDepth; + forceChown; + win32; + newer; + keep; + noMtime; + preservePaths; + unlink; + cwd; + strip; + processUmask; + umask; + dmode; + fmode; + chmod; + constructor(opt = {}) { + opt.ondone = () => { + this[ENDED2] = true; + this[MAYBECLOSE](); + }; + super(opt); + this.transform = opt.transform; + this.chmod = !!opt.chmod; + if (typeof opt.uid === "number" || typeof opt.gid === "number") { + if (typeof opt.uid !== "number" || typeof opt.gid !== "number") { + throw new TypeError("cannot set owner without number uid and gid"); + } + if (opt.preserveOwner) { + throw new TypeError("cannot preserve owner in archive and also set owner explicitly"); + } + this.uid = opt.uid; + this.gid = opt.gid; + this.setOwner = true; + } else { + this.uid = void 0; + this.gid = void 0; + this.setOwner = false; } - return ret; - } - [EMIT](ev, data, extra) { - if (!this[QUEUE].length && !this[READENTRY]) { - this.emit(ev, data, extra); + if (opt.preserveOwner === void 0 && typeof opt.uid !== "number") { + this.preserveOwner = !!(process.getuid && process.getuid() === 0); } else { - this[QUEUE].push([ev, data, extra]); + this.preserveOwner = !!opt.preserveOwner; } + this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? process.getuid() : void 0; + this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? process.getgid() : void 0; + this.maxDepth = typeof opt.maxDepth === "number" ? opt.maxDepth : DEFAULT_MAX_DEPTH; + this.forceChown = opt.forceChown === true; + this.win32 = !!opt.win32 || isWindows3; + this.newer = !!opt.newer; + this.keep = !!opt.keep; + this.noMtime = !!opt.noMtime; + this.preservePaths = !!opt.preservePaths; + this.unlink = !!opt.unlink; + this.cwd = normalizeWindowsPath(import_node_path7.default.resolve(opt.cwd || process.cwd())); + this.strip = Number(opt.strip) || 0; + this.processUmask = !this.chmod ? 0 : typeof opt.processUmask === "number" ? opt.processUmask : process.umask(); + this.umask = typeof opt.umask === "number" ? opt.umask : this.processUmask; + this.dmode = opt.dmode || 511 & ~this.umask; + this.fmode = opt.fmode || 438 & ~this.umask; + this.on("entry", (entry) => this[ONENTRY](entry)); } - [EMITMETA](entry) { - this[EMIT]("meta", this[META]); - switch (entry.type) { - case "ExtendedHeader": - case "OldExtendedHeader": - this[EX] = Pax.parse(this[META], this[EX], false); - break; - case "GlobalExtendedHeader": - this[GEX] = Pax.parse(this[META], this[GEX], true); - break; - case "NextFileHasLongPath": - case "OldGnuLongPath": - this[EX] = this[EX] || /* @__PURE__ */ Object.create(null); - this[EX].path = this[META].replace(/\0.*/, ""); - break; - case "NextFileHasLongLinkpath": - this[EX] = this[EX] || /* @__PURE__ */ Object.create(null); - this[EX].linkpath = this[META].replace(/\0.*/, ""); - break; - default: - throw new Error("unknown meta: " + entry.type); + // a bad or damaged archive is a warning for Parser, but an error + // when extracting. Mark those errors as unrecoverable, because + // the Unpack contract cannot be met. + warn(code2, msg, data = {}) { + if (code2 === "TAR_BAD_ARCHIVE" || code2 === "TAR_ABORT") { + data.recoverable = false; } + return super.warn(code2, msg, data); } - abort(error) { - this[ABORTED] = true; - this.emit("abort", error); - this.warn("TAR_ABORT", error, { recoverable: false }); - } - write(chunk) { - if (this[ABORTED]) { - return; + [MAYBECLOSE]() { + if (this[ENDED2] && this[PENDING] === 0) { + this.emit("prefinish"); + this.emit("finish"); + this.emit("end"); } - const needSniff = this[UNZIP] === null || this.brotli === void 0 && this[UNZIP] === false; - if (needSniff && chunk) { - if (this[BUFFER]) { - chunk = Buffer.concat([this[BUFFER], chunk]); - this[BUFFER] = null; - } - if (chunk.length < gzipHeader.length) { - this[BUFFER] = chunk; - return true; - } - for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) { - if (chunk[i] !== gzipHeader[i]) { - this[UNZIP] = false; + } + // return false if we need to skip this file + // return true if the field was successfully sanitized + [STRIPABSOLUTEPATH](entry, field) { + const p = entry[field]; + if (!p || this.preservePaths) + return true; + const parts = p.split("/"); + if (parts.includes("..") || /* c8 ignore next */ + isWindows3 && /^[a-z]:\.\.$/i.test(parts[0] ?? "")) { + if (field === "path") { + this.warn("TAR_ENTRY_ERROR", `${field} contains '..'`, { + entry, + [field]: p + }); + return false; + } else { + const entryDir = import_node_path7.default.posix.dirname(entry.path); + const resolved = import_node_path7.default.posix.normalize(import_node_path7.default.posix.join(entryDir, p)); + if (resolved.startsWith("../") || resolved === "..") { + this.warn("TAR_ENTRY_ERROR", `${field} escapes extraction directory`, { + entry, + [field]: p + }); + return false; } } - const maybeBrotli = this.brotli === void 0; - if (this[UNZIP] === false && maybeBrotli) { - if (chunk.length < 512) { - if (this[ENDED]) { - this.brotli = true; - } else { - this[BUFFER] = chunk; - return true; - } + } + const [root, stripped] = stripAbsolutePath(p); + if (root) { + entry[field] = String(stripped); + this.warn("TAR_ENTRY_INFO", `stripping ${root} from absolute ${field}`, { + entry, + [field]: p + }); + } + return true; + } + [CHECKPATH](entry) { + const p = normalizeWindowsPath(entry.path); + const parts = p.split("/"); + if (this.strip) { + if (parts.length < this.strip) { + return false; + } + if (entry.type === "Link") { + const linkparts = normalizeWindowsPath(String(entry.linkpath)).split("/"); + if (linkparts.length >= this.strip) { + entry.linkpath = linkparts.slice(this.strip).join("/"); } else { - try { - new Header(chunk.slice(0, 512)); - this.brotli = false; - } catch (_) { - this.brotli = true; - } + return false; } } - if (this[UNZIP] === null || this[UNZIP] === false && this.brotli) { - const ended = this[ENDED]; - this[ENDED] = false; - this[UNZIP] = this[UNZIP] === null ? new zlib.Unzip() : new zlib.BrotliDecompress(); - this[UNZIP].on("data", (chunk2) => this[CONSUMECHUNK](chunk2)); - this[UNZIP].on("error", (er) => this.abort(er)); - this[UNZIP].on("end", (_) => { - this[ENDED] = true; - this[CONSUMECHUNK](); - }); - this[WRITING] = true; - const ret2 = this[UNZIP][ended ? "end" : "write"](chunk); - this[WRITING] = false; - return ret2; - } + parts.splice(0, this.strip); + entry.path = parts.join("/"); } - this[WRITING] = true; - if (this[UNZIP]) { - this[UNZIP].write(chunk); + if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { + this.warn("TAR_ENTRY_ERROR", "path excessively deep", { + entry, + path: p, + depth: parts.length, + maxDepth: this.maxDepth + }); + return false; + } + if (!this[STRIPABSOLUTEPATH](entry, "path") || !this[STRIPABSOLUTEPATH](entry, "linkpath")) { + return false; + } + if (import_node_path7.default.isAbsolute(entry.path)) { + entry.absolute = normalizeWindowsPath(import_node_path7.default.resolve(entry.path)); } else { - this[CONSUMECHUNK](chunk); + entry.absolute = normalizeWindowsPath(import_node_path7.default.resolve(this.cwd, entry.path)); } - this[WRITING] = false; - const ret = this[QUEUE].length ? false : this[READENTRY] ? this[READENTRY].flowing : true; - if (!ret && !this[QUEUE].length) { - this[READENTRY].once("drain", (_) => this.emit("drain")); + if (!this.preservePaths && typeof entry.absolute === "string" && entry.absolute.indexOf(this.cwd + "/") !== 0 && entry.absolute !== this.cwd) { + this.warn("TAR_ENTRY_ERROR", "path escaped extraction target", { + entry, + path: normalizeWindowsPath(entry.path), + resolvedPath: entry.absolute, + cwd: this.cwd + }); + return false; } - return ret; + if (entry.absolute === this.cwd && entry.type !== "Directory" && entry.type !== "GNUDumpDir") { + return false; + } + if (this.win32) { + const { root: aRoot } = import_node_path7.default.win32.parse(String(entry.absolute)); + entry.absolute = aRoot + encode2(String(entry.absolute).slice(aRoot.length)); + const { root: pRoot } = import_node_path7.default.win32.parse(entry.path); + entry.path = pRoot + encode2(entry.path.slice(pRoot.length)); + } + return true; } - [BUFFERCONCAT](c) { - if (c && !this[ABORTED]) { - this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c; + [ONENTRY](entry) { + if (!this[CHECKPATH](entry)) { + return entry.resume(); + } + import_node_assert.default.equal(typeof entry.absolute, "string"); + switch (entry.type) { + case "Directory": + case "GNUDumpDir": + if (entry.mode) { + entry.mode = entry.mode | 448; + } + // eslint-disable-next-line no-fallthrough + case "File": + case "OldFile": + case "ContiguousFile": + case "Link": + case "SymbolicLink": + return this[CHECKFS](entry); + case "CharacterDevice": + case "BlockDevice": + case "FIFO": + default: + return this[UNSUPPORTED](entry); } } - [MAYBEEND]() { - if (this[ENDED] && !this[EMITTEDEND] && !this[ABORTED] && !this[CONSUMING]) { - this[EMITTEDEND] = true; - const entry = this[WRITEENTRY]; - if (entry && entry.blockRemain) { - const have = this[BUFFER] ? this[BUFFER].length : 0; - this.warn("TAR_BAD_ARCHIVE", `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); - if (this[BUFFER]) { - entry.write(this[BUFFER]); + [ONERROR](er, entry) { + if (er.name === "CwdError") { + this.emit("error", er); + } else { + this.warn("TAR_ENTRY_ERROR", er, { entry }); + this[UNPEND](); + entry.resume(); + } + } + [MKDIR](dir, mode, cb) { + mkdir(normalizeWindowsPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cwd: this.cwd, + mode + }, cb); + } + [DOCHOWN](entry) { + return this.forceChown || this.preserveOwner && (typeof entry.uid === "number" && entry.uid !== this.processUid || typeof entry.gid === "number" && entry.gid !== this.processGid) || typeof this.uid === "number" && this.uid !== this.processUid || typeof this.gid === "number" && this.gid !== this.processGid; + } + [UID](entry) { + return uint32(this.uid, entry.uid, this.processUid); + } + [GID](entry) { + return uint32(this.gid, entry.gid, this.processGid); + } + [FILE](entry, fullyDone) { + const mode = typeof entry.mode === "number" ? entry.mode & 4095 : this.fmode; + const stream = new WriteStream(String(entry.absolute), { + // slight lie, but it can be numeric flags + flags: getWriteFlag(entry.size), + mode, + autoClose: false + }); + stream.on("error", (er) => { + if (stream.fd) { + import_node_fs4.default.close(stream.fd, () => { + }); + } + stream.write = () => true; + this[ONERROR](er, entry); + fullyDone(); + }); + let actions = 1; + const done = (er) => { + if (er) { + if (stream.fd) { + import_node_fs4.default.close(stream.fd, () => { + }); } - entry.end(); + this[ONERROR](er, entry); + fullyDone(); + return; } - this[EMIT](DONE); - } - } - [CONSUMECHUNK](chunk) { - if (this[CONSUMING]) { - this[BUFFERCONCAT](chunk); - } else if (!chunk && !this[BUFFER]) { - this[MAYBEEND](); - } else { - this[CONSUMING] = true; - if (this[BUFFER]) { - this[BUFFERCONCAT](chunk); - const c = this[BUFFER]; - this[BUFFER] = null; - this[CONSUMECHUNKSUB](c); - } else { - this[CONSUMECHUNKSUB](chunk); + if (--actions === 0) { + if (stream.fd !== void 0) { + import_node_fs4.default.close(stream.fd, (er2) => { + if (er2) { + this[ONERROR](er2, entry); + } else { + this[UNPEND](); + } + fullyDone(); + }); + } } - while (this[BUFFER] && this[BUFFER].length >= 512 && !this[ABORTED] && !this[SAW_EOF]) { - const c = this[BUFFER]; - this[BUFFER] = null; - this[CONSUMECHUNKSUB](c); + }; + stream.on("finish", () => { + const abs = String(entry.absolute); + const fd = stream.fd; + if (typeof fd === "number" && entry.mtime && !this.noMtime) { + actions++; + const atime = entry.atime || /* @__PURE__ */ new Date(); + const mtime = entry.mtime; + import_node_fs4.default.futimes(fd, atime, mtime, (er) => er ? import_node_fs4.default.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); } - this[CONSUMING] = false; - } - if (!this[BUFFER] || this[ENDED]) { - this[MAYBEEND](); + if (typeof fd === "number" && this[DOCHOWN](entry)) { + actions++; + const uid = this[UID](entry); + const gid = this[GID](entry); + if (typeof uid === "number" && typeof gid === "number") { + import_node_fs4.default.fchown(fd, uid, gid, (er) => er ? import_node_fs4.default.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); + } + } + done(); + }); + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on("error", (er) => { + this[ONERROR](er, entry); + fullyDone(); + }); + entry.pipe(tx); } + tx.pipe(stream); } - [CONSUMECHUNKSUB](chunk) { - let position = 0; - const length = chunk.length; - while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) { - switch (this[STATE]) { - case "begin": - case "header": - this[CONSUMEHEADER](chunk, position); - position += 512; - break; - case "ignore": - case "body": - position += this[CONSUMEBODY](chunk, position); - break; - case "meta": - position += this[CONSUMEMETA](chunk, position); - break; - default: - throw new Error("invalid state: " + this[STATE]); + [DIRECTORY](entry, fullyDone) { + const mode = typeof entry.mode === "number" ? entry.mode & 4095 : this.dmode; + this[MKDIR](String(entry.absolute), mode, (er) => { + if (er) { + this[ONERROR](er, entry); + fullyDone(); + return; } - } - if (position < length) { - if (this[BUFFER]) { - this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]]); - } else { - this[BUFFER] = chunk.slice(position); + let actions = 1; + const done = () => { + if (--actions === 0) { + fullyDone(); + this[UNPEND](); + entry.resume(); + } + }; + if (entry.mtime && !this.noMtime) { + actions++; + import_node_fs4.default.utimes(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); } - } - } - end(chunk) { - if (!this[ABORTED]) { - if (this[UNZIP]) { - this[UNZIP].end(chunk); - } else { - this[ENDED] = true; - if (this.brotli === void 0) - chunk = chunk || Buffer.alloc(0); - this.write(chunk); + if (this[DOCHOWN](entry)) { + actions++; + import_node_fs4.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); } - } + done(); + }); } - }); - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js -var require_list = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/list.js"(exports, module2) { - "use strict"; - var hlo = require_high_level_opt(); - var Parser = require_parse2(); - var fs8 = require("fs"); - var fsm = require_fs_minipass(); - var path10 = require("path"); - var stripSlash = require_strip_trailing_slashes(); - module2.exports = (opt_, files, cb) => { - if (typeof opt_ === "function") { - cb = opt_, files = null, opt_ = {}; - } else if (Array.isArray(opt_)) { - files = opt_, opt_ = {}; - } - if (typeof files === "function") { - cb = files, files = null; - } - if (!files) { - files = []; - } else { - files = Array.from(files); + [UNSUPPORTED](entry) { + entry.unsupported = true; + this.warn("TAR_ENTRY_UNSUPPORTED", `unsupported entry type: ${entry.type}`, { entry }); + entry.resume(); } - const opt = hlo(opt_); - if (opt.sync && typeof cb === "function") { - throw new TypeError("callback not supported for sync tar functions"); + [SYMLINK](entry, done) { + this[LINK](entry, String(entry.linkpath), "symlink", done); } - if (!opt.file && typeof cb === "function") { - throw new TypeError("callback only supported with file option"); + [HARDLINK](entry, done) { + const linkpath = normalizeWindowsPath(import_node_path7.default.resolve(this.cwd, String(entry.linkpath))); + this[LINK](entry, linkpath, "link", done); } - if (files.length) { - filesFilter(opt, files); + [PEND]() { + this[PENDING]++; } - if (!opt.noResume) { - onentryFunction(opt); + [UNPEND]() { + this[PENDING]--; + this[MAYBECLOSE](); } - return opt.file && opt.sync ? listFileSync(opt) : opt.file ? listFile(opt, cb) : list(opt); - }; - var onentryFunction = (opt) => { - const onentry = opt.onentry; - opt.onentry = onentry ? (e) => { - onentry(e); - e.resume(); - } : (e) => e.resume(); - }; - var filesFilter = (opt, files) => { - const map = new Map(files.map((f) => [stripSlash(f), true])); - const filter = opt.filter; - const mapHas = (file, r) => { - const root = r || path10.parse(file).root || "."; - const ret = file === root ? false : map.has(file) ? map.get(file) : mapHas(path10.dirname(file), root); - map.set(file, ret); - return ret; - }; - opt.filter = filter ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file)) : (file) => mapHas(stripSlash(file)); - }; - var listFileSync = (opt) => { - const p = list(opt); - const file = opt.file; - let threw = true; - let fd; - try { - const stat = fs8.statSync(file); - const readSize = opt.maxReadSize || 16 * 1024 * 1024; - if (stat.size < readSize) { - p.end(fs8.readFileSync(file)); - } else { - let pos = 0; - const buf = Buffer.allocUnsafe(readSize); - fd = fs8.openSync(file, "r"); - while (pos < stat.size) { - const bytesRead = fs8.readSync(fd, buf, 0, readSize, pos); - pos += bytesRead; - p.write(buf.slice(0, bytesRead)); - } - p.end(); - } - threw = false; - } finally { - if (threw && fd) { - try { - fs8.closeSync(fd); - } catch (er) { - } - } + [SKIP](entry) { + this[UNPEND](); + entry.resume(); } - }; - var listFile = (opt, cb) => { - const parse = new Parser(opt); - const readSize = opt.maxReadSize || 16 * 1024 * 1024; - const file = opt.file; - const p = new Promise((resolve, reject) => { - parse.on("error", reject); - parse.on("end", resolve); - fs8.stat(file, (er, stat) => { - if (er) { - reject(er); - } else { - const stream = new fsm.ReadStream(file, { - readSize, - size: stat.size - }); - stream.on("error", reject); - stream.pipe(parse); - } - }); - }); - return cb ? p.then(cb, cb) : p; - }; - var list = (opt) => new Parser(opt); - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js -var require_create = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/create.js"(exports, module2) { - "use strict"; - var hlo = require_high_level_opt(); - var Pack = require_pack(); - var fsm = require_fs_minipass(); - var t = require_list(); - var path10 = require("path"); - module2.exports = (opt_, files, cb) => { - if (typeof files === "function") { - cb = files; - } - if (Array.isArray(opt_)) { - files = opt_, opt_ = {}; - } - if (!files || !Array.isArray(files) || !files.length) { - throw new TypeError("no files or directories specified"); - } - files = Array.from(files); - const opt = hlo(opt_); - if (opt.sync && typeof cb === "function") { - throw new TypeError("callback not supported for sync tar functions"); - } - if (!opt.file && typeof cb === "function") { - throw new TypeError("callback only supported with file option"); - } - return opt.file && opt.sync ? createFileSync(opt, files) : opt.file ? createFile(opt, files, cb) : opt.sync ? createSync(opt, files) : create(opt, files); - }; - var createFileSync = (opt, files) => { - const p = new Pack.Sync(opt); - const stream = new fsm.WriteStreamSync(opt.file, { - mode: opt.mode || 438 - }); - p.pipe(stream); - addFilesSync(p, files); - }; - var createFile = (opt, files, cb) => { - const p = new Pack(opt); - const stream = new fsm.WriteStream(opt.file, { - mode: opt.mode || 438 - }); - p.pipe(stream); - const promise = new Promise((res, rej) => { - stream.on("error", rej); - stream.on("close", res); - p.on("error", rej); - }); - addFilesAsync(p, files); - return cb ? promise.then(cb, cb) : promise; - }; - var addFilesSync = (p, files) => { - files.forEach((file) => { - if (file.charAt(0) === "@") { - t({ - file: path10.resolve(p.cwd, file.slice(1)), - sync: true, - noResume: true, - onentry: (entry) => p.add(entry) - }); - } else { - p.add(file); - } - }); - p.end(); - }; - var addFilesAsync = (p, files) => { - while (files.length) { - const file = files.shift(); - if (file.charAt(0) === "@") { - return t({ - file: path10.resolve(p.cwd, file.slice(1)), - noResume: true, - onentry: (entry) => p.add(entry) - }).then((_) => addFilesAsync(p, files)); - } else { - p.add(file); + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE](entry, st) { + return entry.type === "File" && !this.unlink && st.isFile() && st.nlink <= 1 && !isWindows3; + } + // check if a thing is there, and if so, try to clobber it + [CHECKFS](entry) { + this[PEND](); + const paths = [entry.path]; + if (entry.linkpath) { + paths.push(entry.linkpath); } + this.reservations.reserve(paths, (done) => this[CHECKFS2](entry, done)); } - p.end(); - }; - var createSync = (opt, files) => { - const p = new Pack.Sync(opt); - addFilesSync(p, files); - return p; - }; - var create = (opt, files) => { - const p = new Pack(opt); - addFilesAsync(p, files); - return p; - }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js -var require_replace = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/replace.js"(exports, module2) { - "use strict"; - var hlo = require_high_level_opt(); - var Pack = require_pack(); - var fs8 = require("fs"); - var fsm = require_fs_minipass(); - var t = require_list(); - var path10 = require("path"); - var Header = require_header(); - module2.exports = (opt_, files, cb) => { - const opt = hlo(opt_); - if (!opt.file) { - throw new TypeError("file is required"); - } - if (opt.gzip || opt.brotli || opt.file.endsWith(".br") || opt.file.endsWith(".tbr")) { - throw new TypeError("cannot append to compressed archives"); - } - if (!files || !Array.isArray(files) || !files.length) { - throw new TypeError("no files or directories specified"); - } - files = Array.from(files); - return opt.sync ? replaceSync(opt, files) : replace(opt, files, cb); - }; - var replaceSync = (opt, files) => { - const p = new Pack.Sync(opt); - let threw = true; - let fd; - let position; - try { - try { - fd = fs8.openSync(opt.file, "r+"); - } catch (er) { - if (er.code === "ENOENT") { - fd = fs8.openSync(opt.file, "w+"); - } else { - throw er; - } - } - const st = fs8.fstatSync(fd); - const headBuf = Buffer.alloc(512); - POSITION: - for (position = 0; position < st.size; position += 512) { - for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { - bytes = fs8.readSync( - fd, - headBuf, - bufPos, - headBuf.length - bufPos, - position + bufPos - ); - if (position === 0 && headBuf[0] === 31 && headBuf[1] === 139) { - throw new Error("cannot append to compressed archives"); - } - if (!bytes) { - break POSITION; - } + [CHECKFS2](entry, fullyDone) { + const done = (er) => { + fullyDone(er); + }; + const checkCwd2 = () => { + this[MKDIR](this.cwd, this.dmode, (er) => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + this[CHECKED_CWD] = true; + start(); + }); + }; + const start = () => { + if (entry.absolute !== this.cwd) { + const parent = normalizeWindowsPath(import_node_path7.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + return this[MKDIR](parent, this.dmode, (er) => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + afterMakeParent(); + }); + } + } + afterMakeParent(); + }; + const afterMakeParent = () => { + import_node_fs4.default.lstat(String(entry.absolute), (lstatEr, st) => { + if (st && (this.keep || /* c8 ignore next */ + this.newer && st.mtime > (entry.mtime ?? st.mtime))) { + this[SKIP](entry); + done(); + return; } - const h = new Header(headBuf); - if (!h.cksumValid) { - break; + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry, done); } - const entryBlockSize = 512 * Math.ceil(h.size / 512); - if (position + entryBlockSize + 512 > st.size) { - break; + if (st.isDirectory()) { + if (entry.type === "Directory") { + const needChmod = this.chmod && entry.mode && (st.mode & 4095) !== entry.mode; + const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done); + if (!needChmod) { + return afterChmod(); + } + return import_node_fs4.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + } + if (entry.absolute !== this.cwd) { + return import_node_fs4.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + } } - position += entryBlockSize; - if (opt.mtimeCache) { - opt.mtimeCache.set(h.path, h.mtime); + if (entry.absolute === this.cwd) { + return this[MAKEFS](null, entry, done); } - } - threw = false; - streamSync(opt, p, position, fd, files); - } finally { - if (threw) { - try { - fs8.closeSync(fd); - } catch (er) { - } + unlinkFile(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + }); + }; + if (this[CHECKED_CWD]) { + start(); + } else { + checkCwd2(); } } - }; - var streamSync = (opt, p, position, fd, files) => { - const stream = new fsm.WriteStreamSync(opt.file, { - fd, - start: position - }); - p.pipe(stream); - addFilesSync(p, files); - }; - var replace = (opt, files, cb) => { - files = Array.from(files); - const p = new Pack(opt); - const getPos = (fd, size, cb_) => { - const cb2 = (er, pos) => { - if (er) { - fs8.close(fd, (_) => cb_(er)); - } else { - cb_(null, pos); - } - }; - let position = 0; - if (size === 0) { - return cb2(null, 0); + [MAKEFS](er, entry, done) { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + switch (entry.type) { + case "File": + case "OldFile": + case "ContiguousFile": + return this[FILE](entry, done); + case "Link": + return this[HARDLINK](entry, done); + case "SymbolicLink": + return this[SYMLINK](entry, done); + case "Directory": + case "GNUDumpDir": + return this[DIRECTORY](entry, done); } - let bufPos = 0; - const headBuf = Buffer.alloc(512); - const onread = (er, bytes) => { + } + [LINK](entry, linkpath, link, done) { + import_node_fs4.default[link](linkpath, String(entry.absolute), (er) => { if (er) { - return cb2(er); - } - bufPos += bytes; - if (bufPos < 512 && bytes) { - return fs8.read( - fd, - headBuf, - bufPos, - headBuf.length - bufPos, - position + bufPos, - onread - ); - } - if (position === 0 && headBuf[0] === 31 && headBuf[1] === 139) { - return cb2(new Error("cannot append to compressed archives")); + this[ONERROR](er, entry); + } else { + this[UNPEND](); + entry.resume(); } - if (bufPos < 512) { - return cb2(null, position); + done(); + }); + } + }; + callSync = (fn2) => { + try { + return [null, fn2()]; + } catch (er) { + return [er, null]; + } + }; + UnpackSync = class extends Unpack { + sync = true; + [MAKEFS](er, entry) { + return super[MAKEFS](er, entry, () => { + }); + } + [CHECKFS](entry) { + if (!this[CHECKED_CWD]) { + const er2 = this[MKDIR](this.cwd, this.dmode); + if (er2) { + return this[ONERROR](er2, entry); } - const h = new Header(headBuf); - if (!h.cksumValid) { - return cb2(null, position); + this[CHECKED_CWD] = true; + } + if (entry.absolute !== this.cwd) { + const parent = normalizeWindowsPath(import_node_path7.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + const mkParent = this[MKDIR](parent, this.dmode); + if (mkParent) { + return this[ONERROR](mkParent, entry); + } } - const entryBlockSize = 512 * Math.ceil(h.size / 512); - if (position + entryBlockSize + 512 > size) { - return cb2(null, position); + } + const [lstatEr, st] = callSync(() => import_node_fs4.default.lstatSync(String(entry.absolute))); + if (st && (this.keep || /* c8 ignore next */ + this.newer && st.mtime > (entry.mtime ?? st.mtime))) { + return this[SKIP](entry); + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry); + } + if (st.isDirectory()) { + if (entry.type === "Directory") { + const needChmod = this.chmod && entry.mode && (st.mode & 4095) !== entry.mode; + const [er3] = needChmod ? callSync(() => { + import_node_fs4.default.chmodSync(String(entry.absolute), Number(entry.mode)); + }) : []; + return this[MAKEFS](er3, entry); } - position += entryBlockSize + 512; - if (position >= size) { - return cb2(null, position); + const [er2] = callSync(() => import_node_fs4.default.rmdirSync(String(entry.absolute))); + this[MAKEFS](er2, entry); + } + const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + [FILE](entry, done) { + const mode = typeof entry.mode === "number" ? entry.mode & 4095 : this.fmode; + const oner = (er) => { + let closeError; + try { + import_node_fs4.default.closeSync(fd); + } catch (e) { + closeError = e; } - if (opt.mtimeCache) { - opt.mtimeCache.set(h.path, h.mtime); + if (er || closeError) { + this[ONERROR](er || closeError, entry); } - bufPos = 0; - fs8.read(fd, headBuf, 0, 512, position, onread); + done(); }; - fs8.read(fd, headBuf, 0, 512, position, onread); - }; - const promise = new Promise((resolve, reject) => { - p.on("error", reject); - let flag = "r+"; - const onopen = (er, fd) => { - if (er && er.code === "ENOENT" && flag === "r+") { - flag = "w+"; - return fs8.open(opt.file, flag, onopen); - } - if (er) { - return reject(er); + let fd; + try { + fd = import_node_fs4.default.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); + } catch (er) { + return oner(er); + } + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on("error", (er) => this[ONERROR](er, entry)); + entry.pipe(tx); + } + tx.on("data", (chunk) => { + try { + import_node_fs4.default.writeSync(fd, chunk, 0, chunk.length); + } catch (er) { + oner(er); } - fs8.fstat(fd, (er2, st) => { - if (er2) { - return fs8.close(fd, () => reject(er2)); + }); + tx.on("end", () => { + let er = null; + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || /* @__PURE__ */ new Date(); + const mtime = entry.mtime; + try { + import_node_fs4.default.futimesSync(fd, atime, mtime); + } catch (futimeser) { + try { + import_node_fs4.default.utimesSync(String(entry.absolute), atime, mtime); + } catch (utimeser) { + er = futimeser; + } } - getPos(fd, st.size, (er3, position) => { - if (er3) { - return reject(er3); + } + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry); + const gid = this[GID](entry); + try { + import_node_fs4.default.fchownSync(fd, Number(uid), Number(gid)); + } catch (fchowner) { + try { + import_node_fs4.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); + } catch (chowner) { + er = er || fchowner; } - const stream = new fsm.WriteStream(opt.file, { - fd, - start: position - }); - p.pipe(stream); - stream.on("error", reject); - stream.on("close", resolve); - addFilesAsync(p, files); - }); - }); - }; - fs8.open(opt.file, flag, onopen); - }); - return cb ? promise.then(cb, cb) : promise; - }; - var addFilesSync = (p, files) => { - files.forEach((file) => { - if (file.charAt(0) === "@") { - t({ - file: path10.resolve(p.cwd, file.slice(1)), - sync: true, - noResume: true, - onentry: (entry) => p.add(entry) - }); - } else { - p.add(file); + } + } + oner(er); + }); + } + [DIRECTORY](entry, done) { + const mode = typeof entry.mode === "number" ? entry.mode & 4095 : this.dmode; + const er = this[MKDIR](String(entry.absolute), mode); + if (er) { + this[ONERROR](er, entry); + done(); + return; } - }); - p.end(); - }; - var addFilesAsync = (p, files) => { - while (files.length) { - const file = files.shift(); - if (file.charAt(0) === "@") { - return t({ - file: path10.resolve(p.cwd, file.slice(1)), - noResume: true, - onentry: (entry) => p.add(entry) - }).then((_) => addFilesAsync(p, files)); - } else { - p.add(file); + if (entry.mtime && !this.noMtime) { + try { + import_node_fs4.default.utimesSync(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime); + } catch (er2) { + } } - } - p.end(); - }; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js -var require_update = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/update.js"(exports, module2) { - "use strict"; - var hlo = require_high_level_opt(); - var r = require_replace(); - module2.exports = (opt_, files, cb) => { - const opt = hlo(opt_); - if (!opt.file) { - throw new TypeError("file is required"); - } - if (opt.gzip || opt.brotli || opt.file.endsWith(".br") || opt.file.endsWith(".tbr")) { - throw new TypeError("cannot append to compressed archives"); - } - if (!files || !Array.isArray(files) || !files.length) { - throw new TypeError("no files or directories specified"); - } - files = Array.from(files); - mtimeFilter(opt); - return r(opt, files, cb); - }; - var mtimeFilter = (opt) => { - const filter = opt.filter; - if (!opt.mtimeCache) { - opt.mtimeCache = /* @__PURE__ */ new Map(); - } - opt.filter = filter ? (path10, stat) => filter(path10, stat) && !(opt.mtimeCache.get(path10) > stat.mtime) : (path10, stat) => !(opt.mtimeCache.get(path10) > stat.mtime); - }; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/opts-arg.js -var require_opts_arg = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/opts-arg.js"(exports, module2) { - var { promisify } = require("util"); - var fs8 = require("fs"); - var optsArg = (opts) => { - if (!opts) - opts = { mode: 511, fs: fs8 }; - else if (typeof opts === "object") - opts = { mode: 511, fs: fs8, ...opts }; - else if (typeof opts === "number") - opts = { mode: opts, fs: fs8 }; - else if (typeof opts === "string") - opts = { mode: parseInt(opts, 8), fs: fs8 }; - else - throw new TypeError("invalid options argument"); - opts.mkdir = opts.mkdir || opts.fs.mkdir || fs8.mkdir; - opts.mkdirAsync = promisify(opts.mkdir); - opts.stat = opts.stat || opts.fs.stat || fs8.stat; - opts.statAsync = promisify(opts.stat); - opts.statSync = opts.statSync || opts.fs.statSync || fs8.statSync; - opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs8.mkdirSync; - return opts; - }; - module2.exports = optsArg; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/path-arg.js -var require_path_arg = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/path-arg.js"(exports, module2) { - var platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; - var { resolve, parse } = require("path"); - var pathArg = (path10) => { - if (/\0/.test(path10)) { - throw Object.assign( - new TypeError("path must be a string without null bytes"), - { - path: path10, - code: "ERR_INVALID_ARG_VALUE" + if (this[DOCHOWN](entry)) { + try { + import_node_fs4.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + } catch (er2) { } - ); - } - path10 = resolve(path10); - if (platform === "win32") { - const badWinChars = /[*|"<>?:]/; - const { root } = parse(path10); - if (badWinChars.test(path10.substr(root.length))) { - throw Object.assign(new Error("Illegal characters in path."), { - path: path10, - code: "EINVAL" - }); } + done(); + entry.resume(); } - return path10; - }; - module2.exports = pathArg; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/find-made.js -var require_find_made = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/find-made.js"(exports, module2) { - var { dirname } = require("path"); - var findMade = (opts, parent, path10 = void 0) => { - if (path10 === parent) - return Promise.resolve(); - return opts.statAsync(parent).then( - (st) => st.isDirectory() ? path10 : void 0, - // will fail later - (er) => er.code === "ENOENT" ? findMade(opts, dirname(parent), parent) : void 0 - ); - }; - var findMadeSync = (opts, parent, path10 = void 0) => { - if (path10 === parent) - return void 0; - try { - return opts.statSync(parent).isDirectory() ? path10 : void 0; - } catch (er) { - return er.code === "ENOENT" ? findMadeSync(opts, dirname(parent), parent) : void 0; - } - }; - module2.exports = { findMade, findMadeSync }; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/mkdirp-manual.js -var require_mkdirp_manual = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/mkdirp-manual.js"(exports, module2) { - var { dirname } = require("path"); - var mkdirpManual = (path10, opts, made) => { - opts.recursive = false; - const parent = dirname(path10); - if (parent === path10) { - return opts.mkdirAsync(path10, opts).catch((er) => { - if (er.code !== "EISDIR") - throw er; - }); - } - return opts.mkdirAsync(path10, opts).then(() => made || path10, (er) => { - if (er.code === "ENOENT") - return mkdirpManual(parent, opts).then((made2) => mkdirpManual(path10, opts, made2)); - if (er.code !== "EEXIST" && er.code !== "EROFS") - throw er; - return opts.statAsync(path10).then((st) => { - if (st.isDirectory()) - return made; - else - throw er; - }, () => { - throw er; - }); - }); - }; - var mkdirpManualSync = (path10, opts, made) => { - const parent = dirname(path10); - opts.recursive = false; - if (parent === path10) { + [MKDIR](dir, mode) { try { - return opts.mkdirSync(path10, opts); + return mkdirSync2(normalizeWindowsPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cwd: this.cwd, + mode + }); } catch (er) { - if (er.code !== "EISDIR") - throw er; - else - return; + return er; } } - try { - opts.mkdirSync(path10, opts); - return made || path10; - } catch (er) { - if (er.code === "ENOENT") - return mkdirpManualSync(path10, opts, mkdirpManualSync(parent, opts, made)); - if (er.code !== "EEXIST" && er.code !== "EROFS") - throw er; + [LINK](entry, linkpath, link, done) { + const ls = `${link}Sync`; try { - if (!opts.statSync(path10).isDirectory()) - throw er; - } catch (_) { - throw er; + import_node_fs4.default[ls](linkpath, String(entry.absolute)); + done(); + entry.resume(); + } catch (er) { + return this[ONERROR](er, entry); } } }; - module2.exports = { mkdirpManual, mkdirpManualSync }; } }); -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/mkdirp-native.js -var require_mkdirp_native = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/mkdirp-native.js"(exports, module2) { - var { dirname } = require("path"); - var { findMade, findMadeSync } = require_find_made(); - var { mkdirpManual, mkdirpManualSync } = require_mkdirp_manual(); - var mkdirpNative = (path10, opts) => { - opts.recursive = true; - const parent = dirname(path10); - if (parent === path10) - return opts.mkdirAsync(path10, opts); - return findMade(opts, path10).then((made) => opts.mkdirAsync(path10, opts).then(() => made).catch((er) => { - if (er.code === "ENOENT") - return mkdirpManual(path10, opts); - else - throw er; - })); +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/extract.js +var extract_exports = {}; +__export(extract_exports, { + extract: () => extract +}); +var import_node_fs5, extractFileSync, extractFile, extract; +var init_extract = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/extract.js"() { + init_esm2(); + import_node_fs5 = __toESM(require("node:fs"), 1); + init_list(); + init_make_command(); + init_unpack(); + extractFileSync = (opt) => { + const u = new UnpackSync(opt); + const file = opt.file; + const stat = import_node_fs5.default.statSync(file); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const stream = new ReadStreamSync(file, { + readSize, + size: stat.size + }); + stream.pipe(u); }; - var mkdirpNativeSync = (path10, opts) => { - opts.recursive = true; - const parent = dirname(path10); - if (parent === path10) - return opts.mkdirSync(path10, opts); - const made = findMadeSync(opts, path10); - try { - opts.mkdirSync(path10, opts); - return made; - } catch (er) { - if (er.code === "ENOENT") - return mkdirpManualSync(path10, opts); - else - throw er; - } + extractFile = (opt, _) => { + const u = new Unpack(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + u.on("error", reject); + u.on("close", resolve); + import_node_fs5.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } else { + const stream = new ReadStream(file, { + readSize, + size: stat.size + }); + stream.on("error", reject); + stream.pipe(u); + } + }); + }); + return p; }; - module2.exports = { mkdirpNative, mkdirpNativeSync }; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js -var require_use_native = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/lib/use-native.js"(exports, module2) { - var fs8 = require("fs"); - var version2 = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; - var versArr = version2.replace(/^v/, "").split("."); - var hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12; - var useNative = !hasNative ? () => false : (opts) => opts.mkdir === fs8.mkdir; - var useNativeSync = !hasNative ? () => false : (opts) => opts.mkdirSync === fs8.mkdirSync; - module2.exports = { useNative, useNativeSync }; - } -}); - -// .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/index.js -var require_mkdirp = __commonJS({ - ".yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-46ea0f3ffa.zip/node_modules/mkdirp/index.js"(exports, module2) { - var optsArg = require_opts_arg(); - var pathArg = require_path_arg(); - var { mkdirpNative, mkdirpNativeSync } = require_mkdirp_native(); - var { mkdirpManual, mkdirpManualSync } = require_mkdirp_manual(); - var { useNative, useNativeSync } = require_use_native(); - var mkdirp = (path10, opts) => { - path10 = pathArg(path10); - opts = optsArg(opts); - return useNative(opts) ? mkdirpNative(path10, opts) : mkdirpManual(path10, opts); - }; - var mkdirpSync = (path10, opts) => { - path10 = pathArg(path10); - opts = optsArg(opts); - return useNativeSync(opts) ? mkdirpNativeSync(path10, opts) : mkdirpManualSync(path10, opts); - }; - mkdirp.sync = mkdirpSync; - mkdirp.native = (path10, opts) => mkdirpNative(pathArg(path10), optsArg(opts)); - mkdirp.manual = (path10, opts) => mkdirpManual(pathArg(path10), optsArg(opts)); - mkdirp.nativeSync = (path10, opts) => mkdirpNativeSync(pathArg(path10), optsArg(opts)); - mkdirp.manualSync = (path10, opts) => mkdirpManualSync(pathArg(path10), optsArg(opts)); - module2.exports = mkdirp; + extract = makeCommand(extractFileSync, extractFile, (opt) => new UnpackSync(opt), (opt) => new Unpack(opt), (opt, files) => { + if (files?.length) + filesFilter(opt, files); + }); } }); -// .yarn/cache/chownr-npm-2.0.0-638f1c9c61-594754e130.zip/node_modules/chownr/chownr.js -var require_chownr = __commonJS({ - ".yarn/cache/chownr-npm-2.0.0-638f1c9c61-594754e130.zip/node_modules/chownr/chownr.js"(exports, module2) { +// .yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-3878511925.zip/node_modules/v8-compile-cache/v8-compile-cache.js +var require_v8_compile_cache = __commonJS({ + ".yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-3878511925.zip/node_modules/v8-compile-cache/v8-compile-cache.js"(exports2, module2) { "use strict"; - var fs8 = require("fs"); - var path10 = require("path"); - var LCHOWN = fs8.lchown ? "lchown" : "chown"; - var LCHOWNSYNC = fs8.lchownSync ? "lchownSync" : "chownSync"; - var needEISDIRHandled = fs8.lchown && !process.version.match(/v1[1-9]+\./) && !process.version.match(/v10\.[6-9]/); - var lchownSync = (path11, uid, gid) => { - try { - return fs8[LCHOWNSYNC](path11, uid, gid); - } catch (er) { - if (er.code !== "ENOENT") - throw er; - } - }; - var chownSync = (path11, uid, gid) => { - try { - return fs8.chownSync(path11, uid, gid); - } catch (er) { - if (er.code !== "ENOENT") - throw er; - } - }; - var handleEISDIR = needEISDIRHandled ? (path11, uid, gid, cb) => (er) => { - if (!er || er.code !== "EISDIR") - cb(er); - else - fs8.chown(path11, uid, gid, cb); - } : (_, __, ___, cb) => cb; - var handleEISDirSync = needEISDIRHandled ? (path11, uid, gid) => { - try { - return lchownSync(path11, uid, gid); - } catch (er) { - if (er.code !== "EISDIR") - throw er; - chownSync(path11, uid, gid); - } - } : (path11, uid, gid) => lchownSync(path11, uid, gid); - var nodeVersion = process.version; - var readdir = (path11, options, cb) => fs8.readdir(path11, options, cb); - var readdirSync = (path11, options) => fs8.readdirSync(path11, options); - if (/^v4\./.test(nodeVersion)) - readdir = (path11, options, cb) => fs8.readdir(path11, cb); - var chown = (cpath, uid, gid, cb) => { - fs8[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, (er) => { - cb(er && er.code !== "ENOENT" ? er : null); - })); - }; - var chownrKid = (p, child, uid, gid, cb) => { - if (typeof child === "string") - return fs8.lstat(path10.resolve(p, child), (er, stats) => { - if (er) - return cb(er.code !== "ENOENT" ? er : null); - stats.name = child; - chownrKid(p, stats, uid, gid, cb); - }); - if (child.isDirectory()) { - chownr(path10.resolve(p, child.name), uid, gid, (er) => { - if (er) - return cb(er); - const cpath = path10.resolve(p, child.name); - chown(cpath, uid, gid, cb); - }); - } else { - const cpath = path10.resolve(p, child.name); - chown(cpath, uid, gid, cb); + var Module2 = require("module"); + var crypto = require("crypto"); + var fs17 = require("fs"); + var path16 = require("path"); + var vm = require("vm"); + var os3 = require("os"); + var hasOwnProperty = Object.prototype.hasOwnProperty; + var FileSystemBlobStore = class { + constructor(directory, prefix) { + const name2 = prefix ? slashEscape(prefix + ".") : ""; + this._blobFilename = path16.join(directory, name2 + "BLOB"); + this._mapFilename = path16.join(directory, name2 + "MAP"); + this._lockFilename = path16.join(directory, name2 + "LOCK"); + this._directory = directory; + this._load(); } - }; - var chownr = (p, uid, gid, cb) => { - readdir(p, { withFileTypes: true }, (er, children) => { - if (er) { - if (er.code === "ENOENT") - return cb(); - else if (er.code !== "ENOTDIR" && er.code !== "ENOTSUP") - return cb(er); + has(key, invalidationKey) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { + return this._invalidationKeys[key] === invalidationKey; + } else if (hasOwnProperty.call(this._storedMap, key)) { + return this._storedMap[key][0] === invalidationKey; } - if (er || !children.length) - return chown(p, uid, gid, cb); - let len = children.length; - let errState = null; - const then = (er2) => { - if (errState) - return; - if (er2) - return cb(errState = er2); - if (--len === 0) - return chown(p, uid, gid, cb); - }; - children.forEach((child) => chownrKid(p, child, uid, gid, then)); - }); - }; - var chownrKidSync = (p, child, uid, gid) => { - if (typeof child === "string") { - try { - const stats = fs8.lstatSync(path10.resolve(p, child)); - stats.name = child; - child = stats; - } catch (er) { - if (er.code === "ENOENT") - return; - else - throw er; + return false; + } + get(key, invalidationKey) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { + if (this._invalidationKeys[key] === invalidationKey) { + return this._memoryBlobs[key]; + } + } else if (hasOwnProperty.call(this._storedMap, key)) { + const mapping = this._storedMap[key]; + if (mapping[0] === invalidationKey) { + return this._storedBlob.slice(mapping[1], mapping[2]); + } } } - if (child.isDirectory()) - chownrSync(path10.resolve(p, child.name), uid, gid); - handleEISDirSync(path10.resolve(p, child.name), uid, gid); - }; - var chownrSync = (p, uid, gid) => { - let children; - try { - children = readdirSync(p, { withFileTypes: true }); - } catch (er) { - if (er.code === "ENOENT") - return; - else if (er.code === "ENOTDIR" || er.code === "ENOTSUP") - return handleEISDirSync(p, uid, gid); - else - throw er; + set(key, invalidationKey, buffer) { + this._invalidationKeys[key] = invalidationKey; + this._memoryBlobs[key] = buffer; + this._dirty = true; } - if (children && children.length) - children.forEach((child) => chownrKidSync(p, child, uid, gid)); - return handleEISDirSync(p, uid, gid); - }; - module2.exports = chownr; - chownr.sync = chownrSync; - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js -var require_mkdir = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/mkdir.js"(exports, module2) { - "use strict"; - var mkdirp = require_mkdirp(); - var fs8 = require("fs"); - var path10 = require("path"); - var chownr = require_chownr(); - var normPath = require_normalize_windows_path(); - var SymlinkError = class extends Error { - constructor(symlink, path11) { - super("Cannot extract through symbolic link"); - this.path = path11; - this.symlink = symlink; + delete(key) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { + this._dirty = true; + delete this._memoryBlobs[key]; + } + if (hasOwnProperty.call(this._invalidationKeys, key)) { + this._dirty = true; + delete this._invalidationKeys[key]; + } + if (hasOwnProperty.call(this._storedMap, key)) { + this._dirty = true; + delete this._storedMap[key]; + } } - get name() { - return "SylinkError"; + isDirty() { + return this._dirty; } - }; - var CwdError = class extends Error { - constructor(path11, code) { - super(code + ": Cannot cd into '" + path11 + "'"); - this.path = path11; - this.code = code; + save() { + const dump = this._getDump(); + const blobToStore = Buffer.concat(dump[0]); + const mapToStore = JSON.stringify(dump[1]); + try { + mkdirpSync(this._directory); + fs17.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); + } catch (error) { + return false; + } + try { + fs17.writeFileSync(this._blobFilename, blobToStore); + fs17.writeFileSync(this._mapFilename, mapToStore); + } finally { + fs17.unlinkSync(this._lockFilename); + } + return true; } - get name() { - return "CwdError"; + _load() { + try { + this._storedBlob = fs17.readFileSync(this._blobFilename); + this._storedMap = JSON.parse(fs17.readFileSync(this._mapFilename)); + } catch (e) { + this._storedBlob = Buffer.alloc(0); + this._storedMap = {}; + } + this._dirty = false; + this._memoryBlobs = {}; + this._invalidationKeys = {}; } - }; - var cGet = (cache, key) => cache.get(normPath(key)); - var cSet = (cache, key, val) => cache.set(normPath(key), val); - var checkCwd = (dir, cb) => { - fs8.stat(dir, (er, st) => { - if (er || !st.isDirectory()) { - er = new CwdError(dir, er && er.code || "ENOTDIR"); + _getDump() { + const buffers = []; + const newMap = {}; + let offset = 0; + function push2(key, invalidationKey, buffer) { + buffers.push(buffer); + newMap[key] = [invalidationKey, offset, offset + buffer.length]; + offset += buffer.length; } - cb(er); - }); - }; - module2.exports = (dir, opt, cb) => { - dir = normPath(dir); - const umask = opt.umask; - const mode = opt.mode | 448; - const needChmod = (mode & umask) !== 0; - const uid = opt.uid; - const gid = opt.gid; - const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); - const preserve = opt.preserve; - const unlink = opt.unlink; - const cache = opt.cache; - const cwd = normPath(opt.cwd); - const done = (er, created) => { - if (er) { - cb(er); - } else { - cSet(cache, dir, true); - if (created && doChown) { - chownr(created, uid, gid, (er2) => done(er2)); - } else if (needChmod) { - fs8.chmod(dir, mode, cb); - } else { - cb(); - } + for (const key of Object.keys(this._memoryBlobs)) { + const buffer = this._memoryBlobs[key]; + const invalidationKey = this._invalidationKeys[key]; + push2(key, invalidationKey, buffer); } - }; - if (cache && cGet(cache, dir) === true) { - return done(); + for (const key of Object.keys(this._storedMap)) { + if (hasOwnProperty.call(newMap, key)) continue; + const mapping = this._storedMap[key]; + const buffer = this._storedBlob.slice(mapping[1], mapping[2]); + push2(key, mapping[0], buffer); + } + return [buffers, newMap]; } - if (dir === cwd) { - return checkCwd(dir, done); + }; + var NativeCompileCache = class { + constructor() { + this._cacheStore = null; + this._previousModuleCompile = null; } - if (preserve) { - return mkdirp(dir, { mode }).then((made) => done(null, made), done); + setCacheStore(cacheStore) { + this._cacheStore = cacheStore; } - const sub = normPath(path10.relative(cwd, dir)); - const parts = sub.split("/"); - mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done); - }; - var mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { - if (!parts.length) { - return cb(null, created); + install() { + const self2 = this; + const hasRequireResolvePaths = typeof require.resolve.paths === "function"; + this._previousModuleCompile = Module2.prototype._compile; + Module2.prototype._compile = function(content, filename) { + const mod = this; + function require2(id) { + return mod.require(id); + } + function resolve(request, options) { + return Module2._resolveFilename(request, mod, false, options); + } + require2.resolve = resolve; + if (hasRequireResolvePaths) { + resolve.paths = function paths(request) { + return Module2._resolveLookupPaths(request, mod, true); + }; + } + require2.main = process.mainModule; + require2.extensions = Module2._extensions; + require2.cache = Module2._cache; + const dirname2 = path16.dirname(filename); + const compiledWrapper = self2._moduleCompile(filename, content); + const args = [mod.exports, require2, mod, filename, dirname2, process, global, Buffer]; + return compiledWrapper.apply(mod.exports, args); + }; } - const p = parts.shift(); - const part = normPath(path10.resolve(base + "/" + p)); - if (cGet(cache, part)) { - return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + uninstall() { + Module2.prototype._compile = this._previousModuleCompile; } - fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); - }; - var onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { - if (er) { - fs8.lstat(part, (statEr, st) => { - if (statEr) { - statEr.path = statEr.path && normPath(statEr.path); - cb(statEr); - } else if (st.isDirectory()) { - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); - } else if (unlink) { - fs8.unlink(part, (er2) => { - if (er2) { - return cb(er2); + _moduleCompile(filename, content) { + var contLen = content.length; + if (contLen >= 2) { + if (content.charCodeAt(0) === 35 && content.charCodeAt(1) === 33) { + if (contLen === 2) { + content = ""; + } else { + var i = 2; + for (; i < contLen; ++i) { + var code2 = content.charCodeAt(i); + if (code2 === 10 || code2 === 13) break; } - fs8.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); - }); - } else if (st.isSymbolicLink()) { - return cb(new SymlinkError(part, part + "/" + parts.join("/"))); - } else { - cb(er); + if (i === contLen) { + content = ""; + } else { + content = content.slice(i); + } + } } + } + var wrapper = Module2.wrap(content); + var invalidationKey = crypto.createHash("sha1").update(content, "utf8").digest("hex"); + var buffer = this._cacheStore.get(filename, invalidationKey); + var script = new vm.Script(wrapper, { + filename, + lineOffset: 0, + displayErrors: true, + cachedData: buffer, + produceCachedData: true }); - } else { - created = created || part; - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + if (script.cachedDataProduced) { + this._cacheStore.set(filename, invalidationKey, script.cachedData); + } else if (script.cachedDataRejected) { + this._cacheStore.delete(filename); + } + var compiledWrapper = script.runInThisContext({ + filename, + lineOffset: 0, + columnOffset: 0, + displayErrors: true + }); + return compiledWrapper; } }; - var checkCwdSync = (dir) => { - let ok = false; - let code = "ENOTDIR"; + function mkdirpSync(p_) { + _mkdirpSync(path16.resolve(p_), 511); + } + function _mkdirpSync(p, mode) { try { - ok = fs8.statSync(dir).isDirectory(); - } catch (er) { - code = er.code; - } finally { - if (!ok) { - throw new CwdError(dir, code); + fs17.mkdirSync(p, mode); + } catch (err0) { + if (err0.code === "ENOENT") { + _mkdirpSync(path16.dirname(p)); + _mkdirpSync(p); + } else { + try { + const stat = fs17.statSync(p); + if (!stat.isDirectory()) { + throw err0; + } + } catch (err1) { + throw err0; + } } } - }; - module2.exports.sync = (dir, opt) => { - dir = normPath(dir); - const umask = opt.umask; - const mode = opt.mode | 448; - const needChmod = (mode & umask) !== 0; - const uid = opt.uid; - const gid = opt.gid; - const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); - const preserve = opt.preserve; - const unlink = opt.unlink; - const cache = opt.cache; - const cwd = normPath(opt.cwd); - const done = (created2) => { - cSet(cache, dir, true); - if (created2 && doChown) { - chownr.sync(created2, uid, gid); - } - if (needChmod) { - fs8.chmodSync(dir, mode); - } + } + function slashEscape(str) { + const ESCAPE_LOOKUP = { + "\\": "zB", + ":": "zC", + "/": "zS", + "\0": "z0", + "z": "zZ" }; - if (cache && cGet(cache, dir) === true) { - return done(); - } - if (dir === cwd) { - checkCwdSync(cwd); - return done(); - } - if (preserve) { - return done(mkdirp.sync(dir, mode)); + const ESCAPE_REGEX = /[\\:/\x00z]/g; + return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); + } + function supportsCachedData() { + const script = new vm.Script('""', { produceCachedData: true }); + return script.cachedDataProduced === true; + } + function getCacheDir() { + const v8_compile_cache_cache_dir = process.env.V8_COMPILE_CACHE_CACHE_DIR; + if (v8_compile_cache_cache_dir) { + return v8_compile_cache_cache_dir; } - const sub = normPath(path10.relative(cwd, dir)); - const parts = sub.split("/"); - let created = null; - for (let p = parts.shift(), part = cwd; p && (part += "/" + p); p = parts.shift()) { - part = normPath(path10.resolve(part)); - if (cGet(cache, part)) { - continue; - } - try { - fs8.mkdirSync(part, mode); - created = created || part; - cSet(cache, part, true); - } catch (er) { - const st = fs8.lstatSync(part); - if (st.isDirectory()) { - cSet(cache, part, true); - continue; - } else if (unlink) { - fs8.unlinkSync(part); - fs8.mkdirSync(part, mode); - created = created || part; - cSet(cache, part, true); - continue; - } else if (st.isSymbolicLink()) { - return new SymlinkError(part, part + "/" + parts.join("/")); - } + const dirname2 = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; + const arch = process.arch; + const version2 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; + const cacheDir = path16.join(os3.tmpdir(), dirname2, arch, version2); + return cacheDir; + } + function getMainName() { + const mainName = require.main && typeof require.main.filename === "string" ? require.main.filename : process.cwd(); + return mainName; + } + if (!process.env.DISABLE_V8_COMPILE_CACHE && supportsCachedData()) { + const cacheDir = getCacheDir(); + const prefix = getMainName(); + const blobStore = new FileSystemBlobStore(cacheDir, prefix); + const nativeCompileCache = new NativeCompileCache(); + nativeCompileCache.setCacheStore(blobStore); + nativeCompileCache.install(); + process.once("exit", () => { + if (blobStore.isDirty()) { + blobStore.save(); } + nativeCompileCache.uninstall(); + }); + } + module2.exports.__TEST__ = { + FileSystemBlobStore, + NativeCompileCache, + mkdirpSync, + slashEscape, + supportsCachedData, + getCacheDir, + getMainName + }; + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js +var require_satisfies = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js"(exports2, module2) { + "use strict"; + var Range3 = require_range(); + var satisfies = (version2, range, options) => { + try { + range = new Range3(range, options); + } catch (er) { + return false; } - return done(created); + return range.test(version2); }; + module2.exports = satisfies; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js -var require_normalize_unicode = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/normalize-unicode.js"(exports, module2) { - var normalizeCache = /* @__PURE__ */ Object.create(null); - var { hasOwnProperty } = Object.prototype; - module2.exports = (s) => { - if (!hasOwnProperty.call(normalizeCache, s)) { - normalizeCache[s] = s.normalize("NFD"); +// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/posix.js +var require_posix = __commonJS({ + ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/posix.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.sync = exports2.isexe = void 0; + var fs_1 = require("fs"); + var promises_1 = require("fs/promises"); + var isexe = async (path16, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path16), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports2.isexe = isexe; + var sync = (path16, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path16), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports2.sync = sync; + var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); + var checkMode = (stat, options) => { + const myUid = options.uid ?? process.getuid?.(); + const myGroups = options.groups ?? process.getgroups?.() ?? []; + const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; + if (myUid === void 0 || myGid === void 0) { + throw new Error("cannot get uid or gid"); } - return normalizeCache[s]; + const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); + const mod = stat.mode; + const uid = stat.uid; + const gid = stat.gid; + const u = parseInt("100", 8); + const g = parseInt("010", 8); + const o = parseInt("001", 8); + const ug = u | g; + return !!(mod & o || mod & g && groups.has(gid) || mod & u && uid === myUid || mod & ug && myUid === 0); }; } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js -var require_path_reservations = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/path-reservations.js"(exports, module2) { - var assert3 = require("assert"); - var normalize = require_normalize_unicode(); - var stripSlashes = require_strip_trailing_slashes(); - var { join: join2 } = require("path"); - var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - var isWindows = platform === "win32"; - module2.exports = () => { - const queues = /* @__PURE__ */ new Map(); - const reservations = /* @__PURE__ */ new Map(); - const getDirs = (path10) => { - const dirs = path10.split("/").slice(0, -1).reduce((set, path11) => { - if (set.length) { - path11 = join2(set[set.length - 1], path11); - } - set.push(path11 || "/"); - return set; - }, []); - return dirs; - }; - const running = /* @__PURE__ */ new Set(); - const getQueues = (fn2) => { - const res = reservations.get(fn2); - if (!res) { - throw new Error("function does not have any path reservations"); - } - return { - paths: res.paths.map((path10) => queues.get(path10)), - dirs: [...res.dirs].map((path10) => queues.get(path10)) - }; - }; - const check = (fn2) => { - const { paths, dirs } = getQueues(fn2); - return paths.every((q) => q[0] === fn2) && dirs.every((q) => q[0] instanceof Set && q[0].has(fn2)); - }; - const run2 = (fn2) => { - if (running.has(fn2) || !check(fn2)) { +// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/win32.js +var require_win32 = __commonJS({ + ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/win32.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.sync = exports2.isexe = void 0; + var fs_1 = require("fs"); + var promises_1 = require("fs/promises"); + var isexe = async (path16, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path16), path16, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") return false; - } - running.add(fn2); - fn2(() => clear(fn2)); - return true; - }; - const clear = (fn2) => { - if (!running.has(fn2)) { + throw er; + } + }; + exports2.isexe = isexe; + var sync = (path16, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path16), path16, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") return false; - } - const { paths, dirs } = reservations.get(fn2); - const next = /* @__PURE__ */ new Set(); - paths.forEach((path10) => { - const q = queues.get(path10); - assert3.equal(q[0], fn2); - if (q.length === 1) { - queues.delete(path10); - } else { - q.shift(); - if (typeof q[0] === "function") { - next.add(q[0]); - } else { - q[0].forEach((fn3) => next.add(fn3)); - } - } - }); - dirs.forEach((dir) => { - const q = queues.get(dir); - assert3(q[0] instanceof Set); - if (q[0].size === 1 && q.length === 1) { - queues.delete(dir); - } else if (q[0].size === 1) { - q.shift(); - next.add(q[0]); - } else { - q[0].delete(fn2); - } - }); - running.delete(fn2); - next.forEach((fn3) => run2(fn3)); + throw er; + } + }; + exports2.sync = sync; + var checkPathExt = (path16, options) => { + const { pathExt = process.env.PATHEXT || "" } = options; + const peSplit = pathExt.split(";"); + if (peSplit.indexOf("") !== -1) { return true; - }; - const reserve = (paths, fn2) => { - paths = isWindows ? ["win32 parallelization disabled"] : paths.map((p) => { - return stripSlashes(join2(normalize(p))).toLowerCase(); - }); - const dirs = new Set( - paths.map((path10) => getDirs(path10)).reduce((a, b) => a.concat(b)) - ); - reservations.set(fn2, { dirs, paths }); - paths.forEach((path10) => { - const q = queues.get(path10); - if (!q) { - queues.set(path10, [fn2]); - } else { - q.push(fn2); - } - }); - dirs.forEach((dir) => { - const q = queues.get(dir); - if (!q) { - queues.set(dir, [/* @__PURE__ */ new Set([fn2])]); - } else if (q[q.length - 1] instanceof Set) { - q[q.length - 1].add(fn2); - } else { - q.push(/* @__PURE__ */ new Set([fn2])); - } - }); - return run2(fn2); - }; - return { check, reserve }; + } + for (let i = 0; i < peSplit.length; i++) { + const p = peSplit[i].toLowerCase(); + const ext = path16.substring(path16.length - p.length).toLowerCase(); + if (p && ext === p) { + return true; + } + } + return false; }; + var checkStat = (stat, path16, options) => stat.isFile() && checkPathExt(path16, options); } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js -var require_get_write_flag = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/get-write-flag.js"(exports, module2) { - var platform = process.env.__FAKE_PLATFORM__ || process.platform; - var isWindows = platform === "win32"; - var fs8 = global.__FAKE_TESTING_FS__ || require("fs"); - var { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs8.constants; - var fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; - var fMapLimit = 512 * 1024; - var fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; - module2.exports = !fMapEnabled ? () => "w" : (size) => size < fMapLimit ? fMapFlag : "w"; +// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/options.js +var require_options = __commonJS({ + ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/options.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js -var require_unpack = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/unpack.js"(exports, module2) { +// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js +var require_cjs = __commonJS({ + ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js"(exports2) { "use strict"; - var assert3 = require("assert"); - var Parser = require_parse2(); - var fs8 = require("fs"); - var fsm = require_fs_minipass(); - var path10 = require("path"); - var mkdir4 = require_mkdir(); - var wc = require_winchars(); - var pathReservations = require_path_reservations(); - var stripAbsolutePath = require_strip_absolute_path(); - var normPath = require_normalize_windows_path(); - var stripSlash = require_strip_trailing_slashes(); - var normalize = require_normalize_unicode(); - var ONENTRY = Symbol("onEntry"); - var CHECKFS = Symbol("checkFs"); - var CHECKFS2 = Symbol("checkFs2"); - var PRUNECACHE = Symbol("pruneCache"); - var ISREUSABLE = Symbol("isReusable"); - var MAKEFS = Symbol("makeFs"); - var FILE = Symbol("file"); - var DIRECTORY = Symbol("directory"); - var LINK = Symbol("link"); - var SYMLINK = Symbol("symlink"); - var HARDLINK = Symbol("hardlink"); - var UNSUPPORTED = Symbol("unsupported"); - var CHECKPATH = Symbol("checkPath"); - var MKDIR = Symbol("mkdir"); - var ONERROR = Symbol("onError"); - var PENDING = Symbol("pending"); - var PEND = Symbol("pend"); - var UNPEND = Symbol("unpend"); - var ENDED = Symbol("ended"); - var MAYBECLOSE = Symbol("maybeClose"); - var SKIP = Symbol("skip"); - var DOCHOWN = Symbol("doChown"); - var UID = Symbol("uid"); - var GID = Symbol("gid"); - var CHECKED_CWD = Symbol("checkedCwd"); - var crypto = require("crypto"); - var getFlag = require_get_write_flag(); - var platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - var isWindows = platform === "win32"; - var unlinkFile = (path11, cb) => { - if (!isWindows) { - return fs8.unlink(path11, cb); - } - const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex"); - fs8.rename(path11, name, (er) => { - if (er) { - return cb(er); - } - fs8.unlink(name, cb); - }); - }; - var unlinkFileSync = (path11) => { - if (!isWindows) { - return fs8.unlinkSync(path11); + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc2 = Object.getOwnPropertyDescriptor(m, k); + if (!desc2 || ("get" in desc2 ? !m.__esModule : desc2.writable || desc2.configurable)) { + desc2 = { enumerable: true, get: function() { + return m[k]; + } }; } - const name = path11 + ".DELETE." + crypto.randomBytes(16).toString("hex"); - fs8.renameSync(path11, name); - fs8.unlinkSync(name); - }; - var uint32 = (a, b, c) => a === a >>> 0 ? a : b === b >>> 0 ? b : c; - var cacheKeyNormalize = (path11) => stripSlash(normPath(normalize(path11))).toLowerCase(); - var pruneCache = (cache, abs) => { - abs = cacheKeyNormalize(abs); - for (const path11 of cache.keys()) { - const pnorm = cacheKeyNormalize(path11); - if (pnorm === abs || pnorm.indexOf(abs + "/") === 0) { - cache.delete(path11); - } + Object.defineProperty(o, k2, desc2); + }) : (function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + })); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__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; }; - var dropCache = (cache) => { - for (const key of cache.keys()) { - cache.delete(key); - } + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p); }; - var Unpack = class extends Parser { - constructor(opt) { - if (!opt) { - opt = {}; - } - opt.ondone = (_) => { - this[ENDED] = true; - this[MAYBECLOSE](); - }; - super(opt); - this[CHECKED_CWD] = false; - this.reservations = pathReservations(); - this.transform = typeof opt.transform === "function" ? opt.transform : null; - this.writable = true; - this.readable = false; - this[PENDING] = 0; - this[ENDED] = false; - this.dirCache = opt.dirCache || /* @__PURE__ */ new Map(); - if (typeof opt.uid === "number" || typeof opt.gid === "number") { - if (typeof opt.uid !== "number" || typeof opt.gid !== "number") { - throw new TypeError("cannot set owner without number uid and gid"); - } - if (opt.preserveOwner) { - throw new TypeError( - "cannot preserve owner in archive and also set owner explicitly" - ); - } - this.uid = opt.uid; - this.gid = opt.gid; - this.setOwner = true; - } else { - this.uid = null; - this.gid = null; - this.setOwner = false; - } - if (opt.preserveOwner === void 0 && typeof opt.uid !== "number") { - this.preserveOwner = process.getuid && process.getuid() === 0; - } else { - this.preserveOwner = !!opt.preserveOwner; - } - this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? process.getuid() : null; - this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? process.getgid() : null; - this.forceChown = opt.forceChown === true; - this.win32 = !!opt.win32 || isWindows; - this.newer = !!opt.newer; - this.keep = !!opt.keep; - this.noMtime = !!opt.noMtime; - this.preservePaths = !!opt.preservePaths; - this.unlink = !!opt.unlink; - this.cwd = normPath(path10.resolve(opt.cwd || process.cwd())); - this.strip = +opt.strip || 0; - this.processUmask = opt.noChmod ? 0 : process.umask(); - this.umask = typeof opt.umask === "number" ? opt.umask : this.processUmask; - this.dmode = opt.dmode || 511 & ~this.umask; - this.fmode = opt.fmode || 438 & ~this.umask; - this.on("entry", (entry) => this[ONENTRY](entry)); - } - // a bad or damaged archive is a warning for Parser, but an error - // when extracting. Mark those errors as unrecoverable, because - // the Unpack contract cannot be met. - warn(code, msg, data = {}) { - if (code === "TAR_BAD_ARCHIVE" || code === "TAR_ABORT") { - data.recoverable = false; - } - return super.warn(code, msg, data); - } - [MAYBECLOSE]() { - if (this[ENDED] && this[PENDING] === 0) { - this.emit("prefinish"); - this.emit("finish"); - this.emit("end"); - } - } - [CHECKPATH](entry) { - if (this.strip) { - const parts = normPath(entry.path).split("/"); - if (parts.length < this.strip) { - return false; - } - entry.path = parts.slice(this.strip).join("/"); - if (entry.type === "Link") { - const linkparts = normPath(entry.linkpath).split("/"); - if (linkparts.length >= this.strip) { - entry.linkpath = linkparts.slice(this.strip).join("/"); - } else { - return false; - } - } - } - if (!this.preservePaths) { - const p = normPath(entry.path); - const parts = p.split("/"); - if (parts.includes("..") || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) { - this.warn("TAR_ENTRY_ERROR", `path contains '..'`, { - entry, - path: p - }); - return false; - } - const [root, stripped] = stripAbsolutePath(p); - if (root) { - entry.path = stripped; - this.warn("TAR_ENTRY_INFO", `stripping ${root} from absolute path`, { - entry, - path: p - }); - } - } - if (path10.isAbsolute(entry.path)) { - entry.absolute = normPath(path10.resolve(entry.path)); - } else { - entry.absolute = normPath(path10.resolve(this.cwd, entry.path)); - } - if (!this.preservePaths && entry.absolute.indexOf(this.cwd + "/") !== 0 && entry.absolute !== this.cwd) { - this.warn("TAR_ENTRY_ERROR", "path escaped extraction target", { - entry, - path: normPath(entry.path), - resolvedPath: entry.absolute, - cwd: this.cwd - }); - return false; - } - if (entry.absolute === this.cwd && entry.type !== "Directory" && entry.type !== "GNUDumpDir") { - return false; - } - if (this.win32) { - const { root: aRoot } = path10.win32.parse(entry.absolute); - entry.absolute = aRoot + wc.encode(entry.absolute.slice(aRoot.length)); - const { root: pRoot } = path10.win32.parse(entry.path); - entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length)); - } - return true; - } - [ONENTRY](entry) { - if (!this[CHECKPATH](entry)) { - return entry.resume(); - } - assert3.equal(typeof entry.absolute, "string"); - switch (entry.type) { - case "Directory": - case "GNUDumpDir": - if (entry.mode) { - entry.mode = entry.mode | 448; - } - case "File": - case "OldFile": - case "ContiguousFile": - case "Link": - case "SymbolicLink": - return this[CHECKFS](entry); - case "CharacterDevice": - case "BlockDevice": - case "FIFO": - default: - return this[UNSUPPORTED](entry); - } - } - [ONERROR](er, entry) { - if (er.name === "CwdError") { - this.emit("error", er); - } else { - this.warn("TAR_ENTRY_ERROR", er, { entry }); - this[UNPEND](); - entry.resume(); - } - } - [MKDIR](dir, mode, cb) { - mkdir4(normPath(dir), { - uid: this.uid, - gid: this.gid, - processUid: this.processUid, - processGid: this.processGid, - umask: this.processUmask, - preserve: this.preservePaths, - unlink: this.unlink, - cache: this.dirCache, - cwd: this.cwd, - mode, - noChmod: this.noChmod - }, cb); - } - [DOCHOWN](entry) { - return this.forceChown || this.preserveOwner && (typeof entry.uid === "number" && entry.uid !== this.processUid || typeof entry.gid === "number" && entry.gid !== this.processGid) || (typeof this.uid === "number" && this.uid !== this.processUid || typeof this.gid === "number" && this.gid !== this.processGid); - } - [UID](entry) { - return uint32(this.uid, entry.uid, this.processUid); - } - [GID](entry) { - return uint32(this.gid, entry.gid, this.processGid); - } - [FILE](entry, fullyDone) { - const mode = entry.mode & 4095 || this.fmode; - const stream = new fsm.WriteStream(entry.absolute, { - flags: getFlag(entry.size), - mode, - autoClose: false - }); - stream.on("error", (er) => { - if (stream.fd) { - fs8.close(stream.fd, () => { - }); - } - stream.write = () => true; - this[ONERROR](er, entry); - fullyDone(); - }); - let actions = 1; - const done = (er) => { - if (er) { - if (stream.fd) { - fs8.close(stream.fd, () => { - }); - } - this[ONERROR](er, entry); - fullyDone(); - return; - } - if (--actions === 0) { - fs8.close(stream.fd, (er2) => { - if (er2) { - this[ONERROR](er2, entry); - } else { - this[UNPEND](); - } - fullyDone(); - }); - } - }; - stream.on("finish", (_) => { - const abs = entry.absolute; - const fd = stream.fd; - if (entry.mtime && !this.noMtime) { - actions++; - const atime = entry.atime || /* @__PURE__ */ new Date(); - const mtime = entry.mtime; - fs8.futimes(fd, atime, mtime, (er) => er ? fs8.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); - } - if (this[DOCHOWN](entry)) { - actions++; - const uid = this[UID](entry); - const gid = this[GID](entry); - fs8.fchown(fd, uid, gid, (er) => er ? fs8.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); - } - done(); - }); - const tx = this.transform ? this.transform(entry) || entry : entry; - if (tx !== entry) { - tx.on("error", (er) => { - this[ONERROR](er, entry); - fullyDone(); - }); - entry.pipe(tx); + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.sync = exports2.isexe = exports2.posix = exports2.win32 = void 0; + var posix = __importStar(require_posix()); + exports2.posix = posix; + var win322 = __importStar(require_win32()); + exports2.win32 = win322; + __exportStar(require_options(), exports2); + var platform5 = process.env._ISEXE_TEST_PLATFORM_ || process.platform; + var impl = platform5 === "win32" ? win322 : posix; + exports2.isexe = impl.isexe; + exports2.sync = impl.sync; + } +}); + +// .yarn/cache/which-npm-5.0.0-15aa39eb60-e556e4cd8b.zip/node_modules/which/lib/index.js +var require_lib = __commonJS({ + ".yarn/cache/which-npm-5.0.0-15aa39eb60-e556e4cd8b.zip/node_modules/which/lib/index.js"(exports2, module2) { + var { isexe, sync: isexeSync } = require_cjs(); + var { join: join3, delimiter, sep, posix } = require("path"); + var isWindows4 = process.platform === "win32"; + var rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? "" : sep}]`.replace(/(\\)/g, "\\$1")); + var rRel = new RegExp(`^\\.${rSlash.source}`); + var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); + var getPathInfo = (cmd, { + path: optPath = process.env.PATH, + pathExt: optPathExt = process.env.PATHEXT, + delimiter: optDelimiter = delimiter + }) => { + const pathEnv = cmd.match(rSlash) ? [""] : [ + // windows always checks the cwd first + ...isWindows4 ? [process.cwd()] : [], + ...(optPath || /* istanbul ignore next: very unusual */ + "").split(optDelimiter) + ]; + if (isWindows4) { + const pathExtExe = optPathExt || [".EXE", ".CMD", ".BAT", ".COM"].join(optDelimiter); + const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()]); + if (cmd.includes(".") && pathExt[0] !== "") { + pathExt.unshift(""); } - tx.pipe(stream); + return { pathEnv, pathExt, pathExtExe }; } - [DIRECTORY](entry, fullyDone) { - const mode = entry.mode & 4095 || this.dmode; - this[MKDIR](entry.absolute, mode, (er) => { - if (er) { - this[ONERROR](er, entry); - fullyDone(); - return; - } - let actions = 1; - const done = (_) => { - if (--actions === 0) { - fullyDone(); - this[UNPEND](); - entry.resume(); + return { pathEnv, pathExt: [""] }; + }; + var getPathPart = (raw2, cmd) => { + const pathPart = /^".*"$/.test(raw2) ? raw2.slice(1, -1) : raw2; + const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : ""; + return prefix + join3(pathPart, cmd); + }; + var which3 = async (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const envPart of pathEnv) { + const p = getPathPart(envPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; } - }; - if (entry.mtime && !this.noMtime) { - actions++; - fs8.utimes(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); - } - if (this[DOCHOWN](entry)) { - actions++; - fs8.chown(entry.absolute, this[UID](entry), this[GID](entry), done); + found.push(withExt); } - done(); - }); + } } - [UNSUPPORTED](entry) { - entry.unsupported = true; - this.warn( - "TAR_ENTRY_UNSUPPORTED", - `unsupported entry type: ${entry.type}`, - { entry } - ); - entry.resume(); + if (opt.all && found.length) { + return found; } - [SYMLINK](entry, done) { - this[LINK](entry, entry.linkpath, "symlink", done); + if (opt.nothrow) { + return null; } - [HARDLINK](entry, done) { - const linkpath = normPath(path10.resolve(this.cwd, entry.linkpath)); - this[LINK](entry, linkpath, "link", done); + throw getNotFoundError(cmd); + }; + var whichSync = (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const pathEnvPart of pathEnv) { + const p = getPathPart(pathEnvPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; + } + found.push(withExt); + } + } } - [PEND]() { - this[PENDING]++; + if (opt.all && found.length) { + return found; } - [UNPEND]() { - this[PENDING]--; - this[MAYBECLOSE](); + if (opt.nothrow) { + return null; } - [SKIP](entry) { - this[UNPEND](); - entry.resume(); + throw getNotFoundError(cmd); + }; + module2.exports = which3; + which3.sync = whichSync; + } +}); + +// .yarn/cache/is-windows-npm-1.0.2-898cd6f3d7-b32f418ab3.zip/node_modules/is-windows/index.js +var require_is_windows = __commonJS({ + ".yarn/cache/is-windows-npm-1.0.2-898cd6f3d7-b32f418ab3.zip/node_modules/is-windows/index.js"(exports2, module2) { + (function(factory) { + if (exports2 && typeof exports2 === "object" && typeof module2 !== "undefined") { + module2.exports = factory(); + } else if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof window !== "undefined") { + window.isWindows = factory(); + } else if (typeof global !== "undefined") { + global.isWindows = factory(); + } else if (typeof self !== "undefined") { + self.isWindows = factory(); + } else { + this.isWindows = factory(); } - // Check if we can reuse an existing filesystem entry safely and - // overwrite it, rather than unlinking and recreating - // Windows doesn't report a useful nlink, so we just never reuse entries - [ISREUSABLE](entry, st) { - return entry.type === "File" && !this.unlink && st.isFile() && st.nlink <= 1 && !isWindows; + })(function() { + "use strict"; + return function isWindows4() { + return process && (process.platform === "win32" || /^(msys|cygwin)$/.test(process.env.OSTYPE)); + }; + }); + } +}); + +// .yarn/cache/cmd-extension-npm-1.0.2-11aa204c4b-acdb425d51.zip/node_modules/cmd-extension/index.js +var require_cmd_extension = __commonJS({ + ".yarn/cache/cmd-extension-npm-1.0.2-11aa204c4b-acdb425d51.zip/node_modules/cmd-extension/index.js"(exports2, module2) { + "use strict"; + var path16 = require("path"); + var cmdExtension; + if (process.env.PATHEXT) { + cmdExtension = process.env.PATHEXT.split(path16.delimiter).find((ext) => ext.toUpperCase() === ".CMD"); + } + module2.exports = cmdExtension || ".cmd"; + } +}); + +// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/polyfills.js +var require_polyfills = __commonJS({ + ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/polyfills.js"(exports2, module2) { + var constants2 = require("constants"); + var origCwd = process.cwd; + var cwd = null; + var platform5 = process.env.GRACEFUL_FS_PLATFORM || process.platform; + process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process); + return cwd; + }; + try { + process.cwd(); + } catch (er) { + } + if (typeof process.chdir === "function") { + chdir = process.chdir; + process.chdir = function(d) { + cwd = null; + chdir.call(process, d); + }; + if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir); + } + var chdir; + module2.exports = patch; + function patch(fs17) { + if (constants2.hasOwnProperty("O_SYMLINK") && process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs17); + } + if (!fs17.lutimes) { + patchLutimes(fs17); + } + fs17.chown = chownFix(fs17.chown); + fs17.fchown = chownFix(fs17.fchown); + fs17.lchown = chownFix(fs17.lchown); + fs17.chmod = chmodFix(fs17.chmod); + fs17.fchmod = chmodFix(fs17.fchmod); + fs17.lchmod = chmodFix(fs17.lchmod); + fs17.chownSync = chownFixSync(fs17.chownSync); + fs17.fchownSync = chownFixSync(fs17.fchownSync); + fs17.lchownSync = chownFixSync(fs17.lchownSync); + fs17.chmodSync = chmodFixSync(fs17.chmodSync); + fs17.fchmodSync = chmodFixSync(fs17.fchmodSync); + fs17.lchmodSync = chmodFixSync(fs17.lchmodSync); + fs17.stat = statFix(fs17.stat); + fs17.fstat = statFix(fs17.fstat); + fs17.lstat = statFix(fs17.lstat); + fs17.statSync = statFixSync(fs17.statSync); + fs17.fstatSync = statFixSync(fs17.fstatSync); + fs17.lstatSync = statFixSync(fs17.lstatSync); + if (fs17.chmod && !fs17.lchmod) { + fs17.lchmod = function(path16, mode, cb) { + if (cb) process.nextTick(cb); + }; + fs17.lchmodSync = function() { + }; } - // check if a thing is there, and if so, try to clobber it - [CHECKFS](entry) { - this[PEND](); - const paths = [entry.path]; - if (entry.linkpath) { - paths.push(entry.linkpath); - } - this.reservations.reserve(paths, (done) => this[CHECKFS2](entry, done)); + if (fs17.chown && !fs17.lchown) { + fs17.lchown = function(path16, uid, gid, cb) { + if (cb) process.nextTick(cb); + }; + fs17.lchownSync = function() { + }; } - [PRUNECACHE](entry) { - if (entry.type === "SymbolicLink") { - dropCache(this.dirCache); - } else if (entry.type !== "Directory") { - pruneCache(this.dirCache, entry.absolute); - } + if (platform5 === "win32") { + fs17.rename = typeof fs17.rename !== "function" ? fs17.rename : (function(fs$rename) { + function rename(from, to, cb) { + var start = Date.now(); + var backoff = 0; + fs$rename(from, to, function CB(er) { + if (er && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") && Date.now() - start < 6e4) { + setTimeout(function() { + fs17.stat(to, function(stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er); + }); + }, backoff); + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er); + }); + } + if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename); + return rename; + })(fs17.rename); } - [CHECKFS2](entry, fullyDone) { - this[PRUNECACHE](entry); - const done = (er) => { - this[PRUNECACHE](entry); - fullyDone(er); - }; - const checkCwd = () => { - this[MKDIR](this.cwd, this.dmode, (er) => { - if (er) { - this[ONERROR](er, entry); - done(); - return; + fs17.read = typeof fs17.read !== "function" ? fs17.read : (function(fs$read) { + function read(fd, buffer, offset, length, position, callback_) { + var callback; + if (callback_ && typeof callback_ === "function") { + var eagCounter = 0; + callback = function(er, _, __) { + if (er && er.code === "EAGAIN" && eagCounter < 10) { + eagCounter++; + return fs$read.call(fs17, fd, buffer, offset, length, position, callback); + } + callback_.apply(this, arguments); + }; + } + return fs$read.call(fs17, fd, buffer, offset, length, position, callback); + } + if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read); + return read; + })(fs17.read); + fs17.readSync = typeof fs17.readSync !== "function" ? fs17.readSync : /* @__PURE__ */ (function(fs$readSync) { + return function(fd, buffer, offset, length, position) { + var eagCounter = 0; + while (true) { + try { + return fs$readSync.call(fs17, fd, buffer, offset, length, position); + } catch (er) { + if (er.code === "EAGAIN" && eagCounter < 10) { + eagCounter++; + continue; + } + throw er; } - this[CHECKED_CWD] = true; - start(); - }); + } }; - const start = () => { - if (entry.absolute !== this.cwd) { - const parent = normPath(path10.dirname(entry.absolute)); - if (parent !== this.cwd) { - return this[MKDIR](parent, this.dmode, (er) => { - if (er) { - this[ONERROR](er, entry); - done(); - return; - } - afterMakeParent(); + })(fs17.readSync); + function patchLchmod(fs18) { + fs18.lchmod = function(path16, mode, callback) { + fs18.open( + path16, + constants2.O_WRONLY | constants2.O_SYMLINK, + mode, + function(err, fd) { + if (err) { + if (callback) callback(err); + return; + } + fs18.fchmod(fd, mode, function(err2) { + fs18.close(fd, function(err22) { + if (callback) callback(err2 || err22); + }); }); } - } - afterMakeParent(); + ); }; - const afterMakeParent = () => { - fs8.lstat(entry.absolute, (lstatEr, st) => { - if (st && (this.keep || this.newer && st.mtime > entry.mtime)) { - this[SKIP](entry); - done(); - return; - } - if (lstatEr || this[ISREUSABLE](entry, st)) { - return this[MAKEFS](null, entry, done); - } - if (st.isDirectory()) { - if (entry.type === "Directory") { - const needChmod = !this.noChmod && entry.mode && (st.mode & 4095) !== entry.mode; - const afterChmod = (er) => this[MAKEFS](er, entry, done); - if (!needChmod) { - return afterChmod(); - } - return fs8.chmod(entry.absolute, entry.mode, afterChmod); - } - if (entry.absolute !== this.cwd) { - return fs8.rmdir(entry.absolute, (er) => this[MAKEFS](er, entry, done)); + fs18.lchmodSync = function(path16, mode) { + var fd = fs18.openSync(path16, constants2.O_WRONLY | constants2.O_SYMLINK, mode); + var threw = true; + var ret; + try { + ret = fs18.fchmodSync(fd, mode); + threw = false; + } finally { + if (threw) { + try { + fs18.closeSync(fd); + } catch (er) { } + } else { + fs18.closeSync(fd); } - if (entry.absolute === this.cwd) { - return this[MAKEFS](null, entry, done); - } - unlinkFile(entry.absolute, (er) => this[MAKEFS](er, entry, done)); - }); + } + return ret; }; - if (this[CHECKED_CWD]) { - start(); - } else { - checkCwd(); - } } - [MAKEFS](er, entry, done) { - if (er) { - this[ONERROR](er, entry); - done(); - return; - } - switch (entry.type) { - case "File": - case "OldFile": - case "ContiguousFile": - return this[FILE](entry, done); - case "Link": - return this[HARDLINK](entry, done); - case "SymbolicLink": - return this[SYMLINK](entry, done); - case "Directory": - case "GNUDumpDir": - return this[DIRECTORY](entry, done); + function patchLutimes(fs18) { + if (constants2.hasOwnProperty("O_SYMLINK") && fs18.futimes) { + fs18.lutimes = function(path16, at, mt, cb) { + fs18.open(path16, constants2.O_SYMLINK, function(er, fd) { + if (er) { + if (cb) cb(er); + return; + } + fs18.futimes(fd, at, mt, function(er2) { + fs18.close(fd, function(er22) { + if (cb) cb(er2 || er22); + }); + }); + }); + }; + fs18.lutimesSync = function(path16, at, mt) { + var fd = fs18.openSync(path16, constants2.O_SYMLINK); + var ret; + var threw = true; + try { + ret = fs18.futimesSync(fd, at, mt); + threw = false; + } finally { + if (threw) { + try { + fs18.closeSync(fd); + } catch (er) { + } + } else { + fs18.closeSync(fd); + } + } + return ret; + }; + } else if (fs18.futimes) { + fs18.lutimes = function(_a, _b, _c, cb) { + if (cb) process.nextTick(cb); + }; + fs18.lutimesSync = function() { + }; } } - [LINK](entry, linkpath, link, done) { - fs8[link](linkpath, entry.absolute, (er) => { - if (er) { - this[ONERROR](er, entry); - } else { - this[UNPEND](); - entry.resume(); + function chmodFix(orig) { + if (!orig) return orig; + return function(target, mode, cb) { + return orig.call(fs17, target, mode, function(er) { + if (chownErOk(er)) er = null; + if (cb) cb.apply(this, arguments); + }); + }; + } + function chmodFixSync(orig) { + if (!orig) return orig; + return function(target, mode) { + try { + return orig.call(fs17, target, mode); + } catch (er) { + if (!chownErOk(er)) throw er; } - done(); - }); + }; } - }; - var callSync = (fn2) => { - try { - return [null, fn2()]; - } catch (er) { - return [er, null]; + function chownFix(orig) { + if (!orig) return orig; + return function(target, uid, gid, cb) { + return orig.call(fs17, target, uid, gid, function(er) { + if (chownErOk(er)) er = null; + if (cb) cb.apply(this, arguments); + }); + }; } - }; - var UnpackSync = class extends Unpack { - [MAKEFS](er, entry) { - return super[MAKEFS](er, entry, () => { - }); + function chownFixSync(orig) { + if (!orig) return orig; + return function(target, uid, gid) { + try { + return orig.call(fs17, target, uid, gid); + } catch (er) { + if (!chownErOk(er)) throw er; + } + }; } - [CHECKFS](entry) { - this[PRUNECACHE](entry); - if (!this[CHECKED_CWD]) { - const er2 = this[MKDIR](this.cwd, this.dmode); - if (er2) { - return this[ONERROR](er2, entry); + function statFix(orig) { + if (!orig) return orig; + return function(target, options, cb) { + if (typeof options === "function") { + cb = options; + options = null; } - this[CHECKED_CWD] = true; - } - if (entry.absolute !== this.cwd) { - const parent = normPath(path10.dirname(entry.absolute)); - if (parent !== this.cwd) { - const mkParent = this[MKDIR](parent, this.dmode); - if (mkParent) { - return this[ONERROR](mkParent, entry); + function callback(er, stats) { + if (stats) { + if (stats.uid < 0) stats.uid += 4294967296; + if (stats.gid < 0) stats.gid += 4294967296; } + if (cb) cb.apply(this, arguments); } - } - const [lstatEr, st] = callSync(() => fs8.lstatSync(entry.absolute)); - if (st && (this.keep || this.newer && st.mtime > entry.mtime)) { - return this[SKIP](entry); - } - if (lstatEr || this[ISREUSABLE](entry, st)) { - return this[MAKEFS](null, entry); - } - if (st.isDirectory()) { - if (entry.type === "Directory") { - const needChmod = !this.noChmod && entry.mode && (st.mode & 4095) !== entry.mode; - const [er3] = needChmod ? callSync(() => { - fs8.chmodSync(entry.absolute, entry.mode); - }) : []; - return this[MAKEFS](er3, entry); - } - const [er2] = callSync(() => fs8.rmdirSync(entry.absolute)); - this[MAKEFS](er2, entry); - } - const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(entry.absolute)); - this[MAKEFS](er, entry); + return options ? orig.call(fs17, target, options, callback) : orig.call(fs17, target, callback); + }; } - [FILE](entry, done) { - const mode = entry.mode & 4095 || this.fmode; - const oner = (er) => { - let closeError; - try { - fs8.closeSync(fd); - } catch (e) { - closeError = e; - } - if (er || closeError) { - this[ONERROR](er || closeError, entry); + function statFixSync(orig) { + if (!orig) return orig; + return function(target, options) { + var stats = options ? orig.call(fs17, target, options) : orig.call(fs17, target); + if (stats) { + if (stats.uid < 0) stats.uid += 4294967296; + if (stats.gid < 0) stats.gid += 4294967296; } - done(); + return stats; }; - let fd; - try { - fd = fs8.openSync(entry.absolute, getFlag(entry.size), mode); - } catch (er) { - return oner(er); + } + function chownErOk(er) { + if (!er) + return true; + if (er.code === "ENOSYS") + return true; + var nonroot = !process.getuid || process.getuid() !== 0; + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true; } - const tx = this.transform ? this.transform(entry) || entry : entry; - if (tx !== entry) { - tx.on("error", (er) => this[ONERROR](er, entry)); - entry.pipe(tx); + return false; + } + } + } +}); + +// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js +var require_legacy_streams = __commonJS({ + ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js"(exports2, module2) { + var Stream2 = require("stream").Stream; + module2.exports = legacy; + function legacy(fs17) { + return { + ReadStream: ReadStream2, + WriteStream: WriteStream2 + }; + function ReadStream2(path16, options) { + if (!(this instanceof ReadStream2)) return new ReadStream2(path16, options); + Stream2.call(this); + var self2 = this; + this.path = path16; + this.fd = null; + this.readable = true; + this.paused = false; + this.flags = "r"; + this.mode = 438; + this.bufferSize = 64 * 1024; + options = options || {}; + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - tx.on("data", (chunk) => { - try { - fs8.writeSync(fd, chunk, 0, chunk.length); - } catch (er) { - oner(er); + if (this.encoding) this.setEncoding(this.encoding); + if (this.start !== void 0) { + if ("number" !== typeof this.start) { + throw TypeError("start must be a Number"); } - }); - tx.on("end", (_) => { - let er = null; - if (entry.mtime && !this.noMtime) { - const atime = entry.atime || /* @__PURE__ */ new Date(); - const mtime = entry.mtime; - try { - fs8.futimesSync(fd, atime, mtime); - } catch (futimeser) { - try { - fs8.utimesSync(entry.absolute, atime, mtime); - } catch (utimeser) { - er = futimeser; - } - } + if (this.end === void 0) { + this.end = Infinity; + } else if ("number" !== typeof this.end) { + throw TypeError("end must be a Number"); } - if (this[DOCHOWN](entry)) { - const uid = this[UID](entry); - const gid = this[GID](entry); - try { - fs8.fchownSync(fd, uid, gid); - } catch (fchowner) { - try { - fs8.chownSync(entry.absolute, uid, gid); - } catch (chowner) { - er = er || fchowner; - } - } + if (this.start > this.end) { + throw new Error("start must be <= end"); } - oner(er); - }); - } - [DIRECTORY](entry, done) { - const mode = entry.mode & 4095 || this.dmode; - const er = this[MKDIR](entry.absolute, mode); - if (er) { - this[ONERROR](er, entry); - done(); + this.pos = this.start; + } + if (this.fd !== null) { + process.nextTick(function() { + self2._read(); + }); return; } - if (entry.mtime && !this.noMtime) { - try { - fs8.utimesSync(entry.absolute, entry.atime || /* @__PURE__ */ new Date(), entry.mtime); - } catch (er2) { + fs17.open(this.path, this.flags, this.mode, function(err, fd) { + if (err) { + self2.emit("error", err); + self2.readable = false; + return; } + self2.fd = fd; + self2.emit("open", fd); + self2._read(); + }); + } + function WriteStream2(path16, options) { + if (!(this instanceof WriteStream2)) return new WriteStream2(path16, options); + Stream2.call(this); + this.path = path16; + this.fd = null; + this.writable = true; + this.flags = "w"; + this.encoding = "binary"; + this.mode = 438; + this.bytesWritten = 0; + options = options || {}; + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - if (this[DOCHOWN](entry)) { - try { - fs8.chownSync(entry.absolute, this[UID](entry), this[GID](entry)); - } catch (er2) { + if (this.start !== void 0) { + if ("number" !== typeof this.start) { + throw TypeError("start must be a Number"); } + if (this.start < 0) { + throw new Error("start must be >= zero"); + } + this.pos = this.start; } - done(); - entry.resume(); - } - [MKDIR](dir, mode) { - try { - return mkdir4.sync(normPath(dir), { - uid: this.uid, - gid: this.gid, - processUid: this.processUid, - processGid: this.processGid, - umask: this.processUmask, - preserve: this.preservePaths, - unlink: this.unlink, - cache: this.dirCache, - cwd: this.cwd, - mode - }); - } catch (er) { - return er; - } - } - [LINK](entry, linkpath, link, done) { - try { - fs8[link + "Sync"](linkpath, entry.absolute); - done(); - entry.resume(); - } catch (er) { - return this[ONERROR](er, entry); + this.busy = false; + this._queue = []; + if (this.fd === null) { + this._open = fs17.open; + this._queue.push([this._open, this.path, this.flags, this.mode, void 0]); + this.flush(); } } - }; - Unpack.Sync = UnpackSync; - module2.exports = Unpack; + } } }); -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js -var require_extract = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/lib/extract.js"(exports, module2) { +// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/clone.js +var require_clone = __commonJS({ + ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/clone.js"(exports2, module2) { "use strict"; - var hlo = require_high_level_opt(); - var Unpack = require_unpack(); - var fs8 = require("fs"); - var fsm = require_fs_minipass(); - var path10 = require("path"); - var stripSlash = require_strip_trailing_slashes(); - module2.exports = (opt_, files, cb) => { - if (typeof opt_ === "function") { - cb = opt_, files = null, opt_ = {}; - } else if (Array.isArray(opt_)) { - files = opt_, opt_ = {}; - } - if (typeof files === "function") { - cb = files, files = null; - } - if (!files) { - files = []; - } else { - files = Array.from(files); - } - const opt = hlo(opt_); - if (opt.sync && typeof cb === "function") { - throw new TypeError("callback not supported for sync tar functions"); - } - if (!opt.file && typeof cb === "function") { - throw new TypeError("callback only supported with file option"); - } - if (files.length) { - filesFilter(opt, files); - } - return opt.file && opt.sync ? extractFileSync(opt) : opt.file ? extractFile(opt, cb) : opt.sync ? extractSync(opt) : extract(opt); - }; - var filesFilter = (opt, files) => { - const map = new Map(files.map((f) => [stripSlash(f), true])); - const filter = opt.filter; - const mapHas = (file, r) => { - const root = r || path10.parse(file).root || "."; - const ret = file === root ? false : map.has(file) ? map.get(file) : mapHas(path10.dirname(file), root); - map.set(file, ret); - return ret; - }; - opt.filter = filter ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file)) : (file) => mapHas(stripSlash(file)); - }; - var extractFileSync = (opt) => { - const u = new Unpack.Sync(opt); - const file = opt.file; - const stat = fs8.statSync(file); - const readSize = opt.maxReadSize || 16 * 1024 * 1024; - const stream = new fsm.ReadStreamSync(file, { - readSize, - size: stat.size - }); - stream.pipe(u); + module2.exports = clone; + var getPrototypeOf = Object.getPrototypeOf || function(obj) { + return obj.__proto__; }; - var extractFile = (opt, cb) => { - const u = new Unpack(opt); - const readSize = opt.maxReadSize || 16 * 1024 * 1024; - const file = opt.file; - const p = new Promise((resolve, reject) => { - u.on("error", reject); - u.on("close", resolve); - fs8.stat(file, (er, stat) => { - if (er) { - reject(er); - } else { - const stream = new fsm.ReadStream(file, { - readSize, - size: stat.size - }); - stream.on("error", reject); - stream.pipe(u); - } - }); + function clone(obj) { + if (obj === null || typeof obj !== "object") + return obj; + if (obj instanceof Object) + var copy = { __proto__: getPrototypeOf(obj) }; + else + var copy = /* @__PURE__ */ Object.create(null); + Object.getOwnPropertyNames(obj).forEach(function(key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)); }); - return cb ? p.then(cb, cb) : p; - }; - var extractSync = (opt) => new Unpack.Sync(opt); - var extract = (opt) => new Unpack(opt); - } -}); - -// .yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js -var require_tar = __commonJS({ - ".yarn/cache/tar-npm-6.2.0-3eb25205a7-02ca064a1a.zip/node_modules/tar/index.js"(exports) { - "use strict"; - exports.c = exports.create = require_create(); - exports.r = exports.replace = require_replace(); - exports.t = exports.list = require_list(); - exports.u = exports.update = require_update(); - exports.x = exports.extract = require_extract(); - exports.Pack = require_pack(); - exports.Unpack = require_unpack(); - exports.Parse = require_parse2(); - exports.ReadEntry = require_read_entry(); - exports.WriteEntry = require_write_entry(); - exports.Header = require_header(); - exports.Pax = require_pax(); - exports.types = require_types(); + return copy; + } } }); -// .yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-3878511925.zip/node_modules/v8-compile-cache/v8-compile-cache.js -var require_v8_compile_cache = __commonJS({ - ".yarn/cache/v8-compile-cache-npm-2.4.0-5979f8e405-3878511925.zip/node_modules/v8-compile-cache/v8-compile-cache.js"(exports, module2) { - "use strict"; - var Module2 = require("module"); - var crypto = require("crypto"); - var fs8 = require("fs"); - var path10 = require("path"); - var vm = require("vm"); - var os3 = require("os"); - var hasOwnProperty = Object.prototype.hasOwnProperty; - var FileSystemBlobStore = class { - constructor(directory, prefix) { - const name = prefix ? slashEscape(prefix + ".") : ""; - this._blobFilename = path10.join(directory, name + "BLOB"); - this._mapFilename = path10.join(directory, name + "MAP"); - this._lockFilename = path10.join(directory, name + "LOCK"); - this._directory = directory; - this._load(); +// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js +var require_graceful_fs = __commonJS({ + ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js"(exports2, module2) { + var fs17 = require("fs"); + var polyfills = require_polyfills(); + var legacy = require_legacy_streams(); + var clone = require_clone(); + var util = require("util"); + var gracefulQueue; + var previousSymbol; + if (typeof Symbol === "function" && typeof Symbol.for === "function") { + gracefulQueue = Symbol.for("graceful-fs.queue"); + previousSymbol = Symbol.for("graceful-fs.previous"); + } else { + gracefulQueue = "___graceful-fs.queue"; + previousSymbol = "___graceful-fs.previous"; + } + function noop3() { + } + function publishQueue(context, queue2) { + Object.defineProperty(context, gracefulQueue, { + get: function() { + return queue2; + } + }); + } + var debug2 = noop3; + if (util.debuglog) + debug2 = util.debuglog("gfs4"); + else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) + debug2 = function() { + var m = util.format.apply(util, arguments); + m = "GFS4: " + m.split(/\n/).join("\nGFS4: "); + console.error(m); + }; + if (!fs17[gracefulQueue]) { + queue = global[gracefulQueue] || []; + publishQueue(fs17, queue); + fs17.close = (function(fs$close) { + function close(fd, cb) { + return fs$close.call(fs17, fd, function(err) { + if (!err) { + resetQueue(); + } + if (typeof cb === "function") + cb.apply(this, arguments); + }); + } + Object.defineProperty(close, previousSymbol, { + value: fs$close + }); + return close; + })(fs17.close); + fs17.closeSync = (function(fs$closeSync) { + function closeSync(fd) { + fs$closeSync.apply(fs17, arguments); + resetQueue(); + } + Object.defineProperty(closeSync, previousSymbol, { + value: fs$closeSync + }); + return closeSync; + })(fs17.closeSync); + if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { + process.on("exit", function() { + debug2(fs17[gracefulQueue]); + require("assert").equal(fs17[gracefulQueue].length, 0); + }); } - has(key, invalidationKey) { - if (hasOwnProperty.call(this._memoryBlobs, key)) { - return this._invalidationKeys[key] === invalidationKey; - } else if (hasOwnProperty.call(this._storedMap, key)) { - return this._storedMap[key][0] === invalidationKey; + } + var queue; + if (!global[gracefulQueue]) { + publishQueue(global, fs17[gracefulQueue]); + } + module2.exports = patch(clone(fs17)); + if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs17.__patched) { + module2.exports = patch(fs17); + fs17.__patched = true; + } + function patch(fs18) { + polyfills(fs18); + fs18.gracefulify = patch; + fs18.createReadStream = createReadStream; + fs18.createWriteStream = createWriteStream; + var fs$readFile = fs18.readFile; + fs18.readFile = readFile; + function readFile(path16, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$readFile(path16, options, cb); + function go$readFile(path17, options2, cb2, startTime) { + return fs$readFile(path17, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$readFile, [path17, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); } - return false; } - get(key, invalidationKey) { - if (hasOwnProperty.call(this._memoryBlobs, key)) { - if (this._invalidationKeys[key] === invalidationKey) { - return this._memoryBlobs[key]; - } - } else if (hasOwnProperty.call(this._storedMap, key)) { - const mapping = this._storedMap[key]; - if (mapping[0] === invalidationKey) { - return this._storedBlob.slice(mapping[1], mapping[2]); - } + var fs$writeFile = fs18.writeFile; + fs18.writeFile = writeFile; + function writeFile(path16, data, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$writeFile(path16, data, options, cb); + function go$writeFile(path17, data2, options2, cb2, startTime) { + return fs$writeFile(path17, data2, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$writeFile, [path17, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); } } - set(key, invalidationKey, buffer) { - this._invalidationKeys[key] = invalidationKey; - this._memoryBlobs[key] = buffer; - this._dirty = true; + var fs$appendFile = fs18.appendFile; + if (fs$appendFile) + fs18.appendFile = appendFile; + function appendFile(path16, data, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$appendFile(path16, data, options, cb); + function go$appendFile(path17, data2, options2, cb2, startTime) { + return fs$appendFile(path17, data2, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$appendFile, [path17, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } } - delete(key) { - if (hasOwnProperty.call(this._memoryBlobs, key)) { - this._dirty = true; - delete this._memoryBlobs[key]; + var fs$copyFile = fs18.copyFile; + if (fs$copyFile) + fs18.copyFile = copyFile; + function copyFile(src, dest, flags, cb) { + if (typeof flags === "function") { + cb = flags; + flags = 0; } - if (hasOwnProperty.call(this._invalidationKeys, key)) { - this._dirty = true; - delete this._invalidationKeys[key]; + return go$copyFile(src, dest, flags, cb); + function go$copyFile(src2, dest2, flags2, cb2, startTime) { + return fs$copyFile(src2, dest2, flags2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$copyFile, [src2, dest2, flags2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); } - if (hasOwnProperty.call(this._storedMap, key)) { - this._dirty = true; - delete this._storedMap[key]; + } + var fs$readdir = fs18.readdir; + fs18.readdir = readdir; + var noReaddirOptionVersions = /^v[0-5]\./; + function readdir(path16, options, cb) { + if (typeof options === "function") + cb = options, options = null; + var go$readdir = noReaddirOptionVersions.test(process.version) ? function go$readdir2(path17, options2, cb2, startTime) { + return fs$readdir(path17, fs$readdirCallback( + path17, + options2, + cb2, + startTime + )); + } : function go$readdir2(path17, options2, cb2, startTime) { + return fs$readdir(path17, options2, fs$readdirCallback( + path17, + options2, + cb2, + startTime + )); + }; + return go$readdir(path16, options, cb); + function fs$readdirCallback(path17, options2, cb2, startTime) { + return function(err, files) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([ + go$readdir, + [path17, options2, cb2], + err, + startTime || Date.now(), + Date.now() + ]); + else { + if (files && files.sort) + files.sort(); + if (typeof cb2 === "function") + cb2.call(this, err, files); + } + }; } } - isDirty() { - return this._dirty; + if (process.version.substr(0, 4) === "v0.8") { + var legStreams = legacy(fs18); + ReadStream2 = legStreams.ReadStream; + WriteStream2 = legStreams.WriteStream; } - save() { - const dump = this._getDump(); - const blobToStore = Buffer.concat(dump[0]); - const mapToStore = JSON.stringify(dump[1]); - try { - mkdirpSync(this._directory); - fs8.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); - } catch (error) { - return false; - } - try { - fs8.writeFileSync(this._blobFilename, blobToStore); - fs8.writeFileSync(this._mapFilename, mapToStore); - } finally { - fs8.unlinkSync(this._lockFilename); - } - return true; + var fs$ReadStream = fs18.ReadStream; + if (fs$ReadStream) { + ReadStream2.prototype = Object.create(fs$ReadStream.prototype); + ReadStream2.prototype.open = ReadStream$open; } - _load() { - try { - this._storedBlob = fs8.readFileSync(this._blobFilename); - this._storedMap = JSON.parse(fs8.readFileSync(this._mapFilename)); - } catch (e) { - this._storedBlob = Buffer.alloc(0); - this._storedMap = {}; - } - this._dirty = false; - this._memoryBlobs = {}; - this._invalidationKeys = {}; + var fs$WriteStream = fs18.WriteStream; + if (fs$WriteStream) { + WriteStream2.prototype = Object.create(fs$WriteStream.prototype); + WriteStream2.prototype.open = WriteStream$open; } - _getDump() { - const buffers = []; - const newMap = {}; - let offset = 0; - function push(key, invalidationKey, buffer) { - buffers.push(buffer); - newMap[key] = [invalidationKey, offset, offset + buffer.length]; - offset += buffer.length; - } - for (const key of Object.keys(this._memoryBlobs)) { - const buffer = this._memoryBlobs[key]; - const invalidationKey = this._invalidationKeys[key]; - push(key, invalidationKey, buffer); - } - for (const key of Object.keys(this._storedMap)) { - if (hasOwnProperty.call(newMap, key)) - continue; - const mapping = this._storedMap[key]; - const buffer = this._storedBlob.slice(mapping[1], mapping[2]); - push(key, mapping[0], buffer); - } - return [buffers, newMap]; + Object.defineProperty(fs18, "ReadStream", { + get: function() { + return ReadStream2; + }, + set: function(val) { + ReadStream2 = val; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(fs18, "WriteStream", { + get: function() { + return WriteStream2; + }, + set: function(val) { + WriteStream2 = val; + }, + enumerable: true, + configurable: true + }); + var FileReadStream = ReadStream2; + Object.defineProperty(fs18, "FileReadStream", { + get: function() { + return FileReadStream; + }, + set: function(val) { + FileReadStream = val; + }, + enumerable: true, + configurable: true + }); + var FileWriteStream = WriteStream2; + Object.defineProperty(fs18, "FileWriteStream", { + get: function() { + return FileWriteStream; + }, + set: function(val) { + FileWriteStream = val; + }, + enumerable: true, + configurable: true + }); + function ReadStream2(path16, options) { + if (this instanceof ReadStream2) + return fs$ReadStream.apply(this, arguments), this; + else + return ReadStream2.apply(Object.create(ReadStream2.prototype), arguments); } - }; - var NativeCompileCache = class { - constructor() { - this._cacheStore = null; - this._previousModuleCompile = null; + function ReadStream$open() { + var that = this; + open(that.path, that.flags, that.mode, function(err, fd) { + if (err) { + if (that.autoClose) + that.destroy(); + that.emit("error", err); + } else { + that.fd = fd; + that.emit("open", fd); + that.read(); + } + }); } - setCacheStore(cacheStore) { - this._cacheStore = cacheStore; + function WriteStream2(path16, options) { + if (this instanceof WriteStream2) + return fs$WriteStream.apply(this, arguments), this; + else + return WriteStream2.apply(Object.create(WriteStream2.prototype), arguments); } - install() { - const self2 = this; - const hasRequireResolvePaths = typeof require.resolve.paths === "function"; - this._previousModuleCompile = Module2.prototype._compile; - Module2.prototype._compile = function(content, filename) { - const mod = this; - function require2(id) { - return mod.require(id); - } - function resolve(request, options) { - return Module2._resolveFilename(request, mod, false, options); - } - require2.resolve = resolve; - if (hasRequireResolvePaths) { - resolve.paths = function paths(request) { - return Module2._resolveLookupPaths(request, mod, true); - }; + function WriteStream$open() { + var that = this; + open(that.path, that.flags, that.mode, function(err, fd) { + if (err) { + that.destroy(); + that.emit("error", err); + } else { + that.fd = fd; + that.emit("open", fd); } - require2.main = process.mainModule; - require2.extensions = Module2._extensions; - require2.cache = Module2._cache; - const dirname = path10.dirname(filename); - const compiledWrapper = self2._moduleCompile(filename, content); - const args = [mod.exports, require2, mod, filename, dirname, process, global, Buffer]; - return compiledWrapper.apply(mod.exports, args); - }; + }); } - uninstall() { - Module2.prototype._compile = this._previousModuleCompile; + function createReadStream(path16, options) { + return new fs18.ReadStream(path16, options); } - _moduleCompile(filename, content) { - var contLen = content.length; - if (contLen >= 2) { - if (content.charCodeAt(0) === 35 && content.charCodeAt(1) === 33) { - if (contLen === 2) { - content = ""; - } else { - var i = 2; - for (; i < contLen; ++i) { - var code = content.charCodeAt(i); - if (code === 10 || code === 13) - break; - } - if (i === contLen) { - content = ""; - } else { - content = content.slice(i); - } + function createWriteStream(path16, options) { + return new fs18.WriteStream(path16, options); + } + var fs$open = fs18.open; + fs18.open = open; + function open(path16, flags, mode, cb) { + if (typeof mode === "function") + cb = mode, mode = null; + return go$open(path16, flags, mode, cb); + function go$open(path17, flags2, mode2, cb2, startTime) { + return fs$open(path17, flags2, mode2, function(err, fd) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$open, [path17, flags2, mode2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); } - } + }); } - var wrapper = Module2.wrap(content); - var invalidationKey = crypto.createHash("sha1").update(content, "utf8").digest("hex"); - var buffer = this._cacheStore.get(filename, invalidationKey); - var script = new vm.Script(wrapper, { - filename, - lineOffset: 0, - displayErrors: true, - cachedData: buffer, - produceCachedData: true - }); - if (script.cachedDataProduced) { - this._cacheStore.set(filename, invalidationKey, script.cachedData); - } else if (script.cachedDataRejected) { - this._cacheStore.delete(filename); + } + return fs18; + } + function enqueue(elem) { + debug2("ENQUEUE", elem[0].name, elem[1]); + fs17[gracefulQueue].push(elem); + retry(); + } + var retryTimer; + function resetQueue() { + var now = Date.now(); + for (var i = 0; i < fs17[gracefulQueue].length; ++i) { + if (fs17[gracefulQueue][i].length > 2) { + fs17[gracefulQueue][i][3] = now; + fs17[gracefulQueue][i][4] = now; } - var compiledWrapper = script.runInThisContext({ - filename, - lineOffset: 0, - columnOffset: 0, - displayErrors: true - }); - return compiledWrapper; } + retry(); + } + function retry() { + clearTimeout(retryTimer); + retryTimer = void 0; + if (fs17[gracefulQueue].length === 0) + return; + var elem = fs17[gracefulQueue].shift(); + var fn2 = elem[0]; + var args = elem[1]; + var err = elem[2]; + var startTime = elem[3]; + var lastTime = elem[4]; + if (startTime === void 0) { + debug2("RETRY", fn2.name, args); + fn2.apply(null, args); + } else if (Date.now() - startTime >= 6e4) { + debug2("TIMEOUT", fn2.name, args); + var cb = args.pop(); + if (typeof cb === "function") + cb.call(null, err); + } else { + var sinceAttempt = Date.now() - lastTime; + var sinceStart = Math.max(lastTime - startTime, 1); + var desiredDelay = Math.min(sinceStart * 1.2, 100); + if (sinceAttempt >= desiredDelay) { + debug2("RETRY", fn2.name, args); + fn2.apply(null, args.concat([startTime])); + } else { + fs17[gracefulQueue].push(elem); + } + } + if (retryTimer === void 0) { + retryTimer = setTimeout(retry, 0); + } + } + } +}); + +// .yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js +var require_cmd_shim = __commonJS({ + ".yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js"(exports2, module2) { + "use strict"; + cmdShim2.ifExists = cmdShimIfExists; + var util_1 = require("util"); + var path16 = require("path"); + var isWindows4 = require_is_windows(); + var CMD_EXTENSION = require_cmd_extension(); + var shebangExpr = /^#!\s*(?:\/usr\/bin\/env(?:\s+-S\s*)?)?\s*([^ \t]+)(.*)$/; + var DEFAULT_OPTIONS = { + // Create PowerShell file by default if the option hasn't been specified + createPwshFile: true, + createCmdFile: isWindows4(), + fs: require_graceful_fs() }; - function mkdirpSync(p_) { - _mkdirpSync(path10.resolve(p_), 511); + var extensionToProgramMap = /* @__PURE__ */ new Map([ + [".js", "node"], + [".cjs", "node"], + [".mjs", "node"], + [".cmd", "cmd"], + [".bat", "cmd"], + [".ps1", "pwsh"], + [".sh", "sh"] + ]); + function ingestOptions(opts) { + const opts_ = { ...DEFAULT_OPTIONS, ...opts }; + const fs17 = opts_.fs; + opts_.fs_ = { + chmod: fs17.chmod ? (0, util_1.promisify)(fs17.chmod) : (async () => { + }), + mkdir: (0, util_1.promisify)(fs17.mkdir), + readFile: (0, util_1.promisify)(fs17.readFile), + stat: (0, util_1.promisify)(fs17.stat), + unlink: (0, util_1.promisify)(fs17.unlink), + writeFile: (0, util_1.promisify)(fs17.writeFile) + }; + return opts_; + } + async function cmdShim2(src, to, opts) { + const opts_ = ingestOptions(opts); + await cmdShim_(src, to, opts_); } - function _mkdirpSync(p, mode) { - try { - fs8.mkdirSync(p, mode); - } catch (err0) { - if (err0.code === "ENOENT") { - _mkdirpSync(path10.dirname(p)); - _mkdirpSync(p); - } else { - try { - const stat = fs8.statSync(p); - if (!stat.isDirectory()) { - throw err0; - } - } catch (err1) { - throw err0; - } - } - } + function cmdShimIfExists(src, to, opts) { + return cmdShim2(src, to, opts).catch(() => { + }); } - function slashEscape(str) { - const ESCAPE_LOOKUP = { - "\\": "zB", - ":": "zC", - "/": "zS", - "\0": "z0", - "z": "zZ" - }; - const ESCAPE_REGEX = /[\\:/\x00z]/g; - return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); + function rm(path17, opts) { + return opts.fs_.unlink(path17).catch(() => { + }); } - function supportsCachedData() { - const script = new vm.Script('""', { produceCachedData: true }); - return script.cachedDataProduced === true; + async function cmdShim_(src, to, opts) { + const srcRuntimeInfo = await searchScriptRuntime(src, opts); + await writeShimsPreCommon(to, opts); + return writeAllShims(src, to, srcRuntimeInfo, opts); } - function getCacheDir() { - const v8_compile_cache_cache_dir = process.env.V8_COMPILE_CACHE_CACHE_DIR; - if (v8_compile_cache_cache_dir) { - return v8_compile_cache_cache_dir; + function writeShimsPreCommon(target, opts) { + return opts.fs_.mkdir(path16.dirname(target), { recursive: true }); + } + function writeAllShims(src, to, srcRuntimeInfo, opts) { + const opts_ = ingestOptions(opts); + const generatorAndExts = [{ generator: generateShShim, extension: "" }]; + if (opts_.createCmdFile) { + generatorAndExts.push({ generator: generateCmdShim, extension: CMD_EXTENSION }); } - const dirname = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; - const arch = process.arch; - const version2 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; - const cacheDir = path10.join(os3.tmpdir(), dirname, arch, version2); - return cacheDir; + if (opts_.createPwshFile) { + generatorAndExts.push({ generator: generatePwshShim, extension: ".ps1" }); + } + return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_))); } - function getMainName() { - const mainName = require.main && typeof require.main.filename === "string" ? require.main.filename : process.cwd(); - return mainName; + function writeShimPre(target, opts) { + return rm(target, opts); } - if (!process.env.DISABLE_V8_COMPILE_CACHE && supportsCachedData()) { - const cacheDir = getCacheDir(); - const prefix = getMainName(); - const blobStore = new FileSystemBlobStore(cacheDir, prefix); - const nativeCompileCache = new NativeCompileCache(); - nativeCompileCache.setCacheStore(blobStore); - nativeCompileCache.install(); - process.once("exit", () => { - if (blobStore.isDirty()) { - blobStore.save(); + function writeShimPost(target, opts) { + return chmodShim(target, opts); + } + async function searchScriptRuntime(target, opts) { + try { + const data = await opts.fs_.readFile(target, "utf8"); + const firstLine = data.trim().split(/\r*\n/)[0]; + const shebang = firstLine.match(shebangExpr); + if (!shebang) { + const targetExtension = path16.extname(target).toLowerCase(); + return { + // undefined if extension is unknown but it's converted to null. + program: extensionToProgramMap.get(targetExtension) || null, + additionalArgs: "" + }; } - nativeCompileCache.uninstall(); + return { + program: shebang[1], + additionalArgs: shebang[2] + }; + } catch (err) { + if (!isWindows4() || err.code !== "ENOENT") + throw err; + if (await opts.fs_.stat(`${target}${getExeExtension()}`)) { + return { + program: null, + additionalArgs: "" + }; + } + throw err; + } + } + function getExeExtension() { + let cmdExtension; + if (process.env.PATHEXT) { + cmdExtension = process.env.PATHEXT.split(path16.delimiter).find((ext) => ext.toLowerCase() === ".exe"); + } + return cmdExtension || ".exe"; + } + async function writeShim(src, to, srcRuntimeInfo, generateShimScript, opts) { + const defaultArgs = opts.preserveSymlinks ? "--preserve-symlinks" : ""; + const args = [srcRuntimeInfo.additionalArgs, defaultArgs].filter((arg) => arg).join(" "); + opts = Object.assign({}, opts, { + prog: srcRuntimeInfo.program, + args }); + await writeShimPre(to, opts); + await opts.fs_.writeFile(to, generateShimScript(src, to, opts), "utf8"); + return writeShimPost(to, opts); } - module2.exports.__TEST__ = { - FileSystemBlobStore, - NativeCompileCache, - mkdirpSync, - slashEscape, - supportsCachedData, - getCacheDir, - getMainName - }; - } -}); + function generateCmdShim(src, to, opts) { + const shTarget = path16.relative(path16.dirname(to), src); + let target = shTarget.split("/").join("\\"); + const quotedPathToTarget = path16.isAbsolute(target) ? `"${target}"` : `"%~dp0\\${target}"`; + let longProg; + let prog = opts.prog; + let args = opts.args || ""; + const nodePath = normalizePathEnvVar(opts.nodePath).win32; + const prependToPath = normalizePathEnvVar(opts.prependToPath).win32; + if (!prog) { + prog = quotedPathToTarget; + args = ""; + target = ""; + } else if (prog === "node" && opts.nodeExecPath) { + prog = `"${opts.nodeExecPath}"`; + target = quotedPathToTarget; + } else { + longProg = `"%~dp0\\${prog}.exe"`; + target = quotedPathToTarget; + } + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let cmd = "@SETLOCAL\r\n"; + if (prependToPath) { + cmd += `@SET "PATH=${prependToPath}:%PATH%"\r +`; + } + if (nodePath) { + cmd += `@IF NOT DEFINED NODE_PATH (\r + @SET "NODE_PATH=${nodePath}"\r +) ELSE (\r + @SET "NODE_PATH=${nodePath};%NODE_PATH%"\r +)\r +`; + } + if (longProg) { + cmd += `@IF EXIST ${longProg} (\r + ${longProg} ${args} ${target} ${progArgs}%*\r +) ELSE (\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${prog} ${args} ${target} ${progArgs}%*\r +)\r +`; + } else { + cmd += `@${prog} ${args} ${target} ${progArgs}%*\r +`; + } + return cmd; + } + function generateShShim(src, to, opts) { + let shTarget = path16.relative(path16.dirname(to), src); + let shProg = opts.prog && opts.prog.split("\\").join("/"); + let shLongProg; + shTarget = shTarget.split("\\").join("/"); + const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; + let args = opts.args || ""; + const shNodePath = normalizePathEnvVar(opts.nodePath).posix; + if (!shProg) { + shProg = quotedPathToTarget; + args = ""; + shTarget = ""; + } else if (opts.prog === "node" && opts.nodeExecPath) { + shProg = `"${opts.nodeExecPath}"`; + shTarget = quotedPathToTarget; + } else { + shLongProg = `"$basedir/${opts.prog}"`; + shTarget = quotedPathToTarget; + } + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let sh = `#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") -// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/posix.js -var require_posix = __commonJS({ - ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/posix.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.sync = exports.isexe = void 0; - var fs_1 = require("fs"); - var promises_1 = require("fs/promises"); - var isexe = async (path10, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await (0, promises_1.stat)(path10), options); - } catch (e) { - const er = e; - if (ignoreErrors || er.code === "EACCES") - return false; - throw er; +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`; + if (opts.prependToPath) { + sh += `export PATH="${opts.prependToPath}:$PATH" +`; + } + if (shNodePath) { + sh += `if [ -z "$NODE_PATH" ]; then + export NODE_PATH="${shNodePath}" +else + export NODE_PATH="${shNodePath}:$NODE_PATH" +fi +`; + } + if (shLongProg) { + sh += `if [ -x ${shLongProg} ]; then + exec ${shLongProg} ${args} ${shTarget} ${progArgs}"$@" +else + exec ${shProg} ${args} ${shTarget} ${progArgs}"$@" +fi +`; + } else { + sh += `${shProg} ${args} ${shTarget} ${progArgs}"$@" +exit $? +`; + } + return sh; + } + function generatePwshShim(src, to, opts) { + let shTarget = path16.relative(path16.dirname(to), src); + const shProg = opts.prog && opts.prog.split("\\").join("/"); + let pwshProg = shProg && `"${shProg}$exe"`; + let pwshLongProg; + shTarget = shTarget.split("\\").join("/"); + const quotedPathToTarget = path16.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; + let args = opts.args || ""; + let normalizedNodePathEnvVar = normalizePathEnvVar(opts.nodePath); + const nodePath = normalizedNodePathEnvVar.win32; + const shNodePath = normalizedNodePathEnvVar.posix; + let normalizedPrependPathEnvVar = normalizePathEnvVar(opts.prependToPath); + const prependPath = normalizedPrependPathEnvVar.win32; + const shPrependPath = normalizedPrependPathEnvVar.posix; + if (!pwshProg) { + pwshProg = quotedPathToTarget; + args = ""; + shTarget = ""; + } else if (opts.prog === "node" && opts.nodeExecPath) { + pwshProg = `"${opts.nodeExecPath}"`; + shTarget = quotedPathToTarget; + } else { + pwshLongProg = `"$basedir/${opts.prog}$exe"`; + shTarget = quotedPathToTarget; } - }; - exports.isexe = isexe; - var sync = (path10, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat((0, fs_1.statSync)(path10), options); - } catch (e) { - const er = e; - if (ignoreErrors || er.code === "EACCES") - return false; - throw er; + let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; + let pwsh = `#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${nodePath || prependPath ? '$pathsep=":"\n' : ""}${nodePath ? `$env_node_path=$env:NODE_PATH +$new_node_path="${nodePath}" +` : ""}${prependPath ? `$env_path=$env:PATH +$prepend_path="${prependPath}" +` : ""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +${nodePath || prependPath ? ' $pathsep=";"\n' : ""}}`; + if (shNodePath || shPrependPath) { + pwsh += ` else { +${shNodePath ? ` $new_node_path="${shNodePath}" +` : ""}${shPrependPath ? ` $prepend_path="${shPrependPath}" +` : ""}} +`; } - }; - exports.sync = sync; - var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); - var checkMode = (stat, options) => { - const myUid = options.uid ?? process.getuid?.(); - const myGroups = options.groups ?? process.getgroups?.() ?? []; - const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; - if (myUid === void 0 || myGid === void 0) { - throw new Error("cannot get uid or gid"); + if (shNodePath) { + pwsh += `if ([string]::IsNullOrEmpty($env_node_path)) { + $env:NODE_PATH=$new_node_path +} else { + $env:NODE_PATH="$new_node_path$pathsep$env_node_path" +} +`; } - const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); - const mod = stat.mode; - const uid = stat.uid; - const gid = stat.gid; - const u = parseInt("100", 8); - const g = parseInt("010", 8); - const o = parseInt("001", 8); - const ug = u | g; - return !!(mod & o || mod & g && groups.has(gid) || mod & u && uid === myUid || mod & ug && myUid === 0); - }; - } -}); - -// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/win32.js -var require_win32 = __commonJS({ - ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/win32.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.sync = exports.isexe = void 0; - var fs_1 = require("fs"); - var promises_1 = require("fs/promises"); - var isexe = async (path10, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await (0, promises_1.stat)(path10), path10, options); - } catch (e) { - const er = e; - if (ignoreErrors || er.code === "EACCES") - return false; - throw er; + if (opts.prependToPath) { + pwsh += ` +$env:PATH="$prepend_path$pathsep$env:PATH" +`; } - }; - exports.isexe = isexe; - var sync = (path10, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat((0, fs_1.statSync)(path10), path10, options); - } catch (e) { - const er = e; - if (ignoreErrors || er.code === "EACCES") - return false; - throw er; + if (pwshLongProg) { + pwsh += ` +$ret=0 +if (Test-Path ${pwshLongProg}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args + } else { + & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args + } else { + & ${pwshProg} ${args} ${shTarget} ${progArgs}$args + } + $ret=$LASTEXITCODE +} +${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $ret +`; + } else { + pwsh += ` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args +} else { + & ${pwshProg} ${args} ${shTarget} ${progArgs}$args +} +${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $LASTEXITCODE +`; } - }; - exports.sync = sync; - var checkPathExt = (path10, options) => { - const { pathExt = process.env.PATHEXT || "" } = options; - const peSplit = pathExt.split(";"); - if (peSplit.indexOf("") !== -1) { - return true; + return pwsh; + } + function chmodShim(to, opts) { + return opts.fs_.chmod(to, 493); + } + function normalizePathEnvVar(nodePath) { + if (!nodePath || !nodePath.length) { + return { + win32: "", + posix: "" + }; } - for (let i = 0; i < peSplit.length; i++) { - const p = peSplit[i].toLowerCase(); - const ext = path10.substring(path10.length - p.length).toLowerCase(); - if (p && ext === p) { - return true; - } + let split = typeof nodePath === "string" ? nodePath.split(path16.delimiter) : Array.from(nodePath); + let result = {}; + for (let i = 0; i < split.length; i++) { + const win322 = split[i].split("/").join("\\"); + const posix = isWindows4() ? split[i].split("\\").join("/").replace(/^([^:\\/]*):/, (_, $1) => `/mnt/${$1.toLowerCase()}`) : split[i]; + result.win32 = result.win32 ? `${result.win32};${win322}` : win322; + result.posix = result.posix ? `${result.posix}:${posix}` : posix; + result[i] = { win32: win322, posix }; } - return false; - }; - var checkStat = (stat, path10, options) => stat.isFile() && checkPathExt(path10, options); - } -}); - -// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/options.js -var require_options = __commonJS({ - ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/options.js"(exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); + return result; + } + module2.exports = cmdShim2; } }); -// .yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js -var require_cjs = __commonJS({ - ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js"(exports) { - "use strict"; - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === void 0) - 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]; - } }; +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/mode-fix.js +var modeFix; +var init_mode_fix = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/mode-fix.js"() { + modeFix = (mode, isDir, portable) => { + mode &= 4095; + if (portable) { + mode = (mode | 384) & ~18; } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === void 0) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__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); + if (isDir) { + if (mode & 256) { + mode |= 64; + } + if (mode & 32) { + mode |= 8; + } + if (mode & 4) { + mode |= 1; + } } - __setModuleDefault(result, mod); - return result; - }; - var __exportStar = exports && exports.__exportStar || function(m, exports2) { - for (var p in m) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) - __createBinding(exports2, m, p); + return mode; }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.sync = exports.isexe = exports.posix = exports.win32 = void 0; - var posix = __importStar(require_posix()); - exports.posix = posix; - var win32 = __importStar(require_win32()); - exports.win32 = win32; - __exportStar(require_options(), exports); - var platform = process.env._ISEXE_TEST_PLATFORM_ || process.platform; - var impl = platform === "win32" ? win32 : posix; - exports.isexe = impl.isexe; - exports.sync = impl.sync; } }); -// .yarn/cache/which-npm-4.0.0-dd31cd4928-449fa5c44e.zip/node_modules/which/lib/index.js -var require_lib = __commonJS({ - ".yarn/cache/which-npm-4.0.0-dd31cd4928-449fa5c44e.zip/node_modules/which/lib/index.js"(exports, module2) { - var { isexe, sync: isexeSync } = require_cjs(); - var { join: join2, delimiter, sep, posix } = require("path"); - var isWindows = process.platform === "win32"; - var rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? "" : sep}]`.replace(/(\\)/g, "\\$1")); - var rRel = new RegExp(`^\\.${rSlash.source}`); - var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); - var getPathInfo = (cmd, { - path: optPath = process.env.PATH, - pathExt: optPathExt = process.env.PATHEXT, - delimiter: optDelimiter = delimiter - }) => { - const pathEnv = cmd.match(rSlash) ? [""] : [ - // windows always checks the cwd first - ...isWindows ? [process.cwd()] : [], - ...(optPath || /* istanbul ignore next: very unusual */ - "").split(optDelimiter) - ]; - if (isWindows) { - const pathExtExe = optPathExt || [".EXE", ".CMD", ".BAT", ".COM"].join(optDelimiter); - const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()]); - if (cmd.includes(".") && pathExt[0] !== "") { - pathExt.unshift(""); +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/write-entry.js +var import_fs11, import_path9, prefixPath, maxReadSize, PROCESS, FILE2, DIRECTORY2, SYMLINK2, HARDLINK2, HEADER, READ2, LSTAT, ONLSTAT, ONREAD, ONREADLINK, OPENFILE, ONOPENFILE, CLOSE, MODE, AWAITDRAIN, ONDRAIN, PREFIX, WriteEntry, WriteEntrySync, WriteEntryTar, getType; +var init_write_entry = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/write-entry.js"() { + import_fs11 = __toESM(require("fs"), 1); + init_esm(); + import_path9 = __toESM(require("path"), 1); + init_header(); + init_mode_fix(); + init_normalize_windows_path(); + init_options(); + init_pax(); + init_strip_absolute_path(); + init_strip_trailing_slashes(); + init_warn_method(); + init_winchars(); + prefixPath = (path16, prefix) => { + if (!prefix) { + return normalizeWindowsPath(path16); + } + path16 = normalizeWindowsPath(path16).replace(/^\.(\/|$)/, ""); + return stripTrailingSlashes(prefix) + "/" + path16; + }; + maxReadSize = 16 * 1024 * 1024; + PROCESS = Symbol("process"); + FILE2 = Symbol("file"); + DIRECTORY2 = Symbol("directory"); + SYMLINK2 = Symbol("symlink"); + HARDLINK2 = Symbol("hardlink"); + HEADER = Symbol("header"); + READ2 = Symbol("read"); + LSTAT = Symbol("lstat"); + ONLSTAT = Symbol("onlstat"); + ONREAD = Symbol("onread"); + ONREADLINK = Symbol("onreadlink"); + OPENFILE = Symbol("openfile"); + ONOPENFILE = Symbol("onopenfile"); + CLOSE = Symbol("close"); + MODE = Symbol("mode"); + AWAITDRAIN = Symbol("awaitDrain"); + ONDRAIN = Symbol("ondrain"); + PREFIX = Symbol("prefix"); + WriteEntry = class extends Minipass { + path; + portable; + myuid = process.getuid && process.getuid() || 0; + // until node has builtin pwnam functions, this'll have to do + myuser = process.env.USER || ""; + maxReadSize; + linkCache; + statCache; + preservePaths; + cwd; + strict; + mtime; + noPax; + noMtime; + prefix; + fd; + blockLen = 0; + blockRemain = 0; + buf; + pos = 0; + remain = 0; + length = 0; + offset = 0; + win32; + absolute; + header; + type; + linkpath; + stat; + onWriteEntry; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.path = normalizeWindowsPath(p); + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); + this.statCache = opt.statCache || /* @__PURE__ */ new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : void 0; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - return { pathEnv, pathExt, pathExtExe }; - } - return { pathEnv, pathExt: [""] }; - }; - var getPathPart = (raw, cmd) => { - const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw; - const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : ""; - return prefix + join2(pathPart, cmd); - }; - var which3 = async (cmd, opt = {}) => { - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); - const found = []; - for (const envPart of pathEnv) { - const p = getPathPart(envPart, cmd); - for (const ext of pathExt) { - const withExt = p + ext; - const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is) { - if (!opt.all) { - return withExt; - } - found.push(withExt); + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; } } + this.win32 = !!opt.win32 || process.platform === "win32"; + if (this.win32) { + this.path = decode(this.path.replace(/\\/g, "/")); + p = p.replace(/\\/g, "/"); + } + this.absolute = normalizeWindowsPath(opt.absolute || import_path9.default.resolve(this.cwd, p)); + if (this.path === "") { + this.path = "./"; + } + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } else { + this[LSTAT](); + } } - if (opt.all && found.length) { - return found; + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); } - if (opt.nothrow) { - return null; + emit(ev, ...data) { + if (ev === "error") { + this.#hadError = true; + } + return super.emit(ev, ...data); } - throw getNotFoundError(cmd); - }; - var whichSync = (cmd, opt = {}) => { - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); - const found = []; - for (const pathEnvPart of pathEnv) { - const p = getPathPart(pathEnvPart, cmd); - for (const ext of pathExt) { - const withExt = p + ext; - const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is) { - if (!opt.all) { - return withExt; - } - found.push(withExt); + [LSTAT]() { + import_fs11.default.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit("error", er); } + this[ONLSTAT](stat); + }); + } + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; } + this.type = getType(stat); + this.emit("stat", stat); + this[PROCESS](); } - if (opt.all && found.length) { - return found; + [PROCESS]() { + switch (this.type) { + case "File": + return this[FILE2](); + case "Directory": + return this[DIRECTORY2](); + case "SymbolicLink": + return this[SYMLINK2](); + // unsupported types are ignored. + default: + return this.end(); + } } - if (opt.nothrow) { - return null; + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); } - throw getNotFoundError(cmd); - }; - module2.exports = which3; - which3.sync = whichSync; - } -}); - -// .yarn/cache/is-windows-npm-1.0.2-898cd6f3d7-b32f418ab3.zip/node_modules/is-windows/index.js -var require_is_windows = __commonJS({ - ".yarn/cache/is-windows-npm-1.0.2-898cd6f3d7-b32f418ab3.zip/node_modules/is-windows/index.js"(exports, module2) { - (function(factory) { - if (exports && typeof exports === "object" && typeof module2 !== "undefined") { - module2.exports = factory(); - } else if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof window !== "undefined") { - window.isWindows = factory(); - } else if (typeof global !== "undefined") { - global.isWindows = factory(); - } else if (typeof self !== "undefined") { - self.isWindows = factory(); - } else { - this.isWindows = factory(); + [PREFIX](path16) { + return prefixPath(path16, this.prefix); } - })(function() { - "use strict"; - return function isWindows() { - return process && (process.platform === "win32" || /^(msys|cygwin)$/.test(process.env.OSTYPE)); - }; - }); - } -}); - -// .yarn/cache/cmd-extension-npm-1.0.2-11aa204c4b-acdb425d51.zip/node_modules/cmd-extension/index.js -var require_cmd_extension = __commonJS({ - ".yarn/cache/cmd-extension-npm-1.0.2-11aa204c4b-acdb425d51.zip/node_modules/cmd-extension/index.js"(exports, module2) { - "use strict"; - var path10 = require("path"); - var cmdExtension; - if (process.env.PATHEXT) { - cmdExtension = process.env.PATHEXT.split(path10.delimiter).find((ext) => ext.toUpperCase() === ".CMD"); - } - module2.exports = cmdExtension || ".cmd"; - } -}); - -// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/polyfills.js -var require_polyfills = __commonJS({ - ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/polyfills.js"(exports, module2) { - var constants = require("constants"); - var origCwd = process.cwd; - var cwd = null; - var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform; - process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process); - return cwd; - }; - try { - process.cwd(); - } catch (er) { - } - if (typeof process.chdir === "function") { - chdir = process.chdir; - process.chdir = function(d) { - cwd = null; - chdir.call(process, d); - }; - if (Object.setPrototypeOf) - Object.setPrototypeOf(process.chdir, chdir); - } - var chdir; - module2.exports = patch; - function patch(fs8) { - if (constants.hasOwnProperty("O_SYMLINK") && process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs8); - } - if (!fs8.lutimes) { - patchLutimes(fs8); - } - fs8.chown = chownFix(fs8.chown); - fs8.fchown = chownFix(fs8.fchown); - fs8.lchown = chownFix(fs8.lchown); - fs8.chmod = chmodFix(fs8.chmod); - fs8.fchmod = chmodFix(fs8.fchmod); - fs8.lchmod = chmodFix(fs8.lchmod); - fs8.chownSync = chownFixSync(fs8.chownSync); - fs8.fchownSync = chownFixSync(fs8.fchownSync); - fs8.lchownSync = chownFixSync(fs8.lchownSync); - fs8.chmodSync = chmodFixSync(fs8.chmodSync); - fs8.fchmodSync = chmodFixSync(fs8.fchmodSync); - fs8.lchmodSync = chmodFixSync(fs8.lchmodSync); - fs8.stat = statFix(fs8.stat); - fs8.fstat = statFix(fs8.fstat); - fs8.lstat = statFix(fs8.lstat); - fs8.statSync = statFixSync(fs8.statSync); - fs8.fstatSync = statFixSync(fs8.fstatSync); - fs8.lstatSync = statFixSync(fs8.lstatSync); - if (fs8.chmod && !fs8.lchmod) { - fs8.lchmod = function(path10, mode, cb) { - if (cb) - process.nextTick(cb); - }; - fs8.lchmodSync = function() { - }; + [HEADER]() { + if (!this.stat) { + throw new Error("cannot write header before stat"); + } + if (this.type === "Directory" && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? void 0 : this.stat.uid, + gid: this.portable ? void 0 : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? void 0 : this.mtime || this.stat.mtime, + /* c8 ignore next */ + type: this.type === "Unsupported" ? void 0 : this.type, + uname: this.portable ? void 0 : this.stat.uid === this.myuid ? this.myuser : "", + atime: this.portable ? void 0 : this.stat.atime, + ctime: this.portable ? void 0 : this.stat.ctime + }); + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? void 0 : this.header.atime, + ctime: this.portable ? void 0 : this.header.ctime, + gid: this.portable ? void 0 : this.header.gid, + mtime: this.noMtime ? void 0 : this.mtime || this.header.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + size: this.header.size, + uid: this.portable ? void 0 : this.header.uid, + uname: this.portable ? void 0 : this.header.uname, + dev: this.portable ? void 0 : this.stat.dev, + ino: this.portable ? void 0 : this.stat.ino, + nlink: this.portable ? void 0 : this.stat.nlink + }).encode()); + } + const block = this.header?.block; + if (!block) { + throw new Error("failed to encode header"); + } + super.write(block); } - if (fs8.chown && !fs8.lchown) { - fs8.lchown = function(path10, uid, gid, cb) { - if (cb) - process.nextTick(cb); - }; - fs8.lchownSync = function() { - }; + [DIRECTORY2]() { + if (!this.stat) { + throw new Error("cannot create directory entry without stat"); + } + if (this.path.slice(-1) !== "/") { + this.path += "/"; + } + this.stat.size = 0; + this[HEADER](); + this.end(); } - if (platform === "win32") { - fs8.rename = typeof fs8.rename !== "function" ? fs8.rename : function(fs$rename) { - function rename(from, to, cb) { - var start = Date.now(); - var backoff = 0; - fs$rename(from, to, function CB(er) { - if (er && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") && Date.now() - start < 6e4) { - setTimeout(function() { - fs8.stat(to, function(stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er); - }); - }, backoff); - if (backoff < 100) - backoff += 10; - return; - } - if (cb) - cb(er); - }); + [SYMLINK2]() { + import_fs11.default.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit("error", er); } - if (Object.setPrototypeOf) - Object.setPrototypeOf(rename, fs$rename); - return rename; - }(fs8.rename); + this[ONREADLINK](linkpath); + }); } - fs8.read = typeof fs8.read !== "function" ? fs8.read : function(fs$read) { - function read(fd, buffer, offset, length, position, callback_) { - var callback; - if (callback_ && typeof callback_ === "function") { - var eagCounter = 0; - callback = function(er, _, __) { - if (er && er.code === "EAGAIN" && eagCounter < 10) { - eagCounter++; - return fs$read.call(fs8, fd, buffer, offset, length, position, callback); - } - callback_.apply(this, arguments); - }; - } - return fs$read.call(fs8, fd, buffer, offset, length, position, callback); + [ONREADLINK](linkpath) { + this.linkpath = normalizeWindowsPath(linkpath); + this[HEADER](); + this.end(); + } + [HARDLINK2](linkpath) { + if (!this.stat) { + throw new Error("cannot create link entry without stat"); } - if (Object.setPrototypeOf) - Object.setPrototypeOf(read, fs$read); - return read; - }(fs8.read); - fs8.readSync = typeof fs8.readSync !== "function" ? fs8.readSync : function(fs$readSync) { - return function(fd, buffer, offset, length, position) { - var eagCounter = 0; - while (true) { - try { - return fs$readSync.call(fs8, fd, buffer, offset, length, position); - } catch (er) { - if (er.code === "EAGAIN" && eagCounter < 10) { - eagCounter++; - continue; - } - throw er; - } + this.type = "Link"; + this.linkpath = normalizeWindowsPath(import_path9.default.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [FILE2]() { + if (!this.stat) { + throw new Error("cannot create file entry without stat"); + } + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK2](linkpath); } - }; - }(fs8.readSync); - function patchLchmod(fs9) { - fs9.lchmod = function(path10, mode, callback) { - fs9.open( - path10, - constants.O_WRONLY | constants.O_SYMLINK, - mode, - function(err, fd) { - if (err) { - if (callback) - callback(err); - return; - } - fs9.fchmod(fd, mode, function(err2) { - fs9.close(fd, function(err22) { - if (callback) - callback(err2 || err22); - }); - }); - } - ); - }; - fs9.lchmodSync = function(path10, mode) { - var fd = fs9.openSync(path10, constants.O_WRONLY | constants.O_SYMLINK, mode); - var threw = true; - var ret; - try { - ret = fs9.fchmodSync(fd, mode); - threw = false; - } finally { - if (threw) { - try { - fs9.closeSync(fd); - } catch (er) { - } - } else { - fs9.closeSync(fd); - } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); + } + [OPENFILE]() { + import_fs11.default.open(this.absolute, "r", (er, fd) => { + if (er) { + return this.emit("error", er); } - return ret; - }; + this[ONOPENFILE](fd); + }); } - function patchLutimes(fs9) { - if (constants.hasOwnProperty("O_SYMLINK") && fs9.futimes) { - fs9.lutimes = function(path10, at, mt, cb) { - fs9.open(path10, constants.O_SYMLINK, function(er, fd) { - if (er) { - if (cb) - cb(er); - return; - } - fs9.futimes(fd, at, mt, function(er2) { - fs9.close(fd, function(er22) { - if (cb) - cb(er2 || er22); - }); - }); - }); - }; - fs9.lutimesSync = function(path10, at, mt) { - var fd = fs9.openSync(path10, constants.O_SYMLINK); - var ret; - var threw = true; - try { - ret = fs9.futimesSync(fd, at, mt); - threw = false; - } finally { - if (threw) { - try { - fs9.closeSync(fd); - } catch (er) { - } - } else { - fs9.closeSync(fd); - } - } - return ret; - }; - } else if (fs9.futimes) { - fs9.lutimes = function(_a, _b, _c, cb) { - if (cb) - process.nextTick(cb); - }; - fs9.lutimesSync = function() { - }; + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); } + if (!this.stat) { + throw new Error("should stat before calling onopenfile"); + } + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ2](); } - function chmodFix(orig) { - if (!orig) - return orig; - return function(target, mode, cb) { - return orig.call(fs8, target, mode, function(er) { - if (chownErOk(er)) - er = null; - if (cb) - cb.apply(this, arguments); - }); - }; + [READ2]() { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("cannot read file without first opening"); + } + import_fs11.default.read(fd, buf, offset, length, pos2, (er, bytesRead) => { + if (er) { + return this[CLOSE](() => this.emit("error", er)); + } + this[ONREAD](bytesRead); + }); } - function chmodFixSync(orig) { - if (!orig) - return orig; - return function(target, mode) { - try { - return orig.call(fs8, target, mode); - } catch (er) { - if (!chownErOk(er)) - throw er; + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.close(this.fd, cb); + } + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error("encountered unexpected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error("did not encounter expected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (!this.buf) { + throw new Error("should have created buffer prior to reading"); + } + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; } - }; + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } else { + this[ONDRAIN](); + } } - function chownFix(orig) { - if (!orig) - return orig; - return function(target, uid, gid, cb) { - return orig.call(fs8, target, uid, gid, function(er) { - if (chownErOk(er)) - er = null; - if (cb) - cb.apply(this, arguments); + [AWAITDRAIN](cb) { + this.once("drain", cb); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + } + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error("writing more data than expected"), { + path: this.absolute }); - }; + return this.emit("error", er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); } - function chownFixSync(orig) { - if (!orig) - return orig; - return function(target, uid, gid) { - try { - return orig.call(fs8, target, uid, gid); - } catch (er) { - if (!chownErOk(er)) - throw er; + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); } - }; + return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); + } + if (!this.buf) { + throw new Error("buffer lost somehow in ONDRAIN"); + } + if (this.offset >= this.length) { + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); + this.offset = 0; + } + this.length = this.buf.length - this.offset; + this[READ2](); } - function statFix(orig) { - if (!orig) - return orig; - return function(target, options, cb) { - if (typeof options === "function") { - cb = options; - options = null; + }; + WriteEntrySync = class extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](import_fs11.default.lstatSync(this.absolute)); + } + [SYMLINK2]() { + this[ONREADLINK](import_fs11.default.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](import_fs11.default.openSync(this.absolute, "r")); + } + [READ2]() { + let threw = true; + try { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("fd and buf must be set in READ method"); } - function callback(er, stats) { - if (stats) { - if (stats.uid < 0) - stats.uid += 4294967296; - if (stats.gid < 0) - stats.gid += 4294967296; + const bytesRead = import_fs11.default.readSync(fd, buf, offset, length, pos2); + this[ONREAD](bytesRead); + threw = false; + } finally { + if (threw) { + try { + this[CLOSE](() => { + }); + } catch (er) { } - if (cb) - cb.apply(this, arguments); } - return options ? orig.call(fs8, target, options, callback) : orig.call(fs8, target, callback); - }; + } } - function statFixSync(orig) { - if (!orig) - return orig; - return function(target, options) { - var stats = options ? orig.call(fs8, target, options) : orig.call(fs8, target); - if (stats) { - if (stats.uid < 0) - stats.uid += 4294967296; - if (stats.gid < 0) - stats.gid += 4294967296; - } - return stats; - }; + [AWAITDRAIN](cb) { + cb(); } - function chownErOk(er) { - if (!er) - return true; - if (er.code === "ENOSYS") - return true; - var nonroot = !process.getuid || process.getuid() !== 0; - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true; - } - return false; + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.closeSync(this.fd); + cb(); } - } - } -}); - -// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js -var require_legacy_streams = __commonJS({ - ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/legacy-streams.js"(exports, module2) { - var Stream = require("stream").Stream; - module2.exports = legacy; - function legacy(fs8) { - return { - ReadStream, - WriteStream - }; - function ReadStream(path10, options) { - if (!(this instanceof ReadStream)) - return new ReadStream(path10, options); - Stream.call(this); - var self2 = this; - this.path = path10; - this.fd = null; - this.readable = true; - this.paused = false; - this.flags = "r"; - this.mode = 438; - this.bufferSize = 64 * 1024; - options = options || {}; - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + }; + WriteEntryTar = class extends Minipass { + blockLen = 0; + blockRemain = 0; + buf = 0; + pos = 0; + remain = 0; + length = 0; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; + type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; + linkpath; + size; + onWriteEntry; + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); + } + constructor(readEntry, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.preservePaths = !!opt.preservePaths; + this.portable = !!opt.portable; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.onWriteEntry = opt.onWriteEntry; + this.readEntry = readEntry; + const { type } = readEntry; + if (type === "Unsupported") { + throw new Error("writing entry that should be ignored"); } - if (this.encoding) - this.setEncoding(this.encoding); - if (this.start !== void 0) { - if ("number" !== typeof this.start) { - throw TypeError("start must be a Number"); - } - if (this.end === void 0) { - this.end = Infinity; - } else if ("number" !== typeof this.end) { - throw TypeError("end must be a Number"); - } - if (this.start > this.end) { - throw new Error("start must be <= end"); - } - this.pos = this.start; + this.type = type; + if (this.type === "Directory" && this.portable) { + this.noMtime = true; } - if (this.fd !== null) { - process.nextTick(function() { - self2._read(); - }); - return; + this.prefix = opt.prefix; + this.path = normalizeWindowsPath(readEntry.path); + this.mode = readEntry.mode !== void 0 ? this[MODE](readEntry.mode) : void 0; + this.uid = this.portable ? void 0 : readEntry.uid; + this.gid = this.portable ? void 0 : readEntry.gid; + this.uname = this.portable ? void 0 : readEntry.uname; + this.gname = this.portable ? void 0 : readEntry.gname; + this.size = readEntry.size; + this.mtime = this.noMtime ? void 0 : opt.mtime || readEntry.mtime; + this.atime = this.portable ? void 0 : readEntry.atime; + this.ctime = this.portable ? void 0 : readEntry.ctime; + this.linkpath = readEntry.linkpath !== void 0 ? normalizeWindowsPath(readEntry.linkpath) : void 0; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - fs8.open(this.path, this.flags, this.mode, function(err, fd) { - if (err) { - self2.emit("error", err); - self2.readable = false; - return; + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; } - self2.fd = fd; - self2.emit("open", fd); - self2._read(); + } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? void 0 : this.uid, + gid: this.portable ? void 0 : this.gid, + size: this.size, + mtime: this.noMtime ? void 0 : this.mtime, + type: this.type, + uname: this.portable ? void 0 : this.uname, + atime: this.portable ? void 0 : this.atime, + ctime: this.portable ? void 0 : this.ctime }); + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? void 0 : this.atime, + ctime: this.portable ? void 0 : this.ctime, + gid: this.portable ? void 0 : this.gid, + mtime: this.noMtime ? void 0 : this.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + size: this.size, + uid: this.portable ? void 0 : this.uid, + uname: this.portable ? void 0 : this.uname, + dev: this.portable ? void 0 : this.readEntry.dev, + ino: this.portable ? void 0 : this.readEntry.ino, + nlink: this.portable ? void 0 : this.readEntry.nlink + }).encode()); + } + const b = this.header?.block; + if (!b) + throw new Error("failed to encode header"); + super.write(b); + readEntry.pipe(this); } - function WriteStream(path10, options) { - if (!(this instanceof WriteStream)) - return new WriteStream(path10, options); - Stream.call(this); - this.path = path10; - this.fd = null; - this.writable = true; - this.flags = "w"; - this.encoding = "binary"; - this.mode = 438; - this.bytesWritten = 0; - options = options || {}; - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + [PREFIX](path16) { + return prefixPath(path16, this.prefix); + } + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; } - if (this.start !== void 0) { - if ("number" !== typeof this.start) { - throw TypeError("start must be a Number"); - } - if (this.start < 0) { - throw new Error("start must be >= zero"); - } - this.pos = this.start; + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); } - this.busy = false; - this._queue = []; - if (this.fd === null) { - this._open = fs8.open; - this._queue.push([this._open, this.path, this.flags, this.mode, void 0]); - this.flush(); + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); } + this.blockRemain -= writeLen; + return super.write(chunk, cb); + } + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + if (typeof chunk === "function") { + cb = chunk; + encoding = void 0; + chunk = void 0; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding ?? "utf8"); + } + if (cb) + this.once("finish", cb); + chunk ? super.end(chunk, cb) : super.end(cb); + return this; } - } - } -}); - -// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/clone.js -var require_clone = __commonJS({ - ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/clone.js"(exports, module2) { - "use strict"; - module2.exports = clone; - var getPrototypeOf = Object.getPrototypeOf || function(obj) { - return obj.__proto__; }; - function clone(obj) { - if (obj === null || typeof obj !== "object") - return obj; - if (obj instanceof Object) - var copy = { __proto__: getPrototypeOf(obj) }; - else - var copy = /* @__PURE__ */ Object.create(null); - Object.getOwnPropertyNames(obj).forEach(function(key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)); - }); - return copy; - } + getType = (stat) => stat.isFile() ? "File" : stat.isDirectory() ? "Directory" : stat.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; } }); -// .yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js -var require_graceful_fs = __commonJS({ - ".yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-386d011a55.zip/node_modules/graceful-fs/graceful-fs.js"(exports, module2) { - var fs8 = require("fs"); - var polyfills = require_polyfills(); - var legacy = require_legacy_streams(); - var clone = require_clone(); - var util = require("util"); - var gracefulQueue; - var previousSymbol; - if (typeof Symbol === "function" && typeof Symbol.for === "function") { - gracefulQueue = Symbol.for("graceful-fs.queue"); - previousSymbol = Symbol.for("graceful-fs.previous"); - } else { - gracefulQueue = "___graceful-fs.queue"; - previousSymbol = "___graceful-fs.previous"; - } - function noop() { - } - function publishQueue(context, queue2) { - Object.defineProperty(context, gracefulQueue, { - get: function() { - return queue2; +// .yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js +function insertAfter(self2, node, value) { + const prev = node; + const next = node ? node.next : self2.head; + const inserted = new Node(value, prev, next, self2); + if (inserted.next === void 0) { + self2.tail = inserted; + } + if (inserted.prev === void 0) { + self2.head = inserted; + } + self2.length++; + return inserted; +} +function push(self2, item) { + self2.tail = new Node(item, self2.tail, void 0, self2); + if (!self2.head) { + self2.head = self2.tail; + } + self2.length++; +} +function unshift(self2, item) { + self2.head = new Node(item, void 0, self2.head, self2); + if (!self2.tail) { + self2.tail = self2.head; + } + self2.length++; +} +var Yallist, Node; +var init_esm5 = __esm({ + ".yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js"() { + Yallist = class _Yallist { + tail; + head; + length = 0; + static create(list2 = []) { + return new _Yallist(list2); + } + constructor(list2 = []) { + for (const item of list2) { + this.push(item); + } + } + *[Symbol.iterator]() { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value; } - }); - } - var debug2 = noop; - if (util.debuglog) - debug2 = util.debuglog("gfs4"); - else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) - debug2 = function() { - var m = util.format.apply(util, arguments); - m = "GFS4: " + m.split(/\n/).join("\nGFS4: "); - console.error(m); - }; - if (!fs8[gracefulQueue]) { - queue = global[gracefulQueue] || []; - publishQueue(fs8, queue); - fs8.close = function(fs$close) { - function close(fd, cb) { - return fs$close.call(fs8, fd, function(err) { - if (!err) { - resetQueue(); - } - if (typeof cb === "function") - cb.apply(this, arguments); - }); + } + removeNode(node) { + if (node.list !== this) { + throw new Error("removing node which does not belong to this list"); } - Object.defineProperty(close, previousSymbol, { - value: fs$close - }); - return close; - }(fs8.close); - fs8.closeSync = function(fs$closeSync) { - function closeSync(fd) { - fs$closeSync.apply(fs8, arguments); - resetQueue(); + const next = node.next; + const prev = node.prev; + if (next) { + next.prev = prev; } - Object.defineProperty(closeSync, previousSymbol, { - value: fs$closeSync - }); - return closeSync; - }(fs8.closeSync); - if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { - process.on("exit", function() { - debug2(fs8[gracefulQueue]); - require("assert").equal(fs8[gracefulQueue].length, 0); - }); + if (prev) { + prev.next = next; + } + if (node === this.head) { + this.head = next; + } + if (node === this.tail) { + this.tail = prev; + } + this.length--; + node.next = void 0; + node.prev = void 0; + node.list = void 0; + return next; } - } - var queue; - if (!global[gracefulQueue]) { - publishQueue(global, fs8[gracefulQueue]); - } - module2.exports = patch(clone(fs8)); - if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs8.__patched) { - module2.exports = patch(fs8); - fs8.__patched = true; - } - function patch(fs9) { - polyfills(fs9); - fs9.gracefulify = patch; - fs9.createReadStream = createReadStream; - fs9.createWriteStream = createWriteStream; - var fs$readFile = fs9.readFile; - fs9.readFile = readFile; - function readFile(path10, options, cb) { - if (typeof options === "function") - cb = options, options = null; - return go$readFile(path10, options, cb); - function go$readFile(path11, options2, cb2, startTime) { - return fs$readFile(path11, options2, function(err) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$readFile, [path11, options2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + unshiftNode(node) { + if (node === this.head) { + return; } + if (node.list) { + node.list.removeNode(node); + } + const head = this.head; + node.list = this; + node.next = head; + if (head) { + head.prev = node; + } + this.head = node; + if (!this.tail) { + this.tail = node; + } + this.length++; } - var fs$writeFile = fs9.writeFile; - fs9.writeFile = writeFile; - function writeFile(path10, data, options, cb) { - if (typeof options === "function") - cb = options, options = null; - return go$writeFile(path10, data, options, cb); - function go$writeFile(path11, data2, options2, cb2, startTime) { - return fs$writeFile(path11, data2, options2, function(err) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$writeFile, [path11, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + pushNode(node) { + if (node === this.tail) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const tail = this.tail; + node.list = this; + node.prev = tail; + if (tail) { + tail.next = node; } + this.tail = node; + if (!this.head) { + this.head = node; + } + this.length++; } - var fs$appendFile = fs9.appendFile; - if (fs$appendFile) - fs9.appendFile = appendFile; - function appendFile(path10, data, options, cb) { - if (typeof options === "function") - cb = options, options = null; - return go$appendFile(path10, data, options, cb); - function go$appendFile(path11, data2, options2, cb2, startTime) { - return fs$appendFile(path11, data2, options2, function(err) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$appendFile, [path11, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + push(...args) { + for (let i = 0, l = args.length; i < l; i++) { + push(this, args[i]); } + return this.length; } - var fs$copyFile = fs9.copyFile; - if (fs$copyFile) - fs9.copyFile = copyFile; - function copyFile(src, dest, flags, cb) { - if (typeof flags === "function") { - cb = flags; - flags = 0; + unshift(...args) { + for (var i = 0, l = args.length; i < l; i++) { + unshift(this, args[i]); } - return go$copyFile(src, dest, flags, cb); - function go$copyFile(src2, dest2, flags2, cb2, startTime) { - return fs$copyFile(src2, dest2, flags2, function(err) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$copyFile, [src2, dest2, flags2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + return this.length; + } + pop() { + if (!this.tail) { + return void 0; + } + const res = this.tail.value; + const t = this.tail; + this.tail = this.tail.prev; + if (this.tail) { + this.tail.next = void 0; + } else { + this.head = void 0; } + t.list = void 0; + this.length--; + return res; } - var fs$readdir = fs9.readdir; - fs9.readdir = readdir; - var noReaddirOptionVersions = /^v[0-5]\./; - function readdir(path10, options, cb) { - if (typeof options === "function") - cb = options, options = null; - var go$readdir = noReaddirOptionVersions.test(process.version) ? function go$readdir2(path11, options2, cb2, startTime) { - return fs$readdir(path11, fs$readdirCallback( - path11, - options2, - cb2, - startTime - )); - } : function go$readdir2(path11, options2, cb2, startTime) { - return fs$readdir(path11, options2, fs$readdirCallback( - path11, - options2, - cb2, - startTime - )); - }; - return go$readdir(path10, options, cb); - function fs$readdirCallback(path11, options2, cb2, startTime) { - return function(err, files) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([ - go$readdir, - [path11, options2, cb2], - err, - startTime || Date.now(), - Date.now() - ]); - else { - if (files && files.sort) - files.sort(); - if (typeof cb2 === "function") - cb2.call(this, err, files); - } - }; + shift() { + if (!this.head) { + return void 0; } + const res = this.head.value; + const h = this.head; + this.head = this.head.next; + if (this.head) { + this.head.prev = void 0; + } else { + this.tail = void 0; + } + h.list = void 0; + this.length--; + return res; } - if (process.version.substr(0, 4) === "v0.8") { - var legStreams = legacy(fs9); - ReadStream = legStreams.ReadStream; - WriteStream = legStreams.WriteStream; + forEach(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.head, i = 0; !!walker; i++) { + fn2.call(thisp, walker.value, i, this); + walker = walker.next; + } } - var fs$ReadStream = fs9.ReadStream; - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype); - ReadStream.prototype.open = ReadStream$open; + forEachReverse(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.tail, i = this.length - 1; !!walker; i--) { + fn2.call(thisp, walker.value, i, this); + walker = walker.prev; + } } - var fs$WriteStream = fs9.WriteStream; - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype); - WriteStream.prototype.open = WriteStream$open; + get(n) { + let i = 0; + let walker = this.head; + for (; !!walker && i < n; i++) { + walker = walker.next; + } + if (i === n && !!walker) { + return walker.value; + } } - Object.defineProperty(fs9, "ReadStream", { - get: function() { - return ReadStream; - }, - set: function(val) { - ReadStream = val; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(fs9, "WriteStream", { - get: function() { - return WriteStream; - }, - set: function(val) { - WriteStream = val; - }, - enumerable: true, - configurable: true - }); - var FileReadStream = ReadStream; - Object.defineProperty(fs9, "FileReadStream", { - get: function() { - return FileReadStream; - }, - set: function(val) { - FileReadStream = val; - }, - enumerable: true, - configurable: true - }); - var FileWriteStream = WriteStream; - Object.defineProperty(fs9, "FileWriteStream", { - get: function() { - return FileWriteStream; - }, - set: function(val) { - FileWriteStream = val; - }, - enumerable: true, - configurable: true - }); - function ReadStream(path10, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this; - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments); + getReverse(n) { + let i = 0; + let walker = this.tail; + for (; !!walker && i < n; i++) { + walker = walker.prev; + } + if (i === n && !!walker) { + return walker.value; + } } - function ReadStream$open() { - var that = this; - open(that.path, that.flags, that.mode, function(err, fd) { - if (err) { - if (that.autoClose) - that.destroy(); - that.emit("error", err); - } else { - that.fd = fd; - that.emit("open", fd); - that.read(); - } - }); + map(fn2, thisp) { + thisp = thisp || this; + const res = new _Yallist(); + for (let walker = this.head; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.next; + } + return res; } - function WriteStream(path10, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this; - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments); + mapReverse(fn2, thisp) { + thisp = thisp || this; + var res = new _Yallist(); + for (let walker = this.tail; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.prev; + } + return res; + } + reduce(fn2, initial) { + let acc; + let walker = this.head; + if (arguments.length > 1) { + acc = initial; + } else if (this.head) { + walker = this.head.next; + acc = this.head.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); + } + for (var i = 0; !!walker; i++) { + acc = fn2(acc, walker.value, i); + walker = walker.next; + } + return acc; + } + reduceReverse(fn2, initial) { + let acc; + let walker = this.tail; + if (arguments.length > 1) { + acc = initial; + } else if (this.tail) { + walker = this.tail.prev; + acc = this.tail.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); + } + for (let i = this.length - 1; !!walker; i--) { + acc = fn2(acc, walker.value, i); + walker = walker.prev; + } + return acc; } - function WriteStream$open() { - var that = this; - open(that.path, that.flags, that.mode, function(err, fd) { - if (err) { - that.destroy(); - that.emit("error", err); - } else { - that.fd = fd; - that.emit("open", fd); - } - }); + toArray() { + const arr = new Array(this.length); + for (let i = 0, walker = this.head; !!walker; i++) { + arr[i] = walker.value; + walker = walker.next; + } + return arr; } - function createReadStream(path10, options) { - return new fs9.ReadStream(path10, options); + toArrayReverse() { + const arr = new Array(this.length); + for (let i = 0, walker = this.tail; !!walker; i++) { + arr[i] = walker.value; + walker = walker.prev; + } + return arr; } - function createWriteStream(path10, options) { - return new fs9.WriteStream(path10, options); + slice(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let walker = this.head; + let i = 0; + for (i = 0; !!walker && i < from; i++) { + walker = walker.next; + } + for (; !!walker && i < to; i++, walker = walker.next) { + ret.push(walker.value); + } + return ret; } - var fs$open = fs9.open; - fs9.open = open; - function open(path10, flags, mode, cb) { - if (typeof mode === "function") - cb = mode, mode = null; - return go$open(path10, flags, mode, cb); - function go$open(path11, flags2, mode2, cb2, startTime) { - return fs$open(path11, flags2, mode2, function(err, fd) { - if (err && (err.code === "EMFILE" || err.code === "ENFILE")) - enqueue([go$open, [path11, flags2, mode2, cb2], err, startTime || Date.now(), Date.now()]); - else { - if (typeof cb2 === "function") - cb2.apply(this, arguments); - } - }); + sliceReverse(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; } + let i = this.length; + let walker = this.tail; + for (; !!walker && i > to; i--) { + walker = walker.prev; + } + for (; !!walker && i > from; i--, walker = walker.prev) { + ret.push(walker.value); + } + return ret; } - return fs9; - } - function enqueue(elem) { - debug2("ENQUEUE", elem[0].name, elem[1]); - fs8[gracefulQueue].push(elem); - retry(); - } - var retryTimer; - function resetQueue() { - var now = Date.now(); - for (var i = 0; i < fs8[gracefulQueue].length; ++i) { - if (fs8[gracefulQueue][i].length > 2) { - fs8[gracefulQueue][i][3] = now; - fs8[gracefulQueue][i][4] = now; + splice(start, deleteCount = 0, ...nodes) { + if (start > this.length) { + start = this.length - 1; + } + if (start < 0) { + start = this.length + start; + } + let walker = this.head; + for (let i = 0; !!walker && i < start; i++) { + walker = walker.next; + } + const ret = []; + for (let i = 0; !!walker && i < deleteCount; i++) { + ret.push(walker.value); + walker = this.removeNode(walker); + } + if (!walker) { + walker = this.tail; + } else if (walker !== this.tail) { + walker = walker.prev; + } + for (const v of nodes) { + walker = insertAfter(this, walker, v); } + return ret; } - retry(); - } - function retry() { - clearTimeout(retryTimer); - retryTimer = void 0; - if (fs8[gracefulQueue].length === 0) - return; - var elem = fs8[gracefulQueue].shift(); - var fn2 = elem[0]; - var args = elem[1]; - var err = elem[2]; - var startTime = elem[3]; - var lastTime = elem[4]; - if (startTime === void 0) { - debug2("RETRY", fn2.name, args); - fn2.apply(null, args); - } else if (Date.now() - startTime >= 6e4) { - debug2("TIMEOUT", fn2.name, args); - var cb = args.pop(); - if (typeof cb === "function") - cb.call(null, err); - } else { - var sinceAttempt = Date.now() - lastTime; - var sinceStart = Math.max(lastTime - startTime, 1); - var desiredDelay = Math.min(sinceStart * 1.2, 100); - if (sinceAttempt >= desiredDelay) { - debug2("RETRY", fn2.name, args); - fn2.apply(null, args.concat([startTime])); - } else { - fs8[gracefulQueue].push(elem); + reverse() { + const head = this.head; + const tail = this.tail; + for (let walker = head; !!walker; walker = walker.prev) { + const p = walker.prev; + walker.prev = walker.next; + walker.next = p; } + this.head = tail; + this.tail = head; + return this; } - if (retryTimer === void 0) { - retryTimer = setTimeout(retry, 0); + }; + Node = class { + list; + next; + prev; + value; + constructor(value, prev, next, list2) { + this.list = list2; + this.value = value; + if (prev) { + prev.next = this; + this.prev = prev; + } else { + this.prev = void 0; + } + if (next) { + next.prev = this; + this.next = next; + } else { + this.next = void 0; + } } - } + }; } }); -// .yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js -var require_cmd_shim = __commonJS({ - ".yarn/cache/@zkochan-cmd-shim-npm-6.0.0-97792a7373-ba1442ba1e.zip/node_modules/@zkochan/cmd-shim/index.js"(exports, module2) { - "use strict"; - cmdShim2.ifExists = cmdShimIfExists; - var util_1 = require("util"); - var path10 = require("path"); - var isWindows = require_is_windows(); - var CMD_EXTENSION = require_cmd_extension(); - var shebangExpr = /^#!\s*(?:\/usr\/bin\/env(?:\s+-S\s*)?)?\s*([^ \t]+)(.*)$/; - var DEFAULT_OPTIONS = { - // Create PowerShell file by default if the option hasn't been specified - createPwshFile: true, - createCmdFile: isWindows(), - fs: require_graceful_fs() +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/pack.js +var import_fs12, import_path10, PackJob, EOF2, ONSTAT, ENDED3, QUEUE2, CURRENT, PROCESS2, PROCESSING, PROCESSJOB, JOBS, JOBDONE, ADDFSENTRY, ADDTARENTRY, STAT, READDIR, ONREADDIR, PIPE, ENTRY, ENTRYOPT, WRITEENTRYCLASS, WRITE, ONDRAIN2, Pack, PackSync; +var init_pack = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/pack.js"() { + import_fs12 = __toESM(require("fs"), 1); + init_write_entry(); + init_esm(); + init_esm3(); + init_esm5(); + init_read_entry(); + init_warn_method(); + import_path10 = __toESM(require("path"), 1); + init_normalize_windows_path(); + PackJob = class { + path; + absolute; + entry; + stat; + readdir; + pending = false; + ignore = false; + piped = false; + constructor(path16, absolute) { + this.path = path16 || "./"; + this.absolute = absolute; + } }; - var extensionToProgramMap = /* @__PURE__ */ new Map([ - [".js", "node"], - [".cjs", "node"], - [".mjs", "node"], - [".cmd", "cmd"], - [".bat", "cmd"], - [".ps1", "pwsh"], - [".sh", "sh"] - ]); - function ingestOptions(opts) { - const opts_ = { ...DEFAULT_OPTIONS, ...opts }; - const fs8 = opts_.fs; - opts_.fs_ = { - chmod: fs8.chmod ? (0, util_1.promisify)(fs8.chmod) : async () => { - }, - mkdir: (0, util_1.promisify)(fs8.mkdir), - readFile: (0, util_1.promisify)(fs8.readFile), - stat: (0, util_1.promisify)(fs8.stat), - unlink: (0, util_1.promisify)(fs8.unlink), - writeFile: (0, util_1.promisify)(fs8.writeFile) - }; - return opts_; - } - async function cmdShim2(src, to, opts) { - const opts_ = ingestOptions(opts); - await cmdShim_(src, to, opts_); - } - function cmdShimIfExists(src, to, opts) { - return cmdShim2(src, to, opts).catch(() => { - }); - } - function rm2(path11, opts) { - return opts.fs_.unlink(path11).catch(() => { - }); - } - async function cmdShim_(src, to, opts) { - const srcRuntimeInfo = await searchScriptRuntime(src, opts); - await writeShimsPreCommon(to, opts); - return writeAllShims(src, to, srcRuntimeInfo, opts); - } - function writeShimsPreCommon(target, opts) { - return opts.fs_.mkdir(path10.dirname(target), { recursive: true }); - } - function writeAllShims(src, to, srcRuntimeInfo, opts) { - const opts_ = ingestOptions(opts); - const generatorAndExts = [{ generator: generateShShim, extension: "" }]; - if (opts_.createCmdFile) { - generatorAndExts.push({ generator: generateCmdShim, extension: CMD_EXTENSION }); + EOF2 = Buffer.alloc(1024); + ONSTAT = Symbol("onStat"); + ENDED3 = Symbol("ended"); + QUEUE2 = Symbol("queue"); + CURRENT = Symbol("current"); + PROCESS2 = Symbol("process"); + PROCESSING = Symbol("processing"); + PROCESSJOB = Symbol("processJob"); + JOBS = Symbol("jobs"); + JOBDONE = Symbol("jobDone"); + ADDFSENTRY = Symbol("addFSEntry"); + ADDTARENTRY = Symbol("addTarEntry"); + STAT = Symbol("stat"); + READDIR = Symbol("readdir"); + ONREADDIR = Symbol("onreaddir"); + PIPE = Symbol("pipe"); + ENTRY = Symbol("entry"); + ENTRYOPT = Symbol("entryOpt"); + WRITEENTRYCLASS = Symbol("writeEntryClass"); + WRITE = Symbol("write"); + ONDRAIN2 = Symbol("ondrain"); + Pack = class extends Minipass { + sync = false; + opt; + cwd; + maxReadSize; + preservePaths; + strict; + noPax; + prefix; + linkCache; + statCache; + file; + portable; + zip; + readdirCache; + noDirRecurse; + follow; + noMtime; + mtime; + filter; + jobs; + [WRITEENTRYCLASS]; + onWriteEntry; + // Note: we actually DO need a linked list here, because we + // shift() to update the head of the list where we start, but still + // while that happens, need to know what the next item in the queue + // will be. Since we do multiple jobs in parallel, it's not as simple + // as just an Array.shift(), since that would lose the information about + // the next job in the list. We could add a .next field on the PackJob + // class, but then we'd have to be tracking the tail of the queue the + // whole time, and Yallist just does that for us anyway. + [QUEUE2]; + [JOBS] = 0; + [PROCESSING] = false; + [ENDED3] = false; + constructor(opt = {}) { + super(); + this.opt = opt; + this.file = opt.file || ""; + this.cwd = opt.cwd || process.cwd(); + this.maxReadSize = opt.maxReadSize; + this.preservePaths = !!opt.preservePaths; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.prefix = normalizeWindowsPath(opt.prefix || ""); + this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); + this.statCache = opt.statCache || /* @__PURE__ */ new Map(); + this.readdirCache = opt.readdirCache || /* @__PURE__ */ new Map(); + this.onWriteEntry = opt.onWriteEntry; + this[WRITEENTRYCLASS] = WriteEntry; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); + } + 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) { + throw new TypeError("gzip, brotli, zstd are mutually exclusive"); + } + if (opt.gzip) { + if (typeof opt.gzip !== "object") { + opt.gzip = {}; + } + if (this.portable) { + opt.gzip.portable = true; + } + this.zip = new Gzip(opt.gzip); + } + if (opt.brotli) { + if (typeof opt.brotli !== "object") { + opt.brotli = {}; + } + this.zip = new BrotliCompress(opt.brotli); + } + if (opt.zstd) { + if (typeof opt.zstd !== "object") { + opt.zstd = {}; + } + this.zip = new ZstdCompress(opt.zstd); + } + if (!this.zip) + throw new Error("impossible"); + const zip = this.zip; + zip.on("data", (chunk) => super.write(chunk)); + zip.on("end", () => super.end()); + zip.on("drain", () => this[ONDRAIN2]()); + this.on("resume", () => zip.resume()); + } else { + this.on("drain", this[ONDRAIN2]); + } + this.noDirRecurse = !!opt.noDirRecurse; + this.follow = !!opt.follow; + this.noMtime = !!opt.noMtime; + if (opt.mtime) + this.mtime = opt.mtime; + this.filter = typeof opt.filter === "function" ? opt.filter : () => true; + this[QUEUE2] = new Yallist(); + this[JOBS] = 0; + this.jobs = Number(opt.jobs) || 4; + this[PROCESSING] = false; + this[ENDED3] = false; } - if (opts_.createPwshFile) { - generatorAndExts.push({ generator: generatePwshShim, extension: ".ps1" }); + [WRITE](chunk) { + return super.write(chunk); } - return Promise.all(generatorAndExts.map((generatorAndExt) => writeShim(src, to + generatorAndExt.extension, srcRuntimeInfo, generatorAndExt.generator, opts_))); - } - function writeShimPre(target, opts) { - return rm2(target, opts); - } - function writeShimPost(target, opts) { - return chmodShim(target, opts); - } - async function searchScriptRuntime(target, opts) { - try { - const data = await opts.fs_.readFile(target, "utf8"); - const firstLine = data.trim().split(/\r*\n/)[0]; - const shebang = firstLine.match(shebangExpr); - if (!shebang) { - const targetExtension = path10.extname(target).toLowerCase(); - return { - // undefined if extension is unknown but it's converted to null. - program: extensionToProgramMap.get(targetExtension) || null, - additionalArgs: "" - }; + add(path16) { + this.write(path16); + return this; + } + end(path16, encoding, cb) { + if (typeof path16 === "function") { + cb = path16; + path16 = void 0; } - return { - program: shebang[1], - additionalArgs: shebang[2] - }; - } catch (err) { - if (!isWindows() || err.code !== "ENOENT") - throw err; - if (await opts.fs_.stat(`${target}${getExeExtension()}`)) { - return { - program: null, - additionalArgs: "" - }; + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; } - throw err; + if (path16) { + this.add(path16); + } + this[ENDED3] = true; + this[PROCESS2](); + if (cb) + cb(); + return this; } - } - function getExeExtension() { - let cmdExtension; - if (process.env.PATHEXT) { - cmdExtension = process.env.PATHEXT.split(path10.delimiter).find((ext) => ext.toLowerCase() === ".exe"); + write(path16) { + if (this[ENDED3]) { + throw new Error("write after end"); + } + if (path16 instanceof ReadEntry) { + this[ADDTARENTRY](path16); + } else { + this[ADDFSENTRY](path16); + } + return this.flowing; + } + [ADDTARENTRY](p) { + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p.path)); + if (!this.filter(p.path, p)) { + p.resume(); + } else { + const job = new PackJob(p.path, absolute); + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)); + job.entry.on("end", () => this[JOBDONE](job)); + this[JOBS] += 1; + this[QUEUE2].push(job); + } + this[PROCESS2](); + } + [ADDFSENTRY](p) { + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p)); + this[QUEUE2].push(new PackJob(p, absolute)); + this[PROCESS2](); + } + [STAT](job) { + job.pending = true; + this[JOBS] += 1; + const stat = this.follow ? "stat" : "lstat"; + import_fs12.default[stat](job.absolute, (er, stat2) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + this.emit("error", er); + } else { + this[ONSTAT](job, stat2); + } + }); + } + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + if (!this.filter(job.path, stat)) { + job.ignore = true; + } else if (stat.isFile() && stat.nlink > 1 && job === this[CURRENT] && !this.linkCache.get(`${stat.dev}:${stat.ino}`) && !this.sync) { + this[PROCESSJOB](job); + } + this[PROCESS2](); + } + [READDIR](job) { + job.pending = true; + this[JOBS] += 1; + import_fs12.default.readdir(job.absolute, (er, entries) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + return this.emit("error", er); + } + this[ONREADDIR](job, entries); + }); } - return cmdExtension || ".exe"; - } - async function writeShim(src, to, srcRuntimeInfo, generateShimScript, opts) { - const defaultArgs = opts.preserveSymlinks ? "--preserve-symlinks" : ""; - const args = [srcRuntimeInfo.additionalArgs, defaultArgs].filter((arg) => arg).join(" "); - opts = Object.assign({}, opts, { - prog: srcRuntimeInfo.program, - args - }); - await writeShimPre(to, opts); - await opts.fs_.writeFile(to, generateShimScript(src, to, opts), "utf8"); - return writeShimPost(to, opts); - } - function generateCmdShim(src, to, opts) { - const shTarget = path10.relative(path10.dirname(to), src); - let target = shTarget.split("/").join("\\"); - const quotedPathToTarget = path10.isAbsolute(target) ? `"${target}"` : `"%~dp0\\${target}"`; - let longProg; - let prog = opts.prog; - let args = opts.args || ""; - const nodePath = normalizePathEnvVar(opts.nodePath).win32; - const prependToPath = normalizePathEnvVar(opts.prependToPath).win32; - if (!prog) { - prog = quotedPathToTarget; - args = ""; - target = ""; - } else if (prog === "node" && opts.nodeExecPath) { - prog = `"${opts.nodeExecPath}"`; - target = quotedPathToTarget; - } else { - longProg = `"%~dp0\\${prog}.exe"`; - target = quotedPathToTarget; + [ONREADDIR](job, entries) { + this.readdirCache.set(job.absolute, entries); + job.readdir = entries; + this[PROCESS2](); } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let cmd = "@SETLOCAL\r\n"; - if (prependToPath) { - cmd += `@SET "PATH=${prependToPath}:%PATH%"\r -`; + [PROCESS2]() { + if (this[PROCESSING]) { + return; + } + this[PROCESSING] = true; + for (let w = this[QUEUE2].head; !!w && this[JOBS] < this.jobs; w = w.next) { + this[PROCESSJOB](w.value); + if (w.value.ignore) { + const p = w.next; + this[QUEUE2].removeNode(w); + w.next = p; + } + } + this[PROCESSING] = false; + if (this[ENDED3] && !this[QUEUE2].length && this[JOBS] === 0) { + if (this.zip) { + this.zip.end(EOF2); + } else { + super.write(EOF2); + super.end(); + } + } } - if (nodePath) { - cmd += `@IF NOT DEFINED NODE_PATH (\r - @SET "NODE_PATH=${nodePath}"\r -) ELSE (\r - @SET "NODE_PATH=${nodePath};%NODE_PATH%"\r -)\r -`; + get [CURRENT]() { + return this[QUEUE2] && this[QUEUE2].head && this[QUEUE2].head.value; } - if (longProg) { - cmd += `@IF EXIST ${longProg} (\r - ${longProg} ${args} ${target} ${progArgs}%*\r -) ELSE (\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${prog} ${args} ${target} ${progArgs}%*\r -)\r -`; - } else { - cmd += `@${prog} ${args} ${target} ${progArgs}%*\r -`; + [JOBDONE](_job) { + this[QUEUE2].shift(); + this[JOBS] -= 1; + this[PROCESS2](); } - return cmd; - } - function generateShShim(src, to, opts) { - let shTarget = path10.relative(path10.dirname(to), src); - let shProg = opts.prog && opts.prog.split("\\").join("/"); - let shLongProg; - shTarget = shTarget.split("\\").join("/"); - const quotedPathToTarget = path10.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; - let args = opts.args || ""; - const shNodePath = normalizePathEnvVar(opts.nodePath).posix; - if (!shProg) { - shProg = quotedPathToTarget; - args = ""; - shTarget = ""; - } else if (opts.prog === "node" && opts.nodeExecPath) { - shProg = `"${opts.nodeExecPath}"`; - shTarget = quotedPathToTarget; - } else { - shLongProg = `"$basedir/${opts.prog}"`; - shTarget = quotedPathToTarget; + [PROCESSJOB](job) { + if (job.pending) { + return; + } + if (job.entry) { + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + return; + } + if (!job.stat) { + const sc = this.statCache.get(job.absolute); + if (sc) { + this[ONSTAT](job, sc); + } else { + this[STAT](job); + } + } + if (!job.stat) { + return; + } + if (job.ignore) { + return; + } + if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { + const rc = this.readdirCache.get(job.absolute); + if (rc) { + this[ONREADDIR](job, rc); + } else { + this[READDIR](job); + } + if (!job.readdir) { + return; + } + } + job.entry = this[ENTRY](job); + if (!job.entry) { + job.ignore = true; + return; + } + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let sh = `#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`; - if (opts.prependToPath) { - sh += `export PATH="${opts.prependToPath}:$PATH" -`; + [ENTRYOPT](job) { + return { + onwarn: (code2, msg, data) => this.warn(code2, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime, + prefix: this.prefix, + onWriteEntry: this.onWriteEntry + }; } - if (shNodePath) { - sh += `if [ -z "$NODE_PATH" ]; then - export NODE_PATH="${shNodePath}" -else - export NODE_PATH="${shNodePath}:$NODE_PATH" -fi -`; + [ENTRY](job) { + this[JOBS] += 1; + try { + const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)); + return e.on("end", () => this[JOBDONE](job)).on("error", (er) => this.emit("error", er)); + } catch (er) { + this.emit("error", er); + } } - if (shLongProg) { - sh += `if [ -x ${shLongProg} ]; then - exec ${shLongProg} ${args} ${shTarget} ${progArgs}"$@" -else - exec ${shProg} ${args} ${shTarget} ${progArgs}"$@" -fi -`; - } else { - sh += `${shProg} ${args} ${shTarget} ${progArgs}"$@" -exit $? -`; + [ONDRAIN2]() { + if (this[CURRENT] && this[CURRENT].entry) { + this[CURRENT].entry.resume(); + } } - return sh; - } - function generatePwshShim(src, to, opts) { - let shTarget = path10.relative(path10.dirname(to), src); - const shProg = opts.prog && opts.prog.split("\\").join("/"); - let pwshProg = shProg && `"${shProg}$exe"`; - let pwshLongProg; - shTarget = shTarget.split("\\").join("/"); - const quotedPathToTarget = path10.isAbsolute(shTarget) ? `"${shTarget}"` : `"$basedir/${shTarget}"`; - let args = opts.args || ""; - let normalizedNodePathEnvVar = normalizePathEnvVar(opts.nodePath); - const nodePath = normalizedNodePathEnvVar.win32; - const shNodePath = normalizedNodePathEnvVar.posix; - let normalizedPrependPathEnvVar = normalizePathEnvVar(opts.prependToPath); - const prependPath = normalizedPrependPathEnvVar.win32; - const shPrependPath = normalizedPrependPathEnvVar.posix; - if (!pwshProg) { - pwshProg = quotedPathToTarget; - args = ""; - shTarget = ""; - } else if (opts.prog === "node" && opts.nodeExecPath) { - pwshProg = `"${opts.nodeExecPath}"`; - shTarget = quotedPathToTarget; - } else { - pwshLongProg = `"$basedir/${opts.prog}$exe"`; - shTarget = quotedPathToTarget; + // like .pipe() but using super, because our write() is special + [PIPE](job) { + job.piped = true; + if (job.readdir) { + job.readdir.forEach((entry) => { + const p = job.path; + const base = p === "./" ? "" : p.replace(/\/*$/, "/"); + this[ADDFSENTRY](base + entry); + }); + } + const source = job.entry; + const zip = this.zip; + if (!source) + throw new Error("cannot pipe without source"); + if (zip) { + source.on("data", (chunk) => { + if (!zip.write(chunk)) { + source.pause(); + } + }); + } else { + source.on("data", (chunk) => { + if (!super.write(chunk)) { + source.pause(); + } + }); + } } - let progArgs = opts.progArgs ? `${opts.progArgs.join(` `)} ` : ""; - let pwsh = `#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${nodePath || prependPath ? '$pathsep=":"\n' : ""}${nodePath ? `$env_node_path=$env:NODE_PATH -$new_node_path="${nodePath}" -` : ""}${prependPath ? `$env_path=$env:PATH -$prepend_path="${prependPath}" -` : ""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -${nodePath || prependPath ? ' $pathsep=";"\n' : ""}}`; - if (shNodePath || shPrependPath) { - pwsh += ` else { -${shNodePath ? ` $new_node_path="${shNodePath}" -` : ""}${shPrependPath ? ` $prepend_path="${shPrependPath}" -` : ""}} -`; + pause() { + if (this.zip) { + this.zip.pause(); + } + return super.pause(); } - if (shNodePath) { - pwsh += `if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} -`; + warn(code2, message, data = {}) { + warnMethod(this, code2, message, data); } - if (opts.prependToPath) { - pwsh += ` -$env:PATH="$prepend_path$pathsep$env:PATH" -`; + }; + PackSync = class extends Pack { + sync = true; + constructor(opt) { + super(opt); + this[WRITEENTRYCLASS] = WriteEntrySync; } - if (pwshLongProg) { - pwsh += ` -$ret=0 -if (Test-Path ${pwshLongProg}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args - } else { - & ${pwshLongProg} ${args} ${shTarget} ${progArgs}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args - } else { - & ${pwshProg} ${args} ${shTarget} ${progArgs}$args - } - $ret=$LASTEXITCODE -} -${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $ret -`; - } else { - pwsh += ` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${pwshProg} ${args} ${shTarget} ${progArgs}$args -} else { - & ${pwshProg} ${args} ${shTarget} ${progArgs}$args -} -${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$env_path\n" : ""}exit $LASTEXITCODE -`; + // pause/resume are no-ops in sync streams. + pause() { } - return pwsh; - } - function chmodShim(to, opts) { - return opts.fs_.chmod(to, 493); - } - function normalizePathEnvVar(nodePath) { - if (!nodePath || !nodePath.length) { - return { - win32: "", - posix: "" - }; + resume() { } - let split = typeof nodePath === "string" ? nodePath.split(path10.delimiter) : Array.from(nodePath); - let result = {}; - for (let i = 0; i < split.length; i++) { - const win32 = split[i].split("/").join("\\"); - const posix = isWindows() ? split[i].split("\\").join("/").replace(/^([^:\\/]*):/, (_, $1) => `/mnt/${$1.toLowerCase()}`) : split[i]; - result.win32 = result.win32 ? `${result.win32};${win32}` : win32; - result.posix = result.posix ? `${result.posix}:${posix}` : posix; - result[i] = { win32, posix }; + [STAT](job) { + const stat = this.follow ? "statSync" : "lstatSync"; + this[ONSTAT](job, import_fs12.default[stat](job.absolute)); } - return result; - } - module2.exports = cmdShim2; + [READDIR](job) { + this[ONREADDIR](job, import_fs12.default.readdirSync(job.absolute)); + } + // gotta get it all in this tick + [PIPE](job) { + const source = job.entry; + const zip = this.zip; + if (job.readdir) { + job.readdir.forEach((entry) => { + const p = job.path; + const base = p === "./" ? "" : p.replace(/\/*$/, "/"); + this[ADDFSENTRY](base + entry); + }); + } + if (!source) + throw new Error("Cannot pipe without source"); + if (zip) { + source.on("data", (chunk) => { + zip.write(chunk); + }); + } else { + source.on("data", (chunk) => { + super[WRITE](chunk); + }); + } + } + }; + } +}); + +// .yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/create.js +var create_exports = {}; +__export(create_exports, { + create: () => create +}); +var import_node_path8, createFileSync, createFile, addFilesSync, addFilesAsync, createSync, createAsync, create; +var init_create = __esm({ + ".yarn/cache/tar-npm-7.5.6-955ec951c2-08af380703.zip/node_modules/tar/dist/esm/create.js"() { + init_esm2(); + import_node_path8 = __toESM(require("node:path"), 1); + init_list(); + init_make_command(); + init_pack(); + createFileSync = (opt, files) => { + const p = new PackSync(opt); + const stream = new WriteStreamSync(opt.file, { + mode: opt.mode || 438 + }); + p.pipe(stream); + addFilesSync(p, files); + }; + createFile = (opt, files) => { + const p = new Pack(opt); + const stream = new WriteStream(opt.file, { + mode: opt.mode || 438 + }); + p.pipe(stream); + const promise = new Promise((res, rej) => { + stream.on("error", rej); + stream.on("close", res); + p.on("error", rej); + }); + addFilesAsync(p, files); + return promise; + }; + addFilesSync = (p, files) => { + files.forEach((file) => { + if (file.charAt(0) === "@") { + list({ + file: import_node_path8.default.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: (entry) => p.add(entry) + }); + } else { + p.add(file); + } + }); + p.end(); + }; + addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === "@") { + await list({ + file: import_node_path8.default.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: (entry) => { + p.add(entry); + } + }); + } else { + p.add(file); + } + } + p.end(); + }; + createSync = (opt, files) => { + const p = new PackSync(opt); + addFilesSync(p, files); + return p; + }; + createAsync = (opt, files) => { + const p = new Pack(opt); + addFilesAsync(p, files); + return p; + }; + create = makeCommand(createFileSync, createFile, createSync, createAsync, (_opt, files) => { + if (!files?.length) { + throw new TypeError("no paths specified to add to archive"); + } + }); + } +}); + +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js +var require_major = __commonJS({ + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js"(exports2, module2) { + "use strict"; + var SemVer3 = require_semver(); + var major = (a, loose) => new SemVer3(a, loose).major; + module2.exports = major; } }); @@ -20933,7 +20047,7 @@ __export(lib_exports2, { }); module.exports = __toCommonJS(lib_exports2); -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/constants.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/constants.mjs var NODE_INITIAL = 0; var NODE_SUCCESS = 1; var NODE_ERRORED = 2; @@ -20946,7 +20060,7 @@ var BATCH_REGEX = /^-[a-zA-Z]{2,}$/; var BINDING_REGEX = /^([^=]+)=([\s\S]*)$/; var DEBUG = process.env.DEBUG_CLI === `1`; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/errors.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/errors.mjs var UsageError = class extends Error { constructor(message) { super(message); @@ -21015,7 +20129,7 @@ var whileRunning = (input) => `While running ${input.filter((token) => { } }).join(` `)}`; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/format.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/format.mjs var MAX_LINE_LENGTH = 80; var richLine = Array(MAX_LINE_LENGTH).fill(`\u2501`); for (let t = 0; t <= 24; ++t) @@ -21074,7 +20188,7 @@ function formatMarkdownish(text, { format, paragraphs }) { ` : ``; } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/utils.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/utils.mjs var isOptionSymbol = Symbol(`clipanion/isOption`); function makeCommandOption(spec) { return { ...spec, [isOptionSymbol]: true }; @@ -21092,10 +20206,10 @@ function cleanValidationError(message, { mergeName = false } = {}) { const match = message.match(/^([^:]+): (.*)$/m); if (!match) return `validation failed`; - let [, path10, line] = match; + let [, path16, line] = match; if (mergeName) line = line[0].toLowerCase() + line.slice(1); - line = path10 !== `.` || !mergeName ? `${path10.replace(/^\.(\[|$)/, `$1`)}: ${line}` : `: ${line}`; + line = path16 !== `.` || !mergeName ? `${path16.replace(/^\.(\[|$)/, `$1`)}: ${line}` : `: ${line}`; return line; } function formatError(message, errors) { @@ -21107,7 +20221,7 @@ ${errors.map((error) => ` - ${cleanValidationError(error)}`).join(``)}`); } } -function applyValidator(name, value, validator) { +function applyValidator(name2, value, validator) { if (typeof validator === `undefined`) return value; const errors = []; @@ -21119,13 +20233,13 @@ function applyValidator(name, value, validator) { }; const check = validator(value, { errors, coercions, coercion }); if (!check) - throw formatError(`Invalid value for ${name}`, errors); + throw formatError(`Invalid value for ${name2}`, errors); for (const [, op] of coercions) op(); return value; } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/Command.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/Command.mjs var Command = class { constructor() { this.help = false; @@ -21172,7 +20286,7 @@ var Command = class { Command.isOption = isOptionSymbol; Command.Default = []; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/core.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/core.mjs function debug(str) { if (DEBUG) { console.log(str); @@ -21447,7 +20561,7 @@ function selectBestState(input, states) { }); if (terminalStates.length === 0) throw new Error(); - const requiredOptionsSetStates = terminalStates.filter((state) => state.selectedIndex === HELP_COMMAND_INDEX || state.requiredOptions.every((names) => names.some((name) => state.options.find((opt) => opt.name === name)))); + const requiredOptionsSetStates = terminalStates.filter((state) => state.selectedIndex === HELP_COMMAND_INDEX || state.requiredOptions.every((names) => names.some((name2) => state.options.find((opt) => opt.name === name2)))); if (requiredOptionsSetStates.length === 0) { throw new UnknownSyntaxError(input, terminalStates.map((state) => ({ usage: state.candidateUsage, @@ -21546,8 +20660,8 @@ function registerStatic(machine, from, test, to, reducer) { } function execute(store, callback, state, segment) { if (Array.isArray(callback)) { - const [name, ...args] = callback; - return store[name](state, segment, ...args); + const [name2, ...args] = callback; + return store[name2](state, segment, ...args); } else { return store[callback](state, segment); } @@ -21569,18 +20683,18 @@ var tests = { isNotOptionLike: (state, segment) => { return state.ignoreOptions || segment === `-` || !segment.startsWith(`-`); }, - isOption: (state, segment, name, hidden) => { - return !state.ignoreOptions && segment === name; + isOption: (state, segment, name2, hidden) => { + return !state.ignoreOptions && segment === name2; }, isBatchOption: (state, segment, names) => { - return !state.ignoreOptions && BATCH_REGEX.test(segment) && [...segment.slice(1)].every((name) => names.includes(`-${name}`)); + return !state.ignoreOptions && BATCH_REGEX.test(segment) && [...segment.slice(1)].every((name2) => names.includes(`-${name2}`)); }, isBoundOption: (state, segment, names, options) => { const optionParsing = segment.match(BINDING_REGEX); return !state.ignoreOptions && !!optionParsing && OPTION_REGEX.test(optionParsing[1]) && names.includes(optionParsing[1]) && options.filter((opt) => opt.names.includes(optionParsing[1])).every((opt) => opt.allowBinding); }, - isNegatedOption: (state, segment, name) => { - return !state.ignoreOptions && segment === `--no-${name.slice(2)}`; + isNegatedOption: (state, segment, name2) => { + return !state.ignoreOptions && segment === `--no-${name2.slice(2)}`; }, isHelp: (state, segment) => { return !state.ignoreOptions && HELP_REGEX.test(segment); @@ -21592,8 +20706,8 @@ var tests = { return !state.ignoreOptions && segment.startsWith(`-`) && !OPTION_REGEX.test(segment); } }; -tests.isOption.suggest = (state, name, hidden = true) => { - return !hidden ? [name] : null; +tests.isOption.suggest = (state, name2, hidden = true) => { + return !hidden ? [name2] : null; }; var reducers = { setCandidateState: (state, segment, candidateState) => { @@ -21603,11 +20717,11 @@ var reducers = { return { ...state, selectedIndex: index }; }, pushBatch: (state, segment) => { - return { ...state, options: state.options.concat([...segment.slice(1)].map((name) => ({ name: `-${name}`, value: true }))) }; + return { ...state, options: state.options.concat([...segment.slice(1)].map((name2) => ({ name: `-${name2}`, value: true }))) }; }, pushBound: (state, segment) => { - const [, name, value] = segment.match(BINDING_REGEX); - return { ...state, options: state.options.concat({ name, value }) }; + const [, name2, value] = segment.match(BINDING_REGEX); + return { ...state, options: state.options.concat({ name: name2, value }) }; }, pushPath: (state, segment) => { return { ...state, path: state.path.concat(segment) }; @@ -21621,11 +20735,11 @@ var reducers = { pushExtraNoLimits: (state, segment) => { return { ...state, positionals: state.positionals.concat({ value: segment, extra: NoLimits }) }; }, - pushTrue: (state, segment, name = segment) => { + pushTrue: (state, segment, name2 = segment) => { return { ...state, options: state.options.concat({ name: segment, value: true }) }; }, - pushFalse: (state, segment, name = segment) => { - return { ...state, options: state.options.concat({ name, value: false }) }; + pushFalse: (state, segment, name2 = segment) => { + return { ...state, options: state.options.concat({ name: name2, value: false }) }; }, pushUndefined: (state, segment) => { return { ...state, options: state.options.concat({ name: segment, value: void 0 }) }; @@ -21681,32 +20795,32 @@ var CommandBuilder = class { this.cliIndex = cliIndex; this.cliOpts = cliOpts; } - addPath(path10) { - this.paths.push(path10); + addPath(path16) { + this.paths.push(path16); } setArity({ leading = this.arity.leading, trailing = this.arity.trailing, extra = this.arity.extra, proxy = this.arity.proxy }) { Object.assign(this.arity, { leading, trailing, extra, proxy }); } - addPositional({ name = `arg`, required = true } = {}) { + addPositional({ name: name2 = `arg`, required = true } = {}) { if (!required && this.arity.extra === NoLimits) throw new Error(`Optional parameters cannot be declared when using .rest() or .proxy()`); if (!required && this.arity.trailing.length > 0) throw new Error(`Optional parameters cannot be declared after the required trailing positional arguments`); if (!required && this.arity.extra !== NoLimits) { - this.arity.extra.push(name); + this.arity.extra.push(name2); } else if (this.arity.extra !== NoLimits && this.arity.extra.length === 0) { - this.arity.leading.push(name); + this.arity.leading.push(name2); } else { - this.arity.trailing.push(name); + this.arity.trailing.push(name2); } } - addRest({ name = `arg`, required = 0 } = {}) { + addRest({ name: name2 = `arg`, required = 0 } = {}) { if (this.arity.extra === NoLimits) throw new Error(`Infinite lists cannot be declared multiple times in the same command`); if (this.arity.trailing.length > 0) throw new Error(`Infinite lists cannot be declared after the required trailing positional arguments`); for (let t = 0; t < required; ++t) - this.addPositional({ name }); + this.addPositional({ name: name2 }); this.arity.extra = NoLimits; } addProxy({ required = 0 } = {}) { @@ -21745,12 +20859,12 @@ var CommandBuilder = class { segments.push(required ? `<${definition}>` : `[${definition}]`); } } - segments.push(...this.arity.leading.map((name) => `<${name}>`)); + segments.push(...this.arity.leading.map((name2) => `<${name2}>`)); if (this.arity.extra === NoLimits) segments.push(`...`); else - segments.push(...this.arity.extra.map((name) => `[${name}]`)); - segments.push(...this.arity.trailing.map((name) => `<${name}>`)); + segments.push(...this.arity.extra.map((name2) => `[${name2}]`)); + segments.push(...this.arity.trailing.map((name2) => `<${name2}>`)); } const usage = segments.join(` `); return { usage, options: detailedOptionList }; @@ -21766,17 +20880,17 @@ var CommandBuilder = class { registerStatic(machine, NODE_INITIAL, START_OF_INPUT, firstNode, [`setCandidateState`, { candidateUsage, requiredOptions }]); const positionalArgument = this.arity.proxy ? `always` : `isNotOptionLike`; const paths = this.paths.length > 0 ? this.paths : [[]]; - for (const path10 of paths) { + for (const path16 of paths) { let lastPathNode = firstNode; - if (path10.length > 0) { + if (path16.length > 0) { const optionPathNode = injectNode(machine, makeNode()); registerShortcut(machine, lastPathNode, optionPathNode); this.registerOptions(machine, optionPathNode); lastPathNode = optionPathNode; } - for (let t = 0; t < path10.length; ++t) { + for (let t = 0; t < path16.length; ++t) { const nextPathNode = injectNode(machine, makeNode()); - registerStatic(machine, lastPathNode, path10[t], nextPathNode, `pushPath`); + registerStatic(machine, lastPathNode, path16[t], nextPathNode, `pushPath`); lastPathNode = nextPathNode; } if (this.arity.leading.length > 0 || !this.arity.proxy) { @@ -21848,20 +20962,20 @@ var CommandBuilder = class { registerDynamic(machine, node, [`isUnsupportedOption`, this.allOptionNames], NODE_ERRORED, [`setError`, `Unsupported option name`]); registerDynamic(machine, node, [`isInvalidOption`], NODE_ERRORED, [`setError`, `Invalid option name`]); for (const option of this.options) { - const longestName = option.names.reduce((longestName2, name) => { - return name.length > longestName2.length ? name : longestName2; + const longestName = option.names.reduce((longestName2, name2) => { + return name2.length > longestName2.length ? name2 : longestName2; }, ``); if (option.arity === 0) { - for (const name of option.names) { - registerDynamic(machine, node, [`isOption`, name, option.hidden || name !== longestName], node, `pushTrue`); - if (name.startsWith(`--`) && !name.startsWith(`--no-`)) { - registerDynamic(machine, node, [`isNegatedOption`, name], node, [`pushFalse`, name]); + for (const name2 of option.names) { + registerDynamic(machine, node, [`isOption`, name2, option.hidden || name2 !== longestName], node, `pushTrue`); + if (name2.startsWith(`--`) && !name2.startsWith(`--no-`)) { + registerDynamic(machine, node, [`isNegatedOption`, name2], node, [`pushFalse`, name2]); } } } else { let lastNode = injectNode(machine, makeNode()); - for (const name of option.names) - registerDynamic(machine, node, [`isOption`, name, option.hidden || name !== longestName], lastNode, `pushUndefined`); + for (const name2 of option.names) + registerDynamic(machine, node, [`isOption`, name2, option.hidden || name2 !== longestName], lastNode, `pushUndefined`); for (let t = 0; t < option.arity; ++t) { const nextNode = injectNode(machine, makeNode()); registerStatic(machine, lastNode, END_OF_INPUT, NODE_ERRORED, `setOptionArityError`); @@ -21921,48 +21035,10 @@ var CliBuilder = class _CliBuilder { } }; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/platform/node.mjs -var import_tty = __toESM(require("tty"), 1); -function getDefaultColorDepth() { - if (import_tty.default && `getColorDepth` in import_tty.default.WriteStream.prototype) - return import_tty.default.WriteStream.prototype.getColorDepth(); - if (process.env.FORCE_COLOR === `0`) - return 1; - if (process.env.FORCE_COLOR === `1`) - return 8; - if (typeof process.stdout !== `undefined` && process.stdout.isTTY) - return 8; - return 1; -} -var gContextStorage; -function getCaptureActivator(context) { - let contextStorage = gContextStorage; - if (typeof contextStorage === `undefined`) { - if (context.stdout === process.stdout && context.stderr === process.stderr) - return null; - const { AsyncLocalStorage: LazyAsyncLocalStorage } = require("async_hooks"); - contextStorage = gContextStorage = new LazyAsyncLocalStorage(); - const origStdoutWrite = process.stdout._write; - process.stdout._write = function(chunk, encoding, cb) { - const context2 = contextStorage.getStore(); - if (typeof context2 === `undefined`) - return origStdoutWrite.call(this, chunk, encoding, cb); - return context2.stdout.write(chunk, encoding, cb); - }; - const origStderrWrite = process.stderr._write; - process.stderr._write = function(chunk, encoding, cb) { - const context2 = contextStorage.getStore(); - if (typeof context2 === `undefined`) - return origStderrWrite.call(this, chunk, encoding, cb); - return context2.stderr.write(chunk, encoding, cb); - }; - } - return (fn2) => { - return contextStorage.run(context, fn2); - }; -} +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/Cli.mjs +var import_platform = __toESM(require_node(), 1); -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/HelpCommand.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/HelpCommand.mjs var HelpCommand = class _HelpCommand extends Command { constructor(contexts) { super(); @@ -22012,7 +21088,7 @@ var HelpCommand = class _HelpCommand extends Command { } }; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/Cli.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/Cli.mjs var errorCommandSymbol = Symbol(`clipanion/errorCommand`); var Cli = class _Cli { constructor({ binaryLabel, binaryName: binaryNameOpt = `...`, binaryVersion, enableCapture = false, enableColors } = {}) { @@ -22054,8 +21130,8 @@ var Cli = class _Cli { const index = builder.cliIndex; const paths = (_a = commandClass.paths) !== null && _a !== void 0 ? _a : command.paths; if (typeof paths !== `undefined`) - for (const path10 of paths) - builder.addPath(path10); + for (const path16 of paths) + builder.addPath(path16); this.registrations.set(commandClass, { specs, builder, index }); for (const [key, { definition }] of specs.entries()) definition(builder, key); @@ -22133,7 +21209,7 @@ var Cli = class _Cli { run: (input2, subContext) => this.run(input2, { ...context, ...subContext }), usage: (command2, opts) => this.usage(command2, opts) }; - const activate = this.enableCapture ? (_b = getCaptureActivator(context)) !== null && _b !== void 0 ? _b : noopCaptureActivator : noopCaptureActivator; + const activate = this.enableCapture ? (_b = (0, import_platform.getCaptureActivator)(context)) !== null && _b !== void 0 ? _b : noopCaptureActivator : noopCaptureActivator; let exitCode; try { exitCode = await activate(() => command.validateAndExecute().catch((error) => command.catch(error).then(() => 0))); @@ -22155,13 +21231,13 @@ var Cli = class _Cli { for (const [commandClass, { index }] of this.registrations) { if (typeof commandClass.usage === `undefined`) continue; - const { usage: path10 } = this.getUsageByIndex(index, { detailed: false }); + const { usage: path16 } = this.getUsageByIndex(index, { detailed: false }); const { usage, options } = this.getUsageByIndex(index, { detailed: true, inlineOptions: false }); const category = typeof commandClass.usage.category !== `undefined` ? formatMarkdownish(commandClass.usage.category, { format: this.format(colored), paragraphs: false }) : void 0; const description = typeof commandClass.usage.description !== `undefined` ? formatMarkdownish(commandClass.usage.description, { format: this.format(colored), paragraphs: false }) : void 0; const details = typeof commandClass.usage.details !== `undefined` ? formatMarkdownish(commandClass.usage.details, { format: this.format(colored), paragraphs: true }) : void 0; const examples = typeof commandClass.usage.examples !== `undefined` ? commandClass.usage.examples.map(([label, cli]) => [formatMarkdownish(label, { format: this.format(colored), paragraphs: false }), cli.replace(/\$0/g, this.binaryName)]) : void 0; - data.push({ path: path10, usage, category, description, details, examples, options }); + data.push({ path: path16, usage, category, description, details, examples, options }); } return data; } @@ -22172,7 +21248,7 @@ var Cli = class _Cli { const paths = commandClass2.paths; const isDocumented = typeof commandClass2.usage !== `undefined`; const isExclusivelyDefault = !paths || paths.length === 0 || paths.length === 1 && paths[0].length === 0; - const isDefault = isExclusivelyDefault || ((_a = paths === null || paths === void 0 ? void 0 : paths.some((path10) => path10.length === 0)) !== null && _a !== void 0 ? _a : false); + const isDefault = isExclusivelyDefault || ((_a = paths === null || paths === void 0 ? void 0 : paths.some((path16) => path16.length === 0)) !== null && _a !== void 0 ? _a : false); if (isDefault) { if (command) { command = null; @@ -22319,10 +21395,10 @@ var Cli = class _Cli { if (!error || typeof error !== `object` || !(`stack` in error)) error = new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(error)})`); let result = ``; - let name = error.name.replace(/([a-z])([A-Z])/g, `$1 $2`); - if (name === `Error`) - name = `Internal Error`; - result += `${this.format(colored).error(name)}: ${error.message} + let name2 = error.name.replace(/([a-z])([A-Z])/g, `$1 $2`); + if (name2 === `Error`) + name2 = `Internal Error`; + result += `${this.format(colored).error(name2)}: ${error.message} `; const meta = error.clipanion; if (typeof meta !== `undefined`) { @@ -22358,13 +21434,13 @@ Cli.defaultContext = { stdin: process.stdin, stdout: process.stdout, stderr: process.stderr, - colorDepth: getDefaultColorDepth() + colorDepth: (0, import_platform.getDefaultColorDepth)() }; function noopCaptureActivator(fn2) { return fn2(); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/builtins/index.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/builtins/index.mjs var builtins_exports = {}; __export(builtins_exports, { DefinitionsCommand: () => DefinitionsCommand, @@ -22372,7 +21448,7 @@ __export(builtins_exports, { VersionCommand: () => VersionCommand }); -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/builtins/definitions.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/builtins/definitions.mjs var DefinitionsCommand = class extends Command { async execute() { this.context.stdout.write(`${JSON.stringify(this.cli.definitions(), null, 2)} @@ -22381,7 +21457,7 @@ var DefinitionsCommand = class extends Command { }; DefinitionsCommand.paths = [[`--clipanion=definitions`]]; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/builtins/help.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/builtins/help.mjs var HelpCommand2 = class extends Command { async execute() { this.context.stdout.write(this.cli.usage()); @@ -22389,7 +21465,7 @@ var HelpCommand2 = class extends Command { }; HelpCommand2.paths = [[`-h`], [`--help`]]; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/builtins/version.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/builtins/version.mjs var VersionCommand = class extends Command { async execute() { var _a; @@ -22399,7 +21475,7 @@ var VersionCommand = class extends Command { }; VersionCommand.paths = [[`-v`], [`--version`]]; -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/index.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/index.mjs var options_exports = {}; __export(options_exports, { Array: () => Array2, @@ -22416,7 +21492,7 @@ __export(options_exports, { rerouteArguments: () => rerouteArguments }); -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/Array.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/Array.mjs function Array2(descriptor, initialValueBase, optsBase) { const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== void 0 ? optsBase : {}); const { arity = 1 } = opts; @@ -22435,10 +21511,10 @@ function Array2(descriptor, initialValueBase, optsBase) { transformer(builder, key, state) { let usedName; let currentValue = typeof initialValue !== `undefined` ? [...initialValue] : void 0; - for (const { name, value } of state.options) { - if (!nameSet.has(name)) + for (const { name: name2, value } of state.options) { + if (!nameSet.has(name2)) continue; - usedName = name; + usedName = name2; currentValue = currentValue !== null && currentValue !== void 0 ? currentValue : []; currentValue.push(value); } @@ -22451,7 +21527,7 @@ function Array2(descriptor, initialValueBase, optsBase) { }); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/Boolean.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/Boolean.mjs function Boolean2(descriptor, initialValueBase, optsBase) { const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== void 0 ? optsBase : {}); const optNames = descriptor.split(`,`); @@ -22469,8 +21545,8 @@ function Boolean2(descriptor, initialValueBase, optsBase) { }, transformer(builer, key, state) { let currentValue = initialValue; - for (const { name, value } of state.options) { - if (!nameSet.has(name)) + for (const { name: name2, value } of state.options) { + if (!nameSet.has(name2)) continue; currentValue = value; } @@ -22479,7 +21555,7 @@ function Boolean2(descriptor, initialValueBase, optsBase) { }); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/Counter.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/Counter.mjs function Counter(descriptor, initialValueBase, optsBase) { const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== void 0 ? optsBase : {}); const optNames = descriptor.split(`,`); @@ -22497,8 +21573,8 @@ function Counter(descriptor, initialValueBase, optsBase) { }, transformer(builder, key, state) { let currentValue = initialValue; - for (const { name, value } of state.options) { - if (!nameSet.has(name)) + for (const { name: name2, value } of state.options) { + if (!nameSet.has(name2)) continue; currentValue !== null && currentValue !== void 0 ? currentValue : currentValue = 0; if (!value) { @@ -22512,7 +21588,7 @@ function Counter(descriptor, initialValueBase, optsBase) { }); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/Proxy.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/Proxy.mjs function Proxy2(opts = {}) { return makeCommandOption({ definition(builder, key) { @@ -22528,7 +21604,7 @@ function Proxy2(opts = {}) { }); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/Rest.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/Rest.mjs function Rest(opts = {}) { return makeCommandOption({ definition(builder, key) { @@ -22555,7 +21631,7 @@ function Rest(opts = {}) { }); } -// .yarn/__virtual__/clipanion-virtual-48805df892/0/cache/clipanion-npm-3.2.1-fc9187f56c-6c148bd01a.zip/node_modules/clipanion/lib/advanced/options/String.mjs +// .yarn/__virtual__/clipanion-virtual-dbbb3cfe27/0/cache/clipanion-patch-1b1b878e9f-a833a30963.zip/node_modules/clipanion/lib/advanced/options/String.mjs function StringOption(descriptor, initialValueBase, optsBase) { const [initialValue, opts] = rerouteArguments(initialValueBase, optsBase !== null && optsBase !== void 0 ? optsBase : {}); const { arity = 1 } = opts; @@ -22578,10 +21654,10 @@ function StringOption(descriptor, initialValueBase, optsBase) { usedName = opts.env; currentValue = context.env[opts.env]; } - for (const { name, value } of state.options) { - if (!nameSet.has(name)) + for (const { name: name2, value } of state.options) { + if (!nameSet.has(name2)) continue; - usedName = name; + usedName = name2; currentValue = value; } if (typeof currentValue === `string`) { @@ -22627,19 +21703,21 @@ function String2(descriptor, ...args) { } // package.json -var version = "0.26.0"; +var version = "0.34.6"; // sources/Engine.ts -var import_fs4 = __toESM(require("fs")); -var import_path4 = __toESM(require("path")); +var import_fs6 = __toESM(require("fs")); +var import_path5 = __toESM(require("path")); var import_process3 = __toESM(require("process")); -var import_semver4 = __toESM(require_semver2()); +var import_rcompare = __toESM(require_rcompare()); +var import_valid3 = __toESM(require_valid()); +var import_valid4 = __toESM(require_valid2()); // config.json var config_default = { definitions: { npm: { - default: "10.5.0+sha1.726f91df5b1b14d9637c8819d7e71cb873c395a1", + default: "11.8.0+sha1.d1bc924deb3b4d412055b1755098a70bf8a4713b", fetchLatestFrom: { type: "npm", package: "npm" @@ -22676,7 +21754,7 @@ var config_default = { } }, pnpm: { - default: "8.15.4+sha1.c85a4305534f76d461407b59277b954bac97b5c4", + default: "10.28.1+sha1.20817ab95fb7f61154ba5ff3bcb61f27defb6142", fetchLatestFrom: { type: "npm", package: "pnpm" @@ -22714,7 +21792,7 @@ var config_default = { ] } }, - ">=6.0.0": { + "6.x || 7.x || 8.x || 9.x || 10.x": { url: "https://registry.npmjs.org/pnpm/-/pnpm-{}.tgz", bin: { pnpm: "./bin/pnpm.cjs", @@ -22730,17 +21808,34 @@ var config_default = { "install" ] } + }, + ">=11.0.0": { + url: "https://registry.npmjs.org/pnpm/-/pnpm-{}.tgz", + bin: { + pnpm: "./bin/pnpm.mjs", + pnpx: "./bin/pnpx.mjs" + }, + registry: { + type: "npm", + package: "pnpm" + }, + commands: { + use: [ + "pnpm", + "install" + ] + } } } }, yarn: { - default: "1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72", + default: "1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610", fetchLatestFrom: { type: "npm", package: "yarn" }, transparent: { - default: "4.1.1+sha224.00f08619463229f8ba40c4ee90e8c2e4ced1f11c3115c26f3b98432e", + default: "4.12.0+sha224.877304a94a6946ab1d58a358df5ff8af2f7c9d86ea506f05f5c9df05", commands: [ [ "yarn", @@ -22787,7 +21882,8 @@ var config_default = { }, npmRegistry: { type: "npm", - package: "@yarnpkg/cli-dist" + package: "@yarnpkg/cli-dist", + bin: "bin/yarn.js" }, commands: { use: [ @@ -22798,16 +21894,37 @@ var config_default = { } } } + }, + keys: { + npm: [ + { + expires: "2025-01-29T00:00:00.000Z", + keyid: "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + keytype: "ecdsa-sha2-nistp256", + scheme: "ecdsa-sha2-nistp256", + key: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1Olb3zMAFFxXKHiIkQO5cJ3Yhl5i6UPp+IhuteBJbuHcA5UogKo0EWtlWwW6KSaKoTNEYL7JlCQiVnkhBktUgg==" + }, + { + expires: null, + keyid: "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U", + keytype: "ecdsa-sha2-nistp256", + scheme: "ecdsa-sha2-nistp256", + key: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEY6Ya7W++7aUPzvMTrezH6Ycx3c+HOKYCcNGybJZSCJq/fd7Qa8uuAKtdIkUQtQiEKERhAmE5lMMJhP8OkDOa2g==" + } + ] } }; // sources/corepackUtils.ts -var import_crypto = require("crypto"); -var import_events2 = require("events"); -var import_fs2 = __toESM(require("fs")); +var import_crypto2 = require("crypto"); +var import_events4 = require("events"); +var import_fs4 = __toESM(require("fs")); var import_module = __toESM(require("module")); -var import_path2 = __toESM(require("path")); -var import_semver = __toESM(require_semver2()); +var import_path3 = __toESM(require("path")); +var import_range = __toESM(require_range()); +var import_semver = __toESM(require_semver()); +var import_lt = __toESM(require_lt()); +var import_parse3 = __toESM(require_parse()); var import_promises2 = require("timers/promises"); // sources/debugUtils.ts @@ -22837,10 +21954,10 @@ function getTemporaryFolder(target = (0, import_os.tmpdir)()) { while (true) { const rnd = Math.random() * 4294967296; const hex = rnd.toString(16).padStart(8, `0`); - const path10 = (0, import_path.join)(target, `corepack-${import_process.default.pid}-${hex}`); + const path16 = (0, import_path.join)(target, `corepack-${import_process.default.pid}-${hex}`); try { - (0, import_fs.mkdirSync)(path10); - return path10; + (0, import_fs.mkdirSync)(path16); + return path16; } catch (error) { if (error.code === `EEXIST`) { continue; @@ -22853,26 +21970,120 @@ function getTemporaryFolder(target = (0, import_os.tmpdir)()) { } } -// sources/fsUtils.ts -var import_promises = require("fs/promises"); -async function rimraf(path10) { - return (0, import_promises.rm)(path10, { recursive: true, force: true }); -} - // sources/httpUtils.ts var import_assert = __toESM(require("assert")); var import_events = require("events"); var import_process2 = require("process"); var import_stream = require("stream"); + +// sources/npmRegistryUtils.ts +var import_crypto = require("crypto"); +var DEFAULT_HEADERS = { + [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` +}; +var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; +async function fetchAsJson2(packageName, version2) { + const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; + if (process.env.COREPACK_ENABLE_NETWORK === `0`) + throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); + const headers = { ...DEFAULT_HEADERS }; + if (`COREPACK_NPM_TOKEN` in process.env) { + headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`; + } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) { + const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); + headers.authorization = `Basic ${encodedCreds}`; + } + return fetchAsJson(`${npmRegistryUrl}/${packageName}${version2 ? `/${version2}` : ``}`, { headers }); +} +function verifySignature({ signatures, integrity, packageName, version: version2 }) { + if (!Array.isArray(signatures) || !signatures.length) throw new Error(`No compatible signature found in package metadata`); + const { npm: trustedKeys } = process.env.COREPACK_INTEGRITY_KEYS ? JSON.parse(process.env.COREPACK_INTEGRITY_KEYS) : config_default.keys; + let signature; + let key; + for (const k of trustedKeys) { + signature = signatures.find(({ keyid }) => keyid === k.keyid); + if (signature != null) { + key = k.key; + break; + } + } + if (signature?.sig == null) throw new UsageError(`The package was not signed by any trusted keys: ${JSON.stringify({ signatures, trustedKeys }, void 0, 2)}`); + const verifier = (0, import_crypto.createVerify)(`SHA256`); + verifier.end(`${packageName}@${version2}:${integrity}`); + const valid = verifier.verify( + `-----BEGIN PUBLIC KEY----- +${key} +-----END PUBLIC KEY-----`, + signature.sig, + `base64` + ); + if (!valid) { + throw new Error(`Signature does not match`); + } +} +async function fetchLatestStableVersion(packageName) { + const metadata = await fetchAsJson2(packageName, `latest`); + const { version: version2, dist: { integrity, signatures, shasum } } = metadata; + if (!shouldSkipIntegrityCheck()) { + try { + verifySignature({ + packageName, + version: version2, + integrity, + signatures + }); + } catch (cause) { + throw new Error(`Corepack cannot download the latest stable version of ${packageName}; you can disable signature verification by setting COREPACK_INTEGRITY_CHECK to 0 in your env, or instruct Corepack to use the latest stable release known by this version of Corepack by setting COREPACK_USE_LATEST to 0`, { cause }); + } + } + return `${version2}+${integrity ? `sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}` : `sha1.${shasum}`}`; +} +async function fetchAvailableTags(packageName) { + const metadata = await fetchAsJson2(packageName); + return metadata[`dist-tags`]; +} +async function fetchAvailableVersions(packageName) { + const metadata = await fetchAsJson2(packageName); + return Object.keys(metadata.versions); +} +async function fetchTarballURLAndSignature(packageName, version2) { + const versionMetadata = await fetchAsJson2(packageName, version2); + const { tarball, signatures, integrity } = versionMetadata.dist; + if (tarball === void 0 || !tarball.startsWith(`http`)) + throw new Error(`${packageName}@${version2} does not have a valid tarball.`); + return { tarball, signatures, integrity }; +} + +// sources/httpUtils.ts async function fetch(input, init) { if (process.env.COREPACK_ENABLE_NETWORK === `0`) throw new UsageError(`Network access disabled by the environment; can't reach ${input}`); const agent = await getProxyAgent(input); + if (typeof input === `string`) + input = new URL(input); + let headers = init?.headers; + const username = input.username || process.env.COREPACK_NPM_USERNAME; + const password = input.password || process.env.COREPACK_NPM_PASSWORD; + if (username || password) { + headers = { + ...headers, + authorization: `Basic ${Buffer.from(`${username}:${password}`).toString(`base64`)}` + }; + input.username = input.password = ``; + } + const registry = process.env.COREPACK_NPM_TOKEN && new URL(process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL); + if (registry && input.origin === registry.origin) { + headers = { + ...headers, + authorization: `Bearer ${process.env.COREPACK_NPM_TOKEN}` + }; + } let response; try { response = await globalThis.fetch(input, { ...init, - dispatcher: agent + dispatcher: agent, + headers }); } catch (error) { throw new Error( @@ -22907,65 +22118,79 @@ async function fetchUrlStream(input, init) { } const response = await fetch(input, init); const webStream = response.body; - (0, import_assert.default)(webStream, `Expected stream to be set`); - const stream = import_stream.Readable.fromWeb(webStream); - return stream; -} -async function getProxyAgent(input) { - const { getProxyForUrl } = await Promise.resolve().then(() => __toESM(require_proxy_from_env())); - const proxy = getProxyForUrl(input); - if (!proxy) - return void 0; - const { default: ProxyAgent } = await Promise.resolve().then(() => __toESM(require_proxy_agent())); - return new ProxyAgent(proxy); -} - -// sources/npmRegistryUtils.ts -var DEFAULT_HEADERS = { - [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` -}; -var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; -async function fetchAsJson2(packageName) { - const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; - if (process.env.COREPACK_ENABLE_NETWORK === `0`) - throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); - const headers = { ...DEFAULT_HEADERS }; - if (`COREPACK_NPM_TOKEN` in process.env) { - headers.authorization = `Bearer ${process.env.COREPACK_NPM_TOKEN}`; - } else if (`COREPACK_NPM_USERNAME` in process.env && `COREPACK_NPM_PASSWORD` in process.env) { - const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); - headers.authorization = `Basic ${encodedCreds}`; + (0, import_assert.default)(webStream, `Expected stream to be set`); + const stream = import_stream.Readable.fromWeb(webStream); + return stream; +} +var ProxyAgent; +async function getProxyAgent(input) { + const { getProxyForUrl } = await Promise.resolve().then(() => __toESM(require_proxy_from_env())); + const proxy = getProxyForUrl(input); + if (!proxy) return void 0; + if (ProxyAgent == null) { + const [api, Dispatcher, _ProxyAgent] = await Promise.all([ + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_api())), + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_dispatcher())), + // @ts-expect-error internal module is untyped + Promise.resolve().then(() => __toESM(require_proxy_agent())) + ]); + Object.assign(Dispatcher.default.prototype, api.default); + ProxyAgent = _ProxyAgent.default; } - return fetchAsJson(`${npmRegistryUrl}/${packageName}`, { headers }); + return new ProxyAgent(proxy); } -async function fetchLatestStableVersion(packageName) { - const metadata = await fetchAsJson2(packageName); - const { latest } = metadata[`dist-tags`]; - if (latest === void 0) - throw new Error(`${packageName} does not have a "latest" tag.`); - const { shasum } = metadata.versions[latest].dist; - return `${latest}+sha1.${shasum}`; + +// sources/nodeUtils.ts +var import_os2 = __toESM(require("os")); +function isNodeError(err) { + return !!err?.code; } -async function fetchAvailableTags(packageName) { - const metadata = await fetchAsJson2(packageName); - return metadata[`dist-tags`]; +function isExistError(err) { + return err.code === `EEXIST` || err.code === `ENOTEMPTY`; } -async function fetchAvailableVersions(packageName) { - const metadata = await fetchAsJson2(packageName); - return Object.keys(metadata.versions); +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return import_os2.default.EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; } -async function fetchTarballUrl(packageName, version2) { - const metadata = await fetchAsJson2(packageName); - const versionMetadata = metadata.versions?.[version2]; - if (versionMetadata === void 0) - throw new Error(`${packageName}@${version2} does not exist.`); - const { tarball } = versionMetadata.dist; - if (tarball === void 0 || !tarball.startsWith(`http`)) - throw new Error(`${packageName}@${version2} does not have a valid tarball.`); - return tarball; +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} +function getIndent(content) { + const indentMatch = content.match(/^[ \t]+/m); + if (indentMatch) { + return indentMatch[0]; + } else { + return ` `; + } +} +function stripBOM(content) { + if (content.charCodeAt(0) === 65279) { + return content.slice(1); + } else { + return content; + } +} +function readPackageJson(content) { + return { + data: JSON.parse(stripBOM(content) || `{}`), + indent: getIndent(content) + }; } // sources/corepackUtils.ts +var YARN_SWITCH_REGEX = /[/\\]switch[/\\]bin[/\\]/; +function isYarnSwitchPath(p) { + return YARN_SWITCH_REGEX.test(p); +} function getRegistryFromPackageManagerSpec(spec) { return process.env.COREPACK_NPM_REGISTRY ? spec.npmRegistry ?? spec.registry : spec.registry; } @@ -23013,26 +22238,26 @@ async function fetchAvailableVersions2(spec) { } } async function findInstalledVersion(installTarget, descriptor) { - const installFolder = import_path2.default.join(installTarget, descriptor.name); + const installFolder = import_path3.default.join(installTarget, descriptor.name); let cacheDirectory; try { - cacheDirectory = await import_fs2.default.promises.opendir(installFolder); + cacheDirectory = await import_fs4.default.promises.opendir(installFolder); } catch (error) { - if (error.code === `ENOENT`) { + if (isNodeError(error) && error.code === `ENOENT`) { return null; } else { throw error; } } - const range = new import_semver.default.Range(descriptor.range); + const range = new import_range.default(descriptor.range); let bestMatch = null; let maxSV = void 0; - for await (const { name } of cacheDirectory) { - if (name.startsWith(`.`)) + for await (const { name: name2 } of cacheDirectory) { + if (name2.startsWith(`.`)) continue; - if (range.test(name) && maxSV?.compare(name) !== 1) { - bestMatch = name; - maxSV = new import_semver.default.SemVer(bestMatch); + if (range.test(name2) && maxSV?.compare(name2) !== 1) { + bestMatch = name2; + maxSV = new import_semver.default(bestMatch); } } return bestMatch; @@ -23059,61 +22284,106 @@ function isValidBinList(x) { function isValidBinSpec(x) { return typeof x === `object` && x !== null && !Array.isArray(x) && Object.keys(x).length > 0; } +async function download(installTarget, url, algo, binPath = null) { + const tmpFolder = getTemporaryFolder(installTarget); + log(`Downloading to ${tmpFolder}`); + const stream = await fetchUrlStream(url); + const parsedUrl = new URL(url); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); + let outputFile = null; + let sendTo; + if (ext === `.tgz`) { + const { extract: tarX } = await Promise.resolve().then(() => (init_extract(), extract_exports)); + sendTo = tarX({ + strip: 1, + cwd: tmpFolder, + filter: binPath ? (path16) => { + const pos2 = path16.indexOf(`/`); + return pos2 !== -1 && path16.slice(pos2 + 1) === binPath; + } : void 0 + }); + } else if (ext === `.js`) { + outputFile = import_path3.default.join(tmpFolder, import_path3.default.posix.basename(parsedUrl.pathname)); + sendTo = import_fs4.default.createWriteStream(outputFile); + } + stream.pipe(sendTo); + let hash = !binPath ? stream.pipe((0, import_crypto2.createHash)(algo)) : null; + await (0, import_events4.once)(sendTo, `finish`); + if (binPath) { + const downloadedBin = import_path3.default.join(tmpFolder, binPath); + outputFile = import_path3.default.join(tmpFolder, import_path3.default.basename(downloadedBin)); + try { + await renameSafe(downloadedBin, outputFile); + } catch (err) { + if (isNodeError(err) && err.code === `ENOENT`) + throw new Error(`Cannot locate '${binPath}' in downloaded tarball`, { cause: err }); + if (isNodeError(err) && isExistError(err)) { + await import_fs4.default.promises.rm(downloadedBin); + } else { + throw err; + } + } + const fileStream = import_fs4.default.createReadStream(outputFile); + hash = fileStream.pipe((0, import_crypto2.createHash)(algo)); + await (0, import_events4.once)(fileStream, `close`); + } + return { + tmpFolder, + outputFile, + hash: hash.digest(`hex`) + }; +} async function installVersion(installTarget, locator, { spec }) { const locatorIsASupportedPackageManager = isSupportedPackageManagerLocator(locator); - const locatorReference = locatorIsASupportedPackageManager ? import_semver.default.parse(locator.reference) : parseURLReference(locator); + const locatorReference = locatorIsASupportedPackageManager ? (0, import_parse3.default)(locator.reference) : parseURLReference(locator); const { version: version2, build } = locatorReference; - const installFolder = import_path2.default.join(installTarget, locator.name, version2); + const installFolder = import_path3.default.join(installTarget, locator.name, version2); try { - const corepackFile = import_path2.default.join(installFolder, `.corepack`); - const corepackContent = await import_fs2.default.promises.readFile(corepackFile, `utf8`); + const corepackFile = import_path3.default.join(installFolder, `.corepack`); + const corepackContent = await import_fs4.default.promises.readFile(corepackFile, `utf8`); const corepackData = JSON.parse(corepackContent); - log(`Reusing ${locator.name}@${locator.reference}`); + log(`Reusing ${locator.name}@${locator.reference} found in ${installFolder}`); return { hash: corepackData.hash, location: installFolder, bin: corepackData.bin }; } catch (err) { - if (err?.code !== `ENOENT`) { + if (isNodeError(err) && err.code !== `ENOENT`) { throw err; } } let url; + let signatures; + let integrity; + let binPath = null; if (locatorIsASupportedPackageManager) { url = spec.url.replace(`{}`, version2); if (process.env.COREPACK_NPM_REGISTRY) { const registry = getRegistryFromPackageManagerSpec(spec); if (registry.type === `npm`) { - url = await fetchTarballUrl(registry.package, version2); - } else { - url = url.replace( - DEFAULT_NPM_REGISTRY_URL, - () => process.env.COREPACK_NPM_REGISTRY - ); + ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + if (registry.bin) { + binPath = registry.bin; + } } + url = url.replace( + DEFAULT_NPM_REGISTRY_URL, + () => process.env.COREPACK_NPM_REGISTRY + ); } } else { url = decodeURIComponent(version2); + if (process.env.COREPACK_NPM_REGISTRY && url.startsWith(DEFAULT_NPM_REGISTRY_URL)) { + url = url.replace( + DEFAULT_NPM_REGISTRY_URL, + () => process.env.COREPACK_NPM_REGISTRY + ); + } } - const tmpFolder = getTemporaryFolder(installTarget); - log(`Installing ${locator.name}@${version2} from ${url} to ${tmpFolder}`); - const stream = await fetchUrlStream(url); - const parsedUrl = new URL(url); - const ext = import_path2.default.posix.extname(parsedUrl.pathname); - let outputFile = null; - let sendTo; - if (ext === `.tgz`) { - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); - sendTo = tar.x({ strip: 1, cwd: tmpFolder }); - } else if (ext === `.js`) { - outputFile = import_path2.default.join(tmpFolder, import_path2.default.posix.basename(parsedUrl.pathname)); - sendTo = import_fs2.default.createWriteStream(outputFile); - } - stream.pipe(sendTo); - const algo = build[0] ?? `sha256`; - const hash = stream.pipe((0, import_crypto.createHash)(algo)); - await (0, import_events2.once)(sendTo, `finish`); + log(`Installing ${locator.name}@${version2} from ${url}`); + const algo = build[0] ?? `sha512`; + const { tmpFolder, outputFile, hash: actualHash } = await download(installTarget, url, algo, binPath); let bin; const isSingleFile = outputFile !== null; if (isSingleFile) { @@ -23126,7 +22396,7 @@ async function installVersion(installTarget, locator, { spec }) { if (locatorIsASupportedPackageManager && isValidBinSpec(spec.bin)) { bin = spec.bin; } else { - const { name: packageName, bin: packageBin } = require(import_path2.default.join(tmpFolder, `package.json`)); + const { name: packageName, bin: packageBin } = require(import_path3.default.join(tmpFolder, `package.json`)); if (typeof packageBin === `string`) { bin = { [packageName]: packageBin }; } else if (isValidBinSpec(packageBin)) { @@ -23136,67 +22406,68 @@ async function installVersion(installTarget, locator, { spec }) { } } } - const actualHash = hash.digest(`hex`); + if (!build[1]) { + const registry = getRegistryFromPackageManagerSpec(spec); + if (registry.type === `npm` && !registry.bin && !shouldSkipIntegrityCheck()) { + if (signatures == null || integrity == null) + ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + verifySignature({ signatures, integrity, packageName: registry.package, version: version2 }); + build[1] = Buffer.from(integrity.slice(`sha512-`.length), `base64`).toString(`hex`); + } + } if (build[1] && actualHash !== build[1]) throw new Error(`Mismatch hashes. Expected ${build[1]}, got ${actualHash}`); const serializedHash = `${algo}.${actualHash}`; - await import_fs2.default.promises.writeFile(import_path2.default.join(tmpFolder, `.corepack`), JSON.stringify({ + await import_fs4.default.promises.writeFile(import_path3.default.join(tmpFolder, `.corepack`), JSON.stringify({ locator, bin, hash: serializedHash })); - await import_fs2.default.promises.mkdir(import_path2.default.dirname(installFolder), { recursive: true }); + await import_fs4.default.promises.mkdir(import_path3.default.dirname(installFolder), { recursive: true }); try { - if (process.platform === `win32`) { - await renameUnderWindows(tmpFolder, installFolder); - } else { - await import_fs2.default.promises.rename(tmpFolder, installFolder); - } + await renameSafe(tmpFolder, installFolder); } catch (err) { - if (err.code === `ENOTEMPTY` || // On Windows the error code is EPERM so we check if it is a directory - err.code === `EPERM` && (await import_fs2.default.promises.stat(installFolder)).isDirectory()) { + if (isNodeError(err) && (isExistError(err) || // On Windows the error code is EPERM so we check if it is a directory + err.code === `EPERM` && (await import_fs4.default.promises.stat(installFolder)).isDirectory())) { log(`Another instance of corepack installed ${locator.name}@${locator.reference}`); - await rimraf(tmpFolder); + await import_fs4.default.promises.rm(tmpFolder, { recursive: true, force: true }); } else { throw err; } } if (locatorIsASupportedPackageManager && process.env.COREPACK_DEFAULT_TO_LATEST !== `0`) { - let lastKnownGoodFile; - try { - lastKnownGoodFile = await getLastKnownGoodFile(`r+`); - const lastKnownGood = await getJSONFileContent(lastKnownGoodFile); - const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name); - if (defaultVersion) { - const currentDefault = import_semver.default.parse(defaultVersion); - const downloadedVersion = locatorReference; - if (currentDefault.major === downloadedVersion.major && import_semver.default.lt(currentDefault, downloadedVersion)) { - await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator); - } - } - } catch (err) { - if (err?.code !== `ENOENT`) { - throw err; + const lastKnownGood = await getLastKnownGood(); + const defaultVersion = getLastKnownGoodFromFileContent(lastKnownGood, locator.name); + if (defaultVersion) { + const currentDefault = (0, import_parse3.default)(defaultVersion); + const downloadedVersion = locatorReference; + if (currentDefault.major === downloadedVersion.major && (0, import_lt.default)(currentDefault, downloadedVersion)) { + await activatePackageManager(lastKnownGood, locator); } - } finally { - await lastKnownGoodFile?.close(); } } - log(`Install finished`); + log(`Download and install of ${locator.name}@${locator.reference} is finished`); return { location: installFolder, bin, hash: serializedHash }; } +async function renameSafe(oldPath, newPath) { + if (process.platform === `win32`) { + await renameUnderWindows(oldPath, newPath); + } else { + await import_fs4.default.promises.rename(oldPath, newPath); + } +} async function renameUnderWindows(oldPath, newPath) { const retries = 5; for (let i = 0; i < retries; i++) { try { - await import_fs2.default.promises.rename(oldPath, newPath); + await import_fs4.default.promises.rename(oldPath, newPath); break; } catch (err) { - if ((err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) { + if (isNodeError(err) && (err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) { await (0, import_promises2.setTimeout)(100 * 2 ** i); continue; } else { @@ -23209,26 +22480,29 @@ async function runVersion(locator, installSpec, binName, args) { let binPath = null; const bin = installSpec.bin ?? installSpec.spec.bin; if (Array.isArray(bin)) { - if (bin.some((name) => name === binName)) { + if (bin.some((name2) => name2 === binName)) { const parsedUrl = new URL(installSpec.spec.url); - const ext = import_path2.default.posix.extname(parsedUrl.pathname); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); if (ext === `.js`) { - binPath = import_path2.default.join(installSpec.location, import_path2.default.posix.basename(parsedUrl.pathname)); + binPath = import_path3.default.join(installSpec.location, import_path3.default.posix.basename(parsedUrl.pathname)); } } } else { - for (const [name, dest] of Object.entries(bin)) { - if (name === binName) { - binPath = import_path2.default.join(installSpec.location, dest); + for (const [name2, dest] of Object.entries(bin)) { + if (name2 === binName) { + binPath = import_path3.default.join(installSpec.location, dest); break; } } } if (!binPath) throw new Error(`Assertion failed: Unable to locate path for bin '${binName}'`); - if (locator.name !== `npm` || import_semver.default.lt(locator.reference, `9.7.0`)) - await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); - process.env.COREPACK_ROOT = import_path2.default.dirname(require.resolve("corepack/package.json")); + if (!import_module.default.enableCompileCache) { + if (locator.name !== `npm` || (0, import_lt.default)(locator.reference, `9.7.0`)) { + await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); + } + } + process.env.COREPACK_ROOT = import_path3.default.dirname(require.resolve("corepack/package.json")); process.argv = [ process.execPath, binPath, @@ -23237,21 +22511,21 @@ async function runVersion(locator, installSpec, binName, args) { process.execArgv = []; process.mainModule = void 0; process.nextTick(import_module.default.runMain, binPath); -} - -// sources/miscUtils.ts -var Cancellation = class extends Error { - constructor() { - super(`Cancelled operation`); + if (import_module.default.flushCompileCache) { + setImmediate(import_module.default.flushCompileCache); } -}; +} +function shouldSkipIntegrityCheck() { + return process.env.COREPACK_INTEGRITY_KEYS === `` || process.env.COREPACK_INTEGRITY_KEYS === `0`; +} // sources/semverUtils.ts -var import_semver2 = __toESM(require_semver2()); +var import_range2 = __toESM(require_range()); +var import_semver2 = __toESM(require_semver()); function satisfiesWithPrereleases(version2, range, loose = false) { let semverRange; try { - semverRange = new import_semver2.default.Range(range, loose); + semverRange = new import_range2.default(range, loose); } catch (err) { return false; } @@ -23259,7 +22533,7 @@ function satisfiesWithPrereleases(version2, range, loose = false) { return false; let semverVersion; try { - semverVersion = new import_semver2.default.SemVer(version2, semverRange.loose); + semverVersion = new import_semver2.default(version2, semverRange.loose); if (semverVersion.prerelease) { semverVersion.prerelease = []; } @@ -23277,47 +22551,12 @@ function satisfiesWithPrereleases(version2, range, loose = false) { } // sources/specUtils.ts -var import_fs3 = __toESM(require("fs")); -var import_path3 = __toESM(require("path")); -var import_semver3 = __toESM(require_semver2()); - -// sources/nodeUtils.ts -var import_os2 = __toESM(require("os")); -function getEndOfLine(content) { - const matches = content.match(/\r?\n/g); - if (matches === null) - return import_os2.default.EOL; - const crlf = matches.filter((nl) => nl === `\r -`).length; - const lf = matches.length - crlf; - return crlf > lf ? `\r -` : ` -`; -} -function normalizeLineEndings(originalContent, newContent) { - return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); -} -function getIndent(content) { - const indentMatch = content.match(/^[ \t]+/m); - if (indentMatch) { - return indentMatch[0]; - } else { - return ` `; - } -} -function stripBOM(content) { - if (content.charCodeAt(0) === 65279) { - return content.slice(1); - } else { - return content; - } -} -function readPackageJson(content) { - return { - data: JSON.parse(stripBOM(content) || `{}`), - indent: getIndent(content) - }; -} +var import_fs5 = __toESM(require("fs")); +var import_path4 = __toESM(require("path")); +var import_satisfies = __toESM(require_satisfies()); +var import_valid = __toESM(require_valid()); +var import_valid2 = __toESM(require_valid2()); +var import_util = require("util"); // sources/types.ts var SupportedPackageManagers = /* @__PURE__ */ ((SupportedPackageManagers3) => { @@ -23339,47 +22578,97 @@ function isSupportedPackageManager(value) { // sources/specUtils.ts var nodeModulesRegExp = /[\\/]node_modules[\\/](@[^\\/]*[\\/])?([^@\\/][^\\/]*)$/; -function parseSpec(raw, source, { enforceExactVersion = true } = {}) { - if (typeof raw !== `string`) +function parseSpec(raw2, source, { enforceExactVersion = true } = {}) { + if (typeof raw2 !== `string`) throw new UsageError(`Invalid package manager specification in ${source}; expected a string`); - const atIndex = raw.indexOf(`@`); - if (atIndex === -1 || atIndex === raw.length - 1) { + const atIndex = raw2.indexOf(`@`); + if (atIndex === -1 || atIndex === raw2.length - 1) { if (enforceExactVersion) - throw new UsageError(`No version specified for ${raw} in "packageManager" of ${source}`); - const name2 = atIndex === -1 ? raw : raw.slice(0, -1); - if (!isSupportedPackageManager(name2)) - throw new UsageError(`Unsupported package manager specification (${name2})`); + throw new UsageError(`No version specified for ${raw2} in "packageManager" of ${source}`); + const name3 = atIndex === -1 ? raw2 : raw2.slice(0, -1); + if (!isSupportedPackageManager(name3)) + throw new UsageError(`Unsupported package manager specification (${name3})`); return { - name: name2, + name: name3, range: `*` }; } - const name = raw.slice(0, atIndex); - const range = raw.slice(atIndex + 1); + const name2 = raw2.slice(0, atIndex); + const range = raw2.slice(atIndex + 1); const isURL = URL.canParse(range); if (!isURL) { - if (enforceExactVersion && !import_semver3.default.valid(range)) - throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`); - if (!isSupportedPackageManager(name)) { - throw new UsageError(`Unsupported package manager specification (${raw})`); + if (enforceExactVersion && !(0, import_valid.default)(range)) + throw new UsageError(`Invalid package manager specification in ${source} (${raw2}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`); + if (!isSupportedPackageManager(name2)) { + throw new UsageError(`Unsupported package manager specification (${raw2})`); } - } else if (isSupportedPackageManager(name) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) { - throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw})`); + } else if (isSupportedPackageManager(name2) && process.env.COREPACK_ENABLE_UNSAFE_CUSTOM_URLS !== `1`) { + throw new UsageError(`Illegal use of URL for known package manager. Instead, select a specific version, or set COREPACK_ENABLE_UNSAFE_CUSTOM_URLS=1 in your environment (${raw2})`); } return { - name, + name: name2, range }; } +function warnOrThrow(errorMessage, onFail) { + switch (onFail) { + case `ignore`: + break; + case `error`: + case void 0: + throw new UsageError(errorMessage); + default: + console.warn(`! Corepack validation warning: ${errorMessage}`); + } +} +function parsePackageJSON(packageJSONContent) { + const { packageManager: pm } = packageJSONContent; + if (packageJSONContent.devEngines?.packageManager != null) { + const { packageManager } = packageJSONContent.devEngines; + if (typeof packageManager !== `object`) { + console.warn(`! Corepack only supports objects as valid value for devEngines.packageManager. The current value (${JSON.stringify(packageManager)}) will be ignored.`); + return pm; + } + if (Array.isArray(packageManager)) { + console.warn(`! Corepack does not currently support array values for devEngines.packageManager`); + return pm; + } + const { name: name2, version: version2, onFail } = packageManager; + if (typeof name2 !== `string` || name2.includes(`@`)) { + warnOrThrow(`The value of devEngines.packageManager.name ${JSON.stringify(name2)} is not a supported string value`, onFail); + return pm; + } + if (version2 != null && (typeof version2 !== `string` || !(0, import_valid2.default)(version2))) { + warnOrThrow(`The value of devEngines.packageManager.version ${JSON.stringify(version2)} is not a valid semver range`, onFail); + return pm; + } + log(`devEngines.packageManager defines that ${name2}@${version2} is the local package manager`); + if (pm) { + if (!pm.startsWith?.(`${name2}@`)) + warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the "devEngines.packageManager" field set to ${JSON.stringify(name2)}`, onFail); + else if (version2 != null && !(0, import_satisfies.default)(pm.slice(packageManager.name.length + 1), version2)) + warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the value defined in "devEngines.packageManager" for ${JSON.stringify(name2)} of ${JSON.stringify(version2)}`, onFail); + return pm; + } + return `${name2}@${version2 ?? `*`}`; + } + return pm; +} async function setLocalPackageManager(cwd, info) { const lookup = await loadSpec(cwd); - const content = lookup.type !== `NoProject` ? await import_fs3.default.promises.readFile(lookup.target, `utf8`) : ``; + const range = `range` in lookup && lookup.range; + if (range) { + if (info.locator.name !== range.name || !(0, import_satisfies.default)(info.locator.reference, range.range)) { + warnOrThrow(`The requested version of ${info.locator.name}@${info.locator.reference} does not match the devEngines specification (${range.name}@${range.range})`, range.onFail); + } + } + const content = lookup.type !== `NoProject` ? await import_fs5.default.promises.readFile(lookup.target, `utf8`) : ``; const { data, indent } = readPackageJson(content); - const previousPackageManager = data.packageManager ?? `unknown`; + const previousPackageManager = data.packageManager ?? (range ? `${range.name}@${range.range}` : `unknown`); data.packageManager = `${info.locator.name}@${info.locator.reference}`; const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)} `); - await import_fs3.default.promises.writeFile(lookup.target, newContent, `utf8`); + await import_fs5.default.promises.writeFile(lookup.target, newContent, `utf8`); return { previousPackageManager }; @@ -23390,16 +22679,16 @@ async function loadSpec(initialCwd) { let selection = null; while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) { currCwd = nextCwd; - nextCwd = import_path3.default.dirname(currCwd); + nextCwd = import_path4.default.dirname(currCwd); if (nodeModulesRegExp.test(currCwd)) continue; - const manifestPath = import_path3.default.join(currCwd, `package.json`); + const manifestPath = import_path4.default.join(currCwd, `package.json`); + log(`Checking ${manifestPath}`); let content; try { - content = await import_fs3.default.promises.readFile(manifestPath, `utf8`); + content = await import_fs5.default.promises.readFile(manifestPath, `utf8`); } catch (err) { - if (err?.code === `ENOENT`) - continue; + if (err?.code === `ENOENT`) continue; throw err; } let data; @@ -23408,58 +22697,115 @@ async function loadSpec(initialCwd) { } catch { } if (typeof data !== `object` || data === null) - throw new UsageError(`Invalid package.json in ${import_path3.default.relative(initialCwd, manifestPath)}`); - selection = { data, manifestPath }; + throw new UsageError(`Invalid package.json in ${import_path4.default.relative(initialCwd, manifestPath)}`); + let localEnv; + const envFilePath2 = import_path4.default.resolve(currCwd, process.env.COREPACK_ENV_FILE ?? `.corepack.env`); + if (process.env.COREPACK_ENV_FILE == `0`) { + log(`Skipping env file as configured with COREPACK_ENV_FILE`); + localEnv = process.env; + } else if (typeof import_util.parseEnv !== `function`) { + log(`Skipping env file as it is not supported by the current version of Node.js`); + localEnv = process.env; + } else { + log(`Checking ${envFilePath2}`); + try { + localEnv = { + ...Object.fromEntries(Object.entries((0, import_util.parseEnv)(await import_fs5.default.promises.readFile(envFilePath2, `utf8`))).filter((e) => e[0].startsWith(`COREPACK_`))), + ...process.env + }; + log(`Successfully loaded env file found at ${envFilePath2}`); + } catch (err) { + if (err?.code !== `ENOENT`) + throw err; + log(`No env file found at ${envFilePath2}`); + localEnv = process.env; + } + } + selection = { data, manifestPath, localEnv, envFilePath: envFilePath2 }; } if (selection === null) - return { type: `NoProject`, target: import_path3.default.join(initialCwd, `package.json`) }; - const rawPmSpec = selection.data.packageManager; + return { type: `NoProject`, target: import_path4.default.join(initialCwd, `package.json`) }; + let envFilePath; + if (selection.localEnv !== process.env) { + envFilePath = selection.envFilePath; + process.env = selection.localEnv; + } + const rawPmSpec = parsePackageJSON(selection.data); if (typeof rawPmSpec === `undefined`) return { type: `NoSpec`, target: selection.manifestPath }; + log(`${selection.manifestPath} defines ${rawPmSpec} as local package manager`); return { type: `Found`, target: selection.manifestPath, - spec: parseSpec(rawPmSpec, import_path3.default.relative(initialCwd, selection.manifestPath)) + envFilePath, + range: selection.data.devEngines?.packageManager?.version && { + name: selection.data.devEngines.packageManager.name, + range: selection.data.devEngines.packageManager.version, + onFail: selection.data.devEngines.packageManager.onFail + }, + // Lazy-loading it so we do not throw errors on commands that do not need valid spec. + getSpec: ({ enforceExactVersion = true } = {}) => parseSpec(rawPmSpec, import_path4.default.relative(initialCwd, selection.manifestPath), { enforceExactVersion }) }; } // sources/Engine.ts -function getLastKnownGoodFile(flag = `r`) { - return import_fs4.default.promises.open(import_path4.default.join(getCorepackHomeFolder(), `lastKnownGood.json`), flag); +function getLastKnownGoodFilePath() { + const lkg = import_path5.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); + log(`LastKnownGood file would be located at ${lkg}`); + return lkg; } -async function createLastKnownGoodFile() { - await import_fs4.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); - return getLastKnownGoodFile(`w`); -} -async function getJSONFileContent(fh) { - let lastKnownGood; +async function getLastKnownGood() { + let raw2; + try { + raw2 = await import_fs6.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); + } catch (err) { + if (err?.code === `ENOENT`) { + log(`No LastKnownGood version found in Corepack home.`); + return {}; + } + throw err; + } try { - lastKnownGood = JSON.parse(await fh.readFile(`utf8`)); + const parsed = JSON.parse(raw2); + if (!parsed) { + log(`Invalid LastKnowGood file in Corepack home (JSON parsable, but falsy)`); + return {}; + } + if (typeof parsed !== `object`) { + log(`Invalid LastKnowGood file in Corepack home (JSON parsable, but non-object)`); + return {}; + } + Object.entries(parsed).forEach(([key, value]) => { + if (typeof value !== `string`) { + log(`Ignoring key ${key} in LastKnownGood file as its value is not a string`); + delete parsed[key]; + } + }); + return parsed; } catch { - return void 0; + log(`Invalid LastKnowGood file in Corepack home (maybe not JSON parsable)`); + return {}; } - return lastKnownGood; } -async function overwriteJSONFileContent(fh, content) { - await fh.truncate(0); - await fh.write(`${JSON.stringify(content, null, 2)} -`, 0); +async function createLastKnownGoodFile(lastKnownGood) { + const content = `${JSON.stringify(lastKnownGood, null, 2)} +`; + await import_fs6.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); + await import_fs6.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); } function getLastKnownGoodFromFileContent(lastKnownGood, packageManager) { - if (typeof lastKnownGood === `object` && lastKnownGood !== null && Object.hasOwn(lastKnownGood, packageManager)) { - const override = lastKnownGood[packageManager]; - if (typeof override === `string`) { - return override; - } - } + if (Object.hasOwn(lastKnownGood, packageManager)) + return lastKnownGood[packageManager]; return void 0; } -async function activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, locator) { - if (typeof lastKnownGood !== `object` || lastKnownGood === null) - lastKnownGood = {}; +async function activatePackageManager(lastKnownGood, locator) { + if (lastKnownGood[locator.name] === locator.reference) { + log(`${locator.name}@${locator.reference} is already Last Known Good version`); + return; + } lastKnownGood[locator.name] = locator.reference; log(`Setting ${locator.name}@${locator.reference} as Last Known Good version`); - await overwriteJSONFileContent(lastKnownGoodFile, lastKnownGood); + await createLastKnownGoodFile(lastKnownGood); } var Engine = class { constructor(config = config_default) { @@ -23502,66 +22848,51 @@ var Engine = class { throw new Error(`Assertion failed: Specified resolution (${locator.reference}) isn't supported by any of ${ranges.join(`, `)}`); return definition.ranges[range]; } - getBinariesFor(name) { + getBinariesFor(name2) { const binNames = /* @__PURE__ */ new Set(); - for (const rangeDefinition of Object.values(this.config.definitions[name].ranges)) { + for (const rangeDefinition of Object.values(this.config.definitions[name2].ranges)) { const bins = Array.isArray(rangeDefinition.bin) ? rangeDefinition.bin : Object.keys(rangeDefinition.bin); - for (const name2 of bins) { - binNames.add(name2); + for (const name3 of bins) { + binNames.add(name3); } } return binNames; } async getDefaultDescriptors() { const locators = []; - for (const name of SupportedPackageManagerSet) - locators.push({ name, range: await this.getDefaultVersion(name) }); + for (const name2 of SupportedPackageManagerSet) + locators.push({ name: name2, range: await this.getDefaultVersion(name2) }); return locators; } async getDefaultVersion(packageManager) { const definition = this.config.definitions[packageManager]; if (typeof definition === `undefined`) throw new UsageError(`This package manager (${packageManager}) isn't supported by this corepack build`); - let lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => { - if (err?.code !== `ENOENT` && err?.code !== `EROFS`) { - throw err; - } - }); + const lastKnownGood = await getLastKnownGood(); + const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager); + if (lastKnownGoodForThisPackageManager) { + log(`Search for default version: Found ${packageManager}@${lastKnownGoodForThisPackageManager} in LastKnownGood file`); + return lastKnownGoodForThisPackageManager; + } + if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`) { + log(`Search for default version: As defined in environment, defaulting to internal config ${packageManager}@${definition.default}`); + return definition.default; + } + const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom); + log(`Search for default version: found in remote registry ${packageManager}@${reference}`); try { - const lastKnownGood = lastKnownGoodFile == null || await getJSONFileContent(lastKnownGoodFile); - const lastKnownGoodForThisPackageManager = getLastKnownGoodFromFileContent(lastKnownGood, packageManager); - if (lastKnownGoodForThisPackageManager) - return lastKnownGoodForThisPackageManager; - if (import_process3.default.env.COREPACK_DEFAULT_TO_LATEST === `0`) - return definition.default; - const reference = await fetchLatestStableVersion2(definition.fetchLatestFrom); - try { - lastKnownGoodFile ??= await createLastKnownGoodFile(); - await activatePackageManagerFromFileHandle(lastKnownGoodFile, lastKnownGood, { - name: packageManager, - reference - }); - } catch { - } - return reference; - } finally { - await lastKnownGoodFile?.close(); + await activatePackageManager(lastKnownGood, { + name: packageManager, + reference + }); + } catch { + log(`Search for default version: could not activate registry version`); } + return reference; } async activatePackageManager(locator) { - let emptyFile = false; - const lastKnownGoodFile = await getLastKnownGoodFile(`r+`).catch((err) => { - if (err?.code === `ENOENT`) { - emptyFile = true; - return getLastKnownGoodFile(`w`); - } - throw err; - }); - try { - await activatePackageManagerFromFileHandle(lastKnownGoodFile, emptyFile || await getJSONFileContent(lastKnownGoodFile), locator); - } finally { - await lastKnownGoodFile.close(); - } + const lastKnownGood = await getLastKnownGood(); + await activatePackageManager(lastKnownGood, locator); } async ensurePackageManager(locator) { const spec = this.getPackageManagerSpecFor(locator); @@ -23589,26 +22920,35 @@ var Engine = class { * * If the project doesn't include a specification file, we just assume that * whatever the user uses is exactly what they want to use. Since the version - * isn't explicited, we fallback on known good versions. + * isn't specified, we fallback on known good versions. * * Finally, if the project doesn't exist at all, we ask the user whether they * want to create one in the current project. If they do, we initialize a new * project using the default package managers, and configure it so that we * don't need to ask again in the future. */ - async findProjectSpec(initialCwd, locator, { transparent = false } = {}) { + async findProjectSpec(initialCwd, locator, { transparent = false, binaryVersion } = {}) { const fallbackDescriptor = { name: locator.name, range: `${locator.reference}` }; - if (import_process3.default.env.COREPACK_ENABLE_PROJECT_SPEC === `0`) + if (import_process3.default.env.COREPACK_ENABLE_PROJECT_SPEC === `0`) { + if (typeof locator.reference === `function`) + fallbackDescriptor.range = await locator.reference(); return fallbackDescriptor; + } if (import_process3.default.env.COREPACK_ENABLE_STRICT === `0`) transparent = true; while (true) { const result = await loadSpec(initialCwd); switch (result.type) { - case `NoProject`: + case `NoProject`: { + if (typeof locator.reference === `function`) + fallbackDescriptor.range = await locator.reference(); + log(`Falling back to ${fallbackDescriptor.name}@${fallbackDescriptor.range} as no project manifest were found`); return fallbackDescriptor; + } case `NoSpec`: { - if (import_process3.default.env.COREPACK_ENABLE_AUTO_PIN !== `0`) { + if (typeof locator.reference === `function`) + fallbackDescriptor.range = await locator.reference(); + if (import_process3.default.env.COREPACK_ENABLE_AUTO_PIN === `1`) { const resolved = await this.resolveDescriptor(fallbackDescriptor, { allowTags: true }); if (resolved === null) throw new UsageError(`Failed to successfully resolve '${fallbackDescriptor.range}' to a valid ${fallbackDescriptor.name} release`); @@ -23616,19 +22956,25 @@ var Engine = class { console.error(`! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing ${installSpec.locator.name}@${installSpec.locator.reference}.`); console.error(`! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager`); console.error(); - await setLocalPackageManager(import_path4.default.dirname(result.target), installSpec); + await setLocalPackageManager(import_path5.default.dirname(result.target), installSpec); } + log(`Falling back to ${fallbackDescriptor.name}@${fallbackDescriptor.range} in the absence of "packageManager" field in ${result.target}`); return fallbackDescriptor; } case `Found`: { - if (result.spec.name !== locator.name) { + const spec = result.getSpec({ enforceExactVersion: !binaryVersion }); + if (spec.name !== locator.name) { if (transparent) { + if (typeof locator.reference === `function`) + fallbackDescriptor.range = await locator.reference(); + log(`Falling back to ${fallbackDescriptor.name}@${fallbackDescriptor.range} in a ${spec.name}@${spec.range} project`); return fallbackDescriptor; } else { - throw new UsageError(`This project is configured to use ${result.spec.name}`); + throw new UsageError(`This project is configured to use ${spec.name} because ${result.target} has a "packageManager" field`); } } else { - return result.spec; + log(`Using ${spec.name}@${spec.range} as defined in project manifest ${result.target}`); + return spec; } } } @@ -23641,7 +22987,7 @@ var Engine = class { }; let isTransparentCommand = false; if (packageManager != null) { - const defaultVersion = await this.getDefaultVersion(packageManager); + const defaultVersion = binaryVersion || (() => this.getDefaultVersion(packageManager)); const definition = this.config.definitions[packageManager]; for (const transparentPath of definition.transparent.commands) { if (transparentPath[0] === binaryName && transparentPath.slice(1).every((segment, index) => segment === args[index])) { @@ -23655,16 +23001,7 @@ var Engine = class { reference: fallbackReference }; } - let descriptor; - try { - descriptor = await this.findProjectSpec(cwd, fallbackLocator, { transparent: isTransparentCommand }); - } catch (err) { - if (err instanceof Cancellation) { - return 1; - } else { - throw err; - } - } + const descriptor = await this.findProjectSpec(cwd, fallbackLocator, { transparent: isTransparentCommand, binaryVersion }); if (binaryVersion) descriptor.range = binaryVersion; const resolved = await this.resolveDescriptor(descriptor, { allowTags: true }); @@ -23686,7 +23023,7 @@ var Engine = class { if (typeof definition === `undefined`) throw new UsageError(`This package manager (${descriptor.name}) isn't supported by this corepack build`); let finalDescriptor = descriptor; - if (!import_semver4.default.valid(descriptor.range) && !import_semver4.default.validRange(descriptor.range)) { + if (!(0, import_valid3.default)(descriptor.range) && !(0, import_valid4.default)(descriptor.range)) { if (!allowTags) throw new UsageError(`Packages managers can't be referenced via tags in this context`); const ranges = Object.keys(definition.ranges); @@ -23704,7 +23041,7 @@ var Engine = class { const cachedVersion = await findInstalledVersion(getInstallFolder(), finalDescriptor); if (cachedVersion !== null && useCache) return { name: finalDescriptor.name, reference: cachedVersion }; - if (import_semver4.default.valid(finalDescriptor.range)) + if ((0, import_valid3.default)(finalDescriptor.range)) return { name: finalDescriptor.name, reference: finalDescriptor.range }; const versions = await Promise.all(Object.keys(definition.ranges).map(async (range) => { const packageManagerSpec = definition.ranges[range]; @@ -23712,7 +23049,7 @@ var Engine = class { const versions2 = await fetchAvailableVersions2(registry); return versions2.filter((version2) => satisfiesWithPrereleases(version2, finalDescriptor.range)); })); - const highestVersion = [...new Set(versions.flat())].sort(import_semver4.default.rcompare); + const highestVersion = [...new Set(versions.flat())].sort(import_rcompare.default); if (highestVersion.length === 0) return null; return { name: finalDescriptor.name, reference: highestVersion[0] }; @@ -23720,7 +23057,7 @@ var Engine = class { }; // sources/commands/Cache.ts -var import_fs5 = __toESM(require("fs")); +var import_fs7 = __toESM(require("fs")); var CacheCommand = class extends Command { static paths = [ [`cache`, `clean`], @@ -23733,13 +23070,13 @@ var CacheCommand = class extends Command { ` }); async execute() { - await import_fs5.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); + await import_fs7.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); } }; // sources/commands/Disable.ts -var import_fs6 = __toESM(require("fs")); -var import_path5 = __toESM(require("path")); +var import_fs8 = __toESM(require("fs")); +var import_path6 = __toESM(require("path")); var import_which = __toESM(require_lib()); var DisableCommand = class extends Command { static paths = [ @@ -23770,24 +23107,26 @@ var DisableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path5.default.dirname(await (0, import_which.default)(`corepack`)); + installDirectory = import_path6.default.dirname(await (0, import_which.default)(`corepack`)); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; - for (const name of new Set(names)) { - if (!isSupportedPackageManager(name)) - throw new UsageError(`Invalid package manager name '${name}'`); - for (const binName of this.context.engine.getBinariesFor(name)) { - if (process.platform === `win32`) { - await this.removeWin32Link(installDirectory, binName); - } else { - await this.removePosixLink(installDirectory, binName); - } - } + const allBinNames = []; + for (const name2 of new Set(names)) { + if (!isSupportedPackageManager(name2)) + throw new UsageError(`Invalid package manager name '${name2}'`); + const binNames = this.context.engine.getBinariesFor(name2); + allBinNames.push(...binNames); } + const removeLink = process.platform === `win32` ? (binName) => this.removeWin32Link(installDirectory, binName) : (binName) => this.removePosixLink(installDirectory, binName); + await Promise.all(allBinNames.map(removeLink)); } async removePosixLink(installDirectory, binName) { - const file = import_path5.default.join(installDirectory, binName); + const file = import_path6.default.join(installDirectory, binName); try { - await import_fs6.default.promises.unlink(file); + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs8.default.promises.realpath(file))) { + console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); + return; + } + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23796,9 +23135,9 @@ var DisableCommand = class extends Command { } async removeWin32Link(installDirectory, binName) { for (const ext of [``, `.ps1`, `.cmd`]) { - const file = import_path5.default.join(installDirectory, `${binName}${ext}`); + const file = import_path6.default.join(installDirectory, `${binName}${ext}`); try { - await import_fs6.default.promises.unlink(file); + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23810,17 +23149,17 @@ var DisableCommand = class extends Command { // sources/commands/Enable.ts var import_cmd_shim = __toESM(require_cmd_shim()); -var import_fs7 = __toESM(require("fs")); -var import_path6 = __toESM(require("path")); +var import_fs9 = __toESM(require("fs")); +var import_path7 = __toESM(require("path")); var import_which2 = __toESM(require_lib()); var EnableCommand = class extends Command { static paths = [ [`enable`] ]; static usage = Command.Usage({ - description: `Add the Corepack shims to the install directories`, + description: `Add the Corepack shims to the install directory`, details: ` - When run, this commmand will check whether the shims for the specified package managers can be found with the correct values inside the install directory. If not, or if they don't exist, they will be created. + When run, this command will check whether the shims for the specified package managers can be found with the correct values inside the install directory. If not, or if they don't exist, they will be created. By default it will locate the install directory by running the equivalent of \`which corepack\`, but this can be tweaked by explicitly passing the install directory via the \`--install-directory\` flag. `, @@ -23842,49 +23181,53 @@ var EnableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path6.default.dirname(await (0, import_which2.default)(`corepack`)); - installDirectory = import_fs7.default.realpathSync(installDirectory); + installDirectory = import_path7.default.dirname(await (0, import_which2.default)(`corepack`)); + installDirectory = import_fs9.default.realpathSync(installDirectory); const manifestPath = require.resolve("corepack/package.json"); - const distFolder = import_path6.default.join(import_path6.default.dirname(manifestPath), `dist`); - if (!import_fs7.default.existsSync(distFolder)) + const distFolder = import_path7.default.join(import_path7.default.dirname(manifestPath), `dist`); + if (!import_fs9.default.existsSync(distFolder)) throw new Error(`Assertion failed: The stub folder doesn't exist`); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; - for (const name of new Set(names)) { - if (!isSupportedPackageManager(name)) - throw new UsageError(`Invalid package manager name '${name}'`); - for (const binName of this.context.engine.getBinariesFor(name)) { - if (process.platform === `win32`) { - await this.generateWin32Link(installDirectory, distFolder, binName); - } else { - await this.generatePosixLink(installDirectory, distFolder, binName); - } - } + const allBinNames = []; + for (const name2 of new Set(names)) { + if (!isSupportedPackageManager(name2)) + throw new UsageError(`Invalid package manager name '${name2}'`); + const binNames = this.context.engine.getBinariesFor(name2); + allBinNames.push(...binNames); } + const generateLink = process.platform === `win32` ? (binName) => this.generateWin32Link(installDirectory, distFolder, binName) : (binName) => this.generatePosixLink(installDirectory, distFolder, binName); + await Promise.all(allBinNames.map(generateLink)); } async generatePosixLink(installDirectory, distFolder, binName) { - const file = import_path6.default.join(installDirectory, binName); - const symlink = import_path6.default.relative(installDirectory, import_path6.default.join(distFolder, `${binName}.js`)); - if (import_fs7.default.existsSync(file)) { - const currentSymlink = await import_fs7.default.promises.readlink(file); - if (currentSymlink !== symlink) { - await import_fs7.default.promises.unlink(file); - } else { - return; + const file = import_path7.default.join(installDirectory, binName); + const symlink = import_path7.default.relative(installDirectory, import_path7.default.join(distFolder, `${binName}.js`)); + const stats = import_fs9.default.lstatSync(file, { throwIfNoEntry: false }); + if (stats) { + if (stats.isSymbolicLink()) { + const currentSymlink = await import_fs9.default.promises.readlink(file); + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs9.default.promises.realpath(file))) { + console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); + return; + } + if (currentSymlink === symlink) { + return; + } } + await import_fs9.default.promises.unlink(file); } - await import_fs7.default.promises.symlink(symlink, file); + await import_fs9.default.promises.symlink(symlink, file); } async generateWin32Link(installDirectory, distFolder, binName) { - const file = import_path6.default.join(installDirectory, binName); - await (0, import_cmd_shim.default)(import_path6.default.join(distFolder, `${binName}.js`), file, { + const file = import_path7.default.join(installDirectory, binName); + await (0, import_cmd_shim.default)(import_path7.default.join(distFolder, `${binName}.js`), file, { createCmdFile: true }); } }; // sources/commands/InstallGlobal.ts -var import_fs8 = __toESM(require("fs")); -var import_path7 = __toESM(require("path")); +var import_fs10 = __toESM(require("fs")); +var import_path8 = __toESM(require("path")); // sources/commands/Base.ts var BaseCommand = class extends Command { @@ -23894,11 +23237,11 @@ var BaseCommand = class extends Command { const lookup = await loadSpec(this.context.cwd); switch (lookup.type) { case `NoProject`: - throw new UsageError(`Couldn't find a project in the local directory - please explicit the package manager to pack, or run this command from a valid project`); + throw new UsageError(`Couldn't find a project in the local directory - please specify the package manager to pack, or run this command from a valid project`); case `NoSpec`: - throw new UsageError(`The local project doesn't feature a 'packageManager' field - please explicit the package manager to pack, or update the manifest to reference it`); + throw new UsageError(`The local project doesn't feature a 'packageManager' field nor a 'devEngines.packageManager' field - please specify the package manager to pack, or update the manifest to reference it`); default: { - return [lookup.spec]; + return [lookup.range ?? lookup.getSpec()]; } } } @@ -23949,13 +23292,13 @@ var InstallGlobalCommand = class extends BaseCommand { async execute() { if (this.args.length === 0) throw new UsageError(`No package managers specified`); - for (const arg of this.args) { + await Promise.all(this.args.map((arg) => { if (arg.endsWith(`.tgz`)) { - await this.installFromTarball(import_path7.default.resolve(this.context.cwd, arg)); + return this.installFromTarball(import_path8.default.resolve(this.context.cwd, arg)); } else { - await this.installFromDescriptor(parseSpec(arg, `CLI arguments`, { enforceExactVersion: false })); + return this.installFromDescriptor(parseSpec(arg, `CLI arguments`, { enforceExactVersion: false })); } - } + })); } log(locator) { if (this.cacheOnly) { @@ -23979,9 +23322,9 @@ var InstallGlobalCommand = class extends BaseCommand { async installFromTarball(p) { const installFolder = getInstallFolder(); const archiveEntries = /* @__PURE__ */ new Map(); - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); + const { list: tarT } = await Promise.resolve().then(() => (init_list(), list_exports)); let hasShortEntries = false; - await tar.t({ file: p, onentry: (entry) => { + await tarT({ file: p, onentry: (entry) => { const segments = entry.path.split(/\//g); if (segments.length > 0 && segments[segments.length - 1] !== `.corepack`) return; @@ -23996,15 +23339,16 @@ var InstallGlobalCommand = class extends BaseCommand { } }); if (hasShortEntries || archiveEntries.size < 1) throw new UsageError(`Invalid archive format; did it get generated by 'corepack pack'?`); - for (const [name, references] of archiveEntries) { + const { extract: tarX } = await Promise.resolve().then(() => (init_extract(), extract_exports)); + for (const [name2, references] of archiveEntries) { for (const reference of references) { - if (!isSupportedPackageManager(name)) - throw new UsageError(`Unsupported package manager '${name}'`); - this.log({ name, reference }); - await import_fs8.default.promises.mkdir(installFolder, { recursive: true }); - await tar.x({ file: p, cwd: installFolder }, [`${name}/${reference}`]); + if (!isSupportedPackageManager(name2)) + throw new UsageError(`Unsupported package manager '${name2}'`); + this.log({ name: name2, reference }); + await import_fs10.default.promises.mkdir(installFolder, { recursive: true }); + await tarX({ file: p, cwd: installFolder }, [`${name2}/${reference}`]); if (!this.cacheOnly) { - await this.context.engine.activatePackageManager({ name, reference }); + await this.context.engine.activatePackageManager({ name: name2, reference }); } } } @@ -24041,7 +23385,7 @@ var InstallLocalCommand = class extends BaseCommand { // sources/commands/Pack.ts var import_promises3 = require("fs/promises"); -var import_path8 = __toESM(require("path")); +var import_path11 = __toESM(require("path")); var PackCommand = class extends BaseCommand { static paths = [ [`pack`] @@ -24082,17 +23426,17 @@ var PackCommand = class extends BaseCommand { installLocations.push(packageManagerInfo.location); } const baseInstallFolder = getInstallFolder(); - const outputPath = import_path8.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); + const outputPath = import_path11.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); if (!this.json) { this.context.stdout.write(` `); - this.context.stdout.write(`Packing the selected tools in ${import_path8.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path11.default.basename(outputPath)}... `); } - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); + const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); await (0, import_promises3.mkdir)(baseInstallFolder, { recursive: true }); - await tar.c({ gzip: true, cwd: baseInstallFolder, file: import_path8.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path8.default.relative(baseInstallFolder, location); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path11.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path11.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} @@ -24105,7 +23449,9 @@ var PackCommand = class extends BaseCommand { }; // sources/commands/Up.ts -var import_semver5 = __toESM(require_semver2()); +var import_major = __toESM(require_major()); +var import_valid5 = __toESM(require_valid()); +var import_valid6 = __toESM(require_valid2()); var UpCommand = class extends BaseCommand { static paths = [ [`up`] @@ -24131,12 +23477,12 @@ var UpCommand = class extends BaseCommand { const [descriptor] = await this.resolvePatternsToDescriptors({ patterns: [] }); - if (!import_semver5.default.valid(descriptor.range) && !import_semver5.default.validRange(descriptor.range)) + if (!(0, import_valid5.default)(descriptor.range) && !(0, import_valid6.default)(descriptor.range)) throw new UsageError(`The 'corepack up' command can only be used when your project's packageManager field is set to a semver version or semver range`); const resolved = await this.context.engine.resolveDescriptor(descriptor, { useCache: false }); if (!resolved) throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`); - const majorVersion = import_semver5.default.major(resolved.reference); + const majorVersion = (0, import_major.default)(resolved.reference); const majorDescriptor = { name: descriptor.name, range: `^${majorVersion}.0.0` }; const highestVersion = await this.context.engine.resolveDescriptor(majorDescriptor, { useCache: false }); if (!highestVersion) @@ -24182,7 +23528,7 @@ var UseCommand = class extends BaseCommand { // sources/commands/deprecated/Hydrate.ts var import_promises4 = require("fs/promises"); -var import_path9 = __toESM(require("path")); +var import_path12 = __toESM(require("path")); var HydrateCommand = class extends Command { static paths = [ [`hydrate`] @@ -24193,11 +23539,11 @@ var HydrateCommand = class extends Command { fileName = options_exports.String(); async execute() { const installFolder = getInstallFolder(); - const fileName = import_path9.default.resolve(this.context.cwd, this.fileName); + const fileName = import_path12.default.resolve(this.context.cwd, this.fileName); const archiveEntries = /* @__PURE__ */ new Map(); let hasShortEntries = false; - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); - await tar.t({ file: fileName, onentry: (entry) => { + const { list: tarT } = await Promise.resolve().then(() => (init_list(), list_exports)); + await tarT({ file: fileName, onentry: (entry) => { const segments = entry.path.split(/\//g); if (segments.length < 3) { hasShortEntries = true; @@ -24210,20 +23556,21 @@ var HydrateCommand = class extends Command { } }); if (hasShortEntries || archiveEntries.size < 1) throw new UsageError(`Invalid archive format; did it get generated by 'corepack prepare'?`); - for (const [name, references] of archiveEntries) { + const { extract: tarX } = await Promise.resolve().then(() => (init_extract(), extract_exports)); + for (const [name2, references] of archiveEntries) { for (const reference of references) { - if (!isSupportedPackageManager(name)) - throw new UsageError(`Unsupported package manager '${name}'`); + if (!isSupportedPackageManager(name2)) + throw new UsageError(`Unsupported package manager '${name2}'`); if (this.activate) - this.context.stdout.write(`Hydrating ${name}@${reference} for immediate activation... + this.context.stdout.write(`Hydrating ${name2}@${reference} for immediate activation... `); else - this.context.stdout.write(`Hydrating ${name}@${reference}... + this.context.stdout.write(`Hydrating ${name2}@${reference}... `); await (0, import_promises4.mkdir)(installFolder, { recursive: true }); - await tar.x({ file: fileName, cwd: installFolder }, [`${name}/${reference}`]); + await tarX({ file: fileName, cwd: installFolder }, [`${name2}/${reference}`]); if (this.activate) { - await this.context.engine.activatePackageManager({ name, reference }); + await this.context.engine.activatePackageManager({ name: name2, reference }); } } } @@ -24234,7 +23581,7 @@ var HydrateCommand = class extends Command { // sources/commands/deprecated/Prepare.ts var import_promises5 = require("fs/promises"); -var import_path10 = __toESM(require("path")); +var import_path13 = __toESM(require("path")); var PrepareCommand = class extends Command { static paths = [ [`prepare`] @@ -24257,11 +23604,11 @@ var PrepareCommand = class extends Command { const lookup = await loadSpec(this.context.cwd); switch (lookup.type) { case `NoProject`: - throw new UsageError(`Couldn't find a project in the local directory - please explicit the package manager to pack, or run this command from a valid project`); + throw new UsageError(`Couldn't find a project in the local directory - please specify the package manager to pack, or run this command from a valid project`); case `NoSpec`: - throw new UsageError(`The local project doesn't feature a 'packageManager' field - please explicit the package manager to pack, or update the manifest to reference it`); + throw new UsageError(`The local project doesn't feature a 'packageManager' field - please specify the package manager to pack, or update the manifest to reference it`); default: { - specs.push(lookup.spec); + specs.push(lookup.getSpec()); } } } @@ -24288,14 +23635,14 @@ var PrepareCommand = class extends Command { if (this.output) { const outputName = typeof this.output === `string` ? this.output : `corepack.tgz`; const baseInstallFolder = getInstallFolder(); - const outputPath = import_path10.default.resolve(this.context.cwd, outputName); + const outputPath = import_path13.default.resolve(this.context.cwd, outputName); if (!this.json) - this.context.stdout.write(`Packing the selected tools in ${import_path10.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path13.default.basename(outputPath)}... `); - const { default: tar } = await Promise.resolve().then(() => __toESM(require_tar())); + const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); await (0, import_promises5.mkdir)(baseInstallFolder, { recursive: true }); - await tar.c({ gzip: true, cwd: baseInstallFolder, file: import_path10.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path10.default.relative(baseInstallFolder, location); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path13.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path13.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} @@ -24309,31 +23656,28 @@ var PrepareCommand = class extends Command { }; // sources/main.ts -function getPackageManagerRequestFromCli(parameter, context) { +function getPackageManagerRequestFromCli(parameter, engine) { if (!parameter) return null; const match = parameter.match(/^([^@]*)(?:@(.*))?$/); if (!match) return null; const [, binaryName, binaryVersion] = match; - const packageManager = context.engine.getPackageManagerFor(binaryName); - if (packageManager == null && binaryVersion == null) - return null; + const packageManager = engine.getPackageManagerFor(binaryName); + if (packageManager == null && binaryVersion == null) return null; return { packageManager, binaryName, binaryVersion: binaryVersion || null }; } +function isUsageError(error) { + return error?.name === `UsageError`; +} async function runMain(argv) { - const context = { - ...Cli.defaultContext, - cwd: process.cwd(), - engine: new Engine() - }; + const engine = new Engine(); const [firstArg, ...restArgs] = argv; - const request = getPackageManagerRequestFromCli(firstArg, context); - let code; + const request = getPackageManagerRequestFromCli(firstArg, engine); if (!request) { const cli = new Cli({ binaryLabel: `Corepack`, @@ -24352,26 +23696,28 @@ async function runMain(argv) { cli.register(UseCommand); cli.register(HydrateCommand); cli.register(PrepareCommand); - code = await cli.run(argv, context); + const context = { + ...Cli.defaultContext, + cwd: process.cwd(), + engine + }; + const code2 = await cli.run(argv, context); + if (code2 !== 0) { + process.exitCode ??= code2; + } } else { - const cli = new Cli({ - binaryLabel: `'${request.binaryName}', via Corepack`, - binaryName: request.binaryName, - binaryVersion: `corepack/${version}` - }); - cli.register(class BinaryCommand extends Command { - proxy = options_exports.Proxy(); - async execute() { - return this.context.engine.executePackageManagerRequest(request, { - cwd: this.context.cwd, - args: this.proxy - }); + try { + await engine.executePackageManagerRequest(request, { + cwd: process.cwd(), + args: restArgs + }); + } catch (error) { + if (isUsageError(error)) { + console.error(error.message); + process.exit(1); } - }); - code = await cli.run(restArgs, context); - } - if (code !== 0) { - process.exitCode ??= code; + throw error; + } } } // Annotate the CommonJS export names for ESM import in node: @@ -24380,7 +23726,7 @@ async function runMain(argv) { }); /*! Bundled license information: -undici/lib/fetch/body.js: +undici/lib/web/fetch/body.js: (*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> *) is-windows/index.js: diff --git a/deps/corepack/dist/npm.js b/deps/corepack/dist/npm.js index 7d10ba5bdf36b2..75f68b058f2dd6 100755 --- a/deps/corepack/dist/npm.js +++ b/deps/corepack/dist/npm.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['npm', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/npx.js b/deps/corepack/dist/npx.js index a8bd3e69014313..b1138bb48e1a82 100755 --- a/deps/corepack/dist/npx.js +++ b/deps/corepack/dist/npx.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['npx', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/pnpm.js b/deps/corepack/dist/pnpm.js index a0a87263435562..56ba509405033d 100755 --- a/deps/corepack/dist/pnpm.js +++ b/deps/corepack/dist/pnpm.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['pnpm', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/pnpx.js b/deps/corepack/dist/pnpx.js index 57ad4842631cd7..ee36be2e99c686 100755 --- a/deps/corepack/dist/pnpx.js +++ b/deps/corepack/dist/pnpx.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['pnpx', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/yarn.js b/deps/corepack/dist/yarn.js index eaed8596eabaa3..ce628c82b6a782 100755 --- a/deps/corepack/dist/yarn.js +++ b/deps/corepack/dist/yarn.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['yarn', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/yarnpkg.js b/deps/corepack/dist/yarnpkg.js index aada6032fa67ff..9541ed726aaa3b 100755 --- a/deps/corepack/dist/yarnpkg.js +++ b/deps/corepack/dist/yarnpkg.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['yarnpkg', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/package.json b/deps/corepack/package.json index c3bc56c961bb35..ab39b1d2dd8e20 100644 --- a/deps/corepack/package.json +++ b/deps/corepack/package.json @@ -1,6 +1,6 @@ { "name": "corepack", - "version": "0.26.0", + "version": "0.34.6", "homepage": "https://github.com/nodejs/corepack#readme", "bugs": { "url": "https://github.com/nodejs/corepack/issues" @@ -10,57 +10,52 @@ "url": "https://github.com/nodejs/corepack.git" }, "engines": { - "node": "^18.17.1 || >=20.10.0" + "node": "^20.10.0 || ^22.11.0 || >=24.0.0" }, "exports": { "./package.json": "./package.json" }, "license": "MIT", - "packageManager": "yarn@4.1.0+sha224.bc24d7f5afc738464f3d4e95f4e6e7829a35cee54a0fd527ea5baa83", + "packageManager": "yarn@4.11.0+sha224.209a3e277c6bbc03df6e4206fbfcb0c1621c27ecf0688f79a0c619f0", "devDependencies": { - "@babel/core": "^7.14.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/preset-typescript": "^7.13.0", - "@jest/globals": "^29.0.0", "@types/debug": "^4.1.5", - "@types/jest": "^29.0.0", "@types/node": "^20.4.6", "@types/proxy-from-env": "^1", "@types/semver": "^7.1.0", - "@types/tar": "^6.0.0", "@types/which": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", - "@yarnpkg/eslint-config": "^1.0.0", + "@yarnpkg/eslint-config": "^3.0.0", "@yarnpkg/fslib": "^3.0.0-rc.48", "@zkochan/cmd-shim": "^6.0.0", - "babel-plugin-dynamic-import-node": "^2.3.3", - "better-sqlite3": "^9.4.1", - "clipanion": "^3.0.1", + "better-sqlite3": "^11.7.2", + "clipanion": "patch:clipanion@npm%3A3.2.1#~/.yarn/patches/clipanion-npm-3.2.1-fc9187f56c.patch", "debug": "^4.1.1", - "esbuild": "0.19.5", - "eslint": "^8.0.0", - "eslint-plugin-arca": "^0.16.0", - "jest": "^29.0.0", + "esbuild": "^0.25.0", + "eslint": "^9.22.0", "proxy-from-env": "^1.1.0", - "semver": "^7.5.2", - "supports-color": "^9.0.0", - "tar": "^6.0.1", - "ts-node": "^10.0.0", - "typescript": "^5.3.3", - "undici": "^6.6.1", + "semver": "^7.6.3", + "supports-color": "^10.0.0", + "tar": "^7.5.4", + "tsx": "^4.16.2", + "typescript": "^5.7.3", + "undici": "^6.21.2", "v8-compile-cache": "^2.3.0", - "which": "^4.0.0" + "vitest": "^3.0.5", + "which": "^5.0.0" + }, + "resolutions": { + "undici-types": "6.x" }, "scripts": { - "build": "rm -rf dist shims && run build:bundle && ts-node ./mkshims.ts", + "build": "run clean && run build:bundle && tsx ./mkshims.ts", "build:bundle": "esbuild ./sources/_lib.ts --bundle --platform=node --target=node18.17.0 --external:corepack --outfile='./dist/lib/corepack.cjs' --resolve-extensions='.ts,.mjs,.js'", - "corepack": "ts-node ./sources/_cli.ts", + "clean": "run rimraf dist shims", + "corepack": "tsx ./sources/_cli.ts", "lint": "eslint .", "prepack": "yarn build", - "postpack": "rm -rf dist shims", + "postpack": "run clean", + "rimraf": "node -e 'for(let i=2;i<process.argv.length;i++)fs.rmSync(process.argv[i],{recursive:true,force:true});'", "typecheck": "tsc --noEmit", - "test": "jest" + "test": "vitest" }, "files": [ "dist", diff --git a/deps/googletest/include/gtest/gtest-assertion-result.h b/deps/googletest/include/gtest/gtest-assertion-result.h index 56fe128f2a5aa7..52a6d62c77ec2f 100644 --- a/deps/googletest/include/gtest/gtest-assertion-result.h +++ b/deps/googletest/include/gtest/gtest-assertion-result.h @@ -130,7 +130,14 @@ namespace testing { // Expected: Foo() is even // Actual: it's 5 // -class GTEST_API_ AssertionResult { + +// Returned AssertionResult objects may not be ignored. +// Note: Disabled for SWIG as it doesn't parse attributes correctly. +#if !defined(SWIG) +class [[nodiscard]] AssertionResult; +#endif // !SWIG + +class GTEST_API_ [[nodiscard]] AssertionResult { public: // Copy constructor. // Used in EXPECT_TRUE/FALSE(assertion_result). diff --git a/deps/googletest/include/gtest/gtest-death-test.h b/deps/googletest/include/gtest/gtest-death-test.h index 08fef8c7d34645..afd7b3a4685a01 100644 --- a/deps/googletest/include/gtest/gtest-death-test.h +++ b/deps/googletest/include/gtest/gtest-death-test.h @@ -192,7 +192,7 @@ GTEST_API_ bool InDeathTestChild(); // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: // Tests that an exit code describes a normal exit with a given exit code. -class GTEST_API_ ExitedWithCode { +class GTEST_API_ [[nodiscard]] ExitedWithCode { public: explicit ExitedWithCode(int exit_code); ExitedWithCode(const ExitedWithCode&) = default; @@ -206,7 +206,7 @@ class GTEST_API_ ExitedWithCode { #if !defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_FUCHSIA) // Tests that an exit code describes an exit due to termination by a // given signal. -class GTEST_API_ KilledBySignal { +class GTEST_API_ [[nodiscard]] KilledBySignal { public: explicit KilledBySignal(int signum); bool operator()(int exit_status) const; @@ -293,8 +293,8 @@ class GTEST_API_ KilledBySignal { // statement is compiled but not executed, to ensure that // EXPECT_DEATH_IF_SUPPORTED compiles with a certain // parameter if and only if EXPECT_DEATH compiles with it. -// regex - A regex that a macro such as EXPECT_DEATH would use to test -// the output of statement. This parameter has to be +// regex_or_matcher - A regex that a macro such as EXPECT_DEATH would use +// to test the output of statement. This parameter has to be // compiled but not evaluated by this macro, to ensure that // this macro only accepts expressions that a macro such as // EXPECT_DEATH would accept. @@ -311,13 +311,13 @@ class GTEST_API_ KilledBySignal { // statement unconditionally returns or throws. The Message constructor at // the end allows the syntax of streaming additional messages into the // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. -#define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ +#define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex_or_matcher, terminator) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_LOG_(WARNING) << "Death tests are not supported on this platform.\n" \ << "Statement '" #statement "' cannot be verified."; \ } else if (::testing::internal::AlwaysFalse()) { \ - ::testing::internal::RE::PartialMatch(".*", (regex)); \ + (void)::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ terminator; \ } else \ diff --git a/deps/googletest/include/gtest/gtest-matchers.h b/deps/googletest/include/gtest/gtest-matchers.h index eae210e99ddae4..08ffbeb93c976f 100644 --- a/deps/googletest/include/gtest/gtest-matchers.h +++ b/deps/googletest/include/gtest/gtest-matchers.h @@ -67,15 +67,15 @@ namespace testing { // To implement a matcher Foo for type T, define: // 1. a class FooMatcherMatcher that implements the matcher interface: // using is_gtest_matcher = void; -// bool MatchAndExplain(const T&, std::ostream*); +// bool MatchAndExplain(const T&, std::ostream*) const; // (MatchResultListener* can also be used instead of std::ostream*) -// void DescribeTo(std::ostream*); -// void DescribeNegationTo(std::ostream*); +// void DescribeTo(std::ostream*) const; +// void DescribeNegationTo(std::ostream*) const; // // 2. a factory function that creates a Matcher<T> object from a // FooMatcherMatcher. -class MatchResultListener { +class [[nodiscard]] MatchResultListener { public: // Creates a listener object with the given underlying ostream. The // listener does not own the ostream, and does not dereference it @@ -111,7 +111,7 @@ inline MatchResultListener::~MatchResultListener() = default; // An instance of a subclass of this knows how to describe itself as a // matcher. -class GTEST_API_ MatcherDescriberInterface { +class GTEST_API_ [[nodiscard]] MatcherDescriberInterface { public: virtual ~MatcherDescriberInterface() = default; @@ -137,7 +137,7 @@ class GTEST_API_ MatcherDescriberInterface { // The implementation of a matcher. template <typename T> -class MatcherInterface : public MatcherDescriberInterface { +class [[nodiscard]] MatcherInterface : public MatcherDescriberInterface { public: // Returns true if and only if the matcher matches x; also explains the // match result to 'listener' if necessary (see the next paragraph), in @@ -180,7 +180,7 @@ class MatcherInterface : public MatcherDescriberInterface { namespace internal { // A match result listener that ignores the explanation. -class DummyMatchResultListener : public MatchResultListener { +class [[nodiscard]] DummyMatchResultListener : public MatchResultListener { public: DummyMatchResultListener() : MatchResultListener(nullptr) {} @@ -192,7 +192,7 @@ class DummyMatchResultListener : public MatchResultListener { // A match result listener that forwards the explanation to a given // ostream. The difference between this and MatchResultListener is // that the former is concrete. -class StreamMatchResultListener : public MatchResultListener { +class [[nodiscard]] StreamMatchResultListener : public MatchResultListener { public: explicit StreamMatchResultListener(::std::ostream* os) : MatchResultListener(os) {} @@ -225,7 +225,7 @@ struct SharedPayload : SharedPayloadBase { // from it. We put functionalities common to all Matcher<T> // specializations here to avoid code duplication. template <typename T> -class MatcherBase : private MatcherDescriberInterface { +class [[nodiscard]] MatcherBase : private MatcherDescriberInterface { public: // Returns true if and only if the matcher matches x; also explains the // match result to 'listener'. @@ -296,12 +296,12 @@ class MatcherBase : private MatcherDescriberInterface { return *this; } - MatcherBase(MatcherBase&& other) + MatcherBase(MatcherBase&& other) noexcept : vtable_(other.vtable_), buffer_(other.buffer_) { other.vtable_ = nullptr; } - MatcherBase& operator=(MatcherBase&& other) { + MatcherBase& operator=(MatcherBase&& other) noexcept { if (this == &other) return *this; Destroy(); vtable_ = other.vtable_; @@ -460,7 +460,7 @@ class MatcherBase : private MatcherDescriberInterface { // implementation of Matcher<T> is just a std::shared_ptr to const // MatcherInterface<T>. Don't inherit from Matcher! template <typename T> -class Matcher : public internal::MatcherBase<T> { +class [[nodiscard]] Matcher : public internal::MatcherBase<T> { public: // Constructs a null matcher. Needed for storing Matcher objects in STL // containers. A default-constructed matcher is not yet initialized. You @@ -491,8 +491,8 @@ class Matcher : public internal::MatcherBase<T> { // instead of Eq(str) and "foo" instead of Eq("foo") when a std::string // matcher is expected. template <> -class GTEST_API_ Matcher<const std::string&> - : public internal::MatcherBase<const std::string&> { +class GTEST_API_ [[nodiscard]] +Matcher<const std::string&> : public internal::MatcherBase<const std::string&> { public: Matcher() = default; @@ -513,8 +513,8 @@ class GTEST_API_ Matcher<const std::string&> }; template <> -class GTEST_API_ Matcher<std::string> - : public internal::MatcherBase<std::string> { +class GTEST_API_ [[nodiscard]] +Matcher<std::string> : public internal::MatcherBase<std::string> { public: Matcher() = default; @@ -541,7 +541,7 @@ class GTEST_API_ Matcher<std::string> // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view // matcher is expected. template <> -class GTEST_API_ Matcher<const internal::StringView&> +class GTEST_API_ [[nodiscard]] Matcher<const internal::StringView&> : public internal::MatcherBase<const internal::StringView&> { public: Matcher() = default; @@ -567,7 +567,7 @@ class GTEST_API_ Matcher<const internal::StringView&> }; template <> -class GTEST_API_ Matcher<internal::StringView> +class GTEST_API_ [[nodiscard]] Matcher<internal::StringView> : public internal::MatcherBase<internal::StringView> { public: Matcher() = default; @@ -614,7 +614,7 @@ std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) { // // See the definition of NotNull() for a complete example. template <class Impl> -class PolymorphicMatcher { +class [[nodiscard]] PolymorphicMatcher { public: explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} @@ -689,7 +689,7 @@ namespace internal { // The following template definition assumes that the Rhs parameter is // a "bare" type (i.e. neither 'const T' nor 'T&'). template <typename D, typename Rhs, typename Op> -class ComparisonBase { +class [[nodiscard]] ComparisonBase { public: explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} @@ -722,7 +722,8 @@ class ComparisonBase { }; template <typename Rhs> -class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>> { +class [[nodiscard]] EqMatcher + : public ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>> { public: explicit EqMatcher(const Rhs& rhs) : ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>>(rhs) {} @@ -730,7 +731,7 @@ class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, std::equal_to<>> { static const char* NegatedDesc() { return "isn't equal to"; } }; template <typename Rhs> -class NeMatcher +class [[nodiscard]] NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, std::not_equal_to<>> { public: explicit NeMatcher(const Rhs& rhs) @@ -739,7 +740,8 @@ class NeMatcher static const char* NegatedDesc() { return "is equal to"; } }; template <typename Rhs> -class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>> { +class [[nodiscard]] LtMatcher + : public ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>> { public: explicit LtMatcher(const Rhs& rhs) : ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>>(rhs) {} @@ -747,7 +749,8 @@ class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, std::less<>> { static const char* NegatedDesc() { return "isn't <"; } }; template <typename Rhs> -class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>> { +class [[nodiscard]] GtMatcher + : public ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>> { public: explicit GtMatcher(const Rhs& rhs) : ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>>(rhs) {} @@ -755,7 +758,7 @@ class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, std::greater<>> { static const char* NegatedDesc() { return "isn't >"; } }; template <typename Rhs> -class LeMatcher +class [[nodiscard]] LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, std::less_equal<>> { public: explicit LeMatcher(const Rhs& rhs) @@ -764,7 +767,7 @@ class LeMatcher static const char* NegatedDesc() { return "isn't <="; } }; template <typename Rhs> -class GeMatcher +class [[nodiscard]] GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, std::greater_equal<>> { public: explicit GeMatcher(const Rhs& rhs) @@ -773,6 +776,35 @@ class GeMatcher static const char* NegatedDesc() { return "isn't >="; } }; +// Same as `EqMatcher<Rhs>`, except that the `rhs` is stored as `StoredRhs` and +// must be implicitly convertible to `Rhs`. +template <typename Rhs, typename StoredRhs> +class [[nodiscard]] ImplicitCastEqMatcher { + public: + explicit ImplicitCastEqMatcher(const StoredRhs& rhs) : stored_rhs_(rhs) {} + + using is_gtest_matcher = void; + + template <typename Lhs> + bool MatchAndExplain(const Lhs& lhs, std::ostream*) const { + return lhs == rhs(); + } + + void DescribeTo(std::ostream* os) const { + *os << "is equal to "; + UniversalPrint(rhs(), os); + } + void DescribeNegationTo(std::ostream* os) const { + *os << "isn't equal to "; + UniversalPrint(rhs(), os); + } + + private: + Rhs rhs() const { return ImplicitCast_<Rhs>(stored_rhs_); } + + StoredRhs stored_rhs_; +}; + template <typename T, typename = typename std::enable_if< std::is_constructible<std::string, T>::value>::type> using StringLike = T; @@ -780,7 +812,7 @@ using StringLike = T; // Implements polymorphic matchers MatchesRegex(regex) and // ContainsRegex(regex), which can be used as a Matcher<T> as long as // T can be converted to a string. -class MatchesRegexMatcher { +class [[nodiscard]] MatchesRegexMatcher { public: MatchesRegexMatcher(const RE* regex, bool full_match) : regex_(regex), full_match_(full_match) {} diff --git a/deps/googletest/include/gtest/gtest-param-test.h b/deps/googletest/include/gtest/gtest-param-test.h index 49a47ead03b79e..9e023f96dc60f7 100644 --- a/deps/googletest/include/gtest/gtest-param-test.h +++ b/deps/googletest/include/gtest/gtest-param-test.h @@ -174,11 +174,12 @@ TEST_P(DerivedTest, DoesBlah) { #endif // 0 +#include <functional> #include <iterator> #include <utility> #include "gtest/internal/gtest-internal.h" -#include "gtest/internal/gtest-param-util.h" +#include "gtest/internal/gtest-param-util.h" // IWYU pragma: export #include "gtest/internal/gtest-port.h" namespace testing { @@ -413,7 +414,8 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) { // Synopsis: // ConvertGenerator<T>(gen) // - returns a generator producing the same elements as generated by gen, but -// each element is static_cast to type T before being returned +// each T-typed element is static_cast to a type deduced from the interface +// that accepts this generator, and then returned // // It is useful when using the Combine() function to get the generated // parameters in a custom type instead of std::tuple @@ -441,10 +443,65 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) { // Combine(Values("cat", "dog"), // Values(BLACK, WHITE)))); // -template <typename T> -internal::ParamConverterGenerator<T> ConvertGenerator( - internal::ParamGenerator<T> gen) { - return internal::ParamConverterGenerator<T>(gen); +template <typename RequestedT> +internal::ParamConverterGenerator<RequestedT> ConvertGenerator( + internal::ParamGenerator<RequestedT> gen) { + return internal::ParamConverterGenerator<RequestedT>(std::move(gen)); +} + +// As above, but takes a callable as a second argument. The callable converts +// the generated parameter to the test fixture's parameter type. This allows you +// to use a parameter type that does not have a converting constructor from the +// generated type. +// +// Example: +// +// This will instantiate tests in test suite AnimalTest each one with +// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), +// tuple("dog", BLACK), and tuple("dog", WHITE): +// +// enum Color { BLACK, GRAY, WHITE }; +// struct ParamType { +// std::string animal; +// Color color; +// }; +// class AnimalTest +// : public testing::TestWithParam<ParamType> {...}; +// +// TEST_P(AnimalTest, AnimalLooksNice) {...} +// +// INSTANTIATE_TEST_SUITE_P( +// AnimalVariations, AnimalTest, +// ConvertGenerator(Combine(Values("cat", "dog"), Values(BLACK, WHITE)), +// [](std::tuple<std::string, Color> t) { +// return ParamType{.animal = std::get<0>(t), +// .color = std::get<1>(t)}; +// })); +// +template <typename T, int&... ExplicitArgumentBarrier, typename Gen, + typename Func, + typename StdFunction = decltype(std::function(std::declval<Func>()))> +internal::ParamConverterGenerator<T, StdFunction> ConvertGenerator(Gen&& gen, + Func&& f) { + return internal::ParamConverterGenerator<T, StdFunction>( + std::forward<Gen>(gen), std::forward<Func>(f)); +} + +// As above, but infers the T from the supplied std::function instead of +// having the caller specify it. +template <int&... ExplicitArgumentBarrier, typename Gen, typename Func, + typename StdFunction = decltype(std::function(std::declval<Func>()))> +auto ConvertGenerator(Gen&& gen, Func&& f) { + constexpr bool is_single_arg_std_function = + internal::IsSingleArgStdFunction<StdFunction>::value; + if constexpr (is_single_arg_std_function) { + return ConvertGenerator< + typename internal::FuncSingleParamType<StdFunction>::type>( + std::forward<Gen>(gen), std::forward<Func>(f)); + } else { + static_assert(is_single_arg_std_function, + "The call signature must contain a single argument."); + } } #define TEST_P(test_suite_name, test_name) \ @@ -469,7 +526,7 @@ internal::ParamConverterGenerator<T> ConvertGenerator( ::testing::internal::CodeLocation(__FILE__, __LINE__)); \ return 0; \ } \ - static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ + [[maybe_unused]] static int gtest_registering_dummy_; \ }; \ int GTEST_TEST_CLASS_NAME_(test_suite_name, \ test_name)::gtest_registering_dummy_ = \ @@ -493,39 +550,38 @@ internal::ParamConverterGenerator<T> ConvertGenerator( #define GTEST_GET_FIRST_(first, ...) first #define GTEST_GET_SECOND_(first, second, ...) second -#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ - static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \ - gtest_##prefix##test_suite_name##_EvalGenerator_() { \ - return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ - } \ - static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ - const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \ - if (::testing::internal::AlwaysFalse()) { \ - ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ - __VA_ARGS__, \ - ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ - DUMMY_PARAM_))); \ - auto t = std::make_tuple(__VA_ARGS__); \ - static_assert(std::tuple_size<decltype(t)>::value <= 2, \ - "Too Many Args!"); \ - } \ - return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ - __VA_ARGS__, \ - ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ - DUMMY_PARAM_))))(info); \ - } \ - static int gtest_##prefix##test_suite_name##_dummy_ \ - GTEST_ATTRIBUTE_UNUSED_ = \ - ::testing::UnitTest::GetInstance() \ - ->parameterized_test_registry() \ - .GetTestSuitePatternHolder<test_suite_name>( \ - GTEST_STRINGIFY_(test_suite_name), \ - ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ - ->AddTestSuiteInstantiation( \ - GTEST_STRINGIFY_(prefix), \ - >est_##prefix##test_suite_name##_EvalGenerator_, \ - >est_##prefix##test_suite_name##_EvalGenerateName_, \ - __FILE__, __LINE__) +#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ + static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \ + gtest_##prefix##test_suite_name##_EvalGenerator_() { \ + return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ + } \ + static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ + const ::testing::TestParamInfo<test_suite_name::ParamType>& info) { \ + if (::testing::internal::AlwaysFalse()) { \ + ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ + __VA_ARGS__, \ + ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ + DUMMY_PARAM_))); \ + auto t = std::make_tuple(__VA_ARGS__); \ + static_assert(std::tuple_size<decltype(t)>::value <= 2, \ + "Too Many Args!"); \ + } \ + return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ + __VA_ARGS__, \ + ::testing::internal::DefaultParamName<test_suite_name::ParamType>, \ + DUMMY_PARAM_))))(info); \ + } \ + [[maybe_unused]] static int gtest_##prefix##test_suite_name##_dummy_ = \ + ::testing::UnitTest::GetInstance() \ + ->parameterized_test_registry() \ + .GetTestSuitePatternHolder<test_suite_name>( \ + GTEST_STRINGIFY_(test_suite_name), \ + ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ + ->AddTestSuiteInstantiation( \ + GTEST_STRINGIFY_(prefix), \ + >est_##prefix##test_suite_name##_EvalGenerator_, \ + >est_##prefix##test_suite_name##_EvalGenerateName_, __FILE__, \ + __LINE__) // Allow Marking a Parameterized test class as not needing to be instantiated. #define GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(T) \ diff --git a/deps/googletest/include/gtest/gtest-printers.h b/deps/googletest/include/gtest/gtest-printers.h index b2822bcde23cc7..d1704bb7580a96 100644 --- a/deps/googletest/include/gtest/gtest-printers.h +++ b/deps/googletest/include/gtest/gtest-printers.h @@ -104,15 +104,19 @@ #ifndef GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #define GOOGLETEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ +#include <any> #include <functional> #include <memory> +#include <optional> #include <ostream> // NOLINT #include <sstream> #include <string> +#include <string_view> #include <tuple> #include <type_traits> #include <typeinfo> #include <utility> +#include <variant> #include <vector> #ifdef GTEST_HAS_ABSL @@ -126,6 +130,10 @@ #include <span> // NOLINT #endif // GTEST_INTERNAL_HAS_STD_SPAN +#if GTEST_INTERNAL_HAS_COMPARE_LIB +#include <compare> // NOLINT +#endif // GTEST_INTERNAL_HAS_COMPARE_LIB + namespace testing { // Definitions in the internal* namespaces are subject to change without notice. @@ -241,8 +249,8 @@ struct StreamPrinter { // ADL (possibly involving implicit conversions). // (Use SFINAE via return type, because it seems GCC < 12 doesn't handle name // lookup properly when we do it in the template parameter list.) - static auto PrintValue(const T& value, - ::std::ostream* os) -> decltype((void)(*os << value)) { + static auto PrintValue(const T& value, ::std::ostream* os) + -> decltype((void)(*os << value)) { // Call streaming operator found by ADL, possibly with implicit conversions // of the arguments. *os << value; @@ -374,7 +382,7 @@ void PrintWithFallback(const T& value, ::std::ostream* os) { // The default case. template <typename ToPrint, typename OtherOperand> -class FormatForComparison { +class [[nodiscard]] FormatForComparison { public: static ::std::string Format(const ToPrint& value) { return ::testing::PrintToString(value); @@ -383,7 +391,7 @@ class FormatForComparison { // Array. template <typename ToPrint, size_t N, typename OtherOperand> -class FormatForComparison<ToPrint[N], OtherOperand> { +class [[nodiscard]] FormatForComparison<ToPrint[N], OtherOperand> { public: static ::std::string Format(const ToPrint* value) { return FormatForComparison<const ToPrint*, OtherOperand>::Format(value); @@ -469,7 +477,7 @@ std::string FormatForComparisonFailureMessage(const T1& value, // function template), as we need to partially specialize it for // reference types, which cannot be done with function templates. template <typename T> -class UniversalPrinter; +class [[nodiscard]] UniversalPrinter; // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what @@ -517,11 +525,15 @@ GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); GTEST_API_ void PrintTo(char32_t c, ::std::ostream* os); inline void PrintTo(char16_t c, ::std::ostream* os) { - PrintTo(ImplicitCast_<char32_t>(c), os); + // TODO(b/418738869): Incorrect for values not representing valid codepoints. + // Also see https://github.com/google/googletest/issues/4762. + PrintTo(static_cast<char32_t>(c), os); } #ifdef __cpp_lib_char8_t inline void PrintTo(char8_t c, ::std::ostream* os) { - PrintTo(ImplicitCast_<char32_t>(c), os); + // TODO(b/418738869): Incorrect for values not representing valid codepoints. + // Also see https://github.com/google/googletest/issues/4762. + PrintTo(static_cast<char32_t>(c), os); } #endif @@ -691,44 +703,63 @@ void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { } } -// Overloads for ::std::string. -GTEST_API_ void PrintStringTo(const ::std::string& s, ::std::ostream* os); +// Overloads for ::std::string and ::std::string_view +GTEST_API_ void PrintStringTo(::std::string_view s, ::std::ostream* os); inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } +inline void PrintTo(::std::string_view s, ::std::ostream* os) { + PrintStringTo(s, os); +} -// Overloads for ::std::u8string +// Overloads for ::std::u8string and ::std::u8string_view #ifdef __cpp_lib_char8_t -GTEST_API_ void PrintU8StringTo(const ::std::u8string& s, ::std::ostream* os); +GTEST_API_ void PrintU8StringTo(::std::u8string_view s, ::std::ostream* os); inline void PrintTo(const ::std::u8string& s, ::std::ostream* os) { PrintU8StringTo(s, os); } +inline void PrintTo(::std::u8string_view s, ::std::ostream* os) { + PrintU8StringTo(s, os); +} #endif -// Overloads for ::std::u16string -GTEST_API_ void PrintU16StringTo(const ::std::u16string& s, ::std::ostream* os); +// Overloads for ::std::u16string and ::std::u16string_view +GTEST_API_ void PrintU16StringTo(::std::u16string_view s, ::std::ostream* os); inline void PrintTo(const ::std::u16string& s, ::std::ostream* os) { PrintU16StringTo(s, os); } +inline void PrintTo(::std::u16string_view s, ::std::ostream* os) { + PrintU16StringTo(s, os); +} -// Overloads for ::std::u32string -GTEST_API_ void PrintU32StringTo(const ::std::u32string& s, ::std::ostream* os); +// Overloads for ::std::u32string and ::std::u32string_view +GTEST_API_ void PrintU32StringTo(::std::u32string_view s, ::std::ostream* os); inline void PrintTo(const ::std::u32string& s, ::std::ostream* os) { PrintU32StringTo(s, os); } +inline void PrintTo(::std::u32string_view s, ::std::ostream* os) { + PrintU32StringTo(s, os); +} -// Overloads for ::std::wstring. +// Overloads for ::std::wstring and ::std::wstring_view #if GTEST_HAS_STD_WSTRING -GTEST_API_ void PrintWideStringTo(const ::std::wstring& s, ::std::ostream* os); +GTEST_API_ void PrintWideStringTo(::std::wstring_view s, ::std::ostream* os); inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } +inline void PrintTo(::std::wstring_view s, ::std::ostream* os) { + PrintWideStringTo(s, os); +} #endif // GTEST_HAS_STD_WSTRING #if GTEST_INTERNAL_HAS_STRING_VIEW -// Overload for internal::StringView. +// Overload for internal::StringView. Needed for build configurations where +// internal::StringView is an alias for absl::string_view, but absl::string_view +// is a distinct type from std::string_view. +template <int&... ExplicitArgumentBarrier, typename T = internal::StringView, + std::enable_if_t<!std::is_same_v<T, ::std::string_view>, int> = 0> inline void PrintTo(internal::StringView sp, ::std::ostream* os) { - PrintTo(::std::string(sp), os); + PrintStringTo(sp, os); } #endif // GTEST_INTERNAL_HAS_STRING_VIEW @@ -782,6 +813,41 @@ void PrintTo(const std::shared_ptr<T>& ptr, std::ostream* os) { (PrintSmartPointer<T>)(ptr, os, 0); } +#if GTEST_INTERNAL_HAS_COMPARE_LIB +template <typename T> +void PrintOrderingHelper(T ordering, std::ostream* os) { + if (ordering == T::less) { + *os << "(less)"; + } else if (ordering == T::greater) { + *os << "(greater)"; + } else if (ordering == T::equivalent) { + *os << "(equivalent)"; + } else { + *os << "(unknown ordering)"; + } +} + +inline void PrintTo(std::strong_ordering ordering, std::ostream* os) { + if (ordering == std::strong_ordering::equal) { + *os << "(equal)"; + } else { + PrintOrderingHelper(ordering, os); + } +} + +inline void PrintTo(std::partial_ordering ordering, std::ostream* os) { + if (ordering == std::partial_ordering::unordered) { + *os << "(unordered)"; + } else { + PrintOrderingHelper(ordering, os); + } +} + +inline void PrintTo(std::weak_ordering ordering, std::ostream* os) { + PrintOrderingHelper(ordering, os); +} +#endif + // Helper function for printing a tuple. T must be instantiated with // a tuple type. template <typename T> @@ -823,7 +889,7 @@ void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) { // Implements printing a non-reference type T by letting the compiler // pick the right overload of PrintTo() for T. template <typename T> -class UniversalPrinter { +class [[nodiscard]] UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. @@ -849,16 +915,13 @@ class UniversalPrinter { // Remove any const-qualifiers before passing a type to UniversalPrinter. template <typename T> -class UniversalPrinter<const T> : public UniversalPrinter<T> {}; - -#if GTEST_INTERNAL_HAS_ANY - -// Printer for std::any / absl::any +class [[nodiscard]] UniversalPrinter<const T> : public UniversalPrinter<T> {}; +// Printer for std::any template <> -class UniversalPrinter<Any> { +class [[nodiscard]] UniversalPrinter<std::any> { public: - static void Print(const Any& value, ::std::ostream* os) { + static void Print(const std::any& value, ::std::ostream* os) { if (value.has_value()) { *os << "value of type " << GetTypeName(value); } else { @@ -867,7 +930,7 @@ class UniversalPrinter<Any> { } private: - static std::string GetTypeName(const Any& value) { + static std::string GetTypeName(const std::any& value) { #if GTEST_HAS_RTTI return internal::GetTypeName(value.type()); #else @@ -877,16 +940,11 @@ class UniversalPrinter<Any> { } }; -#endif // GTEST_INTERNAL_HAS_ANY - -#if GTEST_INTERNAL_HAS_OPTIONAL - -// Printer for std::optional / absl::optional - +// Printer for std::optional template <typename T> -class UniversalPrinter<Optional<T>> { +class [[nodiscard]] UniversalPrinter<std::optional<T>> { public: - static void Print(const Optional<T>& value, ::std::ostream* os) { + static void Print(const std::optional<T>& value, ::std::ostream* os) { *os << '('; if (!value) { *os << "nullopt"; @@ -898,29 +956,18 @@ class UniversalPrinter<Optional<T>> { }; template <> -class UniversalPrinter<decltype(Nullopt())> { +class [[nodiscard]] UniversalPrinter<std::nullopt_t> { public: - static void Print(decltype(Nullopt()), ::std::ostream* os) { - *os << "(nullopt)"; - } + static void Print(std::nullopt_t, ::std::ostream* os) { *os << "(nullopt)"; } }; -#endif // GTEST_INTERNAL_HAS_OPTIONAL - -#if GTEST_INTERNAL_HAS_VARIANT - -// Printer for std::variant / absl::variant - +// Printer for std::variant template <typename... T> -class UniversalPrinter<Variant<T...>> { +class [[nodiscard]] UniversalPrinter<std::variant<T...>> { public: - static void Print(const Variant<T...>& value, ::std::ostream* os) { + static void Print(const std::variant<T...>& value, ::std::ostream* os) { *os << '('; -#ifdef GTEST_HAS_ABSL - absl::visit(Visitor{os, value.index()}, value); -#else std::visit(Visitor{os, value.index()}, value); -#endif // GTEST_HAS_ABSL *os << ')'; } @@ -937,8 +984,6 @@ class UniversalPrinter<Variant<T...>> { }; }; -#endif // GTEST_INTERNAL_HAS_VARIANT - // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. template <typename T> @@ -986,7 +1031,7 @@ GTEST_API_ void UniversalPrintArray(const wchar_t* begin, size_t len, // Implements printing an array type T[N]. template <typename T, size_t N> -class UniversalPrinter<T[N]> { +class [[nodiscard]] UniversalPrinter<T[N]> { public: // Prints the given array, omitting some elements when there are too // many. @@ -997,7 +1042,7 @@ class UniversalPrinter<T[N]> { // Implements printing a reference type T&. template <typename T> -class UniversalPrinter<T&> { +class [[nodiscard]] UniversalPrinter<T&> { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. @@ -1020,35 +1065,35 @@ class UniversalPrinter<T&> { // NUL-terminated string (but not the pointer) is printed. template <typename T> -class UniversalTersePrinter { +class [[nodiscard]] UniversalTersePrinter { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template <typename T> -class UniversalTersePrinter<T&> { +class [[nodiscard]] UniversalTersePrinter<T&> { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template <typename T> -class UniversalTersePrinter<std::reference_wrapper<T>> { +class [[nodiscard]] UniversalTersePrinter<std::reference_wrapper<T>> { public: static void Print(std::reference_wrapper<T> value, ::std::ostream* os) { UniversalTersePrinter<T>::Print(value.get(), os); } }; template <typename T, size_t N> -class UniversalTersePrinter<T[N]> { +class [[nodiscard]] UniversalTersePrinter<T[N]> { public: static void Print(const T (&value)[N], ::std::ostream* os) { UniversalPrinter<T[N]>::Print(value, os); } }; template <> -class UniversalTersePrinter<const char*> { +class [[nodiscard]] UniversalTersePrinter<const char*> { public: static void Print(const char* str, ::std::ostream* os) { if (str == nullptr) { @@ -1059,12 +1104,12 @@ class UniversalTersePrinter<const char*> { } }; template <> -class UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> { -}; +class [[nodiscard]] +UniversalTersePrinter<char*> : public UniversalTersePrinter<const char*> {}; #ifdef __cpp_lib_char8_t template <> -class UniversalTersePrinter<const char8_t*> { +class [[nodiscard]] UniversalTersePrinter<const char8_t*> { public: static void Print(const char8_t* str, ::std::ostream* os) { if (str == nullptr) { @@ -1075,12 +1120,12 @@ class UniversalTersePrinter<const char8_t*> { } }; template <> -class UniversalTersePrinter<char8_t*> +class [[nodiscard]] UniversalTersePrinter<char8_t*> : public UniversalTersePrinter<const char8_t*> {}; #endif template <> -class UniversalTersePrinter<const char16_t*> { +class [[nodiscard]] UniversalTersePrinter<const char16_t*> { public: static void Print(const char16_t* str, ::std::ostream* os) { if (str == nullptr) { @@ -1091,11 +1136,11 @@ class UniversalTersePrinter<const char16_t*> { } }; template <> -class UniversalTersePrinter<char16_t*> +class [[nodiscard]] UniversalTersePrinter<char16_t*> : public UniversalTersePrinter<const char16_t*> {}; template <> -class UniversalTersePrinter<const char32_t*> { +class [[nodiscard]] UniversalTersePrinter<const char32_t*> { public: static void Print(const char32_t* str, ::std::ostream* os) { if (str == nullptr) { @@ -1106,12 +1151,12 @@ class UniversalTersePrinter<const char32_t*> { } }; template <> -class UniversalTersePrinter<char32_t*> +class [[nodiscard]] UniversalTersePrinter<char32_t*> : public UniversalTersePrinter<const char32_t*> {}; #if GTEST_HAS_STD_WSTRING template <> -class UniversalTersePrinter<const wchar_t*> { +class [[nodiscard]] UniversalTersePrinter<const wchar_t*> { public: static void Print(const wchar_t* str, ::std::ostream* os) { if (str == nullptr) { @@ -1124,7 +1169,7 @@ class UniversalTersePrinter<const wchar_t*> { #endif template <> -class UniversalTersePrinter<wchar_t*> { +class [[nodiscard]] UniversalTersePrinter<wchar_t*> { public: static void Print(wchar_t* str, ::std::ostream* os) { UniversalTersePrinter<const wchar_t*>::Print(str, os); diff --git a/deps/googletest/include/gtest/gtest-spi.h b/deps/googletest/include/gtest/gtest-spi.h index c0613b6959560b..27c2d660e0d51d 100644 --- a/deps/googletest/include/gtest/gtest-spi.h +++ b/deps/googletest/include/gtest/gtest-spi.h @@ -51,7 +51,7 @@ namespace testing { // generated in the same thread that created this object or it can intercept // all generated failures. The scope of this mock object can be controlled with // the second argument to the two arguments constructor. -class GTEST_API_ ScopedFakeTestPartResultReporter +class GTEST_API_ [[nodiscard]] ScopedFakeTestPartResultReporter : public TestPartResultReporterInterface { public: // The two possible mocking modes of this object. @@ -100,7 +100,7 @@ namespace internal { // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. -class GTEST_API_ SingleFailureChecker { +class GTEST_API_ [[nodiscard]] SingleFailureChecker { public: // The constructor remembers the arguments. SingleFailureChecker(const TestPartResultArray* results, diff --git a/deps/googletest/include/gtest/gtest-test-part.h b/deps/googletest/include/gtest/gtest-test-part.h index 41c8a9a0d0e31f..90380a973070b9 100644 --- a/deps/googletest/include/gtest/gtest-test-part.h +++ b/deps/googletest/include/gtest/gtest-test-part.h @@ -51,7 +51,7 @@ namespace testing { // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). // // Don't inherit from TestPartResult as its destructor is not virtual. -class GTEST_API_ TestPartResult { +class GTEST_API_ [[nodiscard]] TestPartResult { public: // The possible outcomes of a test part (i.e. an assertion or an // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). @@ -131,7 +131,7 @@ std::ostream& operator<<(std::ostream& os, const TestPartResult& result); // // Don't inherit from TestPartResultArray as its destructor is not // virtual. -class GTEST_API_ TestPartResultArray { +class GTEST_API_ [[nodiscard]] TestPartResultArray { public: TestPartResultArray() = default; @@ -152,7 +152,7 @@ class GTEST_API_ TestPartResultArray { }; // This interface knows how to report a test part result. -class GTEST_API_ TestPartResultReporterInterface { +class GTEST_API_ [[nodiscard]] TestPartResultReporterInterface { public: virtual ~TestPartResultReporterInterface() = default; @@ -167,7 +167,7 @@ namespace internal { // reported, it only delegates the reporting to the former result reporter. // The original result reporter is restored in the destructor. // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -class GTEST_API_ HasNewFatalFailureHelper +class GTEST_API_ [[nodiscard]] HasNewFatalFailureHelper : public TestPartResultReporterInterface { public: HasNewFatalFailureHelper(); diff --git a/deps/googletest/include/gtest/gtest-typed-test.h b/deps/googletest/include/gtest/gtest-typed-test.h index 72de536bceec8e..8575a41076ed0f 100644 --- a/deps/googletest/include/gtest/gtest-typed-test.h +++ b/deps/googletest/include/gtest/gtest-typed-test.h @@ -45,18 +45,18 @@ // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template <typename T> -class FooTest : public testing::Test { +class [[nodiscard]] FooTest : public testing::Test { public: ... - typedef std::list<T> List; + using List = ::std::list<T>; static T shared_; T value_; }; // Next, associate a list of types with the test suite, which will be -// repeated for each type in the list. The typedef is necessary for +// repeated for each type in the list. The using-declaration is necessary for // the macro to parse correctly. -typedef testing::Types<char, int, unsigned int> MyTypes; +using MyTypes = ::testing::Types<char, int, unsigned int>; TYPED_TEST_SUITE(FooTest, MyTypes); // If the type list contains only one type, you can write that type @@ -123,7 +123,7 @@ TYPED_TEST(FooTest, HasPropertyA) { ... } // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template <typename T> -class FooTest : public testing::Test { +class [[nodiscard]] FooTest : public testing::Test { ... }; @@ -157,7 +157,7 @@ REGISTER_TYPED_TEST_SUITE_P(FooTest, // argument to the INSTANTIATE_* macro is a prefix that will be added // to the actual test suite name. Remember to pick unique prefixes for // different instances. -typedef testing::Types<char, int, unsigned int> MyTypes; +using MyTypes = ::testing::Types<char, int, unsigned int>; INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); // If the type list contains only one type, you can write that type @@ -205,8 +205,8 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); typedef gtest_TypeParam_ TypeParam; \ void TestBody() override; \ }; \ - static bool gtest_##CaseName##_##TestName##_registered_ \ - GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \ + [[maybe_unused]] static bool gtest_##CaseName##_##TestName##_registered_ = \ + ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel<GTEST_TEST_CLASS_NAME_(CaseName, \ TestName)>, \ @@ -267,22 +267,22 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); TYPED_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define TYPED_TEST_P(SuiteName, TestName) \ - namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ - template <typename gtest_TypeParam_> \ - class TestName : public SuiteName<gtest_TypeParam_> { \ - private: \ - typedef SuiteName<gtest_TypeParam_> TestFixture; \ - typedef gtest_TypeParam_ TypeParam; \ - void TestBody() override; \ - }; \ - static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ - GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ - __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \ - GTEST_STRINGIFY_(TestName)); \ - } \ - template <typename gtest_TypeParam_> \ - void GTEST_SUITE_NAMESPACE_( \ +#define TYPED_TEST_P(SuiteName, TestName) \ + namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ + template <typename gtest_TypeParam_> \ + class TestName : public SuiteName<gtest_TypeParam_> { \ + private: \ + typedef SuiteName<gtest_TypeParam_> TestFixture; \ + typedef gtest_TypeParam_ TypeParam; \ + void TestBody() override; \ + }; \ + [[maybe_unused]] static bool gtest_##TestName##_defined_ = \ + GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ + __FILE__, __LINE__, GTEST_STRINGIFY_(SuiteName), \ + GTEST_STRINGIFY_(TestName)); \ + } \ + template <typename gtest_TypeParam_> \ + void GTEST_SUITE_NAMESPACE_( \ SuiteName)::TestName<gtest_TypeParam_>::TestBody() // Note: this won't work correctly if the trailing arguments are macros. @@ -290,8 +290,8 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \ } \ - static const char* const GTEST_REGISTERED_TEST_NAMES_( \ - SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ + [[maybe_unused]] static const char* const GTEST_REGISTERED_TEST_NAMES_( \ + SuiteName) = \ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ GTEST_STRINGIFY_(SuiteName), __FILE__, __LINE__, #__VA_ARGS__) @@ -306,7 +306,7 @@ INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ static_assert(sizeof(GTEST_STRINGIFY_(Prefix)) > 1, \ "test-suit-prefix must not be empty"); \ - static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ + [[maybe_unused]] static bool gtest_##Prefix##_##SuiteName = \ ::testing::internal::TypeParameterizedTestSuite< \ SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ ::testing::internal::GenerateTypeList<Types>::type>:: \ diff --git a/deps/googletest/include/gtest/gtest.h b/deps/googletest/include/gtest/gtest.h index 45400fd0b2ccd7..b63685380c8a14 100644 --- a/deps/googletest/include/gtest/gtest.h +++ b/deps/googletest/include/gtest/gtest.h @@ -60,16 +60,16 @@ #include <type_traits> #include <vector> -#include "gtest/gtest-assertion-result.h" -#include "gtest/gtest-death-test.h" -#include "gtest/gtest-matchers.h" -#include "gtest/gtest-message.h" -#include "gtest/gtest-param-test.h" -#include "gtest/gtest-printers.h" -#include "gtest/gtest-test-part.h" -#include "gtest/gtest-typed-test.h" -#include "gtest/gtest_pred_impl.h" -#include "gtest/gtest_prod.h" +#include "gtest/gtest-assertion-result.h" // IWYU pragma: export +#include "gtest/gtest-death-test.h" // IWYU pragma: export +#include "gtest/gtest-matchers.h" // IWYU pragma: export +#include "gtest/gtest-message.h" // IWYU pragma: export +#include "gtest/gtest-param-test.h" // IWYU pragma: export +#include "gtest/gtest-printers.h" // IWYU pragma: export +#include "gtest/gtest-test-part.h" // IWYU pragma: export +#include "gtest/gtest-typed-test.h" // IWYU pragma: export +#include "gtest/gtest_pred_impl.h" // IWYU pragma: export +#include "gtest/gtest_prod.h" // IWYU pragma: export #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" @@ -193,7 +193,7 @@ std::set<std::string>* GetIgnoredParameterizedTestSuites(); // A base class that prevents subclasses from being copyable. // We do this instead of using '= delete' so as to avoid triggering warnings // inside user code regarding any of our declarations. -class GTestNonCopyable { +class [[nodiscard]] GTestNonCopyable { public: GTestNonCopyable() = default; GTestNonCopyable(const GTestNonCopyable&) = delete; @@ -206,15 +206,15 @@ class GTestNonCopyable { // The friend relationship of some of these classes is cyclic. // If we don't forward declare them the compiler might confuse the classes // in friendship clauses with same named classes on the scope. -class Test; -class TestSuite; +class [[nodiscard]] Test; +class [[nodiscard]] TestSuite; // Old API is still available but deprecated #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ using TestCase = TestSuite; #endif -class TestInfo; -class UnitTest; +class [[nodiscard]] TestInfo; +class [[nodiscard]] UnitTest; // The abstract class that all tests inherit from. // @@ -239,7 +239,7 @@ class UnitTest; // TEST_F(FooTest, Baz) { ... } // // Test is not copyable. -class GTEST_API_ Test { +class GTEST_API_ [[nodiscard]] Test { public: friend class TestInfo; @@ -366,7 +366,7 @@ typedef internal::TimeInMillis TimeInMillis; // output as a key/value string pair. // // Don't inherit from TestProperty as its destructor is not virtual. -class TestProperty { +class [[nodiscard]] TestProperty { public: // C'tor. TestProperty does NOT have a default constructor. // Always use this constructor (with parameters) to create a @@ -396,7 +396,7 @@ class TestProperty { // the Test. // // TestResult is not copyable. -class GTEST_API_ TestResult { +class GTEST_API_ [[nodiscard]] TestResult { public: // Creates an empty TestResult. TestResult(); @@ -530,7 +530,7 @@ class GTEST_API_ TestResult { // The constructor of TestInfo registers itself with the UnitTest // singleton such that the RUN_ALL_TESTS() macro knows which tests to // run. -class GTEST_API_ TestInfo { +class GTEST_API_ [[nodiscard]] TestInfo { public: // Destructs a TestInfo object. This function is not virtual, so // don't inherit from TestInfo. @@ -607,7 +607,7 @@ class GTEST_API_ TestInfo { friend class internal::UnitTestImpl; friend class internal::StreamingListenerTest; friend TestInfo* internal::MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, + std::string test_suite_name, const char* name, const char* type_param, const char* value_param, internal::CodeLocation code_location, internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, @@ -615,7 +615,7 @@ class GTEST_API_ TestInfo { // Constructs a TestInfo object. The newly constructed instance assumes // ownership of the factory object. - TestInfo(const std::string& test_suite_name, const std::string& name, + TestInfo(std::string test_suite_name, std::string name, const char* a_type_param, // NULL if not a type-parameterized test const char* a_value_param, // NULL if not a value-parameterized test internal::CodeLocation a_code_location, @@ -669,7 +669,7 @@ class GTEST_API_ TestInfo { // A test suite, which consists of a vector of TestInfos. // // TestSuite is not copyable. -class GTEST_API_ TestSuite { +class GTEST_API_ [[nodiscard]] TestSuite { public: // Creates a TestSuite with the given name. // @@ -683,7 +683,7 @@ class GTEST_API_ TestSuite { // this is not a type-parameterized test. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite - TestSuite(const char* name, const char* a_type_param, + TestSuite(const std::string& name, const char* a_type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc); @@ -890,7 +890,7 @@ class GTEST_API_ TestSuite { // available. // 2. You cannot use ASSERT_* directly in a constructor or // destructor. -class Environment { +class [[nodiscard]] Environment { public: // The d'tor is virtual as we need to subclass Environment. virtual ~Environment() = default; @@ -911,7 +911,7 @@ class Environment { #if GTEST_HAS_EXCEPTIONS // Exception which can be thrown from TestEventListener::OnTestPartResult. -class GTEST_API_ AssertionException +class GTEST_API_ [[nodiscard]] AssertionException : public internal::GoogleTestFailureException { public: explicit AssertionException(const TestPartResult& result) @@ -922,7 +922,7 @@ class GTEST_API_ AssertionException // The interface for tracing execution of tests. The methods are organized in // the order the corresponding events are fired. -class TestEventListener { +class [[nodiscard]] TestEventListener { public: virtual ~TestEventListener() = default; @@ -989,7 +989,7 @@ class TestEventListener { // the methods they override will not be caught during the build. For // comments about each method please see the definition of TestEventListener // above. -class EmptyTestEventListener : public TestEventListener { +class [[nodiscard]] EmptyTestEventListener : public TestEventListener { public: void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} void OnTestIterationStart(const UnitTest& /*unit_test*/, @@ -1019,7 +1019,7 @@ class EmptyTestEventListener : public TestEventListener { }; // TestEventListeners lets users add listeners to track events in Google Test. -class GTEST_API_ TestEventListeners { +class GTEST_API_ [[nodiscard]] TestEventListeners { public: TestEventListeners(); ~TestEventListeners(); @@ -1110,7 +1110,7 @@ class GTEST_API_ TestEventListeners { // // This class is thread-safe as long as the methods are called // according to their specification. -class GTEST_API_ UnitTest { +class GTEST_API_ [[nodiscard]] UnitTest { public: // Gets the singleton UnitTest object. The first time this method // is called, a UnitTest object is constructed and returned. @@ -1123,7 +1123,7 @@ class GTEST_API_ UnitTest { // This method can only be called from the main thread. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - int Run() GTEST_MUST_USE_RESULT_; + [[nodiscard]] int Run(); // Returns the working directory when the first TEST() or TEST_F() // was executed. The UnitTest object owns the string. @@ -1262,6 +1262,20 @@ class GTEST_API_ UnitTest { // total_test_suite_count() - 1. If i is not in that range, returns NULL. TestSuite* GetMutableTestSuite(int i); + // Invokes OsStackTrackGetterInterface::UponLeavingGTest. UponLeavingGTest() + // should be called immediately before Google Test calls user code. It saves + // some information about the current stack that CurrentStackTrace() will use + // to find and hide Google Test stack frames. + void UponLeavingGTest(); + + // Sets the TestSuite object for the test that's currently running. + void set_current_test_suite(TestSuite* a_current_test_suite) + GTEST_LOCK_EXCLUDED_(mutex_); + + // Sets the TestInfo object for the test that's currently running. + void set_current_test_info(TestInfo* a_current_test_info) + GTEST_LOCK_EXCLUDED_(mutex_); + // Accessors for the implementation object. internal::UnitTestImpl* impl() { return impl_; } const internal::UnitTestImpl* impl() const { return impl_; } @@ -1270,6 +1284,8 @@ class GTEST_API_ UnitTest { // members of UnitTest. friend class ScopedTrace; friend class Test; + friend class TestInfo; + friend class TestSuite; friend class internal::AssertHelper; friend class internal::StreamingListenerTest; friend class internal::UnitTestRecordPropertyTestHelper; @@ -1382,7 +1398,7 @@ AssertionResult CmpHelperEQ(const char* lhs_expression, return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs); } -class EqHelper { +class [[nodiscard]] EqHelper { public: // This templatized version is for the general case. template < @@ -1594,9 +1610,11 @@ GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, double val1, double val2, double abs_error); +using GoogleTest_NotSupported_OnFunctionReturningNonVoid = void; + // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // A class that enables one to stream messages to assertion macros -class GTEST_API_ AssertHelper { +class GTEST_API_ [[nodiscard]] AssertHelper { public: // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, @@ -1605,7 +1623,8 @@ class GTEST_API_ AssertHelper { // Message assignment is a semantic trick to enable assertion // streaming; see the GTEST_MESSAGE_ macro below. - void operator=(const Message& message) const; + GoogleTest_NotSupported_OnFunctionReturningNonVoid operator=( + const Message& message) const; private: // We put our data in a struct so that the size of the AssertHelper class can @@ -1670,14 +1689,14 @@ class GTEST_API_ AssertHelper { // INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); template <typename T> -class WithParamInterface { +class [[nodiscard]] WithParamInterface { public: typedef T ParamType; virtual ~WithParamInterface() = default; // The current parameter value. Is also available in the test fixture's // constructor. - static const ParamType& GetParam() { + [[nodiscard]] static const ParamType& GetParam() { GTEST_CHECK_(parameter_ != nullptr) << "GetParam() can only be called inside a value-parameterized test " << "-- did you intend to write TEST_P instead of TEST_F?"; @@ -1704,7 +1723,8 @@ const T* WithParamInterface<T>::parameter_ = nullptr; // WithParamInterface, and can just inherit from ::testing::TestWithParam. template <typename T> -class TestWithParam : public Test, public WithParamInterface<T> {}; +class [[nodiscard]] TestWithParam : public Test, + public WithParamInterface<T> {}; // Macros for indicating success/failure in test code. @@ -2052,7 +2072,7 @@ GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, // Example: // testing::ScopedTrace trace("file.cc", 123, "message"); // -class GTEST_API_ ScopedTrace { +class GTEST_API_ [[nodiscard]] ScopedTrace { public: // The c'tor pushes the given source file location and message onto // a trace stack maintained by Google Test. @@ -2308,11 +2328,12 @@ TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, // tests are successful, or 1 otherwise. // // RUN_ALL_TESTS() should be invoked after the command line has been -// parsed by InitGoogleTest(). +// parsed by InitGoogleTest(). RUN_ALL_TESTS will tear down and delete any +// installed environments and should only be called once per binary. // // This function was formerly a macro; thus, it is in the global // namespace and has an all-caps name. -int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_; +[[nodiscard]] int RUN_ALL_TESTS(); inline int RUN_ALL_TESTS() { return ::testing::UnitTest::GetInstance()->Run(); } diff --git a/deps/googletest/include/gtest/internal/gtest-death-test-internal.h b/deps/googletest/include/gtest/internal/gtest-death-test-internal.h index 61536d6572d36c..6013a57bfe9f69 100644 --- a/deps/googletest/include/gtest/internal/gtest-death-test-internal.h +++ b/deps/googletest/include/gtest/internal/gtest-death-test-internal.h @@ -46,6 +46,7 @@ #include "gtest/gtest-matchers.h" #include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-port.h" GTEST_DECLARE_string_(internal_run_death_test); @@ -55,6 +56,28 @@ namespace internal { // Name of the flag (needed for parsing Google Test flag). const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; +// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads +// and interpreted as a regex (rather than an Eq matcher) for legacy +// compatibility. +inline Matcher<const ::std::string&> MakeDeathTestMatcher( + ::testing::internal::RE regex) { + return ContainsRegex(regex.pattern()); +} +inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) { + return ContainsRegex(regex); +} +inline Matcher<const ::std::string&> MakeDeathTestMatcher( + const ::std::string& regex) { + return ContainsRegex(regex); +} + +// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's +// used directly. +inline Matcher<const ::std::string&> MakeDeathTestMatcher( + Matcher<const ::std::string&> matcher) { + return matcher; +} + #ifdef GTEST_HAS_DEATH_TEST GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ @@ -71,9 +94,9 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ // // exit status: The integer exit information in the format specified // by wait(2) -// exit code: The integer code passed to exit(3), _exit(2), or +// exit code: The integer code passed to exit(3), _Exit(2), or // returned from main() -class GTEST_API_ DeathTest { +class GTEST_API_ [[nodiscard]] DeathTest { public: // Create returns false if there was an error determining the // appropriate action to take for the current death test; for example, @@ -149,7 +172,7 @@ class GTEST_API_ DeathTest { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 // Factory interface for death tests. May be mocked out for testing. -class DeathTestFactory { +class [[nodiscard]] DeathTestFactory { public: virtual ~DeathTestFactory() = default; virtual bool Create(const char* statement, @@ -158,7 +181,7 @@ class DeathTestFactory { }; // A concrete DeathTestFactory implementation for normal use. -class DefaultDeathTestFactory : public DeathTestFactory { +class [[nodiscard]] DefaultDeathTestFactory : public DeathTestFactory { public: bool Create(const char* statement, Matcher<const std::string&> matcher, const char* file, int line, DeathTest** test) override; @@ -168,28 +191,6 @@ class DefaultDeathTestFactory : public DeathTestFactory { // by a signal, or exited normally with a nonzero exit code. GTEST_API_ bool ExitedUnsuccessfully(int exit_status); -// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads -// and interpreted as a regex (rather than an Eq matcher) for legacy -// compatibility. -inline Matcher<const ::std::string&> MakeDeathTestMatcher( - ::testing::internal::RE regex) { - return ContainsRegex(regex.pattern()); -} -inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) { - return ContainsRegex(regex); -} -inline Matcher<const ::std::string&> MakeDeathTestMatcher( - const ::std::string& regex) { - return ContainsRegex(regex); -} - -// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's -// used directly. -inline Matcher<const ::std::string&> MakeDeathTestMatcher( - Matcher<const ::std::string&> matcher) { - return matcher; -} - // Traps C++ exceptions escaping statement and reports them as test // failures. Note that trapping SEH exceptions is not implemented here. #if GTEST_HAS_EXCEPTIONS @@ -255,19 +256,19 @@ inline Matcher<const ::std::string&> MakeDeathTestMatcher( // must accept a streamed message even though the message is never printed. // The regex object is not evaluated, but it is used to prevent "unused" // warnings and to avoid an expression that doesn't compile in debug mode. -#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } else if (!::testing::internal::AlwaysTrue()) { \ - ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ - } else \ +#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } else if (!::testing::internal::AlwaysTrue()) { \ + (void)::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ + } else \ ::testing::Message() // A class representing the parsed contents of the // --gtest_internal_run_death_test flag, as it existed when // RUN_ALL_TESTS was called. -class InternalRunDeathTestFlag { +class [[nodiscard]] InternalRunDeathTestFlag { public: InternalRunDeathTestFlag(const std::string& a_file, int a_line, int an_index, int a_write_fd) diff --git a/deps/googletest/include/gtest/internal/gtest-filepath.h b/deps/googletest/include/gtest/internal/gtest-filepath.h index 5189c81dabfa66..4dc00ee7b31503 100644 --- a/deps/googletest/include/gtest/internal/gtest-filepath.h +++ b/deps/googletest/include/gtest/internal/gtest-filepath.h @@ -43,6 +43,7 @@ #define GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #include <string> +#include <utility> #include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-string.h" @@ -66,12 +67,13 @@ namespace internal { // Names are NOT checked for syntax correctness -- no checking for illegal // characters, malformed paths, etc. -class GTEST_API_ FilePath { +class GTEST_API_ [[nodiscard]] FilePath { public: FilePath() : pathname_("") {} FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) {} + FilePath(FilePath&& rhs) noexcept : pathname_(std::move(rhs.pathname_)) {} - explicit FilePath(const std::string& pathname) : pathname_(pathname) { + explicit FilePath(std::string pathname) : pathname_(std::move(pathname)) { Normalize(); } @@ -79,6 +81,10 @@ class GTEST_API_ FilePath { Set(rhs); return *this; } + FilePath& operator=(FilePath&& rhs) noexcept { + pathname_ = std::move(rhs.pathname_); + return *this; + } void Set(const FilePath& rhs) { pathname_ = rhs.pathname_; } diff --git a/deps/googletest/include/gtest/internal/gtest-internal.h b/deps/googletest/include/gtest/internal/gtest-internal.h index 806b08624cb45a..4379137d77eba3 100644 --- a/deps/googletest/include/gtest/internal/gtest-internal.h +++ b/deps/googletest/include/gtest/internal/gtest-internal.h @@ -95,7 +95,7 @@ #define GTEST_STRINGIFY_(...) GTEST_STRINGIFY_HELPER_(__VA_ARGS__, ) namespace proto2 { -class MessageLite; +class [[nodiscard]] MessageLite; } namespace testing { @@ -115,15 +115,15 @@ ::std::string PrintToString(const T& value); namespace internal { struct TraceInfo; // Information about a trace point. -class TestInfoImpl; // Opaque implementation of TestInfo -class UnitTestImpl; // Opaque implementation of UnitTest +class [[nodiscard]] TestInfoImpl; // Opaque implementation of TestInfo +class [[nodiscard]] UnitTestImpl; // Opaque implementation of UnitTest // The text used in failure messages to indicate the start of the // stack trace. GTEST_API_ extern const char kStackTraceMarker[]; // An IgnoredValue object can be implicitly constructed from ANY value. -class IgnoredValue { +class [[nodiscard]] IgnoredValue { struct Sink {}; public: @@ -155,7 +155,8 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_( // errors presumably detectable only at run time. Since // std::runtime_error inherits from std::exception, many testing // frameworks know how to extract and print the message inside it. -class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { +class GTEST_API_ [[nodiscard]] GoogleTestFailureException + : public ::std::runtime_error { public: explicit GoogleTestFailureException(const TestPartResult& failure); }; @@ -242,7 +243,7 @@ GTEST_API_ std::string GetBoolAssertionFailureMessage( // // RawType: the raw floating-point type (either float or double) template <typename RawType> -class FloatingPoint { +class [[nodiscard]] FloatingPoint { public: // Defines the unsigned integer type that has the same size as the // floating point number. @@ -290,17 +291,17 @@ class FloatingPoint { // around may change its bits, although the new value is guaranteed // to be also a NAN. Therefore, don't expect this constructor to // preserve the bits in x when x is a NAN. - explicit FloatingPoint(const RawType& x) { u_.value_ = x; } + explicit FloatingPoint(RawType x) { memcpy(&bits_, &x, sizeof(x)); } // Static methods // Reinterprets a bit pattern as a floating-point number. // // This function is needed to test the AlmostEquals() method. - static RawType ReinterpretBits(const Bits bits) { - FloatingPoint fp(0); - fp.u_.bits_ = bits; - return fp.u_.value_; + static RawType ReinterpretBits(Bits bits) { + RawType fp; + memcpy(&fp, &bits, sizeof(fp)); + return fp; } // Returns the floating-point number that represent positive infinity. @@ -309,16 +310,16 @@ class FloatingPoint { // Non-static methods // Returns the bits that represents this number. - const Bits& bits() const { return u_.bits_; } + const Bits& bits() const { return bits_; } // Returns the exponent bits of this number. - Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } + Bits exponent_bits() const { return kExponentBitMask & bits_; } // Returns the fraction bits of this number. - Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } + Bits fraction_bits() const { return kFractionBitMask & bits_; } // Returns the sign bit of this number. - Bits sign_bit() const { return kSignBitMask & u_.bits_; } + Bits sign_bit() const { return kSignBitMask & bits_; } // Returns true if and only if this is NAN (not a number). bool is_nan() const { @@ -332,23 +333,16 @@ class FloatingPoint { // // - returns false if either number is (or both are) NAN. // - treats really large numbers as almost equal to infinity. - // - thinks +0.0 and -0.0 are 0 DLP's apart. + // - thinks +0.0 and -0.0 are 0 ULP's apart. bool AlmostEquals(const FloatingPoint& rhs) const { // The IEEE standard says that any comparison operation involving // a NAN must return false. if (is_nan() || rhs.is_nan()) return false; - return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= - kMaxUlps; + return DistanceBetweenSignAndMagnitudeNumbers(bits_, rhs.bits_) <= kMaxUlps; } private: - // The data type used to store the actual floating-point number. - union FloatingPointUnion { - RawType value_; // The raw floating-point number. - Bits bits_; // The bits that represent the number. - }; - // Converts an integer from the sign-and-magnitude representation to // the biased representation. More precisely, let N be 2 to the // power of (kBitCount - 1), an integer x is represented by the @@ -364,7 +358,7 @@ class FloatingPoint { // // Read https://en.wikipedia.org/wiki/Signed_number_representations // for more details on signed number representations. - static Bits SignAndMagnitudeToBiased(const Bits& sam) { + static Bits SignAndMagnitudeToBiased(Bits sam) { if (kSignBitMask & sam) { // sam represents a negative number. return ~sam + 1; @@ -376,14 +370,13 @@ class FloatingPoint { // Given two numbers in the sign-and-magnitude representation, // returns the distance between them as an unsigned number. - static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits& sam1, - const Bits& sam2) { + static Bits DistanceBetweenSignAndMagnitudeNumbers(Bits sam1, Bits sam2) { const Bits biased1 = SignAndMagnitudeToBiased(sam1); const Bits biased2 = SignAndMagnitudeToBiased(sam2); return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); } - FloatingPointUnion u_; + Bits bits_; // The bits that represent the number. }; // Typedefs the instances of the FloatingPoint template class that we @@ -400,7 +393,7 @@ typedef FloatingPoint<double> Double; typedef const void* TypeId; template <typename T> -class TypeIdHelper { +class [[nodiscard]] TypeIdHelper { public: // dummy_ must not have a const type. Otherwise an overly eager // compiler (e.g. MSVC 7.1 & 8.0) may try to merge @@ -432,7 +425,7 @@ GTEST_API_ TypeId GetTestTypeId(); // Defines the abstract factory interface that creates instances // of a Test object. -class TestFactoryBase { +class [[nodiscard]] TestFactoryBase { public: virtual ~TestFactoryBase() = default; @@ -451,7 +444,7 @@ class TestFactoryBase { // This class provides implementation of TestFactoryBase interface. // It is used in TEST and TEST_F macros. template <class TestClass> -class TestFactoryImpl : public TestFactoryBase { +class [[nodiscard]] TestFactoryImpl : public TestFactoryBase { public: Test* CreateTest() override { return new TestClass; } }; @@ -474,8 +467,8 @@ using SetUpTestSuiteFunc = void (*)(); using TearDownTestSuiteFunc = void (*)(); struct CodeLocation { - CodeLocation(const std::string& a_file, int a_line) - : file(a_file), line(a_line) {} + CodeLocation(std::string a_file, int a_line) + : file(std::move(a_file)), line(a_line) {} std::string file; int line; @@ -564,7 +557,7 @@ struct SuiteApiResolver : T { // The newly created TestInfo instance will assume // ownership of the factory object. GTEST_API_ TestInfo* MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, + std::string test_suite_name, const char* name, const char* type_param, const char* value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory); @@ -578,7 +571,7 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) // State of the definition of a type-parameterized test suite. -class GTEST_API_ TypedTestSuitePState { +class GTEST_API_ [[nodiscard]] TypedTestSuitePState { public: TypedTestSuitePState() : registered_(false) {} @@ -595,8 +588,7 @@ class GTEST_API_ TypedTestSuitePState { fflush(stderr); posix::Abort(); } - registered_tests_.insert( - ::std::make_pair(test_name, CodeLocation(file, line))); + registered_tests_.emplace(test_name, CodeLocation(file, line)); return true; } @@ -694,13 +686,13 @@ std::vector<std::string> GenerateNames() { // Implementation note: The GTEST_TEMPLATE_ macro declares a template // template parameter. It's defined in gtest-type-util.h. template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types> -class TypeParameterizedTest { +class [[nodiscard]] TypeParameterizedTest { public: // 'index' is the index of the test in the type list 'Types' // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite, // Types). Valid values for 'index' are [0, N - 1] where N is the // length of Types. - static bool Register(const char* prefix, const CodeLocation& code_location, + static bool Register(const char* prefix, CodeLocation code_location, const char* case_name, const char* test_names, int index, const std::vector<std::string>& type_names = GenerateNames<DefaultNameGenerator, Types>()) { @@ -712,8 +704,7 @@ class TypeParameterizedTest { // list. MakeAndRegisterTestInfo( (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + - "/" + type_names[static_cast<size_t>(index)]) - .c_str(), + "/" + type_names[static_cast<size_t>(index)]), StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), GetTypeName<Type>().c_str(), nullptr, // No value parameter. @@ -725,21 +716,17 @@ class TypeParameterizedTest { new TestFactoryImpl<TestClass>); // Next, recurses (at compile time) with the tail of the type list. - return TypeParameterizedTest<Fixture, TestSel, - typename Types::Tail>::Register(prefix, - code_location, - case_name, - test_names, - index + 1, - type_names); + return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>:: + Register(prefix, std::move(code_location), case_name, test_names, + index + 1, type_names); } }; // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, class TestSel> -class TypeParameterizedTest<Fixture, TestSel, internal::None> { +class [[nodiscard]] TypeParameterizedTest<Fixture, TestSel, internal::None> { public: - static bool Register(const char* /*prefix*/, const CodeLocation&, + static bool Register(const char* /*prefix*/, CodeLocation, const char* /*case_name*/, const char* /*test_names*/, int /*index*/, const std::vector<std::string>& = @@ -758,7 +745,7 @@ GTEST_API_ void RegisterTypeParameterizedTestSuiteInstantiation( // Test. The return value is insignificant - we just need to return // something such that we can call this function in a namespace scope. template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types> -class TypeParameterizedTestSuite { +class [[nodiscard]] TypeParameterizedTestSuite { public: static bool Register(const char* prefix, CodeLocation code_location, const TypedTestSuitePState* state, const char* case_name, @@ -786,7 +773,8 @@ class TypeParameterizedTestSuite { // Next, recurses (at compile time) with the tail of the test list. return TypeParameterizedTestSuite<Fixture, typename Tests::Tail, - Types>::Register(prefix, code_location, + Types>::Register(prefix, + std::move(code_location), state, case_name, SkipComma(test_names), type_names); @@ -795,7 +783,7 @@ class TypeParameterizedTestSuite { // The base case for the compile time recursion. template <GTEST_TEMPLATE_ Fixture, typename Types> -class TypeParameterizedTestSuite<Fixture, internal::None, Types> { +class [[nodiscard]] TypeParameterizedTestSuite<Fixture, internal::None, Types> { public: static bool Register(const char* /*prefix*/, const CodeLocation&, const TypedTestSuitePState* /*state*/, @@ -851,7 +839,7 @@ struct TrueWithString { // doesn't use global state (and therefore can't interfere with user // code). Unlike rand_r(), it's portable. An LCG isn't very random, // but it's good enough for our purposes. -class GTEST_API_ Random { +class GTEST_API_ [[nodiscard]] Random { public: static const uint32_t kMaxRange = 1u << 31; @@ -877,7 +865,7 @@ class GTEST_API_ Random { // that's true if and only if T has methods DebugString() and ShortDebugString() // that return std::string. template <typename T> -class HasDebugStringAndShortDebugString { +class [[nodiscard]] HasDebugStringAndShortDebugString { private: template <typename C> static auto CheckDebugString(C*) -> typename std::is_same< @@ -899,11 +887,6 @@ class HasDebugStringAndShortDebugString { HasDebugStringType::value && HasShortDebugStringType::value; }; -#ifdef GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL -template <typename T> -constexpr bool HasDebugStringAndShortDebugString<T>::value; -#endif - // When the compiler sees expression IsContainerTest<C>(0), if C is an // STL-style container class, the first overload of IsContainerTest // will be viable (since both C::iterator* and C::const_iterator* are @@ -1082,7 +1065,7 @@ struct RelationToSourceCopy {}; // this requirement. Element can be an array type itself (hence // multi-dimensional arrays are supported). template <typename Element> -class NativeArray { +class [[nodiscard]] NativeArray { public: // STL-style container typedefs. typedef Element value_type; @@ -1142,40 +1125,6 @@ class NativeArray { void (NativeArray::*clone_)(const Element*, size_t); }; -// Backport of std::index_sequence. -template <size_t... Is> -struct IndexSequence { - using type = IndexSequence; -}; - -// Double the IndexSequence, and one if plus_one is true. -template <bool plus_one, typename T, size_t sizeofT> -struct DoubleSequence; -template <size_t... I, size_t sizeofT> -struct DoubleSequence<true, IndexSequence<I...>, sizeofT> { - using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>; -}; -template <size_t... I, size_t sizeofT> -struct DoubleSequence<false, IndexSequence<I...>, sizeofT> { - using type = IndexSequence<I..., (sizeofT + I)...>; -}; - -// Backport of std::make_index_sequence. -// It uses O(ln(N)) instantiation depth. -template <size_t N> -struct MakeIndexSequenceImpl - : DoubleSequence<N % 2 == 1, typename MakeIndexSequenceImpl<N / 2>::type, - N / 2>::type {}; - -template <> -struct MakeIndexSequenceImpl<0> : IndexSequence<> {}; - -template <size_t N> -using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::type; - -template <typename... T> -using IndexSequenceFor = typename MakeIndexSequence<sizeof...(T)>::type; - template <size_t> struct Ignore { Ignore(...); // NOLINT @@ -1184,7 +1133,7 @@ struct Ignore { template <typename> struct ElemFromListImpl; template <size_t... I> -struct ElemFromListImpl<IndexSequence<I...>> { +struct ElemFromListImpl<std::index_sequence<I...>> { // We make Ignore a template to solve a problem with MSVC. // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but // MSVC doesn't understand how to deal with that pack expansion. @@ -1195,15 +1144,14 @@ struct ElemFromListImpl<IndexSequence<I...>> { template <size_t N, typename... T> struct ElemFromList { - using type = - decltype(ElemFromListImpl<typename MakeIndexSequence<N>::type>::Apply( - static_cast<T (*)()>(nullptr)...)); + using type = decltype(ElemFromListImpl<std::make_index_sequence<N>>::Apply( + static_cast<T (*)()>(nullptr)...)); }; struct FlatTupleConstructTag {}; template <typename... T> -class FlatTuple; +class [[nodiscard]] FlatTuple; template <typename Derived, size_t I> struct FlatTupleElemBase; @@ -1222,9 +1170,9 @@ template <typename Derived, typename Idx> struct FlatTupleBase; template <size_t... Idx, typename... T> -struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>> +struct FlatTupleBase<FlatTuple<T...>, std::index_sequence<Idx...>> : FlatTupleElemBase<FlatTuple<T...>, Idx>... { - using Indices = IndexSequence<Idx...>; + using Indices = std::index_sequence<Idx...>; FlatTupleBase() = default; template <typename... Args> explicit FlatTupleBase(FlatTupleConstructTag, Args&&... args) @@ -1259,14 +1207,15 @@ struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>> // implementations. // FlatTuple and ElemFromList are not recursive and have a fixed depth // regardless of T... -// MakeIndexSequence, on the other hand, it is recursive but with an +// std::make_index_sequence, on the other hand, it is recursive but with an // instantiation depth of O(ln(N)). template <typename... T> -class FlatTuple +class [[nodiscard]] FlatTuple : private FlatTupleBase<FlatTuple<T...>, - typename MakeIndexSequence<sizeof...(T)>::type> { - using Indices = typename FlatTupleBase< - FlatTuple<T...>, typename MakeIndexSequence<sizeof...(T)>::type>::Indices; + std::make_index_sequence<sizeof...(T)>> { + using Indices = + typename FlatTupleBase<FlatTuple<T...>, + std::make_index_sequence<sizeof...(T)>>::Indices; public: FlatTuple() = default; @@ -1280,30 +1229,40 @@ class FlatTuple // Utility functions to be called with static_assert to induce deprecation // warnings. -GTEST_INTERNAL_DEPRECATED( +[[deprecated( "INSTANTIATE_TEST_CASE_P is deprecated, please use " - "INSTANTIATE_TEST_SUITE_P") -constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; } + "INSTANTIATE_TEST_SUITE_P")]] +constexpr bool InstantiateTestCase_P_IsDeprecated() { + return true; +} -GTEST_INTERNAL_DEPRECATED( +[[deprecated( "TYPED_TEST_CASE_P is deprecated, please use " - "TYPED_TEST_SUITE_P") -constexpr bool TypedTestCase_P_IsDeprecated() { return true; } + "TYPED_TEST_SUITE_P")]] +constexpr bool TypedTestCase_P_IsDeprecated() { + return true; +} -GTEST_INTERNAL_DEPRECATED( +[[deprecated( "TYPED_TEST_CASE is deprecated, please use " - "TYPED_TEST_SUITE") -constexpr bool TypedTestCaseIsDeprecated() { return true; } + "TYPED_TEST_SUITE")]] +constexpr bool TypedTestCaseIsDeprecated() { + return true; +} -GTEST_INTERNAL_DEPRECATED( +[[deprecated( "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " - "REGISTER_TYPED_TEST_SUITE_P") -constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; } + "REGISTER_TYPED_TEST_SUITE_P")]] +constexpr bool RegisterTypedTestCase_P_IsDeprecated() { + return true; +} -GTEST_INTERNAL_DEPRECATED( +[[deprecated( "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " - "INSTANTIATE_TYPED_TEST_SUITE_P") -constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } + "INSTANTIATE_TYPED_TEST_SUITE_P")]] +constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { + return true; +} } // namespace internal } // namespace testing @@ -1359,7 +1318,7 @@ struct tuple_size<testing::internal::FlatTuple<Ts...>> namespace testing { namespace internal { -class NeverThrown { +class [[nodiscard]] NeverThrown { public: const char* what() const noexcept { return "this exception should never be thrown"; @@ -1540,7 +1499,7 @@ class NeverThrown { \ private: \ void TestBody() override; \ - static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ + [[maybe_unused]] static ::testing::TestInfo* const test_info_; \ }; \ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ diff --git a/deps/googletest/include/gtest/internal/gtest-param-util.h b/deps/googletest/include/gtest/internal/gtest-param-util.h index b04f7020636083..716779346a012d 100644 --- a/deps/googletest/include/gtest/internal/gtest-param-util.h +++ b/deps/googletest/include/gtest/internal/gtest-param-util.h @@ -39,6 +39,7 @@ #include <ctype.h> #include <cassert> +#include <functional> #include <iterator> #include <map> #include <memory> @@ -47,6 +48,7 @@ #include <string> #include <tuple> #include <type_traits> +#include <unordered_map> #include <utility> #include <vector> @@ -85,17 +87,17 @@ namespace internal { // TEST_P macro is used to define two tests with the same name // but in different namespaces. GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name, - CodeLocation code_location); + const CodeLocation& code_location); template <typename> -class ParamGeneratorInterface; +class [[nodiscard]] ParamGeneratorInterface; template <typename> -class ParamGenerator; +class [[nodiscard]] ParamGenerator; // Interface for iterating over elements provided by an implementation // of ParamGeneratorInterface<T>. template <typename T> -class ParamIteratorInterface { +class [[nodiscard]] ParamIteratorInterface { public: virtual ~ParamIteratorInterface() = default; // A pointer to the base generator instance. @@ -125,7 +127,7 @@ class ParamIteratorInterface { // ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T> // and implements the const forward iterator concept. template <typename T> -class ParamIterator { +class [[nodiscard]] ParamIterator { public: typedef T value_type; typedef const T& reference; @@ -167,7 +169,7 @@ class ParamIterator { // ParamGeneratorInterface<T> is the binary interface to access generators // defined in other translation units. template <typename T> -class ParamGeneratorInterface { +class [[nodiscard]] ParamGeneratorInterface { public: typedef T ParamType; @@ -184,7 +186,7 @@ class ParamGeneratorInterface { // ParamGeneratorInterface<T> instance is shared among all copies // of the original object. This is possible because that instance is immutable. template <typename T> -class ParamGenerator { +class [[nodiscard]] ParamGenerator { public: typedef ParamIterator<T> iterator; @@ -208,7 +210,7 @@ class ParamGenerator { // operator<(). // This class is used in the Range() function. template <typename T, typename IncrementT> -class RangeGenerator : public ParamGeneratorInterface<T> { +class [[nodiscard]] RangeGenerator : public ParamGeneratorInterface<T> { public: RangeGenerator(T begin, T end, IncrementT step) : begin_(begin), @@ -294,7 +296,8 @@ class RangeGenerator : public ParamGeneratorInterface<T> { // since the source can be located on the stack, and the generator // is likely to persist beyond that stack frame. template <typename T> -class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { +class [[nodiscard]] ValuesInIteratorRangeGenerator + : public ParamGeneratorInterface<T> { public: template <typename ForwardIterator> ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) @@ -379,9 +382,7 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> { // integer test parameter index. template <class ParamType> std::string DefaultParamName(const TestParamInfo<ParamType>& info) { - Message name_stream; - name_stream << info.index; - return name_stream.GetString(); + return std::to_string(info.index); } template <typename T = int> @@ -396,7 +397,7 @@ void TestNotEmpty(const T&) {} // Stores a parameter value and later creates tests parameterized with that // value. template <class TestClass> -class ParameterizedTestFactory : public TestFactoryBase { +class [[nodiscard]] ParameterizedTestFactory : public TestFactoryBase { public: typedef typename TestClass::ParamType ParamType; explicit ParameterizedTestFactory(ParamType parameter) @@ -418,7 +419,7 @@ class ParameterizedTestFactory : public TestFactoryBase { // TestMetaFactoryBase is a base class for meta-factories that create // test factories for passing into MakeAndRegisterTestInfo function. template <class ParamType> -class TestMetaFactoryBase { +class [[nodiscard]] TestMetaFactoryBase { public: virtual ~TestMetaFactoryBase() = default; @@ -434,7 +435,7 @@ class TestMetaFactoryBase { // it for each Test/Parameter value combination. Thus it needs meta factory // creator class. template <class TestSuite> -class TestMetaFactory +class [[nodiscard]] TestMetaFactory : public TestMetaFactoryBase<typename TestSuite::ParamType> { public: using ParamType = typename TestSuite::ParamType; @@ -460,7 +461,7 @@ class TestMetaFactory // in RegisterTests method. The ParameterizeTestSuiteRegistry class holds // a collection of pointers to the ParameterizedTestSuiteInfo objects // and calls RegisterTests() on each of them when asked. -class ParameterizedTestSuiteInfoBase { +class [[nodiscard]] ParameterizedTestSuiteInfoBase { public: virtual ~ParameterizedTestSuiteInfoBase() = default; @@ -503,7 +504,8 @@ GTEST_API_ void InsertSyntheticTestCase(const std::string& name, // test suite. It registers tests with all values generated by all // generators when asked. template <class TestSuite> -class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { +class [[nodiscard]] ParameterizedTestSuiteInfo + : public ParameterizedTestSuiteInfoBase { public: // ParamType and GeneratorCreationFunc are private types but are required // for declarations of public methods AddTestPattern() and @@ -513,9 +515,10 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { typedef ParamGenerator<ParamType>(GeneratorCreationFunc)(); using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&); - explicit ParameterizedTestSuiteInfo(const char* name, + explicit ParameterizedTestSuiteInfo(std::string name, CodeLocation code_location) - : test_suite_name_(name), code_location_(code_location) {} + : test_suite_name_(std::move(name)), + code_location_(std::move(code_location)) {} // Test suite base name for display purposes. const std::string& GetTestSuiteName() const override { @@ -529,20 +532,20 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // prefix). test_base_name is the name of an individual test without // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test suite base name and DoBar is test base name. - void AddTestPattern(const char* test_suite_name, const char* test_base_name, + void AddTestPattern(const char*, const char* test_base_name, TestMetaFactoryBase<ParamType>* meta_factory, CodeLocation code_location) { - tests_.push_back(std::shared_ptr<TestInfo>(new TestInfo( - test_suite_name, test_base_name, meta_factory, code_location))); + tests_.emplace_back( + new TestInfo(test_base_name, meta_factory, std::move(code_location))); } // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information // about a generator. - int AddTestSuiteInstantiation(const std::string& instantiation_name, + int AddTestSuiteInstantiation(std::string instantiation_name, GeneratorCreationFunc* func, ParamNameGeneratorFunc* name_func, const char* file, int line) { - instantiations_.push_back( - InstantiationInfo(instantiation_name, func, name_func, file, line)); + instantiations_.emplace_back(std::move(instantiation_name), func, name_func, + file, line); return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test suite @@ -553,34 +556,31 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { void RegisterTests() override { bool generated_instantiations = false; - for (typename TestInfoContainer::iterator test_it = tests_.begin(); - test_it != tests_.end(); ++test_it) { - std::shared_ptr<TestInfo> test_info = *test_it; - for (typename InstantiationContainer::iterator gen_it = - instantiations_.begin(); - gen_it != instantiations_.end(); ++gen_it) { - const std::string& instantiation_name = gen_it->name; - ParamGenerator<ParamType> generator((*gen_it->generator)()); - ParamNameGeneratorFunc* name_func = gen_it->name_func; - const char* file = gen_it->file; - int line = gen_it->line; - - std::string test_suite_name; + std::string test_suite_name; + std::string test_name; + for (const std::shared_ptr<TestInfo>& test_info : tests_) { + for (const InstantiationInfo& instantiation : instantiations_) { + const std::string& instantiation_name = instantiation.name; + ParamGenerator<ParamType> generator((*instantiation.generator)()); + ParamNameGeneratorFunc* name_func = instantiation.name_func; + const char* file = instantiation.file; + int line = instantiation.line; + if (!instantiation_name.empty()) test_suite_name = instantiation_name + "/"; - test_suite_name += test_info->test_suite_base_name; + else + test_suite_name.clear(); + test_suite_name += test_suite_name_; size_t i = 0; std::set<std::string> test_param_names; - for (typename ParamGenerator<ParamType>::iterator param_it = - generator.begin(); - param_it != generator.end(); ++param_it, ++i) { + for (const auto& param : generator) { generated_instantiations = true; - Message test_name_stream; + test_name.clear(); std::string param_name = - name_func(TestParamInfo<ParamType>(*param_it, i)); + name_func(TestParamInfo<ParamType>(param, i)); GTEST_CHECK_(IsValidParamName(param_name)) << "Parameterized test name '" << param_name @@ -592,23 +592,25 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { << "Duplicate parameterized test name '" << param_name << "', in " << file << " line " << line << std::endl; - test_param_names.insert(param_name); - if (!test_info->test_base_name.empty()) { - test_name_stream << test_info->test_base_name << "/"; + test_name.append(test_info->test_base_name).append("/"); } - test_name_stream << param_name; + test_name += param_name; + + test_param_names.insert(std::move(param_name)); + MakeAndRegisterTestInfo( - test_suite_name.c_str(), test_name_stream.GetString().c_str(), + test_suite_name, test_name.c_str(), nullptr, // No type parameter. - PrintToString(*param_it).c_str(), test_info->code_location, + PrintToString(param).c_str(), test_info->code_location, GetTestSuiteTypeId(), SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line), SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line), - test_info->test_meta_factory->CreateTestFactory(*param_it)); - } // for param_it - } // for gen_it - } // for test_it + test_info->test_meta_factory->CreateTestFactory(param)); + ++i; + } // for param + } // for instantiation + } // for test_info if (!generated_instantiations) { // There are no generaotrs, or they all generate nothing ... @@ -621,15 +623,13 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // LocalTestInfo structure keeps information about a single test registered // with TEST_P macro. struct TestInfo { - TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name, + TestInfo(const char* a_test_base_name, TestMetaFactoryBase<ParamType>* a_test_meta_factory, CodeLocation a_code_location) - : test_suite_base_name(a_test_suite_base_name), - test_base_name(a_test_base_name), + : test_base_name(a_test_base_name), test_meta_factory(a_test_meta_factory), - code_location(a_code_location) {} + code_location(std::move(a_code_location)) {} - const std::string test_suite_base_name; const std::string test_base_name; const std::unique_ptr<TestMetaFactoryBase<ParamType>> test_meta_factory; const CodeLocation code_location; @@ -639,11 +639,10 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { // <Instantiation name, Sequence generator creation function, // Name generator function, Source file, Source line> struct InstantiationInfo { - InstantiationInfo(const std::string& name_in, - GeneratorCreationFunc* generator_in, + InstantiationInfo(std::string name_in, GeneratorCreationFunc* generator_in, ParamNameGeneratorFunc* name_func_in, const char* file_in, int line_in) - : name(name_in), + : name(std::move(name_in)), generator(generator_in), name_func(name_func_in), file(file_in), @@ -691,7 +690,7 @@ using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>; // ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P // and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding // ParameterizedTestSuiteInfo descriptors. -class ParameterizedTestSuiteRegistry { +class [[nodiscard]] ParameterizedTestSuiteRegistry { public: ParameterizedTestSuiteRegistry() = default; ~ParameterizedTestSuiteRegistry() { @@ -704,29 +703,32 @@ class ParameterizedTestSuiteRegistry { // tests and instantiations of a particular test suite. template <class TestSuite> ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder( - const char* test_suite_name, CodeLocation code_location) { + std::string test_suite_name, CodeLocation code_location) { ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr; - for (auto& test_suite_info : test_suite_infos_) { - if (test_suite_info->GetTestSuiteName() == test_suite_name) { - if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) { - // Complain about incorrect usage of Google Test facilities - // and terminate the program since we cannot guaranty correct - // test suite setup and tear-down in this case. - ReportInvalidTestSuiteType(test_suite_name, code_location); - posix::Abort(); - } else { - // At this point we are sure that the object we found is of the same - // type we are looking for, so we downcast it to that type - // without further checks. - typed_test_info = CheckedDowncastToActualType< - ParameterizedTestSuiteInfo<TestSuite>>(test_suite_info); - } - break; + + auto item_it = suite_name_to_info_index_.find(test_suite_name); + if (item_it != suite_name_to_info_index_.end()) { + auto* test_suite_info = test_suite_infos_[item_it->second]; + if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) { + // Complain about incorrect usage of Google Test facilities + // and terminate the program since we cannot guaranty correct + // test suite setup and tear-down in this case. + ReportInvalidTestSuiteType(test_suite_name.c_str(), code_location); + posix::Abort(); + } else { + // At this point we are sure that the object we found is of the same + // type we are looking for, so we downcast it to that type + // without further checks. + typed_test_info = + CheckedDowncastToActualType<ParameterizedTestSuiteInfo<TestSuite>>( + test_suite_info); } } if (typed_test_info == nullptr) { typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>( - test_suite_name, code_location); + test_suite_name, std::move(code_location)); + suite_name_to_info_index_.emplace(std::move(test_suite_name), + test_suite_infos_.size()); test_suite_infos_.push_back(typed_test_info); } return typed_test_info; @@ -740,8 +742,9 @@ class ParameterizedTestSuiteRegistry { #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ template <class TestCase> ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder( - const char* test_case_name, CodeLocation code_location) { - return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location); + std::string test_case_name, CodeLocation code_location) { + return GetTestSuitePatternHolder<TestCase>(std::move(test_case_name), + std::move(code_location)); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ @@ -750,6 +753,7 @@ class ParameterizedTestSuiteRegistry { using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>; TestSuiteInfoContainer test_suite_infos_; + ::std::unordered_map<std::string, size_t> suite_name_to_info_index_; ParameterizedTestSuiteRegistry(const ParameterizedTestSuiteRegistry&) = delete; @@ -760,7 +764,7 @@ class ParameterizedTestSuiteRegistry { // Keep track of what type-parameterized test suite are defined and // where as well as which are intatiated. This allows susequently // identifying suits that are defined but never used. -class TypeParameterizedTestSuiteRegistry { +class [[nodiscard]] TypeParameterizedTestSuiteRegistry { public: // Add a suite definition void RegisterTestSuite(const char* test_suite_name, @@ -776,7 +780,7 @@ class TypeParameterizedTestSuiteRegistry { private: struct TypeParameterizedTestSuiteInfo { explicit TypeParameterizedTestSuiteInfo(CodeLocation c) - : code_location(c), instantiated(false) {} + : code_location(std::move(c)), instantiated(false) {} CodeLocation code_location; bool instantiated; @@ -799,18 +803,18 @@ namespace internal { GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100) template <typename... Ts> -class ValueArray { +class [[nodiscard]] ValueArray { public: explicit ValueArray(Ts... v) : v_(FlatTupleConstructTag{}, std::move(v)...) {} template <typename T> operator ParamGenerator<T>() const { // NOLINT - return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>())); + return ValuesIn(MakeVector<T>(std::make_index_sequence<sizeof...(Ts)>())); } private: template <typename T, size_t... I> - std::vector<T> MakeVector(IndexSequence<I...>) const { + std::vector<T> MakeVector(std::index_sequence<I...>) const { return std::vector<T>{static_cast<T>(v_.template Get<I>())...}; } @@ -820,7 +824,7 @@ class ValueArray { GTEST_DISABLE_MSC_WARNINGS_POP_() // 4100 template <typename... T> -class CartesianProductGenerator +class [[nodiscard]] CartesianProductGenerator : public ParamGeneratorInterface<::std::tuple<T...>> { public: typedef ::std::tuple<T...> ParamType; @@ -840,7 +844,7 @@ class CartesianProductGenerator template <class I> class IteratorImpl; template <size_t... I> - class IteratorImpl<IndexSequence<I...>> + class IteratorImpl<std::index_sequence<I...>> : public ParamIteratorInterface<ParamType> { public: IteratorImpl(const ParamGeneratorInterface<ParamType>* base, @@ -931,13 +935,13 @@ class CartesianProductGenerator std::shared_ptr<ParamType> current_value_; }; - using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>; + using Iterator = IteratorImpl<std::make_index_sequence<sizeof...(T)>>; std::tuple<ParamGenerator<T>...> generators_; }; template <class... Gen> -class CartesianProductHolder { +class [[nodiscard]] CartesianProductHolder { public: CartesianProductHolder(const Gen&... g) : generators_(g...) {} template <typename... T> @@ -950,11 +954,12 @@ class CartesianProductHolder { std::tuple<Gen...> generators_; }; -template <typename From, typename To> -class ParamGeneratorConverter : public ParamGeneratorInterface<To> { +template <typename From, typename To, typename Func> +class [[nodiscard]] ParamGeneratorConverter + : public ParamGeneratorInterface<To> { public: - ParamGeneratorConverter(ParamGenerator<From> gen) // NOLINT - : generator_(std::move(gen)) {} + ParamGeneratorConverter(ParamGenerator<From> gen, Func converter) // NOLINT + : generator_(std::move(gen)), converter_(std::move(converter)) {} ParamIteratorInterface<To>* Begin() const override { return new Iterator(this, generator_.begin(), generator_.end()); @@ -963,13 +968,21 @@ class ParamGeneratorConverter : public ParamGeneratorInterface<To> { return new Iterator(this, generator_.end(), generator_.end()); } + // Returns the std::function wrapping the user-supplied converter callable. It + // is used by the iterator (see class Iterator below) to convert the object + // (of type FROM) returned by the ParamGenerator to an object of a type that + // can be static_cast to type TO. + const Func& TypeConverter() const { return converter_; } + private: class Iterator : public ParamIteratorInterface<To> { public: - Iterator(const ParamGeneratorInterface<To>* base, ParamIterator<From> it, + Iterator(const ParamGeneratorConverter* base, ParamIterator<From> it, ParamIterator<From> end) : base_(base), it_(it), end_(end) { - if (it_ != end_) value_ = std::make_shared<To>(static_cast<To>(*it_)); + if (it_ != end_) + value_ = + std::make_shared<To>(static_cast<To>(base->TypeConverter()(*it_))); } ~Iterator() override = default; @@ -978,7 +991,9 @@ class ParamGeneratorConverter : public ParamGeneratorInterface<To> { } void Advance() override { ++it_; - if (it_ != end_) value_ = std::make_shared<To>(static_cast<To>(*it_)); + if (it_ != end_) + value_ = + std::make_shared<To>(static_cast<To>(base_->TypeConverter()(*it_))); } ParamIteratorInterface<To>* Clone() const override { return new Iterator(*this); @@ -998,30 +1013,54 @@ class ParamGeneratorConverter : public ParamGeneratorInterface<To> { private: Iterator(const Iterator& other) = default; - const ParamGeneratorInterface<To>* const base_; + const ParamGeneratorConverter* const base_; ParamIterator<From> it_; ParamIterator<From> end_; std::shared_ptr<To> value_; }; // class ParamGeneratorConverter::Iterator ParamGenerator<From> generator_; + Func converter_; }; // class ParamGeneratorConverter -template <class Gen> -class ParamConverterGenerator { +template <class GeneratedT, + typename StdFunction = + std::function<const GeneratedT&(const GeneratedT&)>> +class [[nodiscard]] ParamConverterGenerator { public: - ParamConverterGenerator(ParamGenerator<Gen> g) // NOLINT - : generator_(std::move(g)) {} + ParamConverterGenerator(ParamGenerator<GeneratedT> g) // NOLINT + : generator_(std::move(g)), converter_(Identity) {} + + ParamConverterGenerator(ParamGenerator<GeneratedT> g, StdFunction converter) + : generator_(std::move(g)), converter_(std::move(converter)) {} template <typename T> operator ParamGenerator<T>() const { // NOLINT - return ParamGenerator<T>(new ParamGeneratorConverter<Gen, T>(generator_)); + return ParamGenerator<T>( + new ParamGeneratorConverter<GeneratedT, T, StdFunction>(generator_, + converter_)); } private: - ParamGenerator<Gen> generator_; + static const GeneratedT& Identity(const GeneratedT& v) { return v; } + + ParamGenerator<GeneratedT> generator_; + StdFunction converter_; }; +// Template to determine the param type of a single-param std::function. +template <typename T> +struct FuncSingleParamType; +template <typename R, typename P> +struct FuncSingleParamType<std::function<R(P)>> { + using type = std::remove_cv_t<std::remove_reference_t<P>>; +}; + +template <typename T> +struct IsSingleArgStdFunction : public std::false_type {}; +template <typename R, typename P> +struct IsSingleArgStdFunction<std::function<R(P)>> : public std::true_type {}; + } // namespace internal } // namespace testing diff --git a/deps/googletest/include/gtest/internal/gtest-port-arch.h b/deps/googletest/include/gtest/internal/gtest-port-arch.h index 3162f2b1cbd229..fbffc95b1a13f9 100644 --- a/deps/googletest/include/gtest/internal/gtest-port-arch.h +++ b/deps/googletest/include/gtest/internal/gtest-port-arch.h @@ -56,6 +56,8 @@ #elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) #define GTEST_OS_WINDOWS_PHONE 1 #define GTEST_OS_WINDOWS_TV_TITLE 1 +#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_GAMES) +#define GTEST_OS_WINDOWS_GAMES 1 #else // WINAPI_FAMILY defined but no known partition matched. // Default to desktop. @@ -117,6 +119,8 @@ #define GTEST_OS_NXP_QN9090 1 #elif defined(NRF52) #define GTEST_OS_NRF52 1 +#elif defined(__EMSCRIPTEN__) +#define GTEST_OS_EMSCRIPTEN 1 #endif // __CYGWIN__ #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ diff --git a/deps/googletest/include/gtest/internal/gtest-port.h b/deps/googletest/include/gtest/internal/gtest-port.h index fa457b7880e011..69eaad10b1c311 100644 --- a/deps/googletest/include/gtest/internal/gtest-port.h +++ b/deps/googletest/include/gtest/internal/gtest-port.h @@ -194,28 +194,12 @@ // // Macros for basic C++ coding: // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. -// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a -// variable don't have to be used. -// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is // suppressed (constant conditional). // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127 // is suppressed. -// GTEST_INTERNAL_HAS_ANY - for enabling UniversalPrinter<std::any> or -// UniversalPrinter<absl::any> specializations. -// Always defined to 0 or 1. -// GTEST_INTERNAL_HAS_OPTIONAL - for enabling UniversalPrinter<std::optional> -// or -// UniversalPrinter<absl::optional> -// specializations. Always defined to 0 or 1. // GTEST_INTERNAL_HAS_STD_SPAN - for enabling UniversalPrinter<std::span> // specializations. Always defined to 0 or 1 -// GTEST_INTERNAL_HAS_STRING_VIEW - for enabling Matcher<std::string_view> or -// Matcher<absl::string_view> -// specializations. Always defined to 0 or 1. -// GTEST_INTERNAL_HAS_VARIANT - for enabling UniversalPrinter<std::variant> or -// UniversalPrinter<absl::variant> -// specializations. Always defined to 0 or 1. // GTEST_USE_OWN_FLAGFILE_FLAG_ - Always defined to 0 or 1. // GTEST_HAS_CXXABI_H_ - Always defined to 0 or 1. // GTEST_CAN_STREAM_RESULTS_ - Always defined to 0 or 1. @@ -262,11 +246,6 @@ // BoolFromGTestEnv() - parses a bool environment variable. // Int32FromGTestEnv() - parses an int32_t environment variable. // StringFromGTestEnv() - parses a string environment variable. -// -// Deprecation warnings: -// GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as -// deprecated; calling a marked function -// should generate a compiler warning // The definition of GTEST_INTERNAL_CPLUSPLUS_LANG comes first because it can // potentially be used as an #include guard. @@ -277,8 +256,8 @@ #endif #if !defined(GTEST_INTERNAL_CPLUSPLUS_LANG) || \ - GTEST_INTERNAL_CPLUSPLUS_LANG < 201402L -#error C++ versions less than C++14 are not supported. + GTEST_INTERNAL_CPLUSPLUS_LANG < 201703L +#error C++ versions less than C++17 are not supported. #endif // MSVC >= 19.11 (VS 2017 Update 3) supports __has_include. @@ -290,10 +269,14 @@ // Detect C++ feature test macros as gracefully as possible. // MSVC >= 19.15, Clang >= 3.4.1, and GCC >= 4.1.2 support feature test macros. -#if GTEST_INTERNAL_CPLUSPLUS_LANG >= 202002L && \ - (!defined(__has_include) || GTEST_INTERNAL_HAS_INCLUDE(<version>)) -#include <version> // C++20 and later -#elif (!defined(__has_include) || GTEST_INTERNAL_HAS_INCLUDE(<ciso646>)) +// +// GCC15 warns that <ciso646> is deprecated in C++17 and suggests using +// <version> instead, even though <version> is not available in C++17 mode prior +// to GCC9. +#if GTEST_INTERNAL_CPLUSPLUS_LANG >= 202002L || \ + GTEST_INTERNAL_HAS_INCLUDE(<version>) +#include <version> // C++20 or <version> support. +#else #include <ciso646> // Pre-C++20 #endif @@ -340,8 +323,8 @@ #if defined(GTEST_HAS_ABSL) && !defined(GTEST_NO_ABSL_FLAGS) #define GTEST_INTERNAL_HAS_ABSL_FLAGS // Used only in this file. -#include "absl/flags/flag.h" #include "absl/flags/declare.h" +#include "absl/flags/flag.h" #include "absl/flags/reflection.h" #endif @@ -609,7 +592,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \ defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \ defined(GTEST_OS_OPENBSD) || defined(GTEST_OS_HAIKU) || \ - defined(GTEST_OS_GNU_HURD)) + defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_SOLARIS) || \ + defined(GTEST_OS_AIX) || defined(GTEST_OS_ZOS)) #define GTEST_HAS_PTHREAD 1 #else #define GTEST_HAS_PTHREAD 0 @@ -659,9 +643,9 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; // platforms except known mobile / embedded ones. Also, if the port doesn't have // a file system, stream redirection is not supported. #if defined(GTEST_OS_WINDOWS_MOBILE) || defined(GTEST_OS_WINDOWS_PHONE) || \ - defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_ESP8266) || \ - defined(GTEST_OS_XTENSA) || defined(GTEST_OS_QURT) || \ - !GTEST_HAS_FILE_SYSTEM + defined(GTEST_OS_WINDOWS_RT) || defined(GTEST_OS_WINDOWS_GAMES) || \ + defined(GTEST_OS_ESP8266) || defined(GTEST_OS_XTENSA) || \ + defined(GTEST_OS_QURT) || !GTEST_HAS_FILE_SYSTEM #define GTEST_HAS_STREAM_REDIRECTION 0 #else #define GTEST_HAS_STREAM_REDIRECTION 1 @@ -671,7 +655,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; // Determines whether to support death tests. // pops up a dialog window that cannot be suppressed programmatically. #if (defined(GTEST_OS_LINUX) || defined(GTEST_OS_CYGWIN) || \ - defined(GTEST_OS_SOLARIS) || \ + defined(GTEST_OS_SOLARIS) || defined(GTEST_OS_ZOS) || \ (defined(GTEST_OS_MAC) && !defined(GTEST_OS_IOS)) || \ (defined(GTEST_OS_WINDOWS_DESKTOP) && _MSC_VER) || \ defined(GTEST_OS_WINDOWS_MINGW) || defined(GTEST_OS_AIX) || \ @@ -680,12 +664,22 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; defined(GTEST_OS_NETBSD) || defined(GTEST_OS_FUCHSIA) || \ defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \ defined(GTEST_OS_HAIKU) || defined(GTEST_OS_GNU_HURD)) + // Death tests require a file system to work properly. #if GTEST_HAS_FILE_SYSTEM #define GTEST_HAS_DEATH_TEST 1 #endif // GTEST_HAS_FILE_SYSTEM #endif +// Determines whether the Premature Exit file can be created. +// Created by default when Death tests are supported, but other platforms can +// use the Premature exit file without Death test support (e.g. for detecting +// crashes). +#if GTEST_HAS_DEATH_TEST || \ + (defined(GTEST_OS_EMSCRIPTEN) && GTEST_HAS_FILE_SYSTEM) +#define GTEST_INTERNAL_HAS_PREMATURE_EXIT_FILE 1 +#endif + // Determines whether to support type-driven tests. // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0, @@ -749,6 +743,20 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #define GTEST_HAVE_ATTRIBUTE_(x) 0 #endif +// GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE +// +// A function-like feature checking macro that accepts C++11 style attributes. +// It's a wrapper around `__has_cpp_attribute`, defined by ISO C++ SD-6 +// (https://en.cppreference.com/w/cpp/experimental/feature_test). If we don't +// find `__has_cpp_attribute`, will evaluate to 0. +#if defined(__has_cpp_attribute) +// NOTE: requiring __cplusplus above should not be necessary, but +// works around https://bugs.llvm.org/show_bug.cgi?id=23435. +#define GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +#define GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(x) 0 +#endif + // GTEST_HAVE_FEATURE_ // // A function-like feature checking macro that is a wrapper around @@ -759,17 +767,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #define GTEST_HAVE_FEATURE_(x) 0 #endif -// Use this annotation after a variable or parameter declaration to tell the -// compiler the variable/parameter does not have to be used. -// Example: -// -// GTEST_ATTRIBUTE_UNUSED_ int foo = bar(); -#if GTEST_HAVE_ATTRIBUTE_(unused) -#define GTEST_ATTRIBUTE_UNUSED_ __attribute__((unused)) -#else -#define GTEST_ATTRIBUTE_UNUSED_ -#endif - // Use this annotation before a function that takes a printf format string. #if GTEST_HAVE_ATTRIBUTE_(format) && defined(__MINGW_PRINTF_FORMAT) // MinGW has two different printf implementations. Ensure the format macro @@ -784,17 +781,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) #endif -// Tell the compiler to warn about unused return values for functions declared -// with this macro. The macro should be used on function declarations -// following the argument list: -// -// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; -#if GTEST_HAVE_ATTRIBUTE_(warn_unused_result) -#define GTEST_MUST_USE_RESULT_ __attribute__((warn_unused_result)) -#else -#define GTEST_MUST_USE_RESULT_ -#endif - // MS C++ compiler emits warning when a conditional expression is compile time // constant. In some contexts this warning is false positive and needs to be // suppressed. Use the following two macros in such cases: @@ -846,11 +832,13 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #ifndef GTEST_API_ #ifdef _MSC_VER -#if defined(GTEST_LINKED_AS_SHARED_LIBRARY) && GTEST_LINKED_AS_SHARED_LIBRARY -#define GTEST_API_ __declspec(dllimport) -#elif defined(GTEST_CREATE_SHARED_LIBRARY) && GTEST_CREATE_SHARED_LIBRARY +#if defined(GTEST_CREATE_SHARED_LIBRARY) && GTEST_CREATE_SHARED_LIBRARY #define GTEST_API_ __declspec(dllexport) +#elif defined(GTEST_LINKED_AS_SHARED_LIBRARY) && GTEST_LINKED_AS_SHARED_LIBRARY +#define GTEST_API_ __declspec(dllimport) #endif +#elif GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(gnu::visibility) +#define GTEST_API_ [[gnu::visibility("default")]] #elif GTEST_HAVE_ATTRIBUTE_(visibility) #define GTEST_API_ __attribute__((visibility("default"))) #endif // _MSC_VER @@ -941,7 +929,7 @@ namespace internal { // A secret type that Google Test users don't know about. It has no // accessible constructors on purpose. Therefore it's impossible to create a // Secret object, which is what we want. -class Secret { +class [[nodiscard]] Secret { Secret(const Secret&) = delete; }; @@ -956,7 +944,7 @@ GTEST_API_ bool IsTrue(bool condition); // This is almost `using RE = ::RE2`, except it is copy-constructible, and it // needs to disambiguate the `std::string`, `absl::string_view`, and `const // char*` constructors. -class GTEST_API_ RE { +class GTEST_API_ [[nodiscard]] RE { public: RE(absl::string_view regex) : regex_(regex) {} // NOLINT RE(const char* regex) : RE(absl::string_view(regex)) {} // NOLINT @@ -982,7 +970,7 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ // A simple C++ wrapper for <regex.h>. It uses the POSIX Extended // Regular Expression syntax. -class GTEST_API_ RE { +class GTEST_API_ [[nodiscard]] RE { public: // A copy constructor is required by the Standard to initialize object // references from r-values. @@ -1051,7 +1039,7 @@ enum GTestLogSeverity { GTEST_INFO, GTEST_WARNING, GTEST_ERROR, GTEST_FATAL }; // Formats log entry severity, provides a stream object for streaming the // log message, and terminates the message with a newline when going out of // scope. -class GTEST_API_ GTestLog { +class GTEST_API_ [[nodiscard]] GTestLog { public: GTestLog(GTestLogSeverity severity, const char* file, int line); @@ -1214,7 +1202,7 @@ void ClearInjectableArgvs(); #ifdef GTEST_OS_WINDOWS // Provides leak-safe Windows kernel handle ownership. // Used in death tests and in threading support. -class GTEST_API_ AutoHandle { +class GTEST_API_ [[nodiscard]] AutoHandle { public: // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to // avoid including <windows.h> in this header file. Including <windows.h> is @@ -1258,7 +1246,7 @@ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. // TODO(b/203539622): Replace unconditionally with absl::Notification. -class GTEST_API_ Notification { +class GTEST_API_ [[nodiscard]] Notification { public: Notification() : notified_(false) {} Notification(const Notification&) = delete; @@ -1297,7 +1285,7 @@ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 // in order to call its Run(). Introducing ThreadWithParamBase as a // non-templated base class for ThreadWithParam allows us to bypass this // problem. -class ThreadWithParamBase { +class [[nodiscard]] ThreadWithParamBase { public: virtual ~ThreadWithParamBase() = default; virtual void Run() = 0; @@ -1327,7 +1315,7 @@ extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { // These classes are only for testing Google Test's own constructs. Do // not use them in user tests, either directly or indirectly. template <typename T> -class ThreadWithParam : public ThreadWithParamBase { +class [[nodiscard]] ThreadWithParam : public ThreadWithParamBase { public: typedef void UserThreadFunc(T); @@ -1393,7 +1381,7 @@ class ThreadWithParam : public ThreadWithParamBase { // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); // // (A non-static Mutex is defined/declared in the usual way). -class GTEST_API_ Mutex { +class GTEST_API_ [[nodiscard]] Mutex { public: enum MutexType { kStatic = 0, kDynamic = 1 }; // We rely on kStaticMutex being 0 as it is to what the linker initializes @@ -1409,9 +1397,9 @@ class GTEST_API_ Mutex { Mutex(); ~Mutex(); - void Lock(); + void lock(); - void Unlock(); + void unlock(); // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. @@ -1446,14 +1434,13 @@ class GTEST_API_ Mutex { // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { +class [[nodiscard]] GTestMutexLock { public: - explicit GTestMutexLock(Mutex* mutex) : mutex_(mutex) { mutex_->Lock(); } - - ~GTestMutexLock() { mutex_->Unlock(); } + explicit GTestMutexLock(Mutex& mutex) : mutex_(mutex) { mutex_.lock(); } + ~GTestMutexLock() { mutex_.unlock(); } private: - Mutex* const mutex_; + Mutex& mutex_; GTestMutexLock(const GTestMutexLock&) = delete; GTestMutexLock& operator=(const GTestMutexLock&) = delete; @@ -1463,14 +1450,14 @@ typedef GTestMutexLock MutexLock; // Base class for ValueHolder<T>. Allows a caller to hold and delete a value // without knowing its type. -class ThreadLocalValueHolderBase { +class [[nodiscard]] ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Provides a way for a thread to send notifications to a ThreadLocal // regardless of its parameter type. -class ThreadLocalBase { +class [[nodiscard]] ThreadLocalBase { public: // Creates a new ValueHolder<T> object holding a default value passed to // this ThreadLocal<T>'s constructor and returns it. It is the caller's @@ -1490,7 +1477,7 @@ class ThreadLocalBase { // Maps a thread to a set of ThreadLocals that have values instantiated on that // thread and notifies them when the thread exits. A ThreadLocal instance is // expected to persist until all threads it has values on have terminated. -class GTEST_API_ ThreadLocalRegistry { +class GTEST_API_ [[nodiscard]] ThreadLocalRegistry { public: // Registers thread_local_instance as having value on the current thread. // Returns a value that can be used to identify the thread from other threads. @@ -1502,7 +1489,7 @@ class GTEST_API_ ThreadLocalRegistry { const ThreadLocalBase* thread_local_instance); }; -class GTEST_API_ ThreadWithParamBase { +class GTEST_API_ [[nodiscard]] ThreadWithParamBase { public: void Join(); @@ -1522,7 +1509,7 @@ class GTEST_API_ ThreadWithParamBase { // Helper class for testing Google Test's multi-threading constructs. template <typename T> -class ThreadWithParam : public ThreadWithParamBase { +class [[nodiscard]] ThreadWithParam : public ThreadWithParamBase { public: typedef void UserThreadFunc(T); @@ -1577,7 +1564,7 @@ class ThreadWithParam : public ThreadWithParamBase { // object managed by Google Test will be leaked as long as all threads // using Google Test have exited when main() returns. template <typename T> -class ThreadLocal : public ThreadLocalBase { +class [[nodiscard]] ThreadLocal : public ThreadLocalBase { public: ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {} explicit ThreadLocal(const T& value) @@ -1662,17 +1649,17 @@ class ThreadLocal : public ThreadLocalBase { #elif GTEST_HAS_PTHREAD // MutexBase and Mutex implement mutex on pthreads-based platforms. -class MutexBase { +class [[nodiscard]] MutexBase { public: // Acquires this mutex. - void Lock() { + void lock() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); owner_ = pthread_self(); has_owner_ = true; } // Releases this mutex. - void Unlock() { + void unlock() { // Since the lock is being released the owner_ field should no longer be // considered valid. We don't protect writing to has_owner_ here, as it's // the caller's responsibility to ensure that the current thread holds the @@ -1720,7 +1707,7 @@ class MutexBase { // The Mutex class can only be used for mutexes created at runtime. It // shares its API with MutexBase otherwise. -class Mutex : public MutexBase { +class [[nodiscard]] Mutex : public MutexBase { public: Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); @@ -1738,14 +1725,13 @@ class Mutex : public MutexBase { // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { +class [[nodiscard]] GTestMutexLock { public: - explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); } - - ~GTestMutexLock() { mutex_->Unlock(); } + explicit GTestMutexLock(MutexBase& mutex) : mutex_(mutex) { mutex_.lock(); } + ~GTestMutexLock() { mutex_.unlock(); } private: - MutexBase* const mutex_; + MutexBase& mutex_; GTestMutexLock(const GTestMutexLock&) = delete; GTestMutexLock& operator=(const GTestMutexLock&) = delete; @@ -1759,7 +1745,7 @@ typedef GTestMutexLock MutexLock; // C-linkage. Therefore it cannot be templatized to access // ThreadLocal<T>. Hence the need for class // ThreadLocalValueHolderBase. -class GTEST_API_ ThreadLocalValueHolderBase { +class GTEST_API_ [[nodiscard]] ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() = default; }; @@ -1772,7 +1758,7 @@ extern "C" inline void DeleteThreadLocalValue(void* value_holder) { // Implements thread-local storage on pthreads-based systems. template <typename T> -class GTEST_API_ ThreadLocal { +class GTEST_API_ [[nodiscard]] ThreadLocal { public: ThreadLocal() : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {} @@ -1885,11 +1871,11 @@ class GTEST_API_ ThreadLocal { // mutex is not supported - using Google Test in multiple threads is not // supported on such platforms. -class Mutex { +class [[nodiscard]] Mutex { public: Mutex() {} - void Lock() {} - void Unlock() {} + void lock() {} + void unlock() {} void AssertHeld() const {} }; @@ -1903,15 +1889,15 @@ class Mutex { // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { +class [[nodiscard]] GTestMutexLock { public: - explicit GTestMutexLock(Mutex*) {} // NOLINT + explicit GTestMutexLock(Mutex&) {} // NOLINT }; typedef GTestMutexLock MutexLock; template <typename T> -class GTEST_API_ ThreadLocal { +class GTEST_API_ [[nodiscard]] ThreadLocal { public: ThreadLocal() : value_() {} explicit ThreadLocal(const T& value) : value_(value) {} @@ -2108,8 +2094,9 @@ GTEST_DISABLE_MSC_DEPRECATED_PUSH_() // defined there. #if GTEST_HAS_FILE_SYSTEM #if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_WINDOWS_PHONE) && \ - !defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_ESP8266) && \ - !defined(GTEST_OS_XTENSA) && !defined(GTEST_OS_QURT) + !defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_WINDOWS_GAMES) && \ + !defined(GTEST_OS_ESP8266) && !defined(GTEST_OS_XTENSA) && \ + !defined(GTEST_OS_QURT) inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { @@ -2218,7 +2205,7 @@ constexpr BiggestInt kMaxBiggestInt = (std::numeric_limits<BiggestInt>::max)(); // needs. Other types can be easily added in the future if need // arises. template <size_t size> -class TypeWithSize { +class [[nodiscard]] TypeWithSize { public: // This prevents the user from using TypeWithSize<N> with incorrect // values of N. @@ -2227,7 +2214,7 @@ class TypeWithSize { // The specialization for size 4. template <> -class TypeWithSize<4> { +class [[nodiscard]] TypeWithSize<4> { public: using Int = std::int32_t; using UInt = std::uint32_t; @@ -2235,7 +2222,7 @@ class TypeWithSize<4> { // The specialization for size 8. template <> -class TypeWithSize<8> { +class [[nodiscard]] TypeWithSize<8> { public: using Int = std::int64_t; using UInt = std::uint64_t; @@ -2265,11 +2252,11 @@ using TimeInMillis = int64_t; // Represents time in milliseconds. // Macros for declaring flags. #define GTEST_DECLARE_bool_(name) \ - ABSL_DECLARE_FLAG(bool, GTEST_FLAG_NAME_(name)) + GTEST_API_ ABSL_DECLARE_FLAG(bool, GTEST_FLAG_NAME_(name)) #define GTEST_DECLARE_int32_(name) \ - ABSL_DECLARE_FLAG(int32_t, GTEST_FLAG_NAME_(name)) + GTEST_API_ ABSL_DECLARE_FLAG(int32_t, GTEST_FLAG_NAME_(name)) #define GTEST_DECLARE_string_(name) \ - ABSL_DECLARE_FLAG(std::string, GTEST_FLAG_NAME_(name)) + GTEST_API_ ABSL_DECLARE_FLAG(std::string, GTEST_FLAG_NAME_(name)) #define GTEST_FLAG_SAVER_ ::absl::FlagSaver @@ -2345,91 +2332,11 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val); } // namespace internal } // namespace testing -#if !defined(GTEST_INTERNAL_DEPRECATED) - -// Internal Macro to mark an API deprecated, for googletest usage only -// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or -// GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of -// a deprecated entity will trigger a warning when compiled with -// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler). -// For msvc /W3 option will need to be used -// Note that for 'other' compilers this macro evaluates to nothing to prevent -// compilations errors. -#if defined(_MSC_VER) -#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) -#elif defined(__GNUC__) -#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) +#if GTEST_INTERNAL_HAVE_CPP_ATTRIBUTE(clang::annotate) +#define GTEST_INTERNAL_DEPRECATE_AND_INLINE(msg) \ + [[deprecated(msg), clang::annotate("inline-me")]] #else -#define GTEST_INTERNAL_DEPRECATED(message) -#endif - -#endif // !defined(GTEST_INTERNAL_DEPRECATED) - -#ifdef GTEST_HAS_ABSL -// Always use absl::any for UniversalPrinter<> specializations if googletest -// is built with absl support. -#define GTEST_INTERNAL_HAS_ANY 1 -#include "absl/types/any.h" -namespace testing { -namespace internal { -using Any = ::absl::any; -} // namespace internal -} // namespace testing -#else -#if defined(__cpp_lib_any) || (GTEST_INTERNAL_HAS_INCLUDE(<any>) && \ - GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L && \ - (!defined(_MSC_VER) || GTEST_HAS_RTTI)) -// Otherwise for C++17 and higher use std::any for UniversalPrinter<> -// specializations. -#define GTEST_INTERNAL_HAS_ANY 1 -#include <any> -namespace testing { -namespace internal { -using Any = ::std::any; -} // namespace internal -} // namespace testing -// The case where absl is configured NOT to alias std::any is not -// supported. -#endif // __cpp_lib_any -#endif // GTEST_HAS_ABSL - -#ifndef GTEST_INTERNAL_HAS_ANY -#define GTEST_INTERNAL_HAS_ANY 0 -#endif - -#ifdef GTEST_HAS_ABSL -// Always use absl::optional for UniversalPrinter<> specializations if -// googletest is built with absl support. -#define GTEST_INTERNAL_HAS_OPTIONAL 1 -#include "absl/types/optional.h" -namespace testing { -namespace internal { -template <typename T> -using Optional = ::absl::optional<T>; -inline ::absl::nullopt_t Nullopt() { return ::absl::nullopt; } -} // namespace internal -} // namespace testing -#else -#if defined(__cpp_lib_optional) || (GTEST_INTERNAL_HAS_INCLUDE(<optional>) && \ - GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L) -// Otherwise for C++17 and higher use std::optional for UniversalPrinter<> -// specializations. -#define GTEST_INTERNAL_HAS_OPTIONAL 1 -#include <optional> -namespace testing { -namespace internal { -template <typename T> -using Optional = ::std::optional<T>; -inline ::std::nullopt_t Nullopt() { return ::std::nullopt; } -} // namespace internal -} // namespace testing -// The case where absl is configured NOT to alias std::optional is not -// supported. -#endif // __cpp_lib_optional -#endif // GTEST_HAS_ABSL - -#ifndef GTEST_INTERNAL_HAS_OPTIONAL -#define GTEST_INTERNAL_HAS_OPTIONAL 0 +#define GTEST_INTERNAL_DEPRECATE_AND_INLINE(msg) [[deprecated(msg)]] #endif #if defined(__cpp_lib_span) || (GTEST_INTERNAL_HAS_INCLUDE(<span>) && \ @@ -2473,42 +2380,12 @@ using StringView = ::std::string_view; #define GTEST_INTERNAL_HAS_STRING_VIEW 0 #endif -#ifdef GTEST_HAS_ABSL -// Always use absl::variant for UniversalPrinter<> specializations if googletest -// is built with absl support. -#define GTEST_INTERNAL_HAS_VARIANT 1 -#include "absl/types/variant.h" -namespace testing { -namespace internal { -template <typename... T> -using Variant = ::absl::variant<T...>; -} // namespace internal -} // namespace testing +#if (defined(__cpp_lib_three_way_comparison) || \ + (GTEST_INTERNAL_HAS_INCLUDE(<compare>) && \ + GTEST_INTERNAL_CPLUSPLUS_LANG >= 201907L)) +#define GTEST_INTERNAL_HAS_COMPARE_LIB 1 #else -#if defined(__cpp_lib_variant) || (GTEST_INTERNAL_HAS_INCLUDE(<variant>) && \ - GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L) -// Otherwise for C++17 and higher use std::variant for UniversalPrinter<> -// specializations. -#define GTEST_INTERNAL_HAS_VARIANT 1 -#include <variant> -namespace testing { -namespace internal { -template <typename... T> -using Variant = ::std::variant<T...>; -} // namespace internal -} // namespace testing -// The case where absl is configured NOT to alias std::variant is not supported. -#endif // __cpp_lib_variant -#endif // GTEST_HAS_ABSL - -#ifndef GTEST_INTERNAL_HAS_VARIANT -#define GTEST_INTERNAL_HAS_VARIANT 0 -#endif - -#if (defined(__cpp_constexpr) && !defined(__cpp_inline_variables)) || \ - (defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \ - GTEST_INTERNAL_CPLUSPLUS_LANG < 201703L) -#define GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL 1 +#define GTEST_INTERNAL_HAS_COMPARE_LIB 0 #endif #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/deps/googletest/include/gtest/internal/gtest-string.h b/deps/googletest/include/gtest/internal/gtest-string.h index 7c05b58339f681..2363034fc0dbcb 100644 --- a/deps/googletest/include/gtest/internal/gtest-string.h +++ b/deps/googletest/include/gtest/internal/gtest-string.h @@ -60,7 +60,7 @@ namespace testing { namespace internal { // String - an abstract class holding static string utilities. -class GTEST_API_ String { +class GTEST_API_ [[nodiscard]] String { public: // Static utility methods @@ -166,7 +166,7 @@ class GTEST_API_ String { private: String(); // Not meant to be instantiated. -}; // class String +}; // class String // Gets the content of the stringstream's buffer as an std::string. Each '\0' // character in the buffer is replaced with "\\0". diff --git a/deps/googletest/include/gtest/internal/gtest-type-util.h b/deps/googletest/include/gtest/internal/gtest-type-util.h index f94cf614ade746..78da05316d6b0a 100644 --- a/deps/googletest/include/gtest/internal/gtest-type-util.h +++ b/deps/googletest/include/gtest/internal/gtest-type-util.h @@ -71,7 +71,7 @@ inline std::string CanonicalizeForStdLibVersioning(std::string s) { // Strip redundant spaces in typename to match MSVC // For example, std::pair<int, bool> -> std::pair<int,bool> static const char to_search[] = ", "; - static const char replace_str[] = ","; + const char replace_char = ','; size_t pos = 0; while (true) { // Get the next occurrence from the current position @@ -80,8 +80,8 @@ inline std::string CanonicalizeForStdLibVersioning(std::string s) { break; } // Replace this occurrence of substring - s.replace(pos, strlen(to_search), replace_str); - pos += strlen(replace_str); + s.replace(pos, strlen(to_search), 1, replace_char); + ++pos; } return s; } diff --git a/deps/googletest/src/gtest-death-test.cc b/deps/googletest/src/gtest-death-test.cc index 8417a300f7c73d..15472f1a7929cf 100644 --- a/deps/googletest/src/gtest-death-test.cc +++ b/deps/googletest/src/gtest-death-test.cc @@ -32,6 +32,8 @@ #include "gtest/gtest-death-test.h" +#include <stdlib.h> + #include <functional> #include <memory> #include <sstream> @@ -115,7 +117,7 @@ GTEST_DEFINE_string_( GTEST_DEFINE_bool_( death_test_use_fork, testing::internal::BoolFromGTestEnv("death_test_use_fork", false), - "Instructs to use fork()/_exit() instead of clone() in death tests. " + "Instructs to use fork()/_Exit() instead of clone() in death tests. " "Ignored and always uses fork() on POSIX systems where clone() is not " "implemented. Useful when running under valgrind or similar tools if " "those do not support clone(). Valgrind 3.3.1 will just fail if " @@ -299,7 +301,7 @@ enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; fputc(kDeathTestInternalError, parent); fprintf(parent, "%s", message.c_str()); fflush(parent); - _exit(1); + _Exit(1); } else { fprintf(stderr, "%s", message.c_str()); fflush(stderr); @@ -511,7 +513,7 @@ std::string DeathTestImpl::GetErrorLogs() { return GetCapturedStderr(); } // Signals that the death test code which should have exited, didn't. // Should be called only in a death test child process. // Writes a status byte to the child's status file descriptor, then -// calls _exit(1). +// calls _Exit(1). void DeathTestImpl::Abort(AbortReason reason) { // The parent process considers the death test to be a failure if // it finds any data in our pipe. So, here we write a single flag byte @@ -523,13 +525,13 @@ void DeathTestImpl::Abort(AbortReason reason) { GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); // We are leaking the descriptor here because on some platforms (i.e., // when built as Windows DLL), destructors of global objects will still - // run after calling _exit(). On such systems, write_fd_ will be + // run after calling _Exit(). On such systems, write_fd_ will be // indirectly closed from the destructor of UnitTestImpl, causing double // close if it is also closed here. On debug configurations, double close // may assert. As there are no in-process buffers to flush here, we are // relying on the OS to close the descriptor after the process terminates // when the destructors are not run. - _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) + _Exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) } // Returns an indented copy of stderr output for a death test. @@ -628,13 +630,13 @@ bool DeathTestImpl::Passed(bool status_ok) { #ifndef GTEST_OS_WINDOWS // Note: The return value points into args, so the return value's lifetime is // bound to that of args. -static std::unique_ptr<char*[]> CreateArgvFromArgs( - std::vector<std::string>& args) { - auto result = std::make_unique<char*[]>(args.size() + 1); - for (size_t i = 0; i < args.size(); ++i) { - result[i] = &args[i][0]; +static std::vector<char*> CreateArgvFromArgs(std::vector<std::string>& args) { + std::vector<char*> result; + result.reserve(args.size() + 1); + for (auto& arg : args) { + result.push_back(&arg[0]); } - result[args.size()] = nullptr; // extra null terminator + result.push_back(nullptr); // Extra null terminator. return result; } #endif @@ -1034,8 +1036,8 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { // "Fuchsia Test Component" which contains a "Fuchsia Component Manifest") // Launching processes is a privileged operation in Fuchsia, and the // declaration indicates that the ability is required for the component. - std::unique_ptr<char*[]> argv = CreateArgvFromArgs(args); - status = fdio_spawn_etc(child_job, FDIO_SPAWN_CLONE_ALL, argv[0], argv.get(), + std::vector<char*> argv = CreateArgvFromArgs(args); + status = fdio_spawn_etc(child_job, FDIO_SPAWN_CLONE_ALL, argv[0], argv.data(), nullptr, 2, spawn_actions, child_process_.reset_and_get_address(), nullptr); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); @@ -1333,7 +1335,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { #endif // GTEST_HAS_CLONE if (use_fork && (child_pid = fork()) == 0) { - _exit(ExecDeathTestChildMain(&args)); + _Exit(ExecDeathTestChildMain(&args)); } #endif // GTEST_OS_QNX #ifdef GTEST_OS_LINUX @@ -1386,8 +1388,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() { // is necessary. FlushInfoLog(); - std::unique_ptr<char*[]> argv = CreateArgvFromArgs(args); - const pid_t child_pid = ExecDeathTestSpawnChild(argv.get(), pipe_fd[0]); + std::vector<char*> argv = CreateArgvFromArgs(args); + const pid_t child_pid = ExecDeathTestSpawnChild(argv.data(), pipe_fd[0]); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_child_pid(child_pid); set_read_fd(pipe_fd[0]); diff --git a/deps/googletest/src/gtest-internal-inl.h b/deps/googletest/src/gtest-internal-inl.h index 4799a1e7ba5d09..6a39b93be132e2 100644 --- a/deps/googletest/src/gtest-internal-inl.h +++ b/deps/googletest/src/gtest-internal-inl.h @@ -46,6 +46,7 @@ #include <memory> #include <set> #include <string> +#include <unordered_map> #include <vector> #include "gtest/internal/gtest-port.h" @@ -649,13 +650,15 @@ class GTEST_API_ UnitTestImpl { // this is not a typed or a type-parameterized test. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite - TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param, + TestSuite* GetTestSuite(const std::string& test_suite_name, + const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc); // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - TestCase* GetTestCase(const char* test_case_name, const char* type_param, + TestCase* GetTestCase(const std::string& test_case_name, + const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) { return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc); @@ -681,13 +684,13 @@ class GTEST_API_ UnitTestImpl { // AddTestInfo(), which is called to register a TEST or TEST_F // before main() is reached. if (original_working_dir_.IsEmpty()) { - original_working_dir_.Set(FilePath::GetCurrentDir()); + original_working_dir_ = FilePath::GetCurrentDir(); GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } #endif // GTEST_HAS_FILE_SYSTEM - GetTestSuite(test_info->test_suite_name(), test_info->type_param(), + GetTestSuite(test_info->test_suite_name_, test_info->type_param(), set_up_tc, tear_down_tc) ->AddTestInfo(test_info); } @@ -709,18 +712,6 @@ class GTEST_API_ UnitTestImpl { return type_parameterized_test_registry_; } - // Sets the TestSuite object for the test that's currently running. - void set_current_test_suite(TestSuite* a_current_test_suite) { - current_test_suite_ = a_current_test_suite; - } - - // Sets the TestInfo object for the test that's currently running. If - // current_test_info is NULL, the assertion results will be stored in - // ad_hoc_test_result_. - void set_current_test_info(TestInfo* a_current_test_info) { - current_test_info_ = a_current_test_info; - } - // Registers all parameterized tests defined using TEST_P and // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter // combination. This method can be called more then once; it has guards @@ -835,12 +826,34 @@ class GTEST_API_ UnitTestImpl { bool catch_exceptions() const { return catch_exceptions_; } private: + // Returns true if a warning should be issued if no tests match the test + // filter flag. + bool ShouldWarnIfNoTestsMatchFilter() const; + + struct CompareTestSuitesByPointer { + bool operator()(const TestSuite* lhs, const TestSuite* rhs) const { + return lhs->name_ < rhs->name_; + } + }; + friend class ::testing::UnitTest; // Used by UnitTest::Run() to capture the state of // GTEST_FLAG(catch_exceptions) at the moment it starts. void set_catch_exceptions(bool value) { catch_exceptions_ = value; } + // Sets the TestSuite object for the test that's currently running. + void set_current_test_suite(TestSuite* a_current_test_suite) { + current_test_suite_ = a_current_test_suite; + } + + // Sets the TestInfo object for the test that's currently running. If + // current_test_info is NULL, the assertion results will be stored in + // ad_hoc_test_result_. + void set_current_test_info(TestInfo* a_current_test_info) { + current_test_info_ = a_current_test_info; + } + // The UnitTest object that owns this implementation object. UnitTest* const parent_; @@ -873,6 +886,9 @@ class GTEST_API_ UnitTestImpl { // elements in the vector. std::vector<TestSuite*> test_suites_; + // The set of TestSuites by name. + std::unordered_map<std::string, TestSuite*> test_suites_by_name_; + // Provides a level of indirection for the test suite list to allow // easy shuffling and restoring the test suite order. The i-th // element of this vector is the index of the i-th test suite in the diff --git a/deps/googletest/src/gtest-port.cc b/deps/googletest/src/gtest-port.cc index 3bb7dd450812d5..d50d07cdb090d4 100644 --- a/deps/googletest/src/gtest-port.cc +++ b/deps/googletest/src/gtest-port.cc @@ -320,13 +320,13 @@ Mutex::~Mutex() { } } -void Mutex::Lock() { +void Mutex::lock() { ThreadSafeLazyInit(); ::EnterCriticalSection(critical_section_); owner_thread_id_ = ::GetCurrentThreadId(); } -void Mutex::Unlock() { +void Mutex::unlock() { ThreadSafeLazyInit(); // We don't protect writing to owner_thread_id_ here, as it's the // caller's responsibility to ensure that the current thread holds the @@ -499,7 +499,7 @@ class ThreadLocalRegistryImpl { MemoryIsNotDeallocated memory_is_not_deallocated; #endif // _MSC_VER DWORD current_thread = ::GetCurrentThreadId(); - MutexLock lock(&mutex_); + MutexLock lock(mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); ThreadIdToThreadLocals::iterator thread_local_pos = @@ -532,7 +532,7 @@ class ThreadLocalRegistryImpl { // Clean up the ThreadLocalValues data structure while holding the lock, but // defer the destruction of the ThreadLocalValueHolderBases. { - MutexLock lock(&mutex_); + MutexLock lock(mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); for (ThreadIdToThreadLocals::iterator it = @@ -559,7 +559,7 @@ class ThreadLocalRegistryImpl { // Clean up the ThreadIdToThreadLocals data structure while holding the // lock, but defer the destruction of the ThreadLocalValueHolderBases. { - MutexLock lock(&mutex_); + MutexLock lock(mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); ThreadIdToThreadLocals::iterator thread_local_pos = @@ -587,9 +587,11 @@ class ThreadLocalRegistryImpl { // thread's ID. typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals; - // Holds the thread id and thread handle that we pass from - // StartWatcherThreadFor to WatcherThreadFunc. - typedef std::pair<DWORD, HANDLE> ThreadIdAndHandle; + struct WatcherThreadParams { + DWORD thread_id; + HANDLE handle; + Notification has_initialized; + }; static void StartWatcherThreadFor(DWORD thread_id) { // The returned handle will be kept in thread_map and closed by @@ -597,15 +599,20 @@ class ThreadLocalRegistryImpl { HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION, FALSE, thread_id); GTEST_CHECK_(thread != nullptr); + + WatcherThreadParams* watcher_thread_params = new WatcherThreadParams; + watcher_thread_params->thread_id = thread_id; + watcher_thread_params->handle = thread; + // We need to pass a valid thread ID pointer into CreateThread for it // to work correctly under Win98. DWORD watcher_thread_id; - HANDLE watcher_thread = ::CreateThread( - nullptr, // Default security. - 0, // Default stack size - &ThreadLocalRegistryImpl::WatcherThreadFunc, - reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)), - CREATE_SUSPENDED, &watcher_thread_id); + HANDLE watcher_thread = + ::CreateThread(nullptr, // Default security. + 0, // Default stack size + &ThreadLocalRegistryImpl::WatcherThreadFunc, + reinterpret_cast<LPVOID>(watcher_thread_params), + CREATE_SUSPENDED, &watcher_thread_id); GTEST_CHECK_(watcher_thread != nullptr) << "CreateThread failed with error " << ::GetLastError() << "."; // Give the watcher thread the same priority as ours to avoid being @@ -614,17 +621,25 @@ class ThreadLocalRegistryImpl { ::GetThreadPriority(::GetCurrentThread())); ::ResumeThread(watcher_thread); ::CloseHandle(watcher_thread); + + // Wait for the watcher thread to start to avoid race conditions. + // One specific race condition that can happen is that we have returned + // from main and have started to tear down, the newly spawned watcher + // thread may access already-freed variables, like global shared_ptrs. + watcher_thread_params->has_initialized.WaitForNotification(); } // Monitors exit from a given thread and notifies those // ThreadIdToThreadLocals about thread termination. static DWORD WINAPI WatcherThreadFunc(LPVOID param) { - const ThreadIdAndHandle* tah = - reinterpret_cast<const ThreadIdAndHandle*>(param); - GTEST_CHECK_(::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0); - OnThreadExit(tah->first); - ::CloseHandle(tah->second); - delete tah; + WatcherThreadParams* watcher_thread_params = + reinterpret_cast<WatcherThreadParams*>(param); + watcher_thread_params->has_initialized.Notify(); + GTEST_CHECK_(::WaitForSingleObject(watcher_thread_params->handle, + INFINITE) == WAIT_OBJECT_0); + OnThreadExit(watcher_thread_params->thread_id); + ::CloseHandle(watcher_thread_params->handle); + delete watcher_thread_params; return 0; } @@ -1033,12 +1048,12 @@ GTestLog::~GTestLog() { } } +#if GTEST_HAS_STREAM_REDIRECTION + // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) GTEST_DISABLE_MSC_DEPRECATED_PUSH_() -#if GTEST_HAS_STREAM_REDIRECTION - namespace { #if defined(GTEST_OS_LINUX_ANDROID) || defined(GTEST_OS_IOS) @@ -1333,8 +1348,8 @@ bool ParseInt32(const Message& src_text, const char* str, int32_t* value) { ) { Message msg; msg << "WARNING: " << src_text - << " is expected to be a 32-bit integer, but actually" - << " has value " << str << ", which overflows.\n"; + << " is expected to be a 32-bit integer, but actually" << " has value " + << str << ", which overflows.\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; diff --git a/deps/googletest/src/gtest-printers.cc b/deps/googletest/src/gtest-printers.cc index e3acecba8e4dec..f65573077861b4 100644 --- a/deps/googletest/src/gtest-printers.cc +++ b/deps/googletest/src/gtest-printers.cc @@ -50,7 +50,7 @@ #include <iomanip> #include <ios> #include <ostream> // NOLINT -#include <string> +#include <string_view> #include <type_traits> #include "gtest/internal/gtest-port.h" @@ -333,14 +333,14 @@ void PrintTo(__int128_t v, ::std::ostream* os) { // Prints the given array of characters to the ostream. CharType must be either // char, char8_t, char16_t, char32_t, or wchar_t. -// The array starts at begin, the length is len, it may include '\0' characters -// and may not be NUL-terminated. +// The array starts at begin (which may be nullptr) and contains len characters. +// The array may include '\0' characters and may not be NUL-terminated. template <typename CharType> GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ static CharFormat PrintCharsAsStringTo(const CharType* begin, size_t len, ostream* os) { - const char* const quote_prefix = GetCharWidthPrefix(*begin); + const char* const quote_prefix = GetCharWidthPrefix(CharType()); *os << quote_prefix << "\""; bool is_previous_hex = false; CharFormat print_format = kAsIs; @@ -516,13 +516,13 @@ bool IsValidUTF8(const char* str, size_t length) { void ConditionalPrintAsText(const char* str, size_t length, ostream* os) { if (!ContainsUnprintableControlCodes(str, length) && IsValidUTF8(str, length)) { - *os << "\n As Text: \"" << str << "\""; + *os << "\n As Text: \"" << ::std::string_view(str, length) << "\""; } } } // anonymous namespace -void PrintStringTo(const ::std::string& s, ostream* os) { +void PrintStringTo(::std::string_view s, ostream* os) { if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) { if (GTEST_FLAG_GET(print_utf8)) { ConditionalPrintAsText(s.data(), s.size(), os); @@ -531,21 +531,21 @@ void PrintStringTo(const ::std::string& s, ostream* os) { } #ifdef __cpp_lib_char8_t -void PrintU8StringTo(const ::std::u8string& s, ostream* os) { +void PrintU8StringTo(::std::u8string_view s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif -void PrintU16StringTo(const ::std::u16string& s, ostream* os) { +void PrintU16StringTo(::std::u16string_view s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } -void PrintU32StringTo(const ::std::u32string& s, ostream* os) { +void PrintU32StringTo(::std::u32string_view s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #if GTEST_HAS_STD_WSTRING -void PrintWideStringTo(const ::std::wstring& s, ostream* os) { +void PrintWideStringTo(::std::wstring_view s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_STD_WSTRING diff --git a/deps/googletest/src/gtest.cc b/deps/googletest/src/gtest.cc index 7dc80594362f5a..193f880be27fff 100644 --- a/deps/googletest/src/gtest.cc +++ b/deps/googletest/src/gtest.cc @@ -192,12 +192,17 @@ static const char kDefaultOutputFormat[] = "xml"; // The default output file. static const char kDefaultOutputFile[] = "test_detail"; +// These environment variables are set by Bazel. +// https://bazel.build/reference/test-encyclopedia#initial-conditions +// // The environment variable name for the test shard index. static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; // The environment variable name for the total number of test shards. static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; // The environment variable name for the test shard status file. static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; +// The environment variable name for the test output warnings file. +static const char kTestWarningsOutputFile[] = "TEST_WARNINGS_OUTPUT_FILE"; namespace internal { @@ -258,6 +263,19 @@ GTEST_DEFINE_bool_( testing::GetDefaultFailFast()), "True if and only if a test failure should stop further test execution."); +GTEST_DEFINE_bool_( + fail_if_no_test_linked, + testing::internal::BoolFromGTestEnv("fail_if_no_test_linked", false), + "True if and only if the test should fail if no test case (including " + "disabled test cases) is linked."); + +GTEST_DEFINE_bool_( + fail_if_no_test_selected, + testing::internal::BoolFromGTestEnv("fail_if_no_test_selected", false), + "True if and only if the test should fail if no test case is selected to " + "run. A test case is selected to run if it is not disabled and is matched " + "by the filter flag so that it starts executing."); + GTEST_DEFINE_bool_( also_run_disabled_tests, testing::internal::BoolFromGTestEnv("also_run_disabled_tests", false), @@ -379,7 +397,7 @@ GTEST_DEFINE_string_( testing::internal::StringFromGTestEnv("stream_result_to", ""), "This flag specifies the host name and the port number on which to stream " "test results. Example: \"localhost:555\". The flag is effective only on " - "Linux."); + "Linux and macOS."); GTEST_DEFINE_bool_( throw_on_failure, @@ -451,6 +469,19 @@ static bool ShouldRunTestSuite(const TestSuite* test_suite) { return test_suite->should_run(); } +namespace { + +// Returns true if test part results of type `type` should include a stack +// trace. +bool ShouldEmitStackTraceForResultType(TestPartResult::Type type) { + // Suppress emission of the stack trace for SUCCEED() since it likely never + // requires investigation, and GTEST_SKIP() since skipping is an intentional + // act by the developer rather than a failure requiring investigation. + return type != TestPartResult::kSuccess && type != TestPartResult::kSkip; +} + +} // namespace + // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) @@ -463,10 +494,7 @@ void AssertHelper::operator=(const Message& message) const { UnitTest::GetInstance()->AddTestPartResult( data_->type, data_->file, data_->line, AppendUserMessage(data_->message, message), - // Suppress emission of the stack trace for GTEST_SKIP() since skipping is - // an intentional act by the developer rather than a failure requiring - // investigation. - data_->type != TestPartResult::kSkip + ShouldEmitStackTraceForResultType(data_->type) ? UnitTest::GetInstance()->impl()->CurrentOsStackTraceExceptTop(1) : "" // Skips the stack frame for this function itself. @@ -526,7 +554,8 @@ void InsertSyntheticTestCase(const std::string& name, CodeLocation location, if (ignored.find(name) != ignored.end()) return; const char kMissingInstantiation[] = // - " is defined via TEST_P, but never instantiated. None of the test cases " + " is defined via TEST_P, but never instantiated. None of the test " + "cases " "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only " "ones provided expand to nothing." "\n\n" @@ -567,7 +596,7 @@ void InsertSyntheticTestCase(const std::string& name, CodeLocation location, void RegisterTypeParameterizedTestSuite(const char* test_suite_name, CodeLocation code_location) { GetUnitTestImpl()->type_parameterized_test_registry().RegisterTestSuite( - test_suite_name, code_location); + test_suite_name, std::move(code_location)); } void RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) { @@ -578,7 +607,7 @@ void RegisterTypeParameterizedTestSuiteInstantiation(const char* case_name) { void TypeParameterizedTestSuiteRegistry::RegisterTestSuite( const char* test_suite_name, CodeLocation code_location) { suites_.emplace(std::string(test_suite_name), - TypeParameterizedTestSuiteInfo(code_location)); + TypeParameterizedTestSuiteInfo(std::move(code_location))); } void TypeParameterizedTestSuiteRegistry::RegisterInstantiation( @@ -605,10 +634,12 @@ void TypeParameterizedTestSuiteRegistry::CheckForInstantiations() { "\n\n" "Ideally, TYPED_TEST_P definitions should only ever be included as " "part of binaries that intend to use them. (As opposed to, for " - "example, being placed in a library that may be linked in to get other " + "example, being placed in a library that may be linked in to get " + "other " "utilities.)" "\n\n" - "To suppress this error for this test suite, insert the following line " + "To suppress this error for this test suite, insert the following " + "line " "(in a non-header) in the namespace it is defined in:" "\n\n" "GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(" + @@ -648,11 +679,14 @@ ::std::vector<std::string> GetArgvs() { FilePath GetCurrentExecutableName() { FilePath result; + auto args = GetArgvs(); + if (!args.empty()) { #if defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_OS2) - result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe")); + result.Set(FilePath(args[0]).RemoveExtension("exe")); #else - result.Set(FilePath(GetArgvs()[0])); + result.Set(FilePath(args[0])); #endif // GTEST_OS_WINDOWS + } return result.RemoveDirectoryName(); } @@ -679,7 +713,7 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() { const char* const gtest_output_flag = s.c_str(); std::string format = GetOutputFormat(); - if (format.empty()) format = std::string(kDefaultOutputFormat); + if (format.empty()) format = kDefaultOutputFormat; const char* const colon = strchr(gtest_output_flag, ':'); if (colon == nullptr) @@ -788,7 +822,7 @@ class UnitTestFilter { // Returns true if and only if name matches at least one of the patterns in // the filter. bool MatchesName(const std::string& name) const { - return exact_match_patterns_.count(name) > 0 || + return exact_match_patterns_.find(name) != exact_match_patterns_.end() || std::any_of(glob_patterns_.begin(), glob_patterns_.end(), [&name](const std::string& pattern) { return PatternMatchesString( @@ -1052,14 +1086,14 @@ void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( // Returns the global test part result reporter. TestPartResultReporterInterface* UnitTestImpl::GetGlobalTestPartResultReporter() { - internal::MutexLock lock(&global_test_part_result_reporter_mutex_); + internal::MutexLock lock(global_test_part_result_reporter_mutex_); return global_test_part_result_reporter_; } // Sets the global test part result reporter. void UnitTestImpl::SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter) { - internal::MutexLock lock(&global_test_part_result_reporter_mutex_); + internal::MutexLock lock(global_test_part_result_reporter_mutex_); global_test_part_result_reporter_ = reporter; } @@ -1461,17 +1495,17 @@ class Hunk { // Print a unified diff header for one hunk. // The format is // "@@ -<left_start>,<left_length> +<right_start>,<right_length> @@" - // where the left/right parts are omitted if unnecessary. + // where the left/right lengths are omitted if unnecessary. void PrintHeader(std::ostream* ss) const { - *ss << "@@ "; - if (removes_) { - *ss << "-" << left_start_ << "," << (removes_ + common_); + size_t left_length = removes_ + common_; + size_t right_length = adds_ + common_; + *ss << "@@ " << "-" << left_start_; + if (left_length != 1) { + *ss << "," << left_length; } - if (removes_ && adds_) { - *ss << " "; - } - if (adds_) { - *ss << "+" << right_start_ << "," << (adds_ + common_); + *ss << " " << "+" << right_start_; + if (right_length != 1) { + *ss << "," << right_length; } *ss << " @@\n"; } @@ -1644,10 +1678,25 @@ std::string GetBoolAssertionFailureMessage( return msg.GetString(); } -// Helper function for implementing ASSERT_NEAR. +// Helper function for implementing ASSERT_NEAR. Treats infinity as a specific +// value, such that comparing infinity to infinity is equal, the distance +// between -infinity and +infinity is infinity, and infinity <= infinity is +// true. AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error) { + // We want to return success when the two values are infinity and at least + // one of the following is true: + // * The values are the same-signed infinity. + // * The error limit itself is infinity. + // This is done here so that we don't end up with a NaN when calculating the + // difference in values. + if (std::isinf(val1) && std::isinf(val2) && + (std::signbit(val1) == std::signbit(val2) || + (abs_error > 0.0 && std::isinf(abs_error)))) { + return AssertionSuccess(); + } + const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); @@ -2298,7 +2347,7 @@ void TestResult::RecordProperty(const std::string& xml_element, if (!ValidateTestProperty(xml_element, test_property)) { return; } - internal::MutexLock lock(&test_properties_mutex_); + internal::MutexLock lock(test_properties_mutex_); const std::vector<TestProperty>::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); @@ -2327,7 +2376,7 @@ static const char* const kReservedTestCaseAttributes[] = { "type_param", "value_param", "file", "line"}; // Use a slightly different set for allowed output to ensure existing tests can -// still RecordProperty("result") or "RecordProperty(timestamp") +// still RecordProperty("result") or RecordProperty("timestamp") static const char* const kReservedOutputTestCaseAttributes[] = { "classname", "name", "status", "time", "type_param", "value_param", "file", "line", "result", "timestamp"}; @@ -2727,18 +2776,16 @@ bool Test::IsSkipped() { // Constructs a TestInfo object. It assumes ownership of the test factory // object. -TestInfo::TestInfo(const std::string& a_test_suite_name, - const std::string& a_name, const char* a_type_param, - const char* a_value_param, +TestInfo::TestInfo(std::string a_test_suite_name, std::string a_name, + const char* a_type_param, const char* a_value_param, internal::CodeLocation a_code_location, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory) - : test_suite_name_(a_test_suite_name), - // begin()/end() is MSVC 17.3.3 ASAN crash workaround (GitHub issue #3997) - name_(a_name.begin(), a_name.end()), + : test_suite_name_(std::move(a_test_suite_name)), + name_(std::move(a_name)), type_param_(a_type_param ? new std::string(a_type_param) : nullptr), value_param_(a_value_param ? new std::string(a_value_param) : nullptr), - location_(a_code_location), + location_(std::move(a_code_location)), fixture_class_id_(fixture_class_id), should_run_(false), is_disabled_(false), @@ -2771,19 +2818,19 @@ namespace internal { // The newly created TestInfo instance will assume // ownership of the factory object. TestInfo* MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, + std::string test_suite_name, const char* name, const char* type_param, const char* value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = - new TestInfo(test_suite_name, name, type_param, value_param, - code_location, fixture_class_id, factory); + new TestInfo(std::move(test_suite_name), name, type_param, value_param, + std::move(code_location), fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; } void ReportInvalidTestSuiteType(const char* test_suite_name, - CodeLocation code_location) { + const CodeLocation& code_location) { Message errors; errors << "Attempted redefinition of test suite " << test_suite_name << ".\n" @@ -2823,14 +2870,13 @@ void TestInfo::Run() { } // Tells UnitTest where to store test result. - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_info(this); + UnitTest::GetInstance()->set_current_test_info(this); // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*this); result_.set_start_timestamp(internal::GetTimeInMillis()); internal::Timer timer; - impl->os_stack_trace_getter()->UponLeavingGTest(); + UnitTest::GetInstance()->UponLeavingGTest(); // Creates the test object. Test* const test = internal::HandleExceptionsInMethodIfSupported( @@ -2848,7 +2894,7 @@ void TestInfo::Run() { if (test != nullptr) { // Deletes the test object. - impl->os_stack_trace_getter()->UponLeavingGTest(); + UnitTest::GetInstance()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( test, &Test::DeleteSelf_, "the test fixture's destructor"); } @@ -2860,15 +2906,14 @@ void TestInfo::Run() { // Tells UnitTest to stop associating assertion results to this // test. - impl->set_current_test_info(nullptr); + UnitTest::GetInstance()->set_current_test_info(nullptr); } // Skip and records a skipped test result for this object. void TestInfo::Skip() { if (!should_run_) return; - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_info(this); + UnitTest::GetInstance()->set_current_test_info(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); @@ -2877,12 +2922,13 @@ void TestInfo::Skip() { const TestPartResult test_part_result = TestPartResult(TestPartResult::kSkip, this->file(), this->line(), ""); - impl->GetTestPartResultReporterForCurrentThread()->ReportTestPartResult( - test_part_result); + internal::GetUnitTestImpl() + ->GetTestPartResultReporterForCurrentThread() + ->ReportTestPartResult(test_part_result); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*this); - impl->set_current_test_info(nullptr); + UnitTest::GetInstance()->set_current_test_info(nullptr); } // class TestSuite @@ -2936,7 +2982,7 @@ int TestSuite::total_test_count() const { // this is not a typed or a type-parameterized test suite. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite -TestSuite::TestSuite(const char* a_name, const char* a_type_param, +TestSuite::TestSuite(const std::string& a_name, const char* a_type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) : name_(a_name), @@ -2978,8 +3024,7 @@ void TestSuite::AddTestInfo(TestInfo* test_info) { void TestSuite::Run() { if (!should_run_) return; - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_suite(this); + UnitTest::GetInstance()->set_current_test_suite(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); @@ -3009,7 +3054,7 @@ void TestSuite::Run() { repeater->OnTestCaseStart(*this); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - impl->os_stack_trace_getter()->UponLeavingGTest(); + UnitTest::GetInstance()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()"); @@ -3034,7 +3079,7 @@ void TestSuite::Run() { } elapsed_time_ = timer.Elapsed(); - impl->os_stack_trace_getter()->UponLeavingGTest(); + UnitTest::GetInstance()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()"); @@ -3045,15 +3090,14 @@ void TestSuite::Run() { repeater->OnTestCaseEnd(*this); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - impl->set_current_test_suite(nullptr); + UnitTest::GetInstance()->set_current_test_suite(nullptr); } // Skips all tests under this TestSuite. void TestSuite::Skip() { if (!should_run_) return; - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_suite(this); + UnitTest::GetInstance()->set_current_test_suite(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); @@ -3075,7 +3119,7 @@ void TestSuite::Skip() { repeater->OnTestCaseEnd(*this); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - impl->set_current_test_suite(nullptr); + UnitTest::GetInstance()->set_current_test_suite(nullptr); } // Clears the results of all tests in this test suite. @@ -3176,9 +3220,9 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) { } // class PrettyUnitTestResultPrinter -#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \ - !defined(GTEST_OS_WINDOWS_PHONE) && !defined(GTEST_OS_WINDOWS_RT) && \ - !defined(GTEST_OS_WINDOWS_MINGW) +#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \ + !defined(GTEST_OS_WINDOWS_GAMES) && !defined(GTEST_OS_WINDOWS_PHONE) && \ + !defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_WINDOWS_MINGW) // Returns the character attribute for the given color. static WORD GetColorAttribute(GTestColor color) { @@ -3261,7 +3305,9 @@ bool ShouldUseColor(bool stdout_is_tty) { const bool term_supports_color = term != nullptr && (String::CStringEquals(term, "xterm") || String::CStringEquals(term, "xterm-color") || + String::CStringEquals(term, "xterm-ghostty") || String::CStringEquals(term, "xterm-kitty") || + String::CStringEquals(term, "alacritty") || String::CStringEquals(term, "screen") || String::CStringEquals(term, "tmux") || String::CStringEquals(term, "rxvt-unicode") || @@ -3304,9 +3350,9 @@ static void ColoredPrintf(GTestColor color, const char* fmt, ...) { return; } -#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \ - !defined(GTEST_OS_WINDOWS_PHONE) && !defined(GTEST_OS_WINDOWS_RT) && \ - !defined(GTEST_OS_WINDOWS_MINGW) +#if defined(GTEST_OS_WINDOWS) && !defined(GTEST_OS_WINDOWS_MOBILE) && \ + !defined(GTEST_OS_WINDOWS_GAMES) && !defined(GTEST_OS_WINDOWS_PHONE) && \ + !defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_WINDOWS_MINGW) const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // Gets the current text color. @@ -3962,6 +4008,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener { static void OutputXmlTestSuiteForTestResult(::std::ostream* stream, const TestResult& result); + // Streams a test case XML stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputXmlTestCaseForTestResult(::std::ostream* stream, + const TestResult& result); + // Streams an XML representation of a TestResult object. static void OutputXmlTestResult(::std::ostream* stream, const TestResult& result); @@ -3979,16 +4031,11 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener { static void PrintXmlUnitTest(::std::ostream* stream, const UnitTest& unit_test); - // Produces a string representing the test properties in a result as space - // delimited XML attributes based on the property key="value" pairs. - // When the std::string is not empty, it includes a space at the beginning, - // to delimit this attribute from prior attributes. - static std::string TestPropertiesAsXmlAttributes(const TestResult& result); - // Streams an XML representation of the test properties of a TestResult // object. static void OutputXmlTestProperties(std::ostream* stream, - const TestResult& result); + const TestResult& result, + const std::string& indent); // The output file. const std::string output_file_; @@ -4209,6 +4256,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult( FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); *stream << ">"; + OutputXmlTestCaseForTestResult(stream, result); + + // Complete the test suite. + *stream << " </testsuite>\n"; +} + +// Streams a test case XML stanza containing the given test result. +void XmlUnitTestResultPrinter::OutputXmlTestCaseForTestResult( + ::std::ostream* stream, const TestResult& result) { // Output the boilerplate for a minimal test case with a single test. *stream << " <testcase"; OutputXmlAttribute(stream, "testcase", "name", ""); @@ -4223,9 +4279,6 @@ void XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult( // Output the actual test result. OutputXmlTestResult(stream, result); - - // Complete the test suite. - *stream << " </testsuite>\n"; } // Prints an XML representation of a TestInfo object. @@ -4302,8 +4355,8 @@ void XmlUnitTestResultPrinter::OutputXmlTestResult(::std::ostream* stream, internal::FormatCompilerIndependentFileLocation(part.file_name(), part.line_number()); const std::string summary = location + "\n" + part.summary(); - *stream << " <skipped message=\"" - << EscapeXmlAttribute(summary.c_str()) << "\">"; + *stream << " <skipped message=\"" << EscapeXmlAttribute(summary) + << "\">"; const std::string detail = location + "\n" + part.message(); OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); *stream << "</skipped>\n"; @@ -4316,7 +4369,7 @@ void XmlUnitTestResultPrinter::OutputXmlTestResult(::std::ostream* stream, if (failures == 0 && skips == 0) { *stream << ">\n"; } - OutputXmlTestProperties(stream, result); + OutputXmlTestProperties(stream, result, /*indent=*/" "); *stream << " </testcase>\n"; } } @@ -4345,13 +4398,18 @@ void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream, OutputXmlAttribute( stream, kTestsuite, "timestamp", FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp())); - *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result()); } *stream << ">\n"; + OutputXmlTestProperties(stream, test_suite.ad_hoc_test_result(), + /*indent=*/" "); for (int i = 0; i < test_suite.total_test_count(); ++i) { if (test_suite.GetTestInfo(i)->is_reportable()) OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } + if (test_suite.ad_hoc_test_result().Failed()) { + OutputXmlTestCaseForTestResult(stream, test_suite.ad_hoc_test_result()); + } + *stream << " </" << kTestsuite << ">\n"; } @@ -4381,11 +4439,12 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, OutputXmlAttribute(stream, kTestsuites, "random_seed", StreamableToString(unit_test.random_seed())); } - *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result()); OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); *stream << ">\n"; + OutputXmlTestProperties(stream, unit_test.ad_hoc_test_result(), + /*indent=*/" "); for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i)); @@ -4422,21 +4481,8 @@ void XmlUnitTestResultPrinter::PrintXmlTestsList( *stream << "</" << kTestsuites << ">\n"; } -// Produces a string representing the test properties in a result as space -// delimited XML attributes based on the property key="value" pairs. -std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( - const TestResult& result) { - Message attributes; - for (int i = 0; i < result.test_property_count(); ++i) { - const TestProperty& property = result.GetTestProperty(i); - attributes << " " << property.key() << "=" - << "\"" << EscapeXmlAttribute(property.value()) << "\""; - } - return attributes.GetString(); -} - void XmlUnitTestResultPrinter::OutputXmlTestProperties( - std::ostream* stream, const TestResult& result) { + std::ostream* stream, const TestResult& result, const std::string& indent) { const std::string kProperties = "properties"; const std::string kProperty = "property"; @@ -4444,15 +4490,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestProperties( return; } - *stream << " <" << kProperties << ">\n"; + *stream << indent << "<" << kProperties << ">\n"; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); - *stream << " <" << kProperty; + *stream << indent << " <" << kProperty; *stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\""; *stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\""; *stream << "/>\n"; } - *stream << " </" << kProperties << ">\n"; + *stream << indent << "</" << kProperties << ">\n"; } // End XmlUnitTestResultPrinter @@ -4491,6 +4537,12 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener { static void OutputJsonTestSuiteForTestResult(::std::ostream* stream, const TestResult& result); + // Streams a test case JSON stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputJsonTestCaseForTestResult(::std::ostream* stream, + const TestResult& result); + // Streams a JSON representation of a TestResult object. static void OutputJsonTestResult(::std::ostream* stream, const TestResult& result); @@ -4661,6 +4713,15 @@ void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult( } *stream << Indent(6) << "\"testsuite\": [\n"; + OutputJsonTestCaseForTestResult(stream, result); + + // Finish the test suite. + *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}"; +} + +// Streams a test case JSON stanza containing the given test result. +void JsonUnitTestResultPrinter::OutputJsonTestCaseForTestResult( + ::std::ostream* stream, const TestResult& result) { // Output the boilerplate for a new test case. *stream << Indent(8) << "{\n"; OutputJsonKey(stream, "testcase", "name", "", Indent(10)); @@ -4677,9 +4738,6 @@ void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult( // Output the actual test result. OutputJsonTestResult(stream, result); - - // Finish the test suite. - *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}"; } // Prints a JSON representation of a TestInfo object. @@ -4734,28 +4792,53 @@ void JsonUnitTestResultPrinter::OutputJsonTestResult(::std::ostream* stream, const TestResult& result) { const std::string kIndent = Indent(10); - int failures = 0; - for (int i = 0; i < result.total_part_count(); ++i) { - const TestPartResult& part = result.GetTestPartResult(i); - if (part.failed()) { - *stream << ",\n"; - if (++failures == 1) { - *stream << kIndent << "\"" - << "failures" - << "\": [\n"; + { + int failures = 0; + for (int i = 0; i < result.total_part_count(); ++i) { + const TestPartResult& part = result.GetTestPartResult(i); + if (part.failed()) { + *stream << ",\n"; + if (++failures == 1) { + *stream << kIndent << "\"" << "failures" << "\": [\n"; + } + const std::string location = + internal::FormatCompilerIndependentFileLocation(part.file_name(), + part.line_number()); + const std::string message = + EscapeJson(location + "\n" + part.message()); + *stream << kIndent << " {\n" + << kIndent << " \"failure\": \"" << message << "\",\n" + << kIndent << " \"type\": \"\"\n" + << kIndent << " }"; } - const std::string location = - internal::FormatCompilerIndependentFileLocation(part.file_name(), - part.line_number()); - const std::string message = EscapeJson(location + "\n" + part.message()); - *stream << kIndent << " {\n" - << kIndent << " \"failure\": \"" << message << "\",\n" - << kIndent << " \"type\": \"\"\n" - << kIndent << " }"; } + + if (failures > 0) *stream << "\n" << kIndent << "]"; + } + + { + int skipped = 0; + for (int i = 0; i < result.total_part_count(); ++i) { + const TestPartResult& part = result.GetTestPartResult(i); + if (part.skipped()) { + *stream << ",\n"; + if (++skipped == 1) { + *stream << kIndent << "\"" << "skipped" << "\": [\n"; + } + const std::string location = + internal::FormatCompilerIndependentFileLocation(part.file_name(), + part.line_number()); + const std::string message = + EscapeJson(location + "\n" + part.message()); + *stream << kIndent << " {\n" + << kIndent << " \"message\": \"" << message << "\"\n" + << kIndent << " }"; + } + } + + if (skipped > 0) *stream << "\n" << kIndent << "]"; } - if (failures > 0) *stream << "\n" << kIndent << "]"; *stream << "\n" << Indent(8) << "}"; } @@ -4799,6 +4882,16 @@ void JsonUnitTestResultPrinter::PrintJsonTestSuite( OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } } + + // If there was a failure in the test suite setup or teardown include that in + // the output. + if (test_suite.ad_hoc_test_result().Failed()) { + if (comma) { + *stream << ",\n"; + } + OutputJsonTestCaseForTestResult(stream, test_suite.ad_hoc_test_result()); + } + *stream << "\n" << kIndent << "]\n" << Indent(4) << "}"; } @@ -4892,8 +4985,8 @@ std::string JsonUnitTestResultPrinter::TestPropertiesAsJson( for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << ",\n" - << indent << "\"" << property.key() << "\": " - << "\"" << EscapeJson(property.value()) << "\""; + << indent << "\"" << property.key() << "\": " << "\"" + << EscapeJson(property.value()) << "\""; } return attributes.GetString(); } @@ -4995,7 +5088,7 @@ std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count) void* caller_frame = nullptr; { - MutexLock lock(&mutex_); + MutexLock lock(mutex_); caller_frame = caller_frame_; } @@ -5034,12 +5127,12 @@ void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) { caller_frame = nullptr; } - MutexLock lock(&mutex_); + MutexLock lock(mutex_); caller_frame_ = caller_frame; #endif // GTEST_HAS_ABSL } -#ifdef GTEST_HAS_DEATH_TEST +#ifdef GTEST_INTERNAL_HAS_PREMATURE_EXIT_FILE // A helper class that creates the premature-exit file in its // constructor and deletes the file in its destructor. class ScopedPrematureExitFile { @@ -5077,7 +5170,7 @@ class ScopedPrematureExitFile { ScopedPrematureExitFile(const ScopedPrematureExitFile&) = delete; ScopedPrematureExitFile& operator=(const ScopedPrematureExitFile&) = delete; }; -#endif // GTEST_HAS_DEATH_TEST +#endif // GTEST_INTERNAL_HAS_PREMATURE_EXIT_FILE } // namespace internal @@ -5291,6 +5384,22 @@ TestSuite* UnitTest::GetMutableTestSuite(int i) { return impl()->GetMutableSuiteCase(i); } +void UnitTest::UponLeavingGTest() { + impl()->os_stack_trace_getter()->UponLeavingGTest(); +} + +// Sets the TestSuite object for the test that's currently running. +void UnitTest::set_current_test_suite(TestSuite* a_current_test_suite) { + internal::MutexLock lock(mutex_); + impl_->set_current_test_suite(a_current_test_suite); +} + +// Sets the TestInfo object for the test that's currently running. +void UnitTest::set_current_test_info(TestInfo* a_current_test_info) { + internal::MutexLock lock(mutex_); + impl_->set_current_test_info(a_current_test_info); +} + // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& UnitTest::listeners() { return *impl()->listeners(); } @@ -5326,7 +5435,7 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type, Message msg; msg << message; - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); if (!impl_->gtest_trace_stack().empty()) { msg << "\n" << GTEST_NAME_ << " trace:"; @@ -5406,7 +5515,7 @@ void UnitTest::RecordProperty(const std::string& key, // We don't protect this under mutex_, as we only support calling it // from the main thread. int UnitTest::Run() { -#ifdef GTEST_HAS_DEATH_TEST +#ifdef GTEST_INTERNAL_HAS_PREMATURE_EXIT_FILE const bool in_death_test_child_process = !GTEST_FLAG_GET(internal_run_death_test).empty(); @@ -5437,7 +5546,7 @@ int UnitTest::Run() { : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE")); #else const bool in_death_test_child_process = false; -#endif // GTEST_HAS_DEATH_TEST +#endif // GTEST_INTERNAL_HAS_PREMATURE_EXIT_FILE // Captures the value of GTEST_FLAG(catch_exceptions). This value will be // used for the duration of the program. @@ -5450,7 +5559,7 @@ int UnitTest::Run() { // about crashes - they are expected. if (impl()->catch_exceptions() || in_death_test_child_process) { #if !defined(GTEST_OS_WINDOWS_MOBILE) && !defined(GTEST_OS_WINDOWS_PHONE) && \ - !defined(GTEST_OS_WINDOWS_RT) + !defined(GTEST_OS_WINDOWS_RT) && !defined(GTEST_OS_WINDOWS_GAMES) // SetErrorMode doesn't exist on CE. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); @@ -5509,7 +5618,7 @@ const char* UnitTest::original_working_dir() const { // or NULL if no test is running. const TestSuite* UnitTest::current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); return impl_->current_test_suite(); } @@ -5517,7 +5626,7 @@ const TestSuite* UnitTest::current_test_suite() const #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* UnitTest::current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); return impl_->current_test_suite(); } #endif @@ -5526,7 +5635,7 @@ const TestCase* UnitTest::current_test_case() const // or NULL if no test is running. const TestInfo* UnitTest::current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); return impl_->current_test_info(); } @@ -5550,13 +5659,13 @@ UnitTest::~UnitTest() { delete impl_; } // Google Test trace stack. void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); impl_->gtest_trace_stack().push_back(trace); } // Pops a trace from the per-thread Google Test trace stack. void UnitTest::PopGTestTrace() GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); + internal::MutexLock lock(mutex_); impl_->gtest_trace_stack().pop_back(); } @@ -5720,29 +5829,6 @@ void UnitTestImpl::PostFlagParsingInit() { } } -// A predicate that checks the name of a TestSuite against a known -// value. -// -// This is used for implementation of the UnitTest class only. We put -// it in the anonymous namespace to prevent polluting the outer -// namespace. -// -// TestSuiteNameIs is copyable. -class TestSuiteNameIs { - public: - // Constructor. - explicit TestSuiteNameIs(const std::string& name) : name_(name) {} - - // Returns true if and only if the name of test_suite matches name_. - bool operator()(const TestSuite* test_suite) const { - return test_suite != nullptr && - strcmp(test_suite->name(), name_.c_str()) == 0; - } - - private: - std::string name_; -}; - // Finds and returns a TestSuite with the given name. If one doesn't // exist, creates one and returns it. It's the CALLER'S // RESPONSIBILITY to ensure that this function is only called WHEN THE @@ -5756,19 +5842,27 @@ class TestSuiteNameIs { // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite TestSuite* UnitTestImpl::GetTestSuite( - const char* test_suite_name, const char* type_param, + const std::string& test_suite_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) { - // Can we find a TestSuite with the given name? - const auto test_suite = - std::find_if(test_suites_.rbegin(), test_suites_.rend(), - TestSuiteNameIs(test_suite_name)); + // During initialization, all TestInfos for a given suite are added in + // sequence. To optimize this case, see if the most recently added suite is + // the one being requested now. + if (!test_suites_.empty() && + (*test_suites_.rbegin())->name_ == test_suite_name) { + return *test_suites_.rbegin(); + } - if (test_suite != test_suites_.rend()) return *test_suite; + // Fall back to searching the collection. + auto item_it = test_suites_by_name_.find(test_suite_name); + if (item_it != test_suites_by_name_.end()) { + return item_it->second; + } - // No. Let's create one. + // Not found. Create a new instance. auto* const new_test_suite = new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc); + test_suites_by_name_.emplace(test_suite_name, new_test_suite); const UnitTestFilter death_test_suite_filter(kDeathTestSuiteFilter); // Is this a death test suite? @@ -5794,6 +5888,23 @@ TestSuite* UnitTestImpl::GetTestSuite( static void SetUpEnvironment(Environment* env) { env->SetUp(); } static void TearDownEnvironment(Environment* env) { env->TearDown(); } +// If the environment variable TEST_WARNINGS_OUTPUT_FILE was provided, appends +// `str` to the file, creating the file if necessary. +#if GTEST_HAS_FILE_SYSTEM +static void AppendToTestWarningsOutputFile(const std::string& str) { + const char* const filename = posix::GetEnv(kTestWarningsOutputFile); + if (filename == nullptr) { + return; + } + auto* const file = posix::FOpen(filename, "a"); + if (file == nullptr) { + return; + } + GTEST_CHECK_(fwrite(str.data(), 1, str.size(), file) == str.size()); + GTEST_CHECK_(posix::FClose(file) == 0); +} +#endif // GTEST_HAS_FILE_SYSTEM + // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, the test is considered to be failed, but the @@ -5815,6 +5926,28 @@ bool UnitTestImpl::RunAllTests() { // user didn't call InitGoogleTest. PostFlagParsingInit(); + // Handle the case where the program has no tests linked. + // Sometimes this is a programmer mistake, but sometimes it is intended. + if (total_test_count() == 0) { + constexpr char kNoTestLinkedMessage[] = + "This test program does NOT link in any test case."; + constexpr char kNoTestLinkedFatal[] = + "This is INVALID. Please make sure to link in at least one test case."; + constexpr char kNoTestLinkedWarning[] = + "Please make sure this is intended."; + const bool fail_if_no_test_linked = GTEST_FLAG_GET(fail_if_no_test_linked); + ColoredPrintf( + GTestColor::kRed, "%s %s\n", kNoTestLinkedMessage, + fail_if_no_test_linked ? kNoTestLinkedFatal : kNoTestLinkedWarning); + if (fail_if_no_test_linked) { + return false; + } +#if GTEST_HAS_FILE_SYSTEM + AppendToTestWarningsOutputFile(std::string(kNoTestLinkedMessage) + ' ' + + kNoTestLinkedWarning + '\n'); +#endif // GTEST_HAS_FILE_SYSTEM + } + #if GTEST_HAS_FILE_SYSTEM // Even if sharding is not on, test runners may want to use the // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding @@ -5954,6 +6087,20 @@ bool UnitTestImpl::RunAllTests() { TearDownEnvironment); repeater->OnEnvironmentsTearDownEnd(*parent_); } + } else if (GTEST_FLAG_GET(fail_if_no_test_selected)) { + // If there were no tests to run, bail if we were requested to be + // strict. + constexpr char kNoTestsSelectedMessage[] = + "No tests ran. Check that tests exist and are not disabled or " + "filtered out.\n\n" + "For sharded runs, this error indicates an empty shard. This can " + "happen if you have more shards than tests, or if --gtest_filter " + "leaves a shard with no tests.\n\n" + "To permit empty shards (e.g., when debugging with a filter), " + "specify \n" + "--gtest_fail_if_no_test_selected=false."; + ColoredPrintf(GTestColor::kRed, "%s\n", kNoTestsSelectedMessage); + return false; } elapsed_time_ = timer.Elapsed(); @@ -5981,6 +6128,23 @@ bool UnitTestImpl::RunAllTests() { } repeater->OnTestProgramEnd(*parent_); + // Destroy environments in normal code, not in static teardown. + bool delete_environment_on_teardown = true; + if (delete_environment_on_teardown) { + ForEach(environments_, internal::Delete<Environment>); + environments_.clear(); + } + + // Try to warn the user if no tests matched the test filter. + if (ShouldWarnIfNoTestsMatchFilter()) { + const std::string filter_warning = + std::string("filter \"") + GTEST_FLAG_GET(filter) + + "\" did not match any test; no tests were run\n"; + ColoredPrintf(GTestColor::kRed, "WARNING: %s", filter_warning.c_str()); +#if GTEST_HAS_FILE_SYSTEM + AppendToTestWarningsOutputFile(filter_warning); +#endif // GTEST_HAS_FILE_SYSTEM + } if (!gtest_is_initialized_before_run_all_tests) { ColoredPrintf( @@ -6114,12 +6278,11 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { int num_runnable_tests = 0; int num_selected_tests = 0; for (auto* test_suite : test_suites_) { - const std::string& test_suite_name = test_suite->name(); + const std::string& test_suite_name = test_suite->name_; test_suite->set_should_run(false); - for (size_t j = 0; j < test_suite->test_info_list().size(); j++) { - TestInfo* const test_info = test_suite->test_info_list()[j]; - const std::string test_name(test_info->name()); + for (TestInfo* test_info : test_suite->test_info_list()) { + const std::string& test_name = test_info->name_; // A test is disabled if test suite name or test name matches // kDisableTestFilter. const bool is_disabled = @@ -6151,6 +6314,30 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { return num_selected_tests; } +// Returns true if a warning should be issued if no tests match the test filter +// flag. We can't simply count the number of tests that ran because, for +// instance, test sharding and death tests might mean no tests are expected to +// run in this process, but will run in another process. +bool UnitTestImpl::ShouldWarnIfNoTestsMatchFilter() const { + if (total_test_count() == 0) { + // No tests were linked in to program. + // This case is handled by a different warning. + return false; + } + const PositiveAndNegativeUnitTestFilter gtest_flag_filter( + GTEST_FLAG_GET(filter)); + for (auto* test_suite : test_suites_) { + const std::string& test_suite_name = test_suite->name_; + for (TestInfo* test_info : test_suite->test_info_list()) { + const std::string& test_name = test_info->name_; + if (gtest_flag_filter.MatchesTest(test_suite_name, test_name)) { + return false; + } + } + } + return true; +} + // Prints the given C-string on a single line by replacing all '\n' // characters with string "\\n". If the output takes more than // max_length characters, only prints the first max_length characters @@ -6597,6 +6784,8 @@ static bool ParseGoogleTestFlag(const char* const arg) { GTEST_INTERNAL_PARSE_FLAG(death_test_style); GTEST_INTERNAL_PARSE_FLAG(death_test_use_fork); GTEST_INTERNAL_PARSE_FLAG(fail_fast); + GTEST_INTERNAL_PARSE_FLAG(fail_if_no_test_linked); + GTEST_INTERNAL_PARSE_FLAG(fail_if_no_test_selected); GTEST_INTERNAL_PARSE_FLAG(filter); GTEST_INTERNAL_PARSE_FLAG(internal_run_death_test); GTEST_INTERNAL_PARSE_FLAG(list_tests); @@ -6660,17 +6849,17 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { } if (remove_flag) { - // Shift the remainder of the argv list left by one. Note - // that argv has (*argc + 1) elements, the last one always being - // NULL. The following loop moves the trailing NULL element as - // well. - for (int j = i; j != *argc; j++) { - argv[j] = argv[j + 1]; + // Shift the remainder of the argv list left by one. + for (int j = i + 1; j < *argc; ++j) { + argv[j - 1] = argv[j]; } // Decrements the argument count. (*argc)--; + // Terminate the array with nullptr. + argv[*argc] = nullptr; + // We also need to decrement the iterator as we just removed // an element. i--; diff --git a/deps/histogram/include/hdr/hdr_histogram_version.h b/deps/histogram/include/hdr/hdr_histogram_version.h index a9a4300170875a..ad6a118f5a771e 100644 --- a/deps/histogram/include/hdr/hdr_histogram_version.h +++ b/deps/histogram/include/hdr/hdr_histogram_version.h @@ -7,6 +7,6 @@ #ifndef HDR_HISTOGRAM_VERSION_H #define HDR_HISTOGRAM_VERSION_H -#define HDR_HISTOGRAM_VERSION "0.11.8" +#define HDR_HISTOGRAM_VERSION "0.11.9" #endif // HDR_HISTOGRAM_VERSION_H diff --git a/deps/histogram/src/hdr_histogram.c b/deps/histogram/src/hdr_histogram.c index 7a4c4fdfa30ff6..c620045cb174b2 100644 --- a/deps/histogram/src/hdr_histogram.c +++ b/deps/histogram/src/hdr_histogram.c @@ -341,10 +341,10 @@ static int32_t buckets_needed_to_cover_value(int64_t value, int32_t sub_bucket_c /* ## ## ######## ## ## ####### ## ## ## */ int hdr_calculate_bucket_config( - int64_t lowest_discernible_value, - int64_t highest_trackable_value, - int significant_figures, - struct hdr_histogram_bucket_config* cfg) + int64_t lowest_discernible_value, + int64_t highest_trackable_value, + int significant_figures, + struct hdr_histogram_bucket_config* cfg) { int32_t sub_bucket_count_magnitude; int64_t largest_value_with_single_unit_resolution; @@ -406,10 +406,10 @@ void hdr_init_preallocated(struct hdr_histogram* h, struct hdr_histogram_bucket_ } int hdr_init( - int64_t lowest_discernible_value, - int64_t highest_trackable_value, - int significant_figures, - struct hdr_histogram** result) + int64_t lowest_discernible_value, + int64_t highest_trackable_value, + int significant_figures, + struct hdr_histogram** result) { int64_t* counts; struct hdr_histogram_bucket_config cfg; @@ -492,13 +492,12 @@ bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count) { int32_t counts_index; - if (value < 0) + if (value < 0 || h->highest_trackable_value < value) { return false; } counts_index = counts_index_for(h, value); - if (counts_index < 0 || h->counts_len <= counts_index) { return false; @@ -514,7 +513,7 @@ bool hdr_record_values_atomic(struct hdr_histogram* h, int64_t value, int64_t co { int32_t counts_index; - if (value < 0) + if (value < 0 || h->highest_trackable_value < value) { return false; } diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 9f54372febca06..5a2eda629500c3 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -2,7 +2,7 @@ UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE -Copyright © 2016-2023 Unicode, Inc. +Copyright © 2016-2025 Unicode, Inc. NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR @@ -38,6 +38,8 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. +SPDX-License-Identifier: Unicode-3.0 + ---------------------------------------------------------------------- Third-Party Software Licenses @@ -431,6 +433,34 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- +JSON parsing library (nlohmann/json) + +File: vendor/json/upstream/single_include/nlohmann/json.hpp (only for ICU4C) + +MIT License + +Copyright (c) 2013-2022 Niels Lohmann + +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. + +---------------------------------------------------------------------- + File: aclocal.m4 (only for ICU4C) Section: pkg.m4 - Macros to locate and utilise pkg-config. @@ -471,7 +501,7 @@ File: config.guess (only for ICU4C) This file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3 of the License, or +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -510,3 +540,29 @@ publicity pertaining to distribution of the software without specific, written prior permission. M.I.T. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. + +---------------------------------------------------------------------- + +File: sorttable.js (only for ICU4J) + +The MIT Licence, for code from kryogenix.org + +Code downloaded from the Browser Experiments section of kryogenix.org is +licenced under the so-called MIT licence. The licence is below. + +Copyright (c) 1997-date Stuart Langridge + +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 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/icu-small/README-FULL-ICU.txt b/deps/icu-small/README-FULL-ICU.txt index 24c537d5b3adb0..882e0f28b6240e 100644 --- a/deps/icu-small/README-FULL-ICU.txt +++ b/deps/icu-small/README-FULL-ICU.txt @@ -1,8 +1,8 @@ ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=full-icu -It is a strict subset of ICU 74 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt74l.dat.bz2 : compressed data file +It is a strict subset of ICU 78 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt78l.dat.bz2 : compressed data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/BUILD.bazel b/deps/icu-small/source/common/BUILD.bazel index 3ecae30c437f08..e894ed907e6e61 100644 --- a/deps/icu-small/source/common/BUILD.bazel +++ b/deps/icu-small/source/common/BUILD.bazel @@ -64,6 +64,7 @@ cc_library( "umutex.cpp", "sharedobject.cpp", "utrace.cpp", + "fixedstring.cpp", ], deps = [ ":headers", diff --git a/deps/icu-small/source/common/appendable.cpp b/deps/icu-small/source/common/appendable.cpp index c0fbcc6530ad4a..de18148fe6d6c4 100644 --- a/deps/icu-small/source/common/appendable.cpp +++ b/deps/icu-small/source/common/appendable.cpp @@ -25,7 +25,7 @@ Appendable::~Appendable() {} UBool Appendable::appendCodePoint(UChar32 c) { if(c<=0xffff) { - return appendCodeUnit((char16_t)c); + return appendCodeUnit(static_cast<char16_t>(c)); } else { return appendCodeUnit(U16_LEAD(c)) && appendCodeUnit(U16_TRAIL(c)); } diff --git a/deps/icu-small/source/common/bmpset.cpp b/deps/icu-small/source/common/bmpset.cpp index 641c675c6706b6..9b2a2967f0dda3 100644 --- a/deps/icu-small/source/common/bmpset.cpp +++ b/deps/icu-small/source/common/bmpset.cpp @@ -75,7 +75,7 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) { int32_t trail=start&0x3f; // Named for UTF-8 2-byte trail byte with lower 6 bits. // Set one bit indicating an all-one block. - uint32_t bits=(uint32_t)1<<lead; + uint32_t bits = static_cast<uint32_t>(1) << lead; if((start+1)==limit) { // Single-character shortcut. table[trail]|=bits; return; @@ -100,9 +100,9 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) { ++lead; } if(lead<limitLead) { - bits=~(((unsigned)1<<lead)-1); + bits = ~((static_cast<unsigned>(1) << lead) - 1); if(limitLead<0x20) { - bits&=((unsigned)1<<limitLead)-1; + bits &= (static_cast<unsigned>(1) << limitLead) - 1; } for(trail=0; trail<64; ++trail) { table[trail]|=bits; @@ -111,7 +111,7 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) { // limit<=0x800. If limit==0x800 then limitLead=32 and limitTrail=0. // In that case, bits=1<<limitLead is undefined but the bits value // is not used because trail<limitTrail is already false. - bits=(uint32_t)1<<((limitLead == 0x20) ? (limitLead - 1) : limitLead); + bits = static_cast<uint32_t>(1) << ((limitLead == 0x20) ? (limitLead - 1) : limitLead); for(trail=0; trail<limitTrail; ++trail) { table[trail]|=bits; } @@ -290,22 +290,22 @@ int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const { UBool BMPSet::contains(UChar32 c) const { - if((uint32_t)c<=0xff) { - return (UBool)latin1Contains[c]; - } else if((uint32_t)c<=0x7ff) { - return (UBool)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0); - } else if((uint32_t)c<0xd800 || (c>=0xe000 && c<=0xffff)) { + if (static_cast<uint32_t>(c) <= 0xff) { + return latin1Contains[c]; + } else if (static_cast<uint32_t>(c) <= 0x7ff) { + return (table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0; + } else if (static_cast<uint32_t>(c) < 0xd800 || (c >= 0xe000 && c <= 0xffff)) { int lead=c>>12; uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001; if(twoBits<=1) { // All 64 code points with the same bits 15..6 // are either in the set or not. - return (UBool)twoBits; + return twoBits; } else { // Look up the code point in its 4k block of code points. return containsSlow(c, list4kStarts[lead], list4kStarts[lead+1]); } - } else if((uint32_t)c<=0x10ffff) { + } else if (static_cast<uint32_t>(c) <= 0x10ffff) { // surrogate or supplementary code point return containsSlow(c, list4kStarts[0xd], list4kStarts[0x11]); } else { @@ -332,7 +332,7 @@ BMPSet::span(const char16_t *s, const char16_t *limit, USetSpanCondition spanCon break; } } else if(c<=0x7ff) { - if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))==0) { + if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) { break; } } else if(c<0xd800 || c>=0xe000) { @@ -372,7 +372,7 @@ BMPSet::span(const char16_t *s, const char16_t *limit, USetSpanCondition spanCon break; } } else if(c<=0x7ff) { - if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) { + if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) { break; } } else if(c<0xd800 || c>=0xe000) { @@ -421,7 +421,7 @@ BMPSet::spanBack(const char16_t *s, const char16_t *limit, USetSpanCondition spa break; } } else if(c<=0x7ff) { - if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))==0) { + if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) { break; } } else if(c<0xd800 || c>=0xe000) { @@ -464,7 +464,7 @@ BMPSet::spanBack(const char16_t *s, const char16_t *limit, USetSpanCondition spa break; } } else if(c<=0x7ff) { - if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) { + if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) { break; } } else if(c<0xd800 || c>=0xe000) { @@ -527,7 +527,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi b=*s; } while(U8_IS_SINGLE(b)); } - length=(int32_t)(limit-s); + length = static_cast<int32_t>(limit - s); } if(spanCondition!=USET_SPAN_NOT_CONTAINED) { @@ -547,7 +547,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi * the truncated sequence. */ b=*(limit-1); - if((int8_t)b<0) { + if (static_cast<int8_t>(b) < 0) { // b>=0x80: lead or trail byte if(b<0xc0) { // single trail byte, check for preceding 3- or 4-byte lead byte @@ -602,15 +602,15 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi if(b>=0xe0) { if(b<0xf0) { if( /* handle U+0000..U+FFFF inline */ - (t1=(uint8_t)(s[0]-0x80)) <= 0x3f && - (t2=(uint8_t)(s[1]-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f && + (t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f ) { b&=0xf; uint32_t twoBits=(bmpBlockBits[t1]>>b)&0x10001; if(twoBits<=1) { // All 64 code points with this lead byte and middle trail byte // are either in the set or not. - if(twoBits!=(uint32_t)spanCondition) { + if (twoBits != static_cast<uint32_t>(spanCondition)) { return s-1; } } else { @@ -624,12 +624,12 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi continue; } } else if( /* handle U+10000..U+10FFFF inline */ - (t1=(uint8_t)(s[0]-0x80)) <= 0x3f && - (t2=(uint8_t)(s[1]-0x80)) <= 0x3f && - (t3=(uint8_t)(s[2]-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f && + (t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f && + (t3 = static_cast<uint8_t>(s[2] - 0x80)) <= 0x3f ) { // Give an illegal sequence the same value as the result of contains(FFFD). - UChar32 c=((UChar32)(b-0xf0)<<18)|((UChar32)t1<<12)|(t2<<6)|t3; + UChar32 c = (static_cast<UChar32>(b - 0xf0) << 18) | (static_cast<UChar32>(t1) << 12) | (t2 << 6) | t3; if( ( (0x10000<=c && c<=0x10ffff) ? containsSlow(c, list4kStarts[0x10], list4kStarts[0x11]) : containsFFFD @@ -643,9 +643,9 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi } else { if( /* handle U+0000..U+07FF inline */ b>=0xc0 && - (t1=(uint8_t)(*s-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(*s - 0x80)) <= 0x3f ) { - if((USetSpanCondition)((table7FF[t1]&((uint32_t)1<<(b&0x1f)))!=0) != spanCondition) { + if (static_cast<USetSpanCondition>((table7FF[t1] & (static_cast<uint32_t>(1) << (b & 0x1f))) != 0) != spanCondition) { return s-1; } ++s; @@ -711,7 +711,7 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon c=utf8_prevCharSafeBody(s, 0, &length, b, -3); // c is a valid code point, not ASCII, not a surrogate if(c<=0x7ff) { - if((USetSpanCondition)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) != spanCondition) { + if (static_cast<USetSpanCondition>((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) != spanCondition) { return prev+1; } } else if(c<=0xffff) { @@ -720,7 +720,7 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon if(twoBits<=1) { // All 64 code points with the same bits 15..6 // are either in the set or not. - if(twoBits!=(uint32_t)spanCondition) { + if (twoBits != static_cast<uint32_t>(spanCondition)) { return prev+1; } } else { diff --git a/deps/icu-small/source/common/bmpset.h b/deps/icu-small/source/common/bmpset.h index fad0310038ac81..00253f97c1263f 100644 --- a/deps/icu-small/source/common/bmpset.h +++ b/deps/icu-small/source/common/bmpset.h @@ -156,7 +156,7 @@ class BMPSet : public UMemory { }; inline UBool BMPSet::containsSlow(UChar32 c, int32_t lo, int32_t hi) const { - return (UBool)(findCodePoint(c, lo, hi) & 1); + return findCodePoint(c, lo, hi) & 1; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index 3f58287532e780..a903357938c257 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -86,7 +86,7 @@ UnhandledEngine::findBreaks( UText *text, if (U_FAILURE(status)) return 0; utext_setNativeIndex(text, startPos); UChar32 c = utext_current32(text); - while((int32_t)utext_getNativeIndex(text) < endPos && fHandled->contains(c)) { + while (static_cast<int32_t>(utext_getNativeIndex(text)) < endPos && fHandled->contains(c)) { utext_next32(text); // TODO: recast loop to work with post-increment operations. c = utext_current32(text); } @@ -114,13 +114,11 @@ UnhandledEngine::handleCharacter(UChar32 c) { */ ICULanguageBreakFactory::ICULanguageBreakFactory(UErrorCode &/*status*/) { - fEngines = 0; + fEngines = nullptr; } ICULanguageBreakFactory::~ICULanguageBreakFactory() { - if (fEngines != 0) { - delete fEngines; - } + delete fEngines; } void ICULanguageBreakFactory::ensureEngines(UErrorCode& status) { @@ -148,7 +146,7 @@ ICULanguageBreakFactory::getEngineFor(UChar32 c, const char* locale) { Mutex m(&gBreakEngineMutex); int32_t i = fEngines->size(); while (--i >= 0) { - lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i)); + lbe = static_cast<const LanguageBreakEngine*>(fEngines->elementAt(i)); if (lbe != nullptr && lbe->handles(c, locale)) { return lbe; } @@ -261,7 +259,7 @@ ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) { CharString ext; const char16_t *extStart = u_memrchr(dictfname, 0x002e, dictnlength); // last dot if (extStart != nullptr) { - int32_t len = (int32_t)(extStart - dictfname); + int32_t len = static_cast<int32_t>(extStart - dictfname); ext.appendInvariantChars(UnicodeString(false, extStart + 1, dictnlength - len - 1), status); dictnlength = len; } @@ -271,18 +269,18 @@ ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) { UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext.data(), dictnbuf.data(), &status); if (U_SUCCESS(status)) { // build trie - const uint8_t *data = (const uint8_t *)udata_getMemory(file); - const int32_t *indexes = (const int32_t *)data; + const uint8_t* data = static_cast<const uint8_t*>(udata_getMemory(file)); + const int32_t* indexes = reinterpret_cast<const int32_t*>(data); const int32_t offset = indexes[DictionaryData::IX_STRING_TRIE_OFFSET]; const int32_t trieType = indexes[DictionaryData::IX_TRIE_TYPE] & DictionaryData::TRIE_TYPE_MASK; DictionaryMatcher *m = nullptr; if (trieType == DictionaryData::TRIE_TYPE_BYTES) { const int32_t transform = indexes[DictionaryData::IX_TRANSFORM]; - const char *characters = (const char *)(data + offset); + const char* characters = reinterpret_cast<const char*>(data + offset); m = new BytesDictionaryMatcher(characters, transform, file); } else if (trieType == DictionaryData::TRIE_TYPE_UCHARS) { - const char16_t *characters = (const char16_t *)(data + offset); + const char16_t* characters = reinterpret_cast<const char16_t*>(data + offset); m = new UCharsDictionaryMatcher(characters, file); } if (m == nullptr) { @@ -339,12 +337,12 @@ int32_t BreakEngineWrapper::findBreaks( // extends towards the start or end of the text, depending on 'reverse'. utext_setNativeIndex(text, startPos); - int32_t start = (int32_t)utext_getNativeIndex(text); + int32_t start = static_cast<int32_t>(utext_getNativeIndex(text)); int32_t current; int32_t rangeStart; int32_t rangeEnd; UChar32 c = utext_current32(text); - while((current = (int32_t)utext_getNativeIndex(text)) < endPos && delegate->handles(c)) { + while ((current = static_cast<int32_t>(utext_getNativeIndex(text))) < endPos && delegate->handles(c)) { utext_next32(text); // TODO: recast loop for postincrement c = utext_current32(text); } diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index b452cf2c050083..09d168bbf46fe3 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -59,7 +59,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st { char fnbuff[256]; char ext[4]={'\0'}; - CharString actualLocale; + CharString actual; int32_t size; const char16_t* brkfname = nullptr; UResourceBundle brkRulesStack; @@ -85,7 +85,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st // Get the actual string brkfname = ures_getString(brkName, &size, &status); U_ASSERT((size_t)size<sizeof(fnbuff)); - if ((size_t)size>=sizeof(fnbuff)) { + if (static_cast<size_t>(size) >= sizeof(fnbuff)) { size=0; if (U_SUCCESS(status)) { status = U_BUFFER_OVERFLOW_ERROR; @@ -94,12 +94,12 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st // Use the string if we found it if (U_SUCCESS(status) && brkfname) { - actualLocale.append(ures_getLocaleInternal(brkName, &status), -1, status); + actual.append(ures_getLocaleInternal(brkName, &status), -1, status); char16_t* extStart=u_strchr(brkfname, 0x002e); int len = 0; if (extStart != nullptr){ - len = (int)(extStart-brkfname); + len = static_cast<int>(extStart - brkfname); u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff u_UCharsToChars(brkfname, fnbuff, len); } @@ -121,12 +121,9 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st // If there is a result, set the valid locale and actual locale, and the kind if (U_SUCCESS(status) && result != nullptr) { - U_LOCALE_BASED(locBased, *(BreakIterator*)result); - - locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), - actualLocale.data()); - uprv_strncpy(result->requestLocale, loc.getName(), ULOC_FULLNAME_CAPACITY); - result->requestLocale[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate + result->actualLocale = Locale(actual.data()); + result->validLocale = Locale(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status)); + result->requestLocale = loc; } ures_close(b); @@ -205,21 +202,22 @@ BreakIterator::getAvailableLocales(int32_t& count) //------------------------------------------- BreakIterator::BreakIterator() + : actualLocale(Locale::getRoot()), validLocale(Locale::getRoot()), requestLocale(Locale::getRoot()) { - *validLocale = *actualLocale = *requestLocale = 0; } -BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) { - uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); - uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); - uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale)); +BreakIterator::BreakIterator(const BreakIterator &other) + : UObject(other), + actualLocale(other.actualLocale), + validLocale(other.validLocale), + requestLocale(other.requestLocale) { } BreakIterator &BreakIterator::operator =(const BreakIterator &other) { if (this != &other) { - uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); - uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); - uprv_strncpy(requestLocale, other.requestLocale, sizeof(requestLocale)); + actualLocale = other.actualLocale; + validLocale = other.validLocale; + requestLocale = other.requestLocale; } return *this; } @@ -393,8 +391,8 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu // THIS LONG is a sign of bad code -- so the action item is to // revisit this in ICU 3.0 and clean it up/fix it/remove it. if (U_SUCCESS(status) && (result != nullptr) && *actualLoc.getName() != 0) { - U_LOCALE_BASED(locBased, *result); - locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName()); + result->actualLocale = actualLoc; + result->validLocale = actualLoc; } return result; } @@ -438,17 +436,14 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) UTRACE_ENTRY(UTRACE_UBRK_CREATE_LINE); uprv_strcpy(lb_lw, "line"); UErrorCode kvStatus = U_ZERO_ERROR; - CharString value; - CharStringByteSink valueSink(&value); - loc.getKeywordValue("lb", valueSink, kvStatus); + auto value = loc.getKeywordValue<CharString>("lb", kvStatus); if (U_SUCCESS(kvStatus) && (value == "strict" || value == "normal" || value == "loose")) { uprv_strcat(lb_lw, "_"); uprv_strcat(lb_lw, value.data()); } // lw=phrase is only supported in Japanese and Korean if (uprv_strcmp(loc.getLanguage(), "ja") == 0 || uprv_strcmp(loc.getLanguage(), "ko") == 0) { - value.clear(); - loc.getKeywordValue("lw", valueSink, kvStatus); + value = loc.getKeywordValue<CharString>("lw", kvStatus); if (U_SUCCESS(kvStatus) && value == "phrase") { uprv_strcat(lb_lw, "_"); uprv_strcat(lb_lw, value.data()); @@ -491,6 +486,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) } if (U_FAILURE(status)) { + delete result; return nullptr; } @@ -499,20 +495,24 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) Locale BreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const { + if (U_FAILURE(status)) { + return Locale::getRoot(); + } if (type == ULOC_REQUESTED_LOCALE) { - return Locale(requestLocale); + return requestLocale; } - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * BreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } if (type == ULOC_REQUESTED_LOCALE) { - return requestLocale; + return requestLocale.getName(); } - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + return LocaleBased::getLocaleID(validLocale, actualLocale, type, status); } @@ -538,9 +538,8 @@ int32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UE return 1; } -BreakIterator::BreakIterator (const Locale& valid, const Locale& actual) { - U_LOCALE_BASED(locBased, (*this)); - locBased.setLocaleIDs(valid, actual); +BreakIterator::BreakIterator(const Locale& valid, const Locale& actual) + : actualLocale(actual), validLocale(valid), requestLocale(Locale::getRoot()) { } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytesinkutil.cpp b/deps/icu-small/source/common/bytesinkutil.cpp index a32254a7dbabc0..e99c10f0838b93 100644 --- a/deps/icu-small/source/common/bytesinkutil.cpp +++ b/deps/icu-small/source/common/bytesinkutil.cpp @@ -64,7 +64,7 @@ ByteSinkUtil::appendChange(const uint8_t *s, const uint8_t *limit, errorCode = U_INDEX_OUTOFBOUNDS_ERROR; return false; } - return appendChange((int32_t)(limit - s), s16, s16Length, sink, edits, errorCode); + return appendChange(static_cast<int32_t>(limit - s), s16, s16Length, sink, edits, errorCode); } void @@ -81,15 +81,15 @@ ByteSinkUtil::appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits * namespace { // See unicode/utf8.h U8_APPEND_UNSAFE(). -inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } -inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } +inline uint8_t getTwoByteLead(UChar32 c) { return static_cast<uint8_t>((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return static_cast<uint8_t>((c & 0x3f) | 0x80); } } // namespace void ByteSinkUtil::appendTwoBytes(UChar32 c, ByteSink &sink) { U_ASSERT(0x80 <= c && c <= 0x7ff); // 2-byte UTF-8 - char s8[2] = { (char)getTwoByteLead(c), (char)getTwoByteTrail(c) }; + char s8[2] = {static_cast<char>(getTwoByteLead(c)), static_cast<char>(getTwoByteTrail(c))}; sink.Append(s8, 2); } @@ -114,7 +114,7 @@ ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit, errorCode = U_INDEX_OUTOFBOUNDS_ERROR; return false; } - int32_t length = (int32_t)(limit - s); + int32_t length = static_cast<int32_t>(limit - s); if (length > 0) { appendNonEmptyUnchanged(s, length, sink, options, edits); } diff --git a/deps/icu-small/source/common/bytesinkutil.h b/deps/icu-small/source/common/bytesinkutil.h index 929c71fbee6bc7..eb3a622ae95743 100644 --- a/deps/icu-small/source/common/bytesinkutil.h +++ b/deps/icu-small/source/common/bytesinkutil.h @@ -7,18 +7,52 @@ #ifndef BYTESINKUTIL_H #define BYTESINKUTIL_H +#include <type_traits> + #include "unicode/utypes.h" #include "unicode/bytestream.h" #include "unicode/edits.h" +#include "charstr.h" #include "cmemory.h" #include "uassert.h" +#include "ustr_imp.h" U_NAMESPACE_BEGIN class ByteSink; -class CharString; class Edits; +class U_COMMON_API CharStringByteSink : public ByteSink { +public: + CharStringByteSink(CharString* dest); + ~CharStringByteSink() override; + + CharStringByteSink() = delete; + CharStringByteSink(const CharStringByteSink&) = delete; + CharStringByteSink& operator=(const CharStringByteSink&) = delete; + + void Append(const char* bytes, int32_t n) override; + + char* GetAppendBuffer(int32_t min_capacity, + int32_t desired_capacity_hint, + char* scratch, + int32_t scratch_capacity, + int32_t* result_capacity) override; + +private: + CharString& dest_; +}; + +// CharString doesn't provide the public API that StringByteSink requires a +// string class to have so this template specialization replaces the default +// implementation of StringByteSink<CharString> with CharStringByteSink. +template<> +class StringByteSink<CharString> : public CharStringByteSink { + public: + StringByteSink(CharString* dest) : CharStringByteSink(dest) { } + StringByteSink(CharString* dest, int32_t /*initialAppendCapacity*/) : CharStringByteSink(dest) { } +}; + class U_COMMON_API ByteSinkUtil { public: ByteSinkUtil() = delete; // all static @@ -39,7 +73,7 @@ class U_COMMON_API ByteSinkUtil { /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, ByteSink &sink, Edits *edits = nullptr) { - appendCodePoint((int32_t)(nextSrc - src), c, sink, edits); + appendCodePoint(static_cast<int32_t>(nextSrc - src), c, sink, edits); } /** Append the two-byte character (U+0080..U+07FF). */ @@ -57,30 +91,64 @@ class U_COMMON_API ByteSinkUtil { ByteSink &sink, uint32_t options, Edits *edits, UErrorCode &errorCode); -private: - static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, - ByteSink &sink, uint32_t options, Edits *edits); -}; - -class U_COMMON_API CharStringByteSink : public ByteSink { -public: - CharStringByteSink(CharString* dest); - ~CharStringByteSink() override; - - CharStringByteSink() = delete; - CharStringByteSink(const CharStringByteSink&) = delete; - CharStringByteSink& operator=(const CharStringByteSink&) = delete; - - void Append(const char* bytes, int32_t n) override; + /** + * Calls a lambda that writes to a ByteSink with a CheckedArrayByteSink + * and then returns through u_terminateChars(), in order to implement + * the classic ICU4C C API writing to a fix sized buffer on top of a + * contemporary C++ API. + * + * @param buffer receiving buffer + * @param capacity capacity of receiving buffer + * @param lambda that gets called with the sink as an argument + * @param status set to U_BUFFER_OVERFLOW_ERROR on overflow + * @return number of bytes written, or needed (in case of overflow) + * @internal + */ + template <typename F, + typename = std::enable_if_t< + std::is_invocable_r_v<void, F, ByteSink&, UErrorCode&>>> + static int32_t viaByteSinkToTerminatedChars(char* buffer, int32_t capacity, + F&& lambda, + UErrorCode& status) { + if (U_FAILURE(status)) { return 0; } + CheckedArrayByteSink sink(buffer, capacity); + lambda(sink, status); + if (U_FAILURE(status)) { return 0; } + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (sink.Overflowed()) { + status = U_BUFFER_OVERFLOW_ERROR; + return reslen; + } + + return u_terminateChars(buffer, capacity, reslen, &status); + } - char* GetAppendBuffer(int32_t min_capacity, - int32_t desired_capacity_hint, - char* scratch, - int32_t scratch_capacity, - int32_t* result_capacity) override; + /** + * Calls a lambda that writes to a ByteSink with a CharStringByteSink and + * then returns a CharString, in order to implement a contemporary C++ API + * on top of a C/C++ compatibility ByteSink API. + * + * @param lambda that gets called with the sink as an argument + * @param status to check and report + * @return the resulting string, or an empty string (in case of error) + * @internal + */ + template <typename F, + typename = std::enable_if_t< + std::is_invocable_r_v<void, F, ByteSink&, UErrorCode&>>> + static CharString viaByteSinkToCharString(F&& lambda, UErrorCode& status) { + if (U_FAILURE(status)) { return {}; } + CharString result; + CharStringByteSink sink(&result); + lambda(sink, status); + return result; + } private: - CharString& dest_; + static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytestrie.cpp b/deps/icu-small/source/common/bytestrie.cpp index 532ea9e9c0a98f..048bbebb01afed 100644 --- a/deps/icu-small/source/common/bytestrie.cpp +++ b/deps/icu-small/source/common/bytestrie.cpp @@ -327,7 +327,7 @@ BytesTrie::findUniqueValueFromBranch(const uint8_t *pos, int32_t length, ++pos; // ignore a comparison byte // handle its value int32_t node=*pos++; - UBool isFinal=(UBool)(node&kValueIsFinal); + UBool isFinal = static_cast<UBool>(node & kValueIsFinal); int32_t value=readValue(pos, node>>1); pos=skipValue(pos, node); if(isFinal) { @@ -366,7 +366,7 @@ BytesTrie::findUniqueValue(const uint8_t *pos, UBool haveUniqueValue, int32_t &u // linear-match node pos+=node-kMinLinearMatch+1; // Ignore the match bytes. } else { - UBool isFinal=(UBool)(node&kValueIsFinal); + UBool isFinal = static_cast<UBool>(node & kValueIsFinal); int32_t value=readValue(pos, node>>1); if(haveUniqueValue) { if(value!=uniqueValue) { @@ -434,7 +434,7 @@ BytesTrie::getNextBranchBytes(const uint8_t *pos, int32_t length, ByteSink &out) void BytesTrie::append(ByteSink &out, int c) { - char ch=(char)c; + char ch = static_cast<char>(c); out.Append(&ch, 1); } diff --git a/deps/icu-small/source/common/bytestriebuilder.cpp b/deps/icu-small/source/common/bytestriebuilder.cpp index 876e0dfa16099d..03bbc28e6577ac 100644 --- a/deps/icu-small/source/common/bytestriebuilder.cpp +++ b/deps/icu-small/source/common/bytestriebuilder.cpp @@ -43,10 +43,10 @@ class BytesTrieElement : public UMemory { int32_t offset=stringOffset; int32_t length; if(offset>=0) { - length=(uint8_t)strings[offset++]; + length = static_cast<uint8_t>(strings[offset++]); } else { offset=~offset; - length=((int32_t)(uint8_t)strings[offset]<<8)|(uint8_t)strings[offset+1]; + length = (static_cast<int32_t>(static_cast<uint8_t>(strings[offset])) << 8) | static_cast<uint8_t>(strings[offset + 1]); offset+=2; } return StringPiece(strings.data()+offset, length); @@ -54,10 +54,10 @@ class BytesTrieElement : public UMemory { int32_t getStringLength(const CharString &strings) const { int32_t offset=stringOffset; if(offset>=0) { - return (uint8_t)strings[offset]; + return static_cast<uint8_t>(strings[offset]); } else { offset=~offset; - return ((int32_t)(uint8_t)strings[offset]<<8)|(uint8_t)strings[offset+1]; + return (static_cast<int32_t>(static_cast<uint8_t>(strings[offset])) << 8) | static_cast<uint8_t>(strings[offset + 1]); } } @@ -102,9 +102,9 @@ BytesTrieElement::setTo(StringPiece s, int32_t val, int32_t offset=strings.length(); if(length>0xff) { offset=~offset; - strings.append((char)(length>>8), errorCode); + strings.append(static_cast<char>(length >> 8), errorCode); } - strings.append((char)length, errorCode); + strings.append(static_cast<char>(length), errorCode); stringOffset=offset; value=val; strings.append(s, errorCode); @@ -229,7 +229,7 @@ BytesTrieBuilder::buildBytes(UStringTrieBuildOption buildOption, UErrorCode &err errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return; } - uprv_sortArray(elements, elementsLength, (int32_t)sizeof(BytesTrieElement), + uprv_sortArray(elements, elementsLength, static_cast<int32_t>(sizeof(BytesTrieElement)), compareElementStrings, strings, false, // need not be a stable sort &errorCode); @@ -284,7 +284,7 @@ BytesTrieBuilder::getElementStringLength(int32_t i) const { char16_t BytesTrieBuilder::getElementUnit(int32_t i, int32_t byteIndex) const { - return (uint8_t)elements[i].charAt(byteIndex, *strings); + return static_cast<uint8_t>(elements[i].charAt(byteIndex, *strings)); } int32_t @@ -330,7 +330,7 @@ BytesTrieBuilder::skipElementsBySomeUnits(int32_t i, int32_t byteIndex, int32_t int32_t BytesTrieBuilder::indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, char16_t byte) const { - char b=(char)byte; + char b = static_cast<char>(byte); while(b==elements[i].charAt(byteIndex, *strings)) { ++i; } @@ -404,7 +404,7 @@ BytesTrieBuilder::write(int32_t byte) { int32_t newLength=bytesLength+1; if(ensureCapacity(newLength)) { bytesLength=newLength; - bytes[bytesCapacity-bytesLength]=(char)byte; + bytes[bytesCapacity - bytesLength] = static_cast<char>(byte); } return bytesLength; } @@ -432,30 +432,30 @@ BytesTrieBuilder::writeValueAndFinal(int32_t i, UBool isFinal) { char intBytes[5]; int32_t length=1; if(i<0 || i>0xffffff) { - intBytes[0]=(char)BytesTrie::kFiveByteValueLead; - intBytes[1]=(char)((uint32_t)i>>24); - intBytes[2]=(char)((uint32_t)i>>16); - intBytes[3]=(char)((uint32_t)i>>8); - intBytes[4]=(char)i; + intBytes[0] = static_cast<char>(BytesTrie::kFiveByteValueLead); + intBytes[1] = static_cast<char>(static_cast<uint32_t>(i) >> 24); + intBytes[2] = static_cast<char>(static_cast<uint32_t>(i) >> 16); + intBytes[3] = static_cast<char>(static_cast<uint32_t>(i) >> 8); + intBytes[4] = static_cast<char>(i); length=5; // } else if(i<=BytesTrie::kMaxOneByteValue) { // intBytes[0]=(char)(BytesTrie::kMinOneByteValueLead+i); } else { if(i<=BytesTrie::kMaxTwoByteValue) { - intBytes[0]=(char)(BytesTrie::kMinTwoByteValueLead+(i>>8)); + intBytes[0] = static_cast<char>(BytesTrie::kMinTwoByteValueLead + (i >> 8)); } else { if(i<=BytesTrie::kMaxThreeByteValue) { - intBytes[0]=(char)(BytesTrie::kMinThreeByteValueLead+(i>>16)); + intBytes[0] = static_cast<char>(BytesTrie::kMinThreeByteValueLead + (i >> 16)); } else { - intBytes[0]=(char)BytesTrie::kFourByteValueLead; - intBytes[1]=(char)(i>>16); + intBytes[0] = static_cast<char>(BytesTrie::kFourByteValueLead); + intBytes[1] = static_cast<char>(i >> 16); length=2; } - intBytes[length++]=(char)(i>>8); + intBytes[length++] = static_cast<char>(i >> 8); } - intBytes[length++]=(char)i; + intBytes[length++] = static_cast<char>(i); } - intBytes[0]=(char)((intBytes[0]<<1)|isFinal); + intBytes[0] = static_cast<char>((intBytes[0] << 1) | isFinal); return write(intBytes, length); } @@ -484,28 +484,28 @@ int32_t BytesTrieBuilder::internalEncodeDelta(int32_t i, char intBytes[]) { U_ASSERT(i>=0); if(i<=BytesTrie::kMaxOneByteDelta) { - intBytes[0]=(char)i; + intBytes[0] = static_cast<char>(i); return 1; } int32_t length=1; if(i<=BytesTrie::kMaxTwoByteDelta) { - intBytes[0]=(char)(BytesTrie::kMinTwoByteDeltaLead+(i>>8)); + intBytes[0] = static_cast<char>(BytesTrie::kMinTwoByteDeltaLead + (i >> 8)); } else { if(i<=BytesTrie::kMaxThreeByteDelta) { - intBytes[0]=(char)(BytesTrie::kMinThreeByteDeltaLead+(i>>16)); + intBytes[0] = static_cast<char>(BytesTrie::kMinThreeByteDeltaLead + (i >> 16)); } else { if(i<=0xffffff) { - intBytes[0]=(char)BytesTrie::kFourByteDeltaLead; + intBytes[0] = static_cast<char>(BytesTrie::kFourByteDeltaLead); } else { - intBytes[0]=(char)BytesTrie::kFiveByteDeltaLead; - intBytes[1]=(char)(i>>24); + intBytes[0] = static_cast<char>(BytesTrie::kFiveByteDeltaLead); + intBytes[1] = static_cast<char>(i >> 24); length=2; } - intBytes[length++]=(char)(i>>16); + intBytes[length++] = static_cast<char>(i >> 16); } - intBytes[length++]=(char)(i>>8); + intBytes[length++] = static_cast<char>(i >> 8); } - intBytes[length++]=(char)i; + intBytes[length++] = static_cast<char>(i); return length; } diff --git a/deps/icu-small/source/common/bytestrieiterator.cpp b/deps/icu-small/source/common/bytestrieiterator.cpp index 65f54be48ae8ab..b60806f1f357b0 100644 --- a/deps/icu-small/source/common/bytestrieiterator.cpp +++ b/deps/icu-small/source/common/bytestrieiterator.cpp @@ -115,14 +115,14 @@ BytesTrie::Iterator::next(UErrorCode &errorCode) { pos=bytes_+stack_->elementAti(stackSize-2); stack_->setSize(stackSize-2); str_->truncate(length&0xffff); - length=(int32_t)((uint32_t)length>>16); + length = static_cast<int32_t>(static_cast<uint32_t>(length) >> 16); if(length>1) { pos=branchNext(pos, length, errorCode); if(pos==nullptr) { return true; // Reached a final value. } } else { - str_->append((char)*pos++, errorCode); + str_->append(static_cast<char>(*pos++), errorCode); } } if(remainingMatchLength_>=0) { @@ -134,7 +134,7 @@ BytesTrie::Iterator::next(UErrorCode &errorCode) { int32_t node=*pos++; if(node>=kMinValueLead) { // Deliver value for the byte sequence so far. - UBool isFinal=(UBool)(node&kValueIsFinal); + UBool isFinal = static_cast<UBool>(node & kValueIsFinal); value_=readValue(pos, node>>1); if(isFinal || (maxLength_>0 && str_->length()==maxLength_)) { pos_=nullptr; @@ -186,7 +186,7 @@ BytesTrie::Iterator::branchNext(const uint8_t *pos, int32_t length, UErrorCode & while(length>kMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison byte // Push state for the greater-or-equal edge. - stack_->addElement((int32_t)(skipDelta(pos)-bytes_), errorCode); + stack_->addElement(static_cast<int32_t>(skipDelta(pos) - bytes_), errorCode); stack_->addElement(((length-(length>>1))<<16)|str_->length(), errorCode); // Follow the less-than edge. length>>=1; @@ -196,12 +196,12 @@ BytesTrie::Iterator::branchNext(const uint8_t *pos, int32_t length, UErrorCode & // Read the first (key, value) pair. uint8_t trieByte=*pos++; int32_t node=*pos++; - UBool isFinal=(UBool)(node&kValueIsFinal); + UBool isFinal = static_cast<UBool>(node & kValueIsFinal); int32_t value=readValue(pos, node>>1); pos=skipValue(pos, node); - stack_->addElement((int32_t)(pos-bytes_), errorCode); + stack_->addElement(static_cast<int32_t>(pos - bytes_), errorCode); stack_->addElement(((length-1)<<16)|str_->length(), errorCode); - str_->append((char)trieByte, errorCode); + str_->append(static_cast<char>(trieByte), errorCode); if(isFinal) { pos_=nullptr; value_=value; diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index 64a3c65d29a0f7..1b2bc2ada0c99a 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -64,6 +64,7 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CanonicalIterator) + /** *@param source string to get results for */ @@ -73,10 +74,10 @@ CanonicalIterator::CanonicalIterator(const UnicodeString &sourceStr, UErrorCode pieces_lengths(nullptr), current(nullptr), current_length(0), - nfd(*Normalizer2::getNFDInstance(status)), - nfcImpl(*Normalizer2Factory::getNFCImpl(status)) + nfd(Normalizer2::getNFDInstance(status)), + nfcImpl(Normalizer2Factory::getNFCImpl(status)) { - if(U_SUCCESS(status) && nfcImpl.ensureCanonIterData(status)) { + if(U_SUCCESS(status) && nfcImpl->ensureCanonIterData(status)) { setSource(sourceStr, status); } } @@ -172,7 +173,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st int32_t i = 0; UnicodeString *list = nullptr; - nfd.normalize(newSource, source, status); + nfd->normalize(newSource, source, status); if(U_FAILURE(status)) { return; } @@ -182,10 +183,10 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st // catch degenerate case if (newSource.length() == 0) { - pieces = (UnicodeString **)uprv_malloc(sizeof(UnicodeString *)); - pieces_lengths = (int32_t*)uprv_malloc(1 * sizeof(int32_t)); + pieces = static_cast<UnicodeString**>(uprv_malloc(sizeof(UnicodeString*))); + pieces_lengths = static_cast<int32_t*>(uprv_malloc(1 * sizeof(int32_t))); pieces_length = 1; - current = (int32_t*)uprv_malloc(1 * sizeof(int32_t)); + current = static_cast<int32_t*>(uprv_malloc(1 * sizeof(int32_t))); current_length = 1; if (pieces == nullptr || pieces_lengths == nullptr || current == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -194,7 +195,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st current[0] = 0; pieces[0] = new UnicodeString[1]; pieces_lengths[0] = 1; - if (pieces[0] == 0) { + if (pieces[0] == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto CleanPartialInitialization; } @@ -203,7 +204,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st list = new UnicodeString[source.length()]; - if (list == 0) { + if (list == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto CleanPartialInitialization; } @@ -219,7 +220,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st // on the NFD form - see above). for (; i < source.length(); i += U16_LENGTH(cp)) { cp = source.char32At(i); - if (nfcImpl.isCanonSegmentStarter(cp)) { + if (nfcImpl->isCanonSegmentStarter(cp)) { source.extract(start, i-start, list[list_length++]); // add up to i start = i; } @@ -228,10 +229,10 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st // allocate the arrays, and find the strings that are CE to each segment - pieces = (UnicodeString **)uprv_malloc(list_length * sizeof(UnicodeString *)); + pieces = static_cast<UnicodeString**>(uprv_malloc(list_length * sizeof(UnicodeString*))); pieces_length = list_length; - pieces_lengths = (int32_t*)uprv_malloc(list_length * sizeof(int32_t)); - current = (int32_t*)uprv_malloc(list_length * sizeof(int32_t)); + pieces_lengths = static_cast<int32_t*>(uprv_malloc(list_length * sizeof(int32_t))); + current = static_cast<int32_t*>(uprv_malloc(list_length * sizeof(int32_t))); current_length = list_length; if (pieces == nullptr || pieces_lengths == nullptr || current == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -252,9 +253,7 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st return; // Common section to cleanup all local variables and reset object variables. CleanPartialInitialization: - if (list != nullptr) { - delete[] list; - } + delete[] list; cleanPieces(); } @@ -264,10 +263,19 @@ void CanonicalIterator::setSource(const UnicodeString &newSource, UErrorCode &st * @param source the string to find permutations for * @return the results in a set. */ -void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status) { +void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status, int32_t depth) { if(U_FAILURE(status)) { return; } + // To avoid infinity loop caused by permute, we limit the depth of recursive + // call to permute and return U_UNSUPPORTED_ERROR. + // We know in some unit test we need at least 4. Set to 8 just in case some + // unforseen use cases. + constexpr int32_t kPermuteDepthLimit = 8; + if (depth > kPermuteDepthLimit) { + status = U_UNSUPPORTED_ERROR; + return; + } //if (PROGRESS) printf("Permute: %s\n", UToS(Tr(source))); int32_t i = 0; @@ -277,7 +285,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros if (source.length() <= 2 && source.countChar32() <= 1) { UnicodeString *toPut = new UnicodeString(source); /* test for nullptr */ - if (toPut == 0) { + if (toPut == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -311,7 +319,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // see what the permutations of the characters before and after this one are //Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp))); - permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status); + permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status, depth+1); /* Test for buffer overflows */ if(U_FAILURE(status)) { return; @@ -322,7 +330,7 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // prefix this character to all of them ne = subpermute.nextElement(el); while (ne != nullptr) { - UnicodeString *permRes = (UnicodeString *)(ne->value.pointer); + UnicodeString* permRes = static_cast<UnicodeString*>(ne->value.pointer); UnicodeString *chStr = new UnicodeString(cp); //test for nullptr if (chStr == nullptr) { @@ -346,7 +354,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i Hashtable permutations(status); Hashtable basic(status); if (U_FAILURE(status)) { - return 0; + return nullptr; } result.setValueDeleter(uprv_deleteUObject); permutations.setValueDeleter(uprv_deleteUObject); @@ -355,6 +363,9 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i char16_t USeg[256]; int32_t segLen = segment.extract(USeg, 256, status); getEquivalents2(&basic, USeg, segLen, status); + if (U_FAILURE(status)) { + return nullptr; + } // now get all the permutations // add only the ones that are canonically equivalent @@ -367,7 +378,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i //while (it.hasNext()) while (ne != nullptr) { //String item = (String) it.next(); - UnicodeString item = *((UnicodeString *)(ne->value.pointer)); + UnicodeString item = *static_cast<UnicodeString*>(ne->value.pointer); permutations.removeAll(); permute(item, CANITER_SKIP_ZEROES, &permutations, status); @@ -379,9 +390,9 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i while (ne2 != nullptr) { //String possible = (String) it2.next(); //UnicodeString *possible = new UnicodeString(*((UnicodeString *)(ne2->value.pointer))); - UnicodeString possible(*((UnicodeString *)(ne2->value.pointer))); + UnicodeString possible(*static_cast<UnicodeString*>(ne2->value.pointer)); UnicodeString attempt; - nfd.normalize(possible, attempt, status); + nfd->normalize(possible, attempt, status); // TODO: check if operator == is semanticaly the same as attempt.equals(segment) if (attempt==segment) { @@ -399,7 +410,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i /* Test for buffer overflows */ if(U_FAILURE(status)) { - return 0; + return nullptr; } // convert into a String[] to clean up storage //String[] finalResult = new String[result.size()]; @@ -407,7 +418,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i int32_t resultCount; if((resultCount = result.count()) != 0) { finalResult = new UnicodeString[resultCount]; - if (finalResult == 0) { + if (finalResult == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -421,7 +432,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i el = UHASH_FIRST; ne = result.nextElement(el); while(ne != nullptr) { - finalResult[result_len++] = *((UnicodeString *)(ne->value.pointer)); + finalResult[result_len++] = *static_cast<UnicodeString*>(ne->value.pointer); ne = result.nextElement(el); } @@ -448,7 +459,7 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha for (int32_t i = 0; i < segLen; i += U16_LENGTH(cp)) { // see if any character is at the start of some decomposition U16_GET(segment, 0, i, segLen, cp); - if (!nfcImpl.getCanonStartSet(cp, starts)) { + if (!nfcImpl->getCanonStartSet(cp, starts)) { continue; } // if so, see which decompositions match @@ -458,6 +469,9 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha Hashtable remainder(status); remainder.setValueDeleter(uprv_deleteUObject); if (extract(&remainder, cp2, segment, segLen, i, status) == nullptr) { + if (U_FAILURE(status)) { + return nullptr; + } continue; } @@ -468,10 +482,10 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha int32_t el = UHASH_FIRST; const UHashElement *ne = remainder.nextElement(el); while (ne != nullptr) { - UnicodeString item = *((UnicodeString *)(ne->value.pointer)); + UnicodeString item = *static_cast<UnicodeString*>(ne->value.pointer); UnicodeString *toAdd = new UnicodeString(prefix); /* test for nullptr */ - if (toAdd == 0) { + if (toAdd == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -482,6 +496,13 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha ne = remainder.nextElement(el); } + // ICU-22642 Guards against strings that have so many permutations + // that they would otherwise hang the function. + constexpr int32_t kResultLimit = 4096; + if (fillinResult->count() > kResultLimit) { + status = U_UNSUPPORTED_ERROR; + return nullptr; + } } } @@ -509,7 +530,7 @@ Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, con UnicodeString temp(comp); int32_t inputLen=temp.length(); UnicodeString decompString; - nfd.normalize(temp, decompString, status); + nfd->normalize(temp, decompString, status); if (U_FAILURE(status)) { return nullptr; } @@ -573,7 +594,7 @@ Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, con // brute force approach // check to make sure result is canonically equivalent UnicodeString trial; - nfd.normalize(temp, trial, status); + nfd->normalize(temp, trial, status); if(U_FAILURE(status) || trial.compare(segment+segmentPos, segLen - segmentPos) != 0) { return nullptr; } diff --git a/deps/icu-small/source/common/characterproperties.cpp b/deps/icu-small/source/common/characterproperties.cpp index f1e15b488d533d..963ac8342151e9 100644 --- a/deps/icu-small/source/common/characterproperties.cpp +++ b/deps/icu-small/source/common/characterproperties.cpp @@ -58,17 +58,17 @@ icu::UMutex cpMutex; // Does not use uset.h to reduce code dependencies void U_CALLCONV _set_add(USet *set, UChar32 c) { - ((UnicodeSet *)set)->add(c); + reinterpret_cast<UnicodeSet*>(set)->add(c); } void U_CALLCONV _set_addRange(USet *set, UChar32 start, UChar32 end) { - ((UnicodeSet *)set)->add(start, end); + reinterpret_cast<UnicodeSet*>(set)->add(start, end); } void U_CALLCONV _set_addString(USet *set, const char16_t *str, int32_t length) { - ((UnicodeSet *)set)->add(icu::UnicodeString((UBool)(length<0), str, length)); + reinterpret_cast<UnicodeSet*>(set)->add(icu::UnicodeString(static_cast<UBool>(length < 0), str, length)); } UBool U_CALLCONV characterproperties_cleanup() { @@ -103,7 +103,7 @@ void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) { return; } USetAdder sa = { - (USet *)incl.getAlias(), + reinterpret_cast<USet*>(incl.getAlias()), _set_add, _set_addRange, _set_addString, @@ -184,8 +184,12 @@ void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) { sa.add(sa.set, 0x2FFF + 1); break; case UPROPS_SRC_ID_COMPAT_MATH: + case UPROPS_SRC_MCM: uprops_addPropertyStarts(src, &sa, &errorCode); break; + case UPROPS_SRC_BLOCK: + ublock_addPropertyStarts(&sa, errorCode); + break; default: errorCode = U_INTERNAL_PROGRAM_ERROR; break; @@ -289,7 +293,7 @@ UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) { const icu::EmojiProps *ep = icu::EmojiProps::getSingleton(errorCode); if (U_FAILURE(errorCode)) { return nullptr; } USetAdder sa = { - (USet *)set.getAlias(), + reinterpret_cast<USet*>(set.getAlias()), _set_add, _set_addRange, _set_addString, diff --git a/deps/icu-small/source/common/charstr.cpp b/deps/icu-small/source/common/charstr.cpp index f76cc8a4dc90f3..dadc829b0b5605 100644 --- a/deps/icu-small/source/common/charstr.cpp +++ b/deps/icu-small/source/common/charstr.cpp @@ -70,6 +70,15 @@ CharString &CharString::copyFrom(const CharString &s, UErrorCode &errorCode) { return *this; } +CharString &CharString::copyFrom(StringPiece s, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return *this; + } + len = 0; + append(s, errorCode); + return *this; +} + int32_t CharString::lastIndexOf(char c) const { for(int32_t i=len; i>0;) { if(buffer[--i]==c) { @@ -143,7 +152,7 @@ CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &error return *this; } -CharString &CharString::appendNumber(int32_t number, UErrorCode &status) { +CharString &CharString::appendNumber(int64_t number, UErrorCode &status) { if (number < 0) { this->append('-', status); if (U_FAILURE(status)) { diff --git a/deps/icu-small/source/common/charstr.h b/deps/icu-small/source/common/charstr.h index 7749a804b931a9..a4a70f0773b2f9 100644 --- a/deps/icu-small/source/common/charstr.h +++ b/deps/icu-small/source/common/charstr.h @@ -21,12 +21,6 @@ U_NAMESPACE_BEGIN -// Windows needs us to DLL-export the MaybeStackArray template specialization, -// but MacOS X cannot handle it. Same as in digitlst.h. -#if !U_PLATFORM_IS_DARWIN_BASED -template class U_COMMON_API MaybeStackArray<char, 40>; -#endif - /** * ICU-internal char * string class. * This class does not assume or enforce any particular character encoding. @@ -38,34 +32,34 @@ template class U_COMMON_API MaybeStackArray<char, 40>; * For example: * cs.data()[5]='a'; // no need for setCharAt(5, 'a') */ -class U_COMMON_API CharString : public UMemory { +class U_COMMON_API_CLASS CharString : public UMemory { public: - CharString() : len(0) { buffer[0]=0; } - CharString(StringPiece s, UErrorCode &errorCode) : len(0) { + U_COMMON_API CharString() : len(0) { buffer[0]=0; } + U_COMMON_API CharString(StringPiece s, UErrorCode &errorCode) : len(0) { buffer[0]=0; append(s, errorCode); } - CharString(const CharString &s, UErrorCode &errorCode) : len(0) { + U_COMMON_API CharString(const CharString &s, UErrorCode &errorCode) : len(0) { buffer[0]=0; append(s, errorCode); } - CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) { + U_COMMON_API CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) { buffer[0]=0; append(s, sLength, errorCode); } - ~CharString() {} + U_COMMON_API ~CharString() {} /** * Move constructor; might leave src in an undefined state. * This string will have the same contents and state that the source string had. */ - CharString(CharString &&src) noexcept; + U_COMMON_API CharString(CharString &&src) noexcept; /** * Move assignment operator; might leave src in an undefined state. * This string will have the same contents and state that the source string had. * The behavior is undefined if *this and src are the same object. */ - CharString &operator=(CharString &&src) noexcept; + U_COMMON_API CharString &operator=(CharString &&src) noexcept; /** * Replaces this string's contents with the other string's contents. @@ -73,20 +67,21 @@ class U_COMMON_API CharString : public UMemory { * the assignment operator, to make copies explicit and to * use a UErrorCode where memory allocations might be needed. */ - CharString ©From(const CharString &other, UErrorCode &errorCode); + U_COMMON_API CharString ©From(const CharString &other, UErrorCode &errorCode); + U_COMMON_API CharString ©From(StringPiece s, UErrorCode &errorCode); - UBool isEmpty() const { return len==0; } - int32_t length() const { return len; } - char operator[](int32_t index) const { return buffer[index]; } - StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); } + U_COMMON_API UBool isEmpty() const { return len==0; } + U_COMMON_API int32_t length() const { return len; } + U_COMMON_API char operator[](int32_t index) const { return buffer[index]; } + U_COMMON_API StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); } - const char *data() const { return buffer.getAlias(); } - char *data() { return buffer.getAlias(); } + U_COMMON_API const char *data() const { return buffer.getAlias(); } + U_COMMON_API char *data() { return buffer.getAlias(); } /** * Allocates length()+1 chars and copies the NUL-terminated data(). * The caller must uprv_free() the result. */ - char *cloneData(UErrorCode &errorCode) const; + U_COMMON_API char *cloneData(UErrorCode &errorCode) const; /** * Copies the contents of the string into dest. * Checks if there is enough space in dest, extracts the entire string if possible, @@ -102,33 +97,40 @@ class U_COMMON_API CharString : public UMemory { * @param errorCode ICU error code. * @return length() */ - int32_t extract(char *dest, int32_t capacity, UErrorCode &errorCode) const; + U_COMMON_API int32_t extract(char *dest, int32_t capacity, UErrorCode &errorCode) const; + + U_COMMON_API bool operator==(const CharString& other) const { + return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0); + } + U_COMMON_API bool operator!=(const CharString& other) const { + return !operator==(other); + } - bool operator==(StringPiece other) const { + U_COMMON_API bool operator==(StringPiece other) const { return len == other.length() && (len == 0 || uprv_memcmp(data(), other.data(), len) == 0); } - bool operator!=(StringPiece other) const { + U_COMMON_API bool operator!=(StringPiece other) const { return !operator==(other); } /** @return last index of c, or -1 if c is not in this string */ - int32_t lastIndexOf(char c) const; + U_COMMON_API int32_t lastIndexOf(char c) const; - bool contains(StringPiece s) const; + U_COMMON_API bool contains(StringPiece s) const; - CharString &clear() { len=0; buffer[0]=0; return *this; } - CharString &truncate(int32_t newLength); + U_COMMON_API CharString &clear() { len=0; buffer[0]=0; return *this; } + U_COMMON_API CharString &truncate(int32_t newLength); - CharString &append(char c, UErrorCode &errorCode); - CharString &append(StringPiece s, UErrorCode &errorCode) { + U_COMMON_API CharString &append(char c, UErrorCode &errorCode); + U_COMMON_API CharString &append(StringPiece s, UErrorCode &errorCode) { return append(s.data(), s.length(), errorCode); } - CharString &append(const CharString &s, UErrorCode &errorCode) { + U_COMMON_API CharString &append(const CharString &s, UErrorCode &errorCode) { return append(s.data(), s.length(), errorCode); } - CharString &append(const char *s, int32_t sLength, UErrorCode &status); + U_COMMON_API CharString &append(const char *s, int32_t sLength, UErrorCode &status); - CharString &appendNumber(int32_t number, UErrorCode &status); + U_COMMON_API CharString &appendNumber(int64_t number, UErrorCode &status); /** * Returns a writable buffer for appending and writes the buffer's capacity to @@ -150,26 +152,28 @@ class U_COMMON_API CharString : public UMemory { * @param errorCode in/out error code * @return a buffer with resultCapacity>=min_capacity */ - char *getAppendBuffer(int32_t minCapacity, - int32_t desiredCapacityHint, - int32_t &resultCapacity, - UErrorCode &errorCode); + U_COMMON_API char *getAppendBuffer(int32_t minCapacity, + int32_t desiredCapacityHint, + int32_t &resultCapacity, + UErrorCode &errorCode); - CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode); - CharString &appendInvariantChars(const char16_t* uchars, int32_t ucharsLen, UErrorCode& errorCode); + U_COMMON_API CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode); + U_COMMON_API CharString &appendInvariantChars(const char16_t* uchars, + int32_t ucharsLen, + UErrorCode& errorCode); /** * Appends a filename/path part, e.g., a directory name. * First appends a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR if necessary. * Does nothing if s is empty. */ - CharString &appendPathPart(StringPiece s, UErrorCode &errorCode); + U_COMMON_API CharString &appendPathPart(StringPiece s, UErrorCode &errorCode); /** * Appends a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR if this string is not empty * and does not already end with a U_FILE_SEP_CHAR or U_FILE_ALT_SEP_CHAR. */ - CharString &ensureEndsWithFileSeparator(UErrorCode &errorCode); + U_COMMON_API CharString &ensureEndsWithFileSeparator(UErrorCode &errorCode); private: MaybeStackArray<char, 40> buffer; diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index 3705c2dfd0e069..e31c54aac7099c 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -334,9 +334,7 @@ class MaybeStackArray { // No heap allocation. Use only on the stack. static void* U_EXPORT2 operator new(size_t) noexcept = delete; static void* U_EXPORT2 operator new[](size_t) noexcept = delete; -#if U_HAVE_PLACEMENT_NEW static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete; -#endif /** * Default constructor initializes with internal T[stackCapacity] buffer. @@ -570,9 +568,7 @@ class MaybeStackHeaderAndArray { // No heap allocation. Use only on the stack. static void* U_EXPORT2 operator new(size_t) noexcept = delete; static void* U_EXPORT2 operator new[](size_t) noexcept = delete; -#if U_HAVE_PLACEMENT_NEW static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete; -#endif /** * Default constructor initializes with internal H+T[stackCapacity] buffer. diff --git a/deps/icu-small/source/common/cstr.h b/deps/icu-small/source/common/cstr.h index be21d910bb475e..84a07543eabac5 100644 --- a/deps/icu-small/source/common/cstr.h +++ b/deps/icu-small/source/common/cstr.h @@ -43,11 +43,11 @@ U_NAMESPACE_BEGIN -class U_COMMON_API CStr : public UMemory { +class U_COMMON_API_CLASS CStr : public UMemory { public: - CStr(const UnicodeString &in); - ~CStr(); - const char * operator ()() const; + U_COMMON_API CStr(const UnicodeString &in); + U_COMMON_API ~CStr(); + U_COMMON_API const char * operator ()() const; private: CharString s; diff --git a/deps/icu-small/source/common/cstring.cpp b/deps/icu-small/source/common/cstring.cpp index e95816c130160d..cc3f6deed89019 100644 --- a/deps/icu-small/source/common/cstring.cpp +++ b/deps/icu-small/source/common/cstring.cpp @@ -126,7 +126,7 @@ T_CString_toLowerCase(char* str) if (str) { do - *str = (char)uprv_tolower(*str); + *str = uprv_tolower(*str); while (*(str++)); } @@ -140,7 +140,7 @@ T_CString_toUpperCase(char* str) if (str) { do - *str = (char)uprv_toupper(*str); + *str = uprv_toupper(*str); while (*(str++)); } diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 3d672c03bfb3ed..888716c8d89165 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -61,12 +61,12 @@ DictionaryBreakEngine::findBreaks( UText *text, // extends towards the start or end of the text, depending on 'reverse'. utext_setNativeIndex(text, startPos); - int32_t start = (int32_t)utext_getNativeIndex(text); + int32_t start = static_cast<int32_t>(utext_getNativeIndex(text)); int32_t current; int32_t rangeStart; int32_t rangeEnd; UChar32 c = utext_current32(text); - while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { + while ((current = static_cast<int32_t>(utext_getNativeIndex(text))) < endPos && fSet.contains(c)) { utext_next32(text); // TODO: recast loop for postincrement c = utext_current32(text); } @@ -137,7 +137,7 @@ class PossibleWord { int32_t PossibleWord::candidates( UText *text, DictionaryMatcher *dict, int32_t rangeEnd ) { // TODO: If getIndex is too slow, use offset < 0 and add discardAll() - int32_t start = (int32_t)utext_getNativeIndex(text); + int32_t start = static_cast<int32_t>(utext_getNativeIndex(text)); if (start != offset) { offset = start; count = dict->matches(text, rangeEnd-start, UPRV_LENGTHOF(cuLengths), cuLengths, cpLengths, nullptr, &prefix); @@ -253,7 +253,7 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, utext_setNativeIndex(text, rangeStart); - while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) { + while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) { cpWordLength = 0; cuWordLength = 0; @@ -269,7 +269,7 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, // If there was more than one, see which one can take us forward the most words else if (candidates > 1) { // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } do { @@ -278,7 +278,7 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, words[wordsFound%THAI_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } @@ -308,7 +308,7 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, // The text iterator should now be positioned at the end of the word we found. UChar32 uc = 0; - if ((int32_t)utext_getNativeIndex(text) < rangeEnd && cpWordLength < THAI_ROOT_COMBINE_THRESHOLD) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < THAI_ROOT_COMBINE_THRESHOLD) { // if it is a dictionary word, do nothing. If it isn't, then if there is // no preceding word, or the non-word shares less than the minimum threshold // of characters with a dictionary word, then scan to resynchronize @@ -320,9 +320,9 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, UChar32 pc; int32_t chars = 0; for (;;) { - int32_t pcIndex = (int32_t)utext_getNativeIndex(text); + int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text)); pc = utext_next32(text); - int32_t pcSize = (int32_t)utext_getNativeIndex(text) - pcIndex; + int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex; chars += pcSize; remaining -= pcSize; if (remaining <= 0) { @@ -356,28 +356,28 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, utext_setNativeIndex(text, current+cuWordLength); } } - + // Never stop before a combining mark. int32_t currPos; - while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) { + while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) { utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - currPos; + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos; } - + // Look ahead for possible suffixes if a dictionary word does not follow. // We do this in code rather than using a rule so that the heuristic // resynch continues to function. For example, one of the suffix characters // could be a typo in the middle of a word. - if ((int32_t)utext_getNativeIndex(text) < rangeEnd && cuWordLength > 0) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cuWordLength > 0) { if (words[wordsFound%THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) <= 0 && fSuffixSet.contains(uc = utext_current32(text))) { if (uc == THAI_PAIYANNOI) { if (!fSuffixSet.contains(utext_previous32(text))) { // Skip over previous end and PAIYANNOI utext_next32(text); - int32_t paiyannoiIndex = (int32_t)utext_getNativeIndex(text); + int32_t paiyannoiIndex = static_cast<int32_t>(utext_getNativeIndex(text)); utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - paiyannoiIndex; // Add PAIYANNOI to word + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - paiyannoiIndex; // Add PAIYANNOI to word uc = utext_current32(text); // Fetch next character } else { @@ -389,9 +389,9 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, if (utext_previous32(text) != THAI_MAIYAMOK) { // Skip over previous end and MAIYAMOK utext_next32(text); - int32_t maiyamokIndex = (int32_t)utext_getNativeIndex(text); + int32_t maiyamokIndex = static_cast<int32_t>(utext_getNativeIndex(text)); utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - maiyamokIndex; // Add MAIYAMOK to word + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - maiyamokIndex; // Add MAIYAMOK to word } else { // Restore prior position @@ -489,7 +489,7 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, utext_setNativeIndex(text, rangeStart); - while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) { + while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) { cuWordLength = 0; cpWordLength = 0; @@ -514,7 +514,7 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, words[wordsFound%LAO_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } @@ -541,7 +541,7 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, // just found (if there is one), but only if the preceding word does not exceed // the threshold. // The text iterator should now be positioned at the end of the word we found. - if ((int32_t)utext_getNativeIndex(text) < rangeEnd && cpWordLength < LAO_ROOT_COMBINE_THRESHOLD) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < LAO_ROOT_COMBINE_THRESHOLD) { // if it is a dictionary word, do nothing. If it isn't, then if there is // no preceding word, or the non-word shares less than the minimum threshold // of characters with a dictionary word, then scan to resynchronize @@ -554,9 +554,9 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, UChar32 uc; int32_t chars = 0; for (;;) { - int32_t pcIndex = (int32_t)utext_getNativeIndex(text); + int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text)); pc = utext_next32(text); - int32_t pcSize = (int32_t)utext_getNativeIndex(text) - pcIndex; + int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex; chars += pcSize; remaining -= pcSize; if (remaining <= 0) { @@ -590,9 +590,9 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, // Never stop before a combining mark. int32_t currPos; - while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) { + while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) { utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - currPos; + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos; } // Look ahead for possible suffixes if a dictionary word does not follow. @@ -682,7 +682,7 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, utext_setNativeIndex(text, rangeStart); - while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) { + while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) { cuWordLength = 0; cpWordLength = 0; @@ -707,7 +707,7 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, words[wordsFound%BURMESE_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } @@ -734,7 +734,7 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, // just found (if there is one), but only if the preceding word does not exceed // the threshold. // The text iterator should now be positioned at the end of the word we found. - if ((int32_t)utext_getNativeIndex(text) < rangeEnd && cpWordLength < BURMESE_ROOT_COMBINE_THRESHOLD) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < BURMESE_ROOT_COMBINE_THRESHOLD) { // if it is a dictionary word, do nothing. If it isn't, then if there is // no preceding word, or the non-word shares less than the minimum threshold // of characters with a dictionary word, then scan to resynchronize @@ -747,9 +747,9 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, UChar32 uc; int32_t chars = 0; for (;;) { - int32_t pcIndex = (int32_t)utext_getNativeIndex(text); + int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text)); pc = utext_next32(text); - int32_t pcSize = (int32_t)utext_getNativeIndex(text) - pcIndex; + int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex; chars += pcSize; remaining -= pcSize; if (remaining <= 0) { @@ -783,9 +783,9 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, // Never stop before a combining mark. int32_t currPos; - while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) { + while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) { utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - currPos; + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos; } // Look ahead for possible suffixes if a dictionary word does not follow. @@ -888,7 +888,7 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, utext_setNativeIndex(text, rangeStart); - while (U_SUCCESS(status) && (current = (int32_t)utext_getNativeIndex(text)) < rangeEnd) { + while (U_SUCCESS(status) && (current = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd) { cuWordLength = 0; cpWordLength = 0; @@ -905,7 +905,7 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, // If there was more than one, see which one can take us forward the most words else if (candidates > 1) { // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } do { @@ -914,7 +914,7 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, words[wordsFound % KHMER_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done - if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) >= rangeEnd) { goto foundBest; } @@ -941,7 +941,7 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, // just found (if there is one), but only if the preceding word does not exceed // the threshold. // The text iterator should now be positioned at the end of the word we found. - if ((int32_t)utext_getNativeIndex(text) < rangeEnd && cpWordLength < KHMER_ROOT_COMBINE_THRESHOLD) { + if (static_cast<int32_t>(utext_getNativeIndex(text)) < rangeEnd && cpWordLength < KHMER_ROOT_COMBINE_THRESHOLD) { // if it is a dictionary word, do nothing. If it isn't, then if there is // no preceding word, or the non-word shares less than the minimum threshold // of characters with a dictionary word, then scan to resynchronize @@ -954,9 +954,9 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, UChar32 uc; int32_t chars = 0; for (;;) { - int32_t pcIndex = (int32_t)utext_getNativeIndex(text); + int32_t pcIndex = static_cast<int32_t>(utext_getNativeIndex(text)); pc = utext_next32(text); - int32_t pcSize = (int32_t)utext_getNativeIndex(text) - pcIndex; + int32_t pcSize = static_cast<int32_t>(utext_getNativeIndex(text)) - pcIndex; chars += pcSize; remaining -= pcSize; if (remaining <= 0) { @@ -989,9 +989,9 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, // Never stop before a combining mark. int32_t currPos; - while ((currPos = (int32_t)utext_getNativeIndex(text)) < rangeEnd && fMarkSet.contains(utext_current32(text))) { + while ((currPos = static_cast<int32_t>(utext_getNativeIndex(text))) < rangeEnd && fMarkSet.contains(utext_current32(text))) { utext_next32(text); - cuWordLength += (int32_t)utext_getNativeIndex(text) - currPos; + cuWordLength += static_cast<int32_t>(utext_getNativeIndex(text)) - currPos; } // Look ahead for possible suffixes if a dictionary word does not follow. @@ -1120,7 +1120,7 @@ static inline bool isKatakana(UChar32 value) { // Replicates an internal UText function. static inline int32_t utext_i32_flag(int32_t bitIndex) { - return (int32_t)1 << bitIndex; + return static_cast<int32_t>(1) << bitIndex; } /* @@ -1167,14 +1167,14 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t limit = rangeEnd; U_ASSERT(limit <= utext_nativeLength(inText)); if (limit > utext_nativeLength(inText)) { - limit = (int32_t)utext_nativeLength(inText); + limit = static_cast<int32_t>(utext_nativeLength(inText)); } inputMap.adoptInsteadAndCheckErrorCode(new UVector32(status), status); if (U_FAILURE(status)) { return 0; } while (utext_getNativeIndex(inText) < limit) { - int32_t nativePosition = (int32_t)utext_getNativeIndex(inText); + int32_t nativePosition = static_cast<int32_t>(utext_getNativeIndex(inText)); UChar32 c = utext_next32(inText); U_ASSERT(c != U_SENTINEL); inString.append(c); @@ -1304,7 +1304,7 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t ix = 0; bool is_prev_katakana = false; for (int32_t i = 0; i < numCodePts; ++i, ix = inString.moveIndex32(ix, 1)) { - if ((uint32_t)bestSnlp.elementAti(i) == kuint32max) { + if (static_cast<uint32_t>(bestSnlp.elementAti(i)) == kuint32max) { continue; } @@ -1327,9 +1327,9 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, } for (int32_t j = 0; j < count; j++) { - uint32_t newSnlp = (uint32_t)bestSnlp.elementAti(i) + (uint32_t)values.elementAti(j); + uint32_t newSnlp = static_cast<uint32_t>(bestSnlp.elementAti(i)) + static_cast<uint32_t>(values.elementAti(j)); int32_t ln_j_i = lengths.elementAti(j) + i; - if (newSnlp < (uint32_t)bestSnlp.elementAti(ln_j_i)) { + if (newSnlp < static_cast<uint32_t>(bestSnlp.elementAti(ln_j_i))) { bestSnlp.setElementAt(newSnlp, ln_j_i); prev.setElementAt(i, ln_j_i); } @@ -1353,7 +1353,7 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, } if (katakanaRunLength < kMaxKatakanaGroupLength) { uint32_t newSnlp = bestSnlp.elementAti(i) + getKatakanaCost(katakanaRunLength); - if (newSnlp < (uint32_t)bestSnlp.elementAti(i+katakanaRunLength)) { + if (newSnlp < static_cast<uint32_t>(bestSnlp.elementAti(i + katakanaRunLength))) { bestSnlp.setElementAt(newSnlp, i+katakanaRunLength); prev.setElementAt(i, i+katakanaRunLength); // prev[j] = i; } @@ -1371,7 +1371,7 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t numBreaks = 0; // No segmentation found, set boundary to end of range - if ((uint32_t)bestSnlp.elementAti(numCodePts) == kuint32max) { + if (static_cast<uint32_t>(bestSnlp.elementAti(numCodePts)) == kuint32max) { t_boundary.addElement(numCodePts, status); numBreaks++; } else if (isPhraseBreaking) { diff --git a/deps/icu-small/source/common/dictionarydata.cpp b/deps/icu-small/source/common/dictionarydata.cpp index 80b6d82d56ae17..4bae0c6d335838 100644 --- a/deps/icu-small/source/common/dictionarydata.cpp +++ b/deps/icu-small/source/common/dictionarydata.cpp @@ -47,13 +47,13 @@ int32_t UCharsDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t int32_t *prefix) const { UCharsTrie uct(characters); - int32_t startingTextIndex = (int32_t)utext_getNativeIndex(text); + int32_t startingTextIndex = static_cast<int32_t>(utext_getNativeIndex(text)); int32_t wordCount = 0; int32_t codePointsMatched = 0; for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) { UStringTrieResult result = (codePointsMatched == 0) ? uct.first(c) : uct.next(c); - int32_t lengthMatched = (int32_t)utext_getNativeIndex(text) - startingTextIndex; + int32_t lengthMatched = static_cast<int32_t>(utext_getNativeIndex(text)) - startingTextIndex; codePointsMatched += 1; if (USTRINGTRIE_HAS_VALUE(result)) { if (wordCount < limit) { @@ -101,7 +101,7 @@ UChar32 BytesDictionaryMatcher::transform(UChar32 c) const { if (delta < 0 || 0xFD < delta) { return U_SENTINEL; } - return (UChar32)delta; + return static_cast<UChar32>(delta); } return c; } @@ -114,13 +114,13 @@ int32_t BytesDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t int32_t *lengths, int32_t *cpLengths, int32_t *values, int32_t *prefix) const { BytesTrie bt(characters); - int32_t startingTextIndex = (int32_t)utext_getNativeIndex(text); + int32_t startingTextIndex = static_cast<int32_t>(utext_getNativeIndex(text)); int32_t wordCount = 0; int32_t codePointsMatched = 0; for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) { UStringTrieResult result = (codePointsMatched == 0) ? bt.first(transform(c)) : bt.next(transform(c)); - int32_t lengthMatched = (int32_t)utext_getNativeIndex(text) - startingTextIndex; + int32_t lengthMatched = static_cast<int32_t>(utext_getNativeIndex(text)) - startingTextIndex; codePointsMatched += 1; if (USTRINGTRIE_HAS_VALUE(result)) { if (wordCount < limit) { diff --git a/deps/icu-small/source/common/edits.cpp b/deps/icu-small/source/common/edits.cpp index 3348145d48df6d..82055e5e543bfc 100644 --- a/deps/icu-small/source/common/edits.cpp +++ b/deps/icu-small/source/common/edits.cpp @@ -47,7 +47,7 @@ Edits &Edits::copyArray(const Edits &other) { return *this; } if (length > capacity) { - uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)length * 2); + uint16_t* newArray = static_cast<uint16_t*>(uprv_malloc(static_cast<size_t>(length) * 2)); if (newArray == nullptr) { length = delta = numChanges = 0; errorCode_ = U_MEMORY_ALLOCATION_ERROR; @@ -186,30 +186,30 @@ void Edits::addReplace(int32_t oldLength, int32_t newLength) { head |= oldLength << 6; } else if(oldLength <= 0x7fff) { head |= LENGTH_IN_1TRAIL << 6; - array[limit++] = (uint16_t)(0x8000 | oldLength); + array[limit++] = static_cast<uint16_t>(0x8000 | oldLength); } else { head |= (LENGTH_IN_2TRAIL + (oldLength >> 30)) << 6; - array[limit++] = (uint16_t)(0x8000 | (oldLength >> 15)); - array[limit++] = (uint16_t)(0x8000 | oldLength); + array[limit++] = static_cast<uint16_t>(0x8000 | (oldLength >> 15)); + array[limit++] = static_cast<uint16_t>(0x8000 | oldLength); } if(newLength < LENGTH_IN_1TRAIL) { head |= newLength; } else if(newLength <= 0x7fff) { head |= LENGTH_IN_1TRAIL; - array[limit++] = (uint16_t)(0x8000 | newLength); + array[limit++] = static_cast<uint16_t>(0x8000 | newLength); } else { head |= LENGTH_IN_2TRAIL + (newLength >> 30); - array[limit++] = (uint16_t)(0x8000 | (newLength >> 15)); - array[limit++] = (uint16_t)(0x8000 | newLength); + array[limit++] = static_cast<uint16_t>(0x8000 | (newLength >> 15)); + array[limit++] = static_cast<uint16_t>(0x8000 | newLength); } - array[length] = (uint16_t)head; + array[length] = static_cast<uint16_t>(head); length = limit; } } void Edits::append(int32_t r) { if(length < capacity || growArray()) { - array[length++] = (uint16_t)r; + array[length++] = static_cast<uint16_t>(r); } } @@ -232,7 +232,7 @@ UBool Edits::growArray() { errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return false; } - uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)newCapacity * 2); + uint16_t* newArray = static_cast<uint16_t*>(uprv_malloc(static_cast<size_t>(newCapacity) * 2)); if (newArray == nullptr) { errorCode_ = U_MEMORY_ALLOCATION_ERROR; return false; @@ -415,7 +415,7 @@ int32_t Edits::Iterator::readLength(int32_t head) { U_ASSERT(array[index] >= 0x8000); U_ASSERT(array[index + 1] >= 0x8000); int32_t len = ((head & 1) << 30) | - ((int32_t)(array[index] & 0x7fff) << 15) | + (static_cast<int32_t>(array[index] & 0x7fff) << 15) | (array[index + 1] & 0x7fff); index += 2; return len; diff --git a/deps/icu-small/source/common/emojiprops.cpp b/deps/icu-small/source/common/emojiprops.cpp index f2b3f4762f339f..2e4fb0130ce8fc 100644 --- a/deps/icu-small/source/common/emojiprops.cpp +++ b/deps/icu-small/source/common/emojiprops.cpp @@ -83,8 +83,8 @@ void EmojiProps::load(UErrorCode &errorCode) { memory = udata_openChoice(nullptr, "icu", "uemoji", isAcceptable, this, &errorCode); if (U_FAILURE(errorCode)) { return; } - const uint8_t *inBytes = (const uint8_t *)udata_getMemory(memory); - const int32_t *inIndexes = (const int32_t *)inBytes; + const uint8_t* inBytes = static_cast<const uint8_t*>(udata_getMemory(memory)); + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); int32_t indexesLength = inIndexes[IX_CPTRIE_OFFSET] / 4; if (indexesLength <= IX_RGI_EMOJI_ZWJ_SEQUENCE_TRIE_OFFSET) { errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes. @@ -104,7 +104,7 @@ EmojiProps::load(UErrorCode &errorCode) { offset = inIndexes[i]; nextOffset = inIndexes[i + 1]; // Set/leave nullptr if there is no UCharsTrie. - const char16_t *p = nextOffset > offset ? (const char16_t *)(inBytes + offset) : nullptr; + const char16_t* p = nextOffset > offset ? reinterpret_cast<const char16_t*>(inBytes + offset) : nullptr; stringTries[getStringTrieIndex(i)] = p; } } diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index a705b037c47bc0..29b02dd38424ae 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -50,8 +50,8 @@ static void _fb_trace(const char *m, const UnicodeString *s, UBool b, int32_t d, * Used with sortedInsert() */ static int32_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { - const UnicodeString &a = *(const UnicodeString*)t1.pointer; - const UnicodeString &b = *(const UnicodeString*)t2.pointer; + const UnicodeString& a = *static_cast<const UnicodeString*>(t1.pointer); + const UnicodeString& b = *static_cast<const UnicodeString*>(t2.pointer); return a.compare(b); } @@ -76,7 +76,7 @@ class UStringSet : public UVector { * Return the ith UnicodeString alias */ inline const UnicodeString* getStringAt(int32_t i) const { - return (const UnicodeString*)elementAt(i); + return static_cast<const UnicodeString*>(elementAt(i)); } /** * Adopt the UnicodeString if not already contained. @@ -147,7 +147,7 @@ class SimpleFilteredSentenceBreakData : public UMemory { if(umtx_atomic_dec(&refcount) <= 0) { delete this; } - return 0; + return nullptr; } virtual ~SimpleFilteredSentenceBreakData(); diff --git a/deps/icu-small/source/common/fixedstring.cpp b/deps/icu-small/source/common/fixedstring.cpp new file mode 100644 index 00000000000000..1c603083e2f2b2 --- /dev/null +++ b/deps/icu-small/source/common/fixedstring.cpp @@ -0,0 +1,29 @@ +// © 2025 and later: Unicode, Inc. and others. +// License & terms of use: https://www.unicode.org/copyright.html + +#include "fixedstring.h" + +#include "unicode/unistr.h" +#include "unicode/utypes.h" + +U_NAMESPACE_BEGIN + +U_EXPORT void copyInvariantChars(const UnicodeString& src, FixedString& dst, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + + if (src.isEmpty()) { + dst.clear(); + return; + } + + int32_t length = src.length(); + if (!dst.reserve(length + 1)) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + src.extract(0, length, dst.getAlias(), length + 1, US_INV); +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/fixedstring.h b/deps/icu-small/source/common/fixedstring.h new file mode 100644 index 00000000000000..b576d17ad9af83 --- /dev/null +++ b/deps/icu-small/source/common/fixedstring.h @@ -0,0 +1,104 @@ +// © 2025 and later: Unicode, Inc. and others. +// License & terms of use: https://www.unicode.org/copyright.html + +#ifndef FIXEDSTRING_H +#define FIXEDSTRING_H + +#include <string_view> +#include <utility> + +#include "unicode/uobject.h" +#include "unicode/utypes.h" +#include "cmemory.h" + +U_NAMESPACE_BEGIN + +class UnicodeString; + +/** + * ICU-internal fixed-length char* string class. + * This is a complement to CharString to store fixed-length strings efficiently + * (not allocating any unnecessary storage for future additions to the string). + * + * A terminating NUL is always stored, but the length of the string isn't. + * An empty string is stored as nullptr, allocating no storage at all. + * + * This class wants to be convenient but is also deliberately minimalist. + * Please do not add methods if they only add minor convenience. + */ +class FixedString : public UMemory { +public: + FixedString() = default; + ~FixedString() { operator delete[](ptr); } + + FixedString(const FixedString& other) : FixedString(other.data()) {} + + FixedString(std::string_view init) { + size_t size = init.size(); + if (size > 0 && reserve(size + 1)) { + uprv_memcpy(ptr, init.data(), size); + ptr[size] = '\0'; + } + } + + FixedString& operator=(const FixedString& other) { + *this = other.data(); + return *this; + } + + FixedString& operator=(std::string_view init) { + if (init.empty()) { + operator delete[](ptr); + ptr = nullptr; + } else { + size_t size = init.size(); + if (reserve(size + 1)) { + uprv_memcpy(ptr, init.data(), size); + ptr[size] = '\0'; + } + } + return *this; + } + + FixedString(FixedString&& other) noexcept : ptr(std::exchange(other.ptr, nullptr)) {} + + FixedString& operator=(FixedString&& other) noexcept { + operator delete[](ptr); + ptr = other.ptr; + other.ptr = nullptr; + return *this; + } + + void clear() { + operator delete[](ptr); + ptr = nullptr; + } + + const char* data() const { + return isEmpty() ? "" : ptr; + } + + char* getAlias() { + return ptr; + } + + bool isEmpty() const { + return ptr == nullptr; + } + + /** Allocate storage for a new string, without initializing it. */ + bool reserve(size_t size) { + operator delete[](ptr); + ptr = static_cast<char*>(operator new[](size)); + return ptr != nullptr; + } + +private: + char* ptr = nullptr; +}; + +U_COMMON_API void copyInvariantChars(const UnicodeString& src, FixedString& dst, UErrorCode& status); + +U_NAMESPACE_END + +#endif diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index bc103ee72ca5f3..c1a1c5c65acae4 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -148,12 +148,12 @@ inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, } inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, - UErrorCode& status) : hash(0) { + UErrorCode& status) : hash(nullptr) { init( uhash_hashUnicodeString, keyComp, valueComp, status); } inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) - : hash(0) + : hash(nullptr) { init(ignoreKeyCase ? uhash_hashCaselessUnicodeString : uhash_hashUnicodeString, @@ -164,7 +164,7 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) } inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) - : hash(0) + : hash(nullptr) { initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString : uhash_hashUnicodeString, @@ -175,13 +175,13 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& statu } inline Hashtable::Hashtable(UErrorCode& status) - : hash(0) + : hash(nullptr) { init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status); } inline Hashtable::Hashtable() - : hash(0) + : hash(nullptr) { UErrorCode status = U_ZERO_ERROR; init(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, status); diff --git a/deps/icu-small/source/common/icuplug.cpp b/deps/icu-small/source/common/icuplug.cpp index 7aa70a506b0887..521a125e43d8c0 100644 --- a/deps/icu-small/source/common/icuplug.cpp +++ b/deps/icu-small/source/common/icuplug.cpp @@ -747,7 +747,7 @@ uplug_init(UErrorCode *status) { FILE *f; CharString pluginFile; -#ifdef OS390BATCH +#ifdef ICU_PLUGINS_DD /* There are potentially a lot of ways to implement a plugin directory on OS390/zOS */ /* Keeping in mind that unauthorized file access is logged, monitored, and enforced */ /* I've chosen to open a DDNAME if BATCH and leave it alone for (presumably) UNIX */ diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 99b8f3e86c6c32..bb5736137d7209 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -63,7 +63,7 @@ LoadedNormalizer2Impl::isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - pInfo->formatVersion[0]==4 + pInfo->formatVersion[0]==5 ) { // Normalizer2Impl *me=(Normalizer2Impl *)context; // uprv_memcpy(me->dataVersion, pInfo->dataVersion, 4); @@ -82,8 +82,8 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod if(U_FAILURE(errorCode)) { return; } - const uint8_t *inBytes=(const uint8_t *)udata_getMemory(memory); - const int32_t *inIndexes=(const int32_t *)inBytes; + const uint8_t* inBytes = static_cast<const uint8_t*>(udata_getMemory(memory)); + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4; if(indexesLength<=IX_MIN_LCCC_CP) { errorCode=U_INVALID_FORMAT_ERROR; // Not enough indexes. @@ -101,7 +101,7 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod offset=nextOffset; nextOffset=inIndexes[IX_SMALL_FCD_OFFSET]; - const uint16_t *inExtraData=(const uint16_t *)(inBytes+offset); + const uint16_t* inExtraData = reinterpret_cast<const uint16_t*>(inBytes + offset); // smallFCD: new in formatVersion 2 offset=nextOffset; @@ -311,7 +311,7 @@ Normalizer2::getInstance(const char *packageName, { Mutex lock; if(cache!=nullptr) { - allModes=(Norm2AllModes *)uhash_get(cache, name); + allModes = static_cast<Norm2AllModes*>(uhash_get(cache, name)); } } if(allModes==nullptr) { @@ -331,7 +331,7 @@ Normalizer2::getInstance(const char *packageName, void *temp=uhash_get(cache, name); if(temp==nullptr) { int32_t keyLength= static_cast<int32_t>(uprv_strlen(name)+1); - char *nameCopy=(char *)uprv_malloc(keyLength); + char* nameCopy = static_cast<char*>(uprv_malloc(keyLength)); if(nameCopy==nullptr) { errorCode=U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -341,7 +341,7 @@ Normalizer2::getInstance(const char *packageName, uhash_put(cache, nameCopy, localAllModes.orphan(), &errorCode); } else { // race condition - allModes=(Norm2AllModes *)temp; + allModes = static_cast<Norm2AllModes*>(temp); } } } diff --git a/deps/icu-small/source/common/localebuilder.cpp b/deps/icu-small/source/common/localebuilder.cpp index c1e1f2ad682a87..3ba7355306894c 100644 --- a/deps/icu-small/source/common/localebuilder.cpp +++ b/deps/icu-small/source/common/localebuilder.cpp @@ -1,23 +1,26 @@ // © 2019 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +#include <optional> +#include <string_view> #include <utility> -#include "bytesinkutil.h" // CharStringByteSink +#include "bytesinkutil.h" // StringByteSink<CharString> #include "charstr.h" #include "cstring.h" +#include "fixedstring.h" #include "ulocimp.h" #include "unicode/localebuilder.h" #include "unicode/locid.h" -U_NAMESPACE_BEGIN +namespace { -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +inline bool UPRV_ISDIGIT(char c) { return c >= '0' && c <= '9'; } +inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); } constexpr const char* kAttributeKey = "attribute"; -static bool _isExtensionSubtags(char key, const char* s, int32_t len) { +bool _isExtensionSubtags(char key, const char* s, int32_t len) { switch (uprv_tolower(key)) { case 'u': return ultag_isUnicodeExtensionSubtags(s, len); @@ -30,6 +33,10 @@ static bool _isExtensionSubtags(char key, const char* s, int32_t len) { } } +} // namespace + +U_NAMESPACE_BEGIN + LocaleBuilder::LocaleBuilder() : UObject(), status_(U_ZERO_ERROR), language_(), script_(), region_(), variant_(nullptr), extensions_(nullptr) { @@ -68,8 +75,10 @@ LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) return *this; } -static void setField(StringPiece input, char* dest, UErrorCode& errorCode, - UBool (*test)(const char*, int32_t)) { +namespace { + +void setField(StringPiece input, char* dest, UErrorCode& errorCode, + bool (*test)(const char*, int32_t)) { if (U_FAILURE(errorCode)) { return; } if (input.empty()) { dest[0] = '\0'; @@ -81,6 +90,8 @@ static void setField(StringPiece input, char* dest, UErrorCode& errorCode, } } +} // namespace + LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) { setField(language, language_, status_, &ultag_isLanguageSubtag); @@ -99,7 +110,9 @@ LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) return *this; } -static void transform(char* data, int32_t len) { +namespace { + +void transform(char* data, int32_t len) { for (int32_t i = 0; i < len; i++, data++) { if (*data == '_') { *data = '-'; @@ -109,6 +122,8 @@ static void transform(char* data, int32_t len) { } } +} // namespace + LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) { if (U_FAILURE(status_)) { return *this; } @@ -117,14 +132,13 @@ LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) variant_ = nullptr; return *this; } - CharString* new_variant = new CharString(variant, status_); - if (U_FAILURE(status_)) { return *this; } - if (new_variant == nullptr) { + FixedString* new_variant = new FixedString(variant); + if (new_variant == nullptr || new_variant->isEmpty()) { status_ = U_MEMORY_ALLOCATION_ERROR; return *this; } - transform(new_variant->data(), new_variant->length()); - if (!ultag_isVariantSubtags(new_variant->data(), new_variant->length())) { + transform(new_variant->getAlias(), variant.length()); + if (!ultag_isVariantSubtags(new_variant->data(), variant.length())) { delete new_variant; status_ = U_ILLEGAL_ARGUMENT_ERROR; return *this; @@ -134,7 +148,9 @@ LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) return *this; } -static bool +namespace { + +bool _isKeywordValue(const char* key, const char* value, int32_t value_len) { if (key[1] == '\0') { @@ -148,15 +164,18 @@ _isKeywordValue(const char* key, const char* value, int32_t value_len) // otherwise: unicode extension value // We need to convert from legacy key/value to unicode // key/value - const char* unicode_locale_key = uloc_toUnicodeLocaleKey(key); - const char* unicode_locale_type = uloc_toUnicodeLocaleType(key, value); - - return unicode_locale_key && unicode_locale_type && - ultag_isUnicodeLocaleKey(unicode_locale_key, -1) && - ultag_isUnicodeLocaleType(unicode_locale_type, -1); + std::optional<std::string_view> unicode_locale_key = ulocimp_toBcpKeyWithFallback(key); + std::optional<std::string_view> unicode_locale_type = ulocimp_toBcpTypeWithFallback(key, value); + + return unicode_locale_key.has_value() && + unicode_locale_type.has_value() && + ultag_isUnicodeLocaleKey(unicode_locale_key->data(), + static_cast<int32_t>(unicode_locale_key->size())) && + ultag_isUnicodeLocaleType(unicode_locale_type->data(), + static_cast<int32_t>(unicode_locale_type->size())); } -static void +void _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, Locale& to, bool validate, UErrorCode& errorCode) { @@ -169,9 +188,7 @@ _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, } const char* key; while ((key = keywords->next(nullptr, errorCode)) != nullptr) { - CharString value; - CharStringByteSink sink(&value); - from.getKeywordValue(key, sink, errorCode); + auto value = from.getKeywordValue<CharString>(key, errorCode); if (U_FAILURE(errorCode)) { return; } if (uprv_strcmp(key, kAttributeKey) == 0) { transform(value.data(), value.length()); @@ -186,9 +203,10 @@ _copyExtensions(const Locale& from, icu::StringEnumeration *keywords, } } -void static +void _clearUAttributesAndKeyType(Locale& locale, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } // Clear Unicode attributes locale.setKeywordValue(kAttributeKey, "", errorCode); @@ -201,9 +219,10 @@ _clearUAttributesAndKeyType(Locale& locale, UErrorCode& errorCode) } } -static void +void _setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } // Add the unicode extensions to extensions_ CharString locale_str("und-u-", errorCode); locale_str.append(value, errorCode); @@ -212,6 +231,8 @@ _setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& error locale, false, errorCode); } +} // namespace + LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) { if (U_FAILURE(status_)) { return *this; } @@ -289,10 +310,8 @@ LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( return *this; } - CharString attributes; - CharStringByteSink sink(&attributes); UErrorCode localErrorCode = U_ZERO_ERROR; - extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + auto attributes = extensions_->getKeywordValue<CharString>(kAttributeKey, localErrorCode); if (U_FAILURE(localErrorCode)) { CharString new_attributes(value_str.data(), status_); // No attributes, set the attribute. @@ -344,9 +363,7 @@ LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( } if (extensions_ == nullptr) { return *this; } UErrorCode localErrorCode = U_ZERO_ERROR; - CharString attributes; - CharStringByteSink sink(&attributes); - extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + auto attributes = extensions_->getKeywordValue<CharString>(kAttributeKey, localErrorCode); // get failure, just return if (U_FAILURE(localErrorCode)) { return *this; } // Do not have any attributes, just return. diff --git a/deps/icu-small/source/common/localefallback_data.h b/deps/icu-small/source/common/localefallback_data.h index c847edefff5828..338bfa3595ba42 100644 --- a/deps/icu-small/source/common/localefallback_data.h +++ b/deps/icu-small/source/common/localefallback_data.h @@ -11,455 +11,464 @@ //====================================================================== // Default script table const char scriptCodeChars[] = - "Aghb\0Ahom\0Arab\0Armi\0Armn\0Avst\0Bamu\0Bass\0Batk\0Beng\0Bopo\0" + "Aghb\0Ahom\0Arab\0Armi\0Armn\0Avst\0Bali\0Bamu\0Batk\0Beng\0Bopo\0" "Brah\0Cakm\0Cans\0Cari\0Cham\0Cher\0Chrs\0Copt\0Cprt\0Cyrl\0Deva\0" "Egyp\0Elym\0Ethi\0Geor\0Gong\0Gonm\0Goth\0Gran\0Grek\0Gujr\0Guru\0" "Hang\0Hani\0Hans\0Hant\0Hebr\0Hluw\0Hmnp\0Ital\0Java\0Jpan\0Kali\0" - "Kana\0Kawi\0Khar\0Khmr\0Kits\0Knda\0Kore\0Lana\0Laoo\0Lepc\0Lina\0" - "Linb\0Lisu\0Lyci\0Lydi\0Mand\0Mani\0Marc\0Medf\0Merc\0Mlym\0Modi\0" - "Mong\0Mroo\0Mtei\0Mymr\0Narb\0Newa\0Nkoo\0Nshu\0Ogam\0Olck\0Orkh\0" - "Orya\0Osge\0Pauc\0Phli\0Phnx\0Plrd\0Prti\0Rjng\0Rohg\0Runr\0Samr\0" - "Sarb\0Saur\0Sgnw\0Sinh\0Sogd\0Sora\0Soyo\0Syrc\0Tagb\0Takr\0Tale\0" - "Talu\0Taml\0Tang\0Tavt\0Telu\0Tfng\0Thaa\0Thai\0Tibt\0Tnsa\0Toto\0" - "Ugar\0Vaii\0Wcho\0Xpeo\0Xsux\0Yiii\0"; + "Kana\0Khar\0Khmr\0Kits\0Knda\0Kore\0Lana\0Laoo\0Latf\0Latg\0Lepc\0" + "Lina\0Linb\0Lisu\0Lyci\0Lydi\0Mand\0Mani\0Marc\0Medf\0Merc\0Mlym\0" + "Modi\0Mong\0Mroo\0Mtei\0Mymr\0Narb\0Newa\0Nkoo\0Ogam\0Olck\0Orkh\0" + "Orya\0Osge\0Ougr\0Pauc\0Phli\0Phnx\0Plrd\0Prti\0Rjng\0Rohg\0Runr\0" + "Samr\0Sarb\0Saur\0Sgnw\0Sidt\0Sinh\0Sogd\0Sora\0Soyo\0Syrc\0Tagb\0" + "Takr\0Tale\0Talu\0Taml\0Tang\0Tavt\0Telu\0Tfng\0Thaa\0Thai\0Tibt\0" + "Tnsa\0Toto\0Ugar\0Vaii\0Wcho\0Xpeo\0Xsux\0Yiii\0"; const char dsLocaleIDChars[] = - "aaf\0aao\0aat\0ab\0abh\0abl\0abv\0acm\0acq\0acw\0acx\0adf\0adx\0" - "ady\0ae\0aeb\0aec\0aee\0aeq\0afb\0agi\0agj\0agx\0ahg\0aho\0ahr\0" - "aib\0aij\0ain\0aio\0aiq\0ajp\0akk\0akv\0alk\0all\0alr\0alt\0alw\0" - "am\0ams\0amw\0ani\0anp\0anr\0anu\0aot\0apc\0apd\0aph\0aqc\0ar\0" - "arc\0arq\0ars\0ary\0arz\0as\0ase\0ask\0atn\0atv\0auj\0auz\0av\0" - "avd\0avl\0awa\0awn\0axm\0ayh\0ayl\0ayn\0ayp\0az_IQ\0az_IR\0az_RU\0" - "azb\0ba\0bal\0bap\0bax\0bbl\0bcq\0bdv\0bdz\0be\0bee\0bej\0bfb\0" - "bfq\0bft\0bfu\0bfw\0bfy\0bfz\0bg\0bgc\0bgd\0bgn\0bgp\0bgq\0bgw\0" - "bgx\0bha\0bhb\0bhd\0bhe\0bhh\0bhi\0bhj\0bhm\0bhn\0bho\0bht\0bhu\0" - "biy\0bjf\0bjj\0bjm\0blk\0blt\0bmj\0bn\0bns\0bo\0bph\0bpx\0bpy\0" - "bqi\0bra\0brb\0brd\0brh\0brk\0brv\0brx\0bsh\0bsk\0bsq\0bst\0btd\0" - "btm\0btv\0bua\0bwe\0bxm\0bxu\0byh\0byn\0byw\0bzi\0cbn\0ccp\0cde\0" - "cdh\0cdi\0cdj\0cdm\0cdo\0cdz\0ce\0cgk\0chg\0chm\0chr\0chx\0cih\0" - "cja\0cji\0cjm\0cjy\0ckb\0ckt\0clh\0clw\0cmg\0cna\0cnp\0cog\0cop\0" - "cpg\0cr\0crh\0crj\0crk\0crl\0crm\0csh\0csp\0csw\0ctd\0ctg\0ctn\0" - "ctt\0cu\0cuu\0cv\0czh\0czk\0daq\0dar\0dcc\0ddo\0def\0deh\0der\0" - "dhi\0dhn\0dho\0dhw\0dka\0dlg\0dmf\0dmk\0dml\0dng\0dnu\0dnv\0doi\0" - "dox\0dre\0drq\0drs\0dry\0dso\0dty\0dub\0duh\0dus\0dv\0dwk\0dwz\0" - "dz\0dzl\0ecr\0ecy\0egy\0eky\0el\0emg\0emu\0enf\0enh\0era\0esg\0" - "esh\0ett\0eve\0evn\0fa\0fay\0faz\0fia\0fmu\0fub\0gan\0gaq\0gas\0" - "gau\0gbj\0gbk\0gbl\0gbm\0gbz\0gdb\0gdo\0gdx\0gez\0ggg\0gha\0ghe\0" - "ghr\0ght\0gig\0gin\0gjk\0gju\0gld\0glh\0glk\0gmv\0gmy\0goe\0gof\0" - "gok\0gom\0gon\0got\0gra\0grc\0grt\0gru\0gu\0gvr\0gwc\0gwf\0gwt\0" - "gyo\0gzi\0ha_CM\0ha_SD\0hac\0hak\0har\0haz\0hbo\0hdy\0he\0hi\0" - "hii\0hit\0hkh\0hlb\0hlu\0hmd\0hmj\0hmq\0hnd\0hne\0hnj\0hnj_AU\0" - "hnj_CN\0hnj_FR\0hnj_GF\0hnj_LA\0hnj_MM\0hnj_SR\0hnj_TH\0hnj_VN\0" - "hno\0hoc\0hoh\0hoj\0how\0hoy\0hpo\0hrt\0hrz\0hsn\0hss\0htx\0hut\0" - "huy\0huz\0hy\0hyw\0ii\0imy\0inh\0int\0ior\0iru\0isk\0itk\0itl\0" - "iu\0iw\0ja\0jad\0jat\0jbe\0jbn\0jct\0jda\0jdg\0jdt\0jee\0jge\0" - "ji\0jje\0jkm\0jml\0jna\0jnd\0jnl\0jns\0jog\0jpa\0jpr\0jrb\0jrb_MA\0" - "jul\0jun\0juy\0jya\0jye\0ka\0kaa\0kap\0kaw\0kbd\0kbu\0kby\0kca\0" - "kdq\0kdt\0ket\0kex\0key\0kfa\0kfb\0kfc\0kfd\0kfe\0kfh\0kfi\0kfk\0" - "kfm\0kfp\0kfq\0kfr\0kfs\0kfx\0kfy\0kgj\0kgy\0khb\0khf\0khg\0khn\0" - "kht\0khv\0khw\0kif\0kim\0kip\0kjg\0kjh\0kjl\0kjo\0kjp\0kjt\0kk\0" - "kk_AF\0kk_CN\0kk_IR\0kk_MN\0kkf\0kkh\0kkt\0kle\0klj\0klr\0km\0" - "kmj\0kmz\0kn\0ko\0koi\0kok\0kpt\0kpy\0kqd\0kqy\0kra\0krc\0krk\0" - "krr\0kru\0krv\0ks\0ksu\0ksw\0ksz\0ktb\0ktl\0ktp\0ku_LB\0kuf\0" - "kum\0kv\0kva\0kvq\0kvt\0kvx\0kvy\0kxf\0kxk\0kxm\0kxp\0ky\0ky_CN\0" - "kyu\0kyv\0kyw\0lab\0lad\0lae\0lah\0lbc\0lbe\0lbf\0lbj\0lbm\0lbo\0" - "lbr\0lcp\0lep\0lez\0lhm\0lhs\0lif\0lis\0lkh\0lki\0lmh\0lmn\0lo\0" - "loy\0lpo\0lrc\0lrk\0lrl\0lsa\0lsd\0lss\0luk\0luu\0luv\0luz\0lwl\0" - "lwm\0lya\0lzh\0mag\0mai\0man_GN\0mby\0mde\0mdf\0mdx\0mdy\0mfa\0" - "mfi\0mgp\0mhj\0mid\0mjl\0mjq\0mjr\0mjt\0mju\0mjv\0mjz\0mk\0mkb\0" - "mke\0mki\0mkm\0ml\0mlf\0mn\0mn_CN\0mni\0mnj\0mns\0mnw\0mpz\0mr\0" - "mra\0mrd\0mrj\0mro\0mrr\0ms_CC\0mtm\0mtr\0mud\0muk\0mut\0muv\0" - "muz\0mvf\0mvy\0mvz\0mwr\0mwt\0mww\0my\0mym\0myv\0myz\0mzn\0nan\0" - "nao\0ncd\0ncq\0ndf\0ne\0neg\0neh\0nei\0new\0ngt\0nio\0nit\0niv\0" - "nli\0nlm\0nlx\0nmm\0nnp\0nod\0noe\0nog\0noi\0non\0nos\0npb\0nqo\0" - "nsd\0nsf\0nsk\0nst\0nsv\0nty\0ntz\0nwc\0nwx\0nyl\0nyq\0oaa\0oac\0" - "oar\0oav\0obm\0obr\0odk\0oht\0oj\0ojs\0okm\0oko\0okz\0ola\0ole\0" - "omk\0omp\0omr\0oon\0or\0ort\0oru\0orv\0os\0osa\0osc\0osi\0ota\0" - "otb\0otk\0oty\0pa\0pa_PK\0pal\0paq\0pbt\0pcb\0pce\0pcf\0pcg\0" - "pch\0pci\0pcj\0peg\0peo\0pgd\0pgg\0pgl\0pgn\0phd\0phk\0phl\0phn\0" - "pho\0phr\0pht\0phv\0phw\0pi\0pka\0pkr\0plk\0pll\0pmh\0pnt\0pra\0" - "prc\0prd\0prp\0prt\0prx\0ps\0psh\0psi\0pst\0pum\0pwo\0pwr\0pww\0" - "pyx\0qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0" - "rjs\0rka\0rki\0rkt\0rmi\0rmt\0rmz\0rom_BG\0rsk\0rtw\0ru\0rue\0" - "rut\0rwr\0ryu\0sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scl_IN\0" - "scp\0sct\0scu\0scx\0sd\0sd_IN\0sdb\0sdf\0sdg\0sdh\0sds\0sel\0" - "sfm\0sga\0sgh\0sgj\0sgr\0sgt\0sgw\0sgy\0shd\0shi\0shm\0shn\0shu\0" - "shv\0si\0sia\0sip\0siy\0siz\0sjd\0sjp\0sjt\0skb\0skj\0skr\0slq\0" - "smh\0smp\0smu\0smy\0soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0" - "sr\0srb\0srh\0srx\0srz\0ssh\0sss\0sts\0stv\0sty\0suz\0sva\0swb\0" - "swi\0swv\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0tcn\0tco\0" + "aaf\0aao\0aat\0ab\0abh\0abl\0abq\0abv\0acm\0acq\0acw\0acx\0adf\0" + "adx\0ady\0ae\0aeb\0aec\0aee\0aeq\0afb\0agi\0agj\0agx\0ahg\0aho\0" + "ahr\0aib\0aii\0aij\0ain\0aio\0aiq\0akk\0akv\0alk\0all\0alr\0alt\0" + "alw\0am\0ams\0amw\0ani\0anp\0anq\0anr\0anu\0aot\0apc\0apd\0aph\0" + "aqc\0ar\0arc\0arq\0ars\0ary\0arz\0as\0ase\0ask\0asr\0atn\0atv\0" + "auj\0auz\0av\0avd\0avl\0awa\0awn\0axm\0ayh\0ayl\0ayn\0ayp\0az_IQ\0" + "az_IR\0az_RU\0azb\0ba\0bal\0bap\0bax\0bbl\0bcq\0bdv\0bdz\0be\0" + "bee\0bej\0bfb\0bfq\0bft\0bfu\0bfw\0bfy\0bfz\0bg\0bgc\0bgd\0bgn\0" + "bgp\0bgq\0bgw\0bgx\0bha\0bhb\0bhd\0bhe\0bhh\0bhi\0bhj\0bhm\0bhn\0" + "bho\0bht\0bhu\0bix\0biy\0bjf\0bjj\0bjm\0bkk\0blk\0blt\0bmj\0bn\0" + "bns\0bo\0bph\0bpx\0bpy\0bqi\0bra\0brb\0brd\0brh\0brk\0bro\0brv\0" + "brw\0brx\0bsh\0bsk\0bst\0btd\0btm\0btv\0bua\0bwe\0bxm\0bxu\0byh\0" + "byn\0byw\0bzi\0cbn\0ccp\0cde\0cdh\0cdi\0cdj\0cdm\0cdn\0cdo\0cdz\0" + "ce\0cgk\0chg\0chm\0chr\0chx\0cih\0cja\0cji\0cjm\0cjy\0ckb\0ckt\0" + "clh\0clw\0cmg\0cna\0cnp\0cog\0cop\0cpg\0cr\0crh\0crj\0crk\0crl\0" + "crm\0csh\0csp\0csw\0ctd\0ctg\0ctn\0ctt\0cty\0cu\0cuu\0cv\0czh\0" + "czk\0daq\0dar\0dcc\0ddo\0def\0deh\0der\0dgl\0dhi\0dhn\0dho\0dhw\0" + "dka\0dlg\0dmf\0dmk\0dml\0dng\0dnu\0dnv\0doi\0dox\0dre\0drq\0drs\0" + "dry\0dso\0dty\0dub\0duh\0dus\0dv\0dwk\0dwz\0dz\0dzl\0ecr\0ecy\0" + "egy\0eky\0el\0emg\0emu\0enf\0enh\0era\0esg\0esh\0ett\0eve\0evn\0" + "fa\0fay\0faz\0fia\0fmu\0fub\0gan\0gaq\0gas\0gau\0gbj\0gbk\0gbl\0" + "gbm\0gbz\0gdb\0gdo\0gdx\0gez\0ggg\0gha\0ghe\0gho\0ghr\0ght\0gig\0" + "gin\0gjk\0gju\0gld\0glh\0glk\0gml\0gmv\0gmy\0goe\0gof\0goj\0gok\0" + "gon\0got\0gra\0grc\0grr\0grt\0gru\0gu\0gvr\0gwc\0gwf\0gwt\0gyo\0" + "gzi\0ha_CM\0ha_SD\0hac\0hak\0hak_TW\0har\0haz\0hbo\0hdy\0he\0" + "hi\0hif\0hii\0hit\0hkh\0hlb\0hlu\0hmd\0hmj\0hmq\0hnd\0hne\0hnj\0" + "hnm\0hno\0hoc\0hoh\0hoj\0how\0hoy\0hpo\0hrt\0hrz\0hsn\0hss\0htx\0" + "hut\0huy\0huz\0hy\0hyw\0ii\0imy\0inh\0int\0ior\0iru\0isk\0itk\0" + "itl\0iu\0iw\0ja\0jad\0jat\0jbe\0jbn\0jct\0jda\0jdg\0jdt\0jee\0" + "jge\0ji\0jje\0jkm\0jml\0jna\0jnd\0jnl\0jns\0jog\0jpa\0jpr\0jrb\0" + "jul\0jun\0juy\0jya\0jye\0ka\0kaa\0kap\0kaw\0kbd\0kbg\0kbu\0kby\0" + "kca\0kcy\0kdq\0kdt\0ket\0kev\0kex\0key\0kfa\0kfb\0kfc\0kfd\0kfe\0" + "kfg\0kfh\0kfi\0kfk\0kfm\0kfp\0kfq\0kfr\0kfs\0kfu\0kfx\0kfy\0kgj\0" + "kgy\0khb\0khf\0khg\0khn\0kho\0kht\0khv\0khw\0kif\0kim\0kip\0kjg\0" + "kjh\0kjl\0kjo\0kjp\0kjt\0kjz\0kk\0kk_AF\0kk_CN\0kk_IR\0kk_MN\0" + "kkf\0kkh\0kkt\0kle\0klj\0klr\0km\0kmj\0kmz\0kn\0knn\0ko\0koi\0" + "kok\0kpt\0kpy\0kqd\0kqy\0kra\0krc\0krk\0krr\0kru\0krv\0ks\0ksu\0" + "ksw\0ksz\0ktb\0kte\0ktl\0ktp\0ku_AM\0ku_AZ\0ku_GE\0ku_IQ\0ku_IR\0" + "ku_LB\0ku_TM\0kuf\0kum\0kv\0kva\0kvq\0kvt\0kvx\0kvy\0kwx\0kxf\0" + "kxk\0kxm\0kxp\0ky\0ky_CN\0kyu\0kyv\0kyw\0lab\0lad\0lae\0lah\0" + "lbe\0lbf\0lbj\0lbm\0lbo\0lbr\0lcp\0lep\0lez\0lhm\0lhs\0lif\0lis\0" + "lkh\0lki\0lmh\0lmn\0lo\0loy\0lpo\0lrc\0lrk\0lrl\0lsa\0lsd\0lss\0" + "ltc\0luh\0luk\0luu\0luv\0luz\0lwl\0lwm\0lya\0lzh\0lzz_GE\0mag\0" + "mai\0mby\0mde\0mdf\0mdx\0mdy\0mey\0mfa\0mfi\0mga\0mgp\0mhj\0mid\0" + "mjl\0mjq\0mjr\0mjt\0mju\0mjv\0mjz\0mk\0mkb\0mke\0mki\0mkm\0ml\0" + "mlf\0mn\0mn_CN\0mnc\0mni\0mnj\0mns\0mnw\0mpz\0mr\0mra\0mrd\0mrj\0" + "mro\0mrr\0ms_CC\0mtm\0mtr\0mud\0muk\0mut\0muv\0muz\0mve\0mvf\0" + "mvy\0mvz\0mwr\0mwt\0mww\0my\0mym\0myv\0myz\0mzb\0mzn\0nan\0nan_MO\0" + "nan_TW\0nao\0ncd\0ncq\0ndf\0ne\0neg\0neh\0nei\0new\0ngt\0nio\0" + "nit\0niv\0nli\0nlm\0nlx\0nmm\0nnp\0nod\0noe\0nog\0noi\0non\0nos\0" + "npb\0nqo\0nrn\0nsd\0nsf\0nsk\0nst\0nsv\0nty\0ntz\0nwc\0nwx\0nyl\0" + "nyq\0nyw\0oaa\0oac\0oar\0oav\0obm\0obr\0odk\0oht\0oj\0ojs\0okm\0" + "oko\0okz\0ola\0ole\0omk\0omp\0omr\0omx\0oon\0or\0ort\0oru\0orv\0" + "os\0osa\0osc\0osi\0ota\0otb\0otk\0oty\0oui\0oyb\0pa\0pa_PK\0pal\0" + "paq\0pbt\0pcb\0pce\0pcf\0pcg\0pch\0pci\0pcj\0peg\0peo\0pgd\0pgg\0" + "pgl\0pgn\0phd\0phk\0phl\0phn\0pho\0phr\0pht\0phu\0phv\0phw\0pi_IN\0" + "pi_LK\0pi_MM\0pi_TH\0pka\0pkr\0plk\0pll\0pmh\0pnt\0pnt_RU\0prc\0" + "prd\0prt\0prx\0ps\0psh\0psi\0pst\0psu\0pum\0pwo\0pwr\0pww\0pyx\0" + "qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0rjs\0" + "rka\0rki\0rkt\0rmi\0rmt\0rmz\0rsk\0rtw\0ru\0rue\0rut\0rwr\0ryu\0" + "sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scp\0sct\0scu\0scx\0" + "sd\0sd_IN\0sdb\0sdf\0sdg\0sdh\0sdr\0sds\0sel\0sfm\0sgh\0sgj\0" + "sgr\0sgt\0sgw\0sgy\0shd\0shi\0shm\0shn\0shu\0shv\0si\0sia\0sip\0" + "siy\0siz\0sjc\0sjd\0sjp\0sjt\0skb\0skj\0skr\0smh\0smp\0smu\0smy\0" + "soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0sr\0srb\0srh\0srx\0" + "srz\0ssh\0sss\0sts\0stu\0stu_CN\0stv\0sty\0suz\0sva\0swb\0swi\0" + "swv\0sxu\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0tcn\0tco\0" "tcx\0tcy\0tda\0tdb\0tdd\0tdg\0tdh\0te\0tes\0tg\0tg_PK\0tge\0tgf\0" "th\0the\0thf\0thi\0thl\0thm\0thq\0thr\0ths\0ti\0tig\0tij\0tin\0" - "tjl\0tjo\0tkb\0tks\0tkt\0tmk\0tmr\0tnv\0tov\0tpu\0tra\0trg\0trm\0" - "trw\0tsd\0tsj\0tt\0tth\0tto\0tts\0tvn\0twm\0txg\0txo\0tyr\0tyv\0" + "tjl\0tjo\0tkb\0tks\0tkt\0tmr\0tnv\0tov\0tpu\0tra\0trg\0trm\0trw\0" + "tsd\0tsj\0tt\0tth\0tto\0tts\0ttz\0tvn\0twm\0txg\0txo\0tyr\0tyv\0" "ude\0udg\0udi\0udm\0ug\0ug_KZ\0ug_MN\0uga\0ugh\0ugo\0uk\0uki\0" "ulc\0unr\0unr_NP\0unx\0ur\0urk\0ush\0uum\0uz_AF\0uz_CN\0uzs\0" - "vaa\0vaf\0vah\0vai\0vas\0vav\0vay\0vgr\0vmd\0vmh\0wal\0wbk\0wbq\0" - "wbr\0wlo\0wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xal\0xan\0xas\0xco\0" - "xcr\0xdq\0xhe\0xhm\0xis\0xka\0xkc\0xkj\0xkp\0xlc\0xld\0xly\0xmf\0" - "xmn\0xmr\0xna\0xnr\0xpg\0xpi\0xpm\0xpr\0xrm\0xrn\0xsa\0xsr\0xss\0" - "xub\0xuj\0xve\0xvi\0xwo\0xzh\0yai\0ybh\0ybi\0ydg\0yea\0yej\0yeu\0" - "ygp\0yhd\0yi\0yig\0yih\0yiv\0ykg\0yna\0ynk\0yoi\0yoy\0yrk\0ysd\0" - "ysn\0ysp\0ysr\0ysy\0yud\0yue\0yue_CN\0yug\0yux\0ywq\0ywu\0zau\0" - "zba\0zch\0zdj\0zeh\0zen\0zgb\0zgh\0zgm\0zgn\0zh\0zh_AU\0zh_BN\0" - "zh_GB\0zh_GF\0zh_HK\0zh_ID\0zh_MO\0zh_PA\0zh_PF\0zh_PH\0zh_SR\0" - "zh_TH\0zh_TW\0zh_US\0zh_VN\0zhd\0zhx\0zkb\0zko\0zkt\0zkz\0zlj\0" - "zln\0zlq\0zqe\0zrp\0zum\0zyg\0zyn\0zzj\0"; + "vaa\0vaf\0vah\0vai\0vas\0vav\0vay\0vgr\0vjk\0vmd\0vmh\0wal\0wbk\0" + "wbq\0wbr\0wle\0wlo\0wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xag\0xal\0" + "xan\0xas\0xco\0xcr\0xdq\0xhe\0xhm\0xis\0xka\0xkc\0xkf\0xkj\0xkp\0" + "xlc\0xld\0xly\0xmf\0xmn\0xmr\0xna\0xnr\0xpg\0xpi\0xpm\0xpr\0xrm\0" + "xrn\0xsa\0xsd\0xsr\0xtq\0xub\0xuj\0xve\0xvi\0xwo\0xzh\0yai\0ybh\0" + "ybi\0ydg\0yea\0yej\0yeu\0ygp\0yhd\0yi\0yig\0yih\0yiv\0ykg\0ykh\0" + "yna\0ynk\0yoi\0yoy\0yrk\0ysd\0ysn\0ysp\0ysr\0ysy\0yud\0yue\0yue_CN\0" + "yug\0yux\0ywq\0ywu\0zau\0zba\0zch\0zdj\0zeh\0zen\0zgb\0zgh\0zgm\0" + "zgn\0zh\0zh_AU\0zh_BN\0zh_GB\0zh_GF\0zh_HK\0zh_ID\0zh_MO\0zh_PA\0" + "zh_PF\0zh_PH\0zh_SR\0zh_TH\0zh_TW\0zh_US\0zh_VN\0zhd\0zko\0zkt\0" + "zkz\0zlj\0zln\0zlq\0zqe\0zrg\0zrp\0zum\0zwa\0zyg\0zyn\0zzj\0"; const int32_t defaultScriptTable[] = { - 0, 320, // aaf -> Mlym + 0, 325, // aaf -> Mlym 4, 10, // aao -> Arab 8, 150, // aat -> Grek 12, 100, // ab -> Cyrl 15, 10, // abh -> Arab - 19, 420, // abl -> Rjng - 23, 10, // abv -> Arab - 27, 10, // acm -> Arab - 31, 10, // acq -> Arab - 35, 10, // acw -> Arab - 39, 10, // acx -> Arab - 43, 10, // adf -> Arab - 47, 535, // adx -> Tibt - 51, 100, // ady -> Cyrl - 55, 25, // ae -> Avst - 58, 10, // aeb -> Arab - 62, 10, // aec -> Arab - 66, 10, // aee -> Arab - 70, 10, // aeq -> Arab - 74, 10, // afb -> Arab - 78, 105, // agi -> Deva - 82, 120, // agj -> Ethi - 86, 100, // agx -> Cyrl - 90, 120, // ahg -> Ethi - 94, 5, // aho -> Ahom - 98, 105, // ahr -> Deva - 102, 10, // aib -> Arab - 106, 185, // aij -> Hebr - 110, 220, // ain -> Kana - 114, 345, // aio -> Mymr - 118, 10, // aiq -> Arab - 122, 10, // ajp -> Arab - 126, 570, // akk -> Xsux - 130, 100, // akv -> Cyrl - 134, 260, // alk -> Laoo - 138, 320, // all -> Mlym - 142, 100, // alr -> Cyrl - 146, 100, // alt -> Cyrl - 150, 120, // alw -> Ethi - 154, 120, // am -> Ethi - 157, 210, // ams -> Jpan - 161, 475, // amw -> Syrc - 165, 100, // ani -> Cyrl - 169, 105, // anp -> Deva - 173, 105, // anr -> Deva - 177, 120, // anu -> Ethi - 181, 45, // aot -> Beng - 185, 10, // apc -> Arab - 189, 10, // apd -> Arab - 193, 105, // aph -> Deva - 197, 100, // aqc -> Cyrl - 201, 10, // ar -> Arab - 204, 15, // arc -> Armi - 208, 10, // arq -> Arab - 212, 10, // ars -> Arab - 216, 10, // ary -> Arab - 220, 10, // arz -> Arab - 224, 45, // as -> Beng - 227, 450, // ase -> Sgnw - 231, 10, // ask -> Arab - 235, 10, // atn -> Arab - 239, 100, // atv -> Cyrl - 243, 10, // auj -> Arab - 247, 10, // auz -> Arab - 251, 100, // av -> Cyrl - 254, 10, // avd -> Arab - 258, 10, // avl -> Arab - 262, 105, // awa -> Deva - 266, 120, // awn -> Ethi - 270, 20, // axm -> Armn - 274, 10, // ayh -> Arab - 278, 10, // ayl -> Arab - 282, 10, // ayn -> Arab - 286, 10, // ayp -> Arab - 290, 10, // az_IQ -> Arab - 296, 10, // az_IR -> Arab - 302, 100, // az_RU -> Cyrl - 308, 10, // azb -> Arab - 312, 100, // ba -> Cyrl - 315, 10, // bal -> Arab - 319, 105, // bap -> Deva - 323, 30, // bax -> Bamu - 327, 125, // bbl -> Geor - 331, 120, // bcq -> Ethi - 335, 385, // bdv -> Orya - 339, 10, // bdz -> Arab - 343, 100, // be -> Cyrl - 346, 105, // bee -> Deva - 350, 10, // bej -> Arab - 354, 105, // bfb -> Deva - 358, 500, // bfq -> Taml - 362, 10, // bft -> Arab - 366, 535, // bfu -> Tibt - 370, 385, // bfw -> Orya - 374, 105, // bfy -> Deva - 378, 105, // bfz -> Deva - 382, 100, // bg -> Cyrl - 385, 105, // bgc -> Deva - 389, 105, // bgd -> Deva - 393, 10, // bgn -> Arab - 397, 10, // bgp -> Arab - 401, 105, // bgq -> Deva - 405, 105, // bgw -> Deva - 409, 150, // bgx -> Grek - 413, 105, // bha -> Deva - 417, 105, // bhb -> Deva - 421, 105, // bhd -> Deva - 425, 10, // bhe -> Arab - 429, 100, // bhh -> Cyrl - 433, 105, // bhi -> Deva - 437, 105, // bhj -> Deva - 441, 10, // bhm -> Arab - 445, 475, // bhn -> Syrc - 449, 105, // bho -> Deva - 453, 485, // bht -> Takr - 457, 105, // bhu -> Deva - 461, 105, // biy -> Deva - 465, 475, // bjf -> Syrc - 469, 105, // bjj -> Deva - 473, 10, // bjm -> Arab - 477, 345, // blk -> Mymr - 481, 510, // blt -> Tavt - 485, 105, // bmj -> Deva - 489, 45, // bn -> Beng - 492, 105, // bns -> Deva - 496, 535, // bo -> Tibt - 499, 100, // bph -> Cyrl - 503, 105, // bpx -> Deva - 507, 45, // bpy -> Beng - 511, 10, // bqi -> Arab - 515, 105, // bra -> Deva - 519, 235, // brb -> Khmr - 523, 105, // brd -> Deva - 527, 10, // brh -> Arab - 531, 10, // brk -> Arab - 535, 260, // brv -> Laoo - 539, 105, // brx -> Deva - 543, 10, // bsh -> Arab - 547, 10, // bsk -> Arab - 551, 35, // bsq -> Bass - 555, 120, // bst -> Ethi - 559, 40, // btd -> Batk - 563, 40, // btm -> Batk - 567, 105, // btv -> Deva - 571, 100, // bua -> Cyrl - 575, 345, // bwe -> Mymr - 579, 100, // bxm -> Cyrl - 583, 330, // bxu -> Mong - 587, 105, // byh -> Deva - 591, 120, // byn -> Ethi - 595, 105, // byw -> Deva - 599, 530, // bzi -> Thai - 603, 530, // cbn -> Thai - 607, 60, // ccp -> Cakm - 611, 515, // cde -> Telu - 615, 105, // cdh -> Deva - 619, 155, // cdi -> Gujr - 623, 105, // cdj -> Deva - 627, 105, // cdm -> Deva - 631, 175, // cdo -> Hans - 635, 45, // cdz -> Beng - 639, 100, // ce -> Cyrl - 642, 535, // cgk -> Tibt - 646, 10, // chg -> Arab - 650, 100, // chm -> Cyrl - 654, 80, // chr -> Cher - 658, 105, // chx -> Deva - 662, 105, // cih -> Deva - 666, 10, // cja -> Arab - 670, 100, // cji -> Cyrl - 674, 75, // cjm -> Cham - 678, 175, // cjy -> Hans - 682, 10, // ckb -> Arab - 686, 100, // ckt -> Cyrl - 690, 10, // clh -> Arab - 694, 100, // clw -> Cyrl - 698, 470, // cmg -> Soyo - 702, 535, // cna -> Tibt - 706, 175, // cnp -> Hans - 710, 530, // cog -> Thai - 714, 90, // cop -> Copt - 718, 150, // cpg -> Grek - 722, 65, // cr -> Cans - 725, 100, // crh -> Cyrl - 729, 65, // crj -> Cans - 733, 65, // crk -> Cans - 737, 65, // crl -> Cans - 741, 65, // crm -> Cans - 745, 345, // csh -> Mymr - 749, 175, // csp -> Hans - 753, 65, // csw -> Cans - 757, 395, // ctd -> Pauc - 761, 45, // ctg -> Beng - 765, 105, // ctn -> Deva - 769, 500, // ctt -> Taml - 773, 100, // cu -> Cyrl - 776, 255, // cuu -> Lana - 780, 100, // cv -> Cyrl - 783, 175, // czh -> Hans - 787, 185, // czk -> Hebr - 791, 105, // daq -> Deva - 795, 100, // dar -> Cyrl - 799, 10, // dcc -> Arab - 803, 100, // ddo -> Cyrl - 807, 10, // def -> Arab - 811, 10, // deh -> Arab - 815, 45, // der -> Beng - 819, 105, // dhi -> Deva - 823, 155, // dhn -> Gujr - 827, 105, // dho -> Deva - 831, 105, // dhw -> Deva - 835, 535, // dka -> Tibt - 839, 100, // dlg -> Cyrl - 843, 310, // dmf -> Medf - 847, 10, // dmk -> Arab - 851, 10, // dml -> Arab - 855, 100, // dng -> Cyrl - 859, 345, // dnu -> Mymr - 863, 345, // dnv -> Mymr - 867, 105, // doi -> Deva - 871, 120, // dox -> Ethi - 875, 535, // dre -> Tibt - 879, 105, // drq -> Deva - 883, 120, // drs -> Ethi - 887, 105, // dry -> Deva - 891, 385, // dso -> Orya - 895, 105, // dty -> Deva - 899, 155, // dub -> Gujr - 903, 105, // duh -> Deva - 907, 105, // dus -> Deva - 911, 525, // dv -> Thaa - 914, 385, // dwk -> Orya - 918, 105, // dwz -> Deva - 922, 535, // dz -> Tibt - 925, 535, // dzl -> Tibt - 929, 150, // ecr -> Grek - 933, 95, // ecy -> Cprt - 937, 110, // egy -> Egyp - 941, 215, // eky -> Kali - 945, 150, // el -> Grek - 948, 105, // emg -> Deva - 952, 105, // emu -> Deva - 956, 100, // enf -> Cyrl - 960, 100, // enh -> Cyrl - 964, 500, // era -> Taml - 968, 135, // esg -> Gonm - 972, 10, // esh -> Arab - 976, 200, // ett -> Ital - 980, 100, // eve -> Cyrl - 984, 100, // evn -> Cyrl - 988, 10, // fa -> Arab - 991, 10, // fay -> Arab - 995, 10, // faz -> Arab - 999, 10, // fia -> Arab - 1003, 105, // fmu -> Deva - 1007, 10, // fub -> Arab - 1011, 175, // gan -> Hans - 1015, 385, // gaq -> Orya - 1019, 155, // gas -> Gujr - 1023, 515, // gau -> Telu - 1027, 385, // gbj -> Orya - 1031, 105, // gbk -> Deva - 1035, 155, // gbl -> Gujr - 1039, 105, // gbm -> Deva - 1043, 10, // gbz -> Arab - 1047, 385, // gdb -> Orya - 1051, 100, // gdo -> Cyrl - 1055, 105, // gdx -> Deva - 1059, 120, // gez -> Ethi - 1063, 10, // ggg -> Arab - 1067, 10, // gha -> Arab - 1071, 105, // ghe -> Deva - 1075, 10, // ghr -> Arab - 1079, 535, // ght -> Tibt - 1083, 10, // gig -> Arab - 1087, 100, // gin -> Cyrl - 1091, 10, // gjk -> Arab - 1095, 10, // gju -> Arab - 1099, 100, // gld -> Cyrl - 1103, 10, // glh -> Arab - 1107, 10, // glk -> Arab - 1111, 120, // gmv -> Ethi - 1115, 275, // gmy -> Linb - 1119, 535, // goe -> Tibt - 1123, 120, // gof -> Ethi - 1127, 105, // gok -> Deva - 1131, 105, // gom -> Deva - 1135, 515, // gon -> Telu - 1139, 140, // got -> Goth - 1143, 105, // gra -> Deva - 1147, 95, // grc -> Cprt - 1151, 45, // grt -> Beng - 1155, 120, // gru -> Ethi - 1159, 155, // gu -> Gujr - 1162, 105, // gvr -> Deva - 1166, 10, // gwc -> Arab - 1170, 10, // gwf -> Arab - 1174, 10, // gwt -> Arab - 1178, 105, // gyo -> Deva - 1182, 10, // gzi -> Arab - 1186, 10, // ha_CM -> Arab - 1192, 10, // ha_SD -> Arab - 1198, 10, // hac -> Arab - 1202, 175, // hak -> Hans - 1206, 120, // har -> Ethi - 1210, 10, // haz -> Arab - 1214, 185, // hbo -> Hebr - 1218, 120, // hdy -> Ethi - 1222, 185, // he -> Hebr - 1225, 105, // hi -> Deva - 1228, 485, // hii -> Takr - 1232, 570, // hit -> Xsux - 1236, 10, // hkh -> Arab - 1240, 105, // hlb -> Deva - 1244, 190, // hlu -> Hluw - 1248, 410, // hmd -> Plrd - 1252, 50, // hmj -> Bopo - 1256, 50, // hmq -> Bopo - 1260, 10, // hnd -> Arab - 1264, 105, // hne -> Deva - 1268, 195, // hnj -> Hmnp - 1272, 260, // hnj_AU -> Laoo - 1279, 260, // hnj_CN -> Laoo - 1286, 260, // hnj_FR -> Laoo - 1293, 260, // hnj_GF -> Laoo - 1300, 260, // hnj_LA -> Laoo - 1307, 260, // hnj_MM -> Laoo - 1314, 260, // hnj_SR -> Laoo - 1321, 260, // hnj_TH -> Laoo - 1328, 260, // hnj_VN -> Laoo + 19, 425, // abl -> Rjng + 23, 100, // abq -> Cyrl + 27, 10, // abv -> Arab + 31, 10, // acm -> Arab + 35, 10, // acq -> Arab + 39, 10, // acw -> Arab + 43, 10, // acx -> Arab + 47, 10, // adf -> Arab + 51, 545, // adx -> Tibt + 55, 100, // ady -> Cyrl + 59, 25, // ae -> Avst + 62, 10, // aeb -> Arab + 66, 10, // aec -> Arab + 70, 10, // aee -> Arab + 74, 10, // aeq -> Arab + 78, 10, // afb -> Arab + 82, 105, // agi -> Deva + 86, 120, // agj -> Ethi + 90, 100, // agx -> Cyrl + 94, 120, // ahg -> Ethi + 98, 5, // aho -> Ahom + 102, 105, // ahr -> Deva + 106, 10, // aib -> Arab + 110, 485, // aii -> Syrc + 114, 185, // aij -> Hebr + 118, 220, // ain -> Kana + 122, 350, // aio -> Mymr + 126, 10, // aiq -> Arab + 130, 580, // akk -> Xsux + 134, 100, // akv -> Cyrl + 138, 255, // alk -> Laoo + 142, 325, // all -> Mlym + 146, 100, // alr -> Cyrl + 150, 100, // alt -> Cyrl + 154, 120, // alw -> Ethi + 158, 120, // am -> Ethi + 161, 210, // ams -> Jpan + 165, 485, // amw -> Syrc + 169, 100, // ani -> Cyrl + 173, 105, // anp -> Deva + 177, 105, // anq -> Deva + 181, 105, // anr -> Deva + 185, 120, // anu -> Ethi + 189, 45, // aot -> Beng + 193, 10, // apc -> Arab + 197, 10, // apd -> Arab + 201, 105, // aph -> Deva + 205, 100, // aqc -> Cyrl + 209, 10, // ar -> Arab + 212, 15, // arc -> Armi + 216, 10, // arq -> Arab + 220, 10, // ars -> Arab + 224, 10, // ary -> Arab + 228, 10, // arz -> Arab + 232, 45, // as -> Beng + 235, 455, // ase -> Sgnw + 239, 10, // ask -> Arab + 243, 105, // asr -> Deva + 247, 10, // atn -> Arab + 251, 100, // atv -> Cyrl + 255, 10, // auj -> Arab + 259, 10, // auz -> Arab + 263, 100, // av -> Cyrl + 266, 10, // avd -> Arab + 270, 10, // avl -> Arab + 274, 105, // awa -> Deva + 278, 120, // awn -> Ethi + 282, 20, // axm -> Armn + 286, 10, // ayh -> Arab + 290, 10, // ayl -> Arab + 294, 10, // ayn -> Arab + 298, 10, // ayp -> Arab + 302, 10, // az_IQ -> Arab + 308, 10, // az_IR -> Arab + 314, 100, // az_RU -> Cyrl + 320, 10, // azb -> Arab + 324, 100, // ba -> Cyrl + 327, 10, // bal -> Arab + 331, 105, // bap -> Deva + 335, 35, // bax -> Bamu + 339, 125, // bbl -> Geor + 343, 120, // bcq -> Ethi + 347, 385, // bdv -> Orya + 351, 10, // bdz -> Arab + 355, 100, // be -> Cyrl + 358, 105, // bee -> Deva + 362, 10, // bej -> Arab + 366, 105, // bfb -> Deva + 370, 510, // bfq -> Taml + 374, 10, // bft -> Arab + 378, 545, // bfu -> Tibt + 382, 385, // bfw -> Orya + 386, 105, // bfy -> Deva + 390, 105, // bfz -> Deva + 394, 100, // bg -> Cyrl + 397, 105, // bgc -> Deva + 401, 105, // bgd -> Deva + 405, 10, // bgn -> Arab + 409, 10, // bgp -> Arab + 413, 105, // bgq -> Deva + 417, 105, // bgw -> Deva + 421, 150, // bgx -> Grek + 425, 105, // bha -> Deva + 429, 105, // bhb -> Deva + 433, 105, // bhd -> Deva + 437, 10, // bhe -> Arab + 441, 100, // bhh -> Cyrl + 445, 105, // bhi -> Deva + 449, 105, // bhj -> Deva + 453, 10, // bhm -> Arab + 457, 485, // bhn -> Syrc + 461, 105, // bho -> Deva + 465, 105, // bht -> Deva + 469, 105, // bhu -> Deva + 473, 105, // bix -> Deva + 477, 105, // biy -> Deva + 481, 485, // bjf -> Syrc + 485, 105, // bjj -> Deva + 489, 10, // bjm -> Arab + 493, 545, // bkk -> Tibt + 497, 350, // blk -> Mymr + 501, 520, // blt -> Tavt + 505, 105, // bmj -> Deva + 509, 45, // bn -> Beng + 512, 105, // bns -> Deva + 516, 545, // bo -> Tibt + 519, 100, // bph -> Cyrl + 523, 105, // bpx -> Deva + 527, 45, // bpy -> Beng + 531, 10, // bqi -> Arab + 535, 105, // bra -> Deva + 539, 230, // brb -> Khmr + 543, 105, // brd -> Deva + 547, 10, // brh -> Arab + 551, 10, // brk -> Arab + 555, 545, // bro -> Tibt + 559, 255, // brv -> Laoo + 563, 240, // brw -> Knda + 567, 105, // brx -> Deva + 571, 10, // bsh -> Arab + 575, 10, // bsk -> Arab + 579, 120, // bst -> Ethi + 583, 40, // btd -> Batk + 587, 40, // btm -> Batk + 591, 105, // btv -> Deva + 595, 100, // bua -> Cyrl + 599, 350, // bwe -> Mymr + 603, 100, // bxm -> Cyrl + 607, 335, // bxu -> Mong + 611, 105, // byh -> Deva + 615, 120, // byn -> Ethi + 619, 105, // byw -> Deva + 623, 540, // bzi -> Thai + 627, 540, // cbn -> Thai + 631, 60, // ccp -> Cakm + 635, 525, // cde -> Telu + 639, 105, // cdh -> Deva + 643, 155, // cdi -> Gujr + 647, 105, // cdj -> Deva + 651, 105, // cdm -> Deva + 655, 105, // cdn -> Deva + 659, 175, // cdo -> Hans + 663, 45, // cdz -> Beng + 667, 100, // ce -> Cyrl + 670, 545, // cgk -> Tibt + 674, 10, // chg -> Arab + 678, 100, // chm -> Cyrl + 682, 80, // chr -> Cher + 686, 105, // chx -> Deva + 690, 105, // cih -> Deva + 694, 10, // cja -> Arab + 698, 100, // cji -> Cyrl + 702, 75, // cjm -> Cham + 706, 175, // cjy -> Hans + 710, 10, // ckb -> Arab + 714, 100, // ckt -> Cyrl + 718, 10, // clh -> Arab + 722, 100, // clw -> Cyrl + 726, 480, // cmg -> Soyo + 730, 545, // cna -> Tibt + 734, 175, // cnp -> Hans + 738, 540, // cog -> Thai + 742, 90, // cop -> Copt + 746, 150, // cpg -> Grek + 750, 65, // cr -> Cans + 753, 100, // crh -> Cyrl + 757, 65, // crj -> Cans + 761, 65, // crk -> Cans + 765, 65, // crl -> Cans + 769, 65, // crm -> Cans + 773, 350, // csh -> Mymr + 777, 175, // csp -> Hans + 781, 65, // csw -> Cans + 785, 400, // ctd -> Pauc + 789, 45, // ctg -> Beng + 793, 105, // ctn -> Deva + 797, 510, // ctt -> Taml + 801, 510, // cty -> Taml + 805, 100, // cu -> Cyrl + 808, 250, // cuu -> Lana + 812, 100, // cv -> Cyrl + 815, 175, // czh -> Hans + 819, 185, // czk -> Hebr + 823, 105, // daq -> Deva + 827, 100, // dar -> Cyrl + 831, 10, // dcc -> Arab + 835, 100, // ddo -> Cyrl + 839, 10, // def -> Arab + 843, 10, // deh -> Arab + 847, 45, // der -> Beng + 851, 10, // dgl -> Arab + 855, 105, // dhi -> Deva + 859, 155, // dhn -> Gujr + 863, 155, // dho -> Gujr + 867, 105, // dhw -> Deva + 871, 545, // dka -> Tibt + 875, 100, // dlg -> Cyrl + 879, 315, // dmf -> Medf + 883, 10, // dmk -> Arab + 887, 10, // dml -> Arab + 891, 100, // dng -> Cyrl + 895, 350, // dnu -> Mymr + 899, 350, // dnv -> Mymr + 903, 105, // doi -> Deva + 907, 120, // dox -> Ethi + 911, 545, // dre -> Tibt + 915, 105, // drq -> Deva + 919, 120, // drs -> Ethi + 923, 105, // dry -> Deva + 927, 385, // dso -> Orya + 931, 105, // dty -> Deva + 935, 155, // dub -> Gujr + 939, 105, // duh -> Deva + 943, 105, // dus -> Deva + 947, 535, // dv -> Thaa + 950, 385, // dwk -> Orya + 954, 105, // dwz -> Deva + 958, 545, // dz -> Tibt + 961, 545, // dzl -> Tibt + 965, 150, // ecr -> Grek + 969, 95, // ecy -> Cprt + 973, 110, // egy -> Egyp + 977, 215, // eky -> Kali + 981, 150, // el -> Grek + 984, 105, // emg -> Deva + 988, 105, // emu -> Deva + 992, 100, // enf -> Cyrl + 996, 100, // enh -> Cyrl + 1000, 510, // era -> Taml + 1004, 135, // esg -> Gonm + 1008, 10, // esh -> Arab + 1012, 200, // ett -> Ital + 1016, 100, // eve -> Cyrl + 1020, 100, // evn -> Cyrl + 1024, 10, // fa -> Arab + 1027, 10, // fay -> Arab + 1031, 10, // faz -> Arab + 1035, 10, // fia -> Arab + 1039, 105, // fmu -> Deva + 1043, 10, // fub -> Arab + 1047, 175, // gan -> Hans + 1051, 385, // gaq -> Orya + 1055, 155, // gas -> Gujr + 1059, 525, // gau -> Telu + 1063, 385, // gbj -> Orya + 1067, 105, // gbk -> Deva + 1071, 155, // gbl -> Gujr + 1075, 105, // gbm -> Deva + 1079, 10, // gbz -> Arab + 1083, 385, // gdb -> Orya + 1087, 100, // gdo -> Cyrl + 1091, 105, // gdx -> Deva + 1095, 120, // gez -> Ethi + 1099, 10, // ggg -> Arab + 1103, 10, // gha -> Arab + 1107, 105, // ghe -> Deva + 1111, 530, // gho -> Tfng + 1115, 10, // ghr -> Arab + 1119, 545, // ght -> Tibt + 1123, 10, // gig -> Arab + 1127, 100, // gin -> Cyrl + 1131, 10, // gjk -> Arab + 1135, 10, // gju -> Arab + 1139, 100, // gld -> Cyrl + 1143, 10, // glh -> Arab + 1147, 10, // glk -> Arab + 1151, 260, // gml -> Latf + 1155, 120, // gmv -> Ethi + 1159, 280, // gmy -> Linb + 1163, 545, // goe -> Tibt + 1167, 120, // gof -> Ethi + 1171, 105, // goj -> Deva + 1175, 105, // gok -> Deva + 1179, 105, // gon -> Deva + 1183, 140, // got -> Goth + 1187, 105, // gra -> Deva + 1191, 150, // grc -> Grek + 1195, 10, // grr -> Arab + 1199, 45, // grt -> Beng + 1203, 120, // gru -> Ethi + 1207, 155, // gu -> Gujr + 1210, 105, // gvr -> Deva + 1214, 10, // gwc -> Arab + 1218, 10, // gwf -> Arab + 1222, 10, // gwt -> Arab + 1226, 105, // gyo -> Deva + 1230, 10, // gzi -> Arab + 1234, 10, // ha_CM -> Arab + 1240, 10, // ha_SD -> Arab + 1246, 10, // hac -> Arab + 1250, 175, // hak -> Hans + 1254, 180, // hak_TW -> Hant + 1261, 120, // har -> Ethi + 1265, 10, // haz -> Arab + 1269, 185, // hbo -> Hebr + 1273, 120, // hdy -> Ethi + 1277, 185, // he -> Hebr + 1280, 105, // hi -> Deva + 1283, 105, // hif -> Deva + 1287, 495, // hii -> Takr + 1291, 580, // hit -> Xsux + 1295, 10, // hkh -> Arab + 1299, 105, // hlb -> Deva + 1303, 190, // hlu -> Hluw + 1307, 415, // hmd -> Plrd + 1311, 50, // hmj -> Bopo + 1315, 50, // hmq -> Bopo + 1319, 10, // hnd -> Arab + 1323, 105, // hne -> Deva + 1327, 195, // hnj -> Hmnp + 1331, 175, // hnm -> Hans 1335, 10, // hno -> Arab 1339, 105, // hoc -> Deva 1343, 10, // hoh -> Arab 1347, 105, // hoj -> Deva 1351, 170, // how -> Hani 1355, 105, // hoy -> Deva - 1359, 345, // hpo -> Mymr - 1363, 475, // hrt -> Syrc + 1359, 350, // hpo -> Mymr + 1363, 485, // hrt -> Syrc 1367, 10, // hrz -> Arab 1371, 175, // hsn -> Hans 1375, 10, // hss -> Arab - 1379, 570, // htx -> Xsux + 1379, 580, // htx -> Xsux 1383, 105, // hut -> Deva 1387, 185, // huy -> Hebr 1391, 100, // huz -> Cyrl 1395, 20, // hy -> Armn 1398, 20, // hyw -> Armn - 1402, 575, // ii -> Yiii - 1405, 285, // imy -> Lyci + 1402, 585, // ii -> Yiii + 1405, 290, // imy -> Lyci 1409, 100, // inh -> Cyrl - 1413, 345, // int -> Mymr + 1413, 350, // int -> Mymr 1417, 120, // ior -> Ethi - 1421, 500, // iru -> Taml + 1421, 510, // iru -> Taml 1425, 10, // isk -> Arab 1429, 185, // itk -> Hebr 1433, 100, // itl -> Cyrl @@ -471,16 +480,16 @@ const int32_t defaultScriptTable[] = { 1454, 185, // jbe -> Hebr 1458, 10, // jbn -> Arab 1462, 100, // jct -> Cyrl - 1466, 535, // jda -> Tibt + 1466, 545, // jda -> Tibt 1470, 10, // jdg -> Arab 1474, 100, // jdt -> Cyrl 1478, 105, // jee -> Deva 1482, 125, // jge -> Geor 1486, 185, // ji -> Hebr 1489, 165, // jje -> Hang - 1493, 345, // jkm -> Mymr + 1493, 350, // jkm -> Mymr 1497, 105, // jml -> Deva - 1501, 485, // jna -> Takr + 1501, 495, // jna -> Takr 1505, 10, // jnd -> Arab 1509, 105, // jnl -> Deva 1513, 105, // jns -> Deva @@ -488,646 +497,685 @@ const int32_t defaultScriptTable[] = { 1521, 185, // jpa -> Hebr 1525, 185, // jpr -> Hebr 1529, 185, // jrb -> Hebr - 1533, 10, // jrb_MA -> Arab - 1540, 105, // jul -> Deva - 1544, 385, // jun -> Orya - 1548, 385, // juy -> Orya - 1552, 535, // jya -> Tibt - 1556, 185, // jye -> Hebr - 1560, 125, // ka -> Geor - 1563, 100, // kaa -> Cyrl - 1567, 100, // kap -> Cyrl - 1571, 225, // kaw -> Kawi - 1575, 100, // kbd -> Cyrl - 1579, 10, // kbu -> Arab - 1583, 10, // kby -> Arab - 1587, 100, // kca -> Cyrl - 1591, 45, // kdq -> Beng - 1595, 530, // kdt -> Thai - 1599, 100, // ket -> Cyrl - 1603, 105, // kex -> Deva - 1607, 515, // key -> Telu - 1611, 245, // kfa -> Knda - 1615, 105, // kfb -> Deva - 1619, 515, // kfc -> Telu - 1623, 245, // kfd -> Knda - 1627, 500, // kfe -> Taml - 1631, 320, // kfh -> Mlym - 1635, 500, // kfi -> Taml - 1639, 105, // kfk -> Deva - 1643, 10, // kfm -> Arab - 1647, 105, // kfp -> Deva - 1651, 105, // kfq -> Deva - 1655, 105, // kfr -> Deva - 1659, 105, // kfs -> Deva - 1663, 105, // kfx -> Deva - 1667, 105, // kfy -> Deva - 1671, 105, // kgj -> Deva - 1675, 105, // kgy -> Deva - 1679, 495, // khb -> Talu - 1683, 530, // khf -> Thai - 1687, 535, // khg -> Tibt - 1691, 105, // khn -> Deva - 1695, 345, // kht -> Mymr - 1699, 100, // khv -> Cyrl - 1703, 10, // khw -> Arab - 1707, 105, // kif -> Deva - 1711, 100, // kim -> Cyrl - 1715, 105, // kip -> Deva - 1719, 260, // kjg -> Laoo - 1723, 100, // kjh -> Cyrl - 1727, 105, // kjl -> Deva - 1731, 105, // kjo -> Deva - 1735, 345, // kjp -> Mymr - 1739, 530, // kjt -> Thai - 1743, 100, // kk -> Cyrl - 1746, 10, // kk_AF -> Arab - 1752, 10, // kk_CN -> Arab - 1758, 10, // kk_IR -> Arab - 1764, 10, // kk_MN -> Arab - 1770, 535, // kkf -> Tibt - 1774, 255, // kkh -> Lana - 1778, 105, // kkt -> Deva - 1782, 105, // kle -> Deva - 1786, 10, // klj -> Arab - 1790, 105, // klr -> Deva - 1794, 235, // km -> Khmr - 1797, 105, // kmj -> Deva - 1801, 10, // kmz -> Arab - 1805, 245, // kn -> Knda - 1808, 250, // ko -> Kore - 1811, 100, // koi -> Cyrl - 1815, 105, // kok -> Deva - 1819, 100, // kpt -> Cyrl - 1823, 100, // kpy -> Cyrl - 1827, 475, // kqd -> Syrc - 1831, 120, // kqy -> Ethi - 1835, 105, // kra -> Deva - 1839, 100, // krc -> Cyrl - 1843, 100, // krk -> Cyrl - 1847, 235, // krr -> Khmr - 1851, 105, // kru -> Deva - 1855, 235, // krv -> Khmr - 1859, 10, // ks -> Arab - 1862, 345, // ksu -> Mymr - 1866, 345, // ksw -> Mymr - 1870, 105, // ksz -> Deva - 1874, 120, // ktb -> Ethi - 1878, 10, // ktl -> Arab - 1882, 410, // ktp -> Plrd - 1886, 10, // ku_LB -> Arab - 1892, 260, // kuf -> Laoo - 1896, 100, // kum -> Cyrl - 1900, 100, // kv -> Cyrl - 1903, 100, // kva -> Cyrl - 1907, 345, // kvq -> Mymr - 1911, 345, // kvt -> Mymr - 1915, 10, // kvx -> Arab - 1919, 215, // kvy -> Kali - 1923, 345, // kxf -> Mymr - 1927, 345, // kxk -> Mymr - 1931, 530, // kxm -> Thai - 1935, 10, // kxp -> Arab - 1939, 100, // ky -> Cyrl - 1942, 10, // ky_CN -> Arab - 1948, 215, // kyu -> Kali - 1952, 105, // kyv -> Deva - 1956, 105, // kyw -> Deva - 1960, 270, // lab -> Lina - 1964, 185, // lad -> Hebr - 1968, 105, // lae -> Deva - 1972, 10, // lah -> Arab - 1976, 280, // lbc -> Lisu - 1980, 100, // lbe -> Cyrl - 1984, 105, // lbf -> Deva - 1988, 535, // lbj -> Tibt - 1992, 105, // lbm -> Deva - 1996, 260, // lbo -> Laoo - 2000, 105, // lbr -> Deva - 2004, 530, // lcp -> Thai - 2008, 265, // lep -> Lepc - 2012, 100, // lez -> Cyrl - 2016, 105, // lhm -> Deva - 2020, 475, // lhs -> Syrc - 2024, 105, // lif -> Deva - 2028, 280, // lis -> Lisu - 2032, 535, // lkh -> Tibt - 2036, 10, // lki -> Arab - 2040, 105, // lmh -> Deva - 2044, 515, // lmn -> Telu - 2048, 260, // lo -> Laoo - 2051, 105, // loy -> Deva - 2055, 410, // lpo -> Plrd - 2059, 10, // lrc -> Arab - 2063, 10, // lrk -> Arab - 2067, 10, // lrl -> Arab - 2071, 10, // lsa -> Arab - 2075, 185, // lsd -> Hebr - 2079, 10, // lss -> Arab - 2083, 535, // luk -> Tibt - 2087, 105, // luu -> Deva - 2091, 10, // luv -> Arab - 2095, 10, // luz -> Arab - 2099, 530, // lwl -> Thai - 2103, 530, // lwm -> Thai - 2107, 535, // lya -> Tibt - 2111, 175, // lzh -> Hans - 2115, 105, // mag -> Deva - 2119, 105, // mai -> Deva - 2123, 360, // man_GN -> Nkoo - 2130, 10, // mby -> Arab - 2134, 10, // mde -> Arab - 2138, 100, // mdf -> Cyrl - 2142, 120, // mdx -> Ethi - 2146, 120, // mdy -> Ethi - 2150, 10, // mfa -> Arab - 2154, 10, // mfi -> Arab - 2158, 105, // mgp -> Deva - 2162, 10, // mhj -> Arab - 2166, 295, // mid -> Mand - 2170, 105, // mjl -> Deva - 2174, 320, // mjq -> Mlym - 2178, 320, // mjr -> Mlym - 2182, 105, // mjt -> Deva - 2186, 515, // mju -> Telu - 2190, 320, // mjv -> Mlym - 2194, 105, // mjz -> Deva - 2198, 100, // mk -> Cyrl - 2201, 105, // mkb -> Deva - 2205, 105, // mke -> Deva - 2209, 10, // mki -> Arab - 2213, 530, // mkm -> Thai - 2217, 320, // ml -> Mlym - 2220, 530, // mlf -> Thai - 2224, 100, // mn -> Cyrl - 2227, 330, // mn_CN -> Mong - 2233, 45, // mni -> Beng - 2237, 10, // mnj -> Arab - 2241, 100, // mns -> Cyrl - 2245, 345, // mnw -> Mymr - 2249, 530, // mpz -> Thai - 2253, 105, // mr -> Deva - 2256, 530, // mra -> Thai - 2260, 105, // mrd -> Deva - 2264, 100, // mrj -> Cyrl - 2268, 335, // mro -> Mroo - 2272, 105, // mrr -> Deva - 2276, 10, // ms_CC -> Arab - 2282, 100, // mtm -> Cyrl - 2286, 105, // mtr -> Deva - 2290, 100, // mud -> Cyrl - 2294, 535, // muk -> Tibt - 2298, 105, // mut -> Deva - 2302, 500, // muv -> Taml - 2306, 120, // muz -> Ethi - 2310, 330, // mvf -> Mong - 2314, 10, // mvy -> Arab - 2318, 120, // mvz -> Ethi - 2322, 105, // mwr -> Deva - 2326, 345, // mwt -> Mymr - 2330, 195, // mww -> Hmnp - 2334, 345, // my -> Mymr - 2337, 120, // mym -> Ethi - 2341, 100, // myv -> Cyrl - 2345, 295, // myz -> Mand - 2349, 10, // mzn -> Arab - 2353, 175, // nan -> Hans - 2357, 105, // nao -> Deva - 2361, 105, // ncd -> Deva - 2365, 260, // ncq -> Laoo - 2369, 100, // ndf -> Cyrl - 2373, 105, // ne -> Deva - 2376, 100, // neg -> Cyrl - 2380, 535, // neh -> Tibt - 2384, 570, // nei -> Xsux - 2388, 105, // new -> Deva - 2392, 260, // ngt -> Laoo - 2396, 100, // nio -> Cyrl - 2400, 515, // nit -> Telu - 2404, 100, // niv -> Cyrl - 2408, 10, // nli -> Arab - 2412, 10, // nlm -> Arab - 2416, 105, // nlx -> Deva - 2420, 105, // nmm -> Deva - 2424, 560, // nnp -> Wcho - 2428, 255, // nod -> Lana - 2432, 105, // noe -> Deva - 2436, 100, // nog -> Cyrl - 2440, 105, // noi -> Deva - 2444, 430, // non -> Runr - 2448, 575, // nos -> Yiii - 2452, 535, // npb -> Tibt - 2456, 360, // nqo -> Nkoo - 2460, 575, // nsd -> Yiii - 2464, 575, // nsf -> Yiii - 2468, 65, // nsk -> Cans - 2472, 540, // nst -> Tnsa - 2476, 575, // nsv -> Yiii - 2480, 575, // nty -> Yiii - 2484, 10, // ntz -> Arab - 2488, 355, // nwc -> Newa - 2492, 105, // nwx -> Deva - 2496, 530, // nyl -> Thai - 2500, 10, // nyq -> Arab - 2504, 100, // oaa -> Cyrl - 2508, 100, // oac -> Cyrl - 2512, 475, // oar -> Syrc - 2516, 125, // oav -> Geor - 2520, 405, // obm -> Phnx - 2524, 345, // obr -> Mymr - 2528, 10, // odk -> Arab - 2532, 570, // oht -> Xsux - 2536, 65, // oj -> Cans - 2539, 65, // ojs -> Cans - 2543, 165, // okm -> Hang - 2547, 170, // oko -> Hani - 2551, 235, // okz -> Khmr - 2555, 105, // ola -> Deva - 2559, 535, // ole -> Tibt - 2563, 100, // omk -> Cyrl - 2567, 340, // omp -> Mtei - 2571, 325, // omr -> Modi - 2575, 105, // oon -> Deva - 2579, 385, // or -> Orya - 2582, 515, // ort -> Telu - 2586, 10, // oru -> Arab - 2590, 100, // orv -> Cyrl - 2594, 100, // os -> Cyrl - 2597, 390, // osa -> Osge - 2601, 200, // osc -> Ital - 2605, 205, // osi -> Java - 2609, 10, // ota -> Arab - 2613, 535, // otb -> Tibt - 2617, 380, // otk -> Orkh - 2621, 145, // oty -> Gran - 2625, 160, // pa -> Guru - 2628, 10, // pa_PK -> Arab - 2634, 400, // pal -> Phli - 2638, 100, // paq -> Cyrl - 2642, 10, // pbt -> Arab - 2646, 235, // pcb -> Khmr - 2650, 345, // pce -> Mymr - 2654, 320, // pcf -> Mlym - 2658, 320, // pcg -> Mlym - 2662, 105, // pch -> Deva - 2666, 105, // pci -> Deva - 2670, 515, // pcj -> Telu - 2674, 385, // peg -> Orya - 2678, 565, // peo -> Xpeo - 2682, 230, // pgd -> Khar - 2686, 105, // pgg -> Deva - 2690, 370, // pgl -> Ogam - 2694, 200, // pgn -> Ital - 2698, 105, // phd -> Deva - 2702, 345, // phk -> Mymr - 2706, 10, // phl -> Arab - 2710, 405, // phn -> Phnx - 2714, 260, // pho -> Laoo - 2718, 10, // phr -> Arab - 2722, 530, // pht -> Thai - 2726, 10, // phv -> Arab - 2730, 105, // phw -> Deva - 2734, 455, // pi -> Sinh - 2737, 55, // pka -> Brah - 2741, 320, // pkr -> Mlym - 2745, 10, // plk -> Arab - 2749, 345, // pll -> Mymr - 2753, 55, // pmh -> Brah - 2757, 150, // pnt -> Grek - 2761, 230, // pra -> Khar - 2765, 10, // prc -> Arab - 2769, 10, // prd -> Arab - 2773, 155, // prp -> Gujr - 2777, 530, // prt -> Thai - 2781, 10, // prx -> Arab - 2785, 10, // ps -> Arab - 2788, 10, // psh -> Arab - 2792, 10, // psi -> Arab - 2796, 10, // pst -> Arab - 2800, 105, // pum -> Deva - 2804, 345, // pwo -> Mymr - 2808, 105, // pwr -> Deva - 2812, 530, // pww -> Thai - 2816, 345, // pyx -> Mymr - 2820, 10, // qxq -> Arab - 2824, 105, // raa -> Deva - 2828, 105, // rab -> Deva - 2832, 105, // raf -> Deva - 2836, 45, // rah -> Beng - 2840, 105, // raj -> Deva - 2844, 105, // rav -> Deva - 2848, 345, // rbb -> Mymr - 2852, 10, // rdb -> Arab - 2856, 385, // rei -> Orya - 2860, 425, // rhg -> Rohg - 2864, 105, // rji -> Deva - 2868, 105, // rjs -> Deva - 2872, 235, // rka -> Khmr - 2876, 345, // rki -> Mymr - 2880, 45, // rkt -> Beng - 2884, 20, // rmi -> Armn - 2888, 10, // rmt -> Arab - 2892, 345, // rmz -> Mymr - 2896, 100, // rom_BG -> Cyrl - 2903, 100, // rsk -> Cyrl - 2907, 105, // rtw -> Deva - 2911, 100, // ru -> Cyrl - 2914, 100, // rue -> Cyrl - 2918, 100, // rut -> Cyrl - 2922, 105, // rwr -> Deva - 2926, 220, // ryu -> Kana - 2930, 105, // sa -> Deva - 2933, 100, // sah -> Cyrl - 2937, 435, // sam -> Samr - 2941, 375, // sat -> Olck - 2945, 445, // saz -> Saur - 2949, 10, // sbn -> Arab - 2953, 535, // sbu -> Tibt - 2957, 105, // sck -> Deva - 2961, 10, // scl -> Arab - 2965, 10, // scl_IN -> Arab - 2972, 105, // scp -> Deva - 2976, 260, // sct -> Laoo - 2980, 485, // scu -> Takr - 2984, 150, // scx -> Grek - 2988, 10, // sd -> Arab - 2991, 105, // sd_IN -> Deva - 2997, 10, // sdb -> Arab - 3001, 10, // sdf -> Arab - 3005, 10, // sdg -> Arab - 3009, 10, // sdh -> Arab - 3013, 10, // sds -> Arab - 3017, 100, // sel -> Cyrl - 3021, 410, // sfm -> Plrd - 3025, 370, // sga -> Ogam - 3029, 100, // sgh -> Cyrl - 3033, 105, // sgj -> Deva - 3037, 10, // sgr -> Arab - 3041, 535, // sgt -> Tibt - 3045, 120, // sgw -> Ethi - 3049, 10, // sgy -> Arab - 3053, 10, // shd -> Arab - 3057, 520, // shi -> Tfng - 3061, 10, // shm -> Arab - 3065, 345, // shn -> Mymr - 3069, 10, // shu -> Arab - 3073, 10, // shv -> Arab - 3077, 455, // si -> Sinh - 3080, 100, // sia -> Cyrl - 3084, 535, // sip -> Tibt - 3088, 10, // siy -> Arab - 3092, 10, // siz -> Arab - 3096, 100, // sjd -> Cyrl - 3100, 105, // sjp -> Deva - 3104, 100, // sjt -> Cyrl - 3108, 530, // skb -> Thai - 3112, 105, // skj -> Deva - 3116, 10, // skr -> Arab - 3120, 10, // slq -> Arab - 3124, 575, // smh -> Yiii - 3128, 435, // smp -> Samr - 3132, 235, // smu -> Khmr - 3136, 10, // smy -> Arab - 3140, 510, // soa -> Tavt - 3144, 460, // sog -> Sogd - 3148, 105, // soi -> Deva - 3152, 530, // sou -> Thai - 3156, 535, // spt -> Tibt - 3160, 385, // spv -> Orya - 3164, 10, // sqo -> Arab - 3168, 260, // sqq -> Laoo - 3172, 10, // sqt -> Arab - 3176, 100, // sr -> Cyrl - 3179, 465, // srb -> Sora - 3183, 10, // srh -> Arab - 3187, 105, // srx -> Deva - 3191, 10, // srz -> Arab - 3195, 10, // ssh -> Arab - 3199, 260, // sss -> Laoo - 3203, 10, // sts -> Arab - 3207, 120, // stv -> Ethi - 3211, 100, // sty -> Cyrl - 3215, 105, // suz -> Deva - 3219, 125, // sva -> Geor - 3223, 10, // swb -> Arab - 3227, 170, // swi -> Hani - 3231, 105, // swv -> Deva - 3235, 475, // syc -> Syrc - 3239, 45, // syl -> Beng - 3243, 475, // syn -> Syrc - 3247, 475, // syr -> Syrc - 3251, 105, // syw -> Deva - 3255, 500, // ta -> Taml - 3258, 100, // tab -> Cyrl - 3262, 105, // taj -> Deva - 3266, 480, // tbk -> Tagb - 3270, 535, // tcn -> Tibt - 3274, 345, // tco -> Mymr - 3278, 500, // tcx -> Taml - 3282, 245, // tcy -> Knda - 3286, 520, // tda -> Tfng - 3290, 105, // tdb -> Deva - 3294, 490, // tdd -> Tale - 3298, 105, // tdg -> Deva - 3302, 105, // tdh -> Deva - 3306, 515, // te -> Telu - 3309, 205, // tes -> Java - 3313, 100, // tg -> Cyrl - 3316, 10, // tg_PK -> Arab - 3322, 105, // tge -> Deva - 3326, 535, // tgf -> Tibt - 3330, 530, // th -> Thai - 3333, 105, // the -> Deva - 3337, 105, // thf -> Deva - 3341, 490, // thi -> Tale - 3345, 105, // thl -> Deva - 3349, 530, // thm -> Thai - 3353, 105, // thq -> Deva - 3357, 105, // thr -> Deva - 3361, 105, // ths -> Deva - 3365, 120, // ti -> Ethi - 3368, 120, // tig -> Ethi - 3372, 105, // tij -> Deva - 3376, 100, // tin -> Cyrl - 3380, 345, // tjl -> Mymr - 3384, 10, // tjo -> Arab - 3388, 105, // tkb -> Deva - 3392, 10, // tks -> Arab - 3396, 105, // tkt -> Deva - 3400, 105, // tmk -> Deva - 3404, 475, // tmr -> Syrc - 3408, 60, // tnv -> Cakm - 3412, 10, // tov -> Arab - 3416, 235, // tpu -> Khmr - 3420, 10, // tra -> Arab - 3424, 185, // trg -> Hebr - 3428, 10, // trm -> Arab - 3432, 10, // trw -> Arab - 3436, 150, // tsd -> Grek - 3440, 535, // tsj -> Tibt - 3444, 100, // tt -> Cyrl - 3447, 260, // tth -> Laoo - 3451, 260, // tto -> Laoo - 3455, 530, // tts -> Thai - 3459, 345, // tvn -> Mymr - 3463, 105, // twm -> Deva - 3467, 505, // txg -> Tang - 3471, 545, // txo -> Toto - 3475, 510, // tyr -> Tavt - 3479, 100, // tyv -> Cyrl - 3483, 100, // ude -> Cyrl - 3487, 320, // udg -> Mlym - 3491, 0, // udi -> Aghb - 3495, 100, // udm -> Cyrl - 3499, 10, // ug -> Arab - 3502, 100, // ug_KZ -> Cyrl - 3508, 100, // ug_MN -> Cyrl - 3514, 550, // uga -> Ugar - 3518, 100, // ugh -> Cyrl - 3522, 530, // ugo -> Thai - 3526, 100, // uk -> Cyrl - 3529, 385, // uki -> Orya - 3533, 100, // ulc -> Cyrl - 3537, 45, // unr -> Beng - 3541, 105, // unr_NP -> Deva - 3548, 45, // unx -> Beng - 3552, 10, // ur -> Arab - 3555, 530, // urk -> Thai - 3559, 10, // ush -> Arab - 3563, 150, // uum -> Grek - 3567, 10, // uz_AF -> Arab - 3573, 100, // uz_CN -> Cyrl - 3579, 10, // uzs -> Arab - 3583, 500, // vaa -> Taml - 3587, 10, // vaf -> Arab - 3591, 105, // vah -> Deva - 3595, 555, // vai -> Vaii - 3599, 105, // vas -> Deva - 3603, 105, // vav -> Deva - 3607, 105, // vay -> Deva - 3611, 10, // vgr -> Arab - 3615, 245, // vmd -> Knda - 3619, 10, // vmh -> Arab - 3623, 120, // wal -> Ethi - 3627, 10, // wbk -> Arab - 3631, 515, // wbq -> Telu - 3635, 105, // wbr -> Deva - 3639, 10, // wlo -> Arab - 3643, 105, // wme -> Deva - 3647, 10, // wne -> Arab - 3651, 10, // wni -> Arab - 3655, 130, // wsg -> Gong - 3659, 10, // wsv -> Arab - 3663, 105, // wtm -> Deva - 3667, 175, // wuu -> Hans - 3671, 100, // xal -> Cyrl - 3675, 120, // xan -> Ethi - 3679, 100, // xas -> Cyrl - 3683, 85, // xco -> Chrs - 3687, 70, // xcr -> Cari - 3691, 100, // xdq -> Cyrl - 3695, 10, // xhe -> Arab - 3699, 235, // xhm -> Khmr - 3703, 385, // xis -> Orya - 3707, 10, // xka -> Arab - 3711, 10, // xkc -> Arab - 3715, 10, // xkj -> Arab - 3719, 10, // xkp -> Arab - 3723, 285, // xlc -> Lyci - 3727, 290, // xld -> Lydi - 3731, 115, // xly -> Elym - 3735, 125, // xmf -> Geor - 3739, 300, // xmn -> Mani - 3743, 315, // xmr -> Merc - 3747, 350, // xna -> Narb - 3751, 105, // xnr -> Deva - 3755, 150, // xpg -> Grek - 3759, 370, // xpi -> Ogam - 3763, 100, // xpm -> Cyrl - 3767, 415, // xpr -> Prti - 3771, 100, // xrm -> Cyrl - 3775, 100, // xrn -> Cyrl - 3779, 440, // xsa -> Sarb - 3783, 105, // xsr -> Deva - 3787, 100, // xss -> Cyrl - 3791, 500, // xub -> Taml - 3795, 500, // xuj -> Taml - 3799, 200, // xve -> Ital - 3803, 10, // xvi -> Arab - 3807, 100, // xwo -> Cyrl - 3811, 305, // xzh -> Marc - 3815, 100, // yai -> Cyrl - 3819, 105, // ybh -> Deva - 3823, 105, // ybi -> Deva - 3827, 10, // ydg -> Arab - 3831, 320, // yea -> Mlym - 3835, 150, // yej -> Grek - 3839, 515, // yeu -> Telu - 3843, 410, // ygp -> Plrd - 3847, 185, // yhd -> Hebr - 3851, 185, // yi -> Hebr - 3854, 575, // yig -> Yiii - 3858, 185, // yih -> Hebr - 3862, 575, // yiv -> Yiii - 3866, 100, // ykg -> Cyrl - 3870, 410, // yna -> Plrd - 3874, 100, // ynk -> Cyrl - 3878, 210, // yoi -> Jpan - 3882, 530, // yoy -> Thai - 3886, 100, // yrk -> Cyrl - 3890, 575, // ysd -> Yiii - 3894, 575, // ysn -> Yiii - 3898, 575, // ysp -> Yiii - 3902, 100, // ysr -> Cyrl - 3906, 410, // ysy -> Plrd - 3910, 185, // yud -> Hebr - 3914, 180, // yue -> Hant - 3918, 175, // yue_CN -> Hans - 3925, 100, // yug -> Cyrl - 3929, 100, // yux -> Cyrl - 3933, 410, // ywq -> Plrd - 3937, 410, // ywu -> Plrd - 3941, 535, // zau -> Tibt - 3945, 10, // zba -> Arab - 3949, 170, // zch -> Hani - 3953, 10, // zdj -> Arab - 3957, 170, // zeh -> Hani - 3961, 520, // zen -> Tfng - 3965, 170, // zgb -> Hani - 3969, 520, // zgh -> Tfng - 3973, 170, // zgm -> Hani - 3977, 170, // zgn -> Hani - 3981, 175, // zh -> Hans - 3984, 180, // zh_AU -> Hant - 3990, 180, // zh_BN -> Hant - 3996, 180, // zh_GB -> Hant - 4002, 180, // zh_GF -> Hant - 4008, 180, // zh_HK -> Hant - 4014, 180, // zh_ID -> Hant - 4020, 180, // zh_MO -> Hant - 4026, 180, // zh_PA -> Hant - 4032, 180, // zh_PF -> Hant - 4038, 180, // zh_PH -> Hant - 4044, 180, // zh_SR -> Hant - 4050, 180, // zh_TH -> Hant - 4056, 180, // zh_TW -> Hant - 4062, 180, // zh_US -> Hant - 4068, 180, // zh_VN -> Hant - 4074, 170, // zhd -> Hani - 4078, 365, // zhx -> Nshu - 4082, 100, // zkb -> Cyrl - 4086, 100, // zko -> Cyrl - 4090, 240, // zkt -> Kits - 4094, 100, // zkz -> Cyrl - 4098, 170, // zlj -> Hani - 4102, 170, // zln -> Hani - 4106, 170, // zlq -> Hani - 4110, 170, // zqe -> Hani - 4114, 185, // zrp -> Hebr - 4118, 10, // zum -> Arab - 4122, 170, // zyg -> Hani - 4126, 170, // zyn -> Hani - 4130, 170, // zzj -> Hani + 1533, 105, // jul -> Deva + 1537, 385, // jun -> Orya + 1541, 385, // juy -> Orya + 1545, 545, // jya -> Tibt + 1549, 185, // jye -> Hebr + 1553, 125, // ka -> Geor + 1556, 100, // kaa -> Cyrl + 1560, 100, // kap -> Cyrl + 1564, 30, // kaw -> Bali + 1568, 100, // kbd -> Cyrl + 1572, 545, // kbg -> Tibt + 1576, 10, // kbu -> Arab + 1580, 10, // kby -> Arab + 1584, 100, // kca -> Cyrl + 1588, 10, // kcy -> Arab + 1592, 45, // kdq -> Beng + 1596, 540, // kdt -> Thai + 1600, 100, // ket -> Cyrl + 1604, 325, // kev -> Mlym + 1608, 105, // kex -> Deva + 1612, 525, // key -> Telu + 1616, 240, // kfa -> Knda + 1620, 105, // kfb -> Deva + 1624, 525, // kfc -> Telu + 1628, 240, // kfd -> Knda + 1632, 510, // kfe -> Taml + 1636, 240, // kfg -> Knda + 1640, 325, // kfh -> Mlym + 1644, 510, // kfi -> Taml + 1648, 105, // kfk -> Deva + 1652, 10, // kfm -> Arab + 1656, 105, // kfp -> Deva + 1660, 105, // kfq -> Deva + 1664, 105, // kfr -> Deva + 1668, 105, // kfs -> Deva + 1672, 105, // kfu -> Deva + 1676, 105, // kfx -> Deva + 1680, 105, // kfy -> Deva + 1684, 105, // kgj -> Deva + 1688, 545, // kgy -> Tibt + 1692, 505, // khb -> Talu + 1696, 540, // khf -> Thai + 1700, 545, // khg -> Tibt + 1704, 105, // khn -> Deva + 1708, 55, // kho -> Brah + 1712, 350, // kht -> Mymr + 1716, 100, // khv -> Cyrl + 1720, 10, // khw -> Arab + 1724, 105, // kif -> Deva + 1728, 100, // kim -> Cyrl + 1732, 105, // kip -> Deva + 1736, 255, // kjg -> Laoo + 1740, 100, // kjh -> Cyrl + 1744, 105, // kjl -> Deva + 1748, 105, // kjo -> Deva + 1752, 350, // kjp -> Mymr + 1756, 540, // kjt -> Thai + 1760, 545, // kjz -> Tibt + 1764, 100, // kk -> Cyrl + 1767, 10, // kk_AF -> Arab + 1773, 10, // kk_CN -> Arab + 1779, 10, // kk_IR -> Arab + 1785, 10, // kk_MN -> Arab + 1791, 545, // kkf -> Tibt + 1795, 250, // kkh -> Lana + 1799, 105, // kkt -> Deva + 1803, 105, // kle -> Deva + 1807, 10, // klj -> Arab + 1811, 105, // klr -> Deva + 1815, 230, // km -> Khmr + 1818, 105, // kmj -> Deva + 1822, 10, // kmz -> Arab + 1826, 240, // kn -> Knda + 1829, 105, // knn -> Deva + 1833, 245, // ko -> Kore + 1836, 100, // koi -> Cyrl + 1840, 105, // kok -> Deva + 1844, 100, // kpt -> Cyrl + 1848, 100, // kpy -> Cyrl + 1852, 485, // kqd -> Syrc + 1856, 120, // kqy -> Ethi + 1860, 105, // kra -> Deva + 1864, 100, // krc -> Cyrl + 1868, 100, // krk -> Cyrl + 1872, 230, // krr -> Khmr + 1876, 105, // kru -> Deva + 1880, 230, // krv -> Khmr + 1884, 10, // ks -> Arab + 1887, 350, // ksu -> Mymr + 1891, 350, // ksw -> Mymr + 1895, 105, // ksz -> Deva + 1899, 120, // ktb -> Ethi + 1903, 105, // kte -> Deva + 1907, 10, // ktl -> Arab + 1911, 415, // ktp -> Plrd + 1915, 100, // ku_AM -> Cyrl + 1921, 100, // ku_AZ -> Cyrl + 1927, 100, // ku_GE -> Cyrl + 1933, 10, // ku_IQ -> Arab + 1939, 10, // ku_IR -> Arab + 1945, 10, // ku_LB -> Arab + 1951, 100, // ku_TM -> Cyrl + 1957, 255, // kuf -> Laoo + 1961, 100, // kum -> Cyrl + 1965, 100, // kv -> Cyrl + 1968, 100, // kva -> Cyrl + 1972, 350, // kvq -> Mymr + 1976, 350, // kvt -> Mymr + 1980, 10, // kvx -> Arab + 1984, 215, // kvy -> Kali + 1988, 105, // kwx -> Deva + 1992, 350, // kxf -> Mymr + 1996, 350, // kxk -> Mymr + 2000, 540, // kxm -> Thai + 2004, 10, // kxp -> Arab + 2008, 100, // ky -> Cyrl + 2011, 10, // ky_CN -> Arab + 2017, 215, // kyu -> Kali + 2021, 105, // kyv -> Deva + 2025, 105, // kyw -> Deva + 2029, 275, // lab -> Lina + 2033, 185, // lad -> Hebr + 2037, 105, // lae -> Deva + 2041, 10, // lah -> Arab + 2045, 100, // lbe -> Cyrl + 2049, 105, // lbf -> Deva + 2053, 545, // lbj -> Tibt + 2057, 105, // lbm -> Deva + 2061, 255, // lbo -> Laoo + 2065, 105, // lbr -> Deva + 2069, 540, // lcp -> Thai + 2073, 270, // lep -> Lepc + 2077, 100, // lez -> Cyrl + 2081, 105, // lhm -> Deva + 2085, 485, // lhs -> Syrc + 2089, 105, // lif -> Deva + 2093, 285, // lis -> Lisu + 2097, 545, // lkh -> Tibt + 2101, 10, // lki -> Arab + 2105, 105, // lmh -> Deva + 2109, 525, // lmn -> Telu + 2113, 255, // lo -> Laoo + 2116, 105, // loy -> Deva + 2120, 415, // lpo -> Plrd + 2124, 10, // lrc -> Arab + 2128, 10, // lrk -> Arab + 2132, 10, // lrl -> Arab + 2136, 10, // lsa -> Arab + 2140, 185, // lsd -> Hebr + 2144, 10, // lss -> Arab + 2148, 180, // ltc -> Hant + 2152, 175, // luh -> Hans + 2156, 545, // luk -> Tibt + 2160, 105, // luu -> Deva + 2164, 10, // luv -> Arab + 2168, 10, // luz -> Arab + 2172, 540, // lwl -> Thai + 2176, 540, // lwm -> Thai + 2180, 545, // lya -> Tibt + 2184, 180, // lzh -> Hant + 2188, 125, // lzz_GE -> Geor + 2195, 105, // mag -> Deva + 2199, 105, // mai -> Deva + 2203, 10, // mby -> Arab + 2207, 10, // mde -> Arab + 2211, 100, // mdf -> Cyrl + 2215, 120, // mdx -> Ethi + 2219, 120, // mdy -> Ethi + 2223, 10, // mey -> Arab + 2227, 10, // mfa -> Arab + 2231, 10, // mfi -> Arab + 2235, 265, // mga -> Latg + 2239, 105, // mgp -> Deva + 2243, 10, // mhj -> Arab + 2247, 300, // mid -> Mand + 2251, 105, // mjl -> Deva + 2255, 325, // mjq -> Mlym + 2259, 325, // mjr -> Mlym + 2263, 105, // mjt -> Deva + 2267, 525, // mju -> Telu + 2271, 325, // mjv -> Mlym + 2275, 105, // mjz -> Deva + 2279, 100, // mk -> Cyrl + 2282, 105, // mkb -> Deva + 2286, 105, // mke -> Deva + 2290, 10, // mki -> Arab + 2294, 540, // mkm -> Thai + 2298, 325, // ml -> Mlym + 2301, 540, // mlf -> Thai + 2305, 100, // mn -> Cyrl + 2308, 335, // mn_CN -> Mong + 2314, 335, // mnc -> Mong + 2318, 45, // mni -> Beng + 2322, 10, // mnj -> Arab + 2326, 100, // mns -> Cyrl + 2330, 350, // mnw -> Mymr + 2334, 540, // mpz -> Thai + 2338, 105, // mr -> Deva + 2341, 540, // mra -> Thai + 2345, 105, // mrd -> Deva + 2349, 100, // mrj -> Cyrl + 2353, 340, // mro -> Mroo + 2357, 105, // mrr -> Deva + 2361, 10, // ms_CC -> Arab + 2367, 100, // mtm -> Cyrl + 2371, 105, // mtr -> Deva + 2375, 100, // mud -> Cyrl + 2379, 545, // muk -> Tibt + 2383, 105, // mut -> Deva + 2387, 510, // muv -> Taml + 2391, 120, // muz -> Ethi + 2395, 10, // mve -> Arab + 2399, 335, // mvf -> Mong + 2403, 10, // mvy -> Arab + 2407, 120, // mvz -> Ethi + 2411, 105, // mwr -> Deva + 2415, 350, // mwt -> Mymr + 2419, 195, // mww -> Hmnp + 2423, 350, // my -> Mymr + 2426, 120, // mym -> Ethi + 2430, 100, // myv -> Cyrl + 2434, 300, // myz -> Mand + 2438, 10, // mzb -> Arab + 2442, 10, // mzn -> Arab + 2446, 175, // nan -> Hans + 2450, 180, // nan_MO -> Hant + 2457, 180, // nan_TW -> Hant + 2464, 105, // nao -> Deva + 2468, 105, // ncd -> Deva + 2472, 255, // ncq -> Laoo + 2476, 100, // ndf -> Cyrl + 2480, 105, // ne -> Deva + 2483, 100, // neg -> Cyrl + 2487, 545, // neh -> Tibt + 2491, 580, // nei -> Xsux + 2495, 105, // new -> Deva + 2499, 255, // ngt -> Laoo + 2503, 100, // nio -> Cyrl + 2507, 525, // nit -> Telu + 2511, 100, // niv -> Cyrl + 2515, 10, // nli -> Arab + 2519, 10, // nlm -> Arab + 2523, 105, // nlx -> Deva + 2527, 105, // nmm -> Deva + 2531, 570, // nnp -> Wcho + 2535, 250, // nod -> Lana + 2539, 105, // noe -> Deva + 2543, 100, // nog -> Cyrl + 2547, 105, // noi -> Deva + 2551, 435, // non -> Runr + 2555, 585, // nos -> Yiii + 2559, 545, // npb -> Tibt + 2563, 365, // nqo -> Nkoo + 2567, 435, // nrn -> Runr + 2571, 585, // nsd -> Yiii + 2575, 585, // nsf -> Yiii + 2579, 65, // nsk -> Cans + 2583, 550, // nst -> Tnsa + 2587, 585, // nsv -> Yiii + 2591, 585, // nty -> Yiii + 2595, 10, // ntz -> Arab + 2599, 360, // nwc -> Newa + 2603, 105, // nwx -> Deva + 2607, 540, // nyl -> Thai + 2611, 10, // nyq -> Arab + 2615, 540, // nyw -> Thai + 2619, 100, // oaa -> Cyrl + 2623, 100, // oac -> Cyrl + 2627, 485, // oar -> Syrc + 2631, 125, // oav -> Geor + 2635, 410, // obm -> Phnx + 2639, 350, // obr -> Mymr + 2643, 10, // odk -> Arab + 2647, 580, // oht -> Xsux + 2651, 65, // oj -> Cans + 2654, 65, // ojs -> Cans + 2658, 165, // okm -> Hang + 2662, 170, // oko -> Hani + 2666, 230, // okz -> Khmr + 2670, 105, // ola -> Deva + 2674, 545, // ole -> Tibt + 2678, 100, // omk -> Cyrl + 2682, 345, // omp -> Mtei + 2686, 330, // omr -> Modi + 2690, 350, // omx -> Mymr + 2694, 105, // oon -> Deva + 2698, 385, // or -> Orya + 2701, 525, // ort -> Telu + 2705, 10, // oru -> Arab + 2709, 100, // orv -> Cyrl + 2713, 100, // os -> Cyrl + 2716, 390, // osa -> Osge + 2720, 200, // osc -> Ital + 2724, 205, // osi -> Java + 2728, 10, // ota -> Arab + 2732, 545, // otb -> Tibt + 2736, 380, // otk -> Orkh + 2740, 145, // oty -> Gran + 2744, 395, // oui -> Ougr + 2748, 255, // oyb -> Laoo + 2752, 160, // pa -> Guru + 2755, 10, // pa_PK -> Arab + 2761, 405, // pal -> Phli + 2765, 100, // paq -> Cyrl + 2769, 10, // pbt -> Arab + 2773, 230, // pcb -> Khmr + 2777, 350, // pce -> Mymr + 2781, 325, // pcf -> Mlym + 2785, 325, // pcg -> Mlym + 2789, 105, // pch -> Deva + 2793, 105, // pci -> Deva + 2797, 525, // pcj -> Telu + 2801, 385, // peg -> Orya + 2805, 575, // peo -> Xpeo + 2809, 225, // pgd -> Khar + 2813, 105, // pgg -> Deva + 2817, 370, // pgl -> Ogam + 2821, 200, // pgn -> Ital + 2825, 105, // phd -> Deva + 2829, 350, // phk -> Mymr + 2833, 10, // phl -> Arab + 2837, 410, // phn -> Phnx + 2841, 255, // pho -> Laoo + 2845, 10, // phr -> Arab + 2849, 540, // pht -> Thai + 2853, 540, // phu -> Thai + 2857, 10, // phv -> Arab + 2861, 105, // phw -> Deva + 2865, 105, // pi_IN -> Deva + 2871, 465, // pi_LK -> Sinh + 2877, 350, // pi_MM -> Mymr + 2883, 540, // pi_TH -> Thai + 2889, 55, // pka -> Brah + 2893, 325, // pkr -> Mlym + 2897, 10, // plk -> Arab + 2901, 350, // pll -> Mymr + 2905, 55, // pmh -> Brah + 2909, 150, // pnt -> Grek + 2913, 100, // pnt_RU -> Cyrl + 2920, 10, // prc -> Arab + 2924, 10, // prd -> Arab + 2928, 540, // prt -> Thai + 2932, 10, // prx -> Arab + 2936, 10, // ps -> Arab + 2939, 10, // psh -> Arab + 2943, 10, // psi -> Arab + 2947, 10, // pst -> Arab + 2951, 55, // psu -> Brah + 2955, 105, // pum -> Deva + 2959, 350, // pwo -> Mymr + 2963, 105, // pwr -> Deva + 2967, 540, // pww -> Thai + 2971, 350, // pyx -> Mymr + 2975, 10, // qxq -> Arab + 2979, 105, // raa -> Deva + 2983, 105, // rab -> Deva + 2987, 105, // raf -> Deva + 2991, 45, // rah -> Beng + 2995, 105, // raj -> Deva + 2999, 105, // rav -> Deva + 3003, 350, // rbb -> Mymr + 3007, 10, // rdb -> Arab + 3011, 385, // rei -> Orya + 3015, 430, // rhg -> Rohg + 3019, 105, // rji -> Deva + 3023, 105, // rjs -> Deva + 3027, 230, // rka -> Khmr + 3031, 350, // rki -> Mymr + 3035, 45, // rkt -> Beng + 3039, 20, // rmi -> Armn + 3043, 10, // rmt -> Arab + 3047, 350, // rmz -> Mymr + 3051, 100, // rsk -> Cyrl + 3055, 105, // rtw -> Deva + 3059, 100, // ru -> Cyrl + 3062, 100, // rue -> Cyrl + 3066, 100, // rut -> Cyrl + 3070, 105, // rwr -> Deva + 3074, 220, // ryu -> Kana + 3078, 105, // sa -> Deva + 3081, 100, // sah -> Cyrl + 3085, 440, // sam -> Samr + 3089, 375, // sat -> Olck + 3093, 450, // saz -> Saur + 3097, 10, // sbn -> Arab + 3101, 545, // sbu -> Tibt + 3105, 105, // sck -> Deva + 3109, 10, // scl -> Arab + 3113, 105, // scp -> Deva + 3117, 255, // sct -> Laoo + 3121, 495, // scu -> Takr + 3125, 150, // scx -> Grek + 3129, 10, // sd -> Arab + 3132, 105, // sd_IN -> Deva + 3138, 10, // sdb -> Arab + 3142, 10, // sdf -> Arab + 3146, 10, // sdg -> Arab + 3150, 10, // sdh -> Arab + 3154, 45, // sdr -> Beng + 3158, 10, // sds -> Arab + 3162, 100, // sel -> Cyrl + 3166, 415, // sfm -> Plrd + 3170, 100, // sgh -> Cyrl + 3174, 105, // sgj -> Deva + 3178, 10, // sgr -> Arab + 3182, 545, // sgt -> Tibt + 3186, 120, // sgw -> Ethi + 3190, 10, // sgy -> Arab + 3194, 10, // shd -> Arab + 3198, 530, // shi -> Tfng + 3202, 10, // shm -> Arab + 3206, 350, // shn -> Mymr + 3210, 10, // shu -> Arab + 3214, 10, // shv -> Arab + 3218, 465, // si -> Sinh + 3221, 100, // sia -> Cyrl + 3225, 545, // sip -> Tibt + 3229, 10, // siy -> Arab + 3233, 10, // siz -> Arab + 3237, 175, // sjc -> Hans + 3241, 100, // sjd -> Cyrl + 3245, 105, // sjp -> Deva + 3249, 100, // sjt -> Cyrl + 3253, 540, // skb -> Thai + 3257, 105, // skj -> Deva + 3261, 10, // skr -> Arab + 3265, 585, // smh -> Yiii + 3269, 440, // smp -> Samr + 3273, 230, // smu -> Khmr + 3277, 10, // smy -> Arab + 3281, 520, // soa -> Tavt + 3285, 470, // sog -> Sogd + 3289, 105, // soi -> Deva + 3293, 540, // sou -> Thai + 3297, 545, // spt -> Tibt + 3301, 385, // spv -> Orya + 3305, 10, // sqo -> Arab + 3309, 255, // sqq -> Laoo + 3313, 10, // sqt -> Arab + 3317, 100, // sr -> Cyrl + 3320, 475, // srb -> Sora + 3324, 10, // srh -> Arab + 3328, 105, // srx -> Deva + 3332, 10, // srz -> Arab + 3336, 10, // ssh -> Arab + 3340, 255, // sss -> Laoo + 3344, 10, // sts -> Arab + 3348, 250, // stu -> Lana + 3352, 500, // stu_CN -> Tale + 3359, 120, // stv -> Ethi + 3363, 100, // sty -> Cyrl + 3367, 105, // suz -> Deva + 3371, 125, // sva -> Geor + 3375, 10, // swb -> Arab + 3379, 170, // swi -> Hani + 3383, 105, // swv -> Deva + 3387, 435, // sxu -> Runr + 3391, 485, // syc -> Syrc + 3395, 45, // syl -> Beng + 3399, 485, // syn -> Syrc + 3403, 485, // syr -> Syrc + 3407, 105, // syw -> Deva + 3411, 510, // ta -> Taml + 3414, 100, // tab -> Cyrl + 3418, 105, // taj -> Deva + 3422, 490, // tbk -> Tagb + 3426, 105, // tcn -> Deva + 3430, 350, // tco -> Mymr + 3434, 510, // tcx -> Taml + 3438, 240, // tcy -> Knda + 3442, 530, // tda -> Tfng + 3446, 105, // tdb -> Deva + 3450, 500, // tdd -> Tale + 3454, 105, // tdg -> Deva + 3458, 105, // tdh -> Deva + 3462, 525, // te -> Telu + 3465, 205, // tes -> Java + 3469, 100, // tg -> Cyrl + 3472, 10, // tg_PK -> Arab + 3478, 105, // tge -> Deva + 3482, 545, // tgf -> Tibt + 3486, 540, // th -> Thai + 3489, 105, // the -> Deva + 3493, 105, // thf -> Deva + 3497, 500, // thi -> Tale + 3501, 105, // thl -> Deva + 3505, 540, // thm -> Thai + 3509, 105, // thq -> Deva + 3513, 105, // thr -> Deva + 3517, 105, // ths -> Deva + 3521, 120, // ti -> Ethi + 3524, 120, // tig -> Ethi + 3528, 105, // tij -> Deva + 3532, 100, // tin -> Cyrl + 3536, 350, // tjl -> Mymr + 3540, 10, // tjo -> Arab + 3544, 105, // tkb -> Deva + 3548, 10, // tks -> Arab + 3552, 105, // tkt -> Deva + 3556, 485, // tmr -> Syrc + 3560, 60, // tnv -> Cakm + 3564, 10, // tov -> Arab + 3568, 230, // tpu -> Khmr + 3572, 10, // tra -> Arab + 3576, 185, // trg -> Hebr + 3580, 10, // trm -> Arab + 3584, 10, // trw -> Arab + 3588, 150, // tsd -> Grek + 3592, 545, // tsj -> Tibt + 3596, 100, // tt -> Cyrl + 3599, 255, // tth -> Laoo + 3603, 255, // tto -> Laoo + 3607, 540, // tts -> Thai + 3611, 105, // ttz -> Deva + 3615, 350, // tvn -> Mymr + 3619, 545, // twm -> Tibt + 3623, 515, // txg -> Tang + 3627, 555, // txo -> Toto + 3631, 520, // tyr -> Tavt + 3635, 100, // tyv -> Cyrl + 3639, 100, // ude -> Cyrl + 3643, 325, // udg -> Mlym + 3647, 100, // udi -> Cyrl + 3651, 100, // udm -> Cyrl + 3655, 10, // ug -> Arab + 3658, 100, // ug_KZ -> Cyrl + 3664, 100, // ug_MN -> Cyrl + 3670, 560, // uga -> Ugar + 3674, 100, // ugh -> Cyrl + 3678, 540, // ugo -> Thai + 3682, 100, // uk -> Cyrl + 3685, 385, // uki -> Orya + 3689, 100, // ulc -> Cyrl + 3693, 45, // unr -> Beng + 3697, 105, // unr_NP -> Deva + 3704, 45, // unx -> Beng + 3708, 10, // ur -> Arab + 3711, 540, // urk -> Thai + 3715, 10, // ush -> Arab + 3719, 150, // uum -> Grek + 3723, 10, // uz_AF -> Arab + 3729, 100, // uz_CN -> Cyrl + 3735, 10, // uzs -> Arab + 3739, 510, // vaa -> Taml + 3743, 10, // vaf -> Arab + 3747, 105, // vah -> Deva + 3751, 565, // vai -> Vaii + 3755, 105, // vas -> Deva + 3759, 105, // vav -> Deva + 3763, 105, // vay -> Deva + 3767, 10, // vgr -> Arab + 3771, 105, // vjk -> Deva + 3775, 240, // vmd -> Knda + 3779, 10, // vmh -> Arab + 3783, 120, // wal -> Ethi + 3787, 10, // wbk -> Arab + 3791, 525, // wbq -> Telu + 3795, 105, // wbr -> Deva + 3799, 120, // wle -> Ethi + 3803, 10, // wlo -> Arab + 3807, 105, // wme -> Deva + 3811, 10, // wne -> Arab + 3815, 10, // wni -> Arab + 3819, 130, // wsg -> Gong + 3823, 10, // wsv -> Arab + 3827, 105, // wtm -> Deva + 3831, 175, // wuu -> Hans + 3835, 0, // xag -> Aghb + 3839, 100, // xal -> Cyrl + 3843, 120, // xan -> Ethi + 3847, 100, // xas -> Cyrl + 3851, 85, // xco -> Chrs + 3855, 70, // xcr -> Cari + 3859, 100, // xdq -> Cyrl + 3863, 10, // xhe -> Arab + 3867, 230, // xhm -> Khmr + 3871, 385, // xis -> Orya + 3875, 10, // xka -> Arab + 3879, 10, // xkc -> Arab + 3883, 545, // xkf -> Tibt + 3887, 10, // xkj -> Arab + 3891, 10, // xkp -> Arab + 3895, 290, // xlc -> Lyci + 3899, 295, // xld -> Lydi + 3903, 115, // xly -> Elym + 3907, 125, // xmf -> Geor + 3911, 305, // xmn -> Mani + 3915, 320, // xmr -> Merc + 3919, 355, // xna -> Narb + 3923, 105, // xnr -> Deva + 3927, 150, // xpg -> Grek + 3931, 370, // xpi -> Ogam + 3935, 100, // xpm -> Cyrl + 3939, 420, // xpr -> Prti + 3943, 100, // xrm -> Cyrl + 3947, 100, // xrn -> Cyrl + 3951, 445, // xsa -> Sarb + 3955, 460, // xsd -> Sidt + 3959, 105, // xsr -> Deva + 3963, 55, // xtq -> Brah + 3967, 510, // xub -> Taml + 3971, 510, // xuj -> Taml + 3975, 200, // xve -> Ital + 3979, 10, // xvi -> Arab + 3983, 100, // xwo -> Cyrl + 3987, 310, // xzh -> Marc + 3991, 100, // yai -> Cyrl + 3995, 105, // ybh -> Deva + 3999, 105, // ybi -> Deva + 4003, 10, // ydg -> Arab + 4007, 325, // yea -> Mlym + 4011, 150, // yej -> Grek + 4015, 525, // yeu -> Telu + 4019, 415, // ygp -> Plrd + 4023, 185, // yhd -> Hebr + 4027, 185, // yi -> Hebr + 4030, 585, // yig -> Yiii + 4034, 185, // yih -> Hebr + 4038, 585, // yiv -> Yiii + 4042, 100, // ykg -> Cyrl + 4046, 100, // ykh -> Cyrl + 4050, 415, // yna -> Plrd + 4054, 100, // ynk -> Cyrl + 4058, 210, // yoi -> Jpan + 4062, 540, // yoy -> Thai + 4066, 100, // yrk -> Cyrl + 4070, 585, // ysd -> Yiii + 4074, 585, // ysn -> Yiii + 4078, 585, // ysp -> Yiii + 4082, 100, // ysr -> Cyrl + 4086, 415, // ysy -> Plrd + 4090, 185, // yud -> Hebr + 4094, 180, // yue -> Hant + 4098, 175, // yue_CN -> Hans + 4105, 100, // yug -> Cyrl + 4109, 100, // yux -> Cyrl + 4113, 415, // ywq -> Plrd + 4117, 415, // ywu -> Plrd + 4121, 545, // zau -> Tibt + 4125, 10, // zba -> Arab + 4129, 170, // zch -> Hani + 4133, 10, // zdj -> Arab + 4137, 170, // zeh -> Hani + 4141, 530, // zen -> Tfng + 4145, 170, // zgb -> Hani + 4149, 530, // zgh -> Tfng + 4153, 170, // zgm -> Hani + 4157, 170, // zgn -> Hani + 4161, 175, // zh -> Hans + 4164, 180, // zh_AU -> Hant + 4170, 180, // zh_BN -> Hant + 4176, 180, // zh_GB -> Hant + 4182, 180, // zh_GF -> Hant + 4188, 180, // zh_HK -> Hant + 4194, 180, // zh_ID -> Hant + 4200, 180, // zh_MO -> Hant + 4206, 180, // zh_PA -> Hant + 4212, 180, // zh_PF -> Hant + 4218, 180, // zh_PH -> Hant + 4224, 180, // zh_SR -> Hant + 4230, 180, // zh_TH -> Hant + 4236, 180, // zh_TW -> Hant + 4242, 180, // zh_US -> Hant + 4248, 180, // zh_VN -> Hant + 4254, 170, // zhd -> Hani + 4258, 100, // zko -> Cyrl + 4262, 235, // zkt -> Kits + 4266, 100, // zkz -> Cyrl + 4270, 170, // zlj -> Hani + 4274, 170, // zln -> Hani + 4278, 170, // zlq -> Hani + 4282, 170, // zqe -> Hani + 4286, 385, // zrg -> Orya + 4290, 185, // zrp -> Hebr + 4294, 10, // zum -> Arab + 4298, 120, // zwa -> Ethi + 4302, 170, // zyg -> Hani + 4306, 170, // zyn -> Hani + 4310, 170, // zzj -> Hani }; //====================================================================== @@ -1136,38 +1184,40 @@ const char parentLocaleChars[] = "az_Arab\0az_Cyrl\0bal_Latn\0blt_Latn\0bm_Nkoo\0bs_Cyrl\0byn_Latn\0" "cu_Glag\0dje_Arab\0dyo_Arab\0en_001\0en_150\0en_AG\0en_AI\0en_AT\0" "en_AU\0en_BB\0en_BE\0en_BM\0en_BS\0en_BW\0en_BZ\0en_CC\0en_CH\0" - "en_CK\0en_CM\0en_CX\0en_CY\0en_DE\0en_DG\0en_DK\0en_DM\0en_Dsrt\0" - "en_ER\0en_FI\0en_FJ\0en_FK\0en_FM\0en_GB\0en_GD\0en_GG\0en_GH\0" - "en_GI\0en_GM\0en_GY\0en_HK\0en_ID\0en_IE\0en_IL\0en_IM\0en_IN\0" - "en_IO\0en_JE\0en_JM\0en_KE\0en_KI\0en_KN\0en_KY\0en_LC\0en_LR\0" - "en_LS\0en_MG\0en_MO\0en_MS\0en_MT\0en_MU\0en_MV\0en_MW\0en_MY\0" - "en_NA\0en_NF\0en_NG\0en_NL\0en_NR\0en_NU\0en_NZ\0en_PG\0en_PK\0" - "en_PN\0en_PW\0en_RW\0en_SB\0en_SC\0en_SD\0en_SE\0en_SG\0en_SH\0" - "en_SI\0en_SL\0en_SS\0en_SX\0en_SZ\0en_Shaw\0en_TC\0en_TK\0en_TO\0" - "en_TT\0en_TV\0en_TZ\0en_UG\0en_VC\0en_VG\0en_VU\0en_WS\0en_ZA\0" - "en_ZM\0en_ZW\0es_419\0es_AR\0es_BO\0es_BR\0es_BZ\0es_CL\0es_CO\0" - "es_CR\0es_CU\0es_DO\0es_EC\0es_GT\0es_HN\0es_JP\0es_MX\0es_NI\0" - "es_PA\0es_PE\0es_PR\0es_PY\0es_SV\0es_US\0es_UY\0es_VE\0ff_Adlm\0" - "ff_Arab\0fr_HT\0ha_Arab\0hi_Latn\0ht\0iu_Latn\0kk_Arab\0ks_Deva\0" + "en_CK\0en_CM\0en_CX\0en_CY\0en_CZ\0en_DE\0en_DG\0en_DK\0en_DM\0" + "en_Dsrt\0en_EE\0en_ER\0en_ES\0en_FI\0en_FJ\0en_FK\0en_FM\0en_FR\0" + "en_GB\0en_GD\0en_GE\0en_GG\0en_GH\0en_GI\0en_GM\0en_GS\0en_GY\0" + "en_HK\0en_HU\0en_ID\0en_IE\0en_IL\0en_IM\0en_IN\0en_IO\0en_IT\0" + "en_JE\0en_JM\0en_KE\0en_KI\0en_KN\0en_KY\0en_LC\0en_LR\0en_LS\0" + "en_LT\0en_LV\0en_MG\0en_MO\0en_MS\0en_MT\0en_MU\0en_MV\0en_MW\0" + "en_MY\0en_NA\0en_NF\0en_NG\0en_NL\0en_NO\0en_NR\0en_NU\0en_NZ\0" + "en_PG\0en_PK\0en_PL\0en_PN\0en_PT\0en_PW\0en_RO\0en_RW\0en_SB\0" + "en_SC\0en_SD\0en_SE\0en_SG\0en_SH\0en_SI\0en_SK\0en_SL\0en_SS\0" + "en_SX\0en_SZ\0en_Shaw\0en_TC\0en_TK\0en_TO\0en_TT\0en_TV\0en_TZ\0" + "en_UA\0en_UG\0en_VC\0en_VG\0en_VU\0en_WS\0en_ZA\0en_ZM\0en_ZW\0" + "es_419\0es_AR\0es_BO\0es_BR\0es_BZ\0es_CL\0es_CO\0es_CR\0es_CU\0" + "es_DO\0es_EC\0es_GT\0es_HN\0es_JP\0es_MX\0es_NI\0es_PA\0es_PE\0" + "es_PR\0es_PY\0es_SV\0es_US\0es_UY\0es_VE\0ff_Adlm\0ff_Arab\0fr_HT\0" + "ha_Arab\0hi_Latn\0ht\0iu_Latn\0kaa_Latn\0kk_Arab\0kok_Latn\0ks_Deva\0" "ku_Arab\0kxv_Deva\0kxv_Orya\0kxv_Telu\0ky_Arab\0ky_Latn\0ml_Arab\0" "mn_Mong\0mni_Mtei\0ms_Arab\0nb\0nn\0no\0no_NO\0pa_Arab\0pt_AO\0" "pt_CH\0pt_CV\0pt_FR\0pt_GQ\0pt_GW\0pt_LU\0pt_MO\0pt_MZ\0pt_PT\0" "pt_ST\0pt_TL\0root\0sat_Deva\0sd_Deva\0sd_Khoj\0sd_Sind\0shi_Latn\0" - "so_Arab\0sr_Latn\0sw_Arab\0tg_Arab\0ug_Cyrl\0uz_Arab\0uz_Cyrl\0" - "vai_Latn\0wo_Arab\0yo_Arab\0yue_Hans\0zh_Hant\0zh_Hant_HK\0zh_Hant_MO\0" - ""; + "so_Arab\0sr_Latn\0suz_Sunu\0sw_Arab\0tg_Arab\0ug_Cyrl\0uz_Arab\0" + "uz_Cyrl\0vai_Latn\0wo_Arab\0yo_Arab\0yue_Hans\0zh_Hant\0zh_Hant_HK\0" + "zh_Hant_MO\0"; const int32_t parentLocaleTable[] = { - 0, 1062, // az_Arab -> root - 8, 1062, // az_Cyrl -> root - 16, 1062, // bal_Latn -> root - 25, 1062, // blt_Latn -> root - 34, 1062, // bm_Nkoo -> root - 42, 1062, // bs_Cyrl -> root - 50, 1062, // byn_Latn -> root - 59, 1062, // cu_Glag -> root - 67, 1062, // dje_Arab -> root - 76, 1062, // dyo_Arab -> root + 0, 1176, // az_Arab -> root + 8, 1176, // az_Cyrl -> root + 16, 1176, // bal_Latn -> root + 25, 1176, // blt_Latn -> root + 34, 1176, // bm_Nkoo -> root + 42, 1176, // bs_Cyrl -> root + 50, 1176, // byn_Latn -> root + 59, 1176, // cu_Glag -> root + 67, 1176, // dje_Arab -> root + 76, 1176, // dyo_Arab -> root 92, 85, // en_150 -> en_001 99, 85, // en_AG -> en_001 105, 85, // en_AI -> en_001 @@ -1185,159 +1235,178 @@ const int32_t parentLocaleTable[] = { 177, 85, // en_CM -> en_001 183, 85, // en_CX -> en_001 189, 85, // en_CY -> en_001 - 195, 92, // en_DE -> en_150 - 201, 85, // en_DG -> en_001 - 207, 92, // en_DK -> en_150 - 213, 85, // en_DM -> en_001 - 219, 1062, // en_Dsrt -> root - 227, 85, // en_ER -> en_001 - 233, 92, // en_FI -> en_150 - 239, 85, // en_FJ -> en_001 - 245, 85, // en_FK -> en_001 - 251, 85, // en_FM -> en_001 - 257, 85, // en_GB -> en_001 - 263, 85, // en_GD -> en_001 - 269, 85, // en_GG -> en_001 - 275, 85, // en_GH -> en_001 - 281, 85, // en_GI -> en_001 - 287, 85, // en_GM -> en_001 - 293, 85, // en_GY -> en_001 - 299, 85, // en_HK -> en_001 - 305, 85, // en_ID -> en_001 - 311, 85, // en_IE -> en_001 - 317, 85, // en_IL -> en_001 - 323, 85, // en_IM -> en_001 - 329, 85, // en_IN -> en_001 - 335, 85, // en_IO -> en_001 - 341, 85, // en_JE -> en_001 - 347, 85, // en_JM -> en_001 - 353, 85, // en_KE -> en_001 - 359, 85, // en_KI -> en_001 - 365, 85, // en_KN -> en_001 - 371, 85, // en_KY -> en_001 - 377, 85, // en_LC -> en_001 - 383, 85, // en_LR -> en_001 - 389, 85, // en_LS -> en_001 - 395, 85, // en_MG -> en_001 - 401, 85, // en_MO -> en_001 - 407, 85, // en_MS -> en_001 - 413, 85, // en_MT -> en_001 - 419, 85, // en_MU -> en_001 - 425, 85, // en_MV -> en_001 - 431, 85, // en_MW -> en_001 - 437, 85, // en_MY -> en_001 - 443, 85, // en_NA -> en_001 - 449, 85, // en_NF -> en_001 - 455, 85, // en_NG -> en_001 - 461, 92, // en_NL -> en_150 - 467, 85, // en_NR -> en_001 - 473, 85, // en_NU -> en_001 - 479, 85, // en_NZ -> en_001 - 485, 85, // en_PG -> en_001 - 491, 85, // en_PK -> en_001 - 497, 85, // en_PN -> en_001 - 503, 85, // en_PW -> en_001 - 509, 85, // en_RW -> en_001 - 515, 85, // en_SB -> en_001 - 521, 85, // en_SC -> en_001 - 527, 85, // en_SD -> en_001 - 533, 92, // en_SE -> en_150 - 539, 85, // en_SG -> en_001 - 545, 85, // en_SH -> en_001 - 551, 92, // en_SI -> en_150 - 557, 85, // en_SL -> en_001 - 563, 85, // en_SS -> en_001 - 569, 85, // en_SX -> en_001 - 575, 85, // en_SZ -> en_001 - 581, 1062, // en_Shaw -> root - 589, 85, // en_TC -> en_001 - 595, 85, // en_TK -> en_001 - 601, 85, // en_TO -> en_001 - 607, 85, // en_TT -> en_001 - 613, 85, // en_TV -> en_001 - 619, 85, // en_TZ -> en_001 - 625, 85, // en_UG -> en_001 - 631, 85, // en_VC -> en_001 - 637, 85, // en_VG -> en_001 - 643, 85, // en_VU -> en_001 - 649, 85, // en_WS -> en_001 - 655, 85, // en_ZA -> en_001 - 661, 85, // en_ZM -> en_001 - 667, 85, // en_ZW -> en_001 - 680, 673, // es_AR -> es_419 - 686, 673, // es_BO -> es_419 - 692, 673, // es_BR -> es_419 - 698, 673, // es_BZ -> es_419 - 704, 673, // es_CL -> es_419 - 710, 673, // es_CO -> es_419 - 716, 673, // es_CR -> es_419 - 722, 673, // es_CU -> es_419 - 728, 673, // es_DO -> es_419 - 734, 673, // es_EC -> es_419 - 740, 673, // es_GT -> es_419 - 746, 673, // es_HN -> es_419 - 752, 673, // es_JP -> es_419 - 758, 673, // es_MX -> es_419 - 764, 673, // es_NI -> es_419 - 770, 673, // es_PA -> es_419 - 776, 673, // es_PE -> es_419 - 782, 673, // es_PR -> es_419 - 788, 673, // es_PY -> es_419 - 794, 673, // es_SV -> es_419 - 800, 673, // es_US -> es_419 - 806, 673, // es_UY -> es_419 - 812, 673, // es_VE -> es_419 - 818, 1062, // ff_Adlm -> root - 826, 1062, // ff_Arab -> root - 840, 1062, // ha_Arab -> root - 848, 329, // hi_Latn -> en_IN - 856, 834, // ht -> fr_HT - 859, 1062, // iu_Latn -> root - 867, 1062, // kk_Arab -> root - 875, 1062, // ks_Deva -> root - 883, 1062, // ku_Arab -> root - 891, 1062, // kxv_Deva -> root - 900, 1062, // kxv_Orya -> root - 909, 1062, // kxv_Telu -> root - 918, 1062, // ky_Arab -> root - 926, 1062, // ky_Latn -> root - 934, 1062, // ml_Arab -> root - 942, 1062, // mn_Mong -> root - 950, 1062, // mni_Mtei -> root - 959, 1062, // ms_Arab -> root - 967, 973, // nb -> no - 970, 973, // nn -> no - 976, 973, // no_NO -> no - 982, 1062, // pa_Arab -> root - 990, 1044, // pt_AO -> pt_PT - 996, 1044, // pt_CH -> pt_PT - 1002, 1044, // pt_CV -> pt_PT - 1008, 1044, // pt_FR -> pt_PT - 1014, 1044, // pt_GQ -> pt_PT - 1020, 1044, // pt_GW -> pt_PT - 1026, 1044, // pt_LU -> pt_PT - 1032, 1044, // pt_MO -> pt_PT - 1038, 1044, // pt_MZ -> pt_PT - 1050, 1044, // pt_ST -> pt_PT - 1056, 1044, // pt_TL -> pt_PT - 1067, 1062, // sat_Deva -> root - 1076, 1062, // sd_Deva -> root - 1084, 1062, // sd_Khoj -> root - 1092, 1062, // sd_Sind -> root - 1100, 1062, // shi_Latn -> root - 1109, 1062, // so_Arab -> root - 1117, 1062, // sr_Latn -> root - 1125, 1062, // sw_Arab -> root - 1133, 1062, // tg_Arab -> root - 1141, 1062, // ug_Cyrl -> root - 1149, 1062, // uz_Arab -> root - 1157, 1062, // uz_Cyrl -> root - 1165, 1062, // vai_Latn -> root - 1174, 1062, // wo_Arab -> root - 1182, 1062, // yo_Arab -> root - 1190, 1062, // yue_Hans -> root - 1199, 1062, // zh_Hant -> root - 1218, 1207, // zh_Hant_MO -> zh_Hant_HK + 195, 92, // en_CZ -> en_150 + 201, 92, // en_DE -> en_150 + 207, 85, // en_DG -> en_001 + 213, 92, // en_DK -> en_150 + 219, 85, // en_DM -> en_001 + 225, 1176, // en_Dsrt -> root + 233, 92, // en_EE -> en_150 + 239, 85, // en_ER -> en_001 + 245, 92, // en_ES -> en_150 + 251, 92, // en_FI -> en_150 + 257, 85, // en_FJ -> en_001 + 263, 85, // en_FK -> en_001 + 269, 85, // en_FM -> en_001 + 275, 92, // en_FR -> en_150 + 281, 85, // en_GB -> en_001 + 287, 85, // en_GD -> en_001 + 293, 92, // en_GE -> en_150 + 299, 85, // en_GG -> en_001 + 305, 85, // en_GH -> en_001 + 311, 85, // en_GI -> en_001 + 317, 85, // en_GM -> en_001 + 323, 85, // en_GS -> en_001 + 329, 85, // en_GY -> en_001 + 335, 85, // en_HK -> en_001 + 341, 92, // en_HU -> en_150 + 347, 85, // en_ID -> en_001 + 353, 85, // en_IE -> en_001 + 359, 85, // en_IL -> en_001 + 365, 85, // en_IM -> en_001 + 371, 85, // en_IN -> en_001 + 377, 85, // en_IO -> en_001 + 383, 92, // en_IT -> en_150 + 389, 85, // en_JE -> en_001 + 395, 85, // en_JM -> en_001 + 401, 85, // en_KE -> en_001 + 407, 85, // en_KI -> en_001 + 413, 85, // en_KN -> en_001 + 419, 85, // en_KY -> en_001 + 425, 85, // en_LC -> en_001 + 431, 85, // en_LR -> en_001 + 437, 85, // en_LS -> en_001 + 443, 92, // en_LT -> en_150 + 449, 92, // en_LV -> en_150 + 455, 85, // en_MG -> en_001 + 461, 85, // en_MO -> en_001 + 467, 85, // en_MS -> en_001 + 473, 85, // en_MT -> en_001 + 479, 85, // en_MU -> en_001 + 485, 85, // en_MV -> en_001 + 491, 85, // en_MW -> en_001 + 497, 85, // en_MY -> en_001 + 503, 85, // en_NA -> en_001 + 509, 85, // en_NF -> en_001 + 515, 85, // en_NG -> en_001 + 521, 92, // en_NL -> en_150 + 527, 92, // en_NO -> en_150 + 533, 85, // en_NR -> en_001 + 539, 85, // en_NU -> en_001 + 545, 85, // en_NZ -> en_001 + 551, 85, // en_PG -> en_001 + 557, 85, // en_PK -> en_001 + 563, 92, // en_PL -> en_150 + 569, 85, // en_PN -> en_001 + 575, 92, // en_PT -> en_150 + 581, 85, // en_PW -> en_001 + 587, 92, // en_RO -> en_150 + 593, 85, // en_RW -> en_001 + 599, 85, // en_SB -> en_001 + 605, 85, // en_SC -> en_001 + 611, 85, // en_SD -> en_001 + 617, 92, // en_SE -> en_150 + 623, 85, // en_SG -> en_001 + 629, 85, // en_SH -> en_001 + 635, 92, // en_SI -> en_150 + 641, 92, // en_SK -> en_150 + 647, 85, // en_SL -> en_001 + 653, 85, // en_SS -> en_001 + 659, 85, // en_SX -> en_001 + 665, 85, // en_SZ -> en_001 + 671, 1176, // en_Shaw -> root + 679, 85, // en_TC -> en_001 + 685, 85, // en_TK -> en_001 + 691, 85, // en_TO -> en_001 + 697, 85, // en_TT -> en_001 + 703, 85, // en_TV -> en_001 + 709, 85, // en_TZ -> en_001 + 715, 92, // en_UA -> en_150 + 721, 85, // en_UG -> en_001 + 727, 85, // en_VC -> en_001 + 733, 85, // en_VG -> en_001 + 739, 85, // en_VU -> en_001 + 745, 85, // en_WS -> en_001 + 751, 85, // en_ZA -> en_001 + 757, 85, // en_ZM -> en_001 + 763, 85, // en_ZW -> en_001 + 776, 769, // es_AR -> es_419 + 782, 769, // es_BO -> es_419 + 788, 769, // es_BR -> es_419 + 794, 769, // es_BZ -> es_419 + 800, 769, // es_CL -> es_419 + 806, 769, // es_CO -> es_419 + 812, 769, // es_CR -> es_419 + 818, 769, // es_CU -> es_419 + 824, 769, // es_DO -> es_419 + 830, 769, // es_EC -> es_419 + 836, 769, // es_GT -> es_419 + 842, 769, // es_HN -> es_419 + 848, 769, // es_JP -> es_419 + 854, 769, // es_MX -> es_419 + 860, 769, // es_NI -> es_419 + 866, 769, // es_PA -> es_419 + 872, 769, // es_PE -> es_419 + 878, 769, // es_PR -> es_419 + 884, 769, // es_PY -> es_419 + 890, 769, // es_SV -> es_419 + 896, 769, // es_US -> es_419 + 902, 769, // es_UY -> es_419 + 908, 769, // es_VE -> es_419 + 914, 1176, // ff_Adlm -> root + 922, 1176, // ff_Arab -> root + 936, 1176, // ha_Arab -> root + 944, 371, // hi_Latn -> en_IN + 952, 930, // ht -> fr_HT + 955, 1176, // iu_Latn -> root + 963, 1176, // kaa_Latn -> root + 972, 1176, // kk_Arab -> root + 980, 1176, // kok_Latn -> root + 989, 1176, // ks_Deva -> root + 997, 1176, // ku_Arab -> root + 1005, 1176, // kxv_Deva -> root + 1014, 1176, // kxv_Orya -> root + 1023, 1176, // kxv_Telu -> root + 1032, 1176, // ky_Arab -> root + 1040, 1176, // ky_Latn -> root + 1048, 1176, // ml_Arab -> root + 1056, 1176, // mn_Mong -> root + 1064, 1176, // mni_Mtei -> root + 1073, 1176, // ms_Arab -> root + 1081, 1087, // nb -> no + 1084, 1087, // nn -> no + 1090, 1087, // no_NO -> no + 1096, 1176, // pa_Arab -> root + 1104, 1158, // pt_AO -> pt_PT + 1110, 1158, // pt_CH -> pt_PT + 1116, 1158, // pt_CV -> pt_PT + 1122, 1158, // pt_FR -> pt_PT + 1128, 1158, // pt_GQ -> pt_PT + 1134, 1158, // pt_GW -> pt_PT + 1140, 1158, // pt_LU -> pt_PT + 1146, 1158, // pt_MO -> pt_PT + 1152, 1158, // pt_MZ -> pt_PT + 1164, 1158, // pt_ST -> pt_PT + 1170, 1158, // pt_TL -> pt_PT + 1181, 1176, // sat_Deva -> root + 1190, 1176, // sd_Deva -> root + 1198, 1176, // sd_Khoj -> root + 1206, 1176, // sd_Sind -> root + 1214, 1176, // shi_Latn -> root + 1223, 1176, // so_Arab -> root + 1231, 1176, // sr_Latn -> root + 1239, 1176, // suz_Sunu -> root + 1248, 1176, // sw_Arab -> root + 1256, 1176, // tg_Arab -> root + 1264, 1176, // ug_Cyrl -> root + 1272, 1176, // uz_Arab -> root + 1280, 1176, // uz_Cyrl -> root + 1288, 1176, // vai_Latn -> root + 1297, 1176, // wo_Arab -> root + 1305, 1176, // yo_Arab -> root + 1313, 1176, // yue_Hans -> root + 1322, 1176, // zh_Hant -> root + 1341, 1330, // zh_Hant_MO -> zh_Hant_HK }; diff --git a/deps/icu-small/source/common/localematcher.cpp b/deps/icu-small/source/common/localematcher.cpp index 6fc578af118bc0..1e74dd1f1493b7 100644 --- a/deps/icu-small/source/common/localematcher.cpp +++ b/deps/icu-small/source/common/localematcher.cpp @@ -4,6 +4,8 @@ // localematcher.cpp // created: 2019may08 Markus W. Scherer +#include <optional> + #include "unicode/utypes.h" #include "unicode/localebuilder.h" #include "unicode/localematcher.h" @@ -302,7 +304,7 @@ LocaleMatcher LocaleMatcher::Builder::build(UErrorCode &errorCode) const { namespace { -LSR getMaximalLsrOrUnd(const XLikelySubtags &likelySubtags, const Locale &locale, +LSR getMaximalLsrOrUnd(const LikelySubtags &likelySubtags, const Locale &locale, UErrorCode &errorCode) { if (U_FAILURE(errorCode) || locale.isBogus() || *locale.getName() == 0 /* "und" */) { return UND_LSR; @@ -338,7 +340,7 @@ int32_t LocaleMatcher::putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength } LocaleMatcher::LocaleMatcher(const Builder &builder, UErrorCode &errorCode) : - likelySubtags(*XLikelySubtags::getSingleton(errorCode)), + likelySubtags(*LikelySubtags::getSingleton(errorCode)), localeDistance(*LocaleDistance::getSingleton(errorCode)), thresholdDistance(builder.thresholdDistance_), demotionPerDesiredLocale(0), @@ -551,7 +553,7 @@ LocaleMatcher &LocaleMatcher::operator=(LocaleMatcher &&src) noexcept { class LocaleLsrIterator { public: - LocaleLsrIterator(const XLikelySubtags &likelySubtags, Locale::Iterator &locales, + LocaleLsrIterator(const LikelySubtags &likelySubtags, Locale::Iterator &locales, ULocMatchLifetime lifetime) : likelySubtags(likelySubtags), locales(locales), lifetime(lifetime) {} @@ -596,7 +598,7 @@ class LocaleLsrIterator { } private: - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; Locale::Iterator &locales; ULocMatchLifetime lifetime; const Locale *current = nullptr, *remembered = nullptr; @@ -605,10 +607,11 @@ class LocaleLsrIterator { const Locale *LocaleMatcher::getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const { if (U_FAILURE(errorCode)) { return nullptr; } - int32_t suppIndex = getBestSuppIndex( + std::optional<int32_t> suppIndex = getBestSuppIndex( getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode), nullptr, errorCode); - return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale; + return U_SUCCESS(errorCode) && suppIndex.has_value() ? supportedLocales[*suppIndex] + : defaultLocale; } const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, @@ -618,12 +621,14 @@ const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, return defaultLocale; } LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES); - int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); - return U_SUCCESS(errorCode) && suppIndex >= 0 ? supportedLocales[suppIndex] : defaultLocale; + std::optional<int32_t> suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); + return U_SUCCESS(errorCode) && suppIndex.has_value() ? supportedLocales[*suppIndex] + : defaultLocale; } const Locale *LocaleMatcher::getBestMatchForListString( StringPiece desiredLocaleList, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return nullptr; } LocalePriorityList list(desiredLocaleList, errorCode); LocalePriorityList::Iterator iter = list.iterator(); return getBestMatch(iter, errorCode); @@ -634,13 +639,13 @@ LocaleMatcher::Result LocaleMatcher::getBestMatchResult( if (U_FAILURE(errorCode)) { return Result(nullptr, defaultLocale, -1, -1, false); } - int32_t suppIndex = getBestSuppIndex( + std::optional<int32_t> suppIndex = getBestSuppIndex( getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode), nullptr, errorCode); - if (U_FAILURE(errorCode) || suppIndex < 0) { + if (U_FAILURE(errorCode) || !suppIndex.has_value()) { return Result(nullptr, defaultLocale, -1, -1, false); } else { - return Result(&desiredLocale, supportedLocales[suppIndex], 0, suppIndex, false); + return Result(&desiredLocale, supportedLocales[*suppIndex], 0, *suppIndex, false); } } @@ -650,18 +655,19 @@ LocaleMatcher::Result LocaleMatcher::getBestMatchResult( return Result(nullptr, defaultLocale, -1, -1, false); } LocaleLsrIterator lsrIter(likelySubtags, desiredLocales, ULOCMATCH_TEMPORARY_LOCALES); - int32_t suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); - if (U_FAILURE(errorCode) || suppIndex < 0) { + std::optional<int32_t> suppIndex = getBestSuppIndex(lsrIter.next(errorCode), &lsrIter, errorCode); + if (U_FAILURE(errorCode) || !suppIndex.has_value()) { return Result(nullptr, defaultLocale, -1, -1, false); } else { - return Result(lsrIter.orphanRemembered(), supportedLocales[suppIndex], - lsrIter.getBestDesiredIndex(), suppIndex, true); + return Result(lsrIter.orphanRemembered(), supportedLocales[*suppIndex], + lsrIter.getBestDesiredIndex(), *suppIndex, true); } } -int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { return -1; } +std::optional<int32_t> LocaleMatcher::getBestSuppIndex(LSR desiredLSR, + LocaleLsrIterator *remainingIter, + UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return std::nullopt; } int32_t desiredIndex = 0; int32_t bestSupportedLsrIndex = -1; for (int32_t bestShiftedDistance = LocaleDistance::shiftDistance(thresholdDistance);;) { @@ -684,7 +690,7 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai bestShiftedDistance = LocaleDistance::getShiftedDistance(bestIndexAndDistance); if (remainingIter != nullptr) { remainingIter->rememberCurrent(desiredIndex, errorCode); - if (U_FAILURE(errorCode)) { return -1; } + if (U_FAILURE(errorCode)) { return std::nullopt; } } bestSupportedLsrIndex = LocaleDistance::getIndex(bestIndexAndDistance); } @@ -695,20 +701,21 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai break; } desiredLSR = remainingIter->next(errorCode); - if (U_FAILURE(errorCode)) { return -1; } + if (U_FAILURE(errorCode)) { return std::nullopt; } ++desiredIndex; } if (bestSupportedLsrIndex < 0) { // no good match - return -1; + return std::nullopt; } return supportedIndexes[bestSupportedLsrIndex]; } UBool LocaleMatcher::isMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return false; } LSR suppLSR = getMaximalLsrOrUnd(likelySubtags, supported, errorCode); - if (U_FAILURE(errorCode)) { return 0; } + if (U_FAILURE(errorCode)) { return false; } const LSR *pSuppLSR = &suppLSR; int32_t indexAndDistance = localeDistance.getBestIndexAndDistance( getMaximalLsrOrUnd(likelySubtags, desired, errorCode), @@ -718,9 +725,10 @@ UBool LocaleMatcher::isMatch(const Locale &desired, const Locale &supported, } double LocaleMatcher::internalMatch(const Locale &desired, const Locale &supported, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return 0.; } // Returns the inverse of the distance: That is, 1-distance(desired, supported). LSR suppLSR = getMaximalLsrOrUnd(likelySubtags, supported, errorCode); - if (U_FAILURE(errorCode)) { return 0; } + if (U_FAILURE(errorCode)) { return 0.; } const LSR *pSuppLSR = &suppLSR; int32_t indexAndDistance = localeDistance.getBestIndexAndDistance( getMaximalLsrOrUnd(likelySubtags, desired, errorCode), @@ -772,7 +780,7 @@ int32_t acceptLanguage(UEnumeration &supportedLocales, Locale::Iterator &desired ULOC_ACCEPT_VALID : ULOC_ACCEPT_FALLBACK; } const char *bestStr = result.getSupportedLocale()->getName(); - int32_t bestLength = (int32_t)uprv_strlen(bestStr); + int32_t bestLength = static_cast<int32_t>(uprv_strlen(bestStr)); if (bestLength <= capacity) { uprv_memcpy(dest, bestStr, bestLength); } diff --git a/deps/icu-small/source/common/localeprioritylist.cpp b/deps/icu-small/source/common/localeprioritylist.cpp index e5ba0a3c777aea..8ca70b143240a3 100644 --- a/deps/icu-small/source/common/localeprioritylist.cpp +++ b/deps/icu-small/source/common/localeprioritylist.cpp @@ -21,13 +21,13 @@ U_NAMESPACE_BEGIN namespace { int32_t hashLocale(const UHashTok token) { - auto *locale = static_cast<const Locale *>(token.pointer); + const auto* locale = static_cast<const Locale*>(token.pointer); return locale->hashCode(); } UBool compareLocales(const UHashTok t1, const UHashTok t2) { - auto *l1 = static_cast<const Locale *>(t1.pointer); - auto *l2 = static_cast<const Locale *>(t2.pointer); + const auto* l1 = static_cast<const Locale*>(t1.pointer); + const auto* l2 = static_cast<const Locale*>(t2.pointer); return *l1 == *l2; } diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 0ea20939888d0c..4a2600e88c5916 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -39,14 +39,10 @@ static icu::Locale* availableLocaleList = nullptr; static int32_t availableLocaleListCount; static icu::UInitOnce gInitOnceLocale {}; -U_NAMESPACE_END - -U_CDECL_BEGIN +namespace { -static UBool U_CALLCONV locale_available_cleanup() +UBool U_CALLCONV locale_available_cleanup() { - U_NAMESPACE_USE - if (availableLocaleList) { delete []availableLocaleList; availableLocaleList = nullptr; @@ -57,9 +53,7 @@ static UBool U_CALLCONV locale_available_cleanup() return true; } -U_CDECL_END - -U_NAMESPACE_BEGIN +} // namespace void U_CALLCONV locale_available_init() { // This function is a friend of class Locale. @@ -107,10 +101,9 @@ icu::UInitOnce ginstalledLocalesInitOnce {}; class AvailableLocalesSink : public ResourceSink { public: void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override { + if (U_FAILURE(status)) { return; } ResourceTable resIndexTable = value.getTable(status); - if (U_FAILURE(status)) { - return; - } + if (U_FAILURE(status)) { return; } for (int32_t i = 0; resIndexTable.getKeyAndValue(i, key, value); ++i) { ULocAvailableType type; if (uprv_strcmp(key, "InstalledLocales") == 0) { @@ -144,7 +137,8 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { AvailableLocalesStringEnumeration(ULocAvailableType type) : fType(type) { } - const char* next(int32_t *resultLength, UErrorCode&) override { + const char* next(int32_t *resultLength, UErrorCode &status) override { + if (U_FAILURE(status)) { return nullptr; } ULocAvailableType actualType = fType; int32_t actualIndex = fIndex++; @@ -176,11 +170,13 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { return result; } - void reset(UErrorCode&) override { + void reset(UErrorCode &status) override { + if (U_FAILURE(status)) { return; } fIndex = 0; } - int32_t count(UErrorCode&) const override { + int32_t count(UErrorCode &status) const override { + if (U_FAILURE(status)) { return 0; } if (fType == ULOC_AVAILABLE_WITH_LEGACY_ALIASES) { return gAvailableLocaleCounts[ULOC_AVAILABLE_DEFAULT] + gAvailableLocaleCounts[ULOC_AVAILABLE_ONLY_LEGACY_ALIASES]; @@ -196,7 +192,7 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { /* ### Get available **************************************************/ -static UBool U_CALLCONV uloc_cleanup() { +UBool U_CALLCONV uloc_cleanup() { for (int32_t i = 0; i < UPRV_LENGTHOF(gAvailableLocaleNames); i++) { uprv_free(gAvailableLocaleNames[i]); gAvailableLocaleNames[i] = nullptr; @@ -209,7 +205,7 @@ static UBool U_CALLCONV uloc_cleanup() { // Load Installed Locales. This function will be called exactly once // via the initOnce mechanism. -static void U_CALLCONV loadInstalledLocales(UErrorCode& status) { +void U_CALLCONV loadInstalledLocales(UErrorCode& status) { ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); icu::LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "res_index", &status)); @@ -267,4 +263,3 @@ uloc_openAvailableByType(ULocAvailableType type, UErrorCode* status) { } return uenum_openFromStringEnumeration(result.orphan(), status); } - diff --git a/deps/icu-small/source/common/locbased.cpp b/deps/icu-small/source/common/locbased.cpp index adcf2f843c0b26..b661cc46278591 100644 --- a/deps/icu-small/source/common/locbased.cpp +++ b/deps/icu-small/source/common/locbased.cpp @@ -11,18 +11,14 @@ ********************************************************************** */ #include "locbased.h" -#include "cstring.h" +#include "uresimp.h" U_NAMESPACE_BEGIN -Locale LocaleBased::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - const char* id = getLocaleID(type, status); - return Locale((id != 0) ? id : ""); -} - -const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { +const Locale& LocaleBased::getLocale(const Locale& valid, const Locale& actual, + ULocDataLocaleType type, UErrorCode& status) { if (U_FAILURE(status)) { - return nullptr; + return Locale::getRoot(); } switch(type) { @@ -32,24 +28,19 @@ const char* LocaleBased::getLocaleID(ULocDataLocaleType type, UErrorCode& status return actual; default: status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; + return Locale::getRoot(); } } -void LocaleBased::setLocaleIDs(const char* validID, const char* actualID) { - if (validID != 0) { - uprv_strncpy(valid, validID, ULOC_FULLNAME_CAPACITY); - valid[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate - } - if (actualID != 0) { - uprv_strncpy(actual, actualID, ULOC_FULLNAME_CAPACITY); - actual[ULOC_FULLNAME_CAPACITY-1] = 0; // always terminate +const char* LocaleBased::getLocaleID(const Locale& valid, const Locale& actual, + ULocDataLocaleType type, UErrorCode& status) { + const Locale& locale = getLocale(valid, actual, type, status); + + if (U_FAILURE(status)) { + return nullptr; } -} -void LocaleBased::setLocaleIDs(const Locale& validID, const Locale& actualID) { - uprv_strcpy(valid, validID.getName()); - uprv_strcpy(actual, actualID.getName()); + return locale == Locale::getRoot() ? kRootLocaleName : locale.getName(); } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/locbased.h b/deps/icu-small/source/common/locbased.h index 45738863b5ec96..dbff148bcd08cb 100644 --- a/deps/icu-small/source/common/locbased.h +++ b/deps/icu-small/source/common/locbased.h @@ -16,14 +16,6 @@ #include "unicode/locid.h" #include "unicode/uobject.h" -/** - * Macro to declare a locale LocaleBased wrapper object for the given - * object, which must have two members named `validLocale' and - * `actualLocale' of size ULOC_FULLNAME_CAPACITY - */ -#define U_LOCALE_BASED(varname, objname) \ - LocaleBased varname((objname).validLocale, (objname).actualLocale) - U_NAMESPACE_BEGIN /** @@ -37,71 +29,36 @@ class U_COMMON_API LocaleBased : public UMemory { public: - /** - * Construct a LocaleBased wrapper around the two pointers. These - * will be aliased for the lifetime of this object. - */ - inline LocaleBased(char* validAlias, char* actualAlias); - - /** - * Construct a LocaleBased wrapper around the two const pointers. - * These will be aliased for the lifetime of this object. - */ - inline LocaleBased(const char* validAlias, const char* actualAlias); - /** * Return locale meta-data for the service object wrapped by this * object. Either the valid or the actual locale may be * retrieved. + * @param valid The valid locale. + * @param actual The actual locale. * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE * @param status input-output error code * @return the indicated locale */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + static const Locale& getLocale( + const Locale& valid, const Locale& actual, + ULocDataLocaleType type, UErrorCode& status); /** * Return the locale ID for the service object wrapped by this * object. Either the valid or the actual locale may be * retrieved. + * @param valid The valid locale. + * @param actual The actual locale. * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE * @param status input-output error code * @return the indicated locale ID */ - const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + static const char* getLocaleID( + const Locale& valid, const Locale& actual, + ULocDataLocaleType type, UErrorCode& status); - /** - * Set the locale meta-data for the service object wrapped by this - * object. If either parameter is zero, it is ignored. - * @param valid the ID of the valid locale - * @param actual the ID of the actual locale - */ - void setLocaleIDs(const char* valid, const char* actual); - - /** - * Set the locale meta-data for the service object wrapped by this - * object. - * @param valid the ID of the valid locale - * @param actual the ID of the actual locale - */ - void setLocaleIDs(const Locale& valid, const Locale& actual); - - private: - - char* valid; - - char* actual; }; -inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) : - valid(validAlias), actual(actualAlias) { -} - -inline LocaleBased::LocaleBased(const char* validAlias, - const char* actualAlias) : - // ugh: cast away const - valid((char*)validAlias), actual((char*)actualAlias) { -} - U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 3ec1b81c8127ab..3051798b78bc09 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -19,6 +19,8 @@ * that then do not depend on resource bundle code and display name data. */ +#include <string_view> + #include "unicode/utypes.h" #include "unicode/brkiter.h" #include "unicode/locid.h" @@ -26,7 +28,6 @@ #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/ustring.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -60,24 +61,24 @@ Locale::getDisplayLanguage(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } - length=uloc_getDisplayLanguage(fullName, displayLocale.fullName, + length=uloc_getDisplayLanguage(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } errorCode=U_ZERO_ERROR; - length=uloc_getDisplayLanguage(fullName, displayLocale.fullName, + length=uloc_getDisplayLanguage(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); @@ -100,24 +101,24 @@ Locale::getDisplayScript(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } - length=uloc_getDisplayScript(fullName, displayLocale.fullName, + length=uloc_getDisplayScript(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } errorCode=U_ZERO_ERROR; - length=uloc_getDisplayScript(fullName, displayLocale.fullName, + length=uloc_getDisplayScript(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); @@ -140,24 +141,24 @@ Locale::getDisplayCountry(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } - length=uloc_getDisplayCountry(fullName, displayLocale.fullName, + length=uloc_getDisplayCountry(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } errorCode=U_ZERO_ERROR; - length=uloc_getDisplayCountry(fullName, displayLocale.fullName, + length=uloc_getDisplayCountry(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); @@ -180,24 +181,24 @@ Locale::getDisplayVariant(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } - length=uloc_getDisplayVariant(fullName, displayLocale.fullName, + length=uloc_getDisplayVariant(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } errorCode=U_ZERO_ERROR; - length=uloc_getDisplayVariant(fullName, displayLocale.fullName, + length=uloc_getDisplayVariant(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); @@ -220,24 +221,24 @@ Locale::getDisplayName(const Locale &displayLocale, int32_t length; buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } - length=uloc_getDisplayName(fullName, displayLocale.fullName, + length=uloc_getDisplayName(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { buffer=result.getBuffer(length); - if(buffer==0) { + if (buffer == nullptr) { result.truncate(0); return result; } errorCode=U_ZERO_ERROR; - length=uloc_getDisplayName(fullName, displayLocale.fullName, + length=uloc_getDisplayName(getName(), displayLocale.getName(), buffer, result.getCapacity(), &errorCode); result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0); @@ -246,7 +247,7 @@ Locale::getDisplayName(const Locale &displayLocale, return result; } -#if ! UCONFIG_NO_BREAK_ITERATION +#if !UCONFIG_NO_BREAK_ITERATION // ------------------------------------- // Gets the objectLocale display name in the default locale language. @@ -276,50 +277,53 @@ U_NAMESPACE_END U_NAMESPACE_USE +namespace { + /* ### Constants **************************************************/ /* These strings describe the resources we attempt to load from the locale ResourceBundle data file.*/ -static const char _kLanguages[] = "Languages"; -static const char _kScripts[] = "Scripts"; -static const char _kScriptsStandAlone[] = "Scripts%stand-alone"; -static const char _kCountries[] = "Countries"; -static const char _kVariants[] = "Variants"; -static const char _kKeys[] = "Keys"; -static const char _kTypes[] = "Types"; -//static const char _kRootName[] = "root"; -static const char _kCurrency[] = "currency"; -static const char _kCurrencies[] = "Currencies"; -static const char _kLocaleDisplayPattern[] = "localeDisplayPattern"; -static const char _kPattern[] = "pattern"; -static const char _kSeparator[] = "separator"; +constexpr char _kLanguages[] = "Languages"; +constexpr char _kScripts[] = "Scripts"; +constexpr char _kScriptsStandAlone[] = "Scripts%stand-alone"; +constexpr char _kCountries[] = "Countries"; +constexpr char _kVariants[] = "Variants"; +constexpr char _kKeys[] = "Keys"; +constexpr char _kTypes[] = "Types"; +//constexpr char _kRootName[] = "root"; +constexpr char _kCurrency[] = "currency"; +constexpr char _kCurrencies[] = "Currencies"; +constexpr char _kLocaleDisplayPattern[] = "localeDisplayPattern"; +constexpr char _kPattern[] = "pattern"; +constexpr char _kSeparator[] = "separator"; /* ### Display name **************************************************/ -static int32_t +int32_t _getStringOrCopyKey(const char *path, const char *locale, const char *tableKey, const char* subTableKey, const char *itemKey, const char *substitute, char16_t *dest, int32_t destCapacity, - UErrorCode *pErrorCode) { + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return 0; } const char16_t *s = nullptr; int32_t length = 0; if(itemKey==nullptr) { /* top-level item: normal resource bundle access */ - icu::LocalUResourceBundlePointer rb(ures_open(path, locale, pErrorCode)); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); - if(U_SUCCESS(*pErrorCode)) { - s=ures_getStringByKey(rb.getAlias(), tableKey, &length, pErrorCode); + if(U_SUCCESS(errorCode)) { + s=ures_getStringByKey(rb.getAlias(), tableKey, &length, &errorCode); /* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */ } } else { bool isLanguageCode = (uprv_strncmp(tableKey, _kLanguages, 9) == 0); /* Language code should not be a number. If it is, set the error code. */ if (isLanguageCode && uprv_strtol(itemKey, nullptr, 10)) { - *pErrorCode = U_MISSING_RESOURCE_ERROR; + errorCode = U_MISSING_RESOURCE_ERROR; } else { /* second-level item, use special fallback */ s=uloc_getTableStringWithFallback(path, locale, @@ -327,91 +331,91 @@ _getStringOrCopyKey(const char *path, const char *locale, subTableKey, itemKey, &length, - pErrorCode); - if (U_FAILURE(*pErrorCode) && isLanguageCode && itemKey != nullptr) { + &errorCode); + if (U_FAILURE(errorCode) && isLanguageCode && itemKey != nullptr) { // convert itemKey locale code to canonical form and try again, ICU-20870 - *pErrorCode = U_ZERO_ERROR; + errorCode = U_ZERO_ERROR; Locale canonKey = Locale::createCanonical(itemKey); s=uloc_getTableStringWithFallback(path, locale, tableKey, subTableKey, canonKey.getName(), &length, - pErrorCode); + &errorCode); } } } - if(U_SUCCESS(*pErrorCode)) { + if(U_SUCCESS(errorCode)) { int32_t copyLength=uprv_min(length, destCapacity); if(copyLength>0 && s != nullptr) { u_memcpy(dest, s, copyLength); } } else { /* no string from a resource bundle: convert the substitute */ - length=(int32_t)uprv_strlen(substitute); + length = static_cast<int32_t>(uprv_strlen(substitute)); u_charsToUChars(substitute, dest, uprv_min(length, destCapacity)); - *pErrorCode=U_USING_DEFAULT_WARNING; + errorCode = U_USING_DEFAULT_WARNING; } - return u_terminateUChars(dest, destCapacity, length, pErrorCode); + return u_terminateUChars(dest, destCapacity, length, &errorCode); } -typedef int32_t U_CALLCONV UDisplayNameGetter(const char *, char *, int32_t, UErrorCode *); +using UDisplayNameGetter = icu::CharString(std::string_view, UErrorCode&); -static int32_t +int32_t _getDisplayNameForComponent(const char *locale, const char *displayLocale, char16_t *dest, int32_t destCapacity, UDisplayNameGetter *getter, const char *tag, - UErrorCode *pErrorCode) { - char localeBuffer[ULOC_FULLNAME_CAPACITY*4]; - int32_t length; + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return 0; } UErrorCode localStatus; const char* root = nullptr; - /* argument checking */ - if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) { + if(destCapacity<0 || (destCapacity>0 && dest==nullptr)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - if(destCapacity<0 || (destCapacity>0 && dest==nullptr)) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + if (locale == nullptr) { + locale = uloc_getDefault(); } localStatus = U_ZERO_ERROR; - length=(*getter)(locale, localeBuffer, sizeof(localeBuffer), &localStatus); - if(U_FAILURE(localStatus) || localStatus==U_STRING_NOT_TERMINATED_WARNING) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + icu::CharString localeBuffer = (*getter)(locale, localStatus); + if (U_FAILURE(localStatus)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - if(length==0) { + if (localeBuffer.isEmpty()) { // For the display name, we treat this as unknown language (ICU-20273). - if (getter == uloc_getLanguage) { - uprv_strcpy(localeBuffer, "und"); + if (getter == ulocimp_getLanguage) { + localeBuffer.append("und", errorCode); } else { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + return u_terminateUChars(dest, destCapacity, 0, &errorCode); } } root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG; return _getStringOrCopyKey(root, displayLocale, - tag, nullptr, localeBuffer, - localeBuffer, + tag, nullptr, localeBuffer.data(), + localeBuffer.data(), dest, destCapacity, - pErrorCode); + errorCode); } +} // namespace + U_CAPI int32_t U_EXPORT2 uloc_getDisplayLanguage(const char *locale, const char *displayLocale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getLanguage, _kLanguages, pErrorCode); + ulocimp_getLanguage, _kLanguages, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -420,19 +424,20 @@ uloc_getDisplayScript(const char* locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return 0; } UErrorCode err = U_ZERO_ERROR; int32_t res = _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScriptsStandAlone, &err); + ulocimp_getScript, _kScriptsStandAlone, err); if (destCapacity == 0 && err == U_BUFFER_OVERFLOW_ERROR) { // For preflight, return the max of the value and the fallback. int32_t fallback_res = _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); return (fallback_res > res) ? fallback_res : res; } if ( err == U_USING_DEFAULT_WARNING ) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); } else { *pErrorCode = err; return res; @@ -446,7 +451,7 @@ uloc_getDisplayScriptInContext(const char* locale, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getScript, _kScripts, pErrorCode); + ulocimp_getScript, _kScripts, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -455,7 +460,7 @@ uloc_getDisplayCountry(const char *locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getCountry, _kCountries, pErrorCode); + ulocimp_getRegion, _kCountries, *pErrorCode); } /* @@ -469,7 +474,7 @@ uloc_getDisplayVariant(const char *locale, char16_t *dest, int32_t destCapacity, UErrorCode *pErrorCode) { return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity, - uloc_getVariant, _kVariants, pErrorCode); + ulocimp_getVariant, _kVariants, *pErrorCode); } /* Instead of having a separate pass for 'special' patterns, reintegrate the two @@ -809,7 +814,7 @@ uloc_getDisplayKeyword(const char* keyword, keyword, keyword, dest, destCapacity, - status); + *status); } @@ -837,9 +842,8 @@ uloc_getDisplayKeywordValue( const char* locale, /* get the keyword value */ CharString keywordValue; - { - CharStringByteSink sink(&keywordValue); - ulocimp_getKeywordValue(locale, keyword, sink, status); + if (keyword != nullptr && *keyword != '\0') { + keywordValue = ulocimp_getKeywordValue(locale, keyword, *status); } /* @@ -897,6 +901,6 @@ uloc_getDisplayKeywordValue( const char* locale, keywordValue.data(), keywordValue.data(), dest, destCapacity, - status); + *status); } } diff --git a/deps/icu-small/source/common/locdistance.cpp b/deps/icu-small/source/common/locdistance.cpp index fb22fe79ed36a2..4dbfcc0095c848 100644 --- a/deps/icu-small/source/common/locdistance.cpp +++ b/deps/icu-small/source/common/locdistance.cpp @@ -59,7 +59,7 @@ UBool U_CALLCONV cleanup() { void U_CALLCONV LocaleDistance::initLocaleDistance(UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). U_ASSERT(gLocaleDistance == nullptr); - const XLikelySubtags &likely = *XLikelySubtags::getSingleton(errorCode); + const LikelySubtags &likely = *LikelySubtags::getSingleton(errorCode); if (U_FAILURE(errorCode)) { return; } const LocaleDistanceData &data = likely.getDistanceData(); if (data.distanceTrieBytes == nullptr || @@ -83,7 +83,7 @@ const LocaleDistance *LocaleDistance::getSingleton(UErrorCode &errorCode) { return gLocaleDistance; } -LocaleDistance::LocaleDistance(const LocaleDistanceData &data, const XLikelySubtags &likely) : +LocaleDistance::LocaleDistance(const LocaleDistanceData &data, const LikelySubtags &likely) : likelySubtags(likely), trie(data.distanceTrieBytes), regionToPartitionsIndex(data.regionToPartitions), partitionArrays(data.partitions), @@ -119,7 +119,7 @@ int32_t LocaleDistance::getBestIndexAndDistance( uint64_t desLangState = desLangDistance >= 0 && supportedLSRsLength > 1 ? iter.getState64() : 0; // Index of the supported LSR with the lowest distance. int32_t bestIndex = -1; - // Cached lookup info from XLikelySubtags.compareLikely(). + // Cached lookup info from LikelySubtags.compareLikely(). int32_t bestLikelyInfo = -1; for (int32_t slIndex = 0; slIndex < supportedLSRsLength; ++slIndex) { const LSR &supported = *supportedLSRs[slIndex]; @@ -399,7 +399,7 @@ int32_t LocaleDistance::trieNext(BytesTrie &iter, const char *s, bool wantValue) } } -UBool LocaleDistance::isParadigmLSR(const LSR &lsr) const { +bool LocaleDistance::isParadigmLSR(const LSR &lsr) const { // Linear search for a very short list (length 6 as of 2019), // because we look for equivalence not equality, and // because it's easy. diff --git a/deps/icu-small/source/common/locdistance.h b/deps/icu-small/source/common/locdistance.h index 51b777e6272312..952f622e8e267a 100644 --- a/deps/icu-small/source/common/locdistance.h +++ b/deps/icu-small/source/common/locdistance.h @@ -62,7 +62,7 @@ class LocaleDistance final : public UMemory { ULocMatchFavorSubtag favorSubtag, ULocMatchDirection direction) const; - UBool isParadigmLSR(const LSR &lsr) const; + bool isParadigmLSR(const LSR &lsr) const; int32_t getDefaultScriptDistance() const { return defaultScriptDistance; @@ -83,14 +83,14 @@ class LocaleDistance final : public UMemory { // tic constexpr int32_t MAX_INDEX = 0x1fffff; // avoids sign bit static constexpr int32_t INDEX_NEG_1 = 0xfffffc00; - LocaleDistance(const LocaleDistanceData &data, const XLikelySubtags &likely); + LocaleDistance(const LocaleDistanceData &data, const LikelySubtags &likely); LocaleDistance(const LocaleDistance &other) = delete; LocaleDistance &operator=(const LocaleDistance &other) = delete; static void initLocaleDistance(UErrorCode &errorCode); - UBool isMatch(const LSR &desired, const LSR &supported, - int32_t shiftedThreshold, ULocMatchFavorSubtag favorSubtag) const { + bool isMatch(const LSR &desired, const LSR &supported, + int32_t shiftedThreshold, ULocMatchFavorSubtag favorSubtag) const { const LSR *pSupp = &supported; return getBestIndexAndDistance( desired, &pSupp, 1, @@ -119,7 +119,7 @@ class LocaleDistance final : public UMemory { return defaultRegionDistance; } - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; // The trie maps each dlang+slang+dscript+sscript+dregion+sregion // (encoded in ASCII with bit 7 set on the last character of each subtag) to a distance. diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 73fe531c543932..270684341c5ce4 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -18,45 +18,17 @@ #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" #include "unicode/ucurr.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "mutex.h" +#include "uassert.h" #include "ulocimp.h" #include "umutex.h" #include "ureslocs.h" #include "uresimp.h" -#include <stdarg.h> - -/** - * Concatenate a number of null-terminated strings to buffer, leaving a - * null-terminated string. The last argument should be the null pointer. - * Return the length of the string in the buffer, not counting the trailing - * null. Return -1 if there is an error (buffer is null, or buflen < 1). - */ -static int32_t ncat(char *buffer, uint32_t buflen, ...) { - va_list args; - char *str; - char *p = buffer; - const char* e = buffer + buflen - 1; - - if (buffer == nullptr || buflen < 1) { - return -1; - } - - va_start(args, buflen); - while ((str = va_arg(args, char *)) != 0) { - char c; - while (p != e && (c = *str++) != 0) { - *p++ = c; - } - } - *p = 0; - va_end(args); - - return static_cast<int32_t>(p - buffer); -} - U_NAMESPACE_BEGIN //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -64,12 +36,13 @@ U_NAMESPACE_BEGIN // Access resource data for locale components. // Wrap code in uloc.c for now. class ICUDataTable { - const char* path; + const char* const path; Locale locale; public: + // Note: path should be a pointer to a statically allocated string. ICUDataTable(const char* path, const Locale& locale); - ~ICUDataTable(); + ~ICUDataTable() = default; const Locale& getLocale(); @@ -95,23 +68,9 @@ ICUDataTable::getNoFallback(const char* tableKey, const char* itemKey, UnicodeSt } ICUDataTable::ICUDataTable(const char* path, const Locale& locale) - : path(nullptr), locale(Locale::getRoot()) + : path(path), locale(locale) { - if (path) { - int32_t len = static_cast<int32_t>(uprv_strlen(path)); - this->path = (const char*) uprv_malloc(len + 1); - if (this->path) { - uprv_strcpy((char *)this->path, path); - this->locale = locale; - } - } -} - -ICUDataTable::~ICUDataTable() { - if (path) { - uprv_free((void*) path); - path = nullptr; - } + U_ASSERT(path != nullptr); } const Locale& @@ -305,7 +264,7 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { }; // Capitalization transforms. For each usage type, indicates whether to titlecase for // the context specified in capitalizationContext (which we know at construction time) - UBool fCapitalization[kCapContextUsageCount]; + bool fCapitalization[kCapContextUsageCount]; public: // constructor @@ -341,12 +300,12 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { UnicodeString& result, bool substitute) const; UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const; UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const; - UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& regionDisplayName(const char* region, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& variantDisplayName(const char* variant, UnicodeString& result, UBool skipAdjust) const; - UnicodeString& keyDisplayName(const char* key, UnicodeString& result, UBool skipAdjust) const; + UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, bool skipAdjust) const; + UnicodeString& regionDisplayName(const char* region, UnicodeString& result, bool skipAdjust) const; + UnicodeString& variantDisplayName(const char* variant, UnicodeString& result, bool skipAdjust) const; + UnicodeString& keyDisplayName(const char* key, UnicodeString& result, bool skipAdjust) const; UnicodeString& keyValueDisplayName(const char* key, const char* value, - UnicodeString& result, UBool skipAdjust) const; + UnicodeString& result, bool skipAdjust) const; void initialize(); struct CapitalizationContextSink; @@ -377,10 +336,11 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, { while (length-- > 0) { UDisplayContext value = *contexts++; - UDisplayContextType selector = (UDisplayContextType)((uint32_t)value >> 8); + UDisplayContextType selector = + static_cast<UDisplayContextType>(static_cast<uint32_t>(value) >> 8); switch (selector) { case UDISPCTX_TYPE_DIALECT_HANDLING: - dialectHandling = (UDialectHandling)value; + dialectHandling = static_cast<UDialectHandling>(value); break; case UDISPCTX_TYPE_CAPITALIZATION: capitalizationContext = value; @@ -399,7 +359,7 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, } struct LocaleDisplayNamesImpl::CapitalizationContextSink : public ResourceSink { - UBool hasCapitalizationUsage; + bool hasCapitalizationUsage; LocaleDisplayNamesImpl& parent; CapitalizationContextSink(LocaleDisplayNamesImpl& _parent) @@ -448,7 +408,7 @@ LocaleDisplayNamesImpl::CapitalizationContextSink::~CapitalizationContextSink() void LocaleDisplayNamesImpl::initialize() { - LocaleDisplayNamesImpl *nonConstThis = (LocaleDisplayNamesImpl *)this; + LocaleDisplayNamesImpl* nonConstThis = this; nonConstThis->locale = langData.getLocale() == Locale::getRoot() ? regionData.getLocale() : langData.getLocale(); @@ -467,16 +427,16 @@ LocaleDisplayNamesImpl::initialize() { pattern = UnicodeString("{0} ({1})", -1, US_INV); } format.applyPatternMinMaxArguments(pattern, 2, 2, status); - if (pattern.indexOf((char16_t)0xFF08) >= 0) { - formatOpenParen.setTo((char16_t)0xFF08); // fullwidth ( - formatReplaceOpenParen.setTo((char16_t)0xFF3B); // fullwidth [ - formatCloseParen.setTo((char16_t)0xFF09); // fullwidth ) - formatReplaceCloseParen.setTo((char16_t)0xFF3D); // fullwidth ] + if (pattern.indexOf(static_cast<char16_t>(0xFF08)) >= 0) { + formatOpenParen.setTo(static_cast<char16_t>(0xFF08)); // fullwidth ( + formatReplaceOpenParen.setTo(static_cast<char16_t>(0xFF3B)); // fullwidth [ + formatCloseParen.setTo(static_cast<char16_t>(0xFF09)); // fullwidth ) + formatReplaceCloseParen.setTo(static_cast<char16_t>(0xFF3D)); // fullwidth ] } else { - formatOpenParen.setTo((char16_t)0x0028); // ( - formatReplaceOpenParen.setTo((char16_t)0x005B); // [ - formatCloseParen.setTo((char16_t)0x0029); // ) - formatReplaceCloseParen.setTo((char16_t)0x005D); // ] + formatOpenParen.setTo(static_cast<char16_t>(0x0028)); // ( + formatReplaceOpenParen.setTo(static_cast<char16_t>(0x005B)); // [ + formatCloseParen.setTo(static_cast<char16_t>(0x0029)); // ) + formatReplaceCloseParen.setTo(static_cast<char16_t>(0x005D)); // ] } UnicodeString ktPattern; @@ -490,7 +450,7 @@ LocaleDisplayNamesImpl::initialize() { #if !UCONFIG_NO_BREAK_ITERATION // Only get the context data if we need it! This is a const object so we know now... // Also check whether we will need a break iterator (depends on the data) - UBool needBrkIter = false; + bool needBrkIter = false; if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE) { LocalUResourceBundlePointer resource(ures_open(nullptr, locale.getName(), &status)); if (U_FAILURE(status)) { return; } @@ -536,7 +496,7 @@ UDisplayContext LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const { switch (type) { case UDISPCTX_TYPE_DIALECT_HANDLING: - return (UDisplayContext)dialectHandling; + return static_cast<UDisplayContext>(dialectHandling); case UDISPCTX_TYPE_CAPITALIZATION: return capitalizationContext; case UDISPCTX_TYPE_DISPLAY_LENGTH: @@ -546,7 +506,7 @@ LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const { default: break; } - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); } UnicodeString& @@ -582,36 +542,51 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, const char* country = loc.getCountry(); const char* variant = loc.getVariant(); - UBool hasScript = uprv_strlen(script) > 0; - UBool hasCountry = uprv_strlen(country) > 0; - UBool hasVariant = uprv_strlen(variant) > 0; + bool hasScript = uprv_strlen(script) > 0; + bool hasCountry = uprv_strlen(country) > 0; + bool hasVariant = uprv_strlen(variant) > 0; if (dialectHandling == ULDN_DIALECT_NAMES) { - char buffer[ULOC_FULLNAME_CAPACITY]; + UErrorCode status = U_ZERO_ERROR; + CharString buffer; do { // loop construct is so we can break early out of search if (hasScript && hasCountry) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, "_", country, (char *)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasScript = false; - hasCountry = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(script, status) + .append('_', status) + .append(country, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasScript = false; + hasCountry = false; + break; + } } } if (hasScript) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", script, (char *)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasScript = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(script, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasScript = false; + break; + } } } if (hasCountry) { - ncat(buffer, ULOC_FULLNAME_CAPACITY, lang, "_", country, (char*)0); - localeIdName(buffer, resultName, false); - if (!resultName.isBogus()) { - hasCountry = false; - break; + buffer.append(lang, status) + .append('_', status) + .append(country, status); + if (U_SUCCESS(status)) { + localeIdName(buffer.data(), resultName, false); + if (!resultName.isBogus()) { + hasCountry = false; + break; + } } } } while (false); @@ -658,21 +633,19 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, LocalPointer<StringEnumeration> e(loc.createKeywords(status)); if (e.isValid() && U_SUCCESS(status)) { UnicodeString temp2; - char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; - while ((key = e->next((int32_t *)0, status)) != nullptr) { - value[0] = 0; - loc.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { - return result; + while ((key = e->next((int32_t*)nullptr, status)) != nullptr) { + auto value = loc.getKeywordValue<CharString>(key, status); + if (U_FAILURE(status)) { + return result; } keyDisplayName(key, temp, true); temp.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp.findAndReplace(formatCloseParen, formatReplaceCloseParen); - keyValueDisplayName(key, value, temp2, true); + keyValueDisplayName(key, value.data(), temp2, true); temp2.findAndReplace(formatOpenParen, formatReplaceOpenParen); temp2.findAndReplace(formatCloseParen, formatReplaceCloseParen); - if (temp2 != UnicodeString(value, -1, US_INV)) { + if (temp2 != UnicodeString(value.data(), -1, US_INV)) { appendWithSep(resultRemainder, temp2); } else if (temp != UnicodeString(key, -1, US_INV)) { UnicodeString temp3; @@ -680,7 +653,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, appendWithSep(resultRemainder, temp3); } else { appendWithSep(resultRemainder, temp) - .append((char16_t)0x3d /* = */) + .append(static_cast<char16_t>(0x3d) /* = */) .append(temp2); } } @@ -779,7 +752,7 @@ LocaleDisplayNamesImpl::languageDisplayName(const char* lang, UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(const char* script, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { langData.getNoFallback("Scripts%short", script, result); if (!result.isBogus()) { @@ -809,7 +782,7 @@ LocaleDisplayNamesImpl::scriptDisplayName(UScriptCode scriptCode, UnicodeString& LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { regionData.getNoFallback("Countries%short", region, result); if (!result.isBogus()) { @@ -834,7 +807,7 @@ LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { // don't have a resource for short variant names if (substitute == UDISPCTX_SUBSTITUTE) { langData.get("Variants", variant, result); @@ -853,7 +826,7 @@ LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& LocaleDisplayNamesImpl::keyDisplayName(const char* key, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { // don't have a resource for short key names if (substitute == UDISPCTX_SUBSTITUTE) { langData.get("Keys", key, result); @@ -873,7 +846,7 @@ UnicodeString& LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, const char* value, UnicodeString& result, - UBool skipAdjust) const { + bool skipAdjust) const { if (uprv_strcmp(key, "currency") == 0) { // ICU4C does not have ICU4J CurrencyDisplayInfo equivalent for now. UErrorCode sts = U_ZERO_ERROR; @@ -939,7 +912,7 @@ uldn_open(const char * locale, UDialectHandling dialectHandling, UErrorCode *pErrorCode) { if (U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if (locale == nullptr) { locale = uloc_getDefault(); @@ -952,7 +925,7 @@ uldn_openForContext(const char * locale, UDisplayContext *contexts, int32_t length, UErrorCode *pErrorCode) { if (U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if (locale == nullptr) { locale = uloc_getDefault(); diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index 64ff63f3611f58..34f1266f60694c 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -31,11 +31,16 @@ ****************************************************************************** */ +#include <cstddef> +#include <optional> +#include <string_view> +#include <type_traits> #include <utility> #include "unicode/bytestream.h" #include "unicode/locid.h" #include "unicode/localebuilder.h" +#include "unicode/localpointer.h" #include "unicode/strenum.h" #include "unicode/stringpiece.h" #include "unicode/uloc.h" @@ -46,6 +51,7 @@ #include "charstrmap.h" #include "cmemory.h" #include "cstring.h" +#include "fixedstring.h" #include "mutex.h" #include "putilimp.h" #include "uassert.h" @@ -57,10 +63,6 @@ #include "ustr_imp.h" #include "uvector.h" -U_CDECL_BEGIN -static UBool U_CALLCONV locale_cleanup(); -U_CDECL_END - U_NAMESPACE_BEGIN static Locale *gLocaleCache = nullptr; @@ -106,16 +108,17 @@ typedef enum ELocalePos { eMAX_LOCALES } ELocalePos; -U_CDECL_BEGIN +namespace { + // // Deleter function for Locales owned by the default Locale hash table/ // -static void U_CALLCONV +void U_CALLCONV deleteLocale(void *obj) { - delete (icu::Locale *) obj; + delete static_cast<icu::Locale*>(obj); } -static UBool U_CALLCONV locale_cleanup() +UBool U_CALLCONV locale_cleanup() { U_NAMESPACE_USE @@ -131,12 +134,11 @@ static UBool U_CALLCONV locale_cleanup() return true; } - -static void U_CALLCONV locale_init(UErrorCode &status) { +void U_CALLCONV locale_init(UErrorCode &status) { U_NAMESPACE_USE U_ASSERT(gLocaleCache == nullptr); - gLocaleCache = new Locale[(int)eMAX_LOCALES]; + gLocaleCache = new Locale[static_cast<int>(eMAX_LOCALES)]; if (gLocaleCache == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; @@ -163,7 +165,7 @@ static void U_CALLCONV locale_init(UErrorCode &status) { gLocaleCache[eCANADA_FRENCH] = Locale("fr", "CA"); } -U_CDECL_END +} // namespace U_NAMESPACE_BEGIN @@ -182,15 +184,8 @@ Locale *locale_set_default_internal(const char *id, UErrorCode& status) { canonicalize = true; // always canonicalize host ID } - CharString localeNameBuf; - { - CharStringByteSink sink(&localeNameBuf); - if (canonicalize) { - ulocimp_canonicalize(id, sink, &status); - } else { - ulocimp_getName(id, sink, &status); - } - } + CharString localeNameBuf = + canonicalize ? ulocimp_canonicalize(id, status) : ulocimp_getName(id, status); if (U_FAILURE(status)) { return gDefaultLocale; @@ -205,7 +200,7 @@ Locale *locale_set_default_internal(const char *id, UErrorCode& status) { ucln_common_registerCleanup(UCLN_COMMON_LOCALE, locale_cleanup); } - Locale *newDefault = (Locale *)uhash_get(gDefaultLocalesHashT, localeNameBuf.data()); + Locale* newDefault = static_cast<Locale*>(uhash_get(gDefaultLocalesHashT, localeNameBuf.data())); if (newDefault == nullptr) { newDefault = new Locale(Locale::eBOGUS); if (newDefault == nullptr) { @@ -213,7 +208,7 @@ Locale *locale_set_default_internal(const char *id, UErrorCode& status) { return gDefaultLocale; } newDefault->init(localeNameBuf.data(), false); - uhash_put(gDefaultLocalesHashT, (char*) newDefault->getName(), newDefault, &status); + uhash_put(gDefaultLocalesHashT, const_cast<char*>(newDefault->getName()), newDefault, &status); if (U_FAILURE(status)) { return gDefaultLocale; } @@ -241,9 +236,214 @@ locale_get_default() return Locale::getDefault().getName(); } +namespace { + +template <auto FIELD, typename T> +void copyToArray(std::string_view sv, T* that) { + auto& field = that->*FIELD; + constexpr size_t capacity = std::extent_v<std::remove_reference_t<decltype(field)>>; + static_assert(capacity > 0); + if (!sv.empty()) { + U_ASSERT(sv.size() < capacity); + uprv_memcpy(field, sv.data(), sv.size()); + } + field[sv.size()] = '\0'; +} + +} // namespace U_NAMESPACE_BEGIN +void Locale::Nest::init(std::string_view language, + std::string_view script, + std::string_view region, + uint8_t variantBegin) { + copyToArray<&Nest::language>(language, this); + copyToArray<&Nest::script>(script, this); + copyToArray<&Nest::region>(region, this); + this->variantBegin = variantBegin; +} + +Locale::Nest::Nest(Heap&& heap, uint8_t variantBegin) { + // When moving from Heap to Nest the language field can be left untouched + // (as it has the same offset in both) and only the script and region fields + // need to be copied to their new locations, which is safe to do because the + // new locations come before the old locations in memory and don't overlap. + static_assert(offsetof(Nest, region) <= offsetof(Heap, script)); + static_assert(offsetof(Nest, variantBegin) <= offsetof(Heap, region)); + U_ASSERT(this == reinterpret_cast<Nest*>(&heap)); + copyToArray<&Nest::script>(heap.script, this); + copyToArray<&Nest::region>(heap.region, this); + this->variantBegin = variantBegin; + *this->baseName = '\0'; +} + +struct Locale::Heap::Alloc : public UMemory { + FixedString fullName; + FixedString baseName; + int32_t variantBegin; + + const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; } + const char* getFullName() const { return fullName.data(); } + const char* getBaseName() const { + if (baseName.isEmpty()) { + if (const char* name = fullName.data(); *name != '@') { + return name; + } + } + return baseName.data(); + } + + Alloc(int32_t variantBegin) : fullName(), baseName(), variantBegin(variantBegin) {} + + Alloc(const Alloc& other, UErrorCode& status) + : fullName(), baseName(), variantBegin(other.variantBegin) { + if (U_SUCCESS(status)) { + if (!other.fullName.isEmpty()) { + fullName = other.fullName; + if (fullName.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + if (!other.baseName.isEmpty()) { + baseName = other.baseName; + if (baseName.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } + } + } + } + } + + // Move should be done on the owner of the pointer to this object. + Alloc(Alloc&&) noexcept = delete; + + ~Alloc() = default; +}; + +const char* Locale::Heap::getVariant() const { return ptr->getVariant(); } +const char* Locale::Heap::getFullName() const { return ptr->getFullName(); } +const char* Locale::Heap::getBaseName() const { return ptr->getBaseName(); } + +Locale::Heap::Heap(std::string_view language, + std::string_view script, + std::string_view region, + int32_t variantBegin) { + ptr = new Alloc(variantBegin); + if (ptr == nullptr) { + type = eBOGUS; + } else { + type = eHEAP; + copyToArray<&Heap::language>(language, this); + copyToArray<&Heap::script>(script, this); + copyToArray<&Heap::region>(region, this); + } +} + +Locale::Heap::~Heap() { + U_ASSERT(type == eHEAP); + delete ptr; +} + +Locale::Heap& Locale::Heap::operator=(const Heap& other) { + U_ASSERT(type == eBOGUS); + UErrorCode status = U_ZERO_ERROR; + ptr = new Alloc(*other.ptr, status); + if (ptr == nullptr || U_FAILURE(status)) { + delete ptr; + } else { + type = eHEAP; + uprv_memcpy(language, other.language, sizeof language); + uprv_memcpy(script, other.script, sizeof script); + uprv_memcpy(region, other.region, sizeof region); + } + return *this; +} + +Locale::Heap& Locale::Heap::operator=(Heap&& other) noexcept { + U_ASSERT(type == eBOGUS); + ptr = other.ptr; + type = eHEAP; + other.type = eBOGUS; + uprv_memcpy(language, other.language, sizeof language); + uprv_memcpy(script, other.script, sizeof script); + uprv_memcpy(region, other.region, sizeof region); + return *this; +} + +template <typename BogusFn, typename NestFn, typename HeapFn, typename... Args> +auto Locale::Payload::visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const { + switch (type) { + case eBOGUS: + return bogusFn(args...); + case eNEST: + return nestFn(nest, args...); + case eHEAP: + return heapFn(heap, args...); + default: + UPRV_UNREACHABLE_EXIT; + }; +} + +void Locale::Payload::copy(const Payload& other) { + other.visit([](Payload*) {}, + [](const Nest& nest, Payload* dst) { dst->nest = nest; }, + [](const Heap& heap, Payload* dst) { dst->heap = heap; }, + this); +} + +void Locale::Payload::move(Payload&& other) noexcept { + other.visit( + [](Payload*) {}, + [](const Nest& nest, Payload* dst) { dst->nest = nest; }, + [](const Heap& heap, Payload* dst) { dst->heap = std::move(const_cast<Heap&>(heap)); }, + this); +} + +Locale::Payload::~Payload() { + if (type == eHEAP) { heap.~Heap(); } +} + +Locale::Payload::Payload(const Payload& other) : type{eBOGUS} { copy(other); } +Locale::Payload::Payload(Payload&& other) noexcept : type{eBOGUS} { move(std::move(other)); } + +Locale::Payload& Locale::Payload::operator=(const Payload& other) { + if (this != &other) { + setToBogus(); + copy(other); + } + return *this; +} + +Locale::Payload& Locale::Payload::operator=(Payload&& other) noexcept { + if (this != &other) { + setToBogus(); + move(std::move(other)); + } + return *this; +} + +void Locale::Payload::setToBogus() { + this->~Payload(); + type = eBOGUS; +} + +template <typename T, typename... Args> T& Locale::Payload::emplace(Args&&... args) { + if constexpr (std::is_same_v<T, Nest>) { + this->~Payload(); + ::new (&nest) Nest(std::forward<Args>(args)...); + return nest; + } + if constexpr (std::is_same_v<T, Heap>) { + U_ASSERT(type != eHEAP); + ::new (&heap) Heap(std::forward<Args>(args)...); + return heap; + } +} + +template <> Locale::Nest* Locale::Payload::get() { return type == eNEST ? &nest : nullptr; } +template <> Locale::Heap* Locale::Payload::get() { return type == eHEAP ? &heap : nullptr; } + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) /*Character separating the posix id fields*/ @@ -252,22 +452,10 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) #define SEP_CHAR '_' #define NULL_CHAR '\0' -Locale::~Locale() -{ - if ((baseName != fullName) && (baseName != fullNameBuffer)) { - uprv_free(baseName); - } - baseName = nullptr; - /*if fullName is on the heap, we free it*/ - if (fullName != fullNameBuffer) - { - uprv_free(fullName); - fullName = nullptr; - } -} +Locale::~Locale() = default; Locale::Locale() - : UObject(), fullName(fullNameBuffer), baseName(nullptr) + : UObject(), payload() { init(nullptr, false); } @@ -278,9 +466,8 @@ Locale::Locale() * the default locale.) */ Locale::Locale(Locale::ELocaleType) - : UObject(), fullName(fullNameBuffer), baseName(nullptr) + : UObject(), payload() { - setToBogus(); } @@ -288,7 +475,7 @@ Locale::Locale( const char * newLanguage, const char * newCountry, const char * newVariant, const char * newKeywords) - : UObject(), fullName(fullNameBuffer), baseName(nullptr) + : UObject(), payload() { if( (newLanguage==nullptr) && (newCountry == nullptr) && (newVariant == nullptr) ) { @@ -307,9 +494,8 @@ Locale::Locale( const char * newLanguage, // Language if ( newLanguage != nullptr ) { - lsize = (int32_t)uprv_strlen(newLanguage); + lsize = static_cast<int32_t>(uprv_strlen(newLanguage)); if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap - setToBogus(); return; } } @@ -319,9 +505,8 @@ Locale::Locale( const char * newLanguage, // _Country if ( newCountry != nullptr ) { - csize = (int32_t)uprv_strlen(newCountry); + csize = static_cast<int32_t>(uprv_strlen(newCountry)); if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap - setToBogus(); return; } } @@ -336,9 +521,8 @@ Locale::Locale( const char * newLanguage, } // remove trailing _'s - vsize = (int32_t)uprv_strlen(newVariant); + vsize = static_cast<int32_t>(uprv_strlen(newVariant)); if ( vsize < 0 || vsize > ULOC_STRING_LIMIT ) { // int32 wrap - setToBogus(); return; } while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) ) @@ -349,9 +533,8 @@ Locale::Locale( const char * newLanguage, if ( newKeywords != nullptr) { - ksize = (int32_t)uprv_strlen(newKeywords); + ksize = static_cast<int32_t>(uprv_strlen(newKeywords)); if ( ksize < 0 || ksize > ULOC_STRING_LIMIT ) { - setToBogus(); return; } } @@ -392,7 +575,6 @@ Locale::Locale( const char * newLanguage, if (U_FAILURE(status)) { // Something went wrong with appending, etc. - setToBogus(); return; } // Parse it, because for example 'language' might really be a complete @@ -401,82 +583,11 @@ Locale::Locale( const char * newLanguage, } } -Locale::Locale(const Locale &other) - : UObject(other), fullName(fullNameBuffer), baseName(nullptr) -{ - *this = other; -} - -Locale::Locale(Locale&& other) noexcept - : UObject(other), fullName(fullNameBuffer), baseName(fullName) { - *this = std::move(other); -} - -Locale& Locale::operator=(const Locale& other) { - if (this == &other) { - return *this; - } - - setToBogus(); - - if (other.fullName == other.fullNameBuffer) { - uprv_strcpy(fullNameBuffer, other.fullNameBuffer); - } else if (other.fullName == nullptr) { - fullName = nullptr; - } else { - fullName = uprv_strdup(other.fullName); - if (fullName == nullptr) return *this; - } - - if (other.baseName == other.fullName) { - baseName = fullName; - } else if (other.baseName != nullptr) { - baseName = uprv_strdup(other.baseName); - if (baseName == nullptr) return *this; - } - - uprv_strcpy(language, other.language); - uprv_strcpy(script, other.script); - uprv_strcpy(country, other.country); +Locale::Locale(const Locale&) = default; +Locale::Locale(Locale&&) noexcept = default; - variantBegin = other.variantBegin; - fIsBogus = other.fIsBogus; - - return *this; -} - -Locale& Locale::operator=(Locale&& other) noexcept { - if ((baseName != fullName) && (baseName != fullNameBuffer)) uprv_free(baseName); - if (fullName != fullNameBuffer) uprv_free(fullName); - - if (other.fullName == other.fullNameBuffer || other.baseName == other.fullNameBuffer) { - uprv_strcpy(fullNameBuffer, other.fullNameBuffer); - } - if (other.fullName == other.fullNameBuffer) { - fullName = fullNameBuffer; - } else { - fullName = other.fullName; - } - - if (other.baseName == other.fullNameBuffer) { - baseName = fullNameBuffer; - } else if (other.baseName == other.fullName) { - baseName = fullName; - } else { - baseName = other.baseName; - } - - uprv_strcpy(language, other.language); - uprv_strcpy(script, other.script); - uprv_strcpy(country, other.country); - - variantBegin = other.variantBegin; - fIsBogus = other.fIsBogus; - - other.baseName = other.fullName = other.fullNameBuffer; - - return *this; -} +Locale& Locale::operator=(const Locale&) = default; +Locale& Locale::operator=(Locale&&) noexcept = default; Locale * Locale::clone() const { @@ -486,7 +597,7 @@ Locale::clone() const { bool Locale::operator==( const Locale& other) const { - return (uprv_strcmp(other.fullName, fullName) == 0); + return uprv_strcmp(other.getName(), getName()) == 0; } namespace { @@ -494,7 +605,7 @@ namespace { UInitOnce gKnownCanonicalizedInitOnce {}; UHashtable *gKnownCanonicalized = nullptr; -static const char* const KNOWN_CANONICALIZED[] = { +constexpr const char* KNOWN_CANONICALIZED[] = { "c", // Commonly used locales known are already canonicalized "af", "af_ZA", "am", "am_ET", "ar", "ar_001", "as", "as_IN", "az", "az_AZ", @@ -518,13 +629,13 @@ static const char* const KNOWN_CANONICALIZED[] = { "zh_Hant_TW", "zh_TW", "zu", "zu_ZA" }; -static UBool U_CALLCONV cleanupKnownCanonicalized() { +UBool U_CALLCONV cleanupKnownCanonicalized() { gKnownCanonicalizedInitOnce.reset(); if (gKnownCanonicalized) { uhash_close(gKnownCanonicalized); } return true; } -static void U_CALLCONV loadKnownCanonicalized(UErrorCode &status) { +void U_CALLCONV loadKnownCanonicalized(UErrorCode &status) { ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KNOWN_CANONICALIZED, cleanupKnownCanonicalized); LocalUHashtablePointer newKnownCanonicalizedMap( @@ -920,6 +1031,8 @@ AliasData::loadData(UErrorCode &status) */ AliasData* AliasDataBuilder::build(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } + LocalUResourceBundlePointer metadata( ures_openDirect(nullptr, "metadata", &status)); LocalUResourceBundlePointer metadataAlias( @@ -1065,7 +1178,7 @@ AliasDataBuilder::build(UErrorCode &status) { */ class AliasReplacer { public: - AliasReplacer(UErrorCode status) : + AliasReplacer(UErrorCode& status) : language(nullptr), script(nullptr), region(nullptr), extensions(nullptr), // store value in variants only once @@ -1080,7 +1193,7 @@ class AliasReplacer { } // Check the fields inside locale, if need to replace fields, - // place the the replaced locale ID in out and return true. + // place the replaced locale ID in out and return true. // Otherwise return false for no replacement or error. bool replace( const Locale& locale, CharString& out, UErrorCode& status); @@ -1130,12 +1243,12 @@ class AliasReplacer { } // Gather fields and generate locale ID into out. - CharString& outputToString(CharString& out, UErrorCode status); + CharString& outputToString(CharString& out, UErrorCode& status); // Generate the lookup key. CharString& generateKey(const char* language, const char* region, const char* variant, CharString& out, - UErrorCode status); + UErrorCode& status); void parseLanguageReplacement(const char* replacement, const char*& replaceLanguage, @@ -1172,8 +1285,9 @@ class AliasReplacer { CharString& AliasReplacer::generateKey( const char* language, const char* region, const char* variant, - CharString& out, UErrorCode status) + CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return out; } out.append(language, status); if (notEmpty(region)) { out.append(SEP_CHAR, status) @@ -1208,8 +1322,8 @@ AliasReplacer::parseLanguageReplacement( return; } // We have multiple field so we have to allocate and parse - CharString* str = new CharString( - replacement, (int32_t)uprv_strlen(replacement), status); + CharString* str = + new CharString(replacement, static_cast<int32_t>(uprv_strlen(replacement)), status); LocalPointer<CharString> lpStr(str, status); toBeFreed.adoptElement(lpStr.orphan(), status); if (U_FAILURE(status)) { @@ -1221,7 +1335,7 @@ AliasReplacer::parseLanguageReplacement( *endOfField = '\0'; // null terminiate it. endOfField++; const char* start = endOfField; - endOfField = (char*) uprv_strchr(start, '_'); + endOfField = const_cast<char*>(uprv_strchr(start, '_')); size_t len = 0; if (endOfField == nullptr) { len = uprv_strlen(start); @@ -1236,7 +1350,7 @@ AliasReplacer::parseLanguageReplacement( return; } start = endOfField++; - endOfField = (char*)uprv_strchr(start, '_'); + endOfField = const_cast<char*>(uprv_strchr(start, '_')); if (endOfField == nullptr) { len = uprv_strlen(start); } else { @@ -1251,7 +1365,7 @@ AliasReplacer::parseLanguageReplacement( return; } start = endOfField++; - endOfField = (char*)uprv_strchr(start, '_'); + endOfField = const_cast<char*>(uprv_strchr(start, '_')); if (endOfField == nullptr) { len = uprv_strlen(start); } else { @@ -1293,7 +1407,7 @@ AliasReplacer::replaceLanguage( variant_index++) { if (checkVariants) { U_ASSERT(variant_index < variant_size); - searchVariant = (const char*)(variants.elementAt(variant_index)); + searchVariant = static_cast<const char*>(variants.elementAt(variant_index)); } if (searchVariant != nullptr && uprv_strlen(searchVariant) < 4) { @@ -1414,13 +1528,13 @@ AliasReplacer::replaceTerritory(UVector& toBeFreed, UErrorCode& status) U_ASSERT(foundInReplacement[len] == ' ' || foundInReplacement[len] == '\0'); item.adoptInsteadAndCheckErrorCode( - new CharString(foundInReplacement, (int32_t)len, status), status); + new CharString(foundInReplacement, static_cast<int32_t>(len), status), status); } } if (item.isNull() && U_SUCCESS(status)) { item.adoptInsteadAndCheckErrorCode( new CharString(replacement, - (int32_t)(firstSpace - replacement), status), status); + static_cast<int32_t>(firstSpace - replacement), status), status); } if (U_FAILURE(status)) { return false; } replacedRegion = item->data(); @@ -1462,7 +1576,7 @@ AliasReplacer::replaceVariant(UErrorCode& status) } // Since we may have more than one variant, we need to loop through them. for (int32_t i = 0; i < variants.size(); i++) { - const char *variant = (const char*)(variants.elementAt(i)); + const char* variant = static_cast<const char*>(variants.elementAt(i)); const char *replacement = data->variantMap().get(variant); if (replacement == nullptr) { // Found no replacement data for this variant. @@ -1504,7 +1618,7 @@ AliasReplacer::replaceSubdivision( size_t len = (firstSpace != nullptr) ? (firstSpace - replacement) : uprv_strlen(replacement); if (2 <= len && len <= 8) { - output.append(replacement, (int32_t)len, status); + output.append(replacement, static_cast<int32_t>(len), status); if (2 == len) { // Add 'zzzz' based on changes to UTS #35 for CLDR-14312. output.append("zzzz", 4, status); @@ -1529,13 +1643,12 @@ AliasReplacer::replaceTransformedExtensions( const char* tkey = ultag_getTKeyStart(str); int32_t tlangLen = (tkey == str) ? 0 : ((tkey == nullptr) ? len : static_cast<int32_t>((tkey - str - 1))); - CharStringByteSink sink(&output); if (tlangLen > 0) { Locale tlang = LocaleBuilder() .setLanguageTag(StringPiece(str, tlangLen)) .build(status); tlang.canonicalize(status); - tlang.toLanguageTag(sink, status); + output = tlang.toLanguageTag<CharString>(status); if (U_FAILURE(status)) { return false; } @@ -1555,7 +1668,7 @@ AliasReplacer::replaceTransformedExtensions( } const char* nextTKey = ultag_getTKeyStart(tvalue); if (nextTKey != nullptr) { - *((char*)(nextTKey-1)) = '\0'; // NUL terminate tvalue + *const_cast<char*>(nextTKey - 1) = '\0'; // NUL terminate tvalue } tfields.insertElementAt((void*)tkey, tfields.size(), status); if (U_FAILURE(status)) { @@ -1570,17 +1683,17 @@ AliasReplacer::replaceTransformedExtensions( if (output.length() > 0) { output.append('-', status); } - const char* tfield = (const char*) tfields.elementAt(i); + const char* tfield = static_cast<const char*>(tfields.elementAt(i)); const char* tvalue = uprv_strchr(tfield, '-'); if (tvalue == nullptr) { status = U_ILLEGAL_ARGUMENT_ERROR; return false; } // Split the "tkey-tvalue" pair string so that we can canonicalize the tvalue. - *((char*)tvalue++) = '\0'; // NUL terminate tkey + *const_cast<char*>(tvalue++) = '\0'; // NUL terminate tkey output.append(tfield, status).append('-', status); - const char* bcpTValue = ulocimp_toBcpType(tfield, tvalue, nullptr, nullptr); - output.append((bcpTValue == nullptr) ? tvalue : bcpTValue, status); + std::optional<std::string_view> bcpTValue = ulocimp_toBcpType(tfield, tvalue); + output.append(bcpTValue.has_value() ? *bcpTValue : tvalue, status); } } if (U_FAILURE(status)) { @@ -1591,8 +1704,9 @@ AliasReplacer::replaceTransformedExtensions( CharString& AliasReplacer::outputToString( - CharString& out, UErrorCode status) + CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return out; } out.append(language, status); if (notEmpty(script)) { out.append(SEP_CHAR, status) @@ -1612,7 +1726,7 @@ AliasReplacer::outputToString( int32_t variantsStart = out.length(); for (int32_t i = 0; i < variants.size(); i++) { out.append(SEP_CHAR, status) - .append((const char*)(variants.elementAt(i)), + .append(static_cast<const char*>(variants.elementAt(i)), status); } T_CString_toUpperCase(out.data() + variantsStart); @@ -1681,7 +1795,7 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status int changed = 0; // A UVector to to hold CharString allocated by the replace* method // and freed when out of scope from his function. - UVector stringsToBeFreed([](void *obj){ delete ((CharString*) obj); }, + UVector stringsToBeFreed([](void *obj) { delete static_cast<CharString*>(obj); }, nullptr, 10, status); while (U_SUCCESS(status)) { // Something wrong with the data cause looping here more than 10 times @@ -1735,9 +1849,7 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status while ((key = iter->next(nullptr, status)) != nullptr) { if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 || uprv_strcmp("t", key) == 0) { - CharString value; - CharStringByteSink valueSink(&value); - locale.getKeywordValue(key, valueSink, status); + auto value = locale.getKeywordValue<CharString>(key, status); if (U_FAILURE(status)) { status = U_ZERO_ERROR; continue; @@ -1782,6 +1894,7 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status bool canonicalizeLocale(const Locale& locale, CharString& out, UErrorCode& status) { + if (U_FAILURE(status)) { return false; } AliasReplacer replacer(status); return replacer.replace(locale, out, status); } @@ -1791,6 +1904,8 @@ canonicalizeLocale(const Locale& locale, CharString& out, UErrorCode& status) bool isKnownCanonicalizedLocale(const char* locale, UErrorCode& status) { + if (U_FAILURE(status)) { return false; } + if ( uprv_strcmp(locale, "c") == 0 || uprv_strcmp(locale, "en") == 0 || uprv_strcmp(locale, "en_US") == 0) { @@ -1809,94 +1924,104 @@ isKnownCanonicalizedLocale(const char* locale, UErrorCode& status) } // namespace +U_NAMESPACE_END + // Function for testing. -U_CAPI const char* const* -ulocimp_getKnownCanonicalizedLocaleForTest(int32_t* length) +U_EXPORT const char* const* +ulocimp_getKnownCanonicalizedLocaleForTest(int32_t& length) { - *length = UPRV_LENGTHOF(KNOWN_CANONICALIZED); + U_NAMESPACE_USE + length = UPRV_LENGTHOF(KNOWN_CANONICALIZED); return KNOWN_CANONICALIZED; } // Function for testing. -U_CAPI bool +U_EXPORT bool ulocimp_isCanonicalizedLocaleForTest(const char* localeName) { + U_NAMESPACE_USE Locale l(localeName); UErrorCode status = U_ZERO_ERROR; CharString temp; return !canonicalizeLocale(l, temp, status) && U_SUCCESS(status); } -/*This function initializes a Locale from a C locale ID*/ +U_NAMESPACE_BEGIN + Locale& Locale::init(const char* localeID, UBool canonicalize) { - fIsBogus = false; + return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize); +} + +/*This function initializes a Locale from a C locale ID*/ +Locale& Locale::init(StringPiece localeID, UBool canonicalize) +{ /* Free our current storage */ - if ((baseName != fullName) && (baseName != fullNameBuffer)) { - uprv_free(baseName); - } - baseName = nullptr; - if(fullName != fullNameBuffer) { - uprv_free(fullName); - fullName = fullNameBuffer; - } + Nest& nest = payload.emplace<Nest>(); // not a loop: // just an easy way to have a common error-exit // without goto and without another function do { char *separator; - char *field[5] = {0}; + char *field[5] = {nullptr}; int32_t fieldLen[5] = {0}; int32_t fieldIdx; int32_t variantField; int32_t length; UErrorCode err; - if(localeID == nullptr) { - // not an error, just set the default locale - return *this = getDefault(); - } - - /* preset all fields to empty */ - language[0] = script[0] = country[0] = 0; + const auto parse = [canonicalize](std::string_view localeID, + char* name, + int32_t nameCapacity, + UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + if (canonicalize) { + ulocimp_canonicalize(localeID, sink, status); + } else { + ulocimp_getName(localeID, sink, status); + } + }, + status); + }; // "canonicalize" the locale ID to ICU/Java format + char* fullName = nest.baseName; err = U_ZERO_ERROR; - length = canonicalize ? - uloc_canonicalize(localeID, fullName, sizeof(fullNameBuffer), &err) : - uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err); + length = parse(localeID, fullName, sizeof Nest::baseName, err); - if(err == U_BUFFER_OVERFLOW_ERROR || length >= (int32_t)sizeof(fullNameBuffer)) { - U_ASSERT(baseName == nullptr); + FixedString fullNameBuffer; + if (err == U_BUFFER_OVERFLOW_ERROR || length >= static_cast<int32_t>(sizeof Nest::baseName)) { /*Go to heap for the fullName if necessary*/ - fullName = (char *)uprv_malloc(sizeof(char)*(length + 1)); - if(fullName == 0) { - fullName = fullNameBuffer; + if (!fullNameBuffer.reserve(length + 1)) { break; // error: out of memory } + fullName = fullNameBuffer.getAlias(); err = U_ZERO_ERROR; - length = canonicalize ? - uloc_canonicalize(localeID, fullName, length+1, &err) : - uloc_getName(localeID, fullName, length+1, &err); + length = parse(localeID, fullName, length + 1, err); } if(U_FAILURE(err) || err == U_STRING_NOT_TERMINATED_WARNING) { /* should never occur */ break; } - variantBegin = length; + std::string_view language; + std::string_view script; + std::string_view region; + int32_t variantBegin = length; /* after uloc_getName/canonicalize() we know that only '_' are separators */ /* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */ separator = field[0] = fullName; fieldIdx = 1; char* at = uprv_strchr(fullName, '@'); - while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && + while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != nullptr && fieldIdx < UPRV_LENGTHOF(field)-1 && (at == nullptr || separator < at)) { field[fieldIdx] = separator + 1; - fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]); + fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]); fieldIdx++; } // variant may contain @foo or .foo POSIX cruft; remove it @@ -1906,12 +2031,13 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) if (separator==nullptr || (sep2!=nullptr && separator > sep2)) { separator = sep2; } - fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]); + fieldLen[fieldIdx - 1] = static_cast<int32_t>(separator - field[fieldIdx - 1]); } else { - fieldLen[fieldIdx-1] = length - (int32_t)(field[fieldIdx-1] - fullName); + fieldLen[fieldIdx - 1] = length - static_cast<int32_t>(field[fieldIdx - 1] - fullName); } + bool hasKeywords = at != nullptr && uprv_strchr(at + 1, '=') != nullptr; - if (fieldLen[0] >= (int32_t)(sizeof(language))) + if (fieldLen[0] >= ULOC_LANG_CAPACITY) { break; // error: the language field is too long } @@ -1919,22 +2045,19 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) variantField = 1; /* Usually the 2nd one, except when a script or country is also used. */ if (fieldLen[0] > 0) { /* We have a language */ - uprv_memcpy(language, fullName, fieldLen[0]); - language[fieldLen[0]] = 0; + language = {fullName, static_cast<std::string_view::size_type>(fieldLen[0])}; } if (fieldLen[1] == 4 && uprv_isASCIILetter(field[1][0]) && uprv_isASCIILetter(field[1][1]) && uprv_isASCIILetter(field[1][2]) && uprv_isASCIILetter(field[1][3])) { /* We have at least a script */ - uprv_memcpy(script, field[1], fieldLen[1]); - script[fieldLen[1]] = 0; + script = {field[1], static_cast<std::string_view::size_type>(fieldLen[1])}; variantField++; } if (fieldLen[variantField] == 2 || fieldLen[variantField] == 3) { /* We have a country */ - uprv_memcpy(country, field[variantField], fieldLen[variantField]); - country[fieldLen[variantField]] = 0; + region = {field[variantField], static_cast<std::string_view::size_type>(fieldLen[variantField])}; variantField++; } else if (fieldLen[variantField] == 0) { variantField++; /* script or country empty but variant in next field (i.e. en__POSIX) */ @@ -1942,17 +2065,53 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) if (fieldLen[variantField] > 0) { /* We have a variant */ - variantBegin = (int32_t)(field[variantField] - fullName); - } - - err = U_ZERO_ERROR; - initBaseName(err); - if (U_FAILURE(err)) { - break; + variantBegin = static_cast<int32_t>(field[variantField] - fullName); + } else if (hasKeywords) { + // The original computation of variantBegin leaves it equal to the length + // of fullName if there is no variant. It should instead be + // the length of the baseName. + variantBegin = static_cast<int32_t>(at - fullName); + } + + if (!hasKeywords && Nest::fits(length, language, script, region)) { + U_ASSERT(fullName == nest.baseName); + U_ASSERT(fullNameBuffer.isEmpty()); + nest.init(language, script, region, variantBegin); + } else { + if (fullName == nest.baseName) { + U_ASSERT(fullNameBuffer.isEmpty()); + fullNameBuffer = {fullName, static_cast<std::string_view::size_type>(length)}; + if (fullNameBuffer.isEmpty()) { + break; // error: out of memory + } + if (!language.empty()) { + language = {fullNameBuffer.data(), language.size()}; + } + if (!script.empty()) { + script = {fullNameBuffer.data() + (script.data() - fullName), script.size()}; + } + if (!region.empty()) { + region = {fullNameBuffer.data() + (region.data() - fullName), region.size()}; + } + } + Heap& heap = payload.emplace<Heap>(language, script, region, variantBegin); + if (isBogus()) { + break; // error: out of memory + } + U_ASSERT(!fullNameBuffer.isEmpty()); + heap.ptr->fullName = std::move(fullNameBuffer); + if (hasKeywords) { + if (std::string_view::size_type baseNameLength = at - fullName; baseNameLength > 0) { + heap.ptr->baseName = {heap.ptr->fullName.data(), baseNameLength}; + if (heap.ptr->baseName.isEmpty()) { + break; // error: out of memory + } + } + } } if (canonicalize) { - if (!isKnownCanonicalizedLocale(fullName, err)) { + if (!isKnownCanonicalizedLocale(getName(), err)) { CharString replaced; // Not sure it is already canonicalized if (canonicalizeLocale(*this, replaced, err)) { @@ -1976,66 +2135,16 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) return *this; } -/* - * Set up the base name. - * If there are no key words, it's exactly the full name. - * If key words exist, it's the full name truncated at the '@' character. - * Need to set up both at init() and after setting a keyword. - */ -void -Locale::initBaseName(UErrorCode &status) { - if (U_FAILURE(status)) { - return; - } - U_ASSERT(baseName==nullptr || baseName==fullName); - const char *atPtr = uprv_strchr(fullName, '@'); - const char *eqPtr = uprv_strchr(fullName, '='); - if (atPtr && eqPtr && atPtr < eqPtr) { - // Key words exist. - int32_t baseNameLength = (int32_t)(atPtr - fullName); - baseName = (char *)uprv_malloc(baseNameLength + 1); - if (baseName == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - uprv_strncpy(baseName, fullName, baseNameLength); - baseName[baseNameLength] = 0; - - // The original computation of variantBegin leaves it equal to the length - // of fullName if there is no variant. It should instead be - // the length of the baseName. - if (variantBegin > baseNameLength) { - variantBegin = baseNameLength; - } - } else { - baseName = fullName; - } -} - - int32_t Locale::hashCode() const { - return ustr_hashCharsN(fullName, static_cast<int32_t>(uprv_strlen(fullName))); + return ustr_hashCharsN(getName(), static_cast<int32_t>(uprv_strlen(getName()))); } void Locale::setToBogus() { /* Free our current storage */ - if((baseName != fullName) && (baseName != fullNameBuffer)) { - uprv_free(baseName); - } - baseName = nullptr; - if(fullName != fullNameBuffer) { - uprv_free(fullName); - fullName = fullNameBuffer; - } - *fullNameBuffer = 0; - *language = 0; - *script = 0; - *country = 0; - fIsBogus = true; - variantBegin = 0; + payload.setToBogus(); } const Locale& U_EXPORT2 @@ -2074,13 +2183,12 @@ Locale::addLikelySubtags(UErrorCode& status) { return; } - CharString maximizedLocaleID; - { - CharStringByteSink sink(&maximizedLocaleID); - ulocimp_addLikelySubtags(fullName, sink, &status); - } + CharString maximizedLocaleID = ulocimp_addLikelySubtags(getName(), status); if (U_FAILURE(status)) { + if (status == U_MEMORY_ALLOCATION_ERROR) { + setToBogus(); + } return; } @@ -2100,13 +2208,12 @@ Locale::minimizeSubtags(bool favorScript, UErrorCode& status) { return; } - CharString minimizedLocaleID; - { - CharStringByteSink sink(&minimizedLocaleID); - ulocimp_minimizeSubtags(fullName, sink, favorScript, &status); - } + CharString minimizedLocaleID = ulocimp_minimizeSubtags(getName(), favorScript, status); if (U_FAILURE(status)) { + if (status == U_MEMORY_ALLOCATION_ERROR) { + setToBogus(); + } return; } @@ -2125,8 +2232,11 @@ Locale::canonicalize(UErrorCode& status) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - CharString uncanonicalized(fullName, status); + CharString uncanonicalized(getName(), status); if (U_FAILURE(status)) { + if (status == U_MEMORY_ALLOCATION_ERROR) { + setToBogus(); + } return; } init(uncanonicalized.data(), /*canonicalize=*/true); @@ -2155,17 +2265,12 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) // parsing. Therefore the code here explicitly calls uloc_forLanguageTag() // and then Locale::init(), instead of just calling the normal constructor. - CharString localeID; int32_t parsedLength; - { - CharStringByteSink sink(&localeID); - ulocimp_forLanguageTag( - tag.data(), - tag.length(), - sink, - &parsedLength, - &status); - } + CharString localeID = ulocimp_forLanguageTag( + tag.data(), + tag.length(), + &parsedLength, + status); if (U_FAILURE(status)) { return result; @@ -2190,12 +2295,12 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const return; } - if (fIsBogus) { + if (isBogus()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - ulocimp_toLanguageTag(fullName, sink, /*strict=*/false, &status); + ulocimp_toLanguageTag(getName(), sink, /*strict=*/false, status); } Locale U_EXPORT2 @@ -2211,6 +2316,13 @@ Locale::createFromName (const char *name) } } +Locale U_EXPORT2 +Locale::createFromName(StringPiece name) { + Locale loc(""); + loc.init(name, false); + return loc; +} + Locale U_EXPORT2 Locale::createCanonical(const char* name) { Locale loc(""); @@ -2221,14 +2333,14 @@ Locale::createCanonical(const char* name) { const char * Locale::getISO3Language() const { - return uloc_getISO3Language(fullName); + return uloc_getISO3Language(getName()); } const char * Locale::getISO3Country() const { - return uloc_getISO3Country(fullName); + return uloc_getISO3Country(getName()); } /** @@ -2241,7 +2353,7 @@ Locale::getISO3Country() const uint32_t Locale::getLCID() const { - return uloc_getLCID(fullName); + return uloc_getLCID(getName()); } const char* const* U_EXPORT2 Locale::getISOCountries() @@ -2420,32 +2532,27 @@ Locale::getLocaleCache() class KeywordEnumeration : public StringEnumeration { protected: - char *keywords; + FixedString keywords; private: - char *current; int32_t length; - UnicodeString currUSKey; - static const char fgClassID;/* Warning this is used beyond the typical RTTI usage. */ + const char *current; + static const char fgClassID; public: static UClassID U_EXPORT2 getStaticClassID() { return (UClassID)&fgClassID; } virtual UClassID getDynamicClassID() const override { return getStaticClassID(); } public: KeywordEnumeration(const char *keys, int32_t keywordLen, int32_t currentIndex, UErrorCode &status) - : keywords((char *)&fgClassID), current((char *)&fgClassID), length(0) { + : keywords(), length(keywordLen), current(nullptr) { if(U_SUCCESS(status) && keywordLen != 0) { if(keys == nullptr || keywordLen < 0) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { - keywords = (char *)uprv_malloc(keywordLen+1); - if (keywords == nullptr) { + keywords = {keys, static_cast<std::string_view::size_type>(length)}; + if (keywords.isEmpty()) { status = U_MEMORY_ALLOCATION_ERROR; - } - else { - uprv_memcpy(keywords, keys, keywordLen); - keywords[keywordLen] = 0; - current = keywords + currentIndex; - length = keywordLen; + } else { + current = keywords.data() + currentIndex; } } } @@ -2456,11 +2563,14 @@ class KeywordEnumeration : public StringEnumeration { virtual StringEnumeration * clone() const override { UErrorCode status = U_ZERO_ERROR; - return new KeywordEnumeration(keywords, length, (int32_t)(current - keywords), status); + return new KeywordEnumeration( + keywords.data(), length, + static_cast<int32_t>(current - keywords.data()), status); } - virtual int32_t count(UErrorCode &/*status*/) const override { - char *kw = keywords; + virtual int32_t count(UErrorCode& status) const override { + if (U_FAILURE(status)) { return 0; } + const char *kw = keywords.data(); int32_t result = 0; while(*kw) { result++; @@ -2474,7 +2584,7 @@ class KeywordEnumeration : public StringEnumeration { int32_t len; if(U_SUCCESS(status) && *current != 0) { result = current; - len = (int32_t)uprv_strlen(current); + len = static_cast<int32_t>(uprv_strlen(current)); current += len+1; if(resultLength != nullptr) { *resultLength = len; @@ -2489,21 +2599,22 @@ class KeywordEnumeration : public StringEnumeration { } virtual const UnicodeString* snext(UErrorCode& status) override { + if (U_FAILURE(status)) { return nullptr; } int32_t resultLength = 0; const char *s = next(&resultLength, status); return setChars(s, resultLength, status); } - virtual void reset(UErrorCode& /*status*/) override { - current = keywords; + virtual void reset(UErrorCode& status) override { + if (U_FAILURE(status)) { return; } + current = keywords.data(); } }; const char KeywordEnumeration::fgClassID = '\0'; -KeywordEnumeration::~KeywordEnumeration() { - uprv_free(keywords); -} +// Out-of-line virtual destructor to serve as the "key function". +KeywordEnumeration::~KeywordEnumeration() = default; // A wrapper around KeywordEnumeration that calls uloc_toUnicodeLocaleKey() in // the next() method for each keyword before returning it. @@ -2528,8 +2639,9 @@ class UnicodeKeywordEnumeration : public KeywordEnumeration { if (resultLength != nullptr) *resultLength = 0; return nullptr; } - virtual int32_t count(UErrorCode &/*status*/) const override { - char *kw = keywords; + virtual int32_t count(UErrorCode& status) const override { + if (U_FAILURE(status)) { return 0; } + const char *kw = keywords.data(); int32_t result = 0; while(*kw) { if (uloc_toUnicodeLocaleKey(kw) != nullptr) { @@ -2553,13 +2665,11 @@ Locale::createKeywords(UErrorCode &status) const return result; } - const char* variantStart = uprv_strchr(fullName, '@'); - const char* assignment = uprv_strchr(fullName, '='); + const char* variantStart = uprv_strchr(getName(), '@'); + const char* assignment = uprv_strchr(getName(), '='); if(variantStart) { if(assignment > variantStart) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(variantStart+1, '@', sink, false, &status); + CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status); if (U_SUCCESS(status) && !keywords.isEmpty()) { result = new KeywordEnumeration(keywords.data(), keywords.length(), 0, status); if (!result) { @@ -2582,13 +2692,11 @@ Locale::createUnicodeKeywords(UErrorCode &status) const return result; } - const char* variantStart = uprv_strchr(fullName, '@'); - const char* assignment = uprv_strchr(fullName, '='); + const char* variantStart = uprv_strchr(getName(), '@'); + const char* assignment = uprv_strchr(getName(), '='); if(variantStart) { if(assignment > variantStart) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(variantStart+1, '@', sink, false, &status); + CharString keywords = ulocimp_getKeywords(variantStart + 1, '@', false, status); if (U_SUCCESS(status) && !keywords.isEmpty()) { result = new UnicodeKeywordEnumeration(keywords.data(), keywords.length(), 0, status); if (!result) { @@ -2605,7 +2713,7 @@ Locale::createUnicodeKeywords(UErrorCode &status) const int32_t Locale::getKeywordValue(const char* keywordName, char *buffer, int32_t bufLen, UErrorCode &status) const { - return uloc_getKeywordValue(fullName, keywordName, buffer, bufLen, &status); + return uloc_getKeywordValue(getName(), keywordName, buffer, bufLen, &status); } void @@ -2614,147 +2722,196 @@ Locale::getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& sta return; } - if (fIsBogus) { + if (isBogus()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - // TODO: Remove the need for a const char* to a NUL terminated buffer. - const CharString keywordName_nul(keywordName, status); - if (U_FAILURE(status)) { - return; - } - - ulocimp_getKeywordValue(fullName, keywordName_nul.data(), sink, &status); + ulocimp_getKeywordValue(getName(), keywordName, sink, status); } void Locale::getUnicodeKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const { - // TODO: Remove the need for a const char* to a NUL terminated buffer. - const CharString keywordName_nul(keywordName, status); if (U_FAILURE(status)) { return; } - const char* legacy_key = uloc_toLegacyKey(keywordName_nul.data()); - - if (legacy_key == nullptr) { + std::optional<std::string_view> legacy_key = ulocimp_toLegacyKeyWithFallback(keywordName); + if (!legacy_key.has_value()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - CharString legacy_value; - { - CharStringByteSink sink(&legacy_value); - getKeywordValue(legacy_key, sink, status); - } + auto legacy_value = getKeywordValue<CharString>(*legacy_key, status); if (U_FAILURE(status)) { return; } - const char* unicode_value = uloc_toUnicodeLocaleType( - keywordName_nul.data(), legacy_value.data()); - - if (unicode_value == nullptr) { + std::optional<std::string_view> unicode_value = + ulocimp_toBcpTypeWithFallback(keywordName, legacy_value.toStringPiece()); + if (!unicode_value.has_value()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - sink.Append(unicode_value, static_cast<int32_t>(uprv_strlen(unicode_value))); + sink.Append(unicode_value->data(), static_cast<int32_t>(unicode_value->size())); } void -Locale::setKeywordValue(const char* keywordName, const char* keywordValue, UErrorCode &status) -{ - if (U_FAILURE(status)) { +Locale::setKeywordValue(StringPiece keywordName, + StringPiece keywordValue, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (keywordName.empty()) { + status = U_ILLEGAL_ARGUMENT_ERROR; return; } if (status == U_STRING_NOT_TERMINATED_WARNING) { status = U_ZERO_ERROR; } - int32_t bufferLength = uprv_max((int32_t)(uprv_strlen(fullName) + 1), ULOC_FULLNAME_CAPACITY); - int32_t newLength = uloc_setKeywordValue(keywordName, keywordValue, fullName, - bufferLength, &status) + 1; - U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); - /* Handle the case the current buffer is not enough to hold the new id */ - if (status == U_BUFFER_OVERFLOW_ERROR) { - U_ASSERT(newLength > bufferLength); - char* newFullName = (char *)uprv_malloc(newLength); - if (newFullName == nullptr) { + + CharString localeID(getName(), -1, status); + ulocimp_setKeywordValue(keywordName, keywordValue, localeID, status); + if (U_FAILURE(status)) { + if (status == U_MEMORY_ALLOCATION_ERROR) { + setToBogus(); + } + return; + } + + const char* at = locale_getKeywordsStart(localeID.toStringPiece()); + bool hasKeywords = at != nullptr && uprv_strchr(at + 1, '=') != nullptr; + + Nest* nest = payload.get<Nest>(); + if (!hasKeywords) { + if (nest == nullptr) { + // There are no longer any keywords left, so it might now be + // possible to move the payload from Heap to Nest. + Heap* heap = payload.get<Heap>(); + U_ASSERT(heap != nullptr); + if (Nest::fits(localeID.length(), heap->language, heap->script, heap->region)) { + int32_t variantBegin = heap->ptr->variantBegin; + U_ASSERT(variantBegin >= 0); + U_ASSERT(static_cast<size_t>(variantBegin) < sizeof Nest::baseName); + nest = &payload.emplace<Nest>(std::move(*heap), static_cast<uint8_t>(variantBegin)); + localeID.extract(nest->baseName, sizeof Nest::baseName, status); + } else { + heap->ptr->baseName.clear(); + heap->ptr->fullName = localeID.toStringPiece(); + if (heap->ptr->fullName.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + setToBogus(); + return; + } + } + } + } else { + Heap* heap = nullptr; + if (nest != nullptr) { + // A keyword has been added, so the payload now needs to be moved + // from Nest to Heap so that it can get a baseName. + Nest copy(*nest); + heap = &payload.emplace<Heap>(copy.language, + copy.script, + copy.region, + copy.variantBegin); + if (isBogus()) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } else { + heap = payload.get<Heap>(); + } + U_ASSERT(heap != nullptr); + heap->ptr->fullName = localeID.toStringPiece(); + if (heap->ptr->fullName.isEmpty()) { status = U_MEMORY_ALLOCATION_ERROR; + setToBogus(); return; } - uprv_strcpy(newFullName, fullName); - if (fullName != fullNameBuffer) { - // if full Name is already on the heap, need to free it. - uprv_free(fullName); - if (baseName == fullName) { - baseName = newFullName; // baseName should not point to freed memory. + + if (heap->ptr->baseName.isEmpty()) { + // Has added the first keyword, meaning that the fullName is no longer also the baseName. + if (std::string_view::size_type baseNameLength = at - localeID.data(); baseNameLength > 0) { + heap->ptr->baseName = {heap->ptr->fullName.data(), baseNameLength}; + if (heap->ptr->baseName.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + setToBogus(); + return; + } } } - fullName = newFullName; - status = U_ZERO_ERROR; - uloc_setKeywordValue(keywordName, keywordValue, fullName, newLength, &status); - U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); - } else { - U_ASSERT(newLength <= bufferLength); - } - if (U_SUCCESS(status) && baseName == fullName) { - // May have added the first keyword, meaning that the fullName is no longer also the baseName. - initBaseName(status); } } -void -Locale::setKeywordValue(StringPiece keywordName, - StringPiece keywordValue, - UErrorCode& status) { - // TODO: Remove the need for a const char* to a NUL terminated buffer. - const CharString keywordName_nul(keywordName, status); - const CharString keywordValue_nul(keywordValue, status); - setKeywordValue(keywordName_nul.data(), keywordValue_nul.data(), status); -} - void Locale::setUnicodeKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status) { - // TODO: Remove the need for a const char* to a NUL terminated buffer. - const CharString keywordName_nul(keywordName, status); - const CharString keywordValue_nul(keywordValue, status); - if (U_FAILURE(status)) { return; } - const char* legacy_key = uloc_toLegacyKey(keywordName_nul.data()); - - if (legacy_key == nullptr) { + std::optional<std::string_view> legacy_key = ulocimp_toLegacyKeyWithFallback(keywordName); + if (!legacy_key.has_value()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } - const char* legacy_value = nullptr; - - if (!keywordValue_nul.isEmpty()) { - legacy_value = - uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data()); + std::string_view value; - if (legacy_value == nullptr) { + if (!keywordValue.empty()) { + std::optional<std::string_view> legacy_value = + ulocimp_toLegacyTypeWithFallback(keywordName, keywordValue); + if (!legacy_value.has_value()) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } + value = *legacy_value; } - setKeywordValue(legacy_key, legacy_value, status); + setKeywordValue(*legacy_key, value, status); } -const char * +const char* +Locale::getCountry() const { + return getField<&Nest::getRegion, &Heap::getRegion>(); +} + +const char* +Locale::getLanguage() const { + return getField<&Nest::getLanguage, &Heap::getLanguage>(); +} + +const char* +Locale::getScript() const { + return getField<&Nest::getScript, &Heap::getScript>(); +} + +const char* +Locale::getVariant() const { + return getField<&Nest::getVariant, &Heap::getVariant>(); +} + +const char* +Locale::getName() const { + return getField<&Nest::getBaseName, &Heap::getFullName>(); +} + +const char* Locale::getBaseName() const { - return baseName; + return getField<&Nest::getBaseName, &Heap::getBaseName>(); +} + +template <const char* (Locale::Nest::*const NEST)() const, + const char* (Locale::Heap::*const HEAP)() const> +const char* Locale::getField() const { + return payload.visit([] { return ""; }, + [](const Nest& nest) { return (nest.*NEST)(); }, + [](const Heap& heap) { return (heap.*HEAP)(); }); } Locale::Iterator::~Iterator() = default; diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index eedfb8149e26d8..1c9447fa2bf3b5 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -19,6 +19,9 @@ * that then do not depend on resource bundle code and likely-subtags data. */ +#include <string_view> +#include <utility> + #include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/locid.h" @@ -33,72 +36,31 @@ #include "cstring.h" #include "loclikelysubtags.h" #include "ulocimp.h" -#include "ustr_imp.h" - -/** - * Append a tag to a buffer, adding the separator if necessary. The buffer - * must be large enough to contain the resulting tag plus any separator - * necessary. The tag must not be a zero-length string. - * - * @param tag The tag to add. - * @param tagLength The length of the tag. - * @param buffer The output buffer. - * @param bufferLength The length of the output buffer. This is an input/output parameter. - **/ -static void U_CALLCONV -appendTag( - const char* tag, - int32_t tagLength, - char* buffer, - int32_t* bufferLength, - UBool withSeparator) { - if (withSeparator) { - buffer[*bufferLength] = '_'; - ++(*bufferLength); - } - - uprv_memmove( - &buffer[*bufferLength], - tag, - tagLength); - - *bufferLength += tagLength; -} +namespace { /** * Create a tag string from the supplied parameters. The lang, script and region * parameters may be nullptr pointers. If they are, their corresponding length parameters * must be less than or equal to 0. * - * If any of the language, script or region parameters are empty, and the alternateTags - * parameter is not nullptr, it will be parsed for potential language, script and region tags - * to be used when constructing the new tag. If the alternateTags parameter is nullptr, or - * it contains no language tag, the default tag for the unknown language is used. - * - * If the length of the new string exceeds the capacity of the output buffer, - * the function copies as many bytes to the output buffer as it can, and returns - * the error U_BUFFER_OVERFLOW_ERROR. - * * If an illegal argument is provided, the function returns the error * U_ILLEGAL_ARGUMENT_ERROR. * - * Note that this function can return the warning U_STRING_NOT_TERMINATED_WARNING if - * the tag string fits in the output buffer, but the null terminator doesn't. - * * @param lang The language tag to use. * @param langLength The length of the language tag. * @param script The script tag to use. * @param scriptLength The length of the script tag. * @param region The region tag to use. * @param regionLength The length of the region tag. + * @param variant The region tag to use. + * @param variantLength The length of the region tag. * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. - * @param alternateTags A string containing any alternate tags. * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. **/ -static void U_CALLCONV +void U_CALLCONV createTagStringWithAlternates( const char* lang, int32_t langLength, @@ -106,575 +68,243 @@ createTagStringWithAlternates( int32_t scriptLength, const char* region, int32_t regionLength, + const char* variant, + int32_t variantLength, const char* trailing, int32_t trailingLength, - const char* alternateTags, icu::ByteSink& sink, - UErrorCode* err) { - - if (U_FAILURE(*err)) { - goto error; - } - else if (langLength >= ULOC_LANG_CAPACITY || - scriptLength >= ULOC_SCRIPT_CAPACITY || - regionLength >= ULOC_COUNTRY_CAPACITY) { - goto error; - } - else { - /** - * ULOC_FULLNAME_CAPACITY will provide enough capacity - * that we can build a string that contains the language, - * script and region code without worrying about overrunning - * the user-supplied buffer. - **/ - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - int32_t tagLength = 0; - UBool regionAppended = false; - - if (langLength > 0) { - appendTag( - lang, - langLength, - tagBuffer, - &tagLength, - /*withSeparator=*/false); - } - else if (alternateTags == nullptr) { - /* - * Use the empty string for an unknown language, if - * we found no language. - */ - } - else { - /* - * Parse the alternateTags string for the language. - */ - char alternateLang[ULOC_LANG_CAPACITY]; - int32_t alternateLangLength = sizeof(alternateLang); - - alternateLangLength = - uloc_getLanguage( - alternateTags, - alternateLang, - alternateLangLength, - err); - if(U_FAILURE(*err) || - alternateLangLength >= ULOC_LANG_CAPACITY) { - goto error; - } - else if (alternateLangLength == 0) { - /* - * Use the empty string for an unknown language, if - * we found no language. - */ - } - else { - appendTag( - alternateLang, - alternateLangLength, - tagBuffer, - &tagLength, - /*withSeparator=*/false); - } - } - - if (scriptLength > 0) { - appendTag( - script, - scriptLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - } - else if (alternateTags != nullptr) { - /* - * Parse the alternateTags string for the script. - */ - char alternateScript[ULOC_SCRIPT_CAPACITY]; - - const int32_t alternateScriptLength = - uloc_getScript( - alternateTags, - alternateScript, - sizeof(alternateScript), - err); - - if (U_FAILURE(*err) || - alternateScriptLength >= ULOC_SCRIPT_CAPACITY) { - goto error; - } - else if (alternateScriptLength > 0) { - appendTag( - alternateScript, - alternateScriptLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - } - } - - if (regionLength > 0) { - appendTag( - region, - regionLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - - regionAppended = true; - } - else if (alternateTags != nullptr) { - /* - * Parse the alternateTags string for the region. - */ - char alternateRegion[ULOC_COUNTRY_CAPACITY]; - - const int32_t alternateRegionLength = - uloc_getCountry( - alternateTags, - alternateRegion, - sizeof(alternateRegion), - err); - if (U_FAILURE(*err) || - alternateRegionLength >= ULOC_COUNTRY_CAPACITY) { - goto error; - } - else if (alternateRegionLength > 0) { - appendTag( - alternateRegion, - alternateRegionLength, - tagBuffer, - &tagLength, - /*withSeparator=*/true); - - regionAppended = true; - } - } - - /** - * Copy the partial tag from our internal buffer to the supplied - * target. - **/ - sink.Append(tagBuffer, tagLength); - - if (trailingLength > 0) { - if (*trailing != '@') { - sink.Append("_", 1); - if (!regionAppended) { - /* extra separator is required */ - sink.Append("_", 1); - } - } - - /* - * Copy the trailing data into the supplied buffer. - */ - sink.Append(trailing, trailingLength); - } - + UErrorCode& err) { + if (U_FAILURE(err)) { return; } -error: - - /** - * An overflow indicates the locale ID passed in - * is ill-formed. If we got here, and there was - * no previous error, it's an implicit overflow. - **/ - if (*err == U_BUFFER_OVERFLOW_ERROR || - U_SUCCESS(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + if (langLength >= ULOC_LANG_CAPACITY || + scriptLength >= ULOC_SCRIPT_CAPACITY || + regionLength >= ULOC_COUNTRY_CAPACITY) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } -} - -/** - * Parse the language, script, and region subtags from a tag string, and copy the - * results into the corresponding output parameters. The buffers are null-terminated, - * unless overflow occurs. - * - * The langLength, scriptLength, and regionLength parameters are input/output - * parameters, and must contain the capacity of their corresponding buffers on - * input. On output, they will contain the actual length of the buffers, not - * including the null terminator. - * - * If the length of any of the output subtags exceeds the capacity of the corresponding - * buffer, the function copies as many bytes to the output buffer as it can, and returns - * the error U_BUFFER_OVERFLOW_ERROR. It will not parse any more subtags once overflow - * occurs. - * - * If an illegal argument is provided, the function returns the error - * U_ILLEGAL_ARGUMENT_ERROR. - * - * @param localeID The locale ID to parse. - * @param lang The language tag buffer. - * @param langLength The length of the language tag. - * @param script The script tag buffer. - * @param scriptLength The length of the script tag. - * @param region The region tag buffer. - * @param regionLength The length of the region tag. - * @param err A pointer to a UErrorCode for error reporting. - * @return The number of chars of the localeID parameter consumed. - **/ -static int32_t U_CALLCONV -parseTagString( - const char* localeID, - char* lang, - int32_t* langLength, - char* script, - int32_t* scriptLength, - char* region, - int32_t* regionLength, - UErrorCode* err) -{ - const char* position = localeID; - int32_t subtagLength = 0; - if(U_FAILURE(*err) || - localeID == nullptr || - lang == nullptr || - langLength == nullptr || - script == nullptr || - scriptLength == nullptr || - region == nullptr || - regionLength == nullptr) { - goto error; + if (langLength > 0) { + sink.Append(lang, langLength); } - subtagLength = ulocimp_getLanguage(position, &position, *err).extract(lang, *langLength, *err); - - /* - * Note that we explicit consider U_STRING_NOT_TERMINATED_WARNING - * to be an error, because it indicates the user-supplied tag is - * not well-formed. - */ - if(U_FAILURE(*err)) { - goto error; + if (scriptLength > 0) { + sink.Append("_", 1); + sink.Append(script, scriptLength); } - *langLength = subtagLength; - - /* - * If no language was present, use the empty string instead. - * Otherwise, move past any separator. - */ - if (_isIDSeparator(*position)) { - ++position; + if (regionLength > 0) { + sink.Append("_", 1); + sink.Append(region, regionLength); } - subtagLength = ulocimp_getScript(position, &position, *err).extract(script, *scriptLength, *err); - - if(U_FAILURE(*err)) { - goto error; + if (variantLength > 0) { + if (regionLength == 0) { + /* extra separator is required */ + sink.Append("_", 1); + } + sink.Append("_", 1); + sink.Append(variant, variantLength); } - *scriptLength = subtagLength; - - if (*scriptLength > 0) { + if (trailingLength > 0) { /* - * Move past any separator. + * Copy the trailing data into the supplied buffer. */ - if (_isIDSeparator(*position)) { - ++position; - } - } - - subtagLength = ulocimp_getCountry(position, &position, *err).extract(region, *regionLength, *err); - - if(U_FAILURE(*err)) { - goto error; - } - - *regionLength = subtagLength; - - if (*regionLength <= 0 && *position != 0 && *position != '@') { - /* back up over consumed trailing separator */ - --position; + sink.Append(trailing, trailingLength); } +} -exit: - - return (int32_t)(position - localeID); - -error: - - /** - * If we get here, we have no explicit error, it's the result of an - * illegal argument. - **/ - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; +bool CHECK_TRAILING_VARIANT_SIZE(const char* variant, int32_t variantLength) { + int32_t count = 0; + for (int32_t i = 0; i < variantLength; i++) { + if (_isIDSeparator(variant[i])) { + count = 0; + } else if (count == 8) { + return false; + } else { + count++; + } } - - goto exit; + return true; } -#define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) UPRV_BLOCK_MACRO_BEGIN { \ - int32_t count = 0; \ - int32_t i; \ - for (i = 0; i < trailingLength; i++) { \ - if (trailing[i] == '-' || trailing[i] == '_') { \ - count = 0; \ - if (count > 8) { \ - goto error; \ - } \ - } else if (trailing[i] == '@') { \ - break; \ - } else if (count > 8) { \ - goto error; \ - } else { \ - count++; \ - } \ - } \ -} UPRV_BLOCK_MACRO_END - -static UBool +void _uloc_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* err) { - char lang[ULOC_LANG_CAPACITY]; - int32_t langLength = sizeof(lang); - char script[ULOC_SCRIPT_CAPACITY]; - int32_t scriptLength = sizeof(script); - char region[ULOC_COUNTRY_CAPACITY]; - int32_t regionLength = sizeof(region); - const char* trailing = ""; - int32_t trailingLength = 0; - int32_t trailingIndex = 0; - - if(U_FAILURE(*err)) { - goto error; + UErrorCode& err) { + if (U_FAILURE(err)) { + return; } + if (localeID == nullptr) { - goto error; + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - trailingIndex = parseTagString( - localeID, - lang, - &langLength, - script, - &scriptLength, - region, - ®ionLength, - err); - if(U_FAILURE(*err)) { - /* Overflow indicates an illegal argument error */ - if (*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - } - - goto error; - } - if (langLength > 3) { - goto error; + icu::CharString lang; + icu::CharString script; + icu::CharString region; + icu::CharString variant; + const char* trailing = nullptr; + ulocimp_getSubtags(localeID, &lang, &script, ®ion, &variant, &trailing, err); + if (U_FAILURE(err)) { + return; } - /* Find the length of the trailing portion. */ - while (_isIDSeparator(localeID[trailingIndex])) { - trailingIndex++; + if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - trailing = &localeID[trailingIndex]; - trailingLength = (int32_t)uprv_strlen(trailing); - CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - { - const icu::XLikelySubtags* likelySubtags = icu::XLikelySubtags::getSingleton(*err); - if(U_FAILURE(*err)) { - goto error; - } - // We need to keep l on the stack because lsr may point into internal - // memory of l. - icu::Locale l = icu::Locale::createFromName(localeID); - if (l.isBogus()) { - goto error; - } - icu::LSR lsr = likelySubtags->makeMaximizedLsrFrom(l, true, *err); - if(U_FAILURE(*err)) { - goto error; - } - const char* language = lsr.language; - if (uprv_strcmp(language, "und") == 0) { - language = ""; - } - createTagStringWithAlternates( - language, - (int32_t)uprv_strlen(language), - lsr.script, - (int32_t)uprv_strlen(lsr.script), - lsr.region, - (int32_t)uprv_strlen(lsr.region), - trailing, - trailingLength, - nullptr, - sink, - err); - if(U_FAILURE(*err)) { - goto error; + if (lang.length() == 4) { + if (script.isEmpty()) { + script = std::move(lang); + lang.clear(); + } else { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } + } else if (lang.length() > 8) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - return true; -error: + int32_t trailingLength = static_cast<int32_t>(uprv_strlen(trailing)); - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err); + if (U_FAILURE(err)) { + return; + } + // We need to keep l on the stack because lsr may point into internal + // memory of l. + icu::Locale l = icu::Locale::createFromName(localeID); + if (l.isBogus()) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - return false; + icu::LSR lsr = likelySubtags->makeMaximizedLsrFrom(l, true, err); + if (U_FAILURE(err)) { + return; + } + const char* language = lsr.language; + if (uprv_strcmp(language, "und") == 0) { + language = ""; + } + createTagStringWithAlternates( + language, + static_cast<int32_t>(uprv_strlen(language)), + lsr.script, + static_cast<int32_t>(uprv_strlen(lsr.script)), + lsr.region, + static_cast<int32_t>(uprv_strlen(lsr.region)), + variant.data(), + variant.length(), + trailing, + trailingLength, + sink, + err); } -// Add likely subtags to the sink -// return true if the value in the sink is produced by a match during the lookup -// return false if the value in the sink is the same as input because there are -// no match after the lookup. -static UBool _ulocimp_addLikelySubtags(const char*, icu::ByteSink&, UErrorCode*); - -static void +void _uloc_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* err) { - icu::CharString maximizedTagBuffer; - - char lang[ULOC_LANG_CAPACITY]; - int32_t langLength = sizeof(lang); - char script[ULOC_SCRIPT_CAPACITY]; - int32_t scriptLength = sizeof(script); - char region[ULOC_COUNTRY_CAPACITY]; - int32_t regionLength = sizeof(region); - const char* trailing = ""; - int32_t trailingLength = 0; - int32_t trailingIndex = 0; - - if(U_FAILURE(*err)) { - goto error; - } - else if (localeID == nullptr) { - goto error; - } - - trailingIndex = - parseTagString( - localeID, - lang, - &langLength, - script, - &scriptLength, - region, - ®ionLength, - err); - if(U_FAILURE(*err)) { - - /* Overflow indicates an illegal argument error */ - if (*err == U_BUFFER_OVERFLOW_ERROR) { - *err = U_ILLEGAL_ARGUMENT_ERROR; - } - - goto error; + UErrorCode& err) { + if (U_FAILURE(err)) { + return; } - /* Find the spot where the variants or the keywords begin, if any. */ - while (_isIDSeparator(localeID[trailingIndex])) { - trailingIndex++; + if (localeID == nullptr) { + err = U_ILLEGAL_ARGUMENT_ERROR; + return; } - trailing = &localeID[trailingIndex]; - trailingLength = (int32_t)uprv_strlen(trailing); - CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); + icu::CharString lang; + icu::CharString script; + icu::CharString region; + icu::CharString variant; + const char* trailing = nullptr; + ulocimp_getSubtags(localeID, &lang, &script, ®ion, &variant, &trailing, err); + if (U_FAILURE(err)) { + return; + } - { - const icu::XLikelySubtags* likelySubtags = icu::XLikelySubtags::getSingleton(*err); - if(U_FAILURE(*err)) { - goto error; - } - icu::LSR lsr = likelySubtags->minimizeSubtags( - {lang, langLength}, - {script, scriptLength}, - {region, regionLength}, - favorScript, - *err); - if(U_FAILURE(*err)) { - goto error; - } - const char* language = lsr.language; - if (uprv_strcmp(language, "und") == 0) { - language = ""; - } - createTagStringWithAlternates( - language, - (int32_t)uprv_strlen(language), - lsr.script, - (int32_t)uprv_strlen(lsr.script), - lsr.region, - (int32_t)uprv_strlen(lsr.region), - trailing, - trailingLength, - nullptr, - sink, - err); - if(U_FAILURE(*err)) { - goto error; - } + if (!CHECK_TRAILING_VARIANT_SIZE(variant.data(), variant.length())) { + err = U_ILLEGAL_ARGUMENT_ERROR; return; } -error: + int32_t trailingLength = static_cast<int32_t>(uprv_strlen(trailing)); - if (!U_FAILURE(*err)) { - *err = U_ILLEGAL_ARGUMENT_ERROR; + const icu::LikelySubtags* likelySubtags = icu::LikelySubtags::getSingleton(err); + if (U_FAILURE(err)) { + return; } + icu::LSR lsr = likelySubtags->minimizeSubtags( + lang.toStringPiece(), + script.toStringPiece(), + region.toStringPiece(), + favorScript, + err); + if (U_FAILURE(err)) { + return; + } + const char* language = lsr.language; + if (uprv_strcmp(language, "und") == 0) { + language = ""; + } + createTagStringWithAlternates( + language, + static_cast<int32_t>(uprv_strlen(language)), + lsr.script, + static_cast<int32_t>(uprv_strlen(lsr.script)), + lsr.region, + static_cast<int32_t>(uprv_strlen(lsr.region)), + variant.data(), + variant.length(), + trailing, + trailingLength, + sink, + err); } +} // namespace + U_CAPI int32_t U_EXPORT2 uloc_addLikelySubtags(const char* localeID, char* maximizedLocaleID, int32_t maximizedLocaleIDCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink( - maximizedLocaleID, maximizedLocaleIDCapacity); - - ulocimp_addLikelySubtags(localeID, sink, status); - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return sink.Overflowed() ? reslen : -1; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars( - maximizedLocaleID, maximizedLocaleIDCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + maximizedLocaleID, maximizedLocaleIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_addLikelySubtags(localeID, sink, status); + }, + *status); } -static UBool -_ulocimp_addLikelySubtags(const char* localeID, - icu::ByteSink& sink, - UErrorCode* status) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink localeSink(&localeBuffer); - ulocimp_canonicalize(localeID, localeSink, status); - } - if (U_SUCCESS(*status)) { - return _uloc_addLikelySubtags(localeBuffer.data(), sink, status); - } else { - return false; - } +U_EXPORT icu::CharString +ulocimp_addLikelySubtags(const char* localeID, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_addLikelySubtags(localeID, sink, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* status) { - _ulocimp_addLikelySubtags(localeID, sink, status); + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (localeID == nullptr) { + localeID = uloc_getDefault(); + } + icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status); + _uloc_addLikelySubtags(localeBuffer.data(), sink, status); } U_CAPI int32_t U_EXPORT2 @@ -682,40 +312,35 @@ uloc_minimizeSubtags(const char* localeID, char* minimizedLocaleID, int32_t minimizedLocaleIDCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink( - minimizedLocaleID, minimizedLocaleIDCapacity); - - ulocimp_minimizeSubtags(localeID, sink, false, status); - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return sink.Overflowed() ? reslen : -1; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars( - minimizedLocaleID, minimizedLocaleIDCapacity, reslen, status); - } + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + minimizedLocaleID, minimizedLocaleIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_minimizeSubtags(localeID, sink, false, status); + }, + *status); +} - return reslen; +U_EXPORT icu::CharString +ulocimp_minimizeSubtags(const char* localeID, + bool favorScript, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_minimizeSubtags(localeID, sink, favorScript, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* status) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink localeSink(&localeBuffer); - ulocimp_canonicalize(localeID, localeSink, status); + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + icu::CharString localeBuffer = ulocimp_canonicalize(localeID, status); _uloc_minimizeSubtags(localeBuffer.data(), sink, favorScript, status); } @@ -728,22 +353,18 @@ static const char LANG_DIR_STRING[] = U_CAPI UBool U_EXPORT2 uloc_isRightToLeft(const char *locale) { UErrorCode errorCode = U_ZERO_ERROR; - char script[8]; - int32_t scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - scriptLength == 0) { + icu::CharString lang; + icu::CharString script; + ulocimp_getSubtags( + locale == nullptr ? uloc_getDefault() : locale, + &lang, &script, nullptr, nullptr, nullptr, errorCode); + if (U_FAILURE(errorCode) || script.isEmpty()) { // Fastpath: We know the likely scripts and their writing direction // for some common languages. - errorCode = U_ZERO_ERROR; - char lang[8]; - int32_t langLength = uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { - return false; - } - if (langLength > 0) { - const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); + if (!lang.isEmpty()) { + const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang.data()); if (langPtr != nullptr) { - switch (langPtr[langLength]) { + switch (langPtr[lang.length()]) { case '-': return false; case '+': return true; default: break; // partial match of a longer code @@ -752,21 +373,16 @@ uloc_isRightToLeft(const char *locale) { } // Otherwise, find the likely script. errorCode = U_ZERO_ERROR; - icu::CharString likely; - { - icu::CharStringByteSink sink(&likely); - ulocimp_addLikelySubtags(locale, sink, &errorCode); - } - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString likely = ulocimp_addLikelySubtags(locale, errorCode); + if (U_FAILURE(errorCode)) { return false; } - scriptLength = uloc_getScript(likely.data(), script, UPRV_LENGTHOF(script), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - scriptLength == 0) { + ulocimp_getSubtags(likely.toStringPiece(), nullptr, &script, nullptr, nullptr, nullptr, errorCode); + if (U_FAILURE(errorCode) || script.isEmpty()) { return false; } } - UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); + UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script.data()); return uscript_isRightToLeft(scriptCode); } @@ -779,65 +395,115 @@ Locale::isRightToLeft() const { U_NAMESPACE_END -// The following must at least allow for rg key value (6) plus terminator (1). -#define ULOC_RG_BUFLEN 8 - -U_CAPI int32_t U_EXPORT2 -ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, - char *region, int32_t regionCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - char rgBuf[ULOC_RG_BUFLEN]; - UErrorCode rgStatus = U_ZERO_ERROR; - - // First check for rg keyword value - icu::CharString rg; - { - icu::CharStringByteSink sink(&rg); - ulocimp_getKeywordValue(localeID, "rg", sink, &rgStatus); - } - int32_t rgLen = rg.length(); - if (U_FAILURE(rgStatus) || rgLen < 3 || rgLen > 7) { - rgLen = 0; - } else { - // chop off the subdivision code (which will generally be "zzzz" anyway) - const char* const data = rg.data(); - if (uprv_isASCIILetter(data[0])) { - rgLen = 2; - rgBuf[0] = uprv_toupper(data[0]); - rgBuf[1] = uprv_toupper(data[1]); - } else { - // assume three-digit region code - rgLen = 3; - uprv_memcpy(rgBuf, data, rgLen); +namespace { +icu::CharString +GetRegionFromKey(const char* localeID, std::string_view key, UErrorCode& status) { + icu::CharString result; + // First check for keyword value + icu::CharString kw = ulocimp_getKeywordValue(localeID, key, status); + int32_t len = kw.length(); + // In UTS35 + // type = alphanum{3,8} (sep alphanum{3,8})* ; + // so we know the subdivision must fit the type already. + // + // unicode_subdivision_id = unicode_region_subtag unicode_subdivision_suffix ; + // unicode_region_subtag = (alpha{2} | digit{3}) ; + // unicode_subdivision_suffix = alphanum{1,4} ; + // But we also know there are no id in start with digit{3} in + // https://github.com/unicode-org/cldr/blob/main/common/validity/subdivision.xml + // Therefore we can simplify as + // unicode_subdivision_id = alpha{2} alphanum{1,4} + // + // and only need to accept/reject the code based on the alpha{2} and the length. + if (U_SUCCESS(status) && len >= 3 && len <= 6 && + uprv_isASCIILetter(kw[0]) && uprv_isASCIILetter(kw[1])) { + // Additional Check + static icu::RegionValidateMap valid; + const char region[] = {kw[0], kw[1], '\0'}; + if (valid.isSet(region)) { + result.append(uprv_toupper(kw[0]), status); + result.append(uprv_toupper(kw[1]), status); } } + return result; +} +} // namespace - if (rgLen == 0) { +U_EXPORT icu::CharString +ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, + UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + icu::CharString rgBuf = GetRegionFromKey(localeID, "rg", status); + if (U_SUCCESS(status) && rgBuf.isEmpty()) { // No valid rg keyword value, try for unicode_region_subtag - rgLen = uloc_getCountry(localeID, rgBuf, ULOC_RG_BUFLEN, status); - if (U_FAILURE(*status)) { - rgLen = 0; - } else if (rgLen == 0 && inferRegion) { - // no unicode_region_subtag but inferRegion true, try likely subtags - rgStatus = U_ZERO_ERROR; - icu::CharString locBuf; - { - icu::CharStringByteSink sink(&locBuf); - ulocimp_addLikelySubtags(localeID, sink, &rgStatus); - } - if (U_SUCCESS(rgStatus)) { - rgLen = uloc_getCountry(locBuf.data(), rgBuf, ULOC_RG_BUFLEN, status); - if (U_FAILURE(*status)) { - rgLen = 0; + rgBuf = ulocimp_getRegion(localeID == nullptr ? uloc_getDefault() : localeID, status); + if (U_SUCCESS(status) && rgBuf.isEmpty() && inferRegion) { + // Second check for sd keyword value + rgBuf = GetRegionFromKey(localeID, "sd", status); + if (U_SUCCESS(status) && rgBuf.isEmpty()) { + // no unicode_region_subtag but inferRegion true, try likely subtags + UErrorCode rgStatus = U_ZERO_ERROR; + icu::CharString locBuf = ulocimp_addLikelySubtags(localeID, rgStatus); + if (U_SUCCESS(rgStatus)) { + rgBuf = ulocimp_getRegion(locBuf.toStringPiece(), status); } } } } - rgBuf[rgLen] = 0; - uprv_strncpy(region, rgBuf, regionCapacity); - return u_terminateChars(region, regionCapacity, rgLen, status); + return rgBuf; +} + +namespace { + +// The following data is generated by unit test code inside +// test/intltest/regiontst.cpp from the resource data while +// the test failed. +const uint32_t gValidRegionMap[] = { + 0xeedf597c, 0xdeddbdef, 0x15943f3f, 0x0e00d580, + 0xb0095c00, 0x0015fb9f, 0x781c068d, 0x0340400f, + 0xf42b1d00, 0xfd4f8141, 0x25d7fffc, 0x0100084b, + 0x538f3c40, 0x40000001, 0xfdf15100, 0x9fbb7ae7, + 0x0410419a, 0x00408557, 0x00004002, 0x00100001, + 0x00400408, 0x00000001, +}; + +} // namespace + // +U_NAMESPACE_BEGIN +RegionValidateMap::RegionValidateMap() { + uprv_memcpy(map, gValidRegionMap, sizeof(map)); +} + +RegionValidateMap::~RegionValidateMap() { } +bool RegionValidateMap::isSet(const char* region) const { + int32_t index = value(region); + if (index < 0) { + return false; + } + return 0 != (map[index / 32] & (1L << (index % 32))); +} + +bool RegionValidateMap::equals(const RegionValidateMap& that) const { + return uprv_memcmp(map, that.map, sizeof(map)) == 0; +} + +// The code transform two letter a-z to a integer valued between -1, 26x26. +// -1 indicate the region is outside the range of two letter a-z +// the rest of value is between 0 and 676 (= 26x26) and used as an index +// the bigmap in map. The map is an array of 22 int32_t. +// since 32x21 < 676/32 < 32x22 we store this 676 bits bitmap into 22 int32_t. +int32_t RegionValidateMap::value(const char* region) const { + if (uprv_isASCIILetter(region[0]) && uprv_isASCIILetter(region[1]) && + region[2] == '\0') { + return (uprv_toupper(region[0])-'A') * 26 + + (uprv_toupper(region[1])-'A'); + } + return -1; +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/loclikelysubtags.cpp b/deps/icu-small/source/common/loclikelysubtags.cpp index c2a7011b5093eb..b37aaeec718e15 100644 --- a/deps/icu-small/source/common/loclikelysubtags.cpp +++ b/deps/icu-small/source/common/loclikelysubtags.cpp @@ -51,8 +51,7 @@ LocaleDistanceData::~LocaleDistanceData() { delete[] paradigms; } -// TODO(ICU-20777): Rename to just LikelySubtagsData. -struct XLikelySubtagsData { +struct LikelySubtagsData { UResourceBundle *langInfoBundle = nullptr; UniqueCharStrings strings; CharStringMap languageAliases; @@ -63,14 +62,15 @@ struct XLikelySubtagsData { LocaleDistanceData distanceData; - XLikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {} + LikelySubtagsData(UErrorCode &errorCode) : strings(errorCode) {} - ~XLikelySubtagsData() { + ~LikelySubtagsData() { ures_close(langInfoBundle); delete[] lsrs; } void load(UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } langInfoBundle = ures_openDirect(nullptr, "langInfo", &errorCode); if (U_FAILURE(errorCode)) { return; } StackUResourceBundle stackTempBundle; @@ -231,6 +231,7 @@ struct XLikelySubtagsData { private: bool readStrings(const ResourceTable &table, const char *key, ResourceValue &value, LocalMemory<int32_t> &indexes, int32_t &length, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return false; } if (table.findValue(key, value)) { ResourceArray stringArray = value.getArray(errorCode); if (U_FAILURE(errorCode)) { return false; } @@ -297,7 +298,7 @@ struct XLikelySubtagsData { } UnicodeString toRegion(const ResourceArray& m49Array, ResourceValue &value, int encoded, UErrorCode &errorCode) { - if (encoded == 0 || encoded == 1) { + if (U_FAILURE(errorCode) || encoded == 0 || encoded == 1) { return UNICODE_STRING_SIMPLE(""); } encoded &= 0x00ffffff; @@ -315,6 +316,7 @@ struct XLikelySubtagsData { bool readLSREncodedStrings(const ResourceTable &table, const char* key, ResourceValue &value, const ResourceArray& m49Array, LocalMemory<int32_t> &indexes, int32_t &length, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return false; } if (table.findValue(key, value)) { const int32_t* vectors = value.getIntVector(length, errorCode); if (U_FAILURE(errorCode)) { return false; } @@ -339,7 +341,7 @@ struct XLikelySubtagsData { namespace { -XLikelySubtags *gLikelySubtags = nullptr; +LikelySubtags *gLikelySubtags = nullptr; UVector *gMacroregions = nullptr; UInitOnce gInitOnce {}; @@ -352,8 +354,56 @@ UBool U_CALLCONV cleanup() { return true; } -static const char16_t RANGE_MARKER = 0x7E; /* '~' */ +constexpr const char16_t* MACROREGION_HARDCODE[] = { + u"001~3", + u"005", + u"009", + u"011", + u"013~5", + u"017~9", + u"021", + u"029", + u"030", + u"034~5", + u"039", + u"053~4", + u"057", + u"061", + u"142~3", + u"145", + u"150~1", + u"154~5", + u"202", + u"419", + u"EU", + u"EZ", + u"QO", + u"UN", +}; + +constexpr char16_t RANGE_MARKER = 0x7E; /* '~' */ +void processMacroregionRange(const UnicodeString& regionName, UVector* newMacroRegions, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); + char16_t buf[6]; + regionName.extract(buf,6,status); + if ( rangeMarkerLocation > 0 ) { + char16_t endRange = regionName.charAt(rangeMarkerLocation+1); + buf[rangeMarkerLocation] = 0; + while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) { + LocalPointer<UnicodeString> newRegion(new UnicodeString(buf), status); + newMacroRegions->adoptElement(newRegion.orphan(),status); + buf[rangeMarkerLocation-1]++; + } + } else { + LocalPointer<UnicodeString> newRegion(new UnicodeString(regionName), status); + newMacroRegions->adoptElement(newRegion.orphan(),status); + } +} + +#if U_DEBUG UVector* loadMacroregions(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } LocalPointer<UVector> newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); LocalUResourceBundlePointer supplementalData(ures_openDirect(nullptr,"supplementalData",&status)); @@ -365,37 +415,52 @@ UVector* loadMacroregions(UErrorCode &status) { return nullptr; } - while (U_SUCCESS(status) && ures_hasNext(regionMacro.getAlias())) { + while (ures_hasNext(regionMacro.getAlias())) { UnicodeString regionName = ures_getNextUnicodeString(regionMacro.getAlias(),nullptr,&status); - int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); - char16_t buf[6]; - regionName.extract(buf,6,status); - if ( rangeMarkerLocation > 0 ) { - char16_t endRange = regionName.charAt(rangeMarkerLocation+1); - buf[rangeMarkerLocation] = 0; - while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) { - LocalPointer<UnicodeString> newRegion(new UnicodeString(buf), status); - newMacroRegions->adoptElement(newRegion.orphan(),status); - buf[rangeMarkerLocation-1]++; - } - } else { - LocalPointer<UnicodeString> newRegion(new UnicodeString(regionName), status); - newMacroRegions->adoptElement(newRegion.orphan(),status); + processMacroregionRange(regionName, newMacroRegions.getAlias(), status); + if (U_FAILURE(status)) { + return nullptr; } } + + return newMacroRegions.orphan(); +} +#endif // U_DEBUG + +UVector* getStaticMacroregions(UErrorCode &status) { + if (U_FAILURE(status)) { return nullptr; } + LocalPointer<UVector> newMacroRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); + + if (U_FAILURE(status)) { + return nullptr; + } + + for (const auto *region : MACROREGION_HARDCODE) { + UnicodeString regionName(region); + processMacroregionRange(regionName, newMacroRegions.getAlias(), status); + if (U_FAILURE(status)) { + return nullptr; + } + } + return newMacroRegions.orphan(); } } // namespace -void U_CALLCONV XLikelySubtags::initLikelySubtags(UErrorCode &errorCode) { +void U_CALLCONV LikelySubtags::initLikelySubtags(UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). U_ASSERT(gLikelySubtags == nullptr); - XLikelySubtagsData data(errorCode); + LikelySubtagsData data(errorCode); data.load(errorCode); if (U_FAILURE(errorCode)) { return; } - gLikelySubtags = new XLikelySubtags(data); - gMacroregions = loadMacroregions(errorCode); + gLikelySubtags = new LikelySubtags(data); + gMacroregions = getStaticMacroregions(errorCode); +#if U_DEBUG + auto macroregionsFromData = loadMacroregions(errorCode); + U_ASSERT((*gMacroregions) == (*macroregionsFromData)); + delete macroregionsFromData; +#endif if (U_FAILURE(errorCode) || gLikelySubtags == nullptr || gMacroregions == nullptr) { delete gLikelySubtags; delete gMacroregions; @@ -406,13 +471,13 @@ void U_CALLCONV XLikelySubtags::initLikelySubtags(UErrorCode &errorCode) { ucln_common_registerCleanup(UCLN_COMMON_LIKELY_SUBTAGS, cleanup); } -const XLikelySubtags *XLikelySubtags::getSingleton(UErrorCode &errorCode) { +const LikelySubtags *LikelySubtags::getSingleton(UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - umtx_initOnce(gInitOnce, &XLikelySubtags::initLikelySubtags, errorCode); + umtx_initOnce(gInitOnce, &LikelySubtags::initLikelySubtags, errorCode); return gLikelySubtags; } -XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : +LikelySubtags::LikelySubtags(LikelySubtagsData &data) : langInfoBundle(data.langInfoBundle), strings(data.strings.orphanCharStrings()), languageAliases(std::move(data.languageAliases)), @@ -421,7 +486,7 @@ XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : lsrs(data.lsrs), #if U_DEBUG lsrsLength(data.lsrsLength), -#endif +#endif // U_DEBUG distanceData(std::move(data.distanceData)) { data.langInfoBundle = nullptr; data.lsrs = nullptr; @@ -447,21 +512,22 @@ XLikelySubtags::XLikelySubtags(XLikelySubtagsData &data) : } } -XLikelySubtags::~XLikelySubtags() { +LikelySubtags::~LikelySubtags() { ures_close(langInfoBundle); delete strings; delete[] lsrs; } -LSR XLikelySubtags::makeMaximizedLsrFrom(const Locale &locale, +LSR LikelySubtags::makeMaximizedLsrFrom(const Locale &locale, bool returnInputIfUnmatch, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } if (locale.isBogus()) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return LSR("", "", "", LSR::EXPLICIT_LSR); + return {}; } const char *name = locale.getName(); - if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") + if (!returnInputIfUnmatch && uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") // Private use language tag x-subtag-subtag... which CLDR changes to // und-x-subtag-subtag... return LSR(name, "", "", LSR::EXPLICIT_LSR); @@ -490,45 +556,48 @@ const char *getCanonical(const CharStringMap &aliases, const char *alias) { } // namespace -LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, const char *region, +LSR LikelySubtags::makeMaximizedLsr(const char *language, const char *script, const char *region, const char *variant, bool returnInputIfUnmatch, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } // Handle pseudolocales like en-XA, ar-XB, fr-PSCRACK. // They should match only themselves, // not other locales with what looks like the same language and script subtags. - char c1; - if (region[0] == 'X' && (c1 = region[1]) != 0 && region[2] == 0) { - switch (c1) { - case 'A': - return LSR(PSEUDO_ACCENTS_PREFIX, language, script, region, - LSR::EXPLICIT_LSR, errorCode); - case 'B': - return LSR(PSEUDO_BIDI_PREFIX, language, script, region, - LSR::EXPLICIT_LSR, errorCode); - case 'C': - return LSR(PSEUDO_CRACKED_PREFIX, language, script, region, - LSR::EXPLICIT_LSR, errorCode); - default: // normal locale - break; - } - } - - if (variant[0] == 'P' && variant[1] == 'S') { - int32_t lsrFlags = *region == 0 ? - LSR::EXPLICIT_LANGUAGE | LSR::EXPLICIT_SCRIPT : LSR::EXPLICIT_LSR; - if (uprv_strcmp(variant, "PSACCENT") == 0) { - return LSR(PSEUDO_ACCENTS_PREFIX, language, script, - *region == 0 ? "XA" : region, lsrFlags, errorCode); - } else if (uprv_strcmp(variant, "PSBIDI") == 0) { - return LSR(PSEUDO_BIDI_PREFIX, language, script, - *region == 0 ? "XB" : region, lsrFlags, errorCode); - } else if (uprv_strcmp(variant, "PSCRACK") == 0) { - return LSR(PSEUDO_CRACKED_PREFIX, language, script, - *region == 0 ? "XC" : region, lsrFlags, errorCode); - } - // else normal locale - } + if (!returnInputIfUnmatch) { + char c1; + if (region[0] == 'X' && (c1 = region[1]) != 0 && region[2] == 0) { + switch (c1) { + case 'A': + return LSR(PSEUDO_ACCENTS_PREFIX, language, script, region, + LSR::EXPLICIT_LSR, errorCode); + case 'B': + return LSR(PSEUDO_BIDI_PREFIX, language, script, region, + LSR::EXPLICIT_LSR, errorCode); + case 'C': + return LSR(PSEUDO_CRACKED_PREFIX, language, script, region, + LSR::EXPLICIT_LSR, errorCode); + default: // normal locale + break; + } + } + + if (variant[0] == 'P' && variant[1] == 'S') { + int32_t lsrFlags = *region == 0 ? + LSR::EXPLICIT_LANGUAGE | LSR::EXPLICIT_SCRIPT : LSR::EXPLICIT_LSR; + if (uprv_strcmp(variant, "PSACCENT") == 0) { + return LSR(PSEUDO_ACCENTS_PREFIX, language, script, + *region == 0 ? "XA" : region, lsrFlags, errorCode); + } else if (uprv_strcmp(variant, "PSBIDI") == 0) { + return LSR(PSEUDO_BIDI_PREFIX, language, script, + *region == 0 ? "XB" : region, lsrFlags, errorCode); + } else if (uprv_strcmp(variant, "PSCRACK") == 0) { + return LSR(PSEUDO_CRACKED_PREFIX, language, script, + *region == 0 ? "XC" : region, lsrFlags, errorCode); + } + // else normal locale + } + } // end of if (!returnInputIfUnmatch) language = getCanonical(languageAliases, language); // (We have no script mappings.) @@ -536,33 +605,32 @@ LSR XLikelySubtags::makeMaximizedLsr(const char *language, const char *script, c return maximize(language, script, region, returnInputIfUnmatch, errorCode); } -LSR XLikelySubtags::maximize(const char *language, const char *script, const char *region, +LSR LikelySubtags::maximize(const char *language, const char *script, const char *region, bool returnInputIfUnmatch, UErrorCode &errorCode) const { - return maximize({language, (int32_t)uprv_strlen(language)}, - {script, (int32_t)uprv_strlen(script)}, - {region, (int32_t)uprv_strlen(region)}, + if (U_FAILURE(errorCode)) { return {}; } + return maximize({language, static_cast<int32_t>(uprv_strlen(language))}, + {script, static_cast<int32_t>(uprv_strlen(script))}, + {region, static_cast<int32_t>(uprv_strlen(region))}, returnInputIfUnmatch, errorCode); } -bool XLikelySubtags::isMacroregion(StringPiece& region, UErrorCode& errorCode) const { +bool LikelySubtags::isMacroregion(StringPiece& region, UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { return false; } // In Java, we use Region class. In C++, since Region is under i18n, // we read the same data used by Region into gMacroregions avoid dependency // from common to i18n/region.cpp - if (U_FAILURE(errorCode)) { return false; } - umtx_initOnce(gInitOnce, &XLikelySubtags::initLikelySubtags, errorCode); + umtx_initOnce(gInitOnce, &LikelySubtags::initLikelySubtags, errorCode); if (U_FAILURE(errorCode)) { return false; } UnicodeString str(UnicodeString::fromUTF8(region)); return gMacroregions->contains((void *)&str); } -LSR XLikelySubtags::maximize(StringPiece language, StringPiece script, StringPiece region, +LSR LikelySubtags::maximize(StringPiece language, StringPiece script, StringPiece region, bool returnInputIfUnmatch, UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return LSR(language, script, region, LSR::EXPLICIT_LSR, errorCode); - } + if (U_FAILURE(errorCode)) { return {}; } if (language.compare("und") == 0) { language = ""; } @@ -647,13 +715,29 @@ LSR XLikelySubtags::maximize(StringPiece language, StringPiece script, StringPie } else { iter.resetToState64(state); value = trieNext(iter, "", 0); - U_ASSERT(value > 0); + U_ASSERT(value != 0); + // For the case of und_Latn + if (value < 0) { + retainLanguage = !language.empty(); + retainScript = !script.empty(); + retainRegion = !region.empty(); + // Fallback to und_$region => + iter.resetToState64(trieUndState); // "und" ("*") + value = trieNext(iter, "", 0); + U_ASSERT(value == 0); + int64_t trieUndEmptyState = iter.getState64(); + value = trieNext(iter, region, 0); + // Fallback to und => + if (value < 0) { + iter.resetToState64(trieUndEmptyState); + value = trieNext(iter, "", 0); + U_ASSERT(value > 0); + } + } } } } U_ASSERT(value < lsrsLength); - const LSR &matched = lsrs[value]; - if (returnInputIfUnmatch && (!(matchLanguage || matchScript || (matchRegion && language.empty())))) { return LSR("", "", "", LSR::EXPLICIT_LSR, errorCode); // no matching. @@ -663,25 +747,30 @@ LSR XLikelySubtags::maximize(StringPiece language, StringPiece script, StringPie } if (!(retainLanguage || retainScript || retainRegion)) { + U_ASSERT(value >= 0); // Quickly return a copy of the lookup-result LSR // without new allocation of the subtags. + const LSR &matched = lsrs[value]; return LSR(matched.language, matched.script, matched.region, matched.flags); } if (!retainLanguage) { - language = matched.language; + U_ASSERT(value >= 0); + language = lsrs[value].language; } if (!retainScript) { - script = matched.script; + U_ASSERT(value >= 0); + script = lsrs[value].script; } if (!retainRegion) { - region = matched.region; + U_ASSERT(value >= 0); + region = lsrs[value].region; } int32_t retainMask = (retainLanguage ? 4 : 0) + (retainScript ? 2 : 0) + (retainRegion ? 1 : 0); // retainOldMask flags = LSR explicit-subtag flags return LSR(language, script, region, retainMask, errorCode); } -int32_t XLikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t likelyInfo) const { +int32_t LikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t likelyInfo) const { // If likelyInfo >= 0: // likelyInfo bit 1 is set if the previous comparison with lsr // was for equal language and script. @@ -723,7 +812,7 @@ int32_t XLikelySubtags::compareLikely(const LSR &lsr, const LSR &other, int32_t } // Subset of maximize(). -int32_t XLikelySubtags::getLikelyIndex(const char *language, const char *script) const { +int32_t LikelySubtags::getLikelyIndex(const char *language, const char *script) const { if (uprv_strcmp(language, "und") == 0) { language = ""; } @@ -781,7 +870,7 @@ int32_t XLikelySubtags::getLikelyIndex(const char *language, const char *script) return value; } -int32_t XLikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { +int32_t LikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { UStringTrieResult result; uint8_t c; if ((c = s[i]) == 0) { @@ -814,7 +903,7 @@ int32_t XLikelySubtags::trieNext(BytesTrie &iter, const char *s, int32_t i) { default: return -1; } } -int32_t XLikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { +int32_t LikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { UStringTrieResult result; uint8_t c; if (s.length() == i) { @@ -848,14 +937,13 @@ int32_t XLikelySubtags::trieNext(BytesTrie &iter, StringPiece s, int32_t i) { } } -LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, +LSR LikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, StringPiece region, bool favorScript, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { return {}; } LSR max = maximize(language, script, region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } // If no match, return it. if (uprv_strlen(max.language) == 0 && uprv_strlen(max.script) == 0 && @@ -868,9 +956,7 @@ LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, } // try language LSR test = maximize(max.language, "", "", true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", "", LSR::DONT_CARE_FLAGS, errorCode); } @@ -879,27 +965,21 @@ LSR XLikelySubtags::minimizeSubtags(StringPiece language, StringPiece script, // favor Region // try language and region test = maximize(max.language, "", max.region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode); } } // try language and script test = maximize(max.language, max.script, "", true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, max.script, "", LSR::DONT_CARE_FLAGS, errorCode); } if (favorScript) { // try language and region test = maximize(max.language, "", max.region, true, errorCode); - if (U_FAILURE(errorCode)) { - return max; - } + if (U_FAILURE(errorCode)) { return {}; } if (test.isEquivalentTo(max)) { return LSR(max.language, "", max.region, LSR::DONT_CARE_FLAGS, errorCode); } diff --git a/deps/icu-small/source/common/loclikelysubtags.h b/deps/icu-small/source/common/loclikelysubtags.h index ebd9c153068eb6..5c51e353c1e75d 100644 --- a/deps/icu-small/source/common/loclikelysubtags.h +++ b/deps/icu-small/source/common/loclikelysubtags.h @@ -19,7 +19,7 @@ U_NAMESPACE_BEGIN -struct XLikelySubtagsData; +struct LikelySubtagsData; struct LocaleDistanceData { LocaleDistanceData() = default; @@ -37,15 +37,14 @@ struct LocaleDistanceData { LocaleDistanceData &operator=(const LocaleDistanceData &) = delete; }; -// TODO(ICU-20777): Rename to just LikelySubtags. -class XLikelySubtags final : public UMemory { +class LikelySubtags final : public UMemory { public: - ~XLikelySubtags(); + ~LikelySubtags(); static constexpr int32_t SKIP_SCRIPT = 1; // VisibleForTesting - static const XLikelySubtags *getSingleton(UErrorCode &errorCode); + static const LikelySubtags *getSingleton(UErrorCode &errorCode); // VisibleForTesting LSR makeMaximizedLsrFrom(const Locale &locale, @@ -72,9 +71,9 @@ class XLikelySubtags final : public UMemory { const LocaleDistanceData &getDistanceData() const { return distanceData; } private: - XLikelySubtags(XLikelySubtagsData &data); - XLikelySubtags(const XLikelySubtags &other) = delete; - XLikelySubtags &operator=(const XLikelySubtags &other) = delete; + LikelySubtags(LikelySubtagsData &data); + LikelySubtags(const LikelySubtags &other) = delete; + LikelySubtags &operator=(const LikelySubtags &other) = delete; static void initLikelySubtags(UErrorCode &errorCode); @@ -120,7 +119,7 @@ class XLikelySubtags final : public UMemory { int32_t lsrsLength; #endif - // distance/matcher data: see comment in XLikelySubtagsData::load() + // distance/matcher data: see comment in LikelySubtagsData::load() LocaleDistanceData distanceData; }; diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index e41cfd1027d056..da78c7716a7535 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -28,7 +28,6 @@ */ #include "locmap.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "cmemory.h" @@ -49,6 +48,8 @@ * [MS-LCID] Windows Language Code Identifier (LCID) Reference */ +namespace { + /* //////////////////////////////////////////////// // @@ -87,7 +88,7 @@ typedef struct ILcidPosixMap * @param posixID posix ID of the language_TERRITORY such as 'de_CH' */ #define ILCID_POSIX_ELEMENT_ARRAY(hostID, languageID, posixID) \ -static const ILcidPosixElement locmap_ ## languageID [] = { \ +constexpr ILcidPosixElement locmap_ ## languageID [] = { \ {LANGUAGE_LCID(hostID), #languageID}, /* parent locale */ \ {hostID, #posixID}, \ }; @@ -97,7 +98,7 @@ static const ILcidPosixElement locmap_ ## languageID [] = { \ * @param id the POSIX ID, either a language or language_TERRITORY */ #define ILCID_POSIX_SUBTABLE(id) \ -static const ILcidPosixElement locmap_ ## id [] = +constexpr ILcidPosixElement locmap_ ## id [] = /** @@ -796,7 +797,7 @@ ILCID_POSIX_SUBTABLE(zh) { ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) /* This must be static and grouped by LCID. */ -static const ILcidPosixMap gPosixIDmap[] = { +constexpr ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(af), /* af Afrikaans 0x36 */ ILCID_POSIX_MAP(am), /* am Amharic 0x5e */ ILCID_POSIX_MAP(ar), /* ar Arabic 0x01 */ @@ -945,14 +946,14 @@ static const ILcidPosixMap gPosixIDmap[] = { ILCID_POSIX_MAP(zu), /* zu Zulu 0x35 */ }; -static const uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); +constexpr uint32_t gLocaleCount = UPRV_LENGTHOF(gPosixIDmap); /** * Do not call this function. It is called by hostID. * The function is not private because this struct must stay as a C struct, * and this is an internal class. */ -static int32_t +int32_t idCmp(const char* id1, const char* id2) { int32_t diffIdx = 0; @@ -972,12 +973,13 @@ idCmp(const char* id1, const char* id2) * no equivalent Windows LCID. * @return the LCID */ -static uint32_t -getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) +uint32_t +getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode& status) { + if (U_FAILURE(status)) { return locmap_root->hostID; } int32_t bestIdx = 0; int32_t bestIdxDiff = 0; - int32_t posixIDlen = (int32_t)uprv_strlen(posixID); + int32_t posixIDlen = static_cast<int32_t>(uprv_strlen(posixID)); uint32_t idx; for (idx = 0; idx < this_0->numRegions; idx++ ) { @@ -996,16 +998,16 @@ getHostID(const ILcidPosixMap *this_0, const char* posixID, UErrorCode* status) if ((posixID[bestIdxDiff] == '_' || posixID[bestIdxDiff] == '@') && this_0->regionMaps[bestIdx].posixID[bestIdxDiff] == 0) { - *status = U_USING_FALLBACK_WARNING; + status = U_USING_FALLBACK_WARNING; return this_0->regionMaps[bestIdx].hostID; } /*no match found */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return this_0->regionMaps->hostID; + status = U_ILLEGAL_ARGUMENT_ERROR; + return locmap_root->hostID; } -static const char* +const char* getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) { uint32_t i; @@ -1035,19 +1037,21 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) * quz -> qu * prs -> fa */ -#define FIX_LANGUAGE_ID_TAG(buffer, len) \ - if (len >= 3) { \ - if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') {\ - buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') {\ - buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; \ - uprv_strcat(buffer, buffer+3); \ - } \ +void FIX_LANGUAGE_ID_TAG(char* buffer, int32_t len) { + if (len >= 3) { + if (buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'z') { + buffer[2] = 0; + uprv_strcat(buffer, buffer+3); + } else if (buffer[0] == 'p' && buffer[1] == 'r' && buffer[2] == 's') { + buffer[0] = 'f'; buffer[1] = 'a'; buffer[2] = 0; + uprv_strcat(buffer, buffer+3); + } } - +} #endif +} // namespace + U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) { @@ -1147,7 +1151,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr /* no match found */ *status = U_ILLEGAL_ARGUMENT_ERROR; - return -1; + return 0; } /* @@ -1176,11 +1180,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) // Check any for keywords. if (uprv_strchr(localeID, '@')) { - icu::CharString collVal; - { - icu::CharStringByteSink sink(&collVal); - ulocimp_getKeywordValue(localeID, "collation", sink, status); - } + icu::CharString collVal = ulocimp_getKeywordValue(localeID, "collation", *status); if (U_SUCCESS(*status) && !collVal.isEmpty()) { // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. @@ -1189,10 +1189,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) else { // If the locale ID contains keywords other than collation, just use the base name. - { - icu::CharStringByteSink sink(&baseName); - ulocimp_getBaseName(localeID, sink, status); - } + baseName = ulocimp_getBaseName(localeID, *status); if (U_SUCCESS(*status) && !baseName.isEmpty()) { mylocaleID = baseName.data(); @@ -1201,11 +1198,7 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) } // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form - icu::CharString asciiBCP47Tag; - { - icu::CharStringByteSink sink(&asciiBCP47Tag); - ulocimp_toLanguageTag(mylocaleID, sink, false, status); - } + icu::CharString asciiBCP47Tag = ulocimp_toLanguageTag(mylocaleID, false, *status); if (U_SUCCESS(*status)) { @@ -1253,6 +1246,14 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) { + if (U_FAILURE(*status) || + langID == nullptr || + posixID == nullptr || + uprv_strlen(langID) < 2 || + uprv_strlen(posixID) < 2) { + return locmap_root->hostID; + } + // This function does the table lookup when native platform name->lcid conversion isn't available, // or for locales that don't follow patterns the platform expects. uint32_t low = 0; @@ -1266,11 +1267,6 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) UErrorCode myStatus; uint32_t idx; - /* Check for incomplete id. */ - if (!langID || !posixID || uprv_strlen(langID) < 2 || uprv_strlen(posixID) < 2) { - return 0; - } - /*Binary search for the map entry for normal cases */ while (high > low) /*binary search*/{ @@ -1288,7 +1284,7 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) low = mid; } else /*we found it*/{ - return getHostID(&gPosixIDmap[mid], posixID, status); + return getHostID(&gPosixIDmap[mid], posixID, *status); } oldmid = mid; } @@ -1299,7 +1295,7 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) */ for (idx = 0; idx < gLocaleCount; idx++ ) { myStatus = U_ZERO_ERROR; - value = getHostID(&gPosixIDmap[idx], posixID, &myStatus); + value = getHostID(&gPosixIDmap[idx], posixID, myStatus); if (myStatus == U_ZERO_ERROR) { return value; } @@ -1315,5 +1311,5 @@ uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) /* no match found */ *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; /* return international (root) */ + return locmap_root->hostID; /* return international (root) */ } diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index c9d1cdddde4448..ba7163fa2dbac7 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -24,7 +24,6 @@ #include "unicode/putil.h" #include "unicode/uloc.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "ulocimp.h" @@ -50,10 +49,10 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, int32_t *pLength, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return nullptr; } /* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/ const char16_t *item=nullptr; UErrorCode errorCode; - char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0}; /* * open the bundle for the current locale @@ -128,15 +127,16 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = errorCode; break; } - - u_UCharsToChars(fallbackLocale, explicitFallbackName, len); - + + icu::CharString explicitFallbackName; + explicitFallbackName.appendInvariantChars(fallbackLocale, len, errorCode); + /* guard against recursive fallback */ - if(uprv_strcmp(explicitFallbackName, locale)==0){ + if (explicitFallbackName == locale) { *pErrorCode = U_INTERNAL_PROGRAM_ERROR; break; } - rb.adoptInstead(ures_open(path, explicitFallbackName, &errorCode)); + rb.adoptInstead(ures_open(path, explicitFallbackName.data(), &errorCode)); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -150,63 +150,68 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, return item; } -static ULayoutType +namespace { + +ULayoutType _uloc_getOrientationHelper(const char* localeId, const char* key, - UErrorCode *status) + UErrorCode& status) { ULayoutType result = ULOC_LAYOUT_UNKNOWN; - if (!U_FAILURE(*status)) { - icu::CharString localeBuffer; - { - icu::CharStringByteSink sink(&localeBuffer); - ulocimp_canonicalize(localeId, sink, status); - } + if (U_FAILURE(status)) { return result; } - if (!U_FAILURE(*status)) { - int32_t length = 0; - const char16_t* const value = - uloc_getTableStringWithFallback( - nullptr, - localeBuffer.data(), - "layout", - nullptr, - key, - &length, - status); - - if (!U_FAILURE(*status) && length != 0) { - switch(value[0]) - { - case 0x0062: /* 'b' */ - result = ULOC_LAYOUT_BTT; - break; - case 0x006C: /* 'l' */ - result = ULOC_LAYOUT_LTR; - break; - case 0x0072: /* 'r' */ - result = ULOC_LAYOUT_RTL; - break; - case 0x0074: /* 't' */ - result = ULOC_LAYOUT_TTB; - break; - default: - *status = U_INTERNAL_PROGRAM_ERROR; - break; - } - } + if (localeId == nullptr) { + localeId = uloc_getDefault(); + } + icu::CharString localeBuffer = ulocimp_canonicalize(localeId, status); + + if (U_FAILURE(status)) { return result; } + + int32_t length = 0; + const char16_t* const value = + uloc_getTableStringWithFallback( + nullptr, + localeBuffer.data(), + "layout", + nullptr, + key, + &length, + &status); + + if (U_FAILURE(status)) { return result; } + + if (length != 0) { + switch(value[0]) + { + case 0x0062: /* 'b' */ + result = ULOC_LAYOUT_BTT; + break; + case 0x006C: /* 'l' */ + result = ULOC_LAYOUT_LTR; + break; + case 0x0072: /* 'r' */ + result = ULOC_LAYOUT_RTL; + break; + case 0x0074: /* 't' */ + result = ULOC_LAYOUT_TTB; + break; + default: + status = U_INTERNAL_PROGRAM_ERROR; + break; } } return result; } +} // namespace + U_CAPI ULayoutType U_EXPORT2 uloc_getCharacterOrientation(const char* localeId, UErrorCode *status) { - return _uloc_getOrientationHelper(localeId, "characters", status); + return _uloc_getOrientationHelper(localeId, "characters", *status); } /** @@ -220,5 +225,5 @@ U_CAPI ULayoutType U_EXPORT2 uloc_getLineOrientation(const char* localeId, UErrorCode *status) { - return _uloc_getOrientationHelper(localeId, "lines", status); + return _uloc_getOrientationHelper(localeId, "lines", *status); } diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 776d1d59636be7..a257ec593a8003 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -145,9 +145,7 @@ LocaleUtility::canonicalLocaleString(const UnicodeString* id, UnicodeString& res Locale& LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result) { - enum { BUFLEN = 128 }; // larger than ever needed - - if (id.isBogus() || id.length() >= BUFLEN) { + if (id.isBogus()) { result.setToBogus(); } else { /* @@ -168,24 +166,29 @@ LocaleUtility::initLocaleFromName(const UnicodeString& id, Locale& result) * * There should be only at most one '@' in a locale ID. */ - char buffer[BUFLEN]; + CharString buffer; int32_t prev, i; prev = 0; - for(;;) { - i = id.indexOf((char16_t)0x40, prev); + UErrorCode status = U_ZERO_ERROR; + do { + i = id.indexOf(static_cast<char16_t>(0x40), prev); if(i < 0) { // no @ between prev and the rest of the string - id.extract(prev, INT32_MAX, buffer + prev, BUFLEN - prev, US_INV); + buffer.appendInvariantChars(id.tempSubString(prev), status); break; // done } else { // normal invariant-character conversion for text between @s - id.extract(prev, i - prev, buffer + prev, BUFLEN - prev, US_INV); + buffer.appendInvariantChars(id.tempSubString(prev, i - prev), status); // manually "convert" U+0040 at id[i] into '@' at buffer[i] - buffer[i] = '@'; + buffer.append('@', status); prev = i + 1; } + } while (U_SUCCESS(status)); + if (U_FAILURE(status)) { + result.setToBogus(); + } else { + result = Locale::createFromName(buffer.data()); } - result = Locale::createFromName(buffer); } return result; } @@ -221,7 +224,7 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) Hashtable* htp; umtx_lock(nullptr); - htp = (Hashtable*) cache->get(bundleID); + htp = static_cast<Hashtable*>(cache->get(bundleID)); umtx_unlock(nullptr); if (htp == nullptr) { @@ -259,7 +262,7 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) return htp; } -UBool +bool LocaleUtility::isFallbackOf(const UnicodeString& root, const UnicodeString& child) { return child.indexOf(root) == 0 && @@ -271,5 +274,3 @@ U_NAMESPACE_END /* !UCONFIG_NO_SERVICE */ #endif - - diff --git a/deps/icu-small/source/common/locutil.h b/deps/icu-small/source/common/locutil.h index 31bfffd7a5920f..8cf109c20636ab 100644 --- a/deps/icu-small/source/common/locutil.h +++ b/deps/icu-small/source/common/locutil.h @@ -28,7 +28,7 @@ class U_COMMON_API LocaleUtility { static Locale& initLocaleFromName(const UnicodeString& id, Locale& result); static UnicodeString& initNameFromLocale(const Locale& locale, UnicodeString& result); static const Hashtable* getAvailableLocaleNames(const UnicodeString& bundleID); - static UBool isFallbackOf(const UnicodeString& root, const UnicodeString& child); + static bool isFallbackOf(const UnicodeString& root, const UnicodeString& child); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/lstmbe.cpp b/deps/icu-small/source/common/lstmbe.cpp index fb8eb01761cd09..470e939ab02a28 100644 --- a/deps/icu-small/source/common/lstmbe.cpp +++ b/deps/icu-small/source/common/lstmbe.cpp @@ -164,7 +164,7 @@ class Array1D : public ReadArray1D { Array1D() : memory_(nullptr), data_(nullptr), d1_(0) {} Array1D(int32_t d1, UErrorCode &status) : memory_(uprv_malloc(d1 * sizeof(float))), - data_((float*)memory_), d1_(d1) { + data_(static_cast<float*>(memory_)), d1_(d1) { if (U_SUCCESS(status)) { if (memory_ == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -301,7 +301,7 @@ class Array2D : public ReadArray2D { Array2D() : memory_(nullptr), data_(nullptr), d1_(0), d2_(0) {} Array2D(int32_t d1, int32_t d2, UErrorCode &status) : memory_(uprv_malloc(d1 * d2 * sizeof(float))), - data_((float*)memory_), d1_(d1), d2_(d2) { + data_(static_cast<float*>(memory_)), d1_(d1), d2_(d2) { if (U_SUCCESS(status)) { if (memory_ == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -526,11 +526,11 @@ void CodePointsVectorizer::vectorize( int32_t current; char16_t str[2] = {0, 0}; while (U_SUCCESS(status) && - (current = (int32_t)utext_getNativeIndex(text)) < endPos) { + (current = static_cast<int32_t>(utext_getNativeIndex(text))) < endPos) { // Since the LSTMBreakEngine is currently only accept chars in BMP, // we can ignore the possibility of hitting supplementary code // point. - str[0] = (char16_t) utext_next32(text); + str[0] = static_cast<char16_t>(utext_next32(text)); U_ASSERT(!U_IS_SURROGATE(str[0])); offsets.addElement(current, status); indices.addElement(stringToIndex(str), status); @@ -733,7 +733,7 @@ LSTMBreakEngine::divideUpDictionaryRange( UText *text, #endif // LSTM_DEBUG // current = argmax(logp) - LSTMClass current = (LSTMClass)logp.maxIndex(); + LSTMClass current = static_cast<LSTMClass>(logp.maxIndex()); // BIES logic. if (current == BEGIN || current == SINGLE) { if (i != 0) { @@ -809,7 +809,15 @@ U_CAPI const LSTMData* U_EXPORT2 CreateLSTMDataForScript(UScriptCode script, UEr U_CAPI const LSTMData* U_EXPORT2 CreateLSTMData(UResourceBundle* rb, UErrorCode& status) { - return new LSTMData(rb, status); + if (U_FAILURE(status)) { + return nullptr; + } + const LSTMData* result = new LSTMData(rb, status); + if (U_FAILURE(status)) { + delete result; + return nullptr; + } + return result; } U_CAPI const LanguageBreakEngine* U_EXPORT2 diff --git a/deps/icu-small/source/common/messagepattern.cpp b/deps/icu-small/source/common/messagepattern.cpp index 82cb638e4ed7ef..cd2976da164d10 100644 --- a/deps/icu-small/source/common/messagepattern.cpp +++ b/deps/icu-small/source/common/messagepattern.cpp @@ -351,7 +351,7 @@ MessagePattern::autoQuoteApostropheDeep() const { for(int32_t i=count; i>0;) { const Part &part=getPart(--i); if(part.getType()==UMSGPAT_PART_TYPE_INSERT_CHAR) { - modified.insert(part.index, (char16_t)part.value); + modified.insert(part.index, static_cast<char16_t>(part.value)); } } return modified; @@ -437,7 +437,7 @@ MessagePattern::parseMessage(int32_t index, int32_t msgStartLength, if(U_FAILURE(errorCode)) { return 0; } - if(nestingLevel>Part::MAX_VALUE) { + if(nestingLevel>Part::MAX_NESTED_LEVELS) { errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } @@ -628,7 +628,7 @@ MessagePattern::parseArg(int32_t index, int32_t argStartLength, int32_t nestingL } } // change the ARG_START type from NONE to argType - partsList->a[argStart].value=(int16_t)argType; + partsList->a[argStart].value = static_cast<int16_t>(argType); if(argType==UMSGPAT_ARG_TYPE_SIMPLE) { addPart(UMSGPAT_PART_TYPE_ARG_TYPE, typeIndex, length, 0, errorCode); } @@ -914,8 +914,9 @@ MessagePattern::parseArgNumber(const UnicodeString &s, int32_t start, int32_t li if(0x30<=c && c<=0x39) { if(number>=INT32_MAX/10) { badNumber=true; // overflow + } else { + number=number*10+(c-0x30); } - number=number*10+(c-0x30); } else { return UMSGPAT_ARG_NAME_NOT_NUMBER; } @@ -980,13 +981,13 @@ MessagePattern::parseDouble(int32_t start, int32_t limit, UBool allowInfinity, } // Let Double.parseDouble() throw a NumberFormatException. char numberChars[128]; - int32_t capacity=(int32_t)sizeof(numberChars); + int32_t capacity = static_cast<int32_t>(sizeof(numberChars)); int32_t length=limit-start; if(length>=capacity) { break; // number too long } msg.extract(start, length, numberChars, capacity, US_INV); - if((int32_t)uprv_strlen(numberChars)<length) { + if (static_cast<int32_t>(uprv_strlen(numberChars)) < length) { break; // contains non-invariant character that was turned into NUL } char *end; @@ -999,7 +1000,6 @@ MessagePattern::parseDouble(int32_t start, int32_t limit, UBool allowInfinity, } setParseError(parseError, start /*, limit*/); // Bad syntax for numeric value. errorCode=U_PATTERN_SYNTAX_ERROR; - return; } int32_t @@ -1007,7 +1007,7 @@ MessagePattern::skipWhiteSpace(int32_t index) { const char16_t *s=msg.getBuffer(); int32_t msgLength=msg.length(); const char16_t *t=PatternProps::skipWhiteSpace(s+index, msgLength-index); - return (int32_t)(t-s); + return static_cast<int32_t>(t - s); } int32_t @@ -1015,7 +1015,7 @@ MessagePattern::skipIdentifier(int32_t index) { const char16_t *s=msg.getBuffer(); int32_t msgLength=msg.length(); const char16_t *t=PatternProps::skipIdentifier(s+index, msgLength-index); - return (int32_t)(t-s); + return static_cast<int32_t>(t - s); } int32_t @@ -1106,8 +1106,8 @@ MessagePattern::addPart(UMessagePatternPartType type, int32_t index, int32_t len Part &part=partsList->a[partsLength++]; part.type=type; part.index=index; - part.length=(uint16_t)length; - part.value=(int16_t)value; + part.length = static_cast<uint16_t>(length); + part.value = static_cast<int16_t>(value); part.limitPartIndex=0; } } diff --git a/deps/icu-small/source/common/mlbe.cpp b/deps/icu-small/source/common/mlbe.cpp index 7e734f2c8adfbf..b5385428e0c57c 100644 --- a/deps/icu-small/source/common/mlbe.cpp +++ b/deps/icu-small/source/common/mlbe.cpp @@ -57,12 +57,12 @@ int32_t MlBreakEngine::divideUpRange(UText *inText, int32_t rangeStart, int32_t // moving forward, finally the last six values in the indexList are // [length-4, length-3, length-2, length-1, -1, -1]. The "+4" here means four extra "-1". int32_t indexSize = codePointLength + 4; - int32_t *indexList = (int32_t *)uprv_malloc(indexSize * sizeof(int32_t)); - if (indexList == nullptr) { + LocalMemory<int32_t> indexList(static_cast<int32_t*>(uprv_malloc(indexSize * sizeof(int32_t)))); + if (indexList.isNull()) { status = U_MEMORY_ALLOCATION_ERROR; return 0; } - int32_t numCodeUnits = initIndexList(inString, indexList, status); + int32_t numCodeUnits = initIndexList(inString, indexList.getAlias(), status); // Add a break for the start. boundary.addElement(0, status); @@ -71,13 +71,12 @@ int32_t MlBreakEngine::divideUpRange(UText *inText, int32_t rangeStart, int32_t for (int32_t idx = 0; idx + 1 < codePointLength && U_SUCCESS(status); idx++) { numBreaks = - evaluateBreakpoint(inString, indexList, idx, numCodeUnits, numBreaks, boundary, status); + evaluateBreakpoint(inString, indexList.getAlias(), idx, numCodeUnits, numBreaks, boundary, status); if (idx + 4 < codePointLength) { indexList[idx + 6] = numCodeUnits; numCodeUnits += U16_LENGTH(inString.char32At(indexList[idx + 6])); } } - uprv_free(indexList); if (U_FAILURE(status)) return 0; diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 3dada06c573214..562c2b2513e61c 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -9,28 +9,28 @@ #ifdef INCLUDED_FROM_NORMALIZER2_CPP -static const UVersionInfo norm2_nfc_data_formatVersion={4,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={0xf,1,0,0}; +static const UVersionInfo norm2_nfc_data_formatVersion={5,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0x11,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x50,0x4cb8,0x8920,0x8a20,0x8a20,0x8a20,0x8a20,0x8a20,0xc0,0x300,0xae2,0x29e0,0x3c66,0xfc00,0x1288,0x3b9c, -0x3c34,0x3c66,0x300,0 +0x58,0x4eec,0x8cc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0xc0,0x300,0xb0c,0x2a6a,0x3cf0,0xfbc4,0x12c2,0x3c26, +0x3cbe,0x3cf0,0x300,0,0xfb10,0xfb9e }; -static const uint16_t norm2_nfc_data_trieIndex[1788]={ +static const uint16_t norm2_nfc_data_trieIndex[1888]={ 0,0x40,0x7b,0xbb,0xfb,0x13a,0x17a,0x1b2,0x1f2,0x226,0x254,0x226,0x294,0x2d4,0x313,0x353, 0x393,0x3d2,0x40f,0x44e,0x226,0x226,0x488,0x4c8,0x4f8,0x530,0x226,0x570,0x59f,0x5de,0x226,0x5f3, -0x631,0x65f,0x687,0x6bd,0x6fd,0x73a,0x75a,0x799,0x7d8,0x815,0x834,0x871,0x75a,0x8aa,0x8d8,0x917, -0x834,0x951,0x968,0x9a8,0x9bf,0x9fe,0x226,0xa34,0xa54,0xa8f,0xa9b,0xad6,0xafe,0xb3b,0xb7b,0xbb5, -0xbd0,0x226,0xc0b,0x226,0xc4b,0xc6a,0xca0,0xcdd,0x226,0x226,0x226,0x226,0x226,0xd00,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xd2c,0x226,0x226,0xd61, -0x226,0x226,0xd7f,0x226,0xda9,0x226,0x226,0x226,0xde5,0xe05,0xe45,0xe84,0xebf,0xeff,0xf33,0xf5f, -0x839,0x226,0x226,0xf93,0x226,0x226,0x226,0xfd3,0x1013,0x1053,0x1093,0x10d3,0x1113,0x1153,0x1193,0x11d3, -0x1213,0x226,0x226,0x1243,0x1274,0x226,0x12a4,0x12d7,0x1314,0x1353,0x1393,0x13c9,0x13f7,0x226,0x226,0x226, +0x631,0x65f,0x688,0x6be,0x6fe,0x73b,0x75b,0x79a,0x7d9,0x816,0x835,0x872,0x75b,0x8ab,0x8d9,0x918, +0x835,0x952,0x969,0x9a9,0x9c0,0x9ff,0x226,0xa35,0xa55,0xa90,0xa9c,0xad7,0xaff,0xb3c,0xb7c,0xbb6, +0xbd1,0x226,0xc0c,0x226,0xc4c,0xc6b,0xca1,0xcde,0x226,0x226,0x226,0x226,0x226,0xd01,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xd2d,0x226,0x226,0xd62, +0x226,0x226,0xd80,0x226,0xdaa,0x226,0x226,0x226,0xde6,0xe06,0xe46,0xe85,0xec0,0xf00,0xf34,0xf60, +0x83a,0x226,0x226,0xf94,0x226,0x226,0x226,0xfd4,0x1014,0x1054,0x1094,0x10d4,0x1114,0x1154,0x1194,0x11d4, +0x1214,0x226,0x226,0x1244,0x1275,0x226,0x12a5,0x12d8,0x1315,0x1354,0x1394,0x13ca,0x13f8,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1422,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0xcee,0x226,0x143f,0x226,0x147f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x14bf,0x14f9,0x1537,0x1577,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1423,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0xcef,0x226,0x1440,0x226,0x1480,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x14c0,0x14fa,0x1538,0x1578,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -59,20 +59,20 @@ static const uint16_t norm2_nfc_data_trieIndex[1788]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x15b6,0x15f4,0x1614,0x226,0x226,0x226,0x226, -0x164e,0x226,0x226,0x1676,0x16a8,0x16d6,0x83d,0x16e9,0x226,0x226,0x16f9,0x1739,0x226,0x226,0x226,0x1451, -0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781, -0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791, -0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785, -0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779, -0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789, -0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d, -0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d, -0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781, -0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791, -0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785, -0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x178d,0x1779,0x1781,0x1789,0x1791,0x177d,0x1785,0x17c5,0x226, -0x1805,0x1840,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x15b7,0x15f5,0x1615,0x226,0x226,0x226,0x226, +0x164f,0x226,0x226,0x1677,0x16a9,0x16d7,0x83e,0x16ea,0x226,0x226,0x16fa,0x173a,0x226,0x226,0x226,0x1452, +0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782, +0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792, +0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786, +0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a, +0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a, +0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e, +0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e, +0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782, +0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792, +0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786, +0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x178e,0x177a,0x1782,0x178a,0x1792,0x177e,0x1786,0x17c6,0x226, +0x1806,0x1841,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -80,59 +80,65 @@ static const uint16_t norm2_nfc_data_trieIndex[1788]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1880,0x18c0,0x1900,0x1940,0x1980,0x19c0,0x1a00,0x1a40,0x1a63,0x1aa3,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac3,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x67e,0x68e,0x6a6,0x6c5,0x6da,0x6da,0x6da,0x6de,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x1881,0x18c1,0x1901,0x1941,0x1981,0x19c1,0x1a01,0x1a41,0x1a64,0x1aa4,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac4,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x6e2,0x6f2,0x70a,0x729,0x73e,0x73e,0x73e,0x742,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc0b,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc0c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1af6,0x226,0x226,0x1b06,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0xdf7,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1b16,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1607,0x226,0x226,0x226,0x226,0x66b,0x226,0x226,0x226, -0x226,0x1b20,0x54f,0x226,0x226,0x1b30,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x81c,0x226,0x226, -0x1b40,0x226,0x1b50,0x1b5d,0x1b69,0x226,0x226,0x226,0x226,0x414,0x226,0x1b74,0x1b84,0x226,0x226,0x226, -0x811,0x226,0x226,0x226,0x226,0x1b94,0x226,0x226,0x226,0x1b9f,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1ba6,0x226,0x226,0x226,0x226,0x1bb1,0x1bc0,0x927,0x1bce,0x412,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x1bdc,0x7c9,0x226,0x226,0x226,0x226,0x226,0x1bec,0x1bfb,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x907,0x1c03,0x1c13,0x226, -0x226,0x226,0x9eb,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c1d,0x226,0x226,0x226,0x226,0x226, -0x226,0x817,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c1a, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2d, -0x811,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x87e,0x226,0x226,0x226,0x81e,0x81b, -0x226,0x226,0x226,0x226,0x819,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x9eb,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc05,0x226,0x226,0x226, -0x226,0x81b,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0xc08,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x1c3d,0x226,0x226,0x226,0xf2c,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c4d,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1c4f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c5e,0x1c6e,0x1c7c,0x1c89,0x226, -0x1c95,0x1ca3,0x1cb3,0x226,0x226,0x226,0x226,0xd1b,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1afb,0x1b09,0x1b15,0x226, +0x1b1a,0x226,0x226,0x1b2a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xdf8,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x1cc3,0x1ccb,0x1cd9,0x226,0x226,0x226,0x226,0x226,0x4f9,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0xf2c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x7c9,0x226,0x226,0x226,0x4fc,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ce4,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cf4,0x226,0x226,0x226,0x226, -0x226,0x226,0x1d00,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d10,0x1d20, -0x1d30,0x1d40,0x1d50,0x1d60,0x1d70,0x1d80,0x1d90,0x1da0,0x1db0,0x1dc0,0x1dd0,0x1de0,0x1df0,0x1e00,0x1e10,0x1e20, -0x1e30,0x1e40,0x1e50,0x1e60,0x1e70,0x1e80,0x1e90,0x1ea0,0x1eb0,0x1ec0,0x1ed0,0x1ee0,0x1ef0,0x1f00,0x1f10,0x1f20, +0x226,0x1b3a,0x226,0x226,0x226,0x1b42,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x1608,0x226,0x226,0x226,0x226,0x1b50,0x226,0x226,0x226,0x226,0x1b60,0x54f,0x226,0x226,0x1b70,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x81d,0x226,0x226,0x1b80,0x226,0x1b90,0x1b9d,0x1ba9,0x226,0x226, +0x226,0x226,0x414,0x226,0x1bb4,0x1bc4,0x226,0x226,0x226,0x812,0x226,0x226,0x226,0x226,0x1bd4,0x226, +0x226,0x226,0x1bdf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1be6,0x226,0x226, +0x226,0x226,0x1bf1,0x1c00,0x928,0x1c0e,0x412,0x1c1c,0x1c2c,0x226,0x1c34,0x1c42,0x87f,0x226,0x226,0x226, +0x226,0x1c52,0x7ca,0x226,0x226,0x226,0x226,0x226,0x1c62,0x1c71,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x908,0x1c79,0x1c89,0x226,0x226,0x226,0x9ec,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x1c93,0x226,0x226,0x226,0x226,0x226,0x226,0x818,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c90,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ca3,0x812,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x87f,0x226,0x226,0x226,0x81f,0x81c,0x226,0x226,0x226,0x226,0x81a, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x408,0x428, -0xc4,0xc4,0xc4,0x448,0x457,0x46d,0x489,0x4a6,0x4c2,0x4df,0x4fc,0x51b,0x538,0x552,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0x567,0xc4,0x57b,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0x226,0x226,0x226,0x226,0x226,0x226,0x9ec,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc06,0x226,0x226,0x226,0x226,0x81c,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0xc09,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x1cb2,0x1cc1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x1cd1,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cde, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cee, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cf0,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x1cff,0x1d0f,0x1d1d,0x1d2a,0x226,0x1d36,0x1d44,0x1d54,0x226,0x226,0x226,0x226,0xd1c,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d64,0x1d6c,0x1d7a,0x226,0x226,0x226,0x226,0x226, +0x4f9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ca,0x226,0x226,0x226,0x4fc,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d85,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x5c1,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d95,0x7d3,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1da5, +0x226,0x226,0x226,0x226,0x226,0x226,0x1db1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x1dc1,0x1dd1,0x1de1,0x1df1,0x1e01,0x1e11,0x1e21,0x1e31,0x1e41,0x1e51,0x1e61,0x1e71,0x1e81,0x1e91, +0x1ea1,0x1eb1,0x1ec1,0x1ed1,0x1ee1,0x1ef1,0x1f01,0x1f11,0x1f21,0x1f31,0x1f41,0x1f51,0x1f61,0x1f71,0x1f81,0x1f91, +0x1fa1,0x1fb1,0x1fc1,0x1fd1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x408,0x428,0x440,0xc4,0xc4,0x460,0x46f,0x486,0x4a2,0x4bf,0x4dd,0x4fa,0x517,0x536, +0x553,0x56d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0x582,0xc4,0xc4,0xc4,0xc4,0x595,0x5a9,0x5c0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0x59b,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5a6,0x5c3,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0x5e3,0x5f9,0x60b,0xc4,0x61e,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5e0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0x5eb,0x608,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x628,0x63e,0x650,0x66f,0x682,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x63e,0x65e +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x6a2,0x6c2 }; -static const uint16_t norm2_nfc_data_trieData[7984]={ +static const uint16_t norm2_nfc_data_trieData[8162]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -144,30 +150,30 @@ static const uint16_t norm2_nfc_data_trieData[7984]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0x5e8,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x128a,0x1290,0xae4,0x1296,0xafa, -0xb04,0x5f4,0xb0e,0x129c,0x12a2,0xb18,0x12a8,0x12ae,0x12b4,0x12ba,0xb2e,1,0x12c0,0x12c6,0x12cc,0xb38, -0xb4e,0xb60,1,0x5fc,0x12d2,0x12d8,0x12de,0xb6a,0x12e4,1,1,0x12ea,0x12f0,0xb80,0x12f6,0xb96, -0xba0,0x600,0xbaa,0x12fc,0x1302,0xbb4,0x1308,0x130e,0x1314,0x131a,0xbca,1,0x1320,0x1326,0x132c,0xbd4, -0xbea,0xbfc,1,0x608,0x1332,0x1338,0x133e,0xc06,0x1344,1,0x134a,0x1350,0x1356,0xc1c,0xc32,0x135d, -0x1363,0x1368,0x136e,0x1374,0x137a,0x1380,0x1386,0x138c,0x1392,0x1398,0x139e,1,1,0xc48,0xc56,0x13a4, -0x13aa,0x13b0,0x13b6,0x13bd,0x13c3,0x13c8,0x13ce,0x13d4,0x13da,0x13e0,0x13e6,0x13ec,0x13f2,0x13f9,0x13ff,0x1404, -0x140a,1,1,0x1410,0x1416,0x141c,0x1422,0x1428,0x142e,0x1435,0x143b,0x1440,1,1,1,0x1447, -0x144d,0x1453,0x1459,1,0x145e,0x1464,0x146b,0x1471,0x1476,0x147c,1,1,1,0x1482,0x1488,0x148f, -0x1495,0x149a,0x14a0,1,1,1,0xc64,0xc72,0x14a6,0x14ac,0x14b2,0x14b8,1,1,0x14be,0x14c4, -0x14cb,0x14d1,0x14d6,0x14dc,0xc80,0xc8a,0x14e2,0x14e8,0x14ef,0x14f5,0xc94,0xc9e,0x14fb,0x1501,0x1506,0x150c, -1,1,0xca8,0xcb2,0xcbc,0xcc6,0x1512,0x1518,0x151e,0x1524,0x152a,0x1530,0x1537,0x153d,0x1542,0x1548, -0x154e,0x1554,0x155a,0x1560,0x1566,0x156c,0x1572,0x1578,0x157e,0x60c,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xcd0,0xcea,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xd04,0xd1e,1,1,1,1,1, -1,0x610,1,1,1,1,1,1,1,1,1,1,1,1,1,0x1584, -0x158a,0x1590,0x1596,0x159c,0x15a2,0x15a8,0x15ae,0x15b6,0x15c0,0x15ca,0x15d4,0x15de,0x15e8,0x15f2,0x15fc,1, -0x1606,0x1610,0x161a,0x1624,0x162d,0x1633,1,1,0x1638,0x163e,0x1644,0x164a,0xd38,0xd42,0x1653,0x165d, -0x1665,0x166b,0x1671,1,1,1,0x1676,0x167c,1,1,0x1682,0x1688,0x1690,0x169a,0x16a3,0x16a9, -0x16af,0x16b5,0x16ba,0x16c0,0x16c6,0x16cc,0x16d2,0x16d8,0x16de,0x16e4,0x16ea,0x16f0,0x16f6,0x16fc,0x1702,0x1708, -0x170e,0x1714,0x171a,0x1720,0x1726,0x172c,0x1732,0x1738,0x173e,0x1744,0x174a,0x1750,0x1756,0x175c,1,1, -0x1762,0x1768,1,1,1,1,1,1,0xd4c,0xd56,0xd60,0xd6a,0x1770,0x177a,0x1784,0x178e, -0xd74,0xd7e,0x1798,0x17a2,0x17aa,0x17b0,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x12c4,0x12ca,0xb0e,0x12d0,0xb24, +0xb2e,0x5f4,0xb38,0x12d6,0x12dc,0xb42,0x12e2,0x12e8,0x12ee,0x12f4,0xb58,1,0x12fa,0x1300,0x1306,0xb62, +0xb78,0xb8a,1,0x5fc,0x130c,0x1312,0x1318,0xb94,0x131e,1,1,0x1324,0x132a,0xbaa,0x1330,0xbc0, +0xbca,0x600,0xbd4,0x1336,0x133c,0xbde,0x1342,0x1348,0x134e,0x1354,0xbf4,1,0x135a,0x1360,0x1366,0xbfe, +0xc14,0xc26,1,0x608,0x136c,0x1372,0x1378,0xc30,0x137e,1,0x1384,0x138a,0x1390,0xc46,0xc5c,0x1397, +0x139d,0x13a2,0x13a8,0x13ae,0x13b4,0x13ba,0x13c0,0x13c6,0x13cc,0x13d2,0x13d8,1,1,0xc72,0xc80,0x13de, +0x13e4,0x13ea,0x13f0,0x13f7,0x13fd,0x1402,0x1408,0x140e,0x1414,0x141a,0x1420,0x1426,0x142c,0x1433,0x1439,0x143e, +0x1444,1,1,0x144a,0x1450,0x1456,0x145c,0x1462,0x1468,0x146f,0x1475,0x147a,1,1,1,0x1481, +0x1487,0x148d,0x1493,1,0x1498,0x149e,0x14a5,0x14ab,0x14b0,0x14b6,1,1,1,0x14bc,0x14c2,0x14c9, +0x14cf,0x14d4,0x14da,1,1,1,0xc8e,0xc9c,0x14e0,0x14e6,0x14ec,0x14f2,1,1,0x14f8,0x14fe, +0x1505,0x150b,0x1510,0x1516,0xcaa,0xcb4,0x151c,0x1522,0x1529,0x152f,0xcbe,0xcc8,0x1535,0x153b,0x1540,0x1546, +1,1,0xcd2,0xcdc,0xce6,0xcf0,0x154c,0x1552,0x1558,0x155e,0x1564,0x156a,0x1571,0x1577,0x157c,0x1582, +0x1588,0x158e,0x1594,0x159a,0x15a0,0x15a6,0x15ac,0x15b2,0x15b8,0x60c,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xcfa,0xd14,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xd2e,0xd48,1,1,1,1,1, +1,0x610,1,1,1,1,1,1,1,1,1,1,1,1,1,0x15be, +0x15c4,0x15ca,0x15d0,0x15d6,0x15dc,0x15e2,0x15e8,0x15f0,0x15fa,0x1604,0x160e,0x1618,0x1622,0x162c,0x1636,1, +0x1640,0x164a,0x1654,0x165e,0x1667,0x166d,1,1,0x1672,0x1678,0x167e,0x1684,0xd62,0xd6c,0x168d,0x1697, +0x169f,0x16a5,0x16ab,1,1,1,0x16b0,0x16b6,1,1,0x16bc,0x16c2,0x16ca,0x16d4,0x16dd,0x16e3, +0x16e9,0x16ef,0x16f4,0x16fa,0x1700,0x1706,0x170c,0x1712,0x1718,0x171e,0x1724,0x172a,0x1730,0x1736,0x173c,0x1742, +0x1748,0x174e,0x1754,0x175a,0x1760,0x1766,0x176c,0x1772,0x1778,0x177e,0x1784,0x178a,0x1790,0x1796,1,1, +0x179c,0x17a2,1,1,1,1,1,1,0xd76,0xd80,0xd8a,0xd94,0x17aa,0x17b4,0x17be,0x17c8, +0xd9e,0xda8,0x17d2,0x17dc,0x17e4,0x17ea,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -178,34 +184,34 @@ static const uint16_t norm2_nfc_data_trieData[7984]={ 0xfdcc,0xffcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xffd0,0xffb8,0xffb8,0xffb8,0xffb8,0xffd0,0xfdb0, 0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xff94,0xff94,0xfdb8,0xfdb8,0xfdb8,0xfdb8,0xfd94,0xfd94,0xffb8,0xffb8,0xffb8, 0xffb8,0xfdb8,0xfdb8,0xffb8,0xfdb8,0xfdb8,0xffb8,0xffb8,0xfe02,0xfe02,0xfe02,0xfe02,0xfc02,0xffb8,0xffb8,0xffb8, -0xffb8,0xffcc,0xffcc,0xffcc,0x3c36,0x3c3c,0xfdcc,0x3c42,0x3c48,0xfde0,0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, +0xffb8,0xffcc,0xffcc,0xffcc,0x3cc0,0x3cc6,0xfdcc,0x3ccc,0x3cd2,0xfde0,0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, 0xffcc,0xffb8,0xffb8,1,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffd0,0xffb8,0xffb8,0xffcc, 0xffd2,0xffd4,0xffd4,0xffd2,0xffd4,0xffd4,0xffd2,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,0x29e1,1,1,1,1,1,1,1, -1,1,0x29e5,1,1,1,1,1,0x17b7,0x17bd,0x29e9,0x17c3,0x17c9,0x17cf,1,0x17d5, -1,0x17db,0x17e1,0x17e9,0x618,1,1,1,0x634,1,0x644,1,0x658,1,1,1, -1,1,0x674,1,0x684,1,1,1,0x688,1,1,1,0x6a0,0x17f1,0x17f7,0xd88, -0x17fd,0xd92,0x1803,0x180b,0x6b4,1,1,1,0x6d4,1,0x6e4,1,0x6fc,1,1,1, -1,1,0x71c,1,0x72c,1,1,1,0x734,1,1,1,0x754,0xd9c,0xdae,0x1813, -0x1819,0xdc0,1,1,1,0x76c,0x181f,0x1825,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,0x2a6b,1,1,1,1,1,1,1, +1,1,0x2a6f,1,1,1,1,1,0x17f1,0x17f7,0x2a73,0x17fd,0x1803,0x1809,1,0x180f, +1,0x1815,0x181b,0x1823,0x618,1,1,1,0x634,1,0x644,1,0x658,1,1,1, +1,1,0x674,1,0x684,1,1,1,0x688,1,1,1,0x6a0,0x182b,0x1831,0xdb2, +0x1837,0xdbc,0x183d,0x1845,0x6b4,1,1,1,0x6d4,1,0x6e4,1,0x6fc,1,1,1, +1,1,0x71c,1,0x72c,1,1,1,0x734,1,1,1,0x754,0xdc6,0xdd8,0x184d, +0x1853,0xdea,1,1,1,0x76c,0x1859,0x185f,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x182b,0x1831,1,0x1837,1,1,0x774,0x183d,1,1,1,1,0x1843, -0x1849,0x184f,1,0x778,1,1,0x780,1,0x784,0x790,0x798,0x79c,0x1855,0x7ac,1,1, +1,1,1,0x1865,0x186b,1,0x1871,1,1,0x774,0x1877,1,1,1,1,0x187d, +0x1883,0x1889,1,0x778,1,1,0x780,1,0x784,0x790,0x798,0x79c,0x188f,0x7ac,1,1, 1,0x7b0,1,1,1,1,0x7b4,1,1,1,0x7c4,1,1,1,0x7c8,1, -0x7cc,1,1,0x7d0,1,1,0x7d8,1,0x7dc,0x7e8,0x7f0,0x7f4,0x185b,0x804,1,1, +0x7cc,1,1,0x7d0,1,1,0x7d8,1,0x7dc,0x7e8,0x7f0,0x7f4,0x1895,0x804,1,1, 1,0x808,1,1,1,0x80c,1,1,1,0x81c,1,1,1,0x820,1,0x824, -1,1,0x1861,0x1867,1,0x186d,1,1,0x828,0x1873,1,1,1,1,0x1879,0x187f, -0x1885,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x82c,0x830,0x188b,0x1891,1,1,1,1,1,1, +1,1,0x189b,0x18a1,1,0x18a7,1,1,0x828,0x18ad,1,1,1,1,0x18b3,0x18b9, +0x18bf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x82c,0x830,0x18c5,0x18cb,1,1,1,1,1,1, 1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x1897, -0x189d,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18a3,0x18a9, -0x18af,0x18b5,1,1,0x18bb,0x18c1,0x834,0x838,0x18c7,0x18cd,0x18d3,0x18d9,0x18df,0x18e5,1,1, -0x18eb,0x18f1,0x18f7,0x18fd,0x1903,0x1909,0x83c,0x840,0x190f,0x1915,0x191b,0x1921,0x1927,0x192d,0x1933,0x1939, -0x193f,0x1945,0x194b,0x1951,1,1,0x1957,0x195d,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18d1, +0x18d7,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18dd,0x18e3, +0x18e9,0x18ef,1,1,0x18f5,0x18fb,0x834,0x838,0x1901,0x1907,0x190d,0x1913,0x1919,0x191f,1,1, +0x1925,0x192b,0x1931,0x1937,0x193d,0x1943,0x83c,0x840,0x1949,0x194f,0x1955,0x195b,0x1961,0x1967,0x196d,0x1973, +0x1979,0x197f,0x1985,0x198b,1,1,0x1991,0x1997,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc, 0xffcc,0xffcc,0xffbc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, 0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffbc,0xffc8,0xffcc,0xfe14,0xfe16,0xfe18,0xfe1a,0xfe1c,0xfe1e,0xfe20,0xfe22, @@ -214,14 +220,14 @@ static const uint16_t norm2_nfc_data_trieData[7984]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xfe3c,0xfe3e,0xfe40,1,1,1,1,1,1,1,0x1962,0x1968,0x196f,0x1975,0x197b,0x844, +0xfe3c,0xfe3e,0xfe40,1,1,1,1,1,1,1,0x199c,0x19a2,0x19a9,0x19af,0x19b5,0x844, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0x850,1,0x854,0xfe36,0xfe38,0xfe3a,0xfe3c,0xfe3e, 0xfe40,0xfe42,0xfe44,0xfdcc,0xfdcc,0xfdb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0xfe46,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x1981,0x858,0x1987,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0x85c,0x198d,1,0x860,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc, +0x19bb,0x858,0x19c1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0x85c,0x19c7,1,0x860,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc, 0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,1,1,0xffcc,0xffcc,1,0xffb8,0xffcc,0xffcc,0xffb8,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0xfe48,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -239,405 +245,417 @@ static const uint16_t norm2_nfc_data_trieData[7984]={ 1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc, -0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, +0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8, -0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1, -0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xfe36,0xfe38,0xfe3a, -0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8, +0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +1,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xfe36,0xfe38, +0xfe3a,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x864,0x1993,1,1,1,1,1,1,0x868,0x1999,1, -0x86c,0x199f,1,1,1,1,1,1,1,0xfc0e,1,1,1,1,1,1, -1,1,1,1,1,1,1,0xfe12,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,1, -1,1,0x29ec,0x29f2,0x29f8,0x29fe,0x2a04,0x2a0a,0x2a10,0x2a16,1,1,1,1,1,1, +1,1,1,1,1,1,0x864,0x19cd,1,1,1,1,1,1,0x868,0x19d3, +1,0x86c,0x19d9,1,1,1,1,1,1,1,0xfc0e,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc, +1,1,1,0x2a76,0x2a7c,0x2a82,0x2a88,0x2a8e,0x2a94,0x2a9a,0x2aa0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xfe0e,1,0xfc00,1,1,1,1,1,1,1, -0x870,1,1,1,0x19a5,0x19ab,0xfe12,1,1,1,1,1,1,1,1,1, -0xfc00,1,1,1,1,0x2a1c,0x2a22,1,0x2a28,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe0e,1,0xfc00,1,1,1,1,1,1, +1,0x870,1,1,1,0x19df,0x19e5,0xfe12,1,1,1,1,1,1,1,1, +1,0xfc00,1,1,1,1,0x2aa6,0x2aac,1,0x2ab2,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0xffcc,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x2a2e,1,1,0x2a34,1, -1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1,1, -1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,0x2a3a,0x2a40, -0x2a46,1,1,0x2a4c,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x2ab8,1,1,0x2abe, +1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,0x2ac4, +0x2aca,0x2ad0,1,1,0x2ad6,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0x878,0x19b1,1,1,0x19b7,0x19bd,0xfe12,1,1,1,1,1,1,1,1, -0xfc00,0xfc00,1,1,1,1,0x2a52,0x2a58,1,1,1,1,1,1,1,1, +1,1,0x878,0x19eb,1,1,0x19f1,0x19f7,0xfe12,1,1,1,1,1,1,1, +1,0xfc00,0xfc00,1,1,1,1,0x2adc,0x2ae2,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0x884,1,0x19c3,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x884,1,0x19fd,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,0x888,0x890,1, -1,0x19c9,0x19cf,0x19d5,0xfe12,1,1,1,1,1,1,1,1,1,0xfc00,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,0x888,0x890, +1,1,0x1a03,0x1a09,0x1a0f,0xfe12,1,1,1,1,1,1,1,1,1,0xfc00, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0x894,1,0x19db,1,1,1,1,0xfe12,1, -1,1,1,1,1,1,0xfea8,0xfcb6,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x894,1,0x1a15,1,1,1,1,0xfe12, +1,1,1,1,1,1,1,0xfea8,0xfcb6,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xfe0e,1,1,0x898,0x19e1,1,0xfc00,1,1,1,0x89c,0x19e7, -0x19ed,1,0xdca,0x19f5,1,0xfe12,1,1,1,1,1,1,1,0xfc00,0xfc00,1, +1,1,1,1,1,0xfe0e,1,1,0x898,0x1a1b,1,0xfc00,1,1,1,0x89c, +0x1a21,0x1a27,1,0xdf4,0x1a2f,1,0xfe12,1,1,1,1,1,1,1,0xfc00,0xfc00, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe12,1,0xfc00,1,1, -1,1,1,1,0x8a8,0x8b0,1,1,0x19fd,0x1a03,0x1a09,0xfe12,1,1,1,1, -1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe12,1,0xfc00,1, +1,1,1,1,1,0x8a8,0x8b0,1,1,0x1a37,0x1a3d,0x1a43,0xfe12,1,1,1, +1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc12,1, -1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,0x8b4,0x1a0f,1, -0xdd4,0x1a17,0x1a1f,0xfc00,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc12, +1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,0x8b4,0x1a49, +1,0xdfe,0x1a51,0x1a59,0xfc00,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xfece,0xfece,0xfe12,1, -1,1,1,1,1,1,1,0xfed6,0xfed6,0xfed6,0xfed6,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xfece,0xfece,0xfe12, +1,1,1,1,1,1,1,1,0xfed6,0xfed6,0xfed6,0xfed6,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xfeec,0xfeec,0xfe12,1,1,1,1,1,1,1,1,0xfef4,0xfef4, -0xfef4,0xfef4,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfeec,0xfeec,0xfe12,1,1,1,1,1,1,1,1,0xfef4, +0xfef4,0xfef4,0xfef4,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2a5f,1, -1,1,1,1,1,1,1,1,0x2a65,1,1,1,1,0x2a6b,1,1, -1,1,0x2a71,1,1,1,1,0x2a77,1,1,1,1,1,1,1,1, -1,1,1,1,0x2a7d,1,1,1,1,1,1,1,0xff02,0xff04,0x3c50,0xff08, -0x3c58,0x2a82,1,0x2a88,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3c60,0xffcc,0xffcc,0xfe12, -1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2a8f,1, -1,1,1,1,1,1,1,1,0x2a95,1,1,1,1,0x2a9b,1,1, -1,1,0x2aa1,1,1,1,1,0x2aa7,1,1,1,1,1,1,1,1, -1,1,1,1,0x2aad,1,1,1,1,1,1,0xffb8,1,1,1,1, +1,1,1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2ae9, +1,1,1,1,1,1,1,1,1,0x2aef,1,1,1,1,0x2af5,1, +1,1,1,0x2afb,1,1,1,1,0x2b01,1,1,1,1,1,1,1, +1,1,1,1,1,0x2b07,1,1,1,1,1,1,1,0xff02,0xff04,0x3cda, +0xff08,0x3ce2,0x2b0c,1,0x2b12,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3cea,0xffcc,0xffcc, +0xfe12,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2b19, +1,1,1,1,1,1,1,1,1,0x2b1f,1,1,1,1,0x2b25,1, +1,1,1,0x2b2b,1,1,1,1,0x2b31,1,1,1,1,1,1,1, +1,1,1,1,1,0x2b37,1,1,1,1,1,1,0xffb8,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x8c0,0x1a25,1,1,1,1,1,1,1,0xfc00,1, -1,1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x8c0,0x1a5f,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +1,1,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, 0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc, +0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc, +1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc,1, +1,1,1,1,1,1,1,1,1,0xffc8,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xffc8,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, +0xffb8,0xffcc,0xffcc,0xffb8,1,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, +0xffd4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x8c4,0x1a65,0x8c8,0x1a6b,0x8cc,0x1a71,0x8d0,0x1a77,0x8d4,0x1a7d,1, +1,0x8d8,0x1a83,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a89,0x8e0,0x1a8f,0x8e4,0x8e8, +0x1a95,0x1a9b,0x8ec,0x1aa1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, -0xffcc,0xffcc,0xffb8,1,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc, -0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe12, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x8c4,0x1a2b,0x8c8,0x1a31,0x8cc,0x1a37,0x8d0,0x1a3d,0x8d4,0x1a43,1,1, -0x8d8,0x1a49,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a4f,0x8e0,0x1a55,0x8e4,0x8e8,0x1a5b, -0x1a61,0x8ec,0x1a67,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1,1, +1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, +0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1, +1,0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,1, +1,1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc, +0xffcc,0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,0xffb4,0xffcc, +0xffd2,0xffb8,0xffcc,0xffb8,0x1aa6,0x1aac,0x1ab2,0x1ab8,0x1abf,0x1ac5,0x1acb,0x1ad1,0x1ad9,0x1ae3,0x1aea,0x1af0, +0x1af6,0x1afc,0x1b02,0x1b08,0x1b0f,0x1b15,0x1b1a,0x1b20,0x1b28,0x1b32,0x1b3c,0x1b46,0x1b4e,0x1b54,0x1b5a,0x1b60, +0x1b69,0x1b73,0x1b7b,0x1b81,0x1b86,0x1b8c,0x1b92,0x1b98,0x1b9e,0x1ba4,0x1baa,0x1bb0,0x1bb7,0x1bbd,0x1bc2,0x1bc8, +0x1bce,0x1bd4,0x1bdc,0x1be6,0x1bee,0x1bf4,0x1bfa,0x1c00,0x1c06,0x1c0c,0xe08,0xe12,0x1c14,0x1c1e,0x1c26,0x1c2c, +0x1c32,0x1c38,0x1c3e,0x1c44,0x1c4a,0x1c50,0x1c57,0x1c5d,0x1c62,0x1c68,0x1c6e,0x1c74,0x1c7a,0x1c80,0x1c86,0x1c8c, +0x1c94,0x1c9e,0x1ca8,0x1cb2,0x1cbc,0x1cc6,0x1cd0,0x1cda,0x1ce3,0x1ce9,0x1cef,0x1cf5,0x1cfa,0x1d00,0xe1c,0xe26, +0x1d08,0x1d12,0x1d1a,0x1d20,0x1d26,0x1d2c,0xe30,0xe3a,0x1d34,0x1d3e,0x1d48,0x1d52,0x1d5c,0x1d66,0x1d6e,0x1d74, +0x1d7a,0x1d80,0x1d86,0x1d8c,0x1d92,0x1d98,0x1d9e,0x1da4,0x1daa,0x1db0,0x1db6,0x1dbc,0x1dc4,0x1dce,0x1dd8,0x1de2, +0x1dea,0x1df0,0x1df7,0x1dfd,0x1e02,0x1e08,0x1e0e,0x1e14,0x1e1a,0x1e20,0x1e26,0x1e2c,0x1e33,0x1e39,0x1e3f,0x1e45, +0x1e4b,0x1e51,0x1e56,0x1e5c,0x1e62,0x1e68,0x1e6f,0x1e75,0x1e7b,0x1e81,0x1e86,0x1e8c,0x1e92,0x1e98,1,0x1e9f, +1,1,1,1,0xe44,0xe52,0x1ea4,0x1eaa,0x1eb2,0x1ebc,0x1ec6,0x1ed0,0x1eda,0x1ee4,0x1eee,0x1ef8, +0x1f02,0x1f0c,0x1f16,0x1f20,0x1f2a,0x1f34,0x1f3e,0x1f48,0x1f52,0x1f5c,0x1f66,0x1f70,0xe60,0xe6a,0x1f78,0x1f7e, +0x1f84,0x1f8a,0x1f92,0x1f9c,0x1fa6,0x1fb0,0x1fba,0x1fc4,0x1fce,0x1fd8,0x1fe2,0x1fec,0x1ff4,0x1ffa,0x2000,0x2006, +0xe74,0xe7e,0x200c,0x2012,0x201a,0x2024,0x202e,0x2038,0x2042,0x204c,0x2056,0x2060,0x206a,0x2074,0x207e,0x2088, +0x2092,0x209c,0x20a6,0x20b0,0x20ba,0x20c4,0x20ce,0x20d8,0x20e0,0x20e6,0x20ec,0x20f2,0x20fa,0x2104,0x210e,0x2118, +0x2122,0x212c,0x2136,0x2140,0x214a,0x2154,0x215c,0x2162,0x2169,0x216f,0x2174,0x217a,0x2180,0x2186,1,1, +1,1,1,1,0xe88,0xe9e,0xeb6,0xec4,0xed2,0xee0,0xeee,0xefc,0xf08,0xf1e,0xf36,0xf44, +0xf52,0xf60,0xf6e,0xf7c,0xf88,0xf96,0x218f,0x2199,0x21a3,0x21ad,1,1,0xfa4,0xfb2,0x21b7,0x21c1, +0x21cb,0x21d5,1,1,0xfc0,0xfd6,0xfee,0xffc,0x100a,0x1018,0x1026,0x1034,0x1040,0x1056,0x106e,0x107c, +0x108a,0x1098,0x10a6,0x10b4,0x10c0,0x10d2,0x21df,0x21e9,0x21f3,0x21fd,0x2207,0x2211,0x10e4,0x10f6,0x221b,0x2225, +0x222f,0x2239,0x2243,0x224d,0x1108,0x1116,0x2257,0x2261,0x226b,0x2275,1,1,0x1124,0x1132,0x227f,0x2289, +0x2293,0x229d,1,1,0x1140,0x1152,0x22a7,0x22b1,0x22bb,0x22c5,0x22cf,0x22d9,1,0x1164,1,0x22e3, +1,0x22ed,1,0x22f7,0x1176,0x118c,0x11a4,0x11b2,0x11c0,0x11ce,0x11dc,0x11ea,0x11f6,0x120c,0x1224,0x1232, +0x1240,0x124e,0x125c,0x126a,0x1276,0x3c28,0x22ff,0x3c30,0x1280,0x3c38,0x2305,0x3c40,0x230b,0x3c48,0x2311,0x3c50, +0x128a,0x3c58,1,1,0x2318,0x2322,0x2331,0x2341,0x2351,0x2361,0x2371,0x2381,0x238c,0x2396,0x23a5,0x23b5, +0x23c5,0x23d5,0x23e5,0x23f5,0x2400,0x240a,0x2419,0x2429,0x2439,0x2449,0x2459,0x2469,0x2474,0x247e,0x248d,0x249d, +0x24ad,0x24bd,0x24cd,0x24dd,0x24e8,0x24f2,0x2501,0x2511,0x2521,0x2531,0x2541,0x2551,0x255c,0x2566,0x2575,0x2585, +0x2595,0x25a5,0x25b5,0x25c5,0x25cf,0x25d5,0x25dd,0x25e4,0x25ed,1,0x1294,0x25f7,0x25ff,0x2605,0x260b,0x3c60, +0x2610,1,0x2b3c,0x8f0,1,0x2617,0x261f,0x2626,0x262f,1,0x129e,0x2639,0x2641,0x3c68,0x2647,0x3c70, +0x264c,0x2653,0x2659,0x265f,0x2665,0x266b,0x2673,0x3c7a,1,1,0x267b,0x2683,0x268b,0x2691,0x2697,0x3c84, +1,0x269d,0x26a3,0x26a9,0x26af,0x26b5,0x26bd,0x3c8e,0x26c5,0x26cb,0x26d1,0x26d9,0x26e1,0x26e7,0x26ed,0x3c98, +0x26f3,0x26f9,0x3ca0,0x2b41,1,1,0x2701,0x2708,0x2711,1,0x12a8,0x271b,0x2723,0x3ca8,0x2729,0x3cb0, +0x272e,0x2b45,0x8fc,1,0xf919,0xf919,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,0xffcc, +0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,0xfe02, +0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x2b48,1,1,1,0x2b4c, +0x3cb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1,1,0x2735, +0x273b,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x2741,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x2747,0x274d,0x2753,0x914,1,0x918,1,0x91c,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x920,0x2759,1,1,1,0x924,0x275f,1, +0x928,0x2765,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x92c,0x276b,0x930,0x2771,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x934,1,1,1,0x2777,1,0x938,0x277d,0x93c,1,0x2783,0x940,0x2789,1,1, +1,0x944,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x278f,0x948,0x2795,1,0x94c,0x950,1,1,1,1,1,1, +1,0x279b,0x27a1,0x27a7,0x27ad,0x27b3,0x954,0x958,0x27b9,0x27bf,0x95c,0x960,0x27c5,0x27cb,0x964,0x968, +0x96c,0x970,1,1,0x27d1,0x27d7,0x974,0x978,0x27dd,0x27e3,0x97c,0x980,0x27e9,0x27ef,1,1, +1,1,1,1,1,0x984,0x988,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994,1,0x998, +0x27f5,0x27fb,0x2801,0x2807,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x280d,0x2813,0x2819,0x281f,1,1, +1,1,1,1,0x2825,0x282b,0x2831,0x2837,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x2b51,0x2b55,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2b59, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe12,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1, -1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8, -0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1, -0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,1,1, -1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc, -0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,0xffb4,0xffcc,0xffd2, -0xffb8,0xffcc,0xffb8,0x1a6c,0x1a72,0x1a78,0x1a7e,0x1a85,0x1a8b,0x1a91,0x1a97,0x1a9f,0x1aa9,0x1ab0,0x1ab6,0x1abc, -0x1ac2,0x1ac8,0x1ace,0x1ad5,0x1adb,0x1ae0,0x1ae6,0x1aee,0x1af8,0x1b02,0x1b0c,0x1b14,0x1b1a,0x1b20,0x1b26,0x1b2f, -0x1b39,0x1b41,0x1b47,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b76,0x1b7d,0x1b83,0x1b88,0x1b8e,0x1b94, -0x1b9a,0x1ba2,0x1bac,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0x1bd2,0xdde,0xde8,0x1bda,0x1be4,0x1bec,0x1bf2,0x1bf8, -0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c16,0x1c1d,0x1c23,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46,0x1c4c,0x1c52,0x1c5a, -0x1c64,0x1c6e,0x1c78,0x1c82,0x1c8c,0x1c96,0x1ca0,0x1ca9,0x1caf,0x1cb5,0x1cbb,0x1cc0,0x1cc6,0xdf2,0xdfc,0x1cce, -0x1cd8,0x1ce0,0x1ce6,0x1cec,0x1cf2,0xe06,0xe10,0x1cfa,0x1d04,0x1d0e,0x1d18,0x1d22,0x1d2c,0x1d34,0x1d3a,0x1d40, -0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d82,0x1d8a,0x1d94,0x1d9e,0x1da8,0x1db0, -0x1db6,0x1dbd,0x1dc3,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df2,0x1df9,0x1dff,0x1e05,0x1e0b,0x1e11, -0x1e17,0x1e1c,0x1e22,0x1e28,0x1e2e,0x1e35,0x1e3b,0x1e41,0x1e47,0x1e4c,0x1e52,0x1e58,0x1e5e,1,0x1e65,1, -1,1,1,0xe1a,0xe28,0x1e6a,0x1e70,0x1e78,0x1e82,0x1e8c,0x1e96,0x1ea0,0x1eaa,0x1eb4,0x1ebe,0x1ec8, -0x1ed2,0x1edc,0x1ee6,0x1ef0,0x1efa,0x1f04,0x1f0e,0x1f18,0x1f22,0x1f2c,0x1f36,0xe36,0xe40,0x1f3e,0x1f44,0x1f4a, -0x1f50,0x1f58,0x1f62,0x1f6c,0x1f76,0x1f80,0x1f8a,0x1f94,0x1f9e,0x1fa8,0x1fb2,0x1fba,0x1fc0,0x1fc6,0x1fcc,0xe4a, -0xe54,0x1fd2,0x1fd8,0x1fe0,0x1fea,0x1ff4,0x1ffe,0x2008,0x2012,0x201c,0x2026,0x2030,0x203a,0x2044,0x204e,0x2058, -0x2062,0x206c,0x2076,0x2080,0x208a,0x2094,0x209e,0x20a6,0x20ac,0x20b2,0x20b8,0x20c0,0x20ca,0x20d4,0x20de,0x20e8, -0x20f2,0x20fc,0x2106,0x2110,0x211a,0x2122,0x2128,0x212f,0x2135,0x213a,0x2140,0x2146,0x214c,1,1,1, -1,1,1,0xe5e,0xe74,0xe8c,0xe9a,0xea8,0xeb6,0xec4,0xed2,0xede,0xef4,0xf0c,0xf1a,0xf28, -0xf36,0xf44,0xf52,0xf5e,0xf6c,0x2155,0x215f,0x2169,0x2173,1,1,0xf7a,0xf88,0x217d,0x2187,0x2191, -0x219b,1,1,0xf96,0xfac,0xfc4,0xfd2,0xfe0,0xfee,0xffc,0x100a,0x1016,0x102c,0x1044,0x1052,0x1060, -0x106e,0x107c,0x108a,0x1096,0x10a8,0x21a5,0x21af,0x21b9,0x21c3,0x21cd,0x21d7,0x10ba,0x10cc,0x21e1,0x21eb,0x21f5, -0x21ff,0x2209,0x2213,0x10de,0x10ec,0x221d,0x2227,0x2231,0x223b,1,1,0x10fa,0x1108,0x2245,0x224f,0x2259, -0x2263,1,1,0x1116,0x1128,0x226d,0x2277,0x2281,0x228b,0x2295,0x229f,1,0x113a,1,0x22a9,1, -0x22b3,1,0x22bd,0x114c,0x1162,0x117a,0x1188,0x1196,0x11a4,0x11b2,0x11c0,0x11cc,0x11e2,0x11fa,0x1208,0x1216, -0x1224,0x1232,0x1240,0x124c,0x3b9e,0x22c5,0x3ba6,0x1256,0x3bae,0x22cb,0x3bb6,0x22d1,0x3bbe,0x22d7,0x3bc6,0x1260, -0x3bce,1,1,0x22de,0x22e8,0x22f7,0x2307,0x2317,0x2327,0x2337,0x2347,0x2352,0x235c,0x236b,0x237b,0x238b, -0x239b,0x23ab,0x23bb,0x23c6,0x23d0,0x23df,0x23ef,0x23ff,0x240f,0x241f,0x242f,0x243a,0x2444,0x2453,0x2463,0x2473, -0x2483,0x2493,0x24a3,0x24ae,0x24b8,0x24c7,0x24d7,0x24e7,0x24f7,0x2507,0x2517,0x2522,0x252c,0x253b,0x254b,0x255b, -0x256b,0x257b,0x258b,0x2595,0x259b,0x25a3,0x25aa,0x25b3,1,0x126a,0x25bd,0x25c5,0x25cb,0x25d1,0x3bd6,0x25d6, -1,0x2ab2,0x8f0,1,0x25dd,0x25e5,0x25ec,0x25f5,1,0x1274,0x25ff,0x2607,0x3bde,0x260d,0x3be6,0x2612, -0x2619,0x261f,0x2625,0x262b,0x2631,0x2639,0x3bf0,1,1,0x2641,0x2649,0x2651,0x2657,0x265d,0x3bfa,1, -0x2663,0x2669,0x266f,0x2675,0x267b,0x2683,0x3c04,0x268b,0x2691,0x2697,0x269f,0x26a7,0x26ad,0x26b3,0x3c0e,0x26b9, -0x26bf,0x3c16,0x2ab7,1,1,0x26c7,0x26ce,0x26d7,1,0x127e,0x26e1,0x26e9,0x3c1e,0x26ef,0x3c26,0x26f4, -0x2abb,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,0xffcc,0xffcc, -1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,0xfe02,0xffb8, -0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0x2abe,1,1,1,0x2ac2,0x3c2e, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1,1,0x26fb,0x2701, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0x2707,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x270d,0x2713,0x2719,0x914,1,0x918,1,0x91c,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0x920,0x271f,1,1,1,0x924,0x2725,1,0x928, -0x272b,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0x92c,0x2731,0x930,0x2737,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x934,1,1,1,0x273d,1,0x938,0x2743,0x93c,1,0x2749,0x940,0x274f,1,1,1, -0x944,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x2755,0x948,0x275b,1,0x94c,0x950,1,1,1,1,1,1,1, -0x2761,0x2767,0x276d,0x2773,0x2779,0x954,0x958,0x277f,0x2785,0x95c,0x960,0x278b,0x2791,0x964,0x968,0x96c, -0x970,1,1,0x2797,0x279d,0x974,0x978,0x27a3,0x27a9,0x97c,0x980,0x27af,0x27b5,1,1,1, -1,1,1,1,0x984,0x988,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994,1,0x998,0x27bb, -0x27c1,0x27c7,0x27cd,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0x27d3,0x27d9,0x27df,0x27e5,1,1,1, -1,1,1,0x27eb,0x27f1,0x27f7,0x27fd,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x2ac7,0x2acb,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2acf,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc, 0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,0xffc0,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x9ac, -1,1,1,1,0x9b0,0x2803,0x9b4,0x2809,0x9b8,0x280f,0x9bc,0x2815,0x9c0,0x281b,0x9c4,0x2821, -0x9c8,0x2827,0x9cc,0x282d,0x9d0,0x2833,0x9d4,0x2839,0x9d8,0x283f,0x9dc,0x2845,1,0x9e0,0x284b,0x9e4, -0x2851,0x9e8,0x2857,1,1,1,1,1,0x9ec,0x285d,0x2863,0x9f4,0x2869,0x286f,0x9fc,0x2875, -0x287b,0xa04,0x2881,0x2887,0xa0c,0x288d,0x2893,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x2899,1,1,1,1, -0xfc10,0xfc10,1,1,0xa14,0x289f,1,1,1,1,1,1,1,0xa18,1,1, -1,1,0xa1c,0x28a5,0xa20,0x28ab,0xa24,0x28b1,0xa28,0x28b7,0xa2c,0x28bd,0xa30,0x28c3,0xa34,0x28c9, -0xa38,0x28cf,0xa3c,0x28d5,0xa40,0x28db,0xa44,0x28e1,0xa48,0x28e7,1,0xa4c,0x28ed,0xa50,0x28f3,0xa54, -0x28f9,1,1,1,1,1,0xa58,0x28ff,0x2905,0xa60,0x290b,0x2911,0xa68,0x2917,0x291d,0xa70, -0x2923,0x2929,0xa78,0x292f,0x2935,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x293b,1,1,0x2941,0x2947, -0x294d,0x2953,1,1,0xa90,0x2959,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,0xffc0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +0x9ac,1,1,1,1,0x9b0,0x283d,0x9b4,0x2843,0x9b8,0x2849,0x9bc,0x284f,0x9c0,0x2855,0x9c4, +0x285b,0x9c8,0x2861,0x9cc,0x2867,0x9d0,0x286d,0x9d4,0x2873,0x9d8,0x2879,0x9dc,0x287f,1,0x9e0,0x2885, +0x9e4,0x288b,0x9e8,0x2891,1,1,1,1,1,0x9ec,0x2897,0x289d,0x9f4,0x28a3,0x28a9,0x9fc, +0x28af,0x28b5,0xa04,0x28bb,0x28c1,0xa0c,0x28c7,0x28cd,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x28d3,1,1,1, +1,0xfc10,0xfc10,1,1,0xa14,0x28d9,1,1,1,1,1,1,1,0xa18,1, +1,1,1,0xa1c,0x28df,0xa20,0x28e5,0xa24,0x28eb,0xa28,0x28f1,0xa2c,0x28f7,0xa30,0x28fd,0xa34, +0x2903,0xa38,0x2909,0xa3c,0x290f,0xa40,0x2915,0xa44,0x291b,0xa48,0x2921,1,0xa4c,0x2927,0xa50,0x292d, +0xa54,0x2933,1,1,1,1,1,0xa58,0x2939,0x293f,0xa60,0x2945,0x294b,0xa68,0x2951,0x2957, +0xa70,0x295d,0x2963,0xa78,0x2969,0x296f,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2975,1,1,0x297b, +0x2981,0x2987,0x298d,1,1,0xa90,0x2993,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xffcc,1,0xffcc,0xffcc,0xffb8,1,1, -0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc,1,0xffcc,1,1,1,1,1, +1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, -1,1,1,1,1,1,1,1,1,0xae2,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0xae2,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0xae2,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0xae2,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289, -0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,0x1289,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x3c66,1,0x3c66,0x3c66,0x3c66,0x3c66,0x3c66,0x3c66,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c66, -0x3c66,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x3c66,1,1,1,1,0x3c66,1,1,1,0x3c66,0x3c66,0x3c66, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3b97,1, -0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af1,0x2af5,0x2af9,0x2afd,0x2b01,0x2b05,0x2b09,0x2b0d, -0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d,0x2b41,0x2b45,0x2b49,0x2b4d, -0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d,0x2b81,0x2b85,0x2b89,0x2b8d, -0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd,0x2bc1,0x2bc5,0x2bc9,0x2bcd, -0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd,0x2c01,0x2c05,0x2c09,0x2c0d, -0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25,0x2c29,0x2c2d,0x2c31,0x2c35,0x2c39,0x2c3d,0x2b21,0x2c41,0x2c45,0x2c49, -0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79,0x2c7d,0x2c81,0x2c85,0x2c89, -0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9,0x2cbd,0x2cc1,0x2cc5,0x2cc9, -0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9,0x2cfd,0x2d01,0x2d05,0x2d09, -0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39,0x2d3d,0x2d41,0x2d45,0x2d49, -0x2d4d,0x2c89,0x2d51,0x2d55,0x2d59,0x2d5d,0x2d61,0x2d65,0x2d69,0x2d6d,0x2c49,0x2d71,0x2d75,0x2d79,0x2d7d,0x2d81, -0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2db1,0x2db5,0x2db9,0x2dbd,0x2b21, -0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded,0x2df1,0x2df5,0x2df9,0x2dfd, -0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15,0x2e19,0x2e1d,0x2e21,0x2e25,0x2e29,0x2c51,0x2e2d,0x2e31,0x2e35,0x2e39, -0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69,0x2e6d,0x2e71,0x2e75,0x2e79, -0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9,0x2ead,0x2eb1,0x2eb5,0x2eb9, -0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,0x2ee5,0x2ee9,0x2eed,0x2ef1,1,1, -0x2ef5,1,0x2ef9,1,1,0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,0x2f15,0x2f19,0x2f1d,0x2f21,1, -0x2f25,1,0x2f29,1,1,0x2f2d,0x2f31,1,1,1,0x2f35,0x2f39,0x2f3d,0x2f41,0x2f45,0x2f49, -0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79,0x2f7d,0x2f81,0x2f85,0x2f89, -0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9,0x2fbd,0x2fc1,0x2fc5,0x2fc9, -0x2fcd,0x2fd1,0x2fd5,0x2fd9,0x2fdd,0x2fe1,0x2fe5,0x2d25,0x2fe9,0x2fed,0x2ff1,0x2ff5,0x2ff9,0x2ffd,0x2ffd,0x3001, -0x3005,0x3009,0x300d,0x3011,0x3015,0x3019,0x301d,0x2f2d,0x3021,0x3025,0x3029,0x302d,0x3031,0x3037,1,1, -0x303b,0x303f,0x3043,0x3047,0x304b,0x304f,0x3053,0x3057,0x2f65,0x305b,0x305f,0x3063,0x2ef5,0x3067,0x306b,0x306f, -0x3073,0x3077,0x307b,0x307f,0x3083,0x3087,0x308b,0x308f,0x3093,0x2f89,0x3097,0x2f8d,0x309b,0x309f,0x30a3,0x30a7, -0x30ab,0x2ef9,0x2b75,0x30af,0x30b3,0x30b7,0x2c8d,0x2de9,0x30bb,0x30bf,0x2fa9,0x30c3,0x2fad,0x30c7,0x30cb,0x30cf, -0x2f01,0x30d3,0x30d7,0x30db,0x30df,0x30e3,0x2f05,0x30e7,0x30eb,0x30ef,0x30f3,0x30f7,0x30fb,0x2fe5,0x30ff,0x3103, -0x2d25,0x3107,0x2ff5,0x310b,0x310f,0x3113,0x3117,0x311b,0x3009,0x311f,0x2f29,0x3123,0x300d,0x2c41,0x3127,0x3011, -0x312b,0x3019,0x312f,0x3133,0x3137,0x313b,0x313f,0x3021,0x2f19,0x3143,0x3025,0x3147,0x3029,0x314b,0x2af1,0x314f, -0x3155,0x315b,0x3161,0x3165,0x3169,0x316d,0x3173,0x3179,0x317f,0x3183,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x3186,0xfe34,0x318c,1,1,1,1,1,1,1,1,1,1,0x3192,0x3198,0x31a0, -0x31aa,0x31b2,0x31b8,0x31be,0x31c4,0x31ca,0x31d0,0x31d6,0x31dc,0x31e2,1,0x31e8,0x31ee,0x31f4,0x31fa,0x3200, -1,0x3206,1,0x320c,0x3212,1,0x3218,0x321e,1,0x3224,0x322a,0x3230,0x3236,0x323c,0x3242,0x3248, -0x324e,0x3254,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, -0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffb8,1,0xffcc,1,1,1,1,1,1,1,1,0xffcc,0xfe02, -0xffb8,1,1,1,1,0xfe12,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,1,0xffcc,0xffcc,0xffb8,1, +1,0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc,1,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe12,1,1,1,1,1,1,1,1,1,0xb0c,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0xb0c,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0xb0c,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0xb0c,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3, +0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x3cf0,0x29a0,0x3cf0,0x3cf0,0x3cf0,0x3cf0,0x3cf0,0x3cf0,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3cf0,1, +0x3cf0,0x3cf0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x3cf0,1,1,1,1,0x3cf0,1,1,1,0x3cf0,0x3cf0, +0x3cf0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c21, +1,0x2b5f,0x2b63,0x2b67,0x2b6b,0x2b6f,0x2b73,0x2b77,0x2b7b,0x2b7b,0x2b7f,0x2b83,0x2b87,0x2b8b,0x2b8f,0x2b93, +0x2b97,0x2b9b,0x2b9f,0x2ba3,0x2ba7,0x2bab,0x2baf,0x2bb3,0x2bb7,0x2bbb,0x2bbf,0x2bc3,0x2bc7,0x2bcb,0x2bcf,0x2bd3, +0x2bd7,0x2bdb,0x2bdf,0x2be3,0x2be7,0x2beb,0x2bef,0x2bf3,0x2bf7,0x2bfb,0x2bff,0x2c03,0x2c07,0x2c0b,0x2c0f,0x2c13, +0x2c17,0x2c1b,0x2c1f,0x2c23,0x2c27,0x2c2b,0x2c2f,0x2c33,0x2c37,0x2c3b,0x2c3f,0x2c43,0x2c47,0x2c4b,0x2c4f,0x2c53, +0x2c57,0x2c5b,0x2c5f,0x2c63,0x2c67,0x2c6b,0x2c6f,0x2c73,0x2c77,0x2c7b,0x2c7f,0x2c83,0x2c87,0x2c8b,0x2c8f,0x2c93, +0x2c97,0x2c9b,0x2c9f,0x2ca3,0x2ca7,0x2cab,0x2caf,0x2cb3,0x2cb7,0x2cbb,0x2cbf,0x2cc3,0x2cc7,0x2bab,0x2ccb,0x2ccf, +0x2cd3,0x2cd7,0x2cdb,0x2cdf,0x2ce3,0x2ce7,0x2ceb,0x2cef,0x2cf3,0x2cf7,0x2cfb,0x2cff,0x2d03,0x2d07,0x2d0b,0x2d0f, +0x2d13,0x2d17,0x2d1b,0x2d1f,0x2d23,0x2d27,0x2d2b,0x2d2f,0x2d33,0x2d37,0x2d3b,0x2d3f,0x2d43,0x2d47,0x2d4b,0x2d4f, +0x2d53,0x2d57,0x2d5b,0x2d5f,0x2d63,0x2d67,0x2d6b,0x2d6f,0x2d73,0x2d77,0x2d7b,0x2d7f,0x2d83,0x2d87,0x2d8b,0x2d8f, +0x2d93,0x2d97,0x2d9b,0x2d9f,0x2da3,0x2da7,0x2dab,0x2daf,0x2db3,0x2db7,0x2dbb,0x2dbf,0x2dc3,0x2dc7,0x2dcb,0x2dcf, +0x2dd3,0x2dd7,0x2d13,0x2ddb,0x2ddf,0x2de3,0x2de7,0x2deb,0x2def,0x2df3,0x2df7,0x2cd3,0x2dfb,0x2dff,0x2e03,0x2e07, +0x2e0b,0x2e0f,0x2e13,0x2e17,0x2e1b,0x2e1f,0x2e23,0x2e27,0x2e2b,0x2e2f,0x2e33,0x2e37,0x2e3b,0x2e3f,0x2e43,0x2e47, +0x2bab,0x2e4b,0x2e4f,0x2e53,0x2e57,0x2e5b,0x2e5f,0x2e63,0x2e67,0x2e6b,0x2e6f,0x2e73,0x2e77,0x2e7b,0x2e7f,0x2e83, +0x2e87,0x2e8b,0x2e8f,0x2e93,0x2e97,0x2e9b,0x2e9f,0x2ea3,0x2ea7,0x2eab,0x2eaf,0x2eb3,0x2cdb,0x2eb7,0x2ebb,0x2ebf, +0x2ec3,0x2ec7,0x2ecb,0x2ecf,0x2ed3,0x2ed7,0x2edb,0x2edf,0x2ee3,0x2ee7,0x2eeb,0x2eef,0x2ef3,0x2ef7,0x2efb,0x2eff, +0x2f03,0x2f07,0x2f0b,0x2f0f,0x2f13,0x2f17,0x2f1b,0x2f1f,0x2f23,0x2f27,0x2f2b,0x2f2f,0x2f33,0x2f37,0x2f3b,0x2f3f, +0x2f43,0x2f47,0x2f4b,0x2f4f,0x2f53,0x2f57,0x2f5b,0x2f5f,0x2f63,0x2f67,0x2f6b,0x2f6f,0x2f73,0x2f77,0x2f7b,1, +1,0x2f7f,1,0x2f83,1,1,0x2f87,0x2f8b,0x2f8f,0x2f93,0x2f97,0x2f9b,0x2f9f,0x2fa3,0x2fa7,0x2fab, +1,0x2faf,1,0x2fb3,1,1,0x2fb7,0x2fbb,1,1,1,0x2fbf,0x2fc3,0x2fc7,0x2fcb,0x2fcf, +0x2fd3,0x2fd7,0x2fdb,0x2fdf,0x2fe3,0x2fe7,0x2feb,0x2fef,0x2ff3,0x2ff7,0x2ffb,0x2fff,0x3003,0x3007,0x300b,0x300f, +0x3013,0x3017,0x301b,0x301f,0x3023,0x3027,0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x304b,0x304f, +0x3053,0x3057,0x305b,0x305f,0x3063,0x3067,0x306b,0x306f,0x2daf,0x3073,0x3077,0x307b,0x307f,0x3083,0x3087,0x3087, +0x308b,0x308f,0x3093,0x3097,0x309b,0x309f,0x30a3,0x30a7,0x2fb7,0x30ab,0x30af,0x30b3,0x30b7,0x30bb,0x30c1,1, +1,0x30c5,0x30c9,0x30cd,0x30d1,0x30d5,0x30d9,0x30dd,0x30e1,0x2fef,0x30e5,0x30e9,0x30ed,0x2f7f,0x30f1,0x30f5, +0x30f9,0x30fd,0x3101,0x3105,0x3109,0x310d,0x3111,0x3115,0x3119,0x311d,0x3013,0x3121,0x3017,0x3125,0x3129,0x312d, +0x3131,0x3135,0x2f83,0x2bff,0x3139,0x313d,0x3141,0x2d17,0x2e73,0x3145,0x3149,0x3033,0x314d,0x3037,0x3151,0x3155, +0x3159,0x2f8b,0x315d,0x3161,0x3165,0x3169,0x316d,0x2f8f,0x3171,0x3175,0x3179,0x317d,0x3181,0x3185,0x306f,0x3189, +0x318d,0x2daf,0x3191,0x307f,0x3195,0x3199,0x319d,0x31a1,0x31a5,0x3093,0x31a9,0x2fb3,0x31ad,0x3097,0x2ccb,0x31b1, +0x309b,0x31b5,0x30a3,0x31b9,0x31bd,0x31c1,0x31c5,0x31c9,0x30ab,0x2fa3,0x31cd,0x30af,0x31d1,0x30b3,0x31d5,0x2b7b, +0x31d9,0x31df,0x31e5,0x31eb,0x31ef,0x31f3,0x31f7,0x31fd,0x3203,0x3209,0x320d,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x3210,0xfe34,0x3216,1,1,1,1,1,1,1,1,1,1,0x321c,0x3222, +0x322a,0x3234,0x323c,0x3242,0x3248,0x324e,0x3254,0x325a,0x3260,0x3266,0x326c,1,0x3272,0x3278,0x327e,0x3284, +0x328a,1,0x3290,1,0x3296,0x329c,1,0x32a2,0x32a8,1,0x32ae,0x32b4,0x32ba,0x32c0,0x32c6,0x32cc, +0x32d2,0x32d8,0x32de,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, +0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x2999,1,1,1,1,1,1,0xa94,1,1,1,1, +1,1,1,0xa9a,1,1,1,1,1,0x29a1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1,1,1,1, +1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,1,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,0xffb8,0xffb8,0xffb8, 1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8, 1,1,0xffcc,0xffb8,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1, 0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, -1,1,1,1,1,1,1,1,1,0xa94,0x295f,0xa9a,0x2969,1,1,1, -1,1,0xaa0,1,1,1,1,1,0x2973,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xaa0,0x29a9,0xaa6,0x29b3,1,1,1, +1,1,0xaac,1,1,1,1,1,0x29bd,1,1,1,1,1,1,1, 1,1,0xfe12,0xfc0e,1,1,1,1,1,1,1,0xfc00,1,1,1,1, -1,1,0x297d,0x2987,1,0xaa6,0xaac,0xfe12,0xfe12,1,1,1,1,1,1,1, +1,1,0x29c7,0x29d1,1,0xab2,0xab8,0xfe12,0xfe12,1,1,1,1,1,1,1, 1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,0xfe0e,1, 1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,0xfe0e, 0xfe12,1,1,1,1,1,1,1,1,1,1,1,0xfe0e,0xfe0e,1,0xfc00, -1,1,1,1,1,1,1,0xab2,1,1,1,0x2991,0x299b,0xfe12,1,1, -1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,0xfe12,1, -1,1,0xfe0e,1,1,1,1,1,1,1,1,1,0xfc00,1,1,1, -1,1,1,1,1,0xabe,0xfc00,0x29a5,0x29af,0xfc00,0x29b9,1,1,0xfe12,0xfe0e,1, -1,1,1,1,1,1,1,1,1,1,1,0xad0,0xad6,0x29c3,0x29cd,1, -1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,0xfc00,1,1, -1,1,0xadc,1,1,0x29d7,1,1,1,1,0xfe12,0xfe12,1,0xfe02,0xfe02,0xfe02, -0xfe02,0xfe02,1,1,1,1,1,1,1,1,1,1,1,0xfe0c,0xfe0c,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe02,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0x325a,0x3264,0x3278,0x3290, -0x32a8,0x32c0,0x32d8,0xffb0,0xffb0,0xfe02,0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,1, -1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,0xffcc, -0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x32e6,0x32f0, -0x3304,0x331c,0x3334,0x334c,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, -0xffd0,0xffd0,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1, -1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1, -0x335b,0x335f,0x3363,0x3367,0x336d,0x2f4d,0x3371,0x3375,0x3379,0x337d,0x2f51,0x3381,0x3385,0x3389,0x2f55,0x338f, -0x3393,0x3397,0x339b,0x33a1,0x33a5,0x33a9,0x33ad,0x33b3,0x33b7,0x33bb,0x33bf,0x303f,0x33c3,0x33c9,0x33cd,0x33d1, -0x33d5,0x33d9,0x33dd,0x33e1,0x33e5,0x3053,0x2f59,0x2f5d,0x3057,0x33e9,0x33ed,0x2c59,0x33f1,0x2f61,0x33f5,0x33f9, -0x33fd,0x3401,0x3401,0x3401,0x3405,0x340b,0x340f,0x3413,0x3417,0x341d,0x3421,0x3425,0x3429,0x342d,0x3431,0x3435, -0x3439,0x343d,0x3441,0x3445,0x3449,0x344d,0x344d,0x305f,0x3451,0x3455,0x3459,0x345d,0x2f69,0x3461,0x3465,0x3469, -0x2ebd,0x346d,0x3471,0x3475,0x3479,0x347d,0x3481,0x3485,0x3489,0x348d,0x3493,0x3497,0x349b,0x349f,0x34a3,0x34a7, -0x34ab,0x34b1,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34cb,0x34cf,0x34d3,0x34d7,0x34d7,0x34db,0x34e1,0x34e5,0x2c49, -0x34e9,0x34ed,0x34f3,0x34f7,0x34fb,0x34ff,0x3503,0x3507,0x2f7d,0x350b,0x350f,0x3513,0x3519,0x351d,0x3523,0x3527, -0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3543,0x3547,0x354b,0x354f,0x3555,0x3559,0x355d,0x3561,0x2b71,0x3565, -0x356b,0x356f,0x356f,0x3575,0x3579,0x3579,0x357d,0x3581,0x3587,0x358d,0x3591,0x3595,0x3599,0x359d,0x35a1,0x35a5, -0x35a9,0x35ad,0x35b1,0x2f81,0x35b5,0x35bb,0x35bf,0x35c3,0x308f,0x35c3,0x35c7,0x2f89,0x35cb,0x35cf,0x35d3,0x35d7, -0x2f8d,0x2b05,0x35db,0x35df,0x35e3,0x35e7,0x35eb,0x35ef,0x35f3,0x35f9,0x35fd,0x3601,0x3605,0x3609,0x360d,0x3613, -0x3617,0x361b,0x361f,0x3623,0x3627,0x362b,0x362f,0x3633,0x2f91,0x3637,0x363b,0x3641,0x3645,0x3649,0x364d,0x2f99, -0x3651,0x3655,0x3659,0x365d,0x3661,0x3665,0x3669,0x366d,0x2b75,0x30af,0x3671,0x3675,0x3679,0x367d,0x3683,0x3687, -0x368b,0x368f,0x2f9d,0x3693,0x3699,0x369d,0x36a1,0x3161,0x36a5,0x36a9,0x36ad,0x36b1,0x36b5,0x36bb,0x36bf,0x36c3, -0x36c7,0x36cd,0x36d1,0x36d5,0x36d9,0x2c8d,0x36dd,0x36e1,0x36e7,0x36ed,0x36f3,0x36f7,0x36fd,0x3701,0x3705,0x3709, -0x370d,0x2fa1,0x2de9,0x3711,0x3715,0x3719,0x371d,0x3723,0x3727,0x372b,0x372f,0x30bf,0x3733,0x3737,0x373d,0x3741, -0x3745,0x374b,0x3751,0x3755,0x30c3,0x3759,0x375d,0x3761,0x3765,0x3769,0x376d,0x3771,0x3777,0x377b,0x3781,0x3785, -0x378b,0x30cb,0x378f,0x3793,0x3799,0x379d,0x37a1,0x37a7,0x37ad,0x37b1,0x37b5,0x37b9,0x37bd,0x37bd,0x37c1,0x37c5, -0x30d3,0x37c9,0x37cd,0x37d1,0x37d5,0x37d9,0x37df,0x37e3,0x2c55,0x37e9,0x37ef,0x37f3,0x37f9,0x37ff,0x3805,0x3809, -0x30eb,0x380d,0x3813,0x3819,0x381f,0x3825,0x3829,0x3829,0x30ef,0x3169,0x382d,0x3831,0x3835,0x3839,0x383f,0x2bbd, -0x30f7,0x3843,0x3847,0x2fcd,0x384d,0x3853,0x2f15,0x3859,0x385d,0x2fdd,0x3861,0x3865,0x3869,0x386f,0x386f,0x3875, -0x3879,0x387d,0x3883,0x3887,0x388b,0x388f,0x3895,0x3899,0x389d,0x38a1,0x38a5,0x38a9,0x38af,0x38b3,0x38b7,0x38bb, -0x38bf,0x38c3,0x38c7,0x38cd,0x38d3,0x38d7,0x38dd,0x38e1,0x38e7,0x38eb,0x2ff5,0x38ef,0x38f5,0x38fb,0x38ff,0x3905, -0x3909,0x390f,0x3913,0x3917,0x391b,0x391f,0x3923,0x3927,0x392d,0x3933,0x3939,0x3575,0x393f,0x3943,0x3947,0x394b, -0x394f,0x3953,0x3957,0x395b,0x395f,0x3963,0x3967,0x396b,0x2c9d,0x3971,0x3975,0x3979,0x397d,0x3981,0x3985,0x3001, -0x3989,0x398d,0x3991,0x3995,0x3999,0x399f,0x39a5,0x39ab,0x39af,0x39b3,0x39b7,0x39bb,0x39c1,0x39c5,0x39cb,0x39cf, -0x39d3,0x39d9,0x39df,0x39e3,0x2ba9,0x39e7,0x39eb,0x39ef,0x39f3,0x39f7,0x39fb,0x3113,0x39ff,0x3a03,0x3a07,0x3a0b, -0x3a0f,0x3a13,0x3a17,0x3a1b,0x3a1f,0x3a23,0x3a29,0x3a2d,0x3a31,0x3a35,0x3a39,0x3a3d,0x3a43,0x3a49,0x3a4d,0x3a51, -0x3127,0x312b,0x3a55,0x3a59,0x3a5f,0x3a63,0x3a67,0x3a6b,0x3a6f,0x3a75,0x3a7b,0x3a7f,0x3a83,0x3a87,0x3a8d,0x312f, -0x3a91,0x3a97,0x3a9d,0x3aa1,0x3aa5,0x3aa9,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3abf,0x3ac3,0x3ac7,0x3acb,0x3ad1,0x3ad5, -0x3ad9,0x3add,0x3ae3,0x3ae7,0x3aeb,0x3aef,0x3af3,0x3af9,0x3aff,0x3b03,0x3b07,0x3b0b,0x3b11,0x3b15,0x3147,0x3147, -0x3b1b,0x3b1f,0x3b25,0x3b29,0x3b2d,0x3b31,0x3b35,0x3b39,0x3b3d,0x3b41,0x314b,0x3b47,0x3b4b,0x3b4f,0x3b53,0x3b57, -0x3b5b,0x3b61,0x3b65,0x3b6b,0x3b71,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,0x3b8b,0x3b8f,0x3b93,0x3b97,1,1 +1,1,1,1,1,1,1,0xabe,1,1,1,0x29db,0x29e5,0xfe12,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,0xaca,0x29ef, +0xad0,0x29f9,1,1,1,1,1,0xad6,1,1,0x2a03,1,0xadc,0x2a0d,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfc00,1,1,0xfc00, +1,1,1,1,0xfbc4,1,1,0xfb10,1,0xfb1a,0xfb24,0xfc00,1,1,1,1, +0xfe12,0xfe12,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,0xfc00,1,1,1,1,1,1,1,1,0xae2,0xfc00,0x2a17,0x2a21,0xfc00, +0x2a2b,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1,1, +1,0xaf4,0xafa,0x2a35,0x2a3f,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,0xb00,1,1,0x2a49,1,1,1,1, +0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfbd6,0xfc00,0xfb9e,0xfbb4,0xfb2e,0xfb38,0xfb42,0xfb56,0xfb6e,0xfb86,0xfbee,1,1,1,1,1, +0xfe12,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,1,1,1,1,1,1, +1,0xb06,1,1,1,0xfbf4,0xfb94,0x12b2,0x2a5d,1,1,1,1,1,0xfe0c,0xfe0c, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe02,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x32e4,0x32ee,0x3302, +0x331a,0x3332,0x334a,0x3362,0xffb0,0xffb0,0xfe02,0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0, +1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x3370, +0x337a,0x338e,0x33a6,0x33be,0x33d6,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,0xffd0,0xffd0,0xffb8,0xffcc,1,1,1,0xffcc,1,1,0xffcc,1,1,1,1, +1,1,1,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1, +1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1, +1,0x33e5,0x33e9,0x33ed,0x33f1,0x33f7,0x2fd7,0x33fb,0x33ff,0x3403,0x3407,0x2fdb,0x340b,0x340f,0x3413,0x2fdf, +0x3419,0x341d,0x3421,0x3425,0x342b,0x342f,0x3433,0x3437,0x343d,0x3441,0x3445,0x3449,0x30c9,0x344d,0x3453,0x3457, +0x345b,0x345f,0x3463,0x3467,0x346b,0x346f,0x30dd,0x2fe3,0x2fe7,0x30e1,0x3473,0x3477,0x2ce3,0x347b,0x2feb,0x347f, +0x3483,0x3487,0x348b,0x348b,0x348b,0x348f,0x3495,0x3499,0x349d,0x34a1,0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb, +0x34bf,0x34c3,0x34c7,0x34cb,0x34cf,0x34d3,0x34d7,0x34d7,0x30e9,0x34db,0x34df,0x34e3,0x34e7,0x2ff3,0x34eb,0x34ef, +0x34f3,0x2f47,0x34f7,0x34fb,0x34ff,0x3503,0x3507,0x350b,0x350f,0x3513,0x3517,0x351d,0x3521,0x3525,0x3529,0x352d, +0x3531,0x3535,0x353b,0x3541,0x3545,0x3549,0x354d,0x3551,0x3555,0x3559,0x355d,0x3561,0x3561,0x3565,0x356b,0x356f, +0x2cd3,0x3573,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3007,0x3595,0x3599,0x359d,0x35a3,0x35a7,0x35ad, +0x35b1,0x35b5,0x35b9,0x35bd,0x35c1,0x35c5,0x35c9,0x35cd,0x35d1,0x35d5,0x35d9,0x35df,0x35e3,0x35e7,0x35eb,0x2bfb, +0x35ef,0x35f5,0x35f9,0x35f9,0x35ff,0x3603,0x3603,0x3607,0x360b,0x3611,0x3617,0x361b,0x361f,0x3623,0x3627,0x362b, +0x362f,0x3633,0x3637,0x363b,0x300b,0x363f,0x3645,0x3649,0x364d,0x3119,0x364d,0x3651,0x3013,0x3655,0x3659,0x365d, +0x3661,0x3017,0x2b8f,0x3665,0x3669,0x366d,0x3671,0x3675,0x3679,0x367d,0x3683,0x3687,0x368b,0x368f,0x3693,0x3697, +0x369d,0x36a1,0x36a5,0x36a9,0x36ad,0x36b1,0x36b5,0x36b9,0x36bd,0x301b,0x36c1,0x36c5,0x36cb,0x36cf,0x36d3,0x36d7, +0x3023,0x36db,0x36df,0x36e3,0x36e7,0x36eb,0x36ef,0x36f3,0x36f7,0x2bff,0x3139,0x36fb,0x36ff,0x3703,0x3707,0x370d, +0x3711,0x3715,0x3719,0x3027,0x371d,0x3723,0x3727,0x372b,0x31eb,0x372f,0x3733,0x3737,0x373b,0x373f,0x3745,0x3749, +0x374d,0x3751,0x3757,0x375b,0x375f,0x3763,0x2d17,0x3767,0x376b,0x3771,0x3777,0x377d,0x3781,0x3787,0x378b,0x378f, +0x3793,0x3797,0x302b,0x2e73,0x379b,0x379f,0x37a3,0x37a7,0x37ad,0x37b1,0x37b5,0x37b9,0x3149,0x37bd,0x37c1,0x37c7, +0x37cb,0x37cf,0x37d5,0x37db,0x37df,0x314d,0x37e3,0x37e7,0x37eb,0x37ef,0x37f3,0x37f7,0x37fb,0x3801,0x3805,0x380b, +0x380f,0x3815,0x3155,0x3819,0x381d,0x3823,0x3827,0x382b,0x3831,0x3837,0x383b,0x383f,0x3843,0x3847,0x3847,0x384b, +0x384f,0x315d,0x3853,0x3857,0x385b,0x385f,0x3863,0x3869,0x386d,0x2cdf,0x3873,0x3879,0x387d,0x3883,0x3889,0x388f, +0x3893,0x3175,0x3897,0x389d,0x38a3,0x38a9,0x38af,0x38b3,0x38b3,0x3179,0x31f3,0x38b7,0x38bb,0x38bf,0x38c3,0x38c9, +0x2c47,0x3181,0x38cd,0x38d1,0x3057,0x38d7,0x38dd,0x2f9f,0x38e3,0x38e7,0x3067,0x38eb,0x38ef,0x38f3,0x38f9,0x38f9, +0x38ff,0x3903,0x3907,0x390d,0x3911,0x3915,0x3919,0x391f,0x3923,0x3927,0x392b,0x392f,0x3933,0x3939,0x393d,0x3941, +0x3945,0x3949,0x394d,0x3951,0x3957,0x395d,0x3961,0x3967,0x396b,0x3971,0x3975,0x307f,0x3979,0x397f,0x3985,0x3989, +0x398f,0x3993,0x3999,0x399d,0x39a1,0x39a5,0x39a9,0x39ad,0x39b1,0x39b7,0x39bd,0x39c3,0x35ff,0x39c9,0x39cd,0x39d1, +0x39d5,0x39d9,0x39dd,0x39e1,0x39e5,0x39e9,0x39ed,0x39f1,0x39f5,0x2d27,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b,0x3a0f, +0x308b,0x3a13,0x3a17,0x3a1b,0x3a1f,0x3a23,0x3a29,0x3a2f,0x3a35,0x3a39,0x3a3d,0x3a41,0x3a45,0x3a4b,0x3a4f,0x3a55, +0x3a59,0x3a5d,0x3a63,0x3a69,0x3a6d,0x2c33,0x3a71,0x3a75,0x3a79,0x3a7d,0x3a81,0x3a85,0x319d,0x3a89,0x3a8d,0x3a91, +0x3a95,0x3a99,0x3a9d,0x3aa1,0x3aa5,0x3aa9,0x3aad,0x3ab3,0x3ab7,0x3abb,0x3abf,0x3ac3,0x3ac7,0x3acd,0x3ad3,0x3ad7, +0x3adb,0x31b1,0x31b5,0x3adf,0x3ae3,0x3ae9,0x3aed,0x3af1,0x3af5,0x3af9,0x3aff,0x3b05,0x3b09,0x3b0d,0x3b11,0x3b17, +0x31b9,0x3b1b,0x3b21,0x3b27,0x3b2b,0x3b2f,0x3b33,0x3b39,0x3b3d,0x3b41,0x3b45,0x3b49,0x3b4d,0x3b51,0x3b55,0x3b5b, +0x3b5f,0x3b63,0x3b67,0x3b6d,0x3b71,0x3b75,0x3b79,0x3b7d,0x3b83,0x3b89,0x3b8d,0x3b91,0x3b95,0x3b9b,0x3b9f,0x31d1, +0x31d1,0x3ba5,0x3ba9,0x3baf,0x3bb3,0x3bb7,0x3bbb,0x3bbf,0x3bc3,0x3bc7,0x3bcb,0x31d5,0x3bd1,0x3bd5,0x3bd9,0x3bdd, +0x3be1,0x3be5,0x3beb,0x3bef,0x3bf5,0x3bfb,0x3c01,0x3c05,0x3c09,0x3c0d,0x3c11,0x3c15,0x3c19,0x3c1d,0x3c21,1, +1,1 }; static const UCPTrie norm2_nfc_data_trie={ norm2_nfc_data_trieIndex, { norm2_nfc_data_trieData }, - 1788, 7984, + 1888, 8162, 0x2fc00, 0x30, 0, 0, 0, 0, @@ -645,7 +663,7 @@ static const UCPTrie norm2_nfc_data_trie={ 0x1, }; -static const uint16_t norm2_nfc_data_extraData[7732]={ +static const uint16_t norm2_nfc_data_extraData[7918]={ 0xffff,0xffff,0x8670,0x44dc,0x8670,0x44c0,0x8670,0x44de,0x600,0x180,0x602,0x182,0x604,0x185,0x606,0x186, 0x608,0x200,0x60c,0x205,0x60e,0x44d,0x610,0x189,0x612,0x3d44,0x614,0x18b,0x618,0x39a,0x61e,0x400, 0x622,0x404,0x646,0x3d41,0x64a,0x3c00,0x8650,0x208,0x60e,0x3c04,0x646,0x3c08,0x8662,0x3c0c,0x602,0x20c, @@ -730,411 +748,422 @@ static const uint16_t norm2_nfc_data_extraData[7732]={ 0xe132,0x615c,0xe132,0x6160,0xe132,0x6164,0xe132,0x6168,0xe132,0x616c,0xe132,0x6170,0xe132,0x6174,0xe132,0x6178, 0xe132,0x617c,0xe132,0x6180,0xe132,0x6184,0xe132,0x618a,0xe132,0x618e,0xe132,0x6192,0x6132,0x61a0,0xe134,0x61a2, 0x6132,0x61a6,0xe134,0x61a8,0x6132,0x61ac,0xe134,0x61ae,0x6132,0x61b2,0xe134,0x61b4,0x6132,0x61b8,0xe134,0x61ba, -0xe132,0x61ee,0xe132,0x61f0,0xe132,0x61f2,0xe132,0x61f4,0xe132,0x61fc,0xb489,0x2e82,0x2134,0xb489,0x2e82,0x2138, -0xb489,0x2e82,0x2156,0xb489,0x49c2,0x225c,0xb489,0x49c2,0x225e,0x3489,0xcf82,0x2696,0xb489,0xd5c2,0x2698,0x348b, -0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,0xb48d,0x4c02, -0x3270,2,0xe602,0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe602,0x41,0x308, -0x8608,0x3bc,0xe602,0x41,0x30a,0x8602,0x3f4,0xca02,0x43,0x327,0x8602,0x3c10,0xe602,0x45,0x302,0x600, -0x3d80,0x602,0x3d7c,0x606,0x3d88,0x8612,0x3d84,0xe602,0x49,0x308,0x8602,0x3c5c,0xe602,0x4f,0x302,0x600, -0x3da4,0x602,0x3da0,0x606,0x3dac,0x8612,0x3da8,0xe602,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c, -0xe602,0x4f,0x308,0x8608,0x454,0xe602,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2, -0xe602,0x61,0x302,0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe602,0x61,0x308,0x8608,0x3be, -0xe602,0x61,0x30a,0x8602,0x3f6,0xca02,0x63,0x327,0x8602,0x3c12,0xe602,0x65,0x302,0x600,0x3d82,0x602, -0x3d7e,0x606,0x3d8a,0x8612,0x3d86,0xe602,0x69,0x308,0x8602,0x3c5e,0xe602,0x6f,0x302,0x600,0x3da6,0x602, -0x3da2,0x606,0x3dae,0x8612,0x3daa,0xe602,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe602,0x6f, -0x308,0x8608,0x456,0xe602,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe602,0x41, -0x306,0x600,0x3d60,0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe602,0x61,0x306,0x600,0x3d62,0x602,0x3d5e, -0x606,0x3d6a,0x8612,0x3d66,0xe602,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe602,0x65,0x304,0x600,0x3c2a, -0x8602,0x3c2e,0xe602,0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe602,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6, -0xe602,0x53,0x301,0x860e,0x3cc8,0xe602,0x73,0x301,0x860e,0x3cca,0xe602,0x53,0x30c,0x860e,0x3ccc,0xe602, -0x73,0x30c,0x860e,0x3cce,0xe602,0x55,0x303,0x8602,0x3cf0,0xe602,0x75,0x303,0x8602,0x3cf2,0xe602,0x55, -0x304,0x8610,0x3cf4,0xe602,0x75,0x304,0x8610,0x3cf6,0xd802,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606, -0x3dc0,0x612,0x3dbc,0x8646,0x3dc4,0xd802,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe, -0x8646,0x3dc6,0xd802,0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd802, -0x75,0x31b,0x600,0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca02,0x4f,0x328,0x8608, -0x3d8,0xca02,0x6f,0x328,0x8608,0x3da,0xe602,0x41,0x307,0x8608,0x3c0,0xe602,0x61,0x307,0x8608,0x3c2, -0xca02,0x45,0x327,0x860c,0x3c38,0xca02,0x65,0x327,0x860c,0x3c3a,0xe602,0x4f,0x307,0x8608,0x460,0xe602, -0x6f,0x307,0x8608,0x462,0xe602,0x3b1,0x301,0x868a,0x3f68,0xe602,0x3b7,0x301,0x868a,0x3f88,0xe602,0x3b9, -0x308,0x600,0x3fa4,0x602,0x720,0x8684,0x3fae,0xe602,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce, -0xe602,0x3c9,0x301,0x868a,0x3fe8,2,0xcc6,0xcc2,0x99aa,0x1996,2,0xdd9,0xdcf,0x9b94,0x1bba,0xdc02, -0x4c,0x323,0x8608,0x3c70,0xdc02,0x6c,0x323,0x8608,0x3c72,0xdc02,0x52,0x323,0x8608,0x3cb8,0xdc02,0x72, -0x323,0x8608,0x3cba,0xdc02,0x53,0x323,0x860e,0x3cd0,0xdc02,0x73,0x323,0x860e,0x3cd2,0xdc02,0x41,0x323, -0x604,0x3d58,0x860c,0x3d6c,0xdc02,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc02,0x45,0x323,0x8604,0x3d8c, -0xdc02,0x65,0x323,0x8604,0x3d8e,0xdc02,0x4f,0x323,0x8604,0x3db0,0xdc02,0x6f,0x323,0x8604,0x3db2,0xe602, -0x3b1,0x313,0x600,0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe602,0x3b1,0x314,0x600,0x3e07,0x602, -0x3e0b,0x684,0x3e0f,0x868a,0x3f02,0x1f00,0xe643,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe643,0x3b1,0x314, -0x300,0x868a,0x3f06,0x1f00,0xe643,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe643,0x3b1,0x314,0x301,0x868a, -0x3f0a,0x1f00,0xe643,0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe643,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe602, -0x391,0x313,0x600,0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe602,0x391,0x314,0x600,0x3e17,0x602, -0x3e1b,0x684,0x3e1f,0x868a,0x3f12,0x1f08,0xe643,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe643,0x391,0x314, -0x300,0x868a,0x3f16,0x1f08,0xe643,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe643,0x391,0x314,0x301,0x868a, -0x3f1a,0x1f08,0xe643,0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe643,0x391,0x314,0x342,0x868a,0x3f1e,0xe602, -0x3b5,0x313,0x600,0x3e24,0x8602,0x3e28,0xe602,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe602,0x395,0x313, -0x600,0x3e34,0x8602,0x3e38,0xe602,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe602,0x3b7,0x313,0x600,0x3e45, -0x602,0x3e49,0x684,0x3e4d,0x868a,0x3f20,0xe602,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a, -0x3f22,0x1f20,0xe643,0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe643,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20, -0xe643,0x3b7,0x313,0x301,0x868a,0x3f28,0x1f21,0xe643,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe643,0x3b7, -0x313,0x342,0x868a,0x3f2c,0x1f21,0xe643,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe602,0x397,0x313,0x600,0x3e55, -0x602,0x3e59,0x684,0x3e5d,0x868a,0x3f30,0xe602,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a, -0x3f32,0x1f28,0xe643,0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe643,0x397,0x314,0x300,0x868a,0x3f36,0x1f28, -0xe643,0x397,0x313,0x301,0x868a,0x3f38,0x1f29,0xe643,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe643,0x397, -0x313,0x342,0x868a,0x3f3c,0x1f29,0xe643,0x397,0x314,0x342,0x868a,0x3f3e,0xe602,0x3b9,0x313,0x600,0x3e64, -0x602,0x3e68,0x8684,0x3e6c,0xe602,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe602,0x399,0x313, -0x600,0x3e74,0x602,0x3e78,0x8684,0x3e7c,0xe602,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe602, -0x3bf,0x313,0x600,0x3e84,0x8602,0x3e88,0xe602,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe602,0x39f,0x313, -0x600,0x3e94,0x8602,0x3e98,0xe602,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe602,0x3c5,0x313,0x600,0x3ea4, -0x602,0x3ea8,0x8684,0x3eac,0xe602,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe602,0x3a5,0x314, -0x600,0x3eb6,0x602,0x3eba,0x8684,0x3ebe,0xe602,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a, -0x3f40,0xe602,0x3c9,0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe643,0x3c9,0x313, -0x300,0x868a,0x3f44,0x1f61,0xe643,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe643,0x3c9,0x313,0x301,0x868a, -0x3f48,0x1f61,0xe643,0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe643,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61, -0xe643,0x3c9,0x314,0x342,0x868a,0x3f4e,0xe602,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a, -0x3f50,0xe602,0x3a9,0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe643,0x3a9,0x313, -0x300,0x868a,0x3f54,0x1f69,0xe643,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe643,0x3a9,0x313,0x301,0x868a, -0x3f58,0x1f69,0xe643,0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe643,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69, -0xe643,0x3a9,0x314,0x342,0x868a,0x3f5e,0xe602,0x3b1,0x300,0x868a,0x3f64,0xe602,0x3b7,0x300,0x868a,0x3f84, -0xe602,0x3c9,0x300,0x868a,0x3fe4,0xe602,0x3b1,0x342,0x868a,0x3f6e,0xe602,0x3b7,0x342,0x868a,0x3f8e,0xe602, -0x3c9,0x342,0x868a,0x3fee,3,0xe602,0x41,0x300,0xe602,0x41,0x301,0xe602,0x41,0x303,0xe602,0x45, -0x300,0xe602,0x45,0x301,0xe602,0x45,0x308,0xe602,0x49,0x300,0xe602,0x49,0x301,0xe602,0x49,0x302, -0xe602,0x4e,0x303,0xe602,0x4f,0x300,0xe602,0x4f,0x301,0xe602,0x55,0x300,0xe602,0x55,0x301,0xe602, -0x55,0x302,0xe602,0x59,0x301,0xe602,0x61,0x300,0xe602,0x61,0x301,0xe602,0x61,0x303,0xe602,0x65, -0x300,0xe602,0x65,0x301,0xe602,0x65,0x308,0xe602,0x69,0x300,0xe602,0x69,0x301,0xe602,0x69,0x302, -0xe602,0x6e,0x303,0xe602,0x6f,0x300,0xe602,0x6f,0x301,0xe602,0x75,0x300,0xe602,0x75,0x301,0xe602, -0x75,0x302,0xe602,0x79,0x301,0xe602,0x79,0x308,0xe602,0x41,0x304,0xe602,0x61,0x304,0xca02,0x41, -0x328,0xca02,0x61,0x328,0xe602,0x43,0x301,0xe602,0x63,0x301,0xe602,0x43,0x302,0xe602,0x63,0x302, -0xe602,0x43,0x307,0xe602,0x63,0x307,0xe602,0x43,0x30c,0xe602,0x63,0x30c,0xe602,0x44,0x30c,0xe602, -0x64,0x30c,0xe602,0x45,0x306,0xe602,0x65,0x306,0xe602,0x45,0x307,0xe602,0x65,0x307,0xca02,0x45, -0x328,0xca02,0x65,0x328,0xe602,0x45,0x30c,0xe602,0x65,0x30c,0xe602,0x47,0x302,0xe602,0x67,0x302, -0xe602,0x47,0x306,0xe602,0x67,0x306,0xe602,0x47,0x307,0xe602,0x67,0x307,0xca02,0x47,0x327,0xca02, -0x67,0x327,0xe602,0x48,0x302,0xe602,0x68,0x302,0xe602,0x49,0x303,0xe602,0x69,0x303,0xe602,0x49, -0x304,0xe602,0x69,0x304,0xe602,0x49,0x306,0xe602,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328, -0xe602,0x49,0x307,0xe602,0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe602, -0x4c,0x301,0xe602,0x6c,0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe602,0x4c,0x30c,0xe602,0x6c, -0x30c,0xe602,0x4e,0x301,0xe602,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe602,0x4e,0x30c, -0xe602,0x6e,0x30c,0xe602,0x4f,0x306,0xe602,0x6f,0x306,0xe602,0x4f,0x30b,0xe602,0x6f,0x30b,0xe602, -0x52,0x301,0xe602,0x72,0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe602,0x52,0x30c,0xe602,0x72, -0x30c,0xe602,0x53,0x302,0xe602,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327, -0xca02,0x74,0x327,0xe602,0x54,0x30c,0xe602,0x74,0x30c,0xe602,0x55,0x306,0xe602,0x75,0x306,0xe602, -0x55,0x30a,0xe602,0x75,0x30a,0xe602,0x55,0x30b,0xe602,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75, -0x328,0xe602,0x57,0x302,0xe602,0x77,0x302,0xe602,0x59,0x302,0xe602,0x79,0x302,0xe602,0x59,0x308, -0xe602,0x5a,0x301,0xe602,0x7a,0x301,0xe602,0x5a,0x307,0xe602,0x7a,0x307,0xe602,0x5a,0x30c,0xe602, -0x7a,0x30c,0xe602,0x41,0x30c,0xe602,0x61,0x30c,0xe602,0x49,0x30c,0xe602,0x69,0x30c,0xe602,0x4f, -0x30c,0xe602,0x6f,0x30c,0xe602,0x55,0x30c,0xe602,0x75,0x30c,0xdc,0xe643,0x55,0x308,0x304,0xfc, -0xe643,0x75,0x308,0x304,0xdc,0xe643,0x55,0x308,0x301,0xfc,0xe643,0x75,0x308,0x301,0xdc,0xe643, -0x55,0x308,0x30c,0xfc,0xe643,0x75,0x308,0x30c,0xdc,0xe643,0x55,0x308,0x300,0xfc,0xe643,0x75, -0x308,0x300,0xc4,0xe643,0x41,0x308,0x304,0xe4,0xe643,0x61,0x308,0x304,0x226,0xe643,0x41,0x307, -0x304,0x227,0xe643,0x61,0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe602,0x47,0x30c,0xe602, -0x67,0x30c,0xe602,0x4b,0x30c,0xe602,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f, -0x328,0x304,0xe602,0x1b7,0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe602,0x47,0x301,0xe602,0x67, -0x301,0xe602,0x4e,0x300,0xe602,0x6e,0x300,0xc5,0xe643,0x41,0x30a,0x301,0xe5,0xe643,0x61,0x30a, -0x301,0xe602,0xc6,0x301,0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe602,0x41,0x30f, -0xe602,0x61,0x30f,0xe602,0x41,0x311,0xe602,0x61,0x311,0xe602,0x45,0x30f,0xe602,0x65,0x30f,0xe602, -0x45,0x311,0xe602,0x65,0x311,0xe602,0x49,0x30f,0xe602,0x69,0x30f,0xe602,0x49,0x311,0xe602,0x69, -0x311,0xe602,0x4f,0x30f,0xe602,0x6f,0x30f,0xe602,0x4f,0x311,0xe602,0x6f,0x311,0xe602,0x52,0x30f, -0xe602,0x72,0x30f,0xe602,0x52,0x311,0xe602,0x72,0x311,0xe602,0x55,0x30f,0xe602,0x75,0x30f,0xe602, -0x55,0x311,0xe602,0x75,0x311,0xdc02,0x53,0x326,0xdc02,0x73,0x326,0xdc02,0x54,0x326,0xdc02,0x74, -0x326,0xe602,0x48,0x30c,0xe602,0x68,0x30c,0xd6,0xe643,0x4f,0x308,0x304,0xf6,0xe643,0x6f,0x308, -0x304,0xd5,0xe643,0x4f,0x303,0x304,0xf5,0xe643,0x6f,0x303,0x304,0x22e,0xe643,0x4f,0x307,0x304, -0x22f,0xe643,0x6f,0x307,0x304,0xe602,0x59,0x304,0xe602,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391, -0x301,0xe602,0x395,0x301,0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301, -0xe602,0x3a9,0x301,0x3ca,0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5, -0x301,0xe602,0x3b9,0x301,0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602, -0x3d2,0x301,0xe602,0x3d2,0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406, -0x308,0xe602,0x41a,0x301,0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306, -0xe602,0x435,0x300,0xe602,0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602, -0x438,0x300,0xe602,0x443,0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436, -0x306,0xe602,0x410,0x306,0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306, -0xe602,0x435,0x306,0xe602,0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602, -0x417,0x308,0xe602,0x437,0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438, -0x308,0xe602,0x41e,0x308,0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308, -0xe602,0x44d,0x308,0xe602,0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602, -0x423,0x30b,0xe602,0x443,0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b, -0x308,0xe602,0x627,0x653,0xe602,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654, -0xe602,0x6d5,0x654,0xe602,0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702, -0x933,0x93c,2,0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47, -0xb57,2,0xb92,0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56, -2,0xcbf,0xcd5,2,0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46, -0xd3e,2,0xd47,0xd3e,2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2, -0xdd9,0xddf,2,0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b, -0x1b35,2,0x1b0d,0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35, -2,0x1b3f,0x1b35,2,0x1b42,0x1b35,0xdc02,0x41,0x325,0xdc02,0x61,0x325,0xe602,0x42,0x307,0xe602, -0x62,0x307,0xdc02,0x42,0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643, -0x43,0x327,0x301,0xe7,0xe643,0x63,0x327,0x301,0xe602,0x44,0x307,0xe602,0x64,0x307,0xdc02,0x44, -0x323,0xdc02,0x64,0x323,0xdc02,0x44,0x331,0xdc02,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327, -0xdc02,0x44,0x32d,0xdc02,0x64,0x32d,0x112,0xe643,0x45,0x304,0x300,0x113,0xe643,0x65,0x304,0x300, -0x112,0xe643,0x45,0x304,0x301,0x113,0xe643,0x65,0x304,0x301,0xdc02,0x45,0x32d,0xdc02,0x65,0x32d, -0xdc02,0x45,0x330,0xdc02,0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306, -0xe602,0x46,0x307,0xe602,0x66,0x307,0xe602,0x47,0x304,0xe602,0x67,0x304,0xe602,0x48,0x307,0xe602, -0x68,0x307,0xdc02,0x48,0x323,0xdc02,0x68,0x323,0xe602,0x48,0x308,0xe602,0x68,0x308,0xca02,0x48, -0x327,0xca02,0x68,0x327,0xdc02,0x48,0x32e,0xdc02,0x68,0x32e,0xdc02,0x49,0x330,0xdc02,0x69,0x330, -0xcf,0xe643,0x49,0x308,0x301,0xef,0xe643,0x69,0x308,0x301,0xe602,0x4b,0x301,0xe602,0x6b,0x301, -0xdc02,0x4b,0x323,0xdc02,0x6b,0x323,0xdc02,0x4b,0x331,0xdc02,0x6b,0x331,0x1e36,0xe643,0x4c,0x323, -0x304,0x1e37,0xe643,0x6c,0x323,0x304,0xdc02,0x4c,0x331,0xdc02,0x6c,0x331,0xdc02,0x4c,0x32d,0xdc02, -0x6c,0x32d,0xe602,0x4d,0x301,0xe602,0x6d,0x301,0xe602,0x4d,0x307,0xe602,0x6d,0x307,0xdc02,0x4d, -0x323,0xdc02,0x6d,0x323,0xe602,0x4e,0x307,0xe602,0x6e,0x307,0xdc02,0x4e,0x323,0xdc02,0x6e,0x323, -0xdc02,0x4e,0x331,0xdc02,0x6e,0x331,0xdc02,0x4e,0x32d,0xdc02,0x6e,0x32d,0xd5,0xe643,0x4f,0x303, -0x301,0xf5,0xe643,0x6f,0x303,0x301,0xd5,0xe643,0x4f,0x303,0x308,0xf5,0xe643,0x6f,0x303,0x308, -0x14c,0xe643,0x4f,0x304,0x300,0x14d,0xe643,0x6f,0x304,0x300,0x14c,0xe643,0x4f,0x304,0x301,0x14d, -0xe643,0x6f,0x304,0x301,0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307, -0xe602,0x52,0x307,0xe602,0x72,0x307,0x1e5a,0xe643,0x52,0x323,0x304,0x1e5b,0xe643,0x72,0x323,0x304, -0xdc02,0x52,0x331,0xdc02,0x72,0x331,0xe602,0x53,0x307,0xe602,0x73,0x307,0x15a,0xe643,0x53,0x301, -0x307,0x15b,0xe643,0x73,0x301,0x307,0x160,0xe643,0x53,0x30c,0x307,0x161,0xe643,0x73,0x30c,0x307, -0x1e62,0xe643,0x53,0x323,0x307,0x1e63,0xe643,0x73,0x323,0x307,0xe602,0x54,0x307,0xe602,0x74,0x307, -0xdc02,0x54,0x323,0xdc02,0x74,0x323,0xdc02,0x54,0x331,0xdc02,0x74,0x331,0xdc02,0x54,0x32d,0xdc02, -0x74,0x32d,0xdc02,0x55,0x324,0xdc02,0x75,0x324,0xdc02,0x55,0x330,0xdc02,0x75,0x330,0xdc02,0x55, -0x32d,0xdc02,0x75,0x32d,0x168,0xe643,0x55,0x303,0x301,0x169,0xe643,0x75,0x303,0x301,0x16a,0xe643, -0x55,0x304,0x308,0x16b,0xe643,0x75,0x304,0x308,0xe602,0x56,0x303,0xe602,0x76,0x303,0xdc02,0x56, -0x323,0xdc02,0x76,0x323,0xe602,0x57,0x300,0xe602,0x77,0x300,0xe602,0x57,0x301,0xe602,0x77,0x301, -0xe602,0x57,0x308,0xe602,0x77,0x308,0xe602,0x57,0x307,0xe602,0x77,0x307,0xdc02,0x57,0x323,0xdc02, -0x77,0x323,0xe602,0x58,0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe602,0x59, -0x307,0xe602,0x79,0x307,0xe602,0x5a,0x302,0xe602,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323, -0xdc02,0x5a,0x331,0xdc02,0x7a,0x331,0xdc02,0x68,0x331,0xe602,0x74,0x308,0xe602,0x77,0x30a,0xe602, -0x79,0x30a,0xe602,0x17f,0x307,0xe602,0x41,0x309,0xe602,0x61,0x309,0xc2,0xe643,0x41,0x302,0x301, -0xe2,0xe643,0x61,0x302,0x301,0xc2,0xe643,0x41,0x302,0x300,0xe2,0xe643,0x61,0x302,0x300,0xc2, -0xe643,0x41,0x302,0x309,0xe2,0xe643,0x61,0x302,0x309,0xc2,0xe643,0x41,0x302,0x303,0xe2,0xe643, -0x61,0x302,0x303,0x1ea0,0xe643,0x41,0x323,0x302,0x1ea1,0xe643,0x61,0x323,0x302,0x102,0xe643,0x41, -0x306,0x301,0x103,0xe643,0x61,0x306,0x301,0x102,0xe643,0x41,0x306,0x300,0x103,0xe643,0x61,0x306, -0x300,0x102,0xe643,0x41,0x306,0x309,0x103,0xe643,0x61,0x306,0x309,0x102,0xe643,0x41,0x306,0x303, -0x103,0xe643,0x61,0x306,0x303,0x1ea0,0xe643,0x41,0x323,0x306,0x1ea1,0xe643,0x61,0x323,0x306,0xe602, -0x45,0x309,0xe602,0x65,0x309,0xe602,0x45,0x303,0xe602,0x65,0x303,0xca,0xe643,0x45,0x302,0x301, -0xea,0xe643,0x65,0x302,0x301,0xca,0xe643,0x45,0x302,0x300,0xea,0xe643,0x65,0x302,0x300,0xca, -0xe643,0x45,0x302,0x309,0xea,0xe643,0x65,0x302,0x309,0xca,0xe643,0x45,0x302,0x303,0xea,0xe643, -0x65,0x302,0x303,0x1eb8,0xe643,0x45,0x323,0x302,0x1eb9,0xe643,0x65,0x323,0x302,0xe602,0x49,0x309, -0xe602,0x69,0x309,0xdc02,0x49,0x323,0xdc02,0x69,0x323,0xe602,0x4f,0x309,0xe602,0x6f,0x309,0xd4, -0xe643,0x4f,0x302,0x301,0xf4,0xe643,0x6f,0x302,0x301,0xd4,0xe643,0x4f,0x302,0x300,0xf4,0xe643, -0x6f,0x302,0x300,0xd4,0xe643,0x4f,0x302,0x309,0xf4,0xe643,0x6f,0x302,0x309,0xd4,0xe643,0x4f, -0x302,0x303,0xf4,0xe643,0x6f,0x302,0x303,0x1ecc,0xe643,0x4f,0x323,0x302,0x1ecd,0xe643,0x6f,0x323, -0x302,0x1a0,0xe643,0x4f,0x31b,0x301,0x1a1,0xe643,0x6f,0x31b,0x301,0x1a0,0xe643,0x4f,0x31b,0x300, -0x1a1,0xe643,0x6f,0x31b,0x300,0x1a0,0xe643,0x4f,0x31b,0x309,0x1a1,0xe643,0x6f,0x31b,0x309,0x1a0, -0xe643,0x4f,0x31b,0x303,0x1a1,0xe643,0x6f,0x31b,0x303,0x1a0,0xdc43,0x4f,0x31b,0x323,0x1a1,0xdc43, -0x6f,0x31b,0x323,0xdc02,0x55,0x323,0xdc02,0x75,0x323,0xe602,0x55,0x309,0xe602,0x75,0x309,0x1af, -0xe643,0x55,0x31b,0x301,0x1b0,0xe643,0x75,0x31b,0x301,0x1af,0xe643,0x55,0x31b,0x300,0x1b0,0xe643, -0x75,0x31b,0x300,0x1af,0xe643,0x55,0x31b,0x309,0x1b0,0xe643,0x75,0x31b,0x309,0x1af,0xe643,0x55, -0x31b,0x303,0x1b0,0xe643,0x75,0x31b,0x303,0x1af,0xdc43,0x55,0x31b,0x323,0x1b0,0xdc43,0x75,0x31b, -0x323,0xe602,0x59,0x300,0xe602,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe602,0x59,0x309, -0xe602,0x79,0x309,0xe602,0x59,0x303,0xe602,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643, -0x3b5,0x314,0x300,0x1f10,0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395, -0x313,0x300,0x1f19,0xe643,0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314, -0x301,0x1f30,0xe643,0x3b9,0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301, -0x1f31,0xe643,0x3b9,0x314,0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38, -0xe643,0x399,0x313,0x300,0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643, -0x399,0x314,0x301,0x1f38,0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf, -0x313,0x300,0x1f41,0xe643,0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314, -0x301,0x1f48,0xe643,0x39f,0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301, -0x1f49,0xe643,0x39f,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50, -0xe643,0x3c5,0x313,0x301,0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643, -0x3c5,0x314,0x342,0x1f59,0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5, -0x314,0x342,0xe602,0x3b5,0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf043, -0x3b1,0x313,0x345,0x1f01,0xf043,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345, -0x1f03,0x345,2,0xf044,0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345, -0x1f05,0x345,2,0xf044,0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345, -0x1f07,0x345,2,0xf044,0x3b1,0x314,0x342,0x345,0x1f08,0xf043,0x391,0x313,0x345,0x1f09,0xf043,0x391, -0x314,0x345,0x1f0a,0x345,2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314, -0x300,0x345,0x1f0c,0x345,2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314, -0x301,0x345,0x1f0e,0x345,2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314, -0x342,0x345,0x1f20,0xf043,0x3b7,0x313,0x345,0x1f21,0xf043,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044, -0x3b7,0x313,0x300,0x345,0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044, -0x3b7,0x313,0x301,0x345,0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044, -0x3b7,0x313,0x342,0x345,0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf043,0x397,0x313, -0x345,0x1f29,0xf043,0x397,0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345, -2,0xf044,0x397,0x314,0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345, -2,0xf044,0x397,0x314,0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345, -2,0xf044,0x397,0x314,0x342,0x345,0x1f60,0xf043,0x3c9,0x313,0x345,0x1f61,0xf043,0x3c9,0x314,0x345, -0x1f62,0x345,2,0xf044,0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345, -0x1f64,0x345,2,0xf044,0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345, -0x1f66,0x345,2,0xf044,0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345, -0x1f68,0xf043,0x3a9,0x313,0x345,0x1f69,0xf043,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313, -0x300,0x345,0x1f6b,0x345,2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313, -0x301,0x345,0x1f6d,0x345,2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313, -0x342,0x345,0x1f6f,0x345,2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304, -0x1f70,0xf043,0x3b1,0x300,0x345,0xf002,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1, -0x342,0x345,0xe602,0x391,0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf002,0x391,0x345,0xe602,0xa8, -0x342,0x1f74,0xf043,0x3b7,0x300,0x345,0xf002,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043, -0x3b7,0x342,0x345,0xe602,0x395,0x300,0xe602,0x397,0x300,0xf002,0x397,0x345,0xe602,0x1fbf,0x300,0xe602, -0x1fbf,0x301,0xe602,0x1fbf,0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300, -0xe602,0x3b9,0x342,0x3ca,0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399, -0x300,0xe602,0x1ffe,0x300,0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304, -0x3cb,0xe643,0x3c5,0x308,0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643, -0x3c5,0x308,0x342,0xe602,0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602, -0xa8,0x300,0x1f7c,0xf043,0x3c9,0x300,0x345,0xf002,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6, -0xf043,0x3c9,0x342,0x345,0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf002,0x3a9,0x345,0x102,0x2190,0x338, -0x102,0x2192,0x338,0x102,0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102, -0x2203,0x338,0x102,0x2208,0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c, -0x338,0x102,0x2243,0x338,0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338, -0x102,0x224d,0x338,0x102,0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102, -0x2272,0x338,0x102,0x2273,0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b, -0x338,0x102,0x2282,0x338,0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338, -0x102,0x22a8,0x338,0x102,0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102, -0x2291,0x338,0x102,0x2292,0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5, -0x338,0x802,0x304b,0x3099,0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099, -0x802,0x3055,0x3099,0x802,0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802, -0x305f,0x3099,0x802,0x3061,0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f, -0x3099,0x802,0x306f,0x309a,0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a, -0x802,0x3078,0x3099,0x802,0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802, -0x309d,0x3099,0x802,0x30ab,0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3, -0x3099,0x802,0x30b5,0x3099,0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099, -0x802,0x30bf,0x3099,0x802,0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802, -0x30cf,0x3099,0x802,0x30cf,0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5, -0x309a,0x802,0x30d8,0x3099,0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099, -0x802,0x30ef,0x3099,0x802,0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704, -0xd804,0xdc99,0xd804,0xdcba,0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804, -0xdd31,0xd804,0xdd27,4,0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47, -0xd804,0xdf57,4,0xd805,0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805, -0xdcbd,4,0xd805,0xddb8,0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,4,0xd806,0xdd35,0xd806,0xdd30, -1,0x2b9,1,0x3b,1,0xb7,0x702,0x915,0x93c,0x702,0x916,0x93c,0x702,0x917,0x93c,0x702, -0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c,0x702,0x92b,0x93c,0x702,0x92f,0x93c,0x702,0x9a1, -0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702,0xa32,0xa3c,0x702,0xa38,0xa3c,0x702,0xa16,0xa3c, -0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b,0xa3c,0x702,0xb21,0xb3c,0x702,0xb22,0xb3c,2, -0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,2,0xf5b,0xfb7,2,0xf40, -0xfb5,0x8202,0xfb2,0xf80,0x8202,0xfb3,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7, -2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,1,0x3b9,1,0x60,1,0xb4,1, -0x3a9,1,0x4b,1,0x3008,1,0x3009,0x102,0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca, -1,0x8cc8,1,0x6ed1,1,0x4e32,1,0x53e5,1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587, -1,0x5948,1,0x61f6,1,0x7669,1,0x7f85,1,0x863f,1,0x87ba,1,0x88f8,1,0x908f, -1,0x6a02,1,0x6d1b,1,0x70d9,1,0x73de,1,0x843d,1,0x916a,1,0x99f1,1,0x4e82, -1,0x5375,1,0x6b04,1,0x721b,1,0x862d,1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd, -1,0x8964,1,0x62c9,1,0x81d8,1,0x881f,1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc, -1,0x90ce,1,0x4f86,1,0x51b7,1,0x52de,1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7, -1,0x8001,1,0x8606,1,0x865c,1,0x8def,1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c, -1,0x797f,1,0x7da0,1,0x83c9,1,0x9304,1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04, -1,0x7c60,1,0x807e,1,0x7262,1,0x78ca,1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62, -1,0x6a13,1,0x6dda,1,0x6f0f,1,0x7d2f,1,0x7e37,1,0x964b,1,0x52d2,1,0x808b, -1,0x51dc,1,0x51cc,1,0x7a1c,1,0x7dbe,1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf, -1,0x8afe,1,0x4e39,1,0x5be7,1,0x6012,1,0x7387,1,0x7570,1,0x5317,1,0x78fb, -1,0x4fbf,1,0x5fa9,1,0x4e0d,1,0x6ccc,1,0x6578,1,0x7d22,1,0x53c3,1,0x585e, -1,0x7701,1,0x8449,1,0x8aaa,1,0x6bba,1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5, -1,0x63a0,1,0x7565,1,0x4eae,1,0x5169,1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f, -1,0x8ad2,1,0x91cf,1,0x52f5,1,0x5442,1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe, -1,0x792a,1,0x95ad,1,0x9a6a,1,0x9e97,1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77, -1,0x8f62,1,0x5e74,1,0x6190,1,0x6200,1,0x649a,1,0x6f23,1,0x7149,1,0x7489, -1,0x79ca,1,0x7df4,1,0x806f,1,0x8f26,1,0x84ee,1,0x9023,1,0x934a,1,0x5217, -1,0x52a3,1,0x54bd,1,0x70c8,1,0x88c2,1,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae, -1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9,1,0x5dba,1,0x601c,1,0x73b2,1,0x7469, -1,0x7f9a,1,0x8046,1,0x9234,1,0x96f6,1,0x9748,1,0x9818,1,0x4f8b,1,0x79ae, -1,0x91b4,1,0x96b8,1,0x60e1,1,0x4e86,1,0x50da,1,0x5bee,1,0x5c3f,1,0x6599, -1,0x71ce,1,0x7642,1,0x84fc,1,0x907c,1,0x9f8d,1,0x6688,1,0x962e,1,0x5289, -1,0x677b,1,0x67f3,1,0x6d41,1,0x6e9c,1,0x7409,1,0x7559,1,0x786b,1,0x7d10, -1,0x985e,1,0x516d,1,0x622e,1,0x9678,1,0x502b,1,0x5d19,1,0x6dea,1,0x8f2a, -1,0x5f8b,1,0x6144,1,0x6817,1,0x9686,1,0x5229,1,0x540f,1,0x5c65,1,0x6613, -1,0x674e,1,0x68a8,1,0x6ce5,1,0x7406,1,0x75e2,1,0x7f79,1,0x88cf,1,0x88e1, -1,0x91cc,1,0x96e2,1,0x533f,1,0x6eba,1,0x541d,1,0x71d0,1,0x7498,1,0x85fa, -1,0x96a3,1,0x9c57,1,0x9e9f,1,0x6797,1,0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20, -1,0x7c92,1,0x72c0,1,0x7099,1,0x8b58,1,0x4ec0,1,0x8336,1,0x523a,1,0x5207, -1,0x5ea6,1,0x62d3,1,0x7cd6,1,0x5b85,1,0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c, -1,0x964d,1,0x898b,1,0x5ed3,1,0x5140,1,0x55c0,1,0x585a,1,0x6674,1,0x51de, -1,0x732a,1,0x76ca,1,0x793c,1,0x795e,1,0x7965,1,0x798f,1,0x9756,1,0x7cbe, -1,0x7fbd,1,0x8612,1,0x8af8,1,0x9038,1,0x90fd,1,0x98ef,1,0x98fc,1,0x9928, -1,0x9db4,1,0x90de,1,0x96b7,1,0x4fae,1,0x50e7,1,0x514d,1,0x52c9,1,0x52e4, -1,0x5351,1,0x559d,1,0x5606,1,0x5668,1,0x5840,1,0x58a8,1,0x5c64,1,0x5c6e, -1,0x6094,1,0x6168,1,0x618e,1,0x61f2,1,0x654f,1,0x65e2,1,0x6691,1,0x6885, -1,0x6d77,1,0x6e1a,1,0x6f22,1,0x716e,1,0x722b,1,0x7422,1,0x7891,1,0x793e, -1,0x7949,1,0x7948,1,0x7950,1,0x7956,1,0x795d,1,0x798d,1,0x798e,1,0x7a40, -1,0x7a81,1,0x7bc0,1,0x7e09,1,0x7e41,1,0x7f72,1,0x8005,1,0x81ed,1,0x8279, -1,0x8457,1,0x8910,1,0x8996,1,0x8b01,1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6, -1,0x96e3,1,0x97ff,1,0x983b,1,0x6075,2,0xd850,0xdeee,1,0x8218,1,0x4e26,1, -0x51b5,1,0x5168,1,0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,0x5555,1, -0x5599,1,0x55e2,1,0x58b3,1,0x5944,1,0x5954,1,0x5a62,1,0x5b28,1,0x5ed2,1, -0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1,0x614e,1,0x6108,1,0x6160,1,0x6234,1, -0x63c4,1,0x641c,1,0x6452,1,0x6556,1,0x671b,1,0x6756,1,0x6b79,1,0x6edb,1, -0x6ecb,1,0x701e,1,0x77a7,1,0x7235,1,0x72af,1,0x7471,1,0x7506,1,0x753b,1, -0x761d,1,0x761f,1,0x76db,1,0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1, -0x7c7b,1,0x7d5b,1,0x7f3e,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1, -0x8abf,1,0x8acb,1,0x8aed,1,0x8b8a,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1, -0x967c,1,0x97db,1,0x980b,1,0x9b12,2,0xd84a,0xdc4a,2,0xd84a,0xdc44,2,0xd84c,0xdfd5, -1,0x3b9d,1,0x4018,1,0x4039,2,0xd854,0xde49,2,0xd857,0xdcd0,2,0xd85f,0xded3,1, -0x9f43,1,0x9f8e,0xe02,0x5d9,0x5b4,0x1102,0x5f2,0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49, -0x1843,0x5e9,0x5bc,0x5c1,0xfb49,0x1943,0x5e9,0x5bc,0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502, -0x5d0,0x5bc,0x1502,0x5d1,0x5bc,0x1502,0x5d2,0x5bc,0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5, -0x5bc,0x1502,0x5d6,0x5bc,0x1502,0x5d8,0x5bc,0x1502,0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc, -0x1502,0x5dc,0x5bc,0x1502,0x5de,0x5bc,0x1502,0x5e0,0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502, -0x5e4,0x5bc,0x1502,0x5e6,0x5bc,0x1502,0x5e7,0x5bc,0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea, -0x5bc,0x1302,0x5d5,0x5b9,0x1702,0x5d1,0x5bf,0x1702,0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57, -0xd834,0xdd65,0xd804,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd6e,0xd834,0xdd5f,0xd834,0xdd6f,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834, -0xdd5f,0xd834,0xdd70,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4, -0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0xd834,0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd72,0xd804,0xd834,0xddb9,0xd834,0xdd65,0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834, -0xdd6e,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834, -0xddba,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbb,0xd834,0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834, -0xdd6f,0xd834,0xddbc,0xd834,0xdd6f,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1, -0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60,1,0x4fbb,1,0x5002,1,0x507a,1,0x5099, -1,0x50cf,1,0x349e,2,0xd841,0xde3a,1,0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c, -1,0x34b9,1,0x5167,1,0x518d,2,0xd841,0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1, -0x51ac,2,0xd864,0xdddf,1,0x51f5,1,0x5203,1,0x34df,1,0x523b,1,0x5246,1,0x5272, -1,0x5277,1,0x3515,1,0x5305,1,0x5306,1,0x5349,1,0x535a,1,0x5373,1,0x537d, -1,0x537f,2,0xd842,0xde2c,1,0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb, -1,0x53f1,1,0x5406,1,0x549e,1,0x5438,1,0x5448,1,0x5468,1,0x54a2,1,0x54f6, -1,0x5510,1,0x5553,1,0x5563,1,0x5584,1,0x55ab,1,0x55b3,1,0x55c2,1,0x5716, -1,0x5717,1,0x5651,1,0x5674,1,0x58ee,1,0x57ce,1,0x57f4,1,0x580d,1,0x578b, -1,0x5832,1,0x5831,1,0x58ac,2,0xd845,0xdce4,1,0x58f2,1,0x58f7,1,0x5906,1, -0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8,2,0xd845,0xdeea,1,0x59ec,1,0x5a1b,1, -0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1,0x36fc,1,0x5b08,1,0x5b3e,2,0xd846,0xddc8, -1,0x5bc3,1,0x5bd8,1,0x5bf3,2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1, -0x5c22,1,0x3781,1,0x5c60,1,0x5cc0,1,0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847, -0xdde6,1,0x5d6e,1,0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1, -0x5e28,1,0x5e3d,1,0x5e69,1,0x3862,2,0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3, -1,0x5eb6,2,0xd868,0xdf92,1,0x5efe,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x38c7, -2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd, -1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a,1,0x391c,2,0xd849,0xded4,1,0x60c7,1, -0x6148,1,0x614c,1,0x617a,1,0x61b2,1,0x61a4,1,0x61af,1,0x61de,1,0x6210,1, -0x621b,1,0x625d,1,0x62b1,1,0x62d4,1,0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc, -1,0x6368,1,0x6383,1,0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1, -0x3a2e,1,0x6469,1,0x647e,1,0x649d,1,0x6477,1,0x3a6c,1,0x656c,2,0xd84c,0xdc0a, -1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19,1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195, -1,0x6700,1,0x669c,1,0x80ad,1,0x43d9,1,0x6721,1,0x675e,1,0x6753,2,0xd84c, -0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1,0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f, -1,0x6914,1,0x6942,1,0x69a3,1,0x69ea,1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1, -0x3c18,1,0x6b21,2,0xd84e,0xdca7,1,0x6b54,1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bbb, -2,0xd84e,0xde8d,2,0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf, -1,0x6ccd,1,0x6c67,1,0x6d16,1,0x6d3e,1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f, -0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9, -1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1,0x701b,1,0x3d96, -1,0x704a,1,0x707d,1,0x7077,1,0x70ad,2,0xd841,0xdd25,1,0x7145,2,0xd850,0xde63, -1,0x719c,2,0xd850,0xdfab,1,0x7228,1,0x7250,2,0xd851,0xde08,1,0x7280,1,0x7295, -2,0xd851,0xdf35,2,0xd852,0xdc14,1,0x737a,1,0x738b,1,0x3eac,1,0x73a5,1,0x3eb8, -1,0x7447,1,0x745c,1,0x7485,1,0x74ca,1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1, -0x753e,2,0xd853,0xdc92,2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2, -0xd854,0xdc44,1,0x3ffc,1,0x4008,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2, -0xd854,0xdd33,1,0x771e,1,0x771f,1,0x778b,1,0x4046,1,0x4096,2,0xd855,0xdc1d,1, -0x784e,1,0x40e3,2,0xd855,0xde26,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f, -1,0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2,0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856, -0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8, -1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1, -0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a, -2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,2,0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2, -0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1,0x8103,1,0x440b,1, -0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1, -0x8204,1,0x8f9e,1,0x446b,1,0x8291,1,0x828b,1,0x829d,1,0x52b3,1,0x82b1,1, -0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c,1,0x831d,1,0x8363,1,0x83ad,1,0x8323, -1,0x83bd,1,0x83e7,1,0x8353,1,0x83ca,1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2, -0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,0x452b,1,0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca, -1,0x8564,2,0xd85b,0xdf2c,1,0x455d,1,0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1, -0x456b,1,0x8650,1,0x8667,1,0x8669,1,0x86a9,1,0x8688,1,0x870e,1,0x86e2,1, -0x8728,1,0x876b,1,0x8786,1,0x45d7,1,0x87e1,1,0x8801,1,0x45f9,1,0x8860,1, -0x8863,2,0xd85d,0xde67,1,0x88d7,1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e, -0xdcae,2,0xd85e,0xdd66,1,0x46be,1,0x46c7,1,0x8aa0,1,0x8c55,2,0xd85f,0xdca8,1, -0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1, -0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4,2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094, -1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1,0x911b,1,0x9238,1,0x92d7,1,0x92d8,1, -0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995,1,0x95b7,2,0xd863, -0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1, -0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865,0xdc96,1,0x9829,2, -0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929,1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce, -2,0xd866,0xdf30,1,0x9c40,1,0x9cfd,1,0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce, -1,0x4cf8,2,0xd868,0xdd05,2,0xd868,0xde0e,2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1, -0x9ef9,1,0x9efe,1,0x9f05,1,0x9f0f,1,0x9f16,1,0x9f3b,2,0xd869,0xde00,0x3ac,0xe642, -0x3b1,0x301,0x3ad,0xe642,0x3b5,0x301,0x3ae,0xe642,0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642, -0x3bf,0x301,0x3cd,0xe642,0x3c5,0x301,0x3ce,0xe642,0x3c9,0x301,0x386,0xe642,0x391,0x301,0x388,0xe642, -0x395,0x301,0x389,0xe642,0x397,0x301,0x390,1,0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301, -0x3b0,1,0xe643,0x3c5,0x308,0x301,0x38e,0xe642,0x3a5,0x301,0x385,0xe642,0xa8,0x301,0x38c,0xe642, -0x39f,0x301,0x38f,0xe642,0x3a9,0x301,0xc5,0xe642,0x41,0x30a,0xe6e6,0xe681,0x300,0xe6e6,0xe681,0x301, -0xe6e6,0xe681,0x313,0xe6e6,0xe682,0x308,0x301,0x8100,0x8282,0xf71,0xf72,0x8100,0x8482,0xf71,0xf74,0x8100, -0x8282,0xf71,0xf80,0 +0xe132,0x61ee,0xe132,0x61f0,0xe132,0x61f2,0xe132,0x61f4,0xe132,0x61fc,0x860f,2,0xb92,0x860f,2,0xbc8, +0xb489,0x2e82,0x2134,0xb489,0x2e82,0x2138,0xb489,0x2e82,0x2156,0xb489,0x49c2,0x225c,0xb489,0x49c2,0x225e,0x3489, +0xcf82,0x2696,0xb489,0xd5c2,0x2698,0xb489,0xf242,0x2706,0xb489,0xeec2,0x270a,0xb489,0xf082,0x271c,0xb489,0xf242, +0x2722,0x348b,0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76, +0xb48d,0x4c02,0x3270,0xb4b7,0x59c2,0xdad3,2,0xe602,0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54, +0x8612,0x3d50,0xe602,0x41,0x308,0x8608,0x3bc,0xe602,0x41,0x30a,0x8602,0x3f4,0xca02,0x43,0x327,0x8602, +0x3c10,0xe602,0x45,0x302,0x600,0x3d80,0x602,0x3d7c,0x606,0x3d88,0x8612,0x3d84,0xe602,0x49,0x308,0x8602, +0x3c5c,0xe602,0x4f,0x302,0x600,0x3da4,0x602,0x3da0,0x606,0x3dac,0x8612,0x3da8,0xe602,0x4f,0x303,0x602, +0x3c98,0x608,0x458,0x8610,0x3c9c,0xe602,0x4f,0x308,0x8608,0x454,0xe602,0x55,0x308,0x600,0x3b6,0x602, +0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe602,0x61,0x302,0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52, +0xe602,0x61,0x308,0x8608,0x3be,0xe602,0x61,0x30a,0x8602,0x3f6,0xca02,0x63,0x327,0x8602,0x3c12,0xe602, +0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a,0x8612,0x3d86,0xe602,0x69,0x308,0x8602,0x3c5e,0xe602, +0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae,0x8612,0x3daa,0xe602,0x6f,0x303,0x602,0x3c9a,0x608, +0x45a,0x8610,0x3c9e,0xe602,0x6f,0x308,0x8608,0x456,0xe602,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608, +0x3ac,0x8618,0x3b4,0xe602,0x41,0x306,0x600,0x3d60,0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe602,0x61, +0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612,0x3d66,0xe602,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c, +0xe602,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe602,0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe602,0x6f, +0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe602,0x53,0x301,0x860e,0x3cc8,0xe602,0x73,0x301,0x860e,0x3cca,0xe602, +0x53,0x30c,0x860e,0x3ccc,0xe602,0x73,0x30c,0x860e,0x3cce,0xe602,0x55,0x303,0x8602,0x3cf0,0xe602,0x75, +0x303,0x8602,0x3cf2,0xe602,0x55,0x304,0x8610,0x3cf4,0xe602,0x75,0x304,0x8610,0x3cf6,0xd802,0x4f,0x31b, +0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc,0x8646,0x3dc4,0xd802,0x6f,0x31b,0x600,0x3dba,0x602, +0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd802,0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc, +0x612,0x3dd8,0x8646,0x3de0,0xd802,0x75,0x31b,0x600,0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646, +0x3de2,0xca02,0x4f,0x328,0x8608,0x3d8,0xca02,0x6f,0x328,0x8608,0x3da,0xe602,0x41,0x307,0x8608,0x3c0, +0xe602,0x61,0x307,0x8608,0x3c2,0xca02,0x45,0x327,0x860c,0x3c38,0xca02,0x65,0x327,0x860c,0x3c3a,0xe602, +0x4f,0x307,0x8608,0x460,0xe602,0x6f,0x307,0x8608,0x462,0xe602,0x3b1,0x301,0x868a,0x3f68,0xe602,0x3b7, +0x301,0x868a,0x3f88,0xe602,0x3b9,0x308,0x600,0x3fa4,0x602,0x720,0x8684,0x3fae,0xe602,0x3c5,0x308,0x600, +0x3fc4,0x602,0x760,0x8684,0x3fce,0xe602,0x3c9,0x301,0x868a,0x3fe8,2,0xcc6,0xcc2,0x99aa,0x1996,2, +0xdd9,0xdcf,0x9b94,0x1bba,0xdc02,0x4c,0x323,0x8608,0x3c70,0xdc02,0x6c,0x323,0x8608,0x3c72,0xdc02,0x52, +0x323,0x8608,0x3cb8,0xdc02,0x72,0x323,0x8608,0x3cba,0xdc02,0x53,0x323,0x860e,0x3cd0,0xdc02,0x73,0x323, +0x860e,0x3cd2,0xdc02,0x41,0x323,0x604,0x3d58,0x860c,0x3d6c,0xdc02,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e, +0xdc02,0x45,0x323,0x8604,0x3d8c,0xdc02,0x65,0x323,0x8604,0x3d8e,0xdc02,0x4f,0x323,0x8604,0x3db0,0xdc02, +0x6f,0x323,0x8604,0x3db2,0xe602,0x3b1,0x313,0x600,0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe602, +0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f,0x868a,0x3f02,0x1f00,0xe643,0x3b1,0x313,0x300,0x868a, +0x3f04,0x1f01,0xe643,0x3b1,0x314,0x300,0x868a,0x3f06,0x1f00,0xe643,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01, +0xe643,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe643,0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe643,0x3b1, +0x314,0x342,0x868a,0x3f0e,0xe602,0x391,0x313,0x600,0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe602, +0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f,0x868a,0x3f12,0x1f08,0xe643,0x391,0x313,0x300,0x868a, +0x3f14,0x1f09,0xe643,0x391,0x314,0x300,0x868a,0x3f16,0x1f08,0xe643,0x391,0x313,0x301,0x868a,0x3f18,0x1f09, +0xe643,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe643,0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe643,0x391, +0x314,0x342,0x868a,0x3f1e,0xe602,0x3b5,0x313,0x600,0x3e24,0x8602,0x3e28,0xe602,0x3b5,0x314,0x600,0x3e26, +0x8602,0x3e2a,0xe602,0x395,0x313,0x600,0x3e34,0x8602,0x3e38,0xe602,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a, +0xe602,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684,0x3e4d,0x868a,0x3f20,0xe602,0x3b7,0x314,0x600,0x3e47, +0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe643,0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe643,0x3b7, +0x314,0x300,0x868a,0x3f26,0x1f20,0xe643,0x3b7,0x313,0x301,0x868a,0x3f28,0x1f21,0xe643,0x3b7,0x314,0x301, +0x868a,0x3f2a,0x1f20,0xe643,0x3b7,0x313,0x342,0x868a,0x3f2c,0x1f21,0xe643,0x3b7,0x314,0x342,0x868a,0x3f2e, +0xe602,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684,0x3e5d,0x868a,0x3f30,0xe602,0x397,0x314,0x600,0x3e57, +0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe643,0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe643,0x397, +0x314,0x300,0x868a,0x3f36,0x1f28,0xe643,0x397,0x313,0x301,0x868a,0x3f38,0x1f29,0xe643,0x397,0x314,0x301, +0x868a,0x3f3a,0x1f28,0xe643,0x397,0x313,0x342,0x868a,0x3f3c,0x1f29,0xe643,0x397,0x314,0x342,0x868a,0x3f3e, +0xe602,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684,0x3e6c,0xe602,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a, +0x8684,0x3e6e,0xe602,0x399,0x313,0x600,0x3e74,0x602,0x3e78,0x8684,0x3e7c,0xe602,0x399,0x314,0x600,0x3e76, +0x602,0x3e7a,0x8684,0x3e7e,0xe602,0x3bf,0x313,0x600,0x3e84,0x8602,0x3e88,0xe602,0x3bf,0x314,0x600,0x3e86, +0x8602,0x3e8a,0xe602,0x39f,0x313,0x600,0x3e94,0x8602,0x3e98,0xe602,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a, +0xe602,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684,0x3eac,0xe602,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa, +0x8684,0x3eae,0xe602,0x3a5,0x314,0x600,0x3eb6,0x602,0x3eba,0x8684,0x3ebe,0xe602,0x3c9,0x313,0x600,0x3ec5, +0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe602,0x3c9,0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a, +0x3f42,0x1f60,0xe643,0x3c9,0x313,0x300,0x868a,0x3f44,0x1f61,0xe643,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60, +0xe643,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe643,0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe643,0x3c9, +0x313,0x342,0x868a,0x3f4c,0x1f61,0xe643,0x3c9,0x314,0x342,0x868a,0x3f4e,0xe602,0x3a9,0x313,0x600,0x3ed5, +0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe602,0x3a9,0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a, +0x3f52,0x1f68,0xe643,0x3a9,0x313,0x300,0x868a,0x3f54,0x1f69,0xe643,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68, +0xe643,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe643,0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe643,0x3a9, +0x313,0x342,0x868a,0x3f5c,0x1f69,0xe643,0x3a9,0x314,0x342,0x868a,0x3f5e,0xe602,0x3b1,0x300,0x868a,0x3f64, +0xe602,0x3b7,0x300,0x868a,0x3f84,0xe602,0x3c9,0x300,0x868a,0x3fe4,0xe602,0x3b1,0x342,0x868a,0x3f6e,0xe602, +0x3b7,0x342,0x868a,0x3f8e,0xe602,0x3c9,0x342,0x868a,0x3fee,4,0xd81b,0xdd63,0xd81b,0xdd67,0xb4b7,0x59c2, +0xdad4,3,0xe602,0x41,0x300,0xe602,0x41,0x301,0xe602,0x41,0x303,0xe602,0x45,0x300,0xe602,0x45, +0x301,0xe602,0x45,0x308,0xe602,0x49,0x300,0xe602,0x49,0x301,0xe602,0x49,0x302,0xe602,0x4e,0x303, +0xe602,0x4f,0x300,0xe602,0x4f,0x301,0xe602,0x55,0x300,0xe602,0x55,0x301,0xe602,0x55,0x302,0xe602, +0x59,0x301,0xe602,0x61,0x300,0xe602,0x61,0x301,0xe602,0x61,0x303,0xe602,0x65,0x300,0xe602,0x65, +0x301,0xe602,0x65,0x308,0xe602,0x69,0x300,0xe602,0x69,0x301,0xe602,0x69,0x302,0xe602,0x6e,0x303, +0xe602,0x6f,0x300,0xe602,0x6f,0x301,0xe602,0x75,0x300,0xe602,0x75,0x301,0xe602,0x75,0x302,0xe602, +0x79,0x301,0xe602,0x79,0x308,0xe602,0x41,0x304,0xe602,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61, +0x328,0xe602,0x43,0x301,0xe602,0x63,0x301,0xe602,0x43,0x302,0xe602,0x63,0x302,0xe602,0x43,0x307, +0xe602,0x63,0x307,0xe602,0x43,0x30c,0xe602,0x63,0x30c,0xe602,0x44,0x30c,0xe602,0x64,0x30c,0xe602, +0x45,0x306,0xe602,0x65,0x306,0xe602,0x45,0x307,0xe602,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65, +0x328,0xe602,0x45,0x30c,0xe602,0x65,0x30c,0xe602,0x47,0x302,0xe602,0x67,0x302,0xe602,0x47,0x306, +0xe602,0x67,0x306,0xe602,0x47,0x307,0xe602,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe602, +0x48,0x302,0xe602,0x68,0x302,0xe602,0x49,0x303,0xe602,0x69,0x303,0xe602,0x49,0x304,0xe602,0x69, +0x304,0xe602,0x49,0x306,0xe602,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe602,0x49,0x307, +0xe602,0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe602,0x4c,0x301,0xe602, +0x6c,0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe602,0x4c,0x30c,0xe602,0x6c,0x30c,0xe602,0x4e, +0x301,0xe602,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe602,0x4e,0x30c,0xe602,0x6e,0x30c, +0xe602,0x4f,0x306,0xe602,0x6f,0x306,0xe602,0x4f,0x30b,0xe602,0x6f,0x30b,0xe602,0x52,0x301,0xe602, +0x72,0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe602,0x52,0x30c,0xe602,0x72,0x30c,0xe602,0x53, +0x302,0xe602,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327, +0xe602,0x54,0x30c,0xe602,0x74,0x30c,0xe602,0x55,0x306,0xe602,0x75,0x306,0xe602,0x55,0x30a,0xe602, +0x75,0x30a,0xe602,0x55,0x30b,0xe602,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe602,0x57, +0x302,0xe602,0x77,0x302,0xe602,0x59,0x302,0xe602,0x79,0x302,0xe602,0x59,0x308,0xe602,0x5a,0x301, +0xe602,0x7a,0x301,0xe602,0x5a,0x307,0xe602,0x7a,0x307,0xe602,0x5a,0x30c,0xe602,0x7a,0x30c,0xe602, +0x41,0x30c,0xe602,0x61,0x30c,0xe602,0x49,0x30c,0xe602,0x69,0x30c,0xe602,0x4f,0x30c,0xe602,0x6f, +0x30c,0xe602,0x55,0x30c,0xe602,0x75,0x30c,0xdc,0xe643,0x55,0x308,0x304,0xfc,0xe643,0x75,0x308, +0x304,0xdc,0xe643,0x55,0x308,0x301,0xfc,0xe643,0x75,0x308,0x301,0xdc,0xe643,0x55,0x308,0x30c, +0xfc,0xe643,0x75,0x308,0x30c,0xdc,0xe643,0x55,0x308,0x300,0xfc,0xe643,0x75,0x308,0x300,0xc4, +0xe643,0x41,0x308,0x304,0xe4,0xe643,0x61,0x308,0x304,0x226,0xe643,0x41,0x307,0x304,0x227,0xe643, +0x61,0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe602,0x47,0x30c,0xe602,0x67,0x30c,0xe602, +0x4b,0x30c,0xe602,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602, +0x1b7,0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe602,0x47,0x301,0xe602,0x67,0x301,0xe602,0x4e, +0x300,0xe602,0x6e,0x300,0xc5,0xe643,0x41,0x30a,0x301,0xe5,0xe643,0x61,0x30a,0x301,0xe602,0xc6, +0x301,0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe602,0x41,0x30f,0xe602,0x61,0x30f, +0xe602,0x41,0x311,0xe602,0x61,0x311,0xe602,0x45,0x30f,0xe602,0x65,0x30f,0xe602,0x45,0x311,0xe602, +0x65,0x311,0xe602,0x49,0x30f,0xe602,0x69,0x30f,0xe602,0x49,0x311,0xe602,0x69,0x311,0xe602,0x4f, +0x30f,0xe602,0x6f,0x30f,0xe602,0x4f,0x311,0xe602,0x6f,0x311,0xe602,0x52,0x30f,0xe602,0x72,0x30f, +0xe602,0x52,0x311,0xe602,0x72,0x311,0xe602,0x55,0x30f,0xe602,0x75,0x30f,0xe602,0x55,0x311,0xe602, +0x75,0x311,0xdc02,0x53,0x326,0xdc02,0x73,0x326,0xdc02,0x54,0x326,0xdc02,0x74,0x326,0xe602,0x48, +0x30c,0xe602,0x68,0x30c,0xd6,0xe643,0x4f,0x308,0x304,0xf6,0xe643,0x6f,0x308,0x304,0xd5,0xe643, +0x4f,0x303,0x304,0xf5,0xe643,0x6f,0x303,0x304,0x22e,0xe643,0x4f,0x307,0x304,0x22f,0xe643,0x6f, +0x307,0x304,0xe602,0x59,0x304,0xe602,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395, +0x301,0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301, +0x3ca,0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9, +0x301,0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602, +0x3d2,0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a, +0x301,0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300, +0xe602,0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602, +0x443,0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410, +0x306,0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306, +0xe602,0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602, +0x437,0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e, +0x308,0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308, +0xe602,0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602, +0x443,0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe602,0x627, +0x653,0xe602,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654, +0xe602,0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,0x933,0x93c,2, +0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92, +0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5, +2,0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47, +0xd3e,2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2, +0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,0x1b0d, +0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,0x1b35, +2,0x1b42,0x1b35,0xdc02,0x41,0x325,0xdc02,0x61,0x325,0xe602,0x42,0x307,0xe602,0x62,0x307,0xdc02, +0x42,0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301, +0xe7,0xe643,0x63,0x327,0x301,0xe602,0x44,0x307,0xe602,0x64,0x307,0xdc02,0x44,0x323,0xdc02,0x64, +0x323,0xdc02,0x44,0x331,0xdc02,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc02,0x44,0x32d, +0xdc02,0x64,0x32d,0x112,0xe643,0x45,0x304,0x300,0x113,0xe643,0x65,0x304,0x300,0x112,0xe643,0x45, +0x304,0x301,0x113,0xe643,0x65,0x304,0x301,0xdc02,0x45,0x32d,0xdc02,0x65,0x32d,0xdc02,0x45,0x330, +0xdc02,0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307, +0xe602,0x66,0x307,0xe602,0x47,0x304,0xe602,0x67,0x304,0xe602,0x48,0x307,0xe602,0x68,0x307,0xdc02, +0x48,0x323,0xdc02,0x68,0x323,0xe602,0x48,0x308,0xe602,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68, +0x327,0xdc02,0x48,0x32e,0xdc02,0x68,0x32e,0xdc02,0x49,0x330,0xdc02,0x69,0x330,0xcf,0xe643,0x49, +0x308,0x301,0xef,0xe643,0x69,0x308,0x301,0xe602,0x4b,0x301,0xe602,0x6b,0x301,0xdc02,0x4b,0x323, +0xdc02,0x6b,0x323,0xdc02,0x4b,0x331,0xdc02,0x6b,0x331,0x1e36,0xe643,0x4c,0x323,0x304,0x1e37,0xe643, +0x6c,0x323,0x304,0xdc02,0x4c,0x331,0xdc02,0x6c,0x331,0xdc02,0x4c,0x32d,0xdc02,0x6c,0x32d,0xe602, +0x4d,0x301,0xe602,0x6d,0x301,0xe602,0x4d,0x307,0xe602,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d, +0x323,0xe602,0x4e,0x307,0xe602,0x6e,0x307,0xdc02,0x4e,0x323,0xdc02,0x6e,0x323,0xdc02,0x4e,0x331, +0xdc02,0x6e,0x331,0xdc02,0x4e,0x32d,0xdc02,0x6e,0x32d,0xd5,0xe643,0x4f,0x303,0x301,0xf5,0xe643, +0x6f,0x303,0x301,0xd5,0xe643,0x4f,0x303,0x308,0xf5,0xe643,0x6f,0x303,0x308,0x14c,0xe643,0x4f, +0x304,0x300,0x14d,0xe643,0x6f,0x304,0x300,0x14c,0xe643,0x4f,0x304,0x301,0x14d,0xe643,0x6f,0x304, +0x301,0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe602,0x52,0x307, +0xe602,0x72,0x307,0x1e5a,0xe643,0x52,0x323,0x304,0x1e5b,0xe643,0x72,0x323,0x304,0xdc02,0x52,0x331, +0xdc02,0x72,0x331,0xe602,0x53,0x307,0xe602,0x73,0x307,0x15a,0xe643,0x53,0x301,0x307,0x15b,0xe643, +0x73,0x301,0x307,0x160,0xe643,0x53,0x30c,0x307,0x161,0xe643,0x73,0x30c,0x307,0x1e62,0xe643,0x53, +0x323,0x307,0x1e63,0xe643,0x73,0x323,0x307,0xe602,0x54,0x307,0xe602,0x74,0x307,0xdc02,0x54,0x323, +0xdc02,0x74,0x323,0xdc02,0x54,0x331,0xdc02,0x74,0x331,0xdc02,0x54,0x32d,0xdc02,0x74,0x32d,0xdc02, +0x55,0x324,0xdc02,0x75,0x324,0xdc02,0x55,0x330,0xdc02,0x75,0x330,0xdc02,0x55,0x32d,0xdc02,0x75, +0x32d,0x168,0xe643,0x55,0x303,0x301,0x169,0xe643,0x75,0x303,0x301,0x16a,0xe643,0x55,0x304,0x308, +0x16b,0xe643,0x75,0x304,0x308,0xe602,0x56,0x303,0xe602,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76, +0x323,0xe602,0x57,0x300,0xe602,0x77,0x300,0xe602,0x57,0x301,0xe602,0x77,0x301,0xe602,0x57,0x308, +0xe602,0x77,0x308,0xe602,0x57,0x307,0xe602,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602, +0x58,0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe602,0x59,0x307,0xe602,0x79, +0x307,0xe602,0x5a,0x302,0xe602,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331, +0xdc02,0x7a,0x331,0xdc02,0x68,0x331,0xe602,0x74,0x308,0xe602,0x77,0x30a,0xe602,0x79,0x30a,0xe602, +0x17f,0x307,0xe602,0x41,0x309,0xe602,0x61,0x309,0xc2,0xe643,0x41,0x302,0x301,0xe2,0xe643,0x61, +0x302,0x301,0xc2,0xe643,0x41,0x302,0x300,0xe2,0xe643,0x61,0x302,0x300,0xc2,0xe643,0x41,0x302, +0x309,0xe2,0xe643,0x61,0x302,0x309,0xc2,0xe643,0x41,0x302,0x303,0xe2,0xe643,0x61,0x302,0x303, +0x1ea0,0xe643,0x41,0x323,0x302,0x1ea1,0xe643,0x61,0x323,0x302,0x102,0xe643,0x41,0x306,0x301,0x103, +0xe643,0x61,0x306,0x301,0x102,0xe643,0x41,0x306,0x300,0x103,0xe643,0x61,0x306,0x300,0x102,0xe643, +0x41,0x306,0x309,0x103,0xe643,0x61,0x306,0x309,0x102,0xe643,0x41,0x306,0x303,0x103,0xe643,0x61, +0x306,0x303,0x1ea0,0xe643,0x41,0x323,0x306,0x1ea1,0xe643,0x61,0x323,0x306,0xe602,0x45,0x309,0xe602, +0x65,0x309,0xe602,0x45,0x303,0xe602,0x65,0x303,0xca,0xe643,0x45,0x302,0x301,0xea,0xe643,0x65, +0x302,0x301,0xca,0xe643,0x45,0x302,0x300,0xea,0xe643,0x65,0x302,0x300,0xca,0xe643,0x45,0x302, +0x309,0xea,0xe643,0x65,0x302,0x309,0xca,0xe643,0x45,0x302,0x303,0xea,0xe643,0x65,0x302,0x303, +0x1eb8,0xe643,0x45,0x323,0x302,0x1eb9,0xe643,0x65,0x323,0x302,0xe602,0x49,0x309,0xe602,0x69,0x309, +0xdc02,0x49,0x323,0xdc02,0x69,0x323,0xe602,0x4f,0x309,0xe602,0x6f,0x309,0xd4,0xe643,0x4f,0x302, +0x301,0xf4,0xe643,0x6f,0x302,0x301,0xd4,0xe643,0x4f,0x302,0x300,0xf4,0xe643,0x6f,0x302,0x300, +0xd4,0xe643,0x4f,0x302,0x309,0xf4,0xe643,0x6f,0x302,0x309,0xd4,0xe643,0x4f,0x302,0x303,0xf4, +0xe643,0x6f,0x302,0x303,0x1ecc,0xe643,0x4f,0x323,0x302,0x1ecd,0xe643,0x6f,0x323,0x302,0x1a0,0xe643, +0x4f,0x31b,0x301,0x1a1,0xe643,0x6f,0x31b,0x301,0x1a0,0xe643,0x4f,0x31b,0x300,0x1a1,0xe643,0x6f, +0x31b,0x300,0x1a0,0xe643,0x4f,0x31b,0x309,0x1a1,0xe643,0x6f,0x31b,0x309,0x1a0,0xe643,0x4f,0x31b, +0x303,0x1a1,0xe643,0x6f,0x31b,0x303,0x1a0,0xdc43,0x4f,0x31b,0x323,0x1a1,0xdc43,0x6f,0x31b,0x323, +0xdc02,0x55,0x323,0xdc02,0x75,0x323,0xe602,0x55,0x309,0xe602,0x75,0x309,0x1af,0xe643,0x55,0x31b, +0x301,0x1b0,0xe643,0x75,0x31b,0x301,0x1af,0xe643,0x55,0x31b,0x300,0x1b0,0xe643,0x75,0x31b,0x300, +0x1af,0xe643,0x55,0x31b,0x309,0x1b0,0xe643,0x75,0x31b,0x309,0x1af,0xe643,0x55,0x31b,0x303,0x1b0, +0xe643,0x75,0x31b,0x303,0x1af,0xdc43,0x55,0x31b,0x323,0x1b0,0xdc43,0x75,0x31b,0x323,0xe602,0x59, +0x300,0xe602,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe602,0x59,0x309,0xe602,0x79,0x309, +0xe602,0x59,0x303,0xe602,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300, +0x1f10,0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19, +0xe643,0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643, +0x3b9,0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9, +0x314,0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313, +0x300,0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301, +0x1f38,0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41, +0xe643,0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643, +0x39f,0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f, +0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313, +0x301,0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342, +0x1f59,0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602, +0x3b5,0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf043,0x3b1,0x313,0x345, +0x1f01,0xf043,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2, +0xf044,0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2, +0xf044,0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2, +0xf044,0x3b1,0x314,0x342,0x345,0x1f08,0xf043,0x391,0x313,0x345,0x1f09,0xf043,0x391,0x314,0x345,0x1f0a, +0x345,2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c, +0x345,2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e, +0x345,2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20, +0xf043,0x3b7,0x313,0x345,0x1f21,0xf043,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300, +0x345,0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301, +0x345,0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342, +0x345,0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf043,0x397,0x313,0x345,0x1f29,0xf043, +0x397,0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397, +0x314,0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397, +0x314,0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397, +0x314,0x342,0x345,0x1f60,0xf043,0x3c9,0x313,0x345,0x1f61,0xf043,0x3c9,0x314,0x345,0x1f62,0x345,2, +0xf044,0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2, +0xf044,0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2, +0xf044,0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf043,0x3a9, +0x313,0x345,0x1f69,0xf043,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b, +0x345,2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d, +0x345,2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f, +0x345,2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1, +0x300,0x345,0xf002,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602, +0x391,0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf002,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043, +0x3b7,0x300,0x345,0xf002,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345, +0xe602,0x395,0x300,0xe602,0x397,0x300,0xf002,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602, +0x1fbf,0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342, +0x3ca,0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe, +0x300,0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5, +0x308,0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342, +0xe602,0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c, +0xf043,0x3c9,0x300,0x345,0xf002,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342, +0x345,0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf002,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338, +0x102,0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102, +0x2208,0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243, +0x338,0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338, +0x102,0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102, +0x2273,0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282, +0x338,0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338, +0x102,0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102, +0x2292,0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b, +0x3099,0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099, +0x802,0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802, +0x3061,0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f, +0x309a,0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099, +0x802,0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802, +0x30ab,0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5, +0x3099,0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099, +0x802,0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802, +0x30cf,0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8, +0x3099,0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099, +0x802,0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0xe603,0xd801,0xddd2,0x307, +0xe603,0xd801,0xddda,0x307,0x704,0xd804,0xdc99,0xd804,0xdcba,0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804, +0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27,4,0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47, +0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4,0xd804,0xdf82,0xd804,0xdfc9,4,0xd804,0xdf84,0xd804, +0xdfbb,4,0xd804,0xdf8b,0xd804,0xdfc2,4,0xd804,0xdf90,0xd804,0xdfc9,4,0xd805,0xdcb9,0xd805,0xdcba, +4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805,0xddb8,0xd805,0xddaf,4, +0xd805,0xddb9,0xd805,0xddaf,4,0xd806,0xdd35,0xd806,0xdd30,0xd81b,0xdd69,0xd81b,0xdd67,4,0x46,0xd81b, +0xdd63,0xd81b,0xdd67,0xd81b,0xdd67,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915,0x93c,0x702,0x916, +0x93c,0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c,0x702,0x92b,0x93c, +0x702,0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702,0xa32,0xa3c,0x702, +0xa38,0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b,0xa3c,0x702,0xb21, +0xb3c,0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7, +2,0xf5b,0xfb7,2,0xf40,0xfb5,0x8202,0xfb2,0xf80,0x8202,0xfb3,0xf80,2,0xf92,0xfb7,2, +0xf9c,0xfb7,2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,1,0x3b9, +1,0x60,1,0xb4,1,0x3a9,1,0x4b,1,0x3008,1,0x3009,0x102,0x2add,0x338,1, +0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1,1,0x4e32,1,0x53e5,1,0x9f9c,1, +0x5951,1,0x91d1,1,0x5587,1,0x5948,1,0x61f6,1,0x7669,1,0x7f85,1,0x863f,1, +0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,0x6d1b,1,0x70d9,1,0x73de,1,0x843d,1, +0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,0x6b04,1,0x721b,1,0x862d,1,0x9e1e,1, +0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,0x62c9,1,0x81d8,1,0x881f,1,0x5eca,1, +0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,0x4f86,1,0x51b7,1,0x52de,1,0x64c4,1, +0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,0x8606,1,0x865c,1,0x8def,1,0x9732,1, +0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,0x7da0,1,0x83c9,1,0x9304,1,0x9e7f,1, +0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,0x807e,1,0x7262,1,0x78ca,1,0x8cc2,1, +0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,0x6dda,1,0x6f0f,1,0x7d2f,1,0x7e37,1, +0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,0x51cc,1,0x7a1c,1,0x7dbe,1,0x83f1,1, +0x9675,1,0x8b80,1,0x62cf,1,0x8afe,1,0x4e39,1,0x5be7,1,0x6012,1,0x7387,1, +0x7570,1,0x5317,1,0x78fb,1,0x4fbf,1,0x5fa9,1,0x4e0d,1,0x6ccc,1,0x6578,1, +0x7d22,1,0x53c3,1,0x585e,1,0x7701,1,0x8449,1,0x8aaa,1,0x6bba,1,0x8fb0,1, +0x6c88,1,0x62fe,1,0x82e5,1,0x63a0,1,0x7565,1,0x4eae,1,0x5169,1,0x51c9,1, +0x6881,1,0x7ce7,1,0x826f,1,0x8ad2,1,0x91cf,1,0x52f5,1,0x5442,1,0x5973,1, +0x5eec,1,0x65c5,1,0x6ffe,1,0x792a,1,0x95ad,1,0x9a6a,1,0x9e97,1,0x9ece,1, +0x529b,1,0x66c6,1,0x6b77,1,0x8f62,1,0x5e74,1,0x6190,1,0x6200,1,0x649a,1, +0x6f23,1,0x7149,1,0x7489,1,0x79ca,1,0x7df4,1,0x806f,1,0x8f26,1,0x84ee,1, +0x9023,1,0x934a,1,0x5217,1,0x52a3,1,0x54bd,1,0x70c8,1,0x88c2,1,0x5ec9,1, +0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9,1,0x5dba,1, +0x601c,1,0x73b2,1,0x7469,1,0x7f9a,1,0x8046,1,0x9234,1,0x96f6,1,0x9748,1, +0x9818,1,0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8,1,0x60e1,1,0x4e86,1,0x50da,1, +0x5bee,1,0x5c3f,1,0x6599,1,0x71ce,1,0x7642,1,0x84fc,1,0x907c,1,0x9f8d,1, +0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3,1,0x6d41,1,0x6e9c,1,0x7409,1, +0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d,1,0x622e,1,0x9678,1,0x502b,1, +0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144,1,0x6817,1,0x9686,1,0x5229,1, +0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8,1,0x6ce5,1,0x7406,1,0x75e2,1, +0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2,1,0x533f,1,0x6eba,1,0x541d,1, +0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57,1,0x9e9f,1,0x6797,1,0x6dcb,1, +0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0,1,0x7099,1,0x8b58,1,0x4ec0,1, +0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3,1,0x7cd6,1,0x5b85,1,0x6d1e,1, +0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b,1,0x5ed3,1,0x5140,1,0x55c0,1, +0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca,1,0x793c,1,0x795e,1,0x7965,1, +0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612,1,0x8af8,1,0x9038,1,0x90fd,1, +0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x90de,1,0x96b7,1,0x4fae,1,0x50e7,1, +0x514d,1,0x52c9,1,0x52e4,1,0x5351,1,0x559d,1,0x5606,1,0x5668,1,0x5840,1, +0x58a8,1,0x5c64,1,0x5c6e,1,0x6094,1,0x6168,1,0x618e,1,0x61f2,1,0x654f,1, +0x65e2,1,0x6691,1,0x6885,1,0x6d77,1,0x6e1a,1,0x6f22,1,0x716e,1,0x722b,1, +0x7422,1,0x7891,1,0x793e,1,0x7949,1,0x7948,1,0x7950,1,0x7956,1,0x795d,1, +0x798d,1,0x798e,1,0x7a40,1,0x7a81,1,0x7bc0,1,0x7e09,1,0x7e41,1,0x7f72,1, +0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910,1,0x8996,1,0x8b01,1,0x8b39,1, +0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff,1,0x983b,1,0x6075,2,0xd850,0xdeee, +1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1,0x5180,1,0x52c7, +1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,1,0x58b3,1,0x5944,1,0x5954,1,0x5a62, +1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1,0x614e,1,0x6108, +1,0x6160,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,0x6556,1,0x671b,1,0x6756, +1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1,0x77a7,1,0x7235,1,0x72af,1,0x7471, +1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76db,1,0x76f4,1,0x774a,1,0x7740, +1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1,0x7f3e,1,0x8352,1,0x83ef,1,0x8779, +1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1,0x8aed,1,0x8b8a,1,0x8f38,1,0x9072, +1,0x9199,1,0x9276,1,0x967c,1,0x97db,1,0x980b,1,0x9b12,2,0xd84a,0xdc4a,2, +0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854,0xde49,2,0xd857, +0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0xe02,0x5d9,0x5b4,0x1102,0x5f2,0x5b7,0x1802,0x5e9, +0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1,0xfb49,0x1943,0x5e9,0x5bc,0x5c2,0x1102,0x5d0, +0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1,0x5bc,0x1502,0x5d2,0x5bc,0x1502,0x5d3,0x5bc, +0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc,0x1502,0x5d8,0x5bc,0x1502,0x5d9,0x5bc,0x1502, +0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502,0x5de,0x5bc,0x1502,0x5e0,0x5bc,0x1502,0x5e1, +0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6,0x5bc,0x1502,0x5e7,0x5bc,0x1502,0x5e8,0x5bc, +0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9,0x1702,0x5d1,0x5bf,0x1702,0x5db,0x5bf,0x1702, +0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd5f,0xd834,0xdd6e, +4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xdd5f,0xd834,0xdd6f,4,0xd846,0xd834,0xdd58, +0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70, +0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0xd834,0xdd5f,0xd834,0xdd72, +4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804,0xd834,0xddb9,0xd834,0xdd65,0xd804,0xd834,0xddba, +0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbc, +0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbb,0xd834,0xdd6f,4,0xd846, +0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834,0xdd6f,4,0xd846,0xd834,0xddba,0xd834,0xdd65, +0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60,1,0x4fbb,1, +0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e,2,0xd841,0xde3a,1,0x5154,1,0x5164, +1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167,1,0x518d,2,0xd841,0xdd4b,1,0x5197, +1,0x51a4,1,0x4ecc,1,0x51ac,2,0xd864,0xdddf,1,0x51f5,1,0x5203,1,0x34df,1, +0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515,1,0x5305,1,0x5306,1,0x5349,1, +0x535a,1,0x5373,1,0x537d,1,0x537f,2,0xd842,0xde2c,1,0x7070,1,0x53ca,1,0x53df, +2,0xd842,0xdf63,1,0x53eb,1,0x53f1,1,0x5406,1,0x549e,1,0x5438,1,0x5448,1, +0x5468,1,0x54a2,1,0x54f6,1,0x5510,1,0x5553,1,0x5563,1,0x5584,1,0x55ab,1, +0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651,1,0x5674,1,0x58ee,1,0x57ce,1, +0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831,1,0x58ac,2,0xd845,0xdce4,1,0x58f2, +1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8,2,0xd845,0xdeea, +1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1,0x36fc,1,0x5b08, +1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5bf3,2,0xd846,0xdf18,1,0x5bff, +1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1,0x5cc0,1,0x5c8d,2,0xd847, +0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1,0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2, +1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1,0x5e69,1,0x3862,2,0xd848,0xdd83,1, +0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,2,0xd868,0xdf92,1,0x5efe,2,0xd848,0xdf31,1, +0x8201,1,0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62,1,0x5f6b,1, +0x38e3,1,0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a,1,0x391c,2, +0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1,0x617a,1,0x61b2,1,0x61a4,1,0x61af, +1,0x61de,1,0x6210,1,0x621b,1,0x625d,1,0x62b1,1,0x62d4,1,0x6350,2,0xd84a, +0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383,1,0x63e4,2,0xd84a,0xdff1,1,0x6422, +1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1,0x647e,1,0x649d,1,0x6477,1,0x3a6c, +1,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19,1,0x3b08,1, +0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c,1,0x80ad,1,0x43d9,1,0x6721,1, +0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1,0x6852,2,0xd84d, +0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x6942,1,0x69a3,1,0x69ea,1,0x6aa8,2, +0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e,0xdca7,1,0x6b54,1,0x3c4e,1, +0x6b72,1,0x6b9f,1,0x6bbb,2,0xd84e,0xde8d,2,0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e, +2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67,1,0x6d16,1,0x6d3e,1,0x6d69,1, +0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ec7, +2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1, +0x7039,1,0x701b,1,0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad,2,0xd841,0xdd25, +1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1,0x7250,2,0xd851, +0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,1,0x737a,1,0x738b,1, +0x3eac,1,0x73a5,1,0x3eb8,1,0x7447,1,0x745c,1,0x7485,1,0x74ca,1,0x3f1b,1, +0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,2,0xd848,0xdd9f,1,0x7610,2,0xd853, +0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc,1,0x4008,2,0xd854,0xdcf3,2,0xd854, +0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e,1,0x771f,1,0x778b,1,0x4046,1, +0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2,0xd855,0xde26,2,0xd855,0xde9a,2,0xd855, +0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2,0xd856,0xdea7,1, +0x7aee,1,0x4202,2,0xd856,0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2,0xd857,0xdc80,1, +0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1,0x7d63,1,0x4301, +1,0x7dc7,1,0x7e02,1,0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858,0xde47,1,0x4359, +2,0xd858,0xded9,1,0x7f7a,2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,2,0xd859,0xdcda,2, +0xd859,0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2, +1,0x8103,1,0x440b,1,0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c, +0xdf93,2,0xd84c,0xdf9c,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1,0x828b,1,0x829d, +1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c,1,0x831d,1, +0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8353,1,0x83ca,1,0x83cc,1, +0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,0x452b,1,0x84f1,1,0x84f3, +1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1,0x455d,1,0x4561,2,0xd85b, +0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1,0x8667,1,0x8669,1,0x86a9,1,0x8688, +1,0x870e,1,0x86e2,1,0x8728,1,0x876b,1,0x8786,1,0x45d7,1,0x87e1,1,0x8801, +1,0x45f9,1,0x8860,1,0x8863,2,0xd85d,0xde67,1,0x88d7,1,0x88de,1,0x4635,1, +0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66,1,0x46be,1,0x46c7,1,0x8aa0,1, +0x8c55,2,0xd85f,0xdca8,1,0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2, +0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4,2,0xd861,0xddd2, +2,0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1,0x911b,1,0x9238, +1,0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa,1,0x958b,1, +0x4995,1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1,0x9723,2,0xd864, +0xdd45,2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2, +0xd865,0xdc96,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929,1,0x99a7,1, +0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9c40,1,0x9cfd,1,0x4cce,1,0x4ced, +1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2,0xd868,0xde0e,2,0xd868,0xde91, +1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1,0x9f0f,1,0x9f16,1,0x9f3b, +2,0xd869,0xde00,0x3ac,0xe642,0x3b1,0x301,0x3ad,0xe642,0x3b5,0x301,0x3ae,0xe642,0x3b7,0x301,0x3af, +0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5,0x301,0x3ce,0xe642,0x3c9,0x301,0x386, +0xe642,0x391,0x301,0x388,0xe642,0x395,0x301,0x389,0xe642,0x397,0x301,0x390,1,0xe643,0x3b9,0x308, +0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643,0x3c5,0x308,0x301,0x38e,0xe642,0x3a5,0x301,0x385, +0xe642,0xa8,0x301,0x38c,0xe642,0x39f,0x301,0x38f,0xe642,0x3a9,0x301,0xc5,0xe642,0x41,0x30a,0xe6e6, +0xe681,0x300,0xe6e6,0xe681,0x301,0xe6e6,0xe681,0x313,0xe6e6,0xe682,0x308,0x301,0x8100,0x8282,0xf71,0xf72, +0x8100,0x8482,0xf71,0xf74,0x8100,0x8282,0xf71,0xf80,4,0xd804,0xdfc2,0xd804,0xdfc2,4,0xd804,0xdfc2, +0xd804,0xdfb8,4,0xd804,0xdfc2,0xd804,0xdfc9,4,0xd818,0xdd1e,0xd818,0xdd1f,4,0xd818,0xdd29,0xd818, +0xdd1f,4,0xd818,0xdd1e,0xd818,0xdd20,0xd818,0xdd21,0xd818,0xdd1f,4,0x46,0xd818,0xdd1e,0xd818,0xdd1e, +0xd818,0xdd1f,0xd818,0xdd22,0xd818,0xdd1f,4,0x46,0xd818,0xdd1e,0xd818,0xdd29,0xd818,0xdd1f,0xd818,0xdd21, +0xd818,0xdd20,4,0x46,0xd818,0xdd1e,0xd818,0xdd1e,0xd818,0xdd20,4,0xd81b,0xdd67,0xd81b,0xdd67,4, +0xd818,0xdd1e,0xd818,0xdd1e,0x34b1,0x47c2,0xc24c,0xb4b1,0x4802,0xc250,4,0xd818,0xdd1e,0xd818,0xdd29,0xb4b1, +0x47c2,0xc24e,0x3489,0xee02,0x278e,0x3489,0xf082,0x278a,0xb489,0xf242,0x2790,0x34b1,0x4782,0xc243,0x34b1,0x47c2, +0xc246,0x34b1,0x4802,0xc24a,0xb4b1,0x4a42,0xc245,0xb4b1,0x47c2,0xc248,0xb4b7,0x59c2,0xdad0,0 }; static const uint8_t norm2_nfc_data_smallFCD[256]={ 0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xd7,0xe6,0x66,0x46,0x66,0x46,0x66,0x5b, -0x12,0,0,4,0,0,0,0x43,0x20,2,0x69,0xae,0xc2,0xc0,0xff,0xff, +0x12,0,0,4,0,0,0,0x43,0x20,2,0xe9,0xae,0xc2,0xc0,0xff,0xff, 0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0, 0xfe,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index a2cfc89c1a8150..4b30d787e87c59 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -174,7 +174,7 @@ class Normalizer2WithImpl : public Normalizer2 { errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - return (int32_t)(spanQuickCheckYes(sArray, sArray+s.length(), errorCode)-sArray); + return static_cast<int32_t>(spanQuickCheckYes(sArray, sArray + s.length(), errorCode) - sArray); } virtual const char16_t * spanQuickCheckYes(const char16_t *src, const char16_t *limit, UErrorCode &errorCode) const = 0; diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index 6856736b888ace..dad3df4edee2df 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -380,8 +380,8 @@ normalizeSecondAndAppend(const UNormalizer2 *norm2, firstLength=firstString.length(); // In case it was -1. // secondLength==0: Nothing to do, and n2wi->normalizeAndAppend(nullptr, nullptr, buffer, ...) would crash. if(secondLength!=0) { - const Normalizer2 *n2=(const Normalizer2 *)norm2; - const Normalizer2WithImpl *n2wi=dynamic_cast<const Normalizer2WithImpl *>(n2); + const Normalizer2* n2 = reinterpret_cast<const Normalizer2*>(norm2); + const Normalizer2WithImpl* n2wi = dynamic_cast<const Normalizer2WithImpl*>(n2); if(n2wi!=nullptr) { // Avoid duplicate argument checking and support NUL-terminated src. UnicodeString safeMiddle; diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index cdf570d76bdc9d..758a84c110697d 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -53,9 +53,9 @@ namespace { */ inline uint8_t leadByteForCP(UChar32 c) { if (c <= 0x7f) { - return (uint8_t)c; + return static_cast<uint8_t>(c); } else if (c <= 0x7ff) { - return (uint8_t)(0xc0+(c>>6)); + return static_cast<uint8_t>(0xc0 + (c >> 6)); } else { // Should not occur because ccc(U+0300)!=0. return 0xe0; @@ -82,7 +82,7 @@ UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { return ((c&0x1f)<<6) | (cpStart[1]&0x3f); case 3: // no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (char16_t) - return (char16_t)((c<<12) | ((cpStart[1]&0x3f)<<6) | (cpStart[2]&0x3f)); + return static_cast<char16_t>((c << 12) | ((cpStart[1] & 0x3f) << 6) | (cpStart[2] & 0x3f)); case 4: return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f); default: @@ -100,8 +100,8 @@ UChar32 previousHangulOrJamo(const uint8_t *start, const uint8_t *p) { uint8_t l = *p; uint8_t t1, t2; if (0xe1 <= l && l <= 0xed && - (t1 = (uint8_t)(p[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(p[2] - 0x80)) <= 0x3f && + (t1 = static_cast<uint8_t>(p[1] - 0x80)) <= 0x3f && + (t2 = static_cast<uint8_t>(p[2] - 0x80)) <= 0x3f && (l < 0xed || t1 <= 0x1f)) { return ((l & 0xf) << 12) | (t1 << 6) | t2; } @@ -125,7 +125,7 @@ int32_t getJamoTMinusBase(const uint8_t *src, const uint8_t *limit) { } } else if (src[1] == 0x87) { uint8_t t = src[2]; - if ((int8_t)t <= (int8_t)0x82u) { + if (static_cast<int8_t>(t) <= static_cast<int8_t>(0x82u)) { return t - (0xa7 - 0x40); } } @@ -138,10 +138,10 @@ appendCodePointDelta(const uint8_t *cpStart, const uint8_t *cpLimit, int32_t del ByteSink &sink, Edits *edits) { char buffer[U8_MAX_LENGTH]; int32_t length; - int32_t cpLength = (int32_t)(cpLimit - cpStart); + int32_t cpLength = static_cast<int32_t>(cpLimit - cpStart); if (cpLength == 1) { // The builder makes ASCII map to ASCII. - buffer[0] = (uint8_t)(*cpStart + delta); + buffer[0] = static_cast<uint8_t>(*cpStart + delta); length = 1; } else { int32_t trail = *(cpLimit-1) + delta; @@ -150,7 +150,7 @@ appendCodePointDelta(const uint8_t *cpStart, const uint8_t *cpLimit, int32_t del --cpLimit; length = 0; do { buffer[length++] = *cpStart++; } while (cpStart < cpLimit); - buffer[length++] = (uint8_t)trail; + buffer[length++] = static_cast<uint8_t>(trail); } else { // Decode the code point, add the delta, re-encode. UChar32 c = codePointFromValidUTF8(cpStart, cpLimit) + delta; @@ -205,16 +205,16 @@ UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) { } UBool ReorderingBuffer::equals(const char16_t *otherStart, const char16_t *otherLimit) const { - int32_t length=(int32_t)(limit-start); + int32_t length = static_cast<int32_t>(limit - start); return - length==(int32_t)(otherLimit-otherStart) && + length == static_cast<int32_t>(otherLimit - otherStart) && 0==u_memcmp(start, otherStart, length); } UBool ReorderingBuffer::equals(const uint8_t *otherStart, const uint8_t *otherLimit) const { U_ASSERT((otherLimit - otherStart) <= INT32_MAX); // ensured by caller - int32_t length = (int32_t)(limit - start); - int32_t otherLength = (int32_t)(otherLimit - otherStart); + int32_t length = static_cast<int32_t>(limit - start); + int32_t otherLength = static_cast<int32_t>(otherLimit - otherStart); // For equal strings, UTF-8 is at least as long as UTF-16, and at most three times as long. if (otherLength < length || (otherLength / 3) > length) { return false; @@ -284,7 +284,7 @@ UBool ReorderingBuffer::append(const char16_t *s, int32_t length, UBool isNFD, U16_NEXT(s, i, length, c); if(i<length) { if (isNFD) { - leadCC = Normalizer2Impl::getCCFromYesOrMaybe(impl.getRawNorm16(c)); + leadCC = Normalizer2Impl::getCCFromYesOrMaybeYes(impl.getRawNorm16(c)); } else { leadCC = impl.getCC(impl.getNorm16(c)); } @@ -304,7 +304,7 @@ UBool ReorderingBuffer::appendZeroCC(UChar32 c, UErrorCode &errorCode) { } remainingCapacity-=cpLength; if(cpLength==1) { - *limit++=(char16_t)c; + *limit++ = static_cast<char16_t>(c); } else { limit[0]=U16_LEAD(c); limit[1]=U16_TRAIL(c); @@ -319,7 +319,7 @@ UBool ReorderingBuffer::appendZeroCC(const char16_t *s, const char16_t *sLimit, if(s==sLimit) { return true; } - int32_t length=(int32_t)(sLimit-s); + int32_t length = static_cast<int32_t>(sLimit - s); if(remainingCapacity<length && !resize(length, errorCode)) { return false; } @@ -350,8 +350,8 @@ void ReorderingBuffer::removeSuffix(int32_t suffixLength) { } UBool ReorderingBuffer::resize(int32_t appendLength, UErrorCode &errorCode) { - int32_t reorderStartIndex=(int32_t)(reorderStart-start); - int32_t length=(int32_t)(limit-start); + int32_t reorderStartIndex = static_cast<int32_t>(reorderStart - start); + int32_t length = static_cast<int32_t>(limit - start); str.releaseBuffer(length); int32_t newCapacity=length+appendLength; int32_t doubleCapacity=2*str.getCapacity(); @@ -392,7 +392,7 @@ uint8_t ReorderingBuffer::previousCC() { --codePointStart; c=U16_GET_SUPPLEMENTARY(c2, c); } - return impl.getCCFromYesOrMaybeCP(c); + return impl.getCCFromYesOrMaybeYesCP(c); } // Inserts c somewhere before the last character. @@ -440,15 +440,14 @@ Normalizer2Impl::init(const int32_t *inIndexes, const UCPTrie *inTrie, minNoNoCompNoMaybeCC = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO_COMP_NO_MAYBE_CC]); minNoNoEmpty = static_cast<uint16_t>(inIndexes[IX_MIN_NO_NO_EMPTY]); limitNoNo = static_cast<uint16_t>(inIndexes[IX_LIMIT_NO_NO]); + minMaybeNo = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_NO]); + minMaybeNoCombinesFwd = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_NO_COMBINES_FWD]); minMaybeYes = static_cast<uint16_t>(inIndexes[IX_MIN_MAYBE_YES]); - U_ASSERT((minMaybeYes & 7) == 0); // 8-aligned for noNoDelta bit fields - centerNoNoDelta = (minMaybeYes >> DELTA_SHIFT) - MAX_DELTA - 1; + U_ASSERT((minMaybeNo & 7) == 0); // 8-aligned for noNoDelta bit fields + centerNoNoDelta = (minMaybeNo >> DELTA_SHIFT) - MAX_DELTA - 1; normTrie=inTrie; - - maybeYesCompositions=inExtraData; - extraData=maybeYesCompositions+((MIN_NORMAL_MAYBE_YES-minMaybeYes)>>OFFSET_SHIFT); - + extraData=inExtraData; smallFCD=inSmallFCD; } @@ -486,7 +485,7 @@ Normalizer2Impl::addPropertyStarts(const USetAdder *sa, UErrorCode & /*errorCode while ((end = ucptrie_getRange(normTrie, start, UCPMAP_RANGE_FIXED_LEAD_SURROGATES, INERT, nullptr, nullptr, &value)) >= 0) { sa->add(sa->set, start); - if (start != end && isAlgorithmicNoNo((uint16_t)value) && + if (start != end && isAlgorithmicNoNo(static_cast<uint16_t>(value)) && (value & Normalizer2Impl::DELTA_TCCC_MASK) > Normalizer2Impl::DELTA_TCCC_1) { // Range of code points with same-norm16-value algorithmic decompositions. // They might have different non-zero FCD16 values. @@ -570,7 +569,7 @@ Normalizer2Impl::decompose(const char16_t *src, const char16_t *limit, int32_t destLengthEstimate, UErrorCode &errorCode) const { if(destLengthEstimate<0 && limit!=nullptr) { - destLengthEstimate=(int32_t)(limit-src); + destLengthEstimate = static_cast<int32_t>(limit - src); } dest.remove(); ReorderingBuffer buffer(*this, dest); @@ -650,7 +649,7 @@ Normalizer2Impl::decompose(const char16_t *src, const char16_t *limit, } } else { if(isDecompYes(norm16)) { - uint8_t cc=getCCFromYesOrMaybe(norm16); + uint8_t cc=getCCFromYesOrMaybeYes(norm16); if(prevCC<=cc || cc==0) { prevCC=cc; if(cc<=1) { @@ -702,12 +701,13 @@ UBool Normalizer2Impl::decompose(UChar32 c, uint16_t norm16, UErrorCode &errorCode) const { // get the decomposition and the lead and trail cc's if (norm16 >= limitNoNo) { - if (isMaybeOrNonZeroCC(norm16)) { - return buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode); + if (isMaybeYesOrNonZeroCC(norm16)) { + return buffer.append(c, getCCFromYesOrMaybeYes(norm16), errorCode); + } else if (norm16 < minMaybeNo) { + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getRawNorm16(c); } - // Maps to an isCompYesAndZeroCC. - c=mapAlgorithmic(c, norm16); - norm16=getRawNorm16(c); } if (norm16 < minYesNo) { // c does not decompose @@ -718,17 +718,17 @@ UBool Normalizer2Impl::decompose(UChar32 c, uint16_t norm16, return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getData(norm16); uint16_t firstUnit=*mapping; int32_t length=firstUnit&MAPPING_LENGTH_MASK; uint8_t leadCC, trailCC; - trailCC=(uint8_t)(firstUnit>>8); + trailCC = static_cast<uint8_t>(firstUnit >> 8); if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - leadCC=(uint8_t)(*(mapping-1)>>8); + leadCC = static_cast<uint8_t>(*(mapping - 1) >> 8); } else { leadCC=0; } - return buffer.append((const char16_t *)mapping+1, length, true, leadCC, trailCC, errorCode); + return buffer.append(reinterpret_cast<const char16_t*>(mapping) + 1, length, true, leadCC, trailCC, errorCode); } // Dual functionality: @@ -787,9 +787,9 @@ Normalizer2Impl::decomposeUTF8(uint32_t options, } // Medium-fast path: Quick check. - if (isMaybeOrNonZeroCC(norm16)) { + if (isMaybeYesOrNonZeroCC(norm16)) { // Does not decompose. - uint8_t cc = getCCFromYesOrMaybe(norm16); + uint8_t cc = getCCFromYesOrMaybeYes(norm16); if (prevCC <= cc || cc == 0) { prevCC = cc; if (cc <= 1) { @@ -836,7 +836,7 @@ Normalizer2Impl::decomposeUTF8(uint32_t options, } // We already know there was a change if the original character decomposed; // otherwise compare. - if (isMaybeOrNonZeroCC(norm16) && buffer.equals(prevBoundary, src)) { + if (isMaybeYesOrNonZeroCC(norm16) && buffer.equals(prevBoundary, src)) { if (!ByteSinkUtil::appendUnchanged(prevBoundary, src, *sink, options, edits, errorCode)) { break; @@ -867,9 +867,9 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, // Get the decomposition and the lead and trail cc's. UChar32 c = U_SENTINEL; if (norm16 >= limitNoNo) { - if (isMaybeOrNonZeroCC(norm16)) { + if (isMaybeYesOrNonZeroCC(norm16)) { // No comp boundaries around this character. - uint8_t cc = getCCFromYesOrMaybe(norm16); + uint8_t cc = getCCFromYesOrMaybeYes(norm16); if (cc == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { return prevSrc; } @@ -881,14 +881,15 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, return src; } continue; + } else if (norm16 < minMaybeNo) { + // Maps to an isCompYesAndZeroCC. + if (stopAt != STOP_AT_LIMIT) { + return prevSrc; + } + c = codePointFromValidUTF8(prevSrc, src); + c = mapAlgorithmic(c, norm16); + norm16 = getRawNorm16(c); } - // Maps to an isCompYesAndZeroCC. - if (stopAt != STOP_AT_LIMIT) { - return prevSrc; - } - c = codePointFromValidUTF8(prevSrc, src); - c = mapAlgorithmic(c, norm16); - norm16 = getRawNorm16(c); } else if (stopAt != STOP_AT_LIMIT && norm16 < minNoNoCompNoMaybeCC) { return prevSrc; } @@ -918,20 +919,20 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, } } else { // The character decomposes, get everything from the variable-length extra data. - const uint16_t *mapping = getMapping(norm16); + const uint16_t *mapping = getData(norm16); uint16_t firstUnit = *mapping; int32_t length = firstUnit & MAPPING_LENGTH_MASK; - uint8_t trailCC = (uint8_t)(firstUnit >> 8); + uint8_t trailCC = static_cast<uint8_t>(firstUnit >> 8); uint8_t leadCC; if (firstUnit & MAPPING_HAS_CCC_LCCC_WORD) { - leadCC = (uint8_t)(*(mapping-1) >> 8); + leadCC = static_cast<uint8_t>(*(mapping - 1) >> 8); } else { leadCC = 0; } if (leadCC == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { return prevSrc; } - if (!buffer.append((const char16_t *)mapping+1, length, true, leadCC, trailCC, errorCode)) { + if (!buffer.append(reinterpret_cast<const char16_t*>(mapping) + 1, length, true, leadCC, trailCC, errorCode)) { return nullptr; } } @@ -946,7 +947,7 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, const char16_t * Normalizer2Impl::getDecomposition(UChar32 c, char16_t buffer[4], int32_t &length) const { uint16_t norm16; - if(c<minDecompNoCP || isMaybeOrNonZeroCC(norm16=getNorm16(c))) { + if(c<minDecompNoCP || isMaybeYesOrNonZeroCC(norm16=getNorm16(c))) { // c does not decompose return nullptr; } @@ -968,9 +969,9 @@ Normalizer2Impl::getDecomposition(UChar32 c, char16_t buffer[4], int32_t &length return buffer; } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getData(norm16); length=*mapping&MAPPING_LENGTH_MASK; - return (const char16_t *)mapping+1; + return reinterpret_cast<const char16_t*>(mapping) + 1; } // The capacity of the buffer must be 30=MAPPING_LENGTH_MASK-1 @@ -995,7 +996,7 @@ Normalizer2Impl::getRawDecomposition(UChar32 c, char16_t buffer[30], int32_t &le return buffer; } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getData(norm16); uint16_t firstUnit=*mapping; int32_t mLength=firstUnit&MAPPING_LENGTH_MASK; // length of normal mapping if(firstUnit&MAPPING_HAS_RAW_MAPPING) { @@ -1005,17 +1006,17 @@ Normalizer2Impl::getRawDecomposition(UChar32 c, char16_t buffer[30], int32_t &le uint16_t rm0=*rawMapping; if(rm0<=MAPPING_LENGTH_MASK) { length=rm0; - return (const char16_t *)rawMapping-rm0; + return reinterpret_cast<const char16_t*>(rawMapping) - rm0; } else { // Copy the normal mapping and replace its first two code units with rm0. - buffer[0]=(char16_t)rm0; - u_memcpy(buffer+1, (const char16_t *)mapping+1+2, mLength-2); + buffer[0] = static_cast<char16_t>(rm0); + u_memcpy(buffer + 1, reinterpret_cast<const char16_t*>(mapping) + 1 + 2, mLength - 2); length=mLength-1; return buffer; } } else { length=mLength; - return (const char16_t *)mapping+1; + return reinterpret_cast<const char16_t*>(mapping) + 1; } } @@ -1052,7 +1053,7 @@ void Normalizer2Impl::decomposeAndAppend(const char16_t *src, const char16_t *li limit=u_strchr(p, 0); } - if (buffer.append(src, (int32_t)(p - src), false, firstCC, prevCC, errorCode)) { + if (buffer.append(src, static_cast<int32_t>(p - src), false, firstCC, prevCC, errorCode)) { buffer.appendZeroCC(p, limit, errorCode); } } @@ -1070,7 +1071,7 @@ UBool Normalizer2Impl::norm16HasDecompBoundaryBefore(uint16_t norm16) const { return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getDataForYesOrNo(norm16); uint16_t firstUnit=*mapping; // true if leadCC==0 (hasFCDBoundaryBefore()) return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; @@ -1091,14 +1092,15 @@ UBool Normalizer2Impl::norm16HasDecompBoundaryAfter(uint16_t norm16) const { return true; } if (norm16 >= limitNoNo) { - if (isMaybeOrNonZeroCC(norm16)) { + if (isMaybeYesOrNonZeroCC(norm16)) { return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } else if (norm16 < minMaybeNo) { + // Maps to an isCompYesAndZeroCC. + return (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1; } - // Maps to an isCompYesAndZeroCC. - return (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1; } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getData(norm16); uint16_t firstUnit=*mapping; // decomp after-boundary: same as hasFCDBoundaryAfter(), // fcd16<=1 || trailCC==0 @@ -1140,13 +1142,13 @@ int32_t Normalizer2Impl::combine(const uint16_t *list, UChar32 trail) { if(trail<COMP_1_TRAIL_LIMIT) { // trail character is 0..33FF // result entry may have 2 or 3 units - key1=(uint16_t)(trail<<1); + key1 = static_cast<uint16_t>(trail << 1); while(key1>(firstUnit=*list)) { list+=2+(firstUnit&COMP_1_TRIPLE); } if(key1==(firstUnit&COMP_1_TRAIL_MASK)) { if(firstUnit&COMP_1_TRIPLE) { - return ((int32_t)list[1]<<16)|list[2]; + return (static_cast<int32_t>(list[1]) << 16) | list[2]; } else { return list[1]; } @@ -1154,10 +1156,10 @@ int32_t Normalizer2Impl::combine(const uint16_t *list, UChar32 trail) { } else { // trail character is 3400..10FFFF // result entry has 3 units - key1=(uint16_t)(COMP_1_TRAIL_LIMIT+ + key1 = static_cast<uint16_t>(COMP_1_TRAIL_LIMIT + (((trail>>COMP_1_TRAIL_SHIFT))& ~COMP_1_TRIPLE)); - uint16_t key2=(uint16_t)(trail<<COMP_2_TRAIL_SHIFT); + uint16_t key2 = static_cast<uint16_t>(trail << COMP_2_TRAIL_SHIFT); uint16_t secondUnit; for(;;) { if(key1>(firstUnit=*list)) { @@ -1170,7 +1172,7 @@ int32_t Normalizer2Impl::combine(const uint16_t *list, UChar32 trail) { list+=3; } } else if(key2==(secondUnit&COMP_2_TRAIL_MASK)) { - return ((int32_t)(secondUnit&~COMP_2_TRAIL_MASK)<<16)|list[2]; + return (static_cast<int32_t>(secondUnit & ~COMP_2_TRAIL_MASK) << 16) | list[2]; } else { break; } @@ -1195,7 +1197,7 @@ void Normalizer2Impl::addComposites(const uint16_t *list, UnicodeSet &set) const compositeAndFwd=list[1]; list+=2; } else { - compositeAndFwd=(((int32_t)list[1]&~COMP_2_TRAIL_MASK)<<16)|list[2]; + compositeAndFwd = ((static_cast<int32_t>(list[1]) & ~COMP_2_TRAIL_MASK) << 16) | list[2]; list+=3; } UChar32 composite=compositeAndFwd>>1; @@ -1240,7 +1242,7 @@ void Normalizer2Impl::recompose(ReorderingBuffer &buffer, int32_t recomposeStart for(;;) { UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, p, limit, c, norm16); - cc=getCCFromYesOrMaybe(norm16); + cc=getCCFromYesOrMaybeYes(norm16); if( // this character combines backward and isMaybe(norm16) && // we have seen a starter that combines forward and @@ -1252,15 +1254,15 @@ void Normalizer2Impl::recompose(ReorderingBuffer &buffer, int32_t recomposeStart // c is a Jamo V/T, see if we can compose it with the previous character. if(c<Hangul::JAMO_T_BASE) { // c is a Jamo Vowel, compose with previous Jamo L and following Jamo T. - char16_t prev=(char16_t)(*starter-Hangul::JAMO_L_BASE); + char16_t prev = static_cast<char16_t>(*starter - Hangul::JAMO_L_BASE); if(prev<Hangul::JAMO_L_COUNT) { pRemove=p-1; - char16_t syllable=(char16_t) - (Hangul::HANGUL_BASE+ + char16_t syllable = static_cast<char16_t>( + Hangul::HANGUL_BASE + (prev*Hangul::JAMO_V_COUNT+(c-Hangul::JAMO_V_BASE))* Hangul::JAMO_T_COUNT); char16_t t; - if(p!=limit && (t=(char16_t)(*p-Hangul::JAMO_T_BASE))<Hangul::JAMO_T_COUNT) { + if (p != limit && (t = static_cast<char16_t>(*p - Hangul::JAMO_T_BASE)) < Hangul::JAMO_T_COUNT) { ++p; syllable+=t; // The next character was a Jamo T. } @@ -1298,7 +1300,7 @@ void Normalizer2Impl::recompose(ReorderingBuffer &buffer, int32_t recomposeStart starter[0]=U16_LEAD(composite); starter[1]=U16_TRAIL(composite); } else { - *starter=(char16_t)composite; + *starter = static_cast<char16_t>(composite); // The composite is shorter than the starter, // move the intermediate characters forward one. starterIsSupplementary=false; @@ -1323,7 +1325,7 @@ void Normalizer2Impl::recompose(ReorderingBuffer &buffer, int32_t recomposeStart *--starter=U16_LEAD(composite); // undo the temporary increment } else { // both are on the BMP - *starter=(char16_t)composite; + *starter = static_cast<char16_t>(composite); } /* remove the combining mark by moving the following text over it */ @@ -1390,8 +1392,11 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { } else if(norm16<minYesNoMappingsOnly) { // a combines forward. if(isJamoL(norm16)) { + if (b < Hangul::JAMO_V_BASE) { + return U_SENTINEL; + } b-=Hangul::JAMO_V_BASE; - if(0<=b && b<Hangul::JAMO_V_COUNT) { + if(b<Hangul::JAMO_V_COUNT) { return (Hangul::HANGUL_BASE+ ((a-Hangul::JAMO_L_BASE)*Hangul::JAMO_V_COUNT+b)* @@ -1400,25 +1405,33 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { return U_SENTINEL; } } else if(isHangulLV(norm16)) { + if (b <= Hangul::JAMO_T_BASE) { + return U_SENTINEL; + } b-=Hangul::JAMO_T_BASE; - if(0<b && b<Hangul::JAMO_T_COUNT) { // not b==0! + if(b<Hangul::JAMO_T_COUNT) { // not b==0! return a+b; } else { return U_SENTINEL; } } else { // 'a' has a compositions list in extraData - list=getMapping(norm16); + list=getDataForYesOrNo(norm16); if(norm16>minYesNo) { // composite 'a' has both mapping & compositions list list+= // mapping pointer 1+ // +1 to skip the first unit with the mapping length (*list&MAPPING_LENGTH_MASK); // + mapping length } } - } else if(norm16<minMaybeYes || MIN_NORMAL_MAYBE_YES<=norm16) { + } else if(norm16<minMaybeNoCombinesFwd || MIN_NORMAL_MAYBE_YES<=norm16) { return U_SENTINEL; } else { - list=getCompositionsListForMaybe(norm16); + list=getDataForMaybe(norm16); + if(norm16<minMaybeYes) { // composite 'a' has both mapping & compositions list + list+= // mapping pointer + 1+ // +1 to skip the first unit with the mapping length + (*list&MAPPING_LENGTH_MASK); // + mapping length + } } if(b<0 || 0x10ffff<b) { // combine(list, b) requires a valid code point b return U_SENTINEL; @@ -1496,12 +1509,12 @@ Normalizer2Impl::compose(const char16_t *src, const char16_t *limit, } // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. // The current character is either a "noNo" (has a mapping) - // or a "maybeYes" (combines backward) + // or a "maybeYes" / "maybeNo" (combines backward) // or a "yesYes" with ccc!=0. // It is not a Hangul syllable or Jamo L because those have "yes" properties. // Medium-fast path: Handle cases that do not require full decomposition and recomposition. - if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (norm16 < minMaybeNo) { // minNoNo <= norm16 < minMaybeNo if (!doCompose) { return false; } @@ -1528,7 +1541,7 @@ Normalizer2Impl::compose(const char16_t *src, const char16_t *limit, if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { break; } - const char16_t *mapping = reinterpret_cast<const char16_t *>(getMapping(norm16)); + const char16_t *mapping = reinterpret_cast<const char16_t *>(getDataForYesOrNo(norm16)); int32_t length = *mapping++ & MAPPING_LENGTH_MASK; if(!buffer.appendZeroCC(mapping, mapping + length, errorCode)) { break; @@ -1556,14 +1569,14 @@ Normalizer2Impl::compose(const char16_t *src, const char16_t *limit, if(c<Hangul::JAMO_T_BASE) { // The current character is a Jamo Vowel, // compose with previous Jamo L and following Jamo T. - char16_t l = (char16_t)(prev-Hangul::JAMO_L_BASE); + char16_t l = static_cast<char16_t>(prev - Hangul::JAMO_L_BASE); if(l<Hangul::JAMO_L_COUNT) { if (!doCompose) { return false; } int32_t t; if (src != limit && - 0 < (t = ((int32_t)*src - Hangul::JAMO_T_BASE)) && + 0 < (t = (static_cast<int32_t>(*src) - Hangul::JAMO_T_BASE)) && t < Hangul::JAMO_T_COUNT) { // The next character is a Jamo T. ++src; @@ -1581,7 +1594,7 @@ Normalizer2Impl::compose(const char16_t *src, const char16_t *limit, if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { break; } - if(!buffer.appendBMP((char16_t)syllable, 0, errorCode)) { + if (!buffer.appendBMP(static_cast<char16_t>(syllable), 0, errorCode)) { break; } prevBoundary = src; @@ -1606,7 +1619,7 @@ Normalizer2Impl::compose(const char16_t *src, const char16_t *limit, if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { break; } - if(!buffer.appendBMP((char16_t)syllable, 0, errorCode)) { + if (!buffer.appendBMP(static_cast<char16_t>(syllable), 0, errorCode)) { break; } prevBoundary = src; @@ -1757,7 +1770,7 @@ Normalizer2Impl::composeQuickCheck(const char16_t *src, const char16_t *limit, } // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. // The current character is either a "noNo" (has a mapping) - // or a "maybeYes" (combines backward) + // or a "maybeYes" / "maybeNo" (combines backward) // or a "yesYes" with ccc!=0. // It is not a Hangul syllable or Jamo L because those have "yes" properties. @@ -1778,8 +1791,9 @@ Normalizer2Impl::composeQuickCheck(const char16_t *src, const char16_t *limit, } } - if(isMaybeOrNonZeroCC(norm16)) { - uint8_t cc=getCCFromYesOrMaybe(norm16); + if (norm16 >= minMaybeNo) { + uint16_t fcd16 = getFCD16FromMaybeOrNonZeroCC(norm16); + uint8_t cc = fcd16 >> 8; if (onlyContiguous /* FCC */ && cc != 0 && getTrailCCFromCompYesAndZeroCC(prevNorm16) > cc) { // The [prevBoundary..prevSrc[ character @@ -1800,11 +1814,12 @@ Normalizer2Impl::composeQuickCheck(const char16_t *src, const char16_t *limit, if (src == limit) { return src; } - uint8_t prevCC = cc; + uint8_t prevCC = fcd16; nextSrc = src; UCPTRIE_FAST_U16_NEXT(normTrie, UCPTRIE_16, nextSrc, limit, c, norm16); - if (isMaybeOrNonZeroCC(norm16)) { - cc = getCCFromYesOrMaybe(norm16); + if (norm16 >= minMaybeNo) { + fcd16 = getFCD16FromMaybeOrNonZeroCC(norm16); + cc = fcd16 >> 8; if (!(prevCC <= cc || cc == 0)) { break; } @@ -1839,11 +1854,11 @@ void Normalizer2Impl::composeAndAppend(const char16_t *src, const char16_t *limi if(src!=firstStarterInSrc) { const char16_t *lastStarterInDest=findPreviousCompBoundary(buffer.getStart(), buffer.getLimit(), onlyContiguous); - int32_t destSuffixLength=(int32_t)(buffer.getLimit()-lastStarterInDest); + int32_t destSuffixLength = static_cast<int32_t>(buffer.getLimit() - lastStarterInDest); UnicodeString middle(lastStarterInDest, destSuffixLength); buffer.removeSuffix(destSuffixLength); safeMiddle=middle; - middle.append(src, (int32_t)(firstStarterInSrc-src)); + middle.append(src, static_cast<int32_t>(firstStarterInSrc - src)); const char16_t *middleStart=middle.getBuffer(); compose(middleStart, middleStart+middle.length(), onlyContiguous, true, buffer, errorCode); @@ -1897,12 +1912,12 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, } // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. // The current character is either a "noNo" (has a mapping) - // or a "maybeYes" (combines backward) + // or a "maybeYes" / "maybeNo" (combines backward) // or a "yesYes" with ccc!=0. // It is not a Hangul syllable or Jamo L because those have "yes" properties. // Medium-fast path: Handle cases that do not require full decomposition and recomposition. - if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (norm16 < minMaybeNo) { // minNoNo <= norm16 < minMaybeNo if (sink == nullptr) { return false; } @@ -1931,9 +1946,9 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, *sink, options, edits, errorCode)) { break; } - const uint16_t *mapping = getMapping(norm16); + const uint16_t *mapping = getDataForYesOrNo(norm16); int32_t length = *mapping++ & MAPPING_LENGTH_MASK; - if (!ByteSinkUtil::appendChange(prevSrc, src, (const char16_t *)mapping, length, + if (!ByteSinkUtil::appendChange(prevSrc, src, reinterpret_cast<const char16_t*>(mapping), length, *sink, edits, errorCode)) { break; } @@ -1952,7 +1967,7 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, break; } if (edits != nullptr) { - edits->addReplace((int32_t)(src - prevSrc), 0); + edits->addReplace(static_cast<int32_t>(src - prevSrc), 0); } prevBoundary = src; continue; @@ -1970,7 +1985,7 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, // The current character is a Jamo Vowel, // compose with previous Jamo L and following Jamo T. UChar32 l = prev - Hangul::JAMO_L_BASE; - if ((uint32_t)l < Hangul::JAMO_L_COUNT) { + if (static_cast<uint32_t>(l) < Hangul::JAMO_L_COUNT) { if (sink == nullptr) { return false; } @@ -2198,20 +2213,20 @@ uint8_t Normalizer2Impl::getPreviousTrailCC(const char16_t *start, const char16_ if (start == p) { return 0; } - int32_t i = (int32_t)(p - start); + int32_t i = static_cast<int32_t>(p - start); UChar32 c; U16_PREV(start, 0, i, c); - return (uint8_t)getFCD16(c); + return static_cast<uint8_t>(getFCD16(c)); } uint8_t Normalizer2Impl::getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const { if (start == p) { return 0; } - int32_t i = (int32_t)(p - start); + int32_t i = static_cast<int32_t>(p - start); UChar32 c; U8_PREV(start, 0, i, c); - return (uint8_t)getFCD16(c); + return static_cast<uint8_t>(getFCD16(c)); } // Note: normalizer2impl.cpp r30982 (2011-nov-27) @@ -2239,7 +2254,7 @@ uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { return norm16|(norm16<<8); } else if(norm16>=minMaybeYes) { return 0; - } else { // isDecompNoAlgorithmic(norm16) + } else if(norm16<minMaybeNo) { // isDecompNoAlgorithmic(norm16) uint16_t deltaTrailCC = norm16 & DELTA_TCCC_MASK; if (deltaTrailCC <= DELTA_TCCC_1) { return deltaTrailCC >> OFFSET_SHIFT; @@ -2254,7 +2269,7 @@ uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { return 0; } // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getData(norm16); uint16_t firstUnit=*mapping; norm16=firstUnit>>8; // tccc if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { @@ -2266,6 +2281,23 @@ uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { #pragma optimize( "", on ) #endif +uint16_t Normalizer2Impl::getFCD16FromMaybeOrNonZeroCC(uint16_t norm16) const { + U_ASSERT(norm16 >= minMaybeNo); + if (norm16 >= MIN_NORMAL_MAYBE_YES) { + // combining mark + norm16 = getCCFromNormalYesOrMaybe(norm16); + return norm16 | (norm16<<8); + } else if (norm16 >= minMaybeYes) { + return 0; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping = getDataForMaybe(norm16); + uint16_t firstUnit = *mapping; + // maybeNo has lccc = 0 + U_ASSERT((firstUnit & MAPPING_HAS_CCC_LCCC_WORD) == 0 || (*(mapping - 1) & 0xff00) == 0); + return firstUnit >> 8; // tccc +} + // Dual functionality: // buffer!=nullptr: normalize // buffer==nullptr: isNormalized/quickCheck/spanQuickCheckYes @@ -2389,7 +2421,7 @@ Normalizer2Impl::makeFCD(const char16_t *src, const char16_t *limit, * already but is now going to be decomposed. * prevSrc is set to after what was copied/appended. */ - buffer->removeSuffix((int32_t)(prevSrc-prevBoundary)); + buffer->removeSuffix(static_cast<int32_t>(prevSrc - prevBoundary)); /* * Find the part of the source that needs to be decomposed, * up to the next safe boundary. @@ -2420,11 +2452,11 @@ void Normalizer2Impl::makeFCDAndAppend(const char16_t *src, const char16_t *limi if(src!=firstBoundaryInSrc) { const char16_t *lastBoundaryInDest=findPreviousFCDBoundary(buffer.getStart(), buffer.getLimit()); - int32_t destSuffixLength=(int32_t)(buffer.getLimit()-lastBoundaryInDest); + int32_t destSuffixLength = static_cast<int32_t>(buffer.getLimit() - lastBoundaryInDest); UnicodeString middle(lastBoundaryInDest, destSuffixLength); buffer.removeSuffix(destSuffixLength); safeMiddle=middle; - middle.append(src, (int32_t)(firstBoundaryInSrc-src)); + middle.append(src, static_cast<int32_t>(firstBoundaryInSrc - src)); const char16_t *middleStart=middle.getBuffer(); makeFCD(middleStart, middleStart+middle.length(), &buffer, errorCode); if(U_FAILURE(errorCode)) { @@ -2501,8 +2533,8 @@ void CanonIterData::addToStartSet(UChar32 origin, UChar32 decompLead, UErrorCode if(U_FAILURE(errorCode)) { return; } - UChar32 firstOrigin=(UChar32)(canonValue&CANON_VALUE_MASK); - canonValue=(canonValue&~CANON_VALUE_MASK)|CANON_HAS_SET|(uint32_t)canonStartSets.size(); + UChar32 firstOrigin = static_cast<UChar32>(canonValue & CANON_VALUE_MASK); + canonValue = (canonValue & ~CANON_VALUE_MASK) | CANON_HAS_SET | static_cast<uint32_t>(canonStartSets.size()); umutablecptrie_set(mutableTrie, decompLead, canonValue, &errorCode); canonStartSets.adoptElement(lpSet.orphan(), errorCode); if (U_FAILURE(errorCode)) { @@ -2512,7 +2544,7 @@ void CanonIterData::addToStartSet(UChar32 origin, UChar32 decompLead, UErrorCode set->add(firstOrigin); } } else { - set=(UnicodeSet *)canonStartSets[(int32_t)(canonValue&CANON_VALUE_MASK)]; + set = static_cast<UnicodeSet*>(canonStartSets[static_cast<int32_t>(canonValue & CANON_VALUE_MASK)]); } set->add(origin); } @@ -2569,9 +2601,11 @@ void InitCanonIterData::doInit(Normalizer2Impl *impl, UErrorCode &errorCode) { void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, const uint16_t norm16, CanonIterData &newData, UErrorCode &errorCode) const { - if(isInert(norm16) || (minYesNo<=norm16 && norm16<minNoNo)) { + if(isInert(norm16) || + (minYesNo<=norm16 && norm16<minNoNo) || + (minMaybeNo<=norm16 && norm16<minMaybeYes)) { // Inert, or 2-way mapping (including Hangul syllable). - // We do not write a canonStartSet for any yesNo character. + // We do not write a canonStartSet for any yesNo/maybeNo character. // Composites from 2-way mappings are added at runtime from the // starter's compositions list, and the other characters in // 2-way mappings get CANON_NOT_SEGMENT_STARTER set because they are @@ -2581,7 +2615,7 @@ void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, co for(UChar32 c=start; c<=end; ++c) { uint32_t oldValue = umutablecptrie_get(newData.mutableTrie, c); uint32_t newValue=oldValue; - if(isMaybeOrNonZeroCC(norm16)) { + if(isMaybeYesOrNonZeroCC(norm16)) { // not a segment starter if it occurs in a decomposition or has cc!=0 newValue|=CANON_NOT_SEGMENT_STARTER; if(norm16<MIN_NORMAL_MAYBE_YES) { @@ -2603,7 +2637,7 @@ void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, co } if (norm16_2 > minYesNo) { // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16_2); + const uint16_t *mapping=getDataForYesOrNo(norm16_2); uint16_t firstUnit=*mapping; int32_t length=firstUnit&MAPPING_LENGTH_MASK; if((firstUnit&MAPPING_HAS_CCC_LCCC_WORD)!=0) { @@ -2651,11 +2685,11 @@ UBool Normalizer2Impl::ensureCanonIterData(UErrorCode &errorCode) const { } int32_t Normalizer2Impl::getCanonValue(UChar32 c) const { - return (int32_t)ucptrie_get(fCanonIterData->trie, c); + return static_cast<int32_t>(ucptrie_get(fCanonIterData->trie, c)); } const UnicodeSet &Normalizer2Impl::getCanonStartSet(int32_t n) const { - return *(const UnicodeSet *)fCanonIterData->canonStartSets[n]; + return *static_cast<const UnicodeSet*>(fCanonIterData->canonStartSets[n]); } UBool Normalizer2Impl::isCanonSegmentStarter(UChar32 c) const { @@ -2678,7 +2712,7 @@ UBool Normalizer2Impl::getCanonStartSet(UChar32 c, UnicodeSet &set) const { uint16_t norm16=getRawNorm16(c); if(norm16==JAMO_L) { UChar32 syllable= - (UChar32)(Hangul::HANGUL_BASE+(c-Hangul::JAMO_L_BASE)*Hangul::JAMO_VT_COUNT); + static_cast<UChar32>(Hangul::HANGUL_BASE + (c - Hangul::JAMO_L_BASE) * Hangul::JAMO_VT_COUNT); set.add(syllable, syllable+Hangul::JAMO_VT_COUNT-1); } else { addComposites(getCompositionsList(norm16), set); @@ -2722,7 +2756,7 @@ unorm2_swap(const UDataSwapper *ds, pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - (1<=formatVersion0 && formatVersion0<=4) + (1<=formatVersion0 && formatVersion0<=5) )) { udata_printError(ds, "unorm2_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as Normalizer2 data\n", pInfo->dataFormat[0], pInfo->dataFormat[1], @@ -2741,8 +2775,10 @@ unorm2_swap(const UDataSwapper *ds, minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_YES+1; } else if(formatVersion0==2) { minIndexesLength=Normalizer2Impl::IX_MIN_YES_NO_MAPPINGS_ONLY+1; - } else { + } else if(formatVersion0<=4) { minIndexesLength=Normalizer2Impl::IX_MIN_LCCC_CP+1; + } else { + minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_NO_COMBINES_FWD+1; } if(length>=0) { diff --git a/deps/icu-small/source/common/normalizer2impl.h b/deps/icu-small/source/common/normalizer2impl.h index f5ede24fc20aed..94047336f223db 100644 --- a/deps/icu-small/source/common/normalizer2impl.h +++ b/deps/icu-small/source/common/normalizer2impl.h @@ -81,10 +81,10 @@ class U_COMMON_API Hangul { return 0<=c && c<HANGUL_COUNT && c%JAMO_T_COUNT==0; } static inline UBool isJamoL(UChar32 c) { - return (uint32_t)(c-JAMO_L_BASE)<JAMO_L_COUNT; + return static_cast<uint32_t>(c - JAMO_L_BASE) < JAMO_L_COUNT; } static inline UBool isJamoV(UChar32 c) { - return (uint32_t)(c-JAMO_V_BASE)<JAMO_V_COUNT; + return static_cast<uint32_t>(c - JAMO_V_BASE) < JAMO_V_COUNT; } static inline UBool isJamoT(UChar32 c) { int32_t t=c-JAMO_T_BASE; @@ -103,12 +103,12 @@ class U_COMMON_API Hangul { c-=HANGUL_BASE; UChar32 c2=c%JAMO_T_COUNT; c/=JAMO_T_COUNT; - buffer[0]=(char16_t)(JAMO_L_BASE+c/JAMO_V_COUNT); - buffer[1]=(char16_t)(JAMO_V_BASE+c%JAMO_V_COUNT); + buffer[0] = static_cast<char16_t>(JAMO_L_BASE + c / JAMO_V_COUNT); + buffer[1] = static_cast<char16_t>(JAMO_V_BASE + c % JAMO_V_COUNT); if(c2==0) { return 2; } else { - buffer[2]=(char16_t)(JAMO_T_BASE+c2); + buffer[2] = static_cast<char16_t>(JAMO_T_BASE + c2); return 3; } } @@ -123,11 +123,11 @@ class U_COMMON_API Hangul { UChar32 c2=c%JAMO_T_COUNT; if(c2==0) { c/=JAMO_T_COUNT; - buffer[0]=(char16_t)(JAMO_L_BASE+c/JAMO_V_COUNT); - buffer[1]=(char16_t)(JAMO_V_BASE+c%JAMO_V_COUNT); + buffer[0] = static_cast<char16_t>(JAMO_L_BASE + c / JAMO_V_COUNT); + buffer[1] = static_cast<char16_t>(JAMO_V_BASE + c % JAMO_V_COUNT); } else { - buffer[0]=(char16_t)(orig-c2); // LV syllable - buffer[1]=(char16_t)(JAMO_T_BASE+c2); + buffer[0] = static_cast<char16_t>(orig - c2); // LV syllable + buffer[1] = static_cast<char16_t>(JAMO_T_BASE + c2); } } private: @@ -141,19 +141,19 @@ class U_COMMON_API ReorderingBuffer : public UMemory { /** Constructs only; init() should be called. */ ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest) : impl(ni), str(dest), - start(NULL), reorderStart(NULL), limit(NULL), + start(nullptr), reorderStart(nullptr), limit(nullptr), remainingCapacity(0), lastCC(0) {} /** Constructs, removes the string contents, and initializes for a small initial capacity. */ ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest, UErrorCode &errorCode); ~ReorderingBuffer() { - if(start!=NULL) { - str.releaseBuffer((int32_t)(limit-start)); + if (start != nullptr) { + str.releaseBuffer(static_cast<int32_t>(limit - start)); } } UBool init(int32_t destCapacity, UErrorCode &errorCode); UBool isEmpty() const { return start==limit; } - int32_t length() const { return (int32_t)(limit-start); } + int32_t length() const { return static_cast<int32_t>(limit - start); } char16_t *getStart() { return start; } char16_t *getLimit() { return limit; } uint8_t getLastCC() const { return lastCC; } @@ -163,7 +163,7 @@ class U_COMMON_API ReorderingBuffer : public UMemory { UBool append(UChar32 c, uint8_t cc, UErrorCode &errorCode) { return (c<=0xffff) ? - appendBMP((char16_t)c, cc, errorCode) : + appendBMP(static_cast<char16_t>(c), cc, errorCode) : appendSupplementary(c, cc, errorCode); } UBool append(const char16_t *s, int32_t length, UBool isNFD, @@ -190,12 +190,12 @@ class U_COMMON_API ReorderingBuffer : public UMemory { void remove(); void removeSuffix(int32_t suffixLength); void setReorderingLimit(char16_t *newLimit) { - remainingCapacity+=(int32_t)(limit-newLimit); + remainingCapacity += static_cast<int32_t>(limit - newLimit); reorderStart=limit=newLimit; lastCC=0; } void copyReorderableSuffixTo(UnicodeString &s) const { - s.setTo(ConstChar16Ptr(reorderStart), (int32_t)(limit-reorderStart)); + s.setTo(ConstChar16Ptr(reorderStart), static_cast<int32_t>(limit - reorderStart)); } private: /* @@ -215,7 +215,7 @@ class U_COMMON_API ReorderingBuffer : public UMemory { void insert(UChar32 c, uint8_t cc); static void writeCodePoint(char16_t *p, UChar32 c) { if(c<=0xffff) { - *p=(char16_t)c; + *p = static_cast<char16_t>(c); } else { p[0]=U16_LEAD(c); p[1]=U16_TRAIL(c); @@ -241,47 +241,57 @@ class U_COMMON_API ReorderingBuffer : public UMemory { * Low-level implementation of the Unicode Normalization Algorithm. * For the data structure and details see the documentation at the end of * this normalizer2impl.h and in the design doc at - * https://icu.unicode.org/design/normalization/custom + * https://unicode-org.github.io/icu/design/normalization/custom.html */ -class U_COMMON_API Normalizer2Impl : public UObject { +class U_COMMON_API_CLASS Normalizer2Impl : public UObject { public: - Normalizer2Impl() : normTrie(NULL), fCanonIterData(NULL) { } - virtual ~Normalizer2Impl(); + U_COMMON_API Normalizer2Impl() : normTrie(nullptr), fCanonIterData(nullptr) {} + U_COMMON_API virtual ~Normalizer2Impl(); - void init(const int32_t *inIndexes, const UCPTrie *inTrie, - const uint16_t *inExtraData, const uint8_t *inSmallFCD); + U_COMMON_API void init(const int32_t* inIndexes, + const UCPTrie* inTrie, + const uint16_t* inExtraData, + const uint8_t* inSmallFCD); - void addLcccChars(UnicodeSet &set) const; - void addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const; - void addCanonIterPropertyStarts(const USetAdder *sa, UErrorCode &errorCode) const; + U_COMMON_API void addLcccChars(UnicodeSet& set) const; + U_COMMON_API void addPropertyStarts(const USetAdder* sa, UErrorCode& errorCode) const; + U_COMMON_API void addCanonIterPropertyStarts(const USetAdder* sa, UErrorCode& errorCode) const; // low-level properties ------------------------------------------------ *** - UBool ensureCanonIterData(UErrorCode &errorCode) const; + U_COMMON_API UBool ensureCanonIterData(UErrorCode& errorCode) const; // The trie stores values for lead surrogate code *units*. // Surrogate code *points* are inert. - uint16_t getNorm16(UChar32 c) const { + U_COMMON_API uint16_t getNorm16(UChar32 c) const { return U_IS_LEAD(c) ? static_cast<uint16_t>(INERT) : UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } - uint16_t getRawNorm16(UChar32 c) const { return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } + U_COMMON_API uint16_t getRawNorm16(UChar32 c) const { + return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); + } - UNormalizationCheckResult getCompQuickCheck(uint16_t norm16) const { + U_COMMON_API UNormalizationCheckResult getCompQuickCheck(uint16_t norm16) const { if(norm16<minNoNo || MIN_YES_YES_WITH_CC<=norm16) { return UNORM_YES; - } else if(minMaybeYes<=norm16) { + } else if(minMaybeNo<=norm16) { return UNORM_MAYBE; } else { return UNORM_NO; } } - UBool isAlgorithmicNoNo(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeYes; } - UBool isCompNo(uint16_t norm16) const { return minNoNo<=norm16 && norm16<minMaybeYes; } - UBool isDecompYes(uint16_t norm16) const { return norm16<minYesNo || minMaybeYes<=norm16; } + U_COMMON_API UBool isAlgorithmicNoNo(uint16_t norm16) const { + return limitNoNo <= norm16 && norm16 < minMaybeNo; + } + U_COMMON_API UBool isCompNo(uint16_t norm16) const { + return minNoNo <= norm16 && norm16 < minMaybeNo; + } + U_COMMON_API UBool isDecompYes(uint16_t norm16) const { + return norm16 < minYesNo || minMaybeYes <= norm16; + } - uint8_t getCC(uint16_t norm16) const { + U_COMMON_API uint8_t getCC(uint16_t norm16) const { if(norm16>=MIN_NORMAL_MAYBE_YES) { return getCCFromNormalYesOrMaybe(norm16); } @@ -290,15 +300,15 @@ class U_COMMON_API Normalizer2Impl : public UObject { } return getCCFromNoNo(norm16); } - static uint8_t getCCFromNormalYesOrMaybe(uint16_t norm16) { - return (uint8_t)(norm16 >> OFFSET_SHIFT); + U_COMMON_API static uint8_t getCCFromNormalYesOrMaybe(uint16_t norm16) { + return static_cast<uint8_t>(norm16 >> OFFSET_SHIFT); } - static uint8_t getCCFromYesOrMaybe(uint16_t norm16) { + U_COMMON_API static uint8_t getCCFromYesOrMaybeYes(uint16_t norm16) { return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0; } - uint8_t getCCFromYesOrMaybeCP(UChar32 c) const { + U_COMMON_API uint8_t getCCFromYesOrMaybeYesCP(UChar32 c) const { if (c < minCompNoMaybeCP) { return 0; } - return getCCFromYesOrMaybe(getNorm16(c)); + return getCCFromYesOrMaybeYes(getNorm16(c)); } /** @@ -306,7 +316,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @param c A Unicode code point. * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ - uint16_t getFCD16(UChar32 c) const { + U_COMMON_API uint16_t getFCD16(UChar32 c) const { if(c<minDecompNoCP) { return 0; } else if(c<=0xffff) { @@ -322,7 +332,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @param limit The end of the string, or NULL. * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ - uint16_t nextFCD16(const char16_t *&s, const char16_t *limit) const { + U_COMMON_API uint16_t nextFCD16(const char16_t*& s, const char16_t* limit) const { UChar32 c=*s++; if(c<minDecompNoCP || !singleLeadMightHaveNonZeroFCD16(c)) { return 0; @@ -340,7 +350,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @param s A valid pointer into a string. Requires start<s. * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ - uint16_t previousFCD16(const char16_t *start, const char16_t *&s) const { + U_COMMON_API uint16_t previousFCD16(const char16_t* start, const char16_t*& s) const { UChar32 c=*--s; if(c<minDecompNoCP) { return 0; @@ -360,14 +370,16 @@ class U_COMMON_API Normalizer2Impl : public UObject { } /** Returns true if the single-or-lead code unit c might have non-zero FCD data. */ - UBool singleLeadMightHaveNonZeroFCD16(UChar32 lead) const { + U_COMMON_API UBool singleLeadMightHaveNonZeroFCD16(UChar32 lead) const { // 0<=lead<=0xffff uint8_t bits=smallFCD[lead>>8]; if(bits==0) { return false; } - return (UBool)((bits>>((lead>>5)&7))&1); + return (bits >> ((lead >> 5) & 7)) & 1; } /** Returns the FCD value from the regular normalization data. */ - uint16_t getFCD16FromNormData(UChar32 c) const; + U_COMMON_API uint16_t getFCD16FromNormData(UChar32 c) const; + + U_COMMON_API uint16_t getFCD16FromMaybeOrNonZeroCC(uint16_t norm16) const; /** * Gets the decomposition for one code point. @@ -376,7 +388,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @param length out-only, takes the length of the decomposition, if any * @return pointer to the decomposition, or NULL if none */ - const char16_t *getDecomposition(UChar32 c, char16_t buffer[4], int32_t &length) const; + U_COMMON_API const char16_t* getDecomposition(UChar32 c, char16_t buffer[4], int32_t& length) const; /** * Gets the raw decomposition for one code point. @@ -385,12 +397,14 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @param length out-only, takes the length of the decomposition, if any * @return pointer to the decomposition, or NULL if none */ - const char16_t *getRawDecomposition(UChar32 c, char16_t buffer[30], int32_t &length) const; + U_COMMON_API const char16_t* getRawDecomposition(UChar32 c, + char16_t buffer[30], + int32_t& length) const; - UChar32 composePair(UChar32 a, UChar32 b) const; + U_COMMON_API UChar32 composePair(UChar32 a, UChar32 b) const; - UBool isCanonSegmentStarter(UChar32 c) const; - UBool getCanonStartSet(UChar32 c, UnicodeSet &set) const; + U_COMMON_API UBool isCanonSegmentStarter(UChar32 c) const; + U_COMMON_API UBool getCanonStartSet(UChar32 c, UnicodeSet& set) const; enum { // Fixed norm16 values. @@ -450,7 +464,13 @@ class U_COMMON_API Normalizer2Impl : public UObject { IX_MIN_LCCC_CP, IX_RESERVED19, - IX_COUNT + + /** Two-way mappings; each starts with a character that combines backward. */ + IX_MIN_MAYBE_NO, // 20 + /** Two-way mappings & compositions. */ + IX_MIN_MAYBE_NO_COMBINES_FWD, + + IX_COUNT // 22 }; enum { @@ -473,86 +493,107 @@ class U_COMMON_API Normalizer2Impl : public UObject { // higher-level functionality ------------------------------------------ *** // NFD without an NFD Normalizer2 instance. - UnicodeString &decompose(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const; + U_COMMON_API UnicodeString& decompose(const UnicodeString& src, + UnicodeString& dest, + UErrorCode& errorCode) const; /** * Decomposes [src, limit[ and writes the result to dest. * limit can be NULL if src is NUL-terminated. * destLengthEstimate is the initial dest buffer capacity and can be -1. */ - void decompose(const char16_t *src, const char16_t *limit, - UnicodeString &dest, int32_t destLengthEstimate, - UErrorCode &errorCode) const; - - const char16_t *decompose(const char16_t *src, const char16_t *limit, - ReorderingBuffer *buffer, UErrorCode &errorCode) const; - void decomposeAndAppend(const char16_t *src, const char16_t *limit, - UBool doDecompose, - UnicodeString &safeMiddle, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const; + U_COMMON_API void decompose(const char16_t* src, + const char16_t* limit, + UnicodeString& dest, + int32_t destLengthEstimate, + UErrorCode& errorCode) const; + + U_COMMON_API const char16_t* decompose(const char16_t* src, + const char16_t* limit, + ReorderingBuffer* buffer, + UErrorCode& errorCode) const; + U_COMMON_API void decomposeAndAppend(const char16_t* src, + const char16_t* limit, + UBool doDecompose, + UnicodeString& safeMiddle, + ReorderingBuffer& buffer, + UErrorCode& errorCode) const; /** sink==nullptr: isNormalized()/spanQuickCheckYes() */ - const uint8_t *decomposeUTF8(uint32_t options, - const uint8_t *src, const uint8_t *limit, - ByteSink *sink, Edits *edits, UErrorCode &errorCode) const; - - UBool compose(const char16_t *src, const char16_t *limit, - UBool onlyContiguous, - UBool doCompose, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const; - const char16_t *composeQuickCheck(const char16_t *src, const char16_t *limit, - UBool onlyContiguous, - UNormalizationCheckResult *pQCResult) const; - void composeAndAppend(const char16_t *src, const char16_t *limit, - UBool doCompose, - UBool onlyContiguous, - UnicodeString &safeMiddle, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const; + U_COMMON_API const uint8_t* decomposeUTF8(uint32_t options, + const uint8_t* src, + const uint8_t* limit, + ByteSink* sink, + Edits* edits, + UErrorCode& errorCode) const; + + U_COMMON_API UBool compose(const char16_t* src, + const char16_t* limit, + UBool onlyContiguous, + UBool doCompose, + ReorderingBuffer& buffer, + UErrorCode& errorCode) const; + U_COMMON_API const char16_t* composeQuickCheck(const char16_t* src, + const char16_t* limit, + UBool onlyContiguous, + UNormalizationCheckResult* pQCResult) const; + U_COMMON_API void composeAndAppend(const char16_t* src, + const char16_t* limit, + UBool doCompose, + UBool onlyContiguous, + UnicodeString& safeMiddle, + ReorderingBuffer& buffer, + UErrorCode& errorCode) const; /** sink==nullptr: isNormalized() */ - UBool composeUTF8(uint32_t options, UBool onlyContiguous, - const uint8_t *src, const uint8_t *limit, - ByteSink *sink, icu::Edits *edits, UErrorCode &errorCode) const; - - const char16_t *makeFCD(const char16_t *src, const char16_t *limit, - ReorderingBuffer *buffer, UErrorCode &errorCode) const; - void makeFCDAndAppend(const char16_t *src, const char16_t *limit, - UBool doMakeFCD, - UnicodeString &safeMiddle, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const; - - UBool hasDecompBoundaryBefore(UChar32 c) const; - UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const; - UBool hasDecompBoundaryAfter(UChar32 c) const; - UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const; - UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); } - - UBool hasCompBoundaryBefore(UChar32 c) const { + U_COMMON_API UBool composeUTF8(uint32_t options, + UBool onlyContiguous, + const uint8_t* src, + const uint8_t* limit, + ByteSink* sink, + icu::Edits* edits, + UErrorCode& errorCode) const; + + U_COMMON_API const char16_t* makeFCD(const char16_t* src, + const char16_t* limit, + ReorderingBuffer* buffer, + UErrorCode& errorCode) const; + U_COMMON_API void makeFCDAndAppend(const char16_t* src, + const char16_t* limit, + UBool doMakeFCD, + UnicodeString& safeMiddle, + ReorderingBuffer& buffer, + UErrorCode& errorCode) const; + + U_COMMON_API UBool hasDecompBoundaryBefore(UChar32 c) const; + U_COMMON_API UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const; + U_COMMON_API UBool hasDecompBoundaryAfter(UChar32 c) const; + U_COMMON_API UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const; + U_COMMON_API UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); } + + U_COMMON_API UBool hasCompBoundaryBefore(UChar32 c) const { return c<minCompNoMaybeCP || norm16HasCompBoundaryBefore(getNorm16(c)); } - UBool hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous) const { + U_COMMON_API UBool hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous) const { return norm16HasCompBoundaryAfter(getNorm16(c), onlyContiguous); } - UBool isCompInert(UChar32 c, UBool onlyContiguous) const { + U_COMMON_API UBool isCompInert(UChar32 c, UBool onlyContiguous) const { uint16_t norm16=getNorm16(c); return isCompYesAndZeroCC(norm16) && (norm16 & HAS_COMP_BOUNDARY_AFTER) != 0 && - (!onlyContiguous || isInert(norm16) || *getMapping(norm16) <= 0x1ff); + (!onlyContiguous || isInert(norm16) || *getDataForYesOrNo(norm16) <= 0x1ff); + // The last check fetches the mapping's first unit and checks tccc<=1. } - UBool hasFCDBoundaryBefore(UChar32 c) const { return hasDecompBoundaryBefore(c); } - UBool hasFCDBoundaryAfter(UChar32 c) const { return hasDecompBoundaryAfter(c); } - UBool isFCDInert(UChar32 c) const { return getFCD16(c)<=1; } -private: + U_COMMON_API UBool hasFCDBoundaryBefore(UChar32 c) const { return hasDecompBoundaryBefore(c); } + U_COMMON_API UBool hasFCDBoundaryAfter(UChar32 c) const { return hasDecompBoundaryAfter(c); } + U_COMMON_API UBool isFCDInert(UChar32 c) const { return getFCD16(c) <= 1; } + + private: friend class InitCanonIterData; friend class LcccContext; - UBool isMaybe(uint16_t norm16) const { return minMaybeYes<=norm16 && norm16<=JAMO_VT; } - UBool isMaybeOrNonZeroCC(uint16_t norm16) const { return norm16>=minMaybeYes; } + UBool isMaybe(uint16_t norm16) const { return minMaybeNo<=norm16 && norm16<=JAMO_VT; } + UBool isMaybeYesOrNonZeroCC(uint16_t norm16) const { return norm16>=minMaybeYes; } static UBool isInert(uint16_t norm16) { return norm16==INERT; } static UBool isJamoL(uint16_t norm16) { return norm16==JAMO_L; } static UBool isJamoVT(uint16_t norm16) { return norm16==JAMO_VT; } @@ -566,7 +607,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { // return norm16>=MIN_YES_YES_WITH_CC || norm16<minNoNo; // } // UBool isCompYesOrMaybe(uint16_t norm16) const { - // return norm16<minNoNo || minMaybeYes<=norm16; + // return norm16<minNoNo || minMaybeNo<=norm16; // } // UBool hasZeroCCFromDecompYes(uint16_t norm16) const { // return norm16<=MIN_NORMAL_MAYBE_YES || norm16==JAMO_VT; @@ -579,12 +620,12 @@ class U_COMMON_API Normalizer2Impl : public UObject { /** * A little faster and simpler than isDecompYesAndZeroCC() but does not include * the MaybeYes which combine-forward and have ccc=0. - * (Standard Unicode 10 normalization does not have such characters.) */ UBool isMostDecompYesAndZeroCC(uint16_t norm16) const { return norm16<minYesNo || norm16==MIN_NORMAL_MAYBE_YES || norm16==JAMO_VT; } - UBool isDecompNoAlgorithmic(uint16_t norm16) const { return norm16>=limitNoNo; } + /** Since formatVersion 5: same as isAlgorithmicNoNo() */ + UBool isDecompNoAlgorithmic(uint16_t norm16) const { return limitNoNo<=norm16 && norm16<minMaybeNo; } // For use with isCompYes(). // Perhaps the compiler can combine the two tests for MIN_YES_YES_WITH_CC. @@ -592,9 +633,9 @@ class U_COMMON_API Normalizer2Impl : public UObject { // return norm16>=MIN_YES_YES_WITH_CC ? getCCFromNormalYesOrMaybe(norm16) : 0; // } uint8_t getCCFromNoNo(uint16_t norm16) const { - const uint16_t *mapping=getMapping(norm16); + const uint16_t *mapping=getDataForYesOrNo(norm16); if(*mapping&MAPPING_HAS_CCC_LCCC_WORD) { - return (uint8_t)*(mapping-1); + return static_cast<uint8_t>(*(mapping - 1)); } else { return 0; } @@ -605,7 +646,7 @@ class U_COMMON_API Normalizer2Impl : public UObject { return 0; // yesYes and Hangul LV have ccc=tccc=0 } else { // For Hangul LVT we harmlessly fetch a firstUnit with tccc=0 here. - return (uint8_t)(*getMapping(norm16)>>8); // tccc from yesNo + return static_cast<uint8_t>(*getDataForYesOrNo(norm16) >> 8); // tccc from yesNo } } uint8_t getPreviousTrailCC(const char16_t *start, const char16_t *p) const; @@ -619,28 +660,33 @@ class U_COMMON_API Normalizer2Impl : public UObject { return (norm16>>DELTA_SHIFT)-centerNoNoDelta; } - // Requires minYesNo<norm16<limitNoNo. - const uint16_t *getMapping(uint16_t norm16) const { return extraData+(norm16>>OFFSET_SHIFT); } + const uint16_t *getDataForYesOrNo(uint16_t norm16) const { + return extraData+(norm16>>OFFSET_SHIFT); + } + const uint16_t *getDataForMaybe(uint16_t norm16) const { + return extraData+((norm16-minMaybeNo+limitNoNo)>>OFFSET_SHIFT); + } + const uint16_t *getData(uint16_t norm16) const { + if(norm16>=minMaybeNo) { + norm16=norm16-minMaybeNo+limitNoNo; + } + return extraData+(norm16>>OFFSET_SHIFT); + } const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const { if(norm16<JAMO_L || MIN_NORMAL_MAYBE_YES<=norm16) { - return NULL; - } else if(norm16<minMaybeYes) { - return getMapping(norm16); // for yesYes; if Jamo L: harmless empty list + return nullptr; } else { - return maybeYesCompositions+norm16-minMaybeYes; + // if yesYes: if Jamo L: harmless empty list + return getData(norm16); } } const uint16_t *getCompositionsListForComposite(uint16_t norm16) const { // A composite has both mapping & compositions list. - const uint16_t *list=getMapping(norm16); + const uint16_t *list=getData(norm16); return list+ // mapping pointer 1+ // +1 to skip the first unit with the mapping length (*list&MAPPING_LENGTH_MASK); // + mapping length } - const uint16_t *getCompositionsListForMaybe(uint16_t norm16) const { - // minMaybeYes<=norm16<MIN_NORMAL_MAYBE_YES - return maybeYesCompositions+((norm16-minMaybeYes)>>OFFSET_SHIFT); - } /** * @param c code point must have compositions * @return compositions list pointer @@ -692,11 +738,13 @@ class U_COMMON_API Normalizer2Impl : public UObject { /** For FCC: Given norm16 HAS_COMP_BOUNDARY_AFTER, does it have tccc<=1? */ UBool isTrailCC01ForCompBoundaryAfter(uint16_t norm16) const { return isInert(norm16) || (isDecompNoAlgorithmic(norm16) ? - (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1 : *getMapping(norm16) <= 0x1ff); + (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1 : *getDataForYesOrNo(norm16) <= 0x1ff); } - const char16_t *findPreviousCompBoundary(const char16_t *start, const char16_t *p, UBool onlyContiguous) const; - const char16_t *findNextCompBoundary(const char16_t *p, const char16_t *limit, UBool onlyContiguous) const; + const char16_t *findPreviousCompBoundary(const char16_t *start, const char16_t *p, + UBool onlyContiguous) const; + const char16_t *findNextCompBoundary(const char16_t *p, const char16_t *limit, + UBool onlyContiguous) const; const char16_t *findPreviousFCDBoundary(const char16_t *start, const char16_t *p) const; const char16_t *findNextFCDBoundary(const char16_t *p, const char16_t *limit) const; @@ -723,11 +771,12 @@ class U_COMMON_API Normalizer2Impl : public UObject { uint16_t minNoNoEmpty; uint16_t limitNoNo; uint16_t centerNoNoDelta; + uint16_t minMaybeNo; + uint16_t minMaybeNoCombinesFwd; uint16_t minMaybeYes; const UCPTrie *normTrie; - const uint16_t *maybeYesCompositions; - const uint16_t *extraData; // mappings and/or compositions for yesYes, yesNo & noNo characters + const uint16_t *extraData; // mappings and/or compositions const uint8_t *smallFCD; // [0x100] one bit per 32 BMP code points, set if any FCD!=0 UInitOnce fCanonIterDataInitOnce {}; @@ -785,7 +834,7 @@ unorm_getFCD16(UChar32 c); /** * Format of Normalizer2 .nrm data files. - * Format version 4.0. + * Format version 5.0. * * Normalizer2 .nrm data files provide data for the Unicode Normalization algorithms. * ICU ships with data files for standard Unicode Normalization Forms @@ -807,7 +856,7 @@ unorm_getFCD16(UChar32 c); * Constants are defined as enum values of the Normalizer2Impl class. * * Many details of the data structures are described in the design doc - * which is at https://icu.unicode.org/design/normalization/custom + * which is at https://unicode-org.github.io/icu/design/normalization/custom.html * * int32_t indexes[indexesLength]; -- indexesLength=indexes[IX_NORM_TRIE_OFFSET]/4; * @@ -829,7 +878,9 @@ unorm_getFCD16(UChar32 c); * * The next eight indexes are thresholds of 16-bit trie values for ranges of * values indicating multiple normalization properties. - * They are listed here in threshold order, not in the order they are stored in the indexes. + * Format version 5 adds the two minMaybeNo* threshold indexes. + * The thresholds are listed here in threshold order, + * not in the order they are stored in the indexes. * minYesNo=indexes[IX_MIN_YES_NO]; * minYesNoMappingsOnly=indexes[IX_MIN_YES_NO_MAPPINGS_ONLY]; * minNoNo=indexes[IX_MIN_NO_NO]; @@ -837,6 +888,8 @@ unorm_getFCD16(UChar32 c); * minNoNoCompNoMaybeCC=indexes[IX_MIN_NO_NO_COMP_NO_MAYBE_CC]; * minNoNoEmpty=indexes[IX_MIN_NO_NO_EMPTY]; * limitNoNo=indexes[IX_LIMIT_NO_NO]; + * minMaybeNo=indexes[IX_MIN_MAYBE_NO]; + * minMaybeNoCombinesFwd=indexes[IX_MIN_MAYBE_NO_COMBINES_FWD]; * minMaybeYes=indexes[IX_MIN_MAYBE_YES]; * See the normTrie description below and the design doc for details. * @@ -845,13 +898,14 @@ unorm_getFCD16(UChar32 c); * The trie holds the main normalization data. Each code point is mapped to a 16-bit value. * Rather than using independent bits in the value (which would require more than 16 bits), * information is extracted primarily via range checks. - * Except, format version 3 uses bit 0 for hasCompBoundaryAfter(). + * Except, format version 3+ uses bit 0 for hasCompBoundaryAfter(). * For example, a 16-bit value norm16 in the range minYesNo<=norm16<minNoNo * means that the character has NF*C_QC=Yes and NF*D_QC=No properties, * which means it has a two-way (round-trip) decomposition mapping. - * Values in the range 2<=norm16<limitNoNo are also directly indexes into the extraData + * Values in the ranges 2<=norm16<limitNoNo and minMaybeNo<=norm16<minMaybeYes + * are also directly indexes into the extraData * pointing to mappings, compositions lists, or both. - * Value norm16==INERT (0 in versions 1 & 2, 1 in version 3) + * Value norm16==INERT (0 in versions 1 & 2, 1 in version 3+) * means that the character is normalization-inert, that is, * it does not have a mapping, does not participate in composition, has a zero * canonical combining class, and forms a boundary where text before it and after it @@ -870,33 +924,38 @@ unorm_getFCD16(UChar32 c); * When the lead surrogate unit's value exceeds the quick check minimum during processing, * the properties for the full supplementary code point need to be looked up. * - * uint16_t maybeYesCompositions[MIN_NORMAL_MAYBE_YES-minMaybeYes]; * uint16_t extraData[]; * - * There is only one byte offset for the end of these two arrays. - * The split between them is given by the constant and variable mentioned above. - * In version 3, the difference must be shifted right by OFFSET_SHIFT. - * - * The maybeYesCompositions array contains compositions lists for characters that - * combine both forward (as starters in composition pairs) - * and backward (as trailing characters in composition pairs). - * Such characters do not occur in Unicode 5.2 but are allowed by - * the Unicode Normalization algorithms. - * If there are no such characters, then minMaybeYes==MIN_NORMAL_MAYBE_YES - * and the maybeYesCompositions array is empty. - * If there are such characters, then minMaybeYes is subtracted from their norm16 values - * to get the index into this array. - * - * The extraData array contains compositions lists for "YesYes" characters, - * followed by mappings and optional compositions lists for "YesNo" characters, - * followed by only mappings for "NoNo" characters. - * (Referring to pairs of NFC/NFD quick check values.) - * The norm16 values of those characters are directly indexes into the extraData array. - * In version 3, the norm16 values must be shifted right by OFFSET_SHIFT + * The extraData array contains many per-character data sections. + * Each section contains mappings and/or composition lists. + * The norm16 value of each character that has such data is directly an index to + * a section of the extraData array. + * + * In version 3+, the norm16 values must be shifted right by OFFSET_SHIFT * for accessing extraData. * * The data structures for compositions lists and mappings are described in the design doc. * + * In version 4 and below, the composition lists for MaybeYes characters were stored before + * the data for other characters. + * This sub-array had a length of MIN_NORMAL_MAYBE_YES-minMaybeYes. + * In version 3 & 4, the difference must be shifted right by OFFSET_SHIFT. + * + * In version 5, the data for MaybeNo and MaybeYes characters is stored after + * the data for other characters. + * + * If there are no MaybeNo and no MaybeYes characters, + * then minMaybeYes==minMaybeNo==MIN_NORMAL_MAYBE_YES. + * If there are such characters, then minMaybeNo is subtracted from their norm16 values + * to get the index into the extraData. + * In version 4 and below, the data index for Yes* and No* characters needs to be + * offset by the length of the MaybeYes data. + * In version 5, the data index for Maybe* characters needs to be offset by limitNoNo. + * + * Version 5 is the first to support MaybeNo characters, and + * adds the minMaybeNo and minMaybeNoCombinesFwd thresholds and + * the corresponding sections of the extraData. + * * uint8_t smallFCD[0x100]; -- new in format version 2 * * This is a bit set to help speed up FCD value lookups in the absence of a full @@ -936,7 +995,7 @@ unorm_getFCD16(UChar32 c); * to make room for two bits (three values) indicating whether the tccc is 0, 1, or greater. * See DELTA_TCCC_MASK etc. * This helps with fetching tccc/FCD values and FCC hasCompBoundaryAfter(). - * minMaybeYes is 8-aligned so that the DELTA_TCCC_MASK bits can be tested directly. + * minMaybeNo is 8-aligned so that the DELTA_TCCC_MASK bits can be tested directly. * * - Algorithmic mappings are only used for mapping to "comp yes and ccc=0" characters, * and ASCII characters are mapped algorithmically only to other ASCII characters. @@ -982,6 +1041,23 @@ unorm_getFCD16(UChar32 c); * gennorm2 now has to reject mappings for surrogate code points. * UTS #46 maps unpaired surrogates to U+FFFD in code rather than via its * custom normalization data file. + * + * Changes from format version 4 to format version 5 (ICU 76) ------------------ + * + * Unicode 16 adds the first MaybeYes characters which combine both backward and forward, + * taking this formerly theoretical data structure into reality. + * + * Unicode 16 also adds the first characters that have two-way mappings whose first characters + * combine backward. In order for normalization and the quick check to work properly, + * these composite characters also must be marked as NFC_QC=Maybe, + * corresponding to "combines back", although the composites themselves do not combine backward. + * Format version 5 adds two new ranges between "algorithmic NoNo" and MaybeYes, + * with thresholds minMaybeNo and minMaybeNoCombinesFwd, + * and indexes[IX_MIN_MAYBE_NO] and indexes[IX_MIN_MAYBE_NO_COMBINES_FWD], + * and corresponding mappings and composition lists in the extraData. + * + * Format version 5 moves the data for Maybe* characters from the start of the extraData array + * to its end. */ #endif /* !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/common/patternprops.cpp b/deps/icu-small/source/common/patternprops.cpp index 9922683cda57a6..782d3366f93d61 100644 --- a/deps/icu-small/source/common/patternprops.cpp +++ b/deps/icu-small/source/common/patternprops.cpp @@ -120,12 +120,12 @@ PatternProps::isSyntax(UChar32 c) { if(c<0) { return false; } else if(c<=0xff) { - return (UBool)(latin1[c]>>1)&1; + return (latin1[c] >> 1) & 1; } else if(c<0x2010) { return false; } else if(c<=0x3030) { uint32_t bits=syntax2000[index2000[(c-0x2000)>>5]]; - return (UBool)((bits>>(c&0x1f))&1); + return (bits >> (c & 0x1f)) & 1; } else if(0xfd3e<=c && c<=0xfe46) { return c<=0xfd3f || 0xfe45<=c; } else { @@ -138,12 +138,12 @@ PatternProps::isSyntaxOrWhiteSpace(UChar32 c) { if(c<0) { return false; } else if(c<=0xff) { - return (UBool)(latin1[c]&1); + return latin1[c] & 1; } else if(c<0x200e) { return false; } else if(c<=0x3030) { uint32_t bits=syntaxOrWhiteSpace2000[index2000[(c-0x2000)>>5]]; - return (UBool)((bits>>(c&0x1f))&1); + return (bits >> (c & 0x1f)) & 1; } else if(0xfd3e<=c && c<=0xfe46) { return c<=0xfd3f || 0xfe45<=c; } else { @@ -156,7 +156,7 @@ PatternProps::isWhiteSpace(UChar32 c) { if(c<0) { return false; } else if(c<=0xff) { - return (UBool)(latin1[c]>>2)&1; + return (latin1[c] >> 2) & 1; } else if(0x200e<=c && c<=0x2029) { return c<=0x200f || 0x2028<=c; } else { diff --git a/deps/icu-small/source/common/propname.cpp b/deps/icu-small/source/common/propname.cpp index 45062bfbd9310d..640578c5ee3717 100644 --- a/deps/icu-small/source/common/propname.cpp +++ b/deps/icu-small/source/common/propname.cpp @@ -43,7 +43,7 @@ getASCIIPropertyNameChar(const char *name) { ) {} if(c!=0) { - return (i<<8)|(uint8_t)uprv_asciitolower((char)c); + return (i << 8) | static_cast<uint8_t>(uprv_asciitolower(c)); } else { return i<<8; } @@ -66,7 +66,7 @@ getEBCDICPropertyNameChar(const char *name) { ) {} if(c!=0) { - return (i<<8)|(uint8_t)uprv_ebcdictolower((char)c); + return (i << 8) | static_cast<uint8_t>(uprv_ebcdictolower(c)); } else { return i<<8; } @@ -231,7 +231,7 @@ UBool PropNameData::containsName(BytesTrie &trie, const char *name) { if(!USTRINGTRIE_HAS_NEXT(result)) { return false; } - result=trie.next((uint8_t)c); + result = trie.next(static_cast<uint8_t>(c)); } return USTRINGTRIE_HAS_VALUE(result); } diff --git a/deps/icu-small/source/common/propname_data.h b/deps/icu-small/source/common/propname_data.h index 7bdbe8ec43014d..99831d2c59c49b 100644 --- a/deps/icu-small/source/common/propname_data.h +++ b/deps/icu-small/source/common/propname_data.h @@ -11,103 +11,108 @@ U_NAMESPACE_BEGIN -const int32_t PropNameData::indexes[8]={0x20,0x1690,0x5337,0xae61,0xae61,0xae61,0x31,0}; +const int32_t PropNameData::indexes[8]={0x20,0x17b4,0x5761,0xb7ba,0xb7ba,0xb7ba,0x31,0}; -const int32_t PropNameData::valueMaps[1436]={ -6,0,0x4b,0,0xf7,0x368,0xf7,0x37e,0xf7,0x393,0xf7,0x3a9,0xf7,0x3b4,0xf7,0x3d5, -0xf7,0x3e5,0xf7,0x3f4,0xf7,0x402,0xf7,0x426,0xf7,0x43d,0xf7,0x455,0xf7,0x46c,0xf7,0x47b, -0xf7,0x48a,0xf7,0x49b,0xf7,0x4a9,0xf7,0x4bb,0xf7,0x4d5,0xf7,0x4f0,0xf7,0x505,0xf7,0x522, -0xf7,0x533,0xf7,0x53e,0xf7,0x55d,0xf7,0x573,0xf7,0x584,0xf7,0x594,0xf7,0x5af,0xf7,0x5c8, -0xf7,0x5d9,0xf7,0x5f3,0xf7,0x606,0xf7,0x616,0xf7,0x630,0xf7,0x649,0xf7,0x660,0xf7,0x674, -0xf7,0x68a,0xf7,0x69e,0xf7,0x6b4,0xf7,0x6ce,0xf7,0x6e6,0xf7,0x702,0xf7,0x70a,0xf7,0x712, -0xf7,0x71a,0xf7,0x722,0xf7,0x72b,0xf7,0x738,0xf7,0x74b,0xf7,0x768,0xf7,0x785,0xf7,0x7a2, -0xf7,0x7c0,0xf7,0x7de,0xf7,0x802,0xf7,0x80f,0xf7,0x829,0xf7,0x83e,0xf7,0x859,0xf7,0x870, -0xf7,0x887,0xf7,0x8a9,0xf7,0x8c8,0xf7,0x8e1,0xf7,0x90e,0xf7,0x947,0xf7,0x978,0xf7,0x9a7, -0xf7,0x9d6,0xf7,0x9eb,0xf7,0xa04,0xf7,0xa2f,0xf7,0x1000,0x1019,0xa60,0x173,0xc80,0x18e,0x331c, -0xfd,0x333b,0x2db,0x3479,0x2f1,0x34d3,0x2fb,0x3730,0x31d,0x405b,0x389,0x40cb,0x393,0x43b0,0x3c7,0x43ee, -0x3cf,0x4f33,0x49b,0x4fb1,0x4a5,0x4fd6,0x4ab,0x4ff0,0x4b1,0x5011,0x4b8,0x502b,0xfd,0x5050,0xfd,0x5076, -0x4bf,0x5120,0x4d5,0x5199,0x4e8,0x524b,0x503,0x5282,0x50a,0x5462,0x51e,0x58e2,0x546,0x2000,0x2001,0x5941, -0x54e,0x3000,0x3001,0x59cd,0,0x4000,0x400e,0x59df,0,0x59e8,0,0x5a02,0,0x5a13,0,0x5a24, -0,0x5a3a,0,0x5a43,0,0x5a60,0,0x5a7e,0,0x5a9c,0,0x5aba,0,0x5ad0,0,0x5ae4, -0,0x5afa,0,0x7000,0x7001,0x5b13,0,0x87a,0x12,0,1,0x12,0x20,0x898,0x4a,0, -1,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x14, -0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24, -0x54,0x5b,0x67,0x6b,0x76,0x7a,0x81,0x82,0x84,0x85,0xc8,0xca,0xd6,0xd8,0xda,0xdc, -0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xe9,0xea,0xf0,0x2e,0x40,0x4c,0x5e,0x68,0x79,0x84, -0x91,0x9e,0xab,0xb8,0xc5,0xd2,0xdf,0xec,0xf9,0x106,0x113,0x120,0x12d,0x13a,0x147,0x154, -0x161,0x16e,0x17b,0x188,0x195,0x1a2,0x1af,0x1bc,0x1c9,0x1d6,0x1e3,0x1f0,0x1fd,0x20c,0x21b,0x22a, -0x239,0x248,0x257,0x266,0x275,0x28f,0x2a3,0x2b7,0x2d2,0x2e1,0x2ea,0x2fa,0x302,0x30b,0x31a,0x323, -0x333,0x344,0x355,0xa39,1,0,0x17,0xa6f,0xa80,0xa91,0xaa5,0xabc,0xad4,0xae6,0xafb,0xb12, -0xb27,0xb37,0xb49,0xb66,0xb82,0xb94,0xbb1,0xbcd,0xbe9,0xbfe,0xc13,0xc2d,0xc48,0xc63,0xbdb,1, -0,0x149,0xc8b,0xc98,0xcab,0xcd3,0xcf1,0xd0f,0xd27,0xd52,0xd7c,0xd94,0xda7,0xdba,0xdc9,0xdd8, -0xde7,0xdf6,0xe0d,0xe1e,0xe31,0xe44,0xe51,0xe5e,0xe6d,0xe7e,0xe93,0xea4,0xeaf,0xeb8,0xec9,0xeda, -0xeed,0xeff,0xf12,0xf25,0xf64,0xf71,0xf7e,0xf8b,0xfa0,0xfd0,0xfea,0x100b,0x1036,0x1059,0x10b7,0x10de, -0x10f9,0x1108,0x112f,0x1157,0x117a,0x119d,0x11c7,0x11e0,0x11ff,0x1222,0x1246,0x1259,0x1273,0x129d,0x12b5,0x12dd, -0x1306,0x1319,0x132c,0x133f,0x1366,0x1375,0x1395,0x13c3,0x13e1,0x140f,0x142b,0x1446,0x145f,0x1478,0x1499,0x14c9, -0x14e8,0x150a,0x153e,0x156b,0x15b0,0x15d1,0x15fb,0x161c,0x1645,0x1658,0x168b,0x16a2,0x16b1,0x16c2,0x16ed,0x1704, -0x1735,0x1763,0x17a6,0x17b1,0x17ea,0x17fb,0x180c,0x1819,0x182c,0x1866,0x188a,0x18ae,0x18e8,0x1920,0x194b,0x1963, -0x198f,0x19bb,0x19c8,0x19d7,0x19f4,0x1a16,0x1a44,0x1a64,0x1a8b,0x1ab2,0x1ad1,0x1ae4,0x1af5,0x1b06,0x1b2b,0x1b50, -0x1b77,0x1bab,0x1bd8,0x1bf6,0x1c09,0x1c22,0x1c5b,0x1c6a,0x1c8a,0x1cac,0x1cce,0x1ce5,0x1cfc,0x1d29,0x1d42,0x1d5b, -0x1d8c,0x1db6,0x1dd1,0x1de4,0x1e03,0x1e0c,0x1e1f,0x1e3d,0x1e5b,0x1e6e,0x1e85,0x1e9a,0x1ecf,0x1ef3,0x1f08,0x1f17, -0x1f2a,0x1f4e,0x1f57,0x1f7b,0x1f92,0x1fa5,0x1fb4,0x1fbf,0x1fe0,0x1ff8,0x2007,0x2016,0x2025,0x203c,0x2051,0x2066, -0x209f,0x20b2,0x20ce,0x20d9,0x20e6,0x2114,0x2138,0x215b,0x216e,0x2190,0x21a3,0x21be,0x21e1,0x2204,0x2229,0x223a, -0x2269,0x2296,0x22ad,0x22c8,0x22d7,0x2302,0x233a,0x2374,0x23a2,0x23b3,0x23c0,0x23e4,0x23f3,0x240f,0x2429,0x2446, -0x247e,0x2493,0x24c0,0x24df,0x250d,0x252d,0x2561,0x2570,0x259a,0x25bd,0x25e8,0x25f3,0x2604,0x261f,0x2643,0x2650, -0x2665,0x268c,0x26b7,0x26ee,0x2701,0x2712,0x2742,0x2753,0x2762,0x2777,0x2795,0x27a8,0x27bb,0x27d2,0x27ef,0x27fa, -0x2803,0x2825,0x283a,0x285f,0x2876,0x289f,0x28ba,0x28cf,0x28e8,0x2909,0x293e,0x294f,0x2980,0x29a4,0x29b5,0x29ce, -0x29d9,0x2a06,0x2a28,0x2a56,0x2a89,0x2a98,0x2aa9,0x2ac6,0x2b08,0x2b2f,0x2b3c,0x2b51,0x2b75,0x2b9b,0x2bd4,0x2be5, -0x2c09,0x2c14,0x2c21,0x2c30,0x2c55,0x2c83,0x2c9f,0x2cbc,0x2cc9,0x2cda,0x2cf8,0x2d1b,0x2d38,0x2d45,0x2d65,0x2d82, -0x2da3,0x2dcc,0x2ddd,0x2dfc,0x2e15,0x2e2e,0x2e3f,0x2e88,0x2e99,0x2eb2,0x2ee1,0x2f0e,0x2f33,0x2f75,0x2f91,0x2fa0, -0x2fb7,0x2fe5,0x2ffe,0x3027,0x3041,0x307c,0x309a,0x30a9,0x30c9,0x30e4,0x3108,0x3124,0x3142,0x3160,0x3177,0x3186, -0x3191,0x31ce,0x31e1,0x320b,0x322b,0x3259,0x327d,0x32a5,0x32ca,0x32d5,0x32ee,0x1fe5,1,0,0x12,0x3352, -0x3362,0x3375,0x3385,0x3395,0x33a4,0x33b4,0x33c6,0x33d9,0x33eb,0x33fb,0x340b,0x341a,0x3429,0x3439,0x3446,0x3455, -0x3469,0x20a3,1,0,6,0x348e,0x3499,0x34a6,0x34b3,0x34c0,0x34cb,0x20e7,1,0,0x1e,0x34e8, -0x34f7,0x350c,0x3521,0x3536,0x354a,0x355b,0x356f,0x3582,0x3593,0x35ac,0x35be,0x35cf,0x35e3,0x35f6,0x360e,0x3620, -0x362b,0x363b,0x3649,0x365e,0x3673,0x3689,0x36a3,0x36b9,0x36c9,0x36dd,0x36f1,0x3702,0x371a,0x2312,1,0, -0x68,0x3742,0x3765,0x376e,0x377b,0x3786,0x378f,0x379a,0x37a3,0x37bc,0x37c1,0x37ca,0x37e7,0x37f0,0x37fd,0x3806, -0x382a,0x3831,0x383a,0x384d,0x3858,0x3861,0x386c,0x3885,0x388e,0x389d,0x38a8,0x38b1,0x38bc,0x38c5,0x38cc,0x38d5, -0x38e0,0x38e9,0x3902,0x390b,0x3918,0x3923,0x3934,0x393f,0x3954,0x396b,0x3974,0x397d,0x3996,0x39a1,0x39aa,0x39b3, -0x39ca,0x39e7,0x39f2,0x3a03,0x3a0e,0x3a15,0x3a22,0x3a2f,0x3a5c,0x3a71,0x3a7a,0x3a95,0x3ab8,0x3ad9,0x3afa,0x3b1f, -0x3b46,0x3b67,0x3b8a,0x3bab,0x3bd2,0x3bf3,0x3c18,0x3c37,0x3c56,0x3c75,0x3c92,0x3cb3,0x3cd4,0x3cf7,0x3d1c,0x3d3b, -0x3d5a,0x3d7b,0x3da2,0x3dc7,0x3de6,0x3e07,0x3e2a,0x3e45,0x3e5e,0x3e79,0x3e92,0x3eaf,0x3eca,0x3ee7,0x3f06,0x3f23, -0x3f40,0x3f5f,0x3f7c,0x3f97,0x3fb4,0x3fd1,0x4004,0x402b,0x403e,0x2675,1,0,6,0x406c,0x407b,0x408b, -0x409b,0x40ab,0x40bc,0x26d3,1,0,0x30,0x40da,0x40e6,0x40f4,0x4103,0x4112,0x4122,0x4133,0x4147,0x415c, -0x4172,0x4185,0x4199,0x41a9,0x41b2,0x41bd,0x41cd,0x41e9,0x41fb,0x4209,0x4218,0x4224,0x4239,0x424d,0x4260,0x426e, -0x4282,0x4290,0x429a,0x42ac,0x42b8,0x42c6,0x42d6,0x42dd,0x42e4,0x42eb,0x42f2,0x42f9,0x430f,0x4330,0x870,0x4342, -0x434d,0x435c,0x4365,0x4370,0x4383,0x4394,0x43a5,0x2963,1,0,4,0x43c1,0x43cc,0x43d8,0x43e2,0x2989, -1,0,0xc8,0x43f9,0x4406,0x441b,0x4428,0x4437,0x4445,0x4454,0x4463,0x4475,0x4484,0x4492,0x44a3,0x44b2, -0x44c1,0x44ce,0x44da,0x44e9,0x44f8,0x4502,0x450f,0x451c,0x452b,0x4539,0x4548,0x4554,0x455e,0x456a,0x457a,0x458a, -0x4598,0x45a4,0x45b5,0x45c1,0x45cd,0x45db,0x45e8,0x45f4,0x4601,0xea4,0x460e,0x461c,0x4636,0x463f,0x464d,0x465b, -0x4667,0x4676,0x4684,0x4692,0x469e,0x46ad,0x46bb,0x46c9,0x46d6,0x46e5,0x4700,0x470f,0x4720,0x4731,0x4744,0x4756, -0x4765,0x4777,0x4786,0x4792,0x479d,0x1fb4,0x47aa,0x47b5,0x47c0,0x47cb,0x47d6,0x47f1,0x47fc,0x4807,0x4812,0x4825, -0x4839,0x4844,0x4853,0x4862,0x486d,0x4878,0x4885,0x4894,0x48a2,0x48ad,0x48c8,0x48d2,0x48e3,0x48f4,0x4903,0x4914, -0x491f,0x492a,0x4935,0x4940,0x494b,0x4956,0x4961,0x496b,0x4976,0x4986,0x4991,0x499f,0x49ac,0x49b7,0x49c6,0x49d3, -0x49e0,0x49ef,0x49fc,0x4a0d,0x4a1f,0x4a2f,0x4a3a,0x4a4d,0x4a64,0x4a72,0x4a7f,0x4a8a,0x4a97,0x4aa8,0x4ac4,0x4ada, -0x4ae5,0x4b02,0x4b12,0x4b21,0x4b2c,0x4b37,0x20ce,0x4b43,0x4b4e,0x4b66,0x4b76,0x4b85,0x4b93,0x4ba1,0x4bac,0x4bb7, -0x4bcb,0x4be2,0x4bfa,0x4c0a,0x4c1a,0x4c2a,0x4c3c,0x4c47,0x4c52,0x4c5c,0x4c68,0x4c76,0x4c89,0x4c95,0x4ca2,0x4cad, -0x4cc9,0x4cd6,0x4ce4,0x4cfd,0x29ce,0x4d0c,0x27ef,0x4d19,0x4d27,0x4d39,0x4d47,0x4d53,0x4d63,0x2c09,0x4d71,0x4d7d, -0x4d88,0x4d93,0x4d9e,0x4db2,0x4dc0,0x4dd7,0x4de3,0x4df7,0x4e05,0x4e17,0x4e2d,0x4e3b,0x4e4d,0x4e5b,0x4e78,0x4e8a, -0x4e97,0x4ea8,0x4eba,0x4ed4,0x4ee1,0x4ef4,0x4f05,0x3186,0x4f12,0x32ca,0x4f21,0x33e3,1,0,6,0x4f4d, -0x4f60,0x4f70,0x4f7e,0x4f8f,0x4f9f,0x343f,0x12,0,1,0x4fc9,0x4fcf,0x344c,0x12,0,1,0x4fc9, -0x4fcf,0x3459,1,0,3,0x4fc9,0x4fcf,0x5008,0x346f,1,0,3,0x4fc9,0x4fcf,0x5008,0x3485, -1,0,0x12,0x5092,0x509c,0x50a8,0x50af,0x50ba,0x50bf,0x50c6,0x50cd,0x50d6,0x50db,0x50e0,0x50f0,0x870, -0x4342,0x50fc,0x434d,0x510c,0x435c,0x352e,1,0,0xf,0x5092,0x5133,0x513d,0x5147,0x5152,0x4218,0x515c, -0x5168,0x5170,0x5177,0x5181,0x50a8,0x50af,0x50bf,0x518b,0x35b5,1,0,0x17,0x5092,0x51a8,0x5147,0x51b4, -0x51c1,0x51cf,0x4218,0x51da,0x50a8,0x51eb,0x50bf,0x51fa,0x5208,0x870,0x4330,0x5214,0x5225,0x4342,0x50fc,0x434d, -0x510c,0x435c,0x5236,0x36d2,1,0,3,0x5269,0x5271,0x5279,0x36eb,1,0,0x10,0x52a2,0x52a9, -0x52b8,0x52d9,0x52fc,0x5307,0x5326,0x533d,0x534a,0x5353,0x5372,0x53a5,0x53c0,0x53ef,0x540c,0x5431,0x3784,1, -0,0x24,0x5480,0x548d,0x54a0,0x54ad,0x54da,0x54ff,0x5514,0x5533,0x5554,0x5581,0x55ba,0x55dd,0x5600,0x562d, -0x5662,0x5689,0x56b2,0x56e9,0x5718,0x5739,0x575e,0x576d,0x5790,0x57a7,0x57b4,0x57c3,0x57e0,0x57f9,0x581c,0x5841, -0x585a,0x586f,0x587e,0x588f,0x589c,0x58bd,0x3954,1,0,4,0x58fb,0x5906,0x591e,0x5936,0x3990,0x36, -1,2,4,8,0xe,0x10,0x20,0x3e,0x40,0x80,0x100,0x1c0,0x200,0x400,0x800,0xe00, -0x1000,0x2000,0x4000,0x7000,0x8000,0x10000,0x20000,0x40000,0x78001,0x80000,0x100000,0x200000,0x400000,0x800000,0x1000000,0x2000000, -0x4000000,0x8000000,0xf000000,0x10000000,0x20000000,0x30f80000,0x34e8,0x34f7,0x350c,0x3521,0x596f,0x3536,0x354a,0x5965,0x355b,0x356f, -0x3582,0x5980,0x3593,0x35ac,0x35be,0x5997,0x35cf,0x35e3,0x35f6,0x59c0,0x360e,0x3620,0x362b,0x363b,0x595c,0x3649, -0x365e,0x3673,0x3689,0x36a3,0x36b9,0x36c9,0x36dd,0x36f1,0x59b6,0x3702,0x371a,0x59a1 +const int32_t PropNameData::valueMaps[1509]={ +6,0,0x4c,0,0xff,0x368,0xff,0x37e,0xff,0x393,0xff,0x3a9,0xff,0x3b4,0xff,0x3d5, +0xff,0x3e5,0xff,0x3f4,0xff,0x402,0xff,0x426,0xff,0x43d,0xff,0x455,0xff,0x46c,0xff,0x47b, +0xff,0x48a,0xff,0x49b,0xff,0x4a9,0xff,0x4bb,0xff,0x4d5,0xff,0x4f0,0xff,0x505,0xff,0x522, +0xff,0x533,0xff,0x53e,0xff,0x55d,0xff,0x573,0xff,0x584,0xff,0x594,0xff,0x5af,0xff,0x5c8, +0xff,0x5d9,0xff,0x5f3,0xff,0x606,0xff,0x616,0xff,0x630,0xff,0x649,0xff,0x660,0xff,0x674, +0xff,0x68a,0xff,0x69e,0xff,0x6b4,0xff,0x6ce,0xff,0x6e6,0xff,0x702,0xff,0x70a,0xff,0x712, +0xff,0x71a,0xff,0x722,0xff,0x72b,0xff,0x738,0xff,0x74b,0xff,0x768,0xff,0x785,0xff,0x7a2, +0xff,0x7c0,0xff,0x7de,0xff,0x802,0xff,0x80f,0xff,0x829,0xff,0x83e,0xff,0x859,0xff,0x870, +0xff,0x887,0xff,0x8a9,0xff,0x8c8,0xff,0x8e1,0xff,0x90e,0xff,0x947,0xff,0x978,0xff,0x9a7, +0xff,0x9d6,0xff,0x9eb,0xff,0xa04,0xff,0xa2f,0xff,0xa60,0xff,0x1000,0x101b,0xa7d,0x17b,0xc9d, +0x196,0x3571,0x105,0x3590,0x2f5,0x36ce,0x30b,0x3728,0x315,0x3985,0x337,0x42f1,0x3a5,0x4361,0x3af,0x465d, +0x3e4,0x469b,0x3ec,0x52a0,0x4c5,0x531e,0x4cf,0x5343,0x4d5,0x535d,0x4db,0x537e,0x4e2,0x5398,0x105,0x53bd, +0x105,0x53e3,0x4e9,0x548d,0x4ff,0x5506,0x512,0x55b8,0x52d,0x55ef,0x534,0x57c8,0x548,0x5c6d,0x571,0x5ccc, +0x579,0x5d11,0x57f,0x2000,0x2001,0x5d3b,0x587,0x3000,0x3001,0x5dc7,0,0x4000,0x400e,0x5dd9,0,0x5de2, +0,0x5dfc,0,0x5e0d,0,0x5e1e,0,0x5e34,0,0x5e3d,0,0x5e5a,0,0x5e78,0,0x5e96, +0,0x5eb4,0,0x5eca,0,0x5ede,0,0x5ef4,0,0x7000,0x7002,0x5f0d,0,0x5f24,0x5d5,0x8de, +0x12,0,1,0x12,0x20,0x8fc,0x4a,0,1,6,7,8,9,0xa,0xb,0xc, +0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c, +0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x54,0x5b,0x67,0x6b,0x76,0x7a,0x81,0x82, +0x84,0x85,0xc8,0xca,0xd6,0xd8,0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xe9,0xea, +0xf0,0x2e,0x40,0x4c,0x5e,0x68,0x79,0x84,0x91,0x9e,0xab,0xb8,0xc5,0xd2,0xdf,0xec, +0xf9,0x106,0x113,0x120,0x12d,0x13a,0x147,0x154,0x161,0x16e,0x17b,0x188,0x195,0x1a2,0x1af,0x1bc, +0x1c9,0x1d6,0x1e3,0x1f0,0x1fd,0x20c,0x21b,0x22a,0x239,0x248,0x257,0x266,0x275,0x28f,0x2a3,0x2b7, +0x2d2,0x2e1,0x2ea,0x2fa,0x302,0x30b,0x31a,0x323,0x333,0x344,0x355,0xa9d,1,0,0x17,0xa8c, +0xa9d,0xaae,0xac2,0xad9,0xaf1,0xb03,0xb18,0xb2f,0xb44,0xb54,0xb66,0xb83,0xb9f,0xbb1,0xbce,0xbea, +0xc06,0xc1b,0xc30,0xc4a,0xc65,0xc80,0xc3f,1,0,0x15b,0xca8,0xcb5,0xcc8,0xcf0,0xd0e,0xd2c, +0xd44,0xd6f,0xd99,0xdb1,0xdc4,0xdd7,0xde6,0xdf5,0xe04,0xe13,0xe2a,0xe3b,0xe4e,0xe61,0xe6e,0xe7b, +0xe8a,0xe9b,0xeb0,0xec1,0xecc,0xed5,0xee6,0xef7,0xf0a,0xf1c,0xf2f,0xf42,0xf81,0xf8e,0xf9b,0xfa8, +0xfbd,0xfed,0x1007,0x1028,0x1053,0x1076,0x10d4,0x10fb,0x1116,0x1125,0x114c,0x1174,0x1197,0x11ba,0x11e4,0x11fd, +0x121c,0x123f,0x1263,0x1276,0x1290,0x12ba,0x12d2,0x12fa,0x1323,0x1336,0x1349,0x135c,0x1383,0x1392,0x13b2,0x13e0, +0x13fe,0x142c,0x1448,0x1463,0x147c,0x1495,0x14b6,0x14e6,0x1505,0x1527,0x155b,0x1588,0x15cd,0x15ee,0x1618,0x1639, +0x1662,0x1675,0x16a8,0x16bf,0x16ce,0x16df,0x170a,0x1721,0x1752,0x1780,0x17c3,0x17ce,0x1807,0x1818,0x1829,0x1836, +0x1849,0x1883,0x18a7,0x18cb,0x1905,0x193d,0x1968,0x1980,0x19ac,0x19d8,0x19e5,0x19f4,0x1a11,0x1a33,0x1a61,0x1a81, +0x1aa8,0x1acf,0x1aee,0x1b01,0x1b12,0x1b23,0x1b48,0x1b6d,0x1b94,0x1bc8,0x1bf5,0x1c13,0x1c26,0x1c3f,0x1c78,0x1c87, +0x1ca7,0x1cc9,0x1ceb,0x1d02,0x1d19,0x1d46,0x1d5f,0x1d78,0x1da9,0x1dd3,0x1dee,0x1e01,0x1e20,0x1e29,0x1e3c,0x1e5a, +0x1e78,0x1e8b,0x1ea2,0x1eb7,0x1eec,0x1f10,0x1f25,0x1f34,0x1f47,0x1f6b,0x1f74,0x1f98,0x1faf,0x1fc2,0x1fd1,0x1fdc, +0x1ffd,0x2015,0x2024,0x2033,0x2042,0x2059,0x206e,0x2083,0x20bc,0x20cf,0x20eb,0x20f6,0x2103,0x2131,0x2155,0x2178, +0x218b,0x21ad,0x21c0,0x21db,0x21fe,0x2221,0x2246,0x2257,0x2286,0x22b3,0x22ca,0x22e5,0x22f4,0x231f,0x2357,0x2391, +0x23bf,0x23d0,0x23dd,0x2401,0x2410,0x242c,0x2446,0x2463,0x249b,0x24b0,0x24dd,0x24fc,0x252a,0x254a,0x257e,0x258d, +0x25b7,0x25da,0x2605,0x2610,0x2621,0x263c,0x2660,0x266d,0x2682,0x26a9,0x26d4,0x270b,0x271e,0x272f,0x275f,0x2770, +0x277f,0x2794,0x27b2,0x27c5,0x27d8,0x27ef,0x280c,0x2817,0x2820,0x2842,0x2857,0x287c,0x2893,0x28bc,0x28d7,0x28ec, +0x2905,0x2926,0x295b,0x296c,0x299d,0x29c1,0x29d2,0x29eb,0x29f6,0x2a23,0x2a45,0x2a73,0x2aa6,0x2ab5,0x2ac6,0x2ae3, +0x2b25,0x2b4c,0x2b59,0x2b6e,0x2b92,0x2bb8,0x2bf1,0x2c02,0x2c26,0x2c31,0x2c3e,0x2c4d,0x2c72,0x2ca0,0x2cbc,0x2cd9, +0x2ce6,0x2cf7,0x2d15,0x2d38,0x2d55,0x2d62,0x2d82,0x2d9f,0x2dc0,0x2de9,0x2dfa,0x2e19,0x2e32,0x2e4b,0x2e5c,0x2ea5, +0x2eb6,0x2ecf,0x2efe,0x2f2b,0x2f50,0x2f92,0x2fae,0x2fbd,0x2fd4,0x3002,0x301b,0x3044,0x305e,0x3099,0x30b7,0x30c6, +0x30e6,0x3101,0x3125,0x3141,0x315f,0x317d,0x3194,0x31a3,0x31ae,0x31eb,0x31fe,0x3228,0x3248,0x3276,0x329a,0x32c2, +0x32e7,0x32f2,0x330b,0x3339,0x3375,0x3382,0x339d,0x33b2,0x33d4,0x33e5,0x33f6,0x3440,0x344f,0x346c,0x3483,0x34b1, +0x34e4,0x3504,0x3515,0x3524,0x3558,0x2117,1,0,0x12,0x35a7,0x35b7,0x35ca,0x35da,0x35ea,0x35f9,0x3609, +0x361b,0x362e,0x3640,0x3650,0x3660,0x366f,0x367e,0x368e,0x369b,0x36aa,0x36be,0x21d5,1,0,6,0x36e3, +0x36ee,0x36fb,0x3708,0x3715,0x3720,0x2219,1,0,0x1e,0x373d,0x374c,0x3761,0x3776,0x378b,0x379f,0x37b0, +0x37c4,0x37d7,0x37e8,0x3801,0x3813,0x3824,0x3838,0x384b,0x3863,0x3875,0x3880,0x3890,0x389e,0x38b3,0x38c8,0x38de, +0x38f8,0x390e,0x391e,0x3932,0x3946,0x3957,0x396f,0x2444,1,0,0x6a,0x3997,0x39ba,0x39c3,0x39d0,0x39db, +0x39e4,0x39ef,0x39f8,0x3a11,0x3a16,0x3a1f,0x3a3c,0x3a45,0x3a52,0x3a5b,0x3a90,0x3a97,0x3aa0,0x3ab3,0x3abe,0x3ac7, +0x3ad2,0x3aeb,0x3af4,0x3b03,0x3b0e,0x3b17,0x3b22,0x3b2b,0x3b32,0x3b3b,0x3b46,0x3b4f,0x3b68,0x3b71,0x3b7e,0x3b89, +0x3b9a,0x3ba5,0x3bba,0x3bd1,0x3bda,0x3be3,0x3bfc,0x3c07,0x3c10,0x3c19,0x3c30,0x3c4d,0x3c58,0x3c69,0x3c74,0x3c7b, +0x3c88,0x3c95,0x3cc2,0x3cd7,0x3ce0,0x3cfb,0x3d1e,0x3d3f,0x3d60,0x3d85,0x3dac,0x3dcd,0x3df0,0x3e11,0x3e38,0x3e59, +0x3e7e,0x3e9d,0x3ebc,0x3edb,0x3ef8,0x3f19,0x3f3a,0x3f5d,0x3f82,0x3fa1,0x3fc0,0x3fe1,0x4008,0x402d,0x404c,0x406d, +0x4090,0x40ab,0x40c4,0x40df,0x40f8,0x4115,0x4130,0x414d,0x416c,0x4189,0x41a6,0x41c5,0x41e2,0x41fd,0x421a,0x4237, +0x426a,0x4291,0x42a4,0x42c1,0x42dc,0x27bf,1,0,6,0x4302,0x4311,0x4321,0x4331,0x4341,0x4352,0x281d, +1,0,0x31,0x4370,0x437c,0x438a,0x4399,0x43a8,0x43b8,0x43c9,0x43dd,0x43f2,0x4408,0x441b,0x442f,0x443f, +0x4448,0x4453,0x4463,0x447f,0x4491,0x449f,0x44ae,0x44ba,0x44cf,0x44e3,0x44f6,0x4504,0x4518,0x4526,0x4530,0x4542, +0x454e,0x455c,0x456c,0x4573,0x457a,0x4581,0x4588,0x458f,0x45a5,0x45c6,0x870,0x45d8,0x45e3,0x45f2,0x45fb,0x4606, +0x4619,0x462a,0x463b,0x4646,0x2ac4,1,0,4,0x466e,0x4679,0x4685,0x468f,0x2aea,1,0,0xd5, +0x46a6,0x46b3,0x46c8,0x46d5,0x46e4,0x46f2,0x4701,0x4710,0x4722,0x4731,0x473f,0x4750,0x475f,0x476e,0x477b,0x4787, +0x4796,0x47a5,0x47af,0x47bc,0x47c9,0x47d8,0x47e6,0x47f5,0x4801,0x480b,0x4817,0x4827,0x4837,0x4845,0x4851,0x4862, +0x486e,0x487a,0x4888,0x4895,0x48a1,0x48ae,0xec1,0x48bb,0x48c9,0x48e3,0x48ec,0x48fa,0x4908,0x4914,0x4923,0x4931, +0x493f,0x494b,0x495a,0x4968,0x4976,0x4983,0x4992,0x49ad,0x49bc,0x49cd,0x49de,0x49f1,0x4a03,0x4a12,0x4a24,0x4a33, +0x4a3f,0x4a4a,0x1fd1,0x4a57,0x4a62,0x4a6d,0x4a78,0x4a83,0x4a9e,0x4aa9,0x4ab4,0x4abf,0x4ad2,0x4ae6,0x4af1,0x4b00, +0x4b0f,0x4b1a,0x4b25,0x4b32,0x4b41,0x4b4f,0x4b5a,0x4b75,0x4b7f,0x4b90,0x4ba1,0x4bb0,0x4bc1,0x4bcc,0x4bd7,0x4be2, +0x4bed,0x4bf8,0x4c03,0x4c0e,0x4c18,0x4c23,0x4c33,0x4c3e,0x4c4c,0x4c59,0x4c64,0x4c73,0x4c80,0x4c8d,0x4c9c,0x4ca9, +0x4cba,0x4ccc,0x4cdc,0x4ce7,0x4cfa,0x4d11,0x4d1f,0x4d2c,0x4d37,0x4d44,0x4d55,0x4d71,0x4d87,0x4d92,0x4daf,0x4dbf, +0x4dce,0x4dd9,0x4de4,0x20eb,0x4df0,0x4dfb,0x4e13,0x4e23,0x4e32,0x4e40,0x4e4e,0x4e59,0x4e64,0x4e78,0x4e8f,0x4ea7, +0x4eb7,0x4ec7,0x4ed7,0x4ee9,0x4ef4,0x4eff,0x4f09,0x4f15,0x4f23,0x4f36,0x4f42,0x4f4f,0x4f5a,0x4f76,0x4f83,0x4f91, +0x4faa,0x29eb,0x4fb9,0x280c,0x4fc6,0x4fd4,0x4fe6,0x4ff4,0x5000,0x5010,0x2c26,0x501e,0x502a,0x5035,0x5040,0x504b, +0x505f,0x506d,0x5084,0x5090,0x50a4,0x50b2,0x50c4,0x50da,0x50e8,0x50fa,0x5108,0x5125,0x5137,0x5144,0x5155,0x5167, +0x5181,0x518e,0x51a1,0x51b2,0x31a3,0x51bf,0x32e7,0x51ce,0x51e0,0x51eb,0x51f7,0x520a,0x521a,0x5228,0x5236,0x5243, +0x5257,0x5268,0x5276,0x5283,0x5295,0x35f5,1,0,6,0x52ba,0x52cd,0x52dd,0x52eb,0x52fc,0x530c,0x3651, +0x12,0,1,0x5336,0x533c,0x365e,0x12,0,1,0x5336,0x533c,0x366b,1,0,3,0x5336, +0x533c,0x5375,0x3681,1,0,3,0x5336,0x533c,0x5375,0x3697,1,0,0x12,0x53ff,0x5409,0x5415, +0x541c,0x5427,0x542c,0x5433,0x543a,0x5443,0x5448,0x544d,0x545d,0x870,0x45d8,0x5469,0x45e3,0x5479,0x45f2,0x3740, +1,0,0xf,0x53ff,0x54a0,0x54aa,0x54b4,0x54bf,0x44ae,0x54c9,0x54d5,0x54dd,0x54e4,0x54ee,0x5415,0x541c, +0x542c,0x54f8,0x37c7,1,0,0x17,0x53ff,0x5515,0x54b4,0x5521,0x552e,0x553c,0x44ae,0x5547,0x5415,0x5558, +0x542c,0x5567,0x5575,0x870,0x45c6,0x5581,0x5592,0x45d8,0x5469,0x45e3,0x5479,0x45f2,0x55a3,0x38e4,1,0, +3,0x55d6,0x55de,0x55e6,0x38fd,1,0,0x10,0x52ba,0x560f,0x561e,0x563f,0x5662,0x566d,0x568c,0x56a3, +0x56b0,0x56b9,0x56d8,0x570b,0x5726,0x5755,0x5772,0x5797,0x39a4,1,0,0x25,0x57e6,0x57f3,0x5806,0x5813, +0x5840,0x5865,0x587a,0x5899,0x58ba,0x58e7,0x5920,0x5943,0x5966,0x5993,0x59c8,0x59ef,0x5a18,0x5a4f,0x5a7e,0x5a9f, +0x5ac4,0x5ad3,0x5af6,0x5b0d,0x5b1a,0x5b29,0x5b46,0x5b5f,0x5b82,0x5ba7,0x5bc0,0x5bd5,0x5be4,0x5bf5,0x5c02,0x5c23, +0x5c48,0x3b87,1,0,4,0x5c86,0x5c91,0x5ca9,0x5cc1,0x3bc3,0x12,0,1,0x5ce9,0x5d00,0x3bda, +1,0,4,0x466e,0x5865,0x5558,0x5d2c,0x3bff,0x36,1,2,4,8,0xe,0x10,0x20, +0x3e,0x40,0x80,0x100,0x1c0,0x200,0x400,0x800,0xe00,0x1000,0x2000,0x4000,0x7000,0x8000,0x10000,0x20000, +0x40000,0x78001,0x80000,0x100000,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0xf000000,0x10000000,0x20000000,0x30f80000,0x373d, +0x374c,0x3761,0x3776,0x5d69,0x378b,0x379f,0x5d5f,0x37b0,0x37c4,0x37d7,0x5d7a,0x37e8,0x3801,0x3813,0x5d91,0x3824, +0x3838,0x384b,0x5dba,0x3863,0x3875,0x3880,0x3890,0x5d56,0x389e,0x38b3,0x38c8,0x38de,0x38f8,0x390e,0x391e,0x3932, +0x3946,0x5db0,0x3957,0x396f,0x5d9b,0x3f16,1,0,0xc,0x5f3d,0x5f5a,0x5f71,0x5f96,0x5fa9,0x5fba,0x5fcf, +0x5fe2,0x5ff7,0x6012,0x602b,0x6040 }; -const uint8_t PropNameData::bytesTries[15527]={ -0,0x15,0x6d,0xc3,0xc7,0x73,0xc2,0x12,0x76,0x7a,0x76,0x6a,0x77,0xa2,0x52,0x78, +const uint8_t PropNameData::bytesTries[16301]={ +0,0x15,0x6d,0xc3,0xe7,0x73,0xc2,0x12,0x76,0x7a,0x76,0x6a,0x77,0xa2,0x52,0x78, 1,0x64,0x50,0x69,0x10,0x64,1,0x63,0x30,0x73,0x62,0x13,0x74,0x61,0x72,0x74, 0x63,0x60,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x61,0x13,0x69,0x67,0x69,0x74, 0x81,3,0x61,0x2e,0x65,0x4c,0x6f,0xc3,0x18,0x73,0x69,0x1e,0x72,0x69,0x61,0x74, @@ -140,15 +145,17 @@ const uint8_t PropNameData::bytesTries[15527]={ 0x6e,0x69,0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,0x11,0xd8,0x40,0xa,0x11,0x63, 0x63,0xc3,0x11,0x11,0x72,0x6d,0x58,0x1e,0x69,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63, 0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,0x1d,0x74,0x6c,0x65,0x63,0x61,0x73,0x65, -0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,0xa,0x6d,0xa2,0x76,0x6e,0xa2,0x78, -0x70,0xa4,0x3e,0x71,0xa4,0x90,0x72,3,0x61,0x2c,0x65,0x36,0x67,0x54,0x69,0x9d, +0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,0xa,0x6d,0xa2,0x76,0x6e,0xa2,0x98, +0x70,0xa4,0x5e,0x71,0xa4,0xb0,0x72,3,0x61,0x2c,0x65,0x36,0x67,0x54,0x69,0x9d, 0x14,0x64,0x69,0x63,0x61,0x6c,0x55,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e, 0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x9d,0x15,0x69,0x65,0x6d,0x6f,0x6a,0x69,0xa2, 0x47,3,0x66,0x44,0x6d,0x5c,0x74,0x7c,0x7a,0x19,0x77,0x6a,0x73,0x65,0x71,0x75, 0x65,0x6e,0x63,0x65,0xa3,0x46,0x1a,0x6c,0x61,0x67,0x73,0x65,0x71,0x75,0x65,0x6e, 0x63,0x65,0xa3,0x44,0x1e,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x73,0x65,0x71,0x75, 0x65,0x6e,0x63,0x65,0xa3,0x43,0x19,0x61,0x67,0x73,0x65,0x71,0x75,0x65,0x6e,0x63, -0x65,0xa3,0x45,0x12,0x61,0x74,0x68,0x4f,6,0x6f,0x39,0x6f,0x32,0x74,0xc3,9, +0x65,0xa3,0x45,2,0x61,0x54,0x63,0x58,0x6f,0x12,0x64,0x69,0x66,0x1f,0x69,0x65, +0x72,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa3,0x4b, +0x11,0x74,0x68,0x4f,0x10,0x6d,0xa3,0x4b,6,0x6f,0x39,0x6f,0x32,0x74,0xc3,9, 0x75,0x54,0x76,0xd9,0x30,0,0x12,0x6e,0x63,0x68,0x1f,0x61,0x72,0x61,0x63,0x74, 0x65,0x72,0x63,0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e,0x74,0x51,0x14,0x6d,0x65,0x72, 0x69,0x63,1,0x74,0x32,0x76,0x13,0x61,0x6c,0x75,0x65,0xd9,0x30,0,0x12,0x79, @@ -167,920 +174,966 @@ const uint8_t PropNameData::bytesTries[15527]={ 0x30,0x77,0x10,0x73,0x77,0x11,0x79,0x6e,0x75,0x12,0x65,0x72,0x6e,1,0x73,0x38, 0x77,0x18,0x68,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x77,0x14,0x79,0x6e,0x74, 0x61,0x78,0x75,0x10,0x6d,0x9f,1,0x6d,0x3c,0x75,0x1a,0x6f,0x74,0x61,0x74,0x69, -0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x53,0x12,0x61,0x72,0x6b,0x53,0x66,0xc2,0x2e,0x69, -0xc1,0x72,0x69,0xa2,0x6f,0x6a,0xa4,0x3f,0x6c,4,0x62,0xc3,8,0x63,0x8c,0x65, +0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x53,0x12,0x61,0x72,0x6b,0x53,0x66,0xc2,0x72,0x69, +0xc1,0xb6,0x69,0xa2,0x6f,0x6a,0xa4,0x83,0x6c,4,0x62,0xc3,8,0x63,0x8c,0x65, 0x98,0x69,0xa2,0x56,0x6f,2,0x65,0x4b,0x67,0x4c,0x77,0x11,0x65,0x72,0x4c,0x13, 0x63,0x61,0x73,0x65,0x4c,0x16,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,4, 0x11,0x69,0x63,0x1f,0x61,0x6c,0x6f,0x72,0x64,0x65,0x72,0x65,0x78,0x63,0x65,0x70, 0x74,0x69,0x6f,0x6e,0x4b,0xd8,0x40,4,0x11,0x63,0x63,0xc3,0x10,0x18,0x61,0x64, 0x63,0x61,0x6e,0x6f,0x6e,0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e, 0x69,0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,0x10,0x16,0x6e,0x65,0x62,0x72,0x65, -0x61,0x6b,0xc3,8,2,0x64,0x4a,0x6e,0xa2,0x91,0x73,1,0x63,0xd9,0x40,3, -0x6f,0x16,0x63,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0xd9,0x40,3,2,0x63,0xa2,0x44, -0x65,0xa2,0x6c,0x73,0x40,2,0x62,0x48,0x74,0x64,0x75,0xa2,0x48,0x1b,0x6e,0x61, -0x72,0x79,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0xa3,0x48,0x44,0x1c,0x69,0x6e, -0x61,0x72,0x79,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x45,0x46,1,0x61,0x40, -0x72,0x1c,0x69,0x6e,0x61,0x72,0x79,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x47, -0x11,0x72,0x74,0x41,0x3e,0x10,0x6f,1,0x6d,0x30,0x6e,0x14,0x74,0x69,0x6e,0x75, -0x65,0x3f,0x16,0x70,0x61,0x74,0x6d,0x61,0x74,0x68,1,0x63,0x30,0x73,0x13,0x74, -0x61,0x72,0x74,0xa3,0x49,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0xa3,0x4a,0x10, -0x6f,0x42,0x16,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x43,2,0x64,0x2e,0x70,0x86, -0x73,0x10,0x63,0xc3,0x17,0x11,0x69,0x63,1,0x70,0x46,0x73,0x1e,0x79,0x6c,0x6c, -0x61,0x62,0x69,0x63,0x63,0x61,0x74,0x65,0x67,0x6f,0x72,0x79,0xc3,0x17,0x10,0x6f, -0x1f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x63,0x61,0x74,0x65,0x67,0x6f,0x72, -0x79,0xc3,0x16,0x10,0x63,0xc3,0x16,2,0x67,0xc3,6,0x6f,0x26,0x74,0xc3,7, -0x11,0x69,0x6e,1,0x63,0x4a,0x69,0x11,0x6e,0x67,1,0x67,0x2e,0x74,0x12,0x79, -0x70,0x65,0xc3,7,0x13,0x72,0x6f,0x75,0x70,0xc3,6,0x48,0x15,0x6f,0x6e,0x74, -0x72,0x6f,0x6c,0x49,0x66,0x86,0x67,0xa2,0x4a,0x68,3,0x61,0x36,0x65,0x58,0x73, -0x68,0x79,0x13,0x70,0x68,0x65,0x6e,0x3d,0x1f,0x6e,0x67,0x75,0x6c,0x73,0x79,0x6c, -0x6c,0x61,0x62,0x6c,0x65,0x74,0x79,0x70,0x65,0xc3,0xb,0x10,0x78,0x3a,0x14,0x64, -0x69,0x67,0x69,0x74,0x3b,0x10,0x74,0xc3,0xb,0x16,0x75,0x6c,0x6c,0x63,0x6f,0x6d, -0x70,0x1f,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x65,0x78,0x63,0x6c,0x75,0x73,0x69, -0x6f,0x6e,0x33,2,0x63,0xa2,0x44,0x65,0xa2,0x4b,0x72,3,0x61,0x34,0x62,0x84, -0x65,0x8a,0x6c,0x12,0x69,0x6e,0x6b,0x39,0x11,0x70,0x68,0x7c,0x12,0x65,0x6d,0x65, -3,0x62,0x5e,0x63,0x30,0x65,0x48,0x6c,0x12,0x69,0x6e,0x6b,0x39,0x1a,0x6c,0x75, -0x73,0x74,0x65,0x72,0x62,0x72,0x65,0x61,0x6b,0xc3,0x12,0x14,0x78,0x74,0x65,0x6e, -0x64,0x37,0x12,0x61,0x73,0x65,0x35,0x11,0x78,0x74,0x37,0xc2,5,1,0x62,0xc3, -0x12,0x6d,0xd9,0x20,0,0x1c,0x6e,0x65,0x72,0x61,0x6c,0x63,0x61,0x74,0x65,0x67, -0x6f,0x72,0x79,0xc2,5,0x13,0x6d,0x61,0x73,0x6b,0xd9,0x20,0,0x61,0xa2,0xa2, -0x62,0xa2,0xd0,0x63,0xa4,0x4f,0x64,0xa6,0x1c,0x65,5,0x6d,0x75,0x6d,0x6e,0x70, -0xa2,0x6b,0x78,0x10,0x74,0x30,1,0x65,0x2c,0x70,0x12,0x69,0x63,0x74,0xa1,0x12, -0x6e,0x64,0x65,1,0x64,0x24,0x72,0x31,0x1b,0x70,0x69,0x63,0x74,0x6f,0x67,0x72, -0x61,0x70,0x68,0x69,0x63,0xa1,0x10,0x6f,1,0x64,0x97,0x6a,0x10,0x69,0x92,3, -0x63,0x44,0x6b,0x54,0x6d,0x70,0x70,0x1a,0x72,0x65,0x73,0x65,0x6e,0x74,0x61,0x74, -0x69,0x6f,0x6e,0x95,0x17,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x9b,0x1c,0x65, -0x79,0x63,0x61,0x70,0x73,0x65,0x71,0x75,0x65,0x6e,0x63,0x65,0xa3,0x42,0x16,0x6f, -0x64,0x69,0x66,0x69,0x65,0x72,0x96,0x13,0x62,0x61,0x73,0x65,0x99,0x12,0x72,0x65, -0x73,0x95,0x61,0x30,0x62,0x4e,0x63,0x12,0x6f,0x6d,0x70,0x9b,0xc2,4,0x1b,0x73, -0x74,0x61,0x73,0x69,0x61,0x6e,0x77,0x69,0x64,0x74,0x68,0xc3,4,0x12,0x61,0x73, -0x65,0x99,3,0x67,0x44,0x68,0x4a,0x6c,0x4e,0x73,0x1a,0x63,0x69,0x69,0x68,0x65, -0x78,0x64,0x69,0x67,0x69,0x74,0x23,0x10,0x65,0xd9,0x40,0,0x11,0x65,0x78,0x23, -1,0x6e,0x38,0x70,0x11,0x68,0x61,0x20,0x14,0x62,0x65,0x74,0x69,0x63,0x21,0x11, -0x75,0x6d,0x79,5,0x6c,0x22,0x6c,0x36,0x6d,0x52,0x70,1,0x62,0xd9,0x40,0xd, -0x74,0xc3,0x15,2,0x61,0x32,0x6b,0xc3,1,0x6f,0x11,0x63,0x6b,0xc3,1,0x11, -0x6e,0x6b,0x7b,0x10,0x67,0xd9,0x40,1,0x61,0xa2,0x4f,0x63,0xc3,0,0x69,0x11, -0x64,0x69,2,0x63,0x54,0x6d,0x74,0x70,0x1b,0x61,0x69,0x72,0x65,0x64,0x62,0x72, -0x61,0x63,0x6b,0x65,0x74,0xd8,0x40,0xd,0x13,0x74,0x79,0x70,0x65,0xc3,0x15,0x24, -1,0x6c,0x30,0x6f,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x25,0x12,0x61,0x73,0x73,0xc3, -0,0x26,0x14,0x69,0x72,0x72,0x6f,0x72,1,0x65,0x38,0x69,0x16,0x6e,0x67,0x67, -0x6c,0x79,0x70,0x68,0xd9,0x40,1,0x10,0x64,0x27,0x17,0x73,0x69,0x63,0x65,0x6d, -0x6f,0x6a,0x69,0xa3,0x41,6,0x68,0x7c,0x68,0x54,0x69,0x85,0x6f,0xa2,0x6f,0x77, -4,0x63,0x30,0x6b,0x36,0x6c,0x87,0x74,0x8b,0x75,0x89,1,0x66,0x8d,0x6d,0x8f, -0x11,0x63,0x66,0x91,0x18,0x61,0x6e,0x67,0x65,0x73,0x77,0x68,0x65,0x6e,4,0x63, -0x44,0x6c,0x6c,0x6e,0x7e,0x74,0x98,0x75,0x18,0x70,0x70,0x65,0x72,0x63,0x61,0x73, -0x65,0x64,0x89,0x12,0x61,0x73,0x65,1,0x66,0x30,0x6d,0x14,0x61,0x70,0x70,0x65, -0x64,0x8f,0x14,0x6f,0x6c,0x64,0x65,0x64,0x8d,0x18,0x6f,0x77,0x65,0x72,0x63,0x61, -0x73,0x65,0x64,0x87,0x1c,0x66,0x6b,0x63,0x63,0x61,0x73,0x65,0x66,0x6f,0x6c,0x64, -0x65,0x64,0x91,0x18,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x64,0x8b,0x13,0x6d, -0x70,0x65,0x78,0x33,0x61,0x2e,0x63,0xa2,0x48,0x66,0xd9,0x40,2,1,0x6e,0x72, -0x73,0x10,0x65,3,0x64,0x83,0x66,0x3a,0x69,0x4a,0x73,0x17,0x65,0x6e,0x73,0x69, -0x74,0x69,0x76,0x65,0x65,0x15,0x6f,0x6c,0x64,0x69,0x6e,0x67,0xd9,0x40,2,0x17, -0x67,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x85,0x13,0x6f,0x6e,0x69,0x63,0x1f,0x61, -0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3, -2,0x10,0x63,0xc3,2,3,0x61,0x30,0x65,0x34,0x69,0xa2,0x41,0x74,0xc3,3, -0x11,0x73,0x68,0x29,2,0x63,0x3a,0x66,0x58,0x70,0x2c,0x16,0x72,0x65,0x63,0x61, -0x74,0x65,0x64,0x2d,0x1d,0x6f,0x6d,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x74, -0x79,0x70,0x65,0xc3,3,0x15,0x61,0x75,0x6c,0x74,0x69,0x67,0x1f,0x6e,0x6f,0x72, -0x61,0x62,0x6c,0x65,0x63,0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e,0x74,0x2b,0x2a,0x10, -0x61,0x2e,0x15,0x63,0x72,0x69,0x74,0x69,0x63,0x2f,3,0x66,0x34,0x6e,0x3e,0x74, -0x42,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x13,0x61,0x6c,0x73,0x65,0x21,0x20,0x10, -0x6f,0x21,0x22,0x12,0x72,0x75,0x65,0x23,0xb,0x6b,0x5b,0x6f,0x23,0x6f,0x3c,0x72, -0x4c,0x76,1,0x69,0x24,0x72,0x33,0x13,0x72,0x61,0x6d,0x61,0x33,0x10,0x76,0x22, -0x14,0x65,0x72,0x6c,0x61,0x79,0x23,0xa2,0xe2,0x13,0x69,0x67,0x68,0x74,0xa3,0xe2, -0x6b,0x58,0x6c,0x74,0x6e,3,0x6b,0x2f,0x6f,0x30,0x72,0x21,0x75,0x12,0x6b,0x74, -0x61,0x2f,0x19,0x74,0x72,0x65,0x6f,0x72,0x64,0x65,0x72,0x65,0x64,0x21,1,0x61, -0x24,0x76,0x31,0x18,0x6e,0x61,0x76,0x6f,0x69,0x63,0x69,0x6e,0x67,0x31,0xa2,0xe0, -0x12,0x65,0x66,0x74,0xa3,0xe0,0x64,0x45,0x64,0x4e,0x68,0x88,0x69,1,0x6f,0x26, -0x73,0xa3,0xf0,0x1a,0x74,0x61,0x73,0x75,0x62,0x73,0x63,0x72,0x69,0x70,0x74,0xa3, -0xf0,2,0x61,0xa3,0xea,0x62,0xa3,0xe9,0x6f,0x13,0x75,0x62,0x6c,0x65,1,0x61, -0x30,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa3,0xe9,0x13,0x62,0x6f,0x76,0x65,0xa3,0xea, -0x12,0x61,0x6e,0x72,0x2c,0x15,0x65,0x61,0x64,0x69,0x6e,0x67,0x2d,0x61,0xa2,0x7b, -0x62,0xa2,0xd4,0x63,0x11,0x63,0x63,4,0x31,0x3c,0x32,0xa2,0x42,0x33,0xa2,0x56, -0x38,0xa2,0x64,0x39,0x10,0x31,0xa3,0x5b,9,0x35,0xa,0x35,0x3f,0x36,0x41,0x37, -0x43,0x38,0x45,0x39,0x47,0x30,0x30,0x31,0x3c,0x32,0x42,0x33,0x4e,0x34,0x3d,0x34, -1,0x33,0xa3,0x67,0x37,0xa3,0x6b,0x36,0x10,0x38,0xa3,0x76,0x38,1,0x32,0xa3, -0x7a,0x39,0xa3,0x81,0x3a,2,0x30,0xa3,0x82,0x32,0xa3,0x84,0x33,0xa3,0x85,9, -0x35,0xa,0x35,0x53,0x36,0x55,0x37,0x57,0x38,0x59,0x39,0x5b,0x30,0x49,0x31,0x4b, -0x32,0x4d,0x33,0x4f,0x34,0x51,6,0x33,8,0x33,0x63,0x34,0x65,0x35,0x67,0x36, -0x69,0x30,0x5d,0x31,0x5f,0x32,0x61,0x10,0x34,0xa3,0x54,0xa2,0xe6,3,0x62,0xa0, -0x6c,0xa3,0xe4,0x72,0xa3,0xe8,0x74,2,0x61,0x74,0x62,0x7c,0x74,0x14,0x61,0x63, -0x68,0x65,0x64,1,0x61,0x3e,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa2,0xca,0x13,0x6c, -0x65,0x66,0x74,0xa3,0xc8,0x13,0x62,0x6f,0x76,0x65,0xa2,0xd6,0x14,0x72,0x69,0x67, -0x68,0x74,0xa3,0xd8,0xa2,0xd6,0x10,0x72,0xa3,0xd8,0xa2,0xca,0x10,0x6c,0xa3,0xc8, -0x12,0x6f,0x76,0x65,0xa2,0xe6,1,0x6c,0x30,0x72,0x13,0x69,0x67,0x68,0x74,0xa3, -0xe8,0x12,0x65,0x66,0x74,0xa3,0xe4,0xa2,0xdc,2,0x65,0x2c,0x6c,0xa3,0xda,0x72, -0xa3,0xde,0x12,0x6c,0x6f,0x77,0xa2,0xdc,1,0x6c,0x30,0x72,0x13,0x69,0x67,0x68, -0x74,0xa3,0xde,0x12,0x65,0x66,0x74,0xa3,0xda,0xb,0x6e,0xc0,0xca,0x72,0x5f,0x72, -0x46,0x73,0xa2,0x48,0x77,1,0x68,0x24,0x73,0x33,0x17,0x69,0x74,0x65,0x73,0x70, -0x61,0x63,0x65,0x33,0x22,1,0x69,0x30,0x6c,2,0x65,0x3d,0x69,0x4b,0x6f,0x3f, -0x18,0x67,0x68,0x74,0x74,0x6f,0x6c,0x65,0x66,0x74,0x22,2,0x65,0x38,0x69,0x48, -0x6f,0x16,0x76,0x65,0x72,0x72,0x69,0x64,0x65,0x3f,0x17,0x6d,0x62,0x65,0x64,0x64, -0x69,0x6e,0x67,0x3d,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4b,0x30,0x1e,0x65,0x67, -0x6d,0x65,0x6e,0x74,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x31,0x6e,0xa2, -0x41,0x6f,0xa2,0x53,0x70,2,0x61,0x66,0x64,0x86,0x6f,0x1b,0x70,0x64,0x69,0x72, -0x65,0x63,0x74,0x69,0x6f,0x6e,0x61,0x6c,1,0x66,0x32,0x69,0x15,0x73,0x6f,0x6c, -0x61,0x74,0x65,0x4d,0x14,0x6f,0x72,0x6d,0x61,0x74,0x41,0x1f,0x72,0x61,0x67,0x72, -0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x2f,1,0x66,0x41, -0x69,0x4d,1,0x6f,0x28,0x73,0x10,0x6d,0x43,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69, -0x6e,0x67,0x6d,0x61,0x72,0x6b,0x43,1,0x6e,0x35,0x74,0x19,0x68,0x65,0x72,0x6e, -0x65,0x75,0x74,0x72,0x61,0x6c,0x35,0x65,0x88,0x65,0x98,0x66,0xa2,0x6a,0x6c,0x20, -1,0x65,0x30,0x72,2,0x65,0x37,0x69,0x49,0x6f,0x39,0x18,0x66,0x74,0x74,0x6f, -0x72,0x69,0x67,0x68,0x74,0x20,2,0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65,0x72, -0x72,0x69,0x64,0x65,0x39,0x17,0x6d,0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x37,0x15, -0x73,0x6f,0x6c,0x61,0x74,0x65,0x49,3,0x6e,0x25,0x73,0x27,0x74,0x29,0x75,0x15, -0x72,0x6f,0x70,0x65,0x61,0x6e,2,0x6e,0x3c,0x73,0x46,0x74,0x18,0x65,0x72,0x6d, -0x69,0x6e,0x61,0x74,0x6f,0x72,0x29,0x14,0x75,0x6d,0x62,0x65,0x72,0x25,0x17,0x65, -0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x27,1,0x69,0x28,0x73,0x10,0x69,0x47,0x1f, -0x72,0x73,0x74,0x73,0x74,0x72,0x6f,0x6e,0x67,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65, -0x47,0x61,0x4e,0x62,0x84,0x63,1,0x6f,0x24,0x73,0x2d,0x1c,0x6d,0x6d,0x6f,0x6e, -0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x2d,2,0x6c,0x3b,0x6e,0x2b,0x72, -0x13,0x61,0x62,0x69,0x63,1,0x6c,0x30,0x6e,0x14,0x75,0x6d,0x62,0x65,0x72,0x2b, -0x14,0x65,0x74,0x74,0x65,0x72,0x3b,0x2e,1,0x6e,0x45,0x6f,0x1c,0x75,0x6e,0x64, -0x61,0x72,0x79,0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x45,0,0x16,0x6d,0xc9,0x20, -0x74,0xc2,0x30,0x77,0x89,0x77,0x86,0x79,0xa2,0x46,0x7a,1,0x61,0x58,0x6e,0x1a, -0x61,0x6d,0x65,0x6e,0x6e,0x79,0x6d,0x75,0x73,0x69,0x63,0xa4,0x40,0x19,0x61,0x6c, -0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa5,0x40,0x1c,0x6e,0x61,0x62,0x61,0x7a, -0x61,0x72,0x73,0x71,0x75,0x61,0x72,0x65,0xa5,0x18,0x10,0x61,1,0x6e,0x36,0x72, -0x16,0x61,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0xfc,0x12,0x63,0x68,0x6f,0xa5,0x2c, -1,0x65,0x88,0x69,2,0x6a,0x3c,0x72,0x68,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62, -0x6c,0x65,0x73,0xa3,0x48,0x12,0x69,0x6e,0x67,0xa2,0x74,0x1e,0x68,0x65,0x78,0x61, -0x67,0x72,0x61,0x6d,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x74,0x16,0x61,0x64, -0x69,0x63,0x61,0x6c,0x73,0xa3,0x49,0x13,0x7a,0x69,0x64,0x69,0xa5,0x34,0x74,0xa2, -0x65,0x75,0xa4,0x4f,0x76,3,0x61,0x3c,0x65,0x80,0x69,0xa2,0x50,0x73,0xa2,0x6c, -0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,0xa3,0x9f,0x72,0x1e,0x69,0x61,0x74,0x69, -0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,0x6f,0x72,0x73,0xa2,0x6c,0x19,0x73,0x75, -0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x7d,1,0x64,0x3c,0x72,0x19,0x74, -0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x91,0x14,0x69,0x63,0x65,0x78, -0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0xaf,0x15,0x74,0x68, -0x6b,0x75,0x71,0x69,0xa5,0x3f,5,0x69,0x3f,0x69,0x5a,0x6f,0x8c,0x72,0x1c,0x61, -0x6e,0x73,0x70,0x6f,0x72,0x74,0x61,0x6e,0x64,0x6d,0x61,0x70,0xa2,0xcf,0x16,0x73, -0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xcf,2,0x62,0x34,0x66,0x3c,0x72,0x13,0x68, -0x75,0x74,0x61,0xa3,0xfb,0x13,0x65,0x74,0x61,0x6e,0x57,0x14,0x69,0x6e,0x61,0x67, -0x68,0xa3,0x90,0x11,0x74,0x6f,0xa5,0x3d,0x61,0x3e,0x65,0xa2,0xa0,0x68,0x10,0x61, -1,0x61,0x24,0x69,0x53,0x11,0x6e,0x61,0x3d,4,0x67,0x8e,0x69,0xa2,0x49,0x6b, -0xa2,0x72,0x6d,0xa2,0x74,0x6e,0x10,0x67,1,0x73,0x68,0x75,0x10,0x74,0xa4,0x10, -1,0x63,0x40,0x73,0x11,0x75,0x70,0xa4,0x33,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, -0x74,0xa5,0x33,0x18,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x73,0xa5,0x11,0x10, -0x61,0xa5,0x3c,2,0x61,0x2a,0x62,0x32,0x73,0xa3,0x60,0x12,0x6c,0x6f,0x67,0xa3, -0x62,0x13,0x61,0x6e,0x77,0x61,0xa3,0x65,3,0x6c,0x52,0x74,0x56,0x76,0x5e,0x78, +0x61,0x6b,0xc3,8,2,0x64,0x4a,0x6e,0xa2,0xbd,0x73,1,0x63,0xd9,0x40,3, +0x6f,0x16,0x63,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0xd9,0x40,3,3,0x63,0x3a,0x65, +0x8c,0x73,0xa2,0x5b,0x74,0x12,0x79,0x70,0x65,0xd9,0x70,1,0x3e,0x10,0x6f,1, +0x6d,0x30,0x6e,0x14,0x74,0x69,0x6e,0x75,0x65,0x3f,0x16,0x70,0x61,0x74,0x6d,0x61, +0x74,0x68,1,0x63,0x30,0x73,0x13,0x74,0x61,0x72,0x74,0xa3,0x49,0x16,0x6f,0x6e, +0x74,0x69,0x6e,0x75,0x65,0xa3,0x4a,1,0x6e,0x36,0x6f,0x42,0x16,0x67,0x72,0x61, +0x70,0x68,0x69,0x63,0x43,0x15,0x74,0x69,0x66,0x69,0x65,0x72,1,0x73,0x30,0x74, +0x12,0x79,0x70,0x65,0xd9,0x70,1,0x14,0x74,0x61,0x74,0x75,0x73,0xc3,0x19,0x40, +2,0x62,0x48,0x74,0x64,0x75,0xa2,0x48,0x1b,0x6e,0x61,0x72,0x79,0x6f,0x70,0x65, +0x72,0x61,0x74,0x6f,0x72,0xa3,0x48,0x44,0x1c,0x69,0x6e,0x61,0x72,0x79,0x6f,0x70, +0x65,0x72,0x61,0x74,0x6f,0x72,0x45,0x46,1,0x61,0x40,0x72,0x1c,0x69,0x6e,0x61, +0x72,0x79,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x47,1,0x72,0x2c,0x74,0x11, +0x75,0x73,0xc3,0x19,0x10,0x74,0x41,3,0x63,0x34,0x64,0x38,0x70,0xa2,0x48,0x73, +0x10,0x63,0xc3,0x17,0x10,0x62,0xc3,0x1a,0x11,0x69,0x63,2,0x63,0x4a,0x70,0x64, +0x73,0x1e,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x63,0x61,0x74,0x65,0x67,0x6f,0x72, +0x79,0xc3,0x17,0x1b,0x6f,0x6e,0x6a,0x75,0x6e,0x63,0x74,0x62,0x72,0x65,0x61,0x6b, +0xc3,0x1a,0x10,0x6f,0x1f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x63,0x61,0x74, +0x65,0x67,0x6f,0x72,0x79,0xc3,0x16,0x10,0x63,0xc3,0x16,2,0x67,0xc3,6,0x6f, +0x26,0x74,0xc3,7,0x11,0x69,0x6e,1,0x63,0x4a,0x69,0x11,0x6e,0x67,1,0x67, +0x2e,0x74,0x12,0x79,0x70,0x65,0xc3,7,0x13,0x72,0x6f,0x75,0x70,0xc3,6,0x48, +0x15,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x49,0x66,0x86,0x67,0xa2,0x4a,0x68,3,0x61, +0x36,0x65,0x58,0x73,0x68,0x79,0x13,0x70,0x68,0x65,0x6e,0x3d,0x1f,0x6e,0x67,0x75, +0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x74,0x79,0x70,0x65,0xc3,0xb,0x10, +0x78,0x3a,0x14,0x64,0x69,0x67,0x69,0x74,0x3b,0x10,0x74,0xc3,0xb,0x16,0x75,0x6c, +0x6c,0x63,0x6f,0x6d,0x70,0x1f,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x65,0x78,0x63, +0x6c,0x75,0x73,0x69,0x6f,0x6e,0x33,2,0x63,0xa2,0x44,0x65,0xa2,0x4b,0x72,3, +0x61,0x34,0x62,0x84,0x65,0x8a,0x6c,0x12,0x69,0x6e,0x6b,0x39,0x11,0x70,0x68,0x7c, +0x12,0x65,0x6d,0x65,3,0x62,0x5e,0x63,0x30,0x65,0x48,0x6c,0x12,0x69,0x6e,0x6b, +0x39,0x1a,0x6c,0x75,0x73,0x74,0x65,0x72,0x62,0x72,0x65,0x61,0x6b,0xc3,0x12,0x14, +0x78,0x74,0x65,0x6e,0x64,0x37,0x12,0x61,0x73,0x65,0x35,0x11,0x78,0x74,0x37,0xc2, +5,1,0x62,0xc3,0x12,0x6d,0xd9,0x20,0,0x1c,0x6e,0x65,0x72,0x61,0x6c,0x63, +0x61,0x74,0x65,0x67,0x6f,0x72,0x79,0xc2,5,0x13,0x6d,0x61,0x73,0x6b,0xd9,0x20, +0,0x61,0xa2,0xa2,0x62,0xa2,0xd0,0x63,0xa4,0x4f,0x64,0xa6,0x1c,0x65,5,0x6d, +0x75,0x6d,0x6e,0x70,0xa2,0x6b,0x78,0x10,0x74,0x30,1,0x65,0x2c,0x70,0x12,0x69, +0x63,0x74,0xa1,0x12,0x6e,0x64,0x65,1,0x64,0x24,0x72,0x31,0x1b,0x70,0x69,0x63, +0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0xa1,0x10,0x6f,1,0x64,0x97,0x6a, +0x10,0x69,0x92,3,0x63,0x44,0x6b,0x54,0x6d,0x70,0x70,0x1a,0x72,0x65,0x73,0x65, +0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x95,0x17,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e, +0x74,0x9b,0x1c,0x65,0x79,0x63,0x61,0x70,0x73,0x65,0x71,0x75,0x65,0x6e,0x63,0x65, +0xa3,0x42,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x96,0x13,0x62,0x61,0x73,0x65, +0x99,0x12,0x72,0x65,0x73,0x95,0x61,0x30,0x62,0x4e,0x63,0x12,0x6f,0x6d,0x70,0x9b, +0xc2,4,0x1b,0x73,0x74,0x61,0x73,0x69,0x61,0x6e,0x77,0x69,0x64,0x74,0x68,0xc3, +4,0x12,0x61,0x73,0x65,0x99,3,0x67,0x44,0x68,0x4a,0x6c,0x4e,0x73,0x1a,0x63, +0x69,0x69,0x68,0x65,0x78,0x64,0x69,0x67,0x69,0x74,0x23,0x10,0x65,0xd9,0x40,0, +0x11,0x65,0x78,0x23,1,0x6e,0x38,0x70,0x11,0x68,0x61,0x20,0x14,0x62,0x65,0x74, +0x69,0x63,0x21,0x11,0x75,0x6d,0x79,5,0x6c,0x22,0x6c,0x36,0x6d,0x52,0x70,1, +0x62,0xd9,0x40,0xd,0x74,0xc3,0x15,2,0x61,0x32,0x6b,0xc3,1,0x6f,0x11,0x63, +0x6b,0xc3,1,0x11,0x6e,0x6b,0x7b,0x10,0x67,0xd9,0x40,1,0x61,0xa2,0x4f,0x63, +0xc3,0,0x69,0x11,0x64,0x69,2,0x63,0x54,0x6d,0x74,0x70,0x1b,0x61,0x69,0x72, +0x65,0x64,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0xd8,0x40,0xd,0x13,0x74,0x79,0x70, +0x65,0xc3,0x15,0x24,1,0x6c,0x30,0x6f,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x25,0x12, +0x61,0x73,0x73,0xc3,0,0x26,0x14,0x69,0x72,0x72,0x6f,0x72,1,0x65,0x38,0x69, +0x16,0x6e,0x67,0x67,0x6c,0x79,0x70,0x68,0xd9,0x40,1,0x10,0x64,0x27,0x17,0x73, +0x69,0x63,0x65,0x6d,0x6f,0x6a,0x69,0xa3,0x41,6,0x68,0x7c,0x68,0x54,0x69,0x85, +0x6f,0xa2,0x6f,0x77,4,0x63,0x30,0x6b,0x36,0x6c,0x87,0x74,0x8b,0x75,0x89,1, +0x66,0x8d,0x6d,0x8f,0x11,0x63,0x66,0x91,0x18,0x61,0x6e,0x67,0x65,0x73,0x77,0x68, +0x65,0x6e,4,0x63,0x44,0x6c,0x6c,0x6e,0x7e,0x74,0x98,0x75,0x18,0x70,0x70,0x65, +0x72,0x63,0x61,0x73,0x65,0x64,0x89,0x12,0x61,0x73,0x65,1,0x66,0x30,0x6d,0x14, +0x61,0x70,0x70,0x65,0x64,0x8f,0x14,0x6f,0x6c,0x64,0x65,0x64,0x8d,0x18,0x6f,0x77, +0x65,0x72,0x63,0x61,0x73,0x65,0x64,0x87,0x1c,0x66,0x6b,0x63,0x63,0x61,0x73,0x65, +0x66,0x6f,0x6c,0x64,0x65,0x64,0x91,0x18,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65, +0x64,0x8b,0x13,0x6d,0x70,0x65,0x78,0x33,0x61,0x2e,0x63,0xa2,0x48,0x66,0xd9,0x40, +2,1,0x6e,0x72,0x73,0x10,0x65,3,0x64,0x83,0x66,0x3a,0x69,0x4a,0x73,0x17, +0x65,0x6e,0x73,0x69,0x74,0x69,0x76,0x65,0x65,0x15,0x6f,0x6c,0x64,0x69,0x6e,0x67, +0xd9,0x40,2,0x17,0x67,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x85,0x13,0x6f,0x6e, +0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x63,0x6c, +0x61,0x73,0x73,0xc3,2,0x10,0x63,0xc3,2,3,0x61,0x30,0x65,0x34,0x69,0xa2, +0x41,0x74,0xc3,3,0x11,0x73,0x68,0x29,2,0x63,0x3a,0x66,0x58,0x70,0x2c,0x16, +0x72,0x65,0x63,0x61,0x74,0x65,0x64,0x2d,0x1d,0x6f,0x6d,0x70,0x6f,0x73,0x69,0x74, +0x69,0x6f,0x6e,0x74,0x79,0x70,0x65,0xc3,3,0x15,0x61,0x75,0x6c,0x74,0x69,0x67, +0x1f,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x63,0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e, +0x74,0x2b,0x2a,0x10,0x61,0x2e,0x15,0x63,0x72,0x69,0x74,0x69,0x63,0x2f,3,0x66, +0x34,0x6e,0x3e,0x74,0x42,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x13,0x61,0x6c,0x73, +0x65,0x21,0x20,0x10,0x6f,0x21,0x22,0x12,0x72,0x75,0x65,0x23,0xb,0x6b,0x5b,0x6f, +0x23,0x6f,0x3c,0x72,0x4c,0x76,1,0x69,0x24,0x72,0x33,0x13,0x72,0x61,0x6d,0x61, +0x33,0x10,0x76,0x22,0x14,0x65,0x72,0x6c,0x61,0x79,0x23,0xa2,0xe2,0x13,0x69,0x67, +0x68,0x74,0xa3,0xe2,0x6b,0x58,0x6c,0x74,0x6e,3,0x6b,0x2f,0x6f,0x30,0x72,0x21, +0x75,0x12,0x6b,0x74,0x61,0x2f,0x19,0x74,0x72,0x65,0x6f,0x72,0x64,0x65,0x72,0x65, +0x64,0x21,1,0x61,0x24,0x76,0x31,0x18,0x6e,0x61,0x76,0x6f,0x69,0x63,0x69,0x6e, +0x67,0x31,0xa2,0xe0,0x12,0x65,0x66,0x74,0xa3,0xe0,0x64,0x45,0x64,0x4e,0x68,0x88, +0x69,1,0x6f,0x26,0x73,0xa3,0xf0,0x1a,0x74,0x61,0x73,0x75,0x62,0x73,0x63,0x72, +0x69,0x70,0x74,0xa3,0xf0,2,0x61,0xa3,0xea,0x62,0xa3,0xe9,0x6f,0x13,0x75,0x62, +0x6c,0x65,1,0x61,0x30,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa3,0xe9,0x13,0x62,0x6f, +0x76,0x65,0xa3,0xea,0x12,0x61,0x6e,0x72,0x2c,0x15,0x65,0x61,0x64,0x69,0x6e,0x67, +0x2d,0x61,0xa2,0x7b,0x62,0xa2,0xd4,0x63,0x11,0x63,0x63,4,0x31,0x3c,0x32,0xa2, +0x42,0x33,0xa2,0x56,0x38,0xa2,0x64,0x39,0x10,0x31,0xa3,0x5b,9,0x35,0xa,0x35, +0x3f,0x36,0x41,0x37,0x43,0x38,0x45,0x39,0x47,0x30,0x30,0x31,0x3c,0x32,0x42,0x33, +0x4e,0x34,0x3d,0x34,1,0x33,0xa3,0x67,0x37,0xa3,0x6b,0x36,0x10,0x38,0xa3,0x76, +0x38,1,0x32,0xa3,0x7a,0x39,0xa3,0x81,0x3a,2,0x30,0xa3,0x82,0x32,0xa3,0x84, +0x33,0xa3,0x85,9,0x35,0xa,0x35,0x53,0x36,0x55,0x37,0x57,0x38,0x59,0x39,0x5b, +0x30,0x49,0x31,0x4b,0x32,0x4d,0x33,0x4f,0x34,0x51,6,0x33,8,0x33,0x63,0x34, +0x65,0x35,0x67,0x36,0x69,0x30,0x5d,0x31,0x5f,0x32,0x61,0x10,0x34,0xa3,0x54,0xa2, +0xe6,3,0x62,0xa0,0x6c,0xa3,0xe4,0x72,0xa3,0xe8,0x74,2,0x61,0x74,0x62,0x7c, +0x74,0x14,0x61,0x63,0x68,0x65,0x64,1,0x61,0x3e,0x62,0x13,0x65,0x6c,0x6f,0x77, +0xa2,0xca,0x13,0x6c,0x65,0x66,0x74,0xa3,0xc8,0x13,0x62,0x6f,0x76,0x65,0xa2,0xd6, +0x14,0x72,0x69,0x67,0x68,0x74,0xa3,0xd8,0xa2,0xd6,0x10,0x72,0xa3,0xd8,0xa2,0xca, +0x10,0x6c,0xa3,0xc8,0x12,0x6f,0x76,0x65,0xa2,0xe6,1,0x6c,0x30,0x72,0x13,0x69, +0x67,0x68,0x74,0xa3,0xe8,0x12,0x65,0x66,0x74,0xa3,0xe4,0xa2,0xdc,2,0x65,0x2c, +0x6c,0xa3,0xda,0x72,0xa3,0xde,0x12,0x6c,0x6f,0x77,0xa2,0xdc,1,0x6c,0x30,0x72, +0x13,0x69,0x67,0x68,0x74,0xa3,0xde,0x12,0x65,0x66,0x74,0xa3,0xda,0xb,0x6e,0xc0, +0xca,0x72,0x5f,0x72,0x46,0x73,0xa2,0x48,0x77,1,0x68,0x24,0x73,0x33,0x17,0x69, +0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x33,0x22,1,0x69,0x30,0x6c,2,0x65,0x3d, +0x69,0x4b,0x6f,0x3f,0x18,0x67,0x68,0x74,0x74,0x6f,0x6c,0x65,0x66,0x74,0x22,2, +0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65,0x72,0x72,0x69,0x64,0x65,0x3f,0x17,0x6d, +0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x3d,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4b, +0x30,0x1e,0x65,0x67,0x6d,0x65,0x6e,0x74,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f, +0x72,0x31,0x6e,0xa2,0x41,0x6f,0xa2,0x53,0x70,2,0x61,0x66,0x64,0x86,0x6f,0x1b, +0x70,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x6f,0x6e,0x61,0x6c,1,0x66,0x32,0x69, +0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4d,0x14,0x6f,0x72,0x6d,0x61,0x74,0x41,0x1f, +0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72, +0x2f,1,0x66,0x41,0x69,0x4d,1,0x6f,0x28,0x73,0x10,0x6d,0x43,0x1b,0x6e,0x73, +0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x43,1,0x6e,0x35,0x74,0x19, +0x68,0x65,0x72,0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x35,0x65,0x88,0x65,0x98,0x66, +0xa2,0x6a,0x6c,0x20,1,0x65,0x30,0x72,2,0x65,0x37,0x69,0x49,0x6f,0x39,0x18, +0x66,0x74,0x74,0x6f,0x72,0x69,0x67,0x68,0x74,0x20,2,0x65,0x38,0x69,0x48,0x6f, +0x16,0x76,0x65,0x72,0x72,0x69,0x64,0x65,0x39,0x17,0x6d,0x62,0x65,0x64,0x64,0x69, +0x6e,0x67,0x37,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x49,3,0x6e,0x25,0x73,0x27, +0x74,0x29,0x75,0x15,0x72,0x6f,0x70,0x65,0x61,0x6e,2,0x6e,0x3c,0x73,0x46,0x74, +0x18,0x65,0x72,0x6d,0x69,0x6e,0x61,0x74,0x6f,0x72,0x29,0x14,0x75,0x6d,0x62,0x65, +0x72,0x25,0x17,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x27,1,0x69,0x28,0x73, +0x10,0x69,0x47,0x1f,0x72,0x73,0x74,0x73,0x74,0x72,0x6f,0x6e,0x67,0x69,0x73,0x6f, +0x6c,0x61,0x74,0x65,0x47,0x61,0x4e,0x62,0x84,0x63,1,0x6f,0x24,0x73,0x2d,0x1c, +0x6d,0x6d,0x6f,0x6e,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x2d,2,0x6c, +0x3b,0x6e,0x2b,0x72,0x13,0x61,0x62,0x69,0x63,1,0x6c,0x30,0x6e,0x14,0x75,0x6d, +0x62,0x65,0x72,0x2b,0x14,0x65,0x74,0x74,0x65,0x72,0x3b,0x2e,1,0x6e,0x45,0x6f, +0x1c,0x75,0x6e,0x64,0x61,0x72,0x79,0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x45,0, +0x16,0x6d,0xc9,0xb0,0x74,0xc2,0x6c,0x77,0x89,0x77,0x86,0x79,0xa2,0x46,0x7a,1, +0x61,0x58,0x6e,0x1a,0x61,0x6d,0x65,0x6e,0x6e,0x79,0x6d,0x75,0x73,0x69,0x63,0xa4, +0x40,0x19,0x61,0x6c,0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa5,0x40,0x1c,0x6e, +0x61,0x62,0x61,0x7a,0x61,0x72,0x73,0x71,0x75,0x61,0x72,0x65,0xa5,0x18,0x10,0x61, +1,0x6e,0x36,0x72,0x16,0x61,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0xfc,0x12,0x63, +0x68,0x6f,0xa5,0x2c,1,0x65,0x88,0x69,2,0x6a,0x3c,0x72,0x68,0x73,0x17,0x79, +0x6c,0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,0x48,0x12,0x69,0x6e,0x67,0xa2,0x74,0x1e, +0x68,0x65,0x78,0x61,0x67,0x72,0x61,0x6d,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, +0x74,0x16,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0xa3,0x49,0x13,0x7a,0x69,0x64,0x69, +0xa5,0x34,0x74,0xa2,0x65,0x75,0xa4,0x8b,0x76,3,0x61,0x3c,0x65,0x80,0x69,0xa2, +0x50,0x73,0xa2,0x6c,0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,0xa3,0x9f,0x72,0x1e, +0x69,0x61,0x74,0x69,0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,0x6f,0x72,0x73,0xa2, +0x6c,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x7d,1,0x64, +0x3c,0x72,0x19,0x74,0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x91,0x14, +0x69,0x63,0x65,0x78,0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3, +0xaf,0x15,0x74,0x68,0x6b,0x75,0x71,0x69,0xa5,0x3f,6,0x69,0x64,0x69,0x46,0x6f, +0x78,0x72,0xa2,0x43,0x75,0x19,0x6c,0x75,0x74,0x69,0x67,0x61,0x6c,0x61,0x72,0x69, +0xa5,0x52,2,0x62,0x34,0x66,0x3c,0x72,0x13,0x68,0x75,0x74,0x61,0xa3,0xfb,0x13, +0x65,0x74,0x61,0x6e,0x57,0x14,0x69,0x6e,0x61,0x67,0x68,0xa3,0x90,2,0x64,0x2e, +0x6c,0x36,0x74,0x10,0x6f,0xa5,0x3d,0x12,0x68,0x72,0x69,0xa5,0x51,0x16,0x6f,0x6e, +0x67,0x73,0x69,0x6b,0x69,0xa5,0x5a,0x1c,0x61,0x6e,0x73,0x70,0x6f,0x72,0x74,0x61, +0x6e,0x64,0x6d,0x61,0x70,0xa2,0xcf,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, +0xcf,0x61,0x3e,0x65,0xa2,0xb7,0x68,0x10,0x61,1,0x61,0x24,0x69,0x53,0x11,0x6e, +0x61,0x3d,4,0x67,0xa2,0x47,0x69,0xa2,0x59,0x6b,0xa2,0x88,0x6d,0xa2,0x8a,0x6e, +0x10,0x67,1,0x73,0x88,0x75,0x10,0x74,0xa4,0x10,1,0x63,0x40,0x73,0x11,0x75, +0x70,0xa4,0x33,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x33,0x18,0x6f,0x6d, +0x70,0x6f,0x6e,0x65,0x6e,0x74,0x73,0xa4,0x11,0x12,0x73,0x75,0x70,0xa4,0x59,0x16, +0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x59,0x10,0x61,0xa5,0x3c,2,0x61,0x2a, +0x62,0x32,0x73,0xa3,0x60,0x12,0x6c,0x6f,0x67,0xa3,0x62,0x13,0x61,0x6e,0x77,0x61, +0xa3,0x65,4,0x6c,0x36,0x74,0x3a,0x76,0x42,0x78,0x4a,0x79,0x10,0x6f,0xa5,0x58, +0x10,0x65,0xa3,0x70,0x12,0x68,0x61,0x6d,0xa3,0xae,0x12,0x69,0x65,0x74,0xa3,0xb7, 0x16,0x75,0x61,0x6e,0x6a,0x69,0x6e,0x67,0xa2,0x7c,0x16,0x73,0x79,0x6d,0x62,0x6f, -0x6c,0x73,0xa3,0x7c,0x10,0x65,0xa3,0x70,0x12,0x68,0x61,0x6d,0xa3,0xae,0x12,0x69, -0x65,0x74,0xa3,0xb7,0x11,0x72,0x69,0xa3,0xdc,0x11,0x69,0x6c,0x48,0x12,0x73,0x75, +0x6c,0x73,0xa3,0x7c,0x11,0x72,0x69,0xa3,0xdc,0x11,0x69,0x6c,0x48,0x12,0x73,0x75, 0x70,0xa4,0x2b,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x2b,0x13,0x6c,0x75, 0x67,0x75,0x4b,2,0x63,0x8c,0x67,0xa2,0x41,0x6e,0x1f,0x69,0x66,0x69,0x65,0x64, 0x63,0x61,0x6e,0x61,0x64,0x69,0x61,0x6e,0x61,0x62,0x6f,0x1f,0x72,0x69,0x67,0x69, 0x6e,0x61,0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x62,0x17,0x65,0x78, 0x74,0x65,0x6e,0x64,0x65,0x64,0xa2,0xad,0x10,0x61,0xa5,0x3e,0x11,0x61,0x73,0x62, 0x12,0x65,0x78,0x74,0xa2,0xad,0x10,0x61,0xa5,0x3e,0x15,0x61,0x72,0x69,0x74,0x69, -0x63,0xa3,0x78,0x70,0xc3,0x4b,0x70,0xa6,0x61,0x72,0xa8,0x1d,0x73,7,0x6f,0xc1, -0xbe,0x6f,0xa2,0x69,0x70,0xa2,0x85,0x75,0xa2,0xa4,0x79,2,0x6c,0x50,0x6d,0x62, +0x63,0xa3,0x78,0x70,0xc3,0x7d,0x70,0xa6,0x93,0x72,0xa8,0x4f,0x73,7,0x6f,0xc1, +0xd7,0x6f,0xa2,0x79,0x70,0xa2,0x95,0x75,0xa2,0xb4,0x79,2,0x6c,0x50,0x6d,0x62, 0x72,0x12,0x69,0x61,0x63,0x3a,0x12,0x73,0x75,0x70,0xa4,0x17,0x16,0x70,0x6c,0x65, 0x6d,0x65,0x6e,0x74,0xa5,0x17,0x17,0x6f,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0xa3, -0x8f,0x13,0x62,0x6f,0x6c,0x73,1,0x61,0x4c,0x66,0x10,0x6f,0x1f,0x72,0x6c,0x65, -0x67,0x61,0x63,0x79,0x63,0x6f,0x6d,0x70,0x75,0x74,0x69,0x6e,0x67,0xa5,0x32,0x1f, +0x8f,0x13,0x62,0x6f,0x6c,0x73,1,0x61,0x6c,0x66,0x10,0x6f,0x1f,0x72,0x6c,0x65, +0x67,0x61,0x63,0x79,0x63,0x6f,0x6d,0x70,0x75,0x74,0x69,0x6e,0x67,0xa4,0x32,0x12, +0x73,0x75,0x70,0xa4,0x50,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x50,0x1f, 0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x78,0x74, 1,0x61,0xa5,0x2a,0x65,0x14,0x6e,0x64,0x65,0x64,0x61,0xa5,0x2a,2,0x67,0x34, 0x72,0x3e,0x79,0x13,0x6f,0x6d,0x62,0x6f,0xa5,0x16,0x13,0x64,0x69,0x61,0x6e,0xa5, 0x23,0x17,0x61,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,0xa3,0xda,1,0x61,0x32,0x65, 0x14,0x63,0x69,0x61,0x6c,0x73,0xa3,0x56,0x12,0x63,0x69,0x6e,0x1f,0x67,0x6d,0x6f, 0x64,0x69,0x66,0x69,0x65,0x72,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0x2d,2,0x6e, -0x48,0x70,0x76,0x74,0x1d,0x74,0x6f,0x6e,0x73,0x69,0x67,0x6e,0x77,0x72,0x69,0x74, -0x69,0x6e,0x67,0xa5,6,0x15,0x64,0x61,0x6e,0x65,0x73,0x65,0xa2,0x9b,0x12,0x73, -0x75,0x70,0xa2,0xdb,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xdb,4,0x61, -0xa2,0xa8,0x65,0x5c,0x6d,0x9e,0x70,0xa2,0x4b,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f, -0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73, -0xa5,5,0x10,0x72,1,0x61,0x4e,0x73,0x12,0x63,0x72,0x69,0x1f,0x70,0x74,0x73, -0x61,0x6e,0x64,0x73,0x75,0x62,0x73,0x63,0x72,0x69,0x70,0x74,0x73,0x73,0x14,0x6e, -0x64,0x73,0x75,0x62,0x73,0x1b,0x61,0x74,0x68,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f, -0x72,0x73,0xa3,0x6a,1,0x6c,0x40,0x75,1,0x61,0x6e,0x6e,0x17,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x15,0x65,0x6d,0x65,0x6e,0x74,0x61,1,0x6c, -0x50,0x72,0x1e,0x79,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x61,0x72, -0x65,0x61,1,0x61,0xa3,0x6d,0x62,0xa3,0x6e,3,0x61,0x5c,0x6d,0x78,0x70,0xa2, -0x41,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63, -0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x14,0x72,0x72,0x6f,0x77,0x73, -2,0x61,0xa3,0x67,0x62,0xa3,0x68,0x63,0xa3,0xfa,0x13,0x61,0x74,0x68,0x65,0x1f, -0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73, -0xa3,0x6a,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x61, -0x88,0x68,0xa2,0x48,0x69,0xa2,0x71,0x6d,0x12,0x61,0x6c,0x6c,1,0x66,0x46,0x6b, -0x15,0x61,0x6e,0x61,0x65,0x78,0x74,0xa4,0x29,0x15,0x65,0x6e,0x73,0x69,0x6f,0x6e, -0xa5,0x29,0x12,0x6f,0x72,0x6d,1,0x73,0xa3,0x54,0x76,0x16,0x61,0x72,0x69,0x61, -0x6e,0x74,0x73,0xa3,0x54,1,0x6d,0x36,0x75,0x16,0x72,0x61,0x73,0x68,0x74,0x72, -0x61,0xa3,0xa1,0x15,0x61,0x72,0x69,0x74,0x61,0x6e,0xa3,0xac,1,0x61,0x52,0x6f, -0x13,0x72,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f, -0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa3,0xf7,1,0x72,0x2e,0x76,0x12,0x69,0x61,0x6e, -0xa3,0x79,0x12,0x61,0x64,0x61,0xa3,0xd9,1,0x64,0x50,0x6e,0x13,0x68,0x61,0x6c, -0x61,0x50,0x1d,0x61,0x72,0x63,0x68,0x61,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72, -0x73,0xa3,0xf9,0x13,0x64,0x68,0x61,0x6d,0xa3,0xf8,5,0x72,0x35,0x72,0x44,0x73, -0x64,0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e, -0x71,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xa2,0x4e,0x13,0x61,0x72,0x65, -0x61,0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69, -0xa3,0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61,0x79,0x69,0x6e,0x67,0x63,0x61,0x72, -0x64,0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a,0x75,0x15,0x63,0x69,0x6e,0x68,0x61, -0x75,0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xf3,0x15,0x6d, -0x79,0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61,0x8e,0x6f,1,0x65,0x74,0x6e,0x16, -0x65,0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72,1,0x65,0x2c,0x73,0x11,0x75,0x70, -0xa3,0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa2,0x72,0x19,0x73,0x75,0x70,0x70, -0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3, -0x97,1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f,0x73,0xa2,0xa6,0x13,0x64,0x69,0x73, -0x63,0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96,1,0x65,0x5c,0x75,1,0x6d,0x2a, -0x6e,0x11,0x69,0x63,0x67,0x10,0x69,0xa2,0xc0,0x1d,0x6e,0x75,0x6d,0x65,0x72,0x61, -0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xc0,0x13,0x6a,0x61,0x6e,0x67,0xa3, -0xa3,0x6d,0xa2,0xf0,0x6e,0xa8,0x23,0x6f,6,0x70,0x63,0x70,0x56,0x72,0x8a,0x73, -0xa2,0x4c,0x74,0x10,0x74,0x1f,0x6f,0x6d,0x61,0x6e,0x73,0x69,0x79,0x61,0x71,0x6e, -0x75,0x6d,0x62,0x65,0x72,0x73,0xa5,0x28,0x18,0x74,0x69,0x63,0x61,0x6c,0x63,0x68, -0x61,0x72,0x1f,0x61,0x63,0x74,0x65,0x72,0x72,0x65,0x63,0x6f,0x67,0x6e,0x69,0x74, -0x69,0x6f,0x6e,0x85,1,0x69,0x46,0x6e,0x1e,0x61,0x6d,0x65,0x6e,0x74,0x61,0x6c, -0x64,0x69,0x6e,0x67,0x62,0x61,0x74,0x73,0xa3,0xf2,0x11,0x79,0x61,0x47,1,0x61, -0x30,0x6d,0x13,0x61,0x6e,0x79,0x61,0xa3,0x7a,0x11,0x67,0x65,0xa5,0xf,0x63,0xa2, -0x7b,0x67,0xa2,0x7b,0x6c,1,0x63,0xa2,0x6c,0x64,6,0x70,0x42,0x70,0x3a,0x73, +0x48,0x70,0x88,0x74,0x1d,0x74,0x6f,0x6e,0x73,0x69,0x67,0x6e,0x77,0x72,0x69,0x74, +0x69,0x6e,0x67,0xa5,6,1,0x64,0x2e,0x75,0x12,0x77,0x61,0x72,0xa5,0x4f,0x14, +0x61,0x6e,0x65,0x73,0x65,0xa2,0x9b,0x12,0x73,0x75,0x70,0xa2,0xdb,0x16,0x70,0x6c, +0x65,0x6d,0x65,0x6e,0x74,0xa3,0xdb,4,0x61,0xa2,0xa8,0x65,0x5c,0x6d,0x9e,0x70, +0xa2,0x4b,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69, +0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x10,0x72,1,0x61,0x4e, +0x73,0x12,0x63,0x72,0x69,0x1f,0x70,0x74,0x73,0x61,0x6e,0x64,0x73,0x75,0x62,0x73, +0x63,0x72,0x69,0x70,0x74,0x73,0x73,0x14,0x6e,0x64,0x73,0x75,0x62,0x73,0x1b,0x61, +0x74,0x68,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,1,0x6c,0x40, +0x75,1,0x61,0x6e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e, +0x15,0x65,0x6d,0x65,0x6e,0x74,0x61,1,0x6c,0x50,0x72,0x1e,0x79,0x70,0x72,0x69, +0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x61,0x72,0x65,0x61,1,0x61,0xa3,0x6d,0x62, +0xa3,0x6e,3,0x61,0x5c,0x6d,0x78,0x70,0xa2,0x41,0x73,0x13,0x79,0x6d,0x62,0x6f, +0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68, +0x73,0xa5,5,0x14,0x72,0x72,0x6f,0x77,0x73,2,0x61,0xa3,0x67,0x62,0xa3,0x68, +0x63,0xa3,0xfa,0x13,0x61,0x74,0x68,0x65,0x1f,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c, +0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,0x19,0x75,0x6e,0x63,0x74, +0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x61,0x88,0x68,0xa2,0x48,0x69,0xa2,0x81, +0x6d,0x12,0x61,0x6c,0x6c,1,0x66,0x46,0x6b,0x15,0x61,0x6e,0x61,0x65,0x78,0x74, +0xa4,0x29,0x15,0x65,0x6e,0x73,0x69,0x6f,0x6e,0xa5,0x29,0x12,0x6f,0x72,0x6d,1, +0x73,0xa3,0x54,0x76,0x16,0x61,0x72,0x69,0x61,0x6e,0x74,0x73,0xa3,0x54,1,0x6d, +0x36,0x75,0x16,0x72,0x61,0x73,0x68,0x74,0x72,0x61,0xa3,0xa1,0x15,0x61,0x72,0x69, +0x74,0x61,0x6e,0xa3,0xac,1,0x61,0x52,0x6f,0x13,0x72,0x74,0x68,0x61,0x1f,0x6e, +0x64,0x66,0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa3, +0xf7,1,0x72,0x2e,0x76,0x12,0x69,0x61,0x6e,0xa3,0x79,0x12,0x61,0x64,0x61,0xa2, +0xd9,0x12,0x73,0x75,0x70,0xa4,0x56,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5, +0x56,1,0x64,0x50,0x6e,0x13,0x68,0x61,0x6c,0x61,0x50,0x1d,0x61,0x72,0x63,0x68, +0x61,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0xf9,1,0x64,0x2e,0x65, +0x12,0x74,0x69,0x63,0xa5,0x57,0x12,0x68,0x61,0x6d,0xa3,0xf8,5,0x72,0x35,0x72, +0x44,0x73,0x64,0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69, +0x6f,0x6e,0x71,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xa2,0x4e,0x13,0x61, +0x72,0x65,0x61,0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61, +0x76,0x69,0xa3,0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61,0x79,0x69,0x6e,0x67,0x63, +0x61,0x72,0x64,0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a,0x75,0x15,0x63,0x69,0x6e, +0x68,0x61,0x75,0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xf3, +0x15,0x6d,0x79,0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61,0x8e,0x6f,1,0x65,0x74, +0x6e,0x16,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72,1,0x65,0x2c,0x73,0x11, +0x75,0x70,0xa3,0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa2,0x72,0x19,0x73,0x75, +0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15,0x6e,0x69,0x63,0x69,0x61, +0x6e,0xa3,0x97,1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f,0x73,0xa2,0xa6,0x13,0x64, +0x69,0x73,0x63,0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96,1,0x65,0x5c,0x75,1, +0x6d,0x2a,0x6e,0x11,0x69,0x63,0x67,0x10,0x69,0xa2,0xc0,0x1d,0x6e,0x75,0x6d,0x65, +0x72,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xc0,0x13,0x6a,0x61,0x6e, +0x67,0xa3,0xa3,0x6d,0xa2,0xf7,0x6e,0xa8,0x45,0x6f,6,0x70,0x63,0x70,0x56,0x72, +0x8a,0x73,0xa2,0x4c,0x74,0x10,0x74,0x1f,0x6f,0x6d,0x61,0x6e,0x73,0x69,0x79,0x61, +0x71,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa5,0x28,0x18,0x74,0x69,0x63,0x61,0x6c, +0x63,0x68,0x61,0x72,0x1f,0x61,0x63,0x74,0x65,0x72,0x72,0x65,0x63,0x6f,0x67,0x6e, +0x69,0x74,0x69,0x6f,0x6e,0x85,1,0x69,0x46,0x6e,0x1e,0x61,0x6d,0x65,0x6e,0x74, +0x61,0x6c,0x64,0x69,0x6e,0x67,0x62,0x61,0x74,0x73,0xa3,0xf2,0x11,0x79,0x61,0x47, +1,0x61,0x30,0x6d,0x13,0x61,0x6e,0x79,0x61,0xa3,0x7a,0x11,0x67,0x65,0xa5,0xf, +0x63,0xa2,0x82,0x67,0xa2,0x82,0x6c,2,0x63,0x32,0x64,0x3c,0x6f,0x12,0x6e,0x61, +0x6c,0xa5,0x4e,0x13,0x68,0x69,0x6b,0x69,0xa3,0x9d,6,0x70,0x42,0x70,0x3a,0x73, 0x5a,0x74,0x88,0x75,0x14,0x79,0x67,0x68,0x75,0x72,0xa5,0x3b,0x11,0x65,0x72,1, 0x6d,0x2e,0x73,0x12,0x69,0x61,0x6e,0xa3,0x8c,0x11,0x69,0x63,0xa3,0xf1,0x10,0x6f, 1,0x67,0x3a,0x75,0x18,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0xbb, 0x13,0x64,0x69,0x61,0x6e,0xa5,0x22,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,0xbf,0x68, 0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e, 0xa3,0xf0,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e,0xa5,4,0x14,0x74,0x61, -0x6c,0x69,0x63,0xa3,0x58,0x13,0x68,0x69,0x6b,0x69,0xa3,0x9d,0x10,0x72,0x85,0x12, -0x68,0x61,0x6d,0x65,6,0x6f,0x86,0x6f,0x6c,0x72,0xa2,0x61,0x75,0xa2,0x62,0x79, -0x14,0x61,0x6e,0x6d,0x61,0x72,0x58,0x12,0x65,0x78,0x74,2,0x61,0xa3,0xb6,0x62, -0xa3,0xee,0x65,0x13,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb6,0x62,0xa3,0xee,1, -0x64,0x52,0x6e,0x15,0x67,0x6f,0x6c,0x69,0x61,0x6e,0x6a,0x12,0x73,0x75,0x70,0xa4, -0xd,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0xd,0x10,0x69,0xa2,0xec,0x13, -0x66,0x69,0x65,0x72,1,0x6c,0x3c,0x74,0x19,0x6f,0x6e,0x65,0x6c,0x65,0x74,0x74, -0x65,0x72,0x73,0xa3,0x8a,0x15,0x65,0x74,0x74,0x65,0x72,0x73,0x2d,0x10,0x6f,0xa3, -0xed,1,0x6c,0x44,0x73,0x11,0x69,0x63,0xa2,0x5c,0x18,0x61,0x6c,0x73,0x79,0x6d, -0x62,0x6f,0x6c,0x73,0xa3,0x5c,0x13,0x74,0x61,0x6e,0x69,0xa5,3,0x61,0xa2,0x9b, -0x65,0xa4,0x4c,0x69,1,0x61,0xa2,0x8f,0x73,0x10,0x63,5,0x70,0x18,0x70,0xa2, -0x71,0x73,0x36,0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x15,0x79, -0x6d,0x62,0x6f,0x6c,0x73,0x8f,0x61,0xa2,0x66,0x65,0x46,0x6d,0x19,0x61,0x74,0x68, -0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1,0x61,0xa3,0x66,0x62,0xa3,0x69,0x17,0x6c, -0x6c,0x61,0x6e,0x65,0x6f,0x75,0x73,2,0x6d,0x3a,0x73,0x6c,0x74,0x17,0x65,0x63, -0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x11,0x61,0x74,0x1f,0x68,0x65,0x6d,0x61,0x74, -0x69,0x63,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1,0x61,0xa3,0x66,0x62, -0xa3,0x69,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x8e,0x12,0x61,0x6e,0x64,1,0x61, -0x3c,0x70,0x19,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa3,0xcd,0x14, -0x72,0x72,0x6f,0x77,0x73,0xa3,0x73,0x10,0x6f,0xa3,0xd8,7,0x72,0x6f,0x72,0x44, -0x73,0x4e,0x74,0x62,0x79,0x19,0x61,0x6e,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73, -0xa5,0x20,0x13,0x63,0x68,0x65,0x6e,0xa5,0xc,0x18,0x61,0x72,0x61,0x6d,0x67,0x6f, -0x6e,0x64,0x69,0xa5,0x14,0x10,0x68,2,0x61,0x3a,0x65,0x4a,0x6f,0x17,0x70,0x65, -0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x16,0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,0xa3, -0x5d,0x16,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,1,0x61,0x36,0x6f,0x17,0x70,0x65, -0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x11,0x6c,0x70,0x1f,0x68,0x61,0x6e,0x75,0x6d, -0x65,0x72,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5d,0x68,0x50,0x6b, -0x7e,0x6c,0x88,0x6e,1,0x64,0x34,0x69,0x15,0x63,0x68,0x61,0x65,0x61,0x6e,0xa3, -0xea,0x12,0x61,0x69,0x63,0xa3,0xc6,1,0x61,0x3e,0x6a,0x12,0x6f,0x6e,0x67,0xa2, -0xaa,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xaa,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xe9, -0x13,0x61,0x73,0x61,0x72,0xa5,0x1f,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x4f,3, -0x64,0x6c,0x65,0x7e,0x6e,0xa2,0x47,0x72,0x14,0x6f,0x69,0x74,0x69,0x63,1,0x63, -0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xd7,0x15, -0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0xd6,0x17,0x65,0x66,0x61,0x69,0x64,0x72,0x69, -0x6e,0xa5,0x21,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b,0xa2,0xb8,0x12,0x65, -0x78,0x74,0xa2,0xd5,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0xd5,0x18,0x64, -0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0xeb,6,0x6b,0x3b,0x6b,0x56,0x6f, -0x5a,0x75,0x64,0x79,0x11,0x69,0x61,0x1f,0x6b,0x65,0x6e,0x67,0x70,0x75,0x61,0x63, -0x68,0x75,0x65,0x68,0x6d,0x6f,0x6e,0x67,0xa5,0x27,0x10,0x6f,0xa3,0x92,0x14,0x62, -0x6c,0x6f,0x63,0x6b,0x21,1,0x6d,0x2c,0x73,0x11,0x68,0x75,0xa5,0x15,0x17,0x62, -0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0x7b,0x61,0x44,0x62,0x21,0x65,0x10,0x77,1, -0x61,0xa5,0xe,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0xa3,0x8b,2,0x62,0x3c,0x67, -0x4a,0x6e,0x17,0x64,0x69,0x6e,0x61,0x67,0x61,0x72,0x69,0xa5,0x26,0x15,0x61,0x74, -0x61,0x65,0x61,0x6e,0xa3,0xef,0x16,0x6d,0x75,0x6e,0x64,0x61,0x72,0x69,0xa5,0x47, -0x67,0xc4,0x5d,0x6a,0xc1,0xe4,0x6a,0xa2,0xdf,0x6b,0xa2,0xf8,0x6c,4,0x61,0x54, -0x65,0xa2,0x6b,0x69,0xa2,0x82,0x6f,0xa2,0xc1,0x79,1,0x63,0x2e,0x64,0x12,0x69, -0x61,0x6e,0xa3,0xa9,0x12,0x69,0x61,0x6e,0xa3,0xa7,1,0x6f,0x55,0x74,0x11,0x69, -0x6e,1,0x31,0x96,0x65,0x11,0x78,0x74,6,0x64,0x21,0x64,0xa3,0x95,0x65,0x2c, -0x66,0xa5,0x39,0x67,0xa5,0x3a,0xa2,0xe7,0x13,0x6e,0x64,0x65,0x64,6,0x64,0xc, -0x64,0xa3,0x95,0x65,0xa3,0xe7,0x66,0xa5,0x39,0x67,0xa5,0x3a,0x61,0x2a,0x62,0x29, -0x63,0xa3,0x94,0x26,0x18,0x64,0x64,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x6d,0x24, -0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x25,1,0x70, -0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,0x65,0x73,0x79,0x6d,0x62,0x6f,0x6c, -0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,0x6d,0x4e,0x6e,0x54,0x73,0x10,0x75, -0xa2,0xb0,0x12,0x73,0x75,0x70,0xa4,0x31,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74, -0xa5,0x31,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,0x61,0x72,1,0x61,0xa3,0xe8,0x62, -1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,0x75,0x17, -0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,0x76,0x1a,0x77,0x73,0x75,0x72,0x72, -0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,0x61,1,0x6d,0x32,0x76,0x14,0x61, -0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,0x12,0x65,0x78,0x74,1,0x61,0xa3, -0xb4,0x62,0xa3,0xb9,1,0x61,0xa2,0x43,0x68,4,0x61,0x40,0x69,0x50,0x6d,0x6e, -0x6f,0x86,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,0x16,0x72,0x6f,0x73, -0x68,0x74,0x68,0x69,0xa3,0x89,0x1d,0x74,0x61,0x6e,0x73,0x6d,0x61,0x6c,0x6c,0x73, -0x63,0x72,0x69,0x70,0x74,0xa5,0x30,0x11,0x65,0x72,0x68,0x16,0x73,0x79,0x6d,0x62, -0x6f,0x6c,0x73,0xa3,0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,5,0x74,0x35,0x74,0x34, -0x77,0x7a,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0xa2,0x14,0x61,0x6b,0x61,0x6e,0x61, -0x9e,1,0x65,0x4c,0x70,0x10,0x68,0x1f,0x6f,0x6e,0x65,0x74,0x69,0x63,0x65,0x78, -0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0x6b,0x11,0x78,0x74,0xa3,0x6b,0x10, -0x69,0xa5,0x46,0x69,0xa2,0x4e,0x6b,0xa2,0x51,0x6e,3,0x61,0x34,0x62,0x84,0x67, -0x8a,0x6e,0x12,0x61,0x64,0x61,0x4d,1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0xcb, -0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xcb,0x11,0x78,0x74,2,0x61,0xa5, -0x13,0x62,0xa5,0x38,0x65,0x13,0x6e,0x64,0x65,0x64,1,0x61,0xa5,0x13,0x62,0xa5, -0x38,0x11,0x75,0x6e,0xa3,0x42,0x11,0x78,0x69,0x96,0x17,0x72,0x61,0x64,0x69,0x63, -0x61,0x6c,0x73,0x97,0x12,0x74,0x68,0x69,0xa3,0xc1,0x1c,0x74,0x6f,0x76,0x69,0x6b, -0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0xa5,0x45,0x67,0xa2,0xb5,0x68,0xa4,0x84, -0x69,3,0x64,0x4c,0x6d,0xa2,0x55,0x6e,0xa2,0x62,0x70,0x13,0x61,0x65,0x78,0x74, -0x2a,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0x2b,1,0x63,0x99,0x65,0x17,0x6f, -0x67,0x72,0x61,0x70,0x68,0x69,0x63,1,0x64,0x56,0x73,0x15,0x79,0x6d,0x62,0x6f, -0x6c,0x73,0xa4,0xb,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74, -0x69,0x6f,0x6e,0xa5,0xb,0x13,0x65,0x73,0x63,0x72,0x1f,0x69,0x70,0x74,0x69,0x6f, -0x6e,0x63,0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x99,0x1c,0x70,0x65,0x72, -0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0xba,1,0x64,0x62,0x73, -0x1b,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32, -0x72,0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0xbd,0x13,0x6c,0x61,0x76,0x69,0xa3,0xbe, -0x11,0x69,0x63,1,0x6e,0x3e,0x73,0x1a,0x69,0x79,0x61,0x71,0x6e,0x75,0x6d,0x62, -0x65,0x72,0x73,0xa5,0x1e,0x19,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73, -0xa3,0xb2,4,0x65,0x74,0x6c,0xa2,0x82,0x6f,0xa2,0x9a,0x72,0xa2,0x9e,0x75,2, -0x6a,0x34,0x6e,0x3e,0x72,0x14,0x6d,0x75,0x6b,0x68,0x69,0x43,0x14,0x61,0x72,0x61, -0x74,0x69,0x45,0x18,0x6a,0x61,0x6c,0x61,0x67,0x6f,0x6e,0x64,0x69,0xa5,0x1c,1, -0x6e,0xa2,0x46,0x6f,1,0x6d,0x6e,0x72,0x13,0x67,0x69,0x61,0x6e,0x5a,1,0x65, -0x40,0x73,0x11,0x75,0x70,0xa2,0x87,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3, -0x87,0x11,0x78,0x74,0xa4,0x1b,0x14,0x65,0x6e,0x64,0x65,0x64,0xa5,0x1b,0x1a,0x65, -0x74,0x72,0x69,0x63,0x73,0x68,0x61,0x70,0x65,0x73,0x8c,0x12,0x65,0x78,0x74,0xa2, -0xe3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe3,0x1e,0x65,0x72,0x61,0x6c,0x70,0x75, -0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x61,0x67,0x6f,0x6c,0x69, +0x6c,0x69,0x63,0xa3,0x58,0x10,0x72,0x85,0x12,0x68,0x61,0x6d,0x65,6,0x6f,0x8c, +0x6f,0x78,0x72,0xa2,0x67,0x75,0xa2,0x68,0x79,0x14,0x61,0x6e,0x6d,0x61,0x72,0x58, +0x12,0x65,0x78,0x74,3,0x61,0xa3,0xb6,0x62,0xa3,0xee,0x63,0xa5,0x4d,0x65,0x13, +0x6e,0x64,0x65,0x64,2,0x61,0xa3,0xb6,0x62,0xa3,0xee,0x63,0xa5,0x4d,1,0x64, +0x52,0x6e,0x15,0x67,0x6f,0x6c,0x69,0x61,0x6e,0x6a,0x12,0x73,0x75,0x70,0xa4,0xd, +0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0xd,0x10,0x69,0xa2,0xec,0x13,0x66, +0x69,0x65,0x72,1,0x6c,0x3c,0x74,0x19,0x6f,0x6e,0x65,0x6c,0x65,0x74,0x74,0x65, +0x72,0x73,0xa3,0x8a,0x15,0x65,0x74,0x74,0x65,0x72,0x73,0x2d,0x10,0x6f,0xa3,0xed, +1,0x6c,0x44,0x73,0x11,0x69,0x63,0xa2,0x5c,0x18,0x61,0x6c,0x73,0x79,0x6d,0x62, +0x6f,0x6c,0x73,0xa3,0x5c,0x13,0x74,0x61,0x6e,0x69,0xa5,3,0x61,0xa2,0xb0,0x65, +0xa4,0x61,0x69,1,0x61,0xa2,0xa4,0x73,0x10,0x63,5,0x70,0x1e,0x70,0xa2,0x86, +0x73,0x36,0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x15,0x79,0x6d, +0x62,0x6f,0x6c,0x73,0x8e,0x12,0x73,0x75,0x70,0xa5,0x55,0x61,0xa2,0x75,0x65,0x46, +0x6d,0x19,0x61,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1,0x61,0xa3,0x66, +0x62,0xa3,0x69,0x17,0x6c,0x6c,0x61,0x6e,0x65,0x6f,0x75,0x73,2,0x6d,0x3a,0x73, +0x6c,0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x11,0x61,0x74,0x1f, +0x68,0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73, +1,0x61,0xa3,0x66,0x62,0xa3,0x69,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x8e,1, +0x61,0x3a,0x73,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0x55,0x11, +0x6e,0x64,1,0x61,0x3c,0x70,0x19,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68, +0x73,0xa3,0xcd,0x14,0x72,0x72,0x6f,0x77,0x73,0xa3,0x73,0x10,0x6f,0xa3,0xd8,7, +0x72,0x6f,0x72,0x44,0x73,0x4e,0x74,0x62,0x79,0x19,0x61,0x6e,0x6e,0x75,0x6d,0x65, +0x72,0x61,0x6c,0x73,0xa5,0x20,0x13,0x63,0x68,0x65,0x6e,0xa5,0xc,0x18,0x61,0x72, +0x61,0x6d,0x67,0x6f,0x6e,0x64,0x69,0xa5,0x14,0x10,0x68,2,0x61,0x3a,0x65,0x4a, +0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x16,0x6c,0x70,0x68,0x61, +0x6e,0x75,0x6d,0xa3,0x5d,0x16,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,1,0x61,0x36, +0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x11,0x6c,0x70,0x1f,0x68, +0x61,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, +0x5d,0x68,0x50,0x6b,0x7e,0x6c,0x88,0x6e,1,0x64,0x34,0x69,0x15,0x63,0x68,0x61, +0x65,0x61,0x6e,0xa3,0xea,0x12,0x61,0x69,0x63,0xa3,0xc6,1,0x61,0x3e,0x6a,0x12, +0x6f,0x6e,0x67,0xa2,0xaa,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xaa,0x13,0x6a,0x61, +0x6e,0x69,0xa3,0xe9,0x13,0x61,0x73,0x61,0x72,0xa5,0x1f,0x15,0x61,0x79,0x61,0x6c, +0x61,0x6d,0x4f,3,0x64,0x6c,0x65,0x7e,0x6e,0xa2,0x47,0x72,0x14,0x6f,0x69,0x74, +0x69,0x63,1,0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68, +0x73,0xa3,0xd7,0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0xd6,0x17,0x65,0x66,0x61, +0x69,0x64,0x72,0x69,0x6e,0xa5,0x21,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b, +0xa2,0xb8,0x12,0x65,0x78,0x74,0xa2,0xd5,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73, +0xa3,0xd5,0x18,0x64,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0xeb,6,0x6b, +0x3b,0x6b,0x56,0x6f,0x5a,0x75,0x64,0x79,0x11,0x69,0x61,0x1f,0x6b,0x65,0x6e,0x67, +0x70,0x75,0x61,0x63,0x68,0x75,0x65,0x68,0x6d,0x6f,0x6e,0x67,0xa5,0x27,0x10,0x6f, +0xa3,0x92,0x14,0x62,0x6c,0x6f,0x63,0x6b,0x21,1,0x6d,0x2c,0x73,0x11,0x68,0x75, +0xa5,0x15,0x17,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0x7b,0x61,0x44,0x62,0x21, +0x65,0x10,0x77,1,0x61,0xa5,0xe,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0xa3,0x8b, +2,0x62,0x3c,0x67,0x4a,0x6e,0x17,0x64,0x69,0x6e,0x61,0x67,0x61,0x72,0x69,0xa5, +0x26,0x15,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0xef,0x16,0x6d,0x75,0x6e,0x64,0x61, +0x72,0x69,0xa5,0x47,0x67,0xc4,0x7b,0x6a,0xc1,0xef,0x6a,0xa2,0xdf,0x6b,0xa2,0xf8, +0x6c,4,0x61,0x54,0x65,0xa2,0x6b,0x69,0xa2,0x82,0x6f,0xa2,0xc1,0x79,1,0x63, +0x2e,0x64,0x12,0x69,0x61,0x6e,0xa3,0xa9,0x12,0x69,0x61,0x6e,0xa3,0xa7,1,0x6f, +0x55,0x74,0x11,0x69,0x6e,1,0x31,0x96,0x65,0x11,0x78,0x74,6,0x64,0x21,0x64, +0xa3,0x95,0x65,0x2c,0x66,0xa5,0x39,0x67,0xa5,0x3a,0xa2,0xe7,0x13,0x6e,0x64,0x65, +0x64,6,0x64,0xc,0x64,0xa3,0x95,0x65,0xa3,0xe7,0x66,0xa5,0x39,0x67,0xa5,0x3a, +0x61,0x2a,0x62,0x29,0x63,0xa3,0x94,0x26,0x18,0x64,0x64,0x69,0x74,0x69,0x6f,0x6e, +0x61,0x6c,0x6d,0x24,0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, +0x74,0x25,1,0x70,0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,0x65,0x73,0x79, +0x6d,0x62,0x6f,0x6c,0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,0x6d,0x4e,0x6e, +0x54,0x73,0x10,0x75,0xa2,0xb0,0x12,0x73,0x75,0x70,0xa4,0x31,0x16,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa5,0x31,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,0x61,0x72,1, +0x61,0xa3,0xe8,0x62,1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72, +0x79,0xa3,0x75,0x17,0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,0x76,0x1a,0x77, +0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,0x61,1,0x6d, +0x32,0x76,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,0x12,0x65,0x78, +0x74,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,2,0x61,0x3a,0x68,0xa2,0xa9,0x69,0x15, +0x72,0x61,0x74,0x72,0x61,0x69,0xa5,0x4c,5,0x74,0x35,0x74,0x34,0x77,0x7a,0x79, +0x13,0x61,0x68,0x6c,0x69,0xa3,0xa2,0x14,0x61,0x6b,0x61,0x6e,0x61,0x9e,1,0x65, +0x4c,0x70,0x10,0x68,0x1f,0x6f,0x6e,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0x65,0x6e, +0x73,0x69,0x6f,0x6e,0x73,0xa3,0x6b,0x11,0x78,0x74,0xa3,0x6b,0x10,0x69,0xa5,0x46, +0x69,0xa2,0x4e,0x6b,0xa2,0x51,0x6e,3,0x61,0x34,0x62,0x84,0x67,0x8a,0x6e,0x12, +0x61,0x64,0x61,0x4d,1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0xcb,0x16,0x70,0x6c, +0x65,0x6d,0x65,0x6e,0x74,0xa3,0xcb,0x11,0x78,0x74,2,0x61,0xa5,0x13,0x62,0xa5, +0x38,0x65,0x13,0x6e,0x64,0x65,0x64,1,0x61,0xa5,0x13,0x62,0xa5,0x38,0x11,0x75, +0x6e,0xa3,0x42,0x11,0x78,0x69,0x96,0x17,0x72,0x61,0x64,0x69,0x63,0x61,0x6c,0x73, +0x97,0x12,0x74,0x68,0x69,0xa3,0xc1,0x1c,0x74,0x6f,0x76,0x69,0x6b,0x6e,0x75,0x6d, +0x65,0x72,0x61,0x6c,0x73,0xa5,0x45,4,0x61,0x40,0x69,0x50,0x6d,0x6e,0x6f,0x86, +0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,0x16,0x72,0x6f,0x73,0x68,0x74, +0x68,0x69,0xa3,0x89,0x1d,0x74,0x61,0x6e,0x73,0x6d,0x61,0x6c,0x6c,0x73,0x63,0x72, +0x69,0x70,0x74,0xa5,0x30,0x11,0x65,0x72,0x68,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c, +0x73,0xa3,0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,0x67,0xa2,0xb5,0x68,0xa4,0x97,0x69, +3,0x64,0x4c,0x6d,0xa2,0x55,0x6e,0xa2,0x62,0x70,0x13,0x61,0x65,0x78,0x74,0x2a, +0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0x2b,1,0x63,0x99,0x65,0x17,0x6f,0x67, +0x72,0x61,0x70,0x68,0x69,0x63,1,0x64,0x56,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c, +0x73,0xa4,0xb,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, +0x6f,0x6e,0xa5,0xb,0x13,0x65,0x73,0x63,0x72,0x1f,0x69,0x70,0x74,0x69,0x6f,0x6e, +0x63,0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x99,0x1c,0x70,0x65,0x72,0x69, +0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0xba,1,0x64,0x62,0x73,0x1b, +0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72, +0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0xbd,0x13,0x6c,0x61,0x76,0x69,0xa3,0xbe,0x11, +0x69,0x63,1,0x6e,0x3e,0x73,0x1a,0x69,0x79,0x61,0x71,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x73,0xa5,0x1e,0x19,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3, +0xb2,5,0x6f,0x61,0x6f,0x80,0x72,0x8a,0x75,2,0x6a,0x4e,0x6e,0x58,0x72,1, +0x6d,0x36,0x75,0x16,0x6e,0x67,0x6b,0x68,0x65,0x6d,0x61,0xa5,0x4b,0x13,0x75,0x6b, +0x68,0x69,0x43,0x14,0x61,0x72,0x61,0x74,0x69,0x45,0x18,0x6a,0x61,0x6c,0x61,0x67, +0x6f,0x6e,0x64,0x69,0xa5,0x1c,0x13,0x74,0x68,0x69,0x63,0xa3,0x59,1,0x61,0x5c, +0x65,0x11,0x65,0x6b,0x30,1,0x61,0x38,0x65,0x11,0x78,0x74,0x6e,0x14,0x65,0x6e, +0x64,0x65,0x64,0x6f,0x17,0x6e,0x64,0x63,0x6f,0x70,0x74,0x69,0x63,0x31,0x13,0x6e, +0x74,0x68,0x61,0xa3,0xe4,0x61,0x5c,0x65,0x64,0x6c,0x17,0x61,0x67,0x6f,0x6c,0x69, 0x74,0x69,0x63,0xa2,0x88,0x12,0x73,0x75,0x70,0xa4,0xa,0x16,0x70,0x6c,0x65,0x6d, -0x65,0x6e,0x74,0xa5,0xa,0x13,0x74,0x68,0x69,0x63,0xa3,0x59,1,0x61,0x5c,0x65, -0x11,0x65,0x6b,0x30,1,0x61,0x38,0x65,0x11,0x78,0x74,0x6e,0x14,0x65,0x6e,0x64, -0x65,0x64,0x6f,0x17,0x6e,0x64,0x63,0x6f,0x70,0x74,0x69,0x63,0x31,0x13,0x6e,0x74, -0x68,0x61,0xa3,0xe4,2,0x61,0xa2,0x48,0x65,0xa2,0xdf,0x69,1,0x67,0x30,0x72, -0x14,0x61,0x67,0x61,0x6e,0x61,0x9d,0x10,0x68,1,0x70,0x3a,0x73,0x18,0x75,0x72, -0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4b,1,0x72,0x3c,0x75,0x19,0x73,0x75, -0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,0x11,0x69,0x76,0x1f,0x61,0x74, -0x65,0x75,0x73,0x65,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c, -2,0x6c,0x32,0x6e,0x9a,0x74,0x12,0x72,0x61,0x6e,0xa5,2,0x10,0x66,2,0x61, -0x58,0x6d,0x70,0x77,0x14,0x69,0x64,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x75,0x6c, -0x6c,0x77,0x69,0x64,0x74,0x68,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x1a,0x6e,0x64, -0x66,0x75,0x6c,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x13,0x61,0x72,0x6b,0x73, -0xa3,0x52,2,0x67,0x34,0x69,0xa2,0x45,0x75,0x12,0x6e,0x6f,0x6f,0xa3,0x63,0x11, -0x75,0x6c,0xa2,0x4a,2,0x63,0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62, -0x6c,0x65,0x73,0xa3,0x4a,0x1f,0x6f,0x6d,0x70,0x61,0x74,0x69,0x62,0x69,0x6c,0x69, -0x74,0x79,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c,0x17,0x65,0x78, -0x74,0x65,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,0x19,0x66,0x69, -0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa5,0x1d,0x13,0x62,0x72,0x65,0x77,0x37, -0x61,0xa4,0xc,0x62,0xa6,0x59,0x63,0xa8,0x2e,0x64,0xac,0xe9,0x65,5,0x6d,0xa9, -0x6d,0x94,0x6e,0xa2,0x41,0x74,0x15,0x68,0x69,0x6f,0x70,0x69,0x63,0x5e,1,0x65, -0x40,0x73,0x11,0x75,0x70,0xa2,0x86,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3, -0x86,0x11,0x78,0x74,0xa2,0x85,2,0x61,0xa3,0xc8,0x62,0xa5,0x37,0x65,0x13,0x6e, -0x64,0x65,0x64,0xa2,0x85,1,0x61,0xa3,0xc8,0x62,0xa5,0x37,0x16,0x6f,0x74,0x69, -0x63,0x6f,0x6e,0x73,0xa3,0xce,0x15,0x63,0x6c,0x6f,0x73,0x65,0x64,2,0x61,0x5a, -0x63,0x9e,0x69,0x1c,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x75, -0x70,0xa2,0xc4,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc4,0x16,0x6c,0x70, -0x68,0x61,0x6e,0x75,0x6d,0x86,1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,0xc3,0x13, -0x72,0x69,0x63,0x73,0x86,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3, -0xc3,0x11,0x6a,0x6b,0xa2,0x44,0x1f,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0x61,0x6e, -0x64,0x6d,0x6f,0x6e,0x74,0x68,0x73,0xa3,0x44,0x61,0x4a,0x67,0x76,0x6c,1,0x62, -0x30,0x79,0x13,0x6d,0x61,0x69,0x63,0xa5,0x25,0x13,0x61,0x73,0x61,0x6e,0xa3,0xe2, -0x13,0x72,0x6c,0x79,0x64,0x1f,0x79,0x6e,0x61,0x73,0x74,0x69,0x63,0x63,0x75,0x6e, -0x65,0x69,0x66,0x6f,0x72,0x6d,0xa5,1,0x1f,0x79,0x70,0x74,0x69,0x61,0x6e,0x68, -0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,1,0x66,0x26,0x73,0xa3,0xc2,0x1c, -0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa5,0x24,7, -0x6e,0xc0,0xf2,0x6e,0x3e,0x72,0xa2,0x5d,0x73,0xa2,0xe5,0x76,0x14,0x65,0x73,0x74, -0x61,0x6e,0xa3,0xbc,1,0x61,0x92,0x63,0x13,0x69,0x65,0x6e,0x74,1,0x67,0x34, -0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xa5,0x13,0x72,0x65,0x65,0x6b,1, -0x6d,0x34,0x6e,0x15,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x7f,0x13,0x75,0x73,0x69, -0x63,0xa2,0x7e,0x19,0x61,0x6c,0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x7e, -0x10,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79, -0x70,0x68,0x73,0xa3,0xfe,2,0x61,0x32,0x6d,0xa2,0x7e,0x72,0x12,0x6f,0x77,0x73, -0x7d,0x12,0x62,0x69,0x63,0x38,3,0x65,0x4a,0x6d,0x80,0x70,0xa2,0x50,0x73,0x11, -0x75,0x70,0xa2,0x80,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x80,0x11,0x78, -0x74,3,0x61,0xa3,0xd2,0x62,0xa5,0x35,0x63,0xa5,0x41,0x65,0x13,0x6e,0x64,0x65, -0x64,2,0x61,0xa3,0xd2,0x62,0xa5,0x35,0x63,0xa5,0x41,0x12,0x61,0x74,0x68,0xa2, -0xd3,0x18,0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x61,0x1f,0x6c,0x70,0x68,0x61, -0x62,0x65,0x74,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd3,1,0x66, -0x42,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72, -0x6d,0x73,1,0x61,0xa3,0x51,0x62,0xa3,0x55,0x14,0x65,0x6e,0x69,0x61,0x6e,0x35, -0x12,0x63,0x69,0x69,0x23,0x64,0x9e,0x65,0xa2,0x42,0x68,0xa2,0x4d,0x6c,1,0x63, -0x62,0x70,0x17,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x70,1,0x66,0xa3,0x50,0x72, -0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73, -0xa3,0x50,0x16,0x68,0x65,0x6d,0x69,0x63,0x61,0x6c,0xa2,0xd0,0x16,0x73,0x79,0x6d, -0x62,0x6f,0x6c,0x73,0xa3,0xd0,0x12,0x6c,0x61,0x6d,0xa5,7,0x1a,0x67,0x65,0x61, -0x6e,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x77,0x11,0x6f,0x6d,0xa3,0xfd,7, -0x6f,0x71,0x6f,0x64,0x72,0xa2,0x41,0x75,0xa2,0x58,0x79,0x1b,0x7a,0x61,0x6e,0x74, -0x69,0x6e,0x65,0x6d,0x75,0x73,0x69,0x63,0xa2,0x5b,0x18,0x61,0x6c,0x73,0x79,0x6d, -0x62,0x6f,0x6c,0x73,0xa3,0x5b,1,0x70,0x34,0x78,0x16,0x64,0x72,0x61,0x77,0x69, -0x6e,0x67,0x89,0x14,0x6f,0x6d,0x6f,0x66,0x6f,0xa0,0x12,0x65,0x78,0x74,0xa2,0x43, -0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0x43,0x10,0x61,1,0x68,0x40,0x69,0x12,0x6c, -0x6c,0x65,0x92,0x17,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x73,0x93,0x11,0x6d,0x69, -0xa3,0xc9,1,0x67,0x2c,0x68,0x11,0x69,0x64,0xa3,0x64,0x14,0x69,0x6e,0x65,0x73, -0x65,0xa3,0x81,0x61,0x48,0x65,0xa2,0x4e,0x68,0xa2,0x52,0x6c,0x1a,0x6f,0x63,0x6b, -0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x8b,3,0x6c,0x34,0x6d,0x40,0x73,0x66, -0x74,0x11,0x61,0x6b,0xa3,0xc7,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x93,0x11,0x75, -0x6d,0xa2,0xb1,0x12,0x73,0x75,0x70,0xa2,0xca,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, -0x74,0xa3,0xca,1,0x69,0x30,0x73,0x13,0x61,0x76,0x61,0x68,0xa3,0xdd,0x15,0x63, -0x6c,0x61,0x74,0x69,0x6e,0x23,0x14,0x6e,0x67,0x61,0x6c,0x69,0x41,0x16,0x61,0x69, -0x6b,0x73,0x75,0x6b,0x69,0xa5,8,5,0x6f,0xc1,0x60,0x6f,0xa2,0x69,0x75,0xa4, -0x24,0x79,1,0x70,0xa2,0x44,0x72,0x14,0x69,0x6c,0x6c,0x69,0x63,0x32,1,0x65, -0x4c,0x73,0x11,0x75,0x70,0xa2,0x61,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa2, -0x61,0x12,0x61,0x72,0x79,0xa3,0x61,0x11,0x78,0x74,4,0x61,0xa3,0x9e,0x62,0xa3, -0xa0,0x63,0xa5,9,0x64,0xa5,0x43,0x65,0x13,0x6e,0x64,0x65,0x64,3,0x61,0xa3, -0x9e,0x62,0xa3,0xa0,0x63,0xa5,9,0x64,0xa5,0x43,0x10,0x72,1,0x69,0x34,0x6f, -0x15,0x6d,0x69,0x6e,0x6f,0x61,0x6e,0xa5,0x36,0x1a,0x6f,0x74,0x73,0x79,0x6c,0x6c, -0x61,0x62,0x61,0x72,0x79,0xa3,0x7b,3,0x6d,0x5a,0x6e,0xa2,0x95,0x70,0xa2,0xa0, -0x75,0x17,0x6e,0x74,0x69,0x6e,0x67,0x72,0x6f,0x64,0xa2,0x9a,0x17,0x6e,0x75,0x6d, -0x65,0x72,0x61,0x6c,0x73,0xa3,0x9a,2,0x62,0x3a,0x6d,0xa2,0x5f,0x70,0x15,0x61, -0x74,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x14,0x69,0x6e,0x69,0x6e,0x67,2,0x64,0x46, -0x68,0x9e,0x6d,0x1d,0x61,0x72,0x6b,0x73,0x66,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f, -0x6c,0x73,0x77,0x1e,0x69,0x61,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x6d,0x61, -0x72,0x6b,0x73,0x2e,2,0x65,0x40,0x66,0xa6,0x52,0x73,0x18,0x75,0x70,0x70,0x6c, -0x65,0x6d,0x65,0x6e,0x74,0xa3,0x83,0x16,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3, -0xe0,0x17,0x61,0x6c,0x66,0x6d,0x61,0x72,0x6b,0x73,0xa3,0x52,0x11,0x6f,0x6e,0x1f, -0x69,0x6e,0x64,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73, -0xa3,0xb2,0x1b,0x74,0x72,0x6f,0x6c,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x73,0x83, -0x12,0x74,0x69,0x63,0xa2,0x84,0x1b,0x65,0x70,0x61,0x63,0x74,0x6e,0x75,0x6d,0x62, -0x65,0x72,0x73,0xa3,0xdf,1,0x6e,0x3e,0x72,0x1b,0x72,0x65,0x6e,0x63,0x79,0x73, -0x79,0x6d,0x62,0x6f,0x6c,0x73,0x75,0x15,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa2,0x98, -0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa2,0x99,0x1d,0x61,0x6e,0x64,0x70,0x75, -0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x99,0x61,0xa2,0xea,0x68,0xa4, -0x14,0x6a,0x10,0x6b,0xa2,0x47,4,0x63,0x92,0x65,0xa2,0x83,0x72,0xa2,0xa1,0x73, -0xa2,0xb3,0x75,0x1f,0x6e,0x69,0x66,0x69,0x65,0x64,0x69,0x64,0x65,0x6f,0x67,0x72, -0x61,0x70,0x68,0x73,0xa2,0x47,0x18,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e, -8,0x65,0x71,0x65,0xa5,0,0x66,0xa5,0x12,0x67,0xa5,0x2e,0x68,0xa5,0x42,0x69, -0xa5,0x48,0x14,0x6f,0x6d,0x70,0x61,0x74,0xa2,0x45,1,0x66,0x96,0x69,1,0x62, -0x44,0x64,0x17,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x12,0x73,0x75, -0x70,0xa3,0x5f,0x14,0x69,0x6c,0x69,0x74,0x79,0xa2,0x45,1,0x66,0x54,0x69,0x18, -0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,0x73,0x75,0x70,0x70, -0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,0x73,0xa3,0x53,0x11, -0x78,0x74,8,0x65,0xf,0x65,0xa5,0,0x66,0xa5,0x12,0x67,0xa5,0x2e,0x68,0xa5, -0x42,0x69,0xa5,0x48,0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1, -0x19,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0x73,0x75,0x70,0x94,0x16,0x70,0x6c,0x65, -0x6d,0x65,0x6e,0x74,0x95,1,0x74,0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c,0x73,0x9a, -0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x9b, -0x14,0x72,0x6f,0x6b,0x65,0x73,0xa3,0x82,2,0x6e,0x48,0x72,0x64,0x75,0x1d,0x63, -0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3,0xde,0x1d, -0x61,0x64,0x69,0x61,0x6e,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x63,0x12, -0x69,0x61,0x6e,0xa3,0xa8,2,0x61,0x3a,0x65,0x4c,0x6f,0x16,0x72,0x61,0x73,0x6d, -0x69,0x61,0x6e,0xa5,0x2d,1,0x6b,0x26,0x6d,0xa3,0xa4,0x11,0x6d,0x61,0xa3,0xd4, -1,0x72,0x38,0x73,0x17,0x73,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa5,0x19,0x13, -0x6f,0x6b,0x65,0x65,0x60,0x12,0x73,0x75,0x70,0xa2,0xff,0x16,0x70,0x6c,0x65,0x6d, -0x65,0x6e,0x74,0xa3,0xff,3,0x65,0x3e,0x69,0x8e,0x6f,0xa2,0x71,0x75,0x15,0x70, -0x6c,0x6f,0x79,0x61,0x6e,0xa3,0xe1,1,0x73,0x60,0x76,0x16,0x61,0x6e,0x61,0x67, -0x61,0x72,0x69,0x3e,0x12,0x65,0x78,0x74,0xa2,0xb3,1,0x61,0xa5,0x44,0x65,0x13, -0x6e,0x64,0x65,0x64,0xa2,0xb3,0x10,0x61,0xa5,0x44,0x13,0x65,0x72,0x65,0x74,0xa3, -0x5a,2,0x61,0x3a,0x6e,0x82,0x76,0x16,0x65,0x73,0x61,0x6b,0x75,0x72,0x75,0xa5, -0x2f,0x18,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x73,0x2e,2,0x65,0x30,0x66, -0x36,0x73,0x11,0x75,0x70,0xa3,0x83,0x11,0x78,0x74,0xa3,0xe0,0x18,0x6f,0x72,0x73, -0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,0x14,0x67,0x62,0x61,0x74,0x73,0x91,1,0x67, -0x3e,0x6d,0x12,0x69,0x6e,0x6f,0xa2,0xab,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xab, -0x11,0x72,0x61,0xa5,0x1a,8,0x6d,0x5f,0x6d,0x3a,0x6e,0x48,0x73,0x7a,0x76,0xa2, -0x4b,0x77,0x12,0x69,0x64,0x65,0x43,0x11,0x65,0x64,0x32,0x12,0x69,0x61,0x6c,0x33, -2,0x61,0x40,0x62,0x37,0x6f,1,0x62,0x28,0x6e,0x10,0x65,0x21,0x13,0x72,0x65, -0x61,0x6b,0x37,0x10,0x72,0x34,0x12,0x72,0x6f,0x77,0x35,2,0x6d,0x38,0x71,0x46, -0x75,1,0x62,0x3d,0x70,0x3e,0x11,0x65,0x72,0x3f,1,0x61,0x24,0x6c,0x39,0x11, -0x6c,0x6c,0x39,1,0x72,0x3b,0x75,0x12,0x61,0x72,0x65,0x3b,0x12,0x65,0x72,0x74, -0x40,0x13,0x69,0x63,0x61,0x6c,0x41,0x63,0x58,0x65,0x92,0x66,0x96,0x69,1,0x6e, -0x36,0x73,0x10,0x6f,0x30,0x14,0x6c,0x61,0x74,0x65,0x64,0x31,0x11,0x69,0x74,0x2e, -0x12,0x69,0x61,0x6c,0x2f,2,0x61,0x36,0x69,0x48,0x6f,0x10,0x6d,0x24,0x12,0x70, -0x61,0x74,0x25,0x10,0x6e,0x22,0x15,0x6f,0x6e,0x69,0x63,0x61,0x6c,0x23,0x13,0x72, -0x63,0x6c,0x65,0x27,0x11,0x6e,0x63,0x27,2,0x69,0x3a,0x6f,0x44,0x72,0x10,0x61, -0x2c,0x14,0x63,0x74,0x69,0x6f,0x6e,0x2d,0x10,0x6e,0x28,0x11,0x61,0x6c,0x29,0x11, -0x6e,0x74,0x2b,4,0x61,0x3a,0x66,0x4c,0x68,0x5e,0x6e,0x70,0x77,0x2a,0x12,0x69, -0x64,0x65,0x2b,0x22,0x17,0x6d,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x26,0x17, -0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x27,0x24,0x17,0x61,0x6c,0x66,0x77,0x69, -0x64,0x74,0x68,0x25,0x20,1,0x61,0x30,0x65,0x14,0x75,0x74,0x72,0x61,0x6c,0x21, -0x28,0x13,0x72,0x72,0x6f,0x77,0x29,0xd,0x6e,0xc0,0xfb,0x73,0x6d,0x73,0x3a,0x74, -0x98,0x75,0xa2,0x49,0x7a,2,0x6c,0x3b,0x70,0x3d,0x73,0x39,5,0x6f,0x28,0x6f, -0x57,0x70,0x34,0x75,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x45,0x11,0x61,0x63, -1,0x65,0x32,0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x31,0x18,0x73,0x65,0x70, -0x61,0x72,0x61,0x74,0x6f,0x72,0x39,0x63,0x53,0x6b,0x55,0x6d,0x51,0x1d,0x69,0x74, -0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x27,1,0x6e,0x40, -0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x23, -0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x21,0x6e,0x8a,0x6f,0xa2,0x47,0x70, -8,0x66,0x14,0x66,0x5b,0x69,0x59,0x6f,0x4f,0x72,0x24,0x73,0x49,0x17,0x69,0x76, -0x61,0x74,0x65,0x75,0x73,0x65,0x43,0x61,0x2c,0x63,0x4d,0x64,0x47,0x65,0x4b,0x1f, -0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72, -0x3d,2,0x64,0x33,0x6c,0x35,0x6f,0x36,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e, -0x67,0x6d,0x61,0x72,0x6b,0x2d,1,0x70,0x7c,0x74,0x12,0x68,0x65,0x72,3,0x6c, -0x38,0x6e,0x42,0x70,0x4c,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x57,0x14,0x65,0x74, -0x74,0x65,0x72,0x2b,0x14,0x75,0x6d,0x62,0x65,0x72,0x37,0x19,0x75,0x6e,0x63,0x74, -0x75,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0x49,0x66,0x9e,0x66,0x88,0x69,0xa2,0x4b,0x6c,0xa2,0x5c, -0x6d,4,0x61,0x60,0x63,0x31,0x65,0x2f,0x6e,0x2d,0x6f,0x15,0x64,0x69,0x66,0x69, -0x65,0x72,1,0x6c,0x30,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x55,0x14,0x65,0x74, -0x74,0x65,0x72,0x29,0x17,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x51,1,0x69, -0x2e,0x6f,0x13,0x72,0x6d,0x61,0x74,0x41,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63, -0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x5b,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c, -0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,6,0x6d,0x18,0x6d, -0x29,0x6f,0x28,0x74,0x27,0x75,0x23,0x2a,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65, -0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x65,0x28,0x69,0x3c,0x6c,0x25,0x19,0x74,0x74, -0x65,0x72,0x6e,0x75,0x6d,0x62,0x65,0x72,0x35,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61, -0x72,0x61,0x74,0x6f,0x72,0x3b,0x63,0x44,0x64,0xa2,0x60,0x65,0x1b,0x6e,0x63,0x6c, -0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x2f,6,0x6e,0x39,0x6e,0x46,0x6f, -0x4e,0x73,0x45,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f, -0x6c,0x53,0x20,0x12,0x74,0x72,0x6c,0x3f,0x42,0x10,0x6e,1,0x6e,0x2c,0x74,0x12, -0x72,0x6f,0x6c,0x3f,0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0x4d,0x63,0x3f,0x66,0x41,0x6c,0x1d,0x6f,0x73,0x65,0x70, -0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4b,2,0x61,0x30,0x65,0x4a, -0x69,0x12,0x67,0x69,0x74,0x33,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61, -0x74,0x69,0x6f,0x6e,0x47,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65, -0x72,0x33,0,0x13,0x6e,0xc1,0xf,0x74,0x76,0x74,0x4c,0x76,0x9a,0x77,0xa2,0x48, -0x79,0xa2,0x49,0x7a,1,0x61,0x2c,0x68,0x12,0x61,0x69,0x6e,0x8b,0x11,0x69,0x6e, -0x85,2,0x61,0x36,0x65,0x3c,0x68,0x14,0x69,0x6e,0x79,0x65,0x68,0xa3,0x66,1, -0x68,0x71,0x77,0x73,1,0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62, -0x75,0x74,0x61,0x74,0x13,0x67,0x6f,0x61,0x6c,0x3d,0x1a,0x65,0x72,0x74,0x69,0x63, -0x61,0x6c,0x74,0x61,0x69,0x6c,0xa3,0x67,0x11,0x61,0x77,0x79,1,0x65,0x32,0x75, -0x11,0x64,0x68,0x80,0x11,0x68,0x65,0x83,0x10,0x68,0x7a,1,0x62,0x34,0x77,0x16, -0x69,0x74,0x68,0x74,0x61,0x69,0x6c,0x7f,0x14,0x61,0x72,0x72,0x65,0x65,0x7d,0x6e, -0xa2,0x4c,0x70,0xa2,0x69,0x71,0xa2,0x69,0x72,0xa2,0x6f,0x73,5,0x74,0x22,0x74, -0x38,0x77,0x4c,0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18,0x72,0x61, -0x69,0x67,0x68,0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b,0x61,0x66, -0x6d,0x61,0x2e,0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11,0x68,0x65, -0x65,1,0x65,0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67,2,0x6f, -0x2c,0x75,0x50,0x79,0x10,0x61,0x91,1,0x6a,0x28,0x6f,0x10,0x6e,0x55,0x1a,0x6f, -0x69,0x6e,0x69,0x6e,0x67,0x67,0x72,0x6f,0x75,0x70,0x21,0x10,0x6e,0x57,0x10,0x65, -0x59,0x10,0x61,1,0x66,0x5b,0x70,0x10,0x68,0x5d,1,0x65,0x38,0x6f,0x18,0x68, -0x69,0x6e,0x67,0x79,0x61,0x79,0x65,0x68,0x93,1,0x68,0x5f,0x76,0x16,0x65,0x72, -0x73,0x65,0x64,0x70,0x65,0x61,0x67,0xc1,0xc7,0x67,0xa4,0x52,0x68,0xa4,0x59,0x6b, -0xa4,0x99,0x6c,0xa4,0xb2,0x6d,2,0x61,0x2e,0x65,0xa4,0x3e,0x69,0x10,0x6d,0x53, -1,0x6c,0xa2,0xe7,0x6e,0x16,0x69,0x63,0x68,0x61,0x65,0x61,0x6e,0,0x12,0x6e, -0x76,0x73,0x51,0x73,0x3e,0x74,0x5c,0x77,0xa0,0x79,0xa2,0x42,0x7a,0x13,0x61,0x79, -0x69,0x6e,0xa3,0x54,0x10,0x61,1,0x64,0x2e,0x6d,0x12,0x65,0x6b,0x68,0xa3,0x4c, -0x11,0x68,0x65,0xa3,0x4b,3,0x61,0x38,0x65,0x3c,0x68,0x4a,0x77,0x13,0x65,0x6e, -0x74,0x79,0xa3,0x51,0x10,0x77,0xa3,0x4d,1,0x6e,0xa3,0x4e,0x74,0x10,0x68,0xa3, -0x4f,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x50,0x11,0x61,0x77,0xa3,0x52,0x12,0x6f, -0x64,0x68,0xa3,0x53,0x6e,0x3a,0x6f,0x40,0x70,0x46,0x71,0x4a,0x72,0x12,0x65,0x73, -0x68,0xa3,0x4a,0x11,0x75,0x6e,0xa3,0x46,0x11,0x6e,0x65,0xa3,0x47,0x10,0x65,0xa3, -0x48,0x12,0x6f,0x70,0x68,0xa3,0x49,0x67,0x33,0x67,0x38,0x68,0x40,0x6b,0x5e,0x6c, -0x66,0x6d,0x11,0x65,0x6d,0xa3,0x45,0x13,0x69,0x6d,0x65,0x6c,0xa1,1,0x65,0x32, -0x75,0x14,0x6e,0x64,0x72,0x65,0x64,0xa3,0x42,0x11,0x74,0x68,0xa3,0x41,0x12,0x61, -0x70,0x68,0xa3,0x43,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x44,0x61,0x34,0x62,0x4a, -0x64,0x50,0x66,0x12,0x69,0x76,0x65,0x9f,1,0x6c,0x2a,0x79,0x11,0x69,0x6e,0x97, -0x12,0x65,0x70,0x68,0x95,0x12,0x65,0x74,0x68,0x99,1,0x61,0x30,0x68,0x14,0x61, -0x6d,0x65,0x64,0x68,0x9d,0x13,0x6c,0x65,0x74,0x68,0x9b,0x15,0x61,0x79,0x61,0x6c, -0x61,0x6d,6,0x6e,0x2c,0x6e,0x34,0x72,0x5e,0x73,0x62,0x74,0x11,0x74,0x61,0xa3, -0x63,2,0x67,0x2e,0x6e,0x32,0x79,0x10,0x61,0xa3,0x60,0x10,0x61,0xa3,0x5d,1, -0x61,0xa3,0x5e,0x6e,0x10,0x61,0xa3,0x5f,0x10,0x61,0xa3,0x61,0x11,0x73,0x61,0xa3, -0x62,0x62,0x3c,0x6a,0x42,0x6c,0x10,0x6c,1,0x61,0xa3,0x5b,0x6c,0x10,0x61,0xa3, -0x5c,0x11,0x68,0x61,0xa3,0x59,0x10,0x61,0xa3,0x5a,0x11,0x65,0x6d,0x51,0x10,0x61, -1,0x66,0x37,0x6d,0x11,0x61,0x6c,0x39,1,0x61,0x40,0x65,0x3e,1,0x68,0x28, -0x74,0x10,0x68,0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,0x43,2,0x68,0x3b,0x6d,0x5c, -0x6e,0x1a,0x69,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,1,0x6b,0x2a, -0x70,0x10,0x61,0xa3,0x65,0x15,0x69,0x6e,0x6e,0x61,0x79,0x61,0xa3,0x64,0x1a,0x7a, -0x61,0x6f,0x6e,0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,0x3d,2,0x61,0x3a,0x68,0x44, -0x6e,0x17,0x6f,0x74,0x74,0x65,0x64,0x68,0x65,0x68,0x4b,1,0x66,0x47,0x70,0x10, -0x68,0x49,0x12,0x61,0x70,0x68,0x89,0x11,0x61,0x6d,0x4c,0x12,0x61,0x64,0x68,0x4f, -0x61,0x6e,0x62,0xa2,0x54,0x64,0xa2,0x70,0x65,0x31,0x66,2,0x61,0x3e,0x65,0x4a, -0x69,0x19,0x6e,0x61,0x6c,0x73,0x65,0x6d,0x6b,0x61,0x74,0x68,0x35,0x15,0x72,0x73, -0x69,0x79,0x65,0x68,0x8f,0x86,0x10,0x68,0x33,2,0x66,0x3c,0x69,0x70,0x6c,1, -0x61,0x28,0x65,0x10,0x66,0x27,0x11,0x70,0x68,0x25,0x14,0x72,0x69,0x63,0x61,0x6e, -2,0x66,0x30,0x6e,0x36,0x71,0x11,0x61,0x66,0xa3,0x58,0x11,0x65,0x68,0xa3,0x56, -0x12,0x6f,0x6f,0x6e,0xa3,0x57,0x10,0x6e,0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f, -0x75,0x73,0x68,0x61,0x73,0x6b,0x69,0x79,0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65, -0x8d,1,0x68,0x29,0x74,0x10,0x68,0x2b,0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68, -0x72,0x69,0x73,0x68,0x2f,7,0x6e,0x2e,0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21, -0x18,0x6f,0x6e,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68, -0x74,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70, -0x61,0x72,0x65,0x6e,0x74,0x2b,0x63,0x23,0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65, -0x66,0x74,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a, -0x6f,0x69,0x6e,0x69,0x6e,0x67,0x25,0x19,0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69, -0x6e,0x67,0x23,0,0x14,0x6e,0xc0,0xe5,0x73,0x5e,0x77,0x23,0x77,0x40,0x78,0x58, -0x7a,0x10,0x77,0x58,1,0x6a,0x75,0x73,0x13,0x70,0x61,0x63,0x65,0x59,1,0x6a, -0x5d,0x6f,0x17,0x72,0x64,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,0x73, -0x4a,0x75,0x7a,0x76,1,0x66,0x7d,0x69,0x7e,0x13,0x72,0x61,0x6d,0x61,0x7e,0x14, -0x66,0x69,0x6e,0x61,0x6c,0x7d,4,0x61,0x51,0x67,0x53,0x70,0x28,0x75,0x30,0x79, -0x57,0x54,0x12,0x61,0x63,0x65,0x55,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x53, -0x15,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x21,0x6e,0x60,0x6f,0xa2,0x41,0x70,0xa2,0x50, -0x71,0xa2,0x6e,0x72,1,0x65,0x24,0x69,0x6f,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c, -0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x6f,4,0x65,0x3e,0x6c,0x5b,0x6f, -0x46,0x73,0x45,0x75,0x46,0x14,0x6d,0x65,0x72,0x69,0x63,0x47,0x15,0x78,0x74,0x6c, -0x69,0x6e,0x65,0x5b,0x17,0x6e,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x45,0x10,0x70, -0x48,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49, -1,0x6f,0x3e,0x72,0x4c,0x1a,0x65,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69, -0x63,0x4d,0x4a,0x1b,0x73,0x74,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63, -0x4b,0x10,0x75,0x4e,0x16,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x68,0x7b,0x68, -0x50,0x69,0x86,0x6a,0xa2,0x61,0x6c,0xa2,0x65,0x6d,0x1c,0x61,0x6e,0x64,0x61,0x74, -0x6f,0x72,0x79,0x62,0x72,0x65,0x61,0x6b,0x2d,4,0x32,0x5f,0x33,0x61,0x65,0x34, -0x6c,0x6d,0x79,0x3a,0x13,0x70,0x68,0x65,0x6e,0x3b,0x19,0x62,0x72,0x65,0x77,0x6c, -0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,0x28,0x6e,0x3c,0x73,0x41,0x3c,0x18,0x65, -0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x3d,0x3e,1,0x66,0x3e,0x73,0x11,0x65, -0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,0x62,0x6c,0x65,0x3f,0x18,0x69,0x78,0x6e, -0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,0x6c,0x63,0x74,0x65,0x76,0x67,1,0x66, -0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,0x64,0x43,0x61,0x42,0x62,0xa2,0x49,0x63, -0xa2,0x76,0x65,0xa2,0xfc,0x67,0x10,0x6c,0x38,0x11,0x75,0x65,0x39,5,0x6d,0xf, -0x6d,0x28,0x70,0x79,0x73,0x7b,0x16,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x69, -0x23,0x6b,0x38,0x6c,0x24,0x17,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x25,0x76, -0x13,0x73,0x61,0x72,0x61,0x76,1,0x70,0x2e,0x73,0x13,0x74,0x61,0x72,0x74,0x7b, -0x15,0x72,0x65,0x62,0x61,0x73,0x65,0x79,4,0x32,0x27,0x61,0x29,0x62,0x2b,0x6b, -0x2d,0x72,0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,0x3e,0x73,0x15,0x79,0x6d,0x62, -0x6f,0x6c,0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,1,0x65,0x2a,0x6f,0x11,0x74, -0x68,0x27,0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,0x51,0x6d,0x33,0x6f,0x28,0x70, -0x69,0x72,0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,0x74,0x1a,0x69,0x6e,0x67,0x65, -0x6e,0x74,0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,0x74,0x69,0x6f,0x6e,0x61,0x1f, -0x6c,0x6a,0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,0x74,0x61,0x72,0x74,0x65,0x72, -0x6b,1,0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,0x6f,0x6e,0x74,0x65,0x78,0x74, -0x51,0x18,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x33,0x61,0x6a,0x62,0x2f, -0x6a,0x6b,0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,0x61,0x38,0x75,0x18,0x6e,0x63, -0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,0x65,0x6e,0x74,0x68,0x65,0x73, -0x69,0x73,0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,0x72,0x65,0x74,0x75,0x72,0x6e, -0x35,2,0x62,0x3e,0x6d,0x46,0x78,0x36,0x18,0x63,0x6c,0x61,0x6d,0x61,0x74,0x69, -0x6f,0x6e,0x37,0x70,0x12,0x61,0x73,0x65,0x71,0x72,0x16,0x6f,0x64,0x69,0x66,0x69, -0x65,0x72,0x73,1,0x64,0x42,0x6e,1,0x6f,0x32,0x75,0x26,0x14,0x6d,0x65,0x72, -0x69,0x63,0x27,0x11,0x6e,0x65,0x21,1,0x65,0x2e,0x69,0x24,0x12,0x67,0x69,0x74, -0x25,0x22,0x14,0x63,0x69,0x6d,0x61,0x6c,0x23,0,0x18,0x6e,0xc4,0x6f,0x74,0xc1, -0x91,0x77,0x96,0x77,0xa2,0x4c,0x78,0xa2,0x70,0x79,0xa2,0x7a,0x7a,6,0x73,0x1e, -0x73,0x34,0x78,0x42,0x79,0x48,0x7a,0x11,0x7a,0x7a,0xa3,0x67,0x10,0x79,1,0x65, -0xa3,0xae,0x6d,0xa3,0x81,0x11,0x78,0x78,0xa3,0x66,0x11,0x79,0x79,0x21,0x61,0x30, -0x69,0x58,0x6d,0x11,0x74,0x68,0xa3,0x80,0x10,0x6e,1,0x61,0x26,0x62,0xa3,0xb1, -0x1a,0x62,0x61,0x7a,0x61,0x72,0x73,0x71,0x75,0x61,0x72,0x65,0xa3,0xb1,0x11,0x6e, -0x68,0x23,2,0x61,0x30,0x63,0x5a,0x6f,0x11,0x6c,0x65,0xa3,0x9b,1,0x6e,0x3c, -0x72,0x10,0x61,0xa2,0x92,0x15,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0x92,0x12,0x63, -0x68,0x6f,0xa3,0xbc,0x11,0x68,0x6f,0xa3,0xbc,1,0x70,0x2c,0x73,0x11,0x75,0x78, -0xa3,0x65,0x11,0x65,0x6f,0x9b,1,0x65,0x2c,0x69,0x72,0x11,0x69,0x69,0x73,0x11, -0x7a,0x69,0xa2,0xc0,0x11,0x64,0x69,0xa3,0xc0,0x74,0x66,0x75,0xa2,0xde,0x76,1, -0x61,0x48,0x69,1,0x73,0x38,0x74,0x10,0x68,0xa2,0xc5,0x13,0x6b,0x75,0x71,0x69, -0xa3,0xc5,0x10,0x70,0xa3,0x64,0x10,0x69,0xa2,0x63,0x10,0x69,0xa3,0x63,7,0x68, -0x3e,0x68,0x34,0x69,0x48,0x6e,0x86,0x6f,0x11,0x74,0x6f,0xa3,0xc4,0x10,0x61,1, -0x61,0x24,0x69,0x6d,0x6a,0x11,0x6e,0x61,0x6b,2,0x62,0x3a,0x66,0x4a,0x72,0x10, -0x68,0xa2,0x9e,0x12,0x75,0x74,0x61,0xa3,0x9e,1,0x65,0x24,0x74,0x6f,0x12,0x74, -0x61,0x6e,0x6f,0x14,0x69,0x6e,0x61,0x67,0x68,0x99,0x11,0x73,0x61,0xa3,0xc3,0x61, -0x36,0x65,0xa2,0x65,0x66,0xa2,0x71,0x67,0x11,0x6c,0x67,0x75,6,0x6c,0x28,0x6c, -0x32,0x6d,0x38,0x6e,0x44,0x76,0x10,0x74,0xa3,0x7f,1,0x65,0x89,0x75,0x97,1, -0x69,0x24,0x6c,0x67,0x10,0x6c,0x67,0x10,0x67,0xa2,0x9a,1,0x73,0x2a,0x75,0x10, -0x74,0xa3,0x9a,0x10,0x61,0xa3,0xc3,0x67,0x36,0x69,0x52,0x6b,0x10,0x72,0xa2,0x99, -0x10,0x69,0xa3,0x99,1,0x61,0x30,0x62,0x7a,0x13,0x61,0x6e,0x77,0x61,0x7b,0x12, -0x6c,0x6f,0x67,0x75,2,0x6c,0x32,0x74,0x34,0x76,0x12,0x69,0x65,0x74,0xa3,0x7f, -0x10,0x65,0x89,0x12,0x68,0x61,0x6d,0xa3,0x6a,1,0x6c,0x2a,0x6e,0x10,0x67,0xa3, -0x62,0x10,0x75,0x68,0x11,0x67,0x75,0x69,0x11,0x6e,0x67,0x99,1,0x67,0x32,0x6e, -0x14,0x6b,0x6e,0x6f,0x77,0x6e,0xa3,0x67,0x11,0x61,0x72,0x8a,0x13,0x69,0x74,0x69, -0x63,0x8b,0x71,0xc1,0x13,0x71,0xa2,0xde,0x72,0xa2,0xe3,0x73,6,0x69,0x8a,0x69, -0x72,0x6f,0xa2,0x4c,0x75,0xa2,0x75,0x79,1,0x6c,0x46,0x72,4,0x63,0x65,0x65, -0xa3,0x5f,0x69,0x2c,0x6a,0xa3,0x60,0x6e,0xa3,0x61,0x11,0x61,0x63,0x65,0x10,0x6f, -0x94,0x16,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0x95,2,0x64,0x3c,0x67,0x4c,0x6e, -1,0x64,0xa3,0x91,0x68,0x62,0x12,0x61,0x6c,0x61,0x63,0x10,0x64,0xa2,0xa6,0x12, -0x68,0x61,0x6d,0xa3,0xa6,0x17,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa3,0x70, +0x65,0x6e,0x74,0xa5,0xa,0x12,0x72,0x61,0x79,0xa5,0x4a,1,0x6e,0xa2,0x46,0x6f, +1,0x6d,0x6e,0x72,0x13,0x67,0x69,0x61,0x6e,0x5a,1,0x65,0x40,0x73,0x11,0x75, +0x70,0xa2,0x87,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x87,0x11,0x78,0x74, +0xa4,0x1b,0x14,0x65,0x6e,0x64,0x65,0x64,0xa5,0x1b,0x1a,0x65,0x74,0x72,0x69,0x63, +0x73,0x68,0x61,0x70,0x65,0x73,0x8c,0x12,0x65,0x78,0x74,0xa2,0xe3,0x14,0x65,0x6e, +0x64,0x65,0x64,0xa3,0xe3,0x1e,0x65,0x72,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75, +0x61,0x74,0x69,0x6f,0x6e,0x71,2,0x61,0xa2,0x48,0x65,0xa2,0xdf,0x69,1,0x67, +0x30,0x72,0x14,0x61,0x67,0x61,0x6e,0x61,0x9d,0x10,0x68,1,0x70,0x3a,0x73,0x18, +0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4b,1,0x72,0x3c,0x75,0x19, +0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,0x11,0x69,0x76,0x1f, +0x61,0x74,0x65,0x75,0x73,0x65,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73, +0xa3,0x4c,2,0x6c,0x32,0x6e,0x9a,0x74,0x12,0x72,0x61,0x6e,0xa5,2,0x10,0x66, +2,0x61,0x58,0x6d,0x70,0x77,0x14,0x69,0x64,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66, +0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x1a, +0x6e,0x64,0x66,0x75,0x6c,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x13,0x61,0x72, +0x6b,0x73,0xa3,0x52,2,0x67,0x34,0x69,0xa2,0x45,0x75,0x12,0x6e,0x6f,0x6f,0xa3, +0x63,0x11,0x75,0x6c,0xa2,0x4a,2,0x63,0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c,0x6c, +0x61,0x62,0x6c,0x65,0x73,0xa3,0x4a,0x1f,0x6f,0x6d,0x70,0x61,0x74,0x69,0x62,0x69, +0x6c,0x69,0x74,0x79,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c,0x17, +0x65,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,0x19, +0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa5,0x1d,0x13,0x62,0x72,0x65, +0x77,0x37,0x61,0xa4,0x1d,0x62,0xa6,0x6a,0x63,0xa8,0x4b,0x64,0xae,9,0x65,5, +0x6d,0xa9,0x6d,0x94,0x6e,0xa2,0x41,0x74,0x15,0x68,0x69,0x6f,0x70,0x69,0x63,0x5e, +1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0x86,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, +0x74,0xa3,0x86,0x11,0x78,0x74,0xa2,0x85,2,0x61,0xa3,0xc8,0x62,0xa5,0x37,0x65, +0x13,0x6e,0x64,0x65,0x64,0xa2,0x85,1,0x61,0xa3,0xc8,0x62,0xa5,0x37,0x16,0x6f, +0x74,0x69,0x63,0x6f,0x6e,0x73,0xa3,0xce,0x15,0x63,0x6c,0x6f,0x73,0x65,0x64,2, +0x61,0x5a,0x63,0x9e,0x69,0x1c,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63, +0x73,0x75,0x70,0xa2,0xc4,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc4,0x16, +0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,0x86,1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3, +0xc3,0x13,0x72,0x69,0x63,0x73,0x86,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e, +0x74,0xa3,0xc3,0x11,0x6a,0x6b,0xa2,0x44,0x1f,0x6c,0x65,0x74,0x74,0x65,0x72,0x73, +0x61,0x6e,0x64,0x6d,0x6f,0x6e,0x74,0x68,0x73,0xa3,0x44,0x61,0x4a,0x67,0x76,0x6c, +1,0x62,0x30,0x79,0x13,0x6d,0x61,0x69,0x63,0xa5,0x25,0x13,0x61,0x73,0x61,0x6e, +0xa3,0xe2,0x13,0x72,0x6c,0x79,0x64,0x1f,0x79,0x6e,0x61,0x73,0x74,0x69,0x63,0x63, +0x75,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa5,1,0x1f,0x79,0x70,0x74,0x69,0x61, +0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,1,0x66,0x48,0x73,0xa2, +0xc2,0x12,0x65,0x78,0x74,1,0x61,0xa5,0x49,0x65,0x14,0x6e,0x64,0x65,0x64,0x61, +0xa5,0x49,0x1c,0x6f,0x72,0x6d,0x61,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73, +0xa5,0x24,7,0x6e,0xc0,0xf2,0x6e,0x3e,0x72,0xa2,0x5d,0x73,0xa2,0xe5,0x76,0x14, +0x65,0x73,0x74,0x61,0x6e,0xa3,0xbc,1,0x61,0x92,0x63,0x13,0x69,0x65,0x6e,0x74, +1,0x67,0x34,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xa5,0x13,0x72,0x65, +0x65,0x6b,1,0x6d,0x34,0x6e,0x15,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x7f,0x13, +0x75,0x73,0x69,0x63,0xa2,0x7e,0x19,0x61,0x6c,0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f, +0x6e,0xa3,0x7e,0x10,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f, +0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xfe,2,0x61,0x32,0x6d,0xa2,0x7e,0x72,0x12, +0x6f,0x77,0x73,0x7d,0x12,0x62,0x69,0x63,0x38,3,0x65,0x4a,0x6d,0x80,0x70,0xa2, +0x50,0x73,0x11,0x75,0x70,0xa2,0x80,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3, +0x80,0x11,0x78,0x74,3,0x61,0xa3,0xd2,0x62,0xa5,0x35,0x63,0xa5,0x41,0x65,0x13, +0x6e,0x64,0x65,0x64,2,0x61,0xa3,0xd2,0x62,0xa5,0x35,0x63,0xa5,0x41,0x12,0x61, +0x74,0x68,0xa2,0xd3,0x18,0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x61,0x1f,0x6c, +0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, +0xd3,1,0x66,0x42,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e, +0x66,0x6f,0x72,0x6d,0x73,1,0x61,0xa3,0x51,0x62,0xa3,0x55,0x14,0x65,0x6e,0x69, +0x61,0x6e,0x35,0x12,0x63,0x69,0x69,0x23,0x64,0x9e,0x65,0xa2,0x42,0x68,0xa2,0x4d, +0x6c,1,0x63,0x62,0x70,0x17,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x70,1,0x66, +0xa3,0x50,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f, +0x72,0x6d,0x73,0xa3,0x50,0x16,0x68,0x65,0x6d,0x69,0x63,0x61,0x6c,0xa2,0xd0,0x16, +0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd0,0x12,0x6c,0x61,0x6d,0xa5,7,0x1a, +0x67,0x65,0x61,0x6e,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x77,0x11,0x6f,0x6d, +0xa3,0xfd,7,0x6f,0x71,0x6f,0x64,0x72,0xa2,0x41,0x75,0xa2,0x58,0x79,0x1b,0x7a, +0x61,0x6e,0x74,0x69,0x6e,0x65,0x6d,0x75,0x73,0x69,0x63,0xa2,0x5b,0x18,0x61,0x6c, +0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5b,1,0x70,0x34,0x78,0x16,0x64,0x72, +0x61,0x77,0x69,0x6e,0x67,0x89,0x14,0x6f,0x6d,0x6f,0x66,0x6f,0xa0,0x12,0x65,0x78, +0x74,0xa2,0x43,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0x43,0x10,0x61,1,0x68,0x40, +0x69,0x12,0x6c,0x6c,0x65,0x92,0x17,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x73,0x93, +0x11,0x6d,0x69,0xa3,0xc9,1,0x67,0x2c,0x68,0x11,0x69,0x64,0xa3,0x64,0x14,0x69, +0x6e,0x65,0x73,0x65,0xa3,0x81,0x61,0x48,0x65,0xa2,0x4e,0x68,0xa2,0x5e,0x6c,0x1a, +0x6f,0x63,0x6b,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x8b,3,0x6c,0x34,0x6d, +0x40,0x73,0x66,0x74,0x11,0x61,0x6b,0xa3,0xc7,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3, +0x93,0x11,0x75,0x6d,0xa2,0xb1,0x12,0x73,0x75,0x70,0xa2,0xca,0x16,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa3,0xca,1,0x69,0x30,0x73,0x13,0x61,0x76,0x61,0x68,0xa3, +0xdd,0x15,0x63,0x6c,0x61,0x74,0x69,0x6e,0x23,1,0x6e,0x34,0x72,0x15,0x69,0x61, +0x65,0x72,0x66,0x65,0xa5,0x53,0x13,0x67,0x61,0x6c,0x69,0x41,0x16,0x61,0x69,0x6b, +0x73,0x75,0x6b,0x69,0xa5,8,5,0x6f,0xc1,0x60,0x6f,0xa2,0x69,0x75,0xa4,0x24, +0x79,1,0x70,0xa2,0x44,0x72,0x14,0x69,0x6c,0x6c,0x69,0x63,0x32,1,0x65,0x4c, +0x73,0x11,0x75,0x70,0xa2,0x61,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa2,0x61, +0x12,0x61,0x72,0x79,0xa3,0x61,0x11,0x78,0x74,4,0x61,0xa3,0x9e,0x62,0xa3,0xa0, +0x63,0xa5,9,0x64,0xa5,0x43,0x65,0x13,0x6e,0x64,0x65,0x64,3,0x61,0xa3,0x9e, +0x62,0xa3,0xa0,0x63,0xa5,9,0x64,0xa5,0x43,0x10,0x72,1,0x69,0x34,0x6f,0x15, +0x6d,0x69,0x6e,0x6f,0x61,0x6e,0xa5,0x36,0x1a,0x6f,0x74,0x73,0x79,0x6c,0x6c,0x61, +0x62,0x61,0x72,0x79,0xa3,0x7b,3,0x6d,0x5a,0x6e,0xa2,0x95,0x70,0xa2,0xa0,0x75, +0x17,0x6e,0x74,0x69,0x6e,0x67,0x72,0x6f,0x64,0xa2,0x9a,0x17,0x6e,0x75,0x6d,0x65, +0x72,0x61,0x6c,0x73,0xa3,0x9a,2,0x62,0x3a,0x6d,0xa2,0x5f,0x70,0x15,0x61,0x74, +0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x14,0x69,0x6e,0x69,0x6e,0x67,2,0x64,0x46,0x68, +0x9e,0x6d,0x1d,0x61,0x72,0x6b,0x73,0x66,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c, +0x73,0x77,0x1e,0x69,0x61,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x6d,0x61,0x72, +0x6b,0x73,0x2e,2,0x65,0x40,0x66,0xa6,0x55,0x73,0x18,0x75,0x70,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa3,0x83,0x16,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe0, +0x17,0x61,0x6c,0x66,0x6d,0x61,0x72,0x6b,0x73,0xa3,0x52,0x11,0x6f,0x6e,0x1f,0x69, +0x6e,0x64,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3, +0xb2,0x1b,0x74,0x72,0x6f,0x6c,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x73,0x83,0x12, +0x74,0x69,0x63,0xa2,0x84,0x1b,0x65,0x70,0x61,0x63,0x74,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x73,0xa3,0xdf,1,0x6e,0x3e,0x72,0x1b,0x72,0x65,0x6e,0x63,0x79,0x73,0x79, +0x6d,0x62,0x6f,0x6c,0x73,0x75,0x15,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa2,0x98,0x16, +0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa2,0x99,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e, +0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x99,0x61,0xa2,0xed,0x68,0xa4,0x17, +0x6a,0x10,0x6b,0xa2,0x47,4,0x63,0x92,0x65,0xa2,0x83,0x72,0xa2,0xa4,0x73,0xa2, +0xb6,0x75,0x1f,0x6e,0x69,0x66,0x69,0x65,0x64,0x69,0x64,0x65,0x6f,0x67,0x72,0x61, +0x70,0x68,0x73,0xa2,0x47,0x18,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,9, +0x66,0x71,0x66,0xa5,0x12,0x67,0xa5,0x2e,0x68,0xa5,0x42,0x69,0xa5,0x48,0x6a,0xa5, +0x54,0x14,0x6f,0x6d,0x70,0x61,0x74,0xa2,0x45,1,0x66,0x96,0x69,1,0x62,0x44, +0x64,0x17,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x12,0x73,0x75,0x70, +0xa3,0x5f,0x14,0x69,0x6c,0x69,0x74,0x79,0xa2,0x45,1,0x66,0x54,0x69,0x18,0x64, +0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,0x73,0x75,0x70,0x70,0x6c, +0x65,0x6d,0x65,0x6e,0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,0x73,0xa3,0x53,0x11,0x78, +0x74,9,0x66,0xf,0x66,0xa5,0x12,0x67,0xa5,0x2e,0x68,0xa5,0x42,0x69,0xa5,0x48, +0x6a,0xa5,0x54,0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1,0x65, +0xa5,0,0x19,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0x73,0x75,0x70,0x94,0x16,0x70, +0x6c,0x65,0x6d,0x65,0x6e,0x74,0x95,1,0x74,0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c, +0x73,0x9a,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0x9b,0x14,0x72,0x6f,0x6b,0x65,0x73,0xa3,0x82,2,0x6e,0x48,0x72,0x64,0x75, +0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3, +0xde,0x1d,0x61,0x64,0x69,0x61,0x6e,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73, +0x63,0x12,0x69,0x61,0x6e,0xa3,0xa8,2,0x61,0x3a,0x65,0x4c,0x6f,0x16,0x72,0x61, +0x73,0x6d,0x69,0x61,0x6e,0xa5,0x2d,1,0x6b,0x26,0x6d,0xa3,0xa4,0x11,0x6d,0x61, +0xa3,0xd4,1,0x72,0x38,0x73,0x17,0x73,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa5, +0x19,0x13,0x6f,0x6b,0x65,0x65,0x60,0x12,0x73,0x75,0x70,0xa2,0xff,0x16,0x70,0x6c, +0x65,0x6d,0x65,0x6e,0x74,0xa3,0xff,3,0x65,0x3e,0x69,0x8e,0x6f,0xa2,0x71,0x75, +0x15,0x70,0x6c,0x6f,0x79,0x61,0x6e,0xa3,0xe1,1,0x73,0x60,0x76,0x16,0x61,0x6e, +0x61,0x67,0x61,0x72,0x69,0x3e,0x12,0x65,0x78,0x74,0xa2,0xb3,1,0x61,0xa5,0x44, +0x65,0x13,0x6e,0x64,0x65,0x64,0xa2,0xb3,0x10,0x61,0xa5,0x44,0x13,0x65,0x72,0x65, +0x74,0xa3,0x5a,2,0x61,0x3a,0x6e,0x82,0x76,0x16,0x65,0x73,0x61,0x6b,0x75,0x72, +0x75,0xa5,0x2f,0x18,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x73,0x2e,2,0x65, +0x30,0x66,0x36,0x73,0x11,0x75,0x70,0xa3,0x83,0x11,0x78,0x74,0xa3,0xe0,0x18,0x6f, +0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,0x14,0x67,0x62,0x61,0x74,0x73,0x91, +1,0x67,0x3e,0x6d,0x12,0x69,0x6e,0x6f,0xa2,0xab,0x14,0x74,0x69,0x6c,0x65,0x73, +0xa3,0xab,0x11,0x72,0x61,0xa5,0x1a,8,0x6d,0x5f,0x6d,0x3a,0x6e,0x48,0x73,0x7a, +0x76,0xa2,0x4b,0x77,0x12,0x69,0x64,0x65,0x43,0x11,0x65,0x64,0x32,0x12,0x69,0x61, +0x6c,0x33,2,0x61,0x40,0x62,0x37,0x6f,1,0x62,0x28,0x6e,0x10,0x65,0x21,0x13, +0x72,0x65,0x61,0x6b,0x37,0x10,0x72,0x34,0x12,0x72,0x6f,0x77,0x35,2,0x6d,0x38, +0x71,0x46,0x75,1,0x62,0x3d,0x70,0x3e,0x11,0x65,0x72,0x3f,1,0x61,0x24,0x6c, +0x39,0x11,0x6c,0x6c,0x39,1,0x72,0x3b,0x75,0x12,0x61,0x72,0x65,0x3b,0x12,0x65, +0x72,0x74,0x40,0x13,0x69,0x63,0x61,0x6c,0x41,0x63,0x58,0x65,0x92,0x66,0x96,0x69, +1,0x6e,0x36,0x73,0x10,0x6f,0x30,0x14,0x6c,0x61,0x74,0x65,0x64,0x31,0x11,0x69, +0x74,0x2e,0x12,0x69,0x61,0x6c,0x2f,2,0x61,0x36,0x69,0x48,0x6f,0x10,0x6d,0x24, +0x12,0x70,0x61,0x74,0x25,0x10,0x6e,0x22,0x15,0x6f,0x6e,0x69,0x63,0x61,0x6c,0x23, +0x13,0x72,0x63,0x6c,0x65,0x27,0x11,0x6e,0x63,0x27,2,0x69,0x3a,0x6f,0x44,0x72, +0x10,0x61,0x2c,0x14,0x63,0x74,0x69,0x6f,0x6e,0x2d,0x10,0x6e,0x28,0x11,0x61,0x6c, +0x29,0x11,0x6e,0x74,0x2b,4,0x61,0x3a,0x66,0x4c,0x68,0x5e,0x6e,0x70,0x77,0x2a, +0x12,0x69,0x64,0x65,0x2b,0x22,0x17,0x6d,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23, +0x26,0x17,0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x27,0x24,0x17,0x61,0x6c,0x66, +0x77,0x69,0x64,0x74,0x68,0x25,0x20,1,0x61,0x30,0x65,0x14,0x75,0x74,0x72,0x61, +0x6c,0x21,0x28,0x13,0x72,0x72,0x6f,0x77,0x29,0xd,0x6e,0xc0,0xfb,0x73,0x6d,0x73, +0x3a,0x74,0x98,0x75,0xa2,0x49,0x7a,2,0x6c,0x3b,0x70,0x3d,0x73,0x39,5,0x6f, +0x28,0x6f,0x57,0x70,0x34,0x75,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x45,0x11, +0x61,0x63,1,0x65,0x32,0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x31,0x18,0x73, +0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x39,0x63,0x53,0x6b,0x55,0x6d,0x51,0x1d, +0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x27,1, +0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65, +0x72,0x23,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x21,0x6e,0x8a,0x6f,0xa2, +0x47,0x70,8,0x66,0x14,0x66,0x5b,0x69,0x59,0x6f,0x4f,0x72,0x24,0x73,0x49,0x17, +0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x43,0x61,0x2c,0x63,0x4d,0x64,0x47,0x65, +0x4b,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74, +0x6f,0x72,0x3d,2,0x64,0x33,0x6c,0x35,0x6f,0x36,0x1b,0x6e,0x73,0x70,0x61,0x63, +0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x2d,1,0x70,0x7c,0x74,0x12,0x68,0x65,0x72, +3,0x6c,0x38,0x6e,0x42,0x70,0x4c,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x57,0x14, +0x65,0x74,0x74,0x65,0x72,0x2b,0x14,0x75,0x6d,0x62,0x65,0x72,0x37,0x19,0x75,0x6e, +0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63, +0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,0x66,0x9e,0x66,0x88,0x69,0xa2,0x4b,0x6c, +0xa2,0x5c,0x6d,4,0x61,0x60,0x63,0x31,0x65,0x2f,0x6e,0x2d,0x6f,0x15,0x64,0x69, +0x66,0x69,0x65,0x72,1,0x6c,0x30,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x55,0x14, +0x65,0x74,0x74,0x65,0x72,0x29,0x17,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x51, +1,0x69,0x2e,0x6f,0x13,0x72,0x6d,0x61,0x74,0x41,0x1d,0x6e,0x61,0x6c,0x70,0x75, +0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x5b,0x10,0x6e,0x1f,0x69,0x74,0x69, +0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,6,0x6d, +0x18,0x6d,0x29,0x6f,0x28,0x74,0x27,0x75,0x23,0x2a,0x1c,0x77,0x65,0x72,0x63,0x61, +0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x65,0x28,0x69,0x3c,0x6c,0x25,0x19, +0x74,0x74,0x65,0x72,0x6e,0x75,0x6d,0x62,0x65,0x72,0x35,0x1a,0x6e,0x65,0x73,0x65, +0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3b,0x63,0x44,0x64,0xa2,0x60,0x65,0x1b,0x6e, +0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x2f,6,0x6e,0x39,0x6e, +0x46,0x6f,0x4e,0x73,0x45,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d, +0x62,0x6f,0x6c,0x53,0x20,0x12,0x74,0x72,0x6c,0x3f,0x42,0x10,0x6e,1,0x6e,0x2c, +0x74,0x12,0x72,0x6f,0x6c,0x3f,0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63, +0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4d,0x63,0x3f,0x66,0x41,0x6c,0x1d,0x6f,0x73, +0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4b,2,0x61,0x30, +0x65,0x4a,0x69,0x12,0x67,0x69,0x74,0x33,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74, +0x75,0x61,0x74,0x69,0x6f,0x6e,0x47,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d, +0x62,0x65,0x72,0x33,0,0x13,0x6e,0xc1,0x1a,0x74,0x81,0x74,0x4e,0x76,0xa2,0x47, +0x77,0xa2,0x52,0x79,0xa2,0x53,0x7a,1,0x61,0x2c,0x68,0x12,0x61,0x69,0x6e,0x8b, +0x11,0x69,0x6e,0x85,2,0x61,0x4a,0x65,0x50,0x68,0x11,0x69,0x6e,1,0x6e,0x2c, +0x79,0x11,0x65,0x68,0xa3,0x66,0x12,0x6f,0x6f,0x6e,0xa3,0x69,1,0x68,0x71,0x77, +0x73,1,0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62,0x75,0x74,0x61, +0x74,0x13,0x67,0x6f,0x61,0x6c,0x3d,0x1a,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x74, +0x61,0x69,0x6c,0xa3,0x67,0x11,0x61,0x77,0x79,1,0x65,0x32,0x75,0x11,0x64,0x68, +0x80,0x11,0x68,0x65,0x83,0x10,0x68,0x7a,1,0x62,0x34,0x77,0x16,0x69,0x74,0x68, +0x74,0x61,0x69,0x6c,0x7f,0x14,0x61,0x72,0x72,0x65,0x65,0x7d,0x6e,0xa2,0x4c,0x70, +0xa2,0x69,0x71,0xa2,0x69,0x72,0xa2,0x6f,0x73,5,0x74,0x22,0x74,0x38,0x77,0x4c, +0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18,0x72,0x61,0x69,0x67,0x68, +0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b,0x61,0x66,0x6d,0x61,0x2e, +0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11,0x68,0x65,0x65,1,0x65, +0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67,2,0x6f,0x2c,0x75,0x50, +0x79,0x10,0x61,0x91,1,0x6a,0x28,0x6f,0x10,0x6e,0x55,0x1a,0x6f,0x69,0x6e,0x69, +0x6e,0x67,0x67,0x72,0x6f,0x75,0x70,0x21,0x10,0x6e,0x57,0x10,0x65,0x59,0x10,0x61, +1,0x66,0x5b,0x70,0x10,0x68,0x5d,1,0x65,0x38,0x6f,0x18,0x68,0x69,0x6e,0x67, +0x79,0x61,0x79,0x65,0x68,0x93,1,0x68,0x5f,0x76,0x16,0x65,0x72,0x73,0x65,0x64, +0x70,0x65,0x61,0x67,0xc1,0xd4,0x67,0xa4,0x52,0x68,0xa4,0x59,0x6b,0xa4,0x99,0x6c, +0xa4,0xbf,0x6d,2,0x61,0x2e,0x65,0xa4,0x3e,0x69,0x10,0x6d,0x53,1,0x6c,0xa2, +0xe7,0x6e,0x16,0x69,0x63,0x68,0x61,0x65,0x61,0x6e,0,0x12,0x6e,0x76,0x73,0x51, +0x73,0x3e,0x74,0x5c,0x77,0xa0,0x79,0xa2,0x42,0x7a,0x13,0x61,0x79,0x69,0x6e,0xa3, +0x54,0x10,0x61,1,0x64,0x2e,0x6d,0x12,0x65,0x6b,0x68,0xa3,0x4c,0x11,0x68,0x65, +0xa3,0x4b,3,0x61,0x38,0x65,0x3c,0x68,0x4a,0x77,0x13,0x65,0x6e,0x74,0x79,0xa3, +0x51,0x10,0x77,0xa3,0x4d,1,0x6e,0xa3,0x4e,0x74,0x10,0x68,0xa3,0x4f,0x14,0x61, +0x6d,0x65,0x64,0x68,0xa3,0x50,0x11,0x61,0x77,0xa3,0x52,0x12,0x6f,0x64,0x68,0xa3, +0x53,0x6e,0x3a,0x6f,0x40,0x70,0x46,0x71,0x4a,0x72,0x12,0x65,0x73,0x68,0xa3,0x4a, +0x11,0x75,0x6e,0xa3,0x46,0x11,0x6e,0x65,0xa3,0x47,0x10,0x65,0xa3,0x48,0x12,0x6f, +0x70,0x68,0xa3,0x49,0x67,0x33,0x67,0x38,0x68,0x40,0x6b,0x5e,0x6c,0x66,0x6d,0x11, +0x65,0x6d,0xa3,0x45,0x13,0x69,0x6d,0x65,0x6c,0xa1,1,0x65,0x32,0x75,0x14,0x6e, +0x64,0x72,0x65,0x64,0xa3,0x42,0x11,0x74,0x68,0xa3,0x41,0x12,0x61,0x70,0x68,0xa3, +0x43,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x44,0x61,0x34,0x62,0x4a,0x64,0x50,0x66, +0x12,0x69,0x76,0x65,0x9f,1,0x6c,0x2a,0x79,0x11,0x69,0x6e,0x97,0x12,0x65,0x70, +0x68,0x95,0x12,0x65,0x74,0x68,0x99,1,0x61,0x30,0x68,0x14,0x61,0x6d,0x65,0x64, +0x68,0x9d,0x13,0x6c,0x65,0x74,0x68,0x9b,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,6, +0x6e,0x2c,0x6e,0x34,0x72,0x5e,0x73,0x62,0x74,0x11,0x74,0x61,0xa3,0x63,2,0x67, +0x2e,0x6e,0x32,0x79,0x10,0x61,0xa3,0x60,0x10,0x61,0xa3,0x5d,1,0x61,0xa3,0x5e, +0x6e,0x10,0x61,0xa3,0x5f,0x10,0x61,0xa3,0x61,0x11,0x73,0x61,0xa3,0x62,0x62,0x3c, +0x6a,0x42,0x6c,0x10,0x6c,1,0x61,0xa3,0x5b,0x6c,0x10,0x61,0xa3,0x5c,0x11,0x68, +0x61,0xa3,0x59,0x10,0x61,0xa3,0x5a,0x11,0x65,0x6d,0x51,0x10,0x61,1,0x66,0x37, +0x6d,0x11,0x61,0x6c,0x39,1,0x61,0x40,0x65,0x3e,1,0x68,0x28,0x74,0x10,0x68, +0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,0x43,2,0x68,0x3b,0x6d,0x5c,0x6e,0x1a,0x69, +0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,1,0x6b,0x2a,0x70,0x10,0x61, +0xa3,0x65,0x15,0x69,0x6e,0x6e,0x61,0x79,0x61,0xa3,0x64,0x1a,0x7a,0x61,0x6f,0x6e, +0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,0x3d,2,0x61,0x3a,0x68,0x5e,0x6e,0x17,0x6f, +0x74,0x74,0x65,0x64,0x68,0x65,0x68,0x4b,2,0x66,0x47,0x70,0x38,0x73,0x17,0x68, +0x6d,0x69,0x72,0x69,0x79,0x65,0x68,0xa3,0x68,0x10,0x68,0x49,0x12,0x61,0x70,0x68, +0x89,0x11,0x61,0x6d,0x4c,0x12,0x61,0x64,0x68,0x4f,0x61,0x6e,0x62,0xa2,0x54,0x64, +0xa2,0x70,0x65,0x31,0x66,2,0x61,0x3e,0x65,0x4a,0x69,0x19,0x6e,0x61,0x6c,0x73, +0x65,0x6d,0x6b,0x61,0x74,0x68,0x35,0x15,0x72,0x73,0x69,0x79,0x65,0x68,0x8f,0x86, +0x10,0x68,0x33,2,0x66,0x3c,0x69,0x70,0x6c,1,0x61,0x28,0x65,0x10,0x66,0x27, +0x11,0x70,0x68,0x25,0x14,0x72,0x69,0x63,0x61,0x6e,2,0x66,0x30,0x6e,0x36,0x71, +0x11,0x61,0x66,0xa3,0x58,0x11,0x65,0x68,0xa3,0x56,0x12,0x6f,0x6f,0x6e,0xa3,0x57, +0x10,0x6e,0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f,0x75,0x73,0x68,0x61,0x73,0x6b, +0x69,0x79,0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65,0x8d,1,0x68,0x29,0x74,0x10, +0x68,0x2b,0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68,0x72,0x69,0x73,0x68,0x2f,7, +0x6e,0x2e,0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21,0x18,0x6f,0x6e,0x6a,0x6f,0x69, +0x6e,0x69,0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68,0x74,0x6a,0x6f,0x69,0x6e,0x69, +0x6e,0x67,0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x2b, +0x63,0x23,0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65,0x66,0x74,0x6a,0x6f,0x69,0x6e, +0x69,0x6e,0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67, +0x25,0x19,0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69,0x6e,0x67,0x23,0,0x14,0x6e, +0xc0,0xf9,0x73,0x72,0x77,0x23,0x77,0x40,0x78,0x58,0x7a,0x10,0x77,0x58,1,0x6a, +0x75,0x73,0x13,0x70,0x61,0x63,0x65,0x59,1,0x6a,0x5d,0x6f,0x17,0x72,0x64,0x6a, +0x6f,0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,0x73,0x4a,0x75,0x7a,0x76,1,0x66, +0x7d,0x69,0x7e,0x13,0x72,0x61,0x6d,0x61,0x7e,0x14,0x66,0x69,0x6e,0x61,0x6c,0x7d, +4,0x61,0x51,0x67,0x53,0x70,0x28,0x75,0x30,0x79,0x57,0x54,0x12,0x61,0x63,0x65, +0x55,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x53,0x10,0x6e,1,0x61,0x2e,0x6b, +0x13,0x6e,0x6f,0x77,0x6e,0x21,0x1d,0x6d,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x68, +0x79,0x70,0x68,0x65,0x6e,0x81,0x6e,0x60,0x6f,0xa2,0x41,0x70,0xa2,0x50,0x71,0xa2, +0x6e,0x72,1,0x65,0x24,0x69,0x6f,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e, +0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x6f,4,0x65,0x3e,0x6c,0x5b,0x6f,0x46,0x73, +0x45,0x75,0x46,0x14,0x6d,0x65,0x72,0x69,0x63,0x47,0x15,0x78,0x74,0x6c,0x69,0x6e, +0x65,0x5b,0x17,0x6e,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x45,0x10,0x70,0x48,0x1c, +0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,1,0x6f, +0x3e,0x72,0x4c,0x1a,0x65,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4d, +0x4a,0x1b,0x73,0x74,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4b,0x10, +0x75,0x4e,0x16,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x68,0x7e,0x68,0x50,0x69, +0x8c,0x6a,0xa2,0x64,0x6c,0xa2,0x68,0x6d,0x1c,0x61,0x6e,0x64,0x61,0x74,0x6f,0x72, +0x79,0x62,0x72,0x65,0x61,0x6b,0x2d,5,0x68,0xc,0x68,0x81,0x6c,0x6d,0x79,0x3a, +0x13,0x70,0x68,0x65,0x6e,0x3b,0x32,0x5f,0x33,0x61,0x65,0x19,0x62,0x72,0x65,0x77, +0x6c,0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,0x28,0x6e,0x3c,0x73,0x41,0x3c,0x18, +0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x3d,0x3e,1,0x66,0x3e,0x73,0x11, +0x65,0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,0x62,0x6c,0x65,0x3f,0x18,0x69,0x78, +0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,0x6c,0x63,0x74,0x65,0x76,0x67,1, +0x66,0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,0x64,0x43,0x61,0x42,0x62,0xa2,0x49, +0x63,0xa2,0x76,0x65,0xa2,0xfc,0x67,0x10,0x6c,0x38,0x11,0x75,0x65,0x39,5,0x6d, +0xf,0x6d,0x28,0x70,0x79,0x73,0x7b,0x16,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23, +0x69,0x23,0x6b,0x38,0x6c,0x24,0x17,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x25, +0x76,0x13,0x73,0x61,0x72,0x61,0x76,1,0x70,0x2e,0x73,0x13,0x74,0x61,0x72,0x74, +0x7b,0x15,0x72,0x65,0x62,0x61,0x73,0x65,0x79,4,0x32,0x27,0x61,0x29,0x62,0x2b, +0x6b,0x2d,0x72,0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,0x3e,0x73,0x15,0x79,0x6d, +0x62,0x6f,0x6c,0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,1,0x65,0x2a,0x6f,0x11, +0x74,0x68,0x27,0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,0x51,0x6d,0x33,0x6f,0x28, +0x70,0x69,0x72,0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,0x74,0x1a,0x69,0x6e,0x67, +0x65,0x6e,0x74,0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,0x74,0x69,0x6f,0x6e,0x61, +0x1f,0x6c,0x6a,0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,0x74,0x61,0x72,0x74,0x65, +0x72,0x6b,1,0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,0x6f,0x6e,0x74,0x65,0x78, +0x74,0x51,0x18,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x33,0x61,0x6a,0x62, +0x2f,0x6a,0x6b,0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,0x61,0x38,0x75,0x18,0x6e, +0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,0x65,0x6e,0x74,0x68,0x65, +0x73,0x69,0x73,0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,0x72,0x65,0x74,0x75,0x72, +0x6e,0x35,2,0x62,0x3e,0x6d,0x46,0x78,0x36,0x18,0x63,0x6c,0x61,0x6d,0x61,0x74, +0x69,0x6f,0x6e,0x37,0x70,0x12,0x61,0x73,0x65,0x71,0x72,0x16,0x6f,0x64,0x69,0x66, +0x69,0x65,0x72,0x73,1,0x64,0x42,0x6e,1,0x6f,0x32,0x75,0x26,0x14,0x6d,0x65, +0x72,0x69,0x63,0x27,0x11,0x6e,0x65,0x21,1,0x65,0x2e,0x69,0x24,0x12,0x67,0x69, +0x74,0x25,0x22,0x14,0x63,0x69,0x6d,0x61,0x6c,0x23,0,0x18,0x6e,0xc4,0xd6,0x74, +0xc1,0xd4,0x77,0x96,0x77,0xa2,0x4c,0x78,0xa2,0x70,0x79,0xa2,0x7a,0x7a,6,0x73, +0x1e,0x73,0x34,0x78,0x42,0x79,0x48,0x7a,0x11,0x7a,0x7a,0xa3,0x67,0x10,0x79,1, +0x65,0xa3,0xae,0x6d,0xa3,0x81,0x11,0x78,0x78,0xa3,0x66,0x11,0x79,0x79,0x21,0x61, +0x30,0x69,0x58,0x6d,0x11,0x74,0x68,0xa3,0x80,0x10,0x6e,1,0x61,0x26,0x62,0xa3, +0xb1,0x1a,0x62,0x61,0x7a,0x61,0x72,0x73,0x71,0x75,0x61,0x72,0x65,0xa3,0xb1,0x11, +0x6e,0x68,0x23,2,0x61,0x30,0x63,0x5a,0x6f,0x11,0x6c,0x65,0xa3,0x9b,1,0x6e, +0x3c,0x72,0x10,0x61,0xa2,0x92,0x15,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0x92,0x12, +0x63,0x68,0x6f,0xa3,0xbc,0x11,0x68,0x6f,0xa3,0xbc,1,0x70,0x2c,0x73,0x11,0x75, +0x78,0xa3,0x65,0x11,0x65,0x6f,0x9b,1,0x65,0x2c,0x69,0x72,0x11,0x69,0x69,0x73, +0x11,0x7a,0x69,0xa2,0xc0,0x11,0x64,0x69,0xa3,0xc0,0x74,0x66,0x75,0xa4,0x21,0x76, +1,0x61,0x48,0x69,1,0x73,0x38,0x74,0x10,0x68,0xa2,0xc5,0x13,0x6b,0x75,0x71, +0x69,0xa3,0xc5,0x10,0x70,0xa3,0x64,0x10,0x69,0xa2,0x63,0x10,0x69,0xa3,0x63,8, +0x68,0x75,0x68,0x5a,0x69,0x6e,0x6e,0xa2,0x45,0x6f,0xa2,0x47,0x75,1,0x6c,0x2a, +0x74,0x10,0x67,0xa3,0xcf,0x18,0x75,0x74,0x69,0x67,0x61,0x6c,0x61,0x72,0x69,0xa3, +0xcf,0x10,0x61,1,0x61,0x24,0x69,0x6d,0x6a,0x11,0x6e,0x61,0x6b,2,0x62,0x3a, +0x66,0x4a,0x72,0x10,0x68,0xa2,0x9e,0x12,0x75,0x74,0x61,0xa3,0x9e,1,0x65,0x24, +0x74,0x6f,0x12,0x74,0x61,0x6e,0x6f,0x14,0x69,0x6e,0x61,0x67,0x68,0x99,0x11,0x73, +0x61,0xa3,0xc3,2,0x64,0x2e,0x6c,0x40,0x74,0x10,0x6f,0xa3,0xc4,1,0x68,0x26, +0x72,0xa3,0xce,0x11,0x72,0x69,0xa3,0xce,1,0x6f,0x26,0x73,0xa3,0xd3,0x15,0x6e, +0x67,0x73,0x69,0x6b,0x69,0xa3,0xd3,0x61,0x36,0x65,0xa2,0x71,0x66,0xa2,0x7d,0x67, +0x11,0x6c,0x67,0x75,7,0x6d,0x27,0x6d,0x32,0x6e,0x3e,0x76,0x5a,0x79,0x10,0x6f, +0xa3,0xd2,1,0x69,0x24,0x6c,0x67,0x10,0x6c,0x67,0x10,0x67,0xa2,0x9a,1,0x73, +0x2a,0x75,0x10,0x74,0xa3,0x9a,0x10,0x61,0xa3,0xc3,0x10,0x74,0xa3,0x7f,0x67,0x34, +0x69,0x50,0x6b,0x82,0x6c,1,0x65,0x89,0x75,0x97,1,0x61,0x30,0x62,0x7a,0x13, +0x61,0x6e,0x77,0x61,0x7b,0x12,0x6c,0x6f,0x67,0x75,3,0x6c,0x32,0x74,0x34,0x76, +0x3c,0x79,0x10,0x6f,0xa3,0xd2,0x10,0x65,0x89,0x12,0x68,0x61,0x6d,0xa3,0x6a,0x12, +0x69,0x65,0x74,0xa3,0x7f,0x10,0x72,0xa2,0x99,0x10,0x69,0xa3,0x99,1,0x6c,0x2a, +0x6e,0x10,0x67,0xa3,0x62,0x10,0x75,0x68,0x11,0x67,0x75,0x69,0x11,0x6e,0x67,0x99, +1,0x67,0x32,0x6e,0x14,0x6b,0x6e,0x6f,0x77,0x6e,0xa3,0x67,0x11,0x61,0x72,0x8a, +0x13,0x69,0x74,0x69,0x63,0x8b,0x71,0xc1,0x2a,0x71,0xa2,0xf5,0x72,0xa2,0xfa,0x73, +6,0x69,0xa1,0x69,0x72,0x6f,0xa2,0x58,0x75,0xa2,0x81,0x79,1,0x6c,0x46,0x72, +4,0x63,0x65,0x65,0xa3,0x5f,0x69,0x2c,0x6a,0xa3,0x60,0x6e,0xa3,0x61,0x11,0x61, +0x63,0x65,0x10,0x6f,0x94,0x16,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0x95,2,0x64, +0x3c,0x67,0x64,0x6e,1,0x64,0xa3,0x91,0x68,0x62,0x12,0x61,0x6c,0x61,0x63,2, +0x64,0x2a,0x65,0x36,0x74,0xa3,0xd1,0xa2,0xa6,0x12,0x68,0x61,0x6d,0xa3,0xa6,0x12, +0x74,0x69,0x63,0xa3,0xd1,0x17,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa3,0x70, 2,0x67,0x3a,0x72,0x52,0x79,0x10,0x6f,0xa2,0xb0,0x12,0x6d,0x62,0x6f,0xa3,0xb0, 1,0x64,0x26,0x6f,0xa3,0xb8,0xa2,0xb7,0x12,0x69,0x61,0x6e,0xa3,0xb7,0x10,0x61, -0xa2,0x98,0x16,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,0xa3,0x98,0x11,0x6e,0x64,0xa2, -0x71,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0x71,0x61,0x5c,0x67,0xa2,0x43,0x68,1, -0x61,0x2a,0x72,0x10,0x64,0xa3,0x97,2,0x72,0x28,0x76,0x30,0x77,0x87,0x12,0x61, -0x64,0x61,0xa3,0x97,0x12,0x69,0x61,0x6e,0x87,2,0x6d,0x40,0x72,0x58,0x75,0x10, -0x72,0xa2,0x6f,0x15,0x61,0x73,0x68,0x74,0x72,0x61,0xa3,0x6f,1,0x61,0x26,0x72, -0xa3,0x7e,0x14,0x72,0x69,0x74,0x61,0x6e,0xa3,0x7e,1,0x61,0xa3,0x5e,0x62,0xa3, -0x85,0x11,0x6e,0x77,0xa3,0x70,0x11,0x61,0x61,1,0x63,0x2f,0x69,0x23,3,0x65, -0x3e,0x6a,0x48,0x6f,0x4e,0x75,0x10,0x6e,1,0x69,0x24,0x72,0x61,0x10,0x63,0x61, -0x13,0x6a,0x61,0x6e,0x67,0xa3,0x6e,0x11,0x6e,0x67,0xa3,0x6e,1,0x68,0x2a,0x72, -0x10,0x6f,0xa3,0x5d,0x10,0x67,0xa3,0xb6,0x6e,0xa2,0x83,0x6f,0xa4,1,0x70,5, -0x6c,0x1e,0x6c,0x44,0x72,0x4a,0x73,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68, -0x6c,0x61,0x76,0x69,0xa3,0x7b,0x11,0x72,0x64,0xa3,0x5c,0x11,0x74,0x69,0xa3,0x7d, -0x61,0x7c,0x65,0xa2,0x54,0x68,3,0x61,0x3e,0x6c,0x4e,0x6e,0x5e,0x6f,0x16,0x65, -0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x5b,0x10,0x67,0xa2,0x5a,0x12,0x73,0x70,0x61, -0xa3,0x5a,2,0x69,0xa3,0x7a,0x70,0xa3,0x7b,0x76,0xa3,0x7c,0x10,0x78,0xa3,0x5b, -2,0x68,0x3e,0x6c,0x50,0x75,0x10,0x63,0xa2,0xa5,0x14,0x69,0x6e,0x68,0x61,0x75, -0xa3,0xa5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0x4b,0x10,0x6d,0xa2, -0x90,0x14,0x79,0x72,0x65,0x6e,0x65,0xa3,0x90,0x11,0x72,0x6d,0xa3,0x59,6,0x6b, -0x36,0x6b,0x56,0x73,0x6e,0x75,0x74,0x79,0x11,0x69,0x61,0x1f,0x6b,0x65,0x6e,0x67, -0x70,0x75,0x61,0x63,0x68,0x75,0x65,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xba,1,0x67, -0x2e,0x6f,0xa2,0x57,0x10,0x6f,0xa3,0x57,0x10,0x62,0xa3,0x84,0x11,0x68,0x75,0xa3, -0x96,0x12,0x73,0x68,0x75,0xa3,0x96,0x61,0x42,0x62,0x9e,0x65,0x10,0x77,1,0x61, -0xa3,0xaa,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0x97,3,0x62,0x32,0x67,0x40,0x6e, -0x56,0x72,0x10,0x62,0xa3,0x8e,0x15,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0x8f,0x10, -0x6d,0xa2,0xc7,0x15,0x75,0x6e,0x64,0x61,0x72,0x69,0xa3,0xc7,0x10,0x64,0xa2,0xbb, -0x16,0x69,0x6e,0x61,0x67,0x61,0x72,0x69,0xa3,0xbb,0x11,0x61,0x74,0xa3,0x8f,4, -0x67,0x3c,0x6c,0x4e,0x72,0xa2,0x8e,0x73,0xa2,0x9c,0x75,0x11,0x67,0x72,0xa3,0xc2, -1,0x61,0x2a,0x68,0x11,0x61,0x6d,0x5b,0x10,0x6d,0x5b,1,0x63,0xa2,0x6a,0x64, -6,0x70,0x41,0x70,0x3a,0x73,0x58,0x74,0x86,0x75,0x14,0x79,0x67,0x68,0x75,0x72, -0xa3,0xc2,0x11,0x65,0x72,1,0x6d,0x2c,0x73,0x12,0x69,0x61,0x6e,0x9b,0x11,0x69, -0x63,0xa3,0x59,0x10,0x6f,1,0x67,0x3a,0x75,0x18,0x74,0x68,0x61,0x72,0x61,0x62, -0x69,0x61,0x6e,0xa3,0x85,0x13,0x64,0x69,0x61,0x6e,0xa3,0xb8,0x14,0x75,0x72,0x6b, -0x69,0x63,0xa3,0x58,0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72, -0x61,0x62,0x69,0x61,0x6e,0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e, -0xa3,0x4c,0x14,0x74,0x61,0x6c,0x69,0x63,0x5d,1,0x68,0x26,0x6b,0xa3,0x6d,0x12, -0x69,0x6b,0x69,0xa3,0x6d,2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f,0x11,0x79, -0x61,0x5f,0x10,0x68,0xa3,0x58,2,0x61,0x36,0x67,0x3c,0x6d,0x10,0x61,0x84,0x12, -0x6e,0x79,0x61,0x85,0x11,0x67,0x65,0xa3,0xab,0x10,0x65,0xa3,0xab,0x68,0xc3,0x15, -0x6b,0xc2,0x2c,0x6b,0xa4,0x17,0x6c,0xa4,0xba,0x6d,8,0x6f,0x46,0x6f,0x48,0x72, -0x74,0x74,0x80,0x75,0x86,0x79,1,0x61,0x28,0x6d,0x10,0x72,0x59,0x13,0x6e,0x6d, -0x61,0x72,0x59,2,0x64,0x2e,0x6e,0x32,0x6f,0x10,0x6e,0xa3,0x72,0x10,0x69,0xa3, -0xa3,0x10,0x67,0x56,0x14,0x6f,0x6c,0x69,0x61,0x6e,0x57,0x10,0x6f,0xa2,0x95,0x10, -0x6f,0xa3,0x95,0x11,0x65,0x69,0xa3,0x73,0x11,0x6c,0x74,0xa2,0xa4,0x12,0x61,0x6e, -0x69,0xa3,0xa4,0x61,0x36,0x65,0xa2,0x67,0x69,0xa2,0xbd,0x6c,0x11,0x79,0x6d,0x55, -6,0x6e,0x38,0x6e,0x32,0x72,0x5c,0x73,0x6c,0x79,0x10,0x61,0xa3,0x55,1,0x64, -0x38,0x69,0xa2,0x79,0x15,0x63,0x68,0x61,0x65,0x61,0x6e,0xa3,0x79,0xa2,0x54,0x12, -0x61,0x69,0x63,0xa3,0x54,0x10,0x63,0xa2,0xa9,0x12,0x68,0x65,0x6e,0xa3,0xa9,0x18, -0x61,0x72,0x61,0x6d,0x67,0x6f,0x6e,0x64,0x69,0xa3,0xaf,0x68,0x36,0x6b,0x4c,0x6c, -0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x55,1,0x61,0x26,0x6a,0xa3,0xa0,0x13,0x6a, -0x61,0x6e,0x69,0xa3,0xa0,0x10,0x61,0xa2,0xb4,0x12,0x73,0x61,0x72,0xa3,0xb4,3, -0x64,0x78,0x65,0x94,0x6e,0xa2,0x42,0x72,1,0x63,0xa3,0x8d,0x6f,0xa2,0x56,0x13, -0x69,0x74,0x69,0x63,1,0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79, -0x70,0x68,0x73,0xa3,0x56,0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0x8d,1,0x65, -0x26,0x66,0xa3,0xb5,0x16,0x66,0x61,0x69,0x64,0x72,0x69,0x6e,0xa3,0xb5,0x17,0x74, -0x65,0x69,0x6d,0x61,0x79,0x65,0x6b,0xa3,0x73,0x10,0x64,0xa2,0x8c,0x17,0x65,0x6b, -0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0x8c,0x11,0x61,0x6f,0xa3,0x5c,6,0x6e,0x1a, -0x6e,0x34,0x6f,0x38,0x70,0x3e,0x74,0x11,0x68,0x69,0xa3,0x78,0x11,0x64,0x61,0x4b, -0x11,0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3,0x8a,0x61,0x32,0x68,0xa2,0x44,0x69, -0x11,0x74,0x73,0xa3,0xbf,5,0x74,0x23,0x74,0x34,0x77,0x56,0x79,0x13,0x61,0x68, -0x6c,0x69,0xa3,0x4f,0x14,0x61,0x6b,0x61,0x6e,0x61,0x4c,0x19,0x6f,0x72,0x68,0x69, -0x72,0x61,0x67,0x61,0x6e,0x61,0x8d,0x10,0x69,0xa3,0xc6,0x69,0x38,0x6c,0x40,0x6e, -1,0x61,0x4d,0x6e,0x12,0x61,0x64,0x61,0x4b,0x12,0x74,0x68,0x69,0xa3,0x78,0x10, -0x69,0xa3,0x4f,4,0x61,0x40,0x69,0x52,0x6d,0x70,0x6f,0x7c,0x75,0x15,0x64,0x61, -0x77,0x61,0x64,0x69,0xa3,0x91,0x10,0x72,0x92,0x15,0x6f,0x73,0x68,0x74,0x68,0x69, -0x93,0x1d,0x74,0x61,0x6e,0x73,0x6d,0x61,0x6c,0x6c,0x73,0x63,0x72,0x69,0x70,0x74, -0xa3,0xbf,1,0x65,0x24,0x72,0x4f,0x10,0x72,0x4f,0x10,0x6a,0xa2,0x9d,0x11,0x6b, -0x69,0xa3,0x9d,4,0x61,0x5c,0x65,0x90,0x69,0xa0,0x6f,0xa2,0x5d,0x79,1,0x63, -0x34,0x64,0x10,0x69,0xa2,0x6c,0x11,0x61,0x6e,0xa3,0x6c,0x10,0x69,0xa2,0x6b,0x11, -0x61,0x6e,0xa3,0x6b,2,0x6e,0x42,0x6f,0x46,0x74,3,0x66,0xa3,0x50,0x67,0xa3, -0x51,0x69,0x24,0x6e,0x53,0x10,0x6e,0x53,0x10,0x61,0xa3,0x6a,0x50,0x10,0x6f,0x51, -0x11,0x70,0x63,0xa2,0x52,0x11,0x68,0x61,0xa3,0x52,2,0x6d,0x2e,0x6e,0x36,0x73, -0x10,0x75,0xa3,0x83,0x10,0x62,0x80,0x10,0x75,0x81,2,0x61,0xa3,0x53,0x62,0x83, -0x65,0x11,0x61,0x72,1,0x61,0xa3,0x53,0x62,0x83,0x11,0x6d,0x61,0xa3,0x8b,0x68, -0x6e,0x69,0xa2,0x95,0x6a,2,0x61,0x30,0x70,0x52,0x75,0x11,0x72,0x63,0xa3,0x94, -1,0x6d,0x38,0x76,0x10,0x61,0xa2,0x4e,0x13,0x6e,0x65,0x73,0x65,0xa3,0x4e,0x10, -0x6f,0xa3,0xad,0x11,0x61,0x6e,0xa3,0x69,6,0x6c,0x1e,0x6c,0x34,0x6d,0x3a,0x72, -0x48,0x75,0x11,0x6e,0x67,0xa3,0x4c,0x11,0x75,0x77,0xa3,0x9c,0x10,0x6e,1,0x67, -0xa3,0x4b,0x70,0xa3,0xba,0x11,0x6b,0x74,0x8d,0x61,0x3c,0x65,0xa2,0x43,0x69,0x11, -0x72,0x61,0x48,0x13,0x67,0x61,0x6e,0x61,0x49,1,0x6e,0x34,0x74,0x10,0x72,0xa2, -0xa2,0x11,0x61,0x6e,0xa3,0xa2,0x42,6,0x6f,0xe,0x6f,0x77,0x73,0xa3,0x49,0x74, -0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f,0x77,0x62,0xa3,0xac,0x67,0x3e,0x69,0x42,0x19, -0x66,0x69,0x72,0x6f,0x68,0x69,0x6e,0x67,0x79,0x61,0xa3,0xb6,0x44,0x11,0x75,0x6c, -0x45,0x11,0x62,0x72,0x46,0x11,0x65,0x77,0x47,2,0x6d,0x2e,0x6e,0x4a,0x74,0x11, -0x61,0x6c,0x5d,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69, -0x63,0xa3,0x74,2,0x64,0x66,0x68,0x6a,0x73,0x1b,0x63,0x72,0x69,0x70,0x74,0x69, -0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,0x74,0x68,0x69,0x61,0x6e, -0xa3,0x7d,0x13,0x6c,0x61,0x76,0x69,0xa3,0x7a,0x10,0x73,0xa3,0x4d,0x15,0x65,0x72, -0x69,0x74,0x65,0x64,0x23,0x64,0xc1,0xd,0x64,0xa2,0x7a,0x65,0xa2,0xc1,0x67,4, -0x65,0x82,0x6c,0x9a,0x6f,0xa2,0x46,0x72,0xa2,0x55,0x75,2,0x6a,0x3c,0x6e,0x4e, -0x72,1,0x6d,0x24,0x75,0x41,0x13,0x75,0x6b,0x68,0x69,0x41,1,0x61,0x24,0x72, -0x3f,0x13,0x72,0x61,0x74,0x69,0x3f,0x18,0x6a,0x61,0x6c,0x61,0x67,0x6f,0x6e,0x64, -0x69,0xa3,0xb3,0x10,0x6f,1,0x6b,0xa3,0x48,0x72,0x38,0x13,0x67,0x69,0x61,0x6e, -0x39,0x11,0x61,0x67,0x90,0x15,0x6f,0x6c,0x69,0x74,0x69,0x63,0x91,1,0x6e,0x30, -0x74,0x10,0x68,0x3a,0x11,0x69,0x63,0x3b,1,0x67,0xa3,0xb3,0x6d,0xa3,0xaf,1, -0x61,0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b,0x3d,0x10,0x6e,0xa2,0x89,0x12, -0x74,0x68,0x61,0xa3,0x89,4,0x65,0x46,0x69,0x6c,0x6f,0x8c,0x73,0x9a,0x75,0x11, -0x70,0x6c,0xa2,0x87,0x13,0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,0x38,0x76,0x10, -0x61,0x34,0x15,0x6e,0x61,0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,0x65,0x74,0x33, -1,0x61,0x36,0x76,0x16,0x65,0x73,0x61,0x6b,0x75,0x72,0x75,0xa3,0xbe,0x10,0x6b, -0xa3,0xbe,0x11,0x67,0x72,0xa2,0xb2,0x10,0x61,0xa3,0xb2,0x11,0x72,0x74,0x33,2, -0x67,0x3a,0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63,0x37,0x10, -0x79,2,0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69,0x61,0x6e, -0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,1,0x62,0x36, -0x79,0x10,0x6d,0xa2,0xb9,0x12,0x61,0x69,0x63,0xa3,0xb9,0x10,0x61,0xa2,0x88,0x12, -0x73,0x61,0x6e,0xa3,0x88,0x61,0xa2,0xc9,0x62,0xa4,0x2e,0x63,6,0x6f,0x52,0x6f, -0x76,0x70,0x92,0x75,0xa2,0x41,0x79,1,0x70,0x3e,0x72,2,0x69,0x2a,0x6c,0x31, -0x73,0xa3,0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x10,0x72,1,0x69,0x34,0x6f,0x15, -0x6d,0x69,0x6e,0x6f,0x61,0x6e,0xa3,0xc1,0x11,0x6f,0x74,0x7f,1,0x6d,0x30,0x70, -0x10,0x74,0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d,0x6f,0x6e,0x21,1,0x6d,0x28,0x72, -0x10,0x74,0x7f,0x10,0x6e,0xa3,0xc1,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3, -0x65,0x61,0x32,0x68,0xa2,0x41,0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e, -0x50,0x72,0x76,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e, -0x69,0x61,0x6e,0xa3,0x9f,0x10,0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64, -0x69,0x61,0x6e,0x61,0x62,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69, -0xa2,0x68,0x11,0x61,0x6e,0xa3,0x68,3,0x61,0x32,0x65,0x44,0x6f,0x52,0x72,0x10, -0x73,0xa3,0xbd,1,0x6b,0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,0x10,0x72, -0x2c,0x13,0x6f,0x6b,0x65,0x65,0x2d,0x16,0x72,0x61,0x73,0x6d,0x69,0x61,0x6e,0xa3, -0xbd,6,0x68,0x4a,0x68,0x48,0x6e,0x4e,0x72,0x76,0x76,1,0x65,0x2a,0x73,0x10, -0x74,0xa3,0x75,0x13,0x73,0x74,0x61,0x6e,0xa3,0x75,0x11,0x6f,0x6d,0xa3,0xa1,0x11, -0x61,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79, -0x70,0x68,0x73,0xa3,0x9c,1,0x61,0x3e,0x6d,2,0x65,0x2a,0x69,0xa3,0x74,0x6e, -0x27,0x13,0x6e,0x69,0x61,0x6e,0x27,0x10,0x62,0x24,0x11,0x69,0x63,0x25,0x64,0x30, -0x66,0x44,0x67,0x11,0x68,0x62,0xa3,0x9f,0x10,0x6c,1,0x61,0x26,0x6d,0xa3,0xa7, -0x10,0x6d,0xa3,0xa7,0x11,0x61,0x6b,0xa3,0x93,6,0x6c,0x3c,0x6c,0x52,0x6f,0x56, -0x72,0x66,0x75,1,0x67,0x30,0x68,1,0x64,0x79,0x69,0x10,0x64,0x79,0x10,0x69, -0x8e,0x13,0x6e,0x65,0x73,0x65,0x8f,0x11,0x69,0x73,0xa1,0x11,0x70,0x6f,0x2a,0x13, -0x6d,0x6f,0x66,0x6f,0x2b,0x10,0x61,1,0x68,0x2e,0x69,0x7c,0x12,0x6c,0x6c,0x65, -0x7d,0xa2,0x41,0x11,0x6d,0x69,0xa3,0x41,0x61,0x48,0x65,0x9c,0x68,1,0x61,0x2a, -0x6b,0x10,0x73,0xa3,0xa8,0x15,0x69,0x6b,0x73,0x75,0x6b,0x69,0xa3,0xa8,3,0x6c, -0x3a,0x6d,0x48,0x73,0x54,0x74,1,0x61,0x24,0x6b,0x9f,0x10,0x6b,0x9f,0x10,0x69, -0x9c,0x13,0x6e,0x65,0x73,0x65,0x9d,0x10,0x75,0xa2,0x82,0x10,0x6d,0xa3,0x82,0x10, -0x73,0xa2,0x86,0x13,0x61,0x76,0x61,0x68,0xa3,0x86,0x11,0x6e,0x67,0x28,0x12,0x61, -0x6c,0x69,0x29,3,0x6c,0x42,0x6e,0x90,0x74,0xa2,0x46,0x76,0x24,0x17,0x6f,0x77, -0x65,0x6c,0x6a,0x61,0x6d,0x6f,0x25,0x22,1,0x65,0x54,0x76,0x28,1,0x73,0x38, -0x74,0x2a,0x17,0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x2b,0x16,0x79,0x6c,0x6c, -0x61,0x62,0x6c,0x65,0x29,0x18,0x61,0x64,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x23, -1,0x61,0x21,0x6f,0x1a,0x74,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65, -0x21,0x26,0x1a,0x72,0x61,0x69,0x6c,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x27,1, -0x6e,0x2c,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,1,0x6e,0x2c,0x79, -0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22, -0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f,0x21,2, -0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65, -0x25,0x20,0x10,0x6f,0x21,0xb,0x72,0x39,0x76,0xc,0x76,0x33,0x78,0x2a,0x7a,0x11, -0x77,0x6a,0x43,0x10,0x78,0x21,0x72,0x28,0x73,0x50,0x74,0x31,1,0x65,0x24,0x69, -0x39,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f, -0x72,0x39,1,0x6d,0x35,0x70,0x18,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b, -0x35,0x6c,0x1f,0x6c,0x3c,0x6f,0x4a,0x70,1,0x70,0x37,0x72,0x14,0x65,0x70,0x65, -0x6e,0x64,0x37,0x28,1,0x66,0x2b,0x76,0x2c,0x10,0x74,0x2f,0x13,0x74,0x68,0x65, -0x72,0x21,0x63,0x4c,0x65,0x64,0x67,1,0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66, -0x74,0x65,0x72,0x7a,0x77,0x6a,0x41,0x10,0x7a,0x41,2,0x6e,0x23,0x6f,0x24,0x72, -0x25,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x23,2,0x62,0x34,0x6d,0x4e,0x78,0x26,0x13, -0x74,0x65,0x6e,0x64,0x27,0x3a,1,0x61,0x24,0x67,0x3d,0x11,0x73,0x65,0x3a,0x12, -0x67,0x61,0x7a,0x3d,0x3e,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x3f,9,0x6e, -0x4a,0x6e,0x34,0x6f,0x44,0x73,0x60,0x75,0x94,0x78,0x10,0x78,0x21,0x10,0x75,0x2a, -0x14,0x6d,0x65,0x72,0x69,0x63,0x2b,1,0x6c,0x2c,0x74,0x12,0x68,0x65,0x72,0x21, -0x14,0x65,0x74,0x74,0x65,0x72,0x2d,3,0x63,0x36,0x65,0x46,0x70,0x31,0x74,0x32, -0x12,0x65,0x72,0x6d,0x33,0x3c,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3d,0x2e, -0x10,0x70,0x2f,0x10,0x70,0x34,0x12,0x70,0x65,0x72,0x35,0x61,0x46,0x63,0x52,0x65, -0x64,0x66,0x72,0x6c,2,0x65,0x2d,0x66,0x3b,0x6f,0x28,0x12,0x77,0x65,0x72,0x29, -0x10,0x74,0x22,0x12,0x65,0x72,0x6d,0x23,1,0x6c,0x24,0x72,0x37,0x24,0x12,0x6f, -0x73,0x65,0x25,0x10,0x78,0x38,0x13,0x74,0x65,0x6e,0x64,0x39,0x10,0x6f,0x26,0x13, -0x72,0x6d,0x61,0x74,0x27,0,0x10,0x6c,0x88,0x72,0x40,0x72,0x36,0x73,0x5e,0x77, -0x7a,0x78,0x8a,0x7a,0x11,0x77,0x6a,0x4b,1,0x65,0x24,0x69,0x3b,0x1e,0x67,0x69, -0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x3b,1,0x69, -0x24,0x71,0x3f,0x18,0x6e,0x67,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65,0x3f,0x17,0x73, -0x65,0x67,0x73,0x70,0x61,0x63,0x65,0x4d,0x10,0x78,0x21,0x6c,0x36,0x6d,0x3c,0x6e, -0x76,0x6f,0x13,0x74,0x68,0x65,0x72,0x21,1,0x65,0x23,0x66,0x35,3,0x62,0x37, -0x69,0x28,0x6c,0x29,0x6e,0x2b,0x10,0x64,1,0x6c,0x34,0x6e,0x11,0x75,0x6d,0x2a, -0x12,0x6c,0x65,0x74,0x37,0x14,0x65,0x74,0x74,0x65,0x72,0x29,2,0x65,0x36,0x6c, -0x39,0x75,0x2c,0x14,0x6d,0x65,0x72,0x69,0x63,0x2d,0x14,0x77,0x6c,0x69,0x6e,0x65, -0x39,0x66,0x3f,0x66,0x40,0x67,0x4e,0x68,0x70,0x6b,0x10,0x61,0x26,0x15,0x74,0x61, -0x6b,0x61,0x6e,0x61,0x27,0x10,0x6f,0x24,0x13,0x72,0x6d,0x61,0x74,0x25,1,0x61, -0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x49,0x10,0x7a, -0x49,1,0x65,0x24,0x6c,0x3d,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65, -0x72,0x3d,0x61,0x86,0x63,0x92,0x64,0x94,0x65,2,0x62,0x44,0x6d,0x5e,0x78,0x2e, -0x13,0x74,0x65,0x6e,0x64,0x32,0x15,0x6e,0x75,0x6d,0x6c,0x65,0x74,0x2f,0x42,1, -0x61,0x24,0x67,0x45,0x11,0x73,0x65,0x42,0x12,0x67,0x61,0x7a,0x45,0x46,0x16,0x6f, -0x64,0x69,0x66,0x69,0x65,0x72,0x47,0x15,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x10, -0x72,0x31,1,0x6f,0x24,0x71,0x41,0x18,0x75,0x62,0x6c,0x65,0x71,0x75,0x6f,0x74, -0x65,0x41,2,0x63,0x32,0x6e,0x3c,0x6f,0x22,0x12,0x70,0x65,0x6e,0x23,0x24,0x13, -0x6c,0x6f,0x73,0x65,0x25,0x20,0x12,0x6f,0x6e,0x65,0x21,6,0x6f,0x65,0x6f,0x4a, -0x72,0x5c,0x74,0x64,0x76,0x1d,0x69,0x73,0x75,0x61,0x6c,0x6f,0x72,0x64,0x65,0x72, -0x6c,0x65,0x66,0x74,0x3d,0x18,0x76,0x65,0x72,0x73,0x74,0x72,0x75,0x63,0x6b,0x2d, -0x13,0x69,0x67,0x68,0x74,0x2f,0x11,0x6f,0x70,0x30,0x12,0x61,0x6e,0x64,2,0x62, -0x32,0x6c,0x62,0x72,0x13,0x69,0x67,0x68,0x74,0x3b,0x14,0x6f,0x74,0x74,0x6f,0x6d, -0x32,0x12,0x61,0x6e,0x64,1,0x6c,0x2e,0x72,0x13,0x69,0x67,0x68,0x74,0x35,0x12, -0x65,0x66,0x74,0x3f,0x12,0x65,0x66,0x74,0x36,0x17,0x61,0x6e,0x64,0x72,0x69,0x67, -0x68,0x74,0x39,0x62,0x2c,0x6c,0x5c,0x6e,0x10,0x61,0x21,0x14,0x6f,0x74,0x74,0x6f, +0xa2,0x98,0x16,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,0xa3,0x98,0x10,0x6e,1,0x64, +0x32,0x75,0xa2,0xcd,0x12,0x77,0x61,0x72,0xa3,0xcd,0xa2,0x71,0x14,0x61,0x6e,0x65, +0x73,0x65,0xa3,0x71,0x61,0x5c,0x67,0xa2,0x43,0x68,1,0x61,0x2a,0x72,0x10,0x64, +0xa3,0x97,2,0x72,0x28,0x76,0x30,0x77,0x87,0x12,0x61,0x64,0x61,0xa3,0x97,0x12, +0x69,0x61,0x6e,0x87,2,0x6d,0x40,0x72,0x58,0x75,0x10,0x72,0xa2,0x6f,0x15,0x61, +0x73,0x68,0x74,0x72,0x61,0xa3,0x6f,1,0x61,0x26,0x72,0xa3,0x7e,0x14,0x72,0x69, +0x74,0x61,0x6e,0xa3,0x7e,1,0x61,0xa3,0x5e,0x62,0xa3,0x85,0x11,0x6e,0x77,0xa3, +0x70,0x11,0x61,0x61,1,0x63,0x2f,0x69,0x23,3,0x65,0x3e,0x6a,0x48,0x6f,0x4e, +0x75,0x10,0x6e,1,0x69,0x24,0x72,0x61,0x10,0x63,0x61,0x13,0x6a,0x61,0x6e,0x67, +0xa3,0x6e,0x11,0x6e,0x67,0xa3,0x6e,1,0x68,0x2a,0x72,0x10,0x6f,0xa3,0x5d,0x10, +0x67,0xa3,0xb6,0x6e,0xa2,0x83,0x6f,0xa4,1,0x70,5,0x6c,0x1e,0x6c,0x44,0x72, +0x4a,0x73,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3, +0x7b,0x11,0x72,0x64,0xa3,0x5c,0x11,0x74,0x69,0xa3,0x7d,0x61,0x7c,0x65,0xa2,0x54, +0x68,3,0x61,0x3e,0x6c,0x4e,0x6e,0x5e,0x6f,0x16,0x65,0x6e,0x69,0x63,0x69,0x61, +0x6e,0xa3,0x5b,0x10,0x67,0xa2,0x5a,0x12,0x73,0x70,0x61,0xa3,0x5a,2,0x69,0xa3, +0x7a,0x70,0xa3,0x7b,0x76,0xa3,0x7c,0x10,0x78,0xa3,0x5b,2,0x68,0x3e,0x6c,0x50, +0x75,0x10,0x63,0xa2,0xa5,0x14,0x69,0x6e,0x68,0x61,0x75,0xa3,0xa5,0x17,0x61,0x77, +0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0x4b,0x10,0x6d,0xa2,0x90,0x14,0x79,0x72,0x65, +0x6e,0x65,0xa3,0x90,0x11,0x72,0x6d,0xa3,0x59,6,0x6b,0x36,0x6b,0x56,0x73,0x6e, +0x75,0x74,0x79,0x11,0x69,0x61,0x1f,0x6b,0x65,0x6e,0x67,0x70,0x75,0x61,0x63,0x68, +0x75,0x65,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xba,1,0x67,0x2e,0x6f,0xa2,0x57,0x10, +0x6f,0xa3,0x57,0x10,0x62,0xa3,0x84,0x11,0x68,0x75,0xa3,0x96,0x12,0x73,0x68,0x75, +0xa3,0x96,0x61,0x42,0x62,0x9e,0x65,0x10,0x77,1,0x61,0xa3,0xaa,0x74,0x14,0x61, +0x69,0x6c,0x75,0x65,0x97,3,0x62,0x32,0x67,0x40,0x6e,0x56,0x72,0x10,0x62,0xa3, +0x8e,0x15,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0x8f,0x10,0x6d,0xa2,0xc7,0x15,0x75, +0x6e,0x64,0x61,0x72,0x69,0xa3,0xc7,0x10,0x64,0xa2,0xbb,0x16,0x69,0x6e,0x61,0x67, +0x61,0x72,0x69,0xa3,0xbb,0x11,0x61,0x74,0xa3,0x8f,5,0x72,0x32,0x72,0x30,0x73, +0x4e,0x75,0x11,0x67,0x72,0xa3,0xc2,2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f, +0x11,0x79,0x61,0x5f,0x10,0x68,0xa3,0x58,2,0x61,0x36,0x67,0x3c,0x6d,0x10,0x61, +0x84,0x12,0x6e,0x79,0x61,0x85,0x11,0x67,0x65,0xa3,0xab,0x10,0x65,0xa3,0xab,0x67, +0x30,0x6c,0x42,0x6e,0x11,0x61,0x6f,0xa3,0xcc,1,0x61,0x2a,0x68,0x11,0x61,0x6d, +0x5b,0x10,0x6d,0x5b,2,0x63,0x32,0x64,0x46,0x6f,0x12,0x6e,0x61,0x6c,0xa3,0xcc, +1,0x68,0x26,0x6b,0xa3,0x6d,0x12,0x69,0x6b,0x69,0xa3,0x6d,6,0x70,0x41,0x70, +0x3a,0x73,0x58,0x74,0x86,0x75,0x14,0x79,0x67,0x68,0x75,0x72,0xa3,0xc2,0x11,0x65, +0x72,1,0x6d,0x2c,0x73,0x12,0x69,0x61,0x6e,0x9b,0x11,0x69,0x63,0xa3,0x59,0x10, +0x6f,1,0x67,0x3a,0x75,0x18,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3, +0x85,0x13,0x64,0x69,0x61,0x6e,0xa3,0xb8,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,0x58, +0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61, +0x6e,0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e,0xa3,0x4c,0x14,0x74, +0x61,0x6c,0x69,0x63,0x5d,0x68,0xc3,0x30,0x6b,0xc2,0x3f,0x6b,0xa4,0x17,0x6c,0xa4, +0xcd,0x6d,8,0x6f,0x46,0x6f,0x48,0x72,0x74,0x74,0x80,0x75,0x86,0x79,1,0x61, +0x28,0x6d,0x10,0x72,0x59,0x13,0x6e,0x6d,0x61,0x72,0x59,2,0x64,0x2e,0x6e,0x32, +0x6f,0x10,0x6e,0xa3,0x72,0x10,0x69,0xa3,0xa3,0x10,0x67,0x56,0x14,0x6f,0x6c,0x69, +0x61,0x6e,0x57,0x10,0x6f,0xa2,0x95,0x10,0x6f,0xa3,0x95,0x11,0x65,0x69,0xa3,0x73, +0x11,0x6c,0x74,0xa2,0xa4,0x12,0x61,0x6e,0x69,0xa3,0xa4,0x61,0x36,0x65,0xa2,0x67, +0x69,0xa2,0xbd,0x6c,0x11,0x79,0x6d,0x55,6,0x6e,0x38,0x6e,0x32,0x72,0x5c,0x73, +0x6c,0x79,0x10,0x61,0xa3,0x55,1,0x64,0x38,0x69,0xa2,0x79,0x15,0x63,0x68,0x61, +0x65,0x61,0x6e,0xa3,0x79,0xa2,0x54,0x12,0x61,0x69,0x63,0xa3,0x54,0x10,0x63,0xa2, +0xa9,0x12,0x68,0x65,0x6e,0xa3,0xa9,0x18,0x61,0x72,0x61,0x6d,0x67,0x6f,0x6e,0x64, +0x69,0xa3,0xaf,0x68,0x36,0x6b,0x4c,0x6c,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x55, +1,0x61,0x26,0x6a,0xa3,0xa0,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xa0,0x10,0x61,0xa2, +0xb4,0x12,0x73,0x61,0x72,0xa3,0xb4,3,0x64,0x78,0x65,0x94,0x6e,0xa2,0x42,0x72, +1,0x63,0xa3,0x8d,0x6f,0xa2,0x56,0x13,0x69,0x74,0x69,0x63,1,0x63,0x3c,0x68, +0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x56,0x15,0x75,0x72, +0x73,0x69,0x76,0x65,0xa3,0x8d,1,0x65,0x26,0x66,0xa3,0xb5,0x16,0x66,0x61,0x69, +0x64,0x72,0x69,0x6e,0xa3,0xb5,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b,0xa3, +0x73,0x10,0x64,0xa2,0x8c,0x17,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0x8c, +0x11,0x61,0x6f,0xa3,0x5c,7,0x6f,0x1b,0x6f,0x34,0x70,0x3a,0x72,0x40,0x74,0x11, +0x68,0x69,0xa3,0x78,0x11,0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3,0x8a,0x11,0x61, +0x69,0xa3,0xcb,0x61,0x36,0x68,0xa2,0x46,0x69,0xa2,0x83,0x6e,0x11,0x64,0x61,0x4b, +5,0x74,0x23,0x74,0x34,0x77,0x56,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0x4f,0x14, +0x61,0x6b,0x61,0x6e,0x61,0x4c,0x19,0x6f,0x72,0x68,0x69,0x72,0x61,0x67,0x61,0x6e, +0x61,0x8d,0x10,0x69,0xa3,0xc6,0x69,0x38,0x6c,0x40,0x6e,1,0x61,0x4d,0x6e,0x12, +0x61,0x64,0x61,0x4b,0x12,0x74,0x68,0x69,0xa3,0x78,0x10,0x69,0xa3,0x4f,4,0x61, +0x40,0x69,0x52,0x6d,0x70,0x6f,0x7c,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3, +0x91,0x10,0x72,0x92,0x15,0x6f,0x73,0x68,0x74,0x68,0x69,0x93,0x1d,0x74,0x61,0x6e, +0x73,0x6d,0x61,0x6c,0x6c,0x73,0x63,0x72,0x69,0x70,0x74,0xa3,0xbf,1,0x65,0x24, +0x72,0x4f,0x10,0x72,0x4f,0x10,0x6a,0xa2,0x9d,0x11,0x6b,0x69,0xa3,0x9d,1,0x72, +0x2a,0x74,0x10,0x73,0xa3,0xbf,0x14,0x61,0x74,0x72,0x61,0x69,0xa3,0xcb,4,0x61, +0x5c,0x65,0x90,0x69,0xa0,0x6f,0xa2,0x5d,0x79,1,0x63,0x34,0x64,0x10,0x69,0xa2, +0x6c,0x11,0x61,0x6e,0xa3,0x6c,0x10,0x69,0xa2,0x6b,0x11,0x61,0x6e,0xa3,0x6b,2, +0x6e,0x42,0x6f,0x46,0x74,3,0x66,0xa3,0x50,0x67,0xa3,0x51,0x69,0x24,0x6e,0x53, +0x10,0x6e,0x53,0x10,0x61,0xa3,0x6a,0x50,0x10,0x6f,0x51,0x11,0x70,0x63,0xa2,0x52, +0x11,0x68,0x61,0xa3,0x52,2,0x6d,0x2e,0x6e,0x36,0x73,0x10,0x75,0xa3,0x83,0x10, +0x62,0x80,0x10,0x75,0x81,2,0x61,0xa3,0x53,0x62,0x83,0x65,0x11,0x61,0x72,1, +0x61,0xa3,0x53,0x62,0x83,0x11,0x6d,0x61,0xa3,0x8b,0x68,0x6e,0x69,0xa2,0x9d,0x6a, +2,0x61,0x30,0x70,0x52,0x75,0x11,0x72,0x63,0xa3,0x94,1,0x6d,0x38,0x76,0x10, +0x61,0xa2,0x4e,0x13,0x6e,0x65,0x73,0x65,0xa3,0x4e,0x10,0x6f,0xa3,0xad,0x11,0x61, +0x6e,0xa3,0x69,7,0x6d,0x1e,0x6d,0x34,0x6e,0x42,0x72,0x48,0x75,0x11,0x6e,0x67, +0xa3,0x4c,0x10,0x6e,1,0x67,0xa3,0x4b,0x70,0xa3,0xba,0x11,0x74,0x6c,0xa3,0xd4, +0x11,0x6b,0x74,0x8d,0x61,0x38,0x65,0xa2,0x41,0x69,0xa2,0x46,0x6c,0x11,0x75,0x77, +0xa3,0x9c,1,0x6e,0x34,0x74,0x10,0x72,0xa2,0xa2,0x11,0x61,0x6e,0xa3,0xa2,0x42, +6,0x6f,0xe,0x6f,0x77,0x73,0xa3,0x49,0x74,0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f, +0x77,0x62,0xa3,0xac,0x67,0x3e,0x69,0x42,0x19,0x66,0x69,0x72,0x6f,0x68,0x69,0x6e, +0x67,0x79,0x61,0xa3,0xb6,0x44,0x11,0x75,0x6c,0x45,0x11,0x62,0x72,0x46,0x11,0x65, +0x77,0x47,0x11,0x72,0x61,0x48,0x13,0x67,0x61,0x6e,0x61,0x49,2,0x6d,0x2e,0x6e, +0x4a,0x74,0x11,0x61,0x6c,0x5d,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61, +0x6d,0x61,0x69,0x63,0xa3,0x74,2,0x64,0x66,0x68,0x6a,0x73,0x1b,0x63,0x72,0x69, +0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,0x74,0x68, +0x69,0x61,0x6e,0xa3,0x7d,0x13,0x6c,0x61,0x76,0x69,0xa3,0x7a,0x10,0x73,0xa3,0x4d, +0x15,0x65,0x72,0x69,0x74,0x65,0x64,0x23,0x64,0xc1,0x28,0x64,0xa2,0x95,0x65,0xa2, +0xdc,0x67,5,0x6f,0x66,0x6f,0x98,0x72,0xa2,0x4b,0x75,3,0x6a,0x54,0x6b,0x66, +0x6e,0x6a,0x72,1,0x6d,0x38,0x75,0x40,0x16,0x6e,0x67,0x6b,0x68,0x65,0x6d,0x61, +0xa3,0xca,0x13,0x75,0x6b,0x68,0x69,0x41,1,0x61,0x24,0x72,0x3f,0x13,0x72,0x61, +0x74,0x69,0x3f,0x10,0x68,0xa3,0xca,0x18,0x6a,0x61,0x6c,0x61,0x67,0x6f,0x6e,0x64, +0x69,0xa3,0xb3,1,0x6e,0x30,0x74,0x10,0x68,0x3a,0x11,0x69,0x63,0x3b,1,0x67, +0xa3,0xb3,0x6d,0xa3,0xaf,1,0x61,0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b, +0x3d,0x10,0x6e,0xa2,0x89,0x12,0x74,0x68,0x61,0xa3,0x89,0x61,0x3e,0x65,0x4c,0x6c, +0x11,0x61,0x67,0x90,0x15,0x6f,0x6c,0x69,0x74,0x69,0x63,0x91,0x11,0x72,0x61,0xa2, +0xc9,0x10,0x79,0xa3,0xc9,0x10,0x6f,1,0x6b,0xa3,0x48,0x72,0x38,0x13,0x67,0x69, +0x61,0x6e,0x39,4,0x65,0x46,0x69,0x6c,0x6f,0x8c,0x73,0x9a,0x75,0x11,0x70,0x6c, +0xa2,0x87,0x13,0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,0x38,0x76,0x10,0x61,0x34, +0x15,0x6e,0x61,0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,0x65,0x74,0x33,1,0x61, +0x36,0x76,0x16,0x65,0x73,0x61,0x6b,0x75,0x72,0x75,0xa3,0xbe,0x10,0x6b,0xa3,0xbe, +0x11,0x67,0x72,0xa2,0xb2,0x10,0x61,0xa3,0xb2,0x11,0x72,0x74,0x33,2,0x67,0x3a, +0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63,0x37,0x10,0x79,2, +0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69,0x61,0x6e,0x68,0x69, +0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,1,0x62,0x36,0x79,0x10, +0x6d,0xa2,0xb9,0x12,0x61,0x69,0x63,0xa3,0xb9,0x10,0x61,0xa2,0x88,0x12,0x73,0x61, +0x6e,0xa3,0x88,0x61,0xa2,0xc9,0x62,0xa4,0x32,0x63,6,0x6f,0x52,0x6f,0x76,0x70, +0x92,0x75,0xa2,0x41,0x79,1,0x70,0x3e,0x72,2,0x69,0x2a,0x6c,0x31,0x73,0xa3, +0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x10,0x72,1,0x69,0x34,0x6f,0x15,0x6d,0x69, +0x6e,0x6f,0x61,0x6e,0xa3,0xc1,0x11,0x6f,0x74,0x7f,1,0x6d,0x30,0x70,0x10,0x74, +0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d,0x6f,0x6e,0x21,1,0x6d,0x28,0x72,0x10,0x74, +0x7f,0x10,0x6e,0xa3,0xc1,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3,0x65,0x61, +0x32,0x68,0xa2,0x41,0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e,0x50,0x72, +0x76,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61, +0x6e,0xa3,0x9f,0x10,0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64,0x69,0x61, +0x6e,0x61,0x62,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69,0xa2,0x68, +0x11,0x61,0x6e,0xa3,0x68,3,0x61,0x32,0x65,0x44,0x6f,0x52,0x72,0x10,0x73,0xa3, +0xbd,1,0x6b,0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,0x10,0x72,0x2c,0x13, +0x6f,0x6b,0x65,0x65,0x2d,0x16,0x72,0x61,0x73,0x6d,0x69,0x61,0x6e,0xa3,0xbd,6, +0x68,0x4e,0x68,0x48,0x6e,0x4e,0x72,0x76,0x76,1,0x65,0x2a,0x73,0x10,0x74,0xa3, +0x75,0x13,0x73,0x74,0x61,0x6e,0xa3,0x75,0x11,0x6f,0x6d,0xa3,0xa1,0x11,0x61,0x74, +0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68, +0x73,0xa3,0x9c,1,0x61,0x3e,0x6d,2,0x65,0x2a,0x69,0xa3,0x74,0x6e,0x27,0x13, +0x6e,0x69,0x61,0x6e,0x27,1,0x62,0x26,0x6e,0xa3,0xc8,0x24,0x11,0x69,0x63,0x25, +0x64,0x30,0x66,0x44,0x67,0x11,0x68,0x62,0xa3,0x9f,0x10,0x6c,1,0x61,0x26,0x6d, +0xa3,0xa7,0x10,0x6d,0xa3,0xa7,0x11,0x61,0x6b,0xa3,0x93,6,0x6c,0x3c,0x6c,0x52, +0x6f,0x56,0x72,0x66,0x75,1,0x67,0x30,0x68,1,0x64,0x79,0x69,0x10,0x64,0x79, +0x10,0x69,0x8e,0x13,0x6e,0x65,0x73,0x65,0x8f,0x11,0x69,0x73,0xa1,0x11,0x70,0x6f, +0x2a,0x13,0x6d,0x6f,0x66,0x6f,0x2b,0x10,0x61,1,0x68,0x2e,0x69,0x7c,0x12,0x6c, +0x6c,0x65,0x7d,0xa2,0x41,0x11,0x6d,0x69,0xa3,0x41,0x61,0x48,0x65,0x9c,0x68,1, +0x61,0x2a,0x6b,0x10,0x73,0xa3,0xa8,0x15,0x69,0x6b,0x73,0x75,0x6b,0x69,0xa3,0xa8, +3,0x6c,0x3a,0x6d,0x48,0x73,0x54,0x74,1,0x61,0x24,0x6b,0x9f,0x10,0x6b,0x9f, +0x10,0x69,0x9c,0x13,0x6e,0x65,0x73,0x65,0x9d,0x10,0x75,0xa2,0x82,0x10,0x6d,0xa3, +0x82,0x10,0x73,0xa2,0x86,0x13,0x61,0x76,0x61,0x68,0xa3,0x86,1,0x6e,0x3c,0x72, +1,0x66,0xa3,0xd0,0x69,0x14,0x61,0x65,0x72,0x66,0x65,0xa3,0xd0,0x10,0x67,0x28, +0x12,0x61,0x6c,0x69,0x29,3,0x6c,0x42,0x6e,0x90,0x74,0xa2,0x46,0x76,0x24,0x17, +0x6f,0x77,0x65,0x6c,0x6a,0x61,0x6d,0x6f,0x25,0x22,1,0x65,0x54,0x76,0x28,1, +0x73,0x38,0x74,0x2a,0x17,0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x2b,0x16,0x79, +0x6c,0x6c,0x61,0x62,0x6c,0x65,0x29,0x18,0x61,0x64,0x69,0x6e,0x67,0x6a,0x61,0x6d, +0x6f,0x23,1,0x61,0x21,0x6f,0x1a,0x74,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62, +0x6c,0x65,0x21,0x26,0x1a,0x72,0x61,0x69,0x6c,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f, +0x27,1,0x6e,0x2c,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,1,0x6e, +0x2c,0x79,0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a, +0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f, +0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79, +0x62,0x65,0x25,0x20,0x10,0x6f,0x21,0xb,0x72,0x39,0x76,0xc,0x76,0x33,0x78,0x2a, +0x7a,0x11,0x77,0x6a,0x43,0x10,0x78,0x21,0x72,0x28,0x73,0x50,0x74,0x31,1,0x65, +0x24,0x69,0x39,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61, +0x74,0x6f,0x72,0x39,1,0x6d,0x35,0x70,0x18,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61, +0x72,0x6b,0x35,0x6c,0x1f,0x6c,0x3c,0x6f,0x4a,0x70,1,0x70,0x37,0x72,0x14,0x65, +0x70,0x65,0x6e,0x64,0x37,0x28,1,0x66,0x2b,0x76,0x2c,0x10,0x74,0x2f,0x13,0x74, +0x68,0x65,0x72,0x21,0x63,0x4c,0x65,0x64,0x67,1,0x61,0x3a,0x6c,0x19,0x75,0x65, +0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x41,0x10,0x7a,0x41,2,0x6e,0x23,0x6f, +0x24,0x72,0x25,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x23,2,0x62,0x34,0x6d,0x4e,0x78, +0x26,0x13,0x74,0x65,0x6e,0x64,0x27,0x3a,1,0x61,0x24,0x67,0x3d,0x11,0x73,0x65, +0x3a,0x12,0x67,0x61,0x7a,0x3d,0x3e,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x3f, +9,0x6e,0x4a,0x6e,0x34,0x6f,0x44,0x73,0x60,0x75,0x94,0x78,0x10,0x78,0x21,0x10, +0x75,0x2a,0x14,0x6d,0x65,0x72,0x69,0x63,0x2b,1,0x6c,0x2c,0x74,0x12,0x68,0x65, +0x72,0x21,0x14,0x65,0x74,0x74,0x65,0x72,0x2d,3,0x63,0x36,0x65,0x46,0x70,0x31, +0x74,0x32,0x12,0x65,0x72,0x6d,0x33,0x3c,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65, +0x3d,0x2e,0x10,0x70,0x2f,0x10,0x70,0x34,0x12,0x70,0x65,0x72,0x35,0x61,0x46,0x63, +0x52,0x65,0x64,0x66,0x72,0x6c,2,0x65,0x2d,0x66,0x3b,0x6f,0x28,0x12,0x77,0x65, +0x72,0x29,0x10,0x74,0x22,0x12,0x65,0x72,0x6d,0x23,1,0x6c,0x24,0x72,0x37,0x24, +0x12,0x6f,0x73,0x65,0x25,0x10,0x78,0x38,0x13,0x74,0x65,0x6e,0x64,0x39,0x10,0x6f, +0x26,0x13,0x72,0x6d,0x61,0x74,0x27,0,0x10,0x6c,0x88,0x72,0x40,0x72,0x36,0x73, +0x5e,0x77,0x7a,0x78,0x8a,0x7a,0x11,0x77,0x6a,0x4b,1,0x65,0x24,0x69,0x3b,0x1e, +0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x3b, +1,0x69,0x24,0x71,0x3f,0x18,0x6e,0x67,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65,0x3f, +0x17,0x73,0x65,0x67,0x73,0x70,0x61,0x63,0x65,0x4d,0x10,0x78,0x21,0x6c,0x36,0x6d, +0x3c,0x6e,0x76,0x6f,0x13,0x74,0x68,0x65,0x72,0x21,1,0x65,0x23,0x66,0x35,3, +0x62,0x37,0x69,0x28,0x6c,0x29,0x6e,0x2b,0x10,0x64,1,0x6c,0x34,0x6e,0x11,0x75, +0x6d,0x2a,0x12,0x6c,0x65,0x74,0x37,0x14,0x65,0x74,0x74,0x65,0x72,0x29,2,0x65, +0x36,0x6c,0x39,0x75,0x2c,0x14,0x6d,0x65,0x72,0x69,0x63,0x2d,0x14,0x77,0x6c,0x69, +0x6e,0x65,0x39,0x66,0x3f,0x66,0x40,0x67,0x4e,0x68,0x70,0x6b,0x10,0x61,0x26,0x15, +0x74,0x61,0x6b,0x61,0x6e,0x61,0x27,0x10,0x6f,0x24,0x13,0x72,0x6d,0x61,0x74,0x25, +1,0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x49, +0x10,0x7a,0x49,1,0x65,0x24,0x6c,0x3d,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74, +0x74,0x65,0x72,0x3d,0x61,0x86,0x63,0x92,0x64,0x94,0x65,2,0x62,0x44,0x6d,0x5e, +0x78,0x2e,0x13,0x74,0x65,0x6e,0x64,0x32,0x15,0x6e,0x75,0x6d,0x6c,0x65,0x74,0x2f, +0x42,1,0x61,0x24,0x67,0x45,0x11,0x73,0x65,0x42,0x12,0x67,0x61,0x7a,0x45,0x46, +0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x47,0x15,0x6c,0x65,0x74,0x74,0x65,0x72, +0x23,0x10,0x72,0x31,1,0x6f,0x24,0x71,0x41,0x18,0x75,0x62,0x6c,0x65,0x71,0x75, +0x6f,0x74,0x65,0x41,2,0x63,0x32,0x6e,0x3c,0x6f,0x22,0x12,0x70,0x65,0x6e,0x23, +0x24,0x13,0x6c,0x6f,0x73,0x65,0x25,0x20,0x12,0x6f,0x6e,0x65,0x21,6,0x6f,0x65, +0x6f,0x4a,0x72,0x5c,0x74,0x64,0x76,0x1d,0x69,0x73,0x75,0x61,0x6c,0x6f,0x72,0x64, +0x65,0x72,0x6c,0x65,0x66,0x74,0x3d,0x18,0x76,0x65,0x72,0x73,0x74,0x72,0x75,0x63, +0x6b,0x2d,0x13,0x69,0x67,0x68,0x74,0x2f,0x11,0x6f,0x70,0x30,0x12,0x61,0x6e,0x64, +2,0x62,0x32,0x6c,0x62,0x72,0x13,0x69,0x67,0x68,0x74,0x3b,0x14,0x6f,0x74,0x74, +0x6f,0x6d,0x32,0x12,0x61,0x6e,0x64,1,0x6c,0x2e,0x72,0x13,0x69,0x67,0x68,0x74, +0x35,0x12,0x65,0x66,0x74,0x3f,0x12,0x65,0x66,0x74,0x36,0x17,0x61,0x6e,0x64,0x72, +0x69,0x67,0x68,0x74,0x39,0x62,0x48,0x6c,0x78,0x6e,1,0x61,0x21,0x6f,0x1a,0x74, +0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x21,0x14,0x6f,0x74,0x74,0x6f, 0x6d,0x22,0x12,0x61,0x6e,0x64,1,0x6c,0x2e,0x72,0x13,0x69,0x67,0x68,0x74,0x27, 0x12,0x65,0x66,0x74,0x25,0x12,0x65,0x66,0x74,0x28,0x17,0x61,0x6e,0x64,0x72,0x69, -0x67,0x68,0x74,0x2b,0xd,0x6e,0xaa,0x72,0x70,0x72,0x92,0x73,0xa2,0x46,0x74,0xa2, -0x54,0x76,1,0x69,0x60,0x6f,0x12,0x77,0x65,0x6c,0x62,1,0x64,0x3a,0x69,0x19, +0x67,0x68,0x74,0x2b,0xd,0x6e,0xbd,0x72,0x83,0x72,0x92,0x73,0xa2,0x59,0x74,0xa2, +0x67,0x76,1,0x69,0x60,0x6f,0x12,0x77,0x65,0x6c,0x62,1,0x64,0x3a,0x69,0x19, 0x6e,0x64,0x65,0x70,0x65,0x6e,0x64,0x65,0x6e,0x74,0x67,0x17,0x65,0x70,0x65,0x6e, 0x64,0x65,0x6e,0x74,0x65,1,0x72,0x2e,0x73,0x13,0x61,0x72,0x67,0x61,0x61,0x12, -0x61,0x6d,0x61,0x5f,0x1d,0x65,0x67,0x69,0x73,0x74,0x65,0x72,0x73,0x68,0x69,0x66, -0x74,0x65,0x72,0x57,0x1e,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x6d,0x6f,0x64,0x69, -0x66,0x69,0x65,0x72,0x59,0x12,0x6f,0x6e,0x65,1,0x6c,0x2c,0x6d,0x12,0x61,0x72, -0x6b,0x5d,0x14,0x65,0x74,0x74,0x65,0x72,0x5b,0x6e,0x3c,0x6f,0x7c,0x70,0x18,0x75, -0x72,0x65,0x6b,0x69,0x6c,0x6c,0x65,0x72,0x55,1,0x6f,0x4c,0x75,1,0x6b,0x3c, -0x6d,0x12,0x62,0x65,0x72,0x50,0x15,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x53,0x11,0x74, -0x61,0x4f,0x16,0x6e,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x4d,0x13,0x74,0x68,0x65,0x72, -0x21,0x67,0x3e,0x67,0x4a,0x69,0x64,0x6a,0x82,0x6d,0x1d,0x6f,0x64,0x69,0x66,0x79, -0x69,0x6e,0x67,0x6c,0x65,0x74,0x74,0x65,0x72,0x4b,0x1c,0x65,0x6d,0x69,0x6e,0x61, -0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x45,0x1e,0x6e,0x76,0x69,0x73,0x69,0x62, -0x6c,0x65,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x47,0x14,0x6f,0x69,0x6e,0x65,0x72, -0x49,0x61,0xa2,0xba,0x62,0xa2,0xc0,0x63,1,0x61,0xa2,0xa2,0x6f,0x16,0x6e,0x73, -0x6f,0x6e,0x61,0x6e,0x74,0x2a,8,0x6b,0x67,0x6b,0x48,0x6d,0x52,0x70,0x5c,0x73, -0xa2,0x42,0x77,0x19,0x69,0x74,0x68,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x43,0x14, -0x69,0x6c,0x6c,0x65,0x72,0x35,0x14,0x65,0x64,0x69,0x61,0x6c,0x37,1,0x6c,0x52, -0x72,0x10,0x65,1,0x63,0x2e,0x66,0x13,0x69,0x78,0x65,0x64,0x3d,0x19,0x65,0x64, -0x69,0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x3b,0x18,0x61,0x63,0x65,0x68,0x6f,0x6c, -0x64,0x65,0x72,0x39,0x10,0x75,1,0x62,0x3e,0x63,0x1b,0x63,0x65,0x65,0x64,0x69, -0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x41,0x15,0x6a,0x6f,0x69,0x6e,0x65,0x64,0x3f, -0x64,0x4c,0x66,0x52,0x68,0x5a,0x69,0x1e,0x6e,0x69,0x74,0x69,0x61,0x6c,0x70,0x6f, -0x73,0x74,0x66,0x69,0x78,0x65,0x64,0x33,0x12,0x65,0x61,0x64,0x2d,0x13,0x69,0x6e, -0x61,0x6c,0x2f,0x18,0x65,0x61,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x31,0x1d,0x6e, -0x74,0x69,0x6c,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x29,0x16,0x76, -0x61,0x67,0x72,0x61,0x68,0x61,0x23,1,0x69,0x4a,0x72,0x10,0x61,0x1f,0x68,0x6d, -0x69,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x6e,0x75,0x6d,0x62,0x65,0x72,0x27,0x12, -0x6e,0x64,0x75,0x25,2,0x72,0x38,0x74,0x46,0x75,0x26,0x15,0x70,0x72,0x69,0x67, -0x68,0x74,0x27,0x20,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x21,1,0x72,0x24,0x75, -0x25,0x22,0x18,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x65,0x64,1,0x72,0x32,0x75, -0x15,0x70,0x72,0x69,0x67,0x68,0x74,0x25,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x23, -0xd,0x6e,0xc1,0x86,0x73,0xa8,0x73,0x4c,0x74,0xa2,0x76,0x75,0xa2,0x83,0x7a,0xd8, -0x70,0,2,0x6c,0xd9,0x20,0,0x70,0xd9,0x40,0,0x73,0xc3,0,0xfe,0xf, -0,0,0,7,0x6f,0x3c,0x6f,0xff,8,0,0,0,0x70,0x3a,0x75,0x6e, -0x79,0x13,0x6d,0x62,0x6f,0x6c,0xff,0xf,0,0,0,0x11,0x61,0x63,1,0x65, -0x34,0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0,0x18,0x73,0x65,0x70,0x61, -0x72,0x61,0x74,0x6f,0x72,0xc3,0,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0xe1, -0,0,0x63,0xff,2,0,0,0,0x65,0x38,0x6b,0xff,4,0,0,0, -0x6d,0xff,1,0,0,0,0x16,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x70, -0,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72, -0x31,1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74, -0x74,0x65,0x72,0x25,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x23,0x6e,0xa2, -0x69,0x6f,0xa2,0x89,0x70,0xfe,0x30,0xf8,0,0,9,0x69,0x33,0x69,0xff,0x10, -0,0,0,0x6f,0xfd,0x80,0,0,0x72,0x54,0x73,0xf9,0,0,0x75,0x12, -0x6e,0x63,0x74,0xfe,0x30,0xf8,0,0,0x15,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff, -0x30,0xf8,0,0,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xdd,0,0, -0x61,0x48,0x63,0xfd,0x40,0,0,0x64,0xe9,0,0,0x65,0xfd,0x20,0,0, -0x66,0xff,0x20,0,0,0,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65, -0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x40,0,0xbe,0,3,0x64,0xa7,0, -0x6c,0xab,0,0x6f,0x30,0x75,0x13,0x6d,0x62,0x65,0x72,0xbf,0,0xb2,0,0x1b, -0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa1,1,0x70,0x92, -0x74,0x12,0x68,0x65,0x72,0xe6,0x80,1,3,0x6c,0x40,0x6e,0x4a,0x70,0x56,0x73, -0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,8,0,0,0,0x14,0x65,0x74,0x74,0x65, -0x72,0x61,0x14,0x75,0x6d,0x62,0x65,0x72,0xb3,0,0x19,0x75,0x6e,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0xfd,0x80,0,0,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63, -0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xf9,0,0,0x66,0xc0,0xc4,0x66,0xa2,0x47, -0x69,0xa2,0x64,0x6c,0xa2,0x79,0x6d,0xa4,0xc0,4,0x61,0x6c,0x63,0xa5,0,0x65, -0xa3,0x80,0x6e,0xa1,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x38,0x73, -0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,4,0,0,0,0x14,0x65,0x74,0x74,0x65, -0x72,0x41,1,0x72,0x3c,0x74,0x16,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,1, -0,0,0,0x10,0x6b,0xa5,0xc0,1,0x69,0x32,0x6f,0x13,0x72,0x6d,0x61,0x74, -0xdb,0,0,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, -0x6f,0x6e,0xff,0x20,0,0,0,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70, -0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x10,0,0,0,0x9c, -7,0x6d,0x18,0x6d,0x41,0x6f,0x28,0x74,0x31,0x75,0x25,0x60,0x1c,0x77,0x65,0x72, -0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x29,0x63,0x3d,0x65,0x28,0x69, -0x42,0x6c,0x29,0x13,0x74,0x74,0x65,0x72,0x9c,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72, -0xab,0,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x20, -0,0x63,0x46,0x64,0xa2,0x96,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67, -0x6d,0x61,0x72,0x6b,0xa3,0x80,0xe6,0x80,1,7,0x6e,0x57,0x6e,0x52,0x6f,0x5e, -0x73,0xe1,0,0,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62, -0x6f,0x6c,0xff,2,0,0,0,0x22,0x12,0x74,0x72,0x6c,0xd9,0x80,0,0xdc, -0,0,1,0x6d,0x62,0x6e,1,0x6e,0x30,0x74,0x12,0x72,0x6f,0x6c,0xd9,0x80, -0,0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, -0x6f,0x6e,0xfd,0x40,0,0,0x19,0x62,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72, -0x6b,0xa5,0xc0,0x61,0x58,0x63,0xd9,0x80,0,0x66,0xdb,0,0,0x6c,0x1d,0x6f, -0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x20,0, -0,0x18,0x73,0x65,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,2,0x61,0x32,0x65, -0x50,0x69,0x12,0x67,0x69,0x74,0xa7,0,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74, -0x75,0x61,0x74,0x69,0x6f,0x6e,0xe9,0,0,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e, -0x75,0x6d,0x62,0x65,0x72,0xa7,0 +0x61,0x6d,0x61,0x5f,0x10,0x65,1,0x67,0x40,0x6f,0x1c,0x72,0x64,0x65,0x72,0x69, +0x6e,0x67,0x6b,0x69,0x6c,0x6c,0x65,0x72,0x69,0x1b,0x69,0x73,0x74,0x65,0x72,0x73, +0x68,0x69,0x66,0x74,0x65,0x72,0x57,0x1e,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x6d, +0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x59,0x12,0x6f,0x6e,0x65,1,0x6c,0x2c,0x6d, +0x12,0x61,0x72,0x6b,0x5d,0x14,0x65,0x74,0x74,0x65,0x72,0x5b,0x6e,0x3c,0x6f,0x7c, +0x70,0x18,0x75,0x72,0x65,0x6b,0x69,0x6c,0x6c,0x65,0x72,0x55,1,0x6f,0x4c,0x75, +1,0x6b,0x3c,0x6d,0x12,0x62,0x65,0x72,0x50,0x15,0x6a,0x6f,0x69,0x6e,0x65,0x72, +0x53,0x11,0x74,0x61,0x4f,0x16,0x6e,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x4d,0x13,0x74, +0x68,0x65,0x72,0x21,0x67,0x3e,0x67,0x4a,0x69,0x64,0x6a,0x82,0x6d,0x1d,0x6f,0x64, +0x69,0x66,0x79,0x69,0x6e,0x67,0x6c,0x65,0x74,0x74,0x65,0x72,0x4b,0x1c,0x65,0x6d, +0x69,0x6e,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b,0x45,0x1e,0x6e,0x76,0x69, +0x73,0x69,0x62,0x6c,0x65,0x73,0x74,0x61,0x63,0x6b,0x65,0x72,0x47,0x14,0x6f,0x69, +0x6e,0x65,0x72,0x49,0x61,0xa2,0xba,0x62,0xa2,0xc0,0x63,1,0x61,0xa2,0xa2,0x6f, +0x16,0x6e,0x73,0x6f,0x6e,0x61,0x6e,0x74,0x2a,8,0x6b,0x67,0x6b,0x48,0x6d,0x52, +0x70,0x5c,0x73,0xa2,0x42,0x77,0x19,0x69,0x74,0x68,0x73,0x74,0x61,0x63,0x6b,0x65, +0x72,0x43,0x14,0x69,0x6c,0x6c,0x65,0x72,0x35,0x14,0x65,0x64,0x69,0x61,0x6c,0x37, +1,0x6c,0x52,0x72,0x10,0x65,1,0x63,0x2e,0x66,0x13,0x69,0x78,0x65,0x64,0x3d, +0x19,0x65,0x64,0x69,0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x3b,0x18,0x61,0x63,0x65, +0x68,0x6f,0x6c,0x64,0x65,0x72,0x39,0x10,0x75,1,0x62,0x3e,0x63,0x1b,0x63,0x65, +0x65,0x64,0x69,0x6e,0x67,0x72,0x65,0x70,0x68,0x61,0x41,0x15,0x6a,0x6f,0x69,0x6e, +0x65,0x64,0x3f,0x64,0x4c,0x66,0x52,0x68,0x5a,0x69,0x1e,0x6e,0x69,0x74,0x69,0x61, +0x6c,0x70,0x6f,0x73,0x74,0x66,0x69,0x78,0x65,0x64,0x33,0x12,0x65,0x61,0x64,0x2d, +0x13,0x69,0x6e,0x61,0x6c,0x2f,0x18,0x65,0x61,0x64,0x6c,0x65,0x74,0x74,0x65,0x72, +0x31,0x1d,0x6e,0x74,0x69,0x6c,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61,0x72,0x6b, +0x29,0x16,0x76,0x61,0x67,0x72,0x61,0x68,0x61,0x23,1,0x69,0x4a,0x72,0x10,0x61, +0x1f,0x68,0x6d,0x69,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x27,0x12,0x6e,0x64,0x75,0x25,2,0x72,0x38,0x74,0x46,0x75,0x26,0x15,0x70, +0x72,0x69,0x67,0x68,0x74,0x27,0x20,0x15,0x6f,0x74,0x61,0x74,0x65,0x64,0x21,1, +0x72,0x24,0x75,0x25,0x22,0x18,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x65,0x64,1, +0x72,0x32,0x75,0x15,0x70,0x72,0x69,0x67,0x68,0x74,0x25,0x15,0x6f,0x74,0x61,0x74, +0x65,0x64,0x23,1,0x61,0x38,0x72,0x18,0x65,0x73,0x74,0x72,0x69,0x63,0x74,0x65, +0x64,0x21,0x15,0x6c,0x6c,0x6f,0x77,0x65,0x64,0x23,3,0x63,0x34,0x65,0x44,0x6c, +0x4e,0x6e,0x12,0x6f,0x6e,0x65,0x21,0x17,0x6f,0x6e,0x73,0x6f,0x6e,0x61,0x6e,0x74, +0x23,0x14,0x78,0x74,0x65,0x6e,0x64,0x25,0x14,0x69,0x6e,0x6b,0x65,0x72,0x27,0xd, +0x6e,0xc1,0x86,0x73,0xa8,0x73,0x4c,0x74,0xa2,0x76,0x75,0xa2,0x83,0x7a,0xd8,0x70, +0,2,0x6c,0xd9,0x20,0,0x70,0xd9,0x40,0,0x73,0xc3,0,0xfe,0xf,0, +0,0,7,0x6f,0x3c,0x6f,0xff,8,0,0,0,0x70,0x3a,0x75,0x6e,0x79, +0x13,0x6d,0x62,0x6f,0x6c,0xff,0xf,0,0,0,0x11,0x61,0x63,1,0x65,0x34, +0x69,0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0,0x18,0x73,0x65,0x70,0x61,0x72, +0x61,0x74,0x6f,0x72,0xc3,0,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0xe1,0, +0,0x63,0xff,2,0,0,0,0x65,0x38,0x6b,0xff,4,0,0,0,0x6d, +0xff,1,0,0,0,0x16,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x70,0, +0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x31, +1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74, +0x65,0x72,0x25,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x23,0x6e,0xa2,0x69, +0x6f,0xa2,0x89,0x70,0xfe,0x30,0xf8,0,0,9,0x69,0x33,0x69,0xff,0x10,0, +0,0,0x6f,0xfd,0x80,0,0,0x72,0x54,0x73,0xf9,0,0,0x75,0x12,0x6e, +0x63,0x74,0xfe,0x30,0xf8,0,0,0x15,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x30, +0xf8,0,0,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xdd,0,0,0x61, +0x48,0x63,0xfd,0x40,0,0,0x64,0xe9,0,0,0x65,0xfd,0x20,0,0,0x66, +0xff,0x20,0,0,0,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70, +0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x40,0,0xbe,0,3,0x64,0xa7,0,0x6c, +0xab,0,0x6f,0x30,0x75,0x13,0x6d,0x62,0x65,0x72,0xbf,0,0xb2,0,0x1b,0x6e, +0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa1,1,0x70,0x92,0x74, +0x12,0x68,0x65,0x72,0xe6,0x80,1,3,0x6c,0x40,0x6e,0x4a,0x70,0x56,0x73,0x14, +0x79,0x6d,0x62,0x6f,0x6c,0xff,8,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72, +0x61,0x14,0x75,0x6d,0x62,0x65,0x72,0xb3,0,0x19,0x75,0x6e,0x63,0x74,0x75,0x61, +0x74,0x69,0x6f,0x6e,0xfd,0x80,0,0,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74, +0x75,0x61,0x74,0x69,0x6f,0x6e,0xf9,0,0,0x66,0xc0,0xc4,0x66,0xa2,0x47,0x69, +0xa2,0x64,0x6c,0xa2,0x79,0x6d,0xa4,0xc0,4,0x61,0x6c,0x63,0xa5,0,0x65,0xa3, +0x80,0x6e,0xa1,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x38,0x73,0x14, +0x79,0x6d,0x62,0x6f,0x6c,0xff,4,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72, +0x41,1,0x72,0x3c,0x74,0x16,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,1,0, +0,0,0x10,0x6b,0xa5,0xc0,1,0x69,0x32,0x6f,0x13,0x72,0x6d,0x61,0x74,0xdb, +0,0,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0xff,0x20,0,0,0,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75, +0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x10,0,0,0,0x9c,7, +0x6d,0x18,0x6d,0x41,0x6f,0x28,0x74,0x31,0x75,0x25,0x60,0x1c,0x77,0x65,0x72,0x63, +0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x29,0x63,0x3d,0x65,0x28,0x69,0x42, +0x6c,0x29,0x13,0x74,0x74,0x65,0x72,0x9c,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0xab, +0,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x20,0, +0x63,0x46,0x64,0xa2,0x96,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d, +0x61,0x72,0x6b,0xa3,0x80,0xe6,0x80,1,7,0x6e,0x57,0x6e,0x52,0x6f,0x5e,0x73, +0xe1,0,0,0x75,0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f, +0x6c,0xff,2,0,0,0,0x22,0x12,0x74,0x72,0x6c,0xd9,0x80,0,0xdc,0, +0,1,0x6d,0x62,0x6e,1,0x6e,0x30,0x74,0x12,0x72,0x6f,0x6c,0xd9,0x80,0, +0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0xfd,0x40,0,0,0x19,0x62,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b, +0xa5,0xc0,0x61,0x58,0x63,0xd9,0x80,0,0x66,0xdb,0,0,0x6c,0x1d,0x6f,0x73, +0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x20,0,0, +0x18,0x73,0x65,0x64,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,2,0x61,0x32,0x65,0x50, +0x69,0x12,0x67,0x69,0x74,0xa7,0,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75, +0x61,0x74,0x69,0x6f,0x6e,0xe9,0,0,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75, +0x6d,0x62,0x65,0x72,0xa7,0,8,0x6e,0x50,0x6e,0x46,0x6f,0x7a,0x72,0x88,0x74, +0x9c,0x75,0x19,0x6e,0x63,0x6f,0x6d,0x6d,0x6f,0x6e,0x75,0x73,0x65,0x31,0x11,0x6f, +0x74,2,0x63,0x2e,0x6e,0x3e,0x78,0x11,0x69,0x64,0x29,0x17,0x68,0x61,0x72,0x61, +0x63,0x74,0x65,0x72,0x21,0x12,0x66,0x6b,0x63,0x27,0x16,0x62,0x73,0x6f,0x6c,0x65, +0x74,0x65,0x2d,0x19,0x65,0x63,0x6f,0x6d,0x6d,0x65,0x6e,0x64,0x65,0x64,0x37,0x17, +0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x2f,0x64,0x40,0x65,0x78,0x69,0x88,0x6c, +0x18,0x69,0x6d,0x69,0x74,0x65,0x64,0x75,0x73,0x65,0x33,0x10,0x65,1,0x66,0x34, +0x70,0x16,0x72,0x65,0x63,0x61,0x74,0x65,0x64,0x23,0x1c,0x61,0x75,0x6c,0x74,0x69, +0x67,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x25,0x17,0x78,0x63,0x6c,0x75,0x73,0x69, +0x6f,0x6e,0x2b,0x17,0x6e,0x63,0x6c,0x75,0x73,0x69,0x6f,0x6e,0x35 }; -const char PropNameData::nameGroups[23338]={ +const char PropNameData::nameGroups[24665]={ 2,'A','l','p','h','a',0,'A','l','p','h','a','b','e','t','i','c',0, 4,'N',0,'N','o',0,'F',0,'F','a','l','s','e',0,4,'Y',0,'Y','e','s',0,'T',0,'T','r','u','e',0, 2,'N','R',0,'N','o','t','_','R','e','o','r','d','e','r','e','d',0, @@ -1188,6 +1241,7 @@ const char PropNameData::nameGroups[23338]={ 2,'I','D','_','C','o','m','p','a','t','_','M','a','t','h','_','S','t','a','r','t',0,'I','D','_','C','o','m','p','a','t','_', 'M','a','t','h','_','S','t','a','r','t',0,2,'I','D','_','C','o','m','p','a','t','_','M','a','t','h','_','C','o','n','t','i', 'n','u','e',0,'I','D','_','C','o','m','p','a','t','_','M','a','t','h','_','C','o','n','t','i','n','u','e',0, +2,'M','C','M',0,'M','o','d','i','f','i','e','r','_','C','o','m','b','i','n','i','n','g','_','M','a','r','k',0, 2,'b','c',0,'B','i','d','i','_','C','l','a','s','s',0,2,'L',0,'L','e','f','t','_','T','o','_','R','i','g','h','t',0, 2,'R',0,'R','i','g','h','t','_','T','o','_','L','e','f','t',0, 2,'E','N',0,'E','u','r','o','p','e','a','n','_','N','u','m','b','e','r',0, @@ -1582,6 +1636,27 @@ const char PropNameData::nameGroups[23338]={ 2,'K','a','w','i',0,'K','a','w','i',0,2,'N','a','g','_','M','u','n','d','a','r','i',0, 'N','a','g','_','M','u','n','d','a','r','i',0,2,'C','J','K','_','E','x','t','_','I',0,'C','J','K','_','U','n','i','f','i', 'e','d','_','I','d','e','o','g','r','a','p','h','s','_','E','x','t','e','n','s','i','o','n','_','I',0, +2,'E','g','y','p','t','i','a','n','_','H','i','e','r','o','g','l','y','p','h','s','_','E','x','t','_','A',0, +'E','g','y','p','t','i','a','n','_','H','i','e','r','o','g','l','y','p','h','s','_','E','x','t','e','n','d','e','d','_','A',0, +2,'G','a','r','a','y',0,'G','a','r','a','y',0,2,'G','u','r','u','n','g','_','K','h','e','m','a',0, +'G','u','r','u','n','g','_','K','h','e','m','a',0,2,'K','i','r','a','t','_','R','a','i',0, +'K','i','r','a','t','_','R','a','i',0,2,'M','y','a','n','m','a','r','_','E','x','t','_','C',0, +'M','y','a','n','m','a','r','_','E','x','t','e','n','d','e','d','_','C',0, +2,'O','l','_','O','n','a','l',0,'O','l','_','O','n','a','l',0, +2,'S','u','n','u','w','a','r',0,'S','u','n','u','w','a','r',0, +2,'S','y','m','b','o','l','s','_','F','o','r','_','L','e','g','a','c','y','_','C','o','m','p','u','t','i','n','g','_','S','u', +'p',0,'S','y','m','b','o','l','s','_','F','o','r','_','L','e','g','a','c','y','_','C','o','m','p','u','t','i','n','g','_','S', +'u','p','p','l','e','m','e','n','t',0,2,'T','o','d','h','r','i',0,'T','o','d','h','r','i',0, +2,'T','u','l','u','_','T','i','g','a','l','a','r','i',0,'T','u','l','u','_','T','i','g','a','l','a','r','i',0, +2,'B','e','r','i','a','_','E','r','f','e',0,'B','e','r','i','a','_','E','r','f','e',0, +2,'C','J','K','_','E','x','t','_','J',0,'C','J','K','_','U','n','i','f','i','e','d','_','I','d','e','o','g','r','a','p','h', +'s','_','E','x','t','e','n','s','i','o','n','_','J',0,2,'M','i','s','c','_','S','y','m','b','o','l','s','_','S','u','p',0, +'M','i','s','c','e','l','l','a','n','e','o','u','s','_','S','y','m','b','o','l','s','_','S','u','p','p','l','e','m','e','n','t', +0,2,'S','h','a','r','a','d','a','_','S','u','p',0,'S','h','a','r','a','d','a','_','S','u','p','p','l','e','m','e','n','t', +0,2,'S','i','d','e','t','i','c',0,'S','i','d','e','t','i','c',0, +2,'T','a','i','_','Y','o',0,'T','a','i','_','Y','o',0,2,'T','a','n','g','u','t','_','C','o','m','p','o','n','e','n','t', +'s','_','S','u','p',0,'T','a','n','g','u','t','_','C','o','m','p','o','n','e','n','t','s','_','S','u','p','p','l','e','m','e', +'n','t',0,2,'T','o','l','o','n','g','_','S','i','k','i',0,'T','o','l','o','n','g','_','S','i','k','i',0, 2,'c','c','c',0,'C','a','n','o','n','i','c','a','l','_','C','o','m','b','i','n','i','n','g','_','C','l','a','s','s',0, 2,'d','t',0,'D','e','c','o','m','p','o','s','i','t','i','o','n','_','T','y','p','e',0, 3,'N','o','n','e',0,'N','o','n','e',0,'n','o','n','e',0, @@ -1640,8 +1715,9 @@ const char PropNameData::nameGroups[23338]={ 2,'E',0,'E',0,2,'F','e','h',0,'F','e','h',0,2,'F','i','n','a','l','_','S','e','m','k','a','t','h',0, 'F','i','n','a','l','_','S','e','m','k','a','t','h',0,2,'G','a','f',0,'G','a','f',0, 2,'G','a','m','a','l',0,'G','a','m','a','l',0,2,'H','a','h',0,'H','a','h',0, -2,'T','e','h','_','M','a','r','b','u','t','a','_','G','o','a','l',0,'H','a','m','z','a','_','O','n','_','H','e','h','_','G', -'o','a','l',0,2,'H','e',0,'H','e',0,2,'H','e','h',0,'H','e','h',0, +3,'T','e','h','_','M','a','r','b','u','t','a','_','G','o','a','l',0,'T','e','h','_','M','a','r','b','u','t','a','_','G','o', +'a','l',0,'H','a','m','z','a','_','O','n','_','H','e','h','_','G','o','a','l',0, +2,'H','e',0,'H','e',0,2,'H','e','h',0,'H','e','h',0, 2,'H','e','h','_','G','o','a','l',0,'H','e','h','_','G','o','a','l',0, 2,'H','e','t','h',0,'H','e','t','h',0,2,'K','a','f',0,'K','a','f',0, 2,'K','a','p','h',0,'K','a','p','h',0,2,'K','n','o','t','t','e','d','_','H','e','h',0, @@ -1719,6 +1795,8 @@ const char PropNameData::nameGroups[23338]={ 2,'H','a','n','i','f','i','_','R','o','h','i','n','g','y','a','_','P','a',0,'H','a','n','i','f','i','_','R','o','h','i','n', 'g','y','a','_','P','a',0,2,'T','h','i','n','_','Y','e','h',0,'T','h','i','n','_','Y','e','h',0, 2,'V','e','r','t','i','c','a','l','_','T','a','i','l',0,'V','e','r','t','i','c','a','l','_','T','a','i','l',0, +2,'K','a','s','h','m','i','r','i','_','Y','e','h',0,'K','a','s','h','m','i','r','i','_','Y','e','h',0, +2,'T','h','i','n','_','N','o','o','n',0,'T','h','i','n','_','N','o','o','n',0, 2,'j','t',0,'J','o','i','n','i','n','g','_','T','y','p','e',0, 2,'U',0,'N','o','n','_','J','o','i','n','i','n','g',0,2,'C',0,'J','o','i','n','_','C','a','u','s','i','n','g',0, 2,'D',0,'D','u','a','l','_','J','o','i','n','i','n','g',0, @@ -1757,7 +1835,8 @@ const char PropNameData::nameGroups[23338]={ 2,'A','P',0,'A','k','s','a','r','a','_','P','r','e','b','a','s','e',0, 2,'A','S',0,'A','k','s','a','r','a','_','S','t','a','r','t',0, 2,'V','F',0,'V','i','r','a','m','a','_','F','i','n','a','l',0, -2,'V','I',0,'V','i','r','a','m','a',0,2,'n','t',0,'N','u','m','e','r','i','c','_','T','y','p','e',0, +2,'V','I',0,'V','i','r','a','m','a',0,2,'H','H',0,'U','n','a','m','b','i','g','u','o','u','s','_','H','y','p','h','e', +'n',0,2,'n','t',0,'N','u','m','e','r','i','c','_','T','y','p','e',0, 2,'N','o','n','e',0,'N','o','n','e',0,2,'D','e',0,'D','e','c','i','m','a','l',0, 2,'D','i',0,'D','i','g','i','t',0,2,'N','u',0,'N','u','m','e','r','i','c',0, 2,'s','c',0,'S','c','r','i','p','t',0,2,'Z','y','y','y',0,'C','o','m','m','o','n',0, @@ -1878,8 +1957,16 @@ const char PropNameData::nameGroups[23338]={ 2,'O','u','g','r',0,'O','l','d','_','U','y','g','h','u','r',0, 2,'T','n','s','a',0,'T','a','n','g','s','a',0,2,'V','i','t','h',0,'V','i','t','h','k','u','q','i',0, 2,'N','a','g','m',0,'N','a','g','_','M','u','n','d','a','r','i',0, -2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b','l','e','_','T','y','p','e',0, -2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0, +2,'A','r','a','n',0,'A','r','a','n',0,2,'G','a','r','a',0,'G','a','r','a','y',0, +2,'G','u','k','h',0,'G','u','r','u','n','g','_','K','h','e','m','a',0, +2,'K','r','a','i',0,'K','i','r','a','t','_','R','a','i',0, +2,'O','n','a','o',0,'O','l','_','O','n','a','l',0,2,'S','u','n','u',0,'S','u','n','u','w','a','r',0, +2,'T','o','d','r',0,'T','o','d','h','r','i',0,2,'T','u','t','g',0,'T','u','l','u','_','T','i','g','a','l','a','r','i', +0,2,'B','e','r','f',0,'B','e','r','i','a','_','E','r','f','e',0, +2,'S','i','d','t',0,'S','i','d','e','t','i','c',0,2,'T','a','y','o',0,'T','a','i','_','Y','o',0, +2,'T','o','l','s',0,'T','o','l','o','n','g','_','S','i','k','i',0, +2,'H','n','t','l',0,'H','n','t','l',0,2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b','l','e','_', +'T','y','p','e',0,2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0, 2,'L',0,'L','e','a','d','i','n','g','_','J','a','m','o',0, 2,'V',0,'V','o','w','e','l','_','J','a','m','o',0,2,'T',0,'T','r','a','i','l','i','n','g','_','J','a','m','o',0, 2,'L','V',0,'L','V','_','S','y','l','l','a','b','l','e',0, @@ -1914,11 +2001,10 @@ const char PropNameData::nameGroups[23338]={ 2,'b','p','t',0,'B','i','d','i','_','P','a','i','r','e','d','_','B','r','a','c','k','e','t','_','T','y','p','e',0, 2,'n',0,'N','o','n','e',0,2,'o',0,'O','p','e','n',0, 2,'c',0,'C','l','o','s','e',0,2,'I','n','P','C',0,'I','n','d','i','c','_','P','o','s','i','t','i','o','n','a','l','_', -'C','a','t','e','g','o','r','y',0,2,'N','A',0,'N','A',0, -2,'B','o','t','t','o','m',0,'B','o','t','t','o','m',0,2,'B','o','t','t','o','m','_','A','n','d','_','L','e','f','t',0, -'B','o','t','t','o','m','_','A','n','d','_','L','e','f','t',0, -2,'B','o','t','t','o','m','_','A','n','d','_','R','i','g','h','t',0,'B','o','t','t','o','m','_','A','n','d','_','R','i','g', -'h','t',0,2,'L','e','f','t',0,'L','e','f','t',0,2,'L','e','f','t','_','A','n','d','_','R','i','g','h','t',0, +'C','a','t','e','g','o','r','y',0,2,'B','o','t','t','o','m',0,'B','o','t','t','o','m',0, +2,'B','o','t','t','o','m','_','A','n','d','_','L','e','f','t',0,'B','o','t','t','o','m','_','A','n','d','_','L','e','f','t', +0,2,'B','o','t','t','o','m','_','A','n','d','_','R','i','g','h','t',0,'B','o','t','t','o','m','_','A','n','d','_','R','i', +'g','h','t',0,2,'L','e','f','t',0,'L','e','f','t',0,2,'L','e','f','t','_','A','n','d','_','R','i','g','h','t',0, 'L','e','f','t','_','A','n','d','_','R','i','g','h','t',0,2,'O','v','e','r','s','t','r','u','c','k',0, 'O','v','e','r','s','t','r','u','c','k',0,2,'R','i','g','h','t',0,'R','i','g','h','t',0, 2,'T','o','p',0,'T','o','p',0,2,'T','o','p','_','A','n','d','_','B','o','t','t','o','m',0, @@ -1972,12 +2058,18 @@ const char PropNameData::nameGroups[23338]={ 'V','i','s','a','r','g','a',0,2,'V','o','w','e','l',0,'V','o','w','e','l',0, 2,'V','o','w','e','l','_','D','e','p','e','n','d','e','n','t',0,'V','o','w','e','l','_','D','e','p','e','n','d','e','n','t', 0,2,'V','o','w','e','l','_','I','n','d','e','p','e','n','d','e','n','t',0,'V','o','w','e','l','_','I','n','d','e','p','e', -'n','d','e','n','t',0,2,'v','o',0,'V','e','r','t','i','c','a','l','_','O','r','i','e','n','t','a','t','i','o','n',0, +'n','d','e','n','t',0,2,'R','e','o','r','d','e','r','i','n','g','_','K','i','l','l','e','r',0, +'R','e','o','r','d','e','r','i','n','g','_','K','i','l','l','e','r',0, +2,'v','o',0,'V','e','r','t','i','c','a','l','_','O','r','i','e','n','t','a','t','i','o','n',0, 2,'R',0,'R','o','t','a','t','e','d',0,2,'T','r',0,'T','r','a','n','s','f','o','r','m','e','d','_','R','o','t','a','t', 'e','d',0,2,'T','u',0,'T','r','a','n','s','f','o','r','m','e','d','_','U','p','r','i','g','h','t',0, -2,'U',0,'U','p','r','i','g','h','t',0,2,'g','c','m',0,'G','e','n','e','r','a','l','_','C','a','t','e','g','o','r','y', -'_','M','a','s','k',0,2,'C',0,'O','t','h','e','r',0,2,'L',0,'L','e','t','t','e','r',0, -2,'L','C',0,'C','a','s','e','d','_','L','e','t','t','e','r',0, +2,'U',0,'U','p','r','i','g','h','t',0,2,'I','D','_','S','t','a','t','u','s',0,'I','d','e','n','t','i','f','i','e','r', +'_','S','t','a','t','u','s',0,2,'R','e','s','t','r','i','c','t','e','d',0,'R','e','s','t','r','i','c','t','e','d',0, +2,'A','l','l','o','w','e','d',0,'A','l','l','o','w','e','d',0, +2,'I','n','C','B',0,'I','n','d','i','c','_','C','o','n','j','u','n','c','t','_','B','r','e','a','k',0, +2,'L','i','n','k','e','r',0,'L','i','n','k','e','r',0,2,'g','c','m',0,'G','e','n','e','r','a','l','_','C','a','t','e', +'g','o','r','y','_','M','a','s','k',0,2,'C',0,'O','t','h','e','r',0, +2,'L',0,'L','e','t','t','e','r',0,2,'L','C',0,'C','a','s','e','d','_','L','e','t','t','e','r',0, 3,'M',0,'M','a','r','k',0,'C','o','m','b','i','n','i','n','g','_','M','a','r','k',0, 2,'N',0,'N','u','m','b','e','r',0,3,'P',0,'P','u','n','c','t','u','a','t','i','o','n',0, 'p','u','n','c','t',0,2,'S',0,'S','y','m','b','o','l',0, @@ -1994,7 +2086,20 @@ const char PropNameData::nameGroups[23338]={ 2,'n','a','1',0,'U','n','i','c','o','d','e','_','1','_','N','a','m','e',0, 2,'u','c',0,'U','p','p','e','r','c','a','s','e','_','M','a','p','p','i','n','g',0, 2,'b','p','b',0,'B','i','d','i','_','P','a','i','r','e','d','_','B','r','a','c','k','e','t',0, -2,'s','c','x',0,'S','c','r','i','p','t','_','E','x','t','e','n','s','i','o','n','s',0 +2,'s','c','x',0,'S','c','r','i','p','t','_','E','x','t','e','n','s','i','o','n','s',0, +2,'I','D','_','T','y','p','e',0,'I','d','e','n','t','i','f','i','e','r','_','T','y','p','e',0, +2,'N','o','t','_','C','h','a','r','a','c','t','e','r',0,'N','o','t','_','C','h','a','r','a','c','t','e','r',0, +2,'D','e','p','r','e','c','a','t','e','d',0,'D','e','p','r','e','c','a','t','e','d',0, +2,'D','e','f','a','u','l','t','_','I','g','n','o','r','a','b','l','e',0,'D','e','f','a','u','l','t','_','I','g','n','o','r', +'a','b','l','e',0,2,'N','o','t','_','N','F','K','C',0,'N','o','t','_','N','F','K','C',0, +2,'N','o','t','_','X','I','D',0,'N','o','t','_','X','I','D',0, +2,'E','x','c','l','u','s','i','o','n',0,'E','x','c','l','u','s','i','o','n',0, +2,'O','b','s','o','l','e','t','e',0,'O','b','s','o','l','e','t','e',0, +2,'T','e','c','h','n','i','c','a','l',0,'T','e','c','h','n','i','c','a','l',0, +2,'U','n','c','o','m','m','o','n','_','U','s','e',0,'U','n','c','o','m','m','o','n','_','U','s','e',0, +2,'L','i','m','i','t','e','d','_','U','s','e',0,'L','i','m','i','t','e','d','_','U','s','e',0, +2,'I','n','c','l','u','s','i','o','n',0,'I','n','c','l','u','s','i','o','n',0, +2,'R','e','c','o','m','m','e','n','d','e','d',0,'R','e','c','o','m','m','e','n','d','e','d',0 }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/propsvec.cpp b/deps/icu-small/source/common/propsvec.cpp index 18cc3e8cd8e8c4..64997313f9e3ab 100644 --- a/deps/icu-small/source/common/propsvec.cpp +++ b/deps/icu-small/source/common/propsvec.cpp @@ -102,29 +102,29 @@ _findRow(UPropsVectors *pv, UChar32 rangeStart) { /* check the vicinity of the last-seen row (start searching with an unrolled loop) */ row=pv->v+prevRow*columns; - if(rangeStart>=(UChar32)row[0]) { - if(rangeStart<(UChar32)row[1]) { + if (rangeStart >= static_cast<UChar32>(row[0])) { + if (rangeStart < static_cast<UChar32>(row[1])) { /* same row as last seen */ return row; - } else if(rangeStart<(UChar32)(row+=columns)[1]) { + } else if (rangeStart < static_cast<UChar32>((row += columns)[1])) { /* next row after the last one */ pv->prevRow=prevRow+1; return row; - } else if(rangeStart<(UChar32)(row+=columns)[1]) { + } else if (rangeStart < static_cast<UChar32>((row += columns)[1])) { /* second row after the last one */ pv->prevRow=prevRow+2; return row; - } else if((rangeStart-(UChar32)row[1])<10) { + } else if ((rangeStart - static_cast<UChar32>(row[1])) < 10) { /* we are close, continue looping */ prevRow+=2; do { ++prevRow; row+=columns; - } while(rangeStart>=(UChar32)row[1]); + } while (rangeStart >= static_cast<UChar32>(row[1])); pv->prevRow=prevRow; return row; } - } else if(rangeStart<(UChar32)pv->v[1]) { + } else if (rangeStart < static_cast<UChar32>(pv->v[1])) { /* the very first row */ pv->prevRow=0; return pv->v; @@ -135,9 +135,9 @@ _findRow(UPropsVectors *pv, UChar32 rangeStart) { while(start<limit-1) { i=(start+limit)/2; row=pv->v+i*columns; - if(rangeStart<(UChar32)row[0]) { + if (rangeStart < static_cast<UChar32>(row[0])) { limit=i; - } else if(rangeStart<(UChar32)row[1]) { + } else if (rangeStart < static_cast<UChar32>(row[1])) { pv->prevRow=i; return row; } else { @@ -194,8 +194,8 @@ upvec_setValue(UPropsVectors *pv, * input range (only possible for the first and last rows) * and if their value differs from the input value. */ - splitFirstRow= (UBool)(start!=(UChar32)firstRow[0] && value!=(firstRow[column]&mask)); - splitLastRow= (UBool)(limit!=(UChar32)lastRow[1] && value!=(lastRow[column]&mask)); + splitFirstRow = start != static_cast<UChar32>(firstRow[0]) && value != (firstRow[column] & mask); + splitLastRow = limit != static_cast<UChar32>(lastRow[1]) && value != (lastRow[column] & mask); /* split first/last rows if necessary */ if(splitFirstRow || splitLastRow) { @@ -312,8 +312,8 @@ upvec_getRow(const UPropsVectors *pv, int32_t rowIndex, static int32_t U_CALLCONV upvec_compareRows(const void *context, const void *l, const void *r) { - const uint32_t *left=(const uint32_t *)l, *right=(const uint32_t *)r; - const UPropsVectors *pv=(const UPropsVectors *)context; + const uint32_t* left = static_cast<const uint32_t*>(l), *right = static_cast<const uint32_t*>(r); + const UPropsVectors* pv = static_cast<const UPropsVectors*>(context); int32_t i, count, columns; count=columns=pv->columns; /* includes start/limit columns */ diff --git a/deps/icu-small/source/common/punycode.cpp b/deps/icu-small/source/common/punycode.cpp index 7ebdebc1888a6e..1868a07a856a78 100644 --- a/deps/icu-small/source/common/punycode.cpp +++ b/deps/icu-small/source/common/punycode.cpp @@ -97,12 +97,12 @@ digitToBasic(int32_t digit, UBool uppercase) { /* 26..35 map to ASCII 0..9 */ if(digit<26) { if(uppercase) { - return (char)(_CAPITAL_A+digit); + return static_cast<char>(_CAPITAL_A + digit); } else { - return (char)(_SMALL_A+digit); + return static_cast<char>(_SMALL_A + digit); } } else { - return (char)((_ZERO_-26)+digit); + return static_cast<char>((_ZERO_ - 26) + digit); } } @@ -193,7 +193,7 @@ u_strToPunycode(const char16_t *src, int32_t srcLength, return 0; } - if(src==nullptr || srcLength<-1 || (dest==nullptr && destCapacity!=0)) { + if(src==nullptr || srcLength<-1 || destCapacity<0 || (dest==nullptr && destCapacity!=0)) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -353,10 +353,10 @@ u_strToPunycode(const char16_t *src, int32_t srcLength, } if(destLength<destCapacity) { - dest[destLength]=digitToBasic(q, (UBool)(cpBuffer[j]<0)); + dest[destLength] = digitToBasic(q, cpBuffer[j] < 0); } ++destLength; - bias=adaptBias(delta, handledCPCount+1, (UBool)(handledCPCount==basicLength)); + bias = adaptBias(delta, handledCPCount + 1, handledCPCount == basicLength); delta=0; ++handledCPCount; } @@ -421,7 +421,7 @@ u_strFromPunycode(const char16_t *src, int32_t srcLength, } if(j<destCapacity) { - dest[j]=(char16_t)b; + dest[j] = b; if(caseFlags!=nullptr) { caseFlags[j]=IS_BASIC_UPPERCASE(b); @@ -500,7 +500,7 @@ u_strFromPunycode(const char16_t *src, int32_t srcLength, * where needed instead of in for() loop tail. */ ++destCPCount; - bias=adaptBias(i-oldi, destCPCount, (UBool)(oldi==0)); + bias = adaptBias(i - oldi, destCPCount, oldi == 0); /* * i was supposed to wrap around from (incremented) destCPCount to 0, diff --git a/deps/icu-small/source/common/putil.cpp b/deps/icu-small/source/common/putil.cpp index ab25f3b996de4a..ea15fdff0b0c67 100644 --- a/deps/icu-small/source/common/putil.cpp +++ b/deps/icu-small/source/common/putil.cpp @@ -46,11 +46,6 @@ // First, the platform type. Need this for U_PLATFORM. #include "unicode/platform.h" -#if U_PLATFORM == U_PF_MINGW && defined __STRICT_ANSI__ -/* tzset isn't defined in strict ANSI on MinGW. */ -#undef __STRICT_ANSI__ -#endif - /* * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. */ @@ -81,7 +76,7 @@ #include <float.h> #ifndef U_COMMON_IMPLEMENTATION -#error U_COMMON_IMPLEMENTATION not set - must be set for all ICU source files in common/ - see https://unicode-org.github.io/icu/userguide/howtouseicu +#error U_COMMON_IMPLEMENTATION not set - must be set for all ICU source files in common/ - see https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html #endif @@ -180,8 +175,8 @@ typedef union { int64_t i64; /* This must be defined first in order to allow the initialization to work. This is a C89 feature. */ double d64; } BitPatternConversion; -static const BitPatternConversion gNan = { (int64_t) INT64_C(0x7FF8000000000000) }; -static const BitPatternConversion gInf = { (int64_t) INT64_C(0x7FF0000000000000) }; +static const BitPatternConversion gNan = {static_cast<int64_t>(INT64_C(0x7FF8000000000000))}; +static const BitPatternConversion gInf = {static_cast<int64_t>(INT64_C(0x7FF0000000000000))}; /*--------------------------------------------------------------------------- Platform utilities @@ -230,7 +225,7 @@ u_signBit(double d) { #if U_IS_BIG_ENDIAN hiByte = *(uint8_t *)&d; #else - hiByte = *(((uint8_t *)&d) + sizeof(double) - 1); + hiByte = *(reinterpret_cast<uint8_t*>(&d) + sizeof(double) - 1); #endif return (hiByte & 0x80) != 0; } @@ -347,7 +342,7 @@ uprv_isNaN(double number) BitPatternConversion convertedNumber; convertedNumber.d64 = number; /* Infinity is 0x7FF0000000000000U. Anything greater than that is a NaN */ - return (UBool)((convertedNumber.i64 & U_INT64_MAX) > gInf.i64); + return (convertedNumber.i64 & U_INT64_MAX) > gInf.i64; #elif U_PLATFORM == U_PF_OS390 uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, @@ -373,7 +368,7 @@ uprv_isInfinite(double number) BitPatternConversion convertedNumber; convertedNumber.d64 = number; /* Infinity is exactly 0x7FF0000000000000U. */ - return (UBool)((convertedNumber.i64 & U_INT64_MAX) == gInf.i64); + return (convertedNumber.i64 & U_INT64_MAX) == gInf.i64; #elif U_PLATFORM == U_PF_OS390 uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, sizeof(uint32_t)); @@ -394,7 +389,7 @@ U_CAPI UBool U_EXPORT2 uprv_isPositiveInfinity(double number) { #if IEEE_754 || U_PLATFORM == U_PF_OS390 - return (UBool)(number > 0 && uprv_isInfinite(number)); + return number > 0 && uprv_isInfinite(number); #else return uprv_isInfinite(number); #endif @@ -404,7 +399,7 @@ U_CAPI UBool U_EXPORT2 uprv_isNegativeInfinity(double number) { #if IEEE_754 || U_PLATFORM == U_PF_OS390 - return (UBool)(number < 0 && uprv_isInfinite(number)); + return number < 0 && uprv_isInfinite(number); #else uint32_t highBits = *(uint32_t*)u_topNBytesOfDouble(&number, @@ -749,11 +744,11 @@ static UBool isValidOlsonID(const char *id) { The timezone is sometimes set to "CST-7CDT", "CST6CDT5,J129,J131/19:30", "GRNLNDST3GRNLNDDT" or similar, so we cannot use it. The rest of the time it could be an Olson ID. George */ - return (UBool)(id[idx] == 0 + return id[idx] == 0 || uprv_strcmp(id, "PST8PDT") == 0 || uprv_strcmp(id, "MST7MDT") == 0 || uprv_strcmp(id, "CST6CDT") == 0 - || uprv_strcmp(id, "EST5EDT") == 0); + || uprv_strcmp(id, "EST5EDT") == 0; } /* On some Unix-like OS, 'posix' subdirectory in @@ -932,7 +927,7 @@ static UBool compareBinaryFiles(const char* defaultTZFileName, const char* TZFil */ if (tzInfo->defaultTZBuffer == nullptr) { rewind(tzInfo->defaultTZFilePtr); - tzInfo->defaultTZBuffer = (char*)uprv_malloc(sizeof(char) * tzInfo->defaultTZFileSize); + tzInfo->defaultTZBuffer = static_cast<char*>(uprv_malloc(sizeof(char) * tzInfo->defaultTZFileSize)); sizeFileRead = fread(tzInfo->defaultTZBuffer, 1, tzInfo->defaultTZFileSize, tzInfo->defaultTZFilePtr); } rewind(file); @@ -1498,7 +1493,6 @@ static void U_CALLCONV dataDirectoryInitFn() { } u_setDataDirectory(path); - return; } U_CAPI const char * U_EXPORT2 @@ -1622,7 +1616,7 @@ static const char *uprv_getPOSIXIDForCategory(int category) * of nullptr, will modify the libc behavior. */ posixID = setlocale(category, nullptr); - if ((posixID == 0) + if ((posixID == nullptr) || (uprv_strcmp("C", posixID) == 0) || (uprv_strcmp("POSIX", posixID) == 0)) { @@ -1636,16 +1630,16 @@ static const char *uprv_getPOSIXIDForCategory(int category) posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE"); if ((posixID == 0) || (posixID[0] == '\0')) { #else - if (posixID == 0) { + if (posixID == nullptr) { posixID = getenv(category == LC_MESSAGES ? "LC_MESSAGES" : "LC_CTYPE"); - if (posixID == 0) { + if (posixID == nullptr) { #endif posixID = getenv("LANG"); } } } } - if ((posixID==0) + if ((posixID == nullptr) || (uprv_strcmp("C", posixID) == 0) || (uprv_strcmp("POSIX", posixID) == 0)) { @@ -1665,7 +1659,7 @@ static const char *uprv_getPOSIXIDForCategory(int category) static const char *uprv_getPOSIXIDForDefaultLocale() { static const char* posixID = nullptr; - if (posixID == 0) { + if (posixID == nullptr) { posixID = uprv_getPOSIXIDForCategory(LC_MESSAGES); } return posixID; diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index 5b95a68418c428..8a8ff5008118df 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -90,6 +90,8 @@ typedef size_t uintptr_t; # define U_NL_LANGINFO_CODESET -1 #elif U_PLATFORM == U_PF_OS400 /* not defined */ +#elif U_PLATFORM == U_PF_HAIKU + /* not defined */ #else # define U_NL_LANGINFO_CODESET CODESET #endif @@ -103,6 +105,8 @@ typedef size_t uintptr_t; #endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ +#elif U_PLATFORM == U_PF_HAIKU + /* not defined */ #else # define U_TZSET tzset #endif @@ -141,6 +145,8 @@ typedef size_t uintptr_t; #endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ +#elif U_PLATFORM == U_PF_HAIKU + /* not defined, (well it is but a loop back to icu) */ #else # define U_TZNAME tzname #endif @@ -553,7 +559,7 @@ inline int32_t pinCapacity(T *dest, int32_t capacity) { if (maxInt < destInt) { // Less than 2GB to the end of the address space. // Pin to that to prevent address overflow. - maxInt = (uintptr_t)-1; + maxInt = static_cast<uintptr_t>(-1); } # endif diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index 599279fb72bb0d..069af21537113c 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -110,7 +110,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, status = U_ILLEGAL_ARGUMENT_ERROR; return; } - const RBBIDataHeader *data = (const RBBIDataHeader *)compiledRules; + const RBBIDataHeader* data = reinterpret_cast<const RBBIDataHeader*>(compiledRules); if (data->fLength > ruleLength) { status = U_ILLEGAL_ARGUMENT_ERROR; return; @@ -553,7 +553,7 @@ int32_t RuleBasedBreakIterator::first() { * @return The text's past-the-end offset. */ int32_t RuleBasedBreakIterator::last() { - int32_t endPos = (int32_t)utext_nativeLength(&fText); + int32_t endPos = static_cast<int32_t>(utext_nativeLength(&fText)); UBool endShouldBeBoundary = isBoundary(endPos); // Has side effect of setting iterator position. (void)endShouldBeBoundary; U_ASSERT(endShouldBeBoundary); @@ -625,7 +625,7 @@ int32_t RuleBasedBreakIterator::following(int32_t startPos) { // Move requested offset to a code point start. It might be on a trail surrogate, // or on a trail byte if the input is UTF-8. Or it may be beyond the end of the text. utext_setNativeIndex(&fText, startPos); - startPos = (int32_t)utext_getNativeIndex(&fText); + startPos = static_cast<int32_t>(utext_getNativeIndex(&fText)); UErrorCode status = U_ZERO_ERROR; fBreakCache->following(startPos, status); @@ -881,7 +881,7 @@ int32_t RuleBasedBreakIterator::handleNext() { if (accepting == ACCEPTING_UNCONDITIONAL) { // Match found, common case. if (mode != RBBI_START) { - result = (int32_t)UTEXT_GETNATIVEINDEX(&fText); + result = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText)); } fRuleStatusIndex = row->fTagsIdx; // Remember the break status (tag) values. } else if (accepting > ACCEPTING_UNCONDITIONAL) { @@ -905,7 +905,7 @@ int32_t RuleBasedBreakIterator::handleNext() { U_ASSERT(rule == 0 || rule > ACCEPTING_UNCONDITIONAL); U_ASSERT(rule == 0 || rule < fData->fForwardTable->fLookAheadResultsSize); if (rule > ACCEPTING_UNCONDITIONAL) { - int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(&fText); + int32_t pos = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText)); fLookAheadMatches[rule] = pos; } @@ -937,7 +937,7 @@ int32_t RuleBasedBreakIterator::handleNext() { if (result == initialPosition) { utext_setNativeIndex(&fText, initialPosition); utext_next32(&fText); - result = (int32_t)utext_getNativeIndex(&fText); + result = static_cast<int32_t>(utext_getNativeIndex(&fText)); fRuleStatusIndex = 0; } @@ -1027,7 +1027,7 @@ int32_t RuleBasedBreakIterator::handleSafePrevious(int32_t fromPosition) { } // The state machine is done. Check whether it found a match... - result = (int32_t)UTEXT_GETNATIVEINDEX(&fText); + result = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(&fText)); #ifdef RBBI_DEBUG if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); @@ -1091,7 +1091,7 @@ const uint8_t *RuleBasedBreakIterator::getBinaryRules(uint32_t &length) { length = 0; if (fData != nullptr) { - retPtr = (const uint8_t *)fData->fHeader; + retPtr = reinterpret_cast<const uint8_t*>(fData->fHeader); length = fData->fHeader->fLength; } return retPtr; @@ -1187,7 +1187,7 @@ getLanguageBreakEngineFromFactory(UChar32 c, const char* locale) int32_t i = gLanguageBreakFactories->size(); const LanguageBreakEngine *lbe = nullptr; while (--i >= 0) { - LanguageBreakFactory *factory = (LanguageBreakFactory *)(gLanguageBreakFactories->elementAt(i)); + LanguageBreakFactory* factory = static_cast<LanguageBreakFactory*>(gLanguageBreakFactories->elementAt(i)); lbe = factory->getEngineFor(c, locale); if (lbe != nullptr) { break; @@ -1212,14 +1212,14 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c, const char* locale) { fLanguageBreakEngines = new UStack(status); if (fLanguageBreakEngines == nullptr || U_FAILURE(status)) { delete fLanguageBreakEngines; - fLanguageBreakEngines = 0; + fLanguageBreakEngines = nullptr; return nullptr; } } int32_t i = fLanguageBreakEngines->size(); while (--i >= 0) { - lbe = (const LanguageBreakEngine *)(fLanguageBreakEngines->elementAt(i)); + lbe = static_cast<const LanguageBreakEngine*>(fLanguageBreakEngines->elementAt(i)); if (lbe->handles(c, locale)) { return lbe; } @@ -1252,7 +1252,7 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c, const char* locale) { U_ASSERT(!fLanguageBreakEngines->hasDeleter()); if (U_FAILURE(status)) { delete fUnhandledBreakEngine; - fUnhandledBreakEngine = 0; + fUnhandledBreakEngine = nullptr; return nullptr; } } diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp index f7a283f69e45b9..3ef030cb919588 100644 --- a/deps/icu-small/source/common/rbbi_cache.cpp +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -146,7 +146,7 @@ void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPo uint32_t dictStart = fBI->fData->fForwardTable->fDictCategoriesStart; while(U_SUCCESS(status)) { - while((current = (int32_t)UTEXT_GETNATIVEINDEX(text)) < rangeEnd + while ((current = static_cast<int32_t>(UTEXT_GETNATIVEINDEX(text))) < rangeEnd && (category < dictStart)) { utext_next32(text); // TODO: cleaner loop structure. c = utext_current32(text); @@ -221,7 +221,7 @@ void RuleBasedBreakIterator::BreakCache::reset(int32_t pos, int32_t ruleStatus) fTextIdx = pos; fBufIdx = 0; fBoundaries[0] = pos; - fStatuses[0] = (uint16_t)ruleStatus; + fStatuses[0] = static_cast<uint16_t>(ruleStatus); } @@ -246,7 +246,6 @@ void RuleBasedBreakIterator::BreakCache::following(int32_t startPos, UErrorCode fBI->fDone = false; next(); } - return; } @@ -265,7 +264,6 @@ void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode current(); } } - return; } @@ -277,7 +275,6 @@ void RuleBasedBreakIterator::BreakCache::nextOL() { fBI->fDone = !populateFollowing(); fBI->fPosition = fTextIdx; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; - return; } @@ -297,7 +294,6 @@ void RuleBasedBreakIterator::BreakCache::previous(UErrorCode &status) { fBI->fDone = (fBufIdx == initialBufIdx); fBI->fPosition = fTextIdx; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; - return; } diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index 49603b619345c6..edfa1bf0d85e93 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -104,10 +104,10 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fDontFreeData = false; if (data->fFTableLen != 0) { - fForwardTable = (RBBIStateTable *)((char *)data + fHeader->fFTable); + fForwardTable = reinterpret_cast<const RBBIStateTable*>(reinterpret_cast<const char*>(data) + fHeader->fFTable); } if (data->fRTableLen != 0) { - fReverseTable = (RBBIStateTable *)((char *)data + fHeader->fRTable); + fReverseTable = reinterpret_cast<const RBBIStateTable*>(reinterpret_cast<const char*>(data) + fHeader->fRTable); } fTrie = ucptrie_openFromBinary(UCPTRIE_TYPE_FAST, @@ -130,7 +130,7 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fRuleString = UnicodeString::fromUTF8(StringPiece(fRuleSource, fHeader->fRuleSourceLen)); U_ASSERT(data->fRuleSourceLen > 0); - fRuleStatusTable = (int32_t *)((char *)data + fHeader->fStatusTable); + fRuleStatusTable = reinterpret_cast<const int32_t*>(reinterpret_cast<const char*>(data) + fHeader->fStatusTable); fStatusMaxIdx = data->fStatusTableLen / sizeof(int32_t); fRefCount = 1; diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index c48de3d9357b34..75c1be504560f1 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -135,7 +135,7 @@ struct RBBIStateTable { uint32_t fNumStates; // Number of states. uint32_t fRowLen; // Length of a state table row, in bytes. uint32_t fDictCategoriesStart; // Char category number of the first dictionary - // char class, or the the largest category number + 1 + // char class, or the largest category number + 1 // if there are no dictionary categories. uint32_t fLookAheadResultsSize; // Size of run-time array required for holding // look-ahead results. Indexed by row.fLookAhead. diff --git a/deps/icu-small/source/common/rbbinode.cpp b/deps/icu-small/source/common/rbbinode.cpp index 7aa75d5ffb7501..849ee7180a22f1 100644 --- a/deps/icu-small/source/common/rbbinode.cpp +++ b/deps/icu-small/source/common/rbbinode.cpp @@ -47,7 +47,10 @@ static int gLastSerial = 0; // Constructor. Just set the fields to reasonable default values. // //------------------------------------------------------------------------- -RBBINode::RBBINode(NodeType t) : UMemory() { +RBBINode::RBBINode(NodeType t, UErrorCode& status) : UMemory() { + if (U_FAILURE(status)) { + return; + } #ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; #endif @@ -65,10 +68,13 @@ RBBINode::RBBINode(NodeType t) : UMemory() { fVal = 0; fPrecedence = precZero; - UErrorCode status = U_ZERO_ERROR; - fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere + fFirstPosSet = new UVector(status); fLastPosSet = new UVector(status); fFollowPos = new UVector(status); + if (U_SUCCESS(status) && + (fFirstPosSet == nullptr || fLastPosSet == nullptr || fFollowPos == nullptr)) { + status = U_MEMORY_ALLOCATION_ERROR; + } if (t==opCat) {fPrecedence = precOpCat;} else if (t==opOr) {fPrecedence = precOpOr;} else if (t==opStart) {fPrecedence = precStart;} @@ -77,7 +83,10 @@ RBBINode::RBBINode(NodeType t) : UMemory() { } -RBBINode::RBBINode(const RBBINode &other) : UMemory(other) { +RBBINode::RBBINode(const RBBINode &other, UErrorCode& status) : UMemory(other) { + if (U_FAILURE(status)) { + return; + } #ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; #endif @@ -94,10 +103,13 @@ RBBINode::RBBINode(const RBBINode &other) : UMemory(other) { fVal = other.fVal; fRuleRoot = false; fChainIn = other.fChainIn; - UErrorCode status = U_ZERO_ERROR; fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere fLastPosSet = new UVector(status); fFollowPos = new UVector(status); + if (U_SUCCESS(status) && + (fFirstPosSet == nullptr || fLastPosSet == nullptr || fFollowPos == nullptr)) { + status = U_MEMORY_ALLOCATION_ERROR; + } } @@ -123,19 +135,66 @@ RBBINode::~RBBINode() { break; default: - delete fLeftChild; + // Avoid using a recursive implementation because of stack overflow problems. + // See bug ICU-22584. + // delete fLeftChild; + NRDeleteNode(fLeftChild); fLeftChild = nullptr; - delete fRightChild; + // delete fRightChild; + NRDeleteNode(fRightChild); fRightChild = nullptr; } - delete fFirstPosSet; delete fLastPosSet; delete fFollowPos; - } +/** + * Non-recursive delete of a node + its children. Used from the node destructor + * instead of the more obvious recursive implementation to avoid problems with + * stack overflow with some perverse test rule data (from fuzzing). + */ +void RBBINode::NRDeleteNode(RBBINode *node) { + if (node == nullptr) { + return; + } + + RBBINode *stopNode = node->fParent; + RBBINode *nextNode = node; + while (nextNode != stopNode && nextNode != nullptr) { + RBBINode *currentNode = nextNode; + + if ((currentNode->fLeftChild == nullptr && currentNode->fRightChild == nullptr) || + currentNode->fType == varRef || // varRef and setRef nodes do not + currentNode->fType == setRef) { // own their children nodes. + // CurrentNode is effectively a leaf node; it's safe to go ahead and delete it. + nextNode = currentNode->fParent; + if (nextNode) { + if (nextNode->fLeftChild == currentNode) { + nextNode->fLeftChild = nullptr; + } else if (nextNode->fRightChild == currentNode) { + nextNode->fRightChild = nullptr; + } + } + delete currentNode; + } else if (currentNode->fLeftChild) { + nextNode = currentNode->fLeftChild; + if (nextNode->fParent == nullptr) { + nextNode->fParent = currentNode; + // fParent isn't always set; do it now if not. + } + U_ASSERT(nextNode->fParent == currentNode); + } else if (currentNode->fRightChild) { + nextNode = currentNode->fRightChild; + if (nextNode->fParent == nullptr) { + nextNode->fParent = currentNode; + // fParent isn't always set; do it now if not. + } + U_ASSERT(nextNode->fParent == currentNode); + } + } +} //------------------------------------------------------------------------- // @@ -146,27 +205,54 @@ RBBINode::~RBBINode() { // references in preparation for generating the DFA tables. // //------------------------------------------------------------------------- -RBBINode *RBBINode::cloneTree() { +constexpr int kRecursiveDepthLimit = 3500; +RBBINode *RBBINode::cloneTree(UErrorCode &status, int depth) { + if (U_FAILURE(status)) { + return nullptr; + } + // If the depth of the stack is too deep, we return U_INPUT_TOO_LONG_ERROR + // to avoid stack overflow crash. + if (depth > kRecursiveDepthLimit) { + status = U_INPUT_TOO_LONG_ERROR; + return nullptr; + } RBBINode *n; if (fType == RBBINode::varRef) { // If the current node is a variable reference, skip over it // and clone the definition of the variable instead. - n = fLeftChild->cloneTree(); + n = fLeftChild->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + return nullptr; + } } else if (fType == RBBINode::uset) { n = this; } else { - n = new RBBINode(*this); + n = new RBBINode(*this, status); + if (U_FAILURE(status)) { + delete n; + return nullptr; + } // Check for null pointer. - if (n != nullptr) { - if (fLeftChild != nullptr) { - n->fLeftChild = fLeftChild->cloneTree(); - n->fLeftChild->fParent = n; + if (n == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + if (fLeftChild != nullptr) { + n->fLeftChild = fLeftChild->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + delete n; + return nullptr; } - if (fRightChild != nullptr) { - n->fRightChild = fRightChild->cloneTree(); - n->fRightChild->fParent = n; + n->fLeftChild->fParent = n; + } + if (fRightChild != nullptr) { + n->fRightChild = fRightChild->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + delete n; + return nullptr; } + n->fRightChild->fParent = n; } } return n; @@ -192,23 +278,45 @@ RBBINode *RBBINode::cloneTree() { // nested references are handled by cloneTree(), not here. // //------------------------------------------------------------------------- -RBBINode *RBBINode::flattenVariables() { +RBBINode *RBBINode::flattenVariables(UErrorCode& status, int depth) { + if (U_FAILURE(status)) { + return this; + } + // If the depth of the stack is too deep, we return U_INPUT_TOO_LONG_ERROR + // to avoid stack overflow crash. + if (depth > kRecursiveDepthLimit) { + status = U_INPUT_TOO_LONG_ERROR; + return this; + } if (fType == varRef) { - RBBINode *retNode = fLeftChild->cloneTree(); - if (retNode != nullptr) { - retNode->fRuleRoot = this->fRuleRoot; - retNode->fChainIn = this->fChainIn; + RBBINode *retNode = fLeftChild->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + return this; } + retNode->fRuleRoot = this->fRuleRoot; + retNode->fChainIn = this->fChainIn; delete this; // TODO: undefined behavior. Fix. return retNode; } if (fLeftChild != nullptr) { - fLeftChild = fLeftChild->flattenVariables(); + fLeftChild = fLeftChild->flattenVariables(status, depth+1); + if (fLeftChild == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(status)) { + return this; + } fLeftChild->fParent = this; } if (fRightChild != nullptr) { - fRightChild = fRightChild->flattenVariables(); + fRightChild = fRightChild->flattenVariables(status, depth+1); + if (fRightChild == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(status)) { + return this; + } fRightChild->fParent = this; } return this; @@ -223,7 +331,16 @@ RBBINode *RBBINode::flattenVariables() { // the left child of the uset node. // //------------------------------------------------------------------------- -void RBBINode::flattenSets() { +void RBBINode::flattenSets(UErrorCode &status, int depth) { + if (U_FAILURE(status)) { + return; + } + // If the depth of the stack is too deep, we return U_INPUT_TOO_LONG_ERROR + // to avoid stack overflow crash. + if (depth > kRecursiveDepthLimit) { + status = U_INPUT_TOO_LONG_ERROR; + return; + } U_ASSERT(fType != setRef); if (fLeftChild != nullptr) { @@ -231,11 +348,15 @@ void RBBINode::flattenSets() { RBBINode *setRefNode = fLeftChild; RBBINode *usetNode = setRefNode->fLeftChild; RBBINode *replTree = usetNode->fLeftChild; - fLeftChild = replTree->cloneTree(); + fLeftChild = replTree->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + delete setRefNode; + return; + } fLeftChild->fParent = this; delete setRefNode; } else { - fLeftChild->flattenSets(); + fLeftChild->flattenSets(status, depth+1); } } @@ -244,11 +365,15 @@ void RBBINode::flattenSets() { RBBINode *setRefNode = fRightChild; RBBINode *usetNode = setRefNode->fLeftChild; RBBINode *replTree = usetNode->fLeftChild; - fRightChild = replTree->cloneTree(); + fRightChild = replTree->cloneTree(status, depth+1); + if (U_FAILURE(status)) { + delete setRefNode; + return; + } fRightChild->fParent = this; delete setRefNode; } else { - fRightChild->flattenSets(); + fRightChild->flattenSets(status, depth+1); } } } diff --git a/deps/icu-small/source/common/rbbinode.h b/deps/icu-small/source/common/rbbinode.h index 4ed84d4e073fad..8fbc9d1b588e05 100644 --- a/deps/icu-small/source/common/rbbinode.h +++ b/deps/icu-small/source/common/rbbinode.h @@ -91,13 +91,14 @@ class RBBINode : public UMemory { UVector *fFollowPos; - RBBINode(NodeType t); - RBBINode(const RBBINode &other); + RBBINode(NodeType t, UErrorCode& status); + RBBINode(const RBBINode &other, UErrorCode& status); ~RBBINode(); + static void NRDeleteNode(RBBINode *node); - RBBINode *cloneTree(); - RBBINode *flattenVariables(); - void flattenSets(); + RBBINode *cloneTree(UErrorCode &status, int depth=0); + RBBINode *flattenVariables(UErrorCode &status, int depth=0); + void flattenSets(UErrorCode &status, int depth=0); void findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &status); #ifdef RBBI_DEBUG diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index 92cccc1a3397f1..4fd789970cc0b9 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -86,7 +86,8 @@ RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString &rules, if (U_FAILURE(status)) { return; } - if(fSetBuilder == 0 || fScanner == 0 || fUSetNodes == 0 || fRuleStatusVals == 0) { + if (fSetBuilder == nullptr || fScanner == nullptr || + fUSetNodes == nullptr || fRuleStatusVals == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } } @@ -102,7 +103,7 @@ RBBIRuleBuilder::~RBBIRuleBuilder() { int i; for (i=0; ; i++) { - RBBINode *n = (RBBINode *)fUSetNodes->elementAt(i); + RBBINode* n = static_cast<RBBINode*>(fUSetNodes->elementAt(i)); if (n==nullptr) { break; } @@ -156,7 +157,7 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesLengthInUTF8 = 0; - u_strToUTF8WithSub(0, 0, &rulesLengthInUTF8, + u_strToUTF8WithSub(nullptr, 0, &rulesLengthInUTF8, fStrippedRules.getBuffer(), fStrippedRules.length(), 0xfffd, nullptr, fStatus); *fStatus = U_ZERO_ERROR; @@ -181,12 +182,12 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { } #endif - RBBIDataHeader *data = (RBBIDataHeader *)uprv_malloc(totalSize); - if (data == nullptr) { + LocalMemory<RBBIDataHeader> data(static_cast<RBBIDataHeader*>(uprv_malloc(totalSize))); + if (data.isNull()) { *fStatus = U_MEMORY_ALLOCATION_ERROR; return nullptr; } - uprv_memset(data, 0, totalSize); + uprv_memset(data.getAlias(), 0, totalSize); data->fMagic = 0xb1a0; @@ -212,23 +213,23 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { uprv_memset(data->fReserved, 0, sizeof(data->fReserved)); - fForwardTable->exportTable((uint8_t *)data + data->fFTable); - fForwardTable->exportSafeTable((uint8_t *)data + data->fRTable); - fSetBuilder->serializeTrie ((uint8_t *)data + data->fTrie); + fForwardTable->exportTable(reinterpret_cast<uint8_t*>(data.getAlias()) + data->fFTable); + fForwardTable->exportSafeTable(reinterpret_cast<uint8_t*>(data.getAlias()) + data->fRTable); + fSetBuilder->serializeTrie(reinterpret_cast<uint8_t*>(data.getAlias()) + data->fTrie); - int32_t *ruleStatusTable = (int32_t *)((uint8_t *)data + data->fStatusTable); + int32_t* ruleStatusTable = reinterpret_cast<int32_t*>(reinterpret_cast<uint8_t*>(data.getAlias()) + data->fStatusTable); for (i=0; i<fRuleStatusVals->size(); i++) { ruleStatusTable[i] = fRuleStatusVals->elementAti(i); } - u_strToUTF8WithSub((char *)data+data->fRuleSource, rulesSize, &rulesLengthInUTF8, + u_strToUTF8WithSub(reinterpret_cast<char*>(data.getAlias()) + data->fRuleSource, rulesSize, &rulesLengthInUTF8, fStrippedRules.getBuffer(), fStrippedRules.length(), 0xfffd, nullptr, fStatus); if (U_FAILURE(*fStatus)) { return nullptr; } - return data; + return data.orphan(); } diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index 844b0639099c06..d3aa32fd6ed7b0 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -289,6 +289,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) // Terminate expression, leaves expression parse tree rooted in TOS node. fixOpStack(RBBINode::precStart); + if (U_FAILURE(*fRB->fStatus)) { + break; + } RBBINode *startExprNode = fNodeStack[fNodeStackPtr-2]; RBBINode *varRefNode = fNodeStack[fNodeStackPtr-1]; @@ -312,6 +315,11 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) UErrorCode t = *fRB->fStatus; *fRB->fStatus = U_ZERO_ERROR; error(t); + // When adding $variableRef to the symbol table fail, Delete + // both nodes because deleting varRefNode will not delete + // RHSExprNode internally. + delete RHSExprNode; + delete varRefNode; } // Clean up the stack. @@ -522,7 +530,13 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) n = fNodeStack[fNodeStackPtr]; uint32_t v = u_charDigitValue(fC.fChar); U_ASSERT(v < 10); - n->fVal = n->fVal*10 + v; + int64_t updated = static_cast<int64_t>(n->fVal)*10 + v; + // Avoid overflow n->fVal + if (updated > INT32_MAX) { + error(U_BRK_RULE_SYNTAX); + break; + } + n->fVal = static_cast<int32_t>(updated); break; } @@ -734,7 +748,7 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode // First check whether we've already cached a set for this string. // If so, just use the cached set in the new node. // delete any set provided by the caller, since we own it. - el = (RBBISetTableEl *)uhash_get(fSetTable, &s); + el = static_cast<RBBISetTableEl*>(uhash_get(fSetTable, &s)); if (el != nullptr) { delete setToAdopt; node->fLeftChild = el->val; @@ -753,15 +767,25 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode c = s.char32At(0); setToAdopt = new UnicodeSet(c, c); } + if (setToAdopt == nullptr) { + error(U_MEMORY_ALLOCATION_ERROR); + return; + } } // // Make a new uset node to refer to this UnicodeSet // This new uset node becomes the child of the caller's setReference node. // - RBBINode *usetNode = new RBBINode(RBBINode::uset); + UErrorCode localStatus = U_ZERO_ERROR; + RBBINode *usetNode = new RBBINode(RBBINode::uset, localStatus); if (usetNode == nullptr) { - error(U_MEMORY_ALLOCATION_ERROR); + localStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(localStatus)) { + delete usetNode; + error(localStatus); + delete setToAdopt; return; } usetNode->fInputSet = setToAdopt; @@ -779,7 +803,7 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode // // Add the new set to the set hash table. // - el = (RBBISetTableEl *)uprv_malloc(sizeof(RBBISetTableEl)); + el = static_cast<RBBISetTableEl*>(uprv_malloc(sizeof(RBBISetTableEl))); UnicodeString *tkey = new UnicodeString(s); if (tkey == nullptr || el == nullptr || setToAdopt == nullptr) { // Delete to avoid memory leak @@ -796,8 +820,6 @@ void RBBIRuleScanner::findSetFor(const UnicodeString &s, RBBINode *node, Unicode el->key = tkey; el->val = usetNode; uhash_put(fSetTable, el->key, el, fRB->fStatus); - - return; } @@ -851,7 +873,7 @@ UChar32 RBBIRuleScanner::nextCharLL() { UChar32 ch; if (fNextIndex >= fRB->fRules.length()) { - return (UChar32)-1; + return static_cast<UChar32>(-1); } ch = fRB->fRules.char32At(fNextIndex); if (U_IS_SURROGATE(ch)) { @@ -926,6 +948,9 @@ void RBBIRuleScanner::nextChar(RBBIRuleChar &c) { } } + if (c.fChar == static_cast<UChar32>(-1)) { + return; + } if (fQuoteMode) { c.fEscaped = true; } @@ -942,7 +967,7 @@ void RBBIRuleScanner::nextChar(RBBIRuleChar &c) { int32_t commentStart = fScanIndex; for (;;) { c.fChar = nextCharLL(); - if (c.fChar == (UChar32)-1 || // EOF + if (c.fChar == static_cast<UChar32>(-1) || // EOF c.fChar == chCR || c.fChar == chLF || c.fChar == chNEL || @@ -952,7 +977,7 @@ void RBBIRuleScanner::nextChar(RBBIRuleChar &c) { fRB->fStrippedRules.setCharAt(i, u' '); } } - if (c.fChar == (UChar32)-1) { + if (c.fChar == static_cast<UChar32>(-1)) { return; } @@ -995,7 +1020,7 @@ void RBBIRuleScanner::parse() { // Main loop for the rule parsing state machine. // Runs once per state transition. // Each time through optionally performs, depending on the state table, - // - an advance to the the next input char + // - an advance to the next input char // - an action to be performed. // - pushing or popping a state to/from the local state return stack. // @@ -1049,14 +1074,14 @@ void RBBIRuleScanner::parse() { // Table row specified "escaped P" and the char is either 'p' or 'P'. break; } - if (tableEl->fCharClass == 252 && fC.fChar == (UChar32)-1) { + if (tableEl->fCharClass == 252 && fC.fChar == static_cast<UChar32>(-1)) { // Table row specified eof and we hit eof on the input. break; } if (tableEl->fCharClass >= 128 && tableEl->fCharClass < 240 && // Table specs a char class && fC.fEscaped == false && // char is not escaped && - fC.fChar != (UChar32)-1) { // char is not EOF + fC.fChar != static_cast<UChar32>(-1)) { // char is not EOF U_ASSERT((tableEl->fCharClass-128) < UPRV_LENGTHOF(fRuleSets)); if (fRuleSets[tableEl->fCharClass-128].contains(fC.fChar)) { // Table row specified a character class, or set of characters, @@ -1074,7 +1099,7 @@ void RBBIRuleScanner::parse() { // We've found the row of the state table that matches the current input // character from the rules string. // Perform any action specified by this row in the state table. - if (doParseActions((int32_t)tableEl->fAction) == false) { + if (doParseActions(static_cast<int32_t>(tableEl->fAction)) == false) { // Break out of the state machine loop if the // the action signalled some kind of error, or // the action was to exit, occurs on normal end-of-rules-input. @@ -1175,7 +1200,7 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { return nullptr; } fNodeStackPtr++; - fNodeStack[fNodeStackPtr] = new RBBINode(t); + fNodeStack[fNodeStackPtr] = new RBBINode(t, *fRB->fStatus); if (fNodeStack[fNodeStackPtr] == nullptr) { *fRB->fStatus = U_MEMORY_ALLOCATION_ERROR; } @@ -1199,7 +1224,6 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { // //------------------------------------------------------------------------------ void RBBIRuleScanner::scanSet() { - UnicodeSet *uset; ParsePosition pos; int startPos; int i; @@ -1211,12 +1235,12 @@ void RBBIRuleScanner::scanSet() { pos.setIndex(fScanIndex); startPos = fScanIndex; UErrorCode localStatus = U_ZERO_ERROR; - uset = new UnicodeSet(); - if (uset == nullptr) { - localStatus = U_MEMORY_ALLOCATION_ERROR; - } else { - uset->applyPatternIgnoreSpace(fRB->fRules, pos, fSymbolTable, localStatus); + LocalPointer<UnicodeSet> uset(new UnicodeSet(), localStatus); + if (U_FAILURE(localStatus)) { + error(localStatus); + return; } + uset->applyPatternIgnoreSpace(fRB->fRules, pos, fSymbolTable, localStatus); if (U_FAILURE(localStatus)) { // TODO: Get more accurate position of the error from UnicodeSet's return info. // UnicodeSet appears to not be reporting correctly at this time. @@ -1224,20 +1248,22 @@ void RBBIRuleScanner::scanSet() { RBBIDebugPrintf("UnicodeSet parse position.ErrorIndex = %d\n", pos.getIndex()); #endif error(localStatus); - delete uset; return; } // Verify that the set contains at least one code point. // - U_ASSERT(uset!=nullptr); - if (uset->isEmpty()) { + U_ASSERT(uset.isValid()); + UnicodeSet tempSet(*uset); + // Use tempSet to handle the case that the UnicodeSet contains + // only string element, such as [{ab}] and treat it as empty set. + tempSet.removeAllStrings(); + if (tempSet.isEmpty()) { // This set is empty. // Make it an error, because it almost certainly is not what the user wanted. // Also, avoids having to think about corner cases in the tree manipulation code // that occurs later on. error(U_BRK_RULE_EMPTY_SET); - delete uset; return; } @@ -1246,7 +1272,7 @@ void RBBIRuleScanner::scanSet() { // Don't just set fScanIndex because the line/char positions maintained // for error reporting would be thrown off. i = pos.getIndex(); - for (;;) { + for (;U_SUCCESS(*fRB->fStatus);) { if (fNextIndex >= i) { break; } @@ -1269,7 +1295,7 @@ void RBBIRuleScanner::scanSet() { // character categories for run time engine. // - Eliminates mulitiple instances of the same set. // - Creates a new uset node if necessary (if this isn't a duplicate.) - findSetFor(n->fText, n, uset); + findSetFor(n->fText, n, uset.orphan()); } } diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index e6c72954bc3bb4..b6e9f745e4f1d3 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -120,7 +120,7 @@ void RBBISetBuilder::buildRanges() { // int ni; for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules - usetNode = (RBBINode *)this->fRB->fUSetNodes->elementAt(ni); + usetNode = static_cast<RBBINode*>(this->fRB->fUSetNodes->elementAt(ni)); if (usetNode==nullptr) { break; } @@ -251,7 +251,7 @@ void RBBISetBuilder::buildRanges() { UnicodeString eofString(u"eof"); UnicodeString bofString(u"bof"); for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules - usetNode = (RBBINode *)this->fRB->fUSetNodes->elementAt(ni); + usetNode = static_cast<RBBINode*>(this->fRB->fUSetNodes->elementAt(ni)); if (usetNode==nullptr) { break; } @@ -328,9 +328,10 @@ int32_t RBBISetBuilder::getTrieSize() { UCPTRIE_TYPE_FAST, use8Bits ? UCPTRIE_VALUE_BITS_8 : UCPTRIE_VALUE_BITS_16, fStatus); - fTrieSize = ucptrie_toBinary(fTrie, nullptr, 0, fStatus); - if (*fStatus == U_BUFFER_OVERFLOW_ERROR) { - *fStatus = U_ZERO_ERROR; + UErrorCode bufferStatus = *fStatus; + fTrieSize = ucptrie_toBinary(fTrie, nullptr, 0, &bufferStatus); + if (bufferStatus != U_BUFFER_OVERFLOW_ERROR && U_FAILURE(bufferStatus)) { + *fStatus = bufferStatus; } } return fTrieSize; @@ -369,18 +370,22 @@ void RBBISetBuilder::addValToSets(UVector *sets, uint32_t val) { int32_t ix; for (ix=0; ix<sets->size(); ix++) { - RBBINode *usetNode = (RBBINode *)sets->elementAt(ix); + RBBINode* usetNode = static_cast<RBBINode*>(sets->elementAt(ix)); addValToSet(usetNode, val); } } void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) { - RBBINode *leafNode = new RBBINode(RBBINode::leafChar); + RBBINode *leafNode = new RBBINode(RBBINode::leafChar, *fStatus); + if (U_FAILURE(*fStatus)) { + delete leafNode; + return; + } if (leafNode == nullptr) { *fStatus = U_MEMORY_ALLOCATION_ERROR; return; } - leafNode->fVal = (unsigned short)val; + leafNode->fVal = static_cast<unsigned short>(val); if (usetNode->fLeftChild == nullptr) { usetNode->fLeftChild = leafNode; leafNode->fParent = usetNode; @@ -388,9 +393,13 @@ void RBBISetBuilder::addValToSet(RBBINode *usetNode, uint32_t val) { // There are already input symbols present for this set. // Set up an OR node, with the previous stuff as the left child // and the new value as the right child. - RBBINode *orNode = new RBBINode(RBBINode::opOr); + RBBINode *orNode = new RBBINode(RBBINode::opOr, *fStatus); if (orNode == nullptr) { *fStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(*fStatus)) { + delete orNode; + delete leafNode; return; } orNode->fLeftChild = usetNode->fLeftChild; @@ -441,7 +450,7 @@ UBool RBBISetBuilder::sawBOF() const { //------------------------------------------------------------------------ UChar32 RBBISetBuilder::getFirstChar(int32_t category) const { RangeDescriptor *rlRange; - UChar32 retVal = (UChar32)-1; + UChar32 retVal = static_cast<UChar32>(-1); for (rlRange = fRangeList; rlRange!=nullptr; rlRange=rlRange->fNext) { if (rlRange->fNum == category) { retVal = rlRange->fStartChar; @@ -674,7 +683,7 @@ void RangeDescriptor::split(UChar32 where, UErrorCode &status) { bool RangeDescriptor::isDictionaryRange() { static const char16_t *dictionary = u"dictionary"; for (int32_t i=0; i<fIncludesSets->size(); i++) { - RBBINode *usetNode = (RBBINode *)fIncludesSets->elementAt(i); + RBBINode* usetNode = static_cast<RBBINode*>(fIncludesSets->elementAt(i)); RBBINode *setRef = usetNode->fParent; if (setRef != nullptr) { RBBINode *varRef = setRef->fParent; diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index cd09d3317a38d6..2c7e82ca194f08 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -46,7 +46,7 @@ class RangeDescriptor : public UMemory { int32_t fNum {0}; // runtime-mapped input value for this range. bool fIncludesDict {false}; // True if the range includes $dictionary. bool fFirstInGroup {false}; // True if first range in a group with the same fNum. - UVector *fIncludesSets {nullptr}; // vector of the the original + UVector *fIncludesSets {nullptr}; // vector of the original // Unicode sets that include this range. // (Contains ptrs to uset nodes) RangeDescriptor *fNext {nullptr}; // Next RangeDescriptor in the linked list. diff --git a/deps/icu-small/source/common/rbbistbl.cpp b/deps/icu-small/source/common/rbbistbl.cpp index 844351bd0dfbcc..27f31a9d552c42 100644 --- a/deps/icu-small/source/common/rbbistbl.cpp +++ b/deps/icu-small/source/common/rbbistbl.cpp @@ -41,7 +41,7 @@ U_CDECL_END U_NAMESPACE_BEGIN RBBISymbolTable::RBBISymbolTable(RBBIRuleScanner *rs, const UnicodeString &rules, UErrorCode &status) - :fRules(rules), fRuleScanner(rs), ffffString(char16_t(0xffff)) + : fRules(rules), fRuleScanner(rs), ffffString(static_cast<char16_t>(0xffff)) { fHashTable = nullptr; fCachedSetLookup = nullptr; @@ -76,9 +76,9 @@ const UnicodeString *RBBISymbolTable::lookup(const UnicodeString& s) const RBBINode *exprNode; RBBINode *usetNode; const UnicodeString *retString; - RBBISymbolTable *This = (RBBISymbolTable *)this; // cast off const + RBBISymbolTable *This = const_cast<RBBISymbolTable*>(this); // cast off const - el = (RBBISymbolTableEntry *)uhash_get(fHashTable, &s); + el = static_cast<RBBISymbolTableEntry*>(uhash_get(fHashTable, &s)); if (el == nullptr) { return nullptr; } @@ -119,10 +119,10 @@ const UnicodeString *RBBISymbolTable::lookup(const UnicodeString& s) const const UnicodeFunctor *RBBISymbolTable::lookupMatcher(UChar32 ch) const { UnicodeSet *retVal = nullptr; - RBBISymbolTable *This = (RBBISymbolTable *)this; // cast off const + RBBISymbolTable *This = const_cast<RBBISymbolTable*>(this); // cast off const if (ch == 0xffff) { retVal = fCachedSetLookup; - This->fCachedSetLookup = 0; + This->fCachedSetLookup = nullptr; } return retVal; } @@ -170,7 +170,7 @@ RBBINode *RBBISymbolTable::lookupNode(const UnicodeString &key) const{ RBBINode *retNode = nullptr; RBBISymbolTableEntry *el; - el = (RBBISymbolTableEntry *)uhash_get(fHashTable, &key); + el = static_cast<RBBISymbolTableEntry*>(uhash_get(fHashTable, &key)); if (el != nullptr) { retNode = el->val; } @@ -190,7 +190,7 @@ void RBBISymbolTable::addEntry (const UnicodeString &key, RBBINode * if (U_FAILURE(err)) { return; } - e = (RBBISymbolTableEntry *)uhash_get(fHashTable, &key); + e = static_cast<RBBISymbolTableEntry*>(uhash_get(fHashTable, &key)); if (e != nullptr) { err = U_BRK_VARIABLE_REDFINITION; return; diff --git a/deps/icu-small/source/common/rbbitblb.cpp b/deps/icu-small/source/common/rbbitblb.cpp index 8b40136fc7c159..034d7fbf6d8be2 100644 --- a/deps/icu-small/source/common/rbbitblb.cpp +++ b/deps/icu-small/source/common/rbbitblb.cpp @@ -51,7 +51,7 @@ RBBITableBuilder::RBBITableBuilder(RBBIRuleBuilder *rb, RBBINode **rootNode, UEr RBBITableBuilder::~RBBITableBuilder() { int i; for (i=0; i<fDStates->size(); i++) { - delete (RBBIStateDescriptor *)fDStates->elementAt(i); + delete static_cast<RBBIStateDescriptor*>(fDStates->elementAt(i)); } delete fDStates; delete fSafeTable; @@ -81,7 +81,10 @@ void RBBITableBuilder::buildForwardTable() { // Walk through the tree, replacing any references to $variables with a copy of the // parse tree for the substitution expression. // - fTree = fTree->flattenVariables(); + fTree = fTree->flattenVariables(*fStatus, 0); + if (U_FAILURE(*fStatus)) { + return; + } #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) { RBBIDebugPuts("\nParse tree after flattening variable references."); @@ -96,13 +99,22 @@ void RBBITableBuilder::buildForwardTable() { // {bof} fake character. // if (fRB->fSetBuilder->sawBOF()) { - RBBINode *bofTop = new RBBINode(RBBINode::opCat); - RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar); - // Delete and exit if memory allocation failed. - if (bofTop == nullptr || bofLeaf == nullptr) { + RBBINode *bofTop = new RBBINode(RBBINode::opCat, *fStatus); + if (bofTop == nullptr) { *fStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(*fStatus)) { delete bofTop; + return; + } + RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar, *fStatus); + // Delete and exit if memory allocation failed. + if (bofLeaf == nullptr) { + *fStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(*fStatus)) { delete bofLeaf; + delete bofTop; return; } bofTop->fLeftChild = bofLeaf; @@ -117,18 +129,23 @@ void RBBITableBuilder::buildForwardTable() { // Appears as a cat-node, left child being the original tree, // right child being the end marker. // - RBBINode *cn = new RBBINode(RBBINode::opCat); + RBBINode *cn = new RBBINode(RBBINode::opCat, *fStatus); // Exit if memory allocation failed. if (cn == nullptr) { *fStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(*fStatus)) { + delete cn; return; } cn->fLeftChild = fTree; fTree->fParent = cn; - RBBINode *endMarkerNode = cn->fRightChild = new RBBINode(RBBINode::endMark); + RBBINode *endMarkerNode = cn->fRightChild = new RBBINode(RBBINode::endMark, *fStatus); // Delete and exit if memory allocation failed. if (cn->fRightChild == nullptr) { *fStatus = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(*fStatus)) { delete cn; return; } @@ -139,7 +156,7 @@ void RBBITableBuilder::buildForwardTable() { // Replace all references to UnicodeSets with the tree for the equivalent // expression. // - fTree->flattenSets(); + fTree->flattenSets(*fStatus, 0); #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) { RBBIDebugPuts("\nParse tree after flattening Unicode Set references."); @@ -358,8 +375,8 @@ void RBBITableBuilder::calcFollowPos(RBBINode *n) { UVector *LastPosOfLeftChild = n->fLeftChild->fLastPosSet; - for (ix=0; ix<(uint32_t)LastPosOfLeftChild->size(); ix++) { - i = (RBBINode *)LastPosOfLeftChild->elementAt(ix); + for (ix = 0; ix < static_cast<uint32_t>(LastPosOfLeftChild->size()); ix++) { + i = static_cast<RBBINode*>(LastPosOfLeftChild->elementAt(ix)); setAdd(i->fFollowPos, n->fRightChild->fFirstPosSet); } } @@ -370,8 +387,8 @@ void RBBITableBuilder::calcFollowPos(RBBINode *n) { RBBINode *i; // again, n and i are the names from Aho's description. uint32_t ix; - for (ix=0; ix<(uint32_t)n->fLastPosSet->size(); ix++) { - i = (RBBINode *)n->fLastPosSet->elementAt(ix); + for (ix = 0; ix < static_cast<uint32_t>(n->fLastPosSet->size()); ix++) { + i = static_cast<RBBINode*>(n->fLastPosSet->elementAt(ix)); setAdd(i->fFollowPos, n->fFirstPosSet); } } @@ -442,7 +459,7 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree, RBBINode *endMarkNod int32_t startNodeIx; for (endNodeIx=0; endNodeIx<leafNodes.size(); endNodeIx++) { - RBBINode *endNode = (RBBINode *)leafNodes.elementAt(endNodeIx); + RBBINode* endNode = static_cast<RBBINode*>(leafNodes.elementAt(endNodeIx)); // Identify leaf nodes that correspond to overall rule match positions. // These include the endMarkNode in their followPos sets. @@ -462,7 +479,7 @@ void RBBITableBuilder::calcChainedFollowPos(RBBINode *tree, RBBINode *endMarkNod // with the same char class as our ending node. RBBINode *startNode; for (startNodeIx = 0; startNodeIx<matchStartNodes.size(); startNodeIx++) { - startNode = (RBBINode *)matchStartNodes.elementAt(startNodeIx); + startNode = static_cast<RBBINode*>(matchStartNodes.elementAt(startNodeIx)); if (startNode->fType != RBBINode::leafChar) { continue; } @@ -522,7 +539,7 @@ void RBBITableBuilder::bofFixup() { RBBINode *startNode; int startNodeIx; for (startNodeIx = 0; startNodeIx<matchStartNodes->size(); startNodeIx++) { - startNode = (RBBINode *)matchStartNodes->elementAt(startNodeIx); + startNode = static_cast<RBBINode*>(matchStartNodes->elementAt(startNodeIx)); if (startNode->fType != RBBINode::leafChar) { continue; } @@ -602,7 +619,7 @@ void RBBITableBuilder::buildStateTable() { int32_t tx; for (tx=1; tx<fDStates->size(); tx++) { RBBIStateDescriptor *temp; - temp = (RBBIStateDescriptor *)fDStates->elementAt(tx); + temp = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(tx)); if (temp->fMarked == false) { T = temp; break; @@ -625,7 +642,7 @@ void RBBITableBuilder::buildStateTable() { RBBINode *p; int32_t px; for (px=0; px<T->fPositions->size(); px++) { - p = (RBBINode *)T->fPositions->elementAt(px); + p = static_cast<RBBINode*>(T->fPositions->elementAt(px)); if ((p->fType == RBBINode::leafChar) && (p->fVal == a)) { if (U == nullptr) { U = new UVector(*fStatus); @@ -646,7 +663,7 @@ void RBBITableBuilder::buildStateTable() { int ix; for (ix=0; ix<fDStates->size(); ix++) { RBBIStateDescriptor *temp2; - temp2 = (RBBIStateDescriptor *)fDStates->elementAt(ix); + temp2 = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(ix)); if (setEquals(U, temp2->fPositions)) { delete U; U = temp2->fPositions; @@ -702,7 +719,7 @@ void RBBITableBuilder::mapLookAheadRules() { fLookAheadRuleMap->setSize(fRB->fScanner->numRules() + 1); for (int32_t n=0; n<fDStates->size(); n++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(n)); int32_t laSlotForState = 0; // Establish the look-ahead slot for this state, if the state covers @@ -786,9 +803,9 @@ void RBBITableBuilder::flagAcceptingStates() { } for (i=0; i<endMarkerNodes.size(); i++) { - endMarker = (RBBINode *)endMarkerNodes.elementAt(i); + endMarker = static_cast<RBBINode*>(endMarkerNodes.elementAt(i)); for (n=0; n<fDStates->size(); n++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(n)); if (sd->fPositions->indexOf(endMarker) >= 0) { // Any non-zero value for fAccepting means this is an accepting node. // The value is what will be returned to the user as the break status. @@ -834,11 +851,11 @@ void RBBITableBuilder::flagLookAheadStates() { return; } for (i=0; i<lookAheadNodes.size(); i++) { - lookAheadNode = (RBBINode *)lookAheadNodes.elementAt(i); + lookAheadNode = static_cast<RBBINode*>(lookAheadNodes.elementAt(i)); U_ASSERT(lookAheadNode->fType == RBBINode::NodeType::lookAhead); for (n=0; n<fDStates->size(); n++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(n)); int32_t positionsIdx = sd->fPositions->indexOf(lookAheadNode); if (positionsIdx >= 0) { U_ASSERT(lookAheadNode == sd->fPositions->elementAt(positionsIdx)); @@ -879,10 +896,10 @@ void RBBITableBuilder::flagTaggedStates() { return; } for (i=0; i<tagNodes.size(); i++) { // For each tag node t (all of 'em) - tagNode = (RBBINode *)tagNodes.elementAt(i); + tagNode = static_cast<RBBINode*>(tagNodes.elementAt(i)); for (n=0; n<fDStates->size(); n++) { // For each state s (row in the state table) - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(n)); if (sd->fPositions->indexOf(tagNode) >= 0) { // if s include the tag node t sortedAdd(&sd->fTagVals, tagNode->fVal); } @@ -920,12 +937,12 @@ void RBBITableBuilder::mergeRuleStatusVals() { // We will need this as a default, for rule sets with no explicit tagging. if (fRB->fRuleStatusVals->size() == 0) { fRB->fRuleStatusVals->addElement(1, *fStatus); // Num of statuses in group - fRB->fRuleStatusVals->addElement((int32_t)0, *fStatus); // and our single status of zero + fRB->fRuleStatusVals->addElement(static_cast<int32_t>(0), *fStatus); // and our single status of zero } // For each state for (n=0; n<fDStates->size(); n++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(n); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(n)); UVector *thisStatesTagValues = sd->fTagVals; if (thisStatesTagValues == nullptr) { // No tag values are explicitly associated with this state. @@ -1151,9 +1168,9 @@ bool RBBITableBuilder::findDuplCharClassFrom(IntPair *categories) { uint16_t table_base = 0; uint16_t table_dupl = 1; for (int32_t state=0; state<numStates; state++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state); - table_base = (uint16_t)sd->fDtran->elementAti(categories->first); - table_dupl = (uint16_t)sd->fDtran->elementAti(categories->second); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(state)); + table_base = static_cast<uint16_t>(sd->fDtran->elementAti(categories->first)); + table_dupl = static_cast<uint16_t>(sd->fDtran->elementAti(categories->second)); if (table_base != table_dupl) { break; } @@ -1173,7 +1190,7 @@ bool RBBITableBuilder::findDuplCharClassFrom(IntPair *categories) { void RBBITableBuilder::removeColumn(int32_t column) { int32_t numStates = fDStates->size(); for (int32_t state=0; state<numStates; state++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(state)); U_ASSERT(column < sd->fDtran->size()); sd->fDtran->removeElementAt(column); } @@ -1187,9 +1204,9 @@ bool RBBITableBuilder::findDuplicateState(IntPair *states) { int32_t numCols = fRB->fSetBuilder->getNumCharCategories(); for (; states->first<numStates-1; states->first++) { - RBBIStateDescriptor *firstSD = (RBBIStateDescriptor *)fDStates->elementAt(states->first); + RBBIStateDescriptor* firstSD = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(states->first)); for (states->second=states->first+1; states->second<numStates; states->second++) { - RBBIStateDescriptor *duplSD = (RBBIStateDescriptor *)fDStates->elementAt(states->second); + RBBIStateDescriptor* duplSD = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(states->second)); if (firstSD->fAccepting != duplSD->fAccepting || firstSD->fLookAhead != duplSD->fLookAhead || firstSD->fTagsIdx != duplSD->fTagsIdx) { @@ -1249,14 +1266,14 @@ void RBBITableBuilder::removeState(IntPair duplStates) { U_ASSERT(keepState < duplState); U_ASSERT(duplState < fDStates->size()); - RBBIStateDescriptor *duplSD = (RBBIStateDescriptor *)fDStates->elementAt(duplState); + RBBIStateDescriptor* duplSD = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(duplState)); fDStates->removeElementAt(duplState); delete duplSD; int32_t numStates = fDStates->size(); int32_t numCols = fRB->fSetBuilder->getNumCharCategories(); for (int32_t state=0; state<numStates; ++state) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(state)); for (int32_t col=0; col<numCols; col++) { int32_t existingVal = sd->fDtran->elementAti(col); int32_t newVal = existingVal; @@ -1280,7 +1297,7 @@ void RBBITableBuilder::removeSafeState(IntPair duplStates) { // and will auto-delete the removed element. int32_t numStates = fSafeTable->size(); for (int32_t state=0; state<numStates; ++state) { - UnicodeString *sd = (UnicodeString *)fSafeTable->elementAt(state); + UnicodeString* sd = static_cast<UnicodeString*>(fSafeTable->elementAt(state)); int32_t numCols = sd->length(); for (int32_t col=0; col<numCols; col++) { int32_t existingVal = sd->charAt(col); @@ -1354,7 +1371,7 @@ bool RBBITableBuilder::use8BitsForTable() const { // //----------------------------------------------------------------------------- void RBBITableBuilder::exportTable(void *where) { - RBBIStateTable *table = (RBBIStateTable *)where; + RBBIStateTable* table = static_cast<RBBIStateTable*>(where); uint32_t state; int col; @@ -1387,13 +1404,13 @@ void RBBITableBuilder::exportTable(void *where) { } for (state=0; state<table->fNumStates; state++) { - RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state); - RBBIStateTableRow *row = (RBBIStateTableRow *)(table->fTableData + state*table->fRowLen); + RBBIStateDescriptor* sd = static_cast<RBBIStateDescriptor*>(fDStates->elementAt(state)); + RBBIStateTableRow* row = reinterpret_cast<RBBIStateTableRow*>(table->fTableData + state * table->fRowLen); if (use8BitsForTable()) { U_ASSERT (sd->fAccepting <= 255); U_ASSERT (sd->fLookAhead <= 255); U_ASSERT (0 <= sd->fTagsIdx && sd->fTagsIdx <= 255); - RBBIStateTableRow8 *r8 = (RBBIStateTableRow8*)row; + RBBIStateTableRow8* r8 = reinterpret_cast<RBBIStateTableRow8*>(row); r8->fAccepting = sd->fAccepting; r8->fLookAhead = sd->fLookAhead; r8->fTagsIdx = sd->fTagsIdx; @@ -1425,7 +1442,7 @@ void RBBITableBuilder::buildSafeReverseTable(UErrorCode &status) { // 1. Identify pairs of character classes that are "safe." Safe means that boundaries // following the pair do not depend on context or state before the pair. To test // whether a pair is safe, run it through the main forward state table, starting - // from each state. If the the final state is the same, no matter what the starting state, + // from each state. If the final state is the same, no matter what the starting state, // the pair is safe. // // 2. Build a state table that recognizes the safe pairs. It's similar to their @@ -1469,8 +1486,8 @@ void RBBITableBuilder::buildSafeReverseTable(UErrorCode &status) { } } if (wantedEndState == endState) { - safePairs.append((char16_t)c1); - safePairs.append((char16_t)c2); + safePairs.append(static_cast<char16_t>(c1)); + safePairs.append(static_cast<char16_t>(c2)); // printf("(%d, %d) ", c1, c2); } } @@ -1576,7 +1593,7 @@ bool RBBITableBuilder::use8BitsForSafeTable() const { // //----------------------------------------------------------------------------- void RBBITableBuilder::exportSafeTable(void *where) { - RBBIStateTable *table = (RBBIStateTable *)where; + RBBIStateTable* table = static_cast<RBBIStateTable*>(where); uint32_t state; int col; @@ -1601,10 +1618,10 @@ void RBBITableBuilder::exportSafeTable(void *where) { } for (state=0; state<table->fNumStates; state++) { - UnicodeString *rowString = (UnicodeString *)fSafeTable->elementAt(state); - RBBIStateTableRow *row = (RBBIStateTableRow *)(table->fTableData + state*table->fRowLen); + UnicodeString* rowString = static_cast<UnicodeString*>(fSafeTable->elementAt(state)); + RBBIStateTableRow* row = reinterpret_cast<RBBIStateTableRow*>(table->fTableData + state * table->fRowLen); if (use8BitsForSafeTable()) { - RBBIStateTableRow8 *r8 = (RBBIStateTableRow8*)row; + RBBIStateTableRow8* r8 = reinterpret_cast<RBBIStateTableRow8*>(row); r8->fAccepting = 0; r8->fLookAhead = 0; r8->fTagsIdx = 0; diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 54383c981d118e..4c14dae133eefc 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -179,7 +179,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ResourceBundle) ResourceBundle::ResourceBundle(UErrorCode &err) :UObject(), fLocale(nullptr) { - fResource = ures_open(0, Locale::getDefault().getName(), &err); + fResource = ures_open(nullptr, Locale::getDefault().getName(), &err); } ResourceBundle::ResourceBundle(const ResourceBundle &other) @@ -188,7 +188,7 @@ ResourceBundle::ResourceBundle(const ResourceBundle &other) UErrorCode status = U_ZERO_ERROR; if (other.fResource) { - fResource = ures_copyResb(0, other.fResource, &status); + fResource = ures_copyResb(nullptr, other.fResource, &status); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -199,7 +199,7 @@ ResourceBundle::ResourceBundle(UResourceBundle *res, UErrorCode& err) :UObject(), fLocale(nullptr) { if (res) { - fResource = ures_copyResb(0, res, &err); + fResource = ures_copyResb(nullptr, res, &err); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -218,7 +218,7 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) if(this == &other) { return *this; } - if(fResource != 0) { + if (fResource != nullptr) { ures_close(fResource); fResource = nullptr; } @@ -228,7 +228,7 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) } UErrorCode status = U_ZERO_ERROR; if (other.fResource) { - fResource = ures_copyResb(0, other.fResource, &status); + fResource = ures_copyResb(nullptr, other.fResource, &status); } else { /* Copying a bad resource bundle */ fResource = nullptr; @@ -238,12 +238,10 @@ ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) ResourceBundle::~ResourceBundle() { - if(fResource != 0) { + if (fResource != nullptr) { ures_close(fResource); } - if(fLocale != nullptr) { - delete(fLocale); - } + delete fLocale; } ResourceBundle * @@ -311,7 +309,7 @@ ResourceBundle ResourceBundle::getNext(UErrorCode& status) { UnicodeString ResourceBundle::getNextString(UErrorCode& status) { int32_t len = 0; - const char16_t* r = ures_getNextString(fResource, &len, 0, &status); + const char16_t* r = ures_getNextString(fResource, &len, nullptr, &status); return UnicodeString(true, r, len); } @@ -390,7 +388,7 @@ const Locale &ResourceBundle::getLocale() const { return ncThis->fLocale != nullptr ? *ncThis->fLocale : Locale::getDefault(); } -const Locale ResourceBundle::getLocale(ULocDataLocaleType type, UErrorCode &status) const +Locale ResourceBundle::getLocale(ULocDataLocaleType type, UErrorCode &status) const { return ures_getLocaleByType(fResource, type, &status); } diff --git a/deps/icu-small/source/common/resbund_cnv.cpp b/deps/icu-small/source/common/resbund_cnv.cpp index 7f83f06f0e0c0c..a109609189410e 100644 --- a/deps/icu-small/source/common/resbund_cnv.cpp +++ b/deps/icu-small/source/common/resbund_cnv.cpp @@ -49,7 +49,7 @@ ResourceBundle::constructForLocale(const UnicodeString& path, } else { UnicodeString nullTerminatedPath(path); - nullTerminatedPath.append((char16_t)0); + nullTerminatedPath.append(static_cast<char16_t>(0)); fResource = ures_openU(nullTerminatedPath.getBuffer(), locale.getName(), &error); } } diff --git a/deps/icu-small/source/common/ruleiter.cpp b/deps/icu-small/source/common/ruleiter.cpp index 690635a9089780..39bea52e78b7b4 100644 --- a/deps/icu-small/source/common/ruleiter.cpp +++ b/deps/icu-small/source/common/ruleiter.cpp @@ -27,12 +27,12 @@ RuleCharacterIterator::RuleCharacterIterator(const UnicodeString& theText, const text(theText), pos(thePos), sym(theSym), - buf(0), + buf(nullptr), bufPos(0) {} UBool RuleCharacterIterator::atEnd() const { - return buf == 0 && pos.getIndex() == text.length(); + return buf == nullptr && pos.getIndex() == text.length(); } UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCode& ec) { @@ -45,8 +45,8 @@ UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCod c = _current(); _advance(U16_LENGTH(c)); - if (c == SymbolTable::SYMBOL_REF && buf == 0 && - (options & PARSE_VARIABLES) != 0 && sym != 0) { + if (c == SymbolTable::SYMBOL_REF && buf == nullptr && + (options & PARSE_VARIABLES) != 0 && sym != nullptr) { UnicodeString name = sym->parseReference(text, pos, text.length()); // If name is empty there was an isolated SYMBOL_REF; // return it. Caller must be prepared for this. @@ -55,13 +55,13 @@ UChar32 RuleCharacterIterator::next(int32_t options, UBool& isEscaped, UErrorCod } bufPos = 0; buf = sym->lookup(name); - if (buf == 0) { + if (buf == nullptr) { ec = U_UNDEFINED_VARIABLE; return DONE; } // Handle empty variable value if (buf->length() == 0) { - buf = 0; + buf = nullptr; } continue; } @@ -114,7 +114,7 @@ UnicodeString& RuleCharacterIterator::lookahead(UnicodeString& result, int32_t m if (maxLookAhead < 0) { maxLookAhead = 0x7FFFFFFF; } - if (buf != 0) { + if (buf != nullptr) { buf->extract(bufPos, maxLookAhead, result); } else { text.extract(pos.getIndex(), maxLookAhead, result); @@ -135,19 +135,19 @@ UnicodeString& RuleCharacterIterator::toString(UnicodeString& result) const { */ UChar32 RuleCharacterIterator::_current() const { - if (buf != 0) { + if (buf != nullptr) { return buf->char32At(bufPos); } else { int i = pos.getIndex(); - return (i < text.length()) ? text.char32At(i) : (UChar32)DONE; + return (i < text.length()) ? text.char32At(i) : static_cast<UChar32>(DONE); } } void RuleCharacterIterator::_advance(int32_t count) { - if (buf != 0) { + if (buf != nullptr) { bufPos += count; if (bufPos == buf->length()) { - buf = 0; + buf = nullptr; } } else { pos.setIndex(pos.getIndex() + count); diff --git a/deps/icu-small/source/common/ruleiter.h b/deps/icu-small/source/common/ruleiter.h index 41731407da25d7..22dec1e8cc8916 100644 --- a/deps/icu-small/source/common/ruleiter.h +++ b/deps/icu-small/source/common/ruleiter.h @@ -224,7 +224,7 @@ class RuleCharacterIterator : public UMemory { }; inline UBool RuleCharacterIterator::inVariable() const { - return buf != 0; + return buf != nullptr; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/serv.cpp b/deps/icu-small/source/common/serv.cpp index 5248f7c192b81e..3a4aee5797f2df 100644 --- a/deps/icu-small/source/common/serv.cpp +++ b/deps/icu-small/source/common/serv.cpp @@ -424,7 +424,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer return handleDefault(key, actualReturn, status); } - ICUService* ncthis = (ICUService*)this; // cast away semantic const + ICUService* ncthis = const_cast<ICUService*>(this); // cast away semantic const CacheEntry* result = nullptr; { @@ -462,7 +462,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer if (factory != nullptr) { for (int32_t i = 0; i < limit; ++i) { - if (factory == (const ICUServiceFactory*)factories->elementAt(i)) { + if (factory == static_cast<const ICUServiceFactory*>(factories->elementAt(i))) { startIndex = i + 1; break; } @@ -478,7 +478,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer do { currentDescriptor.remove(); key.currentDescriptor(currentDescriptor); - result = (CacheEntry*)serviceCache->get(currentDescriptor); + result = static_cast<CacheEntry*>(serviceCache->get(currentDescriptor)); if (result != nullptr) { break; } @@ -490,7 +490,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer int32_t index = startIndex; while (index < limit) { - ICUServiceFactory* f = (ICUServiceFactory*)factories->elementAt(index++); + ICUServiceFactory* f = static_cast<ICUServiceFactory*>(factories->elementAt(index++)); LocalPointer<UObject> service(f->create(key, this, status)); if (U_FAILURE(status)) { return nullptr; @@ -543,7 +543,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer if (cacheDescriptorList.isValid()) { for (int32_t i = cacheDescriptorList->size(); --i >= 0;) { - UnicodeString* desc = (UnicodeString*)cacheDescriptorList->elementAt(i); + UnicodeString* desc = static_cast<UnicodeString*>(cacheDescriptorList->elementAt(i)); serviceCache->put(*desc, result, status); if (U_FAILURE(status)) { @@ -558,7 +558,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer if (actualReturn != nullptr) { // strip null prefix - if (result->actualDescriptor.indexOf((char16_t)0x2f) == 0) { // U+002f=slash (/) + if (result->actualDescriptor.indexOf(static_cast<char16_t>(0x2f)) == 0) { // U+002f=slash (/) actualReturn->remove(); actualReturn->append(result->actualDescriptor, 1, @@ -618,7 +618,7 @@ ICUService::getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorC break; } - const UnicodeString* id = (const UnicodeString*)e->key.pointer; + const UnicodeString* id = static_cast<const UnicodeString*>(e->key.pointer); if (fallbackKey != nullptr) { if (!fallbackKey->isFallbackOf(*id)) { continue; @@ -644,14 +644,14 @@ ICUService::getVisibleIDMap(UErrorCode& status) const { // must only be called when lock is already held - ICUService* ncthis = (ICUService*)this; // cast away semantic const + ICUService* ncthis = const_cast<ICUService*>(this); // cast away semantic const if (idCache == nullptr) { ncthis->idCache = new Hashtable(status); if (idCache == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else if (factories != nullptr) { for (int32_t pos = factories->size(); --pos >= 0;) { - ICUServiceFactory* f = (ICUServiceFactory*)factories->elementAt(pos); + ICUServiceFactory* f = static_cast<ICUServiceFactory*>(factories->elementAt(pos)); f->updateVisibleIDs(*idCache, status); } if (U_FAILURE(status)) { @@ -679,7 +679,7 @@ ICUService::getDisplayName(const UnicodeString& id, UnicodeString& result, const Mutex mutex(&lock); const Hashtable* map = getVisibleIDMap(status); if (map != nullptr) { - ICUServiceFactory* f = (ICUServiceFactory*)map->get(id); + ICUServiceFactory* f = static_cast<ICUServiceFactory*>(map->get(id)); if (f != nullptr) { f->getDisplayName(id, locale, result); return result; @@ -691,7 +691,7 @@ ICUService::getDisplayName(const UnicodeString& id, UnicodeString& result, const while (fallbackKey != nullptr && fallbackKey->fallback()) { UnicodeString us; fallbackKey->currentID(us); - f = (ICUServiceFactory*)map->get(us); + f = static_cast<ICUServiceFactory*>(map->get(us)); if (f != nullptr) { f->getDisplayName(id, locale, result); delete fallbackKey; @@ -727,7 +727,7 @@ ICUService::getDisplayNames(UVector& result, result.removeAllElements(); result.setDeleter(userv_deleteStringPair); if (U_SUCCESS(status)) { - ICUService* ncthis = (ICUService*)this; // cast away semantic const + ICUService* ncthis = const_cast<ICUService*>(this); // cast away semantic const Mutex mutex(&lock); if (dnCache != nullptr && dnCache->locale != locale) { @@ -749,8 +749,8 @@ ICUService::getDisplayNames(UVector& result, int32_t pos = UHASH_FIRST; const UHashElement* entry = nullptr; while ((entry = m->nextElement(pos)) != nullptr) { - const UnicodeString* id = (const UnicodeString*)entry->key.pointer; - ICUServiceFactory* f = (ICUServiceFactory*)entry->value.pointer; + const UnicodeString* id = static_cast<const UnicodeString*>(entry->key.pointer); + ICUServiceFactory* f = static_cast<ICUServiceFactory*>(entry->value.pointer); UnicodeString dname; f->getDisplayName(*id, locale, dname); if (dname.isBogus()) { @@ -776,11 +776,11 @@ ICUService::getDisplayNames(UVector& result, int32_t pos = UHASH_FIRST; const UHashElement *entry = nullptr; while ((entry = dnCache->cache.nextElement(pos)) != nullptr) { - const UnicodeString* id = (const UnicodeString*)entry->value.pointer; + const UnicodeString* id = static_cast<const UnicodeString*>(entry->value.pointer); if (matchKey != nullptr && !matchKey->isFallbackOf(*id)) { continue; } - const UnicodeString* dn = (const UnicodeString*)entry->key.pointer; + const UnicodeString* dn = static_cast<const UnicodeString*>(entry->key.pointer); StringPair* sp = StringPair::create(*id, *dn, status); result.adoptElement(sp, status); if (U_FAILURE(status)) { diff --git a/deps/icu-small/source/common/servlkf.cpp b/deps/icu-small/source/common/servlkf.cpp index f5bb0418c4e95a..7ca5e7adc94b83 100644 --- a/deps/icu-small/source/common/servlkf.cpp +++ b/deps/icu-small/source/common/servlkf.cpp @@ -76,7 +76,7 @@ LocaleKeyFactory::updateVisibleIDs(Hashtable& result, UErrorCode& status) const const UHashElement* elem = nullptr; int32_t pos = UHASH_FIRST; while ((elem = supported->nextElement(pos)) != nullptr) { - const UnicodeString& id = *((const UnicodeString*)elem->key.pointer); + const UnicodeString& id = *static_cast<const UnicodeString*>(elem->key.pointer); if (!visible) { result.remove(id); } else { diff --git a/deps/icu-small/source/common/servloc.h b/deps/icu-small/source/common/servloc.h index 49d1240905811b..47c8ac38ae27fd 100644 --- a/deps/icu-small/source/common/servloc.h +++ b/deps/icu-small/source/common/servloc.h @@ -422,7 +422,7 @@ class U_COMMON_API ICUResourceBundleFactory : public LocaleKeyFactory ****************************************************************** */ -class U_COMMON_API ICULocaleService : public ICUService +class U_COMMON_API_CLASS ICULocaleService : public ICUService { private: Locale fallbackLocale; @@ -432,17 +432,17 @@ class U_COMMON_API ICULocaleService : public ICUService /** * Construct an ICULocaleService. */ - ICULocaleService(); + U_COMMON_API ICULocaleService(); /** * Construct an ICULocaleService with a name (useful for debugging). */ - ICULocaleService(const UnicodeString& name); + U_COMMON_API ICULocaleService(const UnicodeString& name); /** * Destructor. */ - virtual ~ICULocaleService(); + U_COMMON_API virtual ~ICULocaleService(); #if 0 // redeclare because of overload resolution rules? @@ -462,19 +462,19 @@ class U_COMMON_API ICULocaleService : public ICUService * get(Locale, int, Locale[]) with KIND_ANY for kind and null for * actualReturn. */ - UObject* get(const Locale& locale, UErrorCode& status) const; + U_COMMON_API UObject* get(const Locale& locale, UErrorCode& status) const; /** * Convenience override for callers using locales. This calls * get(Locale, int, Locale[]) with a null actualReturn. */ - UObject* get(const Locale& locale, int32_t kind, UErrorCode& status) const; + U_COMMON_API UObject* get(const Locale& locale, int32_t kind, UErrorCode& status) const; /** * Convenience override for callers using locales. This calls * get(Locale, String, Locale[]) with a null kind. */ - UObject* get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const; + U_COMMON_API UObject* get(const Locale& locale, Locale* actualReturn, UErrorCode& status) const; /** * Convenience override for callers using locales. This uses @@ -482,27 +482,27 @@ class U_COMMON_API ICULocaleService : public ICUService * if actualReturn is not null, returns the actualResult from * getKey (stripping any prefix) into a Locale. */ - UObject* get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const; + U_COMMON_API UObject* get(const Locale& locale, int32_t kind, Locale* actualReturn, UErrorCode& status) const; /** * Convenience override for callers using locales. This calls * registerObject(Object, Locale, int32_t kind, int coverage) * passing KIND_ANY for the kind, and VISIBLE for the coverage. */ - virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status); + U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, UErrorCode& status); /** * Convenience function for callers using locales. This calls * registerObject(Object, Locale, int kind, int coverage) * passing VISIBLE for the coverage. */ - virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status); + U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, UErrorCode& status); /** * Convenience function for callers using locales. This instantiates * a SimpleLocaleKeyFactory, and registers the factory. */ - virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status); + U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const Locale& locale, int32_t kind, int32_t coverage, UErrorCode& status); /** @@ -512,13 +512,13 @@ class U_COMMON_API ICULocaleService : public ICUService * We really need a flag that is understood by all compilers that will suppress the warning about * hidden overrides. */ - virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status) override; + U_COMMON_API virtual URegistryKey registerInstance(UObject* objToAdopt, const UnicodeString& locale, UBool visible, UErrorCode& status) override; /** * Convenience method for callers using locales. This returns the standard * service ID enumeration. */ - virtual StringEnumeration* getAvailableLocales() const; + U_COMMON_API virtual StringEnumeration* getAvailableLocales() const; protected: @@ -526,17 +526,17 @@ class U_COMMON_API ICULocaleService : public ICUService * Return the name of the current fallback locale. If it has changed since this was * last accessed, the service cache is cleared. */ - const UnicodeString& validateFallbackLocale() const; + U_COMMON_API const UnicodeString& validateFallbackLocale() const; /** * Override superclass createKey method. */ - virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const override; + U_COMMON_API virtual ICUServiceKey* createKey(const UnicodeString* id, UErrorCode& status) const override; /** * Additional createKey that takes a kind. */ - virtual ICUServiceKey* createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const; + U_COMMON_API virtual ICUServiceKey* createKey(const UnicodeString* id, int32_t kind, UErrorCode& status) const; friend class ServiceEnumeration; }; diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index 978a956df7c331..33a113896233d6 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -179,7 +179,7 @@ class ServiceEnumeration : public StringEnumeration { length = other._ids.size(); for(i = 0; i < length; ++i) { - LocalPointer<UnicodeString> clonedId(((UnicodeString *)other._ids.elementAt(i))->clone(), status); + LocalPointer<UnicodeString> clonedId(static_cast<UnicodeString*>(other._ids.elementAt(i))->clone(), status); _ids.adoptElement(clonedId.orphan(), status); } @@ -228,7 +228,7 @@ class ServiceEnumeration : public StringEnumeration { virtual const UnicodeString* snext(UErrorCode& status) override { if (upToDate(status) && (_pos < _ids.size())) { - return (const UnicodeString*)_ids[_pos++]; + return static_cast<const UnicodeString*>(_ids[_pos++]); } return nullptr; } @@ -263,7 +263,7 @@ const UnicodeString& ICULocaleService::validateFallbackLocale() const { const Locale& loc = Locale::getDefault(); - ICULocaleService* ncThis = (ICULocaleService*)this; + ICULocaleService* ncThis = const_cast<ICULocaleService*>(this); static UMutex llock; { Mutex mutex(&llock); diff --git a/deps/icu-small/source/common/servnotf.cpp b/deps/icu-small/source/common/servnotf.cpp index b2ad663a488a74..3106152467ff93 100644 --- a/deps/icu-small/source/common/servnotf.cpp +++ b/deps/icu-small/source/common/servnotf.cpp @@ -56,7 +56,7 @@ ICUNotifier::addListener(const EventListener* l, UErrorCode& status) listeners = lpListeners.orphan(); } else { for (int i = 0, e = listeners->size(); i < e; ++i) { - const EventListener* el = (const EventListener*)(listeners->elementAt(i)); + const EventListener* el = static_cast<const EventListener*>(listeners->elementAt(i)); if (l == el) { return; } @@ -88,7 +88,7 @@ ICUNotifier::removeListener(const EventListener *l, UErrorCode& status) if (listeners != nullptr) { // identity equality check for (int i = 0, e = listeners->size(); i < e; ++i) { - const EventListener* el = (const EventListener*)listeners->elementAt(i); + const EventListener* el = static_cast<const EventListener*>(listeners->elementAt(i)); if (l == el) { listeners->removeElementAt(i); if (listeners->size() == 0) { @@ -109,7 +109,7 @@ ICUNotifier::notifyChanged() Mutex lmx(¬ifyLock); if (listeners != nullptr) { for (int i = 0, e = listeners->size(); i < e; ++i) { - EventListener* el = (EventListener*)listeners->elementAt(i); + EventListener* el = static_cast<EventListener*>(listeners->elementAt(i)); notifyListener(*el); } } diff --git a/deps/icu-small/source/common/servrbf.cpp b/deps/icu-small/source/common/servrbf.cpp index a4feca2c3b00b9..7f130d55aa502c 100644 --- a/deps/icu-small/source/common/servrbf.cpp +++ b/deps/icu-small/source/common/servrbf.cpp @@ -61,8 +61,8 @@ ICUResourceBundleFactory::handleCreate(const Locale& loc, int32_t /* kind */, co // who made this change? -- dlf char pkg[20]; int32_t length; - length=_bundleName.extract(0, INT32_MAX, pkg, (int32_t)sizeof(pkg), US_INV); - if(length>=(int32_t)sizeof(pkg)) { + length = _bundleName.extract(0, INT32_MAX, pkg, static_cast<int32_t>(sizeof(pkg)), US_INV); + if (length >= static_cast<int32_t>(sizeof(pkg))) { return nullptr; } return new ResourceBundle(pkg, loc, status); diff --git a/deps/icu-small/source/common/sharedobject.h b/deps/icu-small/source/common/sharedobject.h index 5532ec48d88628..e9d257a11afb69 100644 --- a/deps/icu-small/source/common/sharedobject.h +++ b/deps/icu-small/source/common/sharedobject.h @@ -51,28 +51,28 @@ class U_COMMON_API UnifiedCacheBase : public UObject { * Either stack-allocate, use LocalPointer, or use addRef()/removeRef(). * Sharing requires reference-counting. */ -class U_COMMON_API SharedObject : public UObject { +class U_COMMON_API_CLASS SharedObject : public UObject { public: /** Initializes totalRefCount, softRefCount to 0. */ - SharedObject() : + U_COMMON_API SharedObject() : softRefCount(0), hardRefCount(0), cachePtr(nullptr) {} /** Initializes totalRefCount, softRefCount to 0. */ - SharedObject(const SharedObject &other) : + U_COMMON_API SharedObject(const SharedObject &other) : UObject(other), softRefCount(0), hardRefCount(0), cachePtr(nullptr) {} - virtual ~SharedObject(); + U_COMMON_API virtual ~SharedObject(); /** * Increments the number of hard references to this object. Thread-safe. * Not for use from within the Unified Cache implementation. */ - void addRef() const; + U_COMMON_API void addRef() const; /** * Decrements the number of hard references to this object, and @@ -81,32 +81,32 @@ class U_COMMON_API SharedObject : public UObject { * * Not for use from within the UnifiedCache implementation. */ - void removeRef() const; + U_COMMON_API void removeRef() const; /** * Returns the number of hard references for this object. * Uses a memory barrier. */ - int32_t getRefCount() const; + U_COMMON_API int32_t getRefCount() const; /** * If noHardReferences() == true then this object has no hard references. * Must be called only from within the internals of UnifiedCache. */ - inline UBool noHardReferences() const { return getRefCount() == 0; } + U_COMMON_API inline UBool noHardReferences() const { return getRefCount() == 0; } /** * If hasHardReferences() == true then this object has hard references. * Must be called only from within the internals of UnifiedCache. */ - inline UBool hasHardReferences() const { return getRefCount() != 0; } + U_COMMON_API inline UBool hasHardReferences() const { return getRefCount() != 0; } /** * Deletes this object if it has no references. * Available for non-cached SharedObjects only. Ownership of cached objects * is with the UnifiedCache, which is solely responsible for eviction and deletion. */ - void deleteIfZeroRefCount() const; + U_COMMON_API void deleteIfZeroRefCount() const; /** diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index 16256270727e8d..66074938943e7d 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -73,7 +73,7 @@ UBool SimpleFormatter::applyPatternMinMaxArguments( const char16_t *patternBuffer = pattern.getBuffer(); int32_t patternLength = pattern.length(); // Reserve the first char for the number of arguments. - compiledPattern.setTo((char16_t)0); + compiledPattern.setTo(static_cast<char16_t>(0)); int32_t textLength = 0; int32_t maxArg = -1; UBool inQuote = false; @@ -98,7 +98,7 @@ UBool SimpleFormatter::applyPatternMinMaxArguments( } else if (!inQuote && c == OPEN_BRACE) { if (textLength > 0) { compiledPattern.setCharAt(compiledPattern.length() - textLength - 1, - (char16_t)(ARG_NUM_LIMIT + textLength)); + static_cast<char16_t>(ARG_NUM_LIMIT + textLength)); textLength = 0; } int32_t argNumber; @@ -129,7 +129,7 @@ UBool SimpleFormatter::applyPatternMinMaxArguments( if (argNumber > maxArg) { maxArg = argNumber; } - compiledPattern.append((char16_t)argNumber); + compiledPattern.append(static_cast<char16_t>(argNumber)); continue; } // else: c is part of literal text // Append c and track the literal-text segment length. @@ -144,14 +144,14 @@ UBool SimpleFormatter::applyPatternMinMaxArguments( } if (textLength > 0) { compiledPattern.setCharAt(compiledPattern.length() - textLength - 1, - (char16_t)(ARG_NUM_LIMIT + textLength)); + static_cast<char16_t>(ARG_NUM_LIMIT + textLength)); } int32_t argCount = maxArg + 1; if (argCount < min || max < argCount) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return false; } - compiledPattern.setCharAt(0, (char16_t)argCount); + compiledPattern.setCharAt(0, static_cast<char16_t>(argCount)); return true; } diff --git a/deps/icu-small/source/common/static_unicode_sets.cpp b/deps/icu-small/source/common/static_unicode_sets.cpp index 0db5ea000d4a54..18659761c97f43 100644 --- a/deps/icu-small/source/common/static_unicode_sets.cpp +++ b/deps/icu-small/source/common/static_unicode_sets.cpp @@ -187,7 +187,13 @@ void U_CALLCONV initNumberParseUniSets(UErrorCode& status) { U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr); U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr); + // The following don't currently have parseLenients in data. + U_ASSERT(gUnicodeSets[INFINITY_SIGN] == nullptr); gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status); + U_ASSERT(gUnicodeSets[APPROXIMATELY_SIGN] == nullptr); + // This set of characters was manually curated from the + // values of the approximatelySign element of CLDR common/main/*.xml files. + gUnicodeSets[APPROXIMATELY_SIGN] = new UnicodeSet(u"[∼~≈≃約]", status); if (U_FAILURE(status)) { return; } U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr); diff --git a/deps/icu-small/source/common/static_unicode_sets.h b/deps/icu-small/source/common/static_unicode_sets.h index 5d90ce5908de98..6441ea56c973f8 100644 --- a/deps/icu-small/source/common/static_unicode_sets.h +++ b/deps/icu-small/source/common/static_unicode_sets.h @@ -56,6 +56,7 @@ enum Key { PERCENT_SIGN, PERMILLE_SIGN, INFINITY_SIGN, + APPROXIMATELY_SIGN, // Currency Symbols DOLLAR_SIGN, diff --git a/deps/icu-small/source/common/stringtriebuilder.cpp b/deps/icu-small/source/common/stringtriebuilder.cpp index 2a40dc88fd878a..68670390628911 100644 --- a/deps/icu-small/source/common/stringtriebuilder.cpp +++ b/deps/icu-small/source/common/stringtriebuilder.cpp @@ -328,7 +328,7 @@ StringTrieBuilder::registerNode(Node *newNode, UErrorCode &errorCode) { const UHashElement *old=uhash_find(nodes, newNode); if(old!=nullptr) { delete newNode; - return (Node *)old->key.pointer; + return static_cast<Node*>(old->key.pointer); } // If uhash_puti() returns a non-zero value from an equivalent, previously // registered node, then uhash_find() failed to find that and we will leak newNode. @@ -352,7 +352,7 @@ StringTrieBuilder::registerFinalValue(int32_t value, UErrorCode &errorCode) { FinalValueNode key(value); const UHashElement *old=uhash_find(nodes, &key); if(old!=nullptr) { - return (Node *)old->key.pointer; + return static_cast<Node*>(old->key.pointer); } Node *newNode=new FinalValueNode(value); if(newNode==nullptr) { @@ -375,12 +375,12 @@ StringTrieBuilder::registerFinalValue(int32_t value, UErrorCode &errorCode) { int32_t StringTrieBuilder::hashNode(const void *node) { - return ((const Node *)node)->hashCode(); + return static_cast<const Node*>(node)->hashCode(); } UBool StringTrieBuilder::equalNodes(const void *left, const void *right) { - return *(const Node *)left==*(const Node *)right; + return *static_cast<const Node*>(left) == *static_cast<const Node*>(right); } bool diff --git a/deps/icu-small/source/common/ubidi.cpp b/deps/icu-small/source/common/ubidi.cpp index fcf82fa97a8c89..400e049d781a98 100644 --- a/deps/icu-small/source/common/ubidi.cpp +++ b/deps/icu-small/source/common/ubidi.cpp @@ -304,7 +304,7 @@ ubidi_setReorderingMode(UBiDi *pBiDi, UBiDiReorderingMode reorderingMode) UPRV_N if ((pBiDi!=nullptr) && (reorderingMode >= UBIDI_REORDER_DEFAULT) && (reorderingMode < UBIDI_REORDER_COUNT)) { pBiDi->reorderingMode = reorderingMode; - pBiDi->isInverse = (UBool)(reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L); + pBiDi->isInverse = reorderingMode == UBIDI_REORDER_INVERSE_NUMBERS_AS_L; } } @@ -381,7 +381,7 @@ firstL_R_AL(UBiDi *pBiDi) { for(i=0; i<length; ) { /* i is incremented by U16_NEXT */ U16_NEXT(text, i, length, uchar); - dirProp=(DirProp)ubidi_getCustomizedClass(pBiDi, uchar); + dirProp = static_cast<DirProp>(ubidi_getCustomizedClass(pBiDi, uchar)); if(result==ON) { if(dirProp==L || dirProp==R || dirProp==AL) { result=dirProp; @@ -436,13 +436,13 @@ getDirProps(UBiDi *pBiDi) { UBool isDefaultLevel=IS_DEFAULT_LEVEL(pBiDi->paraLevel); /* for inverse BiDi, the default para level is set to RTL if there is a strong R or AL character at either end of the text */ - UBool isDefaultLevelInverse=isDefaultLevel && (UBool) - (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || - pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL); + UBool isDefaultLevelInverse = isDefaultLevel && static_cast<UBool>( + pBiDi->reorderingMode == UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode == UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL); int32_t lastArabicPos=-1; int32_t controlCount=0; - UBool removeBiDiControls = (UBool)(pBiDi->reorderingOptions & - UBIDI_OPTION_REMOVE_CONTROLS); + UBool removeBiDiControls = + static_cast<UBool>(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS); enum State { NOT_SEEKING_STRONG, /* 0: not contextual paraLevel, not after FSI */ @@ -676,7 +676,7 @@ bracketInit(UBiDi *pBiDi, BracketData *bd) { bd->isoRuns[0].level=GET_PARALEVEL(pBiDi, 0); UBiDiLevel t = GET_PARALEVEL(pBiDi, 0) & 1; bd->isoRuns[0].lastStrong = bd->isoRuns[0].lastBase = t; - bd->isoRuns[0].contextDir = (UBiDiDirection)t; + bd->isoRuns[0].contextDir = static_cast<UBiDiDirection>(t); bd->isoRuns[0].contextPos=0; if(pBiDi->openingsMemory) { bd->openings=pBiDi->openingsMemory; @@ -696,7 +696,7 @@ bracketProcessB(BracketData *bd, UBiDiLevel level) { bd->isoRuns[0].limit=0; bd->isoRuns[0].level=level; bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=level&1; - bd->isoRuns[0].contextDir=(UBiDiDirection)(level&1); + bd->isoRuns[0].contextDir = static_cast<UBiDiDirection>(level & 1); bd->isoRuns[0].contextPos=0; } @@ -713,8 +713,8 @@ bracketProcessBoundary(BracketData *bd, int32_t lastCcPos, pLastIsoRun->limit=pLastIsoRun->start; pLastIsoRun->level=embeddingLevel; pLastIsoRun->lastStrong=pLastIsoRun->lastBase=contextLevel&1; - pLastIsoRun->contextDir=(UBiDiDirection)(contextLevel&1); - pLastIsoRun->contextPos=(UBiDiDirection)lastCcPos; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(contextLevel & 1); + pLastIsoRun->contextPos = static_cast<UBiDiDirection>(lastCcPos); } /* LRI or RLI */ @@ -729,7 +729,7 @@ bracketProcessLRI_RLI(BracketData *bd, UBiDiLevel level) { pLastIsoRun->start=pLastIsoRun->limit=lastLimit; pLastIsoRun->level=level; pLastIsoRun->lastStrong=pLastIsoRun->lastBase=level&1; - pLastIsoRun->contextDir=(UBiDiDirection)(level&1); + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(level & 1); pLastIsoRun->contextPos=0; } @@ -803,7 +803,7 @@ bracketProcessClosing(BracketData *bd, int32_t openIdx, int32_t position) { UBool stable; DirProp newProp; pOpening=&bd->openings[openIdx]; - direction=(UBiDiDirection)(pLastIsoRun->level&1); + direction = static_cast<UBiDiDirection>(pLastIsoRun->level & 1); stable=true; /* assume stable until proved otherwise */ /* The stable flag is set when brackets are paired and their @@ -896,7 +896,7 @@ bracketProcessChar(BracketData *bd, int32_t position) { break; } pLastIsoRun->lastBase=ON; - pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(newProp); pLastIsoRun->contextPos=position; level=bd->pBiDi->levels[position]; if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ @@ -944,14 +944,14 @@ bracketProcessChar(BracketData *bd, int32_t position) { dirProps[position]=newProp; pLastIsoRun->lastBase=newProp; pLastIsoRun->lastStrong=newProp; - pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(newProp); pLastIsoRun->contextPos=position; } else if(dirProp<=R || dirProp==AL) { newProp= static_cast<DirProp>(DIR_FROM_STRONG(dirProp)); pLastIsoRun->lastBase=dirProp; pLastIsoRun->lastStrong=dirProp; - pLastIsoRun->contextDir=(UBiDiDirection)newProp; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(newProp); pLastIsoRun->contextPos=position; } else if(dirProp==EN) { @@ -960,7 +960,7 @@ bracketProcessChar(BracketData *bd, int32_t position) { newProp=L; /* W7 */ if(!bd->isNumbersSpecial) dirProps[position]=ENL; - pLastIsoRun->contextDir=(UBiDiDirection)L; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(L); pLastIsoRun->contextPos=position; } else { @@ -969,14 +969,14 @@ bracketProcessChar(BracketData *bd, int32_t position) { dirProps[position]=AN; /* W2 */ else dirProps[position]=ENR; - pLastIsoRun->contextDir=(UBiDiDirection)R; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(R); pLastIsoRun->contextPos=position; } } else if(dirProp==AN) { newProp=R; /* N0 */ pLastIsoRun->lastBase=AN; - pLastIsoRun->contextDir=(UBiDiDirection)R; + pLastIsoRun->contextDir = static_cast<UBiDiDirection>(R); pLastIsoRun->contextPos=position; } else if(dirProp==NSM) { @@ -1177,10 +1177,10 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { levels[i]=previousLevel; if (dirProp==LRE || dirProp==LRO) /* least greater even level */ - newLevel=(UBiDiLevel)((embeddingLevel+2)&~(UBIDI_LEVEL_OVERRIDE|1)); + newLevel = static_cast<UBiDiLevel>((embeddingLevel + 2) & ~(UBIDI_LEVEL_OVERRIDE | 1)); else /* least greater odd level */ - newLevel=(UBiDiLevel)((NO_OVERRIDE(embeddingLevel)+1)|1); + newLevel = static_cast<UBiDiLevel>((NO_OVERRIDE(embeddingLevel) + 1) | 1); if(newLevel<=UBIDI_MAX_EXPLICIT_LEVEL && overflowIsolateCount==0 && overflowEmbeddingCount==0) { lastCcPos=i; @@ -1213,7 +1213,7 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { if(stackLast>0 && stack[stackLast]<ISOLATE) { /* not an isolate entry */ lastCcPos=i; stackLast--; - embeddingLevel=(UBiDiLevel)stack[stackLast]; + embeddingLevel = static_cast<UBiDiLevel>(stack[stackLast]); } break; case LRI: @@ -1229,10 +1229,10 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { /* (X5a, X5b) */ if(dirProp==LRI) /* least greater even level */ - newLevel=(UBiDiLevel)((embeddingLevel+2)&~(UBIDI_LEVEL_OVERRIDE|1)); + newLevel = static_cast<UBiDiLevel>((embeddingLevel + 2) & ~(UBIDI_LEVEL_OVERRIDE | 1)); else /* least greater odd level */ - newLevel=(UBiDiLevel)((NO_OVERRIDE(embeddingLevel)+1)|1); + newLevel = static_cast<UBiDiLevel>((NO_OVERRIDE(embeddingLevel) + 1) | 1); if(newLevel<=UBIDI_MAX_EXPLICIT_LEVEL && overflowIsolateCount==0 && overflowEmbeddingCount==0) { flags|=DIRPROP_FLAG(dirProp); @@ -1276,7 +1276,7 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { } else /* make it WS so that it is handled by adjustWSLevels() */ dirProps[i]=WS; - embeddingLevel=(UBiDiLevel)stack[stackLast]&~ISOLATE; + embeddingLevel = static_cast<UBiDiLevel>(stack[stackLast]) & ~ISOLATE; flags|=(DIRPROP_FLAG(ON)|DIRPROP_FLAG_LR(embeddingLevel)); previousLevel=embeddingLevel; levels[i]=NO_OVERRIDE(embeddingLevel); @@ -1315,7 +1315,7 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { previousLevel=embeddingLevel; levels[i]=embeddingLevel; if(!bracketProcessChar(&bracketData, i)) - return (UBiDiDirection)-1; + return static_cast<UBiDiDirection>(-1); /* the dirProp may have been changed in bracketProcessChar() */ flags|=DIRPROP_FLAG(dirProps[i]); break; @@ -1386,7 +1386,7 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { } else { // Treat explicit level 0 as a wildcard for the paragraph level. // Avoid making the caller guess what the paragraph level would be. - level = (UBiDiLevel)currentParaLevel; + level = static_cast<UBiDiLevel>(currentParaLevel); levels[i] = level | overrideFlag; } } else { @@ -1868,7 +1868,7 @@ processPropertySeq(UBiDi *pBiDi, LevState *pLevState, uint8_t _prop, int32_t start0, k; start0=start; /* save original start position */ - oldStateSeq=(uint8_t)pLevState->state; + oldStateSeq = static_cast<uint8_t>(pLevState->state); cell=(*pImpTab)[oldStateSeq][_prop]; pLevState->state=GET_STATE(cell); /* isolate the new state */ actionSeq=(*pImpAct)[GET_ACTION(cell)]; /* isolate the action */ @@ -2076,7 +2076,7 @@ lastL_R_AL(UBiDi *pBiDi) { for(i=length; i>0; ) { /* i is decremented by U16_PREV */ U16_PREV(text, 0, i, uchar); - dirProp=(DirProp)ubidi_getCustomizedClass(pBiDi, uchar); + dirProp = static_cast<DirProp>(ubidi_getCustomizedClass(pBiDi, uchar)); if(dirProp==L) { return DirProp_L; } @@ -2104,7 +2104,7 @@ firstL_R_AL_EN_AN(UBiDi *pBiDi) { for(i=0; i<length; ) { /* i is incremented by U16_NEXT */ U16_NEXT(text, i, length, uchar); - dirProp=(DirProp)ubidi_getCustomizedClass(pBiDi, uchar); + dirProp = static_cast<DirProp>(ubidi_getCustomizedClass(pBiDi, uchar)); if(dirProp==L) { return DirProp_L; } @@ -2142,18 +2142,18 @@ resolveImplicitLevels(UBiDi *pBiDi, * actions) and different levels state tables (maybe very similar to the * LTR corresponding ones. */ - inverseRTL=(UBool) - ((start<pBiDi->lastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) && - (pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_LIKE_DIRECT || - pBiDi->reorderingMode==UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)); + inverseRTL = + static_cast<UBool>((start < pBiDi->lastArabicPos) && (GET_PARALEVEL(pBiDi, start) & 1) && + (pBiDi->reorderingMode == UBIDI_REORDER_INVERSE_LIKE_DIRECT || + pBiDi->reorderingMode == UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)); /* initialize for property and levels state tables */ levState.startL2EN=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ levState.lastStrongRTL=-1; /* used for INVERSE_LIKE_DIRECT_WITH_MARKS */ levState.runStart=start; levState.runLevel=pBiDi->levels[start]; - levState.pImpTab=(const ImpTab*)((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel&1]; - levState.pImpAct=(const ImpAct*)((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel&1]; + levState.pImpTab = static_cast<const ImpTab*>(((pBiDi->pImpTabPair)->pImpTab)[levState.runLevel & 1]); + levState.pImpAct = static_cast<const ImpAct*>(((pBiDi->pImpTabPair)->pImpAct)[levState.runLevel & 1]); if(start==0 && pBiDi->proLength>0) { DirProp lastStrong=lastL_R_AL(pBiDi); if(lastStrong!=DirProp_ON) { @@ -2391,8 +2391,8 @@ setParaRunsOnly(UBiDi *pBiDi, const char16_t *text, int32_t length, goto cleanup3; } visualMap=runsOnlyMemory; - visualText=(char16_t *)&visualMap[length]; - saveLevels=(UBiDiLevel *)&visualText[length]; + visualText = reinterpret_cast<char16_t*>(&visualMap[length]); + saveLevels = reinterpret_cast<UBiDiLevel*>(&visualText[length]); saveOptions=pBiDi->reorderingOptions; if(saveOptions & UBIDI_OPTION_INSERT_MARKS) { pBiDi->reorderingOptions&=~UBIDI_OPTION_INSERT_MARKS; diff --git a/deps/icu-small/source/common/ubidi_props.cpp b/deps/icu-small/source/common/ubidi_props.cpp index 8f3f6a65c4b399..1ac4ab12a2c395 100644 --- a/deps/icu-small/source/common/ubidi_props.cpp +++ b/deps/icu-small/source/common/ubidi_props.cpp @@ -51,7 +51,7 @@ _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32 (void)end; (void)value; /* add the start code point to the USet */ - const USetAdder *sa=(const USetAdder *)context; + const USetAdder* sa = static_cast<const USetAdder*>(context); sa->add(sa->set, start); return true; } @@ -139,7 +139,7 @@ ubidi_getClass(UChar32 c) { U_CFUNC UBool ubidi_isMirrored(UChar32 c) { uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT); + return UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT); } static UChar32 @@ -183,13 +183,13 @@ ubidi_getMirror(UChar32 c) { U_CFUNC UBool ubidi_isBidiControl(UChar32 c) { uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT); + return UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT); } U_CFUNC UBool ubidi_isJoinControl(UChar32 c) { uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c); - return (UBool)UBIDI_GET_FLAG(props, UBIDI_JOIN_CONTROL_SHIFT); + return UBIDI_GET_FLAG(props, UBIDI_JOIN_CONTROL_SHIFT); } U_CFUNC UJoiningType diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index f85dc0967565a4..90d1fba117e5fc 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -9,710 +9,728 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={0xf,1,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0x11,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6ba0,0x65b0,0x28,0x620,0x8cc,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6702b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x703c,0x68a8,0x28,0x620,0x8cc,0x10ac0,0x10ec8,0,0,0,0,0,0,0,0x6902b6}; -static const uint16_t ubidi_props_trieIndex[13008]={ -0x387,0x38f,0x397,0x39f,0x3b7,0x3bf,0x3c7,0x3cf,0x3a7,0x3af,0x3a7,0x3af,0x3a7,0x3af,0x3a7,0x3af, -0x3a7,0x3af,0x3a7,0x3af,0x3d5,0x3dd,0x3e5,0x3ed,0x3f5,0x3fd,0x3f9,0x401,0x409,0x411,0x40c,0x414, -0x3a7,0x3af,0x3a7,0x3af,0x41c,0x424,0x3a7,0x3af,0x3a7,0x3af,0x3a7,0x3af,0x42a,0x432,0x43a,0x442, -0x44a,0x452,0x45a,0x462,0x468,0x470,0x478,0x480,0x488,0x490,0x496,0x49e,0x4a6,0x4ae,0x4b6,0x4be, -0x4ca,0x4c6,0x4d2,0x4da,0x4e2,0x4f2,0x4f9,0x4ea,0x501,0x503,0x50b,0x513,0x51b,0x51c,0x524,0x52c, -0x534,0x51c,0x53c,0x541,0x534,0x51c,0x549,0x551,0x51b,0x559,0x561,0x513,0x569,0x3a7,0x571,0x575, -0x57d,0x57f,0x587,0x58f,0x51b,0x597,0x59f,0x513,0x41e,0x5a3,0x524,0x513,0x51b,0x3a7,0x5ab,0x3a7, -0x3a7,0x5b1,0x5b9,0x3a7,0x3a7,0x5bd,0x5c5,0x3a7,0x5c9,0x5d0,0x3a7,0x5d8,0x5e0,0x5e7,0x568,0x3a7, -0x3a7,0x5ef,0x5f7,0x5ff,0x607,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x60f,0x3a7,0x617,0x3a7,0x3a7,0x3a7, -0x61f,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x627,0x3a7,0x3a7,0x3a7,0x62f,0x528,0x528,0x528,0x3a7,0x635,0x63d,0x617, -0x653,0x645,0x645,0x65b,0x662,0x64b,0x3a7,0x3a7,0x3a7,0x66a,0x672,0x3a7,0x3a7,0x3a7,0x674,0x67c, -0x684,0x3a7,0x68b,0x693,0x3a7,0x69b,0x4fe,0x3a7,0x558,0x6a3,0x569,0x6ab,0x41e,0x6b3,0x3a7,0x6ba, -0x3a7,0x6bf,0x3a7,0x3a7,0x3a7,0x3a7,0x6c5,0x6cd,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3f5,0x3f5, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x6d4,0x6dc,0x6e0, -0x6f8,0x6fe,0x6e8,0x6f0,0x706,0x70e,0x712,0x5ea,0x71a,0x722,0x72a,0x3a7,0x732,0x67c,0x67c,0x67c, -0x742,0x74a,0x752,0x75a,0x75f,0x767,0x76f,0x73a,0x777,0x77f,0x3a7,0x785,0x78c,0x67c,0x67c,0x67c, -0x67c,0x595,0x792,0x67c,0x79a,0x3a7,0x3a7,0x679,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c, -0x67c,0x67c,0x67c,0x67c,0x67c,0x7a2,0x67c,0x67c,0x67c,0x67c,0x67c,0x7a8,0x67c,0x67c,0x7b0,0x7b8, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x67c,0x67c,0x67c,0x67c,0x7c8,0x7d0,0x7d8,0x7c0, -0x7e8,0x7f0,0x7f8,0x7ff,0x806,0x80e,0x812,0x7e0,0x67c,0x67c,0x67c,0x81a,0x820,0x67c,0x67c,0x826, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x82e,0x3a7,0x3a7,0x3a7,0x836,0x3a7,0x3a7,0x3a7,0x3f5, -0x83e,0x846,0x849,0x3a7,0x851,0x67c,0x67c,0x67f,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x858,0x85e, -0x86e,0x866,0x3a7,0x3a7,0x876,0x61f,0x3a7,0x3ce,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x67c,0x87e, -0x3dc,0x3a7,0x85e,0x882,0x3a7,0x88a,0x892,0x3a7,0x3a7,0x3a7,0x3a7,0x896,0x3a7,0x3a7,0x674,0x3cd, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x67c,0x67c, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x85e,0x67c,0x595,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x89d,0x3a7,0x3a7,0x8a2,0x8aa,0x3a7,0x3a7,0x5cb,0x67c,0x673,0x3a7,0x3a7,0x8b2,0x3a7,0x3a7,0x3a7, -0x8ba,0x8c1,0x645,0x8c9,0x3a7,0x3a7,0x5a1,0x8d1,0x3a7,0x8d9,0x8e0,0x3a7,0x501,0x8e5,0x3a7,0x51a, -0x3a7,0x8ed,0x8f5,0x51c,0x3a7,0x8f9,0x51b,0x901,0x3a7,0x3a7,0x3a7,0x907,0x3a7,0x3a7,0x3a7,0x90e, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x922,0x916,0x91a,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6, -0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x92a,0x932,0x4a6,0x4a6,0x4a6,0x937,0x93b, -0x943,0x94b,0x94f,0x957,0x4a6,0x4a6,0x4a6,0x95b,0x963,0x397,0x96b,0x973,0x3a7,0x3a7,0x3a7,0x97b, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0xe9c,0xe9c,0xedc,0xf1c,0xe9c,0xe9c,0xe9c,0xe9c,0xe9c,0xe9c,0xf54,0xf94,0xfd4,0xfe4,0x1024,0x1030, -0xe9c,0xe9c,0x1070,0xe9c,0xe9c,0xe9c,0x10a8,0x10e8,0x1128,0x1168,0x11a0,0x11e0,0x1220,0x1258,0x1298,0x12d8, -0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb68,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xba8,0x1a0,0xbce,0xc09,0xc49,0xc89,0xcc9,0xd09,0xd49, +static const uint16_t ubidi_props_trieIndex[13388]={ +0x395,0x39d,0x3a5,0x3ad,0x3c5,0x3cd,0x3d5,0x3dd,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd, +0x3b5,0x3bd,0x3b5,0x3bd,0x3e3,0x3eb,0x3f3,0x3fb,0x403,0x40b,0x407,0x40f,0x417,0x41f,0x41a,0x422, +0x3b5,0x3bd,0x3b5,0x3bd,0x42a,0x432,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd,0x438,0x440,0x448,0x450, +0x458,0x460,0x468,0x470,0x476,0x47e,0x486,0x48e,0x496,0x49e,0x4a4,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc, +0x4d8,0x4d4,0x4e0,0x4e8,0x4f0,0x500,0x507,0x4f8,0x50f,0x511,0x519,0x521,0x529,0x52a,0x532,0x53a, +0x542,0x52a,0x54a,0x54f,0x542,0x52a,0x557,0x55f,0x529,0x567,0x56f,0x521,0x577,0x3b5,0x57f,0x583, +0x58b,0x58d,0x595,0x59d,0x529,0x5a5,0x5ad,0x521,0x42c,0x5b1,0x532,0x521,0x529,0x3b5,0x5b9,0x3b5, +0x3b5,0x5bf,0x5c7,0x3b5,0x3b5,0x5cb,0x5d3,0x3b5,0x5d7,0x5de,0x3b5,0x5e6,0x5ee,0x5f5,0x576,0x3b5, +0x3b5,0x5fd,0x605,0x60d,0x615,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x61d,0x3b5,0x625,0x3b5,0x3b5,0x3b5, +0x62d,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x635,0x3b5,0x3b5,0x3b5,0x63d,0x536,0x536,0x536,0x3b5,0x643,0x64b,0x625, +0x661,0x653,0x653,0x669,0x670,0x659,0x3b5,0x3b5,0x3b5,0x678,0x680,0x3b5,0x3b5,0x3b5,0x682,0x68a, +0x692,0x3b5,0x699,0x6a1,0x3b5,0x6a9,0x6b6,0x6ae,0x566,0x6be,0x577,0x6c6,0x42c,0x6ce,0x3b5,0x6d5, +0x3b5,0x6da,0x3b5,0x3b5,0x3b5,0x3b5,0x6e0,0x6e8,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x403,0x403, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x6ef,0x6f7,0x6fb, +0x713,0x719,0x703,0x70b,0x721,0x729,0x72d,0x5f8,0x735,0x73d,0x745,0x3b5,0x74d,0x68a,0x68a,0x68a, +0x75d,0x765,0x76d,0x775,0x77a,0x782,0x78a,0x755,0x792,0x79a,0x3b5,0x7a0,0x7a7,0x68a,0x68a,0x68a, +0x68a,0x79d,0x7ad,0x68a,0x7b5,0x3b5,0x3b5,0x687,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, +0x68a,0x68a,0x68a,0x68a,0x68a,0x7bd,0x68a,0x68a,0x68a,0x68a,0x68a,0x7c3,0x68a,0x68a,0x7cb,0x7d3, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x7e3,0x7eb,0x7f3,0x7db, +0x803,0x80b,0x813,0x81a,0x821,0x829,0x82d,0x7fb,0x68a,0x68a,0x68a,0x835,0x68a,0x68a,0x68a,0x83b, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x843,0x3b5,0x3b5,0x3b5,0x84b,0x3b5,0x3b5,0x3b5,0x403, +0x853,0x85b,0x85e,0x3b5,0x866,0x68a,0x68a,0x68d,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x86d,0x873, +0x883,0x87b,0x3b5,0x3b5,0x88b,0x62d,0x3b5,0x3dc,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x893, +0x3ea,0x3b5,0x873,0x897,0x3b5,0x89f,0x8a7,0x3b5,0x3b5,0x3b5,0x3b5,0x8ab,0x3b5,0x3b5,0x682,0x3db, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x873,0x68a,0x5a3,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x8b2,0x3b5,0x3b5,0x8b7,0x8bf,0x3b5,0x3b5,0x5d9,0x68a,0x681,0x3b5,0x3b5,0x8c7,0x3b5,0x3b5,0x3b5, +0x8cf,0x8d6,0x653,0x8de,0x3b5,0x3b5,0x5af,0x8e6,0x3b5,0x8ee,0x8f5,0x3b5,0x50f,0x8fa,0x3b5,0x528, +0x3b5,0x902,0x90a,0x52a,0x3b5,0x90e,0x529,0x916,0x3b5,0x3b5,0x3b5,0x91c,0x3b5,0x3b5,0x3b5,0x923, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x937,0x92b,0x92f,0x4b4,0x4b4,0x4b4,0x93f,0x4b4, +0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x944,0x94c,0x4b4,0x950,0x4b4,0x956,0x95a, +0x962,0x96a,0x96e,0x976,0x4b4,0x4b4,0x4b4,0x97a,0x982,0x3a5,0x98a,0x992,0x3b5,0x3b5,0x3b5,0x99a, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xed4,0xed4,0xf14,0xf54,0xed4,0xed4,0xed4,0xed4,0xed4,0xed4,0xf8c,0xfcc,0x100c,0x101c,0x105c,0x1068, +0xed4,0xed4,0x10a8,0xed4,0xed4,0xed4,0x10e0,0x1120,0x1160,0x11a0,0x11d8,0x1218,0x1258,0x1290,0x12d0,0x1310, +0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb77,0xba0,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xbe0,0x1a0,0xc06,0xc41,0xc81,0xcc1,0xd01,0xd41,0xd81, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, -0xdc9,0xdd9,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, +0xe01,0xe11,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd89, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x983,0x3a7,0x67c,0x67c,0x98b,0x61f,0x3a7,0x514, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x993,0x3a7,0x3a7,0x3a7,0x99a,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x9a2,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c, -0x9aa,0x9ae,0x43c,0x43c,0x43c,0x43c,0x9be,0x9b6,0x43c,0x9c6,0x43c,0x43c,0x9ce,0x9d4,0x43c,0x43c, -0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x9e4,0x9dc,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c, -0x43c,0x43c,0x43c,0x9ec,0x43c,0x9f4,0x4a6,0x9fc,0x43c,0xa04,0xa0b,0xa11,0xa19,0xa1d,0xa25,0x43c, -0x51b,0xa2d,0xa34,0xa3b,0x41e,0xa43,0x569,0x3a7,0x501,0xa4a,0x3a7,0xa50,0x41e,0xa55,0xa5d,0x3a7, -0x3a7,0xa62,0x51b,0x3a7,0x3a7,0x3a7,0x836,0xa6a,0x41e,0x5a3,0x57e,0xa71,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0xa2d,0xa79,0x3a7,0x3a7,0xa81,0xa89,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xa8d,0xa95,0x3a7, -0x3a7,0xa9d,0x57e,0xaa5,0x3a7,0xaab,0x3a7,0x3a7,0x60f,0xab3,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0xab8,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xabf,0xac7,0x3a7,0x3a7,0x3a7,0xaca,0x57e,0xad2, -0xad6,0xade,0x3a7,0xae5,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0xaec,0x3a7,0x3a7,0xafa,0xaf4,0x3a7,0x3a7,0x3a7,0xb02,0xb0a,0x3a7,0xb0e,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x5a5,0x41e,0x99a,0xb16,0x3a7,0x3a7,0x3a7,0xb23,0xb1e,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0xb2b,0xb33,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xb39, -0x3a7,0xb3f,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0xa51,0x3a7,0xb45,0x3a7,0x3a7,0xb4d,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x535,0xb55,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3f5,0xb5d,0x500,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0xb65,0xb6d,0xb73,0x3a7,0xb79,0x67c,0x67c,0xb81,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x67c,0x67c,0xb89,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xb8f, -0x3a7,0xb96,0x3a7,0xb92,0x3a7,0xb99,0x3a7,0xba1,0xba5,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3f5,0xbad,0x3f5,0xbb4,0xbbb,0xbc3,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xbcb,0xbd3,0x3a7,0x3a7,0xa51,0x3a7,0x3a7, -0x3a7,0x3a7,0xb3f,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xa7d,0x3a7, -0xbd8,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0xbe0,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0xbe8, -0x43c,0xbf0,0xbf0,0xbf7,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c, -0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x91a,0x4a6,0x4a6,0x43c, -0x43c,0x4a6,0x4a6,0xbff,0x43c,0x43c,0x43c,0x43c,0x43c,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6,0x4a6, -0xc07,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x43c,0x67c,0xc0f,0x67c,0x67c,0x67f,0xc14,0xc18, -0x858,0xc20,0x3c9,0x3a7,0xc26,0x3a7,0xc2b,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x783,0x3a7,0x3a7,0x3a7, -0x3a7,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c, -0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0xc33, -0x98b,0x67c,0x67c,0x67c,0xc3a,0x67c,0x67c,0xc41,0xc49,0xc0f,0x67c,0xc51,0x67c,0xc59,0xc5e,0x3a7, -0x3a7,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67c,0x67f,0xc66,0xc6f,0xc73,0xc7b, -0xc6b,0x67c,0x67c,0x67c,0x67c,0xc83,0x67c,0x792,0xc8b,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xc92,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7, -0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0x3a7,0xc92,0xca2,0xc9a,0xc9a,0xc9a,0xca3,0xca3,0xca3, -0xca3,0x3f5,0x3f5,0x3f5,0x3f5,0x3f5,0x3f5,0x3f5,0xcab,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3, -0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3, -0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3, -0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3, -0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0xca3,0x386,0x386,0x386,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4, -4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2, -2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0xa,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12, -0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,6,0xa,4,4, -4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,4,4,2,2, -0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, -0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc1, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x9a2,0x3b5,0x68a,0x68a,0x9aa,0x62d,0x3b5,0x522, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x9b2,0x3b5,0x3b5,0x3b5,0x9b9,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x9c1,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, +0x9c9,0x9cd,0x44a,0x44a,0x44a,0x44a,0x9dd,0x9d5,0x44a,0x9e5,0x44a,0x44a,0x9ed,0x9f3,0x44a,0x44a, +0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0xa03,0x9fb,0xa13,0xa0b,0x44a,0x44a,0x44a,0x44a, +0x44a,0x44a,0x44a,0xa1b,0x44a,0xa23,0xa2b,0x4b7,0x44a,0xa33,0xa3a,0xa40,0xa48,0xa4c,0xa54,0x44a, +0x529,0xa5c,0xa63,0xa6a,0x42c,0xa72,0x577,0x3b5,0x50f,0xa79,0x3b5,0xa7f,0x42c,0xa84,0xa8c,0x3b5, +0x3b5,0xa91,0x529,0x3b5,0x3b5,0x3b5,0x84b,0xa99,0x42c,0x5b1,0x58c,0xaa0,0x3b5,0xaa6,0xaae,0x542, +0x3b5,0xa5c,0xab6,0x3b5,0x3b5,0xabe,0xac6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xaca,0xad2,0x3b5, +0x3b5,0xada,0x58c,0xae2,0x3b5,0xae8,0x3b5,0x3b5,0xaee,0xaf6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xafb,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb02,0xb0a,0x3b5,0x3b5,0x3b5,0xb0d,0x58c,0xb15, +0xb19,0xb21,0x3b5,0xb28,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb30,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xb34,0x3b5,0x3b5,0xb42,0xb3c,0x3b5,0x3b5,0x3b5,0xb4a,0xaec,0x3b5,0xb52,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x5b3,0x42c,0x9b9,0xab7,0x3b5,0x3b5,0x3b5,0xb5f,0xb5a,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xb67,0xb6f,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x8bf, +0xb77,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb7b,0x3b5,0xb81,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xa80,0x3b5,0xb87,0x3b5,0x3b5,0xb8f, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x543,0xb97,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x86d,0xb9b,0x68a,0x68a, +0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xba3,0xbaa,0xbaa,0x403,0xbb2, +0x50e,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xbba,0xbc2,0xbc8,0x3b5, +0xbce,0x68a,0x68a,0xbd6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0xbde,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xbe6,0x3dc,0xbed,0xbf3,0xbe9,0x3d7,0xbf0,0xbe4,0xbfb, +0xbff,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x403,0xc07,0x403,0xc0e,0xc15,0xc1d,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0xc25,0xc2d,0x3b5,0x3b5,0xa80,0x3b5,0x3b5,0x3b5,0x3b5,0xb81,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xaba,0x3b5,0xc32,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xc3a,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xc3f,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xc47,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0xc4f,0x44a,0xc57,0xc57,0xc5e,0x44a,0x44a,0x44a,0x44a, +0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, +0x44a,0x44a,0x44a,0x44a,0x92f,0x4b4,0x4b4,0x44a,0x44a,0x4b4,0x4b4,0xc66,0x44a,0x44a,0x44a,0x44a, +0x44a,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x950,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, +0x44a,0x68a,0xc6e,0x68a,0x68a,0x68d,0xc73,0xc77,0x86d,0xc7f,0x3d7,0x3b5,0xc85,0x3b5,0xc8a,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x79e,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, +0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, +0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xc92,0x9aa,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xc99, +0xca1,0xc6e,0x68a,0xca9,0x68a,0xcb1,0xcb6,0xcbe,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, +0x68a,0x68a,0x68a,0x68c,0xcc6,0xcce,0x68a,0xcd5,0xcdd,0x68a,0x68a,0x68a,0x68a,0xce5,0x68a,0x68a, +0xcea,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xcf1,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, +0xcf1,0xd01,0xcf9,0xcf9,0xcf9,0xd02,0xd02,0xd02,0xd02,0x403,0x403,0x403,0x403,0x403,0x403,0x403, +0xd0a,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0x394,0x394,0x394,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,8,7,8, +9,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +7,7,7,8,9,0xa,0xa,4,4,4,0xa,0xa,0x310a,0xf20a,0xa,3, +6,3,6,6,2,2,2,2,2,2,2,2,2,2,6,0xa, +0x500a,0xa,0xd00a,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x510a, +0xa,0xd20a,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x510a, +0xa,0xd20a,0xa,0x12,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x12,0x12,0x12,0x12,0x12,7,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,6,0xa,4,4,4,4,0xa,0xa,0xa,0xa,0,0x900a, +0xa,0xb2,0xa,0xa,4,4,2,2,0xa,0,0xa,0xa,0xa,2,0,0x900a, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0,0,0,0,0, -0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0xa,0xa,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0, +0xa,0xa,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0xa,0,0,0xa,0xa,4, +1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1, +1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,5,5,5,5,5,0xa,0xa, -0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5,5,5,5,5, -5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d, -0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,0xa,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d, -2,2,2,2,2,2,2,2,2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xad, -0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d, +5,5,5,5,5,5,0xa,0xa,0xd,4,4,0xd,6,0xd,0xa,0xa, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd, +0x4d,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d, +0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d, -0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +5,5,5,5,5,5,5,5,5,5,4,5,5,0xd,0x4d,0x4d, +0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,5,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1, +0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d,2,2,2,2,2,2,2,2, +2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xad,0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d, +0x4d,0x8d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1, -1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa, -0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1, -1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1, -0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81, -0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x81,0x81, -0x81,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d, -0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x2d,0x2d,0x2d,0x4d,0xd, -0xd,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0xd,5,5,0xd,0xd,0xd,0xd,0xd,0xd, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xb1,0xb1, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa,0xa,0xa,0x21,1,1,0xb1,1,1, +0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1, +0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41, +0x41,0x41,0x41,0x41,0x81,0x41,0x81,0x81,0x81,0xb1,0xb1,0xb1,1,1,1,1, +0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x2d,0x2d,0x2d,0x4d,0xd,0xd,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d, +5,5,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d, +0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,0,0,0,0,0,0,0,4,0,0,0xb1,0, -0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0, -0,0,0,0,0xb1,0,0,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0xa0,0,0,0,0, -0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0,0,4,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, +0,0,0,4,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, +0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0,0,0, -0,0,0,0,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, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1, +0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4, -0,0xb1,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0,0,0,0,0xa,0,0,0,0xa,0xa,0,0, +0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0,0,0xb1,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,0,0,0,0,0x310a, +0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,4,0,0xb1,0,0,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, +0xb1,0xb1,0x12,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0, +0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, -0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9, -0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -2,0,0,0,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0, -9,9,9,9,9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1, +0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, -2,2,3,3,0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa, -0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa, -0,0xa,0,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,0,0xa,0xa,0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0, -0,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a, -0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa, -0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa, -0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa, -0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa, -0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a, -0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0, +0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0, +0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa, +6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2, +0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0, +2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9, +9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae, +0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,3,3, +0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0, +0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0, +0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, +0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a, +0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a, +0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a, +0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, +0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a, +0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a, -0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a, -0x900a,0xa,0x100a,0x900a,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a, -0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa, -0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa, -0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a, -0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a, +0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a, +0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, +0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a, +0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a, +0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0x100a,0x900a, +0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a, +0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa, +0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a, +0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0x100a, +0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa, +0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a, -0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, +0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, 0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, -0xf20a,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a, +0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa, -0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0, +0,0,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa, +0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0, -0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa, -0xb1,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, -0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0, +0xa,0xa,0xa,0xa,0xb1,0,0,0,0,0,0,0,0,0,0,0, +4,4,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, -1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0xb1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0,0,0,0,0,0,0,0,0,1,0xb1,1,0xd,0xd,0xd,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0, -0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3, -0x300a,0xf00a,0xa,0,0xa,4,4,0xa,0,0,0,0,0xd,0xd,0xd,0xd, +0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa, +0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0, +0xa,4,4,0xa,0,0,0,0,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0,0xa,0xa,4, -4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2, -2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0,0xa,0xa,4,4,4,0xa,0xa, +0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,2,2,2,2, +2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a, -0xa,0xa,0,0,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,4,0xa,0xa, -0xa,4,4,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0, +0,0,0,0x510a,0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xb1,2,2,2, +0,0,0,0,0,0,0,0,4,4,0xa,0xa,0xa,4,4,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xb1,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,1,1,1,1,1,1,1,1, +2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,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,1,1,1,1, -1,1,1,1,1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1, -1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xb1,0xb1,0xb1,1,1,1,1,0xb1,0x41,0x81,1,1,0x81,0xb1,0xb1,1, -1,1,1,0x41,0x41,0x41,0x41,0x81,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x81,1,0x81, -1,0x81,0x81,1,1,0x61,0x81,0x81,0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61, -0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41, -0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81,0x41,0x81,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0x81,0x81,0x81,0x81,0x41,0x41,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x4d,0x4d,0x8d,0x4d,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -5,5,5,5,5,5,5,5,5,5,0xd,0xd,0xd,0xd,0xd,0xd, -0x6d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1, +0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,1, +1,1,1,0xb1,0x41,0x81,1,1,0x81,0xb1,0xb1,1,1,1,1,0x41, +0x41,0x41,0x41,0x81,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x81,1,0x81,1,0x81,0x81,1, +1,0x61,0x81,0x81,0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41, +0x41,0x81,0x41,0x41,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41,0x41,0x81,0x41,0x41, +0x81,0x41,0x81,0x81,0x41,0x81,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x81,0x81,0x81,0x81,0x41,0x41,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x4d,0x4d,0x8d,0x4d, +0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,5,5,5,5, +5,5,5,5,5,5,0xd,0xd,0xd,0xd,0xd,0xd,0x6d,0x4d,0x4d,0x4d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,1,1,1,1, +1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5, +5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, -1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1, +1,1,1,1,1,1,1,0xb1,0xb1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0x8d,0x4d, +0x4d,0xd,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x4d,0x4d,0x4d,0x8d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x8d,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1, +0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0x41,0x41,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d, -0x8d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1, +0x41,1,0x41,0x41,0x81,0x81,0x81,1,0x41,0x81,0x81,0x41,0x41,0x81,0x41,0x41, +1,0x41,0x81,0x81,0x41,1,1,1,1,0x81,0x41,0x61,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x41,1,0x41,0x41,0x81,0x81,0x81,1,0x41,0x81,0x81,0x41, -0x41,0x81,0x41,0x41,1,0x41,0x81,0x81,0x41,1,1,1,1,0x81,0x41,0x61, -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,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1, -0,0,0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0, -0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0, +0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0xb1,0,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa0, -0xa0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0, +0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa0,0xa0,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, @@ -720,11 +738,8 @@ static const uint16_t ubidi_props_trieIndex[13008]={ 0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0,0,0, -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,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -732,73 +747,80 @@ static const uint16_t ubidi_props_trieIndex[13008]={ 0,0,0,0,0,0,0,0,0,0,0,0,0xa0,0xa0,0xa0,0xa0, 0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xb1,0,0,0, 0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2, +0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0, +0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0, +0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, -0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +0,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, +0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -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,0xb1,0xb1,0xb1,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1, -0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +2,2,2,2,2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,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,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -2,2,2,2,2,2,2,2,2,2,2,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xa1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +2,2,2,2,2,2,2,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, @@ -806,27 +828,29 @@ static const uint16_t ubidi_props_trieIndex[13008]={ 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, +2,2,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, +0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12, +0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[40]={ @@ -836,7 +860,7 @@ static const uint32_t ubidi_props_mirrors[40]={ }; static const uint8_t ubidi_props_jgArray[684]={ -0x2d,0,3,3,0x2c,3,0x2d,3,4,0x2a,4,4,0xd,0xd,0xd,6, +0x68,0,3,3,0x2c,3,0x2d,3,4,0x2a,4,4,0xd,0xd,0xd,6, 6,0x1f,0x1f,0x23,0x23,0x21,0x21,0x28,0x28,1,1,0xb,0xb,0x37,0x37,0x37, 0,9,0x1d,0x13,0x16,0x18,0x1a,0x10,0x2c,0x2d,0x2d,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -874,14 +898,14 @@ static const uint8_t ubidi_props_jgArray[684]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x5d,0x5a,0x60,0x63,0x5e,0x5f,0x59,0x61,0x5b,0x5c,0x62,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,0,0,0,0x66,0,0,0x1a,0xd,0x28,0x28,0xb,0x67,0, +3,3,3,0,0,0,0x66,0,0,0x1a,0xd,0x28,0x28,0xb,0x67,0x1a, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4,4,0xd,0x28,9,0x1d,0x16,0x18,0x2d,0x2d,0x1f,0x2c,0x39,0,6,0x21, 0xb,0x55,0x1f,1,0x13,0x1d,4,4,4,0x1f,0x2d,0x56,0x58,0x57,4,4, 4,0xd,0xb,1,0x58,0xd,0xd,0x16,0xb,0,0,0 }; -static const uint8_t ubidi_props_jgArray2[612]={ +static const uint8_t ubidi_props_jgArray2[1032]={ 0x3a,0x3c,0x3c,0x40,0x40,0x3d,0,0x52,0,0x54,0x54,0,0,0x41,0x4f,0x53, 0x43,0x43,0x43,0x44,0x3e,0x50,0x45,0x46,0x4c,0x3b,0x3b,0x48,0x48,0x4b,0x49,0x49, 0x49,0x4a,0,0,0x4d,0,0,0,0,0,0,0x47,0x3f,0x4e,0x51,0x42, @@ -920,7 +944,33 @@ static const uint8_t ubidi_props_jgArray2[612]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0x65,0,0,0,0,0,0,0x65,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0x64,0,0,0x65,0,0x64,0, -0x64,0,0,0x64 +0x64,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,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,0x28,0x13,0,0x69,0x2d }; static const UBiDiProps ubidi_props_singleton={ @@ -931,16 +981,16 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_jgArray2, { ubidi_props_trieIndex, - ubidi_props_trieIndex+3612, + ubidi_props_trieIndex+3668, nullptr, - 3612, - 9396, + 3668, + 9720, 0x1a0, - 0xe9c, + 0xed4, 0x0, 0x0, 0x110000, - 0x32cc, + 0x3448, nullptr, 0, false, false, 0, nullptr }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiln.cpp b/deps/icu-small/source/common/ubidiln.cpp index 63c4f9190a9639..65e1212c7b26ef 100644 --- a/deps/icu-small/source/common/ubidiln.cpp +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -244,7 +244,6 @@ ubidi_setLine(const UBiDi *pParaBiDi, } } pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */ - return; } U_CAPI UBiDiLevel U_EXPORT2 diff --git a/deps/icu-small/source/common/ubiditransform.cpp b/deps/icu-small/source/common/ubiditransform.cpp index 01f5901a2c2f6a..a39cc3100d2b29 100644 --- a/deps/icu-small/source/common/ubiditransform.cpp +++ b/deps/icu-small/source/common/ubiditransform.cpp @@ -233,7 +233,7 @@ updateSrc(UBiDiTransform *pTransform, const char16_t *newSrc, uint32_t newLength uprv_free(pTransform->src); pTransform->src = nullptr; } - pTransform->src = (char16_t *)uprv_malloc(newSize * sizeof(char16_t)); + pTransform->src = static_cast<char16_t*>(uprv_malloc(newSize * sizeof(char16_t))); if (pTransform->src == nullptr) { *pErrorCode = U_MEMORY_ALLOCATION_ERROR; //pTransform->srcLength = pTransform->srcSize = 0; @@ -499,7 +499,7 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, /* Checking for U_SUCCESS() within the loop to bail out on first failure. */ for (action = pBiDiTransform->pActiveScheme->actions; *action && U_SUCCESS(*pErrorCode); action++) { if ((*action)(pBiDiTransform, pErrorCode)) { - if (action + 1) { + if (action[1] != nullptr) { updateSrc(pBiDiTransform, pBiDiTransform->dest, *pBiDiTransform->pDestLength, *pBiDiTransform->pDestLength, pErrorCode); } diff --git a/deps/icu-small/source/common/ubidiwrt.cpp b/deps/icu-small/source/common/ubidiwrt.cpp index 969807c24376aa..209b140722cbad 100644 --- a/deps/icu-small/source/common/ubidiwrt.cpp +++ b/deps/icu-small/source/common/ubidiwrt.cpp @@ -501,7 +501,10 @@ ubidi_writeReordered(UBiDi *pBiDi, destSize-=runLength; if((pBiDi->isInverse) && - (/*run<runCount-1 &&*/ dirProps[logicalStart+runLength-1]!=L)) { + (/*run<runCount-1 &&*/ + runLength > 0 && // doWriteForward may return 0 if src + // only include bidi control chars + dirProps[logicalStart+runLength-1]!=L)) { markFlag |= LRM_AFTER; } if (markFlag & LRM_AFTER) { @@ -632,7 +635,10 @@ ubidi_writeReordered(UBiDi *pBiDi, } destSize-=runLength; - if(/*run>0 &&*/ !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { + if(/*run>0 &&*/ + runLength > 0 && // doWriteForward may return 0 if src + // only include bidi control chars + !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { if(destSize>0) { *dest++=RLM_CHAR; } diff --git a/deps/icu-small/source/common/ubrk.cpp b/deps/icu-small/source/common/ubrk.cpp index 46ec0d785adf13..712ce497161ced 100644 --- a/deps/icu-small/source/common/ubrk.cpp +++ b/deps/icu-small/source/common/ubrk.cpp @@ -38,9 +38,9 @@ ubrk_open(UBreakIteratorType type, UErrorCode *status) { - if(U_FAILURE(*status)) return 0; + if (U_FAILURE(*status)) return nullptr; - BreakIterator *result = 0; + BreakIterator *result = nullptr; switch(type) { @@ -70,11 +70,11 @@ ubrk_open(UBreakIteratorType type, // check for allocation error if (U_FAILURE(*status)) { - return 0; + return nullptr; } - if(result == 0) { + if (result == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } @@ -102,14 +102,14 @@ ubrk_openRules( const char16_t *rules, UErrorCode *status) { if (status == nullptr || U_FAILURE(*status)){ - return 0; + return nullptr; } - BreakIterator *result = 0; + BreakIterator *result = nullptr; UnicodeString ruleString(rules, rulesLength); result = RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString, parseErr, *status); if(U_FAILURE(*status)) { - return 0; + return nullptr; } UBreakIterator *uBI = (UBreakIterator *)result; diff --git a/deps/icu-small/source/common/ucase.cpp b/deps/icu-small/source/common/ucase.cpp index 4fd23fc935c555..5a2feaee840b34 100644 --- a/deps/icu-small/source/common/ucase.cpp +++ b/deps/icu-small/source/common/ucase.cpp @@ -38,7 +38,7 @@ static UBool U_CALLCONV _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 /*end*/, uint32_t /*value*/) { /* add the start code point to the USet */ - const USetAdder *sa=(const USetAdder *)context; + const USetAdder* sa = static_cast<const USetAdder*>(context); sa->add(sa->set, start); return true; } @@ -696,17 +696,17 @@ getDotType(UChar32 c) { U_CAPI UBool U_EXPORT2 ucase_isSoftDotted(UChar32 c) { - return (UBool)(getDotType(c)==UCASE_SOFT_DOTTED); + return getDotType(c)==UCASE_SOFT_DOTTED; } U_CAPI UBool U_EXPORT2 ucase_isCaseSensitive(UChar32 c) { uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!UCASE_HAS_EXCEPTION(props)) { - return (UBool)((props&UCASE_SENSITIVE)!=0); + return (props&UCASE_SENSITIVE)!=0; } else { const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); - return (UBool)((*pe&UCASE_EXC_SENSITIVE)!=0); + return (*pe&UCASE_EXC_SENSITIVE)!=0; } } @@ -1623,12 +1623,12 @@ ucase_toFullFolding(UChar32 c, U_CAPI UBool U_EXPORT2 u_isULowercase(UChar32 c) { - return (UBool)(UCASE_LOWER==ucase_getType(c)); + return UCASE_LOWER==ucase_getType(c); } U_CAPI UBool U_EXPORT2 u_isUUppercase(UChar32 c) { - return (UBool)(UCASE_UPPER==ucase_getType(c)); + return UCASE_UPPER==ucase_getType(c); } /* Transforms the Unicode character to its lower case equivalent.*/ diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index e03b311870f8cd..af73873608809d 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -357,7 +357,7 @@ enum { /* definitions for 16-bit case properties word ------------------------------ */ U_CFUNC const UTrie2 * U_EXPORT2 -ucase_getTrie(); +ucase_getTrie(void); /* 2-bit constants for types of cased characters */ #define UCASE_TYPE_MASK 3 diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index 92b59520cc507a..a34fdd318e3581 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -9,145 +9,145 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={0xf,1,0,0}; +static const UVersionInfo ucase_props_dataVersion={0x11,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x76ec,0x66c8,0x680,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x7a14,0x69e0,0x688,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[13148]={ -0x355,0x35d,0x365,0x36d,0x37b,0x383,0x38b,0x393,0x39b,0x3a3,0x3aa,0x3b2,0x3ba,0x3c2,0x3ca,0x3d2, -0x3d8,0x3e0,0x3e8,0x3f0,0x3f8,0x400,0x408,0x410,0x418,0x420,0x428,0x430,0x438,0x440,0x448,0x450, -0x458,0x460,0x468,0x470,0x478,0x480,0x488,0x490,0x48c,0x494,0x499,0x4a1,0x4a8,0x4b0,0x4b8,0x4c0, -0x4c8,0x4d0,0x4d8,0x4e0,0x374,0x37c,0x4e5,0x4ed,0x4f2,0x4fa,0x502,0x50a,0x509,0x511,0x516,0x51e, -0x526,0x52d,0x531,0x374,0x538,0x355,0x548,0x540,0x550,0x552,0x55a,0x562,0x566,0x567,0x56f,0x577, -0x57f,0x567,0x587,0x58c,0x57f,0x567,0x594,0x59c,0x566,0x5a4,0x5ac,0x5b4,0x5bc,0x374,0x5c4,0x374, -0x5cc,0x5ce,0x5d6,0x5b4,0x566,0x5a4,0x5dd,0x5b4,0x5e5,0x5e7,0x56f,0x5b4,0x566,0x374,0x5ef,0x374, -0x374,0x5f5,0x5fc,0x374,0x374,0x600,0x608,0x374,0x60c,0x613,0x374,0x61a,0x622,0x629,0x631,0x374, -0x374,0x636,0x63e,0x646,0x64e,0x656,0x65d,0x665,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x66d,0x374,0x374,0x67d,0x67d,0x675, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x685,0x68b,0x573,0x573,0x374,0x691,0x699,0x374, -0x6a1,0x374,0x6a9,0x374,0x6b0,0x6b6,0x374,0x374,0x374,0x6be,0x374,0x374,0x374,0x374,0x374,0x374, -0x6c5,0x374,0x6cc,0x6d4,0x374,0x6dc,0x6e4,0x374,0x5a3,0x6e8,0x6f0,0x6f6,0x5e5,0x6fe,0x374,0x705, -0x374,0x70a,0x374,0x710,0x718,0x71c,0x724,0x72c,0x734,0x739,0x73c,0x744,0x754,0x74c,0x764,0x75c, -0x39b,0x76c,0x39b,0x774,0x777,0x39b,0x77f,0x39b,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x7b7,0x7bf, -0x7c7,0x7ce,0x374,0x7d6,0x7de,0x374,0x7e6,0x7ee,0x7f6,0x7fe,0x806,0x80e,0x816,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x819,0x81f,0x825,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x82d,0x831,0x835,0x83d,0x39b,0x39b,0x39b,0x845,0x84d,0x854,0x374,0x859,0x374,0x374,0x374,0x861, -0x374,0x6a6,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x565,0x869,0x374,0x374,0x870,0x374,0x374,0x878,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x880,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x710,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x886,0x374,0x88e,0x893,0x89b,0x374,0x374,0x8a3,0x8ab,0x8b3,0x39b,0x8b8,0x8c0,0x8c6,0x8cd,0x8d4, -0x8dc,0x8e3,0x374,0x374,0x374,0x374,0x8ea,0x8f2,0x374,0x8fa,0x901,0x374,0x550,0x906,0x90e,0x6b0, -0x374,0x914,0x91c,0x920,0x374,0x928,0x930,0x938,0x374,0x93e,0x942,0x94a,0x95a,0x952,0x374,0x962, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x96a,0x374,0x374,0x374,0x374,0x972,0x550,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x977,0x97f,0x983,0x374,0x374,0x374,0x374,0x357,0x35d,0x98b,0x993,0x99a,0x50b,0x374,0x374,0x9a2, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0xdd4,0xdd4,0xdec,0xe2c,0xe6c,0xea8,0xee8,0xf28,0xf60,0xfa0,0xfe0,0x1020,0x1060,0x10a0,0x10e0,0x1120, -0x1160,0x11a0,0x11e0,0x1220,0x1230,0x1264,0x12a0,0x12e0,0x1320,0x1360,0xdd0,0x1394,0x13c8,0x1408,0x1424,0x1458, -0x9e1,0xa1f,0xa5f,0xa9e,0x188,0x188,0xad9,0x188,0x188,0x188,0x188,0x188,0x188,0xb02,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0xb42,0x188,0xb82,0x188,0xba8,0xbe3,0xc22,0xc62,0xc9c,0xcd3,0x188, +static const uint16_t ucase_props_trieIndex[13544]={ +0x363,0x36b,0x373,0x37b,0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0, +0x3e6,0x3ee,0x3f6,0x3fe,0x406,0x40e,0x416,0x41e,0x426,0x42e,0x436,0x43e,0x446,0x44e,0x456,0x45e, +0x466,0x46e,0x476,0x47e,0x486,0x48e,0x496,0x49e,0x49a,0x4a2,0x4a7,0x4af,0x4b6,0x4be,0x4c6,0x4ce, +0x4d6,0x4de,0x4e6,0x4ee,0x382,0x38a,0x4f3,0x4fb,0x500,0x508,0x510,0x518,0x517,0x51f,0x524,0x52c, +0x534,0x53b,0x53f,0x382,0x546,0x363,0x556,0x54e,0x55e,0x560,0x568,0x570,0x574,0x575,0x57d,0x585, +0x58d,0x575,0x595,0x59a,0x58d,0x575,0x5a2,0x5aa,0x574,0x5b2,0x5ba,0x5c2,0x5ca,0x382,0x5d2,0x382, +0x5da,0x5dc,0x5e4,0x5c2,0x574,0x5b2,0x5eb,0x5c2,0x5f3,0x5f5,0x57d,0x5c2,0x574,0x382,0x5fd,0x382, +0x382,0x603,0x60a,0x382,0x382,0x60e,0x616,0x382,0x61a,0x621,0x382,0x628,0x630,0x637,0x63f,0x382, +0x382,0x644,0x64c,0x654,0x65c,0x664,0x66b,0x673,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x67b,0x382,0x382,0x68b,0x68b,0x683, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x693,0x699,0x581,0x581,0x382,0x69f,0x6a7,0x382, +0x6af,0x382,0x6b7,0x382,0x6be,0x6c4,0x382,0x382,0x382,0x6cc,0x382,0x382,0x382,0x382,0x382,0x382, +0x6d3,0x382,0x6da,0x6e2,0x382,0x6ea,0x6fa,0x6f2,0x5b1,0x702,0x70a,0x710,0x5f3,0x718,0x382,0x71f, +0x382,0x724,0x382,0x72a,0x732,0x736,0x73e,0x746,0x74e,0x753,0x756,0x75e,0x76e,0x766,0x77e,0x776, +0x3a9,0x786,0x3a9,0x78e,0x791,0x3a9,0x799,0x3a9,0x7a1,0x7a9,0x7b1,0x7b9,0x7c1,0x7c9,0x7d1,0x7d9, +0x7e1,0x7e8,0x382,0x7f0,0x7f8,0x382,0x800,0x808,0x810,0x818,0x820,0x828,0x830,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x833,0x839,0x83f,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x847,0x84b,0x84f,0x857,0x3a9,0x3a9,0x3a9,0x85f,0x867,0x86e,0x382,0x873,0x382,0x382,0x382,0x87b, +0x382,0x6b4,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x573,0x883,0x382,0x382,0x88a,0x382,0x382,0x892,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x89a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x72a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x8a0,0x382,0x8a8,0x8ad,0x8b5,0x382,0x382,0x8bd,0x8c5,0x8cd,0x3a9,0x8d2,0x8da,0x8e0,0x8e7,0x8ef, +0x8f7,0x8fe,0x382,0x382,0x382,0x382,0x905,0x90d,0x382,0x915,0x91c,0x382,0x55e,0x921,0x929,0x6be, +0x382,0x92f,0x937,0x93b,0x382,0x943,0x94b,0x953,0x382,0x959,0x95d,0x965,0x975,0x96d,0x382,0x97d, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x985,0x382,0x382,0x382,0x382,0x98d,0x55e,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x992,0x99a,0x99e,0x382,0x382,0x382,0x382,0x365,0x36b,0x9a6,0x9ae,0x9b5,0x519,0x382,0x382,0x9bd, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0xe0c,0xe0c,0xe24,0xe64,0xea4,0xee0,0xf20,0xf60,0xf98,0xfd8,0x1018,0x1058,0x1098,0x10d8,0x1118,0x1158, +0x1198,0x11d8,0x1218,0x1258,0x1268,0x129c,0x12d8,0x1318,0x1358,0x1398,0xe08,0x13cc,0x1400,0x1440,0x145c,0x1490, +0x9e1,0xa1f,0xa5f,0xa9e,0x188,0x188,0xad9,0x188,0x188,0x188,0x188,0x188,0xb11,0xb3a,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0xb7a,0x188,0xbba,0x188,0xbe0,0xc1b,0xc5a,0xc9a,0xcd4,0xd0b,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, @@ -172,777 +172,803 @@ static const uint16_t ucase_props_trieIndex[13148]={ 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0xd13,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x9a9,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x9b1,0x374,0x374,0x374,0x9b4,0x374,0x374,0x374, -0x374,0x9bc,0x9c2,0x9c6,0x374,0x374,0x9ca,0x9ce,0x9d4,0x374,0x374,0x374,0x9db,0x9df,0x9e7,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x9f7,0x9ef,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x9ff, -0xa03,0x374,0x374,0x374,0x374,0x374,0xa0b,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0xa13,0xa17,0xa1f,0xa23,0x374,0xa2a,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0xa30,0x374,0xa34,0x374,0x374,0xa3c,0x374,0xa44,0x374,0x374,0x374,0x566, -0xa46,0xa4d,0xa51,0x5e5,0xa59,0xa61,0x374,0xa69,0xa70,0x374,0xa76,0x5e5,0xa7b,0xa83,0x374,0x374, -0xa88,0x566,0x374,0x374,0x374,0x357,0xa90,0x5e5,0x5e7,0xa98,0xa9f,0x374,0x374,0x374,0x374,0x374, -0xa46,0xaa7,0x374,0x374,0xaaf,0xab7,0x374,0x374,0x374,0x374,0x374,0x374,0xabb,0xac3,0x374,0x374, -0xacb,0x4cf,0x374,0x374,0xad3,0x374,0x374,0xad9,0xae1,0x374,0x374,0x374,0x374,0x374,0x374,0xae6, -0x374,0x374,0x374,0xaee,0xaf6,0x374,0x374,0xafe,0xb06,0x374,0x374,0x374,0xb09,0x9b1,0xb11,0xb15, -0xb1d,0x374,0xb24,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xb2b, -0x374,0x374,0x972,0xb33,0x374,0x374,0x374,0xb39,0xb41,0x374,0xb45,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0xb4b,0x5e5,0xb51,0xb59,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xb5d,0xb65,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xb6b,0x374,0xb71,0x5a3,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0xaee,0xaf6,0x374,0x374,0x374,0x374,0x374,0x374,0x6a6,0x374,0xb77,0x374, -0x374,0xb7f,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0xb84,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0xb8c,0x5a3,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x8ab,0xb94,0xb9b,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xba2,0xbaa, -0xbb0,0x374,0x374,0x374,0x374,0xbb8,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0xbc0,0xbc8,0xbcd,0xbd3,0xbdb,0xbe3,0xbeb,0xbc4,0xbf3,0xbfb,0xc03,0xc0a,0xbc5, -0xbc0,0xbc8,0xbc3,0xbd3,0xbc6,0xbc1,0xc12,0xbc4,0xc1a,0xc22,0xc2a,0xc31,0xc1d,0xc25,0xc2d,0xc34, -0xc20,0xc3c,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x8ab,0xc44,0x8ab,0xc4b,0xc52,0xc5a,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xc6a,0xc72,0x374,0x374,0x374,0x374, -0x374,0x374,0xc62,0xc7a,0xc8d,0xc80,0xc85,0x374,0x374,0x374,0x374,0xc95,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xaab,0x374,0xa28,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xc9d,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0xca1,0x374,0xca9,0xcb1,0xcb8,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0xbbc,0xcc0,0xcc0,0xcc6, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0xa6b,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x566,0x8ab,0x8ab,0x8ab,0x374,0x374,0x374,0x374,0x8ab,0x8ab,0x8ab,0x8ab,0x8ab, -0x8ab,0x8ab,0xcce,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374,0x374, -0x374,0x374,0x374,0x354,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,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,4,0,0,0,0,0,0,0,0,0,0,0,4,0, -0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xa,0x5a,0x7a, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0, -0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf9,0xf031,0x149, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xd4b,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x9c4,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x9cc,0x382,0x382,0x382,0x9cf,0x382,0x382,0x382, +0x382,0x9d7,0x9dd,0x9e1,0x382,0x382,0x9e5,0x9e9,0x9ef,0x382,0x382,0x382,0x9f6,0x9fa,0xa02,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa12,0xa0a,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa1a, +0xa1e,0x382,0x382,0x382,0x382,0x382,0xa26,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0xa2e,0xa32,0xa3a,0xa3e,0x382,0xa45,0xa4a,0xa51,0xa58,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0xa5e,0x573,0xa62,0x382,0x382,0xa6a,0x382,0xa72,0x382,0x382,0x382,0x574, +0xa74,0xa7b,0xa7f,0x5f3,0xa87,0xa8f,0x382,0xa97,0xa9e,0x382,0xaa4,0x5f3,0xaa9,0xab1,0x382,0x382, +0xab6,0x574,0x382,0x382,0x382,0x365,0xabe,0x5f3,0x5f5,0xac6,0xacd,0x382,0xa99,0xad5,0x58d,0x382, +0xa74,0xadd,0x382,0x382,0xae5,0xaed,0x382,0x382,0x382,0x382,0x382,0x382,0xaf1,0xaf9,0x382,0x382, +0xb01,0x4dd,0x382,0x382,0xb09,0x382,0x382,0xb0f,0xb17,0x382,0x382,0x382,0x382,0x382,0x382,0xb1c, +0x382,0x382,0x382,0xb24,0xb2c,0x382,0x382,0xb34,0xb3c,0x382,0x382,0x382,0xb3f,0x9cc,0xb47,0xb4b, +0xb53,0x382,0xb5a,0x382,0x382,0x382,0x382,0x382,0x382,0xb62,0x382,0x382,0x382,0x382,0x382,0xb66, +0x382,0x382,0x98d,0xb6e,0x382,0x382,0x382,0xb74,0xb7c,0x382,0xb80,0x382,0x94c,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0xb86,0x5f3,0xb8c,0xb94,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xb9b,0xba3,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x519,0xbab,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xbaf,0x382,0xbb5,0x5b1,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x55e,0xb88,0x382,0x382,0x382,0x382,0x382,0x382,0xb24,0xb2c,0x382,0xbbd, +0xbc4,0x382,0x382,0x382,0x6b4,0x382,0xbc9,0x382,0x382,0xbd1,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbd6,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbde,0x5b1, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xbe6,0xbed,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0xbf4,0xbfc,0xc02,0x382,0x382,0x382,0x382,0xc0a,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xc12,0xc1a,0xc1f,0xc25,0xc2d, +0xc35,0xc3d,0xc16,0xc45,0xc4d,0xc55,0xc5c,0xc17,0xc12,0xc1a,0xc15,0xc25,0xc18,0xc13,0xc64,0xc16, +0xc6c,0xc74,0xc7c,0xc83,0xc6f,0xc77,0xc7f,0xc86,0xc72,0xc8e,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xc96,0x8c5,0xc9d,0xca4,0xcac, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0xcbc,0xcc4,0x382,0x382,0x382,0x382,0x382,0x382,0xcb4,0xccc,0xcdf,0xcd2,0xcd7,0x382, +0x382,0x382,0x382,0xce7,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xae1, +0x382,0xa43,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xcef,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xcf4,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xcfc,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xd04,0x382,0xd0c,0xd14,0xd1b,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0xc0e,0xd23,0xd23,0xd29,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa99,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x574,0x8c5,0x8c5,0x8c5,0x382, +0x382,0x382,0x382,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0xd31,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x362,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,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,4,0,0,0,0,0, +0,0,0,0,0,0,4,0,0,0,0,0,0,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xba, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x189, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,4,0,4,0,0,0,0, -4,0x1c9,0,4,4,0,1,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1fa,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011, -0xf011,0x2d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0,0,0,0,0,0,0,0,0,0,0,0,4,0,1,0, +0,4,0,4,0,0,0,0,4,0x1c9,0,4,4,0,1,0, +0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x5a,0x5a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0x3c91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1,0x33a,0x389,0x92,0xff91, -0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, -0xff91,0x3d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xff91,0x92,0xff91, +0x92,0xff91,0x31a,0xffb1,0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91,0x92,0xff91,0x6712,0x92, -0xff91,0x6692,0x6692,0x92,0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892, -0x92,0xff91,0x5191,1,0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x6d12,0x92, -0xff91,0x6d12,1,1,0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92,0xff91,0x92,0xff91,0x6d92, -0x92,0xff91,1,0,0x92,0xff91,1,0x1c11,0,0,0,0,0x48a,0x4bb,0x4f9,0x52a, -0x55b,0x599,0x5ca,0x5fb,0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, -0xff91,0x92,0xff91,0x92,0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759,0x92,0xff91,0xcf92,0xe412, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x459, +0x6191,0x6912,0x92,0xff91,0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92,0xff91,1,0x2792,0x6512, +0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,0x489,0x6992,0x6a92,0x4111,0x6b12, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1,0x92,0xff91,0x6d12,0x92, +0xff91,0x6c92,0x6c92,0x92,0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0,0x92,0xff91,1,0x1c11, +0,0,0,0,0x4aa,0x4db,0x519,0x54a,0x57b,0x5b9,0x5ea,0x61b,0x659,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xd891,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x689,0x70a,0x73b,0x779,0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0xbf12,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,1,1,1,1,1,1,0x78a,0x92,0xff91,0xae92,0x7aa,0x7c9, -0x7c9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x7e9,0x809,0x829,0x9711,0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91,0x849,1,1,1, -0x9991,0x869,1,0x9891,1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9,0x8e9,1,1,0x9691, -1,0x909,0x9591,1,1,0x9511,1,1,1,1,1,1,1,0x929,1,1, -0x9311,1,0x949,0x9311,1,1,1,0x969,0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1, -1,1,0x9291,1,0,1,1,1,1,1,1,1,1,0x989,0x9a9,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -5,5,0x25,5,5,5,5,5,5,4,4,4,0x14,4,0x14,4, -5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,1,1, +1,1,0x7aa,0x92,0xff91,0xae92,0x7ca,0x7e9,0x7e9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91, +0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x809,0x829,0x849,0x9711,0x9911,1,0x9991,0x9991, +1,0x9b11,1,0x9a91,0x869,1,1,1,0x9991,0x889,1,0x9891,0x8a9,0x8c9,0x8e9,1, +0x97b1,0x9691,0x8e9,0x909,0x929,1,1,0x9691,1,0x949,0x9591,1,1,0x9511,1,1, +1,1,1,1,1,0x969,1,1,0x9311,1,0x989,0x9311,1,1,1,0x9a9, +0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1,0,0,1,1, +1,1,1,1,1,0x9c9,0x9e9,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,5,5,0x25,5,5,5,5,5, +5,4,4,4,0x14,4,0x14,4,5,5,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,5,5,5,5,5,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x9cc,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44, -0x44,0x44,0x44,0x54,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +4,4,4,4,4,4,4,4,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0xa0c, +0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x64,0x64,0x64, 0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, -0x64,0x74,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44, -0x44,0x44,0x54,0x44,0x44,0x9dd,0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x64,4, -0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x92,0xff91,0x92,0xff91,4,4,0x92,0xff91,0,0,5,0x4111,0x4111,0x4111,0,0x3a12, -0,0,0,0,4,4,0x1312,4,0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92, -0xa29,0x1012,0xafa,0x1012,0x1012,0xb3a,0x1012,0x1012,0xb7a,0xbca,0xc1a,0x1012,0xc5a,0x1012,0x1012,0x1012, -0xc9a,0xcda,0,0xd1a,0x1012,0x1012,0xd5a,0x1012,0x1012,0xd9a,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91, -0xdd9,0xf011,0xea9,0xf011,0xf011,0xee9,0xf011,0xf011,0xf29,0xf79,0xfc9,0xf011,0x1009,0xf011,0xf011,0xf011, -0x1049,0x1089,0x10c9,0x10f9,0xf011,0xf011,0x1139,0xf011,0xf011,0x1179,0xf011,0xf011,0xe011,0xe091,0xe091,0x412, -0x11b9,0x11e9,2,2,2,0x1239,0x1269,0xfc11,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x1299,0x12c9,0x391,0xc631,0x12fa,0x1349,0,0x92,0xff91,0xfc92,0x92,0xff91,1,0xbf12,0xbf12,0xbf12, -0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812, -0x1012,0x1012,0x137a,0x1012,0x13ba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x13fa,0x1012, -0x1012,0x143a,0x147a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14ca,0x1012,0x1012,0x1012,0x1012,0x1012, -0xf011,0xf011,0x1509,0xf011,0x1549,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1589,0xf011, -0xf011,0x15c9,0x1609,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1659,0xf011,0xf011,0xf011,0xf011,0xf011, -0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811, -0x92,0xff91,0x169a,0x16d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0,0x44,0x44,0x44,0x44,0x44,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0xa1d,0x44,0x64, +0x64,0x64,0x44,0x44,0x44,0x64,0x64,4,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x44, +0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,4,4,0x92,0xff91, +0,0,5,0x4111,0x4111,0x4111,0,0x3a12,0,0,0,0,4,4,0x1312,4, +0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92,0xa69,0x1012,0xb3a,0x1012,0x1012,0xb7a,0x1012,0x1012, +0xbba,0xc0a,0xc5a,0x1012,0xc9a,0x1012,0x1012,0x1012,0xcda,0xd1a,0,0xd5a,0x1012,0x1012,0xd9a,0x1012, +0x1012,0xdda,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xe19,0xf011,0xee9,0xf011,0xf011,0xf29,0xf011,0xf011, +0xf69,0xfb9,0x1009,0xf011,0x1049,0xf011,0xf011,0xf011,0x1089,0x10c9,0x1109,0x1139,0xf011,0xf011,0x1179,0xf011, +0xf011,0x11b9,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x11f9,0x1229,2,2,2,0x1279,0x12a9,0xfc11, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x12d9,0x1309,0x391,0xc631,0x133a,0x1389,0,0x92, +0xff91,0xfc92,0x92,0xff91,1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812, +0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x13ba,0x1012,0x13fa,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x143a,0x1012,0x1012,0x147a,0x14ba,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x150a,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1549,0xf011,0x1589,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x15c9,0xf011,0xf011,0x1609,0x1649,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0x1699,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811, +0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x16da,0x1719,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,0x44,0x44,0x44,0x44, +4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x792,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xf891, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0,4,0,0, -0,0,0,4,1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0,0,4,0,0,0,0,0,4,1,0xe811,0xe811,0xe811, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1719,1,0,0,0,0,0,0,0, -0,0x64,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0x64, -0,0x64,0x64,0,0x44,0x64,0,0x64,0,0,0,0,0,0,0,0, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1759, +1,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x64,0x44, +0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64, +0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0,0x64,0,0x64,0x64,0,0x44,0x64,0,0x64, 0,0,0,0,0,0,0,0,0,0,0,0,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, -4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,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, -4,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64, +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,4,4,4,4,4,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x64,0x64,0x64,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, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,4,0,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0x44,0x44,0,0x64,0x44, -0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0x64,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,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x44, +0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x64, -0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44,0x64,0x44,0x64,0x44, -0x64,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,0,0x44,0x44,0x44,0x44,0x64, +0x44,4,4,0x44,0x44,0,0x64,0x44,0x44,0x64,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44, +0x44,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x44,0,0,0,0,0, 0,0,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,4,4,4,4,4, -4,4,4,4,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,0, -0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0,0, -0,0,4,0,0,0x64,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44, -0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,4,0x44,0x44,0x44, -0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, -4,4,0,0,0,0,0,0,0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x44, -0x44,0x44,4,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64, -0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44, -0,0,0,0,0,0,0,0,0,4,0x44,0x44,0x44,0x44,0x44,0x64, -0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -4,4,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,0x64,0,0,0,0,4,4,4,4,4,4,4, -4,0,0,0,0,0x64,0,0,0,0x44,0x64,0x44,0x44,4,4,4, -0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,4,4,4,4,4,4,4,4,4,4,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,0x64,0,0,0,0,4,4,4, -4,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0x44,0,0,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,0x44,4,4,0,0,0,0,4,0,0,0x64,0,0, 0,0,0,0,0,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,4,0, -0,0,0,4,4,0,0,4,4,0x64,0,0,0,4,0,0, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44, +4,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,4,0,4,4,0,0,0,0,0x64,0,0, +0,0,0,0,0,0x64,0x64,0x64,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0x44, +0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,4,0x64,0x44,0x44,0x64,0x44, +0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0, +0,4,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,4,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,0x64,0,0,0, +0,4,4,4,4,4,4,4,4,0,0,0,0,0x64,0,0, +0,0x44,0x64,0x44,0x44,4,4,4,0,0,0,0,0,0,0,0, 0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, +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,0x64,0,0,4, -0,4,4,4,4,0,0,0,0,0,0,0,0,0x64,0,0, -0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, +0x64,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,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,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0,0,4,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,0x64,0,0, +0,0,0,0,0,4,4,0,0,0,0,4,4,0,0,4, +4,0x64,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4, +4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,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,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,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,0x64,0,4,4,4,0,0,0,0,0,4,4, -4,0,4,4,4,0x64,0,0,0,0,0,0,0,0x64,0x64,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, -4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,4,4,0, +0,0,0,0,0,0,0,0,0,0,4,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,0x64,0x64,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,4,4, -4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,4,4,4,4,0x64,0x64,0x64,0, -0,0,0,0,0,0,4,4,0x64,0x64,0x64,0x64,4,4,4,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,4,0,0,4,4,4,4,0x64,0x64,0x64,4,4,0,0,0, -0,0,0,0,0,0,4,0,0x64,0x64,0x64,0x64,4,4,4,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,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,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,4,4, +4,0,0,0,0,0,4,4,4,0,4,4,4,0x64,0,0, +0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,4,0x64,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x64,0x64,4,0x64,4,4,4, -4,4,0x64,0x64,0x64,0x64,4,0,0x64,4,0x44,0x44,0x64,0,0x44,0x44, -0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4, -0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0, +0,0,0,0,0,0,4,4,4,0,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +4,4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,4,4, +0x64,0x64,0x64,0x64,4,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4, +0x64,0x64,0x64,4,4,0,0,0,0,0,0,0,0,0,4,0, +0x64,0x64,0x64,0x64,4,4,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, +0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x64,0,0x64,0,0x64,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x64,0x64,4,0x64,4,4,4,4,4,0x64,0x64,0x64,0x64,4,0, +0x64,4,0x44,0x44,0x64,0,0x44,0x44,0,0,0,0,0,4,4,4, +4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0,0,0,0,0,0,0x64,0,0,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,4,4,4,0,4,4,4,4,4,0x64, -0,0x64,0x64,0,0,4,4,0,0,0,0,0,0,0,0,0, +4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, +0,0,0x64,0,0,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,4,4, +4,0,4,4,4,4,4,0x64,0,0x64,0x64,0,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,0,0,0,0,4,4,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,4,4,0, -0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a, -0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a, -0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0x175a,0,0x175a,0,0,0,0, -0,0x175a,0,0,0x1779,0x17a9,0x17d9,0x1809,0x1839,0x1869,0x1899,0x18c9,0x18f9,0x1929,0x1959,0x1989, -0x19b9,0x19e9,0x1a19,0x1a49,0x1a79,0x1aa9,0x1ad9,0x1b09,0x1b39,0x1b69,0x1b99,0x1bc9,0x1bf9,0x1c29,0x1c59,0x1c89, -0x1cb9,0x1ce9,0x1d19,0x1d49,0x1d79,0x1da9,0x1dd9,0x1e09,0x1e39,0x1e69,0x1e99,0x1ec9,0x1ef9,0x1f29,0x1f59,0, -5,0x1f89,0x1fb9,0x1fe9,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x44,0x44,0x44,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a, -0x201a,0x201a,0x201a,0x201a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0,0,0x2059,0x2089,0x20b9,0x20e9, -0x2119,0x2149,0,0,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a, -0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a,0x201a, -0x201a,0x201a,0x201a,0x201a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,0x64,0x60,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,4,4, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,0,0,4,4,0,0,0,0,0,0,0x64,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0,0x179a,0,0,0,0,0,0x179a,0,0,0x17b9,0x17e9,0x1819,0x1849, +0x1879,0x18a9,0x18d9,0x1909,0x1939,0x1969,0x1999,0x19c9,0x19f9,0x1a29,0x1a59,0x1a89,0x1ab9,0x1ae9,0x1b19,0x1b49, +0x1b79,0x1ba9,0x1bd9,0x1c09,0x1c39,0x1c69,0x1c99,0x1cc9,0x1cf9,0x1d29,0x1d59,0x1d89,0x1db9,0x1de9,0x1e19,0x1e49, +0x1e79,0x1ea9,0x1ed9,0x1f09,0x1f39,0x1f69,0x1f99,0,5,0x1fc9,0x1ff9,0x2029,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x207a,0x207a,0x207a,0x207a, +0x207a,0x207a,0,0,0x2099,0x20c9,0x20f9,0x2129,0x2159,0x2189,0,0,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, -0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,4,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,4,0,0,4,4,4, -4,4,4,4,4,4,0x64,4,0,0,0,4,0,0,0,0, -0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,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,0, +0x64,0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,0x60,0,0,0,0,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,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,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,4, -4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, -0,0x64,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,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,4,0,4,4,4,4,4,4,4,0, -0x64,0,4,0,0,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x64, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,4,0x64, -0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0, +4,4,0,4,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,4,0,0,4,4,4,4,4,4,4,4,4,0x64,4, +0,0,0,4,0,0,0,0,0,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,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,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0,4,4,4,4,4,0,4,0,0,0, -0,0,4,0,0x60,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,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0, -4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0, -0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64, +0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0, 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,4,4,4,4,4,0,0, -0x2179,0x21a9,0x21d9,0x2209,0x2239,0x2289,0x22d9,0x2309,0x2339,0,0,0,0,0,0,0, -0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a, -0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0x236a,0,0,0x236a,0x236a,0x236a, +4,4,4,0,0,0,0,4,4,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,0,0x64,0x44,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64, -0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0, -0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0x44,0x64,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,4,0, +4,4,4,4,4,4,4,0,0x64,0,4,0,0,4,4,4, +4,4,4,4,4,0,0,0,0,0,0,4,4,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0,0,0x64,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64, +0x64,0x64,0x64,0x44,0x44,0x64,4,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44, +0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,4,4, +4,4,4,0,4,0,0,0,0,0,4,0,0x60,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,0,0,4,4,0x60,0x64,4,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x64,0,4,4,0,0,0,4,0,4,4,4,0x60,0x60, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,0,0,4,0x64,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,4,4,4,4,4,0,0,0x21b9,0x21e9,0x2219,0x2249,0x2279,0x22c9,0x2319,0x2349, +0x2379,0x92,0xff91,0,0,0,0,0,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0,0,0x23aa,0x23aa,0x23aa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64, +0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0,0,0,0,0x64,0,0,0,0,0,0,0x44,0,0,0, +0x44,0x44,0,0,0,0,0,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, +1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,0x2389,1,1,1,0x23a9,1,1, -5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x23c9,1, -1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64, -0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91, +5,5,5,5,5,5,5,5,5,5,0x25,5,5,5,5,5, +5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1, +5,0x23c9,1,1,1,0x23e9,1,1,5,5,5,5,0x25,5,5,5, +0x25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x2409,1,1,1,1,1,1,1,0x21,1, +1,1,1,5,5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64, +0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x242a,0x2469,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x23ea,0x2429,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x24a9,0x2529,0x25a9,0x2629,0x26a9,0x2729, +1,1,0x275a,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x2469,0x24e9,0x2569,0x25e9,0x2669,0x26e9,1,1,0x271a,1,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x2769,0x411,0x27e9,0x411, -0x2899,0x411,0x2949,0x411,0,0xfc12,0,0xfc12,0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11, -0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811,0x3f11,0x3f11,0,0,0x29f9,0x2a69,0x2ad9,0x2b49, -0x2bb9,0x2c29,0x2c99,0x2d09,0x2d7b,0x2deb,0x2e5b,0x2ecb,0x2f3b,0x2fab,0x301b,0x308b,0x30f9,0x3169,0x31d9,0x3249, -0x32b9,0x3329,0x3399,0x3409,0x347b,0x34eb,0x355b,0x35cb,0x363b,0x36ab,0x371b,0x378b,0x37f9,0x3869,0x38d9,0x3949, -0x39b9,0x3a29,0x3a99,0x3b09,0x3b7b,0x3beb,0x3c5b,0x3ccb,0x3d3b,0x3dab,0x3e1b,0x3e8b,0x411,0x411,0x3ef9,0x3f79, -0x3fe9,0,0x4069,0x40e9,0xfc12,0xfc12,0xdb12,0xdb12,0x419b,4,0x4209,4,4,4,0x4259,0x42d9, -0x4349,0,0x43c9,0x4449,0xd512,0xd512,0xd512,0xd512,0x44fb,4,4,4,0x411,0x411,0x4569,0x4619, -0,0,0x46d9,0x4759,0xfc12,0xfc12,0xce12,0xce12,0,4,4,4,0x411,0x411,0x4809,0x48b9, -0x4979,0x391,0x49f9,0x4a79,0xfc12,0xfc12,0xc812,0xc812,0xfc92,4,4,4,0,0,0x4b29,0x4ba9, -0x4c19,0,0x4c99,0x4d19,0xc012,0xc012,0xc112,0xc112,0x4dcb,4,4,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4, -0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,4,0,0x25,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,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44, -0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,1,2,2,2,1,1,2,2,2,1,0,2,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0x4e3a,0, -2,0,0x4e7a,0x4eba,2,2,0,1,2,2,0xe12,2,1,0,0,0, -0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1, -0x21,0x21,0,0,0,0,0xf211,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, -0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, -0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0,0,0,0x92,0xff91,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, -0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311, -0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x27a9,0x411,0x2829,0x411,0x28d9,0x411,0x2989,0x411,0,0xfc12,0,0xfc12, +0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11,0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811, +0x3f11,0x3f11,0,0,0x2a39,0x2aa9,0x2b19,0x2b89,0x2bf9,0x2c69,0x2cd9,0x2d49,0x2dbb,0x2e2b,0x2e9b,0x2f0b, +0x2f7b,0x2feb,0x305b,0x30cb,0x3139,0x31a9,0x3219,0x3289,0x32f9,0x3369,0x33d9,0x3449,0x34bb,0x352b,0x359b,0x360b, +0x367b,0x36eb,0x375b,0x37cb,0x3839,0x38a9,0x3919,0x3989,0x39f9,0x3a69,0x3ad9,0x3b49,0x3bbb,0x3c2b,0x3c9b,0x3d0b, +0x3d7b,0x3deb,0x3e5b,0x3ecb,0x411,0x411,0x3f39,0x3fb9,0x4029,0,0x40a9,0x4129,0xfc12,0xfc12,0xdb12,0xdb12, +0x41db,4,0x4249,4,4,4,0x4299,0x4319,0x4389,0,0x4409,0x4489,0xd512,0xd512,0xd512,0xd512, +0x453b,4,4,4,0x411,0x411,0x45a9,0x4659,0,0,0x4719,0x4799,0xfc12,0xfc12,0xce12,0xce12, +0,4,4,4,0x411,0x411,0x4849,0x48f9,0x49b9,0x391,0x4a39,0x4ab9,0xfc12,0xfc12,0xc812,0xc812, +0xfc92,4,4,4,0,0,0x4b69,0x4be9,0x4c59,0,0x4cd9,0x4d59,0xc012,0xc012,0xc112,0xc112, +0x4e0b,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +4,4,4,4,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,0,4,0,0,4,0,0,4,4,4,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4, +0,0x25,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, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4, +4,0x44,4,4,4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64, +0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,2,0,0,1,2,2,2,1,1, +2,2,2,1,0,2,0,0,0,2,2,2,2,2,0,0, +0,0,0,0,2,0,0x4e7a,0,2,0,0x4eba,0x4efa,2,2,0,1, +2,2,0xe12,2,1,0,0,0,0,1,0,0,1,1,2,2, +0,0,0,0,0,2,1,1,0x21,0x21,0,0,0,0,0xf211,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, +0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, +0,0,0,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, +0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311, +0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1812,0x1812,0x1812,0x1812, 0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0xe811,0xe811,0xe811,0xe811, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0xe811,0x92,0xff91,0x4efa,0x4f1a,0x4f3a,0x4f59,0x4f79,0x92,0xff91,0x92,0xff91,0x92, -0xff91,0x4f9a,0x4fba,0x4fda,0x4ffa,1,0x92,0xff91,1,0x92,0xff91,1,1,1,1,1, -0x25,5,0x501a,0x501a,0x92,0xff91,0x92,0xff91,1,0,0,0,0,0,0,0x92, -0xff91,0x92,0xff91,0x44,0x44,0x44,0x92,0xff91,0,0,0,0,0,0,0,0, -0,0,0,0,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039, -0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0x5039, -0x5039,0x5039,0x5039,0x5039,0x5039,0x5039,0,0x5039,0,0,0,0,0,0x5039,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,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x92,0xff91,0x4f3a,0x4f5a, +0x4f7a,0x4f99,0x4fb9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x4fda,0x4ffa,0x501a,0x503a,1,0x92,0xff91, +1,0x92,0xff91,1,1,1,1,1,0x25,5,0x505a,0x505a,0x92,0xff91,0x92,0xff91, +1,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91,0x44,0x44,0x44,0x92,0xff91, +0,0,0,0,0,0,0,0,0,0,0,0,0x5079,0x5079,0x5079,0x5079, +0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079, +0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0,0x5079, +0,0,0,0,0,0x5079,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,0x64,0x44,0x44,0x44,0x44, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0x64,0x64, -0x64,0x64,0x60,0x60,0,4,4,4,4,4,0,0,0,0,0,4, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, +0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4, +4,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,0,0,0,0,0,0,0,0,0x64,0x64,4,4,4,4,0, +0,0x64,0x64,4,4,4,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,4,4,4,0, +0,0,0,0,4,4,4,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,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,4,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,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x505a,0x5099,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,4,4,4,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x509a,0x50d9,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,5,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91, +0x92,0xff91,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -5,1,1,1,1,1,1,1,1,0x92,0xff91,0x92,0xff91,0x50da,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,4,4,4,0x92,0xff91,0x50fa,1,0, -0x92,0xff91,0x92,0xff91,0x1811,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x511a,0x513a,0x515a,0x517a,0x511a,1,0x519a,0x51ba,0x51da,0x51fa,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xe812,0x521a,0x523a,0x92,0xff91,0x92,0xff91,0, -0,0,0,0,0x92,0xff91,0,1,0,1,0x92,0xff91,0x92,0xff91,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,5,5,5,0x92,0xff91,0,5,5,1,0,0,0,0,0, -0,0,4,0,0,0,0x64,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,4,4,0,0,0,0,0,0x64,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x64,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4, -4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4,4, -4,4,0,0,4,4,0,0,0x60,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,4,4,4,4,4,4,0, -0,4,4,0,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,4,0,0,0, +5,5,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,1,1,1,1,1,1,1, +1,0x92,0xff91,0x92,0xff91,0x511a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +4,4,4,0x92,0xff91,0x513a,1,0,0x92,0xff91,0x92,0xff91,0x1811,1,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x515a,0x517a,0x519a,0x51ba,0x515a,1, +0x51da,0x51fa,0x521a,0x523a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0xe812,0x525a,0x527a,0x92,0xff91,0x92,0xff91,0x529a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x52ba,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, +5,0x92,0xff91,0,5,5,1,0,0,0,0,0,0,0,4,0, +0,0,0x64,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,4,4,0, +0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,4,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,4,0,0,0, +0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,4,4,4,4,4,0x64, +0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, +4,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0, +4,4,0,0,0x60,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,4,4,4,4,4,4,0,0,4,4,0, +0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +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,4,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,0x44,0,0x44,0x44, +0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0,0x44,0x44,0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44, -0,0x44,0,0,0,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,4,4,0,0, -0,0,0,4,4,0,0x64,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x5259,1,1,1,1, -1,1,1,4,5,5,5,5,1,1,1,1,1,1,1,1, -1,5,4,4,0,0,0,0,0x5279,0x52a9,0x52d9,0x5309,0x5339,0x5369,0x5399,0x53c9, -0x53f9,0x5429,0x5459,0x5489,0x54b9,0x54e9,0x5519,0x5549,0x5b79,0x5ba9,0x5bd9,0x5c09,0x5c39,0x5c69,0x5c99,0x5cc9, -0x5cf9,0x5d29,0x5d59,0x5d89,0x5db9,0x5de9,0x5e19,0x5e49,0x5e79,0x5ea9,0x5ed9,0x5f09,0x5f39,0x5f69,0x5f99,0x5fc9, -0x5ff9,0x6029,0x6059,0x6089,0x60b9,0x60e9,0x6119,0x6149,0x5579,0x55a9,0x55d9,0x5609,0x5639,0x5669,0x5699,0x56c9, -0x56f9,0x5729,0x5759,0x5789,0x57b9,0x57e9,0x5819,0x5849,0x5879,0x58a9,0x58d9,0x5909,0x5939,0x5969,0x5999,0x59c9, -0x59f9,0x5a29,0x5a59,0x5a89,0x5ab9,0x5ae9,0x5b19,0x5b49,0,0,0,0,0,4,0,0, -4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x6179,0x61f9,0x6279,0x62f9,0x63a9,0x6459,0x64e9,0, -0,0,0,0,0,0,0,0,0,0,0,0x6589,0x6609,0x6689,0x6709,0x6789, -0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, -0,4,0,0,0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012, +0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,4, +4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x52d9,1,1,1,1,1,1,1,4, +5,5,5,5,1,1,1,1,1,1,1,1,1,5,4,4, +0,0,0,0,0x52f9,0x5329,0x5359,0x5389,0x53b9,0x53e9,0x5419,0x5449,0x5479,0x54a9,0x54d9,0x5509, +0x5539,0x5569,0x5599,0x55c9,0x5bf9,0x5c29,0x5c59,0x5c89,0x5cb9,0x5ce9,0x5d19,0x5d49,0x5d79,0x5da9,0x5dd9,0x5e09, +0x5e39,0x5e69,0x5e99,0x5ec9,0x5ef9,0x5f29,0x5f59,0x5f89,0x5fb9,0x5fe9,0x6019,0x6049,0x6079,0x60a9,0x60d9,0x6109, +0x6139,0x6169,0x6199,0x61c9,0x55f9,0x5629,0x5659,0x5689,0x56b9,0x56e9,0x5719,0x5749,0x5779,0x57a9,0x57d9,0x5809, +0x5839,0x5869,0x5899,0x58c9,0x58f9,0x5929,0x5959,0x5989,0x59b9,0x59e9,0x5a19,0x5a49,0x5a79,0x5aa9,0x5ad9,0x5b09, +0x5b39,0x5b69,0x5b99,0x5bc9,0,0,0,0,0,4,0,0,4,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x61f9,0x6279,0x62f9,0x6379,0x6429,0x64d9,0x6569,0,0,0,0,0, +0,0,0,0,0,0,0,0x6609,0x6689,0x6709,0x6789,0x6809,0,0,0,0, +0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011, +0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,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,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0, +0xf011,0xf011,0xf011,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,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, +0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412, 0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0xec11,0xec11,0xec11,0xec11, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0, +0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0,0xec11,0xec11,0xec11,0xec11, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1392,0x1392,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0, -0x1392,0x1392,0,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91, -0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91, -0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,5,4,4,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, -0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2012,0x2012,0x2012,0x2012, -0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, -0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011, -0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, -0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, +0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392, +0x1392,0x1392,0x1392,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0,0x1392,0x1392,0,0xec91, +0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91, +0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91, +0xec91,0xec91,0,0xec91,0xec91,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,5,5,0,0,0,0,0,5,4,4,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,4,4,4,0,4,4,0, +0,0,0,0,4,0x64,4,0x44,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0,0,0, +0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0,0,0x44,0x64,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64, -0,0,0,0,0,0,0x64,0x64,0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x64,0x44,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, +0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, +0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, +0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, +0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,0x64,0,0,0,0,0, +0,0,0,0,0,0,4,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,0x44,0x44,0x44, +0x44,0x44,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0,0,4,4,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0, -0,4,0,0,0,0,4,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,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,0x44,0x44,0,0,0,0,0,0,0,0,0,0,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,4,4,4,4,0,4,4,4, -4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0, +0,0,0x64,0x64,4,0x64,0x64,0x64,0,0,0,0,0,0,0x64,0x64, +0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x64,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,0,0x60,0,0,0, -0,0,0,0,0,4,0x64,4,4,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4, +4,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,0,0,4,0x60,0x64,4,0,0,0,0,0,0,4,0, -0,0,0,4,4,4,4,4,4,0x64,0x64,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,0x60,0,0, +4,4,4,0,0,0x64,0x64,0,0,4,0,0,0,0,4,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,0x44,0x44,0x44,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0x44,0x44,0x44,0x44, -0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,4, -4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,4,4,0,4,0,0,0,0,4,4,0,0x64,0x64, +4,4,4,4,0,4,4,4,4,4,4,0x64,0x64,0,0,0, 0,0,0,0,0,0,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,4, -4,4,0,0,0,0,0,0,4,4,0,0x64,0x64,0,0,0, +0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, +4,4,4,0,0x60,0,0,0,0,0,0,0,0,4,0x64,4, +4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,0,0,4,0x60,0x64,4, +0,0,0,0,0,0,4,0,0,0,0,4,4,4,4,4, +4,0x64,0x64,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,0x60,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0,0,0,0x44,0x44,0x44,0x44,0x44,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,0x64,0x60,0x64,0,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x64,4,4,0,0x64,0,0,0,0,0, 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,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,4,4,4,4,0,0,4,0,0x64,0,0,0,0, -0,0,0,0,0,0,0,4,0,4,0,0,4,4,4,4, -4,4,0x60,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,4,0,4,0, +0,0,0,4,4,0,0x64,0x64,0,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,4,4,0,0,4,4,4,4,0,4,4,4,4,0x64, +0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0, +4,4,0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,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,4,4,4,4,4,4,4,4, -0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0, +0,4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,4, +0,4,0,0,4,4,4,4,4,4,0x60,0x64,0,0,0,0, +0,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,4,4, +4,4,0,4,4,4,4,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +4,4,4,4,4,4,4,4,0,0x64,0x64,0,0,0,0,0, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,0x60,0x64,0,0,0,0,0x64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,0x60,0x64,0, +0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, 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,4,4,4,0,0,4,4, -0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0, +4,4,4,4,0,0,4,4,0,0,0,0,0,4,4,4, +4,4,4,4,4,4,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,4, +0x64,4,4,4,4,0,0,4,4,4,4,0,0,0,0,0, +0,0,0,0x64,0,0,0,0,0,0,0,0,0,4,4,4, +4,4,4,0,0,4,4,4,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0, +4,0x64,0,0,0,0,0,0,4,0,4,4,4,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,4,0x64,4,4,4,4,0,0,4, -4,4,4,0,0,0,0,0,0,0,0,0x64,0,0,0,0, -0,0,0,0,0,4,4,4,4,4,4,0,0,4,4,4, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, -4,4,4,4,4,4,4,0,4,0x64,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, -4,4,4,0,4,4,4,4,4,4,0,0x64,4,4,4,4, -4,4,4,4,0,0,4,4,4,4,4,4,4,0,4,4, -0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,4,4,4,4,4,0,0,0,4,0, -4,4,0,4,4,4,0x64,4,0x64,0x64,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0, +4,4,4,4,4,4,0,0x64,4,4,4,4,4,4,4,4, +0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0,0,0,4,0,0x64,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -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,4,4,4,4,0, -0,0,0,0,4,0x60,0x64,0,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4, +4,4,0x64,4,0x64,0x64,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,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,0,0,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0, +4,4,0,0,0,4,0,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,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,4,4,4,4,0,0,0,0,0, +4,0x60,0x64,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,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, +0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,4,0,0,0,4,4,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64, 0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4, -4,0,0,0,0,0,0,0,0,0,0,0,0x60,0x60,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,0,4,4,4,4,4,4,4,0,4,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,4,0x64,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,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,0x60,0x60,0x64, -0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4, -4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, +0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0,0,0xf291, +0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291, +0xf291,0xf291,0xf291,0xf291,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0,4,4,0,0,0,0,0,0,0, +0,0,0,0,0x60,0x60,4,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,0,4,4,4, +4,4,4,4,0,4,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,4,0x64,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,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,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60, +0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,1,1,1,1,1,1,1,0,0x21,0x21,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0, -0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2, -2,2,1,1,1,1,0,1,0,1,0x21,0x21,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2, -2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, +1,0,0x21,0x21,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +2,0,2,2,0,0,2,0,0,2,2,0,0,2,2,2, +2,0,2,2,2,2,2,2,2,2,1,1,1,1,0,1, +0,1,0x21,0x21,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0, +2,2,2,2,1,1,1,1,2,2,0,2,2,2,2,0, +0,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2, +2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,2, +2,2,2,0,2,2,2,2,2,0,2,0,0,0,2,2, +2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,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,1,0,1,1,1,1,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,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,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0, +2,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,1,0,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,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,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1, +1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0, +0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,0,0,0,0,0,0,0,0,4,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,4,4,4,4,4, +0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44, +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,0x21,1,1,1,1,0, +0,0,0,0,0,1,1,1,1,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,4,4,4,4,4,0,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0,0,0x44,0x44,0x44,0x44,0x44,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,0x21,1,1,1,1,0,0,0,0,0,0,1,1,1, -1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0,0x44,0x44,0,0x44,0x44, -0x44,0x44,0x44,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x25,5,5,5,5,5,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -0x25,0x25,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -0x64,0x64,0x64,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0, -0,0,0,0,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, +0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x25,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x44,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,0x25,0x25,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,4,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0x64,0x64,0x64,0x44,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x64, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x44,0,0,0x44,0,0,0,0,0,0,0,0x44,0x44, +0,0,0,0,0,0x44,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, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0, 0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, -0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, +0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, +0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, 0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, -0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,0x44,0x44,0x64,4,0,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,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,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0 }; -static const uint16_t ucase_props_exceptions[1664]={ +static const uint16_t ucase_props_exceptions[1672]={ 0xc850,0x20,2,0x130,0x131,0x4810,0x20,0x841,0x6b,1,0x212a,0x841,0x73,1,0x17f,0x5c50, 0x20,2,0x130,0x131,0x844,0x4b,1,0x212a,0x844,0x53,1,0x17f,0x806,0x3bc,0x39c,0x841, 0xe5,1,0x212b,0x8c0,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e,0x844,0xc5,1, 0x212b,0x4810,1,0xce50,0xc7,2,0x49,0x131,0x844,0x49,2,0x69,0x130,0x880,0x2220,0x2bc, -0x6e,0x2bc,0x4e,0x2bc,0x4e,0x806,0x73,0x53,0x809,0x1c6,0x1c5,0x80d,0x1c6,0x1c4,0x1c5,0x80c, -0x1c4,0x1c5,0x809,0x1c9,0x1c8,0x80d,0x1c9,0x1c7,0x1c8,0x80c,0x1c7,0x1c8,0x809,0x1cc,0x1cb,0x80d, -0x1cc,0x1ca,0x1cb,0x80c,0x1ca,0x1cb,0x880,0x2220,0x6a,0x30c,0x4a,0x30c,0x4a,0x30c,0x809,0x1f3, -0x1f2,0x80d,0x1f3,0x1f1,0x1f2,0x80c,0x1f1,0x1f2,0x810,0x2a2b,0x810,0x2a28,0x810,0x2a3f,0x810,0x2a1f, -0x810,0x2a1c,0x810,0x2a1e,0x810,0xa54f,0x810,0xa54b,0x810,0xa528,0x810,0xa544,0x810,0x29f7,0x810,0xa541, -0x810,0x29fd,0x810,0x29e7,0x810,0xa543,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399, -1,0x1fbe,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841, -0x3b2,1,0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345, -0x1fbe,0x841,0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1, -0x3f1,0x4850,0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330, -0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395, -1,0x3f5,0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0, -0x844,0x39c,1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844, -0x3a3,1,0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8, -0x398,1,0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841, -0x3b8,2,0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841, -0x43e,1,0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86, -0x844,0x412,1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83, -0x844,0x422,2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1, -0x1c87,0x4880,0x20,0x565,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91,0x10d1,0x80c,0x1c92,0x10d2, -0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6,0x80c,0x1c97,0x10d7,0x80c, -0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c,0x1c9c,0x10dc,0x80c,0x1c9d, -0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1,0x10e1,0x80c,0x1ca2,0x10e2, -0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6,0x80c,0x1ca7,0x10e7,0x80c, -0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c,0x1cac,0x10ec,0x80c,0x1cad, -0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1,0x10f1,0x80c,0x1cb2,0x10f2, -0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6,0x80c,0x1cb7,0x10f7,0x80c, -0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c,0x1cbe,0x10fe,0x80c,0x1cbf, -0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806,0x13f2,0x13f2,0x806,0x13f3, -0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434,0x414,0x806,0x43e,0x41e, -0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1,0x1c84,0x806,0x44a,0x42a, -0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6,0x810,0x8a38,0x841,0x1e61, -1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x880,0x2220, -0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x880,0x2220, -0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,0x806,0x1e61, -0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x880,0x3330, -0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5,0x313,0x301,0x3a5,0x313, -0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x890, -8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0x890,8,0x220, -0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890,8,0x220,0x1f04,0x3b9, -0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220,0x1f06,0x3b9,0x1f0e,0x399, -0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0xc90,8, -0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0xc90,8,0x220,0x1f03, -0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8,0x220,0x1f05,0x3b9,0x1f0d, -0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x890, -8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0x890,8,0x220, -0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890,8,0x220,0x1f24,0x3b9, -0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220,0x1f26,0x3b9,0x1f2e,0x399, -0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0xc90,8, -0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0xc90,8,0x220,0x1f23, -0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8,0x220,0x1f25,0x3b9,0x1f2d, -0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x890, -8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0x890,8,0x220, -0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890,8,0x220,0x1f64,0x3b9, -0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220,0x1f66,0x3b9,0x1f6e,0x399, -0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0xc90,8, -0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0xc90,8,0x220,0x1f63, -0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8,0x220,0x1f65,0x3b9,0x1f6d, -0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x880, -0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9,0x391,0x399,0x880,0x2220, -0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x880,0x3330, -0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220,0x3b1,0x3b9,0x391,0x399, -0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x890,9,0x220, -0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x880,0x2220,0x3b7,0x342, -0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0xc90, -9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308, -0x300,0x882,0x390,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x880,0x2220,0x3b9, -0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308,0x342, -0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0x882,0x3b0,0x3330,0x3c5,0x308, -0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x880,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1,0x313,0x880, -0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,0x308,0x342,0x3a5,0x308,0x342,0x3a5, -0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x890,9,0x220,0x3c9,0x3b9,0x3a9, -0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9, -0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0xc90,9,0x220,0x3c9, -0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,0x4b,0xc50,0x2046,1,0xc5,0xc10, -0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,0x2a1c,0xc10,0x29fd,0xc10,0x2a1f,0xc10, -0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,0xa64a,1,0x1c88,0xc10,0x8a04,0xc10, -0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,0xa512,0xc10,0xa52a,0xc10,0xa515,0x810, -0x3a0,0xc10,0xa543,0xc10,0x8a38,0xc10,0x3a0,0x806,0x13a0,0x13a0,0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2, -0x806,0x13a3,0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806,0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806, -0x13a8,0x13a8,0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab,0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad, -0x13ad,0x806,0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0,0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2, -0x806,0x13b3,0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806,0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806, -0x13b8,0x13b8,0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb,0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd, -0x13bd,0x806,0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0,0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2, -0x806,0x13c3,0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806,0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806, -0x13c8,0x13c8,0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb,0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd, -0x13cd,0x806,0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0,0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2, -0x806,0x13d3,0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806,0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806, -0x13d8,0x13d8,0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db,0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd, -0x13dd,0x806,0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0,0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2, -0x806,0x13e3,0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806,0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806, -0x13e8,0x13e8,0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb,0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed, -0x13ed,0x806,0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x880, -0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x880, -0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x880,0x3330,0x66,0x66,0x6c,0x46, -0x46,0x4c,0x46,0x66,0x6c,0x882,0xfb06,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0x8c0,1, -0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880,0x2220,0x574,0x576,0x544,0x546,0x544,0x576, -0x880,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b, -0x880,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d +0x6e,0x2bc,0x4e,0x2bc,0x4e,0x806,0x73,0x53,0x810,0xa641,0x809,0x1c6,0x1c5,0x80d,0x1c6,0x1c4, +0x1c5,0x80c,0x1c4,0x1c5,0x809,0x1c9,0x1c8,0x80d,0x1c9,0x1c7,0x1c8,0x80c,0x1c7,0x1c8,0x809,0x1cc, +0x1cb,0x80d,0x1cc,0x1ca,0x1cb,0x80c,0x1ca,0x1cb,0x880,0x2220,0x6a,0x30c,0x4a,0x30c,0x4a,0x30c, +0x809,0x1f3,0x1f2,0x80d,0x1f3,0x1f1,0x1f2,0x80c,0x1f1,0x1f2,0x810,0x2a2b,0x810,0x2a28,0x810,0x2a3f, +0x810,0x2a1f,0x810,0x2a1c,0x810,0x2a1e,0x810,0xa54f,0x810,0xa54b,0x810,0xa567,0x810,0xa528,0x810,0xa544, +0x810,0x29f7,0x810,0xa541,0x810,0x29fd,0x810,0x29e7,0x810,0xa543,0x810,0xa52a,0x1810,0xa515,0x810,0xa512, +0x6800,0x3846,0x3b9,0x399,1,0x1fbe,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399, +0x308,0x301,0x1fd3,0x841,0x3b2,1,0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4, +0x841,0x3b9,2,0x345,0x1fbe,0x841,0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1, +0x3d6,0x841,0x3c1,1,0x3f1,0x4850,0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1, +0x2126,0x8c0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392, +1,0x3d0,0x844,0x395,1,0x3f5,0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe, +0x844,0x39a,1,0x3f0,0x844,0x39c,1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1, +0x806,0x3c3,0x3a3,0x844,0x3a3,1,0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806, +0x3b2,0x392,0x846,0x3b8,0x398,1,0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a, +0x806,0x3c1,0x3a1,0x841,0x3b8,2,0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841, +0x434,1,0x1c81,0x841,0x43e,1,0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85, +0x841,0x44a,1,0x1c86,0x844,0x412,1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82, +0x844,0x421,1,0x1c83,0x844,0x422,2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1, +0x1c87,0x844,0x462,1,0x1c87,0x4880,0x20,0x565,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91, +0x10d1,0x80c,0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6, +0x80c,0x1c97,0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c, +0x1c9c,0x10dc,0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1, +0x10e1,0x80c,0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6, +0x80c,0x1ca7,0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c, +0x1cac,0x10ec,0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1, +0x10f1,0x80c,0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6, +0x80c,0x1cb7,0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c, +0x1cbe,0x10fe,0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806, +0x13f2,0x13f2,0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434, +0x414,0x806,0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1, +0x1c84,0x806,0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6, +0x810,0x8a38,0x841,0x1e61,1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331, +0x48,0x331,0x880,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a, +0x57,0x30a,0x880,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be, +0x41,0x2be,0x806,0x1e61,0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313, +0x3a5,0x313,0x880,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5, +0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342, +0x3a5,0x313,0x342,0x890,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09, +0x399,0x890,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890, +8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220, +0x1f06,0x3b9,0x1f0e,0x399,0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9, +0x1f08,0x399,0xc90,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399, +0xc90,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8, +0x220,0x1f05,0x3b9,0x1f0d,0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07, +0x3b9,0x1f0f,0x399,0x890,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29, +0x399,0x890,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890, +8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220, +0x1f26,0x3b9,0x1f2e,0x399,0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9, +0x1f28,0x399,0xc90,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399, +0xc90,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8, +0x220,0x1f25,0x3b9,0x1f2d,0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27, +0x3b9,0x1f2f,0x399,0x890,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69, +0x399,0x890,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890, +8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220, +0x1f66,0x3b9,0x1f6e,0x399,0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9, +0x1f68,0x399,0xc90,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399, +0xc90,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8, +0x220,0x1f65,0x3b9,0x1f6d,0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67, +0x3b9,0x1f6f,0x399,0x880,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9, +0x391,0x399,0x880,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342, +0x391,0x342,0x880,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220, +0x3b1,0x3b9,0x391,0x399,0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca, +0x345,0x890,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345, +0x880,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399, +0x397,0x342,0x345,0xc90,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399, +0x308,0x300,0x399,0x308,0x300,0x882,0x390,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308, +0x301,0x880,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,0x308, +0x342,0x399,0x308,0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0x882, +0x3b0,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x880,0x2220,0x3c1,0x313,0x3a1, +0x313,0x3a1,0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,0x308,0x342, +0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x890,9, +0x220,0x3c9,0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,0x2220,0x3c9, +0x342,0x3a9,0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345, +0xc90,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,0x4b,0xc50, +0x2046,1,0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,0x2a1c,0xc10, +0x29fd,0xc10,0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,0xa64a,1, +0x1c88,0xc10,0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,0xa512,0xc10, +0xa52a,0xc10,0xa515,0x810,0x3a0,0xc10,0xa543,0xc10,0x8a38,0xc10,0xa567,0xc10,0xa641,0xc10,0x3a0,0x806, +0x13a0,0x13a0,0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3,0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5, +0x13a5,0x806,0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8,0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa, +0x806,0x13ab,0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806,0x13ae,0x13ae,0x806,0x13af,0x13af,0x806, +0x13b0,0x13b0,0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3,0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5, +0x13b5,0x806,0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8,0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba, +0x806,0x13bb,0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806,0x13be,0x13be,0x806,0x13bf,0x13bf,0x806, +0x13c0,0x13c0,0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3,0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5, +0x13c5,0x806,0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8,0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca, +0x806,0x13cb,0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806,0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806, +0x13d0,0x13d0,0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3,0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5, +0x13d5,0x806,0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8,0x806,0x13d9,0x13d9,0x806,0x13da,0x13da, +0x806,0x13db,0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806,0x13de,0x13de,0x806,0x13df,0x13df,0x806, +0x13e0,0x13e0,0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3,0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5, +0x13e5,0x806,0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8,0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea, +0x806,0x13eb,0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806,0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880, +0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x880, +0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46, +0x66,0x69,0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0x882,0xfb06,0x2220, +0x73,0x74,0x53,0x54,0x53,0x74,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05, +0x880,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880,0x2220,0x574,0x565,0x544,0x535,0x544,0x565, +0x880,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576, +0x880,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d }; static const uint16_t ucase_props_unfold[370]={ @@ -979,16 +1005,16 @@ static const UCaseProps ucase_props_singleton={ ucase_props_unfold, { ucase_props_trieIndex, - ucase_props_trieIndex+3412, + ucase_props_trieIndex+3468, nullptr, - 3412, - 9736, + 3468, + 10076, 0x188, - 0xdd0, + 0xe08, 0x0, 0x0, 0xe0800, - 0x3358, + 0x34e4, nullptr, 0, false, false, 0, nullptr }, { 4,0,0,0 } diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index f6a0106aecd9e5..8e60671c3a250b 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -41,7 +41,6 @@ #include "uassert.h" #include "ucase.h" #include "ucasemap_imp.h" -#include "ustr_imp.h" U_NAMESPACE_USE @@ -103,13 +102,16 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { return; } - int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || length==sizeof(csm->locale)) { - *pErrorCode=U_ZERO_ERROR; + UErrorCode bufferStatus = U_ZERO_ERROR; + int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus); + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR || (U_SUCCESS(bufferStatus) && length==sizeof(csm->locale))) { + bufferStatus = U_ZERO_ERROR; /* we only really need the language code for case mappings */ - length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); + length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus); } - if(length==sizeof(csm->locale)) { + if(U_FAILURE(bufferStatus)) { + *pErrorCode=bufferStatus; + } else if(length==sizeof(csm->locale)) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } if(U_SUCCESS(*pErrorCode)) { @@ -161,12 +163,12 @@ appendResult(int32_t cpLength, int32_t result, const char16_t *s, } // See unicode/utf8.h U8_APPEND_UNSAFE(). -inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } -inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } +inline uint8_t getTwoByteLead(UChar32 c) { return static_cast<uint8_t>((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return static_cast<uint8_t>((c & 0x3f) | 0x80); } UChar32 U_CALLCONV utf8_caseContextIterator(void *context, int8_t dir) { - UCaseContext *csc=(UCaseContext *)context; + UCaseContext* csc = static_cast<UCaseContext*>(context); UChar32 c; if(dir<0) { @@ -235,7 +237,7 @@ void toLower(int32_t caseLocale, uint32_t options, if (d == 0) { continue; } ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 1 - prev, sink, options, edits, errorCode); - char ascii = (char)(lead + d); + char ascii = static_cast<char>(lead + d); sink.Append(&ascii, 1); if (edits != nullptr) { edits->addReplace(1, 1); @@ -343,7 +345,7 @@ void toUpper(int32_t caseLocale, uint32_t options, if (d == 0) { continue; } ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 1 - prev, sink, options, edits, errorCode); - char ascii = (char)(lead + d); + char ascii = static_cast<char>(lead + d); sink.Append(&ascii, 1); if (edits != nullptr) { edits->addReplace(1, 1); @@ -748,14 +750,14 @@ void toUpper(uint32_t options, int32_t i2 = i + 2; if ((data & HAS_EITHER_DIALYTIKA) != 0) { change |= (i2 + 2) > nextIndex || - src[i2] != (uint8_t)u8"\u0308"[0] || - src[i2 + 1] != (uint8_t)u8"\u0308"[1]; + src[i2] != static_cast<uint8_t>(u8"\u0308"[0]) || + src[i2 + 1] != static_cast<uint8_t>(u8"\u0308"[1]); i2 += 2; } if (addTonos) { change |= (i2 + 2) > nextIndex || - src[i2] != (uint8_t)u8"\u0301"[0] || - src[i2 + 1] != (uint8_t)u8"\u0301"[1]; + src[i2] != static_cast<uint8_t>(u8"\u0301"[0]) || + src[i2 + 1] != static_cast<uint8_t>(u8"\u0301"[1]); i2 += 2; } int32_t oldLength = nextIndex - i; @@ -868,14 +870,14 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P // Get the string length. if (srcLength == -1) { - srcLength = (int32_t)uprv_strlen((const char *)src); + srcLength = static_cast<int32_t>(uprv_strlen(src)); } if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR - (const uint8_t *)src, srcLength, sink, edits, errorCode); + reinterpret_cast<const uint8_t*>(src), srcLength, sink, edits, errorCode); sink.Flush(); if (U_SUCCESS(errorCode)) { if (edits != nullptr) { @@ -905,7 +907,7 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P /* get the string length */ if(srcLength==-1) { - srcLength=(int32_t)uprv_strlen((const char *)src); + srcLength = static_cast<int32_t>(uprv_strlen(src)); } /* check for overlapping source and destination */ @@ -917,21 +919,20 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P return 0; } - CheckedArrayByteSink sink(dest, destCapacity); if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } - stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR - (const uint8_t *)src, srcLength, sink, edits, errorCode); - sink.Flush(); - if (U_SUCCESS(errorCode)) { - if (sink.Overflowed()) { - errorCode = U_BUFFER_OVERFLOW_ERROR; - } else if (edits != nullptr) { - edits->copyErrorTo(errorCode); - } + int32_t reslen = ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, destCapacity, + [&](ByteSink& sink, UErrorCode& status) { + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + reinterpret_cast<const uint8_t*>(src), srcLength, sink, edits, status); + }, + errorCode); + if (U_SUCCESS(errorCode) && edits != nullptr) { + edits->copyErrorTo(errorCode); } - return u_terminateChars(dest, destCapacity, sink.NumberOfBytesAppended(), &errorCode); + return reslen; } /* public API functions */ diff --git a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp index c2b44a2c7887f6..ebc952a9797557 100644 --- a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp @@ -107,7 +107,7 @@ ucasemap_utf8ToTitle(UCaseMap *csm, return 0; } UText utext=UTEXT_INITIALIZER; - utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); + utext_openUTF8(&utext, src, srcLength, pErrorCode); if (U_FAILURE(*pErrorCode)) { return 0; } diff --git a/deps/icu-small/source/common/uchar.cpp b/deps/icu-small/source/common/uchar.cpp index ff12962baa5ae6..e309189829e892 100644 --- a/deps/icu-small/source/common/uchar.cpp +++ b/deps/icu-small/source/common/uchar.cpp @@ -23,6 +23,7 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" +#include "unicode/ucptrie.h" #include "unicode/uscript.h" #include "unicode/udata.h" #include "uassert.h" @@ -67,9 +68,9 @@ _enumTypeValue(const void *context, uint32_t value) { static UBool U_CALLCONV _enumTypeRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { /* just cast the value to UCharCategory */ - return ((struct _EnumTypeCallback *)context)-> - enumRange(((struct _EnumTypeCallback *)context)->context, - start, end+1, (UCharCategory)value); + return static_cast<const _EnumTypeCallback*>(context)-> + enumRange(static_cast<const _EnumTypeCallback*>(context)->context, + start, end + 1, static_cast<UCharCategory>(value)); } U_CAPI void U_EXPORT2 @@ -90,7 +91,7 @@ U_CAPI UBool U_EXPORT2 u_islower(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_LOWERCASE_LETTER); + return GET_CATEGORY(props)==U_LOWERCASE_LETTER; } /* Checks if ch is an upper case letter.*/ @@ -98,7 +99,7 @@ U_CAPI UBool U_EXPORT2 u_isupper(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_UPPERCASE_LETTER); + return GET_CATEGORY(props)==U_UPPERCASE_LETTER; } /* Checks if ch is a title case letter; usually upper case letters.*/ @@ -106,7 +107,7 @@ U_CAPI UBool U_EXPORT2 u_istitle(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_TITLECASE_LETTER); + return GET_CATEGORY(props)==U_TITLECASE_LETTER; } /* Checks if ch is a decimal digit. */ @@ -114,7 +115,7 @@ U_CAPI UBool U_EXPORT2 u_isdigit(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); + return GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER; } U_CAPI UBool U_EXPORT2 @@ -130,7 +131,7 @@ u_isxdigit(UChar32 c) { } GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER); + return GET_CATEGORY(props)==U_DECIMAL_DIGIT_NUMBER; } /* Checks if the Unicode character is a letter.*/ @@ -138,7 +139,7 @@ U_CAPI UBool U_EXPORT2 u_isalpha(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_L_MASK)!=0); + return (CAT_MASK(props)&U_GC_L_MASK)!=0; } U_CAPI UBool U_EXPORT2 @@ -151,7 +152,7 @@ U_CAPI UBool U_EXPORT2 u_isalnum(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0); + return (CAT_MASK(props)&(U_GC_L_MASK|U_GC_ND_MASK))!=0; } /** @@ -160,7 +161,7 @@ u_isalnum(UChar32 c) { */ U_CFUNC UBool u_isalnumPOSIX(UChar32 c) { - return (UBool)(u_isUAlphabetic(c) || u_isdigit(c)); + return u_isUAlphabetic(c) || u_isdigit(c); } /* Checks if ch is a unicode character with assigned character type.*/ @@ -168,7 +169,7 @@ U_CAPI UBool U_EXPORT2 u_isdefined(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)!=0); + return GET_CATEGORY(props)!=0; } /* Checks if the Unicode character is a base form character that can take a diacritic.*/ @@ -176,7 +177,7 @@ U_CAPI UBool U_EXPORT2 u_isbase(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0); + return (CAT_MASK(props)&(U_GC_L_MASK|U_GC_N_MASK|U_GC_MC_MASK|U_GC_ME_MASK))!=0; } /* Checks if the Unicode character is a control character.*/ @@ -184,7 +185,7 @@ U_CAPI UBool U_EXPORT2 u_iscntrl(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0); + return (CAT_MASK(props)&(U_GC_CC_MASK|U_GC_CF_MASK|U_GC_ZL_MASK|U_GC_ZP_MASK))!=0; } U_CAPI UBool U_EXPORT2 @@ -205,14 +206,14 @@ U_CAPI UBool U_EXPORT2 u_isspace(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c)); + return (CAT_MASK(props)&U_GC_Z_MASK)!=0 || IS_THAT_CONTROL_SPACE(c); } U_CAPI UBool U_EXPORT2 u_isJavaSpaceChar(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_Z_MASK)!=0); + return (CAT_MASK(props)&U_GC_Z_MASK)!=0; } /* Checks if the Unicode character is a whitespace character.*/ @@ -220,11 +221,9 @@ U_CAPI UBool U_EXPORT2 u_isWhitespace(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)( - ((CAT_MASK(props)&U_GC_Z_MASK)!=0 && - c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */ - IS_THAT_ASCII_CONTROL_SPACE(c) - ); + return ((CAT_MASK(props)&U_GC_Z_MASK)!=0 && + c!=NBSP && c!=FIGURESP && c!=NNBSP) || /* exclude no-break spaces */ + IS_THAT_ASCII_CONTROL_SPACE(c); } U_CAPI UBool U_EXPORT2 @@ -235,7 +234,7 @@ u_isblank(UChar32 c) { /* Zs */ uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_SPACE_SEPARATOR); + return GET_CATEGORY(props)==U_SPACE_SEPARATOR; } } @@ -250,7 +249,7 @@ u_isprint(UChar32 c) { uint32_t props; GET_PROPS(c, props); /* comparing ==0 returns false for the categories mentioned */ - return (UBool)((CAT_MASK(props)&U_GC_C_MASK)==0); + return (CAT_MASK(props)&U_GC_C_MASK)==0; } /** @@ -266,7 +265,7 @@ u_isprintPOSIX(UChar32 c) { * The only cntrl character in graph+blank is TAB (in blank). * Here we implement (blank-TAB)=Zs instead of calling u_isblank(). */ - return (UBool)((GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c)); + return (GET_CATEGORY(props)==U_SPACE_SEPARATOR) || u_isgraphPOSIX(c); } U_CAPI UBool U_EXPORT2 @@ -274,9 +273,9 @@ u_isgraph(UChar32 c) { uint32_t props; GET_PROPS(c, props); /* comparing ==0 returns false for the categories mentioned */ - return (UBool)((CAT_MASK(props)& - (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) - ==0); + return (CAT_MASK(props)& + (U_GC_CC_MASK|U_GC_CF_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) + ==0; } /** @@ -292,16 +291,16 @@ u_isgraphPOSIX(UChar32 c) { GET_PROPS(c, props); /* \p{space}\p{gc=Control} == \p{gc=Z}\p{Control} */ /* comparing ==0 returns false for the categories mentioned */ - return (UBool)((CAT_MASK(props)& - (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) - ==0); + return (CAT_MASK(props)& + (U_GC_CC_MASK|U_GC_CS_MASK|U_GC_CN_MASK|U_GC_Z_MASK)) + ==0; } U_CAPI UBool U_EXPORT2 u_ispunct(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&U_GC_P_MASK)!=0); + return (CAT_MASK(props)&U_GC_P_MASK)!=0; } /*Checks if the Unicode character can be ignorable in a Java or Unicode identifier.*/ @@ -312,7 +311,7 @@ u_isIDIgnorable(UChar32 c) { } else { uint32_t props; GET_PROPS(c, props); - return (UBool)(GET_CATEGORY(props)==U_FORMAT_CHAR); + return GET_CATEGORY(props)==U_FORMAT_CHAR; } } @@ -321,7 +320,7 @@ U_CAPI UBool U_EXPORT2 u_isJavaIDStart(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)((CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0); + return (CAT_MASK(props)&(U_GC_L_MASK|U_GC_SC_MASK|U_GC_PC_MASK))!=0; } /*Checks if the Unicode character can be a Java identifier part other than starting the @@ -331,14 +330,13 @@ U_CAPI UBool U_EXPORT2 u_isJavaIDPart(UChar32 c) { uint32_t props; GET_PROPS(c, props); - return (UBool)( - (CAT_MASK(props)& + return (CAT_MASK(props)& (U_GC_ND_MASK|U_GC_NL_MASK| U_GC_L_MASK| U_GC_SC_MASK|U_GC_PC_MASK| U_GC_MC_MASK|U_GC_MN_MASK) )!=0 || - u_isIDIgnorable(c)); + u_isIDIgnorable(c); } U_CAPI int32_t U_EXPORT2 @@ -515,6 +513,8 @@ uprv_getMaxValues(int32_t column) { return indexes[UPROPS_MAX_VALUES_INDEX]; case 2: return indexes[UPROPS_MAX_VALUES_2_INDEX]; + case UPROPS_MAX_VALUES_OTHER_INDEX: + return indexes[column]; default: return 0; } @@ -524,8 +524,8 @@ U_CAPI void U_EXPORT2 u_charAge(UChar32 c, UVersionInfo versionArray) { if(versionArray!=nullptr) { uint32_t version=u_getUnicodeProperties(c, 0)>>UPROPS_AGE_SHIFT; - versionArray[0]=(uint8_t)(version>>4); - versionArray[1]=(uint8_t)(version&0xf); + versionArray[0]=(uint8_t)(version>>2); + versionArray[1]=(uint8_t)(version&3); versionArray[2]=versionArray[3]=0; } } @@ -540,7 +540,7 @@ uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { return USCRIPT_INVALID_CODE; } uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; - uint32_t codeOrIndex=uprops_mergeScriptCodeOrIndex(scriptX); + uint32_t codeOrIndex=scriptX&UPROPS_MAX_SCRIPT; if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) { return (UScriptCode)codeOrIndex; } else if(scriptX<UPROPS_SCRIPT_X_WITH_INHERITED) { @@ -555,7 +555,7 @@ uscript_getScript(UChar32 c, UErrorCode *pErrorCode) { U_CAPI UBool U_EXPORT2 uscript_hasScript(UChar32 c, UScriptCode sc) UPRV_NO_SANITIZE_UNDEFINED { uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; - uint32_t codeOrIndex=uprops_mergeScriptCodeOrIndex(scriptX); + uint32_t codeOrIndex=scriptX&UPROPS_MAX_SCRIPT; if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) { return sc==(UScriptCode)codeOrIndex; } @@ -587,7 +587,7 @@ uscript_getScriptExtensions(UChar32 c, return 0; } uint32_t scriptX=u_getUnicodeProperties(c, 0)&UPROPS_SCRIPT_X_MASK; - uint32_t codeOrIndex=uprops_mergeScriptCodeOrIndex(scriptX); + uint32_t codeOrIndex=scriptX&UPROPS_MAX_SCRIPT; if(scriptX<UPROPS_SCRIPT_X_WITH_COMMON) { if(capacity==0) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; @@ -616,9 +616,44 @@ uscript_getScriptExtensions(UChar32 c, return length; } +namespace { + +UBool U_CALLCONV +_scxRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { + // From u_getUnicodeProperties(start, 0). + uint32_t vecWord = propsVectors[value]; // vecIndex=value, column 0 + uint32_t scriptX = vecWord & UPROPS_SCRIPT_X_MASK; + if (scriptX >= UPROPS_SCRIPT_X_WITH_COMMON) { + // Code points start..end have Script_Extensions. + const USetAdder* sa = static_cast<const USetAdder*>(context); + sa->addRange(sa->set, start, end); + } + (void) value; + return true; +} + +} + +// for icuexportdata +U_CAPI void U_EXPORT2 +uprv_addScriptExtensionsCodePoints(const USetAdder *sa, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + utrie2_enum(&propsVectorsTrie, nullptr, _scxRange, sa); +} + U_CAPI UBlockCode U_EXPORT2 ublock_getCode(UChar32 c) { - return (UBlockCode)((u_getUnicodeProperties(c, 0)&UPROPS_BLOCK_MASK)>>UPROPS_BLOCK_SHIFT); + // We store Block values indexed by the code point shifted right 4 bits + // and use a "small" UCPTrie=CodePointTrie for minimal data size. + // This works because blocks have xxx0..xxxF ranges. + uint32_t c4 = c; // unsigned so that shifting right does not worry the compiler + // Shift unless out of range, in which case we fetch the trie's error value. + if (c4 <= 0x10ffff) { + c4 >>= 4; + } + return (UBlockCode)ucptrie_get(&block_trie, c4); } /* property starts for UnicodeSet ------------------------------------------- */ @@ -626,7 +661,7 @@ ublock_getCode(UChar32 c) { static UBool U_CALLCONV _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { /* add the start code point to the USet */ - const USetAdder *sa=(const USetAdder *)context; + const USetAdder* sa = static_cast<const USetAdder*>(context); sa->add(sa->set, start); (void)end; (void)value; @@ -706,3 +741,18 @@ upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { /* add the start code point of each same-value range of the properties vectors trie */ utrie2_enum(&propsVectorsTrie, nullptr, _enumPropertyStartsRange, sa); } + +U_CFUNC void U_EXPORT2 +ublock_addPropertyStarts(const USetAdder *sa, UErrorCode & /*errorCode*/) { + // Add the start code point of each same-value range of the trie. + // We store Block values indexed by the code point shifted right 4 bits; + // see ublock_getCode(). + UChar32 start = 0, end; + uint32_t value; + while (start < 0x11000 && // limit: (max code point + 1) >> 4 + (end = ucptrie_getRange(&block_trie, start, UCPMAP_RANGE_NORMAL, 0, + nullptr, nullptr, &value)) >= 0) { + sa->add(sa->set, start << 4); + start = end + 1; + } +} diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index 032422397534fe..98af874f0cbc4c 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -9,146 +9,146 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={0xf,1,0,0}; +static const UVersionInfo dataVersion={0x11,0,0,0}; -static const uint16_t propsTrie_index[23156]={ -0x495,0x49d,0x4a5,0x4ad,0x4c5,0x4cd,0x4d5,0x4dd,0x4e5,0x4ed,0x4f3,0x4fb,0x503,0x50b,0x513,0x51b, -0x521,0x529,0x531,0x539,0x53c,0x544,0x54c,0x554,0x55c,0x564,0x560,0x568,0x570,0x578,0x57d,0x585, -0x58d,0x595,0x599,0x5a1,0x5a9,0x5b1,0x5b9,0x5c1,0x5bd,0x5c5,0x5ca,0x5d2,0x5d8,0x5e0,0x5e8,0x5f0, -0x5f8,0x600,0x608,0x610,0x615,0x61d,0x620,0x628,0x630,0x638,0x63e,0x646,0x645,0x64d,0x655,0x65d, -0x66d,0x665,0x675,0x67d,0x683,0x600,0x693,0x68b,0x6a3,0x6a5,0x6ad,0x69b,0x6bd,0x6c3,0x6cb,0x6b5, -0x6db,0x6e1,0x6e9,0x6d3,0x6f9,0x6ff,0x707,0x6f1,0x717,0x71d,0x725,0x70f,0x735,0x73d,0x745,0x72d, -0x755,0x75b,0x763,0x74d,0x773,0x779,0x781,0x76b,0x791,0x796,0x79e,0x789,0x7ae,0x7b5,0x7bd,0x7a6, -0x641,0x7c5,0x7cd,0x4b5,0x7d5,0x7dc,0x7e4,0x4b5,0x7ec,0x7f4,0x7fc,0x801,0x809,0x810,0x818,0x4b5, -0x600,0x820,0x828,0x830,0x838,0x58d,0x848,0x840,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x850,0x600,0x858,0x85c,0x864,0x600,0x86a,0x600,0x870,0x878,0x880,0x58d,0x58d,0x888, -0x890,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x895,0x89d,0x600,0x600,0x8a5,0x8ad,0x8b5,0x8bd,0x8c5,0x600,0x8cd,0x8d5,0x8dd, -0x8ed,0x600,0x8f5,0x8f7,0x8ff,0x8e5,0x600,0x902,0x916,0x90a,0x912,0x91e,0x600,0x926,0x92c,0x934, -0x93c,0x600,0x94c,0x954,0x95c,0x944,0x96c,0x4b5,0x974,0x977,0x97f,0x964,0x98f,0x987,0x600,0x996, -0x600,0x9a5,0x99e,0x9ad,0x9b5,0x9b9,0x9c1,0x9c9,0x535,0x9d1,0x9d4,0x9da,0x9e1,0x9d4,0x55c,0x55c, -0x4e5,0x4e5,0x4e5,0x4e5,0x9e9,0x4e5,0x4e5,0x4e5,0x9f9,0xa01,0xa09,0xa11,0xa19,0xa1d,0xa25,0x9f1, -0xa3d,0xa45,0xa2d,0xa35,0xa4d,0xa55,0xa5d,0xa65,0xa7d,0xa6d,0xa75,0xa85,0xa8d,0xa9c,0xaa1,0xa94, -0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xab1,0xab9,0x934,0xabc,0xac4,0xacb,0xad0,0xad8, -0x934,0xadf,0xade,0xaef,0xaf2,0x934,0x934,0xae7,0x934,0x934,0x934,0x934,0x934,0xb01,0xb09,0xaf9, -0x934,0x934,0x934,0xb0e,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0xb14,0xb1c,0x934,0xb24,0xb2b, -0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0xaa9,0xaa9,0xaa9,0xaa9,0xb33,0xaa9,0xb3a,0xb41, -0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0xaa9,0x934,0xb49,0xb50,0xb54,0xb5a,0x934,0x934,0x934, -0x58d,0x595,0x535,0xb62,0x4e5,0x4e5,0x4e5,0xb6a,0x535,0xb72,0x600,0xb78,0xb88,0xb80,0xb80,0x55c, -0xb90,0xb98,0xba0,0x4b5,0xba8,0x934,0x934,0xbaf,0x934,0x934,0x934,0x934,0x934,0x934,0xbb7,0xbbd, -0xbcd,0xbc5,0x641,0x600,0xbd5,0x890,0x600,0xbdd,0xbe5,0xbe9,0x600,0x600,0xbee,0x600,0x934,0xbf5, -0xad9,0xbfd,0xc03,0x934,0xbfd,0xc0b,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934, -0xc13,0x600,0x600,0x600,0xc1b,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0xc21,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xc26,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x934,0x934, -0xc2e,0xc35,0xc37,0x600,0xc3f,0xc45,0xc4d,0xc55,0xc5a,0x600,0x600,0xc5e,0x600,0x600,0x600,0xc64, -0xc6b,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xc72,0x600,0xc79,0xc7f,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xc87,0x600,0x600,0x600,0xc8f,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0xc91,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xc98,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0xc9f,0x600,0x600,0x600,0xca6,0xcae,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0xcb3,0xcb8,0x600,0x600,0xcc0,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xcc4,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xcc9,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xcc7,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xcd1,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0xcd7,0xcdf,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xce5, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0xcec,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0xcf1,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0xcf6,0x600,0x600,0x600,0xc32,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0xcd3,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0xcfc,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0xd04,0xd0b,0xd0f,0x600,0x600,0x600,0xccb,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0xd1e,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0xd16,0x934,0xd26,0x9ad,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0xd2b,0xd33,0x4e5,0xd43,0xd3b,0x600,0x600,0xd4b,0xd53,0xd63,0x4e5,0xd68,0xd70,0xd76,0xd7d,0xd5b, -0xd85,0xd8d,0x600,0xd95,0xda5,0xda8,0xd9d,0xdb0,0x655,0xdb8,0xdbf,0x8f6,0x6a3,0xdcf,0xdc7,0xdd7, -0x600,0xddf,0xde7,0xdef,0x600,0xdf7,0xdff,0xe07,0xe0f,0xe17,0xe1b,0xe23,0x535,0x535,0x600,0xe2b, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xe33,0xe3f,0xe37, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, +static const uint16_t propsTrie_index[24108]={ +0x485,0x48d,0x495,0x49d,0x4b5,0x4bd,0x4c5,0x4cd,0x4d5,0x4dd,0x4e3,0x4eb,0x4f3,0x4fb,0x503,0x50b, +0x511,0x519,0x521,0x529,0x52c,0x534,0x53c,0x544,0x54c,0x554,0x550,0x558,0x560,0x568,0x56d,0x575, +0x57d,0x585,0x589,0x591,0x599,0x5a1,0x5a9,0x5b1,0x5ad,0x5b5,0x5ba,0x5c2,0x5c8,0x5d0,0x5d8,0x5e0, +0x5e8,0x5f0,0x5f8,0x600,0x605,0x60d,0x610,0x618,0x620,0x628,0x62e,0x636,0x635,0x63d,0x645,0x64d, +0x65d,0x655,0x665,0x66d,0x673,0x5f0,0x683,0x67b,0x693,0x695,0x69d,0x68b,0x6ad,0x6b3,0x6bb,0x6a5, +0x6cb,0x6d1,0x6d9,0x6c3,0x6e9,0x6ef,0x6f7,0x6e1,0x707,0x70d,0x715,0x6ff,0x725,0x72d,0x735,0x71d, +0x745,0x74b,0x753,0x73d,0x763,0x769,0x771,0x75b,0x781,0x786,0x78e,0x779,0x79e,0x7a5,0x7ad,0x796, +0x631,0x7b5,0x7bd,0x4a5,0x7c5,0x7cc,0x7d4,0x4a5,0x7dc,0x7e4,0x7ec,0x7f1,0x7f9,0x800,0x808,0x4a5, +0x5f0,0x810,0x818,0x820,0x828,0x57d,0x838,0x830,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x840,0x5f0,0x848,0x84c,0x854,0x5f0,0x85a,0x5f0,0x860,0x868,0x870,0x57d,0x57d,0x878, +0x880,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x885,0x88d,0x5f0,0x5f0,0x895,0x89d,0x8a5,0x8ad,0x8b5,0x5f0,0x8bd,0x8c5,0x8cd, +0x8dd,0x5f0,0x8e5,0x8e7,0x8ef,0x8d5,0x5f0,0x8f2,0x906,0x8fa,0x902,0x90e,0x5f0,0x916,0x91c,0x924, +0x92c,0x5f0,0x93c,0x944,0x94c,0x934,0x95c,0x954,0x96c,0x96f,0x977,0x964,0x987,0x97f,0x5f0,0x98e, +0x5f0,0x99d,0x996,0x9a5,0x9ad,0x9b1,0x9b9,0x9c1,0x525,0x9c9,0x9cc,0x9d2,0x9d9,0x9cc,0x54c,0x54c, +0x4d5,0x4d5,0x4d5,0x4d5,0x9e1,0x4d5,0x4d5,0x4d5,0x9f1,0x9f9,0xa01,0xa09,0xa11,0xa15,0xa1d,0x9e9, +0xa35,0xa3d,0xa25,0xa2d,0xa45,0xa4d,0xa55,0xa5d,0xa75,0xa65,0xa6d,0xa7d,0xa85,0xa94,0xa99,0xa8c, +0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa9,0xab1,0x924,0xab4,0xabc,0xac3,0xac8,0xad0, +0x924,0xad6,0xade,0xaee,0xaf1,0x924,0x924,0xae6,0x924,0x924,0x924,0x924,0x924,0xb00,0xb08,0xaf8, +0x924,0x924,0x924,0xb0d,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xb13,0xb1b,0x924,0xb23,0xb2a, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xaa1,0xaa1,0xaa1,0xaa1,0xb32,0xaa1,0xb39,0xb40, +0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0x924,0xb48,0xb4f,0xb53,0x924,0x924,0x924,0x924, +0x57d,0x585,0x525,0xb5b,0x4d5,0x4d5,0x4d5,0xb63,0x525,0xb6b,0x5f0,0xb71,0xb81,0xb79,0xb79,0x54c, +0xb89,0xb91,0xb99,0x4a5,0xba1,0x924,0x924,0xba8,0x924,0x924,0x924,0x924,0x924,0x924,0xad3,0xbad, +0xbbd,0xbb5,0x631,0x5f0,0xbc5,0x880,0x5f0,0xbcd,0xbd5,0xbd9,0x5f0,0x5f0,0xbde,0x5f0,0x924,0xbe5, +0xbed,0xbf5,0xbfb,0x924,0xbf5,0xc03,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0xc0b,0x5f0,0x5f0,0x5f0,0xc13,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0xc19,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc1e,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x924,0x924, +0xc26,0xc2d,0xc2f,0x5f0,0xc37,0xc3d,0xc45,0xc4d,0xc52,0x5f0,0x5f0,0xc56,0x5f0,0x5f0,0x5f0,0xc5c, +0xc63,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc6a,0x5f0,0xc71,0xc77,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc7f,0x5f0,0x5f0,0x5f0,0xc87,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc89,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc90,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0xc97,0x5f0,0x5f0,0x5f0,0xc9e,0xca6,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcab,0xcb0,0x5f0,0x5f0,0xcb8,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcbc,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcc1,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcbf,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcc9,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0xccf,0xcd7,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcdd, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0xce4,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0xce9,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcee,0x5f0,0x5f0,0x5f0,0xc2a,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0xccb,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcf4,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0xcfc,0xd03,0xd07,0x5f0,0x5f0,0x5f0,0xcc3,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0xd16,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0xd0e,0x924,0xd1e,0x9a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0xd23,0xd2b,0x4d5,0xd3b,0xd33,0x5f0,0x5f0,0xd43,0xd4b,0xd5b,0x4d5,0xd60,0xd68,0xd6e,0xd75,0xd53, +0xd7d,0xd85,0x5f0,0xd8d,0xd9d,0xda0,0xd95,0xda8,0x645,0xdb0,0xdb7,0x8e6,0x693,0xdc7,0xdbf,0xdcf, +0x5f0,0xdd7,0xddf,0xde7,0x5f0,0xdef,0xdf7,0xdff,0xe07,0xe0f,0xe13,0xe1b,0x525,0x525,0x5f0,0xe23, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe2b,0xe37,0xe2f, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, +0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, 0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, 0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x600,0x600,0x600,0xe57,0x600,0xccc,0xe5e,0xe63, -0x600,0x600,0x600,0xe6b,0x600,0x600,0x901,0x4b5,0xe81,0xe71,0xe79,0x600,0x600,0xe89,0xe91,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xe96,0x938,0x600,0xe9e,0x600,0xea4,0xea8, -0xeb0,0xeb8,0xebf,0xec7,0x600,0x600,0x600,0xecd,0xee5,0x4a5,0xeed,0xef5,0xefa,0x916,0xed5,0xedd, 0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, 0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0x12d4,0x12d4,0x1314,0x1354,0x1394,0x13cc,0x140c,0x144c,0x1484,0x14c4,0x14f0,0x1530,0x1570,0x1580,0x15c0,0x15f4, -0x1634,0x1664,0x16a4,0x16e4,0x16f4,0x1728,0x1760,0x17a0,0x17e0,0x1820,0x1854,0x1880,0x18c0,0x18f8,0x1914,0x1954, -0xa80,0xac0,0xb00,0xb40,0xb80,0xbab,0xbeb,0xa40,0xc0e,0xa40,0xa40,0xa40,0xa40,0xc4e,0x1db,0x1db, -0xc8e,0xcce,0xa40,0xa40,0xa40,0xcf7,0xd37,0xd57,0xa40,0xd7d,0xdbd,0xdfd,0xe3d,0xe7d,0xebd,0xefd, -0xf3d,0xf74,0x1db,0x1db,0xf98,0xfcc,0x1db,0xff4,0x1db,0x1db,0x1db,0x1db,0x1021,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0x1035,0x1db,0x106d,0x10ad,0x1db,0x10b8,0x1db,0x1db,0x1db,0x10ee,0xa40,0x112e, -0x1db,0x1db,0x116e,0x1db,0x1191,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0x5f0,0x5f0,0x5f0,0xe4f,0x5f0,0xcc4,0xe56,0xe5b, +0x5f0,0x5f0,0x5f0,0xe63,0x5f0,0x5f0,0x8f1,0x4a5,0xe79,0xe69,0xe71,0x5f0,0x5f0,0xe81,0xe89,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe8e,0x928,0x5f0,0xe96,0x5f0,0xe9c,0xea0, +0xea8,0xeb0,0xeb7,0xebf,0x5f0,0x5f0,0x5f0,0xec5,0xedd,0x495,0xee5,0xeed,0xef2,0x906,0xecd,0xed5, +0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, +0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, +0x1294,0x1294,0x12d4,0x1314,0x1354,0x138c,0x13cc,0x140c,0x1444,0x1484,0x14b0,0x14f0,0x1530,0x1540,0x1580,0x15b4, +0x15f4,0x1624,0x1664,0x16a4,0x16b4,0x16e8,0x1720,0x1760,0x17a0,0x17e0,0x1814,0x1840,0x1880,0x18b8,0x18d4,0x1914, +0xa80,0xac0,0xb00,0xb40,0xb80,0xbab,0xbeb,0x1db,0xc0e,0xa40,0xa40,0xa40,0xc46,0xc86,0x1db,0x1db, +0x1db,0xcc6,0xa40,0xa40,0xa40,0xcf6,0xd36,0xd56,0xa40,0xd7c,0xdbc,0xdfc,0xe3c,0xe7c,0xebc,0xefc, +0xf3c,0xf73,0x1db,0x1db,0xf97,0xfcb,0x1db,0xff3,0x1db,0x1db,0x1db,0x1db,0x1020,0x1db,0x1db,0x1db, +0x1db,0x1db,0x1db,0x1db,0x1034,0x1db,0x1db,0x1074,0x1db,0x107f,0x1db,0x1db,0x1db,0x10b5,0xa40,0x10f5, +0x1db,0x1db,0x1135,0x1db,0x1db,0x1db,0x1152,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -170,142 +170,138 @@ static const uint16_t propsTrie_index[23156]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0x11d1,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x1192,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1211, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x11d2, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1211, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0xf02,0xf09,0xf11,0x4b5,0x600,0x600,0x600,0xf19,0xf29,0xf21,0xf40,0xf31,0xf38,0xf48,0xbbd,0xf50, -0x4b5,0x4b5,0x4b5,0x4b5,0x8f6,0x600,0xf58,0xf60,0x600,0xf68,0xf70,0xf74,0xf7c,0x600,0xf84,0x4b5, -0x58d,0x597,0xf8c,0x600,0xf90,0xf98,0xfa8,0xfa0,0x600,0xfb0,0x600,0xfb7,0xfc7,0xfbf,0x4b5,0x4b5, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xb88,0x902,0xfcf,0xfdf,0xfd7,0x4b5,0x4b5, -0xfef,0xfe7,0xff2,0xffa,0x916,0x1002,0x4b5,0x100a,0x1012,0x101a,0x4b5,0x4b5,0x600,0x102a,0x1032,0x1022, -0x1042,0x1049,0x103a,0x1051,0x1059,0x4b5,0x1069,0x1061,0x600,0x106c,0x1074,0x107c,0x1084,0x108c,0x4b5,0x4b5, -0x600,0x600,0x1094,0x4b5,0x58d,0x109c,0x535,0x10a4,0x600,0x10ac,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x10b4,0x600,0x10bc,0x4b5,0x10c1,0x10c9,0x10d1,0x10d8,0x1006,0x10e0,0x1006,0x10e8,0xb88, -0x10f8,0x636,0x1100,0x10f0,0x98f,0x1108,0x1110,0x1116,0x112e,0x111e,0x1126,0x1132,0x98f,0x1142,0x113a,0x114a, -0x1162,0x1152,0x115a,0x4b5,0x1169,0x1171,0x658,0x1179,0x1189,0x118f,0x1197,0x1181,0x4b5,0x4b5,0x4b5,0x4b5, -0x600,0x119f,0x11a7,0x10c0,0x600,0x11af,0x11b7,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x11bf,0x11c7,0x4b5, -0x600,0x11cf,0x11d7,0x11df,0x600,0x11ef,0x11e7,0x4b5,0x870,0x11f7,0x11ff,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x600,0x1207,0x4b5,0x4b5,0x4b5,0x58d,0x535,0x120f,0x121f,0x1225,0x1217,0x4b5,0x4b5,0x1235,0x1239,0x122d, -0x1251,0x1241,0x1249,0x600,0x125f,0x1259,0x600,0x8f7,0x126f,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x127d,0x1282,0x1267,0x1277,0x1292,0x128a,0x4b5,0x4b5,0x12a1,0x12a5,0x1299,0x12b5,0x12ad,0x11e7,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x12b9,0x12c9,0x12ce,0x12c1,0x4b5,0x4b5,0x12d6,0x12e6,0x12de, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x901,0x4b5,0x4b5,0x4b5, -0x12f6,0x12fe,0x1306,0x12ee,0x600,0x600,0x600,0x600,0x600,0x600,0x130e,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x1006,0x600,0x600,0x1316,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x131e,0x1326,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x11ff,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x8f7, -0x916,0xdcb,0x600,0x916,0x132e,0x1333,0x600,0x1343,0x134b,0x1353,0x133b,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x58d,0x535,0x135b,0x4b5,0x4b5,0x4b5,0x600,0x600,0x1363,0x1368,0x136e,0x4b5,0x4b5,0x1376,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x137e,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x902,0x4b5,0x1094,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x1384,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x138c,0x1391,0x1398,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xe37,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x600,0x600,0x139e,0x13a3,0x13ab,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x55c,0x13bb,0x13c2,0x934,0x934,0x934,0x13b3,0x4b5,0x934,0x934,0x934, -0x934,0x934,0x934,0x934,0xbb7,0x934,0x13c9,0x934,0x13d0,0x13d8,0x13de,0x934,0xade,0x934,0x934,0x13e6, -0x4b5,0x4b5,0x4b5,0x13ee,0x13ee,0x934,0x934,0xadb,0x13f6,0x4b5,0x4b5,0x4b5,0x4b5,0x1406,0x140d,0x1412, -0x1418,0x1420,0x1428,0x1430,0x140a,0x1438,0x1440,0x1448,0x144d,0x141f,0x1406,0x140d,0x1409,0x1418,0x1455,0x1407, -0x1458,0x140a,0x1460,0x1468,0x1470,0x1477,0x1463,0x146b,0x1473,0x147a,0x1466,0x1482,0x13fe,0x934,0x934,0x934, -0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x55c,0x1492,0x55c, -0x1499,0x14a0,0x148a,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x14af,0x14b7,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x14a7,0x14bf,0x9d4, -0x14cf,0x14c7,0x4b5,0x4b5,0x4b5,0x600,0x14df,0x14d7,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x1006,0x14e7,0x600,0x14ef,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x1006,0x14f7,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x14ff,0x600,0x600,0x600, -0x600,0x600,0x600,0x1507,0x4b5,0x58d,0x1517,0x150f,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x151f,0x152f,0x1527,0x4b5,0x4b5,0x153f,0x1537,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x154f,0x1557,0x155f, -0x1567,0x156f,0x1577,0x4b5,0x1547,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x934,0x157f,0x934, -0x934,0xbaf,0x13c7,0x1587,0xbb7,0x158f,0x934,0x934,0x934,0x934,0xbb9,0x4b5,0x1597,0x159f,0x15a3,0x15ab, -0x15b3,0x4b5,0x4b5,0x4b5,0x4b5,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x15bb,0x934,0x934,0x934, -0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934, -0x934,0x934,0x934,0x15a4,0x15c3,0x934,0x934,0x934,0x15cb,0x934,0x934,0x15d2,0x15da,0x157f,0x934,0x15e2, -0x934,0x15ea,0x15ef,0x4b5,0x4b5,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0x934,0xbaf, -0x15f7,0x1600,0x1604,0x160c,0x15fc,0x934,0x934,0x934,0x934,0x1614,0x934,0xade,0x11e3,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x161c,0x600,0x600, -0x1623,0x600,0x600,0x600,0x162b,0x600,0x1633,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xca3,0x600,0x600, -0x163b,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x1643,0x164b,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0xc32,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x1652,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x1659,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x1660,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x4b5,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x901,0x600,0x600,0x600,0x600,0x600,0x600,0xf90,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x1668,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x1670,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0xf90,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x600, -0x600,0x600,0x1674,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0xf90,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x67d,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x133b,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x1684,0x167c,0x167c,0x167c,0x4b5,0x4b5,0x4b5,0x4b5,0x55c,0x55c,0x55c,0x55c,0x55c,0x55c,0x55c, -0x168c,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5,0x4b5, -0x4b5,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0x1694,0x494,0x494,0x494,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x11d2, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0xefa,0xf01,0xf09,0x4a5,0x5f0,0x5f0,0x5f0,0xf11,0xf21,0xf19,0xf38,0xf29,0xf30,0xf40,0xbad,0xf48, +0x4a5,0x4a5,0x4a5,0x4a5,0x8e6,0x5f0,0xf50,0xf58,0x5f0,0xf60,0xf68,0xf6c,0xf74,0x5f0,0xf7c,0x4a5, +0x57d,0x587,0xf84,0x5f0,0xf88,0xf90,0xfa0,0xf98,0x5f0,0xfa8,0x5f0,0xfaf,0xfbf,0xfb7,0x5f0,0xfc7, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xb81,0x8f2,0xfca,0xfda,0xfd2,0x4a5,0x4a5, +0xfea,0xfe2,0xfed,0xff5,0x906,0xffd,0x4a5,0x1005,0x100d,0x1015,0x8f1,0x4a5,0x5f0,0x1025,0x102d,0x101d, +0x103d,0x1044,0x1035,0x104c,0x1054,0x4a5,0x1064,0x105c,0x5f0,0x1067,0x106f,0x1077,0x107f,0x1087,0x4a5,0x4a5, +0x5f0,0x5f0,0x108f,0x4a5,0x57d,0x1097,0x525,0x109f,0x5f0,0x10a7,0x10be,0x10af,0x10b6,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x10c6,0x5f0,0x10ce,0x10db,0x10d3,0x10e3,0x10eb,0x10f2,0x1001,0x10fa,0x1001,0x1102,0xb81, +0x1112,0x626,0x111a,0x110a,0x987,0x1122,0x112a,0x1130,0x1148,0x1138,0x1140,0x114c,0x987,0x115c,0x1154,0x1164, +0x117c,0x116c,0x1174,0x4a5,0x1183,0x118b,0x648,0x1193,0x11a3,0x11a9,0x11b1,0x119b,0x11c1,0x11c5,0x11cd,0x11b9, +0x5f0,0x11d5,0x11dd,0x11e5,0x5f0,0x11ed,0x11f5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x11fd,0x1205,0x4a5, +0x5f0,0x120d,0x1215,0x121d,0x5f0,0x122d,0x1225,0x1235,0x124d,0x123d,0x1245,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x5f0,0x1255,0x4a5,0x4a5,0x4a5,0x57d,0x525,0x125d,0x126d,0x1273,0x1265,0x4a5,0x4a5,0x1283,0x1287,0x127b, +0x129f,0x128f,0x1297,0x5f0,0x12ad,0x12a7,0x5f0,0x8e7,0x12bd,0x4a5,0x4a5,0x12b5,0x4a5,0x4a5,0x5f0,0x12c5, +0x12db,0x12e0,0x12cd,0x12d5,0x12f0,0x12e8,0x4a5,0x4a5,0x12ff,0x1303,0x12f7,0x131a,0x130b,0x1313,0x131d,0x1325, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x132d,0x133d,0x1342,0x1335,0x4a5,0x4a5,0x134a,0x135a,0x1352, +0x5f0,0x1362,0x5f0,0x1369,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x1370,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1376,0x5f0,0x5f0,0x5f0,0x137a,0x4a5,0x4a5,0x4a5, +0x138a,0x1392,0x139a,0x1382,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x13a2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1001,0x5f0,0x5f0,0x13aa,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x13b2,0x13ba,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf11,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x1245,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x637,0x13c2, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8e7,0x906,0xdc3,0x5f0,0x906,0x1313,0x13ca,0x5f0,0x13d2, +0x13da,0x13e2,0xfc8,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x13f2,0x13ea,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x57d,0x525,0x13fa,0x140a,0x1402,0x4a5,0x5f0,0x5f0, +0x1412,0x1417,0x141d,0x4a5,0x4a5,0x1425,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8f2,0x142b,0x906,0x4a5, +0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x1433,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1438,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1440, +0x1445,0x144c,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe2f,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x1452,0x1457,0x145f,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x1467,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x146f,0x147e,0x1476,0x54c,0x148e,0x1495,0x924,0x924,0x924,0x1486,0x4a5,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0xad3,0x924,0x149c,0x924,0x14a3,0x14ab,0x14b1,0x924,0xade,0x924,0x924,0x14b9,0x4a5, +0x4a5,0x4a5,0x14c1,0x14c1,0x924,0x924,0x14c9,0x14d1,0x4a5,0x4a5,0x4a5,0x4a5,0x14e1,0x14e8,0x14ed,0x14f3, +0x14fb,0x1503,0x150b,0x14e5,0x1513,0x151b,0x1523,0x1528,0x14fa,0x14e1,0x14e8,0x14e4,0x14f3,0x1530,0x14e2,0x1533, +0x14e5,0x153b,0x1543,0x154b,0x1552,0x153e,0x1546,0x154e,0x1555,0x1541,0x155d,0x14d9,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x54c,0x156d,0x54c,0x1574, +0x157b,0x1565,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x158a,0x1592,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1582,0x159a,0x9cc,0x15aa, +0x15a2,0x4a5,0x4a5,0x4a5,0x5f0,0x15ba,0x15b2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x1001,0x15c2,0x5f0,0x15ca,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x1001,0x15d2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1001,0x15da,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x906,0x15e2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x15ea,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x15f2,0x4a5,0x57d,0x1602,0x15fa,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x160a, +0x161a,0x1612,0x4a5,0x4a5,0x162a,0x1622,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x163a,0x1642,0x164a,0x1652, +0x165a,0x1662,0x4a5,0x1632,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x166a,0x924,0x924, +0xba8,0x149a,0x1672,0xad3,0x167a,0x924,0x924,0x924,0x924,0xad5,0x4a5,0x1682,0x168a,0x168e,0x1696,0x169e, +0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x16a6,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x16ae,0x16b1,0x924,0x924,0x924,0x924,0x924,0x924,0xad2,0x16b9,0x166a,0x924,0x16c1,0x924, +0x16c9,0x16ce,0x16d6,0x4a5,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x16e6,0x16de, +0x16ee,0x924,0x16f5,0x16fd,0x924,0x924,0x924,0x924,0x1705,0x924,0x924,0x170a,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1712,0x5f0,0x5f0,0x1719, +0x5f0,0x5f0,0x5f0,0x1721,0x5f0,0x1729,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc9b,0x5f0,0x5f0,0x1731, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1739,0x1741,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0xc2a,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1748,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x174f,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x1756,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0xe63,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x175e,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x1762,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x66d, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, +0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8f1,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x1772,0x176a,0x176a,0x176a,0x4a5,0x4a5,0x4a5,0x4a5,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c, +0x54c,0x177a,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, +0x4a5,0x4a5,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, +0xe47,0x1782,0x484,0x484,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, 0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, @@ -348,7 +344,7 @@ static const uint16_t propsTrie_index[23156]={ 1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,5,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,5,5,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,4, @@ -429,8 +425,8 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, 0,0,0x17,0,5,5,5,5,5,5,5,5,5,5,5,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x1a,5,5,5,5,5,5,0,0x10,0x10,0,0, -0,0,0,0,6,6,6,6,6,6,6,6,6,6,0x10,6, +5,5,5,5,0x1a,5,5,5,5,5,5,5,0x10,0x10,0,0, +0,0,0,6,6,6,6,6,6,6,6,6,6,6,0x10,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5, 5,5,5,5,5,4,6,6,6,6,6,6,6,6,6,6, @@ -486,7 +482,7 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,0,0,6,5,6,6,6,8,8,8, 8,0,6,6,6,0,6,6,6,6,0,0,0,0,0,0, -0,6,6,0,5,5,5,0,0,5,0,0,5,5,6,6, +0,6,6,0,5,5,5,0,5,5,0,0,5,5,6,6, 0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,8, 0,0,0,0,0,0,0,0,0,0,0,0,5,6,8,8, 0x17,5,5,5,5,5,5,5,5,0,5,5,5,0,5,5, @@ -494,7 +490,7 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,5,5,5,0,5,5,5,5,5,0,0, 6,5,8,6,8,8,8,8,8,0,6,8,8,0,8,8, 6,6,0,0,0,0,0,0,0,8,8,0,0,0,0,0, -0,5,5,0,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, +5,5,5,0,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, 0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5, 5,5,5,5,6,6,8,8,5,5,5,5,5,5,5,5, 5,0,5,5,5,0,5,5,5,5,5,5,5,5,5,5, @@ -613,14 +609,16 @@ static const uint16_t propsTrie_index[23156]={ 8,8,8,6,6,6,6,6,6,6,6,6,6,0,0,6, 0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, 0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6, -6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, +6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +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,0,0, +0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6, +6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17, 6,6,6,6,8,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,8,6,6,6,6,6,8,6,8,8,8,8,8,6,8, -8,5,5,5,5,5,5,5,5,0,0,0,0x49,0x89,0xc9,0x109, +8,5,5,5,5,5,5,5,5,0,0x17,0x17,0x49,0x89,0xc9,0x109, 0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6, 6,6,8,8,6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109, 0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,6,6,8,5, @@ -633,7 +631,7 @@ static const uint16_t propsTrie_index[23156]={ 6,6,6,6,6,6,6,6,8,8,6,6,0,0,0,0x17, 0x17,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4, -4,4,0x17,0x17,2,2,2,2,2,2,2,2,2,0,0,0, +4,4,0x17,0x17,2,2,2,2,2,2,2,2,2,1,2,0, 0,0,0,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,1,1,1,0, 0,1,1,1,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0, @@ -675,7 +673,7 @@ static const uint16_t propsTrie_index[23156]={ 0x18,0x14,0x15,0,4,4,4,4,4,4,4,4,4,4,4,4, 4,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0,0, +0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, 6,7,7,7,7,6,7,7,7,6,6,6,6,6,6,6, 6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, @@ -708,62 +706,60 @@ static const uint16_t propsTrie_index[23156]={ 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, 0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b, -0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb, 0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b, -0x98b,0x9cb,0xa0b,0xa4b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b, -0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14, +0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, +0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb, +0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14, 0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b, +0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,1, +1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2, +2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2, +2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2, +0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2, +2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17, +0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17, +0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13, +0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x1b,0x1b,0x17,0x17,0x17,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x13,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,1,1,2,2,1, -2,1,2,1,2,1,1,1,1,2,1,2,2,1,2,2, -2,2,2,2,4,4,1,1,1,2,1,2,2,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2,0,0,0,0, -0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2,2,2,0,2, -0,0,0,0,0,2,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,4, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, -0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17, -0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x17,0x17,4, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17, -0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x1b,0x1b,0x17,0x17,0x17,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6, 6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4, @@ -777,9 +773,11 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,0,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, 0,0,0,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b, +5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b, 0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b, @@ -810,7 +808,7 @@ static const uint16_t propsTrie_index[23156]={ 5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7905,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845, @@ -867,7 +865,7 @@ static const uint16_t propsTrie_index[23156]={ 0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a, 0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, 0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, 4,1,2,5,4,4,2,5,5,5,5,5,0x1a,0x1a,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, @@ -875,9 +873,9 @@ static const uint16_t propsTrie_index[23156]={ 1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5, 1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,2, -1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,0, -0,0,0,0,1,2,0,2,0,2,1,2,1,2,0,0, -0,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, +1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,1, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,8,8,6,6,8,0x1b,0x1b,0x1b,0x1b, 6,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0, @@ -944,12 +942,12 @@ static const uint16_t propsTrie_index[23156]={ 0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0, 0,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,0x15,0x14,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0x1b, +5,5,5,5,5,5,5,5,0x1b,0x1b,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0x1b,0x1b, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, @@ -1024,196 +1022,227 @@ static const uint16_t propsTrie_index[23156]={ 2,2,2,2,2,2,0,2,2,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0, 1,1,0,2,2,2,2,2,2,2,2,2,5,5,5,5, -5,5,5,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,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,0,0,0,0,0,4,4,4,4, -4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5, -5,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b, -0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b, -0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,0, -0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb, -0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b, -0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b, -0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,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,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4, +4,4,4,0,0,0,0,0,4,4,4,4,4,4,0,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,0,0,0,5,0,0,5,5,5,5,5,5,5,0,0, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb, +0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b, +0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,0,0,0,0,0,0x58b, +0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b, +0,0,0,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b, +0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b, +0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b, +0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,0x344b,0,0,0, +0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,5,6,6,6,0,6,6,0,0,0,0,0, +6,6,6,6,5,5,5,5,0,5,5,5,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, -0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b, -0x344b,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,5,6,6,6,0,6,6,0, -0,0,0,0,6,6,6,6,5,5,5,5,0,5,5,5, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,6,6,6,0, -0,0,0,6,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,6,6,6,0,0,0,0,6, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x11cb,0x17, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b, +5,5,5,5,5,6,6,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,0x1b,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, +0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b,5,5,5,5, +6,6,6,6,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,1,1,1,1, +1,1,0,0,0,6,6,6,6,6,0x13,4,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, +0,0,0,0,0,0,0x18,0x18,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,5,5,5,4,5,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, +0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0,5,5,5,5,5,5,5,5, +5,5,0,6,6,0x13,0,0,5,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,6,6,6,6,6,6,0,0,5,5, +5,4,5,5,0,0,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b, +0xccb,0x1e4b,0x344b,5,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,6,6,6,6,6,6,6,6,0x58b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17, +0x17,0x17,0,0,0,0,0,0,5,5,6,6,6,6,0x17,0x17, +0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,0x58b,0x5cb,0x60b, +0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,5,5,6,6,5,0,0, +0,0,0,0,0,0,0,6,8,6,8,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b, +0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,8, +8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,6,0,0,0,0,0, +0,0,0,0,0,0x10,0,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b, -5,5,5,5,6,6,6,6,0,0,0,0,0,0,0,0, 0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb, -0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0, -5,5,5,5,5,5,5,5,5,5,0,6,6,0x13,0,0, -5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,6,6,6,6,6,8,6,6,6, +6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x17,0x17,0x17,0x17,5,8,8,5,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,6,0x17,0x17,5,0,0,0,0,0,0,0,0,0, +8,5,5,5,5,0x17,0x17,0x17,0x17,6,6,6,6,0x17,8,6, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17,5,0x17,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,8,8,8,6,6,6,6,6,6,6,6,6,8, +0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,6,5, +5,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,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,5,0,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,5,0x17,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,6,6,6,6,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,8,8, +0,0,6,6,6,6,6,6,6,0,0,0,6,6,6,6, +6,0,0,0,0,0,0,0,0,0,0,0,6,6,8,8, +0,5,5,5,5,5,5,5,5,0,0,5,5,0,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, +5,5,5,5,5,0,5,5,0,5,5,5,5,5,0,6, +6,5,8,8,6,8,8,8,8,0,0,8,8,0,0,8, +8,8,0,0,5,0,0,0,0,0,0,8,0,0,0,0, +0,5,5,5,0,6,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,5,5,5,5,5,5,5,5,5,0,5, +0,0,5,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,8,8,8,6, +6,6,6,6,6,0,8,0,0,8,0,8,8,8,8,0, +8,8,6,8,6,5,6,5,0x17,0x17,0,0x17,0x17,0,0,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, -6,0x58b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, -5,5,6,6,6,6,0x17,0x17,0x17,0x17,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,8,8,8,6,6,6,6, +6,6,6,6,8,8,6,6,6,8,6,5,5,5,5,0x17, +0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0,0x17,6,5,5,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, -5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,8,8,8,6,6,6,6,6,6,8,6,8, +8,8,8,6,6,8,6,6,5,5,0x17,5,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,8,8,8,6,6,6,6,0,0,8,8,8,8, +6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, +6,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,8, +8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89, +0xc9,0x109,0x149,0x189,5,5,5,5,5,5,5,5,5,5,5,6, +8,6,8,8,6,6,6,6,6,6,8,6,5,0x17,0,0, +0,0,0,0,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -6,5,5,6,6,5,0,0,0,0,0,0,0,0,0,6, -8,6,8,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17, -0x17,0x17,6,0,0,0,0,0,0,0,0,0,0,0x10,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6, -6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,8,8,5, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,6,0x17,0x17,5,0, -0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17, -0x17,6,6,6,6,0x17,8,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, -6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,6,5,5,6,0,0,0,0,0,0, +0,0,0,0,8,8,6,6,6,6,8,6,6,6,6,6, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, +0x17,0x17,0x17,0x1b,5,5,5,5,5,5,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,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,0x17,0,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,6,8,6,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,6,6,6,6,6,8,6,6,0x17, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, +0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0, +0,0,0,5,8,5,8,6,0x17,0x17,0x17,0,0,0,0,0, 0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6, -6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,6,6,8,8,0,5,5,5,5,5,5,5, -5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5, -0,5,5,5,5,5,0,6,6,5,8,8,6,8,8,8, -8,0,0,8,8,0,0,8,8,8,0,0,5,0,0,0, -0,0,0,8,0,0,0,0,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,8,8,8,6,6,6,6,6,6,6,6,8,8,6,6, -6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0x17,6,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, -6,6,6,6,6,8,6,8,8,8,8,6,6,8,6,6, -5,5,0x17,5,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, -6,6,0,0,8,8,8,8,6,6,8,6,6,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,5,5,5,5,6,6,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, -6,6,6,6,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17, -5,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,0,0,5,0,0, +5,5,5,5,5,5,5,5,0,5,5,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,8, +8,8,0,8,8,0,0,6,6,8,6,5,6,5,0x17,5, +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,5,5,5,5, -5,5,5,5,5,5,5,6,8,6,8,8,6,6,6,6, -6,6,8,6,5,0x17,0,0,0,0,0,0,8,8,6,6, -6,6,8,6,6,6,6,6,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b,5,5,5,5, -5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8, +6,6,6,6,0,0,6,6,8,8,8,8,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +6,6,6,6,6,8,5,6,6,6,6,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,6,0,0,0,0,0,0,0,0,5,6,6,6, +6,6,6,8,8,6,6,6,5,5,5,5,5,6,6,6, +6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0, 0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6, -6,6,6,6,8,6,6,0x17,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0, -0,0,0,0,0,0,0,0,0,0,0,5,8,5,8,6, -0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, -5,5,5,0,0,5,0,0,5,5,5,5,5,5,5,5, -0,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,8,8,8,0,8,8,0,0,6, -6,8,6,5,6,5,0x17,5,8,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,6,6,6,6,6,6,6,6,6,6,8,6,6,0x17,0x17, +0x17,5,0x17,0x17,6,8,6,6,6,8,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,5,5,5,5,5,5,5,5,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,8,8,8,6,6,6,6,0,0,6,6, -8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,6,6,6,6,6,8,5,6, -6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,6,0,0,0,0, -0,0,0,0,5,6,6,6,6,6,6,8,8,6,6,6, -5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, -6,6,6,8,6,6,0x17,0x17,0x17,5,0x17,0x17,5,0x17,0x17,0x17, -0x17,0x17,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x70b,0x74b,0x78b,0x7cb, -0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,8,6,6,6,6,6,6,6,0, -6,6,6,6,6,6,8,6,6,6,6,6,6,6,6,6, -0,8,6,6,6,6,6,6,6,8,6,6,8,6,6,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,5,6,0,0,0,0, +0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,0x17,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,5,5,5,5,0,5,5,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,6,6,6,6,6,6,0,0,0,6,0, -6,6,0,6,5,5,5,5,5,5,5,5,5,5,8,8, -8,8,8,0,6,6,0,8,8,6,8,6,5,0,0,0, -0,0,0,0,5,5,5,5,5,5,0,5,5,0,5,5, +0,0,0,0,5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb, +0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb, +0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, +6,6,6,6,6,6,6,0,6,6,6,6,6,6,8,6, +6,6,6,6,6,6,6,6,0,8,6,6,6,6,6,6, +6,8,6,6,8,6,6,0,0,0,0,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,5,6,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +5,5,5,0,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, +6,6,6,0,0,0,6,0,6,6,0,6,5,5,5,5, +5,5,5,5,5,5,8,8,8,8,8,0,6,6,0,8, +8,6,8,6,5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,6,6,8,8,0x17,0x17,0,0,0, 0,0,0,0,6,8,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,0, 0,0,0,0,6,6,5,8,5,5,5,5,5,5,5,5, 5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,8,8,6,6, @@ -1223,7 +1252,15 @@ static const uint16_t propsTrie_index[23156]={ 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, 0,0,0,0,0,0,0,0x17,0xcd0b,0xcc0b,0xcb0b,0xd00b,0xca0b,0xcf0b,0xcb4b,0xd04b, 0xc90b,0x37cb,0x37cb,0x364b,0x35cb,0xc94b,0x3fcb,0x350b,0x34cb,0x344b,0x344b,0x3ccb,0xcd0b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a, +0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x19,0x19,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x585,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5, +5,5,5,5,5,5,0x3445,5,5,5,5,0x5c5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x585,5,0x605,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0x5c5,0,0,0,0,0,0,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a, 0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0, 0,0,0,0,0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a, 0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a, @@ -1239,28 +1276,36 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,5,5,5,5,5,5,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, +6,6,8,8,8,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, 0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,6,6,6,6, -6,0x17,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, -6,6,6,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4, -0x17,0x1b,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,0,5,5,5,0x54b,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b, -0x58b,0x5cb,0x60b,0x17,0x17,0x17,0x17,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,6,5,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -0,0,0,0,0,0,0,6,6,6,6,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,0x17,4,6,0,0,0, -0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0, +5,5,5,5,5,5,0,0,6,6,6,6,6,0x17,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17, +0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,4,4,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,4,4,4,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17, +0x17,0x17,0x17,0,0,0,0,0,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, +0,0,0,0,0,0,0,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, +1,0,0,2,2,2,2,2,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,0,6,5,8,8,8,8,8,8,8, +8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, +8,8,8,8,8,8,8,8,8,8,8,8,0,0,0,0, +0,0,0,6,6,6,6,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0x17,4,6,0,0,0,0,0,0,0, +0,0,0,0,8,8,4,4,0x58a,0x3c4a,0x5ca,0,0,0,0,0, +0,0,0,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,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,0, 5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1273,2755 +1318,3670 @@ static const uint16_t propsTrie_index[23156]={ 5,5,5,5,5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,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,6,6,6, -6,6,6,6,6,6,6,6,6,6,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8, -8,8,8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6, -6,6,6,0x1b,0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +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,6,6,6,6,6,6,6, +6,6,6,6,6,6,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,0x1b,0,0, +0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b, +0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6, +6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,0x1b,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0,0,0,0, -0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb,0x60b,0x64b,0x68b,0x58b, -0x68b,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,0,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,0,1,1, -0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1, -1,1,1,1,1,1,2,2,2,2,0,2,0,2,2,2, -2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,1,1,0,1,1,1,1,0,0,1,1,1, -1,1,1,1,1,0,1,1,1,1,1,1,1,0,2,2, +0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb,0x60b,0x64b,0x68b,0x58b,0x68b,0,0,0, +0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,0,1,1,1,1,0, -1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1, -1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,0,2,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,0,1,1,0,0,1,0, +0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1, +1,1,2,2,2,2,0,2,0,2,2,2,2,2,2,2, +0,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1, +1,0,1,1,1,1,1,1,1,0,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,0,1,1,1,1,0,1,1,1,1, +1,0,1,0,0,0,1,1,1,1,1,1,1,0,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,0,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, -1,0x18,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0x18,2,2,2,2, -2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x18,2,2,2,2, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,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,1,0x18,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,0x18,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,0x18,2,2,2,2, -2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b, -0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6, -6,6,6,0,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,0,0,6,6,6,6,6,2,2,2,2, -2,2,2,2,2,2,5,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, -0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,6, -6,0,6,6,6,6,6,0,0,0,0,0,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,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,0,0,0,0,0,0,0,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,5,0x1b,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,6, -6,6,6,4,4,4,4,4,4,4,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,6,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0x19,5,5,5,5, -5,5,5,5,5,5,5,4,6,6,6,6,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,5,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6, -6,6,6,0,0,0,0,0,0,0,0,0,2,2,2,2, -6,6,6,6,6,6,6,4,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2, +2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,0x18,2,2,2,2,2,2,1,2, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,0,0,6,6,6,6,6,2,2,2,2,2,2,2,2, +2,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,0,0,0,0,0,0,2,2,2, +2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6,6,0,6,6,0,6,6, +6,6,6,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,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,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,5,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,0,0,6,6,6,6,6,6,6,4, +4,4,4,4,4,4,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0x19,5,5,5,5,5,5,5,5, +5,5,5,4,6,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9, +0x209,0x249,0x289,0,0,0,0,0x17,5,5,5,6,5,5,6,5, +5,5,5,5,5,5,6,6,5,5,5,5,5,6,0,0, +0,0,0,0,0,0,5,4,5,5,5,5,5,5,5,0, +5,5,5,5,0,5,5,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,0,0,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6,6,6,6,0, +0,0,0,0,0,0,0,0,2,2,2,2,6,6,6,6, +6,6,6,4,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x78cb,0x794b,0x814b,0x58b, -0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,0x19,0x58b,0x5cb,0x788b, -0x78cb,0,0,0,0,0,0,0,0,0,0,0,0x16cb,0x194b,0x1bcb,0x1e4b, -0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b, -0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x984b,0xa04b,0xa84b,0xb04b, -0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x1b,0x5cb,0x60b,0x64b,0x68b,0x6cb, -0x70b,0x74b,0x78b,0x7cb,0x900b,0xa00b,0x804b,0x788b,0x344b,0x354b,0,0,0,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b, -0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,0, -5,0,0,5,0,5,5,5,5,5,5,5,5,5,5,0, -5,5,5,5,0,5,0,5,0,0,0,0,0,0,5,0, -0,0,0,5,0,5,0,5,0,5,5,5,0,5,5,0, -5,0,0,5,0,5,0,5,0,5,0,5,0,5,5,0, -5,0,0,5,5,5,5,0,5,5,5,5,5,5,5,0, -5,5,5,5,0,5,5,5,5,0,5,0,5,5,5,5, -5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5, -0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b, -0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x78cb,0x794b,0x814b,0x58b,0x5cb,0x60b,0x64b,0x68b, +0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,0x19,0x58b,0x5cb,0x788b,0x78cb,0,0,0, +0,0,0,0,0,0,0,0,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b, +0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b, +0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b, +0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x1b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb, +0x900b,0xa00b,0x804b,0x788b,0x344b,0x354b,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b, +0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18,0x18,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,5,5,0,5,0,0,5, +0,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,0,5,0,0,0,0,0,0,5,0,0,0,0,5, +0,5,0,5,0,5,5,5,0,5,5,0,5,0,0,5, +0,5,0,5,0,5,0,5,0,5,5,0,5,0,0,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,5,5,5,0,5,0,5,5,5,5,5,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,5,5,5,0,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b, +0x48b,0x4cb,0x50b,0x54b,0x54b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0x1b,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0,0,0, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x1b,0,0,0,0,0,5,0x705,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645,5, +5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x685,5,5, +5,5,5,5,5,5,0x645,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0xcc5, -5,5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x605,5,5,5,5,5,5, +5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x605,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0xcc5,5,5,5,5,5,5,5,5, +0xf45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0xf45,5,5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x605, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x645,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x785,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, +5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x645,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0,0x10,0,0,0,0,0,0,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,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,0,0,0,0, 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,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0, -0,0,0,0 +0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 }; static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4692, + propsTrie_index+4628, nullptr, - 4692, - 18464, + 4628, + 19480, 0xa40, - 0x12d4, + 0x1294, 0x0, 0x0, 0x110000, - 0x5a70, + 0x5e28, nullptr, 0, false, false, 0, nullptr }; -static const uint16_t propsVectorsTrie_index[32764]={ -0x53e,0x546,0x54e,0x556,0x56e,0x576,0x57e,0x586,0x58e,0x596,0x59e,0x5a6,0x5ae,0x5b6,0x5be,0x5c6, -0x5cd,0x5d5,0x5dd,0x5e5,0x5e8,0x5f0,0x5f8,0x600,0x608,0x610,0x618,0x620,0x628,0x630,0x638,0x640, -0x648,0x650,0x657,0x65f,0x667,0x66f,0x677,0x67f,0x687,0x68f,0x694,0x69c,0x6a3,0x6ab,0x6b3,0x6bb, -0x6c3,0x6cb,0x6d3,0x6db,0x6e2,0x6ea,0x6f2,0x6fa,0x702,0x70a,0x712,0x71a,0x722,0x72a,0x732,0x73a, -0x1b43,0xd8f,0xe5b,0x1192,0x12d1,0x1d0b,0x1eaa,0x1d03,0x13f0,0x1400,0x13e8,0x13f8,0x80f,0x815,0x81d,0x825, -0x82d,0x833,0x83b,0x843,0x84b,0x851,0x859,0x861,0x869,0x86f,0x877,0x87f,0x887,0x88f,0x897,0x89e, -0x8a6,0x8ac,0x8b4,0x8bc,0x8c4,0x8ca,0x8d2,0x8da,0x8e2,0x1408,0x8ea,0x8f2,0x8fa,0x901,0x909,0x911, -0x919,0x91d,0x925,0x92c,0x934,0x93c,0x944,0x94c,0x1723,0x172b,0x954,0x95c,0x964,0x96c,0x974,0x97b, -0x1789,0x1779,0x1781,0x1a7e,0x1a86,0x1418,0x983,0x1410,0x166c,0x166c,0x166e,0x142c,0x142d,0x1420,0x1422,0x1424, -0x1791,0x1793,0x98b,0x1793,0x993,0x998,0x9a0,0x1798,0x9a6,0x1793,0x9ac,0x9b4,0xc6f,0x17a0,0x17a0,0x9bc, -0x17b0,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1,0x17b1, -0x17b1,0x17b1,0x17b1,0x17a8,0x9c4,0x17b9,0x17b9,0x9cc,0xb97,0xb9f,0xba7,0xbaf,0x17c9,0x17c1,0x9d4,0x9dc, -0x9e4,0x17d3,0x17db,0x9ec,0x17d1,0x9f4,0x1b4b,0xd97,0xbb7,0xbbf,0xbc7,0xbcc,0x19e4,0xc96,0xc9d,0x1940, -0xc47,0x1b53,0xd9f,0xda7,0xdaf,0xdb7,0xf65,0xf69,0x1a44,0x1a49,0xcd5,0xcdd,0x1aba,0x1ac2,0x1c23,0xe63, -0x1aca,0xd23,0xd2b,0x1ad2,0x110a,0x11ba,0xf3d,0xdbf,0x1960,0x1948,0x1958,0x1950,0x19fc,0x19f4,0x19b0,0x1a3c, -0x1435,0x1435,0x1435,0x1435,0x1438,0x1435,0x1435,0x1440,0x9fc,0x1448,0xa00,0xa08,0x1448,0xa10,0xa18,0xa20, -0x1458,0x1450,0x1460,0xa28,0xa30,0x1468,0xa38,0xa40,0x1470,0x1478,0x1480,0x1488,0xa48,0x1490,0x1497,0x149f, -0x14a7,0x14af,0x14b7,0x14bf,0x14c7,0x14ce,0x14d6,0x14de,0x14e6,0x14ee,0x14f1,0x14f3,0x17e3,0x18d6,0x18dc,0x1a2c, -0x14fb,0xa50,0xa58,0x1621,0x1626,0x1629,0x162f,0x1503,0x1637,0x1637,0x1513,0x150b,0x151b,0x1523,0x152b,0x1533, -0x153b,0x1543,0x154b,0x1553,0x18e4,0x1938,0x1a8e,0x1beb,0x1563,0x1569,0x1571,0x1579,0x155b,0x1581,0x18ec,0x18f3, -0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x18fb,0x18fb,0x18fb,0x18fb,0x1903,0x190a,0x190c,0x1913, -0x191b,0x191f,0x191f,0x1922,0x191f,0x191f,0x1928,0x191f,0x1968,0x1a34,0x1a96,0xbd4,0xbda,0x1d4f,0x1d57,0x1e35, -0x19d4,0x19c8,0x19cc,0x1a51,0x19b8,0x19b8,0x19b8,0xc57,0x19c0,0xc77,0x1a14,0xcc5,0xc5f,0xc67,0xc67,0x1ada, -0x1a04,0x1a9e,0xcad,0xcb5,0xa60,0x17f3,0x17f3,0xa68,0x17fb,0x17fb,0x17fb,0x17fb,0x17fb,0x17fb,0xa70,0x742, -0x1654,0x1676,0xa78,0x167e,0xa80,0x1686,0x168e,0x1696,0xa88,0xa8d,0x169e,0x16a5,0xa92,0x1803,0x1a24,0xc4f, -0xa9a,0x1700,0x1707,0x16ad,0x170f,0x1713,0x16b5,0x16b9,0x16d2,0x16d2,0x16d4,0x16c1,0x16c9,0x16c9,0x16ca,0x171b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b, -0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180b,0x180e,0x1970,0x1970, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc, -0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16dc,0x16e3,0x1b3b,0x1f16, -0x1816,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c, -0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c,0x181c, -0x181c,0x181c,0x181c,0x181c,0xaa2,0x1824,0xaaa,0x1b5b,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6,0x1ae6, -0x1ae2,0xd33,0x1af6,0x1aee,0x1af8,0x1b63,0x1b63,0xdc7,0x19dc,0x1a59,0x1aae,0x1ab2,0x1aa6,0x1c1b,0xce5,0xcec, -0x1a0c,0xcbd,0x1a61,0xcf4,0x1b00,0x1b03,0xd3b,0x1b6b,0x1b13,0x1b0b,0xd43,0xdcf,0x1b73,0x1b77,0xdd7,0x1014, -0x1b1b,0xd4b,0xd53,0x1b7f,0x1b8f,0x1b87,0xddf,0xf0d,0xe6b,0xe73,0x1da5,0xfc4,0x1e52,0x1e52,0x1b97,0xde7, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c, -0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e, -0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770, -0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b, -0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d, -0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f, -0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771, -0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0x1771,0x176b,0x176c,0x176d,0x176e,0x176f,0x1770,0xab2,0xdef,0xdf2, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f, -0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x163f,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb,0x16eb, -0x16f0,0x16f8,0x1930,0x139d,0x1a1c,0x1a1c,0x13a1,0x13a8,0xaba,0xac2,0xaca,0x15a1,0x15a8,0x15b0,0xad2,0x15b8, -0x15f6,0x15f6,0x1589,0x1591,0x15c0,0x15ed,0x15ee,0x15fe,0x15c8,0x15cd,0x15d5,0x15dd,0xada,0x15e5,0xae2,0x1599, -0xccd,0x1606,0xaea,0xaf2,0x160e,0x1614,0x1619,0xafa,0xb0a,0x165c,0x1664,0x1647,0x164c,0xb12,0xb1a,0xb02, -0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733, -0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x1733,0x173b,0x173b,0x173b,0x173b, -0x1578,0x1578,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8,0x1734,0x1774,0x17a0,0x17e0,0x1820,0x1860,0x18a0,0x18e0, -0x1920,0x195c,0x199c,0x19dc,0x1a1c,0x1a50,0x1a8c,0x1acc,0x1b0c,0x1b4c,0x1b88,0x1bc8,0x1c08,0x1c48,0x1c88,0x1cc8, -0xe59,0xa80,0xac0,0xb00,0xb40,0xb6b,0xf99,0xa40,0xed9,0xa40,0xa40,0xa40,0xa40,0xbab,0x13f5,0x13f5, -0xf19,0xfd9,0xa40,0xa40,0xa40,0xbeb,0xf59,0xc2b,0xa40,0xc51,0xc91,0xcd1,0xd11,0xd51,0xe99,0xdc9, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1019,0x1375,0x116a,0x11aa,0x13b5,0x11b5,0x1435,0x1435,0x1435,0x1059,0x108c,0x10cc, -0x1475,0x1475,0x11f5,0x14b5,0x110c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c, -0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x112a, +static const uint16_t propsVectorsTrie_index[43132]={ +0x5c9,0x5d1,0x5d9,0x5e1,0x5f9,0x601,0x609,0x611,0x619,0x621,0x629,0x631,0x639,0x641,0x649,0x651, +0x659,0x661,0x669,0x671,0x679,0x681,0x689,0x691,0x699,0x6a1,0x6a9,0x6b1,0x6b9,0x6c1,0x6c9,0x6d1, +0x6d9,0x6e1,0x6e8,0x6f0,0x6f8,0x700,0x708,0x710,0x718,0x720,0x725,0x72d,0x734,0x73c,0x744,0x74c, +0x754,0x75c,0x764,0x76c,0x773,0x77b,0x783,0x78b,0x793,0x79b,0x7a3,0x7ab,0x7b3,0x7bb,0x7c3,0x7cb, +0x2581,0x7d3,0x7db,0x7e3,0x7e9,0x26cb,0x28bc,0x270f,0x1642,0x1648,0x1650,0x163a,0x7f1,0x7f7,0x7ff,0x807, +0x80f,0x815,0x81d,0x825,0x82d,0x833,0x83b,0x843,0x84b,0x851,0x859,0x861,0x869,0x871,0x879,0x880, +0x888,0x88e,0x896,0x89e,0x8a6,0x8ac,0x8b4,0x8bc,0x8c4,0x16be,0x8cc,0x8d4,0x8dc,0x8e4,0x8ec,0x8f4, +0x8fc,0x900,0x908,0x5e9,0x910,0x918,0x920,0x5e9,0x1fe6,0x1fee,0x928,0x930,0x938,0x940,0x948,0x5e9, +0x2194,0x2065,0x205d,0x24a2,0x249a,0x1660,0x950,0x1658,0x1f74,0x1f74,0x1f76,0x167c,0x167d,0x1670,0x1672,0x1674, +0x2034,0x2036,0x958,0x2036,0x960,0x965,0x96d,0x202c,0x973,0x2036,0x979,0x981,0x989,0x2024,0x2024,0x991, +0x207d,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e, +0x207e,0x207e,0x207e,0x2075,0x999,0x206d,0x206d,0x9a1,0x9a9,0x9b1,0x9b9,0x9c1,0x218c,0x203e,0x9c9,0x9d1, +0x9d9,0x2046,0x204e,0x9e1,0x2055,0x9e9,0x2529,0x9ed,0x9f5,0x9fd,0xa05,0xa0a,0x23d0,0xa12,0xa19,0x233c, +0xa21,0x25e0,0xa29,0xa31,0xa39,0xa41,0xa49,0xa51,0x2428,0x242d,0xa59,0x2420,0x24f9,0x24f1,0x25fb,0xa61, +0x24c1,0xa69,0xa71,0x24de,0xa79,0xa7d,0xa85,0xa8d,0x2344,0x2324,0x2334,0x232c,0x23ac,0x23a4,0x23f8,0x244a, +0x1685,0x168d,0x169d,0x1695,0x16a4,0x16b4,0x16b4,0x16b6,0xa95,0x1668,0xa99,0xaa1,0x1668,0xaa9,0xab1,0xab9, +0x1475,0x146d,0x14ad,0xac1,0xac9,0x1495,0x13dd,0xad1,0x1485,0x148d,0x14a5,0x16ac,0xad9,0x14bd,0x14c4,0x14cc, +0x1553,0x155b,0x1563,0x156b,0x1573,0x157a,0x1582,0x158a,0x14d4,0x14dc,0x14df,0x14e1,0x201c,0x22bb,0x22c1,0x2408, +0x14df,0x13f6,0x13fe,0x16ce,0x16d3,0x16d6,0x16dc,0x149d,0x16e4,0x16e4,0x14e9,0x14b5,0x14ed,0x14f5,0x14fd,0x1505, +0x150d,0x1515,0x151d,0x1525,0x22c9,0x2314,0x2474,0x25cd,0x152d,0x1533,0x153b,0x1543,0x147d,0x154b,0x22d1,0x22d8, +0x2086,0x2087,0x2087,0x2087,0x2087,0x2087,0x2087,0x2087,0x22dc,0x22dc,0x22dc,0x22dc,0x22e4,0x22dc,0x22eb,0x22f2, +0x22fa,0x22dc,0x22dc,0x22fe,0x22dc,0x22dc,0x2304,0x22dc,0x231c,0x2410,0x2464,0x1406,0x2745,0x274b,0x2753,0x27fb, +0x23c0,0x23b4,0x23b8,0x2418,0x237c,0x237c,0x237c,0xae1,0x2384,0xae9,0x23d8,0xaf0,0xaf8,0xb00,0xb00,0x2509, +0x2374,0x246c,0x140e,0x1416,0xb08,0x2097,0x2097,0xb10,0x209f,0x209f,0x209f,0x209f,0x209f,0x209f,0xb18,0xb1e, +0x1711,0x16c6,0xb26,0x1f8d,0xb2e,0x1fab,0x1fb3,0x1fbb,0xb36,0xb3b,0x1f7e,0x1f85,0xb40,0x208f,0x23f0,0xb48, +0xb50,0x1fc3,0x1fca,0x1719,0x1fda,0x1fde,0x1f95,0x1f99,0x1fa1,0x1fa1,0x1fa3,0x1729,0x1731,0x1731,0x1732,0x1fd2, +0x20a7,0x20a7,0x20ae,0x20ab,0x20a7,0x20a7,0x20a7,0x20b5,0x20a7,0x20a7,0x20a7,0x20aa,0x20b7,0x20bf,0x20c7,0x20cb, +0x20d3,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, +0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20b0,0x20a7,0x20a7,0x20db,0x20a7,0x20a7,0x20e0,0x20e8, +0x20b0,0x20a7,0x20f0,0x20f8,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20fd,0x20c7,0x20a7,0x20a7,0x2105,0x20a7,0x20a7, +0x20a7,0x20a7,0x20a7,0x20c7,0x20a7,0x20a7,0x20a7,0x20b6,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20e5, +0x20a7,0x20a7,0x20a7,0x20b1,0x20a7,0x20a7,0x20b2,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, +0x20a7,0x20a7,0x2108,0x210f,0x20a7,0x20a9,0x20a8,0x20a7,0x20a7,0x20aa,0x20a8,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, +0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20aa,0x20a7,0x20a7,0x20a7,0x2114,0x2119,0x20a7, +0x20a7,0x20a7,0x2105,0x20a7,0x20a7,0x20a7,0x2108,0x2121,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, +0x2122,0x20a7,0x20b3,0x212a,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x2132,0x20a7,0x2135,0x2127,0x20a7,0x20a7,0x20b1, +0x20a7,0x20a7,0x20a7,0x20a7,0x213d,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20ae,0x20b8,0x2145,0x214d,0x20a7,0x20a7, +0x2153,0x20a7,0x20a7,0x20a7,0x20a7,0x20b0,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, +0x20a7,0x20a7,0x20a7,0x212d,0x215b,0x2163,0x20a7,0x20a7,0x2167,0x20a7,0x20a7,0x20a7,0x20a7,0x216e,0x235c,0x235c, +0x174f,0x1755,0x1f6c,0x175b,0x1762,0x176a,0x176e,0x1775,0x177d,0x1783,0x178b,0x178f,0x1794,0x179c,0x17a4,0x17ac, +0x1759,0x17b4,0x17bc,0x17c3,0x17cb,0x17d3,0x17db,0x17e3,0x17e9,0x17e6,0x17f1,0x17f9,0x1801,0x1809,0x1811,0x1819, +0x1f6c,0x1f6c,0x1772,0x1820,0x1825,0x1f6c,0x182c,0x1834,0x183c,0x1844,0x184c,0x1854,0x17c2,0x185c,0x1863,0x186b, +0x1873,0x1879,0x175a,0x1755,0x179a,0x178e,0x1f6c,0x1762,0x187c,0x1f6c,0x1769,0x1873,0x1f6c,0x1f6c,0x1f6c,0x1884, +0x188b,0x1893,0x1899,0x18a1,0x18a9,0x18b1,0x18b8,0x18bf,0x18c7,0x18cf,0x18d7,0x18df,0x18e7,0x18ed,0x1860,0x1f6c, +0x186d,0x1f6c,0x18f1,0x18f9,0x178e,0x18ff,0x1907,0x190f,0x1917,0x191f,0x1925,0x1f6c,0x1f6c,0x192c,0x1f6c,0x1769, +0x1f6c,0x1933,0x17c5,0x1938,0x193f,0x1768,0x1772,0x1839,0x1854,0x178d,0x1946,0x194e,0x18eb,0x1956,0x195e,0x1f6c, +0x1966,0x196e,0x18b1,0x1f6c,0x1975,0x17c5,0x1978,0x178e,0x1f6c,0x1980,0x1987,0x17c2,0x198c,0x1994,0x199b,0x1762, +0x174f,0x1f6c,0x19a3,0x1f6c,0x174f,0x18b1,0x17c2,0x19a9,0x1799,0x19b0,0x1f6c,0x1f6c,0x18fb,0x19b8,0x19c0,0x19c8, +0x1f6c,0x19d0,0x1762,0x19d8,0x1927,0x1975,0x19de,0x19e6,0x19ee,0x19f6,0x1f6c,0x19fe,0x1a06,0x1925,0x184e,0x1a0e, +0x1975,0x1a12,0x192c,0x1f6c,0x19d5,0x1f6c,0x1a19,0x179a,0x1765,0x1a21,0x17e9,0x1f6c,0x1a27,0x1f6c,0x178f,0x1f6c, +0x1f6c,0x1a2c,0x1a34,0x1a19,0x179b,0x1a3c,0x1a42,0x1a48,0x1a50,0x18ed,0x1a58,0x187a,0x1a60,0x179e,0x1a67,0x1a6f, +0x192c,0x1a77,0x1a7e,0x1a86,0x1a8a,0x17b0,0x1a92,0x1773,0x1a9a,0x1aa1,0x1f6c,0x1769,0x1aa7,0x1aad,0x1926,0x178d, +0x1ab5,0x1abc,0x1ac1,0x18b1,0x1a12,0x1ac9,0x1ad1,0x1ad9,0x1755,0x1a19,0x1754,0x1f6c,0x1adb,0x1879,0x1ae3,0x1f6c, +0x176a,0x1aea,0x1af0,0x1af8,0x1aff,0x1b07,0x1b0f,0x1755,0x1764,0x1a37,0x1b15,0x1b1d,0x1f6c,0x176b,0x1f6c,0x1b25, +0x1af0,0x1b2c,0x1975,0x1794,0x1f6c,0x17c2,0x176b,0x1758,0x1b34,0x17c1,0x1f6c,0x178f,0x1b3c,0x1b42,0x1f6c,0x1b48, +0x1b50,0x179a,0x176e,0x1b57,0x1b5f,0x1f6c,0x17e9,0x19d0,0x19ce,0x1f6c,0x1b67,0x178d,0x1b6a,0x192c,0x1b72,0x1978, +0x1a82,0x1f6c,0x1b79,0x1b7d,0x1b85,0x1b8c,0x178e,0x1a19,0x18ed,0x1b93,0x192c,0x1b99,0x1823,0x1a5d,0x19cc,0x17eb, +0x1b9f,0x1ba7,0x1bae,0x1f6c,0x1f6c,0x1bb4,0x1f6c,0x1f6c,0x1bbb,0x18ed,0x1772,0x1f6c,0x17c3,0x1f6c,0x1a18,0x1bc0, +0x176b,0x1bc7,0x1bcf,0x17e9,0x1bd4,0x1f6c,0x1bdc,0x1768,0x1f6c,0x17c2,0x1be4,0x1bec,0x1975,0x1ab8,0x17c3,0x1799, +0x1f6c,0x176e,0x1bf3,0x1772,0x1754,0x1bfb,0x1c03,0x1768,0x1c0b,0x1c13,0x1879,0x17c1,0x1762,0x1c1b,0x1c23,0x1c2b, +0x1f6c,0x19bb,0x1c33,0x1762,0x18ed,0x1f6c,0x1a5e,0x1c37,0x1c3d,0x1c45,0x178d,0x1c4b,0x1c52,0x1c5a,0x1c62,0x1f6c, +0x1c6a,0x1c6f,0x1f6c,0x1c76,0x1c7e,0x1c85,0x1c8d,0x1c93,0x186b,0x1c9b,0x1ca3,0x1f6c,0x1f6c,0x1cab,0x1f6c,0x18b1, +0x17e9,0x1c81,0x1cb0,0x1762,0x1cb8,0x176e,0x1cbf,0x1cc7,0x1f6c,0x1ccf,0x1cd5,0x1cdc,0x1ce4,0x178a,0x1ceb,0x1ced, +0x176b,0x1f6c,0x17e9,0x17c1,0x187a,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1a2c,0x1cf5,0x1f6c,0x1cfc,0x1758,0x1d03,0x17c1, +0x179a,0x1d0b,0x17c2,0x179b,0x1d10,0x1d17,0x1adb,0x1f6c,0x1d1f,0x17ae,0x1f6c,0x1f6c,0x1d26,0x1f6c,0x1768,0x1d2d, +0x1772,0x17c1,0x1a18,0x1975,0x176e,0x174f,0x1f6c,0x1b34,0x17be,0x1759,0x178e,0x1f6c,0x1f6c,0x1a19,0x1f6c,0x19e4, +0x1d32,0x1f6c,0x176b,0x1f6c,0x1d39,0x192c,0x19d0,0x1754,0x1d3d,0x1c80,0x1d42,0x1adb,0x1772,0x1d47,0x176e,0x1d4e, +0x1d56,0x192c,0x192c,0x178e,0x1824,0x1b33,0x178e,0x1d5e,0x187a,0x19a8,0x1975,0x178f,0x1c24,0x1f6c,0x18b1,0x1759, +0x1aee,0x1d62,0x1d69,0x18b1,0x1f6c,0x1f6c,0x1f6c,0x1d71,0x1983,0x17c1,0x1f6c,0x1d78,0x1d80,0x1d87,0x1f6c,0x1d8f, +0x1d97,0x1d9f,0x1768,0x1da7,0x176f,0x1bc1,0x1759,0x176e,0x1f6c,0x1daf,0x1f6c,0x1db7,0x1dbf,0x1f6c,0x1f6c,0x1f6c, +0x1f6c,0x176b,0x1dc7,0x188e,0x1dcf,0x179b,0x1dd3,0x1ab8,0x1ddb,0x1f6c,0x1f6c,0x17c3,0x1f6c,0x179b,0x17c2,0x1975, +0x17d9,0x174f,0x1d67,0x1de0,0x17e9,0x1de8,0x1bde,0x1759,0x1773,0x1d62,0x1a18,0x1f6c,0x187a,0x1def,0x1df7,0x1769, +0x1f6c,0x1dfd,0x1b33,0x1f6c,0x1f6c,0x1768,0x1b43,0x1762,0x179a,0x1e03,0x178d,0x17e9,0x1e0b,0x1e12,0x17c1,0x1e1a, +0x1e1e,0x1879,0x19d0,0x1e26,0x1e2e,0x187a,0x1e36,0x1879,0x17c3,0x17af,0x1f6c,0x1e3e,0x1e46,0x1e4d,0x1f6c,0x1e55, +0x1e5d,0x17c1,0x1aef,0x1e65,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1e6c,0x19a6,0x1e74,0x1e7c,0x1f6c, +0x1f6c,0x1e84,0x1c7f,0x1e8c,0x1e94,0x1e9c,0x1f6c,0x1ea3,0x1eab,0x1eb2,0x1eba,0x1d39,0x193a,0x1ec0,0x1ec8,0x17c3, +0x1adb,0x1ecf,0x1ed6,0x1edd,0x1f6c,0x192c,0x179a,0x1ee4,0x178d,0x17e9,0x1eeb,0x1f6c,0x1f6c,0x1adb,0x1f6c,0x1ef3, +0x1ef9,0x17e9,0x1a9c,0x19d0,0x1f6c,0x1f00,0x1dee,0x1f08,0x1f10,0x18e0,0x19cb,0x181d,0x1e0e,0x1f6c,0x1879,0x1762, +0x1f18,0x1f6c,0x1f20,0x1f28,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f2f,0x1f36,0x1f6c,0x1754,0x178e,0x1750,0x17c2,0x1af0, +0x1f3e,0x1f6c,0x1f6c,0x17e9,0x1f46,0x1f4d,0x1f6c,0x17c7,0x1f55,0x179b,0x1f5c,0x1754,0x1f6c,0x1f64,0x2501,0x28e4, +0x217e,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184, +0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184, +0x2184,0x2184,0x2184,0x2184,0xb58,0x2176,0xb60,0x259d,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce, +0x24c9,0xb68,0x2484,0x247c,0x2486,0x2595,0x2595,0xb70,0x236c,0x2400,0x248e,0x2492,0x245c,0x25f3,0xb78,0xb80, +0x23c8,0xb88,0x2435,0xb90,0x24e6,0x24e9,0xb98,0x2519,0x24b2,0x24b9,0xba0,0xba8,0x254d,0x2551,0xbb0,0xbb8, +0x24aa,0xbc0,0xbc8,0x2521,0x2589,0x258d,0xbd0,0xbd8,0xbe0,0xbe8,0x273d,0xbf0,0x2803,0x2803,0x2561,0xbf8, +0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, +0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, +0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, +0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, +0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, +0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, +0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, +0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, +0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, +0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, +0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, +0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, +0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, +0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, +0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, +0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, +0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, +0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, +0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, +0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, +0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, +0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0xc00,0xc07,0xc0a, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, +0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173f,0x1747,0x230c,0x141e,0x23e8,0x23e8,0x1422,0x1429,0xc12,0xc1a,0xc22,0x15aa,0x15b1,0x15b9,0x15c1,0x15c9, +0x162a,0x162a,0x1592,0x159a,0x15d1,0x1621,0x1622,0x1632,0x15d9,0x15de,0x15e6,0x15ee,0x15f6,0x15fe,0x1606,0x15a2, +0xc2a,0x1721,0xc32,0xc3a,0x160e,0x1614,0x1619,0xc42,0xc4a,0x1701,0x1709,0x16f4,0x16f9,0xc52,0xc5a,0xc62, +0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, +0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, +0x17a4,0x17a4,0x17e4,0x1824,0x1864,0x18a4,0x18e4,0x1924,0x1964,0x19a4,0x19e4,0x1a24,0x1a64,0x1aa4,0x1ae4,0x1b24, +0x1b64,0x1ba0,0x1be0,0x1c20,0x1c60,0x1c94,0x1cd0,0x1d10,0x1d50,0x1d90,0x1dcc,0x1e0c,0x1e4c,0x1e8c,0x1ecc,0x1f0c, +0xa80,0xac0,0xb00,0xb40,0xb80,0xbab,0xbeb,0x16a1,0xc0e,0xa40,0xa40,0xa40,0xc46,0xc86,0x157d,0x157d, +0x157e,0xcc6,0xa40,0xa40,0xa40,0xcf6,0xd36,0xd56,0xa40,0xd7c,0xdbc,0xdfc,0xe3c,0xe7c,0xf3c,0xebc, +0x1224,0x1260,0x12a0,0x12af,0x12e9,0x1310,0x12af,0x1346,0x136c,0x1393,0x13ca,0x12af,0x13f8,0x1437,0x12af,0x1466, +0x149c,0x14b6,0x12af,0x13de,0xfcc,0x14f6,0x14fd,0x100c,0x153d,0x1017,0x15be,0x15be,0x15be,0x104d,0x1080,0x10c0, +0x15fe,0x15fe,0x1100,0x163e,0x1661,0x16e1,0x1140,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, +0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1164, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, -0xe09,0xe19,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd89, -0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5, -0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x12b5,0x1235, -0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5, -0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x12f5,0x1275, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0xc2c,0xc2f,0xdfa,0x1df5,0x101c,0x74a,0x55e,0x10b6,0xcfc,0xd7b,0x55e,0x55e,0x1d1b,0xf15,0xf1d,0x1e3d, -0xc7f,0xc86,0xc8e,0x1b9f,0x1dd5,0x55e,0x1db5,0xfec,0x1ba7,0xe02,0xe0a,0xe12,0x1044,0x752,0x55e,0x55e, -0x1baf,0x1baf,0x75a,0x55e,0x1e6a,0x10ce,0x1e62,0x10d6,0x1f56,0x11d0,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0xe1a,0x1fae,0x12c9,0x134b,0x134c,0x1f76,0x11f8,0x11ff,0x1206,0x1308,0x130c,0x1280,0x1216, -0x1c2b,0x1c2d,0xe7b,0xe82,0x1bb7,0x1bbf,0xe22,0xf35,0x1d13,0xefd,0xf05,0xfe4,0x1d33,0x1d37,0x1d3f,0x1064, -0xfb4,0x1d95,0x762,0x55e,0x10be,0x10c6,0x1d9d,0xfbc,0xf96,0xf9c,0xfa4,0xfac,0x55e,0x55e,0x55e,0x55e, -0x1eda,0x1ed2,0x1140,0x1148,0x1e1d,0x1e15,0x108c,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e05,0x104c,0x1054,0x105c, -0x1dcd,0x1dc5,0xffc,0x1138,0x1d47,0xf45,0x76a,0x55e,0x109c,0x10a4,0x772,0x55e,0x55e,0x55e,0x55e,0x55e, -0x1f4e,0x11b2,0x77a,0x55e,0x55e,0x1e2d,0x1e25,0x1094,0x1288,0x128e,0x1296,0x55e,0x55e,0x121e,0x1222,0x122a, -0x1f0e,0x1f06,0x119a,0x1efe,0x1ef6,0x118a,0x1dfd,0x103c,0x135c,0x135f,0x135f,0x55e,0x55e,0x55e,0x55e,0x55e, -0x10ee,0x10f3,0x10fb,0x1102,0x112a,0x1130,0x55e,0x55e,0x116e,0x1172,0x117a,0x11c2,0x11c8,0x782,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x11e0,0x136f,0x1374,0x137c,0x55e,0x55e,0x786,0x1f96,0x1270, -0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69, -0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a69,0x1a6e,0xd04,0xd0b,0xd0b,0xd0b, -0x1a76,0x1a76,0x1a76,0xd13,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x1e5a,0x78e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x792,0x1fc6,0x1fc6,0x12d9,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35, -0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0xe8a,0x1004,0x100c,0x1fce, -0x1314,0x131c,0xf4d,0x1ded,0x1de5,0x102c,0x1034,0x79a,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1f6e,0x1f66,0x11f0, -0x55e,0x55e,0x55e,0x1d2b,0x1d2b,0xf25,0x1d23,0xf2d,0x55e,0x55e,0x1122,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x79e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1d7d,0x1d7d,0x1d7d,0xf71,0xf76, -0x7a6,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1fde,0x133c,0x1343,0x1fd6,0x1fd6,0x1fd6,0x7ae, -0x55e,0x1849,0x1849,0x1849,0x1849,0x1849,0x1849,0x1849,0xb30,0x1859,0xb38,0x185a,0x1851,0x1862,0x1868,0x1870, -0xb40,0x1998,0x1998,0x7b6,0x55e,0x55e,0x55e,0x1367,0x11e8,0x1988,0x1988,0xc37,0xd1b,0x55e,0x55e,0x55e, -0x55e,0x18a1,0x18a8,0xb48,0x18ab,0xb50,0xb58,0xb60,0x18a5,0xb68,0xb70,0xb78,0x18aa,0x18b2,0x18a1,0x18a8, -0x18a4,0x18ab,0x18b3,0x18a2,0x18a9,0x18a5,0xb7f,0x1878,0x1880,0x1887,0x188e,0x187b,0x1883,0x188a,0x1891,0xb87, -0x1899,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82,0x1e82, -0x1e82,0x1e72,0x1e75,0x1e72,0x1e7c,0x10de,0x7be,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x12f5,0x12fd,0x1300,0x1300,0x1300,0x1300,0x1300, -0x1300,0x1112,0x111a,0x1fe6,0x1354,0x7c6,0x55e,0x55e,0x55e,0x1f8e,0x1232,0x7ce,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x7d2,0x1324,0x1f9e,0x1278,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7da,0x1384,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x12e1,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0x1dbd,0xff4,0x55e,0x1eca,0x1ec2,0x10e6,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x7e2,0x1f5e,0x11d8,0x55e,0x55e,0x123a,0x123b,0x7ea,0x55e,0x55e,0x55e,0x55e, -0x55e,0xec2,0xeca,0xed2,0xeda,0xee2,0xeea,0xef1,0xef5,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x7ee,0x106c,0x1e0d,0x1072,0x1e0d,0x107a,0x107f,0x1084, -0x1084,0x1e92,0x1eb2,0x1eba,0x1f26,0x1e9a,0x1f7e,0x1ea2,0x1f2e,0x1f86,0x1f86,0x11a2,0x11aa,0x1252,0x1258,0x1260, -0x1268,0x1fa6,0x1fa6,0x1fa6,0x1fa6,0x12ac,0x1fa6,0x12b2,0x12b6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6, -0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6, -0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f6,0x7f7,0xb8f,0x18bb,0x18bb,0x18bb,0x7ff,0x7ff,0x7ff, -0x7ff,0x1990,0x1990,0x1990,0x1990,0x1990,0x1990,0x1990,0x807,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff, -0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0x7ff,0xbe2,0xbe9,0xbf1,0xbf9,0x1978,0x1978,0x1978, -0xc01,0xc09,0xc0c,0x19a8,0x19a0,0xc3f,0xd5b,0xd5f,0xd63,0x55e,0x55e,0x55e,0x55e,0xd6b,0x1b23,0xd73, -0xf5d,0x182c,0xb22,0xb28,0x1024,0xc14,0x19ec,0xca5,0x55e,0x1841,0x1834,0x1839,0x1980,0xc1c,0xc24,0x1150, -0x1156,0x1d85,0xf7e,0x1d75,0xf55,0x132c,0x1334,0x55e,0x55e,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad,0x1dad, -0x1dad,0x1dad,0xfcc,0xfd4,0xfdc,0x12e9,0x12ed,0x55e,0x55e,0x1b2b,0xd83,0x1b33,0x1b33,0xd87,0xe92,0xe9a, -0xea2,0x1bfb,0x1be3,0x1c03,0x1c0b,0x1bf3,0xe2a,0xe2e,0xe35,0xe3d,0xe41,0xe49,0xe51,0xe53,0xe53,0xe53, -0xe53,0x1c6c,0x1c74,0x1c6c,0x1c7a,0x1c82,0x1c4d,0x1c8a,0x1c92,0x1c6c,0x1c9a,0x1ca2,0x1ca9,0x1cb1,0x1c55,0x1c6c, -0x1cb6,0x1c5d,0x1c64,0x1cbe,0x1cc4,0x1d66,0x1d6d,0x1d5f,0x1ccb,0x1cd3,0x1cdb,0x1ce3,0x1ddd,0x1ceb,0x1cf3,0xeaa, -0xeb2,0x1c3d,0x1c3d,0x1c3d,0xeba,0x1d8d,0x1d8d,0xf86,0xf8e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45, -0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e45,0x1e4a,0x1e45,0x1e45,0x1e45,0x10ac,0x10ae,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x115e,0x1c45,0x1f1e,0x1f1e,0x1f1e,0x1f1e,0x1f1e,0x1f1e, -0x1f1e,0x1f3e,0x1166,0x1243,0x124a,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46,0x1f46, -0x1182,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7, -0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc9,0x1bc7,0x1bd1,0x1bc7,0x1bc7, -0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bd4,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bc7,0x1bdb,0x120e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea, -0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea,0x1eea, -0x1eee,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x1fbe,0x129e, -0x12a4,0x12be,0x12c1,0x12c1,0x12c1,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e, -0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x55e,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c6, -0x138c,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x13d0,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x13e0,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x18ce,0x18ce,0x18ce,0x18ce, -0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x18ce,0x13b0,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138d,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1395,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138d,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x13b8,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x1cfb,0x13c0,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x13c8,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x13d8, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x174b,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1753,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0x175b,0x175b,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763,0x1763, -0x1763,0x1763,0x1763,0x1763,0x1763,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3, -0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1c13, -0x1c13,0x1c13,0x1c13,0x1c13,0x1c13,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a, -0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1e8a,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2, -0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1ee2,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1f36, -0x1f36,0x1f36,0x1f36,0x1f36,0x1f36,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6, -0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fb6,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x1fee, -0x1fee,0x1fee,0x1fee,0x1fee,0x1fee,0x53d,0x53d,0x53d,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, -0x2e2,0x2e5,0x2ee,0x2e8,0x2e8,0x2eb,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2, -0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x7da,0x7d4,0x7b9,0x79e,0x7aa,0x7a7,0x79e,0x7b6, -0x7a4,0x7b0,0x79e,0x7cb,0x7c2,0x7b3,0x7d7,0x7ad,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x7bf,0x7bc,0x7c5,0x7c5,0x7c5,0x7d4,0x79e,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e6,0x7e0, -0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0, -0x7e0,0x7e0,0x7e0,0x7a4,0x7aa,0x7b0,0x7d1,0x798,0x7ce,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7dd, -0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd, -0x7dd,0x7dd,0x7dd,0x7a4,0x7c8,0x7a1,0x7c5,0x2e2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, +0xf7c,0xf8c,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xefc, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11a4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11a4, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0xc6a,0xc71,0xc79,0x5e9,0x234c,0x234c,0x234c,0xc81,0xc89,0xc8c,0x239c,0x238c,0xc94,0xc9c,0xca0,0xca4, +0x5e9,0x5e9,0x5e9,0x5e9,0xcac,0x24d6,0xcb4,0xcbc,0x221b,0xcc4,0xcca,0xcce,0xcd6,0x23e0,0xcde,0x5e9, +0x2213,0x2206,0x220b,0x2354,0xce6,0xcee,0xcf2,0xcf8,0x2783,0xd00,0x27d3,0xd07,0xd0b,0xd13,0x2a06,0xd1b, +0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0xd23,0xd2b,0xd33,0xd3b,0xd3f,0x5e9,0x5e9, +0xd47,0xd4a,0xd52,0x279b,0xd5a,0xd62,0x5e9,0xd6a,0xd72,0xd7a,0xd82,0x5e9,0x26d3,0xd8a,0xd92,0x283a, +0xd9a,0xda1,0xda9,0x25a5,0x2793,0x5e9,0x2773,0xdb1,0x2569,0xdb9,0xdc1,0xdc9,0xdd1,0xdd9,0x5e9,0x5e9, +0x2559,0x2559,0xde1,0x5e9,0x2813,0xde9,0x280b,0xdf1,0x2935,0xdf9,0x29e6,0xe01,0xe08,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0xe10,0x297b,0xe18,0xe20,0xe27,0x293d,0xe2f,0xe36,0xe3d,0xe45,0xe49,0xe50,0xe58, +0x2603,0x2605,0xe60,0xe67,0x2579,0x2571,0xe6f,0xe75,0x2707,0xe7d,0xe85,0xe89,0x26f3,0x26f7,0x26eb,0xe91, +0xe99,0x27bb,0xea1,0x5e9,0xea9,0xeb1,0x27a3,0xeb9,0xec1,0xec7,0xecf,0xed7,0xedf,0xee4,0xeec,0xef4, +0x289f,0x2897,0xefc,0xf04,0x27cb,0x27c3,0xf0c,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x27f3,0xf14,0xf1c,0x5e9, +0x27e3,0x27db,0xf24,0xf2c,0x26ff,0xf34,0xf3c,0xf43,0xf4b,0xf53,0xf5b,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x291d,0xf63,0x5e9,0x5e9,0x5e9,0x27b3,0x27ab,0xf6b,0xf73,0xf79,0xf81,0x5e9,0x5e9,0xf89,0xf8d,0xf95, +0x290d,0x28cc,0xf9d,0x2905,0x28c4,0xfa5,0x27eb,0xfad,0xfb5,0x5e9,0x5e9,0xfbd,0x5e9,0x5e9,0x29fe,0xfc5, +0xfcd,0xfd2,0xfda,0xfe1,0xfe6,0xfec,0x5e9,0x5e9,0xff4,0xff8,0x1000,0x1008,0x100e,0x1016,0x101a,0x1022, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x102a,0x1032,0x1037,0x103f,0x5e9,0x5e9,0x1046,0x2955,0x104e, +0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d, +0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x2442,0x1056,0x5e9,0x5e9,0x5e9, +0x243d,0x243d,0x243d,0x105e,0x281b,0x281b,0x281b,0x281b,0x281b,0x281b,0x1066,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x106a,0x29a3,0x29a3,0x106e,0x2531,0x2531,0x2531,0x2531,0x2531, +0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2533,0x2531,0x253b, +0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x253e,0x2531,0x2531,0x2531,0x2531,0x2531,0x2545,0x1076,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x107e,0x2842,0x2842, +0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2847,0x2842,0x2842,0x2842, +0x1086,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x29ee,0x108e, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d, +0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x1096,0x109e,0x10a6,0x29ab,0x10aa,0x10b2,0x10b7,0x2763,0x275b, +0x10bf,0x10c7,0x10cf,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x29f6,0x10d7,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x292d,0x2925,0x10df,0x10e7,0x10ee,0x5e9,0x26e3,0x26e3, +0x10f6,0x26db,0x10fe,0x5e9,0x5e9,0x1106,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, +0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28b4,0x2993,0x2993, +0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x110e,0x1114,0x111c,0x5e9, +0x5e9,0x5e9,0x2a16,0x2a16,0x2a16,0x111f,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1124,0x26c3,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f5,0x112c, +0x1131,0x1138,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x113c,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x277b,0x277b,0x277b,0x1144,0x1149,0x1151,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x29d3,0x29d3,0x29d3,0x29d3, +0x29d3,0x29d3,0x29d6,0x1159,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3, +0x29d3,0x1161,0x1168,0x1170,0x29b3,0x1178,0x117f,0x299b,0x299b,0x299b,0x1186,0x5e9,0x21a4,0x21a4,0x21a4,0x21a4, +0x21a4,0x21a4,0x21a4,0x118e,0x21a4,0x1196,0x21a5,0x219c,0x21ad,0x21b3,0x21bb,0x119e,0x2394,0x2394,0x11a6,0x5e9, +0x5e9,0x5e9,0x11ae,0x11b6,0x235c,0x235c,0x11be,0x11c6,0x5e9,0x5e9,0x5e9,0x5e9,0x21ec,0x21f3,0x11ce,0x21f6, +0x11d6,0x11de,0x11e6,0x21f0,0x11ee,0x11f6,0x11fe,0x21f5,0x21fd,0x21ec,0x21f3,0x21ef,0x21f6,0x21fe,0x21ed,0x21f4, +0x21f0,0x1205,0x21c3,0x21cb,0x21d2,0x21d9,0x21c6,0x21ce,0x21d5,0x21dc,0x120d,0x21e4,0x2823,0x2823,0x2823,0x2823, +0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x286f,0x282b,0x286f,0x2832, +0x1215,0x121d,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x1225,0x122d,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1235,0x123d,0x29bb,0x1245, +0x124a,0x5e9,0x5e9,0x5e9,0x295d,0x1252,0x125a,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x125e,0x1263,0x2965,0x126b,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x1273,0x1278,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x127f,0x1284,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x128c,0x1294,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x129c,0x278b,0x278b,0x278b,0x278b, +0x278b,0x278b,0x12a4,0x5e9,0x288f,0x2887,0x12ac,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x12b4, +0x2915,0x12b9,0x5e9,0x5e9,0x12c1,0x12c2,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x12ca,0x12d2,0x12da,0x12e2, +0x12ea,0x12f2,0x5e9,0x12f9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1301,0x2726,0x1307,0x2726, +0x130f,0x1314,0x131c,0x5e9,0x284f,0x2877,0x287f,0x28d4,0x2857,0x2945,0x285f,0x28dc,0x294d,0x294d,0x13ae,0x13b6, +0x13be,0x2983,0x13c6,0x13ce,0x296d,0x296d,0x296d,0x296d,0x1324,0x296d,0x2973,0x132c,0x1363,0x1363,0x1363,0x1363, +0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363, +0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x13d5,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, +0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1333,0x2452,0x133b,0x2454,0x2454, +0x133f,0x1347,0x134f,0x1357,0x25b5,0x2511,0x25bd,0x25c5,0x25ad,0x135f,0x1363,0x136a,0x1372,0x1376,0x137e,0x1386, +0x1363,0x1363,0x1363,0x1363,0x2634,0x263c,0x2634,0x2642,0x264a,0x2615,0x2652,0x265a,0x2634,0x2662,0x266a,0x2671, +0x2679,0x261d,0x2634,0x267e,0x2625,0x262c,0x2686,0x268c,0x272e,0x2735,0x2717,0x2693,0x269b,0x26a3,0x26ab,0x271f, +0x2634,0x26b3,0x138e,0x1396,0x25e8,0x25e8,0x25e8,0x25eb,0x2726,0x2726,0x139e,0x13a6,0x13e5,0x22b3,0x22b3,0x22b3, +0x13e6,0x13e6,0x13e6,0x13e6,0x2364,0x2364,0x2364,0x2364,0x2364,0x2364,0x2364,0x13ee,0x13e6,0x13e6,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x22ab,0x1429,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x1431,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x1439,0x28ec,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x1441,0x29cb,0x29cb,0x29cb, +0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x1445, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223, +0x144d,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1455, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x145d,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x1465,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, +0x1429,0x1429,0x1429,0x1455,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x1ffe,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, +0x2006,0x2006,0x2006,0x2006,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2230,0x2234,0x222b,0x2239, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x2240,0x2245,0x222e,0x222b,0x224c,0x222b,0x223a,0x222b,0x222b,0x2252,0x222b,0x222b,0x222b,0x222b, +0x225a,0x222b,0x222b,0x225e,0x2264,0x226c,0x225e,0x226e,0x222b,0x2271,0x2276,0x222b,0x222b,0x227a,0x222b,0x2282, +0x222b,0x222b,0x2285,0x228d,0x222b,0x222b,0x2295,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2239,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2243, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x223a,0x222b,0x222b,0x222b,0x2263,0x222b,0x222b,0x222b,0x2282,0x222b, +0x222b,0x222b,0x2299,0x222b,0x222b,0x222b,0x226c,0x222b,0x2277,0x222b,0x2276,0x2243,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x2240,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x225e,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x2240,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x2245,0x222b,0x2282,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x2242,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2245,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2276,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x229f,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222c,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2264,0x222b,0x222b,0x222b,0x222b,0x222b,0x2243,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x226c,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x22a6,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, +0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, +0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, +0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, +0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, +0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d8,0x26bb,0x26bb,0x26bb,0x26bb,0x26bb,0x26bb,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, +0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x28a7,0x28a7,0x28a7, +0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, +0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, +0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, +0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28ac,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, +0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x298b,0x298b, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, +0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, +0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x1461,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, +0x2a0e,0x5c8,0x5c8,0x5c8,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xf3,0xff,0xf9, +0xf9,0xfc,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x4a4,0x49e,0x483,0x46b,0x477,0x474,0x46b,0x486,0x471,0x47d,0x46b,0x495, +0x489,0x480,0x4a1,0x47a,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x48c,0x489, +0x48f,0x48f,0x48f,0x49e,0x46b,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, +0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x471, +0x477,0x47d,0x49b,0x465,0x498,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x471, +0x492,0x46e,0x48f,0x12,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x300,0x2f1,0x2f1, -0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1, -0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f4,0x64b,0x7ef,0x7f2,0x651,0x7f2,0x7ec,0x645, -0x63c,0x2fa,0x65a,0x2fd,0x7f5,0x633,0x648,0x7e9,0x64e,0x657,0x639,0x639,0x63f,0x2f7,0x645,0x642, -0x63c,0x639,0x65a,0x2fd,0x636,0x636,0x636,0x64b,0x306,0x306,0x306,0x306,0x306,0x306,0x663,0x306, -0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x663,0x306,0x306,0x306,0x306,0x306,0x306,0x654, -0x663,0x306,0x306,0x306,0x306,0x306,0x663,0x65d,0x660,0x660,0x303,0x303,0x303,0x303,0x65d,0x303, -0x660,0x660,0x660,0x303,0x660,0x660,0x303,0x303,0x65d,0x303,0x660,0x660,0x303,0x303,0x303,0x654, -0x65d,0x660,0x660,0x303,0x660,0x303,0x65d,0x303,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x30f,0x666,0x312,0x669,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x66f,0x666, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x666,0x672,0x66c,0x312,0x309,0x312,0x309, -0x666,0x312,0x309,0x312,0x309,0x312,0x309,0x672,0x66c,0x66f,0x666,0x312,0x669,0x312,0x309,0x312, -0x669,0x675,0x66f,0x666,0x312,0x669,0x312,0x309,0x312,0x309,0x66f,0x666,0x312,0x309,0x312,0x309, -0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x66f,0x666, -0x312,0x309,0x312,0x669,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309,0x312,0x309, -0x312,0x312,0x309,0x312,0x309,0x312,0x309,0x30c,0x315,0x321,0x321,0x315,0x321,0x315,0x321,0x321, -0x315,0x321,0x321,0x321,0x315,0x315,0x321,0x321,0x321,0x321,0x315,0x321,0x321,0x315,0x321,0x321, -0x321,0x315,0x315,0x315,0x321,0x321,0x315,0x321,0x324,0x318,0x321,0x315,0x321,0x315,0x321,0x321, -0x315,0x321,0x315,0x315,0x321,0x315,0x321,0x324,0x318,0x321,0x321,0x321,0x315,0x321,0x315,0x321, -0x321,0x315,0x315,0x31e,0x321,0x315,0x315,0x315,0x31e,0x31e,0x31e,0x31e,0x327,0x327,0x31b,0x327, -0x327,0x31b,0x327,0x327,0x31b,0x324,0x678,0x324,0x678,0x324,0x678,0x324,0x678,0x324,0x678,0x324, -0x678,0x324,0x678,0x324,0x678,0x315,0x324,0x318,0x324,0x318,0x324,0x318,0x321,0x315,0x324,0x318, -0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x318,0x327,0x327,0x31b,0x324,0x318,0x9cf,0x9cf, -0x9d2,0x9cc,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318, -0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x324,0x318,0x9d2,0x9cc,0x9d2,0x9cc, -0x9cf,0x9c9,0x9d2,0x9cc,0xb8e,0xc87,0x9cf,0x9c9,0x9cf,0x9c9,0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc, -0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc,0x9d2,0x9cc,0xc87,0xc87,0xc87,0xd80,0xd80,0xd80,0xd83,0xd83, -0xd80,0xd83,0xd83,0xd80,0xd80,0xd83,0xec1,0xec4,0xec4,0xec4,0xec4,0xec1,0xec4,0xec1,0xec4,0xec1, -0xec4,0xec1,0xec4,0xec1,0x32a,0x67b,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x67b,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32d,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xc8a,0xc8a, -0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x336,0x336,0x333,0x333,0x681,0x333,0x339,0x684,0x33c,0x684,0x684,0x684,0x33c,0x684,0x339,0x339, -0x687,0x33f,0x333,0x333,0x333,0x333,0x333,0x333,0x67e,0x67e,0x67e,0x67e,0x330,0x67e,0x333,0xb04, -0x342,0x342,0x342,0x342,0x342,0x333,0x333,0x333,0x333,0x333,0x9de,0x9de,0x9db,0x9d8,0x9db,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68d,0x68d,0x92d,0x68d,0x68d,0x930,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xc3f, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xe85,0xe85,0xe85,0xe85,0xe88,0xd4d,0xd4d,0xd4d, -0x690,0x690,0xb0a,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84,0xc84, -0xf6f,0xf6c,0xf6f,0xf6c,0x34e,0x357,0xf6f,0xf6c,9,9,0x35d,0xec7,0xec7,0xec7,0x345,0x14b8, -9,9,9,9,0x35a,0x348,0x36c,0x34b,0x36c,0x36c,0x36c,9,0x36c,9,0x36c,0x36c, -0x363,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696, -0x696,0x696,9,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x36c,0x36c,0x363,0x363,0x363,0x363, -0x363,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693, -0x693,0x693,0x360,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x363,0x363,0x363,0x363,0x363,0xf6f, -0x36f,0x36f,0x372,0x36c,0x36c,0x36f,0x366,0x9e1,0xb97,0xb94,0x369,0x9e1,0x369,0x9e1,0x369,0x9e1, -0x369,0x9e1,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351,0x354,0x351, -0x36f,0x36f,0x366,0x360,0xb46,0xb43,0xb91,0xc93,0xc90,0xc96,0xc93,0xc90,0xd86,0xd89,0xd89,0xd89, -0x9f0,0x6a2,0x37e,0x381,0x37e,0x37e,0x37e,0x381,0x37e,0x37e,0x37e,0x37e,0x381,0x9f0,0x381,0x37e, -0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x6a2,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f, -0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f,0x69f, -0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x69c,0x699,0x699,0x699,0x699,0x699,0x699, -0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x9ea,0x69c,0x378,0x37b, -0x378,0x378,0x378,0x37b,0x378,0x378,0x378,0x378,0x37b,0x9ea,0x37b,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x381,0x37b,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x375,0x939, -0x93c,0x91e,0x91e,0x111c,0x9e4,0x9e4,0xb9d,0xb9a,0x9ed,0x9e7,0x9ed,0x9e7,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378, -0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x378,0x37e,0x381,0x37b,0x37e, -0x378,0xb9d,0xb9a,0x37e,0x378,0xb9d,0xb9a,0x37e,0x378,0xb9d,0xb9a,0xeca,0x381,0x37b,0x381,0x37b, -0x37e,0x378,0x381,0x37b,0x37e,0x378,0x381,0x37b,0x381,0x37b,0x381,0x37b,0x37e,0x378,0x381,0x37b, -0x381,0x37b,0x381,0x37b,0x37e,0x378,0x381,0x37b,0x9f0,0x9ea,0x381,0x37b,0x381,0x37b,0x381,0x37b, -0x381,0x37b,0xd8f,0xd8c,0x381,0x37b,0xecd,0xeca,0xecd,0xeca,0xecd,0xeca,0xc03,0xc00,0xc03,0xc00, -0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xc03,0xc00,0xefa,0xef7,0xefa,0xef7, -0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7,0xfea,0xfe7, -0x1155,0x1152,0x132f,0x132c,0x14ee,0x14eb,0x14ee,0x14eb,0x14ee,0x14eb,0x14ee,0x14eb,0xc,0x393,0x393,0x393, -0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, -0x393,0x393,0x393,0x393,0x393,0x393,0x393,0xc,0xc,0x396,0x384,0x384,0x384,0x38a,0x384,0x387, -0x18f9,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, -0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, -0x38d,0x38d,0x38d,0x390,0x18f9,0x399,0x9f3,0xc,0xc,0x14bb,0x14bb,0x13d7,0xf,0x960,0x960,0x960, -0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0xd92,0x960, -0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x39c,0x39c,0x39c,0x39c, -0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xed0,0x39c,0x39c,0x39c,0x3a8,0x39c,0x39f,0x39c,0x39c,0x3ab, -0x963,0xd95,0xd98,0xd95,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x3ae,0x3ae,0x3ae,0x3ae, -0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae, -0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0x3ae,0xf,0xf,0xf,0xf,0x18fc,0x3ae,0x3ae,0x3ae,0x3a5, -0x3a2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcab,0xcab,0xcab,0xcab, -0x13da,0x14be,0xf78,0xf78,0xf78,0xf75,0xf75,0xd9e,0x8a6,0xca5,0xca2,0xca2,0xc99,0xc99,0xc99,0xc99, -0xc99,0xc99,0xf72,0xf72,0xf72,0xf72,0xf72,0x8a3,0x14b5,0x1b0f,0xda1,0x8a9,0x12f6,0x3c9,0x3cc,0x3cc, -0x3cc,0x3cc,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x8ac,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xb3d, -0xb3d,0xb3d,0xc99,0xc9f,0xc9c,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0x12f3,0x93f,0x93f,0x93f,0x93f, -0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x3c3,0x3c0,0x3bd,0x3ba,0xba0,0xba0,0x921,0x3c9,0x3c9,0x3d5, -0x3c9,0x3cf,0x3cf,0x3cf,0x3cf,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x9f9,0x9f9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x9f9,0x3cc,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x9f9,0x3c9,0x3c9,0x3c9,0x3cc,0x942,0x3c9,0x3b4,0x3b4, -0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b1,0x3ba,0x3b7,0x3b7,0x3b4,0x3b4,0x3b4,0x3b4,0x3d2,0x3d2,0x3b4, -0x3b4,0x3ba,0x3b7,0x3b7,0x3b7,0x3b4,0xca8,0xca8,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, -0x3c6,0x3c6,0x9f9,0x9f9,0x9f9,0x9f6,0x9f6,0xca8,0xa0e,0xa0e,0xa0e,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa05,0xa08,0xa05,0x12,0xa11,0xa0b,0x9fc,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xcae,0xcae,0xcae,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02, -0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0x9ff,0x9ff,0x12,0x12,0xcae,0xcae,0xcae,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc, -0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xffc,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa14,0xa14, -0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xba3,0x15,0x15,0x15,0x15,0x15,0x15, -0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15, -0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15, -0xf15,0xf15,0xf15,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf18,0xf18,0xf0c,0xf0c, -0xf0f,0xf1e,0xf1b,0xff,0xff,0x1920,0x1923,0x1923,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb16,0xb16,0xb19,0xb19,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0x1c53,0x1c53,0x1c50,0x1c50,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1626, -0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bed,0x1bea,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, -0x1491,0x1491,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1b6c,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, -0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1ad3,0x288,0x288,0x288,0x288,0x288,0x288,0x288, -0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x1761,0x1761,0x1761,0x1761,0x204,0x204,0x204,0x204, -0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x29d,0x1bd5,0x1bd5,0x1bd5, -0x1bd5,0x1bd5,0x1bd5,0x1bd5,0x29d,0x1bd5,0x1bd5,0x29d,0x16c5,0x16c5,0x16c5,0x16c5,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x2b2,0x2b2,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xdf5,0xdf5,0xdf2,0xdf2,0xdf2,0xdf5,0xd2,0xd2, -0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x210,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x1c08,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25, -0x1a25,0x1a25,0x26d,0x26d,0x26d,0x26d,0x1a28,0x1a22,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5, -0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38, -0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x252,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x95d,0x95d,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,0x95d,0x95d,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,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0x14c4,0x3f0,0x3ff,0x3ff, -0x18,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x18,0x18,0x405,0x405,0x18,0x18,0x405, -0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x18,0x405,0x405, -0x405,0x405,0x405,0x405,0x405,0x18,0x405,0x18,0x18,0x18,0x405,0x405,0x405,0x405,0x18,0x18, -0x3f3,0xcb4,0x3f0,0x3ff,0x3ff,0x3f0,0x3f0,0x3f0,0x3f0,0x18,0x18,0x3ff,0x3ff,0x18,0x18,0x402, -0x402,0x3f6,0xda7,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3f0,0x18,0x18,0x18,0x18, -0x408,0x408,0x18,0x408,0x405,0x405,0x3f0,0x3f0,0x18,0x18,0x948,0x948,0x948,0x948,0x948,0x948, -0x948,0x948,0x948,0x948,0x405,0x405,0x3fc,0x3fc,0x3f9,0x3f9,0x3f9,0x3f9,0x3f9,0x3fc,0x3f9,0x112b, -0x185a,0x1857,0x18ff,0x18,0x1b,0xcb7,0x40b,0xcba,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x1b, -0x1b,0x1b,0x1b,0x417,0x417,0x1b,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417, -0x417,0x417,0x417,0x417,0x417,0x1b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x1b,0x417,0x41a, -0x1b,0x417,0x41a,0x1b,0x417,0x417,0x1b,0x1b,0x40e,0x1b,0x414,0x414,0x414,0x40b,0x40b,0x1b, -0x1b,0x1b,0x1b,0x40b,0x40b,0x1b,0x1b,0x40b,0x40b,0x411,0x1b,0x1b,0x1b,0xf84,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x41a,0x41a,0x41a,0x417,0x1b,0x41a,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x40b,0x40b,0x417,0x417, -0x417,0xf84,0x1902,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1e,0x41d,0x41d,0x426, -0x1e,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0xcc3,0x429,0x1e,0x429,0x429,0x429,0x1e,0x429, -0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x1e,0x429,0x429, -0x429,0x429,0x429,0x429,0x429,0x1e,0x429,0x429,0x1e,0x429,0x429,0x429,0x429,0x429,0x1e,0x1e, -0x420,0x429,0x426,0x426,0x426,0x41d,0x41d,0x41d,0x41d,0x41d,0x1e,0x41d,0x41d,0x426,0x1e,0x426, -0x426,0x423,0x1e,0x1e,0x429,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x429,0xcc3,0xcbd,0xcbd,0x1e,0x1e,0x94e,0x94e,0x94e,0x94e,0x94e,0x94e, -0x94e,0x94e,0x94e,0x94e,0x13dd,0xcc0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x16da,0x185d,0x185d, -0x185d,0x1860,0x1860,0x1860,0x21,0x42c,0x43b,0x43b,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x21,0x21,0x441,0x441,0x21,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x441,0x441,0x441,0x441,0x21,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x21,0x441,0x441, -0x21,0xcc6,0x441,0x441,0x441,0x441,0x21,0x21,0x42f,0x441,0x42c,0x42c,0x43b,0x42c,0x42c,0x42c, -0xf87,0x21,0x21,0x43b,0x43e,0x21,0x21,0x43e,0x43e,0x432,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x1a6d,0x42c,0x42c,0x21,0x21,0x21,0x21,0x444,0x444,0x21,0x441,0x441,0x441,0xf87,0xf87, -0x21,0x21,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x438,0x435,0xcc6,0x1302,0x1302, -0x1302,0x1302,0x1302,0x1302,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x24,0x24,0x447,0x453, -0x24,0x453,0x453,0x453,0x453,0x453,0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x24,0x453,0x453, -0x456,0x453,0x24,0x24,0x24,0x453,0x453,0x24,0x453,0x24,0x453,0x453,0x24,0x24,0x24,0x453, -0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x24,0x24,0x24,0x453,0x453,0x453,0x453,0x453,0x453, -0x453,0x453,0xdaa,0x453,0x453,0x453,0x24,0x24,0x24,0x24,0x447,0x44d,0x447,0x44d,0x44d,0x24, -0x24,0x24,0x44d,0x44d,0x44d,0x24,0x450,0x450,0x450,0x44a,0x24,0x24,0xf8a,0x24,0x24,0x24, -0x24,0x24,0x24,0x447,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xebe,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x951,0x951,0x951,0xd7a,0xcc9,0xcc9,0xcc9,0xcc9, -0xcc9,0xccc,0xcc9,0x24,0x24,0x24,0x24,0x24,0x14c7,0x465,0x465,0x465,0x1905,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x27,0x468,0x468,0x468,0x468,0x468,0x468, -0x468,0x468,0x468,0x468,0x14ca,0x468,0x468,0x468,0x468,0x468,0x27,0x27,0x1b12,0xf93,0x459,0x459, -0x459,0x465,0x465,0x465,0x465,0x27,0x459,0x459,0x45c,0x27,0x459,0x459,0x459,0x45f,0x27,0x27, -0x27,0x27,0x27,0x27,0x27,0x459,0x459,0x27,0xf93,0xf93,0x16dd,0x27,0x27,0x1b15,0x27,0x27, -0x468,0x468,0xf8d,0xf8d,0x27,0x27,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x19d1,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90,0xf90, -0x179d,0x14cd,0x471,0x471,0x1908,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x2a,0x477,0x477, -0x477,0x2a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477, -0x477,0x2a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x2a,0x477,0x477,0x477, -0x477,0x477,0x2a,0x2a,0xccf,0xcd2,0x471,0x46b,0x474,0x471,0x46b,0x471,0x471,0x2a,0x46b,0x474, -0x474,0x2a,0x474,0x474,0x46b,0x46e,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x46b,0x46b,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x1b18,0x477,0x2a,0x477,0x477,0xed6,0xed6,0x2a,0x2a,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x2a,0xed9,0xed9,0x1bdb,0x2a,0x2a,0x2a,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1863,0x14d0,0x483,0x483,0x1a70,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x2d,0x489,0x489,0x489,0x2d,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x483,0x47a,0x47a,0x47a,0xf96,0x2d,0x483,0x483, -0x483,0x2d,0x486,0x486,0x486,0x47d,0x1308,0x17a0,0x2d,0x2d,0x2d,0x2d,0x17a3,0x17a3,0x17a3,0x47a, -0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x16e0,0x489,0x489,0xf96,0xf96,0x2d,0x2d,0x480,0x480, -0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0x17a0,0x17a0, -0x17a0,0xf9c,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x30,0x1a73,0xa23,0xa23,0x30,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30, -0x30,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0x30,0xa29,0x30,0x30,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0x30,0x30,0x30,0xa1d,0x30, -0x30,0x30,0x30,0xa1a,0xa23,0xa23,0xa1a,0xa1a,0xa1a,0x30,0xa1a,0x30,0xa23,0xa23,0xa26,0xa23, -0xa26,0xa26,0xa26,0xa1a,0x30,0x30,0x30,0x30,0x30,0x30,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, -0x14d3,0x14d3,0x14d3,0x14d3,0x30,0x30,0xa23,0xa23,0xa20,0x30,0x30,0x30,0x30,0x30,0x30,0x30, -0x30,0x30,0x30,0x30,0x33,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x48f,0x4a4,0x4a1,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x495,0x33, -0x33,0x33,0x33,0x48c,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4a4,0x4a7,0x492,0x492,0x492,0x492,0x492, -0x492,0x48f,0x492,0x498,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49b,0x49b, -0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x4b9,0x4b9,0x36,0x4b9,0x36,0x19d7,0x4b9,0x4b9,0x19d7,0x4b9,0x36,0x19d7,0x4b9,0x19d7,0x19d7, -0x19d7,0x19d7,0x19d7,0x19d7,0x4b9,0x4b9,0x4b9,0x4b9,0x19d7,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9,0x4b9, -0x19d7,0x4b9,0x4b9,0x4b9,0x36,0x4b9,0x36,0x4b9,0x19d7,0x19d7,0x4b9,0x4b9,0x19d7,0x4b9,0x4b9,0x4b9, -0x4b9,0x4ad,0x4b9,0x4b6,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x19d4,0x4ad,0x4ad,0x4b9,0x36,0x36, -0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x36,0x4bf,0x36,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4ad,0x1bde,0x36, -0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x36,0x36,0x4bc,0x4bc,0x13e0,0x13e0, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x39,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c, -0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c,0x99c,0x99f,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99f,0xa38,0xfab,0xfab,0x39,0x39,0x39, -0x39,0x966,0x966,0x969,0x966,0x969,0x969,0x975,0x969,0x975,0x966,0x966,0x966,0x966,0x966,0x996, -0x966,0x969,0x96f,0x96f,0x972,0x97b,0x96c,0x96c,0x99c,0x99c,0x99c,0x99c,0x1311,0x130b,0x130b,0x130b, -0x966,0x966,0x966,0x969,0x966,0x966,0xa2c,0x966,0x39,0x966,0x966,0x966,0x966,0x969,0x966,0x966, -0x966,0x966,0x969,0x966,0x966,0x966,0x966,0x969,0x966,0x966,0x966,0x966,0x969,0x966,0xa2c,0xa2c, -0xa2c,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0xa2c,0x969,0xa2c,0xa2c,0xa2c,0x39,0xa35,0xa35, -0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa2f,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0x39,0xfa2,0xa32, -0xdad,0xdad,0xfa5,0xfa8,0xfa2,0x112e,0x112e,0x112e,0x112e,0x130e,0x130e,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x4c8,0x4c8,0x4c8,0x4c8, -0x4c8,0x4c8,0x3c,0x13e6,0x3c,0x3c,0x3c,0x3c,0x3c,0x13e6,0x3c,0x3c,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0x3f,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f, -0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0x3f,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x3f,0x3f,0x1314,0x1314,0xdb6, -0xdb9,0xa5c,0xa65,0xa59,0xa59,0xa59,0xa59,0xa65,0xa65,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, -0xa5f,0xa5f,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x3f,0x3f,0x3f, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0x16e6,0x42,0x42,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x42,0x42, -0xa7a,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa77,0xa74,0x45,0x45,0x45, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa80,0xa80,0xa80,0xa83,0xa83, -0xa83,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x48,0x48,0x48,0x48,0x48,0x48,0x48, -0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xa86,0xaa4,0xaa4,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa8c,0xa89,0xaad,0xaad,0xa9e,0xaa7,0xa95,0xa92,0xa9b,0xa98,0xaa7,0xcd5,0x4b,0x4b, -0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0xab9,0xab9,0xb31,0xb34,0xabf,0xb2e,0xabc,0xab9,0xac2,0xad1,0xac5,0xad4,0xad4,0xad4,0xab0,0x1b1b, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0x190b,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xab3,0xfc9,0x4e,0x4e,0x4e,0x4e,0x4e, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x51,0x51, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x4e9,0x51,0x4e9,0x51,0x4e9,0x51,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e0,0x4e6,0x4e0, -0x4e0,0x4dd,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4dd,0x4dd,0x4dd, -0x4e6,0x4e6,0x4e6,0x4e6,0x51,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x51,0x4dd,0x4dd,0x4dd, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4dd,0x4dd,0x4dd, -0x51,0x51,0x4e6,0x4e6,0x4e6,0x51,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e3,0x4e0,0x51, -0xba9,0xbac,0xbac,0xbac,0xfd2,0x54,0x14b2,0x14b2,0x14b2,0x14b2,0x4f2,0x4f2,0x4f2,0x4f2,0x4f2,0x4f2, -0x53d,0xbbe,0x57,0x57,0x6d8,0x53d,0x53d,0x53d,0x53d,0x53d,0x543,0x555,0x543,0x54f,0x549,0x6db, -0x53a,0x6d5,0x6d5,0x6d5,0x6d5,0x53a,0x53a,0x53a,0x53a,0x53a,0x540,0x552,0x540,0x54c,0x546,0x57, -0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x57,0x57,0x57, -0x1b1e,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x561,0x561,0x561, -0x561,0x564,0xae0,0xae0,0xbc4,0xbca,0xbca,0xbc7,0xbc7,0xbc7,0xbc7,0xdcb,0xedc,0xedc,0xedc,0xedc, -0x1119,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x594,0x594,0x594,0xae9,0xee5,0xfd8,0xfd8,0xfd8,0xfd8,0x1275,0x16ec,0x16ec,0x60,0x60,0x60,0x60, -0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x702,0x5a0,0x5a0,0x59d,0x59d,0x59d,0x59d, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0xaf2,0xaf2,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x66,0x66,0x66,0x66,0x66, -0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0x69,0xb0d,0xb0d,0xb0d,0xb0d,0xb10, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb10,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, -0x6f,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x81c,0x81f,0x81c,0x81f,0x81c, -0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c,0x81f,0x81c, -0x81c,0x81c,0x81c,0x822,0x81c,0x822,0x81c,0x822,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x822,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81f,0xc63,0xc63,0x6f,0x6f,0x936,0x936,0x8fd,0x8fd,0x825,0x828,0xc60, -0x72,0x72,0x72,0x72,0x72,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a, -0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a, -0x83a,0x1107,0x18d2,0x19bc,0x75,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x75,0x906,0x906,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, +0,0,0,0,0x12,0x12,0x12,0x12,0x12,0x102,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x4b,0x36f,0x474,0x477,0x375,0x477,0x46b,0x366,0x357,0xa5,0x3cc,0xcc, +0x48f,0x333,0x369,0x462,0x372,0x39f,0x345,0x345,0x35d,0x84,0x366,0x3ea,0x35a,0x345,0x3cc,0xcc, +0x33f,0x33f,0x33f,0x36f,0x282,0x282,0x282,0x282,0x282,0x282,0x3e1,0x282,0x282,0x282,0x282,0x282, +0x282,0x282,0x282,0x282,0x3e1,0x282,0x282,0x282,0x282,0x282,0x282,0x396,0x3e1,0x282,0x282,0x282, +0x282,0x282,0x3e1,0x3db,0x3de,0x3de,0x27c,0x27c,0x27c,0x27c,0x3db,0x27c,0x3de,0x3de,0x3de,0x27c, +0x3de,0x3de,0x27c,0x27c,0x3db,0x27c,0x3de,0x3de,0x27c,0x27c,0x27c,0x396,0x3db,0x3de,0x3de,0x27c, +0x3de,0x27c,0x3db,0x27c,0x282,0x3de,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, +0x282,0x27c,0x282,0x27c,0x27f,0x3db,0x282,0x3de,0x26d,0x267,0x282,0x27c,0x282,0x27c,0x282,0x3de, +0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x282,0x3de, +0x26d,0x267,0x282,0x27c,0x282,0x3db,0x3d8,0x3d5,0x282,0x27c,0x282,0x27c,0x3c0,0x282,0x27c,0x282, +0x27c,0x282,0x27c,0x3d8,0x3d5,0x3e1,0x3db,0x282,0x3de,0x282,0x27c,0x282,0x3de,0x3e4,0x3e1,0x3db, +0x282,0x3de,0x26d,0x267,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x282,0x27c, +0x282,0x27c,0x282,0x27c,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x282,0x3de, +0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x282,0x27c,0x282, +0x27c,0x282,0x27c,0x270,0x252,0x27f,0x26a,0x264,0x26a,0x264,0x27f,0x26a,0x264,0x27f,0x27f,0x26a, +0x264,0x25e,0x27f,0x27f,0x27f,0x27f,0x279,0x26a,0x27f,0x264,0x27f,0x27f,0x27f,0x279,0x264,0x264, +0x26a,0x27f,0x264,0x26a,0x282,0x27c,0x26a,0x264,0x26a,0x264,0x26a,0x26a,0x264,0x26a,0x25e,0x25e, +0x26a,0x264,0x26a,0x282,0x27c,0x26a,0x27f,0x27f,0x279,0x26a,0x264,0x27f,0x26a,0x24c,0x25e,0x261, +0x26a,0x264,0x25e,0x24c,0x258,0x258,0x258,0x258,0x276,0x276,0x270,0x276,0x276,0x270,0x276,0x276, +0x270,0x282,0x3de,0x282,0x3de,0x282,0x3de,0x282,0x3de,0x26d,0x3c6,0x26d,0x3c6,0x26d,0x3c6,0x26d, +0x3c6,0x279,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26a,0x264,0x282,0x27c,0x282,0x27c,0x26d,0x267, +0x26d,0x267,0x282,0x27c,0x267,0x276,0x276,0x270,0x26d,0x267,0x7c8,0x7c8,0x7e0,0x7dd,0x26d,0x267, +0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255, +0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x7e0,0x7dd,0x7e0,0x7dd, +0x7c8,0x7c5,0x7da,0x7d4,0x9ab,0xa77,0x7d7,0x7d1,0x7d7,0x7d1,0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4, +0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4,0xa74,0xa74,0xa74,0xb8b,0xb8b,0xb8b,0xb8e,0xb8e, +0xb8b,0xb8e,0xb8e,0xb8b,0xb8b,0xb8e,0xc7b,0xc7e,0xc84,0xc7e,0xc7e,0xc7b,0xc7e,0xc7b,0xc7e,0xc7b, +0xc84,0xc81,0xc7e,0xc7b,0x252,0x3c3,0x252,0x279,0x279,0x252,0x279,0x279,0x252,0x279,0x252,0x279, +0x252,0x252,0x252,0x252,0x252,0x3c3,0x252,0x279,0x252,0x252,0x252,0x252,0x279,0x279,0x252,0x252, +0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x252,0x252,0x252,0x25e,0x252,0x252,0x252,0x252, +0x25e,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x279, +0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x258,0x258,0x252,0x252,0x252,0x252,0x252,0x252, +0x252,0x252,0x25e,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x7cb,0x7cb,0x7cb, +0x7cb,0x7cb,0xa74,0xa74,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x96,0x96,0x9c, +0x2e8,0x96,0x96,0x96,0x93,0x93,0x6c,0x6c,0x354,0x6c,0x96,0x3f0,0x99,0x3f0,0x3f0,0x3f0, +0x99,0x3f3,0x96,0x96,0x363,0x9f,0x6c,0x6c,0x6c,0x6c,0x6c,0x2eb,0x357,0x3ed,0x357,0x357, +0x72,0x357,0x6c,0x873,0x285,0x285,0x285,0x285,0x285,0x6c,0x6c,0x6c,0x6c,0x6c,0x777,0x777, +0x762,0x75c,0x762,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0x67b,0x67e,0x681,0x687,0x68a,0x68d,0x690,0x693,0x696,0x684,0x699,0x69c, +0x69f,0x6a5,0x6a8,0x66c,0x6a2,0x6ab,0x66c,0x6ae,0x66c,0x66c,0x672,0x66c,0x66c,0x66c,0x66c,0x678, +0x66c,0x66c,0x66c,0x66c,0x66c,0x672,0x672,0x6b1,0x6b4,0x6b7,0x678,0x678,0x678,0x66c,0x66c,0x66c, +0x66c,0x6ba,0x6b7,0x66c,0x6bd,0x6c0,0x672,0x66c,0x672,0x66c,0x672,0x66c,0x66c,0x66c,0x66c,0x66c, +0x66c,0x66c,0x66c,0x66c,0x675,0x675,0x6c3,0x675,0x675,0x6c6,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd, +0x8fd,0x8fd,0x8fd,0xa17,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xc45,0xc3f,0xc3f,0xc3f, +0xc42,0xb04,0xb0a,0xb04,0x66f,0x66f,0x900,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xd65,0xd62,0xd65,0xd62,0x2ee,0x30f,0xd65,0xd62,0,0,0x1bc,0xc69, +0xc69,0xc69,0x4e,0x12ab,0,0,0,0,0x1b6,0x6f,0x1dd,0x78,0x1dd,0x1dd,0x1dd,0, +0x1dd,0,0x1dd,0x1dd,0x1da,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd, +0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x1dd,0x1dd, +0x1da,0x1da,0x1da,0x1da,0x1da,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba, +0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x1d7,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x1da,0x1da, +0x1da,0x1da,0x1da,0xd68,0x1e0,0x1e0,0x1e3,0x1d4,0x1d4,0x1e0,0x1d1,0x7a1,0x9a8,0x9a5,0x1c2,0x79e, +0x1c2,0x79e,0x1c2,0x79e,0x1c2,0x79e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e, +0x171,0x16e,0x171,0x16e,0x1e0,0x1e0,0x1d1,0x1c8,0x92d,0x92a,0x9a2,0xa53,0xa50,0xa59,0xa53,0xa50, +0xb7f,0xb7c,0xb7c,0xb7c,0x786,0x3b4,0x195,0x198,0x195,0x195,0x195,0x198,0x195,0x195,0x195,0x195, +0x198,0x786,0x198,0x195,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b4,0x3b1,0x3b1, +0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, +0x3b1,0x3b1,0x3b1,0x3b1,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ae,0x3ab,0x3ab, +0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab, +0x780,0x3ae,0x18f,0x192,0x18f,0x18f,0x18f,0x192,0x18f,0x18f,0x18f,0x18f,0x192,0x780,0x192,0x18f, +0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177, +0x17d,0x177,0x17d,0x177,0x17d,0x177,0x180,0x17a,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177, +0x17d,0x177,0x174,0x666,0x669,0x657,0x657,0xec1,0x8b2,0x8b2,0x99c,0x999,0x783,0x77d,0x783,0x77d, +0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f, +0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f, +0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f, +0x195,0x18c,0x186,0x189,0x183,0x99c,0x999,0x189,0x183,0x99c,0x999,0x189,0x183,0x99c,0x999,0xc66, +0x198,0x192,0x198,0x192,0x195,0x18f,0x198,0x192,0x195,0x18f,0x18c,0x186,0x198,0x192,0x198,0x192, +0x195,0x18f,0x198,0x192,0x198,0x192,0x198,0x192,0x195,0x18f,0x18c,0x186,0x786,0x780,0x198,0x192, +0x198,0x192,0x198,0x192,0x198,0x192,0xb5b,0xb58,0x198,0x192,0xc63,0xc60,0xc63,0xc60,0xc63,0xc60, +0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993, +0xc63,0xc60,0xc63,0xc60,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, +0xd56,0xd50,0xd56,0xd50,0xee8,0xee5,0x10c2,0x10bf,0x129f,0x129c,0x129f,0x129c,0x129f,0x129c,0x129f,0x129c, +0,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0,0,0x156,0x144,0x144, +0x144,0x14a,0x144,0x147,0x166b,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x14d,0x166b,0x312,0x774,0,0,0x1296,0x1296,0x1194, +0,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, +0x72f,0x72f,0xc24,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0xce4,0x612,0x612,0x612,0x213,0x612, +0x20a,0x612,0x612,0x216,0x732,0xc27,0xb85,0xc2a,0,0,0,0,0,0,0,0, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0,0,0,0,0x1677, +0x21c,0x21c,0x21c,0x210,0x20d,0,0,0,0,0,0,0,0,0,0,0, +0xa3e,0xa3e,0xa3e,0xa3e,0x1191,0x128d,0xd3e,0xd3e,0xd3e,0xd3b,0xd3b,0xb34,0x2f4,0xa38,0xa35,0xa35, +0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xe79,0xe79,0xe79,0xe79,0xe79,0x2f1,0x1260,0x1863,0xb3d,0x2f7, +0x10bc,0x138,0x13b,0x13b,0x13b,0x13b,0x13b,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0xd41,0xd41,0xd47,0xd41,0xd41, +0x2fa,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x65d,0x65d,0x65d,0x65d,0x65d, +0x65d,0x65d,0x65d,0x8f7,0x8fa,0x8fa,0xae6,0xaec,0xae9,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0x114f, +0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x117,0x114,0x111,0x10e,0x98d,0x98d, +0x65a,0x123,0x138,0x141,0x138,0x129,0x129,0x129,0x129,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x120,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x126,0x126,0x126,0x126,0x138,0x138,0x126,0x138,0x126, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x120,0x138,0x138,0x138,0x138,0x138,0x126,0x138, +0x126,0x138,0x138,0x138,0x76e,0x76e,0x138,0x138,0x138,0x138,0x138,0x76e,0x13b,0x138,0x13b,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x771,0x138,0x138,0x138,0x13b, +0x318,0x138,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x108,0x10e,0x5e2,0x5e2,0x5df,0x5df,0x5df, +0x5df,0x13e,0x13e,0x5df,0x5df,0x10e,0x5e2,0x5e2,0x5e2,0x5df,0xa3b,0xa3b,0x11a,0x11a,0x11a,0x11a, +0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x76e,0x76e,0x76e,0x76b,0x76b,0xa3b,0x840,0x840,0x840,0x83a, +0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x837,0x83a,0x837,0,0x843,0x83d,0x8e2,0x83d,0x83d, +0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, +0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0xa83,0xa83,0xa83,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e5,0x8e5,0x8e5,0x8e5, +0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0,0,0xa83,0xa83,0xa83,0xb37,0xb3a,0xb3a,0xb37, +0xb37,0xb37,0xb3a,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb3a,0xb37,0xb3a,0xb3a, +0xb37,0xb37,0xb3a,0xb3a,0xb3a,0xb37,0xb3a,0xb37,0xb37,0xb37,0xd47,0xd47,0xd47,0xd47,0xd44,0xd44, +0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd41,0xd41,0x846,0x846,0x846,0x846, 0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x846,0xd5f,0xd5f,0x78,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0x7b,0x7b,0x7b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0x7e, -0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x9c0,0x9c0,0x9c0,0x9c0,0x81,0x81,0x81,0x81, -0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, -0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x609,0x609,0x609,0x609,0x609,0x609,0x609,0x84, -0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x84,0x84,0x84,0x84,0x84,0xafe,0x5fa,0x600,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0x606, -0x606,0x5fd,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x84, -0x600,0x600,0x600,0x600,0x600,0x84,0x600,0x84,0x600,0x600,0x84,0x600,0x600,0x84,0x600,0x600, -0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x603,0x615,0x60f,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x1329,0x1329,0x1b21,0x87,0x87,0x87,0x87,0x87, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x615,0x60f,0x612,0x618,0x615, -0x60f,0x615,0x60f,0x615,0x60f,0x615,0x615,0x60f,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x612,0x60f, -0x612,0x612,0x612,0x60f,0x612,0x612,0x612,0x612,0x87,0x87,0x612,0x612,0x612,0x612,0x60f,0x60f, -0x612,0x60f,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x60f,0x60f, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x1b21,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x85e,0x870,0x86d,0x870,0x86d,0xc81,0xc81,0xd6b, -0xd68,0x861,0x861,0x861,0x861,0x873,0x873,0x873,0x88b,0x88e,0x89d,0x8a,0x891,0x894,0x8a0,0x8a0, -0x888,0x87f,0x879,0x87f,0x879,0x87f,0x879,0x87c,0x87c,0x897,0x897,0x89a,0x897,0x897,0x897,0x8a, -0x897,0x885,0x882,0x87c,0x8a,0x8a,0x8a,0x8a,0x621,0x62d,0x621,0xbfd,0x621,0x8d,0x621,0x62d, -0x621,0x62d,0x621,0x62d,0x621,0x62d,0x621,0x62d,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x62a,0x624,0x8d,0x8d,0x61e,0x75f,0x762,0x777,0x77a,0x759,0x762,0x762,0x93, -0x741,0x744,0x744,0x744,0x744,0x741,0x741,0x93,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0xb01,0xb01,0xb01,0x9c3,0x73b,0x630,0x630,0x93,0x789,0x768,0x759,0x762,0x75f,0x759,0x76b, -0x75c,0x756,0x759,0x777,0x76e,0x765,0x786,0x759,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, -0x783,0x783,0x774,0x771,0x777,0x777,0x777,0x789,0x74a,0x747,0x747,0x747,0x747,0x747,0x747,0x747, -0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747, -0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x93,0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747, -0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747,0x93,0x93,0x747,0x747,0x747,0x747,0x747,0x747, -0x93,0x93,0x747,0x747,0x747,0x93,0x93,0x93,0xb4c,0xb4c,0xb4c,0xb4c,0x96,0x96,0x96,0x96, -0x96,0x96,0x96,0x96,0x96,0x186f,0x186f,0x186f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, -0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0x99,0x99,0x99,0x99,0x99, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0x9f,0x9f,0xfe4,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x1b24,0x1b24,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xa2,0xb7f,0xb7f, -0xa2,0xa2,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xa2,0xb7c,0xa2,0xb7c,0xb7c,0xb7c, -0xb7c,0xcf3,0xb7c,0xb7c,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xa2,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xa2, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa2,0xb7f,0xa2,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xa2,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xddd,0xddd,0xa2,0xa2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb76, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xef4,0xef1,0xa2,0xa2,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xa5,0xb85,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xc0c,0xc0c,0xc0c,0xc0c, -0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0x1b2a,0xc0c,0xc0c,0xc0c,0xc0c,0xc06,0xc06, -0xc09,0x1b27,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x1b2a,0xc15,0xc15,0xc15,0xc15, -0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc15,0xc0f,0xc0f, -0xc12,0xc75,0xc75,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xc1b,0xc1b,0xc1b,0xc1b, -0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc18,0xc18, -0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc21,0xc21,0xc21,0xc21, -0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xb1,0xc21,0xc21,0xc21,0xb1,0xc1e,0xc1e, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd05,0xd05,0xd05,0xd05, +0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, +0x846,0x846,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x9b1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xca8,0xca8,0xca8,0xca8, +0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0xcae,0xcae,0xcae,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6, +0xcb1,0xcb1,0xca2,0xca2,0xca5,0xcb7,0xcb4,0,0,0x1704,0x168c,0x168c,0x106b,0x106b,0x106b,0x106b, +0xf93,0x106b,0x106b,0x106b,0xf93,0x106b,0x106b,0x106b,0x106b,0x1068,0,0,0xf90,0xf90,0xf90,0xf90, +0xf90,0xf90,0xf8d,0xf96,0xf90,0xf96,0xf90,0xf90,0xf90,0xf96,0xf96,0,0x110d,0x110d,0x110d,0x110d, +0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, +0x110d,0x110d,0x110d,0x110d,0x110d,0x116d,0x116d,0x116d,0,0,0x110a,0,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0,0,0,0,0,0x185a,0x185a,0x185a,0x185a, +0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x1854,0x185d,0x185d,0x185d, +0x185d,0x185d,0x1857,0x1a4f,0x1866,0x1866,0,0,0,0,0,0x1a04,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x1299,0x5eb,0x15f,0x15f,0,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b, +0x168,0,0,0x16b,0x16b,0,0,0x16b,0x16b,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af, +0x5af,0x5af,0x5af,0x5af,0x5af,0,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0,0x5af,0, +0,0,0x5af,0x5af,0x5af,0x5af,0,0,0x5ee,0xa41,0x5eb,0x15f,0x15f,0x5eb,0x5eb,0x5eb, +0x5eb,0,0,0x15f,0x15f,0,0,0x162,0x162,0x6d5,0xb40,0,0,0,0,0, +0,0,0,0x5e8,0,0,0,0,0x5ac,0x5ac,0,0x5ac,0x165,0x165,0x5e5,0x5e5, +0,0,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x5af,0x5af,0x15c,0x15c, +0x159,0x159,0x159,0x159,0x159,0x15c,0x159,0xedc,0x15d2,0x15cf,0x16fb,0,0,0xaf2,0x606,0xa6b, +0,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0,0,0,0x1fe,0x1fe,0,0,0x1fe, +0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fe, +0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fb,0,0x1fe,0x1fb,0,0x1fe,0x1fe,0,0, +0x609,0,0x1f2,0x1f2,0x1f2,0x606,0x606,0,0,0,0,0x606,0x606,0,0,0x606, +0x606,0x60f,0,0,0,0xe85,0,0,0,0,0,0,0,0x1fb,0x1fb,0x1fb, +0x1fe,0,0x1fb,0,0,0,0,0,0,0,0x321,0x321,0x321,0x321,0x321,0x321, +0x321,0x321,0x321,0x321,0x606,0x60c,0x1f8,0x1f8,0x1f5,0xe85,0x1674,0,0,0,0,0, +0,0,0,0,0,0x5fd,0x600,0x1e6,0,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, +0xa68,0x1ef,0,0x1ef,0x1ef,0x1ef,0,0x1ef,0x1ef,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, +0x5be,0x5be,0x5be,0x5be,0x5be,0,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0,0x5be,0x5be, +0,0x5be,0x5be,0x5be,0x5be,0x5be,0,0,0x603,0x1e9,0x1e6,0x1e6,0x1e6,0x600,0x600,0x600, +0x600,0x600,0,0x600,0x600,0x1e6,0,0x1e6,0x1e6,0x6db,0,0,0x1ec,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1e9,0xa65,0xaef,0xaef, +0,0,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x11a6,0xa62,0,0, +0,0,0,0,0,0x14e5,0x1629,0x162f,0x1629,0x162c,0x162c,0x162c,0,0x630,0x2a3,0x2a3, +0,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2ac,0,0,0x2af,0x2af,0,0,0x2af, +0x2af,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0,0x5c7,0x5c7,0,0xae0,0x5c7,0x5c7,0x5c7,0x5c7,0,0, +0x633,0x2a9,0x630,0x630,0x2a3,0x630,0x630,0x630,0xe97,0,0,0x2a3,0x2a6,0,0,0x2a6, +0x2a6,0x6e1,0,0,0,0,0,0,0,0x1821,0x630,0x62d,0,0,0,0, +0x5c4,0x5c4,0,0x5c7,0x2a9,0x2a9,0xe97,0xe97,0,0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a0,0x2a0,0x2a0,0x2a0,0x29d,0xae3,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0,0,0,0, +0,0,0,0,0,0,0x636,0x2b8,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0, +0,0,0x2b8,0x2b8,0x2b8,0,0x2b8,0x2b8,0x2bb,0x2b8,0,0,0,0x2b8,0x2b8,0, +0x2b8,0,0x2b8,0x2b8,0,0,0,0x2b8,0x2b8,0,0,0,0x2b8,0x2b8,0x2b8,0, +0,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0xb97,0x2b8,0x2b8,0x2b8,0,0, +0,0,0x63c,0x2b2,0x63c,0x2b2,0x2b2,0,0,0,0x2b2,0x2b2,0x2b2,0,0x2b5,0x2b5, +0x2b5,0x63f,0,0,0xdb3,0,0,0,0,0,0,0x639,0,0,0,0, +0,0,0,0,0,0,0xbe2,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, +0x327,0x327,0x327,0xabf,0xa86,0xa86,0xa86,0xa86,0xa86,0xa89,0xa86,0,0,0,0,0, +0x13fe,0x2c1,0x2c4,0x2c4,0x1701,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2ca,0,0x2cd,0x2cd, +0x2cd,0,0x2cd,0x2cd,0x2cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, +0x5cd,0,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5ca,0x5cd,0x5cd,0x13dd,0x5cd,0x5cd,0x5cd, +0x5cd,0x5cd,0,0,0x18e1,0xdb9,0x645,0x645,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0,0x645,0x645, +0x648,0,0x645,0x645,0x645,0x6e4,0,0,0,0,0,0,0,0x642,0x642,0, +0xe5e,0xe5e,0x14e8,0,0x1a61,0x1887,0,0,0x2c7,0x2c7,0xe9a,0xe9a,0,0,0x2be,0x2be, +0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0,0,0,0,0,0,0,0x174c, +0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0x1527,0x13f2,0x22e,0x22e,0x167a,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x231,0,0x234,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0x234, +0x234,0x231,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0,0,0xaf5,0xa6e,0x22e,0x61b, +0x61e,0x22e,0x61b,0x22e,0x22b,0,0x61b,0x61e,0x61e,0,0x61e,0x61e,0x61b,0x621,0,0, +0,0,0,0,0,0x618,0x618,0,0,0,0,0,0x1a52,0x186c,0x231,0, +0x231,0x231,0xce7,0xce7,0,0,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0,0xc6c,0xc6c,0x1908,0,0,0,0,0,0,0,0,0,0,0,0, +0x1632,0x13f5,0x28e,0x28e,0x17d9,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x297,0,0x29a,0x29a, +0x29a,0,0x29a,0x29a,0x29a,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x28e,0x62a,0x62a,0x62a,0xe88,0,0x28e,0x28e,0x28e,0,0x291,0x291,0x28b,0x6de,0x10dd,0x152d, +0,0,0,0,0x1530,0x1530,0x1530,0x62a,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x1485, +0x294,0x294,0xe88,0xe88,0,0,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288, +0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0x152d,0x152d,0x152d,0xd92,0xd98,0xd98,0xd98,0xd98,0xd98,0xd98, +0,0x1824,0x825,0x825,0,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x82e,0x831, +0x831,0x834,0x834,0x834,0x834,0x834,0x834,0,0,0,0x834,0x834,0x834,0x834,0x82b,0x834, +0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834, +0x834,0x834,0,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0,0x834,0,0, +0x834,0x834,0x834,0x834,0x834,0x834,0x834,0,0,0,0x8df,0,0,0,0,0x8dc, +0x825,0x825,0x8dc,0x8dc,0x8dc,0,0x8dc,0,0x825,0x825,0x828,0x825,0x828,0x828,0x828,0x8d9, +0,0,0,0,0,0,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, +0,0,0x825,0x822,0x81f,0,0,0,0,0,0,0,0,0,0,0, +0,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, +0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, +0x2dc,0x64b,0x2dc,0x2d9,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x654,0,0,0,0,0x2a, +0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2dc,0x2df,0x651,0x651,0x651,0x651,0x651,0x651,0x64b,0x64e,0x2d0, +0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d3,0x2d3,0,0,0,0, +0,0x243,0x243,0,0x243,0,0x1731,0x243,0x243,0x1731,0x243,0,0x1731,0x243,0x1731,0x1731, +0x1731,0x1731,0x1731,0x1731,0x243,0x243,0x243,0x243,0x1731,0x243,0x243,0x243,0x243,0x243,0x243,0x243, +0x1731,0x243,0x243,0x243,0,0x243,0,0x243,0x1731,0x1731,0x243,0x243,0x1731,0x243,0x243,0x23d, +0x243,0x624,0x243,0x23a,0x624,0x624,0x624,0x624,0x624,0x624,0x17a6,0x624,0x624,0x243,0,0, +0x249,0x249,0x249,0x249,0x249,0,0x246,0,0x627,0x627,0x627,0x627,0x627,0x624,0x194d,0, +0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0,0,0x240,0x240,0x11a9,0x11a9, +0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d, +0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71a,0x84f,0xdc5,0xdc5,0,0,0, +0,0x738,0x738,0x735,0x738,0x735,0x735,0x74a,0x735,0x74a,0x738,0x738,0x738,0x738,0x738,0x70e, +0x738,0x735,0x744,0x744,0x747,0x6f0,0x73b,0x73b,0x714,0x714,0x714,0x714,0x10e6,0x1158,0x1158,0x1158, +0x738,0x738,0x738,0x735,0x738,0x738,0x8f1,0x738,0,0x738,0x738,0x738,0x738,0x735,0x738,0x738, +0x738,0x738,0x735,0x738,0x738,0x738,0x738,0x735,0x738,0x738,0x738,0x738,0x735,0x738,0x8ee,0x8ee, +0x8ee,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x8f1,0x735,0x8f1,0x8f1,0x8f1,0,0x84c,0x84c, +0x849,0x849,0x849,0x849,0x849,0x849,0x8f4,0x849,0x849,0x849,0x849,0x849,0x849,0,0xdbc,0x849, +0xb9a,0xb9a,0xdbf,0xdc2,0xdbc,0xec7,0xec7,0xec7,0xec7,0x10e3,0x10e3,0,0,0,0,0, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0,0x11a3,0,0,0,0,0,0x11a3,0,0, +0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb67,0x798,0,0x798,0x798,0x798,0x798,0,0, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0,0x798,0,0x798,0x798,0x798,0x798,0,0, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798,0x798,0x798,0,0, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798,0x798,0x798,0,0,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0,0x798,0,0x798,0x798,0x798,0x798,0,0,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0xb67,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798, +0x798,0x798,0,0,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x795,0, +0,0x1155,0x1155,0xc1e,0xb61,0x78f,0x79b,0x78c,0x78c,0x78c,0x78c,0x79b,0x79b,0x792,0x792,0x792, +0x792,0x792,0x792,0x792,0x792,0x792,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789, +0x789,0,0,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, +0xb64,0xb64,0xb64,0xb64,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0,0, +0,0,0,0,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, +0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x1473,0,0,0x1470,0x1470,0x1470,0x1470, +0x1470,0x1470,0,0,0x816,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x813, +0x810,0,0,0,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x861, +0x861,0x861,0x81c,0x81c,0x81c,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0,0,0, +0,0,0,0,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, +0x9b4,0x188d,0x9b4,0x9b4,0x9b4,0x9b4,0xa05,0xa05,0xa08,0x18e4,0,0,0,0,0,0, +0,0,0,0x188d,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, +0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0xa0b,0xa0b,0xa0e,0x9c0,0x9c0,0,0,0,0,0, +0,0,0,0,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, +0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0xa11,0xa11,0,0,0,0,0,0,0,0, +0,0,0,0,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0,0x9bd,0x9bd,0x9bd,0,0xa14,0xa14,0,0,0,0,0,0,0,0, +0,0,0,0,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x8b5,0x7b9,0x7b9,0x8c1,0x8c1,0x8c1, +0x8c1,0x8c1,0x8bb,0x8bb,0x8c1,0x8be,0x903,0x8b8,0x7c2,0x7c2,0x7b3,0x7bf,0x7ad,0x7a7,0x7b0,0x7aa, +0x7bc,0xaf8,0,0,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0,0, +0,0,0,0,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0,0, +0,0,0,0,0x7e6,0x7e6,0x867,0x86a,0x7ec,0x864,0x7e9,0x7e6,0x7ef,0x7fe,0x7f2,0x8cd, +0x8cd,0x8cd,0x7e3,0x18de,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0,0, +0,0,0,0,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x1686,0,0,0, +0,0,0,0,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x8c7,0xd9b,0, +0,0,0,0,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, +0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0,0,0,0,0,0, +0,0,0,0,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0x12cf,0x12cf,0,0xafb,0xafb,0xafb,0xa95,0xa95,0xa95,0xa95,0xafb,0xafb,0xa95,0xa95,0xa95, +0,0,0,0,0xa95,0xa95,0xafb,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xafe,0xafe,0xafe, +0,0,0,0,0xa8f,0,0,0,0xa9b,0xa9b,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92, +0xa92,0xa92,0xa92,0xa92,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa, +0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0,0,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0,0,0, +0,0,0,0,0,0,0,0,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, +0xbc4,0xbc4,0xf18,0xf18,0,0,0,0,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc7,0xbc7,0xbc7, +0xbc4,0xbc4,0xbc7,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0,0, +0,0,0,0,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xf15,0, +0,0,0xbbe,0xbbe,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xc2d,0xc2d,0xba0,0xba0,0xc2d, +0,0,0xb9d,0xb9d,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0xf45,0x1050,0xf45,0x1050,0x1050,0x1050,0x1050, +0x1050,0x1050,0x1050,0,0x109e,0xf42,0x1050,0xf42,0xf42,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, +0x1050,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0x1050,0x1050,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056, +0x1056,0,0,0x1053,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0,0, +0,0,0,0,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0,0, +0,0,0,0,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf48,0xf4b,0xf4b,0xf4b,0xf4b, +0xf3c,0xf3c,0,0,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e0,0x181e,0x181e,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8, +0x18d2,0x18d2,0x18d2,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, +0x1a8b,0x1a8b,0,0,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xc96,0xc96,0xcea,0xced,0xcf9,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, +0x18cf,0,0x198c,0x198c,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc9f,0xc9f, +0xc8a,0xc8d,0xc9f,0xc9f,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x1161,0x10ef,0x115e,0x115e,0x10ef,0x10ef, +0x10ef,0x115e,0x10ef,0x115e,0x115e,0x115e,0x1164,0x1164,0,0,0,0,0,0,0,0, +0x10ec,0x10ec,0x10ec,0x10ec,0xdec,0xdec,0xdec,0xdec,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xde9,0xde9,0xeac,0xea9,0,0,0,0xdef, +0xdef,0xde3,0xde3,0xde3,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0,0, +0,0xdec,0xdec,0xdec,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe16,0xe16, +0xe16,0xe16,0xe16,0xe16,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1980,0x197d,0, +0,0,0,0,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0, +0,0x1671,0x1671,0x1671,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0,0,0,0, +0,0,0,0,0x107d,0x107a,0x107d,0xfc9,0x107a,0x1080,0x1083,0x1086,0x1089,0x108c,0x108f,0x107a, +0x108c,0x108c,0x107a,0x107a,0x108c,0xfcc,0x1092,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0xfcf,0xfd2,0xfd5, +0xfc6,0x1095,0xfc6,0xfc6,0xfc6,0xfc6,0xfd8,0x120f,0x124e,0x120c,0x120c,0x1608,0x1452,0x1452,0x178b,0, +0,0,0,0,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0,0,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0x1c5,0,0x1c5, +0,0x1c5,0,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce, +0x1bf,0x1ce,0,0,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1dd,0x1dd,0x1dd,0x1dd, +0x1dd,0x1dd,0x1dd,0x1dd,0x1cb,0x1cb,0x1da,0x1da,0x1da,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, +0x1c5,0x1b6,0x1ce,0x1b6,0x1b6,0x1b3,0x1bf,0x1bf,0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4, +0x1c5,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce,0,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, +0,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, +0x1dd,0x1b3,0x1b3,0x1b3,0,0,0x1bf,0x1bf,0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4, +0x1c5,0x1b9,0x1b6,0,0x94e,0x951,0x951,0x951,0xcfc,9,0x125d,0x125d,0x125d,0x125d,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x3f,0x9ae,0,0,0x345,0x3f,0x3f,0x3f,0x3f,0x3f,0x57,0x69, +0x57,0x63,0x5d,0x3cc,0x3c,0x342,0x342,0x342,0x342,0x3c,0x3c,0x3c,0x3c,0x3c,0x54,0x66, +0x54,0x60,0x5a,0,0xb91,0xb91,0xb91,0xb91,0xb91,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0,0,0,0x5d0,0x5d3,0x8af,0x8af,0x9fc,0xa02,0xa02,0x9ff,0x9ff,0x9ff,0x9ff,0xc18, +0xcde,0xcde,0xcde,0xcde,0xebe,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x261,0x261,0x261,0x7ce,0xc6f,0xd6e,0xd6e,0xd6e,0xd6e,0xff9,0x1461,0x1461, +0,0,0,0,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0xd2,0xd2, +0xcf,0xcf,0xcf,0xcf,0xb4f,0xb4c,0xb4f,0xb4c,0xb4c,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xee2, +0xedf,0xee2,0xedf,0x103b,0x103e,0x103e,0x119a,0x1197,0,0,0,0,0,0xb55,0xb52,0xb52, +0xb46,0xb43,0xb49,0xb46,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0,0x119d,0,0,0,0, +0,0x119d,0,0,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, +0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0x11b8,0x11b8,0,0,0,0,0,0,0,0xbcd, +0x10e9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x115b, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0,0,0,0,0,0,0,0, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0, +0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, +0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0,0x879,0x879,0x879,0x879,0x87c, +0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, +0x879,0x879,0x879,0x87c,0,0,0,0,0,0,0,0,0,0,0,0, +0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c, +0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x891,0x891,0x894,0x894,0x891,0x891,0x891,0x891, +0x891,0x891,0x891,0x891,0x196b,0x196b,0x1968,0x1968,0,0x53a,0x534,0x53a,0x534,0x53a,0x534,0x53a, +0x534,0x53a,0x534,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534, +0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x534,0x534,0x534,0x53a,0x534,0x53a,0x534,0x53a, +0x534,0x534,0x534,0x534,0x534,0x534,0x53a,0x534,0x534,0x534,0x534,0x534,0x537,0x9e4,0x9e4,0, +0,0x6cf,0x6cf,0x582,0x582,0x53d,0x540,0x9e1,0,0,0,0,0,0x50d,0x50d,0x50d, +0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d, +0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0xe4f,0x1611,0x16e9,0,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0, +0x58e,0x58e,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0xe55,0xe55,0xe55,0xe55,0x19f8,0x19f8,0,0,0,0,0,0,0,0,0,0x196b, +0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522, +0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0xada,0xada,0, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0,0,0, +0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888, +0x888,0x9ed,0x888,0x888,0x888,0x9ed,0x888,0,0,0,0,0,0,0,0,0, +0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, +0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdfb,0xdfb,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, +0x1077,0x1077,0xfab,0xfb4,0xfae,0xfae,0xfae,0xfb4,0,0,0,0,0,0,0,0, +0x1872,0x186f,0x1740,0x173d,0x1734,0x173a,0x173a,0x17d0,0x17cd,0x17d0,0x17cd,0x1986,0x1986,0x1983,0x1a5b,0x1a58, +0x1872,0x186f,0x1a55,0x186f,0x1a55,0x186f,0x1872,0x186f,0x1872,0x186f,0x1986,0x1983,0x1986,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x1a5e,0x187b,0x187b,0x187b,0x17d0,0x17cd,0x12b1,0x11b5,0x11b5,0x10d4,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, +0xbbb,0xbbb,0xbbb,0xbb8,0xbb8,0xc36,0xc36,0xbb8,0xbb5,0xbb5,0xbb5,0xbb5,0x1827,0,0,0, +0xfde,0xfde,0xfde,0xfe1,0xfe1,0xfe1,0xfe4,0xfe4,0xfe7,0xfe4,0,0,0,0,0,0, +0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, +0xcbd,0xcbd,0xcbd,0xcbd,0xcba,0xcba,0xcc0,0xcc0,0,0,0,0,0,0,0,0, +0xe2e,0xe2e,0xe2e,0xe2e,0xeb5,0x159f,0,0,0,0,0,0,0,0,0xe34,0xe34, +0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0,0,0,0,0,0, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xe25,0xeb2,0,0,0,0,0,0,0,0,0,0,0,0xe22, +0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020, +0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0,0,0, +0x109b,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf27,0xf33,0xf33,0xf24,0xf24,0xf24,0xf24,0,0xfea, +0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0,0,0,0,0xf24,0xf24, +0x13d7,0x13d7,0x13d7,0x13d7,0x13d7,0x13f8,0x12c0,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, +0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x13da,0x13da,0x13da,0x13da,0x13da,0, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xdce, +0xdce,0xe9d,0xe9d,0xdce,0xdce,0xe9d,0xe9d,0,0,0,0,0,0,0,0,0, +0xdd1,0xdd1,0xdd1,0xe9d,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xe9d,0xdce,0,0, +0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0,0,0xdc8,0xdd7,0xdd7,0xdd7, +0xfa2,0x1074,0xfa2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf9f,0xf9f,0xfa5,0xf99,0xf9c, +0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x11cd,0x1233,0x1233,0x11cd,0x11cd, +0x11d6,0x11d6,0x11d0,0x11d3,0x11d3,0x11cd,0x1254,0,0,0,0,0,0,0,0,0, +0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0, +0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0,0,0,0,0,0,0,0, +0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0, +0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae, +0x147c,0x147c,0x147c,0x147c,0x12ae,0x12a8,0x173d,0x173d,0x17d3,0x17d6,0x17be,0x17be,0,0,0,0, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0xf57,0xf57,0xf57,0xf51,0xf51,0x1059,0xf51,0xf51,0x1059,0xf51,0xf51,0xf5a,0xf54,0x105c,0,0, +0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0,0,0,0,0,0, +0x72c,0x72c,0x72c,0x72c,0,0,0,0,0,0,0,0,0,0,0,0, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0,0,0,0,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, +0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, +0xef4,0xef4,0xef4,0xef4,0,0,0,0,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0, +0,0,0,0,0,0,0,0,0,0,0,0x14d,0x14d,0x14d,0x14d,0x14d, +0,0,0,0,0,0x7a4,0x615,0x21f,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, +0x225,0x219,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0, +0x21f,0x21f,0x21f,0x21f,0x21f,0,0x21f,0,0x21f,0x21f,0,0x21f,0x21f,0,0x21f,0x21f, +0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x222,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a, +0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xbe8,0xbe8,0xbf7,0xbf1,0xbee,0xbfa,0xbfa,0xbf4, +0xbe5,0xbeb,0,0,0,0,0,0,0x4bc,0x4e0,0x4dd,0x4e0,0x4dd,0x9f0,0x9f0,0xad1, +0xacb,0x4bf,0x4bf,0x4bf,0x4bf,0x4f5,0x4f5,0x4f5,0x4e3,0x4e6,0x4fb,0,0x4ec,0x4e9,0x4fe,0x4fe, +0x4d7,0x4cb,0x4b9,0x4cb,0x4b9,0x4cb,0x4b9,0x4c2,0x4c2,0x4ef,0x4ef,0x4f2,0x4ef,0x4ef,0x4ef,0, +0x4ef,0x4d4,0x4d1,0x4c2,0,0,0,0,0x11d,0x135,0x11d,0x990,0x11d,0,0x11d,0x135, +0x11d,0x135,0x11d,0x135,0x11d,0x135,0x11d,0x135,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, +0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132, +0x12c,0x132,0x12c,0x132,0x12c,0,0,0x1b,0,0x453,0x432,0x420,0x429,0x426,0x420,0x435, +0x423,0x41d,0x420,0x441,0x438,0x42f,0x450,0x420,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d, +0x44d,0x44d,0x43b,0x43e,0x441,0x441,0x441,0x453,0x402,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0,0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, +0,0,0x3ff,0x3ff,0x3ff,0,0,0,0x426,0x429,0x441,0x444,0x420,0x429,0x429,0, +0x3f9,0x3fc,0x3fc,0x3fc,0x3fc,0x3f9,0x3f9,0,9,9,9,9,9,9,9,9, +9,0x753,0x753,0x753,0x74d,0x336,0x2e5,0x2e5,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0, +0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0, +0,0,0,0,0xab6,0xab6,0xabc,0,0,0,0,0xab3,0xab3,0xab3,0xab3,0xab3, +0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, +0xab3,0xab3,0xab3,0xab3,0,0,0,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0x12a5,0x12a5,0x1524,0x1524,0, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0x17bb,0,0,0, +0x12a5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05, -0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0x14f1,0x14f1,0xb4,0xcf6,0xcf6,0xcf6,0xd02, -0xd02,0xd02,0xd02,0xcf6,0xcf6,0xd02,0xd02,0xd02,0xb4,0xb4,0xb4,0xb4,0xd02,0xd02,0xcf6,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xcf9,0xcf9,0xcf9,0xb4,0xb4,0xb4,0xb4,0xcfc,0xb4,0xb4,0xb4, -0xd08,0xd08,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xb7,0xb7, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0xba,0xba,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0xba,0x1a76, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xbd, -0xd2f,0xd2f,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xbd,0xbd,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd, -0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd, -0xbd,0xbd,0xbd,0xbd,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xc0, -0xc0,0xc0,0xc0,0xc0,0xd71,0xd71,0xd77,0xc3,0xc3,0xc3,0xc3,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, -0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, -0xd6e,0xd6e,0xd6e,0xd6e,0xc3,0xc3,0xc3,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc6,0xd35, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc9,0xc9, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xcc,0xcc,0xd44,0xcc,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xcc,0xd44,0xd44,0xcc,0xcc,0xcc,0xd44,0xcc,0xcc,0xd44,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0x14f7,0x14f7,0x17a9,0x17a9,0xd5,0x10e6,0x10e6,0x10e6,0x10e6, -0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x1a85,0x126,0x126,0x126,0xe0a,0xe0a,0xe0a,0xe0a, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xe64,0,0, 0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, -0xe0a,0xe0a,0xe0a,0xe01,0xe01,0xe07,0xe07,0xe01,0xd8,0xd8,0xe04,0xe04,0x1113,0x1113,0x1113,0x1113, -0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x1c56,0xc72,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xe1c,0xe19,0xe1c,0xe19, -0xe19,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0x1161,0x115e,0x1161,0x115e,0x115b,0x115b,0x115b,0x13ef,0x13ec, -0xde,0xde,0xde,0xde,0xde,0xe16,0xe13,0xe13,0xe13,0xe10,0xe16,0xe13,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe7,0x13f2,0xe7,0xe7,0xe7,0xe7,0xe7,0x13f2,0xe7,0xe7,0xe7f,0xe7f,0xe7f,0xe7f, -0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe40,0xe34,0xe34,0xe34, -0xea,0xe34,0xe34,0xea,0xea,0xea,0xea,0xea,0xe34,0xe34,0xe34,0xe34,0xe40,0xe40,0xe40,0xe40, -0xea,0xe40,0xe40,0xe40,0xea,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, -0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0x1914,0x1914,0xea,0xea, -0xe31,0xe31,0xe31,0xea,0xea,0xea,0xea,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, -0x1911,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe43,0xe43, -0xe3a,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0x1167,0x1167,0xed,0xed,0xed,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe52,0xe52,0xe52, -0xe4f,0xe4f,0xe52,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xed, -0xed,0xed,0xed,0xed,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x1164,0xed, -0xed,0xed,0xe49,0xe49,0xe58,0xe58,0xe58,0xe58,0xf0,0xf0,0xf0,0xf0,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe55,0xe58,0xe58,0xe58,0xe58,0xe58,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0x1506,0x150c,0x1509,0x1854,0x17af,0x1878,0x1878,0x1878,0x1878,0x1878,0x191a,0x1917, -0x191d,0x1917,0x191d,0x19dd,0x1a79,0x1a79,0x1a79,0x1b3c,0x1b3c,0x1b36,0x1b33,0x1b36,0x1b33,0x1b36,0x1b33,0x1b36, -0x1b33,0x1b39,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xe7c,0xe7c,0xe7c,0xe79,0xe79,0xe70,0xe70,0xe79,0xe76,0xe76,0xe76,0xe76, -0x1a7c,0xf6,0xf6,0xf6,0x12cc,0x12cc,0x12cc,0x12cf,0x12cf,0x12cf,0x12d2,0x12d2,0x12d5,0x12d2,0x14a,0x14a, -0x14a,0x14a,0x14a,0x14a,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0x13fe,0x13fe,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf9,0xf9,0xe82,0x133b,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xf9,0xf9,0xf9,0x1338,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xeaf,0xea0,0xe9a,0xeac,0xea9,0xea3,0xea3,0xeb2,0xe9d,0xea6,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xf36,0xf36,0xf21,0xf36,0xf39,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c, -0x1b3f,0x102,0x102,0x102,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf42,0xf42, -0xf2a,0xf2d,0xf42,0xf42,0xf27,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf24, -0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a, -0xf2a,0x1b42,0x1b42,0x102,0x1b4b,0x1b45,0x19e3,0x19e0,0x19e3,0x19e3,0x19e3,0x1a82,0x1a7f,0x1a82,0x1a7f,0x105, -0x105,0x105,0x105,0x105,0x1b4b,0x1b45,0x105,0x1b45,0x105,0x1b45,0x1b4b,0x1b45,0x1b4b,0x1b45,0x105,0x105, -0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x1b48,0x1b48,0x1b48,0x1a82,0x1a7f,0x1515,0x1407,0x1407,0x133e,0x103e,0x103e,0x103e,0x103e,0x103e, -0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf4e,0xf4e,0xf54,0xf54,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, -0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d, -0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf57,0xf57,0xf57,0xf57,0x1170,0x1170,0x10b,0x10b,0x10b,0xf5a, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x1701,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, -0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e, -0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xf66,0xf66,0xf66,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x111,0xf63,0xf63,0xf63,0xf63, -0x151e,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0xf69,0xf69,0xf69,0xf69, -0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0x192c,0x192c, -0x192c,0x192c,0x192c,0x192c,0x192c,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1065,0x1065,0x1065,0x1065, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053,0x1053, -0x1062,0x1062,0x1059,0x1056,0x117,0x117,0x117,0x1068,0x1068,0x105c,0x105c,0x105c,0x105f,0x105f,0x105f,0x105f, -0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x117,0x117,0x117,0x1065,0x1065,0x1065,0x106b,0x106b,0x106b,0x106b, -0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1083,0x1083,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x10aa,0x10aa,0x10aa,0x10aa, -0x10a4,0x17b5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x10b0,0x10b0,0x10a7,0x10a7,0x10a7,0x10a7, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c8,0x10cb, -0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x10c5,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10da,0x10da,0x10d1,0x10d1,0x10da, -0x10da,0x10d1,0x10d1,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x10dd,0x10dd,0x10dd,0x10d1, -0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10d1,0x10da,0x123,0x123,0x10d7,0x10d7,0x10d7,0x10d7, -0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x123,0x123,0x10d4,0x10e3,0x10e3,0x10e3,0x152d,0x126,0x126,0x126, -0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, -0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x10e9,0x10e9,0x10e9,0x10e9, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10ec,0x129,0x129,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x12c,0x12c,0x12c,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x12f,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x132,0x132,0x132,0x132,0x132,0x10f5,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x135,0x135,0x135,0x135,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x1176,0x1176,0x1176,0x1176, -0x117f,0x1176,0x1176,0x1176,0x117f,0x1176,0x1176,0x1176,0x1176,0x1173,0x13b,0x13b,0x117c,0x117c,0x117c,0x117c, -0x117c,0x117c,0x117c,0x1182,0x117c,0x1182,0x117c,0x117c,0x117c,0x1182,0x1182,0x13b,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x119d,0x1188,0x119d,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x141,0x1191,0x119a,0x1188,0x119a, -0x119a,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x1188, -0x1188,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x141,0x141,0x118b,0x1197,0x1197,0x1197,0x1197, -0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x141,0x141,0x141,0x141,0x141,0x141,0x1197,0x1197,0x1197,0x1197, -0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x141,0x141,0x141,0x141,0x141,0x141,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x11a3,0x11a6,0x11a6,0x11a6,0x11a6,0x1194,0x1194,0x141,0x141,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x1569,0x1a97,0x12e7,0x12c0,0x12de,0x12de, -0x12de,0x12de,0x12de,0x12de,0x12de,0x12c6,0x12c3,0x12ba,0x12ba,0x12e4,0x12ba,0x12ba,0x12ba,0x12ba,0x12c9,0x14a6, -0x14ac,0x14a9,0x14a9,0x18f3,0x16c8,0x16c8,0x1a64,0x144,0x144,0x144,0x144,0x144,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11b2,0x11b2,0x11b5,0x11be, -0x11b8,0x11b8,0x11b8,0x11be,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x12ab,0x12ab,0x12ab,0x12ab, -0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab, -0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x14d,0x14d,0x14d,0x11dc,0x11d0,0x11d0,0x11d0, -0x11d0,0x11d0,0x11d0,0x11d3,0x11e2,0x11e2,0x11d0,0x11d0,0x11d0,0x11d0,0x150,0x12db,0x11d6,0x11d6,0x11d6,0x11d6, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x150,0x150,0x150,0x150,0x11d0,0x11d0,0x1200,0x11f4,0x1200,0x153, -0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, -0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x11fd,0x11fd,0x1203,0x11f7,0x11fa,0x1218,0x1218,0x1218,0x1212, -0x1212,0x1209,0x1212,0x1212,0x1209,0x1212,0x1212,0x121b,0x1215,0x120c,0x156,0x156,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x156,0x156,0x156,0x156,0x156,0x156,0x1221,0x1221,0x1221,0x1221, -0x1221,0x1221,0x1221,0x159,0x159,0x159,0x159,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, -0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, -0x121e,0x121e,0x121e,0x121e,0x159,0x159,0x159,0x159,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x15c,0x1227, -0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x15f,0x15f, -0x15f,0x1233,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x162,0x162, -0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, -0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x165,0x165,0x165,0x165,0x165, -0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b, -0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b, -0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x16b,0x1263,0x1263,0x1b4e,0x16e,0x16e,0x16e,0x16e,0x16e, -0x16e,0x16e,0x16e,0x16e,0x16e,0x1935,0x16e,0x16e,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836, -0x1836,0x1836,0x1836,0x1836,0x1836,0x1a88,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x12b4,0x13b0,0x13b0,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x1839, -0x174,0x174,0x174,0x174,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x13d4,0x13d4,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174, -0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x174,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x134d,0x134d,0x134d,0x177,0x177,0x1350,0x177,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1356,0x135f,0x1359,0x1359,0x135f,0x135f,0x135f,0x1359,0x135f,0x1359,0x1359,0x1359,0x1362,0x1362, -0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x135c,0x135c,0x135c,0x135c,0x17d,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x17d,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x17d,0x17d,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x1368,0x1368,0x1368,0x1368, -0x1368,0x1368,0x1368,0x17d,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x17d,0x15cf,0x15cf,0x15cf,0x15cf, -0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136e,0x1383,0x1383,0x1374,0x1374,0x1374,0x1374,0x1374,0x180,0x180,0x180,0x180,0x1371,0x1371, -0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1377,0x1377, -0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1b54,0x1b57,0x1b57,0x1b51,0x1b51,0x1b57,0x180,0x180, -0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x153c,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x186,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x153f,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x13b9,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f, -0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x186,0x186, -0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x154b,0x154b, -0x154b,0x154b,0x154b,0x154b,0x16bf,0x154b,0x154b,0x154b,0x1791,0x1842,0x1842,0x187b,0x187b,0x1a46,0x1af1,0x1af1, -0x189,0x189,0x189,0x189,0x1c3e,0x1bc0,0x1bc0,0x1bc0,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, -0x154b,0x154b,0x154b,0x16bc,0x16bc,0x189,0x189,0x189,0x154b,0x154b,0x154b,0x154b,0x1842,0x1842,0x1842,0x18de, -0x18de,0x19c2,0x1a46,0x1af1,0x1af1,0x189,0x189,0x189,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1be4,0x1be4,0x1be4,0x18c, -0x18c,0x18c,0x18c,0x1be4,0x1be4,0x1be4,0x1be4,0x1be4,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1428,0x18f,0x18f,0x18f,0x18f,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x18f,0x1428,0x18f,0x18f,0x1428, -0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428, -0x18f,0x1428,0x1428,0x1428,0x1428,0x18f,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x1428,0x1428,0x1428,0x18f,0x1428,0x1428,0x1428, -0x1428,0x1428,0x18f,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, -0x1428,0x1428,0x1428,0x1428,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, -0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, -0x18f,0x18f,0x18f,0x18f,0x1425,0x1425,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f, -0x18f,0x18f,0x18f,0x18f,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x142b,0x142b,0x142b,0x142b,0x142b, -0x143a,0x142b,0x142e,0x142e,0x142b,0x142b,0x142b,0x1431,0x1431,0x192,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1434,0x1440,0x1440,0x1440,0x1941,0x193e,0x193e,0x1a8e,0x192,0x192,0x192,0x192, -0x192,0x192,0x192,0x192,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15e1,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x1449, -0x1443,0x1443,0x1449,0x1449,0x1452,0x1452,0x144c,0x144f,0x144f,0x1449,0x1446,0x195,0x195,0x195,0x195,0x195, -0x195,0x195,0x195,0x195,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x198,0x198,0x198,0x198, -0x1716,0x1716,0x1455,0x1455,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x198,0x198,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1461,0x1461,0x1461,0x1461,0x1461,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19b, -0x19b,0x19b,0x19b,0x19e9,0x1461,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19b,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x145b,0x145b,0x145b,0x145b,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, -0x1464,0x1464,0x1464,0x1464,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x12e1,0x12de,0x12e1,0x12bd,0x12de,0x12e4,0x12e4,0x12e7,0x12e4,0x12e7,0x12ea,0x12de, -0x12e7,0x12e7,0x12de,0x12de,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x148b, -0x1494,0x148b,0x1494,0x1494,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x1497,0x148e,0x19f2,0x1b63,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x155d,0x155d,0x1a7,0x1a7,0x155a,0x155a,0x155a,0x155a,0x155a,0x1560,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1566,0x1566,0x1566,0x1566,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1563,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x2af, -0x1bae,0x1bae,0x1bae,0x1bae,0x16cb,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x1ad,0x1ad,0x1ad,0x1ad,0x1a97,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69,0x1b69, -0x1b66,0x1b66,0x1b66,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0,0,0, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1455,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, +0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0,0,0,0, +0x930,0x930,0x930,0x930,0,0,0,0,0,0,0,0,0,0x15d5,0x15d5,0x15d5, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0,0,0,0,0,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7, +0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x1407,0x1407, +0x1407,0x1407,0x1407,0,0,0,0,0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0,0xaad,0xbd3,0xbd3,0xbd3,0xbd3,0,0,0,0, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd0,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0,0, +0,0,0,0,0,0,0,0,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4, +0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4, +0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0,0,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1, +0xaa1,0xaa1,0,0,0,0,0,0,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0,0,0,0, +0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, +0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0,0,0,0, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0,0,0,0,0,0,0,0, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0,0,0,0,0,0,0,0,0,0,0,0x1386,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0, +0x18ba,0x18ba,0,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7, +0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7, +0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7,0x18b7,0,0,0,0x19da,0x19da,0x19da,0x19da, +0x19dd,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0,0,0,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x187e,0x1884,0x1884,0x1881, +0x1881,0x1881,0,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0,0,0,0,0xa8c,0xa8c,0xa8c,0xa8c, +0xa8c,0xa8c,0,0,0xa8c,0,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c, +0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0,0xa8c, +0xa8c,0,0,0,0xa8c,0,0,0xa8c,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, +0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0,0xf60, +0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338, +0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338, +0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0,0,0,0,0,0,0,0,0x1335, +0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd, +0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0,0x14cd,0x14cd,0,0, +0,0,0,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9, +0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc3,0xcc3, +0xcc3,0xcc3,0xf39,0xf39,0,0,0,0xcc6,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0,0,0,0,0,0xe0d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d, +0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d, +0x1a6d,0x1a6d,0,0,0,0,0,0,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, +0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, +0,0,0,0,0x14a0,0x14a0,0x11e5,0x11e5,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0,0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0xc12,0xc30,0xc30,0xc30,0,0xc30,0xc30,0, +0,0,0,0,0xc30,0xc30,0xc30,0xc30,0xc12,0xc12,0xc12,0xc12,0,0xc12,0xc12,0xc12, +0,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0x16f2,0x16f2,0,0,0xc33,0xc33,0xc33,0, +0,0,0,0xc48,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x1689,0,0,0, +0,0,0,0,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbb2,0xbb2,0xbac,0,0,0, +0,0,0,0,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x140a,0x140a,0,0,0,0,0x12f0, +0x12f0,0x12f0,0x12f0,0x12f0,0x12f6,0x12f6,0x13c8,0x12f6,0x12f6,0x12f6,0x12f3,0,0,0,0,0, +0,0,0,0,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, +0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0,0,0,0xf66,0xf69,0xf69, +0xf69,0xf69,0xf69,0xf69,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0,0,0xf87,0xf87,0xf87,0xf87, +0xf87,0xf87,0xf87,0xf87,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84, +0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0,0,0,0,0,0xf81,0xf81,0xf81,0xf81, +0xf81,0xf81,0xf81,0xf81,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302, +0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0,0,0,0,0,0,0,0x12ff,0x12ff,0x12ff, +0x12ff,0,0,0,0,0,0,0,0,0,0,0,0,0x12fc,0x12fc,0x12fc, +0x12fc,0x12fc,0x12fc,0x12fc,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0,0,0,0,0,0,0,0x1488,0x1488, +0x1488,0x1488,0x1488,0x1488,0x16cb,0x16cb,0x16ce,0x16ce,0x171c,0x171c,0x171c,0x171c,0,0,0,0, +0,0,0,0,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0,0, +0,0,0,0,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0,0,0,0x1a0d,0x1a10,0x1a0a, +0x1a0a,0x1a0a,0x1992,0x19a4,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, +0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0,0,0,0,0,0,0,0,0x1995,0x1995, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9, +0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0,0x1836,0x1836,0x1800,0,0, +0x1803,0x1803,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x197a,0x197a,0x197a,0x1a49,0x1a49,0x1a4c,0,0,0,0,0,0,0,0, +0x1a43,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x1a94,0x1a91,0x1a04,0x1947,0x1947,0x1947,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16dd,0,0,0,0,0,0,0,0,0x16d4,0x16d4,0x16d4,0x16d4, +0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x171f,0x171f, +0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x16d1,0x16d1,0x16d1,0x16d1,0x16d7,0x16d7,0x16d7, +0x16d7,0x16d7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, +0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18f0,0x18f0,0x18f0,0x18f0,0x18ab,0x18ab,0x18ab,0x18ab,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb, +0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0,0,0,0,0,0,0,0,0, +0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x116a,0x1107,0x1107,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0,0, +0,0,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5, +0x10f5,0x10f5,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x18ea,0x1899,0x1899,0x18e7, +0x18e7,0x1899,0,0,0,0,0,0,0,0,0,0x1401,0xf7b,0xf7b,0x18ed,0, +0,0,0,0,0,0,0,0,0,0x1692,0,0,0x1200,0x1200,0x1200,0x1200, +0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0,0,0, +0,0,0,0,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0,0, +0,0,0,0,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1236,0x1236,0x1236,0x1236,0x1236, +0x11df,0x1236,0x1239,0x1239,0x1236,0x1236,0x1236,0x1257,0x123c,0,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc, +0x11dc,0x11dc,0x11dc,0x11dc,0x11d9,0x11e2,0x11e2,0x11e2,0x16f5,0x168f,0x168f,0x1818,0,0,0,0, +0,0,0,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392, +0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1440,0x138c,0x138f,0x1392,0,0,0,0,0, +0,0,0,0,0,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9, +0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0,0,0,0,0,0,0, +0,0,0,0,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x191d,0x1956,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0,0x14d0,0,0x14d0,0x14d0, +0x14d0,0x14d0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d3,0,0, +0,0,0,0,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, +0x1347,0x1347,0x1347,0x1347,0x1344,0x1344,0x1344,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1425,0x1428,0, +0,0,0,0,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0,0, +0,0,0,0,0x14fa,0x1458,0x1317,0x13cb,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320, +0x1320,0,0,0x1320,0x1320,0,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320, +0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1320,0x1320, +0,0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1722,0x145b,0x131d,0x1416,0x1317,0x1416,0x1317,0x1317,0x1317, +0x1317,0,0,0x1317,0x1317,0,0,0x131a,0x131a,0x141c,0,0,0x149d,0,0,0, +0,0,0,0x1416,0,0,0,0,0,0x1326,0x1323,0x1323,0x1320,0x1320,0x1317,0x1317, +0,0,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0,0,0,0x1419,0x1419,0x1419,0x1419, +0x1419,0,0,0,0,0,0,0,0,0,0,0,0x19fe,0x19fe,0x19fe,0x1a01, +0x19fe,0x1a01,0x19fe,0x19fe,0x19fe,0x19fe,0,0x19fe,0,0,0x1a01,0,0x19fe,0x1a01,0x19fb,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0,0x19e6,0x1a22,0x19e3,0x19e3,0x1a22,0x1a22,0x1a22,0x1a22,0x1a22, +0x1a22,0,0x1a22,0,0,0x1a25,0,0x1a25,0x1a25,0x1a22,0x19e3,0,0x19e3,0x19e3,0x1a2e,0x1a2e, +0x1a31,0x19e9,0x1a2b,0x19ec,0x19ef,0x19ef,0,0x19e0,0x19e0,0,0,0,0,0,0,0, +0,0x1a28,0x1a28,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x156f,0x156f,0x15bd,0x15b7,0x15b7,0x156f,0x15ba,0x1572,0x1572,0x1572,0x1572,0x1575,0x1575,0x1569,0x1566,0x1563, +0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x17e2,0x1569,0,0x1563,0x1707,0x1764, +0x17e5,0x17e5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1437,0x137d,0x143d,0x143a,0x1383,0x1383,0x1377,0x1383,0,0,0,0,0,0,0,0, +0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0,0,0,0,0,0, +0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x1449, +0x13b0,0x13b0,0x1449,0x1449,0x1449,0x1449,0,0,0x13b0,0x13b0,0x13b3,0x13b3,0x1449,0x1449,0x13b0,0x144f, +0x144c,0x13a7,0x13b9,0x13b9,0x13aa,0x13aa,0x13ad,0x13ad,0x13ad,0x13b9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9, +0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d6,0x14d6,0x14d6,0x14d6,0x1509,0x1509,0,0, +0x1443,0x13a1,0x13a1,0x1395,0x139e,0,0,0,0,0,0,0,0,0,0,0, +0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0,0,0,0,0,0, +0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1245,0x1206,0x1245,0x1206,0x1206, +0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124b,0x1248,0x175e,0x189c,0,0,0,0,0,0, +0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0,0,0,0,0,0, +0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14c4,0x14c4,0x14c4,0x14c4, +0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4, +0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x1695,0,0,0x1503,0x14c1,0x1503,0x14be,0x14be,0x1503,0x1503, +0x1503,0x1503,0x14c1,0x1503,0x1503,0x1503,0x1503,0x1506,0,0,0,0,0x14bb,0x14bb,0x14bb,0x14bb, +0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14b8,0x14b8,0x14c7,0x14c7,0x14c7,0x14b8,0x189f,0x189f,0x189f,0x189f, +0x189f,0x189f,0x189f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x169e,0x169e,0x169e,0x170a,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x169e,0x1710,0x170d,0x169b,0,0,0,0,0x134d,0x134d,0x134d,0x134d, +0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0, +0,0,0,0,0,0,0,0,0,0,0,0x1353,0x181b,0x181b,0x181b,0x181b, +0x181b,0x181b,0x181b,0,0,0x181b,0,0,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, +0,0x181b,0x181b,0,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, +0x181b,0x181b,0x181b,0x181b,0x182d,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0,0x17f4,0x17f7,0,0,0x182d, +0x182d,0x1833,0x183f,0x17fa,0x17f4,0x17fa,0x17f4,0x1830,0x17fd,0x17ee,0x17fd,0,0,0,0,0, +0,0,0,0,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0,0, +0,0,0,0,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0,0,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177c,0x177c,0x177c,0x17af,0x17af,0x17af,0x17af,0,0,0x17af,0x17af, +0x177c,0x177c,0x177c,0x177c,0x17b2,0x177f,0x1779,0x177f,0x177c,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x15f6,0x15f9,0x1605,0x1605,0x15f9,0x15fc,0x15f6,0x1656,0,0,0,0, +0,0,0,0,0x1620,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x15ed,0x15ed,0x1641,0x1641,0x1641, +0x1620,0x1620,0x1620,0x1620,0x15e7,0x15ea,0x15ea,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x188a,0x188a,0x188a,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0,0,0, +0,0,0,0,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1a97,0x1a64,0x1a97,0x1a97,0x1a97,0x1a64,0x1a97,0x1a64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x19d7,0x19d1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0,0, +0,0,0,0,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0,0x1551,0x1551, +0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, +0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x154e,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0, +0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x154e,0x15b1,0x1551,0x1554,0x1554,0x1548,0x1545,0x1545,0,0, +0,0,0,0,0,0,0,0,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, +0x154b,0x154b,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542, +0x1542,0,0,0,0x1557,0x155a,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560, +0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0,0,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0,0x155d,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x155d,0x15b4,0x15b4,0x155d,0x15b4,0x15b4,0,0,0,0,0,0,0,0,0, +0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0,0x15de,0x15de,0,0x15de,0x15de,0x15de,0x15de,0x15de, +0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, +0x15de,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0,0,0,0x1638,0,0x1638,0x1638,0,0x1638, +0x1638,0x1638,0x163b,0x1638,0x163e,0x163e,0x15e1,0x1638,0,0,0,0,0,0,0,0, +0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0,0,0,0,0,0, +0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0,0x16aa,0x16aa,0,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, +0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, +0x16aa,0x16aa,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0,0x1713,0x1713,0,0x16a7,0x16a7,0x1713,0x16a7,0x1716, +0x16aa,0,0,0,0,0,0,0,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4, +0x16a4,0x16a4,0,0,0,0,0,0,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76, +0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76, +0x1a76,0x1a79,0x1a76,0x1a76,0,0,0,0,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73, +0x1a73,0x1a73,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3, +0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b0,0x1719,0x1719,0x16ad,0x16ad,0x16b6, +0x16b6,0,0,0,0,0,0,0,0x1959,0x1959,0x1929,0x1926,0x1944,0x1944,0x1944,0x1944, +0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944, +0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944, +0x1926,0x1926,0x1959,0x1959,0x1959,0x1959,0x1959,0,0,0,0x1926,0x1926,0x1959,0x195c,0x1962,0x192c, +0x192c,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1923,0x1923,0x1923,0x1923, +0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1a07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x17dc,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1749,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, +0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x1746,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x1491,0,0,0,0,0,0,0xccf,0xccf,0xccf,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0,0xccc,0xccc,0xccc,0xccc,0x12ea,0,0,0, +0,0,0,0,0,0,0,0,0x1491,0x1491,0x1491,0x1491,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5, +0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a2,0x18a2,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1950,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1953, +0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0,0, +0,0,0,0,0,0,0,0,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, +0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, +0x198f,0x198f,0x198f,0,0,0,0,0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1a13,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16, +0x1a16,0x1a13,0x19ad,0x19ad,0x19ad,0x1a13,0x1a13,0x1a19,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa, +0x19aa,0x19aa,0,0,0,0,0,0,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0,0,0,0,0,0,0,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359, +0x1359,0x1359,0,0,0,0,0x135f,0x135f,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, +0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, +0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae, +0x18ae,0x18ae,0,0,0,0,0,0,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305, +0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0,0,0x140d,0x140d,0x140d,0x140d, +0x140d,0x1308,0,0,0,0,0,0,0,0,0,0,0x12db,0x12db,0x12de,0x12de, +0x12e1,0x12d2,0,0,0,0,0,0,0,0,0,0,0x12d8,0x12d8,0x12d8,0x12d8, +0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0,0,0,0,0,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x19b9,0x19b9,0x19b9,0x19bc, +0x19b9,0x19b9,0x19b9,0x19bc,0x19bf,0x19bf,0x19bf,0x19c2,0x19c2,0x19b3,0x19c5,0x19c5,0x19b6,0x19b6,0x19b6,0x19b6, +0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0,0,0,0,0,0,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16bc,0x16c5,0x16b9,0x16b9,0,0,0,0,0,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0,0,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, +0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0,0,0,0, +0,0,0,0,0,0,0,0,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x175b,0x175b,0x175b, +0x175b,0x175b,0x175b,0,0,0,0,0x17a9,0x11c1,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0,0,0,0,0,0,0,0x122d,0x122d,0x122d,0x122d,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x1590,0x161d,0x1797,0x179a,0x183c,0,0,0, +0,0,0,0,0,0,0,0,0x1839,0x1839,0x1a82,0x1a82,0x1a7f,0x1a7f,0x1a7f,0, +0,0,0,0,0,0,0,0,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x19f5, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, +0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18cc,0x18cc,0x18cc,0x18cc,0,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0,0x18cc,0x18cc,0, +0x18c9,0x18c9,0x18c9,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x193e,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x179d,0x179d,0x179d,0,0,0x1941,0,0,0,0,0,0, +0,0,0,0,0x17a0,0x17a0,0x17a0,0x17a0,0,0,0,0,0,0,0,0, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0,0,0,0, +0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0,0,0,0, +0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0,0, +0,0,0,0,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0, +0x130b,0x1410,0x1413,0x1311,0x13bc,0x13bc,0x13bc,0x13bc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971, +0x1971,0x1971,0x1971,0x1971,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1a34,0x1a34, +0x1a34,0,0,0,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, +0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0,0,0,0,0,0,0x1a34,0x1a34, +0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34, +0x1a34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34, +0x1a3a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0,0, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0,0,0,0,0,0,0,0,0,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0,0, +0,0,0,0,0,0,0,0,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0, +0,0xd08,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467, +0x1467,0x1845,0x1845,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb76,0xb76,0xc21,0xc21,0xc21,0xb76,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9, +0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0,0,0,0, +0,0,0,0,0,0,0,0,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0,0,0,0, +0,0,0,0,0,0,0,0,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, +0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0, +0,0,0,0,0,0,0,0,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, +0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x1659, +0x1659,0,0,0,0,0,0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91e,0,0x91e,0x91e,0,0,0x91e,0,0,0x91e,0x91e,0, +0,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b, +0x91b,0x91b,0,0x91b,0,0x91b,0x91b,0x91b,0x91b,0xa29,0x91b,0x91b,0,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0,0x91e, +0x91e,0x91e,0x91e,0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91e,0, +0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0xb16,0xb16,0,0,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0xc54,0xc51, +0,0,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x1494,0x1494,0x1494,0x1494,0x14f7,0x1494,0x1494,0x1497,0x149a,0x1497,0x1497,0x1494, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1878,0x1875, +0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875, +0x1875,0x1875,0x1875,0,0,0,0,0,0,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0x159c,0x159c,0x159c,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0x159c,0x159c,0,0x159c,0x159c,0x159c,0x159c,0x159c,0, +0,0,0,0,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, +0x1902,0x1902,0x1902,0x1902,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x1902, +0x1902,0x1902,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x194a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, +0x1773,0x1773,0x1773,0x1773,0x1773,0,0,0,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x1773, +0x1773,0x1773,0x1773,0x1773,0x1776,0x1776,0,0,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, +0x1770,0x1770,0,0,0,0,0x1773,0x176d,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4, +0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18f3,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1788,0x1788,0x1788,0x1788, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x17b5,0x17b5,0x17b5,0x17b5,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0,0,0,0,0,0x1782,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1932,0x1932,0x1932,0x1932, +0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x195f,0x195f,0x195f,0x195f, +0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x1a1c,0x1a1f, +0x19ce,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0,0,0,0,0x19c8, +0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70, +0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0, +0x1a70,0x1a70,0x1a70,0x1a9a,0x1a70,0x1a70,0x1a9a,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a9a,0x1a9a, +0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a9a,0,0,0,0,0,0,0,0,0x1a70,0x1a70, +0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0,0x1869,0x1869,0x1869,0x1869,0,0x1869,0x1869,0, +0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0, +0x132c,0x132c,0x132c,0x132c,0x132c,0,0,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0,0,0,0,0,0,0,0,0, +0x153c,0x153c,0x153c,0x153c,0x15ab,0x15ab,0x15ab,0x15a5,0x15a8,0x15a8,0x15a8,0x1761,0,0,0,0, +0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0,0,0,0,0x1536,0x1536, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x165f,0x1659,0x1659,0x1659,0x165f,0x1659,0x1659,0x1659,0x1659,0,0,0,0,0,0,0, +0,0,0,0,0,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0,0,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e, +0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, +0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, +0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e, +0,0x118e,0,0x118e,0,0,0,0,0,0,0x118e,0,0,0,0,0x118e, +0,0x118e,0,0x118e,0,0x118e,0x118e,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, +0,0x118e,0,0x118e,0,0x118e,0,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, +0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e, +0,0x118e,0x118e,0x118e,0x118e,0,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, +0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, +0x118e,0x118e,0x118e,0x118e,0,0,0,0,0,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e, +0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, +0x118e,0x118e,0x118e,0x118e,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1185,0x1185,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0,0,0,0,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0,0, +0x17bb,0x17bb,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0,0,0,0, +0x196e,0x196e,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0,0,0,0,0,0,0, +0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, +0x17bb,0x17bb,0x17bb,0,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, +0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, +0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1a34,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x723,0x723,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,3,3,3,3,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +3,3,3,3,3,3,3,3,3,3,3,3,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,3,3,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1269,3,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1125,3,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,3,3,3,3,3,3,3,3,3,3,0x1581,0x1581,0x1581,0x1581, +0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x17bb,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x1023,0x112b,0x112b,3,3,3,3,3, +3,3,3,3,3,3,3,3,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, +0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b, +0x112b,0x112b,0x112b,0x158a,3,3,3,3,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e, +0x100e,3,3,3,3,3,3,3,0x1143,0x1143,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x13d1,0x1269,0x1269,0x1269,0x14dc,0x1584,0x1584,0x15c3,0x15c3,0x1791,0x1806,0x1806, +0x1a7c,3,3,3,0x1935,0x18bd,0x18bd,0x18bd,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x13ce,0x13ce,3,3,3,0x1269,0x1269,0x1269,0x1269,0x1584,0x1584,0x1584,0x160b, +0x160b,0x16e3,0x1791,0x1806,0x1806,3,3,3,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x165c,0x165c,0x165c, +0x165c,0x18fc,3,3,3,3,3,3,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,3,3,3,3,0x18bd,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1a34,0x1a34,0x1a34,0x1a34, +3,3,3,3,3,3,3,3,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, +0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,3,3,0x1791,0x1791,0x1791,0x1791,0x1806,0x1935,0x1935,0x1935, +0x1791,0x1791,0x1791,0x18bd,0x18bd,3,3,3,0x1791,0x1791,0x1791,0x1806,0x1806,0x1806,0x1806,0x1935, +0x1935,0x19f2,0x1a7c,3,3,3,0x1a7c,0x19f2,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806,0x1806, +0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x18c0,0x18c0,0x18c0,0x19f2,3, +0x1a7c,3,3,3,3,0x1a7c,0x1935,0x1935,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x18bd, +0x18bd,0x18bd,0x1935,0x1935,0x19f2,3,3,0x19f2,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd, +0x1935,0x19f2,0x1a7c,3,3,3,3,0x1a7c,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x1938, +0x1938,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,0x723,0x723,0x1842,0x1a37,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d0,0x5d0,0x5d0,9,0x90c,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,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, +0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,9,9,9,9,9,9,9,9, +9,9,9,9,9,9,9,9,0xa5,0xa5,0xa5,0xa5,0xa5,0x765,0x765,0x1977, +0x1977,0x1977,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0xc,0xc,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1287,0x13c2,0x128a,0x157e,0x1515,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x1665,0x1662,0x1668,0x1662,0x1668,0x172e,0x17c4,0x17c4,0x17c4,0x1851,0x1851,0x1848,0x184b,0x1848, +0x184b,0x1848,0x184b,0x1848,0x184b,0x184e,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x101a,0x101a,0x101a,0xf,0xf,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0xf,0xf,0x14e2,0x14e2,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0xf,0xf,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, +0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, +0x1965,0x1965,0xf,0xf,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, +0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, +0x939,0x939,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0x723,0x723,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0xf, +0xf,0xf,0xf,0xf,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b, +0x193b,0x193b,0x193b,0x193b,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0xf,0xf, +0xf,0xf,0xf,0xf,0x366,0x366,0x369,0xa5,0x3a8,0x37b,0x37b,0x37e,0xf6,0xf6,0x15,0x15, +0x15,0x15,0x15,0x86d,0x372,0xb4,0x39c,0x3a5,0xe7,0x372,0xc0,0xc0,0xa5,0xcc,0xcc,0x366, +0xf0,0xed,0x378,0x75,0x45,0x45,0x48,0x48,0x48,0x48,0x48,0x4b,0x48,0x48,0x48,0x18, +0x10b,0x5dc,0x105,0x105,0x38a,0xc6,0xc3,0x387,0x384,0x381,0x396,0xbd,0x390,0x393,0xc9,0xcc, +0x38d,0x38d,0xc9,0xcc,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0xa5,0x112e,0x112e,0x112e,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0x36,0x36,0x90,0x348,0x24,0x339,0x36,0x8d,0x24,0x348,0x87,0x90, +0x90,0x90,0x87,0x87,0x90,0x90,0x90,0x360,0x24,0x90,0x34b,0x24,0x81,0x90,0x90,0x90, +0x90,0x90,0x24,0x24,0x3f,0x339,0x345,0x24,0x90,0x24,0x3b7,0x2d,0x90,0x51,0x273,0x3cf, +0x90,0x90,0x7e,0x87,0x90,0x90,0x24f,0x90,0x87,0x8a,0x8a,0x8a,0x8a,0x75f,0x756,0xa20, +0xb16,0x963,0x966,0x966,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x27,0x42,0x3f6,0x2a,0x6e7, +0x750,0x759,0x759,0x759,0x957,0x957,0xb10,0xb10,0xb10,0xb10,0xeca,0xecd,0xecd,0x10a7,0x125a,0x126f, +0x1272,0x1272,0x145e,0x15c6,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x30,0x9c6, +0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6, +0x9c6,0x9c6,0x9c6,0xac5,0x960,0x95d,0x95d,0x95d,0x95d,0x966,0x963,0x963,0x963,0x963,0x954,0x95d, +0xb0d,0xc4b,0xc6f,0xd05,0xed0,0xed0,0xed0,0x33f,0x33f,0x33,0x33,0x33,0x33,0x33,0x33,0x33f, +0x33f,0x33f,0x33f,0x39,0x7b,0xa5,0xa5,0xa5,0xdb,0xb1,0xa8,0x987,0x768,0x768,0x765,0x765, +0x765,0x765,0x96c,0x9c3,0x96c,0x96c,0x978,0xa2f,0xa26,0xb19,0xb25,0x975,0xb25,0xb25,0xbd6,0xb25, +0xb22,0xbd9,0xb25,0x95a,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xa2,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xcf,0xcf, +0xcf,0xcf,0xd2,0xa5,0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0x369,0x369,0xa5,0xa5, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2, +0xcf,0xcf,0x396,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xa5,0x369,0xa5,0xa5,0xa5,0x765,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0xa5,0x765,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xde,0xd5,0xde,0xd5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0x366,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x504,0x504,0xa5,0xa5,0xa5,0xa5, +0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x50a,0x507,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x765, +0x978,0x765,0x765,0x765,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0xa5,0xa5,0xa5,0xa5,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0xa5,0xa5,0x366,0x366,0x366,0x366,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, +0x96c,0x96c,0x96c,0x96c,0x396,0x396,0xa5,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xa5,0xa5, +0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0x396,0x396,0xcf,0xcf,0x396,0x396,0xa5,0xa5,0xa5,0xa5, +0x396,0x396,0xcf,0xcf,0x396,0x396,0xa5,0xa5,0xa5,0xa5,0x396,0x396,0x366,0xa5,0xcf,0x396, +0xa5,0xa5,0x366,0x396,0x396,0x396,0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x396,0x366,0x396,0x366,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xa5,0xa5,0x366,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978, +0x978,0x9d8,0x9d8,0x978,0xae,0xae,0xae,0xae,0xa5,0x396,0x396,0xa5,0xa5,0x366,0xa5,0xa5, +0xa5,0xa5,0x366,0x366,0xa5,0xa5,0xa5,0xa5,0xad7,0xad7,0x969,0x969,0xb1c,0x765,0xae,0xae, +0x36c,0xba,0x36c,0xae,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0xa5,0xae,0xae,0xae, +0xa5,0xa5,0xa5,0xa5,0x396,0xa5,0x396,0xa5,0xa5,0xa5,0xa5,0xa5,0x501,0x501,0x501,0x501, +0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0x396,0x396,0xcf,0x396,0x366,0x366,0xa5,0x366,0x36c,0x366,0x366,0xa5, +0x366,0x396,0xcf,0x396,0x765,0x765,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, +0x96c,0x96c,0xb19,0xc00,0x1284,0xae,0xae,0xae,0xae,0x112e,0xa5,0xa5,0xae,0xae,0x1134,0x1134, +0xba,0xba,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x369,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0x112e,0xa5,0xa5,0xa5,0xa5,0x112e, +0x112e,0x112e,0xa5,0x1014,0xa5,0xa5,0xa5,0xb7,0xb7,0xb7,0xb7,0x10b3,0x10b3,0xa5,0xab,0xab, +0xae,0xa5,0xa5,0xa5,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f, +0x972,0x96f,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0x396,0xcf,0x396,0x396, +0xd2,0xcf,0xcf,0x396,0x396,0xd2,0xcf,0x396,0xd2,0xcf,0xcf,0x396,0xcf,0x396,0xea,0xe1, +0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0x396,0x396,0x396,0x396,0xcf,0xcf,0x396, +0xd2,0x396,0xd2,0x396,0x396,0x396,0x396,0x396,0x3a2,0xe4,0x396,0xe4,0xe4,0xcf,0xcf,0xcf, +0x396,0x396,0x396,0x396,0xcf,0xcf,0xcf,0xcf,0x396,0x396,0xcf,0xcf,0xcf,0xd2,0xcf,0xcf, +0xd2,0xcf,0xcf,0xd2,0x396,0xd2,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x399,0x396,0xd2,0xcf, +0x396,0x396,0x396,0x396,0xcf,0xcf,0x396,0x396,0xcf,0xd2,0x399,0x399,0xd2,0xd2,0xcf,0xcf, +0xd2,0xd2,0xcf,0xcf,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0x396,0x396, +0xd2,0xd2,0x396,0x396,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0x396,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xd8,0xcf,0xcf,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x132,0x132,0x330,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x11d,0x11d,0x98a,0xac2,0x1854,0x1854,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c, +0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x132,0x12c,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, +0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x1854,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132, +0x12c,0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x12f,0x135,0x132,0x12c, +0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x132,0x12c,0x12f, +0x132,0x12c,0x12f,0x135,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x12f,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x12c,0x132,0x309,0x30c,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854, +0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x12f,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12c,0x12f,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c,0x12f,0x12f,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c, +0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12f,0x12c,0x12c,0x12c,0x12f, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c, +0x12f,0x12f,0x12f,0x12c,0x12f,0x12f,0x12f,0x12f,0x1a46,0x1a46,0x12f,0x12f,0x12f,0x12f,0x12c,0x12c, +0x12f,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c, +0x12f,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12c,0x12c, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1854,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132, +0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f, +0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132, +0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, +0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, +0x135,0x132,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x135,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x1a1,0x1a1,0x5f1,0x5f1,0x2fd,0x300,0x31b,0x31b, +0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x19b,0xd5f,0xd5c,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x13d4,0x1029,0x1029,0xcd5,0xcd5,0xc0f,0xcd5,0xcd5,0x1041,0x5f7,0x5f7,0x19e,0xa4d,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a1,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x5b8,0x5b8,0x5b8, +0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, +0x5b8,0x5bb,0x5b8,0x5b8,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x1152,0x10c5,0x5fa,0x1a1,0x19e,0x19e, +0x19e,0x5f7,0x5f7,0x5f7,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,0x19e,0x19e,0x19e,0x19e,0x6d8,0xeee,0x10c5, +0x1a4,0x660,0x663,0x5d6,0x5d6,0x1041,0x1152,0x1152,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, 0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1b3, -0x1b3,0x1b3,0x1b3,0x1b3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1b3,0x1b3,0x1575,0x156f,0x1572,0x157b,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1944,0x1944,0x1944, -0x1944,0x1be7,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49,0x1a49, -0x1a49,0x1a49,0x1a49,0x1a49,0x1b9,0x1b9,0x1b9,0x1b9,0x1bc3,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x172b,0x16ce,0x158a,0x16d4,0x1bc,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x1bc,0x1596,0x1596,0x1bc,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1bc,0x1596,0x1596,0x1bc,0x1596,0x1596,0x1596,0x1596,0x1596,0x1bc,0x19ce,0x16d1,0x1593,0x1584,0x158a, -0x1584,0x158a,0x158a,0x158a,0x158a,0x1bc,0x1bc,0x158a,0x158a,0x1bc,0x1bc,0x158d,0x158d,0x1590,0x1bc,0x1bc, -0x172e,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1584,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x159c,0x1599,0x1599, -0x1596,0x1596,0x158a,0x158a,0x1bc,0x1bc,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1bc,0x1bc,0x1bc, -0x1587,0x1587,0x1587,0x1587,0x1587,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, -0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15b1,0x15b1,0x1bf,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15c3,0x15c3,0x15c3,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15ba,0x15bd,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1731,0x1731,0x1731,0x1731,0x15cf,0x15cc,0x19f5,0x19f5,0x1a9d,0x1aa0,0x1a9a,0x1a9a,0x1c5,0x1c5,0x1c5,0x1c5, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15d8,0x15db,0x15de,0x15e1,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15e4,0x15e4,0x1ce,0x1ce,0x1ce,0x1ce,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7, -0x15ed,0x15ed,0x16d7,0x15ed,0x15ed,0x15ed,0x15ea,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x1d1,0x1d1,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x15fc,0x160e,0x160e,0x1602,0x160b,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1d7, -0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1d7,0x1d7,0x1d7,0x1d7,0x1617,0x1617, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1620,0x1620,0x1620,0x1620,0x1620,0x161a,0x1623,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1620,0x1620,0x1620,0x1620,0x1620,0x1da, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1dd, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1632,0x1632,0x1632,0x1632,0x1632,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x164d,0x164d,0x1650,0x1650,0x1653,0x1644,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, -0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x1e3,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1e3,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x164d,0x164d,0x164d, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1662,0x1662,0x1662,0x1662,0x1e9,0x1e9,0x1e9, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1668, -0x167a,0x167a,0x1668,0x1668,0x1668,0x1668,0x1ef,0x1ef,0x167a,0x167a,0x167d,0x167d,0x1668,0x1668,0x167a,0x166e, -0x166b,0x1671,0x1683,0x1683,0x1674,0x1674,0x1677,0x1677,0x1677,0x1683,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x1737,0x1737,0x1737,0x1737,0x1734,0x1734,0x1ef,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, -0x1f2,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1f5,0x1f5,0x1f5,0x1f5, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1f5,0x1f5,0x1aa3,0x1aa3,0x1f5,0x1f5, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5, -0x168c,0x169b,0x1692,0x168f,0x16a1,0x16a1,0x1695,0x16a1,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4, -0x16a4,0x16a4,0x16a4,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x16ad, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x1947,0x1fe,0x1fe,0x173d,0x173d,0x173d, -0x1749,0x1749,0x173d,0x173d,0x173d,0x173d,0x174c,0x173d,0x173d,0x173d,0x173d,0x1740,0x1fe,0x1fe,0x1fe,0x1fe, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1743,0x1743,0x1752,0x1752,0x1752,0x1743, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x1b0,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x99f,0x99f,0xb6d,0xb6d,0x303,0xb70,0x11a0,0x11a0,0x11a0, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, +0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, +0x204,0x204,0x204,0xef7,0xef7,0xef7,0xef7,0xef7,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, 0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, -0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, -0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x207,0x1767,0x1767,0x207,0x207, -0x207,0x207,0x207,0x1764,0x1764,0x1764,0x1764,0x1764,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x20a, -0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x20a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, -0x176a,0x176d,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x20d,0x20d,0x20d,0x20d,0x20d, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x20d,0x20d,0x20d,0x20d,0x20d, -0x20d,0x20d,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x177c,0x177c,0x177c,0x177c,0x1779,0x177c,0x177c,0x177f, -0x1782,0x177f,0x177f,0x177c,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x1779,0x1779,0x1779,0x1779,0x1779,0x17d9,0x17d9,0x17d9,0x17d9,0x17d0,0x17d0,0x17d0,0x17ca, -0x17cd,0x17cd,0x17cd,0x19f8,0x213,0x213,0x213,0x213,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x17d6,0x17d6,0x213,0x213,0x213,0x213,0x17d3,0x17d3,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x216,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f1,0x17df,0x17df,0x17df,0x17df, -0x17df,0x17df,0x17df,0x216,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17f1,0x17e2,0x17f4,0x17f7,0x17f7,0x17eb, -0x17e8,0x17e8,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x17ee,0x17ee,0x17ee,0x17ee, -0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x216,0x216,0x216,0x1803,0x1806,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x21c, -0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x21c,0x21c,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x21c,0x17fd,0x17fd,0x21c,0x17fd,0x17fd, -0x17fd,0x17fd,0x17fd,0x21c,0x21c,0x21c,0x21c,0x21c,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e, -0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x184b,0x18e7,0x1a52,0x1a55,0x1afd,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x1afa,0x1afa,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x222,0x222,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, -0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x222,0x1809,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, -0x1800,0x1809,0x1800,0x1800,0x1809,0x1800,0x1800,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, -0x1827,0x1827,0x1818,0x1812,0x1812,0x1827,0x1815,0x182a,0x182a,0x182a,0x182a,0x182d,0x182d,0x1821,0x181e,0x181b, -0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1aa6,0x1821,0x228,0x181b,0x194a,0x19fb, -0x1aa9,0x1aa9,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833, -0x1833,0x1833,0x1833,0x1833,0x22b,0x22b,0x22b,0x22b,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, -0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830, -0x1830,0x1830,0x1830,0x1830,0x22b,0x22b,0x22b,0x22b,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58, -0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x1bcc,0x1bcc,0x1bcc,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x273,0x273,0x1c41,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x234, -0x188d,0x188d,0x234,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, -0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x234, -0x234,0x234,0x1881,0x234,0x1881,0x1881,0x234,0x1881,0x1881,0x1881,0x1884,0x1881,0x1887,0x1887,0x1890,0x1881, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, -0x188a,0x188a,0x234,0x234,0x234,0x234,0x234,0x234,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x237,0x237,0x237,0x237,0x189f,0x18a2,0x18a2,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8, -0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x1ba8,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x23d,0x23d,0x23d,0x23d,0x23d,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75, -0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x18bd,0x18c0,0x18cf,0x18cf,0x18c0,0x18c3,0x18bd,0x18ba, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x18a8,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x18a5, -0x18a5,0x1893,0x1893,0x1893,0x18a8,0x18a8,0x18a8,0x18a8,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x1950, -0x1950,0x1950,0x1950,0x1950,0x1950,0x1950,0x243,0x243,0x1a61,0x1a61,0x1a61,0x1a61,0x1b03,0x1c47,0x1c47,0x1c47, -0x1a61,0x1a61,0x1a61,0x1bcf,0x1bcf,0x276,0x276,0x276,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x195f,0x195f,0x195f,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953, -0x195f,0x1959,0x1956,0x195c,0x246,0x246,0x246,0x246,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x249,0x249,0x1965,0x1965,0x1965,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x24c,0x1974, -0x1974,0x24c,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974, -0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1971,0x1971,0x1971,0x1971,0x1971,0x24c, -0x1968,0x1968,0x24c,0x1971,0x1971,0x1968,0x1971,0x196b,0x1974,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x197d,0x197d,0x1980,0x1980,0x1977,0x1977,0x1977,0x1977,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x197a,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1986,0x1983,0x1983,0x1983, -0x1986,0x1983,0x1983,0x1983,0x1983,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992, -0x1992,0x1992,0x198f,0x1989,0x1989,0x198c,0x198c,0x1995,0x1995,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998, -0x1998,0x1998,0x1998,0x1998,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199e,0x19a7,0x199b,0x199b,0x25b,0x25b,0x25b,0x25b,0x25b, -0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19ad,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, -0x19b6,0x19b6,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b3,0x19b3,0x19b3, -0x19b3,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96, -0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1b96,0x1bf9,0x1bff,0x1bff,0x1bff,0x1bff,0x1bff,0x1bff,0x1bfc, -0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x1bfc,0x264,0x264, -0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d, -0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x1a0d,0x267, -0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c, -0x26a,0x26a,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c, -0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a1c,0x1a19,0x1a19,0x1a19,0x1a10,0x1a10,0x1a10,0x1a10, -0x26a,0x26a,0x1a10,0x1a10,0x1a19,0x1a19,0x1a19,0x1a19,0x1a13,0x1a1c,0x1a16,0x1a1c,0x1a19,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x26d,0x26d,0x26d,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a1f,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a2b,0x1a2b,0x26d,0x26d,0x270,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e, -0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e, -0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x1a2e,0x270,0x270,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x1a5b,0x1a5b,0x1a5b,0x273, -0x273,0x1c44,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x1a5e,0x1a5e,0x1a5e,0x1a5e, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x1a61,0x1a61,0x1a61,0x1b03,0x1b03,0x1b03,0x1b03,0x1c47, -0x1c47,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1b03,0x1b03, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x1c47, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x1c47,0x276,0x1c47, -0x1b03,0x1b03,0x1b03,0x1bd2,0x1bd2,0x1bd2,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1c47,0x1c47, -0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x1c47,0x276,0x276,0x276,0x276, -0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1bcf,0x1c47,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1bd2,0x1c4a,0x1c4a,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x1a37,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x1a34, -0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a3a,0x1a3a,0x1a3a,0x1a3a, -0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x27c,0x27c,0x27c,0x27c,0x27c,0x1a3d, -0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x1aac,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x282,0x282,0x1aca,0x282,0x282,0x1aca,0x1aca,0x1aca,0x1aca, -0x1aca,0x1aca,0x1aca,0x1aca,0x282,0x1aca,0x1aca,0x282,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca, -0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1aca,0x1ab2,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x282,0x1ac1, -0x1ac4,0x282,0x282,0x1ab2,0x1ab2,0x1ac7,0x1ab8,0x1acd,0x1ac1,0x1acd,0x1ac1,0x1ab5,0x1ad0,0x1abb,0x1ad0,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe, -0x1abe,0x1abe,0x282,0x282,0x282,0x282,0x282,0x282,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x285,0x285, -0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285, -0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x28b,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9,0x1ad9, -0x1ad9,0x1ad9,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c,0x1b0c, -0x1b0c,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, -0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, -0x28e,0x28e,0x28e,0x28e,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x291,0x1adc, -0x1adc,0x1adf,0x291,0x291,0x1ae2,0x1ae2,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, -0x291,0x291,0x291,0x291,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b75,0x1b72,0x1b75,0x1b75,0x1b75, -0x1b75,0x1b75,0x1b75,0x294,0x1b78,0x1b78,0x294,0x294,0x294,0x294,0x294,0x294,0x1b6f,0x1b6f,0x1b6f,0x1b6f, -0x1b6f,0x1b6f,0x1b6f,0x1b6f,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7b,0x1b7b,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x29a,0x1b81,0x1b81,0x1b81,0x1b81, -0x29a,0x1b81,0x1b81,0x29a,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81,0x1b81, -0x1b81,0x1b81,0x1b81,0x29a,0x1b84,0x1b8a,0x1b8a,0x1b87,0x1b87,0x1b87,0x2a0,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87, -0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87, -0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x2a0,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x1b87,0x2a0, -0x2a0,0x2a0,0x2a0,0x2a0,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b90,0x1b8d, -0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d,0x1b8d, -0x1b8d,0x1b8d,0x1b8d,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x1c02,0x1c02,0x1c02,0x1c02,0x1c02,0x1c02,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x1b96,0x1b96,0x1b93,0x1b93,0x1b93,0x1b93,0x1b99,0x1b99,0x1b99,0x1b99,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf,0x1aaf, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x2a9, -0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x1b9c,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, -0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba5,0x1ba2,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x1bae,0x2af,0x1bae,0x1bae,0x1bae,0x1bae, -0x1bae,0x1bae,0x1bae,0x2af,0x1bae,0x1bae,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab, -0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab, -0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x1bab,0x2af,0x1bab,0x1bab,0x2af,0x2af,0x2af, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x2b2,0x2b2, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x2b5,0x2b5,0x2b5,0x2b5, -0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, -0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1c05,0x1c05,0x1c05, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0e,0x1c0e,0x1c0e,0x2b8,0x2b8, -0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, -0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x1c11,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x1c14,0x1c14,0x1c14,0x1c14, -0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14,0x1c14, -0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x1c17,0x1c17,0x1c2c,0x1c23, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x2c1,0x1c29,0x1c29, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29,0x1c29, -0x1c29,0x1c29,0x1c29,0x1c29,0x1c23,0x1c23,0x1c17,0x1c17,0x1c17,0x1c17,0x1c17,0x2c1,0x2c1,0x2c1,0x1c23,0x1c23, -0x1c17,0x1c26,0x1c1a,0x1c2f,0x1c2f,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d,0x1c1d, -0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x1c20,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, -0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c38,0x1c32,0x1c32,0x1c32,0x1c32, -0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x1c35,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x95d,0x95d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0x12a5, -0x12a5,0x12a5,0x2ca,0x2ca,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0x2ca,0x2ca, -0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0x2cd,0x2cd, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x1bbd,0x1bbd,0x1bbd,0x1bbd,0x1c3b,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x2d3,0x2d3, -0x1794,0x1794,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x2df,0x2df, -0x3e7,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3db,0x3e7,0x3e7,0x3e7,0x3e7,0x3e1,0x1125,0x12fc, -0x3ea,0x927,0x92a,0x3d8,0x3d8,0x1122,0x12f9,0x12f9,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed, -0x1122,0x3db,0x3db,0x3e7,0xcb1,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ea,0x3db,0x3db,0x8af,0x8b2,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, -0x3e4,0xf81,0xf7e,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x14c1,0x1128,0x1128,0xed3,0xed3,0xda4,0xed3,0xed3, -0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ed,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ed,0x3ea,0x3ea,0x3ed,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x12f9,0x12fc,0x3de,0x3ea,0x3e7,0x3e7, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x1305,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x1305,0x1866,0x1866,0xf9f,0x47a,0x483, +0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, +0x207,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, +0x204,0x204,0x204,0x204,0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x282,0x27c,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255, +0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x25b,0x255, +0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267, +0x282,0x27c,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x282,0x27c,0x26d,0x267,0x282,0x27c,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x26d,0x267,0x26d,0x267, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267, +0x26d,0x267,0x282,0x27c,0x26d,0x267,0x267,0x267,0x267,0x267,0x270,0x6ea,0xd74,0xd74,0xd8c,0xd74, +0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x276,0x276,0x276,0x276, +0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x270,0x270,0x270,0x270,0x270,0x270, +0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, +0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, +0x282,0x27c,0xd77,0xd74,0xd77,0xd74,0xd77,0xd74,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x1149,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x1146,0x1635,0x1635,0xd95,0x62a,0x28e,0x504,0x510,0x510,0x510,0x510,0x510,0x510,0x510, +0x510,0x510,0x6d2,0x6d2,0x6d2,0x6d2,0x6cc,0x6cc,0x573,0x588,0x588,0x588,0x588,0x585,0x4bf,0x56d, +0x87f,0x87f,0x87f,0x9db,0x9f9,0x9f6,0x897,0x306,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, +0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x339,0x339,0x339,0x339, +0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, +0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x351,0x351, +0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351, +0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7, +0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7, +0x9c9,0x417,0x40e,0x40b,0x411,0x414,0x405,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, +0x41a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x405,0x6c9,0x6c9,0x420,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x459,0x459,0x459,0x459,0x459, +0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x423, +0x441,0x41d,0x447,0x44a,0x444,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x456,0x456,0x456,0x456,0x456, +0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x423, +0x441,0x41d,0x441,0x9cc,0x42c,0x567,0x56a,0x570,0x4b3,0x519,0x59d,0x516,0x5a3,0x5a0,0x5a9,0x5a6, +0x564,0x561,0x564,0x561,0x55e,0x55b,0x504,0x570,0x55e,0x55b,0x55e,0x55b,0x55e,0x55b,0x55e,0x55b, +0x576,0x57c,0x57f,0x579,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0xadd,0xadd,0xc09,0x4b6,0x5d9,0x5d6,0x5d9,0x5d6,0xe73,0xe70,0xe73,0x13ec,0x13e9,0x13ec,0x13e9,0x13ec, +0x13e9,0x13ec,0x14f4,0x14f1,0x4c8,0x4da,0x4da,0x4f8,0x4f8,0x4ce,0x4bc,0x4ce,0x4bc,0x4ce,0x4bc,0x4ce, +0x4bc,0x4ce,0x4bc,0x4ce,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xace,0xace,0xace,0xace,0x597, +0x597,0x597,0x597,0x597,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5, 0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xba6,0xba6,0xdb3,0xdb3,0x8b5,0xdb0,0x13e3,0x13e3,0x13e3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8, -0x4ce,0x4ce,0x4ce,0x113d,0x113d,0x113d,0x113d,0x113d,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, -0x4d1,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce, -0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce, -0x4ce,0x4ce,0x4ce,0x4ce,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4,0x4d7,0x9a2,0xfcc,0xfcc,0xfcf,0xfcc, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4, -0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0x4da,0x4d4,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e6,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9,0x4e9, -0x6a5,0x6a5,0x6a8,0x504,0x6b4,0x6b1,0x6b1,0x6ae,0x52e,0x52e,0x4ec,0x4ec,0x4ec,0x4ec,0x4ec,0xb37, -0x6b7,0x510,0x6cf,0x6d2,0x525,0x6b7,0x513,0x513,0x504,0x51f,0x51f,0x6a5,0x52b,0x528,0x6ab,0x4fe, -0x4f5,0x4f5,0x4f8,0x4f8,0x4f8,0x4f8,0x4f8,0x4fb,0x4f8,0x4f8,0x4f8,0x4ef,0x537,0x534,0x531,0x531, -0x6c3,0x519,0x516,0x6c0,0x6bd,0x6ba,0x6cc,0x507,0x6c9,0x6c9,0x51c,0x51f,0x6c6,0x6c6,0x51c,0x51f, -0x501,0x504,0x504,0x504,0x522,0x50d,0x50a,0xbbb,0xada,0xada,0xad7,0xad7,0xad7,0xad7,0xbb2,0xbb2, -0xbb2,0xbb2,0xbb8,0xcde,0xcdb,0xdbf,0xdc2,0xbb5,0xdc2,0xdc2,0xdc2,0xdc2,0xdbf,0xdc2,0xdc2,0xbaf, -0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x558,0x55e,0x73e,0x55b,0x9a5,0x9c6,0xadd,0xadd,0xadd, -0xbc1,0xbc1,0xdc8,0xdc8,0xdc8,0xdc8,0x1146,0x1149,0x1149,0x131a,0x14af,0x14d9,0x14dc,0x14dc,0x16e9,0x1869, -0x56a,0x56a,0x582,0x6e4,0x567,0x6de,0x56a,0x57f,0x567,0x6e4,0x579,0x582,0x582,0x582,0x579,0x579, -0x582,0x582,0x582,0x6ea,0x567,0x582,0x6e7,0x567,0x576,0x582,0x582,0x582,0x582,0x582,0x567,0x567, -0x56d,0x6de,0x6e1,0x567,0x582,0x567,0x6ed,0x567,0x582,0x570,0x588,0x6f0,0x582,0x582,0x573,0x579, -0x582,0x582,0x585,0x582,0x579,0x57c,0x57c,0x57c,0x57c,0xae6,0xae3,0xce1,0xdd1,0xbd6,0xbd9,0xbd9, -0xbd3,0xbd0,0xbd0,0xbd0,0xbd0,0xbd9,0xbd6,0xbd6,0xbd6,0xbd6,0xbcd,0xbd0,0xdce,0xedf,0xee2,0xfd5, -0x114c,0x114c,0x114c,0x6f6,0x6f3,0x58b,0x58e,0x58e,0x58e,0x58e,0x58e,0x6f3,0x6f6,0x6f6,0x6f3,0x58e, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x597,0x597,0x597,0x597, -0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x591,0x591,0x591,0x591,0x591,0x591, -0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59a,0x59d,0x59d,0x59d,0x59d,0x59d,0x5a0,0x59a, -0x59d,0x59d,0x59a,0x59a,0x59a,0x59a,0x59d,0x59d,0x6ff,0x6ff,0x59a,0x59a,0x59d,0x59d,0x59d,0x59d, -0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x5a0,0x5a0,0x5a0,0x59d,0x59d,0x702,0x59d, -0x702,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59d,0x59a,0x59d,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59d,0x59d,0x59a,0x6ff,0x59a,0x59a,0x59a,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0x705,0x5a3,0x705,0x705, -0x5a6,0x5a3,0x5a3,0x705,0x705,0x5a6,0x5a3,0x705,0x5a6,0x5a3,0x5a3,0x705,0x5a3,0x705,0x5b2,0x5af, -0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x705, -0x5a6,0x705,0x5a6,0x705,0x705,0x705,0x705,0x705,0x70b,0x5a9,0x705,0x5a9,0x5a9,0x5a3,0x5a3,0x5a3, -0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x705,0x5a3,0x5a3,0x5a3,0x5a6,0x5a3,0x5a3, -0x5a6,0x5a3,0x5a3,0x5a6,0x705,0x5a6,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x708,0x705,0x5a6,0x5a3, -0x705,0x705,0x705,0x705,0x5a3,0x5a3,0x705,0x705,0x5a3,0x5a6,0x708,0x708,0x5a6,0x5a6,0x5a3,0x5a3, -0x5a6,0x5a6,0x5a3,0x5a3,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x705,0x705, -0x5a6,0x5a6,0x705,0x705,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x705,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6,0x5a3,0x5ac,0x5a3,0x5a3,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0x5b5,0xaef,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5be,0x5bb,0x5be,0x5bb,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x70e,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x7fe,0x7fe,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0x5b8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x804,0x801,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0xaef,0xbe5,0xaef,0xaef,0xaef,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x5c7,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42, -0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xd50,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x5ca,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x5cd,0x5cd,0x5cd,0x5cd,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x5d0,0x5d0,0x720,0x720, -0x720,0x720,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0x726,0x726,0x5d3,0x723, -0x723,0x723,0x723,0x723,0x723,0x723,0x5d3,0x5d3,0x5d3,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x726,0x726, -0x5d6,0x5d6,0x726,0x726,0x5d3,0x5d3,0x5d3,0x5d3,0x726,0x726,0x5d6,0x5d6,0x726,0x726,0x5d3,0x5d3, -0x5d3,0x5d3,0x726,0x726,0x723,0x5d3,0x5d6,0x726,0x5d3,0x5d3,0x723,0x726,0x726,0x726,0x5d6,0x5d6, -0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x726,0x723, -0x726,0x723,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d3,0x5d3,0x723,0xaf5,0xaf5,0xaf5,0xaf5, -0xaf5,0xaf5,0xaf5,0xaf5,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xc5a,0xc5a,0xbeb,0x5dc,0x5dc,0x5dc,0x5dc, -0x5d9,0x72f,0x72f,0x5d9,0x5d9,0x729,0x5d9,0x5d9,0x5d9,0x5d9,0x729,0x729,0x5d9,0x5d9,0x5d9,0x5d9, -0xd59,0xd59,0xbee,0xbee,0xdda,0xaf8,0x5dc,0x5dc,0x72c,0x5df,0x72c,0x5dc,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5dc,0x5dc,0x5dc,0x5d9,0x5d9,0x5d9,0x5d9,0x72f,0x5d9,0x72f,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x72f,0x72f,0x5e2,0x72f, -0x729,0x729,0x5d9,0x729,0x72c,0x729,0x729,0x5d9,0x729,0x72f,0x5e2,0x72f,0xaf8,0xaf8,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xdd7,0xe8e,0x5e5,0x5e5,0x5e5,0x5e5, -0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5, -0x5e8,0x13a4,0x13a4,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x14e2,0x5ee,0x5ee,0x5ee, -0x5ee,0x13a4,0x5e8,0x5e8,0x5ee,0x5ee,0x13a7,0x13a7,0x5f4,0x5f4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x735,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x13a4,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x13a4,0x13a4,0x5e8,0x129f,0x5e8,0x5e8,0x5e8,0x5f1, -0x5f1,0x5f1,0x5f1,0x1326,0x1326,0x5e8,0x5eb,0x5eb,0x5ee,0x5e8,0x5e8,0x5e8,0xbf7,0xbf4,0xbf7,0xbf4, -0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0xbf7,0xbf4,0x732,0x732,0x732,0x732,0x732,0x732, -0x732,0x732,0x732,0x732,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x5e8,0x13a4,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8,0x5e8, -0x5e8,0x5e8,0x5e8,0x13a4,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0x615,0x615,0x95a,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x60c,0x60c, -0xbfa,0xd7d,0x1b21,0x1b21,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f, -0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x615,0x60f,0x612,0x618,0x615,0x60f,0x615,0x60f,0x612,0x618,0x615,0x60f,0x612,0x618,0x615,0x60f, -0x615,0x60f,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x615,0x60f,0x615,0x60f,0x615,0x60f,0x612,0x618,0x612,0x618,0x615,0x60f,0x615,0x60f,0x615,0x60f, -0x615,0x60f,0x615,0x60f,0x615,0x60f,0x615,0x60f,0x612,0x615,0x60f,0x612,0x615,0x60f,0x612,0x618, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x60f,0x615,0x918,0x91b,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21,0x1b21, -0x1b21,0x1b21,0x1b21,0x1b21,0x612,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x60f,0x612,0x60f,0x60f, -0x612,0x612,0x60f,0x60f,0x612,0x612,0x60f,0x612,0x60f,0x612,0x60f,0x60f,0x612,0x60f,0x60f,0x612, -0x60f,0x612,0x60f,0x60f,0x612,0x60f,0x612,0x612,0x60f,0x60f,0x60f,0x612,0x60f,0x60f,0x60f,0x60f, -0x60f,0x612,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, -0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x60f,0x60f,0x612,0x60f,0x612,0x60f, -0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x618,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x61b,0x61b,0x61b,0xfe1,0xfe1,0xfe1,0x14e5, -0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x16ef,0x16ef,0x864,0x86a,0x86a,0x876,0x876,0x867,0x85e,0x867, -0x85e,0x867,0x85e,0x867,0x85e,0x867,0x85e,0x867,0x62a,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x62a,0x624,0x62a,0x624,0x62a, -0x624,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627,0x62d,0x62a,0x624,0x627, -0x62d,0x62a,0x624,0x627,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714, -0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, -0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0xc48,0x8c7,0x8be,0x8bb, -0x8c1,0x8c4,0x74d,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x8cd,0x74d,0x74d,0x74d, -0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d, -0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x74d,0x8ca,0x8ca, -0x753,0x8dc,0x8df,0x8e5,0x80a,0x816,0x8fa,0x813,0x8d3,0x8d0,0x8d3,0x8d0,0x8d9,0x8d6,0x8d9,0x8d6, -0x8d3,0x8d0,0x810,0x8e5,0x8d3,0x8d0,0x8d3,0x8d0,0x8d3,0x8d0,0x8d3,0x8d0,0x8eb,0x8f1,0x8ee,0x8ee, -0x759,0x795,0x795,0x795,0x795,0x795,0x795,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f, -0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x75c,0x777,0x756,0x77d,0x780, -0x77a,0x792,0x792,0x792,0x792,0x792,0x792,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c, -0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x75c,0x777,0x756,0x777,0xc4b, +0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xace,0xace,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, +0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, +0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x51c,0x51c,0x513,0x51c,0x513,0x51c, +0x51c,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x51c,0x513,0x51c,0x513,0x51c, +0x51c,0x513,0x513,0x51c,0x51c,0x51c,0x513,0x513,0x513,0x513,0x1215,0x1215,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, +0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, +0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, +0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xe52,0xe52,0xe52,0xe52, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, +0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, +0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, +0x528,0x528,0x1020,0x1020,0x1020,0x1020,0x1020,0x531,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52e,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x537,0x534,0x537,0x53a,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x534, +0x534,0x534,0x534,0x534,0x537,0x537,0x534,0x537,0x537,0x534,0x537,0x537,0x534,0x537,0x537,0x534, +0x537,0x537,0x534,0x534,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0xace,0xace,0xace,0xace,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543, +0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543, +0x543,0x543,0x543,0x17b8,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x9f3,0x54f,0x549,0x54f, +0x549,0x54f,0x549,0x54f,0x549,0x54f,0x549,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549, +0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x54f, +0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x549,0x549,0x549,0x549,0x549,0x54c,0x54c,0x549,0x54c, +0x54c,0x549,0x54c,0x54c,0x549,0x54c,0x54c,0x549,0x54c,0x54c,0x549,0x549,0x549,0x549,0x549,0x54f, +0x549,0x54f,0x549,0x54f,0x549,0x549,0x549,0x549,0x549,0x549,0x54f,0x549,0x549,0x549,0x549,0x549, +0x54c,0x54f,0x54f,0x54c,0x54c,0x54c,0x54c,0x558,0x58b,0x552,0x555,0x9ea,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x1026,0x1026,0x1026,0x1026, +0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xace,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0xace,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x717,0x6f3,0x6f3,0x6f3,0x6f3,0x6ed,0x6f3,0x6f3, +0x708,0x6f3,0x6f3,0x702,0x6ff,0x705,0x705,0x705,0x705,0x705,0x708,0x6ed,0x6f9,0x6ed,0x6ed,0x6ed, +0x73e,0x73e,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, +0x70b,0x70b,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6f0,0x73e,0x6ed,0x73e, +0x6ed,0x741,0x6fc,0x6f6,0x6fc,0x6f6,0x711,0x711,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x723,0x723,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x729,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, +0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, +0x72c,0x72c,0x72c,0x72c,0x729,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, +0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, +0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978,0x978, +0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, +0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb67, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, +0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x8a0,0x8a0,0x8a0,0x8a3,0x8a3,0x8a0,0x8a0,0x8a0, +0x89a,0x89d,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8c4,0x8c4,0x7b9,0x8b5, +0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x7b9,0x7b9,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, 0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7f8,0x7f8,0x7f8,0x7f8, 0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x1299,0x1299,0x1299,0x1299,0x1299,0x7fb,0x810,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x933,0x933,0x933,0x933,0x819,0x819,0x8e8,0x8f7,0x8f7,0x8f7,0x8f7,0x8f4,0x80d,0x8e2, -0xb1c,0xb1c,0xb1c,0xc5d,0xc7b,0xc78,0xb3a,0x8b8,0x81f,0x81c,0x81f,0x822,0x81c,0x81f,0x81c,0x81f, -0x81c,0x81f,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81f,0x81f,0x81c,0x81f,0x81f,0x81c,0x81f,0x81f, -0x81c,0x81f,0x81f,0x81c,0x81f,0x81f,0x81c,0x81c,0xc7e,0x831,0x82b,0x831,0x82b,0x831,0x82b,0x831, -0x82b,0x831,0x82b,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b, -0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x82b,0x82e,0x831,0x82b,0x82e,0x82b,0x82e, -0x82b,0x82e,0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x82e,0x82e,0x82b,0x82e,0x82e,0x82b,0x82e,0x82e, -0x82b,0x82e,0x82e,0x82b,0x82e,0x82e,0x82b,0x82b,0x82b,0x82b,0x82b,0x831,0x82b,0x831,0x82b,0x831, -0x82b,0x82b,0x82b,0x82b,0x82b,0x82b,0x831,0x82b,0x82b,0x82b,0x82b,0x82b,0x82e,0x831,0x831,0x82e, -0x82e,0x82e,0x82e,0x900,0x903,0x834,0x837,0xc66,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x840,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0xd62,0xd62,0xe91,0x843,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0xd5c,0xd5c,0xd5c,0xd5c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x1a6a,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0xd65,0xd65,0xd65,0xd65,0x915, -0x915,0x915,0x915,0x915,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0xd65,0xd65,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x8ca,0x8ca,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x80d,0x80d, +0x801,0x801,0x801,0x801,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x804,0x804,0x8d0,0x8d0,0xe5b,0xe5b, +0xe5b,0xe5b,0xe8e,0xe8e,0x8a9,0x8a9,0xe5b,0x8a9,0x8a9,0x8a9,0x8ac,0x8a9,0xe5b,0x8a9,0x8a9,0xda7, +0x807,0x8d3,0x8d3,0x8d3,0x8d3,0x80a,0x8d3,0xe8e,0xe8e,0xe8e,0x8d3,0x8d6,0x807,0x906,0xe94,0xdaa, +0xdaa,0xe8e,0xe8e,0xe5b,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x855,0x852,0x858,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0xf12,0xf12,0xf12,0xf12,0xf12, +0xf12,0xf12,0xf12,0xf12,0xf0f,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, 0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0x110a,0x110a,0x110a,0x110a,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x85b,0x85b, -0x858,0x85b,0x858,0x85b,0x85b,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x85b, -0x858,0x85b,0x858,0x85b,0x85b,0x858,0x858,0x85b,0x85b,0x85b,0x858,0x858,0x858,0x858,0x14a0,0x14a0, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x12d8,0x12d8,0x12d8,0x12d8,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0xd5c,0xc69,0xc69,0xc69, -0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x90f,0x90f,0x90f,0x90f, +0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x85e,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x876,0x876,0x876,0x876, +0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876, +0x876,0x876,0x876,0x876,0x1137,0x1137,0x1137,0x180c,0x180c,0x180c,0x180c,0x180c,0x879,0x879,0x879,0x879, +0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, +0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x87c,0x87c,0x87c,0x87c, +0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c, +0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x885,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, +0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x885, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x885,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, +0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882, +0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x882,0x885,0x885,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, +0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882, +0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x885,0x885,0x885,0x885,0x885, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, +0x885,0x885,0x885,0x885,0x885,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x888,0x888,0x9ed,0x9ed,0x888,0x888,0x888,0x888, +0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x9ed,0x888,0x888,0x888, +0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0, +0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x89d,0x89d,0x8a0, +0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, +0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, +0x912,0x912,0x912,0x912,0x912,0x945,0x945,0x94b,0x94b,0x94b,0x90f,0x90f,0x90f,0x948,0x948,0x948, +0x948,0x948,0x948,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x94b,0x94b,0x94b,0x94b,0x94b, 0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0xc69,0xc69,0xc69, -0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0xd65,0x99c,0x97e,0x97e,0x97e, -0x97e,0x978,0x97e,0x97e,0x990,0x97e,0x97e,0x97b,0x987,0x98d,0x98d,0x98d,0x98d,0x98d,0x990,0x978, -0x984,0x978,0x978,0x978,0x96c,0x96c,0x978,0x978,0x978,0x978,0x978,0x978,0x993,0x993,0x993,0x993, -0x993,0x993,0x993,0x993,0x993,0x993,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x97b,0x96c,0x978,0x96c,0x978,0x96c,0x98a,0x981,0x98a,0x981,0x999,0x999,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b1,0x9b1,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9b4,0x9b4,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9bd,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9bd,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0xa4d,0xa4d,0xfc6,0xa4d,0xa4d,0xa4d,0xa50,0xa4d,0xfc6,0xa4d,0xa4d,0xfbd, -0xa47,0xa3b,0xa3b,0xa3b,0xa3b,0xa4a,0xa3b,0xfae,0xfae,0xfae,0xa3b,0xa3e,0xa47,0xa41,0xfb4,0xfc0, -0xfc0,0xfae,0xfae,0xfc6,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xa53,0xa53, -0xa44,0xa44,0xa44,0xa44,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4a,0xa4a,0xa3b,0xa3b,0xfc6,0xfc6, -0xfc6,0xfc6,0xfae,0xfae,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d, -0xa4d,0xa4d,0xa4d,0xa4d,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xdbc, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6b,0xa71,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143,0x1143, -0x1140,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e,0xa6e, -0xa6e,0xa6e,0xa6e,0xa6e,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xaa7,0xaa7,0xaa7,0xaaa,0xaaa,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xa8f,0xa8f,0xaa4,0xa86,0xa86,0xa86,0xa86,0xa86, -0xa86,0xa86,0xaa4,0xaa4,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x912,0x912,0x94b,0x94b,0x94b,0x90f,0x90f,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x94b,0x94b,0x94b,0x94b,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x912,0x912,0x912,0x912,0x912,0x912,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x1467,0x1467,0x91e,0x915,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x915,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, +0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0xa4a,0xa4a, +0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xa47,0xa47,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x933,0x933,0x933,0x933, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x12c3,0x939,0x939,0x939,0x939, +0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, +0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, +0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93f,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x93c,0x93c,0x93c,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x18c3,0x18c3,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x96c,0x978,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, +0x96c,0x96c,0x96c,0xa2c,0xa32,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, +0xc5d,0xc5d,0xc5d,0xc5d,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0xad4,0xad4, +0xad4,0xad4,0xad4,0xad4,0xa2c,0xa2c,0xb19,0xbfd,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, +0xb19,0xd11,0x1005,0x1005,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb31,0xb2e,0xc5d,0xc5d,0xc5d,0xc5d,0x1182, +0xd2c,0x1182,0x10b6,0x10b6,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x9d2,0x9cf,0x9d2,0x9cf,0x9d2,0x9cf,0xe46,0xe43,0xd32,0xd2f, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x97e,0x97b,0x9d2,0x9cf,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e, +0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x97e,0x97b,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x984,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x984,0x984,0x984,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x981,0x978,0x978,0x978, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0xa2c,0xad4,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xbfd,0xbfd,0xb19,0xb19,0xb19,0xb19, +0xb19,0xb19,0xc5a,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0x1017,0x1017,0x1008, +0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xb19,0xb19, +0xb19,0xb19,0xb19,0xb19,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xe4c,0xe4c,0xd11,0xd11,0xd11, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa56,0xa56,0xa56,0xa56,0xa56,0xa44,0xa80,0xa80,0xa80,0xa7a, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7a,0xa80,0xa80,0xa80,0xa80, +0xa5f,0xa5f,0xa7d,0xa7d,0xa7d,0xa7d,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa74,0xb88,0xb88,0xb88,0xb88, +0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb5e,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7a,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa5f,0xa5f,0xa5f, +0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, +0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, 0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xacb,0xacb,0xacb,0xacb,0xacb,0xab6,0xab6,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xace, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xafb,0xafb,0xafb,0xafb, -0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, -0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0x13aa,0x13aa,0x13aa,0x1ae5,0x1ae5,0x1ae5,0x1ae5,0x1ae5,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0x1ae8,0x1ae8, -0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb28,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb2b,0xb2b,0xc6c,0xc6c,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xc6c,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, -0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0x14e8, -0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xcf0,0xcf0,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xced,0xced,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, -0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, -0xb58,0xb58,0xb58,0xb58,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, -0xb5b,0xb5b,0xb5b,0xb5b,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb61,0xb6d,0xb73,0xb73,0xb73,0xb67,0xb67, -0xb67,0xb70,0xb64,0xb64,0xb64,0xb64,0xb64,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb6a,0xb6a,0xb73,0xb73,0xb73,0xb67,0xb67,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb73,0xb73,0xb73,0xb73,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb6a,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0x16f2,0x16f2, -0xb7f,0xb76,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb76,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb76,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb76,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb76,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, +0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, +0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, +0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, +0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, +0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xc57,0xc57,0xc57,0xc57,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb22,0xbdc,0xd1d,0xd14,0xd29,0xd11,0xb1f,0xb1f,0xd11,0xd11, +0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c, +0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, 0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb88,0xb88,0xb88,0xb88, +0xb79,0xb79,0xb79,0xb79,0xb79,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, +0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, +0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, +0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, +0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb82, 0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0x1aee, -0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1aee,0x1bba,0x1bba,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b, -0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, -0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe2,0xbe5, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xce4, -0xce7,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xeeb,0xeeb,0xeeb,0xeeb, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xdd7,0xe8b,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xfdb,0x1278,0x1278, -0xde0,0xde0,0xde0,0xde0,0xde0,0xde6,0xde3,0xefd,0xefd,0xefd,0xefd,0x13e9,0xfed,0x13e9,0x1332,0x1332, -0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24, -0xc24,0xc24,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0x1104,0x1101,0xff3,0xff0,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2d,0xc2d,0xc2d,0xc33, -0xc30,0xc57,0xc54,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33,0xc30,0xc33, -0xc30,0xc33,0xc30,0xc33,0xc30,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc30,0xc33,0xc30,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc30,0xc2d,0xc2d,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc3c,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc3c,0xc3c,0xc3c,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc39,0xc36,0xc36,0xc36, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f,0xc6f, -0xcea,0xd56,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xe8b,0xe8b,0xdd7,0xdd7,0xdd7,0xdd7, -0xdd7,0xdd7,0xeee,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0x129c,0x129c,0x127b, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd14,0xd14,0xd14,0xd14,0xd14,0xd11,0xd26,0xd26,0xd26,0xd20, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd20,0xd26,0xd26,0xd26,0xd26, -0xd1a,0xd1a,0xd23,0xd23,0xd23,0xd23,0xd17,0xd17,0xd17,0xd17,0xd17,0xd1d,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde9,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd20,0xd26, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd1a,0xd1a,0xd1a, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xdef,0xdef, -0xdef,0xdef,0xdef,0xdef,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0x110d,0x110d,0xff6,0xff6,0xff6, +0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb94,0xb94,0xb94,0xb94,0xb94, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0x1893, +0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6, +0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0x1890, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0xbbb,0xbbb,0xc36,0xbbb,0xbbb,0xbbb,0xc39,0xbbb,0xbbb,0xbbb,0xbbb,0xc36,0xbbb,0xbbb,0xbbb,0xbbb, +0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, +0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, +0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, +0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, +0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c, +0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55, +0xc3c,0xc3c,0xc15,0xc15,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xe70,0xe70,0xe73,0xe76,0xe70, +0xe67,0xe6a,0xe6a,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d, +0xc4e,0xc4e,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a, +0xd6b,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, +0xc5d,0xc5d,0xc5d,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xed6,0x112e,0x112e,0x112e,0x112e,0x10ad,0x10ad,0x10ad, +0x1131,0x10b0,0x10b0,0x1131,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1512,0x1512,0x1512,0x1512,0x15c9, +0xc5a,0xc5a,0xc5a,0xc5a,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, 0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xebb,0xebb,0xe0d,0xe0d,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0xf03,0x1002,0x1002,0x1005,0x1002,0x1002, -0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff, -0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19, -0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19,0xe1c,0xe19, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0x1b30, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0x1b2d, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46, -0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xf06,0xf06,0xf06,0xf06,0x1008,0x1008,0x1008,0x1008,0x1008, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, +0xc78,0xc75,0xc78,0xc78,0xc78,0xc75,0xc75,0xc78,0xc7b,0xc7e,0xc7b,0xc7e,0xc7b,0xd71,0xd71,0xd71, +0xefa,0xd6b,0xd71,0xd6b,0xc6f,0xc72,0xc6f,0xc75,0xd74,0xd74,0xd74,0xd74,0xd86,0xd89,0xefa,0xefa, +0xc87,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0x1896,0x1896,0x198c, +0xcea,0xcea,0xcea,0xcea,0xc93,0xc99,0xc9c,0xc99,0xc9c,0xc99,0xc9c,0xcd8,0xcdb,0xc99,0xc9c,0xc99, +0xc99,0xc99,0xc9c,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, +0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcf0,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xced, +0xcea,0xced,0xc93,0xc93,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, +0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, +0xcbd,0xcbd,0xcbd,0xcbd,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf, +0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf, +0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x1626,0x1626, +0x1650,0x1626,0x18f6,0x1593,0x114c,0x1038,0xce1,0xce1,0xd02,0xd02,0xd02,0xd02,0xe49,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd0e,0xd0b,0xd0b,0xd83,0xd80,0x10da,0x10d4,0x147f, +0x10d1,0x10ce,0x11af,0x11ac,0x12ae,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae, +0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd11,0xd11,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0x127e,0x127e,0x127e, +0xe4c,0xd11,0xd11,0xd11,0xd11,0x1014,0x1005,0x1005,0x1005,0x1005,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0xd23,0xd23,0xd20,0xd17,0xd20,0xd17,0xd20,0xd17,0xd20,0xd17,0xd26,0xd26,0xd26,0xd26,0xd38,0xd35, +0xe3d,0xfdb,0x117c,0x1179,0x1179,0x117c,0x1176,0x1176,0x1176,0x117c,0x117f,0x117f,0x13bf,0x1281,0x1281,0x127e, +0xd1a,0xd1a,0xd1a,0xd1a,0x1017,0x1017,0x1008,0x1008,0x1008,0x1005,0x1005,0x1005,0x1005,0x1008,0x112e,0x1008, +0x1008,0x1008,0x1005,0x1008,0x1017,0x1005,0x1005,0x1005,0x1008,0x1008,0x1005,0x1005,0x1008,0x1005,0x1005,0x1008, +0x10c2,0x10bf,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd53,0xec4, +0xe7c,0xe7c,0xe7c,0xd4d,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0xe82,0xe82,0xd4a,0xd59, +0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, +0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, +0x129f,0x129c,0x129f,0x129c,0x12a2,0x12a2,0x14ee,0x122a,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, +0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, +0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd89,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd71,0xd6b,0xe5b,0xe5b,0xe8e,0xda7,0xdaa,0xe8e,0xe8e,0xdb0, +0xdb0,0xdb0,0xdb0,0xdad,0xdad,0xe91,0xe58,0xdb0,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, +0xda1,0xda1,0xf03,0xf03,0xf00,0x1047,0xd9e,0xd9e,0xe8e,0xe5b,0xda7,0xdb0,0xdb0,0xe58,0xe58,0xda4, +0xda4,0xdad,0xdad,0xdad,0xdad,0xdad,0xe58,0xe58,0xe58,0xe8b,0xe8b,0xe8b,0xe8b,0xe5b,0xe5b,0xe5b, +0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, +0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda, +0xdda,0xdda,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xea0,0xea0,0xea0,0xea0,0xea0,0xea3, +0xea3,0xea3,0xe40,0xde0,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xdfe,0xdf2,0xe04,0xe01,0xdfb,0xdfb,0xdfb,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, +0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, +0xe19,0xe19,0xe19,0xe1c,0xe19,0xe19,0xe1f,0xe1f,0xe2e,0xe2e,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe61,0xe3a,0xeb8,0xeb8,0xeb8,0xeb8,0xe3a,0xe3a,0xeb8,0xeb8,0xebb,0x1251, +0x1230,0x1230,0xe61,0xe61,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0x11ca,0x121b, +0x121b,0x121b,0x11ca,0x11ca,0xeb8,0xeb8,0xe3a,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, 0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe5b, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe64,0xe6d,0x1014,0x100e,0x101d,0x100b,0xe6a,0xe6a,0x100b,0x100b, -0xe7c,0xe7c,0xe70,0xe7c,0xe7c,0xe7c,0xe73,0xe7c,0xe7c,0xe7c,0xe7c,0xe70,0xe7c,0xe7c,0xe7c,0xe7c, -0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe61,0xe61,0xe61,0xe61,0xe52,0xe52,0xe52,0xe52,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, +0x1218,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, 0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97, -0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0xeeb,0xeeb,0xeeb,0xee8,0xee8,0xee8,0xee8,0xee8,0x114f,0x139b,0x139b,0x139b,0x139b,0x131d,0x131d,0x131d, -0x139e,0x1320,0x1320,0x139e,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x17a6,0x17a6,0x17a6,0x17a6,0x186c, -0xf00,0xf00,0xf00,0xf00,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6,0xff6, -0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9,0xff9, -0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fd,0x1875,0x1875,0x18f6,0x1875,0x1bd8,0x17ac,0x1335,0x1158,0xf03,0xf03, -0xf21,0xf21,0xf21,0xf21,0xf33,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c,0xf3f,0xf3c, -0xf3c,0xf3c,0xf3f,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c, -0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf24,0xf21,0xf21,0xf21,0xf21,0xf21,0xf21,0xf36, -0xf21,0xf36,0xf33,0xf33,0xf48,0xf45,0xf48,0xf48,0xf48,0xf45,0xf45,0xf48,0xf45,0xf48,0xf45,0xf48, -0xf45,0x102f,0x102f,0x102f,0x116d,0x1026,0x102f,0x1026,0xf45,0xf48,0xf45,0xf45,0x1026,0x1026,0x1026,0x1026, -0x1029,0x102c,0x116d,0x116d,0xf4b,0xf4b,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1038,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51, -0xf51,0xf51,0xf51,0xf51,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66, -0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66, -0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xfae,0xfc6,0xfbd,0xfc3,0xfc3,0xfc6,0xfc6,0xfbd, -0xfbd,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc6,0xfc6,0xfc6,0xfae,0xfae,0xfae,0xfae,0xfc6,0xfc6,0xfc6, -0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfae,0xfbd,0xfc0,0xfae,0xfae,0xfc3, -0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfb1,0xfc6,0xfc3,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, -0xfba,0xfba,0x1137,0x1137,0x1134,0x1131,0xfb7,0xfb7,0xfde,0xfde,0xfde,0xfde,0x129c,0x129c,0x127b,0x127b, -0x127b,0x1278,0x1278,0x1278,0x1278,0x127b,0x13a1,0x127b,0x127b,0x127b,0x1278,0x127b,0x129c,0x1278,0x1278,0x1278, -0x127b,0x127b,0x1278,0x1278,0x127b,0x1278,0x1278,0x127b,0xff9,0xff9,0xff9,0xff9,0xff9,0xff6,0xff6,0xff9, -0xff9,0xff9,0xff9,0xff9,0xff9,0x14f4,0x14f4,0x14f4,0x110d,0xff6,0xff6,0xff6,0xff6,0x12a8,0x1284,0x1284, -0x1284,0x1284,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x101a,0x101a,0x1017,0x1011,0x1017,0x1011,0x1017,0x1011, -0x1017,0x1011,0x100e,0x100e,0x100e,0x100e,0x1023,0x1020,0x100e,0x116a,0x13f5,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13fb,0x13fb,0x150f,0x1503,0x1503,0x1500,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1035,0x1032,0x1032,0x1041,0x1038,0x1341,0x133e,0x16fb,0x1341,0x133e,0x1404,0x1401,0x1512,0x1512,0x1518,0x1512, -0x1518,0x1512,0x1518,0x1512,0x1518,0x1512,0x1518,0x1512,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038, -0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1038,0x103b,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038, -0x1038,0x1041,0x1038,0x1041,0x1038,0x1041,0x1041,0x1038,0x1044,0x1044,0x104a,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x104a,0x1044,0x1044,0x1044,0x1044,0x104a,0x104a, -0x1044,0x1044,0x104d,0x140d,0x140a,0x140a,0x1050,0x1050,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, -0x1047,0x1047,0x1410,0x1410,0x1410,0x1410,0x1410,0x1410,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e, -0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e,0x106e, -0x1071,0x1071,0x1071,0x1074,0x1071,0x1071,0x1077,0x1077,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1086,0x107d,0x108c,0x1089,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x1347,0x1344,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109b,0x111f,0x108f,0x108f,0x108f,0x1095,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1092,0x1092,0x1095,0x10a1,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098, -0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x109e,0x1098,0x1527,0x1524,0x1527,0x1524,0x152a,0x152a,0x1704,0x1413, -0x10aa,0x10aa,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, -0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b6,0x10b6,0x10b6,0x1116,0x10bf,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10f2,0x10f2,0x10f2,0x10f2, +0xe7f,0xe7f,0xe7f,0xe7f,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff6, +0xff6,0xff6,0xed3,0x1659,0x111c,0x1002,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, +0x111c,0x1002,0x111c,0x1002,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1044,0x1044,0x1044,0x1044,0x1044,0x1098,0xef1,0xfed,0xef1,0xef1,0xef1,0xef1,0xeeb,0xeeb,0xeeb,0xef1, +0x1476,0x1479,0x166e,0x16fe,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c, +0x102c,0x102c,0x102c,0x102c,0xf0c,0x102c,0x102c,0x102c,0xf09,0xf09,0xf09,0xefd,0xefd,0xefd,0x102c,0xf06, +0x13fb,0x12bd,0x13da,0x13da,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, +0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, +0xf12,0xf12,0xf12,0xf12,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, +0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, +0xf1b,0xf1b,0xf1b,0xf1b,0xf21,0xf21,0xf21,0xf1e,0xf1e,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1e,0xf1b, +0xf1b,0xf1b,0xf21,0xf1e,0xf21,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, +0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, +0xf1b,0xf21,0xf1e,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, +0xf1b,0xf1b,0xf1b,0x191a,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1755,0x174f,0x1911,0x1911,0x1911, +0x1914,0x190e,0x1914,0x190e,0x104a,0x104a,0x104a,0xf2d,0xf30,0xf30,0xf30,0xf30,0xf30,0x102f,0x102f,0x102f, +0xf30,0xf30,0xf30,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, +0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x104d,0xf2d,0xf2d,0x104a,0x104a,0x104a,0x104a,0xf2d,0xf2d, +0x104a,0x104a,0xf2d,0xf2d,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, +0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, +0xf36,0xf36,0xf36,0xf36,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035, +0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0xf57, +0xf57,0xf57,0xf57,0xf57,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, +0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, +0xf6c,0xf6c,0xf6c,0xf6c,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf78, +0xf75,0xf75,0xf75,0xf75,0xf72,0xf72,0xf72,0x105f,0x105f,0x105f,0x105f,0xf72,0xf72,0x1065,0x1062,0xf6f, +0xf6f,0xf7e,0xf7b,0xf7b,0x105f,0x105f,0xf72,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf78,0xf75, +0xf78,0xf75,0xf75,0xf75,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0x106b,0x106b,0x106e,0x106e,0xf93,0x106b, +0x106b,0x106b,0x106b,0x106b,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xf9f,0xf9f,0x1071,0xf9f,0x1071,0x1071,0x1071,0xfa8,0xfa8,0x1071,0x1071,0xfa8,0xf9f,0xfa8, +0xfa8,0xf9f,0x1071,0x1074,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, +0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, +0xfb1,0xfb1,0xfb1,0xfb1,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, +0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, +0xfba,0xfba,0xfb7,0xfbd,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0xfc3,0xfc0,0xfc0,0xfc0,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xff0,0xff0, +0xff0,0xff0,0x111f,0x1113,0xffc,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x1581, +0x1581,0x1581,0x1581,0x1581,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0x1263, +0x1263,0x17bb,0x17bb,0x17bb,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3, +0xff3,0xff3,0xff3,0xff3,0x111c,0x111c,0x1002,0x111c,0x111c,0x111c,0x1002,0x111c,0x111c,0x111c,0xffc,0xffc, +0xffc,0xffc,0xffc,0x1116,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xfff,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0xfff,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1173,0x1173, +0x1728,0x17bb,0x17bb,0x17bb,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xfff,0x1119,0xfff, +0xfff,0x1119,0x1119,0xfff,0x1008,0x1008,0x10ad,0x1005,0x10ad,0x10ad,0x10ad,0x10ad,0x1005,0x1005,0x1017,0x1005, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1008,0x1017,0x1017,0x1008,0x1017,0x1005,0x1008,0x1008,0x100b,0x1017,0x1005, +0x1005,0x1017,0x1008,0x1008,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, +0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, +0x101d,0x101d,0x101d,0x101d,0x101d,0x18c3,0x18c3,0x18c3,0x18c3,0x193b,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, +0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, +0x18fc,0x18fc,0x18fc,0x1a34,0x1a34,0x1a34,0x1a34,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x10d1,0x10ce,0x10d1,0x10ce, +0x10d1,0x10ce,0x10d1,0x10ce,0x10d1,0x10ce,0x11b2,0x12b4,0x12b4,0x12b4,0x152a,0x167d,0x12b4,0x12b4,0x1482,0x1482, +0x1482,0x147c,0x1482,0x147c,0x1683,0x1680,0x173a,0x1737,0x173a,0x1737,0x173a,0x1737,0x10f2,0x10f2,0x10f2,0x10f2, 0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10fb,0x10fb,0x10fb,0x10fb, -0x1110,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x110a,0x110a,0x110a,0x110a, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x149d,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x117f,0x117f,0x117f,0x117f, -0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f,0x117f, -0x117f,0x117f,0x1176,0x1176,0x1179,0x1179,0x117f,0x1176,0x1176,0x1176,0x1176,0x1176,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185, -0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x1185,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11a9,0x11af,0x11bb,0x11bb,0x11bb,0x11bb, +0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10fe,0x1167,0x10fe,0x1104, +0x1104,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1167,0x1167,0x1167,0x1167, +0x1167,0x1167,0x1167,0x1167,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1122,0x1125,0x1125,0x1125,0x1122,0x1125,0x1122,0x1125,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1125, +0x1125,0x1125,0x1125,0x1122,0x1125,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1266,0x1266, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x14dc,0x14dc,0x14dc, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x14dc,0x14dc,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1266,0x1266,0x1269,0x1269,0x1125,0x1125,0x1128,0x1128,0x1128,0x13ce,0x1125,0x1128, +0x1125,0x1125,0x1128,0x1278,0x1278,0x1269,0x1269,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x13ce,0x1269,0x1269,0x1269, +0x14dc,0x14dc,0x14dc,0x150c,0x150c,0x150c,0x150c,0x150c,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1125,0x1269,0x1128,0x1128,0x1125,0x1125,0x1128,0x1128, +0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128, +0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125, +0x1128,0x1125,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1125,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1128,0x1125,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x13ce,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x14dc,0x1170,0x1170,0x1170,0x1170,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1269,0x14dc,0x14dc,0x14dc,0x14dc,0x1464,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1278,0x1278,0x1269,0x1269,0x1269,0x1269,0x1587,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1125,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125, +0x1125,0x1212,0x1125,0x1212,0x1125,0x1212,0x1125,0x1212,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1212,0x1212,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1212,0x1212,0x1125,0x1125,0x1125,0x1125, +0x1212,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x13ce,0x13ce,0x14dc, +0x14dc,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1128,0x1128,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1125,0x1125,0x1125,0x1128, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x1140,0x113d,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x118b,0x1293,0x118b,0x118b, +0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x1188,0x1188,0x1188,0x1290,0x1290,0x1290,0x1290,0x1290,0x1293,0x146d, +0x146d,0x1857,0x151b,0x151b,0x151b,0x151b,0x151b,0x151e,0x151e,0x151e,0x17ca,0x17ca,0x11bb,0x11bb,0x11bb,0x11bb, 0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11c1,0x11c1,0x11c1,0x11c1, -0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x12ed,0x11c7,0x12f0, -0x11c7,0x11c7,0x11c7,0x11c7,0x11c4,0x11c4,0x11c4,0x11c7,0x1707,0x170a,0x1932,0x192f,0x11ca,0x11ca,0x11ca,0x11d9, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11cd, -0x11d9,0x11d9,0x11ca,0x11ca,0x11ca,0x11ca,0x11d9,0x11d9,0x11ca,0x11ca,0x11d9,0x11d9,0x11eb,0x11eb,0x11eb,0x11eb, -0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11ee,0x11eb,0x11eb,0x11eb, -0x11eb,0x11eb,0x11eb,0x11e5,0x11e5,0x11e5,0x11eb,0x11e8,0x1530,0x1533,0x1536,0x1536,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11f1,0x11fd,0x11f1,0x11f1, -0x11f1,0x1206,0x1206,0x11f1,0x11f1,0x1206,0x11fd,0x1206,0x1206,0x11fd,0x11f1,0x11f4,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x1218,0x1218,0x1218,0x1218, -0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218, -0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x122d,0x122d,0x122d,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124e,0x125a,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x1260,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x125d,0x125d,0x125d,0x125a,0x125a,0x125a,0x124e, -0x124e,0x124e,0x124e,0x125a,0x125a,0x1254,0x1251,0x1257,0x1257,0x1266,0x1263,0x1263,0x1269,0x1269,0x1269,0x1269, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x1758,0x11c1,0x11c1,0x11c1,0x11c1, +0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1, +0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x1242,0x11f4,0x11f7,0x11f7, +0x11f4,0x11fa,0x11fa,0x11e8,0x11eb,0x14fd,0x1500,0x1500,0x1500,0x1365,0x17df,0x182a,0x11ee,0x11ee,0x11ee,0x11ee, +0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x1362,0x14a6,0x14a9,0x14a3,0x14ac,0x14ac,0x123f,0x123f,0x11f1,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f1, +0x11f1,0x11f1,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x11f1,0x1209,0x1209,0x1209,0x1209, +0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, +0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1236,0x1236,0x1236,0x1221, +0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, +0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1596,0x1596,0x1518,0x14eb, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1227,0x1227,0x1227,0x1227, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x13ef,0x1269,0x1269,0x1269,0x1269, 0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x126f,0x126f,0x126f,0x126c, -0x126c,0x126c,0x1269,0x1269,0x1269,0x1269,0x126c,0x1269,0x1269,0x1269,0x126f,0x126c,0x126f,0x126c,0x1269,0x1269, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1269,0x1269,0x1269,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1275,0x1275,0x1275,0x126c,0x126c,0x126c,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1278,0x1269,0x1269,0x1269,0x1269,0x13d1,0x13d1,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1584,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, 0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x126f,0x126c,0x126c,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1be1,0x1a07,0x1a07,0x1a07,0x1a07, -0x1a07,0x1a07,0x1a07,0x1a0a,0x1a04,0x1bf3,0x1bf3,0x1bf3,0x1bf6,0x1bf0,0x1bf6,0x1bf0,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128d,0x128d,0x128d,0x1272,0x1938,0x1398,0x1296,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1296,0x1398,0x1296,0x127b,0x127b,0x1323,0x1278, -0x1323,0x1323,0x1323,0x1323,0x1278,0x1278,0x129c,0x1278,0x1278,0x1278,0x1278,0x1278,0x1278,0x127b,0x129c,0x129c, -0x127b,0x129c,0x1278,0x127b,0x127b,0x127e,0x129c,0x1278,0x1278,0x129c,0x127b,0x127b,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1287,0x1287,0x1287,0x1287,0x13ad,0x138f,0x1290,0x13ad,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1836,0x1836,0x1836,0x1836,0x1836,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1539,0x1539,0x1a88,0x1a88,0x1a88,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1398,0x1398,0x1296,0x1398, -0x1398,0x1398,0x1296,0x1398,0x1398,0x1398,0x1290,0x1290,0x1290,0x1290,0x1290,0x1392,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1293,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1293,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1416,0x1416,0x19e6,0x1a88,0x1a88,0x1a88,0x1395,0x1395,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1293,0x1395,0x1293,0x1293,0x1395,0x1395,0x1293,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7, -0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x1341,0x133e,0x1341,0x133e, -0x1341,0x133e,0x1341,0x133e,0x1341,0x133e,0x1404,0x1518,0x1518,0x1518,0x17b2,0x1926,0x1518,0x1518,0x16fe,0x16fe, -0x16fe,0x16f8,0x16fe,0x16f8,0x1929,0x1926,0x19e3,0x19e0,0x19e3,0x19e0,0x19e3,0x19e0,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x137a,0x136b,0x137a,0x1380, -0x1380,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d, -0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x137d,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136b,0x136b,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x13b6,0x13b3,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bc,0x13bf,0x13bf,0x13bf,0x13bc,0x13bf,0x13bc,0x13bf,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bc,0x13bf,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, -0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x1542,0x1542, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1788,0x1788,0x1788, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1788,0x1788,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1542,0x1542,0x1545,0x1545,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x16b3,0x13bf,0x13c2, -0x13bf,0x13bf,0x13c2,0x1548,0x1548,0x1545,0x1545,0x1788,0x1788,0x1788,0x1788,0x1788,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x16b3,0x1545,0x1545,0x1545, -0x1788,0x1788,0x1788,0x178b,0x178b,0x178b,0x178b,0x178b,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x13bf,0x1545,0x13c2,0x13c2,0x13bf,0x13bf,0x13c2,0x13c2, -0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2, -0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf, -0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13c2,0x13c2,0x13c2,0x13bf,0x13c2,0x13c2,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13c2,0x13bf,0x13c2,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x16b3,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1788,0x1419,0x1419,0x1419,0x1419,0x1542,0x1542,0x1542,0x1542, -0x1542,0x1542,0x1545,0x1788,0x1788,0x1788,0x1788,0x170d,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1548,0x1548,0x1545,0x1545,0x1545,0x1545,0x183f,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1545,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x14a3,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x13c5, -0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x14a3,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x14a3,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5,0x14a3,0x13c5,0x14a3,0x14a3,0x13c5,0x13c5,0x13c5,0x13c5, -0x14a3,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x16b9,0x16b9,0x178e, -0x178e,0x13c8,0x13c8,0x13c8,0x13c5,0x13c5,0x13c5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1638,0x1638,0x1638,0x1638, -0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x13cb,0x13cb,0x13cb,0x13cb, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13ce, -0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, -0x13ce,0x13ce,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1, -0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x13d1,0x17bb,0x17bb,0x17b8,0x1710, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141f,0x141f,0x141f,0x141f, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x154e,0x1422,0x1551,0x1422,0x1422, -0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1713, -0x1713,0x1b5d,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1a8b,0x1a8b,0x142b,0x142b,0x142b,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x1458,0x1458,0x1458,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e, -0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x19ec,0x1461,0x1461,0x1461,0x1461, -0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, -0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1467,0x1467,0x1473,0x1479, -0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479, -0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1473, -0x1473,0x1473,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1473,0x1476,0x1479,0x147c,0x147c, -0x1479,0x147f,0x147f,0x146a,0x146d,0x1719,0x171c,0x171c,0x171c,0x1557,0x1a94,0x1a91,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1554,0x1722,0x1725,0x171f,0x1728,0x1728,0x149a,0x149a,0x149a,0x149a, -0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, -0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x190e,0x190e,0x190e,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x19da,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x1872,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548,0x1545,0x1545,0x1545,0x1545,0x16b6,0x16b6,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x183c,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x157e,0x157e,0x157e,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15ab,0x15ab,0x15ab,0x159f,0x159f,0x159f,0x15ab,0x15ab,0x159f,0x15ae,0x15a2,0x159f,0x15b4,0x15b4,0x15a8,0x15b4, -0x15b4,0x15a5,0x17c4,0x1bed,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15b7,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf, -0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15c9, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15e7,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x1608,0x1608,0x1608,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1608, -0x1608,0x15fc,0x1608,0x15ff,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162c,0x162c,0x162c,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, -0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x163e,0x163e,0x163e,0x163b,0x163b,0x163b, -0x1638,0x1638,0x1638,0x1638,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1653,0x1653,0x1647,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1656,0x1656,0x1656,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, -0x1689,0x1689,0x1689,0x1689,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x168c,0x169b,0x169b,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x169b,0x168c,0x169e, -0x169e,0x168c,0x169e,0x168c,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, +0x1269,0x1269,0x1269,0x1269,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae, +0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x127b, +0x12b7,0x12b7,0x12b7,0x12b7,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1a3d,0x17c4,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1662,0x1662,0x1662,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x172b,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x15c9,0x1662, +0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x12e1,0x12e1,0x12d5,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12f9,0x12f9,0x12f9,0x12f9, +0x12f9,0x12f9,0x12f9,0x12f9,0x12f0,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9, +0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x130e,0x130e,0x130e,0x130e, +0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e, +0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x132c,0x132c,0x132c,0x132c, +0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c, +0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x132f,0x132f,0x132f,0x133e,0x133e,0x133e,0x133e, +0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e, +0x133e,0x133e,0x133e,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x1347,0x1347,0x1347,0x1347, +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1422,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x136e,0x136e,0x136e,0x142b,0x142b,0x142b,0x136e,0x136e, +0x142b,0x1434,0x142e,0x1431,0x1374,0x1374,0x136b,0x1374,0x1374,0x1368,0x15a2,0x191d,0x1383,0x1383,0x1383,0x1383, +0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1437,0x137d,0x137d,0x1437, +0x1437,0x1437,0x1437,0x1437,0x1437,0x137d,0x1437,0x1380,0x1380,0x1437,0x1380,0x1437,0x1383,0x1383,0x1383,0x1383, +0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383, +0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139b,0x139b,0x139b,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x139b,0x139b,0x1443,0x139b,0x1446,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13b6,0x13b6,0x13b6,0x13b6, +0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6, +0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x1662,0x1662,0x1662,0x1662, +0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x146a,0x146a,0x146a,0x146a,0x1662,0x1662,0x1662,0x1662, +0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x172b,0x1470,0x1470,0x1470,0x1470, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1494,0x1494,0x1494,0x1494, +0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494, +0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x1494,0x1494,0x1494,0x1494,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14f7,0x1494,0x1494, +0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af, +0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af, +0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14b5,0x14b2,0x14af,0x14af,0x14af,0x14af, +0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1809,0x1791,0x1791,0x1794,0x14dc,0x14dc,0x14dc,0x14dc, +0x14dc,0x14dc,0x14dc,0x14dc,0x14df,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x160e,0x14dc,0x14dc,0x14dc,0x14dc, +0x14dc,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x14dc,0x16e3,0x16e3,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806,0x18bd,0x1794,0x1794,0x1794,0x160b,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160b,0x160b,0x14e2,0x14e2,0x14e2,0x14e2, +0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, +0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x1584,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1587,0x1584,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x1587,0x160e,0x160e,0x1587, +0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1584,0x150f,0x1587,0x1587,0x1587,0x1791,0x1584,0x1584,0x1584,0x1584, +0x1584,0x1584,0x150f,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x16e3,0x16e3,0x16e3,0x1584,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x153f,0x153f,0x153c,0x153c, +0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, +0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153f,0x153f,0x153f,0x153f, +0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f, +0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x1572,0x1572,0x1572,0x1572, +0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, +0x1572,0x156f,0x156f,0x156f,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1572,0x1572,0x1572,0x1572, +0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, +0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x158d,0x158d,0x158d,0x158d, +0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d, +0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x16ef,0x16ef,0x16ef, +0x16ef,0x16ef,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, +0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d, +0x158d,0x158d,0x158d,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x17ca,0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17ca,0x185d,0x1860,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x16f8,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1620,0x1620,0x1620,0x1620,0x1767,0x1767,0x15f0,0x15f0,0x15f0,0x15f0,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x15ed,0x1644,0x1653,0x15e4,0x15f3,0x15f3,0x1698,0x15e7,0x15e7, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1647,0x164d,0x164a,0x164a,0x164a,0x164a,0x15ff,0x1602,0x164a,0x164a,0x164a,0x164a,0x15fc, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x1791,0x1806,0x16e3,0x16e3,0x16e3,0x16e3,0x1809,0x1806,0x18bd,0x16e3,0x1791,0x16e3,0x16e3,0x16e3,0x16e3, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x18c3,0x18c3,0x18c3, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x18c6,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1623,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, 0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, -0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, -0x16aa,0x16aa,0x16aa,0x16aa,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x16f5,0x16f5,0x16f5,0x16f5,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x19da,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x175b,0x1758,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, +0x16a1,0x16a1,0x16a1,0x16a1,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, +0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, +0x16bf,0x16bf,0x16bf,0x16bf,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, +0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, +0x16dd,0x16da,0x16da,0x16da,0x16e3,0x16e3,0x16e3,0x1806,0x1806,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806, +0x1806,0x1806,0x1791,0x1791,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e6,0x16e6,0x16e3,0x16e6,0x16e6,0x1791,0x1794, +0x1791,0x1791,0x1791,0x1791,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1725,0x1725,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, +0x1743,0x1743,0x1743,0x1743,0x178e,0x178e,0x1743,0x178e,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, +0x1743,0x1749,0x1749,0x1749,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, 0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x1779, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x177c,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x1af7,0x1a4c,0x1a4c,0x1a4f,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x179a,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x18e4,0x1797,0x1797,0x1797,0x1797,0x1797,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x1797,0x19c5,0x19c5,0x1a4c,0x1a4c,0x1a4c,0x1a4c,0x1a4c, -0x1a4c,0x1a4c,0x1a4c,0x1af4,0x1bc6,0x1a4f,0x1a4f,0x1a4f,0x18e1,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, -0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e1,0x18e1,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, -0x1b5d,0x1b60,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x1b5a,0x193b,0x17be,0x17be,0x17be,0x17be, -0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1848,0x1845, -0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x1848,0x18e4,0x18e4,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1845,0x17c7,0x1848,0x1848,0x1848,0x1a4c,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x17c7,0x1845, -0x1845,0x1845,0x1845,0x1845,0x18e1,0x19c5,0x19c5,0x19c5,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18e1,0x17dc,0x17dc,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc, -0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc, -0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x1827,0x1827,0x1827, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, -0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x18a8,0x18a8,0x18a8,0x18a8,0x19fe,0x19fe,0x18ab,0x18ab, -0x18ab,0x18ab,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x1893,0x18a5, -0x1896,0x1899,0x189c,0x18ae,0x18ae,0x194d,0x189f,0x189f,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, -0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, -0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18b4,0x18ba,0x18b7,0x18b7,0x18b7, -0x18b7,0x18c6,0x18cc,0x18b7,0x18b7,0x18b7,0x18b7,0x18c3,0x18c9,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7, -0x18b7,0x18b7,0x18b7,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, -0x18d5,0x18d5,0x18d5,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb, -0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1aeb,0x1bb7,0x1bb7,0x1bb7,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, -0x18e1,0x18e1,0x18e1,0x18e1,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x1a4c,0x1af4,0x19c5,0x19c5,0x19c5,0x19c5,0x1af7, -0x1af4,0x1bc6,0x19c5,0x1a4c,0x19c5,0x19c5,0x19c5,0x19c5,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x19c5, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, -0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, -0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x1bc9,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, -0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962, -0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x1962,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, -0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, -0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4, -0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4, -0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19a4,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19aa,0x19aa,0x19aa,0x19c5,0x19c5,0x19c5,0x1af4,0x1af4,0x1a4c,0x1a4c,0x1a4c, -0x1a4c,0x1a4c,0x1a4c,0x1af4,0x1af4,0x1af4,0x1a4c,0x1a4c,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c8,0x19c8,0x19c5, -0x19c8,0x19c8,0x1a4c,0x1a4f,0x1a4c,0x1a4c,0x1a4c,0x1a4c,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28, -0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a67,0x1a67,0x1a31,0x1a67,0x1a31,0x1a31,0x1a31,0x1a31, -0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a37,0x1a37,0x1a37,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43, -0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43, -0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1a43,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, -0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2, -0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2, -0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, -0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09, -0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b09,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e, -0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b7e,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f, -0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1b9f,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1, -0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb1,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4, -0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1bb4,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e, -0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0e,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d, -0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c4d,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0,0,0,0 +0x1773,0x1773,0x1773,0x1773,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, +0x1788,0x1788,0x1788,0x1788,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, +0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, +0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, +0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1806,0x1806,0x1806,0x1806, +0x1806,0x1806,0x1806,0x1806,0x1806,0x18bd,0x18bd,0x18bd,0x18bd,0x1935,0x1935,0x1935,0x1806,0x1806,0x1806,0x1806, +0x1806,0x1806,0x1806,0x18bd,0x18bd,0x18bd,0x18bd,0x1935,0x1935,0x1935,0x19f2,0x1935,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18a5,0x18a5,0x18a5,0x18a5, +0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5, +0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18b1,0x18b1,0x18b1,0x18b1, +0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, +0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x1902,0x1902,0x1902,0x1902, +0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x18ff,0x18ff,0x18ff, +0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x193b,0x193b,0x193b,0x193b, +0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b, +0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x1965,0x1965,0x1965,0x1965, +0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, +0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x196e,0x196e,0x196e,0x196e, +0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, +0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x1971,0x1971, +0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, +0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, +0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998, +0x1998,0x1998,0x199e,0x199e,0x199e,0x199e,0x19a7,0x199e,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, +0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0, +0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0, +0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x1a13,0x1a13,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19dd,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, +0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, +0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+5368, + propsVectorsTrie_index+5924, nullptr, - 5368, - 27396, + 5924, + 37208, 0xa40, - 0x1578, + 0x17a4, 0x0, 0x0, 0x110000, - 0x7ff8, + 0xa878, nullptr, 0, false, false, 0, nullptr }; -static const uint32_t propsVectors[7260]={ -0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, -0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0,0,0x1267,0, -0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0,0x1767,0,0, -0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67,0,0,0x1f67, -0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0,0,0x2567,0, -0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000,0x2b67,0,0, -0x2d67,0,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67,0,0,0x3e67, -0,0,0x4067,0,0,0x4167,0,0,0x4467,0,0,0x4867,0,0,0x4967,0, -0,0x4a67,0,0,0x5067,0,0,0x5167,0,0,0x5467,0,0,0x5567,0,0, -0x5667,0x80000,0x20,0x5767,0,0,0x5867,0,0,0x5967,0,0,0x5b67,0,0,0x5c67, -0,0,0x5d67,0,0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0, -0,0x6567,0,0,0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0, -0x7667,0,0,0x7767,0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67, -0,0,0x7e67,0,0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8467,0, -0,0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8967,0,0,0x8b67,0,0, -0x8c67,0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267, -0,0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0, -0,0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0, -0xa367,0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867, -0,0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0, -0,0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb467,0,0, -0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0,0,0xbc67, -0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0,0xc167,0, -0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767,0,0,0xc867,0,0, -0xc967,0,0,0xca67,0,0,0xcc67,0,0xe00000,0xcf67,0,0xe00000,0xd067,0,0xe00000,0xd367, -0,0,0xd467,0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xda67,0, -0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0, -0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567, -0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0, -0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0, -0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867, -0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0, -0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0, -0x10667,0,0,0x10767,0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67, -0,0,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0, -0,0x11367,0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0,0, -0x11867,0,0,0x11967,0,0xe00000,0x11a67,0,0,0x11b67,0,0,0x11c67,0,0,0x11d67, -0,0,0x11e67,0,0,0x11f67,0,0,0x12067,0,0,0x12167,0,0,0x12267,0, -0,0x12367,0,0,0x12467,0,0,0x12567,0,0,0x12667,0,0,0x12767,0,0, -0x12867,0,0,0x12967,0,0,0x12a67,0,0xe00000,0x12b67,0,0,0x12c67,0,0,0x12d67, -0,0,0x12f67,0,0,0x13067,0,0,0x13167,0,0,0x13267,0,0,0x13367,0, -0,0x13467,0,0,0x13567,0,0,0x13667,0,0,0x13767,0,0,0x13867,0,0, -0x13967,0,0,0x13a67,0,0,0x13b67,0,0,0x13c67,0,0,0x13d67,0,0,0x13f67, -0,0,0x14067,0,0,0x14167,0,0,0x14367,0,0,0x14467,0,0,0x14567,0, -0,0x14667,0,0,0x14767,0,0,0xa0067,0,0xe00000,0xa4f67,0,0xe00000,0xa5f67,0,0xe00000, -0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000,0xb2e67,0,0xe00000,0xb4867, -0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001, -0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x200000,0x11000200,0x24000008,0x1710000, -0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319, -0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100, -0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400, -0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400,0x11000600, -0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800,0x7c00500, -0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500,0x220402, -0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e, -0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100, -0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x201000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400, -0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000a03,0xc000010,0x1049400,0x11000b13,0x2802500,0x962460,0x11000b13, -0x4000000,0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100, -0x2633800,0x11000c00,0x80000000,0x1329960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400, -0x11000c02,0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02, -0x7c00100,0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000f01,0x2802400,0x962460,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400, -0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401, -0x11001004,0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004, -0x6800100,0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400, -0x962460,0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460, -0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f, -0x2802400,0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100, -0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540, -0x11001423,0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524, -0x2806400,0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400, -0x962460,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460, -0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926, -0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000, -0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460, -0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18, -0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100, -0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001, -0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800, -0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000, -0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000, -0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800, -0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x1248002,0x11002800,0x40000001, -0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x2880000,0x2a65620,0x11002801,0x2882000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f, -0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900, -0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000, -0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f, -0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00, -0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000, -0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000, -0x11002e00,0x24000020,0x200001,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00, -0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020, -0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000, -0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700, -0x24000000,0x2800000,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x2800000,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005, -0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005102,0x7000100,0x230408,0x11005102, -0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500,0x80000, -0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100,0x230409, -0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002,0x11020200, -0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x200000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000, -0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100,0x220400, -0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402,0x11020319, -0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600,0x4000400, -0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400,0x962461, -0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401,0x11020908, -0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800,0x24000000, -0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002,0x370000, -0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000,0x11022800, -0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00,0x4000000, -0x100002,0x11022c00,0x4000000,0x10000f,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100,0x250401, -0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402,0x11022e00, -0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000, -0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100,0x150403,0x11023400,0x24000000,0x100000, -0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700, -0x24000020,0x100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000, -0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a, -0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700, -0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010, -0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011, -0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe29811,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719, -0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x1329800,0x11080100,0x24000000, -0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000, -0x11080100,0x24000000,0x2410000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100, -0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400, -0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400, -0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200, -0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000, -0xe00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002, -0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14, -0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100, -0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402, -0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500, -0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000, -0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010, -0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400, -0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010, -0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c, -0x110a5400,0xc000010,0xb4800c,0x11400c0c,0x4000010,0xb00000,0x11400c0c,0x4000010,0x1071400,0x11400c17,0xc000010,0xb48000,0x11400c1e,0x7c00900,0x230400,0x11400f4b, -0xc000010,0x448000,0x11400f5f,0xc000010,0x448000,0x11401d94,0x4000000,0x200000,0x11403dcc,0x4000000,0xe00000,0x114457c1,0x4000008,0x81000a,0x114457c1,0x4000008, -0x141000a,0x114457c1,0x4000010,0x87000a,0x114457c1,0x6800004,0x120000a,0x114457c1,0xc000010,0x84800a,0x114457ca,0x3802500,0x126246a,0x114457ca,0x7c00d00,0x2530c0a, -0x114a3dc1,0x24000000,0x810000,0x114a3dc1,0x24000000,0x1410000,0x114a3dc1,0x24000008,0x810000,0x114a3dc1,0x24000008,0x1410000,0x114a3dc1,0x24000010,0x870000,0x114a3dc1, -0x2c000010,0x848000,0x114a3dc7,0x4000000,0xe00000,0x114a3dc7,0x24000000,0xe00000,0x114a3dc7,0x24000002,0xe00000,0x114a3dc7,0x24000002,0x1200000,0x114a3dc7,0x24000008, -0x810000,0x114a3dc7,0x24000008,0x1410000,0x114a3dca,0x7c00900,0x930c00,0x114a3dca,0x7c00900,0xe30c00,0x114a3dcc,0x7c00300,0xe30000,0x114a3eca,0x7000400,0x1200c02, -0x114a3fc1,0x6800004,0x1200000,0x114a3fca,0x7c00d00,0x2530c00,0x114a42cc,0x4000000,0xe00000,0x114a42cc,0x4000000,0xe0000f,0x114a44cc,0x4000000,0xe00002,0x114a44cc, -0x4000000,0xe00003,0x114a45cc,0x4000000,0xe00002,0x114a45cc,0x4000000,0xe0000d,0x11505113,0x24000000,0x810000,0x11505113,0x24000000,0x1410000,0x1180090a,0x2802400, -0x962460,0x11800c27,0x2802100,0x962460,0x11800c27,0x2802500,0x962460,0x11800f32,0x2802400,0x962460,0x11800f3f,0x2802400,0x962460,0x11820700,0x2802400,0x962460, -0x11820700,0x2802500,0x962460,0x118a3dcd,0x2802400,0x962460,0x118a3eca,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c2c, -0x6800000,0x1329800,0x11c00c30,0xc000010,0xb48000,0x11c00f78,0x6800000,0x1329800,0x11c0107d,0x6800000,0x1329800,0x11c01181,0x6800000,0x1329800,0x11c01285,0x6800000, -0x1329800,0x11c01489,0x4000000,0x200000,0x11c01489,0x6800000,0x1329800,0x11c0168d,0x6800000,0x1329800,0x11d05117,0x7c00100,0x230408,0x20000067,0x1000,0, -0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27, -0x2802500,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000,0x20001b27,0x4000000, -0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27,0x4000010,0xb00000, -0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100,0x230400,0x20001b27, -0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900000,0x20004c67,0,0x1900000,0x20004d67,0, -0x1900000,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,0x7c00100,0x1f304c1, -0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100,0x220401,0x30000419, -0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500,0x230400,0x30000605,0x4000400, -0x200400,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908,0x7c00100,0x250400, -0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400400,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0x2802100,0x962460,0x30000d22, -0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010, -0x248000,0x30000d22,0x80000000,0x218560,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821,0x2806400,0x962460, -0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100,0x962460,0x30001b27, -0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460,0x30001c1c,0x2802400, -0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c,0x7c00100,0x1830000, -0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010,0x400000,0x30001f0b, -0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000000,0x200000,0x30002128,0x7c00100, -0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x445800,0x3000221d,0x7c00100,0x230400, -0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400,0x1862460,0x30002417, -0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000,0x30002417,0x4000010, -0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x30002417,0xc000010,0x448000, -0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b, -0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900, -0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002a00,0x4000000,0x1600000, -0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000, -0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100, -0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000, -0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305, -0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x3040259a,0x4000010, -0x400000,0x3040259a,0x4000010,0xb70000,0x3040259a,0xc000010,0xb48000,0x304028bc,0x4000001,0xc41c0b,0x304a3dcc,0x4000000,0xe00000,0x30800c27,0x2802100,0x962460, -0x30c01c92,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e, -0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000, -0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540, -0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00, -0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100, -0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400, -0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800, -0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x1500002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100, -0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000, -0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00, -0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003700,0x24000000, -0x100000,0x32003700,0x24000000,0x200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400, -0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806400,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b, -0x2802100,0x962460,0x3200632b,0x6804000,0x962540,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100, -0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006900,0x24000020,0x200000, -0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701, -0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020, -0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x200000,0x320a3d11,0x7c00100,0x1230400, -0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11, -0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406396,0xc000010,0x448000,0x324a3dcf,0x4000000,0xe00000,0x324a3dcf,0x7c00100,0x1230400,0x324a3fca,0x4000002, -0x1200c00,0x324a53c7,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400, -0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02, -0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x1329960,0x40000d22,0x7c00100, -0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460, -0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615, -0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002, -0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40005a09,0x7c00100,0x220400, -0x40005a09,0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30, -0x6800000,0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000, -0x200000,0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400, -0x40007219,0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007400,0x4000000,0x200000,0x40007531, -0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000, -0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460, -0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x200000,0x400a3700,0x24000000,0xe00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, -0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x40507719,0x4000000, -0x200000,0x4050771c,0x4000000,0x400000,0x4050771f,0x4000000,0x200000,0x4050771f,0x4000000,0x400000,0x40c01489,0x4000000,0x200000,0x40d05117,0x4000000,0x200000, -0x41000419,0x7c00100,0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908, -0x7c00100,0x250400,0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000, -0x1500000,0x41000c02,0xc000010,0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000, -0x41001d0c,0x7c00100,0x22040f,0x41001d0c,0x7c00100,0x230400,0x41001f0b,0x2802400,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800, -0x24000000,0x200000,0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000, -0x200000,0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0xe00000,0x41005d00,0x7c00120,0x220405, -0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300, -0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100, -0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460, -0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b, -0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100, -0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000, -0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000400,0x200400,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b, -0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100, -0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000, -0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c, -0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x200000,0x410a3700,0x24000000, -0xe00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010, -0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100, -0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x41408ad2,0x4000400,0x200000,0x414a82cc,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01489,0x6800000, -0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400, -0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00, -0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000, -0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000, -0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257, -0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010, -0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000000,0xe00000,0x5000933e,0x4000010,0x400000, -0x5000933e,0x6800000,0xe29800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x2f62540,0x5000933e,0x7c00100,0x2b30400,0x5000933e, -0x7c00100,0x2b30401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400,0x5000965a,0x4000000, -0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400, -0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409acc,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e, -0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100, -0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460, -0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a, -0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100, -0x1862460,0x51001c1c,0x2802500,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800100,0x1862400, -0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800500,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619, -0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000, -0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000, -0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301, -0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008301,0x2802400,0xc62460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000, -0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000, -0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419, -0x7c00100,0x250400,0x51009500,0x4000400,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100, -0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540, -0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802d00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52, -0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100, -0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000, -0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008, -0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100, -0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400, -0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f, -0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100, -0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0xe00000,0x5100a442,0x6800000,0xe29800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x430400, -0x5100a442,0x7c00100,0x2d30400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b, -0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000, -0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x200000, -0x510aaa00,0x4000000,0xe00000,0x514a82cc,0x4000000,0xe00000,0x5150a20e,0x4000400,0x400000,0x51802bbe,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008, -0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000, -0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800500,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520, -0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000, -0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100, -0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400, -0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e, -0x7c00100,0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400, -0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540, -0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083, -0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010, -0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460, -0x5200b54e,0x4000000,0xe00000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0xe29800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x2f62540,0x5200b54e, -0x7c00100,0x2b30400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800500,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900, -0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000, -0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873, -0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100, -0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000, -0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d, -0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802100, -0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400, -0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x1329960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247, -0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000, -0x2800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003, -0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0xe00000,0x520a3800, -0x24000000,0x100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000, -0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af9c,0x7c00100,0x230400,0x5240afa1,0x4000400,0x200000, -0x5240afa3,0x6800400,0x962540,0x5240afa3,0x7c00100,0x230400,0x5240afad,0x7c00100,0x230400,0x5240afaf,0x7c00100,0x230400,0x5240b2d4,0x4000000,0x200000,0x5240b2e3, -0x4000000,0x200000,0x5240b2f1,0x4000000,0x200000,0x5240b2fc,0x4000000,0x1500000,0x524a44cc,0x4000000,0xe00003,0x5250b511,0x7c00900,0x430400,0x5280af9c,0x2802400, -0x962460,0x5280af9d,0x2802400,0x962460,0x5280afa3,0x2802400,0x962460,0x5280afa5,0x2802400,0x962460,0x5280afa7,0x2802400,0x962460,0x52d0b308,0x2802400,0x962460, -0x52d0b30c,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a, -0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000, -0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802400,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x200000, -0x60003000,0x24000000,0xe00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108, -0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802400,0xc62460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100, -0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x2703580,0x6000c654,0x2802000,0x962460, -0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f, -0x6800100,0x962540,0x6000c73f,0x6804000,0x2e62540,0x6000c73f,0x7c00100,0x2d30400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806400, -0x2f62460,0x6000c941,0x4000000,0xe00000,0x6000c941,0x4000010,0xe00000,0x6000c941,0x6800000,0x2d29800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x2b30400, -0x6000c941,0x7c00100,0x2c30400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300, -0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x600a3000,0x24000000,0x200000,0x600a3000,0x24000000, -0xe00000,0x600a3700,0x24000000,0x200000,0x600a3800,0x24000000,0x200000,0x600a3800,0x24000000,0x2800000,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x100000, -0x600ac400,0x4000000,0xe0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0xe00000,0x600acd00,0x4000000,0x200000,0x600acd00, -0x4000000,0xe00000,0x600acd00,0x4000000,0x2800000,0x600ace00,0x4000000,0xe00000,0x600ace00,0x4000000,0x2800000,0x600acf00,0x4000000,0xe00000,0x600acf00,0x4000000, -0x2800000,0x600ad111,0x7c40300,0xe30000,0x604ac4cc,0x4000000,0xe00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x1329960,0x6100120f,0x4000000,0x200000, -0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407, -0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100, -0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460, -0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202, -0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100, -0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400, -0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573, -0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802500,0x962460,0x6100d85c,0x6800100, -0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000, -0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997, -0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400, -0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000, -0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0xe00000,0x6140afa1,0x7c00100,0x230400,0x6140afa3,0x7c00100,0x230400,0x6180af9e,0x2802400,0x962460,0x62002a00, -0x4000000,0x1600000,0x63002800,0x80000,0x918820,0x63c00c15,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000, -0x1329960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460, -0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000, -0x24000000,0x200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100, -0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460, -0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00, -0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010, -0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000, -0x7000b61c,0x2802500,0x1862460,0x7000b61c,0x6800500,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0xc62460,0x7000cc00, -0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x2800000,0x7000cf00,0x4000000,0xe00000,0x7000d202,0x2802100, -0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400, -0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2400,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187, -0x2802000,0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100, -0x230400,0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541, -0x7000e489,0x6804400,0x2f62540,0x7000e489,0x7c00100,0x430400,0x7000e489,0x7c00100,0x2b30400,0x7000e489,0x7c00100,0x2d30400,0x7000e489,0x7c00900,0x430400,0x7000e59d, -0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400, -0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460, -0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719, -0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000, -0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000, -0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3, -0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010, -0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802500,0x1862460,0x7000ee1c,0x6800000,0x1329800, -0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e, -0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000, -0x1710000,0x7000f34b,0x2802400,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400, -0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b, -0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400, -0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541, -0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e, -0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100, -0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400, -0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0xe00000,0x700acd00,0x4000000,0x2800000,0x700ace00,0x4000000,0xe00000,0x700acf00,0x4000000,0xe00000,0x700acf00, -0x4000000,0x2800000,0x7050df21,0x4000000,0x200000,0x7050f729,0x80000,0x918820,0x7080afa1,0x2802400,0x962460,0x7090df21,0x2802400,0x962460,0x70d0e427,0x2802100, -0x962460,0x70d0e427,0x2802400,0x962460,0x70d0e427,0x6800100,0x962540,0x70d0ea25,0x4000010,0x400000,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400, -0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208, -0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100, -0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0xe00000, -0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,0x8000d997,0x2802400,0x962460,0x8000d997, -0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100, -0x2d30400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460, -0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862400,0x8000fda1,0x6800100,0x1862540,0x8000fda1, -0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100, -0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000, -0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, -0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0xe00000,0x800acd00,0x4000000,0x2902460,0x800ace00,0x4000000, -0xe00000,0x800acf00,0x4000000,0xe00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0xe00000,0x800b0500,0x4000000,0x2800000,0x90001615,0x7c00100,0x230400, -0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802400,0x962460,0x90008e00, -0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x1329960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100, -0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x90010500,0x4000000,0xe00000,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460, -0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8, -0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000, -0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460, -0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b, -0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000, -0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000, -0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0xe00000,0x900acd00, -0x4000000,0x2800000,0x900acf00,0x4000000,0xe00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x2800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300, -0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,0x962460, -0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,0xa000581e, -0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500,0x4000000, -0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,0x230400, -0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,0xa00116b0, -0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,0xc000010, -0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,0x200000, -0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,0xa00118b1, -0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000, -0xe00000,0xa00b0500,0x4000000,0xe00000,0xa00b0500,0x4000000,0x2800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000, -0xa00b1596,0x7c00300,0xe30000,0xa040afb9,0x6800400,0x962540,0xa08083ba,0x2802400,0x962460,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004, -0x2802000,0x962460,0xb0001110,0x4000000,0x200000,0xb0001524,0x2802100,0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000, -0x200000,0xb0008939,0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000, -0xb0009257,0x2802000,0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a, -0x2802100,0x962460,0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,0x1329960,0xb000c300,0x4000000,0x200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100, -0x962540,0xb000d476,0x7c00100,0x230400,0xb000e300,0x4000000,0xe00000,0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400, -0xb0011900,0x4000000,0xe00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2, -0x6800100,0x962540,0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,0x230400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000, -0x1329800,0xb0011cb3,0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400, -0xb0011db6,0x7c00500,0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4, -0x7c00100,0x430400,0xb0011fb4,0x7c00100,0x2d30400,0xb0011fb4,0xc000010,0x448000,0xb0012000,0x4000000,0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010, -0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400, -0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711, -0x7c40300,0xe30000,0xb00acf00,0x4000000,0xe00000,0xb00b0500,0x4000000,0xe00000,0xb00b0500,0x4000000,0x2800000,0xb00b109a,0x7c00300,0xe30000,0xb080e487,0x2802000, -0x962460,0xc0001524,0x4000000,0x500000,0xc0001a18,0x2806400,0x1862460,0xc0001a18,0x7c00100,0x1830000,0xc0007300,0x24000000,0x200000,0xc0008e00,0x24000010,0x400000, -0xc0009519,0x7c00100,0x220400,0xc0009519,0x7c00100,0x250400,0xc000c300,0x4000000,0x20000f,0xc000d85c,0x2802100,0x962460,0xc000d85c,0x6800100,0x962540,0xc000d85c, -0x7c00100,0x230400,0xc000dc99,0x7c00100,0x230400,0xc000e719,0x7c00100,0x220400,0xc00107a7,0x7c00100,0x230400,0xc0010eaa,0x7c00100,0x230400,0xc00116b0,0x7c00100, -0x230560,0xc0011900,0x4000000,0x200000,0xc0012447,0,0x818820,0xc0012447,0,0xc18820,0xc0012447,0,0x1418820,0xc00125b9,0x7c00100,0x230400, -0xc00126bb,0x2802100,0x962460,0xc00126bb,0x2806400,0x962460,0xc00126bb,0x4000000,0x500000,0xc00126bb,0x6800100,0x962540,0xc00126bb,0x7c00100,0x230400,0xc00127ba, -0x2802400,0x962460,0xc00127ba,0x4000000,0x200000,0xc00127ba,0x6800000,0x1329800,0xc00127ba,0x7c00100,0x230400,0xc00127ba,0x7c00900,0x230400,0xc0012800,0x4000000, -0x200000,0xc0012b23,0x4000000,0x200000,0xc0012b23,0x4000000,0x400000,0xc0012b23,0x4000000,0x1500000,0xc0012cbc,0x2802400,0x962460,0xc0012cbc,0x4000000,0x1600000, -0xc0012cbc,0x6800000,0x1329800,0xc0012cbc,0x7c00100,0x230400,0xc00acf00,0x4000000,0xe00000,0xc00ae300,0x4000000,0xe00000,0xc00b0500,0x4000000,0xe00000,0xc00b0500, -0x4000000,0x2800000,0xc00b0b11,0x4000000,0x1200000,0xc00b0b11,0x7c00900,0x1230400,0xc00b109a,0x7c00300,0xe30000,0xc00b2914,0x7c00100,0x2530000,0xc00b2916,0x7c00100, -0x2530c00,0xc00b2a00,0x4000000,0xe00000,0xc040af5e,0x7c00100,0x230400,0xc0c12b89,0x4000000,0x200000,0xc14a44cc,0x4000000,0xe0000d,0xd000131f,0x2802c00,0x962460, -0xd000171a,0x7c00100,0x230400,0xd0001821,0x2802100,0x962460,0xd0007300,0x24000000,0x200000,0xd0008e00,0x24000000,0x200000,0xd0008f3a,0x2806000,0x962460,0xd0009519, -0x7c00100,0x220400,0xd0009519,0x7c00100,0x250400,0xd000a500,0x4000000,0x200000,0xd000c300,0x4000000,0xe00000,0xd000d202,0x7c00100,0x230400,0xd000d476,0x7c00100, -0x230400,0xd000d997,0x2802100,0x962460,0xd000d997,0x6800100,0x962540,0xd000e001,0x2802100,0x962460,0xd000e700,0x4000400,0x200000,0xd000e719,0x7c00100,0x220400, -0xd000e719,0x7c00500,0x22040f,0xd000fa00,0x4000000,0xe00000,0xd0010eaa,0x4000010,0x400000,0xd0010eaa,0x7c00100,0x230400,0xd0012dbd,0x4000000,0x200000,0xd0012dbd, -0x7c00100,0x230400,0xd0012fbe,0x2802100,0x962460,0xd0012fbe,0x2802400,0x962460,0xd0012fbe,0x2806400,0x2f62460,0xd0012fbe,0x4000000,0x400000,0xd0012fbe,0x6800000, -0xe29800,0xd0012fbe,0x6800100,0x962540,0xd0012fbe,0x6800100,0x962541,0xd0012fbe,0x6804400,0x962540,0xd0012fbe,0x7c00100,0x2b30400,0xd0012fbe,0x7c00100,0x2c30560, -0xd0012fbe,0xc000010,0x448000,0xd0013183,0x7c00100,0x230400,0xd0013200,0x4000000,0x200000,0xd0013200,0x6800000,0x1329805,0xd00134c0,0x2802100,0x962460,0xd00134c0, -0x4000002,0x400000,0xd00134c0,0x7c00100,0x230400,0xd00a4305,0x7c00100,0xe30400,0xd00a4611,0x7c40300,0xe30000,0xd00a4711,0x7c40300,0xe30000,0xd00a5e11,0x7c40300, -0xe30000,0xd00acf00,0x4000000,0xe00000,0xd00b0500,0x4000000,0xe00000,0xd00b0500,0x4000000,0x2800000,0xd00b0b11,0x6800500,0x962540,0xd00b0bbf,0x2802200,0xc62460, -0xd00b119a,0x7c00300,0xe30000,0xd00b2a00,0x4000000,0xe00000,0xd00b2e11,0x7c40300,0xe30000,0xd00b30bf,0x7c00300,0x230000,0xd00b339a,0x7c00300,0xe30000,0xe0000c02, -0xc000010,0xb48000,0xe0001524,0x2802400,0x962460,0xe0001524,0x7c00100,0x230400,0xe0001615,0x7c00100,0x230400,0xe000251b,0x12882000,0x962460,0xe0002a00,0x4000000, -0x1500000,0xe0005102,0x4000000,0x200000,0xe0005c00,0x4000000,0x200000,0xe000622a,0x6804400,0x962540,0xe000622a,0x7c00100,0x230400,0xe0008838,0x7c00100,0x220400, -0xe0008838,0x7c00100,0x250400,0xe0008e00,0x24000000,0x810000,0xe0008e00,0x24000000,0x1410000,0xe0008e00,0x24000002,0x400000,0xe0008e00,0x2c000010,0xb48000,0xe000933e, -0x7c00100,0x2b30400,0xe000933e,0xc000010,0x448000,0xe0009519,0x7c00100,0x220400,0xe0009519,0x7c00100,0x22040f,0xe0009519,0x7c00100,0x250400,0xe000c178,0x2802100, -0x962460,0xe000c941,0x2802100,0x962460,0xe000c941,0x2806400,0x962460,0xe000c941,0x7c00100,0x2b30400,0xe000d202,0x2802400,0x962460,0xe000d202,0x7c00100,0x230400, -0xe000d202,0x7c00500,0x230400,0xe000dc99,0x4000000,0x200000,0xe000e001,0x2802100,0x962460,0xe000e001,0x2802400,0x962460,0xe000fda1,0x7c00100,0x1830000,0xe0013502, -0x2802400,0x962460,0xe0013502,0x4000000,0x200000,0xe0013502,0x7c00100,0x230400,0xe0013502,0x80000000,0x1329960,0xe00136c1,0x4000000,0x200000,0xe00136c1,0x7c00100, -0x230400,0xe001370b,0x7c00100,0x230400,0xe0013919,0x7c00500,0x220400,0xe0013919,0x7c00500,0x22040f,0xe0013919,0x7c00d00,0x23040f,0xe0013a19,0x7c00100,0x220400, -0xe0013a19,0x7c00100,0x230400,0xe0013bc2,0x2802400,0x962460,0xe0013bc2,0x7c00100,0x230400,0xe0013bc2,0xc000010,0x248000,0xe0013cc3,0x6800000,0x1329800,0xe0013cc3, -0x7c00100,0x230400,0xe0013dc4,0x2802400,0x962460,0xe0013dc4,0x7c00100,0x230400,0xe0013e28,0x7c00100,0x230400,0xe0013fc5,0x7c00100,0x220400,0xe0013fc5,0x7c00100, -0x250400,0xe0014000,0x4000000,0x200000,0xe0014001,0x2802400,0x962460,0xe00a4711,0x7c40300,0xe30000,0xe00a5e11,0x7c40300,0xe30000,0xe00ac511,0x7c40300,0xe30000, -0xe00acf00,0x4000000,0xe00000,0xe00ae300,0x4000000,0xe00000,0xe00b0500,0x4000000,0xe00000,0xe00b1314,0x7c00100,0xe30000,0xe00b1316,0x7c00100,0xe30c00,0xe00b2a00, -0x4000000,0xe00000,0xe00b2a00,0x4000000,0x2800000,0xe00b3816,0x7c00500,0x230c00,0xe0808328,0x2802400,0x962460,0xf0001615,0x6800100,0x962540,0xf0001a18,0x2802000, -0x1862460,0xf000c247,0x7c00100,0x1430400,0xf000d000,0x4000000,0xe00000,0xf000e300,0x4000000,0xe00000,0xf000e59d,0x2802100,0x962460,0xf000e59d,0x7c00100,0x230400, -0xf0012447,0,0x818820,0xf0012447,0,0xc18820,0xf0012447,0,0x1418820,0xf0012447,0x2802000,0x962460,0xf0012447,0x2802400,0x962460,0xf0012447, -0x7c00100,0x230400,0xf0013a19,0x7c00100,0x220400,0xf0014102,0x2802400,0x962460,0xf0014308,0x2802100,0x962460,0xf0014308,0x7c00500,0x22040e,0xf0014308,0x7c00500, -0x22040f,0xf001440a,0x4000000,0x500000,0xf0014500,0x4000000,0x200000,0xf00146c6,0x2802100,0x962460,0xf00146c6,0x2806000,0x2f62460,0xf00146c6,0x4000000,0xe00000, -0xf00146c6,0x6800000,0x2d29800,0xf00146c6,0x6800100,0x962540,0xf00146c6,0x6804000,0x962540,0xf00146c6,0x7c00100,0x2b30400,0xf00146c6,0x7c00100,0x2c30560,0xf00146c6, -0xc000010,0x448000,0xf00147c7,0x2802000,0x962460,0xf00147c7,0x6800000,0x1329800,0xf00147c7,0x7c00100,0x230400,0xf00ac511,0x7c40300,0xe30000,0xf00acf00,0x4000000, -0xe00000,0xf00b2914,0x7c00100,0x2530000,0xf00b2916,0x7c00100,0x2530c00,0xf00b2a00,0x4000000,0xe00000,0xf00b2a00,0x4000000,0x2800000,0xf00b4211,0x7c40300,0xe30000, -0xf10a3c00,0x4000000,0xe00000,0xf10a3c00,0x4008000,0xe00000,0xf10a8200,0x4008000,0xe00000,0xf10b4811,0x7c40300,0xe30000}; +static const uint32_t propsVectors[6813]={ +0x67,0,0,0x67,0,0xe00000,0x67,0,0x1600000,0x67,0x80000,0x20,0x67,0x20000000,0,0x5067, +0,0xe00000,0x5000000,0,0x900020,0x5000000,0x80000,0xc4918820,0x5000000,0x80000,0xc5c18020,0x5000000,0x80000,0xc5e18820,0x5000000,0x180000, +0xc0918820,0x5000000,0x4000000,0x4100000,0x5000000,0x4000000,0x4200000,0x5000000,0x4000000,0x5500000,0x5000000,0x4000000,0x5600000,0x5000000,0x4000000,0xc200000, +0x5000000,0x4000000,0xc8100003,0x5000000,0x4000000,0xc8100006,0x5000000,0x4000000,0xc8200002,0x5000000,0x4000000,0xc8200006,0x5000000,0x4000000,0xc820000e,0x5000000, +0x4000000,0xc820000f,0x5000000,0x4000000,0xc9600002,0x5000000,0x4000001,0xc8445801,0x5000000,0x4000001,0xc8445802,0x5000000,0x4000001,0xc8c4000b,0x5000000,0x4000010, +0xc9071401,0x5000000,0x4000020,0x4200000,0x5000000,0x4000020,0xc820000e,0x5000000,0x4000020,0xc820000f,0x5000000,0x4000020,0xc881000e,0x5000000,0x4000020,0xc881000f, +0x5000000,0x4000020,0xc941000e,0x5000000,0x4000020,0xc941000f,0x5000000,0x4000022,0xc820000e,0x5000000,0x4000022,0xc820000f,0x5000000,0x4000400,0x4200400,0x5000000, +0x4000400,0xc8200001,0x5000000,0x4000400,0xc8200002,0x5000000,0x6800000,0x10201c00,0x5000000,0x6800010,0xc8201001,0x5000000,0x6800020,0x10201c00,0x5000000,0x7c00000, +0x10200000,0x5000000,0x7c00020,0x10200000,0x5000000,0x7c00100,0xc8220402,0x5000000,0x7c00120,0xc8220405,0x5000000,0x7c00120,0xc8230402,0x5000000,0x7c00120,0xc8250402, +0x5000000,0x7c00120,0xc8250405,0x5000000,0x7c00500,0x10220400,0x5000000,0x7c00500,0x10230400,0x5000000,0x7c00500,0x10530400,0x5000000,0x7c00500,0xf8230400,0x5000000, +0x7c00d00,0x10230400,0x5000000,0x24000000,0x4100000,0x5000000,0x24000000,0x4200000,0x5000000,0x24000000,0x4810000,0x5000000,0x24000000,0x4b00000,0x5000000,0x24000000, +0x4e00000,0x5000000,0x24000000,0x5410000,0x5000000,0x24000000,0x5500000,0x5000000,0x24000000,0x5710000,0x5000000,0x24000000,0x6800000,0x5000000,0x24000000,0xc8200002, +0x5000000,0x24000000,0xc9500002,0x5000000,0x24000002,0x7000000,0x5000000,0x24000006,0xc8c0000b,0x5000000,0x24000008,0x5410000,0x5000000,0x24000008,0x5710000,0x5000000, +0x24000020,0x4200000,0x5000000,0x24000020,0x4200001,0x5000000,0x24000020,0x4810000,0x5000000,0x24000020,0x4f00000,0x5000000,0x24000020,0x5001400,0x5000000,0x24000020, +0x5410000,0x5000000,0x24000020,0x5600000,0x5000000,0x24000020,0xc8200002,0x5000000,0x24000020,0xc9500002,0x5000000,0x24000022,0x5600000,0x5000000,0x2c000010,0x5248000, +0x5000000,0x2c000010,0xc9248002,0x5000000,0x40000001,0x4440020,0x5000000,0x40000001,0x463b020,0x5000000,0x40000001,0x4643020,0x5000000,0x40000001,0x4a5a040,0x5000000, +0x40000001,0x516a8a0,0x5000000,0x40000001,0x5d3b020,0x5000000,0x40080000,0xc4918820,0x5000000,0x80000000,0x5329960,0x5000001,0x2882000,0xc4962460,0x5000002,0x4000000, +0x4200000,0x5000002,0x4000000,0x5329400,0x5000002,0x4000000,0x5329800,0x5000002,0x4000000,0x5500000,0x5000002,0x6800000,0xfd329800,0x5000002,0x7000100,0xc8230408, +0x5000002,0x7c00100,0x8230400,0x5000002,0x7c00100,0x10230400,0x5000002,0x7c00100,0x20230400,0x5000002,0x7c00100,0xc8230402,0x5000002,0x7c00100,0xc8230404,0x5000002, +0x7c00100,0xc8230407,0x5000002,0x7c00100,0xc8230408,0x5000002,0x7c00100,0xc8230409,0x5000002,0x7c00100,0xfc230400,0x5000002,0x7c00100,0xfc230401,0x5000002,0x7c00500, +0x10230400,0x5000002,0x7d00100,0xc0230400,0x5000003,0x4000000,0x4200400,0x5000003,0x4000000,0x4201000,0x5000003,0x4000000,0x4270000,0x5000003,0x7c00100,0xc8220402, +0x5000003,0x7c00100,0xfc220400,0x5000003,0x7c00100,0xfc250400,0x5000003,0x7c00500,0x10230400,0x5000004,0x4000000,0x4200000,0x5000004,0x4000000,0x5500000,0x5000004, +0x6800100,0xfc962540,0x5000004,0x6800100,0xfc962541,0x5000004,0x7c00100,0x8230400,0x5000004,0x7c00100,0x20230400,0x5000004,0x7c00100,0xfc230400,0x5000007,0x7c00100, +0x80220400,0x5000007,0x7c00100,0x80250400,0x5000008,0x4000000,0xc200000,0x5000008,0x7c00100,0x8220400,0x5000008,0x7c00100,0x8220401,0x5000008,0x7c00100,0x8250400, +0x5000008,0x7c00100,0x8250401,0x5000008,0x7c00100,0x20220400,0x5000008,0x7c00100,0x20220401,0x5000008,0x7c00100,0x20250400,0x5000008,0x7c00100,0x20250401,0x5000008, +0x7c00100,0xfc220400,0x5000008,0x7c00100,0xfc220401,0x5000008,0x7c00100,0xfc250400,0x5000008,0x7c00100,0xfc250401,0x500000a,0x4000000,0x4200000,0x500000a,0x6800100, +0xfc962540,0x500000a,0x7c00100,0x8230400,0x500000a,0x7c00100,0x10230400,0x500000a,0x7c00100,0xfc230400,0x500000c,0x7c00100,0x8230400,0x500000c,0x7c00100,0x8250400, +0x500000c,0x7c00100,0xfc230400,0x500000e,0x4000400,0xc8200001,0x500000e,0x4000400,0xc8200002,0x500000e,0x4000400,0xc8500001,0x500000e,0x7000500,0xc8220402,0x500000e, +0x7c00100,0x8220401,0x500000e,0x7c00100,0x8250400,0x500000e,0x7c00100,0x8250401,0x500000e,0x7c00100,0x18220400,0x500000e,0x7c00100,0x18220401,0x500000e,0x7c00100, +0xc8220401,0x500000e,0x7c00100,0xc8220402,0x500000e,0x7c00100,0xc8250401,0x500000e,0x7c00100,0xfc220400,0x500000e,0x7c00100,0xfc220401,0x500000e,0x7c00100,0xfc250401, +0x500000e,0x7c00120,0xc8220402,0x500000e,0x7c00120,0xc8250402,0x500000f,0x6800100,0xfc962540,0x500000f,0x7c00100,0x8230400,0x500000f,0x7c00100,0x10230400,0x500000f, +0x7c00100,0xfc230400,0x5000010,0x6800100,0xfc962540,0x5000010,0x7c00100,0x10230400,0x5000010,0x7c00100,0x20230400,0x5000010,0x7c00100,0xc8230401,0x5000010,0x7c00100, +0xfc230400,0x5000012,0x7c00100,0xa230500,0x5000012,0x7c00100,0xa330520,0x5000012,0x7c80100,0xc6330520,0x5000013,0x4000000,0x4200000,0x5000013,0x4000000,0xf8201000, +0x5000013,0x4000000,0xf8230400,0x5000013,0x4000002,0x7000000,0x5000013,0x4000010,0x4200000,0x5000013,0x4000020,0xc8200005,0x5000013,0x7c00100,0x22633800,0x5000013, +0x7c00100,0xca633801,0x5000013,0x7c00100,0xca633802,0x5000013,0x7c00100,0xca633805,0x5000013,0x7c00100,0xfe633800,0x5000015,0x6800100,0x20962540,0x5000015,0x6800100, +0xfc962540,0x5000015,0x7c00100,0x8230400,0x5000015,0x7c00100,0xfc230400,0x5000018,0x6800000,0xfd329800,0x5000018,0x7800100,0xc9830142,0x5000018,0x7c00100,0x11830000, +0x5000018,0x7c00100,0xc9830002,0x5000018,0x7c00100,0xfd830000,0x5000018,0x7c00900,0xfd830000,0x5000018,0x7e00100,0xfd830000,0x5000019,0x7c00100,0x8220400,0x5000019, +0x7c00100,0x8250400,0x5000019,0x7c00100,0x10220400,0x5000019,0x7c00100,0x10220401,0x5000019,0x7c00100,0x10230400,0x5000019,0x7c00100,0x10250401,0x5000019,0x7c00100, +0x18220400,0x5000019,0x7c00100,0x18230400,0x5000019,0x7c00100,0x20220400,0x5000019,0x7c00100,0x20220401,0x5000019,0x7c00100,0x20250400,0x5000019,0x7c00100,0x20250401, +0x5000019,0x7c00100,0xc8220402,0x5000019,0x7c00100,0xc8250401,0x5000019,0x7c00100,0xc8250402,0x5000019,0x7c00100,0xfc220400,0x5000019,0x7c00100,0xfc220401,0x5000019, +0x7c00100,0xfc250400,0x5000019,0x7c00100,0xfc250401,0x5000019,0x7c00500,0xc822040f,0x500001a,0x6800000,0x21329800,0x500001a,0x6800100,0x8962541,0x500001a,0x6800100, +0xfc962540,0x500001a,0x6800100,0xfc962541,0x500001a,0x7c00100,0x8230400,0x500001a,0x7c00100,0x20230400,0x500001a,0x7c00100,0xfc230400,0x500001f,0x4000000,0x4200000, +0x500001f,0x6800000,0x21329800,0x500001f,0x6800100,0xfc962540,0x500001f,0x6800100,0xfc962541,0x500001f,0x7c00100,0x8230400,0x500001f,0x7c00100,0x20230400,0x500001f, +0x7c00100,0xfc230400,0x5000023,0x6800100,0xfc962540,0x5000023,0x6800100,0xfc962541,0x5000023,0x7c00100,0xfc230400,0x5000023,0x7c00100,0xfc230401,0x5000024,0x6800000, +0x21329800,0x5000024,0x6800100,0x20962540,0x5000024,0x6800100,0xfc962540,0x5000024,0x7c00100,0x8230400,0x5000024,0x7c00100,0x20230400,0x5000024,0x7c00100,0xfc230400, +0x5000026,0x4000000,0x4200000,0x5000026,0x4000010,0x4400000,0x5000026,0x6800000,0xfd329800,0x5000026,0x7800100,0xc9830142,0x5000026,0x7c00100,0xfd830000,0x5000026, +0x7c00900,0xfd830000,0x5000026,0x7e00100,0xfd830000,0x5000067,0x1000,0,0x5000410,0x7c00500,0xf8230400,0x500041b,0x4000400,0x4200400,0x5000492,0x7c00500, +0xc8230401,0x50004a5,0x4000010,0x4b00000,0x50004a5,0x4000010,0x5071400,0x50004b1,0xc000010,0x4b48000,0x50004b9,0x7c00900,0x8230400,0x50004e9,0xc000010,0x4448000, +0x50004fe,0xc000010,0x4448000,0x5000536,0x4000000,0x4200000,0x50005be,0x4000000,0x4e00000,0x500061b,0x24000000,0x14810000,0x500061b,0x24000000,0x15410000,0x5000c94, +0x4000400,0x14200000,0x5000ca3,0xc000010,0x5049400,0x5000cc7,0x6800000,0xfd329800,0x5000ccb,0xc000010,0x4b48000,0x5000d19,0x6800000,0xfd329800,0x5000d1e,0x6800000, +0xfd329800,0x5000d22,0x6800000,0x21329800,0x5000d26,0x6800000,0xfd329800,0x5000d2a,0x4000000,0x4200000,0x5000d2a,0x6800000,0x21329800,0x5000d2f,0x6800000,0xfd329800, +0x5000e1f,0x7c00100,0xc8230408,0x5001000,0x80004,0xc4418820,0x5001000,0x4000000,0x4100000,0x5001000,0x4000000,0xc8100002,0x5001000,0x4000000,0xc8100003,0x5001000, +0x4000000,0xc8100006,0x5001000,0x4000000,0xc810000e,0x5001000,0x4000000,0xc810000f,0x5001000,0x4000000,0xc9500002,0x5001000,0x4000000,0xc9600002,0x5001000,0x4000100, +0xc8120403,0x5001000,0x4000100,0xc8150403,0x5001000,0x4000400,0x4200400,0x5001000,0x4000400,0xc8100002,0x5001000,0x4000400,0xc8100402,0x5001000,0x4000400,0xc8500002, +0x5001000,0x7c00120,0xc8120405,0x5001000,0x7c00d00,0x10130400,0x5001000,0x24000000,0x4100000,0x5001000,0x24000000,0x4200000,0x5001000,0x24000000,0x4e00000,0x5001000, +0x24000000,0x5400000,0x5001000,0x24000000,0x5500000,0x5001000,0x24000000,0x5600000,0x5001000,0x24000000,0xc8200002,0x5001000,0x24000000,0xc8f00002,0x5001000,0x24000000, +0xf8401000,0x5001000,0x24000002,0x4100000,0x5001000,0x24000002,0x4370000,0x5001000,0x24000002,0x7070000,0x5001000,0x24000006,0xfb000000,0x5001000,0x24000008,0x5710000, +0x5001000,0x24000008,0x5712c00,0x5001000,0x24000008,0xf9712c00,0x5001000,0x24000020,0x4100000,0x5001000,0x24000020,0x4100001,0x5001000,0x24000020,0x5500000,0x5001000, +0x24000020,0x5600000,0x5001000,0x24000020,0xc8100002,0x5001000,0x24000020,0xc9500002,0x5001000,0x2c000010,0xc8f0ac02,0x5001008,0x7c00100,0xfc220400,0x5001008,0x7c00100, +0xfc220401,0x5001008,0x7c00100,0xfc250400,0x5001008,0x7c00100,0xfc250401,0x500100e,0x7c00100,0xc8250401,0x500100e,0x7c00100,0xfc220400,0x500100e,0x7c00100,0xfc250400, +0x5001019,0x7c00100,0x8220400,0x5001019,0x7c00100,0x10220400,0x5001019,0x7c00100,0x20220401,0x5001019,0x7c00100,0xc8120402,0x5001019,0x7c00100,0xc812040f,0x5001019, +0x7c00100,0xc8150401,0x5001019,0x7c00100,0xc8150402,0x5001019,0x7c00100,0xc8220402,0x5001019,0x7c00100,0xc8250402,0x5001019,0x7c00100,0xfc220400,0x5001019,0x7c00100, +0xfc220401,0x5001019,0x7c00100,0xfc250400,0x5001019,0x7d00100,0xc0220402,0x5001067,0,0,0x5001400,0x6800c00,0xf8101000,0x5001417,0x4000400,0xc8100002, +0x5001417,0x7c00500,0x10130400,0x5001419,0x7c00500,0x10130400,0x5002000,0x4000000,0x5600000,0x5002000,0x4000000,0xc820000a,0x5002000,0x4000020,0xc820000a,0x5002012, +0x7c00100,0xc8e3040a,0x5002012,0x7c80100,0xc4e3040a,0x5002016,0x7c00100,0xc8e30c0a,0x5002016,0x7c00100,0xca530c0a,0x50025a4,0x4000008,0xc881000a,0x50025a4,0x4000008, +0xc941000a,0x50025a4,0x4000010,0xc887000a,0x50025a4,0x6800004,0xc920000a,0x50025a4,0xc000010,0xc884800a,0x50025bc,0x7c00d00,0xca530c0a,0x5003000,0x4000000,0xc8810011, +0x5003000,0x4000000,0xc8e00011,0x5003000,0x4000000,0xc9410011,0x5003000,0x4000000,0xc9500011,0x5003000,0x4000000,0xc9600011,0x5003000,0x4000001,0xc8445811,0x5003000, +0x4000006,0xc8e70011,0x5003000,0x4000008,0xc8e00011,0x5003000,0x4000008,0xc8e02c11,0x5003000,0x4000010,0xc8871411,0x5003000,0x4000010,0xc9271011,0x5003000,0x4000010, +0xc9271411,0x5003000,0x4000020,0xc8e00011,0x5003000,0x4000400,0xc8e00011,0x5003000,0x4000420,0xc8e00011,0x5003000,0x6800000,0xc8e01c11,0x5003000,0x6800040,0xc8e29811, +0x5003000,0xc000010,0xc880ac11,0x5003000,0xc000010,0xc8b48011,0x5003019,0x7c00100,0xc8e20411,0x5003019,0x7c00100,0xc8e50411,0x5003019,0x7c00140,0xc8e20411,0x5003019, +0x7c00140,0xc8e50411,0x5004000,0x4000400,0xc8200002,0x5004000,0x6800000,0xfc201c00,0x5004000,0x68000c0,0xfd329800,0x5004000,0x24000000,0x4200000,0x5004000,0x24000000, +0x4810000,0x5004000,0x24000000,0x5410000,0x5004000,0x24000000,0x5500000,0x5004000,0x24000000,0x5600000,0x5004000,0x24000000,0x5b00000,0x5004000,0x24000000,0x6410000, +0x5004000,0x24000006,0xf8d70000,0x5004000,0x24000008,0x5714000,0x5004000,0x24000008,0xf9713c00,0x5004000,0x24000010,0x5071400,0x5004000,0x24000010,0xf9071000,0x5004000, +0x24000020,0x4200000,0x5004000,0x24000020,0x4400000,0x5004000,0x24000020,0x5600000,0x5004000,0x24000400,0x4200000,0x5004000,0x24000420,0x4200000,0x5004000,0x2c000010, +0x4b48000,0x5004000,0x2c000010,0xf900ac00,0x5004000,0x44000001,0x5a45800,0x5004019,0x7c00100,0xfc220400,0x5004019,0x7c00100,0xfc250400,0x5004019,0x7c001c0,0xfc220400, +0x5004019,0x7c001c0,0xfc250400,0x5005000,0x4000000,0x4e00000,0x5005000,0x4000000,0x14e00000,0x5005000,0x4000000,0xc881000c,0x5005000,0x4000000,0xc8810010,0x5005000, +0x4000000,0xc8e00002,0x5005000,0x4000000,0xc8e0000c,0x5005000,0x4000000,0xc8e0000d,0x5005000,0x4000000,0xc8e00010,0x5005000,0x4000000,0xc941000c,0x5005000,0x4000000, +0xc9410010,0x5005000,0x4000000,0xc950000c,0x5005000,0x4000000,0xc960000c,0x5005000,0x4000002,0xc8e7000c,0x5005000,0x4000002,0xc8e70010,0x5005000,0x4000008,0xc8810010, +0x5005000,0x4000008,0xc9410010,0x5005000,0x4000010,0xc887140c,0x5005000,0x4000010,0xc8e7000c,0x5005000,0x4000010,0xc927100c,0x5005000,0x4000010,0xc927140c,0x5005000, +0x4000020,0xc8e0000c,0x5005000,0x4000026,0xc8e7000c,0x5005000,0x6800000,0xc8e01c02,0x5005000,0x6800000,0xc8e01c10,0x5005000,0xc000010,0xc880ac0c,0x5005000,0xc000010, +0xc8b4800c,0x5005000,0x24000000,0x4200000,0x5005000,0x24000000,0x4e00000,0x5005000,0x24100000,0xc0810001,0x5005000,0x24100000,0xc1410001,0x5005005,0x7c00100,0x40e30400, +0x5005011,0x7c00300,0x10e30000,0x5005011,0x7c00300,0xc8e30001,0x5005011,0x7c00300,0xfce30000,0x5005011,0x7c00900,0xfd230400,0x5005011,0x7c40300,0x20e30000,0x5005011, +0x7c40300,0xfce30000,0x5005012,0x4000000,0xc8e00002,0x5005012,0x4000000,0xc8e00003,0x5005012,0x7c00100,0xa130480,0x5005012,0x7c00100,0xc8e30402,0x5005012,0x7c80100, +0xc4e30402,0x5005012,0x7c80100,0xc6130480,0x5005014,0x7c00100,0xfce30000,0x5005014,0x7c00100,0xfce30001,0x5005014,0x7c00100,0xfe530000,0x5005014,0x7c00900,0xfd230000, +0x5005014,0x7c00900,0xfd230001,0x5005016,0x4000000,0xc8e00c03,0x5005016,0x4000000,0xc8e00c0d,0x5005016,0x7c00100,0xfce30c00,0x5005016,0x7c00100,0xfce30c01,0x5005016, +0x7c00100,0xfe530c00,0x5005016,0x7c00900,0xfd230c00,0x5005016,0x7c00900,0xfd230c01,0x50055a4,0x6800004,0xf9200000,0x50055a4,0x24000000,0x4810000,0x50055a4,0x24000000, +0x5410000,0x50055a4,0x24000008,0x4810000,0x50055a4,0x24000008,0x5410000,0x50055aa,0x24000010,0x4870000,0x50055b1,0x2c000010,0x4848000,0x50055b9,0x4000000,0x4e00000, +0x50055b9,0x24000000,0x4e00000,0x50055b9,0x24000002,0x4e00000,0x50055b9,0x24000002,0x5200000,0x50055b9,0x24000008,0x4810000,0x50055b9,0x24000008,0x5410000,0x50055b9, +0x24000008,0xc810000,0x50055bc,0x7000400,0xc9200c02,0x50055bc,0x7c00900,0x10930c00,0x50055bc,0x7c00900,0x10e30c00,0x50055bc,0x7c00d00,0xfe530c00,0x50055be,0x4000000, +0x4e00000,0x50055be,0x4000000,0xc8e00002,0x50055be,0x4000000,0xc8e00003,0x50055be,0x4000000,0xc8e0000d,0x50055be,0x4000000,0xc8e0000f,0x50055be,0x7c00300,0xfce30000, +0x50055bf,0x24000000,0x4810000,0x50055bf,0x24000000,0x5410000,0x50055c7,0x24000000,0x4810000,0x50055c7,0x24000000,0x5410000,0x5008004,0x7c00100,0xc8230401,0x5008004, +0x7c00100,0xfc230400,0x500800a,0x7c00100,0x20230401,0x500800a,0x7c00100,0xc8230401,0x500800a,0x7c00100,0xfc230400,0x500800a,0x7c00100,0xfc230401,0x500800f,0x7c00100, +0xfc230400,0x500801a,0x7c00100,0xfc230400,0x500801f,0x7c00100,0xc8230401,0x500801f,0x7c00100,0xfc230400,0x5008024,0x7c00100,0x20230400,0x5008024,0x7c00100,0xfc230400, +0x5010001,0x2000,0x14962460,0x5010001,0x2802020,0x10962460,0x5010001,0x2802400,0x10962460,0x5010001,0x2802400,0x10c62460,0x5010001,0x2880000,0xc6a65620,0x5010002, +0x2802100,0x20962460,0x5010002,0x2802400,0x20962460,0x5010004,0x2802100,0x8962460,0x5010004,0x2802100,0x20962460,0x5010004,0x2802100,0xfc962460,0x5010004,0x2802400, +0xfc962460,0x501000a,0x2802100,0x8962460,0x501000a,0x2802100,0x20962460,0x501000a,0x2802100,0xfc962460,0x501000a,0x2802400,0xfc962460,0x501000f,0x2802100,0x20962460, +0x501000f,0x2802100,0xfc962460,0x501000f,0x2802400,0xfc962460,0x5010010,0x2802100,0xfc962460,0x5010010,0x2802400,0xfc962460,0x5010010,0x2802900,0xfc962460,0x5010010, +0x2806400,0xfc962460,0x5010013,0x2802500,0x20962460,0x5010013,0x2802500,0x30962460,0x5010015,0x2802100,0x20962460,0x5010015,0x2802100,0xfc962460,0x5010015,0x2802100, +0xfc962461,0x5010015,0x2806400,0xfc962460,0x5010018,0x2802100,0xfd862460,0x5010018,0x2802400,0xfd862460,0x501001a,0x2802100,0xfc962460,0x501001f,0x2802100,0x20962460, +0x501001f,0x2802100,0xfc962460,0x501001f,0x2802400,0xfc962460,0x5010023,0x2802100,0x10962460,0x5010023,0x2802100,0x20962460,0x5010023,0x2802100,0xfc962460,0x5010023, +0x2806400,0xfc962460,0x5010024,0x2802100,0x20962460,0x5010024,0x2802100,0xfc962460,0x5010024,0x2802100,0xfc962461,0x5010026,0x2802100,0xfd862460,0x5010026,0x2802400, +0x21862460,0x5010026,0x2802400,0xfd862460,0x5010026,0x2806500,0xfd862460,0x501089e,0x2802400,0x18962460,0x50108c2,0x2802100,0xfc962460,0x50108c2,0x2802500,0xfc962460, +0x50108cd,0x2802400,0x8962460,0x50108dc,0x2802400,0x8962460,0x5010c98,0x2802400,0x8962460,0x5010c9c,0x2802400,0x18962460,0x5011001,0x2802400,0x10962460,0x5011001, +0x2802400,0x10c62460,0x5011001,0x2802400,0x20962460,0x5011001,0x2802400,0xc8962461,0x5011001,0x2802400,0xfc962460,0x501181d,0x2802400,0xfc962460,0x5011825,0x2802400, +0xfc962460,0x501182d,0x2802400,0xfc962460,0x501182f,0x2802400,0xfc962460,0x5011831,0x2802400,0xfc962460,0x5011836,0x2802400,0xfc962460,0x5011841,0x2802400,0x20962460, +0x5011847,0x2802400,0xfc962460,0x501184c,0x2802400,0xfc962460,0x5011855,0x2802400,0xfc962460,0x5011860,0x2802400,0xfc962460,0x5011863,0x2802400,0xfc962460,0x5011867, +0x2802400,0xfc962460,0x501186a,0x2802400,0x10962460,0x501186a,0x2802400,0x20962460,0x501186c,0x2802400,0x10962460,0x501186e,0x2802400,0x10962460,0x5011871,0x2802400, +0x10962460,0x5011875,0x2802400,0xfc962460,0x501187b,0x2802400,0x10962460,0x501187f,0x2802400,0x10962460,0x5011881,0x2802400,0x10962460,0x5011884,0x2802400,0x10962460, +0x5011887,0x2802400,0xfc962460,0x501188e,0x2802400,0x10962460,0x501188e,0x2802500,0x8962460,0x50125bc,0x3802500,0xc926246a,0x5015012,0x2802400,0x18962460,0x50159bc, +0x2802400,0x20962460,0x50159d0,0x2802400,0x10962460,0x5018004,0x2806400,0xfc962460,0x501800a,0x2806400,0xfc962460,0x501800f,0x2806400,0xfc962460,0x501801a,0x2806400, +0xfc962460,0x501801f,0x2806400,0xfc962460,0x5018024,0x2806400,0xfc962460,0x8000000,0x4000000,0x5600000,0x8000019,0x7c00100,0xc8220401,0x8000027,0x4000000,0x4200000, +0x8000027,0x4000000,0x4400000,0x8000027,0x4000000,0x4500000,0x8000027,0x4000000,0x4810000,0x8000027,0x4000000,0x4b00000,0x8000027,0x4000000,0x5410000,0x8000027, +0x4000000,0xc8c0000b,0x8000027,0x4000000,0xf8400000,0x8000027,0x4000010,0x4b00000,0x8000027,0x4000010,0x4c00000,0x8000027,0x6800000,0xfd329800,0x8000027,0x6800100, +0xfc462540,0x8000027,0x6800400,0x10962540,0x8000027,0x7c00100,0x8230400,0x8000027,0x7c00100,0x10230400,0x8000027,0x7c00100,0xc8230401,0x8000027,0x7c00100,0xfc230400, +0x8000067,0,0x1900000,0x8000067,0x1000,0,0x8001067,0,0,0x8005012,0x7c00100,0xfdf304c1,0x8005012,0x7c00100,0xfe0304e1,0x8010013, +0x2802400,0x20962460,0x8010013,0x2802500,0x20962460,0x8010027,0x2802100,0xc8962461,0x8010027,0x2802100,0xfc962460,0x8010027,0x2802400,0x8962460,0x8010027,0x2802400, +0x10962460,0x8010027,0x2802400,0x20962460,0x8010027,0x2802500,0x28962460,0x8010027,0x2806400,0xfc962460,0x8010027,0x2902100,0xc0962462,0x9000000,0x4000000,0x4700000, +0x9001000,0x4000000,0x5600000,0xc000000,0,0x4918820,0xc000000,0x4000000,0x4200000,0xc000000,0x4000000,0x5600000,0xc000000,0x4000400,0x4200400,0xc000000, +0x7c00100,0xc8220405,0xc000000,0x7c00500,0x10230400,0xc000000,0x24000000,0x4200000,0xc000000,0x2c000010,0xc9248002,0xc000002,0x4000000,0xf8200000,0xc000002,0x7c00100, +0x20230400,0xc000002,0x7c00100,0xfc230400,0xc000003,0x4000006,0xfb000400,0xc000005,0x4000400,0x44200400,0xc000006,0x7c00100,0x40250400,0xc000008,0x7c00100,0x20220400, +0xc000008,0x7c00100,0x20220401,0xc000008,0x7c00100,0x20250400,0xc000008,0x7c00100,0x20250401,0xc00000b,0x4000000,0x4200000,0xc00000b,0x4000010,0x4200000,0xc00000b, +0x4000010,0x4400000,0xc00000b,0x6800000,0x8200000,0xc00000b,0x7c00100,0x20230400,0xc00000b,0x7c00100,0xfc230400,0xc00000b,0xc000010,0x4248000,0xc00000e,0x7c00100, +0x8220400,0xc00000e,0x7c00100,0x10220400,0xc000013,0x7c00100,0xca633801,0xc000017,0x4000000,0x4200000,0xc000017,0x4000000,0x5600000,0xc000017,0x4000000,0xc400000, +0xc000017,0x4000010,0x4400000,0xc000017,0x4000010,0x5200000,0xc000017,0x6800000,0xfd329800,0xc000017,0x6800100,0xfd862540,0xc000017,0x7c00100,0x9830000,0xc000017, +0x7c00100,0x21830000,0xc000017,0xc000010,0x4448000,0xc000019,0x7c00100,0x8220400,0xc000019,0x7c00100,0x8250400,0xc000019,0x7c00100,0x10220400,0xc000019,0x7c00100, +0x18250400,0xc000019,0x7c00100,0x20220400,0xc000019,0x7c00100,0x20220401,0xc000019,0x7c00100,0x20250400,0xc000019,0x7c00100,0x20250401,0xc000019,0x7c00100,0xfc220401, +0xc000019,0x7c00100,0xfc250401,0xc00001b,0x80000,0xc4c18820,0xc00001b,0x4000000,0x84200000,0xc00001b,0x4000006,0x84500000,0xc00001b,0x4000010,0x84400000,0xc00001b, +0x4000010,0x84b70000,0xc00001b,0x4000800,0x84200000,0xc00001b,0x6800000,0x81329800,0xc00001b,0x7c00100,0x80230400,0xc00001b,0x7c00900,0x80230400,0xc00001b,0xc000010, +0x84b48000,0xc00001c,0x4000000,0x4200000,0xc00001c,0x6800100,0x29862540,0xc00001c,0x6800100,0xfd862400,0xc00001c,0x6800100,0xfd862540,0xc00001c,0xc000010,0x4448000, +0xc00001d,0x4000000,0x84810000,0xc00001d,0x4000000,0x85410000,0xc00001d,0x4000001,0x84445800,0xc00001d,0x7c00100,0x80230400,0xc000020,0x7c00100,0x80230400,0xc000021, +0x4000000,0x4200000,0xc000021,0x6800100,0x30962540,0xc000021,0x6800100,0xfc962540,0xc000021,0x6800100,0xfc962541,0xc000021,0x7c00100,0x8230400,0xc000021,0x7c00100, +0x20230400,0xc000021,0x7c00100,0x30230400,0xc000021,0x7c00100,0xfc230400,0xc000022,0x4000000,0x44200000,0xc000022,0x4000010,0x44200000,0xc000022,0x7c00100,0x40230400, +0xc000022,0xc000010,0x44248000,0xc000022,0x80000000,0x44218560,0xc000025,0x7c00100,0xfc230400,0xc000027,0x4000000,0x4200000,0xc000027,0x4000000,0x4400000,0xc000027, +0x7c00100,0x28230400,0xc000028,0x4000000,0x44200000,0xc000028,0x7c00100,0x40230400,0xc000028,0xc000010,0x44248000,0xc00002e,0x24000000,0x14200000,0xc00002e,0x24000000, +0x14400000,0xc000539,0x4000010,0x84400000,0xc00053e,0x4000010,0x84400000,0xc00053e,0x4000010,0x84b70000,0xc00053e,0xc000010,0x84b48000,0xc000582,0x4000001,0xc8c41c0b, +0xc000d34,0x6800000,0xfd329800,0xc001000,0x4000400,0x4500400,0xc005005,0x7c00100,0x40e30400,0xc005011,0x4020000,0x4e00000,0xc005011,0x4020000,0xc8e00002,0xc005011, +0x7c00300,0xc8e30002,0xc005011,0x7c40300,0x20e30000,0xc005011,0x7c40300,0xfce30000,0xc005029,0x4000000,0x44e00000,0xc005029,0x7c00100,0x40e30400,0xc005029,0x7c00900, +0x41230400,0xc0055a2,0x4008000,0x4e00000,0xc0055a2,0x4010000,0x4e00000,0xc0055be,0x4000000,0x4e00000,0xc008017,0x7c00100,0x9830000,0xc008017,0x7c00100,0x21830000, +0xc008017,0x7c00100,0xfd830000,0xc008017,0x7d00100,0xc1830000,0xc00801c,0x7c00100,0x29830000,0xc00801c,0x7c00100,0xfd830000,0xc00801c,0x7c00100,0xfd830001,0xc010001, +0x2000,0x14962460,0xc010008,0x2000,0xc962460,0xc010017,0x2802100,0xfd862460,0xc010017,0x2802400,0x9862460,0xc010017,0x2802400,0x11862460,0xc010017,0x2802400, +0x19862460,0xc010017,0x2802400,0xfd862460,0xc010017,0x2882000,0xc5862460,0xc01001b,0x2802100,0xa0962460,0xc01001b,0x3c02100,0x80962460,0xc01001b,0x12882000,0xc4962460, +0xc01001c,0x2802100,0x29862460,0xc01001c,0x2802100,0xfd862460,0xc01001c,0x2802400,0xfd862460,0xc010021,0x2802100,0x30962460,0xc010021,0x2802100,0xfc962460,0xc010021, +0x2806400,0xfc962460,0xc010022,0x2802100,0x40962460,0xc010022,0x2802400,0x50962460,0xc010022,0x2802500,0x40962460,0xc010025,0x2802500,0xfc962460,0xc010027,0x2802100, +0x20962460,0xc010027,0x2802100,0xfc962460,0xc010027,0x2802400,0x30962460,0xc0108c2,0x2802100,0x30962460,0xc0108c2,0x2802100,0xfc962460,0xc011001,0x2802400,0x10962460, +0xc011001,0x2802400,0x10c62460,0xc018017,0x2806400,0xfd862460,0xc01801c,0x2806400,0xfd862460,0xd000000,0x80000,0xc4918820,0xd000000,0x180000,0xc0918820,0xd000000, +0x4000000,0x14200000,0xd000000,0x4000000,0xc8200001,0xd000000,0x4000020,0xc8200005,0xd000000,0x6800020,0xc9329805,0xd000000,0x7c00120,0xc8220405,0xd000000,0x7c00120, +0xc8250405,0xd000009,0x7c00100,0x80220400,0xd000009,0x7c00100,0x80250400,0xd00000d,0x7c00100,0x80230400,0xd00000e,0x7c00120,0xc8220402,0xd00000e,0x7c00120,0xc8250402, +0xd00001e,0x4000000,0x84200000,0xd00001e,0x7c00100,0x80230400,0xd000067,0x1000,0,0xd005011,0x7c00300,0xc8e30001,0xd005011,0x7c40300,0x20e30000,0xd005011, +0x7c40300,0xfce30000,0xd010000,0x82000,0xc4962460,0xd010000,0x2802000,0x10962460,0xd010000,0x2802400,0x10962460,0xd010001,0x2802400,0x10962460,0xe000000,0x80000, +0xc5e18820,0xe000000,0x80020,0xc4218820,0xe000000,0x4000000,0x4200000,0xe000000,0x4000000,0x5600000,0xe000000,0x4000001,0xc8445802,0xe000000,0x4000020,0x4200000, +0xe000000,0x4000020,0xc8200005,0xe000000,0x7c00120,0xc8220405,0xe000000,0x7c00120,0xc8250405,0xe000000,0x24000000,0x4100000,0xe000000,0x24000000,0x4200000,0xe000000, +0x24000000,0x4810000,0xe000000,0x24000000,0x5410000,0xe000000,0x24000000,0xc9500002,0xe000000,0x24000020,0x4200000,0xe000000,0x24000020,0x4810000,0xe000000,0x24000020, +0x5410000,0xe000000,0x24000020,0xc8200001,0xe000000,0x24000020,0xc8200002,0xe000000,0x2c000010,0xc9248002,0xe000002,0x4000000,0xc9500008,0xe000002,0x7c00100,0x8230400, +0xe000002,0x7c00100,0x10230400,0xe000008,0x7c00100,0x8220400,0xe000008,0x7c00100,0x8250400,0xe000008,0x7c00100,0x20220400,0xe000008,0x7c00100,0x20250400,0xe00000c, +0x7c00100,0x20230400,0xe00000e,0x4000020,0x4200000,0xe00000e,0x7c00100,0x8220400,0xe00000e,0x7c00100,0x8250400,0xe000019,0x7c00100,0x20250400,0xe000019,0x7c00100, +0xc822040f,0xe000025,0x7c00100,0xfc230400,0xe00002a,0x7c00100,0x80230400,0xe00002b,0x7c00100,0x80230400,0xe00002c,0x7c00100,0x80230400,0xe00002d,0x7c00100,0x80230400, +0xe00053a,0xc000010,0x84448000,0xe000585,0x24000000,0x4200000,0xe001000,0x4000000,0x14100000,0xe003000,0x4000000,0xc8810011,0xe003000,0x4000000,0xc9410011,0xe004000, +0x24000020,0x4810000,0xe004000,0x24000020,0x5410000,0xe005000,0x4000000,0xc8e00003,0xe005000,0x24000020,0x4200000,0xe005011,0x7c00100,0x11230400,0xe005011,0x7c00300, +0xc8e30001,0xe005014,0x7c00100,0xc8e30010,0xe005014,0x7c00100,0xfe530000,0xe005016,0x7c00100,0xa530c00,0xe005016,0x7c00100,0xc8e30c10,0xe005029,0x4000000,0x44e00000, +0xe0055b9,0x24000000,0x14e00000,0xe0055bc,0x4000002,0xf9200c00,0xe0055d2,0x4000000,0x4e00000,0xe0055d2,0x7c00100,0x11230400,0xe010001,0x2000,0x14962460,0xe010001, +0x2802000,0x10962460,0xe010001,0x2802020,0x10962460,0xe01002a,0x2802100,0x80962460,0xe01002a,0x2806400,0x80962460,0xe01002b,0x2802100,0x80962460,0xe01002b,0x2806400, +0x80962460,0xe01002c,0x2802100,0x80962460,0xe01002d,0x2802100,0x80962460,0xe011001,0x2882000,0xc4962460,0xe011001,0x12882000,0xc4962460,0xe011818,0x2802100,0x8962460, +0x10000000,0x4000000,0xc8200002,0x10000000,0x4000400,0x4200400,0x10000000,0x6800000,0x20201c00,0x10000000,0x7c00120,0xc8220405,0x10000000,0x24000000,0x4200000,0x10000000, +0x24000002,0x4200000,0x10000000,0x24000020,0x4200000,0x10000002,0x4000000,0x4200000,0x10000002,0x4000000,0x5071400,0x10000002,0x7c00100,0xfc230400,0x10000002,0x80000000, +0x5329960,0x10000004,0x7c00100,0x8230400,0x10000008,0x7c00100,0x10220400,0x10000009,0x7c00100,0x80220400,0x10000009,0x7c00100,0x80250400,0x1000000a,0x7c00100,0x20230400, +0x1000000e,0x7c00100,0x8220400,0x1000000e,0x7c00100,0x8250400,0x1000000e,0x7c00100,0x10220400,0x1000000e,0x7c00100,0xc8250402,0x1000000e,0x7c00500,0xc822040e,0x1000000e, +0x7c00500,0xc822040f,0x1000000f,0x4000000,0x5600000,0x1000000f,0x7c00100,0x8230400,0x1000000f,0x7c00100,0xfc230400,0x10000010,0x6800100,0x20962540,0x10000015,0x7c00100, +0x8230400,0x10000017,0x4000000,0x4200000,0x10000019,0x7c00100,0x10220400,0x10000019,0x7c00100,0x20220400,0x10000019,0x7c00500,0x10220400,0x10000019,0x7c00500,0xc822040e, +0x10000019,0x7c00500,0xc822040f,0x10000022,0x7c00100,0x40230400,0x10000023,0x4000000,0x4200000,0x10000023,0x4000000,0x5600000,0x1000002f,0x7c00100,0x80230400,0x10000030, +0x4000000,0x44200000,0x10000030,0x6800000,0x41329800,0x10000030,0x6800100,0x40962540,0x10000030,0x7c00100,0x40230400,0x10000030,0xc000010,0x44b48000,0x10000031,0x7c00100, +0x80230400,0x10000032,0x6800000,0x81329800,0x10000032,0x7c00100,0x80230400,0x10000033,0x7c00100,0x80230400,0x10000034,0x7c00100,0x41830000,0x10000035,0x4000010,0x84400000, +0x10000035,0x7c00100,0x80230400,0x10000621,0x4000000,0x84200000,0x10000624,0x4000000,0x84400000,0x10000627,0x4000000,0x84200000,0x10000627,0x4000000,0x84400000,0x10000d2a, +0x4000000,0x4200000,0x10000e1f,0x4000000,0x14200000,0x10001000,0x4000000,0x14200000,0x10005000,0x4000000,0x14200000,0x10005000,0x4000000,0xc8810010,0x10005000,0x4000000, +0xc8e0000d,0x10005000,0x4000000,0xc9410010,0x10005000,0x24000000,0x4200000,0x10005000,0x24000000,0x4e00000,0x10005012,0x4000000,0xc8e00002,0x10005012,0x4000000,0xc8e00003, +0x1000801f,0x7c00100,0x20230400,0x1000801f,0x7c00100,0xfc230400,0x10010002,0x2802100,0x20962460,0x10010002,0x2802400,0x20962460,0x10010002,0x2802500,0x20962460,0x1001000f, +0x2802100,0x8962460,0x10010010,0x2802100,0x20962460,0x10010015,0x2802400,0x20962460,0x10010017,0x2802400,0x19862460,0x10010030,0x2802100,0x40962460,0x10010030,0x2802400, +0x40962460,0x10011001,0x2802400,0x10962460,0x10011001,0x2802400,0x10c62460,0x10011001,0x12882000,0xc4962460,0x1001188f,0x2802400,0x10c62460,0x11000000,0x4000000,0x4200000, +0x11000000,0x4000000,0x5600000,0x11000000,0x4000400,0x14200400,0x11000000,0x7c00120,0xc8220405,0x11000000,0x24000000,0x4200000,0x11000000,0x24000000,0x4e00000,0x11000000, +0x24000000,0x5710000,0x11000000,0x24000000,0xc200000,0x11000000,0x24000000,0xc400000,0x11000000,0x24000000,0x1d710000,0x11000000,0x24000020,0x4200000,0x11000000,0x24000020, +0x4810000,0x11000000,0x24000020,0x5410000,0x11000002,0x4000000,0x5500000,0x11000002,0x7c00100,0x20230400,0x11000002,0x7c00100,0xfc230400,0x11000002,0xc000010,0x4b48000, +0x11000004,0x7c00100,0xfc230400,0x11000007,0x4000000,0x84200000,0x11000007,0x4000000,0x84400000,0x11000007,0x4000000,0x84b00000,0x11000007,0x7c00100,0x80220400,0x11000007, +0x7c00100,0x80250400,0x11000007,0xc000010,0x84448000,0x11000007,0xc000010,0x84b48000,0x11000008,0x7c00100,0x20220400,0x11000008,0x7c00100,0x20250400,0x11000008,0x7c00100, +0xc822040f,0x1100000b,0x4000000,0x4200000,0x1100000b,0x7c00100,0x20230400,0x1100000b,0x7c00100,0xfc230400,0x1100000c,0x7c00100,0x8220400,0x1100000c,0x7c00100,0x30230400, +0x1100000c,0x7c00100,0xc822040f,0x1100000e,0x4000000,0x4200000,0x1100000e,0x4000000,0xc200000,0x1100000e,0x7c00100,0x8230400,0x1100000e,0x7c00100,0x8250400,0x1100000e, +0x7c00100,0x18220400,0x1100000e,0x7c00100,0xc822040f,0x11000013,0x4000000,0xcb00000,0x11000019,0x7c00100,0x10220400,0x11000019,0x7c00100,0x20220400,0x11000019,0x7c00100, +0x20250400,0x11000019,0x7c00100,0xc822040e,0x11000019,0x7c00500,0xc822040f,0x11000023,0x7c00100,0xfc230400,0x11000027,0x4000000,0x4500000,0x11000037,0x4000000,0x84200000, +0x11000037,0x6800100,0x80962540,0x11000037,0x7c00100,0x80230400,0x11000038,0x7c00100,0x80220400,0x11000038,0x7c00100,0x80250400,0x11000039,0x4000000,0x84200000,0x11000039, +0x4000000,0x84400000,0x11000039,0xc000010,0x84448000,0x1100003a,0x4000000,0x44200000,0x1100003a,0x6800100,0x40962540,0x1100003a,0x7c00100,0x40230400,0x1100003b,0x4000000, +0x45800000,0x1100003b,0x6800000,0x41329800,0x1100003b,0x7c00100,0x41830000,0x1100003b,0x7e00100,0x41830000,0x1100003c,0x7c00100,0x40230400,0x1100003c,0x7c00100,0xc823040f, +0x1100003d,0x4000010,0x84400000,0x1100003d,0x7c00100,0x80230400,0x11000587,0x24000000,0xc400000,0x1100058d,0x24000000,0xc400000,0x11000594,0x24000006,0x7000000,0x110005d5, +0x4000400,0xc200000,0x11000d2a,0x6800000,0x21329800,0x11005000,0x4000000,0xc8810010,0x11005000,0x4000000,0xc8870010,0x11005000,0x4000000,0xc8f00010,0x11005000,0x4000000, +0xc9270010,0x11005000,0x4000000,0xc9271010,0x11005000,0x4000000,0xc9410010,0x11005000,0xc000010,0xc8848010,0x11005000,0xc000010,0xc8b48010,0x11005000,0x24000000,0x4200000, +0x11005000,0x24000000,0x4e00000,0x11005011,0x7c00300,0xc8e30001,0x11005011,0x7c40300,0x20e30000,0x11005012,0x4000000,0xc8e00003,0x110055be,0x4000000,0x4e00000,0x1100800a, +0x7c00100,0x10230400,0x11008039,0x7c00100,0x80230400,0x11010001,0x2802000,0x18962460,0x11010001,0x2802020,0x10962460,0x11010002,0x2802100,0x20962460,0x1101000b,0x2802400, +0x20962460,0x1101000e,0x2802000,0x18962460,0x11010013,0x2802400,0x28962460,0x11010013,0x2802500,0x28962460,0x11010013,0x2802500,0x30962460,0x11010037,0x2802100,0x80962460, +0x11010039,0x2802100,0x80962460,0x11010039,0x2802400,0x80962460,0x1101003a,0x2802100,0x40962460,0x1101003a,0x2806400,0x40962460,0x1101088e,0x2802000,0x18962460,0x11011001, +0x2802000,0x10962460,0x11011001,0x2802000,0x10c62460,0x11011865,0x2802000,0x20962460,0x11018039,0x2806400,0x80962460,0x14000000,0x4000000,0x4200000,0x14000000,0x4000400, +0x4200400,0x14000000,0x7c00120,0xc8220405,0x14000000,0x7c00120,0xc8250405,0x14000000,0x7c00500,0x10230400,0x14000000,0x24000000,0x4200000,0x14000000,0x24000020,0x4200000, +0x14000008,0x7c00100,0x20220400,0x14000008,0x7c00100,0x20250400,0x14000008,0x7c00100,0xfc220400,0x1400000e,0x7c00100,0x8220400,0x14000015,0x7c00100,0x8230400,0x14000019, +0x7c00100,0x8220400,0x14000019,0x7c00100,0x8250400,0x14000019,0x7c00100,0x10220400,0x14000019,0x7c00100,0x10250400,0x14000019,0x7c00100,0x20220400,0x14000019,0x7c00100, +0x20250400,0x14000019,0x7c00100,0xfc220400,0x14000019,0x7c00100,0xfc250400,0x1400003e,0x4000000,0x44400000,0x1400003e,0x4000000,0x44e00000,0x1400003e,0x4000010,0x44400000, +0x1400003e,0x6800000,0x42d29800,0x1400003e,0x6800100,0x40962540,0x1400003e,0x6800100,0x40962541,0x1400003e,0x7c00100,0x42b30400,0x1400003e,0x7c00100,0x42b30401,0x1400003e, +0xc000010,0x44448000,0x14000057,0x4000000,0x44200000,0x14000057,0x4000010,0x45071400,0x14000057,0x6800000,0x41329800,0x14000057,0x7c00100,0x40230400,0x14000057,0x7c00100, +0x48230400,0x14000057,0x7c00500,0x40230400,0x14000057,0x7c00900,0x48230400,0x14000057,0xc000010,0x44b48000,0x1400005a,0x4000000,0x84500000,0x1400005a,0x7c00100,0x80230400, +0x1400005a,0xc000010,0x84b48000,0x1400005b,0x4000000,0x84200000,0x1400005b,0x4000010,0x84400000,0x1400005b,0x7c00100,0x80230400,0x14000065,0x4000010,0x84400000,0x14000065, +0x7c00100,0x80230400,0x140055be,0x4000000,0x4200000,0x1400800a,0x7c00100,0xfc230400,0x1400803e,0x7c00100,0x42b30400,0x1400803e,0x7c00100,0x42b30401,0x14010001,0x2802020, +0x10962460,0x14010001,0x2802400,0x10962460,0x14010013,0x2802500,0x20962460,0x14010015,0x2802100,0x8962460,0x1401003e,0x2802100,0x40962460,0x1401003e,0x2802100,0x40962461, +0x1401003e,0x2802400,0x40962460,0x1401003e,0x2802400,0x50962460,0x14010057,0x2802400,0x40962460,0x1401803e,0x2806400,0x42f62460,0x15000000,0x80020,0xc4218820,0x15000000, +0x4000000,0x4200000,0x15000000,0x4000000,0x4e00000,0x15000000,0x4000000,0xc200000,0x15000000,0x4000000,0x14200000,0x15000000,0x4000400,0x4200400,0x15000000,0x7c00500, +0x10230400,0x15000000,0x24000000,0x4200000,0x15000000,0x24000000,0x4400000,0x15000000,0x24000000,0x4810000,0x15000000,0x24000000,0x4e00000,0x15000000,0x24000000,0x5400000, +0x15000000,0x24000000,0x5410000,0x15000000,0x24000000,0x5710000,0x15000000,0x24000000,0xc400000,0x15000000,0x24000002,0x4200000,0x15000000,0x24000020,0x4200000,0x15000000, +0x24000020,0x4810000,0x15000000,0x24000020,0x5410000,0x15000000,0x24000500,0xc230400,0x15000000,0x2c000010,0xcb48000,0x15000002,0x4000000,0x5500000,0x15000002,0x4000020, +0x4200000,0x15000002,0x7c00100,0x8230400,0x15000002,0x7c00100,0x20230400,0x15000002,0x7c00100,0xfc230400,0x15000008,0x4000000,0x4200000,0x15000008,0x4000000,0xc200000, +0x15000008,0x7c00100,0x8220400,0x15000008,0x7c00100,0x8230400,0x15000008,0x7c00100,0x8250400,0x15000008,0x7c00500,0x8230400,0x1500000a,0x7c00100,0xfc230400,0x1500000a, +0x7c00500,0x8230400,0x1500000e,0x7c00100,0x8220400,0x1500000e,0x7c00100,0x8250400,0x1500000e,0x7c00100,0x10250400,0x15000019,0x7c00100,0x8220400,0x15000019,0x7c00100, +0x8230400,0x15000019,0x7c00100,0x8250400,0x15000019,0x7c00100,0x10220400,0x15000019,0x7c00100,0x10250400,0x15000019,0x7c00100,0x18220400,0x15000019,0x7c00100,0x18250400, +0x15000019,0x7c00100,0x20220400,0x15000019,0x7c00100,0x20250400,0x15000019,0x7c00100,0xc822040e,0x15000019,0x7c00100,0xc822040f,0x15000019,0x7c00100,0xfc250400,0x1500001a, +0x4000000,0x4200000,0x1500001a,0x4000000,0x5500000,0x1500001a,0x7c00100,0x8230400,0x1500001a,0x7c00100,0xfc230400,0x1500001b,0x7c00100,0x80230400,0x1500001c,0x4000000, +0x5800000,0x1500001c,0x6800000,0x21329800,0x1500001c,0x6800100,0x21862400,0x1500001c,0x6800100,0xfd862400,0x1500001c,0x6800100,0xfd862540,0x1500001c,0x6800500,0x21862400, +0x1500001c,0x6800500,0xfd862400,0x15000023,0x7c00100,0x10230400,0x15000024,0x4000000,0x4200000,0x15000024,0x7c00100,0x8230400,0x15000027,0x4000000,0x4200000,0x15000027, +0x4000000,0x4400000,0x15000027,0x4000000,0x4500000,0x15000027,0x7c00100,0x20230400,0x15000042,0x4000000,0x44e00000,0x15000042,0x6800000,0x42d29800,0x15000042,0x6800100, +0x40962540,0x15000042,0x7c00100,0x40430400,0x15000042,0x7c00100,0x42d30400,0x15000042,0xc000010,0x44448000,0x1500004f,0x6800000,0x41329800,0x1500004f,0x7c00100,0x40230400, +0x1500004f,0xc000010,0x44448000,0x15000052,0x4000010,0x44400000,0x15000052,0x6800000,0x41329800,0x15000052,0x6800100,0x40962540,0x15000052,0x7c00100,0x40230400,0x15000052, +0xc000010,0x44448000,0x15000063,0x4000010,0x44400000,0x15000063,0x6800000,0x41329800,0x15000063,0x7c00100,0x40230400,0x15000063,0x7c00100,0x48230400,0x15000063,0x7c00900, +0x40230400,0x15000063,0xc000010,0x44448000,0x15000063,0xc000010,0x44b48000,0x15000068,0x7c00100,0x80230400,0x1500006b,0x7c00100,0x80230400,0x1500006c,0x4000000,0x84200000, +0x1500006c,0x7c00100,0x80230400,0x1500006d,0x6800000,0x41329800,0x1500006d,0x7c00100,0x40230400,0x1500006d,0x7c00500,0x40230400,0x1500006d,0x7c00d00,0x40230400,0x1500006d, +0xc000010,0x44448000,0x1500006e,0x4000000,0x84200000,0x1500006e,0x6800100,0x80962540,0x1500006e,0x7c00100,0x80230400,0x1500006f,0x6800000,0x41329800,0x1500006f,0x6800100, +0x40962540,0x1500006f,0x7c00100,0x40230400,0x1500006f,0xc000010,0x44448000,0x15000071,0x6800000,0x41329800,0x15000071,0x6800100,0x40962540,0x15000596,0x24000000,0x84400000, +0x15000616,0x4000400,0x4400000,0x15004000,0x24000020,0x4810000,0x15004000,0x24000020,0x5410000,0x15005000,0x4000000,0x4e00000,0x15005000,0x24000000,0x4200000,0x15005005, +0x7c00100,0x40e30400,0x15005011,0x7c40300,0x20e30000,0x150055be,0x4000000,0x4e00000,0x1500801c,0x7c00100,0x21830000,0x1500801c,0x7c00100,0xfd830000,0x15008024,0x7c00100, +0x8230400,0x15008071,0x7c00100,0x40230400,0x15010001,0x2802000,0x8962460,0x15010001,0x2802000,0x10962460,0x15010001,0x2802000,0x18962460,0x15010001,0x2802100,0x18962460, +0x15010001,0x2802400,0x10962460,0x15010001,0x2802400,0x10c62460,0x15010001,0x2802400,0x18962460,0x15010002,0x2802100,0x20962460,0x15010008,0x2000,0xc962460,0x15010008, +0x2802100,0x8962460,0x15010008,0x2802400,0x20962460,0x15010010,0x2802100,0x20962460,0x1501001a,0x2802100,0x20962460,0x1501001c,0x2802100,0x21862460,0x1501001c,0x2802100, +0xfd862460,0x1501001c,0x2802500,0x21862460,0x1501001c,0x2806400,0xfd862460,0x1501001f,0x2802100,0x20962460,0x15010024,0x2802100,0x20962460,0x15010042,0x2802100,0x40962460, +0x1501004f,0x2802100,0x40962460,0x1501004f,0x2802400,0x40962460,0x15010052,0x2802100,0x40962460,0x15010052,0x2802400,0x40962460,0x15010052,0x2802d00,0x40962460,0x1501006e, +0x2802100,0x80962460,0x1501006e,0x2806400,0x80962460,0x1501006f,0x2806400,0x40962460,0x15010071,0x2802100,0x40962460,0x15010071,0x2806400,0x40962460,0x15010991,0x2802000, +0x10962460,0x15010c9c,0x2802400,0x18962460,0x15010c9c,0x2802400,0x20962460,0x16000000,0x4000000,0x4200000,0x16000000,0x4000000,0x5500000,0x16000000,0x4000000,0x5600000, +0x16000000,0x4000000,0xc8100006,0x16000000,0x4000000,0xc8200003,0x16000000,0x24000000,0x4200000,0x16000002,0x4000000,0x4200000,0x16000004,0x4000000,0x5600000,0x16000007, +0x7c00100,0x80220400,0x16000007,0x7c00100,0x80250400,0x16000008,0x7c00100,0xfc220400,0x16000008,0x7c00100,0xfc250400,0x1600000a,0x4000000,0xc200000,0x1600000a,0x6800100, +0x8962540,0x1600000a,0x7c00100,0x8230400,0x16000012,0x7c00100,0xa230500,0x16000012,0x7c00100,0xa330520,0x16000019,0x7c00100,0x8250400,0x1600001c,0x4000000,0x5800000, +0x1600001c,0x6800100,0x21862400,0x1600001c,0x6800500,0x21862400,0x1600001c,0x6800500,0xfd862400,0x1600001c,0x7c00100,0x21830000,0x1600001c,0x7c00900,0x21830000,0x16000028, +0x4000002,0x47000000,0x16000028,0x7c00100,0x40230400,0x1600003b,0x6800000,0x41329800,0x1600003b,0x7c00100,0x41830000,0x16000047,0x7c00100,0x80230400,0x16000047,0x7c00100, +0x80830400,0x16000047,0x7c00100,0x81430400,0x1600004e,0x4000000,0x44e00000,0x1600004e,0x4000010,0x44400000,0x1600004e,0x6800000,0x42d29800,0x1600004e,0x6800100,0x40962540, +0x1600004e,0x7c00100,0x42b30400,0x1600004e,0xc000010,0x44448000,0x16000058,0x7c00100,0x80230400,0x1600005b,0x4000000,0x84200000,0x1600006a,0x4000000,0x45800000,0x1600006a, +0x6800000,0x41329800,0x1600006a,0x6800100,0x41862400,0x1600006a,0x6800100,0x41862540,0x1600006a,0x7c00900,0x41830000,0x1600006a,0xc000010,0x45848000,0x16000073,0x6800000, +0x41329800,0x16000073,0x6800100,0x40962540,0x16000073,0x6800400,0x40962540,0x16000073,0x7c00100,0x40230400,0x16000073,0xc000010,0x44448000,0x16000074,0x4000000,0x84200000, +0x16000074,0x4000010,0x84400000,0x16000074,0x7c00100,0x80230400,0x16000075,0x4000000,0x84400000,0x16000075,0x4000010,0x84400000,0x16000075,0x7c00100,0x80230400,0x16000078, +0x4000000,0x84200000,0x16000078,0x6800100,0x80962540,0x16000078,0x7c00100,0x80230400,0x16000078,0x7c00100,0x80230401,0x16000078,0xc000010,0x84448000,0x16000078,0x80000000, +0x85329960,0x1600007a,0x4000000,0x84200000,0x1600007a,0x7c00100,0x80230400,0x1600007d,0x4000000,0x84200000,0x1600007d,0x7c00100,0x80230400,0x1600007e,0x4000000,0x84200000, +0x1600007e,0x4000010,0x84200000,0x1600007e,0x7c00100,0x80230400,0x1600007e,0xc000010,0x84248000,0x1600007f,0x4000000,0x45800000,0x1600007f,0x4000010,0x45800000,0x1600007f, +0x7c00100,0x41830000,0x1600007f,0x7c00500,0x41830000,0x1600007f,0x7c00900,0x41830000,0x1600007f,0x7e00100,0x41830000,0x16000082,0x4000000,0x44200000,0x16000082,0x4000010, +0x44400000,0x16000082,0x7c00100,0x40230400,0x16000082,0xc000010,0x44448000,0x16000083,0x4000010,0x44400000,0x16000083,0x7c00100,0x40230400,0x16000083,0xc000010,0x44448000, +0x16000085,0x4000000,0x84200000,0x16000085,0x7c00100,0x80230400,0x16000540,0x7c00100,0x8230400,0x16000542,0x4000400,0xc200000,0x1600055c,0x6800400,0x8962540,0x16000561, +0x7c00100,0x8230400,0x16000564,0x7c00100,0x8230400,0x16000567,0x7c00100,0x8230400,0x1600056d,0x7c00100,0x8230400,0x16000598,0x24000000,0xc400000,0x160005d7,0x4000000, +0x4200000,0x160005e7,0x4000000,0x4200000,0x160005f6,0x4000000,0x4200000,0x16000601,0x4000000,0x5500000,0x16000619,0x7c00900,0x60430400,0x16000e14,0x7c00100,0x8230400, +0x16001000,0x4000000,0x4100000,0x16001000,0x4000000,0xc8100002,0x16001000,0x4000000,0xc8100003,0x16001000,0x4000000,0xc8100006,0x16001000,0x4000000,0xc810000d,0x16001000, +0x4000100,0x4150400,0x16001000,0x4000100,0xc815040d,0x16001000,0x24000000,0x4100000,0x16001000,0x24000000,0x4e00000,0x16001000,0x24000000,0x6800000,0x16005000,0x4000000, +0xc8e00002,0x16005000,0x4000000,0xc8e0000d,0x16005000,0x24000000,0x4100000,0x16005000,0x24000000,0x4e00000,0x16005011,0x7c00300,0xc8e30001,0x16005011,0x7c40300,0x20e30000, +0x16005012,0x7c00100,0xa130480,0x16005014,0x4000000,0xc8e0000d,0x160055be,0x4000000,0xc8e00003,0x1600800a,0x7c00100,0x20230400,0x1600801c,0x7c00100,0x21830000,0x1600804e, +0x7c00100,0x42b30400,0x1600806a,0x7c00100,0x41830000,0x16008073,0x7c00100,0x40230400,0x16010001,0x2802400,0x10962460,0x16010007,0x2802400,0x80962460,0x16010007,0x2802400, +0x90962460,0x1601000a,0x2802100,0x20962460,0x1601000a,0x2802400,0x8962460,0x1601001c,0x2802100,0x21862460,0x1601004e,0x2802100,0x40962460,0x1601004e,0x2802400,0x40962460, +0x1601006a,0x2802100,0x41862460,0x1601006a,0x2802400,0x40962460,0x1601006a,0x2802400,0x41862460,0x16010073,0x2802100,0x40962460,0x16010073,0x2806400,0x40962460,0x16010078, +0x2802100,0x80962460,0x16010078,0x2802400,0x80962460,0x16010078,0x2806400,0x80962460,0x1601007e,0x2802000,0x80962460,0x1601007e,0x2802100,0x80962460,0x1601007e,0x2802400, +0x80962460,0x1601007f,0x2802100,0x41862460,0x1601007f,0x2802400,0x41862460,0x16010082,0x2802400,0x40962460,0x16010940,0x2802400,0x8962460,0x16010941,0x2802400,0x8962460, +0x16010945,0x2802400,0x8962460,0x1601094a,0x2802400,0x8962460,0x1601094d,0x2802400,0x8962460,0x16010950,0x2802400,0x8962460,0x16010954,0x2802400,0x8962460,0x16010956, +0x2802400,0x8962460,0x1601095e,0x2802400,0x8962460,0x16010969,0x2802400,0x8962460,0x16010e10,0x2802400,0x8962460,0x1601804e,0x2806400,0x42f62460,0x1601806a,0x2806400, +0x41862460,0x18000000,0x4000000,0x4200000,0x18000000,0x4000000,0x4e00000,0x18000000,0x4000000,0x5600000,0x18000000,0x4000000,0x6703580,0x18000000,0x24000000,0x4200000, +0x18000000,0x24000000,0x4e00000,0x18000000,0x24000000,0x5710000,0x18000000,0x24000020,0x4200000,0x18000002,0x4000000,0x14200000,0x18000002,0x7c00100,0xfc230400,0x18000008, +0x7c00100,0x8220400,0x18000008,0x7c00100,0x8250400,0x1800000a,0x6800100,0xfc962540,0x1800000a,0x7c00100,0xfc230400,0x1800000b,0x7c00100,0x20230400,0x18000019,0x7c00100, +0x8220400,0x18000019,0x7c00100,0x8250400,0x18000019,0x7c00100,0x10220400,0x18000019,0x7c00100,0xc822040e,0x18000019,0x7c00100,0xfc250400,0x1800001a,0x7c00100,0x8230560, +0x1800001f,0x4000000,0x4200000,0x18000027,0x4000000,0x4c00000,0x18000027,0x7c00100,0x8230400,0x1800003c,0x4000000,0x44400000,0x1800003f,0x4000000,0x44200000,0x1800003f, +0x6800100,0x40962540,0x1800003f,0x7c00100,0x42d30400,0x18000041,0x4000000,0x84e00000,0x18000041,0x4000010,0x84e00000,0x18000041,0x6800000,0x82d29800,0x18000041,0x6800100, +0x80962540,0x18000041,0x7c00100,0x82b30400,0x18000041,0x7c00100,0x82c30400,0x18000041,0xc000010,0x84448000,0x18000054,0x4000010,0x44200000,0x18000054,0x7c00100,0x40230400, +0x18000082,0x7c00100,0x40230400,0x18001000,0x4000000,0x4100000,0x18001000,0x4000000,0xc810000d,0x18001000,0x4000100,0x4150400,0x18001000,0x4000100,0xc815040d,0x18005000, +0x4000000,0x4100000,0x18005000,0x4000000,0x4200000,0x18005000,0x4000000,0x4e00000,0x18005000,0x4000000,0x6800000,0x18005000,0x4000000,0xc8e0000d,0x18005000,0x24000000, +0x4200000,0x18005000,0x24000000,0x4e00000,0x18005000,0x24000000,0x6800000,0x18005005,0x7c00100,0x40e30400,0x18005011,0x7c40300,0x20e30000,0x18005014,0x7c00100,0x8e30000, +0x18005016,0x7c00100,0x8e30c00,0x180055be,0x4000000,0xc8e00003,0x1800801a,0x7c00100,0x8230400,0x1800801a,0x7c00100,0x20230400,0x18010001,0x2802400,0x10c62460,0x18010002, +0x2802100,0x20962460,0x1801000a,0x2802100,0xfc962460,0x1801000b,0x2802400,0x20962460,0x18010027,0x2802100,0x8962460,0x1801003c,0x2806000,0x40962460,0x1801003f,0x2802100, +0x40962460,0x1801003f,0x2802400,0x40962460,0x1801003f,0x2806400,0x42e62460,0x18010041,0x2802100,0x80962460,0x18010041,0x2806400,0x82f62460,0x18010054,0x2802000,0x40962460, +0x19000000,0x4000000,0x4200000,0x19000000,0x4000000,0xc820000f,0x19000000,0x24000000,0x4200000,0x19000000,0x24000000,0x4400000,0x19000000,0x24000000,0xc200000,0x19000000, +0x24000002,0x4300000,0x19000000,0x24000020,0x4200000,0x19000002,0x4000020,0x4200000,0x19000002,0x7c00100,0x20230400,0x19000002,0x7c00100,0xfc230400,0x19000002,0x7c00120, +0xc8230405,0x19000002,0x80000000,0x5329960,0x19000003,0x4000000,0x5600000,0x19000007,0x7c00100,0x80220400,0x19000007,0x7c00100,0x80250400,0x1900000c,0x7c00100,0x10220400, +0x1900000c,0x7c00100,0x20230400,0x1900000c,0x7c00100,0xfc250400,0x1900000f,0x4000000,0x4200000,0x19000018,0x7c00100,0x21830000,0x19000019,0x7c00100,0x20220400,0x19000019, +0x7c00100,0x20250400,0x19000019,0x7c00100,0xfc250400,0x19000019,0x7c00500,0xc822040f,0x1900003c,0x7c00100,0x40230400,0x19000056,0x7c00100,0x80230400,0x1900005c,0x6800100, +0x40962540,0x1900005c,0x7c00100,0x40230400,0x1900005c,0x7c00500,0x40230400,0x19000071,0x4000000,0x44200000,0x19000071,0x7c00100,0x40230400,0x19000073,0x6800100,0x40962540, +0x19000073,0x7c00100,0x40230400,0x19000073,0x7c00900,0x40230400,0x19000073,0xc000010,0x44448000,0x19000076,0x4000000,0x44400000,0x19000076,0x6800000,0x41329800,0x19000076, +0x6800100,0x40962540,0x19000076,0xc000010,0x44448000,0x1900008d,0x7c00100,0x80230400,0x19000097,0x4000000,0x84200000,0x19000097,0x4000000,0x84400000,0x19000097,0x6800000, +0x81329800,0x19000097,0x6800100,0x80962540,0x19000097,0x7c00100,0x80230400,0x19000097,0x7c00100,0x80230560,0x19000097,0xc000010,0x84448000,0x19000098,0x6800000,0x81329800, +0x19000098,0x7c00100,0x80230400,0x19000099,0x6800000,0x81329800,0x19000099,0x6800100,0x80962540,0x19000099,0x7c00100,0x80230400,0x1900055c,0x7c00100,0x8230400,0x19000578, +0x7c00100,0x8230400,0x19005000,0x4000000,0x4e00000,0x19005011,0x7c00300,0xc8e30001,0x19005011,0x7c40300,0x20e30000,0x19008071,0x7c00100,0x40230400,0x19008073,0x7c00100, +0x40230400,0x19008076,0x7c00100,0x40230400,0x19010002,0x2802400,0x20962460,0x19010002,0x2802500,0x20962460,0x19010008,0x2802100,0x8962460,0x1901005c,0x2802500,0x40962460, +0x19010071,0x2802100,0x40962460,0x19010073,0x2802100,0x40962460,0x19010076,0x2802100,0x40962460,0x19010076,0x2802100,0x40962461,0x19010076,0x2806400,0x40962460,0x19010097, +0x2802100,0x80962460,0x19010097,0x2806400,0x80962460,0x19010099,0x2802100,0x80962460,0x19010099,0x2802400,0x80962460,0x19010099,0x2806400,0x80962460,0x1901097a,0x2802400, +0x8962460,0x19018071,0x2806400,0x40962460,0x19018073,0x2806400,0x40962460,0x19018076,0x2806400,0x40962460,0x1a000000,0x4000000,0x5600000,0x1b000000,0x80000,0xc4918820, +0x1b000caf,0x80000,0xc4918820,0x1c000000,0x4000000,0x4100000,0x1c000000,0x4000000,0x4200000,0x1c000000,0x4000000,0x4e00000,0x1c000000,0x4000000,0x5200000,0x1c000000, +0x4000000,0x5500000,0x1c000000,0x4000000,0x5600000,0x1c000000,0x4000000,0x5710000,0x1c000000,0x4000000,0x6800000,0x1c000000,0x4000400,0x4200400,0x1c000000,0x24000000, +0x4200000,0x1c000000,0x24000000,0x4400000,0x1c000000,0x24000000,0x4e00000,0x1c000000,0x24000002,0x7000000,0x1c000000,0x24000008,0x5410000,0x1c000000,0x80000000,0x5329960, +0x1c000002,0x7c00100,0x8230400,0x1c000002,0x7c00100,0x20230400,0x1c000003,0x4000000,0x4200000,0x1c000004,0x7c00100,0x8230400,0x1c000008,0x7c00100,0x8220400,0x1c000008, +0x7c00100,0x8250400,0x1c000008,0x7c00500,0xc822040f,0x1c00000e,0x4000000,0x4200000,0x1c00000e,0x7c00100,0x8220400,0x1c00000e,0x7c00100,0x8250400,0x1c000019,0x7c00100, +0x8220400,0x1c000019,0x7c00100,0x8230400,0x1c000019,0x7c00100,0x8250400,0x1c000019,0x7c00500,0xc822040f,0x1c00001c,0x6800000,0x21329800,0x1c00001c,0x6800500,0x21862400, +0x1c00001c,0x7c00900,0x9830000,0x1c00001e,0x7c00100,0x80230400,0x1c000020,0x7c00100,0x80230400,0x1c000021,0x4000000,0x4200000,0x1c000021,0x6800000,0x21329800,0x1c000030, +0x7c00100,0x40230400,0x1c00004b,0x4000000,0x84200000,0x1c00004b,0x4000010,0x84400000,0x1c00004b,0x6800000,0x81329800,0x1c00004b,0x7c00100,0x80230400,0x1c00004b,0x7c00900, +0x80230400,0x1c00004b,0xc000010,0x84448000,0x1c000053,0x7c00100,0x80230400,0x1c000059,0x7c00100,0x80230400,0x1c000065,0x4000010,0x84400000,0x1c000065,0x7c00100,0x80230400, +0x1c000079,0x4000000,0x84200000,0x1c000079,0x4000000,0x84f00000,0x1c000079,0x4000010,0x84400000,0x1c000079,0x7c00100,0x80230400,0x1c00007b,0x4000000,0x84200000,0x1c00007b, +0x4000010,0x84200000,0x1c00007b,0x7c00100,0x80230400,0x1c000086,0x7c00100,0x80230400,0x1c000086,0xc000010,0x84448000,0x1c000087,0x4000000,0x84200000,0x1c000087,0x7c00100, +0x80230400,0x1c000087,0xc000010,0x84448000,0x1c000088,0x7c00100,0x80230400,0x1c000089,0x6800100,0x80962540,0x1c000089,0x6800100,0x80962541,0x1c000089,0x7c00100,0x80430400, +0x1c000089,0x7c00100,0x82b30400,0x1c000089,0x7c00100,0x82d30400,0x1c000089,0x7c00900,0x80430400,0x1c00008c,0x4000000,0x84200000,0x1c00008c,0x7c00100,0x80230400,0x1c00008e, +0x4000000,0x84200000,0x1c00008e,0x7c00100,0x80230400,0x1c00008f,0x4000000,0x84200000,0x1c00008f,0x7c00100,0x80230400,0x1c000090,0x4000000,0x84200000,0x1c000090,0x7c00100, +0x80230400,0x1c000091,0x6800000,0x81329800,0x1c000091,0x6800100,0x80962540,0x1c000091,0x7c00100,0x80230400,0x1c000092,0x4000000,0x84200000,0x1c000092,0x6800000,0x81329800, +0x1c000092,0x7c00100,0x80220400,0x1c000092,0x7c00100,0x80230400,0x1c000092,0x7c00100,0x80250400,0x1c000095,0x6800000,0xa1329800,0x1c000095,0x7c00100,0xa0230400,0x1c000095, +0xc000010,0x84448000,0x1c000097,0x7c00100,0x80230400,0x1c000097,0xc000010,0x84248000,0x1c00009d,0x4000000,0x84200000,0x1c00009d,0x4000010,0x84200000,0x1c00009d,0x6800100, +0x80962540,0x1c00009d,0x7c00100,0x80230400,0x1c00009d,0xc000010,0x84448000,0x1c00009e,0x4000000,0x84200000,0x1c00009e,0x6800000,0x81329800,0x1c00009e,0x6800100,0x80962540, +0x1c00009e,0x6800100,0x80962541,0x1c00009e,0x7c00100,0x80230400,0x1c00009f,0x4000000,0x84200000,0x1c00009f,0x7c00100,0x80230400,0x1c0000a0,0x4000000,0x84200000,0x1c0000a0, +0x4000000,0x84500000,0x1c0000a0,0x7c00100,0x80230400,0x1c0000a3,0x4000000,0x84200000,0x1c0000a3,0x6800000,0x81329800,0x1c0000a3,0x6800100,0x80962540,0x1c0000a3,0x7c00100, +0x80230400,0x1c0000a3,0xc000010,0x84448000,0x1c0000a5,0x7c00100,0x80230400,0x1c0000a6,0x4000000,0x84500000,0x1c0000a6,0x4000010,0x84b00000,0x1c0000a6,0x4000800,0x84200000, +0x1c0000a6,0x6800100,0x80962540,0x1c0000a6,0x6800100,0x80962541,0x1c0000a6,0x7c00100,0x80230400,0x1c0000a6,0xc000010,0x84448000,0x1c00045f,0x80000,0xc4918820,0x1c00045f, +0x2c000010,0x84448000,0x1c00059f,0x24000010,0x4400000,0x1c000629,0x4000000,0xc200000,0x1c000e2d,0x4000010,0x84400000,0x1c000e2f,0x6800100,0xfc962540,0x1c005000,0x4000000, +0x4e00000,0x1c005000,0x4000000,0x6800000,0x1c00800a,0x7c00100,0x8230400,0x1c00801c,0x7c00100,0x9830000,0x1c00801c,0x7c00100,0x21830000,0x1c008024,0x7c00100,0x8230400, +0x1c010001,0x2400,0x4962460,0x1c010001,0x2802100,0x10962460,0x1c010001,0x2802400,0x8962460,0x1c010001,0x2802400,0x10962460,0x1c010001,0x2802400,0x10c62460,0x1c010002, +0x2802100,0x20962460,0x1c010015,0x2802100,0x8962460,0x1c01001a,0x2802100,0x8962460,0x1c01001c,0x2802500,0x9862460,0x1c01001c,0x2802500,0x21862460,0x1c010024,0x2802100, +0x8962460,0x1c010041,0x2806000,0x80c62460,0x1c01004b,0x2802400,0x80962460,0x1c010059,0x2802100,0x80962460,0x1c010079,0x2802400,0x80962460,0x1c010086,0x2802400,0x80962460, +0x1c010087,0x2802000,0x80962460,0x1c010087,0x2802100,0x80962460,0x1c010089,0x2802100,0x80962460,0x1c010089,0x2802400,0x80962460,0x1c010089,0x2806400,0x82f62460,0x1c01008c, +0x2802400,0x80962460,0x1c010091,0x2802100,0x80962460,0x1c010091,0x2802400,0x80962460,0x1c010091,0x2806400,0x80962460,0x1c01009d,0x2802100,0x80962460,0x1c01009d,0x2802400, +0x80962460,0x1c01009d,0x2802900,0x80962460,0x1c01009d,0x2806400,0x80962460,0x1c01009e,0x2802100,0x80962460,0x1c01009e,0x2802400,0x80962460,0x1c01009e,0x2806400,0x80962460, +0x1c0100a0,0x2802400,0x80962460,0x1c0100a3,0x2802100,0x80962460,0x1c0100a3,0x2806400,0x80962460,0x1c0100a6,0x2802100,0x80962460,0x1c0100a6,0x2802400,0x80962460,0x1c0100a6, +0x2806400,0x80962460,0x1c010978,0x2802400,0x8962460,0x1c010a29,0x2802400,0x8962460,0x1c010e2f,0x2802100,0xfc962460,0x1c010e2f,0x2802400,0xfc962460,0x20000000,0x4000000, +0x5500000,0x20000000,0x4000000,0x24200000,0x20000000,0x4000000,0x24e00000,0x20000000,0x4000000,0x34200000,0x20000000,0x24000000,0x24200000,0x20000002,0x7c00100,0x20230400, +0x20000006,0x7c00100,0x40220400,0x20000006,0x7c00100,0x40250400,0x2000000a,0x4000000,0x2c500000,0x2000000a,0x7c00100,0x28230400,0x20000019,0x7c00100,0x20220400,0x20000019, +0x7c00100,0x20230400,0x20000019,0x7c00100,0x20250400,0x2000001a,0x7c00100,0x8230400,0x2000004c,0x4000000,0x84200000,0x2000004c,0x7c00100,0x80220400,0x2000004c,0x7c00100, +0x80250400,0x20000065,0x7c00100,0x80230400,0x20000070,0x4000000,0x84200000,0x20000070,0x4000010,0x84400000,0x20000070,0xc000010,0x84448000,0x20000089,0x7c00100,0x82d30400, +0x2000008d,0x4000000,0x84200000,0x20000097,0x4000000,0x84400000,0x20000097,0x4000000,0x84500000,0x20000097,0x7c00100,0x80230400,0x20000097,0xc000010,0x84448000,0x2000009c, +0x7c00100,0x80230400,0x2000009c,0x7c00100,0x80830400,0x2000009c,0x7c00100,0x81430400,0x200000a1,0x4000000,0x85800000,0x200000a1,0x6800000,0x81329800,0x200000a1,0x6800100, +0x81862400,0x200000a1,0x6800100,0x81862540,0x200000a1,0x7c00100,0x81830000,0x200000a1,0xc000010,0x84448000,0x200000a2,0x4000000,0x84200000,0x200000a2,0x7c00100,0x80230400, +0x200000a4,0x7c00100,0x80230400,0x200000a4,0xc000010,0x84448000,0x200000a6,0x7c00100,0x80230400,0x200000a6,0xc000010,0x84448000,0x20005000,0x4000000,0x4e00000,0x20005000, +0x4000000,0x6800000,0x20005011,0x7c40300,0x20e30000,0x2000800f,0x7c00100,0x20230400,0x20008024,0x7c00100,0x20230400,0x20010002,0x2802500,0x20962460,0x20010008,0x2802100, +0x28962460,0x20010008,0x2802400,0x30962460,0x20010008,0x2802400,0x30c62460,0x20010070,0x2802000,0x80962460,0x20010089,0x2802100,0x80962460,0x20010097,0x2802000,0x80962460, +0x20010097,0x2802400,0x80962460,0x200100a1,0x2802100,0x81862460,0x200100a1,0x2806400,0x81862460,0x200100a6,0x2802100,0x80962460,0x20015000,0x4000000,0x6902460,0x24000000, +0x4000000,0x4e00000,0x24000000,0x24000000,0x4200000,0x24000000,0x24000000,0x4400000,0x24000000,0x80000000,0x5329960,0x24000002,0x7c00100,0x20230400,0x24000002,0x7c00100, +0xfc230400,0x24000008,0x7c00100,0x8220400,0x2400000e,0x4000000,0x4200000,0x24000015,0x7c00100,0x20230400,0x24000019,0x7c00100,0x10250400,0x2400001a,0x4000000,0x4200000, +0x2400001a,0x7c00100,0x20230400,0x2400001b,0x4000000,0x84500000,0x240000a7,0x4000000,0x45400000,0x240000a7,0x6800000,0x41329800,0x240000a7,0x7c00100,0x40220400,0x240000a7, +0x7c00100,0x40250400,0x240000a8,0x4000000,0x84200000,0x240000a8,0x4000000,0x84400000,0x240000a8,0x4000010,0x84400000,0x240000a8,0x6800000,0x81329800,0x240000a8,0x6800100, +0x80962540,0x240000a8,0x7c00100,0x80230400,0x240000a8,0xc000010,0x84448000,0x240000a9,0x4000000,0x84500000,0x240000a9,0x4000010,0x84b00000,0x240000a9,0x6800100,0x80962540, +0x240000a9,0x7c00100,0x80230400,0x240000aa,0x4000000,0x44200000,0x240000aa,0x4000000,0x44400000,0x240000aa,0x4000010,0x44400000,0x240000aa,0x6800000,0x41329800,0x240000aa, +0x6800100,0x40962540,0x240000aa,0x7c00100,0x40230400,0x240000aa,0xc000010,0x44448000,0x240000ab,0x7c00100,0x40220400,0x240000ab,0x7c00100,0x40250400,0x2400049a,0x24000000, +0x4400000,0x24001000,0x4000000,0x4100000,0x24005000,0x4000000,0x4e00000,0x24005000,0x4000000,0x6800000,0x24005000,0x4000000,0xc8e0000d,0x2400509a,0x7c00300,0x80e30000, +0x2400509a,0x7c00900,0x81230400,0x24010001,0x2802400,0x10962460,0x24010002,0x2802000,0x20962460,0x24010002,0x2802100,0x20962460,0x24010038,0x2802100,0x80962460,0x2401006f, +0x2802100,0x40962460,0x2401009d,0x2802100,0x80962460,0x240100a7,0x2802100,0x40962460,0x240100a7,0x2802400,0x40962460,0x240100a7,0x2802c00,0x40962460,0x240100a8,0x2802100, +0x80962460,0x240100a8,0x2806400,0x80962460,0x240100a9,0x2802100,0x80962460,0x240100aa,0x2802100,0x40962460,0x240100aa,0x2802400,0x40962460,0x240100aa,0x2806400,0x40962460, +0x28000000,0x4000000,0x4200000,0x28000000,0x4000000,0x4e00000,0x28000000,0x4000000,0x5600000,0x28000000,0x24000000,0x4200000,0x28000000,0x24000000,0x4400000,0x28000004, +0x4000000,0x4200000,0x28000004,0x7c00100,0x8230400,0x2800001e,0x7c00100,0x80230400,0x28000022,0x7c00100,0x40230400,0x280000af,0x6800000,0x81329800,0x280000af,0x7c00100, +0x80230400,0x280000af,0x7c00100,0x80230560,0x280000b0,0x4000000,0x84400000,0x280000b0,0x4000000,0x84500000,0x280000b0,0x4000010,0x84400000,0x280000b0,0x6800100,0x80962540, +0x280000b0,0x7c00100,0x80230560,0x280000b0,0xc000010,0x84448000,0x280000b1,0x4000000,0x84200000,0x280000b1,0x4000000,0x84400000,0x280000b1,0x4000000,0x84500000,0x280000b1, +0x6800100,0x80962540,0x280000b1,0x7c00100,0x80230400,0x280000b1,0xc000010,0x84448000,0x2800057e,0x6800400,0x8962540,0x28005000,0x4000000,0x4e00000,0x28005000,0x4000000, +0x6800000,0x28005005,0x7c00100,0x48e30400,0x28005011,0x7c40300,0x20e30000,0x28005014,0x7c00100,0x8e30000,0x28005096,0x7c00300,0x80e30000,0x28005096,0x7c00900,0x81230400, +0x280080b0,0x7c00100,0x80230400,0x280080b1,0x7c00100,0x80230400,0x28010001,0x2802400,0x10962460,0x2801000f,0x2802100,0x20962460,0x2801000f,0x2802400,0x20962460,0x2801000f, +0x2802900,0x20962460,0x2801001a,0x2802100,0x20962460,0x2801001a,0x2806400,0x8962460,0x280100af,0x2802100,0x80962460,0x280100af,0x2802400,0x80962460,0x280100af,0x2806400, +0x80962460,0x280100b0,0x2802100,0x80962460,0x280100b0,0x2802800,0x80962460,0x280100b1,0x2802000,0x80962460,0x280100b1,0x2802100,0x80962460,0x280100b1,0x2806400,0x80962460, +0x2801097f,0x2802400,0x10962460,0x280180b0,0x2806400,0x80962460,0x280180b1,0x2806400,0x80962460,0x2c000000,0x4000000,0x4200000,0x2c000000,0x4000000,0x4e00000,0x2c000000, +0x4000000,0x5500000,0x2c000000,0x24000000,0x4200000,0x2c000000,0x24000000,0x4400000,0x2c000000,0x24000010,0x4400000,0x2c000003,0x7c00100,0x10220400,0x2c00000a,0x7c00100, +0x8230400,0x2c00000c,0x7c00100,0xfc230400,0x2c000010,0x4000000,0x4200000,0x2c000013,0x7c00100,0x22633800,0x2c000015,0x4000000,0x4500000,0x2c000019,0x7c00100,0x10220400, +0x2c000019,0x7c00100,0x20220400,0x2c000019,0x7c00100,0x20250400,0x2c00001b,0x7c00100,0x80230400,0x2c000039,0x4000000,0x84200000,0x2c000057,0x4000000,0x45600000,0x2c000076, +0x6800100,0x40962540,0x2c000078,0x80000000,0x85329960,0x2c0000a1,0x7c00100,0x81830000,0x2c0000b0,0x7c00100,0x80230400,0x2c0000b2,0x4000000,0x84200000,0x2c0000b2,0x6800100, +0x80962540,0x2c0000b2,0x7c00100,0x80230400,0x2c0000b3,0x6800000,0x81329800,0x2c0000b3,0x6800100,0x80962540,0x2c0000b3,0x7c00100,0x80230400,0x2c0000b4,0x6800100,0x80962540, +0x2c0000b4,0x7c00100,0x80430400,0x2c0000b4,0x7c00100,0x82d30400,0x2c0000b4,0xc000010,0x84448000,0x2c0000b5,0x4000000,0x84200000,0x2c0000b5,0x4000010,0x84400000,0x2c0000b5, +0x7c00100,0x80220400,0x2c0000b5,0x7c00100,0x80250400,0x2c0000b5,0xc000010,0x84448000,0x2c0000b6,0x6800000,0x41329800,0x2c0000b6,0x7c00100,0x40230400,0x2c0000b6,0x7c00500, +0x40230400,0x2c0000b7,0x4000000,0x84200000,0x2c0000b7,0x7c00100,0x80230400,0x2c0000b7,0xc000010,0x84248000,0x2c0000b8,0x4000000,0x84200000,0x2c0000b8,0x7c00100,0x80230400, +0x2c005000,0x4000000,0x4200000,0x2c005000,0x4000000,0x4e00000,0x2c005000,0x4000000,0x6800000,0x2c005005,0x7c00100,0x40e30400,0x2c005011,0x7c40300,0x20e30000,0x2c00509a, +0x7c00300,0x80e30000,0x2c008039,0x7c00100,0x80230400,0x2c008076,0x7c00100,0x40230400,0x2c010002,0x2802000,0x20962460,0x2c010004,0x2802000,0x20962460,0x2c01000a,0x2802100, +0x8962460,0x2c010024,0x2802100,0x20962460,0x2c010057,0x2802000,0x40962460,0x2c0100aa,0x2802000,0x40962460,0x2c0100b2,0x2802100,0x80962460,0x2c0100b2,0x2802400,0x80962460, +0x2c0100b2,0x2806400,0x80962460,0x2c0100b3,0x2802100,0x80962460,0x2c0100b3,0x2806400,0x80962460,0x2c0100b4,0x2802100,0x80962460,0x2c0100b6,0x2802500,0x40962460,0x2c0100b7, +0x2802400,0x80962460,0x2c010928,0x2802400,0x20962460,0x30000000,0x4000000,0x4200000,0x30000000,0x4000000,0xc820000f,0x30000000,0x24000000,0x4200000,0x30000000,0x24000010, +0x4400000,0x30000018,0x7c00100,0x21830000,0x30000019,0x7c00100,0x8250400,0x30000019,0x7c00100,0x10220400,0x30000019,0x7c00100,0x10250400,0x30000019,0x7c00100,0x20220400, +0x30000019,0x7c00100,0x20250400,0x30000023,0x4000000,0x4200000,0x30000023,0x4000000,0x4400000,0x30000023,0x4000000,0x5500000,0x30000024,0x4000000,0x4500000,0x30000047, +0,0x84818820,0x30000047,0,0x84c18820,0x30000047,0,0x85418820,0x3000005c,0x6800100,0x40962540,0x3000005c,0x7c00100,0x40230400,0x30000099,0x7c00100, +0x80230400,0x300000a7,0x7c00100,0x40230400,0x300000aa,0x7c00100,0x40230400,0x300000b0,0x7c00100,0x80230560,0x300000b9,0x7c00100,0x80230400,0x300000ba,0x4000000,0x44200000, +0x300000ba,0x6800000,0x41329800,0x300000ba,0x7c00100,0x40230400,0x300000ba,0x7c00900,0x40230400,0x300000bb,0x4000000,0x84500000,0x300000bb,0x6800100,0x80962540,0x300000bb, +0x7c00100,0x80230400,0x300000bc,0x4000000,0x45600000,0x300000bc,0x6800000,0x41329800,0x300000bc,0x7c00100,0x40230400,0x300004db,0x7c00100,0x80230400,0x30000d2a,0x4000000, +0x4200000,0x30005000,0x4000000,0x4e00000,0x30005000,0x4000000,0x6800000,0x30005011,0x4000000,0x5200000,0x30005011,0x7c00900,0x9230400,0x30005014,0x7c00100,0xa530000, +0x30005016,0x7c00100,0xa530c00,0x3000509a,0x7c00300,0x80e30000,0x30010018,0x2806400,0x21862460,0x3001005c,0x2802100,0x40962460,0x300100ba,0x2802400,0x40962460,0x300100bb, +0x2802100,0x80962460,0x300100bb,0x2806400,0x80962460,0x300100bc,0x2802400,0x40962460,0x310055be,0x4000000,0xc8e0000d,0x34000000,0x4000000,0x4200000,0x34000000,0x4000400, +0x4200000,0x34000000,0x6800000,0xc9329805,0x34000000,0x24000000,0x4200000,0x34000002,0x7c00100,0x20230400,0x34000002,0x7c00100,0xfc230400,0x34000019,0x7c00100,0x8220400, +0x34000019,0x7c00100,0x8250400,0x34000019,0x7c00100,0x10220400,0x34000019,0x7c00500,0xc822040f,0x3400001a,0x7c00100,0x18230400,0x34000083,0x7c00100,0x40230400,0x34000097, +0x6800100,0x80962540,0x340000aa,0x4000010,0x44400000,0x340000aa,0x7c00100,0x40230400,0x340000bd,0x4000000,0x84200000,0x340000bd,0x7c00100,0x80230400,0x340000be,0x4000000, +0x84400000,0x340000be,0x6800000,0x82d29800,0x340000be,0x6800100,0x80962540,0x340000be,0x6800100,0x80962541,0x340000be,0x7c00100,0x82c30560,0x340000be,0xc000010,0x84448000, +0x340000c0,0x4000002,0x87000000,0x340000c0,0x7c00100,0x80230400,0x34005000,0x4000000,0x4e00000,0x34005000,0x4000000,0x6800000,0x34005005,0x7c00100,0x40e30400,0x34005011, +0x7c40300,0x20e30000,0x3400509a,0x7c00300,0x80e30000,0x340050bf,0x7c00300,0x80230000,0x34008076,0x7c00100,0x40230400,0x340080be,0x7c00100,0x82b30400,0x34010001,0x2802100, +0x10962460,0x3401001f,0x2802c00,0x20962460,0x34010021,0x2802100,0x10962460,0x3401003a,0x2806400,0x40962460,0x34010097,0x2802100,0x80962460,0x340100be,0x2802100,0x80962460, +0x340100be,0x2802400,0x80962460,0x340100be,0x2806400,0x80962460,0x340100c0,0x2802100,0x80962460,0x34015011,0x2802500,0x8962460,0x340150bf,0x2802200,0x80c62460,0x340180be, +0x2806400,0x82f62460,0x38000000,0x4000000,0x5500000,0x38000000,0x4000000,0x14200000,0x38000000,0x24000000,0x5410000,0x38000000,0x24000000,0x6410000,0x38000000,0x24000002, +0x7000000,0x38000000,0x2c000010,0x4b48000,0x38000002,0x4000000,0x14200000,0x38000002,0x7c00100,0x8230400,0x38000002,0x7c00100,0x10230400,0x38000002,0x7c00100,0x20230400, +0x38000002,0x7c00500,0x10230400,0x38000002,0xc000010,0x4b48000,0x38000002,0x80000000,0x5329960,0x3800000b,0x7c00100,0xfc230400,0x38000015,0x7c00100,0x20230400,0x38000019, +0x7c00100,0x8220400,0x38000019,0x7c00100,0x8250400,0x38000019,0x7c00100,0x10220400,0x38000019,0x7c00100,0x10230400,0x38000019,0x7c00100,0xc822040f,0x38000019,0x7c00500, +0x20220400,0x38000019,0x7c00500,0xc822040f,0x38000019,0x7c00d00,0xc823040f,0x38000024,0x7c00100,0x20230400,0x38000028,0x7c00100,0x40230400,0x3800002a,0x7c00100,0x80230400, +0x38000038,0x7c00100,0x80220400,0x38000038,0x7c00100,0x80250400,0x3800003e,0xc000010,0x44448000,0x38000041,0x7c00100,0x82b30400,0x38000099,0x4000000,0x84200000,0x380000a1, +0x7c00100,0x81830000,0x380000c1,0x4000000,0x84200000,0x380000c1,0x7c00100,0x80230400,0x380000c2,0x7c00100,0x80230400,0x380000c2,0xc000010,0x84248000,0x380000c3,0x6800000, +0x81329800,0x380000c3,0x7c00100,0x80230400,0x380000c4,0x7c00100,0x80230400,0x380000c5,0x7c00100,0x80220400,0x380000c5,0x7c00100,0x80250400,0x38005000,0x4000000,0x4e00000, +0x38005000,0x4000000,0x6800000,0x38005011,0x7c40300,0x20e30000,0x38005014,0x7c00100,0x8e30000,0x38005016,0x7c00100,0x8e30c00,0x38005016,0x7c00500,0x20230c00,0x3800803e, +0x7c00100,0x42b30400,0x38010001,0x2802100,0x20962460,0x38010001,0x2802400,0x10962460,0x38010001,0x2802400,0x20962460,0x38010002,0x2802400,0x20962460,0x3801001b,0x12882000, +0xc4962460,0x38010024,0x2802400,0x20962460,0x3801002a,0x2806400,0x80962460,0x38010041,0x2802100,0x80962460,0x38010041,0x2806400,0x80962460,0x38010078,0x2802100,0x80962460, +0x380100c2,0x2802400,0x80962460,0x380100c4,0x2802400,0x80962460,0x38010880,0x2802400,0x50962460,0x3c000000,0x4000000,0x4200000,0x3c000000,0x4000000,0x4e00000,0x3c000008, +0x7c00500,0xc822040e,0x3c000008,0x7c00500,0xc822040f,0x3c00000a,0x4000000,0x4500000,0x3c000015,0x6800100,0x20962540,0x3c000019,0x7c00100,0x10220400,0x3c000047,0, +0x84818820,0x3c000047,0,0x84c18820,0x3c000047,0,0x85418820,0x3c000047,0x7c00100,0x80230400,0x3c000047,0x7c00100,0x81430400,0x3c00009d,0x7c00100,0x80230400, +0x3c0000c6,0x4000000,0x84e00000,0x3c0000c6,0x6800000,0x82d29800,0x3c0000c6,0x6800100,0x80962540,0x3c0000c6,0x7c00100,0x82c30560,0x3c0000c6,0xc000010,0x84448000,0x3c0000c7, +0x6800000,0x81329800,0x3c0000c7,0x7c00100,0x80230400,0x3c005000,0x4000000,0x4e00000,0x3c005000,0x4000000,0x6800000,0x3c005011,0x7c40300,0x20e30000,0x3c005014,0x7c00100, +0xa530000,0x3c005016,0x7c00100,0xa530c00,0x3c0080c6,0x7c00100,0x82b30400,0x3c010002,0x2802400,0x20962460,0x3c010008,0x2802100,0x8962460,0x3c010018,0x2802000,0x21862460, +0x3c010047,0x2802000,0x80962460,0x3c010047,0x2802400,0x80962460,0x3c01009d,0x2802100,0x80962460,0x3c0100c6,0x2802100,0x80962460,0x3c0100c6,0x2806400,0x80962460,0x3c0100c7, +0x2802000,0x80962460,0x3c0180c6,0x2806400,0x82f62460,0x3d005011,0x7c40300,0x20e30000,0x3d0055a2,0x4000000,0x4e00000,0x3d0055a2,0x4008000,0x4e00000,0x40000000,0x4000000, +0x4200000,0x40000000,0x4000000,0xc8200005,0x40000000,0x6800000,0xc9329805,0x40000000,0x24000000,0x4200000,0x40000002,0x7c00100,0x20230400,0x40000008,0x7c00100,0x20220400, +0x40000008,0x7c00100,0x20250400,0x40000019,0x7c00100,0x20220400,0x40000019,0x7c00100,0x20250400,0x4000001c,0x6800000,0x21329800,0x4000003e,0xc000010,0x44448000,0x40000047, +0x7c00100,0x80230400,0x400000c9,0x4000002,0x87000000,0x400000c9,0x4000020,0x84200000,0x400000c9,0x6800000,0x81329800,0x400000c9,0x7c00100,0x80220400,0x400000c9,0x7c00100, +0x80230400,0x400000c9,0x7c00100,0x80250400,0x400000c9,0x7c00900,0x80230400,0x400000c9,0x7c00d00,0x80230400,0x400000ca,0x6800000,0x82d29800,0x400000ca,0x6800100,0x80962540, +0x400000ca,0x7c00100,0x82d30400,0x400000cb,0x4000000,0x84200000,0x400000cb,0x6800000,0x81329800,0x400000cb,0x7c00100,0x80230400,0x400000cb,0x7c00100,0x80230520,0x400000cb, +0x7c00100,0x80230521,0x400000cb,0x7c00500,0x80230400,0x400000cb,0xc000010,0x84448000,0x400000cc,0x4000000,0x84200000,0x400000cc,0x6800000,0x81329800,0x400000cc,0x7c00100, +0x80230400,0x400000cd,0x4000000,0x84200000,0x400000cd,0x6800000,0x81329800,0x400000cd,0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230401, +0x400000cf,0x4000000,0x84e00000,0x400000cf,0x6800100,0x80962540,0x400000cf,0x7c00100,0x80e30400,0x400000cf,0x7c00100,0x82c30560,0x400000cf,0x7c00d00,0x80e30400,0x400000cf, +0xc000010,0x84e48000,0x40005000,0x4000000,0x4e00000,0x400050bf,0x7c00300,0x80230000,0x400055be,0x4000000,0x4e00000,0x400080cf,0x7c00100,0x82b30400,0x400080cf,0x7c00100, +0x82d30400,0x400080cf,0x7c00100,0x82d30401,0x40010002,0x2802100,0x20962460,0x400100c6,0x2802400,0x80962460,0x400100c9,0x2802400,0x80962460,0x400100c9,0x2802500,0x80962460, +0x400100c9,0x2802c00,0x80962460,0x400100ca,0x2802100,0x80962460,0x400100ca,0x2802100,0x80962461,0x400100ca,0x2806400,0x80962460,0x400100cc,0x2802400,0x80962460,0x400100cc, +0x2802c00,0x80962460,0x400100cf,0x2802100,0x80962460,0x400100cf,0x2802100,0x80962461,0x400100cf,0x2802400,0x80962460,0x400100cf,0x2802c00,0x80962460,0x400100cf,0x2806400, +0x80962460,0x400180cf,0x2806400,0x82f62460,0x44000000,0x4000000,0x4200000,0x44000000,0x4000000,0x5600000,0x44000000,0x4000020,0x4200000,0x44000000,0x24000000,0x4200000, +0x44000002,0x4000000,0x4200000,0x44000002,0x4000000,0x4400000,0x44000002,0x4000000,0x14200000,0x44000002,0x7c00100,0x10230400,0x44000002,0x7c00100,0x20230400,0x44000002, +0x7c00100,0xfc230400,0x44000015,0x7c00100,0x8230400,0x44000019,0x7c00100,0x8250400,0x44000019,0x7c00100,0x20220400,0x44000019,0x7c00100,0x20250400,0x44000019,0x7c00500, +0xc822040f,0x44000024,0x7c00100,0x8230400,0x44000097,0x6800100,0x80962540,0x440000d0,0x7c00100,0x80220400,0x440000d0,0x7c00100,0x80250400,0x440000d1,0x7c00100,0x80230400, +0x440000d2,0x7c00100,0x80230400,0x440000d3,0x6800000,0x81329800,0x440000d3,0x7c00100,0x80230400,0x440000d3,0x7c00d00,0x80230400,0x44005000,0x4000000,0x4e00000,0x44005011, +0x7c00300,0x10e30000,0x44005011,0x7c00b00,0x11230000,0x44005011,0x7c40300,0x20e30000,0x4400509a,0x7c00300,0x80e30000,0x44010001,0x2802400,0x10962460,0x44010001,0x2802400, +0x10c62460,0x44010002,0x2802100,0x10962460,0x44010002,0x2802500,0x20962460,0x44010097,0x2802100,0x80962460,0x440100d2,0x2802100,0x80962460}; -static const int32_t countPropsVectors=7260; +static const int32_t countPropsVectors=6813; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[298]={ -0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,2,0x22,0x25,0x57, -0xb6,0x80c0,2,0x22,0x8025,2,0x12,2,0x22,0x25,0x57,0xa7,0xb6,0x80c0,2,0x22, -0x54,0x79,0x7b,0xa7,0xb6,0xb7,0x80c2,2,0x8022,2,0x25,0x80c0,2,0x29,2,0x80b6, -2,0x2e,4,0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x97,0x809e,4, -0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x809e,4,0xa,0xf,0x10,0x15, -0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,4, -0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0, -0xaf,0xb2,0xb3,0x80bb,0xa,0x78,0xa0,0x80b2,0xa,0x74,4,0x3a,0x8076,4,0x7a,0x10, -0x80a4,0x10,0x7f,0xf,0x809d,0xf,0x83,0x23,0x8089,0x23,0x87,0x15,0x80bb,0x15,0x8b,0x1c, -0x34,0x8076,0x1c,0x8f,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,4,0xa,0x15, -0x8089,0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,0xa,0x80bb,4, -0xa,0x15,0x1a,0x1f,0x21,0x24,0x89,0x9e,0x80bb,0x8004,8,0x8022,0x19,0x801b,0xa,0x19, -0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11, -0x14,0x8016,0x11,0x8019,0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0, -0xa3,0xb2,0x80bb,0xa,0xf,0x10,0x15,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0xb2, -0x80bb,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x78, -0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xa3,0xa,0x8023,0xa,0x10a,0x19,0x1c, -0x804f,0x37,0x804e,2,0x8057,2,0x8025,2,0x115,0x2f,0x31,0x8053,0x2f,0x31,0x80c1,0x2f, -0x8031,2,0x8007,0x79,0x80c2,0x79,0x123,0x89,0x87,0x8087}; +static const uint16_t scriptExtensions[562]={ +7,0xc,0xd,0xe,0x11,0x19,0x33,0x38,0x59,0x68,0x6c,0x75,0x87,0x88,0xa0,0x80b3, +4,8,0xa,0x19,0x26,0x83,0x80c4,5,0x8019,0x19,0x8083,0x19,0x8026,6,7,8, +0xe,0x19,0x34,0x59,0x80cd,6,8,0xe,0x19,0x34,0xab,0xcd,0x80ce,6,8,0x19, +0x803c,0x19,0x22,0x26,0x38,0x80cd,6,7,8,0xd,0xe,0x19,0x22,0x3c,0x9f,0xab, +0x80ce,7,0xd,0x16,0x19,0x38,0x8088,8,0xe,0x19,0x3c,0x8059,7,0x13,0x19,0x22, +0x34,0x3c,0x59,0x87,0x80ce,3,8,0xd,0xe,0x13,0x19,0x22,0x34,0x3c,0x59,0x8087, +0x19,0x22,0x8087,6,8,0x19,0x80ab,6,0x19,0x8034,0x19,0x80cd,0xb,0x8019,8,0x19, +0x80ce,0xe,0x19,0x59,0x80ce,6,0x16,0x19,0x22,0x3c,0x8087,6,0x19,0x22,0x8087,0x19, +0x8022,0x19,0x22,0x80cd,6,0x19,0x8022,6,0xd,0x19,0x22,0x26,0x9f,0x80cd,0x800e,0x19, +0x9f,0x80ce,7,0x800e,0xe,0x92,8,0x8059,8,0x96,8,0x8038,8,0x9a,8,0x8019, +3,0xc,0x8038,3,0xa0,2,0x22,0x25,0x57,0xb6,0xc0,0x80c9,2,0x22,0x8025,2, +0xac,2,0x22,0x25,0x57,0xa7,0xb6,0xc0,0x80c9,2,0x22,0x54,0x79,0x7b,0xa7,0xb6, +0xb7,0x80c2,2,0x8022,2,0x25,0x80c0,2,0xc4,2,0x80b6,2,0xc9,4,0xa,0xf, +0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x97,0x9e,0xaa,0x80bb,4,0xa,0xf,0x10, +0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x9e,0x80aa,4,0xa,0xf,0x10,0x15,0x1a,0x1f, +0x21,0x23,0x24,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0xbb,0x80cc,4,0xa, +0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf, +0xb2,0xb3,0xbb,0xca,0x80cc,0xa,0x78,0xa0,0x80b2,0xa,0x115,4,0x3a,0x8076,4,0x11b, +0x10,0x80a4,0x10,0x120,0xf,0x809d,0xf,0x124,0x23,0x8089,0x23,0x128,0x15,0xbb,0x80cf,0x15, +0x12c,0x1c,0x34,0x8076,0x1c,0x131,0xc,0x19,0x8038,0x8020,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a, +0x800a,4,0xa,0x15,0x8089,4,0xa,0x24,0x9e,0x80aa,4,0xa,0x8024,0xa,0x97,0x80aa, +4,0xa,0x24,0x80aa,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,4,0x800a,0xa,0x9e, +0x80aa,0xa,0xaa,0x80bb,4,0xa,0x8097,0xa,0x80aa,4,0xa,0x97,0x80aa,4,0xa,0x15, +0x1a,0x1f,0x21,0x24,0x89,0x9e,0xbb,0x80cf,0xa,0x8089,0xa,0x15,0x89,0x80cf,0x8004,8, +0x19,0x8022,0x19,0x1b,0x805a,2,0x80a7,0xc,0x38,0x4c,0x58,0x68,0x806b,0xe,0x4c,0x56, +0x8068,0xa,0x19,0x8089,7,0x8019,0x58,0x8075,0xc,0x4c,0x68,0x6c,0x75,0x78,0x807e,2, +0x4c,0x80a7,0x11,0x809a,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x16,0x1b, +0x8029,5,0x11,0x12,0x14,0x16,0x1b,0x29,0x805a,5,0x11,0x12,0x14,0x8016,0x8011,5, +0x11,0x12,0x14,0x16,0x1b,0x27,0x8029,5,0x11,0x12,0x14,0x16,0x1b,0x27,0x29,0x8083, +5,0x8011,0x11,0x14,0x8016,0x11,0x8019,0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x97,0x99, +0x9d,0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10,0x15,0x78,0x91,0x97,0x99,0x9d, +0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3, +0x80b2,0xa,0xf,0x10,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,4,0xa,0x80cf, +0xa,0x20d,0xa,0x8023,0xa,0x212,0x19,0x1c,0x804f,0x37,0x804e,2,0x8057,2,0x8025,2, +0x21d,0x2f,0x31,0x8053,0x2f,0x31,0x80c1,0x2f,0x8031,2,0x8007,0x79,0x80c2,0x79,0x22b,0x89, +0x128,0}; + +static const uint16_t block_trieIndex[834]={ +0,0x40,0x80,0xc0,0x100,0x140,0x180,0x1c0,0x200,0x240,0x280,0x2c0,0x300,0x340,0x340,0x340, +0x340,0x340,0x340,0x364,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384, +0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x3c4,0x3fb,0x43b,0x47b,0x47b,0x47b,0x47b,0x47b, +0x47b,0x47b,0x47b,0x47b,0x47b,0x480,0x4c0,0x500,0x540,0x540,0x540,0x540,0x540,0x540,0x570,0x5a5, +0x2f0,0x30a,0x30a,0x31a,0x33a,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0, +0xb0,0xc0,0xd0,0xe0,0xf0,0x100,0x110,0x120,0x130,0x140,0x150,0x160,0x170,0x180,0x190,0x1a0, +0x1b0,0x1c0,0x1d0,0x1e0,0x1f0,0x200,0x210,0x220,0x230,0x240,0x250,0x260,0x270,0x280,0x290,0x2a0, +0x2b0,0x2c0,0x2d0,0x2e0,0x2f0,0x300,0x310,0x320,0x330,0x340,0x350,0x360,0x370,0x340,0x350,0x360, +0x370,0x340,0x350,0x360,0x370,0x364,0x374,0x384,0x394,0x384,0x394,0x3a4,0x3b4,0x384,0x394,0x3a4, +0x3b4,0x384,0x394,0x3a4,0x3b4,0x384,0x394,0x3a4,0x3b4,0x384,0x394,0x3a4,0x3b4,0x384,0x394,0x3a4, +0x3b4,0x384,0x394,0x3a4,0x3b4,0x384,0x394,0x3a4,0x3b4,0x3c4,0x3d4,0x3e4,0x3f4,0x3fb,0x40b,0x41b, +0x42b,0x43b,0x44b,0x45b,0x46b,0x47b,0x48b,0x49b,0x4ab,0x47b,0x48b,0x49b,0x4ab,0x47b,0x48b,0x49b, +0x4ab,0x47b,0x48b,0x49b,0x4ab,0x47b,0x48b,0x49b,0x4ab,0x480,0x490,0x4a0,0x4b0,0x4c0,0x4d0,0x4e0, +0x4f0,0x500,0x510,0x520,0x530,0x540,0x550,0x560,0x570,0x540,0x550,0x560,0x570,0x540,0x550,0x560, +0x570,0x540,0x550,0x560,0x570,0x540,0x550,0x560,0x570,0x540,0x550,0x560,0x570,0x570,0x580,0x590, +0x5a0,0x5a5,0x5b5,0x5c5,0x5d5,0x5e5,0x5f5,0x605,0x615,0x625,0x635,0x645,0x64d,0x65d,0x66d,0x67d, +0x68d,0x69d,0x6ad,0x6b7,0x6c7,0x6d7,0x6e7,0x6f7,0x707,0x717,0x725,0x735,0x745,0x755,0x765,0x775, +0x785,0x795,0x7a5,0x7b4,0x7c4,0x7d4,0x7d4,0x7d4,0x7d4,0x7e4,0x7ef,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7fb,0x80b,0x80b,0x80b,0x80b,0x818,0x81e,0x81e,0x81e,0x81e,0x81e,0x81e, +0x81e,0x81e,0x81e,0x81e,0x81e,0x82e,0x82e,0x836,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x846,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x856,0x856,0x862,0x872,0x7f4,0x87e,0x88a,0x89a, +0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa, +0x8ba,0x8ba,0x8ba,0x8ca,0x8ca,0x8da,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x8ea,0x8fa,0x90a,0x911,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x921,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x931,0x931,0x935,0x945,0x955,0x965,0x975,0x985,0x995,0x995,0x995,0x995,0x9a5,0x9a5, +0x9aa,0x7f4,0x7f4,0x7f4,0x7f4,0x9ba,0x9ca,0x9da,0x9e1,0x7f4,0x9f1,0xa01,0xa11,0xa21,0xa31,0xa41, +0x7f4,0x7f4,0xa4a,0xa5a,0xa6a,0x7f4,0xa7a,0xa8a,0xa9a,0xaaa,0xaaa,0xaaa,0xaba,0xaca,0xada,0xaea, +0xafa,0xb0a,0x7f4,0x7f4,0x7f4,0x7f4,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a, +0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a, +0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c, +0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb38,0xb46,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48, +0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb4d,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, +0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb59,0xb68,0xb68,0xb72,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0xb82,0xb82,0xb90,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xbab,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb5,0xbc0, +0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc8, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0xbd8,0xbe8,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08, +0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08, +0x45,0x65,0x79,0x89,0x89,0xa9,0xb5,0xd5,0xf5,0x115,0x131,0x150,0x168,0x179,0x196,0x1b6, +0x1d6,0x1d6,0x1d6,0x1d6,0x1d6,0x1f0,0x209,0x21e,0x23e,0x25b,0x270,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x290,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0, +0x2d0,0x2d0 +}; + +static const uint16_t block_trieData[3098]={ +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, +4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6, +7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8, +9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, +0x61,0x61,0x61,0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb,0xb,0xb,0xb,0xb,0xb, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xd,0xd,0xd,0xd,0xd,0x80,0x80,0x80,0xe,0xe,0xe,0xe,0x92,0x92,0x92,0x92, +0xac,0xac,0xac,0xac,0xc6,0xc6,0x117,0x135,0x135,0x135,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14, +0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, +0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x86,0x86,0x20,0x20,0x20,0x20,0x20,0x20, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x22,0x22,0x23,0x23,0x23,0x23,0x23,0x23, +0x62,0x62,0x63,0x63,0x64,0x64,0x65,0x65,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0xad,0xad,0xad,0xad,0xad, +0x6f,0x6f,0x6f,0x6f,0x6f,0x70,0x70,0x70,0x8b,0x8b,0x8b,0x8b,0x8b,0x8b,0x71,0x71, +0x81,0x81,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xe0,0xe0,0xe0,0xe0,0xe0, +0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x9b,0x9b,0x9b,0x9b,0xc7,0xc7,0xc7,0xc7, +0x9c,0x9c,0x9c,0x9c,0x9c,0x9d,0x9d,0x9d,0x109,0x11b,0x11b,0x11b,0xdb,0xaf,0xaf,0xaf, +0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x8d,0x8d,0x8d,0x8d,0x83,0x83,0x83,0x83, +0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, +0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, +0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b, +0x2c,0x2c,0x2c,0x2c,0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, +0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f, +0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, +0x31,0x31,0x31,0x31,0x32,0x32,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x35,0x35,0x36,0x36,0x36,0x36,0x36,0x36, +0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, +0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x66,0x66,0x66,0x67, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x68,0x68,0x68,0x68,0x68,0x68,0x68,0x68,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a, +0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73, +0x88,0x88,0x88,0x88,0x88,0x88,0x94,0x94,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84, +0x87,0x87,0x87,0x90,0x90,0x90,0x90,0x90,0x85,0x85,0x85,0x85,0x85,0x85,0x9e,0x9e, +0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a,0x3a, +0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0x3b,0,0x3c, +0x3d,0x3d,0x3d,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x40,0x40,0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x43,0x43,0x82,0x82,0x82,0x6b, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, +0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46, +0x74,0x74,0x74,0x74,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, +0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, +0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, +0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, +0x47,0x47,0x47,0x47,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48, +0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48, +0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48, +0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48, +0x48,0x48,0x48,0x48,0x49,0x49,0x49,0x49,0xb0,0xb0,0xb0,0x9f,0x9f,0x9f,0x9f,0x9f, +0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0xa0, +0xa0,0xa0,0xa0,0xa0,0xa0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x8a,0x8a,0x95,0x95,0x95, +0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x8f,0x8f,0x8f,0xb2,0x96, +0x96,0x96,0x96,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xb3,0xb3,0xa2,0xa2,0xa2,0xa3,0xa3, +0xa3,0xb4,0xb4,0xb5,0xb5,0xb5,0xb5,0xb5,0xb5,0xee,0xee,0xa4,0xa4,0xa4,0xa4,0xa4, +0xa4,0xb6,0xb6,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xd5,0xd5,0xc8,0xc8,0xc8,0xe7,0xe7, +0xe7,0xe7,0xff,0xff,0xff,0xff,0xff,0xb8,0xb8,0xb8,0xb8,0x4a,0x4a,0x4a,0x4a,0x4a, +0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, +0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, +0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, +0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0xb9,0xb9,0xb9,0xb9,0xb9, +0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4c,0x4c,0x4c,0x4c,0x4c,0x4c,0x4c,0x4c, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f, +0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f,0x4f, +0x50,0x50,0x50,0x50,0x50,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51, +0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51, +0x51,0x51,0x51,0x51,0x51,0x6c,0x91,0x52,0x53,0x53,0x54,0x54,0x55,0x55,0x55,0x55, +0x55,0x55,0x55,0x55,0x55,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57,0x57, +0x57,0x57,0x57,0x57,0x56,0x75,0x75,0x75,0x75,0x75,0x75,0x75,0x75,0x76,0x76,0x76, +0x76,0x76,0x76,0x76,0x76,0x77,0x77,0x77,0x77,0x7f,0x7f,0x7f,0x7f,0x7f,0xa5,0xa5, +0xa5,0xa5,0xa6,0xa6,0xa6,0,0,0,0,0,0,0,0,0xa7,0xa7,0xa8, +0xa8,0xa8,0xa8,0xdf,0xdf,0x58,0x58,0x58,0x59,0x59,0xf1,0xf1,0xf1,0x78,0x78,0x8c, +0x8c,0x8c,0x8c,0,0,0x5a,0x5a,0x5a,0x5a,0x5a,0x79,0x79,0x79,0x7a,0x7a,0x7a, +0x10f,0x10f,0x10f,0x10f,0x10f,0xe2,0xe2,0xe2,0xde,0xde,0xde,0xde,0x13f,0x13f,0x13f,0x13f, +0x13f,0x151,0x151,0x151,0x151,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8, +0xe8,0xe8,0xe8,0xe8,0xe8,0x139,0x139,0x139,0x139,0,0,0,0,0x7b,0x7b,0x7b, +0x7b,0xba,0xba,0xf4,0xf4,0xef,0xef,0xef,0,0,0,0x102,0x102,0x97,0x97,0xa9, +0xa9,0x157,0x157,0,0,0xd7,0xd7,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0x89,0x89,0x89, +0x89,0x89,0x89,0xbb,0xbb,0xf0,0xf0,0,0,0xea,0xea,0xea,0xea,0xbc,0xbc,0xbc, +0xbc,0xbd,0xbd,0xbe,0xbe,0xf6,0xf6,0xf6,0,0,0,0,0,0xbf,0xbf,0xbf, +0xbf,0xbf,0,0,0,0x104,0x104,0x104,0x104,0x104,0x104,0x104,0x104,0x11d,0x11d,0x11d, +0x11d,0x14a,0x14a,0x14a,0x14a,0x14a,0,0,0,0,0,0,0,0xc0,0xc0,0x134, +0x134,0x134,0x134,0x141,0x141,0x141,0x141,0x122,0x122,0x122,0x123,0x123,0x123,0x123,0x13b,0x13b, +0x13b,0x13b,0x12d,0x12d,0x12d,0x125,0x125,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc1, +0xc1,0xc1,0xc1,0xc1,0xda,0xda,0xda,0xd4,0xd4,0xd4,0xd4,0xd4,0xe9,0xe9,0xe9,0xd9, +0xd9,0xd9,0xd9,0xd9,0xd9,0xf9,0xf9,0xe5,0xe5,0xe5,0xe5,0xe5,0,0,0,0x103, +0x103,0x103,0xe6,0xe6,0xe6,0xe6,0xe6,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x152, +0x152,0x152,0x152,0x152,0x152,0x152,0x152,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xfb, +0xfb,0xfb,0xfb,0xfb,0xfb,0,0,0,0,0,0,0,0,0xf8,0xf8,0xf8, +0xf8,0xf8,0xf8,0xf8,0xf8,0xec,0xec,0xec,0xec,0xec,0xec,0x10d,0x10d,0xdc,0xdc,0xdc, +0xdc,0xdc,0x14d,0x14d,0x14d,0xfd,0xfd,0xfd,0xfd,0xfd,0,0,0,0,0,0, +0,0,0,0,0,0x11a,0x11a,0x11a,0x11a,0x11a,0,0,0,0,0,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0,0,0,0,0x126, +0x126,0x126,0x126,0x126,0x126,0x118,0x118,0x118,0x118,0x118,0x116,0x116,0x116,0x116,0x116,0x116, +0x13e,0xf5,0xf5,0xf5,0xf5,0x144,0x144,0x144,0x144,0x144,0x144,0x156,0x156,0,0,0, +0,0x14f,0x14f,0x14f,0x14f,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x10c,0x10c,0x10c,0x10c, +0x10c,0,0,0,0,0x114,0x114,0x114,0x114,0x114,0x114,0x11c,0x11c,0x11c,0x11c,0x11c, +0x15a,0x15a,0x15a,0x15a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x11f,0x11f,0x146,0x146,0x146,0x146,0x146,0x146,0,0,0,0,0,0x131, +0x12b,0x12b,0x12b,0x12b,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98, +0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x101,0x101,0x101,0x101, +0x101,0x101,0x101,0x101,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x136,0x136,0x136,0x136,0x136,0x136,0x136,0xc2,0xc2,0xc2,0xc2,0xc2, +0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0x124,0x124,0x124,0x149,0x149, +0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0,0, +0,0,0,0,0,0,0x14b,0x14b,0x14b,0x14b,0,0,0,0,0,0, +0,0,0,0,0,0,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca, +0xca,0xca,0xca,0xca,0xca,0xca,0xed,0xed,0xed,0x13c,0x13c,0x13c,0x13c,0x13c,0x13c,0xdd, +0xdd,0xdd,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0,0,0,0,0, +0,0,0x14c,0x14c,0x14c,0x14c,0,0,0,0,0,0,0,0,0x121,0x121, +0x121,0x121,0x121,0x121,0x153,0x153,0x153,0x153,0,0,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xd8,0xd8,0xd8,0xd8,0,0,0,0,0x10b,0x10b,0x110,0x110,0x110,0x110,0x110,0x110, +0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x111,0x111,0x111,0x111,0x111,0x111, +0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x130,0x130,0x130,0x130,0x130,0x130, +0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x133,0x133,0x133,0x133,0x133,0x133, +0x133,0x133,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x138,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb, +0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0x113,0x113,0x113,0x129,0x129,0x129, +0x129,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115, +0x115,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xf7,0,0,0,0, +0,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x155,0x155,0x155,0x155,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140, +0x140,0x140,0,0,0,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, +0x5b,0x5b,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c, +0x5c,0x5c,0x5c,0x5c,0x5c,0x7e,0x7e,0x7e,0x7e,0x7e,0,0,0,0,0,0, +0,0x145,0x145,0x120,0x120,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x9a,0x9a,0,0,0, +0,0,0,0,0,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106, +0x106,0x106,0x106,0x106,0x106,0,0,0,0,0,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a, +0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x10a,0x10a,0x10a,0x143,0x143,0x143, +0x143,0x143,0x143,0,0,0,0,0,0,0,0x127,0x127,0x127,0x127,0x127,0, +0,0,0,0,0,0,0,0,0,0,0x13d,0x13d,0x13d,0x12c,0x12c,0x12c, +0x12c,0,0,0,0,0,0,0,0,0,0,0,0,0,0x147,0x147, +0x147,0,0,0,0,0,0,0,0,0,0,0,0,0,0x14e,0x14e, +0x14e,0,0,0,0,0,0,0,0,0,0,0,0,0x158,0x158,0x158, +0x158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x137, +0x137,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0, +0,0x107,0x107,0x107,0x107,0x107,0x107,0,0,0,0,0,0,0,0,0, +0,0x11e,0x11e,0x11e,0x11e,0x11e,0,0,0,0,0x128,0x128,0x128,0x128,0x128,0, +0,0,0,0,0,0,0,0,0,0,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3, +0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xaa,0xaa,0xaa,0xab,0xab,0xab, +0xab,0xab,0xab,0xab,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd, +0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xce,0xce,0xce,0xce,0xce,0xf2, +0xf2,0xf2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0, +0xd0,0xd0,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, +0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x105,0x105,0x105,0x105,0x105,0x105, +0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x119,0x119,0x119,0x119,0x119,0x119, +0x119,0x12a,0x12a,0x12a,0x12a,0x12a,0x12a,0x12a,0x12a,0x12a,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e, +0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0x5e,0,0,0xc5,0xc5,0xc5,0xc5, +0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xd1,0xd1,0xd1,0xd1, +0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0x100,0x100,0x100,0x100,0x100,0x100,0x100,0x100, +0x100,0x100,0x100,0x100,0x100,0x100,0x100,0x100,0x112,0x112,0x112,0x112,0x112,0x112,0x112,0x112, +0x112,0x112,0x112,0x112,0x112,0x112,0x112,0x112,0x148,0x148,0x148,0x148,0x148,0x148,0x148,0x148, +0x148,0x148,0x148,0x148,0x148,0x148,0x148,0x148,0,0,0,0,0,0,0,0, +0,0,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f, +0x5f,0x5f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e, +0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142, +0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154, +0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0,0,0,0,0,0,0,0,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, +0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d, +0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0,0 +}; + +static const UCPTrie block_trie={ + block_trieIndex, + { block_trieData }, + 834, 3098, + 0x11000, 0x11, + 1, 0, + 0, 0, + 0x270, 0x7f4, + 0x0, +}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2d4e,0x2d4e,0x2d4e,0x2d4e,0x6d50,3,0x89ac,0x8a41,0x8a41,0x8a41,0xb48c7,0x2f75a31,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2f2a,0x2f2a,0x2f2a,0x2f2a,0x836c,3,0x9e09,0x9f22,0xa6d4,0xa6d4,0x50d4,0x3075a31,0x15a,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstrie.cpp b/deps/icu-small/source/common/ucharstrie.cpp index ba9cea7ba39025..4c48323c91766e 100644 --- a/deps/icu-small/source/common/ucharstrie.cpp +++ b/deps/icu-small/source/common/ucharstrie.cpp @@ -297,7 +297,7 @@ UCharsTrie::findUniqueValueFromBranch(const char16_t *pos, int32_t length, ++pos; // ignore a comparison unit // handle its value int32_t node=*pos++; - UBool isFinal=(UBool)(node>>15); + UBool isFinal = static_cast<UBool>(node >> 15); node&=0x7fff; int32_t value=readValue(pos, node); pos=skipValue(pos, node); @@ -339,7 +339,7 @@ UCharsTrie::findUniqueValue(const char16_t *pos, UBool haveUniqueValue, int32_t pos+=node-kMinLinearMatch+1; // Ignore the match units. node=*pos++; } else { - UBool isFinal=(UBool)(node>>15); + UBool isFinal = static_cast<UBool>(node >> 15); int32_t value; if(isFinal) { value=readValue(pos, node&0x7fff); diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index 95b32711a8e2e7..bf3216bd1bc0b1 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -75,7 +75,7 @@ UCharsTrieElement::setTo(const UnicodeString &s, int32_t val, return; } stringOffset=strings.length(); - strings.append((char16_t)length); + strings.append(static_cast<char16_t>(length)); value=val; strings.append(s); } @@ -186,7 +186,7 @@ UCharsTrieBuilder::buildUChars(UStringTrieBuildOption buildOption, UErrorCode &e errorCode=U_MEMORY_ALLOCATION_ERROR; return; } - uprv_sortArray(elements, elementsLength, (int32_t)sizeof(UCharsTrieElement), + uprv_sortArray(elements, elementsLength, static_cast<int32_t>(sizeof(UCharsTrieElement)), compareElementStrings, &strings, false, // need not be a stable sort &errorCode); @@ -351,7 +351,7 @@ UCharsTrieBuilder::write(int32_t unit) { int32_t newLength=ucharsLength+1; if(ensureCapacity(newLength)) { ucharsLength=newLength; - uchars[ucharsCapacity-ucharsLength]=(char16_t)unit; + uchars[ucharsCapacity - ucharsLength] = static_cast<char16_t>(unit); } return ucharsLength; } @@ -379,19 +379,19 @@ UCharsTrieBuilder::writeValueAndFinal(int32_t i, UBool isFinal) { char16_t intUnits[3]; int32_t length; if(i<0 || i>UCharsTrie::kMaxTwoUnitValue) { - intUnits[0]=(char16_t)(UCharsTrie::kThreeUnitValueLead); - intUnits[1]=(char16_t)((uint32_t)i>>16); - intUnits[2]=(char16_t)i; + intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitValueLead); + intUnits[1] = static_cast<char16_t>(static_cast<uint32_t>(i) >> 16); + intUnits[2] = static_cast<char16_t>(i); length=3; // } else if(i<=UCharsTrie::kMaxOneUnitValue) { // intUnits[0]=(char16_t)(i); // length=1; } else { - intUnits[0]=(char16_t)(UCharsTrie::kMinTwoUnitValueLead+(i>>16)); - intUnits[1]=(char16_t)i; + intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitValueLead + (i >> 16)); + intUnits[1] = static_cast<char16_t>(i); length=2; } - intUnits[0]=(char16_t)(intUnits[0]|(isFinal<<15)); + intUnits[0] = static_cast<char16_t>(intUnits[0] | (isFinal << 15)); return write(intUnits, length); } @@ -403,19 +403,19 @@ UCharsTrieBuilder::writeValueAndType(UBool hasValue, int32_t value, int32_t node char16_t intUnits[3]; int32_t length; if(value<0 || value>UCharsTrie::kMaxTwoUnitNodeValue) { - intUnits[0]=(char16_t)(UCharsTrie::kThreeUnitNodeValueLead); - intUnits[1]=(char16_t)((uint32_t)value>>16); - intUnits[2]=(char16_t)value; + intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitNodeValueLead); + intUnits[1] = static_cast<char16_t>(static_cast<uint32_t>(value) >> 16); + intUnits[2] = static_cast<char16_t>(value); length=3; } else if(value<=UCharsTrie::kMaxOneUnitNodeValue) { - intUnits[0]=(char16_t)((value+1)<<6); + intUnits[0] = static_cast<char16_t>((value + 1) << 6); length=1; } else { - intUnits[0]=(char16_t)(UCharsTrie::kMinTwoUnitNodeValueLead+((value>>10)&0x7fc0)); - intUnits[1]=(char16_t)value; + intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitNodeValueLead + ((value >> 10) & 0x7fc0)); + intUnits[1] = static_cast<char16_t>(value); length=2; } - intUnits[0]|=(char16_t)node; + intUnits[0] |= static_cast<char16_t>(node); return write(intUnits, length); } @@ -429,14 +429,14 @@ UCharsTrieBuilder::writeDeltaTo(int32_t jumpTarget) { char16_t intUnits[3]; int32_t length; if(i<=UCharsTrie::kMaxTwoUnitDelta) { - intUnits[0]=(char16_t)(UCharsTrie::kMinTwoUnitDeltaLead+(i>>16)); + intUnits[0] = static_cast<char16_t>(UCharsTrie::kMinTwoUnitDeltaLead + (i >> 16)); length=1; } else { - intUnits[0]=(char16_t)(UCharsTrie::kThreeUnitDeltaLead); - intUnits[1]=(char16_t)(i>>16); + intUnits[0] = static_cast<char16_t>(UCharsTrie::kThreeUnitDeltaLead); + intUnits[1] = static_cast<char16_t>(i >> 16); length=2; } - intUnits[length++]=(char16_t)i; + intUnits[length++] = static_cast<char16_t>(i); return write(intUnits, length); } diff --git a/deps/icu-small/source/common/ucharstrieiterator.cpp b/deps/icu-small/source/common/ucharstrieiterator.cpp index 176aed68259cb5..8a212b8b36daad 100644 --- a/deps/icu-small/source/common/ucharstrieiterator.cpp +++ b/deps/icu-small/source/common/ucharstrieiterator.cpp @@ -114,7 +114,7 @@ UCharsTrie::Iterator::next(UErrorCode &errorCode) { pos=uchars_+stack_->elementAti(stackSize-2); stack_->setSize(stackSize-2); str_.truncate(length&0xffff); - length=(int32_t)((uint32_t)length>>16); + length = static_cast<int32_t>(static_cast<uint32_t>(length) >> 16); if(length>1) { pos=branchNext(pos, length, errorCode); if(pos==nullptr) { @@ -138,7 +138,7 @@ UCharsTrie::Iterator::next(UErrorCode &errorCode) { skipValue_=false; } else { // Deliver value for the string so far. - UBool isFinal=(UBool)(node>>15); + UBool isFinal = static_cast<UBool>(node >> 15); if(isFinal) { value_=readValue(pos, node&0x7fff); } else { @@ -187,7 +187,7 @@ UCharsTrie::Iterator::branchNext(const char16_t *pos, int32_t length, UErrorCode while(length>kMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison unit // Push state for the greater-or-equal edge. - stack_->addElement((int32_t)(skipDelta(pos)-uchars_), errorCode); + stack_->addElement(static_cast<int32_t>(skipDelta(pos) - uchars_), errorCode); stack_->addElement(((length-(length>>1))<<16)|str_.length(), errorCode); // Follow the less-than edge. length>>=1; @@ -197,10 +197,10 @@ UCharsTrie::Iterator::branchNext(const char16_t *pos, int32_t length, UErrorCode // Read the first (key, value) pair. char16_t trieUnit=*pos++; int32_t node=*pos++; - UBool isFinal=(UBool)(node>>15); + UBool isFinal = static_cast<UBool>(node >> 15); int32_t value=readValue(pos, node&=0x7fff); pos=skipValue(pos, node); - stack_->addElement((int32_t)(pos-uchars_), errorCode); + stack_->addElement(static_cast<int32_t>(pos - uchars_), errorCode); stack_->addElement(((length-1)<<16)|str_.length(), errorCode); str_.append(trieUnit); if(isFinal) { diff --git a/deps/icu-small/source/common/uchriter.cpp b/deps/icu-small/source/common/uchriter.cpp index a7d30977e091b7..903eb46c3b34d9 100644 --- a/deps/icu-small/source/common/uchriter.cpp +++ b/deps/icu-small/source/common/uchriter.cpp @@ -20,14 +20,14 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UCharCharacterIterator) UCharCharacterIterator::UCharCharacterIterator() : CharacterIterator(), - text(0) + text(nullptr) { // never default construct! } UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0), text(textPtr) { } @@ -35,7 +35,7 @@ UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, position), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0, position), text(textPtr) { } @@ -45,7 +45,8 @@ UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t textBegin, int32_t textEnd, int32_t position) - : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, textBegin, textEnd, position), + : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0, + textBegin, textEnd, position), text(textPtr) { } @@ -171,7 +172,7 @@ UCharCharacterIterator::nextPostInc() { UBool UCharCharacterIterator::hasNext() { - return (UBool)(pos < end ? true : false); + return pos < end; } char16_t @@ -185,7 +186,7 @@ UCharCharacterIterator::previous() { UBool UCharCharacterIterator::hasPrevious() { - return (UBool)(pos > begin ? true : false); + return pos > begin; } UChar32 @@ -352,7 +353,7 @@ UCharCharacterIterator::move32(int32_t delta, CharacterIterator::EOrigin origin) void UCharCharacterIterator::setText(ConstChar16Ptr newText, int32_t newTextLength) { text = newText; - if(newText == 0 || newTextLength < 0) { + if (newText == nullptr || newTextLength < 0) { newTextLength = 0; } end = textLength = newTextLength; diff --git a/deps/icu-small/source/common/ucmndata.cpp b/deps/icu-small/source/common/ucmndata.cpp index 69575d4e830a16..45717ffd712a33 100644 --- a/deps/icu-small/source/common/ucmndata.cpp +++ b/deps/icu-small/source/common/ucmndata.cpp @@ -108,8 +108,8 @@ strcmpAfterPrefix(const char *s1, const char *s2, int32_t *pPrefixLength) { s1+=pl; s2+=pl; for(;;) { - int32_t c1=(uint8_t)*s1++; - int32_t c2=(uint8_t)*s2++; + int32_t c1 = static_cast<uint8_t>(*s1++); + int32_t c2 = static_cast<uint8_t>(*s2++); cmp=c1-c2; if(cmp!=0 || c1==0) { /* different or done */ break; @@ -271,7 +271,7 @@ offsetTOCLookupFn(const UDataMemory *pData, static uint32_t U_CALLCONV pointerTOCEntryCount(const UDataMemory *pData) { const PointerTOC *toc = (PointerTOC *)pData->toc; - return (uint32_t)((toc != nullptr) ? (toc->count) : 0); + return toc != nullptr ? toc->count : 0; } static const DataHeader * U_CALLCONV pointerTOCLookupFn(const UDataMemory *pData, diff --git a/deps/icu-small/source/common/ucnv.cpp b/deps/icu-small/source/common/ucnv.cpp index a7a07d65d61b4f..c7926d2ea717a9 100644 --- a/deps/icu-small/source/common/ucnv.cpp +++ b/deps/icu-small/source/common/ucnv.cpp @@ -473,8 +473,6 @@ ucnv_setSubstChars (UConverter * converter, * we set subChar1 to 0. */ converter->subChar1 = 0; - - return; } U_CAPI void U_EXPORT2 @@ -918,7 +916,7 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { * s<sourceLimit before converterSawEndOfInput is checked */ converterSawEndOfInput= - (UBool)(U_SUCCESS(*err) && + static_cast<UBool>(U_SUCCESS(*err) && pArgs->flush && pArgs->source==pArgs->sourceLimit && cnv->fromUChar32==0); } else { @@ -943,7 +941,7 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { for(;;) { /* update offsets if we write any */ if(offsets!=nullptr) { - int32_t length=(int32_t)(pArgs->target-t); + int32_t length = static_cast<int32_t>(pArgs->target - t); if(length>0) { _updateOffsets(offsets, length, sourceIndex, errorInputLength); @@ -958,7 +956,7 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { } if(sourceIndex>=0) { - sourceIndex+=(int32_t)(pArgs->source-s); + sourceIndex += static_cast<int32_t>(pArgs->source - s); } } @@ -1068,10 +1066,10 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { U_ASSERT(cnv->preFromULength==0); - length=(int32_t)(pArgs->sourceLimit-pArgs->source); + length = static_cast<int32_t>(pArgs->sourceLimit - pArgs->source); if(length>0) { u_memcpy(cnv->preFromU, pArgs->source, length); - cnv->preFromULength=(int8_t)-length; + cnv->preFromULength = static_cast<int8_t>(-length); } pArgs->source=realSource; @@ -1091,7 +1089,7 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { codePoint=cnv->fromUChar32; errorInputLength=0; U16_APPEND_UNSAFE(cnv->invalidUCharBuffer, errorInputLength, codePoint); - cnv->invalidUCharLength=(int8_t)errorInputLength; + cnv->invalidUCharLength = static_cast<int8_t>(errorInputLength); /* set the converter state to deal with the next character */ cnv->fromUChar32=0; @@ -1136,7 +1134,7 @@ ucnv_outputOverflowFromUnicode(UConverter *cnv, offsets=nullptr; } - overflow=(char *)cnv->charErrorBuffer; + overflow = reinterpret_cast<char*>(cnv->charErrorBuffer); length=cnv->charErrorBufferLength; i=0; while(i<length) { @@ -1148,7 +1146,7 @@ ucnv_outputOverflowFromUnicode(UConverter *cnv, overflow[j++]=overflow[i++]; } while(i<length); - cnv->charErrorBufferLength=(int8_t)j; + cnv->charErrorBufferLength = static_cast<int8_t>(j); *target=t; if(offsets!=nullptr) { *pOffsets=offsets; @@ -1363,7 +1361,7 @@ _toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { * s<sourceLimit before converterSawEndOfInput is checked */ converterSawEndOfInput= - (UBool)(U_SUCCESS(*err) && + static_cast<UBool>(U_SUCCESS(*err) && pArgs->flush && pArgs->source==pArgs->sourceLimit && cnv->toULength==0); } else { @@ -1388,7 +1386,7 @@ _toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { for(;;) { /* update offsets if we write any */ if(offsets!=nullptr) { - int32_t length=(int32_t)(pArgs->target-t); + int32_t length = static_cast<int32_t>(pArgs->target - t); if(length>0) { _updateOffsets(offsets, length, sourceIndex, errorInputLength); @@ -1403,7 +1401,7 @@ _toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { } if(sourceIndex>=0) { - sourceIndex+=(int32_t)(pArgs->source-s); + sourceIndex += static_cast<int32_t>(pArgs->source - s); } } @@ -1515,10 +1513,10 @@ _toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { U_ASSERT(cnv->preToULength==0); - length=(int32_t)(pArgs->sourceLimit-pArgs->source); + length = static_cast<int32_t>(pArgs->sourceLimit - pArgs->source); if(length>0) { uprv_memcpy(cnv->preToU, pArgs->source, length); - cnv->preToULength=(int8_t)-length; + cnv->preToULength = static_cast<int8_t>(-length); } pArgs->source=realSource; @@ -1594,7 +1592,7 @@ ucnv_outputOverflowToUnicode(UConverter *cnv, overflow[j++]=overflow[i++]; } while(i<length); - cnv->UCharErrorBufferLength=(int8_t)j; + cnv->UCharErrorBufferLength = static_cast<int8_t>(j); *target=t; if(offsets!=nullptr) { *pOffsets=offsets; @@ -1754,20 +1752,24 @@ ucnv_fromUChars(UConverter *cnv, destLimit=dest+destCapacity; /* perform the conversion */ - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + UErrorCode bufferStatus = U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); destLength=(int32_t)(dest-originalDest); /* if an overflow occurs, then get the preflighting length */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) { + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR) { char buffer[1024]; destLimit=buffer+sizeof(buffer); do { dest=buffer; - *pErrorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + bufferStatus=U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); destLength+=(int32_t)(dest-buffer); - } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); + } while(bufferStatus==U_BUFFER_OVERFLOW_ERROR); + } + if (U_FAILURE(bufferStatus)) { + *pErrorCode = bufferStatus; } } else { destLength=0; @@ -1810,22 +1812,26 @@ ucnv_toUChars(UConverter *cnv, destLimit=dest+destCapacity; /* perform the conversion */ - ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + UErrorCode bufferStatus = U_ZERO_ERROR; + ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); destLength=(int32_t)(dest-originalDest); /* if an overflow occurs, then get the preflighting length */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR) + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR) { char16_t buffer[1024]; destLimit=buffer+UPRV_LENGTHOF(buffer); do { dest=buffer; - *pErrorCode=U_ZERO_ERROR; - ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, pErrorCode); + bufferStatus=U_ZERO_ERROR; + ucnv_toUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); destLength+=(int32_t)(dest-buffer); } - while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); + while(bufferStatus==U_BUFFER_OVERFLOW_ERROR); + } + if (U_FAILURE(bufferStatus)) { + *pErrorCode = bufferStatus; } } else { destLength=0; @@ -2439,7 +2445,7 @@ ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter, false, true, pErrorCode); - targetLength=(int32_t)(myTarget-target); + targetLength = static_cast<int32_t>(myTarget - target); } /* @@ -2462,7 +2468,7 @@ ucnv_internalConvert(UConverter *outConverter, UConverter *inConverter, false, true, pErrorCode); - targetLength+=(int32_t)(myTarget-targetBuffer); + targetLength += static_cast<int32_t>(myTarget - targetBuffer); } while(*pErrorCode==U_BUFFER_OVERFLOW_ERROR); /* done with preflighting, set warnings and errors as appropriate */ @@ -2686,7 +2692,7 @@ ucnv_fixFileSeparator(const UConverter *cnv, U_CAPI UBool U_EXPORT2 ucnv_isAmbiguous(const UConverter *cnv) { - return (UBool)(ucnv_getAmbiguous(cnv)!=nullptr); + return ucnv_getAmbiguous(cnv)!=nullptr; } U_CAPI void U_EXPORT2 diff --git a/deps/icu-small/source/common/ucnv2022.cpp b/deps/icu-small/source/common/ucnv2022.cpp index 5989c1b405a789..df6f0cb9ba6d1e 100644 --- a/deps/icu-small/source/common/ucnv2022.cpp +++ b/deps/icu-small/source/common/ucnv2022.cpp @@ -436,10 +436,10 @@ fromUWriteUInt8(UConverter *cnv, int32_t sourceIndex, UErrorCode *pErrorCode) { - char *targetChars = (char *)*target; + char* targetChars = reinterpret_cast<char*>(*target); ucnv_fromUWriteBytes(cnv, bytes, length, &targetChars, targetLimit, offsets, sourceIndex, pErrorCode); - *target = (uint8_t*)targetChars; + *target = reinterpret_cast<uint8_t*>(targetChars); } @@ -484,7 +484,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ if(cnv->extraInfo != nullptr) { UConverterNamePieces stackPieces; UConverterLoadArgs stackArgs=UCNV_LOAD_ARGS_INITIALIZER; - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; + UConverterDataISO2022* myConverterData = static_cast<UConverterDataISO2022*>(cnv->extraInfo); uint32_t version; stackArgs.onlyTestIsLoadable = pArgs->onlyTestIsLoadable; @@ -528,12 +528,12 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ } /* set the function pointers to appropriate functions */ - cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData); + cnv->sharedData = const_cast<UConverterSharedData*>(&_ISO2022JPData); uprv_strcpy(myConverterData->locale,"ja"); (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version="); size_t len = uprv_strlen(myConverterData->name); - myConverterData->name[len]=(char)(myConverterData->version+(int)'0'); + myConverterData->name[len] = static_cast<char>(myConverterData->version + static_cast<int>('0')); myConverterData->name[len+1]='\0'; } #if !UCONFIG_ONLY_HTML_CONVERSION @@ -579,7 +579,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ setInitialStateFromUnicodeKR(cnv, myConverterData); /* set the function pointers to appropriate functions */ - cnv->sharedData=(UConverterSharedData*)&_ISO2022KRData; + cnv->sharedData = const_cast<UConverterSharedData*>(&_ISO2022KRData); uprv_strcpy(myConverterData->locale,"ko"); } } @@ -597,7 +597,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ /* open the required converters and cache them */ myConverterData->myConverterArray[GB2312_1] = ucnv_loadSharedData("ibm-5478", &stackPieces, &stackArgs, errorCode); - if(version==1) { + if(version>=1) { myConverterData->myConverterArray[ISO_IR_165] = ucnv_loadSharedData("iso-ir-165", &stackPieces, &stackArgs, errorCode); } @@ -606,7 +606,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ /* set the function pointers to appropriate functions */ - cnv->sharedData=(UConverterSharedData*)&_ISO2022CNData; + cnv->sharedData = const_cast<UConverterSharedData*>(&_ISO2022CNData); uprv_strcpy(myConverterData->locale,"cn"); if (version==0){ @@ -655,7 +655,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ static void U_CALLCONV _ISO2022Close(UConverter *converter) { - UConverterDataISO2022* myData =(UConverterDataISO2022 *) (converter->extraInfo); + UConverterDataISO2022* myData = static_cast<UConverterDataISO2022*>(converter->extraInfo); UConverterSharedData **array = myData->myConverterArray; int32_t i; @@ -678,7 +678,7 @@ _ISO2022Close(UConverter *converter) { static void U_CALLCONV _ISO2022Reset(UConverter *converter, UConverterResetChoice choice) { - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) (converter->extraInfo); + UConverterDataISO2022* myConverterData = static_cast<UConverterDataISO2022*>(converter->extraInfo); if(choice<=UCNV_RESET_TO_UNICODE) { uprv_memset(&myConverterData->toU2022State, 0, sizeof(ISO2022State)); myConverterData->key = 0; @@ -784,7 +784,7 @@ getKey_2022(char c,int32_t* key,int32_t* offset){ int32_t hi = MAX_STATES_2022; int32_t oldmid=0; - togo = normalize_esq_chars_2022[(uint8_t)c]; + togo = normalize_esq_chars_2022[static_cast<uint8_t>(c)]; if(togo == 0) { /* not a valid character anywhere in an escape sequence */ *key = 0; @@ -809,7 +809,7 @@ getKey_2022(char c,int32_t* key,int32_t* offset){ else /*we found it*/{ *key = togo; *offset = mid; - return (UCNV_TableStates_2022)escSeqStateTable_Value_2022[mid]; + return static_cast<UCNV_TableStates_2022>(escSeqStateTable_Value_2022[mid]); } oldmid = mid; @@ -829,7 +829,7 @@ changeState_2022(UConverter* _this, Variant2022 var, UErrorCode* err){ UCNV_TableStates_2022 value; - UConverterDataISO2022* myData2022 = ((UConverterDataISO2022*)_this->extraInfo); + UConverterDataISO2022* myData2022 = static_cast<UConverterDataISO2022*>(_this->extraInfo); uint32_t key = myData2022->key; int32_t offset = 0; int8_t initialToULength = _this->toULength; @@ -838,8 +838,8 @@ changeState_2022(UConverter* _this, value = VALID_NON_TERMINAL_2022; while (*source < sourceLimit) { c = *(*source)++; - _this->toUBytes[_this->toULength++]=(uint8_t)c; - value = getKey_2022(c,(int32_t *) &key, &offset); + _this->toUBytes[_this->toULength++] = static_cast<uint8_t>(c); + value = getKey_2022(c, reinterpret_cast<int32_t*>(&key), &offset); switch (value){ @@ -910,7 +910,7 @@ changeState_2022(UConverter* _this, #endif case ISO_2022_JP: { - StateEnum tempState=(StateEnum)nextStateToUnicodeJP[offset]; + StateEnum tempState = static_cast<StateEnum>(nextStateToUnicodeJP[offset]); switch(tempState) { case INVALID_STATE: *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; @@ -933,7 +933,7 @@ changeState_2022(UConverter* _this, *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; } else { /* G2 charset for SS2 */ - myData2022->toU2022State.cs[2]=(int8_t)tempState; + myData2022->toU2022State.cs[2] = static_cast<int8_t>(tempState); } break; default: @@ -941,7 +941,7 @@ changeState_2022(UConverter* _this, *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; } else { /* G0 charset */ - myData2022->toU2022State.cs[0]=(int8_t)tempState; + myData2022->toU2022State.cs[0] = static_cast<int8_t>(tempState); } break; } @@ -950,7 +950,7 @@ changeState_2022(UConverter* _this, #if !UCONFIG_ONLY_HTML_CONVERSION case ISO_2022_CN: { - StateEnum tempState=(StateEnum)nextStateToUnicodeCN[offset]; + StateEnum tempState = static_cast<StateEnum>(nextStateToUnicodeCN[offset]); switch(tempState) { case INVALID_STATE: *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; @@ -986,17 +986,17 @@ changeState_2022(UConverter* _this, case GB2312_1: U_FALLTHROUGH; case CNS_11643_1: - myData2022->toU2022State.cs[1]=(int8_t)tempState; + myData2022->toU2022State.cs[1] = static_cast<int8_t>(tempState); break; case CNS_11643_2: - myData2022->toU2022State.cs[2]=(int8_t)tempState; + myData2022->toU2022State.cs[2] = static_cast<int8_t>(tempState); break; default: /* other CNS 11643 planes */ if(myData2022->version==0) { *err = U_UNSUPPORTED_ESCAPE_SEQUENCE; } else { - myData2022->toU2022State.cs[3]=(int8_t)tempState; + myData2022->toU2022State.cs[3] = static_cast<int8_t>(tempState); } break; } @@ -1039,7 +1039,7 @@ changeState_2022(UConverter* _this, *source-=backOutDistance; } else { /* Back out bytes from the previous buffer: Need to replay them. */ - _this->preToULength=(int8_t)(bytesFromThisBuffer-backOutDistance); + _this->preToULength = static_cast<int8_t>(bytesFromThisBuffer - backOutDistance); /* same as -(initialToULength-1) */ /* preToULength is negative! */ uprv_memcpy(_this->preToU, _this->toUBytes+1, -_this->preToULength); @@ -1145,7 +1145,7 @@ MBCS_FROM_UCHAR32_ISO2022(UConverterSharedData* sharedData, } } else /* outputType==MBCS_OUTPUT_3 */ { p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c); - myValue=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2]; + myValue = (static_cast<uint32_t>(*p) << 16) | (static_cast<uint32_t>(p[1]) << 8) | p[2]; if(myValue<=0xff) { length=1; } else if(myValue<=0xffff) { @@ -1201,7 +1201,7 @@ MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData, /* get the byte for the output */ value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->mbcs.fromUnicodeBytes, c); /* is this code point assigned, or do we use fallbacks? */ - *retval=(uint32_t)(value&0xff); + *retval = static_cast<uint32_t>(value & 0xff); if(value>=0xf00) { return 1; /* roundtrip */ } else if(useFallback ? value>=0x800 : value>=0xc00) { @@ -1219,8 +1219,8 @@ MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData, */ static inline uint32_t _2022FromGR94DBCS(uint32_t value) { - if( (uint16_t)(value - 0xa1a1) <= (0xfefe - 0xa1a1) && - (uint8_t)(value - 0xa1) <= (0xfe - 0xa1) + if (static_cast<uint16_t>(value - 0xa1a1) <= (0xfefe - 0xa1a1) && + static_cast<uint8_t>(value - 0xa1) <= (0xfe - 0xa1) ) { return value - 0x8080; /* shift down to 21..7e byte range */ } else { @@ -1368,12 +1368,12 @@ toUnicodeCallback(UConverter *cnv, const uint32_t sourceChar, const uint32_t targetUniChar, UErrorCode* err){ if(sourceChar>0xff){ - cnv->toUBytes[0] = (uint8_t)(sourceChar>>8); - cnv->toUBytes[1] = (uint8_t)sourceChar; + cnv->toUBytes[0] = static_cast<uint8_t>(sourceChar >> 8); + cnv->toUBytes[1] = static_cast<uint8_t>(sourceChar); cnv->toULength = 2; } else{ - cnv->toUBytes[0] =(char) sourceChar; + cnv->toUBytes[0] = static_cast<char>(sourceChar); cnv->toULength = 1; } @@ -1527,7 +1527,7 @@ _2022FromSJIS(uint32_t value) { return 0; /* beyond JIS X 0208 */ } - trail = (uint8_t)value; + trail = static_cast<uint8_t>(value); value &= 0xff00; /* lead byte */ if(value <= 0x9f00) { @@ -1569,7 +1569,7 @@ _2022ToSJIS(uint8_t c1, uint8_t c2, char bytes[2]) { c2 = 0; /* invalid */ } } else { - if((uint8_t)(c2-0x21) <= ((0x7e)-0x21)) { + if (static_cast<uint8_t>(c2 - 0x21) <= ((0x7e) - 0x21)) { c2 += 0x7e; } else { c2 = 0; /* invalid */ @@ -1583,8 +1583,8 @@ _2022ToSJIS(uint8_t c1, uint8_t c2, char bytes[2]) { } else { c1 = 0; /* invalid */ } - bytes[0] = (char)c1; - bytes[1] = (char)c2; + bytes[0] = static_cast<char>(c1); + bytes[1] = static_cast<char>(c2); } /* @@ -1665,8 +1665,8 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UConverter *cnv = args->converter; UConverterDataISO2022 *converterData; ISO2022State *pFromU2022State; - uint8_t *target = (uint8_t *) args->target; - const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; + uint8_t* target = reinterpret_cast<uint8_t*>(args->target); + const uint8_t* targetLimit = reinterpret_cast<const uint8_t*>(args->targetLimit); const char16_t* source = args->source; const char16_t* sourceLimit = args->sourceLimit; int32_t* offsets = args->offsets; @@ -1682,7 +1682,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args int8_t cs, g; /* set up the state */ - converterData = (UConverterDataISO2022*)cnv->extraInfo; + converterData = static_cast<UConverterDataISO2022*>(cnv->extraInfo); pFromU2022State = &converterData->fromU2022State; choiceCount = 0; @@ -1703,7 +1703,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { /* test the following code unit */ - char16_t trail=(char16_t) *source; + char16_t trail = *source; if(U16_IS_TRAIL(trail)) { source++; sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); @@ -1753,7 +1753,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* JIS7/8: try single-byte half-width Katakana before JISX208 */ if(converterData->version == 3 || converterData->version == 4) { - choices[choiceCount++] = (int8_t)HWKANA_7BIT; + choices[choiceCount++] = static_cast<int8_t>(HWKANA_7BIT); } /* Do not try single-byte half-width Katakana for other versions. */ csm &= ~CSM(HWKANA_7BIT); @@ -1770,7 +1770,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* try all the other possible charsets */ for(i = 0; i < UPRV_LENGTHOF(jpCharsetPref); ++i) { - cs = (int8_t)jpCharsetPref[i]; + cs = static_cast<int8_t>(jpCharsetPref[i]); if(CSM(cs) & csm) { choices[choiceCount++] = cs; csm &= ~CSM(cs); @@ -1800,7 +1800,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args switch(cs0) { case ASCII: if(sourceChar <= 0x7f) { - targetValue = (uint32_t)sourceChar; + targetValue = static_cast<uint32_t>(sourceChar); len = 1; cs = cs0; g = 0; @@ -1808,31 +1808,31 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args break; case ISO8859_1: if(GR96_START <= sourceChar && sourceChar <= GR96_END) { - targetValue = (uint32_t)sourceChar - 0x80; + targetValue = static_cast<uint32_t>(sourceChar) - 0x80; len = 1; cs = cs0; g = 2; } break; case HWKANA_7BIT: - if((uint32_t)(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) { + if (static_cast<uint32_t>(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) { if(converterData->version==3) { /* JIS7: use G1 (SO) */ /* Shift U+FF61..U+FF9F to bytes 21..5F. */ - targetValue = (uint32_t)(sourceChar - (HWKANA_START - 0x21)); + targetValue = static_cast<uint32_t>(sourceChar - (HWKANA_START - 0x21)); len = 1; pFromU2022State->cs[1] = cs = cs0; /* do not output an escape sequence */ g = 1; } else if(converterData->version==4) { /* JIS8: use 8-bit bytes with any single-byte charset, see escape sequence output below */ /* Shift U+FF61..U+FF9F to bytes A1..DF. */ - targetValue = (uint32_t)(sourceChar - (HWKANA_START - 0xa1)); + targetValue = static_cast<uint32_t>(sourceChar - (HWKANA_START - 0xa1)); len = 1; cs = pFromU2022State->cs[0]; if(IS_JP_DBCS(cs)) { /* switch from a DBCS charset to JISX201 */ - cs = (int8_t)JISX201; + cs = static_cast<int8_t>(JISX201); } /* else stay in the current G0 charset */ g = 0; @@ -1867,7 +1867,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args useFallback = false; } } else if(len == 0 && useFallback && - (uint32_t)(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) { + static_cast<uint32_t>(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) { targetValue = hwkana_fb[sourceChar - HWKANA_START]; len = -2; cs = cs0; @@ -1958,10 +1958,10 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* write the output bytes */ if(len == 1) { - buffer[outLen++] = (char)targetValue; + buffer[outLen++] = static_cast<char>(targetValue); } else /* len == 2 */ { - buffer[outLen++] = (char)(targetValue >> 8); - buffer[outLen++] = (char)targetValue; + buffer[outLen++] = static_cast<char>(targetValue >> 8); + buffer[outLen++] = static_cast<char>(targetValue); } } else { /* @@ -1983,13 +1983,13 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args if(outLen == 1) { *target++ = buffer[0]; if(offsets) { - *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */ + *offsets++ = static_cast<int32_t>(source - args->source - 1); /* -1: known to be ASCII */ } } else if(outLen == 2 && (target + 2) <= targetLimit) { *target++ = buffer[0]; *target++ = buffer[1]; if(offsets) { - int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar)); + int32_t sourceIndex = static_cast<int32_t>(source - args->source - U16_LENGTH(sourceChar)); *offsets++ = sourceIndex; *offsets++ = sourceIndex; } @@ -1997,8 +1997,8 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args fromUWriteUInt8( cnv, buffer, outLen, - &target, (const char *)targetLimit, - &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), + &target, reinterpret_cast<const char*>(targetLimit), + &offsets, static_cast<int32_t>(source - args->source - U16_LENGTH(sourceChar)), err); if(U_FAILURE(*err)) { break; @@ -2039,7 +2039,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args int32_t escLen = escSeqCharsLen[ASCII]; uprv_memcpy(buffer + outLen, escSeqChars[ASCII], escLen); outLen += escLen; - pFromU2022State->cs[0] = (int8_t)ASCII; + pFromU2022State->cs[0] = static_cast<int8_t>(ASCII); } /* get the source index of the last input character */ @@ -2050,7 +2050,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args * this code gives an incorrect result for the rare case of an unmatched * trail surrogate that is alone in the last buffer of the text stream */ - sourceIndex=(int32_t)(source-args->source); + sourceIndex = static_cast<int32_t>(source - args->source); if(sourceIndex>0) { --sourceIndex; if( U16_IS_TRAIL(args->source[sourceIndex]) && @@ -2065,14 +2065,14 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args fromUWriteUInt8( cnv, buffer, outLen, - &target, (const char *)targetLimit, + &target, reinterpret_cast<const char*>(targetLimit), &offsets, sourceIndex, err); } /*save the state and return */ args->source = source; - args->target = (char*)target; + args->target = reinterpret_cast<char*>(target); } /*************** to unicode *******************/ @@ -2081,7 +2081,7 @@ static void U_CALLCONV UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[2]; - const char *mySource = (char *) args->source; + const char* mySource = const_cast<char*>(args->source); char16_t *myTarget = args->target; const char *mySourceLimit = args->sourceLimit; uint32_t targetUniChar = 0x0000; @@ -2091,7 +2091,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, ISO2022State *pToU2022State; StateEnum cs; - myData=(UConverterDataISO2022*)(args->converter->extraInfo); + myData = static_cast<UConverterDataISO2022*>(args->converter->extraInfo); pToU2022State = &myData->toU2022State; if(myData->key != 0) { @@ -2101,7 +2101,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, /* continue with a partial double-byte character */ mySourceChar = args->converter->toUBytes[0]; args->converter->toULength = 0; - cs = (StateEnum)pToU2022State->cs[pToU2022State->g]; + cs = static_cast<StateEnum>(pToU2022State->cs[pToU2022State->g]); targetUniChar = missingCharMarker; goto getTrailByte; } @@ -2112,7 +2112,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(myTarget < args->targetLimit){ - mySourceChar= (unsigned char) *mySource++; + mySourceChar = static_cast<unsigned char>(*mySource++); switch(mySourceChar) { case UCNV_SI: @@ -2128,7 +2128,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, case UCNV_SO: if(myData->version==3) { /* JIS7: switch to G1 half-width Katakana */ - pToU2022State->cs[1] = (int8_t)HWKANA_7BIT; + pToU2022State->cs[1] = static_cast<int8_t>(HWKANA_7BIT); pToU2022State->g=1; continue; } else { @@ -2151,7 +2151,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(myData->version==0 && myData->key==0 && U_SUCCESS(*err) && myData->isEmptySegment) { *err = U_ILLEGAL_ESCAPE_SEQUENCE; args->converter->toUCallbackReason = UCNV_IRREGULAR; - args->converter->toULength = (int8_t)(toULengthBefore + (mySource - mySourceBefore)); + args->converter->toULength = static_cast<int8_t>(toULengthBefore + (mySource - mySourceBefore)); } } @@ -2173,8 +2173,9 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, case CR: case LF: /* automatically reset to single-byte mode */ - if((StateEnum)pToU2022State->cs[0] != ASCII && (StateEnum)pToU2022State->cs[0] != JISX201) { - pToU2022State->cs[0] = (int8_t)ASCII; + if (static_cast<StateEnum>(pToU2022State->cs[0]) != ASCII && + static_cast<StateEnum>(pToU2022State->cs[0]) != JISX201) { + pToU2022State->cs[0] = static_cast<int8_t>(ASCII); } pToU2022State->cs[2] = 0; pToU2022State->g = 0; @@ -2182,8 +2183,8 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, default: /* convert one or two bytes */ myData->isEmptySegment = false; - cs = (StateEnum)pToU2022State->cs[pToU2022State->g]; - if( (uint8_t)(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version==4 && + cs = static_cast<StateEnum>(pToU2022State->cs[pToU2022State->g]); + if (static_cast<uint8_t>(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version == 4 && !IS_JP_DBCS(cs) ) { /* 8-bit halfwidth katakana in any single-byte mode for JIS8 */ @@ -2223,7 +2224,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } break; case HWKANA_7BIT: - if((uint8_t)(mySourceChar - 0x21) <= (0x5f - 0x21)) { + if (static_cast<uint8_t>(mySourceChar - 0x21) <= (0x5f - 0x21)) { /* 7-bit halfwidth Katakana */ targetUniChar = mySourceChar + (HWKANA_START - 0x21); } @@ -2234,7 +2235,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, int leadIsOk, trailIsOk; uint8_t trailByte; getTrailByte: - trailByte = (uint8_t)*mySource; + trailByte = static_cast<uint8_t>(*mySource); /* * Ticket 5691: consistent illegal sequences: * - We include at least the first byte in the illegal sequence. @@ -2245,13 +2246,13 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, * an ESC/SO/SI, we report only the first byte as the illegal sequence. * Otherwise we convert or report the pair of bytes. */ - leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); - trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21); + leadIsOk = static_cast<uint8_t>(mySourceChar - 0x21) <= (0x7e - 0x21); + trailIsOk = static_cast<uint8_t>(trailByte - 0x21) <= (0x7e - 0x21); if (leadIsOk && trailIsOk) { ++mySource; tmpSourceChar = (mySourceChar << 8) | trailByte; if(cs == JISX208) { - _2022ToSJIS((uint8_t)mySourceChar, trailByte, tempBuf); + _2022ToSJIS(static_cast<uint8_t>(mySourceChar), trailByte, tempBuf); mySourceChar = tmpSourceChar; } else { /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */ @@ -2259,8 +2260,8 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if (cs == KSC5601) { tmpSourceChar += 0x8080; /* = _2022ToGR94DBCS(tmpSourceChar) */ } - tempBuf[0] = (char)(tmpSourceChar >> 8); - tempBuf[1] = (char)(tmpSourceChar); + tempBuf[0] = static_cast<char>(tmpSourceChar >> 8); + tempBuf[1] = static_cast<char>(tmpSourceChar); } targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->myConverterArray[cs], tempBuf, 2, false); } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) { @@ -2270,7 +2271,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, mySourceChar = 0x10000 | (mySourceChar << 8) | trailByte; } } else { - args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toUBytes[0] = static_cast<uint8_t>(mySourceChar); args->converter->toULength = 1; goto endloop; } @@ -2279,27 +2280,27 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } /* End of outer switch */ if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){ if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } - *(myTarget++)=(char16_t)targetUniChar; + *(myTarget++) = static_cast<char16_t>(targetUniChar); } else if(targetUniChar > missingCharMarker){ /* disassemble the surrogate pair and write to output*/ targetUniChar-=0x0010000; - *myTarget = (char16_t)(0xd800+(char16_t)(targetUniChar>>10)); + *myTarget = static_cast<char16_t>(0xd800 + static_cast<char16_t>(targetUniChar >> 10)); if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } ++myTarget; if(myTarget< args->targetLimit){ - *myTarget = (char16_t)(0xdc00+(char16_t)(targetUniChar&0x3ff)); + *myTarget = static_cast<char16_t>(0xdc00 + static_cast<char16_t>(targetUniChar & 0x3ff)); if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } ++myTarget; }else{ args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= - (char16_t)(0xdc00+(char16_t)(targetUniChar&0x3ff)); + static_cast<char16_t>(0xdc00 + static_cast<char16_t>(targetUniChar & 0x3ff)); } } @@ -2333,7 +2334,7 @@ static void U_CALLCONV UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args, UErrorCode* err){ UConverter* saveConv = args->converter; - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022*)saveConv->extraInfo; + UConverterDataISO2022* myConverterData = static_cast<UConverterDataISO2022*>(saveConv->extraInfo); args->converter=myConverterData->currentConverter; myConverterData->currentConverter->fromUChar32 = saveConv->fromUChar32; @@ -2358,8 +2359,8 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args const char16_t *source = args->source; const char16_t *sourceLimit = args->sourceLimit; - unsigned char *target = (unsigned char *) args->target; - unsigned char *targetLimit = (unsigned char *) args->targetLimit; + unsigned char *target = reinterpret_cast<unsigned char*>(args->target); + unsigned char *targetLimit = reinterpret_cast<unsigned char*>(const_cast<char*>(args->targetLimit)); int32_t* offsets = args->offsets; uint32_t targetByteUnit = 0x0000; UChar32 sourceChar = 0x0000; @@ -2370,7 +2371,7 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UBool useFallback; int32_t length =0; - converterData=(UConverterDataISO2022*)args->converter->extraInfo; + converterData = static_cast<UConverterDataISO2022*>(args->converter->extraInfo); /* if the version is 1 then the user is requesting * conversion with ibm-25546 pass the arguments to * MBCS converter and return @@ -2383,10 +2384,10 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* initialize data */ sharedData = converterData->currentConverter->sharedData; useFallback = args->converter->useFallback; - isTargetByteDBCS=(UBool)args->converter->fromUnicodeStatus; + isTargetByteDBCS = static_cast<UBool>(args->converter->fromUnicodeStatus); oldIsTargetByteDBCS = isTargetByteDBCS; - isTargetByteDBCS = (UBool) args->converter->fromUnicodeStatus; + isTargetByteDBCS = static_cast<UBool>(args->converter->fromUnicodeStatus); if((sourceChar = args->converter->fromUChar32)!=0 && target <targetLimit) { goto getTrail; } @@ -2414,15 +2415,15 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args if( length > 2 || length==0 || (length == 1 && targetByteUnit > 0x7f) || (length == 2 && - ((uint16_t)(targetByteUnit - 0xa1a1) > (0xfefe - 0xa1a1) || - (uint8_t)(targetByteUnit - 0xa1) > (0xfe - 0xa1))) + (static_cast<uint16_t>(targetByteUnit - 0xa1a1) > (0xfefe - 0xa1a1) || + static_cast<uint8_t>(targetByteUnit - 0xa1) > (0xfe - 0xa1))) ) { targetByteUnit=missingCharMarker; } if (targetByteUnit != missingCharMarker){ oldIsTargetByteDBCS = isTargetByteDBCS; - isTargetByteDBCS = (UBool)(targetByteUnit>0x00FF); + isTargetByteDBCS = static_cast<UBool>(targetByteUnit > 0x00FF); /* append the shift sequence */ if (oldIsTargetByteDBCS != isTargetByteDBCS ){ @@ -2431,38 +2432,38 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args else *target++ = UCNV_SI; if(offsets) - *(offsets++) = (int32_t)(source - args->source-1); + *(offsets++) = static_cast<int32_t>(source - args->source - 1); } /* write the targetUniChar to target */ if(targetByteUnit <= 0x00FF){ if( target < targetLimit){ - *(target++) = (unsigned char) targetByteUnit; + *(target++) = static_cast<unsigned char>(targetByteUnit); if(offsets){ - *(offsets++) = (int32_t)(source - args->source-1); + *(offsets++) = static_cast<int32_t>(source - args->source - 1); } }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit); + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = static_cast<unsigned char>(targetByteUnit); *err = U_BUFFER_OVERFLOW_ERROR; } }else{ if(target < targetLimit){ - *(target++) =(unsigned char) ((targetByteUnit>>8) -0x80); + *(target++) = static_cast<unsigned char>((targetByteUnit >> 8) - 0x80); if(offsets){ - *(offsets++) = (int32_t)(source - args->source-1); + *(offsets++) = static_cast<int32_t>(source - args->source - 1); } if(target < targetLimit){ - *(target++) =(unsigned char) (targetByteUnit -0x80); + *(target++) = static_cast<unsigned char>(targetByteUnit - 0x80); if(offsets){ - *(offsets++) = (int32_t)(source - args->source-1); + *(offsets++) = static_cast<int32_t>(source - args->source - 1); } }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit -0x80); + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = static_cast<unsigned char>(targetByteUnit - 0x80); *err = U_BUFFER_OVERFLOW_ERROR; } }else{ - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) ((targetByteUnit>>8) -0x80); - args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit-0x80); + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = static_cast<unsigned char>((targetByteUnit >> 8) - 0x80); + args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = static_cast<unsigned char>(targetByteUnit - 0x80); *err = U_BUFFER_OVERFLOW_ERROR; } } @@ -2480,7 +2481,7 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { /* test the following code unit */ - char16_t trail=(char16_t) *source; + char16_t trail = *source; if(U16_IS_TRAIL(trail)) { source++; sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); @@ -2544,7 +2545,7 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args * this code gives an incorrect result for the rare case of an unmatched * trail surrogate that is alone in the last buffer of the text stream */ - sourceIndex=(int32_t)(source-args->source); + sourceIndex = static_cast<int32_t>(source - args->source); if(sourceIndex>0) { --sourceIndex; if( U16_IS_TRAIL(args->source[sourceIndex]) && @@ -2559,15 +2560,15 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args fromUWriteUInt8( args->converter, SHIFT_IN_STR, 1, - &target, (const char *)targetLimit, + &target, reinterpret_cast<const char*>(targetLimit), &offsets, sourceIndex, err); } /*save the state and return */ args->source = source; - args->target = (char*)target; - args->converter->fromUnicodeStatus = (uint32_t)isTargetByteDBCS; + args->target = reinterpret_cast<char*>(target); + args->converter->fromUnicodeStatus = static_cast<uint32_t>(isTargetByteDBCS); } /************************ To Unicode ***************************************/ @@ -2576,7 +2577,7 @@ static void U_CALLCONV UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args, UErrorCode* err){ char const* sourceStart; - UConverterDataISO2022* myData=(UConverterDataISO2022*)(args->converter->extraInfo); + UConverterDataISO2022* myData = static_cast<UConverterDataISO2022*>(args->converter->extraInfo); UConverterToUnicodeArgs subArgs; int32_t minArgsSize; @@ -2585,11 +2586,11 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args if(args->size<sizeof(UConverterToUnicodeArgs)) { minArgsSize = args->size; } else { - minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs); + minArgsSize = static_cast<int32_t>(sizeof(UConverterToUnicodeArgs)); } uprv_memcpy(&subArgs, args, minArgsSize); - subArgs.size = (uint16_t)minArgsSize; + subArgs.size = static_cast<uint16_t>(minArgsSize); subArgs.converter = myData->currentConverter; /* remember the original start of the input for offsets */ @@ -2628,7 +2629,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args /* update offsets to base them on the actual start of the input */ int32_t *offsets = args->offsets; char16_t *target = args->target; - int32_t delta = (int32_t)(args->source - sourceStart); + int32_t delta = static_cast<int32_t>(args->source - sourceStart); while(target < subArgs.target) { if(*offsets >= 0) { *offsets += delta; @@ -2674,7 +2675,7 @@ static void U_CALLCONV UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[2]; - const char *mySource = ( char *) args->source; + const char* mySource = const_cast<char*>(args->source); char16_t *myTarget = args->target; const char *mySourceLimit = args->sourceLimit; UChar32 targetUniChar = 0x0000; @@ -2683,7 +2684,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UConverterSharedData* sharedData ; UBool useFallback; - myData=(UConverterDataISO2022*)(args->converter->extraInfo); + myData = static_cast<UConverterDataISO2022*>(args->converter->extraInfo); if(myData->version==1){ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err); return; @@ -2707,7 +2708,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(myTarget < args->targetLimit){ - mySourceChar= (unsigned char) *mySource++; + mySourceChar = static_cast<unsigned char>(*mySource++); if(mySourceChar==UCNV_SI){ myData->toU2022State.g = 0; @@ -2715,7 +2716,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, myData->isEmptySegment = false; /* we are handling it, reset to avoid future spurious errors */ *err = U_ILLEGAL_ESCAPE_SEQUENCE; args->converter->toUCallbackReason = UCNV_IRREGULAR; - args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toUBytes[0] = static_cast<uint8_t>(mySourceChar); args->converter->toULength = 1; args->target = myTarget; args->source = mySource; @@ -2749,7 +2750,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, uint8_t trailByte; getTrailByte: targetUniChar = missingCharMarker; - trailByte = (uint8_t)*mySource; + trailByte = static_cast<uint8_t>(*mySource); /* * Ticket 5691: consistent illegal sequences: * - We include at least the first byte in the illegal sequence. @@ -2760,12 +2761,12 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, * an ESC/SO/SI, we report only the first byte as the illegal sequence. * Otherwise we convert or report the pair of bytes. */ - leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); - trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21); + leadIsOk = static_cast<uint8_t>(mySourceChar - 0x21) <= (0x7e - 0x21); + trailIsOk = static_cast<uint8_t>(trailByte - 0x21) <= (0x7e - 0x21); if (leadIsOk && trailIsOk) { ++mySource; - tempBuf[0] = (char)(mySourceChar + 0x80); - tempBuf[1] = (char)(trailByte + 0x80); + tempBuf[0] = static_cast<char>(mySourceChar + 0x80); + tempBuf[1] = static_cast<char>(trailByte + 0x80); targetUniChar = ucnv_MBCSSimpleGetNextUChar(sharedData, tempBuf, 2, useFallback); mySourceChar = (mySourceChar << 8) | trailByte; } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) { @@ -2775,7 +2776,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, mySourceChar = static_cast<char16_t>(0x10000 | (mySourceChar << 8) | trailByte); } } else { - args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toUBytes[0] = static_cast<uint8_t>(mySourceChar); args->converter->toULength = 1; break; } @@ -2787,9 +2788,9 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } if(targetUniChar < 0xfffe){ if(args->offsets) { - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } - *(myTarget++)=(char16_t)targetUniChar; + *(myTarget++) = static_cast<char16_t>(targetUniChar); } else { /* Call the callback function*/ @@ -2917,8 +2918,8 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UConverter *cnv = args->converter; UConverterDataISO2022 *converterData; ISO2022State *pFromU2022State; - uint8_t *target = (uint8_t *) args->target; - const uint8_t *targetLimit = (const uint8_t *) args->targetLimit; + uint8_t* target = reinterpret_cast<uint8_t*>(args->target); + const uint8_t* targetLimit = reinterpret_cast<const uint8_t*>(args->targetLimit); const char16_t* source = args->source; const char16_t* sourceLimit = args->sourceLimit; int32_t* offsets = args->offsets; @@ -2931,7 +2932,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args UBool useFallback; /* set up the state */ - converterData = (UConverterDataISO2022*)cnv->extraInfo; + converterData = static_cast<UConverterDataISO2022*>(cnv->extraInfo); pFromU2022State = &converterData->fromU2022State; choiceCount = 0; @@ -2952,7 +2953,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { /* test the following code unit */ - char16_t trail=(char16_t) *source; + char16_t trail = *source; if(U16_IS_TRAIL(trail)) { source++; sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); @@ -2992,11 +2993,11 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* US-ASCII */ if(pFromU2022State->g == 0) { - buffer[0] = (char)sourceChar; + buffer[0] = static_cast<char>(sourceChar); len = 1; } else { buffer[0] = UCNV_SI; - buffer[1] = (char)sourceChar; + buffer[1] = static_cast<char>(sourceChar); len = 2; pFromU2022State->g = 0; choiceCount = 0; @@ -3026,9 +3027,9 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* try the other SO/G1 converter; a CNS_11643_1 lookup may result in any plane */ if(choices[0] == GB2312_1) { - choices[1] = (int8_t)CNS_11643_1; + choices[1] = static_cast<int8_t>(CNS_11643_1); } else { - choices[1] = (int8_t)GB2312_1; + choices[1] = static_cast<int8_t>(GB2312_1); } choiceCount = 2; @@ -3038,23 +3039,23 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /* try one of the other converters */ switch(choices[0]) { case GB2312_1: - choices[1] = (int8_t)CNS_11643_1; - choices[2] = (int8_t)ISO_IR_165; + choices[1] = static_cast<int8_t>(CNS_11643_1); + choices[2] = static_cast<int8_t>(ISO_IR_165); break; case ISO_IR_165: - choices[1] = (int8_t)GB2312_1; - choices[2] = (int8_t)CNS_11643_1; + choices[1] = static_cast<int8_t>(GB2312_1); + choices[2] = static_cast<int8_t>(CNS_11643_1); break; default: /* CNS_11643_x */ - choices[1] = (int8_t)GB2312_1; - choices[2] = (int8_t)ISO_IR_165; + choices[1] = static_cast<int8_t>(GB2312_1); + choices[2] = static_cast<int8_t>(ISO_IR_165); break; } choiceCount = 3; } else { - choices[0] = (int8_t)CNS_11643_1; - choices[1] = (int8_t)GB2312_1; + choices[0] = static_cast<int8_t>(CNS_11643_1); + choices[1] = static_cast<int8_t>(GB2312_1); } } @@ -3087,7 +3088,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args MBCS_OUTPUT_3); if(len2 == 3 || (len2 == -3 && len == 0)) { targetValue = value; - cs = (int8_t)(CNS_11643_0 + (value >> 16) - 0x80); + cs = static_cast<int8_t>(CNS_11643_0 + (value >> 16) - 0x80); if(len2 >= 0) { len = 2; } else { @@ -3165,8 +3166,8 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args } /* write the two output bytes */ - buffer[len++] = (char)(targetValue >> 8); - buffer[len++] = (char)targetValue; + buffer[len++] = static_cast<char>(targetValue >> 8); + buffer[len++] = static_cast<char>(targetValue); } else { /* if we cannot find the character after checking all codepages * then this is an error @@ -3181,13 +3182,13 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args if(len == 1) { *target++ = buffer[0]; if(offsets) { - *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */ + *offsets++ = static_cast<int32_t>(source - args->source - 1); /* -1: known to be ASCII */ } } else if(len == 2 && (target + 2) <= targetLimit) { *target++ = buffer[0]; *target++ = buffer[1]; if(offsets) { - int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar)); + int32_t sourceIndex = static_cast<int32_t>(source - args->source - U16_LENGTH(sourceChar)); *offsets++ = sourceIndex; *offsets++ = sourceIndex; } @@ -3195,8 +3196,8 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args fromUWriteUInt8( cnv, buffer, len, - &target, (const char *)targetLimit, - &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)), + &target, reinterpret_cast<const char*>(targetLimit), + &offsets, static_cast<int32_t>(source - args->source - U16_LENGTH(sourceChar)), err); if(U_FAILURE(*err)) { break; @@ -3237,7 +3238,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args * this code gives an incorrect result for the rare case of an unmatched * trail surrogate that is alone in the last buffer of the text stream */ - sourceIndex=(int32_t)(source-args->source); + sourceIndex = static_cast<int32_t>(source - args->source); if(sourceIndex>0) { --sourceIndex; if( U16_IS_TRAIL(args->source[sourceIndex]) && @@ -3252,14 +3253,14 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args fromUWriteUInt8( cnv, SHIFT_IN_STR, 1, - &target, (const char *)targetLimit, + &target, reinterpret_cast<const char*>(targetLimit), &offsets, sourceIndex, err); } /*save the state and return */ args->source = source; - args->target = (char*)target; + args->target = reinterpret_cast<char*>(target); } @@ -3267,7 +3268,7 @@ static void U_CALLCONV UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[3]; - const char *mySource = (char *) args->source; + const char* mySource = const_cast<char*>(args->source); char16_t *myTarget = args->target; const char *mySourceLimit = args->sourceLimit; uint32_t targetUniChar = 0x0000; @@ -3275,7 +3276,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UConverterDataISO2022* myData; ISO2022State *pToU2022State; - myData=(UConverterDataISO2022*)(args->converter->extraInfo); + myData = static_cast<UConverterDataISO2022*>(args->converter->extraInfo); pToU2022State = &myData->toU2022State; if(myData->key != 0) { @@ -3295,7 +3296,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(myTarget < args->targetLimit){ - mySourceChar= (unsigned char) *mySource++; + mySourceChar = static_cast<unsigned char>(*mySource++); switch(mySourceChar){ case UCNV_SI: @@ -3337,7 +3338,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, if(myData->key==0 && U_SUCCESS(*err) && myData->isEmptySegment) { *err = U_ILLEGAL_ESCAPE_SEQUENCE; args->converter->toUCallbackReason = UCNV_IRREGULAR; - args->converter->toULength = (int8_t)(toULengthBefore + (mySource - mySourceBefore)); + args->converter->toULength = static_cast<int8_t>(toULengthBefore + (mySource - mySourceBefore)); } } @@ -3367,7 +3368,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, int leadIsOk, trailIsOk; uint8_t trailByte; getTrailByte: - trailByte = (uint8_t)*mySource; + trailByte = static_cast<uint8_t>(*mySource); /* * Ticket 5691: consistent illegal sequences: * - We include at least the first byte in the illegal sequence. @@ -3378,23 +3379,23 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, * an ESC/SO/SI, we report only the first byte as the illegal sequence. * Otherwise we convert or report the pair of bytes. */ - leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21); - trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21); + leadIsOk = static_cast<uint8_t>(mySourceChar - 0x21) <= (0x7e - 0x21); + trailIsOk = static_cast<uint8_t>(trailByte - 0x21) <= (0x7e - 0x21); if (leadIsOk && trailIsOk) { ++mySource; - tempState = (StateEnum)pToU2022State->cs[pToU2022State->g]; + tempState = static_cast<StateEnum>(pToU2022State->cs[pToU2022State->g]); if(tempState >= CNS_11643_0) { cnv = myData->myConverterArray[CNS_11643]; - tempBuf[0] = (char) (0x80+(tempState-CNS_11643_0)); - tempBuf[1] = (char) (mySourceChar); - tempBuf[2] = (char) trailByte; + tempBuf[0] = static_cast<char>(0x80 + (tempState - CNS_11643_0)); + tempBuf[1] = static_cast<char>(mySourceChar); + tempBuf[2] = static_cast<char>(trailByte); tempBufLen = 3; }else{ U_ASSERT(tempState<UCNV_2022_MAX_CONVERTERS); cnv = myData->myConverterArray[tempState]; - tempBuf[0] = (char) (mySourceChar); - tempBuf[1] = (char) trailByte; + tempBuf[0] = static_cast<char>(mySourceChar); + tempBuf[1] = static_cast<char>(trailByte); tempBufLen = 2; } targetUniChar = ucnv_MBCSSimpleGetNextUChar(cnv, tempBuf, tempBufLen, false); @@ -3410,41 +3411,41 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, pToU2022State->g=pToU2022State->prevG; } } else { - args->converter->toUBytes[0] = (uint8_t)mySourceChar; + args->converter->toUBytes[0] = static_cast<uint8_t>(mySourceChar); args->converter->toULength = 1; goto endloop; } } else{ if(mySourceChar <= 0x7f) { - targetUniChar = (char16_t) mySourceChar; + targetUniChar = static_cast<char16_t>(mySourceChar); } } break; } if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){ if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } - *(myTarget++)=(char16_t)targetUniChar; + *(myTarget++) = static_cast<char16_t>(targetUniChar); } else if(targetUniChar > missingCharMarker){ /* disassemble the surrogate pair and write to output*/ targetUniChar-=0x0010000; - *myTarget = (char16_t)(0xd800+(char16_t)(targetUniChar>>10)); + *myTarget = static_cast<char16_t>(0xd800 + static_cast<char16_t>(targetUniChar >> 10)); if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } ++myTarget; if(myTarget< args->targetLimit){ - *myTarget = (char16_t)(0xdc00+(char16_t)(targetUniChar&0x3ff)); + *myTarget = static_cast<char16_t>(0xdc00 + static_cast<char16_t>(targetUniChar & 0x3ff)); if(args->offsets){ - args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); + args->offsets[myTarget - args->target] = static_cast<int32_t>(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2)); } ++myTarget; }else{ args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]= - (char16_t)(0xdc00+(char16_t)(targetUniChar&0x3ff)); + static_cast<char16_t>(0xdc00 + static_cast<char16_t>(targetUniChar & 0x3ff)); } } @@ -3468,13 +3469,13 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, static void U_CALLCONV _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { UConverter *cnv = args->converter; - UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; + UConverterDataISO2022* myConverterData = static_cast<UConverterDataISO2022*>(cnv->extraInfo); ISO2022State *pFromU2022State=&myConverterData->fromU2022State; char *p, *subchar; char buffer[8]; int32_t length; - subchar=(char *)cnv->subChars; + subchar = reinterpret_cast<char*>(cnv->subChars); length=cnv->subCharLen; /* assume length==1 for most variants */ p = buffer; @@ -3492,7 +3493,7 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC cs = pFromU2022State->cs[0]; if(cs != ASCII && cs != JISX201) { /* not in ASCII or JIS X 0201: switch to ASCII */ - pFromU2022State->cs[0] = (int8_t)ASCII; + pFromU2022State->cs[0] = static_cast<int8_t>(ASCII); *p++ = '\x1b'; *p++ = '\x28'; *p++ = '\x42'; @@ -3534,8 +3535,8 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC int8_t currentSubCharLen = myConverterData->currentConverter->subCharLen; /* set our substitution string into the subconverter */ - myConverterData->currentConverter->subChars = (uint8_t *)subchar; - myConverterData->currentConverter->subCharLen = (int8_t)length; + myConverterData->currentConverter->subChars = reinterpret_cast<uint8_t*>(subchar); + myConverterData->currentConverter->subCharLen = static_cast<int8_t>(length); /* let the subconverter write the subchar, set/retrieve fromUChar32 state */ args->converter = myConverterData->currentConverter; @@ -3565,7 +3566,7 @@ _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorC break; } ucnv_cbFromUWriteBytes(args, - buffer, (int32_t)(p - buffer), + buffer, static_cast<int32_t>(p - buffer), offsetIndex, err); } @@ -3656,7 +3657,7 @@ _ISO_2022_GetUnicodeSet(const UConverter *cnv, } #endif - cnvData = (UConverterDataISO2022*)cnv->extraInfo; + cnvData = static_cast<UConverterDataISO2022*>(cnv->extraInfo); /* open a set and initialize it with code points that are algorithmically round-tripped */ switch(cnvData->locale[0]){ diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index 564b645bed7648..1e768ae22411de 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -231,7 +231,7 @@ static void ucnv_flushAvailableConverterCache() { gAvailableConverterCount = 0; if (gAvailableConverters) { - uprv_free((char **)gAvailableConverters); + uprv_free(const_cast<char**>(gAvailableConverters)); gAvailableConverters = nullptr; } gAvailableConvertersInitOnce.reset(); @@ -270,7 +270,7 @@ static UBool U_CALLCONV isCnvAcceptable(void * /*context*/, const char * /*type*/, const char * /*name*/, const UDataInfo *pInfo) { - return (UBool)( + return pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && @@ -279,7 +279,7 @@ isCnvAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x6e && pInfo->dataFormat[2]==0x76 && pInfo->dataFormat[3]==0x74 && - pInfo->formatVersion[0]==6); /* Everything will be version 6 */ + pInfo->formatVersion[0]==6; /* Everything will be version 6 */ } /** @@ -289,15 +289,15 @@ static UConverterSharedData* ucnv_data_unFlattenClone(UConverterLoadArgs *pArgs, UDataMemory *pData, UErrorCode *status) { /* UDataInfo info; -- necessary only if some converters have different formatVersion */ - const uint8_t *raw = (const uint8_t *)udata_getMemory(pData); - const UConverterStaticData *source = (const UConverterStaticData *) raw; + const uint8_t* raw = static_cast<const uint8_t*>(udata_getMemory(pData)); + const UConverterStaticData* source = reinterpret_cast<const UConverterStaticData*>(raw); UConverterSharedData *data; - UConverterType type = (UConverterType)source->conversionType; + UConverterType type = static_cast<UConverterType>(source->conversionType); if(U_FAILURE(*status)) return nullptr; - if( (uint16_t)type >= UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES || + if (static_cast<uint16_t>(type) >= UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES || converterData[type] == nullptr || !converterData[type]->isReferenceCounted || converterData[type]->referenceCounter != 1 || @@ -307,7 +307,7 @@ ucnv_data_unFlattenClone(UConverterLoadArgs *pArgs, UDataMemory *pData, UErrorCo return nullptr; } - data = (UConverterSharedData *)uprv_malloc(sizeof(UConverterSharedData)); + data = static_cast<UConverterSharedData*>(uprv_malloc(sizeof(UConverterSharedData))); if(data == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -397,7 +397,7 @@ getAlgorithmicTypeFromName(const char *realName) lastMid = UINT32_MAX; for (;;) { - mid = (uint32_t)((start + limit) / 2); + mid = (start + limit) / 2; if (lastMid == mid) { /* Have we moved? */ break; /* We haven't moved, and it wasn't found. */ } @@ -491,7 +491,7 @@ ucnv_getSharedConverterData(const char *name) { UConverterSharedData *rc; - rc = (UConverterSharedData*)uhash_get(SHARED_DATA_HASHTABLE, name); + rc = static_cast<UConverterSharedData*>(uhash_get(SHARED_DATA_HASHTABLE, name)); UCNV_DEBUG_LOG("get",name,rc); return rc; } @@ -682,8 +682,8 @@ parseConverterOptions(const char *inName, if(c==0) { pArgs->options=(pPieces->options&=~UCNV_OPTION_VERSION); return; - } else if((uint8_t)(c-'0')<10) { - pArgs->options=pPieces->options=(pPieces->options&~UCNV_OPTION_VERSION)|(uint32_t)(c-'0'); + } else if (static_cast<uint8_t>(c - '0') < 10) { + pArgs->options = pPieces->options = (pPieces->options & ~UCNV_OPTION_VERSION) | static_cast<uint32_t>(c - '0'); ++inName; } } else if(uprv_strncmp(inName, "swaplfnl", 8)==0) { @@ -909,7 +909,7 @@ ucnv_createAlgorithmicConverter(UConverter *myUConverter, stackArgs.options = options; stackArgs.locale=locale; cnv = ucnv_createConverterFromSharedData( - myUConverter, (UConverterSharedData *)sharedData, + myUConverter, const_cast<UConverterSharedData*>(sharedData), &stackArgs, err); UTRACE_EXIT_PTR_STATUS(cnv, *err); @@ -1112,7 +1112,7 @@ static void U_CALLCONV initAvailableConvertersList(UErrorCode &errCode) { } /* We can't have more than "*converterTable" converters to open */ - gAvailableConverters = (const char **) uprv_malloc(allConverterCount * sizeof(char*)); + gAvailableConverters = static_cast<const char**>(uprv_malloc(allConverterCount * sizeof(char*))); if (!gAvailableConverters) { errCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -1440,7 +1440,7 @@ ucnv_swap(const UDataSwapper *ds, MBCS_OPT_UNKNOWN_INCOMPATIBLE_MASK)==0 ) { mbcsHeaderLength=mbcsHeader.options&MBCS_OPT_LENGTH_MASK; - noFromU=(UBool)((mbcsHeader.options&MBCS_OPT_NO_FROM_U)!=0); + noFromU = (mbcsHeader.options & MBCS_OPT_NO_FROM_U) != 0; } else { udata_printError(ds, "ucnv_swap(): unsupported _MBCSHeader.version %d.%d\n", inMBCSHeader->version[0], inMBCSHeader->version[1]); diff --git a/deps/icu-small/source/common/ucnv_ct.cpp b/deps/icu-small/source/common/ucnv_ct.cpp index 46f30e5ece6d8c..aa0a6a1169b421 100644 --- a/deps/icu-small/source/common/ucnv_ct.cpp +++ b/deps/icu-small/source/common/ucnv_ct.cpp @@ -368,7 +368,7 @@ UConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UEr /*look ahead to find the trail surrogate*/ if(source < sourceLimit) { /* test the following code unit */ - char16_t trail=(char16_t) *source; + char16_t trail = *source; if(U16_IS_TRAIL(trail)) { source++; sourceChar=U16_GET_SUPPLEMENTARY(sourceChar, trail); diff --git a/deps/icu-small/source/common/ucnv_err.cpp b/deps/icu-small/source/common/ucnv_err.cpp index 761c442632f1ef..7d49a505095e45 100644 --- a/deps/icu-small/source/common/ucnv_err.cpp +++ b/deps/icu-small/source/common/ucnv_err.cpp @@ -109,7 +109,6 @@ UCNV_FROM_U_CALLBACK_STOP ( *err = U_ZERO_ERROR; } /* the caller must have set the error code accordingly */ - return; } @@ -125,7 +124,6 @@ UCNV_TO_U_CALLBACK_STOP ( { /* the caller must have set the error code accordingly */ (void)context; (void)toUArgs; (void)codePoints; (void)length; (void)reason; (void)err; - return; } U_CAPI void U_EXPORT2 @@ -353,8 +351,6 @@ UCNV_FROM_U_CALLBACK_ESCAPE ( *err = err2; return; } - - return; } diff --git a/deps/icu-small/source/common/ucnv_ext.cpp b/deps/icu-small/source/common/ucnv_ext.cpp index 10d00a62c2ce06..1f12d05b265e61 100644 --- a/deps/icu-small/source/common/ucnv_ext.cpp +++ b/deps/icu-small/source/common/ucnv_ext.cpp @@ -41,8 +41,8 @@ ucnv_extFindToU(const uint32_t *toUSection, int32_t length, uint8_t byte) { int32_t i, start, limit; /* check the input byte against the lowest and highest section bytes */ - start=(int32_t)UCNV_EXT_TO_U_GET_BYTE(toUSection[0]); - limit=(int32_t)UCNV_EXT_TO_U_GET_BYTE(toUSection[length-1]); + start = static_cast<int32_t>(UCNV_EXT_TO_U_GET_BYTE(toUSection[0])); + limit = static_cast<int32_t>(UCNV_EXT_TO_U_GET_BYTE(toUSection[length - 1])); if(byte<start || limit<byte) { return 0; /* the byte is out of range */ } @@ -180,9 +180,9 @@ ucnv_extMatchToU(const int32_t *cx, int8_t sisoState, /* match pre[] then src[] */ if(i<preLength) { - b=(uint8_t)pre[i++]; + b = static_cast<uint8_t>(pre[i++]); } else if(j<srcLength) { - b=(uint8_t)src[j++]; + b = static_cast<uint8_t>(src[j++]); } else { /* all input consumed, partial match */ if(flush || (length=(i+j))>UCNV_EXT_MAX_BYTES) { @@ -206,7 +206,7 @@ ucnv_extMatchToU(const int32_t *cx, int8_t sisoState, } else { if(UCNV_EXT_TO_U_IS_PARTIAL(value)) { /* partial match, continue */ - idx=(int32_t)UCNV_EXT_TO_U_GET_PARTIAL_INDEX(value); + idx = static_cast<int32_t>(UCNV_EXT_TO_U_GET_PARTIAL_INDEX(value)); } else { if( (UCNV_EXT_TO_U_IS_ROUNDTRIP(value) || TO_U_USE_FALLBACK(useFallback)) && @@ -572,7 +572,7 @@ ucnv_extMatchFromU(const int32_t *cx, if(UCNV_EXT_TO_U_IS_PARTIAL(value)) { /* partial match, enter the loop below */ - idx=(int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value); + idx = static_cast<int32_t>(UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value)); /* initialize */ fromUTableUChars=UCNV_EXT_ARRAY(cx, UCNV_EXT_FROM_U_UCHARS_INDEX, char16_t); @@ -627,7 +627,7 @@ ucnv_extMatchFromU(const int32_t *cx, value=fromUSectionValues[idx]; if(UCNV_EXT_FROM_U_IS_PARTIAL(value)) { /* partial match, continue */ - idx=(int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value); + idx = static_cast<int32_t>(UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value)); } else { if(extFromUUseMapping(useFallback, value, firstCP)) { /* full match, stop with result */ @@ -679,7 +679,7 @@ ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, int32_t length, prevLength; length=UCNV_EXT_FROM_U_GET_LENGTH(value); - value=(uint32_t)UCNV_EXT_FROM_U_GET_DATA(value); + value = UCNV_EXT_FROM_U_GET_DATA(value); /* output the result */ if(length<=UCNV_EXT_FROM_U_MAX_DIRECT_LENGTH) { @@ -692,13 +692,13 @@ ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, uint8_t *p=buffer+1; /* reserve buffer[0] for shiftByte below */ switch(length) { case 3: - *p++=(uint8_t)(value>>16); + *p++ = static_cast<uint8_t>(value >> 16); U_FALLTHROUGH; case 2: - *p++=(uint8_t)(value>>8); + *p++ = static_cast<uint8_t>(value >> 8); U_FALLTHROUGH; case 1: - *p++=(uint8_t)value; + *p++ = static_cast<uint8_t>(value); U_FALLTHROUGH; default: break; /* will never occur */ @@ -716,11 +716,11 @@ ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, if(prevLength>1 && length==1) { /* change from double-byte mode to single-byte */ - shiftByte=(uint8_t)UCNV_SI; + shiftByte = static_cast<uint8_t>(UCNV_SI); cnv->fromUnicodeStatus=1; } else if(prevLength==1 && length>1) { /* change from single-byte mode to double-byte */ - shiftByte=(uint8_t)UCNV_SO; + shiftByte = static_cast<uint8_t>(UCNV_SO); cnv->fromUnicodeStatus=2; } else { shiftByte=0; @@ -737,7 +737,7 @@ ucnv_extWriteFromU(UConverter *cnv, const int32_t *cx, } } - ucnv_fromUWriteBytes(cnv, (const char *)result, length, + ucnv_fromUWriteBytes(cnv, reinterpret_cast<const char*>(result), length, target, targetLimit, offsets, srcIndex, pErrorCode); @@ -830,7 +830,7 @@ ucnv_extSimpleMatchFromU(const int32_t *cx, isRoundtrip=UCNV_EXT_FROM_U_IS_ROUNDTRIP(value); length=UCNV_EXT_FROM_U_GET_LENGTH(value); - value=(uint32_t)UCNV_EXT_FROM_U_GET_DATA(value); + value = UCNV_EXT_FROM_U_GET_DATA(value); if(length<=UCNV_EXT_FROM_U_MAX_DIRECT_LENGTH) { *pValue=value; @@ -1018,7 +1018,7 @@ ucnv_extGetUnicodeSetString(const UConverterSharedData *sharedData, ucnv_extGetUnicodeSetString( sharedData, cx, sa, which, minLength, firstCP, s, length+1, - (int32_t)UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value), + static_cast<int32_t>(UCNV_EXT_FROM_U_GET_PARTIAL_INDEX(value)), pErrorCode); } else if(extSetUseMapping(which, minLength, value)) { sa->addString(sa->set, s, length+1); diff --git a/deps/icu-small/source/common/ucnv_io.cpp b/deps/icu-small/source/common/ucnv_io.cpp index 48bb5be42bd59f..46a26f821fd8a0 100644 --- a/deps/icu-small/source/common/ucnv_io.cpp +++ b/deps/icu-small/source/common/ucnv_io.cpp @@ -40,6 +40,7 @@ #include "uarrsort.h" #include "uassert.h" #include "udataswp.h" +#include "udatamem.h" #include "cstring.h" #include "cmemory.h" #include "ucnv_io.h" @@ -205,7 +206,7 @@ static UBool U_CALLCONV isAcceptable(void * /*context*/, const char * /*type*/, const char * /*name*/, const UDataInfo *pInfo) { - return (UBool)( + return pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && @@ -213,7 +214,7 @@ isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x76 && pInfo->dataFormat[2]==0x41 && pInfo->dataFormat[3]==0x6c && - pInfo->formatVersion[0]==3); + pInfo->formatVersion[0]==3; } static UBool U_CALLCONV ucnv_io_cleanup() @@ -235,23 +236,29 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { const uint32_t *sectionSizes; uint32_t tableStart; uint32_t currOffset; + int32_t sizeOfData; + int32_t sizeOfTOC; ucln_common_registerCleanup(UCLN_COMMON_UCNV_IO, ucnv_io_cleanup); U_ASSERT(gAliasData == nullptr); data = udata_openChoice(nullptr, DATA_TYPE, DATA_NAME, isAcceptable, nullptr, &errCode); - if(U_FAILURE(errCode)) { + if (U_FAILURE(errCode)) { return; } - sectionSizes = (const uint32_t *)udata_getMemory(data); - table = (const uint16_t *)sectionSizes; - - tableStart = sectionSizes[0]; - if (tableStart < minTocLength) { - errCode = U_INVALID_FORMAT_ERROR; - udata_close(data); - return; + sectionSizes = static_cast<const uint32_t*>(udata_getMemory(data)); + int32_t dataLength = udata_getLength(data); // This is the length minus the UDataInfo size + if (dataLength <= int32_t(sizeof(sectionSizes[0]))) { + // We don't even have a TOC! + goto invalidFormat; + } + table = reinterpret_cast<const uint16_t*>(sectionSizes); + tableStart = sectionSizes[0]; + sizeOfTOC = int32_t((tableStart + 1) * sizeof(sectionSizes[0])); + if (tableStart < minTocLength || dataLength <= sizeOfTOC) { + // We don't have a whole TOC! + goto invalidFormat; } gAliasData = data; @@ -264,11 +271,21 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { gMainTable.optionTableSize = sectionSizes[7]; gMainTable.stringTableSize = sectionSizes[8]; - if (tableStart > 8) { + if (tableStart > minTocLength) { gMainTable.normalizedStringTableSize = sectionSizes[9]; } - currOffset = tableStart * (sizeof(uint32_t)/sizeof(uint16_t)) + (sizeof(uint32_t)/sizeof(uint16_t)); + sizeOfData = sizeOfTOC; + for (uint32_t section = 1; section <= tableStart; section++) { + sizeOfData += sectionSizes[section] * sizeof(table[0]); + } + if (dataLength < sizeOfData) { + // Truncated file! + goto invalidFormat; + } + // There may be some extra padding at the end, or this is a new file format with extra data that we can't read yet. + + currOffset = (tableStart + 1) * (sizeof(uint32_t)/sizeof(uint16_t)); gMainTable.converterList = table + currOffset; currOffset += gMainTable.converterListSize; @@ -289,10 +306,10 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { currOffset += gMainTable.taggedAliasListsSize; if (gMainTable.optionTableSize > 0 - && ((const UConverterAliasOptions *)(table + currOffset))->stringNormalizationType < UCNV_IO_NORM_TYPE_COUNT) + && reinterpret_cast<const UConverterAliasOptions*>(table + currOffset)->stringNormalizationType < UCNV_IO_NORM_TYPE_COUNT) { /* Faster table */ - gMainTable.optionTable = (const UConverterAliasOptions *)(table + currOffset); + gMainTable.optionTable = reinterpret_cast<const UConverterAliasOptions*>(table + currOffset); } else { /* Smaller table, or I can't handle this normalization mode! @@ -306,6 +323,12 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { currOffset += gMainTable.stringTableSize; gMainTable.normalizedStringTable = ((gMainTable.optionTable->stringNormalizationType == UCNV_IO_UNNORMALIZED) ? gMainTable.stringTable : (table + currOffset)); + + return; + +invalidFormat: + errCode = U_INVALID_FORMAT_ERROR; + udata_close(data); } @@ -321,7 +344,7 @@ isAlias(const char *alias, UErrorCode *pErrorCode) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return false; } - return (UBool)(*alias!=0); + return *alias != 0; } static uint32_t getTagNumber(const char *tagname) { @@ -574,7 +597,7 @@ findConverter(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) lastMid = UINT32_MAX; for (;;) { - mid = (uint32_t)((start + limit) / 2); + mid = (start + limit) / 2; if (lastMid == mid) { /* Have we moved? */ break; /* We haven't moved, and it wasn't found. */ } @@ -601,8 +624,8 @@ findConverter(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) /* State whether the canonical converter name contains an option. This information is contained in this list in order to maintain backward & forward compatibility. */ if (containsOption) { - UBool containsCnvOptionInfo = (UBool)gMainTable.optionTable->containsCnvOptionInfo; - *containsOption = (UBool)((containsCnvOptionInfo + UBool containsCnvOptionInfo = static_cast<UBool>(gMainTable.optionTable->containsCnvOptionInfo); + *containsOption = static_cast<UBool>((containsCnvOptionInfo && ((gMainTable.untaggedConvArray[mid] & UCNV_CONTAINS_OPTION_BIT) != 0)) || !containsCnvOptionInfo); } @@ -939,7 +962,7 @@ static uint16_t ucnv_io_countStandards(UErrorCode *pErrorCode) { if (haveAliasData(pErrorCode)) { /* Don't include the empty list */ - return (uint16_t)(gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS); + return static_cast<uint16_t>(gMainTable.tagListSize - UCNV_NUM_HIDDEN_TAGS); } return 0; @@ -1130,8 +1153,9 @@ io_compareRows(const void *context, const void *left, const void *right) { TempAliasTable *tempTable=(TempAliasTable *)context; const char *chars=tempTable->chars; - return (int32_t)uprv_strcmp(tempTable->stripForCompare(strippedLeft, chars+2*((const TempRow *)left)->strIndex), - tempTable->stripForCompare(strippedRight, chars+2*((const TempRow *)right)->strIndex)); + return static_cast<int32_t>(uprv_strcmp( + tempTable->stripForCompare(strippedLeft, chars + 2 * static_cast<const TempRow*>(left)->strIndex), + tempTable->stripForCompare(strippedRight, chars + 2 * static_cast<const TempRow*>(right)->strIndex))); } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/common/ucnv_lmb.cpp b/deps/icu-small/source/common/ucnv_lmb.cpp index ab14a119efb8e8..bbcf2d579aad85 100644 --- a/deps/icu-small/source/common/ucnv_lmb.cpp +++ b/deps/icu-small/source/common/ucnv_lmb.cpp @@ -633,7 +633,7 @@ _LMBCSOpenWorker(UConverter* _this, UErrorCode* err, ulmbcs_byte_t OptGroup) { - UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); + UConverterDataLMBCS* extraInfo = static_cast<UConverterDataLMBCS*>(uprv_malloc(sizeof(UConverterDataLMBCS))); _this->extraInfo = extraInfo; if(extraInfo != nullptr) { diff --git a/deps/icu-small/source/common/ucnv_u16.cpp b/deps/icu-small/source/common/ucnv_u16.cpp index c3bcfef50cb5c3..a5963e1202cb2f 100644 --- a/deps/icu-small/source/common/ucnv_u16.cpp +++ b/deps/icu-small/source/common/ucnv_u16.cpp @@ -236,10 +236,10 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* output length bytes with overflow (length>targetCapacity>0) */ ucnv_fromUWriteBytes(cnv, overflow, length, - (char **)&target, pArgs->targetLimit, + &target, pArgs->targetLimit, &offsets, sourceIndex, pErrorCode); - targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); + targetCapacity = static_cast<uint32_t>(pArgs->targetLimit - target); } if(U_SUCCESS(*pErrorCode) && source<pArgs->sourceLimit && targetCapacity==0) { @@ -248,7 +248,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = target; pArgs->offsets=offsets; } @@ -840,7 +840,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, &target, pArgs->targetLimit, &offsets, sourceIndex, pErrorCode); - targetCapacity=(uint32_t)(pArgs->targetLimit-(char *)target); + targetCapacity = static_cast<uint32_t>(pArgs->targetLimit - target); } if(U_SUCCESS(*pErrorCode) && source<pArgs->sourceLimit && targetCapacity==0) { diff --git a/deps/icu-small/source/common/ucnv_u7.cpp b/deps/icu-small/source/common/ucnv_u7.cpp index 398b528e832d28..bbdaf98dff76fa 100644 --- a/deps/icu-small/source/common/ucnv_u7.cpp +++ b/deps/icu-small/source/common/ucnv_u7.cpp @@ -455,7 +455,6 @@ _UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } static void U_CALLCONV @@ -731,7 +730,6 @@ _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->source=source; pArgs->target=(char *)target; pArgs->offsets=offsets; - return; } static const char * U_CALLCONV @@ -1156,7 +1154,6 @@ _IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } static void U_CALLCONV @@ -1443,7 +1440,6 @@ _IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->source=source; pArgs->target=(char *)target; pArgs->offsets=offsets; - return; } U_CDECL_END diff --git a/deps/icu-small/source/common/ucnv_u8.cpp b/deps/icu-small/source/common/ucnv_u8.cpp index cf3bb22a02a7f7..cca6e603ae3232 100644 --- a/deps/icu-small/source/common/ucnv_u8.cpp +++ b/deps/icu-small/source/common/ucnv_u8.cpp @@ -49,8 +49,8 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args #define MAXIMUM_UCS2 0x0000FFFF static const uint32_t offsetsFromUTF8[5] = {0, - (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, - (uint32_t) 0x03C82080 + static_cast<uint32_t>(0x00000000), static_cast<uint32_t>(0x00003080), + static_cast<uint32_t>(0x000E2080), static_cast<uint32_t>(0x03C82080) }; static UBool hasCESU8Data(const UConverter *cnv) @@ -58,7 +58,7 @@ static UBool hasCESU8Data(const UConverter *cnv) #if UCONFIG_ONLY_HTML_CONVERSION return false; #else - return (UBool)(cnv->sharedData == &_CESU8Data); + return cnv->sharedData == &_CESU8Data; #endif } U_CDECL_BEGIN @@ -571,7 +571,7 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, return 0xffff; } - myByte = (uint8_t)*(source++); + myByte = *(source++); if (U8_IS_SINGLE(myByte)) { args->source = (const char *)source; diff --git a/deps/icu-small/source/common/ucnvbocu.cpp b/deps/icu-small/source/common/ucnvbocu.cpp index 007722e474b42e..5c9bb3ac456aef 100644 --- a/deps/icu-small/source/common/ucnvbocu.cpp +++ b/deps/icu-small/source/common/ucnvbocu.cpp @@ -338,7 +338,7 @@ packDiff(int32_t diff) { */ result|=BOCU1_TRAIL_TO_BYTE(diff)<<16; - result|=((uint32_t)BOCU1_START_POS_4)<<24; + result |= static_cast<uint32_t>(BOCU1_START_POS_4) << 24; } } else { /* two- to four-byte negative differences */ @@ -405,13 +405,13 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, cnv=pArgs->converter; source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + target = reinterpret_cast<uint8_t*>(pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); offsets=pArgs->offsets; /* get the converter state from UConverter */ c=cnv->fromUChar32; - prev=(int32_t)cnv->fromUnicodeStatus; + prev = static_cast<int32_t>(cnv->fromUnicodeStatus); if(prev==0) { prev=BOCU1_ASCII_PREV; } @@ -428,7 +428,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, fastSingle: /* fast loop for single-byte differences */ /* use only one loop counter variable, targetCapacity, not also source */ - diff=(int32_t)(sourceLimit-source); + diff = static_cast<int32_t>(sourceLimit - source); if(targetCapacity>diff) { targetCapacity=diff; } @@ -437,7 +437,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); *offsets++=nextSourceIndex++; ++source; --targetCapacity; @@ -445,7 +445,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, diff=c-prev; if(DIFF_IS_SINGLE(diff)) { prev=BOCU1_SIMPLE_PREV(c); - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); + *target++ = static_cast<uint8_t>(PACK_SINGLE_DIFF(diff)); *offsets++=nextSourceIndex++; ++source; --targetCapacity; @@ -455,7 +455,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, } } /* restore real values */ - targetCapacity=(int32_t)((const uint8_t *)pArgs->targetLimit-target); + targetCapacity = static_cast<int32_t>(reinterpret_cast<const uint8_t*>(pArgs->targetLimit) - target); sourceIndex=nextSourceIndex; /* wrong if offsets==nullptr but does not matter */ /* regular loop for all cases */ @@ -473,7 +473,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); *offsets++=sourceIndex; --targetCapacity; @@ -510,7 +510,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, diff=c-prev; prev=BOCU1_PREV(c); if(DIFF_IS_SINGLE(diff)) { - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); + *target++ = static_cast<uint8_t>(PACK_SINGLE_DIFF(diff)); *offsets++=sourceIndex; --targetCapacity; sourceIndex=nextSourceIndex; @@ -531,8 +531,8 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, NEGDIVMOD(diff, BOCU1_TRAIL_COUNT, m); diff+=BOCU1_START_NEG_2; } - *target++=(uint8_t)diff; - *target++=(uint8_t)BOCU1_TRAIL_TO_BYTE(m); + *target++ = static_cast<uint8_t>(diff); + *target++ = static_cast<uint8_t>(BOCU1_TRAIL_TO_BYTE(m)); *offsets++=sourceIndex; *offsets++=sourceIndex; targetCapacity-=2; @@ -549,18 +549,18 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, switch(length) { /* each branch falls through to the next one */ case 4: - *target++=(uint8_t)(diff>>24); + *target++ = static_cast<uint8_t>(diff >> 24); *offsets++=sourceIndex; U_FALLTHROUGH; case 3: - *target++=(uint8_t)(diff>>16); + *target++ = static_cast<uint8_t>(diff >> 16); *offsets++=sourceIndex; U_FALLTHROUGH; case 2: - *target++=(uint8_t)(diff>>8); + *target++ = static_cast<uint8_t>(diff >> 8); *offsets++=sourceIndex; /* case 1: handled above */ - *target++=(uint8_t)diff; + *target++ = static_cast<uint8_t>(diff); *offsets++=sourceIndex; U_FALLTHROUGH; default: @@ -584,34 +584,34 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, switch(length) { /* each branch falls through to the next one */ case 3: - *charErrorBuffer++=(uint8_t)(diff>>16); + *charErrorBuffer++ = static_cast<uint8_t>(diff >> 16); U_FALLTHROUGH; case 2: - *charErrorBuffer++=(uint8_t)(diff>>8); + *charErrorBuffer++ = static_cast<uint8_t>(diff >> 8); U_FALLTHROUGH; case 1: - *charErrorBuffer=(uint8_t)diff; + *charErrorBuffer = static_cast<uint8_t>(diff); U_FALLTHROUGH; default: /* will never occur */ break; } - cnv->charErrorBufferLength=(int8_t)length; + cnv->charErrorBufferLength = static_cast<int8_t>(length); /* now output what fits into the regular target */ diff>>=8*length; /* length was reduced by targetCapacity */ switch(targetCapacity) { /* each branch falls through to the next one */ case 3: - *target++=(uint8_t)(diff>>16); + *target++ = static_cast<uint8_t>(diff >> 16); *offsets++=sourceIndex; U_FALLTHROUGH; case 2: - *target++=(uint8_t)(diff>>8); + *target++ = static_cast<uint8_t>(diff >> 8); *offsets++=sourceIndex; U_FALLTHROUGH; case 1: - *target++=(uint8_t)diff; + *target++ = static_cast<uint8_t>(diff); *offsets++=sourceIndex; U_FALLTHROUGH; default: @@ -634,11 +634,11 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* set the converter state back into UConverter */ cnv->fromUChar32= c<0 ? -c : 0; - cnv->fromUnicodeStatus=(uint32_t)prev; + cnv->fromUnicodeStatus = static_cast<uint32_t>(prev); /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = reinterpret_cast<char*>(target); pArgs->offsets=offsets; } @@ -663,12 +663,12 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, cnv=pArgs->converter; source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + target = reinterpret_cast<uint8_t*>(pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); /* get the converter state from UConverter */ c=cnv->fromUChar32; - prev=(int32_t)cnv->fromUnicodeStatus; + prev = static_cast<int32_t>(cnv->fromUnicodeStatus); if(prev==0) { prev=BOCU1_ASCII_PREV; } @@ -681,7 +681,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, fastSingle: /* fast loop for single-byte differences */ /* use only one loop counter variable, targetCapacity, not also source */ - diff=(int32_t)(sourceLimit-source); + diff = static_cast<int32_t>(sourceLimit - source); if(targetCapacity>diff) { targetCapacity=diff; } @@ -690,12 +690,12 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); } else { diff=c-prev; if(DIFF_IS_SINGLE(diff)) { prev=BOCU1_SIMPLE_PREV(c); - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); + *target++ = static_cast<uint8_t>(PACK_SINGLE_DIFF(diff)); } else { break; } @@ -704,7 +704,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, --targetCapacity; } /* restore real values */ - targetCapacity=(int32_t)((const uint8_t *)pArgs->targetLimit-target); + targetCapacity = static_cast<int32_t>(reinterpret_cast<const uint8_t*>(pArgs->targetLimit) - target); /* regular loop for all cases */ while(source<sourceLimit) { @@ -720,7 +720,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); --targetCapacity; continue; } @@ -753,7 +753,7 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, diff=c-prev; prev=BOCU1_PREV(c); if(DIFF_IS_SINGLE(diff)) { - *target++=(uint8_t)PACK_SINGLE_DIFF(diff); + *target++ = static_cast<uint8_t>(PACK_SINGLE_DIFF(diff)); --targetCapacity; if(c<0x3000) { goto fastSingle; @@ -772,8 +772,8 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, NEGDIVMOD(diff, BOCU1_TRAIL_COUNT, m); diff+=BOCU1_START_NEG_2; } - *target++=(uint8_t)diff; - *target++=(uint8_t)BOCU1_TRAIL_TO_BYTE(m); + *target++ = static_cast<uint8_t>(diff); + *target++ = static_cast<uint8_t>(BOCU1_TRAIL_TO_BYTE(m)); targetCapacity-=2; } else { int32_t length; /* will be 2..4 */ @@ -787,14 +787,14 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, switch(length) { /* each branch falls through to the next one */ case 4: - *target++=(uint8_t)(diff>>24); + *target++ = static_cast<uint8_t>(diff >> 24); U_FALLTHROUGH; case 3: - *target++=(uint8_t)(diff>>16); + *target++ = static_cast<uint8_t>(diff >> 16); /* case 2: handled above */ - *target++=(uint8_t)(diff>>8); + *target++ = static_cast<uint8_t>(diff >> 8); /* case 1: handled above */ - *target++=(uint8_t)diff; + *target++ = static_cast<uint8_t>(diff); U_FALLTHROUGH; default: /* will never occur */ @@ -816,32 +816,32 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, switch(length) { /* each branch falls through to the next one */ case 3: - *charErrorBuffer++=(uint8_t)(diff>>16); + *charErrorBuffer++ = static_cast<uint8_t>(diff >> 16); U_FALLTHROUGH; case 2: - *charErrorBuffer++=(uint8_t)(diff>>8); + *charErrorBuffer++ = static_cast<uint8_t>(diff >> 8); U_FALLTHROUGH; case 1: - *charErrorBuffer=(uint8_t)diff; + *charErrorBuffer = static_cast<uint8_t>(diff); U_FALLTHROUGH; default: /* will never occur */ break; } - cnv->charErrorBufferLength=(int8_t)length; + cnv->charErrorBufferLength = static_cast<int8_t>(length); /* now output what fits into the regular target */ diff>>=8*length; /* length was reduced by targetCapacity */ switch(targetCapacity) { /* each branch falls through to the next one */ case 3: - *target++=(uint8_t)(diff>>16); + *target++ = static_cast<uint8_t>(diff >> 16); U_FALLTHROUGH; case 2: - *target++=(uint8_t)(diff>>8); + *target++ = static_cast<uint8_t>(diff >> 8); U_FALLTHROUGH; case 1: - *target++=(uint8_t)diff; + *target++ = static_cast<uint8_t>(diff); U_FALLTHROUGH; default: /* will never occur */ @@ -863,11 +863,11 @@ _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, /* set the converter state back into UConverter */ cnv->fromUChar32= c<0 ? -c : 0; - cnv->fromUnicodeStatus=(uint32_t)prev; + cnv->fromUnicodeStatus = static_cast<uint32_t>(prev); /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = reinterpret_cast<char*>(target); } /* BOCU-1-to-Unicode conversion functions ----------------------------------- */ @@ -887,11 +887,11 @@ decodeBocu1LeadByte(int32_t b) { /* positive difference */ if(b<BOCU1_START_POS_3) { /* two bytes */ - diff=((int32_t)b-BOCU1_START_POS_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_POS_1+1; + diff = (b - BOCU1_START_POS_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_POS_1 + 1; count=1; } else if(b<BOCU1_START_POS_4) { /* three bytes */ - diff=((int32_t)b-BOCU1_START_POS_3)*BOCU1_TRAIL_COUNT*BOCU1_TRAIL_COUNT+BOCU1_REACH_POS_2+1; + diff = (b - BOCU1_START_POS_3) * BOCU1_TRAIL_COUNT * BOCU1_TRAIL_COUNT + BOCU1_REACH_POS_2 + 1; count=2; } else { /* four bytes */ @@ -902,11 +902,11 @@ decodeBocu1LeadByte(int32_t b) { /* negative difference */ if(b>=BOCU1_START_NEG_3) { /* two bytes */ - diff=((int32_t)b-BOCU1_START_NEG_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_NEG_1; + diff = (b - BOCU1_START_NEG_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_NEG_1; count=1; } else if(b>BOCU1_MIN) { /* three bytes */ - diff=((int32_t)b-BOCU1_START_NEG_3)*BOCU1_TRAIL_COUNT*BOCU1_TRAIL_COUNT+BOCU1_REACH_NEG_2; + diff = (b - BOCU1_START_NEG_3) * BOCU1_TRAIL_COUNT * BOCU1_TRAIL_COUNT + BOCU1_REACH_NEG_2; count=2; } else { /* four bytes */ @@ -916,7 +916,7 @@ decodeBocu1LeadByte(int32_t b) { } /* return the state for decoding the trail byte(s) */ - return ((uint32_t)diff<<2)|count; + return (static_cast<uint32_t>(diff) << 2) | count; } /** @@ -970,14 +970,14 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* set up the local pointers */ cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); target=pArgs->target; targetLimit=pArgs->targetLimit; offsets=pArgs->offsets; /* get the converter state from UConverter */ - prev=(int32_t)cnv->toUnicodeStatus; + prev = static_cast<int32_t>(cnv->toUnicodeStatus); if(prev==0) { prev=BOCU1_ASCII_PREV; } @@ -1000,8 +1000,8 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, fastSingle: /* fast loop for single-byte differences */ /* use count as the only loop counter variable */ - diff=(int32_t)(sourceLimit-source); - count=(int32_t)(pArgs->targetLimit-target); + diff = static_cast<int32_t>(sourceLimit - source); + count = static_cast<int32_t>(pArgs->targetLimit - target); if(count>diff) { count=diff; } @@ -1009,7 +1009,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, if(BOCU1_START_NEG_2<=(c=*source) && c<BOCU1_START_POS_2) { c=prev+(c-BOCU1_MIDDLE); if(c<0x3000) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); *offsets++=nextSourceIndex++; prev=BOCU1_SIMPLE_PREV(c); } else { @@ -1019,7 +1019,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); *offsets++=nextSourceIndex++; } else { break; @@ -1043,7 +1043,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* Write a code point directly from a single-byte difference. */ c=prev+(c-BOCU1_MIDDLE); if(c<0x3000) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); *offsets++=sourceIndex; prev=BOCU1_SIMPLE_PREV(c); sourceIndex=nextSourceIndex; @@ -1057,22 +1057,22 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); *offsets++=sourceIndex; sourceIndex=nextSourceIndex; continue; } else if(BOCU1_START_NEG_3<=c && c<BOCU1_START_POS_3 && source<sourceLimit) { /* Optimize two-byte case. */ if(c>=BOCU1_MIDDLE) { - diff=((int32_t)c-BOCU1_START_POS_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_POS_1+1; + diff = (c - BOCU1_START_POS_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_POS_1 + 1; } else { - diff=((int32_t)c-BOCU1_START_NEG_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_NEG_1; + diff = (c - BOCU1_START_NEG_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_NEG_1; } /* trail byte */ ++nextSourceIndex; c=decodeBocu1TrailByte(1, *source++); - if(c<0 || (uint32_t)(c=prev+diff+c)>0x10ffff) { + if (c < 0 || static_cast<uint32_t>(c = prev + diff + c) > 0x10ffff) { bytes[0]=source[-2]; bytes[1]=source[-1]; byteIndex=2; @@ -1090,7 +1090,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * with the partial difference value from the lead byte and * with the number of trail bytes. */ - bytes[0]=(uint8_t)c; + bytes[0] = static_cast<uint8_t>(c); byteIndex=1; diff=decodeBocu1LeadByte(c); @@ -1116,7 +1116,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* final trail byte, deliver a code point */ byteIndex=0; c=prev+diff; - if((uint32_t)c>0x10ffff) { + if (static_cast<uint32_t>(c) > 0x10ffff) { *pErrorCode=U_ILLEGAL_CHAR_FOUND; goto endloop; } @@ -1128,7 +1128,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* calculate the next prev and output c */ prev=BOCU1_PREV(c); if(c<=0xffff) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); *offsets++=sourceIndex; } else { /* output surrogate pair */ @@ -1156,16 +1156,15 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, cnv->mode=0; } else { /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=(uint32_t)prev; - cnv->mode=(int32_t)((uint32_t)diff<<2)|count; + cnv->toUnicodeStatus = static_cast<uint32_t>(prev); + cnv->mode = static_cast<int32_t>(static_cast<uint32_t>(diff) << 2) | count; } cnv->toULength=byteIndex; /* write back the updated pointers */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); pArgs->target=target; pArgs->offsets=offsets; - return; } /* @@ -1190,13 +1189,13 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, /* set up the local pointers */ cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); target=pArgs->target; targetLimit=pArgs->targetLimit; /* get the converter state from UConverter */ - prev=(int32_t)cnv->toUnicodeStatus; + prev = static_cast<int32_t>(cnv->toUnicodeStatus); if(prev==0) { prev=BOCU1_ASCII_PREV; } @@ -1215,8 +1214,8 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, fastSingle: /* fast loop for single-byte differences */ /* use count as the only loop counter variable */ - diff=(int32_t)(sourceLimit-source); - count=(int32_t)(pArgs->targetLimit-target); + diff = static_cast<int32_t>(sourceLimit - source); + count = static_cast<int32_t>(pArgs->targetLimit - target); if(count>diff) { count=diff; } @@ -1224,7 +1223,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, if(BOCU1_START_NEG_2<=(c=*source) && c<BOCU1_START_POS_2) { c=prev+(c-BOCU1_MIDDLE); if(c<0x3000) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); prev=BOCU1_SIMPLE_PREV(c); } else { break; @@ -1233,7 +1232,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); } else { break; } @@ -1254,7 +1253,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, /* Write a code point directly from a single-byte difference. */ c=prev+(c-BOCU1_MIDDLE); if(c<0x3000) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); prev=BOCU1_SIMPLE_PREV(c); goto fastSingle; } @@ -1266,19 +1265,19 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, if(c!=0x20) { prev=BOCU1_ASCII_PREV; } - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); continue; } else if(BOCU1_START_NEG_3<=c && c<BOCU1_START_POS_3 && source<sourceLimit) { /* Optimize two-byte case. */ if(c>=BOCU1_MIDDLE) { - diff=((int32_t)c-BOCU1_START_POS_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_POS_1+1; + diff = (c - BOCU1_START_POS_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_POS_1 + 1; } else { - diff=((int32_t)c-BOCU1_START_NEG_2)*BOCU1_TRAIL_COUNT+BOCU1_REACH_NEG_1; + diff = (c - BOCU1_START_NEG_2) * BOCU1_TRAIL_COUNT + BOCU1_REACH_NEG_1; } /* trail byte */ c=decodeBocu1TrailByte(1, *source++); - if(c<0 || (uint32_t)(c=prev+diff+c)>0x10ffff) { + if (c < 0 || static_cast<uint32_t>(c = prev + diff + c) > 0x10ffff) { bytes[0]=source[-2]; bytes[1]=source[-1]; byteIndex=2; @@ -1295,7 +1294,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, * with the partial difference value from the lead byte and * with the number of trail bytes. */ - bytes[0]=(uint8_t)c; + bytes[0] = static_cast<uint8_t>(c); byteIndex=1; diff=decodeBocu1LeadByte(c); @@ -1320,7 +1319,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, /* final trail byte, deliver a code point */ byteIndex=0; c=prev+diff; - if((uint32_t)c>0x10ffff) { + if (static_cast<uint32_t>(c) > 0x10ffff) { *pErrorCode=U_ILLEGAL_CHAR_FOUND; goto endloop; } @@ -1332,7 +1331,7 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, /* calculate the next prev and output c */ prev=BOCU1_PREV(c); if(c<=0xffff) { - *target++=(char16_t)c; + *target++ = static_cast<char16_t>(c); } else { /* output surrogate pair */ *target++=U16_LEAD(c); @@ -1355,15 +1354,14 @@ _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, cnv->mode=0; } else { /* set the converter state back into UConverter */ - cnv->toUnicodeStatus=(uint32_t)prev; - cnv->mode=((uint32_t)diff<<2)|count; + cnv->toUnicodeStatus = static_cast<uint32_t>(prev); + cnv->mode = (static_cast<uint32_t>(diff) << 2) | count; } cnv->toULength=byteIndex; /* write back the updated pointers */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); pArgs->target=target; - return; } /* miscellaneous ------------------------------------------------------------ */ diff --git a/deps/icu-small/source/common/ucnvhz.cpp b/deps/icu-small/source/common/ucnvhz.cpp index fa0f2b40ea7178..aea5da65c1f430 100644 --- a/deps/icu-small/source/common/ucnvhz.cpp +++ b/deps/icu-small/source/common/ucnvhz.cpp @@ -345,7 +345,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, uint32_t targetUniChar = 0x0000; UChar32 mySourceChar = 0x0000; UConverterDataHZ *myConverterData=(UConverterDataHZ*)args->converter->extraInfo; - UBool isTargetUCharDBCS = (UBool) myConverterData->isTargetUCharDBCS; + UBool isTargetUCharDBCS = myConverterData->isTargetUCharDBCS; UBool oldIsTargetUCharDBCS; int len =0; const char* escSeq=nullptr; @@ -363,7 +363,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, targetUniChar = missingCharMarker; if (myTargetIndex < targetLength){ - mySourceChar = (char16_t) mySource[mySourceIndex++]; + mySourceChar = mySource[mySourceIndex++]; oldIsTargetUCharDBCS = isTargetUCharDBCS; @@ -389,7 +389,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, } } if (targetUniChar != missingCharMarker){ - myConverterData->isTargetUCharDBCS = isTargetUCharDBCS = (UBool)(targetUniChar>0x00FF); + myConverterData->isTargetUCharDBCS = isTargetUCharDBCS = targetUniChar > 0x00FF; if(oldIsTargetUCharDBCS != isTargetUCharDBCS || !myConverterData->isEscapeAppended ){ /*Shifting from a double byte to single byte mode*/ if(!isTargetUCharDBCS){ diff --git a/deps/icu-small/source/common/ucnvisci.cpp b/deps/icu-small/source/common/ucnvisci.cpp index 507a50c89254b0..c5f5832dcfcc3e 100644 --- a/deps/icu-small/source/common/ucnvisci.cpp +++ b/deps/icu-small/source/common/ucnvisci.cpp @@ -174,7 +174,7 @@ isPNJConsonant(UChar32 c) { if (c < 0xa00 || 0xa50 <= c) { return false; } else { - return (UBool)(pnjMap[c - 0xa00] & 1); + return pnjMap[c - 0xa00] & 1; } } @@ -183,7 +183,7 @@ isPNJBindiTippi(UChar32 c) { if (c < 0xa00 || 0xa50 <= c) { return false; } else { - return (UBool)(pnjMap[c - 0xa00] >> 1); + return pnjMap[c - 0xa00] >> 1; } } U_CDECL_BEGIN @@ -1484,7 +1484,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCo */ *err = U_INVALID_CHAR_FOUND; CALLBACK: - args->converter->toUBytes[0] = (uint8_t) sourceChar; + args->converter->toUBytes[0] = sourceChar; args->converter->toULength = 1; break; } @@ -1537,12 +1537,12 @@ _ISCII_SafeClone(const UConverter *cnv, int32_t bufferSizeNeeded = sizeof(struct cloneISCIIStruct); if (U_FAILURE(*status)) { - return 0; + return nullptr; } if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */ *pBufferSize = bufferSizeNeeded; - return 0; + return nullptr; } localClone = (struct cloneISCIIStruct *)stackBuffer; diff --git a/deps/icu-small/source/common/ucnvlat1.cpp b/deps/icu-small/source/common/ucnvlat1.cpp index 09206885269d5f..09473ef16cb9e4 100644 --- a/deps/icu-small/source/common/ucnvlat1.cpp +++ b/deps/icu-small/source/common/ucnvlat1.cpp @@ -381,7 +381,7 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, b=*source++; if(U8_IS_SINGLE(b)) { /* convert ASCII */ - *target++=(uint8_t)b; + *target++ = b; --targetCapacity; } else if( /* handle U+0080..U+00FF inline */ b>=0xc2 && b<=0xc3 && diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index d760603980026a..d65c284746163b 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -665,7 +665,7 @@ enumToU(UConverterMBCSTable *mbcsTable, int8_t stateProps[], if(!enumToU( mbcsTable, stateProps, nextState, offset+MBCS_ENTRY_TRANSITION_OFFSET(entry), - value|(uint32_t)b, + value | static_cast<uint32_t>(b), callback, context, pErrorCode)) { return false; @@ -683,7 +683,7 @@ enumToU(UConverterMBCSTable *mbcsTable, int8_t stateProps[], action=MBCS_ENTRY_FINAL_ACTION(entry); if(action==MBCS_STATE_VALID_DIRECT_16) { /* output BMP code point */ - c=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + c = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); } else if(action==MBCS_STATE_VALID_16) { int32_t finalOffset=offset+MBCS_ENTRY_FINAL_VALUE_16(entry); c=unicodeCodeUnits[finalOffset]; @@ -708,7 +708,7 @@ enumToU(UConverterMBCSTable *mbcsTable, int8_t stateProps[], } } else if(action==MBCS_STATE_VALID_DIRECT_20) { /* output supplementary code point */ - c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); + c = static_cast<UChar32>(MBCS_ENTRY_FINAL_VALUE(entry) + 0x10000); } else { c=U_SENTINEL; } @@ -718,7 +718,7 @@ enumToU(UConverterMBCSTable *mbcsTable, int8_t stateProps[], } if(((++b)&0x1f)==0) { if(anyCodePoints>=0) { - if(!callback(context, value|(uint32_t)(b-0x20), codePoints)) { + if (!callback(context, value | static_cast<uint32_t>(b - 0x20), codePoints)) { return false; } anyCodePoints=-1; @@ -760,7 +760,7 @@ getStateProp(const int32_t (*stateTable)[256], int8_t stateProps[], int state) { return stateProps[state]; } } - stateProps[state]|=(int8_t)((min>>5)<<3); + stateProps[state] |= static_cast<int8_t>((min >> 5) << 3); /* find last non-ignorable state */ for(max=0xff; min<max; --max) { @@ -777,7 +777,7 @@ getStateProp(const int32_t (*stateTable)[256], int8_t stateProps[], int state) { break; } } - stateProps[state]|=(int8_t)(max>>5); + stateProps[state] |= static_cast<int8_t>(max >> 5); /* recurse further and collect direct-state information */ while(min<=max) { @@ -924,7 +924,7 @@ ucnv_MBCSGetFilteredUnicodeSetForUnicode(const UConverterSharedData *sharedData, bytes=mbcsTable->fromUnicodeBytes; - useFallback=(UBool)(which==UCNV_ROUNDTRIP_AND_FALLBACK_SET); + useFallback = which == UCNV_ROUNDTRIP_AND_FALLBACK_SET; switch(mbcsTable->outputType) { case MBCS_OUTPUT_3: @@ -1117,7 +1117,7 @@ _extFromU(UConverter *cnv, const UConverterSharedData *sharedData, ucnv_extInitialMatchFromU( cnv, cx, cp, source, sourceLimit, - (char **)target, (char *)targetLimit, + reinterpret_cast<char**>(target), reinterpret_cast<const char*>(targetLimit), offsets, sourceIndex, flush, pErrorCode) @@ -1132,7 +1132,7 @@ _extFromU(UConverter *cnv, const UConverterSharedData *sharedData, range=gb18030Ranges[0]; for(i=0; i<UPRV_LENGTHOF(gb18030Ranges); range+=4, ++i) { - if(range[0]<=(uint32_t)cp && (uint32_t)cp<=range[1]) { + if (range[0] <= static_cast<uint32_t>(cp) && static_cast<uint32_t>(cp) <= range[1]) { /* found the Unicode code point, output the four-byte sequence for it */ uint32_t linear; char bytes[4]; @@ -1141,17 +1141,17 @@ _extFromU(UConverter *cnv, const UConverterSharedData *sharedData, linear=range[2]-LINEAR_18030_BASE; /* add the offset from the beginning of the range */ - linear+=((uint32_t)cp-range[0]); + linear += (static_cast<uint32_t>(cp) - range[0]); /* turn this into a four-byte sequence */ - bytes[3]=(char)(0x30+linear%10); linear/=10; - bytes[2]=(char)(0x81+linear%126); linear/=126; - bytes[1]=(char)(0x30+linear%10); linear/=10; - bytes[0]=(char)(0x81+linear); + bytes[3] = static_cast<char>(0x30 + linear % 10); linear /= 10; + bytes[2] = static_cast<char>(0x81 + linear % 126); linear /= 126; + bytes[1] = static_cast<char>(0x30 + linear % 10); linear /= 10; + bytes[0] = static_cast<char>(0x81 + linear); /* output this sequence */ ucnv_fromUWriteBytes(cnv, - bytes, 4, (char **)target, (char *)targetLimit, + bytes, 4, reinterpret_cast<char**>(target), reinterpret_cast<const char*>(targetLimit), offsets, sourceIndex, pErrorCode); return 0; } @@ -1181,7 +1181,7 @@ _extToU(UConverter *cnv, const UConverterSharedData *sharedData, if( (cx=sharedData->mbcs.extIndexes)!=nullptr && ucnv_extInitialMatchToU( cnv, cx, - length, (const char **)source, (const char *)sourceLimit, + length, reinterpret_cast<const char**>(source), reinterpret_cast<const char*>(sourceLimit), target, targetLimit, offsets, sourceIndex, flush, @@ -1273,7 +1273,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { table=mbcsTable->fromUnicodeTable; bytes=mbcsTable->fromUnicodeBytes; - results=(const uint16_t *)bytes; + results = reinterpret_cast<const uint16_t*>(bytes); /* * Check that this is an EBCDIC table with SBCS portion - @@ -1348,21 +1348,21 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { mbcsTable->countStates*1024+ sizeofFromUBytes+ UCNV_MAX_CONVERTER_NAME_LENGTH+20; - p=(uint8_t *)uprv_malloc(size); + p = static_cast<uint8_t*>(uprv_malloc(size)); if(p==nullptr) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return false; } /* copy and modify the to-Unicode state table */ - newStateTable=(int32_t (*)[256])p; + newStateTable = reinterpret_cast<int32_t(*)[256]>(p); uprv_memcpy(newStateTable, mbcsTable->stateTable, mbcsTable->countStates*1024); newStateTable[0][EBCDIC_LF]=MBCS_ENTRY_FINAL(0, MBCS_STATE_VALID_DIRECT_16, U_NL); newStateTable[0][EBCDIC_NL]=MBCS_ENTRY_FINAL(0, MBCS_STATE_VALID_DIRECT_16, U_LF); /* copy and modify the from-Unicode result table */ - newResults=(uint16_t *)newStateTable[mbcsTable->countStates]; + newResults = reinterpret_cast<uint16_t*>(newStateTable[mbcsTable->countStates]); uprv_memcpy(newResults, bytes, sizeofFromUBytes); /* conveniently, the table access macros work on the left side of expressions */ @@ -1378,7 +1378,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { } /* set the canonical converter name */ - name=(char *)newResults+sizeofFromUBytes; + name = reinterpret_cast<char*>(newResults) + sizeofFromUBytes; uprv_strcpy(name, sharedData->staticData->name); uprv_strcat(name, UCNV_SWAP_LFNL_OPTION_STRING); @@ -1386,7 +1386,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { icu::umtx_lock(nullptr); if(mbcsTable->swapLFNLStateTable==nullptr) { mbcsTable->swapLFNLStateTable=newStateTable; - mbcsTable->swapLFNLFromUnicodeBytes=(uint8_t *)newResults; + mbcsTable->swapLFNLFromUnicodeBytes = reinterpret_cast<uint8_t*>(newResults); mbcsTable->swapLFNLName=name; newStateTable=nullptr; @@ -1413,7 +1413,7 @@ writeStage3Roundtrip(const void *context, uint32_t value, UChar32 codePoints[32] int32_t i, st3; table=mbcsTable->fromUnicodeTable; - bytes=(uint8_t *)mbcsTable->fromUnicodeBytes; + bytes = const_cast<uint8_t*>(mbcsTable->fromUnicodeBytes); /* for EUC outputTypes, modify the value like genmbcs.c's transformEUC() */ switch(mbcsTable->outputType) { @@ -1454,23 +1454,23 @@ writeStage3Roundtrip(const void *context, uint32_t value, UChar32 codePoints[32] /* locate the stage 2 & 3 data */ stage2=((uint32_t *)table)+table[c>>10]+((c>>4)&0x3f); p=bytes; - st3=(int32_t)(uint16_t)*stage2*16+(c&0xf); + st3 = static_cast<int32_t>(static_cast<uint16_t>(*stage2)) * 16 + (c & 0xf); /* write the codepage bytes into stage 3 */ switch(mbcsTable->outputType) { case MBCS_OUTPUT_3: case MBCS_OUTPUT_4_EUC: p+=st3*3; - p[0]=(uint8_t)(value>>16); - p[1]=(uint8_t)(value>>8); - p[2]=(uint8_t)value; + p[0] = static_cast<uint8_t>(value >> 16); + p[1] = static_cast<uint8_t>(value >> 8); + p[2] = static_cast<uint8_t>(value); break; case MBCS_OUTPUT_4: - ((uint32_t *)p)[st3]=value; + reinterpret_cast<uint32_t*>(p)[st3] = value; break; default: /* 2 bytes per character */ - ((uint16_t *)p)[st3]=(uint16_t)value; + reinterpret_cast<uint16_t*>(p)[st3] = static_cast<uint16_t>(value); break; } @@ -1488,7 +1488,7 @@ reconstituteData(UConverterMBCSTable *mbcsTable, uint16_t *stage1; uint32_t *stage2; uint32_t dataLength=stage1Length*2+fullStage2Length*4+mbcsTable->fromUBytesLength; - mbcsTable->reconstitutedData=(uint8_t *)uprv_malloc(dataLength); + mbcsTable->reconstitutedData = static_cast<uint8_t*>(uprv_malloc(dataLength)); if(mbcsTable->reconstitutedData==nullptr) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return; @@ -1496,29 +1496,29 @@ reconstituteData(UConverterMBCSTable *mbcsTable, uprv_memset(mbcsTable->reconstitutedData, 0, dataLength); /* copy existing data and reroute the pointers */ - stage1=(uint16_t *)mbcsTable->reconstitutedData; + stage1 = reinterpret_cast<uint16_t*>(mbcsTable->reconstitutedData); uprv_memcpy(stage1, mbcsTable->fromUnicodeTable, stage1Length*2); - stage2=(uint32_t *)(stage1+stage1Length); + stage2 = reinterpret_cast<uint32_t*>(stage1 + stage1Length); uprv_memcpy(stage2+(fullStage2Length-stage2Length), mbcsTable->fromUnicodeTable+stage1Length, stage2Length*4); mbcsTable->fromUnicodeTable=stage1; - mbcsTable->fromUnicodeBytes=(uint8_t *)(stage2+fullStage2Length); + mbcsTable->fromUnicodeBytes = reinterpret_cast<uint8_t*>(stage2 + fullStage2Length); /* indexes into stage 2 count from the bottom of the fromUnicodeTable */ - stage2=(uint32_t *)stage1; + stage2 = reinterpret_cast<uint32_t*>(stage1); /* reconstitute the initial part of stage 2 from the mbcsIndex */ { - int32_t stageUTF8Length=((int32_t)mbcsTable->maxFastUChar+1)>>6; + int32_t stageUTF8Length = (static_cast<int32_t>(mbcsTable->maxFastUChar) + 1) >> 6; int32_t stageUTF8Index=0; int32_t st1, st2, st3, i; for(st1=0; stageUTF8Index<stageUTF8Length; ++st1) { st2=stage1[st1]; - if(st2!=(int32_t)stage1Length/2) { + if (st2 != static_cast<int32_t>(stage1Length) / 2) { /* each stage 2 block has 64 entries corresponding to 16 entries in the mbcsIndex */ for(i=0; i<16; ++i) { st3=mbcsTable->mbcsIndex[stageUTF8Index++]; @@ -1568,13 +1568,13 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, } else if(header->version[0]==5 && header->version[1]>=3 && (header->options&MBCS_OPT_UNKNOWN_INCOMPATIBLE_MASK)==0) { headerLength=header->options&MBCS_OPT_LENGTH_MASK; - noFromU=(UBool)((header->options&MBCS_OPT_NO_FROM_U)!=0); + noFromU = static_cast<UBool>((header->options & MBCS_OPT_NO_FROM_U) != 0); } else { *pErrorCode=U_INVALID_TABLE_FORMAT; return; } - mbcsTable->outputType=(uint8_t)header->flags; + mbcsTable->outputType = static_cast<uint8_t>(header->flags); if(noFromU && mbcsTable->outputType==MBCS_OUTPUT_1) { *pErrorCode=U_INVALID_TABLE_FORMAT; return; @@ -1583,7 +1583,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, /* extension data, header version 4.2 and higher */ offset=header->flags>>8; if(offset!=0) { - mbcsTable->extIndexes=(const int32_t *)(raw+offset); + mbcsTable->extIndexes = reinterpret_cast<const int32_t*>(raw + offset); } if(mbcsTable->outputType==MBCS_OUTPUT_EXT_ONLY) { @@ -1606,7 +1606,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, } /* load the base table */ - baseName=(const char *)header+headerLength*4; + baseName = reinterpret_cast<const char*>(header) + headerLength * 4; if(0==uprv_strcmp(baseName, sharedData->staticData->name)) { /* forbid loading this same extension-only file */ *pErrorCode=U_INVALID_TABLE_FORMAT; @@ -1685,7 +1685,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, MBCS_ENTRY_FINAL_ACTION(entry)==MBCS_STATE_CHANGE_ONLY && MBCS_ENTRY_FINAL_STATE(entry)!=0 ) { - mbcsTable->dbcsOnlyState=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); + mbcsTable->dbcsOnlyState = static_cast<uint8_t>(MBCS_ENTRY_FINAL_STATE(entry)); mbcsTable->outputType=MBCS_OUTPUT_DBCS_ONLY; } @@ -1702,7 +1702,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, /* allocate a new state table and copy the base state table contents */ count=mbcsTable->countStates; - newStateTable=(int32_t (*)[256])uprv_malloc((count+1)*1024); + newStateTable = static_cast<int32_t(*)[256]>(uprv_malloc((count + 1) * 1024)); if(newStateTable==nullptr) { ucnv_unload(baseSharedData); *pErrorCode=U_MEMORY_ALLOCATION_ERROR; @@ -1725,7 +1725,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, state[i]=MBCS_ENTRY_FINAL(0, MBCS_STATE_ILLEGAL, 0); } mbcsTable->stateTable=(const int32_t (*)[256])newStateTable; - mbcsTable->countStates=(uint8_t)(count+1); + mbcsTable->countStates = static_cast<uint8_t>(count + 1); mbcsTable->stateTableOwned=true; mbcsTable->outputType=MBCS_OUTPUT_DBCS_ONLY; @@ -1766,14 +1766,14 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, return; } - mbcsTable->countStates=(uint8_t)header->countStates; + mbcsTable->countStates = static_cast<uint8_t>(header->countStates); mbcsTable->countToUFallbacks=header->countToUFallbacks; - mbcsTable->stateTable=(const int32_t (*)[256])(raw+headerLength*4); - mbcsTable->toUFallbacks=(const _MBCSToUFallback *)(mbcsTable->stateTable+header->countStates); - mbcsTable->unicodeCodeUnits=(const uint16_t *)(raw+header->offsetToUCodeUnits); + mbcsTable->stateTable = reinterpret_cast<const int32_t(*)[256]>(raw + headerLength * 4); + mbcsTable->toUFallbacks = reinterpret_cast<const _MBCSToUFallback*>(mbcsTable->stateTable + header->countStates); + mbcsTable->unicodeCodeUnits = reinterpret_cast<const uint16_t*>(raw + header->offsetToUCodeUnits); - mbcsTable->fromUnicodeTable=(const uint16_t *)(raw+header->offsetFromUTable); - mbcsTable->fromUnicodeBytes=(const uint8_t *)(raw+header->offsetFromUBytes); + mbcsTable->fromUnicodeTable = reinterpret_cast<const uint16_t*>(raw + header->offsetFromUTable); + mbcsTable->fromUnicodeBytes = raw + header->offsetFromUBytes; mbcsTable->fromUBytesLength=header->fromUBytesLength; /* @@ -1784,7 +1784,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, udata_getInfo((UDataMemory *)sharedData->dataMemory, &info); if(info.formatVersion[0]>6 || (info.formatVersion[0]==6 && info.formatVersion[1]>=1)) { /* mask off possible future extensions to be safe */ - mbcsTable->unicodeMask=(uint8_t)(sharedData->staticData->unicodeMask&3); + mbcsTable->unicodeMask = static_cast<uint8_t>(sharedData->staticData->unicodeMask & 3); } else { /* for older versions, assume worst case: contains anything possible (prevent over-optimizations) */ mbcsTable->unicodeMask=UCNV_HAS_SUPPLEMENTARY|UCNV_HAS_SURROGATES; @@ -1825,10 +1825,10 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, * The .cnv file is prebuilt with an additional stage table with indexes * to each block. */ - mbcsTable->mbcsIndex=(const uint16_t *) - (mbcsTable->fromUnicodeBytes+ + mbcsTable->mbcsIndex = reinterpret_cast<const uint16_t*>( + mbcsTable->fromUnicodeBytes + (noFromU ? 0 : mbcsTable->fromUBytesLength)); - mbcsTable->maxFastUChar=(((char16_t)header->version[2])<<8)|0xff; + mbcsTable->maxFastUChar = (static_cast<char16_t>(header->version[2]) << 8) | 0xff; } } @@ -1839,7 +1839,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, for(i=0; i<0x80; ++i) { if(mbcsTable->stateTable[0][i]!=MBCS_ENTRY_FINAL(0, MBCS_STATE_VALID_DIRECT_16, i)) { - asciiRoundtrips&=~((uint32_t)1<<(i>>2)); + asciiRoundtrips &= ~(static_cast<uint32_t>(1) << (i >> 2)); } } mbcsTable->asciiRoundtrips=asciiRoundtrips; @@ -1958,7 +1958,7 @@ ucnv_MBCSOpen(UConverter *cnv, extIndexes=mbcsTable->extIndexes; if(extIndexes!=nullptr) { - maxBytesPerUChar=(int8_t)UCNV_GET_MAX_BYTES_PER_UCHAR(extIndexes); + maxBytesPerUChar = static_cast<int8_t>(UCNV_GET_MAX_BYTES_PER_UCHAR(extIndexes)); if(outputType==MBCS_OUTPUT_2_SISO) { ++maxBytesPerUChar; /* SO + multiple DBCS */ } @@ -2048,8 +2048,8 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* set up the local pointers */ cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); target=pArgs->target; targetLimit=pArgs->targetLimit; offsets=pArgs->offsets; @@ -2085,7 +2085,7 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* test the most common case first */ if(MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(entry)) { /* output BMP code point */ - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); if(offsets!=nullptr) { *offsets++=sourceIndex; } @@ -2099,17 +2099,17 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * An if-else-if chain provides more reliable performance for * the most common cases compared to a switch. */ - action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + action = static_cast<uint8_t>(MBCS_ENTRY_FINAL_ACTION(entry)); if(action==MBCS_STATE_VALID_DIRECT_20 || (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) ) { entry=MBCS_ENTRY_FINAL_VALUE(entry); /* output surrogate pair */ - *target++=(char16_t)(0xd800|(char16_t)(entry>>10)); + *target++ = static_cast<char16_t>(0xd800 | static_cast<char16_t>(entry >> 10)); if(offsets!=nullptr) { *offsets++=sourceIndex; } - c=(char16_t)(0xdc00|(char16_t)(entry&0x3ff)); + c = static_cast<char16_t>(0xdc00 | static_cast<char16_t>(entry & 0x3ff)); if(target<targetLimit) { *target++=c; if(offsets!=nullptr) { @@ -2128,7 +2128,7 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { if(UCNV_TO_U_USE_FALLBACK(cnv)) { /* output BMP code point */ - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); if(offsets!=nullptr) { *offsets++=sourceIndex; } @@ -2152,7 +2152,7 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, break; } else /* unassigned sequences indicated with byteIndex>0 */ { /* try an extension mapping */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); cnv->toUBytes[0]=*(source-1); cnv->toULength=_extToU(cnv, cnv->sharedData, 1, &source, sourceLimit, @@ -2160,7 +2160,7 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, &offsets, sourceIndex, pArgs->flush, pErrorCode); - sourceIndex+=1+(int32_t)(source-(const uint8_t *)pArgs->source); + sourceIndex += 1 + static_cast<int32_t>(source - reinterpret_cast<const uint8_t*>(pArgs->source)); if(U_FAILURE(*pErrorCode)) { /* not mappable or buffer overflow */ @@ -2170,7 +2170,7 @@ ucnv_MBCSSingleToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, } /* write back the updated pointers */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); pArgs->target=target; pArgs->offsets=offsets; } @@ -2199,10 +2199,10 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, /* set up the local pointers */ cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); target=pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); offsets=pArgs->offsets; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { @@ -2219,7 +2219,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, * since the conversion here is 1:1 char16_t:uint8_t, we need only one counter * for the minimum of the sourceLength and targetCapacity */ - length=(int32_t)(sourceLimit-source); + length = static_cast<int32_t>(sourceLimit - source); if(length<targetCapacity) { targetCapacity=length; } @@ -2234,37 +2234,37 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, loops=count=targetCapacity>>4; do { oredEntries=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); oredEntries|=entry=stateTable[0][*source++]; - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); /* were all 16 entries really valid? */ if(!MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(oredEntries)) { @@ -2310,7 +2310,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, /* test the most common case first */ if(MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(entry)) { /* output BMP code point */ - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); --targetCapacity; continue; } @@ -2319,11 +2319,11 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, * An if-else-if chain provides more reliable performance for * the most common cases compared to a switch. */ - action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + action = static_cast<uint8_t>(MBCS_ENTRY_FINAL_ACTION(entry)); if(action==MBCS_STATE_FALLBACK_DIRECT_16) { if(UCNV_TO_U_USE_FALLBACK(cnv)) { /* output BMP code point */ - *target++=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + *target++ = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); --targetCapacity; continue; } @@ -2339,7 +2339,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, /* set offsets since the start or the last extension */ if(offsets!=nullptr) { - int32_t count=(int32_t)(source-lastSource); + int32_t count = static_cast<int32_t>(source - lastSource); /* predecrement: do not set the offset for the callback-causing character */ while(--count>0) { @@ -2361,7 +2361,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, &offsets, sourceIndex, pArgs->flush, pErrorCode); - sourceIndex+=1+(int32_t)(source-lastSource); + sourceIndex += 1 + static_cast<int32_t>(source - lastSource); if(U_FAILURE(*pErrorCode)) { /* not mappable or buffer overflow */ @@ -2369,8 +2369,8 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, } /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pArgs->targetLimit-target); - length=(int32_t)(sourceLimit-source); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - target); + length = static_cast<int32_t>(sourceLimit - source); if(length<targetCapacity) { targetCapacity=length; } @@ -2397,7 +2397,7 @@ ucnv_MBCSSingleToBMPWithOffsets(UConverterToUnicodeArgs *pArgs, } /* write back the updated pointers */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); pArgs->target=target; pArgs->offsets=offsets; } @@ -2432,7 +2432,7 @@ hasValidTrailBytes(const int32_t (*stateTable)[256], uint8_t state) { for(b=0; b<=0xff; ++b) { entry=row[b]; if( MBCS_ENTRY_IS_TRANSITION(entry) && - hasValidTrailBytes(stateTable, (uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry)) + hasValidTrailBytes(stateTable, static_cast<uint8_t>(MBCS_ENTRY_TRANSITION_STATE(entry))) ) { return true; } @@ -2450,9 +2450,9 @@ isSingleOrLead(const int32_t (*stateTable)[256], uint8_t state, UBool isDBCSOnly const int32_t *row=stateTable[state]; int32_t entry=row[b]; if(MBCS_ENTRY_IS_TRANSITION(entry)) { /* lead byte */ - return hasValidTrailBytes(stateTable, (uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry)); + return hasValidTrailBytes(stateTable, static_cast<uint8_t>(MBCS_ENTRY_TRANSITION_STATE(entry))); } else { - uint8_t action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + uint8_t action = static_cast<uint8_t>(MBCS_ENTRY_FINAL_ACTION(entry)); if(action==MBCS_STATE_CHANGE_ONLY && isDBCSOnly) { return false; /* SI/SO are illegal for DBCS-only conversion */ } else { @@ -2823,7 +2823,7 @@ ucnv_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * - If any of the non-initial bytes could be the start of a character, * we stop the illegal sequence before the first one of those. */ - UBool isDBCSOnly=(UBool)(cnv->sharedData->mbcs.dbcsOnlyState!=0); + UBool isDBCSOnly = cnv->sharedData->mbcs.dbcsOnlyState != 0; int8_t i; for(i=1; i<byteIndex && !isSingleOrLead(stateTable, state, isDBCSOnly, bytes[i]); @@ -2890,8 +2890,8 @@ ucnv_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, /* set up the local pointers */ cnv=pArgs->converter; - source=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; } else { @@ -2904,27 +2904,27 @@ ucnv_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, /* MBCS_ENTRY_IS_FINAL(entry) */ /* write back the updated pointer early so that we can return directly */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); if(MBCS_ENTRY_FINAL_IS_VALID_DIRECT_16(entry)) { /* output BMP code point */ - return (char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + return static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); } /* * An if-else-if chain provides more reliable performance for * the most common cases compared to a switch. */ - action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + action = static_cast<uint8_t>(MBCS_ENTRY_FINAL_ACTION(entry)); if( action==MBCS_STATE_VALID_DIRECT_20 || (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) ) { /* output supplementary code point */ - return (UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); + return static_cast<UChar32>(MBCS_ENTRY_FINAL_VALUE(entry) + 0x10000); } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { if(UCNV_TO_U_USE_FALLBACK(cnv)) { /* output BMP code point */ - return (char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + return static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); } } else if(action==MBCS_STATE_UNASSIGNED) { /* just fall through */ @@ -2941,7 +2941,7 @@ ucnv_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, break; } else /* unassigned sequence */ { /* defer to the generic implementation */ - pArgs->source=(const char *)source-1; + pArgs->source = reinterpret_cast<const char*>(source) - 1; return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } @@ -2999,8 +2999,8 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, } /* set up the local pointers */ - source=lastSource=(const uint8_t *)pArgs->source; - sourceLimit=(const uint8_t *)pArgs->sourceLimit; + source = lastSource = reinterpret_cast<const uint8_t*>(pArgs->source); + sourceLimit = reinterpret_cast<const uint8_t*>(pArgs->sourceLimit); if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { stateTable=(const int32_t (*)[256])cnv->sharedData->mbcs.swapLFNLStateTable; @@ -3017,7 +3017,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, * then load the DBCS state from the MBCS data * (dbcsOnlyState==0 if it is not a DBCS-only converter) */ - if((state=(uint8_t)(cnv->mode))==0) { + if ((state = static_cast<uint8_t>(cnv->mode)) == 0) { state=cnv->sharedData->mbcs.dbcsOnlyState; } @@ -3026,7 +3026,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, while(source<sourceLimit) { entry=stateTable[state][*source++]; if(MBCS_ENTRY_IS_TRANSITION(entry)) { - state=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + state = static_cast<uint8_t>(MBCS_ENTRY_TRANSITION_STATE(entry)); offset+=MBCS_ENTRY_TRANSITION_OFFSET(entry); /* optimization for 1/2-byte input and BMP output */ @@ -3036,7 +3036,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, (c=unicodeCodeUnits[offset+MBCS_ENTRY_FINAL_VALUE_16(entry)])<0xfffe ) { ++source; - state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ + state = static_cast<uint8_t>(MBCS_ENTRY_FINAL_STATE(entry)); /* typically 0 */ /* output BMP code point */ break; } @@ -3045,16 +3045,16 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, cnv->mode=state; /* set the next state early so that we can reuse the entry variable */ - state=(uint8_t)MBCS_ENTRY_FINAL_STATE(entry); /* typically 0 */ + state = static_cast<uint8_t>(MBCS_ENTRY_FINAL_STATE(entry)); /* typically 0 */ /* * An if-else-if chain provides more reliable performance for * the most common cases compared to a switch. */ - action=(uint8_t)(MBCS_ENTRY_FINAL_ACTION(entry)); + action = static_cast<uint8_t>(MBCS_ENTRY_FINAL_ACTION(entry)); if(action==MBCS_STATE_VALID_DIRECT_16) { /* output BMP code point */ - c=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + c = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); break; } else if(action==MBCS_STATE_VALID_16) { offset+=MBCS_ENTRY_FINAL_VALUE_16(entry); @@ -3092,7 +3092,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, (action==MBCS_STATE_FALLBACK_DIRECT_20 && UCNV_TO_U_USE_FALLBACK(cnv)) ) { /* output supplementary code point */ - c=(UChar32)(MBCS_ENTRY_FINAL_VALUE(entry)+0x10000); + c = static_cast<UChar32>(MBCS_ENTRY_FINAL_VALUE(entry) + 0x10000); break; } else if(action==MBCS_STATE_CHANGE_ONLY) { /* @@ -3104,7 +3104,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, */ if(cnv->sharedData->mbcs.dbcsOnlyState!=0) { /* SI/SO are illegal for DBCS-only conversion */ - state=(uint8_t)(cnv->mode); /* restore the previous state */ + state = static_cast<uint8_t>(cnv->mode); /* restore the previous state */ /* callback(illegal) */ *pErrorCode=U_ILLEGAL_CHAR_FOUND; @@ -3112,7 +3112,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, } else if(action==MBCS_STATE_FALLBACK_DIRECT_16) { if(UCNV_TO_U_USE_FALLBACK(cnv)) { /* output BMP code point */ - c=(char16_t)MBCS_ENTRY_FINAL_VALUE_16(entry); + c = static_cast<char16_t>(MBCS_ENTRY_FINAL_VALUE_16(entry)); break; } } else if(action==MBCS_STATE_UNASSIGNED) { @@ -3137,7 +3137,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, /* defer to the generic implementation */ cnv->toUnicodeStatus=0; cnv->mode=state; - pArgs->source=(const char *)lastSource; + pArgs->source = reinterpret_cast<const char*>(lastSource); return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } @@ -3146,11 +3146,8 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, if(c<0) { if(U_SUCCESS(*pErrorCode) && source==sourceLimit && lastSource<source) { /* incomplete character byte sequence */ - uint8_t *bytes=cnv->toUBytes; - cnv->toULength=(int8_t)(source-lastSource); - do { - *bytes++=*lastSource++; - } while(lastSource<source); + cnv->toULength = static_cast<int8_t>(source - lastSource); + uprv_memcpy(cnv->toUBytes, lastSource, cnv->toULength); *pErrorCode=U_TRUNCATED_CHAR_FOUND; } else if(U_FAILURE(*pErrorCode)) { /* callback(illegal) */ @@ -3160,7 +3157,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, * - If any of the non-initial bytes could be the start of a character, * we stop the illegal sequence before the first one of those. */ - UBool isDBCSOnly=(UBool)(cnv->sharedData->mbcs.dbcsOnlyState!=0); + UBool isDBCSOnly = static_cast<UBool>(cnv->sharedData->mbcs.dbcsOnlyState != 0); uint8_t *bytes=cnv->toUBytes; *bytes++=*lastSource++; /* first byte */ if(lastSource==source) { @@ -3188,7 +3185,7 @@ ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, cnv->mode=state; /* write back the updated pointer */ - pArgs->source=(const char *)source; + pArgs->source = reinterpret_cast<const char*>(source); return c; } @@ -3431,8 +3428,8 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* set up the local pointers */ source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + target = reinterpret_cast<uint8_t*>(pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); offsets=pArgs->offsets; table=cnv->sharedData->mbcs.fromUnicodeTable; @@ -3474,7 +3471,7 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, c=*source++; ++nextSourceIndex; if(c<=0x7f && IS_ASCII_ROUNDTRIP(c, asciiRoundtrips)) { - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); if(offsets!=nullptr) { *offsets++=sourceIndex; sourceIndex=nextSourceIndex; @@ -3562,7 +3559,7 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, &offsets, sourceIndex, pArgs->flush, pErrorCode); - nextSourceIndex+=(int32_t)(source-pArgs->source); + nextSourceIndex += static_cast<int32_t>(source - pArgs->source); if(U_FAILURE(*pErrorCode)) { /* not mappable or buffer overflow */ @@ -3571,7 +3568,7 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* a mapping was written to the target, continue */ /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - reinterpret_cast<char*>(target)); /* normal end of conversion: prepare for a new character */ sourceIndex=nextSourceIndex; @@ -3584,15 +3581,15 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* from the first if in the loop we know that targetCapacity>0 */ if(value<=0xff) { /* this is easy because we know that there is enough space */ - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); if(offsets!=nullptr) { *offsets++=sourceIndex; } --targetCapacity; } else /* length==2 */ { - *target++=(uint8_t)(value>>8); + *target++ = static_cast<uint8_t>(value >> 8); if(2<=targetCapacity) { - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); if(offsets!=nullptr) { *offsets++=sourceIndex; *offsets++=sourceIndex; @@ -3602,7 +3599,7 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(offsets!=nullptr) { *offsets++=sourceIndex; } - cnv->charErrorBuffer[0]=(char)value; + cnv->charErrorBuffer[0] = static_cast<char>(value); cnv->charErrorBufferLength=1; /* target overflow */ @@ -3629,7 +3626,7 @@ ucnv_MBCSDoubleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = reinterpret_cast<char*>(target); pArgs->offsets=offsets; } @@ -3657,13 +3654,13 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, cnv=pArgs->converter; source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + target = reinterpret_cast<uint8_t*>(pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); offsets=pArgs->offsets; table=cnv->sharedData->mbcs.fromUnicodeTable; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; + results = reinterpret_cast<uint16_t*>(cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes); } else { results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } @@ -3675,7 +3672,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* use only roundtrips and fallbacks from private-use characters */ minValue=0xc00; } - hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY); + hasSupplementary = static_cast<UBool>(cnv->sharedData->mbcs.unicodeMask & UCNV_HAS_SUPPLEMENTARY); /* get the converter state from UConverter */ c=cnv->fromUChar32; @@ -3749,7 +3746,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* assigned, write the output character bytes from value and length */ /* length==1 */ /* this is easy because we know that there is enough space */ - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); if(offsets!=nullptr) { *offsets++=sourceIndex; } @@ -3768,7 +3765,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, &offsets, sourceIndex, pArgs->flush, pErrorCode); - nextSourceIndex+=(int32_t)(source-pArgs->source); + nextSourceIndex += static_cast<int32_t>(source - pArgs->source); if(U_FAILURE(*pErrorCode)) { /* not mappable or buffer overflow */ @@ -3777,7 +3774,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* a mapping was written to the target, continue */ /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - reinterpret_cast<char*>(target)); /* normal end of conversion: prepare for a new character */ sourceIndex=nextSourceIndex; @@ -3795,7 +3792,7 @@ ucnv_MBCSSingleFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = reinterpret_cast<char*>(target); pArgs->offsets=offsets; } @@ -3833,13 +3830,13 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, cnv=pArgs->converter; source=pArgs->source; sourceLimit=pArgs->sourceLimit; - target=(uint8_t *)pArgs->target; - targetCapacity=(int32_t)(pArgs->targetLimit-pArgs->target); + target = reinterpret_cast<uint8_t*>(pArgs->target); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - pArgs->target); offsets=pArgs->offsets; table=cnv->sharedData->mbcs.fromUnicodeTable; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; + results = reinterpret_cast<uint16_t*>(cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes); } else { results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } @@ -3864,7 +3861,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, * since the conversion here is 1:1 char16_t:uint8_t, we need only one counter * for the minimum of the sourceLength and targetCapacity */ - length=(int32_t)(sourceLimit-source); + length = static_cast<int32_t>(sourceLimit - source); if(length<targetCapacity) { targetCapacity=length; } @@ -3937,7 +3934,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, */ /* convert the Unicode code point in c into codepage bytes */ if(c<=0x7f && IS_ASCII_ROUNDTRIP(c, asciiRoundtrips)) { - *target++=(uint8_t)c; + *target++ = static_cast<uint8_t>(c); --targetCapacity; c=0; continue; @@ -3948,7 +3945,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, /* assigned, write the output character bytes from value and length */ /* length==1 */ /* this is easy because we know that there is enough space */ - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); --targetCapacity; /* normal end of conversion: prepare for a new character */ @@ -3993,7 +3990,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, /* set offsets since the start or the last extension */ if(offsets!=nullptr) { - int32_t count=(int32_t)(source-lastSource); + int32_t count = static_cast<int32_t>(source - lastSource); /* do not set the offset for this character */ count-=length; @@ -4009,11 +4006,11 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, lastSource=source; c=_extFromU(cnv, cnv->sharedData, c, &source, sourceLimit, - &target, (const uint8_t *)(pArgs->targetLimit), + &target, reinterpret_cast<const uint8_t*>(pArgs->targetLimit), &offsets, sourceIndex, pArgs->flush, pErrorCode); - sourceIndex+=length+(int32_t)(source-lastSource); + sourceIndex += length + static_cast<int32_t>(source - lastSource); lastSource=source; if(U_FAILURE(*pErrorCode)) { @@ -4023,8 +4020,8 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, /* a mapping was written to the target, continue */ /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pArgs->targetLimit-(char *)target); - length=(int32_t)(sourceLimit-source); + targetCapacity = static_cast<int32_t>(pArgs->targetLimit - reinterpret_cast<char*>(target)); + length = static_cast<int32_t>(sourceLimit - source); if(length<targetCapacity) { targetCapacity=length; } @@ -4063,7 +4060,7 @@ ucnv_MBCSSingleFromBMPWithOffsets(UConverterFromUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=source; - pArgs->target=(char *)target; + pArgs->target = reinterpret_cast<char*>(target); pArgs->offsets=offsets; } @@ -4777,14 +4774,14 @@ ucnv_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, ) { /* EBCDIC_STATEFUL ending with DBCS: emit an SI to return the output stream to SBCS */ if(targetCapacity>0) { - *target++=(uint8_t)siBytes[0]; + *target++ = siBytes[0]; if (siLength == 2) { if (targetCapacity<2) { - cnv->charErrorBuffer[0]=(uint8_t)siBytes[1]; + cnv->charErrorBuffer[0] = siBytes[1]; cnv->charErrorBufferLength=1; *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } else { - *target++=(uint8_t)siBytes[1]; + *target++ = siBytes[1]; } } if(offsets!=nullptr) { @@ -4793,9 +4790,9 @@ ucnv_MBCSFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, } } else { /* target is full */ - cnv->charErrorBuffer[0]=(uint8_t)siBytes[0]; + cnv->charErrorBuffer[0] = siBytes[0]; if (siLength == 2) { - cnv->charErrorBuffer[1]=(uint8_t)siBytes[1]; + cnv->charErrorBuffer[1] = siBytes[1]; } cnv->charErrorBufferLength=siLength; *pErrorCode=U_BUFFER_OVERFLOW_ERROR; @@ -5042,13 +5039,13 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, cnv=pFromUArgs->converter; source=(uint8_t *)pToUArgs->source; sourceLimit=(uint8_t *)pToUArgs->sourceLimit; - target=(uint8_t *)pFromUArgs->target; - targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); + target = reinterpret_cast<uint8_t*>(pFromUArgs->target); + targetCapacity = static_cast<int32_t>(pFromUArgs->targetLimit - pFromUArgs->target); table=cnv->sharedData->mbcs.fromUnicodeTable; sbcsIndex=cnv->sharedData->mbcs.sbcsIndex; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; + results = reinterpret_cast<uint16_t*>(cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes); } else { results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } @@ -5061,13 +5058,13 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* use only roundtrips and fallbacks from private-use characters */ minValue=0xc00; } - hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY); + hasSupplementary = static_cast<UBool>(cnv->sharedData->mbcs.unicodeMask & UCNV_HAS_SUPPLEMENTARY); /* get the converter state from the UTF-8 UConverter */ if(utf8->toULength > 0) { toULength=oldToULength=utf8->toULength; - toULimit=(int8_t)utf8->mode; - c=(UChar32)utf8->toUnicodeStatus; + toULimit = static_cast<int8_t>(utf8->mode); + c = static_cast<UChar32>(utf8->toUnicodeStatus); } else { toULength=oldToULength=toULimit=0; c = 0; @@ -5080,7 +5077,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, { // Do not go back into the bytes that will be read for finishing a partial // sequence from the previous buffer. - int32_t length=(int32_t)(sourceLimit-source) - (toULimit-oldToULength); + int32_t length = static_cast<int32_t>(sourceLimit - source) - (toULimit - oldToULength); if(length>0) { uint8_t b1=*(sourceLimit-1); if(U8_IS_SINGLE(b1)) { @@ -5130,7 +5127,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { - *target++=(uint8_t)b; + *target++ = b; --targetCapacity; continue; } else { @@ -5141,13 +5138,13 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if(b<0xe0) { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && - (t1=(uint8_t)(*source-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(*source - 0x80)) <= 0x3f ) { c=b&0x1f; ++source; value=SBCS_RESULT_FROM_UTF8(sbcsIndex, results, c, t1); if(value>=minValue) { - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); --targetCapacity; continue; } else { @@ -5158,14 +5155,14 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } else if(b==0xe0) { if( /* handle U+0800..U+0FFF inline */ - (t1=(uint8_t)(source[0]-0x80)) <= 0x3f && t1 >= 0x20 && - (t2=(uint8_t)(source[1]-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(source[0] - 0x80)) <= 0x3f && t1 >= 0x20 && + (t2 = static_cast<uint8_t>(source[1] - 0x80)) <= 0x3f ) { c=t1; source+=2; value=SBCS_RESULT_FROM_UTF8(sbcsIndex, results, c, t2); if(value>=minValue) { - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); --targetCapacity; continue; } else { @@ -5212,7 +5209,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, utf8->toULength=toULength; utf8->mode=toULimit; pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); return; } } @@ -5238,7 +5235,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } utf8->toULength=toULength; pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); *pErrorCode=U_ILLEGAL_CHAR_FOUND; return; } @@ -5247,7 +5244,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if(value>=minValue) { /* output the mapping for c */ - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); --targetCapacity; } else { /* value<minValue means c is unassigned (unmappable) */ @@ -5283,7 +5280,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* a mapping was written to the target, continue */ /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pFromUArgs->targetLimit-(char *)target); + targetCapacity = static_cast<int32_t>(pFromUArgs->targetLimit - reinterpret_cast<char*>(target)); } } } else { @@ -5315,7 +5312,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* write back the updated pointers */ pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); } static void U_CALLCONV @@ -5345,25 +5342,25 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, cnv=pFromUArgs->converter; source=(uint8_t *)pToUArgs->source; sourceLimit=(uint8_t *)pToUArgs->sourceLimit; - target=(uint8_t *)pFromUArgs->target; - targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target); + target = reinterpret_cast<uint8_t*>(pFromUArgs->target); + targetCapacity = static_cast<int32_t>(pFromUArgs->targetLimit - pFromUArgs->target); table=cnv->sharedData->mbcs.fromUnicodeTable; mbcsIndex=cnv->sharedData->mbcs.mbcsIndex; if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0) { - results=(uint16_t *)cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes; + results = reinterpret_cast<uint16_t*>(cnv->sharedData->mbcs.swapLFNLFromUnicodeBytes); } else { results=(uint16_t *)cnv->sharedData->mbcs.fromUnicodeBytes; } asciiRoundtrips=cnv->sharedData->mbcs.asciiRoundtrips; - hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY); + hasSupplementary = static_cast<UBool>(cnv->sharedData->mbcs.unicodeMask & UCNV_HAS_SUPPLEMENTARY); /* get the converter state from the UTF-8 UConverter */ if(utf8->toULength > 0) { toULength=oldToULength=utf8->toULength; - toULimit=(int8_t)utf8->mode; - c=(UChar32)utf8->toUnicodeStatus; + toULimit = static_cast<int8_t>(utf8->mode); + c = static_cast<UChar32>(utf8->toUnicodeStatus); } else { toULength=oldToULength=toULimit=0; c = 0; @@ -5376,7 +5373,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, { // Do not go back into the bytes that will be read for finishing a partial // sequence from the previous buffer. - int32_t length=(int32_t)(sourceLimit-source) - (toULimit-oldToULength); + int32_t length = static_cast<int32_t>(sourceLimit - source) - (toULimit - oldToULength); if(length>0) { uint8_t b1=*(sourceLimit-1); if(U8_IS_SINGLE(b1)) { @@ -5423,7 +5420,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if( /* handle U+0800..U+D7FF inline */ b<=0xed && // do not assume maxFastUChar>0xd7ff U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && - (t2=(uint8_t)(source[1]-0x80)) <= 0x3f + (t2 = static_cast<uint8_t>(source[1] - 0x80)) <= 0x3f ) { c=((b&0xf)<<6)|(t1&0x3f); source+=2; @@ -5438,7 +5435,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && - (t1=(uint8_t)(*source-0x80)) <= 0x3f + (t1 = static_cast<uint8_t>(*source - 0x80)) <= 0x3f ) { c=b&0x1f; ++source; @@ -5486,7 +5483,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, utf8->toULength=toULength; utf8->mode=toULimit; pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); return; } } @@ -5512,7 +5509,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } utf8->toULength=toULength; pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); *pErrorCode=U_ILLEGAL_CHAR_FOUND; return; } @@ -5534,15 +5531,15 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* from the first if in the loop we know that targetCapacity>0 */ if(value<=0xff) { /* this is easy because we know that there is enough space */ - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); --targetCapacity; } else /* length==2 */ { - *target++=(uint8_t)(value>>8); + *target++ = static_cast<uint8_t>(value >> 8); if(2<=targetCapacity) { - *target++=(uint8_t)value; + *target++ = static_cast<uint8_t>(value); targetCapacity-=2; } else { - cnv->charErrorBuffer[0]=(char)value; + cnv->charErrorBuffer[0] = static_cast<char>(value); cnv->charErrorBufferLength=1; /* target overflow */ @@ -5586,7 +5583,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* a mapping was written to the target, continue */ /* recalculate the targetCapacity after an extension mapping */ - targetCapacity=(int32_t)(pFromUArgs->targetLimit-(char *)target); + targetCapacity = static_cast<int32_t>(pFromUArgs->targetLimit - reinterpret_cast<char*>(target)); continue; } } @@ -5619,7 +5616,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* write back the updated pointers */ pToUArgs->source=(char *)source; - pFromUArgs->target=(char *)target; + pFromUArgs->target = reinterpret_cast<char*>(target); } /* miscellaneous ------------------------------------------------------------ */ @@ -5634,7 +5631,7 @@ ucnv_MBCSGetStarters(const UConverter* cnv, state0=cnv->sharedData->mbcs.stateTable[cnv->sharedData->mbcs.dbcsOnlyState]; for(i=0; i<256; ++i) { /* all bytes that cause a state transition from state 0 are lead bytes */ - starters[i]= (UBool)MBCS_ENTRY_IS_TRANSITION(state0[i]); + starters[i] = static_cast<UBool>(MBCS_ENTRY_IS_TRANSITION(state0[i])); } } @@ -5644,7 +5641,7 @@ ucnv_MBCSGetStarters(const UConverter* cnv, */ U_CFUNC UBool ucnv_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte) { - return (UBool)MBCS_ENTRY_IS_TRANSITION(sharedData->mbcs.stateTable[0][(uint8_t)byte]); + return MBCS_ENTRY_IS_TRANSITION(sharedData->mbcs.stateTable[0][(uint8_t)byte]); } static void U_CALLCONV @@ -5663,11 +5660,11 @@ ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, (cnv->invalidUCharBuffer[0]<=0xff)) ) { /* select subChar1 if it is set (not 0) and the unmappable Unicode code point is up to U+00ff (IBM MBCS behavior) */ - subchar=(char *)&cnv->subChar1; + subchar = reinterpret_cast<char*>(&cnv->subChar1); length=1; } else { /* select subChar in all other cases */ - subchar=(char *)cnv->subChars; + subchar = reinterpret_cast<char*>(cnv->subChars); length=cnv->subCharLen; } @@ -5701,7 +5698,7 @@ ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, return; } subchar=buffer; - length=(int32_t)(p-buffer); + length = static_cast<int32_t>(p - buffer); } ucnv_cbFromUWriteBytes(pArgs, subchar, length, offsetIndex, pErrorCode); diff --git a/deps/icu-small/source/common/ucnvscsu.cpp b/deps/icu-small/source/common/ucnvscsu.cpp index 2138e289cadbe6..5412136a346a9e 100644 --- a/deps/icu-small/source/common/ucnvscsu.cpp +++ b/deps/icu-small/source/common/ucnvscsu.cpp @@ -572,7 +572,6 @@ _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->source=(const char *)source; pArgs->target=target; pArgs->offsets=offsets; - return; } /* @@ -864,7 +863,6 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, /* write back the updated pointers */ pArgs->source=(const char *)source; pArgs->target=target; - return; } U_CDECL_END /* SCSU-from-Unicode conversion functions ----------------------------------- */ @@ -885,8 +883,8 @@ static int8_t getWindow(const uint32_t offsets[8], uint32_t c) { int i; for(i=0; i<8; ++i) { - if((uint32_t)(c-offsets[i])<=0x7f) { - return (int8_t)(i); + if (c - offsets[i] <= 0x7f) { + return static_cast<int8_t>(i); } } return -1; @@ -895,9 +893,9 @@ getWindow(const uint32_t offsets[8], uint32_t c) { /* is the character in the dynamic window starting at the offset, or in the direct-encoded range? */ static UBool isInOffsetWindowOrDirect(uint32_t offset, uint32_t c) { - return (UBool)(c<=offset+0x7f && + return c<=offset+0x7f && (c>=offset || (c<=0x7f && - (c>=0x20 || (1UL<<c)&0x2601)))); + (c>=0x20 || (1UL<<c)&0x2601))); /* binary 0010 0110 0000 0001, check for b==0xd || b==0xa || b==9 || b==0 */ } @@ -965,7 +963,7 @@ getDynamicOffset(uint32_t c, uint32_t *pOffset) { int i; for(i=0; i<7; ++i) { - if((uint32_t)(c-fixedOffsets[i])<=0x7f) { + if (c - fixedOffsets[i] <= 0x7f) { *pOffset=fixedOffsets[i]; return 0xf9+i; } @@ -975,16 +973,16 @@ getDynamicOffset(uint32_t c, uint32_t *pOffset) { /* No dynamic window for US-ASCII. */ return -1; } else if(c<0x3400 || - (uint32_t)(c-0x10000)<(0x14000-0x10000) || - (uint32_t)(c-0x1d000)<=(0x1ffff-0x1d000) + c - 0x10000 < 0x14000 - 0x10000 || + c - 0x1d000 <= 0x1ffff - 0x1d000 ) { /* This character is in a code range for a "small", i.e., reasonably windowable, script. */ *pOffset=c&0x7fffff80; - return (int)(c>>7); + return static_cast<int>(c >> 7); } else if(0xe000<=c && c!=0xfeff && c<0xfff0) { /* For these characters we need to take the gapOffset into account. */ *pOffset=c&0x7fffff80; - return (int)((c-gapOffset)>>7); + return static_cast<int>((c - gapOffset) >> 7); } else { return -1; } @@ -1210,8 +1208,8 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; length=3; goto outputBytes; - } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && - (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) + } else if ((c - 0x3400) < (0xd800 - 0x3400) && + (source >= sourceLimit || (uint32_t)(*source - 0x3400) < (0xd800 - 0x3400)) ) { /* * this character is not compressible (a BMP ideograph or similar); @@ -1250,7 +1248,7 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, c=*source++; ++nextSourceIndex; - if((uint32_t)(c-0x3400)<(0xd800-0x3400)) { + if ((c - 0x3400) < (0xd800 - 0x3400)) { /* not compressible, write character directly */ if(targetCapacity>=2) { *target++=(uint8_t)(c>>8); @@ -1264,10 +1262,10 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, length=2; goto outputBytes; } - } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { + } else if (c - 0x3400 >= 0xf300 - 0x3400 /* c<0x3400 || c>=0xf300 */) { /* compress BMP character if the following one is not an uncompressible ideograph */ if(!(source<sourceLimit && (uint32_t)(*source-0x3400)<(0xd800-0x3400))) { - if(((uint32_t)(c-0x30)<10 || (uint32_t)(c-0x61)<26 || (uint32_t)(c-0x41)<26)) { + if (c - 0x30 < 10 || c - 0x61 < 26 || c - 0x41 < 26) { /* ASCII digit or letter */ isSingleByteMode=true; c|=((uint32_t)(UC0+dynamicWindow)<<8)|c; @@ -1693,8 +1691,8 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, c=((uint32_t)(SD0+dynamicWindow)<<16)|((uint32_t)code<<8)|(c-currentOffset)|0x80; length=3; goto outputBytes; - } else if((uint32_t)(c-0x3400)<(0xd800-0x3400) && - (source>=sourceLimit || (uint32_t)(*source-0x3400)<(0xd800-0x3400)) + } else if (c - 0x3400 < 0xd800 - 0x3400 && + (source >= sourceLimit || static_cast<uint32_t>(*source - 0x3400) < 0xd800 - 0x3400) ) { /* * this character is not compressible (a BMP ideograph or similar); @@ -1731,7 +1729,7 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, } c=*source++; - if((uint32_t)(c-0x3400)<(0xd800-0x3400)) { + if (c - 0x3400 < 0xd800 - 0x3400) { /* not compressible, write character directly */ if(targetCapacity>=2) { *target++=(uint8_t)(c>>8); @@ -1741,10 +1739,10 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, length=2; goto outputBytes; } - } else if((uint32_t)(c-0x3400)>=(0xf300-0x3400) /* c<0x3400 || c>=0xf300 */) { + } else if (c - 0x3400 >= 0xf300 - 0x3400 /* c<0x3400 || c>=0xf300 */) { /* compress BMP character if the following one is not an uncompressible ideograph */ if(!(source<sourceLimit && (uint32_t)(*source-0x3400)<(0xd800-0x3400))) { - if(((uint32_t)(c-0x30)<10 || (uint32_t)(c-0x61)<26 || (uint32_t)(c-0x41)<26)) { + if (c - 0x30 < 10 || c - 0x61 < 26 || c - 0x41 < 26) { /* ASCII digit or letter */ isSingleByteMode=true; c|=((uint32_t)(UC0+dynamicWindow)<<8)|c; @@ -1978,12 +1976,12 @@ _SCSUSafeClone(const UConverter *cnv, int32_t bufferSizeNeeded = sizeof(struct cloneSCSUStruct); if (U_FAILURE(*status)){ - return 0; + return nullptr; } if (*pBufferSize == 0){ /* 'preflighting' request - set needed size into *pBufferSize */ *pBufferSize = bufferSizeNeeded; - return 0; + return nullptr; } localClone = (struct cloneSCSUStruct *)stackBuffer; diff --git a/deps/icu-small/source/common/ucnvsel.cpp b/deps/icu-small/source/common/ucnvsel.cpp index a286646395b30f..01d9c7e0c210ca 100644 --- a/deps/icu-small/source/common/ucnvsel.cpp +++ b/deps/icu-small/source/common/ucnvsel.cpp @@ -377,7 +377,7 @@ ucnvsel_swap(const UDataSwapper *ds, } /* check data format and format version */ - const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4); + const UDataInfo* pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0] == 0x43 && /* dataFormat="CSel" */ pInfo->dataFormat[1] == 0x53 && @@ -407,11 +407,11 @@ ucnvsel_swap(const UDataSwapper *ds, } } - const uint8_t *inBytes = (const uint8_t *)inData + headerSize; - uint8_t *outBytes = (uint8_t *)outData + headerSize; + const uint8_t* inBytes = static_cast<const uint8_t*>(inData) + headerSize; + uint8_t* outBytes = static_cast<uint8_t*>(outData) + headerSize; /* read the indexes */ - const int32_t *inIndexes = (const int32_t *)inBytes; + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); int32_t indexes[16]; int32_t i; for(i = 0; i < 16; ++i) { diff --git a/deps/icu-small/source/common/ucol_swp.cpp b/deps/icu-small/source/common/ucol_swp.cpp index b5894a1feff883..ea72bb8b8d1107 100644 --- a/deps/icu-small/source/common/ucol_swp.cpp +++ b/deps/icu-small/source/common/ucol_swp.cpp @@ -108,11 +108,11 @@ swapFormatVersion3(const UDataSwapper *ds, return 0; } - inBytes=(const uint8_t *)inData; - outBytes=(uint8_t *)outData; + inBytes = static_cast<const uint8_t*>(inData); + outBytes = static_cast<uint8_t*>(outData); - inHeader=(const UCATableHeader *)inData; - outHeader=(UCATableHeader *)outData; + inHeader = static_cast<const UCATableHeader*>(inData); + outHeader = static_cast<UCATableHeader*>(outData); /* * The collation binary must contain at least the UCATableHeader, @@ -175,7 +175,7 @@ swapFormatVersion3(const UDataSwapper *ds, header.leadByteToScript= ds->readUInt32(inHeader->leadByteToScript); /* swap the 32-bit integers in the header */ - ds->swapArray32(ds, inHeader, (int32_t)((const char *)&inHeader->jamoSpecial-(const char *)inHeader), + ds->swapArray32(ds, inHeader, static_cast<int32_t>(reinterpret_cast<const char*>(&inHeader->jamoSpecial) - reinterpret_cast<const char*>(inHeader)), outHeader, pErrorCode); ds->swapArray32(ds, &(inHeader->scriptToLeadByte), sizeof(header.scriptToLeadByte) + sizeof(header.leadByteToScript), &(outHeader->scriptToLeadByte), pErrorCode); @@ -198,7 +198,7 @@ swapFormatVersion3(const UDataSwapper *ds, /* no contractions: expansions bounded by the main trie */ count=header.mappingPosition-header.expansion; } - ds->swapArray32(ds, inBytes+header.expansion, (int32_t)count, + ds->swapArray32(ds, inBytes + header.expansion, static_cast<int32_t>(count), outBytes+header.expansion, pErrorCode); } @@ -216,7 +216,7 @@ swapFormatVersion3(const UDataSwapper *ds, /* swap the main trie */ if(header.mappingPosition!=0) { count=header.endExpansionCE-header.mappingPosition; - utrie_swap(ds, inBytes+header.mappingPosition, (int32_t)count, + utrie_swap(ds, inBytes + header.mappingPosition, static_cast<int32_t>(count), outBytes+header.mappingPosition, pErrorCode); } @@ -241,7 +241,7 @@ swapFormatVersion3(const UDataSwapper *ds, /* swap UCA contractions */ if(header.contractionUCACombosSize!=0) { count=header.contractionUCACombosSize*inHeader->contractionUCACombosWidth*U_SIZEOF_UCHAR; - ds->swapArray16(ds, inBytes+header.contractionUCACombos, (int32_t)count, + ds->swapArray16(ds, inBytes + header.contractionUCACombos, static_cast<int32_t>(count), outBytes+header.contractionUCACombos, pErrorCode); } @@ -306,10 +306,10 @@ swapFormatVersion4(const UDataSwapper *ds, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return 0; } - const uint8_t *inBytes=(const uint8_t *)inData; - uint8_t *outBytes=(uint8_t *)outData; + const uint8_t* inBytes = static_cast<const uint8_t*>(inData); + uint8_t* outBytes = static_cast<uint8_t*>(outData); - const int32_t *inIndexes=(const int32_t *)inBytes; + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); int32_t indexes[IX_TOTAL_SIZE+1]; // Need at least IX_INDEXES_LENGTH and IX_OPTIONS. diff --git a/deps/icu-small/source/common/ucptrie.cpp b/deps/icu-small/source/common/ucptrie.cpp index 0004160a238b0e..3e4b6a606e5eba 100644 --- a/deps/icu-small/source/common/ucptrie.cpp +++ b/deps/icu-small/source/common/ucptrie.cpp @@ -258,11 +258,11 @@ inline uint32_t maybeFilterValue(uint32_t value, uint32_t trieNullValue, uint32_ UChar32 getRange(const void *t, UChar32 start, UCPMapValueFilter *filter, const void *context, uint32_t *pValue) { - if ((uint32_t)start > MAX_UNICODE) { + if (static_cast<uint32_t>(start) > MAX_UNICODE) { return U_SENTINEL; } const UCPTrie *trie = reinterpret_cast<const UCPTrie *>(t); - UCPTrieValueWidth valueWidth = (UCPTrieValueWidth)trie->valueWidth; + UCPTrieValueWidth valueWidth = static_cast<UCPTrieValueWidth>(trie->valueWidth); if (start >= trie->highStart) { if (pValue != nullptr) { int32_t di = trie->dataLength - UCPTRIE_HIGH_VALUE_NEG_DATA_OFFSET; @@ -304,7 +304,7 @@ UChar32 getRange(const void *t, UChar32 start, i1 += UCPTRIE_SMALL_INDEX_LENGTH; } i3Block = trie->index[ - (int32_t)trie->index[i1] + ((c >> UCPTRIE_SHIFT_2) & UCPTRIE_INDEX_2_MASK)]; + static_cast<int32_t>(trie->index[i1]) + ((c >> UCPTRIE_SHIFT_2) & UCPTRIE_INDEX_2_MASK)]; if (i3Block == prevI3Block && (c - start) >= UCPTRIE_CP_PER_INDEX_2_ENTRY) { // The index-3 block is the same as the previous one, and filled with value. U_ASSERT((c & (UCPTRIE_CP_PER_INDEX_2_ENTRY - 1)) == 0); @@ -341,7 +341,7 @@ UChar32 getRange(const void *t, UChar32 start, // 18-bit indexes stored in groups of 9 entries per 8 indexes. int32_t group = (i3Block & 0x7fff) + (i3 & ~7) + (i3 >> 3); int32_t gi = i3 & 7; - block = ((int32_t)index[group++] << (2 + (2 * gi))) & 0x30000; + block = (static_cast<int32_t>(index[group++]) << (2 + (2 * gi))) & 0x30000; block |= index[group + gi]; } if (block == prevBlock && (c - start) >= dataBlockLength) { diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 70b1bbf2239dd9..cccf1130ae8e63 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -22,7 +22,6 @@ #include "unicode/usetiter.h" #include "unicode/utf16.h" #include "ustr_imp.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -131,7 +130,7 @@ class EquivIterator : public icu::UMemory { const icu::UnicodeString * EquivIterator::next() { - const icu::UnicodeString* _next = (const icu::UnicodeString*) _hash.get(*_current); + const icu::UnicodeString* _next = static_cast<const icu::UnicodeString*>(_hash.get(*_current)); if (_next == nullptr) { U_ASSERT(_current == _start); return nullptr; @@ -261,7 +260,7 @@ currSymbolsEquiv_cleanup() */ static void U_CALLCONV deleteIsoCodeEntry(void *obj) { - IsoCodeEntry *entry = (IsoCodeEntry*)obj; + IsoCodeEntry* entry = static_cast<IsoCodeEntry*>(obj); uprv_free(entry); } @@ -270,7 +269,7 @@ deleteIsoCodeEntry(void *obj) { */ static void U_CALLCONV deleteUnicode(void *obj) { - icu::UnicodeString *entry = (icu::UnicodeString*)obj; + icu::UnicodeString* entry = static_cast<icu::UnicodeString*>(obj); delete entry; } @@ -296,7 +295,7 @@ myUCharsToChars(char* resultOfLen4, const char16_t* currency) { static const int32_t* _findMetaData(const char16_t* currency, UErrorCode& ec) { - if (currency == 0 || *currency == 0) { + if (currency == nullptr || *currency == 0) { if (U_SUCCESS(ec)) { ec = U_ILLEGAL_ARGUMENT_ERROR; } @@ -307,10 +306,9 @@ _findMetaData(const char16_t* currency, UErrorCode& ec) { // move out of the root locale file later; if it does, update this // code.] UResourceBundle* currencyData = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &ec); - UResourceBundle* currencyMeta = ures_getByKey(currencyData, CURRENCY_META, currencyData, &ec); + LocalUResourceBundlePointer currencyMeta(ures_getByKey(currencyData, CURRENCY_META, currencyData, &ec)); if (U_FAILURE(ec)) { - ures_close(currencyMeta); // Config/build error; return hard-coded defaults return LAST_RESORT_DATA; } @@ -318,41 +316,34 @@ _findMetaData(const char16_t* currency, UErrorCode& ec) { // Look up our currency, or if that's not available, then DEFAULT char buf[ISO_CURRENCY_CODE_LENGTH+1]; UErrorCode ec2 = U_ZERO_ERROR; // local error code: soft failure - UResourceBundle* rb = ures_getByKey(currencyMeta, myUCharsToChars(buf, currency), nullptr, &ec2); + LocalUResourceBundlePointer rb(ures_getByKey(currencyMeta.getAlias(), myUCharsToChars(buf, currency), nullptr, &ec2)); if (U_FAILURE(ec2)) { - ures_close(rb); - rb = ures_getByKey(currencyMeta,DEFAULT_META, nullptr, &ec); + rb.adoptInstead(ures_getByKey(currencyMeta.getAlias(),DEFAULT_META, nullptr, &ec)); if (U_FAILURE(ec)) { - ures_close(currencyMeta); - ures_close(rb); // Config/build error; return hard-coded defaults return LAST_RESORT_DATA; } } int32_t len; - const int32_t *data = ures_getIntVector(rb, &len, &ec); + const int32_t *data = ures_getIntVector(rb.getAlias(), &len, &ec); if (U_FAILURE(ec) || len != 4) { // Config/build error; return hard-coded defaults if (U_SUCCESS(ec)) { ec = U_INVALID_FORMAT_ERROR; } - ures_close(currencyMeta); - ures_close(rb); return LAST_RESORT_DATA; } - ures_close(currencyMeta); - ures_close(rb); return data; } // ------------------------------------- -static void -idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec) +static CharString +idForLocale(const char* locale, UErrorCode* ec) { - ulocimp_getRegionForSupplementalData(locale, false, countryAndVariant, capacity, ec); + return ulocimp_getRegionForSupplementalData(locale, false, *ec); } // ------------------------------------------ @@ -371,7 +362,7 @@ U_CDECL_END struct CReg; static UMutex gCRegLock; -static CReg* gCRegHead = 0; +static CReg* gCRegHead = nullptr; struct CReg : public icu::UMemory { CReg *next; @@ -379,14 +370,10 @@ struct CReg : public icu::UMemory { char id[ULOC_FULLNAME_CAPACITY]; CReg(const char16_t* _iso, const char* _id) - : next(0) + : next(nullptr) { - int32_t len = (int32_t)uprv_strlen(_id); - if (len > (int32_t)(sizeof(id)-1)) { - len = (sizeof(id)-1); - } - uprv_strncpy(id, _id, len); - id[len] = 0; + uprv_strncpy(id, _id, sizeof(id)-1); + id[sizeof(id)-1] = 0; u_memcpy(iso, _iso, ISO_CURRENCY_CODE_LENGTH); iso[ISO_CURRENCY_CODE_LENGTH] = 0; } @@ -408,7 +395,7 @@ struct CReg : public icu::UMemory { } *status = U_MEMORY_ALLOCATION_ERROR; } - return 0; + return nullptr; } static UBool unreg(UCurrRegistryKey key) { @@ -464,9 +451,8 @@ U_CAPI UCurrRegistryKey U_EXPORT2 ucurr_register(const char16_t* isoCode, const char* locale, UErrorCode *status) { if (status && U_SUCCESS(*status)) { - char id[ULOC_FULLNAME_CAPACITY]; - idForLocale(locale, id, sizeof(id), status); - return CReg::reg(isoCode, id, status); + CharString id = idForLocale(locale, status); + return CReg::reg(isoCode, id.data(), status); } return nullptr; } @@ -524,11 +510,7 @@ ucurr_forLocale(const char* locale, } UErrorCode localStatus = U_ZERO_ERROR; - CharString currency; - { - CharStringByteSink sink(¤cy); - ulocimp_getKeywordValue(locale, "currency", sink, &localStatus); - } + CharString currency = ulocimp_getKeywordValue(locale, "currency", localStatus); int32_t resLen = currency.length(); if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency.data(), resLen)) { @@ -540,14 +522,13 @@ ucurr_forLocale(const char* locale, } // get country or country_variant in `id' - char id[ULOC_FULLNAME_CAPACITY]; - idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { return 0; } #if !UCONFIG_NO_SERVICE - const char16_t* result = CReg::get(id); + const char16_t* result = CReg::get(id.data()); if (result) { if(buffCapacity > u_strlen(result)) { u_strcpy(buff, result); @@ -557,13 +538,13 @@ ucurr_forLocale(const char* locale, } #endif // Remove variants, which is only needed for registration. - char *idDelim = uprv_strchr(id, VAR_DELIM); + char *idDelim = uprv_strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } const char16_t* s = nullptr; // Currency code from data file. - if (id[0] == 0) { + if (id.isEmpty()) { // No point looking in the data for an empty string. // This is what we would get. localStatus = U_MISSING_RESOURCE_ERROR; @@ -572,14 +553,14 @@ ucurr_forLocale(const char* locale, localStatus = U_ZERO_ERROR; UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus)); // https://unicode-org.atlassian.net/browse/ICU-21997 // Prefer to use currencies that are legal tender. if (U_SUCCESS(localStatus)) { - int32_t arrayLength = ures_getSize(countryArray); + int32_t arrayLength = ures_getSize(countryArray.getAlias()); for (int32_t i = 0; i < arrayLength; ++i) { LocalUResourceBundlePointer currencyReq( - ures_getByIndex(countryArray, i, nullptr, &localStatus)); + ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus)); // The currency is legal tender if it is *not* marked with tender{"false"}. UErrorCode tenderStatus = localStatus; const char16_t *tender = @@ -599,16 +580,11 @@ ucurr_forLocale(const char* locale, localStatus = U_MISSING_RESOURCE_ERROR; } } - ures_close(countryArray); } - if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) { + if ((U_FAILURE(localStatus)) && strchr(id.data(), '_') != nullptr) { // We don't know about it. Check to see if we support the variant. - CharString parent; - { - CharStringByteSink sink(&parent); - ulocimp_getParent(locale, sink, ec); - } + CharString parent = ulocimp_getParent(locale, *ec); *ec = U_USING_FALLBACK_WARNING; // TODO: Loop over the parent rather than recursing and // looking again for a currency keyword. @@ -647,10 +623,7 @@ static UBool fallback(CharString& loc) { loc.truncate(3); loc.append("001", status); } else { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(loc.data(), sink, &status); - loc = std::move(tmp); + loc = ulocimp_getParent(loc.data(), status); } /* char *i = uprv_strrchr(loc, '_'); @@ -683,13 +656,13 @@ ucurr_getName(const char16_t* currency, //|} if (U_FAILURE(*ec)) { - return 0; + return nullptr; } int32_t choice = (int32_t) nameStyle; if (choice < 0 || choice > 4) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } // In the future, resource bundles may implement multi-level @@ -705,14 +678,13 @@ ucurr_getName(const char16_t* currency, // this function. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); + if (locale == nullptr) { + locale = uloc_getDefault(); } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } char buf[ISO_CURRENCY_CODE_LENGTH+1]; @@ -739,7 +711,7 @@ ucurr_getName(const char16_t* currency, break; default: *ec = U_UNSUPPORTED_ERROR; - return 0; + return nullptr; } key.append("/", ec2); key.append(buf, ec2); @@ -800,21 +772,20 @@ ucurr_getPluralName(const char16_t* currency, //|} if (U_FAILURE(*ec)) { - return 0; + return nullptr; } // Use a separate UErrorCode here that does not propagate out of // this function. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); + if (locale == nullptr) { + locale = uloc_getDefault(); } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { *ec = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } char buf[ISO_CURRENCY_CODE_LENGTH+1]; @@ -827,21 +798,19 @@ ucurr_getPluralName(const char16_t* currency, rb = ures_getByKey(rb, CURRENCYPLURALS, rb, &ec2); // Fetch resource with multi-level resource inheritance fallback - rb = ures_getByKeyWithFallback(rb, buf, rb, &ec2); + LocalUResourceBundlePointer curr(ures_getByKeyWithFallback(rb, buf, rb, &ec2)); - s = ures_getStringByKeyWithFallback(rb, pluralCount, len, &ec2); + s = ures_getStringByKeyWithFallback(curr.getAlias(), pluralCount, len, &ec2); if (U_FAILURE(ec2)) { // fall back to "other" ec2 = U_ZERO_ERROR; - s = ures_getStringByKeyWithFallback(rb, "other", len, &ec2); + s = ures_getStringByKeyWithFallback(curr.getAlias(), "other", len, &ec2); if (U_FAILURE(ec2)) { - ures_close(rb); // fall back to long name in Currencies return ucurr_getName(currency, locale, UCURR_LONG_NAME, isChoiceFormat, len, ec); } } - ures_close(rb); // If we've succeeded we're done. Otherwise, try to fallback. // If that fails (because we are already at root) then exit. @@ -888,8 +857,8 @@ typedef struct { // Comparison function used in quick sort. static int U_CALLCONV currencyNameComparator(const void* a, const void* b) { - const CurrencyNameStruct* currName_1 = (const CurrencyNameStruct*)a; - const CurrencyNameStruct* currName_2 = (const CurrencyNameStruct*)b; + const CurrencyNameStruct* currName_1 = static_cast<const CurrencyNameStruct*>(a); + const CurrencyNameStruct* currName_2 = static_cast<const CurrencyNameStruct*>(b); for (int32_t i = 0; i < MIN(currName_1->currencyNameLen, currName_2->currencyNameLen); ++i) { @@ -933,34 +902,29 @@ getCurrencyNameCount(const char* loc, int32_t* total_currency_name_count, int32_ for (;;) { UErrorCode ec2 = U_ZERO_ERROR; // TODO: ures_openDirect? - UResourceBundle* rb = ures_open(U_ICUDATA_CURR, locale.data(), &ec2); - UResourceBundle* curr = ures_getByKey(rb, CURRENCIES, nullptr, &ec2); - int32_t n = ures_getSize(curr); + LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, locale.data(), &ec2)); + LocalUResourceBundlePointer curr(ures_getByKey(rb.getAlias(), CURRENCIES, nullptr, &ec2)); + int32_t n = ures_getSize(curr.getAlias()); for (int32_t i=0; i<n; ++i) { - UResourceBundle* names = ures_getByIndex(curr, i, nullptr, &ec2); + LocalUResourceBundlePointer names(ures_getByIndex(curr.getAlias(), i, nullptr, &ec2)); int32_t len; - s = ures_getStringByIndex(names, UCURR_SYMBOL_NAME, &len, &ec2); + s = ures_getStringByIndex(names.getAlias(), UCURR_SYMBOL_NAME, &len, &ec2); ++(*total_currency_symbol_count); // currency symbol if (currencySymbolsEquiv != nullptr) { *total_currency_symbol_count += countEquivalent(*currencySymbolsEquiv, UnicodeString(true, s, len)); } ++(*total_currency_symbol_count); // iso code ++(*total_currency_name_count); // long name - ures_close(names); } // currency plurals UErrorCode ec3 = U_ZERO_ERROR; - UResourceBundle* curr_p = ures_getByKey(rb, CURRENCYPLURALS, nullptr, &ec3); - n = ures_getSize(curr_p); + LocalUResourceBundlePointer curr_p(ures_getByKey(rb.getAlias(), CURRENCYPLURALS, nullptr, &ec3)); + n = ures_getSize(curr_p.getAlias()); for (int32_t i=0; i<n; ++i) { - UResourceBundle* names = ures_getByIndex(curr_p, i, nullptr, &ec3); - *total_currency_name_count += ures_getSize(names); - ures_close(names); + LocalUResourceBundlePointer names(ures_getByIndex(curr_p.getAlias(), i, nullptr, &ec3)); + *total_currency_name_count += ures_getSize(names.getAlias()); } - ures_close(curr_p); - ures_close(curr); - ures_close(rb); if (!fallback(locale)) { break; @@ -975,7 +939,10 @@ toUpperCase(const char16_t* source, int32_t len, const char* locale) { int32_t destLen = u_strToUpper(dest, 0, source, len, locale, &ec); ec = U_ZERO_ERROR; - dest = (char16_t*)uprv_malloc(sizeof(char16_t) * MAX(destLen, len)); + dest = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * MAX(destLen, len))); + if (dest == nullptr) { + return nullptr; + } u_strToUpper(dest, destLen, source, len, locale, &ec); if (U_FAILURE(ec)) { u_memcpy(dest, source, len); @@ -984,6 +951,7 @@ toUpperCase(const char16_t* source, int32_t len, const char* locale) { } +static void deleteCurrencyNames(CurrencyNameStruct* currencyNames, int32_t count); // Collect all available currency names associated with the given locale // (enable fallback chain). // Read currenc names defined in resource bundle "Currencies" and @@ -997,33 +965,48 @@ collectCurrencyNames(const char* locale, CurrencyNameStruct** currencySymbols, int32_t* total_currency_symbol_count, UErrorCode& ec) { + if (U_FAILURE(ec)) { + *currencyNames = *currencySymbols = nullptr; + *total_currency_name_count = *total_currency_symbol_count = 0; + return; + } U_NAMESPACE_USE const icu::Hashtable *currencySymbolsEquiv = getCurrSymbolsEquiv(); // Look up the Currencies resource for the given locale. UErrorCode ec2 = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_getName(locale, sink, &ec2); + if (locale == nullptr) { + locale = uloc_getDefault(); } + CharString loc = ulocimp_getName(locale, ec2); if (U_FAILURE(ec2)) { ec = U_ILLEGAL_ARGUMENT_ERROR; + *currencyNames = *currencySymbols = nullptr; + *total_currency_name_count = *total_currency_symbol_count = 0; + return; } // Get maximum currency name count first. getCurrencyNameCount(loc.data(), total_currency_name_count, total_currency_symbol_count); - *currencyNames = (CurrencyNameStruct*)uprv_malloc - (sizeof(CurrencyNameStruct) * (*total_currency_name_count)); - *currencySymbols = (CurrencyNameStruct*)uprv_malloc - (sizeof(CurrencyNameStruct) * (*total_currency_symbol_count)); - - if(currencyNames == nullptr || currencySymbols == nullptr) { - ec = U_MEMORY_ALLOCATION_ERROR; + *currencyNames = static_cast<CurrencyNameStruct*>( + uprv_malloc(sizeof(CurrencyNameStruct) * (*total_currency_name_count))); + if(*currencyNames == nullptr) { + *currencySymbols = nullptr; + *total_currency_name_count = *total_currency_symbol_count = 0; + ec = U_MEMORY_ALLOCATION_ERROR; + return; } + *currencySymbols = static_cast<CurrencyNameStruct*>( + uprv_malloc(sizeof(CurrencyNameStruct) * (*total_currency_symbol_count))); - if (U_FAILURE(ec)) return; + if(*currencySymbols == nullptr) { + uprv_free(*currencyNames); + *currencyNames = nullptr; + *total_currency_name_count = *total_currency_symbol_count = 0; + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } const char16_t* s = nullptr; // currency name char* iso = nullptr; // currency ISO code @@ -1035,113 +1018,91 @@ collectCurrencyNames(const char* locale, UErrorCode ec4 = U_ZERO_ERROR; // Using hash to remove duplicates caused by locale fallback - UHashtable* currencyIsoCodes = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &ec3); - UHashtable* currencyPluralIsoCodes = uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &ec4); + LocalUHashtablePointer currencyIsoCodes(uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &ec3)); + LocalUHashtablePointer currencyPluralIsoCodes(uhash_open(uhash_hashChars, uhash_compareChars, nullptr, &ec4)); for (int32_t localeLevel = 0; ; ++localeLevel) { ec2 = U_ZERO_ERROR; // TODO: ures_openDirect - UResourceBundle* rb = ures_open(U_ICUDATA_CURR, loc.data(), &ec2); - UResourceBundle* curr = ures_getByKey(rb, CURRENCIES, nullptr, &ec2); - int32_t n = ures_getSize(curr); + LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc.data(), &ec2)); + LocalUResourceBundlePointer curr(ures_getByKey(rb.getAlias(), CURRENCIES, nullptr, &ec2)); + int32_t n = ures_getSize(curr.getAlias()); for (int32_t i=0; i<n; ++i) { - UResourceBundle* names = ures_getByIndex(curr, i, nullptr, &ec2); + LocalUResourceBundlePointer names(ures_getByIndex(curr.getAlias(), i, nullptr, &ec2)); int32_t len; - s = ures_getStringByIndex(names, UCURR_SYMBOL_NAME, &len, &ec2); + s = ures_getStringByIndex(names.getAlias(), UCURR_SYMBOL_NAME, &len, &ec2); // TODO: uhash_put wont change key/value? - iso = (char*)ures_getKey(names); - if (localeLevel == 0) { - uhash_put(currencyIsoCodes, iso, iso, &ec3); - } else { - if (uhash_get(currencyIsoCodes, iso) != nullptr) { - ures_close(names); - continue; - } else { - uhash_put(currencyIsoCodes, iso, iso, &ec3); - } + iso = const_cast<char*>(ures_getKey(names.getAlias())); + if (localeLevel != 0 && uhash_get(currencyIsoCodes.getAlias(), iso) != nullptr) { + continue; } + uhash_put(currencyIsoCodes.getAlias(), iso, iso, &ec3); // Add currency symbol. - (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; - (*currencySymbols)[*total_currency_symbol_count].currencyName = (char16_t*)s; - (*currencySymbols)[*total_currency_symbol_count].flag = 0; - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = len; + (*currencySymbols)[(*total_currency_symbol_count)++] = {iso, const_cast<char16_t*>(s), len, 0}; + // Add equivalent symbols if (currencySymbolsEquiv != nullptr) { UnicodeString str(true, s, len); icu::EquivIterator iter(*currencySymbolsEquiv, str); const UnicodeString *symbol; while ((symbol = iter.next()) != nullptr) { - (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; - (*currencySymbols)[*total_currency_symbol_count].currencyName = - const_cast<char16_t*>(symbol->getBuffer()); - (*currencySymbols)[*total_currency_symbol_count].flag = 0; - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = symbol->length(); + (*currencySymbols)[(*total_currency_symbol_count)++] + = {iso, const_cast<char16_t*>(symbol->getBuffer()), symbol->length(), 0}; } } // Add currency long name. - s = ures_getStringByIndex(names, UCURR_LONG_NAME, &len, &ec2); - (*currencyNames)[*total_currency_name_count].IsoCode = iso; + s = ures_getStringByIndex(names.getAlias(), UCURR_LONG_NAME, &len, &ec2); char16_t* upperName = toUpperCase(s, len, locale); - (*currencyNames)[*total_currency_name_count].currencyName = upperName; - (*currencyNames)[*total_currency_name_count].flag = NEED_TO_BE_DELETED; - (*currencyNames)[(*total_currency_name_count)++].currencyNameLen = len; + if (upperName == nullptr) { + ec = U_MEMORY_ALLOCATION_ERROR; + goto error; + } + (*currencyNames)[(*total_currency_name_count)++] = {iso, upperName, len, NEED_TO_BE_DELETED}; // put (iso, 3, and iso) in to array // Add currency ISO code. - (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; - (*currencySymbols)[*total_currency_symbol_count].currencyName = (char16_t*)uprv_malloc(sizeof(char16_t)*3); + char16_t* isoCode = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * 3)); + if (isoCode == nullptr) { + ec = U_MEMORY_ALLOCATION_ERROR; + goto error; + } // Must convert iso[] into Unicode - u_charsToUChars(iso, (*currencySymbols)[*total_currency_symbol_count].currencyName, 3); - (*currencySymbols)[*total_currency_symbol_count].flag = NEED_TO_BE_DELETED; - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = 3; - - ures_close(names); + u_charsToUChars(iso, isoCode, 3); + (*currencySymbols)[(*total_currency_symbol_count)++] = {iso, isoCode, 3, NEED_TO_BE_DELETED}; } // currency plurals UErrorCode ec5 = U_ZERO_ERROR; - UResourceBundle* curr_p = ures_getByKey(rb, CURRENCYPLURALS, nullptr, &ec5); - n = ures_getSize(curr_p); + LocalUResourceBundlePointer curr_p(ures_getByKey(rb.getAlias(), CURRENCYPLURALS, nullptr, &ec5)); + n = ures_getSize(curr_p.getAlias()); for (int32_t i=0; i<n; ++i) { - UResourceBundle* names = ures_getByIndex(curr_p, i, nullptr, &ec5); - iso = (char*)ures_getKey(names); + LocalUResourceBundlePointer names(ures_getByIndex(curr_p.getAlias(), i, nullptr, &ec5)); + iso = const_cast<char*>(ures_getKey(names.getAlias())); // Using hash to remove duplicated ISO codes in fallback chain. - if (localeLevel == 0) { - uhash_put(currencyPluralIsoCodes, iso, iso, &ec4); - } else { - if (uhash_get(currencyPluralIsoCodes, iso) != nullptr) { - ures_close(names); - continue; - } else { - uhash_put(currencyPluralIsoCodes, iso, iso, &ec4); - } + if (localeLevel != 0 && uhash_get(currencyPluralIsoCodes.getAlias(), iso) != nullptr) { + continue; } - int32_t num = ures_getSize(names); + uhash_put(currencyPluralIsoCodes.getAlias(), iso, iso, &ec4); + int32_t num = ures_getSize(names.getAlias()); int32_t len; for (int32_t j = 0; j < num; ++j) { // TODO: remove duplicates between singular name and // currency long name? - s = ures_getStringByIndex(names, j, &len, &ec5); - (*currencyNames)[*total_currency_name_count].IsoCode = iso; + s = ures_getStringByIndex(names.getAlias(), j, &len, &ec5); char16_t* upperName = toUpperCase(s, len, locale); - (*currencyNames)[*total_currency_name_count].currencyName = upperName; - (*currencyNames)[*total_currency_name_count].flag = NEED_TO_BE_DELETED; - (*currencyNames)[(*total_currency_name_count)++].currencyNameLen = len; + if (upperName == nullptr) { + ec = U_MEMORY_ALLOCATION_ERROR; + goto error; + } + (*currencyNames)[(*total_currency_name_count)++] = {iso, upperName, len, NEED_TO_BE_DELETED}; } - ures_close(names); } - ures_close(curr_p); - ures_close(curr); - ures_close(rb); if (!fallback(loc)) { break; } } - uhash_close(currencyIsoCodes); - uhash_close(currencyPluralIsoCodes); - // quick sort the struct qsort(*currencyNames, *total_currency_name_count, sizeof(CurrencyNameStruct), currencyNameComparator); @@ -1173,11 +1134,17 @@ collectCurrencyNames(const char* locale, // fail on hashtable errors if (U_FAILURE(ec3)) { ec = ec3; - return; - } - if (U_FAILURE(ec4)) { + } else if (U_FAILURE(ec4)) { ec = ec4; - return; + } + + error: + // clean up if we got error + if (U_FAILURE(ec)) { + deleteCurrencyNames(*currencyNames, *total_currency_name_count); + deleteCurrencyNames(*currencySymbols, *total_currency_symbol_count); + *currencyNames = *currencySymbols = nullptr; + *total_currency_name_count = *total_currency_symbol_count = 0; } } @@ -1390,7 +1357,6 @@ searchCurrencyName(const CurrencyNameStruct* currencyNames, break; } } - return; } //========================= currency name cache ===================== @@ -1447,7 +1413,7 @@ currency_cache_cleanup() { for (int32_t i = 0; i < CURRENCY_NAME_CACHE_NUM; ++i) { if (currCache[i]) { deleteCacheEntry(currCache[i]); - currCache[i] = 0; + currCache[i] = nullptr; } } return true; @@ -1512,7 +1478,13 @@ getCacheEntry(const char* locale, UErrorCode& ec) { deleteCacheEntry(cacheEntry); } } - cacheEntry = (CurrencyNameCacheEntry*)uprv_malloc(sizeof(CurrencyNameCacheEntry)); + cacheEntry = static_cast<CurrencyNameCacheEntry*>(uprv_malloc(sizeof(CurrencyNameCacheEntry))); + if (cacheEntry == nullptr) { + deleteCurrencyNames(currencyNames, total_currency_name_count); + deleteCurrencyNames(currencySymbols, total_currency_symbol_count); + ec = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } currCache[currentCacheEntryIndex] = cacheEntry; uprv_strcpy(cacheEntry->locale, locale); cacheEntry->currencyNames = currencyNames; @@ -2030,6 +2002,7 @@ static const struct CurrencyList { {"XBC", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XBD", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XCD", UCURR_COMMON|UCURR_NON_DEPRECATED}, + {"XCG", UCURR_COMMON|UCURR_NON_DEPRECATED}, {"XDR", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, {"XEU", UCURR_UNCOMMON|UCURR_DEPRECATED}, {"XFO", UCURR_UNCOMMON|UCURR_NON_DEPRECATED}, @@ -2056,6 +2029,7 @@ static const struct CurrencyList { {"ZRN", UCURR_COMMON|UCURR_DEPRECATED}, {"ZRZ", UCURR_COMMON|UCURR_DEPRECATED}, {"ZWD", UCURR_COMMON|UCURR_DEPRECATED}, + {"ZWG", UCURR_COMMON|UCURR_NON_DEPRECATED}, {"ZWL", UCURR_COMMON|UCURR_DEPRECATED}, {"ZWR", UCURR_COMMON|UCURR_DEPRECATED}, { nullptr, 0 } // Leave here to denote the end of the list. @@ -2121,18 +2095,18 @@ ucurr_createCurrencyList(UHashtable *isoCodes, UErrorCode* status){ // Look up the CurrencyMap element in the root bundle. UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); - UResourceBundle *currencyMapArray = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); + LocalUResourceBundlePointer currencyMapArray(ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus)); if (U_SUCCESS(localStatus)) { - // process each entry in currency map - for (int32_t i=0; i<ures_getSize(currencyMapArray); i++) { + // process each entry in currency map + for (int32_t i=0; i<ures_getSize(currencyMapArray.getAlias()); i++) { // get the currency resource - UResourceBundle *currencyArray = ures_getByIndex(currencyMapArray, i, nullptr, &localStatus); - // process each currency + LocalUResourceBundlePointer currencyArray(ures_getByIndex(currencyMapArray.getAlias(), i, nullptr, &localStatus)); + // process each currency if (U_SUCCESS(localStatus)) { - for (int32_t j=0; j<ures_getSize(currencyArray); j++) { + for (int32_t j=0; j<ures_getSize(currencyArray.getAlias()); j++) { // get the currency resource - UResourceBundle *currencyRes = ures_getByIndex(currencyArray, j, nullptr, &localStatus); + LocalUResourceBundlePointer currencyRes(ures_getByIndex(currencyArray.getAlias(), j, nullptr, &localStatus)); IsoCodeEntry *entry = (IsoCodeEntry*)uprv_malloc(sizeof(IsoCodeEntry)); if (entry == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -2141,41 +2115,36 @@ ucurr_createCurrencyList(UHashtable *isoCodes, UErrorCode* status){ // get the ISO code int32_t isoLength = 0; - UResourceBundle *idRes = ures_getByKey(currencyRes, "id", nullptr, &localStatus); - if (idRes == nullptr) { + LocalUResourceBundlePointer idRes(ures_getByKey(currencyRes.getAlias(), "id", nullptr, &localStatus)); + if (idRes.isNull()) { continue; } - const char16_t *isoCode = ures_getString(idRes, &isoLength, &localStatus); + const char16_t *isoCode = ures_getString(idRes.getAlias(), &isoLength, &localStatus); // get from date UDate fromDate = U_DATE_MIN; - UResourceBundle *fromRes = ures_getByKey(currencyRes, "from", nullptr, &localStatus); + LocalUResourceBundlePointer fromRes(ures_getByKey(currencyRes.getAlias(), "from", nullptr, &localStatus)); if (U_SUCCESS(localStatus)) { int32_t fromLength = 0; - const int32_t *fromArray = ures_getIntVector(fromRes, &fromLength, &localStatus); + const int32_t *fromArray = ures_getIntVector(fromRes.getAlias(), &fromLength, &localStatus); int64_t currDate64 = ((uint64_t)fromArray[0]) << 32; currDate64 |= ((int64_t)fromArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); fromDate = (UDate)currDate64; } - ures_close(fromRes); // get to date UDate toDate = U_DATE_MAX; localStatus = U_ZERO_ERROR; - UResourceBundle *toRes = ures_getByKey(currencyRes, "to", nullptr, &localStatus); + LocalUResourceBundlePointer toRes(ures_getByKey(currencyRes.getAlias(), "to", nullptr, &localStatus)); if (U_SUCCESS(localStatus)) { int32_t toLength = 0; - const int32_t *toArray = ures_getIntVector(toRes, &toLength, &localStatus); + const int32_t *toArray = ures_getIntVector(toRes.getAlias(), &toLength, &localStatus); int64_t currDate64 = (uint64_t)toArray[0] << 32; currDate64 |= ((int64_t)toArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); toDate = (UDate)currDate64; } - ures_close(toRes); - - ures_close(idRes); - ures_close(currencyRes); entry->isoCode = isoCode; entry->from = fromDate; @@ -2187,13 +2156,10 @@ ucurr_createCurrencyList(UHashtable *isoCodes, UErrorCode* status){ } else { *status = localStatus; } - ures_close(currencyArray); } } else { *status = localStatus; } - - ures_close(currencyMapArray); } static const UEnumeration gEnumCurrencyList = { @@ -2212,24 +2178,23 @@ static void U_CALLCONV initIsoCodes(UErrorCode &status) { U_ASSERT(gIsoCodes == nullptr); ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup); - UHashtable *isoCodes = uhash_open(uhash_hashUChars, uhash_compareUChars, nullptr, &status); + LocalUHashtablePointer isoCodes(uhash_open(uhash_hashUChars, uhash_compareUChars, nullptr, &status)); if (U_FAILURE(status)) { return; } - uhash_setValueDeleter(isoCodes, deleteIsoCodeEntry); + uhash_setValueDeleter(isoCodes.getAlias(), deleteIsoCodeEntry); - ucurr_createCurrencyList(isoCodes, &status); + ucurr_createCurrencyList(isoCodes.getAlias(), &status); if (U_FAILURE(status)) { - uhash_close(isoCodes); return; } - gIsoCodes = isoCodes; // Note: gIsoCodes is const. Once set up here it is never altered, - // and read only access is safe without synchronization. + gIsoCodes = isoCodes.orphan(); // Note: gIsoCodes is const. Once set up here it is never altered, + // and read only access is safe without synchronization. } static void populateCurrSymbolsEquiv(icu::Hashtable *hash, UErrorCode &status) { if (U_FAILURE(status)) { return; } - for (auto& entry : unisets::kCurrencyEntries) { + for (const auto& entry : unisets::kCurrencyEntries) { UnicodeString exemplar(entry.exemplar); const UnicodeSet* set = unisets::get(entry.key); if (set == nullptr) { return; } @@ -2325,10 +2290,9 @@ ucurr_countCurrencies(const char* locale, { // local variables UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; // get country or country_variant in `id' - idForLocale(locale, id, sizeof(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { @@ -2336,10 +2300,10 @@ ucurr_countCurrencies(const char* locale, } // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); + char *idDelim = strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } // Look up the CurrencyMap element in the root bundle. @@ -2347,30 +2311,30 @@ ucurr_countCurrencies(const char* locale, UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); // Using the id derived from the local, get the currency data - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus)); // process each currency to see which one is valid for the given date if (U_SUCCESS(localStatus)) { - for (int32_t i=0; i<ures_getSize(countryArray); i++) + for (int32_t i=0; i<ures_getSize(countryArray.getAlias()); i++) { // get the currency resource - UResourceBundle *currencyRes = ures_getByIndex(countryArray, i, nullptr, &localStatus); + LocalUResourceBundlePointer currencyRes(ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus)); // get the from date int32_t fromLength = 0; - UResourceBundle *fromRes = ures_getByKey(currencyRes, "from", nullptr, &localStatus); - const int32_t *fromArray = ures_getIntVector(fromRes, &fromLength, &localStatus); + LocalUResourceBundlePointer fromRes(ures_getByKey(currencyRes.getAlias(), "from", nullptr, &localStatus)); + const int32_t *fromArray = ures_getIntVector(fromRes.getAlias(), &fromLength, &localStatus); int64_t currDate64 = (int64_t)((uint64_t)(fromArray[0]) << 32); currDate64 |= ((int64_t)fromArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); UDate fromDate = (UDate)currDate64; - if (ures_getSize(currencyRes)> 2) + if (ures_getSize(currencyRes.getAlias())> 2) { int32_t toLength = 0; - UResourceBundle *toRes = ures_getByKey(currencyRes, "to", nullptr, &localStatus); - const int32_t *toArray = ures_getIntVector(toRes, &toLength, &localStatus); + LocalUResourceBundlePointer toRes(ures_getByKey(currencyRes.getAlias(), "to", nullptr, &localStatus)); + const int32_t *toArray = ures_getIntVector(toRes.getAlias(), &toLength, &localStatus); currDate64 = (int64_t)toArray[0] << 32; currDate64 |= ((int64_t)toArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); @@ -2380,8 +2344,6 @@ ucurr_countCurrencies(const char* locale, { currCount++; } - - ures_close(toRes); } else { @@ -2390,16 +2352,9 @@ ucurr_countCurrencies(const char* locale, currCount++; } } - - // close open resources - ures_close(currencyRes); - ures_close(fromRes); - } // end For loop } // end if (U_SUCCESS(localStatus)) - ures_close(countryArray); - // Check for errors if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { @@ -2413,7 +2368,6 @@ ucurr_countCurrencies(const char* locale, // no errors return currCount; } - } // If we got here, either error code is invalid or @@ -2440,20 +2394,19 @@ ucurr_forLocaleAndDate(const char* locale, { // local variables UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; // get country or country_variant in `id' - idForLocale(locale, id, sizeof(id), ec); + CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { return 0; } // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); + char *idDelim = strchr(id.data(), VAR_DELIM); if (idDelim) { - idDelim[0] = 0; + id.truncate(idDelim - id.data()); } // Look up the CurrencyMap element in the root bundle. @@ -2461,39 +2414,38 @@ ucurr_forLocaleAndDate(const char* locale, UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); // Using the id derived from the local, get the currency data - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + LocalUResourceBundlePointer countryArray(ures_getByKey(rb, id.data(), cm, &localStatus)); // process each currency to see which one is valid for the given date bool matchFound = false; if (U_SUCCESS(localStatus)) { - if ((index <= 0) || (index> ures_getSize(countryArray))) + if ((index <= 0) || (index> ures_getSize(countryArray.getAlias()))) { // requested index is out of bounds - ures_close(countryArray); return 0; } - for (int32_t i=0; i<ures_getSize(countryArray); i++) + for (int32_t i=0; i<ures_getSize(countryArray.getAlias()); i++) { // get the currency resource - UResourceBundle *currencyRes = ures_getByIndex(countryArray, i, nullptr, &localStatus); - s = ures_getStringByKey(currencyRes, "id", &resLen, &localStatus); + LocalUResourceBundlePointer currencyRes(ures_getByIndex(countryArray.getAlias(), i, nullptr, &localStatus)); + s = ures_getStringByKey(currencyRes.getAlias(), "id", &resLen, &localStatus); // get the from date int32_t fromLength = 0; - UResourceBundle *fromRes = ures_getByKey(currencyRes, "from", nullptr, &localStatus); - const int32_t *fromArray = ures_getIntVector(fromRes, &fromLength, &localStatus); + LocalUResourceBundlePointer fromRes(ures_getByKey(currencyRes.getAlias(), "from", nullptr, &localStatus)); + const int32_t *fromArray = ures_getIntVector(fromRes.getAlias(), &fromLength, &localStatus); int64_t currDate64 = (int64_t)((uint64_t)fromArray[0] << 32); currDate64 |= ((int64_t)fromArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); UDate fromDate = (UDate)currDate64; - if (ures_getSize(currencyRes)> 2) + if (ures_getSize(currencyRes.getAlias()) > 2) { int32_t toLength = 0; - UResourceBundle *toRes = ures_getByKey(currencyRes, "to", nullptr, &localStatus); - const int32_t *toArray = ures_getIntVector(toRes, &toLength, &localStatus); + LocalUResourceBundlePointer toRes(ures_getByKey(currencyRes.getAlias(), "to", nullptr, &localStatus)); + const int32_t *toArray = ures_getIntVector(toRes.getAlias(), &toLength, &localStatus); currDate64 = (int64_t)toArray[0] << 32; currDate64 |= ((int64_t)toArray[1] & (int64_t)INT64_C(0x00000000FFFFFFFF)); @@ -2507,8 +2459,6 @@ ucurr_forLocaleAndDate(const char* locale, matchFound = true; } } - - ures_close(toRes); } else { @@ -2521,11 +2471,6 @@ ucurr_forLocaleAndDate(const char* locale, } } } - - // close open resources - ures_close(currencyRes); - ures_close(fromRes); - // check for loop exit if (matchFound) { @@ -2535,8 +2480,6 @@ ucurr_forLocaleAndDate(const char* locale, } // end For loop } - ures_close(countryArray); - // Check for errors if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { @@ -2587,9 +2530,8 @@ static const UEnumeration defaultKeywordValues = { U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, const char *locale, UBool commonlyUsed, UErrorCode* status) { // Resolve region - char prefRegion[ULOC_COUNTRY_CAPACITY]; - ulocimp_getRegionForSupplementalData(locale, true, prefRegion, sizeof(prefRegion), status); - + CharString prefRegion = ulocimp_getRegionForSupplementalData(locale, true, *status); + // Read value from supplementalData UList *values = ulist_createEmptyList(status); UList *otherValues = ulist_createEmptyList(status); @@ -2607,50 +2549,46 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); en->context = values; - UResourceBundle *bundle = ures_openDirect(U_ICUDATA_CURR, "supplementalData", status); - ures_getByKey(bundle, "CurrencyMap", bundle, status); - UResourceBundle bundlekey, regbndl, curbndl, to; - ures_initStackObject(&bundlekey); - ures_initStackObject(®bndl); - ures_initStackObject(&curbndl); - ures_initStackObject(&to); + UResourceBundle* rb = ures_openDirect(U_ICUDATA_CURR, "supplementalData", status); + LocalUResourceBundlePointer bundle(ures_getByKey(rb, "CurrencyMap", rb, status)); + StackUResourceBundle bundlekey, regbndl, curbndl, to; - while (U_SUCCESS(*status) && ures_hasNext(bundle)) { - ures_getNextResource(bundle, &bundlekey, status); + while (U_SUCCESS(*status) && ures_hasNext(bundle.getAlias())) { + ures_getNextResource(bundle.getAlias(), bundlekey.getAlias(), status); if (U_FAILURE(*status)) { break; } - const char *region = ures_getKey(&bundlekey); - UBool isPrefRegion = uprv_strcmp(region, prefRegion) == 0 ? true : false; + const char *region = ures_getKey(bundlekey.getAlias()); + UBool isPrefRegion = prefRegion == region; if (!isPrefRegion && commonlyUsed) { // With commonlyUsed=true, we do not put // currencies for other regions in the // result list. continue; } - ures_getByKey(bundle, region, ®bndl, status); + ures_getByKey(bundle.getAlias(), region, regbndl.getAlias(), status); if (U_FAILURE(*status)) { break; } - while (U_SUCCESS(*status) && ures_hasNext(®bndl)) { - ures_getNextResource(®bndl, &curbndl, status); - if (ures_getType(&curbndl) != URES_TABLE) { + while (U_SUCCESS(*status) && ures_hasNext(regbndl.getAlias())) { + ures_getNextResource(regbndl.getAlias(), curbndl.getAlias(), status); + if (ures_getType(curbndl.getAlias()) != URES_TABLE) { // Currently, an empty ARRAY is mixed in. continue; } char *curID = (char *)uprv_malloc(sizeof(char) * ULOC_KEYWORDS_CAPACITY); - int32_t curIDLength = ULOC_KEYWORDS_CAPACITY; if (curID == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; break; } + int32_t curIDLength = ULOC_KEYWORDS_CAPACITY; #if U_CHARSET_FAMILY==U_ASCII_FAMILY - ures_getUTF8StringByKey(&curbndl, "id", curID, &curIDLength, true, status); + ures_getUTF8StringByKey(curbndl.getAlias(), "id", curID, &curIDLength, true, status); /* optimize - use the utf-8 string */ #else { - const char16_t* defString = ures_getStringByKey(&curbndl, "id", &curIDLength, status); + const char16_t* defString = ures_getStringByKey(curbndl.getAlias(), "id", &curIDLength, status); if(U_SUCCESS(*status)) { if(curIDLength+1 > ULOC_KEYWORDS_CAPACITY) { *status = U_BUFFER_OVERFLOW_ERROR; @@ -2665,7 +2603,7 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, break; } UBool hasTo = false; - ures_getByKey(&curbndl, "to", &to, status); + ures_getByKey(curbndl.getAlias(), "to", to.getAlias(), status); if (U_FAILURE(*status)) { // Do nothing here... *status = U_ZERO_ERROR; @@ -2698,6 +2636,10 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, while ((value = (char *)ulist_getNext(otherValues)) != nullptr) { if (!ulist_containsString(values, value, (int32_t)uprv_strlen(value))) { char *tmpValue = (char *)uprv_malloc(sizeof(char) * ULOC_KEYWORDS_CAPACITY); + if (tmpValue == nullptr) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } uprv_memcpy(tmpValue, value, uprv_strlen(value) + 1); ulist_addItemEndList(values, tmpValue, true, status); if (U_FAILURE(*status)) { @@ -2706,7 +2648,6 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, } } } - ulist_resetList((UList *)(en->context)); } else { ulist_deleteList(values); @@ -2714,14 +2655,7 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, values = nullptr; en = nullptr; } - ures_close(&to); - ures_close(&curbndl); - ures_close(®bndl); - ures_close(&bundlekey); - ures_close(bundle); - ulist_deleteList(otherValues); - return en; } @@ -2732,19 +2666,18 @@ ucurr_getNumericCode(const char16_t* currency) { if (currency && u_strlen(currency) == ISO_CURRENCY_CODE_LENGTH) { UErrorCode status = U_ZERO_ERROR; - UResourceBundle *bundle = ures_openDirect(0, "currencyNumericCodes", &status); - ures_getByKey(bundle, "codeMap", bundle, &status); + UResourceBundle* bundle = ures_openDirect(nullptr, "currencyNumericCodes", &status); + LocalUResourceBundlePointer codeMap(ures_getByKey(bundle, "codeMap", bundle, &status)); if (U_SUCCESS(status)) { char alphaCode[ISO_CURRENCY_CODE_LENGTH+1]; myUCharsToChars(alphaCode, currency); T_CString_toUpperCase(alphaCode); - ures_getByKey(bundle, alphaCode, bundle, &status); - int tmpCode = ures_getInt(bundle, &status); + ures_getByKey(codeMap.getAlias(), alphaCode, codeMap.getAlias(), &status); + int tmpCode = ures_getInt(codeMap.getAlias(), &status); if (U_SUCCESS(status)) { code = tmpCode; } } - ures_close(bundle); } return code; } diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index 88126fc689a2c3..b9b737f177ed13 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -274,7 +274,7 @@ typedef struct DataCacheElement { * here for each entry. */ static void U_CALLCONV DataCacheElement_deleter(void *pDCEl) { - DataCacheElement *p = (DataCacheElement *)pDCEl; + DataCacheElement* p = static_cast<DataCacheElement*>(pDCEl); udata_close(p->item); /* unmaps storage */ uprv_free(p->name); /* delete the hash key string. */ uprv_free(pDCEl); /* delete 'this' */ @@ -316,7 +316,7 @@ static UDataMemory *udata_findCachedData(const char *path, UErrorCode &err) baseName = findBasename(path); /* Cache remembers only the base name, not the full path. */ umtx_lock(nullptr); - el = (DataCacheElement *)uhash_get(htable, baseName); + el = static_cast<DataCacheElement*>(uhash_get(htable, baseName)); umtx_unlock(nullptr); if (el != nullptr) { retVal = el->item; @@ -344,7 +344,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr /* Create a new DataCacheElement - the thingy we store in the hash table - * and copy the supplied path and UDataMemoryItems into it. */ - newElement = (DataCacheElement *)uprv_malloc(sizeof(DataCacheElement)); + newElement = static_cast<DataCacheElement*>(uprv_malloc(sizeof(DataCacheElement))); if (newElement == nullptr) { *pErr = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -357,8 +357,8 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr UDatamemory_assign(newElement->item, item); baseName = findBasename(path); - nameLen = (int32_t)uprv_strlen(baseName); - newElement->name = (char *)uprv_malloc(nameLen+1); + nameLen = static_cast<int32_t>(uprv_strlen(baseName)); + newElement->name = static_cast<char*>(uprv_malloc(nameLen + 1)); if (newElement->name == nullptr) { *pErr = U_MEMORY_ALLOCATION_ERROR; uprv_free(newElement->item); @@ -370,7 +370,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr /* Stick the new DataCacheElement into the hash table. */ umtx_lock(nullptr); - oldValue = (DataCacheElement *)uhash_get(htable, path); + oldValue = static_cast<DataCacheElement*>(uhash_get(htable, path)); if (oldValue != nullptr) { subErr = U_USING_DEFAULT_WARNING; } @@ -469,13 +469,13 @@ UDataPathIterator::UDataPathIterator(const char *inPath, const char *pkg, /** Item **/ basename = findBasename(item); - basenameLen = (int32_t)uprv_strlen(basename); + basenameLen = static_cast<int32_t>(uprv_strlen(basename)); /** Item path **/ if(basename == item) { nextPath = path; } else { - itemPath.append(item, (int32_t)(basename-item), *pErrorCode); + itemPath.append(item, static_cast<int32_t>(basename - item), *pErrorCode); nextPath = itemPath.data(); } #ifdef UDATA_DEBUG @@ -531,16 +531,16 @@ const char *UDataPathIterator::next(UErrorCode *pErrorCode) if(nextPath == itemPath.data()) { /* we were processing item's path. */ nextPath = path; /* start with regular path next tm. */ - pathLen = (int32_t)uprv_strlen(currentPath); + pathLen = static_cast<int32_t>(uprv_strlen(currentPath)); } else { /* fix up next for next time */ nextPath = uprv_strchr(currentPath, U_PATH_SEP_CHAR); if(nextPath == nullptr) { /* segment: entire path */ - pathLen = (int32_t)uprv_strlen(currentPath); + pathLen = static_cast<int32_t>(uprv_strlen(currentPath)); } else { /* segment: until next segment */ - pathLen = (int32_t)(nextPath - currentPath); + pathLen = static_cast<int32_t>(nextPath - currentPath); /* skip divider */ nextPath ++; } @@ -777,17 +777,6 @@ openCommonData(const char *path, /* Path from OpenChoice? */ return nullptr; } -#if defined(OS390_STUBDATA) && defined(OS390BATCH) - if (!UDataMemory_isLoaded(&tData)) { - char ourPathBuffer[1024]; - /* One more chance, for extendCommonData() */ - uprv_strncpy(ourPathBuffer, path, 1019); - ourPathBuffer[1019]=0; - uprv_strcat(ourPathBuffer, ".dat"); - uprv_mapFile(&tData, ourPathBuffer, pErrorCode); - } -#endif - if (U_FAILURE(*pErrorCode)) { return nullptr; } @@ -850,12 +839,12 @@ static UBool extendICUData(UErrorCode *pErr) UDataMemory_init(©PData); if(pData != nullptr) { UDatamemory_assign(©PData, pData); - copyPData.map = 0; /* The mapping for this data is owned by the hash table */ - copyPData.mapAddr = 0; /* which will unmap it when ICU is shut down. */ - /* CommonICUData is also unmapped when ICU is shut down.*/ - /* To avoid unmapping the data twice, zero out the map */ - /* fields in the UDataMemory that we're assigning */ - /* to CommonICUData. */ + copyPData.map = nullptr; /* The mapping for this data is owned by the hash table */ + copyPData.mapAddr = nullptr; /* which will unmap it when ICU is shut down. */ + /* CommonICUData is also unmapped when ICU is shut down.*/ + /* To avoid unmapping the data twice, zero out the map */ + /* fields in the UDataMemory that we're assigning */ + /* to CommonICUData. */ didUpdate = /* no longer using this result */ setCommonICUData(©PData,/* The new common data. */ @@ -1015,6 +1004,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, * and return it. */ pEntryData->mapAddr = dataMemory.mapAddr; pEntryData->map = dataMemory.map; + pEntryData->length = dataMemory.length; #ifdef UDATA_DEBUG fprintf(stderr, "** Mapped file: %s\n", pathBuffer); @@ -1231,7 +1221,7 @@ doOpenChoice(const char *path, const char *type, const char *name, if(isICUData) { pkgName.append(U_ICUDATA_NAME, *pErrorCode); } else { - pkgName.append(path, (int32_t)(treeChar-path), *pErrorCode); + pkgName.append(path, static_cast<int32_t>(treeChar - path), *pErrorCode); if (first == nullptr) { /* This user data has no path, but there is a tree name. diff --git a/deps/icu-small/source/common/udataswp.cpp b/deps/icu-small/source/common/udataswp.cpp index bbce1a8ecd7500..09adf9510ce114 100644 --- a/deps/icu-small/source/common/udataswp.cpp +++ b/deps/icu-small/source/common/udataswp.cpp @@ -47,12 +47,12 @@ uprv_swapArray16(const UDataSwapper *ds, } /* setup and swapping */ - p=(const uint16_t *)inData; - q=(uint16_t *)outData; + p = static_cast<const uint16_t*>(inData); + q = static_cast<uint16_t*>(outData); count=length/2; while(count>0) { x=*p++; - *q++=(uint16_t)((x<<8)|(x>>8)); + *q++ = static_cast<uint16_t>((x << 8) | (x >> 8)); --count; } @@ -95,12 +95,12 @@ uprv_swapArray32(const UDataSwapper *ds, } /* setup and swapping */ - p=(const uint32_t *)inData; - q=(uint32_t *)outData; + p = static_cast<const uint32_t*>(inData); + q = static_cast<uint32_t*>(outData); count=length/4; while(count>0) { x=*p++; - *q++=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); + *q++ = (x << 24) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | (x >> 24); --count; } @@ -142,8 +142,8 @@ uprv_swapArray64(const UDataSwapper *ds, } /* setup and swapping */ - p=(const uint64_t *)inData; - q=(uint64_t *)outData; + p = static_cast<const uint64_t*>(inData); + q = static_cast<uint64_t*>(outData); count=length/8; while(count>0) { uint64_t x=*p++; @@ -176,7 +176,7 @@ uprv_copyArray64(const UDataSwapper *ds, static uint16_t U_CALLCONV uprv_readSwapUInt16(uint16_t x) { - return (uint16_t)((x<<8)|(x>>8)); + return static_cast<uint16_t>((x << 8) | (x >> 8)); } static uint16_t U_CALLCONV @@ -186,7 +186,7 @@ uprv_readDirectUInt16(uint16_t x) { static uint32_t U_CALLCONV uprv_readSwapUInt32(uint32_t x) { - return (uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); + return (x << 24) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | (x >> 24); } static uint32_t U_CALLCONV @@ -196,7 +196,7 @@ uprv_readDirectUInt32(uint32_t x) { static void U_CALLCONV uprv_writeSwapUInt16(uint16_t *p, uint16_t x) { - *p=(uint16_t)((x<<8)|(x>>8)); + *p = static_cast<uint16_t>((x << 8) | (x >> 8)); } static void U_CALLCONV @@ -206,7 +206,7 @@ uprv_writeDirectUInt16(uint16_t *p, uint16_t x) { static void U_CALLCONV uprv_writeSwapUInt32(uint32_t *p, uint32_t x) { - *p=(uint32_t)((x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)); + *p = (x << 24) | ((x << 8) & 0xff0000) | ((x >> 8) & 0xff00) | (x >> 24); } static void U_CALLCONV @@ -441,7 +441,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, pHeader->info.sizeofUChar!=2 ) { *pErrorCode=U_UNSUPPORTED_ERROR; - return 0; + return nullptr; } inIsBigEndian=(UBool)pHeader->info.isBigEndian; @@ -461,7 +461,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, (length>=0 && length<headerSize) ) { *pErrorCode=U_UNSUPPORTED_ERROR; - return 0; + return nullptr; } return udata_openSwapper(inIsBigEndian, inCharset, outIsBigEndian, outCharset, pErrorCode); diff --git a/deps/icu-small/source/common/uenum.cpp b/deps/icu-small/source/common/uenum.cpp index 7aab58c44c7fdf..b4a5071ae7bc9f 100644 --- a/deps/icu-small/source/common/uenum.cpp +++ b/deps/icu-small/source/common/uenum.cpp @@ -34,14 +34,14 @@ static const int32_t PAD = 8; static void* _getBuffer(UEnumeration* en, int32_t capacity) { if (en->baseContext != nullptr) { - if (((_UEnumBuffer*) en->baseContext)->len < capacity) { + if (static_cast<_UEnumBuffer*>(en->baseContext)->len < capacity) { capacity += PAD; en->baseContext = uprv_realloc(en->baseContext, sizeof(int32_t) + capacity); if (en->baseContext == nullptr) { return nullptr; } - ((_UEnumBuffer*) en->baseContext)->len = capacity; + static_cast<_UEnumBuffer*>(en->baseContext)->len = capacity; } } else { capacity += PAD; @@ -49,10 +49,10 @@ static void* _getBuffer(UEnumeration* en, int32_t capacity) { if (en->baseContext == nullptr) { return nullptr; } - ((_UEnumBuffer*) en->baseContext)->len = capacity; + static_cast<_UEnumBuffer*>(en->baseContext)->len = capacity; } - return (void*) & ((_UEnumBuffer*) en->baseContext)->data; + return static_cast<void*>(&static_cast<_UEnumBuffer*>(en->baseContext)->data); } U_CAPI void U_EXPORT2 diff --git a/deps/icu-small/source/common/uhash.cpp b/deps/icu-small/source/common/uhash.cpp index 4d92dfa93fe1cd..02dc3d04789737 100644 --- a/deps/icu-small/source/common/uhash.cpp +++ b/deps/icu-small/source/common/uhash.cpp @@ -12,6 +12,8 @@ ****************************************************************************** */ +#include <string_view> + #include "uhash.h" #include "unicode/ustring.h" #include "cstring.h" @@ -224,8 +226,8 @@ _uhash_allocate(UHashtable *hash, hash->primeIndex = static_cast<int8_t>(primeIndex); hash->length = PRIMES[primeIndex]; - p = hash->elements = (UHashElement*) - uprv_malloc(sizeof(UHashElement) * hash->length); + p = hash->elements = static_cast<UHashElement*>( + uprv_malloc(sizeof(UHashElement) * hash->length)); if (hash->elements == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -244,8 +246,8 @@ _uhash_allocate(UHashtable *hash, } hash->count = 0; - hash->lowWaterMark = (int32_t)(hash->length * hash->lowWaterRatio); - hash->highWaterMark = (int32_t)(hash->length * hash->highWaterRatio); + hash->lowWaterMark = static_cast<int32_t>(hash->length * hash->lowWaterRatio); + hash->highWaterMark = static_cast<int32_t>(hash->length * hash->highWaterRatio); } static UHashtable* @@ -287,7 +289,7 @@ _uhash_create(UHashFunction *keyHash, if (U_FAILURE(*status)) return nullptr; - result = (UHashtable*) uprv_malloc(sizeof(UHashtable)); + result = static_cast<UHashtable*>(uprv_malloc(sizeof(UHashtable))); if (result == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -944,6 +946,12 @@ uhash_hashIChars(const UHashTok key) { return s == nullptr ? 0 : ustr_hashICharsN(s, static_cast<int32_t>(uprv_strlen(s))); } +U_CAPI int32_t U_EXPORT2 +uhash_hashIStringView(const UHashTok key) { + const std::string_view* s = static_cast<std::string_view*>(key.pointer); + return s == nullptr ? 0 : ustr_hashICharsN(s->data(), static_cast<int32_t>(s->size())); +} + U_CAPI UBool U_EXPORT2 uhash_equals(const UHashtable* hash1, const UHashtable* hash2){ int32_t count1, count2, pos, i; @@ -1014,7 +1022,7 @@ uhash_compareUChars(const UHashTok key1, const UHashTok key2) { ++p1; ++p2; } - return (UBool)(*p1 == *p2); + return *p1 == *p2; } U_CAPI UBool U_EXPORT2 @@ -1031,7 +1039,7 @@ uhash_compareChars(const UHashTok key1, const UHashTok key2) { ++p1; ++p2; } - return (UBool)(*p1 == *p2); + return *p1 == *p2; } U_CAPI UBool U_EXPORT2 @@ -1048,7 +1056,30 @@ uhash_compareIChars(const UHashTok key1, const UHashTok key2) { ++p1; ++p2; } - return (UBool)(*p1 == *p2); + return *p1 == *p2; +} + +U_CAPI UBool U_EXPORT2 +uhash_compareIStringView(const UHashTok key1, const UHashTok key2) { + const std::string_view* p1 = static_cast<std::string_view*>(key1.pointer); + const std::string_view* p2 = static_cast<std::string_view*>(key2.pointer); + if (p1 == p2) { + return true; + } + if (p1 == nullptr || p2 == nullptr) { + return false; + } + const std::string_view& v1 = *p1; + const std::string_view& v2 = *p2; + if (v1.size() != v2.size()) { + return false; + } + for (size_t i = 0; i < v1.size(); ++i) { + if (uprv_tolower(v1[i]) != uprv_tolower(v2[i])) { + return false; + } + } + return true; } /******************************************************************** @@ -1062,5 +1093,5 @@ uhash_hashLong(const UHashTok key) { U_CAPI UBool U_EXPORT2 uhash_compareLong(const UHashTok key1, const UHashTok key2) { - return (UBool)(key1.integer == key2.integer); + return key1.integer == key2.integer; } diff --git a/deps/icu-small/source/common/uhash.h b/deps/icu-small/source/common/uhash.h index 2ce296f0ec7c36..d381670b87b8b2 100644 --- a/deps/icu-small/source/common/uhash.h +++ b/deps/icu-small/source/common/uhash.h @@ -694,6 +694,15 @@ uhash_hashChars(const UHashTok key); U_CAPI int32_t U_EXPORT2 uhash_hashIChars(const UHashTok key); +/** + * Generate a case-insensitive hash code for a std::string_view. + * Use together with uhash_compareIStringView. + * @param key A pointer to the std::string_view to hash. + * @return A hash code for the key. + */ +U_CAPI int32_t U_EXPORT2 +uhash_hashIStringView(const UHashTok key); + /** * Comparator for null-terminated UChar* strings. Use together with * uhash_hashUChars. @@ -724,6 +733,16 @@ uhash_compareChars(const UHashTok key1, const UHashTok key2); U_CAPI UBool U_EXPORT2 uhash_compareIChars(const UHashTok key1, const UHashTok key2); +/** + * Case-insensitive comparator for std::string_view. + * Use together with uhash_hashIStringView. + * @param key1 A pointer to the std::string_view for comparison + * @param key2 A pointer to the std::string_view for comparison + * @return true if key1 and key2 are equal, return false otherwise. + */ +U_CAPI UBool U_EXPORT2 +uhash_compareIStringView(const UHashTok key1, const UHashTok key2); + /******************************************************************** * UnicodeString Support Functions ********************************************************************/ diff --git a/deps/icu-small/source/common/uidna.cpp b/deps/icu-small/source/common/uidna.cpp index 949d128f93c533..b47edefe116773 100644 --- a/deps/icu-small/source/common/uidna.cpp +++ b/deps/icu-small/source/common/uidna.cpp @@ -107,7 +107,7 @@ compareCaseInsensitiveASCII(const char16_t* s1, int32_t s1Len, /* Case-insensitive comparison */ if(c1!=c2) { - rc=(int32_t)toASCIILower(c1)-(int32_t)toASCIILower(c2); + rc = static_cast<int32_t>(toASCIILower(c1)) - static_cast<int32_t>(toASCIILower(c2)); if(rc!=0) { lengthResult=rc; break; @@ -219,7 +219,7 @@ _internal_toASCII(const char16_t* src, int32_t srcLength, int32_t j=0; //get the options - UBool useSTD3ASCIIRules = (UBool)((options & UIDNA_USE_STD3_RULES) != 0); + UBool useSTD3ASCIIRules = static_cast<UBool>((options & UIDNA_USE_STD3_RULES) != 0); int32_t failPos = -1; @@ -228,7 +228,7 @@ _internal_toASCII(const char16_t* src, int32_t srcLength, } if(srcLength > b1Capacity){ - b1 = (char16_t*) uprv_malloc(srcLength * U_SIZEOF_UCHAR); + b1 = static_cast<char16_t*>(uprv_malloc(srcLength * U_SIZEOF_UCHAR)); if(b1==nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; @@ -248,23 +248,27 @@ _internal_toASCII(const char16_t* src, int32_t srcLength, if(srcIsASCII == false){ // step 2 - b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status); + UErrorCode bufferStatus = U_ZERO_ERROR; + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, &bufferStatus); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string // we do not have enough room so grow the buffer if(b1 != b1Stack){ uprv_free(b1); } - b1 = (char16_t*) uprv_malloc(b1Len * U_SIZEOF_UCHAR); + b1 = static_cast<char16_t*>(uprv_malloc(b1Len * U_SIZEOF_UCHAR)); if(b1==nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error - - b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status); + bufferStatus = U_ZERO_ERROR; // reset error + + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, &bufferStatus); + } + if (U_FAILURE(bufferStatus)) { + *status = bufferStatus; } } // error bail out @@ -333,23 +337,25 @@ _internal_toASCII(const char16_t* src, int32_t srcLength, // caseFlags = (UBool*) uprv_malloc(b1Len * sizeof(UBool)); // uprv_memset(caseFlags,true,b1Len); - b2Len = u_strToPunycode(b1,b1Len,b2,b2Capacity,caseFlags, status); + UErrorCode bufferStatus = U_ZERO_ERROR; + b2Len = u_strToPunycode(b1,b1Len,b2,b2Capacity,caseFlags,&bufferStatus); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ - b2 = (char16_t*) uprv_malloc(b2Len * U_SIZEOF_UCHAR); + b2 = static_cast<char16_t*>(uprv_malloc(b2Len * U_SIZEOF_UCHAR)); if(b2 == nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error - - b2Len = u_strToPunycode(b1,b1Len,b2,b2Len,caseFlags, status); + bufferStatus = U_ZERO_ERROR; // reset error + + b2Len = u_strToPunycode(b1,b1Len,b2,b2Len,caseFlags,&bufferStatus); } //error bail out - if(U_FAILURE(*status)){ + if(U_FAILURE(bufferStatus)){ + *status = bufferStatus; goto CLEANUP; } // TODO : Reconsider while implementing the case preserve RFE @@ -454,28 +460,30 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength, if(srcIsASCII == false){ // step 2: process the string - b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, status); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + UErrorCode bufferStatus = U_ZERO_ERROR; + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Capacity, namePrepOptions, parseError, &bufferStatus); + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ - b1 = (char16_t*) uprv_malloc(b1Len * U_SIZEOF_UCHAR); + b1 = static_cast<char16_t*>(uprv_malloc(b1Len * U_SIZEOF_UCHAR)); if(b1==nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error - - b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, status); + bufferStatus = U_ZERO_ERROR; // reset error + + b1Len = usprep_prepare(nameprep, src, srcLength, b1, b1Len, namePrepOptions, parseError, &bufferStatus); } //bail out on error - if(U_FAILURE(*status)){ + if(U_FAILURE(bufferStatus)){ + *status = bufferStatus; goto CLEANUP; } }else{ //just point src to b1 - b1 = (char16_t*) src; + b1 = const_cast<char16_t*>(src); b1Len = srcLength; } @@ -493,42 +501,44 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength, b1PrimeLen = b1Len - ACE_PREFIX_LENGTH; //step 5: Decode using punycode - b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Capacity, caseFlags,status); + UErrorCode bufferStatus = U_ZERO_ERROR; + b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Capacity, caseFlags, &bufferStatus); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ - b2 = (char16_t*) uprv_malloc(b2Len * U_SIZEOF_UCHAR); + b2 = static_cast<char16_t*>(uprv_malloc(b2Len * U_SIZEOF_UCHAR)); if(b2==nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error + bufferStatus = U_ZERO_ERROR; // reset error - b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Len, caseFlags, status); + b2Len = u_strFromPunycode(b1Prime, b1PrimeLen, b2, b2Len, caseFlags, &bufferStatus); } //step 6:Apply toASCII - b3Len = uidna_toASCII(b2, b2Len, b3, b3Capacity, options, parseError, status); + b3Len = uidna_toASCII(b2, b2Len, b3, b3Capacity, options, parseError, &bufferStatus); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ - b3 = (char16_t*) uprv_malloc(b3Len * U_SIZEOF_UCHAR); + b3 = static_cast<char16_t*>(uprv_malloc(b3Len * U_SIZEOF_UCHAR)); if(b3==nullptr){ *status = U_MEMORY_ALLOCATION_ERROR; goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error + bufferStatus = U_ZERO_ERROR; // reset error - b3Len = uidna_toASCII(b2,b2Len,b3,b3Len,options,parseError, status); + b3Len = uidna_toASCII(b2,b2Len,b3,b3Len,options,parseError,&bufferStatus); } //bail out on error - if(U_FAILURE(*status)){ + if(U_FAILURE(bufferStatus)){ + *status = bufferStatus; goto CLEANUP; } @@ -585,6 +595,9 @@ _internal_toUnicode(const char16_t* src, int32_t srcLength, if(b2 != b2Stack){ uprv_free(b2); } + if(b3 != b3Stack){ + uprv_free(b3); + } uprv_free(caseFlags); // The RFC states that @@ -689,9 +702,9 @@ uidna_IDNToASCII( const char16_t *src, int32_t srcLength, } //initialize pointers - char16_t *delimiter = (char16_t*)src; - char16_t *labelStart = (char16_t*)src; - char16_t *currentDest = (char16_t*) dest; + char16_t* delimiter = const_cast<char16_t*>(src); + char16_t* labelStart = const_cast<char16_t*>(src); + char16_t* currentDest = dest; int32_t remainingLen = srcLength; int32_t remainingDestCapacity = destCapacity; int32_t labelLen = 0, labelReqLength = 0; @@ -703,24 +716,21 @@ uidna_IDNToASCII( const char16_t *src, int32_t srcLength, labelLen = getNextSeparator(labelStart,remainingLen, &delimiter,&done); labelReqLength = 0; if(!(labelLen==0 && done)){// make sure this is not a root label separator. - - labelReqLength = _internal_toASCII( labelStart, labelLen, - currentDest, remainingDestCapacity, - options, nameprep, - parseError, status); - - if(*status == U_BUFFER_OVERFLOW_ERROR){ - - *status = U_ZERO_ERROR; // reset error + + UErrorCode bufferStatus = U_ZERO_ERROR; + labelReqLength = _internal_toASCII( labelStart, labelLen, + currentDest, remainingDestCapacity, + options, nameprep, + parseError, &bufferStatus); + + if (bufferStatus == U_BUFFER_OVERFLOW_ERROR) { remainingDestCapacity = 0; + } else if (U_FAILURE(bufferStatus)) { + *status = bufferStatus; + break; } } - - if(U_FAILURE(*status)){ - break; - } - reqLength +=labelReqLength; // adjust the destination pointer if(labelReqLength < remainingDestCapacity){ @@ -782,9 +792,9 @@ uidna_IDNToUnicode( const char16_t* src, int32_t srcLength, } //initialize pointers - char16_t *delimiter = (char16_t*)src; - char16_t *labelStart = (char16_t*)src; - char16_t *currentDest = (char16_t*) dest; + char16_t* delimiter = const_cast<char16_t*>(src); + char16_t* labelStart = const_cast<char16_t*>(src); + char16_t* currentDest = dest; int32_t remainingLen = srcLength; int32_t remainingDestCapacity = destCapacity; int32_t labelLen = 0, labelReqLength = 0; @@ -874,8 +884,9 @@ uidna_compare( const char16_t *s1, int32_t length1, UParseError parseError; - b1Len = uidna_IDNToASCII(s1, length1, b1, b1Capacity, options, &parseError, status); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + UErrorCode bufferStatus = U_ZERO_ERROR; + b1Len = uidna_IDNToASCII(s1, length1, b1, b1Capacity, options, &parseError, &bufferStatus); + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string b1 = (char16_t*) uprv_malloc(b1Len * U_SIZEOF_UCHAR); if(b1==nullptr){ @@ -883,14 +894,13 @@ uidna_compare( const char16_t *s1, int32_t length1, goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error - - b1Len = uidna_IDNToASCII(s1,length1,b1,b1Len, options, &parseError, status); - + bufferStatus = U_ZERO_ERROR; // reset error + + b1Len = uidna_IDNToASCII(s1,length1,b1,b1Len, options, &parseError, &bufferStatus); } - b2Len = uidna_IDNToASCII(s2,length2, b2,b2Capacity, options, &parseError, status); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + b2Len = uidna_IDNToASCII(s2,length2, b2,b2Capacity, options, &parseError, &bufferStatus); + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string b2 = (char16_t*) uprv_malloc(b2Len * U_SIZEOF_UCHAR); if(b2==nullptr){ @@ -898,11 +908,15 @@ uidna_compare( const char16_t *s1, int32_t length1, goto CLEANUP; } - *status = U_ZERO_ERROR; // reset error - - b2Len = uidna_IDNToASCII(s2, length2, b2, b2Len, options, &parseError, status); - + bufferStatus = U_ZERO_ERROR; // reset error + + b2Len = uidna_IDNToASCII(s2, length2, b2, b2Len, options, &parseError, &bufferStatus); + } + + if (U_FAILURE(bufferStatus)) { + *status = bufferStatus; } + // when toASCII is applied all label separators are replaced with FULL_STOP result = compareCaseInsensitiveASCII(b1,b1Len,b2,b2Len); diff --git a/deps/icu-small/source/common/uinvchar.cpp b/deps/icu-small/source/common/uinvchar.cpp index 096a8e28d11758..2ffef7b580378e 100644 --- a/deps/icu-small/source/common/uinvchar.cpp +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -446,7 +446,7 @@ uprv_copyEbcdic(const UDataSwapper *ds, return length; } -U_CFUNC UBool +U_CAPI UBool uprv_isEbcdicAtSign(char c) { static const uint8_t ebcdicAtSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; diff --git a/deps/icu-small/source/common/uinvchar.h b/deps/icu-small/source/common/uinvchar.h index 9b7a9bd114172e..3e031ccc5a65c2 100644 --- a/deps/icu-small/source/common/uinvchar.h +++ b/deps/icu-small/source/common/uinvchar.h @@ -120,7 +120,7 @@ U_NAMESPACE_END * EBCDIC machine won't be compiled the same way on other EBCDIC based machines. * @internal */ -U_CFUNC UBool +U_CAPI UBool uprv_isEbcdicAtSign(char c); /** diff --git a/deps/icu-small/source/common/uiter.cpp b/deps/icu-small/source/common/uiter.cpp index be59eab2ee70c3..6c96117e1a4ae8 100644 --- a/deps/icu-small/source/common/uiter.cpp +++ b/deps/icu-small/source/common/uiter.cpp @@ -66,7 +66,7 @@ noopSetState(UCharIterator * /*iter*/, uint32_t /*state*/, UErrorCode *pErrorCod } static const UCharIterator noopIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, noopGetIndex, noopMove, noopHasNext, @@ -197,7 +197,7 @@ stringIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErrorCo } static const UCharIterator stringIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, stringIteratorGetIndex, stringIteratorMove, stringIteratorHasNext, @@ -212,8 +212,8 @@ static const UCharIterator stringIterator={ U_CAPI void U_EXPORT2 uiter_setString(UCharIterator *iter, const char16_t *s, int32_t length) { - if(iter!=0) { - if(s!=0 && length>=-1) { + if (iter != nullptr) { + if (s != nullptr && length >= -1) { *iter=stringIterator; iter->context=s; if(length>=0) { @@ -283,7 +283,7 @@ utf16BEIteratorPrevious(UCharIterator *iter) { } static const UCharIterator utf16BEIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, stringIteratorGetIndex, stringIteratorMove, stringIteratorHasNext, @@ -457,7 +457,7 @@ characterIteratorSetState(UCharIterator *iter, uint32_t state, UErrorCode *pErro } static const UCharIterator characterIteratorWrapper={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, characterIteratorGetIndex, characterIteratorMove, characterIteratorHasNext, @@ -472,8 +472,8 @@ static const UCharIterator characterIteratorWrapper={ U_CAPI void U_EXPORT2 uiter_setCharacterIterator(UCharIterator *iter, CharacterIterator *charIter) { - if(iter!=0) { - if(charIter!=0) { + if (iter != nullptr) { + if (charIter != nullptr) { *iter=characterIteratorWrapper; iter->context=charIter; } else { @@ -521,7 +521,7 @@ replaceableIteratorPrevious(UCharIterator *iter) { } static const UCharIterator replaceableIterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, stringIteratorGetIndex, stringIteratorMove, stringIteratorHasNext, @@ -536,8 +536,8 @@ static const UCharIterator replaceableIterator={ U_CAPI void U_EXPORT2 uiter_setReplaceable(UCharIterator *iter, const Replaceable *rep) { - if(iter!=0) { - if(rep!=0) { + if (iter != nullptr) { + if (rep != nullptr) { *iter=replaceableIterator; iter->context=rep; iter->limit=iter->length=rep->length(); @@ -987,7 +987,7 @@ utf8IteratorSetState(UCharIterator *iter, } static const UCharIterator utf8Iterator={ - 0, 0, 0, 0, 0, 0, + nullptr, 0, 0, 0, 0, 0, utf8IteratorGetIndex, utf8IteratorMove, utf8IteratorHasNext, @@ -1002,8 +1002,8 @@ static const UCharIterator utf8Iterator={ U_CAPI void U_EXPORT2 uiter_setUTF8(UCharIterator *iter, const char *s, int32_t length) { - if(iter!=0) { - if(s!=0 && length>=-1) { + if (iter != nullptr) { + if (s != nullptr && length >= -1) { *iter=utf8Iterator; iter->context=s; if(length>=0) { diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index ce49d6c50e2005..7467f1cb336fb6 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -30,6 +30,10 @@ l = lang, C = ctry, M = charmap, V = variant */ +#include <algorithm> +#include <optional> +#include <string_view> + #include "unicode/bytestream.h" #include "unicode/errorcode.h" #include "unicode/stringpiece.h" @@ -58,6 +62,8 @@ U_NAMESPACE_USE U_CFUNC void locale_set_default(const char *id); U_CFUNC const char *locale_get_default(); +namespace { + /* ### Data tables **************************************************/ /** @@ -94,7 +100,7 @@ U_CFUNC const char *locale_get_default(); /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ -static const char * const LANGUAGES[] = { +constexpr const char* LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", @@ -185,10 +191,10 @@ nullptr, nullptr }; -static const char* const DEPRECATED_LANGUAGES[]={ +constexpr const char* DEPRECATED_LANGUAGES[]={ "in", "iw", "ji", "jw", "mo", nullptr, nullptr }; -static const char* const REPLACEMENT_LANGUAGES[]={ +constexpr const char* REPLACEMENT_LANGUAGES[]={ "id", "he", "yi", "jv", "ro", nullptr, nullptr }; @@ -211,7 +217,7 @@ static const char* const REPLACEMENT_LANGUAGES[]={ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ -static const char * const LANGUAGES_3[] = { +constexpr const char* LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", @@ -327,7 +333,7 @@ nullptr * RO(ROM) is now RO(ROU) according to * http://www.iso.org/iso/en/prods-services/iso3166ma/03updates-on-iso-3166/nlv3e-rou.html */ -static const char * const COUNTRIES[] = { +constexpr const char* COUNTRIES[] = { "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", @@ -363,10 +369,10 @@ nullptr, nullptr }; -static const char* const DEPRECATED_COUNTRIES[] = { +constexpr const char* DEPRECATED_COUNTRIES[] = { "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR", nullptr, nullptr /* deprecated country list */ }; -static const char* const REPLACEMENT_COUNTRIES[] = { +constexpr const char* REPLACEMENT_COUNTRIES[] = { /* "AN", "BU", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "UK", "VD", "YD", "YU", "ZR" */ "CW", "MM", "RS", "DE", "BJ", "FR", "BF", "VU", "ZW", "RU", "TL", "GB", "VN", "YE", "RS", "CD", nullptr, nullptr /* replacement country codes */ }; @@ -384,7 +390,7 @@ static const char* const REPLACEMENT_COUNTRIES[] = { * second list, and another nullptr entry. The two lists correspond to * the two lists in COUNTRIES. */ -static const char * const COUNTRIES_3[] = { +constexpr const char* COUNTRIES_3[] = { /* "AD", "AE", "AF", "AG", "AI", "AL", "AM", */ "AND", "ARE", "AFG", "ATG", "AIA", "ALB", "ARM", /* "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", */ @@ -460,7 +466,7 @@ typedef struct CanonicalizationMap { * A map to canonicalize locale IDs. This handles a variety of * different semantic kinds of transformations. */ -static const CanonicalizationMap CANONICALIZE_MAP[] = { +constexpr CanonicalizationMap CANONICALIZE_MAP[] = { { "art__LOJBAN", "jbo" }, /* registered name */ { "hy__AREVELA", "hy" }, /* Registered IANA variant */ { "hy__AREVMDA", "hyw" }, /* Registered IANA variant */ @@ -475,15 +481,13 @@ static const CanonicalizationMap CANONICALIZE_MAP[] = { }; /* ### BCP47 Conversion *******************************************/ -/* Test if the locale id has BCP47 u extension and does not have '@' */ -#define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == nullptr && getShortestSubtagLength(localeID) == 1) /* Gets the size of the shortest subtag in the given localeID. */ -static int32_t getShortestSubtagLength(const char *localeID) { - int32_t localeIDLength = static_cast<int32_t>(uprv_strlen(localeID)); +int32_t getShortestSubtagLength(std::string_view localeID) { + int32_t localeIDLength = static_cast<int32_t>(localeID.length()); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; - UBool reset = true; + bool reset = true; for (i = 0; i < localeIDLength; i++) { if (localeID[i] != '_' && localeID[i] != '-') { @@ -502,21 +506,26 @@ static int32_t getShortestSubtagLength(const char *localeID) { return length; } +/* Test if the locale id has BCP47 u extension and does not have '@' */ +inline bool _hasBCP47Extension(std::string_view id) { + return id.find('@') == std::string_view::npos && getShortestSubtagLength(id) == 1; +} /* ### Keywords **************************************************/ -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +inline bool UPRV_ISDIGIT(char c) { return c >= '0' && c <= '9'; } +inline bool UPRV_ISALPHANUM(char c) { return uprv_isASCIILetter(c) || UPRV_ISDIGIT(c); } /* Punctuation/symbols allowed in legacy key values */ -#define UPRV_OK_VALUE_PUNCTUATION(c) ((c) == '_' || (c) == '-' || (c) == '+' || (c) == '/') +inline bool UPRV_OK_VALUE_PUNCTUATION(char c) { return c == '_' || c == '-' || c == '+' || c == '/'; } + +} // namespace #define ULOC_KEYWORD_BUFFER_LEN 25 #define ULOC_MAX_NO_KEYWORDS 25 U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(const char *localeID) { - const char *result = nullptr; - if((result = uprv_strchr(localeID, '@')) != nullptr) { - return result; +locale_getKeywordsStart(std::string_view localeID) { + if (size_t pos = localeID.find('@'); pos != std::string_view::npos) { + return localeID.data() + pos; } #if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY) else { @@ -526,8 +535,8 @@ locale_getKeywordsStart(const char *localeID) { static const uint8_t ebcdicSigns[] = { 0x7C, 0x44, 0x66, 0x80, 0xAC, 0xAE, 0xAF, 0xB5, 0xEC, 0xEF, 0x00 }; const uint8_t *charToFind = ebcdicSigns; while(*charToFind) { - if((result = uprv_strchr(localeID, *charToFind)) != nullptr) { - return result; + if (size_t pos = localeID.find(*charToFind); pos != std::string_view::npos) { + return localeID.data() + pos; } charToFind++; } @@ -536,36 +545,31 @@ locale_getKeywordsStart(const char *localeID) { return nullptr; } +namespace { + /** - * @param buf buffer of size [ULOC_KEYWORD_BUFFER_LEN] * @param keywordName incoming name to be canonicalized * @param status return status (keyword too long) - * @return length of the keyword name + * @return the keyword name */ -static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status) +CharString locale_canonKeywordName(std::string_view keywordName, UErrorCode& status) { - int32_t keywordNameLen = 0; + if (U_FAILURE(status)) { return {}; } + CharString result; - for (; *keywordName != 0; keywordName++) { - if (!UPRV_ISALPHANUM(*keywordName)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return 0; - } - if (keywordNameLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - buf[keywordNameLen++] = uprv_tolower(*keywordName); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; - return 0; + for (char c : keywordName) { + if (!UPRV_ISALPHANUM(c)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return {}; } + result.append(uprv_tolower(c), status); } - if (keywordNameLen == 0) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ - return 0; + if (result.isEmpty()) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ + return {}; } - buf[keywordNameLen] = 0; /* terminate */ - return keywordNameLen; + return result; } typedef struct { @@ -575,102 +579,120 @@ typedef struct { int32_t valueLen; } KeywordStruct; -static int32_t U_CALLCONV +int32_t U_CALLCONV compareKeywordStructs(const void * /*context*/, const void *left, const void *right) { - const char* leftString = ((const KeywordStruct *)left)->keyword; - const char* rightString = ((const KeywordStruct *)right)->keyword; + const char* leftString = static_cast<const KeywordStruct*>(left)->keyword; + const char* rightString = static_cast<const KeywordStruct*>(right)->keyword; return uprv_strcmp(leftString, rightString); } -U_CFUNC void -ulocimp_getKeywords(const char *localeID, +} // namespace + +U_EXPORT CharString +ulocimp_getKeywords(std::string_view localeID, + char prev, + bool valuesToo, + UErrorCode& status) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywords(localeID, + prev, + sink, + valuesToo, + status); + }, + status); +} + +U_EXPORT void +ulocimp_getKeywords(std::string_view localeID, char prev, ByteSink& sink, - UBool valuesToo, - UErrorCode *status) + bool valuesToo, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS]; int32_t maxKeywords = ULOC_MAX_NO_KEYWORDS; int32_t numKeywords = 0; - const char* pos = localeID; - const char* equalSign = nullptr; - const char* semicolon = nullptr; + size_t equalSign = std::string_view::npos; + size_t semicolon = std::string_view::npos; int32_t i = 0, j, n; if(prev == '@') { /* start of keyword definition */ /* we will grab pairs, trim spaces, lowercase keywords, sort and return */ do { - UBool duplicate = false; + bool duplicate = false; /* skip leading spaces */ - while(*pos == ' ') { - pos++; + while (!localeID.empty() && localeID.front() == ' ') { + localeID.remove_prefix(1); } - if (!*pos) { /* handle trailing "; " */ + if (localeID.empty()) { /* handle trailing "; " */ break; } if(numKeywords == maxKeywords) { - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_INTERNAL_PROGRAM_ERROR; return; } - equalSign = uprv_strchr(pos, '='); - semicolon = uprv_strchr(pos, ';'); + equalSign = localeID.find('='); + semicolon = localeID.find(';'); /* lack of '=' [foo@currency] is illegal */ /* ';' before '=' [foo@currency;collation=pinyin] is illegal */ - if(!equalSign || (semicolon && semicolon<equalSign)) { - *status = U_INVALID_FORMAT_ERROR; + if (equalSign == std::string_view::npos || + (semicolon != std::string_view::npos && semicolon < equalSign)) { + status = U_INVALID_FORMAT_ERROR; + return; + } + /* zero-length keyword is an error. */ + if (equalSign == 0) { + status = U_INVALID_FORMAT_ERROR; return; } /* need to normalize both keyword and keyword name */ - if(equalSign - pos >= ULOC_KEYWORD_BUFFER_LEN) { + if (equalSign >= ULOC_KEYWORD_BUFFER_LEN) { /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + status = U_INTERNAL_PROGRAM_ERROR; return; } - for(i = 0, n = 0; i < equalSign - pos; ++i) { - if (pos[i] != ' ') { - keywordList[numKeywords].keyword[n++] = uprv_tolower(pos[i]); + for (i = 0, n = 0; static_cast<size_t>(i) < equalSign; ++i) { + if (localeID[i] != ' ') { + keywordList[numKeywords].keyword[n++] = uprv_tolower(localeID[i]); } } - /* zero-length keyword is an error. */ - if (n == 0) { - *status = U_INVALID_FORMAT_ERROR; - return; - } - keywordList[numKeywords].keyword[n] = 0; keywordList[numKeywords].keywordLen = n; /* now grab the value part. First we skip the '=' */ equalSign++; /* then we leading spaces */ - while(*equalSign == ' ') { + while (equalSign < localeID.length() && localeID[equalSign] == ' ') { equalSign++; } /* Premature end or zero-length value */ - if (!*equalSign || equalSign == semicolon) { - *status = U_INVALID_FORMAT_ERROR; + if (equalSign == localeID.length() || equalSign == semicolon) { + status = U_INVALID_FORMAT_ERROR; return; } - keywordList[numKeywords].valueStart = equalSign; + keywordList[numKeywords].valueStart = localeID.data() + equalSign; - pos = semicolon; - i = 0; - if(pos) { - while(*(pos - i - 1) == ' ') { - i++; - } - keywordList[numKeywords].valueLen = (int32_t)(pos - equalSign - i); - pos++; + std::string_view value = localeID; + if (semicolon != std::string_view::npos) { + value.remove_suffix(value.length() - semicolon); + localeID.remove_prefix(semicolon + 1); } else { - i = (int32_t)uprv_strlen(equalSign); - while(i && equalSign[i-1] == ' ') { - i--; - } - keywordList[numKeywords].valueLen = i; + localeID = {}; + } + value.remove_prefix(equalSign); + if (size_t last = value.find_last_not_of(' '); last != std::string_view::npos) { + value.remove_suffix(value.length() - last - 1); } + keywordList[numKeywords].valueLen = static_cast<int32_t>(value.length()); + /* If this is a duplicate keyword, then ignore it */ for (j=0; j<numKeywords; ++j) { if (uprv_strcmp(keywordList[j].keyword, keywordList[numKeywords].keyword) == 0) { @@ -681,11 +703,11 @@ ulocimp_getKeywords(const char *localeID, if (!duplicate) { ++numKeywords; } - } while(pos); + } while (!localeID.empty()); /* now we have a list of keywords */ /* we need to sort it */ - uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, status); + uprv_sortArray(keywordList, numKeywords, sizeof(KeywordStruct), compareKeywordStructs, nullptr, false, &status); /* Now construct the keyword part */ for(i = 0; i < numKeywords; i++) { @@ -709,137 +731,132 @@ uloc_getKeywordValue(const char* localeID, char* buffer, int32_t bufferCapacity, UErrorCode* status) { - if (U_FAILURE(*status)) { + if (U_FAILURE(*status)) { return 0; } + if (keywordName == nullptr || *keywordName == '\0') { + *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + buffer, bufferCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywordValue(localeID, keywordName, sink, status); + }, + *status); +} - CheckedArrayByteSink sink(buffer, bufferCapacity); - ulocimp_getKeywordValue(localeID, keywordName, sink, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(buffer, bufferCapacity, reslen, status); - } - - return reslen; +U_EXPORT CharString +ulocimp_getKeywordValue(const char* localeID, + std::string_view keywordName, + UErrorCode& status) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getKeywordValue(localeID, keywordName, sink, status); + }, + status); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getKeywordValue(const char* localeID, - const char* keywordName, + std::string_view keywordName, icu::ByteSink& sink, - UErrorCode* status) + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + if (localeID == nullptr || keywordName.empty()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + const char* startSearchHere = nullptr; const char* nextSeparator = nullptr; - char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - if(status && U_SUCCESS(*status) && localeID) { - CharString tempBuffer; - const char* tmpLocaleID; + CharString tempBuffer; + const char* tmpLocaleID; - if (keywordName == nullptr || keywordName[0] == 0) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + CharString canonKeywordName = locale_canonKeywordName(keywordName, status); + if (U_FAILURE(status)) { + return; + } - locale_canonKeywordName(keywordNameBuffer, keywordName, status); - if(U_FAILURE(*status)) { + if (localeID != nullptr && _hasBCP47Extension(localeID)) { + tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, status); + tmpLocaleID = U_SUCCESS(status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; + } else { + tmpLocaleID=localeID; + } + + startSearchHere = locale_getKeywordsStart(tmpLocaleID); + if(startSearchHere == nullptr) { + /* no keywords, return at once */ return; - } + } - if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, status); - tmpLocaleID = U_SUCCESS(*status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; - } else { - tmpLocaleID=localeID; - } - - startSearchHere = locale_getKeywordsStart(tmpLocaleID); - if(startSearchHere == nullptr) { - /* no keywords, return at once */ - return; - } - - /* find the first keyword */ - while(startSearchHere) { - const char* keyValueTail; - int32_t keyValueLen; - - startSearchHere++; /* skip @ or ; */ - nextSeparator = uprv_strchr(startSearchHere, '='); - if(!nextSeparator) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ - return; - } - /* strip leading & trailing spaces (TC decided to tolerate these) */ - while(*startSearchHere == ' ') { - startSearchHere++; + /* find the first keyword */ + while(startSearchHere) { + const char* keyValueTail; + + startSearchHere++; /* skip @ or ; */ + nextSeparator = uprv_strchr(startSearchHere, '='); + if(!nextSeparator) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + return; + } + /* strip leading & trailing spaces (TC decided to tolerate these) */ + while(*startSearchHere == ' ') { + startSearchHere++; + } + keyValueTail = nextSeparator; + while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (startSearchHere == keyValueTail) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + return; + } + CharString localeKeywordName; + while (startSearchHere < keyValueTail) { + if (!UPRV_ISALPHANUM(*startSearchHere)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return; } - keyValueTail = nextSeparator; - while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + localeKeywordName.append(uprv_tolower(*startSearchHere++), status); + } + if (U_FAILURE(status)) { + return; + } + + startSearchHere = uprv_strchr(nextSeparator, ';'); + + if (canonKeywordName == localeKeywordName) { + /* current entry matches the keyword. */ + nextSeparator++; /* skip '=' */ + /* First strip leading & trailing spaces (TC decided to tolerate these) */ + while(*nextSeparator == ' ') { + nextSeparator++; + } + keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); + while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { keyValueTail--; - } - /* now keyValueTail points to first char after the keyName */ - /* copy & normalize keyName from locale */ - if (startSearchHere == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ - return; - } - keyValueLen = 0; - while (startSearchHere < keyValueTail) { - if (!UPRV_ISALPHANUM(*startSearchHere)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return; } - if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*startSearchHere++); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + /* Now copy the value, but check well-formedness */ + if (nextSeparator == keyValueTail) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ return; } - } - localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ - - startSearchHere = uprv_strchr(nextSeparator, ';'); - - if(uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer) == 0) { - /* current entry matches the keyword. */ - nextSeparator++; /* skip '=' */ - /* First strip leading & trailing spaces (TC decided to tolerate these) */ - while(*nextSeparator == ' ') { - nextSeparator++; - } - keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); - while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { - keyValueTail--; - } - /* Now copy the value, but check well-formedness */ - if (nextSeparator == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ + while (nextSeparator < keyValueTail) { + if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ return; } - while (nextSeparator < keyValueTail) { - if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ - return; - } - /* Should we lowercase value to return here? Tests expect as-is. */ - sink.Append(nextSeparator++, 1); - } - return; - } - } + /* Should we lowercase value to return here? Tests expect as-is. */ + sink.Append(nextSeparator++, 1); + } + return; + } } } @@ -849,185 +866,225 @@ uloc_setKeywordValue(const char* keywordName, char* buffer, int32_t bufferCapacity, UErrorCode* status) { - /* TODO: sorting. removal. */ - int32_t keywordNameLen; - int32_t keywordValueLen; - int32_t bufLen; - int32_t needLen = 0; - char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - char keywordValueBuffer[ULOC_KEYWORDS_CAPACITY+1]; - char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t rc; - char* nextSeparator = nullptr; - char* nextEqualsign = nullptr; - char* startSearchHere = nullptr; - char* keywordStart = nullptr; - CharString updatedKeysAndValues; - UBool handledInputKeyAndValue = false; - char keyValuePrefix = '@'; + if (U_FAILURE(*status)) { return 0; } - if(U_FAILURE(*status)) { - return -1; - } - if (*status == U_STRING_NOT_TERMINATED_WARNING) { - *status = U_ZERO_ERROR; + if (keywordName == nullptr || *keywordName == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - if (keywordName == nullptr || keywordName[0] == 0 || bufferCapacity <= 1) { + + if (bufferCapacity <= 1) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - bufLen = (int32_t)uprv_strlen(buffer); + + int32_t bufLen = (int32_t)uprv_strlen(buffer); if(bufferCapacity<bufLen) { /* The capacity is less than the length?! Is this NUL terminated? */ *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - keywordNameLen = locale_canonKeywordName(keywordNameBuffer, keywordName, status); - if(U_FAILURE(*status)) { + + char* keywords = const_cast<char*>( + locale_getKeywordsStart({buffer, static_cast<std::string_view::size_type>(bufLen)})); + int32_t baseLen = keywords == nullptr ? bufLen : keywords - buffer; + // Remove -1 from the capacity so that this function can guarantee NUL termination. + CheckedArrayByteSink sink(keywords == nullptr ? buffer + bufLen : keywords, + bufferCapacity - baseLen - 1); + int32_t reslen = ulocimp_setKeywordValue( + keywords == nullptr ? std::string_view() : keywords, + keywordName, + keywordValue == nullptr ? std::string_view() : keywordValue, + sink, + *status); + + if (U_FAILURE(*status)) { + return *status == U_BUFFER_OVERFLOW_ERROR ? reslen + baseLen : 0; + } + + // See the documentation for this function, it's guaranteed to never + // overflow the buffer but instead abort with BUFFER_OVERFLOW_ERROR. + // In this case, nothing has been written to the sink, so it cannot have Overflowed(). + U_ASSERT(!sink.Overflowed()); + U_ASSERT(reslen >= 0); + return u_terminateChars(buffer, bufferCapacity, reslen + baseLen, status); +} + +U_EXPORT void +ulocimp_setKeywordValue(std::string_view keywordName, + std::string_view keywordValue, + CharString& localeID, + UErrorCode& status) +{ + if (U_FAILURE(status)) { return; } + std::string_view keywords; + if (const char* start = locale_getKeywordsStart(localeID.toStringPiece()); start != nullptr) { + // This is safe because CharString::truncate() doesn't actually erase any + // data, but simply sets the position for where new data will be written. + int32_t size = start - localeID.data(); + keywords = localeID.toStringPiece(); + keywords.remove_prefix(size); + localeID.truncate(size); + } + CharStringByteSink sink(&localeID); + ulocimp_setKeywordValue(keywords, keywordName, keywordValue, sink, status); +} + +U_EXPORT int32_t +ulocimp_setKeywordValue(std::string_view keywords, + std::string_view keywordName, + std::string_view keywordValue, + ByteSink& sink, + UErrorCode& status) +{ + if (U_FAILURE(status)) { return 0; } + + /* TODO: sorting. removal. */ + int32_t needLen = 0; + int32_t rc; + CharString updatedKeysAndValues; + bool handledInputKeyAndValue = false; + char keyValuePrefix = '@'; + + if (status == U_STRING_NOT_TERMINATED_WARNING) { + status = U_ZERO_ERROR; + } + if (keywordName.empty()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CharString canonKeywordName = locale_canonKeywordName(keywordName, status); + if (U_FAILURE(status)) { return 0; } - keywordValueLen = 0; - if(keywordValue) { - while (*keywordValue != 0) { - if (!UPRV_ISALPHANUM(*keywordValue) && !UPRV_OK_VALUE_PUNCTUATION(*keywordValue)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ - return 0; - } - if (keywordValueLen < ULOC_KEYWORDS_CAPACITY) { - /* Should we force lowercase in value to set? */ - keywordValueBuffer[keywordValueLen++] = *keywordValue++; - } else { - /* keywordValue too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; - return 0; - } + CharString canonKeywordValue; + for (char c : keywordValue) { + if (!UPRV_ISALPHANUM(c) && !UPRV_OK_VALUE_PUNCTUATION(c)) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ + return 0; } + /* Should we force lowercase in value to set? */ + canonKeywordValue.append(c, status); + } + if (U_FAILURE(status)) { + return 0; } - keywordValueBuffer[keywordValueLen] = 0; /* terminate */ - startSearchHere = (char*)locale_getKeywordsStart(buffer); - if(startSearchHere == nullptr || (startSearchHere[1]==0)) { - if(keywordValueLen == 0) { /* no keywords = nothing to remove */ - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); - return bufLen; + if (keywords.size() <= 1) { + if (canonKeywordValue.isEmpty()) { /* no keywords = nothing to remove */ + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); + return 0; } - needLen = bufLen+1+keywordNameLen+1+keywordValueLen; - if(startSearchHere) { /* had a single @ */ - needLen--; /* already had the @ */ - /* startSearchHere points at the @ */ - } else { - startSearchHere=buffer+bufLen; - } - if(needLen >= bufferCapacity) { - *status = U_BUFFER_OVERFLOW_ERROR; + needLen = 1 + canonKeywordName.length() + 1 + canonKeywordValue.length(); + int32_t capacity = 0; + char* buffer = sink.GetAppendBuffer( + needLen, needLen, nullptr, needLen, &capacity); + if (capacity < needLen || buffer == nullptr) { + status = U_BUFFER_OVERFLOW_ERROR; return needLen; /* no change */ } - *startSearchHere++ = '@'; - uprv_strcpy(startSearchHere, keywordNameBuffer); - startSearchHere += keywordNameLen; - *startSearchHere++ = '='; - uprv_strcpy(startSearchHere, keywordValueBuffer); - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); + char* it = buffer; + + *it++ = '@'; + uprv_memcpy(it, canonKeywordName.data(), canonKeywordName.length()); + it += canonKeywordName.length(); + *it++ = '='; + uprv_memcpy(it, canonKeywordValue.data(), canonKeywordValue.length()); + sink.Append(buffer, needLen); + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); return needLen; } /* end shortcut - no @ */ - keywordStart = startSearchHere; /* search for keyword */ - while(keywordStart) { - const char* keyValueTail; - int32_t keyValueLen; - + for (size_t keywordStart = 0; keywordStart != std::string_view::npos;) { keywordStart++; /* skip @ or ; */ - nextEqualsign = uprv_strchr(keywordStart, '='); - if (!nextEqualsign) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + size_t nextEqualsign = keywords.find('=', keywordStart); + if (nextEqualsign == std::string_view::npos) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ return 0; } /* strip leading & trailing spaces (TC decided to tolerate these) */ - while(*keywordStart == ' ') { + while (keywordStart < keywords.size() && keywords[keywordStart] == ' ') { keywordStart++; } - keyValueTail = nextEqualsign; - while (keyValueTail > keywordStart && *(keyValueTail-1) == ' ') { + size_t keyValueTail = nextEqualsign; + while (keyValueTail > keywordStart && keywords[keyValueTail - 1] == ' ') { keyValueTail--; } /* now keyValueTail points to first char after the keyName */ /* copy & normalize keyName from locale */ if (keywordStart == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ return 0; } - keyValueLen = 0; + CharString localeKeywordName; while (keywordStart < keyValueTail) { - if (!UPRV_ISALPHANUM(*keywordStart)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ - return 0; - } - if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { - localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*keywordStart++); - } else { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + if (!UPRV_ISALPHANUM(keywords[keywordStart])) { + status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ return 0; } + localeKeywordName.append(uprv_tolower(keywords[keywordStart++]), status); + } + if (U_FAILURE(status)) { + return 0; } - localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ - nextSeparator = uprv_strchr(nextEqualsign, ';'); + size_t nextSeparator = keywords.find(';', nextEqualsign); /* start processing the value part */ nextEqualsign++; /* skip '=' */ /* First strip leading & trailing spaces (TC decided to tolerate these) */ - while(*nextEqualsign == ' ') { + while (nextEqualsign < keywords.size() && keywords[nextEqualsign] == ' ') { nextEqualsign++; } - keyValueTail = (nextSeparator)? nextSeparator: nextEqualsign + uprv_strlen(nextEqualsign); - while(keyValueTail > nextEqualsign && *(keyValueTail-1) == ' ') { + keyValueTail = nextSeparator == std::string_view::npos ? keywords.size() : nextSeparator; + while (keyValueTail > nextEqualsign && keywords[keyValueTail - 1] == ' ') { keyValueTail--; } if (nextEqualsign == keyValueTail) { - *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ + status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ return 0; } - rc = uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer); + rc = uprv_strcmp(canonKeywordName.data(), localeKeywordName.data()); if(rc == 0) { /* Current entry matches the input keyword. Update the entry */ - if(keywordValueLen > 0) { /* updating a value */ - updatedKeysAndValues.append(keyValuePrefix, *status); + if (!canonKeywordValue.isEmpty()) { /* updating a value */ + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); } /* else removing this entry, don't emit anything */ handledInputKeyAndValue = true; } else { /* input keyword sorts earlier than current entry, add before current entry */ - if (rc < 0 && keywordValueLen > 0 && !handledInputKeyAndValue) { + if (rc < 0 && !canonKeywordValue.isEmpty() && !handledInputKeyAndValue) { /* insert new entry at this location */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); handledInputKeyAndValue = true; } /* copy the current entry */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); keyValuePrefix = ';'; /* for any subsequent key-value pair */ - updatedKeysAndValues.append(localeKeywordNameBuffer, keyValueLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(nextEqualsign, static_cast<int32_t>(keyValueTail-nextEqualsign), *status); + updatedKeysAndValues.append(localeKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(keywords.data() + nextEqualsign, + static_cast<int32_t>(keyValueTail - nextEqualsign), status); } - if (!nextSeparator && keywordValueLen > 0 && !handledInputKeyAndValue) { + if (nextSeparator == std::string_view::npos && !canonKeywordValue.isEmpty() && !handledInputKeyAndValue) { /* append new entry at the end, it sorts later than existing entries */ - updatedKeysAndValues.append(keyValuePrefix, *status); + updatedKeysAndValues.append(keyValuePrefix, status); /* skip keyValuePrefix update, no subsequent key-value pair */ - updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); - updatedKeysAndValues.append('=', *status); - updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + updatedKeysAndValues.append(canonKeywordName, status); + updatedKeysAndValues.append('=', status); + updatedKeysAndValues.append(canonKeywordValue, status); handledInputKeyAndValue = true; } keywordStart = nextSeparator; @@ -1041,44 +1098,74 @@ uloc_setKeywordValue(const char* keywordName, * error return but the passed-in locale is unmodified and the original bufLen is * returned. */ - if (!handledInputKeyAndValue || U_FAILURE(*status)) { + if (!handledInputKeyAndValue || U_FAILURE(status)) { /* if input key/value specified removal of a keyword not present in locale, or * there was an error in CharString.append, leave original locale alone. */ - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); - return bufLen; + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); + // The sink is expected to be a buffer which already contains the full + // locale string, so when it isn't going to be modified there's no need + // to actually write any data to it, as the data is already there. Only + // the first character needs to be overwritten (changing '\0' to '@'). + needLen = static_cast<int32_t>(keywords.size()); + int32_t capacity = 0; + char* buffer = sink.GetAppendBuffer( + needLen, needLen, nullptr, needLen, &capacity); + if (capacity < needLen || buffer == nullptr) { + status = U_BUFFER_OVERFLOW_ERROR; + } else { + *buffer = '@'; + sink.Append(buffer, needLen); + } + return needLen; } - // needLen = length of the part before '@' - needLen = (int32_t)(startSearchHere - buffer); - // Check to see can we fit the startSearchHere, if not, return + needLen = updatedKeysAndValues.length(); + // Check to see can we fit the updatedKeysAndValues, if not, return // U_BUFFER_OVERFLOW_ERROR without copy updatedKeysAndValues into it. // We do this because this API function does not behave like most others: // It promises never to set a U_STRING_NOT_TERMINATED_WARNING. // When the contents fits but without the terminating NUL, in this case we need to not change // the buffer contents and return with a buffer overflow error. - int32_t appendLength = updatedKeysAndValues.length(); - if (appendLength >= bufferCapacity - needLen) { - *status = U_BUFFER_OVERFLOW_ERROR; - return needLen + appendLength; - } - needLen += updatedKeysAndValues.extract( - startSearchHere, bufferCapacity - needLen, *status); - U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING); + if (needLen > 0) { + int32_t capacity = 0; + char* buffer = sink.GetAppendBuffer( + needLen, needLen, nullptr, needLen, &capacity); + if (capacity < needLen || buffer == nullptr) { + status = U_BUFFER_OVERFLOW_ERROR; + return needLen; + } + uprv_memcpy(buffer, updatedKeysAndValues.data(), needLen); + sink.Append(buffer, needLen); + } + U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING); return needLen; } /* ### ID parsing implementation **************************************************/ -#define _isPrefixLetter(a) ((a=='x')||(a=='X')||(a=='i')||(a=='I')) +namespace { + +inline bool _isPrefixLetter(char a) { return a == 'x' || a == 'X' || a == 'i' || a == 'I'; } /*returns true if one of the special prefixes is here (s=string) 'x-' or 'i-' */ -#define _isIDPrefix(s) (_isPrefixLetter(s[0])&&_isIDSeparator(s[1])) +inline bool _isIDPrefix(std::string_view s) { + return s.size() >= 2 && _isPrefixLetter(s[0]) && _isIDSeparator(s[1]); +} /* Dot terminates it because of POSIX form where dot precedes the codepage * except for variant */ -#define _isTerminator(a) ((a==0)||(a=='.')||(a=='@')) +inline bool _isTerminator(char a) { return a == '.' || a == '@'; } + +inline bool _isBCP47Extension(std::string_view p) { + return p.size() >= 3 && + p[0] == '-' && + (p[1] == 't' || p[1] == 'T' || + p[1] == 'u' || p[1] == 'U' || + p[1] == 'x' || p[1] == 'X') && + p[2] == '-'; +} /** * Lookup 'key' in the array 'list'. The array 'list' should contain @@ -1087,7 +1174,7 @@ uloc_setKeywordValue(const char* keywordName, * The 'list' param should be LANGUAGES, LANGUAGES_3, COUNTRIES, or * COUNTRIES_3. */ -static int16_t _findIndex(const char* const* list, const char* key) +std::optional<int16_t> _findIndex(const char* const* list, const char* key) { const char* const* anchor = list; int32_t pass = 0; @@ -1096,198 +1183,464 @@ static int16_t _findIndex(const char* const* list, const char* key) while (pass++ < 2) { while (*list) { if (uprv_strcmp(key, *list) == 0) { - return (int16_t)(list - anchor); + return static_cast<int16_t>(list - anchor); } list++; } ++list; /* skip final nullptr *CWB*/ } - return -1; + return std::nullopt; } +} // namespace + U_CFUNC const char* uloc_getCurrentCountryID(const char* oldID){ - int32_t offset = _findIndex(DEPRECATED_COUNTRIES, oldID); - if (offset >= 0) { - return REPLACEMENT_COUNTRIES[offset]; - } - return oldID; + std::optional<int16_t> offset = _findIndex(DEPRECATED_COUNTRIES, oldID); + return offset.has_value() ? REPLACEMENT_COUNTRIES[*offset] : oldID; } U_CFUNC const char* uloc_getCurrentLanguageID(const char* oldID){ - int32_t offset = _findIndex(DEPRECATED_LANGUAGES, oldID); - if (offset >= 0) { - return REPLACEMENT_LANGUAGES[offset]; - } - return oldID; + std::optional<int16_t> offset = _findIndex(DEPRECATED_LANGUAGES, oldID); + return offset.has_value() ? REPLACEMENT_LANGUAGES[*offset] : oldID; } + +namespace { + /* - * the internal functions _getLanguage(), _getCountry(), _getVariant() + * the internal functions _getLanguage(), _getScript(), _getRegion(), _getVariant() * avoid duplicating code to handle the earlier locale ID pieces * in the functions for the later ones by * setting the *pEnd pointer to where they stopped parsing * * TODO try to use this in Locale */ -CharString U_EXPORT2 -ulocimp_getLanguage(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; - - if (uprv_stricmp(localeID, "root") == 0) { - localeID += 4; - } else if (uprv_strnicmp(localeID, "und", 3) == 0 && - (localeID[3] == '\0' || + +size_t _getLanguage(std::string_view localeID, ByteSink* sink, UErrorCode& status) { + size_t skip = 0; + if (localeID.size() == 4 && uprv_strnicmp(localeID.data(), "root", 4) == 0) { + skip = 4; + localeID.remove_prefix(skip); + } else if (localeID.size() >= 3 && uprv_strnicmp(localeID.data(), "und", 3) == 0 && + (localeID.size() == 3 || localeID[3] == '-' || localeID[3] == '_' || localeID[3] == '@')) { - localeID += 3; + skip = 3; + localeID.remove_prefix(skip); } + constexpr int32_t MAXLEN = ULOC_LANG_CAPACITY - 1; // Minus NUL. + /* if it starts with i- or x- then copy that prefix */ - if(_isIDPrefix(localeID)) { - result.append((char)uprv_tolower(*localeID), status); - result.append('-', status); - localeID+=2; + size_t len = _isIDPrefix(localeID) ? 2 : 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + if (len == MAXLEN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + len++; } - /* copy the language as far as possible and count its length */ - while(!_isTerminator(*localeID) && !_isIDSeparator(*localeID)) { - result.append((char)uprv_tolower(*localeID), status); - localeID++; + if (sink == nullptr || len == 0) { return skip + len; } + + int32_t minCapacity = uprv_max(static_cast<int32_t>(len), 4); // Minimum 3 letters plus NUL. + char scratch[MAXLEN]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity); + + for (size_t i = 0; i < len; ++i) { + buffer[i] = uprv_tolower(localeID[i]); + } + if (localeID.size() >= 2 && _isIDSeparator(localeID[1])) { + buffer[1] = '-'; } - if(result.length()==3) { + if (len == 3) { /* convert 3 character code to 2 character code if possible *CWB*/ - int32_t offset = _findIndex(LANGUAGES_3, result.data()); - if(offset>=0) { - result.clear(); - result.append(LANGUAGES[offset], status); + U_ASSERT(capacity >= 4); + buffer[3] = '\0'; + std::optional<int16_t> offset = _findIndex(LANGUAGES_3, buffer); + if (offset.has_value()) { + const char* const alias = LANGUAGES[*offset]; + sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias))); + return skip + len; } } - if(pEnd!=nullptr) { - *pEnd=localeID; - } - - return result; + sink->Append(buffer, static_cast<int32_t>(len)); + return skip + len; } -CharString U_EXPORT2 -ulocimp_getScript(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; - int32_t idLen = 0; +size_t _getScript(std::string_view localeID, ByteSink* sink) { + constexpr int32_t LENGTH = 4; - if (pEnd != nullptr) { - *pEnd = localeID; + size_t len = 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len]) && + uprv_isASCIILetter(localeID[len])) { + if (len == LENGTH) { return 0; } + len++; } + if (len != LENGTH) { return 0; } - /* copy the second item as far as possible and count its length */ - while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen]) - && uprv_isASCIILetter(localeID[idLen])) { - idLen++; - } + if (sink == nullptr) { return len; } - /* If it's exactly 4 characters long, then it's a script and not a country. */ - if (idLen == 4) { - int32_t i; - if (pEnd != nullptr) { - *pEnd = localeID+idLen; - } - if (idLen >= 1) { - result.append((char)uprv_toupper(*(localeID++)), status); - } - for (i = 1; i < idLen; i++) { - result.append((char)uprv_tolower(*(localeID++)), status); - } + char scratch[LENGTH]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + LENGTH, LENGTH, scratch, UPRV_LENGTHOF(scratch), &capacity); + + buffer[0] = uprv_toupper(localeID[0]); + for (int32_t i = 1; i < LENGTH; ++i) { + buffer[i] = uprv_tolower(localeID[i]); } - return result; + sink->Append(buffer, LENGTH); + return len; } -CharString U_EXPORT2 -ulocimp_getCountry(const char *localeID, - const char **pEnd, - UErrorCode &status) { - CharString result; - int32_t idLen=0; +size_t _getRegion(std::string_view localeID, ByteSink* sink) { + constexpr int32_t MINLEN = 2; + constexpr int32_t MAXLEN = ULOC_COUNTRY_CAPACITY - 1; // Minus NUL. - /* copy the country as far as possible and count its length */ - while(!_isTerminator(localeID[idLen]) && !_isIDSeparator(localeID[idLen])) { - result.append((char)uprv_toupper(localeID[idLen]), status); - idLen++; + size_t len = 0; + while (len < localeID.size() && !_isTerminator(localeID[len]) && !_isIDSeparator(localeID[len])) { + if (len == MAXLEN) { return 0; } + len++; } + if (len < MINLEN) { return 0; } - /* the country should be either length 2 or 3 */ - if (idLen == 2 || idLen == 3) { - /* convert 3 character code to 2 character code if possible *CWB*/ - if(idLen==3) { - int32_t offset = _findIndex(COUNTRIES_3, result.data()); - if(offset>=0) { - result.clear(); - result.append(COUNTRIES[offset], status); - } - } - localeID+=idLen; - } else { - result.clear(); + if (sink == nullptr) { return len; } + + char scratch[ULOC_COUNTRY_CAPACITY]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + ULOC_COUNTRY_CAPACITY, + ULOC_COUNTRY_CAPACITY, + scratch, + UPRV_LENGTHOF(scratch), + &capacity); + + for (size_t i = 0; i < len; ++i) { + buffer[i] = uprv_toupper(localeID[i]); } - if(pEnd!=nullptr) { - *pEnd=localeID; + if (len == 3) { + /* convert 3 character code to 2 character code if possible *CWB*/ + U_ASSERT(capacity >= 4); + buffer[3] = '\0'; + std::optional<int16_t> offset = _findIndex(COUNTRIES_3, buffer); + if (offset.has_value()) { + const char* const alias = COUNTRIES[*offset]; + sink->Append(alias, static_cast<int32_t>(uprv_strlen(alias))); + return len; + } } - return result; + sink->Append(buffer, static_cast<int32_t>(len)); + return len; } /** * @param needSeparator if true, then add leading '_' if any variants * are added to 'variant' */ -static void -_getVariant(const char *localeID, +size_t +_getVariant(std::string_view localeID, char prev, - ByteSink& sink, - UBool needSeparator) { - UBool hasVariant = false; + ByteSink* sink, + bool needSeparator, + UErrorCode& status) { + if (U_FAILURE(status) || localeID.empty()) return 0; + + // Reasonable upper limit for variants + // There are no strict limitation of the syntax of variant in the legacy + // locale format. If the locale is constructed from unicode_locale_id + // as defined in UTS35, then we know each unicode_variant_subtag + // could have max length of 8 ((alphanum{5,8} | digit alphanum{3}) + // 179 would allow 20 unicode_variant_subtag with sep in the + // unicode_locale_id + // 8*20 + 1*(20-1) = 179 + constexpr int32_t MAX_VARIANTS_LENGTH = 179; /* get one or more variant tags and separate them with '_' */ - if(_isIDSeparator(prev)) { + size_t index = 0; + if (_isIDSeparator(prev)) { /* get a variant string after a '-' or '_' */ - while(!_isTerminator(*localeID)) { - if (needSeparator) { - sink.Append("_", 1); - needSeparator = false; + for (std::string_view sub = localeID;;) { + size_t next = sub.find_first_of(".@_-"); + // For historical reasons, a trailing separator is included in the variant. + bool finished = next == std::string_view::npos || next + 1 == sub.length(); + size_t limit = finished ? sub.length() : next; + index += limit; + if (index > MAX_VARIANTS_LENGTH) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - char c = (char)uprv_toupper(*localeID); - if (c == '-') c = '_'; - sink.Append(&c, 1); - hasVariant = true; - localeID++; + + if (sink != nullptr) { + if (needSeparator) { + sink->Append("_", 1); + } else { + needSeparator = true; + } + + int32_t length = static_cast<int32_t>(limit); + int32_t minCapacity = uprv_min(length, MAX_VARIANTS_LENGTH); + char scratch[MAX_VARIANTS_LENGTH]; + int32_t capacity = 0; + char* buffer = sink->GetAppendBuffer( + minCapacity, minCapacity, scratch, UPRV_LENGTHOF(scratch), &capacity); + + for (size_t i = 0; i < limit; ++i) { + buffer[i] = uprv_toupper(sub[i]); + } + sink->Append(buffer, length); + } + + if (finished) { return index; } + sub.remove_prefix(next); + if (_isTerminator(sub.front()) || _isBCP47Extension(sub)) { return index; } + sub.remove_prefix(1); + index++; } } + size_t skip = 0; /* if there is no variant tag after a '-' or '_' then look for '@' */ - if(!hasVariant) { - if(prev=='@') { - /* keep localeID */ - } else if((localeID=locale_getKeywordsStart(localeID))!=nullptr) { - ++localeID; /* point after the '@' */ - } else { - return; + if (prev == '@') { + /* keep localeID */ + } else if (const char* p = locale_getKeywordsStart(localeID); p != nullptr) { + skip = 1 + p - localeID.data(); /* point after the '@' */ + localeID.remove_prefix(skip); + } else { + return 0; + } + for (; index < localeID.size() && !_isTerminator(localeID[index]); index++) { + if (index >= MAX_VARIANTS_LENGTH) { // same as length > MAX_VARIANTS_LENGTH + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - while(!_isTerminator(*localeID)) { - if (needSeparator) { - sink.Append("_", 1); - needSeparator = false; + if (needSeparator) { + if (sink != nullptr) { + sink->Append("_", 1); } - char c = (char)uprv_toupper(*localeID); + needSeparator = false; + } + if (sink != nullptr) { + char c = uprv_toupper(localeID[index]); if (c == '-' || c == ',') c = '_'; - sink.Append(&c, 1); - localeID++; + sink->Append(&c, 1); + } + } + return skip + index; +} + +} // namespace + +U_EXPORT CharString +ulocimp_getLanguage(std::string_view localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + &sink, + nullptr, + nullptr, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getScript(std::string_view localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + &sink, + nullptr, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getRegion(std::string_view localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + &sink, + nullptr, + nullptr, + status); + }, + status); +} + +U_EXPORT CharString +ulocimp_getVariant(std::string_view localeID, UErrorCode& status) { + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + status); + }, + status); +} + +U_EXPORT void +ulocimp_getSubtags( + std::string_view localeID, + CharString* language, + CharString* script, + CharString* region, + CharString* variant, + const char** pEnd, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + std::optional<CharStringByteSink> languageSink; + std::optional<CharStringByteSink> scriptSink; + std::optional<CharStringByteSink> regionSink; + std::optional<CharStringByteSink> variantSink; + + if (language != nullptr) { languageSink.emplace(language); } + if (script != nullptr) { scriptSink.emplace(script); } + if (region != nullptr) { regionSink.emplace(region); } + if (variant != nullptr) { variantSink.emplace(variant); } + + ulocimp_getSubtags( + localeID, + languageSink.has_value() ? &*languageSink : nullptr, + scriptSink.has_value() ? &*scriptSink : nullptr, + regionSink.has_value() ? &*regionSink : nullptr, + variantSink.has_value() ? &*variantSink : nullptr, + pEnd, + status); +} + +U_EXPORT void +ulocimp_getSubtags( + std::string_view localeID, + ByteSink* language, + ByteSink* script, + ByteSink* region, + ByteSink* variant, + const char** pEnd, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + if (pEnd != nullptr) { + *pEnd = localeID.data(); + } else if (language == nullptr && + script == nullptr && + region == nullptr && + variant == nullptr) { + return; + } + + if (localeID.empty()) { return; } + + bool hasRegion = false; + + { + size_t len = _getLanguage(localeID, language, status); + if (U_FAILURE(status)) { return; } + if (len > 0) { + localeID.remove_prefix(len); + } + } + + if (pEnd != nullptr) { + *pEnd = localeID.data(); + } else if (script == nullptr && + region == nullptr && + variant == nullptr) { + return; + } + + if (localeID.empty()) { return; } + + if (_isIDSeparator(localeID.front())) { + std::string_view sub = localeID; + sub.remove_prefix(1); + size_t len = _getScript(sub, script); + if (len > 0) { + localeID.remove_prefix(len + 1); + if (pEnd != nullptr) { *pEnd = localeID.data(); } + } + } + + if ((region == nullptr && variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; } + + if (_isIDSeparator(localeID.front())) { + std::string_view sub = localeID; + sub.remove_prefix(1); + size_t len = _getRegion(sub, region); + if (len > 0) { + hasRegion = true; + localeID.remove_prefix(len + 1); + if (pEnd != nullptr) { *pEnd = localeID.data(); } + } + } + + if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; } + + bool hasVariant = false; + + if (_isIDSeparator(localeID.front()) && !_isBCP47Extension(localeID)) { + std::string_view sub = localeID; + /* If there was no country ID, skip a possible extra IDSeparator */ + size_t skip = !hasRegion && localeID.size() > 1 && _isIDSeparator(localeID[1]) ? 2 : 1; + sub.remove_prefix(skip); + size_t len = _getVariant(sub, localeID[0], variant, false, status); + if (U_FAILURE(status)) { return; } + if (len > 0) { + hasVariant = true; + localeID.remove_prefix(skip + len); + if (pEnd != nullptr) { *pEnd = localeID.data(); } + } + } + + if ((variant == nullptr && pEnd == nullptr) || localeID.empty()) { return; } + + if (_isBCP47Extension(localeID)) { + localeID.remove_prefix(2); + constexpr char vaposix[] = "-va-posix"; + constexpr size_t length = sizeof vaposix - 1; + for (size_t next;; localeID.remove_prefix(next)) { + next = localeID.find('-', 1); + if (next == std::string_view::npos) { break; } + next = localeID.find('-', next + 1); + bool finished = next == std::string_view::npos; + std::string_view sub = localeID; + if (!finished) { sub.remove_suffix(sub.length() - next); } + + if (sub.length() == length && uprv_strnicmp(sub.data(), vaposix, length) == 0) { + if (variant != nullptr) { + if (hasVariant) { variant->Append("_", 1); } + constexpr char posix[] = "POSIX"; + variant->Append(posix, sizeof posix - 1); + } + if (pEnd != nullptr) { *pEnd = localeID.data() + length; } + } + + if (finished) { break; } } } } @@ -1359,12 +1712,11 @@ static const UEnumeration gKeywordsEnum = { U_CAPI UEnumeration* U_EXPORT2 uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status) { + if (U_FAILURE(*status)) { return nullptr; } + LocalMemory<UKeywordsContext> myContext; LocalMemory<UEnumeration> result; - if (U_FAILURE(*status)) { - return nullptr; - } myContext.adoptInstead(static_cast<UKeywordsContext *>(uprv_malloc(sizeof(UKeywordsContext)))); result.adoptInstead(static_cast<UEnumeration *>(uprv_malloc(sizeof(UEnumeration)))); if (myContext.isNull() || result.isNull()) { @@ -1388,16 +1740,15 @@ U_CAPI UEnumeration* U_EXPORT2 uloc_openKeywords(const char* localeID, UErrorCode* status) { - CharString tempBuffer; - const char* tmpLocaleID; - if(status==nullptr || U_FAILURE(*status)) { - return 0; + return nullptr; } - if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, status); + CharString tempBuffer; + const char* tmpLocaleID; + + if (localeID != nullptr && _hasBCP47Extension(localeID)) { + tempBuffer = ulocimp_forLanguageTag(localeID, -1, nullptr, *status); tmpLocaleID = U_SUCCESS(*status) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; } else { if (localeID==nullptr) { @@ -1406,37 +1757,21 @@ uloc_openKeywords(const char* localeID, tmpLocaleID=localeID; } - /* Skip the language */ - ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *status); + ulocimp_getSubtags( + tmpLocaleID, + nullptr, + nullptr, + nullptr, + nullptr, + &tmpLocaleID, + *status); if (U_FAILURE(*status)) { - return 0; - } - - if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(tmpLocaleID+1, &scriptID, *status); - if (U_FAILURE(*status)) { - return 0; - } - if(scriptID != tmpLocaleID+1) { - /* Found optional script */ - tmpLocaleID = scriptID; - } - /* Skip the Country */ - if (_isIDSeparator(*tmpLocaleID)) { - ulocimp_getCountry(tmpLocaleID+1, &tmpLocaleID, *status); - if (U_FAILURE(*status)) { - return 0; - } - } + return nullptr; } /* keywords are located after '@' */ if((tmpLocaleID = locale_getKeywordsStart(tmpLocaleID)) != nullptr) { - CharString keywords; - CharStringByteSink sink(&keywords); - ulocimp_getKeywords(tmpLocaleID+1, '@', sink, false, status); + CharString keywords = ulocimp_getKeywords(tmpLocaleID + 1, '@', false, *status); if (U_FAILURE(*status)) { return nullptr; } @@ -1450,10 +1785,12 @@ uloc_openKeywords(const char* localeID, #define _ULOC_STRIP_KEYWORDS 0x2 #define _ULOC_CANONICALIZE 0x1 -#define OPTION_SET(options, mask) ((options & mask) != 0) +namespace { -static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; -#define I_DEFAULT_LENGTH UPRV_LENGTHOF(i_default) +inline bool OPTION_SET(uint32_t options, uint32_t mask) { return (options & mask) != 0; } + +constexpr char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; +constexpr int32_t I_DEFAULT_LENGTH = UPRV_LENGTHOF(i_default); /** * Canonicalize the given localeID, to level 1 or to level 2, @@ -1462,175 +1799,166 @@ static const char i_default[] = {'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}; * * This is the code underlying uloc_getName and uloc_canonicalize. */ -static void -_canonicalize(const char* localeID, +void +_canonicalize(std::string_view localeID, ByteSink& sink, uint32_t options, - UErrorCode* err) { - if (U_FAILURE(*err)) { + UErrorCode& err) { + if (U_FAILURE(err)) { return; } - int32_t j, fieldCount=0, scriptSize=0, variantSize=0; + int32_t j, fieldCount=0; CharString tempBuffer; // if localeID has a BCP47 extension, tmpLocaleID points to this CharString localeIDWithHyphens; // if localeID has a BPC47 extension and have _, tmpLocaleID points to this - const char* origLocaleID; - const char* tmpLocaleID; - const char* keywordAssign = nullptr; - const char* separatorIndicator = nullptr; + std::string_view origLocaleID; + std::string_view tmpLocaleID; + size_t keywordAssign = std::string_view::npos; + size_t separatorIndicator = std::string_view::npos; if (_hasBCP47Extension(localeID)) { - const char* localeIDPtr = localeID; + std::string_view localeIDPtr = localeID; // convert all underbars to hyphens, unless the "BCP47 extension" comes at the beginning of the string - if (uprv_strchr(localeID, '_') != nullptr && localeID[1] != '-' && localeID[1] != '_') { - localeIDWithHyphens.append(localeID, -1, *err); - if (U_SUCCESS(*err)) { + if (localeID.size() >= 2 && localeID.find('_') != std::string_view::npos && localeID[1] != '-' && localeID[1] != '_') { + localeIDWithHyphens.append(localeID, err); + if (U_SUCCESS(err)) { for (char* p = localeIDWithHyphens.data(); *p != '\0'; ++p) { if (*p == '_') { *p = '-'; } } - localeIDPtr = localeIDWithHyphens.data(); + localeIDPtr = localeIDWithHyphens.toStringPiece(); } } - CharStringByteSink tempSink(&tempBuffer); - ulocimp_forLanguageTag(localeIDPtr, -1, tempSink, nullptr, err); - tmpLocaleID = U_SUCCESS(*err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeIDPtr; + tempBuffer = ulocimp_forLanguageTag(localeIDPtr.data(), static_cast<int32_t>(localeIDPtr.size()), nullptr, err); + tmpLocaleID = U_SUCCESS(err) && !tempBuffer.isEmpty() ? static_cast<std::string_view>(tempBuffer.toStringPiece()) : localeIDPtr; } else { - if (localeID==nullptr) { - localeID=uloc_getDefault(); - } tmpLocaleID=localeID; } origLocaleID=tmpLocaleID; /* get all pieces, one after another, and separate with '_' */ - CharString tag = ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *err); + CharString tag; + CharString script; + CharString country; + CharString variant; + const char* end = nullptr; + ulocimp_getSubtags( + tmpLocaleID, + &tag, + &script, + &country, + &variant, + &end, + err); + if (U_FAILURE(err)) { + return; + } + U_ASSERT(end != nullptr); + if (end > tmpLocaleID.data()) { + tmpLocaleID.remove_prefix(end - tmpLocaleID.data()); + } - if (tag.length() == I_DEFAULT_LENGTH && - uprv_strncmp(origLocaleID, i_default, I_DEFAULT_LENGTH) == 0) { + if (tag.length() == I_DEFAULT_LENGTH && origLocaleID.length() >= I_DEFAULT_LENGTH && + uprv_strncmp(origLocaleID.data(), i_default, I_DEFAULT_LENGTH) == 0) { tag.clear(); - tag.append(uloc_getDefault(), *err); - } else if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - - ++fieldCount; - tag.append('_', *err); - - CharString script = ulocimp_getScript(tmpLocaleID+1, &scriptID, *err); - tag.append(script, *err); - scriptSize = script.length(); - if(scriptSize > 0) { - /* Found optional script */ - tmpLocaleID = scriptID; + tag.append(uloc_getDefault(), err); + } else { + if (!script.isEmpty()) { ++fieldCount; - if (_isIDSeparator(*tmpLocaleID)) { - /* If there is something else, then we add the _ */ - tag.append('_', *err); - } + tag.append('_', err); + tag.append(script, err); } - - if (_isIDSeparator(*tmpLocaleID)) { - const char *cntryID; - - CharString country = ulocimp_getCountry(tmpLocaleID+1, &cntryID, *err); - tag.append(country, *err); - if (!country.isEmpty()) { - /* Found optional country */ - tmpLocaleID = cntryID; - } - if(_isIDSeparator(*tmpLocaleID)) { - /* If there is something else, then we add the _ if we found country before. */ - if (!_isIDSeparator(*(tmpLocaleID+1))) { - ++fieldCount; - tag.append('_', *err); - } - - variantSize = -tag.length(); - { - CharStringByteSink s(&tag); - _getVariant(tmpLocaleID+1, *tmpLocaleID, s, false); - } - variantSize += tag.length(); - if (variantSize > 0) { - tmpLocaleID += variantSize + 1; /* skip '_' and variant */ - } + if (!country.isEmpty()) { + ++fieldCount; + tag.append('_', err); + tag.append(country, err); + } + if (!variant.isEmpty()) { + ++fieldCount; + if (country.isEmpty()) { + tag.append('_', err); } + tag.append('_', err); + tag.append(variant, err); } } /* Copy POSIX-style charset specifier, if any [mr.utf8] */ - if (!OPTION_SET(options, _ULOC_CANONICALIZE) && *tmpLocaleID == '.') { - UBool done = false; - do { - char c = *tmpLocaleID; - switch (c) { - case 0: - case '@': - done = true; - break; - default: - tag.append(c, *err); - ++tmpLocaleID; - break; - } - } while (!done); + if (!OPTION_SET(options, _ULOC_CANONICALIZE) && !tmpLocaleID.empty() && tmpLocaleID.front() == '.') { + tag.append('.', err); + tmpLocaleID.remove_prefix(1); + size_t length; + if (size_t atPos = tmpLocaleID.find('@'); atPos != std::string_view::npos) { + length = atPos; + } else { + length = tmpLocaleID.length(); + } + // The longest charset name we found in IANA charset registry + // https://www.iana.org/assignments/character-sets/ is + // "Extended_UNIX_Code_Packed_Format_for_Japanese" in length 45. + // we therefore restrict the length here to be 64 which is a power of 2 + // number that is longer than 45. + constexpr size_t kMaxCharsetLength = 64; + if (length > kMaxCharsetLength) { + err = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return; + } + if (length > 0) { + tag.append(tmpLocaleID.data(), static_cast<int32_t>(length), err); + tmpLocaleID.remove_prefix(length); + } } /* Scan ahead to next '@' and determine if it is followed by '=' and/or ';' - After this, tmpLocaleID either points to '@' or is nullptr */ - if ((tmpLocaleID=locale_getKeywordsStart(tmpLocaleID))!=nullptr) { - keywordAssign = uprv_strchr(tmpLocaleID, '='); - separatorIndicator = uprv_strchr(tmpLocaleID, ';'); + After this, tmpLocaleID either starts at '@' or is empty. */ + if (const char* start = locale_getKeywordsStart(tmpLocaleID); start != nullptr) { + if (start > tmpLocaleID.data()) { + tmpLocaleID.remove_prefix(start - tmpLocaleID.data()); + } + keywordAssign = tmpLocaleID.find('='); + separatorIndicator = tmpLocaleID.find(';'); + } else { + tmpLocaleID = {}; } /* Copy POSIX-style variant, if any [mr@FOO] */ if (!OPTION_SET(options, _ULOC_CANONICALIZE) && - tmpLocaleID != nullptr && keywordAssign == nullptr) { - for (;;) { - char c = *tmpLocaleID; - if (c == 0) { - break; - } - tag.append(c, *err); - ++tmpLocaleID; - } + !tmpLocaleID.empty() && keywordAssign == std::string_view::npos) { + tag.append(tmpLocaleID, err); + tmpLocaleID = {}; } if (OPTION_SET(options, _ULOC_CANONICALIZE)) { /* Handle @FOO variant if @ is present and not followed by = */ - if (tmpLocaleID!=nullptr && keywordAssign==nullptr) { + if (!tmpLocaleID.empty() && keywordAssign == std::string_view::npos) { /* Add missing '_' if needed */ - if (fieldCount < 2 || (fieldCount < 3 && scriptSize > 0)) { + if (fieldCount < 2 || (fieldCount < 3 && !script.isEmpty())) { do { - tag.append('_', *err); + tag.append('_', err); ++fieldCount; } while(fieldCount<2); } - int32_t posixVariantSize = -tag.length(); - { - CharStringByteSink s(&tag); - _getVariant(tmpLocaleID+1, '@', s, (UBool)(variantSize > 0)); - } - posixVariantSize += tag.length(); - if (posixVariantSize > 0) { - variantSize += posixVariantSize; - } + CharStringByteSink s(&tag); + std::string_view sub = tmpLocaleID; + sub.remove_prefix(1); + _getVariant(sub, '@', &s, !variant.isEmpty(), err); + if (U_FAILURE(err)) { return; } } /* Look up the ID in the canonicalization map */ for (j=0; j<UPRV_LENGTHOF(CANONICALIZE_MAP); j++) { StringPiece id(CANONICALIZE_MAP[j].id); if (tag == id) { - if (id.empty() && tmpLocaleID != nullptr) { + if (id.empty() && !tmpLocaleID.empty()) { break; /* Don't remap "" if keywords present */ } tag.clear(); - tag.append(CANONICALIZE_MAP[j].canonicalID, *err); + tag.append(CANONICALIZE_MAP[j].canonicalID, err); break; } } @@ -1639,15 +1967,18 @@ _canonicalize(const char* localeID, sink.Append(tag.data(), tag.length()); if (!OPTION_SET(options, _ULOC_STRIP_KEYWORDS)) { - if (tmpLocaleID!=nullptr && keywordAssign!=nullptr && - (!separatorIndicator || separatorIndicator > keywordAssign)) { + if (!tmpLocaleID.empty() && keywordAssign != std::string_view::npos && + (separatorIndicator == std::string_view::npos || separatorIndicator > keywordAssign)) { sink.Append("@", 1); ++fieldCount; - ulocimp_getKeywords(tmpLocaleID+1, '@', sink, true, err); + tmpLocaleID.remove_prefix(1); + ulocimp_getKeywords(tmpLocaleID, '@', sink, true, err); } } } +} // namespace + /* ### ID parsing API **************************************************/ U_CAPI int32_t U_EXPORT2 @@ -1656,45 +1987,41 @@ uloc_getParent(const char* localeID, int32_t parentCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(parent, parentCapacity); - ulocimp_getParent(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(parent, parentCapacity, reslen, err); - } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + parent, parentCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getParent(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getParent(const char* localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getParent(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_getParent(const char* localeID, icu::ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { + if (U_FAILURE(err)) { return; } + const char *lastUnderscore; int32_t i; - if (U_FAILURE(*err)) - return; - if (localeID == nullptr) localeID = uloc_getDefault(); lastUnderscore=uprv_strrchr(localeID, '_'); if(lastUnderscore!=nullptr) { - i=(int32_t)(lastUnderscore-localeID); + i = static_cast<int32_t>(lastUnderscore - localeID); } else { i=0; } @@ -1714,17 +2041,24 @@ uloc_getLanguage(const char* localeID, int32_t languageCapacity, UErrorCode* err) { - /* uloc_getLanguage will return a 2 character iso-639 code if one exists. *CWB*/ - - if (err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } - return ulocimp_getLanguage(localeID, nullptr, *err).extract(language, languageCapacity, *err); + /* uloc_getLanguage will return a 2 character iso-639 code if one exists. *CWB*/ + return ByteSinkUtil::viaByteSinkToTerminatedChars( + language, languageCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + &sink, + nullptr, + nullptr, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1733,24 +2067,23 @@ uloc_getScript(const char* localeID, int32_t scriptCapacity, UErrorCode* err) { - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); - } - - /* skip the language */ - ulocimp_getLanguage(localeID, &localeID, *err); - if (U_FAILURE(*err)) { - return 0; + if (localeID == nullptr) { + localeID = uloc_getDefault(); } - if(_isIDSeparator(*localeID)) { - return ulocimp_getScript(localeID+1, nullptr, *err).extract(script, scriptCapacity, *err); - } - return u_terminateChars(script, scriptCapacity, 0, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + script, scriptCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + &sink, + nullptr, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1759,36 +2092,23 @@ uloc_getCountry(const char* localeID, int32_t countryCapacity, UErrorCode* err) { - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if(localeID==nullptr) { - localeID=uloc_getDefault(); - } - - /* Skip the language */ - ulocimp_getLanguage(localeID, &localeID, *err); - if (U_FAILURE(*err)) { - return 0; + if (localeID == nullptr) { + localeID = uloc_getDefault(); } - if(_isIDSeparator(*localeID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(localeID+1, &scriptID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if(scriptID != localeID+1) { - /* Found optional script */ - localeID = scriptID; - } - if(_isIDSeparator(*localeID)) { - return ulocimp_getCountry(localeID+1, nullptr, *err).extract(country, countryCapacity, *err); - } - } - return u_terminateChars(country, countryCapacity, 0, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + country, countryCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + &sink, + nullptr, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1797,77 +2117,23 @@ uloc_getVariant(const char* localeID, int32_t variantCapacity, UErrorCode* err) { - CharString tempBuffer; - const char* tmpLocaleID; - int32_t i=0; - - if(err==nullptr || U_FAILURE(*err)) { - return 0; - } - - if (_hasBCP47Extension(localeID)) { - CharStringByteSink sink(&tempBuffer); - ulocimp_forLanguageTag(localeID, -1, sink, nullptr, err); - tmpLocaleID = U_SUCCESS(*err) && !tempBuffer.isEmpty() ? tempBuffer.data() : localeID; - } else { - if (localeID==nullptr) { - localeID=uloc_getDefault(); - } - tmpLocaleID=localeID; - } - - /* Skip the language */ - ulocimp_getLanguage(tmpLocaleID, &tmpLocaleID, *err); - if (U_FAILURE(*err)) { - return 0; - } - - if(_isIDSeparator(*tmpLocaleID)) { - const char *scriptID; - /* Skip the script if available */ - ulocimp_getScript(tmpLocaleID+1, &scriptID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if(scriptID != tmpLocaleID+1) { - /* Found optional script */ - tmpLocaleID = scriptID; - } - /* Skip the Country */ - if (_isIDSeparator(*tmpLocaleID)) { - const char *cntryID; - ulocimp_getCountry(tmpLocaleID+1, &cntryID, *err); - if (U_FAILURE(*err)) { - return 0; - } - if (cntryID != tmpLocaleID+1) { - /* Found optional country */ - tmpLocaleID = cntryID; - } - if(_isIDSeparator(*tmpLocaleID)) { - /* If there was no country ID, skip a possible extra IDSeparator */ - if (tmpLocaleID != cntryID && _isIDSeparator(tmpLocaleID[1])) { - tmpLocaleID++; - } - - CheckedArrayByteSink sink(variant, variantCapacity); - _getVariant(tmpLocaleID+1, *tmpLocaleID, sink, false); - - i = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return i; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - return i; - } - } - } + if (localeID == nullptr) { + localeID = uloc_getDefault(); } - return u_terminateChars(variant, variantCapacity, i, err); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + variant, variantCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + status); + }, + *err); } U_CAPI int32_t U_EXPORT2 @@ -1876,32 +2142,32 @@ uloc_getName(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_getName(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getName(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getName(std::string_view localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getName(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 -ulocimp_getName(const char* localeID, +U_EXPORT void +ulocimp_getName(std::string_view localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, 0, err); } @@ -1912,32 +2178,32 @@ uloc_getBaseName(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_getBaseName(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getBaseName(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_getBaseName(std::string_view localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_getBaseName(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 -ulocimp_getBaseName(const char* localeID, +U_EXPORT void +ulocimp_getBaseName(std::string_view localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, _ULOC_STRIP_KEYWORDS, err); } @@ -1948,32 +2214,32 @@ uloc_canonicalize(const char* localeID, int32_t nameCapacity, UErrorCode* err) { - if (U_FAILURE(*err)) { - return 0; - } - - CheckedArrayByteSink sink(name, nameCapacity); - ulocimp_canonicalize(localeID, sink, err); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*err)) { - return reslen; - } - - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(name, nameCapacity, reslen, err); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + return ByteSinkUtil::viaByteSinkToTerminatedChars( + name, nameCapacity, + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_canonicalize(localeID, sink, status); + }, + *err); +} - return reslen; +U_EXPORT CharString +ulocimp_canonicalize(std::string_view localeID, + UErrorCode& err) +{ + return ByteSinkUtil::viaByteSinkToCharString( + [&](ByteSink& sink, UErrorCode& status) { + ulocimp_canonicalize(localeID, sink, status); + }, + err); } -U_CAPI void U_EXPORT2 -ulocimp_canonicalize(const char* localeID, +U_EXPORT void +ulocimp_canonicalize(std::string_view localeID, ByteSink& sink, - UErrorCode* err) + UErrorCode& err) { _canonicalize(localeID, sink, _ULOC_CANONICALIZE, err); } @@ -1981,49 +2247,39 @@ ulocimp_canonicalize(const char* localeID, U_CAPI const char* U_EXPORT2 uloc_getISO3Language(const char* localeID) { - int16_t offset; - char lang[ULOC_LANG_CAPACITY]; UErrorCode err = U_ZERO_ERROR; if (localeID == nullptr) { localeID = uloc_getDefault(); } - uloc_getLanguage(localeID, lang, ULOC_LANG_CAPACITY, &err); + CharString lang = ulocimp_getLanguage(localeID, err); if (U_FAILURE(err)) return ""; - offset = _findIndex(LANGUAGES, lang); - if (offset < 0) - return ""; - return LANGUAGES_3[offset]; + std::optional<int16_t> offset = _findIndex(LANGUAGES, lang.data()); + return offset.has_value() ? LANGUAGES_3[*offset] : ""; } U_CAPI const char* U_EXPORT2 uloc_getISO3Country(const char* localeID) { - int16_t offset; - char cntry[ULOC_LANG_CAPACITY]; UErrorCode err = U_ZERO_ERROR; if (localeID == nullptr) { localeID = uloc_getDefault(); } - uloc_getCountry(localeID, cntry, ULOC_LANG_CAPACITY, &err); + CharString cntry = ulocimp_getRegion(localeID, err); if (U_FAILURE(err)) return ""; - offset = _findIndex(COUNTRIES, cntry); - if (offset < 0) - return ""; - - return COUNTRIES_3[offset]; + std::optional<int16_t> offset = _findIndex(COUNTRIES, cntry.data()); + return offset.has_value() ? COUNTRIES_3[*offset] : ""; } U_CAPI uint32_t U_EXPORT2 uloc_getLCID(const char* localeID) { UErrorCode status = U_ZERO_ERROR; - char langID[ULOC_FULLNAME_CAPACITY]; uint32_t lcid = 0; /* Check for incomplete id. */ @@ -2042,37 +2298,20 @@ uloc_getLCID(const char* localeID) return lcid; } - uloc_getLanguage(localeID, langID, sizeof(langID), &status); - if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { + CharString langID = ulocimp_getLanguage(localeID, status); + if (U_FAILURE(status)) { return 0; } if (uprv_strchr(localeID, '@')) { // uprv_convertToLCID does not support keywords other than collation. // Remove all keywords except collation. - int32_t len; - char tmpLocaleID[ULOC_FULLNAME_CAPACITY]; - - CharString collVal; - { - CharStringByteSink sink(&collVal); - ulocimp_getKeywordValue(localeID, "collation", sink, &status); - } - + CharString collVal = ulocimp_getKeywordValue(localeID, "collation", status); if (U_SUCCESS(status) && !collVal.isEmpty()) { - len = uloc_getBaseName(localeID, tmpLocaleID, - UPRV_LENGTHOF(tmpLocaleID) - 1, &status); - - if (U_SUCCESS(status) && len > 0) { - tmpLocaleID[len] = 0; - - len = uloc_setKeywordValue("collation", collVal.data(), tmpLocaleID, - UPRV_LENGTHOF(tmpLocaleID) - len - 1, &status); - - if (U_SUCCESS(status) && len > 0) { - tmpLocaleID[len] = 0; - return uprv_convertToLCID(langID, tmpLocaleID, &status); - } + CharString tmpLocaleID = ulocimp_getBaseName(localeID, status); + ulocimp_setKeywordValue("collation", collVal.toStringPiece(), tmpLocaleID, status); + if (U_SUCCESS(status)) { + return uprv_convertToLCID(langID.data(), tmpLocaleID.data(), &status); } } @@ -2080,7 +2319,7 @@ uloc_getLCID(const char* localeID) status = U_ZERO_ERROR; } - return uprv_convertToLCID(langID, localeID, &status); + return uprv_convertToLCID(langID.data(), localeID, &status); } U_CAPI int32_t U_EXPORT2 @@ -2137,8 +2376,17 @@ uloc_getISOCountries() U_CAPI const char* U_EXPORT2 uloc_toUnicodeLocaleKey(const char* keyword) { - const char* bcpKey = ulocimp_toBcpKey(keyword); - if (bcpKey == nullptr && ultag_isUnicodeLocaleKey(keyword, -1)) { + if (keyword == nullptr || *keyword == '\0') { return nullptr; } + std::optional<std::string_view> result = ulocimp_toBcpKeyWithFallback(keyword); + return result.has_value() ? result->data() : nullptr; // Known to be NUL terminated. +} + +U_EXPORT std::optional<std::string_view> +ulocimp_toBcpKeyWithFallback(std::string_view keyword) +{ + std::optional<std::string_view> bcpKey = ulocimp_toBcpKey(keyword); + if (!bcpKey.has_value() && + ultag_isUnicodeLocaleKey(keyword.data(), static_cast<int32_t>(keyword.size()))) { // unknown keyword, but syntax is fine.. return keyword; } @@ -2148,53 +2396,66 @@ uloc_toUnicodeLocaleKey(const char* keyword) U_CAPI const char* U_EXPORT2 uloc_toUnicodeLocaleType(const char* keyword, const char* value) { - const char* bcpType = ulocimp_toBcpType(keyword, value, nullptr, nullptr); - if (bcpType == nullptr && ultag_isUnicodeLocaleType(value, -1)) { + if (keyword == nullptr || *keyword == '\0' || + value == nullptr || *value == '\0') { return nullptr; } + std::optional<std::string_view> result = ulocimp_toBcpTypeWithFallback(keyword, value); + return result.has_value() ? result->data() : nullptr; // Known to be NUL terminated. +} + +U_EXPORT std::optional<std::string_view> +ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value) +{ + std::optional<std::string_view> bcpType = ulocimp_toBcpType(keyword, value); + if (!bcpType.has_value() && + ultag_isUnicodeLocaleType(value.data(), static_cast<int32_t>(value.size()))) { // unknown keyword, but syntax is fine.. return value; } return bcpType; } -static UBool -isWellFormedLegacyKey(const char* legacyKey) +namespace { + +bool +isWellFormedLegacyKey(std::string_view key) { - const char* p = legacyKey; - while (*p) { - if (!UPRV_ISALPHANUM(*p)) { - return false; - } - p++; - } - return true; + return std::all_of(key.begin(), key.end(), UPRV_ISALPHANUM); } -static UBool -isWellFormedLegacyType(const char* legacyType) +bool +isWellFormedLegacyType(std::string_view legacyType) { - const char* p = legacyType; int32_t alphaNumLen = 0; - while (*p) { - if (*p == '_' || *p == '/' || *p == '-') { + for (char c : legacyType) { + if (c == '_' || c == '/' || c == '-') { if (alphaNumLen == 0) { return false; } alphaNumLen = 0; - } else if (UPRV_ISALPHANUM(*p)) { + } else if (UPRV_ISALPHANUM(c)) { alphaNumLen++; } else { return false; } - p++; } - return (alphaNumLen != 0); + return alphaNumLen != 0; } +} // namespace + U_CAPI const char* U_EXPORT2 uloc_toLegacyKey(const char* keyword) { - const char* legacyKey = ulocimp_toLegacyKey(keyword); - if (legacyKey == nullptr) { + if (keyword == nullptr || *keyword == '\0') { return nullptr; } + std::optional<std::string_view> result = ulocimp_toLegacyKeyWithFallback(keyword); + return result.has_value() ? result->data() : nullptr; // Known to be NUL terminated. +} + +U_EXPORT std::optional<std::string_view> +ulocimp_toLegacyKeyWithFallback(std::string_view keyword) +{ + std::optional<std::string_view> legacyKey = ulocimp_toLegacyKey(keyword); + if (!legacyKey.has_value() && isWellFormedLegacyKey(keyword)) { // Checks if the specified locale key is well-formed with the legacy locale syntax. // // Note: @@ -2202,9 +2463,7 @@ uloc_toLegacyKey(const char* keyword) // * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax // Keys can only consist of [0-9a-zA-Z]. - if (isWellFormedLegacyKey(keyword)) { - return keyword; - } + return keyword; } return legacyKey; } @@ -2212,8 +2471,17 @@ uloc_toLegacyKey(const char* keyword) U_CAPI const char* U_EXPORT2 uloc_toLegacyType(const char* keyword, const char* value) { - const char* legacyType = ulocimp_toLegacyType(keyword, value, nullptr, nullptr); - if (legacyType == nullptr) { + if (keyword == nullptr || *keyword == '\0' || + value == nullptr || *value == '\0') { return nullptr; } + std::optional<std::string_view> result = ulocimp_toLegacyTypeWithFallback(keyword, value); + return result.has_value() ? result->data() : nullptr; // Known to be NUL terminated. +} + +U_EXPORT std::optional<std::string_view> +ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value) +{ + std::optional<std::string_view> legacyType = ulocimp_toLegacyType(keyword, value); + if (!legacyType.has_value() && isWellFormedLegacyType(value)) { // Checks if the specified locale type is well-formed with the legacy locale syntax. // // Note: @@ -2222,9 +2490,7 @@ uloc_toLegacyType(const char* keyword, const char* value) // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax // Values (types) can only consist of [0-9a-zA-Z], plus for legacy values // we allow [/_-+] in the middle (e.g. "Etc/GMT+1", "Asia/Tel_Aviv") - if (isWellFormedLegacyType(value)) { - return value; - } + return value; } return legacyType; } diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index a84b8609079a3d..c9decf7cd18f5b 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -7,17 +7,20 @@ ********************************************************************** */ #include <algorithm> +#include <optional> +#include <string_view> #include "unicode/utypes.h" #include "unicode/unistr.h" #include "unicode/uobject.h" -#include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "fixedstring.h" #include "uassert.h" #include "ucln_cmn.h" #include "uhash.h" +#include "ulocimp.h" #include "umutex.h" #include "uresimp.h" #include "uvector.h" @@ -35,20 +38,25 @@ typedef enum { } SpecialType; struct LocExtKeyData : public icu::UMemory { - const char* legacyId; - const char* bcpId; + std::string_view legacyId; + std::string_view bcpId; icu::LocalUHashtablePointer typeMap; uint32_t specialTypes; }; struct LocExtType : public icu::UMemory { - const char* legacyId; - const char* bcpId; + std::string_view legacyId; + std::string_view bcpId; }; -static icu::MemoryPool<icu::CharString>* gKeyTypeStringPool = nullptr; +struct TypeAlias : public icu::UMemory { + std::string_view from; +}; + +static icu::MemoryPool<icu::FixedString>* gKeyTypeStringPool = nullptr; static icu::MemoryPool<LocExtKeyData>* gLocExtKeyDataEntries = nullptr; static icu::MemoryPool<LocExtType>* gLocExtTypeEntries = nullptr; +static icu::MemoryPool<TypeAlias>* gTypeAliasEntries = nullptr; U_CDECL_BEGIN @@ -65,6 +73,9 @@ uloc_key_type_cleanup() { delete gLocExtTypeEntries; gLocExtTypeEntries = nullptr; + delete gTypeAliasEntries; + gTypeAliasEntries = nullptr; + delete gKeyTypeStringPool; gKeyTypeStringPool = nullptr; @@ -74,13 +85,14 @@ uloc_key_type_cleanup() { U_CDECL_END +namespace { -static void U_CALLCONV +void U_CALLCONV initFromResourceBundle(UErrorCode& sts) { U_NAMESPACE_USE ucln_common_registerCleanup(UCLN_COMMON_LOCALE_KEY_TYPE, uloc_key_type_cleanup); - gLocExtKeyMap = uhash_open(uhash_hashIChars, uhash_compareIChars, nullptr, &sts); + gLocExtKeyMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts); LocalUResourceBundlePointer keyTypeDataRes(ures_openDirect(nullptr, "keyTypeData", &sts)); LocalUResourceBundlePointer keyMapRes(ures_getByKey(keyTypeDataRes.getAlias(), "keyMap", nullptr, &sts)); @@ -96,7 +108,7 @@ initFromResourceBundle(UErrorCode& sts) { LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", nullptr, &tmpSts)); // initialize pools storing dynamically allocated objects - gKeyTypeStringPool = new icu::MemoryPool<icu::CharString>; + gKeyTypeStringPool = new icu::MemoryPool<icu::FixedString>; if (gKeyTypeStringPool == nullptr) { sts = U_MEMORY_ALLOCATION_ERROR; return; @@ -111,6 +123,11 @@ initFromResourceBundle(UErrorCode& sts) { sts = U_MEMORY_ALLOCATION_ERROR; return; } + gTypeAliasEntries = new icu::MemoryPool<TypeAlias>; + if (gTypeAliasEntries == nullptr) { + sts = U_MEMORY_ALLOCATION_ERROR; + return; + } // iterate through keyMap resource LocalUResourceBundlePointer keyMapEntry; @@ -129,21 +146,21 @@ initFromResourceBundle(UErrorCode& sts) { // empty value indicates that BCP key is same with the legacy key. const char* bcpKeyId = legacyKeyId; if (!uBcpKeyId.isEmpty()) { - icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create(); + icu::FixedString* bcpKeyIdBuf = gKeyTypeStringPool->create(); if (bcpKeyIdBuf == nullptr) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts); + copyInvariantChars(uBcpKeyId, *bcpKeyIdBuf, sts); if (U_FAILURE(sts)) { break; } bcpKeyId = bcpKeyIdBuf->data(); } - UBool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; + bool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; - UHashtable* typeDataMap = uhash_open(uhash_hashIChars, uhash_compareIChars, nullptr, &sts); + UHashtable* typeDataMap = uhash_open(uhash_hashIStringView, uhash_compareIStringView, nullptr, &sts); if (U_FAILURE(sts)) { break; } @@ -203,18 +220,16 @@ initFromResourceBundle(UErrorCode& sts) { // a timezone key uses a colon instead of a slash in the resource. // e.g. America:Los_Angeles if (uprv_strchr(legacyTypeId, ':') != nullptr) { - icu::CharString* legacyTypeIdBuf = - gKeyTypeStringPool->create(legacyTypeId, sts); - if (legacyTypeIdBuf == nullptr) { + U_ASSERT(legacyTypeId != nullptr && *legacyTypeId != '\0'); + std::string_view legacyTypeIdView = legacyTypeId; + icu::FixedString* legacyTypeIdBuf = gKeyTypeStringPool->create(legacyTypeIdView); + if (legacyTypeIdBuf == nullptr || legacyTypeIdBuf->isEmpty()) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - if (U_FAILURE(sts)) { - break; - } std::replace( - legacyTypeIdBuf->data(), - legacyTypeIdBuf->data() + legacyTypeIdBuf->length(), + legacyTypeIdBuf->getAlias(), + legacyTypeIdBuf->getAlias() + legacyTypeIdView.length(), ':', '/'); legacyTypeId = legacyTypeIdBuf->data(); } @@ -228,12 +243,12 @@ initFromResourceBundle(UErrorCode& sts) { // empty value indicates that BCP type is same with the legacy type. const char* bcpTypeId = legacyTypeId; if (!uBcpTypeId.isEmpty()) { - icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create(); + icu::FixedString* bcpTypeIdBuf = gKeyTypeStringPool->create(); if (bcpTypeIdBuf == nullptr) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts); + copyInvariantChars(uBcpTypeId, *bcpTypeIdBuf, sts); if (U_FAILURE(sts)) { break; } @@ -252,10 +267,10 @@ initFromResourceBundle(UErrorCode& sts) { t->bcpId = bcpTypeId; t->legacyId = legacyTypeId; - uhash_put(typeDataMap, (void*)legacyTypeId, t, &sts); + uhash_put(typeDataMap, &t->legacyId, t, &sts); if (bcpTypeId != legacyTypeId) { // different type value - uhash_put(typeDataMap, (void*)bcpTypeId, t, &sts); + uhash_put(typeDataMap, &t->bcpId, t, &sts); } if (U_FAILURE(sts)) { break; @@ -274,28 +289,32 @@ initFromResourceBundle(UErrorCode& sts) { break; } // check if this is an alias of canonical legacy type - if (uprv_compareInvWithUChar(nullptr, legacyTypeId, -1, to, toLen) == 0) { + if (uprv_compareInvWithUChar( + nullptr, + t->legacyId.data(), + static_cast<int32_t>(t->legacyId.size()), + to, + toLen) == 0) { const char* from = ures_getKey(typeAliasDataEntry.getAlias()); + TypeAlias* alias = gTypeAliasEntries->create(TypeAlias{{}, from}); if (isTZ) { // replace colon with slash if necessary if (uprv_strchr(from, ':') != nullptr) { - icu::CharString* fromBuf = - gKeyTypeStringPool->create(from, sts); - if (fromBuf == nullptr) { + U_ASSERT(from != nullptr && *from != '\0'); + std::string_view fromView = from; + icu::FixedString* fromBuf = gKeyTypeStringPool->create(fromView); + if (fromBuf == nullptr || fromBuf->isEmpty()) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - if (U_FAILURE(sts)) { - break; - } std::replace( - fromBuf->data(), - fromBuf->data() + fromBuf->length(), + fromBuf->getAlias(), + fromBuf->getAlias() + fromView.length(), ':', '/'); - from = fromBuf->data(); + alias->from = {fromBuf->data(), fromView.length()}; } } - uhash_put(typeDataMap, (void*)from, t, &sts); + uhash_put(typeDataMap, &alias->from, t, &sts); } } if (U_FAILURE(sts)) { @@ -315,9 +334,15 @@ initFromResourceBundle(UErrorCode& sts) { break; } // check if this is an alias of bcp type - if (uprv_compareInvWithUChar(nullptr, bcpTypeId, -1, to, toLen) == 0) { + if (uprv_compareInvWithUChar( + nullptr, + t->bcpId.data(), + static_cast<int32_t>(t->bcpId.size()), + to, + toLen) == 0) { const char* from = ures_getKey(bcpTypeAliasDataEntry.getAlias()); - uhash_put(typeDataMap, (void*)from, t, &sts); + TypeAlias* alias = gTypeAliasEntries->create(TypeAlias{{}, from}); + uhash_put(typeDataMap, &alias->from, t, &sts); } } if (U_FAILURE(sts)) { @@ -340,10 +365,10 @@ initFromResourceBundle(UErrorCode& sts) { keyData->specialTypes = specialTypes; keyData->typeMap.adoptInstead(typeDataMap); - uhash_put(gLocExtKeyMap, (void*)legacyKeyId, keyData, &sts); + uhash_put(gLocExtKeyMap, &keyData->legacyId, keyData, &sts); if (legacyKeyId != bcpKeyId) { // different key value - uhash_put(gLocExtKeyMap, (void*)bcpKeyId, keyData, &sts); + uhash_put(gLocExtKeyMap, &keyData->bcpId, keyData, &sts); } if (U_FAILURE(sts)) { break; @@ -351,7 +376,7 @@ initFromResourceBundle(UErrorCode& sts) { } } -static UBool +bool init() { UErrorCode sts = U_ZERO_ERROR; umtx_initOnce(gLocExtKeyMapInitOnce, &initFromResourceBundle, sts); @@ -361,114 +386,102 @@ init() { return true; } -static UBool -isSpecialTypeCodepoints(const char* val) { +bool +isSpecialTypeCodepoints(std::string_view val) { int32_t subtagLen = 0; - const char* p = val; - while (*p) { - if (*p == '-') { + for (char c : val) { + if (c == '-') { if (subtagLen < 4 || subtagLen > 6) { return false; } subtagLen = 0; - } else if ((*p >= '0' && *p <= '9') || - (*p >= 'A' && *p <= 'F') || // A-F/a-f are contiguous - (*p >= 'a' && *p <= 'f')) { // also in EBCDIC + } else if ((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'F') || // A-F/a-f are contiguous + (c >= 'a' && c <= 'f')) { // also in EBCDIC subtagLen++; } else { return false; } - p++; } - return (subtagLen >= 4 && subtagLen <= 6); + return subtagLen >= 4 && subtagLen <= 6; } -static UBool -isSpecialTypeReorderCode(const char* val) { +bool +isSpecialTypeReorderCode(std::string_view val) { int32_t subtagLen = 0; - const char* p = val; - while (*p) { - if (*p == '-') { + for (char c : val) { + if (c == '-') { if (subtagLen < 3 || subtagLen > 8) { return false; } subtagLen = 0; - } else if (uprv_isASCIILetter(*p)) { + } else if (uprv_isASCIILetter(c)) { subtagLen++; } else { return false; } - p++; } - return (subtagLen >=3 && subtagLen <=8); + return subtagLen >= 3 && subtagLen <= 8; } -static UBool -isSpecialTypeRgKeyValue(const char* val) { +bool +isSpecialTypeRgKeyValue(std::string_view val) { int32_t subtagLen = 0; - const char* p = val; - while (*p) { - if ( (subtagLen < 2 && uprv_isASCIILetter(*p)) || - (subtagLen >= 2 && (*p == 'Z' || *p == 'z')) ) { + for (char c : val) { + if ((subtagLen < 2 && uprv_isASCIILetter(c)) || + (subtagLen >= 2 && (c == 'Z' || c == 'z'))) { subtagLen++; } else { return false; } - p++; } - return (subtagLen == 6); + return subtagLen == 6; } -U_CFUNC const char* -ulocimp_toBcpKey(const char* key) { +} // namespace + +U_EXPORT std::optional<std::string_view> +ulocimp_toBcpKey(std::string_view key) { if (!init()) { - return nullptr; + return std::nullopt; } - LocExtKeyData* keyData = (LocExtKeyData*)uhash_get(gLocExtKeyMap, key); + LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key)); if (keyData != nullptr) { return keyData->bcpId; } - return nullptr; + + return std::nullopt; } -U_CFUNC const char* -ulocimp_toLegacyKey(const char* key) { +U_EXPORT std::optional<std::string_view> +ulocimp_toLegacyKey(std::string_view key) { if (!init()) { - return nullptr; + return std::nullopt; } - LocExtKeyData* keyData = (LocExtKeyData*)uhash_get(gLocExtKeyMap, key); + LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key)); if (keyData != nullptr) { return keyData->legacyId; } - return nullptr; -} -U_CFUNC const char* -ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType) { - if (isKnownKey != nullptr) { - *isKnownKey = false; - } - if (isSpecialType != nullptr) { - *isSpecialType = false; - } + return std::nullopt; +} +U_EXPORT std::optional<std::string_view> +ulocimp_toBcpType(std::string_view key, std::string_view type) { if (!init()) { - return nullptr; + return std::nullopt; } - LocExtKeyData* keyData = (LocExtKeyData*)uhash_get(gLocExtKeyMap, key); + LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key)); if (keyData != nullptr) { - if (isKnownKey != nullptr) { - *isKnownKey = true; - } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); + LocExtType* t = static_cast<LocExtType*>(uhash_get(keyData->typeMap.getAlias(), &type)); if (t != nullptr) { return t->bcpId; } if (keyData->specialTypes != SPECIALTYPE_NONE) { - UBool matched = false; + bool matched = false; if (keyData->specialTypes & SPECIALTYPE_CODEPOINTS) { matched = isSpecialTypeCodepoints(type); } @@ -479,41 +492,29 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i matched = isSpecialTypeRgKeyValue(type); } if (matched) { - if (isSpecialType != nullptr) { - *isSpecialType = true; - } return type; } } } - return nullptr; + + return std::nullopt; } -U_CFUNC const char* -ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType) { - if (isKnownKey != nullptr) { - *isKnownKey = false; - } - if (isSpecialType != nullptr) { - *isSpecialType = false; - } - +U_EXPORT std::optional<std::string_view> +ulocimp_toLegacyType(std::string_view key, std::string_view type) { if (!init()) { - return nullptr; + return std::nullopt; } - LocExtKeyData* keyData = (LocExtKeyData*)uhash_get(gLocExtKeyMap, key); + LocExtKeyData* keyData = static_cast<LocExtKeyData*>(uhash_get(gLocExtKeyMap, &key)); if (keyData != nullptr) { - if (isKnownKey != nullptr) { - *isKnownKey = true; - } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); + LocExtType* t = static_cast<LocExtType*>(uhash_get(keyData->typeMap.getAlias(), &type)); if (t != nullptr) { return t->legacyId; } if (keyData->specialTypes != SPECIALTYPE_NONE) { - UBool matched = false; + bool matched = false; if (keyData->specialTypes & SPECIALTYPE_CODEPOINTS) { matched = isSpecialTypeCodepoints(type); } @@ -524,13 +525,10 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool matched = isSpecialTypeRgKeyValue(type); } if (matched) { - if (isSpecialType != nullptr) { - *isSpecialType = true; - } return type; } } } - return nullptr; -} + return std::nullopt; +} diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index fe3261c75d939d..b2e9946f48a7e5 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -7,6 +7,10 @@ ********************************************************************** */ +#include <optional> +#include <string_view> +#include <utility> + #include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/ures.h" @@ -14,7 +18,6 @@ #include "unicode/putil.h" #include "unicode/uenum.h" #include "unicode/uloc.h" -#include "ustr_imp.h" #include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" @@ -24,9 +27,10 @@ #include "ulocimp.h" #include "uassert.h" +namespace { /* struct holding a single variant */ -typedef struct VariantListEntry { +typedef struct VariantListEntry : public icu::UMemory { const char *variant; struct VariantListEntry *next; } VariantListEntry; @@ -67,18 +71,18 @@ typedef struct ULanguageTag { #define LOCALE_KEYWORD_SEP ';' #define LOCALE_KEY_TYPE_SEP '=' -#define ISALPHA(c) uprv_isASCIILetter(c) -#define ISNUMERIC(c) ((c)>='0' && (c)<='9') +constexpr auto ISALPHA = uprv_isASCIILetter; +inline bool ISNUMERIC(char c) { return c >= '0' && c <= '9'; } -static const char EMPTY[] = ""; -static const char LANG_UND[] = "und"; -static const char PRIVATEUSE_KEY[] = "x"; -static const char _POSIX[] = "_POSIX"; -static const char POSIX_KEY[] = "va"; -static const char POSIX_VALUE[] = "posix"; -static const char LOCALE_ATTRIBUTE_KEY[] = "attribute"; -static const char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; -static const char LOCALE_TYPE_YES[] = "yes"; +constexpr char EMPTY[] = ""; +constexpr char LANG_UND[] = "und"; +constexpr char PRIVATEUSE_KEY[] = "x"; +constexpr char _POSIX[] = "_POSIX"; +constexpr char POSIX_KEY[] = "va"; +constexpr char POSIX_VALUE[] = "posix"; +constexpr char LOCALE_ATTRIBUTE_KEY[] = "attribute"; +constexpr char PRIVUSE_VARIANT_PREFIX[] = "lvariant"; +constexpr char LOCALE_TYPE_YES[] = "yes"; #define LANG_UND_LEN 3 @@ -102,7 +106,7 @@ static const char LOCALE_TYPE_YES[] = "yes"; values. They may have to be removed for the strict BCP 47 compliance. */ -static const char* const LEGACY[] = { +constexpr const char* LEGACY[] = { /* legacy preferred */ "art-lojban", "jbo", "en-gb-oed", "en-gb-oxendict", @@ -151,7 +155,7 @@ static const char* const LEGACY[] = { a variant tag 'hepburn-heploc' has the preferred subtag, 'alaic97'. */ -static const char* const REDUNDANT[] = { +constexpr const char* REDUNDANT[] = { // redundant preferred "sgn-br", "bzs", "sgn-co", "csn", @@ -193,7 +197,7 @@ static const char* const REDUNDANT[] = { Make sure that 2-letter language subtags come before 3-letter subtags. */ -static const char DEPRECATEDLANGS[][4] = { +constexpr char DEPRECATEDLANGS[][4] = { /* deprecated new */ "in", "id", "iw", "he", @@ -283,7 +287,7 @@ static const char DEPRECATEDLANGS[][4] = { grep -B1 'Preferred' | \ awk -n '/Subtag/ {printf(" \"%s\", ", $2);} /Preferred/ {printf("\"%s\",\n", $2);}' */ -static const char DEPRECATEDREGIONS[][3] = { +constexpr char DEPRECATEDREGIONS[][3] = { /* deprecated new */ "BU", "MM", "DD", "DE", @@ -301,55 +305,57 @@ static const char DEPRECATEDREGIONS[][3] = { * ------------------------------------------------- */ -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status); +ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& status); -static void +void ultag_close(ULanguageTag* langtag); -static const char* +const char* ultag_getLanguage(const ULanguageTag* langtag); #if 0 -static const char* +const char* ultag_getJDKLanguage(const ULanguageTag* langtag); #endif -static const char* +const char* ultag_getExtlang(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getExtlangSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getScript(const ULanguageTag* langtag); -static const char* +const char* ultag_getRegion(const ULanguageTag* langtag); -static const char* +const char* ultag_getVariant(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getVariantsSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx); -static const char* +const char* ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx); -static int32_t +int32_t ultag_getExtensionsSize(const ULanguageTag* langtag); -static const char* +const char* ultag_getPrivateUse(const ULanguageTag* langtag); #if 0 -static const char* +const char* ultag_getLegacy(const ULanguageTag* langtag); #endif +} // namespace + U_NAMESPACE_BEGIN /** @@ -373,7 +379,9 @@ U_NAMESPACE_END * ------------------------------------------------- */ -static UBool +namespace { + +bool _isAlphaString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -384,7 +392,7 @@ _isAlphaString(const char* s, int32_t len) { return true; } -static UBool +bool _isNumericString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -395,7 +403,7 @@ _isNumericString(const char* s, int32_t len) { return true; } -static UBool +bool _isAlphaNumericString(const char* s, int32_t len) { int32_t i; for (i = 0; i < len; i++) { @@ -406,10 +414,10 @@ _isAlphaNumericString(const char* s, int32_t len) { return true; } -static UBool +bool _isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) { if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len >= min && len <= max && _isAlphaNumericString(s, len)) { return true; @@ -417,7 +425,9 @@ _isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int3 return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isLanguageSubtag(const char* s, int32_t len) { /* * unicode_language_subtag = alpha{2,3} | alpha{5,8}; @@ -425,7 +435,7 @@ ultag_isLanguageSubtag(const char* s, int32_t len) { * See ICU-20372 */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len >= 2 && len <= 8 && _isAlphaString(s, len)) { return true; @@ -433,14 +443,16 @@ ultag_isLanguageSubtag(const char* s, int32_t len) { return false; } -static UBool +namespace { + +bool _isExtlangSubtag(const char* s, int32_t len) { /* * extlang = 3ALPHA ; selected ISO 639 codes * *2("-" 3ALPHA) ; permanently reserved */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 3 && _isAlphaString(s, len)) { return true; @@ -448,13 +460,15 @@ _isExtlangSubtag(const char* s, int32_t len) { return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isScriptSubtag(const char* s, int32_t len) { /* * script = 4ALPHA ; ISO 15924 code */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 4 && _isAlphaString(s, len)) { return true; @@ -462,14 +476,14 @@ ultag_isScriptSubtag(const char* s, int32_t len) { return false; } -U_CFUNC UBool +bool ultag_isRegionSubtag(const char* s, int32_t len) { /* * region = 2ALPHA ; ISO 3166-1 code * / 3DIGIT ; UN M.49 code */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 2 && _isAlphaString(s, len)) { return true; @@ -480,14 +494,16 @@ ultag_isRegionSubtag(const char* s, int32_t len) { return false; } -static UBool +namespace { + +bool _isVariantSubtag(const char* s, int32_t len) { /* * variant = 5*8alphanum ; registered variants * / (DIGIT 3alphanum) */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (_isAlphaNumericStringLimitedLength(s, len, 5, 8)) { return true; @@ -498,13 +514,13 @@ _isVariantSubtag(const char* s, int32_t len) { return false; } -static UBool -_isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { +bool +_isSepListOf(bool (*test)(const char*, int32_t), const char* s, int32_t len) { const char *p = s; const char *pSubtag = nullptr; if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } while ((p - s) < len) { @@ -512,7 +528,7 @@ _isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { if (pSubtag == nullptr) { return false; } - if (!test(pSubtag, (int32_t)(p - pSubtag))) { + if (!test(pSubtag, static_cast<int32_t>(p - pSubtag))) { return false; } pSubtag = nullptr; @@ -524,16 +540,20 @@ _isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { if (pSubtag == nullptr) { return false; } - return test(pSubtag, (int32_t)(p - pSubtag)); + return test(pSubtag, static_cast<int32_t>(p - pSubtag)); } -U_CFUNC UBool +} // namespace + +bool ultag_isVariantSubtags(const char* s, int32_t len) { return _isSepListOf(&_isVariantSubtag, s, len); } +namespace { + // This is for the ICU-specific "lvariant" handling. -static UBool +bool _isPrivateuseVariantSubtag(const char* s, int32_t len) { /* * variant = 1*8alphanum ; registered variants @@ -542,7 +562,7 @@ _isPrivateuseVariantSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 1, 8); } -static UBool +bool _isExtensionSingleton(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) @@ -554,7 +574,7 @@ _isExtensionSingleton(const char* s, int32_t len) { * / %x79-7A ; y - z */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) { return true; @@ -562,7 +582,7 @@ _isExtensionSingleton(const char* s, int32_t len) { return false; } -static UBool +bool _isExtensionSubtag(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) @@ -570,12 +590,16 @@ _isExtensionSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len, 2, 8); } -U_CFUNC UBool +} // namespace + +bool ultag_isExtensionSubtags(const char* s, int32_t len) { return _isSepListOf(&_isExtensionSubtag, s, len); } -static UBool +namespace { + +bool _isPrivateuseValueSubtag(const char* s, int32_t len) { /* * privateuse = "x" 1*("-" (1*8alphanum)) @@ -583,12 +607,14 @@ _isPrivateuseValueSubtag(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len, 1, 8); } -U_CFUNC UBool +} // namespace + +bool ultag_isPrivateuseValueSubtags(const char* s, int32_t len) { return _isSepListOf(&_isPrivateuseValueSubtag, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { /* * attribute = alphanum{3,8} ; @@ -596,18 +622,18 @@ ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttributes(const char* s, int32_t len) { return _isSepListOf(&ultag_isUnicodeLocaleAttribute, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleKey(const char* s, int32_t len) { /* * key = alphanum alpha ; */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 2 && (ISALPHA(*s) || ISNUMERIC(*s)) && ISALPHA(s[1])) { return true; @@ -615,7 +641,7 @@ ultag_isUnicodeLocaleKey(const char* s, int32_t len) { return false; } -U_CFUNC UBool +bool _isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { /* * alphanum{3,8} @@ -623,7 +649,7 @@ _isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -U_CFUNC UBool +bool ultag_isUnicodeLocaleType(const char*s, int32_t len) { /* * type = alphanum{3,8} (sep alphanum{3,8})* ; @@ -631,14 +657,16 @@ ultag_isUnicodeLocaleType(const char*s, int32_t len) { return _isSepListOf(&_isUnicodeLocaleTypeSubtag, s, len); } -static UBool +namespace { + +bool _isTKey(const char* s, int32_t len) { /* * tkey = alpha digit ; */ if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } if (len == 2 && ISALPHA(*s) && ISNUMERIC(*(s + 1))) { return true; @@ -646,7 +674,9 @@ _isTKey(const char* s, int32_t len) return false; } -U_CAPI const char * U_EXPORT2 +} // namespace + +const char* ultag_getTKeyStart(const char *localeID) { const char *result = localeID; const char *sep; @@ -662,7 +692,9 @@ ultag_getTKeyStart(const char *localeID) { return nullptr; } -static UBool +namespace { + +bool _isTValue(const char* s, int32_t len) { /* @@ -671,7 +703,7 @@ _isTValue(const char* s, int32_t len) return _isAlphaNumericStringLimitedLength(s, len , 3, 8); } -static UBool +bool _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) { const int32_t kStart = 0; // Start, wait for unicode_language_subtag, tkey or end @@ -688,7 +720,7 @@ _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } switch (state) { case kStart: @@ -744,7 +776,7 @@ _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) return false; } -static UBool +bool _isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) { const int32_t kStart = 0; // Start, wait for a key or attribute or end @@ -783,8 +815,8 @@ _isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) return false; } -static UBool -_isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) +bool +_isStatefulSepListOf(bool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) { int32_t state = 0; const char* p; @@ -792,7 +824,7 @@ _isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* int32_t subtagLen = 0; if (len < 0) { - len = (int32_t)uprv_strlen(s); + len = static_cast<int32_t>(uprv_strlen(s)); } for (p = s; len > 0; p++, len--) { @@ -813,17 +845,20 @@ _isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* return false; } -U_CFUNC UBool +} // namespace + +bool ultag_isTransformedExtensionSubtags(const char* s, int32_t len) { return _isStatefulSepListOf(&_isTransformedExtensionSubtag, s, len); } -U_CFUNC UBool +bool ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { return _isStatefulSepListOf(&_isUnicodeExtensionSubtag, s, len); } +namespace { /* * ------------------------------------------------- @@ -833,13 +868,11 @@ ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { * ------------------------------------------------- */ -static UBool -_addVariantToList(VariantListEntry **first, VariantListEntry *var) { - UBool bAdded = true; - +bool +_addVariantToList(VariantListEntry **first, icu::LocalPointer<VariantListEntry> var) { if (*first == nullptr) { var->next = nullptr; - *first = var; + *first = var.orphan(); } else { VariantListEntry *prev, *cur; int32_t cmp; @@ -849,8 +882,8 @@ _addVariantToList(VariantListEntry **first, VariantListEntry *var) { cur = *first; while (true) { if (cur == nullptr) { - prev->next = var; var->next = nullptr; + prev->next = var.orphan(); break; } @@ -858,20 +891,19 @@ _addVariantToList(VariantListEntry **first, VariantListEntry *var) { cmp = uprv_compareInvCharsAsAscii(var->variant, cur->variant); if (cmp == 0) { /* duplicated variant */ - bAdded = false; - break; + return false; } prev = cur; cur = cur->next; } } - return bAdded; + return true; } -static UBool +bool _addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { - UBool bAdded = true; + bool bAdded = true; if (*first == nullptr) { attr->next = nullptr; @@ -912,10 +944,9 @@ _addAttributeToList(AttributeListEntry **first, AttributeListEntry *attr) { return bAdded; } - -static UBool -_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool localeToBCP) { - UBool bAdded = true; +bool +_addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, bool localeToBCP) { + bool bAdded = true; if (*first == nullptr) { ext->next = nullptr; @@ -937,8 +968,8 @@ _addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool l /* special handling for locale to bcp conversion */ int32_t len, curlen; - len = (int32_t)uprv_strlen(ext->key); - curlen = (int32_t)uprv_strlen(cur->key); + len = static_cast<int32_t>(uprv_strlen(ext->key)); + curlen = static_cast<int32_t>(uprv_strlen(cur->key)); if (len == 1 && curlen == 1) { if (*(ext->key) == *(cur->key)) { @@ -990,7 +1021,7 @@ _addExtensionToList(ExtensionListEntry **first, ExtensionListEntry *ext, UBool l return bAdded; } -static void +void _initializeULanguageTag(ULanguageTag* langtag) { int32_t i; @@ -1011,127 +1042,120 @@ _initializeULanguageTag(ULanguageTag* langtag) { langtag->privateuse = EMPTY; } -static void -_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_LANG_CAPACITY]; +void +_appendLanguageToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getLanguage(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - len = 0; } /* Note: returned language code is in lower case letters */ - if (len == 0) { + if (buf.isEmpty()) { sink.Append(LANG_UND, LANG_UND_LEN); - } else if (!ultag_isLanguageSubtag(buf, len)) { + } else if (!ultag_isLanguageSubtag(buf.data(), buf.length())) { /* invalid language code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } sink.Append(LANG_UND, LANG_UND_LEN); } else { /* resolve deprecated */ - for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { + for (int32_t i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { // 2-letter deprecated subtags are listede before 3-letter // ones in DEPRECATEDLANGS[]. Get out of loop on coming // across the 1st 3-letter subtag, if the input is a 2-letter code. // to avoid continuing to try when there's no match. - if (uprv_strlen(buf) < uprv_strlen(DEPRECATEDLANGS[i])) break; - if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDLANGS[i]) == 0) { - uprv_strcpy(buf, DEPRECATEDLANGS[i + 1]); - len = (int32_t)uprv_strlen(buf); - break; + if (buf.length() < static_cast<int32_t>(uprv_strlen(DEPRECATEDLANGS[i]))) break; + if (uprv_compareInvCharsAsAscii(buf.data(), DEPRECATEDLANGS[i]) == 0) { + const char* const resolved = DEPRECATEDLANGS[i + 1]; + sink.Append(resolved, static_cast<int32_t>(uprv_strlen(resolved))); + return; } } - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } -static void -_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_SCRIPT_CAPACITY]; +void +_appendScriptToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getScript(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { - if (!ultag_isScriptSubtag(buf, len)) { + if (!buf.isEmpty()) { + if (!ultag_isScriptSubtag(buf.data(), buf.length())) { /* invalid script code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } else { sink.Append("-", 1); - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } } -static void -_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { - char buf[ULOC_COUNTRY_CAPACITY]; +void +_appendRegionToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, UErrorCode& status) { UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len; - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } - len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + icu::CharString buf = ulocimp_getRegion(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { - if (!ultag_isRegionSubtag(buf, len)) { + if (!buf.isEmpty()) { + if (!ultag_isRegionSubtag(buf.data(), buf.length())) { /* invalid region code */ if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } else { sink.Append("-", 1); /* resolve deprecated */ - for (int i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { - if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDREGIONS[i]) == 0) { - uprv_strcpy(buf, DEPRECATEDREGIONS[i + 1]); - len = (int32_t)uprv_strlen(buf); - break; + for (int32_t i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { + if (uprv_compareInvCharsAsAscii(buf.data(), DEPRECATEDREGIONS[i]) == 0) { + const char* const resolved = DEPRECATEDREGIONS[i + 1]; + sink.Append(resolved, static_cast<int32_t>(uprv_strlen(resolved))); + return; } } - sink.Append(buf, len); + sink.Append(buf.data(), buf.length()); } } } -static void _sortVariants(VariantListEntry* first) { +void _sortVariants(VariantListEntry* first) { for (VariantListEntry* var1 = first; var1 != nullptr; var1 = var1->next) { for (VariantListEntry* var2 = var1->next; var2 != nullptr; var2 = var2->next) { // Swap var1->variant and var2->variant. @@ -1144,32 +1168,26 @@ static void _sortVariants(VariantListEntry* first) { } } -static void -_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) { - char buf[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; +void +_appendVariantsToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, bool& hadPosix, UErrorCode& status) { + if (U_FAILURE(status)) { return; } - if (U_FAILURE(*status)) { - return; - } - - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); + UErrorCode tmpStatus = U_ZERO_ERROR; + icu::CharString buf = ulocimp_getVariant(localeID, tmpStatus); if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { + if (!buf.isEmpty()) { char *p, *pVar; - UBool bNext = true; - VariantListEntry *var; + bool bNext = true; VariantListEntry *varFirst = nullptr; pVar = nullptr; - p = buf; + p = buf.data(); while (bNext) { if (*p == SEP || *p == LOCALE_SEP || *p == 0) { if (*p == 0) { @@ -1179,42 +1197,40 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } if (pVar == nullptr) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } /* ignore empty variant */ } else { /* ICU uses upper case letters for variants, but the canonical format is lowercase in BCP47 */ - for (i = 0; *(pVar + i) != 0; i++) { + for (int32_t i = 0; *(pVar + i) != 0; i++) { *(pVar + i) = uprv_tolower(*(pVar + i)); } /* validate */ if (_isVariantSubtag(pVar, -1)) { - if (uprv_strcmp(pVar,POSIX_VALUE) || len != (int32_t)uprv_strlen(POSIX_VALUE)) { + if (uprv_strcmp(pVar, POSIX_VALUE) || buf.length() != static_cast<int32_t>(uprv_strlen(POSIX_VALUE))) { /* emit the variant to the list */ - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + icu::LocalPointer<VariantListEntry> var(new VariantListEntry, status); + if (U_FAILURE(status)) { break; } var->variant = pVar; - if (!_addVariantToList(&varFirst, var)) { + if (!_addVariantToList(&varFirst, std::move(var))) { /* duplicated variant */ - uprv_free(var); if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } } else { /* Special handling for POSIX variant, need to remember that we had it and then */ /* treat it like an extension later. */ - *hadPosix = true; + hadPosix = true; } } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } else if (_isPrivateuseValueSubtag(pVar, -1)) { /* Handle private use subtags separately */ @@ -1229,7 +1245,7 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st p++; } - if (U_SUCCESS(*status)) { + if (U_SUCCESS(status)) { if (varFirst != nullptr) { int32_t varLen; @@ -1237,10 +1253,10 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st _sortVariants(varFirst); /* write out validated/normalized variants to the target */ - var = varFirst; + VariantListEntry* var = varFirst; while (var != nullptr) { sink.Append("-", 1); - varLen = (int32_t)uprv_strlen(var->variant); + varLen = static_cast<int32_t>(uprv_strlen(var->variant)); sink.Append(var->variant, varLen); var = var->next; } @@ -1248,30 +1264,28 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } /* clean up */ - var = varFirst; - while (var != nullptr) { + for (VariantListEntry* var = varFirst; var != nullptr; ) { VariantListEntry *tmpVar = var->next; - uprv_free(var); + delete var; var = tmpVar; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } } } -static void -_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; - int32_t attrBufLength = 0; +void +_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool strict, bool hadPosix, UErrorCode& status) { + if (U_FAILURE(status)) { return; } icu::MemoryPool<AttributeListEntry> attrPool; icu::MemoryPool<ExtensionListEntry> extPool; icu::MemoryPool<icu::CharString> strPool; - icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, status)); - if (U_FAILURE(*status) && !hadPosix) { + icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status)); + if (U_FAILURE(status) && !hadPosix) { return; } if (keywordEnum.isValid() || hadPosix) { @@ -1286,28 +1300,24 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st const char *bcpKey=nullptr, *bcpValue=nullptr; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t keylen; - UBool isBcpUExt; + bool isBcpUExt; while (true) { - key = uenum_next(keywordEnum.getAlias(), nullptr, status); + key = uenum_next(keywordEnum.getAlias(), nullptr, &status); if (key == nullptr) { break; } - icu::CharString buf; - { - icu::CharStringByteSink sink(&buf); - ulocimp_getKeywordValue(localeID, key, sink, &tmpStatus); - } + icu::CharString buf = ulocimp_getKeywordValue(localeID, key, tmpStatus); len = buf.length(); if (U_FAILURE(tmpStatus)) { if (tmpStatus == U_MEMORY_ALLOCATION_ERROR) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } /* ignore this keyword */ @@ -1315,7 +1325,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st continue; } - keylen = (int32_t)uprv_strlen(key); + keylen = static_cast<int32_t>(uprv_strlen(key)); isBcpUExt = (keylen > 1); /* special keyword used for representing Unicode locale attributes */ @@ -1323,51 +1333,40 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st if (len > 0) { int32_t i = 0; while (true) { - attrBufLength = 0; + icu::CharString attrBuf; for (; i < len; i++) { if (buf[i] != '-') { - if (static_cast<size_t>(attrBufLength) < sizeof(attrBuf)) { - attrBuf[attrBufLength++] = buf[i]; - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + attrBuf.append(buf[i], status); } else { i++; break; } } - if (attrBufLength > 0) { - if (static_cast<size_t>(attrBufLength) < sizeof(attrBuf)) { - attrBuf[attrBufLength] = 0; - } else { - *status = U_STRING_NOT_TERMINATED_WARNING; - } - - } else if (i >= len){ + if (U_FAILURE(status)) { + return; + } + if (attrBuf.isEmpty() && i >= len) { break; } /* create AttributeListEntry */ attr = attrPool.create(); if (attr == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - icu::CharString* attrValue = - strPool.create(attrBuf, attrBufLength, *status); - if (attrValue == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } - if (U_FAILURE(*status)) { + if (icu::CharString* str = + strPool.create(std::move(attrBuf), status)) { + if (U_FAILURE(status)) { break; } + attr->attribute = str->data(); + } else { + status = U_MEMORY_ALLOCATION_ERROR; break; } - attr->attribute = attrValue->data(); if (!_addAttributeToList(&firstAttr, attr)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } @@ -1377,27 +1376,28 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st bcpValue = nullptr; } } else if (isBcpUExt) { - bcpKey = uloc_toUnicodeLocaleKey(key); - if (bcpKey == nullptr) { + std::optional<std::string_view> optBcpKey = ulocimp_toBcpKeyWithFallback(key); + if (!optBcpKey.has_value()) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; } + bcpKey = optBcpKey->data(); - /* we've checked buf is null-terminated above */ - bcpValue = uloc_toUnicodeLocaleType(key, buf.data()); - if (bcpValue == nullptr) { + std::optional<std::string_view> optBcpValue = + ulocimp_toBcpTypeWithFallback(key, buf.toStringPiece()); + if (!optBcpValue.has_value()) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; } - if (bcpValue == buf.data()) { + if (optBcpValue->data() == buf.data()) { /* - When uloc_toUnicodeLocaleType(key, buf) returns the + When ulocimp_toBcpTypeWithFallback(key, buf) returns the input value as is, the value is well-formed, but has no known mapping. This implementation normalizes the value to lower case @@ -1405,22 +1405,24 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st icu::CharString* extBuf = extBufPool.create(buf, tmpStatus); if (extBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; break; } T_CString_toLowerCase(extBuf->data()); bcpValue = extBuf->data(); + } else { + bcpValue = optBcpValue->data(); } } else { if (*key == PRIVATEUSE) { if (!ultag_isPrivateuseValueSubtags(buf.data(), len)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1428,7 +1430,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } else { if (!_isExtensionSingleton(key, keylen) || !ultag_isExtensionSubtags(buf.data(), len)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } continue; @@ -1438,11 +1440,11 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st icu::CharString* extBuf = extBufPool.create(buf.data(), len, tmpStatus); if (extBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; break; } bcpValue = extBuf->data(); @@ -1451,7 +1453,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st /* create ExtensionListEntry */ ext = extPool.create(); if (ext == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } ext->key = bcpKey; @@ -1459,7 +1461,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st if (!_addExtensionToList(&firstExt, ext, true)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } @@ -1470,7 +1472,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st /* create ExtensionListEntry for POSIX */ ext = extPool.create(); if (ext == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } ext->key = POSIX_KEY; @@ -1481,8 +1483,8 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st } } - if (U_SUCCESS(*status) && (firstExt != nullptr || firstAttr != nullptr)) { - UBool startLDMLExtension = false; + if (U_SUCCESS(status) && (firstExt != nullptr || firstAttr != nullptr)) { + bool startLDMLExtension = false; for (ext = firstExt; ext; ext = ext->next) { if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { /* first LDML u singlton extension */ @@ -1517,11 +1519,13 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st * e.g. "u-ca-gregory-co-trad" -> {calendar = gregorian} {collation = traditional} * Note: char* buf is used for storing keywords */ -static void -_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool<ExtensionListEntry>& extPool, icu::MemoryPool<icu::CharString>& kwdBuf, UBool *posixVariant, UErrorCode *status) { +void +_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool<ExtensionListEntry>& extPool, icu::MemoryPool<icu::CharString>& kwdBuf, bool& posixVariant, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + const char *pTag; /* beginning of current subtag */ const char *pKwds; /* beginning of key-type pairs */ - UBool variantExists = *posixVariant; + bool variantExists = posixVariant; ExtensionListEntry *kwdFirst = nullptr; /* first LDML keyword */ ExtensionListEntry *kwd, *nextKwd; @@ -1529,7 +1533,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT int32_t len; /* Reset the posixVariant value */ - *posixVariant = false; + posixVariant = false; pTag = ldmlext; pKwds = nullptr; @@ -1538,9 +1542,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT AttributeListEntry *attrFirst = nullptr; /* first attribute */ AttributeListEntry *attr, *nextAttr; - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - int32_t attrBufIdx = 0; - + icu::MemoryPool<icu::CharString> strPool; icu::MemoryPool<AttributeListEntry> attrPool; /* Iterate through u extension attributes */ @@ -1556,17 +1558,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT /* add this attribute to the list */ attr = attrPool.create(); if (attr == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } - if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { - uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); - attrBuf[attrBufIdx + len] = 0; - attr->attribute = &attrBuf[attrBufIdx]; - attrBufIdx += (len + 1); + if (icu::CharString* str = strPool.create(pTag, len, status)) { + if (U_FAILURE(status)) { return; } + attr->attribute = str->data(); } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1586,13 +1586,13 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } icu::CharString* value = kwdBuf.create(); if (value == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1601,12 +1601,12 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT while (attr != nullptr) { nextAttr = attr->next; if (attr != attrFirst) { - value->append('-', *status); + value->append('-', status); } - value->append(attr->attribute, *status); + value->append(attr->attribute, status); attr = nextAttr; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } @@ -1614,7 +1614,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT kwd->value = value->data(); if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } } @@ -1625,14 +1625,14 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT const char *pBcpType = nullptr; /* beginning of u extension type subtag(s) */ int32_t bcpKeyLen = 0; int32_t bcpTypeLen = 0; - UBool isDone = false; + bool isDone = false; pTag = pKwds; /* BCP47 representation of LDML key/type pairs */ while (!isDone) { const char *pNextBcpKey = nullptr; int32_t nextBcpKeyLen = 0; - UBool emitKeyword = false; + bool emitKeyword = false; if (*pTag) { /* locate next separator char */ @@ -1674,76 +1674,66 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT const char *pKey = nullptr; /* LDML key */ const char *pType = nullptr; /* LDML type */ - char bcpKeyBuf[3]; /* BCP key length is always 2 for now */ - U_ASSERT(pBcpKey != nullptr); - if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { + /* BCP key length is always 2 for now */ + if (bcpKeyLen != 2) { /* the BCP key is invalid */ - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - U_ASSERT(bcpKeyLen <= 2); - - uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen); - bcpKeyBuf[bcpKeyLen] = 0; /* u extension key to LDML key */ - pKey = uloc_toLegacyKey(bcpKeyBuf); - if (pKey == nullptr) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + std::optional<std::string_view> legacyKey = ulocimp_toLegacyKeyWithFallback( + {pBcpKey, static_cast<std::string_view::size_type>(bcpKeyLen)}); + if (!legacyKey.has_value()) { + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - if (pKey == bcpKeyBuf) { + if (legacyKey->data() == pBcpKey) { /* The key returned by toLegacyKey points to the input buffer. We normalize the result key to lower case. */ - T_CString_toLowerCase(bcpKeyBuf); - icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, *status); + icu::CharString* key = kwdBuf.create(pBcpKey, bcpKeyLen, status); if (key == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } + T_CString_toLowerCase(key->data()); pKey = key->data(); + } else { + pKey = legacyKey->data(); } if (pBcpType) { - char bcpTypeBuf[128]; /* practically long enough even considering multiple subtag type */ - if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { - /* the BCP type is too long */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - - uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); - bcpTypeBuf[bcpTypeLen] = 0; - /* BCP type to locale type */ - pType = uloc_toLegacyType(pKey, bcpTypeBuf); - if (pType == nullptr) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + std::optional<std::string_view> legacyType = ulocimp_toLegacyTypeWithFallback( + pKey, {pBcpType, static_cast<std::string_view::size_type>(bcpTypeLen)}); + if (!legacyType.has_value()) { + status = U_ILLEGAL_ARGUMENT_ERROR; return; } - if (pType == bcpTypeBuf) { + if (legacyType->data() == pBcpType) { /* The type returned by toLegacyType points to the input buffer. We normalize the result type to lower case. */ - /* normalize to lower case */ - T_CString_toLowerCase(bcpTypeBuf); - icu::CharString* type = kwdBuf.create(bcpTypeBuf, bcpTypeLen, *status); + icu::CharString* type = kwdBuf.create(pBcpType, bcpTypeLen, status); if (type == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } + T_CString_toLowerCase(type->data()); pType = type->data(); + } else { + pType = legacyType->data(); } } else { /* typeless - default type value is "yes" */ @@ -1753,12 +1743,12 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT /* Special handling for u-va-posix, since we want to treat this as a variant, not as a keyword */ if (!variantExists && !uprv_strcmp(pKey, POSIX_KEY) && !uprv_strcmp(pType, POSIX_VALUE) ) { - *posixVariant = true; + posixVariant = true; } else { /* create an ExtensionListEntry for this keyword */ kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1787,9 +1777,10 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT } } +void +_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode& status) { + if (U_FAILURE(status)) { return; } -static void -_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) { int32_t i, n; int32_t len; ExtensionListEntry *kwdFirst = nullptr; @@ -1797,11 +1788,7 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) const char *key, *type; icu::MemoryPool<ExtensionListEntry> extPool; icu::MemoryPool<icu::CharString> kwdBuf; - UBool posixVariant = false; - - if (U_FAILURE(*status)) { - return; - } + bool posixVariant = false; n = ultag_getExtensionsSize(langtag); @@ -1815,37 +1802,37 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) posixVariant = true; } - _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); - if (U_FAILURE(*status)) { + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, posixVariant, status); + if (U_FAILURE(status)) { break; } } else { kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; break; } kwd->key = key; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } } } - if (U_SUCCESS(*status)) { + if (U_SUCCESS(status)) { type = ultag_getPrivateUse(langtag); - if ((int32_t)uprv_strlen(type) > 0) { + if (static_cast<int32_t>(uprv_strlen(type)) > 0) { /* add private use as a keyword */ kwd = extPool.create(); if (kwd == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; } else { kwd->key = PRIVATEUSE_KEY; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, false)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } } } @@ -1853,14 +1840,14 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) /* If a POSIX variant was in the extensions, write it out before writing the keywords. */ - if (U_SUCCESS(*status) && posixVariant) { - len = (int32_t) uprv_strlen(_POSIX); + if (U_SUCCESS(status) && posixVariant) { + len = static_cast<int32_t>(uprv_strlen(_POSIX)); sink.Append(_POSIX, len); } - if (U_SUCCESS(*status) && kwdFirst != nullptr) { + if (U_SUCCESS(status) && kwdFirst != nullptr) { /* write out the sorted keywords */ - UBool firstValue = true; + bool firstValue = true; kwd = kwdFirst; do { if (firstValue) { @@ -1871,12 +1858,12 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) } /* key */ - len = (int32_t)uprv_strlen(kwd->key); + len = static_cast<int32_t>(uprv_strlen(kwd->key)); sink.Append(kwd->key, len); sink.Append("=", 1); /* type */ - len = (int32_t)uprv_strlen(kwd->value); + len = static_cast<int32_t>(uprv_strlen(kwd->value)); sink.Append(kwd->value, len); kwd = kwd->next; @@ -1884,33 +1871,27 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) } } -static void -_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { - (void)hadPosix; - char buf[ULOC_FULLNAME_CAPACITY]; - UErrorCode tmpStatus = U_ZERO_ERROR; - int32_t len, i; - - if (U_FAILURE(*status)) { - return; - } +void +_appendPrivateuseToLanguageTag(std::string_view localeID, icu::ByteSink& sink, bool strict, bool /*hadPosix*/, UErrorCode& status) { + if (U_FAILURE(status)) { return; } - len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); - if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { + UErrorCode tmpStatus = U_ZERO_ERROR; + icu::CharString buf = ulocimp_getVariant(localeID, tmpStatus); + if (U_FAILURE(tmpStatus)) { if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; } return; } - if (len > 0) { + if (!buf.isEmpty()) { char *p, *pPriv; - UBool bNext = true; - UBool firstValue = true; - UBool writeValue; + bool bNext = true; + bool firstValue = true; + bool writeValue; pPriv = nullptr; - p = buf; + p = buf.data(); while (bNext) { writeValue = false; if (*p == SEP || *p == LOCALE_SEP || *p == 0) { @@ -1921,7 +1902,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool } if (pPriv != nullptr) { /* Private use in the canonical format is lowercase in BCP47 */ - for (i = 0; *(pPriv + i) != 0; i++) { + for (int32_t i = 0; *(pPriv + i) != 0; i++) { *(pPriv + i) = uprv_tolower(*(pPriv + i)); } @@ -1935,7 +1916,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool writeValue = true; } } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; break; } else { break; @@ -1952,7 +1933,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool firstValue = false; } - len = (int32_t)uprv_strlen(pPriv); + int32_t len = static_cast<int32_t>(uprv_strlen(pPriv)); sink.Append(pPriv, len); } } @@ -1994,35 +1975,33 @@ _appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool #pragma optimize( "", off ) #endif -static ULanguageTag* -ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { +ULanguageTag* +ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& status) { + if (U_FAILURE(status)) { return nullptr; } + char *tagBuf; int16_t next; char *pSubtag, *pNext, *pLastGoodPosition; int32_t subtagLen; int32_t extlangIdx; - ExtensionListEntry *pExtension; + icu::LocalPointer<ExtensionListEntry> pExtension; char *pExtValueSubtag, *pExtValueSubtagEnd; int32_t i; - UBool privateuseVar = false; + bool privateuseVar = false; int32_t legacyLen = 0; if (parsedLen != nullptr) { *parsedLen = 0; } - if (U_FAILURE(*status)) { - return nullptr; - } - if (tagLen < 0) { - tagLen = (int32_t)uprv_strlen(tag); + tagLen = static_cast<int32_t>(uprv_strlen(tag)); } /* copy the entire string */ - tagBuf = (char*)uprv_malloc(tagLen + 1); + tagBuf = static_cast<char*>(uprv_malloc(tagLen + 1)); if (tagBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -2033,10 +2012,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta /* create a ULanguageTag */ icu::LocalULanguageTagPointer t( - (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag))); + static_cast<ULanguageTag*>(uprv_malloc(sizeof(ULanguageTag)))); if (t.isNull()) { uprv_free(tagBuf); - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } _initializeULanguageTag(t.getAlias()); @@ -2072,9 +2051,9 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta uprv_free(tagBuf); // Change t->buf after the free and before return to avoid the second double free in // the destructor of t when t is out of scope. - t->buf = tagBuf = (char*)uprv_malloc(newTagLength + 1); + t->buf = tagBuf = static_cast<char*>(uprv_malloc(newTagLength + 1)); if (tagBuf == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } tagLen = newTagLength; @@ -2133,7 +2112,6 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta next = LANG | PRIV; pNext = pLastGoodPosition = tagBuf; extlangIdx = 0; - pExtension = nullptr; pExtValueSubtag = nullptr; pExtValueSubtagEnd = nullptr; @@ -2156,7 +2134,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } else { pNext = pSep + 1; } - subtagLen = (int32_t)(pSep - pSubtag); + subtagLen = static_cast<int32_t>(pSep - pSubtag); if (next & LANG) { if (ultag_isLanguageSubtag(pSubtag, subtagLen)) { @@ -2219,20 +2197,14 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta if (next & VART) { if (_isVariantSubtag(pSubtag, subtagLen) || (privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) { - VariantListEntry *var; - UBool isAdded; - - var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); - if (var == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + icu::LocalPointer<VariantListEntry> var(new VariantListEntry, status); + if (U_FAILURE(status)) { return nullptr; } *pSep = 0; var->variant = T_CString_toUpperCase(pSubtag); - isAdded = _addVariantToList(&(t->variants), var); - if (!isAdded) { + if (!_addVariantToList(&(t->variants), std::move(var))) { /* duplicated variant entry */ - uprv_free(var); break; } pLastGoodPosition = pSep; @@ -2242,11 +2214,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } if (next & EXTS) { if (_isExtensionSingleton(pSubtag, subtagLen)) { - if (pExtension != nullptr) { + if (pExtension.isValid()) { if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } @@ -2255,20 +2226,19 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; } else { /* stop parsing here */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } } /* create a new extension */ - pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (pExtension == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; + pExtension.adoptInsteadAndCheckErrorCode(new ExtensionListEntry, status); + if (U_FAILURE(status)) { return nullptr; } *pSep = 0; @@ -2305,12 +2275,11 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta if (uprv_tolower(*pSubtag) == PRIVATEUSE && subtagLen == 1) { char *pPrivuseVal; - if (pExtension != nullptr) { + if (pExtension.isValid()) { /* Process the last extension */ if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } else { /* terminate the previous extension value */ @@ -2318,13 +2287,12 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; - pExtension = nullptr; } else { /* stop parsing here */ - uprv_free(pExtension); - pExtension = nullptr; + delete pExtension.orphan(); break; } } @@ -2354,7 +2322,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } else { pNext = pSep + 1; } - subtagLen = (int32_t)(pSep - pSubtag); + subtagLen = static_cast<int32_t>(pSep - pSubtag); if (uprv_strncmp(pSubtag, PRIVUSE_VARIANT_PREFIX, uprv_strlen(PRIVUSE_VARIANT_PREFIX)) == 0) { *pSep = 0; @@ -2386,26 +2354,27 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta break; } - if (pExtension != nullptr) { + if (pExtension.isValid()) { /* Process the last extension */ if (pExtValueSubtag == nullptr || pExtValueSubtagEnd == nullptr) { /* the previous extension is incomplete */ - uprv_free(pExtension); + delete pExtension.orphan(); } else { /* terminate the previous extension value */ *pExtValueSubtagEnd = 0; pExtension->value = T_CString_toLowerCase(pExtValueSubtag); /* insert the extension to the list */ - if (_addExtensionToList(&(t->extensions), pExtension, false)) { + if (_addExtensionToList(&(t->extensions), pExtension.getAlias(), false)) { + pExtension.orphan(); pLastGoodPosition = pExtValueSubtagEnd; } else { - uprv_free(pExtension); + delete pExtension.orphan(); } } } if (parsedLen != nullptr) { - *parsedLen = (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta); + *parsedLen = static_cast<int32_t>(pLastGoodPosition - t->buf + parsedLenDelta); } return t.orphan(); @@ -2416,7 +2385,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta #pragma optimize( "", on ) #endif -static void +void ultag_close(ULanguageTag* langtag) { if (langtag == nullptr) { @@ -2429,7 +2398,7 @@ ultag_close(ULanguageTag* langtag) { VariantListEntry *curVar = langtag->variants; while (curVar) { VariantListEntry *nextVar = curVar->next; - uprv_free(curVar); + delete curVar; curVar = nextVar; } } @@ -2438,7 +2407,7 @@ ultag_close(ULanguageTag* langtag) { ExtensionListEntry *curExt = langtag->extensions; while (curExt) { ExtensionListEntry *nextExt = curExt->next; - uprv_free(curExt); + delete curExt; curExt = nextExt; } } @@ -2446,13 +2415,13 @@ ultag_close(ULanguageTag* langtag) { uprv_free(langtag); } -static const char* +const char* ultag_getLanguage(const ULanguageTag* langtag) { return langtag->language; } #if 0 -static const char* +const char* ultag_getJDKLanguage(const ULanguageTag* langtag) { int32_t i; for (i = 0; DEPRECATEDLANGS[i] != nullptr; i += 2) { @@ -2464,7 +2433,7 @@ ultag_getJDKLanguage(const ULanguageTag* langtag) { } #endif -static const char* +const char* ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { if (idx >= 0 && idx < MAXEXTLANG) { return langtag->extlang[idx]; @@ -2472,7 +2441,7 @@ ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { return nullptr; } -static int32_t +int32_t ultag_getExtlangSize(const ULanguageTag* langtag) { int32_t size = 0; int32_t i; @@ -2484,17 +2453,17 @@ ultag_getExtlangSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getScript(const ULanguageTag* langtag) { return langtag->script; } -static const char* +const char* ultag_getRegion(const ULanguageTag* langtag) { return langtag->region; } -static const char* +const char* ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { const char *var = nullptr; VariantListEntry *cur = langtag->variants; @@ -2510,7 +2479,7 @@ ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { return var; } -static int32_t +int32_t ultag_getVariantsSize(const ULanguageTag* langtag) { int32_t size = 0; VariantListEntry *cur = langtag->variants; @@ -2524,7 +2493,7 @@ ultag_getVariantsSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { const char *key = nullptr; ExtensionListEntry *cur = langtag->extensions; @@ -2540,7 +2509,7 @@ ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { return key; } -static const char* +const char* ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { const char *val = nullptr; ExtensionListEntry *cur = langtag->extensions; @@ -2556,7 +2525,7 @@ ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { return val; } -static int32_t +int32_t ultag_getExtensionsSize(const ULanguageTag* langtag) { int32_t size = 0; ExtensionListEntry *cur = langtag->extensions; @@ -2570,18 +2539,19 @@ ultag_getExtensionsSize(const ULanguageTag* langtag) { return size; } -static const char* +const char* ultag_getPrivateUse(const ULanguageTag* langtag) { return langtag->privateuse; } #if 0 -static const char* +const char* ultag_getLegacy(const ULanguageTag* langtag) { return langtag->legacy; } #endif +} // namespace /* * ------------------------------------------------- @@ -2596,54 +2566,51 @@ uloc_toLanguageTag(const char* localeID, int32_t langtagCapacity, UBool strict, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink(langtag, langtagCapacity); - ulocimp_toLanguageTag(localeID, sink, strict, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(langtag, langtagCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + langtag, langtagCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_toLanguageTag(localeID, sink, strict, status); + }, + *status); } +U_EXPORT icu::CharString +ulocimp_toLanguageTag(const char* localeID, + bool strict, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_toLanguageTag(localeID, sink, strict, status); + }, + status); +} -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_toLanguageTag(const char* localeID, icu::ByteSink& sink, - UBool strict, - UErrorCode* status) { - icu::CharString canonical; + bool strict, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + UErrorCode tmpStatus = U_ZERO_ERROR; - UBool hadPosix = false; + bool hadPosix = false; const char* pKeywordStart; - /* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */ - { - icu::CharStringByteSink canonicalSink(&canonical); - ulocimp_canonicalize(localeID, canonicalSink, &tmpStatus); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + /* Note: uloc_canonicalize returns "en_US_POSIX" for input locale ID "". See #6835 */ + icu::CharString canonical = ulocimp_canonicalize(localeID, tmpStatus); if (U_FAILURE(tmpStatus)) { - *status = tmpStatus; + status = tmpStatus; return; } /* For handling special case - private use only tag */ - pKeywordStart = locale_getKeywordsStart(canonical.data()); + pKeywordStart = locale_getKeywordsStart(canonical.toStringPiece()); if (pKeywordStart == canonical.data()) { int kwdCnt = 0; - UBool done = false; + bool done = false; icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); if (U_SUCCESS(tmpStatus)) { @@ -2654,11 +2621,7 @@ ulocimp_toLanguageTag(const char* localeID, key = uenum_next(kwdEnum.getAlias(), &len, &tmpStatus); if (len == 1 && *key == PRIVATEUSE) { - icu::CharString buf; - { - icu::CharStringByteSink sink(&buf); - ulocimp_getKeywordValue(localeID, key, sink, &tmpStatus); - } + icu::CharString buf = ulocimp_getKeywordValue(localeID, key, tmpStatus); if (U_SUCCESS(tmpStatus)) { if (ultag_isPrivateuseValueSubtags(buf.data(), buf.length())) { /* return private use only tag */ @@ -2666,12 +2629,12 @@ ulocimp_toLanguageTag(const char* localeID, sink.Append(buf.data(), buf.length()); done = true; } else if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; done = true; } /* if not strict mode, then "und" will be returned */ } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_ILLEGAL_ARGUMENT_ERROR; done = true; } } @@ -2682,12 +2645,12 @@ ulocimp_toLanguageTag(const char* localeID, } } - _appendLanguageToLanguageTag(canonical.data(), sink, strict, status); - _appendScriptToLanguageTag(canonical.data(), sink, strict, status); - _appendRegionToLanguageTag(canonical.data(), sink, strict, status); - _appendVariantsToLanguageTag(canonical.data(), sink, strict, &hadPosix, status); + _appendLanguageToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendScriptToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendRegionToLanguageTag(canonical.toStringPiece(), sink, strict, status); + _appendVariantsToLanguageTag(canonical.toStringPiece(), sink, strict, hadPosix, status); _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); - _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status); + _appendPrivateuseToLanguageTag(canonical.toStringPiece(), sink, strict, hadPosix, status); } @@ -2697,50 +2660,49 @@ uloc_forLanguageTag(const char* langtag, int32_t localeIDCapacity, int32_t* parsedLength, UErrorCode* status) { - if (U_FAILURE(*status)) { - return 0; - } - - icu::CheckedArrayByteSink sink(localeID, localeIDCapacity); - ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); - - int32_t reslen = sink.NumberOfBytesAppended(); - - if (U_FAILURE(*status)) { - return reslen; - } - - if (sink.Overflowed()) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(localeID, localeIDCapacity, reslen, status); - } - - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + localeID, localeIDCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); + }, + *status); } +U_EXPORT icu::CharString +ulocimp_forLanguageTag(const char* langtag, + int32_t tagLen, + int32_t* parsedLength, + UErrorCode& status) { + return icu::ByteSinkUtil::viaByteSinkToCharString( + [&](icu::ByteSink& sink, UErrorCode& status) { + ulocimp_forLanguageTag(langtag, tagLen, sink, parsedLength, status); + }, + status); +} -U_CAPI void U_EXPORT2 +U_EXPORT void ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, icu::ByteSink& sink, int32_t* parsedLength, - UErrorCode* status) { - UBool isEmpty = true; + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + bool isEmpty = true; const char *subtag, *p; int32_t len; int32_t i, n; - UBool noRegion = true; + bool noRegion = true; icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); - if (U_FAILURE(*status)) { + if (U_FAILURE(status)) { return; } /* language */ subtag = ultag_getExtlangSize(lt.getAlias()) > 0 ? ultag_getExtlang(lt.getAlias(), 0) : ultag_getLanguage(lt.getAlias()); if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) { - len = (int32_t)uprv_strlen(subtag); + len = static_cast<int32_t>(uprv_strlen(subtag)); if (len > 0) { sink.Append(subtag, len); isEmpty = false; @@ -2749,7 +2711,7 @@ ulocimp_forLanguageTag(const char* langtag, /* script */ subtag = ultag_getScript(lt.getAlias()); - len = (int32_t)uprv_strlen(subtag); + len = static_cast<int32_t>(uprv_strlen(subtag)); if (len > 0) { sink.Append("_", 1); isEmpty = false; @@ -2762,7 +2724,7 @@ ulocimp_forLanguageTag(const char* langtag, /* region */ subtag = ultag_getRegion(lt.getAlias()); - len = (int32_t)uprv_strlen(subtag); + len = static_cast<int32_t>(uprv_strlen(subtag)); if (len > 0) { sink.Append("_", 1); isEmpty = false; diff --git a/deps/icu-small/source/common/ulocale.cpp b/deps/icu-small/source/common/ulocale.cpp index 471ef0ce79a63f..33814713dc1bfd 100644 --- a/deps/icu-small/source/common/ulocale.cpp +++ b/deps/icu-small/source/common/ulocale.cpp @@ -1,6 +1,7 @@ // © 2023 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // +#include "unicode/bytestream.h" #include "unicode/errorcode.h" #include "unicode/stringpiece.h" #include "unicode/utypes.h" @@ -8,9 +9,8 @@ #include "unicode/ulocale.h" #include "unicode/locid.h" -#include "charstr.h" +#include "bytesinkutil.h" #include "cmemory.h" -#include "ustr_imp.h" U_NAMESPACE_USE #define EXTERNAL(i) (reinterpret_cast<ULocale*>(i)) @@ -19,15 +19,18 @@ U_NAMESPACE_USE ULocale* ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err) { - CharString str(length < 0 ? StringPiece(localeID) : StringPiece(localeID, length), *err); - if (U_FAILURE(*err)) return nullptr; - return EXTERNAL(icu::Locale::createFromName(str.data()).clone()); + if (U_FAILURE(*err)) { return nullptr; } + if (length < 0) { + return EXTERNAL(icu::Locale::createFromName(localeID).clone()); + } + return EXTERNAL(icu::Locale::createFromName(StringPiece{localeID, length}).clone()); } ULocale* ulocale_openForLanguageTag(const char* tag, int32_t length, UErrorCode* err) { + if (U_FAILURE(*err)) { return nullptr; } Locale l = icu::Locale::forLanguageTag(length < 0 ? StringPiece(tag) : StringPiece(tag, length), *err); - if (U_FAILURE(*err)) return nullptr; + if (U_FAILURE(*err)) { return nullptr; } return EXTERNAL(l.clone()); } @@ -53,20 +56,14 @@ int32_t ulocale_get ##N ( \ *err = U_ILLEGAL_ARGUMENT_ERROR; \ return 0; \ } \ - CheckedArrayByteSink sink(valueBuffer, bufferCapacity); \ - CONST_INTERNAL(locale)->get ## N( \ - keywordLength < 0 ? StringPiece(keyword) : StringPiece(keyword, keywordLength), \ - sink, *err); \ - int32_t reslen = sink.NumberOfBytesAppended(); \ - if (U_FAILURE(*err)) { \ - return reslen; \ - } \ - if (sink.Overflowed()) { \ - *err = U_BUFFER_OVERFLOW_ERROR; \ - } else { \ - u_terminateChars(valueBuffer, bufferCapacity, reslen, err); \ - } \ - return reslen; \ + return ByteSinkUtil::viaByteSinkToTerminatedChars( \ + valueBuffer, bufferCapacity, \ + [&](ByteSink& sink, UErrorCode& status) { \ + CONST_INTERNAL(locale)->get ## N( \ + keywordLength < 0 ? StringPiece(keyword) : StringPiece(keyword, keywordLength), \ + sink, status); \ + }, \ + *err); \ } #define IMPL_ULOCALE_GET_KEYWORDS(N) \ diff --git a/deps/icu-small/source/common/ulocbuilder.cpp b/deps/icu-small/source/common/ulocbuilder.cpp index a5af73bef49004..b8b6ce8c186922 100644 --- a/deps/icu-small/source/common/ulocbuilder.cpp +++ b/deps/icu-small/source/common/ulocbuilder.cpp @@ -9,10 +9,10 @@ #include "unicode/stringpiece.h" #include "unicode/umachine.h" #include "unicode/ulocbuilder.h" +#include "bytesinkutil.h" #include "cstring.h" #include "ustr_imp.h" -using icu::CheckedArrayByteSink; using icu::StringPiece; #define EXTERNAL(i) (reinterpret_cast<ULocaleBuilder*>(i)) @@ -112,13 +112,14 @@ ULocale* ulocbld_buildULocale(ULocaleBuilder* builder, UErrorCode* err) { int32_t ulocbld_buildLocaleID(ULocaleBuilder* builder, char* buffer, int32_t bufferCapacity, UErrorCode* err) { + if (U_FAILURE(*err)) { return 0; } if (builder == nullptr) { *err = U_ILLEGAL_ARGUMENT_ERROR; return 0; } icu::Locale l = INTERNAL(builder)->build(*err); - if (U_FAILURE(*err)) return 0; - int32_t length = (int32_t)(uprv_strlen(l.getName())); + if (U_FAILURE(*err)) { return 0; } + int32_t length = static_cast<int32_t>(uprv_strlen(l.getName())); if (0 < length && length <= bufferCapacity) { uprv_memcpy(buffer, l.getName(), length); } @@ -127,24 +128,18 @@ int32_t ulocbld_buildLocaleID(ULocaleBuilder* builder, int32_t ulocbld_buildLanguageTag(ULocaleBuilder* builder, char* buffer, int32_t bufferCapacity, UErrorCode* err) { + if (U_FAILURE(*err)) { return 0; } if (builder == nullptr) { *err = U_ILLEGAL_ARGUMENT_ERROR; return 0; } icu::Locale l = INTERNAL(builder)->build(*err); - if (U_FAILURE(*err)) return 0; - CheckedArrayByteSink sink(buffer, bufferCapacity); - l.toLanguageTag(sink, *err); - int32_t reslen = sink.NumberOfBytesAppended(); - if (U_FAILURE(*err)) { - return reslen; - } - if (sink.Overflowed()) { - *err = U_BUFFER_OVERFLOW_ERROR; - } else { - u_terminateChars(buffer, bufferCapacity, reslen, err); - } - return reslen; + return icu::ByteSinkUtil::viaByteSinkToTerminatedChars( + buffer, bufferCapacity, + [&](icu::ByteSink& sink, UErrorCode& status) { + l.toLanguageTag(sink, status); + }, + *err); } UBool ulocbld_copyErrorTo(const ULocaleBuilder* builder, UErrorCode *outErrorCode) { diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index efa0fa72e6a1f0..a45eba651f7752 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -10,6 +10,10 @@ #ifndef ULOCIMP_H #define ULOCIMP_H +#include <cstddef> +#include <optional> +#include <string_view> + #include "unicode/bytestream.h" #include "unicode/uloc.h" @@ -40,8 +44,10 @@ uloc_getTableStringWithFallback( int32_t *pLength, UErrorCode *pErrorCode); +namespace { /*returns true if a is an ID separator false otherwise*/ -#define _isIDSeparator(a) (a == '_' || a == '-') +inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; } +} // namespace U_CFUNC const char* uloc_getCurrentCountryID(const char* oldID); @@ -49,53 +55,146 @@ uloc_getCurrentCountryID(const char* oldID); U_CFUNC const char* uloc_getCurrentLanguageID(const char* oldID); -U_CFUNC void -ulocimp_getKeywords(const char *localeID, - char prev, - icu::ByteSink& sink, - UBool valuesToo, - UErrorCode *status); - -icu::CharString U_EXPORT2 -ulocimp_getLanguage(const char *localeID, - const char **pEnd, - UErrorCode &status); - -icu::CharString U_EXPORT2 -ulocimp_getScript(const char *localeID, - const char **pEnd, - UErrorCode &status); - -icu::CharString U_EXPORT2 -ulocimp_getCountry(const char *localeID, - const char **pEnd, - UErrorCode &status); - -U_CAPI void U_EXPORT2 -ulocimp_getName(const char* localeID, +U_COMMON_API std::optional<std::string_view> +ulocimp_toBcpKeyWithFallback(std::string_view keyword); + +U_COMMON_API std::optional<std::string_view> +ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value); + +U_COMMON_API std::optional<std::string_view> +ulocimp_toLegacyKeyWithFallback(std::string_view keyword); + +U_COMMON_API std::optional<std::string_view> +ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value); + +U_COMMON_API icu::CharString +ulocimp_getKeywords(std::string_view localeID, + char prev, + bool valuesToo, + UErrorCode& status); + +U_COMMON_API void +ulocimp_getKeywords(std::string_view localeID, + char prev, + icu::ByteSink& sink, + bool valuesToo, + UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_getName(std::string_view localeID, + UErrorCode& err); + +U_COMMON_API void +ulocimp_getName(std::string_view localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); -U_CAPI void U_EXPORT2 -ulocimp_getBaseName(const char* localeID, +U_COMMON_API icu::CharString +ulocimp_getBaseName(std::string_view localeID, + UErrorCode& err); + +U_COMMON_API void +ulocimp_getBaseName(std::string_view localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_COMMON_API icu::CharString +ulocimp_canonicalize(std::string_view localeID, + UErrorCode& err); -U_CAPI void U_EXPORT2 -ulocimp_canonicalize(const char* localeID, +U_COMMON_API void +ulocimp_canonicalize(std::string_view localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_COMMON_API icu::CharString +ulocimp_getKeywordValue(const char* localeID, + std::string_view keywordName, + UErrorCode& status); -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_getKeywordValue(const char* localeID, - const char* keywordName, + std::string_view keywordName, + icu::ByteSink& sink, + UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_getLanguage(std::string_view localeID, UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_getScript(std::string_view localeID, UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_getRegion(std::string_view localeID, UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_getVariant(std::string_view localeID, UErrorCode& status); + +U_COMMON_API void +ulocimp_setKeywordValue(std::string_view keywordName, + std::string_view keywordValue, + icu::CharString& localeID, + UErrorCode& status); + +U_COMMON_API int32_t +ulocimp_setKeywordValue(std::string_view keywords, + std::string_view keywordName, + std::string_view keywordValue, icu::ByteSink& sink, - UErrorCode* status); + UErrorCode& status); + +U_COMMON_API void +ulocimp_getSubtags( + std::string_view localeID, + icu::CharString* language, + icu::CharString* script, + icu::CharString* region, + icu::CharString* variant, + const char** pEnd, + UErrorCode& status); + +U_COMMON_API void +ulocimp_getSubtags( + std::string_view localeID, + icu::ByteSink* language, + icu::ByteSink* script, + icu::ByteSink* region, + icu::ByteSink* variant, + const char** pEnd, + UErrorCode& status); + +inline void +ulocimp_getSubtags( + std::string_view localeID, + std::nullptr_t, + std::nullptr_t, + std::nullptr_t, + std::nullptr_t, + const char** pEnd, + UErrorCode& status) { + ulocimp_getSubtags( + localeID, + static_cast<icu::ByteSink*>(nullptr), + static_cast<icu::ByteSink*>(nullptr), + static_cast<icu::ByteSink*>(nullptr), + static_cast<icu::ByteSink*>(nullptr), + pEnd, + status); +} + +U_COMMON_API icu::CharString +ulocimp_getParent(const char* localeID, + UErrorCode& err); -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_getParent(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_COMMON_API icu::CharString +ulocimp_toLanguageTag(const char* localeID, + bool strict, + UErrorCode& status); /** * Writes a well-formed language tag for this locale ID. @@ -116,11 +215,17 @@ ulocimp_getParent(const char* localeID, * * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_toLanguageTag(const char* localeID, icu::ByteSink& sink, - UBool strict, - UErrorCode* err); + bool strict, + UErrorCode& err); + +U_COMMON_API icu::CharString +ulocimp_forLanguageTag(const char* langtag, + int32_t tagLen, + int32_t* parsedLength, + UErrorCode& status); /** * Returns a locale ID for the specified BCP47 language tag string. @@ -148,12 +253,12 @@ ulocimp_toLanguageTag(const char* localeID, * failed. * @internal ICU 63 */ -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, icu::ByteSink& sink, int32_t* parsedLength, - UErrorCode* err); + UErrorCode& err); /** * Get the region to use for supplemental data lookup. Uses @@ -161,28 +266,27 @@ ulocimp_forLanguageTag(const char* langtag, * (2) any unicode_region_tag in the locale ID; if none then * (3) if inferRegion is true, the region suggested by * getLikelySubtags on the localeID. - * If no region is found, returns length 0. - * + * If no region is found, returns an empty string. + * * @param localeID * The complete locale ID (with keywords) from which * to get the region to use for supplemental data. * @param inferRegion * If true, will try to infer region from localeID if * no other region is found. - * @param region - * Buffer in which to put the region ID found; should - * have a capacity at least ULOC_COUNTRY_CAPACITY. - * @param regionCapacity - * The actual capacity of the region buffer. * @param status * Pointer to in/out UErrorCode value for latest status. * @return - * The length of any region code found, or 0 if none. + * The region code found, empty if none found. * @internal ICU 57 */ -U_CAPI int32_t U_EXPORT2 -ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, - char *region, int32_t regionCapacity, UErrorCode* status); +U_COMMON_API icu::CharString +ulocimp_getRegionForSupplementalData(const char *localeID, bool inferRegion, + UErrorCode& status); + +U_COMMON_API icu::CharString +ulocimp_addLikelySubtags(const char* localeID, + UErrorCode& status); /** * Add the likely subtags for a provided locale ID, per the algorithm described @@ -213,10 +317,15 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_addLikelySubtags(const char* localeID, icu::ByteSink& sink, - UErrorCode* err); + UErrorCode& err); + +U_COMMON_API icu::CharString +ulocimp_minimizeSubtags(const char* localeID, + bool favorScript, + UErrorCode& status); /** * Minimize the subtags for a provided locale ID, per the algorithm described @@ -248,70 +357,87 @@ ulocimp_addLikelySubtags(const char* localeID, * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. * @internal ICU 64 */ -U_CAPI void U_EXPORT2 +U_COMMON_API void ulocimp_minimizeSubtags(const char* localeID, icu::ByteSink& sink, bool favorScript, - UErrorCode* err); + UErrorCode& err); U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(const char *localeID); +locale_getKeywordsStart(std::string_view localeID); -U_CFUNC UBool +bool ultag_isExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isLanguageSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isPrivateuseValueSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isRegionSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isScriptSubtag(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isTransformedExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeExtensionSubtags(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttribute(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleAttributes(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleKey(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isUnicodeLocaleType(const char* s, int32_t len); -U_CFUNC UBool +bool ultag_isVariantSubtags(const char* s, int32_t len); -U_CAPI const char * U_EXPORT2 -ultag_getTKeyStart(const char *localeID); +const char* +ultag_getTKeyStart(const char* localeID); -U_CFUNC const char* -ulocimp_toBcpKey(const char* key); +U_COMMON_API std::optional<std::string_view> +ulocimp_toBcpKey(std::string_view key); -U_CFUNC const char* -ulocimp_toLegacyKey(const char* key); +U_COMMON_API std::optional<std::string_view> +ulocimp_toLegacyKey(std::string_view key); -U_CFUNC const char* -ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType); +U_COMMON_API std::optional<std::string_view> +ulocimp_toBcpType(std::string_view key, std::string_view type); -U_CFUNC const char* -ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool* isSpecialType); +U_COMMON_API std::optional<std::string_view> +ulocimp_toLegacyType(std::string_view key, std::string_view type); /* Function for testing purpose */ -U_CAPI const char* const* ulocimp_getKnownCanonicalizedLocaleForTest(int32_t* length); +U_COMMON_API const char* const* +ulocimp_getKnownCanonicalizedLocaleForTest(int32_t& length); // Return true if the value is already canonicalized. -U_CAPI bool ulocimp_isCanonicalizedLocaleForTest(const char* localeName); +U_COMMON_API bool +ulocimp_isCanonicalizedLocaleForTest(const char* localeName); + +#ifdef __cplusplus +U_NAMESPACE_BEGIN +class U_COMMON_API RegionValidateMap : public UObject { + public: + RegionValidateMap(); + virtual ~RegionValidateMap(); + bool isSet(const char* region) const; + bool equals(const RegionValidateMap& that) const; + protected: + int32_t value(const char* region) const; + uint32_t map[22]; // 26x26/32 = 22; +}; +U_NAMESPACE_END +#endif /* __cplusplus */ #endif diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index faa6d807868885..c01ac69c3a42fd 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -63,7 +63,7 @@ typedef HANDLE MemoryMap; # define IS_MAP(map) ((map)!=nullptr) -#elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL +#elif MAP_IMPLEMENTATION==MAP_POSIX typedef size_t MemoryMap; # define IS_MAP(map) ((map)!=0) @@ -76,18 +76,6 @@ typedef HANDLE MemoryMap; # ifndef MAP_FAILED # define MAP_FAILED ((void*)-1) # endif - -# if MAP_IMPLEMENTATION==MAP_390DLL - /* No memory mapping for 390 batch mode. Fake it using dll loading. */ -# include <dll.h> -# include "cstring.h" -# include "cmemory.h" -# include "unicode/udata.h" -# define LIB_PREFIX "lib" -# define LIB_SUFFIX ".dll" - /* This is inconvenient until we figure out what to do with U_ICUDATA_NAME in utypes.h */ -# define U_ICUDATA_ENTRY_NAME "icudt" U_ICU_VERSION_SHORT U_LIB_SUFFIX_C_NAME_STRING "_dat" -# endif #elif MAP_IMPLEMENTATION==MAP_STDIO # include <stdio.h> # include "cmemory.h" @@ -131,6 +119,7 @@ typedef HANDLE MemoryMap; HANDLE map = nullptr; HANDLE file = INVALID_HANDLE_VALUE; + DWORD fileLength = 0; UDataMemory_init(pData); /* Clear the output struct. */ @@ -171,6 +160,8 @@ typedef HANDLE MemoryMap; return false; } + fileLength = GetFileSize(file, nullptr); + // Note: We use nullptr/nullptr for lpAttributes parameter below. // This means our handle cannot be inherited and we will get the default security descriptor. /* create an unnamed Windows file-mapping object for the specified file */ @@ -193,6 +184,8 @@ typedef HANDLE MemoryMap; return false; } pData->map = map; + pData->length = fileLength; + return true; } @@ -236,9 +229,9 @@ typedef HANDLE MemoryMap; /* get a view of the mapping */ #if U_PLATFORM != U_PF_HPUX - data=mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); + data=mmap(nullptr, length, PROT_READ, MAP_SHARED, fd, 0); #else - data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); + data=mmap(nullptr, length, PROT_READ, MAP_PRIVATE, fd, 0); #endif close(fd); /* no longer needed */ if(data==MAP_FAILED) { @@ -249,8 +242,14 @@ typedef HANDLE MemoryMap; pData->map = (char *)data + length; pData->pHeader=(const DataHeader *)data; pData->mapAddr = data; -#if U_PLATFORM == U_PF_IPHONE + pData->length = length; +#if U_PLATFORM == U_PF_IPHONE || U_PLATFORM == U_PF_ANDROID + // Apparently supported from Android 23 and higher: + // https://github.com/ggml-org/llama.cpp/pull/3631 + // Checking for the flag itself is safer than checking for __ANDROID_API__. +# ifdef POSIX_MADV_RANDOM posix_madvise(data, length, POSIX_MADV_RANDOM); +# endif #endif return true; } @@ -262,7 +261,7 @@ typedef HANDLE MemoryMap; if(munmap(pData->mapAddr, dataLen)==-1) { } pData->pHeader=nullptr; - pData->map=0; + pData->map=nullptr; pData->mapAddr=nullptr; } } @@ -327,6 +326,7 @@ typedef HANDLE MemoryMap; pData->map=p; pData->pHeader=(const DataHeader *)p; pData->mapAddr=p; + pData->length = fileLength; return true; } @@ -339,192 +339,6 @@ typedef HANDLE MemoryMap; pData->pHeader = nullptr; } } - - -#elif MAP_IMPLEMENTATION==MAP_390DLL - /* 390 specific Library Loading. - * This is the only platform left that dynamically loads an ICU Data Library. - * All other platforms use .data files when dynamic loading is required, but - * this turn out to be awkward to support in 390 batch mode. - * - * The idea here is to hide the fact that 390 is using dll loading from the - * rest of ICU, and make it look like there is file loading happening. - * - */ - - static char *strcpy_returnEnd(char *dest, const char *src) - { - while((*dest=*src)!=0) { - ++dest; - ++src; - } - return dest; - } - - /*------------------------------------------------------------------------------ - * - * computeDirPath given a user-supplied path of an item to be opened, - * compute and return - * - the full directory path to be used - * when opening the file. - * - Pointer to null at end of above returned path - * - * Parameters: - * path: input path. Buffer is not altered. - * pathBuffer: Output buffer. Any contents are overwritten. - * - * Returns: - * Pointer to null termination in returned pathBuffer. - * - * TODO: This works the way ICU historically has, but the - * whole data fallback search path is so complicated that - * probably almost no one will ever really understand it, - * the potential for confusion is large. (It's not just - * this one function, but the whole scheme.) - * - *------------------------------------------------------------------------------*/ - static char *uprv_computeDirPath(const char *path, char *pathBuffer) - { - char *finalSlash; /* Ptr to last dir separator in input path, or null if none. */ - int32_t pathLen; /* Length of the returned directory path */ - - finalSlash = 0; - if (path != 0) { - finalSlash = uprv_strrchr(path, U_FILE_SEP_CHAR); - } - - *pathBuffer = 0; - if (finalSlash == 0) { - /* No user-supplied path. - * Copy the ICU_DATA path to the path buffer and return that*/ - const char *icuDataDir; - icuDataDir=u_getDataDirectory(); - if(icuDataDir!=nullptr && *icuDataDir!=0) { - return strcpy_returnEnd(pathBuffer, icuDataDir); - } else { - /* there is no icuDataDir either. Just return the empty pathBuffer. */ - return pathBuffer; - } - } - - /* User supplied path did contain a directory portion. - * Copy it to the output path buffer */ - pathLen = (int32_t)(finalSlash - path + 1); - uprv_memcpy(pathBuffer, path, pathLen); - *(pathBuffer+pathLen) = 0; - return pathBuffer+pathLen; - } - - -# define DATA_TYPE "dat" - - U_CFUNC UBool uprv_mapFile(UDataMemory *pData, const char *path, UErrorCode *status) { - const char *inBasename; - char *basename; - char pathBuffer[1024]; - const DataHeader *pHeader; - dllhandle *handle; - void *val=0; - - if (U_FAILURE(*status)) { - return false; - } - - inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR); - if(inBasename==nullptr) { - inBasename = path; - } else { - inBasename++; - } - basename=uprv_computeDirPath(path, pathBuffer); - if(uprv_strcmp(inBasename, U_ICUDATA_NAME".dat") != 0) { - /* must mmap file... for build */ - int fd; - int length; - struct stat mystat; - void *data; - UDataMemory_init(pData); /* Clear the output struct. */ - - /* determine the length of the file */ - if(stat(path, &mystat)!=0 || mystat.st_size<=0) { - return false; - } - length=mystat.st_size; - - /* open the file */ - fd=open(path, O_RDONLY); - if(fd==-1) { - return false; - } - - /* get a view of the mapping */ - data=mmap(0, length, PROT_READ, MAP_PRIVATE, fd, 0); - close(fd); /* no longer needed */ - if(data==MAP_FAILED) { - // Possibly check the errorno value for ENOMEM, and report U_MEMORY_ALLOCATION_ERROR? - return false; - } - pData->map = (char *)data + length; - pData->pHeader=(const DataHeader *)data; - pData->mapAddr = data; - return true; - } - -# ifdef OS390BATCH - /* ### hack: we still need to get u_getDataDirectory() fixed - for OS/390 (batch mode - always return "//"? ) - and this here straightened out with LIB_PREFIX and LIB_SUFFIX (both empty?!) - This is probably due to the strange file system on OS/390. It's more like - a database with short entry names than a typical file system. */ - /* U_ICUDATA_NAME should always have the correct name */ - /* BUT FOR BATCH MODE IT IS AN EXCEPTION BECAUSE */ - /* THE FIRST THREE LETTERS ARE PREASSIGNED TO THE */ - /* PROJECT!!!!! */ - uprv_strcpy(pathBuffer, "IXMI" U_ICU_VERSION_SHORT "DA"); -# else - /* set up the library name */ - uprv_strcpy(basename, LIB_PREFIX U_LIBICUDATA_NAME U_ICU_VERSION_SHORT LIB_SUFFIX); -# endif - -# ifdef UDATA_DEBUG - fprintf(stderr, "dllload: %s ", pathBuffer); -# endif - - handle=dllload(pathBuffer); - -# ifdef UDATA_DEBUG - fprintf(stderr, " -> %08X\n", handle ); -# endif - - if(handle != nullptr) { - /* we have a data DLL - what kind of lookup do we need here? */ - /* try to find the Table of Contents */ - UDataMemory_init(pData); /* Clear the output struct. */ - val=dllqueryvar((dllhandle*)handle, U_ICUDATA_ENTRY_NAME); - if(val == 0) { - /* failed... so keep looking */ - return false; - } -# ifdef UDATA_DEBUG - fprintf(stderr, "dllqueryvar(%08X, %s) -> %08X\n", handle, U_ICUDATA_ENTRY_NAME, val); -# endif - - pData->pHeader=(const DataHeader *)val; - return true; - } else { - return false; /* no handle */ - } - } - - U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=nullptr && pData->map!=nullptr) { - uprv_free(pData->map); - pData->map = nullptr; - pData->mapAddr = nullptr; - pData->pHeader = nullptr; - } - } - #else # error MAP_IMPLEMENTATION is set incorrectly #endif diff --git a/deps/icu-small/source/common/umapfile.h b/deps/icu-small/source/common/umapfile.h index 042e71374c1f59..bacd10e70d807b 100644 --- a/deps/icu-small/source/common/umapfile.h +++ b/deps/icu-small/source/common/umapfile.h @@ -37,19 +37,13 @@ U_CFUNC void uprv_unmapFile(UDataMemory *pData); #define MAP_WIN32 1 #define MAP_POSIX 2 #define MAP_STDIO 3 -#define MAP_390DLL 4 #if UCONFIG_NO_FILE_IO # define MAP_IMPLEMENTATION MAP_NONE #elif U_PLATFORM_USES_ONLY_WIN32_API # define MAP_IMPLEMENTATION MAP_WIN32 #elif U_HAVE_MMAP || U_PLATFORM == U_PF_OS390 -# if U_PLATFORM == U_PF_OS390 && defined (OS390_STUBDATA) - /* No memory mapping for 390 batch mode. Fake it using dll loading. */ -# define MAP_IMPLEMENTATION MAP_390DLL -# else -# define MAP_IMPLEMENTATION MAP_POSIX -# endif +# define MAP_IMPLEMENTATION MAP_POSIX #else /* unknown platform, no memory map implementation: use stdio.h and uprv_malloc() instead */ # define MAP_IMPLEMENTATION MAP_STDIO #endif diff --git a/deps/icu-small/source/common/umutablecptrie.cpp b/deps/icu-small/source/common/umutablecptrie.cpp index cdbe27080b491c..40ea57f1491928 100644 --- a/deps/icu-small/source/common/umutablecptrie.cpp +++ b/deps/icu-small/source/common/umutablecptrie.cpp @@ -45,10 +45,10 @@ constexpr uint8_t MIXED = 1; constexpr uint8_t SAME_AS = 2; /** Start with allocation of 16k data entries. */ -constexpr int32_t INITIAL_DATA_LENGTH = ((int32_t)1 << 14); +constexpr int32_t INITIAL_DATA_LENGTH = static_cast<int32_t>(1) << 14; /** Grow about 8x each time. */ -constexpr int32_t MEDIUM_DATA_LENGTH = ((int32_t)1 << 17); +constexpr int32_t MEDIUM_DATA_LENGTH = static_cast<int32_t>(1) << 17; /** * Maximum length of the build-time data array. @@ -135,8 +135,8 @@ MutableCodePointTrie::MutableCodePointTrie(uint32_t iniValue, uint32_t errValue, #endif { if (U_FAILURE(errorCode)) { return; } - index = (uint32_t *)uprv_malloc(BMP_I_LIMIT * 4); - data = (uint32_t *)uprv_malloc(INITIAL_DATA_LENGTH * 4); + index = static_cast<uint32_t*>(uprv_malloc(BMP_I_LIMIT * 4)); + data = static_cast<uint32_t*>(uprv_malloc(INITIAL_DATA_LENGTH * 4)); if (index == nullptr || data == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -157,8 +157,8 @@ MutableCodePointTrie::MutableCodePointTrie(const MutableCodePointTrie &other, UE { if (U_FAILURE(errorCode)) { return; } int32_t iCapacity = highStart <= BMP_LIMIT ? BMP_I_LIMIT : I_LIMIT; - index = (uint32_t *)uprv_malloc(iCapacity * 4); - data = (uint32_t *)uprv_malloc(other.dataCapacity * 4); + index = static_cast<uint32_t*>(uprv_malloc(iCapacity * 4)); + data = static_cast<uint32_t*>(uprv_malloc(other.dataCapacity * 4)); if (index == nullptr || data == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -268,7 +268,7 @@ void MutableCodePointTrie::clear() { } uint32_t MutableCodePointTrie::get(UChar32 c) const { - if ((uint32_t)c > MAX_UNICODE) { + if (static_cast<uint32_t>(c) > MAX_UNICODE) { return errorValue; } if (c >= highStart) { @@ -295,7 +295,7 @@ inline uint32_t maybeFilterValue(uint32_t value, uint32_t initialValue, uint32_t UChar32 MutableCodePointTrie::getRange( UChar32 start, UCPMapValueFilter *filter, const void *context, uint32_t *pValue) const { - if ((uint32_t)start > MAX_UNICODE) { + if (static_cast<uint32_t>(start) > MAX_UNICODE) { return U_SENTINEL; } if (start >= highStart) { @@ -387,7 +387,7 @@ bool MutableCodePointTrie::ensureHighStart(UChar32 c) { int32_t i = highStart >> UCPTRIE_SHIFT_3; int32_t iLimit = c >> UCPTRIE_SHIFT_3; if (iLimit > indexCapacity) { - uint32_t *newIndex = (uint32_t *)uprv_malloc(I_LIMIT * 4); + uint32_t* newIndex = static_cast<uint32_t*>(uprv_malloc(I_LIMIT * 4)); if (newIndex == nullptr) { return false; } uprv_memcpy(newIndex, index, i * 4); uprv_free(index); @@ -418,7 +418,7 @@ int32_t MutableCodePointTrie::allocDataBlock(int32_t blockLength) { // or the code writes more values than should be possible. return -1; } - uint32_t *newData = (uint32_t *)uprv_malloc(capacity * 4); + uint32_t* newData = static_cast<uint32_t*>(uprv_malloc(capacity * 4)); if (newData == nullptr) { return -1; } @@ -468,7 +468,7 @@ void MutableCodePointTrie::set(UChar32 c, uint32_t value, UErrorCode &errorCode) if (U_FAILURE(errorCode)) { return; } - if ((uint32_t)c > MAX_UNICODE) { + if (static_cast<uint32_t>(c) > MAX_UNICODE) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -495,7 +495,7 @@ void MutableCodePointTrie::setRange(UChar32 start, UChar32 end, uint32_t value, if (U_FAILURE(errorCode)) { return; } - if ((uint32_t)start > MAX_UNICODE || (uint32_t)end > MAX_UNICODE || start > end) { + if (static_cast<uint32_t>(start) > MAX_UNICODE || static_cast<uint32_t>(end) > MAX_UNICODE || start > end) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -792,7 +792,7 @@ class MixedBlocks { } if (newLength > capacity) { uprv_free(table); - table = (uint32_t *)uprv_malloc(newLength * 4); + table = static_cast<uint32_t*>(uprv_malloc(newLength * 4)); if (table == nullptr) { return false; } @@ -1207,8 +1207,8 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixe int32_t i3FirstNull = -1; for (int32_t i = 0, j = 0; i < fastILimit; ++j) { uint32_t i3 = index[i]; - fastIndex[j] = (uint16_t)i3; - if (i3 == (uint32_t)dataNullOffset) { + fastIndex[j] = static_cast<uint16_t>(i3); + if (i3 == static_cast<uint32_t>(dataNullOffset)) { if (i3FirstNull < 0) { i3FirstNull = j; } else if (index3NullOffset < 0 && @@ -1257,7 +1257,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixe do { uint32_t i3 = index[j]; oredI3 |= i3; - if (i3 != (uint32_t)dataNullOffset) { + if (i3 != static_cast<uint32_t>(dataNullOffset)) { isNull = false; } } while (++j < jLimit); @@ -1299,7 +1299,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixe // Index table: Fast index, index-1, index-3, index-2. // +1 for possible index table padding. int32_t index16Capacity = fastIndexLength + index1Length + index3Capacity + index2Capacity + 1; - index16 = (uint16_t *)uprv_malloc(index16Capacity * 2); + index16 = static_cast<uint16_t*>(uprv_malloc(index16Capacity * 2)); if (index16 == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return 0; @@ -1531,7 +1531,7 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC errorCode = U_MEMORY_ALLOCATION_ERROR; return 0; } - uint32_t *newData = (uint32_t *)uprv_malloc(newDataCapacity * 4); + uint32_t* newData = static_cast<uint32_t*>(uprv_malloc(newDataCapacity * 4)); if (newData == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return 0; @@ -1654,7 +1654,7 @@ UCPTrie *MutableCodePointTrie::build(UCPTrieType type, UCPTrieValueWidth valueWi length += sizeof(UCPTrie); U_ASSERT((length & 3) == 0); - uint8_t *bytes = (uint8_t *)uprv_malloc(length); + uint8_t* bytes = static_cast<uint8_t*>(uprv_malloc(length)); if (bytes == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; clear(); @@ -1679,13 +1679,13 @@ UCPTrie *MutableCodePointTrie::build(UCPTrieType type, UCPTrieValueWidth valueWi bytes += sizeof(UCPTrie); // Fill the index and data arrays. - uint16_t *dest16 = (uint16_t *)bytes; + uint16_t* dest16 = reinterpret_cast<uint16_t*>(bytes); trie->index = dest16; if (highStart <= fastLimit) { // Condense only the fast index from the mutable-trie index. for (int32_t i = 0, j = 0; j < indexLength; i += SMALL_DATA_BLOCKS_PER_BMP_BLOCK, ++j) { - *dest16++ = (uint16_t)index[i]; // dest16[j] + *dest16++ = static_cast<uint16_t>(index[i]); // dest16[j] } } else { uprv_memcpy(dest16, index16, indexLength * 2); @@ -1700,19 +1700,19 @@ UCPTrie *MutableCodePointTrie::build(UCPTrieType type, UCPTrieValueWidth valueWi // Write 16-bit data values. trie->data.ptr16 = dest16; for (int32_t i = dataLength; i > 0; --i) { - *dest16++ = (uint16_t)*p++; + *dest16++ = static_cast<uint16_t>(*p++); } break; case UCPTRIE_VALUE_BITS_32: // Write 32-bit data values. - trie->data.ptr32 = (uint32_t *)bytes; + trie->data.ptr32 = reinterpret_cast<uint32_t*>(bytes); uprv_memcpy(bytes, p, (size_t)dataLength * 4); break; case UCPTRIE_VALUE_BITS_8: // Write 8-bit data values. trie->data.ptr8 = bytes; for (int32_t i = dataLength; i > 0; --i) { - *bytes++ = (uint8_t)*p++; + *bytes++ = static_cast<uint8_t>(*p++); } break; default: diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index ccbee9960a39e7..0c053968dcc85a 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -189,7 +189,6 @@ u_setMutexFunctions(const void * /*context */, UMtxInitFn *, UMtxFn *, if (U_SUCCESS(*status)) { *status = U_UNSUPPORTED_ERROR; } - return; } @@ -200,5 +199,4 @@ u_setAtomicIncDecFunctions(const void * /*context */, UMtxAtomicFn *, UMtxAtomic if (U_SUCCESS(*status)) { *status = U_UNSUPPORTED_ERROR; } - return; } diff --git a/deps/icu-small/source/common/umutex.h b/deps/icu-small/source/common/umutex.h index 1b8332409c6dda..8ae6d1029302f2 100644 --- a/deps/icu-small/source/common/umutex.h +++ b/deps/icu-small/source/common/umutex.h @@ -37,31 +37,6 @@ #error U_USER_ATOMICS and U_USER_MUTEX_H are not supported #endif -// Export an explicit template instantiation of std::atomic<int32_t>. -// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class. -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -// -// Similar story for std::atomic<std::mutex *>, and the exported UMutex class. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) -#if defined(__clang__) || defined(_MSC_VER) - #if defined(__clang__) - // Suppress the warning that the explicit instantiation after explicit specialization has no effect. - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Winstantiation-after-specialization" - #endif -template struct U_COMMON_API std::atomic<int32_t>; -template struct U_COMMON_API std::atomic<std::mutex *>; - #if defined(__clang__) - #pragma clang diagnostic pop - #endif -#elif defined(__GNUC__) -// For GCC this class is already exported/visible, so no need for U_COMMON_API. -template struct std::atomic<int32_t>; -template struct std::atomic<std::mutex *>; -#endif -#endif - - U_NAMESPACE_BEGIN /**************************************************************************** @@ -95,11 +70,22 @@ inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { * *************************************************************************************************/ -struct U_COMMON_API UInitOnce { - u_atomic_int32_t fState {0}; - UErrorCode fErrCode {U_ZERO_ERROR}; - void reset() {fState = 0;} - UBool isReset() {return umtx_loadAcquire(fState) == 0;} +struct U_COMMON_API_CLASS UInitOnce { +private: + friend U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce&); + friend U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce&); + template <typename T> friend void umtx_initOnce(UInitOnce&, T*, void (T::*)()); + friend void umtx_initOnce(UInitOnce&, void (*)()); + friend void umtx_initOnce(UInitOnce&, void (*)(UErrorCode&), UErrorCode&); + template <typename T> friend void umtx_initOnce(UInitOnce&, void (*)(T), T); + template <typename T> friend void umtx_initOnce(UInitOnce&, void (*)(T, UErrorCode&), T, UErrorCode&); + + u_atomic_int32_t fState{0}; + UErrorCode fErrCode{U_ZERO_ERROR}; + +public: + U_COMMON_API void reset() { fState = 0; } + U_COMMON_API UBool isReset() { return umtx_loadAcquire(fState) == 0; } // Note: isReset() is used by service registration code. // Thread safety of this usage needs review. }; @@ -216,24 +202,24 @@ template<class T> void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UE * } // myMutex is released when lock goes out of scope. */ -class U_COMMON_API UMutex { +class U_COMMON_API_CLASS UMutex { public: - UMUTEX_CONSTEXPR UMutex() {} - ~UMutex() = default; + U_COMMON_API UMUTEX_CONSTEXPR UMutex() {} + U_COMMON_API ~UMutex() = default; - UMutex(const UMutex &other) = delete; - UMutex &operator =(const UMutex &other) = delete; - void *operator new(size_t) = delete; + UMutex(const UMutex& other) = delete; + UMutex& operator=(const UMutex& other) = delete; + void* operator new(size_t) = delete; // requirements for C++ BasicLockable, allows UMutex to work with std::lock_guard - void lock() { + U_COMMON_API void lock() { std::mutex *m = fMutex.load(std::memory_order_acquire); if (m == nullptr) { m = getMutex(); } m->lock(); } - void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); } + U_COMMON_API void unlock() { fMutex.load(std::memory_order_relaxed)->unlock(); } - static void cleanup(); + U_COMMON_API static void cleanup(); private: alignas(std::mutex) char fStorage[sizeof(std::mutex)] {}; diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index 1b3192bf25ef0d..71b2baff6c190c 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -180,7 +180,7 @@ static UBool U_CALLCONV isAcceptable(void * /*context*/, const char * /*type*/, const char * /*name*/, const UDataInfo *pInfo) { - return (UBool)( + return pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && @@ -188,7 +188,7 @@ isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x6e && pInfo->dataFormat[2]==0x61 && pInfo->dataFormat[3]==0x6d && - pInfo->formatVersion[0]==1); + pInfo->formatVersion[0]==1; } static void U_CALLCONV @@ -238,9 +238,9 @@ static uint16_t expandName(UCharNames *names, const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, char *buffer, uint16_t bufferLength) { - uint16_t *tokens=(uint16_t *)names+8; + uint16_t* tokens = reinterpret_cast<uint16_t*>(names) + 8; uint16_t token, tokenCount=*tokens++, bufferPos=0; - uint8_t *tokenStrings=(uint8_t *)names+names->tokenStringOffset; + uint8_t* tokenStrings = reinterpret_cast<uint8_t*>(names) + names->tokenStringOffset; uint8_t c; if(nameChoice!=U_UNICODE_CHAR_NAME && nameChoice!=U_EXTENDED_CHAR_NAME) { @@ -248,7 +248,7 @@ expandName(UCharNames *names, * skip the modern name if it is not requested _and_ * if the semicolon byte value is a character, not a token number */ - if((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { + if (static_cast<uint8_t>(';') >= tokenCount || tokens[static_cast<uint8_t>(';')] == static_cast<uint16_t>(-1)) { int fieldIndex= nameChoice==U_ISO_COMMENT ? 2 : nameChoice; do { while(nameLength>0) { @@ -283,12 +283,12 @@ expandName(UCharNames *names, } } else { token=tokens[c]; - if(token==(uint16_t)(-2)) { + if (token == static_cast<uint16_t>(-2)) { /* this is a lead byte for a double-byte token */ token=tokens[c<<8|*name++]; --nameLength; } - if(token==(uint16_t)(-1)) { + if (token == static_cast<uint16_t>(-1)) { if(c!=';') { /* explicit letter */ WRITE_CHAR(buffer, bufferLength, bufferPos, c); @@ -297,7 +297,7 @@ expandName(UCharNames *names, extended names and there was no 2.0 name but there is a 1.0 name. */ if(!bufferPos && nameChoice == U_EXTENDED_CHAR_NAME) { - if ((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { + if (static_cast<uint8_t>(';') >= tokenCount || tokens[static_cast<uint8_t>(';')] == static_cast<uint16_t>(-1)) { continue; } } @@ -331,9 +331,9 @@ static UBool compareName(UCharNames *names, const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, const char *otherName) { - uint16_t *tokens=(uint16_t *)names+8; + uint16_t* tokens = reinterpret_cast<uint16_t*>(names) + 8; uint16_t token, tokenCount=*tokens++; - uint8_t *tokenStrings=(uint8_t *)names+names->tokenStringOffset; + uint8_t* tokenStrings = reinterpret_cast<uint8_t*>(names) + names->tokenStringOffset; uint8_t c; const char *origOtherName = otherName; @@ -342,7 +342,7 @@ compareName(UCharNames *names, * skip the modern name if it is not requested _and_ * if the semicolon byte value is a character, not a token number */ - if((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { + if (static_cast<uint8_t>(';') >= tokenCount || tokens[static_cast<uint8_t>(';')] == static_cast<uint16_t>(-1)) { int fieldIndex= nameChoice==U_ISO_COMMENT ? 2 : nameChoice; do { while(nameLength>0) { @@ -370,7 +370,7 @@ compareName(UCharNames *names, if(c>=tokenCount) { if(c!=';') { /* implicit letter */ - if((char)c!=*otherName++) { + if (static_cast<char>(c) != *otherName++) { return false; } } else { @@ -379,15 +379,15 @@ compareName(UCharNames *names, } } else { token=tokens[c]; - if(token==(uint16_t)(-2)) { + if (token == static_cast<uint16_t>(-2)) { /* this is a lead byte for a double-byte token */ token=tokens[c<<8|*name++]; --nameLength; } - if(token==(uint16_t)(-1)) { + if (token == static_cast<uint16_t>(-1)) { if(c!=';') { /* explicit letter */ - if((char)c!=*otherName++) { + if (static_cast<char>(c) != *otherName++) { return false; } } else { @@ -395,7 +395,7 @@ compareName(UCharNames *names, extended names and there was no 2.0 name but there is a 1.0 name. */ if(otherName == origOtherName && nameChoice == U_EXTENDED_CHAR_NAME) { - if ((uint8_t)';'>=tokenCount || tokens[(uint8_t)';']==(uint16_t)(-1)) { + if (static_cast<uint8_t>(';') >= tokenCount || tokens[static_cast<uint8_t>(';')] == static_cast<uint16_t>(-1)) { continue; } } @@ -406,7 +406,7 @@ compareName(UCharNames *names, /* write token word */ uint8_t *tokenString=tokenStrings+token; while((c=*tokenString++)!=0) { - if((char)c!=*otherName++) { + if (static_cast<char>(c) != *otherName++) { return false; } } @@ -415,7 +415,7 @@ compareName(UCharNames *names, } /* complete match? */ - return (UBool)(*otherName==0); + return *otherName == 0; } static uint8_t getCharCat(UChar32 cp) { @@ -462,7 +462,7 @@ static uint16_t getExtName(uint32_t code, char *buffer, uint16_t bufferLength) { if (ndigits < 4) ndigits = 4; for (cp = code, i = ndigits; (cp || i > 0) && bufferLength; cp >>= 4, bufferLength--) { - uint8_t v = (uint8_t)(cp & 0xf); + uint8_t v = static_cast<uint8_t>(cp & 0xf); buffer[--i] = (v < 10 ? '0' + v : 'A' + v - 10); } buffer += ndigits; @@ -482,14 +482,14 @@ static uint16_t getExtName(uint32_t code, char *buffer, uint16_t bufferLength) { static const uint16_t * getGroup(UCharNames *names, uint32_t code) { const uint16_t *groups=GET_GROUPS(names); - uint16_t groupMSB=(uint16_t)(code>>GROUP_SHIFT), + uint16_t groupMSB = static_cast<uint16_t>(code >> GROUP_SHIFT), start=0, limit=*groups++, number; /* binary search for the group of names that contains the one for code */ while(start<limit-1) { - number=(uint16_t)((start+limit)/2); + number = static_cast<uint16_t>((start + limit) / 2); if(groupMSB<groups[number*GROUP_LENGTH+GROUP_MSB]) { limit=number; } else { @@ -525,14 +525,14 @@ expandGroupLengths(const uint8_t *s, /* read even nibble - MSBs of lengthByte */ if(length>=12) { /* double-nibble length spread across two bytes */ - length=(uint16_t)(((length&0x3)<<4|lengthByte>>4)+12); + length = static_cast<uint16_t>(((length & 0x3) << 4 | lengthByte >> 4) + 12); lengthByte&=0xf; } else if((lengthByte /* &0xf0 */)>=0xc0) { /* double-nibble length spread across this one byte */ - length=(uint16_t)((lengthByte&0x3f)+12); + length = static_cast<uint16_t>((lengthByte & 0x3f) + 12); } else { /* single-nibble length in MSBs */ - length=(uint16_t)(lengthByte>>4); + length = static_cast<uint16_t>(lengthByte >> 4); lengthByte&=0xf; } @@ -568,7 +568,7 @@ expandGroupName(UCharNames *names, const uint16_t *group, uint16_t lineNumber, UCharNameChoice nameChoice, char *buffer, uint16_t bufferLength) { uint16_t offsets[LINES_PER_GROUP+2], lengths[LINES_PER_GROUP+2]; - const uint8_t *s=(uint8_t *)names+names->groupStringOffset+GET_GROUP_OFFSET(group); + const uint8_t* s = reinterpret_cast<uint8_t*>(names) + names->groupStringOffset + GET_GROUP_OFFSET(group); s=expandGroupLengths(s, offsets, lengths); return expandName(names, s+offsets[lineNumber], lengths[lineNumber], nameChoice, buffer, bufferLength); @@ -578,8 +578,8 @@ static uint16_t getName(UCharNames *names, uint32_t code, UCharNameChoice nameChoice, char *buffer, uint16_t bufferLength) { const uint16_t *group=getGroup(names, code); - if((uint16_t)(code>>GROUP_SHIFT)==group[GROUP_MSB]) { - return expandGroupName(names, group, (uint16_t)(code&GROUP_MASK), nameChoice, + if (static_cast<uint16_t>(code >> GROUP_SHIFT) == group[GROUP_MSB]) { + return expandGroupName(names, group, static_cast<uint16_t>(code & GROUP_MASK), nameChoice, buffer, bufferLength); } else { /* group not found */ @@ -601,7 +601,7 @@ enumGroupNames(UCharNames *names, const uint16_t *group, UEnumCharNamesFn *fn, void *context, UCharNameChoice nameChoice) { uint16_t offsets[LINES_PER_GROUP+2], lengths[LINES_PER_GROUP+2]; - const uint8_t *s=(uint8_t *)names+names->groupStringOffset+GET_GROUP_OFFSET(group); + const uint8_t* s = reinterpret_cast<uint8_t*>(names) + names->groupStringOffset + GET_GROUP_OFFSET(group); s=expandGroupLengths(s, offsets, lengths); if(fn!=DO_FIND_NAME) { @@ -622,10 +622,10 @@ enumGroupNames(UCharNames *names, const uint16_t *group, ++start; } } else { - const char *otherName=((FindName *)context)->otherName; + const char* otherName = static_cast<FindName*>(context)->otherName; while(start<=end) { if(compareName(names, s+offsets[start&GROUP_MASK], lengths[start&GROUP_MASK], nameChoice, otherName)) { - ((FindName *)context)->code=start; + static_cast<FindName*>(context)->code = start; return false; } ++start; @@ -671,15 +671,15 @@ enumNames(UCharNames *names, uint16_t startGroupMSB, endGroupMSB, groupCount; const uint16_t *group, *groupLimit; - startGroupMSB=(uint16_t)(start>>GROUP_SHIFT); - endGroupMSB=(uint16_t)((limit-1)>>GROUP_SHIFT); + startGroupMSB = static_cast<uint16_t>(start >> GROUP_SHIFT); + endGroupMSB = static_cast<uint16_t>((limit - 1) >> GROUP_SHIFT); /* find the group that contains start, or the highest before it */ group=getGroup(names, start); if(startGroupMSB<group[GROUP_MSB] && nameChoice==U_EXTENDED_CHAR_NAME) { /* enumerate synthetic names between start and the group start */ - UChar32 extLimit=((UChar32)group[GROUP_MSB]<<GROUP_SHIFT); + UChar32 extLimit = static_cast<UChar32>(group[GROUP_MSB]) << GROUP_SHIFT; if(extLimit>limit) { extLimit=limit; } @@ -703,7 +703,7 @@ enumNames(UCharNames *names, /* enumerate characters in the partial start group */ if((start&GROUP_MASK)!=0) { if(!enumGroupNames(names, group, - start, ((UChar32)startGroupMSB<<GROUP_SHIFT)+LINES_PER_GROUP-1, + start, (static_cast<UChar32>(startGroupMSB) << GROUP_SHIFT) + LINES_PER_GROUP - 1, fn, context, nameChoice)) { return false; } @@ -727,7 +727,7 @@ enumNames(UCharNames *names, /* enumerate entire groups between the start- and end-groups */ while(group<groupLimit && group[GROUP_MSB]<endGroupMSB) { const uint16_t *nextGroup; - start=(UChar32)group[GROUP_MSB]<<GROUP_SHIFT; + start = static_cast<UChar32>(group[GROUP_MSB]) << GROUP_SHIFT; if(!enumGroupNames(names, group, start, start+LINES_PER_GROUP-1, fn, context, nameChoice)) { return false; } @@ -790,14 +790,14 @@ writeFactorSuffix(const uint16_t *factors, uint16_t count, --count; for(i=count; i>0; --i) { factor=factors[i]; - indexes[i]=(uint16_t)(code%factor); + indexes[i] = static_cast<uint16_t>(code % factor); code/=factor; } /* * we don't need to calculate the last modulus because start<=code<=end * guarantees here that code<=factors[0] */ - indexes[0]=(uint16_t)code; + indexes[0] = static_cast<uint16_t>(code); /* write each element */ for(;;) { @@ -826,7 +826,7 @@ writeFactorSuffix(const uint16_t *factors, uint16_t count, } /* skip the rest of the strings for this factors[i] */ - factor=(uint16_t)(factors[i]-indexes[i]-1); + factor = static_cast<uint16_t>(factors[i] - indexes[i] - 1); while(factor>0) { while(*s++!=0) {} --factor; @@ -865,7 +865,7 @@ getAlgName(AlgorithmicRange *range, uint32_t code, UCharNameChoice nameChoice, switch(range->type) { case 0: { /* name = prefix hex-digits */ - const char *s=(const char *)(range+1); + const char* s = reinterpret_cast<const char*>(range + 1); char c; uint16_t i, count; @@ -885,7 +885,7 @@ getAlgName(AlgorithmicRange *range, uint32_t code, UCharNameChoice nameChoice, for(i=count; i>0;) { if(--i<bufferLength) { - c=(char)(code&0xf); + c = static_cast<char>(code & 0xf); if(c<10) { c+='0'; } else { @@ -902,9 +902,9 @@ getAlgName(AlgorithmicRange *range, uint32_t code, UCharNameChoice nameChoice, case 1: { /* name = prefix factorized-elements */ uint16_t indexes[8]; - const uint16_t *factors=(const uint16_t *)(range+1); + const uint16_t* factors = reinterpret_cast<const uint16_t*>(range + 1); uint16_t count=range->variant; - const char *s=(const char *)(factors+count); + const char* s = reinterpret_cast<const char*>(factors + count); char c; /* copy prefix */ @@ -950,7 +950,7 @@ enumAlgNames(AlgorithmicRange *range, char c; /* get the full name of the start character */ - length=getAlgName(range, (uint32_t)start, nameChoice, buffer, sizeof(buffer)); + length = getAlgName(range, static_cast<uint32_t>(start), nameChoice, buffer, sizeof(buffer)); if(length<=0) { return true; } @@ -973,7 +973,7 @@ enumAlgNames(AlgorithmicRange *range, for (;;) { c=*--s; if(('0'<=c && c<'9') || ('A'<=c && c<'F')) { - *s=(char)(c+1); + *s = static_cast<char>(c + 1); break; } else if(c=='9') { *s='A'; @@ -992,9 +992,9 @@ enumAlgNames(AlgorithmicRange *range, case 1: { uint16_t indexes[8]; const char *elementBases[8], *elements[8]; - const uint16_t *factors=(const uint16_t *)(range+1); + const uint16_t* factors = reinterpret_cast<const uint16_t*>(range + 1); uint16_t count=range->variant; - const char *s=(const char *)(factors+count); + const char* s = reinterpret_cast<const char*>(factors + count); char *suffix, *t; uint16_t prefixLength, i, idx; @@ -1011,10 +1011,10 @@ enumAlgNames(AlgorithmicRange *range, } /* append the suffix of the start character */ - length=(uint16_t)(prefixLength+writeFactorSuffix(factors, count, - s, (uint32_t)start-range->start, + length = static_cast<uint16_t>(prefixLength + writeFactorSuffix(factors, count, + s, static_cast<uint32_t>(start) - range->start, indexes, elementBases, elements, - suffix, (uint16_t)(sizeof(buffer)-prefixLength))); + suffix, static_cast<uint16_t>(sizeof(buffer) - prefixLength))); /* call the enumerator function with this first character */ if(!fn(context, start, nameChoice, buffer, length)) { @@ -1026,7 +1026,7 @@ enumAlgNames(AlgorithmicRange *range, /* increment the indexes in lexical order bound by the factors */ i=count; for (;;) { - idx=(uint16_t)(indexes[--i]+1); + idx = static_cast<uint16_t>(indexes[--i] + 1); if(idx<factors[i]) { /* skip one index and its element string */ indexes[i]=idx; @@ -1085,14 +1085,14 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth switch(range->type) { case 0: { /* name = prefix hex-digits */ - const char *s=(const char *)(range+1); + const char* s = reinterpret_cast<const char*>(range + 1); char c; uint16_t i, count; /* compare prefix */ while((c=*s++)!=0) { - if((char)c!=*otherName++) { + if (c != *otherName++) { return 0xffff; } } @@ -1112,7 +1112,7 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth } /* does it fit into the range? */ - if(*otherName==0 && range->start<=(uint32_t)code && (uint32_t)code<=range->end) { + if (*otherName == 0 && range->start <= static_cast<uint32_t>(code) && static_cast<uint32_t>(code) <= range->end) { return code; } break; @@ -1121,9 +1121,9 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth char buffer[64]; uint16_t indexes[8]; const char *elementBases[8], *elements[8]; - const uint16_t *factors=(const uint16_t *)(range+1); + const uint16_t* factors = reinterpret_cast<const uint16_t*>(range + 1); uint16_t count=range->variant; - const char *s=(const char *)(factors+count), *t; + const char *s = reinterpret_cast<const char*>(factors + count), *t; UChar32 start, limit; uint16_t i, idx; @@ -1133,13 +1133,13 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth /* compare prefix */ while((c=*s++)!=0) { - if((char)c!=*otherName++) { + if (c != *otherName++) { return 0xffff; } } - start=(UChar32)range->start; - limit=(UChar32)(range->end+1); + start = static_cast<UChar32>(range->start); + limit = static_cast<UChar32>(range->end + 1); /* initialize the suffix elements for enumeration; indexes should all be set to 0 */ writeFactorSuffix(factors, count, s, 0, @@ -1155,7 +1155,7 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth /* increment the indexes in lexical order bound by the factors */ i=count; for (;;) { - idx=(uint16_t)(indexes[--i]+1); + idx = static_cast<uint16_t>(indexes[--i] + 1); if(idx<factors[i]) { /* skip one index and its element string */ indexes[i]=idx; @@ -1220,27 +1220,27 @@ calcAlgNameSetsLengths(int32_t maxNameLength) { int32_t length; /* enumerate algorithmic ranges */ - p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); + p = reinterpret_cast<uint32_t*>(reinterpret_cast<uint8_t*>(uCharNames) + uCharNames->algNamesOffset); rangeCount=*p; - range=(AlgorithmicRange *)(p+1); + range = reinterpret_cast<AlgorithmicRange*>(p + 1); while(rangeCount>0) { switch(range->type) { case 0: /* name = prefix + (range->variant times) hex-digits */ /* prefix */ - length=calcStringSetLength(gNameSet, (const char *)(range+1))+range->variant; + length = calcStringSetLength(gNameSet, reinterpret_cast<const char*>(range + 1)) + range->variant; if(length>maxNameLength) { maxNameLength=length; } break; case 1: { /* name = prefix factorized-elements */ - const uint16_t *factors=(const uint16_t *)(range+1); + const uint16_t* factors = reinterpret_cast<const uint16_t*>(range + 1); const char *s; int32_t i, count=range->variant, factor, factorLength, maxFactorLength; /* prefix length */ - s=(const char *)(factors+count); + s = reinterpret_cast<const char*>(factors + count); length=calcStringSetLength(gNameSet, s); s+=length+1; /* start of factor suffixes */ @@ -1267,7 +1267,7 @@ calcAlgNameSetsLengths(int32_t maxNameLength) { break; } - range=(AlgorithmicRange *)((uint8_t *)range+range->size); + range = reinterpret_cast<AlgorithmicRange*>(reinterpret_cast<uint8_t*>(range) + range->size); --rangeCount; } return maxNameLength; @@ -1301,19 +1301,19 @@ calcNameSetLength(const uint16_t *tokens, uint16_t tokenCount, const uint8_t *to int32_t length=0, tokenLength; uint16_t c, token; - while(line!=lineLimit && (c=*line++)!=(uint8_t)';') { + while (line != lineLimit && (c = *line++) != static_cast<uint8_t>(';')) { if(c>=tokenCount) { /* implicit letter */ SET_ADD(set, c); ++length; } else { token=tokens[c]; - if(token==(uint16_t)(-2)) { + if (token == static_cast<uint16_t>(-2)) { /* this is a lead byte for a double-byte token */ c=c<<8|*line++; token=tokens[c]; } - if(token==(uint16_t)(-1)) { + if (token == static_cast<uint16_t>(-1)) { /* explicit letter */ SET_ADD(set, c); ++length; @@ -1323,11 +1323,11 @@ calcNameSetLength(const uint16_t *tokens, uint16_t tokenCount, const uint8_t *to /* use cached token length */ tokenLength=tokenLengths[c]; if(tokenLength==0) { - tokenLength=calcStringSetLength(set, (const char *)tokenStrings+token); - tokenLengths[c]=(int8_t)tokenLength; + tokenLength = calcStringSetLength(set, reinterpret_cast<const char*>(tokenStrings) + token); + tokenLengths[c] = static_cast<int8_t>(tokenLength); } } else { - tokenLength=calcStringSetLength(set, (const char *)tokenStrings+token); + tokenLength = calcStringSetLength(set, reinterpret_cast<const char*>(tokenStrings) + token); } length+=tokenLength; } @@ -1342,9 +1342,9 @@ static void calcGroupNameSetsLengths(int32_t maxNameLength) { uint16_t offsets[LINES_PER_GROUP+2], lengths[LINES_PER_GROUP+2]; - uint16_t *tokens=(uint16_t *)uCharNames+8; + uint16_t* tokens = reinterpret_cast<uint16_t*>(uCharNames) + 8; uint16_t tokenCount=*tokens++; - uint8_t *tokenStrings=(uint8_t *)uCharNames+uCharNames->tokenStringOffset; + uint8_t* tokenStrings = reinterpret_cast<uint8_t*>(uCharNames) + uCharNames->tokenStringOffset; int8_t *tokenLengths; @@ -1353,7 +1353,7 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { int32_t groupCount, lineNumber, length; - tokenLengths=(int8_t *)uprv_malloc(tokenCount); + tokenLengths = static_cast<int8_t*>(uprv_malloc(tokenCount)); if(tokenLengths!=nullptr) { uprv_memset(tokenLengths, 0, tokenCount); } @@ -1363,7 +1363,7 @@ calcGroupNameSetsLengths(int32_t maxNameLength) { /* enumerate all groups */ while(groupCount>0) { - s=(uint8_t *)uCharNames+uCharNames->groupStringOffset+GET_GROUP_OFFSET(group); + s = reinterpret_cast<uint8_t*>(uCharNames) + uCharNames->groupStringOffset + GET_GROUP_OFFSET(group); s=expandGroupLengths(s, offsets, lengths); /* enumerate all lines in each group */ @@ -1424,7 +1424,7 @@ calcNameSetsLengths(UErrorCode *pErrorCode) { } /* set hex digits, used in various names, and <>-, used in extended names */ - for(i=0; i<(int32_t)sizeof(extChars)-1; ++i) { + for (i = 0; i < static_cast<int32_t>(sizeof(extChars)) - 1; ++i) { SET_ADD(gNameSet, extChars[i]); } @@ -1732,7 +1732,7 @@ charSetToUSet(uint32_t cset[8], const USetAdder *sa) { length=0; for(i=0; i<256; ++i) { if(SET_CONTAINS(cset, i)) { - cs[length++]=(char)i; + cs[length++] = static_cast<char>(i); } } @@ -1785,7 +1785,7 @@ makeTokenMap(const UDataSwapper *ds, if(ds->inCharset==ds->outCharset) { /* Same charset family: identity permutation */ for(i=0; i<256; ++i) { - map[i]=(uint8_t)i; + map[i] = static_cast<uint8_t>(i); } } else { uprv_memset(map, 0, 256); @@ -1799,7 +1799,7 @@ makeTokenMap(const UDataSwapper *ds, for(i=1; i<tokenCount; ++i) { if(tokens[i]==-1) { /* convert the direct byte character */ - c1=(uint8_t)i; + c1 = static_cast<uint8_t>(i); ds->swapInvChars(ds, &c1, 1, &c2, pErrorCode); if(U_FAILURE(*pErrorCode)) { udata_printError(ds, "unames/makeTokenMap() finds variant character 0x%02x used (input charset family %d)\n", @@ -1821,7 +1821,7 @@ makeTokenMap(const UDataSwapper *ds, while(usedOutChar[j]) { ++j; } - map[i]=(uint8_t)j++; + map[i] = static_cast<uint8_t>(j++); } } diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 1b10e6ef11656d..088592b873e596 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -103,13 +103,13 @@ U_NAMESPACE_BEGIN * and in the sample program icu/source/samples/break/break.cpp * */ -class U_COMMON_API BreakIterator : public UObject { +class U_COMMON_API_CLASS BreakIterator : public UObject { public: /** * destructor * @stable ICU 2.0 */ - virtual ~BreakIterator(); + U_COMMON_API virtual ~BreakIterator(); /** * Return true if another object is semantically equal to this @@ -124,7 +124,7 @@ class U_COMMON_API BreakIterator : public UObject { * object, and styles are not considered. * @stable ICU 2.0 */ - virtual bool operator==(const BreakIterator&) const = 0; + U_COMMON_API virtual bool operator==(const BreakIterator&) const = 0; /** * Returns the complement of the result of operator== @@ -132,28 +132,27 @@ class U_COMMON_API BreakIterator : public UObject { * @return the complement of the result of operator== * @stable ICU 2.0 */ - bool operator!=(const BreakIterator& rhs) const { return !operator==(rhs); } + U_COMMON_API bool operator!=(const BreakIterator& rhs) const { return !operator==(rhs); } /** * Return a polymorphic copy of this object. This is an abstract * method which subclasses implement. * @stable ICU 2.0 */ - virtual BreakIterator* clone() const = 0; + U_COMMON_API virtual BreakIterator* clone() const = 0; /** * Return a polymorphic class ID for this object. Different subclasses * will return distinct unequal values. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + U_COMMON_API virtual UClassID getDynamicClassID() const override = 0; /** * Return a CharacterIterator over the text being analyzed. * @stable ICU 2.0 */ - virtual CharacterIterator& getText(void) const = 0; - + U_COMMON_API virtual CharacterIterator& getText() const = 0; /** * Get a UText for the text being analyzed. @@ -169,7 +168,7 @@ class U_COMMON_API BreakIterator : public UObject { * UText was provided, it will always be returned. * @stable ICU 3.4 */ - virtual UText *getUText(UText *fillIn, UErrorCode &status) const = 0; + U_COMMON_API virtual UText* getUText(UText* fillIn, UErrorCode& status) const = 0; /** * Change the text over which this operates. The text boundary is @@ -182,7 +181,7 @@ class U_COMMON_API BreakIterator : public UObject { * @param text The UnicodeString used to change the text. * @stable ICU 2.0 */ - virtual void setText(const UnicodeString &text) = 0; + U_COMMON_API virtual void setText(const UnicodeString& text) = 0; /** * Reset the break iterator to operate over the text represented by @@ -202,7 +201,7 @@ class U_COMMON_API BreakIterator : public UObject { * @param status receives any error codes. * @stable ICU 3.4 */ - virtual void setText(UText *text, UErrorCode &status) = 0; + U_COMMON_API virtual void setText(UText* text, UErrorCode& status) = 0; /** * Change the text over which this operates. The text boundary is @@ -212,7 +211,7 @@ class U_COMMON_API BreakIterator : public UObject { * @param it The CharacterIterator used to change the text. * @stable ICU 2.0 */ - virtual void adoptText(CharacterIterator* it) = 0; + U_COMMON_API virtual void adoptText(CharacterIterator* it) = 0; enum { /** @@ -220,7 +219,7 @@ class U_COMMON_API BreakIterator : public UObject { * boundaries have been returned. * @stable ICU 2.0 */ - DONE = (int32_t)-1 + DONE = static_cast<int32_t>(-1) }; /** @@ -228,14 +227,14 @@ class U_COMMON_API BreakIterator : public UObject { * @return The offset of the beginning of the text, zero. * @stable ICU 2.0 */ - virtual int32_t first(void) = 0; + U_COMMON_API virtual int32_t first() = 0; /** * Set the iterator position to the index immediately BEYOND the last character in the text being scanned. * @return The index immediately BEYOND the last character in the text being scanned. * @stable ICU 2.0 */ - virtual int32_t last(void) = 0; + U_COMMON_API virtual int32_t last() = 0; /** * Set the iterator position to the boundary preceding the current boundary. @@ -243,7 +242,7 @@ class U_COMMON_API BreakIterator : public UObject { * boundaries have been returned. * @stable ICU 2.0 */ - virtual int32_t previous(void) = 0; + U_COMMON_API virtual int32_t previous() = 0; /** * Advance the iterator to the boundary following the current boundary. @@ -251,14 +250,14 @@ class U_COMMON_API BreakIterator : public UObject { * boundaries have been returned. * @stable ICU 2.0 */ - virtual int32_t next(void) = 0; + U_COMMON_API virtual int32_t next() = 0; /** * Return character index of the current iterator position within the text. * @return The boundary most recently returned. * @stable ICU 2.0 */ - virtual int32_t current(void) const = 0; + U_COMMON_API virtual int32_t current() const = 0; /** * Advance the iterator to the first boundary following the specified offset. @@ -268,7 +267,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return The first boundary after the specified offset. * @stable ICU 2.0 */ - virtual int32_t following(int32_t offset) = 0; + U_COMMON_API virtual int32_t following(int32_t offset) = 0; /** * Set the iterator position to the first boundary preceding the specified offset. @@ -278,7 +277,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return The first boundary before the specified offset. * @stable ICU 2.0 */ - virtual int32_t preceding(int32_t offset) = 0; + U_COMMON_API virtual int32_t preceding(int32_t offset) = 0; /** * Return true if the specified position is a boundary position. @@ -288,7 +287,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return True if "offset" is a boundary position. * @stable ICU 2.0 */ - virtual UBool isBoundary(int32_t offset) = 0; + U_COMMON_API virtual UBool isBoundary(int32_t offset) = 0; /** * Set the iterator position to the nth boundary from the current boundary @@ -299,9 +298,9 @@ class U_COMMON_API BreakIterator : public UObject { * DONE if there are fewer than |n| boundaries in the specified direction. * @stable ICU 2.0 */ - virtual int32_t next(int32_t n) = 0; + U_COMMON_API virtual int32_t next(int32_t n) = 0; - /** + /** * For RuleBasedBreakIterators, return the status tag from the break rule * that determined the boundary at the current iteration position. * <p> @@ -314,7 +313,7 @@ class U_COMMON_API BreakIterator : public UObject { * @see UWordBreak * @stable ICU 52 */ - virtual int32_t getRuleStatus() const; + U_COMMON_API virtual int32_t getRuleStatus() const; /** * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s) @@ -344,7 +343,9 @@ class U_COMMON_API BreakIterator : public UObject { * @see getRuleStatus * @stable ICU 52 */ - virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status); + U_COMMON_API virtual int32_t getRuleStatusVec(int32_t* fillInVec, + int32_t capacity, + UErrorCode& status); /** * Create BreakIterator for word-breaks using the given locale. @@ -365,7 +366,7 @@ class U_COMMON_API BreakIterator : public UObject { * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* U_EXPORT2 + U_COMMON_API static BreakIterator* U_EXPORT2 createWordInstance(const Locale& where, UErrorCode& status); /** @@ -389,7 +390,7 @@ class U_COMMON_API BreakIterator : public UObject { * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* U_EXPORT2 + U_COMMON_API static BreakIterator* U_EXPORT2 createLineInstance(const Locale& where, UErrorCode& status); /** @@ -411,7 +412,7 @@ class U_COMMON_API BreakIterator : public UObject { * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* U_EXPORT2 + U_COMMON_API static BreakIterator* U_EXPORT2 createCharacterInstance(const Locale& where, UErrorCode& status); /** @@ -432,7 +433,7 @@ class U_COMMON_API BreakIterator : public UObject { * The caller owns the returned object and is responsible for deleting it. * @stable ICU 2.0 */ - static BreakIterator* U_EXPORT2 + U_COMMON_API static BreakIterator* U_EXPORT2 createSentenceInstance(const Locale& where, UErrorCode& status); #ifndef U_HIDE_DEPRECATED_API @@ -458,7 +459,7 @@ class U_COMMON_API BreakIterator : public UObject { * The caller owns the returned object and is responsible for deleting it. * @deprecated ICU 64 Use createWordInstance instead. */ - static BreakIterator* U_EXPORT2 + U_COMMON_API static BreakIterator* U_EXPORT2 createTitleInstance(const Locale& where, UErrorCode& status); #endif /* U_HIDE_DEPRECATED_API */ @@ -471,7 +472,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return available locales * @stable ICU 2.0 */ - static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); + U_COMMON_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Get name of the object for the desired Locale, in the desired language. @@ -482,9 +483,9 @@ class U_COMMON_API BreakIterator : public UObject { * @return user-displayable name * @stable ICU 2.0 */ - static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, - const Locale& displayLocale, - UnicodeString& name); + U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, + const Locale& displayLocale, + UnicodeString& name); /** * Get name of the object for the desired Locale, in the language of the @@ -494,8 +495,8 @@ class U_COMMON_API BreakIterator : public UObject { * @return user-displayable name * @stable ICU 2.0 */ - static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, - UnicodeString& name); + U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, + UnicodeString& name); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -517,9 +518,9 @@ class U_COMMON_API BreakIterator : public UObject { * * @deprecated ICU 52. Use clone() instead. */ - virtual BreakIterator * createBufferClone(void *stackBuffer, - int32_t &BufferSize, - UErrorCode &status) = 0; + U_COMMON_API virtual BreakIterator* createBufferClone(void* stackBuffer, + int32_t& BufferSize, + UErrorCode& status) = 0; #endif // U_FORCE_HIDE_DEPRECATED_API #ifndef U_HIDE_DEPRECATED_API @@ -530,7 +531,7 @@ class U_COMMON_API BreakIterator : public UObject { * must be closed by an explicit call to the destructor (not delete). * @deprecated ICU 52. Always delete the BreakIterator. */ - inline UBool isBufferClone(void); + U_COMMON_API inline UBool isBufferClone(); #endif /* U_HIDE_DEPRECATED_API */ @@ -550,10 +551,10 @@ class U_COMMON_API BreakIterator : public UObject { * @return a registry key that can be used to unregister this instance * @stable ICU 2.4 */ - static URegistryKey U_EXPORT2 registerInstance(BreakIterator* toAdopt, - const Locale& locale, - UBreakIteratorType kind, - UErrorCode& status); + U_COMMON_API static URegistryKey U_EXPORT2 registerInstance(BreakIterator* toAdopt, + const Locale& locale, + UBreakIteratorType kind, + UErrorCode& status); /** * Unregister a previously-registered BreakIterator using the key returned from the @@ -567,7 +568,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return true if the iterator for the key was successfully unregistered * @stable ICU 2.4 */ - static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); + U_COMMON_API static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status); /** * Return a StringEnumeration over the locales available at the time of the call, @@ -575,7 +576,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return a StringEnumeration over the locales available at the time of the call * @stable ICU 2.4 */ - static StringEnumeration* U_EXPORT2 getAvailableLocales(void); + U_COMMON_API static StringEnumeration* U_EXPORT2 getAvailableLocales(); #endif /** @@ -583,7 +584,7 @@ class U_COMMON_API BreakIterator : public UObject { * actual locale. * @stable ICU 2.8 */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + U_COMMON_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; #ifndef U_HIDE_INTERNAL_API /** Get the locale for this break iterator object. You can choose between valid and actual locale. @@ -592,7 +593,7 @@ class U_COMMON_API BreakIterator : public UObject { * @return the locale * @internal */ - const char *getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + U_COMMON_API const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; #endif /* U_HIDE_INTERNAL_API */ /** @@ -620,7 +621,7 @@ class U_COMMON_API BreakIterator : public UObject { * * @stable ICU 49 */ - virtual BreakIterator &refreshInputText(UText *input, UErrorCode &status) = 0; + U_COMMON_API virtual BreakIterator& refreshInputText(UText* input, UErrorCode& status) = 0; private: static BreakIterator* buildInstance(const Locale& loc, const char *type, UErrorCode& status); @@ -634,22 +635,21 @@ class U_COMMON_API BreakIterator : public UObject { // Do not enclose protected default/copy constructors with #ifndef U_HIDE_INTERNAL_API // or else the compiler will create a public ones. /** @internal */ - BreakIterator(); + U_COMMON_API BreakIterator(); /** @internal */ - BreakIterator (const BreakIterator &other); + U_COMMON_API BreakIterator(const BreakIterator& other); #ifndef U_HIDE_INTERNAL_API /** @internal */ - BreakIterator (const Locale& valid, const Locale &actual); + U_COMMON_API BreakIterator(const Locale& valid, const Locale& actual); /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */ - BreakIterator &operator = (const BreakIterator &other); + U_COMMON_API BreakIterator& operator=(const BreakIterator& other); #endif /* U_HIDE_INTERNAL_API */ private: - /** @internal (private) */ - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; - char requestLocale[ULOC_FULLNAME_CAPACITY]; + Locale actualLocale; + Locale validLocale; + Locale requestLocale; }; #ifndef U_HIDE_DEPRECATED_API diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index 997746e428040f..224899b9567dc4 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -41,6 +41,8 @@ #if U_SHOW_CPLUSPLUS_API +#include <type_traits> + #include "unicode/uobject.h" #include "unicode/std_string.h" @@ -258,13 +260,36 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete; }; +namespace prv { +/** @internal */ +template<typename StringClass, typename = void> +struct value_type_or_char { + /** @internal */ + using type = char; +}; +/** @internal */ +template<typename StringClass> +struct value_type_or_char<StringClass, std::void_t<typename StringClass::value_type>> { + /** @internal */ + using type = typename StringClass::value_type; +}; +/** @internal */ +template<typename StringClass> +using value_type_or_char_t = typename value_type_or_char<StringClass>::type; +} + /** * Implementation of ByteSink that writes to a "string". - * The StringClass is usually instantiated with a std::string. + * The StringClass is usually instantiated with a std::string or a std::u8string. + * StringClass must have public member functions reserve(integer type), capacity(), length(), and + * append(value type, integer type) with the same semantics as those of std::basic_string, and must + * have an 8-bit value type. If the value type is not char, it must be a public member type + * StringClass::value_type. * @stable ICU 4.2 */ template<typename StringClass> class StringByteSink : public ByteSink { + using Unit = typename prv::value_type_or_char_t<StringClass>; public: /** * Constructs a ByteSink that will append bytes to the dest string. @@ -281,7 +306,7 @@ class StringByteSink : public ByteSink { */ StringByteSink(StringClass* dest, int32_t initialAppendCapacity) : dest_(dest) { if (initialAppendCapacity > 0 && - (uint32_t)initialAppendCapacity > (dest->capacity() - dest->length())) { + static_cast<uint32_t>(initialAppendCapacity) > dest->capacity() - dest->length()) { dest->reserve(dest->length() + initialAppendCapacity); } } @@ -291,7 +316,13 @@ class StringByteSink : public ByteSink { * @param n the number of bytes; must be non-negative * @stable ICU 4.2 */ - virtual void Append(const char* data, int32_t n) override { dest_->append(data, n); } + virtual void Append(const char* data, int32_t n) override { + if constexpr (std::is_same_v<Unit, char>) { + dest_->append(data, n); + } else { + dest_->append(reinterpret_cast<const Unit*>(data), n); + } + } private: StringClass* dest_; diff --git a/deps/icu-small/source/common/unicode/bytestrie.h b/deps/icu-small/source/common/unicode/bytestrie.h index 1719a6bb83edc9..c07dfada941ec2 100644 --- a/deps/icu-small/source/common/unicode/bytestrie.h +++ b/deps/icu-small/source/common/unicode/bytestrie.h @@ -109,7 +109,7 @@ class U_COMMON_API BytesTrie : public UMemory { */ uint64_t getState64() const { return (static_cast<uint64_t>(remainingMatchLength_ + 2) << kState64RemainingShift) | - (uint64_t)(pos_ - bytes_); + static_cast<uint64_t>(pos_ - bytes_); } /** @@ -439,7 +439,7 @@ class U_COMMON_API BytesTrie : public UMemory { } static inline UStringTrieResult valueResult(int32_t node) { - return (UStringTrieResult)(USTRINGTRIE_INTERMEDIATE_VALUE-(node&kValueIsFinal)); + return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node & kValueIsFinal)); } // Handles a branch node for both next(byte) and next(string). diff --git a/deps/icu-small/source/common/unicode/bytestriebuilder.h b/deps/icu-small/source/common/unicode/bytestriebuilder.h index ec9c625473d4f5..dc8783ec7f2979 100644 --- a/deps/icu-small/source/common/unicode/bytestriebuilder.h +++ b/deps/icu-small/source/common/unicode/bytestriebuilder.h @@ -150,9 +150,6 @@ class U_COMMON_API BytesTrieBuilder : public StringTrieBuilder { virtual int32_t getMinLinearMatch() const override { return BytesTrie::kMinLinearMatch; } virtual int32_t getMaxLinearMatchLength() const override { return BytesTrie::kMaxLinearMatchLength; } - /** - * @internal (private) - */ class BTLinearMatchNode : public LinearMatchNode { public: BTLinearMatchNode(const char *units, int32_t len, Node *nextNode); diff --git a/deps/icu-small/source/common/unicode/caniter.h b/deps/icu-small/source/common/unicode/caniter.h index 035bd0e64eb924..aa098edcb09a67 100644 --- a/deps/icu-small/source/common/unicode/caniter.h +++ b/deps/icu-small/source/common/unicode/caniter.h @@ -128,9 +128,10 @@ class U_COMMON_API CanonicalIterator final : public UObject { * @param skipZeros determine if skip zeros * @param result the results in a set. * @param status Fill-in parameter which receives the status of this operation. + * @param depth depth of the call. * @internal */ - static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status); + static void U_EXPORT2 permute(UnicodeString &source, UBool skipZeros, Hashtable *result, UErrorCode &status, int32_t depth=0); #endif /* U_HIDE_INTERNAL_API */ /** @@ -155,13 +156,11 @@ class U_COMMON_API CanonicalIterator final : public UObject { /** * Copy constructor. Private for now. - * @internal (private) */ CanonicalIterator(const CanonicalIterator& other) = delete; /** * Assignment operator. Private for now. - * @internal (private) */ CanonicalIterator& operator=(const CanonicalIterator& other) = delete; @@ -182,8 +181,8 @@ class U_COMMON_API CanonicalIterator final : public UObject { // transient fields UnicodeString buffer; - const Normalizer2 &nfd; - const Normalizer2Impl &nfcImpl; + const Normalizer2 *nfd; + const Normalizer2Impl *nfcImpl; // we have a segment, in NFD. Find all the strings that are canonically equivalent to it. UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) diff --git a/deps/icu-small/source/common/unicode/char16ptr.h b/deps/icu-small/source/common/unicode/char16ptr.h index de8182c7ada4c5..049de9efee810f 100644 --- a/deps/icu-small/source/common/unicode/char16ptr.h +++ b/deps/icu-small/source/common/unicode/char16ptr.h @@ -9,9 +9,13 @@ #include "unicode/utypes.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #include <cstddef> +#include <string_view> +#include <type_traits> + +#endif /** * \file @@ -20,8 +24,6 @@ * Also conversion functions from char16_t * to UChar * and OldUChar *. */ -U_NAMESPACE_BEGIN - /** * \def U_ALIASING_BARRIER * Barrier for pointer anti-aliasing optimizations even across function boundaries. @@ -35,6 +37,11 @@ U_NAMESPACE_BEGIN # define U_ALIASING_BARRIER(ptr) #endif +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + /** * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. * @stable ICU 59 @@ -250,6 +257,60 @@ const char16_t *ConstChar16Ptr::get() const { return u_.cp; } #endif /// \endcond +U_NAMESPACE_END + +#endif // U_SHOW_CPLUSPLUS_API + +// Usable in header-only definitions +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +namespace U_ICU_NAMESPACE_OR_INTERNAL { + +#ifndef U_FORCE_HIDE_INTERNAL_API +/** @internal */ +template<typename T, typename = std::enable_if_t<std::is_same_v<T, UChar>>> +inline const char16_t *uprv_char16PtrFromUChar(const T *p) { + if constexpr (std::is_same_v<UChar, char16_t>) { + return p; + } else { +#if U_SHOW_CPLUSPLUS_API + return ConstChar16Ptr(p).get(); +#else +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast<const char16_t *>(p); +#endif + } +} +#if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) +/** @internal */ +inline const char16_t *uprv_char16PtrFromUint16(const uint16_t *p) { +#if U_SHOW_CPLUSPLUS_API + return ConstChar16Ptr(p).get(); +#else +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast<const char16_t *>(p); +#endif +} +#endif +#if U_SIZEOF_WCHAR_T==2 +/** @internal */ +inline const char16_t *uprv_char16PtrFromWchar(const wchar_t *p) { +#if U_SHOW_CPLUSPLUS_API + return ConstChar16Ptr(p).get(); +#else +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast<const char16_t *>(p); +#endif +} +#endif +#endif + /** * Converts from const char16_t * to const UChar *. * Includes an aliasing barrier if available. @@ -306,8 +367,87 @@ inline OldUChar *toOldUCharPtr(char16_t *p) { return reinterpret_cast<OldUChar *>(p); } +} // U_ICU_NAMESPACE_OR_INTERNAL + +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +// ICU DLL-exported +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + +#ifndef U_FORCE_HIDE_INTERNAL_API +/** + * Is T convertible to a std::u16string_view or some other 16-bit string view? + * @internal + */ +template<typename T> +constexpr bool ConvertibleToU16StringView = + std::is_convertible_v<T, std::u16string_view> +#if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) + || std::is_convertible_v<T, std::basic_string_view<uint16_t>> +#endif +#if U_SIZEOF_WCHAR_T==2 + || std::is_convertible_v<T, std::wstring_view> +#endif + ; + +namespace internal { +/** + * Pass-through overload. + * @internal + */ +inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; } + +#if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) +/** + * Basically undefined behavior but sometimes necessary conversion + * from std::basic_string_view<uint16_t> to std::u16string_view. + * @internal + */ +inline std::u16string_view toU16StringView(std::basic_string_view<uint16_t> sv) { + return { ConstChar16Ptr(sv.data()), sv.length() }; +} +#endif + +#if U_SIZEOF_WCHAR_T==2 +/** + * Basically undefined behavior but sometimes necessary conversion + * from std::wstring_view to std::u16string_view. + * @internal + */ +inline std::u16string_view toU16StringView(std::wstring_view sv) { + return { ConstChar16Ptr(sv.data()), sv.length() }; +} +#endif + +/** + * Pass-through overload. + * @internal + */ +template <typename T, + typename = typename std::enable_if_t<!std::is_pointer_v<std::remove_reference_t<T>>>> +inline std::u16string_view toU16StringViewNullable(const T& text) { + return toU16StringView(text); +} + +/** + * In case of nullptr, return an empty view. + * @internal + */ +template <typename T, + typename = typename std::enable_if_t<std::is_pointer_v<std::remove_reference_t<T>>>, + typename = void> +inline std::u16string_view toU16StringViewNullable(const T& text) { + if (text == nullptr) return {}; // For backward compatibility. + return toU16StringView(text); +} + +} // internal +#endif // U_FORCE_HIDE_INTERNAL_API + U_NAMESPACE_END -#endif /* U_SHOW_CPLUSPLUS_API */ +#endif // U_SHOW_CPLUSPLUS_API #endif // __CHAR16PTR_H__ diff --git a/deps/icu-small/source/common/unicode/chariter.h b/deps/icu-small/source/common/unicode/chariter.h index 45f4d984c74d35..411825677fd5e7 100644 --- a/deps/icu-small/source/common/unicode/chariter.h +++ b/deps/icu-small/source/common/unicode/chariter.h @@ -133,8 +133,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the hash code. * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const = 0; - + virtual int32_t hashCode() const = 0; + /** * Returns a UClassID for this ForwardCharacterIterator ("poor man's * RTTI").<P> Despite the fact that this function is public, @@ -142,8 +142,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return a UClassID for this ForwardCharacterIterator * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; - + virtual UClassID getDynamicClassID() const override = 0; + /** * Gets the current code unit for returning and advances to the next code unit * in the iteration range @@ -152,8 +152,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t nextPostInc(void) = 0; - + virtual char16_t nextPostInc() = 0; + /** * Gets the current code point for returning and advances to the next code point * in the iteration range @@ -162,8 +162,8 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the current code point. * @stable ICU 2.0 */ - virtual UChar32 next32PostInc(void) = 0; - + virtual UChar32 next32PostInc() = 0; + /** * Returns false if there are no more code units or code points * at or after the current position in the iteration range. @@ -389,7 +389,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t first(void) = 0; + virtual char16_t first() = 0; /** * Sets the iterator to refer to the first code unit in its @@ -399,7 +399,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t firstPostInc(void); + virtual char16_t firstPostInc(); /** * Sets the iterator to refer to the first code point in its @@ -410,7 +410,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32(void) = 0; + virtual UChar32 first32() = 0; /** * Sets the iterator to refer to the first code point in its @@ -420,7 +420,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32PostInc(void); + virtual UChar32 first32PostInc(); /** * Sets the iterator to refer to the first code unit or code point in its @@ -438,8 +438,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the last code unit. * @stable ICU 2.0 */ - virtual char16_t last(void) = 0; - + virtual char16_t last() = 0; + /** * Sets the iterator to refer to the last code point in its * iteration range, and returns that code unit. @@ -447,7 +447,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the last code point. * @stable ICU 2.0 */ - virtual UChar32 last32(void) = 0; + virtual UChar32 last32() = 0; /** * Sets the iterator to the end of its iteration range, just behind @@ -486,15 +486,15 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t current(void) const = 0; - + virtual char16_t current() const = 0; + /** * Returns the code point the iterator currently refers to. * @return the current code point. * @stable ICU 2.0 */ - virtual UChar32 current32(void) const = 0; - + virtual UChar32 current32() const = 0; + /** * Advances to the next code unit in the iteration range * (toward endIndex()), and returns that code unit. If there are @@ -502,8 +502,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the next code unit. * @stable ICU 2.0 */ - virtual char16_t next(void) = 0; - + virtual char16_t next() = 0; + /** * Advances to the next code point in the iteration range * (toward endIndex()), and returns that code point. If there are @@ -514,8 +514,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the next code point. * @stable ICU 2.0 */ - virtual UChar32 next32(void) = 0; - + virtual UChar32 next32() = 0; + /** * Advances to the previous code unit in the iteration range * (toward startIndex()), and returns that code unit. If there are @@ -523,7 +523,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the previous code unit. * @stable ICU 2.0 */ - virtual char16_t previous(void) = 0; + virtual char16_t previous() = 0; /** * Advances to the previous code point in the iteration range @@ -532,7 +532,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the previous code point. * @stable ICU 2.0 */ - virtual UChar32 previous32(void) = 0; + virtual UChar32 previous32() = 0; /** * Returns false if there are no more code units or code points @@ -555,8 +555,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * object of the character returned by first(). * @stable ICU 2.0 */ - inline int32_t startIndex(void) const; - + inline int32_t startIndex() const; + /** * Returns the numeric index in the underlying text-storage * object of the position immediately BEYOND the character @@ -566,8 +566,8 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * returned by last(). * @stable ICU 2.0 */ - inline int32_t endIndex(void) const; - + inline int32_t endIndex() const; + /** * Returns the numeric index in the underlying text-storage * object of the character the iterator currently refers to @@ -576,7 +576,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * the character the iterator currently refers to * @stable ICU 2.0 */ - inline int32_t getIndex(void) const; + inline int32_t getIndex() const; /** * Returns the length of the entire text in the underlying @@ -708,22 +708,22 @@ CharacterIterator::setToEnd() { } inline int32_t -CharacterIterator::startIndex(void) const { +CharacterIterator::startIndex() const { return begin; } inline int32_t -CharacterIterator::endIndex(void) const { +CharacterIterator::endIndex() const { return end; } inline int32_t -CharacterIterator::getIndex(void) const { +CharacterIterator::getIndex() const { return pos; } inline int32_t -CharacterIterator::getLength(void) const { +CharacterIterator::getLength() const { return textLength; } diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 581b2e186d5ad4..0ecbfe8378fc4b 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -75,7 +75,8 @@ * <tr> * <td>Strings and Character Iteration</td> * <td>ustring.h, utf8.h, utf16.h, icu::StringPiece, UText, UCharIterator, icu::ByteSink</td> - * <td>icu::UnicodeString, icu::CharacterIterator, icu::Appendable, icu::StringPiece,icu::ByteSink</td> + * <td>icu::UnicodeString, utfiterator.h (ICU 78+), icu::CharacterIterator, icu::Appendable,<br> + * icu::StringPiece, icu::ByteSink</td> * </tr> * <tr> * <td>Unicode Character<br/>Properties and Names</td> @@ -138,11 +139,21 @@ * <td>icu::DateFormat</td> * </tr> * <tr> + * <td>Relative Date and Time Formatting</td> + * <td>ureldatefmt.h</td> + * <td>icu::RelativeDateTimeFormatter</td> + * </tr> + * <tr> * <td>Message Formatting</td> * <td>umsg.h</td> * <td>icu::MessageFormat</td> * </tr> * <tr> + * <td>Message Formatting 2<br/>(technology preview)</td> + * <td>(no C API)</td> + * <td>icu::message2::MessageFormatter</td> + * </tr> + * <tr> * <td>List Formatting</td> * <td>ulistformatter.h</td> * <td>icu::ListFormatter</td> @@ -150,7 +161,8 @@ * <tr> * <td>Number Formatting<br/>(includes currency and unit formatting)</td> * <td>unumberformatter.h, unum.h, usimplenumberformatter.h</td> - * <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)<br>icu::number::SimpleNumberFormatter (ICU 73+)</td> + * <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)<br> + * icu::number::SimpleNumberFormatter (ICU 73+)</td> * </tr> * <tr> * <td>Number Range Formatting<br />(includes currency and unit ranges)</td> diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index 8c172eb7a59acc..1fd0ba5deee92c 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -76,7 +76,7 @@ class U_COMMON_API DateInterval : public UObject { * @return The class ID for all objects of this class. * @stable ICU 4.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -89,9 +89,8 @@ class U_COMMON_API DateInterval : public UObject { * other classes have different class IDs. * @stable ICU 4.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; - /** * Copy constructor. * @stable ICU 4.0 diff --git a/deps/icu-small/source/common/unicode/edits.h b/deps/icu-small/source/common/unicode/edits.h index dda9d3ca759cad..bc3c9438222dff 100644 --- a/deps/icu-small/source/common/unicode/edits.h +++ b/deps/icu-small/source/common/unicode/edits.h @@ -508,7 +508,7 @@ class U_COMMON_API Edits final : public UMemory { Edits ©Array(const Edits &other); Edits &moveArray(Edits &src) noexcept; - void setLastUnit(int32_t last) { array[length - 1] = (uint16_t)last; } + void setLastUnit(int32_t last) { array[length - 1] = static_cast<uint16_t>(last); } int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } void append(int32_t r); diff --git a/deps/icu-small/source/common/unicode/idna.h b/deps/icu-small/source/common/unicode/idna.h index 1c57205bae2ef4..1e36fa771f06cc 100644 --- a/deps/icu-small/source/common/unicode/idna.h +++ b/deps/icu-small/source/common/unicode/idna.h @@ -70,6 +70,7 @@ class U_COMMON_API IDNA : public UObject { * The worker functions use transitional processing, including deviation mappings, * unless UIDNA_NONTRANSITIONAL_TO_ASCII or UIDNA_NONTRANSITIONAL_TO_UNICODE * is used in which case the deviation characters are passed through without change. + * <b>Unicode 15.1 UTS #46 deprecated transitional processing.</b> * * Disallowed characters are mapped to U+FFFD. * @@ -82,6 +83,8 @@ class U_COMMON_API IDNA : public UObject { * letters, digits, hyphen (LDH) and dot/full stop are disallowed and mapped to U+FFFD. * * @param options Bit set to modify the processing and error checking. + * These should include UIDNA_DEFAULT, or + * UIDNA_NONTRANSITIONAL_TO_ASCII | UIDNA_NONTRANSITIONAL_TO_UNICODE. * See option bit set values in uidna.h. * @param errorCode Standard ICU error code. Its input value must * pass the U_SUCCESS() test, or else the function returns diff --git a/deps/icu-small/source/common/unicode/localebuilder.h b/deps/icu-small/source/common/unicode/localebuilder.h index f708a7ed7c4cb3..a58edf8de6337d 100644 --- a/deps/icu-small/source/common/unicode/localebuilder.h +++ b/deps/icu-small/source/common/unicode/localebuilder.h @@ -18,7 +18,7 @@ */ U_NAMESPACE_BEGIN -class CharString; +class FixedString; /** * <code>LocaleBuilder</code> is used to build instances of <code>Locale</code> @@ -297,7 +297,7 @@ class U_COMMON_API LocaleBuilder : public UObject { char language_[9]; char script_[5]; char region_[4]; - CharString *variant_; // Pointer not object so we need not #include internal charstr.h. + FixedString *variant_; // Pointer not object so we need not #include internal fixedstring.h. icu::Locale *extensions_; // Pointer not object. Storage for all other fields. }; diff --git a/deps/icu-small/source/common/unicode/localematcher.h b/deps/icu-small/source/common/unicode/localematcher.h index 603daf7231dd1a..e16f1a31ca507a 100644 --- a/deps/icu-small/source/common/unicode/localematcher.h +++ b/deps/icu-small/source/common/unicode/localematcher.h @@ -11,6 +11,8 @@ #if U_SHOW_CPLUSPLUS_API +#include <optional> + #include "unicode/locid.h" #include "unicode/stringpiece.h" #include "unicode/uobject.h" @@ -133,10 +135,10 @@ U_NAMESPACE_BEGIN struct LSR; +class LikelySubtags; class LocaleDistance; class LocaleLsrIterator; class UVector; -class XLikelySubtags; /** * Immutable class that picks the best match between a user's desired locales and @@ -678,9 +680,9 @@ class U_COMMON_API LocaleMatcher : public UMemory { int32_t putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength, UErrorCode &errorCode); - int32_t getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, UErrorCode &errorCode) const; + std::optional<int32_t> getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remainingIter, UErrorCode &errorCode) const; - const XLikelySubtags &likelySubtags; + const LikelySubtags &likelySubtags; const LocaleDistance &localeDistance; int32_t thresholdDistance; int32_t demotionPerDesiredLocale; diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index b8be3d7942eacc..1803222d8d7af2 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -70,9 +70,7 @@ class LocalPointerBase { // No heap allocation. Use only on the stack. static void* U_EXPORT2 operator new(size_t) = delete; static void* U_EXPORT2 operator new[](size_t) = delete; -#if U_HAVE_PLACEMENT_NEW static void* U_EXPORT2 operator new(size_t, void*) = delete; -#endif /** * Constructor takes ownership. @@ -162,11 +160,11 @@ class LocalPointerBase { T *ptr; private: // No comparison operators with other LocalPointerBases. - bool operator==(const LocalPointerBase<T> &other); - bool operator!=(const LocalPointerBase<T> &other); + bool operator==(const LocalPointerBase<T> &other) = delete; + bool operator!=(const LocalPointerBase<T> &other) = delete; // No ownership sharing: No copy constructor, no assignment operator. - LocalPointerBase(const LocalPointerBase<T> &other); - void operator=(const LocalPointerBase<T> &other); + LocalPointerBase(const LocalPointerBase<T> &other) = delete; + void operator=(const LocalPointerBase<T> &other) = delete; }; /** @@ -548,46 +546,60 @@ class LocalArray : public LocalPointerBase<T> { * @stable ICU 4.4 */ #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase<Type> { \ - public: \ - using LocalPointerBase<Type>::operator*; \ - using LocalPointerBase<Type>::operator->; \ - explicit LocalPointerClassName(Type *p=nullptr) : LocalPointerBase<Type>(p) {} \ - LocalPointerClassName(LocalPointerClassName &&src) noexcept \ - : LocalPointerBase<Type>(src.ptr) { \ - src.ptr=nullptr; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - explicit LocalPointerClassName(std::unique_ptr<Type, decltype(&closeFunction)> &&p) \ - : LocalPointerBase<Type>(p.release()) {} \ - ~LocalPointerClassName() { if (ptr != nullptr) { closeFunction(ptr); } } \ - LocalPointerClassName &operator=(LocalPointerClassName &&src) noexcept { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - LocalPointerBase<Type>::ptr=src.ptr; \ - src.ptr=nullptr; \ - return *this; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - LocalPointerClassName &operator=(std::unique_ptr<Type, decltype(&closeFunction)> &&p) { \ - adoptInstead(p.release()); \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) noexcept { \ - Type *temp=LocalPointerBase<Type>::ptr; \ - LocalPointerBase<Type>::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) noexcept { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - ptr=p; \ - } \ - operator std::unique_ptr<Type, decltype(&closeFunction)> () && { \ - return std::unique_ptr<Type, decltype(&closeFunction)>(LocalPointerBase<Type>::orphan(), closeFunction); \ - } \ + using LocalPointerClassName = internal::LocalOpenPointer<Type, closeFunction> + +#ifndef U_IN_DOXYGEN +namespace internal { +/** + * Implementation, do not use directly: use U_DEFINE_LOCAL_OPEN_POINTER. + * + * @see U_DEFINE_LOCAL_OPEN_POINTER + * @internal + */ +template <typename Type, auto closeFunction> +class LocalOpenPointer : public LocalPointerBase<Type> { + using LocalPointerBase<Type>::ptr; +public: + using LocalPointerBase<Type>::operator*; + using LocalPointerBase<Type>::operator->; + explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {} + LocalOpenPointer(LocalOpenPointer &&src) noexcept + : LocalPointerBase<Type>(src.ptr) { + src.ptr=nullptr; + } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + explicit LocalOpenPointer(std::unique_ptr<Type, decltype(closeFunction)> &&p) + : LocalPointerBase<Type>(p.release()) {} + ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } } + LocalOpenPointer &operator=(LocalOpenPointer &&src) noexcept { + if (ptr != nullptr) { closeFunction(ptr); } + LocalPointerBase<Type>::ptr=src.ptr; + src.ptr=nullptr; + return *this; } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + LocalOpenPointer &operator=(std::unique_ptr<Type, decltype(closeFunction)> &&p) { + adoptInstead(p.release()); + return *this; + } + void swap(LocalOpenPointer &other) noexcept { + Type *temp=LocalPointerBase<Type>::ptr; + LocalPointerBase<Type>::ptr=other.ptr; + other.ptr=temp; + } + friend inline void swap(LocalOpenPointer &p1, LocalOpenPointer &p2) noexcept { + p1.swap(p2); + } + void adoptInstead(Type *p) { + if (ptr != nullptr) { closeFunction(ptr); } + ptr=p; + } + operator std::unique_ptr<Type, decltype(closeFunction)> () && { + return std::unique_ptr<Type, decltype(closeFunction)>(LocalPointerBase<Type>::orphan(), closeFunction); + } +}; +} // namespace internal +#endif U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index f0bdc7ca51416c..e702ff9c582d4c 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -35,6 +35,9 @@ #if U_SHOW_CPLUSPLUS_API +#include <cstdint> +#include <string_view> + #include "unicode/bytestream.h" #include "unicode/localpointer.h" #include "unicode/strenum.h" @@ -192,54 +195,53 @@ class UnicodeString; * @stable ICU 2.0 * @see ResourceBundle */ -class U_COMMON_API Locale : public UObject { +class U_COMMON_API_CLASS Locale : public UObject { public: /** Useful constant for the Root locale. @stable ICU 4.4 */ - static const Locale &U_EXPORT2 getRoot(void); + U_COMMON_API static const Locale& U_EXPORT2 getRoot(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getEnglish(void); + U_COMMON_API static const Locale& U_EXPORT2 getEnglish(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getFrench(void); + U_COMMON_API static const Locale& U_EXPORT2 getFrench(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getGerman(void); + U_COMMON_API static const Locale& U_EXPORT2 getGerman(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getItalian(void); + U_COMMON_API static const Locale& U_EXPORT2 getItalian(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getJapanese(void); + U_COMMON_API static const Locale& U_EXPORT2 getJapanese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getKorean(void); + U_COMMON_API static const Locale& U_EXPORT2 getKorean(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getChinese(void); + U_COMMON_API static const Locale& U_EXPORT2 getChinese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getSimplifiedChinese(void); + U_COMMON_API static const Locale& U_EXPORT2 getSimplifiedChinese(); /** Useful constant for this language. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getTraditionalChinese(void); + U_COMMON_API static const Locale& U_EXPORT2 getTraditionalChinese(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getFrance(void); + U_COMMON_API static const Locale& U_EXPORT2 getFrance(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getGermany(void); + U_COMMON_API static const Locale& U_EXPORT2 getGermany(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getItaly(void); + U_COMMON_API static const Locale& U_EXPORT2 getItaly(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getJapan(void); + U_COMMON_API static const Locale& U_EXPORT2 getJapan(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getKorea(void); + U_COMMON_API static const Locale& U_EXPORT2 getKorea(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getChina(void); + U_COMMON_API static const Locale& U_EXPORT2 getChina(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getPRC(void); + U_COMMON_API static const Locale& U_EXPORT2 getPRC(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getTaiwan(void); + U_COMMON_API static const Locale& U_EXPORT2 getTaiwan(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getUK(void); + U_COMMON_API static const Locale& U_EXPORT2 getUK(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getUS(void); + U_COMMON_API static const Locale& U_EXPORT2 getUS(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getCanada(void); + U_COMMON_API static const Locale& U_EXPORT2 getCanada(); /** Useful constant for this country/region. @stable ICU 2.0 */ - static const Locale &U_EXPORT2 getCanadaFrench(void); - + U_COMMON_API static const Locale& U_EXPORT2 getCanadaFrench(); /** * Construct a default locale object, a Locale for the default locale ID. @@ -248,7 +250,7 @@ class U_COMMON_API Locale : public UObject { * @see uloc_getDefault * @stable ICU 2.0 */ - Locale(); + U_COMMON_API Locale(); /** * Construct a locale from language, country, variant. @@ -274,10 +276,10 @@ class U_COMMON_API Locale : public UObject { * @see uloc_getDefault * @stable ICU 2.0 */ - Locale( const char * language, - const char * country = 0, - const char * variant = 0, - const char * keywordsAndValues = 0); + U_COMMON_API Locale(const char* language, + const char* country = nullptr, + const char* variant = nullptr, + const char* keywordsAndValues = nullptr); /** * Initializes a Locale object from another Locale object. @@ -285,7 +287,7 @@ class U_COMMON_API Locale : public UObject { * @param other The Locale object being copied in. * @stable ICU 2.0 */ - Locale(const Locale& other); + U_COMMON_API Locale(const Locale& other); /** * Move constructor; might leave source in bogus state. @@ -294,13 +296,13 @@ class U_COMMON_API Locale : public UObject { * @param other The Locale object being moved in. * @stable ICU 63 */ - Locale(Locale&& other) noexcept; + U_COMMON_API Locale(Locale&& other) noexcept; /** * Destructor * @stable ICU 2.0 */ - virtual ~Locale() ; + U_COMMON_API virtual ~Locale(); /** * Replaces the entire contents of *this with the specified value. @@ -309,7 +311,7 @@ class U_COMMON_API Locale : public UObject { * @return *this * @stable ICU 2.0 */ - Locale& operator=(const Locale& other); + U_COMMON_API Locale& operator=(const Locale& other); /** * Move assignment operator; might leave source in bogus state. @@ -320,7 +322,7 @@ class U_COMMON_API Locale : public UObject { * @return *this * @stable ICU 63 */ - Locale& operator=(Locale&& other) noexcept; + U_COMMON_API Locale& operator=(Locale&& other) noexcept; /** * Checks if two locale keys are the same. @@ -329,7 +331,7 @@ class U_COMMON_API Locale : public UObject { * @return true if the two locale keys are the same, false otherwise. * @stable ICU 2.0 */ - bool operator==(const Locale& other) const; + U_COMMON_API bool operator==(const Locale& other) const; /** * Checks if two locale keys are not the same. @@ -339,7 +341,7 @@ class U_COMMON_API Locale : public UObject { * otherwise. * @stable ICU 2.0 */ - inline bool operator!=(const Locale& other) const; + U_COMMON_API inline bool operator!=(const Locale& other) const; /** * Clone this object. @@ -352,7 +354,7 @@ class U_COMMON_API Locale : public UObject { * @see getDynamicClassID * @stable ICU 2.8 */ - Locale *clone() const; + U_COMMON_API Locale* clone() const; #ifndef U_HIDE_SYSTEM_API /** @@ -370,7 +372,7 @@ class U_COMMON_API Locale : public UObject { * @system * @stable ICU 2.0 */ - static const Locale& U_EXPORT2 getDefault(void); + U_COMMON_API static const Locale& U_EXPORT2 getDefault(); /** * Sets the default. Normally set once at the beginning of a process, @@ -384,8 +386,7 @@ class U_COMMON_API Locale : public UObject { * @system * @stable ICU 2.0 */ - static void U_EXPORT2 setDefault(const Locale& newLocale, - UErrorCode& success); + U_COMMON_API static void U_EXPORT2 setDefault(const Locale& newLocale, UErrorCode& success); #endif /* U_HIDE_SYSTEM_API */ /** @@ -409,7 +410,7 @@ class U_COMMON_API Locale : public UObject { * @return the Locale for the specified BCP47 language tag. * @stable ICU 63 */ - static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status); + U_COMMON_API static Locale U_EXPORT2 forLanguageTag(StringPiece tag, UErrorCode& status); /** * Returns a well-formed language tag for this Locale. @@ -424,7 +425,7 @@ class U_COMMON_API Locale : public UObject { * @param status error information if creating the language tag failed. * @stable ICU 63 */ - void toLanguageTag(ByteSink& sink, UErrorCode& status) const; + U_COMMON_API void toLanguageTag(ByteSink& sink, UErrorCode& status) const; /** * Returns a well-formed language tag for this Locale. @@ -448,7 +449,12 @@ class U_COMMON_API Locale : public UObject { * @stable ICU 2.0 * @see uloc_getName */ - static Locale U_EXPORT2 createFromName(const char *name); + U_COMMON_API static Locale U_EXPORT2 createFromName(const char* name); + +#ifndef U_HIDE_INTERNAL_API + /** @internal */ + U_COMMON_API static Locale U_EXPORT2 createFromName(StringPiece name); +#endif /* U_HIDE_INTERNAL_API */ /** * Creates a locale from the given string after canonicalizing @@ -458,14 +464,14 @@ class U_COMMON_API Locale : public UObject { * @stable ICU 3.0 * @see uloc_canonicalize */ - static Locale U_EXPORT2 createCanonical(const char* name); + U_COMMON_API static Locale U_EXPORT2 createCanonical(const char* name); /** * Returns the locale's ISO-639 language code. * @return An alias to the code * @stable ICU 2.0 */ - inline const char * getLanguage( ) const; + U_COMMON_API const char* getLanguage() const; /** * Returns the locale's ISO-15924 abbreviation script code. @@ -474,21 +480,21 @@ class U_COMMON_API Locale : public UObject { * @see uscript_getCode * @stable ICU 2.8 */ - inline const char * getScript( ) const; + U_COMMON_API const char* getScript() const; /** * Returns the locale's ISO-3166 country code. * @return An alias to the code * @stable ICU 2.0 */ - inline const char * getCountry( ) const; + U_COMMON_API const char* getCountry() const; /** * Returns the locale's variant code. * @return An alias to the code * @stable ICU 2.0 */ - inline const char * getVariant( ) const; + U_COMMON_API const char* getVariant() const; /** * Returns the programmatic name of the entire locale, with the language, @@ -498,7 +504,7 @@ class U_COMMON_API Locale : public UObject { * @return A pointer to "name". * @stable ICU 2.0 */ - inline const char * getName() const; + U_COMMON_API const char* getName() const; /** * Returns the programmatic name of the entire locale as getName() would return, @@ -507,7 +513,7 @@ class U_COMMON_API Locale : public UObject { * @see getName * @stable ICU 2.8 */ - const char * getBaseName() const; + U_COMMON_API const char* getBaseName() const; /** * Add the likely subtags for this Locale, per the algorithm described @@ -518,27 +524,27 @@ class U_COMMON_API Locale : public UObject { * If this Locale is already in the maximal form, or not valid, or there is * no data available for maximization, the Locale will be unchanged. * - * For example, "und-Zzzz" cannot be maximized, since there is no + * For example, "sh" cannot be maximized, since there is no * reasonable maximization. * * Examples: * + * "und_Zzzz" maximizes to "en_Latn_US" + * * "en" maximizes to "en_Latn_US" * - * "de" maximizes to "de_Latn_US" + * "de" maximizes to "de_Latn_DE" * * "sr" maximizes to "sr_Cyrl_RS" * - * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) - * - * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) + * "zh_Hani" maximizes to "zh_Hani_CN" * * @param status error information if maximizing this Locale failed. * If this Locale is not well-formed, the error code is * U_ILLEGAL_ARGUMENT_ERROR. * @stable ICU 63 */ - void addLikelySubtags(UErrorCode& status); + U_COMMON_API void addLikelySubtags(UErrorCode& status); /** * Minimize the subtags for this Locale, per the algorithm described @@ -569,7 +575,7 @@ class U_COMMON_API Locale : public UObject { * U_ILLEGAL_ARGUMENT_ERROR. * @stable ICU 63 */ - void minimizeSubtags(UErrorCode& status); + U_COMMON_API void minimizeSubtags(UErrorCode& status); /** * Canonicalize the locale ID of this object according to CLDR. @@ -577,7 +583,7 @@ class U_COMMON_API Locale : public UObject { * @stable ICU 67 * @see createCanonical */ - void canonicalize(UErrorCode& status); + U_COMMON_API void canonicalize(UErrorCode& status); /** * Gets the list of keywords for the specified locale. @@ -588,7 +594,7 @@ class U_COMMON_API Locale : public UObject { * @see getKeywords * @stable ICU 2.8 */ - StringEnumeration * createKeywords(UErrorCode &status) const; + U_COMMON_API StringEnumeration* createKeywords(UErrorCode& status) const; /** * Gets the list of Unicode keywords for the specified locale. @@ -599,7 +605,7 @@ class U_COMMON_API Locale : public UObject { * @see getUnicodeKeywords * @stable ICU 63 */ - StringEnumeration * createUnicodeKeywords(UErrorCode &status) const; + U_COMMON_API StringEnumeration* createUnicodeKeywords(UErrorCode& status) const; /** * Gets the set of keywords for this Locale. @@ -645,7 +651,10 @@ class U_COMMON_API Locale : public UObject { * * @stable ICU 2.8 */ - int32_t getKeywordValue(const char* keywordName, char *buffer, int32_t bufferCapacity, UErrorCode &status) const; + U_COMMON_API int32_t getKeywordValue(const char* keywordName, + char* buffer, + int32_t bufferCapacity, + UErrorCode& status) const; /** * Gets the value for a keyword. @@ -660,7 +669,7 @@ class U_COMMON_API Locale : public UObject { * @param status error information if getting the value failed. * @stable ICU 63 */ - void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const; + U_COMMON_API void getKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const; /** * Gets the value for a keyword. @@ -691,7 +700,9 @@ class U_COMMON_API Locale : public UObject { * @param status error information if getting the value failed. * @stable ICU 63 */ - void getUnicodeKeywordValue(StringPiece keywordName, ByteSink& sink, UErrorCode& status) const; + U_COMMON_API void getUnicodeKeywordValue(StringPiece keywordName, + ByteSink& sink, + UErrorCode& status) const; /** * Gets the Unicode value for a Unicode keyword. @@ -728,7 +739,11 @@ class U_COMMON_API Locale : public UObject { * * @stable ICU 49 */ - void setKeywordValue(const char* keywordName, const char* keywordValue, UErrorCode &status); + U_COMMON_API void setKeywordValue(const char* keywordName, + const char* keywordValue, + UErrorCode& status) { + setKeywordValue(StringPiece{keywordName}, StringPiece{keywordValue}, status); + } /** * Sets or removes the value for a keyword. @@ -748,7 +763,9 @@ class U_COMMON_API Locale : public UObject { * @param status Returns any error information while performing this operation. * @stable ICU 63 */ - void setKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status); + U_COMMON_API void setKeywordValue(StringPiece keywordName, + StringPiece keywordValue, + UErrorCode& status); /** * Sets or removes the Unicode value for a Unicode keyword. @@ -768,7 +785,9 @@ class U_COMMON_API Locale : public UObject { * @param status Returns any error information while performing this operation. * @stable ICU 63 */ - void setUnicodeKeywordValue(StringPiece keywordName, StringPiece keywordValue, UErrorCode& status); + U_COMMON_API void setUnicodeKeywordValue(StringPiece keywordName, + StringPiece keywordValue, + UErrorCode& status); /** * returns the locale's three-letter language code, as specified @@ -776,14 +795,14 @@ class U_COMMON_API Locale : public UObject { * @return An alias to the code, or an empty string * @stable ICU 2.0 */ - const char * getISO3Language() const; + U_COMMON_API const char* getISO3Language() const; /** * Fills in "name" with the locale's three-letter ISO-3166 country code. * @return An alias to the code, or an empty string * @stable ICU 2.0 */ - const char * getISO3Country() const; + U_COMMON_API const char* getISO3Country() const; /** * Returns the Windows LCID value corresponding to this locale. @@ -792,7 +811,7 @@ class U_COMMON_API Locale : public UObject { * there is no Windows LCID value that corresponds to this locale, returns 0. * @stable ICU 2.0 */ - uint32_t getLCID(void) const; + U_COMMON_API uint32_t getLCID() const; /** * Returns whether this locale's script is written right-to-left. @@ -807,7 +826,7 @@ class U_COMMON_API Locale : public UObject { * @return true if the locale's script is written right-to-left * @stable ICU 54 */ - UBool isRightToLeft() const; + U_COMMON_API UBool isRightToLeft() const; /** * Fills in "dispLang" with the name of this locale's language in a format suitable for @@ -818,7 +837,7 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispLang". * @stable ICU 2.0 */ - UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const; + U_COMMON_API UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const; /** * Fills in "dispLang" with the name of this locale's language in a format suitable for @@ -833,8 +852,8 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispLang". * @stable ICU 2.0 */ - UnicodeString& getDisplayLanguage( const Locale& displayLocale, - UnicodeString& dispLang) const; + U_COMMON_API UnicodeString& getDisplayLanguage(const Locale& displayLocale, + UnicodeString& dispLang) const; /** * Fills in "dispScript" with the name of this locale's script in a format suitable @@ -845,7 +864,7 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispScript". * @stable ICU 2.8 */ - UnicodeString& getDisplayScript( UnicodeString& dispScript) const; + U_COMMON_API UnicodeString& getDisplayScript(UnicodeString& dispScript) const; /** * Fills in "dispScript" with the name of this locale's country in a format suitable @@ -861,8 +880,8 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispScript". * @stable ICU 2.8 */ - UnicodeString& getDisplayScript( const Locale& displayLocale, - UnicodeString& dispScript) const; + U_COMMON_API UnicodeString& getDisplayScript(const Locale& displayLocale, + UnicodeString& dispScript) const; /** * Fills in "dispCountry" with the name of this locale's country in a format suitable @@ -873,7 +892,7 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispCountry". * @stable ICU 2.0 */ - UnicodeString& getDisplayCountry( UnicodeString& dispCountry) const; + U_COMMON_API UnicodeString& getDisplayCountry(UnicodeString& dispCountry) const; /** * Fills in "dispCountry" with the name of this locale's country in a format suitable @@ -889,8 +908,8 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispCountry". * @stable ICU 2.0 */ - UnicodeString& getDisplayCountry( const Locale& displayLocale, - UnicodeString& dispCountry) const; + U_COMMON_API UnicodeString& getDisplayCountry(const Locale& displayLocale, + UnicodeString& dispCountry) const; /** * Fills in "dispVar" with the name of this locale's variant code in a format suitable @@ -899,7 +918,7 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispVar". * @stable ICU 2.0 */ - UnicodeString& getDisplayVariant( UnicodeString& dispVar) const; + U_COMMON_API UnicodeString& getDisplayVariant(UnicodeString& dispVar) const; /** * Fills in "dispVar" with the name of this locale's variant code in a format @@ -909,8 +928,8 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "dispVar". * @stable ICU 2.0 */ - UnicodeString& getDisplayVariant( const Locale& displayLocale, - UnicodeString& dispVar) const; + U_COMMON_API UnicodeString& getDisplayVariant(const Locale& displayLocale, + UnicodeString& dispVar) const; /** * Fills in "name" with the name of this locale in a format suitable for user display @@ -923,7 +942,7 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "name". * @stable ICU 2.0 */ - UnicodeString& getDisplayName( UnicodeString& name) const; + U_COMMON_API UnicodeString& getDisplayName(UnicodeString& name) const; /** * Fills in "name" with the name of this locale in a format suitable for user display @@ -937,14 +956,13 @@ class U_COMMON_API Locale : public UObject { * @return A reference to "name". * @stable ICU 2.0 */ - UnicodeString& getDisplayName( const Locale& displayLocale, - UnicodeString& name) const; + U_COMMON_API UnicodeString& getDisplayName(const Locale& displayLocale, UnicodeString& name) const; /** * Generates a hash code for the locale. * @stable ICU 2.0 */ - int32_t hashCode(void) const; + U_COMMON_API int32_t hashCode() const; /** * Sets the locale to bogus @@ -954,14 +972,14 @@ class U_COMMON_API Locale : public UObject { * instantiated from a locale and from a rule set). * @stable ICU 2.1 */ - void setToBogus(); + U_COMMON_API void setToBogus(); /** * Gets the bogus state. Locale object can be bogus if it doesn't exist * @return false if it is a real locale, true if it is a bogus locale * @stable ICU 2.1 */ - inline UBool isBogus(void) const; + U_COMMON_API inline UBool isBogus() const; /** * Returns a list of all installed locales. @@ -971,7 +989,7 @@ class U_COMMON_API Locale : public UObject { * get ownership of this list, and must NOT delete it. * @stable ICU 2.0 */ - static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); + U_COMMON_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Gets a list of all available 2-letter country codes defined in ISO 3166. This is a @@ -981,7 +999,7 @@ class U_COMMON_API Locale : public UObject { * @return a list of all available country codes * @stable ICU 2.0 */ - static const char* const* U_EXPORT2 getISOCountries(); + U_COMMON_API static const char* const* U_EXPORT2 getISOCountries(); /** * Returns a list of all unique language codes defined in ISO 639. @@ -994,21 +1012,21 @@ class U_COMMON_API Locale : public UObject { * @return a list of all available language codes * @stable ICU 2.0 */ - static const char* const* U_EXPORT2 getISOLanguages(); + U_COMMON_API static const char* const* U_EXPORT2 getISOLanguages(); /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @stable ICU 2.2 */ - static UClassID U_EXPORT2 getStaticClassID(); + U_COMMON_API static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @stable ICU 2.2 */ - virtual UClassID getDynamicClassID() const override; + U_COMMON_API virtual UClassID getDynamicClassID() const override; /** * A Locale iterator interface similar to a Java Iterator<Locale>. @@ -1112,7 +1130,7 @@ class U_COMMON_API Locale : public UObject { * Set this from a single POSIX style locale string. * @internal */ - void setFromPOSIXID(const char *posixID); + U_COMMON_API void setFromPOSIXID(const char* posixID); /** * Minimize the subtags for this Locale, per the algorithm described * @param favorScript favor to keep script if true, to keep region if false. @@ -1121,7 +1139,7 @@ class U_COMMON_API Locale : public UObject { * U_ILLEGAL_ARGUMENT_ERROR. * @internal */ - void minimizeSubtags(bool favorScript, UErrorCode& status); + U_COMMON_API void minimizeSubtags(bool favorScript, UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ private: @@ -1132,50 +1150,178 @@ class U_COMMON_API Locale : public UObject { * @param cLocaleID The new locale name. * @param canonicalize whether to call uloc_canonicalize on cLocaleID */ - Locale& init(const char* cLocaleID, UBool canonicalize); + Locale& init(const char* localeID, UBool canonicalize); + Locale& init(StringPiece localeID, UBool canonicalize); /* * Internal constructor to allow construction of a locale object with * NO side effects. (Default constructor tries to get * the default locale.) */ - enum ELocaleType { - eBOGUS + enum ELocaleType : uint8_t { + eBOGUS, + eNEST, + eHEAP, }; Locale(ELocaleType); /** * Initialize the locale cache for commonly used locales */ - static Locale *getLocaleCache(void); + static Locale* getLocaleCache(); + + union Payload; + struct Nest; + struct Heap; + + /** + * Locale data that can be nested directly within the union Payload object. + */ + struct Nest { + static constexpr size_t SIZE = 32; + + ELocaleType type = eNEST; + char language[4]; + char script[5]; + char region[4]; + uint8_t variantBegin; + char baseName[SIZE - + sizeof type - + sizeof language - + sizeof script - + sizeof region - + sizeof variantBegin]; + + const char* getLanguage() const { return language; } + const char* getScript() const { return script; } + const char* getRegion() const { return region; } + const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; } + const char* getBaseName() const { return baseName; } + + // Doesn't inherit from UMemory, shouldn't be heap allocated. + static void* U_EXPORT2 operator new(size_t) noexcept = delete; + static void* U_EXPORT2 operator new[](size_t) noexcept = delete; + + Nest() : language{'\0'}, script{'\0'}, region{'\0'}, variantBegin{0}, baseName{'\0'} {} + + void init(std::string_view language, + std::string_view script, + std::string_view region, + uint8_t variantBegin); + + static bool fits(int32_t length, + std::string_view language, + std::string_view script, + std::string_view region) { + return length < static_cast<int32_t>(sizeof Nest::baseName) && + language.size() < sizeof Nest::language && + script.size() < sizeof Nest::script && + region.size() < sizeof Nest::region; + } + + private: + friend union Payload; + Nest(Heap&& heap, uint8_t variantBegin); + }; + static_assert(sizeof(Nest) == Nest::SIZE); + + /** + * Locale data that needs to be heap allocated in the union Payload object. + */ + struct Heap { + struct Alloc; + + ELocaleType type; + char language[ULOC_LANG_CAPACITY]; + char script[ULOC_SCRIPT_CAPACITY]; + char region[ULOC_COUNTRY_CAPACITY]; + Alloc* ptr; + + const char* getLanguage() const { return language; } + const char* getScript() const { return script; } + const char* getRegion() const { return region; } + const char* getVariant() const; + const char* getFullName() const; + const char* getBaseName() const; + + // Doesn't inherit from UMemory, shouldn't be heap allocated. + static void* U_EXPORT2 operator new(size_t) noexcept = delete; + static void* U_EXPORT2 operator new[](size_t) noexcept = delete; + + Heap(std::string_view language, + std::string_view script, + std::string_view region, + int32_t variantBegin); + ~Heap(); + + Heap& operator=(const Heap& other); + Heap& operator=(Heap&& other) noexcept; + }; + static_assert(sizeof(Heap) <= sizeof(Nest)); + + /** + * This is kind of std::variant but customized to not waste any space on the + * discriminator or on any padding, and to copy any heap allocated object. + */ + union Payload { + private: + Nest nest; + Heap heap; + ELocaleType type; + + void copy(const Payload& other); + void move(Payload&& other) noexcept; + + public: + // Doesn't inherit from UMemory, shouldn't be heap allocated. + static void* U_EXPORT2 operator new(size_t) noexcept = delete; + static void* U_EXPORT2 operator new[](size_t) noexcept = delete; - char language[ULOC_LANG_CAPACITY]; - char script[ULOC_SCRIPT_CAPACITY]; - char country[ULOC_COUNTRY_CAPACITY]; - int32_t variantBegin; - char* fullName; - char fullNameBuffer[ULOC_FULLNAME_CAPACITY]; - // name without keywords - char* baseName; - void initBaseName(UErrorCode& status); + Payload() : type{eBOGUS} {} + ~Payload(); - UBool fIsBogus; + Payload(const Payload& other); + Payload(Payload&& other) noexcept; + + Payload& operator=(const Payload& other); + Payload& operator=(Payload&& other) noexcept; + + void setToBogus(); + bool isBogus() const { return type == eBOGUS; } + + template <typename T, typename... Args> T& emplace(Args&&... args); + + template <typename T> T* get(); + + template <typename BogusFn, typename NestFn, typename HeapFn, typename... Args> + auto visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const; + } payload; + + /** + * Call a field getter function on either Nest or Heap in payload. + * (This is kind of std::visit but simpler and without exceptions.) + * + * @tparam NEST Pointer to the Nest getter function. + * @tparam HEAP Pointer to the Heap getter function. + * @return the result from the getter, or the empty string if isBogus(). + */ + template <const char* (Nest::*const NEST)() const, + const char* (Heap::*const HEAP)() const> + const char* getField() const; static const Locale &getLocale(int locid); /** * A friend to allow the default locale to be set by either the C or C++ API. - * @internal (private) */ friend Locale *locale_set_default_internal(const char *, UErrorCode& status); /** - * @internal (private) */ friend void U_CALLCONV locale_available_init(); }; -inline bool +U_COMMON_API inline bool Locale::operator!=(const Locale& other) const { return !operator==(other); @@ -1184,45 +1330,17 @@ Locale::operator!=(const Locale& other) const template<typename StringClass> inline StringClass Locale::toLanguageTag(UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink<StringClass> sink(&result); toLanguageTag(sink, status); return result; } -inline const char * -Locale::getCountry() const -{ - return country; -} - -inline const char * -Locale::getLanguage() const -{ - return language; -} - -inline const char * -Locale::getScript() const -{ - return script; -} - -inline const char * -Locale::getVariant() const -{ - return &baseName[variantBegin]; -} - -inline const char * -Locale::getName() const -{ - return fullName; -} - template<typename StringClass, typename OutputIterator> inline void Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const { + if (U_FAILURE(status)) { return; } LocalPointer<StringEnumeration> keys(createKeywords(status)); if (U_FAILURE(status) || keys.isNull()) { return; @@ -1240,6 +1358,7 @@ Locale::getKeywords(OutputIterator iterator, UErrorCode& status) const template<typename StringClass, typename OutputIterator> inline void Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const { + if (U_FAILURE(status)) { return; } LocalPointer<StringEnumeration> keys(createUnicodeKeywords(status)); if (U_FAILURE(status) || keys.isNull()) { return; @@ -1257,6 +1376,7 @@ Locale::getUnicodeKeywords(OutputIterator iterator, UErrorCode& status) const template<typename StringClass> inline StringClass Locale::getKeywordValue(StringPiece keywordName, UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink<StringClass> sink(&result); getKeywordValue(keywordName, sink, status); @@ -1266,15 +1386,16 @@ Locale::getKeywordValue(StringPiece keywordName, UErrorCode& status) const template<typename StringClass> inline StringClass Locale::getUnicodeKeywordValue(StringPiece keywordName, UErrorCode& status) const { + if (U_FAILURE(status)) { return {}; } StringClass result; StringByteSink<StringClass> sink(&result); getUnicodeKeywordValue(keywordName, sink, status); return result; } -inline UBool -Locale::isBogus(void) const { - return fIsBogus; +U_COMMON_API inline UBool +Locale::isBogus() const { + return payload.isBogus(); } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/messagepattern.h b/deps/icu-small/source/common/unicode/messagepattern.h index 55b09bfbd4b5dc..db36ede7274c57 100644 --- a/deps/icu-small/source/common/unicode/messagepattern.h +++ b/deps/icu-small/source/common/unicode/messagepattern.h @@ -775,7 +775,7 @@ class U_COMMON_API MessagePattern : public UObject { UMessagePatternArgType getArgType() const { UMessagePatternPartType msgType=getType(); if(msgType ==UMSGPAT_PART_TYPE_ARG_START || msgType ==UMSGPAT_PART_TYPE_ARG_LIMIT) { - return (UMessagePatternArgType)value; + return static_cast<UMessagePatternArgType>(value); } else { return UMSGPAT_ARG_TYPE_NONE; } @@ -821,6 +821,7 @@ class U_COMMON_API MessagePattern : public UObject { static const int32_t MAX_LENGTH=0xffff; static const int32_t MAX_VALUE=0x7fff; + static const int32_t MAX_NESTED_LEVELS=0x03ff; // Some fields are not final because they are modified during pattern parsing. // After pattern parsing, the parts are effectively immutable. diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index 6856ff8720bfd6..01271623f3b9c8 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -163,7 +163,6 @@ class U_COMMON_API Normalizer2 : public UObject { static const Normalizer2 * getNFKCCasefoldInstance(UErrorCode &errorCode); -#ifndef U_HIDE_DRAFT_API /** * Returns a Normalizer2 instance for a variant of Unicode toNFKC_Casefold() normalization * which is equivalent to applying the NFKC_Simple_Casefold mappings and then NFC. @@ -176,11 +175,10 @@ class U_COMMON_API Normalizer2 : public UObject { * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) * @return the requested Normalizer2, if successful - * @draft ICU 74 + * @stable ICU 74 */ static const Normalizer2 * getNFKCSimpleCasefoldInstance(UErrorCode &errorCode); -#endif // U_HIDE_DRAFT_API /** * Returns a Normalizer2 instance which uses the specified data file diff --git a/deps/icu-small/source/common/unicode/normlzr.h b/deps/icu-small/source/common/unicode/normlzr.h index 03a7aa080d1a78..0309bce5382dc8 100644 --- a/deps/icu-small/source/common/unicode/normlzr.h +++ b/deps/icu-small/source/common/unicode/normlzr.h @@ -466,7 +466,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the current normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 current(void); + UChar32 current(); /** * Return the first character in the normalized text. @@ -476,7 +476,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the first normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 first(void); + UChar32 first(); /** * Return the last character in the normalized text. @@ -486,7 +486,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the last normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 last(void); + UChar32 last(); /** * Return the next character in the normalized text. @@ -502,7 +502,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the next normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 next(void); + UChar32 next(); /** * Return the previous character in the normalized text and decrement. @@ -518,7 +518,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the previous normalized code point * @deprecated ICU 56 Use Normalizer2 instead. */ - UChar32 previous(void); + UChar32 previous(); /** * Set the iteration position in the input text that is being normalized, @@ -536,7 +536,7 @@ class U_COMMON_API Normalizer : public UObject { * This is equivalent to setIndexOnly(startIndex)). * @deprecated ICU 56 Use Normalizer2 instead. */ - void reset(void); + void reset(); /** * Retrieve the current iteration position in the input text that is @@ -552,7 +552,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the current index in the input text * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t getIndex(void) const; + int32_t getIndex() const; /** * Retrieve the index of the start of the input text. This is the begin index @@ -562,7 +562,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the smallest index in the input text where the Normalizer operates * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t startIndex(void) const; + int32_t startIndex() const; /** * Retrieve the index of the end of the input text. This is the end index @@ -574,7 +574,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the first index in the input text where the Normalizer does not operate * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t endIndex(void) const; + int32_t endIndex() const; /** * Returns true when both iterators refer to the same character in the same @@ -610,7 +610,7 @@ class U_COMMON_API Normalizer : public UObject { * @return the hash code * @deprecated ICU 56 Use Normalizer2 instead. */ - int32_t hashCode(void) const; + int32_t hashCode() const; //------------------------------------------------------------------------- // Property access methods @@ -643,7 +643,7 @@ class U_COMMON_API Normalizer : public UObject { * @see #setMode * @deprecated ICU 56 Use Normalizer2 instead. */ - UNormalizationMode getUMode(void) const; + UNormalizationMode getUMode() const; /** * Set options that affect this <code>Normalizer</code>'s operation. @@ -749,7 +749,7 @@ class U_COMMON_API Normalizer : public UObject { UBool previousNormalize(); void init(); - void clearBuffer(void); + void clearBuffer(); //------------------------------------------------------------------------- // Private data diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index d33a812ad0b4f3..99cdd7edab80ca 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -129,7 +129,7 @@ class U_COMMON_API ParsePosition : public UObject { * @return the current index. * @stable ICU 2.0 */ - inline int32_t getIndex(void) const; + inline int32_t getIndex() const; /** * Set the current parse position. @@ -152,7 +152,7 @@ class U_COMMON_API ParsePosition : public UObject { * error index has not been set. * @stable ICU 2.0 */ - inline int32_t getErrorIndex(void) const; + inline int32_t getErrorIndex() const; /** * ICU "poor man's RTTI", returns a UClassID for this class. diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index a997843660c9ad..b45048d683480f 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -132,6 +132,8 @@ #define U_PF_BROWSER_NATIVE_CLIENT 4020 /** Android is based on Linux. @internal */ #define U_PF_ANDROID 4050 +/** Haiku is a POSIX-ish platform. @internal */ +#define U_PF_HAIKU 4080 /** Fuchsia is a POSIX-ish platform. @internal */ #define U_PF_FUCHSIA 4100 /* Maximum value for Linux-based platform is 4499 */ @@ -154,6 +156,8 @@ # define U_PLATFORM U_PF_MINGW #elif defined(__CYGWIN__) # define U_PLATFORM U_PF_CYGWIN + /* Cygwin uchar.h doesn't exist until Cygwin 3.5. */ +# include <cygwin/version.h> #elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) # define U_PLATFORM U_PF_WINDOWS #elif defined(__ANDROID__) @@ -200,12 +204,25 @@ # define U_PLATFORM U_PF_OS390 #elif defined(__OS400__) || defined(__TOS_OS400__) # define U_PLATFORM U_PF_OS400 +#elif defined(__HAIKU__) +# define U_PLATFORM U_PF_HAIKU #elif defined(__EMSCRIPTEN__) # define U_PLATFORM U_PF_EMSCRIPTEN #else # define U_PLATFORM U_PF_UNKNOWN #endif +/** + * \def U_REAL_MSVC + * Defined if the compiler is the real MSVC compiler (and not something like + * Clang setting _MSC_VER in order to compile Windows code that requires it). + * Otherwise undefined. + * @internal + */ +#if (defined(_MSC_VER) && !(defined(__clang__) && __clang__)) || defined(U_IN_DOXYGEN) +# define U_REAL_MSVC +#endif + /** * \def CYGWINMSVC * Defined if this is Windows with Cygwin, but using MSVC rather than gcc. @@ -224,7 +241,7 @@ /** * \def U_PLATFORM_USES_ONLY_WIN32_API * Defines whether the platform uses only the Win32 API. - * Set to 1 for Windows/MSVC and MinGW but not Cygwin. + * Set to 1 for Windows/MSVC, ClangCL and MinGW but not Cygwin. * @internal */ #ifdef U_PLATFORM_USES_ONLY_WIN32_API @@ -239,7 +256,7 @@ /** * \def U_PLATFORM_HAS_WIN32_API * Defines whether the Win32 API is available on the platform. - * Set to 1 for Windows/MSVC, MinGW and Cygwin. + * Set to 1 for Windows/MSVC, ClangCL, MinGW and Cygwin. * @internal */ #ifdef U_PLATFORM_HAS_WIN32_API @@ -302,51 +319,6 @@ # define U_PLATFORM_IS_DARWIN_BASED 0 #endif -/** - * \def U_HAVE_STDINT_H - * Defines whether stdint.h is available. It is a C99 standard header. - * We used to include inttypes.h which includes stdint.h but we usually do not need - * the additional definitions from inttypes.h. - * @internal - */ -#ifdef U_HAVE_STDINT_H - /* Use the predefined value. */ -#elif U_PLATFORM_USES_ONLY_WIN32_API -# if defined(__BORLANDC__) || U_PLATFORM == U_PF_MINGW || (defined(_MSC_VER) && _MSC_VER>=1600) - /* Windows Visual Studio 9 and below do not have stdint.h & inttypes.h, but VS 2010 adds them. */ -# define U_HAVE_STDINT_H 1 -# else -# define U_HAVE_STDINT_H 0 -# endif -#elif U_PLATFORM == U_PF_SOLARIS - /* Solaris has inttypes.h but not stdint.h. */ -# define U_HAVE_STDINT_H 0 -#elif U_PLATFORM == U_PF_AIX && !defined(_AIX51) && defined(_POWER) - /* PPC AIX <= 4.3 has inttypes.h but not stdint.h. */ -# define U_HAVE_STDINT_H 0 -#else -# define U_HAVE_STDINT_H 1 -#endif - -/** - * \def U_HAVE_INTTYPES_H - * Defines whether inttypes.h is available. It is a C99 standard header. - * We include inttypes.h where it is available but stdint.h is not. - * @internal - */ -#ifdef U_HAVE_INTTYPES_H - /* Use the predefined value. */ -#elif U_PLATFORM == U_PF_SOLARIS - /* Solaris has inttypes.h but not stdint.h. */ -# define U_HAVE_INTTYPES_H 1 -#elif U_PLATFORM == U_PF_AIX && !defined(_AIX51) && defined(_POWER) - /* PPC AIX <= 4.3 has inttypes.h but not stdint.h. */ -# define U_HAVE_INTTYPES_H 1 -#else - /* Most platforms have both inttypes.h and stdint.h, or neither. */ -# define U_HAVE_INTTYPES_H U_HAVE_STDINT_H -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -396,19 +368,6 @@ # define U_IS_BIG_ENDIAN 0 #endif -/** - * \def U_HAVE_PLACEMENT_NEW - * Determines whether to override placement new and delete for STL. - * @stable ICU 2.6 - */ -#ifdef U_HAVE_PLACEMENT_NEW - /* Use the predefined value. */ -#elif defined(__BORLANDC__) -# define U_HAVE_PLACEMENT_NEW 0 -#else -# define U_HAVE_PLACEMENT_NEW 1 -#endif - /** * \def U_HAVE_DEBUG_LOCATION_NEW * Define this to define the MFC debug version of the operator new. @@ -507,6 +466,14 @@ /* Otherwise use the predefined value. */ #elif !defined(__cplusplus) # define U_CPLUSPLUS_VERSION 0 +// The value of _MSVC_LANG for C++23 preview is undocumented, except that it is larger than 202002. +// As of this writing, it is 202004. +#elif __cplusplus >= 202302L || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L) +# define U_CPLUSPLUS_VERSION 23 +#elif __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) +# define U_CPLUSPLUS_VERSION 20 +#elif __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define U_CPLUSPLUS_VERSION 17 #elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) # define U_CPLUSPLUS_VERSION 14 #elif __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L) @@ -519,12 +486,10 @@ /** * \def U_FALLTHROUGH * Annotate intentional fall-through between switch labels. - * http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough + * https://clang.llvm.org/docs/AttributeReference.html#fallthrough * @internal */ -#ifndef __cplusplus - // Not for C. -#elif defined(U_FALLTHROUGH) +#if defined(U_FALLTHROUGH) // Use the predefined value. #elif defined(__clang__) // Test for compiler vs. feature separately. @@ -754,12 +719,16 @@ /* * Notes: * C++11 and C11 require support for UTF-16 literals - * TODO: Fix for plain C. Doesn't work on Mac. + * Doesn't work on Mac C11 (see workaround in ptypes.h) + * or Cygwin less than 3.5. */ -# if U_CPLUSPLUS_VERSION >= 11 || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) +# if defined(__cplusplus) # define U_HAVE_CHAR16_T 1 -# else +# elif U_PLATFORM_IS_DARWIN_BASED || (U_PLATFORM == U_PF_CYGWIN && CYGWIN_VERSION_DLL_MAJOR < 3005) # define U_HAVE_CHAR16_T 0 +# else + // conformant C11 +# define U_HAVE_CHAR16_T 1 # endif #endif @@ -767,7 +736,9 @@ * @{ * \def U_DECLARE_UTF16 * Do not use this macro because it is not defined on all platforms. - * Use the UNICODE_STRING or U_STRING_DECL macros instead. + * In C++, use std::u16string_view literals, see the UNICODE_STRING docs. + * In C, use u"UTF-16 literals". + * See also the public U_STRING_DECL macro. * @internal */ #ifdef U_DECLARE_UTF16 @@ -798,7 +769,7 @@ #elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) # define U_EXPORT __declspec(dllexport) -#elif defined(__GNUC__) +#elif defined(__GNUC__) || defined(__open_xl__) # define U_EXPORT __attribute__((visibility("default"))) #elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \ || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550) @@ -837,7 +808,7 @@ */ #ifdef U_HIDDEN /* Use the predefined value. */ -#elif defined(__GNUC__) +#elif defined(__GNUC__) || defined(__open_xl__) # define U_HIDDEN __attribute__((visibility("hidden"))) #else # define U_HIDDEN diff --git a/deps/icu-small/source/common/unicode/ptypes.h b/deps/icu-small/source/common/unicode/ptypes.h index 70324ffee3b9c4..270a729ccb030e 100644 --- a/deps/icu-small/source/common/unicode/ptypes.h +++ b/deps/icu-small/source/common/unicode/ptypes.h @@ -42,89 +42,25 @@ /* NULL, size_t, wchar_t */ #include <stddef.h> -/* - * If all compilers provided all of the C99 headers and types, - * we would just unconditionally #include <stdint.h> here - * and not need any of the stuff after including platform.h. - */ - -/* Find out if we have stdint.h etc. */ +/* More platform-specific definitions. */ #include "unicode/platform.h" /*===========================================================================*/ /* Generic data types */ /*===========================================================================*/ -/* If your platform does not have the <stdint.h> header, you may - need to edit the typedefs in the #else section below. - Use #if...#else...#endif with predefined compiler macros if possible. */ -#if U_HAVE_STDINT_H - -/* - * We mostly need <stdint.h> (which defines the standard integer types) but not <inttypes.h>. - * <inttypes.h> includes <stdint.h> and adds the printf/scanf helpers PRId32, SCNx16 etc. - * which we almost never use, plus stuff like imaxabs() which we never use. - */ #include <stdint.h> -#if U_PLATFORM == U_PF_OS390 -/* The features header is needed to get (u)int64_t sometimes. */ -#include <features.h> -/* z/OS has <stdint.h>, but some versions are missing uint8_t (APAR PK62248). */ -#if !defined(__uint8_t) -#define __uint8_t 1 -typedef unsigned char uint8_t; -#endif -#endif /* U_PLATFORM == U_PF_OS390 */ - -#elif U_HAVE_INTTYPES_H - -# include <inttypes.h> - -#else /* neither U_HAVE_STDINT_H nor U_HAVE_INTTYPES_H */ - -/// \cond -#if ! U_HAVE_INT8_T -typedef signed char int8_t; -#endif - -#if ! U_HAVE_UINT8_T -typedef unsigned char uint8_t; -#endif - -#if ! U_HAVE_INT16_T -typedef signed short int16_t; -#endif - -#if ! U_HAVE_UINT16_T -typedef unsigned short uint16_t; -#endif - -#if ! U_HAVE_INT32_T -typedef signed int int32_t; -#endif - -#if ! U_HAVE_UINT32_T -typedef unsigned int uint32_t; +// C++11 and C11 both specify that the data type char16_t should exist, C++11 +// as a keyword and C11 as a typedef in the uchar.h header file, but not all +// implementations (looking at you, Apple, spring 2024) actually do this, so +// ICU4C must detect and deal with that. +#if !defined(__cplusplus) && !defined(U_IN_DOXYGEN) +# if U_HAVE_CHAR16_T +# include <uchar.h> +# else + typedef uint16_t char16_t; +# endif #endif -#if ! U_HAVE_INT64_T -#ifdef _MSC_VER - typedef signed __int64 int64_t; -#else - typedef signed long long int64_t; -#endif -#endif - -#if ! U_HAVE_UINT64_T -#ifdef _MSC_VER - typedef unsigned __int64 uint64_t; -#else - typedef unsigned long long uint64_t; -#endif -#endif -/// \endcond - -#endif /* U_HAVE_STDINT_H / U_HAVE_INTTYPES_H */ - #endif /* _PTYPES_H */ diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 045238ac5d79de..e70254982c91d6 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -44,7 +44,7 @@ class UnhandledEngine; class UStack; -#ifndef U_HIDE_DRAFT_API +#ifndef U_HIDE_INTERNAL_API /** * The ExternalBreakEngine class define an abstract interface for the host environment * to provide a low level facility to break text for unicode text in script that the text boundary @@ -103,7 +103,7 @@ class ExternalBreakEngine : public UObject { int32_t* foundBreaks, int32_t foundBreaksCapacity, UErrorCode& status) const = 0; }; -#endif /* U_HIDE_DRAFT_API */ +#endif /* U_HIDE_INTERNAL_API */ /** @@ -122,7 +122,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { private: /** * The UText through which this BreakIterator accesses the text - * @internal (private) */ UText fText = UTEXT_INITIALIZER; @@ -172,7 +171,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * If present, UStack of LanguageBreakEngine objects that might handle * dictionary characters. Searched from top to bottom to find an object to * handle a given character. - * @internal (private) */ UStack *fLanguageBreakEngines = nullptr; @@ -181,14 +179,12 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * If present, the special LanguageBreakEngine used for handling * characters that are in the dictionary set, but not handled by any * LanguageBreakEngine. - * @internal (private) */ UnhandledEngine *fUnhandledBreakEngine = nullptr; /** * Counter for the number of characters encountered with the "dictionary" * flag set. - * @internal (private) */ uint32_t fDictionaryCharCount = 0; @@ -233,7 +229,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * * The break iterator adopts the memory, and will * free it when done. - * @internal (private) */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); @@ -248,20 +243,16 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @param isPhraseBreaking true if phrase based breaking is required, otherwise false. * @see udata_open * @see #getBinaryRules - * @internal (private) */ RuleBasedBreakIterator(UDataMemory* image, UBool isPhraseBreaking, UErrorCode &status); - /** @internal */ friend class RBBIRuleBuilder; - /** @internal */ friend class BreakIterator; /** * Default constructor with an error code parameter. * Aside from error handling, otherwise identical to the default constructor. * Internally, handles common initialization for other constructors. - * @internal (private) */ RuleBasedBreakIterator(UErrorCode *status); @@ -388,14 +379,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return A hash code * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const; + virtual int32_t hashCode() const; /** * Returns the description used to create this iterator * @return the description used to create this iterator * @stable ICU 2.0 */ - virtual const UnicodeString& getRules(void) const; + virtual const UnicodeString& getRules() const; //======================================================================= // BreakIterator overrides @@ -425,8 +416,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return An iterator over the text being analyzed. * @stable ICU 2.0 */ - virtual CharacterIterator& getText(void) const override; - + virtual CharacterIterator& getText() const override; /** * Get a UText for the text being analyzed. @@ -486,14 +476,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The offset of the beginning of the text, zero. * @stable ICU 2.0 */ - virtual int32_t first(void) override; + virtual int32_t first() override; /** * Sets the current iteration position to the end of the text. * @return The text's past-the-end offset. * @stable ICU 2.0 */ - virtual int32_t last(void) override; + virtual int32_t last() override; /** * Advances the iterator either forward or backward the specified number of steps. @@ -512,14 +502,14 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The position of the first boundary after this one. * @stable ICU 2.0 */ - virtual int32_t next(void) override; + virtual int32_t next() override; /** * Moves the iterator backwards, to the last boundary preceding this one. * @return The position of the last boundary position preceding this one. * @stable ICU 2.0 */ - virtual int32_t previous(void) override; + virtual int32_t previous() override; /** * Sets the iterator to refer to the first boundary position following @@ -557,8 +547,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The current iteration position. * @stable ICU 2.0 */ - virtual int32_t current(void) const override; - + virtual int32_t current() const override; /** * Return the status tag from the break rule that determined the boundary at @@ -629,7 +618,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Returns the class ID for this class. This is useful only for @@ -642,7 +631,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -734,7 +723,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * will operate correctly. A Safe Position is not necessarily a boundary itself. * * @param fromPosition the position in the input text to begin the iteration. - * @internal (private) */ int32_t handleSafePrevious(int32_t fromPosition); @@ -747,8 +735,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * fDictionaryCharCount the number of dictionary characters encountered. * If > 0, the segment will be further subdivided * fRuleStatusIndex Info from the state table indicating which rules caused the boundary. - * - * @internal (private) */ int32_t handleNext(); @@ -780,7 +766,6 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * given character c. * @param c A character in the dictionary set * @param locale The locale. - * @internal (private) */ const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c, const char* locale); @@ -799,7 +784,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { void dumpTables(); #endif /* U_HIDE_INTERNAL_API */ -#ifndef U_HIDE_DRAFT_API +#ifndef U_HIDE_INTERNAL_API /** * Register a new external break engine. The external break engine will be adopted. * Because ICU may choose to cache break engine internally, this must @@ -811,7 +796,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { */ static void U_EXPORT2 registerExternalBreakEngine( ExternalBreakEngine* toAdopt, UErrorCode& status); -#endif /* U_HIDE_DRAFT_API */ +#endif /* U_HIDE_INTERNAL_API */ }; diff --git a/deps/icu-small/source/common/unicode/resbund.h b/deps/icu-small/source/common/unicode/resbund.h index 30fc2ac0ab235e..03ff6faee239a7 100644 --- a/deps/icu-small/source/common/unicode/resbund.h +++ b/deps/icu-small/source/common/unicode/resbund.h @@ -209,8 +209,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return number of resources in a given resource. * @stable ICU 2.0 */ - int32_t - getSize(void) const; + int32_t getSize() const; /** * returns a string from a string resource type @@ -289,16 +288,14 @@ class U_COMMON_API ResourceBundle : public UObject { * @return true if there are more elements, false if there is no more elements * @stable ICU 2.0 */ - UBool - hasNext(void) const; + UBool hasNext() const; /** * Resets the internal context of a resource so that iteration starts from the first element. * * @stable ICU 2.0 */ - void - resetIterator(void); + void resetIterator(); /** * Returns the key associated with this resource. Not all the resources have a key - only @@ -307,8 +304,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a key associated to this resource, or nullptr if it doesn't have a key * @stable ICU 2.0 */ - const char* - getKey(void) const; + const char* getKey() const; /** * Gets the locale ID of the resource bundle as a string. @@ -317,9 +313,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return the locale ID of the resource bundle as a string * @stable ICU 2.0 */ - const char* - getName(void) const; - + const char* getName() const; /** * Returns the type of a resource. Available types are defined in enum UResType @@ -327,8 +321,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return type of the given resource. * @stable ICU 2.0 */ - UResType - getType(void) const; + UResType getType() const; /** * Returns the next resource in a given resource or nullptr if there are no more resources @@ -424,8 +417,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @see getVersion * @deprecated ICU 2.8 Use getVersion instead. */ - const char* - getVersionNumber(void) const; + const char* getVersionNumber() const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -445,8 +437,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a Locale object * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. */ - const Locale& - getLocale(void) const; + const Locale& getLocale() const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -459,7 +450,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a Locale object * @stable ICU 2.8 */ - const Locale + Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; #ifndef U_HIDE_INTERNAL_API /** diff --git a/deps/icu-small/source/common/unicode/schriter.h b/deps/icu-small/source/common/unicode/schriter.h index a2ab17982d1010..96f03604ade53a 100644 --- a/deps/icu-small/source/common/unicode/schriter.h +++ b/deps/icu-small/source/common/unicode/schriter.h @@ -156,14 +156,14 @@ class U_COMMON_API StringCharacterIterator : public UCharCharacterIterator { * @return a class ID for this object. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Return a class ID for this class (not really public) * @return a class ID for this class * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); protected: /** diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 7f58106fadb3b7..62c75d08bbc0ff 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -25,11 +25,9 @@ U_NAMESPACE_BEGIN // Forward declaration: -namespace number { -namespace impl { +namespace number::impl { class SimpleModifier; } -} /** * Formats simple patterns like "{1} was born in {0}". @@ -65,7 +63,7 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * Default constructor. * @stable ICU 57 */ - SimpleFormatter() : compiledPattern((char16_t)0) {} + SimpleFormatter() : compiledPattern(static_cast<char16_t>(0)) {} /** * Constructs a formatter from the pattern string. diff --git a/deps/icu-small/source/common/unicode/stringpiece.h b/deps/icu-small/source/common/unicode/stringpiece.h index df7f36089dd7c5..adb3681fe6ef73 100644 --- a/deps/icu-small/source/common/unicode/stringpiece.h +++ b/deps/icu-small/source/common/unicode/stringpiece.h @@ -32,6 +32,7 @@ #if U_SHOW_CPLUSPLUS_API #include <cstddef> +#include <string_view> #include <type_traits> #include "unicode/uobject.h" @@ -130,13 +131,13 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 65 */ template <typename T, - typename = typename std::enable_if< - (std::is_same<decltype(T().data()), const char*>::value + typename = std::enable_if_t< + (std::is_same_v<decltype(T().data()), const char*> #if defined(__cpp_char8_t) - || std::is_same<decltype(T().data()), const char8_t*>::value + || std::is_same_v<decltype(T().data()), const char8_t*> #endif ) && - std::is_same<decltype(T().size()), size_t>::value>::type> + std::is_same_v<decltype(T().size()), size_t>>> StringPiece(T str) : ptr_(reinterpret_cast<const char*>(str.data())), length_(static_cast<int32_t>(str.size())) {} @@ -176,6 +177,16 @@ class U_COMMON_API StringPiece : public UMemory { */ StringPiece(const StringPiece& x, int32_t pos, int32_t len); +#ifndef U_HIDE_INTERNAL_API + /** + * Converts to a std::string_view(). + * @internal + */ + inline operator std::string_view() const { + return {data(), static_cast<std::string_view::size_type>(size())}; + } +#endif // U_HIDE_INTERNAL_API + /** * Returns the string pointer. May be nullptr if it is empty. * @@ -322,7 +333,7 @@ class U_COMMON_API StringPiece : public UMemory { * @return true if the string data is equal * @stable ICU 4.8 */ -U_EXPORT UBool U_EXPORT2 +U_COMMON_API UBool U_EXPORT2 operator==(const StringPiece& x, const StringPiece& y); /** diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index 429d7883f15cd8..62108dfe3ea1f7 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -346,7 +346,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { virtual void write(StringTrieBuilder &builder) override; // Adds a unit with a final value. void add(int32_t c, int32_t value) { - units[length]=(char16_t)c; + units[length] = static_cast<char16_t>(c); equal[length]=nullptr; values[length]=value; ++length; @@ -354,7 +354,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { } // Adds a unit which leads to another match node. void add(int32_t c, Node *node) { - units[length]=(char16_t)c; + units[length] = static_cast<char16_t>(c); equal[length]=node; values[length]=0; ++length; diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index d1c1b483ab337e..4b623e691071dd 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -202,8 +202,8 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * * The titlecase break iterator can be provided to customize for arbitrary * styles, using rules and dictionaries beyond the standard iterators. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setText(), first() and next() methods of the * provided break iterator. @@ -312,8 +312,8 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, * * The titlecase break iterator can be provided to customize for arbitrary * styles, using rules and dictionaries beyond the standard iterators. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setUText(), first(), next() and close() methods of the * provided break iterator. diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 7470891338aa66..d33b8cf7f3c8ee 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -25,6 +25,7 @@ #ifndef UCHAR_H #define UCHAR_H +#include <stdbool.h> #include "unicode/utypes.h" #include "unicode/stringoptions.h" #include "unicode/ucpmap.h" @@ -53,14 +54,14 @@ U_CDECL_BEGIN /*==========================================================================*/ /** * Unicode version number, default for the current ICU version. - * The actual Unicode Character Database (UCD) data is stored in uprops.dat + * The actual Unicode Character Database (UCD) data is stored in uprops.icu * and may be generated from UCD files from a different Unicode version. * Call u_getUnicodeVersion to get the actual Unicode version of the data. * * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "15.1" +#define U_UNICODE_VERSION "17.0" /** * \file @@ -532,33 +533,37 @@ typedef enum UProperty { * @stable ICU 70 */ UCHAR_RGI_EMOJI=71, -#ifndef U_HIDE_DRAFT_API /** * Binary property IDS_Unary_Operator. * For programmatic determination of Ideographic Description Sequences. * - * @draft ICU 74 + * @stable ICU 74 */ UCHAR_IDS_UNARY_OPERATOR=72, /** * Binary property ID_Compat_Math_Start. * Used in mathematical identifier profile in UAX #31. - * @draft ICU 74 + * @stable ICU 74 */ UCHAR_ID_COMPAT_MATH_START=73, /** * Binary property ID_Compat_Math_Continue. * Used in mathematical identifier profile in UAX #31. - * @draft ICU 74 + * @stable ICU 74 */ UCHAR_ID_COMPAT_MATH_CONTINUE=74, -#endif // U_HIDE_DRAFT_API + /** + * Binary property Modifier_Combining_Mark. + * Used by the AMTRA algorithm in UAX #53. + * @stable ICU 76 + */ + UCHAR_MODIFIER_COMBINING_MARK=75, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for binary Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_BINARY_LIMIT=75, + UCHAR_BINARY_LIMIT=76, #endif // U_HIDE_DEPRECATED_API /** Enumerated property Bidi_Class. @@ -668,12 +673,25 @@ typedef enum UProperty { * @stable ICU 63 */ UCHAR_VERTICAL_ORIENTATION=0x1018, + /** + * Enumerated property Identifier_Status. + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * @stable ICU 75 + */ + UCHAR_IDENTIFIER_STATUS=0x1019, + /** + * Enumerated property Indic_Conjunct_Break. + * Used in the grapheme cluster break algorithm in UAX #29. + * @stable ICU 76 + */ + UCHAR_INDIC_CONJUNCT_BREAK=0x101A, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for enumerated/integer Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_INT_LIMIT=0x1019, + UCHAR_INT_LIMIT=0x101B, #endif // U_HIDE_DEPRECATED_API /** Bitmask property General_Category_Mask. @@ -774,12 +792,26 @@ typedef enum UProperty { UCHAR_SCRIPT_EXTENSIONS=0x7000, /** First constant for Unicode properties with unusual value types. @stable ICU 4.6 */ UCHAR_OTHER_PROPERTY_START=UCHAR_SCRIPT_EXTENSIONS, + /** + * Miscellaneous property Identifier_Type. + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Corresponds to u_hasIDType() and u_getIDTypes(). + * + * Each code point maps to a <i>set</i> of UIdentifierType values. + * + * @see u_hasIDType + * @see u_getIDTypes + * @stable ICU 75 + */ + UCHAR_IDENTIFIER_TYPE=0x7001, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for Unicode properties with unusual value types. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_OTHER_PROPERTY_LIMIT=0x7001, + UCHAR_OTHER_PROPERTY_LIMIT=0x7002, #endif // U_HIDE_DEPRECATED_API /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */ @@ -1926,6 +1958,48 @@ enum UBlockCode { /** @stable ICU 74 */ UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_I = 328, /*[2EBF0]*/ + // New blocks in Unicode 16.0 + + /** @stable ICU 76 */ + UBLOCK_EGYPTIAN_HIEROGLYPHS_EXTENDED_A = 329, /*[13460]*/ + /** @stable ICU 76 */ + UBLOCK_GARAY = 330, /*[10D40]*/ + /** @stable ICU 76 */ + UBLOCK_GURUNG_KHEMA = 331, /*[16100]*/ + /** @stable ICU 76 */ + UBLOCK_KIRAT_RAI = 332, /*[16D40]*/ + /** @stable ICU 76 */ + UBLOCK_MYANMAR_EXTENDED_C = 333, /*[116D0]*/ + /** @stable ICU 76 */ + UBLOCK_OL_ONAL = 334, /*[1E5D0]*/ + /** @stable ICU 76 */ + UBLOCK_SUNUWAR = 335, /*[11BC0]*/ + /** @stable ICU 76 */ + UBLOCK_SYMBOLS_FOR_LEGACY_COMPUTING_SUPPLEMENT = 336, /*[1CC00]*/ + /** @stable ICU 76 */ + UBLOCK_TODHRI = 337, /*[105C0]*/ + /** @stable ICU 76 */ + UBLOCK_TULU_TIGALARI = 338, /*[11380]*/ + + // New blocks in Unicode 17.0.0 + + /** @stable ICU 78 */ + UBLOCK_BERIA_ERFE = 339, /*[16EA0]*/ + /** @stable ICU 78 */ + UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_J = 340, /*[323B0]*/ + /** @stable ICU 78 */ + UBLOCK_MISCELLANEOUS_SYMBOLS_SUPPLEMENT = 341, /*[1CEC0]*/ + /** @stable ICU 78 */ + UBLOCK_SHARADA_SUPPLEMENT = 342, /*[11B60]*/ + /** @stable ICU 78 */ + UBLOCK_SIDETIC = 343, /*[10940]*/ + /** @stable ICU 78 */ + UBLOCK_TAI_YO = 344, /*[1E6C0]*/ + /** @stable ICU 78 */ + UBLOCK_TANGUT_COMPONENTS_SUPPLEMENT = 345, /*[18D80]*/ + /** @stable ICU 78 */ + UBLOCK_TOLONG_SIKI = 346, /*[11DB0]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1933,7 +2007,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 329, + UBLOCK_COUNT = 347, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ @@ -2228,6 +2302,10 @@ typedef enum UJoiningGroup { U_JG_THIN_YEH, /**< @stable ICU 70 */ U_JG_VERTICAL_TAIL, /**< @stable ICU 70 */ + U_JG_KASHMIRI_YEH, /**< @stable ICU 76 */ + + U_JG_THIN_NOON, /**< @stable ICU 78 */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UJoiningGroup value. @@ -2475,6 +2553,8 @@ typedef enum ULineBreak { U_LB_VIRAMA_FINAL = 46, /*[VF]*/ /** @stable ICU 74 */ U_LB_VIRAMA = 47, /*[VI]*/ + /** @stable ICU 78 */ + U_LB_UNAMBIGUOUS_HYPHEN = 48,/*[HH]*/ #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal ULineBreak value. @@ -2482,7 +2562,7 @@ typedef enum ULineBreak { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - U_LB_COUNT = 48 + U_LB_COUNT = 49 #endif // U_HIDE_DEPRECATED_API } ULineBreak; @@ -2676,8 +2756,33 @@ typedef enum UIndicSyllabicCategory { U_INSC_VOWEL_DEPENDENT, /** @stable ICU 63 */ U_INSC_VOWEL_INDEPENDENT, + /** @stable ICU 76 */ + U_INSC_REORDERING_KILLER, } UIndicSyllabicCategory; +/** + * Indic Conjunct Break constants. + * + * @see UCHAR_INDIC_CONJUNCT_BREAK + * @stable ICU 76 + */ +typedef enum UIndicConjunctBreak { + /* + * Note: UIndicConjunctBreak constants are parsed by preparseucd.py. + * It matches lines like + * U_INCB_<Unicode Indic_Conjunct_Break value name> + */ + + /** @stable ICU 76 */ + U_INCB_NONE, + /** @stable ICU 76 */ + U_INCB_CONSONANT, + /** @stable ICU 76 */ + U_INCB_EXTEND, + /** @stable ICU 76 */ + U_INCB_LINKER, +} UIndicConjunctBreak; + /** * Vertical Orientation constants. * @@ -2701,6 +2806,66 @@ typedef enum UVerticalOrientation { U_VO_UPRIGHT, } UVerticalOrientation; +/** + * Identifier Status constants. + * See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type. + * + * @see UCHAR_IDENTIFIER_STATUS + * @stable ICU 75 + */ +typedef enum UIdentifierStatus { + /* + * Note: UIdentifierStatus constants are parsed by preparseucd.py. + * It matches lines like + * U_ID_STATUS_<Unicode Identifier_Status value name> + */ + + /** @stable ICU 75 */ + U_ID_STATUS_RESTRICTED, + /** @stable ICU 75 */ + U_ID_STATUS_ALLOWED, +} UIdentifierStatus; + +/** + * Identifier Type constants. + * See https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type. + * + * @see UCHAR_IDENTIFIER_TYPE + * @stable ICU 75 + */ +typedef enum UIdentifierType { + /* + * Note: UIdentifierType constants are parsed by preparseucd.py. + * It matches lines like + * U_ID_TYPE_<Unicode Identifier_Type value name> + */ + + /** @stable ICU 75 */ + U_ID_TYPE_NOT_CHARACTER, + /** @stable ICU 75 */ + U_ID_TYPE_DEPRECATED, + /** @stable ICU 75 */ + U_ID_TYPE_DEFAULT_IGNORABLE, + /** @stable ICU 75 */ + U_ID_TYPE_NOT_NFKC, + /** @stable ICU 75 */ + U_ID_TYPE_NOT_XID, + /** @stable ICU 75 */ + U_ID_TYPE_EXCLUSION, + /** @stable ICU 75 */ + U_ID_TYPE_OBSOLETE, + /** @stable ICU 75 */ + U_ID_TYPE_TECHNICAL, + /** @stable ICU 75 */ + U_ID_TYPE_UNCOMMON_USE, + /** @stable ICU 75 */ + U_ID_TYPE_LIMITED_USE, + /** @stable ICU 75 */ + U_ID_TYPE_INCLUSION, + /** @stable ICU 75 */ + U_ID_TYPE_RECOMMENDED, +} UIdentifierType; + /** * Check a binary Unicode property for a code point. * @@ -2770,7 +2935,7 @@ u_stringHasBinaryProperty(const UChar *s, int32_t length, UProperty which); * @return the property as a set * @see UProperty * @see u_hasBinaryProperty - * @see Unicode::fromUSet + * @see UnicodeSet::fromUSet * @stable ICU 63 */ U_CAPI const USet * U_EXPORT2 @@ -3905,6 +4070,57 @@ u_isIDStart(UChar32 c); U_CAPI UBool U_EXPORT2 u_isIDPart(UChar32 c); +/** + * Does the set of Identifier_Type values code point c contain the given type? + * + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Each code point maps to a <i>set</i> of UIdentifierType values. + * + * @param c code point + * @param type Identifier_Type to check + * @return true if type is in Identifier_Type(c) + * @stable ICU 75 + */ +U_CAPI bool U_EXPORT2 +u_hasIDType(UChar32 c, UIdentifierType type); + +/** + * Writes code point c's Identifier_Type as a list of UIdentifierType values + * to the output types array and returns the number of types. + * + * Used for UTS #39 General Security Profile for Identifiers + * (https://www.unicode.org/reports/tr39/#General_Security_Profile). + * + * Each code point maps to a <i>set</i> of UIdentifierType values. + * There is always at least one type. + * The order of output values is undefined. + * Each type is output at most once; + * there cannot be more output values than UIdentifierType constants. + * In addition, only some of the types can be combined with others, + * and usually only a small number of types occur together. + * Future versions might add additional types. + * See UTS #39 and its data files for details. + * + * If there are more than capacity types to be written, then + * U_BUFFER_OVERFLOW_ERROR is set and the number of types is returned. + * (Usual ICU buffer handling behavior.) + * + * @param c code point + * @param types output array + * @param capacity capacity of the array + * @param pErrorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return number of values in c's Identifier_Type, + * written to types unless U_BUFFER_OVERFLOW_ERROR indicates insufficient capacity + * @stable ICU 75 + */ +U_CAPI int32_t U_EXPORT2 +u_getIDTypes(UChar32 c, UIdentifierType *types, int32_t capacity, UErrorCode *pErrorCode); + /** * Determines if the specified character should be regarded * as an ignorable character in an identifier, diff --git a/deps/icu-small/source/common/unicode/ucharstrie.h b/deps/icu-small/source/common/unicode/ucharstrie.h index fa1b55616c6599..ca4b46947045af 100644 --- a/deps/icu-small/source/common/unicode/ucharstrie.h +++ b/deps/icu-small/source/common/unicode/ucharstrie.h @@ -107,7 +107,7 @@ class U_COMMON_API UCharsTrie : public UMemory { */ uint64_t getState64() const { return (static_cast<uint64_t>(remainingMatchLength_ + 2) << kState64RemainingShift) | - (uint64_t)(pos_ - uchars_); + static_cast<uint64_t>(pos_ - uchars_); } /** @@ -493,7 +493,7 @@ class U_COMMON_API UCharsTrie : public UMemory { } static inline UStringTrieResult valueResult(int32_t node) { - return (UStringTrieResult)(USTRINGTRIE_INTERMEDIATE_VALUE-(node>>15)); + return static_cast<UStringTrieResult>(USTRINGTRIE_INTERMEDIATE_VALUE - (node >> 15)); } // Handles a branch node for both next(uchar) and next(string). diff --git a/deps/icu-small/source/common/unicode/uchriter.h b/deps/icu-small/source/common/unicode/uchriter.h index 9fae5e7de08fee..bd2f29877b9944 100644 --- a/deps/icu-small/source/common/unicode/uchriter.h +++ b/deps/icu-small/source/common/unicode/uchriter.h @@ -126,7 +126,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the hash code. * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const override; + virtual int32_t hashCode() const override; /** * Returns a new UCharCharacterIterator referring to the same @@ -144,7 +144,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t first(void) override; + virtual char16_t first() override; /** * Sets the iterator to refer to the first code unit in its @@ -154,7 +154,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range * @stable ICU 2.0 */ - virtual char16_t firstPostInc(void) override; + virtual char16_t firstPostInc() override; /** * Sets the iterator to refer to the first code point in its @@ -165,7 +165,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code point in its iteration range * @stable ICU 2.0 */ - virtual UChar32 first32(void) override; + virtual UChar32 first32() override; /** * Sets the iterator to refer to the first code point in its @@ -175,7 +175,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 first32PostInc(void) override; + virtual UChar32 first32PostInc() override; /** * Sets the iterator to refer to the last code unit in its @@ -184,7 +184,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the last code unit in its iteration range. * @stable ICU 2.0 */ - virtual char16_t last(void) override; + virtual char16_t last() override; /** * Sets the iterator to refer to the last code point in its @@ -193,7 +193,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the last code point in its iteration range. * @stable ICU 2.0 */ - virtual UChar32 last32(void) override; + virtual UChar32 last32() override; /** * Sets the iterator to refer to the "position"-th code unit @@ -223,14 +223,14 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the code unit the iterator currently refers to. * @stable ICU 2.0 */ - virtual char16_t current(void) const override; + virtual char16_t current() const override; /** * Returns the code point the iterator currently refers to. * @return the code point the iterator currently refers to. * @stable ICU 2.0 */ - virtual UChar32 current32(void) const override; + virtual UChar32 current32() const override; /** * Advances to the next code unit in the iteration range (toward @@ -239,7 +239,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the next code unit in the iteration range. * @stable ICU 2.0 */ - virtual char16_t next(void) override; + virtual char16_t next() override; /** * Gets the current code unit for returning and advances to the next code unit @@ -249,7 +249,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the current code unit. * @stable ICU 2.0 */ - virtual char16_t nextPostInc(void) override; + virtual char16_t nextPostInc() override; /** * Advances to the next code point in the iteration range (toward @@ -261,7 +261,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the next code point in the iteration range. * @stable ICU 2.0 */ - virtual UChar32 next32(void) override; + virtual UChar32 next32() override; /** * Gets the current code point for returning and advances to the next code point @@ -271,7 +271,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the current point. * @stable ICU 2.0 */ - virtual UChar32 next32PostInc(void) override; + virtual UChar32 next32PostInc() override; /** * Returns false if there are no more code units or code points @@ -291,7 +291,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the previous code unit in the iteration range. * @stable ICU 2.0 */ - virtual char16_t previous(void) override; + virtual char16_t previous() override; /** * Advances to the previous code point in the iteration range (toward @@ -300,7 +300,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the previous code point in the iteration range. * @stable ICU 2.0 */ - virtual UChar32 previous32(void) override; + virtual UChar32 previous32() override; /** * Returns false if there are no more code units or code points @@ -363,14 +363,14 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return a class ID for this class * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Return a class ID for this object (not really public) * @return a class ID for this object. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 20c173b662832d..4a7972c95b7574 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -344,8 +344,6 @@ ucnv_compareNames(const char *name1, const char *name2); * other than its an alias starting with the letters "cp". Please do not * associate any meaning to these aliases.</p> * - * \snippet samples/ucnv/convsamp.cpp ucnv_open - * * @param converterName Name of the coded character set table. * This may have options appended to the string. * IANA alias character set names, IBM CCSIDs starting with "ibm-", @@ -1986,7 +1984,6 @@ ucnv_usesFallback(const UConverter *cnv); * instead of the input signature bytes. * <p> * Usage: - * \snippet samples/ucnv/convsamp.cpp ucnv_detectUnicodeSignature * * @param source The source string in which the signature should be detected. * @param sourceLength Length of the input string, or -1 if terminated with a NUL byte. diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 3818ca02ef85d2..c0488d502bfc64 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -413,6 +413,17 @@ # define UCONFIG_NO_FORMATTING 0 #endif +/** + * \def UCONFIG_NO_MF2 + * This switch turns off the experimental MessageFormat 2.0 API. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ +#ifndef UCONFIG_NO_MF2 +# define UCONFIG_NO_MF2 0 +#endif + /** * \def UCONFIG_NO_TRANSLITERATION * This switch turns off transliteration. diff --git a/deps/icu-small/source/common/unicode/uidna.h b/deps/icu-small/source/common/unicode/uidna.h index 24a81ceaddf58d..362a2dcbe65a61 100644 --- a/deps/icu-small/source/common/unicode/uidna.h +++ b/deps/icu-small/source/common/unicode/uidna.h @@ -49,11 +49,19 @@ */ enum { /** - * Default options value: None of the other options are set. + * Default options value: UTS #46 nontransitional processing. * For use in static worker and factory methods. + * + * Since ICU 76, this is the same as + * UIDNA_NONTRANSITIONAL_TO_ASCII | UIDNA_NONTRANSITIONAL_TO_UNICODE, + * corresponding to Unicode 15.1 UTS #46 deprecating transitional processing. + * (These options are ignored by the IDNA2003 implementation.) + * + * Before ICU 76, this constant did not set any of the options. + * * @stable ICU 2.6 */ - UIDNA_DEFAULT=0, + UIDNA_DEFAULT=0x30, #ifndef U_HIDE_DEPRECATED_API /** * Option to allow unassigned code points in domain names and labels. @@ -91,19 +99,27 @@ enum { /** * IDNA option for nontransitional processing in ToASCII(). * For use in static worker and factory methods. + * * <p>By default, ToASCII() uses transitional processing. + * Unicode 15.1 UTS #46 deprecated transitional processing. + * * <p>This option is ignored by the IDNA2003 implementation. * (This is only relevant for compatibility of newer IDNA implementations with IDNA2003.) * @stable ICU 4.6 + * @see UIDNA_DEFAULT */ UIDNA_NONTRANSITIONAL_TO_ASCII=0x10, /** * IDNA option for nontransitional processing in ToUnicode(). * For use in static worker and factory methods. + * * <p>By default, ToUnicode() uses transitional processing. + * Unicode 15.1 UTS #46 deprecated transitional processing. + * * <p>This option is ignored by the IDNA2003 implementation. * (This is only relevant for compatibility of newer IDNA implementations with IDNA2003.) * @stable ICU 4.6 + * @see UIDNA_DEFAULT */ UIDNA_NONTRANSITIONAL_TO_UNICODE=0x20, /** @@ -134,6 +150,8 @@ typedef struct UIDNA UIDNA; /**< C typedef for struct UIDNA. @stable ICU 4.6 */ * For details about the UTS #46 implementation see the IDNA C++ class in idna.h. * * @param options Bit set to modify the processing and error checking. + * These should include UIDNA_DEFAULT, or + * UIDNA_NONTRANSITIONAL_TO_ASCII | UIDNA_NONTRANSITIONAL_TO_UNICODE. * See option bit set values in uidna.h. * @param pErrorCode Standard ICU error code. Its input value must * pass the U_SUCCESS() test, or else the function returns diff --git a/deps/icu-small/source/common/unicode/uloc.h b/deps/icu-small/source/common/unicode/uloc.h index 21179c1b628e1c..9cd7f5e1b0d610 100644 --- a/deps/icu-small/source/common/unicode/uloc.h +++ b/deps/icu-small/source/common/unicode/uloc.h @@ -399,6 +399,9 @@ uloc_setDefault(const char* localeID, /** * Gets the language code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the ISO language code with * @param language the language code for localeID * @param languageCapacity the size of the language buffer to store the @@ -417,6 +420,9 @@ uloc_getLanguage(const char* localeID, /** * Gets the script code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the ISO language code with * @param script the language code for localeID * @param scriptCapacity the size of the language buffer to store the @@ -435,6 +441,9 @@ uloc_getScript(const char* localeID, /** * Gets the country code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the country code with * @param country the country code for localeID * @param countryCapacity the size of the country buffer to store the @@ -453,6 +462,9 @@ uloc_getCountry(const char* localeID, /** * Gets the variant code for the specified locale. * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * @param localeID the locale to get the variant code with * @param variant the variant code for localeID * @param variantCapacity the size of the variant buffer to store the @@ -471,6 +483,10 @@ uloc_getVariant(const char* localeID, /** * Gets the full name for the specified locale. + * + * This function may return with a failure error code for certain kinds of inputs + * but does not fully check for well-formed locale IDs / language tags. + * * Note: This has the effect of 'canonicalizing' the ICU locale ID to * a certain extent. Upper and lower case are set as needed. * It does NOT map aliased names in any way. @@ -1158,19 +1174,20 @@ uloc_getLocaleForLCID(uint32_t hostID, char *locale, int32_t localeCapacity, * * If localeID is already in the maximal form, or there is no data available * for maximization, it will be copied to the output buffer. For example, - * "und-Zzzz" cannot be maximized, since there is no reasonable maximization. + * "sh" cannot be maximized, since there is no reasonable maximization. * * Examples: * + * "und_Zzzz" maximizes to "en_Latn_US" + * * "en" maximizes to "en_Latn_US" * - * "de" maximizes to "de_Latn_US" + * "de" maximizes to "de_Latn_DE" * * "sr" maximizes to "sr_Cyrl_RS" * - * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) + * "zh_Hani" maximizes to "zh_Hani_CN" * - * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) * * @param localeID The locale to maximize * @param maximizedLocaleID The maximized locale diff --git a/deps/icu-small/source/common/unicode/ulocale.h b/deps/icu-small/source/common/unicode/ulocale.h index 33e92844bc1eea..1b3af3a5f26d62 100644 --- a/deps/icu-small/source/common/unicode/ulocale.h +++ b/deps/icu-small/source/common/unicode/ulocale.h @@ -13,16 +13,15 @@ * \brief C API: Locale ID functionality similar to C++ class Locale */ -#ifndef U_HIDE_DRAFT_API /** * Opaque C service object type for the locale API - * @draft ICU 74 + * @stable ICU 74 */ struct ULocale; /** * C typedef for struct ULocale. - * @draft ICU 74 + * @stable ICU 74 */ typedef struct ULocale ULocale; @@ -37,7 +36,7 @@ typedef struct ULocale ULocale; * @param err the error code * @return the locale. * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI ULocale* U_EXPORT2 ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err); @@ -53,7 +52,7 @@ ulocale_openForLocaleID(const char* localeID, int32_t length, UErrorCode* err); * @param err the error code * @return the locale. * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI ULocale* U_EXPORT2 ulocale_openForLanguageTag(const char* tag, int32_t length, UErrorCode* err); @@ -62,7 +61,7 @@ ulocale_openForLanguageTag(const char* tag, int32_t length, UErrorCode* err); * Close the locale and destroy it's internal states. * * @param locale the locale - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocale_close(ULocale* locale); @@ -72,7 +71,7 @@ ulocale_close(ULocale* locale); * * @param locale the locale * @return the language code of the locale. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getLanguage(const ULocale* locale); @@ -82,7 +81,7 @@ ulocale_getLanguage(const ULocale* locale); * * @param locale the locale * @return A pointer to the script. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getScript(const ULocale* locale); @@ -92,7 +91,7 @@ ulocale_getScript(const ULocale* locale); * * @param locale the locale * @return A pointer to the region. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getRegion(const ULocale* locale); @@ -102,7 +101,7 @@ ulocale_getRegion(const ULocale* locale); * * @param locale the locale * @return A pointer to the variant. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getVariant(const ULocale* locale); @@ -115,7 +114,7 @@ ulocale_getVariant(const ULocale* locale); * * @param locale the locale * @return A pointer to "name". - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getLocaleID(const ULocale* locale); @@ -126,7 +125,7 @@ ulocale_getLocaleID(const ULocale* locale); * * @param locale the locale * @return A pointer to "base name". - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 ulocale_getBaseName(const ULocale* locale); @@ -136,7 +135,7 @@ ulocale_getBaseName(const ULocale* locale); * * @param locale the locale * @return false if it is a real locale, true if it is a bogus locale - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI bool U_EXPORT2 ulocale_isBogus(const ULocale* locale); @@ -148,7 +147,7 @@ ulocale_isBogus(const ULocale* locale); * @param err the error code * @return pointer to UEnumeration, or nullptr if there are no keywords. * Client must call uenum_close() to dispose the returned value. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI UEnumeration* U_EXPORT2 ulocale_getKeywords(const ULocale* locale, UErrorCode *err); @@ -160,7 +159,7 @@ ulocale_getKeywords(const ULocale* locale, UErrorCode *err); * @param err the error code * @return pointer to UEnumeration, or nullptr if there are no keywords. * Client must call uenum_close() to dispose the returned value. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI UEnumeration* U_EXPORT2 ulocale_getUnicodeKeywords(const ULocale* locale, UErrorCode *err); @@ -178,7 +177,7 @@ ulocale_getUnicodeKeywords(const ULocale* locale, UErrorCode *err); * @param valueBuffer The buffer to receive the value. * @param valueBufferCapacity The capacity of receiving valueBuffer. * @param err the error code - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 ulocale_getKeywordValue( @@ -198,7 +197,7 @@ ulocale_getKeywordValue( * @param valueBuffer The buffer to receive the Unicode value. * @param valueBufferCapacity The capacity of receiving valueBuffer. * @param err the error code - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 ulocale_getUnicodeKeywordValue( @@ -216,7 +215,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 74 + * @stable ICU 74 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocalePointer, ULocale, ulocale_close); @@ -224,6 +223,4 @@ U_NAMESPACE_END #endif /* U_SHOW_CPLUSPLUS_API */ -#endif /* U_HIDE_DRAFT_API */ - #endif /*_ULOCALE */ diff --git a/deps/icu-small/source/common/unicode/ulocbuilder.h b/deps/icu-small/source/common/unicode/ulocbuilder.h index f2e98612f0a012..ce61995bde6260 100644 --- a/deps/icu-small/source/common/unicode/ulocbuilder.h +++ b/deps/icu-small/source/common/unicode/ulocbuilder.h @@ -12,17 +12,15 @@ * \brief C API: Builder API for Locale */ -#ifndef U_HIDE_DRAFT_API - /** * Opaque C service object type for the locale builder API - * @draft ICU 74 + * @stable ICU 74 */ struct ULocaleBuilder; /** * C typedef for struct ULocaleBuilder. - * @draft ICU 74 + * @stable ICU 74 */ typedef struct ULocaleBuilder ULocaleBuilder; @@ -62,7 +60,7 @@ typedef struct ULocaleBuilder ULocaleBuilder; * UErrorCode, then track the error of the validation of the input parameter * into the internal UErrorCode. * - * @draft ICU 74 + * @stable ICU 74 */ /** @@ -71,15 +69,15 @@ typedef struct ULocaleBuilder ULocaleBuilder; * empty string. The created builder should be destroyed by calling * ulocbld_close(); * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI ULocaleBuilder* U_EXPORT2 -ulocbld_open(); +ulocbld_open(void); /** * Close the builder and destroy it's internal states. * @param builder the builder - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_close(ULocaleBuilder* builder); @@ -97,7 +95,7 @@ ulocbld_close(ULocaleBuilder* builder); * @param length the length of the locale; if negative, then the locale need to be * null terminated, * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setLocale(ULocaleBuilder* builder, const char* locale, int32_t length); @@ -113,7 +111,7 @@ ulocbld_setLocale(ULocaleBuilder* builder, const char* locale, int32_t length); * @param locale the locale, a ULocale* pointer. The builder adopts the locale * after the call and the client must not delete it. * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_adoptULocale(ULocaleBuilder* builder, ULocale* locale); @@ -136,7 +134,7 @@ ulocbld_adoptULocale(ULocaleBuilder* builder, ULocale* locale); * the length is non-negative) * @param length the length of the tag; if negative, then the tag need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setLanguageTag(ULocaleBuilder* builder, const char* tag, int32_t length); @@ -156,7 +154,7 @@ ulocbld_setLanguageTag(ULocaleBuilder* builder, const char* tag, int32_t length) * the length is non-negative) * @param length the length of the language; if negative, then the language need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setLanguage(ULocaleBuilder* builder, const char* language, int32_t length); @@ -177,7 +175,7 @@ ulocbld_setLanguage(ULocaleBuilder* builder, const char* language, int32_t lengt * the length is non-negative) * @param length the length of the script; if negative, then the script need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setScript(ULocaleBuilder* builder, const char* script, int32_t length); @@ -201,7 +199,7 @@ ulocbld_setScript(ULocaleBuilder* builder, const char* script, int32_t length); * the length is non-negative) * @param length the length of the region; if negative, then the region need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setRegion(ULocaleBuilder* builder, const char* region, int32_t length); @@ -227,7 +225,7 @@ ulocbld_setRegion(ULocaleBuilder* builder, const char* region, int32_t length); * the length is non-negative) * @param length the length of the variant; if negative, then the variant need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setVariant(ULocaleBuilder* builder, const char* variant, int32_t length); @@ -253,7 +251,7 @@ ulocbld_setVariant(ULocaleBuilder* builder, const char* variant, int32_t length) * the length is non-negative) * @param length the length of the value; if negative, then the value need to be * null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setExtension(ULocaleBuilder* builder, char key, const char* value, int32_t length); @@ -282,7 +280,7 @@ ulocbld_setExtension(ULocaleBuilder* builder, char key, const char* value, int32 * @param typeLength the length of the type; if negative, then the type need to * be null terminated, * @return This builder. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_setUnicodeLocaleKeyword(ULocaleBuilder* builder, @@ -299,7 +297,7 @@ ulocbld_setUnicodeLocaleKeyword(ULocaleBuilder* builder, * terminated when the length is non-negative) * @param length the length of the attribute; if negative, then the attribute * need to be null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_addUnicodeLocaleAttribute( @@ -318,7 +316,7 @@ ulocbld_addUnicodeLocaleAttribute( * terminated when the length is non-negative) * @param length the length of the attribute; if negative, then the attribute * need to be null terminated, - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_removeUnicodeLocaleAttribute( @@ -329,7 +327,7 @@ ulocbld_removeUnicodeLocaleAttribute( * <p>This method clears the internal UErrorCode. * * @param builder the builder - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_clear(ULocaleBuilder* builder); @@ -339,7 +337,7 @@ ulocbld_clear(ULocaleBuilder* builder); * Language, script, region and variant are unchanged. * * @param builder the builder - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI void U_EXPORT2 ulocbld_clearExtensions(ULocaleBuilder* builder); @@ -358,7 +356,7 @@ ulocbld_clearExtensions(ULocaleBuilder* builder); * @param localeCapacity the size of the locale buffer to store the locale id * @param err the error code * @return the length of the locale id in buffer - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 ulocbld_buildLocaleID(ULocaleBuilder* builder, char* locale, @@ -377,7 +375,7 @@ ulocbld_buildLocaleID(ULocaleBuilder* builder, char* locale, * @param err the error code. * @return the locale, a ULocale* pointer. The created ULocale must be * destroyed by calling {@link ulocale_close}. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI ULocale* U_EXPORT2 ulocbld_buildULocale(ULocaleBuilder* builder, UErrorCode* err); @@ -397,7 +395,7 @@ ulocbld_buildULocale(ULocaleBuilder* builder, UErrorCode* err); * tag * @param err the error code * @return the length of the language tag in buffer - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 ulocbld_buildLanguageTag(ULocaleBuilder* builder, char* language, @@ -412,7 +410,7 @@ ulocbld_buildLanguageTag(ULocaleBuilder* builder, char* language, * Unchanged if there is no such error or if outErrorCode * already contained an error. * @return true if U_FAILURE(*outErrorCode) - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI UBool U_EXPORT2 ulocbld_copyErrorTo(const ULocaleBuilder* builder, UErrorCode *outErrorCode); @@ -428,7 +426,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 74 + * @stable ICU 74 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalULocaleBuilderPointer, ULocaleBuilder, ulocbld_close); @@ -436,6 +434,4 @@ U_NAMESPACE_END #endif /* U_SHOW_CPLUSPLUS_API */ -#endif /* U_HIDE_DRAFT_API */ - #endif // __ULOCBUILDER_H__ diff --git a/deps/icu-small/source/common/unicode/umachine.h b/deps/icu-small/source/common/unicode/umachine.h index 545abef5956964..afa7c6afde838b 100644 --- a/deps/icu-small/source/common/unicode/umachine.h +++ b/deps/icu-small/source/common/unicode/umachine.h @@ -119,6 +119,28 @@ /** Obsolete/same as U_CAPI; was used to declare a function as an internal ICU C API */ #define U_INTERNAL U_CAPI +/** + * \def U_FORCE_INLINE + * Forces function inlining on compilers that are known to support it. + * Place this before specifiers like "static" and "explicit". + * + * This does not replace the "inline" keyword which suspends the One Definition Rule (ODR) + * in addition to optionally serving as an inlining hint to the compiler. + * + * @internal + */ +#ifdef U_FORCE_INLINE + // already defined +#elif defined(U_IN_DOXYGEN) +# define U_FORCE_INLINE inline +#elif (defined(__clang__) && __clang__) || U_GCC_MAJOR_MINOR != 0 +# define U_FORCE_INLINE [[gnu::always_inline]] +#elif defined(U_REAL_MSVC) +# define U_FORCE_INLINE __forceinline +#else +# define U_FORCE_INLINE inline +#endif + // Before ICU 65, function-like, multi-statement ICU macros were just defined as // series of statements wrapped in { } blocks and the caller could choose to // either treat them as if they were actual functions and end the invocation @@ -370,22 +392,14 @@ typedef int8_t UBool; #if 1 // #if 1 is normal. UChar defaults to char16_t in C++. // For configuration testing of UChar=uint16_t temporarily change this to #if 0. - // The intltest Makefile #defines UCHAR_TYPE=char16_t, - // so we only #define it to uint16_t if it is undefined so far. -#elif !defined(UCHAR_TYPE) +#else # define UCHAR_TYPE uint16_t #endif -#if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ - defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) - // Inside the ICU library code, never configurable. +#if defined(U_ALL_IMPLEMENTATION) || !defined(UCHAR_TYPE) typedef char16_t UChar; -#elif defined(UCHAR_TYPE) - typedef UCHAR_TYPE UChar; -#elif U_CPLUSPLUS_VERSION != 0 - typedef char16_t UChar; // C++ #else - typedef uint16_t UChar; // C + typedef UCHAR_TYPE UChar; #endif /** diff --git a/deps/icu-small/source/common/unicode/unifunct.h b/deps/icu-small/source/common/unicode/unifunct.h index 8751302494bcdb..4aeb0f5d7da530 100644 --- a/deps/icu-small/source/common/unicode/unifunct.h +++ b/deps/icu-small/source/common/unicode/unifunct.h @@ -83,7 +83,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID <b>polymorphically</b>. This method @@ -100,7 +100,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * different class IDs. * @stable ICU 2.4 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; /** * Set the data object associated with this functor. The data diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 84774d9f36ecf6..f9eb123e073660 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -313,7 +313,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { char16_t *pat = nullptr; int32_t patLen = 0; - UVector* strings = nullptr; // maintained in sorted order + UVector* strings_ = nullptr; // maintained in sorted order UnicodeSetStringSpan *stringSpan = nullptr; /** @@ -333,7 +333,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see setToBogus() * @stable ICU 4.0 */ - inline UBool isBogus(void) const; + inline UBool isBogus() const; /** * Make this UnicodeSet object invalid. @@ -495,7 +495,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return <tt>true</tt> if the specified set is equal to this set. * @stable ICU 2.0 */ - virtual bool operator==(const UnicodeSet& o) const; + bool operator==(const UnicodeSet& o) const; /** * Compares the specified object with this set for equality. Returns @@ -522,7 +522,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see Object#hashCode() * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const; + int32_t hashCode() const; /** * Get a UnicodeSet pointer from a USet @@ -792,7 +792,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @stable ICU 2.0 * @see getRangeCount */ - virtual int32_t size(void) const; + int32_t size() const; /** * Returns <tt>true</tt> if this set contains no elements. @@ -800,7 +800,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return <tt>true</tt> if this set contains no elements. * @stable ICU 2.0 */ - virtual UBool isEmpty(void) const; + UBool isEmpty() const; /** * @return true if this set contains multi-character strings or the empty string. @@ -825,7 +825,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return true if the test condition is met * @stable ICU 2.0 */ - virtual UBool contains(UChar32 start, UChar32 end) const; + UBool contains(UChar32 start, UChar32 end) const; /** * Returns <tt>true</tt> if this set contains the given @@ -843,7 +843,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return true if the test condition is met * @stable ICU 2.4 */ - virtual UBool containsAll(const UnicodeSet& c) const; + UBool containsAll(const UnicodeSet& c) const; /** * Returns true if this set contains all the characters @@ -1021,7 +1021,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * Implement UnicodeMatcher::matches() * @stable ICU 2.4 */ - virtual UMatchDegree matches(const Replaceable& text, + UMatchDegree matches(const Replaceable& text, int32_t& offset, int32_t limit, UBool incremental) override; @@ -1102,6 +1102,119 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { */ UChar32 charAt(int32_t index) const; + /** + * Returns a C++ "range" for iterating over the code points of this set. + * + * \code + * UnicodeSet set(u"[abcçカ🚴]", errorCode); + * for (UChar32 c : set.codePoints()) { + * printf("set.codePoint U+%04lx\n", (long)c); + * } + * \endcode + * + * @return a "range" object for iterating over the code points of this set. + * @stable ICU 76 + * @see ranges + * @see strings + * @see begin + * @see end + */ + inline U_HEADER_NESTED_NAMESPACE::USetCodePoints codePoints() const { + return U_HEADER_NESTED_NAMESPACE::USetCodePoints(toUSet()); + } + + /** + * Returns a C++ "range" for iterating over the code point ranges of this set. + * + * \code + * UnicodeSet set(u"[abcçカ🚴]", errorCode); + * for (auto [start, end] : set.ranges()) { + * printf("set.range U+%04lx..U+%04lx\n", (long)start, (long)end); + * } + * for (auto range : set.ranges()) { + * for (UChar32 c : range) { + * printf("set.range.c U+%04lx\n", (long)c); + * } + * } + * \endcode + * + * @return a "range" object for iterating over the code point ranges of this set. + * @stable ICU 76 + * @see codePoints + * @see strings + * @see begin + * @see end + */ + inline U_HEADER_NESTED_NAMESPACE::USetRanges ranges() const { + return U_HEADER_NESTED_NAMESPACE::USetRanges(toUSet()); + } + + /** + * Returns a C++ "range" for iterating over the empty and multi-character strings of this set. + * Returns each string as a std::u16string_view without copying its contents. + * + * \code + * UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); + * for (auto s : set.strings()) { + * UnicodeString us(s); + * std::string u8; + * printf("set.string length %ld \"%s\"\n", (long)s.length(), us.toUTF8String(u8).c_str()); + * } + * \endcode + * + * @return a "range" object for iterating over the strings of this set. + * @stable ICU 76 + * @see codePoints + * @see ranges + * @see begin + * @see end + */ + inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const { + return U_HEADER_NESTED_NAMESPACE::USetStrings(toUSet()); + } + +#ifndef U_HIDE_DRAFT_API + /** + * Returns a C++ iterator for iterating over all of the elements of this set. + * Convenient all-in one iteration, but creates a std::u16string for each + * code point or string. + * (Similar to how Java UnicodeSet *is an* Iterable<String>.) + * + * Code points are returned first, then empty and multi-character strings. + * + * \code + * UnicodeSet set(u"[abcçカ🚴{}{abc}{de}]", errorCode); + * for (auto el : set) { + * UnicodeString us(el); + * std::string u8; + * printf("set.element length %ld \"%s\"\n", (long)us.length(), us.toUTF8String(u8).c_str()); + * } + * \endcode + * + * @return an all-elements iterator. + * @draft ICU 77 + * @see end + * @see codePoints + * @see ranges + * @see strings + */ + inline U_HEADER_NESTED_NAMESPACE::USetElementIterator begin() const { + return U_HEADER_NESTED_NAMESPACE::USetElements(toUSet()).begin(); + } + + /** + * @return an exclusive-end sentinel for iterating over all of the elements of this set. + * @draft ICU 77 + * @see begin + * @see codePoints + * @see ranges + * @see strings + */ + inline U_HEADER_NESTED_NAMESPACE::USetElementIterator end() const { + return U_HEADER_NESTED_NAMESPACE::USetElements(toUSet()).end(); + } +#endif // U_HIDE_DRAFT_API + /** * Adds the specified range to this set if it is not already * present. If this set already contains the specified range, @@ -1116,7 +1229,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * to this set. * @stable ICU 2.0 */ - virtual UnicodeSet& add(UChar32 start, UChar32 end); + UnicodeSet& add(UChar32 start, UChar32 end); /** * Adds the specified character to this set if it is not already @@ -1222,7 +1335,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param end last character, inclusive, of range * @stable ICU 2.0 */ - virtual UnicodeSet& retain(UChar32 start, UChar32 end); + UnicodeSet& retain(UChar32 start, UChar32 end); /** @@ -1260,7 +1373,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * from this set. * @stable ICU 2.0 */ - virtual UnicodeSet& remove(UChar32 start, UChar32 end); + UnicodeSet& remove(UChar32 start, UChar32 end); /** * Removes the specified character from this set if it is present. @@ -1297,7 +1410,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - virtual UnicodeSet& complement(); + UnicodeSet& complement(); /** * Complements the specified range in this set. Any character in @@ -1311,7 +1424,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param end last character, inclusive, of range * @stable ICU 2.0 */ - virtual UnicodeSet& complement(UChar32 start, UChar32 end); + UnicodeSet& complement(UChar32 start, UChar32 end); /** * Complements the specified character in this set. The character @@ -1348,7 +1461,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #add(UChar32, UChar32) * @stable ICU 2.0 */ - virtual UnicodeSet& addAll(const UnicodeSet& c); + UnicodeSet& addAll(const UnicodeSet& c); /** * Retains only the elements in this set that are contained in the @@ -1361,7 +1474,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param c set that defines which elements this set will retain. * @stable ICU 2.0 */ - virtual UnicodeSet& retainAll(const UnicodeSet& c); + UnicodeSet& retainAll(const UnicodeSet& c); /** * Removes from this set all of its elements that are contained in the @@ -1374,7 +1487,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * this set. * @stable ICU 2.0 */ - virtual UnicodeSet& removeAll(const UnicodeSet& c); + UnicodeSet& removeAll(const UnicodeSet& c); /** * Complements in this set all elements contained in the specified @@ -1386,7 +1499,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * this set. * @stable ICU 2.4 */ - virtual UnicodeSet& complementAll(const UnicodeSet& c); + UnicodeSet& complementAll(const UnicodeSet& c); /** * Removes all of the elements from this set. This set will be @@ -1394,7 +1507,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - virtual UnicodeSet& clear(void); + UnicodeSet& clear(); /** * Close this set over the given attribute. For the attribute @@ -1431,7 +1544,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a reference to this set. * @stable ICU 4.2 */ - virtual UnicodeSet &removeAllStrings(); + UnicodeSet &removeAllStrings(); /** * Iteration method that returns the number of ranges contained in @@ -1440,7 +1553,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #getRangeEnd * @stable ICU 2.4 */ - virtual int32_t getRangeCount(void) const; + int32_t getRangeCount() const; /** * Iteration method that returns the first character in the @@ -1449,7 +1562,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #getRangeEnd * @stable ICU 2.4 */ - virtual UChar32 getRangeStart(int32_t index) const; + UChar32 getRangeStart(int32_t index) const; /** * Iteration method that returns the last character in the @@ -1458,7 +1571,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #getRangeEnd * @stable ICU 2.4 */ - virtual UChar32 getRangeEnd(int32_t index) const; + UChar32 getRangeEnd(int32_t index) const; /** * Serializes this set into an array of 16-bit integers. Serialization @@ -1516,7 +1629,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.4 */ - virtual UnicodeSet& compact(); + UnicodeSet& compact(); /** * Return the class ID for this class. This is useful only for @@ -1529,7 +1642,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Implement UnicodeFunctor API. @@ -1539,9 +1652,9 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * different class IDs. * @stable ICU 2.4 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; -private: + private: // Private API for the USet API @@ -1602,7 +1715,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { bool ensureBufferCapacity(int32_t newLen); - void swapBuffers(void); + void swapBuffers(); UBool allocateStrings(UErrorCode &status); int32_t stringsSize() const; @@ -1731,7 +1844,7 @@ inline bool UnicodeSet::operator!=(const UnicodeSet& o) const { } inline UBool UnicodeSet::isFrozen() const { - return (UBool)(bmpSet!=nullptr || stringSpan!=nullptr); + return bmpSet != nullptr || stringSpan != nullptr; } inline UBool UnicodeSet::containsSome(UChar32 start, UChar32 end) const { @@ -1747,7 +1860,7 @@ inline UBool UnicodeSet::containsSome(const UnicodeString& s) const { } inline UBool UnicodeSet::isBogus() const { - return (UBool)(fFlags & kIsBogus); + return fFlags & kIsBogus; } inline UnicodeSet *UnicodeSet::fromUSet(USet *uset) { diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index 4074e8d07b248e..161b84527a60a9 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -33,6 +33,7 @@ #if U_SHOW_CPLUSPLUS_API #include <cstddef> +#include <string_view> #include "unicode/char16ptr.h" #include "unicode/rep.h" #include "unicode/std_string.h" @@ -97,16 +98,19 @@ class UnicodeStringAppendable; // unicode/appendable.h #define US_INV icu::UnicodeString::kInvariant /** - * Unicode String literals in C++. + * \def UNICODE_STRING + * Obsolete macro approximating UnicodeString literals. * - * Note: these macros are not recommended for new code. - * Prior to the availability of C++11 and u"unicode string literals", - * these macros were provided for portability and efficiency when + * Prior to the availability of C++11 and u"UTF-16 string literals", + * this macro was provided for portability and efficiency when * initializing UnicodeStrings from literals. * - * They work only for strings that contain "invariant characters", i.e., - * only latin letters, digits, and some punctuation. - * See utypes.h for details. + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode * * The string parameter must be a C string literal. * The length of the string, not including the terminating @@ -121,16 +125,12 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * Unicode String literals in C++. - * Dependent on the platform properties, different UnicodeString - * constructors should be used to create a UnicodeString object from - * a string literal. - * The macros are defined for improved performance. - * They work only for strings that contain "invariant characters", i.e., - * only latin letters, digits, and some punctuation. - * See utypes.h for details. + * Obsolete macro approximating UnicodeString literals. + * See UNICODE_STRING. * * The string parameter must be a C string literal. * @stable ICU 2.0 + * @see UNICODE_STRING */ #define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1) @@ -215,6 +215,10 @@ class UnicodeStringAppendable; // unicode/appendable.h * * The UnicodeString equivalent of std::string’s clear() is remove(). * + * Starting with ICU 78, a UnicodeString is a C++ "range" of char16_t code units. + * utfStringCodePoints() and unsafeUTFStringCodePoints() can be used to iterate over + * the code points. + * * A UnicodeString may "alias" an external array of characters * (that is, point to it, rather than own the array) * whose lifetime must then at least match the lifetime of the aliasing object. @@ -289,12 +293,17 @@ class UnicodeStringAppendable; // unicode/appendable.h * [User Guide Strings chapter](https://unicode-org.github.io/icu/userguide/strings#maximizing-performance-with-the-unicodestring-storage-model). * * @see utf.h + * @see utfiterator.h + * @see utfStringCodePoints + * @see unsafeUTFStringCodePoints * @see CharacterIterator * @stable ICU 2.0 */ class U_COMMON_API UnicodeString : public Replaceable { public: + /** C++ boilerplate @internal */ + using value_type = char16_t; /** * Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor @@ -327,6 +336,28 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline bool operator== (const UnicodeString& text) const; + /** + * Equality operator. Performs only bitwise comparison with `text` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * + * For performance, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str = ...; + * if (str == u"literal") { ... } + * \endcode + * @param text The string view to compare to this string. + * @return true if `text` contains the same characters as this one, false otherwise. + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + inline bool operator==(const S &text) const { + std::u16string_view sv(internal::toU16StringView(text)); + uint32_t len; // unsigned to avoid a compiler warning + return !isBogus() && (len = length()) == sv.length() && doEquals(sv.data(), len); + } + /** * Inequality operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. @@ -336,6 +367,28 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline bool operator!= (const UnicodeString& text) const; + /** + * Inequality operator. Performs only bitwise comparison with `text` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * + * For performance, you can use std::u16string_view literals with compile-time + * length determination: + * \code + * #include <string_view> + * using namespace std::string_view_literals; + * UnicodeString str = ...; + * if (str != u"literal"sv) { ... } + * \endcode + * @param text The string view to compare to this string. + * @return false if `text` contains the same characters as this one, true otherwise. + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + inline bool operator!=(const S &text) const { + return !operator==(text); + } + /** * Greater than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. @@ -1611,9 +1664,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline int32_t extract(int32_t start, - int32_t startLength, - char *target, - const char *codepage = 0) const; + int32_t startLength, + char* target, + const char* codepage = nullptr) const; /** * Copy the characters in the range @@ -1719,7 +1772,8 @@ class U_COMMON_API UnicodeString : public Replaceable * Unpaired surrogates are replaced with U+FFFD. * Calls toUTF8(). * - * @param result A standard string (or a compatible object) + * @tparam StringClass A std::string or a std::u8string (or a compatible type) + * @param result A std::string or a std::u8string (or a compatible object) * to which the UTF-8 version of the string is appended. * @return The string object. * @stable ICU 4.2 @@ -1732,6 +1786,27 @@ class U_COMMON_API UnicodeString : public Replaceable return result; } +#ifndef U_HIDE_DRAFT_API + /** + * Convert the UnicodeString to a UTF-8 string. + * Unpaired surrogates are replaced with U+FFFD. + * Calls toUTF8(). + * + * @tparam StringClass A std::string or a std::u8string (or a compatible type) + * @return A std::string or a std::u8string (or a compatible object) + * with the UTF-8 version of the string. + * @draft ICU 78 + * @see toUTF8 + */ + template<typename StringClass> + StringClass toUTF8String() const { + StringClass result; + StringByteSink<StringClass> sbs(&result, length()); + toUTF8(sbs); + return result; + } +#endif // U_HIDE_DRAFT_API + /** * Convert the UnicodeString to UTF-32. * Unpaired surrogates are replaced with U+FFFD. @@ -1759,7 +1834,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see countChar32 * @stable ICU 2.0 */ - inline int32_t length(void) const; + inline int32_t length() const; /** * Count Unicode code points in the length char16_t code units of the string. @@ -1808,7 +1883,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return true if this string contains 0 characters, false otherwise. * @stable ICU 2.0 */ - inline UBool isEmpty(void) const; + inline UBool isEmpty() const; /** * Return the capacity of the internal buffer of the UnicodeString object. @@ -1819,7 +1894,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getBuffer * @stable ICU 2.0 */ - inline int32_t getCapacity(void) const; + inline int32_t getCapacity() const; /* Other operations */ @@ -1828,7 +1903,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The hash code of this UnicodeString. * @stable ICU 2.0 */ - inline int32_t hashCode(void) const; + inline int32_t hashCode() const; /** * Determine if this object contains a valid string. @@ -1842,8 +1917,43 @@ class U_COMMON_API UnicodeString : public Replaceable * @see setToBogus() * @stable ICU 2.0 */ - inline UBool isBogus(void) const; + inline UBool isBogus() const; +#ifndef U_HIDE_DRAFT_API +private: + // These type aliases are private; there is no guarantee that they will remain + // aliases to the same types in subsequent versions of ICU. + // Note that whether `std::u16string_view::const_iterator` is a pointer or a + // class that models contiguous_iterator is platform-dependent. + using unspecified_iterator = std::u16string_view::const_iterator; + using unspecified_reverse_iterator = std::u16string_view::const_reverse_iterator; + +public: + /** + * @return an iterator to the first code unit in this string. + * The iterator may be a pointer or a contiguous-iterator object. + * @draft ICU 78 + */ + unspecified_iterator begin() const { return std::u16string_view(*this).begin(); } + /** + * @return an iterator to just past the last code unit in this string. + * The iterator may be a pointer or a contiguous-iterator object. + * @draft ICU 78 + */ + unspecified_iterator end() const { return std::u16string_view(*this).end(); } + /** + * @return a reverse iterator to the last code unit in this string. + * The iterator may be a pointer or a contiguous-iterator object. + * @draft ICU 78 + */ + unspecified_reverse_iterator rbegin() const { return std::u16string_view(*this).rbegin(); } + /** + * @return a reverse iterator to just before the first code unit in this string. + * The iterator may be a pointer or a contiguous-iterator object. + * @draft ICU 78 + */ + unspecified_reverse_iterator rend() const { return std::u16string_view(*this).rend(); } +#endif // U_HIDE_DRAFT_API //======================================== // Write operations @@ -1898,6 +2008,22 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString &fastCopyFrom(const UnicodeString &src); + /** + * Assignment operator. Replaces the characters in this UnicodeString + * with a copy of the characters from the `src` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * + * @param src The string view containing the characters to copy. + * @return a reference to this + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + inline UnicodeString &operator=(const S &src) { + unBogus(); + return doReplace(0, length(), internal::toU16StringView(src)); + } + /** * Move assignment operator; might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -2147,6 +2273,21 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline UnicodeString& operator+= (const UnicodeString& srcText); + /** + * Append operator. Appends the characters in `src` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view, + * to the UnicodeString object. + * + * @param src the source for the new characters + * @return a reference to this + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + inline UnicodeString& operator+=(const S &src) { + return doAppend(internal::toU16StringView(src)); + } + /** * Append the characters * in `srcText` in the range @@ -2192,8 +2333,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the characters in `srcChars` to the UnicodeString object - * at offset `start`. `srcChars` is not modified. + * Append the characters in `srcChars` to the UnicodeString object. + * `srcChars` is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in `srcChars`; * can be -1 if `srcChars` is NUL-terminated @@ -2203,6 +2344,21 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& append(ConstChar16Ptr srcChars, int32_t srcLength); + /** + * Appends the characters in `src` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view, + * to the UnicodeString object. + * + * @param src the source for the new characters + * @return a reference to this + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + inline UnicodeString& append(const S &src) { + return doAppend(internal::toU16StringView(src)); + } + /** * Append the code unit `srcChar` to the UnicodeString object. * @param srcChar the code unit to append @@ -2219,6 +2375,16 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString& append(UChar32 srcChar); +#ifndef U_HIDE_DRAFT_API + /** + * Appends the code unit `c` to the UnicodeString object. + * Same as append(c) except does not return *this. + * + * @param c the code unit to append + * @draft ICU 78 + */ + inline void push_back(char16_t c) { append(c); } +#endif // U_HIDE_DRAFT_API /* Insert operations */ @@ -2557,7 +2723,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& remove(int32_t start, - int32_t length = (int32_t)INT32_MAX); + int32_t length = static_cast<int32_t>(INT32_MAX)); /** * Remove the characters in the range @@ -2568,7 +2734,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& removeBetween(int32_t start, - int32_t limit = (int32_t)INT32_MAX); + int32_t limit = static_cast<int32_t>(INT32_MAX)); /** * Retain only the characters in the range @@ -2624,8 +2790,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& trim(void); - + UnicodeString& trim(); /* Miscellaneous operations */ @@ -2634,7 +2799,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& reverse(void); + inline UnicodeString& reverse(); /** * Reverse the range [`start`, `start + length`) in @@ -2653,7 +2818,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toUpper(void); + UnicodeString& toUpper(); /** * Convert the characters in this to UPPER CASE following the conventions of @@ -2670,7 +2835,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toLower(void); + UnicodeString& toLower(); /** * Convert the characters in this to lower case following the conventions of @@ -2695,8 +2860,8 @@ class U_COMMON_API UnicodeString : public Replaceable * styles, using rules and dictionaries beyond the standard iterators. * It may be more efficient to always provide an iterator to avoid * opening and closing one for each string. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setText(), first() and next() methods of the * provided break iterator. @@ -2723,8 +2888,8 @@ class U_COMMON_API UnicodeString : public Replaceable * styles, using rules and dictionaries beyond the standard iterators. * It may be more efficient to always provide an iterator to avoid * opening and closing one for each string. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setText(), first() and next() methods of the * provided break iterator. @@ -2752,8 +2917,8 @@ class U_COMMON_API UnicodeString : public Replaceable * styles, using rules and dictionaries beyond the standard iterators. * It may be more efficient to always provide an iterator to avoid * opening and closing one for each string. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setText(), first() and next() methods of the * provided break iterator. @@ -2927,6 +3092,35 @@ class U_COMMON_API UnicodeString : public Replaceable */ const char16_t *getTerminatedBuffer(); + /** + * Converts to a std::u16string_view. + * + * @return a string view of the contents of this string + * @stable ICU 76 + */ + inline operator std::u16string_view() const { + return {getBuffer(), static_cast<std::u16string_view::size_type>(length())}; + } + +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Converts to a std::wstring_view. + * + * Note: This should remain draft until C++ standard plans + * about char16_t vs. wchar_t become clearer. + * + * @return a string view of the contents of this string + * @stable ICU 76 + */ + inline operator std::wstring_view() const { + const char16_t *p = getBuffer(); +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return { reinterpret_cast<const wchar_t *>(p), (std::wstring_view::size_type)length() }; + } +#endif // U_SIZEOF_WCHAR_T + //======================================== // Constructors //======================================== @@ -2971,19 +3165,32 @@ class U_COMMON_API UnicodeString : public Replaceable */ UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar32 ch); +#ifdef U_HIDE_DRAFT_API /** * char16_t* constructor. * * It is recommended to mark this constructor "explicit" by * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param text The characters to place in the UnicodeString. `text` * must be NUL (U+0000) terminated. * @stable ICU 2.0 */ - UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char16_t *text); + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char16_t *text) : + UnicodeString(text, -1) {} +#endif // U_HIDE_DRAFT_API -#if !U_CHAR16_IS_TYPEDEF +#if !U_CHAR16_IS_TYPEDEF && \ + (defined(U_HIDE_DRAFT_API) || (defined(_LIBCPP_VERSION) && _LIBCPP_VERSION >= 180000)) /** * uint16_t * constructor. * Delegates to UnicodeString(const char16_t *). @@ -2991,14 +3198,23 @@ class U_COMMON_API UnicodeString : public Replaceable * It is recommended to mark this constructor "explicit" by * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param text NUL-terminated UTF-16 string * @stable ICU 59 */ UNISTR_FROM_STRING_EXPLICIT UnicodeString(const uint16_t *text) : - UnicodeString(ConstChar16Ptr(text)) {} + UnicodeString(ConstChar16Ptr(text), -1) {} #endif -#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) +#if defined(U_HIDE_DRAFT_API) && (U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)) /** * wchar_t * constructor. * (Only defined if U_SIZEOF_WCHAR_T==2.) @@ -3007,11 +3223,20 @@ class U_COMMON_API UnicodeString : public Replaceable * It is recommended to mark this constructor "explicit" by * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param text NUL-terminated UTF-16 string * @stable ICU 59 */ UNISTR_FROM_STRING_EXPLICIT UnicodeString(const wchar_t *text) : - UnicodeString(ConstChar16Ptr(text)) {} + UnicodeString(ConstChar16Ptr(text), -1) {} #endif /** @@ -3028,6 +3253,15 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char16_t* constructor. + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param text The characters to place in the UnicodeString. * @param textLength The number of Unicode characters in `text` * to copy. @@ -3040,6 +3274,15 @@ class U_COMMON_API UnicodeString : public Replaceable /** * uint16_t * constructor. * Delegates to UnicodeString(const char16_t *, int32_t). + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param text UTF-16 string * @param textLength string length * @stable ICU 59 @@ -3053,7 +3296,16 @@ class U_COMMON_API UnicodeString : public Replaceable * wchar_t * constructor. * (Only defined if U_SIZEOF_WCHAR_T==2.) * Delegates to UnicodeString(const char16_t *, int32_t). - * @param text NUL-terminated UTF-16 string + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * + * @param text UTF-16 string * @param textLength string length * @stable ICU 59 */ @@ -3070,6 +3322,24 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline UnicodeString(const std::nullptr_t text, int32_t textLength); + /** + * Constructor from `text` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * The string is bogus if the string view is too long. + * + * If you need a UnicodeString but need not copy the string view contents, + * then you can call the UnicodeString::readOnlyAlias() function instead of this constructor. + * + * @param text UTF-16 string + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const S &text) { + fUnion.fFields.fLengthAndFlags = kShortString; + doAppend(internal::toU16StringViewNullable(text)); + } + /** * Readonly-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but @@ -3084,6 +3354,14 @@ class U_COMMON_API UnicodeString : public Replaceable * When using fastCopyFrom(), the text will be aliased again, * so that both strings then alias the same readonly-text. * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString alias = UnicodeString::readOnlyAlias(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param isTerminated specifies if `text` is `NUL`-terminated. * This must be true if `textLength==-1`. * @param text The characters to alias for the UnicodeString. @@ -3162,8 +3440,14 @@ class U_COMMON_API UnicodeString : public Replaceable * * For ASCII (really "invariant character") strings it is more efficient to use * the constructor that takes a US_INV (for its enum EInvariant). - * For ASCII (invariant-character) string literals, see UNICODE_STRING and - * UNICODE_STRING_SIMPLE. + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode * * It is recommended to mark this constructor "explicit" by * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` @@ -3171,8 +3455,6 @@ class U_COMMON_API UnicodeString : public Replaceable * @param codepageData an array of bytes, null-terminated, * in the platform's default codepage. * @stable ICU 2.0 - * @see UNICODE_STRING - * @see UNICODE_STRING_SIMPLE */ UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char *codepageData); @@ -3272,6 +3554,15 @@ class U_COMMON_API UnicodeString : public Replaceable * // use ustr ... * } * \endcode + * + * Note, for string literals: + * Since C++17 and ICU 76, you can use UTF-16 string literals with compile-time + * length determination: + * \code + * UnicodeString str(u"literal"); + * if (str == u"other literal") { ... } + * \endcode + * * @param src String using only invariant characters. * @param textLength Length of src, or -1 if NUL-terminated. * @param inv Signature-distinguishing parameter, use US_INV. @@ -3345,6 +3636,56 @@ class U_COMMON_API UnicodeString : public Replaceable */ virtual ~UnicodeString(); + /** + * Readonly-aliasing factory method. + * Aliases the same buffer as the input `text` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * The string is bogus if the string view is too long. + * + * The text will be used for the UnicodeString object, but + * it will not be released when the UnicodeString is destroyed. + * This has copy-on-write semantics: + * When the string is modified, then the buffer is first copied into + * newly allocated memory. + * The aliased buffer is never modified. + * + * In an assignment to another UnicodeString, when using the copy constructor + * or the assignment operator, the text will be copied. + * When using fastCopyFrom(), the text will be aliased again, + * so that both strings then alias the same readonly-text. + * + * @param text The string view to alias for the UnicodeString. + * @stable ICU 76 + */ + template<typename S, typename = std::enable_if_t<ConvertibleToU16StringView<S>>> + static inline UnicodeString readOnlyAlias(const S &text) { + return readOnlyAliasFromU16StringView(internal::toU16StringView(text)); + } + + /** + * Readonly-aliasing factory method. + * Aliases the same buffer as the input `text`. + * + * The text will be used for the UnicodeString object, but + * it will not be released when the UnicodeString is destroyed. + * This has copy-on-write semantics: + * When the string is modified, then the buffer is first copied into + * newly allocated memory. + * The aliased buffer is never modified. + * + * In an assignment to another UnicodeString, when using the copy constructor + * or the assignment operator, the text will be copied. + * When using fastCopyFrom(), the text will be aliased again, + * so that both strings then alias the same readonly-text. + * + * @param text The UnicodeString to alias. + * @stable ICU 76 + */ + static inline UnicodeString readOnlyAlias(const UnicodeString &text) { + return readOnlyAliasFromUnicodeString(text); + } + /** * Create a UnicodeString from a UTF-8 string. * Illegal input is replaced with U+FFFD. Otherwise, errors result in a bogus string. @@ -3472,6 +3813,9 @@ class U_COMMON_API UnicodeString : public Replaceable virtual UChar32 getChar32At(int32_t offset) const override; private: + static UnicodeString readOnlyAliasFromU16StringView(std::u16string_view text); + static UnicodeString readOnlyAliasFromUnicodeString(const UnicodeString &text); + // For char* constructors. Could be made public. UnicodeString &setToUTF8(StringPiece utf8); // For extract(char*). @@ -3487,7 +3831,10 @@ class U_COMMON_API UnicodeString : public Replaceable * Internal string contents comparison, called by operator==. * Requires: this & text not bogus and have same lengths. */ - UBool doEquals(const UnicodeString &text, int32_t len) const; + inline UBool doEquals(const UnicodeString &text, int32_t len) const { + return doEquals(text.getArrayStart(), len); + } + UBool doEquals(const char16_t *text, int32_t len) const; inline UBool doEqualsSubstring(int32_t start, @@ -3582,20 +3929,22 @@ class U_COMMON_API UnicodeString : public Replaceable const char16_t *srcChars, int32_t srcStart, int32_t srcLength); + UnicodeString& doReplace(int32_t start, int32_t length, std::u16string_view src); UnicodeString& doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength); UnicodeString& doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); + UnicodeString& doAppend(std::u16string_view src); UnicodeString& doReverse(int32_t start, int32_t length); // calculate hash code - int32_t doHashCode(void) const; + int32_t doHashCode() const; // get pointer to start of array // these do not check for kOpenGetBuffer, unlike the public getBuffer() function - inline char16_t* getArrayStart(void); - inline const char16_t* getArrayStart(void) const; + inline char16_t* getArrayStart(); + inline const char16_t* getArrayStart() const; inline UBool hasShortLength() const; inline int32_t getShortLength() const; @@ -3622,7 +3971,7 @@ class U_COMMON_API UnicodeString : public Replaceable UBool allocate(int32_t capacity); // release the array if owned - void releaseArray(void); + void releaseArray(); // turn a bogus string into an empty one void unBogus(); @@ -3684,10 +4033,10 @@ class U_COMMON_API UnicodeString : public Replaceable * Return false if memory could not be allocated. */ UBool cloneArrayIfNeeded(int32_t newCapacity = -1, - int32_t growCapacity = -1, - UBool doCopyArray = true, - int32_t **pBufferToDelete = 0, - UBool forceClone = false); + int32_t growCapacity = -1, + UBool doCopyArray = true, + int32_t** pBufferToDelete = nullptr, + UBool forceClone = false); /** * Common function for UnicodeString case mappings. @@ -3702,9 +4051,9 @@ class U_COMMON_API UnicodeString : public Replaceable UStringCaseMapper *stringCaseMapper); // ref counting - void addRef(void); - int32_t removeRef(void); - int32_t refCount(void) const; + void addRef(); + int32_t removeRef(); + int32_t refCount() const; // constants enum { @@ -3713,7 +4062,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Must be at least U16_MAX_LENGTH for the single-code point constructor to work. * @see UNISTR_OBJECT_SIZE */ - US_STACKBUF_SIZE=(int32_t)(UNISTR_OBJECT_SIZE-sizeof(void *)-2)/U_SIZEOF_UCHAR, + US_STACKBUF_SIZE = static_cast<int32_t>(UNISTR_OBJECT_SIZE - sizeof(void*) - 2) / U_SIZEOF_UCHAR, kInvalidUChar=0xffff, // U+FFFF returned by charAt(invalid index) kInvalidHashCode=0, // invalid hash code kEmptyHashCode=1, // hash code for empty string @@ -3804,7 +4153,7 @@ class U_COMMON_API UnicodeString : public Replaceable }; /** - * Create a new UnicodeString with the concatenation of two others. + * Creates a new UnicodeString from the concatenation of two others. * * @param s1 The first string to be copied to the new one. * @param s2 The second string to be copied to the new one, after s1. @@ -3814,6 +4163,29 @@ class U_COMMON_API UnicodeString : public Replaceable U_COMMON_API UnicodeString U_EXPORT2 operator+ (const UnicodeString &s1, const UnicodeString &s2); +/** + * Creates a new UnicodeString from the concatenation of a UnicodeString and `s2` + * which is, or which is implicitly convertible to, + * a std::u16string_view or (if U_SIZEOF_WCHAR_T==2) std::wstring_view. + * + * @param s1 The string to be copied to the new one. + * @param s2 The string view to be copied to the new string, after s1. + * @return UnicodeString(s1).append(s2) + * @stable ICU 76 + */ +template< + typename US, typename S, + typename = std::enable_if_t<ConvertibleToU16StringView<S> && std::is_same_v<US, UnicodeString>>> +inline UnicodeString operator+(const US &s1, const S &s2) { + return unistr_internalConcat(s1, internal::toU16StringView(s2)); +} + +#ifndef U_FORCE_HIDE_INTERNAL_API +/** @internal */ +U_COMMON_API UnicodeString U_EXPORT2 +unistr_internalConcat(const UnicodeString &s1, std::u16string_view s2); +#endif + //======================================== // Inline members //======================================== @@ -3916,18 +4288,18 @@ UnicodeString::hashCode() const inline UBool UnicodeString::isBogus() const -{ return (UBool)(fUnion.fFields.fLengthAndFlags & kIsBogus); } +{ return fUnion.fFields.fLengthAndFlags & kIsBogus; } inline UBool UnicodeString::isWritable() const -{ return (UBool)!(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus)); } +{ return !(fUnion.fFields.fLengthAndFlags & (kOpenGetBuffer | kIsBogus)); } inline UBool UnicodeString::isBufferWritable() const { - return (UBool)( + return !(fUnion.fFields.fLengthAndFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) && - (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1)); + (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1); } inline const char16_t * @@ -3952,7 +4324,7 @@ UnicodeString::doCompare(int32_t start, int32_t srcLength) const { if(srcText.isBogus()) { - return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise + return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise } else { srcText.pinIndices(srcStart, srcLength); return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength); @@ -4059,7 +4431,7 @@ UnicodeString::doCompareCodePointOrder(int32_t start, int32_t srcLength) const { if(srcText.isBogus()) { - return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise + return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise } else { srcText.pinIndices(srcStart, srcLength); return doCompareCodePointOrder(start, thisLength, srcText.getArrayStart(), srcStart, srcLength); @@ -4121,7 +4493,7 @@ UnicodeString::doCaseCompare(int32_t start, uint32_t options) const { if(srcText.isBogus()) { - return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise + return static_cast<int8_t>(!isBogus()); // 0 if both are bogus, 1 otherwise } else { srcText.pinIndices(srcStart, srcLength); return doCaseCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength, options); @@ -4510,7 +4882,7 @@ UnicodeString::extract(int32_t start, { // This dstSize value will be checked explicitly - return extract(start, _length, dst, dst!=0 ? 0xffffffff : 0, codepage); + return extract(start, _length, dst, dst != nullptr ? 0xffffffff : 0, codepage); } #endif @@ -4533,7 +4905,7 @@ UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const { inline char16_t UnicodeString::doCharAt(int32_t offset) const { - if((uint32_t)offset < (uint32_t)length()) { + if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) { return getArrayStart()[offset]; } else { return kInvalidUChar; @@ -4566,7 +4938,7 @@ inline void UnicodeString::setShortLength(int32_t len) { // requires 0 <= len <= kMaxShortLength fUnion.fFields.fLengthAndFlags = - (int16_t)((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift)); + static_cast<int16_t>((fUnion.fFields.fLengthAndFlags & kAllStorageFlags) | (len << kLengthShift)); } inline void @@ -4760,7 +5132,7 @@ UnicodeString::truncate(int32_t targetLength) // truncate(0) of a bogus string makes the string empty and non-bogus unBogus(); return false; - } else if((uint32_t)targetLength < (uint32_t)length()) { + } else if (static_cast<uint32_t>(targetLength) < static_cast<uint32_t>(length())) { setLength(targetLength); return true; } else { diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index 3844041f1704da..48f614d74fbfb7 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -197,7 +197,6 @@ unorm2_getNFKDInstance(UErrorCode *pErrorCode); U_CAPI const UNormalizer2 * U_EXPORT2 unorm2_getNFKCCasefoldInstance(UErrorCode *pErrorCode); -#ifndef U_HIDE_DRAFT_API /** * Returns a UNormalizer2 instance for a variant of Unicode toNFKC_Casefold() normalization * which is equivalent to applying the NFKC_Simple_Casefold mappings and then NFC. @@ -210,11 +209,10 @@ unorm2_getNFKCCasefoldInstance(UErrorCode *pErrorCode); * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) * @return the requested Normalizer2, if successful - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI const UNormalizer2 * U_EXPORT2 unorm2_getNFKCSimpleCasefoldInstance(UErrorCode *pErrorCode); -#endif // U_HIDE_DRAFT_API /** * Returns a UNormalizer2 instance which uses the specified data file diff --git a/deps/icu-small/source/common/unicode/uobject.h b/deps/icu-small/source/common/unicode/uobject.h index f53ec1d1119761..af6a2039160702 100644 --- a/deps/icu-small/source/common/unicode/uobject.h +++ b/deps/icu-small/source/common/unicode/uobject.h @@ -157,7 +157,6 @@ class U_COMMON_API UMemory { */ static void U_EXPORT2 operator delete[](void *p) noexcept; -#if U_HAVE_PLACEMENT_NEW /** * Override for ICU4C C++ memory management for STL. * See new(). @@ -171,7 +170,7 @@ class U_COMMON_API UMemory { * @stable ICU 2.6 */ static inline void U_EXPORT2 operator delete(void *, void *) noexcept {} -#endif /* U_HAVE_PLACEMENT_NEW */ + #if U_HAVE_DEBUG_LOCATION_NEW /** * This method overrides the MFC debug version of the operator new diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 74f2cae510637d..af4a18ec83d623 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -33,8 +33,9 @@ #if !U_DISABLE_RENAMING -// Disable Renaming for Visual Studio's IntelliSense feature, so that 'Go-to-Definition' (F12) will work. -#if !(defined(_MSC_VER) && defined(__INTELLISENSE__)) +// Disable Renaming for Visual Studio's IntelliSense feature and for LLVM's Clang-Tidy tool, so that +// 'Go-to-Definition' (F12) and 'include-cleaner' respectively will work. +#if !(defined(_MSC_VER) && defined(__INTELLISENSE__)) && !defined(__clang_analyzer__) /* We need the U_ICU_ENTRY_POINT_RENAME definition. There's a default one in unicode/uvernum.h we can use, but we will give the platform a chance to define it first. @@ -272,6 +273,7 @@ #define u_getDataVersion U_ICU_ENTRY_POINT_RENAME(u_getDataVersion) #define u_getDefaultConverter U_ICU_ENTRY_POINT_RENAME(u_getDefaultConverter) #define u_getFC_NFKC_Closure U_ICU_ENTRY_POINT_RENAME(u_getFC_NFKC_Closure) +#define u_getIDTypes U_ICU_ENTRY_POINT_RENAME(u_getIDTypes) #define u_getISOComment U_ICU_ENTRY_POINT_RENAME(u_getISOComment) #define u_getIntPropertyMap U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyMap) #define u_getIntPropertyMaxValue U_ICU_ENTRY_POINT_RENAME(u_getIntPropertyMaxValue) @@ -289,6 +291,7 @@ #define u_getVersion U_ICU_ENTRY_POINT_RENAME(u_getVersion) #define u_get_stdout U_ICU_ENTRY_POINT_RENAME(u_get_stdout) #define u_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(u_hasBinaryProperty) +#define u_hasIDType U_ICU_ENTRY_POINT_RENAME(u_hasIDType) #define u_init U_ICU_ENTRY_POINT_RENAME(u_init) #define u_isIDIgnorable U_ICU_ENTRY_POINT_RENAME(u_isIDIgnorable) #define u_isIDPart U_ICU_ENTRY_POINT_RENAME(u_isIDPart) @@ -488,6 +491,7 @@ #define ubiditransform_close U_ICU_ENTRY_POINT_RENAME(ubiditransform_close) #define ubiditransform_open U_ICU_ENTRY_POINT_RENAME(ubiditransform_open) #define ubiditransform_transform U_ICU_ENTRY_POINT_RENAME(ubiditransform_transform) +#define ublock_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(ublock_addPropertyStarts) #define ublock_getCode U_ICU_ENTRY_POINT_RENAME(ublock_getCode) #define ubrk_clone U_ICU_ENTRY_POINT_RENAME(ubrk_clone) #define ubrk_close U_ICU_ENTRY_POINT_RENAME(ubrk_close) @@ -989,6 +993,7 @@ #define uhash_compareCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareCaselessUnicodeString) #define uhash_compareChars U_ICU_ENTRY_POINT_RENAME(uhash_compareChars) #define uhash_compareIChars U_ICU_ENTRY_POINT_RENAME(uhash_compareIChars) +#define uhash_compareIStringView U_ICU_ENTRY_POINT_RENAME(uhash_compareIStringView) #define uhash_compareLong U_ICU_ENTRY_POINT_RENAME(uhash_compareLong) #define uhash_compareScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_compareScriptSet) #define uhash_compareUChars U_ICU_ENTRY_POINT_RENAME(uhash_compareUChars) @@ -1006,6 +1011,7 @@ #define uhash_hashCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashCaselessUnicodeString) #define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars) #define uhash_hashIChars U_ICU_ENTRY_POINT_RENAME(uhash_hashIChars) +#define uhash_hashIStringView U_ICU_ENTRY_POINT_RENAME(uhash_hashIStringView) #define uhash_hashLong U_ICU_ENTRY_POINT_RENAME(uhash_hashLong) #define uhash_hashScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_hashScriptSet) #define uhash_hashUChars U_ICU_ENTRY_POINT_RENAME(uhash_hashUChars) @@ -1192,21 +1198,29 @@ #define ulocimp_canonicalize U_ICU_ENTRY_POINT_RENAME(ulocimp_canonicalize) #define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag) #define ulocimp_getBaseName U_ICU_ENTRY_POINT_RENAME(ulocimp_getBaseName) -#define ulocimp_getCountry U_ICU_ENTRY_POINT_RENAME(ulocimp_getCountry) #define ulocimp_getKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywordValue) #define ulocimp_getKeywords U_ICU_ENTRY_POINT_RENAME(ulocimp_getKeywords) #define ulocimp_getKnownCanonicalizedLocaleForTest U_ICU_ENTRY_POINT_RENAME(ulocimp_getKnownCanonicalizedLocaleForTest) #define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage) #define ulocimp_getName U_ICU_ENTRY_POINT_RENAME(ulocimp_getName) +#define ulocimp_getParent U_ICU_ENTRY_POINT_RENAME(ulocimp_getParent) +#define ulocimp_getRegion U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegion) #define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData) #define ulocimp_getScript U_ICU_ENTRY_POINT_RENAME(ulocimp_getScript) +#define ulocimp_getSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_getSubtags) +#define ulocimp_getVariant U_ICU_ENTRY_POINT_RENAME(ulocimp_getVariant) #define ulocimp_isCanonicalizedLocaleForTest U_ICU_ENTRY_POINT_RENAME(ulocimp_isCanonicalizedLocaleForTest) #define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags) +#define ulocimp_setKeywordValue U_ICU_ENTRY_POINT_RENAME(ulocimp_setKeywordValue) #define ulocimp_toBcpKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKey) +#define ulocimp_toBcpKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKeyWithFallback) #define ulocimp_toBcpType U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpType) +#define ulocimp_toBcpTypeWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpTypeWithFallback) #define ulocimp_toLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_toLanguageTag) #define ulocimp_toLegacyKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKey) +#define ulocimp_toLegacyKeyWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKeyWithFallback) #define ulocimp_toLegacyType U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyType) +#define ulocimp_toLegacyTypeWithFallback U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyTypeWithFallback) #define ultag_getTKeyStart U_ICU_ENTRY_POINT_RENAME(ultag_getTKeyStart) #define ultag_isExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isExtensionSubtags) #define ultag_isLanguageSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isLanguageSubtag) @@ -1379,6 +1393,7 @@ #define uprops_getSource U_ICU_ENTRY_POINT_RENAME(uprops_getSource) #define upropsvec_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(upropsvec_addPropertyStarts) #define uprv_add32_overflow U_ICU_ENTRY_POINT_RENAME(uprv_add32_overflow) +#define uprv_addScriptExtensionsCodePoints U_ICU_ENTRY_POINT_RENAME(uprv_addScriptExtensionsCodePoints) #define uprv_aestrncpy U_ICU_ENTRY_POINT_RENAME(uprv_aestrncpy) #define uprv_asciiFromEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_asciiFromEbcdic) #define uprv_asciitolower U_ICU_ENTRY_POINT_RENAME(uprv_asciitolower) @@ -1767,6 +1782,8 @@ #define uset_getSerializedRange U_ICU_ENTRY_POINT_RENAME(uset_getSerializedRange) #define uset_getSerializedRangeCount U_ICU_ENTRY_POINT_RENAME(uset_getSerializedRangeCount) #define uset_getSerializedSet U_ICU_ENTRY_POINT_RENAME(uset_getSerializedSet) +#define uset_getString U_ICU_ENTRY_POINT_RENAME(uset_getString) +#define uset_getStringCount U_ICU_ENTRY_POINT_RENAME(uset_getStringCount) #define uset_hasStrings U_ICU_ENTRY_POINT_RENAME(uset_hasStrings) #define uset_indexOf U_ICU_ENTRY_POINT_RENAME(uset_indexOf) #define uset_isEmpty U_ICU_ENTRY_POINT_RENAME(uset_isEmpty) @@ -1800,11 +1817,11 @@ #define usnum_multiplyByPowerOfTen U_ICU_ENTRY_POINT_RENAME(usnum_multiplyByPowerOfTen) #define usnum_openForInt64 U_ICU_ENTRY_POINT_RENAME(usnum_openForInt64) #define usnum_roundTo U_ICU_ENTRY_POINT_RENAME(usnum_roundTo) +#define usnum_setMaximumIntegerDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMaximumIntegerDigits) #define usnum_setMinimumFractionDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMinimumFractionDigits) #define usnum_setMinimumIntegerDigits U_ICU_ENTRY_POINT_RENAME(usnum_setMinimumIntegerDigits) #define usnum_setSign U_ICU_ENTRY_POINT_RENAME(usnum_setSign) #define usnum_setToInt64 U_ICU_ENTRY_POINT_RENAME(usnum_setToInt64) -#define usnum_truncateStart U_ICU_ENTRY_POINT_RENAME(usnum_truncateStart) #define usnumf_close U_ICU_ENTRY_POINT_RENAME(usnumf_close) #define usnumf_format U_ICU_ENTRY_POINT_RENAME(usnumf_format) #define usnumf_formatInt64 U_ICU_ENTRY_POINT_RENAME(usnumf_formatInt64) @@ -2022,7 +2039,7 @@ #define ztrans_setTime U_ICU_ENTRY_POINT_RENAME(ztrans_setTime) #define ztrans_setTo U_ICU_ENTRY_POINT_RENAME(ztrans_setTo) -#endif /* !(defined(_MSC_VER) && defined(__INTELLISENSE__)) */ +#endif /* !(defined(_MSC_VER) && defined(__INTELLISENSE__)) && !defined(__clang_analyzer__) */ #endif /* U_DISABLE_RENAMING */ #endif /* URENAME_H */ diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index dc97ab2ba56c17..e5101ed0134e45 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -500,6 +500,35 @@ typedef enum UScriptCode { /** @stable ICU 72 */ USCRIPT_NAG_MUNDARI = 199,/* Nagm */ + /** @stable ICU 75 */ + USCRIPT_ARABIC_NASTALIQ = 200, /* Aran */ + + /** @stable ICU 76 */ + USCRIPT_GARAY = 201, /* Gara */ + /** @stable ICU 76 */ + USCRIPT_GURUNG_KHEMA = 202, /* Gukh */ + /** @stable ICU 76 */ + USCRIPT_KIRAT_RAI = 203, /* Krai */ + /** @stable ICU 76 */ + USCRIPT_OL_ONAL = 204, /* Onao */ + /** @stable ICU 76 */ + USCRIPT_SUNUWAR = 205, /* Sunu */ + /** @stable ICU 76 */ + USCRIPT_TODHRI = 206, /* Todr */ + /** @stable ICU 76 */ + USCRIPT_TULU_TIGALARI = 207, /* Tutg */ + + /** @stable ICU 78 */ + USCRIPT_BERIA_ERFE = 208, /* Berf */ + /** @stable ICU 78 */ + USCRIPT_SIDETIC = 209, /* Sidt */ + /** @stable ICU 78 */ + USCRIPT_TAI_YO = 210, /* Tayo */ + /** @stable ICU 78 */ + USCRIPT_TOLONG_SIKI = 211, /* Tols */ + /** @stable ICU 78 */ + USCRIPT_TRADITIONAL_HAN_WITH_LATIN = 212, /* Hntl */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -507,7 +536,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 200 + USCRIPT_CODE_LIMIT = 213 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/uset.h b/deps/icu-small/source/common/unicode/uset.h index ee4e0036d2289b..4817f7115a7020 100644 --- a/deps/icu-small/source/common/unicode/uset.h +++ b/deps/icu-small/source/common/unicode/uset.h @@ -32,9 +32,13 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" -#if U_SHOW_CPLUSPLUS_API +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +#include <string> +#include <string_view> +#include "unicode/char16ptr.h" #include "unicode/localpointer.h" -#endif // U_SHOW_CPLUSPLUS_API +#include "unicode/utf16.h" +#endif #ifndef USET_DEFINED @@ -109,7 +113,6 @@ enum { */ USET_ADD_CASE_MAPPINGS = 4, -#ifndef U_HIDE_DRAFT_API /** * Enable case insensitive matching. * Same as USET_CASE_INSENSITIVE but using only Simple_Case_Folding (scf) mappings, @@ -120,10 +123,9 @@ enum { * regular expression implementations where only Simple_Case_Folding mappings are used, * such as in ECMAScript (JavaScript) regular expressions. * - * @draft ICU 73 + * @stable ICU 73 */ USET_SIMPLE_CASE_INSENSITIVE = 6 -#endif // U_HIDE_DRAFT_API }; /** @@ -957,7 +959,7 @@ uset_charAt(const USet* set, int32_t charIndex); /** * Returns the number of characters and strings contained in this set. - * The last (uset_getItemCount() - uset_getRangeCount()) items are strings. + * The last uset_getStringCount() == (uset_getItemCount() - uset_getRangeCount()) items are strings. * * This is slower than uset_getRangeCount() and uset_getItemCount() because * it counts the code points of all ranges. @@ -967,6 +969,8 @@ uset_charAt(const USet* set, int32_t charIndex); * contained in set * @stable ICU 2.4 * @see uset_getRangeCount + * @see uset_getStringCount + * @see uset_getItemCount */ U_CAPI int32_t U_EXPORT2 uset_size(const USet* set); @@ -977,11 +981,38 @@ uset_size(const USet* set); * @stable ICU 70 * @see uset_getItemCount * @see uset_getItem + * @see uset_getStringCount * @see uset_size */ U_CAPI int32_t U_EXPORT2 uset_getRangeCount(const USet *set); +/** + * @param set the set + * @return the number of strings in this set. + * @stable ICU 76 + * @see uset_getRangeCount + * @see uset_getItemCount + * @see uset_size + */ +U_CAPI int32_t U_EXPORT2 +uset_getStringCount(const USet *set); + +/** + * Returns the index-th string (empty or multi-character) in the set. + * The string may not be NUL-terminated. + * The output length must be used, and the caller must not read more than that many UChars. + * + * @param set the set + * @param index the string index, 0 .. uset_getStringCount() - 1 + * @param pLength the output string length; must not be NULL + * @return the pointer to the string; NULL if the index is out of range or pLength is NULL + * @stable ICU 76 + * @see uset_getStringCount + */ +U_CAPI const UChar* U_EXPORT2 +uset_getString(const USet *set, int32_t index, int32_t *pLength); + /** * Returns the number of items in this set. An item is either a range * of characters or a single multicharacter string. @@ -989,6 +1020,8 @@ uset_getRangeCount(const USet *set); * @return a non-negative integer counting the character ranges * and/or strings contained in set * @stable ICU 2.4 + * @see uset_getRangeCount + * @see uset_getStringCount */ U_CAPI int32_t U_EXPORT2 uset_getItemCount(const USet* set); @@ -1003,6 +1036,7 @@ uset_getItemCount(const USet* set); * If <code>itemIndex</code> is at least uset_getRangeCount() and less than uset_getItemCount(), then * this function copies the string into <code>str[strCapacity]</code> and * returns the length of the string (0 for the empty string). + * See uset_getString() for a function that does not copy the string contents. * * If <code>itemIndex</code> is out of range, then this function returns -1. * @@ -1020,6 +1054,7 @@ uset_getItemCount(const USet* set); * @return the length of the string (0 or >= 2), or 0 if the item is a range, * or -1 if the itemIndex is out of range * @stable ICU 2.4 + * @see uset_getString */ U_CAPI int32_t U_EXPORT2 uset_getItem(const USet* set, int32_t itemIndex, @@ -1287,4 +1322,582 @@ U_CAPI UBool U_EXPORT2 uset_getSerializedRange(const USerializedSet* set, int32_t rangeIndex, UChar32* pStart, UChar32* pEnd); -#endif +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +namespace U_HEADER_ONLY_NAMESPACE { + +// Note: Not U_COMMON_API, and not a subclass of UMemory, because this is a header-only class, +// not intended to be used via export from the ICU DLL. + +/** + * Iterator returned by USetCodePoints. + * @stable ICU 76 + */ +class USetCodePointIterator { +public: + /** @stable ICU 76 */ + USetCodePointIterator(const USetCodePointIterator &other) = default; + + /** @stable ICU 76 */ + bool operator==(const USetCodePointIterator &other) const { + // No need to compare rangeCount & end given private constructor + // and assuming we don't compare iterators across the set being modified. + // And comparing rangeIndex is redundant with comparing c. + // We might even skip comparing uset. + // Unless we want operator==() to be "correct" for more than iteration. + return uset == other.uset && c == other.c; + } + + /** @stable ICU 76 */ + bool operator!=(const USetCodePointIterator &other) const { return !operator==(other); } + + /** @stable ICU 76 */ + UChar32 operator*() const { return c; } + + /** + * Pre-increment. + * @stable ICU 76 + */ + USetCodePointIterator &operator++() { + if (c < end) { + ++c; + } else if (rangeIndex < rangeCount) { + UErrorCode errorCode = U_ZERO_ERROR; + int32_t result = uset_getItem(uset, rangeIndex, &c, &end, nullptr, 0, &errorCode); + if (U_SUCCESS(errorCode) && result == 0) { + ++rangeIndex; + } else { + c = end = U_SENTINEL; + } + } else { + c = end = U_SENTINEL; + } + return *this; + } + + /** + * Post-increment. + * @stable ICU 76 + */ + USetCodePointIterator operator++(int) { + USetCodePointIterator result(*this); + operator++(); + return result; + } + +private: + friend class USetCodePoints; + + USetCodePointIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount) + : uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount), + c(U_SENTINEL), end(U_SENTINEL) { + // Fetch the first range. + operator++(); + } + + const USet *uset; + int32_t rangeIndex; + int32_t rangeCount; + UChar32 c, end; +}; + +/** + * C++ "range" for iterating over the code points of a USet. + * + * \code + * using U_HEADER_NESTED_NAMESPACE::USetCodePoints; + * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, &errorCode)); + * for (UChar32 c : USetCodePoints(uset.getAlias())) { + * printf("uset.codePoint U+%04lx\n", (long)c); + * } + * \endcode + * + * C++ UnicodeSet has member functions for iteration, including codePoints(). + * + * @stable ICU 76 + * @see USetRanges + * @see USetStrings + * @see USetElements + */ +class USetCodePoints { +public: + /** + * Constructs a C++ "range" object over the code points of the USet. + * @stable ICU 76 + */ + USetCodePoints(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} + + /** @stable ICU 76 */ + USetCodePoints(const USetCodePoints &other) = default; + + /** @stable ICU 76 */ + USetCodePointIterator begin() const { + return USetCodePointIterator(uset, 0, rangeCount); + } + + /** @stable ICU 76 */ + USetCodePointIterator end() const { + return USetCodePointIterator(uset, rangeCount, rangeCount); + } + +private: + const USet *uset; + int32_t rangeCount; +}; + +/** + * A contiguous range of code points in a USet/UnicodeSet. + * Returned by USetRangeIterator which is returned by USetRanges. + * Both the rangeStart and rangeEnd are in the range. + * (end() returns an iterator corresponding to rangeEnd+1.) + * @stable ICU 76 + */ +struct CodePointRange { + /** @stable ICU 76 */ + struct iterator { + /** @stable ICU 76 */ + iterator(UChar32 aC) : c(aC) {} + + /** @stable ICU 76 */ + bool operator==(const iterator &other) const { return c == other.c; } + /** @stable ICU 76 */ + bool operator!=(const iterator &other) const { return !operator==(other); } + + /** @stable ICU 76 */ + UChar32 operator*() const { return c; } + + /** + * Pre-increment. + * @stable ICU 76 + */ + iterator &operator++() { + ++c; + return *this; + } + + /** + * Post-increment. + * @stable ICU 76 + */ + iterator operator++(int) { + return c++; + } + + /** + * The current code point in the range. + * @stable ICU 76 + */ + UChar32 c; + }; + + /** @stable ICU 76 */ + CodePointRange(UChar32 start, UChar32 end) : rangeStart(start), rangeEnd(end) {} + /** @stable ICU 76 */ + CodePointRange(const CodePointRange &other) = default; + /** @stable ICU 76 */ + size_t size() const { return (rangeEnd + 1) - rangeStart; } + /** @stable ICU 76 */ + iterator begin() const { return rangeStart; } + /** @stable ICU 76 */ + iterator end() const { return rangeEnd + 1; } + + /** + * Start of a USet/UnicodeSet range of code points. + * @stable ICU 76 + */ + UChar32 rangeStart; + /** + * Inclusive end of a USet/UnicodeSet range of code points. + * @stable ICU 76 + */ + UChar32 rangeEnd; +}; + +/** + * Iterator returned by USetRanges. + * @stable ICU 76 + */ +class USetRangeIterator { +public: + /** @stable ICU 76 */ + USetRangeIterator(const USetRangeIterator &other) = default; + + /** @stable ICU 76 */ + bool operator==(const USetRangeIterator &other) const { + // No need to compare rangeCount given private constructor + // and assuming we don't compare iterators across the set being modified. + // We might even skip comparing uset. + // Unless we want operator==() to be "correct" for more than iteration. + return uset == other.uset && rangeIndex == other.rangeIndex; + } + + /** @stable ICU 76 */ + bool operator!=(const USetRangeIterator &other) const { return !operator==(other); } + + /** @stable ICU 76 */ + CodePointRange operator*() const { + if (rangeIndex < rangeCount) { + UChar32 start, end; + UErrorCode errorCode = U_ZERO_ERROR; + int32_t result = uset_getItem(uset, rangeIndex, &start, &end, nullptr, 0, &errorCode); + if (U_SUCCESS(errorCode) && result == 0) { + return CodePointRange(start, end); + } + } + return CodePointRange(U_SENTINEL, U_SENTINEL); + } + + /** + * Pre-increment. + * @stable ICU 76 + */ + USetRangeIterator &operator++() { + ++rangeIndex; + return *this; + } + + /** + * Post-increment. + * @stable ICU 76 + */ + USetRangeIterator operator++(int) { + USetRangeIterator result(*this); + ++rangeIndex; + return result; + } + +private: + friend class USetRanges; + + USetRangeIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount) + : uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount) {} + + const USet *uset; + int32_t rangeIndex; + int32_t rangeCount; +}; + +/** + * C++ "range" for iterating over the code point ranges of a USet. + * + * \code + * using U_HEADER_NESTED_NAMESPACE::USetRanges; + * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴]", -1, &errorCode)); + * for (auto [start, end] : USetRanges(uset.getAlias())) { + * printf("uset.range U+%04lx..U+%04lx\n", (long)start, (long)end); + * } + * for (auto range : USetRanges(uset.getAlias())) { + * for (UChar32 c : range) { + * printf("uset.range.c U+%04lx\n", (long)c); + * } + * } + * \endcode + * + * C++ UnicodeSet has member functions for iteration, including ranges(). + * + * @stable ICU 76 + * @see USetCodePoints + * @see USetStrings + * @see USetElements + */ +class USetRanges { +public: + /** + * Constructs a C++ "range" object over the code point ranges of the USet. + * @stable ICU 76 + */ + USetRanges(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} + + /** @stable ICU 76 */ + USetRanges(const USetRanges &other) = default; + + /** @stable ICU 76 */ + USetRangeIterator begin() const { + return USetRangeIterator(uset, 0, rangeCount); + } + + /** @stable ICU 76 */ + USetRangeIterator end() const { + return USetRangeIterator(uset, rangeCount, rangeCount); + } + +private: + const USet *uset; + int32_t rangeCount; +}; + +/** + * Iterator returned by USetStrings. + * @stable ICU 76 + */ +class USetStringIterator { +public: + /** @stable ICU 76 */ + USetStringIterator(const USetStringIterator &other) = default; + + /** @stable ICU 76 */ + bool operator==(const USetStringIterator &other) const { + // No need to compare count given private constructor + // and assuming we don't compare iterators across the set being modified. + // We might even skip comparing uset. + // Unless we want operator==() to be "correct" for more than iteration. + return uset == other.uset && index == other.index; + } + + /** @stable ICU 76 */ + bool operator!=(const USetStringIterator &other) const { return !operator==(other); } + + /** @stable ICU 76 */ + std::u16string_view operator*() const { + if (index < count) { + int32_t length; + const UChar *uchars = uset_getString(uset, index, &length); + // assert uchars != nullptr; + return {uprv_char16PtrFromUChar(uchars), static_cast<size_t>(length)}; + } + return {}; + } + + /** + * Pre-increment. + * @stable ICU 76 + */ + USetStringIterator &operator++() { + ++index; + return *this; + } + + /** + * Post-increment. + * @stable ICU 76 + */ + USetStringIterator operator++(int) { + USetStringIterator result(*this); + ++index; + return result; + } + +private: + friend class USetStrings; + + USetStringIterator(const USet *pUset, int32_t nIndex, int32_t nCount) + : uset(pUset), index(nIndex), count(nCount) {} + + const USet *uset; + int32_t index; + int32_t count; +}; + +/** + * C++ "range" for iterating over the empty and multi-character strings of a USet. + * + * \code + * using U_HEADER_NESTED_NAMESPACE::USetStrings; + * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode)); + * for (auto s : USetStrings(uset.getAlias())) { + * int32_t len32 = s.length(); + * char utf8[200]; + * u_strToUTF8WithSub(utf8, int32_t{sizeof(utf8) - 1}, nullptr, + * s.data(), len32, 0xFFFD, nullptr, errorCode); + * printf("uset.string length %ld \"%s\"\n", long{len32}, utf8); + * } + * \endcode + * + * C++ UnicodeSet has member functions for iteration, including strings(). + * + * @stable ICU 76 + * @see USetCodePoints + * @see USetRanges + * @see USetElements + */ +class USetStrings { +public: + /** + * Constructs a C++ "range" object over the strings of the USet. + * @stable ICU 76 + */ + USetStrings(const USet *pUset) : uset(pUset), count(uset_getStringCount(pUset)) {} + + /** @stable ICU 76 */ + USetStrings(const USetStrings &other) = default; + + /** @stable ICU 76 */ + USetStringIterator begin() const { + return USetStringIterator(uset, 0, count); + } + + /** @stable ICU 76 */ + USetStringIterator end() const { + return USetStringIterator(uset, count, count); + } + +private: + const USet *uset; + int32_t count; +}; + +#ifndef U_HIDE_DRAFT_API +/** + * Iterator returned by USetElements. + * @draft ICU 77 + */ +class USetElementIterator { +public: + /** @draft ICU 77 */ + USetElementIterator(const USetElementIterator &other) = default; + + /** @draft ICU 77 */ + bool operator==(const USetElementIterator &other) const { + // No need to compare rangeCount & end given private constructor + // and assuming we don't compare iterators across the set being modified. + // We might even skip comparing uset. + // Unless we want operator==() to be "correct" for more than iteration. + return uset == other.uset && c == other.c && index == other.index; + } + + /** @draft ICU 77 */ + bool operator!=(const USetElementIterator &other) const { return !operator==(other); } + + /** @draft ICU 77 */ + std::u16string operator*() const { + if (c >= 0) { + return c <= 0xffff ? + std::u16string({static_cast<char16_t>(c)}) : + std::u16string({U16_LEAD(c), U16_TRAIL(c)}); + } else if (index < totalCount) { + int32_t length; + const UChar *uchars = uset_getString(uset, index - rangeCount, &length); + // assert uchars != nullptr; + return {uprv_char16PtrFromUChar(uchars), static_cast<size_t>(length)}; + } else { + return {}; + } + } + + /** + * Pre-increment. + * @draft ICU 77 + */ + USetElementIterator &operator++() { + if (c < end) { + ++c; + } else if (index < rangeCount) { + UErrorCode errorCode = U_ZERO_ERROR; + int32_t result = uset_getItem(uset, index, &c, &end, nullptr, 0, &errorCode); + if (U_SUCCESS(errorCode) && result == 0) { + ++index; + } else { + c = end = U_SENTINEL; + } + } else if (c >= 0) { + // assert index == rangeCount; + // Switch from the last range to the first string. + c = end = U_SENTINEL; + } else { + ++index; + } + return *this; + } + + /** + * Post-increment. + * @draft ICU 77 + */ + USetElementIterator operator++(int) { + USetElementIterator result(*this); + operator++(); + return result; + } + +private: + friend class USetElements; + + USetElementIterator(const USet *pUset, int32_t nIndex, int32_t nRangeCount, int32_t nTotalCount) + : uset(pUset), index(nIndex), rangeCount(nRangeCount), totalCount(nTotalCount), + c(U_SENTINEL), end(U_SENTINEL) { + if (index < rangeCount) { + // Fetch the first range. + operator++(); + } + // Otherwise don't move beyond the (index - rangeCount)-th string. + } + + const USet *uset; + int32_t index; + /** Number of UnicodeSet/USet code point ranges. */ + int32_t rangeCount; + /** + * Number of code point ranges plus number of strings. + * index starts from 0, counts ranges while less than rangeCount, + * then counts strings while at least rangeCount and less than totalCount. + * + * Note that totalCount is the same as uset_getItemCount(), but usually + * smaller than the number of elements returned by this iterator + * because we return each code point of each range. + */ + int32_t totalCount; + UChar32 c, end; +}; + +/** + * A C++ "range" for iterating over all of the elements of a USet. + * Convenient all-in one iteration, but creates a std::u16string for each + * code point or string. + * + * Code points are returned first, then empty and multi-character strings. + * + * \code + * using U_HEADER_NESTED_NAMESPACE::USetElements; + * LocalUSetPointer uset(uset_openPattern(u"[abcçカ🚴{}{abc}{de}]", -1, &errorCode)); + * for (auto el : USetElements(uset.getAlias())) { + * int32_t len32 = el.length(); + * char utf8[200]; + * u_strToUTF8WithSub(utf8, int32_t{sizeof(utf8) - 1}, nullptr, + * el.data(), len32, 0xFFFD, nullptr, errorCode); + * printf("uset.element length %ld \"%s\"\n", long{len32}, utf8); + * } + * \endcode + * + * C++ UnicodeSet has member functions for iteration, including begin() and end(). + * + * @return an all-elements iterator. + * @draft ICU 77 + * @see USetCodePoints + * @see USetRanges + * @see USetStrings + */ +class USetElements { +public: + /** + * Constructs a C++ "range" object over all of the elements of the USet. + * @draft ICU 77 + */ + USetElements(const USet *pUset) + : uset(pUset), rangeCount(uset_getRangeCount(pUset)), + stringCount(uset_getStringCount(pUset)) {} + + /** @draft ICU 77 */ + USetElements(const USetElements &other) = default; + + /** @draft ICU 77 */ + USetElementIterator begin() const { + return USetElementIterator(uset, 0, rangeCount, rangeCount + stringCount); + } + + /** @draft ICU 77 */ + USetElementIterator end() const { + return USetElementIterator(uset, rangeCount + stringCount, rangeCount, rangeCount + stringCount); + } + +private: + const USet *uset; + int32_t rangeCount, stringCount; +}; + +#endif // U_HIDE_DRAFT_API + +} // namespace U_HEADER_ONLY_NAMESPACE + +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +#endif // __USET_H__ diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index 03c697c7228442..a3d08254d69584 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -1107,8 +1107,8 @@ u_strToLower(UChar *dest, int32_t destCapacity, * styles, using rules and dictionaries beyond the standard iterators. * It may be more efficient to always provide an iterator to avoid * opening and closing one for each string. - * The standard titlecase iterator for the root locale implements the - * algorithm of Unicode TR 21. + * If the break iterator passed in is null, the default Unicode algorithm + * will be used to determine the titlecase positions. * * This function uses only the setText(), first() and next() methods of the * provided break iterator. diff --git a/deps/icu-small/source/common/unicode/utf.h b/deps/icu-small/source/common/unicode/utf.h index c9d5f5785c5a46..f2d4c64a8b1979 100644 --- a/deps/icu-small/source/common/unicode/utf.h +++ b/deps/icu-small/source/common/unicode/utf.h @@ -121,8 +121,39 @@ /* single-code point definitions -------------------------------------------- */ +#ifndef U_HIDE_DRAFT_API + +/** + * Is c a Unicode code point U+0000..U+10FFFF? + * https://www.unicode.org/glossary/#code_point + * + * @param c 32-bit code point + * @return true or false + * @draft ICU 78 + * @see AllCodePoints + * @see U_IS_SCALAR_VALUE + */ +#define U_IS_CODE_POINT(c) ((uint32_t)(c)<=0x10ffff) + +/** + * Is c a Unicode scalar value, that is, a non-surrogate code point? + * Only scalar values can be represented in well-formed UTF-8/16/32. + * https://www.unicode.org/glossary/#unicode_scalar_value + * + * @param c 32-bit code point + * @return true or false + * @draft ICU 78 + * @see AllScalarValues + * @see U_IS_CODE_POINT + */ +#define U_IS_SCALAR_VALUE(c) ((uint32_t)(c)<0xd800 || (0xe000<=(c) && (c)<=0x10ffff)) + +#endif // U_HIDE_DRAFT_API + /** * Is this code point a Unicode noncharacter? + * https://www.unicode.org/glossary/#noncharacter + * * @param c 32-bit code point * @return true or false * @stable ICU 2.4 @@ -150,7 +181,7 @@ */ #define U_IS_UNICODE_CHAR(c) \ ((uint32_t)(c)<0xd800 || \ - (0xdfff<(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c))) + (0xe000<=(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c))) /** * Is this code point a BMP code point (U+0000..U+ffff)? diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 5a07435fcf6096..2f6c0013b14aa6 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -124,7 +124,7 @@ * @internal */ U_CAPI UChar32 U_EXPORT2 -utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict); +utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, int8_t strict); /** * Function for handling "append code point" with error-checking. @@ -148,7 +148,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool * @internal */ U_CAPI UChar32 U_EXPORT2 -utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict); +utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, int8_t strict); /** * Function for handling "skip backward one code point" with error-checking. @@ -170,7 +170,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @return true or false * @stable ICU 2.4 */ -#define U8_IS_SINGLE(c) (((c)&0x80)==0) +#define U8_IS_SINGLE(c) ((int8_t)(c)>=0) /** * Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4) @@ -214,6 +214,32 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_MAX_LENGTH 4 +#ifndef U_HIDE_DRAFT_API + +/** + * Returns the length of a well-formed UTF-8 byte sequence according to its lead byte. + * Returns 1 for 0..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 1..4 + * @draft ICU 78 + */ +#define U8_LENGTH_FROM_LEAD_BYTE(leadByte) (U8_COUNT_TRAIL_BYTES(leadByte) + 1) + +/** + * Returns the length of a well-formed UTF-8 byte sequence according to its lead byte. + * Returns 1 for 0..0xc1. Undefined for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 1..4 + * @draft ICU 78 + */ +#define U8_LENGTH_FROM_LEAD_BYTE_UNSAFE(leadByte) (U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte) + 1) + +#endif // U_HIDE_DRAFT_API + /** * Get a code point from a string at a random-access offset, * without changing the offset. @@ -517,7 +543,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); if(U8_IS_TRAIL(__t1)) { \ ++(i); \ } \ - } else /* c>=0xf0 */ { \ + } else /* b>=0xf0 */ { \ if(U8_IS_VALID_LEAD4_AND_T1(__b, __t1) && \ ++(i)!=(length) && U8_IS_TRAIL((s)[i]) && \ ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ @@ -683,7 +709,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV_UNSAFE(s, i, c) UPRV_BLOCK_MACRO_BEGIN { \ (c)=(uint8_t)(s)[--(i)]; \ - if(U8_IS_TRAIL(c)) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __b, __count=1, __shift=6; \ \ /* c is a trail byte */ \ diff --git a/deps/icu-small/source/common/unicode/utf_old.h b/deps/icu-small/source/common/unicode/utf_old.h index 6b868c72809b18..5af5eeaeab1815 100644 --- a/deps/icu-small/source/common/unicode/utf_old.h +++ b/deps/icu-small/source/common/unicode/utf_old.h @@ -385,8 +385,10 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* each following branch falls through to the next one */ \ case 3: \ (c)=((c)<<6)|((s)[(i)++]&0x3f); \ + U_FALLTHROUGH; \ case 2: \ (c)=((c)<<6)|((s)[(i)++]&0x3f); \ + U_FALLTHROUGH; \ case 1: \ (c)=((c)<<6)|((s)[(i)++]&0x3f); \ /* no other branches to optimize switch() */ \ diff --git a/deps/icu-small/source/common/unicode/utfiterator.h b/deps/icu-small/source/common/unicode/utfiterator.h new file mode 100644 index 00000000000000..7e9fc4ba314d52 --- /dev/null +++ b/deps/icu-small/source/common/unicode/utfiterator.h @@ -0,0 +1,2677 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: https://www.unicode.org/copyright.html + +// utfiterator.h +// created: 2024aug12 Markus W. Scherer + +#ifndef __UTFITERATOR_H__ +#define __UTFITERATOR_H__ + +#include "unicode/utypes.h" + +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API || !defined(UTYPES_H) + +#include <iterator> +#if defined(__cpp_lib_ranges) +#include <ranges> +#endif +#include <string> +#include <string_view> +#include <type_traits> +#include "unicode/utf16.h" +#include "unicode/utf8.h" +#include "unicode/uversion.h" + +/** + * \file + * \brief C++ header-only API: C++ iterators over Unicode strings (=UTF-8/16/32 if well-formed). + * + * Sample code: + * \code + * #include <string_view> + * #include <iostream> + * #include "unicode/utypes.h" + * #include "unicode/utfiterator.h" + * + * using icu::header::utfIterator; + * using icu::header::utfStringCodePoints; + * using icu::header::unsafeUTFIterator; + * using icu::header::unsafeUTFStringCodePoints; + * + * int32_t rangeLoop16(std::u16string_view s) { + * // We are just adding up the code points for minimal-code demonstration purposes. + * int32_t sum = 0; + * for (auto units : utfStringCodePoints<UChar32, UTF_BEHAVIOR_NEGATIVE>(s)) { + * sum += units.codePoint(); // < 0 if ill-formed + * } + * return sum; + * } + * + * int32_t loopIterPlusPlus16(std::u16string_view s) { + * auto range = utfStringCodePoints<char32_t, UTF_BEHAVIOR_FFFD>(s); + * int32_t sum = 0; + * for (auto iter = range.begin(), limit = range.end(); iter != limit;) { + * sum += (*iter++).codePoint(); // U+FFFD if ill-formed + * } + * return sum; + * } + * + * int32_t backwardLoop16(std::u16string_view s) { + * auto range = utfStringCodePoints<UChar32, UTF_BEHAVIOR_SURROGATE>(s); + * int32_t sum = 0; + * for (auto start = range.begin(), iter = range.end(); start != iter;) { + * sum += (*--iter).codePoint(); // surrogate code point if unpaired / ill-formed + * } + * return sum; + * } + * + * int32_t reverseLoop8(std::string_view s) { + * auto range = utfStringCodePoints<char32_t, UTF_BEHAVIOR_FFFD>(s); + * int32_t sum = 0; + * for (auto iter = range.rbegin(), limit = range.rend(); iter != limit; ++iter) { + * sum += iter->codePoint(); // U+FFFD if ill-formed + * } + * return sum; + * } + * + * int32_t countCodePoints16(std::u16string_view s) { + * auto range = utfStringCodePoints<UChar32, UTF_BEHAVIOR_SURROGATE>(s); + * return std::distance(range.begin(), range.end()); + * } + * + * int32_t unsafeRangeLoop16(std::u16string_view s) { + * int32_t sum = 0; + * for (auto units : unsafeUTFStringCodePoints<UChar32>(s)) { + * sum += units.codePoint(); + * } + * return sum; + * } + * + * int32_t unsafeReverseLoop8(std::string_view s) { + * auto range = unsafeUTFStringCodePoints<UChar32>(s); + * int32_t sum = 0; + * for (auto iter = range.rbegin(), limit = range.rend(); iter != limit; ++iter) { + * sum += iter->codePoint(); + * } + * return sum; + * } + * + * char32_t firstCodePointOrFFFD16(std::u16string_view s) { + * if (s.empty()) { return 0xfffd; } + * auto range = utfStringCodePoints<char32_t, UTF_BEHAVIOR_FFFD>(s); + * return range.begin()->codePoint(); + * } + * + * std::string_view firstSequence8(std::string_view s) { + * if (s.empty()) { return {}; } + * auto range = utfStringCodePoints<char32_t, UTF_BEHAVIOR_FFFD>(s); + * auto units = *(range.begin()); + * if (units.wellFormed()) { + * return units.stringView(); + * } else { + * return {}; + * } + * } + * + * template<typename InputStream> // some istream or streambuf + * std::u32string cpFromInput(InputStream &in) { + * // This is a single-pass input_iterator. + * std::istreambuf_iterator bufIter(in); + * std::istreambuf_iterator<typename InputStream::char_type> bufLimit; + * auto iter = utfIterator<char32_t, UTF_BEHAVIOR_FFFD>(bufIter); + * auto limit = utfIterator<char32_t, UTF_BEHAVIOR_FFFD>(bufLimit); + * std::u32string s32; + * for (; iter != limit; ++iter) { + * s32.push_back(iter->codePoint()); + * } + * return s32; + * } + * + * std::u32string cpFromStdin() { return cpFromInput(std::cin); } + * std::u32string cpFromWideStdin() { return cpFromInput(std::wcin); } + * \endcode + */ + +#ifndef U_HIDE_DRAFT_API + +/** + * Some defined behaviors for handling ill-formed Unicode strings. + * This is a template parameter for UTFIterator and related classes. + * + * When a validating UTFIterator encounters an ill-formed code unit sequence, + * then CodeUnits.codePoint() is a value according to this parameter. + * + * @draft ICU 78 + * @see CodeUnits + * @see UTFIterator + * @see UTFStringCodePoints + */ +typedef enum UTFIllFormedBehavior { + /** + * Returns a negative value (-1=U_SENTINEL) instead of a code point. + * If the CP32 template parameter for the relevant classes is an unsigned type, + * then the negative value becomes 0xffffffff=UINT32_MAX. + * + * @draft ICU 78 + */ + UTF_BEHAVIOR_NEGATIVE, + /** Returns U+FFFD Replacement Character. @draft ICU 78 */ + UTF_BEHAVIOR_FFFD, + /** + * UTF-8: Not allowed; + * UTF-16: returns the unpaired surrogate; + * UTF-32: returns the surrogate code point, or U+FFFD if out of range. + * + * @draft ICU 78 + */ + UTF_BEHAVIOR_SURROGATE +} UTFIllFormedBehavior; + +namespace U_HEADER_ONLY_NAMESPACE { + +namespace prv { +#if U_CPLUSPLUS_VERSION >= 20 + +/** @internal */ +template<typename Iter> +using iter_value_t = typename std::iter_value_t<Iter>; + +/** @internal */ +template<typename Iter> +using iter_difference_t = std::iter_difference_t<Iter>; + +/** @internal */ +template<typename Iter> +constexpr bool forward_iterator = std::forward_iterator<Iter>; + +/** @internal */ +template<typename Iter> +constexpr bool bidirectional_iterator = std::bidirectional_iterator<Iter>; + +/** @internal */ +template<typename Range> +constexpr bool range = std::ranges::range<Range>; + +#else + +/** @internal */ +template<typename Iter> +using iter_value_t = typename std::iterator_traits<Iter>::value_type; + +/** @internal */ +template<typename Iter> +using iter_difference_t = typename std::iterator_traits<Iter>::difference_type; + +/** @internal */ +template<typename Iter> +constexpr bool forward_iterator = + std::is_base_of_v< + std::forward_iterator_tag, + typename std::iterator_traits<Iter>::iterator_category>; + +/** @internal */ +template<typename Iter> +constexpr bool bidirectional_iterator = + std::is_base_of_v< + std::bidirectional_iterator_tag, + typename std::iterator_traits<Iter>::iterator_category>; + +/** @internal */ +template<typename Range, typename = void> +struct range_type : std::false_type {}; + +/** @internal */ +template<typename Range> +struct range_type< + Range, + std::void_t<decltype(std::declval<Range>().begin()), + decltype(std::declval<Range>().end())>> : std::true_type {}; + +/** @internal */ +template<typename Range> +constexpr bool range = range_type<Range>::value; + +#endif + +/** @internal */ +template <typename T> struct is_basic_string_view : std::false_type {}; + +/** @internal */ +template <typename... Args> +struct is_basic_string_view<std::basic_string_view<Args...>> : std::true_type {}; + +/** @internal */ +template <typename T> constexpr bool is_basic_string_view_v = is_basic_string_view<T>::value; + +/** @internal */ +template<typename CP32, bool skipSurrogates> +class CodePointsIterator { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + /** C++ iterator boilerplate @internal */ + using value_type = CP32; + /** C++ iterator boilerplate @internal */ + using reference = value_type; + /** C++ iterator boilerplate @internal */ + using pointer = CP32 *; + /** C++ iterator boilerplate @internal */ + using difference_type = int32_t; + /** C++ iterator boilerplate @internal */ + using iterator_category = std::forward_iterator_tag; + + /** @internal */ + inline CodePointsIterator(CP32 c) : c_(c) {} + /** @internal */ + inline bool operator==(const CodePointsIterator &other) const { return c_ == other.c_; } + /** @internal */ + inline bool operator!=(const CodePointsIterator &other) const { return !operator==(other); } + /** @internal */ + inline CP32 operator*() const { return c_; } + /** @internal */ + inline CodePointsIterator &operator++() { // pre-increment + ++c_; + if (skipSurrogates && c_ == 0xd800) { + c_ = 0xe000; + } + return *this; + } + /** @internal */ + inline CodePointsIterator operator++(int) { // post-increment + CodePointsIterator result(*this); + ++(*this); + return result; + } + +private: + CP32 c_; +}; + +} // namespace prv + +/** + * A C++ "range" over all Unicode code points U+0000..U+10FFFF. + * https://www.unicode.org/glossary/#code_point + * + * Intended for test and builder code. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @draft ICU 78 + * @see U_IS_CODE_POINT + */ +template<typename CP32> +class AllCodePoints { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + /** Constructor. @draft ICU 78 */ + AllCodePoints() {} + /** + * @return an iterator over all Unicode code points. + * The iterator returns CP32 integers. + * @draft ICU 78 + */ + auto begin() const { return prv::CodePointsIterator<CP32, false>(0); } + /** + * @return an exclusive-end iterator over all Unicode code points. + * @draft ICU 78 + */ + auto end() const { return prv::CodePointsIterator<CP32, false>(0x110000); } +}; + +/** + * A C++ "range" over all Unicode scalar values U+0000..U+D7FF & U+E000..U+10FFFF. + * That is, all code points except surrogates. + * Only scalar values can be represented in well-formed UTF-8/16/32. + * https://www.unicode.org/glossary/#unicode_scalar_value + * + * Intended for test and builder code. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @draft ICU 78 + * @see U_IS_SCALAR_VALUE + */ +template<typename CP32> +class AllScalarValues { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + /** Constructor. @draft ICU 78 */ + AllScalarValues() {} + /** + * @return an iterator over all Unicode scalar values. + * The iterator returns CP32 integers. + * @draft ICU 78 + */ + auto begin() const { return prv::CodePointsIterator<CP32, true>(0); } + /** + * @return an exclusive-end iterator over all Unicode scalar values. + * @draft ICU 78 + */ + auto end() const { return prv::CodePointsIterator<CP32, true>(0x110000); } +}; + +/** + * Result of decoding a code unit sequence for one code point. + * Returned from non-validating Unicode string code point iterators. + * Base class for class CodeUnits which is returned from validating iterators. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t; + * should be signed if UTF_BEHAVIOR_NEGATIVE + * @tparam UnitIter An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @see UnsafeUTFIterator + * @see UnsafeUTFStringCodePoints + * @draft ICU 78 + */ +template<typename CP32, typename UnitIter, typename = void> +class UnsafeCodeUnits { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Unit = typename prv::iter_value_t<UnitIter>; +public: + /** @internal */ + UnsafeCodeUnits(CP32 codePoint, uint8_t length, UnitIter start, UnitIter limit) : + c_(codePoint), len_(length), start_(start), limit_(limit) {} + + /** Copy constructor. @draft ICU 78 */ + UnsafeCodeUnits(const UnsafeCodeUnits &other) = default; + /** Copy assignment operator. @draft ICU 78 */ + UnsafeCodeUnits &operator=(const UnsafeCodeUnits &other) = default; + + /** + * @return the Unicode code point decoded from the code unit sequence. + * If the sequence is ill-formed and the iterator validates, + * then this is a replacement value according to the iterator‘s + * UTFIllFormedBehavior template parameter. + * @draft ICU 78 + */ + CP32 codePoint() const { return c_; } + + /** + * @return the start of the code unit sequence for one code point. + * Only enabled if UnitIter is a (multi-pass) forward_iterator or better. + * @draft ICU 78 + */ + UnitIter begin() const { return start_; } + + /** + * @return the limit (exclusive end) of the code unit sequence for one code point. + * Only enabled if UnitIter is a (multi-pass) forward_iterator or better. + * @draft ICU 78 + */ + UnitIter end() const { return limit_; } + + /** + * @return the length of the code unit sequence for one code point. + * @draft ICU 78 + */ + uint8_t length() const { return len_; } + +#if U_CPLUSPLUS_VERSION >= 20 + /** + * @return a string_view of the code unit sequence for one code point. + * Only works if UnitIter is a pointer or a contiguous_iterator. + * @draft ICU 78 + */ + template<std::contiguous_iterator Iter = UnitIter> + std::basic_string_view<Unit> stringView() const { + return std::basic_string_view<Unit>(begin(), end()); + } +#else + /** + * @return a string_view of the code unit sequence for one code point. + * Only works if UnitIter is a pointer or a contiguous_iterator. + * @draft ICU 78 + */ + template<typename Iter = UnitIter, typename Unit = typename std::iterator_traits<Iter>::value_type> + std::enable_if_t<std::is_pointer_v<Iter> || + std::is_same_v<Iter, typename std::basic_string<Unit>::iterator> || + std::is_same_v<Iter, typename std::basic_string<Unit>::const_iterator> || + std::is_same_v<Iter, typename std::basic_string_view<Unit>::iterator> || + std::is_same_v<Iter, typename std::basic_string_view<Unit>::const_iterator>, + std::basic_string_view<Unit>> + stringView() const { + return std::basic_string_view<Unit>(&*start_, len_); + } +#endif + +private: + // Order of fields with padding and access frequency in mind. + CP32 c_; + uint8_t len_; + UnitIter start_; + UnitIter limit_; +}; + +#ifndef U_IN_DOXYGEN +// Partial template specialization for single-pass input iterator. +// No UnitIter field, no getter for it, no stringView(). +template<typename CP32, typename UnitIter> +class UnsafeCodeUnits< + CP32, + UnitIter, + std::enable_if_t<!prv::forward_iterator<UnitIter>>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + UnsafeCodeUnits(CP32 codePoint, uint8_t length) : c_(codePoint), len_(length) {} + + UnsafeCodeUnits(const UnsafeCodeUnits &other) = default; + UnsafeCodeUnits &operator=(const UnsafeCodeUnits &other) = default; + + CP32 codePoint() const { return c_; } + + uint8_t length() const { return len_; } + +private: + // Order of fields with padding and access frequency in mind. + CP32 c_; + uint8_t len_; +}; +#endif // U_IN_DOXYGEN + +/** + * Result of validating and decoding a code unit sequence for one code point. + * Returned from validating Unicode string code point iterators. + * Adds function wellFormed() to base class UnsafeCodeUnits. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t; + * should be signed if UTF_BEHAVIOR_NEGATIVE + * @tparam UnitIter An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @see UTFIterator + * @see UTFStringCodePoints + * @draft ICU 78 + */ +template<typename CP32, typename UnitIter, typename = void> +class CodeUnits : public UnsafeCodeUnits<CP32, UnitIter> { +public: + /** @internal */ + CodeUnits(CP32 codePoint, uint8_t length, bool wellFormed, UnitIter start, UnitIter limit) : + UnsafeCodeUnits<CP32, UnitIter>(codePoint, length, start, limit), ok_(wellFormed) {} + + /** Copy constructor. @draft ICU 78 */ + CodeUnits(const CodeUnits &other) = default; + /** Copy assignment operator. @draft ICU 78 */ + CodeUnits &operator=(const CodeUnits &other) = default; + + /** + * @return true if the decoded code unit sequence is well-formed. + * @draft ICU 78 + */ + bool wellFormed() const { return ok_; } + +private: + bool ok_; +}; + +#ifndef U_IN_DOXYGEN +// Partial template specialization for single-pass input iterator. +// No UnitIter field, no getter for it, no stringView(). +template<typename CP32, typename UnitIter> +class CodeUnits< + CP32, + UnitIter, + std::enable_if_t<!prv::forward_iterator<UnitIter>>> : + public UnsafeCodeUnits<CP32, UnitIter> { +public: + CodeUnits(CP32 codePoint, uint8_t length, bool wellFormed) : + UnsafeCodeUnits<CP32, UnitIter>(codePoint, length), ok_(wellFormed) {} + + CodeUnits(const CodeUnits &other) = default; + CodeUnits &operator=(const CodeUnits &other) = default; + + bool wellFormed() const { return ok_; } + +private: + bool ok_; +}; +#endif // U_IN_DOXYGEN + +// Validating implementations ---------------------------------------------- *** + +#ifndef U_IN_DOXYGEN +template<typename CP32, UTFIllFormedBehavior behavior, + typename UnitIter, typename LimitIter = UnitIter, typename = void> +class UTFImpl; + +// Note: readAndInc() functions take both a p0 and a p iterator. +// They must have the same value. +// For a multi-pass UnitIter, the caller must copy its p into a local variable p0, +// and readAndInc() copies p0 and the incremented p into the CodeUnits. +// For a single-pass UnitIter, which may not be default-constructible nor coypable, +// the caller can pass p into both references, and readAndInc() does not use p0 +// and constructs CodeUnits without them. +// Moving the p0 variable into the call site avoids having to declare it inside readAndInc() +// which may not be possible for a single-pass iterator. + +// UTF-8 +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter, typename LimitIter> +class UTFImpl< + CP32, behavior, + UnitIter, LimitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 1>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + static_assert(behavior != UTF_BEHAVIOR_SURROGATE, + "For 8-bit strings, the SURROGATE option does not have an equivalent."); +public: + // Handle ill-formed UTF-8 + U_FORCE_INLINE static CP32 sub() { + switch (behavior) { + case UTF_BEHAVIOR_NEGATIVE: return U_SENTINEL; + case UTF_BEHAVIOR_FFFD: return 0xfffd; + } + } + + U_FORCE_INLINE static void inc(UnitIter &p, const LimitIter &limit) { + // Very similar to U8_FWD_1(). + uint8_t b = *p; + ++p; + if (U8_IS_LEAD(b) && p != limit) { + uint8_t t1 = *p; + if ((0xe0 <= b && b < 0xf0)) { + if (U8_IS_VALID_LEAD3_AND_T1(b, t1) && + ++p != limit && U8_IS_TRAIL(*p)) { + ++p; + } + } else if (b < 0xe0) { + if (U8_IS_TRAIL(t1)) { + ++p; + } + } else /* b >= 0xf0 */ { + if (U8_IS_VALID_LEAD4_AND_T1(b, t1) && + ++p != limit && U8_IS_TRAIL(*p) && + ++p != limit && U8_IS_TRAIL(*p)) { + ++p; + } + } + } + } + + U_FORCE_INLINE static void dec(UnitIter start, UnitIter &p) { + // Very similar to U8_BACK_1(). + uint8_t c = *--p; + if (U8_IS_TRAIL(c) && p != start) { + UnitIter p1 = p; + uint8_t b1 = *--p1; + if (U8_IS_LEAD(b1)) { + if (b1 < 0xe0 || + (b1 < 0xf0 ? + U8_IS_VALID_LEAD3_AND_T1(b1, c) : + U8_IS_VALID_LEAD4_AND_T1(b1, c))) { + p = p1; + return; + } + } else if (U8_IS_TRAIL(b1) && p1 != start) { + uint8_t b2 = *--p1; + if (0xe0 <= b2 && b2 <= 0xf4) { + if (b2 < 0xf0 ? + U8_IS_VALID_LEAD3_AND_T1(b2, b1) : + U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + p = p1; + return; + } + } else if (U8_IS_TRAIL(b2) && p1 != start) { + uint8_t b3 = *--p1; + if (0xf0 <= b3 && b3 <= 0xf4 && U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + p = p1; + return; + } + } + } + } + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> readAndInc( + UnitIter &p0, UnitIter &p, const LimitIter &limit) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + // Very similar to U8_NEXT_OR_FFFD(). + CP32 c = uint8_t(*p); + ++p; + if (U8_IS_SINGLE(c)) { + if constexpr (isMultiPass) { + return {c, 1, true, p0, p}; + } else { + return {c, 1, true}; + } + } + uint8_t length = 1; + uint8_t t = 0; + if (p != limit && + // fetch/validate/assemble all but last trail byte + (c >= 0xe0 ? + (c < 0xf0 ? // U+0800..U+FFFF except surrogates + U8_LEAD3_T1_BITS[c &= 0xf] & (1 << ((t = *p) >> 5)) && + (t &= 0x3f, 1) + : // U+10000..U+10FFFF + (c -= 0xf0) <= 4 && + U8_LEAD4_T1_BITS[(t = *p) >> 4] & (1 << c) && + (c = (c << 6) | (t & 0x3f), ++length, ++p != limit) && + (t = *p - 0x80) <= 0x3f) && + // valid second-to-last trail byte + (c = (c << 6) | t, ++length, ++p != limit) + : // U+0080..U+07FF + c >= 0xc2 && (c &= 0x1f, 1)) && + // last trail byte + (t = *p - 0x80) <= 0x3f) { + c = (c << 6) | t; + ++length; + ++p; + if constexpr (isMultiPass) { + return {c, length, true, p0, p}; + } else { + return {c, length, true}; + } + } + if constexpr (isMultiPass) { + return {sub(), length, false, p0, p}; + } else { + return {sub(), length, false}; + } + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> decAndRead(UnitIter start, UnitIter &p) { + // Very similar to U8_PREV_OR_FFFD(). + UnitIter p0 = p; + CP32 c = uint8_t(*--p); + if (U8_IS_SINGLE(c)) { + return {c, 1, true, p, p0}; + } + if (U8_IS_TRAIL(c) && p != start) { + UnitIter p1 = p; + uint8_t b1 = *--p1; + if (U8_IS_LEAD(b1)) { + if (b1 < 0xe0) { + p = p1; + c = ((b1 - 0xc0) << 6) | (c & 0x3f); + return {c, 2, true, p, p0}; + } else if (b1 < 0xf0 ? + U8_IS_VALID_LEAD3_AND_T1(b1, c) : + U8_IS_VALID_LEAD4_AND_T1(b1, c)) { + // Truncated 3- or 4-byte sequence. + p = p1; + return {sub(), 2, false, p, p0}; + } + } else if (U8_IS_TRAIL(b1) && p1 != start) { + // Extract the value bits from the last trail byte. + c &= 0x3f; + uint8_t b2 = *--p1; + if (0xe0 <= b2 && b2 <= 0xf4) { + if (b2 < 0xf0) { + b2 &= 0xf; + if (U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + p = p1; + c = (b2 << 12) | ((b1 & 0x3f) << 6) | c; + return {c, 3, true, p, p0}; + } + } else if (U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + // Truncated 4-byte sequence. + p = p1; + return {sub(), 3, false, p, p0}; + } + } else if (U8_IS_TRAIL(b2) && p1 != start) { + uint8_t b3 = *--p1; + if (0xf0 <= b3 && b3 <= 0xf4) { + b3 &= 7; + if (U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + p = p1; + c = (b3 << 18) | ((b2 & 0x3f) << 12) | ((b1 & 0x3f) << 6) | c; + return {c, 4, true, p, p0}; + } + } + } + } + } + return {sub(), 1, false, p, p0}; + } +}; + +// UTF-16 +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter, typename LimitIter> +class UTFImpl< + CP32, behavior, + UnitIter, LimitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 2>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + // Handle ill-formed UTF-16: One unpaired surrogate. + U_FORCE_INLINE static CP32 sub(CP32 surrogate) { + switch (behavior) { + case UTF_BEHAVIOR_NEGATIVE: return U_SENTINEL; + case UTF_BEHAVIOR_FFFD: return 0xfffd; + case UTF_BEHAVIOR_SURROGATE: return surrogate; + } + } + + U_FORCE_INLINE static void inc(UnitIter &p, const LimitIter &limit) { + // Very similar to U16_FWD_1(). + auto c = *p; + ++p; + if (U16_IS_LEAD(c) && p != limit && U16_IS_TRAIL(*p)) { + ++p; + } + } + + U_FORCE_INLINE static void dec(UnitIter start, UnitIter &p) { + // Very similar to U16_BACK_1(). + UnitIter p1; + if (U16_IS_TRAIL(*--p) && p != start && (p1 = p, U16_IS_LEAD(*--p1))) { + p = p1; + } + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> readAndInc( + UnitIter &p0, UnitIter &p, const LimitIter &limit) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + // Very similar to U16_NEXT_OR_FFFD(). + CP32 c = static_cast<CP32>(*p); + ++p; + if (!U16_IS_SURROGATE(c)) { + if constexpr (isMultiPass) { + return {c, 1, true, p0, p}; + } else { + return {c, 1, true}; + } + } else { + uint16_t c2; + if (U16_IS_SURROGATE_LEAD(c) && p != limit && U16_IS_TRAIL(c2 = *p)) { + ++p; + c = U16_GET_SUPPLEMENTARY(c, c2); + if constexpr (isMultiPass) { + return {c, 2, true, p0, p}; + } else { + return {c, 2, true}; + } + } else { + if constexpr (isMultiPass) { + return {sub(c), 1, false, p0, p}; + } else { + return {sub(c), 1, false}; + } + } + } + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> decAndRead(UnitIter start, UnitIter &p) { + // Very similar to U16_PREV_OR_FFFD(). + UnitIter p0 = p; + CP32 c = static_cast<CP32>(*--p); + if (!U16_IS_SURROGATE(c)) { + return {c, 1, true, p, p0}; + } else { + UnitIter p1; + uint16_t c2; + if (U16_IS_SURROGATE_TRAIL(c) && p != start && (p1 = p, U16_IS_LEAD(c2 = *--p1))) { + p = p1; + c = U16_GET_SUPPLEMENTARY(c2, c); + return {c, 2, true, p, p0}; + } else { + return {sub(c), 1, false, p, p0}; + } + } + } +}; + +// UTF-32: trivial, but still validating +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter, typename LimitIter> +class UTFImpl< + CP32, behavior, + UnitIter, LimitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 4>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + // Handle ill-formed UTF-32 + U_FORCE_INLINE static CP32 sub(bool forSurrogate, CP32 surrogate) { + switch (behavior) { + case UTF_BEHAVIOR_NEGATIVE: return U_SENTINEL; + case UTF_BEHAVIOR_FFFD: return 0xfffd; + case UTF_BEHAVIOR_SURROGATE: return forSurrogate ? surrogate : 0xfffd; + } + } + + U_FORCE_INLINE static void inc(UnitIter &p, const LimitIter &/*limit*/) { + ++p; + } + + U_FORCE_INLINE static void dec(UnitIter /*start*/, UnitIter &p) { + --p; + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> readAndInc( + UnitIter &p0, UnitIter &p, const LimitIter &/*limit*/) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + uint32_t uc = *p; + CP32 c = uc; + ++p; + if (uc < 0xd800 || (0xe000 <= uc && uc <= 0x10ffff)) { + if constexpr (isMultiPass) { + return {c, 1, true, p0, p}; + } else { + return {c, 1, true}; + } + } else { + if constexpr (isMultiPass) { + return {sub(uc < 0xe000, c), 1, false, p0, p}; + } else { + return {sub(uc < 0xe000, c), 1, false}; + } + } + } + + U_FORCE_INLINE static CodeUnits<CP32, UnitIter> decAndRead(UnitIter /*start*/, UnitIter &p) { + UnitIter p0 = p; + uint32_t uc = *--p; + CP32 c = uc; + if (uc < 0xd800 || (0xe000 <= uc && uc <= 0x10ffff)) { + return {c, 1, true, p, p0}; + } else { + return {sub(uc < 0xe000, c), 1, false, p, p0}; + } + } +}; + +// Non-validating implementations ------------------------------------------ *** + +template<typename CP32, typename UnitIter, typename = void> +class UnsafeUTFImpl; + +// UTF-8 +template<typename CP32, typename UnitIter> +class UnsafeUTFImpl< + CP32, + UnitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 1>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + U_FORCE_INLINE static void inc(UnitIter &p) { + // Very similar to U8_FWD_1_UNSAFE(). + uint8_t b = *p; + std::advance(p, 1 + U8_COUNT_TRAIL_BYTES_UNSAFE(b)); + } + + U_FORCE_INLINE static void dec(UnitIter &p) { + // Very similar to U8_BACK_1_UNSAFE(). + while (U8_IS_TRAIL(*--p)) {} + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + // Very similar to U8_NEXT_UNSAFE(). + CP32 c = uint8_t(*p); + ++p; + if (U8_IS_SINGLE(c)) { + if constexpr (isMultiPass) { + return {c, 1, p0, p}; + } else { + return {c, 1}; + } + } else if (c < 0xe0) { + c = ((c & 0x1f) << 6) | (*p & 0x3f); + ++p; + if constexpr (isMultiPass) { + return {c, 2, p0, p}; + } else { + return {c, 2}; + } + } else if (c < 0xf0) { + // No need for (c&0xf) because the upper bits are truncated + // after <<12 in the cast to uint16_t. + c = uint16_t(c << 12) | ((*p & 0x3f) << 6); + ++p; + c |= *p & 0x3f; + ++p; + if constexpr (isMultiPass) { + return {c, 3, p0, p}; + } else { + return {c, 3}; + } + } else { + c = ((c & 7) << 18) | ((*p & 0x3f) << 12); + ++p; + c |= (*p & 0x3f) << 6; + ++p; + c |= *p & 0x3f; + ++p; + if constexpr (isMultiPass) { + return {c, 4, p0, p}; + } else { + return {c, 4}; + } + } + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) { + // Very similar to U8_PREV_UNSAFE(). + UnitIter p0 = p; + CP32 c = uint8_t(*--p); + if (U8_IS_SINGLE(c)) { + return {c, 1, p, p0}; + } + // U8_IS_TRAIL(c) if well-formed + c &= 0x3f; + uint8_t count = 1; + for (uint8_t shift = 6;;) { + uint8_t b = *--p; + if (b >= 0xc0) { + U8_MASK_LEAD_BYTE(b, count); + c |= uint32_t{b} << shift; + break; + } else { + c |= (uint32_t{b} & 0x3f) << shift; + ++count; + shift += 6; + } + } + ++count; + return {c, count, p, p0}; + } +}; + +// UTF-16 +template<typename CP32, typename UnitIter> +class UnsafeUTFImpl< + CP32, + UnitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 2>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + U_FORCE_INLINE static void inc(UnitIter &p) { + // Very similar to U16_FWD_1_UNSAFE(). + auto c = *p; + ++p; + if (U16_IS_LEAD(c)) { + ++p; + } + } + + U_FORCE_INLINE static void dec(UnitIter &p) { + // Very similar to U16_BACK_1_UNSAFE(). + if (U16_IS_TRAIL(*--p)) { + --p; + } + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + // Very similar to U16_NEXT_UNSAFE(). + CP32 c = static_cast<CP32>(*p); + ++p; + if (!U16_IS_LEAD(c)) { + if constexpr (isMultiPass) { + return {c, 1, p0, p}; + } else { + return {c, 1}; + } + } else { + uint16_t c2 = *p; + ++p; + c = U16_GET_SUPPLEMENTARY(c, c2); + if constexpr (isMultiPass) { + return {c, 2, p0, p}; + } else { + return {c, 2}; + } + } + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) { + // Very similar to U16_PREV_UNSAFE(). + UnitIter p0 = p; + CP32 c = static_cast<CP32>(*--p); + if (!U16_IS_TRAIL(c)) { + return {c, 1, p, p0}; + } else { + uint16_t c2 = *--p; + c = U16_GET_SUPPLEMENTARY(c2, c); + return {c, 2, p, p0}; + } + } +}; + +// UTF-32: trivial +template<typename CP32, typename UnitIter> +class UnsafeUTFImpl< + CP32, + UnitIter, + std::enable_if_t<sizeof(typename prv::iter_value_t<UnitIter>) == 4>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + U_FORCE_INLINE static void inc(UnitIter &p) { + ++p; + } + + U_FORCE_INLINE static void dec(UnitIter &p) { + --p; + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> readAndInc(UnitIter &p0, UnitIter &p) { + constexpr bool isMultiPass = prv::forward_iterator<UnitIter>; + CP32 c = *p; + ++p; + if constexpr (isMultiPass) { + return {c, 1, p0, p}; + } else { + return {c, 1}; + } + } + + U_FORCE_INLINE static UnsafeCodeUnits<CP32, UnitIter> decAndRead(UnitIter &p) { + UnitIter p0 = p; + CP32 c = *--p; + return {c, 1, p, p0}; + } +}; + +#endif + +// Validating iterators ---------------------------------------------------- *** + +/** + * Validating iterator over the code points in a Unicode string. + * + * The UnitIter can be + * an input_iterator, a forward_iterator, or a bidirectional_iterator (including a pointer). + * The UTFIterator will have the corresponding iterator_category. + * + * Call utfIterator() to have the compiler deduce the UnitIter and LimitIter types. + * + * For reverse iteration, either use this iterator directly as in <code>*--iter</code> + * or wrap it using std::make_reverse_iterator(iter). + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t; + * should be signed if UTF_BEHAVIOR_NEGATIVE + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam UnitIter An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @tparam LimitIter Either the same as UnitIter, or an iterator sentinel type. + * @draft ICU 78 + * @see utfIterator + */ +template<typename CP32, UTFIllFormedBehavior behavior, + typename UnitIter, typename LimitIter = UnitIter, typename = void> +class UTFIterator { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = UTFImpl<CP32, behavior, UnitIter, LimitIter>; + + // Proxy type for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning CodeUnits. + class Proxy { + public: + explicit Proxy(CodeUnits<CP32, UnitIter> &units) : units_(units) {} + CodeUnits<CP32, UnitIter> &operator*() { return units_; } + CodeUnits<CP32, UnitIter> *operator->() { return &units_; } + private: + CodeUnits<CP32, UnitIter> units_; + }; + +public: + /** C++ iterator boilerplate @internal */ + using value_type = CodeUnits<CP32, UnitIter>; + /** C++ iterator boilerplate @internal */ + using reference = value_type; + /** C++ iterator boilerplate @internal */ + using pointer = Proxy; + /** C++ iterator boilerplate @internal */ + using difference_type = prv::iter_difference_t<UnitIter>; + /** C++ iterator boilerplate @internal */ + using iterator_category = std::conditional_t< + prv::bidirectional_iterator<UnitIter>, + std::bidirectional_iterator_tag, + std::forward_iterator_tag>; + + /** + * Constructor with start <= p < limit. + * All of these iterators/pointers should be at code point boundaries. + * Only enabled if UnitIter is a (multi-pass) forward_iterator or better. + * + * When using a code unit sentinel (UnitIter≠LimitIter), + * then that sentinel also works as a sentinel for this code point iterator. + * + * @param start Start of the range + * @param p Initial position inside the range + * @param limit Limit (exclusive end) of the range + * @draft ICU 78 + */ + U_FORCE_INLINE UTFIterator(UnitIter start, UnitIter p, LimitIter limit) : + p_(p), start_(start), limit_(limit), units_(0, 0, false, p, p) {} + /** + * Constructor with start == p < limit. + * All of these iterators/pointers should be at code point boundaries. + * + * When using a code unit sentinel (UnitIter≠LimitIter), + * then that sentinel also works as a sentinel for this code point iterator. + * + * @param p Start of the range, and the initial position + * @param limit Limit (exclusive end) of the range + * @draft ICU 78 + */ + U_FORCE_INLINE UTFIterator(UnitIter p, LimitIter limit) : + p_(p), start_(p), limit_(limit), units_(0, 0, false, p, p) {} + /** + * Constructs an iterator start or limit sentinel. + * The iterator/pointer should be at a code point boundary. + * Requires UnitIter to be copyable. + * + * When using a code unit sentinel (UnitIter≠LimitIter), + * then that sentinel also works as a sentinel for this code point iterator. + * + * @param p Range start or limit + * @draft ICU 78 + */ + U_FORCE_INLINE explicit UTFIterator(UnitIter p) : p_(p), start_(p), limit_(p), units_(0, 0, false, p, p) {} + /** + * Default constructor. Makes a non-functional iterator. + * + * @draft ICU 78 + */ + U_FORCE_INLINE UTFIterator() : p_{}, start_{}, limit_{}, units_(0, 0, false, p_, p_) {} + + /** Move constructor. @draft ICU 78 */ + U_FORCE_INLINE UTFIterator(UTFIterator &&src) noexcept = default; + /** Move assignment operator. @draft ICU 78 */ + U_FORCE_INLINE UTFIterator &operator=(UTFIterator &&src) noexcept = default; + + /** Copy constructor. @draft ICU 78 */ + U_FORCE_INLINE UTFIterator(const UTFIterator &other) = default; + /** Copy assignment operator. @draft ICU 78 */ + U_FORCE_INLINE UTFIterator &operator=(const UTFIterator &other) = default; + + /** + * @param other Another iterator + * @return true if this iterator is at the same position as the other one + * @draft ICU 78 + */ + U_FORCE_INLINE bool operator==(const UTFIterator &other) const { + return getLogicalPosition() == other.getLogicalPosition(); + } + /** + * @param other Another iterator + * @return true if this iterator is not at the same position as the other one + * @draft ICU 78 + */ + U_FORCE_INLINE bool operator!=(const UTFIterator &other) const { return !operator==(other); } + + // Asymmetric equality & nonequality with a sentinel type. + + /** + * @param iter A UTFIterator + * @param s A unit iterator sentinel + * @return true if the iterator’s position is equal to the sentinel + * @draft ICU 78 + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const UTFIterator &iter, const Sentinel &s) { + return iter.getLogicalPosition() == s; + } + +#if U_CPLUSPLUS_VERSION < 20 + // C++17: Need to define all four combinations of == / != vs. parameter order. + // Once we require C++20, we could remove all but the first == because + // the compiler would generate the rest. + + /** + * @param s A unit iterator sentinel + * @param iter A UTFIterator + * @return true if the iterator’s position is equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const Sentinel &s, const UTFIterator &iter) { + return iter.getLogicalPosition() == s; + } + /** + * @param iter A UTFIterator + * @param s A unit iterator sentinel + * @return true if the iterator’s position is not equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const UTFIterator &iter, const Sentinel &s) { return !(iter == s); } + /** + * @param s A unit iterator sentinel + * @param iter A UTFIterator + * @return true if the iterator’s position is not equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const Sentinel &s, const UTFIterator &iter) { return !(iter == s); } +#endif // C++17 + + /** + * Decodes the code unit sequence at the current position. + * + * @return CodeUnits with the decoded code point etc. + * @draft ICU 78 + */ + U_FORCE_INLINE CodeUnits<CP32, UnitIter> operator*() const { + if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_, limit_); + state_ = 1; + } + return units_; + } + + /** + * Decodes the code unit sequence at the current position. + * Used like <code>iter->codePoint()</code> or <code>iter->stringView()</code> etc. + * + * @return CodeUnits with the decoded code point etc., wrapped into + * an opaque proxy object so that <code>iter->codePoint()</code> etc. works. + * @draft ICU 78 + */ + U_FORCE_INLINE Proxy operator->() const { + if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_, limit_); + state_ = 1; + } + return Proxy(units_); + } + + /** + * Pre-increment operator. + * + * @return this iterator + * @draft ICU 78 + */ + U_FORCE_INLINE UTFIterator &operator++() { // pre-increment + if (state_ > 0) { + // operator*() called readAndInc() so p_ is already ahead. + state_ = 0; + } else if (state_ == 0) { + Impl::inc(p_, limit_); + } else /* state_ < 0 */ { + // operator--() called decAndRead() so we know how far to skip. + p_ = units_.end(); + state_ = 0; + } + return *this; + } + + /** + * Post-increment operator. + * + * @return a copy of this iterator from before the increment. + * If UnitIter is a single-pass input_iterator, then this function + * returns an opaque proxy object so that <code>*iter++</code> still works. + * @draft ICU 78 + */ + U_FORCE_INLINE UTFIterator operator++(int) { // post-increment + if (state_ > 0) { + // operator*() called readAndInc() so p_ is already ahead. + UTFIterator result(*this); + state_ = 0; + return result; + } else if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_, limit_); + UTFIterator result(*this); + result.state_ = 1; + // keep this->state_ == 0 + return result; + } else /* state_ < 0 */ { + UTFIterator result(*this); + // operator--() called decAndRead() so we know how far to skip. + p_ = units_.end(); + state_ = 0; + return result; + } + } + + /** + * Pre-decrement operator. + * Only enabled if UnitIter is a bidirectional_iterator (including a pointer). + * + * @return this iterator + * @draft ICU 78 + */ + template<typename Iter = UnitIter> + U_FORCE_INLINE + std::enable_if_t<prv::bidirectional_iterator<Iter>, UTFIterator &> + operator--() { // pre-decrement + if (state_ > 0) { + // operator*() called readAndInc() so p_ is ahead of the logical position. + p_ = units_.begin(); + } + units_ = Impl::decAndRead(start_, p_); + state_ = -1; + return *this; + } + + /** + * Post-decrement operator. + * Only enabled if UnitIter is a bidirectional_iterator (including a pointer). + * + * @return a copy of this iterator from before the decrement. + * @draft ICU 78 + */ + template<typename Iter = UnitIter> + U_FORCE_INLINE + std::enable_if_t<prv::bidirectional_iterator<Iter>, UTFIterator> + operator--(int) { // post-decrement + UTFIterator result(*this); + operator--(); + return result; + } + +private: + friend class std::reverse_iterator<UTFIterator<CP32, behavior, UnitIter>>; + + U_FORCE_INLINE UnitIter getLogicalPosition() const { + return state_ <= 0 ? p_ : units_.begin(); + } + + // operator*() etc. are logically const. + mutable UnitIter p_; + // In a validating iterator, we need start_ & limit_ so that when we read a code point + // (forward or backward) we can test if there are enough code units. + UnitIter start_; + LimitIter limit_; + // Keep state so that we call readAndInc() only once for both operator*() and ++ + // to make it easy for the compiler to optimize. + mutable CodeUnits<CP32, UnitIter> units_; + // >0: units_ = readAndInc(), p_ = units limit + // which means that p_ is ahead of its logical position + // 0: initial state + // <0: units_ = decAndRead(), p_ = units start + mutable int8_t state_ = 0; +}; + +#ifndef U_IN_DOXYGEN +// Partial template specialization for single-pass input iterator. +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter, typename LimitIter> +class UTFIterator< + CP32, behavior, + UnitIter, LimitIter, + std::enable_if_t<!prv::forward_iterator<UnitIter>>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = UTFImpl<CP32, behavior, UnitIter, LimitIter>; + + // Proxy type for post-increment return value, to make *iter++ work. + // Also for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning CodeUnits. + class Proxy { + public: + explicit Proxy(CodeUnits<CP32, UnitIter> &units) : units_(units) {} + CodeUnits<CP32, UnitIter> &operator*() { return units_; } + CodeUnits<CP32, UnitIter> *operator->() { return &units_; } + private: + CodeUnits<CP32, UnitIter> units_; + }; + +public: + using value_type = CodeUnits<CP32, UnitIter>; + using reference = value_type; + using pointer = Proxy; + using difference_type = prv::iter_difference_t<UnitIter>; + using iterator_category = std::input_iterator_tag; + + U_FORCE_INLINE UTFIterator(UnitIter p, LimitIter limit) : p_(std::move(p)), limit_(std::move(limit)) {} + + // Constructs an iterator start or limit sentinel. + // Requires p to be copyable. + U_FORCE_INLINE explicit UTFIterator(UnitIter p) : p_(std::move(p)), limit_(p_) {} + + U_FORCE_INLINE UTFIterator(UTFIterator &&src) noexcept = default; + U_FORCE_INLINE UTFIterator &operator=(UTFIterator &&src) noexcept = default; + + U_FORCE_INLINE UTFIterator(const UTFIterator &other) = default; + U_FORCE_INLINE UTFIterator &operator=(const UTFIterator &other) = default; + + U_FORCE_INLINE bool operator==(const UTFIterator &other) const { + return p_ == other.p_ && ahead_ == other.ahead_; + // Strictly speaking, we should check if the logical position is the same. + // However, we cannot advance, or do arithmetic with, a single-pass UnitIter. + } + U_FORCE_INLINE bool operator!=(const UTFIterator &other) const { return !operator==(other); } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const UTFIterator &iter, const Sentinel &s) { + return !iter.ahead_ && iter.p_ == s; + } + +#if U_CPLUSPLUS_VERSION < 20 + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const Sentinel &s, const UTFIterator &iter) { + return !iter.ahead_ && iter.p_ == s; + } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const UTFIterator &iter, const Sentinel &s) { return !(iter == s); } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const Sentinel &s, const UTFIterator &iter) { return !(iter == s); } +#endif // C++17 + + U_FORCE_INLINE CodeUnits<CP32, UnitIter> operator*() const { + if (!ahead_) { + units_ = Impl::readAndInc(p_, p_, limit_); + ahead_ = true; + } + return units_; + } + + U_FORCE_INLINE Proxy operator->() const { + if (!ahead_) { + units_ = Impl::readAndInc(p_, p_, limit_); + ahead_ = true; + } + return Proxy(units_); + } + + U_FORCE_INLINE UTFIterator &operator++() { // pre-increment + if (ahead_) { + // operator*() called readAndInc() so p_ is already ahead. + ahead_ = false; + } else { + Impl::inc(p_, limit_); + } + return *this; + } + + U_FORCE_INLINE Proxy operator++(int) { // post-increment + if (ahead_) { + // operator*() called readAndInc() so p_ is already ahead. + ahead_ = false; + } else { + units_ = Impl::readAndInc(p_, p_, limit_); + // keep this->ahead_ == false + } + return Proxy(units_); + } + +private: + // operator*() etc. are logically const. + mutable UnitIter p_; + // In a validating iterator, we need limit_ so that when we read a code point + // we can test if there are enough code units. + LimitIter limit_; + // Keep state so that we call readAndInc() only once for both operator*() and ++ + // so that we can use a single-pass input iterator for UnitIter. + mutable CodeUnits<CP32, UnitIter> units_ = {0, 0, false}; + // true: units_ = readAndInc(), p_ = units limit + // which means that p_ is ahead of its logical position + // false: initial state + mutable bool ahead_ = false; +}; +#endif // U_IN_DOXYGEN + +} // namespace U_HEADER_ONLY_NAMESPACE + +#ifndef U_IN_DOXYGEN +// Bespoke specialization of reverse_iterator. +// The default implementation implements reverse operator*() and ++ in a way +// that does most of the same work twice for reading variable-length sequences. +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter> +class std::reverse_iterator<U_HEADER_ONLY_NAMESPACE::UTFIterator<CP32, behavior, UnitIter>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = U_HEADER_ONLY_NAMESPACE::UTFImpl<CP32, behavior, UnitIter>; + using CodeUnits_ = U_HEADER_ONLY_NAMESPACE::CodeUnits<CP32, UnitIter>; + + // Proxy type for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning CodeUnits. + class Proxy { + public: + explicit Proxy(CodeUnits_ units) : units_(units) {} + CodeUnits_ &operator*() { return units_; } + CodeUnits_ *operator->() { return &units_; } + private: + CodeUnits_ units_; + }; + +public: + using value_type = CodeUnits_; + using reference = value_type; + using pointer = Proxy; + using difference_type = U_HEADER_ONLY_NAMESPACE::prv::iter_difference_t<UnitIter>; + using iterator_category = std::bidirectional_iterator_tag; + + U_FORCE_INLINE explicit reverse_iterator(U_HEADER_ONLY_NAMESPACE::UTFIterator<CP32, behavior, UnitIter> iter) : + p_(iter.getLogicalPosition()), start_(iter.start_), limit_(iter.limit_), + units_(0, 0, false, p_, p_) {} + U_FORCE_INLINE reverse_iterator() : p_{}, start_{}, limit_{}, units_(0, 0, false, p_, p_) {} + + U_FORCE_INLINE reverse_iterator(reverse_iterator &&src) noexcept = default; + U_FORCE_INLINE reverse_iterator &operator=(reverse_iterator &&src) noexcept = default; + + U_FORCE_INLINE reverse_iterator(const reverse_iterator &other) = default; + U_FORCE_INLINE reverse_iterator &operator=(const reverse_iterator &other) = default; + + U_FORCE_INLINE bool operator==(const reverse_iterator &other) const { + return getLogicalPosition() == other.getLogicalPosition(); + } + U_FORCE_INLINE bool operator!=(const reverse_iterator &other) const { return !operator==(other); } + + U_FORCE_INLINE CodeUnits_ operator*() const { + if (state_ == 0) { + units_ = Impl::decAndRead(start_, p_); + state_ = -1; + } + return units_; + } + + U_FORCE_INLINE Proxy operator->() const { + if (state_ == 0) { + units_ = Impl::decAndRead(start_, p_); + state_ = -1; + } + return Proxy(units_); + } + + U_FORCE_INLINE reverse_iterator &operator++() { // pre-increment + if (state_ < 0) { + // operator*() called decAndRead() so p_ is already behind. + state_ = 0; + } else if (state_ == 0) { + Impl::dec(start_, p_); + } else /* state_ > 0 */ { + // operator--() called readAndInc() so we know how far to skip. + p_ = units_.begin(); + state_ = 0; + } + return *this; + } + + U_FORCE_INLINE reverse_iterator operator++(int) { // post-increment + if (state_ < 0) { + // operator*() called decAndRead() so p_ is already behind. + reverse_iterator result(*this); + state_ = 0; + return result; + } else if (state_ == 0) { + units_ = Impl::decAndRead(start_, p_); + reverse_iterator result(*this); + result.state_ = -1; + // keep this->state_ == 0 + return result; + } else /* state_ > 0 */ { + reverse_iterator result(*this); + // operator--() called readAndInc() so we know how far to skip. + p_ = units_.begin(); + state_ = 0; + return result; + } + } + + U_FORCE_INLINE reverse_iterator &operator--() { // pre-decrement + if (state_ < 0) { + // operator*() called decAndRead() so p_ is behind the logical position. + p_ = units_.end(); + } + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_, limit_); + state_ = 1; + return *this; + } + + U_FORCE_INLINE reverse_iterator operator--(int) { // post-decrement + reverse_iterator result(*this); + operator--(); + return result; + } + +private: + U_FORCE_INLINE UnitIter getLogicalPosition() const { + return state_ >= 0 ? p_ : units_.end(); + } + + // operator*() etc. are logically const. + mutable UnitIter p_; + // In a validating iterator, we need start_ & limit_ so that when we read a code point + // (forward or backward) we can test if there are enough code units. + UnitIter start_; + UnitIter limit_; + // Keep state so that we call decAndRead() only once for both operator*() and ++ + // to make it easy for the compiler to optimize. + mutable CodeUnits_ units_; + // >0: units_ = readAndInc(), p_ = units limit + // 0: initial state + // <0: units_ = decAndRead(), p_ = units start + // which means that p_ is behind its logical position + mutable int8_t state_ = 0; +}; +#endif // U_IN_DOXYGEN + +namespace U_HEADER_ONLY_NAMESPACE { + +/** + * UTFIterator factory function for start <= p < limit. + * Deduces the UnitIter and LimitIter template parameters from the inputs. + * Only enabled if UnitIter is a (multi-pass) forward_iterator or better. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam UnitIter Can usually be omitted/deduced: + * An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @tparam LimitIter Either the same as UnitIter, or an iterator sentinel type. + * @param start start code unit iterator + * @param p current-position code unit iterator + * @param limit limit (exclusive-end) code unit iterator. + * When using a code unit sentinel (UnitIter≠LimitIter), + * then that sentinel also works as a sentinel for the code point iterator. + * @return a UTFIterator<CP32, behavior, UnitIter> + * for the given code unit iterators or character pointers + * @draft ICU 78 + */ +template<typename CP32, UTFIllFormedBehavior behavior, + typename UnitIter, typename LimitIter = UnitIter> +auto utfIterator(UnitIter start, UnitIter p, LimitIter limit) { + return UTFIterator<CP32, behavior, UnitIter, LimitIter>( + std::move(start), std::move(p), std::move(limit)); +} + +/** + * UTFIterator factory function for start = p < limit. + * Deduces the UnitIter and LimitIter template parameters from the inputs. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam UnitIter Can usually be omitted/deduced: + * An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @tparam LimitIter Either the same as UnitIter, or an iterator sentinel type. + * @param p start and current-position code unit iterator + * @param limit limit (exclusive-end) code unit iterator. + * When using a code unit sentinel (UnitIter≠LimitIter), + * then that sentinel also works as a sentinel for the code point iterator. + * @return a UTFIterator<CP32, behavior, UnitIter> + * for the given code unit iterators or character pointers + * @draft ICU 78 + */ +template<typename CP32, UTFIllFormedBehavior behavior, + typename UnitIter, typename LimitIter = UnitIter> +auto utfIterator(UnitIter p, LimitIter limit) { + return UTFIterator<CP32, behavior, UnitIter, LimitIter>( + std::move(p), std::move(limit)); +} + +// Note: We should only enable the following factory function for a copyable UnitIter. +// In C++17, we would have to partially specialize with enable_if_t testing for forward_iterator, +// but a function template partial specialization is not allowed. +// In C++20, we might be able to require the std::copyable concept. + +/** + * UTFIterator factory function for a start or limit sentinel. + * Deduces the UnitIter template parameter from the input. + * Requires UnitIter to be copyable. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam UnitIter Can usually be omitted/deduced: + * An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @param p code unit iterator. + * When using a code unit sentinel, + * then that sentinel also works as a sentinel for the code point iterator. + * @return a UTFIterator<CP32, behavior, UnitIter> + * for the given code unit iterator or character pointer + * @draft ICU 78 + */ +template<typename CP32, UTFIllFormedBehavior behavior, typename UnitIter> +auto utfIterator(UnitIter p) { + return UTFIterator<CP32, behavior, UnitIter>(std::move(p)); +} + +/** + * A C++ "range" for validating iteration over all of the code points of a code unit range. + * + * Call utfStringCodePoints() to have the compiler deduce the Range type. + * + * UTFStringCodePoints is conditionally borrowed; that is, if Range is a borrowed range + * so is UTFStringCodePoints<CP32, behavior, Range>. + * Note that when given a range r that is an lvalue and is not a view, utfStringCodePoints(r) uses a + * ref_view of r as the Range type, which is a borrowed range. + * In practice, this means that given a container variable r, the iterators of utfStringCodePoints(r) can + * be used as long as iterators on r are valid, without having to keep utfStringCodePoints(r) around. + * For instance: + * \code + * std::u8string s = "𒇧𒇧"; + * // it outlives utfStringCodePoints<char32_t>(s). + * auto it = utfStringCodePoints<char32_t>(s).begin(); + * ++it; + * char32_t second_code_point = it->codePoint(); // OK. + * \endcode + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t; + * should be signed if UTF_BEHAVIOR_NEGATIVE + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam Range A C++ "range" of Unicode UTF-8/16/32 code units + * @draft ICU 78 + * @see utfStringCodePoints + */ +template<typename CP32, UTFIllFormedBehavior behavior, typename Range> +class UTFStringCodePoints { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + /** + * Constructs an empty C++ "range" object. + * @draft ICU 78 + */ + UTFStringCodePoints() = default; + + /** + * Constructs a C++ "range" object over the code points in the string. + * @param unitRange input range + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<!std::is_reference_v<R>>> + explicit UTFStringCodePoints(Range unitRange) : unitRange(std::move(unitRange)) {} + /** + * Constructs a C++ "range" object over the code points in the string, + * keeping a reference to the code unit range. This overload is used by + * utfStringCodePoints in C++17; in C+20, a ref_view is used instead (via + * views::all). + * @param unitRange input range + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<std::is_reference_v<R>>, typename = void> + explicit UTFStringCodePoints(Range unitRange) : unitRange(unitRange) {} + + /** Copy constructor. @draft ICU 78 */ + UTFStringCodePoints(const UTFStringCodePoints &other) = default; + + /** Copy assignment operator. @draft ICU 78 */ + UTFStringCodePoints &operator=(const UTFStringCodePoints &other) = default; + + /** + * @return the range start iterator + * @draft ICU 78 + */ + auto begin() { + return utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end()); + } + + /** + * @return the range start iterator + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<prv::range<const R>>> + auto begin() const { + return utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end()); + } + + /** + * @return the range limit (exclusive end) iterator + * @draft ICU 78 + */ + auto end() { + using UnitIter = decltype(unitRange.begin()); + using LimitIter = decltype(unitRange.end()); + if constexpr (!std::is_same_v<UnitIter, LimitIter>) { + // Return the code unit sentinel. + return unitRange.end(); + } else if constexpr (prv::bidirectional_iterator<UnitIter>) { + return utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end(), unitRange.end()); + } else { + // The input iterator specialization has no three-argument constructor. + return utfIterator<CP32, behavior>(unitRange.end(), unitRange.end()); + } + } + + /** + * @return the range limit (exclusive end) iterator + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<prv::range<const R>>> + auto end() const { + using UnitIter = decltype(unitRange.begin()); + using LimitIter = decltype(unitRange.end()); + if constexpr (!std::is_same_v<UnitIter, LimitIter>) { + // Return the code unit sentinel. + return unitRange.end(); + } else if constexpr (prv::bidirectional_iterator<UnitIter>) { + return utfIterator<CP32, behavior>(unitRange.begin(), unitRange.end(), unitRange.end()); + } else { + // The input iterator specialization has no three-argument constructor. + return utfIterator<CP32, behavior>(unitRange.end(), unitRange.end()); + } + } + + /** + * @return std::reverse_iterator(end()) + * @draft ICU 78 + */ + auto rbegin() const { + return std::make_reverse_iterator(end()); + } + + /** + * @return std::reverse_iterator(begin()) + * @draft ICU 78 + */ + auto rend() const { + return std::make_reverse_iterator(begin()); + } + +private: + Range unitRange; +}; + +/** @internal */ +template<typename CP32, UTFIllFormedBehavior behavior> +struct UTFStringCodePointsAdaptor +#if U_CPLUSPLUS_VERSION >= 23 && __cpp_lib_ranges >= 2022'02 && \ + __cpp_lib_bind_back >= 2022'02 // http://wg21.link/P2387R3. + : std::ranges::range_adaptor_closure<UTFStringCodePointsAdaptor<CP32, behavior>> +#endif +{ + /** @internal */ + template<typename Range> + auto operator()(Range &&unitRange) const { +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 2021'10 // We need https://wg21.link/P2415R2. + return UTFStringCodePoints<CP32, behavior, std::ranges::views::all_t<Range>>( + std::forward<Range>(unitRange)); +#else + if constexpr (prv::is_basic_string_view_v<std::decay_t<Range>>) { + // Take basic_string_view by copy, not by reference. In C++20 this is handled by + // all_t<Range>, which is Range if Range is a view. + return UTFStringCodePoints<CP32, behavior, std::decay_t<Range>>( + std::forward<Range>(unitRange)); + } else { + return UTFStringCodePoints<CP32, behavior, Range>(std::forward<Range>(unitRange)); + } +#endif + } +}; + +/** + * Range adaptor function object returning a UTFStringCodePoints object that represents a "range" of code + * points in a code unit range, which validates while decoding. + * Deduces the Range template parameter from the input, taking into account the value category: the + * code units will be referenced if possible, and moved if necessary. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t; + * should be signed if UTF_BEHAVIOR_NEGATIVE + * @tparam behavior How to handle ill-formed Unicode strings + * @tparam Range A C++ "range" of Unicode UTF-8/16/32 code units + * @param unitRange input range + * @return a UTFStringCodePoints<CP32, behavior, Range> for the given unitRange + * @draft ICU 78 + */ +template<typename CP32, UTFIllFormedBehavior behavior> +constexpr UTFStringCodePointsAdaptor<CP32, behavior> utfStringCodePoints; + +// Non-validating iterators ------------------------------------------------ *** + +/** + * Non-validating iterator over the code points in a Unicode string. + * The string must be well-formed. + * + * The UnitIter can be + * an input_iterator, a forward_iterator, or a bidirectional_iterator (including a pointer). + * The UTFIterator will have the corresponding iterator_category. + * + * Call unsafeUTFIterator() to have the compiler deduce the UnitIter type. + * + * For reverse iteration, either use this iterator directly as in <code>*--iter</code> + * or wrap it using std::make_reverse_iterator(iter). + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam UnitIter An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @draft ICU 78 + * @see unsafeUTFIterator + */ +template<typename CP32, typename UnitIter, typename = void> +class UnsafeUTFIterator { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = UnsafeUTFImpl<CP32, UnitIter>; + + // Proxy type for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning UnsafeCodeUnits. + class Proxy { + public: + explicit Proxy(UnsafeCodeUnits<CP32, UnitIter> &units) : units_(units) {} + UnsafeCodeUnits<CP32, UnitIter> &operator*() { return units_; } + UnsafeCodeUnits<CP32, UnitIter> *operator->() { return &units_; } + private: + UnsafeCodeUnits<CP32, UnitIter> units_; + }; + +public: + /** C++ iterator boilerplate @internal */ + using value_type = UnsafeCodeUnits<CP32, UnitIter>; + /** C++ iterator boilerplate @internal */ + using reference = value_type; + /** C++ iterator boilerplate @internal */ + using pointer = Proxy; + /** C++ iterator boilerplate @internal */ + using difference_type = prv::iter_difference_t<UnitIter>; + /** C++ iterator boilerplate @internal */ + using iterator_category = std::conditional_t< + prv::bidirectional_iterator<UnitIter>, + std::bidirectional_iterator_tag, + std::forward_iterator_tag>; + + /** + * Constructor; the iterator/pointer should be at a code point boundary. + * + * When using a code unit sentinel, + * then that sentinel also works as a sentinel for this code point iterator. + * + * @param p Initial position inside the range, or a range sentinel + * @draft ICU 78 + */ + U_FORCE_INLINE explicit UnsafeUTFIterator(UnitIter p) : p_(p), units_(0, 0, p, p) {} + /** + * Default constructor. Makes a non-functional iterator. + * + * @draft ICU 78 + */ + U_FORCE_INLINE UnsafeUTFIterator() : p_{}, units_(0, 0, p_, p_) {} + + /** Move constructor. @draft ICU 78 */ + U_FORCE_INLINE UnsafeUTFIterator(UnsafeUTFIterator &&src) noexcept = default; + /** Move assignment operator. @draft ICU 78 */ + U_FORCE_INLINE UnsafeUTFIterator &operator=(UnsafeUTFIterator &&src) noexcept = default; + + /** Copy constructor. @draft ICU 78 */ + U_FORCE_INLINE UnsafeUTFIterator(const UnsafeUTFIterator &other) = default; + /** Copy assignment operator. @draft ICU 78 */ + U_FORCE_INLINE UnsafeUTFIterator &operator=(const UnsafeUTFIterator &other) = default; + + /** + * @param other Another iterator + * @return true if this iterator is at the same position as the other one + * @draft ICU 78 + */ + U_FORCE_INLINE bool operator==(const UnsafeUTFIterator &other) const { + return getLogicalPosition() == other.getLogicalPosition(); + } + /** + * @param other Another iterator + * @return true if this iterator is not at the same position as the other one + * @draft ICU 78 + */ + U_FORCE_INLINE bool operator!=(const UnsafeUTFIterator &other) const { return !operator==(other); } + + /** + * @param iter An UnsafeUTFIterator + * @param s A unit iterator sentinel + * @return true if the iterator’s position is equal to the sentinel + * @draft ICU 78 + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const UnsafeUTFIterator &iter, const Sentinel &s) { + return iter.getLogicalPosition() == s; + } + +#if U_CPLUSPLUS_VERSION < 20 + /** + * @param s A unit iterator sentinel + * @param iter An UnsafeUTFIterator + * @return true if the iterator’s position is equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const Sentinel &s, const UnsafeUTFIterator &iter) { + return iter.getLogicalPosition() == s; + } + /** + * @param iter An UnsafeUTFIterator + * @param s A unit iterator sentinel + * @return true if the iterator’s position is not equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const UnsafeUTFIterator &iter, const Sentinel &s) { return !(iter == s); } + /** + * @param s A unit iterator sentinel + * @param iter An UnsafeUTFIterator + * @return true if the iterator’s position is not equal to the sentinel + * @internal + */ + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const Sentinel &s, const UnsafeUTFIterator &iter) { return !(iter == s); } +#endif // C++17 + + /** + * Decodes the code unit sequence at the current position. + * + * @return CodeUnits with the decoded code point etc. + * @draft ICU 78 + */ + U_FORCE_INLINE UnsafeCodeUnits<CP32, UnitIter> operator*() const { + if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_); + state_ = 1; + } + return units_; + } + + /** + * Decodes the code unit sequence at the current position. + * Used like <code>iter->codePoint()</code> or <code>iter->stringView()</code> etc. + * + * @return CodeUnits with the decoded code point etc., wrapped into + * an opaque proxy object so that <code>iter->codePoint()</code> etc. works. + * @draft ICU 78 + */ + U_FORCE_INLINE Proxy operator->() const { + if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_); + state_ = 1; + } + return Proxy(units_); + } + + /** + * Pre-increment operator. + * + * @return this iterator + * @draft ICU 78 + */ + U_FORCE_INLINE UnsafeUTFIterator &operator++() { // pre-increment + if (state_ > 0) { + // operator*() called readAndInc() so p_ is already ahead. + state_ = 0; + } else if (state_ == 0) { + Impl::inc(p_); + } else /* state_ < 0 */ { + // operator--() called decAndRead() so we know how far to skip. + p_ = units_.end(); + state_ = 0; + } + return *this; + } + + /** + * Post-increment operator. + * + * @return a copy of this iterator from before the increment. + * If UnitIter is a single-pass input_iterator, then this function + * returns an opaque proxy object so that <code>*iter++</code> still works. + * @draft ICU 78 + */ + U_FORCE_INLINE UnsafeUTFIterator operator++(int) { // post-increment + if (state_ > 0) { + // operator*() called readAndInc() so p_ is already ahead. + UnsafeUTFIterator result(*this); + state_ = 0; + return result; + } else if (state_ == 0) { + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_); + UnsafeUTFIterator result(*this); + result.state_ = 1; + // keep this->state_ == 0 + return result; + } else /* state_ < 0 */ { + UnsafeUTFIterator result(*this); + // operator--() called decAndRead() so we know how far to skip. + p_ = units_.end(); + state_ = 0; + return result; + } + } + + /** + * Pre-decrement operator. + * Only enabled if UnitIter is a bidirectional_iterator (including a pointer). + * + * @return this iterator + * @draft ICU 78 + */ + template<typename Iter = UnitIter> + U_FORCE_INLINE + std::enable_if_t<prv::bidirectional_iterator<Iter>, UnsafeUTFIterator &> + operator--() { // pre-decrement + if (state_ > 0) { + // operator*() called readAndInc() so p_ is ahead of the logical position. + p_ = units_.begin(); + } + units_ = Impl::decAndRead(p_); + state_ = -1; + return *this; + } + + /** + * Post-decrement operator. + * Only enabled if UnitIter is a bidirectional_iterator (including a pointer). + * + * @return a copy of this iterator from before the decrement. + * @draft ICU 78 + */ + template<typename Iter = UnitIter> + U_FORCE_INLINE + std::enable_if_t<prv::bidirectional_iterator<Iter>, UnsafeUTFIterator> + operator--(int) { // post-decrement + UnsafeUTFIterator result(*this); + operator--(); + return result; + } + +private: + friend class std::reverse_iterator<UnsafeUTFIterator<CP32, UnitIter>>; + + U_FORCE_INLINE UnitIter getLogicalPosition() const { + return state_ <= 0 ? p_ : units_.begin(); + } + + // operator*() etc. are logically const. + mutable UnitIter p_; + // Keep state so that we call readAndInc() only once for both operator*() and ++ + // to make it easy for the compiler to optimize. + mutable UnsafeCodeUnits<CP32, UnitIter> units_; + // >0: units_ = readAndInc(), p_ = units limit + // which means that p_ is ahead of its logical position + // 0: initial state + // <0: units_ = decAndRead(), p_ = units start + mutable int8_t state_ = 0; +}; + +#ifndef U_IN_DOXYGEN +// Partial template specialization for single-pass input iterator. +template<typename CP32, typename UnitIter> +class UnsafeUTFIterator< + CP32, + UnitIter, + std::enable_if_t<!prv::forward_iterator<UnitIter>>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = UnsafeUTFImpl<CP32, UnitIter>; + + // Proxy type for post-increment return value, to make *iter++ work. + // Also for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning UnsafeCodeUnits. + class Proxy { + public: + explicit Proxy(UnsafeCodeUnits<CP32, UnitIter> &units) : units_(units) {} + UnsafeCodeUnits<CP32, UnitIter> &operator*() { return units_; } + UnsafeCodeUnits<CP32, UnitIter> *operator->() { return &units_; } + private: + UnsafeCodeUnits<CP32, UnitIter> units_; + }; + +public: + using value_type = UnsafeCodeUnits<CP32, UnitIter>; + using reference = value_type; + using pointer = Proxy; + using difference_type = prv::iter_difference_t<UnitIter>; + using iterator_category = std::input_iterator_tag; + + U_FORCE_INLINE explicit UnsafeUTFIterator(UnitIter p) : p_(std::move(p)) {} + + U_FORCE_INLINE UnsafeUTFIterator(UnsafeUTFIterator &&src) noexcept = default; + U_FORCE_INLINE UnsafeUTFIterator &operator=(UnsafeUTFIterator &&src) noexcept = default; + + U_FORCE_INLINE UnsafeUTFIterator(const UnsafeUTFIterator &other) = default; + U_FORCE_INLINE UnsafeUTFIterator &operator=(const UnsafeUTFIterator &other) = default; + + U_FORCE_INLINE bool operator==(const UnsafeUTFIterator &other) const { + return p_ == other.p_ && ahead_ == other.ahead_; + // Strictly speaking, we should check if the logical position is the same. + // However, we cannot advance, or do arithmetic with, a single-pass UnitIter. + } + U_FORCE_INLINE bool operator!=(const UnsafeUTFIterator &other) const { return !operator==(other); } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const UnsafeUTFIterator &iter, const Sentinel &s) { + return !iter.ahead_ && iter.p_ == s; + } + +#if U_CPLUSPLUS_VERSION < 20 + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator==(const Sentinel &s, const UnsafeUTFIterator &iter) { + return !iter.ahead_ && iter.p_ == s; + } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const UnsafeUTFIterator &iter, const Sentinel &s) { return !(iter == s); } + + template<typename Sentinel> U_FORCE_INLINE friend + std::enable_if_t< + !std::is_same_v<Sentinel, UnsafeUTFIterator> && !std::is_same_v<Sentinel, UnitIter>, + bool> + operator!=(const Sentinel &s, const UnsafeUTFIterator &iter) { return !(iter == s); } +#endif // C++17 + + U_FORCE_INLINE UnsafeCodeUnits<CP32, UnitIter> operator*() const { + if (!ahead_) { + units_ = Impl::readAndInc(p_, p_); + ahead_ = true; + } + return units_; + } + + U_FORCE_INLINE Proxy operator->() const { + if (!ahead_) { + units_ = Impl::readAndInc(p_, p_); + ahead_ = true; + } + return Proxy(units_); + } + + U_FORCE_INLINE UnsafeUTFIterator &operator++() { // pre-increment + if (ahead_) { + // operator*() called readAndInc() so p_ is already ahead. + ahead_ = false; + } else { + Impl::inc(p_); + } + return *this; + } + + U_FORCE_INLINE Proxy operator++(int) { // post-increment + if (ahead_) { + // operator*() called readAndInc() so p_ is already ahead. + ahead_ = false; + } else { + units_ = Impl::readAndInc(p_, p_); + // keep this->ahead_ == false + } + return Proxy(units_); + } + +private: + // operator*() etc. are logically const. + mutable UnitIter p_; + // Keep state so that we call readAndInc() only once for both operator*() and ++ + // so that we can use a single-pass input iterator for UnitIter. + mutable UnsafeCodeUnits<CP32, UnitIter> units_ = {0, 0}; + // true: units_ = readAndInc(), p_ = units limit + // which means that p_ is ahead of its logical position + // false: initial state + mutable bool ahead_ = false; +}; +#endif // U_IN_DOXYGEN + +} // namespace U_HEADER_ONLY_NAMESPACE + +#ifndef U_IN_DOXYGEN +// Bespoke specialization of reverse_iterator. +// The default implementation implements reverse operator*() and ++ in a way +// that does most of the same work twice for reading variable-length sequences. +template<typename CP32, typename UnitIter> +class std::reverse_iterator<U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator<CP32, UnitIter>> { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); + using Impl = U_HEADER_ONLY_NAMESPACE::UnsafeUTFImpl<CP32, UnitIter>; + using UnsafeCodeUnits_ = U_HEADER_ONLY_NAMESPACE::UnsafeCodeUnits<CP32, UnitIter>; + + // Proxy type for operator->() (required by LegacyInputIterator) + // so that we don't promise always returning UnsafeCodeUnits. + class Proxy { + public: + explicit Proxy(UnsafeCodeUnits_ units) : units_(units) {} + UnsafeCodeUnits_ &operator*() { return units_; } + UnsafeCodeUnits_ *operator->() { return &units_; } + private: + UnsafeCodeUnits_ units_; + }; + +public: + using value_type = UnsafeCodeUnits_; + using reference = value_type; + using pointer = Proxy; + using difference_type = U_HEADER_ONLY_NAMESPACE::prv::iter_difference_t<UnitIter>; + using iterator_category = std::bidirectional_iterator_tag; + + U_FORCE_INLINE explicit reverse_iterator(U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator<CP32, UnitIter> iter) : + p_(iter.getLogicalPosition()), units_(0, 0, p_, p_) {} + U_FORCE_INLINE reverse_iterator() : p_{}, units_(0, 0, p_, p_) {} + + U_FORCE_INLINE reverse_iterator(reverse_iterator &&src) noexcept = default; + U_FORCE_INLINE reverse_iterator &operator=(reverse_iterator &&src) noexcept = default; + + U_FORCE_INLINE reverse_iterator(const reverse_iterator &other) = default; + U_FORCE_INLINE reverse_iterator &operator=(const reverse_iterator &other) = default; + + U_FORCE_INLINE bool operator==(const reverse_iterator &other) const { + return getLogicalPosition() == other.getLogicalPosition(); + } + U_FORCE_INLINE bool operator!=(const reverse_iterator &other) const { return !operator==(other); } + + U_FORCE_INLINE UnsafeCodeUnits_ operator*() const { + if (state_ == 0) { + units_ = Impl::decAndRead(p_); + state_ = -1; + } + return units_; + } + + U_FORCE_INLINE Proxy operator->() const { + if (state_ == 0) { + units_ = Impl::decAndRead(p_); + state_ = -1; + } + return Proxy(units_); + } + + U_FORCE_INLINE reverse_iterator &operator++() { // pre-increment + if (state_ < 0) { + // operator*() called decAndRead() so p_ is already behind. + state_ = 0; + } else if (state_ == 0) { + Impl::dec(p_); + } else /* state_ > 0 */ { + // operator--() called readAndInc() so we know how far to skip. + p_ = units_.begin(); + state_ = 0; + } + return *this; + } + + U_FORCE_INLINE reverse_iterator operator++(int) { // post-increment + if (state_ < 0) { + // operator*() called decAndRead() so p_ is already behind. + reverse_iterator result(*this); + state_ = 0; + return result; + } else if (state_ == 0) { + units_ = Impl::decAndRead(p_); + reverse_iterator result(*this); + result.state_ = -1; + // keep this->state_ == 0 + return result; + } else /* state_ > 0 */ { + reverse_iterator result(*this); + // operator--() called readAndInc() so we know how far to skip. + p_ = units_.begin(); + state_ = 0; + return result; + } + } + + U_FORCE_INLINE reverse_iterator &operator--() { // pre-decrement + if (state_ < 0) { + // operator*() called decAndRead() so p_ is behind the logical position. + p_ = units_.end(); + } + UnitIter p0 = p_; + units_ = Impl::readAndInc(p0, p_); + state_ = 1; + return *this; + } + + U_FORCE_INLINE reverse_iterator operator--(int) { // post-decrement + reverse_iterator result(*this); + operator--(); + return result; + } + +private: + U_FORCE_INLINE UnitIter getLogicalPosition() const { + return state_ >= 0 ? p_ : units_.end(); + } + + // operator*() etc. are logically const. + mutable UnitIter p_; + // Keep state so that we call decAndRead() only once for both operator*() and ++ + // to make it easy for the compiler to optimize. + mutable UnsafeCodeUnits_ units_; + // >0: units_ = readAndInc(), p_ = units limit + // 0: initial state + // <0: units_ = decAndRead(), p_ = units start + // which means that p_ is behind its logical position + mutable int8_t state_ = 0; +}; +#endif // U_IN_DOXYGEN + +namespace U_HEADER_ONLY_NAMESPACE { + +/** + * UnsafeUTFIterator factory function. + * Deduces the UnitIter template parameter from the input. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam UnitIter Can usually be omitted/deduced: + * An iterator (often a pointer) that returns a code unit type: + * UTF-8: char or char8_t or uint8_t; + * UTF-16: char16_t or uint16_t or (on Windows) wchar_t; + * UTF-32: char32_t or UChar32=int32_t or (on Linux) wchar_t + * @param iter code unit iterator + * @return an UnsafeUTFIterator<CP32, UnitIter> + * for the given code unit iterator or character pointer + * @draft ICU 78 + */ +template<typename CP32, typename UnitIter> +auto unsafeUTFIterator(UnitIter iter) { + return UnsafeUTFIterator<CP32, UnitIter>(std::move(iter)); +} + +/** + * A C++ "range" for non-validating iteration over all of the code points of a code unit range. + * The string must be well-formed. + * + * Call unsafeUTFStringCodePoints() to have the compiler deduce the Range type. + * + * UnsafeUTFStringCodePoints is conditionally borrowed; that is, if Range is a borrowed range + * so is UnsafeUTFStringCodePoints<CP32, behavior, Range>. + * Note that when given a range r that is an lvalue and is not a view, unsafeUTFStringCodePoints(r) uses + * a ref_view of r as the Range type, which is a borrowed range. + * In practice, this means that given a container variable r, the iterators of + * unsafeUTFStringCodePoints(r) can be used as long as iterators on r are valid, without having to keep + * unsafeUTFStringCodePoints(r) around. + * For instance: + * \code + * std::u8string s = "𒇧𒇧"; + * // it outlives unsafeUTFStringCodePoints<char32_t>(s). + * auto it = unsafeUTFStringCodePoints<char32_t>(s).begin(); + * ++it; + * char32_t second_code_point = it->codePoint(); // OK. + * \endcode + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam Range A C++ "range" of Unicode UTF-8/16/32 code units + * @draft ICU 78 + * @see unsafeUTFStringCodePoints + */ +template<typename CP32, typename Range> +class UnsafeUTFStringCodePoints { + static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); +public: + /** + * Constructs an empty C++ "range" object. + * @draft ICU 78 + */ + UnsafeUTFStringCodePoints() = default; + + /** + * Constructs a C++ "range" object over the code points in the string. + * @param unitRange input range + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<!std::is_reference_v<R>>> + explicit UnsafeUTFStringCodePoints(Range unitRange) : unitRange(std::move(unitRange)) {} + /** + * Constructs a C++ "range" object over the code points in the string, + * keeping a reference to the code unit range. This overload is used by + * utfStringCodePoints in C++17; in C++20, a ref_view is used instead (via + * views::all). + * @param unitRange input range + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<std::is_reference_v<R>>, typename = void> + explicit UnsafeUTFStringCodePoints(Range unitRange) : unitRange(unitRange) {} + + /** Copy constructor. @draft ICU 78 */ + UnsafeUTFStringCodePoints(const UnsafeUTFStringCodePoints &other) = default; + + /** Copy assignment operator. @draft ICU 78 */ + UnsafeUTFStringCodePoints &operator=(const UnsafeUTFStringCodePoints &other) = default; + + /** + * @return the range start iterator + * @draft ICU 78 + */ + auto begin() { + return unsafeUTFIterator<CP32>(unitRange.begin()); + } + + /** + * @return the range start iterator + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<prv::range<const R>>> + auto begin() const { + return unsafeUTFIterator<CP32>(unitRange.begin()); + } + + /** + * @return the range limit (exclusive end) iterator + * @draft ICU 78 + */ + auto end() { + using UnitIter = decltype(unitRange.begin()); + using LimitIter = decltype(unitRange.end()); + if constexpr (!std::is_same_v<UnitIter, LimitIter>) { + // Return the code unit sentinel. + return unitRange.end(); + } else { + return unsafeUTFIterator<CP32>(unitRange.end()); + } + } + + /** + * @return the range limit (exclusive end) iterator + * @draft ICU 78 + */ + template<typename R = Range, typename = std::enable_if_t<prv::range<const R>>> + auto end() const { + using UnitIter = decltype(unitRange.begin()); + using LimitIter = decltype(unitRange.end()); + if constexpr (!std::is_same_v<UnitIter, LimitIter>) { + // Return the code unit sentinel. + return unitRange.end(); + } else { + return unsafeUTFIterator<CP32>(unitRange.end()); + } + } + + /** + * @return std::reverse_iterator(end()) + * @draft ICU 78 + */ + auto rbegin() const { + return std::make_reverse_iterator(end()); + } + + /** + * @return std::reverse_iterator(begin()) + * @draft ICU 78 + */ + auto rend() const { + return std::make_reverse_iterator(begin()); + } + +private: + Range unitRange; +}; + +/** @internal */ +template<typename CP32> +struct UnsafeUTFStringCodePointsAdaptor +#if U_CPLUSPLUS_VERSION >= 23 && __cpp_lib_ranges >= 2022'02 && \ + __cpp_lib_bind_back >= 2022'02 // http://wg21.link/P2387R3. + : std::ranges::range_adaptor_closure<UnsafeUTFStringCodePointsAdaptor<CP32>> +#endif +{ + /** @internal */ + template<typename Range> + auto operator()(Range &&unitRange) const { +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 2021'10 // We need https://wg21.link/P2415R2. + return UnsafeUTFStringCodePoints<CP32, std::ranges::views::all_t<Range>>(std::forward<Range>(unitRange)); +#else + if constexpr (prv::is_basic_string_view_v<std::decay_t<Range>>) { + // Take basic_string_view by copy, not by reference. In C++20 this is handled by + // all_t<Range>, which is Range if Range is a view. + return UnsafeUTFStringCodePoints<CP32, std::decay_t<Range>>(std::forward<Range>(unitRange)); + } else { + return UnsafeUTFStringCodePoints<CP32, Range>(std::forward<Range>(unitRange)); + } +#endif + } +}; + + +/** + * Range adaptor function object returning an UnsafeUTFStringCodePoints object that represents a + * "range" of code points in a code unit range. The string must be well-formed. + * Deduces the Range template parameter from the input, taking into account the value category: the + * code units will be referenced if possible, and moved if necessary. + * + * @tparam CP32 Code point type: UChar32 (=int32_t) or char32_t or uint32_t + * @tparam Range A C++ "range" of Unicode UTF-8/16/32 code units + * @param unitRange input range + * @return an UnsafeUTFStringCodePoints<CP32, Range> for the given unitRange + * @draft ICU 78 + */ +template<typename CP32> +constexpr UnsafeUTFStringCodePointsAdaptor<CP32> unsafeUTFStringCodePoints; + +} // namespace U_HEADER_ONLY_NAMESPACE + + +#if defined(__cpp_lib_ranges) +template <typename CP32, UTFIllFormedBehavior behavior, typename Range> +constexpr bool std::ranges::enable_borrowed_range< + U_HEADER_ONLY_NAMESPACE::UTFStringCodePoints<CP32, behavior, Range>> = + std::ranges::enable_borrowed_range<Range>; + +template <typename CP32, typename Range> +constexpr bool std::ranges::enable_borrowed_range< + U_HEADER_ONLY_NAMESPACE::UnsafeUTFStringCodePoints<CP32, Range>> = + std::ranges::enable_borrowed_range<Range>; +#endif + +#endif // U_HIDE_DRAFT_API +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +#endif // __UTFITERATOR_H__ diff --git a/deps/icu-small/source/common/unicode/utfstring.h b/deps/icu-small/source/common/unicode/utfstring.h new file mode 100644 index 00000000000000..f596d56a6573ae --- /dev/null +++ b/deps/icu-small/source/common/unicode/utfstring.h @@ -0,0 +1,161 @@ +// © 2025 and later: Unicode, Inc. and others. +// License & terms of use: https://www.unicode.org/copyright.html + +// utfstring.h +// created: 2025jul18 Markus W. Scherer + +#ifndef __UTFSTRING_H__ +#define __UTFSTRING_H__ + +#include "unicode/utypes.h" + +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API || !defined(UTYPES_H) + +#include "unicode/utf16.h" + +/** + * \file + * \brief C++ header-only API: C++ string helper functions. + */ + +#ifndef U_HIDE_DRAFT_API + +namespace U_HEADER_ONLY_NAMESPACE { +namespace utfstring { + +// Write code points to strings -------------------------------------------- *** + +#ifndef U_IN_DOXYGEN +namespace prv { + +// This function, and the public wrappers, +// want to be U_FORCE_INLINE but the gcc-debug-build-and-test CI check failed with +// error: ‘always_inline’ function might not be inlinable [-Werror=attributes] +template<typename StringClass, bool validate> +inline StringClass &appendCodePoint(StringClass &s, uint32_t c) { + using Unit = typename StringClass::value_type; + if constexpr (sizeof(Unit) == 1) { + // UTF-8: Similar to U8_APPEND(). + if (c <= 0x7f) { + s.push_back(static_cast<Unit>(c)); + } else { + Unit buf[4]; + uint8_t len; + if (c <= 0x7ff) { + len = 2; + buf[2] = (c >> 6) | 0xc0; + } else { + if (validate ? + c < 0xd800 || + (c < 0xe000 || c > 0x10ffff ? (c = 0xfffd, true) : c <= 0xffff) : + c <= 0xffff) { + len = 3; + buf[1] = (c >> 12) | 0xe0; + } else { + len = 4; + buf[0] = (c >> 18) | 0xf0; + buf[1] = ((c >> 12) & 0x3f) | 0x80; + } + buf[2] = ((c >> 6) & 0x3f) | 0x80; + } + buf[3] = (c & 0x3f) | 0x80; + s.append(buf + 4 - len, len); + } + } else if constexpr (sizeof(Unit) == 2) { + // UTF-16: Similar to U16_APPEND(). + if (validate ? + c < 0xd800 || (c < 0xe000 || c > 0x10ffff ? (c = 0xfffd, true) : c <= 0xffff) : + c <= 0xffff) { + s.push_back(static_cast<Unit>(c)); + } else { + Unit buf[2] = { U16_LEAD(c), U16_TRAIL(c) }; + s.append(buf, 2); + } + } else { + // UTF-32 + s.push_back(!validate || U_IS_SCALAR_VALUE(c) ? c : 0xfffd); + } + return s; +} + +} // namespace prv +#endif // U_IN_DOXYGEN + +#ifndef U_HIDE_DRAFT_API +/** + * Appends the code point to the string. + * Appends the U+FFFD replacement character instead if c is not a scalar value. + * See https://www.unicode.org/glossary/#unicode_scalar_value + * + * @tparam StringClass A version of std::basic_string (or a compatible type) + * @param s The string to append to + * @param c The code point to append + * @return s + * @draft ICU 78 + * @see U_IS_SCALAR_VALUE + */ +template<typename StringClass> +inline StringClass &appendOrFFFD(StringClass &s, UChar32 c) { + return prv::appendCodePoint<StringClass, true>(s, c); +} + +/** + * Appends the code point to the string. + * The code point must be a scalar value; otherwise the behavior is undefined. + * See https://www.unicode.org/glossary/#unicode_scalar_value + * + * @tparam StringClass A version of std::basic_string (or a compatible type) + * @param s The string to append to + * @param c The code point to append (must be a scalar value) + * @return s + * @draft ICU 78 + * @see U_IS_SCALAR_VALUE + */ +template<typename StringClass> +inline StringClass &appendUnsafe(StringClass &s, UChar32 c) { + return prv::appendCodePoint<StringClass, false>(s, c); +} + +/** + * Returns the code point as a string of code units. + * Returns the U+FFFD replacement character instead if c is not a scalar value. + * See https://www.unicode.org/glossary/#unicode_scalar_value + * + * @tparam StringClass A version of std::basic_string (or a compatible type) + * @param c The code point + * @return the string of c's code units + * @draft ICU 78 + * @see U_IS_SCALAR_VALUE + */ +template<typename StringClass> +inline StringClass encodeOrFFFD(UChar32 c) { + StringClass s; + prv::appendCodePoint<StringClass, true>(s, c); + return s; +} + +/** + * Returns the code point as a string of code units. + * The code point must be a scalar value; otherwise the behavior is undefined. + * See https://www.unicode.org/glossary/#unicode_scalar_value + * + * @tparam StringClass A version of std::basic_string (or a compatible type) + * @param c The code point + * @return the string of c's code units + * @draft ICU 78 + * @see U_IS_SCALAR_VALUE + */ +template<typename StringClass> +inline StringClass encodeUnsafe(UChar32 c) { + StringClass s; + prv::appendCodePoint<StringClass, false>(s, c); + return s; +} +#endif // U_HIDE_DRAFT_API + +} // namespace utfstring +} // namespace U_HEADER_ONLY_NAMESPACE + +#endif // U_HIDE_DRAFT_API +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API +#endif // __UTFSTRING_H__ diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index f890d5d1dbbebf..f53b7536f200e9 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -54,22 +54,37 @@ * integer and other types. */ +/** @{ API visibility control */ /** * \def U_SHOW_CPLUSPLUS_API + * When defined to 1 (=default) and compiled with a C++ compiler, both C and C++ APIs are visible. + * Otherwise, only C APIs are visible; this is for C++ users who want to + * restrict their usage to binary stable C APIs exported by ICU DLLs. + * @internal + */ +/** + * \def U_SHOW_CPLUSPLUS_HEADER_API + * When defined to 1 (=default) and compiled with a C++ compiler, C++ header-only APIs are visible. + * This is for C++ users who restrict their usage to binary stable C APIs exported by ICU DLLs + * (U_SHOW_CPLUSPLUS_API=0) + * but who still want to use C++ header-only APIs which do not rely on ICU DLL exports. * @internal */ #ifdef __cplusplus # ifndef U_SHOW_CPLUSPLUS_API # define U_SHOW_CPLUSPLUS_API 1 # endif +# ifndef U_SHOW_CPLUSPLUS_HEADER_API +# define U_SHOW_CPLUSPLUS_HEADER_API 1 +# endif #else # undef U_SHOW_CPLUSPLUS_API # define U_SHOW_CPLUSPLUS_API 0 +# undef U_SHOW_CPLUSPLUS_HEADER_API +# define U_SHOW_CPLUSPLUS_HEADER_API 0 #endif -/** @{ API visibility control */ - /** * \def U_HIDE_DRAFT_API * Define this to 1 to request that draft API be "hidden" @@ -369,6 +384,85 @@ typedef double UDate; #define U_TOOLUTIL_API U_IMPORT #endif +#ifndef U_FORCE_HIDE_DRAFT_API + +/** + * \def U_DATA_API_CLASS + * Set to export library symbols from inside the stubdata library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_COMMON_API_CLASS + * Set to export library symbols from inside the common library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_I18N_API_CLASS + * Set to export library symbols from inside the i18n library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_LAYOUT_API_CLASS + * Set to export library symbols from inside the layout engine library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_LAYOUTEX_API_CLASS + * Set to export library symbols from inside the layout extensions library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_IO_API_CLASS + * Set to export library symbols from inside the ustdio library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +/** + * \def U_TOOLUTIL_API_CLASS + * Set to export library symbols from inside the toolutil library, + * and to import them from outside, to be used on a class. + * @draft ICU 78 + */ + +// When used on Windows, the U_..._API macros expand to __declspec(dllexport) +// and __declspec(dllimport), which when used on a class results in all members +// of the class being exported, including private members, which is problematic +// for classes that have private members that can't be exported (such as +// templates from the standard library): +// +// https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4251 +// +#if U_PLATFORM_HAS_WIN32_API +#define U_DATA_API_CLASS +#define U_COMMON_API_CLASS +#define U_I18N_API_CLASS +#define U_LAYOUT_API_CLASS +#define U_LAYOUTEX_API_CLASS +#define U_IO_API_CLASS +#define U_TOOLUTIL_API_CLASS +#else +#define U_DATA_API_CLASS U_DATA_API +#define U_COMMON_API_CLASS U_COMMON_API +#define U_I18N_API_CLASS U_I18N_API +#define U_LAYOUT_API_CLASS U_LAYOUT_API +#define U_LAYOUTEX_API_CLASS U_LAYOUTEX_API +#define U_IO_API_CLASS U_IO_API +#define U_TOOLUTIL_API_CLASS U_TOOLUTIL_API +#endif + +#endif // U_FORCE_HIDE_DRAFT_API + /** * \def U_STANDARD_CPP_NAMESPACE * Control of C++ Namespace @@ -438,6 +532,7 @@ typedef enum UErrorCode { U_PLUGIN_CHANGED_LEVEL_WARNING = -120, /**< A plugin caused a level change. May not be an error, but later plugins may not load. */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UErrorCode warning value. @@ -568,12 +663,27 @@ typedef enum UErrorCode { U_FORMAT_INEXACT_ERROR, /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */ U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @stable ICU 61 */ U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @stable ICU 62 */ + + /* MessageFormat 2.0 errors */ + U_MF_UNRESOLVED_VARIABLE_ERROR, /**< A variable is referred to but not bound by any definition @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_SYNTAX_ERROR, /**< Includes all syntax errors @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_UNKNOWN_FUNCTION_ERROR, /**< An annotation refers to a function not defined by the standard or custom function registry @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_VARIANT_KEY_MISMATCH_ERROR, /**< In a match-construct, one or more variants had a different number of keys from the number of selectors @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_FORMATTING_ERROR, /**< Covers all runtime errors: for example, an internally inconsistent set of options. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_NONEXHAUSTIVE_PATTERN_ERROR, /**< In a match-construct, the variants do not cover all possible values @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_DUPLICATE_OPTION_NAME_ERROR, /**< In an annotation, the same option name appears more than once @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_SELECTOR_ERROR, /**< A selector function is applied to an operand of the wrong type @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_MISSING_SELECTOR_ANNOTATION_ERROR, /**< A selector expression evaluates to an unannotated operand. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_DUPLICATE_DECLARATION_ERROR, /**< The same variable is declared in more than one .local or .input declaration. @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_OPERAND_MISMATCH_ERROR, /**< An operand provided to a function does not have the required form for that function @internal ICU 75 technology preview @deprecated This API is for technology preview only. */ + U_MF_DUPLICATE_VARIANT_ERROR, /**< A message includes a variant with the same key list as another variant. @internal ICU 76 technology preview @deprecated This API is for technology preview only. */ + U_MF_BAD_OPTION, /**< An option value provided to a function does not have the required form for that option. @internal ICU 77 technology preview @deprecated This API is for technology preview only. */ #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal formatting API error code. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - U_FMT_PARSE_ERROR_LIMIT = 0x10114, + U_FMT_PARSE_ERROR_LIMIT = 0x10121, #endif // U_HIDE_DEPRECATED_API /* @@ -697,13 +807,13 @@ typedef enum UErrorCode { * @stable ICU 2.0 */ static - inline UBool U_SUCCESS(UErrorCode code) { return (UBool)(code<=U_ZERO_ERROR); } + inline UBool U_SUCCESS(UErrorCode code) { return code <= U_ZERO_ERROR; } /** * Does the error code indicate a failure? * @stable ICU 2.0 */ static - inline UBool U_FAILURE(UErrorCode code) { return (UBool)(code>U_ZERO_ERROR); } + inline UBool U_FAILURE(UErrorCode code) { return code > U_ZERO_ERROR; } #else /** * Does the error code indicate success? diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 1cdf8912f94b6e..b5273a04fcf8d4 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -53,7 +53,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 74 +#define U_ICU_VERSION_MAJOR_NUM 78 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU @@ -79,7 +79,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _74 +#define U_ICU_VERSION_SUFFIX _78 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -132,7 +132,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "74.2" +#define U_ICU_VERSION "78.2" /** * The current ICU library major version number as a string, for library name suffixes. @@ -145,13 +145,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "74" +#define U_ICU_VERSION_SHORT "78" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "74.2" +#define U_ICU_DATA_VERSION "78.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unicode/uversion.h b/deps/icu-small/source/common/unicode/uversion.h index 113568df8c127d..450794ac1baed3 100644 --- a/deps/icu-small/source/common/unicode/uversion.h +++ b/deps/icu-small/source/common/unicode/uversion.h @@ -124,6 +124,64 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; # if U_USING_ICU_NAMESPACE U_NAMESPACE_USE # endif + +/** + * \def U_HEADER_NESTED_NAMESPACE + * Nested namespace used inside U_ICU_NAMESPACE for header-only APIs. + * Different when used inside ICU to prevent public use of internal instantiations: + * "header" when compiling calling code; "internal" when compiling ICU library code. + * + * When compiling for Windows, where DLL exports of APIs are explicit, + * this is always "header". Header-only types are not marked for export, + * which on Windows already avoids callers linking with library instantiations. + * + * @stable ICU 76 + * @see U_HEADER_ONLY_NAMESPACE + */ + +/** + * \def U_HEADER_ONLY_NAMESPACE + * Namespace used for header-only APIs. + * Different when used inside ICU to prevent public use of internal instantiations. + * "U_ICU_NAMESPACE::header" or "U_ICU_NAMESPACE::internal", + * see U_HEADER_NESTED_NAMESPACE for details. + * + * @stable ICU 76 + */ + +#ifndef U_FORCE_HIDE_DRAFT_API +/** + * \def U_ICU_NAMESPACE_OR_INTERNAL + * Namespace used for header-only APIs that used to be regular C++ APIs. + * Different when used inside ICU to prevent public use of internal instantiations. + * Similar to U_HEADER_ONLY_NAMESPACE, but the public definition is the same as U_ICU_NAMESPACE. + * "U_ICU_NAMESPACE" or "U_ICU_NAMESPACE::internal". + * + * @draft ICU 77 + */ +#endif // U_FORCE_HIDE_DRAFT_API + +// The first test is the same as for defining U_EXPORT for Windows. +#if defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ + UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) +# define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE +#elif defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ + defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) || \ + defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_TOOLUTIL_IMPLEMENTATION) +# define U_HEADER_NESTED_NAMESPACE internal +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE::internal + namespace U_ICU_NAMESPACE_OR_INTERNAL {} + using namespace U_ICU_NAMESPACE_OR_INTERNAL; +#else +# define U_HEADER_NESTED_NAMESPACE header +# define U_ICU_NAMESPACE_OR_INTERNAL U_ICU_NAMESPACE +#endif + +#define U_HEADER_ONLY_NAMESPACE U_ICU_NAMESPACE::U_HEADER_NESTED_NAMESPACE + +namespace U_HEADER_ONLY_NAMESPACE {} + #endif /* __cplusplus */ /*===========================================================================*/ diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index 1284c03813eb85..68af4e04c1b438 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -47,20 +47,20 @@ U_NAMESPACE_BEGIN int32_t U_EXPORT2 ucache_hashKeys(const UHashTok key) { - const CacheKeyBase *ckey = (const CacheKeyBase *) key.pointer; + const CacheKeyBase* ckey = static_cast<const CacheKeyBase*>(key.pointer); return ckey->hashCode(); } UBool U_EXPORT2 ucache_compareKeys(const UHashTok key1, const UHashTok key2) { - const CacheKeyBase *p1 = (const CacheKeyBase *) key1.pointer; - const CacheKeyBase *p2 = (const CacheKeyBase *) key2.pointer; + const CacheKeyBase* p1 = static_cast<const CacheKeyBase*>(key1.pointer); + const CacheKeyBase* p2 = static_cast<const CacheKeyBase*>(key2.pointer); return *p1 == *p2; } void U_EXPORT2 ucache_deleteKey(void *obj) { - CacheKeyBase *p = (CacheKeyBase *) obj; + CacheKeyBase* p = static_cast<CacheKeyBase*>(obj); delete p; } @@ -253,7 +253,7 @@ UBool UnifiedCache::_flush(UBool all) const { } if (all || _isEvictable(element)) { const SharedObject *sharedObject = - (const SharedObject *) element->value.pointer; + static_cast<const SharedObject*>(element->value.pointer); U_ASSERT(sharedObject->cachePtr == this); uhash_removeElement(fHashtable, element); removeSoftRef(sharedObject); // Deletes the sharedObject when softRefCount goes to zero. @@ -269,7 +269,7 @@ int32_t UnifiedCache::_computeCountOfItemsToEvict() const { int32_t unusedLimitByPercentage = fNumValuesInUse * fMaxPercentageOfInUse / 100; int32_t unusedLimit = std::max(unusedLimitByPercentage, fMaxUnused); - int32_t countOfItemsToEvict = std::max(0, evictableItems - unusedLimit); + int32_t countOfItemsToEvict = std::max<int32_t>(0, evictableItems - unusedLimit); return countOfItemsToEvict; } @@ -285,7 +285,7 @@ void UnifiedCache::_runEvictionSlice() const { } if (_isEvictable(element)) { const SharedObject *sharedObject = - (const SharedObject *) element->value.pointer; + static_cast<const SharedObject*>(element->value.pointer); uhash_removeElement(fHashtable, element); removeSoftRef(sharedObject); // Deletes sharedObject when SoftRefCount goes to zero. ++fAutoEvictedCount; @@ -416,8 +416,8 @@ void UnifiedCache::_put( const SharedObject *value, const UErrorCode status) const { U_ASSERT(_inProgress(element)); - const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer; - const SharedObject *oldValue = (const SharedObject *) element->value.pointer; + const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer); + const SharedObject* oldValue = static_cast<const SharedObject*>(element->value.pointer); theKey->fCreationStatus = status; if (value->softRefCount == 0) { _registerPrimary(theKey, value); @@ -437,7 +437,7 @@ void UnifiedCache::_fetch( const UHashElement *element, const SharedObject *&value, UErrorCode &status) const { - const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer; + const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer); status = theKey->fCreationStatus; // Since we have the cache lock, calling regular SharedObject add/removeRef @@ -465,9 +465,8 @@ UBool UnifiedCache::_inProgress( UBool UnifiedCache::_isEvictable(const UHashElement *element) const { - const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer; - const SharedObject *theValue = - (const SharedObject *) element->value.pointer; + const CacheKeyBase* theKey = static_cast<const CacheKeyBase*>(element->key.pointer); + const SharedObject* theValue = static_cast<const SharedObject*>(element->value.pointer); // Entries that are under construction are never evictable if (_inProgress(theValue, theKey->fCreationStatus)) { diff --git a/deps/icu-small/source/common/unifunct.cpp b/deps/icu-small/source/common/unifunct.cpp index f3995b298d2c46..5e939cb67e3f1c 100644 --- a/deps/icu-small/source/common/unifunct.cpp +++ b/deps/icu-small/source/common/unifunct.cpp @@ -16,11 +16,11 @@ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFunctor) UnicodeFunctor::~UnicodeFunctor() {} UnicodeMatcher* UnicodeFunctor::toMatcher() const { - return 0; + return nullptr; } UnicodeReplacer* UnicodeFunctor::toReplacer() const { - return 0; + return nullptr; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index 71f57fc12d466d..0a63dad9dd0f3f 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -108,25 +108,25 @@ static inline void _dbgdt(UnicodeSet* set) { //---------------------------------------------------------------- static void U_CALLCONV cloneUnicodeString(UElement *dst, UElement *src) { - dst->pointer = new UnicodeString(*(UnicodeString*)src->pointer); + dst->pointer = new UnicodeString(*static_cast<UnicodeString*>(src->pointer)); } static int32_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { - const UnicodeString &a = *(const UnicodeString*)t1.pointer; - const UnicodeString &b = *(const UnicodeString*)t2.pointer; + const UnicodeString& a = *static_cast<const UnicodeString*>(t1.pointer); + const UnicodeString& b = *static_cast<const UnicodeString*>(t2.pointer); return a.compare(b); } UBool UnicodeSet::hasStrings() const { - return strings != nullptr && !strings->isEmpty(); + return strings_ != nullptr && !strings_->isEmpty(); } int32_t UnicodeSet::stringsSize() const { - return strings == nullptr ? 0 : strings->size(); + return strings_ == nullptr ? 0 : strings_->size(); } UBool UnicodeSet::stringsContains(const UnicodeString &s) const { - return strings != nullptr && strings->contains((void*) &s); + return strings_ != nullptr && strings_->contains((void*) &s); } //---------------------------------------------------------------- @@ -171,7 +171,7 @@ UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : UnicodeFilte if (o.hasStrings()) { UErrorCode status = U_ZERO_ERROR; if (!allocateStrings(status) || - (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + (strings_->assign(*o.strings_, cloneUnicodeString, status), U_FAILURE(status))) { setToBogus(); return; } @@ -195,7 +195,7 @@ UnicodeSet::~UnicodeSet() { if (buffer != stackList) { uprv_free(buffer); } - delete strings; + delete strings_; delete stringSpan; releasePattern(); } @@ -233,16 +233,16 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { } if (o.hasStrings()) { UErrorCode status = U_ZERO_ERROR; - if ((strings == nullptr && !allocateStrings(status)) || - (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + if ((strings_ == nullptr && !allocateStrings(status)) || + (strings_->assign(*o.strings_, cloneUnicodeString, status), U_FAILURE(status))) { setToBogus(); return *this; } } else if (hasStrings()) { - strings->removeAllElements(); + strings_->removeAllElements(); } if (o.stringSpan != nullptr && !asThawed) { - stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings); + stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings_); if (stringSpan == nullptr) { // Check for memory allocation error. setToBogus(); return *this; @@ -284,7 +284,7 @@ bool UnicodeSet::operator==(const UnicodeSet& o) const { if (list[i] != o.list[i]) return false; } if (hasStrings() != o.hasStrings()) { return false; } - if (hasStrings() && *strings != *o.strings) return false; + if (hasStrings() && *strings_ != *o.strings_) return false; return true; } @@ -355,7 +355,7 @@ UBool UnicodeSet::contains(UChar32 c) const { return false; } int32_t i = findCodePoint(c); - return (UBool)(i & 1); // return true if odd + return i & 1; // return true if odd } /** @@ -430,7 +430,7 @@ UBool UnicodeSet::contains(const UnicodeString& s) const { if (cp < 0) { return stringsContains(s); } else { - return contains((UChar32) cp); + return contains(static_cast<UChar32>(cp)); } } @@ -450,7 +450,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const { return false; } } - return !c.hasStrings() || (strings != nullptr && strings->containsAll(*c.strings)); + return !c.hasStrings() || (strings_ != nullptr && strings_->containsAll(*c.strings_)); } /** @@ -460,8 +460,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const { * @return true if the test condition is met */ UBool UnicodeSet::containsAll(const UnicodeString& s) const { - return (UBool)(span(s.getBuffer(), s.length(), USET_SPAN_CONTAINED) == - s.length()); + return span(s.getBuffer(), s.length(), USET_SPAN_CONTAINED) == s.length(); } /** @@ -496,7 +495,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const { return false; } } - return strings == nullptr || !c.hasStrings() || strings->containsNone(*c.strings); + return strings_ == nullptr || !c.hasStrings() || strings_->containsNone(*c.strings_); } /** @@ -506,8 +505,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const { * @return true if the test condition is met */ UBool UnicodeSet::containsNone(const UnicodeString& s) const { - return (UBool)(span(s.getBuffer(), s.length(), USET_SPAN_NOT_CONTAINED) == - s.length()); + return span(s.getBuffer(), s.length(), USET_SPAN_NOT_CONTAINED) == s.length(); } /** @@ -538,8 +536,8 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { } } if (hasStrings()) { - for (i=0; i<strings->size(); ++i) { - const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i); + for (i=0; i<strings_->size(); ++i) { + const UnicodeString& s = *static_cast<const UnicodeString*>(strings_->elementAt(i)); if (s.isEmpty()) { continue; // skip the empty string } @@ -588,8 +586,8 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, // return the longest match. int32_t highWaterLength = 0; - for (i=0; i<strings->size(); ++i) { - const UnicodeString& trial = *(const UnicodeString*)strings->elementAt(i); + for (i=0; i<strings_->size(); ++i) { + const UnicodeString& trial = *static_cast<const UnicodeString*>(strings_->elementAt(i)); if (trial.isEmpty()) { continue; // skip the empty string } @@ -731,12 +729,12 @@ UChar32 UnicodeSet::charAt(int32_t index) const { UChar32 start = list[i++]; int32_t count = list[i++] - start; if (index < count) { - return (UChar32)(start + index); + return static_cast<UChar32>(start + index); } index -= count; } } - return (UChar32)-1; + return static_cast<UChar32>(-1); } /** @@ -958,30 +956,30 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { releasePattern(); } } else { - add((UChar32)cp); + add(static_cast<UChar32>(cp)); } return *this; } /** - * Adds the given string, in order, to 'strings'. The given string - * must have been checked by the caller to not already be in 'strings'. + * Adds the given string, in order, to 'strings_'. The given string + * must have been checked by the caller to not already be in 'strings_'. */ void UnicodeSet::_add(const UnicodeString& s) { if (isFrozen() || isBogus()) { return; } UErrorCode ec = U_ZERO_ERROR; - if (strings == nullptr && !allocateStrings(ec)) { + if (strings_ == nullptr && !allocateStrings(ec)) { setToBogus(); return; } - UnicodeString* t = new UnicodeString(s); - if (t == nullptr) { // Check for memory allocation error. + LocalPointer<UnicodeString> t(new UnicodeString(s)); + if (t.isNull()) { // Check for memory allocation error. setToBogus(); return; } - strings->sortedInsert(t, compareUnicodeString, ec); + strings_->sortedInsert(t.orphan(), compareUnicodeString, ec); if (U_FAILURE(ec)) { setToBogus(); } @@ -1060,7 +1058,7 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) { UnicodeSet& UnicodeSet::removeAllStrings() { if (!isFrozen() && hasStrings()) { - strings->removeAllElements(); + strings_->removeAllElements(); releasePattern(); } return *this; @@ -1178,11 +1176,11 @@ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - if (strings != nullptr && strings->removeElement((void*) &s)) { + if (strings_ != nullptr && strings_->removeElement((void*) &s)) { releasePattern(); } } else { - remove((UChar32)cp, (UChar32)cp); + remove(static_cast<UChar32>(cp), static_cast<UChar32>(cp)); } return *this; } @@ -1250,13 +1248,13 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { int32_t cp = getSingleCP(s); if (cp < 0) { if (stringsContains(s)) { - strings->removeElement((void*) &s); + strings_->removeElement((void*) &s); } else { _add(s); } releasePattern(); } else { - complement((UChar32)cp, (UChar32)cp); + complement(static_cast<UChar32>(cp), static_cast<UChar32>(cp)); } return *this; } @@ -1277,9 +1275,9 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { } // Add strings in order - if ( c.strings!=nullptr ) { - for (int32_t i=0; i<c.strings->size(); ++i) { - const UnicodeString* s = (const UnicodeString*)c.strings->elementAt(i); + if ( c.strings_!=nullptr ) { + for (int32_t i=0; i<c.strings_->size(); ++i) { + const UnicodeString* s = static_cast<const UnicodeString*>(c.strings_->elementAt(i)); if (!stringsContains(*s)) { _add(*s); } @@ -1304,9 +1302,9 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) { retain(c.list, c.len, 0); if (hasStrings()) { if (!c.hasStrings()) { - strings->removeAllElements(); + strings_->removeAllElements(); } else { - strings->retainAll(*c.strings); + strings_->retainAll(*c.strings_); } } return *this; @@ -1327,7 +1325,7 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) { } retain(c.list, c.len, 2); if (hasStrings() && c.hasStrings()) { - strings->removeAll(*c.strings); + strings_->removeAll(*c.strings_); } return *this; } @@ -1346,11 +1344,11 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) { } exclusiveOr(c.list, c.len, 0); - if (c.strings != nullptr) { - for (int32_t i=0; i<c.strings->size(); ++i) { - void* e = c.strings->elementAt(i); - if (strings == nullptr || !strings->removeElement(e)) { - _add(*(const UnicodeString*)e); + if (c.strings_ != nullptr) { + for (int32_t i=0; i<c.strings_->size(); ++i) { + void* e = c.strings_->elementAt(i); + if (strings_ == nullptr || !strings_->removeElement(e)) { + _add(*static_cast<const UnicodeString*>(e)); } } } @@ -1368,8 +1366,8 @@ UnicodeSet& UnicodeSet::clear() { list[0] = UNICODESET_HIGH; len = 1; releasePattern(); - if (strings != nullptr) { - strings->removeAllElements(); + if (strings_ != nullptr) { + strings_->removeAllElements(); } // Remove bogus fFlags = 0; @@ -1407,7 +1405,7 @@ UChar32 UnicodeSet::getRangeEnd(int32_t index) const { } const UnicodeString* UnicodeSet::getString(int32_t index) const { - return (const UnicodeString*) strings->elementAt(index); + return static_cast<const UnicodeString*>(strings_->elementAt(index)); } /** @@ -1433,7 +1431,7 @@ UnicodeSet& UnicodeSet::compact() { capacity = INITIAL_CAPACITY; } else if ((len + 7) < capacity) { // If we have more than a little unused capacity, shrink it to len. - UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * len); + UChar32* temp = static_cast<UChar32*>(uprv_realloc(list, sizeof(UChar32) * len)); if (temp) { list = temp; capacity = len; @@ -1441,9 +1439,9 @@ UnicodeSet& UnicodeSet::compact() { // else what the heck happened?! We allocated less memory! // Oh well. We'll keep our original array. } - if (strings != nullptr && strings->isEmpty()) { - delete strings; - strings = nullptr; + if (strings_ != nullptr && strings_->isEmpty()) { + delete strings_; + strings_ = nullptr; } return *this; } @@ -1492,8 +1490,8 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se } // copy smp for(i=bmpLength;i<newLength;i++) { - list[i] = ((UChar32)data[headerSize+bmpLength+(i-bmpLength)*2+0] << 16) + - ((UChar32)data[headerSize+bmpLength+(i-bmpLength)*2+1]); + list[i] = (static_cast<UChar32>(data[headerSize + bmpLength + (i - bmpLength) * 2 + 0]) << 16) + + static_cast<UChar32>(data[headerSize + bmpLength + (i - bmpLength) * 2 + 1]); #ifdef DEBUG_SERIALIZE printf("<<32@%d+[%d] %lX\n", headerSize+bmpLength+i, i, list[i]); #endif @@ -1568,10 +1566,10 @@ int32_t UnicodeSet::serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& #ifdef DEBUG_SERIALIZE printf("writeHdr\n"); #endif - *dest=(uint16_t)length; + *dest = static_cast<uint16_t>(length); if (length>bmpLength) { *dest|=0x8000; - *++dest=(uint16_t)bmpLength; + *++dest = static_cast<uint16_t>(bmpLength); } ++dest; @@ -1581,7 +1579,7 @@ int32_t UnicodeSet::serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& #ifdef DEBUG_SERIALIZE printf("writebmp: %x\n", (int)*p); #endif - *dest++=(uint16_t)*p++; + *dest++ = static_cast<uint16_t>(*p++); } /* write the supplementary part of the array */ @@ -1589,8 +1587,8 @@ int32_t UnicodeSet::serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& #ifdef DEBUG_SERIALIZE printf("write32: %x\n", (int)*p); #endif - *dest++=(uint16_t)(*p>>16); - *dest++=(uint16_t)*p++; + *dest++ = static_cast<uint16_t>(*p >> 16); + *dest++ = static_cast<uint16_t>(*p++); } } else { ec=U_BUFFER_OVERFLOW_ERROR; @@ -1609,15 +1607,15 @@ UBool UnicodeSet::allocateStrings(UErrorCode &status) { if (U_FAILURE(status)) { return false; } - strings = new UVector(uprv_deleteUObject, + strings_ = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, 1, status); - if (strings == nullptr) { // Check for memory allocation error. + if (strings_ == nullptr) { // Check for memory allocation error. status = U_MEMORY_ALLOCATION_ERROR; return false; } if (U_FAILURE(status)) { - delete strings; - strings = nullptr; + delete strings_; + strings_ = nullptr; return false; } return true; @@ -1646,7 +1644,7 @@ bool UnicodeSet::ensureCapacity(int32_t newLen) { return true; } int32_t newCapacity = nextCapacity(newLen); - UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); + UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32))); if (temp == nullptr) { setToBogus(); // set the object to bogus state if an OOM failure occurred. return false; @@ -1669,7 +1667,7 @@ bool UnicodeSet::ensureBufferCapacity(int32_t newLen) { return true; } int32_t newCapacity = nextCapacity(newLen); - UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); + UChar32* temp = static_cast<UChar32*>(uprv_malloc(newCapacity * sizeof(UChar32))); if (temp == nullptr) { setToBogus(); return false; @@ -2133,11 +2131,11 @@ UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, } } - if (strings != nullptr) { - for (int32_t i = 0; i<strings->size(); ++i) { + if (strings_ != nullptr) { + for (int32_t i = 0; i<strings_->size(); ++i) { result.append(u'{'); _appendToPat(result, - *(const UnicodeString*) strings->elementAt(i), + *static_cast<const UnicodeString*>(strings_->elementAt(i)), escapeUnprintable); result.append(u'}'); } @@ -2161,7 +2159,7 @@ void UnicodeSet::releasePattern() { */ void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) { releasePattern(); - pat = (char16_t *)uprv_malloc((newPatLen + 1) * sizeof(char16_t)); + pat = static_cast<char16_t*>(uprv_malloc((newPatLen + 1) * sizeof(char16_t))); if (pat) { patLen = newPatLen; u_memcpy(pat, newPat, patLen); @@ -2177,7 +2175,7 @@ UnicodeSet *UnicodeSet::freeze() { // Optimize contains() and span() and similar functions. if (hasStrings()) { - stringSpan = new UnicodeSetStringSpan(*this, *strings, UnicodeSetStringSpan::ALL); + stringSpan = new UnicodeSetStringSpan(*this, *strings_, UnicodeSetStringSpan::ALL); if (stringSpan == nullptr) { setToBogus(); return this; @@ -2204,7 +2202,7 @@ UnicodeSet *UnicodeSet::freeze() { int32_t UnicodeSet::span(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const { if(length>0 && bmpSet!=nullptr) { - return (int32_t)(bmpSet->span(s, s+length, spanCondition)-s); + return static_cast<int32_t>(bmpSet->span(s, s + length, spanCondition) - s); } if(length<0) { length=u_strlen(s); @@ -2218,7 +2216,7 @@ int32_t UnicodeSet::span(const char16_t *s, int32_t length, USetSpanCondition sp uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF16_CONTAINED; - UnicodeSetStringSpan strSpan(*this, *strings, which); + UnicodeSetStringSpan strSpan(*this, *strings_, which); if(strSpan.needsStringSpanUTF16()) { return strSpan.span(s, length, spanCondition); } @@ -2241,7 +2239,7 @@ int32_t UnicodeSet::span(const char16_t *s, int32_t length, USetSpanCondition sp int32_t UnicodeSet::spanBack(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const { if(length>0 && bmpSet!=nullptr) { - return (int32_t)(bmpSet->spanBack(s, s+length, spanCondition)-s); + return static_cast<int32_t>(bmpSet->spanBack(s, s + length, spanCondition) - s); } if(length<0) { length=u_strlen(s); @@ -2255,7 +2253,7 @@ int32_t UnicodeSet::spanBack(const char16_t *s, int32_t length, USetSpanConditio uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF16_CONTAINED; - UnicodeSetStringSpan strSpan(*this, *strings, which); + UnicodeSetStringSpan strSpan(*this, *strings_, which); if(strSpan.needsStringSpanUTF16()) { return strSpan.spanBack(s, length, spanCondition); } @@ -2278,24 +2276,24 @@ int32_t UnicodeSet::spanBack(const char16_t *s, int32_t length, USetSpanConditio int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const { if(length>0 && bmpSet!=nullptr) { - const uint8_t *s0=(const uint8_t *)s; - return (int32_t)(bmpSet->spanUTF8(s0, length, spanCondition)-s0); + const uint8_t* s0 = reinterpret_cast<const uint8_t*>(s); + return static_cast<int32_t>(bmpSet->spanUTF8(s0, length, spanCondition) - s0); } if(length<0) { - length=(int32_t)uprv_strlen(s); + length = static_cast<int32_t>(uprv_strlen(s)); } if(length==0) { return 0; } if(stringSpan!=nullptr) { - return stringSpan->spanUTF8((const uint8_t *)s, length, spanCondition); + return stringSpan->spanUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition); } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF8_CONTAINED; - UnicodeSetStringSpan strSpan(*this, *strings, which); + UnicodeSetStringSpan strSpan(*this, *strings_, which); if(strSpan.needsStringSpanUTF8()) { - return strSpan.spanUTF8((const uint8_t *)s, length, spanCondition); + return strSpan.spanUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition); } } @@ -2316,24 +2314,24 @@ int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition sp int32_t UnicodeSet::spanBackUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const { if(length>0 && bmpSet!=nullptr) { - const uint8_t *s0=(const uint8_t *)s; + const uint8_t* s0 = reinterpret_cast<const uint8_t*>(s); return bmpSet->spanBackUTF8(s0, length, spanCondition); } if(length<0) { - length=(int32_t)uprv_strlen(s); + length = static_cast<int32_t>(uprv_strlen(s)); } if(length==0) { return 0; } if(stringSpan!=nullptr) { - return stringSpan->spanBackUTF8((const uint8_t *)s, length, spanCondition); + return stringSpan->spanBackUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition); } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF8_CONTAINED; - UnicodeSetStringSpan strSpan(*this, *strings, which); + UnicodeSetStringSpan strSpan(*this, *strings_, which); if(strSpan.needsStringSpanUTF8()) { - return strSpan.spanBackUTF8((const uint8_t *)s, length, spanCondition); + return strSpan.spanBackUTF8(reinterpret_cast<const uint8_t*>(s), length, spanCondition); } } diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index 173a5cbaaef661..ae777c5facdfe2 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -116,17 +116,17 @@ UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, // Does not use uset.h to reduce code dependencies static void U_CALLCONV _set_add(USet *set, UChar32 c) { - ((UnicodeSet *)set)->add(c); + reinterpret_cast<UnicodeSet*>(set)->add(c); } static void U_CALLCONV _set_addRange(USet *set, UChar32 start, UChar32 end) { - ((UnicodeSet *)set)->add(start, end); + reinterpret_cast<UnicodeSet*>(set)->add(start, end); } static void U_CALLCONV _set_addString(USet *set, const char16_t *str, int32_t length) { - ((UnicodeSet *)set)->add(UnicodeString((UBool)(length<0), str, length)); + reinterpret_cast<UnicodeSet*>(set)->add(UnicodeString(static_cast<UBool>(length < 0), str, length)); } //---------------------------------------------------------------- @@ -143,7 +143,7 @@ addCaseMapping(UnicodeSet &set, int32_t result, const char16_t *full, UnicodeStr set.add(result); } else { // add a string case mapping from full with length result - str.setTo((UBool)false, full, result); + str.setTo(static_cast<UBool>(false), full, result); set.add(str); } } @@ -242,7 +242,7 @@ void UnicodeSet::closeOverCaseInsensitive(bool simple) { // therefore, start with no strings and add only those needed. // Do this before processing code points, because they may add strings. if (!simple && foldSet.hasStrings()) { - foldSet.strings->removeAllElements(); + foldSet.strings_->removeAllElements(); } USetAdder sa = { @@ -276,8 +276,8 @@ void UnicodeSet::closeOverCaseInsensitive(bool simple) { } if (hasStrings()) { UnicodeString str; - for (int32_t j=0; j<strings->size(); ++j) { - const UnicodeString *pStr = (const UnicodeString *) strings->elementAt(j); + for (int32_t j=0; j<strings_->size(); ++j) { + const UnicodeString* pStr = static_cast<const UnicodeString*>(strings_->elementAt(j)); if (simple) { if (scfString(*pStr, str)) { foldSet.remove(*pStr).add(str); @@ -334,8 +334,8 @@ void UnicodeSet::closeOverAddCaseMappings() { BreakIterator *bi = BreakIterator::createWordInstance(root, status); if (U_SUCCESS(status)) { #endif - for (int32_t j=0; j<strings->size(); ++j) { - const UnicodeString *pStr = (const UnicodeString *) strings->elementAt(j); + for (int32_t j=0; j<strings_->size(); ++j) { + const UnicodeString* pStr = static_cast<const UnicodeString*>(strings_->elementAt(j)); (str = *pStr).toLower(root); foldSet.add(str); #if !UCONFIG_NO_BREAK_ITERATION diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index b3dbdf93c8858e..532b17f5063fe2 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -47,14 +47,17 @@ U_NAMESPACE_USE +namespace { + // Special property set IDs -static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF] -static const char ASCII[] = "ASCII"; // [\u0000-\u007F] -static const char ASSIGNED[] = "Assigned"; // [:^Cn:] +constexpr char ANY[] = "ANY"; // [\u0000-\U0010FFFF] +constexpr char ASCII[] = "ASCII"; // [\u0000-\u007F] +constexpr char ASSIGNED[] = "Assigned"; // [:^Cn:] // Unicode name property alias -#define NAME_PROP "na" -#define NAME_PROP_LENGTH 2 +constexpr char16_t NAME_PROP[] = u"na"; + +} // namespace // Cached sets ------------------------------------------------------------- *** @@ -83,7 +86,7 @@ namespace { // Cache some sets for other services -------------------------------------- *** void U_CALLCONV createUni32Set(UErrorCode &errorCode) { U_ASSERT(uni32Singleton == nullptr); - uni32Singleton = new UnicodeSet(UNICODE_STRING_SIMPLE("[:age=3.2:]"), errorCode); + uni32Singleton = new UnicodeSet(UnicodeString(u"[:age=3.2:]"), errorCode); if(uni32Singleton==nullptr) { errorCode=U_MEMORY_ALLOCATION_ERROR; } else { @@ -106,7 +109,7 @@ uniset_getUnicode32Instance(UErrorCode &errorCode) { // caseCompare(), but they also make UnicodeSet work for simple patterns when // no Unicode properties data is available - when caseCompare() fails -static inline UBool +inline UBool isPerlOpen(const UnicodeString &pattern, int32_t pos) { char16_t c; return pattern.charAt(pos)==u'\\' && ((c=pattern.charAt(pos+1))==u'p' || c==u'P'); @@ -117,12 +120,12 @@ isPerlClose(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'}'; }*/ -static inline UBool +inline UBool isNameOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'\\' && pattern.charAt(pos+1)==u'N'; } -static inline UBool +inline UBool isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':'; } @@ -209,7 +212,7 @@ UnicodeSet::applyPatternIgnoreSpace(const UnicodeString& pattern, */ UBool UnicodeSet::resemblesPattern(const UnicodeString& pattern, int32_t pos) { return ((pos+1) < pattern.length() && - pattern.charAt(pos) == (char16_t)91/*[*/) || + pattern.charAt(pos) == static_cast<char16_t>(91)/*[*/) || resemblesPropertyPattern(pattern, pos); } @@ -226,14 +229,14 @@ namespace { class UnicodeSetPointer { UnicodeSet* p; public: - inline UnicodeSetPointer() : p(0) {} + inline UnicodeSetPointer() : p(nullptr) {} inline ~UnicodeSetPointer() { delete p; } inline UnicodeSet* pointer() { return p; } inline UBool allocate() { - if (p == 0) { + if (p == nullptr) { p = new UnicodeSet(); } - return p != 0; + return p != nullptr; } }; @@ -300,7 +303,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, UChar32 c = 0; UBool literal = false; - UnicodeSet* nested = 0; // alias - do not delete + UnicodeSet* nested = nullptr; // alias - do not delete // -------- Check for property pattern @@ -352,9 +355,9 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, continue; } } - } else if (symbols != 0) { + } else if (symbols != nullptr) { const UnicodeFunctor *m = symbols->lookupMatcher(c); - if (m != 0) { + if (m != nullptr) { const UnicodeSet *ms = dynamic_cast<const UnicodeSet *>(m); if (ms == nullptr) { ec = U_MALFORMED_SET; @@ -390,7 +393,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, patLocal.append(op); } - if (nested == 0) { + if (nested == nullptr) { // lazy allocation if (!scratch.allocate()) { ec = U_MEMORY_ALLOCATION_ERROR; @@ -471,7 +474,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, case u'-': if (op == 0) { if (lastItem != 0) { - op = (char16_t) c; + op = static_cast<char16_t>(c); continue; } else { // Treat final trailing '-' as a literal @@ -490,7 +493,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, return; case u'&': if (lastItem == 2 && op == 0) { - op = (char16_t) c; + op = static_cast<char16_t>(c); continue; } // syntaxError(chars, "'&' not after set"); @@ -549,7 +552,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; UBool anchor = (c == u']' && !literal); - if (symbols == 0 && !anchor) { + if (symbols == nullptr && !anchor) { c = SymbolTable::SYMBOL_REF; chars.setPos(backup); break; // literal '$' @@ -561,7 +564,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, } add(U_ETHER); usePat = true; - patLocal.append((char16_t) SymbolTable::SYMBOL_REF); + patLocal.append(static_cast<char16_t>(SymbolTable::SYMBOL_REF)); patLocal.append(u']'); mode = 2; continue; @@ -657,20 +660,20 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, namespace { -static UBool numericValueFilter(UChar32 ch, void* context) { - return u_getNumericValue(ch) == *(double*)context; +UBool numericValueFilter(UChar32 ch, void* context) { + return u_getNumericValue(ch) == *static_cast<double*>(context); } -static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { - int32_t value = *(int32_t*)context; +UBool generalCategoryMaskFilter(UChar32 ch, void* context) { + int32_t value = *static_cast<int32_t*>(context); return (U_GET_GC_MASK((UChar32) ch) & value) != 0; } -static UBool versionFilter(UChar32 ch, void* context) { +UBool versionFilter(UChar32 ch, void* context) { static const UVersionInfo none = { 0, 0, 0, 0 }; UVersionInfo v; u_charAge(ch, v); - UVersionInfo* version = (UVersionInfo*)context; + UVersionInfo* version = static_cast<UVersionInfo*>(context); return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0; } @@ -679,13 +682,17 @@ typedef struct { int32_t value; } IntPropertyContext; -static UBool intPropertyFilter(UChar32 ch, void* context) { - IntPropertyContext* c = (IntPropertyContext*)context; - return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; +UBool intPropertyFilter(UChar32 ch, void* context) { + IntPropertyContext* c = static_cast<IntPropertyContext*>(context); + return u_getIntPropertyValue(ch, c->prop) == c->value; +} + +UBool scriptExtensionsFilter(UChar32 ch, void* context) { + return uscript_hasScript(ch, *static_cast<UScriptCode*>(context)); } -static UBool scriptExtensionsFilter(UChar32 ch, void* context) { - return uscript_hasScript(ch, *(UScriptCode*)context); +UBool idTypeFilter(UChar32 ch, void* context) { + return u_hasIDType(ch, *static_cast<UIdentifierType*>(context)); } } // namespace @@ -734,7 +741,7 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, } } if (startHasProperty >= 0) { - add((UChar32)startHasProperty, (UChar32)0x10FFFF); + add(startHasProperty, static_cast<UChar32>(0x10FFFF)); } if (isBogus() && U_SUCCESS(status)) { // We likely ran out of memory. AHHH! @@ -744,7 +751,7 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, namespace { -static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { +UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { /* Note: we use ' ' in compiler code page */ int32_t j = 0; char ch; @@ -780,8 +787,12 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) applyFilter(generalCategoryMaskFilter, &value, inclusions, ec); } else if (prop == UCHAR_SCRIPT_EXTENSIONS) { const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); - UScriptCode script = (UScriptCode)value; + UScriptCode script = static_cast<UScriptCode>(value); applyFilter(scriptExtensionsFilter, &script, inclusions, ec); + } else if (prop == UCHAR_IDENTIFIER_TYPE) { + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + UIdentifierType idType = static_cast<UIdentifierType>(value); + applyFilter(idTypeFilter, &idType, inclusions, ec); } else if (0 <= prop && prop < UCHAR_BINARY_LIMIT) { if (value == 0 || value == 1) { const USet *set = u_getBinaryPropertySet(prop, &ec); @@ -854,7 +865,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, // We catch NaN here because comparing it with both 0 and 255 will be false // (as are all comparisons with NaN). if (*end != 0 || !(0 <= val && val <= 255) || - (v = (int32_t)val) != val) { + (v = static_cast<int32_t>(val)) != val) { // non-integral value or outside 0..255, or trailing junk FAIL(ec); } @@ -915,6 +926,13 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, } // fall through to calling applyIntPropertyValue() break; + case UCHAR_IDENTIFIER_TYPE: + v = u_getPropertyValueEnum(p, vname.data()); + if (v == UCHAR_INVALID_CODE) { + FAIL(ec); + } + // fall through to calling applyIntPropertyValue() + break; default: // p is a non-binary, non-enumerated property that we // don't support (yet). @@ -1090,7 +1108,7 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, // support args of (UProperty, char*) then we can remove // NAME_PROP and make this a little more efficient. valueName = propName; - propName = UnicodeString(NAME_PROP, NAME_PROP_LENGTH, US_INV); + propName = NAME_PROP; } } diff --git a/deps/icu-small/source/common/unisetspan.cpp b/deps/icu-small/source/common/unisetspan.cpp index b7256d8fd1646d..209f0a86b54175 100644 --- a/deps/icu-small/source/common/unisetspan.cpp +++ b/deps/icu-small/source/common/unisetspan.cpp @@ -66,10 +66,10 @@ class OffsetList { // Only ever stack-allocated, does not need to inherit UMemo // Call exactly once if the list is to be used. void setMaxLength(int32_t maxLength) { - if(maxLength<=(int32_t)sizeof(staticList)) { - capacity=(int32_t)sizeof(staticList); + if (maxLength <= static_cast<int32_t>(sizeof(staticList))) { + capacity = static_cast<int32_t>(sizeof(staticList)); } else { - UBool *l=(UBool *)uprv_malloc(maxLength); + UBool* l = static_cast<UBool*>(uprv_malloc(maxLength)); if(l!=nullptr) { list=l; capacity=maxLength; @@ -84,7 +84,7 @@ class OffsetList { // Only ever stack-allocated, does not need to inherit UMemo } UBool isEmpty() const { - return (UBool)(length==0); + return length == 0; } // Reduce all stored offsets by delta, used when the current position @@ -183,7 +183,7 @@ static int32_t appendUTF8(const char16_t *s, int32_t length, uint8_t *t, int32_t capacity) { UErrorCode errorCode=U_ZERO_ERROR; int32_t length8=0; - u_strToUTF8((char *)t, capacity, &length8, s, length, &errorCode); + u_strToUTF8(reinterpret_cast<char*>(t), capacity, &length8, s, length, &errorCode); if(U_SUCCESS(errorCode)) { return length8; } else { @@ -196,7 +196,7 @@ appendUTF8(const char16_t *s, int32_t length, uint8_t *t, int32_t capacity) { static inline uint8_t makeSpanLengthByte(int32_t spanLength) { // 0xfe==UnicodeSetStringSpan::LONG_SPAN - return spanLength<0xfe ? (uint8_t)spanLength : (uint8_t)0xfe; + return spanLength < 0xfe ? static_cast<uint8_t>(spanLength) : static_cast<uint8_t>(0xfe); } // Construct for all variants of span(), or only for any one variant. @@ -208,7 +208,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, utf8Lengths(nullptr), spanLengths(nullptr), utf8(nullptr), utf8Length(0), maxLength16(0), maxLength8(0), - all((UBool)(which==ALL)) { + all(static_cast<UBool>(which == ALL)) { spanSet.retainAll(set); if(which&NOT_CONTAINED) { // Default to the same sets. @@ -228,7 +228,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, int32_t i, spanLength; UBool someRelevant=false; for(i=0; i<stringsLength; ++i) { - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); if (length16==0) { @@ -279,10 +279,10 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, allocSize+=stringsLength*4+utf8Length; } } - if(allocSize<=(int32_t)sizeof(staticLengths)) { + if (allocSize <= static_cast<int32_t>(sizeof(staticLengths))) { utf8Lengths=staticLengths; } else { - utf8Lengths=(int32_t *)uprv_malloc(allocSize); + utf8Lengths = static_cast<int32_t*>(uprv_malloc(allocSize)); if(utf8Lengths==nullptr) { maxLength16=maxLength8=0; // Prevent usage by making needsStringSpanUTF16/8() return false. return; // Out of memory. @@ -291,7 +291,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, if(all) { // Store span lengths for all span() variants. - spanLengths=(uint8_t *)(utf8Lengths+stringsLength); + spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths + stringsLength); spanBackLengths=spanLengths+stringsLength; spanUTF8Lengths=spanBackLengths+stringsLength; spanBackUTF8Lengths=spanUTF8Lengths+stringsLength; @@ -299,10 +299,10 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, } else { // Store span lengths for only one span() variant. if(which&UTF8) { - spanLengths=(uint8_t *)(utf8Lengths+stringsLength); + spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths + stringsLength); utf8=spanLengths+stringsLength; } else { - spanLengths=(uint8_t *)utf8Lengths; + spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths); } spanBackLengths=spanUTF8Lengths=spanBackUTF8Lengths=spanLengths; } @@ -311,7 +311,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, int32_t utf8Count=0; // Count UTF-8 bytes written so far. for(i=0; i<stringsLength; ++i) { - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); spanLength=spanSet.span(s16, length16, USET_SPAN_CONTAINED); @@ -334,15 +334,15 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, int32_t length8=appendUTF8(s16, length16, s8, utf8Length-utf8Count); utf8Count+=utf8Lengths[i]=length8; if(length8==0) { // Irrelevant for UTF-8 because not representable in UTF-8. - spanUTF8Lengths[i]=spanBackUTF8Lengths[i]=(uint8_t)ALL_CP_CONTAINED; + spanUTF8Lengths[i] = spanBackUTF8Lengths[i] = static_cast<uint8_t>(ALL_CP_CONTAINED); } else { // Relevant for UTF-8. if(which&CONTAINED) { if(which&FWD) { - spanLength=spanSet.spanUTF8((const char *)s8, length8, USET_SPAN_CONTAINED); + spanLength = spanSet.spanUTF8(reinterpret_cast<const char*>(s8), length8, USET_SPAN_CONTAINED); spanUTF8Lengths[i]=makeSpanLengthByte(spanLength); } if(which&BACK) { - spanLength=length8-spanSet.spanBackUTF8((const char *)s8, length8, USET_SPAN_CONTAINED); + spanLength = length8 - spanSet.spanBackUTF8(reinterpret_cast<const char*>(s8), length8, USET_SPAN_CONTAINED); spanBackUTF8Lengths[i]=makeSpanLengthByte(spanLength); } } else /* not CONTAINED, not all, but NOT_CONTAINED */ { @@ -378,10 +378,10 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, if(all) { spanLengths[i]=spanBackLengths[i]= spanUTF8Lengths[i]=spanBackUTF8Lengths[i]= - (uint8_t)ALL_CP_CONTAINED; + static_cast<uint8_t>(ALL_CP_CONTAINED); } else { // All spanXYZLengths pointers contain the same address. - spanLengths[i]=(uint8_t)ALL_CP_CONTAINED; + spanLengths[i] = static_cast<uint8_t>(ALL_CP_CONTAINED); } } } @@ -410,17 +410,17 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSetStringSpan &otherStri // UTF-8 lengths, 4 sets of span lengths, UTF-8 strings. int32_t stringsLength=strings.size(); int32_t allocSize=stringsLength*(4+1+1+1+1)+utf8Length; - if(allocSize<=(int32_t)sizeof(staticLengths)) { + if (allocSize <= static_cast<int32_t>(sizeof(staticLengths))) { utf8Lengths=staticLengths; } else { - utf8Lengths=(int32_t *)uprv_malloc(allocSize); + utf8Lengths = static_cast<int32_t*>(uprv_malloc(allocSize)); if(utf8Lengths==nullptr) { maxLength16=maxLength8=0; // Prevent usage by making needsStringSpanUTF16/8() return false. return; // Out of memory. } } - spanLengths=(uint8_t *)(utf8Lengths+stringsLength); + spanLengths = reinterpret_cast<uint8_t*>(utf8Lengths + stringsLength); utf8=spanLengths+stringsLength*4; uprv_memcpy(utf8Lengths, otherStringSpan.utf8Lengths, allocSize); } @@ -658,7 +658,7 @@ int32_t UnicodeSetStringSpan::span(const char16_t *s, int32_t length, USetSpanCo if(overlap==ALL_CP_CONTAINED) { continue; // Irrelevant string. (Also the empty string.) } - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); U_ASSERT(length>0); @@ -698,7 +698,7 @@ int32_t UnicodeSetStringSpan::span(const char16_t *s, int32_t length, USetSpanCo // For longest match, we do need to try to match even an all-contained string // to find the match from the earliest start. - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); if (length16==0) { @@ -826,7 +826,7 @@ int32_t UnicodeSetStringSpan::spanBack(const char16_t *s, int32_t length, USetSp if(overlap==ALL_CP_CONTAINED) { continue; // Irrelevant string. (Also the empty string.) } - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); U_ASSERT(length>0); @@ -868,7 +868,7 @@ int32_t UnicodeSetStringSpan::spanBack(const char16_t *s, int32_t length, USetSp // For longest match, we do need to try to match even an all-contained string // to find the match from the latest end. - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); if (length16==0) { @@ -968,7 +968,7 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa if(spanCondition==USET_SPAN_NOT_CONTAINED) { return spanNotUTF8(s, length); } - int32_t spanLength=spanSet.spanUTF8((const char *)s, length, USET_SPAN_CONTAINED); + int32_t spanLength = spanSet.spanUTF8(reinterpret_cast<const char*>(s), length, USET_SPAN_CONTAINED); if(spanLength==length) { return length; } @@ -1104,7 +1104,7 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa if(offsets.isEmpty()) { // No more strings matched after a previous string match. // Try another code point span from after the last string match. - spanLength=spanSet.spanUTF8((const char *)s+pos, rest, USET_SPAN_CONTAINED); + spanLength = spanSet.spanUTF8(reinterpret_cast<const char*>(s) + pos, rest, USET_SPAN_CONTAINED); if( spanLength==rest || // Reached the end of the string, or spanLength==0 // neither strings nor span progressed. ) { @@ -1145,7 +1145,7 @@ int32_t UnicodeSetStringSpan::spanBackUTF8(const uint8_t *s, int32_t length, USe if(spanCondition==USET_SPAN_NOT_CONTAINED) { return spanNotBackUTF8(s, length); } - int32_t pos=spanSet.spanBackUTF8((const char *)s, length, USET_SPAN_CONTAINED); + int32_t pos = spanSet.spanBackUTF8(reinterpret_cast<const char*>(s), length, USET_SPAN_CONTAINED); if(pos==0) { return 0; } @@ -1284,7 +1284,7 @@ int32_t UnicodeSetStringSpan::spanBackUTF8(const uint8_t *s, int32_t length, USe // No more strings matched before a previous string match. // Try another code point span from before the last string match. int32_t oldPos=pos; - pos=spanSet.spanBackUTF8((const char *)s, oldPos, USET_SPAN_CONTAINED); + pos = spanSet.spanBackUTF8(reinterpret_cast<const char*>(s), oldPos, USET_SPAN_CONTAINED); spanLength=oldPos-pos; if( pos==0 || // Reached the start of the string, or spanLength==0 // neither strings nor span progressed. @@ -1371,7 +1371,7 @@ int32_t UnicodeSetStringSpan::spanNot(const char16_t *s, int32_t length) const { if(spanLengths[i]==ALL_CP_CONTAINED) { continue; // Irrelevant string. (Also the empty string.) } - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); U_ASSERT(length>0); @@ -1415,7 +1415,7 @@ int32_t UnicodeSetStringSpan::spanNotBack(const char16_t *s, int32_t length) con if(spanLengths[i]==ALL_CP_CONTAINED) { continue; // Irrelevant string. (Also the empty string.) } - const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); + const UnicodeString& string = *static_cast<const UnicodeString*>(strings.elementAt(i)); const char16_t *s16=string.getBuffer(); int32_t length16=string.length(); U_ASSERT(length>0); @@ -1442,7 +1442,7 @@ int32_t UnicodeSetStringSpan::spanNotUTF8(const uint8_t *s, int32_t length) cons do { // Span until we find a code point from the set, // or a code point that starts or ends some string. - i=pSpanNotSet->spanUTF8((const char *)s+pos, rest, USET_SPAN_NOT_CONTAINED); + i = pSpanNotSet->spanUTF8(reinterpret_cast<const char*>(s) + pos, rest, USET_SPAN_NOT_CONTAINED); if(i==rest) { return length; // Reached the end of the string. } @@ -1487,7 +1487,7 @@ int32_t UnicodeSetStringSpan::spanNotBackUTF8(const uint8_t *s, int32_t length) do { // Span until we find a code point from the set, // or a code point that starts or ends some string. - pos=pSpanNotSet->spanBackUTF8((const char *)s, pos, USET_SPAN_NOT_CONTAINED); + pos = pSpanNotSet->spanBackUTF8(reinterpret_cast<const char*>(s), pos, USET_SPAN_NOT_CONTAINED); if(pos==0) { return 0; // Reached the start of the string. } diff --git a/deps/icu-small/source/common/unisetspan.h b/deps/icu-small/source/common/unisetspan.h index f1dc8e6f743a0d..482782ebf75eaa 100644 --- a/deps/icu-small/source/common/unisetspan.h +++ b/deps/icu-small/source/common/unisetspan.h @@ -141,11 +141,11 @@ class UnicodeSetStringSpan : public UMemory { }; UBool UnicodeSetStringSpan::needsStringSpanUTF16() { - return (UBool)(maxLength16!=0); + return maxLength16 != 0; } UBool UnicodeSetStringSpan::needsStringSpanUTF8() { - return (UBool)(maxLength8!=0); + return maxLength8 != 0; } UBool UnicodeSetStringSpan::contains(UChar32 c) const { diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 04f01cfa16cde5..4e29bad1d3b971 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -20,6 +20,8 @@ ****************************************************************************** */ +#include <string_view> + #include "unicode/utypes.h" #include "unicode/appendable.h" #include "unicode/putil.h" @@ -107,12 +109,34 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeString) UnicodeString U_EXPORT2 operator+ (const UnicodeString &s1, const UnicodeString &s2) { - return - UnicodeString(s1.length()+s2.length()+1, (UChar32)0, 0). - append(s1). - append(s2); + int32_t sumLengths; + if (uprv_add32_overflow(s1.length(), s2.length(), &sumLengths)) { + UnicodeString bogus; + bogus.setToBogus(); + return bogus; + } + if (sumLengths != INT32_MAX) { + ++sumLengths; // space for a terminating NUL if we need one + } + return UnicodeString(sumLengths, static_cast<UChar32>(0), 0).append(s1).append(s2); } +U_COMMON_API UnicodeString U_EXPORT2 +unistr_internalConcat(const UnicodeString &s1, std::u16string_view s2) { + int32_t sumLengths; + if (s2.length() > INT32_MAX || + uprv_add32_overflow(s1.length(), static_cast<int32_t>(s2.length()), &sumLengths)) { + UnicodeString bogus; + bogus.setToBogus(); + return bogus; + } + if (sumLengths != INT32_MAX) { + ++sumLengths; // space for a terminating NUL if we need one + } + return UnicodeString(sumLengths, static_cast<UChar32>(0), 0).append(s1).append(s2); +} + + //======================================== // Reference Counting functions, put at top of file so that optimizing compilers // have a chance to automatically inline. @@ -120,23 +144,23 @@ operator+ (const UnicodeString &s1, const UnicodeString &s2) { void UnicodeString::addRef() { - umtx_atomic_inc((u_atomic_int32_t *)fUnion.fFields.fArray - 1); + umtx_atomic_inc(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1); } int32_t UnicodeString::removeRef() { - return umtx_atomic_dec((u_atomic_int32_t *)fUnion.fFields.fArray - 1); + return umtx_atomic_dec(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1); } int32_t UnicodeString::refCount() const { - return umtx_loadAcquire(*((u_atomic_int32_t *)fUnion.fFields.fArray - 1)); + return umtx_loadAcquire(*(reinterpret_cast<u_atomic_int32_t*>(fUnion.fFields.fArray) - 1)); } void UnicodeString::releaseArray() { if((fUnion.fFields.fLengthAndFlags & kRefCounted) && removeRef() == 0) { - uprv_free((int32_t *)fUnion.fFields.fArray - 1); + uprv_free(reinterpret_cast<int32_t*>(fUnion.fFields.fArray) - 1); } } @@ -150,7 +174,7 @@ UnicodeString::releaseArray() { UnicodeString::UnicodeString(int32_t capacity, UChar32 c, int32_t count) { fUnion.fFields.fLengthAndFlags = 0; - if(count <= 0 || (uint32_t)c > 0x10ffff) { + if (count <= 0 || static_cast<uint32_t>(c) > 0x10ffff) { // just allocate and do not do anything else allocate(capacity); } else if(c <= 0xffff) { @@ -160,7 +184,7 @@ UnicodeString::UnicodeString(int32_t capacity, UChar32 c, int32_t count) { } if(allocate(capacity)) { char16_t *array = getArrayStart(); - char16_t unit = (char16_t)c; + char16_t unit = static_cast<char16_t>(c); for(int32_t i = 0; i < length; ++i) { array[i] = unit; } @@ -206,11 +230,6 @@ UnicodeString::UnicodeString(UChar32 ch) { } } -UnicodeString::UnicodeString(const char16_t *text) { - fUnion.fFields.fLengthAndFlags = kShortString; - doAppend(text, 0, -1); -} - UnicodeString::UnicodeString(const char16_t *text, int32_t textLength) { fUnion.fFields.fLengthAndFlags = kShortString; @@ -256,7 +275,7 @@ UnicodeString::UnicodeString(char16_t *buff, while(p != limit && *p != 0) { ++p; } - buffLength = (int32_t)(p - buff); + buffLength = static_cast<int32_t>(p - buff); } setArray(buff, buffLength, buffCapacity); } @@ -268,7 +287,7 @@ UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) { // treat as an empty string } else { if(length<0) { - length=(int32_t)uprv_strlen(src); + length = static_cast<int32_t>(uprv_strlen(src)); } if(cloneArrayIfNeeded(length, length, false)) { u_charsToUChars(src, getArrayStart(), length); @@ -279,11 +298,31 @@ UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) { } } +UnicodeString UnicodeString::readOnlyAliasFromU16StringView(std::u16string_view text) { + UnicodeString result; + if (text.length() <= INT32_MAX) { + result.setTo(false, text.data(), static_cast<int32_t>(text.length())); + } else { + result.setToBogus(); + } + return result; +} + +UnicodeString UnicodeString::readOnlyAliasFromUnicodeString(const UnicodeString &text) { + UnicodeString result; + if (text.isBogus()) { + result.setToBogus(); + } else { + result.setTo(false, text.getBuffer(), text.length()); + } + return result; +} + #if U_CHARSET_IS_UTF8 UnicodeString::UnicodeString(const char *codepageData) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { + if (codepageData != nullptr) { setToUTF8(codepageData); } } @@ -291,11 +330,11 @@ UnicodeString::UnicodeString(const char *codepageData) { UnicodeString::UnicodeString(const char *codepageData, int32_t dataLength) { fUnion.fFields.fLengthAndFlags = kShortString; // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + if (codepageData == nullptr || dataLength == 0 || dataLength < -1) { return; } if(dataLength == -1) { - dataLength = (int32_t)uprv_strlen(codepageData); + dataLength = static_cast<int32_t>(uprv_strlen(codepageData)); } setToUTF8(StringPiece(codepageData, dataLength)); } @@ -376,24 +415,24 @@ UnicodeString::allocate(int32_t capacity) { ++capacity; // for the NUL // Switch to size_t which is unsigned so that we can allocate up to 4GB. // Reference counter + UChars. - size_t numBytes = sizeof(int32_t) + (size_t)capacity * U_SIZEOF_UCHAR; + size_t numBytes = sizeof(int32_t) + static_cast<size_t>(capacity) * U_SIZEOF_UCHAR; // Round up to a multiple of 16. numBytes = (numBytes + 15) & ~15; - int32_t *array = (int32_t *) uprv_malloc(numBytes); + int32_t* array = static_cast<int32_t*>(uprv_malloc(numBytes)); if(array != nullptr) { // set initial refCount and point behind the refCount *array++ = 1; numBytes -= sizeof(int32_t); // have fArray point to the first char16_t - fUnion.fFields.fArray = (char16_t *)array; - fUnion.fFields.fCapacity = (int32_t)(numBytes / U_SIZEOF_UCHAR); + fUnion.fFields.fArray = reinterpret_cast<char16_t*>(array); + fUnion.fFields.fCapacity = static_cast<int32_t>(numBytes / U_SIZEOF_UCHAR); fUnion.fFields.fLengthAndFlags = kLongString; return true; } } fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; return false; } @@ -564,7 +603,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { // if src is bogus, set ourselves to bogus // do not call setToBogus() here because fArray and flags are not consistent here fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; break; } @@ -622,7 +661,7 @@ void UnicodeString::swap(UnicodeString &other) noexcept { //======================================== UnicodeString UnicodeString::unescape() const { - UnicodeString result(length(), (UChar32)0, (int32_t)0); // construct with capacity + UnicodeString result(length(), static_cast<UChar32>(0), static_cast<int32_t>(0)); // construct with capacity if (result.isBogus()) { return result; } @@ -656,10 +695,10 @@ UChar32 UnicodeString::unescapeAt(int32_t &offset) const { // Read-only implementation //======================================== UBool -UnicodeString::doEquals(const UnicodeString &text, int32_t len) const { - // Requires: this & text not bogus and have same lengths. +UnicodeString::doEquals(const char16_t *text, int32_t len) const { + // Requires: this not bogus and have same lengths. // Byte-wise comparison works for equality regardless of endianness. - return uprv_memcmp(getArrayStart(), text.getArrayStart(), len * U_SIZEOF_UCHAR) == 0; + return uprv_memcmp(getArrayStart(), text, len * U_SIZEOF_UCHAR) == 0; } UBool @@ -772,9 +811,9 @@ UnicodeString::doCompare( int32_t start, # else // little-endian: compare char16_t units do { - result = ((int32_t)*(chars++) - (int32_t)*(srcChars++)); + result = static_cast<int32_t>(*(chars++)) - static_cast<int32_t>(*(srcChars++)); if(result != 0) { - return (int8_t)(result >> 15 | 1); + return static_cast<int8_t>(result >> 15 | 1); } } while(--minLength > 0); # endif @@ -806,7 +845,7 @@ UnicodeString::doCompareCodePointOrder(int32_t start, int32_t diff = uprv_strCompare(getArrayStart() + start, length, (srcChars!=nullptr)?(srcChars + srcStart):nullptr, srcLength, false, true); /* translate the 32-bit result into an 8-bit one */ if(diff!=0) { - return (int8_t)(diff >> 15 | 1); + return static_cast<int8_t>(diff >> 15 | 1); } else { return 0; } @@ -831,7 +870,7 @@ UChar32 UnicodeString::char32At(int32_t offset) const { int32_t len = length(); - if((uint32_t)offset < (uint32_t)len) { + if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) { const char16_t *array = getArrayStart(); UChar32 c; U16_GET(array, 0, offset, len, c); @@ -843,7 +882,7 @@ UnicodeString::char32At(int32_t offset) const int32_t UnicodeString::getChar32Start(int32_t offset) const { - if((uint32_t)offset < (uint32_t)length()) { + if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(length())) { const char16_t *array = getArrayStart(); U16_SET_CP_START(array, 0, offset); return offset; @@ -855,7 +894,7 @@ UnicodeString::getChar32Start(int32_t offset) const { int32_t UnicodeString::getChar32Limit(int32_t offset) const { int32_t len = length(); - if((uint32_t)offset < (uint32_t)len) { + if (static_cast<uint32_t>(offset) < static_cast<uint32_t>(len)) { const char16_t *array = getArrayStart(); U16_SET_CP_LIMIT(array, 0, offset, len); return offset; @@ -919,7 +958,7 @@ UnicodeString::extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const { int32_t len = length(); if(U_SUCCESS(errorCode)) { - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + if (isBogus() || destCapacity < 0 || (destCapacity > 0 && dest == nullptr)) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; } else { const char16_t *array = getArrayStart(); @@ -986,10 +1025,10 @@ int32_t UnicodeString::extract(int32_t start, int32_t len, char *target, uint32_t dstSize) const { // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + if (/*dstSize < 0 || */(dstSize > 0 && target == nullptr)) { return 0; } - return toUTF8(start, len, target, dstSize <= 0x7fffffff ? (int32_t)dstSize : 0x7fffffff); + return toUTF8(start, len, target, dstSize <= 0x7fffffff ? static_cast<int32_t>(dstSize) : 0x7fffffff); } // else see unistr_cnv.cpp @@ -1013,7 +1052,7 @@ UnicodeString::toUTF8(ByteSink &sink) const { int32_t length16 = length(); if(length16 != 0) { char stackBuffer[1024]; - int32_t capacity = (int32_t)sizeof(stackBuffer); + int32_t capacity = static_cast<int32_t>(sizeof(stackBuffer)); UBool utf8IsOwned = false; char *utf8 = sink.GetAppendBuffer(length16 < capacity ? length16 : capacity, 3*length16, @@ -1027,7 +1066,7 @@ UnicodeString::toUTF8(ByteSink &sink) const { nullptr, // Don't care about number of substitutions. &errorCode); if(errorCode == U_BUFFER_OVERFLOW_ERROR) { - utf8 = (char *)uprv_malloc(length8); + utf8 = static_cast<char*>(uprv_malloc(length8)); if(utf8 != nullptr) { utf8IsOwned = true; errorCode = U_ZERO_ERROR; @@ -1071,7 +1110,7 @@ UnicodeString::indexOf(const char16_t *srcChars, int32_t start, int32_t length) const { - if(isBogus() || srcChars == 0 || srcStart < 0 || srcLength == 0) { + if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) { return -1; } @@ -1089,7 +1128,7 @@ UnicodeString::indexOf(const char16_t *srcChars, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1107,7 +1146,7 @@ UnicodeString::doIndexOf(char16_t c, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1124,7 +1163,7 @@ UnicodeString::doIndexOf(UChar32 c, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1135,7 +1174,7 @@ UnicodeString::lastIndexOf(const char16_t *srcChars, int32_t start, int32_t length) const { - if(isBogus() || srcChars == 0 || srcStart < 0 || srcLength == 0) { + if (isBogus() || srcChars == nullptr || srcStart < 0 || srcLength == 0) { return -1; } @@ -1153,7 +1192,7 @@ UnicodeString::lastIndexOf(const char16_t *srcChars, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1175,7 +1214,7 @@ UnicodeString::doLastIndexOf(char16_t c, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1192,7 +1231,7 @@ UnicodeString::doLastIndexOf(UChar32 c, if(match == nullptr) { return -1; } else { - return (int32_t)(match - array); + return static_cast<int32_t>(match - array); } } @@ -1245,7 +1284,7 @@ UnicodeString::setToBogus() releaseArray(); fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; + fUnion.fFields.fArray = nullptr; fUnion.fFields.fCapacity = 0; } @@ -1329,7 +1368,7 @@ UnicodeString::setTo(UBool isTerminated, textLength = u_strlen(text); } fUnion.fFields.fLengthAndFlags = kReadonlyAlias; - setArray((char16_t *)text, textLength, isTerminated ? textLength + 1 : textLength); + setArray(const_cast<char16_t*>(text), textLength, isTerminated ? textLength + 1 : textLength); return *this; } @@ -1359,7 +1398,7 @@ UnicodeString::setTo(char16_t *buffer, while(p != limit && *p != 0) { ++p; } - buffLength = (int32_t)(p - buffer); + buffLength = static_cast<int32_t>(p - buffer); } releaseArray(); @@ -1488,7 +1527,7 @@ UnicodeString::doReplace(int32_t start, return doAppend(srcChars, srcStart, srcLength); } - if(srcChars == 0) { + if (srcChars == nullptr) { srcLength = 0; } else { // Perform all remaining operations relative to srcChars + srcStart. @@ -1537,7 +1576,7 @@ UnicodeString::doReplace(int32_t start, } // clone our array and allocate a bigger array if needed - int32_t *bufferToDelete = 0; + int32_t *bufferToDelete = nullptr; if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength), false, &bufferToDelete) ) { @@ -1574,6 +1613,18 @@ UnicodeString::doReplace(int32_t start, return *this; } +UnicodeString& +UnicodeString::doReplace(int32_t start, int32_t length, std::u16string_view src) { + if (!isWritable()) { + return *this; + } + if (src.length() > INT32_MAX) { + setToBogus(); + return *this; + } + return doReplace(start, length, src.data(), 0, static_cast<int32_t>(src.length())); +} + // Versions of doReplace() only for append() variants. // doReplace() and doAppend() optimize for different cases. @@ -1607,44 +1658,73 @@ UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcL int32_t oldLength = length(); int32_t newLength; - if (uprv_add32_overflow(oldLength, srcLength, &newLength)) { - setToBogus(); - return *this; - } - // Check for append onto ourself - const char16_t* oldArray = getArrayStart(); - if (isBufferWritable() && - oldArray < srcChars + srcLength && - srcChars < oldArray + oldLength) { - // Copy into a new UnicodeString and start over - UnicodeString copy(srcChars, srcLength); - if (copy.isBogus()) { + if (srcLength <= getCapacity() - oldLength && isBufferWritable()) { + newLength = oldLength + srcLength; + // Faster than a memmove + if (srcLength <= 4) { + char16_t *arr = getArrayStart(); + arr[oldLength] = srcChars[0]; + if (srcLength > 1) arr[oldLength+1] = srcChars[1]; + if (srcLength > 2) arr[oldLength+2] = srcChars[2]; + if (srcLength > 3) arr[oldLength+3] = srcChars[3]; + setLength(newLength); + return *this; + } + } else { + if (uprv_add32_overflow(oldLength, srcLength, &newLength)) { setToBogus(); return *this; } - return doAppend(copy.getArrayStart(), 0, srcLength); - } - - // optimize append() onto a large-enough, owned string - if((newLength <= getCapacity() && isBufferWritable()) || - cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) { - char16_t *newArray = getArrayStart(); - // Do not copy characters when - // char16_t *buffer=str.getAppendBuffer(...); - // is followed by - // str.append(buffer, length); - // or - // str.appendString(buffer, length) - // or similar. - if(srcChars != newArray + oldLength) { - us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength); + + // Check for append onto ourself + const char16_t* oldArray = getArrayStart(); + if (isBufferWritable() && + oldArray < srcChars + srcLength && + srcChars < oldArray + oldLength) { + // Copy into a new UnicodeString and start over + UnicodeString copy(srcChars, srcLength); + if (copy.isBogus()) { + setToBogus(); + return *this; + } + return doAppend(copy.getArrayStart(), 0, srcLength); + } + + // optimize append() onto a large-enough, owned string + if (!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) { + return *this; } - setLength(newLength); } + + char16_t *newArray = getArrayStart(); + // Do not copy characters when + // char16_t *buffer=str.getAppendBuffer(...); + // is followed by + // str.append(buffer, length); + // or + // str.appendString(buffer, length) + // or similar. + if(srcChars != newArray + oldLength) { + us_arrayCopy(srcChars, 0, newArray, oldLength, srcLength); + } + setLength(newLength); + return *this; } +UnicodeString& +UnicodeString::doAppend(std::u16string_view src) { + if (!isWritable() || src.empty()) { + return *this; + } + if (src.length() > INT32_MAX) { + setToBogus(); + return *this; + } + return doAppend(src.data(), 0, static_cast<int32_t>(src.length())); +} + /** * Replaceable API */ @@ -1663,7 +1743,7 @@ UnicodeString::copy(int32_t start, int32_t limit, int32_t dest) { if (limit <= start) { return; // Nothing to do; avoid bogus malloc call } - char16_t* text = (char16_t*) uprv_malloc( sizeof(char16_t) * (limit - start) ); + char16_t* text = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (limit - start))); // Check to make sure text is not null. if (text != nullptr) { extractBetween(start, limit, text, 0); @@ -1708,13 +1788,13 @@ UnicodeString::doReverse(int32_t start, int32_t length) { // Before the loop we know left<right because length>=2. do { - hasSupplementary |= (UBool)U16_IS_LEAD(swap = *left); - hasSupplementary |= (UBool)U16_IS_LEAD(*left++ = *right); + hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(swap = *left)); + hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(*left++ = *right)); *right-- = swap; } while(left < right); // Make sure to test the middle code unit of an odd-length string. // Redundant if the length is even. - hasSupplementary |= (UBool)U16_IS_LEAD(*left); + hasSupplementary |= static_cast<UBool>(U16_IS_LEAD(*left)); /* if there are supplementary code points in the reversed range, then re-swap their surrogates */ if(hasSupplementary) { @@ -1817,7 +1897,7 @@ UnicodeString::releaseBuffer(int32_t newLength) { while(p<limit && *p!=0) { ++p; } - newLength=(int32_t)(p-array); + newLength = static_cast<int32_t>(p - array); } else if(newLength>capacity) { newLength=capacity; } @@ -1865,6 +1945,13 @@ UnicodeString::cloneArrayIfNeeded(int32_t newCapacity, growCapacity = newCapacity; } else if(newCapacity <= US_STACKBUF_SIZE && growCapacity > US_STACKBUF_SIZE) { growCapacity = US_STACKBUF_SIZE; + } else if(newCapacity > growCapacity) { + setToBogus(); + return false; // bad inputs + } + if(growCapacity > kMaxCapacity) { + setToBogus(); + return false; } // save old values @@ -1911,16 +1998,16 @@ UnicodeString::cloneArrayIfNeeded(int32_t newCapacity, // release the old array if(flags & kRefCounted) { // the array is refCounted; decrement and release if 0 - u_atomic_int32_t *pRefCount = ((u_atomic_int32_t *)oldArray - 1); + u_atomic_int32_t* pRefCount = reinterpret_cast<u_atomic_int32_t*>(oldArray) - 1; if(umtx_atomic_dec(pRefCount) == 0) { - if(pBufferToDelete == 0) { + if (pBufferToDelete == nullptr) { // Note: cast to (void *) is needed with MSVC, where u_atomic_int32_t // is defined as volatile. (Volatile has useful non-standard behavior // with this compiler.) uprv_free((void *)pRefCount); } else { // the caller requested to delete it himself - *pBufferToDelete = (int32_t *)pRefCount; + *pBufferToDelete = reinterpret_cast<int32_t*>(pRefCount); } } } diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 57f307c203a511..40ea6b2f4d6edf 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -72,7 +72,7 @@ UnicodeString::doCaseCompare(int32_t start, int32_t result=u_strcmpFold(chars, length, srcChars, srcLength, options|U_COMPARE_IGNORE_CASE, &errorCode); if(result!=0) { - return (int8_t)(result >> 24 | 1); + return static_cast<int8_t>(result >> 24 | 1); } } else { // get the srcLength if necessary @@ -80,7 +80,7 @@ UnicodeString::doCaseCompare(int32_t start, srcLength = u_strlen(srcChars + srcStart); } if(length != srcLength) { - return (int8_t)((length - srcLength) >> 24 | 1); + return static_cast<int8_t>((length - srcLength) >> 24 | 1); } } return 0; @@ -193,7 +193,7 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER // This is very similar to how doReplace() keeps the old array pointer // and deletes the old array itself after it is done. // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. - int32_t *bufferToDelete = 0; + int32_t *bufferToDelete = nullptr; if (!cloneArrayIfNeeded(newLength, newLength, false, &bufferToDelete, true)) { return *this; } diff --git a/deps/icu-small/source/common/unistr_cnv.cpp b/deps/icu-small/source/common/unistr_cnv.cpp index 2d649b2d511d6a..0313af7fe66b4b 100644 --- a/deps/icu-small/source/common/unistr_cnv.cpp +++ b/deps/icu-small/source/common/unistr_cnv.cpp @@ -62,8 +62,8 @@ UnicodeString::UnicodeString(const char *codepageData, UnicodeString::UnicodeString(const char *codepageData, const char *codepage) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { - doCodepageCreate(codepageData, (int32_t)uprv_strlen(codepageData), codepage); + if (codepageData != nullptr) { + doCodepageCreate(codepageData, static_cast<int32_t>(uprv_strlen(codepageData)), codepage); } } @@ -71,7 +71,7 @@ UnicodeString::UnicodeString(const char *codepageData, int32_t dataLength, const char *codepage) { fUnion.fFields.fLengthAndFlags = kShortString; - if(codepageData != 0) { + if (codepageData != nullptr) { doCodepageCreate(codepageData, dataLength, codepage); } } @@ -89,10 +89,10 @@ UnicodeString::UnicodeString(const char *src, int32_t srcLength, } else { // get input length if(srcLength==-1) { - srcLength=(int32_t)uprv_strlen(src); + srcLength = static_cast<int32_t>(uprv_strlen(src)); } if(srcLength>0) { - if(cnv!=0) { + if (cnv != nullptr) { // use the provided converter ucnv_resetToUnicode(cnv); doCodepageCreate(src, srcLength, cnv, errorCode); @@ -136,7 +136,7 @@ UnicodeString::extract(int32_t start, const char *codepage) const { // if the arguments are illegal, then do nothing - if(/*dstSize < 0 || */(dstSize > 0 && target == 0)) { + if (/*dstSize < 0 || */(dstSize > 0 && target == nullptr)) { return 0; } @@ -151,13 +151,13 @@ UnicodeString::extract(int32_t start, int32_t capacity; if(dstSize < 0x7fffffff) { // Assume that the capacity is real and a limit pointer won't wrap around. - capacity = (int32_t)dstSize; + capacity = static_cast<int32_t>(dstSize); } else { // Pin the capacity so that a limit pointer does not wrap around. - char *targetLimit = (char *)U_MAX_PTR(target); + char* targetLimit = static_cast<char*>(U_MAX_PTR(target)); // U_MAX_PTR(target) returns a targetLimit that is at most 0x7fffffff // greater than target and does not wrap around the top of the address space. - capacity = (int32_t)(targetLimit - target); + capacity = static_cast<int32_t>(targetLimit - target); } // create the converter @@ -171,7 +171,7 @@ UnicodeString::extract(int32_t start, // if the codepage is the default, use our cache // if it is an empty string, then use the "invariant character" conversion - if (codepage == 0) { + if (codepage == nullptr) { const char *defaultName = ucnv_getDefaultName(); if(UCNV_FAST_IS_UTF8(defaultName)) { return toUTF8(start, length, target, capacity); @@ -194,7 +194,7 @@ UnicodeString::extract(int32_t start, length = doExtract(start, length, target, capacity, converter, status); // close the converter - if (codepage == 0) { + if (codepage == nullptr) { u_releaseDefaultConverter(converter); } else { ucnv_close(converter); @@ -212,7 +212,7 @@ UnicodeString::extract(char *dest, int32_t destCapacity, return 0; } - if(isBogus() || destCapacity<0 || (destCapacity>0 && dest==0)) { + if (isBogus() || destCapacity < 0 || (destCapacity > 0 && dest == nullptr)) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -224,7 +224,7 @@ UnicodeString::extract(char *dest, int32_t destCapacity, // get the converter UBool isDefaultConverter; - if(cnv==0) { + if (cnv == nullptr) { isDefaultConverter=true; cnv=u_getDefaultConverter(&errorCode); if(U_FAILURE(errorCode)) { @@ -264,10 +264,10 @@ UnicodeString::doExtract(int32_t start, int32_t length, const char *destLimit; if(destCapacity==0) { - destLimit=dest=0; + destLimit=dest=nullptr; } else if(destCapacity==-1) { // Pin the limit to U_MAX_PTR if the "magic" destCapacity is used. - destLimit=(char*)U_MAX_PTR(dest); + destLimit = static_cast<char*>(U_MAX_PTR(dest)); // for NUL-termination, translate into highest int32_t destCapacity=0x7fffffff; } else { @@ -275,20 +275,24 @@ UnicodeString::doExtract(int32_t start, int32_t length, } // perform the conversion - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, &errorCode); - length=(int32_t)(dest-originalDest); + UErrorCode bufferStatus = U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); + length = static_cast<int32_t>(dest - originalDest); // if an overflow occurs, then get the preflighting length - if(errorCode==U_BUFFER_OVERFLOW_ERROR) { + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR) { char buffer[1024]; destLimit=buffer+sizeof(buffer); do { dest=buffer; - errorCode=U_ZERO_ERROR; - ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, 0, true, &errorCode); - length+=(int32_t)(dest-buffer); - } while(errorCode==U_BUFFER_OVERFLOW_ERROR); + bufferStatus=U_ZERO_ERROR; + ucnv_fromUnicode(cnv, &dest, destLimit, &src, srcLimit, nullptr, true, &bufferStatus); + length += static_cast<int32_t>(dest - buffer); + } while(bufferStatus==U_BUFFER_OVERFLOW_ERROR); + } + if (U_FAILURE(bufferStatus)) { + errorCode = bufferStatus; } return u_terminateChars(originalDest, destCapacity, length, &errorCode); @@ -300,11 +304,11 @@ UnicodeString::doCodepageCreate(const char *codepageData, const char *codepage) { // if there's nothing to convert, do nothing - if(codepageData == 0 || dataLength == 0 || dataLength < -1) { + if (codepageData == nullptr || dataLength == 0 || dataLength < -1) { return; } if(dataLength == -1) { - dataLength = (int32_t)uprv_strlen(codepageData); + dataLength = static_cast<int32_t>(uprv_strlen(codepageData)); } UErrorCode status = U_ZERO_ERROR; @@ -313,14 +317,14 @@ UnicodeString::doCodepageCreate(const char *codepageData, // if the codepage is the default, use our cache // if it is an empty string, then use the "invariant character" conversion UConverter *converter; - if (codepage == 0) { + if (codepage == nullptr) { const char *defaultName = ucnv_getDefaultName(); if(UCNV_FAST_IS_UTF8(defaultName)) { setToUTF8(StringPiece(codepageData, dataLength)); return; } converter = u_getDefaultConverter(&status); - } else if(*codepage == 0) { + } else if (*codepage == 0) { // use the "invariant characters" conversion if(cloneArrayIfNeeded(dataLength, dataLength, false)) { u_charsToUChars(codepageData, getArrayStart(), dataLength); @@ -346,7 +350,7 @@ UnicodeString::doCodepageCreate(const char *codepageData, } // close the converter - if(codepage == 0) { + if (codepage == nullptr) { u_releaseDefaultConverter(converter); } else { ucnv_close(converter); @@ -389,24 +393,25 @@ UnicodeString::doCodepageCreate(const char *codepageData, // perform the conversion array = getArrayStart(); myTarget = array + length(); + UErrorCode bufferStatus = U_ZERO_ERROR; ucnv_toUnicode(converter, &myTarget, array + getCapacity(), - &mySource, mySourceEnd, 0, true, &status); + &mySource, mySourceEnd, nullptr, true, &bufferStatus); // update the conversion parameters - setLength((int32_t)(myTarget - array)); + setLength(static_cast<int32_t>(myTarget - array)); // allocate more space and copy data, if needed - if(status == U_BUFFER_OVERFLOW_ERROR) { - // reset the error code - status = U_ZERO_ERROR; - + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR) { // keep the previous conversion results doCopyArray = true; // estimate the new size needed, larger than before // try 2 char16_t's per remaining source byte - arraySize = (int32_t)(length() + 2 * (mySourceEnd - mySource)); + arraySize = static_cast<int32_t>(length() + 2 * (mySourceEnd - mySource)); } else { + if (U_FAILURE(bufferStatus)) { + status = bufferStatus; + } break; } } diff --git a/deps/icu-small/source/common/unistr_props.cpp b/deps/icu-small/source/common/unistr_props.cpp index 3d05233bb9a083..e5bbb538640960 100644 --- a/deps/icu-small/source/common/unistr_props.cpp +++ b/deps/icu-small/source/common/unistr_props.cpp @@ -68,7 +68,7 @@ UnicodeString::trim() // move string forward over leading white space if(start > 0) { - doReplace(0, start, 0, 0, 0); + doReplace(0, start, nullptr, 0, 0); } return *this; diff --git a/deps/icu-small/source/common/unormcmp.cpp b/deps/icu-small/source/common/unormcmp.cpp index e11e716c8db6dd..fa8b85cea047b9 100644 --- a/deps/icu-small/source/common/unormcmp.cpp +++ b/deps/icu-small/source/common/unormcmp.cpp @@ -313,7 +313,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, */ if( level1==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 + (length = ucase_toFullFolding(cp1, &p, options)) >= 0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -358,7 +358,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, } if( level2==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 + (length = ucase_toFullFolding(cp2, &p, options)) >= 0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { @@ -403,7 +403,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, } if( level1<2 && (options&_COMPARE_EQUIV) && - 0!=(p=nfcImpl->getDecomposition((UChar32)cp1, decomp1, length)) + nullptr != (p = nfcImpl->getDecomposition(cp1, decomp1, length)) ) { /* cp1 decomposes into p[length] */ if(U_IS_SURROGATE(c1)) { @@ -444,7 +444,7 @@ unorm_cmpEquivFold(const char16_t *s1, int32_t length1, } if( level2<2 && (options&_COMPARE_EQUIV) && - 0!=(p=nfcImpl->getDecomposition((UChar32)cp2, decomp2, length)) + nullptr != (p = nfcImpl->getDecomposition(cp2, decomp2, length)) ) { /* cp2 decomposes into p[length] */ if(U_IS_SURROGATE(c2)) { @@ -566,7 +566,7 @@ unorm_compare(const char16_t *s1, int32_t length1, if(U_FAILURE(*pErrorCode)) { return 0; } - if(s1==0 || length1<-1 || s2==0 || length2<-1) { + if (s1 == nullptr || length1 < -1 || s2 == nullptr || length2 < -1) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } diff --git a/deps/icu-small/source/common/uposixdefs.h b/deps/icu-small/source/common/uposixdefs.h index 826c9bb47a207b..ab9b109a18136f 100644 --- a/deps/icu-small/source/common/uposixdefs.h +++ b/deps/icu-small/source/common/uposixdefs.h @@ -74,4 +74,9 @@ #define _POSIX_C_SOURCE 200809L #endif +/* Prevent _XOPEN_SOURCE from breaking build on macOS when aligned_alloc exists. */ +#if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE) +# define _DARWIN_C_SOURCE +#endif + #endif /* __UPOSIXDEFS_H__ */ diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 314fa6fb868069..817a1fac0c012b 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -100,8 +100,8 @@ void U_CALLCONV ulayout_load(UErrorCode &errorCode) { ulayout_isAcceptable, nullptr, &errorCode); if (U_FAILURE(errorCode)) { return; } - const uint8_t *inBytes = (const uint8_t *)udata_getMemory(gLayoutMemory); - const int32_t *inIndexes = (const int32_t *)inBytes; + const uint8_t* inBytes = static_cast<const uint8_t*>(udata_getMemory(gLayoutMemory)); + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); int32_t indexesLength = inIndexes[ULAYOUT_IX_INDEXES_LENGTH]; if (indexesLength < 12) { errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes. @@ -171,7 +171,7 @@ static UBool defaultContains(const BinaryProperty &prop, UChar32 c, UProperty /* } static UBool caseBinaryPropertyContains(const BinaryProperty &/*prop*/, UChar32 c, UProperty which) { - return static_cast<UBool>(ucase_hasBinaryProperty(c, which)); + return ucase_hasBinaryProperty(c, which); } static UBool isBidiControl(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { @@ -208,7 +208,7 @@ static UBool isNormInert(const BinaryProperty &, UChar32, UProperty) { static UBool isNormInert(const BinaryProperty &/*prop*/, UChar32 c, UProperty which) { UErrorCode errorCode=U_ZERO_ERROR; const Normalizer2 *norm2=Normalizer2Factory::getInstance( - (UNormalizationMode)(which-UCHAR_NFD_INERT+UNORM_NFD), errorCode); + static_cast<UNormalizationMode>(which - UCHAR_NFD_INERT + UNORM_NFD), errorCode); return U_SUCCESS(errorCode) && norm2->isInert(c); } #endif @@ -242,7 +242,7 @@ static UBool changesWhenCasefolded(const BinaryProperty &/*prop*/, UChar32 c, UP if(c>=0) { /* single code point */ const char16_t *resultString; - return (UBool)(ucase_toFullFolding(c, &resultString, U_FOLD_CASE_DEFAULT)>=0); + return ucase_toFullFolding(c, &resultString, U_FOLD_CASE_DEFAULT) >= 0; } else { /* guess some large but stack-friendly capacity */ char16_t dest[2*UCASE_MAX_STRING_LENGTH]; @@ -250,9 +250,9 @@ static UBool changesWhenCasefolded(const BinaryProperty &/*prop*/, UChar32 c, UP destLength=u_strFoldCase(dest, UPRV_LENGTHOF(dest), nfd.getBuffer(), nfd.length(), U_FOLD_CASE_DEFAULT, &errorCode); - return (UBool)(U_SUCCESS(errorCode) && + return U_SUCCESS(errorCode) && 0!=u_strCompare(nfd.getBuffer(), nfd.length(), - dest, destLength, false)); + dest, destLength, false); } } #endif @@ -359,6 +359,19 @@ static constexpr UChar32 ID_COMPAT_MATH_START[] = { 0x1D7C3 }; +/** Ranges (start/limit pairs) of Modifier_Combining_mark (only), from UCD PropList.txt. */ +static constexpr UChar32 MODIFIER_COMBINING_MARK[] = { + 0x0654, 0x0655 + 1, + 0x0658, 0x0658 + 1, // U+0658 + 0x06DC, 0x06DC + 1, // U+06DC + 0x06E3, 0x06E3 + 1, // U+06E3 + 0x06E7, 0x06E8 + 1, + 0x08CA, 0x08CB + 1, + 0x08CD, 0x08CF + 1, + 0x08D3, 0x08D3 + 1, // U+08D3 + 0x08F3, 0x08F3 + 1 // U+08F3 +}; + static UBool isIDCompatMathStart(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { if (c < ID_COMPAT_MATH_START[0]) { return false; } // fastpath for common scripts for (UChar32 startChar : ID_COMPAT_MATH_START) { @@ -375,6 +388,14 @@ static UBool isIDCompatMathContinue(const BinaryProperty &prop, UChar32 c, UProp return isIDCompatMathStart(prop, c, UCHAR_ID_COMPAT_MATH_START); } +static UBool isModifierCombiningMark(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + for (int32_t i = 0; i < UPRV_LENGTHOF(MODIFIER_COMBINING_MARK); i += 2) { + if (c < MODIFIER_COMBINING_MARK[i]) { return false; } // below range start + if (c < MODIFIER_COMBINING_MARK[i + 1]) { return true; } // below range limit + } + return false; +} + static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ /* * column and mask values for binary properties from u_getUnicodeProperties(). @@ -459,6 +480,7 @@ static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ { UPROPS_SRC_IDSU, 0, isIDSUnaryOperator }, // UCHAR_IDS_UNARY_OPERATOR { UPROPS_SRC_ID_COMPAT_MATH, 0, isIDCompatMathStart }, // UCHAR_ID_COMPAT_MATH_START { UPROPS_SRC_ID_COMPAT_MATH, 0, isIDCompatMathContinue }, // UCHAR_ID_COMPAT_MATH_CONTINUE + { UPROPS_SRC_MCM, 0 , isModifierCombiningMark }, // UCHAR_MODIFIER_COMBINING_MARK }; U_CAPI UBool U_EXPORT2 @@ -521,7 +543,7 @@ struct IntProperty { static int32_t defaultGetValue(const IntProperty &prop, UChar32 c, UProperty /*which*/) { /* systematic, directly stored properties */ - return (int32_t)(u_getUnicodeProperties(c, prop.column)&prop.mask)>>prop.shift; + return static_cast<int32_t>(u_getUnicodeProperties(c, prop.column) & prop.mask) >> prop.shift; } static int32_t defaultGetMaxValue(const IntProperty &prop, UProperty /*which*/) { @@ -533,17 +555,25 @@ static int32_t getMaxValueFromShift(const IntProperty &prop, UProperty /*which*/ } static int32_t getBiDiClass(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { - return (int32_t)u_charDirection(c); + return static_cast<int32_t>(u_charDirection(c)); } static int32_t getBiDiPairedBracketType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { - return (int32_t)ubidi_getPairedBracketType(c); + return static_cast<int32_t>(ubidi_getPairedBracketType(c)); } static int32_t biDiGetMaxValue(const IntProperty &/*prop*/, UProperty which) { return ubidi_getMaxValue(which); } +static int32_t getBlock(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + return static_cast<int32_t>(ublock_getCode(c)); +} + +static int32_t blockGetMaxValue(const IntProperty &/*prop*/, UProperty /*which*/) { + return uprv_getMaxValues(UPROPS_MAX_VALUES_OTHER_INDEX) & UPROPS_MAX_BLOCK; +} + #if UCONFIG_NO_NORMALIZATION static int32_t getCombiningClass(const IntProperty &, UChar32, UProperty) { return 0; @@ -555,7 +585,7 @@ static int32_t getCombiningClass(const IntProperty &/*prop*/, UChar32 c, UProper #endif static int32_t getGeneralCategory(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { - return (int32_t)u_charType(c); + return static_cast<int32_t>(u_charType(c)); } static int32_t getJoiningGroup(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { @@ -567,23 +597,26 @@ static int32_t getJoiningType(const IntProperty &/*prop*/, UChar32 c, UProperty } static int32_t getNumericType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { - int32_t ntv=(int32_t)GET_NUMERIC_TYPE_VALUE(u_getMainProperties(c)); + int32_t ntv = static_cast<int32_t>(GET_NUMERIC_TYPE_VALUE(u_getMainProperties(c))); return UPROPS_NTV_GET_TYPE(ntv); } static int32_t getScript(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { UErrorCode errorCode=U_ZERO_ERROR; - return (int32_t)uscript_getScript(c, &errorCode); + return static_cast<int32_t>(uscript_getScript(c, &errorCode)); } static int32_t scriptGetMaxValue(const IntProperty &/*prop*/, UProperty /*which*/) { - uint32_t scriptX=uprv_getMaxValues(0)&UPROPS_SCRIPT_X_MASK; - return uprops_mergeScriptCodeOrIndex(scriptX); + return uprv_getMaxValues(0)&UPROPS_MAX_SCRIPT; } /* * Map some of the Grapheme Cluster Break values to Hangul Syllable Types. - * Hangul_Syllable_Type is fully redundant with a subset of Grapheme_Cluster_Break. + * Hangul_Syllable_Type used to be fully redundant with a subset of Grapheme_Cluster_Break. + * + * Starting with Unicode 16, this is no longer true for HST=V vs. GCB=V in some cases: + * Some Kirat Rai vowels are given GCB=V for proper grapheme clustering, but + * they are of course not related to Hangul syllables. */ static const UHangulSyllableType gcbToHst[]={ U_HST_NOT_APPLICABLE, /* U_GCB_OTHER */ @@ -603,8 +636,13 @@ static const UHangulSyllableType gcbToHst[]={ }; static int32_t getHangulSyllableType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + // Ignore supplementary code points: They all have HST=NA. + // This is a simple way to handle the GCB!=hst cases since Unicode 16 (Kirat Rai vowels). + if(c>0xffff) { + return U_HST_NOT_APPLICABLE; + } /* see comments on gcbToHst[] above */ - int32_t gcb=(int32_t)(u_getUnicodeProperties(c, 2)&UPROPS_GCB_MASK)>>UPROPS_GCB_SHIFT; + int32_t gcb = static_cast<int32_t>(u_getUnicodeProperties(c, 2) & UPROPS_GCB_MASK) >> UPROPS_GCB_SHIFT; if(gcb<UPRV_LENGTHOF(gcbToHst)) { return gcbToHst[gcb]; } else { @@ -618,7 +656,7 @@ static int32_t getNormQuickCheck(const IntProperty &, UChar32, UProperty) { } #else static int32_t getNormQuickCheck(const IntProperty &/*prop*/, UChar32 c, UProperty which) { - return (int32_t)unorm_getQuickCheck(c, (UNormalizationMode)(which-UCHAR_NFD_QUICK_CHECK+UNORM_NFD)); + return static_cast<int32_t>(unorm_getQuickCheck(c, static_cast<UNormalizationMode>(which - UCHAR_NFD_QUICK_CHECK + UNORM_NFD))); } #endif @@ -668,6 +706,11 @@ static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) { } } +static int32_t getIDStatusValue(const IntProperty & /*prop*/, UChar32 c, UProperty /*which*/) { + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + return value >= UPROPS_ID_TYPE_ALLOWED_MIN ? U_ID_STATUS_ALLOWED : U_ID_STATUS_RESTRICTED; +} + static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ /* * column, mask and shift values for int-value properties from u_getUnicodeProperties(). @@ -678,25 +721,25 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ * For them, column is the UPropertySource value. */ { UPROPS_SRC_BIDI, 0, 0, getBiDiClass, biDiGetMaxValue }, - { 0, UPROPS_BLOCK_MASK, UPROPS_BLOCK_SHIFT, defaultGetValue, defaultGetMaxValue }, + { UPROPS_SRC_BLOCK, 0, 0, getBlock, blockGetMaxValue }, { UPROPS_SRC_NFC, 0, 0xff, getCombiningClass, getMaxValueFromShift }, { 2, UPROPS_DT_MASK, 0, defaultGetValue, defaultGetMaxValue }, { 0, UPROPS_EA_MASK, UPROPS_EA_SHIFT, defaultGetValue, defaultGetMaxValue }, - { UPROPS_SRC_CHAR, 0, (int32_t)U_CHAR_CATEGORY_COUNT-1,getGeneralCategory, getMaxValueFromShift }, + { UPROPS_SRC_CHAR, 0, static_cast<int32_t>(U_CHAR_CATEGORY_COUNT) - 1, getGeneralCategory, getMaxValueFromShift }, { UPROPS_SRC_BIDI, 0, 0, getJoiningGroup, biDiGetMaxValue }, { UPROPS_SRC_BIDI, 0, 0, getJoiningType, biDiGetMaxValue }, { 2, UPROPS_LB_MASK, UPROPS_LB_SHIFT, defaultGetValue, defaultGetMaxValue }, - { UPROPS_SRC_CHAR, 0, (int32_t)U_NT_COUNT-1, getNumericType, getMaxValueFromShift }, + { UPROPS_SRC_CHAR, 0, static_cast<int32_t>(U_NT_COUNT) - 1, getNumericType, getMaxValueFromShift }, { UPROPS_SRC_PROPSVEC, 0, 0, getScript, scriptGetMaxValue }, - { UPROPS_SRC_PROPSVEC, 0, (int32_t)U_HST_COUNT-1, getHangulSyllableType, getMaxValueFromShift }, + { UPROPS_SRC_PROPSVEC, 0, static_cast<int32_t>(U_HST_COUNT) - 1, getHangulSyllableType, getMaxValueFromShift }, // UCHAR_NFD_QUICK_CHECK: max=1=YES -- never "maybe", only "no" or "yes" - { UPROPS_SRC_NFC, 0, (int32_t)UNORM_YES, getNormQuickCheck, getMaxValueFromShift }, + { UPROPS_SRC_NFC, 0, static_cast<int32_t>(UNORM_YES), getNormQuickCheck, getMaxValueFromShift }, // UCHAR_NFKD_QUICK_CHECK: max=1=YES -- never "maybe", only "no" or "yes" - { UPROPS_SRC_NFKC, 0, (int32_t)UNORM_YES, getNormQuickCheck, getMaxValueFromShift }, + { UPROPS_SRC_NFKC, 0, static_cast<int32_t>(UNORM_YES), getNormQuickCheck, getMaxValueFromShift }, // UCHAR_NFC_QUICK_CHECK: max=2=MAYBE - { UPROPS_SRC_NFC, 0, (int32_t)UNORM_MAYBE, getNormQuickCheck, getMaxValueFromShift }, + { UPROPS_SRC_NFC, 0, static_cast<int32_t>(UNORM_MAYBE), getNormQuickCheck, getMaxValueFromShift }, // UCHAR_NFKC_QUICK_CHECK: max=2=MAYBE - { UPROPS_SRC_NFKC, 0, (int32_t)UNORM_MAYBE, getNormQuickCheck, getMaxValueFromShift }, + { UPROPS_SRC_NFKC, 0, static_cast<int32_t>(UNORM_MAYBE), getNormQuickCheck, getMaxValueFromShift }, { UPROPS_SRC_NFC, 0, 0xff, getLeadCombiningClass, getMaxValueFromShift }, { UPROPS_SRC_NFC, 0, 0xff, getTrailCombiningClass, getMaxValueFromShift }, { 2, UPROPS_GCB_MASK, UPROPS_GCB_SHIFT, defaultGetValue, defaultGetMaxValue }, @@ -706,6 +749,8 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ { UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue }, { UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue }, { UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue }, + { UPROPS_SRC_PROPSVEC, 0, static_cast<int32_t>(U_ID_STATUS_ALLOWED), getIDStatusValue, getMaxValueFromShift }, + { 0, UPROPS_INCB_MASK, UPROPS_INCB_SHIFT,defaultGetValue, defaultGetMaxValue }, }; U_CAPI int32_t U_EXPORT2 @@ -800,6 +845,7 @@ uprops_getSource(UProperty which) { } else { switch(which) { case UCHAR_SCRIPT_EXTENSIONS: + case UCHAR_IDENTIFIER_TYPE: return UPROPS_SRC_PROPSVEC; default: return UPROPS_SRC_NONE; /* undefined */ @@ -822,6 +868,13 @@ uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *p } return; } + if (src == UPROPS_SRC_MCM) { + // range limits + for (UChar32 c : MODIFIER_COMBINING_MARK) { + sa->add(sa->set, c); + } + return; + } if (!ulayout_ensureData(*pErrorCode)) { return; } const UCPTrie *trie; switch (src) { @@ -853,6 +906,86 @@ uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *p } } +U_CAPI bool U_EXPORT2 +u_hasIDType(UChar32 c, UIdentifierType type) { + uint32_t typeIndex = type; // also guards against negative type integers + if (typeIndex >= UPRV_LENGTHOF(uprops_idTypeToEncoded)) { + return false; + } + uint32_t encodedType = uprops_idTypeToEncoded[typeIndex]; + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + if ((encodedType & UPROPS_ID_TYPE_BIT) != 0) { + return value < UPROPS_ID_TYPE_FORBIDDEN && (value & encodedType) != 0; + } else { + return value == encodedType; + } +} + +namespace { + +void maybeAppendType(uint32_t value, uint32_t bit, UIdentifierType t, + UIdentifierType *types, int32_t &length, int32_t capacity) { + if ((value & bit) != 0) { + if (length < capacity) { + types[length] = t; + } + ++length; + } +} + +} // namespace + +U_CAPI int32_t U_EXPORT2 +u_getIDTypes(UChar32 c, UIdentifierType *types, int32_t capacity, UErrorCode *pErrorCode) { + if (U_FAILURE(*pErrorCode)) { return 0; } + if (capacity < 0 || (capacity > 0 && types == nullptr)) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + uint32_t value = u_getUnicodeProperties(c, 2) >> UPROPS_2_ID_TYPE_SHIFT; + if ((value & UPROPS_ID_TYPE_FORBIDDEN) == UPROPS_ID_TYPE_FORBIDDEN || + value == UPROPS_ID_TYPE_NOT_CHARACTER) { + // single value + if (capacity > 0) { + UIdentifierType t; + switch (value) { + case UPROPS_ID_TYPE_NOT_CHARACTER: t = U_ID_TYPE_NOT_CHARACTER; break; + case UPROPS_ID_TYPE_DEPRECATED: t = U_ID_TYPE_DEPRECATED; break; + case UPROPS_ID_TYPE_DEFAULT_IGNORABLE: t = U_ID_TYPE_DEFAULT_IGNORABLE; break; + case UPROPS_ID_TYPE_NOT_NFKC: t = U_ID_TYPE_NOT_NFKC; break; + case UPROPS_ID_TYPE_INCLUSION: t = U_ID_TYPE_INCLUSION; break; + case UPROPS_ID_TYPE_RECOMMENDED: t = U_ID_TYPE_RECOMMENDED; break; + default: + *pErrorCode = U_INVALID_FORMAT_ERROR; + return 0; + } + types[0] = t; + } else { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } + return 1; + } else { + // one or more combinable bits + int32_t length = 0; + maybeAppendType(value, UPROPS_ID_TYPE_NOT_XID, U_ID_TYPE_NOT_XID, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_EXCLUSION, U_ID_TYPE_EXCLUSION, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_OBSOLETE, U_ID_TYPE_OBSOLETE, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_TECHNICAL, U_ID_TYPE_TECHNICAL, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_UNCOMMON_USE, U_ID_TYPE_UNCOMMON_USE, + types, length, capacity); + maybeAppendType(value, UPROPS_ID_TYPE_LIMITED_USE, U_ID_TYPE_LIMITED_USE, + types, length, capacity); + if (length >= capacity) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } + return length; + } +} + #if !UCONFIG_NO_NORMALIZATION U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index 80347eab5777f8..178eb3fd055a3b 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -39,16 +39,18 @@ enum { UPROPS_SCRIPT_EXTENSIONS_INDEX, - UPROPS_RESERVED_INDEX_7, + UPROPS_BLOCK_TRIE_INDEX, UPROPS_RESERVED_INDEX_8, - /* size of the data file (number of 32-bit units after the header) */ + /** size of the data file (number of 32-bit units after the header) */ UPROPS_DATA_TOP_INDEX, - /* maximum values for code values in vector word 0 */ + /** maximum values for code values in vector word 0 */ UPROPS_MAX_VALUES_INDEX=10, - /* maximum values for code values in vector word 2 */ + /** maximum values for code values in vector word 2 */ UPROPS_MAX_VALUES_2_INDEX, + /** maximum values for other code values */ + UPROPS_MAX_VALUES_OTHER_INDEX, UPROPS_INDEX_COUNT=16 }; @@ -117,62 +119,57 @@ enum { /* number of properties vector words */ #define UPROPS_VECTOR_WORDS 3 -/* - * Properties in vector word 0 - * Bits - * 31..24 DerivedAge version major/minor one nibble each - * 23..22 3..1: Bits 21..20 & 7..0 = Script_Extensions index - * 3: Script value from Script_Extensions - * 2: Script=Inherited - * 1: Script=Common - * 0: Script=bits 21..20 & 7..0 - * 21..20 Bits 9..8 of the UScriptCode, or index to Script_Extensions - * 19..17 East Asian Width - * 16.. 8 UBlockCode - * 7.. 0 UScriptCode, or index to Script_Extensions - */ - -/* derived age: one nibble each for major and minor version numbers */ -#define UPROPS_AGE_MASK 0xff000000 -#define UPROPS_AGE_SHIFT 24 - -/* Script_Extensions: mask includes Script */ -#define UPROPS_SCRIPT_X_MASK 0x00f000ff -#define UPROPS_SCRIPT_X_SHIFT 22 - -// The UScriptCode or Script_Extensions index is split across two bit fields. -// (Starting with Unicode 13/ICU 66/2019 due to more varied Script_Extensions.) -// Shift the high bits right by 12 to assemble the full value. -#define UPROPS_SCRIPT_HIGH_MASK 0x00300000 -#define UPROPS_SCRIPT_HIGH_SHIFT 12 -#define UPROPS_MAX_SCRIPT 0x3ff - -#define UPROPS_EA_MASK 0x000e0000 -#define UPROPS_EA_SHIFT 17 - -#define UPROPS_BLOCK_MASK 0x0001ff00 -#define UPROPS_BLOCK_SHIFT 8 - -#define UPROPS_SCRIPT_LOW_MASK 0x000000ff - -/* UPROPS_SCRIPT_X_WITH_COMMON must be the lowest value that involves Script_Extensions. */ -#define UPROPS_SCRIPT_X_WITH_COMMON 0x400000 -#define UPROPS_SCRIPT_X_WITH_INHERITED 0x800000 -#define UPROPS_SCRIPT_X_WITH_OTHER 0xc00000 - #ifdef __cplusplus namespace { -inline uint32_t uprops_mergeScriptCodeOrIndex(uint32_t scriptX) { - return - ((scriptX & UPROPS_SCRIPT_HIGH_MASK) >> UPROPS_SCRIPT_HIGH_SHIFT) | - (scriptX & UPROPS_SCRIPT_LOW_MASK); -} - -} // namespace - -#endif // __cplusplus +// Properties in vector word 0 +// Bits +// 31..26 Age major version (major=0..63) +// 25..24 Age minor version (minor=0..3) +// 23..17 reserved +// 16..15 Indic Conjunct Break +// 14..12 East Asian Width +// 11..10 3..1: Bits 9..0 = Script_Extensions index +// 3: Script value from Script_Extensions +// 2: Script=Inherited +// 1: Script=Common +// 0: Script=bits 9..0 +// 9.. 0 UScriptCode, or index to Script_Extensions + +// *Note*: If we need more than the available bits for new properties, +// then we could move the Age property out of the properties vectors. +// For example, we could store the Age property in its own trie. +// In a small, 8-bit-value-width CodePointTrie, it would be larger than +// the amount of data that we would save in the properties vectors and their trie, +// but the size increase would be a small percentage of the total uprops.icu size. +// It would certainly be a much smaller increase than widening the properties vectors. +// The savings in the properties vectors+trie from pulling out the Age property +// are partly from mediocre correlation between Age and other property values. +// (Adding new characters to existing scripts tends to split property vectors where +// new characters are similar to old ones.) +// See https://github.com/unicode-org/icu/pull/3025 for details. + +inline constexpr uint32_t UPROPS_AGE_MASK = 0xff000000; +inline constexpr int32_t UPROPS_AGE_SHIFT = 24; + +inline constexpr uint8_t UPROPS_AGE_MAJOR_MAX = 63; +inline constexpr uint8_t UPROPS_AGE_MINOR_MAX = 3; + +inline constexpr uint32_t UPROPS_EA_MASK = 0x00007000; +inline constexpr int32_t UPROPS_EA_SHIFT = 12; + +inline constexpr uint32_t UPROPS_INCB_MASK = 0x00018000; +inline constexpr int32_t UPROPS_INCB_SHIFT = 15; + +/** Script_Extensions: mask includes Script */ +inline constexpr uint32_t UPROPS_SCRIPT_X_MASK = 0x00000fff; + +// UPROPS_SCRIPT_X_WITH_COMMON must be the lowest value that involves Script_Extensions. +inline constexpr uint32_t UPROPS_SCRIPT_X_WITH_OTHER = 0xc00; +inline constexpr uint32_t UPROPS_SCRIPT_X_WITH_INHERITED = 0x800; +inline constexpr uint32_t UPROPS_SCRIPT_X_WITH_COMMON = 0x400; +inline constexpr int32_t UPROPS_MAX_SCRIPT = 0x3ff; /* * Properties in vector word 1 @@ -224,23 +221,80 @@ enum { /* * Properties in vector word 2 * Bits - * 31..26 unused since ICU 70 added uemoji.icu; - * in ICU 57..69 stored emoji properties + * 31..26 ICU 75: Identifier_Type bit set + * ICU 70..74: unused + * ICU 57..69: emoji properties; moved to uemoji.icu in ICU 70 * 25..20 Line Break * 19..15 Sentence Break * 14..10 Word Break * 9.. 5 Grapheme Cluster Break * 4.. 0 Decomposition Type */ + +// https://www.unicode.org/reports/tr39/#Identifier_Status_and_Type +// The Identifier_Type maps each code point to a *set* of one or more values. +// Some can be combined with others, some can only occur alone. +// Exclusion & Limited_Use are combinable bits, but cannot occur together. +// We use this forbidden combination for enumerated values. +// We use 6 bits for all possible combinations. +// If more combinable values are added, then we need to use more bits. +// +// We do not store separate data for Identifier_Status: +// We can derive that from the encoded Identifier_Type via a simple range check. + +inline constexpr uint32_t UPROPS_2_ID_TYPE_MASK = 0xfc000000; +inline constexpr int32_t UPROPS_2_ID_TYPE_SHIFT = 26; + enum { - UPROPS_2_UNUSED_WAS_EXTENDED_PICTOGRAPHIC=26, // ICU 62..69 - UPROPS_2_UNUSED_WAS_EMOJI_COMPONENT, // ICU 60..69 - UPROPS_2_UNUSED_WAS_EMOJI, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_PRESENTATION, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_MODIFIER, // ICU 57..69 - UPROPS_2_UNUSED_WAS_EMOJI_MODIFIER_BASE // ICU 57..69 + // A high bit for use in idTypeToEncoded[] but not used in the data + UPROPS_ID_TYPE_BIT = 0x80, + + // Combinable bits + UPROPS_ID_TYPE_EXCLUSION = 0x20, + UPROPS_ID_TYPE_LIMITED_USE = 0x10, + UPROPS_ID_TYPE_UNCOMMON_USE = 8, + UPROPS_ID_TYPE_TECHNICAL = 4, + UPROPS_ID_TYPE_OBSOLETE = 2, + UPROPS_ID_TYPE_NOT_XID = 1, + + // Exclusive values + UPROPS_ID_TYPE_NOT_CHARACTER = 0, + + // Forbidden bit combination used for enumerating other exclusive values + UPROPS_ID_TYPE_FORBIDDEN = UPROPS_ID_TYPE_EXCLUSION | UPROPS_ID_TYPE_LIMITED_USE, // 0x30 + UPROPS_ID_TYPE_DEPRECATED = UPROPS_ID_TYPE_FORBIDDEN, // 0x30 + UPROPS_ID_TYPE_DEFAULT_IGNORABLE, // 0x31 + UPROPS_ID_TYPE_NOT_NFKC, // 0x32 + + UPROPS_ID_TYPE_ALLOWED_MIN = UPROPS_ID_TYPE_FORBIDDEN + 0xc, // 0x3c + UPROPS_ID_TYPE_INCLUSION = UPROPS_ID_TYPE_FORBIDDEN + 0xe, // 0x3e + UPROPS_ID_TYPE_RECOMMENDED = UPROPS_ID_TYPE_FORBIDDEN + 0xf, // 0x3f +}; + +/** + * Maps UIdentifierType to encoded bits. + * When UPROPS_ID_TYPE_BIT is set, then use "&" to test whether the value bit is set. + * When UPROPS_ID_TYPE_BIT is not set, then compare ("==") the array value with the data value. + */ +inline constexpr uint8_t uprops_idTypeToEncoded[] = { + UPROPS_ID_TYPE_NOT_CHARACTER, + UPROPS_ID_TYPE_DEPRECATED, + UPROPS_ID_TYPE_DEFAULT_IGNORABLE, + UPROPS_ID_TYPE_NOT_NFKC, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_NOT_XID, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_EXCLUSION, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_OBSOLETE, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_TECHNICAL, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_UNCOMMON_USE, + UPROPS_ID_TYPE_BIT | UPROPS_ID_TYPE_LIMITED_USE, + UPROPS_ID_TYPE_INCLUSION, + UPROPS_ID_TYPE_RECOMMENDED }; +} // namespace + +#endif // __cplusplus + #define UPROPS_LB_MASK 0x03f00000 #define UPROPS_LB_SHIFT 20 @@ -255,6 +309,17 @@ enum { #define UPROPS_DT_MASK 0x0000001f +#ifdef __cplusplus + +namespace { + +// Bits 9..0 in UPROPS_MAX_VALUES_OTHER_INDEX +inline constexpr uint32_t UPROPS_MAX_BLOCK = 0x3ff; + +} // namespace + +#endif // __cplusplus + /** * Gets the main properties value for a code point. * Implemented in uchar.c for uprops.cpp. @@ -271,7 +336,7 @@ U_CFUNC uint32_t u_getUnicodeProperties(UChar32 c, int32_t column); /** - * Get the the maximum values for some enum/int properties. + * Get the maximum values for some enum/int properties. * Use the same column numbers as for u_getUnicodeProperties(). * The returned value will contain maximum values stored in the same bit fields * as where the enum values are stored in the u_getUnicodeProperties() @@ -328,6 +393,8 @@ enum { ZWNBSP =0xfeff }; +// TODO: Move these two functions into a different header file (new unames.h?) so that uprops.h +// need not be C-compatible any more. /** * Get the maximum length of a (regular/1.0/extended) character name. * @return 0 if no character names available. @@ -381,6 +448,8 @@ enum UPropertySource { UPROPS_SRC_EMOJI, UPROPS_SRC_IDSU, UPROPS_SRC_ID_COMPAT_MATH, + UPROPS_SRC_BLOCK, + UPROPS_SRC_MCM, /** One more than the highest UPropertySource (UPROPS_SRC_) constant. */ UPROPS_SRC_COUNT }; @@ -412,6 +481,13 @@ upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode); U_CFUNC void U_EXPORT2 uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *pErrorCode); +#ifdef __cplusplus + +U_CFUNC void U_EXPORT2 +ublock_addPropertyStarts(const USetAdder *sa, UErrorCode &errorCode); + +#endif // __cplusplus + /** * Return a set of characters for property enumeration. * For each two consecutive characters (start, limit) in the set, @@ -424,6 +500,12 @@ uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *p uprv_getInclusions(const USetAdder *sa, UErrorCode *pErrorCode); */ +/** @internal for icuexportdata */ +U_CAPI void U_EXPORT2 +uprv_addScriptExtensionsCodePoints(const USetAdder *sa, UErrorCode *pErrorCode); + +// TODO: Move this into a different header file (udataswp.h? new unames.h?) so that uprops.h +// need not be C-compatible any more. /** * Swap the ICU Unicode character names file. See uchar.c. * @internal diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 5aa1c5fa2f10cf..afda2770fd3fc2 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -56,7 +56,7 @@ static UMutex resbMutex; /* INTERNAL: hashes an entry */ static int32_t U_CALLCONV hashEntry(const UHashTok parm) { - UResourceDataEntry *b = (UResourceDataEntry *)parm.pointer; + UResourceDataEntry* b = static_cast<UResourceDataEntry*>(parm.pointer); UHashTok namekey, pathkey; namekey.pointer = b->fName; pathkey.pointer = b->fPath; @@ -65,15 +65,14 @@ static int32_t U_CALLCONV hashEntry(const UHashTok parm) { /* INTERNAL: compares two entries */ static UBool U_CALLCONV compareEntries(const UHashTok p1, const UHashTok p2) { - UResourceDataEntry *b1 = (UResourceDataEntry *)p1.pointer; - UResourceDataEntry *b2 = (UResourceDataEntry *)p2.pointer; + UResourceDataEntry* b1 = static_cast<UResourceDataEntry*>(p1.pointer); + UResourceDataEntry* b2 = static_cast<UResourceDataEntry*>(p2.pointer); UHashTok name1, name2, path1, path2; name1.pointer = b1->fName; name2.pointer = b2->fName; path1.pointer = b1->fPath; path2.pointer = b2->fPath; - return (UBool)(uhash_compareChars(name1, name2) && - uhash_compareChars(path1, path2)); + return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2); } @@ -94,8 +93,16 @@ static UBool chopLocale(char *name) { static UBool hasVariant(const char* localeID) { UErrorCode err = U_ZERO_ERROR; - int32_t variantLength = uloc_getVariant(localeID, nullptr, 0, &err); - return variantLength != 0; + CheckedArrayByteSink sink(nullptr, 0); + ulocimp_getSubtags( + localeID, + nullptr, + nullptr, + nullptr, + &sink, + nullptr, + err); + return sink.NumberOfBytesAppended() != 0; } // This file contains the tables for doing locale fallback, which are generated @@ -209,17 +216,11 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope } UErrorCode err = U_ZERO_ERROR; - const char* tempNamePtr = name; - CharString language = ulocimp_getLanguage(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString script = ulocimp_getScript(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString region = ulocimp_getCountry(tempNamePtr, &tempNamePtr, err); - CharString workingLocale; + CharString language; + CharString script; + CharString region; + ulocimp_getSubtags(name, &language, &script, ®ion, nullptr, nullptr, err); + if (U_FAILURE(err)) { // hopefully this never happens... return chopLocale(name); @@ -238,13 +239,15 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope } } + CharString workingLocale; + // if it's not in the parent locale table, figure out the fallback script algorithmically // (see CLDR-15265 for an explanation of the algorithm) if (!script.isEmpty() && !region.isEmpty()) { // if "name" has both script and region, is the script the default script? // - if so, remove it and keep the region // - if not, remove the region and keep the script - if (getDefaultScript(language, region) == script.toStringPiece()) { + if (getDefaultScript(language, region) == script) { workingLocale.append(language, err).append("_", err).append(region, err); } else { workingLocale.append(language, err).append("_", err).append(script, err); @@ -254,12 +257,9 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope // - if yes, replace the region with the script from the original locale ID // - if no, replace the region with the default script for that language and region UErrorCode err = U_ZERO_ERROR; - tempNamePtr = origName; - CharString origNameLanguage = ulocimp_getLanguage(tempNamePtr, &tempNamePtr, err); - if (*tempNamePtr == '_') { - ++tempNamePtr; - } - CharString origNameScript = ulocimp_getScript(origName, nullptr, err); + CharString origNameLanguage; + CharString origNameScript; + ulocimp_getSubtags(origName, &origNameLanguage, &origNameScript, nullptr, nullptr, nullptr, err); if (!origNameScript.isEmpty()) { workingLocale.append(language, err).append("_", err).append(origNameScript, err); } else { @@ -272,7 +272,7 @@ static bool getParentLocaleID(char *name, const char *origName, UResOpenType ope // - if not, return false to continue up the chain // (we don't do this for other open types for the same reason we don't look things up in the parent // locale table for other open types-- see the reference to UTS #35 above) - if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script.toStringPiece()) { + if (openType != URES_OPEN_LOCALE_DEFAULT_ROOT || getDefaultScript(language, CharString()) == script) { workingLocale.append(language, err); } else { return false; @@ -402,7 +402,7 @@ static int32_t ures_flushCache() pos = UHASH_FIRST; while ((e = uhash_nextElement(cache, &pos)) != nullptr) { - resB = (UResourceDataEntry *) e->value.pointer; + resB = static_cast<UResourceDataEntry*>(e->value.pointer); /* Deletes only if reference counter == 0 * Don't worry about the children of this node. * Those will eventually get deleted too, if not already. @@ -487,15 +487,15 @@ static void initCache(UErrorCode *status) { /** INTERNAL: sets the name (locale) of the resource bundle to given name */ static void setEntryName(UResourceDataEntry *res, const char *name, UErrorCode *status) { - int32_t len = (int32_t)uprv_strlen(name); + int32_t len = static_cast<int32_t>(uprv_strlen(name)); if(res->fName != nullptr && res->fName != res->fNameBuffer) { uprv_free(res->fName); } - if (len < (int32_t)sizeof(res->fNameBuffer)) { + if (len < static_cast<int32_t>(sizeof(res->fNameBuffer))) { res->fName = res->fNameBuffer; } else { - res->fName = (char *)uprv_malloc(len+1); + res->fName = static_cast<char*>(uprv_malloc(len + 1)); } if(res->fName == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -534,18 +534,18 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE name = localeID; } - find.fName = (char *)name; - find.fPath = (char *)path; + find.fName = const_cast<char*>(name); + find.fPath = const_cast<char*>(path); /* calculate the hash value of the entry */ /*hashkey.pointer = (void *)&find;*/ /*hashValue = hashEntry(hashkey);*/ /* check to see if we already have this entry */ - r = (UResourceDataEntry *)uhash_get(cache, &find); + r = static_cast<UResourceDataEntry*>(uhash_get(cache, &find)); if(r == nullptr) { /* if the entry is not yet in the hash table, we'll try to construct a new one */ - r = (UResourceDataEntry *) uprv_malloc(sizeof(UResourceDataEntry)); + r = static_cast<UResourceDataEntry*>(uprv_malloc(sizeof(UResourceDataEntry))); if(r == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -561,7 +561,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE } if(path != nullptr) { - r->fPath = (char *)uprv_strdup(path); + r->fPath = uprv_strdup(path); if(r->fPath == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; uprv_free(r); @@ -588,7 +588,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE if (U_SUCCESS(*status)) { const int32_t *poolIndexes = r->fPool->fData.pRoot + 1; if(r->fData.pRoot[1 + URES_INDEX_POOL_CHECKSUM] == poolIndexes[URES_INDEX_POOL_CHECKSUM]) { - r->fData.poolBundleKeys = (const char *)(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff)); + r->fData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + (poolIndexes[URES_INDEX_LENGTH] & 0xff)); r->fData.poolBundleStrings = r->fPool->fData.p16BitUnits; } else { r->fBogus = *status = U_INVALID_FORMAT_ERROR; @@ -614,7 +614,7 @@ static UResourceDataEntry *init_entry(const char *localeID, const char *path, UE { UResourceDataEntry *oldR = nullptr; - if((oldR = (UResourceDataEntry *)uhash_get(cache, r)) == nullptr) { /* if the data is not cached */ + if ((oldR = static_cast<UResourceDataEntry*>(uhash_get(cache, r))) == nullptr) { /* if the data is not cached */ /* just insert it in the cache */ UErrorCode cacheStatus = U_ZERO_ERROR; uhash_put(cache, (void *)r, r, &cacheStatus); @@ -675,8 +675,8 @@ findFirstExisting(const char* path, char* name, const char* defaultLocale, UResO if (U_FAILURE(*status)) { return nullptr; } - *isDefault = (UBool)(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0); - hasRealData = (UBool)(r->fBogus == U_ZERO_ERROR); + *isDefault = static_cast<UBool>(uprv_strncmp(name, defaultLocale, uprv_strlen(name)) == 0); + hasRealData = static_cast<UBool>(r->fBogus == U_ZERO_ERROR); if(!hasRealData) { /* this entry is not real. We will discard it. */ /* However, the parent line for this entry is */ @@ -691,7 +691,7 @@ findFirstExisting(const char* path, char* name, const char* defaultLocale, UResO uprv_strcpy(name, r->fName); /* this is needed for supporting aliases */ } - *isRoot = (UBool)(uprv_strcmp(name, kRootLocaleName) == 0); + *isRoot = static_cast<UBool>(uprv_strcmp(name, kRootLocaleName) == 0); /*Fallback data stuff*/ if (!hasRealData) { @@ -1090,7 +1090,7 @@ static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t resB->fResPathLen += lenToAdd; if(RES_BUFSIZE <= resB->fResPathLen+1) { if(resB->fResPath == resB->fResBuf) { - resB->fResPath = (char *)uprv_malloc((resB->fResPathLen+1)*sizeof(char)); + resB->fResPath = static_cast<char*>(uprv_malloc((resB->fResPathLen + 1) * sizeof(char))); /* Check that memory was allocated correctly. */ if (resB->fResPath == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -1098,7 +1098,7 @@ static void ures_appendResPath(UResourceBundle *resB, const char* toAdd, int32_t } uprv_strcpy(resB->fResPath, resB->fResBuf); } else { - char *temp = (char *)uprv_realloc(resB->fResPath, (resB->fResPathLen+1)*sizeof(char)); + char* temp = static_cast<char*>(uprv_realloc(resB->fResPath, (resB->fResPathLen + 1) * sizeof(char))); /* Check that memory was reallocated correctly. */ if (temp == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -1347,7 +1347,7 @@ UResourceBundle *getAliasTargetAsResourceBundle( // if the key path wasn't just a single resource ID, clear out // the bundle's key path and re-set it to be equal to keyPath. ures_freeResPath(resB); - ures_appendResPath(resB, keyPath, (int32_t)uprv_strlen(keyPath), status); + ures_appendResPath(resB, keyPath, static_cast<int32_t>(uprv_strlen(keyPath)), status); if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status); } @@ -1406,7 +1406,7 @@ UResourceBundle *init_resb_result( validLocaleDataEntry, containerResPath, recursionDepth, resB, status); } if(resB == nullptr) { - resB = (UResourceBundle *)uprv_malloc(sizeof(UResourceBundle)); + resB = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle))); if (resB == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -1448,7 +1448,7 @@ UResourceBundle *init_resb_result( resB, containerResPath, static_cast<int32_t>(uprv_strlen(containerResPath)), status); } if(key != nullptr) { - ures_appendResPath(resB, key, (int32_t)uprv_strlen(key), status); + ures_appendResPath(resB, key, static_cast<int32_t>(uprv_strlen(key)), status); if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status); } @@ -1493,7 +1493,7 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin if(original != nullptr) { if(r == nullptr) { isStackObject = false; - r = (UResourceBundle *)uprv_malloc(sizeof(UResourceBundle)); + r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle))); /* test for nullptr */ if (r == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -1708,7 +1708,7 @@ U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) { static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) { if(RES_GET_TYPE(r) == URES_ALIAS) { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByIndex(resB, sIndex, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -1729,7 +1729,7 @@ U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) { if(resB == nullptr) { return false; } - return (UBool)(resB->fIndex < resB->fSize-1); + return resB->fIndex < resB->fSize-1; } U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* len, const char ** key, UErrorCode *status) { @@ -2063,7 +2063,7 @@ static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource tab path.append(key, errorCode); if (U_FAILURE(errorCode)) { return RES_BOGUS; } char *pathPart = path.data(); /* Path from current resource to desired resource */ - UResType type = (UResType)RES_GET_TYPE(resource); /* the current resource type */ + UResType type = static_cast<UResType>(RES_GET_TYPE(resource)); /* the current resource type */ while (*pathPart && resource != RES_BOGUS && URES_IS_CONTAINER(type)) { char *nextPathPart = uprv_strchr(pathPart, RES_PATH_SEPARATOR); if (nextPathPart != nullptr) { @@ -2075,7 +2075,7 @@ static Resource getTableItemByKeyPath(const ResourceData *pResData, Resource tab int32_t t; const char *pathP = pathPart; resource = res_getTableItemByKey(pResData, resource, &t, &pathP); - type = (UResType)RES_GET_TYPE(resource); + type = static_cast<UResType>(RES_GET_TYPE(resource)); pathPart = nextPathPart; } if (*pathPart) { @@ -2573,7 +2573,7 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB return res_getString({resB, key}, &dataEntry->fData, res, len); case URES_ALIAS: { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -2595,7 +2595,7 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB return res_getString({resB, key}, &resB->getResData(), res, len); case URES_ALIAS: { - const char16_t* result = 0; + const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByKey(resB, inKey, nullptr, status); result = ures_getString(tempRes, len, status); ures_close(tempRes); @@ -2716,12 +2716,11 @@ ures_openWithType(UResourceBundle *r, const char* path, const char* localeID, UResourceDataEntry *entry; if(openType != URES_OPEN_DIRECT) { - /* first "canonicalize" the locale ID */ - CharString canonLocaleID; - { - CharStringByteSink sink(&canonLocaleID); - ulocimp_getBaseName(localeID, sink, status); + if (localeID == nullptr) { + localeID = uloc_getDefault(); } + /* first "canonicalize" the locale ID */ + CharString canonLocaleID = ulocimp_getBaseName(localeID, *status); if(U_FAILURE(*status)) { *status = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; @@ -2740,7 +2739,7 @@ ures_openWithType(UResourceBundle *r, const char* path, const char* localeID, UBool isStackObject; if(r == nullptr) { - r = (UResourceBundle *)uprv_malloc(sizeof(UResourceBundle)); + r = static_cast<UResourceBundle*>(uprv_malloc(sizeof(UResourceBundle))); if(r == nullptr) { entryClose(entry); *status = U_MEMORY_ALLOCATION_ERROR; @@ -2927,7 +2926,7 @@ typedef struct ULocalesContext { static void U_CALLCONV ures_loc_closeLocales(UEnumeration *enumerator) { - ULocalesContext *ctx = (ULocalesContext *)enumerator->context; + ULocalesContext* ctx = static_cast<ULocalesContext*>(enumerator->context); ures_close(&ctx->curr); ures_close(&ctx->installed); uprv_free(ctx); @@ -2936,7 +2935,7 @@ ures_loc_closeLocales(UEnumeration *enumerator) { static int32_t U_CALLCONV ures_loc_countLocales(UEnumeration *en, UErrorCode * /*status*/) { - ULocalesContext *ctx = (ULocalesContext *)en->context; + ULocalesContext* ctx = static_cast<ULocalesContext*>(en->context); return ures_getSize(&ctx->installed); } @@ -2952,7 +2951,7 @@ ures_loc_nextLocale(UEnumeration* en, UResourceBundle *k = nullptr; const char *result = nullptr; int32_t len = 0; - if(ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status)) != 0) { + if (ures_hasNext(res) && (k = ures_getNextResource(res, &ctx->curr, status)) != nullptr) { result = ures_getKey(k); len = (int32_t)uprv_strlen(result); } @@ -3040,25 +3039,25 @@ static UBool isLocaleInList(UEnumeration *locEnum, const char *locToSearch, UErr static void getParentForFunctionalEquivalent(const char* localeID, UResourceBundle* res, UResourceBundle* bund1, - char* parent, - int32_t parentCapacity) { + CharString& parent) { // Get parent. // First check for a parent from %%Parent resource (Note that in resource trees // such as collation, data may have different parents than in parentLocales). UErrorCode subStatus = U_ZERO_ERROR; - parent[0] = '\0'; - if (res != NULL) { + parent.clear(); + if (res != nullptr) { ures_getByKey(res, "%%Parent", bund1, &subStatus); if (U_SUCCESS(subStatus)) { - int32_t parentLen = parentCapacity; - ures_getUTF8String(bund1, parent, &parentLen, true, &subStatus); + int32_t length16; + const char16_t* s16 = ures_getString(bund1, &length16, &subStatus); + parent.appendInvariantChars(s16, length16, subStatus); } } // If none there, use normal truncation parent - if (U_FAILURE(subStatus) || parent[0] == 0) { + if (U_FAILURE(subStatus) || parent.isEmpty()) { subStatus = U_ZERO_ERROR; - uloc_getParent(localeID, parent, parentCapacity, &subStatus); + parent = ulocimp_getParent(localeID, subStatus); } } @@ -3067,29 +3066,27 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, const char *path, const char *resName, const char *keyword, const char *locid, UBool *isAvailable, UBool omitDefault, UErrorCode *status) { - char defVal[1024] = ""; /* default value for given locale */ - char defLoc[1024] = ""; /* default value for given locale */ - CharString base; /* base locale */ - char found[1024] = ""; - char parent[1024] = ""; - char full[1024] = ""; + CharString defVal; /* default value for given locale */ + CharString defLoc; /* default value for given locale */ + CharString found; + CharString parent; + CharString full; UResourceBundle bund1, bund2; UResourceBundle *res = nullptr; UErrorCode subStatus = U_ZERO_ERROR; int32_t length = 0; if(U_FAILURE(*status)) return 0; CharString kwVal; - { - CharStringByteSink sink(&kwVal); - ulocimp_getKeywordValue(locid, keyword, sink, &subStatus); - } - if(kwVal == DEFAULT_TAG) { - kwVal.clear(); + if (keyword != nullptr && *keyword != '\0') { + kwVal = ulocimp_getKeywordValue(locid, keyword, subStatus); + if (kwVal == DEFAULT_TAG) { + kwVal.clear(); + } } - { - CharStringByteSink sink(&base); - ulocimp_getBaseName(locid, sink, &subStatus); + if (locid == nullptr) { + locid = uloc_getDefault(); } + CharString base = ulocimp_getBaseName(locid, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "getFunctionalEquivalent: \"%s\" [%s=%s] in %s - %s\n", locid, keyword, kwVal.data(), base.data(), u_errorName(subStatus)); @@ -3097,14 +3094,14 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, ures_initStackObject(&bund1); ures_initStackObject(&bund2); - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); if(isAvailable) { UEnumeration *locEnum = ures_openAvailableLocales(path, &subStatus); *isAvailable = true; if (U_SUCCESS(subStatus)) { - *isAvailable = isLocaleInList(locEnum, parent, &subStatus); + *isAvailable = isLocaleInList(locEnum, parent.data(), &subStatus); } uenum_close(locEnum); } @@ -3116,7 +3113,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, do { subStatus = U_ZERO_ERROR; - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if(((subStatus == U_USING_FALLBACK_WARNING) || (subStatus == U_USING_DEFAULT_WARNING)) && isAvailable) { @@ -3125,7 +3122,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, isAvailable = nullptr; /* only want to set this the first time around */ #if defined(URES_TREE_DEBUG) - fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent, u_errorName(subStatus), ures_getLocale(res, &subStatus)); + fprintf(stderr, "%s;%s -> %s [%s]\n", path?path:"ICUDATA", parent.data(), u_errorName(subStatus), ures_getLocale(res, &subStatus)); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3137,21 +3134,21 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s : loaded default -> %s\n", - path?path:"ICUDATA", parent, u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus)); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default %s=%s, %s\n", - path?path:"ICUDATA", parent, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, parent); + defLoc.copyFrom(parent, subStatus); if(kwVal.isEmpty()) { - kwVal.append(defVal, defLen, subStatus); + kwVal.append(defVal, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> kwVal = %s\n", - path?path:"ICUDATA", parent, keyword, kwVal.data()); + path?path:"ICUDATA", parent.data(), keyword, kwVal.data()); #endif } } @@ -3161,23 +3158,23 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, subStatus = U_ZERO_ERROR; if (res != nullptr) { - uprv_strcpy(found, ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus)); + found.clear().append(ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus), subStatus); } - if (uprv_strcmp(found, parent) != 0) { - uprv_strcpy(parent, found); + if (found != parent) { + parent.copyFrom(found, subStatus); } else { - getParentForFunctionalEquivalent(found,res,&bund1,parent,sizeof(parent)); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); } ures_close(res); - } while(!defVal[0] && *found && uprv_strcmp(found, "root") != 0 && U_SUCCESS(*status)); + } while(defVal.isEmpty() && !found.isEmpty() && found != "root" && U_SUCCESS(*status)); /* Now, see if we can find the kwVal collator.. start the search over.. */ - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); do { - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { *isAvailable = false; } @@ -3185,7 +3182,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> %s (looking for %s)\n", - path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal.data()); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data()); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3202,86 +3199,85 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, if(subStatus == U_ZERO_ERROR) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> full0 %s=%s, %s\n", - path?path:"ICUDATA", parent, keyword, kwVal.data(), u_errorName(subStatus)); + path?path:"ICUDATA", parent.data(), keyword, kwVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(full, parent); - if(*full == 0) { - uprv_strcpy(full, "root"); + if (parent.isEmpty()) { + full.clear().append("root", subStatus); + } else { + full.copyFrom(parent, subStatus); } /* now, recalculate default kw if need be */ - if(uprv_strlen(defLoc) > uprv_strlen(full)) { + if(defLoc.length() > full.length()) { const char16_t *defUstr; int32_t defLen; /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> recalculating Default0\n", - path?path:"ICUDATA", full); + path?path:"ICUDATA", full.data()); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default0 %s=%s, %s\n", - path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, full); + defLoc.copyFrom(full, subStatus); } } /* end of recalculate default KW */ #if defined(URES_TREE_DEBUG) else { - fprintf(stderr, "No trim0, %s <= %s\n", defLoc, full); + fprintf(stderr, "No trim0, %s <= %s\n", defLoc.data(), full.data()); } #endif } else { #if defined(URES_TREE_DEBUG) fprintf(stderr, "err=%s in %s looking for %s\n", - u_errorName(subStatus), parent, kwVal.data()); + u_errorName(subStatus), parent.data(), kwVal.data()); #endif } } } + subStatus = U_ZERO_ERROR; UBool haveFound = false; // At least for collations which may be aliased, we need to use the VALID locale // as the parent instead of just truncating, as long as the VALID locale is not // root and has a different language than the parent. Use of the VALID locale // here is similar to the procedure used at the end of the previous do-while loop // for all resource types. - if (res != NULL && uprv_strcmp(resName, "collations") == 0) { - subStatus = U_ZERO_ERROR; + if (res != nullptr && uprv_strcmp(resName, "collations") == 0) { const char *validLoc = ures_getLocaleByType(res, ULOC_VALID_LOCALE, &subStatus); - if (U_SUCCESS(subStatus) && validLoc != NULL && validLoc[0] != 0 && uprv_strcmp(validLoc, "root") != 0) { - char validLang[ULOC_LANG_CAPACITY]; - char parentLang[ULOC_LANG_CAPACITY]; - uloc_getLanguage(validLoc, validLang, ULOC_LANG_CAPACITY, &subStatus); - uloc_getLanguage(parent, parentLang, ULOC_LANG_CAPACITY, &subStatus); - if (U_SUCCESS(subStatus) && uprv_strcmp(validLang, parentLang) != 0) { + if (U_SUCCESS(subStatus) && validLoc != nullptr && validLoc[0] != 0 && uprv_strcmp(validLoc, "root") != 0) { + CharString validLang = ulocimp_getLanguage(validLoc, subStatus); + CharString parentLang = ulocimp_getLanguage(parent.toStringPiece(), subStatus); + if (U_SUCCESS(subStatus) && validLang != parentLang) { // validLoc is not root and has a different language than parent, use it instead - uprv_strcpy(found, validLoc); + found.clear().append(validLoc, subStatus); haveFound = true; } } subStatus = U_ZERO_ERROR; } if (!haveFound) { - uprv_strcpy(found, parent); + found.copyFrom(parent, subStatus); } - getParentForFunctionalEquivalent(found,res,&bund1,parent,1023); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); ures_close(res); subStatus = U_ZERO_ERROR; - } while(!full[0] && *found && U_SUCCESS(*status)); + } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status)); - if((full[0]==0) && kwVal != defVal) { + if(full.isEmpty() && kwVal != defVal) { #if defined(URES_TREE_DEBUG) - fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal.data(), defVal); + fprintf(stderr, "Failed to locate kw %s - try default %s\n", kwVal.data(), defVal.data()); #endif kwVal.clear().append(defVal, subStatus); - base.extract(parent, UPRV_LENGTHOF(parent), subStatus); - base.extract(found, UPRV_LENGTHOF(found), subStatus); + parent.copyFrom(base, subStatus); + found.copyFrom(base, subStatus); do { /* search for 'default' named item */ - res = ures_open(path, parent, &subStatus); + res = ures_open(path, parent.data(), &subStatus); if((subStatus == U_USING_FALLBACK_WARNING) && isAvailable) { *isAvailable = false; } @@ -3289,7 +3285,7 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> %s (looking for default %s)\n", - path?path:"ICUDATA", parent, u_errorName(subStatus), kwVal.data()); + path?path:"ICUDATA", parent.data(), u_errorName(subStatus), kwVal.data()); #endif if(U_FAILURE(subStatus)) { *status = subStatus; @@ -3300,59 +3296,61 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, if(subStatus == U_ZERO_ERROR) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> full1 %s=%s, %s\n", path?path:"ICUDATA", - parent, keyword, kwVal.data(), u_errorName(subStatus)); + parent.data(), keyword, kwVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(full, parent); - if(*full == 0) { - uprv_strcpy(full, "root"); + if (parent.isEmpty()) { + full.clear().append("root", subStatus); + } else { + full.copyFrom(parent, subStatus); } /* now, recalculate default kw if need be */ - if(uprv_strlen(defLoc) > uprv_strlen(full)) { + if(defLoc.length() > full.length()) { const char16_t *defUstr; int32_t defLen; /* look for default item */ #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> recalculating Default1\n", - path?path:"ICUDATA", full); + path?path:"ICUDATA", full.data()); #endif defUstr = ures_getStringByKey(&bund1, DEFAULT_TAG, &defLen, &subStatus); if(U_SUCCESS(subStatus) && defLen) { - u_UCharsToChars(defUstr, defVal, u_strlen(defUstr)); + defVal.clear().appendInvariantChars(defUstr, defLen, subStatus); #if defined(URES_TREE_DEBUG) fprintf(stderr, "%s;%s -> default %s=%s, %s\n", - path?path:"ICUDATA", full, keyword, defVal, u_errorName(subStatus)); + path?path:"ICUDATA", full.data(), keyword, defVal.data(), u_errorName(subStatus)); #endif - uprv_strcpy(defLoc, full); + defLoc.copyFrom(full, subStatus); } } /* end of recalculate default KW */ #if defined(URES_TREE_DEBUG) else { - fprintf(stderr, "No trim1, %s <= %s\n", defLoc, full); + fprintf(stderr, "No trim1, %s <= %s\n", defLoc.data(), full.data()); } #endif } } } - uprv_strcpy(found, parent); - getParentForFunctionalEquivalent(found,res,&bund1,parent,1023); + subStatus = U_ZERO_ERROR; + found.copyFrom(parent, subStatus); + getParentForFunctionalEquivalent(found.data(),res,&bund1,parent); ures_close(res); subStatus = U_ZERO_ERROR; - } while(!full[0] && *found && U_SUCCESS(*status)); + } while(full.isEmpty() && !found.isEmpty() && U_SUCCESS(*status)); } if(U_SUCCESS(*status)) { - if(!full[0]) { + if(full.isEmpty()) { #if defined(URES_TREE_DEBUG) fprintf(stderr, "Still could not load keyword %s=%s\n", keyword, kwVal.data()); #endif *status = U_MISSING_RESOURCE_ERROR; } else if(omitDefault) { #if defined(URES_TREE_DEBUG) - fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full, defLoc, found); + fprintf(stderr,"Trim? full=%s, defLoc=%s, found=%s\n", full.data(), defLoc.data(), found.data()); #endif - if(uprv_strlen(defLoc) <= uprv_strlen(full)) { + if(defLoc.length() <= full.length()) { /* found the keyword in a *child* of where the default tag was present. */ if(kwVal == defVal) { /* if the requested kw is default, */ /* and the default is in or in an ancestor of the current locale */ @@ -3363,17 +3361,19 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, } } } - uprv_strcpy(found, full); + found.copyFrom(full, subStatus); if(!kwVal.isEmpty()) { - uprv_strcat(found, "@"); - uprv_strcat(found, keyword); - uprv_strcat(found, "="); - uprv_strcat(found, kwVal.data()); + found + .append("@", subStatus) + .append(keyword, subStatus) + .append("=", subStatus) + .append(kwVal, subStatus); } else if(!omitDefault) { - uprv_strcat(found, "@"); - uprv_strcat(found, keyword); - uprv_strcat(found, "="); - uprv_strcat(found, defVal); + found + .append("@", subStatus) + .append(keyword, subStatus) + .append("=", subStatus) + .append(defVal, subStatus); } } /* we found the default locale - no need to repeat it.*/ @@ -3381,12 +3381,12 @@ ures_getFunctionalEquivalent(char *result, int32_t resultCapacity, ures_close(&bund1); ures_close(&bund2); - length = (int32_t)uprv_strlen(found); + length = found.length(); if(U_SUCCESS(*status)) { int32_t copyLength = uprv_min(length, resultCapacity); if(copyLength>0) { - uprv_strncpy(result, found, copyLength); + found.extract(result, copyLength, subStatus); } if(length == 0) { *status = U_MISSING_RESOURCE_ERROR; @@ -3429,8 +3429,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) valuesBuf[0]=0; valuesBuf[1]=0; - - while((locale = uenum_next(locs, &locLen, status)) != 0) { + + while ((locale = uenum_next(locs, &locLen, status)) != nullptr) { UResourceBundle *bund = nullptr; UResourceBundle *subPtr = nullptr; UErrorCode subStatus = U_ZERO_ERROR; /* don't fail if a bundle is unopenable */ @@ -3454,8 +3454,8 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) bund = nullptr; continue; } - - while((subPtr = ures_getNextResource(&item,&subItem,&subStatus)) != 0 + + while ((subPtr = ures_getNextResource(&item, &subItem, &subStatus)) != nullptr && U_SUCCESS(subStatus)) { const char *k; int32_t i; diff --git a/deps/icu-small/source/common/uresdata.cpp b/deps/icu-small/source/common/uresdata.cpp index b219e40e218539..11faddf1ade990 100644 --- a/deps/icu-small/source/common/uresdata.cpp +++ b/deps/icu-small/source/common/uresdata.cpp @@ -140,7 +140,7 @@ isAcceptable(void *context, const char * /*type*/, const char * /*name*/, const UDataInfo *pInfo) { uprv_memcpy(context, pInfo->formatVersion, 4); - return (UBool)( + return pInfo->size>=20 && pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY && @@ -149,7 +149,7 @@ isAcceptable(void *context, pInfo->dataFormat[1]==0x65 && pInfo->dataFormat[2]==0x73 && pInfo->dataFormat[3]==0x42 && - (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3)); + (1<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=3); } /* semi-public functions ---------------------------------------------------- */ @@ -161,8 +161,8 @@ res_init(ResourceData *pResData, UResType rootType; /* get the root resource */ - pResData->pRoot=(const int32_t *)inBytes; - pResData->rootRes=(Resource)*pResData->pRoot; + pResData->pRoot = static_cast<const int32_t*>(inBytes); + pResData->rootRes = static_cast<Resource>(*pResData->pRoot); pResData->p16BitUnits=&gEmpty16; /* formatVersion 1.1 must have a root item and at least 5 indexes */ @@ -173,7 +173,7 @@ res_init(ResourceData *pResData, } /* currently, we accept only resources that have a Table as their roots */ - rootType=(UResType)RES_GET_TYPE(pResData->rootRes); + rootType = static_cast<UResType>(RES_GET_TYPE(pResData->rootRes)); if(!URES_IS_TABLE(rootType)) { *errorCode=U_INVALID_FORMAT_ERROR; res_unload(pResData); @@ -207,15 +207,15 @@ res_init(ResourceData *pResData, // In version 2, bits 31..8 were reserved and always 0. // In version 3, they contain bits 23..0 of the poolStringIndexLimit. // Bits 27..24 are in indexes[URES_INDEX_ATTRIBUTES] bits 15..12. - pResData->poolStringIndexLimit=(int32_t)((uint32_t)indexes[URES_INDEX_LENGTH]>>8); + pResData->poolStringIndexLimit = static_cast<int32_t>(static_cast<uint32_t>(indexes[URES_INDEX_LENGTH]) >> 8); } if(indexLength>URES_INDEX_ATTRIBUTES) { int32_t att=indexes[URES_INDEX_ATTRIBUTES]; - pResData->noFallback=(UBool)(att&URES_ATT_NO_FALLBACK); - pResData->isPoolBundle=(UBool)((att&URES_ATT_IS_POOL_BUNDLE)!=0); - pResData->usesPoolBundle=(UBool)((att&URES_ATT_USES_POOL_BUNDLE)!=0); + pResData->noFallback = static_cast<UBool>(att & URES_ATT_NO_FALLBACK); + pResData->isPoolBundle = static_cast<UBool>((att & URES_ATT_IS_POOL_BUNDLE) != 0); + pResData->usesPoolBundle = static_cast<UBool>((att & URES_ATT_USES_POOL_BUNDLE) != 0); pResData->poolStringIndexLimit|=(att&0xf000)<<12; // bits 15..12 -> 27..24 - pResData->poolStringIndex16Limit=(int32_t)((uint32_t)att>>16); + pResData->poolStringIndex16Limit = static_cast<int32_t>(static_cast<uint32_t>(att) >> 16); } if((pResData->isPoolBundle || pResData->usesPoolBundle) && indexLength<=URES_INDEX_POOL_CHECKSUM) { *errorCode=U_INVALID_FORMAT_ERROR; @@ -225,7 +225,7 @@ res_init(ResourceData *pResData, if( indexLength>URES_INDEX_16BIT_TOP && indexes[URES_INDEX_16BIT_TOP]>indexes[URES_INDEX_KEYS_TOP] ) { - pResData->p16BitUnits=(const uint16_t *)(pResData->pRoot+indexes[URES_INDEX_KEYS_TOP]); + pResData->p16BitUnits = reinterpret_cast<const uint16_t*>(pResData->pRoot + indexes[URES_INDEX_KEYS_TOP]); } } @@ -361,14 +361,14 @@ UBool isNoInheritanceMarker(const ResourceData *pResData, Resource res) { } else if (res == offset) { const int32_t *p32=pResData->pRoot+res; int32_t length=*p32; - const char16_t *p=(const char16_t *)p32; + const char16_t* p = reinterpret_cast<const char16_t*>(p32); return length == 3 && p[2] == 0x2205 && p[3] == 0x2205 && p[4] == 0x2205; } else if (RES_GET_TYPE(res) == URES_STRING_V2) { const char16_t *p; - if((int32_t)offset<pResData->poolStringIndexLimit) { - p=(const char16_t *)pResData->poolBundleStrings+offset; + if (static_cast<int32_t>(offset) < pResData->poolStringIndexLimit) { + p = reinterpret_cast<const char16_t*>(pResData->poolBundleStrings) + offset; } else { - p=(const char16_t *)pResData->p16BitUnits+(offset-pResData->poolStringIndexLimit); + p = reinterpret_cast<const char16_t*>(pResData->p16BitUnits) + (offset - pResData->poolStringIndexLimit); } int32_t first=*p; if (first == 0x2205) { // implicit length @@ -571,7 +571,7 @@ const uint8_t *ResourceDataValue::getBinary(int32_t &length, UErrorCode &errorCo ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { if(U_FAILURE(errorCode)) { - return ResourceArray(); + return {}; } const uint16_t *items16 = nullptr; const Resource *items32 = nullptr; @@ -580,7 +580,7 @@ ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { switch(RES_GET_TYPE(res)) { case URES_ARRAY: if (offset!=0) { // empty if offset==0 - items32 = (const Resource *)getData().pRoot+offset; + items32 = reinterpret_cast<const Resource*>(getData().pRoot) + offset; length = *items32++; } break; @@ -590,14 +590,14 @@ ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { break; default: errorCode = U_RESOURCE_TYPE_MISMATCH; - return ResourceArray(); + return {}; } return ResourceArray(items16, items32, length, fTraceInfo); } ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { if(U_FAILURE(errorCode)) { - return ResourceTable(); + return {}; } const uint16_t *keys16 = nullptr; const int32_t *keys32 = nullptr; @@ -608,9 +608,9 @@ ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { switch(RES_GET_TYPE(res)) { case URES_TABLE: if (offset != 0) { // empty if offset==0 - keys16 = (const uint16_t *)(getData().pRoot+offset); + keys16 = reinterpret_cast<const uint16_t*>(getData().pRoot + offset); length = *keys16++; - items32 = (const Resource *)(keys16+length+(~length&1)); + items32 = reinterpret_cast<const Resource*>(keys16 + length + (~length & 1)); } break; case URES_TABLE16: @@ -622,12 +622,12 @@ ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { if (offset != 0) { // empty if offset==0 keys32 = getData().pRoot+offset; length = *keys32++; - items32 = (const Resource *)keys32 + length; + items32 = reinterpret_cast<const Resource*>(keys32) + length; } break; default: errorCode = U_RESOURCE_TYPE_MISMATCH; - return ResourceTable(); + return {}; } return ResourceTable(keys16, keys32, items16, items32, length, fTraceInfo); } @@ -1019,9 +1019,9 @@ typedef struct Row { static int32_t U_CALLCONV ures_compareRows(const void *context, const void *left, const void *right) { - const char *keyChars=(const char *)context; - return (int32_t)uprv_strcmp(keyChars+((const Row *)left)->keyIndex, - keyChars+((const Row *)right)->keyIndex); + const char* keyChars = static_cast<const char*>(context); + return static_cast<int32_t>(uprv_strcmp(keyChars + static_cast<const Row*>(left)->keyIndex, + keyChars + static_cast<const Row*>(right)->keyIndex)); } typedef struct TempTable { @@ -1040,13 +1040,10 @@ enum { /* The table item key string is not locally available. */ static const char *const gUnknownKey=""; -/* resource table key for collation binaries: "%%CollationBin" */ -static const char16_t gCollationBinKey[]={ - 0x25, 0x25, - 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x69, 0x6e, - 0 -}; +#if !UCONFIG_NO_COLLATION +// resource table key for collation binaries +static const char16_t gCollationBinKey[]=u"%%CollationBin"; +#endif /* * swap one resource item @@ -1074,17 +1071,17 @@ ures_swapResource(const UDataSwapper *ds, } /* all other types use an offset to point to their data */ - offset=(int32_t)RES_GET_OFFSET(res); + offset = static_cast<int32_t>(RES_GET_OFFSET(res)); if(offset==0) { /* special offset indicating an empty item */ return; } - if(pTempTable->resFlags[offset>>5]&((uint32_t)1<<(offset&0x1f))) { + if (pTempTable->resFlags[offset >> 5] & (static_cast<uint32_t>(1) << (offset & 0x1f))) { /* we already swapped this resource item */ return; } else { /* mark it as swapped now */ - pTempTable->resFlags[offset>>5]|=((uint32_t)1<<(offset&0x1f)); + pTempTable->resFlags[offset >> 5] |= static_cast<uint32_t>(1) << (offset & 0x1f); } p=inBundle+offset; @@ -1095,14 +1092,14 @@ ures_swapResource(const UDataSwapper *ds, /* physically same value layout as string, fall through */ U_FALLTHROUGH; case URES_STRING: - count=udata_readInt32(ds, (int32_t)*p); + count = udata_readInt32(ds, static_cast<int32_t>(*p)); /* swap length */ ds->swapArray32(ds, p, 4, q, pErrorCode); /* swap each char16_t (the terminating NUL would not change) */ ds->swapArray16(ds, p+1, 2*count, q+1, pErrorCode); break; case URES_BINARY: - count=udata_readInt32(ds, (int32_t)*p); + count = udata_readInt32(ds, static_cast<int32_t>(*p)); /* swap length */ ds->swapArray32(ds, p, 4, q, pErrorCode); /* no need to swap or copy bytes - ures_swap() copied them all */ @@ -1135,8 +1132,8 @@ ures_swapResource(const UDataSwapper *ds, if(RES_GET_TYPE(res)==URES_TABLE) { /* get table item count */ - pKey16=(const uint16_t *)p; - qKey16=(uint16_t *)q; + pKey16 = reinterpret_cast<const uint16_t*>(p); + qKey16 = reinterpret_cast<uint16_t*>(q); count=ds->readUInt16(*pKey16); pKey32=qKey32=nullptr; @@ -1147,8 +1144,8 @@ ures_swapResource(const UDataSwapper *ds, offset+=((1+count)+1)/2; } else { /* get table item count */ - pKey32=(const int32_t *)p; - qKey32=(int32_t *)q; + pKey32 = reinterpret_cast<const int32_t*>(p); + qKey32 = reinterpret_cast<int32_t*>(q); count=udata_readInt32(ds, *pKey32); pKey16=qKey16=nullptr; @@ -1172,12 +1169,12 @@ ures_swapResource(const UDataSwapper *ds, if(pKey16!=nullptr) { int32_t keyOffset=ds->readUInt16(pKey16[i]); if(keyOffset<pTempTable->localKeyLimit) { - itemKey=(const char *)outBundle+keyOffset; + itemKey = reinterpret_cast<const char*>(outBundle) + keyOffset; } } else { int32_t keyOffset=udata_readInt32(ds, pKey32[i]); if(keyOffset>=0) { - itemKey=(const char *)outBundle+keyOffset; + itemKey = reinterpret_cast<const char*>(outBundle) + keyOffset; } } item=ds->readUInt32(p[i]); @@ -1243,7 +1240,7 @@ ures_swapResource(const UDataSwapper *ds, if(pKey16!=qKey16) { rKey16=qKey16; } else { - rKey16=(uint16_t *)pTempTable->resort; + rKey16 = reinterpret_cast<uint16_t*>(pTempTable->resort); } for(i=0; i<count; ++i) { oldIndex=pTempTable->rows[i].sortIndex; @@ -1277,7 +1274,7 @@ ures_swapResource(const UDataSwapper *ds, if(p!=q) { r=q; } else { - r=(Resource *)pTempTable->resort; + r = reinterpret_cast<Resource*>(pTempTable->resort); } for(i=0; i<count; ++i) { oldIndex=pTempTable->rows[i].sortIndex; @@ -1294,7 +1291,7 @@ ures_swapResource(const UDataSwapper *ds, Resource item; int32_t i; - count=udata_readInt32(ds, (int32_t)*p); + count = udata_readInt32(ds, static_cast<int32_t>(*p)); /* swap length */ ds->swapArray32(ds, p++, 4, q++, pErrorCode); @@ -1314,7 +1311,7 @@ ures_swapResource(const UDataSwapper *ds, } break; case URES_INT_VECTOR: - count=udata_readInt32(ds, (int32_t)*p); + count = udata_readInt32(ds, static_cast<int32_t>(*p)); /* swap length and each integer */ ds->swapArray32(ds, p, 4*(1+count), q, pErrorCode); break; @@ -1457,6 +1454,9 @@ ures_swap(const UDataSwapper *ds, outBundle+keysBottom, pErrorCode); if(U_FAILURE(*pErrorCode)) { udata_printError(ds, "ures_swap().udata_swapInvStringBlock(keys[%d]) failed\n", 4*(keysTop-keysBottom)); + if(tempTable.resFlags!=stackResFlags) { + uprv_free(tempTable.resFlags); + } return 0; } @@ -1465,6 +1465,9 @@ ures_swap(const UDataSwapper *ds, ds->swapArray16(ds, inBundle+keysTop, (resBottom-keysTop)*4, outBundle+keysTop, pErrorCode); if(U_FAILURE(*pErrorCode)) { udata_printError(ds, "ures_swap().swapArray16(16-bit units[%d]) failed\n", 2*(resBottom-keysTop)); + if(tempTable.resFlags!=stackResFlags) { + uprv_free(tempTable.resFlags); + } return 0; } } diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index 8a1679717e5274..2685b2d2dc92eb 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -120,9 +120,7 @@ class U_COMMON_API StackUResourceBundle { // No heap allocation. Use only on the stack. static void* U_EXPORT2 operator new(size_t) noexcept = delete; static void* U_EXPORT2 operator new[](size_t) noexcept = delete; -#if U_HAVE_PLACEMENT_NEW static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete; -#endif StackUResourceBundle(); ~StackUResourceBundle(); diff --git a/deps/icu-small/source/common/uscript.cpp b/deps/icu-small/source/common/uscript.cpp index 3cc2b6675c9bd0..ce40d354958fdd 100644 --- a/deps/icu-small/source/common/uscript.cpp +++ b/deps/icu-small/source/common/uscript.cpp @@ -18,7 +18,6 @@ #include "unicode/uchar.h" #include "unicode/uscript.h" #include "unicode/uloc.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -57,33 +56,28 @@ setOneCode(UScriptCode script, UScriptCode *scripts, int32_t capacity, UErrorCod static int32_t getCodesFromLocale(const char *locale, UScriptCode *scripts, int32_t capacity, UErrorCode *err) { - UErrorCode internalErrorCode = U_ZERO_ERROR; - char lang[8] = {0}; - char script[8] = {0}; - int32_t scriptLength; - if(U_FAILURE(*err)) { return 0; } + if (U_FAILURE(*err)) { return 0; } + icu::CharString lang; + icu::CharString script; + if (locale == nullptr) { + locale = uloc_getDefault(); + } + ulocimp_getSubtags(locale, &lang, &script, nullptr, nullptr, nullptr, *err); + if (U_FAILURE(*err)) { return 0; } // Multi-script languages, equivalent to the LocaleScript data // that we used to load from locale resource bundles. - /*length = */ uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "ja")) { + if (lang == "ja") { return setCodes(JAPANESE, UPRV_LENGTHOF(JAPANESE), scripts, capacity, err); } - if(0 == uprv_strcmp(lang, "ko")) { + if (lang == "ko") { return setCodes(KOREAN, UPRV_LENGTHOF(KOREAN), scripts, capacity, err); } - scriptLength = uloc_getScript(locale, script, UPRV_LENGTHOF(script), &internalErrorCode); - if(U_FAILURE(internalErrorCode) || internalErrorCode == U_STRING_NOT_TERMINATED_WARNING) { - return 0; - } - if(0 == uprv_strcmp(lang, "zh") && 0 == uprv_strcmp(script, "Hant")) { + if (lang == "zh" && script == "Hant") { return setCodes(HAN_BOPO, UPRV_LENGTHOF(HAN_BOPO), scripts, capacity, err); } // Explicit script code. - if(scriptLength != 0) { - UScriptCode scriptCode = (UScriptCode)u_getPropertyValueEnum(UCHAR_SCRIPT, script); + if (!script.isEmpty()) { + UScriptCode scriptCode = static_cast<UScriptCode>(u_getPropertyValueEnum(UCHAR_SCRIPT, script.data())); if(scriptCode != USCRIPT_INVALID_CODE) { if(scriptCode == USCRIPT_SIMPLIFIED_HAN || scriptCode == USCRIPT_TRADITIONAL_HAN) { scriptCode = USCRIPT_HAN; @@ -140,11 +134,7 @@ uscript_getCode(const char* nameOrAbbrOrLocale, if(U_FAILURE(*err) || length != 0) { return length; } - icu::CharString likely; - { - icu::CharStringByteSink sink(&likely); - ulocimp_addLikelySubtags(nameOrAbbrOrLocale, sink, &internalErrorCode); - } + icu::CharString likely = ulocimp_addLikelySubtags(nameOrAbbrOrLocale, internalErrorCode); if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { length = getCodesFromLocale(likely.data(), fillIn, capacity, err); if(U_FAILURE(*err) || length != 0) { diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index b26164408a42a4..232ce89755cd6b 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -45,11 +45,11 @@ const int32_t SCRIPT_PROPS[] = { // Begin copy-paste output from // tools/trunk/unicode/py/parsescriptmetadata.py 0x0040 | RECOMMENDED, // Zyyy - 0x0308 | RECOMMENDED, // Zinh + 0x030F | RECOMMENDED, // Zinh 0x0628 | RECOMMENDED | RTL, // Arab 0x0531 | RECOMMENDED | CASED, // Armn 0x0995 | RECOMMENDED, // Beng - 0x3105 | RECOMMENDED | LB_LETTERS, // Bopo + 0x3105 | LIMITED_USE | LB_LETTERS, // Bopo 0x13C4 | LIMITED_USE | CASED, // Cher 0x03E2 | EXCLUSION | CASED, // Copt 0x042F | RECOMMENDED | CASED, // Cyrl @@ -223,7 +223,7 @@ const int32_t SCRIPT_PROPS[] = { 0x11A5C | EXCLUSION, // Soyo 0x11A0B | EXCLUSION, // Zanb 0x1180B | EXCLUSION, // Dogr - 0x11D71 | LIMITED_USE, // Gong + 0x11D71 | EXCLUSION, // Gong 0x11EE5 | EXCLUSION, // Maka 0x16E40 | EXCLUSION | CASED, // Medf 0x10D12 | LIMITED_USE | RTL, // Rohg @@ -244,6 +244,18 @@ const int32_t SCRIPT_PROPS[] = { 0x10582 | EXCLUSION | CASED, // Vith 0x11F1B | EXCLUSION | LB_LETTERS, // Kawi 0x1E4E6 | EXCLUSION, // Nagm + 0, + 0x10D5D | EXCLUSION | RTL | CASED, // Gara + 0x1611C | EXCLUSION, // Gukh + 0x16D45 | EXCLUSION, // Krai + 0x1E5D0 | EXCLUSION, // Onao + 0x11BC4 | EXCLUSION, // Sunu + 0x105C2 | EXCLUSION, // Todr + 0x11392 | EXCLUSION, // Tutg + 0x16EA1 | EXCLUSION | CASED, // Berf + 0x10950 | EXCLUSION | RTL, // Sidt + 0x1E6D5 | EXCLUSION | LB_LETTERS, // Tayo + 0x11DC6 | EXCLUSION, // Tols // End copy-paste from parsescriptmetadata.py }; diff --git a/deps/icu-small/source/common/uset.cpp b/deps/icu-small/source/common/uset.cpp index b2d0b91d4b6a46..29b8655ac965a4 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -21,6 +21,7 @@ */ #include "unicode/utypes.h" +#include "unicode/char16ptr.h" #include "unicode/uobject.h" #include "unicode/uset.h" #include "unicode/uniset.h" @@ -306,12 +307,32 @@ uset_getRangeCount(const USet *set) { return ((const UnicodeSet *)set)->UnicodeSet::getRangeCount(); } +U_CAPI int32_t U_EXPORT2 +uset_getStringCount(const USet *uset) { + const UnicodeSet &set = *(const UnicodeSet *)uset; + return USetAccess::getStringCount(set); +} + U_CAPI int32_t U_EXPORT2 uset_getItemCount(const USet* uset) { const UnicodeSet& set = *(const UnicodeSet*)uset; return set.getRangeCount() + USetAccess::getStringCount(set); } +U_CAPI const UChar* U_EXPORT2 +uset_getString(const USet *uset, int32_t index, int32_t *pLength) { + if (pLength == nullptr) { return nullptr; } + const UnicodeSet &set = *(const UnicodeSet *)uset; + int32_t count = USetAccess::getStringCount(set); + if (index < 0 || count <= index) { + *pLength = 0; + return nullptr; + } + const UnicodeString *s = USetAccess::getString(set, index); + *pLength = s->length(); + return toUCharPtr(s->getBuffer()); +} + U_CAPI int32_t U_EXPORT2 uset_getItem(const USet* uset, int32_t itemIndex, UChar32* start, UChar32* end, @@ -475,7 +496,7 @@ uset_serializedContains(const USerializedSet* set, UChar32 c) { } else { hi += 1; } - return (UBool)(hi&1); + return hi&1; } else { /* find c in the supplementary part */ uint16_t high=(uint16_t)(c>>16), low=(uint16_t)c; @@ -500,7 +521,7 @@ uset_serializedContains(const USerializedSet* set, UChar32 c) { hi += 2; } /* count pairs of 16-bit units even per BMP and check if the number of pairs is odd */ - return (UBool)(((hi+(base<<1))&2)!=0); + return ((hi+(base<<1))&2)!=0; } } diff --git a/deps/icu-small/source/common/uset_props.cpp b/deps/icu-small/source/common/uset_props.cpp index 6f6e0c550f9366..c5efde1ff7f243 100644 --- a/deps/icu-small/source/common/uset_props.cpp +++ b/deps/icu-small/source/common/uset_props.cpp @@ -36,9 +36,9 @@ uset_openPattern(const char16_t* pattern, int32_t patternLength, UnicodeString pat(patternLength==-1, pattern, patternLength); UnicodeSet* set = new UnicodeSet(pat, *ec); /* test for nullptr */ - if(set == 0) { + if (set == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } if (U_FAILURE(*ec)) { @@ -56,9 +56,9 @@ uset_openPatternOptions(const char16_t* pattern, int32_t patternLength, UnicodeString pat(patternLength==-1, pattern, patternLength); UnicodeSet* set = new UnicodeSet(pat, options, nullptr, *ec); /* test for nullptr */ - if(set == 0) { + if (set == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } if (U_FAILURE(*ec)) { diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index d24a15ab2df0fd..a79d1a26f10008 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -60,8 +60,8 @@ UBool UnicodeSetIterator::next() { } if (nextString >= stringCount) return false; - codepoint = (UChar32)IS_STRING; // signal that value is actually a string - string = (const UnicodeString*) set->strings->elementAt(nextString++); + codepoint = static_cast<UChar32>(IS_STRING); // signal that value is actually a string + string = static_cast<const UnicodeString*>(set->strings_->elementAt(nextString++)); return true; } @@ -93,8 +93,8 @@ UBool UnicodeSetIterator::nextRange() { } if (nextString >= stringCount) return false; - codepoint = (UChar32)IS_STRING; // signal that value is actually a string - string = (const UnicodeString*) set->strings->elementAt(nextString++); + codepoint = static_cast<UChar32>(IS_STRING); // signal that value is actually a string + string = static_cast<const UnicodeString*>(set->strings_->elementAt(nextString++)); return true; } @@ -135,12 +135,12 @@ void UnicodeSetIterator::loadRange(int32_t iRange) { const UnicodeString& UnicodeSetIterator::getString() { - if (string==nullptr && codepoint!=(UChar32)IS_STRING) { + if (string == nullptr && codepoint != static_cast<UChar32>(IS_STRING)) { if (cpString == nullptr) { cpString = new UnicodeString(); } if (cpString != nullptr) { - cpString->setTo((UChar32)codepoint); + cpString->setTo(codepoint); } string = cpString; } diff --git a/deps/icu-small/source/common/ushape.cpp b/deps/icu-small/source/common/ushape.cpp index d0ac95e0b23496..b7946dc3ce03f2 100644 --- a/deps/icu-small/source/common/ushape.cpp +++ b/deps/icu-small/source/common/ushape.cpp @@ -28,6 +28,7 @@ #include "ubidi_props.h" #include "uassert.h" +#include <limits> /* * This implementation is designed for 16-bit Unicode strings. * The main assumption is that the Arabic characters and their @@ -360,8 +361,8 @@ _shapeToArabicDigitsWithContext(char16_t *s, int32_t length, lastStrongWasAL=true; break; case U_EUROPEAN_NUMBER: /* EN */ - if(lastStrongWasAL && (uint32_t)(c-0x30)<10) { - s[i]=(char16_t)(digitBase+c); /* digitBase+(c-0x30) - digitBase was modified above */ + if (lastStrongWasAL && static_cast<uint32_t>(c - 0x30) < 10) { + s[i] = static_cast<char16_t>(digitBase + c); /* digitBase+(c-0x30) - digitBase was modified above */ } break; default : @@ -380,8 +381,8 @@ _shapeToArabicDigitsWithContext(char16_t *s, int32_t length, lastStrongWasAL=true; break; case U_EUROPEAN_NUMBER: /* EN */ - if(lastStrongWasAL && (uint32_t)(c-0x30)<10) { - s[i]=(char16_t)(digitBase+c); /* digitBase+(c-0x30) - digitBase was modified above */ + if (lastStrongWasAL && static_cast<uint32_t>(c - 0x30) < 10) { + s[i] = static_cast<char16_t>(digitBase + c); /* digitBase+(c-0x30) - digitBase was modified above */ } break; default : @@ -483,7 +484,7 @@ countSpaces(char16_t *dest, int32_t size, uint32_t /*options*/, int32_t *spacesC */ static inline int32_t isTashkeelChar(char16_t ch) { - return (int32_t)( ch>=0x064B && ch<= 0x0652 ); + return static_cast<int32_t>(ch >= 0x064B && ch <= 0x0652); } /* @@ -492,7 +493,7 @@ isTashkeelChar(char16_t ch) { */ static inline int32_t isTashkeelCharFE(char16_t ch) { - return (int32_t)( ch>=0xFE70 && ch<= 0xFE7F ); + return static_cast<int32_t>(ch >= 0xFE70 && ch <= 0xFE7F); } /* @@ -501,7 +502,7 @@ isTashkeelCharFE(char16_t ch) { */ static inline int32_t isAlefChar(char16_t ch) { - return (int32_t)( (ch==0x0622)||(ch==0x0623)||(ch==0x0625)||(ch==0x0627) ); + return static_cast<int32_t>(ch == 0x0622 || ch == 0x0623 || ch == 0x0625 || ch == 0x0627); } /* @@ -510,7 +511,7 @@ isAlefChar(char16_t ch) { */ static inline int32_t isLamAlefChar(char16_t ch) { - return (int32_t)((ch>=0xFEF5)&&(ch<=0xFEFC) ); + return static_cast<int32_t>(ch >= 0xFEF5 && ch <= 0xFEFC); } /*BIDI @@ -564,7 +565,7 @@ isSeenFamilyChar(char16_t ch){ */ static inline int32_t isAlefMaksouraChar(char16_t ch) { - return (int32_t)( (ch == 0xFEEF) || ( ch == 0xFEF0) || (ch == 0x0649)); + return static_cast<int32_t>(ch == 0xFEEF || ch == 0xFEF0 || ch == 0x0649); } /* @@ -747,7 +748,11 @@ handleGeneratedSpaces(char16_t *dest, int32_t sourceLength, } } - tempbuffer = (char16_t *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); + if (static_cast<size_t>(sourceLength) + 1 > std::numeric_limits<size_t>::max() / U_SIZEOF_UCHAR) { + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + tempbuffer = static_cast<char16_t*>(uprv_malloc((sourceLength + 1) * U_SIZEOF_UCHAR)); /* Test for nullptr */ if(tempbuffer == nullptr) { *pErrorCode = U_MEMORY_ALLOCATION_ERROR; @@ -905,7 +910,7 @@ expandCompositCharAtBegin(char16_t *dest, int32_t sourceLength, int32_t destSize int32_t countl = 0; char16_t *tempbuffer=nullptr; - tempbuffer = (char16_t *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); + tempbuffer = static_cast<char16_t*>(uprv_malloc((sourceLength + 1) * U_SIZEOF_UCHAR)); /* Test for nullptr */ if(tempbuffer == nullptr) { @@ -967,7 +972,7 @@ expandCompositCharAtEnd(char16_t *dest, int32_t sourceLength, int32_t destSize,U int32_t inpsize = sourceLength; char16_t *tempbuffer=nullptr; - tempbuffer = (char16_t *)uprv_malloc((sourceLength+1)*U_SIZEOF_UCHAR); + tempbuffer = static_cast<char16_t*>(uprv_malloc((sourceLength + 1) * U_SIZEOF_UCHAR)); /* Test for nullptr */ if(tempbuffer == nullptr) { @@ -1154,7 +1159,7 @@ expandCompositChar(char16_t *dest, int32_t sourceLength, if (shapingMode == 1){ if ( (options&U_SHAPE_LAMALEF_MASK) == U_SHAPE_LAMALEF_RESIZE){ destSize = calculateSize(dest,sourceLength,destSize,options); - tempbuffer = (char16_t *)uprv_malloc((destSize+1)*U_SIZEOF_UCHAR); + tempbuffer = static_cast<char16_t*>(uprv_malloc((destSize + 1) * U_SIZEOF_UCHAR)); /* Test for nullptr */ if(tempbuffer == nullptr) { @@ -1326,9 +1331,9 @@ shapeUnicode(char16_t *dest, int32_t sourceLength, dest[i] = 0xFE70 + IrrelevantPos[(dest[i] - 0x064B)] + static_cast<char16_t>(Shape); } }else if ((currLink & APRESENT) > 0) { - dest[i] = (char16_t)(0xFB50 + (currLink >> 8) + Shape); + dest[i] = static_cast<char16_t>(0xFB50 + (currLink >> 8) + Shape); }else if ((currLink >> 8) > 0 && (currLink & IRRELEVANT) == 0) { - dest[i] = (char16_t)(0xFE70 + (currLink >> 8) + Shape); + dest[i] = static_cast<char16_t>(0xFE70 + (currLink >> 8) + Shape); } } } @@ -1709,13 +1714,13 @@ u_shapeArabic(const char16_t *source, int32_t sourceLength, case U_SHAPE_DIGITS_ALEN2AN_INIT_LR: _shapeToArabicDigitsWithContext(dest, destLength, digitBase, - (UBool)((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_LOGICAL), + (options & U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_LOGICAL, false); break; case U_SHAPE_DIGITS_ALEN2AN_INIT_AL: _shapeToArabicDigitsWithContext(dest, destLength, digitBase, - (UBool)((options&U_SHAPE_TEXT_DIRECTION_MASK)==U_SHAPE_TEXT_DIRECTION_LOGICAL), + (options & U_SHAPE_TEXT_DIRECTION_MASK) == U_SHAPE_TEXT_DIRECTION_LOGICAL, true); break; default: diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index fc9d0ac208f76a..e45dca1cc8d0c5 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -126,8 +126,7 @@ compareEntries(const UHashTok p1, const UHashTok p2) { name2.pointer = b2->name; path1.pointer = b1->path; path2.pointer = b2->path; - return ((UBool)(uhash_compareChars(name1, name2) & - uhash_compareChars(path1, path2))); + return uhash_compareChars(name1, name2) && uhash_compareChars(path1, path2); } static void @@ -228,7 +227,7 @@ loadData(UStringPrepProfile* profile, const char* type, UErrorCode* errorCode) { /* load Unicode SPREP data from file */ - UTrie _sprepTrie={ 0,0,0,0,0,0,0 }; + UTrie _sprepTrie = {nullptr, nullptr, nullptr, 0, 0, 0, 0}; UDataMemory *dataMemory; const int32_t *p=nullptr; const uint8_t *pb; @@ -246,8 +245,8 @@ loadData(UStringPrepProfile* profile, return false; } - p=(const int32_t *)udata_getMemory(dataMemory); - pb=(const uint8_t *)(p+_SPREP_INDEX_TOP); + p = static_cast<const int32_t*>(udata_getMemory(dataMemory)); + pb = reinterpret_cast<const uint8_t*>(p + _SPREP_INDEX_TOP); utrie_unserialize(&_sprepTrie, pb, p[_SPREP_INDEX_TRIE_SIZE], errorCode); _sprepTrie.getFoldingOffset=getSPrepFoldingOffset; @@ -265,11 +264,11 @@ loadData(UStringPrepProfile* profile, uprv_memcpy(&profile->indexes, p, sizeof(profile->indexes)); uprv_memcpy(&profile->sprepTrie, &_sprepTrie, sizeof(UTrie)); } else { - p=(const int32_t *)udata_getMemory(profile->sprepData); + p = static_cast<const int32_t*>(udata_getMemory(profile->sprepData)); } umtx_unlock(&usprepMutex); /* initialize some variables */ - profile->mappingData=(uint16_t *)((uint8_t *)(p+_SPREP_INDEX_TOP)+profile->indexes[_SPREP_INDEX_TRIE_SIZE]); + profile->mappingData = reinterpret_cast<const uint16_t*>(reinterpret_cast<const uint8_t*>(p + _SPREP_INDEX_TOP) + profile->indexes[_SPREP_INDEX_TRIE_SIZE]); u_getUnicodeVersion(normUnicodeVersion); normUniVer = (normUnicodeVersion[0] << 24) + (normUnicodeVersion[1] << 16) + @@ -320,12 +319,12 @@ usprep_getProfile(const char* path, * we use the passed in pointers for fetching the data from the * hash table which is safe */ - stackKey.name = (char*) name; - stackKey.path = (char*) path; + stackKey.name = const_cast<char*>(name); + stackKey.path = const_cast<char*>(path); /* fetch the data from the cache */ umtx_lock(&usprepMutex); - profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); + profile = static_cast<UStringPrepProfile*>(uhash_get(SHARED_DATA_HASHTABLE, &stackKey)); if(profile != nullptr) { profile->refCount++; } @@ -345,8 +344,8 @@ usprep_getProfile(const char* path, } /* get the options */ - newProfile->doNFKC = (UBool)((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0); - newProfile->checkBiDi = (UBool)((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_CHECK_BIDI_ON) > 0); + newProfile->doNFKC = static_cast<UBool>((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0); + newProfile->checkBiDi = static_cast<UBool>((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_CHECK_BIDI_ON) > 0); LocalMemory<UStringPrepKey> key; LocalMemory<char> keyName; @@ -363,7 +362,7 @@ usprep_getProfile(const char* path, umtx_lock(&usprepMutex); // If another thread already inserted the same key/value, refcount and cleanup our thread data - profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); + profile = static_cast<UStringPrepProfile*>(uhash_get(SHARED_DATA_HASHTABLE, &stackKey)); if(profile != nullptr) { profile->refCount++; usprep_unload(newProfile.getAlias()); @@ -477,7 +476,7 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){ isIndex =false; value = 0; }else if(trieWord >= _SPREP_TYPE_THRESHOLD){ - type = (UStringPrepType) (trieWord - _SPREP_TYPE_THRESHOLD); + type = static_cast<UStringPrepType>(trieWord - _SPREP_TYPE_THRESHOLD); isIndex =false; value = 0; }else{ @@ -489,7 +488,7 @@ getValues(uint16_t trieWord, int16_t& value, UBool& isIndex){ value = trieWord >> 2; //mask off the lower 2 bits and shift }else{ isIndex = false; - value = (int16_t)trieWord; + value = static_cast<int16_t>(trieWord); value = (value >> 2); } @@ -514,7 +513,7 @@ usprep_map( const UStringPrepProfile* profile, uint16_t result; int32_t destIndex=0; int32_t srcIndex; - UBool allowUnassigned = (UBool) ((options & USPREP_ALLOW_UNASSIGNED)>0); + UBool allowUnassigned = static_cast<UBool>((options & USPREP_ALLOW_UNASSIGNED) > 0); UStringPrepType type; int16_t value; UBool isIndex; @@ -581,7 +580,7 @@ usprep_map( const UStringPrepProfile* profile, //copy the code point into destination if(ch <= 0xFFFF){ if(destIndex < destCapacity ){ - dest[destIndex] = (char16_t)ch; + dest[destIndex] = static_cast<char16_t>(ch); } destIndex++; }else{ @@ -667,11 +666,12 @@ usprep_prepare( const UStringPrepProfile* profile, *status = U_MEMORY_ALLOCATION_ERROR; return 0; } + UErrorCode bufferStatus = U_ZERO_ERROR; int32_t b1Len = usprep_map(profile, src, srcLength, - b1, s1.getCapacity(), options, parseError, status); - s1.releaseBuffer(U_SUCCESS(*status) ? b1Len : 0); + b1, s1.getCapacity(), options, parseError, &bufferStatus); + s1.releaseBuffer(U_SUCCESS(bufferStatus) ? b1Len : 0); - if(*status == U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR){ // redo processing of string /* we do not have enough room so grow the buffer*/ b1 = s1.getBuffer(b1Len); @@ -680,12 +680,13 @@ usprep_prepare( const UStringPrepProfile* profile, return 0; } - *status = U_ZERO_ERROR; // reset error + bufferStatus = U_ZERO_ERROR; // reset error b1Len = usprep_map(profile, src, srcLength, - b1, s1.getCapacity(), options, parseError, status); - s1.releaseBuffer(U_SUCCESS(*status) ? b1Len : 0); + b1, s1.getCapacity(), options, parseError, &bufferStatus); + s1.releaseBuffer(U_SUCCESS(bufferStatus) ? b1Len : 0); } - if(U_FAILURE(*status)){ + if(U_FAILURE(bufferStatus)){ + *status = bufferStatus; return 0; } diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 82beaca65b2c82..e96af0df878db4 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -93,7 +93,7 @@ void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { if (U_SUCCESS(errorCode)) { int64_t length64 = utext_nativeLength(text); if (length64 <= INT32_MAX) { - length = (int32_t)length64; + length = static_cast<int32_t>(length64); } else { errorCode = U_INDEX_OUTOFBOUNDS_ERROR; } diff --git a/deps/icu-small/source/common/ustr_wcs.cpp b/deps/icu-small/source/common/ustr_wcs.cpp index efbbbc2f18784e..395713f5cd9354 100644 --- a/deps/icu-small/source/common/ustr_wcs.cpp +++ b/deps/icu-small/source/common/ustr_wcs.cpp @@ -57,7 +57,7 @@ u_growAnyBufferFromStatic(void *context, } *pBuffer=newBuffer; - return (UBool)(newBuffer!=nullptr); + return newBuffer!=nullptr; } /* helper function */ @@ -95,15 +95,14 @@ _strToWCS(wchar_t *dest, pSrcLimit = pSrc + srcLength; for(;;) { - /* reset the error state */ - *pErrorCode = U_ZERO_ERROR; + UErrorCode bufferStatus = U_ZERO_ERROR; /* convert to chars using default converter */ - ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,nullptr,(UBool)(pSrc==pSrcLimit),pErrorCode); + ucnv_fromUnicode(conv,&tempBuf,tempBufLimit,&pSrc,pSrcLimit,nullptr,(UBool)(pSrc==pSrcLimit),&bufferStatus); count =(tempBuf - saveBuf); /* This should rarely occur */ - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR){ tempBuf = saveBuf; /* we don't have enough room on the stack grow the buffer */ @@ -119,16 +118,15 @@ _strToWCS(wchar_t *dest, saveBuf = tempBuf; tempBufLimit = tempBuf + tempBufCapacity; tempBuf = tempBuf + count; - } else { + if (U_FAILURE(bufferStatus)) { + *pErrorCode = bufferStatus; + goto cleanup; + } break; } } - if(U_FAILURE(*pErrorCode)){ - goto cleanup; - } - /* done with conversion null terminate the char buffer */ if(count>=tempBufCapacity){ tempBuf = saveBuf; @@ -441,20 +439,22 @@ _strFromWCS( char16_t *dest, } for(;;) { - - *pErrorCode = U_ZERO_ERROR; - + UErrorCode bufferStatus = U_ZERO_ERROR; + /* convert to stack buffer*/ - ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,nullptr,(UBool)(pCSrc==pCSrcLimit),pErrorCode); - + ucnv_toUnicode(conv,&pTarget,pTargetLimit,(const char**)&pCSrc,pCSrcLimit,nullptr,(UBool)(pCSrc==pCSrcLimit),&bufferStatus); + /* increment count to number written to stack */ count+= pTarget - target; - - if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR){ + + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR){ target = uStack; pTarget = uStack; pTargetLimit = uStack + _STACK_BUFFER_CAPACITY; } else { + if (U_FAILURE(bufferStatus)) { + *pErrorCode = bufferStatus; + } break; } diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index e4aec8a1c73d0d..58b5c5ef6235e5 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -77,7 +77,7 @@ appendResult(char16_t *dest, int32_t destIndex, int32_t destCapacity, } c=~result; if(destIndex<destCapacity && c<=0xffff) { // BMP slightly-fastpath - dest[destIndex++]=(char16_t)c; + dest[destIndex++] = static_cast<char16_t>(c); return destIndex; } length=cpLength; @@ -86,7 +86,7 @@ appendResult(char16_t *dest, int32_t destIndex, int32_t destCapacity, c=U_SENTINEL; length=result; } else if(destIndex<destCapacity && result<=0xffff) { // BMP slightly-fastpath - dest[destIndex++]=(char16_t)result; + dest[destIndex++] = static_cast<char16_t>(result); if(edits!=nullptr) { edits->addReplace(cpLength, 1); } @@ -171,7 +171,7 @@ appendUnchanged(char16_t *dest, int32_t destIndex, int32_t destCapacity, UChar32 U_CALLCONV utf16_caseContextIterator(void *context, int8_t dir) { - UCaseContext *csc=(UCaseContext *)context; + UCaseContext* csc = static_cast<UCaseContext*>(context); UChar32 c; if(dir<0) { @@ -272,7 +272,7 @@ int32_t toLower(int32_t caseLocale, uint32_t options, } else { c = lead; } - const char16_t *s; + const char16_t *s = nullptr; if (caseLocale >= 0) { csc->cpStart = cpStart; csc->cpLimit = srcIndex; @@ -369,7 +369,7 @@ int32_t toUpper(int32_t caseLocale, uint32_t options, c = lead; } csc->cpLimit = srcIndex; - const char16_t *s; + const char16_t *s = nullptr; c = ucase_toFullUpper(c, utf16_caseContextIterator, csc, &s, caseLocale); if (c >= 0) { destIndex = appendUnchanged(dest, destIndex, destCapacity, @@ -579,8 +579,8 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it } if (c == u'I' || c == u'Í') { - titleLimit = maybeTitleDutchIJ(src, c, titleStart + 1, index, - dest, destIndex, destCapacity, options, + titleLimit = maybeTitleDutchIJ(src, c, titleStart + 1, index, + dest, destIndex, destCapacity, options, edits); } } @@ -1216,7 +1216,7 @@ int32_t toUpper(uint32_t options, } if (change) { - destIndex=appendUChar(dest, destIndex, destCapacity, (char16_t)upper); + destIndex = appendUChar(dest, destIndex, destCapacity, static_cast<char16_t>(upper)); if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika } @@ -1698,7 +1698,7 @@ static int32_t _cmpFold( */ if( level1==0 && - (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 + (length = ucase_toFullFolding(cp1, &p, options)) >= 0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -1744,7 +1744,7 @@ static int32_t _cmpFold( } if( level2==0 && - (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 + (length = ucase_toFullFolding(cp2, &p, options)) >= 0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { @@ -1857,7 +1857,7 @@ u_strCaseCompare(const char16_t *s1, int32_t length1, uint32_t options, UErrorCode *pErrorCode) { /* argument checking */ - if(pErrorCode==0 || U_FAILURE(*pErrorCode)) { + if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) { return 0; } if(s1==nullptr || length1<-1 || s2==nullptr || length2<-1) { diff --git a/deps/icu-small/source/common/ustrenum.cpp b/deps/icu-small/source/common/ustrenum.cpp index a60b2208f683ed..c42014d617d7b6 100644 --- a/deps/icu-small/source/common/ustrenum.cpp +++ b/deps/icu-small/source/common/ustrenum.cpp @@ -89,7 +89,7 @@ StringEnumeration::ensureCharsCapacity(int32_t capacity, UErrorCode &status) { if(chars!=charsBuffer) { uprv_free(chars); } - chars=(char *)uprv_malloc(capacity); + chars = static_cast<char*>(uprv_malloc(capacity)); if(chars==nullptr) { chars=charsBuffer; charsCapacity=sizeof(charsBuffer); @@ -104,7 +104,7 @@ UnicodeString * StringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) { if(U_SUCCESS(status) && s!=nullptr) { if(length<0) { - length=(int32_t)uprv_strlen(s); + length = static_cast<int32_t>(uprv_strlen(s)); } char16_t *buffer=unistr.getBuffer(length+1); @@ -168,8 +168,8 @@ const char *UStringEnumeration::next(int32_t *resultLength, UErrorCode &status) const UnicodeString* UStringEnumeration::snext(UErrorCode& status) { int32_t length; const char16_t* str = uenum_unext(uenum, &length, &status); - if (str == 0 || U_FAILURE(status)) { - return 0; + if (str == nullptr || U_FAILURE(status)) { + return nullptr; } return &unistr.setTo(str, length); } @@ -307,7 +307,7 @@ ucharstrenum_unext(UEnumeration* en, } const char16_t* result = ((const char16_t**)e->uenum.context)[e->index++]; if (resultLength) { - *resultLength = (int32_t)u_strlen(result); + *resultLength = u_strlen(result); } return result; } @@ -360,7 +360,7 @@ U_CAPI UEnumeration* U_EXPORT2 uenum_openCharStringsEnumeration(const char* const strings[], int32_t count, UErrorCode* ec) { UCharStringEnumeration* result = nullptr; - if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { + if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); if (result == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; @@ -379,7 +379,7 @@ U_CAPI UEnumeration* U_EXPORT2 uenum_openUCharStringsEnumeration(const char16_t* const strings[], int32_t count, UErrorCode* ec) { UCharStringEnumeration* result = nullptr; - if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != 0)) { + if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); if (result == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/ustring.cpp b/deps/icu-small/source/common/ustring.cpp index 4f7443cc886b7e..8375121e2f455d 100644 --- a/deps/icu-small/source/common/ustring.cpp +++ b/deps/icu-small/source/common/ustring.cpp @@ -1356,7 +1356,7 @@ _charPtr_charAt(int32_t offset, void *context) { char16_t c16; /* It would be more efficient to access the invariant tables * directly but there is no API for that. */ - u_charsToUChars(((char*) context) + offset, &c16, 1); + u_charsToUChars(static_cast<char*>(context) + offset, &c16, 1); return c16; } @@ -1394,7 +1394,7 @@ u_unescape(const char *src, char16_t *dest, int32_t destCapacity) { i += (int32_t)(src - segment); } ++src; /* advance past '\\' */ - c32 = (UChar32)u_unescapeAt(_charPtr_charAt, &lenParsed, (int32_t)uprv_strlen(src), (void*)src); + c32 = u_unescapeAt(_charPtr_charAt, &lenParsed, (int32_t)uprv_strlen(src), const_cast<char*>(src)); if (lenParsed == 0) { goto err; } diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index 244c111fc416ce..d16eabe99fd065 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -771,19 +771,19 @@ static inline uint8_t * _appendUTF8(uint8_t *pDest, UChar32 c) { /* it is 0<=c<=0x10ffff and not a surrogate if called by a validating function */ if((c)<=0x7f) { - *pDest++=(uint8_t)c; + *pDest++ = static_cast<uint8_t>(c); } else if(c<=0x7ff) { - *pDest++=(uint8_t)((c>>6)|0xc0); - *pDest++=(uint8_t)((c&0x3f)|0x80); + *pDest++ = static_cast<uint8_t>((c >> 6) | 0xc0); + *pDest++ = static_cast<uint8_t>((c & 0x3f) | 0x80); } else if(c<=0xffff) { - *pDest++=(uint8_t)((c>>12)|0xe0); - *pDest++=(uint8_t)(((c>>6)&0x3f)|0x80); - *pDest++=(uint8_t)(((c)&0x3f)|0x80); + *pDest++ = static_cast<uint8_t>((c >> 12) | 0xe0); + *pDest++ = static_cast<uint8_t>(((c >> 6) & 0x3f) | 0x80); + *pDest++ = static_cast<uint8_t>(((c) & 0x3f) | 0x80); } else /* if((uint32_t)(c)<=0x10ffff) */ { - *pDest++=(uint8_t)(((c)>>18)|0xf0); - *pDest++=(uint8_t)((((c)>>12)&0x3f)|0x80); - *pDest++=(uint8_t)((((c)>>6)&0x3f)|0x80); - *pDest++=(uint8_t)(((c)&0x3f)|0x80); + *pDest++ = static_cast<uint8_t>(((c) >> 18) | 0xf0); + *pDest++ = static_cast<uint8_t>((((c) >> 12) & 0x3f) | 0x80); + *pDest++ = static_cast<uint8_t>((((c) >> 6) & 0x3f) | 0x80); + *pDest++ = static_cast<uint8_t>(((c) & 0x3f) | 0x80); } return pDest; } diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index eb0a6984bd3fa8..0a4248c4e4595c 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -738,7 +738,7 @@ pinIndex(int64_t &index, int64_t limit) { } else if (index > limit) { index = limit; } - return (int32_t)index; + return static_cast<int32_t>(index); } @@ -1937,7 +1937,7 @@ repTextReplace(UText *ut, } // Do the actual replace operation using methods of the Replaceable class - UnicodeString replStr((UBool)(length<0), src, length); // read-only alias + UnicodeString replStr(length < 0, src, length); // read-only alias rep->handleReplaceBetween(start32, limit32, replStr); int32_t newLength = rep->length(); int32_t lengthDelta = newLength - oldLength; diff --git a/deps/icu-small/source/common/utf_impl.cpp b/deps/icu-small/source/common/utf_impl.cpp index 827a82daf403a3..7da10c9b2d36d5 100644 --- a/deps/icu-small/source/common/utf_impl.cpp +++ b/deps/icu-small/source/common/utf_impl.cpp @@ -124,11 +124,9 @@ errorValue(int32_t count, int8_t strict) { * >0 Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., true): * Same as the obsolete "safe" behavior, but non-characters are also treated * like illegal sequences. - * - * Note that a UBool is the same as an int8_t. */ U_CAPI UChar32 U_EXPORT2 -utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { +utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, int8_t strict) { // *pi is one after byte c. int32_t i=*pi; // length can be negative for NUL-terminated strings: Read and validate one byte at a time. @@ -233,7 +231,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool } U_CAPI UChar32 U_EXPORT2 -utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { +utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, int8_t strict) { // *pi is the index of byte c. int32_t i=*pi; if(U8_IS_TRAIL(c) && i>start) { diff --git a/deps/icu-small/source/common/util.cpp b/deps/icu-small/source/common/util.cpp index f6a13aa445d228..d80ccb50ed0e2f 100644 --- a/deps/icu-small/source/common/util.cpp +++ b/deps/icu-small/source/common/util.cpp @@ -37,12 +37,12 @@ UnicodeString& ICU_Utility::appendNumber(UnicodeString& result, int32_t n, int32_t radix, int32_t minDigits) { if (radix < 2 || radix > 36) { // Bogus radix - return result.append((char16_t)63/*?*/); + return result.append(static_cast<char16_t>(63)/*?*/); } // Handle negatives if (n < 0) { n = -n; - result.append((char16_t)45/*-*/); + result.append(static_cast<char16_t>(45)/*-*/); } // First determine the number of digits int32_t nn = n; @@ -150,7 +150,7 @@ int32_t ICU_Utility::skipWhitespace(const UnicodeString& str, int32_t& pos, UBool advance) { int32_t p = pos; const char16_t* s = str.getBuffer(); - p = (int32_t)(PatternProps::skipWhiteSpace(s + p, str.length() - p) - s); + p = static_cast<int32_t>(PatternProps::skipWhiteSpace(s + p, str.length() - p) - s); if (advance) { pos = p; } @@ -361,7 +361,7 @@ void ICU_Utility::appendToRule(UnicodeString& rule, rule.append(BACKSLASH).append(APOSTROPHE); } } - if (c != (UChar32)-1) { + if (c != static_cast<UChar32>(-1)) { /* Since spaces are ignored during parsing, they are * emitted only for readability. We emit one here * only if there isn't already one at the end of the diff --git a/deps/icu-small/source/common/util_props.cpp b/deps/icu-small/source/common/util_props.cpp index 5991769d0681fe..b1862c24e68092 100644 --- a/deps/icu-small/source/common/util_props.cpp +++ b/deps/icu-small/source/common/util_props.cpp @@ -120,7 +120,7 @@ int32_t ICU_Utility::parsePattern(const UnicodeString& rule, int32_t pos, int32_ if (pos >= limit) { return -1; } - c = (char16_t) u_tolower(rule.charAt(pos++)); + c = static_cast<char16_t>(u_tolower(rule.charAt(pos++))); if (c != cpat) { return -1; } @@ -198,12 +198,11 @@ int32_t ICU_Utility::parseNumber(const UnicodeString& text, if (d < 0) { break; } - n = radix*n + d; - // ASSUME that when a 32-bit integer overflows it becomes - // negative. E.g., 214748364 * 10 + 8 => negative value. - if (n < 0) { + int64_t update = radix*static_cast<int64_t>(n) + d; + if (update > INT32_MAX) { return -1; } + n = static_cast<int32_t>(update); ++p; } if (p == pos) { diff --git a/deps/icu-small/source/common/utrace.cpp b/deps/icu-small/source/common/utrace.cpp index 1f536d5643dfc5..875bef31a29572 100644 --- a/deps/icu-small/source/common/utrace.cpp +++ b/deps/icu-small/source/common/utrace.cpp @@ -138,7 +138,7 @@ static void outputHexBytes(int64_t val, int32_t charsToOutput, static void outputPtrBytes(void *val, char *outBuf, int32_t *outIx, int32_t capacity) { uint32_t i; int32_t incVal = 1; /* +1 for big endian, -1 for little endian */ - char *p = (char *)&val; /* point to current byte to output in the ptr val */ + char* p = reinterpret_cast<char*>(&val); /* point to current byte to output in the ptr val */ #if !U_IS_BIG_ENDIAN /* Little Endian. Move p to most significant end of the value */ @@ -233,7 +233,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt, case 'S': /* char16_t * string, with length, len==-1 for NUL terminated. */ ptrArg = va_arg(args, char *); /* Ptr */ - intArg =(int32_t)va_arg(args, int32_t); /* Length */ + intArg = va_arg(args, int32_t); /* Length */ outputUString((const char16_t *)ptrArg, intArg, outBuf, &outIx, capacity, indent); break; @@ -298,7 +298,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt, i32Ptr = (int32_t *)i8Ptr; i64Ptr = (int64_t *)i8Ptr; ptrPtr = (void **)i8Ptr; - vectorLen =(int32_t)va_arg(args, int32_t); + vectorLen = va_arg(args, int32_t); if (ptrPtr == nullptr) { outputString("*NULL* ", outBuf, &outIx, capacity, indent); } else { diff --git a/deps/icu-small/source/common/utrie.cpp b/deps/icu-small/source/common/utrie.cpp index 83be0e340714ec..6a2cf1a9d995f8 100644 --- a/deps/icu-small/source/common/utrie.cpp +++ b/deps/icu-small/source/common/utrie.cpp @@ -40,7 +40,7 @@ equal_uint32(const uint32_t *s, const uint32_t *t, int32_t length) { ++t; --length; } - return (UBool)(length==0); + return length == 0; } /* Building a trie ----------------------------------------------------------*/ @@ -68,7 +68,7 @@ utrie_open(UNewTrie *fillIn, } } uprv_memset(trie, 0, sizeof(UNewTrie)); - trie->isAllocated= (UBool)(fillIn==nullptr); + trie->isAllocated = fillIn == nullptr; if(aliasData!=nullptr) { trie->data=aliasData; @@ -250,7 +250,7 @@ utrie_get32(UNewTrie *trie, UChar32 c, UBool *pInBlockZero) { block=trie->index[c>>UTRIE_SHIFT]; if(pInBlockZero!=nullptr) { - *pInBlockZero= (UBool)(block==0); + *pInBlockZero = block == 0; } return trie->data[ABS(block)+(c&UTRIE_MASK)]; @@ -730,7 +730,7 @@ defaultGetFoldedValue(UNewTrie *trie, UChar32 start, int32_t offset) { if(inBlockZero) { start+=UTRIE_DATA_BLOCK_LENGTH; } else if(value!=initialValue) { - return (uint32_t)offset; + return static_cast<uint32_t>(offset); } else { ++start; } @@ -884,7 +884,7 @@ utrie_unserialize(UTrie *trie, const void *data, int32_t length, UErrorCode *pEr *pErrorCode=U_INVALID_FORMAT_ERROR; return -1; } - trie->isLatin1Linear= (UBool)((options&UTRIE_OPTIONS_LATIN1_IS_LINEAR)!=0); + trie->isLatin1Linear = (options & UTRIE_OPTIONS_LATIN1_IS_LINEAR) != 0; /* get the length values */ trie->indexLength=header->indexLength; diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index 74f91bc8139026..35be698fbb5d87 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -137,33 +137,33 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, UTrie2 *trie; if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if( length<=0 || (U_POINTER_MASK_LSB(data, 3)!=0) || valueBits<0 || UTRIE2_COUNT_VALUE_BITS<=valueBits ) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } /* enough data for a trie header? */ if(length<(int32_t)sizeof(UTrie2Header)) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* check the signature */ header=(const UTrie2Header *)data; if(header->signature!=UTRIE2_SIG) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* get the options */ if(valueBits!=(UTrie2ValueBits)(header->options&UTRIE2_OPTIONS_VALUE_BITS_MASK)) { *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } /* get the length values and offsets */ @@ -188,14 +188,14 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, } if(length<actualLength) { *pErrorCode=U_INVALID_FORMAT_ERROR; /* not enough bytes */ - return 0; + return nullptr; } /* allocate the trie */ trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2)); if(trie==nullptr) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } uprv_memcpy(trie, &tempTrie, sizeof(tempTrie)); trie->memory=(uint32_t *)data; @@ -226,7 +226,7 @@ utrie2_openFromSerialized(UTrie2ValueBits valueBits, break; default: *pErrorCode=U_INVALID_FORMAT_ERROR; - return 0; + return nullptr; } if(pActualLength!=nullptr) { @@ -247,12 +247,12 @@ utrie2_openDummy(UTrie2ValueBits valueBits, int32_t dataMove; /* >0 if the data is moved to the end of the index array */ if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } if(valueBits<0 || UTRIE2_COUNT_VALUE_BITS<=valueBits) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } /* calculate the total length of the dummy trie data */ @@ -269,14 +269,14 @@ utrie2_openDummy(UTrie2ValueBits valueBits, trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2)); if(trie==nullptr) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } uprv_memset(trie, 0, sizeof(UTrie2)); trie->memory=uprv_malloc(length); if(trie->memory==nullptr) { uprv_free(trie); *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } trie->length=length; trie->isMemoryOwned=true; @@ -364,7 +364,7 @@ utrie2_openDummy(UTrie2ValueBits valueBits, break; default: *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } return trie; @@ -389,7 +389,7 @@ utrie2_close(UTrie2 *trie) { U_CAPI UBool U_EXPORT2 utrie2_isFrozen(const UTrie2 *trie) { - return (UBool)(trie->newTrie==nullptr); + return trie->newTrie==nullptr; } U_CAPI int32_t U_EXPORT2 @@ -552,7 +552,7 @@ enumEitherTrie(const UTrie2 *trie, } for(; i2<i2Limit; ++i2) { if(idx!=nullptr) { - block=(int32_t)idx[i2Block+i2]<<UTRIE2_INDEX_SHIFT; + block = static_cast<int32_t>(idx[i2Block + i2]) << UTRIE2_INDEX_SHIFT; } else { block=trie->newTrie->index2[i2Block+i2]; } diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 1254e8cba682f8..4bd49c7adfa449 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -131,7 +131,7 @@ utrie2_open(uint32_t initialValue, uint32_t errorValue, UErrorCode *pErrorCode) uprv_free(newTrie); uprv_free(data); *pErrorCode=U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } uprv_memset(trie, 0, sizeof(UTrie2)); @@ -249,12 +249,12 @@ static UNewTrie2 * cloneBuilder(const UNewTrie2 *other) { UNewTrie2 *trie; - trie=(UNewTrie2 *)uprv_malloc(sizeof(UNewTrie2)); + trie = static_cast<UNewTrie2*>(uprv_malloc(sizeof(UNewTrie2))); if(trie==nullptr) { return nullptr; } - trie->data=(uint32_t *)uprv_malloc(other->dataCapacity*4); + trie->data = static_cast<uint32_t*>(uprv_malloc(other->dataCapacity * 4)); if(trie->data==nullptr) { uprv_free(trie); return nullptr; @@ -506,7 +506,7 @@ isInNullBlock(UNewTrie2 *trie, UChar32 c, UBool forLSCP) { ((c>>UTRIE2_SHIFT_2)&UTRIE2_INDEX_2_MASK); } block=trie->index2[i2]; - return (UBool)(block==trie->dataNullOffset); + return block == trie->dataNullOffset; } static int32_t @@ -577,7 +577,7 @@ allocDataBlock(UNewTrie2 *trie, int32_t copyBlock) { */ return -1; } - data=(uint32_t *)uprv_malloc(capacity*4); + data = static_cast<uint32_t*>(uprv_malloc(capacity * 4)); if(data==nullptr) { return -1; } @@ -603,7 +603,7 @@ releaseDataBlock(UNewTrie2 *trie, int32_t block) { static inline UBool isWritableBlock(UNewTrie2 *trie, int32_t block) { - return (UBool)(block!=trie->dataNullOffset && 1==trie->map[block>>UTRIE2_SHIFT_2]); + return block != trie->dataNullOffset && 1 == trie->map[block >> UTRIE2_SHIFT_2]; } static inline void @@ -880,8 +880,6 @@ utrie2_setRange32(UTrie2 *trie, fillBlock(newTrie->data+block, 0, rest, value, newTrie->initialValue, overwrite); } - - return; } /* compaction --------------------------------------------------------------- */ @@ -893,7 +891,7 @@ equal_int32(const int32_t *s, const int32_t *t, int32_t length) { ++t; --length; } - return (UBool)(length==0); + return length == 0; } static inline UBool @@ -903,7 +901,7 @@ equal_uint32(const uint32_t *s, const uint32_t *t, int32_t length) { ++t; --length; } - return (UBool)(length==0); + return length == 0; } static int32_t @@ -1213,7 +1211,7 @@ compactIndex2(UNewTrie2 *trie) { */ while((newStart&((UTRIE2_DATA_GRANULARITY-1)|1))!=0) { /* Arbitrary value: 0x3fffc not possible for real data. */ - trie->index2[newStart++]=(int32_t)0xffff<<UTRIE2_INDEX_SHIFT; + trie->index2[newStart++] = static_cast<int32_t>(0xffff) << UTRIE2_INDEX_SHIFT; } #ifdef UTRIE2_DEBUG diff --git a/deps/icu-small/source/common/utrie_swap.cpp b/deps/icu-small/source/common/utrie_swap.cpp index 83d183699d1011..bb060203fde059 100644 --- a/deps/icu-small/source/common/utrie_swap.cpp +++ b/deps/icu-small/source/common/utrie_swap.cpp @@ -64,7 +64,7 @@ utrie_swap(const UDataSwapper *ds, return 0; } - dataIs32=(UBool)((trie.options&UTRIE_OPTIONS_DATA_IS_32_BIT)!=0); + dataIs32 = (trie.options & UTRIE_OPTIONS_DATA_IS_32_BIT) != 0; size=sizeof(UTrieHeader)+trie.indexLength*2+trie.dataLength*(dataIs32?4:2); if(length>=0) { @@ -305,7 +305,7 @@ getVersion(const void *data, int32_t length, UBool anyEndianOk) { if(length<16 || data==nullptr || (U_POINTER_MASK_LSB(data, 3)!=0)) { return 0; } - signature=*(const uint32_t *)data; + signature = *static_cast<const uint32_t*>(data); if(signature==UCPTRIE_SIG) { return 3; } diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index 28f15f7175dde9..16565ae0dafd5c 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -18,16 +18,17 @@ #if !UCONFIG_NO_IDNA +#include "unicode/bytestream.h" #include "unicode/idna.h" #include "unicode/normalizer2.h" #include "unicode/uscript.h" #include "unicode/ustring.h" #include "unicode/utf16.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "punycode.h" #include "ubidi_props.h" -#include "ustr_imp.h" // Note about tests for UIDNA_ERROR_DOMAIN_NAME_TOO_LONG: // @@ -450,10 +451,10 @@ UTS46::processUTF8(StringPiece src, return; } char c=srcArray[i]; - if((int8_t)c<0) { // (uint8_t)c>0x7f + if (static_cast<int8_t>(c) < 0) { // (uint8_t)c>0x7f break; } - int cData=asciiData[(int)c]; // Cast: gcc warns about indexing with a char. + int cData = asciiData[static_cast<int>(c)]; // Cast: gcc warns about indexing with a char. if(cData>0) { destArray[i]=c+0x20; // Lowercase an uppercase ASCII letter. } else if(cData<0 && disallowNonLDHDot) { @@ -755,7 +756,12 @@ UTS46::processLabel(UnicodeString &dest, if(U_FAILURE(errorCode)) { return labelLength; } - if(!isValid) { + // Unicode 15.1 UTS #46: + // Added an additional condition in 4.1 Validity Criteria to + // disallow labels such as xn--xn---epa., which do not round-trip. + // --> Validity Criteria new criterion 4: + // If not CheckHyphens, the label must not begin with “xn--”. + if(!isValid || fromPunycode.startsWith(UnicodeString::readOnlyAlias(u"xn--"))) { info.labelErrors|=UIDNA_ERROR_INVALID_ACE_LABEL; return markBadACELabel(dest, labelStart, labelLength, toASCII, info, errorCode); } @@ -795,7 +801,7 @@ UTS46::processLabel(UnicodeString &dest, // in a non-Punycode label or U+FFFD itself in a Punycode label. // We also check for dots which can come from the input to a single-label function. // Ok to cast away const because we own the UnicodeString. - char16_t *s=(char16_t *)label; + char16_t* s = const_cast<char16_t*>(label); const char16_t *limit=label+labelLength; char16_t oredChars=0; // If we enforce STD3 rules, then ASCII characters other than LDH and dot are disallowed. @@ -826,7 +832,7 @@ UTS46::processLabel(UnicodeString &dest, U16_NEXT_UNSAFE(label, cpLength, c); if((U_GET_GC_MASK(c)&U_GC_M_MASK)!=0) { info.labelErrors|=UIDNA_ERROR_LEADING_COMBINING_MARK; - labelString->replace(labelStart, cpLength, (char16_t)0xfffd); + labelString->replace(labelStart, cpLength, static_cast<char16_t>(0xfffd)); label=labelString->getBuffer()+labelStart; labelLength+=1-cpLength; if(labelString==&dest) { @@ -866,11 +872,12 @@ UTS46::processLabel(UnicodeString &dest, buffer[1]=0x6e; buffer[2]=0x2d; buffer[3]=0x2d; + UErrorCode punycodeErrorCode=U_ZERO_ERROR; int32_t punycodeLength=u_strToPunycode(label, labelLength, buffer+4, punycode.getCapacity()-4, - nullptr, &errorCode); - if(errorCode==U_BUFFER_OVERFLOW_ERROR) { - errorCode=U_ZERO_ERROR; + nullptr, &punycodeErrorCode); + if(punycodeErrorCode==U_BUFFER_OVERFLOW_ERROR) { + punycodeErrorCode=U_ZERO_ERROR; punycode.releaseBuffer(4); buffer=punycode.getBuffer(4+punycodeLength); if(buffer==nullptr) { @@ -879,11 +886,12 @@ UTS46::processLabel(UnicodeString &dest, } punycodeLength=u_strToPunycode(label, labelLength, buffer+4, punycode.getCapacity()-4, - nullptr, &errorCode); + nullptr, &punycodeErrorCode); } punycodeLength+=4; punycode.releaseBuffer(punycodeLength); - if(U_FAILURE(errorCode)) { + if(U_FAILURE(punycodeErrorCode)) { + errorCode = punycodeErrorCode; return destLabelLength; } if(punycodeLength>63) { @@ -946,7 +954,7 @@ UTS46::markBadACELabel(UnicodeString &dest, } } if(onlyLDH) { - dest.insert(labelStart+labelLength, (char16_t)0xfffd); + dest.insert(labelStart + labelLength, static_cast<char16_t>(0xfffd)); if(dest.isBogus()) { errorCode=U_MEMORY_ALLOCATION_ERROR; return 0; @@ -1360,7 +1368,7 @@ uidna_labelToASCII(const UIDNA *idna, if(!checkArgs(label, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - UnicodeString src((UBool)(length<0), label, length); + UnicodeString src(length < 0, label, length); UnicodeString destString(dest, 0, capacity); IDNAInfo info; reinterpret_cast<const IDNA *>(idna)->labelToASCII(src, destString, info, *pErrorCode); @@ -1376,7 +1384,7 @@ uidna_labelToUnicode(const UIDNA *idna, if(!checkArgs(label, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - UnicodeString src((UBool)(length<0), label, length); + UnicodeString src(length < 0, label, length); UnicodeString destString(dest, 0, capacity); IDNAInfo info; reinterpret_cast<const IDNA *>(idna)->labelToUnicode(src, destString, info, *pErrorCode); @@ -1392,7 +1400,7 @@ uidna_nameToASCII(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - UnicodeString src((UBool)(length<0), name, length); + UnicodeString src(length < 0, name, length); UnicodeString destString(dest, 0, capacity); IDNAInfo info; reinterpret_cast<const IDNA *>(idna)->nameToASCII(src, destString, info, *pErrorCode); @@ -1408,7 +1416,7 @@ uidna_nameToUnicode(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - UnicodeString src((UBool)(length<0), name, length); + UnicodeString src(length < 0, name, length); UnicodeString destString(dest, 0, capacity); IDNAInfo info; reinterpret_cast<const IDNA *>(idna)->nameToUnicode(src, destString, info, *pErrorCode); @@ -1425,11 +1433,14 @@ uidna_labelToASCII_UTF8(const UIDNA *idna, return 0; } StringPiece src(label, length<0 ? static_cast<int32_t>(uprv_strlen(label)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast<const IDNA *>(idna)->labelToASCII_UTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast<const IDNA *>(idna)->labelToASCII_UTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1441,11 +1452,14 @@ uidna_labelToUnicodeUTF8(const UIDNA *idna, return 0; } StringPiece src(label, length<0 ? static_cast<int32_t>(uprv_strlen(label)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast<const IDNA *>(idna)->labelToUnicodeUTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast<const IDNA *>(idna)->labelToUnicodeUTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1457,11 +1471,14 @@ uidna_nameToASCII_UTF8(const UIDNA *idna, return 0; } StringPiece src(name, length<0 ? static_cast<int32_t>(uprv_strlen(name)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast<const IDNA *>(idna)->nameToASCII_UTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast<const IDNA *>(idna)->nameToASCII_UTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -1473,11 +1490,14 @@ uidna_nameToUnicodeUTF8(const UIDNA *idna, return 0; } StringPiece src(name, length<0 ? static_cast<int32_t>(uprv_strlen(name)) : length); - CheckedArrayByteSink sink(dest, capacity); - IDNAInfo info; - reinterpret_cast<const IDNA *>(idna)->nameToUnicodeUTF8(src, sink, info, *pErrorCode); - idnaInfoToStruct(info, pInfo); - return u_terminateChars(dest, capacity, sink.NumberOfBytesAppended(), pErrorCode); + return ByteSinkUtil::viaByteSinkToTerminatedChars( + dest, capacity, + [&](ByteSink& sink, UErrorCode& status) { + IDNAInfo info; + reinterpret_cast<const IDNA *>(idna)->nameToUnicodeUTF8(src, sink, info, status); + idnaInfoToStruct(info, pInfo); + }, + *pErrorCode); } #endif // UCONFIG_NO_IDNA diff --git a/deps/icu-small/source/common/utypes.cpp b/deps/icu-small/source/common/utypes.cpp index 63e05b1249b6ff..4d4c1f81b5e6b8 100644 --- a/deps/icu-small/source/common/utypes.cpp +++ b/deps/icu-small/source/common/utypes.cpp @@ -129,6 +129,19 @@ _uFmtErrorName[U_FMT_PARSE_ERROR_LIMIT - U_FMT_PARSE_ERROR_START] = { "U_FORMAT_INEXACT_ERROR", "U_NUMBER_ARG_OUTOFBOUNDS_ERROR", "U_NUMBER_SKELETON_SYNTAX_ERROR", + "U_MF_UNRESOLVED_VARIABLE_ERROR", + "U_MF_SYNTAX_ERROR", + "U_MF_UNKNOWN_FUNCTION_ERROR", + "U_MF_VARIANT_KEY_MISMATCH_ERROR", + "U_MF_FORMATTING_ERROR", + "U_MF_NONEXHAUSTIVE_PATTERN_ERROR", + "U_MF_DUPLICATE_OPTION_NAME_ERROR", + "U_MF_SELECTOR_ERROR", + "U_MF_MISSING_SELECTOR_ANNOTATION_ERROR", + "U_MF_DUPLICATE_DECLARATION_ERROR", + "U_MF_OPERAND_MISMATCH_ERROR", + "U_MF_DUPLICATE_VARIANT_ERROR", + "U_MF_BAD_OPTION" }; static const char * const diff --git a/deps/icu-small/source/common/uvector.cpp b/deps/icu-small/source/common/uvector.cpp index f93d73a3c69ebf..5eb89c9a56bbb0 100644 --- a/deps/icu-small/source/common/uvector.cpp +++ b/deps/icu-small/source/common/uvector.cpp @@ -49,10 +49,10 @@ UVector::UVector(UObjectDeleter *d, UElementsAreEqual *c, int32_t initialCapacit return; } // Fix bogus initialCapacity values; avoid malloc(0) and integer overflow - if ((initialCapacity < 1) || (initialCapacity > (int32_t)(INT32_MAX / sizeof(UElement)))) { + if ((initialCapacity < 1) || (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(UElement)))) { initialCapacity = DEFAULT_CAPACITY; } - elements = (UElement *)uprv_malloc(sizeof(UElement)*initialCapacity); + elements = static_cast<UElement*>(uprv_malloc(sizeof(UElement) * initialCapacity)); if (elements == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { @@ -183,7 +183,7 @@ void UVector::insertElementAt(int32_t elem, int32_t index, UErrorCode &status) { } void* UVector::elementAt(int32_t index) const { - return (0 <= index && index < count) ? elements[index].pointer : 0; + return (0 <= index && index < count) ? elements[index].pointer : nullptr; } int32_t UVector::elementAti(int32_t index) const { @@ -340,12 +340,12 @@ UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) { if (newCap < minimumCapacity) { newCap = minimumCapacity; } - if (newCap > (int32_t)(INT32_MAX / sizeof(UElement))) { // integer overflow check + if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(UElement))) { // integer overflow check // We keep the original memory contents on bad minimumCapacity. status = U_ILLEGAL_ARGUMENT_ERROR; return false; } - UElement* newElems = (UElement *)uprv_realloc(elements, sizeof(UElement)*newCap); + UElement* newElems = static_cast<UElement*>(uprv_realloc(elements, sizeof(UElement) * newCap)); if (newElems == nullptr) { // We keep the original contents on the memory failure on realloc or bad minimumCapacity. status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/uvectr32.cpp b/deps/icu-small/source/common/uvectr32.cpp index fb554729fe69e5..7389b3f06d02cc 100644 --- a/deps/icu-small/source/common/uvectr32.cpp +++ b/deps/icu-small/source/common/uvectr32.cpp @@ -39,7 +39,7 @@ UVector32::UVector32(int32_t initialCapacity, UErrorCode &status) : count(0), capacity(0), maxCapacity(0), - elements(0) + elements(nullptr) { _init(initialCapacity, status); } @@ -54,11 +54,11 @@ void UVector32::_init(int32_t initialCapacity, UErrorCode &status) { if (maxCapacity>0 && maxCapacity<initialCapacity) { initialCapacity = maxCapacity; } - if (initialCapacity > (int32_t)(INT32_MAX / sizeof(int32_t))) { + if (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) { initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity); } - elements = (int32_t *)uprv_malloc(sizeof(int32_t)*initialCapacity); - if (elements == 0) { + elements = static_cast<int32_t*>(uprv_malloc(sizeof(int32_t) * initialCapacity)); + if (elements == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { capacity = initialCapacity; @@ -67,7 +67,7 @@ void UVector32::_init(int32_t initialCapacity, UErrorCode &status) { UVector32::~UVector32() { uprv_free(elements); - elements = 0; + elements = nullptr; } /** @@ -223,12 +223,12 @@ UBool UVector32::expandCapacity(int32_t minimumCapacity, UErrorCode &status) { if (maxCapacity > 0 && newCap > maxCapacity) { newCap = maxCapacity; } - if (newCap > (int32_t)(INT32_MAX / sizeof(int32_t))) { // integer overflow check + if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) { // integer overflow check // We keep the original memory contents on bad minimumCapacity/maxCapacity. status = U_ILLEGAL_ARGUMENT_ERROR; return false; } - int32_t* newElems = (int32_t *)uprv_realloc(elements, sizeof(int32_t)*newCap); + int32_t* newElems = static_cast<int32_t*>(uprv_realloc(elements, sizeof(int32_t) * newCap)); if (newElems == nullptr) { // We keep the original contents on the memory failure on realloc. status = U_MEMORY_ALLOCATION_ERROR; @@ -244,7 +244,7 @@ void UVector32::setMaxCapacity(int32_t limit) { if (limit < 0) { limit = 0; } - if (limit > (int32_t)(INT32_MAX / sizeof(int32_t))) { // integer overflow check for realloc + if (limit > static_cast<int32_t>(INT32_MAX / sizeof(int32_t))) { // integer overflow check for realloc // Something is very wrong, don't realloc, leave capacity and maxCapacity unchanged return; } @@ -256,7 +256,7 @@ void UVector32::setMaxCapacity(int32_t limit) { // New maximum capacity is smaller than the current size. // Realloc the storage to the new, smaller size. - int32_t* newElems = (int32_t *)uprv_realloc(elements, sizeof(int32_t)*maxCapacity); + int32_t* newElems = static_cast<int32_t*>(uprv_realloc(elements, sizeof(int32_t) * maxCapacity)); if (newElems == nullptr) { // Realloc to smaller failed. // Just keep what we had. No need to call it a failure. diff --git a/deps/icu-small/source/common/uvectr64.cpp b/deps/icu-small/source/common/uvectr64.cpp index 05559dd8337135..81c923f4f8f837 100644 --- a/deps/icu-small/source/common/uvectr64.cpp +++ b/deps/icu-small/source/common/uvectr64.cpp @@ -36,7 +36,7 @@ UVector64::UVector64(int32_t initialCapacity, UErrorCode &status) : count(0), capacity(0), maxCapacity(0), - elements(0) + elements(nullptr) { _init(initialCapacity, status); } @@ -51,11 +51,11 @@ void UVector64::_init(int32_t initialCapacity, UErrorCode &status) { if (maxCapacity>0 && maxCapacity<initialCapacity) { initialCapacity = maxCapacity; } - if (initialCapacity > (int32_t)(INT32_MAX / sizeof(int64_t))) { + if (initialCapacity > static_cast<int32_t>(INT32_MAX / sizeof(int64_t))) { initialCapacity = uprv_min(DEFAULT_CAPACITY, maxCapacity); } - elements = (int64_t *)uprv_malloc(sizeof(int64_t)*initialCapacity); - if (elements == 0) { + elements = static_cast<int64_t*>(uprv_malloc(sizeof(int64_t) * initialCapacity)); + if (elements == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { capacity = initialCapacity; @@ -64,7 +64,7 @@ void UVector64::_init(int32_t initialCapacity, UErrorCode &status) { UVector64::~UVector64() { uprv_free(elements); - elements = 0; + elements = nullptr; } /** @@ -141,12 +141,12 @@ UBool UVector64::expandCapacity(int32_t minimumCapacity, UErrorCode &status) { if (maxCapacity > 0 && newCap > maxCapacity) { newCap = maxCapacity; } - if (newCap > (int32_t)(INT32_MAX / sizeof(int64_t))) { // integer overflow check + if (newCap > static_cast<int32_t>(INT32_MAX / sizeof(int64_t))) { // integer overflow check // We keep the original memory contents on bad minimumCapacity/maxCapacity. status = U_ILLEGAL_ARGUMENT_ERROR; return false; } - int64_t* newElems = (int64_t *)uprv_realloc(elements, sizeof(int64_t)*newCap); + int64_t* newElems = static_cast<int64_t*>(uprv_realloc(elements, sizeof(int64_t) * newCap)); if (newElems == nullptr) { // We keep the original contents on the memory failure on realloc. status = U_MEMORY_ALLOCATION_ERROR; @@ -162,7 +162,7 @@ void UVector64::setMaxCapacity(int32_t limit) { if (limit < 0) { limit = 0; } - if (limit > (int32_t)(INT32_MAX / sizeof(int64_t))) { // integer overflow check for realloc + if (limit > static_cast<int32_t>(INT32_MAX / sizeof(int64_t))) { // integer overflow check for realloc // Something is very wrong, don't realloc, leave capacity and maxCapacity unchanged return; } @@ -174,7 +174,7 @@ void UVector64::setMaxCapacity(int32_t limit) { // New maximum capacity is smaller than the current size. // Realloc the storage to the new, smaller size. - int64_t* newElems = (int64_t *)uprv_realloc(elements, sizeof(int64_t)*maxCapacity); + int64_t* newElems = static_cast<int64_t*>(uprv_realloc(elements, sizeof(int64_t) * maxCapacity)); if (newElems == nullptr) { // Realloc to smaller failed. // Just keep what we had. No need to call it a failure. diff --git a/deps/icu-small/source/data/in/icudt74l.dat.bz2 b/deps/icu-small/source/data/in/icudt74l.dat.bz2 deleted file mode 100644 index 67a0cf45606af3..00000000000000 Binary files a/deps/icu-small/source/data/in/icudt74l.dat.bz2 and /dev/null differ diff --git a/deps/icu-small/source/data/in/icudt78l.dat.bz2 b/deps/icu-small/source/data/in/icudt78l.dat.bz2 new file mode 100644 index 00000000000000..1ae38435e2cdde Binary files /dev/null and b/deps/icu-small/source/data/in/icudt78l.dat.bz2 differ diff --git a/deps/icu-small/source/i18n/alphaindex.cpp b/deps/icu-small/source/i18n/alphaindex.cpp index 1b49d3b54434f8..e220e60e95e967 100644 --- a/deps/icu-small/source/i18n/alphaindex.cpp +++ b/deps/icu-small/source/i18n/alphaindex.cpp @@ -379,16 +379,16 @@ const UnicodeString &fixLabel(const UnicodeString ¤t, UnicodeString &temp) char16_t rest = current.charAt(BASE_LENGTH); if (0x2800 < rest && rest <= 0x28FF) { // stroke count int32_t count = rest-0x2800; - temp.setTo((char16_t)(0x30 + count % 10)); + temp.setTo(static_cast<char16_t>(0x30 + count % 10)); if (count >= 10) { count /= 10; - temp.insert(0, (char16_t)(0x30 + count % 10)); + temp.insert(0, static_cast<char16_t>(0x30 + count % 10)); if (count >= 10) { count /= 10; - temp.insert(0, (char16_t)(0x30 + count)); + temp.insert(0, static_cast<char16_t>(0x30 + count)); } } - return temp.append((char16_t)0x5283); + return temp.append(static_cast<char16_t>(0x5283)); } return temp.setTo(current, BASE_LENGTH); } @@ -402,7 +402,7 @@ UBool hasMultiplePrimaryWeights( UBool seenPrimary = false; for (int32_t i = 0; i < ces.size(); ++i) { int64_t ce = ces.elementAti(i); - uint32_t p = (uint32_t)(ce >> 32); + uint32_t p = static_cast<uint32_t>(ce >> 32); if (p > variableTop) { // not primary ignorable if (seenPrimary) { @@ -494,10 +494,10 @@ BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const { // Remember ASCII and Pinyin buckets for Pinyin redirects. char16_t c; if (current.length() == 1 && 0x41 <= (c = current.charAt(0)) && c <= 0x5A) { // A-Z - asciiBuckets[c - 0x41] = (Bucket *)bucketList->lastElement(); + asciiBuckets[c - 0x41] = static_cast<Bucket*>(bucketList->lastElement()); } else if (current.length() == BASE_LENGTH + 1 && current.startsWith(BASE, BASE_LENGTH) && 0x41 <= (c = current.charAt(BASE_LENGTH)) && c <= 0x5A) { - pinyinBuckets[c - 0x41] = (Bucket *)bucketList->lastElement(); + pinyinBuckets[c - 0x41] = static_cast<Bucket*>(bucketList->lastElement()); hasPinyin = true; } // Check for multiple primary weights. @@ -522,7 +522,7 @@ BucketList *AlphabeticIndex::createBucketList(UErrorCode &errorCode) const { // For example, after ... Q R S Sch we add Sch\uFFFF->S // and after ... Q R S Sch Sch\uFFFF St we add St\uFFFF->S. bucket.adoptInsteadAndCheckErrorCode(new Bucket(emptyString_, - UnicodeString(current).append((char16_t)0xFFFF), + UnicodeString(current).append(static_cast<char16_t>(0xFFFF)), U_ALPHAINDEX_NORMAL), errorCode); if (U_FAILURE(errorCode)) { @@ -880,7 +880,7 @@ void AlphabeticIndex::init(const Locale *locale, UErrorCode &status) { return; } - inflowLabel_.setTo((char16_t)0x2026); // Ellipsis + inflowLabel_.setTo(static_cast<char16_t>(0x2026)); // Ellipsis overflowLabel_ = inflowLabel_; underflowLabel_ = inflowLabel_; diff --git a/deps/icu-small/source/i18n/anytrans.cpp b/deps/icu-small/source/i18n/anytrans.cpp index 4972b6873332d5..c558a29d0005c6 100644 --- a/deps/icu-small/source/i18n/anytrans.cpp +++ b/deps/icu-small/source/i18n/anytrans.cpp @@ -286,7 +286,7 @@ Transliterator* AnyTransliterator::getTransliterator(UScriptCode source) const { Transliterator* t = nullptr; { Mutex m(nullptr); - t = (Transliterator*) uhash_iget(cache, (int32_t) source); + t = static_cast<Transliterator*>(uhash_iget(cache, static_cast<int32_t>(source))); } if (t == nullptr) { UErrorCode ec = U_ZERO_ERROR; @@ -312,10 +312,10 @@ Transliterator* AnyTransliterator::getTransliterator(UScriptCode source) const { Transliterator *rt = nullptr; { Mutex m(nullptr); - rt = static_cast<Transliterator *> (uhash_iget(cache, (int32_t) source)); + rt = static_cast<Transliterator*>(uhash_iget(cache, static_cast<int32_t>(source))); if (rt == nullptr) { // Common case, no race to cache this new transliterator. - uhash_iput(cache, (int32_t) source, t, &ec); + uhash_iput(cache, static_cast<int32_t>(source), t, &ec); } else { // Race case, some other thread beat us to caching this transliterator. Transliterator *temp = rt; @@ -340,7 +340,7 @@ static UScriptCode scriptNameToCode(const UnicodeString& name) { UBool isInvariant = uprv_isInvariantUString(name.getBuffer(), nameLen); if (isInvariant) { - name.extract(0, nameLen, buf, (int32_t)sizeof(buf), US_INV); + name.extract(0, nameLen, buf, static_cast<int32_t>(sizeof(buf)), US_INV); buf[127] = 0; // Make sure that we nullptr terminate the string. } if (!isInvariant || uscript_getCode(buf, &code, 1, &ec) != 1 || U_FAILURE(ec)) diff --git a/deps/icu-small/source/i18n/astro.cpp b/deps/icu-small/source/i18n/astro.cpp index 575efeb17581a1..37a5b77a87717b 100644 --- a/deps/icu-small/source/i18n/astro.cpp +++ b/deps/icu-small/source/i18n/astro.cpp @@ -242,7 +242,7 @@ inline static double normPI(double angle) { * @deprecated ICU 2.4. This class may be removed or modified. */ CalendarAstronomer::CalendarAstronomer(): - fTime(Calendar::getNow()), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(false) { + fTime(Calendar::getNow()), moonPosition(0,0), moonPositionSet(false) { clearCache(); } @@ -252,30 +252,7 @@ CalendarAstronomer::CalendarAstronomer(): * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -CalendarAstronomer::CalendarAstronomer(UDate d): fTime(d), fLongitude(0.0), fLatitude(0.0), fGmtOffset(0.0), moonPosition(0,0), moonPositionSet(false) { - clearCache(); -} - -/** - * Construct a new <code>CalendarAstronomer</code> object with the given - * latitude and longitude. The object's time is set to the current - * date and time. - * <p> - * @param longitude The desired longitude, in <em>degrees</em> east of - * the Greenwich meridian. - * - * @param latitude The desired latitude, in <em>degrees</em>. Positive - * values signify North, negative South. - * - * @see java.util.Date#getTime() - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::CalendarAstronomer(double longitude, double latitude) : - fTime(Calendar::getNow()), moonPosition(0,0), moonPositionSet(false) { - fLongitude = normPI(longitude * (double)DEG_RAD); - fLatitude = normPI(latitude * (double)DEG_RAD); - fGmtOffset = (double)(fLongitude * 24. * (double)HOUR_MS / (double)CalendarAstronomer_PI2); +CalendarAstronomer::CalendarAstronomer(UDate d): fTime(d), moonPosition(0,0), moonPositionSet(false) { clearCache(); } @@ -301,31 +278,9 @@ CalendarAstronomer::~CalendarAstronomer() */ void CalendarAstronomer::setTime(UDate aTime) { fTime = aTime; - U_DEBUG_ASTRO_MSG(("setTime(%.1lf, %sL)\n", aTime, debug_astro_date(aTime+fGmtOffset))); clearCache(); } -/** - * Set the current date and time of this <code>CalendarAstronomer</code> object. All - * astronomical calculations are performed based on this time setting. - * - * @param jdn the desired time, expressed as a "julian day number", - * which is the number of elapsed days since - * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day - * numbers start at <em>noon</em>. To get the jdn for - * the corresponding midnight, subtract 0.5. - * - * @see #getJulianDay - * @see #JULIAN_EPOCH_MS - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -void CalendarAstronomer::setJulianDay(double jdn) { - fTime = (double)(jdn * DAY_MS) + JULIAN_EPOCH_MS; - clearCache(); - julianDay = jdn; -} - /** * Get the current time of this <code>CalendarAstronomer</code> object, * represented as the number of milliseconds since @@ -352,102 +307,15 @@ UDate CalendarAstronomer::getTime() { */ double CalendarAstronomer::getJulianDay() { if (isINVALID(julianDay)) { - julianDay = (fTime - (double)JULIAN_EPOCH_MS) / (double)DAY_MS; + julianDay = (fTime - JULIAN_EPOCH_MS) / static_cast<double>(DAY_MS); } return julianDay; } -/** - * Return this object's time expressed in julian centuries: - * the number of centuries after 1/1/1900 AD, 12:00 GMT - * - * @see #getJulianDay - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getJulianCentury() { - if (isINVALID(julianCentury)) { - julianCentury = (getJulianDay() - 2415020.0) / 36525.0; - } - return julianCentury; -} - -/** - * Returns the current Greenwich sidereal time, measured in hours - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getGreenwichSidereal() { - if (isINVALID(siderealTime)) { - // See page 86 of "Practical Astronomy with your Calculator", - // by Peter Duffet-Smith, for details on the algorithm. - - double UT = normalize(fTime/(double)HOUR_MS, 24.); - - siderealTime = normalize(getSiderealOffset() + UT*1.002737909, 24.); - } - return siderealTime; -} - -double CalendarAstronomer::getSiderealOffset() { - if (isINVALID(siderealT0)) { - double JD = uprv_floor(getJulianDay() - 0.5) + 0.5; - double S = JD - 2451545.0; - double T = S / 36525.0; - siderealT0 = normalize(6.697374558 + 2400.051336*T + 0.000025862*T*T, 24); - } - return siderealT0; -} - -/** - * Returns the current local sidereal time, measured in hours - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getLocalSidereal() { - return normalize(getGreenwichSidereal() + (fGmtOffset/(double)HOUR_MS), 24.); -} - -/** - * Converts local sidereal time to Universal Time. - * - * @param lst The Local Sidereal Time, in hours since sidereal midnight - * on this object's current date. - * - * @return The corresponding Universal Time, in milliseconds since - * 1 Jan 1970, GMT. - */ -double CalendarAstronomer::lstToUT(double lst) { - // Convert to local mean time - double lt = normalize((lst - getSiderealOffset()) * 0.9972695663, 24); - - // Then find local midnight on this day - double base = (DAY_MS * ClockMath::floorDivide(fTime + fGmtOffset,(double)DAY_MS)) - fGmtOffset; - - //out(" lt =" + lt + " hours"); - //out(" base=" + new Date(base)); - - return base + (long)(lt * HOUR_MS); -} - - //------------------------------------------------------------------------- // Coordinate transformations, all based on the current time of this object //------------------------------------------------------------------------- -/** - * Convert from ecliptic to equatorial coordinates. - * - * @param ecliptic A point in the sky in ecliptic coordinates. - * @return The corresponding point in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, const CalendarAstronomer::Ecliptic& ecliptic) -{ - return eclipticToEquatorial(result, ecliptic.longitude, ecliptic.latitude); -} - /** * Convert from ecliptic to equatorial coordinates. * @@ -479,46 +347,6 @@ CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(Calenda return result; } -/** - * Convert from ecliptic longitude to equatorial coordinates. - * - * @param eclipLong The ecliptic longitude - * - * @return The corresponding point in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::eclipticToEquatorial(CalendarAstronomer::Equatorial& result, double eclipLong) -{ - return eclipticToEquatorial(result, eclipLong, 0); // TODO: optimize -} - -/** - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Horizon& CalendarAstronomer::eclipticToHorizon(CalendarAstronomer::Horizon& result, double eclipLong) -{ - Equatorial equatorial; - eclipticToEquatorial(equatorial, eclipLong); - - double H = getLocalSidereal()*CalendarAstronomer::PI/12 - equatorial.ascension; // Hour-angle - - double sinH = ::sin(H); - double cosH = cos(H); - double sinD = ::sin(equatorial.declination); - double cosD = cos(equatorial.declination); - double sinL = ::sin(fLatitude); - double cosL = cos(fLatitude); - - double altitude = asin(sinD*sinL + cosD*cosL*cosH); - double azimuth = atan2(-cosD*cosL*sinH, sinD - sinL * ::sin(altitude)); - - result.set(azimuth, altitude); - return result; -} - - //------------------------------------------------------------------------- // The Sun //------------------------------------------------------------------------- @@ -657,50 +485,6 @@ double CalendarAstronomer::getSunLongitude() longitude = norm2PI(trueAnomaly(meanAnomaly, SUN_E) + SUN_OMEGA_G); } -/** - * The position of the sun at this object's current date and time, - * in equatorial coordinates. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -CalendarAstronomer::Equatorial& CalendarAstronomer::getSunPosition(CalendarAstronomer::Equatorial& result) { - return eclipticToEquatorial(result, getSunLongitude(), 0); -} - - -/** - * Constant representing the vernal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "vernal" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*double CalendarAstronomer::VERNAL_EQUINOX() { - return 0; -}*/ - -/** - * Constant representing the summer solstice. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "summer" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::SUMMER_SOLSTICE() { - return (CalendarAstronomer::PI/2); -} - -/** - * Constant representing the autumnal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "autumn" refers to the northern hemisphere's seasons. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*double CalendarAstronomer::AUTUMN_EQUINOX() { - return (CalendarAstronomer::PI); -}*/ - /** * Constant representing the winter solstice. * For use with {@link #getSunTime getSunTime}. @@ -738,310 +522,6 @@ UDate CalendarAstronomer::getSunTime(double desired, UBool next) next); } -CalendarAstronomer::CoordFunc::~CoordFunc() {} - -class RiseSetCoordFunc : public CalendarAstronomer::CoordFunc { -public: - virtual ~RiseSetCoordFunc(); - virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer& a) override { a.getSunPosition(result); } -}; - -RiseSetCoordFunc::~RiseSetCoordFunc() {} - -UDate CalendarAstronomer::getSunRiseSet(UBool rise) -{ - UDate t0 = fTime; - - // Make a rough guess: 6am or 6pm local time on the current day - double noon = ClockMath::floorDivide(fTime + fGmtOffset, (double)DAY_MS)*DAY_MS - fGmtOffset + (12*HOUR_MS); - - U_DEBUG_ASTRO_MSG(("Noon=%.2lf, %sL, gmtoff %.2lf\n", noon, debug_astro_date(noon+fGmtOffset), fGmtOffset)); - setTime(noon + ((rise ? -6 : 6) * HOUR_MS)); - U_DEBUG_ASTRO_MSG(("added %.2lf ms as a guess,\n", ((rise ? -6. : 6.) * HOUR_MS))); - - RiseSetCoordFunc func; - double t = riseOrSet(func, - rise, - .533 * DEG_RAD, // Angular Diameter - 34. /60.0 * DEG_RAD, // Refraction correction - MINUTE_MS / 12.); // Desired accuracy - - setTime(t0); - return t; -} - -// Commented out - currently unused. ICU 2.6, Alan -// //------------------------------------------------------------------------- -// // Alternate Sun Rise/Set -// // See Duffett-Smith p.93 -// //------------------------------------------------------------------------- -// -// // This yields worse results (as compared to USNO data) than getSunRiseSet(). -// /** -// * TODO Make this when the entire class is package-private. -// */ -// /*public*/ long getSunRiseSet2(boolean rise) { -// // 1. Calculate coordinates of the sun's center for midnight -// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; -// double[] sl = getSunLongitude(jd);// double lambda1 = sl[0]; -// Equatorial pos1 = eclipticToEquatorial(lambda1, 0); -// -// // 2. Add ... to lambda to get position 24 hours later -// double lambda2 = lambda1 + 0.985647*DEG_RAD; -// Equatorial pos2 = eclipticToEquatorial(lambda2, 0); -// -// // 3. Calculate LSTs of rising and setting for these two positions -// double tanL = ::tan(fLatitude); -// double H = ::acos(-tanL * ::tan(pos1.declination)); -// double lst1r = (CalendarAstronomer_PI2 + pos1.ascension - H) * 24 / CalendarAstronomer_PI2; -// double lst1s = (pos1.ascension + H) * 24 / CalendarAstronomer_PI2; -// H = ::acos(-tanL * ::tan(pos2.declination)); -// double lst2r = (CalendarAstronomer_PI2-H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; -// double lst2s = (H + pos2.ascension ) * 24 / CalendarAstronomer_PI2; -// if (lst1r > 24) lst1r -= 24; -// if (lst1s > 24) lst1s -= 24; -// if (lst2r > 24) lst2r -= 24; -// if (lst2s > 24) lst2s -= 24; -// -// // 4. Convert LSTs to GSTs. If GST1 > GST2, add 24 to GST2. -// double gst1r = lstToGst(lst1r); -// double gst1s = lstToGst(lst1s); -// double gst2r = lstToGst(lst2r); -// double gst2s = lstToGst(lst2s); -// if (gst1r > gst2r) gst2r += 24; -// if (gst1s > gst2s) gst2s += 24; -// -// // 5. Calculate GST at 0h UT of this date -// double t00 = utToGst(0); -// -// // 6. Calculate GST at 0h on the observer's longitude -// double offset = ::round(fLongitude*12/PI); // p.95 step 6; he _rounds_ to nearest 15 deg. -// double t00p = t00 - offset*1.002737909; -// if (t00p < 0) t00p += 24; // do NOT normalize -// -// // 7. Adjust -// if (gst1r < t00p) { -// gst1r += 24; -// gst2r += 24; -// } -// if (gst1s < t00p) { -// gst1s += 24; -// gst2s += 24; -// } -// -// // 8. -// double gstr = (24.07*gst1r-t00*(gst2r-gst1r))/(24.07+gst1r-gst2r); -// double gsts = (24.07*gst1s-t00*(gst2s-gst1s))/(24.07+gst1s-gst2s); -// -// // 9. Correct for parallax, refraction, and sun's diameter -// double dec = (pos1.declination + pos2.declination) / 2; -// double psi = ::acos(sin(fLatitude) / cos(dec)); -// double x = 0.830725 * DEG_RAD; // parallax+refraction+diameter -// double y = ::asin(sin(x) / ::sin(psi)) * RAD_DEG; -// double delta_t = 240 * y / cos(dec) / 3600; // hours -// -// // 10. Add correction to GSTs, subtract from GSTr -// gstr -= delta_t; -// gsts += delta_t; -// -// // 11. Convert GST to UT and then to local civil time -// double ut = gstToUt(rise ? gstr : gsts); -// //System.out.println((rise?"rise=":"set=") + ut + ", delta_t=" + delta_t); -// long midnight = DAY_MS * (time / DAY_MS); // Find UT midnight on this day -// return midnight + (long) (ut * 3600000); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert local sidereal time to Greenwich sidereal time. -// * Section 15. Duffett-Smith p.21 -// * @param lst in hours (0..24) -// * @return GST in hours (0..24) -// */ -// double lstToGst(double lst) { -// double delta = fLongitude * 24 / CalendarAstronomer_PI2; -// return normalize(lst - delta, 24); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert UT to GST on this date. -// * Section 12. Duffett-Smith p.17 -// * @param ut in hours -// * @return GST in hours -// */ -// double utToGst(double ut) { -// return normalize(getT0() + ut*1.002737909, 24); -// } - -// Commented out - currently unused. ICU 2.6, Alan -// /** -// * Convert GST to UT on this date. -// * Section 13. Duffett-Smith p.18 -// * @param gst in hours -// * @return UT in hours -// */ -// double gstToUt(double gst) { -// return normalize(gst - getT0(), 24) * 0.9972695663; -// } - -// Commented out - currently unused. ICU 2.6, Alan -// double getT0() { -// // Common computation for UT <=> GST -// -// // Find JD for 0h UT -// double jd = uprv_floor(getJulianDay() - 0.5) + 0.5; -// -// double s = jd - 2451545.0; -// double t = s / 36525.0; -// double t0 = 6.697374558 + (2400.051336 + 0.000025862*t)*t; -// return t0; -// } - -// Commented out - currently unused. ICU 2.6, Alan -// //------------------------------------------------------------------------- -// // Alternate Sun Rise/Set -// // See sci.astro FAQ -// // http://www.faqs.org/faqs/astronomy/faq/part3/section-5.html -// //------------------------------------------------------------------------- -// -// // Note: This method appears to produce inferior accuracy as -// // compared to getSunRiseSet(). -// -// /** -// * TODO Make this when the entire class is package-private. -// */ -// /*public*/ long getSunRiseSet3(boolean rise) { -// -// // Compute day number for 0.0 Jan 2000 epoch -// double d = (double)(time - EPOCH_2000_MS) / DAY_MS; -// -// // Now compute the Local Sidereal Time, LST: -// // -// double LST = 98.9818 + 0.985647352 * d + /*UT*15 + long*/ -// fLongitude*RAD_DEG; -// // -// // (east long. positive). Note that LST is here expressed in degrees, -// // where 15 degrees corresponds to one hour. Since LST really is an angle, -// // it's convenient to use one unit---degrees---throughout. -// -// // COMPUTING THE SUN'S POSITION -// // ---------------------------- -// // -// // To be able to compute the Sun's rise/set times, you need to be able to -// // compute the Sun's position at any time. First compute the "day -// // number" d as outlined above, for the desired moment. Next compute: -// // -// double oblecl = 23.4393 - 3.563E-7 * d; -// // -// double w = 282.9404 + 4.70935E-5 * d; -// double M = 356.0470 + 0.9856002585 * d; -// double e = 0.016709 - 1.151E-9 * d; -// // -// // This is the obliquity of the ecliptic, plus some of the elements of -// // the Sun's apparent orbit (i.e., really the Earth's orbit): w = -// // argument of perihelion, M = mean anomaly, e = eccentricity. -// // Semi-major axis is here assumed to be exactly 1.0 (while not strictly -// // true, this is still an accurate approximation). Next compute E, the -// // eccentric anomaly: -// // -// double E = M + e*(180/PI) * ::sin(M*DEG_RAD) * ( 1.0 + e*cos(M*DEG_RAD) ); -// // -// // where E and M are in degrees. This is it---no further iterations are -// // needed because we know e has a sufficiently small value. Next compute -// // the true anomaly, v, and the distance, r: -// // -// /* r * cos(v) = */ double A = cos(E*DEG_RAD) - e; -// /* r * ::sin(v) = */ double B = ::sqrt(1 - e*e) * ::sin(E*DEG_RAD); -// // -// // and -// // -// // r = sqrt( A*A + B*B ) -// double v = ::atan2( B, A )*RAD_DEG; -// // -// // The Sun's true longitude, slon, can now be computed: -// // -// double slon = v + w; -// // -// // Since the Sun is always at the ecliptic (or at least very very close to -// // it), we can use simplified formulae to convert slon (the Sun's ecliptic -// // longitude) to sRA and sDec (the Sun's RA and Dec): -// // -// // ::sin(slon) * cos(oblecl) -// // tan(sRA) = ------------------------- -// // cos(slon) -// // -// // ::sin(sDec) = ::sin(oblecl) * ::sin(slon) -// // -// // As was the case when computing az, the Azimuth, if possible use an -// // atan2() function to compute sRA. -// -// double sRA = ::atan2(sin(slon*DEG_RAD) * cos(oblecl*DEG_RAD), cos(slon*DEG_RAD))*RAD_DEG; -// -// double sin_sDec = ::sin(oblecl*DEG_RAD) * ::sin(slon*DEG_RAD); -// double sDec = ::asin(sin_sDec)*RAD_DEG; -// -// // COMPUTING RISE AND SET TIMES -// // ---------------------------- -// // -// // To compute when an object rises or sets, you must compute when it -// // passes the meridian and the HA of rise/set. Then the rise time is -// // the meridian time minus HA for rise/set, and the set time is the -// // meridian time plus the HA for rise/set. -// // -// // To find the meridian time, compute the Local Sidereal Time at 0h local -// // time (or 0h UT if you prefer to work in UT) as outlined above---name -// // that quantity LST0. The Meridian Time, MT, will now be: -// // -// // MT = RA - LST0 -// double MT = normalize(sRA - LST, 360); -// // -// // where "RA" is the object's Right Ascension (in degrees!). If negative, -// // add 360 deg to MT. If the object is the Sun, leave the time as it is, -// // but if it's stellar, multiply MT by 365.2422/366.2422, to convert from -// // sidereal to solar time. Now, compute HA for rise/set, name that -// // quantity HA0: -// // -// // ::sin(h0) - ::sin(lat) * ::sin(Dec) -// // cos(HA0) = --------------------------------- -// // cos(lat) * cos(Dec) -// // -// // where h0 is the altitude selected to represent rise/set. For a purely -// // mathematical horizon, set h0 = 0 and simplify to: -// // -// // cos(HA0) = - tan(lat) * tan(Dec) -// // -// // If you want to account for refraction on the atmosphere, set h0 = -35/60 -// // degrees (-35 arc minutes), and if you want to compute the rise/set times -// // for the Sun's upper limb, set h0 = -50/60 (-50 arc minutes). -// // -// double h0 = -50/60 * DEG_RAD; -// -// double HA0 = ::acos( -// (sin(h0) - ::sin(fLatitude) * sin_sDec) / -// (cos(fLatitude) * cos(sDec*DEG_RAD)))*RAD_DEG; -// -// // When HA0 has been computed, leave it as it is for the Sun but multiply -// // by 365.2422/366.2422 for stellar objects, to convert from sidereal to -// // solar time. Finally compute: -// // -// // Rise time = MT - HA0 -// // Set time = MT + HA0 -// // -// // convert the times from degrees to hours by dividing by 15. -// // -// // If you'd like to check that your calculations are accurate or just -// // need a quick result, check the USNO's Sun or Moon Rise/Set Table, -// // <URL:http://aa.usno.navy.mil/AA/data/docs/RS_OneYear.html>. -// -// double result = MT + (rise ? -HA0 : HA0); // in degrees -// -// // Find UT midnight on this day -// long midnight = DAY_MS * (time / DAY_MS); -// -// return midnight + (long) (result * 3600000 / 15); -// } - //------------------------------------------------------------------------- // The Moon //------------------------------------------------------------------------- @@ -1083,7 +563,7 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() // Calculate the mean longitude and anomaly of the moon, based on // a circular orbit. Similar to the corresponding solar calculation. double meanLongitude = norm2PI(13.1763966*PI/180*day + moonL0); - meanAnomalyMoon = norm2PI(meanLongitude - 0.1114041*PI/180 * day - moonP0); + double meanAnomalyMoon = norm2PI(meanLongitude - 0.1114041*PI/180 * day - moonP0); // // Calculate the following corrections: @@ -1109,7 +589,7 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() double a4 = 0.2140*PI/180 * ::sin(2 * meanAnomalyMoon); // Now find the moon's corrected longitude - moonLongitude = meanLongitude + evection + center - annual + a4; + double moonLongitude = meanLongitude + evection + center - annual + a4; // // And finally, find the variation, caused by the fact that the sun's @@ -1149,7 +629,6 @@ const CalendarAstronomer::Equatorial& CalendarAstronomer::getMoonPosition() * current ecliptic longitudes of the sun and the moon, * measured in radians. * - * @see #getMoonPhase * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ @@ -1165,56 +644,16 @@ double CalendarAstronomer::getMoonAge() { return norm2PI(moonEclipLong - sunLongitude); } -/** - * Calculate the phase of the moon at the time set in this object. - * The returned phase is a <code>double</code> in the range - * <code>0 <= phase < 1</code>, interpreted as follows: - * <ul> - * <li>0.00: New moon - * <li>0.25: First quarter - * <li>0.50: Full moon - * <li>0.75: Last quarter - * </ul> - * - * @see #getMoonAge - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -double CalendarAstronomer::getMoonPhase() { - // See page 147 of "Practical Astronomy with your Calculator", - // by Peter Duffet-Smith, for details on the algorithm. - return 0.5 * (1 - cos(getMoonAge())); -} - /** * Constant representing a new moon. * For use with {@link #getMoonTime getMoonTime} * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -const CalendarAstronomer::MoonAge CalendarAstronomer::NEW_MOON() { +CalendarAstronomer::MoonAge CalendarAstronomer::NEW_MOON() { return CalendarAstronomer::MoonAge(0); } -/** - * Constant representing the moon's first quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*const CalendarAstronomer::MoonAge CalendarAstronomer::FIRST_QUARTER() { - return CalendarAstronomer::MoonAge(CalendarAstronomer::PI/2); -}*/ - -/** - * Constant representing a full moon. - * For use with {@link #getMoonTime getMoonTime} - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -const CalendarAstronomer::MoonAge CalendarAstronomer::FULL_MOON() { - return CalendarAstronomer::MoonAge(CalendarAstronomer::PI); -} /** * Constant representing the moon's last quarter. * For use with {@link #getMoonTime getMoonTime} @@ -1235,63 +674,24 @@ MoonTimeAngleFunc::~MoonTimeAngleFunc() {} }*/ /** - * Find the next or previous time at which the Moon's ecliptic - * longitude will have the desired value. + * Find the next or previous time at which the moon will be in the + * desired phase. * <p> - * @param desired The desired longitude. + * @param desired The desired phase of the moon. * @param next <tt>true</tt> if the next occurrence of the phase * is desired, <tt>false</tt> for the previous occurrence. * @internal * @deprecated ICU 2.4. This class may be removed or modified. */ -UDate CalendarAstronomer::getMoonTime(double desired, UBool next) -{ +UDate CalendarAstronomer::getMoonTime(const CalendarAstronomer::MoonAge& desired, UBool next) { MoonTimeAngleFunc func; return timeOfAngle( func, - desired, + desired.value, SYNODIC_MONTH, MINUTE_MS, next); } -/** - * Find the next or previous time at which the moon will be in the - * desired phase. - * <p> - * @param desired The desired phase of the moon. - * @param next <tt>true</tt> if the next occurrence of the phase - * is desired, <tt>false</tt> for the previous occurrence. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -UDate CalendarAstronomer::getMoonTime(const CalendarAstronomer::MoonAge& desired, UBool next) { - return getMoonTime(desired.value, next); -} - -class MoonRiseSetCoordFunc : public CalendarAstronomer::CoordFunc { -public: - virtual ~MoonRiseSetCoordFunc(); - virtual void eval(CalendarAstronomer::Equatorial& result, CalendarAstronomer& a) override { result = a.getMoonPosition(); } -}; - -MoonRiseSetCoordFunc::~MoonRiseSetCoordFunc() {} - -/** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -UDate CalendarAstronomer::getMoonRiseSet(UBool rise) -{ - MoonRiseSetCoordFunc func; - return riseOrSet(func, - rise, - .533 * DEG_RAD, // Angular Diameter - 34 /60.0 * DEG_RAD, // Refraction correction - MINUTE_MS); // Desired accuracy -} - //------------------------------------------------------------------------- // Interpolation methods for finding the time at which a given event occurs //------------------------------------------------------------------------- @@ -1364,48 +764,7 @@ UDate CalendarAstronomer::timeOfAngle(AngleFunc& func, double desired, return fTime; } -UDate CalendarAstronomer::riseOrSet(CoordFunc& func, UBool rise, - double diameter, double refraction, - double epsilon) -{ - Equatorial pos; - double tanL = ::tan(fLatitude); - double deltaT = 0; - int32_t count = 0; - - // - // Calculate the object's position at the current time, then use that - // position to calculate the time of rising or setting. The position - // will be different at that time, so iterate until the error is allowable. - // - U_DEBUG_ASTRO_MSG(("setup rise=%s, dia=%.3lf, ref=%.3lf, eps=%.3lf\n", - rise?"T":"F", diameter, refraction, epsilon)); - do { - // See "Practical Astronomy With Your Calculator, section 33. - func.eval(pos, *this); - double angle = ::acos(-tanL * ::tan(pos.declination)); - double lst = ((rise ? CalendarAstronomer_PI2-angle : angle) + pos.ascension ) * 24 / CalendarAstronomer_PI2; - - // Convert from LST to Universal Time. - UDate newTime = lstToUT( lst ); - - deltaT = newTime - fTime; - setTime(newTime); - U_DEBUG_ASTRO_MSG(("%d] dT=%.3lf, angle=%.3lf, lst=%.3lf, A=%.3lf/D=%.3lf\n", - count, deltaT, angle, lst, pos.ascension, pos.declination)); - } - while (++ count < 5 && uprv_fabs(deltaT) > epsilon); - - // Calculate the correction due to refraction and the object's angular diameter - double cosD = ::cos(pos.declination); - double psi = ::acos(sin(fLatitude) / cosD); - double x = diameter / 2 + refraction; - double y = ::asin(sin(x) / ::sin(psi)); - long delta = (long)((240 * y * RAD_DEG / cosD)*SECOND_MS); - - return fTime + (rise ? -delta : delta); -} - /** +/** * Return the obliquity of the ecliptic (the angle between the ecliptic * and the earth's equator) at the current time. This varies due to * the precession of the earth's axis. @@ -1414,19 +773,16 @@ UDate CalendarAstronomer::riseOrSet(CoordFunc& func, UBool rise, * measured in radians. */ double CalendarAstronomer::eclipticObliquity() { - if (isINVALID(eclipObliquity)) { - const double epoch = 2451545.0; // 2000 AD, January 1.5 + const double epoch = 2451545.0; // 2000 AD, January 1.5 - double T = (getJulianDay() - epoch) / 36525; + double T = (getJulianDay() - epoch) / 36525; - eclipObliquity = 23.439292 - - 46.815/3600 * T - - 0.0006/3600 * T*T - + 0.00181/3600 * T*T*T; + double eclipObliquity = 23.439292 + - 46.815/3600 * T + - 0.0006/3600 * T*T + + 0.00181/3600 * T*T*T; - eclipObliquity *= DEG_RAD; - } - return eclipObliquity; + return eclipObliquity * DEG_RAD; } @@ -1437,45 +793,13 @@ void CalendarAstronomer::clearCache() { const double INVALID = uprv_getNaN(); julianDay = INVALID; - julianCentury = INVALID; sunLongitude = INVALID; meanAnomalySun = INVALID; - moonLongitude = INVALID; moonEclipLong = INVALID; - meanAnomalyMoon = INVALID; - eclipObliquity = INVALID; - siderealTime = INVALID; - siderealT0 = INVALID; + moonPositionSet = false; } -//private static void out(String s) { -// System.out.println(s); -//} - -//private static String deg(double rad) { -// return Double.toString(rad * RAD_DEG); -//} - -//private static String hours(long ms) { -// return Double.toString((double)ms / HOUR_MS) + " hours"; -//} - -/** - * @internal - * @deprecated ICU 2.4. This class may be removed or modified. - */ -/*UDate CalendarAstronomer::local(UDate localMillis) { - // TODO - srl ? - TimeZone *tz = TimeZone::createDefault(); - int32_t rawOffset; - int32_t dstOffset; - UErrorCode status = U_ZERO_ERROR; - tz->getOffset(localMillis, true, rawOffset, dstOffset, status); - delete tz; - return localMillis - rawOffset; -}*/ - // Debugging functions UnicodeString CalendarAstronomer::Ecliptic::toString() const { @@ -1484,7 +808,7 @@ UnicodeString CalendarAstronomer::Ecliptic::toString() const snprintf(tmp, sizeof(tmp), "[%.5f,%.5f]", longitude*RAD_DEG, latitude*RAD_DEG); return UnicodeString(tmp, ""); #else - return UnicodeString(); + return {}; #endif } @@ -1496,37 +820,10 @@ UnicodeString CalendarAstronomer::Equatorial::toString() const (ascension*RAD_DEG), (declination*RAD_DEG)); return UnicodeString(tmp, ""); #else - return UnicodeString(); + return {}; #endif } -UnicodeString CalendarAstronomer::Horizon::toString() const -{ -#ifdef U_DEBUG_ASTRO - char tmp[800]; - snprintf(tmp, sizeof(tmp), "[%.5f,%.5f]", altitude*RAD_DEG, azimuth*RAD_DEG); - return UnicodeString(tmp, ""); -#else - return UnicodeString(); -#endif -} - - -// static private String radToHms(double angle) { -// int hrs = (int) (angle*RAD_HOUR); -// int min = (int)((angle*RAD_HOUR - hrs) * 60); -// int sec = (int)((angle*RAD_HOUR - hrs - min/60.0) * 3600); - -// return Integer.toString(hrs) + "h" + min + "m" + sec + "s"; -// } - -// static private String radToDms(double angle) { -// int deg = (int) (angle*RAD_DEG); -// int min = (int)((angle*RAD_DEG - deg) * 60); -// int sec = (int)((angle*RAD_DEG - deg - min/60.0) * 3600); - -// return Integer.toString(deg) + "\u00b0" + min + "'" + sec + "\""; -// } // =============== Calendar Cache ================ diff --git a/deps/icu-small/source/i18n/astro.h b/deps/icu-small/source/i18n/astro.h index 372a79ac6714cc..ef297c4b3cc063 100644 --- a/deps/icu-small/source/i18n/astro.h +++ b/deps/icu-small/source/i18n/astro.h @@ -31,7 +31,7 @@ U_NAMESPACE_BEGIN * at a given moment in time. Accordingly, each <code>CalendarAstronomer</code> * object has a <code>time</code> property that determines the date * and time for which its calculations are performed. You can set and - * retrieve this property with {@link #setDate setDate}, {@link #getDate getDate} + * retrieve this property with {@link #setTime setTime}, {@link #getTime getTime} * and related methods. * <p> * Almost all of the calculations performed by this class, or by any @@ -72,7 +72,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { * value without worrying about whether other code will modify them. * * @see CalendarAstronomer.Equatorial - * @see CalendarAstronomer.Horizon * @internal */ class U_I18N_API Ecliptic : public UMemory { @@ -141,7 +140,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { * value without worrying about whether other code will modify them. * * @see CalendarAstronomer.Ecliptic - * @see CalendarAstronomer.Horizon * @internal */ class U_I18N_API Equatorial : public UMemory { @@ -201,66 +199,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { double declination; }; - /** - * Represents the position of an object in the sky relative to - * the local horizon. - * The <i>Altitude</i> represents the object's elevation above the horizon, - * with objects below the horizon having a negative altitude. - * The <i>Azimuth</i> is the geographic direction of the object from the - * observer's position, with 0 representing north. The azimuth increases - * clockwise from north. - * <p> - * Note that Horizon objects are immutable and cannot be modified - * once they are constructed. This allows them to be passed and returned by - * value without worrying about whether other code will modify them. - * - * @see CalendarAstronomer.Ecliptic - * @see CalendarAstronomer.Equatorial - * @internal - */ - class U_I18N_API Horizon : public UMemory { - public: - /** - * Constructs a Horizon coordinate object. - * <p> - * @param alt The altitude, measured in radians above the horizon. - * @param azim The azimuth, measured in radians clockwise from north. - * @internal - */ - Horizon(double alt=0, double azim=0) - : altitude(alt), azimuth(azim) { } - - /** - * Setter for Ecliptic Coordinate object - * @param alt The altitude, measured in radians above the horizon. - * @param azim The azimuth, measured in radians clockwise from north. - * @internal - */ - void set(double alt, double azim) { - altitude = alt; - azimuth = azim; - } - - /** - * Return a string representation of this object, with the - * angles measured in degrees. - * @internal - */ - UnicodeString toString() const; - - /** - * The object's altitude above the horizon, in radians. - * @internal - */ - double altitude; - - /** - * The object's direction, in radians clockwise from north. - * @internal - */ - double azimuth; - }; - public: //------------------------------------------------------------------------- // Assorted private data used for conversions @@ -300,22 +238,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ CalendarAstronomer(UDate d); - /** - * Construct a new <code>CalendarAstronomer</code> object with the given - * latitude and longitude. The object's time is set to the current - * date and time. - * <p> - * @param longitude The desired longitude, in <em>degrees</em> east of - * the Greenwich meridian. - * - * @param latitude The desired latitude, in <em>degrees</em>. Positive - * values signify North, negative South. - * - * @see java.util.Date#getTime() - * @internal - */ - CalendarAstronomer(double longitude, double latitude); - /** * Destructor * @internal @@ -333,48 +255,17 @@ class U_I18N_API CalendarAstronomer : public UMemory { * @param aTime the date and time, expressed as the number of milliseconds since * 1/1/1970 0:00 GMT (Gregorian). * - * @see #setDate * @see #getTime * @internal */ void setTime(UDate aTime); - - /** - * Set the current date and time of this <code>CalendarAstronomer</code> object. All - * astronomical calculations are performed based on this time setting. - * - * @param aTime the date and time, expressed as the number of milliseconds since - * 1/1/1970 0:00 GMT (Gregorian). - * - * @see #getTime - * @internal - */ - void setDate(UDate aDate) { setTime(aDate); } - - /** - * Set the current date and time of this <code>CalendarAstronomer</code> object. All - * astronomical calculations are performed based on this time setting. - * - * @param jdn the desired time, expressed as a "julian day number", - * which is the number of elapsed days since - * 1/1/4713 BC (Julian), 12:00 GMT. Note that julian day - * numbers start at <em>noon</em>. To get the jdn for - * the corresponding midnight, subtract 0.5. - * - * @see #getJulianDay - * @see #JULIAN_EPOCH_MS - * @internal - */ - void setJulianDay(double jdn); - /** * Get the current time of this <code>CalendarAstronomer</code> object, * represented as the number of milliseconds since * 1/1/1970 AD 0:00 GMT (Gregorian). * * @see #setTime - * @see #getDate * @internal */ UDate getTime(); @@ -384,58 +275,12 @@ class U_I18N_API CalendarAstronomer : public UMemory { * expressed as a "julian day number", which is the number of elapsed * days since 1/1/4713 BC (Julian), 12:00 GMT. * - * @see #setJulianDay * @see #JULIAN_EPOCH_MS * @internal */ double getJulianDay(); - /** - * Return this object's time expressed in julian centuries: - * the number of centuries after 1/1/1900 AD, 12:00 GMT - * - * @see #getJulianDay - * @internal - */ - double getJulianCentury(); - - /** - * Returns the current Greenwich sidereal time, measured in hours - * @internal - */ - double getGreenwichSidereal(); - -private: - double getSiderealOffset(); public: - /** - * Returns the current local sidereal time, measured in hours - * @internal - */ - double getLocalSidereal(); - - /** - * Converts local sidereal time to Universal Time. - * - * @param lst The Local Sidereal Time, in hours since sidereal midnight - * on this object's current date. - * - * @return The corresponding Universal Time, in milliseconds since - * 1 Jan 1970, GMT. - */ - //private: - double lstToUT(double lst); - - /** - * - * Convert from ecliptic to equatorial coordinates. - * - * @param ecliptic The ecliptic - * @param result Fillin result - * @return reference to result - */ - Equatorial& eclipticToEquatorial(Equatorial& result, const Ecliptic& ecliptic); - /** * Convert from ecliptic to equatorial coordinates. * @@ -447,21 +292,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong, double eclipLat); - /** - * Convert from ecliptic longitude to equatorial coordinates. - * - * @param eclipLong The ecliptic longitude - * - * @return The corresponding point in equatorial coordinates. - * @internal - */ - Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong) ; - - /** - * @internal - */ - Horizon& eclipticToHorizon(Horizon& result, double eclipLong) ; - //------------------------------------------------------------------------- // The Sun //------------------------------------------------------------------------- @@ -484,39 +314,7 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ /*public*/ void getSunLongitude(double julianDay, double &longitude, double &meanAnomaly); - /** - * The position of the sun at this object's current date and time, - * in equatorial coordinates. - * @param result fillin for the result - * @internal - */ - Equatorial& getSunPosition(Equatorial& result); - public: - /** - * Constant representing the vernal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "vernal" refers to the northern hemisphere's seasons. - * @internal - */ -// static double VERNAL_EQUINOX(); - - /** - * Constant representing the summer solstice. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "summer" refers to the northern hemisphere's seasons. - * @internal - */ - static double SUMMER_SOLSTICE(); - - /** - * Constant representing the autumnal equinox. - * For use with {@link #getSunTime getSunTime}. - * Note: In this case, "autumn" refers to the northern hemisphere's seasons. - * @internal - */ -// static double AUTUMN_EQUINOX(); - /** * Constant representing the winter solstice. * For use with {@link #getSunTime getSunTime}. @@ -532,20 +330,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ UDate getSunTime(double desired, UBool next); - /** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * - * NOTE: This method only works well if this object is set to a - * time near local noon. Because of variations between the local - * official time zone and the geographic longitude, the - * computation can flop over into an adjacent day if this object - * is set to a time near local midnight. - * - * @internal - */ - UDate getSunRiseSet(UBool rise); - //------------------------------------------------------------------------- // The Moon //------------------------------------------------------------------------- @@ -569,22 +353,6 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ double getMoonAge(); - /** - * Calculate the phase of the moon at the time set in this object. - * The returned phase is a <code>double</code> in the range - * <code>0 <= phase < 1</code>, interpreted as follows: - * <ul> - * <li>0.00: New moon - * <li>0.25: First quarter - * <li>0.50: Full moon - * <li>0.75: Last quarter - * </ul> - * - * @see #getMoonAge - * @internal - */ - double getMoonPhase(); - class U_I18N_API MoonAge : public UMemory { public: MoonAge(double l) @@ -598,28 +366,7 @@ class U_I18N_API CalendarAstronomer : public UMemory { * For use with {@link #getMoonTime getMoonTime} * @internal */ - static const MoonAge NEW_MOON(); - - /** - * Constant representing the moon's first quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ -// static const MoonAge FIRST_QUARTER(); - - /** - * Constant representing a full moon. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ - static const MoonAge FULL_MOON(); - - /** - * Constant representing the moon's last quarter. - * For use with {@link #getMoonTime getMoonTime} - * @internal - */ -// static const MoonAge LAST_QUARTER(); + static MoonAge NEW_MOON(); /** * Find the next or previous time at which the Moon's ecliptic @@ -630,21 +377,13 @@ class U_I18N_API CalendarAstronomer : public UMemory { * is desired, <tt>false</tt> for the previous occurrence. * @internal */ - UDate getMoonTime(double desired, UBool next); UDate getMoonTime(const MoonAge& desired, UBool next); - /** - * Returns the time (GMT) of sunrise or sunset on the local date to which - * this calendar is currently set. - * @internal - */ - UDate getMoonRiseSet(UBool rise); - //------------------------------------------------------------------------- // Interpolation methods for finding the time at which a given event occurs //------------------------------------------------------------------------- - // private +public: class AngleFunc : public UMemory { public: virtual double eval(CalendarAstronomer&) = 0; @@ -652,20 +391,10 @@ class U_I18N_API CalendarAstronomer : public UMemory { }; friend class AngleFunc; +private: UDate timeOfAngle(AngleFunc& func, double desired, double periodDays, double epsilon, UBool next); - class CoordFunc : public UMemory { - public: - virtual void eval(Equatorial& result, CalendarAstronomer&) = 0; - virtual ~CoordFunc(); - }; - friend class CoordFunc; - - double riseOrSet(CoordFunc& func, UBool rise, - double diameter, double refraction, - double epsilon); - //------------------------------------------------------------------------- // Other utility methods //------------------------------------------------------------------------- @@ -691,29 +420,13 @@ class U_I18N_API CalendarAstronomer : public UMemory { */ UDate fTime; - /* These aren't used yet, but they'll be needed for sunset calculations - * and equatorial to horizon coordinate conversions - */ - double fLongitude; - double fLatitude; - double fGmtOffset; - - // // The following fields are used to cache calculated results for improved // performance. These values all depend on the current time setting // of this object, so the clearCache method is provided. - // - double julianDay; - double julianCentury; double sunLongitude; double meanAnomalySun; - double moonLongitude; double moonEclipLong; - double meanAnomalyMoon; - double eclipObliquity; - double siderealT0; - double siderealTime; void clearCache(); diff --git a/deps/icu-small/source/i18n/basictz.cpp b/deps/icu-small/source/i18n/basictz.cpp index 2490fadcc91f7a..65a9e87a1e9124 100644 --- a/deps/icu-small/source/i18n/basictz.cpp +++ b/deps/icu-small/source/i18n/basictz.cpp @@ -140,8 +140,8 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, int32_t initialRaw, initialDst; UnicodeString initialName; - AnnualTimeZoneRule *ar1 = nullptr; - AnnualTimeZoneRule *ar2 = nullptr; + LocalPointer<AnnualTimeZoneRule> ar1; + LocalPointer<AnnualTimeZoneRule> ar2; UnicodeString name; UBool avail; @@ -160,12 +160,14 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, || (tr.getFrom()->getDSTSavings() != 0 && tr.getTo()->getDSTSavings() == 0)) && (date + MILLIS_PER_YEAR > nextTransitionTime)) { - int32_t year, month, dom, dow, doy, mid; + int32_t year, mid; + int8_t month, dom, dow; UDate d; // Get local wall time for the next transition time Grego::timeToFields(nextTransitionTime + initialRaw + initialDst, - year, month, dom, dow, doy, mid); + year, month, dom, dow, mid, status); + if (U_FAILURE(status)) return; int32_t weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); // Create DOW rule DateTimeRule *dtr = new DateTimeRule(month, weekInMonth, dow, mid, DateTimeRule::WALL_TIME); @@ -177,8 +179,8 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, // zone to return wrong offset after the transition. // When we encounter such case, we do not inspect next next // transition for another rule. - ar1 = new AnnualTimeZoneRule(name, initialRaw, tr.getTo()->getDSTSavings(), - dtr, year, AnnualTimeZoneRule::MAX_YEAR); + ar1.adoptInstead(new AnnualTimeZoneRule(name, initialRaw, tr.getTo()->getDSTSavings(), + dtr, year, AnnualTimeZoneRule::MAX_YEAR)); if (tr.getTo()->getRawOffset() == initialRaw) { // Get the next next transition @@ -192,13 +194,14 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, // Get local wall time for the next transition time Grego::timeToFields(tr.getTime() + tr.getFrom()->getRawOffset() + tr.getFrom()->getDSTSavings(), - year, month, dom, dow, doy, mid); + year, month, dom, dow, mid, status); + if (U_FAILURE(status)) return; weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); // Generate another DOW rule dtr = new DateTimeRule(month, weekInMonth, dow, mid, DateTimeRule::WALL_TIME); tr.getTo()->getName(name); - ar2 = new AnnualTimeZoneRule(name, tr.getTo()->getRawOffset(), tr.getTo()->getDSTSavings(), - dtr, year - 1, AnnualTimeZoneRule::MAX_YEAR); + ar2.adoptInstead(new AnnualTimeZoneRule(name, tr.getTo()->getRawOffset(), tr.getTo()->getDSTSavings(), + dtr, year - 1, AnnualTimeZoneRule::MAX_YEAR)); // Make sure this rule can be applied to the specified date avail = ar2->getPreviousStart(date, tr.getFrom()->getRawOffset(), tr.getFrom()->getDSTSavings(), true, d); @@ -206,13 +209,12 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, || initialRaw != tr.getTo()->getRawOffset() || initialDst != tr.getTo()->getDSTSavings()) { // We cannot use this rule as the second transition rule - delete ar2; - ar2 = nullptr; + ar2.adoptInstead(nullptr); } } } } - if (ar2 == nullptr) { + if (ar2.isNull()) { // Try previous transition avail = getPreviousTransition(date, true, tr); if (avail) { @@ -223,30 +225,29 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, // Generate another DOW rule Grego::timeToFields(tr.getTime() + tr.getFrom()->getRawOffset() + tr.getFrom()->getDSTSavings(), - year, month, dom, dow, doy, mid); + year, month, dom, dow, mid, status); + if (U_FAILURE(status)) return; weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); dtr = new DateTimeRule(month, weekInMonth, dow, mid, DateTimeRule::WALL_TIME); tr.getTo()->getName(name); // second rule raw/dst offsets should match raw/dst offsets // at the given time - ar2 = new AnnualTimeZoneRule(name, initialRaw, initialDst, - dtr, ar1->getStartYear() - 1, AnnualTimeZoneRule::MAX_YEAR); + ar2.adoptInstead(new AnnualTimeZoneRule(name, initialRaw, initialDst, + dtr, ar1->getStartYear() - 1, AnnualTimeZoneRule::MAX_YEAR)); // Check if this rule start after the first rule after the specified date avail = ar2->getNextStart(date, tr.getFrom()->getRawOffset(), tr.getFrom()->getDSTSavings(), false, d); if (!avail || d <= nextTransitionTime) { // We cannot use this rule as the second transition rule - delete ar2; - ar2 = nullptr; + ar2.adoptInstead(nullptr); } } } } - if (ar2 == nullptr) { + if (ar2.isNull()) { // Cannot find a good pair of AnnualTimeZoneRule - delete ar1; - ar1 = nullptr; + ar1.adoptInstead(nullptr); } else { // The initial rule should represent the rule before the previous transition ar1->getName(initialName); @@ -274,13 +275,13 @@ BasicTimeZone::getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, initial = new InitialTimeZoneRule(initialName, initialRaw, initialDst); // Set the standard and daylight saving rules - if (ar1 != nullptr && ar2 != nullptr) { + if (ar1.isValid() && ar2.isValid()) { if (ar1->getDSTSavings() != 0) { - dst = ar1; - std = ar2; + dst = ar1.orphan(); + std = ar2.orphan(); } else { - std = ar1; - dst = ar2; + std = ar1.orphan(); + dst = ar2.orphan(); } } } @@ -367,7 +368,7 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, // Mark rules which does not need to be processed for (i = 0; i < ruleCount; i++) { - r = (TimeZoneRule*)orgRules->elementAt(i); + r = static_cast<TimeZoneRule*>(orgRules->elementAt(i)); avail = r->getNextStart(start, res_initial->getRawOffset(), res_initial->getDSTSavings(), false, time); done[i] = !avail; } @@ -390,7 +391,7 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, const TimeZoneRule *toRule = tzt.getTo(); for (i = 0; i < ruleCount; i++) { - r = (TimeZoneRule*)orgRules->elementAt(i); + r = static_cast<TimeZoneRule*>(orgRules->elementAt(i)); if (*r == *toRule) { break; } @@ -483,8 +484,10 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, } } else { // Calculate the transition year - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(tzt.getTime(), year, month, dom, dow, doy, mid); + int32_t year = Grego::timeToYear(tzt.getTime(), status); + if (U_FAILURE(status)) { + return; + } // Re-create the rule ar->getName(name); LocalPointer<AnnualTimeZoneRule> newAr(new AnnualTimeZoneRule(name, ar->getRawOffset(), ar->getDSTSavings(), @@ -511,7 +514,6 @@ BasicTimeZone::getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, // Set the results initial = res_initial.orphan(); transitionRules = filteredRules.orphan(); - return; } void @@ -528,8 +530,8 @@ BasicTimeZone::getOffsetFromLocal(UDate /*date*/, UTimeZoneLocalOption /*nonExis void BasicTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt, int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const { - getOffsetFromLocal(date, (UTimeZoneLocalOption)nonExistingTimeOpt, - (UTimeZoneLocalOption)duplicatedTimeOpt, rawOffset, dstOffset, status); + getOffsetFromLocal(date, static_cast<UTimeZoneLocalOption>(nonExistingTimeOpt), + static_cast<UTimeZoneLocalOption>(duplicatedTimeOpt), rawOffset, dstOffset, status); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/bocsu.cpp b/deps/icu-small/source/i18n/bocsu.cpp index 585415643bab0e..23101696aec9ca 100644 --- a/deps/icu-small/source/i18n/bocsu.cpp +++ b/deps/icu-small/source/i18n/bocsu.cpp @@ -33,22 +33,22 @@ static uint8_t * u_writeDiff(int32_t diff, uint8_t *p) { if(diff>=SLOPE_REACH_NEG_1) { if(diff<=SLOPE_REACH_POS_1) { - *p++=(uint8_t)(SLOPE_MIDDLE+diff); + *p++ = static_cast<uint8_t>(SLOPE_MIDDLE + diff); } else if(diff<=SLOPE_REACH_POS_2) { - *p++=(uint8_t)(SLOPE_START_POS_2+(diff/SLOPE_TAIL_COUNT)); - *p++=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); + *p++ = static_cast<uint8_t>(SLOPE_START_POS_2 + (diff / SLOPE_TAIL_COUNT)); + *p++ = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); } else if(diff<=SLOPE_REACH_POS_3) { - p[2]=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); + p[2] = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); diff/=SLOPE_TAIL_COUNT; - p[1]=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); - *p=(uint8_t)(SLOPE_START_POS_3+(diff/SLOPE_TAIL_COUNT)); + p[1] = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); + *p = static_cast<uint8_t>(SLOPE_START_POS_3 + (diff / SLOPE_TAIL_COUNT)); p+=3; } else { - p[3]=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); + p[3] = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); diff/=SLOPE_TAIL_COUNT; - p[2]=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); + p[2] = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); diff/=SLOPE_TAIL_COUNT; - p[1]=(uint8_t)(SLOPE_MIN+diff%SLOPE_TAIL_COUNT); + p[1] = static_cast<uint8_t>(SLOPE_MIN + diff % SLOPE_TAIL_COUNT); *p=SLOPE_MAX; p+=4; } @@ -57,22 +57,22 @@ u_writeDiff(int32_t diff, uint8_t *p) { if(diff>=SLOPE_REACH_NEG_2) { NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - *p++=(uint8_t)(SLOPE_START_NEG_2+diff); - *p++=(uint8_t)(SLOPE_MIN+m); + *p++ = static_cast<uint8_t>(SLOPE_START_NEG_2 + diff); + *p++ = static_cast<uint8_t>(SLOPE_MIN + m); } else if(diff>=SLOPE_REACH_NEG_3) { NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - p[2]=(uint8_t)(SLOPE_MIN+m); + p[2] = static_cast<uint8_t>(SLOPE_MIN + m); NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - p[1]=(uint8_t)(SLOPE_MIN+m); - *p=(uint8_t)(SLOPE_START_NEG_3+diff); + p[1] = static_cast<uint8_t>(SLOPE_MIN + m); + *p = static_cast<uint8_t>(SLOPE_START_NEG_3 + diff); p+=3; } else { NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - p[3]=(uint8_t)(SLOPE_MIN+m); + p[3] = static_cast<uint8_t>(SLOPE_MIN + m); NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - p[2]=(uint8_t)(SLOPE_MIN+m); + p[2] = static_cast<uint8_t>(SLOPE_MIN + m); NEGDIVMOD(diff, SLOPE_TAIL_COUNT, m); - p[1]=(uint8_t)(SLOPE_MIN+m); + p[1] = static_cast<uint8_t>(SLOPE_MIN + m); *p=SLOPE_MIN; p+=4; } diff --git a/deps/icu-small/source/i18n/brktrans.h b/deps/icu-small/source/i18n/brktrans.h index 5dcc8c50c02abe..45de01aa596842 100644 --- a/deps/icu-small/source/i18n/brktrans.h +++ b/deps/icu-small/source/i18n/brktrans.h @@ -38,7 +38,7 @@ class BreakTransliterator : public Transliterator { * Constructs a transliterator. * @param adoptedFilter the filter for this transliterator. */ - BreakTransliterator(UnicodeFilter* adoptedFilter = 0); + BreakTransliterator(UnicodeFilter* adoptedFilter = nullptr); /** * Destructor. diff --git a/deps/icu-small/source/i18n/buddhcal.cpp b/deps/icu-small/source/i18n/buddhcal.cpp index dc14af00bf9c36..c99b97e26713c8 100644 --- a/deps/icu-small/source/i18n/buddhcal.cpp +++ b/deps/icu-small/source/i18n/buddhcal.cpp @@ -18,6 +18,7 @@ #if !UCONFIG_NO_FORMATTING #include "buddhcal.h" +#include "gregoimp.h" #include "unicode/gregocal.h" #include "umutex.h" #include <float.h> @@ -35,7 +36,6 @@ static const int32_t kGregorianEpoch = 1970; // used as the default value of BuddhistCalendar::BuddhistCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } BuddhistCalendar::~BuddhistCalendar() @@ -47,12 +47,6 @@ BuddhistCalendar::BuddhistCalendar(const BuddhistCalendar& source) { } -BuddhistCalendar& BuddhistCalendar::operator= ( const BuddhistCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - BuddhistCalendar* BuddhistCalendar::clone() const { return new BuddhistCalendar(*this); @@ -63,17 +57,21 @@ const char *BuddhistCalendar::getType() const return "buddhist"; } -int32_t BuddhistCalendar::handleGetExtendedYear() +int32_t BuddhistCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // EXTENDED_YEAR in BuddhistCalendar is a Gregorian year. // The default value of EXTENDED_YEAR is 1970 (Buddhist 2513) - int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); - } else { - // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc - year = internalGet(UCAL_YEAR, kGregorianEpoch - kBuddhistEraStart) - + kBuddhistEraStart; + return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } + // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc + int32_t year = internalGet(UCAL_YEAR, kGregorianEpoch - kBuddhistEraStart); + if (uprv_add32_overflow(year, kBuddhistEraStart, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } return year; } @@ -90,84 +88,11 @@ int32_t BuddhistCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l { if(field == UCAL_ERA) { return BE; - } else { - return GregorianCalendar::handleGetLimit(field,limitType); - } -} - -#if 0 -void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) -{ - //Calendar::timeToFields(theTime, quick, status); - - int32_t era = internalGet(UCAL_ERA); - int32_t year = internalGet(UCAL_YEAR); - - if(era == GregorianCalendar::BC) { - year = 1-year; - era = BuddhistCalendar::BE; - } else if(era == GregorianCalendar::AD) { - era = BuddhistCalendar::BE; - } else { - status = U_INTERNAL_PROGRAM_ERROR; } - - year = year - kBuddhistEraStart; - - internalSet(UCAL_ERA, era); - internalSet(UCAL_YEAR, year); -} -#endif - -/** - * The system maintains a static default century start date. This is initialized - * the first time it is used. Once the system default century date and year - * are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gBCInitOnce {}; - - -UBool BuddhistCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - BuddhistCalendar calendar(Locale("@calendar=buddhist"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - UDate newStart = calendar.getTime(status); - int32_t newYear = calendar.get(UCAL_YEAR, status); - gSystemDefaultCenturyStartYear = newYear; - gSystemDefaultCenturyStart = newStart; - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate BuddhistCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart and systemDefaultCenturyStartYear - umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t BuddhistCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear and systemDefaultCenturyStart - umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; + return GregorianCalendar::handleGetLimit(field,limitType); } +IMPL_SYSTEM_DEFAULT_CENTURY(BuddhistCalendar, "@calendar=buddhist") U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/buddhcal.h b/deps/icu-small/source/i18n/buddhcal.h index 01b59341c12eda..196b21311fdaa9 100644 --- a/deps/icu-small/source/i18n/buddhcal.h +++ b/deps/icu-small/source/i18n/buddhcal.h @@ -82,13 +82,6 @@ class BuddhistCalendar : public GregorianCalendar { */ BuddhistCalendar(const BuddhistCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - BuddhistCalendar& operator=(const BuddhistCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. @@ -139,10 +132,11 @@ class BuddhistCalendar : public GregorianCalendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Subclasses may override this method to compute several fields * specific to each calendar system. @@ -158,24 +152,9 @@ class BuddhistCalendar : public GregorianCalendar { */ virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - /** - * Returns true because the Buddhist Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; + virtual bool isEra0CountingBackward() const override { return false; } - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 4b6edc87c9147e..f8ab4d636ccafe 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -63,7 +63,6 @@ #include "sharedcalendar.h" #include "unifiedcache.h" #include "ulocimp.h" -#include "bytesinkutil.h" #include "charstr.h" #if !UCONFIG_NO_SERVICE @@ -157,7 +156,7 @@ U_CFUNC void ucal_dump(UCalendar* cal) { #endif /* Max value for stamp allowable before recalculation */ -#define STAMP_MAX 10000 +#define STAMP_MAX 127 static const char * const gCalTypes[] = { "gregorian", @@ -233,7 +232,7 @@ const SharedCalendar *LocaleCacheKey<SharedCalendar>::createObject( static ECalType getCalendarType(const char *s) { for (int i = 0; gCalTypes[i] != nullptr; i++) { if (uprv_stricmp(s, gCalTypes[i]) == 0) { - return (ECalType)i; + return static_cast<ECalType>(i); } } return CALTYPE_UNKNOWN; @@ -259,20 +258,12 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // e.g ja_JP_TRADITIONAL -> ja_JP@calendar=japanese // NOTE: Since ICU-20187, ja_JP_TRADITIONAL no longer canonicalizes, and // the Gregorian calendar is returned instead. - CharString canonicalName; - { - CharStringByteSink sink(&canonicalName); - ulocimp_canonicalize(locid, sink, &status); - } + CharString canonicalName = ulocimp_canonicalize(locid, status); if (U_FAILURE(status)) { return CALTYPE_GREGORIAN; } - CharString calTypeBuf; - { - CharStringByteSink sink(&calTypeBuf); - ulocimp_getKeywordValue(canonicalName.data(), "calendar", sink, &status); - } + CharString calTypeBuf = ulocimp_getKeywordValue(canonicalName.data(), "calendar", status); if (U_SUCCESS(status)) { calType = getCalendarType(calTypeBuf.data()); if (calType != CALTYPE_UNKNOWN) { @@ -283,8 +274,7 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // when calendar keyword is not available or not supported, read supplementalData // to get the default calendar type for the locale's region - char region[ULOC_COUNTRY_CAPACITY]; - (void)ulocimp_getRegionForSupplementalData(canonicalName.data(), true, region, sizeof(region), &status); + CharString region = ulocimp_getRegionForSupplementalData(canonicalName.data(), true, status); if (U_FAILURE(status)) { return CALTYPE_GREGORIAN; } @@ -292,7 +282,7 @@ static ECalType getCalendarTypeForLocale(const char *locid) { // Read preferred calendar values from supplementalData calendarPreference UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status); ures_getByKey(rb, "calendarPreferenceData", rb, &status); - UResourceBundle *order = ures_getByKey(rb, region, nullptr, &status); + UResourceBundle *order = ures_getByKey(rb, region.data(), nullptr, &status); if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) { status = U_ZERO_ERROR; order = ures_getByKey(rb, "001", nullptr, &status); @@ -417,7 +407,7 @@ class BasicCalendarFactory : public LocaleKeyFactory { { if (U_SUCCESS(status)) { for(int32_t i=0;gCalTypes[i] != nullptr;i++) { - UnicodeString id((char16_t)0x40); /* '@' a variant character */ + UnicodeString id(static_cast<char16_t>(0x40)); /* '@' a variant character */ id.append(UNICODE_STRING_SIMPLE("calendar=")); id.append(UnicodeString(gCalTypes[i], -1, US_INV)); result.put(id, (void*)this, status); @@ -443,7 +433,7 @@ class BasicCalendarFactory : public LocaleKeyFactory { lkey->canonicalLocale(canLoc); char keyword[ULOC_FULLNAME_CAPACITY]; - curLoc.getKeywordValue("calendar", keyword, (int32_t) sizeof(keyword), status); + curLoc.getKeywordValue("calendar", keyword, static_cast<int32_t>(sizeof(keyword)), status); #ifdef U_DEBUG_CALSVC fprintf(stderr, "BasicCalendarFactory::create() - cur %s, can %s\n", (const char*)curLoc.getName(), (const char*)canLoc.getName()); @@ -486,7 +476,7 @@ class DefaultCalendarFactory : public ICUResourceBundleFactory { if (ret == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { - ret->append((char16_t)0x40); // '@' is a variant character + ret->append(static_cast<char16_t>(0x40)); // '@' is a variant character ret->append(UNICODE_STRING("calendar=", 9)); ret->append(UnicodeString(gCalTypes[getCalendarTypeForLocale(loc.getName())], -1, US_INV)); } @@ -710,15 +700,12 @@ fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp((int32_t)kMinimumUserStamp), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), -fSkippedWallTime(UCAL_WALLTIME_LAST) +fSkippedWallTime(UCAL_WALLTIME_LAST), +validLocale(Locale::getRoot()), +actualLocale(Locale::getRoot()) { - validLocale[0] = 0; - actualLocale[0] = 0; clear(); if (U_FAILURE(success)) { return; @@ -732,26 +719,23 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) // ------------------------------------- -Calendar::Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success) +Calendar::Calendar(TimeZone* adoptZone, const Locale& aLocale, UErrorCode& success) : UObject(), fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp((int32_t)kMinimumUserStamp), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), -fSkippedWallTime(UCAL_WALLTIME_LAST) +fSkippedWallTime(UCAL_WALLTIME_LAST), +validLocale(Locale::getRoot()), +actualLocale(Locale::getRoot()) { - validLocale[0] = 0; - actualLocale[0] = 0; + LocalPointer<TimeZone> zone(adoptZone, success); if (U_FAILURE(success)) { - delete zone; return; } - if(zone == 0) { + if (zone.isNull()) { #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: ILLEGAL ARG because timezone cannot be 0\n", __FILE__, __LINE__); @@ -761,7 +745,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) } clear(); - fZone = zone; + fZone = zone.orphan(); setWeekData(aLocale, nullptr, success); } @@ -773,15 +757,12 @@ fIsTimeSet(false), fAreFieldsSet(false), fAreAllFieldsSet(false), fAreFieldsVirtuallySet(false), -fNextStamp((int32_t)kMinimumUserStamp), -fTime(0), fLenient(true), -fZone(nullptr), fRepeatedWallTime(UCAL_WALLTIME_LAST), -fSkippedWallTime(UCAL_WALLTIME_LAST) +fSkippedWallTime(UCAL_WALLTIME_LAST), +validLocale(Locale::getRoot()), +actualLocale(Locale::getRoot()) { - validLocale[0] = 0; - actualLocale[0] = 0; if (U_FAILURE(success)) { return; } @@ -789,6 +770,7 @@ fSkippedWallTime(UCAL_WALLTIME_LAST) fZone = zone.clone(); if (fZone == nullptr) { success = U_MEMORY_ALLOCATION_ERROR; + return; } setWeekData(aLocale, nullptr, success); } @@ -805,7 +787,6 @@ Calendar::~Calendar() Calendar::Calendar(const Calendar &source) : UObject(source) { - fZone = nullptr; *this = source; } @@ -816,7 +797,6 @@ Calendar::operator=(const Calendar &right) { if (this != &right) { uprv_arrayCopy(right.fFields, fFields, UCAL_FIELD_COUNT); - uprv_arrayCopy(right.fIsSet, fIsSet, UCAL_FIELD_COUNT); uprv_arrayCopy(right.fStamp, fStamp, UCAL_FIELD_COUNT); fTime = right.fTime; fIsTimeSet = right.fIsTimeSet; @@ -838,10 +818,8 @@ Calendar::operator=(const Calendar &right) fWeekendCease = right.fWeekendCease; fWeekendCeaseMillis = right.fWeekendCeaseMillis; fNextStamp = right.fNextStamp; - uprv_strncpy(validLocale, right.validLocale, sizeof(validLocale)); - uprv_strncpy(actualLocale, right.actualLocale, sizeof(actualLocale)); - validLocale[sizeof(validLocale)-1] = 0; - actualLocale[sizeof(validLocale)-1] = 0; + validLocale = right.validLocale; + actualLocale = right.actualLocale; } return *this; @@ -1131,7 +1109,7 @@ Calendar::getTimeInMillis(UErrorCode& status) const return 0.0; if ( ! fIsTimeSet) - ((Calendar*)this)->updateTime(status); + const_cast<Calendar*>(this)->updateTime(status); /* Test for buffer overflows */ if(U_FAILURE(status)) { @@ -1177,13 +1155,9 @@ Calendar::setTimeInMillis( double millis, UErrorCode& status ) { fAreFieldsSet = fAreAllFieldsSet = false; fIsTimeSet = fAreFieldsVirtuallySet = true; - for (int32_t i=0; i<UCAL_FIELD_COUNT; ++i) { - fFields[i] = 0; - fStamp[i] = kUnset; - fIsSet[i] = false; - } - - + uprv_memset(fFields, 0, sizeof(fFields)); + uprv_memset(fStamp, kUnset, sizeof(fStamp)); + fNextStamp = kMinimumUserStamp; } // ------------------------------------- @@ -1201,7 +1175,7 @@ Calendar::get(UCalendarDateFields field, UErrorCode& status) const // field values are only computed when actually requested; for more on when computation // of various things happens, see the "data flow in Calendar" description at the top // of this file - if (U_SUCCESS(status)) ((Calendar*)this)->complete(status); // Cast away const + if (U_SUCCESS(status)) const_cast<Calendar*>(this)->complete(status); // Cast away const return U_SUCCESS(status) ? fFields[field] : 0; } @@ -1218,12 +1192,11 @@ Calendar::set(UCalendarDateFields field, int32_t value) computeFields(ec); } fFields[field] = value; - /* Ensure that the fNextStamp value doesn't go pass max value for int32_t */ + /* Ensure that the fNextStamp value doesn't go pass max value for int8_t */ if (fNextStamp == STAMP_MAX) { recalculateStamp(); } fStamp[field] = fNextStamp++; - fIsSet[field] = true; // Remove later fIsTimeSet = fAreFieldsSet = fAreFieldsVirtuallySet = false; } @@ -1265,26 +1238,39 @@ Calendar::set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t m // ------------------------------------- int32_t Calendar::getRelatedYear(UErrorCode &status) const { - return get(UCAL_EXTENDED_YEAR, status); + int32_t year = get(UCAL_EXTENDED_YEAR, status); + if (U_FAILURE(status)) { + return 0; + } + if (uprv_add32_overflow(year, getRelatedYearDifference(), &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; } // ------------------------------------- void Calendar::setRelatedYear(int32_t year) { // set extended year + if (uprv_add32_overflow(year, -getRelatedYearDifference(), &year)) { + return; + } set(UCAL_EXTENDED_YEAR, year); } +int32_t Calendar::getRelatedYearDifference() const { + return 0; +} + // ------------------------------------- void Calendar::clear() { - for (int32_t i=0; i<UCAL_FIELD_COUNT; ++i) { - fFields[i] = 0; // Must do this; other code depends on it - fStamp[i] = kUnset; - fIsSet[i] = false; // Remove later - } + uprv_memset(fFields, 0, sizeof(fFields)); + uprv_memset(fStamp, kUnset, sizeof(fStamp)); + fNextStamp = kMinimumUserStamp; fIsTimeSet = fAreFieldsSet = fAreAllFieldsSet = fAreFieldsVirtuallySet = false; // fTime is not 'cleared' - may be used if no fields are set. } @@ -1306,12 +1292,10 @@ Calendar::clear(UCalendarDateFields field) if (field == UCAL_MONTH) { fFields[UCAL_ORDINAL_MONTH] = 0; fStamp[UCAL_ORDINAL_MONTH] = kUnset; - fIsSet[UCAL_ORDINAL_MONTH] = false; // Remove later } if (field == UCAL_ORDINAL_MONTH) { fFields[UCAL_MONTH] = 0; fStamp[UCAL_MONTH] = kUnset; - fIsSet[UCAL_MONTH] = false; // Remove later } fIsTimeSet = fAreFieldsSet = fAreAllFieldsSet = fAreFieldsVirtuallySet = false; } @@ -1331,7 +1315,7 @@ Calendar::isSet(UCalendarDateFields field) const int32_t Calendar::newestStamp(UCalendarDateFields first, UCalendarDateFields last, int32_t bestStampSoFar) const { int32_t bestStamp = bestStampSoFar; - for (int32_t i=(int32_t)first; i<=(int32_t)last; ++i) { + for (int32_t i = static_cast<int32_t>(first); i <= static_cast<int32_t>(last); ++i) { if (fStamp[i] > bestStamp) { bestStamp = fStamp[i]; } @@ -1444,10 +1428,8 @@ void Calendar::computeFields(UErrorCode &ec) for (int32_t i=0; i<UCAL_FIELD_COUNT; ++i) { if ((mask & 1) == 0) { fStamp[i] = kInternallySet; - fIsSet[i] = true; // Remove later } else { fStamp[i] = kUnset; - fIsSet[i] = false; // Remove later } mask >>= 1; } @@ -1462,16 +1444,22 @@ void Calendar::computeFields(UErrorCode &ec) // 11/6/00 int32_t millisInDay; - int32_t days = ClockMath::floorDivide(localMillis, kOneDay, &millisInDay); + double days = ClockMath::floorDivide( + localMillis, U_MILLIS_PER_DAY, &millisInDay) + + kEpochStartAsJulianDay; + if (days > INT32_MAX || days < INT32_MIN) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - internalSet(UCAL_JULIAN_DAY,days + kEpochStartAsJulianDay); + internalSet(UCAL_JULIAN_DAY, static_cast<int32_t>(days)); #if defined (U_DEBUG_CAL) //fprintf(stderr, "%s:%d- Hmm! Jules @ %d, as per %.0lf millis\n", //__FILE__, __LINE__, fFields[UCAL_JULIAN_DAY], localMillis); #endif - computeGregorianAndDOWFields(fFields[UCAL_JULIAN_DAY], ec); + computeGregorianFields(fFields[UCAL_JULIAN_DAY], ec); // Call framework method to have subclass compute its fields. // These must include, at a minimum, MONTH, DAY_OF_MONTH, @@ -1532,42 +1520,16 @@ void Calendar::computeFields(UErrorCode &ec) U_ASSERT(fFields[UCAL_DST_OFFSET] <= getMaximum(UCAL_DST_OFFSET)); } -uint8_t Calendar::julianDayToDayOfWeek(double julian) +uint8_t Calendar::julianDayToDayOfWeek(int32_t julian) { // If julian is negative, then julian%7 will be negative, so we adjust // accordingly. We add 1 because Julian day 0 is Monday. - int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7); + int8_t dayOfWeek = static_cast<int8_t>((julian + 1LL) % 7); - uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+UCAL_SUNDAY ) : UCAL_SUNDAY)); + uint8_t result = static_cast<uint8_t>(dayOfWeek + ((dayOfWeek < 0) ? (7 + UCAL_SUNDAY) : UCAL_SUNDAY)); return result; } -/** -* Compute the Gregorian calendar year, month, and day of month from -* the given Julian day. These values are not stored in fields, but in -* member variables gregorianXxx. Also compute the DAY_OF_WEEK and -* DOW_LOCAL fields. -*/ -void Calendar::computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec) -{ - computeGregorianFields(julianDay, ec); - if (U_FAILURE(ec)) { - return; - } - - // Compute day of week: JD 0 = Monday - int32_t dow = julianDayToDayOfWeek(julianDay); - internalSet(UCAL_DAY_OF_WEEK,dow); - - // Calculate 1-based localized day of week - int32_t dowLocal = dow - getFirstDayOfWeek() + 1; - if (dowLocal < 1) { - dowLocal += 7; - } - internalSet(UCAL_DOW_LOCAL,dowLocal); - fFields[UCAL_DOW_LOCAL] = dowLocal; -} - /** * Compute the Gregorian calendar year, month, and day of month from the * Julian day. These values are not stored in fields, but in member @@ -1579,8 +1541,20 @@ void Calendar::computeGregorianFields(int32_t julianDay, UErrorCode& ec) { if (U_FAILURE(ec)) { return; } - int32_t gregorianDayOfWeekUnused; - Grego::dayToFields(julianDay - kEpochStartAsJulianDay, fGregorianYear, fGregorianMonth, fGregorianDayOfMonth, gregorianDayOfWeekUnused, fGregorianDayOfYear); + if (uprv_add32_overflow( + julianDay, -kEpochStartAsJulianDay, &julianDay)) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + int8_t dayOfWeek; + Grego::dayToFields(julianDay, fGregorianYear, fGregorianMonth, + fGregorianDayOfMonth, + dayOfWeek, + fGregorianDayOfYear, ec); + if (U_FAILURE(ec)) { + return; + } + internalSet(UCAL_DAY_OF_WEEK, dayOfWeek); } /** @@ -1607,8 +1581,18 @@ void Calendar::computeWeekFields(UErrorCode &ec) { if(U_FAILURE(ec)) { return; } - int32_t eyear = fFields[UCAL_EXTENDED_YEAR]; + + // Compute day of week: JD 0 = Monday int32_t dayOfWeek = fFields[UCAL_DAY_OF_WEEK]; + int32_t firstDayOfWeek = getFirstDayOfWeek(); + // Calculate 1-based localized day of week + int32_t dowLocal = dayOfWeek - firstDayOfWeek + 1; + if (dowLocal < 1) { + dowLocal += 7; + } + internalSet(UCAL_DOW_LOCAL,dowLocal); + + int32_t eyear = fFields[UCAL_EXTENDED_YEAR]; int32_t dayOfYear = fFields[UCAL_DAY_OF_YEAR]; // WEEK_OF_YEAR start @@ -1621,10 +1605,11 @@ void Calendar::computeWeekFields(UErrorCode &ec) { // first week of the next year. ASSUME that the year length is less than // 7000 days. int32_t yearOfWeekOfYear = eyear; - int32_t relDow = (dayOfWeek + 7 - getFirstDayOfWeek()) % 7; // 0..6 - int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - getFirstDayOfWeek()) % 7; // 0..6 + int32_t relDow = (dayOfWeek + 7 - firstDayOfWeek) % 7; // 0..6 + int32_t relDowJan1 = (dayOfWeek - dayOfYear + 7001 - firstDayOfWeek) % 7; // 0..6 int32_t woy = (dayOfYear - 1 + relDowJan1) / 7; // 0..53 - if ((7 - relDowJan1) >= getMinimalDaysInFirstWeek()) { + int32_t minimalDaysInFirstWeek = getMinimalDaysInFirstWeek(); + if ((7 - relDowJan1) >= minimalDaysInFirstWeek) { ++woy; } @@ -1636,11 +1621,13 @@ void Calendar::computeWeekFields(UErrorCode &ec) { // to handle the case in which we are the first week of the // next year. - int32_t prevDoy = dayOfYear + handleGetYearLength(eyear - 1); + int32_t prevDoy = dayOfYear + handleGetYearLength(eyear - 1, ec); + if(U_FAILURE(ec)) return; woy = weekNumber(prevDoy, dayOfWeek); yearOfWeekOfYear--; } else { - int32_t lastDoy = handleGetYearLength(eyear); + int32_t lastDoy = handleGetYearLength(eyear, ec); + if(U_FAILURE(ec)) return; // Fast check: For it to be week 1 of the next year, the DOY // must be on or after L-5, where L is yearLength(), then it // cannot possibly be week 1 of the next year: @@ -1652,7 +1639,7 @@ void Calendar::computeWeekFields(UErrorCode &ec) { if (lastRelDow < 0) { lastRelDow += 7; } - if (((6 - lastRelDow) >= getMinimalDaysInFirstWeek()) && + if (((6 - lastRelDow) >= minimalDaysInFirstWeek) && ((dayOfYear + 7 - relDow) > lastDoy)) { woy = 1; yearOfWeekOfYear++; @@ -1728,7 +1715,7 @@ void Calendar::handleComputeFields(int32_t /* julianDay */, UErrorCode& status) void Calendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { - roll((UCalendarDateFields)field, amount, status); + roll(static_cast<UCalendarDateFields>(field), amount, status); } void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) UPRV_NO_SANITIZE_UNDEFINED { @@ -1759,10 +1746,13 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu { int32_t min = getActualMinimum(field,status); int32_t max = getActualMaximum(field,status); + if (U_FAILURE(status)) { + return; + } int32_t gap = max - min + 1; - int32_t value = internalGet(field) + amount; - value = (value - min) % gap; + int64_t value = internalGet(field); + value = (value + amount - min) % gap; if (value < 0) { value += gap; } @@ -1784,7 +1774,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu { // Assume min == 0 in calculations below double start = getTimeInMillis(status); - int32_t oldHour = internalGet(field); + int64_t oldHour = internalGet(field); int32_t max = getMaximum(field); int32_t newHour = (oldHour + amount) % (max + 1); if (newHour < 0) { @@ -1801,11 +1791,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // DAY_OF_MONTH if, after updating the MONTH field, it is illegal. // E.g., <jan31>.roll(MONTH, 1) -> <feb28> or <feb29>. { - int32_t max = getActualMaximum(UCAL_MONTH, status); - int32_t mon = (internalGet(UCAL_MONTH) + amount) % (max+1); + int32_t max = getActualMaximum(UCAL_MONTH, status) + 1; + int64_t mon = internalGet(UCAL_MONTH); + mon = (mon + amount) % max; if (mon < 0) { - mon += (max + 1); + mon += max; } set(UCAL_MONTH, mon); @@ -1822,16 +1813,19 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // * If era==0 and years go backwards in time, change sign of amount. // * Until we have new API per #9393, we temporarily hardcode knowledge of // which calendars have era 0 years that go backwards. - UBool era0WithYearsThatGoBackwards = false; - int32_t era = get(UCAL_ERA, status); - if (era == 0) { - const char * calType = getType(); - if ( uprv_strcmp(calType,"gregorian")==0 || uprv_strcmp(calType,"roc")==0 || uprv_strcmp(calType,"coptic")==0 ) { - amount = -amount; - era0WithYearsThatGoBackwards = true; + int32_t era = internalGet(UCAL_ERA); + if (era == 0 && isEra0CountingBackward()) { + if (uprv_mul32_overflow(amount, -1, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } } - int32_t newYear = internalGet(field) + amount; + int32_t newYear; + if (uprv_add32_overflow( + amount, internalGet(field), &newYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } if (era > 0 || newYear >= 1) { int32_t maxYear = getActualMaximum(field, status); if (maxYear < 32768) { @@ -1848,7 +1842,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu // else we are in era 0 with newYear < 1; // calendars with years that go backwards must pin the year value at 0, // other calendars can have years < 0 in era 0 - } else if (era0WithYearsThatGoBackwards) { + } else if (era == 0 && isEra0CountingBackward()) { newYear = 1; } set(field, newYear); @@ -1859,7 +1853,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu case UCAL_EXTENDED_YEAR: // Rolling the year can involve pinning the DAY_OF_MONTH. - set(field, internalGet(field) + amount); + if (uprv_add32_overflow( + amount, internalGet(field), &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, amount); pinField(UCAL_MONTH,status); pinField(UCAL_DAY_OF_MONTH,status); return; @@ -1931,7 +1930,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu status = U_INTERNAL_PROGRAM_ERROR; return; } - int32_t day_of_month = (internalGet(UCAL_DAY_OF_MONTH) + amount*7 - + int32_t day_of_month = (internalGet(UCAL_DAY_OF_MONTH) + amount*7LL - start) % gap; if (day_of_month < 0) day_of_month += gap; day_of_month += start; @@ -1993,7 +1992,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu status = U_INTERNAL_PROGRAM_ERROR; return; } - int32_t day_of_year = (internalGet(UCAL_DAY_OF_YEAR) + amount*7 - + int32_t day_of_year = (internalGet(UCAL_DAY_OF_YEAR) + amount*7LL - start) % gap; if (day_of_year < 0) day_of_year += gap; day_of_year += start; @@ -2072,7 +2071,12 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu return; } case UCAL_JULIAN_DAY: - set(field, internalGet(field) + amount); + if (uprv_add32_overflow( + amount, internalGet(field), &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, amount); return; default: // Other fields cannot be rolled by this method @@ -2086,7 +2090,7 @@ void Calendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& statu void Calendar::add(EDateFields field, int32_t amount, UErrorCode& status) { - Calendar::add((UCalendarDateFields)field, amount, status); + Calendar::add(static_cast<UCalendarDateFields>(field), amount, status); } // ------------------------------------- @@ -2129,9 +2133,19 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status switch (field) { case UCAL_ERA: - set(field, get(field, status) + amount); + { + int32_t era = get(UCAL_ERA, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_add32_overflow(era, amount, &era)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(UCAL_ERA, era); pinField(UCAL_ERA, status); return; + } case UCAL_YEAR: case UCAL_YEAR_WOY: @@ -2143,11 +2157,10 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status // this by applying the amount to the UCAL_EXTENDED_YEAR field; but since // we would still need to handle UCAL_YEAR_WOY as below, might as well // also handle UCAL_YEAR the same way. - int32_t era = get(UCAL_ERA, status); - if (era == 0) { - const char * calType = getType(); - if ( uprv_strcmp(calType,"gregorian")==0 || uprv_strcmp(calType,"roc")==0 || uprv_strcmp(calType,"coptic")==0 ) { - amount = -amount; + if (get(UCAL_ERA, status) == 0 && isEra0CountingBackward()) { + if (uprv_mul32_overflow(amount, -1, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } } } @@ -2159,7 +2172,16 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status { UBool oldLenient = isLenient(); setLenient(true); - set(field, get(field, status) + amount); + int32_t value = get(field, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_add32_overflow(value, amount, &value)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + set(field, value); + pinField(UCAL_DAY_OF_MONTH, status); if(oldLenient==false) { complete(status); /* force recalculate */ @@ -2245,7 +2267,7 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status // to roll over/back the date. For now, this only happens // in Samoa (Pacific/Apia) on Dec 30, 2011. See ticket:9452. int32_t adjAmount = prevOffset - newOffset; - adjAmount = adjAmount >= 0 ? adjAmount % (int32_t)kOneDay : -(-adjAmount % (int32_t)kOneDay); + adjAmount = adjAmount >= 0 ? adjAmount % static_cast<int32_t>(kOneDay) : -(-adjAmount % static_cast<int32_t>(kOneDay)); if (adjAmount != 0) { setTimeInMillis(t + adjAmount, status); newWallTime = get(UCAL_MILLISECONDS_IN_DAY, status); @@ -2281,7 +2303,7 @@ void Calendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status // ------------------------------------- int32_t Calendar::fieldDifference(UDate when, EDateFields field, UErrorCode& status) { - return fieldDifference(when, (UCalendarDateFields) field, status); + return fieldDifference(when, static_cast<UCalendarDateFields>(field), status); } int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UErrorCode& ec) { @@ -2324,6 +2346,7 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr __FILE__, __LINE__, fldName(field)); #endif ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } // Do a binary search @@ -2353,7 +2376,7 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr break; } else { min = max; - max = (int32_t)((uint32_t)(max) << 1); + max = static_cast<int32_t>(static_cast<uint32_t>(max) << 1); if (max == 0) { // Field difference too large to fit into int32_t #if defined (U_DEBUG_CAL) @@ -2361,6 +2384,7 @@ int32_t Calendar::fieldDifference(UDate targetMs, UCalendarDateFields field, UEr __FILE__, __LINE__, fldName(field)); #endif ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } } @@ -2506,7 +2530,7 @@ Calendar::setFirstDayOfWeek(UCalendarDaysOfWeek value) UPRV_NO_SANITIZE_UNDEFINE Calendar::EDaysOfWeek Calendar::getFirstDayOfWeek() const { - return (Calendar::EDaysOfWeek)fFirstDayOfWeek; + return static_cast<Calendar::EDaysOfWeek>(fFirstDayOfWeek); } UCalendarDaysOfWeek @@ -2617,7 +2641,7 @@ UBool Calendar::isWeekend() const { UErrorCode status = U_ZERO_ERROR; - UCalendarDaysOfWeek dayOfWeek = (UCalendarDaysOfWeek)get(UCAL_DAY_OF_WEEK, status); + UCalendarDaysOfWeek dayOfWeek = static_cast<UCalendarDaysOfWeek>(get(UCAL_DAY_OF_WEEK, status)); UCalendarWeekdayType dayType = getDayOfWeekType(dayOfWeek, status); if (U_SUCCESS(status)) { switch (dayType) { @@ -2650,7 +2674,7 @@ Calendar::isWeekend() const int32_t Calendar::getMinimum(EDateFields field) const { - return getLimit((UCalendarDateFields) field,UCAL_LIMIT_MINIMUM); + return getLimit(static_cast<UCalendarDateFields>(field), UCAL_LIMIT_MINIMUM); } int32_t @@ -2663,7 +2687,7 @@ Calendar::getMinimum(UCalendarDateFields field) const int32_t Calendar::getMaximum(EDateFields field) const { - return getLimit((UCalendarDateFields) field,UCAL_LIMIT_MAXIMUM); + return getLimit(static_cast<UCalendarDateFields>(field), UCAL_LIMIT_MAXIMUM); } int32_t @@ -2676,7 +2700,7 @@ Calendar::getMaximum(UCalendarDateFields field) const int32_t Calendar::getGreatestMinimum(EDateFields field) const { - return getLimit((UCalendarDateFields)field,UCAL_LIMIT_GREATEST_MINIMUM); + return getLimit(static_cast<UCalendarDateFields>(field), UCAL_LIMIT_GREATEST_MINIMUM); } int32_t @@ -2689,7 +2713,7 @@ Calendar::getGreatestMinimum(UCalendarDateFields field) const int32_t Calendar::getLeastMaximum(EDateFields field) const { - return getLimit((UCalendarDateFields) field,UCAL_LIMIT_LEAST_MAXIMUM); + return getLimit(static_cast<UCalendarDateFields>(field), UCAL_LIMIT_LEAST_MAXIMUM); } int32_t @@ -2702,7 +2726,7 @@ Calendar::getLeastMaximum(UCalendarDateFields field) const int32_t Calendar::getActualMinimum(EDateFields field, UErrorCode& status) const { - return getActualMinimum((UCalendarDateFields) field, status); + return getActualMinimum(static_cast<UCalendarDateFields>(field), status); } int32_t Calendar::getLimit(UCalendarDateFields field, ELimitType limitType) const { @@ -2807,9 +2831,9 @@ Calendar::inDaylightTime(UErrorCode& status) const } // Force an update of the state of the Calendar. - ((Calendar*)this)->complete(status); // cast away const + const_cast<Calendar*>(this)->complete(status); // cast away const - return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : false); + return U_SUCCESS(status) ? internalGet(UCAL_DST_OFFSET) != 0 : false; } bool @@ -2872,7 +2896,7 @@ void Calendar::validateFields(UErrorCode &status) { } for (int32_t field = 0; U_SUCCESS(status) && (field < UCAL_FIELD_COUNT); field++) { if (fStamp[field] >= kMinimumUserStamp) { - validateField((UCalendarDateFields)field, status); + validateField(static_cast<UCalendarDateFields>(field), status); } } } @@ -2895,12 +2919,18 @@ void Calendar::validateField(UCalendarDateFields field, UErrorCode &status) { int32_t y; switch (field) { case UCAL_DAY_OF_MONTH: - y = handleGetExtendedYear(); - validateField(field, 1, handleGetMonthLength(y, internalGetMonth()), status); + y = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return; + } + validateField(field, 1, handleGetMonthLength(y, internalGetMonth(status), status), status); break; case UCAL_DAY_OF_YEAR: - y = handleGetExtendedYear(); - validateField(field, 1, handleGetYearLength(y), status); + y = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return; + } + validateField(field, 1, handleGetYearLength(y, status), status); break; case UCAL_DAY_OF_WEEK_IN_MONTH: if (internalGet(field) == 0) { @@ -3000,7 +3030,7 @@ UCalendarDateFields Calendar::resolveFields(const UFieldResolutionTable* precede ; } } - return (UCalendarDateFields)bestField; + return static_cast<UCalendarDateFields>(bestField); } const UFieldResolutionTable Calendar::kDatePrecedence[] = @@ -3078,7 +3108,10 @@ void Calendar::computeTime(UErrorCode& status) { } // Compute the Julian day - int32_t julianDay = computeJulianDay(); + int32_t julianDay = computeJulianDay(status); + if (U_FAILURE(status)) { + return; + } double millis = Grego::julianDayToMillis(julianDay); @@ -3098,7 +3131,7 @@ void Calendar::computeTime(UErrorCode& status) { // time and call clear(MONTH) to reset the MONTH to January. This // is legacy behavior. Without this, clear(MONTH) has no effect, // since the internally set JULIAN_DAY is used. - if (fStamp[UCAL_MILLISECONDS_IN_DAY] >= ((int32_t)kMinimumUserStamp) && + if (fStamp[UCAL_MILLISECONDS_IN_DAY] >= static_cast<int32_t>(kMinimumUserStamp) && newestStamp(UCAL_AM_PM, UCAL_MILLISECOND, kUnset) <= fStamp[UCAL_MILLISECONDS_IN_DAY]) { millisInDay = internalGet(UCAL_MILLISECONDS_IN_DAY); } else { @@ -3106,8 +3139,9 @@ void Calendar::computeTime(UErrorCode& status) { } UDate t = 0; - if (fStamp[UCAL_ZONE_OFFSET] >= ((int32_t)kMinimumUserStamp) || fStamp[UCAL_DST_OFFSET] >= ((int32_t)kMinimumUserStamp)) { - t = millis + millisInDay - (internalGet(UCAL_ZONE_OFFSET) + internalGet(UCAL_DST_OFFSET)); + if (fStamp[UCAL_ZONE_OFFSET] >= static_cast<int32_t>(kMinimumUserStamp) || + fStamp[UCAL_DST_OFFSET] >= static_cast<int32_t>(kMinimumUserStamp)) { + t = millis + millisInDay - internalGet(UCAL_ZONE_OFFSET) - internalGet(UCAL_DST_OFFSET); } else { // Compute the time zone offset and DST offset. There are two potential // ambiguities here. We'll assume a 2:00 am (wall time) switchover time @@ -3236,7 +3270,9 @@ double Calendar::computeMillisInDay() { // Don't normalize here; let overflow bump into the next period. // This is consistent with how we handle other fields. millisInDay += internalGet(UCAL_HOUR); - millisInDay += 12 * internalGet(UCAL_AM_PM); // Default works for unset AM_PM + // Treat even number as AM and odd nubmber as PM to align with the + // logic in roll() + millisInDay += (internalGet(UCAL_AM_PM) % 2 == 0) ? 0 : 12; } } @@ -3309,7 +3345,7 @@ int32_t Calendar::computeZoneOffset(double millis, double millisInDay, UErrorCod return rawOffset + dstOffset; } -int32_t Calendar::computeJulianDay() +int32_t Calendar::computeJulianDay(UErrorCode &status) { // We want to see if any of the date fields is newer than the // JULIAN_DAY. If not, then we use JULIAN_DAY. If so, then we do @@ -3319,7 +3355,7 @@ int32_t Calendar::computeJulianDay() // to January. This is legacy behavior. Without this, // clear(MONTH) has no effect, since the internally set JULIAN_DAY // is used. - if (fStamp[UCAL_JULIAN_DAY] >= (int32_t)kMinimumUserStamp) { + if (fStamp[UCAL_JULIAN_DAY] >= static_cast<int32_t>(kMinimumUserStamp)) { int32_t bestStamp = newestStamp(UCAL_ERA, UCAL_DAY_OF_WEEK_IN_MONTH, kUnset); bestStamp = newestStamp(UCAL_YEAR_WOY, UCAL_EXTENDED_YEAR, bestStamp); bestStamp = newestStamp(UCAL_ORDINAL_MONTH, UCAL_ORDINAL_MONTH, bestStamp); @@ -3333,12 +3369,15 @@ int32_t Calendar::computeJulianDay() bestField = UCAL_DAY_OF_MONTH; } - return handleComputeJulianDay(bestField); + return handleComputeJulianDay(bestField, status); } // ------------------------------------------- -int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { +int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode &status) { + if (U_FAILURE(status)) { + return 0; + } UBool useMonth = (bestField == UCAL_DAY_OF_MONTH || bestField == UCAL_WEEK_OF_MONTH || bestField == UCAL_DAY_OF_WEEK_IN_MONTH); @@ -3347,10 +3386,19 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { if (bestField == UCAL_WEEK_OF_YEAR && newerField(UCAL_YEAR_WOY, UCAL_YEAR) == UCAL_YEAR_WOY) { year = internalGet(UCAL_YEAR_WOY); } else { - year = handleGetExtendedYear(); + year = handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return 0; + } } internalSet(UCAL_EXTENDED_YEAR, year); + // Return U_ILLEGAL_ARGUMENT_ERROR if year is too large that may cuase int32_t overflow + // later. + if (year > INT32_MAX / 400) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: bestField= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year); @@ -3363,12 +3411,21 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { int32_t month; if(isSet(UCAL_MONTH) || isSet(UCAL_ORDINAL_MONTH)) { - month = internalGetMonth(); + month = internalGetMonth(status); + if (U_FAILURE(status)) { + return 0; + } } else { - month = getDefaultMonthInYear(year); + month = getDefaultMonthInYear(year, status); + if (U_FAILURE(status)) { + return 0; + } } - int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth); + int32_t julianDay = handleComputeMonthStart(year, useMonth ? month : 0, useMonth, status); + if (U_FAILURE(status)) { + return 0; + } if (bestField == UCAL_DAY_OF_MONTH) { @@ -3377,13 +3434,25 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { if(isSet(UCAL_DAY_OF_MONTH)) { dayOfMonth = internalGet(UCAL_DAY_OF_MONTH,1); } else { - dayOfMonth = getDefaultDayInMonth(year, month); + dayOfMonth = getDefaultDayInMonth(year, month, status); + if (U_FAILURE(status)) { + return 0; + } + } + if (uprv_add32_overflow(dayOfMonth, julianDay, &dayOfMonth)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - return julianDay + dayOfMonth; + return dayOfMonth; } if (bestField == UCAL_DAY_OF_YEAR) { - return julianDay + internalGet(UCAL_DAY_OF_YEAR); + int32_t result; + if (uprv_add32_overflow(internalGet(UCAL_DAY_OF_YEAR), julianDay, &result)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return result; } int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw @@ -3405,7 +3474,10 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { first += 7; } - int32_t dowLocal = getLocalDOW(); + int32_t dowLocal = getLocalDOW(status); + if (U_FAILURE(status)) { + return 0; + } // Find the first target DOW (dowLocal) in the month or year. // Actually, it may be just before the first of the month or year. @@ -3422,7 +3494,12 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // negative. int32_t dim = internalGet(UCAL_DAY_OF_WEEK_IN_MONTH, 1); if (dim >= 0) { - date += 7*(dim - 1); + int32_t temp; + if (uprv_mul32_overflow(7, dim - 1, &temp) || + uprv_add32_overflow(date, temp, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } else { // Move date to the last of this day-of-week in this month, @@ -3431,9 +3508,18 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // past the first of the given day-of-week in this month. // Note that we handle -2, -3, etc. correctly, even though // values < -1 are technically disallowed. - int32_t m = internalGetMonth(UCAL_JANUARY); - int32_t monthLength = handleGetMonthLength(year, m); - date += ((monthLength - date) / 7 + dim + 1) * 7; + int32_t m = internalGetMonth(UCAL_JANUARY, status); + int32_t monthLength = handleGetMonthLength(year, m, status); + if (U_FAILURE(status)) { + return 0; + } + int32_t temp; + if (uprv_add32_overflow((monthLength - date) / 7, dim+1, &temp) || + uprv_mul32_overflow(temp, 7, &temp) || + uprv_add32_overflow(date, temp, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } } else { #if defined (U_DEBUG_CAL) @@ -3448,7 +3534,10 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { // need to be sure to stay in 'real' year. int32_t woy = internalGet(bestField); - int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, false); // jd of day before jan 1 + int32_t nextJulianDay = handleComputeMonthStart(year+1, 0, false, status); // jd of day before jan 1 + if (U_FAILURE(status)) { + return 0; + } int32_t nextFirst = julianDayToDayOfWeek(nextJulianDay + 1) - firstDayOfWeek; if (nextFirst < 0) { // 0..6 ldow of Jan 1 @@ -3491,15 +3580,33 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { } // Now adjust for the week number. - testDate += 7 * (woy - 1); + int32_t weeks; + if (uprv_mul32_overflow(woy-1, 7, &weeks) || + uprv_add32_overflow(weeks, testDate, &testDate)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d - y=%d, y-1=%d doy%d, njd%d (C.F. %d)\n", __FILE__, __LINE__, year, year-1, testDate, julianDay+testDate, nextJulianDay); #endif - if(julianDay+testDate > nextJulianDay) { // is it past Dec 31? (nextJulianDay is day BEFORE year+1's Jan 1) + if (uprv_add32_overflow(julianDay, testDate, &testDate)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(testDate > nextJulianDay) { // is it past Dec 31? (nextJulianDay is day BEFORE year+1's Jan 1) // Fire up the calculating engines.. retry YWOY = (year-1) - julianDay = handleComputeMonthStart(year-1, 0, false); // jd before Jan 1 of previous year + int32_t prevYear; + if (uprv_add32_overflow(year, -1, &prevYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + julianDay = handleComputeMonthStart(prevYear, 0, false, status); // jd before Jan 1 of previous year + if (U_FAILURE(status)) { + return 0; + } first = julianDayToDayOfWeek(julianDay + 1) - firstDayOfWeek; // 0 based local dow of first week if(first < 0) { // 0..6 @@ -3525,36 +3632,57 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { } // Now adjust for the week number. - date += 7 * (internalGet(bestField) - 1); + int32_t weeks = internalGet(bestField); + if (uprv_add32_overflow(weeks, -1, &weeks) || + uprv_mul32_overflow(7, weeks, &weeks) || + uprv_add32_overflow(date, weeks, &date)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - return julianDay + date; + if (uprv_add32_overflow(julianDay, date, &julianDay)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return julianDay; } int32_t -Calendar::getDefaultMonthInYear(int32_t /*eyear*/) +Calendar::getDefaultMonthInYear(int32_t /*eyear*/, UErrorCode& /* status */) { return 0; } int32_t -Calendar::getDefaultDayInMonth(int32_t /*eyear*/, int32_t /*month*/) +Calendar::getDefaultDayInMonth(int32_t /*eyear*/, int32_t /*month*/, UErrorCode& /* status */) { return 1; } -int32_t Calendar::getLocalDOW() +int32_t Calendar::getLocalDOW(UErrorCode& status) { - // Get zero-based localized DOW, valid range 0..6. This is the DOW + if (U_FAILURE(status)) { + return 0; + } + // Get zero-based localized DOW, valid range 0..6. This is the DOW // we are looking for. int32_t dowLocal = 0; switch (resolveFields(kDOWPrecedence)) { case UCAL_DAY_OF_WEEK: - dowLocal = internalGet(UCAL_DAY_OF_WEEK) - fFirstDayOfWeek; + dowLocal = internalGet(UCAL_DAY_OF_WEEK); + if (uprv_add32_overflow(dowLocal, -fFirstDayOfWeek, &dowLocal)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } break; case UCAL_DOW_LOCAL: - dowLocal = internalGet(UCAL_DOW_LOCAL) - 1; + dowLocal = internalGet(UCAL_DOW_LOCAL); + if (uprv_add32_overflow(dowLocal, -1, &dowLocal)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } break; default: break; @@ -3566,8 +3694,11 @@ int32_t Calendar::getLocalDOW() return dowLocal; } -int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // We have UCAL_YEAR_WOY and UCAL_WEEK_OF_YEAR - from those, determine // what year we fall in, so that other code can set it properly. // (code borrowed from computeWeekFields and handleComputeJulianDay) @@ -3577,10 +3708,21 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w UCalendarDateFields bestField = resolveFields(kDatePrecedence); // !! Note: if subclasses have a different table, they should override handleGetExtendedYearFromWeekFields // Now, a local DOW - int32_t dowLocal = getLocalDOW(); // 0..6 + int32_t dowLocal = getLocalDOW(status); // 0..6 + if (U_FAILURE(status)) { + return 0; + } int32_t firstDayOfWeek = getFirstDayOfWeek(); // Localized fdw - int32_t jan1Start = handleComputeMonthStart(yearWoy, 0, false); - int32_t nextJan1Start = handleComputeMonthStart(yearWoy+1, 0, false); // next year's Jan1 start + int32_t jan1Start = handleComputeMonthStart(yearWoy, 0, false, status); + int32_t yearWoyPlus1; + if (uprv_add32_overflow(yearWoy, 1, &yearWoyPlus1)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t nextJan1Start = handleComputeMonthStart(yearWoyPlus1, 0, false, status); // next year's Jan1 start + if (U_FAILURE(status)) { + return 0; + } // At this point julianDay is the 0-based day BEFORE the first day of // January 1, year 1 of the given calendar. If julianDay == 0, it @@ -3657,7 +3799,10 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w case UCAL_DATE: { - int32_t m = internalGetMonth(); + int32_t m = internalGetMonth(status); + if (U_FAILURE(status)) { + return 0; + } if((m == 0) && (woy >= getLeastMaximum(UCAL_WEEK_OF_YEAR))) { return yearWoy+1; // month 0, late woy = in the next year @@ -3681,15 +3826,23 @@ int32_t Calendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t w } } -int32_t Calendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const +int32_t Calendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { - return handleComputeMonthStart(extendedYear, month+1, true) - - handleComputeMonthStart(extendedYear, month, true); + int32_t nextMonth; + if (uprv_add32_overflow(month, 1, &nextMonth)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return handleComputeMonthStart(extendedYear, nextMonth, true, status) - + handleComputeMonthStart(extendedYear, month, true, status); } -int32_t Calendar::handleGetYearLength(int32_t eyear) const { - return handleComputeMonthStart(eyear+1, 0, false) - - handleComputeMonthStart(eyear, 0, false); +int32_t Calendar::handleGetYearLength(int32_t eyear, UErrorCode& status) const +{ + int32_t result = handleComputeMonthStart(eyear+1, 0, false, status) - + handleComputeMonthStart(eyear, 0, false, status); + if (U_FAILURE(status)) return 0; + return result; } int32_t @@ -3713,7 +3866,7 @@ Calendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const } cal->setLenient(true); cal->prepareGetActual(field,false,status); - result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status)); + result = handleGetMonthLength(cal->get(UCAL_EXTENDED_YEAR, status), cal->get(UCAL_MONTH, status), status); delete cal; } break; @@ -3727,7 +3880,7 @@ Calendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const } cal->setLenient(true); cal->prepareGetActual(field,false,status); - result = handleGetYearLength(cal->get(UCAL_EXTENDED_YEAR, status)); + result = handleGetYearLength(cal->get(UCAL_EXTENDED_YEAR, status), status); delete cal; } break; @@ -3984,21 +4137,19 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& } if (U_SUCCESS(status)) { - U_LOCALE_BASED(locBased,*this); - locBased.setLocaleIDs(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status)); + validLocale = Locale(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status)); + actualLocale = Locale(ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status)); } else { status = U_USING_FALLBACK_WARNING; return; } - char region[ULOC_COUNTRY_CAPACITY]; - (void)ulocimp_getRegionForSupplementalData(desiredLocale.getName(), true, region, sizeof(region), &status); + CharString region = ulocimp_getRegionForSupplementalData(desiredLocale.getName(), true, status); // Read week data values from supplementalData week data UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", &status); ures_getByKey(rb, "weekData", rb, &status); - UResourceBundle *weekData = ures_getByKey(rb, region, nullptr, &status); + UResourceBundle *weekData = ures_getByKey(rb, region.data(), nullptr, &status); if (status == U_MISSING_RESOURCE_ERROR && rb != nullptr) { status = U_ZERO_ERROR; weekData = ures_getByKey(rb, "001", nullptr, &status); @@ -4014,11 +4165,11 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& && 1 <= weekDataArr[1] && weekDataArr[1] <= 7 && 1 <= weekDataArr[2] && weekDataArr[2] <= 7 && 1 <= weekDataArr[4] && weekDataArr[4] <= 7) { - fFirstDayOfWeek = (UCalendarDaysOfWeek)weekDataArr[0]; - fMinimalDaysInFirstWeek = (uint8_t)weekDataArr[1]; - fWeekendOnset = (UCalendarDaysOfWeek)weekDataArr[2]; + fFirstDayOfWeek = static_cast<UCalendarDaysOfWeek>(weekDataArr[0]); + fMinimalDaysInFirstWeek = static_cast<uint8_t>(weekDataArr[1]); + fWeekendOnset = static_cast<UCalendarDaysOfWeek>(weekDataArr[2]); fWeekendOnsetMillis = weekDataArr[3]; - fWeekendCease = (UCalendarDaysOfWeek)weekDataArr[4]; + fWeekendCease = static_cast<UCalendarDaysOfWeek>(weekDataArr[4]); fWeekendCeaseMillis = weekDataArr[5]; } else { status = U_INVALID_FORMAT_ERROR; @@ -4075,14 +4226,12 @@ Calendar::updateTime(UErrorCode& status) Locale Calendar::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * Calendar::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + return LocaleBased::getLocaleID(validLocale, actualLocale, type, status); } void @@ -4091,7 +4240,7 @@ Calendar::recalculateStamp() { int32_t currentValue; int32_t j, i; - fNextStamp = 1; + fNextStamp = kInternallySet; for (j = 0; j < UCAL_FIELD_COUNT; j++) { currentValue = STAMP_MAX; @@ -4116,21 +4265,27 @@ Calendar::recalculateStamp() { void Calendar::internalSet(EDateFields field, int32_t value) { - internalSet((UCalendarDateFields) field, value); + internalSet(static_cast<UCalendarDateFields>(field), value); } -int32_t Calendar::internalGetMonth() const { - if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { - return internalGet(UCAL_MONTH); +int32_t Calendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; } - return internalGet(UCAL_ORDINAL_MONTH); + if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) { + return internalGet(UCAL_ORDINAL_MONTH); + } + return internalGet(UCAL_MONTH); } -int32_t Calendar::internalGetMonth(int32_t defaultValue) const { - if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { - return internalGet(UCAL_MONTH, defaultValue); +int32_t Calendar::internalGetMonth(int32_t defaultValue, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } + if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) { + return internalGet(UCAL_ORDINAL_MONTH); } - return internalGet(UCAL_ORDINAL_MONTH); + return internalGet(UCAL_MONTH, defaultValue); } BasicTimeZone* diff --git a/deps/icu-small/source/i18n/casetrn.cpp b/deps/icu-small/source/i18n/casetrn.cpp index 2f9699ee9dc90b..f159171e088d38 100644 --- a/deps/icu-small/source/i18n/casetrn.cpp +++ b/deps/icu-small/source/i18n/casetrn.cpp @@ -91,7 +91,7 @@ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(CaseMapTransliterator) * Constructs a transliterator. */ CaseMapTransliterator::CaseMapTransliterator(const UnicodeString &id, UCaseMapFull *map) : - Transliterator(id, 0), + Transliterator(id, nullptr), fMap(map) { // TODO test incremental mode with context-sensitive text (e.g. greek sigma) diff --git a/deps/icu-small/source/i18n/cecal.cpp b/deps/icu-small/source/i18n/cecal.cpp index 456801ee37081a..da4c3189c57918 100644 --- a/deps/icu-small/source/i18n/cecal.cpp +++ b/deps/icu-small/source/i18n/cecal.cpp @@ -53,7 +53,6 @@ static const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { CECalendar::CECalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); } CECalendar::CECalendar (const CECalendar& other) @@ -65,21 +64,31 @@ CECalendar::~CECalendar() { } -CECalendar& -CECalendar::operator=(const CECalendar& right) -{ - Calendar::operator=(right); - return *this; -} - //------------------------------------------------------------------------- // Calendar framework //------------------------------------------------------------------------- -int32_t -CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/) const +int64_t +CECalendar::handleComputeMonthStart(int32_t eyear,int32_t emonth, UBool /*useMonth*/, UErrorCode& /*status*/) const { - return ceToJD(eyear, emonth, 0, getJDEpochOffset()); + int64_t year64 = eyear; + // handle month > 12, < 0 (e.g. from add/set) + if ( emonth >= 0 ) { + year64 += emonth/13; + emonth %= 13; + } else { + ++emonth; + year64 += emonth/13 - 1; + emonth = emonth%13 + 12; + } + + return ( + getJDEpochOffset() // difference from Julian epoch to 1,1,1 + + 365LL * year64 // number of days from years + + ClockMath::floorDivideInt64(year64, 4LL) // extra day of leap year + + 30 * emonth // number of days from months (months are 0-based) + - 1 // number of days for present month (1 based) + ); } int32_t @@ -88,62 +97,64 @@ CECalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) cons return LIMITS[field][limitType]; } -UBool -CECalendar::haveDefaultCentury() const -{ - return true; -} - //------------------------------------------------------------------------- // Calendar system Conversion methods... //------------------------------------------------------------------------- -int32_t -CECalendar::ceToJD(int32_t year, int32_t month, int32_t date, int32_t jdEpochOffset) -{ - // handle month > 12, < 0 (e.g. from add/set) - if ( month >= 0 ) { - year += month/13; - month %= 13; - } else { - ++month; - year += month/13 - 1; - month = month%13 + 12; - } - return (int32_t) ( - jdEpochOffset // difference from Julian epoch to 1,1,1 - + 365 * year // number of days from years - + ClockMath::floorDivide(year, 4) // extra day of leap year - + 30 * month // number of days from months (months are 0-based) - + date - 1 // number of days for present month (1 based) - ); -} -void -CECalendar::jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day) +namespace { +void jdToCE(int32_t julianDay, int32_t jdEpochOffset, int32_t& year, int32_t& month, int32_t& day, int32_t& doy, UErrorCode& status) { int32_t c4; // number of 4 year cycle (1461 days) int32_t r4; // remainder of 4 year cycle, always positive - c4 = ClockMath::floorDivide(julianDay - jdEpochOffset, 1461, &r4); + if (uprv_add32_overflow(julianDay, -jdEpochOffset, &julianDay)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + c4 = ClockMath::floorDivide(julianDay, 1461, &r4); year = 4 * c4 + (r4/365 - r4/1460); // 4 * <number of 4year cycle> + <years within the last cycle> - int32_t doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year + doy = (r4 == 1460) ? 365 : (r4 % 365); // days in present year month = doy / 30; // 30 -> Coptic/Ethiopic month length up to 12th month day = (doy % 30) + 1; // 1-based days in a month + doy++; // 1-based days in a year. +} +} // namespace + +void +CECalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) +{ + int32_t eyear, month, day, doy; + jdToCE(julianDay, getJDEpochOffset(), eyear, month, day, doy, status); + if (U_FAILURE(status)) return; + int32_t era = extendedYearToEra(eyear); + int32_t year = extendedYearToYear(eyear); + + internalSet(UCAL_EXTENDED_YEAR, eyear); + internalSet(UCAL_ERA, era); + internalSet(UCAL_YEAR, year); + internalSet(UCAL_MONTH, month); + internalSet(UCAL_ORDINAL_MONTH, month); + internalSet(UCAL_DATE, day); + internalSet(UCAL_DAY_OF_YEAR, doy); } static const char* kMonthCode13 = "M13"; const char* CECalendar::getTemporalMonthCode(UErrorCode& status) const { - if (get(UCAL_MONTH, status) == 12) return kMonthCode13; + if (get(UCAL_MONTH, status) == 12) { + return kMonthCode13; + } return Calendar::getTemporalMonthCode(status); } void CECalendar::setTemporalMonthCode(const char* code, UErrorCode& status) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } if (uprv_strcmp(code, kMonthCode13) == 0) { set(UCAL_MONTH, 12); set(UCAL_IS_LEAP_MONTH, 0); diff --git a/deps/icu-small/source/i18n/cecal.h b/deps/icu-small/source/i18n/cecal.h index 16f36a7976c3de..0971e0e75ef339 100644 --- a/deps/icu-small/source/i18n/cecal.h +++ b/deps/icu-small/source/i18n/cecal.h @@ -82,13 +82,6 @@ class U_I18N_API CECalendar : public Calendar { */ virtual ~CECalendar(); - /** - * Default assignment operator - * @param right Calendar object to be copied - * @internal - */ - CECalendar& operator=(const CECalendar& right); - protected: //------------------------------------------------------------------------- // Calendar framework @@ -98,7 +91,7 @@ class U_I18N_API CECalendar : public Calendar { * Return JD of start of given month/extended year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; /** * Calculate the limit for a specified type of limit and field @@ -107,10 +100,10 @@ class U_I18N_API CECalendar : public Calendar { virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; /** - * Returns true because Coptic/Ethiopic Calendar does have a default century + * Compute fields from the JD * @internal */ - virtual UBool haveDefaultCentury() const override; + virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; protected: /** @@ -122,30 +115,16 @@ class U_I18N_API CECalendar : public Calendar { virtual int32_t getJDEpochOffset() const = 0; /** - * Convert an Coptic/Ethiopic year, month, and day to a Julian day. - * - * @param year the extended year - * @param month the month - * @param day the day - * @param jdEpochOffset the epoch offset from Julian epoch - * @return Julian day + * Compute the era from extended year. * @internal */ - static int32_t ceToJD(int32_t year, int32_t month, int32_t date, - int32_t jdEpochOffset); + virtual int32_t extendedYearToEra(int32_t extendedYear) const = 0; /** - * Convert a Julian day to an Coptic/Ethiopic year, month and day - * - * @param julianDay the Julian day - * @param jdEpochOffset the epoch offset from Julian epoch - * @param year receives the extended year - * @param month receives the month - * @param date receives the day + * Compute the year from extended year. * @internal */ - static void jdToCE(int32_t julianDay, int32_t jdEpochOffset, - int32_t& year, int32_t& month, int32_t& day); + virtual int32_t extendedYearToYear(int32_t extendedYear) const = 0; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index c7c573bacc7959..94ece08ce19094 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -24,7 +24,7 @@ #include "umutex.h" #include <float.h> #include "gregoimp.h" // Math -#include "astro.h" // CalendarAstronomer +#include "astro.h" // CalendarAstronomer and CalendarCache #include "unicode/simpletz.h" #include "uhash.h" #include "ucln_in.h" @@ -53,24 +53,25 @@ static void debug_chnsecal_msg(const char *pat, ...) #endif -// --- The cache -- -static icu::UMutex astroLock; -static icu::CalendarAstronomer *gChineseCalendarAstro = nullptr; - // Lazy Creation & Access synchronized by class CalendarCache with a mutex. -static icu::CalendarCache *gChineseCalendarWinterSolsticeCache = nullptr; -static icu::CalendarCache *gChineseCalendarNewYearCache = nullptr; +static icu::CalendarCache *gWinterSolsticeCache = nullptr; +static icu::CalendarCache *gNewYearCache = nullptr; -static icu::TimeZone *gChineseCalendarZoneAstroCalc = nullptr; -static icu::UInitOnce gChineseCalendarZoneAstroCalcInitOnce {}; +static icu::TimeZone *gAstronomerTimeZone = nullptr; +static icu::UInitOnce gAstronomerTimeZoneInitOnce {}; +/* + * The start year of the Chinese calendar, 1CE. + */ +static const int32_t CHINESE_EPOCH_YEAR = 1; // Gregorian year + // /** - * The start year of the Chinese calendar, the 61st year of the reign - * of Huang Di. Some sources use the first year of his reign, - * resulting in EXTENDED_YEAR values 60 years greater and ERA (cycle) - * values one greater. + * The start year of the Chinese calendar for cycle calculation, + * the 61st year of the reign of Huang Di. + * Some sources use the first year of his reign, + * resulting in ERA (cycle) values one greater. */ -static const int32_t CHINESE_EPOCH_YEAR = -2636; // Gregorian year +static const int32_t CYCLE_EPOCH = -2636; // Gregorian year /** * The offset from GMT in milliseconds at which we perform astronomical @@ -89,23 +90,19 @@ static const int32_t SYNODIC_GAP = 25; U_CDECL_BEGIN static UBool calendar_chinese_cleanup() { - if (gChineseCalendarAstro) { - delete gChineseCalendarAstro; - gChineseCalendarAstro = nullptr; + if (gWinterSolsticeCache) { + delete gWinterSolsticeCache; + gWinterSolsticeCache = nullptr; } - if (gChineseCalendarWinterSolsticeCache) { - delete gChineseCalendarWinterSolsticeCache; - gChineseCalendarWinterSolsticeCache = nullptr; + if (gNewYearCache) { + delete gNewYearCache; + gNewYearCache = nullptr; } - if (gChineseCalendarNewYearCache) { - delete gChineseCalendarNewYearCache; - gChineseCalendarNewYearCache = nullptr; + if (gAstronomerTimeZone) { + delete gAstronomerTimeZone; + gAstronomerTimeZone = nullptr; } - if (gChineseCalendarZoneAstroCalc) { - delete gChineseCalendarZoneAstroCalc; - gChineseCalendarZoneAstroCalc = nullptr; - } - gChineseCalendarZoneAstroCalcInitOnce.reset(); + gAstronomerTimeZoneInitOnce.reset(); return true; } U_CDECL_END @@ -121,33 +118,27 @@ U_NAMESPACE_BEGIN //------------------------------------------------------------------------- +namespace { + +const TimeZone* getAstronomerTimeZone(); +int32_t newMoonNear(const TimeZone*, double, UBool, UErrorCode&); +int32_t newYear(const icu::ChineseCalendar::Setting&, int32_t, UErrorCode&); +UBool isLeapMonthBetween(const TimeZone*, int32_t, int32_t, UErrorCode&); + +} // namespace + ChineseCalendar* ChineseCalendar::clone() const { return new ChineseCalendar(*this); } ChineseCalendar::ChineseCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success), - hasLeapMonthBetweenWinterSolstices(false), - fEpochYear(CHINESE_EPOCH_YEAR), - fZoneAstroCalc(getChineseCalZoneAstroCalc()) -{ - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. -} - -ChineseCalendar::ChineseCalendar(const Locale& aLocale, int32_t epochYear, - const TimeZone* zoneAstroCalc, UErrorCode &success) -: Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success), - hasLeapMonthBetweenWinterSolstices(false), - fEpochYear(epochYear), - fZoneAstroCalc(zoneAstroCalc) + hasLeapMonthBetweenWinterSolstices(false) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } ChineseCalendar::ChineseCalendar(const ChineseCalendar& other) : Calendar(other) { hasLeapMonthBetweenWinterSolstices = other.hasLeapMonthBetweenWinterSolstices; - fEpochYear = other.fEpochYear; - fZoneAstroCalc = other.fZoneAstroCalc; } ChineseCalendar::~ChineseCalendar() @@ -158,16 +149,20 @@ const char *ChineseCalendar::getType() const { return "chinese"; } -static void U_CALLCONV initChineseCalZoneAstroCalc() { - gChineseCalendarZoneAstroCalc = new SimpleTimeZone(CHINA_OFFSET, UNICODE_STRING_SIMPLE("CHINA_ZONE") ); +namespace { // anonymous + +static void U_CALLCONV initAstronomerTimeZone() { + gAstronomerTimeZone = new SimpleTimeZone(CHINA_OFFSET, UNICODE_STRING_SIMPLE("CHINA_ZONE") ); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } -const TimeZone* ChineseCalendar::getChineseCalZoneAstroCalc() const { - umtx_initOnce(gChineseCalendarZoneAstroCalcInitOnce, &initChineseCalZoneAstroCalc); - return gChineseCalendarZoneAstroCalc; +const TimeZone* getAstronomerTimeZone() { + umtx_initOnce(gAstronomerTimeZoneInitOnce, &initAstronomerTimeZone); + return gAstronomerTimeZone; } +} // namespace anonymous + //------------------------------------------------------------------------- // Minimum / Maximum access functions //------------------------------------------------------------------------- @@ -222,14 +217,30 @@ int32_t ChineseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li * field as the continuous year count, depending on which is newer. * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleGetExtendedYear() { +int32_t ChineseCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + int32_t year; - if (newestStamp(UCAL_ERA, UCAL_YEAR, kUnset) <= fStamp[UCAL_EXTENDED_YEAR]) { + // if UCAL_EXTENDED_YEAR is not older than UCAL_ERA nor UCAL_YEAR + if (newerField(UCAL_EXTENDED_YEAR, newerField(UCAL_ERA, UCAL_YEAR)) == + UCAL_EXTENDED_YEAR) { year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } else { - int32_t cycle = internalGet(UCAL_ERA, 1) - 1; // 0-based cycle // adjust to the instance specific epoch - year = cycle * 60 + internalGet(UCAL_YEAR, 1) - (fEpochYear - CHINESE_EPOCH_YEAR); + int32_t cycle = internalGet(UCAL_ERA, 1); + year = internalGet(UCAL_YEAR, 1); + // Handle int32 overflow calculation for + // year = year + (cycle-1) * 60 + CYCLE_EPOCH - CHINESE_EPOCH_YEAR + if (uprv_add32_overflow(cycle, -1, &cycle) || // 0-based cycle + uprv_mul32_overflow(cycle, 60, &cycle) || + uprv_add32_overflow(year, cycle, &year) || + uprv_add32_overflow(year, CYCLE_EPOCH-CHINESE_EPOCH_YEAR, + &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } return year; } @@ -242,36 +253,24 @@ int32_t ChineseCalendar::handleGetExtendedYear() { * whether or not the given month is a leap month. * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { - int32_t thisStart = handleComputeMonthStart(extendedYear, month, true) - - kEpochStartAsJulianDay + 1; // Julian day -> local days - int32_t nextStart = newMoonNear(thisStart + SYNODIC_GAP, true); - return nextStart - thisStart; +int32_t ChineseCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { + bool isLeapMonth = internalGet(UCAL_IS_LEAP_MONTH) == 1; + return handleGetMonthLengthWithLeap(extendedYear, month, isLeapMonth, status); } -/** - * Override Calendar to compute several fields specific to the Chinese - * calendar system. These are: - * - * <ul><li>ERA - * <li>YEAR - * <li>MONTH - * <li>DAY_OF_MONTH - * <li>DAY_OF_YEAR - * <li>EXTENDED_YEAR</ul> - * - * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this - * method is called. The getGregorianXxx() methods return Gregorian - * calendar equivalents for the given Julian day. - * - * <p>Compute the ChineseCalendar-specific field IS_LEAP_MONTH. - * @stable ICU 2.8 - */ -void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) { - - computeChineseFields(julianDay - kEpochStartAsJulianDay, // local days - getGregorianYear(), getGregorianMonth(), - true); // set all fields +int32_t ChineseCalendar::handleGetMonthLengthWithLeap(int32_t extendedYear, int32_t month, bool leap, UErrorCode& status) const { + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return 0; + } + int32_t thisStart = handleComputeMonthStartWithLeap(extendedYear, month, leap, status); + if (U_FAILURE(status)) { + return 0; + } + thisStart = thisStart - + kEpochStartAsJulianDay + 1; // Julian day -> local days + int32_t nextStart = newMoonNear(setting.zoneAstroCalc, thisStart + SYNODIC_GAP, true, status); + return nextStart - thisStart; } /** @@ -311,6 +310,21 @@ const UFieldResolutionTable* ChineseCalendar::getFieldResolutionTable() const { return CHINESE_DATE_PRECEDENCE; } +namespace { + +struct MonthInfo { + int32_t month; + int32_t ordinalMonth; + int32_t thisMoon; + bool isLeapMonth; + bool hasLeapMonthBetweenWinterSolstices; +}; +struct MonthInfo computeMonthInfo( + const icu::ChineseCalendar::Setting& setting, + int32_t gyear, int32_t days, UErrorCode& status); + +} // namespace + /** * Return the Julian day number of day before the first day of the * given month in the given extended year. @@ -324,50 +338,57 @@ const UFieldResolutionTable* ChineseCalendar::getFieldResolutionTable() const { * day of the given month and year * @stable ICU 2.8 */ -int32_t ChineseCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const { - ChineseCalendar *nonConstThis = (ChineseCalendar*)this; // cast away const +int64_t ChineseCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const { + bool isLeapMonth = false; + if (useMonth) { + isLeapMonth = internalGet(UCAL_IS_LEAP_MONTH) != 0; + } + return handleComputeMonthStartWithLeap(eyear, month, isLeapMonth, status); +} +int64_t ChineseCalendar::handleComputeMonthStartWithLeap(int32_t eyear, int32_t month, bool isLeapMonth, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { - double m = month; - eyear += (int32_t)ClockMath::floorDivide(m, 12.0, &m); - month = (int32_t)m; + if (uprv_add32_overflow(eyear, ClockMath::floorDivide(month, 12, &month), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - int32_t gyear = eyear + fEpochYear - 1; // Gregorian year - int32_t theNewYear = newYear(gyear); - int32_t newMoon = newMoonNear(theNewYear + month * 29, true); - - int32_t julianDay = newMoon + kEpochStartAsJulianDay; - - // Save fields for later restoration - int32_t saveMonth = internalGet(UCAL_MONTH); - int32_t saveOrdinalMonth = internalGet(UCAL_ORDINAL_MONTH); - int32_t saveIsLeapMonth = internalGet(UCAL_IS_LEAP_MONTH); + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return 0; + } + int32_t gyear = eyear; + int32_t theNewYear = newYear(setting, gyear, status); + int32_t newMoon = newMoonNear(setting.zoneAstroCalc, theNewYear + month * 29, true, status); + if (U_FAILURE(status)) { + return 0; + } - // Ignore IS_LEAP_MONTH field if useMonth is false - int32_t isLeapMonth = useMonth ? saveIsLeapMonth : 0; + int32_t newMonthYear = Grego::dayToYear(newMoon, status); - UErrorCode status = U_ZERO_ERROR; - nonConstThis->computeGregorianFields(julianDay, status); - if (U_FAILURE(status)) + struct MonthInfo monthInfo = computeMonthInfo(setting, newMonthYear, newMoon, status); + if (U_FAILURE(status)) { + return 0; + } + if (month != monthInfo.month-1 || isLeapMonth != monthInfo.isLeapMonth) { + newMoon = newMoonNear(setting.zoneAstroCalc, newMoon + SYNODIC_GAP, true, status); + if (U_FAILURE(status)) { + return 0; + } + } + int32_t julianDay; + if (uprv_add32_overflow(newMoon-1, kEpochStartAsJulianDay, &julianDay)) { + status = U_ILLEGAL_ARGUMENT_ERROR; return 0; - - // This will modify the MONTH and IS_LEAP_MONTH fields (only) - nonConstThis->computeChineseFields(newMoon, getGregorianYear(), - getGregorianMonth(), false); - - if (month != internalGet(UCAL_MONTH) || - isLeapMonth != internalGet(UCAL_IS_LEAP_MONTH)) { - newMoon = newMoonNear(newMoon + SYNODIC_GAP, true); - julianDay = newMoon + kEpochStartAsJulianDay; } - nonConstThis->internalSet(UCAL_MONTH, saveMonth); - nonConstThis->internalSet(UCAL_ORDINAL_MONTH, saveOrdinalMonth); - nonConstThis->internalSet(UCAL_IS_LEAP_MONTH, saveIsLeapMonth); - return julianDay - 1; + return julianDay; } @@ -399,9 +420,75 @@ void ChineseCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& * @stable ICU 2.8 */ void ChineseCalendar::add(EDateFields field, int32_t amount, UErrorCode& status) { - add((UCalendarDateFields)field, amount, status); + add(static_cast<UCalendarDateFields>(field), amount, status); +} + +namespace { + +struct RollMonthInfo { + int32_t month; + int32_t newMoon; + int32_t thisMoon; +}; + +struct RollMonthInfo rollMonth(const TimeZone* timeZone, int32_t amount, int32_t day, int32_t month, int32_t dayOfMonth, + bool isLeapMonth, bool hasLeapMonthBetweenWinterSolstices, + UErrorCode& status) { + struct RollMonthInfo output = {0, 0, 0}; + if (U_FAILURE(status)) { + return output; + } + + output.thisMoon = day - dayOfMonth + 1; // New moon (start of this month) + + // Note throughout the following: Months 12 and 1 are never + // followed by a leap month (D&R p. 185). + + // Compute the adjusted month number m. This is zero-based + // value from 0..11 in a non-leap year, and from 0..12 in a + // leap year. + if (hasLeapMonthBetweenWinterSolstices) { // (member variable) + if (isLeapMonth) { + ++month; + } else { + // Check for a prior leap month. (In the + // following, month 0 is the first month of the + // year.) Month 0 is never followed by a leap + // month, and we know month m is not a leap month. + // moon1 will be the start of month 0 if there is + // no leap month between month 0 and month m; + // otherwise it will be the start of month 1. + int prevMoon = output.thisMoon - + static_cast<int>(CalendarAstronomer::SYNODIC_MONTH * (month - 0.5)); + prevMoon = newMoonNear(timeZone, prevMoon, true, status); + if (U_FAILURE(status)) { + return output; + } + if (isLeapMonthBetween(timeZone, prevMoon, output.thisMoon, status)) { + ++month; + } + if (U_FAILURE(status)) { + return output; + } + } + } + // Now do the standard roll computation on month, with the + // allowed range of 0..n-1, where n is 12 or 13. + int32_t numberOfMonths = hasLeapMonthBetweenWinterSolstices ? 13 : 12; // Months in this year + if (uprv_add32_overflow(amount, month, &amount)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return output; + } + output.newMoon = amount % numberOfMonths; + if (output.newMoon < 0) { + output.newMoon += numberOfMonths; + } + output.month = month; + return output; } +} // namespace + /** * Override Calendar to handle leap months properly. * @stable ICU 2.8 @@ -411,51 +498,18 @@ void ChineseCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode case UCAL_MONTH: case UCAL_ORDINAL_MONTH: if (amount != 0) { - int32_t dom = get(UCAL_DAY_OF_MONTH, status); - if (U_FAILURE(status)) break; + const Setting setting = getSetting(status); int32_t day = get(UCAL_JULIAN_DAY, status) - kEpochStartAsJulianDay; // Get local day + int32_t month = get(UCAL_MONTH, status); // 0-based month + int32_t dayOfMonth = get(UCAL_DAY_OF_MONTH, status); + bool isLeapMonth = get(UCAL_IS_LEAP_MONTH, status) == 1; if (U_FAILURE(status)) break; - int32_t moon = day - dom + 1; // New moon (start of this month) - - // Note throughout the following: Months 12 and 1 are never - // followed by a leap month (D&R p. 185). - - // Compute the adjusted month number m. This is zero-based - // value from 0..11 in a non-leap year, and from 0..12 in a - // leap year. - int32_t m = get(UCAL_MONTH, status); // 0-based month + struct RollMonthInfo r = rollMonth( + setting.zoneAstroCalc, amount, day, month, dayOfMonth, isLeapMonth, + hasLeapMonthBetweenWinterSolstices, status); if (U_FAILURE(status)) break; - if (hasLeapMonthBetweenWinterSolstices) { // (member variable) - if (get(UCAL_IS_LEAP_MONTH, status) == 1) { - ++m; - } else { - // Check for a prior leap month. (In the - // following, month 0 is the first month of the - // year.) Month 0 is never followed by a leap - // month, and we know month m is not a leap month. - // moon1 will be the start of month 0 if there is - // no leap month between month 0 and month m; - // otherwise it will be the start of month 1. - int moon1 = moon - - (int) (CalendarAstronomer::SYNODIC_MONTH * (m - 0.5)); - moon1 = newMoonNear(moon1, true); - if (isLeapMonthBetween(moon1, moon)) { - ++m; - } - } - if (U_FAILURE(status)) break; - } - - // Now do the standard roll computation on m, with the - // allowed range of 0..n-1, where n is 12 or 13. - int32_t n = hasLeapMonthBetweenWinterSolstices ? 13 : 12; // Months in this year - int32_t newM = (m + amount) % n; - if (newM < 0) { - newM += n; - } - - if (newM != m) { - offsetMonth(moon, dom, newM - m, status); + if (r.newMoon != r.month) { + offsetMonth(r.thisMoon, dayOfMonth, r.newMoon - r.month, status); } } break; @@ -466,7 +520,7 @@ void ChineseCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode } void ChineseCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { - roll((UCalendarDateFields)field, amount, status); + roll(static_cast<UCalendarDateFields>(field), amount, status); } @@ -474,46 +528,55 @@ void ChineseCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status // Support methods and constants //------------------------------------------------------------------ +namespace { /** * Convert local days to UTC epoch milliseconds. - * This is not an accurate conversion in that getTimezoneOffset - * takes the milliseconds in GMT (not local time). In theory, more - * accurate algorithm can be implemented but practically we do not need - * to go through that complication as long as the historical timezone - * changes did not happen around the 'tricky' new moon (new moon around - * midnight). - * + * This is not an accurate conversion in that getTimezoneOffset + * takes the milliseconds in GMT (not local time). In theory, more + * accurate algorithm can be implemented but practically we do not need + * to go through that complication as long as the historical timezone + * changes did not happen around the 'tricky' new moon (new moon around + * midnight). + * + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 in the astronomical base zone * @return milliseconds after January 1, 1970 0:00 GMT */ -double ChineseCalendar::daysToMillis(double days) const { - double millis = days * (double)kOneDay; - if (fZoneAstroCalc != nullptr) { +double daysToMillis(const TimeZone* timeZone, double days, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + double millis = days * kOneDay; + if (timeZone != nullptr) { int32_t rawOffset, dstOffset; - UErrorCode status = U_ZERO_ERROR; - fZoneAstroCalc->getOffset(millis, false, rawOffset, dstOffset, status); - if (U_SUCCESS(status)) { - return millis - (double)(rawOffset + dstOffset); + timeZone->getOffset(millis, false, rawOffset, dstOffset, status); + if (U_FAILURE(status)) { + return 0; } + return millis - static_cast<double>(rawOffset + dstOffset); } - return millis - (double)CHINA_OFFSET; + return millis - static_cast<double>(CHINA_OFFSET); } /** * Convert UTC epoch milliseconds to local days. + * @param timeZone time zone for the Astro calculation. * @param millis milliseconds after January 1, 1970 0:00 GMT * @return days after January 1, 1970 0:00 in the astronomical base zone */ -double ChineseCalendar::millisToDays(double millis) const { - if (fZoneAstroCalc != nullptr) { +double millisToDays(const TimeZone* timeZone, double millis, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + if (timeZone != nullptr) { int32_t rawOffset, dstOffset; - UErrorCode status = U_ZERO_ERROR; - fZoneAstroCalc->getOffset(millis, false, rawOffset, dstOffset, status); - if (U_SUCCESS(status)) { - return ClockMath::floorDivide(millis + (double)(rawOffset + dstOffset), kOneDay); + timeZone->getOffset(millis, false, rawOffset, dstOffset, status); + if (U_FAILURE(status)) { + return 0; } + return ClockMath::floorDivide(millis + static_cast<double>(rawOffset + dstOffset), kOneDay); } - return ClockMath::floorDivide(millis + (double)CHINA_OFFSET, kOneDay); + return ClockMath::floorDivide(millis + static_cast<double>(CHINA_OFFSET), kOneDay); } //------------------------------------------------------------------ @@ -525,34 +588,47 @@ double ChineseCalendar::millisToDays(double millis) const { * Return the major solar term on or after December 15 of the given * Gregorian year, that is, the winter solstice of the given year. * Computations are relative to Asia/Shanghai time zone. + * @param setting setting (time zone and caches) for the Astro calculation. * @param gyear a Gregorian year * @return days after January 1, 1970 0:00 Asia/Shanghai of the * winter solstice of the given year */ -int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { +int32_t winterSolstice(const icu::ChineseCalendar::Setting& setting, + int32_t gyear, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + const TimeZone* timeZone = setting.zoneAstroCalc; - UErrorCode status = U_ZERO_ERROR; - int32_t cacheValue = CalendarCache::get(&gChineseCalendarWinterSolsticeCache, gyear, status); + int32_t cacheValue = CalendarCache::get(setting.winterSolsticeCache, gyear, status); + if (U_FAILURE(status)) { + return 0; + } if (cacheValue == 0) { // In books December 15 is used, but it fails for some years // using our algorithms, e.g.: 1298 1391 1492 1553 1560. That // is, winterSolstice(1298) starts search at Dec 14 08:00:00 // PST 1298 with a final result of Dec 14 10:31:59 PST 1299. - double ms = daysToMillis(Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1)); - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); + double ms = daysToMillis(timeZone, Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1), status); + if (U_FAILURE(status)) { + return 0; } - gChineseCalendarAstro->setTime(ms); - UDate solarLong = gChineseCalendarAstro->getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), true); - umtx_unlock(&astroLock); // Winter solstice is 270 degrees solar longitude aka Dongzhi - cacheValue = (int32_t)millisToDays(solarLong); - CalendarCache::put(&gChineseCalendarWinterSolsticeCache, gyear, cacheValue, status); + double days = millisToDays(timeZone, + CalendarAstronomer(ms) + .getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), true), + status); + if (U_FAILURE(status)) { + return 0; + } + if (days < INT32_MIN || days > INT32_MAX) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + cacheValue = static_cast<int32_t>(days); + CalendarCache::put(setting.winterSolsticeCache, gyear, cacheValue, status); } if(U_FAILURE(status)) { cacheValue = 0; @@ -563,24 +639,27 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { /** * Return the closest new moon to the given date, searching either * forward or backward in time. + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 Asia/Shanghai * @param after if true, search for a new moon on or after the given * date; otherwise, search for a new moon before it + * @param status * @return days after January 1, 1970 0:00 Asia/Shanghai of the nearest * new moon after or before <code>days</code> */ -int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); +int32_t newMoonNear(const TimeZone* timeZone, double days, UBool after, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + double ms = daysToMillis(timeZone, days, status); + if (U_FAILURE(status)) { + return 0; } - gChineseCalendarAstro->setTime(daysToMillis(days)); - UDate newMoon = gChineseCalendarAstro->getMoonTime(CalendarAstronomer::NEW_MOON(), after); - umtx_unlock(&astroLock); - - return (int32_t) millisToDays(newMoon); + return static_cast<int32_t>(millisToDays( + timeZone, + CalendarAstronomer(ms) + .getMoonTime(CalendarAstronomer::NEW_MOON(), after), + status)); } /** @@ -590,30 +669,32 @@ int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { * @param day2 days after January 1, 1970 0:00 Asia/Shanghai * @return the nearest integer number of months between day1 and day2 */ -int32_t ChineseCalendar::synodicMonthsBetween(int32_t day1, int32_t day2) const { +int32_t synodicMonthsBetween(int32_t day1, int32_t day2) { double roundme = ((day2 - day1) / CalendarAstronomer::SYNODIC_MONTH); - return (int32_t) (roundme + (roundme >= 0 ? .5 : -.5)); + return static_cast<int32_t>(roundme + (roundme >= 0 ? .5 : -.5)); } /** * Return the major solar term on or before a given date. This * will be an integer from 1..12, with 1 corresponding to 330 degrees, * 2 to 0 degrees, 3 to 30 degrees,..., and 12 to 300 degrees. + * @param timeZone time zone for the Astro calculation. * @param days days after January 1, 1970 0:00 Asia/Shanghai */ -int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { - - umtx_lock(&astroLock); - if(gChineseCalendarAstro == nullptr) { - gChineseCalendarAstro = new CalendarAstronomer(); - ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); +int32_t majorSolarTerm(const TimeZone* timeZone, int32_t days, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; } - gChineseCalendarAstro->setTime(daysToMillis(days)); - UDate solarLongitude = gChineseCalendarAstro->getSunLongitude(); - umtx_unlock(&astroLock); - // Compute (floor(solarLongitude / (pi/6)) + 2) % 12 - int32_t term = ( ((int32_t)(6 * solarLongitude / CalendarAstronomer::PI)) + 2 ) % 12; + double ms = daysToMillis(timeZone, days, status); + if (U_FAILURE(status)) { + return 0; + } + int32_t term = ((static_cast<int32_t>(6 * CalendarAstronomer(ms) + .getSunLongitude() / CalendarAstronomer::PI)) + 2 ) % 12; + if (U_FAILURE(status)) { + return 0; + } if (term < 1) { term += 12; } @@ -622,12 +703,21 @@ int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { /** * Return true if the given month lacks a major solar term. + * @param timeZone time zone for the Astro calculation. * @param newMoon days after January 1, 1970 0:00 Asia/Shanghai of a new * moon */ -UBool ChineseCalendar::hasNoMajorSolarTerm(int32_t newMoon) const { - return majorSolarTerm(newMoon) == - majorSolarTerm(newMoonNear(newMoon + SYNODIC_GAP, true)); +UBool hasNoMajorSolarTerm(const TimeZone* timeZone, int32_t newMoon, UErrorCode& status) { + if (U_FAILURE(status)) { + return false; + } + int32_t term1 = majorSolarTerm(timeZone, newMoon, status); + int32_t term2 = majorSolarTerm( + timeZone, newMoonNear(timeZone, newMoon + SYNODIC_GAP, true, status), status); + if (U_FAILURE(status)) { + return false; + } + return term1 == term2; } @@ -638,12 +728,16 @@ UBool ChineseCalendar::hasNoMajorSolarTerm(int32_t newMoon) const { /** * Return true if there is a leap month on or after month newMoon1 and * at or before month newMoon2. + * @param timeZone time zone for the Astro calculation. * @param newMoon1 days after January 1, 1970 0:00 astronomical base zone * of a new moon * @param newMoon2 days after January 1, 1970 0:00 astronomical base zone * of a new moon */ -UBool ChineseCalendar::isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) const { +UBool isLeapMonthBetween(const TimeZone* timeZone, int32_t newMoon1, int32_t newMoon2, UErrorCode& status) { + if (U_FAILURE(status)) { + return false; + } #ifdef U_DEBUG_CHNSECAL // This is only needed to debug the timeOfAngle divergence bug. @@ -656,144 +750,289 @@ UBool ChineseCalendar::isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) co #endif while (newMoon2 >= newMoon1) { - if (hasNoMajorSolarTerm(newMoon2)) { + if (hasNoMajorSolarTerm(timeZone, newMoon2, status)) { return true; } - newMoon2 = newMoonNear(newMoon2 - SYNODIC_GAP, false); + newMoon2 = newMoonNear(timeZone, newMoon2 - SYNODIC_GAP, false, status); + if (U_FAILURE(status)) { + return false; + } } return false; } + /** - * Compute fields for the Chinese calendar system. This method can - * either set all relevant fields, as required by - * <code>handleComputeFields()</code>, or it can just set the MONTH and - * IS_LEAP_MONTH fields, as required by - * <code>handleComputeMonthStart()</code>. - * - * <p>As a side effect, this method sets {@link #hasLeapMonthBetweenWinterSolstices}. + * Compute the information about the year. + * @param setting setting (time zone and caches) for the Astro calculation. + * @param gyear the Gregorian year of the given date * @param days days after January 1, 1970 0:00 astronomical base zone * of the date to compute fields for - * @param gyear the Gregorian year of the given date - * @param gmonth the Gregorian month of the given date - * @param setAllFields if true, set the EXTENDED_YEAR, ERA, YEAR, - * DAY_OF_MONTH, and DAY_OF_YEAR fields. In either case set the MONTH - * and IS_LEAP_MONTH fields. + * @return The MonthInfo result. */ -void ChineseCalendar::computeChineseFields(int32_t days, int32_t gyear, int32_t gmonth, - UBool setAllFields) { +struct MonthInfo computeMonthInfo( + const icu::ChineseCalendar::Setting& setting, + int32_t gyear, int32_t days, UErrorCode& status) { + struct MonthInfo output = {0, 0, 0, false, false}; + if (U_FAILURE(status)) { + return output; + } // Find the winter solstices before and after the target date. // These define the boundaries of this Chinese year, specifically, // the position of month 11, which always contains the solstice. // We want solsticeBefore <= date < solsticeAfter. int32_t solsticeBefore; - int32_t solsticeAfter = winterSolstice(gyear); + int32_t solsticeAfter = winterSolstice(setting, gyear, status); + if (U_FAILURE(status)) { + return output; + } if (days < solsticeAfter) { - solsticeBefore = winterSolstice(gyear - 1); + int32_t gprevious_year; + if (uprv_add32_overflow(gyear, -1, &gprevious_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return output; + } + solsticeBefore = winterSolstice(setting, gprevious_year, status); } else { solsticeBefore = solsticeAfter; - solsticeAfter = winterSolstice(gyear + 1); + int32_t gnext_year; + if (uprv_add32_overflow(gyear, 1, &gnext_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return output; + } + solsticeAfter = winterSolstice(setting, gnext_year, status); + } + if (!(solsticeBefore <= days && days < solsticeAfter)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } + if (U_FAILURE(status)) { + return output; } + const TimeZone* timeZone = setting.zoneAstroCalc; // Find the start of the month after month 11. This will be either // the prior month 12 or leap month 11 (very rare). Also find the // start of the following month 11. - int32_t firstMoon = newMoonNear(solsticeBefore + 1, true); - int32_t lastMoon = newMoonNear(solsticeAfter + 1, false); - int32_t thisMoon = newMoonNear(days + 1, false); // Start of this month - // Note: hasLeapMonthBetweenWinterSolstices is a member variable - hasLeapMonthBetweenWinterSolstices = synodicMonthsBetween(firstMoon, lastMoon) == 12; - - int32_t month = synodicMonthsBetween(firstMoon, thisMoon); - int32_t theNewYear = newYear(gyear); + int32_t firstMoon = newMoonNear(timeZone, solsticeBefore + 1, true, status); + int32_t lastMoon = newMoonNear(timeZone, solsticeAfter + 1, false, status); + if (U_FAILURE(status)) { + return output; + } + output.thisMoon = newMoonNear(timeZone, days + 1, false, status); // Start of this month + if (U_FAILURE(status)) { + return output; + } + output.hasLeapMonthBetweenWinterSolstices = synodicMonthsBetween(firstMoon, lastMoon) == 12; + + output.month = synodicMonthsBetween(firstMoon, output.thisMoon); + int32_t theNewYear = newYear(setting, gyear, status); + if (U_FAILURE(status)) { + return output; + } if (days < theNewYear) { - theNewYear = newYear(gyear-1); + int32_t gprevious_year; + if (uprv_add32_overflow(gyear, -1, &gprevious_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return output; + } + theNewYear = newYear(setting, gprevious_year, status); + if (U_FAILURE(status)) { + return output; + } } - if (hasLeapMonthBetweenWinterSolstices && isLeapMonthBetween(firstMoon, thisMoon)) { - month--; + if (output.hasLeapMonthBetweenWinterSolstices && + isLeapMonthBetween(timeZone, firstMoon, output.thisMoon, status)) { + output.month--; } - if (month < 1) { - month += 12; + if (U_FAILURE(status)) { + return output; } - int32_t ordinalMonth = synodicMonthsBetween(theNewYear, thisMoon); - if (ordinalMonth < 0) { - ordinalMonth += 12; + if (output.month < 1) { + output.month += 12; } - UBool isLeapMonth = hasLeapMonthBetweenWinterSolstices && - hasNoMajorSolarTerm(thisMoon) && - !isLeapMonthBetween(firstMoon, newMoonNear(thisMoon - SYNODIC_GAP, false)); + output.ordinalMonth = synodicMonthsBetween(theNewYear, output.thisMoon); + if (output.ordinalMonth < 0) { + output.ordinalMonth += 12; + } + output.isLeapMonth = output.hasLeapMonthBetweenWinterSolstices && + hasNoMajorSolarTerm(timeZone, output.thisMoon, status) && + !isLeapMonthBetween(timeZone, firstMoon, + newMoonNear(timeZone, output.thisMoon - SYNODIC_GAP, false, status), + status); + if (U_FAILURE(status)) { + return output; + } + return output; +} - internalSet(UCAL_MONTH, month-1); // Convert from 1-based to 0-based - internalSet(UCAL_ORDINAL_MONTH, ordinalMonth); // Convert from 1-based to 0-based - internalSet(UCAL_IS_LEAP_MONTH, isLeapMonth?1:0); +} // namespace +/** + * Override Calendar to compute several fields specific to the Chinese + * calendar system. These are: + * + * <ul><li>ERA + * <li>YEAR + * <li>MONTH + * <li>DAY_OF_MONTH + * <li>DAY_OF_YEAR + * <li>EXTENDED_YEAR</ul> + * + * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this + * method is called. The getGregorianXxx() methods return Gregorian + * calendar equivalents for the given Julian day. + * + * <p>Compute the ChineseCalendar-specific field IS_LEAP_MONTH. + * @stable ICU 2.8 + */ +void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode & status) { + if (U_FAILURE(status)) { + return; + } + int32_t days; + if (uprv_add32_overflow(julianDay, -kEpochStartAsJulianDay, &days)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + int32_t gyear = getGregorianYear(); + int32_t gmonth = getGregorianMonth(); - if (setAllFields) { + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return; + } + struct MonthInfo monthInfo = computeMonthInfo(setting, gyear, days, status); + if (U_FAILURE(status)) { + return; + } + hasLeapMonthBetweenWinterSolstices = monthInfo.hasLeapMonthBetweenWinterSolstices; - // Extended year and cycle year is based on the epoch year - - int32_t extended_year = gyear - fEpochYear; - int cycle_year = gyear - CHINESE_EPOCH_YEAR; - if (month < 11 || - gmonth >= UCAL_JULY) { - extended_year++; - cycle_year++; + // Extended year and cycle year is based on the epoch year + int32_t eyear; + int32_t cycle_year; + if (uprv_add32_overflow(gyear, -CHINESE_EPOCH_YEAR, &eyear) || + uprv_add32_overflow(gyear, -CYCLE_EPOCH, &cycle_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (monthInfo.month < 11 || + gmonth >= UCAL_JULY) { + // forward to next year + if (uprv_add32_overflow(eyear, 1, &eyear) || + uprv_add32_overflow(cycle_year, 1, &cycle_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } - int32_t dayOfMonth = days - thisMoon + 1; - - internalSet(UCAL_EXTENDED_YEAR, extended_year); - - // 0->0,60 1->1,1 60->1,60 61->2,1 etc. - int32_t yearOfCycle; - int32_t cycle = ClockMath::floorDivide(cycle_year - 1, 60, &yearOfCycle); - internalSet(UCAL_ERA, cycle + 1); - internalSet(UCAL_YEAR, yearOfCycle + 1); + } + int32_t dayOfMonth = days - monthInfo.thisMoon + 1; - internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + // 0->0,60 1->1,1 60->1,60 61->2,1 etc. + int32_t yearOfCycle; + int32_t cycle = ClockMath::floorDivide(cycle_year - 1, 60, &yearOfCycle); - // Days will be before the first new year we compute if this - // date is in month 11, leap 11, 12. There is never a leap 12. - // New year computations are cached so this should be cheap in - // the long run. - int32_t theNewYear = newYear(gyear); - if (days < theNewYear) { - theNewYear = newYear(gyear-1); + // Days will be before the first new year we compute if this + // date is in month 11, leap 11, 12. There is never a leap 12. + // New year computations are cached so this should be cheap in + // the long run. + int32_t theNewYear = newYear(setting, gyear, status); + if (U_FAILURE(status)) { + return; + } + if (days < theNewYear) { + int32_t gprevious_year; + if (uprv_add32_overflow(gyear, -1, &gprevious_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } - internalSet(UCAL_DAY_OF_YEAR, days - theNewYear + 1); + theNewYear = newYear(setting, gprevious_year, status); } -} + if (U_FAILURE(status)) { + return; + } + cycle++; + yearOfCycle++; + int32_t dayOfYear = days - theNewYear + 1; + + int32_t minYear = this->handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MINIMUM); + if (eyear < minYear) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + eyear = minYear; + } + int32_t maxYear = this->handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MAXIMUM); + if (maxYear < eyear) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + eyear = maxYear; + } + + internalSet(UCAL_MONTH, monthInfo.month-1); // Convert from 1-based to 0-based + internalSet(UCAL_ORDINAL_MONTH, monthInfo.ordinalMonth); // Convert from 1-based to 0-based + internalSet(UCAL_IS_LEAP_MONTH, monthInfo.isLeapMonth?1:0); + internalSet(UCAL_EXTENDED_YEAR, eyear); + internalSet(UCAL_ERA, cycle); + internalSet(UCAL_YEAR, yearOfCycle); + internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); +} //------------------------------------------------------------------ // Fields to time //------------------------------------------------------------------ +namespace { + /** * Return the Chinese new year of the given Gregorian year. + * @param setting setting (time zone and caches) for the Astro calculation. * @param gyear a Gregorian year * @return days after January 1, 1970 0:00 astronomical base zone of the * Chinese new year of the given year (this will be a new moon) */ -int32_t ChineseCalendar::newYear(int32_t gyear) const { - UErrorCode status = U_ZERO_ERROR; - int32_t cacheValue = CalendarCache::get(&gChineseCalendarNewYearCache, gyear, status); +int32_t newYear(const icu::ChineseCalendar::Setting& setting, + int32_t gyear, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + const TimeZone* timeZone = setting.zoneAstroCalc; + int32_t cacheValue = CalendarCache::get(setting.newYearCache, gyear, status); + if (U_FAILURE(status)) { + return 0; + } if (cacheValue == 0) { - int32_t solsticeBefore= winterSolstice(gyear - 1); - int32_t solsticeAfter = winterSolstice(gyear); - int32_t newMoon1 = newMoonNear(solsticeBefore + 1, true); - int32_t newMoon2 = newMoonNear(newMoon1 + SYNODIC_GAP, true); - int32_t newMoon11 = newMoonNear(solsticeAfter + 1, false); - + int32_t gprevious_year; + if (uprv_add32_overflow(gyear, -1, &gprevious_year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t solsticeBefore= winterSolstice(setting, gprevious_year, status); + int32_t solsticeAfter = winterSolstice(setting, gyear, status); + int32_t newMoon1 = newMoonNear(timeZone, solsticeBefore + 1, true, status); + int32_t newMoon2 = newMoonNear(timeZone, newMoon1 + SYNODIC_GAP, true, status); + int32_t newMoon11 = newMoonNear(timeZone, solsticeAfter + 1, false, status); + if (U_FAILURE(status)) { + return 0; + } + if (synodicMonthsBetween(newMoon1, newMoon11) == 12 && - (hasNoMajorSolarTerm(newMoon1) || hasNoMajorSolarTerm(newMoon2))) { - cacheValue = newMoonNear(newMoon2 + SYNODIC_GAP, true); + (hasNoMajorSolarTerm(timeZone, newMoon1, status) || + hasNoMajorSolarTerm(timeZone, newMoon2, status))) { + cacheValue = newMoonNear(timeZone, newMoon2 + SYNODIC_GAP, true, status); } else { cacheValue = newMoon2; } + if (U_FAILURE(status)) { + return 0; + } - CalendarCache::put(&gChineseCalendarNewYearCache, gyear, cacheValue, status); + CalendarCache::put(setting.newYearCache, gyear, cacheValue, status); } if(U_FAILURE(status)) { cacheValue = 0; @@ -801,6 +1040,8 @@ int32_t ChineseCalendar::newYear(int32_t gyear) const { return cacheValue; } +} // namespace + /** * Adjust this calendar to be delta months before or after a given * start position, pinning the day of month if necessary. The start @@ -808,14 +1049,17 @@ int32_t ChineseCalendar::newYear(int32_t gyear) const { * and a day-of-month. Used by add() and roll(). * @param newMoon the local days of the first day of the month of the * start position (days after January 1, 1970 0:00 Asia/Shanghai) - * @param dom the 1-based day-of-month of the start position + * @param dayOfMonth the 1-based day-of-month of the start position * @param delta the number of months to move forward or backward from * the start position * @param status The status. */ -void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, +void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dayOfMonth, int32_t delta, UErrorCode& status) { - if (U_FAILURE(status)) { return; } + const Setting setting = getSetting(status); + if (U_FAILURE(status)) { + return; + } // Move to the middle of the month before our target month. double value = newMoon; @@ -828,14 +1072,22 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, newMoon = static_cast<int32_t>(value); // Search forward to the target month's new moon - newMoon = newMoonNear(newMoon, true); + newMoon = newMoonNear(setting.zoneAstroCalc, newMoon, true, status); + if (U_FAILURE(status)) { + return; + } - // Find the target dom - int32_t jd = newMoon + kEpochStartAsJulianDay - 1 + dom; + // Find the target dayOfMonth + int32_t jd; + if (uprv_add32_overflow(newMoon, kEpochStartAsJulianDay - 1, &jd) || + uprv_add32_overflow(jd, dayOfMonth, &jd)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - // Pin the dom. In this calendar all months are 29 or 30 days - // so pinning just means handling dom 30. - if (dom > 29) { + // Pin the dayOfMonth. In this calendar all months are 29 or 30 days + // so pinning just means handling dayOfMonth 30. + if (dayOfMonth > 29) { set(UCAL_JULIAN_DAY, jd-1); // TODO Fix this. We really shouldn't ever have to // explicitly call complete(). This is either a bug in @@ -843,7 +1095,7 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, // Calendar.getActualMaximum(). I suspect the last. complete(status); if (U_FAILURE(status)) return; - if (getActualMaximum(UCAL_DAY_OF_MONTH, status) >= dom) { + if (getActualMaximum(UCAL_DAY_OF_MONTH, status) >= dayOfMonth) { if (U_FAILURE(status)) return; set(UCAL_JULIAN_DAY, jd); } @@ -852,77 +1104,7 @@ void ChineseCalendar::offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, } } -constexpr uint32_t kChineseRelatedYearDiff = -2637; - -int32_t ChineseCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { - return 0; - } - return year + kChineseRelatedYearDiff; -} - -void ChineseCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kChineseRelatedYearDiff); -} - -// default century - -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInitOnce {}; - - -UBool ChineseCalendar::haveDefaultCentury() const -{ - return true; -} - -UDate ChineseCalendar::defaultCenturyStart() const -{ - return internalGetDefaultCenturyStart(); -} - -int32_t ChineseCalendar::defaultCenturyStartYear() const -{ - return internalGetDefaultCenturyStartYear(); -} - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - ChineseCalendar calendar(Locale("@calendar=chinese"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -ChineseCalendar::internalGetDefaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -ChineseCalendar::internalGetDefaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInitOnce, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(ChineseCalendar, "@calendar=chinese") bool ChineseCalendar::inTemporalLeapYear(UErrorCode &status) const @@ -972,7 +1154,10 @@ ChineseCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) status = U_ILLEGAL_ARGUMENT_ERROR; } -int32_t ChineseCalendar::internalGetMonth() const { +int32_t ChineseCalendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { return internalGet(UCAL_MONTH); } @@ -982,24 +1167,62 @@ int32_t ChineseCalendar::internalGetMonth() const { temp->set(UCAL_DATE, 1); // Calculate the UCAL_MONTH and UCAL_IS_LEAP_MONTH by adding number of // months. - UErrorCode status = U_ZERO_ERROR; temp->roll(UCAL_MONTH, internalGet(UCAL_ORDINAL_MONTH), status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } - ChineseCalendar *nonConstThis = (ChineseCalendar*)this; // cast away const + ChineseCalendar* nonConstThis = const_cast<ChineseCalendar*>(this); // cast away const nonConstThis->internalSet(UCAL_IS_LEAP_MONTH, temp->get(UCAL_IS_LEAP_MONTH, status)); - U_ASSERT(U_SUCCESS(status)); int32_t month = temp->get(UCAL_MONTH, status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } nonConstThis->internalSet(UCAL_MONTH, month); return month; } -int32_t ChineseCalendar::internalGetMonth(int32_t defaultValue) const { - if (resolveFields(kMonthPrecedence) == UCAL_MONTH) { - return internalGet(UCAL_MONTH, defaultValue); +int32_t ChineseCalendar::internalGetMonth(int32_t defaultValue, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } + switch (resolveFields(kMonthPrecedence)) { + case UCAL_MONTH: + return internalGet(UCAL_MONTH); + case UCAL_ORDINAL_MONTH: + return internalGetMonth(status); + default: + return defaultValue; + } +} + +ChineseCalendar::Setting ChineseCalendar::getSetting(UErrorCode&) const { + return { + getAstronomerTimeZone(), + &gWinterSolsticeCache, + &gNewYearCache + }; +} + +int32_t +ChineseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const +{ + if (U_FAILURE(status)) { + return 0; + } + if (field == UCAL_DATE) { + LocalPointer<ChineseCalendar> cal(clone(), status); + if(U_FAILURE(status)) { + return 0; + } + cal->setLenient(true); + cal->prepareGetActual(field,false,status); + int32_t year = cal->get(UCAL_EXTENDED_YEAR, status); + int32_t month = cal->get(UCAL_MONTH, status); + bool leap = cal->get(UCAL_IS_LEAP_MONTH, status) != 0; + return handleGetMonthLengthWithLeap(year, month, leap, status); } - return internalGetMonth(); + return Calendar::getActualMaximum(field, status); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/chnsecal.h b/deps/icu-small/source/i18n/chnsecal.h index e4910f6eb8e2af..f43faeaac3fd08 100644 --- a/deps/icu-small/source/i18n/chnsecal.h +++ b/deps/icu-small/source/i18n/chnsecal.h @@ -27,6 +27,7 @@ U_NAMESPACE_BEGIN +class CalendarCache; /** * <code>ChineseCalendar</code> is a concrete subclass of {@link Calendar} * that implements a traditional Chinese calendar. The traditional Chinese @@ -152,23 +153,6 @@ class U_I18N_API ChineseCalendar : public Calendar { */ virtual void setTemporalMonthCode(const char* code, UErrorCode& status) override; - protected: - - /** - * Constructs a ChineseCalendar based on the current time in the default time zone - * with the given locale, using the specified epoch year and time zone for - * astronomical calculations. - * - * @param aLocale The given locale. - * @param epochYear The epoch year to use for calculation. - * @param zoneAstroCalc The TimeZone to use for astronomical calculations. If null, - * will be set appropriately for Chinese calendar (UTC + 8:00). - * @param success Indicates the status of ChineseCalendar object construction; - * if successful, will not be changed to an error value. - * @internal - */ - ChineseCalendar(const Locale& aLocale, int32_t epochYear, const TimeZone* zoneAstroCalc, UErrorCode &success); - public: /** * Copy Constructor @@ -197,9 +181,6 @@ class U_I18N_API ChineseCalendar : public Calendar { // this value could be false for a date prior to the Winter Solstice of that // year but that year still has a leap month and therefor is a leap year. UBool hasLeapMonthBetweenWinterSolstices; - int32_t fEpochYear; // Start year of this Chinese calendar instance. - const TimeZone* fZoneAstroCalc; // Zone used for the astronomical calculation - // of this Chinese calendar instance. //---------------------------------------------------------------------- // Calendar framework @@ -207,32 +188,22 @@ class U_I18N_API ChineseCalendar : public Calendar { protected: virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; virtual const UFieldResolutionTable* getFieldResolutionTable() const override; + private: + int32_t handleGetMonthLengthWithLeap(int32_t extendedYear, int32_t month, bool isLeap, UErrorCode& status) const; + int64_t handleComputeMonthStartWithLeap(int32_t eyear, int32_t month, bool isLeap, UErrorCode& status) const; + public: virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode &status) override; virtual void add(EDateFields field, int32_t amount, UErrorCode &status) override; virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode &status) override; virtual void roll(EDateFields field, int32_t amount, UErrorCode &status) override; - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - //---------------------------------------------------------------------- // Internal methods & astronomical calculations //---------------------------------------------------------------------- @@ -241,19 +212,7 @@ class U_I18N_API ChineseCalendar : public Calendar { static const UFieldResolutionTable CHINESE_DATE_PRECEDENCE[]; - double daysToMillis(double days) const; - double millisToDays(double millis) const; - virtual int32_t winterSolstice(int32_t gyear) const; - virtual int32_t newMoonNear(double days, UBool after) const; - virtual int32_t synodicMonthsBetween(int32_t day1, int32_t day2) const; - virtual int32_t majorSolarTerm(int32_t days) const; - virtual UBool hasNoMajorSolarTerm(int32_t newMoon) const; - virtual UBool isLeapMonthBetween(int32_t newMoon1, int32_t newMoon2) const; - virtual void computeChineseFields(int32_t days, int32_t gyear, - int32_t gmonth, UBool setAllFields); - virtual int32_t newYear(int32_t gyear) const; virtual void offsetMonth(int32_t newMoon, int32_t dom, int32_t delta, UErrorCode& status); - const TimeZone* getChineseCalZoneAstroCalc() const; // UObject stuff public: @@ -285,46 +244,30 @@ class U_I18N_API ChineseCalendar : public Calendar { */ virtual const char * getType() const override; + virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const override; + + struct Setting { + const TimeZone* zoneAstroCalc; + CalendarCache** winterSolsticeCache; + CalendarCache** newYearCache; + }; protected: - virtual int32_t internalGetMonth(int32_t defaultValue) const override; + virtual Setting getSetting(UErrorCode& status) const; + virtual int32_t internalGetMonth(int32_t defaultValue, UErrorCode& status) const override; - virtual int32_t internalGetMonth() const override; + virtual int32_t internalGetMonth(UErrorCode& status) const override; protected: - /** - * Returns true because the Islamic Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY private: // default century stuff. - /** - * Returns the beginning date of the 100-year window that dates - * with 2-digit years are considered to fall within. - */ - UDate internalGetDefaultCenturyStart() const; - - /** - * Returns the first year of the 100-year window that dates with - * 2-digit years are considered to fall within. - */ - int32_t internalGetDefaultCenturyStartYear() const; - ChineseCalendar() = delete; // default constructor not implemented + +#ifdef __CalendarTest__ + friend void CalendarTest::TestChineseCalendarComputeMonthStart(); +#endif }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/choicfmt.cpp b/deps/icu-small/source/i18n/choicfmt.cpp index 96e73fabcfa7f0..6f44b9504d0675 100644 --- a/deps/icu-small/source/i18n/choicfmt.cpp +++ b/deps/icu-small/source/i18n/choicfmt.cpp @@ -380,7 +380,7 @@ ChoiceFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& status) const { - return format((double) number, appendTo, status); + return format(static_cast<double>(number), appendTo, status); } // ------------------------------------- @@ -392,7 +392,7 @@ ChoiceFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& status) const { - return format((double) number, appendTo, status); + return format(static_cast<double>(number), appendTo, status); } // ------------------------------------- diff --git a/deps/icu-small/source/i18n/coleitr.cpp b/deps/icu-small/source/i18n/coleitr.cpp index be0a8e4690f974..5ae15ae5a72873 100644 --- a/deps/icu-small/source/i18n/coleitr.cpp +++ b/deps/icu-small/source/i18n/coleitr.cpp @@ -127,8 +127,8 @@ int32_t CollationElementIterator::next(UErrorCode& status) int64_t ce = iter_->nextCE(status); if (ce == Collation::NO_CE) { return NULLORDER; } // Turn the 64-bit CE into two old-style 32-bit CEs, without quaternary bits. - uint32_t p = (uint32_t)(ce >> 32); - uint32_t lower32 = (uint32_t)ce; + uint32_t p = static_cast<uint32_t>(ce >> 32); + uint32_t lower32 = static_cast<uint32_t>(ce); uint32_t firstHalf = getFirstHalf(p, lower32); uint32_t secondHalf = getSecondHalf(p, lower32); if (secondHalf != 0) { @@ -199,8 +199,8 @@ int32_t CollationElementIterator::previous(UErrorCode& status) int64_t ce = iter_->previousCE(*offsets_, status); if (ce == Collation::NO_CE) { return NULLORDER; } // Turn the 64-bit CE into two old-style 32-bit CEs, without quaternary bits. - uint32_t p = (uint32_t)(ce >> 32); - uint32_t lower32 = (uint32_t)ce; + uint32_t p = static_cast<uint32_t>(ce >> 32); + uint32_t lower32 = static_cast<uint32_t>(ce); uint32_t firstHalf = getFirstHalf(p, lower32); uint32_t secondHalf = getSecondHalf(p, lower32); if (secondHalf != 0) { @@ -309,7 +309,7 @@ void CollationElementIterator::setText(CharacterIterator& source, int32_t CollationElementIterator::strengthOrder(int32_t order) const { - UColAttributeValue s = (UColAttributeValue)rbc_->settings->getStrength(); + UColAttributeValue s = static_cast<UColAttributeValue>(rbc_->settings->getStrength()); // Mask off the unwanted differences. if (s == UCOL_PRIMARY) { order &= 0xffff0000; @@ -410,8 +410,8 @@ class MaxExpSink : public ContractionsAndExpansions::CESink { } // last "half" of the last CE int64_t ce = ces[length - 1]; - uint32_t p = (uint32_t)(ce >> 32); - uint32_t lower32 = (uint32_t)ce; + uint32_t p = static_cast<uint32_t>(ce >> 32); + uint32_t lower32 = static_cast<uint32_t>(ce); uint32_t lastHalf = getSecondHalf(p, lower32); if (lastHalf == 0) { lastHalf = getFirstHalf(p, lower32); @@ -419,8 +419,8 @@ class MaxExpSink : public ContractionsAndExpansions::CESink { } else { lastHalf |= 0xc0; // old-style continuation CE } - if (count > uhash_igeti(maxExpansions, (int32_t)lastHalf)) { - uhash_iputi(maxExpansions, (int32_t)lastHalf, count, &errorCode); + if (count > uhash_igeti(maxExpansions, static_cast<int32_t>(lastHalf))) { + uhash_iputi(maxExpansions, static_cast<int32_t>(lastHalf), count, &errorCode); } } diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index ced55c8dbf095b..1f8b8e417b048c 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -261,7 +261,7 @@ static UBool isAvailableLocaleListInitialized(UErrorCode &status) { namespace { -static const struct { +const struct { const char *name; UColAttribute attr; } collAttributes[] = { @@ -274,7 +274,7 @@ static const struct { { "colNumeric", UCOL_NUMERIC_COLLATION } }; -static const struct { +const struct { const char *name; UColAttributeValue value; } collAttributeValues[] = { @@ -292,7 +292,7 @@ static const struct { { "upper", UCOL_UPPER_FIRST } }; -static const char *collReorderCodes[UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST] = { +const char* collReorderCodes[UCOL_REORDER_CODE_LIMIT - UCOL_REORDER_CODE_FIRST] = { "space", "punct", "symbol", "currency", "digit" }; @@ -413,7 +413,7 @@ void setAttributesFromKeywords(const Locale &loc, Collator &coll, UErrorCode &er errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } - coll.setMaxVariable((UColReorderCode)code, errorCode); + coll.setMaxVariable(static_cast<UColReorderCode>(code), errorCode); } if (U_FAILURE(errorCode)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; @@ -431,7 +431,7 @@ Collator* U_EXPORT2 Collator::createInstance(const Locale& desiredLocale, UErrorCode& status) { if (U_FAILURE(status)) - return 0; + return nullptr; if (desiredLocale.isBogus()) { // Locale constructed from malformed locale ID or language tag. status = U_ILLEGAL_ARGUMENT_ERROR; @@ -493,7 +493,7 @@ Collator::EComparisonResult Collator::compare(const UnicodeString& source, const UnicodeString& target) const { UErrorCode ec = U_ZERO_ERROR; - return (EComparisonResult)compare(source, target, ec); + return static_cast<EComparisonResult>(compare(source, target, ec)); } // implement deprecated, previously abstract method @@ -502,7 +502,7 @@ Collator::EComparisonResult Collator::compare(const UnicodeString& source, int32_t length) const { UErrorCode ec = U_ZERO_ERROR; - return (EComparisonResult)compare(source, target, length, ec); + return static_cast<EComparisonResult>(compare(source, target, length, ec)); } // implement deprecated, previously abstract method @@ -511,7 +511,7 @@ Collator::EComparisonResult Collator::compare(const char16_t* source, int32_t so const { UErrorCode ec = U_ZERO_ERROR; - return (EComparisonResult)compare(source, sourceLength, target, targetLength, ec); + return static_cast<EComparisonResult>(compare(source, sourceLength, target, targetLength, ec)); } UCollationResult Collator::compare(UCharIterator &/*sIter*/, @@ -834,7 +834,7 @@ class CollationLocaleListEnumeration : public StringEnumeration { if(index < availableLocaleListCount) { result = availableLocaleList[index++].getName(); if(resultLength != nullptr) { - *resultLength = (int32_t)uprv_strlen(result); + *resultLength = static_cast<int32_t>(uprv_strlen(result)); } } else { if(resultLength != nullptr) { @@ -915,13 +915,13 @@ Collator::getFunctionalEquivalent(const char* keyword, const Locale& locale, Collator::ECollationStrength Collator::getStrength() const { UErrorCode intStatus = U_ZERO_ERROR; - return (ECollationStrength)getAttribute(UCOL_STRENGTH, intStatus); + return static_cast<ECollationStrength>(getAttribute(UCOL_STRENGTH, intStatus)); } void Collator::setStrength(ECollationStrength newStrength) { UErrorCode intStatus = U_ZERO_ERROR; - setAttribute(UCOL_STRENGTH, (UColAttributeValue)newStrength, intStatus); + setAttribute(UCOL_STRENGTH, static_cast<UColAttributeValue>(newStrength), intStatus); } Collator & diff --git a/deps/icu-small/source/i18n/collation.cpp b/deps/icu-small/source/i18n/collation.cpp index 705ee12e23cc3b..61838e10fd2a3a 100644 --- a/deps/icu-small/source/i18n/collation.cpp +++ b/deps/icu-small/source/i18n/collation.cpp @@ -27,38 +27,38 @@ Collation::incTwoBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible, // Reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary. uint32_t primary; if(isCompressible) { - offset += ((int32_t)(basePrimary >> 16) & 0xff) - 4; - primary = (uint32_t)((offset % 251) + 4) << 16; + offset += (static_cast<int32_t>(basePrimary >> 16) & 0xff) - 4; + primary = static_cast<uint32_t>((offset % 251) + 4) << 16; offset /= 251; } else { - offset += ((int32_t)(basePrimary >> 16) & 0xff) - 2; - primary = (uint32_t)((offset % 254) + 2) << 16; + offset += (static_cast<int32_t>(basePrimary >> 16) & 0xff) - 2; + primary = static_cast<uint32_t>((offset % 254) + 2) << 16; offset /= 254; } // First byte, assume no further overflow. - return primary | ((basePrimary & 0xff000000) + (uint32_t)(offset << 24)); + return primary | ((basePrimary & 0xff000000) + static_cast<uint32_t>(offset << 24)); } uint32_t Collation::incThreeBytePrimaryByOffset(uint32_t basePrimary, UBool isCompressible, int32_t offset) { // Extract the third byte, minus the minimum byte value, // plus the offset, modulo the number of usable byte values, plus the minimum. - offset += ((int32_t)(basePrimary >> 8) & 0xff) - 2; - uint32_t primary = (uint32_t)((offset % 254) + 2) << 8; + offset += (static_cast<int32_t>(basePrimary >> 8) & 0xff) - 2; + uint32_t primary = static_cast<uint32_t>((offset % 254) + 2) << 8; offset /= 254; // Same with the second byte, // but reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary. if(isCompressible) { - offset += ((int32_t)(basePrimary >> 16) & 0xff) - 4; - primary |= (uint32_t)((offset % 251) + 4) << 16; + offset += (static_cast<int32_t>(basePrimary >> 16) & 0xff) - 4; + primary |= static_cast<uint32_t>((offset % 251) + 4) << 16; offset /= 251; } else { - offset += ((int32_t)(basePrimary >> 16) & 0xff) - 2; - primary |= (uint32_t)((offset % 254) + 2) << 16; + offset += (static_cast<int32_t>(basePrimary >> 16) & 0xff) - 2; + primary |= static_cast<uint32_t>((offset % 254) + 2) << 16; offset /= 254; } // First byte, assume no further overflow. - return primary | ((basePrimary & 0xff000000) + (uint32_t)(offset << 24)); + return primary | ((basePrimary & 0xff000000) + static_cast<uint32_t>(offset << 24)); } uint32_t @@ -68,7 +68,7 @@ Collation::decTwoBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible // Reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary. // Assume no further underflow for the first byte. U_ASSERT(0 < step && step <= 0x7f); - int32_t byte2 = ((int32_t)(basePrimary >> 16) & 0xff) - step; + int32_t byte2 = (static_cast<int32_t>(basePrimary >> 16) & 0xff) - step; if(isCompressible) { if(byte2 < 4) { byte2 += 251; @@ -80,7 +80,7 @@ Collation::decTwoBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressible basePrimary -= 0x1000000; } } - return (basePrimary & 0xff000000) | ((uint32_t)byte2 << 16); + return (basePrimary & 0xff000000) | (static_cast<uint32_t>(byte2) << 16); } uint32_t @@ -88,14 +88,14 @@ Collation::decThreeBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressib // Extract the third byte, minus the minimum byte value, // minus the step, modulo the number of usable byte values, plus the minimum. U_ASSERT(0 < step && step <= 0x7f); - int32_t byte3 = ((int32_t)(basePrimary >> 8) & 0xff) - step; + int32_t byte3 = (static_cast<int32_t>(basePrimary >> 8) & 0xff) - step; if(byte3 >= 2) { - return (basePrimary & 0xffff0000) | ((uint32_t)byte3 << 8); + return (basePrimary & 0xffff0000) | (static_cast<uint32_t>(byte3) << 8); } byte3 += 254; // Same with the second byte, // but reserve the PRIMARY_COMPRESSION_LOW_BYTE and high byte if necessary. - int32_t byte2 = ((int32_t)(basePrimary >> 16) & 0xff) - 1; + int32_t byte2 = (static_cast<int32_t>(basePrimary >> 16) & 0xff) - 1; if(isCompressible) { if(byte2 < 4) { byte2 = 0xfe; @@ -108,13 +108,13 @@ Collation::decThreeBytePrimaryByOneStep(uint32_t basePrimary, UBool isCompressib } } // First byte, assume no further underflow. - return (basePrimary & 0xff000000) | ((uint32_t)byte2 << 16) | ((uint32_t)byte3 << 8); + return (basePrimary & 0xff000000) | (static_cast<uint32_t>(byte2) << 16) | (static_cast<uint32_t>(byte3) << 8); } uint32_t Collation::getThreeBytePrimaryForOffsetData(UChar32 c, int64_t dataCE) { - uint32_t p = (uint32_t)(dataCE >> 32); // three-byte primary pppppp00 - int32_t lower32 = (int32_t)dataCE; // base code point b & step s: bbbbbbss (bit 7: isCompressible) + uint32_t p = static_cast<uint32_t>(dataCE >> 32); // three-byte primary pppppp00 + int32_t lower32 = static_cast<int32_t>(dataCE); // base code point b & step s: bbbbbbss (bit 7: isCompressible) int32_t offset = (c - (lower32 >> 8)) * (lower32 & 0x7f); // delta * increment UBool isCompressible = (lower32 & 0x80) != 0; return Collation::incThreeBytePrimaryByOffset(p, isCompressible, offset); diff --git a/deps/icu-small/source/i18n/collation.h b/deps/icu-small/source/i18n/collation.h index 2062ef29467341..5dcc0e19999e94 100644 --- a/deps/icu-small/source/i18n/collation.h +++ b/deps/icu-small/source/i18n/collation.h @@ -317,7 +317,7 @@ class U_I18N_API Collation { return ce32 & 0xffffff00; } static inline int64_t ceFromLongPrimaryCE32(uint32_t ce32) { - return ((int64_t)(ce32 & 0xffffff00) << 32) | COMMON_SEC_AND_TER_CE; + return (static_cast<int64_t>(ce32 & 0xffffff00) << 32) | COMMON_SEC_AND_TER_CE; } static uint32_t makeLongSecondaryCE32(uint32_t lower32) { @@ -341,7 +341,7 @@ class U_I18N_API Collation { } static inline int32_t tagFromCE32(uint32_t ce32) { - return (int32_t)(ce32 & 0xf); + return static_cast<int32_t>(ce32 & 0xf); } static inline UBool hasCE32Tag(uint32_t ce32, int32_t tag) { @@ -387,7 +387,7 @@ class U_I18N_API Collation { * @see LATIN_EXPANSION_TAG */ static inline int64_t latinCE0FromCE32(uint32_t ce32) { - return ((int64_t)(ce32 & 0xff000000) << 32) | COMMON_SECONDARY_CE | ((ce32 & 0xff0000) >> 8); + return (static_cast<int64_t>(ce32 & 0xff000000) << 32) | COMMON_SECONDARY_CE | ((ce32 & 0xff0000) >> 8); } /** @@ -402,7 +402,7 @@ class U_I18N_API Collation { * Returns the data index from a special CE32. */ static inline int32_t indexFromCE32(uint32_t ce32) { - return (int32_t)(ce32 >> 13); + return static_cast<int32_t>(ce32 >> 13); } /** @@ -416,14 +416,14 @@ class U_I18N_API Collation { * Returns the digit value from a DIGIT_TAG ce32. */ static inline char digitFromCE32(uint32_t ce32) { - return (char)((ce32 >> 8) & 0xf); + return static_cast<char>((ce32 >> 8) & 0xf); } /** Returns a 64-bit CE from a simple CE32 (not special). */ static inline int64_t ceFromSimpleCE32(uint32_t ce32) { // normal form ppppsstt -> pppp0000ss00tt00 // assert (ce32 & 0xff) < SPECIAL_CE32_LOW_BYTE - return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | ((ce32 & 0xff) << 8); + return (static_cast<int64_t>(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | ((ce32 & 0xff) << 8); } /** Returns a 64-bit CE from a simple/long-primary/long-secondary CE32. */ @@ -431,12 +431,12 @@ class U_I18N_API Collation { uint32_t tertiary = ce32 & 0xff; if(tertiary < SPECIAL_CE32_LOW_BYTE) { // normal form ppppsstt -> pppp0000ss00tt00 - return ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (tertiary << 8); + return (static_cast<int64_t>(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (tertiary << 8); } else { ce32 -= tertiary; if((tertiary & 0xf) == LONG_PRIMARY_TAG) { // long-primary form ppppppC1 -> pppppp00050000500 - return ((int64_t)ce32 << 32) | COMMON_SEC_AND_TER_CE; + return (static_cast<int64_t>(ce32) << 32) | COMMON_SEC_AND_TER_CE; } else { // long-secondary form ssssttC2 -> 00000000sssstt00 // assert (tertiary & 0xf) == LONG_SECONDARY_TAG @@ -447,14 +447,14 @@ class U_I18N_API Collation { /** Creates a CE from a primary weight. */ static inline int64_t makeCE(uint32_t p) { - return ((int64_t)p << 32) | COMMON_SEC_AND_TER_CE; + return (static_cast<int64_t>(p) << 32) | COMMON_SEC_AND_TER_CE; } /** * Creates a CE from a primary weight, * 16-bit secondary/tertiary weights, and a 2-bit quaternary. */ static inline int64_t makeCE(uint32_t p, uint32_t s, uint32_t t, uint32_t q) { - return ((int64_t)p << 32) | (s << 16) | t | (q << 6); + return (static_cast<int64_t>(p) << 32) | (s << 16) | t | (q << 6); } /** diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 3da74cc4833c53..0f7043340be315 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -182,7 +182,7 @@ RuleBasedCollator::internalBuildTailoring(const UnicodeString &rules, // Set attributes after building the collator, // to keep the default settings consistent with the rule string. if(strength != UCOL_DEFAULT) { - setAttribute(UCOL_STRENGTH, (UColAttributeValue)strength, errorCode); + setAttribute(UCOL_STRENGTH, static_cast<UColAttributeValue>(strength), errorCode); } if(decompositionMode != UCOL_DEFAULT) { setAttribute(UCOL_NORMALIZATION_MODE, decompositionMode, errorCode); @@ -601,7 +601,7 @@ CollationBuilder::getSpecialResetPosition(const UnicodeString &str, ce = tempCEFromIndexAndStrength(index, strength); } else { U_ASSERT(strength == UCOL_PRIMARY); - uint32_t p = (uint32_t)(ce >> 32); + uint32_t p = static_cast<uint32_t>(ce >> 32); int32_t pIndex = rootElements.findPrimary(p); UBool isCompressible = baseData->isCompressiblePrimary(p); p = rootElements.getPrimaryAfter(p, pIndex, isCompressible); @@ -700,7 +700,7 @@ CollationBuilder::addRelation(int32_t strength, const UnicodeString &prefix, int32_t index = findOrInsertNodeForCEs(strength, parserErrorReason, errorCode); U_ASSERT(cesLength > 0); int64_t ce = ces[cesLength - 1]; - if(strength == UCOL_PRIMARY && !isTempCE(ce) && (uint32_t)(ce >> 32) == 0) { + if (strength == UCOL_PRIMARY && !isTempCE(ce) && static_cast<uint32_t>(ce >> 32) == 0) { // There is no primary gap between ignorables and the space-first-primary. errorCode = U_UNSUPPORTED_ERROR; parserErrorReason = "tailoring primary after ignorables not supported"; @@ -791,7 +791,7 @@ CollationBuilder::findOrInsertNodeForCEs(int32_t strength, const char *&parserEr } // root CE - if((uint8_t)(ce >> 56) == Collation::UNASSIGNED_IMPLICIT_BYTE) { + if (static_cast<uint8_t>(ce >> 56) == Collation::UNASSIGNED_IMPLICIT_BYTE) { errorCode = U_UNSUPPORTED_ERROR; parserErrorReason = "tailoring relative to an unassigned code point not supported"; return 0; @@ -808,9 +808,9 @@ CollationBuilder::findOrInsertNodeForRootCE(int64_t ce, int32_t strength, UError // down to the requested level/strength. // Root CEs must have common=zero quaternary weights (for which we never insert any nodes). U_ASSERT((ce & 0xc0) == 0); - int32_t index = findOrInsertNodeForPrimary((uint32_t)(ce >> 32), errorCode); + int32_t index = findOrInsertNodeForPrimary(static_cast<uint32_t>(ce >> 32), errorCode); if(strength >= UCOL_SECONDARY) { - uint32_t lower32 = (uint32_t)ce; + uint32_t lower32 = static_cast<uint32_t>(ce); index = findOrInsertWeakNode(index, lower32 >> 16, UCOL_SECONDARY, errorCode); if(strength >= UCOL_TERTIARY) { index = findOrInsertWeakNode(index, lower32 & Collation::ONLY_TERTIARY_MASK, @@ -838,7 +838,7 @@ binarySearchForRootPrimaryNode(const int32_t *rootPrimaryIndexes, int32_t length for (;;) { int32_t i = (start + limit) / 2; int64_t node = nodes[rootPrimaryIndexes[i]]; - uint32_t nodePrimary = (uint32_t)(node >> 32); // weight32FromNode(node) + uint32_t nodePrimary = static_cast<uint32_t>(node >> 32); // weight32FromNode(node) if (p == nodePrimary) { return i; } else if (p < nodePrimary) { @@ -898,7 +898,7 @@ CollationBuilder::findOrInsertWeakNode(int32_t index, uint32_t weight16, int32_t // Move the HAS_BEFORE3 flag from the parent node // to the new secondary common node. commonNode |= node & HAS_BEFORE3; - node &= ~(int64_t)HAS_BEFORE3; + node &= ~static_cast<int64_t>(HAS_BEFORE3); } nodes.setElementAt(node | hasThisLevelBefore, index); // Insert below-common-weight node. @@ -1045,10 +1045,10 @@ CollationBuilder::setCaseBits(const UnicodeString &nfdString, int64_t ce = baseCEs.getCE(i); if((ce >> 32) != 0) { ++numBasePrimaries; - uint32_t c = ((uint32_t)ce >> 14) & 3; + uint32_t c = (static_cast<uint32_t>(ce) >> 14) & 3; U_ASSERT(c == 0 || c == 2); // lowercase or uppercase, no mixed case in any base CE if(numBasePrimaries < numTailoredPrimaries) { - cases |= (int64_t)c << ((numBasePrimaries - 1) * 2); + cases |= static_cast<int64_t>(c) << ((numBasePrimaries - 1) * 2); } else if(numBasePrimaries == numTailoredPrimaries) { lastCase = c; } else if(c != lastCase) { @@ -1061,7 +1061,7 @@ CollationBuilder::setCaseBits(const UnicodeString &nfdString, } } if(numBasePrimaries >= numTailoredPrimaries) { - cases |= (int64_t)lastCase << ((numTailoredPrimaries - 1) * 2); + cases |= static_cast<int64_t>(lastCase) << ((numTailoredPrimaries - 1) * 2); } } @@ -1119,9 +1119,9 @@ CollationBuilder::addWithClosure(const UnicodeString &nfdPrefix, const UnicodeSt // Please let us know if you have a reasonable use case that needed // for a practical Collation rule that needs to increase this limit. // This value is needed for compiling a rule with eight Hangul syllables such as -// "&a=b쫊쫊쫊쫊쫊쫊쫊쫊" without error, which should be more than realistic +// "&a=b쫊쫊쫊쫊쫊쫊쫊" without error, which should be more than realistic // usage. -static constexpr int32_t kClosureLoopLimit = 6560; +static constexpr int32_t kClosureLoopLimit = 3000; uint32_t CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString, @@ -1138,12 +1138,12 @@ CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeSt for(;;) { UnicodeString str = stringIter.next(); if(str.isBogus()) { break; } - if(ignoreString(str, errorCode) || str == nfdString) { continue; } if (loop++ > kClosureLoopLimit) { // To avoid hang as in ICU-22517, return with error. errorCode = U_INPUT_TOO_LONG_ERROR; return ce32; } + if(ignoreString(str, errorCode) || str == nfdString) { continue; } ce32 = addIfDifferent(prefix, str, newCEs, newCEsLength, ce32, errorCode); if(U_FAILURE(errorCode)) { return ce32; } } @@ -1159,12 +1159,12 @@ CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeSt for(;;) { UnicodeString str = stringIter.next(); if(str.isBogus()) { break; } - if(ignoreString(str, errorCode) || (samePrefix && str == nfdString)) { continue; } if (loop++ > kClosureLoopLimit) { // To avoid hang as in ICU-22517, return with error. errorCode = U_INPUT_TOO_LONG_ERROR; return ce32; } + if(ignoreString(str, errorCode) || (samePrefix && str == nfdString)) { continue; } ce32 = addIfDifferent(prefix, str, newCEs, newCEsLength, ce32, errorCode); if(U_FAILURE(errorCode)) { return ce32; } } @@ -1652,7 +1652,7 @@ CollationBuilder::ceStrength(int64_t ce) { return isTempCE(ce) ? strengthFromTempCE(ce) : (ce & INT64_C(0xff00000000000000)) != 0 ? UCOL_PRIMARY : - ((uint32_t)ce & 0xff000000) != 0 ? UCOL_SECONDARY : + (static_cast<uint32_t>(ce) & 0xff000000) != 0 ? UCOL_SECONDARY : ce != 0 ? UCOL_TERTIARY : UCOL_IDENTICAL; } @@ -1675,7 +1675,7 @@ ucol_openRules(const char16_t *rules, int32_t rulesLength, *pErrorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; } - UnicodeString r((UBool)(rulesLength < 0), rules, rulesLength); + UnicodeString r(rulesLength < 0, rules, rulesLength); coll->internalBuildTailoring(r, strength, normalizationMode, parseError, nullptr, *pErrorCode); if(U_FAILURE(*pErrorCode)) { delete coll; diff --git a/deps/icu-small/source/i18n/collationbuilder.h b/deps/icu-small/source/i18n/collationbuilder.h index 22e24ddb813aa2..a5fd8f427a42eb 100644 --- a/deps/icu-small/source/i18n/collationbuilder.h +++ b/deps/icu-small/source/i18n/collationbuilder.h @@ -185,9 +185,9 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { // CE byte offsets, to ensure valid CE bytes, and case bits 11 INT64_C(0x4040000006002000) + // index bits 19..13 -> primary byte 1 = CE bits 63..56 (byte values 40..BF) - ((int64_t)(index & 0xfe000) << 43) + + (static_cast<int64_t>(index & 0xfe000) << 43) + // index bits 12..6 -> primary byte 2 = CE bits 55..48 (byte values 40..BF) - ((int64_t)(index & 0x1fc0) << 42) + + (static_cast<int64_t>(index & 0x1fc0) << 42) + // index bits 5..0 -> secondary byte 1 = CE bits 31..24 (byte values 06..45) ((index & 0x3f) << 24) + // strength bits 1..0 -> tertiary byte 1 = CE bits 13..8 (byte values 20..23) @@ -196,24 +196,24 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { static inline int32_t indexFromTempCE(int64_t tempCE) { tempCE -= INT64_C(0x4040000006002000); return - ((int32_t)(tempCE >> 43) & 0xfe000) | - ((int32_t)(tempCE >> 42) & 0x1fc0) | - ((int32_t)(tempCE >> 24) & 0x3f); + (static_cast<int32_t>(tempCE >> 43) & 0xfe000) | + (static_cast<int32_t>(tempCE >> 42) & 0x1fc0) | + (static_cast<int32_t>(tempCE >> 24) & 0x3f); } static inline int32_t strengthFromTempCE(int64_t tempCE) { - return ((int32_t)tempCE >> 8) & 3; + return (static_cast<int32_t>(tempCE) >> 8) & 3; } static inline UBool isTempCE(int64_t ce) { - uint32_t sec = (uint32_t)ce >> 24; + uint32_t sec = static_cast<uint32_t>(ce) >> 24; return 6 <= sec && sec <= 0x45; } static inline int32_t indexFromTempCE32(uint32_t tempCE32) { tempCE32 -= 0x40400620; return - ((int32_t)(tempCE32 >> 11) & 0xfe000) | - ((int32_t)(tempCE32 >> 10) & 0x1fc0) | - ((int32_t)(tempCE32 >> 8) & 0x3f); + (static_cast<int32_t>(tempCE32 >> 11) & 0xfe000) | + (static_cast<int32_t>(tempCE32 >> 10) & 0x1fc0) | + (static_cast<int32_t>(tempCE32 >> 8) & 0x3f); } static inline UBool isTempCE32(uint32_t ce32) { return @@ -242,13 +242,13 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { static const int32_t IS_TAILORED = 8; static inline int64_t nodeFromWeight32(uint32_t weight32) { - return (int64_t)weight32 << 32; + return static_cast<int64_t>(weight32) << 32; } static inline int64_t nodeFromWeight16(uint32_t weight16) { - return (int64_t)weight16 << 48; + return static_cast<int64_t>(weight16) << 48; } static inline int64_t nodeFromPreviousIndex(int32_t previous) { - return (int64_t)previous << 28; + return static_cast<int64_t>(previous) << 28; } static inline int64_t nodeFromNextIndex(int32_t next) { return next << 8; @@ -258,19 +258,19 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { } static inline uint32_t weight32FromNode(int64_t node) { - return (uint32_t)(node >> 32); + return static_cast<uint32_t>(node >> 32); } static inline uint32_t weight16FromNode(int64_t node) { - return (uint32_t)(node >> 48) & 0xffff; + return static_cast<uint32_t>(node >> 48) & 0xffff; } static inline int32_t previousIndexFromNode(int64_t node) { - return (int32_t)(node >> 28) & MAX_INDEX; + return static_cast<int32_t>(node >> 28) & MAX_INDEX; } static inline int32_t nextIndexFromNode(int64_t node) { - return ((int32_t)node >> 8) & MAX_INDEX; + return (static_cast<int32_t>(node) >> 8) & MAX_INDEX; } static inline int32_t strengthFromNode(int64_t node) { - return (int32_t)node & 3; + return static_cast<int32_t>(node) & 3; } static inline UBool nodeHasBefore2(int64_t node) { @@ -353,7 +353,7 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { * (&[before 2] resets to an explicit secondary node so that * the following addRelation(secondary) tailors right after that. * If we did not have this node and instead were to reset on the primary node, - * then addRelation(secondary) would skip forward to the the COMMON_WEIGHT16 node.) + * then addRelation(secondary) would skip forward to the COMMON_WEIGHT16 node.) * * If the flag is not set, then there are no explicit secondary nodes * with the common or lower weights. diff --git a/deps/icu-small/source/i18n/collationcompare.cpp b/deps/icu-small/source/i18n/collationcompare.cpp index d9048afc279699..b4c0a3b2382993 100644 --- a/deps/icu-small/source/i18n/collationcompare.cpp +++ b/deps/icu-small/source/i18n/collationcompare.cpp @@ -47,7 +47,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat uint32_t leftPrimary; do { int64_t ce = left.nextCE(errorCode); - leftPrimary = (uint32_t)(ce >> 32); + leftPrimary = static_cast<uint32_t>(ce >> 32); if(leftPrimary < variableTop && leftPrimary > Collation::MERGE_SEPARATOR_PRIMARY) { // Variable CE, shift it to quaternary level. // Ignore all following primary ignorables, and shift further variable CEs. @@ -57,7 +57,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat left.setCurrentCE(ce & INT64_C(0xffffffff00000000)); for(;;) { ce = left.nextCE(errorCode); - leftPrimary = (uint32_t)(ce >> 32); + leftPrimary = static_cast<uint32_t>(ce >> 32); if(leftPrimary == 0) { left.setCurrentCE(0); } else { @@ -72,7 +72,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat uint32_t rightPrimary; do { int64_t ce = right.nextCE(errorCode); - rightPrimary = (uint32_t)(ce >> 32); + rightPrimary = static_cast<uint32_t>(ce >> 32); if(rightPrimary < variableTop && rightPrimary > Collation::MERGE_SEPARATOR_PRIMARY) { // Variable CE, shift it to quaternary level. // Ignore all following primary ignorables, and shift further variable CEs. @@ -82,7 +82,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat right.setCurrentCE(ce & INT64_C(0xffffffff00000000)); for(;;) { ce = right.nextCE(errorCode); - rightPrimary = (uint32_t)(ce >> 32); + rightPrimary = static_cast<uint32_t>(ce >> 32); if(rightPrimary == 0) { right.setCurrentCE(0); } else { @@ -116,12 +116,12 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat for(;;) { uint32_t leftSecondary; do { - leftSecondary = ((uint32_t)left.getCE(leftIndex++)) >> 16; + leftSecondary = static_cast<uint32_t>(left.getCE(leftIndex++)) >> 16; } while(leftSecondary == 0); uint32_t rightSecondary; do { - rightSecondary = ((uint32_t)right.getCE(rightIndex++)) >> 16; + rightSecondary = static_cast<uint32_t>(right.getCE(rightIndex++)) >> 16; } while(rightSecondary == 0); if(leftSecondary != rightSecondary) { @@ -138,13 +138,13 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat // Find the merge separator or the NO_CE terminator. uint32_t p; int32_t leftLimit = leftStart; - while((p = (uint32_t)(left.getCE(leftLimit) >> 32)) > + while ((p = static_cast<uint32_t>(left.getCE(leftLimit) >> 32)) > Collation::MERGE_SEPARATOR_PRIMARY || p == 0) { ++leftLimit; } int32_t rightLimit = rightStart; - while((p = (uint32_t)(right.getCE(rightLimit) >> 32)) > + while ((p = static_cast<uint32_t>(right.getCE(rightLimit) >> 32)) > Collation::MERGE_SEPARATOR_PRIMARY || p == 0) { ++rightLimit; @@ -156,12 +156,12 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat for(;;) { int32_t leftSecondary = 0; while(leftSecondary == 0 && leftIndex > leftStart) { - leftSecondary = ((uint32_t)left.getCE(--leftIndex)) >> 16; + leftSecondary = static_cast<uint32_t>(left.getCE(--leftIndex)) >> 16; } int32_t rightSecondary = 0; while(rightSecondary == 0 && rightIndex > rightStart) { - rightSecondary = ((uint32_t)right.getCE(--rightIndex)) >> 16; + rightSecondary = static_cast<uint32_t>(right.getCE(--rightIndex)) >> 16; } if(leftSecondary != rightSecondary) { @@ -197,15 +197,15 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat int64_t ce; do { ce = left.getCE(leftIndex++); - leftCase = (uint32_t)ce; - } while((uint32_t)(ce >> 32) == 0 || leftCase == 0); + leftCase = static_cast<uint32_t>(ce); + } while (static_cast<uint32_t>(ce >> 32) == 0 || leftCase == 0); leftLower32 = leftCase; leftCase &= 0xc000; do { ce = right.getCE(rightIndex++); - rightCase = (uint32_t)ce; - } while((uint32_t)(ce >> 32) == 0 || rightCase == 0); + rightCase = static_cast<uint32_t>(ce); + } while (static_cast<uint32_t>(ce >> 32) == 0 || rightCase == 0); rightCase &= 0xc000; } else { // Secondary+caseLevel: By analogy with the above, @@ -223,13 +223,13 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat // turning 0.0.ut into 0.0.0.t. // (See LDML Collation, Case Parameters.) do { - leftCase = (uint32_t)left.getCE(leftIndex++); + leftCase = static_cast<uint32_t>(left.getCE(leftIndex++)); } while(leftCase <= 0xffff); leftLower32 = leftCase; leftCase &= 0xc000; do { - rightCase = (uint32_t)right.getCE(rightIndex++); + rightCase = static_cast<uint32_t>(right.getCE(rightIndex++)); } while(rightCase <= 0xffff); rightCase &= 0xc000; } @@ -257,7 +257,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat for(;;) { uint32_t leftLower32, leftTertiary; do { - leftLower32 = (uint32_t)left.getCE(leftIndex++); + leftLower32 = static_cast<uint32_t>(left.getCE(leftIndex++)); anyQuaternaries |= leftLower32; U_ASSERT((leftLower32 & Collation::ONLY_TERTIARY_MASK) != 0 || (leftLower32 & 0xc0c0) == 0); @@ -266,7 +266,7 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat uint32_t rightLower32, rightTertiary; do { - rightLower32 = (uint32_t)right.getCE(rightIndex++); + rightLower32 = static_cast<uint32_t>(right.getCE(rightIndex++)); anyQuaternaries |= rightLower32; U_ASSERT((rightLower32 & Collation::ONLY_TERTIARY_MASK) != 0 || (rightLower32 & 0xc0c0) == 0); @@ -313,10 +313,10 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat uint32_t leftQuaternary; do { int64_t ce = left.getCE(leftIndex++); - leftQuaternary = (uint32_t)ce & 0xffff; + leftQuaternary = static_cast<uint32_t>(ce) & 0xffff; if(leftQuaternary <= Collation::NO_CE_WEIGHT16) { // Variable primary or completely ignorable or NO_CE. - leftQuaternary = (uint32_t)(ce >> 32); + leftQuaternary = static_cast<uint32_t>(ce >> 32); } else { // Regular CE, not tertiary ignorable. // Preserve the quaternary weight in bits 7..6. @@ -327,10 +327,10 @@ CollationCompare::compareUpToQuaternary(CollationIterator &left, CollationIterat uint32_t rightQuaternary; do { int64_t ce = right.getCE(rightIndex++); - rightQuaternary = (uint32_t)ce & 0xffff; + rightQuaternary = static_cast<uint32_t>(ce) & 0xffff; if(rightQuaternary <= Collation::NO_CE_WEIGHT16) { // Variable primary or completely ignorable or NO_CE. - rightQuaternary = (uint32_t)(ce >> 32); + rightQuaternary = static_cast<uint32_t>(ce >> 32); } else { // Regular CE, not tertiary ignorable. // Preserve the quaternary weight in bits 7..6. diff --git a/deps/icu-small/source/i18n/collationdata.cpp b/deps/icu-small/source/i18n/collationdata.cpp index 1b8b6a76de39cc..8d31711aa9a86a 100644 --- a/deps/icu-small/source/i18n/collationdata.cpp +++ b/deps/icu-small/source/i18n/collationdata.cpp @@ -118,7 +118,7 @@ CollationData::getSingleCE(UChar32 c, UErrorCode &errorCode) const { uint32_t CollationData::getFirstPrimaryForGroup(int32_t script) const { int32_t index = getScriptIndex(script); - return index == 0 ? 0 : (uint32_t)scriptStarts[index] << 16; + return index == 0 ? 0 : static_cast<uint32_t>(scriptStarts[index]) << 16; } uint32_t @@ -251,14 +251,14 @@ CollationData::makeReorderRanges(const int32_t *reorder, int32_t length, for(int32_t i = 0; i < length; ++i) { int32_t reorderCode = reorder[i] - UCOL_REORDER_CODE_FIRST; if(0 <= reorderCode && reorderCode < MAX_NUM_SPECIAL_REORDER_CODES) { - specials |= (uint32_t)1 << reorderCode; + specials |= static_cast<uint32_t>(1) << reorderCode; } } // Start the reordering with the special low reorder codes that do not occur in the input. for(int32_t i = 0; i < MAX_NUM_SPECIAL_REORDER_CODES; ++i) { int32_t index = scriptsIndex[numScripts + i]; - if(index != 0 && (specials & ((uint32_t)1 << i)) == 0) { + if (index != 0 && (specials & (static_cast<uint32_t>(1) << i)) == 0) { lowStart = addLowScriptRange(table, index, lowStart); } } @@ -354,7 +354,7 @@ CollationData::makeReorderRanges(const int32_t *reorder, int32_t length, ++i; } if(offset != 0 || i < scriptStartsLength - 1) { - ranges.addElement(((int32_t)scriptStarts[i] << 16) | (offset & 0xffff), errorCode); + ranges.addElement((static_cast<int32_t>(scriptStarts[i]) << 16) | (offset & 0xffff), errorCode); } if(i == scriptStartsLength - 1) { break; } offset = nextOffset; @@ -367,7 +367,7 @@ CollationData::addLowScriptRange(uint8_t table[], int32_t index, int32_t lowStar if((start & 0xff) < (lowStart & 0xff)) { lowStart += 0x100; } - table[index] = (uint8_t)(lowStart >> 8); + table[index] = static_cast<uint8_t>(lowStart >> 8); int32_t limit = scriptStarts[index + 1]; lowStart = ((lowStart & 0xff00) + ((limit & 0xff00) - (start & 0xff00))) | (limit & 0xff); return lowStart; @@ -381,7 +381,7 @@ CollationData::addHighScriptRange(uint8_t table[], int32_t index, int32_t highLi } int32_t start = scriptStarts[index]; highLimit = ((highLimit & 0xff00) - ((limit & 0xff00) - (start & 0xff00))) | (start & 0xff); - table[index] = (uint8_t)(highLimit >> 8); + table[index] = static_cast<uint8_t>(highLimit >> 8); return highLimit; } diff --git a/deps/icu-small/source/i18n/collationdata.h b/deps/icu-small/source/i18n/collationdata.h index d4f66828fbcb32..783a79d65d3ba9 100644 --- a/deps/icu-small/source/i18n/collationdata.h +++ b/deps/icu-small/source/i18n/collationdata.h @@ -91,7 +91,7 @@ struct U_I18N_API CollationData : public UMemory { * Access to the defaultCE32 for contraction and prefix matching. */ static uint32_t readCE32(const char16_t *p) { - return ((uint32_t)p[0] << 16) | p[1]; + return (static_cast<uint32_t>(p[0]) << 16) | p[1]; } /** diff --git a/deps/icu-small/source/i18n/collationdatabuilder.cpp b/deps/icu-small/source/i18n/collationdatabuilder.cpp index 7c6f1b881e6b1e..4baea33c12eb99 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.cpp +++ b/deps/icu-small/source/i18n/collationdatabuilder.cpp @@ -381,7 +381,7 @@ CollationDataBuilder::maybeSetPrimaryRange(UChar32 start, UChar32 end, if(2 <= step && step <= 0x7f && (blockDelta >= 3 || (blockDelta > 0 && (start & 0x1f) <= 0x1c && (end & 0x1f) >= 3))) { - int64_t dataCE = ((int64_t)primary << 32) | (start << 8) | step; + int64_t dataCE = (static_cast<int64_t>(primary) << 32) | (start << 8) | step; if(isCompressiblePrimary(primary)) { dataCE |= 0x80; } int32_t index = addCE(dataCE, errorCode); if(U_FAILURE(errorCode)) { return 0; } @@ -526,9 +526,9 @@ int32_t CollationDataBuilder::addCE32(uint32_t ce32, UErrorCode &errorCode) { int32_t length = ce32s.size(); for(int32_t i = 0; i < length; ++i) { - if(ce32 == (uint32_t)ce32s.elementAti(i)) { return i; } + if (ce32 == static_cast<uint32_t>(ce32s.elementAti(i))) { return i; } } - ce32s.addElement((int32_t)ce32, errorCode); + ce32s.addElement(static_cast<int32_t>(ce32), errorCode); return length; } @@ -586,27 +586,19 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString & if (s != sInNfd) { // s is not in NFD, so it cannot match in ICU4X, since ICU4X only // does NFD lookups. - // Now check that we're only rejecting known cases. - if (s.length() == 2) { - char16_t second = s.charAt(1); - if (second == 0x0F73 || second == 0x0F75 || second == 0x0F81) { - // Second is a special decomposing Tibetan vowel sign. - // These also get added in the decomposed form, so ignoring - // this instance is OK. - return; - } - if (c == 0xFDD1 && second == 0xAC00) { - // This strange contraction exists in the root and - // doesn't have a decomposed counterpart there. - // This won't match in ICU4X anyway and is very strange: - // Unassigned Arabic presentation form contracting with - // the very first Hangul syllable. Let's ignore this - // explicitly. - return; - } - } - // Unknown case worth investigating if ever found. - errorCode = U_UNSUPPORTED_ERROR; + + // As of Unicode 16 alpha, the cases that come here are: + // + // 1. The second character is a special decomposing Tibetan vowel + // sign. These are OK to ignore in the precomposed form, since + // the decomposed form is added also. + // 2. Likewise for KIRAT RAI VOWEL SIGN AA followed by KIRAT RAI VOWEL SIGN AI + // and other such cases. + // For details see the normalization section of + // https://www.unicode.org/review/pri497/pri497-background.html + // 3. U+FDD1 followed by U+AC00 is a marker for the alphabetical + // index feature of ICU4C, which at this time does not have + // a counterpart in ICU4X. return; } @@ -663,6 +655,20 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString & return; } } + int32_t sCount = s.countChar32(); + UChar32 sUtf32[32]; + int32_t sLen = s.toUTF32(sUtf32, 32, errorCode); + if (sLen != sCount) { + // If this error is ever reached, just increase the buffer + // size above. + errorCode = U_UNSUPPORTED_ERROR; + return; + } + for (int32_t i = 1; i < sLen - 1; ++i) { + if (u_getCombiningClass(sUtf32[i]) == 0) { + contractionMiddleStarter.add(sUtf32[i]); + } + } } } @@ -692,7 +698,7 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString & if(!isBuilderContextCE32(oldCE32)) { // Replace the simple oldCE32 with a builder context CE32 // pointing to a new ConditionalCE32 list head. - int32_t index = addConditionalCE32(UnicodeString((char16_t)0), oldCE32, errorCode); + int32_t index = addConditionalCE32(UnicodeString(static_cast<char16_t>(0)), oldCE32, errorCode); if(U_FAILURE(errorCode)) { return; } uint32_t contextCE32 = makeBuilderContextCE32(index); utrie2_set32(trie, c, contextCE32, &errorCode); @@ -703,8 +709,22 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString & cond->builtCE32 = Collation::NO_CE32; } UnicodeString suffix(s, cLength); - UnicodeString context((char16_t)prefix.length()); + UnicodeString context(static_cast<char16_t>(prefix.length())); context.append(prefix).append(suffix); + if (icu4xMode && !suffix.isEmpty() && !prefix.isEmpty()) { + // ICU4X does not support the combination of prefix and contraction. + // This combination is supported by LDML but does not occur in the + // root or any tailorings in CLDR as of February 2025. + // If support for this case becomes necessary, a practical change + // would be allocating a flag on prefix ce32 and setting the + // flag on a prefix ce32 if any ce32 that can be found under + // the prefix ce32 (either the default or any UCharsTrie value) is + // a contraction ce32 or if the prefix ce32 is the utrie2 value + // for a character that is a starter that occurs in a middle + // (neither first nor last) position in a contraction. + errorCode = U_UNSUPPORTED_ERROR; + return; + } unsafeBackwardSet.addAll(suffix); for(;;) { // invariant: context > cond->context @@ -738,9 +758,9 @@ CollationDataBuilder::addCE32(const UnicodeString &prefix, const UnicodeString & uint32_t CollationDataBuilder::encodeOneCEAsCE32(int64_t ce) { - uint32_t p = (uint32_t)(ce >> 32); - uint32_t lower32 = (uint32_t)ce; - uint32_t t = (uint32_t)(ce & 0xffff); + uint32_t p = static_cast<uint32_t>(ce >> 32); + uint32_t lower32 = static_cast<uint32_t>(ce); + uint32_t t = static_cast<uint32_t>(ce & 0xffff); U_ASSERT((t & 0xc000) != 0xc000); // Impossible case bits 11 mark special CE32s. if((ce & INT64_C(0xffff00ff00ff)) == 0) { // normal form ppppsstt @@ -794,15 +814,15 @@ CollationDataBuilder::encodeCEs(const int64_t ces[], int32_t cesLength, // on checking this tag when using the data. int64_t ce0 = ces[0]; int64_t ce1 = ces[1]; - uint32_t p0 = (uint32_t)(ce0 >> 32); + uint32_t p0 = static_cast<uint32_t>(ce0 >> 32); if((ce0 & INT64_C(0xffffffffff00ff)) == Collation::COMMON_SECONDARY_CE && (ce1 & INT64_C(0xffffffff00ffffff)) == Collation::COMMON_TERTIARY_CE && p0 != 0) { // Latin mini expansion return p0 | - (((uint32_t)ce0 & 0xff00u) << 8) | - (uint32_t)(ce1 >> 16) | + ((static_cast<uint32_t>(ce0) & 0xff00u) << 8) | + static_cast<uint32_t>(ce1 >> 16) | Collation::SPECIAL_CE32_LOW_BYTE | Collation::LATIN_EXPANSION_TAG; } @@ -815,7 +835,7 @@ CollationDataBuilder::encodeCEs(const int64_t ces[], int32_t cesLength, } uint32_t ce32 = encodeOneCEAsCE32(ces[i]); if(ce32 == Collation::NO_CE32) { break; } - newCE32s[i] = (int32_t)ce32; + newCE32s[i] = static_cast<int32_t>(ce32); } return encodeExpansion(ces, cesLength, errorCode); } @@ -920,7 +940,7 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte return copyFromBaseCE32(c, ce32, false, errorCode); } ConditionalCE32 head; - UnicodeString context((char16_t)0); + UnicodeString context(static_cast<char16_t>(0)); int32_t index; if(Collation::isContractionCE32(ce32)) { index = copyContractionsFromBaseCE32(context, c, ce32, &head, errorCode); @@ -934,8 +954,8 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte while(prefixes.next(errorCode)) { context = prefixes.getString(); context.reverse(); - context.insert(0, (char16_t)context.length()); - ce32 = (uint32_t)prefixes.getValue(); + context.insert(0, static_cast<char16_t>(context.length())); + ce32 = static_cast<uint32_t>(prefixes.getValue()); if(Collation::isContractionCE32(ce32)) { index = copyContractionsFromBaseCE32(context, c, ce32, cond, errorCode); } else { @@ -956,7 +976,7 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte return copyFromBaseCE32(c, ce32, false, errorCode); } ConditionalCE32 head; - UnicodeString context((char16_t)0); + UnicodeString context(static_cast<char16_t>(0)); copyContractionsFromBaseCE32(context, c, ce32, &head, errorCode); ce32 = makeBuilderContextCE32(head.next); contextChars.add(c); @@ -1002,7 +1022,7 @@ CollationDataBuilder::copyContractionsFromBaseCE32(UnicodeString &context, UChar UCharsTrie::Iterator suffixes(p + 2, 0, errorCode); while(suffixes.next(errorCode)) { context.append(suffixes.getString()); - ce32 = copyFromBaseCE32(c, (uint32_t)suffixes.getValue(), true, errorCode); + ce32 = copyFromBaseCE32(c, static_cast<uint32_t>(suffixes.getValue()), true, errorCode); cond->next = index = addConditionalCE32(context, ce32, errorCode); if(U_FAILURE(errorCode)) { return 0; } // No need to update the unsafeBackwardSet because the tailoring set @@ -1323,7 +1343,7 @@ CollationDataBuilder::setLeadSurrogates(UErrorCode &errorCode) { utrie2_enumForLeadSurrogate(trie, lead, nullptr, enumRangeLeadValue, &value); utrie2_set32ForLeadSurrogateCodeUnit( trie, lead, - Collation::makeCE32FromTagAndIndex(Collation::LEAD_SURROGATE_TAG, 0) | (uint32_t)value, + Collation::makeCE32FromTagAndIndex(Collation::LEAD_SURROGATE_TAG, 0) | static_cast<uint32_t>(value), &errorCode); } } @@ -1357,7 +1377,7 @@ CollationDataBuilder::buildMappings(CollationData &data, UErrorCode &errorCode) if(getJamoCE32s(jamoCE32s, errorCode)) { jamoIndex = ce32s.size(); for(int32_t i = 0; i < CollationData::JAMO_CE32S_LENGTH; ++i) { - ce32s.addElement((int32_t)jamoCE32s[i], errorCode); + ce32s.addElement(static_cast<int32_t>(jamoCE32s[i]), errorCode); } // Small optimization: Use a bit in the Hangul ce32 // to indicate that none of the Jamo CE32s are isSpecialCE32() @@ -1399,9 +1419,71 @@ CollationDataBuilder::buildMappings(CollationData &data, UErrorCode &errorCode) setDigitTags(errorCode); setLeadSurrogates(errorCode); - if (!icu4xMode) { + if (icu4xMode) { + // Make sure that starters that occur is the middle of a + // contraction have contraction ce32 with the + // `CONTRACT_HAS_STARTER` flag set so that starters that + // can occur in a non-final position in a contraction can + // be easily recognized from having a contraction ce32 + // that has the `CONTRACT_HAS_STARTER` flag set. + + UCharsTrieBuilder contractionBuilder(errorCode); + // Intentionally unpaired low surrogate to make it never + // match well-formed UTF-16 which ICU4X feeds to the + // matcher. + UnicodeString placeholder(0xDC00); + + for (UChar32 c : contractionMiddleStarter.codePoints()) { + uint32_t ce32 = utrie2_get32(trie, c); + UBool fromBase = false; + if(ce32 == Collation::FALLBACK_CE32) { + fromBase = true; + ce32 = base->getCE32(c); + } + if (!(Collation::hasCE32Tag(ce32, Collation::CONTRACTION_TAG) && (ce32 & Collation::CONTRACT_HAS_STARTER))) { + if (fromBase) { + // This case does not actually happen as of February 2025. + ce32 = copyFromBaseCE32(c, ce32, true, errorCode); + } + if (Collation::hasCE32Tag(ce32, Collation::CONTRACTION_TAG)) { + // This middle starter is also the first character of another + // contraction, but that contraction does not have the + // CONTRACT_HAS_STARTER flag. Let's add the flag to + // mark this at the expense of pessimizing the matching + // of this contraction. + // As of February 2025, this case does not actually occur + // in CLDR. + ce32 |= Collation::CONTRACT_HAS_STARTER; + } else { + // This middle starter is not also the first character + // in another contraction. + + // The UCharsTrie needs to contain some placeholder + // because it cannot be empty. We build a trie + // that never actually matches anything that ICU4X can try to + // match, since ICU4X always passes well-formed UTF-16 to the + // matcher and we put an unpaired low surrogate into the trie. + // This pessimizes the character to CE mapping of the `c`, + // since useless trie matching will be attempted but as of + // February 2025, only two relatively rare characters are affected. + contractionBuilder.clear(); + contractionBuilder.add(placeholder, static_cast<int32_t>(ce32), errorCode); + + int32_t index = addContextTrie(ce32, contractionBuilder, errorCode); + if(U_FAILURE(errorCode)) { return; } + if(index > Collation::MAX_INDEX) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + return; + } + // Set CONTRACT_HAS_STARTER to make identical prefix matching able to catch this. + ce32 = Collation::makeCE32FromTagAndIndex(Collation::CONTRACTION_TAG, index) | Collation::CONTRACT_HAS_STARTER; + } + utrie2_set32(trie, c, ce32, &errorCode); + } + } + } else { // For U+0000, move its normal ce32 into CE32s[0] and set U0000_TAG. - ce32s.setElementAt((int32_t)utrie2_get32(trie, 0), 0); + ce32s.setElementAt(static_cast<int32_t>(utrie2_get32(trie, 0)), 0); utrie2_set32(trie, 0, Collation::makeCE32FromTagAndIndex(Collation::U0000_TAG, 0), &errorCode); } @@ -1572,7 +1654,7 @@ CollationDataBuilder::buildContext(ConditionalCE32 *head, UErrorCode &errorCode) } } } - contractionBuilder.add(suffix, (int32_t)cond->ce32, errorCode); + contractionBuilder.add(suffix, static_cast<int32_t>(cond->ce32), errorCode); if(cond == lastCond) { break; } cond = getConditionalCE32(cond->next); } @@ -1594,7 +1676,7 @@ CollationDataBuilder::buildContext(ConditionalCE32 *head, UErrorCode &errorCode) } else { prefix.remove(0, 1); // Remove the length unit. prefix.reverse(); - prefixBuilder.add(prefix, (int32_t)ce32, errorCode); + prefixBuilder.add(prefix, static_cast<int32_t>(ce32), errorCode); if(cond->next < 0) { break; } } } @@ -1612,7 +1694,7 @@ int32_t CollationDataBuilder::addContextTrie(uint32_t defaultCE32, UCharsTrieBuilder &trieBuilder, UErrorCode &errorCode) { UnicodeString context; - context.append((char16_t)(defaultCE32 >> 16)).append((char16_t)defaultCE32); + context.append(static_cast<char16_t>(defaultCE32 >> 16)).append(static_cast<char16_t>(defaultCE32)); UnicodeString trieString; context.append(trieBuilder.buildUnicodeString(USTRINGTRIE_BUILD_SMALL, trieString, errorCode)); if(U_FAILURE(errorCode)) { return -1; } diff --git a/deps/icu-small/source/i18n/collationdatabuilder.h b/deps/icu-small/source/i18n/collationdatabuilder.h index cbbd8f264b50ce..20760b59eaffd6 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.h +++ b/deps/icu-small/source/i18n/collationdatabuilder.h @@ -254,6 +254,12 @@ class U_I18N_API CollationDataBuilder : public UObject { int32_t contextsEra = 0; protected: UnicodeSet unsafeBackwardSet; + /** + * For ICU4X only: The starters that occur in some contraction + * in a position that is neither the first nor the last code point + * of the contraction. + */ + UnicodeSet contractionMiddleStarter; UBool modified; UBool icu4xMode; diff --git a/deps/icu-small/source/i18n/collationdatawriter.cpp b/deps/icu-small/source/i18n/collationdatawriter.cpp index ce78a0526a3b04..e7857b0ea6a979 100644 --- a/deps/icu-small/source/i18n/collationdatawriter.cpp +++ b/deps/icu-small/source/i18n/collationdatawriter.cpp @@ -34,21 +34,25 @@ U_NAMESPACE_BEGIN uint8_t * RuleBasedCollator::cloneRuleData(int32_t &length, UErrorCode &errorCode) const { if(U_FAILURE(errorCode)) { return nullptr; } - LocalMemory<uint8_t> buffer((uint8_t *)uprv_malloc(20000)); + LocalMemory<uint8_t> buffer(static_cast<uint8_t*>(uprv_malloc(20000))); if(buffer.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; } - length = cloneBinary(buffer.getAlias(), 20000, errorCode); - if(errorCode == U_BUFFER_OVERFLOW_ERROR) { + UErrorCode bufferStatus = U_ZERO_ERROR; + length = cloneBinary(buffer.getAlias(), 20000, bufferStatus); + if(bufferStatus == U_BUFFER_OVERFLOW_ERROR) { if(buffer.allocateInsteadAndCopy(length, 0) == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; } - errorCode = U_ZERO_ERROR; - length = cloneBinary(buffer.getAlias(), length, errorCode); + bufferStatus = U_ZERO_ERROR; + length = cloneBinary(buffer.getAlias(), length, bufferStatus); + } + if(U_FAILURE(bufferStatus)) { + errorCode = bufferStatus; + return nullptr; } - if(U_FAILURE(errorCode)) { return nullptr; } return buffer.orphan(); } @@ -118,7 +122,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, int32_t fastLatinVersion; if(data.fastLatinTable != nullptr) { - fastLatinVersion = (int32_t)CollationFastLatin::VERSION << 16; + fastLatinVersion = static_cast<int32_t>(CollationFastLatin::VERSION) << 16; } else { fastLatinVersion = 0; } @@ -185,7 +189,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, header.dataHeader.magic2 = 0x27; uprv_memcpy(&header.info, &dataInfo, sizeof(UDataInfo)); uprv_memcpy(header.info.dataVersion, dataVersion, sizeof(UVersionInfo)); - headerSize = (int32_t)sizeof(header); + headerSize = static_cast<int32_t>(sizeof(header)); U_ASSERT((headerSize & 3) == 0); // multiple of 4 bytes if(hasMappings && data.cesLength != 0) { // Sum of the sizes of the data items which are @@ -199,7 +203,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, headerSize += 4; } } - header.dataHeader.headerSize = (uint16_t)headerSize; + header.dataHeader.headerSize = static_cast<uint16_t>(headerSize); if(headerSize <= capacity) { uprv_memcpy(dest, &header, sizeof(header)); // Write 00 bytes so that the padding is not mistaken for a copyright string. @@ -302,7 +306,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, UnicodeString scripts; indexes[CollationDataReader::IX_SCRIPTS_OFFSET] = totalSize; if(isBase) { - scripts.append((char16_t)data.numScripts); + scripts.append(static_cast<char16_t>(data.numScripts)); scripts.append(reinterpret_cast<const char16_t *>(data.scriptsIndex), data.numScripts + 16); scripts.append(reinterpret_cast<const char16_t *>(data.scriptStarts), data.scriptStartsLength); totalSize += scripts.length() * 2; diff --git a/deps/icu-small/source/i18n/collationfastlatin.cpp b/deps/icu-small/source/i18n/collationfastlatin.cpp index f40781a1178f60..e128df49676100 100644 --- a/deps/icu-small/source/i18n/collationfastlatin.cpp +++ b/deps/icu-small/source/i18n/collationfastlatin.cpp @@ -94,7 +94,7 @@ CollationFastLatin::getOptions(const CollationData *data, const CollationSetting } else { p = 0; } - primaries[c] = (uint16_t)p; + primaries[c] = static_cast<uint16_t>(p); } if(digitsAreReordered || (settings.options & CollationSettings::NUMERIC) != 0) { // Bail out for digits. @@ -102,7 +102,7 @@ CollationFastLatin::getOptions(const CollationData *data, const CollationSetting } // Shift the miniVarTop above other options. - return ((int32_t)miniVarTop << 16) | settings.options; + return (static_cast<int32_t>(miniVarTop) << 16) | settings.options; } int32_t @@ -116,7 +116,7 @@ CollationFastLatin::compareUTF16(const uint16_t *table, const uint16_t *primarie U_ASSERT((table[0] >> 8) == VERSION); table += (table[0] & 0xff); // skip the header - uint32_t variableTop = (uint32_t)options >> 16; // see getOptions() + uint32_t variableTop = static_cast<uint32_t>(options) >> 16; // see getOptions() options &= 0xffff; // needed for CollationSettings::getStrength() to work // Check for supported characters, fetch mini CEs, and compare primaries. @@ -452,7 +452,7 @@ CollationFastLatin::compareUTF8(const uint16_t *table, const uint16_t *primaries U_ASSERT((table[0] >> 8) == VERSION); table += (table[0] & 0xff); // skip the header - uint32_t variableTop = (uint32_t)options >> 16; // see RuleBasedCollator::getFastLatinOptions() + uint32_t variableTop = static_cast<uint32_t>(options) >> 16; // see RuleBasedCollator::getFastLatinOptions() options &= 0xffff; // needed for CollationSettings::getStrength() to work // Check for supported characters, fetch mini CEs, and compare primaries. @@ -859,7 +859,7 @@ CollationFastLatin::nextPair(const uint16_t *table, UChar32 c, uint32_t ce, return ce; // simple or special mini CE } else if(ce >= EXPANSION) { int32_t index = NUM_FAST_CHARS + (ce & INDEX_MASK); - return ((uint32_t)table[index + 1] << 16) | table[index]; + return (static_cast<uint32_t>(table[index + 1]) << 16) | table[index]; } else /* ce >= CONTRACTION */ { if(c == 0 && sLength < 0) { sLength = sIndex - 1; @@ -938,7 +938,7 @@ CollationFastLatin::nextPair(const uint16_t *table, UChar32 c, uint32_t ce, if(length == 2) { return ce; } else { - return ((uint32_t)table[index + 2] << 16) | ce; + return (static_cast<uint32_t>(table[index + 2]) << 16) | ce; } } } diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp index b1fd3af70aaafd..dbfdd97497971f 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp @@ -45,9 +45,9 @@ namespace { */ int32_t compareInt64AsUnsigned(int64_t a, int64_t b) { - if((uint64_t)a < (uint64_t)b) { + if (static_cast<uint64_t>(a) < static_cast<uint64_t>(b)) { return -1; - } else if((uint64_t)a > (uint64_t)b) { + } else if (static_cast<uint64_t>(a) > static_cast<uint64_t>(b)) { return 1; } else { return 0; @@ -140,7 +140,7 @@ CollationFastLatinBuilder::loadGroups(const CollationData &data, UErrorCode &err if(U_FAILURE(errorCode)) { return false; } headerLength = 1 + NUM_SPECIAL_GROUPS; uint32_t r0 = (CollationFastLatin::VERSION << 8) | headerLength; - result.append((char16_t)r0); + result.append(static_cast<char16_t>(r0)); // The first few reordering groups should be special groups // (space, punct, ..., digit) followed by Latn, then Grek and other scripts. for(int32_t i = 0; i < NUM_SPECIAL_GROUPS; ++i) { @@ -149,7 +149,7 @@ CollationFastLatinBuilder::loadGroups(const CollationData &data, UErrorCode &err // missing data return false; } - result.append((char16_t)0); // reserve a slot for this group + result.append(static_cast<char16_t>(0)); // reserve a slot for this group } firstDigitPrimary = data.getFirstPrimaryForGroup(UCOL_REORDER_CODE_DIGIT); @@ -234,7 +234,7 @@ CollationFastLatinBuilder::getCEs(const CollationData &data, UErrorCode &errorCo // Write a contraction list with only a default value if there is no real contraction. U_ASSERT(contractionCEs.isEmpty()); addContractionEntry(CollationFastLatin::CONTR_CHAR_MASK, ce0, ce1, errorCode); - charCEs[0][0] = ((int64_t)Collation::NO_CE_PRIMARY << 32) | CONTRACTION_FLAG; + charCEs[0][0] = (static_cast<int64_t>(Collation::NO_CE_PRIMARY) << 32) | CONTRACTION_FLAG; charCEs[0][1] = 0; } } @@ -301,12 +301,12 @@ CollationFastLatinBuilder::getCEsFromCE32(const CollationData &data, UChar32 c, // A mapping can be completely ignorable. if(ce0 == 0) { return ce1 == 0; } // We do not support an ignorable ce0 unless it is completely ignorable. - uint32_t p0 = (uint32_t)(ce0 >> 32); + uint32_t p0 = static_cast<uint32_t>(ce0 >> 32); if(p0 == 0) { return false; } // We only support primaries up to the Latin script. if(p0 > lastLatinPrimary) { return false; } // We support non-common secondary and case weights only together with short primaries. - uint32_t lower32_0 = (uint32_t)ce0; + uint32_t lower32_0 = static_cast<uint32_t>(ce0); if(p0 < firstShortPrimary) { uint32_t sc0 = lower32_0 & Collation::SECONDARY_AND_CASE_MASK; if(sc0 != Collation::COMMON_SECONDARY_CE) { return false; } @@ -319,9 +319,9 @@ CollationFastLatinBuilder::getCEsFromCE32(const CollationData &data, UChar32 c, // or a short-primary CE is followed by a secondary CE. // This is so that we can test the first primary and use the same mask for both, // and determine for both whether they are variable. - uint32_t p1 = (uint32_t)(ce1 >> 32); + uint32_t p1 = static_cast<uint32_t>(ce1 >> 32); if(p1 == 0 ? p0 < firstShortPrimary : !inSameGroup(p0, p1)) { return false; } - uint32_t lower32_1 = (uint32_t)ce1; + uint32_t lower32_1 = static_cast<uint32_t>(ce1); // No tertiary CEs. if((lower32_1 >> 16) == 0) { return false; } // We support non-common secondary and case weights @@ -374,7 +374,7 @@ CollationFastLatinBuilder::getCEsFromContractionCE32(const CollationData &data, if(addContraction) { addContractionEntry(prevX, ce0, ce1, errorCode); } - ce32 = (uint32_t)suffixes.getValue(); + ce32 = static_cast<uint32_t>(suffixes.getValue()); if(suffix.length() == 1 && getCEsFromCE32(data, U_SENTINEL, ce32, errorCode)) { addContraction = true; } else { @@ -392,7 +392,7 @@ CollationFastLatinBuilder::getCEsFromContractionCE32(const CollationData &data, // when there is a non-fast-Latin character following. // For example: Danish &Y<<u+umlaut, when we compare Y vs. u\u0308 we need to see the // following umlaut and bail out, rather than return the difference of Y vs. u. - ce0 = ((int64_t)Collation::NO_CE_PRIMARY << 32) | CONTRACTION_FLAG | contractionIndex; + ce0 = (static_cast<int64_t>(Collation::NO_CE_PRIMARY) << 32) | CONTRACTION_FLAG | contractionIndex; ce1 = 0; return true; } @@ -410,8 +410,8 @@ CollationFastLatinBuilder::addContractionEntry(int32_t x, int64_t cce0, int64_t void CollationFastLatinBuilder::addUniqueCE(int64_t ce, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; } - if(ce == 0 || (uint32_t)(ce >> 32) == Collation::NO_CE_PRIMARY) { return; } - ce &= ~(int64_t)Collation::CASE_MASK; // blank out case bits + if (ce == 0 || static_cast<uint32_t>(ce >> 32) == Collation::NO_CE_PRIMARY) { return; } + ce &= ~static_cast<int64_t>(Collation::CASE_MASK); // blank out case bits int32_t i = binarySearch(uniqueCEs.getBuffer(), uniqueCEs.size(), ce); if(i < 0) { uniqueCEs.insertElementAt(ce, ~i, errorCode); @@ -420,7 +420,7 @@ CollationFastLatinBuilder::addUniqueCE(int64_t ce, UErrorCode &errorCode) { uint32_t CollationFastLatinBuilder::getMiniCE(int64_t ce) const { - ce &= ~(int64_t)Collation::CASE_MASK; // blank out case bits + ce &= ~static_cast<int64_t>(Collation::CASE_MASK); // blank out case bits int32_t index = binarySearch(uniqueCEs.getBuffer(), uniqueCEs.size(), ce); U_ASSERT(index >= 0); return miniCEs[index]; @@ -430,7 +430,7 @@ UBool CollationFastLatinBuilder::encodeUniqueCEs(UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return false; } uprv_free(miniCEs); - miniCEs = (uint16_t *)uprv_malloc(uniqueCEs.size() * 2); + miniCEs = static_cast<uint16_t*>(uprv_malloc(uniqueCEs.size() * 2)); if(miniCEs == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return false; @@ -448,13 +448,13 @@ CollationFastLatinBuilder::encodeUniqueCEs(UErrorCode &errorCode) { int64_t ce = uniqueCEs.elementAti(i); // Note: At least one of the p/s/t weights changes from one unique CE to the next. // (uniqueCEs does not store case bits.) - uint32_t p = (uint32_t)(ce >> 32); + uint32_t p = static_cast<uint32_t>(ce >> 32); if(p != prevPrimary) { while(p > lastGroupPrimary) { U_ASSERT(pri <= CollationFastLatin::MAX_LONG); // Set the group's header entry to the // last "long primary" in or before the group. - result.setCharAt(1 + group, (char16_t)pri); + result.setCharAt(1 + group, static_cast<char16_t>(pri)); if(++group < NUM_SPECIAL_GROUPS) { lastGroupPrimary = lastSpecialPrimaries[group]; } else { @@ -494,7 +494,7 @@ CollationFastLatinBuilder::encodeUniqueCEs(UErrorCode &errorCode) { sec = CollationFastLatin::COMMON_SEC; ter = CollationFastLatin::COMMON_TER; } - uint32_t lower32 = (uint32_t)ce; + uint32_t lower32 = static_cast<uint32_t>(ce); uint32_t s = lower32 >> 16; if(s != prevSecondary) { if(pri == 0) { @@ -544,9 +544,9 @@ CollationFastLatinBuilder::encodeUniqueCEs(UErrorCode &errorCode) { } if(CollationFastLatin::MIN_LONG <= pri && pri <= CollationFastLatin::MAX_LONG) { U_ASSERT(sec == CollationFastLatin::COMMON_SEC); - miniCEs[i] = (uint16_t)(pri | ter); + miniCEs[i] = static_cast<uint16_t>(pri | ter); } else { - miniCEs[i] = (uint16_t)(pri | sec | ter); + miniCEs[i] = static_cast<uint16_t>(pri | sec | ter); } } #if DEBUG_COLLATION_FAST_LATIN_BUILDER @@ -566,7 +566,7 @@ CollationFastLatinBuilder::encodeCharCEs(UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return false; } int32_t miniCEsStart = result.length(); for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) { - result.append((char16_t)0); // initialize to completely ignorable + result.append(static_cast<char16_t>(0)); // initialize to completely ignorable } int32_t indexBase = result.length(); for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) { @@ -578,14 +578,14 @@ CollationFastLatinBuilder::encodeCharCEs(UErrorCode &errorCode) { // and if so, then we could reuse the other expansion. // However, that seems unlikely. int32_t expansionIndex = result.length() - indexBase; - if(expansionIndex > (int32_t)CollationFastLatin::INDEX_MASK) { + if (expansionIndex > static_cast<int32_t>(CollationFastLatin::INDEX_MASK)) { miniCE = CollationFastLatin::BAIL_OUT; } else { - result.append((char16_t)(miniCE >> 16)).append((char16_t)miniCE); + result.append(static_cast<char16_t>(miniCE >> 16)).append(static_cast<char16_t>(miniCE)); miniCE = CollationFastLatin::EXPANSION | expansionIndex; } } - result.setCharAt(miniCEsStart + i, (char16_t)miniCE); + result.setCharAt(miniCEsStart + i, static_cast<char16_t>(miniCE)); } return U_SUCCESS(errorCode); } @@ -601,25 +601,25 @@ CollationFastLatinBuilder::encodeContractions(UErrorCode &errorCode) { int64_t ce = charCEs[i][0]; if(!isContractionCharCE(ce)) { continue; } int32_t contractionIndex = result.length() - indexBase; - if(contractionIndex > (int32_t)CollationFastLatin::INDEX_MASK) { + if (contractionIndex > static_cast<int32_t>(CollationFastLatin::INDEX_MASK)) { result.setCharAt(headerLength + i, CollationFastLatin::BAIL_OUT); continue; } UBool firstTriple = true; - for(int32_t index = (int32_t)ce & 0x7fffffff;; index += 3) { + for (int32_t index = static_cast<int32_t>(ce) & 0x7fffffff;; index += 3) { int32_t x = static_cast<int32_t>(contractionCEs.elementAti(index)); - if((uint32_t)x == CollationFastLatin::CONTR_CHAR_MASK && !firstTriple) { break; } + if (static_cast<uint32_t>(x) == CollationFastLatin::CONTR_CHAR_MASK && !firstTriple) { break; } int64_t cce0 = contractionCEs.elementAti(index + 1); int64_t cce1 = contractionCEs.elementAti(index + 2); uint32_t miniCE = encodeTwoCEs(cce0, cce1); if(miniCE == CollationFastLatin::BAIL_OUT) { - result.append((char16_t)(x | (1 << CollationFastLatin::CONTR_LENGTH_SHIFT))); + result.append(static_cast<char16_t>(x | (1 << CollationFastLatin::CONTR_LENGTH_SHIFT))); } else if(miniCE <= 0xffff) { - result.append((char16_t)(x | (2 << CollationFastLatin::CONTR_LENGTH_SHIFT))); - result.append((char16_t)miniCE); + result.append(static_cast<char16_t>(x | (2 << CollationFastLatin::CONTR_LENGTH_SHIFT))); + result.append(static_cast<char16_t>(miniCE)); } else { - result.append((char16_t)(x | (3 << CollationFastLatin::CONTR_LENGTH_SHIFT))); - result.append((char16_t)(miniCE >> 16)).append((char16_t)miniCE); + result.append(static_cast<char16_t>(x | (3 << CollationFastLatin::CONTR_LENGTH_SHIFT))); + result.append(static_cast<char16_t>(miniCE >> 16)).append(static_cast<char16_t>(miniCE)); } firstTriple = false; } @@ -627,11 +627,11 @@ CollationFastLatinBuilder::encodeContractions(UErrorCode &errorCode) { // and if so, then we could truncate the result and reuse the other list. // However, that seems unlikely. result.setCharAt(headerLength + i, - (char16_t)(CollationFastLatin::CONTRACTION | contractionIndex)); + static_cast<char16_t>(CollationFastLatin::CONTRACTION | contractionIndex)); } if(result.length() > firstContractionIndex) { // Terminate the last contraction list. - result.append((char16_t)CollationFastLatin::CONTR_CHAR_MASK); + result.append(static_cast<char16_t>(CollationFastLatin::CONTR_CHAR_MASK)); } if(result.isBogus()) { errorCode = U_MEMORY_ALLOCATION_ERROR; @@ -681,7 +681,7 @@ CollationFastLatinBuilder::encodeTwoCEs(int64_t first, int64_t second) const { if(miniCE >= CollationFastLatin::MIN_SHORT) { // Extract & copy the case bits. // Shift them from normal CE bits 15..14 to mini CE bits 4..3. - uint32_t c = (((uint32_t)first & Collation::CASE_MASK) >> (14 - 3)); + uint32_t c = ((static_cast<uint32_t>(first) & Collation::CASE_MASK) >> (14 - 3)); // Only in mini CEs: Ignorable case bits = 0, lowercase = 1. c += CollationFastLatin::LOWER_CASE; miniCE |= c; @@ -691,7 +691,7 @@ CollationFastLatinBuilder::encodeTwoCEs(int64_t first, int64_t second) const { uint32_t miniCE1 = getMiniCE(second); if(miniCE1 == CollationFastLatin::BAIL_OUT) { return miniCE1; } - uint32_t case1 = (uint32_t)second & Collation::CASE_MASK; + uint32_t case1 = static_cast<uint32_t>(second) & Collation::CASE_MASK; if(miniCE >= CollationFastLatin::MIN_SHORT && (miniCE & CollationFastLatin::SECONDARY_MASK) == CollationFastLatin::COMMON_SEC) { // Try to combine the two mini CEs into one. diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.h b/deps/icu-small/source/i18n/collationfastlatinbuilder.h index 8b63b86815fdc6..18b20ac5f3caf0 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.h +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.h @@ -63,7 +63,7 @@ class U_I18N_API CollationFastLatinBuilder : public UObject { uint32_t encodeTwoCEs(int64_t first, int64_t second) const; static UBool isContractionCharCE(int64_t ce) { - return (uint32_t)(ce >> 32) == Collation::NO_CE_PRIMARY && ce != Collation::NO_CE; + return static_cast<uint32_t>(ce >> 32) == Collation::NO_CE_PRIMARY && ce != Collation::NO_CE; } static const uint32_t CONTRACTION_FLAG = 0x80000000; diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index e1f1d0330c480e..9b45f04225380e 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -29,18 +29,18 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x27,0x28,0,0,0,0,0x29,0, 0,0,0,0,0,0x2a,0,0,0,0x13,0,0,0,0,0,0, -0x2b,0,0,0x2c,0,0x2d,0x2e,0,0,0x28,0x2f,0x30,0,0x31,0,0x32, -0,0x33,0,0,0,0,0x34,0x35,0,0,0,0,0,0,1,1, +0x2b,0,0,0x2c,0,0x2d,0x2e,0x2f,0,0x28,0x30,0x31,0,0x32,0,0x33, +0,0x34,0,0,0,0,0x35,0x36,0,0,0,0,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,0x36,0x37,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x37,0x38,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x38,0,0,0,0x39,0,0,0,1, +0,0,0,0,0,0,0,0x39,0,0,0,0x3a,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x3a,0,0,0x3b,0,0,0,0,0,0,0,0,0,0,0, +0,0x3b,0,0,0x3c,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -99,9 +99,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x3c,0x3d,0,0,0x3e,0,0,0,0,0,0,0,0, -0x24,0x3f,0,0,0,0,0x2f,0x40,0,0x41,0x42,0,0,0x42,0x43,0, -0,0,0,0,0,0x44,0x45,0x46,0,0,0,0,0,0,0,0x19, +0,0,0,0x3d,0x3e,0,0,0x3f,0,0,0,0,0,0,0,0, +0x24,0x40,0,0,0,0,0x30,0x41,0,0x42,0x43,0,0,0x43,0x44,0, +0,0,0,0,0,0x45,0x46,0x47,0,0,0,0,0,0,0,0x19, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -124,7 +124,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x47,0x48,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x48,0x49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1, @@ -146,12 +146,12 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::lcccBits[73]={ +const uint32_t CollationFCD::lcccBits[74]={ 0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, -0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff000000,0xfffffc00,0xfffffffb,0x10000000,0x1e2000,0x2000,0x40000000,0x602000,0x18000000,0x400,0x7000000,0xf00, -0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x7fff,0x10, -0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x1000, -0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xc0000fd,0x7108000 +0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10000000,0x1e2000,0x2000,0x40000000,0x602000,0x18000000,0x400,0x7000000,0xf00, +0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff, +0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000, +0x1000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000fd,0x7108000 }; const uint8_t CollationFCD::tcccIndex[2048]={ @@ -168,9 +168,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x41,0x42,0,0,0,0,0x43,0, 0,0,0,0,0,0x44,0,0,0,0x28,0,0,0,0,0,0, -0x45,0,0,0x46,0,0x47,0x48,0,0,0x42,0x49,0x4a,0,0x4b,0,0x4c, -0,0x4d,0,0,0,0,0x4e,0x4f,0,0,0,0,0,0,1,1, -1,1,1,1,0x50,1,1,0x51,0x52,1,0x53,0x54,1,0x55,0x56,0x57, +0x45,0,0,0x46,0,0x47,0x48,0x49,0,0x42,0x4a,0x4b,0,0x4c,0,0x4d, +0,0x4e,0,0,0,0,0x4f,0x50,0,0,0,0,0,0,1,1, +1,1,1,1,0x51,1,1,0x52,0x53,1,0x54,0x48,1,0x55,0x56,0x57, 0,0,0,0,0,0,0x58,0x59,0,0x5a,0,0,0x5b,0x5c,0x5d,0, 0x5e,0x5f,0x60,0x61,0x62,0x63,0,0x64,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -239,7 +239,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0x6c,0x6d,0,0,0x6e,0,0,0,0,0,0,0,0, -0x3e,0x6f,0,0,0,0,0x49,0x70,0,0x71,0x72,0,0,0x72,0x73,0, +0x3e,0x6f,0,0,0,0,0x4a,0x70,0,0x71,0x72,0,0,0x72,0x73,0, 0,0,0,0,0,0x74,0x75,0x76,0,0,0,0,0,0,0,0x33, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -288,12 +288,12 @@ const uint8_t CollationFCD::tcccIndex[2048]={ const uint32_t CollationFCD::tcccBits[123]={ 0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760, 0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000, -0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff000000,0xfffffc00,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000, +0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000, 0x40000000,0x10480000,0x4e002000,0x2000,0x30002000,0x602100,0x18000000,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000, -0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x7fff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd, -0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50, +0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000, +0x31021fd,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50, 0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x1000, -0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xc0000fd,0x7108000,0x5f7ffc00,0x7fdb +0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000ff,0x7108000,0x5f7ffc00,0x7fdb }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/collationfcd.h b/deps/icu-small/source/i18n/collationfcd.h index 9620452b97f01c..c9ca54234f66ab 100644 --- a/deps/icu-small/source/i18n/collationfcd.h +++ b/deps/icu-small/source/i18n/collationfcd.h @@ -65,7 +65,7 @@ class U_I18N_API CollationFCD { // U+0300 is the first character with lccc!=0. c >= 0x300 && (i = lcccIndex[c >> 5]) != 0 && - (lcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0; + (lcccBits[i] & (static_cast<uint32_t>(1) << (c & 0x1f))) != 0; } static inline UBool hasTccc(UChar32 c) { @@ -77,7 +77,7 @@ class U_I18N_API CollationFCD { // U+00C0 is the first character with tccc!=0. c >= 0xc0 && (i = tcccIndex[c >> 5]) != 0 && - (tcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0; + (tcccBits[i] & (static_cast<uint32_t>(1) << (c & 0x1f))) != 0; } static inline UBool mayHaveLccc(UChar32 c) { @@ -89,7 +89,7 @@ class U_I18N_API CollationFCD { int32_t i; return (i = lcccIndex[c >> 5]) != 0 && - (lcccBits[i] & ((uint32_t)1 << (c & 0x1f))) != 0; + (lcccBits[i] & (static_cast<uint32_t>(1) << (c & 0x1f))) != 0; } /** diff --git a/deps/icu-small/source/i18n/collationiterator.cpp b/deps/icu-small/source/i18n/collationiterator.cpp index f8c6da22b2baa8..ef1980aebfc7de 100644 --- a/deps/icu-small/source/i18n/collationiterator.cpp +++ b/deps/icu-small/source/i18n/collationiterator.cpp @@ -459,7 +459,7 @@ CollationIterator::getCE32FromPrefix(const CollationData *d, uint32_t ce32, ++lookBehind; UStringTrieResult match = prefixes.nextForCodePoint(c); if(USTRINGTRIE_HAS_VALUE(match)) { - ce32 = (uint32_t)prefixes.getValue(); + ce32 = static_cast<uint32_t>(prefixes.getValue()); } if(!USTRINGTRIE_HAS_NEXT(match)) { break; } } @@ -506,7 +506,7 @@ CollationIterator::nextCE32FromContraction(const CollationData *d, uint32_t cont for(;;) { UChar32 nextCp; if(USTRINGTRIE_HAS_VALUE(match)) { - ce32 = (uint32_t)suffixes.getValue(); + ce32 = static_cast<uint32_t>(suffixes.getValue()); if(!USTRINGTRIE_HAS_NEXT(match) || (c = nextSkippedCodePoint(errorCode)) < 0) { return ce32; } @@ -586,7 +586,7 @@ CollationIterator::nextCE32FromDiscontiguousContraction( return ce32; } ++lookAhead; - uint8_t prevCC = (uint8_t)fcd16; + uint8_t prevCC = static_cast<uint8_t>(fcd16); fcd16 = d->getFCD16(nextCp); if(fcd16 <= 0xff) { // The next code point after c is a starter (S2.1.1 "process each non-starter"). @@ -632,7 +632,7 @@ CollationIterator::nextCE32FromDiscontiguousContraction( if(prevCC < (fcd16 >> 8) && USTRINGTRIE_HAS_VALUE(match = suffixes.nextForCodePoint(c))) { // "If there is a match, replace S by S + C, and remove C." (S2.1.3) // Keep prevCC unchanged. - ce32 = (uint32_t)suffixes.getValue(); + ce32 = static_cast<uint32_t>(suffixes.getValue()); sinceMatch = 0; skipped->recordMatch(); if(!USTRINGTRIE_HAS_NEXT(match)) { break; } @@ -641,7 +641,7 @@ CollationIterator::nextCE32FromDiscontiguousContraction( // No match for "S + C", skip C. skipped->skip(c); skipped->resetToTrieState(suffixes); - prevCC = (uint8_t)fcd16; + prevCC = static_cast<uint8_t>(fcd16); } if((c = nextSkippedCodePoint(errorCode)) < 0) { break; } ++sinceMatch; diff --git a/deps/icu-small/source/i18n/collationiterator.h b/deps/icu-small/source/i18n/collationiterator.h index 07bdf61985ae09..7e234c65b08389 100644 --- a/deps/icu-small/source/i18n/collationiterator.h +++ b/deps/icu-small/source/i18n/collationiterator.h @@ -31,27 +31,15 @@ class UVector32; /* Large enough for CEs of most short strings. */ #define CEBUFFER_INITIAL_CAPACITY 40 -// Export an explicit template instantiation of the MaybeStackArray that -// is used as a data member of CEBuffer. -// -// When building DLLs for Windows this is required even though -// no direct access to the MaybeStackArray leaks out of the i18n library. -// -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -// -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<int64_t, CEBUFFER_INITIAL_CAPACITY>; -#endif - /** * Collation element iterator and abstract character iterator. * * When a method returns a code point value, it must be in 0..10FFFF, * except it can be negative as a sentinel value. */ -class U_I18N_API CollationIterator : public UObject { +class U_I18N_API_CLASS CollationIterator : public UObject { private: - class U_I18N_API CEBuffer { + class CEBuffer { private: /** Large enough for CEs of most short strings. */ static const int32_t INITIAL_CAPACITY = CEBUFFER_INITIAL_CAPACITY; @@ -69,7 +57,7 @@ class U_I18N_API CollationIterator : public UObject { buffer[length++] = ce; } - UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode); + U_I18N_API UBool ensureAppendCapacity(int32_t appCap, UErrorCode &errorCode); inline UBool incLength(UErrorCode &errorCode) { // Use INITIAL_CAPACITY for a very simple fastpath. @@ -142,7 +130,7 @@ class U_I18N_API CollationIterator : public UObject { // Normal CE from the main data. // Forced-inline of ceFromSimpleCE32(ce32). return ceBuffer.set(cesIndex++, - ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8)); + (static_cast<int64_t>(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8)); } const CollationData *d; // The compiler should be able to optimize the previous and the following @@ -157,7 +145,7 @@ class U_I18N_API CollationIterator : public UObject { if(t < Collation::SPECIAL_CE32_LOW_BYTE) { // Normal CE from the base data. return ceBuffer.set(cesIndex++, - ((int64_t)(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8)); + (static_cast<int64_t>(ce32 & 0xffff0000) << 32) | ((ce32 & 0xff00) << 16) | (t << 8)); } } else { d = data; @@ -165,7 +153,7 @@ class U_I18N_API CollationIterator : public UObject { if(t == Collation::LONG_PRIMARY_CE32_LOW_BYTE) { // Forced-inline of ceFromLongPrimaryCE32(ce32). return ceBuffer.set(cesIndex++, - ((int64_t)(ce32 - t) << 32) | Collation::COMMON_SEC_AND_TER_CE); + (static_cast<int64_t>(ce32 - t) << 32) | Collation::COMMON_SEC_AND_TER_CE); } return nextCEFromCE32(d, c, ce32, errorCode); } @@ -278,8 +266,8 @@ class U_I18N_API CollationIterator : public UObject { const CollationData *data; private: - int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32, - UErrorCode &errorCode); + U_I18N_API int64_t nextCEFromCE32(const CollationData *d, UChar32 c, uint32_t ce32, + UErrorCode &errorCode); uint32_t getCE32FromPrefix(const CollationData *d, uint32_t ce32, UErrorCode &errorCode); diff --git a/deps/icu-small/source/i18n/collationkeys.cpp b/deps/icu-small/source/i18n/collationkeys.cpp index c429ac3f8f7030..b5bbd2a64aba5e 100644 --- a/deps/icu-small/source/i18n/collationkeys.cpp +++ b/deps/icu-small/source/i18n/collationkeys.cpp @@ -126,15 +126,15 @@ class SortKeyLevel : public UMemory { void SortKeyLevel::appendByte(uint32_t b) { if(len < buffer.getCapacity() || ensureCapacity(1)) { - buffer[len++] = (uint8_t)b; + buffer[len++] = static_cast<uint8_t>(b); } } void SortKeyLevel::appendWeight16(uint32_t w) { U_ASSERT((w & 0xffff) != 0); - uint8_t b0 = (uint8_t)(w >> 8); - uint8_t b1 = (uint8_t)w; + uint8_t b0 = static_cast<uint8_t>(w >> 8); + uint8_t b1 = static_cast<uint8_t>(w); int32_t appendLength = (b1 == 0) ? 1 : 2; if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) { buffer[len++] = b0; @@ -147,7 +147,12 @@ SortKeyLevel::appendWeight16(uint32_t w) { void SortKeyLevel::appendWeight32(uint32_t w) { U_ASSERT(w != 0); - uint8_t bytes[4] = { (uint8_t)(w >> 24), (uint8_t)(w >> 16), (uint8_t)(w >> 8), (uint8_t)w }; + uint8_t bytes[4] = { + static_cast<uint8_t>(w >> 24), + static_cast<uint8_t>(w >> 16), + static_cast<uint8_t>(w >> 8), + static_cast<uint8_t>(w) + }; int32_t appendLength = (bytes[1] == 0) ? 1 : (bytes[2] == 0) ? 2 : (bytes[3] == 0) ? 3 : 4; if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) { buffer[len++] = bytes[0]; @@ -166,8 +171,8 @@ SortKeyLevel::appendWeight32(uint32_t w) { void SortKeyLevel::appendReverseWeight16(uint32_t w) { U_ASSERT((w & 0xffff) != 0); - uint8_t b0 = (uint8_t)(w >> 8); - uint8_t b1 = (uint8_t)w; + uint8_t b0 = static_cast<uint8_t>(w >> 8); + uint8_t b1 = static_cast<uint8_t>(w); int32_t appendLength = (b1 == 0) ? 1 : 2; if((len + appendLength) <= buffer.getCapacity() || ensureCapacity(appendLength)) { if(b1 == 0) { @@ -238,7 +243,7 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, levels |= Collation::CASE_LEVEL_FLAG; } // Minus the levels below minLevel. - levels &= ~(((uint32_t)1 << minLevel) - 1); + levels &= ~((static_cast<uint32_t>(1) << minLevel) - 1); if(levels == 0) { return; } uint32_t variableTop; @@ -269,7 +274,7 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, // No need to keep all CEs in the buffer when we write a sort key. iter.clearCEsIfNoneRemaining(); int64_t ce = iter.nextCE(errorCode); - uint32_t p = (uint32_t)(ce >> 32); + uint32_t p = static_cast<uint32_t>(ce >> 32); if(p < variableTop && p > Collation::MERGE_SEPARATOR_PRIMARY) { // Variable CE, shift it to quaternary level. // Ignore all following primary ignorables, and shift further variable CEs. @@ -297,7 +302,7 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, } do { ce = iter.nextCE(errorCode); - p = (uint32_t)(ce >> 32); + p = static_cast<uint32_t>(ce >> 32); } while(p == 0); } while(p < variableTop && p > Collation::MERGE_SEPARATOR_PRIMARY); } @@ -331,9 +336,9 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, prevReorderedPrimary = 0; } } - char p2 = (char)(p >> 16); + char p2 = static_cast<char>(p >> 16); if(p2 != 0) { - char buffer[3] = { p2, (char)(p >> 8), (char)p }; + char buffer[3] = {p2, static_cast<char>(p >> 8), static_cast<char>(p)}; sink.Append(buffer, (buffer[1] == 0) ? 1 : (buffer[2] == 0) ? 2 : 3); } // Optimization for internalNextSortKeyPart(): @@ -347,7 +352,7 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, } } - uint32_t lower32 = (uint32_t)ce; + uint32_t lower32 = static_cast<uint32_t>(ce); if(lower32 == 0) { continue; } // completely ignorable, no secondary/case/tertiary/quaternary if((levels & Collation::SECONDARY_LEVEL_FLAG) != 0) { @@ -635,7 +640,7 @@ CollationKeys::writeSortKeyUpToQuaternary(CollationIterator &iter, int32_t length = cases.length() - 1; // Ignore the trailing NO_CE. uint8_t b = 0; for(int32_t i = 0; i < length; ++i) { - uint8_t c = (uint8_t)cases[i]; + uint8_t c = cases[i]; U_ASSERT((c & 0xf) == 0 && c != 0); if(b == 0) { b = c; diff --git a/deps/icu-small/source/i18n/collationkeys.h b/deps/icu-small/source/i18n/collationkeys.h index d1331566128b3a..0529b309848349 100644 --- a/deps/icu-small/source/i18n/collationkeys.h +++ b/deps/icu-small/source/i18n/collationkeys.h @@ -44,7 +44,7 @@ class SortKeyByteSink : public ByteSink { --ignore_; } else { if (appended_ < capacity_ || Resize(1, appended_)) { - buffer_[appended_] = (char)b; + buffer_[appended_] = static_cast<char>(b); } ++appended_; } diff --git a/deps/icu-small/source/i18n/collationroot.cpp b/deps/icu-small/source/i18n/collationroot.cpp index 99686345f9ba8a..25243b34dfdacb 100644 --- a/deps/icu-small/source/i18n/collationroot.cpp +++ b/deps/icu-small/source/i18n/collationroot.cpp @@ -33,8 +33,8 @@ U_NAMESPACE_BEGIN namespace { -static const CollationCacheEntry *rootSingleton = nullptr; -static UInitOnce initOnce {}; +const CollationCacheEntry *rootSingleton = nullptr; +UInitOnce initOnce{}; } // namespace diff --git a/deps/icu-small/source/i18n/collationrootelements.cpp b/deps/icu-small/source/i18n/collationrootelements.cpp index 9b46d14144bb3d..041f53dbda102b 100644 --- a/deps/icu-small/source/i18n/collationrootelements.cpp +++ b/deps/icu-small/source/i18n/collationrootelements.cpp @@ -64,7 +64,7 @@ CollationRootElements::lastCEWithPrimaryBefore(uint32_t p) const { secTer = q; } } - return ((int64_t)p << 32) | (secTer & ~SEC_TER_DELTA_FLAG); + return (static_cast<int64_t>(p) << 32) | (secTer & ~SEC_TER_DELTA_FLAG); } int64_t @@ -82,7 +82,7 @@ CollationRootElements::firstCEWithPrimaryAtLeast(uint32_t p) const { } } // The code above guarantees that p has at most 3 bytes: (p & 0xff) == 0. - return ((int64_t)p << 32) | Collation::COMMON_SEC_AND_TER_CE; + return (static_cast<int64_t>(p) << 32) | Collation::COMMON_SEC_AND_TER_CE; } uint32_t @@ -93,7 +93,7 @@ CollationRootElements::getPrimaryBefore(uint32_t p, UBool isCompressible) const if(p == (q & 0xffffff00)) { // Found p itself. Return the previous primary. // See if p is at the end of a previous range. - step = (int32_t)q & PRIMARY_STEP_MASK; + step = static_cast<int32_t>(q) & PRIMARY_STEP_MASK; if(step == 0) { // p is not at the end of a range. Look for the previous primary. do { @@ -105,7 +105,7 @@ CollationRootElements::getPrimaryBefore(uint32_t p, UBool isCompressible) const // p is in a range, and not at the start. uint32_t nextElement = elements[index + 1]; U_ASSERT(isEndOfPrimaryRange(nextElement)); - step = (int32_t)nextElement & PRIMARY_STEP_MASK; + step = static_cast<int32_t>(nextElement) & PRIMARY_STEP_MASK; } // Return the previous range primary. if((p & 0xffff) == 0) { @@ -120,7 +120,7 @@ CollationRootElements::getSecondaryBefore(uint32_t p, uint32_t s) const { int32_t index; uint32_t previousSec, sec; if(p == 0) { - index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_SECONDARY_INDEX]); // Gap at the beginning of the secondary CE range. previousSec = 0; sec = elements[index] >> 16; @@ -146,11 +146,11 @@ CollationRootElements::getTertiaryBefore(uint32_t p, uint32_t s, uint32_t t) con uint32_t previousTer, secTer; if(p == 0) { if(s == 0) { - index = (int32_t)elements[IX_FIRST_TERTIARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_TERTIARY_INDEX]); // Gap at the beginning of the tertiary CE range. previousTer = 0; } else { - index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_SECONDARY_INDEX]); previousTer = Collation::BEFORE_WEIGHT16; } secTer = elements[index] & ~SEC_TER_DELTA_FLAG; @@ -174,7 +174,7 @@ CollationRootElements::getPrimaryAfter(uint32_t p, int32_t index, UBool isCompre U_ASSERT(p == (elements[index] & 0xffffff00) || isEndOfPrimaryRange(elements[index + 1])); uint32_t q = elements[++index]; int32_t step; - if((q & SEC_TER_DELTA_FLAG) == 0 && (step = (int32_t)q & PRIMARY_STEP_MASK) != 0) { + if ((q & SEC_TER_DELTA_FLAG) == 0 && (step = static_cast<int32_t>(q) & PRIMARY_STEP_MASK) != 0) { // Return the next primary in this range. if((p & 0xffff) == 0) { return Collation::incTwoBytePrimaryByOffset(p, isCompressible, step); @@ -198,7 +198,7 @@ CollationRootElements::getSecondaryAfter(int32_t index, uint32_t s) const { if(index == 0) { // primary = 0 U_ASSERT(s != 0); - index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_SECONDARY_INDEX]); secTer = elements[index]; // Gap at the end of the secondary CE range. secLimit = 0x10000; @@ -225,11 +225,11 @@ CollationRootElements::getTertiaryAfter(int32_t index, uint32_t s, uint32_t t) c // primary = 0 if(s == 0) { U_ASSERT(t != 0); - index = (int32_t)elements[IX_FIRST_TERTIARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_TERTIARY_INDEX]); // Gap at the end of the tertiary CE range. terLimit = 0x4000; } else { - index = (int32_t)elements[IX_FIRST_SECONDARY_INDEX]; + index = static_cast<int32_t>(elements[IX_FIRST_SECONDARY_INDEX]); // Gap for tertiaries of primary/secondary CEs. terLimit = getTertiaryBoundary(); } @@ -287,7 +287,7 @@ CollationRootElements::findP(uint32_t p) const { // For example, it might be a reordering group boundary. U_ASSERT((p >> 24) != Collation::UNASSIGNED_IMPLICIT_BYTE); // modified binary search - int32_t start = (int32_t)elements[IX_FIRST_PRIMARY_INDEX]; + int32_t start = static_cast<int32_t>(elements[IX_FIRST_PRIMARY_INDEX]); U_ASSERT(p >= elements[start]); int32_t limit = length - 1; U_ASSERT(elements[limit] >= PRIMARY_SENTINEL); diff --git a/deps/icu-small/source/i18n/collationruleparser.cpp b/deps/icu-small/source/i18n/collationruleparser.cpp index ba740e8d18825b..f5608cde7dc643 100644 --- a/deps/icu-small/source/i18n/collationruleparser.cpp +++ b/deps/icu-small/source/i18n/collationruleparser.cpp @@ -24,7 +24,6 @@ #include "unicode/uloc.h" #include "unicode/unistr.h" #include "unicode/utf16.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "collation.h" @@ -42,7 +41,7 @@ U_NAMESPACE_BEGIN namespace { -static const char16_t BEFORE[] = { 0x5b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0 }; // "[before" +const char16_t BEFORE[] = { 0x5b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0 }; // "[before" const int32_t BEFORE_LENGTH = 7; } // namespace @@ -379,7 +378,7 @@ CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &erro if(c == 0x27) { // apostrophe if(i < rules->length() && rules->charAt(i) == 0x27) { // Double apostrophe, encodes a single one. - raw.append((char16_t)0x27); + raw.append(static_cast<char16_t>(0x27)); ++i; continue; } @@ -399,7 +398,7 @@ CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &erro break; } } - raw.append((char16_t)c); + raw.append(static_cast<char16_t>(c)); } } else if(c == 0x5c) { // backslash if(i == rules->length()) { @@ -419,7 +418,7 @@ CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &erro --i; break; } else { - raw.append((char16_t)c); + raw.append(static_cast<char16_t>(c)); } } for(int32_t j = 0; j < raw.length();) { @@ -439,7 +438,7 @@ CollationRuleParser::parseString(int32_t i, UnicodeString &raw, UErrorCode &erro namespace { -static const char *const positions[] = { +const char* const positions[] = { "first tertiary ignorable", "last tertiary ignorable", "first secondary ignorable", @@ -467,16 +466,16 @@ CollationRuleParser::parseSpecialPosition(int32_t i, UnicodeString &str, UErrorC ++j; for(int32_t pos = 0; pos < UPRV_LENGTHOF(positions); ++pos) { if(raw == UnicodeString(positions[pos], -1, US_INV)) { - str.setTo((char16_t)POS_LEAD).append((char16_t)(POS_BASE + pos)); + str.setTo(POS_LEAD).append(static_cast<char16_t>(POS_BASE + pos)); return j; } } if(raw == UNICODE_STRING_SIMPLE("top")) { - str.setTo((char16_t)POS_LEAD).append((char16_t)(POS_BASE + LAST_REGULAR)); + str.setTo(POS_LEAD).append(static_cast<char16_t>(POS_BASE + LAST_REGULAR)); return j; } if(raw == UNICODE_STRING_SIMPLE("variable top")) { - str.setTo((char16_t)POS_LEAD).append((char16_t)(POS_BASE + LAST_VARIABLE)); + str.setTo(POS_LEAD).append(static_cast<char16_t>(POS_BASE + LAST_VARIABLE)); return j; } } @@ -508,7 +507,7 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { return; } UnicodeString v; - int32_t valueIndex = raw.lastIndexOf((char16_t)0x20); + int32_t valueIndex = raw.lastIndexOf(static_cast<char16_t>(0x20)); if(valueIndex >= 0) { v.setTo(raw, valueIndex + 1); raw.truncate(valueIndex); @@ -606,37 +605,35 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { lang.appendInvariantChars(v, errorCode); if(errorCode == U_MEMORY_ALLOCATION_ERROR) { return; } // BCP 47 language tag -> ICU locale ID - CharString localeID; int32_t parsedLength; - { - CharStringByteSink sink(&localeID); - ulocimp_forLanguageTag(lang.data(), -1, sink, &parsedLength, &errorCode); - } + CharString localeID = ulocimp_forLanguageTag(lang.data(), -1, &parsedLength, errorCode); if(U_FAILURE(errorCode) || parsedLength != lang.length()) { errorCode = U_ZERO_ERROR; setParseError("expected language tag in [import langTag]", errorCode); return; } // localeID minus all keywords - char baseID[ULOC_FULLNAME_CAPACITY]; - int32_t length = uloc_getBaseName(localeID.data(), baseID, ULOC_FULLNAME_CAPACITY, &errorCode); - if(U_FAILURE(errorCode) || length >= ULOC_KEYWORDS_CAPACITY) { + CharString baseID = ulocimp_getBaseName(localeID.toStringPiece(), errorCode); + if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; setParseError("expected language tag in [import langTag]", errorCode); return; } - if(length == 0) { - uprv_strcpy(baseID, "root"); - } else if(*baseID == '_') { - uprv_memmove(baseID + 3, baseID, length + 1); - uprv_memcpy(baseID, "und", 3); + if (baseID.isEmpty()) { + baseID.copyFrom("root", errorCode); + } else if (baseID[0] == '_') { + // CharString doesn't have any insert() method, only append(). + constexpr char und[] = "und"; + constexpr int32_t length = sizeof und - 1; + int32_t dummy; + char* tail = baseID.getAppendBuffer(length, length, dummy, errorCode); + char* head = baseID.data(); + uprv_memmove(head + length, head, baseID.length()); + uprv_memcpy(head, und, length); + baseID.append(tail, length, errorCode); } // @collation=type, or length=0 if not specified - CharString collationType; - { - CharStringByteSink sink(&collationType); - ulocimp_getKeywordValue(localeID.data(), "collation", sink, &errorCode); - } + CharString collationType = ulocimp_getKeywordValue(localeID.data(), "collation", errorCode); if(U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; setParseError("expected language tag in [import langTag]", errorCode); @@ -646,7 +643,7 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { setParseError("[import langTag] is not supported", errorCode); } else { UnicodeString importedRules; - importer->getRules(baseID, + importer->getRules(baseID.data(), !collationType.isEmpty() ? collationType.data() : "standard", importedRules, errorReason, errorCode); if(U_FAILURE(errorCode)) { @@ -703,7 +700,7 @@ CollationRuleParser::parseReordering(const UnicodeString &raw, UErrorCode &error CharString word; while(i < raw.length()) { ++i; // skip the word-separating space - int32_t limit = raw.indexOf((char16_t)0x20, i); + int32_t limit = raw.indexOf(static_cast<char16_t>(0x20), i); if(limit < 0) { limit = raw.length(); } word.clear().appendInvariantChars(raw.tempSubStringBetween(i, limit), errorCode); if(U_FAILURE(errorCode)) { return; } diff --git a/deps/icu-small/source/i18n/collationsets.cpp b/deps/icu-small/source/i18n/collationsets.cpp index 62e6a5d1806eb0..a73c7fafdd0b86 100644 --- a/deps/icu-small/source/i18n/collationsets.cpp +++ b/deps/icu-small/source/i18n/collationsets.cpp @@ -222,7 +222,7 @@ TailoredSet::comparePrefixes(UChar32 c, const char16_t *p, const char16_t *q) { const UnicodeString *bp = nullptr; // Base prefix. // Use a string with a U+FFFF as the limit sentinel. // U+FFFF is untailorable and will not occur in prefixes. - UnicodeString none((char16_t)0xffff); + UnicodeString none(static_cast<char16_t>(0xffff)); for(;;) { if(tp == nullptr) { if(prefixes.next(errorCode)) { @@ -242,15 +242,15 @@ TailoredSet::comparePrefixes(UChar32 c, const char16_t *p, const char16_t *q) { int32_t cmp = tp->compare(*bp); if(cmp < 0) { // tp occurs in the tailoring but not in the base. - addPrefix(data, *tp, c, (uint32_t)prefixes.getValue()); + addPrefix(data, *tp, c, static_cast<uint32_t>(prefixes.getValue())); tp = nullptr; } else if(cmp > 0) { // bp occurs in the base but not in the tailoring. - addPrefix(baseData, *bp, c, (uint32_t)basePrefixes.getValue()); + addPrefix(baseData, *bp, c, static_cast<uint32_t>(basePrefixes.getValue())); bp = nullptr; } else { setPrefix(*tp); - compare(c, (uint32_t)prefixes.getValue(), (uint32_t)basePrefixes.getValue()); + compare(c, static_cast<uint32_t>(prefixes.getValue()), static_cast<uint32_t>(basePrefixes.getValue())); resetPrefix(); tp = nullptr; bp = nullptr; @@ -268,8 +268,8 @@ TailoredSet::compareContractions(UChar32 c, const char16_t *p, const char16_t *q // Use a string with two U+FFFF as the limit sentinel. // U+FFFF is untailorable and will not occur in contractions except maybe // as a single suffix character for a root-collator boundary contraction. - UnicodeString none((char16_t)0xffff); - none.append((char16_t)0xffff); + UnicodeString none(static_cast<char16_t>(0xffff)); + none.append(static_cast<char16_t>(0xffff)); for(;;) { if(ts == nullptr) { if(suffixes.next(errorCode)) { @@ -297,7 +297,7 @@ TailoredSet::compareContractions(UChar32 c, const char16_t *p, const char16_t *q bs = nullptr; } else { suffix = ts; - compare(c, (uint32_t)suffixes.getValue(), (uint32_t)baseSuffixes.getValue()); + compare(c, static_cast<uint32_t>(suffixes.getValue()), static_cast<uint32_t>(baseSuffixes.getValue())); suffix = nullptr; ts = nullptr; bs = nullptr; @@ -309,7 +309,7 @@ void TailoredSet::addPrefixes(const CollationData *d, UChar32 c, const char16_t *p) { UCharsTrie::Iterator prefixes(p, 0, errorCode); while(prefixes.next(errorCode)) { - addPrefix(d, prefixes.getString(), c, (uint32_t)prefixes.getValue()); + addPrefix(d, prefixes.getString(), c, static_cast<uint32_t>(prefixes.getValue())); } } @@ -512,7 +512,7 @@ ContractionsAndExpansions::handleCE32(UChar32 start, UChar32 end, uint32_t ce32) UTF16CollationIterator iter(data, false, nullptr, nullptr, nullptr); char16_t hangul[1] = { 0 }; for(UChar32 c = start; c <= end; ++c) { - hangul[0] = (char16_t)c; + hangul[0] = static_cast<char16_t>(c); iter.setText(hangul, hangul + 1); int32_t length = iter.fetchCEs(errorCode); if(U_FAILURE(errorCode)) { return; } @@ -551,7 +551,7 @@ ContractionsAndExpansions::handlePrefixes( // that always yield expansions. addStrings(start, end, contractions); addStrings(start, end, expansions); - handleCE32(start, end, (uint32_t)prefixes.getValue()); + handleCE32(start, end, static_cast<uint32_t>(prefixes.getValue())); } resetPrefix(); } @@ -577,7 +577,7 @@ ContractionsAndExpansions::handleContractions( if(!unreversedPrefix.isEmpty()) { addStrings(start, end, expansions); } - handleCE32(start, end, (uint32_t)suffixes.getValue()); + handleCE32(start, end, static_cast<uint32_t>(suffixes.getValue())); } suffix = nullptr; } diff --git a/deps/icu-small/source/i18n/collationsettings.cpp b/deps/icu-small/source/i18n/collationsettings.cpp index 1533daf38c7a33..660efc12f63b74 100644 --- a/deps/icu-small/source/i18n/collationsettings.cpp +++ b/deps/icu-small/source/i18n/collationsettings.cpp @@ -158,9 +158,9 @@ CollationSettings::setReordering(const CollationData &data, int32_t firstSplitByteRangeIndex = -1; for(int32_t i = 0; i < rangesLength; ++i) { uint32_t pair = ranges[i]; - int32_t limit1 = (int32_t)(pair >> 24); + int32_t limit1 = static_cast<int32_t>(pair >> 24); while(b < limit1) { - table[b] = (uint8_t)(b + pair); + table[b] = static_cast<uint8_t>(b + pair); ++b; } // Check the second byte of the limit. @@ -173,7 +173,7 @@ CollationSettings::setReordering(const CollationData &data, } } while(b <= 0xff) { - table[b] = (uint8_t)b; + table[b] = static_cast<uint8_t>(b); ++b; } if(firstSplitByteRangeIndex < 0) { @@ -200,7 +200,7 @@ CollationSettings::setReorderArrays(const int32_t *codes, int32_t codesLength, } else { // Allocate one memory block for the codes, the ranges, and the 16-aligned table. int32_t capacity = (totalLength + 3) & ~3; // round up to a multiple of 4 ints - ownedCodes = (int32_t *)uprv_malloc(capacity * 4 + 256); + ownedCodes = static_cast<int32_t*>(uprv_malloc(capacity * 4 + 256)); if(ownedCodes == nullptr) { resetReordering(); errorCode = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/i18n/collationsettings.h b/deps/icu-small/source/i18n/collationsettings.h index 43a181211c0724..6ef3c8a8d75968 100644 --- a/deps/icu-small/source/i18n/collationsettings.h +++ b/deps/icu-small/source/i18n/collationsettings.h @@ -136,7 +136,7 @@ struct U_I18N_API CollationSettings : public SharedObject { inline uint32_t reorder(uint32_t p) const { uint8_t b = reorderTable[p >> 24]; if(b != 0 || p <= Collation::NO_CE_PRIMARY) { - return ((uint32_t)b << 24) | (p & 0xffffff); + return (static_cast<uint32_t>(b) << 24) | (p & 0xffffff); } else { return reorderEx(p); } @@ -178,7 +178,7 @@ struct U_I18N_API CollationSettings : public SharedObject { void setMaxVariable(int32_t value, int32_t defaultOptions, UErrorCode &errorCode); MaxVariable getMaxVariable() const { - return (MaxVariable)((options & MAX_VARIABLE_MASK) >> MAX_VARIABLE_SHIFT); + return static_cast<MaxVariable>((options & MAX_VARIABLE_MASK) >> MAX_VARIABLE_SHIFT); } /** diff --git a/deps/icu-small/source/i18n/collationtailoring.cpp b/deps/icu-small/source/i18n/collationtailoring.cpp index 8d22cf25166044..63419af74fa71d 100644 --- a/deps/icu-small/source/i18n/collationtailoring.cpp +++ b/deps/icu-small/source/i18n/collationtailoring.cpp @@ -101,7 +101,7 @@ CollationTailoring::setVersion(const UVersionInfo baseVersion, const UVersionInf int32_t CollationTailoring::getUCAVersion() const { - return ((int32_t)version[1] << 4) | (version[2] >> 6); + return (static_cast<int32_t>(version[1]) << 4) | (version[2] >> 6); } CollationCacheEntry::~CollationCacheEntry() { diff --git a/deps/icu-small/source/i18n/collationtailoring.h b/deps/icu-small/source/i18n/collationtailoring.h index ed7e46e3b9c47c..4137422cfa133e 100644 --- a/deps/icu-small/source/i18n/collationtailoring.h +++ b/deps/icu-small/source/i18n/collationtailoring.h @@ -46,21 +46,23 @@ class UnicodeSet; * The fields are public for convenience. * * It is shared, reference-counted, and auto-deleted; see SharedObject. + * + * U_I18N_API because genuca & genrb use it. */ -struct U_I18N_API CollationTailoring : public SharedObject { - CollationTailoring(const CollationSettings *baseSettings); - virtual ~CollationTailoring(); +struct U_I18N_API_CLASS CollationTailoring : public SharedObject { + U_I18N_API CollationTailoring(const CollationSettings *baseSettings); + U_I18N_API virtual ~CollationTailoring(); /** * Returns true if the constructor could not initialize properly. */ - UBool isBogus() { return settings == nullptr; } + U_I18N_API UBool isBogus() { return settings == nullptr; } - UBool ensureOwnedData(UErrorCode &errorCode); + U_I18N_API UBool ensureOwnedData(UErrorCode &errorCode); - static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version); - void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion); - int32_t getUCAVersion() const; + U_I18N_API static void makeBaseVersion(const UVersionInfo ucaVersion, UVersionInfo version); + U_I18N_API void setVersion(const UVersionInfo baseVersion, const UVersionInfo rulesVersion); + U_I18N_API int32_t getUCAVersion() const; // data for sorting etc. const CollationData *data; // == base data or ownedData @@ -94,14 +96,15 @@ struct U_I18N_API CollationTailoring : public SharedObject { CollationTailoring(const CollationTailoring &other) = delete; }; -struct U_I18N_API CollationCacheEntry : public SharedObject { - CollationCacheEntry(const Locale &loc, const CollationTailoring *t) +// U_I18N_API because gencolusb uses it. +struct U_I18N_API_CLASS CollationCacheEntry : public SharedObject { + U_I18N_API CollationCacheEntry(const Locale &loc, const CollationTailoring *t) : validLocale(loc), tailoring(t) { if(t != nullptr) { t->addRef(); } } - ~CollationCacheEntry(); + U_I18N_API ~CollationCacheEntry(); Locale validLocale; const CollationTailoring *tailoring; diff --git a/deps/icu-small/source/i18n/collationweights.cpp b/deps/icu-small/source/i18n/collationweights.cpp index 2351484590c9fa..6a4c32bc60158d 100644 --- a/deps/icu-small/source/i18n/collationweights.cpp +++ b/deps/icu-small/source/i18n/collationweights.cpp @@ -42,13 +42,13 @@ U_NAMESPACE_BEGIN static inline uint32_t getWeightTrail(uint32_t weight, int32_t length) { - return (uint32_t)(weight>>(8*(4-length)))&0xff; + return (weight >> (8 * (4 - length))) & 0xff; } static inline uint32_t setWeightTrail(uint32_t weight, int32_t length, uint32_t trail) { length=8*(4-length); - return (uint32_t)((weight&(0xffffff00<<length))|(trail<<length)); + return static_cast<uint32_t>((weight & (0xffffff00 << length)) | (trail << length)); } static inline uint32_t @@ -62,7 +62,7 @@ setWeightByte(uint32_t weight, int32_t idx, uint32_t byte) { idx*=8; if(idx<32) { - mask=((uint32_t)0xffffffff)>>idx; + mask = (static_cast<uint32_t>(0xffffffff)) >> idx; } else { // Do not use uint32_t>>32 because on some platforms that does not shift at all // while we need it to become 0. @@ -77,22 +77,22 @@ setWeightByte(uint32_t weight, int32_t idx, uint32_t byte) { } idx=32-idx; mask|=0xffffff00<<idx; - return (uint32_t)((weight&mask)|(byte<<idx)); + return ((weight & mask) | (byte << idx)); } static inline uint32_t truncateWeight(uint32_t weight, int32_t length) { - return (uint32_t)(weight&(0xffffffff<<(8*(4-length)))); + return static_cast<uint32_t>(weight & (0xffffffff << (8 * (4 - length)))); } static inline uint32_t incWeightTrail(uint32_t weight, int32_t length) { - return (uint32_t)(weight+(1UL<<(8*(4-length)))); + return static_cast<uint32_t>(weight + (1UL << (8 * (4 - length)))); } static inline uint32_t decWeightTrail(uint32_t weight, int32_t length) { - return (uint32_t)(weight-(1UL<<(8*(4-length)))); + return static_cast<uint32_t>(weight - (1UL << (8 * (4 - length)))); } CollationWeights::CollationWeights() @@ -169,7 +169,7 @@ uint32_t CollationWeights::incWeightByOffset(uint32_t weight, int32_t length, int32_t offset) const { for(;;) { offset += getWeightByte(weight, length); - if((uint32_t)offset <= maxBytes[length]) { + if (static_cast<uint32_t>(offset) <= maxBytes[length]) { return setWeightByte(weight, length, offset); } else { // Split the offset between this byte and the previous one. @@ -196,8 +196,8 @@ static int32_t U_CALLCONV compareRanges(const void * /*context*/, const void *left, const void *right) { uint32_t l, r; - l=((const CollationWeights::WeightRange *)left)->start; - r=((const CollationWeights::WeightRange *)right)->start; + l = static_cast<const CollationWeights::WeightRange*>(left)->start; + r = static_cast<const CollationWeights::WeightRange*>(right)->start; if(l<r) { return -1; } else if(l>r) { @@ -295,7 +295,7 @@ CollationWeights::getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit) { /* set the middle range */ middle.length=middleLength; if(middle.end>=middle.start) { - middle.count=(int32_t)((middle.end-middle.start)>>(8*(4-middleLength)))+1; + middle.count = static_cast<int32_t>((middle.end - middle.start) >> (8 * (4 - middleLength))) + 1; } else { /* no middle range, eliminate overlaps */ for(int32_t length=4; length>middleLength; --length) { @@ -322,8 +322,8 @@ CollationWeights::getWeightRanges(uint32_t lowerLimit, uint32_t upperLimit) { // Intersect these two ranges. lower[length].end=upper[length].end; lower[length].count= - (int32_t)getWeightTrail(lower[length].end, length)- - (int32_t)getWeightTrail(lower[length].start, length)+1; + static_cast<int32_t>(getWeightTrail(lower[length].end, length)) - + static_cast<int32_t>(getWeightTrail(lower[length].start, length)) + 1; // count might be <=0 in which case there is no room, // and the range-collecting code below will ignore this range. merged=true; diff --git a/deps/icu-small/source/i18n/collationweights.h b/deps/icu-small/source/i18n/collationweights.h index 0d20b927b2698c..b893baba80c26e 100644 --- a/deps/icu-small/source/i18n/collationweights.h +++ b/deps/icu-small/source/i18n/collationweights.h @@ -84,7 +84,7 @@ class U_I18N_API CollationWeights : public UMemory { private: /** @return number of usable byte values for byte idx */ inline int32_t countBytes(int32_t idx) const { - return (int32_t)(maxBytes[idx] - minBytes[idx] + 1); + return static_cast<int32_t>(maxBytes[idx] - minBytes[idx] + 1); } uint32_t incWeight(uint32_t weight, int32_t length) const; diff --git a/deps/icu-small/source/i18n/collunsafe.h b/deps/icu-small/source/i18n/collunsafe.h index 0767254a8ae2f4..a39aeed6f9e16c 100644 --- a/deps/icu-small/source/i18n/collunsafe.h +++ b/deps/icu-small/source/i18n/collunsafe.h @@ -12,116 +12,164 @@ #include "unicode/utypes.h" -#define COLLUNSAFE_ICU_VERSION "56.0.1" -#define COLLUNSAFE_COLL_VERSION "9.64" +#define COLLUNSAFE_ICU_VERSION "78.0.1" +#define COLLUNSAFE_COLL_VERSION "9.136" #define COLLUNSAFE_SERIALIZE 1 -static const int32_t unsafe_serializedCount = 850; -static const uint16_t unsafe_serializedData[850] = { -0x8350, 0x01B8, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8 +static const int32_t unsafe_serializedCount = 1236; +static const uint16_t unsafe_serializedData[1236] = { +0x84D2, 0x01C2, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8 0x0300, 0x034F, 0x0350, 0x0370, 0x03A9, 0x03AA, 0x03E2, 0x03E3, // 16 0x042F, 0x0430, 0x0483, 0x0488, 0x0531, 0x0532, 0x0591, 0x05BE, // 24 0x05BF, 0x05C0, 0x05C1, 0x05C3, 0x05C4, 0x05C6, 0x05C7, 0x05C8, // 32 0x05D0, 0x05D1, 0x0610, 0x061B, 0x0628, 0x0629, 0x064B, 0x0660, // 40 0x0670, 0x0671, 0x06D6, 0x06DD, 0x06DF, 0x06E5, 0x06E7, 0x06E9, // 48 0x06EA, 0x06EE, 0x0710, 0x0712, 0x0730, 0x074B, 0x078C, 0x078D, // 56 -0x07D8, 0x07D9, 0x07EB, 0x07F4, 0x0800, 0x0801, 0x0816, 0x081A, // 64 -0x081B, 0x0824, 0x0825, 0x0828, 0x0829, 0x082E, 0x0840, 0x0841, // 72 -0x0859, 0x085C, 0x08E3, 0x0900, 0x0905, 0x0906, 0x093C, 0x093D, // 80 -0x094D, 0x094E, 0x0951, 0x0955, 0x0995, 0x0996, 0x09BC, 0x09BD, // 88 -0x09BE, 0x09BF, 0x09CD, 0x09CE, 0x09D7, 0x09D8, 0x0A15, 0x0A16, // 96 -0x0A3C, 0x0A3D, 0x0A4D, 0x0A4E, 0x0A95, 0x0A96, 0x0ABC, 0x0ABD, // 104 -0x0ACD, 0x0ACE, 0x0B15, 0x0B16, 0x0B3C, 0x0B3D, 0x0B3E, 0x0B3F, // 112 -0x0B4D, 0x0B4E, 0x0B56, 0x0B58, 0x0B95, 0x0B96, 0x0BBE, 0x0BBF, // 120 -0x0BCD, 0x0BCE, 0x0BD7, 0x0BD8, 0x0C15, 0x0C16, 0x0C4D, 0x0C4E, // 128 -0x0C55, 0x0C57, 0x0C95, 0x0C96, 0x0CBC, 0x0CBD, 0x0CC2, 0x0CC3, // 136 -0x0CCD, 0x0CCE, 0x0CD5, 0x0CD7, 0x0D15, 0x0D16, 0x0D3E, 0x0D3F, // 144 -0x0D4D, 0x0D4E, 0x0D57, 0x0D58, 0x0D85, 0x0D86, 0x0DCA, 0x0DCB, // 152 -0x0DCF, 0x0DD0, 0x0DDF, 0x0DE0, 0x0E01, 0x0E2F, 0x0E32, 0x0E33, // 160 -0x0E38, 0x0E3B, 0x0E48, 0x0E4C, 0x0E81, 0x0E83, 0x0E84, 0x0E85, // 168 -0x0E87, 0x0E89, 0x0E8A, 0x0E8B, 0x0E8D, 0x0E8E, 0x0E94, 0x0E98, // 176 -0x0E99, 0x0EA0, 0x0EA1, 0x0EA4, 0x0EA5, 0x0EA6, 0x0EA7, 0x0EA8, // 184 -0x0EAA, 0x0EAC, 0x0EAD, 0x0EAF, 0x0EB2, 0x0EB3, 0x0EB8, 0x0EBA, // 192 +0x07CA, 0x07CB, 0x07EB, 0x07F4, 0x07FD, 0x07FE, 0x0800, 0x0801, // 64 +0x0816, 0x081A, 0x081B, 0x0824, 0x0825, 0x0828, 0x0829, 0x082E, // 72 +0x0840, 0x0841, 0x0859, 0x085C, 0x0897, 0x08A0, 0x08CA, 0x08E2, // 80 +0x08E3, 0x0900, 0x0905, 0x0906, 0x093C, 0x093D, 0x094D, 0x094E, // 88 +0x0951, 0x0955, 0x0995, 0x0996, 0x09BC, 0x09BD, 0x09BE, 0x09BF, // 96 +0x09CD, 0x09CE, 0x09D7, 0x09D8, 0x09FE, 0x09FF, 0x0A15, 0x0A16, // 104 +0x0A3C, 0x0A3D, 0x0A4D, 0x0A4E, 0x0A95, 0x0A96, 0x0ABC, 0x0ABD, // 112 +0x0ACD, 0x0ACE, 0x0B15, 0x0B16, 0x0B3C, 0x0B3D, 0x0B3E, 0x0B3F, // 120 +0x0B4D, 0x0B4E, 0x0B56, 0x0B58, 0x0B95, 0x0B96, 0x0BBE, 0x0BBF, // 128 +0x0BCD, 0x0BCE, 0x0BD7, 0x0BD8, 0x0C15, 0x0C16, 0x0C3C, 0x0C3D, // 136 +0x0C4D, 0x0C4E, 0x0C55, 0x0C57, 0x0C95, 0x0C96, 0x0CBC, 0x0CBD, // 144 +0x0CC2, 0x0CC3, 0x0CCD, 0x0CCE, 0x0CD5, 0x0CD7, 0x0D15, 0x0D16, // 152 +0x0D3B, 0x0D3D, 0x0D3E, 0x0D3F, 0x0D4D, 0x0D4E, 0x0D57, 0x0D58, // 160 +0x0D85, 0x0D86, 0x0DCA, 0x0DCB, 0x0DCF, 0x0DD0, 0x0DDF, 0x0DE0, // 168 +0x0E01, 0x0E2F, 0x0E32, 0x0E33, 0x0E38, 0x0E3B, 0x0E48, 0x0E4C, // 176 +0x0E81, 0x0E83, 0x0E84, 0x0E85, 0x0E86, 0x0E8B, 0x0E8C, 0x0EA4, // 184 +0x0EA5, 0x0EA6, 0x0EA7, 0x0EAF, 0x0EB2, 0x0EB3, 0x0EB8, 0x0EBB, // 192 0x0EC8, 0x0ECC, 0x0EDC, 0x0EE0, 0x0F18, 0x0F1A, 0x0F35, 0x0F36, // 200 0x0F37, 0x0F38, 0x0F39, 0x0F3A, 0x0F40, 0x0F41, 0x0F71, 0x0F76, // 208 0x0F7A, 0x0F7E, 0x0F80, 0x0F85, 0x0F86, 0x0F88, 0x0FC6, 0x0FC7, // 216 0x1000, 0x1001, 0x102E, 0x102F, 0x1037, 0x1038, 0x1039, 0x103B, // 224 0x108D, 0x108E, 0x10D3, 0x10D4, 0x12A0, 0x12A1, 0x135D, 0x1360, // 232 0x13C4, 0x13C5, 0x14C0, 0x14C1, 0x168F, 0x1690, 0x16A0, 0x16A1, // 240 -0x1703, 0x1704, 0x1714, 0x1715, 0x1723, 0x1724, 0x1734, 0x1735, // 248 +0x1703, 0x1704, 0x1714, 0x1716, 0x1723, 0x1724, 0x1734, 0x1735, // 248 0x1743, 0x1744, 0x1763, 0x1764, 0x1780, 0x1781, 0x17D2, 0x17D3, // 256 0x17DD, 0x17DE, 0x1826, 0x1827, 0x18A9, 0x18AA, 0x1900, 0x1901, // 264 0x1939, 0x193C, 0x1950, 0x1951, 0x1980, 0x19AC, 0x1A00, 0x1A01, // 272 0x1A17, 0x1A19, 0x1A20, 0x1A21, 0x1A60, 0x1A61, 0x1A75, 0x1A7D, // 280 -0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1B05, 0x1B06, 0x1B34, 0x1B36, // 288 -0x1B44, 0x1B45, 0x1B6B, 0x1B74, 0x1B83, 0x1B84, 0x1BAA, 0x1BAC, // 296 -0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, 0x1BF2, 0x1BF4, 0x1C00, 0x1C01, // 304 -0x1C37, 0x1C38, 0x1C5A, 0x1C5B, 0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, // 312 -0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, 0x1CF4, 0x1CF5, 0x1CF8, 0x1CFA, // 320 -0x1DC0, 0x1DF6, 0x1DFC, 0x1E00, 0x201C, 0x201D, 0x20AC, 0x20AD, // 328 -0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, 0x263A, 0x263B, // 336 -0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D5E, 0x2D5F, 0x2D7F, 0x2D80, // 344 -0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, 0x3099, 0x309B, // 352 -0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, 0xA288, 0xA289, // 360 -0xA4E8, 0xA4E9, 0xA549, 0xA54A, 0xA66F, 0xA670, 0xA674, 0xA67E, // 368 -0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, 0xA806, 0xA807, // 376 -0xA840, 0xA841, 0xA882, 0xA883, 0xA8C4, 0xA8C5, 0xA8E0, 0xA8F2, // 384 -0xA90A, 0xA90B, 0xA92B, 0xA92E, 0xA930, 0xA931, 0xA953, 0xA954, // 392 -0xA984, 0xA985, 0xA9B3, 0xA9B4, 0xA9C0, 0xA9C1, 0xAA00, 0xAA01, // 400 -0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, 0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, // 408 -0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, 0xABC0, 0xABC1, 0xABED, 0xABEE, // 416 -0xAC00, 0xAC01, 0xD800, 0xD807, 0xD808, 0xD809, 0xD80C, 0xD80D, // 424 -0xD811, 0xD812, 0xD81A, 0xD81C, 0xD82F, 0xD830, 0xD834, 0xD835, // 432 -0xD83A, 0xD83B, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, 0xFDD0, 0xFDD1, // 440 -0xFE20, 0xFE30, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x01FD, // 448 -0x0001, 0x01FE, 0x0001, 0x0280, 0x0001, 0x0281, 0x0001, 0x02B7, // 456 -0x0001, 0x02B8, 0x0001, 0x02E0, 0x0001, 0x02E1, 0x0001, 0x0308, // 464 -0x0001, 0x0309, 0x0001, 0x0330, 0x0001, 0x0331, 0x0001, 0x036B, // 472 -0x0001, 0x036C, 0x0001, 0x0376, 0x0001, 0x037B, 0x0001, 0x0380, // 480 -0x0001, 0x0381, 0x0001, 0x03A0, 0x0001, 0x03A1, 0x0001, 0x0414, // 488 -0x0001, 0x0415, 0x0001, 0x0450, 0x0001, 0x0451, 0x0001, 0x0480, // 496 -0x0001, 0x0481, 0x0001, 0x0500, 0x0001, 0x0501, 0x0001, 0x0537, // 504 -0x0001, 0x0538, 0x0001, 0x0647, 0x0001, 0x0648, 0x0001, 0x0800, // 512 -0x0001, 0x0801, 0x0001, 0x0840, 0x0001, 0x0841, 0x0001, 0x0873, // 520 -0x0001, 0x0874, 0x0001, 0x0896, 0x0001, 0x0897, 0x0001, 0x08F4, // 528 -0x0001, 0x08F5, 0x0001, 0x0900, 0x0001, 0x0901, 0x0001, 0x0920, // 536 -0x0001, 0x0921, 0x0001, 0x0980, 0x0001, 0x0981, 0x0001, 0x09A0, // 544 -0x0001, 0x09A1, 0x0001, 0x0A00, 0x0001, 0x0A01, 0x0001, 0x0A0D, // 552 -0x0001, 0x0A0E, 0x0001, 0x0A0F, 0x0001, 0x0A10, 0x0001, 0x0A38, // 560 -0x0001, 0x0A3B, 0x0001, 0x0A3F, 0x0001, 0x0A40, 0x0001, 0x0A60, // 568 -0x0001, 0x0A61, 0x0001, 0x0A95, 0x0001, 0x0A96, 0x0001, 0x0AC1, // 576 -0x0001, 0x0AC2, 0x0001, 0x0AE5, 0x0001, 0x0AE7, 0x0001, 0x0B00, // 584 -0x0001, 0x0B01, 0x0001, 0x0B40, 0x0001, 0x0B41, 0x0001, 0x0B60, // 592 -0x0001, 0x0B61, 0x0001, 0x0B8F, 0x0001, 0x0B90, 0x0001, 0x0C00, // 600 -0x0001, 0x0C01, 0x0001, 0x0CA1, 0x0001, 0x0CA2, 0x0001, 0x1005, // 608 -0x0001, 0x1006, 0x0001, 0x1046, 0x0001, 0x1047, 0x0001, 0x107F, // 616 -0x0001, 0x1080, 0x0001, 0x1083, 0x0001, 0x1084, 0x0001, 0x10B9, // 624 -0x0001, 0x10BB, 0x0001, 0x10D0, 0x0001, 0x10D1, 0x0001, 0x1100, // 632 -0x0001, 0x1104, 0x0001, 0x1127, 0x0001, 0x1128, 0x0001, 0x1133, // 640 -0x0001, 0x1135, 0x0001, 0x1152, 0x0001, 0x1153, 0x0001, 0x1173, // 648 -0x0001, 0x1174, 0x0001, 0x1183, 0x0001, 0x1184, 0x0001, 0x11C0, // 656 -0x0001, 0x11C1, 0x0001, 0x11CA, 0x0001, 0x11CB, 0x0001, 0x1208, // 664 -0x0001, 0x1209, 0x0001, 0x1235, 0x0001, 0x1237, 0x0001, 0x128F, // 672 -0x0001, 0x1290, 0x0001, 0x12BE, 0x0001, 0x12BF, 0x0001, 0x12E9, // 680 -0x0001, 0x12EB, 0x0001, 0x1315, 0x0001, 0x1316, 0x0001, 0x133C, // 688 -0x0001, 0x133D, 0x0001, 0x133E, 0x0001, 0x133F, 0x0001, 0x134D, // 696 -0x0001, 0x134E, 0x0001, 0x1357, 0x0001, 0x1358, 0x0001, 0x1366, // 704 -0x0001, 0x136D, 0x0001, 0x1370, 0x0001, 0x1375, 0x0001, 0x1484, // 712 -0x0001, 0x1485, 0x0001, 0x14B0, 0x0001, 0x14B1, 0x0001, 0x14BA, // 720 -0x0001, 0x14BB, 0x0001, 0x14BD, 0x0001, 0x14BE, 0x0001, 0x14C2, // 728 -0x0001, 0x14C4, 0x0001, 0x158E, 0x0001, 0x158F, 0x0001, 0x15AF, // 736 -0x0001, 0x15B0, 0x0001, 0x15BF, 0x0001, 0x15C1, 0x0001, 0x160E, // 744 -0x0001, 0x160F, 0x0001, 0x163F, 0x0001, 0x1640, 0x0001, 0x1680, // 752 -0x0001, 0x1681, 0x0001, 0x16B6, 0x0001, 0x16B8, 0x0001, 0x1717, // 760 -0x0001, 0x1718, 0x0001, 0x172B, 0x0001, 0x172C, 0x0001, 0x18B4, // 768 -0x0001, 0x18B5, 0x0001, 0x1AC0, 0x0001, 0x1AC1, 0x0001, 0x2000, // 776 -0x0001, 0x2001, 0x0001, 0x3153, 0x0001, 0x3154, 0x0001, 0x4400, // 784 -0x0001, 0x4401, 0x0001, 0x6A4F, 0x0001, 0x6A50, 0x0001, 0x6AE6, // 792 -0x0001, 0x6AE7, 0x0001, 0x6AF0, 0x0001, 0x6AF5, 0x0001, 0x6B1C, // 800 -0x0001, 0x6B1D, 0x0001, 0x6B30, 0x0001, 0x6B37, 0x0001, 0x6F00, // 808 -0x0001, 0x6F01, 0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, // 816 -0x0001, 0xBC9F, 0x0001, 0xD165, 0x0001, 0xD16A, 0x0001, 0xD16D, // 824 -0x0001, 0xD173, 0x0001, 0xD17B, 0x0001, 0xD183, 0x0001, 0xD185, // 832 -0x0001, 0xD18C, 0x0001, 0xD1AA, 0x0001, 0xD1AE, 0x0001, 0xD242, // 840 -0x0001, 0xD245, 0x0001, 0xE802, 0x0001, 0xE803, 0x0001, 0xE8D0, // 848 -0x0001, 0xE8D7}; +0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1ABF, 0x1ADE, 0x1AE0, 0x1AEC, // 288 +0x1B05, 0x1B06, 0x1B34, 0x1B36, 0x1B44, 0x1B45, 0x1B6B, 0x1B74, // 296 +0x1B83, 0x1B84, 0x1BAA, 0x1BAC, 0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, // 304 +0x1BF2, 0x1BF4, 0x1C00, 0x1C01, 0x1C37, 0x1C38, 0x1C5A, 0x1C5B, // 312 +0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, 0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, // 320 +0x1CF4, 0x1CF5, 0x1CF8, 0x1CFA, 0x1DC0, 0x1E00, 0x201C, 0x201D, // 328 +0x20AC, 0x20AD, 0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, // 336 +0x263A, 0x263B, 0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D30, 0x2D31, // 344 +0x2D7F, 0x2D80, 0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, // 352 +0x3099, 0x309B, 0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, // 360 +0xA288, 0xA289, 0xA4D0, 0xA4D1, 0xA549, 0xA54A, 0xA66F, 0xA670, // 368 +0xA674, 0xA67E, 0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, // 376 +0xA806, 0xA807, 0xA82C, 0xA82D, 0xA840, 0xA841, 0xA882, 0xA883, // 384 +0xA8C4, 0xA8C5, 0xA8E0, 0xA8F2, 0xA90A, 0xA90B, 0xA92B, 0xA92E, // 392 +0xA930, 0xA931, 0xA953, 0xA954, 0xA984, 0xA985, 0xA9B3, 0xA9B4, // 400 +0xA9C0, 0xA9C1, 0xAA00, 0xAA01, 0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, // 408 +0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, 0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, // 416 +0xABC0, 0xABC1, 0xABED, 0xABEE, 0xAC00, 0xAC01, 0xD800, 0xD809, // 424 +0xD80B, 0xD80D, 0xD811, 0xD812, 0xD818, 0xD819, 0xD81A, 0xD81C, // 432 +0xD820, 0xD821, 0xD823, 0xD824, 0xD82C, 0xD82D, 0xD82F, 0xD830, // 440 +0xD834, 0xD835, 0xD838, 0xD83B, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, // 448 +0xFDD0, 0xFDD1, 0xFE20, 0xFE30, 0x0001, 0x0000, 0x0001, 0x0001, // 456 +0x0001, 0x01FD, 0x0001, 0x01FE, 0x0001, 0x0280, 0x0001, 0x0281, // 464 +0x0001, 0x02A0, 0x0001, 0x02A1, 0x0001, 0x02E0, 0x0001, 0x02E1, // 472 +0x0001, 0x0300, 0x0001, 0x0301, 0x0001, 0x0330, 0x0001, 0x0331, // 480 +0x0001, 0x036B, 0x0001, 0x036C, 0x0001, 0x0376, 0x0001, 0x037B, // 488 +0x0001, 0x0380, 0x0001, 0x0381, 0x0001, 0x03A0, 0x0001, 0x03A1, // 496 +0x0001, 0x0414, 0x0001, 0x0415, 0x0001, 0x0450, 0x0001, 0x0451, // 504 +0x0001, 0x0480, 0x0001, 0x0481, 0x0001, 0x04B5, 0x0001, 0x04B6, // 512 +0x0001, 0x0500, 0x0001, 0x0501, 0x0001, 0x0537, 0x0001, 0x0538, // 520 +0x0001, 0x0582, 0x0001, 0x0583, 0x0001, 0x05C2, 0x0001, 0x05C3, // 528 +0x0001, 0x0647, 0x0001, 0x0648, 0x0001, 0x0800, 0x0001, 0x0801, // 536 +0x0001, 0x0840, 0x0001, 0x0841, 0x0001, 0x0873, 0x0001, 0x0874, // 544 +0x0001, 0x0896, 0x0001, 0x0897, 0x0001, 0x08F4, 0x0001, 0x08F5, // 552 +0x0001, 0x0900, 0x0001, 0x0901, 0x0001, 0x0920, 0x0001, 0x0921, // 560 +0x0001, 0x0950, 0x0001, 0x0951, 0x0001, 0x0980, 0x0001, 0x0981, // 568 +0x0001, 0x09A0, 0x0001, 0x09A1, 0x0001, 0x0A00, 0x0001, 0x0A01, // 576 +0x0001, 0x0A0D, 0x0001, 0x0A0E, 0x0001, 0x0A0F, 0x0001, 0x0A10, // 584 +0x0001, 0x0A38, 0x0001, 0x0A3B, 0x0001, 0x0A3F, 0x0001, 0x0A40, // 592 +0x0001, 0x0A60, 0x0001, 0x0A61, 0x0001, 0x0A95, 0x0001, 0x0A96, // 600 +0x0001, 0x0AD8, 0x0001, 0x0AD9, 0x0001, 0x0AE5, 0x0001, 0x0AE7, // 608 +0x0001, 0x0B00, 0x0001, 0x0B01, 0x0001, 0x0B40, 0x0001, 0x0B41, // 616 +0x0001, 0x0B60, 0x0001, 0x0B61, 0x0001, 0x0B8F, 0x0001, 0x0B90, // 624 +0x0001, 0x0C00, 0x0001, 0x0C01, 0x0001, 0x0CA1, 0x0001, 0x0CA2, // 632 +0x0001, 0x0D12, 0x0001, 0x0D13, 0x0001, 0x0D24, 0x0001, 0x0D28, // 640 +0x0001, 0x0D5D, 0x0001, 0x0D5E, 0x0001, 0x0D69, 0x0001, 0x0D6E, // 648 +0x0001, 0x0E88, 0x0001, 0x0E89, 0x0001, 0x0EAB, 0x0001, 0x0EAD, // 656 +0x0001, 0x0EFA, 0x0001, 0x0EFC, 0x0001, 0x0EFD, 0x0001, 0x0F00, // 664 +0x0001, 0x0F19, 0x0001, 0x0F1A, 0x0001, 0x0F42, 0x0001, 0x0F43, // 672 +0x0001, 0x0F46, 0x0001, 0x0F51, 0x0001, 0x0F7C, 0x0001, 0x0F7D, // 680 +0x0001, 0x0F82, 0x0001, 0x0F86, 0x0001, 0x0FBF, 0x0001, 0x0FC0, // 688 +0x0001, 0x0FF1, 0x0001, 0x0FF2, 0x0001, 0x1005, 0x0001, 0x1006, // 696 +0x0001, 0x1046, 0x0001, 0x1047, 0x0001, 0x1070, 0x0001, 0x1071, // 704 +0x0001, 0x107F, 0x0001, 0x1080, 0x0001, 0x1083, 0x0001, 0x1084, // 712 +0x0001, 0x10B9, 0x0001, 0x10BB, 0x0001, 0x10D0, 0x0001, 0x10D1, // 720 +0x0001, 0x1100, 0x0001, 0x1104, 0x0001, 0x1127, 0x0001, 0x1128, // 728 +0x0001, 0x1133, 0x0001, 0x1135, 0x0001, 0x1152, 0x0001, 0x1153, // 736 +0x0001, 0x1173, 0x0001, 0x1174, 0x0001, 0x1183, 0x0001, 0x1184, // 744 +0x0001, 0x11C0, 0x0001, 0x11C1, 0x0001, 0x11CA, 0x0001, 0x11CB, // 752 +0x0001, 0x1208, 0x0001, 0x1209, 0x0001, 0x1235, 0x0001, 0x1237, // 760 +0x0001, 0x128F, 0x0001, 0x1290, 0x0001, 0x12BE, 0x0001, 0x12BF, // 768 +0x0001, 0x12E9, 0x0001, 0x12EB, 0x0001, 0x1315, 0x0001, 0x1316, // 776 +0x0001, 0x133B, 0x0001, 0x133D, 0x0001, 0x133E, 0x0001, 0x133F, // 784 +0x0001, 0x134D, 0x0001, 0x134E, 0x0001, 0x1357, 0x0001, 0x1358, // 792 +0x0001, 0x1366, 0x0001, 0x136D, 0x0001, 0x1370, 0x0001, 0x1375, // 800 +0x0001, 0x1392, 0x0001, 0x1393, 0x0001, 0x13B8, 0x0001, 0x13B9, // 808 +0x0001, 0x13BB, 0x0001, 0x13BC, 0x0001, 0x13C2, 0x0001, 0x13C3, // 816 +0x0001, 0x13C9, 0x0001, 0x13CA, 0x0001, 0x13CE, 0x0001, 0x13D1, // 824 +0x0001, 0x1412, 0x0001, 0x1413, 0x0001, 0x1442, 0x0001, 0x1443, // 832 +0x0001, 0x1446, 0x0001, 0x1447, 0x0001, 0x145E, 0x0001, 0x145F, // 840 +0x0001, 0x1484, 0x0001, 0x1485, 0x0001, 0x14B0, 0x0001, 0x14B1, // 848 +0x0001, 0x14BA, 0x0001, 0x14BB, 0x0001, 0x14BD, 0x0001, 0x14BE, // 856 +0x0001, 0x14C2, 0x0001, 0x14C4, 0x0001, 0x158E, 0x0001, 0x158F, // 864 +0x0001, 0x15AF, 0x0001, 0x15B0, 0x0001, 0x15BF, 0x0001, 0x15C1, // 872 +0x0001, 0x160E, 0x0001, 0x160F, 0x0001, 0x163F, 0x0001, 0x1640, // 880 +0x0001, 0x1680, 0x0001, 0x1681, 0x0001, 0x16B6, 0x0001, 0x16B8, // 888 +0x0001, 0x1717, 0x0001, 0x1718, 0x0001, 0x172B, 0x0001, 0x172C, // 896 +0x0001, 0x180B, 0x0001, 0x180C, 0x0001, 0x1839, 0x0001, 0x183B, // 904 +0x0001, 0x18B4, 0x0001, 0x18B5, 0x0001, 0x190C, 0x0001, 0x190D, // 912 +0x0001, 0x1930, 0x0001, 0x1931, 0x0001, 0x193D, 0x0001, 0x193F, // 920 +0x0001, 0x1943, 0x0001, 0x1944, 0x0001, 0x19CE, 0x0001, 0x19CF, // 928 +0x0001, 0x19E0, 0x0001, 0x19E1, 0x0001, 0x1A0B, 0x0001, 0x1A0C, // 936 +0x0001, 0x1A34, 0x0001, 0x1A35, 0x0001, 0x1A47, 0x0001, 0x1A48, // 944 +0x0001, 0x1A5C, 0x0001, 0x1A5D, 0x0001, 0x1A99, 0x0001, 0x1A9A, // 952 +0x0001, 0x1AC0, 0x0001, 0x1AC1, 0x0001, 0x1BC4, 0x0001, 0x1BC5, // 960 +0x0001, 0x1C0E, 0x0001, 0x1C0F, 0x0001, 0x1C3F, 0x0001, 0x1C40, // 968 +0x0001, 0x1C72, 0x0001, 0x1C73, 0x0001, 0x1D10, 0x0001, 0x1D11, // 976 +0x0001, 0x1D42, 0x0001, 0x1D43, 0x0001, 0x1D44, 0x0001, 0x1D46, // 984 +0x0001, 0x1D71, 0x0001, 0x1D72, 0x0001, 0x1D97, 0x0001, 0x1D98, // 992 +0x0001, 0x1DC6, 0x0001, 0x1DC7, 0x0001, 0x1EE5, 0x0001, 0x1EE6, // 1000 +0x0001, 0x1F1B, 0x0001, 0x1F1C, 0x0001, 0x1F41, 0x0001, 0x1F43, // 1008 +0x0001, 0x2000, 0x0001, 0x2001, 0x0001, 0x2FE5, 0x0001, 0x2FE6, // 1016 +0x0001, 0x3153, 0x0001, 0x3154, 0x0001, 0x4400, 0x0001, 0x4401, // 1024 +0x0001, 0x611C, 0x0001, 0x611D, 0x0001, 0x611E, 0x0001, 0x6121, // 1032 +0x0001, 0x6123, 0x0001, 0x6126, 0x0001, 0x6129, 0x0001, 0x612A, // 1040 +0x0001, 0x612F, 0x0001, 0x6130, 0x0001, 0x6A4F, 0x0001, 0x6A50, // 1048 +0x0001, 0x6ABC, 0x0001, 0x6ABD, 0x0001, 0x6AE6, 0x0001, 0x6AE7, // 1056 +0x0001, 0x6AF0, 0x0001, 0x6AF5, 0x0001, 0x6B1C, 0x0001, 0x6B1D, // 1064 +0x0001, 0x6B30, 0x0001, 0x6B37, 0x0001, 0x6D45, 0x0001, 0x6D46, // 1072 +0x0001, 0x6D67, 0x0001, 0x6D69, 0x0001, 0x6E40, 0x0001, 0x6E41, // 1080 +0x0001, 0x6EA1, 0x0001, 0x6EA2, 0x0001, 0x6F00, 0x0001, 0x6F01, // 1088 +0x0001, 0x6FF0, 0x0001, 0x6FF2, 0x0001, 0x8229, 0x0001, 0x822A, // 1096 +0x0001, 0x8C65, 0x0001, 0x8C66, 0x0001, 0xB1C4, 0x0001, 0xB1C5, // 1104 +0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, 0x0001, 0xBC9F, // 1112 +0x0001, 0xD165, 0x0001, 0xD16A, 0x0001, 0xD16D, 0x0001, 0xD173, // 1120 +0x0001, 0xD17B, 0x0001, 0xD183, 0x0001, 0xD185, 0x0001, 0xD18C, // 1128 +0x0001, 0xD1AA, 0x0001, 0xD1AE, 0x0001, 0xD242, 0x0001, 0xD245, // 1136 +0x0001, 0xE000, 0x0001, 0xE007, 0x0001, 0xE008, 0x0001, 0xE019, // 1144 +0x0001, 0xE01B, 0x0001, 0xE022, 0x0001, 0xE023, 0x0001, 0xE025, // 1152 +0x0001, 0xE026, 0x0001, 0xE02B, 0x0001, 0xE08F, 0x0001, 0xE090, // 1160 +0x0001, 0xE108, 0x0001, 0xE109, 0x0001, 0xE130, 0x0001, 0xE137, // 1168 +0x0001, 0xE290, 0x0001, 0xE291, 0x0001, 0xE2AE, 0x0001, 0xE2AF, // 1176 +0x0001, 0xE2E1, 0x0001, 0xE2E2, 0x0001, 0xE2EC, 0x0001, 0xE2F0, // 1184 +0x0001, 0xE4E6, 0x0001, 0xE4E7, 0x0001, 0xE4EC, 0x0001, 0xE4F0, // 1192 +0x0001, 0xE5D0, 0x0001, 0xE5D1, 0x0001, 0xE5EE, 0x0001, 0xE5F0, // 1200 +0x0001, 0xE6D5, 0x0001, 0xE6D6, 0x0001, 0xE6E3, 0x0001, 0xE6E4, // 1208 +0x0001, 0xE6E6, 0x0001, 0xE6E7, 0x0001, 0xE6EE, 0x0001, 0xE6F0, // 1216 +0x0001, 0xE6F5, 0x0001, 0xE6F6, 0x0001, 0xE802, 0x0001, 0xE803, // 1224 +0x0001, 0xE8D0, 0x0001, 0xE8D7, 0x0001, 0xE909, 0x0001, 0xE90A, // 1232 +0x0001, 0xE944, 0x0001, 0xE94B}; #endif diff --git a/deps/icu-small/source/i18n/coptccal.cpp b/deps/icu-small/source/i18n/coptccal.cpp index a957f8f2c561b4..f712a2fdb20c4f 100644 --- a/deps/icu-small/source/i18n/coptccal.cpp +++ b/deps/icu-small/source/i18n/coptccal.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_FORMATTING +#include "gregoimp.h" #include "umutex.h" #include "coptccal.h" #include "cecal.h" @@ -57,102 +58,27 @@ CopticCalendar::getType() const //------------------------------------------------------------------------- int32_t -CopticCalendar::handleGetExtendedYear() +CopticCalendar::handleGetExtendedYear(UErrorCode& status) { - int32_t eyear; - if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - // The year defaults to the epoch start, the era to CE - int32_t era = internalGet(UCAL_ERA, CE); - if (era == BCE) { - eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year - } else { - eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 - } - } - return eyear; -} - -void -CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) -{ - int32_t eyear, month, day, era, year; - jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); - - if (eyear <= 0) { - era = BCE; - year = 1 - eyear; - } else { - era = CE; - year = eyear; - } - - internalSet(UCAL_EXTENDED_YEAR, eyear); - internalSet(UCAL_ERA, era); - internalSet(UCAL_YEAR, year); - internalSet(UCAL_MONTH, month); - internalSet(UCAL_ORDINAL_MONTH, month); - internalSet(UCAL_DATE, day); - internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); -} - -constexpr uint32_t kCopticRelatedYearDiff = 284; - -int32_t CopticCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); if (U_FAILURE(status)) { return 0; } - return year + kCopticRelatedYearDiff; -} - -void CopticCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kCopticRelatedYearDiff); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -static void U_CALLCONV initializeSystemDefaultCentury() { - UErrorCode status = U_ZERO_ERROR; - CopticCalendar calendar(Locale("@calendar=coptic"), status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -CopticCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -CopticCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; + // The year defaults to the epoch start, the era to CE + int32_t era = internalGet(UCAL_ERA, CE); + if (era == BCE) { + return 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year + } + if (era == CE){ + return internalGet(UCAL_YEAR, 1); // Default to year 1 + } + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } +IMPL_SYSTEM_DEFAULT_CENTURY(CopticCalendar, "@calendar=coptic") int32_t CopticCalendar::getJDEpochOffset() const @@ -160,21 +86,24 @@ CopticCalendar::getJDEpochOffset() const return COPTIC_JD_EPOCH_OFFSET; } +int32_t CopticCalendar::extendedYearToEra(int32_t extendedYear) const { + return extendedYear <= 0 ? BCE : CE; +} -#if 0 -// We do not want to introduce this API in ICU4C. -// It was accidentally introduced in ICU4J as a public API. +int32_t CopticCalendar::extendedYearToYear(int32_t extendedYear) const { + return extendedYear <= 0 ? 1 - extendedYear : extendedYear; +} -//------------------------------------------------------------------------- -// Calendar system Conversion methods... -//------------------------------------------------------------------------- +bool CopticCalendar::isEra0CountingBackward() const { + return true; +} int32_t -CopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day) -{ - return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET); +CopticCalendar::getRelatedYearDifference() const { + constexpr int32_t kCopticCalendarRelatedYearDifference = 284; + return kCopticCalendarRelatedYearDifference; } -#endif + U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/coptccal.h b/deps/icu-small/source/i18n/coptccal.h index 396127e8adb5ff..2b0fad4acee391 100644 --- a/deps/icu-small/source/i18n/coptccal.h +++ b/deps/icu-small/source/i18n/coptccal.h @@ -154,57 +154,46 @@ class CopticCalendar : public CECalendar { */ const char * getType() const override; - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - protected: //------------------------------------------------------------------------- // Calendar framework //------------------------------------------------------------------------- /** - * Return the extended year defined by the current fields. * @internal */ - virtual int32_t handleGetExtendedYear() override; + int32_t getRelatedYearDifference() const override; /** - * Compute fields from the JD + * Return the extended year defined by the current fields. * @internal */ - virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; + + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 + * Return the date offset from Julian * @internal */ - virtual UDate defaultCenturyStart() const override; + int32_t getJDEpochOffset() const override; /** - * Returns the year in which the default century begins + * Compute the era from extended year. * @internal */ - virtual int32_t defaultCenturyStartYear() const override; + int32_t extendedYearToEra(int32_t extendedYear) const override; /** - * Return the date offset from Julian + * Compute the year from extended year. * @internal */ - virtual int32_t getJDEpochOffset() const override; - + int32_t extendedYearToYear(int32_t extendedYear) const override; + /** + * @internal + */ + bool isEra0CountingBackward() const override; public: /** * Override Calendar Returns a unique class ID POLYMORPHICALLY. Pure virtual @@ -231,24 +220,6 @@ class CopticCalendar : public CECalendar { */ U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); -#if 0 - // We do not want to introduce this API in ICU4C. - // It was accidentally introduced in ICU4J as a public API. -public: - //------------------------------------------------------------------------- - // Calendar system Conversion methods... - //------------------------------------------------------------------------- - /** - * Convert an Coptic year, month, and day to a Julian day. - * - * @param year the extended year - * @param month the month - * @param day the day - * @return Julian day - * @internal - */ - static int32_t copticToJD(int32_t year, int32_t month, int32_t day); -#endif }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/cpdtrans.cpp b/deps/icu-small/source/i18n/cpdtrans.cpp index 9b103646891f99..99643da07eb91c 100644 --- a/deps/icu-small/source/i18n/cpdtrans.cpp +++ b/deps/icu-small/source/i18n/cpdtrans.cpp @@ -53,7 +53,7 @@ CompoundTransliterator::CompoundTransliterator( int32_t transliteratorCount, UnicodeFilter* adoptedFilter) : Transliterator(joinIDs(transliterators, transliteratorCount), adoptedFilter), - trans(0), count(0), numAnonymousRBTs(0) { + trans(nullptr), count(0), numAnonymousRBTs(0) { setTransliterators(transliterators, transliteratorCount); } @@ -70,7 +70,7 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(id, adoptedFilter), - trans(0), numAnonymousRBTs(0) { + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... init(id, direction, true, status); @@ -79,8 +79,8 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, UParseError& /*parseError*/, UErrorCode& status) : - Transliterator(id, 0), // set filter to 0 here! - trans(0), numAnonymousRBTs(0) { + Transliterator(id, nullptr), // set filter to 0 here! + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... init(id, UTRANS_FORWARD, true, status); @@ -97,7 +97,7 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& newID, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(newID, adoptedFilter), - trans(0), numAnonymousRBTs(anonymousRBTs) + trans(nullptr), numAnonymousRBTs(anonymousRBTs) { init(list, UTRANS_FORWARD, false, status); } @@ -111,7 +111,7 @@ CompoundTransliterator::CompoundTransliterator(UVector& list, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(UnicodeString(), nullptr), - trans(0), numAnonymousRBTs(0) + trans(nullptr), numAnonymousRBTs(0) { // TODO add code for parseError...currently unused, but // later may be used by parsing code... @@ -124,7 +124,7 @@ CompoundTransliterator::CompoundTransliterator(UVector& list, UParseError& /*parseError*/, UErrorCode& status) : Transliterator(UnicodeString(), nullptr), - trans(0), numAnonymousRBTs(anonymousRBTs) + trans(nullptr), numAnonymousRBTs(anonymousRBTs) { init(list, UTRANS_FORWARD, false, status); } @@ -196,15 +196,15 @@ void CompoundTransliterator::init(UVector& list, // Allocate array if (U_SUCCESS(status)) { count = list.size(); - trans = (Transliterator **)uprv_malloc(count * sizeof(Transliterator *)); + trans = static_cast<Transliterator**>(uprv_malloc(count * sizeof(Transliterator*))); /* test for nullptr */ - if (trans == 0) { + if (trans == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } } - if (U_FAILURE(status) || trans == 0) { + if (U_FAILURE(status) || trans == nullptr) { // assert(trans == 0); return; } @@ -214,7 +214,7 @@ void CompoundTransliterator::init(UVector& list, int32_t i; for (i=0; i<count; ++i) { int32_t j = (direction == UTRANS_FORWARD) ? i : count - 1 - i; - trans[i] = (Transliterator*) list.elementAt(j); + trans[i] = static_cast<Transliterator*>(list.elementAt(j)); } // If the direction is UTRANS_REVERSE then we may need to fix the @@ -254,7 +254,7 @@ UnicodeString CompoundTransliterator::joinIDs(Transliterator* const transliterat * Copy constructor. */ CompoundTransliterator::CompoundTransliterator(const CompoundTransliterator& t) : - Transliterator(t), trans(0), count(0), numAnonymousRBTs(-1) { + Transliterator(t), trans(nullptr), count(0), numAnonymousRBTs(-1) { *this = t; } @@ -266,13 +266,13 @@ CompoundTransliterator::~CompoundTransliterator() { } void CompoundTransliterator::freeTransliterators() { - if (trans != 0) { + if (trans != nullptr) { for (int32_t i=0; i<count; ++i) { delete trans[i]; } uprv_free(trans); } - trans = 0; + trans = nullptr; count = 0; } @@ -289,14 +289,14 @@ CompoundTransliterator& CompoundTransliterator::operator=( if (trans != nullptr) { for (i=0; i<count; ++i) { delete trans[i]; - trans[i] = 0; + trans[i] = nullptr; } } if (t.count > count) { if (trans != nullptr) { uprv_free(trans); } - trans = (Transliterator **)uprv_malloc(t.count * sizeof(Transliterator *)); + trans = static_cast<Transliterator**>(uprv_malloc(t.count * sizeof(Transliterator*))); } count = t.count; if (trans != nullptr) { @@ -347,7 +347,7 @@ const Transliterator& CompoundTransliterator::getTransliterator(int32_t index) c void CompoundTransliterator::setTransliterators(Transliterator* const transliterators[], int32_t transCount) { - Transliterator** a = (Transliterator **)uprv_malloc(transCount * sizeof(Transliterator *)); + Transliterator** a = static_cast<Transliterator**>(uprv_malloc(transCount * sizeof(Transliterator*))); if (a == nullptr) { return; } diff --git a/deps/icu-small/source/i18n/cpdtrans.h b/deps/icu-small/source/i18n/cpdtrans.h index a27c617c95b83c..b01c2df6ac6d3a 100644 --- a/deps/icu-small/source/i18n/cpdtrans.h +++ b/deps/icu-small/source/i18n/cpdtrans.h @@ -63,7 +63,7 @@ class U_I18N_API CompoundTransliterator : public Transliterator { */ CompoundTransliterator(Transliterator* const transliterators[], int32_t transliteratorCount, - UnicodeFilter* adoptedFilter = 0); + UnicodeFilter* adoptedFilter = nullptr); /** * Constructs a new compound transliterator. diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 16004f9f5d58fb..cedc3c06349038 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -162,7 +162,7 @@ CharsetDetector::CharsetDetector(UErrorCode &status) return; } - resultArray = (CharsetMatch **)uprv_malloc(sizeof(CharsetMatch *)*fCSRecognizers_size); + resultArray = static_cast<CharsetMatch**>(uprv_malloc(sizeof(CharsetMatch*) * fCSRecognizers_size)); if (resultArray == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -443,47 +443,47 @@ UEnumeration * CharsetDetector::getAllDetectableCharsets(UErrorCode &status) setRecognizers(status); if(U_FAILURE(status)) { - return 0; + return nullptr; } UEnumeration *en = NEW_ARRAY(UEnumeration, 1); if (en == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } memcpy(en, &gCSDetEnumeration, sizeof(UEnumeration)); en->context = (void*)NEW_ARRAY(Context, 1); if (en->context == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; DELETE_ARRAY(en); - return 0; + return nullptr; } uprv_memset(en->context, 0, sizeof(Context)); - ((Context*)en->context)->all = true; + static_cast<Context*>(en->context)->all = true; return en; } UEnumeration * CharsetDetector::getDetectableCharsets(UErrorCode &status) const { if(U_FAILURE(status)) { - return 0; + return nullptr; } UEnumeration *en = NEW_ARRAY(UEnumeration, 1); if (en == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } memcpy(en, &gCSDetEnumeration, sizeof(UEnumeration)); en->context = (void*)NEW_ARRAY(Context, 1); if (en->context == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; DELETE_ARRAY(en); - return 0; + return nullptr; } uprv_memset(en->context, 0, sizeof(Context)); - ((Context*)en->context)->all = false; - ((Context*)en->context)->enabledRecognizers = fEnabledRecognizers; + static_cast<Context*>(en->context)->all = false; + static_cast<Context*>(en->context)->enabledRecognizers = fEnabledRecognizers; return en; } diff --git a/deps/icu-small/source/i18n/csmatch.cpp b/deps/icu-small/source/i18n/csmatch.cpp index 4c5f73b31b0387..35a84c76f28284 100644 --- a/deps/icu-small/source/i18n/csmatch.cpp +++ b/deps/icu-small/source/i18n/csmatch.cpp @@ -61,7 +61,7 @@ int32_t CharsetMatch::getConfidence()const int32_t CharsetMatch::getUChars(char16_t *buf, int32_t cap, UErrorCode *status) const { UConverter *conv = ucnv_open(getName(), status); - int32_t result = ucnv_toUChars(conv, buf, cap, (const char *) textIn->fRawInput, textIn->fRawLength, status); + int32_t result = ucnv_toUChars(conv, buf, cap, reinterpret_cast<const char*>(textIn->fRawInput), textIn->fRawLength, status); ucnv_close(conv); diff --git a/deps/icu-small/source/i18n/csr2022.cpp b/deps/icu-small/source/i18n/csr2022.cpp index e064c426a2a26c..9de668a8a07dac 100644 --- a/deps/icu-small/source/i18n/csr2022.cpp +++ b/deps/icu-small/source/i18n/csr2022.cpp @@ -46,7 +46,7 @@ int32_t CharsetRecog_2022::match_2022(const uint8_t *text, int32_t textLen, cons escN = 0; while(escN < escapeSequences_length) { const uint8_t *seq = escapeSequences[escN]; - int32_t seq_length = (int32_t)uprv_strlen((const char *) seq); + int32_t seq_length = static_cast<int32_t>(uprv_strlen((const char*)seq)); if (textLen-i >= seq_length) { j = 1; diff --git a/deps/icu-small/source/i18n/csrecog.h b/deps/icu-small/source/i18n/csrecog.h index 944a5007fe5f9a..1aa941d5db6d3e 100644 --- a/deps/icu-small/source/i18n/csrecog.h +++ b/deps/icu-small/source/i18n/csrecog.h @@ -43,7 +43,7 @@ class CharsetRecognizer : public UMemory * Try the given input text against this Charset, and fill in the results object * with the quality of the match plus other information related to the match. * - * Return true if the the input bytes are a potential match, and + * Return true if the input bytes are a potential match, and * false if the input data is not compatible with, or illegal in this charset. */ virtual UBool match(InputText *textIn, CharsetMatch *results) const = 0; diff --git a/deps/icu-small/source/i18n/csrmbcs.cpp b/deps/icu-small/source/i18n/csrmbcs.cpp index ec346b5fb3f4c4..cb78a3433b2a7e 100644 --- a/deps/icu-small/source/i18n/csrmbcs.cpp +++ b/deps/icu-small/source/i18n/csrmbcs.cpp @@ -162,7 +162,7 @@ int32_t CharsetRecog_mbcs::match_mbcs(InputText *det, const uint16_t commonChars if (iter.charValue > 0xFF) { doubleByteCharCount++; - if (commonChars != 0) { + if (commonChars != nullptr) { if (binarySearch(commonChars, commonCharsLen, static_cast<uint16_t>(iter.charValue)) >= 0){ commonCharCount += 1; } @@ -205,7 +205,7 @@ int32_t CharsetRecog_mbcs::match_mbcs(InputText *det, const uint16_t commonChars return confidence; } - if (commonChars == 0) { + if (commonChars == nullptr) { // We have no statistics on frequently occurring characters. // Assess confidence purely on having a reasonable number of // multi-byte characters (the more the better) @@ -219,9 +219,9 @@ int32_t CharsetRecog_mbcs::match_mbcs(InputText *det, const uint16_t commonChars // Frequency of occurrence statistics exist. // - double maxVal = log((double)doubleByteCharCount / 4); /*(float)?*/ + double maxVal = log(static_cast<double>(doubleByteCharCount) / 4); /*(float)?*/ double scaleFactor = 90.0 / maxVal; - confidence = (int32_t)(log((double)commonCharCount+1) * scaleFactor + 10.0); + confidence = static_cast<int32_t>(log(static_cast<double>(commonCharCount) + 1) * scaleFactor + 10.0); confidence = min(confidence, 100); } diff --git a/deps/icu-small/source/i18n/csrsbcs.cpp b/deps/icu-small/source/i18n/csrsbcs.cpp index 92af9b5291b9ff..de2ad314b02646 100644 --- a/deps/icu-small/source/i18n/csrsbcs.cpp +++ b/deps/icu-small/source/i18n/csrsbcs.cpp @@ -127,7 +127,7 @@ int32_t NGramParser::parse(InputText *det) // TODO: Is this OK? The buffer could have ended in the middle of a word... addByte(0x20); - double rawPercent = (double) hitCount / (double) ngramCount; + double rawPercent = static_cast<double>(hitCount) / static_cast<double>(ngramCount); // if (rawPercent <= 2.0) { // return 0; @@ -139,7 +139,7 @@ int32_t NGramParser::parse(InputText *det) return 98; } - return (int32_t) (rawPercent * 300.0); + return static_cast<int32_t>(rawPercent * 300.0); } #if !UCONFIG_ONLY_HTML_CONVERSION diff --git a/deps/icu-small/source/i18n/currpinf.cpp b/deps/icu-small/source/i18n/currpinf.cpp index 7c5adaaf7c39f4..6f43ecb2fedfbe 100644 --- a/deps/icu-small/source/i18n/currpinf.cpp +++ b/deps/icu-small/source/i18n/currpinf.cpp @@ -185,12 +185,12 @@ UnicodeString& CurrencyPluralInfo::getCurrencyPluralPattern(const UnicodeString& pluralCount, UnicodeString& result) const { const UnicodeString* currencyPluralPattern = - (UnicodeString*)fPluralCountToCurrencyUnitPattern->get(pluralCount); + static_cast<UnicodeString*>(fPluralCountToCurrencyUnitPattern->get(pluralCount)); if (currencyPluralPattern == nullptr) { // fall back to "other" if (pluralCount.compare(gPluralCountOther, 5)) { currencyPluralPattern = - (UnicodeString*)fPluralCountToCurrencyUnitPattern->get(UnicodeString(true, gPluralCountOther, 5)); + static_cast<UnicodeString*>(fPluralCountToCurrencyUnitPattern->get(UnicodeString(true, gPluralCountOther, 5))); } if (currencyPluralPattern == nullptr) { // no currencyUnitPatterns defined, @@ -388,7 +388,7 @@ CurrencyPluralInfo::deleteHash(Hashtable* hTable) { const UHashElement* element = nullptr; while ( (element = hTable->nextElement(pos)) != nullptr ) { const UHashTok valueTok = element->value; - const UnicodeString* value = (UnicodeString*)valueTok.pointer; + const UnicodeString* value = static_cast<UnicodeString*>(valueTok.pointer); delete value; } delete hTable; @@ -420,9 +420,9 @@ CurrencyPluralInfo::copyHash(const Hashtable* source, if (source) { while ( (element = source->nextElement(pos)) != nullptr ) { const UHashTok keyTok = element->key; - const UnicodeString* key = (UnicodeString*)keyTok.pointer; + const UnicodeString* key = static_cast<UnicodeString*>(keyTok.pointer); const UHashTok valueTok = element->value; - const UnicodeString* value = (UnicodeString*)valueTok.pointer; + const UnicodeString* value = static_cast<UnicodeString*>(valueTok.pointer); LocalPointer<UnicodeString> copy(new UnicodeString(*value), status); if (U_FAILURE(status)) { return; diff --git a/deps/icu-small/source/i18n/dangical.cpp b/deps/icu-small/source/i18n/dangical.cpp index 2b340ee4b4545c..2745bf9a0b64fb 100644 --- a/deps/icu-small/source/i18n/dangical.cpp +++ b/deps/icu-small/source/i18n/dangical.cpp @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING +#include "astro.h" // CalendarCache #include "gregoimp.h" // Math #include "uassert.h" #include "ucln_in.h" @@ -23,22 +24,30 @@ #include "unicode/tzrule.h" // --- The cache -- -static icu::TimeZone *gDangiCalendarZoneAstroCalc = nullptr; -static icu::UInitOnce gDangiCalendarInitOnce {}; +// Lazy Creation & Access synchronized by class CalendarCache with a mutex. +static icu::CalendarCache *gWinterSolsticeCache = nullptr; +static icu::CalendarCache *gNewYearCache = nullptr; -/** - * The start year of the Korean traditional calendar (Dan-gi) is the inaugural - * year of Dan-gun (BC 2333). - */ -static const int32_t DANGI_EPOCH_YEAR = -2332; // Gregorian year +// gAstronomerTimeZone +static icu::TimeZone *gAstronomerTimeZone = nullptr; +static icu::UInitOnce gAstronomerTimeZoneInitOnce {}; U_CDECL_BEGIN static UBool calendar_dangi_cleanup() { - if (gDangiCalendarZoneAstroCalc) { - delete gDangiCalendarZoneAstroCalc; - gDangiCalendarZoneAstroCalc = nullptr; + if (gWinterSolsticeCache) { + delete gWinterSolsticeCache; + gWinterSolsticeCache = nullptr; } - gDangiCalendarInitOnce.reset(); + if (gNewYearCache) { + delete gNewYearCache; + gNewYearCache = nullptr; + } + + if (gAstronomerTimeZone) { + delete gAstronomerTimeZone; + gAstronomerTimeZone = nullptr; + } + gAstronomerTimeZoneInitOnce.reset(); return true; } U_CDECL_END @@ -51,8 +60,10 @@ U_NAMESPACE_BEGIN // Constructors... //------------------------------------------------------------------------- +const TimeZone* getAstronomerTimeZone(UErrorCode &status); + DangiCalendar::DangiCalendar(const Locale& aLocale, UErrorCode& success) -: ChineseCalendar(aLocale, DANGI_EPOCH_YEAR, getDangiCalZoneAstroCalc(success), success) +: ChineseCalendar(aLocale, success) { } @@ -103,11 +114,11 @@ const char *DangiCalendar::getType() const { * 1898-1911: GMT+8 * 1912- : GMT+9 */ -static void U_CALLCONV initDangiCalZoneAstroCalc(UErrorCode &status) { - U_ASSERT(gDangiCalendarZoneAstroCalc == nullptr); - const UDate millis1897[] = { (UDate)((1897 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here - const UDate millis1898[] = { (UDate)((1898 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here - const UDate millis1912[] = { (UDate)((1912 - 1970) * 365 * kOneDay) }; // this doesn't create an issue for 1911/12/20 +static void U_CALLCONV initAstronomerTimeZone(UErrorCode &status) { + U_ASSERT(gAstronomerTimeZone == nullptr); + const UDate millis1897[] = { static_cast<UDate>((1897 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here + const UDate millis1898[] = { static_cast<UDate>((1898 - 1970) * 365 * kOneDay) }; // some days of error is not a problem here + const UDate millis1912[] = { static_cast<UDate>((1912 - 1970) * 365 * kOneDay) }; // this doesn't create an issue for 1911/12/20 LocalPointer<InitialTimeZoneRule> initialTimeZone(new InitialTimeZoneRule( UnicodeString(u"GMT+8"), 8*kOneHour, 0), status); @@ -120,45 +131,34 @@ static void U_CALLCONV initDangiCalZoneAstroCalc(UErrorCode &status) { LocalPointer<TimeZoneRule> ruleFrom1912(new TimeArrayTimeZoneRule( UnicodeString(u"Korean 1912-"), 9*kOneHour, 0, millis1912, 1, DateTimeRule::STANDARD_TIME), status); - LocalPointer<RuleBasedTimeZone> dangiCalZoneAstroCalc(new RuleBasedTimeZone( + LocalPointer<RuleBasedTimeZone> zone(new RuleBasedTimeZone( UnicodeString(u"KOREA_ZONE"), initialTimeZone.orphan()), status); // adopts initialTimeZone if (U_FAILURE(status)) { return; } - dangiCalZoneAstroCalc->addTransitionRule(rule1897.orphan(), status); // adopts rule1897 - dangiCalZoneAstroCalc->addTransitionRule(rule1898to1911.orphan(), status); - dangiCalZoneAstroCalc->addTransitionRule(ruleFrom1912.orphan(), status); - dangiCalZoneAstroCalc->complete(status); + zone->addTransitionRule(rule1897.orphan(), status); // adopts rule1897 + zone->addTransitionRule(rule1898to1911.orphan(), status); + zone->addTransitionRule(ruleFrom1912.orphan(), status); + zone->complete(status); if (U_SUCCESS(status)) { - gDangiCalendarZoneAstroCalc = dangiCalZoneAstroCalc.orphan(); + gAstronomerTimeZone = zone.orphan(); } ucln_i18n_registerCleanup(UCLN_I18N_DANGI_CALENDAR, calendar_dangi_cleanup); } -const TimeZone* DangiCalendar::getDangiCalZoneAstroCalc(UErrorCode &status) const { - umtx_initOnce(gDangiCalendarInitOnce, &initDangiCalZoneAstroCalc, status); - return gDangiCalendarZoneAstroCalc; -} - -constexpr uint32_t kDangiRelatedYearDiff = -2333; - -int32_t DangiCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { - return 0; - } - return year + kDangiRelatedYearDiff; +const TimeZone* getAstronomerTimeZone(UErrorCode &status) { + umtx_initOnce(gAstronomerTimeZoneInitOnce, &initAstronomerTimeZone, status); + return gAstronomerTimeZone; } -void DangiCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kDangiRelatedYearDiff); +ChineseCalendar::Setting DangiCalendar::getSetting(UErrorCode& status) const { + return { + getAstronomerTimeZone(status), + &gWinterSolsticeCache, &gNewYearCache + }; } - UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DangiCalendar) U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dangical.h b/deps/icu-small/source/i18n/dangical.h index 3e5b0bb859b2a1..e993ef39c13f4f 100644 --- a/deps/icu-small/source/i18n/dangical.h +++ b/deps/icu-small/source/i18n/dangical.h @@ -68,28 +68,8 @@ class DangiCalendar : public ChineseCalendar { */ virtual DangiCalendar* clone() const override; - //---------------------------------------------------------------------- - // Internal methods & astronomical calculations - //---------------------------------------------------------------------- - - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - private: - const TimeZone* getDangiCalZoneAstroCalc(UErrorCode &status) const; - // UObject stuff public: /** @@ -120,6 +100,8 @@ class DangiCalendar : public ChineseCalendar { */ const char * getType() const override; + protected: + virtual Setting getSetting(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 029634e3dcbb75..de9efc7ca8f971 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -28,6 +28,7 @@ #include "unicode/smpdtfmt.h" #include "unicode/dtptngen.h" #include "unicode/udisplaycontext.h" +#include "unicode/gregocal.h" #include "reldtfmt.h" #include "sharedobject.h" #include "unifiedcache.h" @@ -39,6 +40,7 @@ #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include <stdio.h> #endif +#include <typeinfo> // ***************************************************************************** // class DateFormat @@ -88,7 +90,7 @@ class DateFmtBestPatternKey : public LocaleCacheKey<DateFmtBestPattern> { fSkeleton(other.fSkeleton) { } virtual ~DateFmtBestPatternKey(); virtual int32_t hashCode() const override { - return (int32_t)(37u * (uint32_t)LocaleCacheKey<DateFmtBestPattern>::hashCode() + (uint32_t)fSkeleton.hashCode()); + return static_cast<int32_t>(37u * static_cast<uint32_t>(LocaleCacheKey<DateFmtBestPattern>::hashCode()) + static_cast<uint32_t>(fSkeleton.hashCode())); } inline bool operator==(const DateFmtBestPatternKey &other) const { return fSkeleton == other.fSkeleton; @@ -121,8 +123,8 @@ DateFmtBestPatternKey::~DateFmtBestPatternKey() { } DateFormat::DateFormat() -: fCalendar(0), - fNumberFormat(0), +: fCalendar(nullptr), + fNumberFormat(nullptr), fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE) { } @@ -131,8 +133,8 @@ DateFormat::DateFormat() DateFormat::DateFormat(const DateFormat& other) : Format(other), - fCalendar(0), - fNumberFormat(0), + fCalendar(nullptr), + fNumberFormat(nullptr), fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE) { *this = other; @@ -206,10 +208,10 @@ DateFormat::format(const Formattable& obj, date = obj.getDate(); break; case Formattable::kDouble: - date = (UDate)obj.getDouble(); + date = static_cast<UDate>(obj.getDouble()); break; case Formattable::kLong: - date = (UDate)obj.getLong(); + date = static_cast<UDate>(obj.getLong()); break; default: status = U_ILLEGAL_ARGUMENT_ERROR; @@ -241,10 +243,10 @@ DateFormat::format(const Formattable& obj, date = obj.getDate(); break; case Formattable::kDouble: - date = (UDate)obj.getDouble(); + date = static_cast<UDate>(obj.getDouble()); break; case Formattable::kLong: - date = (UDate)obj.getLong(); + date = static_cast<UDate>(obj.getLong()); break; default: status = U_ILLEGAL_ARGUMENT_ERROR; @@ -277,15 +279,24 @@ DateFormat::format(Calendar& /* unused cal */, UnicodeString& DateFormat::format(UDate date, UnicodeString& appendTo, FieldPosition& fieldPosition) const { if (fCalendar != nullptr) { - // Use a clone of our calendar instance - Calendar* calClone = fCalendar->clone(); - if (calClone != nullptr) { - UErrorCode ec = U_ZERO_ERROR; - calClone->setTime(date, ec); + UErrorCode ec = U_ZERO_ERROR; + // Avoid a heap allocation and corresponding free for the common case + if (typeid(*fCalendar) == typeid(GregorianCalendar)) { + GregorianCalendar cal(*static_cast<GregorianCalendar*>(fCalendar)); + cal.setTime(date, ec); if (U_SUCCESS(ec)) { - format(*calClone, appendTo, fieldPosition); + format(cal, appendTo, fieldPosition); + } + } else { + // Use a clone of our calendar instance + Calendar *calClone = fCalendar->clone(); + if (calClone != nullptr) { + calClone->setTime(date, ec); + if (U_SUCCESS(ec)) { + format(*calClone, appendTo, fieldPosition); + } + delete calClone; } - delete calClone; } } return appendTo; @@ -297,13 +308,23 @@ UnicodeString& DateFormat::format(UDate date, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { if (fCalendar != nullptr) { - Calendar* calClone = fCalendar->clone(); - if (calClone != nullptr) { - calClone->setTime(date, status); - if (U_SUCCESS(status)) { - format(*calClone, appendTo, posIter, status); + UErrorCode ec = U_ZERO_ERROR; + // Avoid a heap allocation and corresponding free for the common case + if (typeid(*fCalendar) == typeid(GregorianCalendar)) { + GregorianCalendar cal(*static_cast<GregorianCalendar*>(fCalendar)); + cal.setTime(date, ec); + if (U_SUCCESS(ec)) { + format(cal, appendTo, posIter, status); + } + } else { + Calendar* calClone = fCalendar->clone(); + if (calClone != nullptr) { + calClone->setTime(date, status); + if (U_SUCCESS(status)) { + format(*calClone, appendTo, posIter, status); + } + delete calClone; } - delete calClone; } } return appendTo; @@ -408,7 +429,7 @@ DateFormat::createDateTimeInstance(EStyle dateStyle, { if(dateStyle != kNone) { - dateStyle = (EStyle) (dateStyle + kDateOffset); + dateStyle = static_cast<EStyle>(dateStyle + kDateOffset); } return create(timeStyle, dateStyle, aLocale); } @@ -430,13 +451,13 @@ DateFormat::getBestPattern( UErrorCode &status) { UnifiedCache *cache = UnifiedCache::getInstance(status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } DateFmtBestPatternKey key(locale, skeleton, status); const DateFmtBestPattern *patternPtr = nullptr; cache->get(key, patternPtr, status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } UnicodeString result(patternPtr->fPattern); patternPtr->removeRef(); @@ -518,7 +539,7 @@ DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) // is it relative? if(/*((timeStyle!=UDAT_NONE)&&(timeStyle & UDAT_RELATIVE)) || */((dateStyle!=kNone)&&((dateStyle-kDateOffset) & UDAT_RELATIVE))) { - RelativeDateFormat *r = new RelativeDateFormat((UDateFormatStyle)timeStyle, (UDateFormatStyle)(dateStyle-kDateOffset), locale, status); + RelativeDateFormat* r = new RelativeDateFormat(static_cast<UDateFormatStyle>(timeStyle), static_cast<UDateFormatStyle>(dateStyle - kDateOffset), locale, status); if(U_SUCCESS(status)) return r; delete r; status = U_ZERO_ERROR; @@ -539,7 +560,7 @@ DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) // This should never really happen, because the preceding constructor // should always succeed. If the resource data is unavailable, a last // resort object should be returned. - return 0; + return nullptr; } //---------------------------------------------------------------------- @@ -697,7 +718,7 @@ void DateFormat::setContext(UDisplayContext value, UErrorCode& status) { if (U_FAILURE(status)) return; - if ( (UDisplayContextType)((uint32_t)value >> 8) == UDISPCTX_TYPE_CAPITALIZATION ) { + if (static_cast<UDisplayContextType>(static_cast<uint32_t>(value) >> 8) == UDISPCTX_TYPE_CAPITALIZATION) { fCapitalizationContext = value; } else { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -711,10 +732,10 @@ void DateFormat::setContext(UDisplayContext value, UErrorCode& status) UDisplayContext DateFormat::getContext(UDisplayContextType type, UErrorCode& status) const { if (U_FAILURE(status)) - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); if (type != UDISPCTX_TYPE_CAPITALIZATION) { status = U_ILLEGAL_ARGUMENT_ERROR; - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); } return fCapitalizationContext; } @@ -741,7 +762,7 @@ DateFormat::setBooleanAttribute(UDateFormatBooleanAttribute attr, UBool DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/*status*/) const { - return static_cast<UBool>(fBoolFlags.get(attr)); + return fBoolFlags.get(attr); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index 294390cce2bcb4..ea5e51eb9d519c 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -14,7 +14,6 @@ #include "dayperiodrules.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cstring.h" #include "ucln_in.h" @@ -361,9 +360,7 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo while (*name != '\0') { ruleSetNum = uhash_geti(data->localeToRuleSetNumMap, name); if (ruleSetNum == 0) { - CharString parent; - CharStringByteSink sink(&parent); - ulocimp_getParent(name, sink, &errorCode); + CharString parent = ulocimp_getParent(name, errorCode); if (parent.isEmpty()) { // Saves a lookup in the hash table. break; diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index ac1f777399ad30..b82a9587328cb3 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -117,8 +117,10 @@ DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, const NumberingSys } DecimalFormatSymbols::DecimalFormatSymbols() - : UObject(), locale(Locale::getRoot()) { - *validLocale = *actualLocale = 0; + : UObject(), + locale(Locale::getRoot()), + actualLocale(Locale::getRoot()), + validLocale(Locale::getRoot()) { initialize(); } @@ -154,17 +156,17 @@ DecimalFormatSymbols& DecimalFormatSymbols::operator=(const DecimalFormatSymbols& rhs) { if (this != &rhs) { - for(int32_t i = 0; i < (int32_t)kFormatSymbolCount; ++i) { + for (int32_t i = 0; i < static_cast<int32_t>(kFormatSymbolCount); ++i) { // fastCopyFrom is safe, see docs on fSymbols - fSymbols[(ENumberFormatSymbol)i].fastCopyFrom(rhs.fSymbols[(ENumberFormatSymbol)i]); + fSymbols[static_cast<ENumberFormatSymbol>(i)].fastCopyFrom(rhs.fSymbols[static_cast<ENumberFormatSymbol>(i)]); } - for(int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; ++i) { + for (int32_t i = 0; i < static_cast<int32_t>(UNUM_CURRENCY_SPACING_COUNT); ++i) { currencySpcBeforeSym[i].fastCopyFrom(rhs.currencySpcBeforeSym[i]); currencySpcAfterSym[i].fastCopyFrom(rhs.currencySpcAfterSym[i]); } locale = rhs.locale; - uprv_strcpy(validLocale, rhs.validLocale); - uprv_strcpy(actualLocale, rhs.actualLocale); + actualLocale = rhs.actualLocale; + validLocale = rhs.validLocale; fIsCustomCurrencySymbol = rhs.fIsCustomCurrencySymbol; fIsCustomIntlCurrencySymbol = rhs.fIsCustomIntlCurrencySymbol; fCodePointZero = rhs.fCodePointZero; @@ -188,12 +190,12 @@ DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const if (fIsCustomIntlCurrencySymbol != that.fIsCustomIntlCurrencySymbol) { return false; } - for(int32_t i = 0; i < (int32_t)kFormatSymbolCount; ++i) { - if(fSymbols[(ENumberFormatSymbol)i] != that.fSymbols[(ENumberFormatSymbol)i]) { + for (int32_t i = 0; i < static_cast<int32_t>(kFormatSymbolCount); ++i) { + if (fSymbols[static_cast<ENumberFormatSymbol>(i)] != that.fSymbols[static_cast<ENumberFormatSymbol>(i)]) { return false; } } - for(int32_t i = 0; i < (int32_t)UNUM_CURRENCY_SPACING_COUNT; ++i) { + for (int32_t i = 0; i < static_cast<int32_t>(UNUM_CURRENCY_SPACING_COUNT); ++i) { if(currencySpcBeforeSym[i] != that.currencySpcBeforeSym[i]) { return false; } @@ -203,8 +205,8 @@ DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const } // No need to check fCodePointZero since it is based on fSymbols return locale == that.locale && - uprv_strcmp(validLocale, that.validLocale) == 0 && - uprv_strcmp(actualLocale, that.actualLocale) == 0; + actualLocale == that.actualLocale && + validLocale == that.validLocale; } // ------------------------------------- @@ -242,7 +244,7 @@ struct DecFmtSymDataSink : public ResourceSink { if (!seenSymbol[i]) { seenSymbol[i] = true; dfs.setSymbol( - (DecimalFormatSymbols::ENumberFormatSymbol) i, + static_cast<DecimalFormatSymbols::ENumberFormatSymbol>(i), value.getUnicodeString(errorCode)); if (U_FAILURE(errorCode)) { return; } } @@ -331,11 +333,11 @@ struct CurrencySpacingSink : public ResourceSink { static const char* defaults[] = { "[:letter:]", "[:digit:]", " " }; if (!hasBeforeCurrency || !hasAfterCurrency) { for (int32_t pattern = 0; pattern < UNUM_CURRENCY_SPACING_COUNT; pattern++) { - dfs.setPatternForCurrencySpacing((UCurrencySpacing)pattern, + dfs.setPatternForCurrencySpacing(static_cast<UCurrencySpacing>(pattern), false, UnicodeString(defaults[pattern], -1, US_INV)); } for (int32_t pattern = 0; pattern < UNUM_CURRENCY_SPACING_COUNT; pattern++) { - dfs.setPatternForCurrencySpacing((UCurrencySpacing)pattern, + dfs.setPatternForCurrencySpacing(static_cast<UCurrencySpacing>(pattern), true, UnicodeString(defaults[pattern], -1, US_INV)); } } @@ -353,7 +355,6 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData, const NumberingSystem* ns) { if (U_FAILURE(status)) { return; } - *validLocale = *actualLocale = 0; // First initialize all the symbols to the fallbacks for anything we can't find initialize(); @@ -402,14 +403,10 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, // Set locale IDs // TODO: Is there a way to do this without depending on the resource bundle instance? - U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs( - ures_getLocaleByType( - numberElementsRes.getAlias(), - ULOC_VALID_LOCALE, &status), - ures_getLocaleByType( - numberElementsRes.getAlias(), - ULOC_ACTUAL_LOCALE, &status)); + actualLocale = Locale( + ures_getLocaleByType(numberElementsRes.getAlias(), ULOC_ACTUAL_LOCALE, &status)); + validLocale = Locale( + ures_getLocaleByType(numberElementsRes.getAlias(), ULOC_VALID_LOCALE, &status)); // Now load the rest of the data from the data sink. // Start with loading this nsName if it is not Latin. @@ -485,34 +482,34 @@ DecimalFormatSymbols::initialize() { * cannot initialize a static array with class constructors. * markus 2000may25 */ - fSymbols[kDecimalSeparatorSymbol] = (char16_t)0x2e; // '.' decimal separator + fSymbols[kDecimalSeparatorSymbol] = static_cast<char16_t>(0x2e); // '.' decimal separator fSymbols[kGroupingSeparatorSymbol].remove(); // group (thousands) separator - fSymbols[kPatternSeparatorSymbol] = (char16_t)0x3b; // ';' pattern separator - fSymbols[kPercentSymbol] = (char16_t)0x25; // '%' percent sign - fSymbols[kZeroDigitSymbol] = (char16_t)0x30; // '0' native 0 digit - fSymbols[kOneDigitSymbol] = (char16_t)0x31; // '1' native 1 digit - fSymbols[kTwoDigitSymbol] = (char16_t)0x32; // '2' native 2 digit - fSymbols[kThreeDigitSymbol] = (char16_t)0x33; // '3' native 3 digit - fSymbols[kFourDigitSymbol] = (char16_t)0x34; // '4' native 4 digit - fSymbols[kFiveDigitSymbol] = (char16_t)0x35; // '5' native 5 digit - fSymbols[kSixDigitSymbol] = (char16_t)0x36; // '6' native 6 digit - fSymbols[kSevenDigitSymbol] = (char16_t)0x37; // '7' native 7 digit - fSymbols[kEightDigitSymbol] = (char16_t)0x38; // '8' native 8 digit - fSymbols[kNineDigitSymbol] = (char16_t)0x39; // '9' native 9 digit - fSymbols[kDigitSymbol] = (char16_t)0x23; // '#' pattern digit - fSymbols[kPlusSignSymbol] = (char16_t)0x002b; // '+' plus sign - fSymbols[kMinusSignSymbol] = (char16_t)0x2d; // '-' minus sign - fSymbols[kCurrencySymbol] = (char16_t)0xa4; // 'OX' currency symbol + fSymbols[kPatternSeparatorSymbol] = static_cast<char16_t>(0x3b); // ';' pattern separator + fSymbols[kPercentSymbol] = static_cast<char16_t>(0x25); // '%' percent sign + fSymbols[kZeroDigitSymbol] = static_cast<char16_t>(0x30); // '0' native 0 digit + fSymbols[kOneDigitSymbol] = static_cast<char16_t>(0x31); // '1' native 1 digit + fSymbols[kTwoDigitSymbol] = static_cast<char16_t>(0x32); // '2' native 2 digit + fSymbols[kThreeDigitSymbol] = static_cast<char16_t>(0x33); // '3' native 3 digit + fSymbols[kFourDigitSymbol] = static_cast<char16_t>(0x34); // '4' native 4 digit + fSymbols[kFiveDigitSymbol] = static_cast<char16_t>(0x35); // '5' native 5 digit + fSymbols[kSixDigitSymbol] = static_cast<char16_t>(0x36); // '6' native 6 digit + fSymbols[kSevenDigitSymbol] = static_cast<char16_t>(0x37); // '7' native 7 digit + fSymbols[kEightDigitSymbol] = static_cast<char16_t>(0x38); // '8' native 8 digit + fSymbols[kNineDigitSymbol] = static_cast<char16_t>(0x39); // '9' native 9 digit + fSymbols[kDigitSymbol] = static_cast<char16_t>(0x23); // '#' pattern digit + fSymbols[kPlusSignSymbol] = static_cast<char16_t>(0x002b); // '+' plus sign + fSymbols[kMinusSignSymbol] = static_cast<char16_t>(0x2d); // '-' minus sign + fSymbols[kCurrencySymbol] = static_cast<char16_t>(0xa4); // 'OX' currency symbol fSymbols[kIntlCurrencySymbol].setTo(true, INTL_CURRENCY_SYMBOL_STR, 2); - fSymbols[kMonetarySeparatorSymbol] = (char16_t)0x2e; // '.' monetary decimal separator - fSymbols[kExponentialSymbol] = (char16_t)0x45; // 'E' exponential - fSymbols[kPerMillSymbol] = (char16_t)0x2030; // '%o' per mill - fSymbols[kPadEscapeSymbol] = (char16_t)0x2a; // '*' pad escape symbol - fSymbols[kInfinitySymbol] = (char16_t)0x221e; // 'oo' infinite - fSymbols[kNaNSymbol] = (char16_t)0xfffd; // SUB NaN - fSymbols[kSignificantDigitSymbol] = (char16_t)0x0040; // '@' significant digit + fSymbols[kMonetarySeparatorSymbol] = static_cast<char16_t>(0x2e); // '.' monetary decimal separator + fSymbols[kExponentialSymbol] = static_cast<char16_t>(0x45); // 'E' exponential + fSymbols[kPerMillSymbol] = static_cast<char16_t>(0x2030); // '%o' per mill + fSymbols[kPadEscapeSymbol] = static_cast<char16_t>(0x2a); // '*' pad escape symbol + fSymbols[kInfinitySymbol] = static_cast<char16_t>(0x221e); // 'oo' infinite + fSymbols[kNaNSymbol] = static_cast<char16_t>(0xfffd); // SUB NaN + fSymbols[kSignificantDigitSymbol] = static_cast<char16_t>(0x0040); // '@' significant digit fSymbols[kMonetaryGroupingSeparatorSymbol].remove(); // - fSymbols[kExponentMultiplicationSymbol] = (char16_t)0xd7; // 'x' multiplication symbol for exponents + fSymbols[kExponentMultiplicationSymbol] = static_cast<char16_t>(0xd7); // 'x' multiplication symbol for exponents fSymbols[kApproximatelySignSymbol] = u'~'; // '~' approximately sign fIsCustomCurrencySymbol = false; fIsCustomIntlCurrencySymbol = false; @@ -551,11 +548,11 @@ void DecimalFormatSymbols::setCurrency(const char16_t* currency, UErrorCode& sta ures_getByIndex(rb.getAlias(), 2, rb.getAlias(), &localStatus); int32_t currPatternLen = 0; currPattern = - ures_getStringByIndex(rb.getAlias(), (int32_t)0, &currPatternLen, &localStatus); + ures_getStringByIndex(rb.getAlias(), static_cast<int32_t>(0), &currPatternLen, &localStatus); UnicodeString decimalSep = - ures_getUnicodeStringByIndex(rb.getAlias(), (int32_t)1, &localStatus); + ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(1), &localStatus); UnicodeString groupingSep = - ures_getUnicodeStringByIndex(rb.getAlias(), (int32_t)2, &localStatus); + ures_getUnicodeStringByIndex(rb.getAlias(), static_cast<int32_t>(2), &localStatus); if(U_SUCCESS(localStatus)){ fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; fSymbols[kMonetarySeparatorSymbol] = decimalSep; @@ -568,8 +565,7 @@ void DecimalFormatSymbols::setCurrency(const char16_t* currency, UErrorCode& sta Locale DecimalFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const UnicodeString& @@ -580,9 +576,9 @@ DecimalFormatSymbols::getPatternForCurrencySpacing(UCurrencySpacing type, return fNoSymbol; // always empty. } if (beforeCurrency) { - return currencySpcBeforeSym[(int32_t)type]; + return currencySpcBeforeSym[static_cast<int32_t>(type)]; } else { - return currencySpcAfterSym[(int32_t)type]; + return currencySpcAfterSym[static_cast<int32_t>(type)]; } } @@ -591,9 +587,9 @@ DecimalFormatSymbols::setPatternForCurrencySpacing(UCurrencySpacing type, UBool beforeCurrency, const UnicodeString& pattern) { if (beforeCurrency) { - currencySpcBeforeSym[(int32_t)type] = pattern; + currencySpcBeforeSym[static_cast<int32_t>(type)] = pattern; } else { - currencySpcAfterSym[(int32_t)type] = pattern; + currencySpcAfterSym[static_cast<int32_t>(type)] = pattern; } } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/decNumber.cpp b/deps/icu-small/source/i18n/decNumber.cpp index 42da36dc4be532..96ad3d7f986aed 100644 --- a/deps/icu-small/source/i18n/decNumber.cpp +++ b/deps/icu-small/source/i18n/decNumber.cpp @@ -3795,7 +3795,6 @@ static void decToString(const decNumber *dn, char *string, Flag eng) { } /* cut */ } *c='\0'; /* terminate the string (all paths) */ - return; } /* decToString */ /* ------------------------------------------------------------------ */ @@ -3877,7 +3876,7 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, /* [following code does not require input rounding] */ /* note whether signs differ [used all paths] */ - diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG); + diffsign = static_cast<Flag>((lhs->bits ^ rhs->bits ^ negate) & DECNEG); /* handle infinities and NaNs */ if (SPECIALARGS) { /* a special bit set */ @@ -3983,9 +3982,9 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, partial+=*rhs->lsu; if ((partial<=DECDPUNMAX) /* result fits in unit */ && (lhs->digits>=DECDPUN || /* .. and no digits-count change */ - partial<(Int)powers[lhs->digits])) { /* .. */ + partial < static_cast<Int>(powers[lhs->digits]))) { /* .. */ if (res!=lhs) uprv_decNumberCopy(res, lhs); /* not in place */ - *res->lsu=(Unit)partial; /* [copy could have overwritten RHS] */ + *res->lsu = static_cast<Unit>(partial); /* [copy could have overwritten RHS] */ break; } /* else drop out for careful add */ @@ -3994,7 +3993,7 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, partial-=*rhs->lsu; if (partial>0) { /* no borrow needed, and non-0 result */ if (res!=lhs) uprv_decNumberCopy(res, lhs); /* not in place */ - *res->lsu=(Unit)partial; + *res->lsu = static_cast<Unit>(partial); /* this could have reduced digits [but result>0] */ res->digits=decGetDigits(res->lsu, D2U(res->digits)); break; @@ -4023,7 +4022,7 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, if (padding<0) { /* LHS needs the padding */ const decNumber *t; padding=-padding; /* will be +ve */ - bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */ + bits = static_cast<uByte>(rhs->bits ^ negate); /* assumed sign is now that of RHS */ t=lhs; lhs=rhs; rhs=t; swapped=1; } @@ -4074,7 +4073,7 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, acc=accbuff; /* assume use local buffer */ if (need*sizeof(Unit)>sizeof(accbuff)) { /* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */ - allocacc=(Unit *)malloc(need*sizeof(Unit)); + allocacc = static_cast<Unit*>(malloc(need * sizeof(Unit))); if (allocacc==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -4082,7 +4081,7 @@ static decNumber * decAddOp(decNumber *res, const decNumber *lhs, } } - res->bits=(uByte)(bits&DECNEG); /* it's now safe to overwrite.. */ + res->bits = static_cast<uByte>(bits & DECNEG); /* it's now safe to overwrite.. */ res->exponent=lhs->exponent; /* .. operands (even if aliased) */ #if DECTRACE @@ -4439,7 +4438,7 @@ static decNumber * decDivideOp(decNumber *res, acclength=D2U(reqdigits+DECDPUN); /* in Units */ if (acclength*sizeof(Unit)>sizeof(accbuff)) { /* printf("malloc dvacc %ld units\n", acclength); */ - allocacc=(Unit *)malloc(acclength*sizeof(Unit)); + allocacc = static_cast<Unit*>(malloc(acclength * sizeof(Unit))); if (allocacc==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -4464,7 +4463,7 @@ static decNumber * decDivideOp(decNumber *res, if (!(op&DIVIDE)) var1units++; if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) { /* printf("malloc dvvar %ld units\n", var1units+1); */ - varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit)); + varalloc = static_cast<Unit*>(malloc((var1units + 1) * sizeof(Unit))); if (varalloc==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -4492,7 +4491,7 @@ static decNumber * decDivideOp(decNumber *res, /* 1 to make sure that the multiplier is never overestimated. */ msu2plus=*msu2; /* it's value .. */ if (var2units>1) msu2plus++; /* .. +1 if any more */ - msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */ + msu2pair = static_cast<eInt>(*msu2) * (DECDPUNMAX + 1); /* top two pair .. */ if (var2units>1) { /* .. [else treat 2nd as 0] */ msu2pair+=*(msu2-1); /* .. */ if (var2units>2) msu2pair++; /* .. +1 if any more */ @@ -4574,16 +4573,16 @@ static decNumber * decDivideOp(decNumber *res, /* *pv1>v2. Prepare for real subtraction; the lengths are equal */ /* Estimate the multiplier (there's always a msu1-1)... */ /* Bring in two units of var2 to provide a good estimate. */ - mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair); + mult = static_cast<Int>((static_cast<eInt>(*msu1) * (DECDPUNMAX + 1) + *(msu1 - 1)) / msu2pair); } /* lengths the same */ else { /* var1units > var2ulen, so subtraction is safe */ /* The var2 msu is one unit towards the lsu of the var1 msu, */ /* so only one unit for var2 can be used. */ - mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus); + mult = static_cast<Int>((static_cast<eInt>(*msu1) * (DECDPUNMAX + 1) + *(msu1 - 1)) / msu2plus); } if (mult==0) mult=1; /* must always be at least 1 */ /* subtraction needed; var1 is > var2 */ - thisunit=(Unit)(thisunit+mult); /* accumulate */ + thisunit = static_cast<Unit>(thisunit + mult); /* accumulate */ /* subtract var1-var2, into var1; only the overlap needs */ /* processing, as this is an in-place calculation */ shift=var2ulen-var2units; @@ -4707,7 +4706,7 @@ static decNumber * decDivideOp(decNumber *res, if (set->extended) #endif res->exponent=exp; /* .. with proper exponent */ - res->bits=(uByte)(bits&DECNEG); /* [cleaned] */ + res->bits = static_cast<uByte>(bits & DECNEG); /* [cleaned] */ decFinish(res, set, &residue, status); /* might clamp */ break; } @@ -4798,7 +4797,7 @@ static decNumber * decDivideOp(decNumber *res, /* subtract [A+B*(-m)]; the result will always be negative */ accunits=-decUnitAddSub(accnext, accunits, rhs->lsu, D2U(rhs->digits), - expunits, accnext, -(Int)powers[exprem]); + expunits, accnext, -static_cast<Int>(powers[exprem])); accdigits=decGetDigits(accnext, accunits); /* count digits exactly */ accunits=D2U(accdigits); /* and recalculate the units for copy */ /* [exponent is as for original remainder] */ @@ -4810,7 +4809,7 @@ static decNumber * decDivideOp(decNumber *res, /* Set exponent and bits */ res->exponent=exponent; - res->bits=(uByte)(bits&DECNEG); /* [cleaned] */ + res->bits = static_cast<uByte>(bits & DECNEG); /* [cleaned] */ /* Now the coefficient. */ decSetCoeff(res, set, accnext, accdigits, &residue, status); @@ -4935,7 +4934,7 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, #endif /* precalculate result sign */ - bits=(uByte)((lhs->bits^rhs->bits)&DECNEG); + bits = static_cast<uByte>((lhs->bits ^ rhs->bits) & DECNEG); /* handle infinities and NaNs */ if (SPECIALARGS) { /* a special bit set */ @@ -4991,12 +4990,12 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, /* allocate buffers if required, as usual */ needbytes=ilhs*sizeof(uInt); - if (needbytes>(Int)sizeof(zlhibuff)) { - alloclhi=(uInt *)malloc(needbytes); + if (needbytes > static_cast<Int>(sizeof(zlhibuff))) { + alloclhi = static_cast<uInt*>(malloc(needbytes)); zlhi=alloclhi;} needbytes=irhs*sizeof(uInt); - if (needbytes>(Int)sizeof(zrhibuff)) { - allocrhi=(uInt *)malloc(needbytes); + if (needbytes > static_cast<Int>(sizeof(zrhibuff))) { + allocrhi = static_cast<uInt*>(malloc(needbytes)); zrhi=allocrhi;} /* Allocating the accumulator space needs a special case when */ @@ -5015,14 +5014,14 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, zoff=(iacc+7)/8; /* items to offset by */ needbytes+=zoff*8; #endif - if (needbytes>(Int)sizeof(zaccbuff)) { - allocacc=(uLong *)malloc(needbytes); - zacc=(uLong *)allocacc;} + if (needbytes > static_cast<Int>(sizeof(zaccbuff))) { + allocacc = static_cast<uLong*>(malloc(needbytes)); + zacc = static_cast<uLong*>(allocacc);} if (zlhi==nullptr||zrhi==nullptr||zacc==nullptr) { *status|=DEC_Insufficient_storage; break;} - acc=(Unit *)zacc; /* -> target Unit array */ + acc = reinterpret_cast<Unit*>(zacc); /* -> target Unit array */ #if DECDPUN==1 zacc+=zoff; /* start uLong accumulator to right */ #endif @@ -5063,7 +5062,7 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, for (rip=zrhi; rip<=rmsi; rip++) { /* over each item in rhs */ lp=zacc+(rip-zrhi); /* where to add the lhs */ for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */ - *lp+=(uLong)(*lip)*(*rip); /* [this should in-line] */ + *lp += static_cast<uLong>(*lip) * (*rip); /* [this should in-line] */ } /* lip loop */ lazy--; if (lazy>0 && rip!=rmsi) continue; @@ -5076,15 +5075,15 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, /* and occasional extra divide (slow) is well worth it, as */ /* it allows FASTLAZY to be increased to 18 rather than 4 */ /* in the FASTDIGS=9 case */ - if (lcarry<FASTBASE) carry=(uInt)lcarry; /* [usual] */ + if (lcarry<FASTBASE) carry = static_cast<uInt>(lcarry); /* [usual] */ else { /* two-place carry [fairly rare] */ - uInt carry2=(uInt)(lcarry/FASTBASE); /* top top part */ + uInt carry2 = static_cast<uInt>(lcarry / FASTBASE); /* top top part */ *(lp+2)+=carry2; /* add to item+2 */ - *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */ - carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */ + *lp -= (static_cast<uLong>(FASTBASE) * FASTBASE * carry2); /* [slow] */ + carry = static_cast<uInt>(lcarry - (static_cast<uLong>(FASTBASE) * carry2)); /* [inline] */ } *(lp+1)+=carry; /* add to item above [inline] */ - *lp-=((uLong)FASTBASE*carry); /* [inline] */ + *lp -= (static_cast<uLong>(FASTBASE) * carry); /* [inline] */ } /* carry resolution */ } /* rip loop */ @@ -5095,13 +5094,13 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, /* each item in the accumulator (which will become up to N */ /* units, where 2<=N<=9). */ for (lp=zacc, up=acc; lp<zacc+iacc; lp++) { - uInt item=(uInt)*lp; /* decapitate to uInt */ + uInt item = static_cast<uInt>(*lp); /* decapitate to uInt */ for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) { uInt part=item/(DECDPUNMAX+1); - *up=(Unit)(item-(part*(DECDPUNMAX+1))); + *up = static_cast<Unit>(item - (part * (DECDPUNMAX + 1))); item=part; } /* p */ - *up=(Unit)item; up++; /* [final needs no division] */ + *up = static_cast<Unit>(item); up++; /* [final needs no division] */ } /* lp */ accunits = static_cast<int32_t>(up-acc); /* count of units */ } @@ -5111,10 +5110,10 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, /* if accumulator will be too long for local storage, then allocate */ acc=accbuff; /* -> assume buffer for accumulator */ needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit); - if (needbytes>(Int)sizeof(accbuff)) { - allocacc=(Unit *)malloc(needbytes); + if (needbytes > static_cast<Int>(sizeof(accbuff))) { + allocacc = static_cast<Unit*>(malloc(needbytes)); if (allocacc==nullptr) {*status|=DEC_Insufficient_storage; break;} - acc=(Unit *)allocacc; /* use the allocated space */ + acc = static_cast<Unit*>(allocacc); /* use the allocated space */ } /* Now the main long multiplication loop */ @@ -5399,7 +5398,7 @@ decNumber * decExpOp(decNumber *res, const decNumber *rhs, decNumber *newrhs=bufr; /* assume will fit on stack */ needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit); if (needbytes>sizeof(bufr)) { /* need malloc space */ - allocrhs=(decNumber *)malloc(needbytes); + allocrhs = static_cast<decNumber*>(malloc(needbytes)); if (allocrhs==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -5431,7 +5430,7 @@ decNumber * decExpOp(decNumber *res, const decNumber *rhs, /* sufficiently exact. */ needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit); if (needbytes>sizeof(bufa)) { /* need malloc space */ - allocbufa=(decNumber *)malloc(needbytes); + allocbufa = static_cast<decNumber*>(malloc(needbytes)); if (allocbufa==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -5443,7 +5442,7 @@ decNumber * decExpOp(decNumber *res, const decNumber *rhs, /* calculation below, which needs an extra two digits */ needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit); if (needbytes>sizeof(buft)) { /* need malloc space */ - allocbuft=(decNumber *)malloc(needbytes); + allocbuft = static_cast<decNumber*>(malloc(needbytes)); if (allocbuft==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -5712,7 +5711,7 @@ decNumber * decLnOp(decNumber *res, const decNumber *rhs, /* estimate. */ needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit); if (needbytes>sizeof(bufa)) { /* need malloc space */ - allocbufa=(decNumber *)malloc(needbytes); + allocbufa = static_cast<decNumber*>(malloc(needbytes)); if (allocbufa==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -5721,7 +5720,7 @@ decNumber * decLnOp(decNumber *res, const decNumber *rhs, pp=p+rhs->digits; needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit); if (needbytes>sizeof(bufb)) { /* need malloc space */ - allocbufb=(decNumber *)malloc(needbytes); + allocbufb = static_cast<decNumber*>(malloc(needbytes)); if (allocbufb==nullptr) { /* hopeless -- abandon */ *status|=DEC_Insufficient_storage; break;} @@ -6300,8 +6299,8 @@ static Int decUnitCompare(const Unit *a, Int alength, /* Unaligned. If one is >1 unit longer than the other, padded */ /* approximately, then can return easily */ - if (alength>blength+(Int)D2U(exp)) return 1; - if (alength+1<blength+(Int)D2U(exp)) return -1; + if (alength > blength + static_cast<Int>(D2U(exp))) return 1; + if (alength + 1 < blength + static_cast<Int>(D2U(exp))) return -1; /* Need to do a real subtract. For this, a result buffer is needed */ /* even though only the sign is of interest. Its length needs */ @@ -6311,7 +6310,7 @@ static Int decUnitCompare(const Unit *a, Int alength, need+=2; acc=accbuff; /* assume use local buffer */ if (need*sizeof(Unit)>sizeof(accbuff)) { - allocacc=(Unit *)malloc(need*sizeof(Unit)); + allocacc = static_cast<Unit*>(malloc(need * sizeof(Unit))); if (allocacc==nullptr) return BADINT; /* hopeless -- abandon */ acc=allocacc; } @@ -6320,7 +6319,7 @@ static Int decUnitCompare(const Unit *a, Int alength, exprem=exp%DECDPUN; /* subtract [A+B*(-m)] */ accunits=decUnitAddSub(a, alength, b, blength, expunits, acc, - -(Int)powers[exprem]); + -static_cast<Int>(powers[exprem])); /* [UnitAddSub result may have leading zeros, even on zero] */ if (accunits<0) result=-1; /* negative result */ else { /* non-negative result */ @@ -6425,11 +6424,11 @@ static Int decUnitAddSub(const Unit *a, Int alength, for (; c<minC; c++) { carry+=*a; a++; - carry+=((eInt)*b)*m; /* [special-casing m=1/-1 */ + carry += (static_cast<eInt>(*b)) * m; /* [special-casing m=1/-1 */ b++; /* here is not a win] */ /* here carry is new Unit of digits; it could be +ve or -ve */ - if ((ueInt)carry<=DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */ - *c=(Unit)carry; + if (static_cast<ueInt>(carry) <= DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */ + *c = static_cast<Unit>(carry); carry=0; continue; } @@ -6473,14 +6472,14 @@ static Int decUnitAddSub(const Unit *a, Int alength, /* Can use QUOT10 as carry <= 4 digits */ if (carry>=0) { est=QUOT10(carry, DECDPUN); - *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */ + *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); /* remainder */ carry=est; /* quotient */ continue; } /* negative case */ - carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */ + carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive */ est=QUOT10(carry, DECDPUN); - *c=(Unit)(carry-est*(DECDPUNMAX+1)); + *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); carry=est-(DECDPUNMAX+1); /* correctly negative */ #else /* remainder operator is undefined if negative, so must test */ @@ -6509,13 +6508,13 @@ static Int decUnitAddSub(const Unit *a, Int alength, a++; } else { /* inside B */ - carry+=((eInt)*b)*m; + carry += static_cast<eInt>(*b) * m; b++; } /* here carry is new Unit of digits; it could be +ve or -ve and */ /* magnitude up to DECDPUNMAX squared */ - if ((ueInt)carry<=DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */ - *c=(Unit)carry; + if (static_cast<ueInt>(carry) <= DECDPUNMAX) { /* fastpath 0-DECDPUNMAX */ + *c = static_cast<Unit>(carry); carry=0; continue; } @@ -6559,14 +6558,14 @@ static Int decUnitAddSub(const Unit *a, Int alength, #elif DECDPUN<=2 if (carry>=0) { est=QUOT10(carry, DECDPUN); - *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */ + *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); /* remainder */ carry=est; /* quotient */ continue; } /* negative case */ - carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */ + carry = carry + static_cast<eInt>(DECDPUNMAX + 1) * (DECDPUNMAX + 1); /* make positive */ est=QUOT10(carry, DECDPUN); - *c=(Unit)(carry-est*(DECDPUNMAX+1)); + *c = static_cast<Unit>(carry - est * (DECDPUNMAX + 1)); carry=est-(DECDPUNMAX+1); /* correctly negative */ #else if ((ueInt)carry<(DECDPUNMAX+1)*2){ /* fastpath carry 1 */ @@ -6591,7 +6590,7 @@ static Int decUnitAddSub(const Unit *a, Int alength, /* return number of Units in the result, negated if a borrow */ if (carry==0) return static_cast<int32_t>(c-clsu); /* no carry, so no more to do */ if (carry>0) { /* positive carry */ - *c=(Unit)carry; /* place as new unit */ + *c = static_cast<Unit>(carry); /* place as new unit */ c++; /* .. */ return static_cast<int32_t>(c-clsu); } @@ -6600,7 +6599,7 @@ static Int decUnitAddSub(const Unit *a, Int alength, for (c=clsu; c<maxC; c++) { add=DECDPUNMAX+add-*c; if (add<=DECDPUNMAX) { - *c=(Unit)add; + *c = static_cast<Unit>(add); add=0; } else { @@ -6613,7 +6612,7 @@ static Int decUnitAddSub(const Unit *a, Int alength, printf("UAS borrow: add %ld, carry %ld\n", add, carry); #endif if ((add-carry-1)!=0) { - *c=(Unit)(add-carry-1); + *c = static_cast<Unit>(add - carry - 1); c++; /* interesting, include it */ } return static_cast<int32_t>(clsu-c); /* -ve result indicates borrowed */ @@ -6712,7 +6711,6 @@ static void decReverse(Unit *ulo, Unit *uhi) { *ulo=*uhi; *uhi=temp; } - return; } /* decReverse */ /* ------------------------------------------------------------------ */ @@ -6735,7 +6733,7 @@ static Int decShiftToMost(Unit *uar, Int digits, Int shift) { if (shift==0) return digits; /* [fastpath] nothing to do */ if ((digits+shift)<=DECDPUN) { /* [fastpath] single-unit case */ - *uar=(Unit)(*uar*powers[shift]); + *uar = static_cast<Unit>(*uar * powers[shift]); return digits+shift; } @@ -6758,14 +6756,14 @@ static Int decShiftToMost(Unit *uar, Int digits, Int shift) { uInt rem=*source%powers[cut]; next+=*source/powers[cut]; #endif - if (target<=first) *target=(Unit)next; /* write to target iff valid */ + if (target <= first) *target = static_cast<Unit>(next); /* write to target iff valid */ next=rem*powers[DECDPUN-cut]; /* save remainder for next Unit */ } } /* shift-move */ /* propagate any partial unit to one below and clear the rest */ for (; target>=uar; target--) { - *target=(Unit)next; + *target = static_cast<Unit>(next); next=0; } return digits+shift; @@ -6812,7 +6810,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { quot=*up/powers[cut]; #endif for (; ; target++) { - *target=(Unit)quot; + *target = static_cast<Unit>(quot); count-=(DECDPUN-cut); if (count<=0) break; up++; @@ -6824,7 +6822,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { rem=quot%powers[cut]; quot=quot/powers[cut]; #endif - *target=(Unit)(*target+rem*powers[DECDPUN-cut]); + *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]); count-=cut; if (count<=0) break; } @@ -6995,7 +6993,7 @@ static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu, /* here up -> Unit with first discarded digit */ cut=discard-(count-DECDPUN)-1; if (cut==DECDPUN-1) { /* unit-boundary case (fast) */ - Unit half=(Unit)powers[DECDPUN]>>1; + Unit half = static_cast<Unit>(powers[DECDPUN]) >> 1; /* set residue directly */ if (*up>=half) { if (*up>half) *residue=7; @@ -7059,7 +7057,7 @@ static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu, dn->digits=count; /* set the new length */ /* shift-copy the coefficient array to the result number */ for (target=dn->lsu; ; target++) { - *target=(Unit)quot; + *target = static_cast<Unit>(quot); count-=(DECDPUN-cut); if (count<=0) break; up++; @@ -7071,7 +7069,7 @@ static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu, rem=quot%powers[cut]; quot=quot/powers[cut]; #endif - *target=(Unit)(*target+rem*powers[DECDPUN-cut]); + *target = static_cast<Unit>(*target + rem * powers[DECDPUN - cut]); count-=cut; if (count<=0) break; } /* shift-copy loop */ @@ -7079,7 +7077,6 @@ static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu, } /* not unit boundary */ if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */ - return; } /* decSetCoeff */ /* ------------------------------------------------------------------ */ @@ -7208,7 +7205,7 @@ static void decApplyRound(decNumber *dn, decContext *set, Int residue, /* this is the last Unit (the msu) */ if (*up!=powers[count]-1) break; /* not still 9s */ /* here if it, too, is all nines */ - *up=(Unit)powers[count-1]; /* here 999 -> 100 etc. */ + *up = static_cast<Unit>(powers[count - 1]); /* here 999 -> 100 etc. */ for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */ dn->exponent++; /* and bump exponent */ /* [which, very rarely, could cause Overflow...] */ @@ -7233,9 +7230,9 @@ static void decApplyRound(decNumber *dn, decContext *set, Int residue, if (*up!=powers[count-1]) break; /* not 100.. */ /* here if have the 1000... case */ sup=up; /* save msu pointer */ - *up=(Unit)powers[count]-1; /* here 100 in msu -> 999 */ + *up = static_cast<Unit>(powers[count]) - 1; /* here 100 in msu -> 999 */ /* others all to all-nines, too */ - for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1; + for (up=up-1; up>=dn->lsu; up--) *up = static_cast<Unit>(powers[DECDPUN]) - 1; dn->exponent--; /* and bump exponent */ /* iff the number was at the subnormal boundary (exponent=etiny) */ @@ -7246,7 +7243,7 @@ static void decApplyRound(decNumber *dn, decContext *set, Int residue, if (dn->exponent+1==set->emin-set->digits+1) { if (count==1 && dn->digits==1) *sup=0; /* here 9 -> 0[.9] */ else { - *sup=(Unit)powers[count-1]-1; /* here 999.. in msu -> 99.. */ + *sup = static_cast<Unit>(powers[count - 1]) - 1; /* here 999.. in msu -> 99.. */ dn->digits--; } dn->exponent++; @@ -7378,7 +7375,6 @@ static void decFinalize(decNumber *dn, decContext *set, Int *residue, } dn->exponent-=shift; /* adjust the exponent to match */ *status|=DEC_Clamped; /* and record the dirty deed */ - return; } /* decFinalize */ /* ------------------------------------------------------------------ */ @@ -7446,7 +7442,7 @@ static void decSetMaxValue(decNumber *dn, decContext *set) { for (up=dn->lsu; ; up++) { if (count>DECDPUN) *up=DECDPUNMAX; /* unit full o'nines */ else { /* this is the msu */ - *up=(Unit)(powers[count]-1); + *up = static_cast<Unit>(powers[count] - 1); break; } count-=DECDPUN; /* filled those digits */ @@ -7646,7 +7642,7 @@ static Int decGetInt(const decNumber *dn) { got+=DECDPUN; } if (ilength==10) { /* need to check for wrap */ - if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11; + if (theInt / static_cast<Int>(powers[got - DECDPUN]) != static_cast<Int>(*(up - 1))) ilength = 11; /* [that test also disallows the BADINT result case] */ else if (neg && theInt>1999999997) ilength=11; else if (!neg && theInt>999999999) ilength=11; @@ -7795,7 +7791,6 @@ static void decStatus(decNumber *dn, uInt status, decContext *set) { } } uprv_decContextSetStatus(set, status); /* [may not return] */ - return; } /* decStatus */ /* ------------------------------------------------------------------ */ diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index 75906991d72b9f..85ba4d83cb613d 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -210,7 +210,7 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro break; case UNUM_ROUNDING_MODE: - setRoundingMode((DecimalFormat::ERoundingMode) newValue); + setRoundingMode(static_cast<DecimalFormat::ERoundingMode>(newValue)); break; case UNUM_FORMAT_WIDTH: @@ -219,7 +219,7 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro case UNUM_PADDING_POSITION: /** The position at which padding will take place. */ - setPadPosition((DecimalFormat::EPadPosition) newValue); + setPadPosition(static_cast<DecimalFormat::EPadPosition>(newValue)); break; case UNUM_SECONDARY_GROUPING_SIZE: @@ -228,20 +228,20 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro #if UCONFIG_HAVE_PARSEALLINPUT case UNUM_PARSE_ALL_INPUT: - setParseAllInput((UNumberFormatAttributeValue) newValue); + setParseAllInput(static_cast<UNumberFormatAttributeValue>(newValue)); break; #endif case UNUM_PARSE_NO_EXPONENT: - setParseNoExponent((UBool) newValue); + setParseNoExponent(static_cast<UBool>(newValue)); break; case UNUM_PARSE_DECIMAL_MARK_REQUIRED: - setDecimalPatternMatchRequired((UBool) newValue); + setDecimalPatternMatchRequired(static_cast<UBool>(newValue)); break; case UNUM_CURRENCY_USAGE: - setCurrencyUsage((UCurrencyUsage) newValue, &status); + setCurrencyUsage(static_cast<UCurrencyUsage>(newValue), &status); break; case UNUM_MINIMUM_GROUPING_DIGITS: @@ -498,7 +498,7 @@ DecimalFormat* DecimalFormat::clone() const { } bool DecimalFormat::operator==(const Format& other) const { - auto* otherDF = dynamic_cast<const DecimalFormat*>(&other); + const auto* otherDF = dynamic_cast<const DecimalFormat*>(&other); if (otherDF == nullptr) { return false; } diff --git a/deps/icu-small/source/i18n/displayoptions.cpp b/deps/icu-small/source/i18n/displayoptions.cpp index bb49e6033f3c9f..8c9dd1c478ac03 100644 --- a/deps/icu-small/source/i18n/displayoptions.cpp +++ b/deps/icu-small/source/i18n/displayoptions.cpp @@ -11,7 +11,7 @@ U_NAMESPACE_BEGIN -DisplayOptions::Builder DisplayOptions::builder() { return DisplayOptions::Builder(); } +DisplayOptions::Builder DisplayOptions::builder() { return {}; } DisplayOptions::Builder DisplayOptions::copyToBuilder() const { return Builder(*this); } diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp index 3bc35c8aaf81dc..ad6ea927309903 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp @@ -47,9 +47,7 @@ // ICU PATCH: Wrap in ICU namespace U_NAMESPACE_BEGIN -namespace double_conversion { - -namespace PowersOfTenCache { +namespace double_conversion::PowersOfTenCache { struct CachedPower { uint64_t significand; @@ -184,9 +182,7 @@ void GetCachedPowerForDecimalExponent(int requested_exponent, DOUBLE_CONVERSION_ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance); } -} // namespace PowersOfTenCache - -} // namespace double_conversion +} // namespace double_conversion::PowersOfTenCache // ICU PATCH: Close ICU namespace U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.h b/deps/icu-small/source/i18n/double-conversion-cached-powers.h index ade27baef8b0c7..78e70378d9ae2b 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.h +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.h @@ -44,9 +44,7 @@ // ICU PATCH: Wrap in ICU namespace U_NAMESPACE_BEGIN -namespace double_conversion { - -namespace PowersOfTenCache { +namespace double_conversion::PowersOfTenCache { // Not all powers of ten are cached. The decimal exponent of two neighboring // cached numbers will differ by kDecimalExponentDistance. @@ -71,9 +69,7 @@ namespace PowersOfTenCache { DiyFp* power, int* found_exponent); -} // namespace PowersOfTenCache - -} // namespace double_conversion +} // namespace double_conversion::PowersOfTenCache // ICU PATCH: Close ICU namespace U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/double-conversion-string-to-double.cpp b/deps/icu-small/source/i18n/double-conversion-string-to-double.cpp index 727fff24e17aca..0a33b91b7c90a4 100644 --- a/deps/icu-small/source/i18n/double-conversion-string-to-double.cpp +++ b/deps/icu-small/source/i18n/double-conversion-string-to-double.cpp @@ -383,7 +383,7 @@ static double RadixStringToIeee(Iterator* current, } // Rounding up may cause overflow. - if ((number & ((int64_t)1 << kSignificandSize)) != 0) { + if ((number & (static_cast<int64_t>(1) << kSignificandSize)) != 0) { exponent++; number >>= 1; } diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index 943f6e21d2ede6..8d1427f6e9606b 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -30,6 +30,7 @@ #include "unicode/ustring.h" #include "unicode/localpointer.h" #include "unicode/dtfmtsym.h" +#include "unicode/errorcode.h" #include "unicode/smpdtfmt.h" #include "unicode/msgfmt.h" #include "unicode/numsys.h" @@ -39,6 +40,7 @@ #include "cmemory.h" #include "cstring.h" #include "charstr.h" +#include "erarules.h" #include "dt_impl.h" #include "locbased.h" #include "gregoimp.h" @@ -86,6 +88,33 @@ static const char16_t gPatternChars[] = { 0 }; +/** + * Map of each ASCII character to its corresponding index in the table above if + * it is a pattern character and -1 otherwise. + */ +static const int8_t gLookupPatternChars[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + // ! " # $ % & ' ( ) * + , - . / + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +#if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, +#else + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +#endif + // @ A B C D E F G H I J K L M N O + -1, 22, 36, -1, 10, 9, 11, 0, 5, -1, -1, 16, 26, 2, -1, 31, + // P Q R S T U V W X Y Z [ \ ] ^ _ + -1, 27, -1, 8, -1, 30, 29, 13, 32, 18, 23, -1, -1, -1, -1, -1, + // ` a b c d e f g h i j k l m n o + -1, 14, 35, 25, 3, 19, -1, 21, 15, -1, -1, 4, -1, 6, -1, -1, + // p q r s t u v w x y z { | } ~ + -1, 28, 34, 7, -1, 20, 24, 12, 33, 1, 17, -1, -1, -1, -1, -1 +}; + //------------------------------------------------------ // Strings of last resort. These are only used if we have no resource // files. They aren't designed for actual use, just for backup. @@ -343,7 +372,7 @@ DateFormatSymbols::createZoneStrings(const UnicodeString *const * otherStrings) int32_t row, col; UBool failed = false; - fZoneStrings = (UnicodeString **)uprv_malloc(fZoneStringsRowCount * sizeof(UnicodeString *)); + fZoneStrings = static_cast<UnicodeString**>(uprv_malloc(fZoneStringsRowCount * sizeof(UnicodeString*))); if (fZoneStrings != nullptr) { for (row=0; row<fZoneStringsRowCount; ++row) { @@ -373,11 +402,8 @@ DateFormatSymbols::createZoneStrings(const UnicodeString *const * otherStrings) */ void DateFormatSymbols::copyData(const DateFormatSymbols& other) { - UErrorCode status = U_ZERO_ERROR; - U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs( - other.getLocale(ULOC_VALID_LOCALE, status), - other.getLocale(ULOC_ACTUAL_LOCALE, status)); + validLocale = other.validLocale; + actualLocale = other.actualLocale; assignArray(fEras, fErasCount, other.fEras, other.fErasCount); assignArray(fEraNames, fEraNamesCount, other.fEraNames, other.fEraNamesCount); assignArray(fNarrowEras, fNarrowErasCount, other.fNarrowEras, other.fNarrowErasCount); @@ -396,6 +422,7 @@ DateFormatSymbols::copyData(const DateFormatSymbols& other) { assignArray(fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, other.fStandaloneShorterWeekdays, other.fStandaloneShorterWeekdaysCount); assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, other.fStandaloneNarrowWeekdays, other.fStandaloneNarrowWeekdaysCount); assignArray(fAmPms, fAmPmsCount, other.fAmPms, other.fAmPmsCount); + assignArray(fWideAmPms, fWideAmPmsCount, other.fWideAmPms, other.fWideAmPmsCount ); assignArray(fNarrowAmPms, fNarrowAmPmsCount, other.fNarrowAmPms, other.fNarrowAmPmsCount ); fTimeSeparator.fastCopyFrom(other.fTimeSeparator); // fastCopyFrom() - see assignArray comments assignArray(fQuarters, fQuartersCount, other.fQuarters, other.fQuartersCount); @@ -492,6 +519,7 @@ void DateFormatSymbols::dispose() delete[] fStandaloneShorterWeekdays; delete[] fStandaloneNarrowWeekdays; delete[] fAmPms; + delete[] fWideAmPms; delete[] fNarrowAmPms; delete[] fQuarters; delete[] fShortQuarters; @@ -509,6 +537,8 @@ void DateFormatSymbols::dispose() delete[] fStandaloneWideDayPeriods; delete[] fStandaloneNarrowDayPeriods; + actualLocale = Locale::getRoot(); + validLocale = Locale::getRoot(); disposeZoneStrings(); } @@ -572,6 +602,7 @@ DateFormatSymbols::operator==(const DateFormatSymbols& other) const fStandaloneShorterWeekdaysCount == other.fStandaloneShorterWeekdaysCount && fStandaloneNarrowWeekdaysCount == other.fStandaloneNarrowWeekdaysCount && fAmPmsCount == other.fAmPmsCount && + fWideAmPmsCount == other.fWideAmPmsCount && fNarrowAmPmsCount == other.fNarrowAmPmsCount && fQuartersCount == other.fQuartersCount && fShortQuartersCount == other.fShortQuartersCount && @@ -609,6 +640,7 @@ DateFormatSymbols::operator==(const DateFormatSymbols& other) const arrayCompare(fStandaloneShorterWeekdays, other.fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount) && arrayCompare(fStandaloneNarrowWeekdays, other.fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount) && arrayCompare(fAmPms, other.fAmPms, fAmPmsCount) && + arrayCompare(fWideAmPms, other.fWideAmPms, fWideAmPmsCount) && arrayCompare(fNarrowAmPms, other.fNarrowAmPms, fNarrowAmPmsCount) && fTimeSeparator == other.fTimeSeparator && arrayCompare(fQuarters, other.fQuarters, fQuartersCount) && @@ -867,8 +899,32 @@ DateFormatSymbols::getTimeSeparatorString(UnicodeString& result) const const UnicodeString* DateFormatSymbols::getAmPmStrings(int32_t &count) const { - count = fAmPmsCount; - return fAmPms; + return getAmPmStrings(count, FORMAT, ABBREVIATED); +} + +const UnicodeString* +DateFormatSymbols::getAmPmStrings(int32_t &count, DtContextType /*ignored*/, DtWidthType width) const +{ + UnicodeString* const* srcArray; + int32_t const* srcCount; + switch (width) { + case WIDE: + srcArray = &fWideAmPms; + srcCount = &fWideAmPmsCount; + break; + case NARROW: + srcArray = &fNarrowAmPms; + srcCount = &fNarrowAmPmsCount; + break; + case ABBREVIATED: + default: + srcArray = &fAmPms; + srcCount = &fAmPmsCount; + break; + } + + count = *srcCount; + return *srcArray; } const UnicodeString* @@ -891,9 +947,7 @@ DateFormatSymbols::setYearNames(const UnicodeString* yearNames, int32_t count, DtContextType context, DtWidthType width) { if (context == FORMAT && width == ABBREVIATED) { - if (fShortYearNames) { - delete[] fShortYearNames; - } + delete[] fShortYearNames; fShortYearNames = newUnicodeStringArray(count); uprv_arrayCopy(yearNames, fShortYearNames, count); fShortYearNamesCount = count; @@ -913,9 +967,7 @@ DateFormatSymbols::setZodiacNames(const UnicodeString* zodiacNames, int32_t coun DtContextType context, DtWidthType width) { if (context == FORMAT && width == ABBREVIATED) { - if (fShortZodiacNames) { - delete[] fShortZodiacNames; - } + delete[] fShortZodiacNames; fShortZodiacNames = newUnicodeStringArray(count); uprv_arrayCopy(zodiacNames, fShortZodiacNames, count); fShortZodiacNamesCount = count; @@ -928,8 +980,7 @@ void DateFormatSymbols::setEras(const UnicodeString* erasArray, int32_t count) { // delete the old list if we own it - if (fEras) - delete[] fEras; + delete[] fEras; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -942,8 +993,7 @@ void DateFormatSymbols::setEraNames(const UnicodeString* eraNamesArray, int32_t count) { // delete the old list if we own it - if (fEraNames) - delete[] fEraNames; + delete[] fEraNames; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -956,8 +1006,7 @@ void DateFormatSymbols::setNarrowEras(const UnicodeString* narrowErasArray, int32_t count) { // delete the old list if we own it - if (fNarrowEras) - delete[] fNarrowEras; + delete[] fNarrowEras; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -970,8 +1019,7 @@ void DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count) { // delete the old list if we own it - if (fMonths) - delete[] fMonths; + delete[] fMonths; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -984,8 +1032,7 @@ void DateFormatSymbols::setShortMonths(const UnicodeString* shortMonthsArray, int32_t count) { // delete the old list if we own it - if (fShortMonths) - delete[] fShortMonths; + delete[] fShortMonths; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1005,22 +1052,19 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt case FORMAT : switch (width) { case WIDE : - if (fMonths) - delete[] fMonths; + delete[] fMonths; fMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fMonths,count); fMonthsCount = count; break; case ABBREVIATED : - if (fShortMonths) - delete[] fShortMonths; + delete[] fShortMonths; fShortMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fShortMonths,count); fShortMonthsCount = count; break; case NARROW : - if (fNarrowMonths) - delete[] fNarrowMonths; + delete[] fNarrowMonths; fNarrowMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fNarrowMonths,count); fNarrowMonthsCount = count; @@ -1032,22 +1076,19 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt case STANDALONE : switch (width) { case WIDE : - if (fStandaloneMonths) - delete[] fStandaloneMonths; + delete[] fStandaloneMonths; fStandaloneMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneMonths,count); fStandaloneMonthsCount = count; break; case ABBREVIATED : - if (fStandaloneShortMonths) - delete[] fStandaloneShortMonths; + delete[] fStandaloneShortMonths; fStandaloneShortMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneShortMonths,count); fStandaloneShortMonthsCount = count; break; case NARROW : - if (fStandaloneNarrowMonths) - delete[] fStandaloneNarrowMonths; + delete[] fStandaloneNarrowMonths; fStandaloneNarrowMonths = newUnicodeStringArray(count); uprv_arrayCopy( monthsArray,fStandaloneNarrowMonths,count); fStandaloneNarrowMonthsCount = count; @@ -1064,8 +1105,7 @@ DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, Dt void DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count) { // delete the old list if we own it - if (fWeekdays) - delete[] fWeekdays; + delete[] fWeekdays; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1078,8 +1118,7 @@ void DateFormatSymbols::setShortWeekdays(const UnicodeString* shortWeekdaysArray, int32_t count) { // delete the old list if we own it - if (fShortWeekdays) - delete[] fShortWeekdays; + delete[] fShortWeekdays; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) @@ -1099,29 +1138,25 @@ DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count case FORMAT : switch (width) { case WIDE : - if (fWeekdays) - delete[] fWeekdays; + delete[] fWeekdays; fWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fWeekdays, count); fWeekdaysCount = count; break; case ABBREVIATED : - if (fShortWeekdays) - delete[] fShortWeekdays; + delete[] fShortWeekdays; fShortWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fShortWeekdays, count); fShortWeekdaysCount = count; break; case SHORT : - if (fShorterWeekdays) - delete[] fShorterWeekdays; + delete[] fShorterWeekdays; fShorterWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fShorterWeekdays, count); fShorterWeekdaysCount = count; break; case NARROW : - if (fNarrowWeekdays) - delete[] fNarrowWeekdays; + delete[] fNarrowWeekdays; fNarrowWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fNarrowWeekdays, count); fNarrowWeekdaysCount = count; @@ -1133,29 +1168,25 @@ DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count case STANDALONE : switch (width) { case WIDE : - if (fStandaloneWeekdays) - delete[] fStandaloneWeekdays; + delete[] fStandaloneWeekdays; fStandaloneWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneWeekdays, count); fStandaloneWeekdaysCount = count; break; case ABBREVIATED : - if (fStandaloneShortWeekdays) - delete[] fStandaloneShortWeekdays; + delete[] fStandaloneShortWeekdays; fStandaloneShortWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneShortWeekdays, count); fStandaloneShortWeekdaysCount = count; break; case SHORT : - if (fStandaloneShorterWeekdays) - delete[] fStandaloneShorterWeekdays; + delete[] fStandaloneShorterWeekdays; fStandaloneShorterWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneShorterWeekdays, count); fStandaloneShorterWeekdaysCount = count; break; case NARROW : - if (fStandaloneNarrowWeekdays) - delete[] fStandaloneNarrowWeekdays; + delete[] fStandaloneNarrowWeekdays; fStandaloneNarrowWeekdays = newUnicodeStringArray(count); uprv_arrayCopy(weekdaysArray, fStandaloneNarrowWeekdays, count); fStandaloneNarrowWeekdaysCount = count; @@ -1180,22 +1211,19 @@ DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count case FORMAT : switch (width) { case WIDE : - if (fQuarters) - delete[] fQuarters; + delete[] fQuarters; fQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fQuarters,count); fQuartersCount = count; break; case ABBREVIATED : - if (fShortQuarters) - delete[] fShortQuarters; + delete[] fShortQuarters; fShortQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fShortQuarters,count); fShortQuartersCount = count; break; case NARROW : - if (fNarrowQuarters) - delete[] fNarrowQuarters; + delete[] fNarrowQuarters; fNarrowQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fNarrowQuarters,count); fNarrowQuartersCount = count; @@ -1207,22 +1235,19 @@ DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count case STANDALONE : switch (width) { case WIDE : - if (fStandaloneQuarters) - delete[] fStandaloneQuarters; + delete[] fStandaloneQuarters; fStandaloneQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneQuarters,count); fStandaloneQuartersCount = count; break; case ABBREVIATED : - if (fStandaloneShortQuarters) - delete[] fStandaloneShortQuarters; + delete[] fStandaloneShortQuarters; fStandaloneShortQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneShortQuarters,count); fStandaloneShortQuartersCount = count; break; case NARROW : - if (fStandaloneNarrowQuarters) - delete[] fStandaloneNarrowQuarters; + delete[] fStandaloneNarrowQuarters; fStandaloneNarrowQuarters = newUnicodeStringArray(count); uprv_arrayCopy( quartersArray,fStandaloneNarrowQuarters,count); fStandaloneNarrowQuartersCount = count; @@ -1239,14 +1264,38 @@ DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count void DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count) { + setAmPmStrings(amPmsArray, count, FORMAT, ABBREVIATED); +} + +void +DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count, DtContextType /*ignored*/, DtWidthType width) +{ + UnicodeString** targetArray; + int32_t* targetCount; + switch (width) { + case WIDE: + targetArray = &fWideAmPms; + targetCount = &fWideAmPmsCount; + break; + case NARROW: + targetArray = &fNarrowAmPms; + targetCount = &fNarrowAmPmsCount; + break; + case ABBREVIATED: + default: + targetArray = &fAmPms; + targetCount = &fAmPmsCount; + break; + } + // delete the old list if we own it - if (fAmPms) delete[] fAmPms; + delete[] *targetArray; // we always own the new list, which we create here (we duplicate rather // than adopting the list passed in) - fAmPms = newUnicodeStringArray(count); - uprv_arrayCopy(amPmsArray,fAmPms,count); - fAmPmsCount = count; + *targetArray = newUnicodeStringArray(count); + uprv_arrayCopy(amPmsArray,*targetArray,count); + *targetCount = count; } void @@ -1264,7 +1313,7 @@ DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const umtx_lock(&LOCK); if (fZoneStrings == nullptr) { if (fLocaleZoneStrings == nullptr) { - ((DateFormatSymbols*)this)->initZoneStringsArray(); + const_cast<DateFormatSymbols*>(this)->initZoneStringsArray(); } result = (const UnicodeString**)fLocaleZoneStrings; } else { @@ -1310,7 +1359,7 @@ DateFormatSymbols::initZoneStringsArray() { // Allocate array int32_t size = rows * sizeof(UnicodeString*); - zarray = (UnicodeString**)uprv_malloc(size); + zarray = static_cast<UnicodeString**>(uprv_malloc(size)); if (zarray == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; break; @@ -1326,7 +1375,7 @@ DateFormatSymbols::initZoneStringsArray() { UDate now = Calendar::getNow(); UnicodeString tzDispName; - while ((tzid = tzids->snext(status)) != 0) { + while ((tzid = tzids->snext(status)) != nullptr) { if (U_FAILURE(status)) { break; } @@ -1356,12 +1405,8 @@ DateFormatSymbols::initZoneStringsArray() { } } - if (tzNames) { - delete tzNames; - } - if (tzids) { - delete tzids; - } + delete tzNames; + delete tzids; fLocaleZoneStrings = zarray; fZoneStringsRowCount = rows; @@ -1378,7 +1423,7 @@ DateFormatSymbols::setZoneStrings(const UnicodeString* const *strings, int32_t r // than adopting the list passed in) fZoneStringsRowCount = rowCount; fZoneStringsColCount = columnCount; - createZoneStrings((const UnicodeString**)strings); + createZoneStrings(const_cast<const UnicodeString**>(strings)); } //------------------------------------------------------ @@ -1391,48 +1436,47 @@ DateFormatSymbols::getPatternUChars() UDateFormatField U_EXPORT2 DateFormatSymbols::getPatternCharIndex(char16_t c) { - const char16_t *p = u_strchr(gPatternChars, c); - if (p == nullptr) { + if (c >= UPRV_LENGTHOF(gLookupPatternChars)) { return UDAT_FIELD_COUNT; - } else { - return static_cast<UDateFormatField>(p - gPatternChars); } + const auto idx = gLookupPatternChars[c]; + return idx == -1 ? UDAT_FIELD_COUNT : static_cast<UDateFormatField>(idx); } static const uint64_t kNumericFieldsAlways = - ((uint64_t)1 << UDAT_YEAR_FIELD) | // y - ((uint64_t)1 << UDAT_DATE_FIELD) | // d - ((uint64_t)1 << UDAT_HOUR_OF_DAY1_FIELD) | // k - ((uint64_t)1 << UDAT_HOUR_OF_DAY0_FIELD) | // H - ((uint64_t)1 << UDAT_MINUTE_FIELD) | // m - ((uint64_t)1 << UDAT_SECOND_FIELD) | // s - ((uint64_t)1 << UDAT_FRACTIONAL_SECOND_FIELD) | // S - ((uint64_t)1 << UDAT_DAY_OF_YEAR_FIELD) | // D - ((uint64_t)1 << UDAT_DAY_OF_WEEK_IN_MONTH_FIELD) | // F - ((uint64_t)1 << UDAT_WEEK_OF_YEAR_FIELD) | // w - ((uint64_t)1 << UDAT_WEEK_OF_MONTH_FIELD) | // W - ((uint64_t)1 << UDAT_HOUR1_FIELD) | // h - ((uint64_t)1 << UDAT_HOUR0_FIELD) | // K - ((uint64_t)1 << UDAT_YEAR_WOY_FIELD) | // Y - ((uint64_t)1 << UDAT_EXTENDED_YEAR_FIELD) | // u - ((uint64_t)1 << UDAT_JULIAN_DAY_FIELD) | // g - ((uint64_t)1 << UDAT_MILLISECONDS_IN_DAY_FIELD) | // A - ((uint64_t)1 << UDAT_RELATED_YEAR_FIELD); // r + (static_cast<uint64_t>(1) << UDAT_YEAR_FIELD) | // y + (static_cast<uint64_t>(1) << UDAT_DATE_FIELD) | // d + (static_cast<uint64_t>(1) << UDAT_HOUR_OF_DAY1_FIELD) | // k + (static_cast<uint64_t>(1) << UDAT_HOUR_OF_DAY0_FIELD) | // H + (static_cast<uint64_t>(1) << UDAT_MINUTE_FIELD) | // m + (static_cast<uint64_t>(1) << UDAT_SECOND_FIELD) | // s + (static_cast<uint64_t>(1) << UDAT_FRACTIONAL_SECOND_FIELD) | // S + (static_cast<uint64_t>(1) << UDAT_DAY_OF_YEAR_FIELD) | // D + (static_cast<uint64_t>(1) << UDAT_DAY_OF_WEEK_IN_MONTH_FIELD) | // F + (static_cast<uint64_t>(1) << UDAT_WEEK_OF_YEAR_FIELD) | // w + (static_cast<uint64_t>(1) << UDAT_WEEK_OF_MONTH_FIELD) | // W + (static_cast<uint64_t>(1) << UDAT_HOUR1_FIELD) | // h + (static_cast<uint64_t>(1) << UDAT_HOUR0_FIELD) | // K + (static_cast<uint64_t>(1) << UDAT_YEAR_WOY_FIELD) | // Y + (static_cast<uint64_t>(1) << UDAT_EXTENDED_YEAR_FIELD) | // u + (static_cast<uint64_t>(1) << UDAT_JULIAN_DAY_FIELD) | // g + (static_cast<uint64_t>(1) << UDAT_MILLISECONDS_IN_DAY_FIELD) | // A + (static_cast<uint64_t>(1) << UDAT_RELATED_YEAR_FIELD); // r static const uint64_t kNumericFieldsForCount12 = - ((uint64_t)1 << UDAT_MONTH_FIELD) | // M or MM - ((uint64_t)1 << UDAT_DOW_LOCAL_FIELD) | // e or ee - ((uint64_t)1 << UDAT_STANDALONE_DAY_FIELD) | // c or cc - ((uint64_t)1 << UDAT_STANDALONE_MONTH_FIELD) | // L or LL - ((uint64_t)1 << UDAT_QUARTER_FIELD) | // Q or QQ - ((uint64_t)1 << UDAT_STANDALONE_QUARTER_FIELD); // q or qq + (static_cast<uint64_t>(1) << UDAT_MONTH_FIELD) | // M or MM + (static_cast<uint64_t>(1) << UDAT_DOW_LOCAL_FIELD) | // e or ee + (static_cast<uint64_t>(1) << UDAT_STANDALONE_DAY_FIELD) | // c or cc + (static_cast<uint64_t>(1) << UDAT_STANDALONE_MONTH_FIELD) | // L or LL + (static_cast<uint64_t>(1) << UDAT_QUARTER_FIELD) | // Q or QQ + (static_cast<uint64_t>(1) << UDAT_STANDALONE_QUARTER_FIELD); // q or qq UBool U_EXPORT2 DateFormatSymbols::isNumericField(UDateFormatField f, int32_t count) { if (f == UDAT_FIELD_COUNT) { return false; } - uint64_t flag = ((uint64_t)1 << f); + uint64_t flag = static_cast<uint64_t>(1) << f; return ((kNumericFieldsAlways & flag) != 0 || ((kNumericFieldsForCount12 & flag) != 0 && count < 3)); } @@ -1463,35 +1507,35 @@ DateFormatSymbols::setLocalPatternChars(const UnicodeString& newLocalPatternChar namespace { // Constants declarations -static const char16_t kCalendarAliasPrefixUChar[] = { +const char16_t kCalendarAliasPrefixUChar[] = { SOLIDUS, CAP_L, CAP_O, CAP_C, CAP_A, CAP_L, CAP_E, SOLIDUS, LOW_C, LOW_A, LOW_L, LOW_E, LOW_N, LOW_D, LOW_A, LOW_R, SOLIDUS }; -static const char16_t kGregorianTagUChar[] = { +const char16_t kGregorianTagUChar[] = { LOW_G, LOW_R, LOW_E, LOW_G, LOW_O, LOW_R, LOW_I, LOW_A, LOW_N }; -static const char16_t kVariantTagUChar[] = { +const char16_t kVariantTagUChar[] = { PERCENT, LOW_V, LOW_A, LOW_R, LOW_I, LOW_A, LOW_N, LOW_T }; -static const char16_t kLeapTagUChar[] = { +const char16_t kLeapTagUChar[] = { LOW_L, LOW_E, LOW_A, LOW_P }; -static const char16_t kCyclicNameSetsTagUChar[] = { +const char16_t kCyclicNameSetsTagUChar[] = { LOW_C, LOW_Y, LOW_C, LOW_L, LOW_I, LOW_C, CAP_N, LOW_A, LOW_M, LOW_E, CAP_S, LOW_E, LOW_T, LOW_S }; -static const char16_t kYearsTagUChar[] = { +const char16_t kYearsTagUChar[] = { SOLIDUS, LOW_Y, LOW_E, LOW_A, LOW_R, LOW_S }; -static const char16_t kZodiacsUChar[] = { +const char16_t kZodiacsUChar[] = { SOLIDUS, LOW_Z, LOW_O, LOW_D, LOW_I, LOW_A, LOW_C, LOW_S }; -static const char16_t kDayPartsTagUChar[] = { +const char16_t kDayPartsTagUChar[] = { SOLIDUS, LOW_D, LOW_A, LOW_Y, CAP_P, LOW_A, LOW_R, LOW_T, LOW_S }; -static const char16_t kFormatTagUChar[] = { +const char16_t kFormatTagUChar[] = { SOLIDUS, LOW_F, LOW_O, LOW_R, LOW_M, LOW_A, LOW_T }; -static const char16_t kAbbrTagUChar[] = { +const char16_t kAbbrTagUChar[] = { SOLIDUS, LOW_A, LOW_B, LOW_B, LOW_R, LOW_E, LOW_V, LOW_I, LOW_A, LOW_T, LOW_E, LOW_D }; @@ -1635,11 +1679,11 @@ struct CalendarDataSink : public ResourceSink { modified = false; for (int32_t i = 0; i < aliasPathPairs.size();) { UBool mod = false; - UnicodeString *alias = (UnicodeString*)aliasPathPairs[i]; + UnicodeString* alias = static_cast<UnicodeString*>(aliasPathPairs[i]); UnicodeString *aliasArray; Hashtable *aliasMap; - if ((aliasArray = (UnicodeString*)arrays.get(*alias)) != nullptr) { - UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; + if ((aliasArray = static_cast<UnicodeString*>(arrays.get(*alias))) != nullptr) { + UnicodeString* path = static_cast<UnicodeString*>(aliasPathPairs[i + 1]); if (arrays.get(*path) == nullptr) { // Clone the array int32_t aliasArraySize = arraySizes.geti(*alias); @@ -1652,8 +1696,8 @@ struct CalendarDataSink : public ResourceSink { } if (U_FAILURE(errorCode)) { return; } mod = true; - } else if ((aliasMap = (Hashtable*)maps.get(*alias)) != nullptr) { - UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; + } else if ((aliasMap = static_cast<Hashtable*>(maps.get(*alias))) != nullptr) { + UnicodeString* path = static_cast<UnicodeString*>(aliasPathPairs[i + 1]); if (maps.get(*path) == nullptr) { maps.put(*path, aliasMap, errorCode); } @@ -1857,12 +1901,12 @@ static void initField(UnicodeString **field, int32_t& length, const char16_t *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status) { if (U_SUCCESS(status)) { length = numStr; - *field = newUnicodeStringArray((size_t)numStr); + *field = newUnicodeStringArray(static_cast<size_t>(numStr)); if (*field) { for(int32_t i = 0; i<length; i++) { // readonly aliases - all "data" strings are constant // -1 as length for variable-length strings (gLastResortDayNames[0] is empty) - (*(field)+i)->setTo(true, data+(i*((int32_t)strLen)), -1); + (*(field) + i)->setTo(true, data + (i * (static_cast<int32_t>(strLen))), -1); } } else { @@ -1912,6 +1956,51 @@ initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharSt } } +static void +initEras(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, const UResourceBundle *ctebPtr, const char* eraWidth, int32_t maxEra, UErrorCode &status) { + if (U_SUCCESS(status)) { + length = 0; + UnicodeString keyUString(key.data(), -1, US_INV); + Hashtable *eraNamesTable = static_cast<Hashtable*>(sink.maps.get(keyUString)); + + if (eraNamesTable != nullptr) { + UErrorCode resStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer ctewb(ures_getByKeyWithFallback(ctebPtr, eraWidth, nullptr, &resStatus)); + const UResourceBundle *ctewbPtr = (U_SUCCESS(resStatus))? ctewb.getAlias() : nullptr; + *field = new UnicodeString[maxEra + 1]; + if (*field == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + length = maxEra + 1; + for (int32_t eraCode = 0; eraCode <= maxEra; eraCode++) { + char eraCodeStr[12]; // T_CString_integerToString is documented to generate at most 12 bytes including nul terminator + int32_t eraCodeStrLen = T_CString_integerToString(eraCodeStr, eraCode, 10); + UnicodeString eraCodeKey = UnicodeString(eraCodeStr, eraCodeStrLen, US_INV); + UnicodeString *eraName = static_cast<UnicodeString*>(eraNamesTable->get(eraCodeKey)); + (*field)[eraCode].remove(); + if (eraName != nullptr) { + // Get eraName from map (created by CalendarSink) + (*field)[eraCode].fastCopyFrom(*eraName); + } else if (ctewbPtr != nullptr) { + // Try filling in missing items from parent locale(s) + resStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer ctewkb(ures_getByKeyWithFallback(ctewbPtr, eraCodeStr, nullptr, &resStatus)); + if (U_SUCCESS(resStatus)) { + int32_t eraNameLen; + const UChar* eraNamePtr = ures_getString(ctewkb.getAlias(), &eraNameLen, &resStatus); + if (U_SUCCESS(resStatus)) { + (*field)[eraCode].setTo(false, eraNamePtr, eraNameLen); + } + } + } + } + return; + } + status = U_MISSING_RESOURCE_ERROR; + } +} + static void initLeapMonthPattern(UnicodeString *field, int32_t index, CalendarDataSink &sink, CharString &path, UErrorCode &status) { field[index].remove(); @@ -1978,7 +2067,7 @@ static const ContextUsageTypeNameToEnumValue contextUsageTypeMap[] = { { "month-standalone-except-narrow", DateFormatSymbols::kCapContextUsageMonthStandalone }, { "zone-long", DateFormatSymbols::kCapContextUsageZoneLong }, { "zone-short", DateFormatSymbols::kCapContextUsageZoneShort }, - { nullptr, (DateFormatSymbols::ECapitalizationContextUsageType)0 }, + { nullptr, static_cast<DateFormatSymbols::ECapitalizationContextUsageType>(0) }, }; // Resource keys to look up localized strings for day periods. @@ -2062,6 +2151,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError fStandaloneNarrowWeekdaysCount=0; fAmPms = nullptr; fAmPmsCount=0; + fWideAmPms = nullptr; + fWideAmPmsCount=0; fNarrowAmPms = nullptr; fNarrowAmPmsCount=0; fTimeSeparator.setToBogus(); @@ -2111,8 +2202,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Create a CalendarDataSink to process this data and the resource bundles CalendarDataSink calendarSink(status); - UResourceBundle *rb = ures_open(nullptr, locale.getBaseName(), &status); - UResourceBundle *cb = ures_getByKey(rb, gCalendarTag, nullptr, &status); + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status)); + LocalUResourceBundlePointer cb(ures_getByKey(rb.getAlias(), gCalendarTag, nullptr, &status)); if (U_FAILURE(status)) return; @@ -2126,9 +2217,8 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Enumerate this calendar type. If the calendar is not found fallback to gregorian UErrorCode oldStatus = status; - UResourceBundle *ctb = ures_getByKeyWithFallback(cb, calendarTypeCArray, nullptr, &status); + LocalUResourceBundlePointer ctb(ures_getByKeyWithFallback(cb.getAlias(), calendarTypeCArray, nullptr, &status)); if (status == U_MISSING_RESOURCE_ERROR) { - ures_close(ctb); if (uprv_strcmp(calendarTypeCArray, gGregorianTag) != 0) { calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); calendarSink.visitAllResources(); @@ -2139,8 +2229,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } calendarSink.preEnumerate(calendarType); - ures_getAllItemsWithFallback(ctb, "", calendarSink, status); - ures_close(ctb); + ures_getAllItemsWithFallback(ctb.getAlias(), "", calendarSink, status); if (U_FAILURE(status)) break; // Stop loading when gregorian was loaded @@ -2211,15 +2300,16 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Load context transforms and capitalization tempStatus = U_ZERO_ERROR; - UResourceBundle *localeBundle = ures_open(nullptr, locale.getName(), &tempStatus); + LocalUResourceBundlePointer localeBundle(ures_open(nullptr, locale.getName(), &tempStatus)); if (U_SUCCESS(tempStatus)) { - UResourceBundle *contextTransforms = ures_getByKeyWithFallback(localeBundle, gContextTransformsTag, nullptr, &tempStatus); + LocalUResourceBundlePointer contextTransforms(ures_getByKeyWithFallback(localeBundle.getAlias(), gContextTransformsTag, nullptr, &tempStatus)); if (U_SUCCESS(tempStatus)) { - UResourceBundle *contextTransformUsage; - while ( (contextTransformUsage = ures_getNextResource(contextTransforms, nullptr, &tempStatus)) != nullptr ) { - const int32_t * intVector = ures_getIntVector(contextTransformUsage, &len, &status); + for (LocalUResourceBundlePointer contextTransformUsage; + contextTransformUsage.adoptInstead(ures_getNextResource(contextTransforms.getAlias(), nullptr, &tempStatus)), + contextTransformUsage.isValid();) { + const int32_t * intVector = ures_getIntVector(contextTransformUsage.getAlias(), &len, &status); if (U_SUCCESS(tempStatus) && intVector != nullptr && len >= 2) { - const char* usageType = ures_getKey(contextTransformUsage); + const char* usageType = ures_getKey(contextTransformUsage.getAlias()); if (usageType != nullptr) { const ContextUsageTypeNameToEnumValue * typeMapPtr = contextUsageTypeMap; int32_t compResult = 0; @@ -2234,9 +2324,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } } tempStatus = U_ZERO_ERROR; - ures_close(contextTransformUsage); } - ures_close(contextTransforms); } tempStatus = U_ZERO_ERROR; @@ -2247,7 +2335,7 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // do nothing unless U_SUCCESS(tempStatus), so it's only necessary // to check for errors once after all calls are made. const LocalUResourceBundlePointer numberElementsData(ures_getByKeyWithFallback( - localeBundle, gNumberElementsTag, nullptr, &tempStatus)); + localeBundle.getAlias(), gNumberElementsTag, nullptr, &tempStatus)); const LocalUResourceBundlePointer nsNameData(ures_getByKeyWithFallback( numberElementsData.getAlias(), numberingSystem->getName(), nullptr, &tempStatus)); const LocalUResourceBundlePointer symbolsData(ures_getByKeyWithFallback( @@ -2259,7 +2347,6 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } } - ures_close(localeBundle); } if (fTimeSeparator.isBogus()) { @@ -2310,24 +2397,36 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError } } - U_LOCALE_BASED(locBased, *this); // if we make it to here, the resource data is cool, and we can get everything out // of it that we need except for the time-zone and localized-pattern data, which // are stored in a separate file - locBased.setLocaleIDs(ures_getLocaleByType(cb, ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(cb, ULOC_ACTUAL_LOCALE, &status)); - + validLocale = Locale(ures_getLocaleByType(cb.getAlias(), ULOC_VALID_LOCALE, &status)); + actualLocale = Locale(ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status)); + + // Era setup + if (type == nullptr) { + type = "gregorian"; + } + LocalPointer<EraRules> eraRules(EraRules::createInstance(type, false, status)); + int32_t maxEra = (U_SUCCESS(status))? eraRules->getMaxEraCode(): 0; + UErrorCode resStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer ctpb(ures_getByKeyWithFallback(cb.getAlias(), type, nullptr, &resStatus)); + LocalUResourceBundlePointer cteb(ures_getByKeyWithFallback(ctpb.getAlias(), gErasTag, nullptr, &resStatus)); + const UResourceBundle *ctebPtr = (U_SUCCESS(resStatus))? cteb.getAlias() : nullptr; // Load eras - initField(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), status); + initEras(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), + ctebPtr, gNamesAbbrTag, maxEra, status); UErrorCode oldStatus = status; - initField(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), status); + initEras(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), + ctebPtr, gNamesWideTag, maxEra, status); if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 status = oldStatus; assignArray(fEraNames, fEraNamesCount, fEras, fErasCount); } // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too oldStatus = status; - initField(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), status); + initEras(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), + ctebPtr, gNamesNarrowTag, maxEra, status); if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 status = oldStatus; assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount); @@ -2369,25 +2468,28 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fShortMonths, fShortMonthsCount); } - // Load AM/PM markers; if wide or narrow not available, use short - UErrorCode ampmStatus = U_ZERO_ERROR; + // Load AM/PM markers. + ErrorCode ampmStatus; initField(&fAmPms, fAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersTag, ampmStatus), ampmStatus); - if (U_FAILURE(ampmStatus)) { - initField(&fAmPms, fAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersAbbrTag, status), status); + buildResourcePath(path, gAmPmMarkersAbbrTag, ampmStatus), ampmStatus); + if (ampmStatus.isFailure()) { + // No-op: fall back to last-resort names, which are pre-populated } - ampmStatus = U_ZERO_ERROR; + ampmStatus.reset(); initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink, buildResourcePath(path, gAmPmMarkersNarrowTag, ampmStatus), ampmStatus); - if (U_FAILURE(ampmStatus)) { - initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersAbbrTag, status), status); - } - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; + if (ampmStatus.isFailure()) { + // Narrow falls back to Abbreviated assignArray(fNarrowAmPms, fNarrowAmPmsCount, fAmPms, fAmPmsCount); } + ampmStatus.reset(); + initField(&fWideAmPms, fWideAmPmsCount, calendarSink, + buildResourcePath(path, gAmPmMarkersTag, ampmStatus), ampmStatus); + if (ampmStatus.isFailure()) { + // Wide falls back to Abbreviated + assignArray(fWideAmPms, fWideAmPmsCount, fAmPms, fAmPmsCount); + } + ampmStatus.reset(); // Load quarters initField(&fQuarters, fQuartersCount, calendarSink, @@ -2509,44 +2611,39 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError status = U_USING_FALLBACK_WARNING; //TODO(fabalbon): make sure we are storing las resort data for all fields in here. - initField(&fEras, fErasCount, (const char16_t *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fEraNames, fEraNamesCount, (const char16_t *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fNarrowEras, fNarrowErasCount, (const char16_t *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fMonths, fMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fShortMonths, fShortMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fNarrowMonths, fNarrowMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneMonths, fStandaloneMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, (const char16_t *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fWeekdays, fWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fShortWeekdays, fShortWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fShorterWeekdays, fShorterWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fNarrowWeekdays, fNarrowWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, (const char16_t *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fAmPms, fAmPmsCount, (const char16_t *)gLastResortAmPmMarkers, kAmPmNum, kAmPmLen, status); - initField(&fNarrowAmPms, fNarrowAmPmsCount, (const char16_t *)gLastResortAmPmMarkers, kAmPmNum, kAmPmLen, status); - initField(&fQuarters, fQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fShortQuarters, fShortQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fNarrowQuarters, fNarrowQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fStandaloneQuarters, fStandaloneQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, (const char16_t *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); + initField(&fEras, fErasCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status); + initField(&fEraNames, fEraNamesCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status); + initField(&fNarrowEras, fNarrowErasCount, reinterpret_cast<const char16_t*>(gLastResortEras), kEraNum, kEraLen, status); + initField(&fMonths, fMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fShortMonths, fShortMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fNarrowMonths, fNarrowMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fStandaloneMonths, fStandaloneMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, reinterpret_cast<const char16_t*>(gLastResortMonthNames), kMonthNum, kMonthLen, status); + initField(&fWeekdays, fWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fShortWeekdays, fShortWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fShorterWeekdays, fShorterWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fNarrowWeekdays, fNarrowWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, reinterpret_cast<const char16_t*>(gLastResortDayNames), kDayNum, kDayLen, status); + initField(&fAmPms, fAmPmsCount, reinterpret_cast<const char16_t*>(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status); + initField(&fNarrowAmPms, fNarrowAmPmsCount, reinterpret_cast<const char16_t*>(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status); + initField(&fQuarters, fQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); + initField(&fShortQuarters, fShortQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); + initField(&fNarrowQuarters, fNarrowQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); + initField(&fStandaloneQuarters, fStandaloneQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); + initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); + initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, reinterpret_cast<const char16_t*>(gLastResortQuarters), kQuarterNum, kQuarterLen, status); fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN); } } - - // Close resources - ures_close(cb); - ures_close(rb); } Locale DateFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dtitvfmt.cpp b/deps/icu-small/source/i18n/dtitvfmt.cpp index 608701466819f4..985aabda0402ca 100644 --- a/deps/icu-small/source/i18n/dtitvfmt.cpp +++ b/deps/icu-small/source/i18n/dtitvfmt.cpp @@ -641,7 +641,7 @@ DateIntervalFormat::setContext(UDisplayContext value, UErrorCode& status) { if (U_FAILURE(status)) return; - if ( (UDisplayContextType)((uint32_t)value >> 8) == UDISPCTX_TYPE_CAPITALIZATION ) { + if (static_cast<UDisplayContextType>(static_cast<uint32_t>(value) >> 8) == UDISPCTX_TYPE_CAPITALIZATION) { fCapitalizationContext = value; } else { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -652,10 +652,10 @@ UDisplayContext DateIntervalFormat::getContext(UDisplayContextType type, UErrorCode& status) const { if (U_FAILURE(status)) - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); if (type != UDISPCTX_TYPE_CAPITALIZATION) { status = U_ILLEGAL_ARGUMENT_ERROR; - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); } return fCapitalizationContext; } @@ -706,7 +706,7 @@ DateIntervalFormat::create(const Locale& locale, } else if ( U_FAILURE(status) ) { // safe to delete f, although nothing actually is saved delete f; - f = 0; + f = nullptr; } return f; } @@ -829,7 +829,7 @@ DateIntervalFormat::initializePattern(UErrorCode& status) { int32_t dateTimeFormatLength; const char16_t* dateTimeFormat = ures_getStringByIndex( dateTimePatternsRes.getAlias(), - (int32_t)DateFormat::kDateTime, + static_cast<int32_t>(DateFormat::kDateTime), &dateTimeFormatLength, &status); if ( U_SUCCESS(status) && dateTimeFormatLength >= 3 ) { fDateTimeFormat = new UnicodeString(dateTimeFormat, dateTimeFormatLength); @@ -1477,7 +1477,7 @@ DateIntervalFormat::setIntervalPattern(UCalendarDateFields field, // look for the best match skeleton, for example: "yMMM" const UnicodeString* tmpBest = fInfo->getBestSkeleton( *extendedBestSkeleton, differenceInfo); - if ( tmpBest != 0 && differenceInfo != -1 ) { + if (tmpBest != nullptr && differenceInfo != -1) { fInfo->getIntervalPattern(*tmpBest, field, pattern, status); bestSkeleton = tmpBest; } @@ -1538,7 +1538,7 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) if (ch != prevCh && count > 0) { // check the repeativeness of pattern letter - UBool repeated = patternRepeated[(int)(prevCh - PATTERN_CHAR_BASE)]; + UBool repeated = patternRepeated[prevCh - PATTERN_CHAR_BASE]; if ( repeated == false ) { patternRepeated[prevCh - PATTERN_CHAR_BASE] = true; } else { @@ -1569,7 +1569,7 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) // "d-d"(last char repeated ), and // "d-d MM" ( repetition found ) if ( count > 0 && foundRepetition == false ) { - if ( patternRepeated[(int)(prevCh - PATTERN_CHAR_BASE)] == false ) { + if (patternRepeated[prevCh - PATTERN_CHAR_BASE] == false) { count = 0; } } @@ -1774,8 +1774,8 @@ DateIntervalFormat::adjustFieldWidth(const UnicodeString& inputSkeleton, // for skeleton "M+", the pattern might be "...L..." skeletonChar = CAP_M; } - int32_t fieldCount = bestMatchSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; - int32_t inputFieldCount = inputSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; + int32_t fieldCount = bestMatchSkeletonFieldWidth[skeletonChar - PATTERN_CHAR_BASE]; + int32_t inputFieldCount = inputSkeletonFieldWidth[skeletonChar - PATTERN_CHAR_BASE]; if ( fieldCount == count && inputFieldCount > fieldCount ) { count = inputFieldCount - fieldCount; int32_t j; @@ -1813,8 +1813,8 @@ DateIntervalFormat::adjustFieldWidth(const UnicodeString& inputSkeleton, // for skeleton "M+", the pattern might be "...L..." skeletonChar = CAP_M; } - int32_t fieldCount = bestMatchSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; - int32_t inputFieldCount = inputSkeletonFieldWidth[(int)(skeletonChar - PATTERN_CHAR_BASE)]; + int32_t fieldCount = bestMatchSkeletonFieldWidth[skeletonChar - PATTERN_CHAR_BASE]; + int32_t inputFieldCount = inputSkeletonFieldWidth[skeletonChar - PATTERN_CHAR_BASE]; if ( fieldCount == count && inputFieldCount > fieldCount ) { count = inputFieldCount - fieldCount; int32_t j; diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index c4b6bbcf401a9a..6a1e48fbe32a32 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -23,7 +23,6 @@ #include <iostream> #endif -#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "unicode/msgfmt.h" @@ -189,7 +188,7 @@ DateIntervalInfo::getIntervalPattern(const UnicodeString& skeleton, return result; } - const UnicodeString* patternsOfOneSkeleton = (UnicodeString*) fIntervalPatterns->get(skeleton); + const UnicodeString* patternsOfOneSkeleton = static_cast<UnicodeString*>(fIntervalPatterns->get(skeleton)); if ( patternsOfOneSkeleton != nullptr ) { IntervalPatternIndex index = calendarFieldToIntervalIndex(field, status); if ( U_FAILURE(status) ) { @@ -365,7 +364,7 @@ struct DateIntervalInfo::DateIntervalSink : public ResourceSink { UnicodeString skeleton(currentSkeleton, -1, US_INV); UnicodeString* patternsOfOneSkeleton = - (UnicodeString*)(dateIntervalInfo.fIntervalPatterns->get(skeleton)); + static_cast<UnicodeString*>(dateIntervalInfo.fIntervalPatterns->get(skeleton)); if (patternsOfOneSkeleton == nullptr || patternsOfOneSkeleton[index].isEmpty()) { UnicodeString pattern = value.getUnicodeString(errorCode); @@ -405,11 +404,7 @@ DateIntervalInfo::initializeData(const Locale& locale, UErrorCode& status) "calendar", "calendar", locName, nullptr, false, &status); localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination // now get the calendar key value from that locale - CharString calendarType; - { - CharStringByteSink sink(&calendarType); - ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", sink, &status); - } + CharString calendarType = ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", status); if (U_SUCCESS(status)) { calendarTypeToUse = calendarType.data(); } @@ -496,7 +491,7 @@ DateIntervalInfo::setIntervalPatternInternally(const UnicodeString& skeleton, if ( U_FAILURE(status) ) { return; } - UnicodeString* patternsOfOneSkeleton = (UnicodeString*)(fIntervalPatterns->get(skeleton)); + UnicodeString* patternsOfOneSkeleton = static_cast<UnicodeString*>(fIntervalPatterns->get(skeleton)); UBool emptyHash = false; if ( patternsOfOneSkeleton == nullptr ) { patternsOfOneSkeleton = new UnicodeString[kIPI_MAX_INDEX]; @@ -522,7 +517,7 @@ DateIntervalInfo::parseSkeleton(const UnicodeString& skeleton, int32_t i; for ( i = 0; i < skeleton.length(); ++i ) { // it is an ASCII char in skeleton - int8_t ch = (int8_t)skeleton.charAt(i); + int8_t ch = static_cast<int8_t>(skeleton.charAt(i)); ++skeletonFieldWidth[ch - PATTERN_CHAR_BASE]; } } @@ -617,7 +612,7 @@ DateIntervalInfo::getBestSkeleton(const UnicodeString& skeleton, const UHashElement* elem = nullptr; while ( (elem = fIntervalPatterns->nextElement(pos)) != nullptr ) { const UHashTok keyTok = elem->key; - UnicodeString* newSkeleton = (UnicodeString*)keyTok.pointer; + UnicodeString* newSkeleton = static_cast<UnicodeString*>(keyTok.pointer); #ifdef DTITVINF_DEBUG skeleton->extract(0, skeleton->length(), result, "UTF-8"); snprintf(mesg, sizeof(mesg), "available skeletons: skeleton: %s; \n", result); @@ -646,7 +641,7 @@ DateIntervalInfo::getBestSkeleton(const UnicodeString& skeleton, fieldDifference = -1; distance += DIFFERENT_FIELD; } else if (stringNumeric(inputFieldWidth, fieldWidth, - (char)(i+BASE) ) ) { + static_cast<char>(i + BASE))) { distance += STRING_NUMERIC_DIFFERENCE; } else { distance += (inputFieldWidth > fieldWidth) ? @@ -728,7 +723,7 @@ DateIntervalInfo::deleteHash(Hashtable* hTable) const UHashElement* element = nullptr; while ( (element = hTable->nextElement(pos)) != nullptr ) { const UHashTok valueTok = element->value; - const UnicodeString* value = (UnicodeString*)valueTok.pointer; + const UnicodeString* value = static_cast<UnicodeString*>(valueTok.pointer); delete[] value; } delete fIntervalPatterns; @@ -792,9 +787,9 @@ DateIntervalInfo::copyHash(const Hashtable* source, if ( source ) { while ( (element = source->nextElement(pos)) != nullptr ) { const UHashTok keyTok = element->key; - const UnicodeString* key = (UnicodeString*)keyTok.pointer; + const UnicodeString* key = static_cast<UnicodeString*>(keyTok.pointer); const UHashTok valueTok = element->value; - const UnicodeString* value = (UnicodeString*)valueTok.pointer; + const UnicodeString* value = static_cast<UnicodeString*>(valueTok.pointer); UnicodeString* copy = new UnicodeString[kIPI_MAX_INDEX]; if (copy == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index aa23b7cd4a6148..97219c1047824a 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -29,7 +29,6 @@ #include "unicode/ustring.h" #include "unicode/rep.h" #include "unicode/region.h" -#include "bytesinkutil.h" #include "cpputils.h" #include "mutex.h" #include "umutex.h" @@ -464,15 +463,12 @@ DateTimePatternGenerator::operator!=(const DateTimePatternGenerator& other) cons } DateTimePatternGenerator::~DateTimePatternGenerator() { - if (fAvailableFormatKeyHash!=nullptr) { - delete fAvailableFormatKeyHash; - } - - if (fp != nullptr) delete fp; - if (dtMatcher != nullptr) delete dtMatcher; - if (distanceInfo != nullptr) delete distanceInfo; - if (patternMap != nullptr) delete patternMap; - if (skipMatcher != nullptr) delete skipMatcher; + delete fAvailableFormatKeyHash; + delete fp; + delete dtMatcher; + delete distanceInfo; + delete patternMap; + delete skipMatcher; } namespace { @@ -511,6 +507,11 @@ enum AllowedHourFormat{ void DateTimePatternGenerator::initData(const Locale& locale, UErrorCode &status, UBool skipStdPatterns) { //const char *baseLangName = locale.getBaseName(); // unused + if (U_FAILURE(status)) { return; } + if (locale.isBogus()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } skipMatcher = nullptr; fAvailableFormatKeyHash=nullptr; @@ -646,9 +647,9 @@ static int32_t* getAllowedHourFormatsLangCountry(const char* language, const cha langCountry.append(country, status); int32_t* allowedFormats; - allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, langCountry.data()); + allowedFormats = static_cast<int32_t*>(uhash_get(localeToAllowedHourFormatsMap, langCountry.data())); if (allowedFormats == nullptr) { - allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, const_cast<char *>(country)); + allowedFormats = static_cast<int32_t*>(uhash_get(localeToAllowedHourFormatsMap, const_cast<char*>(country))); } return allowedFormats; @@ -658,10 +659,9 @@ void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErro if (U_FAILURE(status)) { return; } const char *language = locale.getLanguage(); - char baseCountry[8]; - ulocimp_getRegionForSupplementalData(locale.getName(), false, baseCountry, 8, &status); - const char* country = baseCountry; - + CharString baseCountry = ulocimp_getRegionForSupplementalData(locale.getName(), false, status); + const char* country = baseCountry.data(); + Locale maxLocale; // must be here for correct lifetime if (*language == '\0' || *country == '\0') { maxLocale = locale; @@ -803,38 +803,58 @@ DateTimePatternGenerator::staticGetBaseSkeleton( void DateTimePatternGenerator::addICUPatterns(const Locale& locale, UErrorCode& status) { - if (U_FAILURE(status)) { return; } - UnicodeString dfPattern; - UnicodeString conflictingString; - DateFormat* df; - - // Load with ICU patterns - for (int32_t i=DateFormat::kFull; i<=DateFormat::kShort; i++) { - DateFormat::EStyle style = (DateFormat::EStyle)i; - df = DateFormat::createDateInstance(style, locale); - SimpleDateFormat* sdf; - if (df != nullptr && (sdf = dynamic_cast<SimpleDateFormat*>(df)) != nullptr) { - sdf->toPattern(dfPattern); - addPattern(dfPattern, false, conflictingString, status); - } - // TODO Maybe we should return an error when the date format isn't simple. - delete df; - if (U_FAILURE(status)) { return; } + if (U_FAILURE(status)) { + return; + } + + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status)); + CharString calendarTypeToUse; // to be filled in with the type to use, if all goes well + getCalendarTypeToUse(locale, calendarTypeToUse, status); - df = DateFormat::createTimeInstance(style, locale); - if (df != nullptr && (sdf = dynamic_cast<SimpleDateFormat*>(df)) != nullptr) { - sdf->toPattern(dfPattern); - addPattern(dfPattern, false, conflictingString, status); + // HACK to get around the fact that the old SimpleDateFormat code (actually, Calendar::getCalendarTypeForLocale() ) + // returns "gregorian" for ja_JP_TRADITIONAL instead of "japanese" + if (uprv_strcmp(locale.getBaseName(), "ja_JP_TRADITIONAL") == 0) { + calendarTypeToUse.clear().append("gregorian", status); + } + + if (U_FAILURE(status)) { + return; + } - // TODO: C++ and Java are inconsistent (see #12568). - // C++ uses MEDIUM, but Java uses SHORT. - if ( i==DateFormat::kShort && !dfPattern.isEmpty() ) { - consumeShortTimePattern(dfPattern, status); - } + // TODO: See ICU-22867 + CharString patternResourcePath; + patternResourcePath.append(DT_DateTimeCalendarTag, status) + .append('/', status) + .append(calendarTypeToUse, status) + .append('/', status) + .append(DT_DateTimePatternsTag, status); + + LocalUResourceBundlePointer dateTimePatterns(ures_getByKeyWithFallback(rb.getAlias(), patternResourcePath.data(), + nullptr, &status)); + if (ures_getType(dateTimePatterns.getAlias()) != URES_ARRAY || ures_getSize(dateTimePatterns.getAlias()) < 8) { + status = U_INVALID_FORMAT_ERROR; + return; + } + + for (int32_t i = 0; U_SUCCESS(status) && i < DateFormat::kDateTime; i++) { + LocalUResourceBundlePointer patternRes(ures_getByIndex(dateTimePatterns.getAlias(), i, nullptr, &status)); + UnicodeString pattern; + switch (ures_getType(patternRes.getAlias())) { + case URES_STRING: + pattern = ures_getUnicodeString(patternRes.getAlias(), &status); + break; + case URES_ARRAY: + pattern = ures_getUnicodeStringByIndex(patternRes.getAlias(), 0, &status); + break; + default: + status = U_INVALID_FORMAT_ERROR; + return; + } + + if (U_SUCCESS(status)) { + UnicodeString conflictingPattern; + addPatternWithOptionalSkeleton(pattern, nullptr, false, conflictingPattern, status); } - // TODO Maybe we should return an error when the date format isn't simple. - delete df; - if (U_FAILURE(status)) { return; } } } @@ -905,14 +925,11 @@ DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& &localStatus); localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination // now get the calendar key value from that locale - destination.clear(); - { - CharStringByteSink sink(&destination); - ulocimp_getKeywordValue( - localeWithCalendarKey, - "calendar", - sink, - &localStatus); + // (the call to ures_getFunctionalEquivalent() above might fail, and if it does, localeWithCalendarKey + // won't contain a `calendar` keyword. If this happens, the line below will stomp on `destination`, + // so we have to check the return code before overwriting `destination`.) + if (U_SUCCESS(localStatus)) { + destination = ulocimp_getKeywordValue(localeWithCalendarKey, "calendar", localStatus); } // If the input locale was invalid, don't fail with missing resource error, instead // continue with default of Gregorian. @@ -955,7 +972,7 @@ struct DateTimePatternGenerator::AppendItemFormatsSink : public ResourceSink { void fillInMissing() { UnicodeString defaultItemFormat(true, UDATPG_ItemFormat, UPRV_LENGTHOF(UDATPG_ItemFormat)-1); // Read-only alias. for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) { - UDateTimePatternField field = (UDateTimePatternField)i; + UDateTimePatternField field = static_cast<UDateTimePatternField>(i); if (dtpg.getAppendItemFormat(field).isEmpty()) { dtpg.setAppendItemFormat(field, defaultItemFormat); } @@ -987,25 +1004,25 @@ struct DateTimePatternGenerator::AppendItemNamesSink : public ResourceSink { void fillInMissing() { for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) { - UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, UDATPG_WIDE); + UnicodeString& valueStr = dtpg.getMutableFieldDisplayName(static_cast<UDateTimePatternField>(i), UDATPG_WIDE); if (valueStr.isEmpty()) { valueStr = CAP_F; U_ASSERT(i < 20); if (i < 10) { // F0, F1, ..., F9 - valueStr += (char16_t)(i+0x30); + valueStr += static_cast<char16_t>(i + 0x30); } else { // F10, F11, ... - valueStr += (char16_t)0x31; - valueStr += (char16_t)(i-10 + 0x30); + valueStr += static_cast<char16_t>(0x31); + valueStr += static_cast<char16_t>(i - 10 + 0x30); } // NUL-terminate for the C API. valueStr.getTerminatedBuffer(); } for (int32_t j = 1; j < UDATPG_WIDTH_COUNT; j++) { - UnicodeString& valueStr2 = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)j); + UnicodeString& valueStr2 = dtpg.getMutableFieldDisplayName(static_cast<UDateTimePatternField>(i), static_cast<UDateTimePGDisplayWidth>(j)); if (valueStr2.isEmpty()) { - valueStr2 = dtpg.getFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)(j-1)); + valueStr2 = dtpg.getFieldDisplayName(static_cast<UDateTimePatternField>(i), static_cast<UDateTimePGDisplayWidth>(j - 1)); } } } @@ -1032,7 +1049,7 @@ struct DateTimePatternGenerator::AvailableFormatsSink : public ResourceSink { // derived from std patterns, but not a previous availableFormats entry: const UnicodeString& formatValue = value.getUnicodeString(errorCode); conflictingPattern.remove(); - dtpg.addPatternWithSkeleton(formatValue, &formatKey, true, conflictingPattern, errorCode); + dtpg.addPatternWithSkeleton(formatValue, formatKey, true, conflictingPattern, errorCode); } } }; @@ -1157,11 +1174,11 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UErro UnicodeString DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDateTimePatternMatchOptions options, UErrorCode& status) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (U_FAILURE(internalErrorCode)) { status = internalErrorCode; - return UnicodeString(); + return {}; } const UnicodeString *bestPattern = nullptr; UnicodeString dtFormat; @@ -1174,7 +1191,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate // Replace hour metacharacters 'j', 'C' and 'J', set flags as necessary UnicodeString patternFormMapped = mapSkeletonMetacharacters(patternForm, &flags, status); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } resultPattern.remove(); @@ -1182,7 +1199,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate const PtnSkeleton* specifiedSkeleton = nullptr; bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) { @@ -1194,7 +1211,7 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate UnicodeString datePattern=getBestAppending(neededFields & dateMask, flags, status, options); UnicodeString timePattern=getBestAppending(neededFields & timeMask, flags, status, options); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (datePattern.length()==0) { if (timePattern.length()==0) { @@ -1267,10 +1284,10 @@ DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& pattern } else { AllowedHourFormat bestAllowed; if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { - bestAllowed = (AllowedHourFormat)fAllowedHourFormats[0]; + bestAllowed = static_cast<AllowedHourFormat>(fAllowedHourFormats[0]); } else { status = U_INVALID_FORMAT_ERROR; - return UnicodeString(); + return {}; } if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) { hourChar = CAP_H; @@ -1321,11 +1338,11 @@ DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, UDateTimePatternMatchOptions options, UErrorCode& status) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } if (U_FAILURE(internalErrorCode)) { status = internalErrorCode; - return UnicodeString(); + return {}; } dtMatcher->set(skeleton, fp); UnicodeString result = adjustFieldTypes(pattern, nullptr, kDTPGNoFlags, options); @@ -1361,7 +1378,7 @@ void DateTimePatternGenerator::setDateTimeFormat(const UnicodeString& dtFormat) { UErrorCode status = U_ZERO_ERROR; for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) { - setDateTimeFormat((UDateFormatStyle)style, dtFormat, status); + setDateTimeFormat(static_cast<UDateFormatStyle>(style), dtFormat, status); } } @@ -1449,7 +1466,7 @@ DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCo // Try again with standard variant status = U_ZERO_ERROR; dateTimePatterns.orphan(); - dateTimeOffset = (int32_t)DateFormat::kDateTimeOffset; + dateTimeOffset = static_cast<int32_t>(DateFormat::kDateTimeOffset); if (!cTypeIsGregorian) { specificCalBundle.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), cType, nullptr, &status)); @@ -1470,7 +1487,7 @@ DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCo if (U_FAILURE(status)) { return; } for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) { resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), dateTimeOffset + style, &resStrLen, &status); - setDateTimeFormat((UDateFormatStyle)style, UnicodeString(true, resStr, resStrLen), status); + setDateTimeFormat(static_cast<UDateFormatStyle>(style), UnicodeString(true, resStr, resStrLen), status); } } @@ -1496,7 +1513,18 @@ DateTimePatternGenerator::addPattern( return UDATPG_NO_CONFLICT; } - return addPatternWithSkeleton(pattern, nullptr, override, conflictingPattern, status); + return addPatternWithOptionalSkeleton(pattern, nullptr, override, conflictingPattern, status); +} + +UDateTimePatternConflict +DateTimePatternGenerator::addPatternWithSkeleton( + const UnicodeString& pattern, + const UnicodeString& skeletonToUse, + UBool override, + UnicodeString& conflictingPattern, + UErrorCode& status) +{ + return addPatternWithOptionalSkeleton(pattern, &skeletonToUse, override, conflictingPattern, status); } // For DateTimePatternGenerator::addPatternWithSkeleton - @@ -1510,7 +1538,7 @@ DateTimePatternGenerator::addPattern( // 3. When adding the pattern (patternMap->add), we set a new boolean to indicate that the added entry had a // specified skeleton (which sets a new field in the PtnElem in the PatternMap). UDateTimePatternConflict -DateTimePatternGenerator::addPatternWithSkeleton( +DateTimePatternGenerator::addPatternWithOptionalSkeleton( const UnicodeString& pattern, const UnicodeString* skeletonToUse, UBool override, @@ -1576,7 +1604,7 @@ UDateTimePatternField DateTimePatternGenerator::getAppendFormatNumber(const char* field) const { for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) { if (uprv_strcmp(CLDR_FIELD_APPEND[i], field)==0) { - return (UDateTimePatternField)i; + return static_cast<UDateTimePatternField>(i); } } return UDATPG_FIELD_COUNT; @@ -1592,7 +1620,7 @@ DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDi if (hyphenPtr) { for (int32_t i=UDATPG_WIDTH_COUNT-1; i>0; --i) { if (uprv_strcmp(CLDR_FIELD_WIDTH[i], hyphenPtr)==0) { - *widthP=(UDateTimePGDisplayWidth)i; + *widthP = static_cast<UDateTimePGDisplayWidth>(i); break; } } @@ -1600,7 +1628,7 @@ DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDi } for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) { if (uprv_strcmp(CLDR_FIELD_NAME[i],cldrFieldKey)==0) { - return (UDateTimePatternField)i; + return static_cast<UDateTimePatternField>(i); } } return UDATPG_FIELD_COUNT; @@ -1709,7 +1737,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, // field length, but options bits can be used to override this. // 2. There is a specified skeleton for the found pattern and one of the following is true: // a) The length of the field in the skeleton (skelFieldLen) is equal to reqFieldLen. - // b) The pattern field is numeric and the skeleton field is not, or vice versa. + // b) The pattern field is numeric and the requested field is not, or vice versa. char16_t reqFieldChar = dtMatcher->skeleton.original.getFieldChar(typeValue); int32_t reqFieldLen = dtMatcher->skeleton.original.getFieldLength(typeValue); @@ -1727,8 +1755,8 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, // https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table for more info) int32_t skelFieldLen = specifiedSkeleton->original.getFieldLength(typeValue); UBool patFieldIsNumeric = (row->type > 0); - UBool skelFieldIsNumeric = (specifiedSkeleton->type[typeValue] > 0); - if (skelFieldLen == reqFieldLen || (patFieldIsNumeric && !skelFieldIsNumeric) || (skelFieldIsNumeric && !patFieldIsNumeric)) { + UBool reqFieldIsNumeric = (dtMatcher->skeleton.type[typeValue] > 0); + if (skelFieldLen == reqFieldLen || (patFieldIsNumeric && !reqFieldIsNumeric) || (reqFieldIsNumeric && !patFieldIsNumeric)) { // don't adjust the field length in the found pattern adjFieldLen = field.length(); } @@ -1778,7 +1806,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, UnicodeString DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, UErrorCode &status, UDateTimePatternMatchOptions options) { if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } UnicodeString resultPattern, tempPattern; const UnicodeString* tempPatternPtr; @@ -1788,7 +1816,7 @@ DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, const PtnSkeleton* specifiedSkeleton=nullptr; tempPatternPtr = getBestRaw(*dtMatcher, missingFields, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } tempPattern = *tempPatternPtr; resultPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); @@ -1808,7 +1836,7 @@ DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, int32_t startingMask = distanceInfo->missingFieldMask; tempPatternPtr = getBestRaw(*dtMatcher, distanceInfo->missingFieldMask, distanceInfo, status, &specifiedSkeleton); if (U_FAILURE(status)) { - return UnicodeString(); + return {}; } tempPattern = *tempPatternPtr; tempPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); @@ -1817,7 +1845,7 @@ DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, if (appendItemFormats[topField].length() != 0) { UnicodeString appendName; - getAppendName((UDateTimePatternField)topField, appendName); + getAppendName(static_cast<UDateTimePatternField>(topField), appendName); const UnicodeString *values[3] = { &resultPattern, &tempPattern, @@ -1857,7 +1885,7 @@ DateTimePatternGenerator::setAvailableFormat(const UnicodeString &key, UErrorCod UBool DateTimePatternGenerator::isAvailableFormatSet(const UnicodeString &key) const { - return (UBool)(fAvailableFormatKeyHash->geti(key) == 1); + return fAvailableFormatKeyHash->geti(key) == 1; } void @@ -1878,7 +1906,7 @@ DateTimePatternGenerator::copyHashtable(Hashtable *other, UErrorCode &status) { // walk through the hash table and create a deep clone while((elem = other->nextElement(pos))!= nullptr){ const UHashTok otherKeyTok = elem->key; - UnicodeString* otherKey = (UnicodeString*)otherKeyTok.pointer; + UnicodeString* otherKey = static_cast<UnicodeString*>(otherKeyTok.pointer); fAvailableFormatKeyHash->puti(*otherKey, 1, status); if(U_FAILURE(status)){ return; @@ -2289,7 +2317,9 @@ DateTimeMatcher::DateTimeMatcher(const DateTimeMatcher& other) { } DateTimeMatcher& DateTimeMatcher::operator=(const DateTimeMatcher& other) { - copyFrom(other.skeleton); + if (this != &other) { + copyFrom(other.skeleton); + } return *this; } @@ -2559,7 +2589,7 @@ FormatParser::getCanonicalIndex(const UnicodeString& s, UBool strict) { UBool FormatParser::isQuoteLiteral(const UnicodeString& s) { - return (UBool)(s.charAt(0) == SINGLE_QUOTE); + return s.charAt(0) == SINGLE_QUOTE; } // This function assumes the current itemIndex points to the quote literal. @@ -2742,8 +2772,8 @@ void SkeletonFields::populate(int32_t field, const UnicodeString& value) { } void SkeletonFields::populate(int32_t field, char16_t ch, int32_t length) { - chars[field] = (int8_t) ch; - lengths[field] = (int8_t) length; + chars[field] = static_cast<int8_t>(ch); + lengths[field] = static_cast<int8_t>(length); } UBool SkeletonFields::isFieldEmpty(int32_t field) const { @@ -2759,7 +2789,7 @@ UnicodeString& SkeletonFields::appendTo(UnicodeString& string) const { UnicodeString& SkeletonFields::appendFieldTo(int32_t field, UnicodeString& string) const { char16_t ch(chars[field]); - int32_t length = (int32_t) lengths[field]; + int32_t length = static_cast<int32_t>(lengths[field]); for (int32_t i=0; i<length; i++) { string += ch; @@ -2898,7 +2928,7 @@ DTSkeletonEnumeration::DTSkeletonEnumeration(PatternMap& patternMap, dtStrEnum t const UnicodeString* DTSkeletonEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && fSkeletons.isValid() && pos < fSkeletons->size()) { - return (const UnicodeString*)fSkeletons->elementAt(pos++); + return static_cast<const UnicodeString*>(fSkeletons->elementAt(pos++)); } return nullptr; } @@ -2930,7 +2960,7 @@ DTSkeletonEnumeration::~DTSkeletonEnumeration() { UnicodeString *s; if (fSkeletons.isValid()) { for (int32_t i = 0; i < fSkeletons->size(); ++i) { - if ((s = (UnicodeString *)fSkeletons->elementAt(i)) != nullptr) { + if ((s = static_cast<UnicodeString*>(fSkeletons->elementAt(i))) != nullptr) { delete s; } } @@ -2965,7 +2995,7 @@ DTRedundantEnumeration::add(const UnicodeString& pattern, UErrorCode& status) { const UnicodeString* DTRedundantEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && fPatterns.isValid() && pos < fPatterns->size()) { - return (const UnicodeString*)fPatterns->elementAt(pos++); + return static_cast<const UnicodeString*>(fPatterns->elementAt(pos++)); } return nullptr; } @@ -2997,7 +3027,7 @@ DTRedundantEnumeration::~DTRedundantEnumeration() { UnicodeString *s; if (fPatterns.isValid()) { for (int32_t i = 0; i < fPatterns->size(); ++i) { - if ((s = (UnicodeString *)fPatterns->elementAt(i)) != nullptr) { + if ((s = static_cast<UnicodeString*>(fPatterns->elementAt(i))) != nullptr) { delete s; } } diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index 74fe925b2f6cca..b6eb5f63734ed1 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -250,7 +250,7 @@ class PatternMap : public UMemory { virtual ~PatternMap(); void add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status); const UnicodeString* getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const; - const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = 0) const; + const UnicodeString* getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = nullptr) const; void copyFrom(const PatternMap& other, UErrorCode& status); PtnElem* getHeader(char16_t baseChar) const; UBool equals(const PatternMap& other) const; diff --git a/deps/icu-small/source/i18n/erarules.cpp b/deps/icu-small/source/i18n/erarules.cpp index 65405bb84aac48..6f1a379b284243 100644 --- a/deps/icu-small/source/i18n/erarules.cpp +++ b/deps/icu-small/source/i18n/erarules.cpp @@ -17,6 +17,7 @@ #include "erarules.h" #include "gregoimp.h" #include "uassert.h" +#include "uvectr32.h" U_NAMESPACE_BEGIN @@ -54,7 +55,7 @@ static UBool isValidRuleStartDate(int32_t year, int32_t month, int32_t day) { * @return an encoded date. */ static int32_t encodeDate(int32_t year, int32_t month, int32_t day) { - return (int32_t)((uint32_t)year << 16) | month << 8 | day; + return static_cast<int32_t>(static_cast<uint32_t>(year) << 16) | month << 8 | day; } static void decodeDate(int32_t encodedDate, int32_t (&fields)[3]) { @@ -102,9 +103,9 @@ static int32_t compareEncodedDateWithYMD(int encoded, int year, int month, int d } } -EraRules::EraRules(LocalMemory<int32_t>& eraStartDates, int32_t numEras) - : numEras(numEras) { - startDates = std::move(eraStartDates); +EraRules::EraRules(LocalMemory<int32_t>& startDatesIn, int32_t startDatesLengthIn, int32_t minEraIn, int32_t numErasIn) + : startDatesLength(startDatesLengthIn), minEra(minEraIn), numEras(numErasIn) { + startDates = std::move(startDatesIn); initCurrentEra(); } @@ -127,12 +128,10 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr int32_t numEras = ures_getSize(rb.getAlias()); int32_t firstTentativeIdx = MAX_INT32; - LocalMemory<int32_t> startDates(static_cast<int32_t *>(uprv_malloc(numEras * sizeof(int32_t)))); - if (startDates.isNull()) { - status = U_MEMORY_ALLOCATION_ERROR; + UVector32 eraStartDates(numEras, status); + if (U_FAILURE(status)) { return nullptr; } - uprv_memset(startDates.getAlias(), 0 , numEras * sizeof(int32_t)); while (ures_hasNext(rb.getAlias())) { LocalUResourceBundlePointer eraRuleRes(ures_getNextResource(rb.getAlias(), nullptr, &status)); @@ -141,16 +140,27 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr } const char *eraIdxStr = ures_getKey(eraRuleRes.getAlias()); char *endp; - int32_t eraIdx = (int32_t)strtol(eraIdxStr, &endp, 10); - if ((size_t)(endp - eraIdxStr) != uprv_strlen(eraIdxStr)) { + int32_t eraIdx = static_cast<int32_t>(uprv_strtol(eraIdxStr, &endp, 10)); + if (static_cast<size_t>(endp - eraIdxStr) != uprv_strlen(eraIdxStr)) { status = U_INVALID_FORMAT_ERROR; return nullptr; } - if (eraIdx < 0 || eraIdx >= numEras) { + if (eraIdx < 0) { status = U_INVALID_FORMAT_ERROR; return nullptr; } - if (isSet(startDates[eraIdx])) { + if (eraIdx + 1 > eraStartDates.size()) { + eraStartDates.ensureCapacity(eraIdx + 1, status); // needed only to minimize expansions + // Fill in 0 for all added slots (else they are undefined) + while (eraStartDates.size() < eraIdx + 1) { + eraStartDates.addElement(0, status); + } + if (U_FAILURE(status)) { + return nullptr; + } + } + // Now set the startDate that we just read + if (isSet(eraStartDates.elementAti(eraIdx))) { // start date of the index was already set status = U_INVALID_FORMAT_ERROR; return nullptr; @@ -174,7 +184,7 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr status = U_INVALID_FORMAT_ERROR; return nullptr; } - startDates[eraIdx] = encodeDate(fields[0], fields[1], fields[2]); + eraStartDates.setElementAt(encodeDate(fields[0], fields[1], fields[2]), eraIdx); } else if (uprv_strcmp(key, "named") == 0) { const char16_t *val = ures_getString(res.getAlias(), &len, &status); if (u_strncmp(val, VAL_FALSE, VAL_FALSE_LEN) == 0) { @@ -185,21 +195,16 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr } } - if (isSet(startDates[eraIdx])) { + if (isSet(eraStartDates.elementAti(eraIdx))) { if (hasEnd) { // This implementation assumes either start or end is available, not both. // For now, just ignore the end rule. } } else { if (hasEnd) { - if (eraIdx != 0) { - // This implementation does not support end only rule for eras other than - // the first one. - status = U_INVALID_FORMAT_ERROR; - return nullptr; - } - U_ASSERT(eraIdx == 0); - startDates[eraIdx] = MIN_ENCODED_START; + // The islamic calendars now have an end-only rule for the + // second (and final) entry; basically they are in reverse order. + eraStartDates.setElementAt(MIN_ENCODED_START, eraIdx); } else { status = U_INVALID_FORMAT_ERROR; return nullptr; @@ -218,47 +223,91 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr } } - EraRules *result; - if (firstTentativeIdx < MAX_INT32 && !includeTentativeEra) { - result = new EraRules(startDates, firstTentativeIdx); - } else { - result = new EraRules(startDates, numEras); + // Remove from eraStartDates any tentative eras if they should not be included + // (these would be the last entries). Also reduce numEras appropriately. + if (!includeTentativeEra) { + while (firstTentativeIdx < eraStartDates.size()) { + int32_t lastEraIdx = eraStartDates.size() - 1; + if (isSet(eraStartDates.elementAti(lastEraIdx))) { // If there are multiple tentativeEras, some may be unset + numEras--; + } + eraStartDates.removeElementAt(lastEraIdx); + } + // Remove any remaining trailing unSet entries + // (can only have these if tentativeEras have been removed) + while (eraStartDates.size() > 0 && !isSet(eraStartDates.elementAti(eraStartDates.size() - 1))) { + eraStartDates.removeElementAt(eraStartDates.size() - 1); + } } - + // Remove from eraStartDates any initial 0 entries, keeping the original index (eraCode) + // of the first non-zero entry as minEra; then we can add that back to the offset in the + // compressed array to get the correct eraCode. + int32_t minEra = 0; + while (eraStartDates.size() > 0 && !isSet(eraStartDates.elementAti(0))) { + eraStartDates.removeElementAt(0); + minEra++; + } + // Convert eraStartDates to int32_t array startDates and pass to EraRules constructor, + // along with startDatesLength, minEra and numEras (which may be different from startDatesLength) + LocalMemory<int32_t> startDates(static_cast<int32_t *>(uprv_malloc(eraStartDates.size() * sizeof(int32_t)))); + if (startDates.isNull()) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + for (int32_t eraIdx = 0; eraIdx < eraStartDates.size(); eraIdx++) { + startDates[eraIdx] = eraStartDates.elementAti(eraIdx); + } + EraRules *result = new EraRules(startDates, eraStartDates.size(), minEra, numEras); if (result == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } return result; } -void EraRules::getStartDate(int32_t eraIdx, int32_t (&fields)[3], UErrorCode& status) const { +void EraRules::getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& status) const { if(U_FAILURE(status)) { return; } - if (eraIdx < 0 || eraIdx >= numEras) { - status = U_ILLEGAL_ARGUMENT_ERROR; + int32_t startDate = 0; + if (eraCode >= minEra) { + int32_t startIdx = eraCode - minEra; + if (startIdx < startDatesLength) { + startDate = startDates[startIdx]; + } + } + if (isSet(startDate)) { + decodeDate(startDate, fields); return; } - decodeDate(startDates[eraIdx], fields); + // We did not find the requested eraCode in our data + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } -int32_t EraRules::getStartYear(int32_t eraIdx, UErrorCode& status) const { +int32_t EraRules::getStartYear(int32_t eraCode, UErrorCode& status) const { int year = MAX_INT32; // bogus value if(U_FAILURE(status)) { return year; } - if (eraIdx < 0 || eraIdx >= numEras) { - status = U_ILLEGAL_ARGUMENT_ERROR; + int32_t startDate = 0; + if (eraCode >= minEra) { + int32_t startIdx = eraCode - minEra; + if (startIdx < startDatesLength) { + startDate = startDates[startIdx]; + } + } + if (isSet(startDate)) { + int fields[3]; + decodeDate(startDate, fields); + year = fields[0]; return year; } - int fields[3]; - decodeDate(startDates[eraIdx], fields); - year = fields[0]; - + // We did not find the requested eraCode in our data + status = U_ILLEGAL_ARGUMENT_ERROR; return year; } -int32_t EraRules::getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCode& status) const { +int32_t EraRules::getEraCode(int32_t year, int32_t month, int32_t day, UErrorCode& status) const { if(U_FAILURE(status)) { return -1; } @@ -267,27 +316,33 @@ int32_t EraRules::getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCo status = U_ILLEGAL_ARGUMENT_ERROR; return -1; } - int32_t high = numEras; // last index + 1 - int32_t low; - - // Short circuit for recent years. Most modern computations will - // occur in the last few eras. - if (compareEncodedDateWithYMD(startDates[getCurrentEraIndex()], year, month, day) <= 0) { - low = getCurrentEraIndex(); - } else { - low = 0; + if (numEras > 1 && startDates[startDatesLength-1] == MIN_ENCODED_START) { + // Multiple eras in reverse order, linear search from beginning. + // Currently only for islamic. + for (int startIdx = 0; startIdx < startDatesLength; startIdx++) { + if (!isSet(startDates[startIdx])) { + continue; + } + if (compareEncodedDateWithYMD(startDates[startIdx], year, month, day) <= 0) { + return minEra + startIdx; + } + } } - - // Do binary search - while (low < high - 1) { - int i = (low + high) / 2; - if (compareEncodedDateWithYMD(startDates[i], year, month, day) <= 0) { - low = i; - } else { - high = i; + // Linear search from the end, which should hit the most likely eras first. + // Also this is the most efficient for any era if we have < 8 or so eras, so only less + // efficient for early eras in Japanese calendar (while we still have them). Formerly + // this used binary search which would only be better for those early Japanese eras, + // but now that is much more difficult since there may be holes in the sorted list. + // Note with this change, this no longer uses or depends on currentEra. + for (int startIdx = startDatesLength; startIdx > 0;) { + if (!isSet(startDates[--startIdx])) { + continue; + } + if (compareEncodedDateWithYMD(startDates[startIdx], year, month, day) <= 0) { + return minEra + startIdx; } } - return low; + return minEra; } void EraRules::initCurrentEra() { @@ -305,19 +360,16 @@ void EraRules::initCurrentEra() { localMillis += (rawOffset + dstOffset); } - int year, month0, dom, dow, doy, mid; - Grego::timeToFields(localMillis, year, month0, dom, dow, doy, mid); - int currentEncodedDate = encodeDate(year, month0 + 1 /* changes to 1-base */, dom); - int eraIdx = numEras - 1; - while (eraIdx > 0) { - if (currentEncodedDate >= startDates[eraIdx]) { - break; - } - eraIdx--; + int32_t year, mid; + int8_t month0, dom; + Grego::timeToFields(localMillis, year, month0, dom, mid, ec); + currentEra = minEra; + if (U_FAILURE(ec)) { return; } + // Now that getEraCode no longer depends on currentEra, we can just do this: + currentEra = getEraCode(year, month0 + 1 /* changes to 1-base */, dom, ec); + if (U_FAILURE(ec)) { + currentEra = minEra; } - // Note: current era could be before the first era. - // In this case, this implementation returns the first era index (0). - currentEra = eraIdx; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/erarules.h b/deps/icu-small/source/i18n/erarules.h index 74b7862da4c18c..f72f73c1c7f5d2 100644 --- a/deps/icu-small/source/i18n/erarules.h +++ b/deps/icu-small/source/i18n/erarules.h @@ -14,83 +14,79 @@ U_NAMESPACE_BEGIN -// Export an explicit template instantiation of LocalMemory used as a data member of EraRules. -// When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -#if defined(_MSC_VER) -// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(push) -#pragma warning(disable: 4661) -#endif -template class U_I18N_API LocalPointerBase<int32_t>; -template class U_I18N_API LocalMemory<int32_t>; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif -#endif - -class U_I18N_API EraRules : public UMemory { +class U_I18N_API_CLASS EraRules : public UMemory { public: - ~EraRules(); + U_I18N_API ~EraRules(); - static EraRules* createInstance(const char *calType, UBool includeTentativeEra, UErrorCode& status); + U_I18N_API static EraRules* createInstance(const char* calType, + UBool includeTentativeEra, + UErrorCode& status); /** * Gets number of effective eras - * @return number of effective eras + * @return number of effective eras (not the same as max era code) */ inline int32_t getNumberOfEras() const { return numEras; } + /** + * Gets maximum defined era code for the current calendar + * @return maximum defined era code + */ + inline int32_t getMaxEraCode() const { + return minEra + startDatesLength - 1; + } + /** * Gets start date of an era - * @param eraIdx Era index + * @param eraCode Era code * @param fields Receives date fields. The result includes values of year, month, * day of month in this order. When an era has no start date, the result * will be January 1st in year whose value is minimum integer. * @param status Receives status. */ - void getStartDate(int32_t eraIdx, int32_t (&fields)[3], UErrorCode& status) const; + void getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& status) const; /** * Gets start year of an era - * @param eraIdx Era index + * @param eraCode Era code * @param status Receives status. * @return The first year of an era. When a era has no start date, minimum int32 * value is returned. */ - int32_t getStartYear(int32_t eraIdx, UErrorCode& status) const; + U_I18N_API int32_t getStartYear(int32_t eraCode, UErrorCode& status) const; /** - * Returns era index for the specified year/month/day. + * Returns era code for the specified year/month/day. * @param year Year * @param month Month (1-base) * @param day Day of month * @param status Receives status - * @return era index (or 0, when the specified date is before the first era) + * @return era code (or code of earliest era when date is before that era) */ - int32_t getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCode& status) const; + U_I18N_API int32_t getEraCode(int32_t year, int32_t month, int32_t day, UErrorCode& status) const; /** - * Gets the current era index. This is calculated only once for an instance of + * Gets the current era code. This is calculated only once for an instance of * EraRules. The current era calculation is based on the default time zone at * the time of instantiation. * - * @return era index of current era (or 0, when current date is before the first era) + * @return era code of current era (or era code of earliest era when current date is before any era) */ - inline int32_t getCurrentEraIndex() const { + inline int32_t getCurrentEraCode() const { return currentEra; } private: - EraRules(LocalMemory<int32_t>& eraStartDates, int32_t numEra); + EraRules(LocalMemory<int32_t>& startDatesIn, int32_t startDatesLengthIn, int32_t minEraIn, int32_t numErasIn); void initCurrentEra(); LocalMemory<int32_t> startDates; - int32_t numEras; + int32_t startDatesLength; + int32_t minEra; // minimum valid era code, for first entry in startDates + int32_t numEras; // number of valid era codes (not necessarily the same as startDates length int32_t currentEra; }; diff --git a/deps/icu-small/source/i18n/esctrn.cpp b/deps/icu-small/source/i18n/esctrn.cpp index 24fa6f58e45f39..60f8731101d8fa 100644 --- a/deps/icu-small/source/i18n/esctrn.cpp +++ b/deps/icu-small/source/i18n/esctrn.cpp @@ -111,7 +111,7 @@ EscapeTransliterator::EscapeTransliterator(const EscapeTransliterator& o) : radix(o.radix), minDigits(o.minDigits), grokSupplementals(o.grokSupplementals) { - supplementalHandler = (o.supplementalHandler != 0) ? + supplementalHandler = o.supplementalHandler != nullptr ? new EscapeTransliterator(*o.supplementalHandler) : nullptr; } diff --git a/deps/icu-small/source/i18n/ethpccal.cpp b/deps/icu-small/source/i18n/ethpccal.cpp index be4010843a5642..a459b578dcfa7c 100644 --- a/deps/icu-small/source/i18n/ethpccal.cpp +++ b/deps/icu-small/source/i18n/ethpccal.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_FORMATTING +#include "gregoimp.h" #include "umutex.h" #include "ethpccal.h" #include "cecal.h" @@ -21,7 +22,7 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EthiopicCalendar) UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EthiopicAmeteAlemCalendar) -//static const int32_t JD_EPOCH_OFFSET_AMETE_ALEM = -285019; +static const int32_t JD_EPOCH_OFFSET_AMETE_ALEM = -285019; static const int32_t JD_EPOCH_OFFSET_AMETE_MIHRET = 1723856; static const int32_t AMETE_MIHRET_DELTA = 5500; // 5501 - 1 (Amete Alem 5501 = Amete Mihret 1) @@ -56,8 +57,11 @@ EthiopicCalendar::getType() const //------------------------------------------------------------------------- int32_t -EthiopicCalendar::handleGetExtendedYear() +EthiopicCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // Ethiopic calendar uses EXTENDED_YEAR aligned to // Amelete Hihret year always. if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { @@ -67,81 +71,15 @@ EthiopicCalendar::handleGetExtendedYear() if (internalGet(UCAL_ERA, AMETE_MIHRET) == AMETE_MIHRET) { return internalGet(UCAL_YEAR, 1); // Default to year 1 } - return internalGet(UCAL_YEAR, 1) - AMETE_MIHRET_DELTA; -} - -void -EthiopicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) -{ - int32_t eyear, month, day; - jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); - - internalSet(UCAL_EXTENDED_YEAR, eyear); - internalSet(UCAL_ERA, (eyear > 0) ? AMETE_MIHRET : AMETE_ALEM); - internalSet(UCAL_YEAR, (eyear > 0) ? eyear : (eyear + AMETE_MIHRET_DELTA)); - internalSet(UCAL_MONTH, month); - internalSet(UCAL_ORDINAL_MONTH, month); - internalSet(UCAL_DATE, day); - internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); -} - -constexpr uint32_t kEthiopicRelatedYearDiff = 8; - -int32_t EthiopicCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { + int32_t year = internalGet(UCAL_YEAR, 1); + if (uprv_add32_overflow(year, -AMETE_MIHRET_DELTA, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - return year + kEthiopicRelatedYearDiff; -} - -void EthiopicCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kEthiopicRelatedYearDiff); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - UErrorCode status = U_ZERO_ERROR; - EthiopicCalendar calendar(Locale("@calendar=ethiopic"), status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate -EthiopicCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t -EthiopicCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; + return year; } +IMPL_SYSTEM_DEFAULT_CENTURY(EthiopicCalendar, "@calendar=ethiopic") int32_t EthiopicCalendar::getJDEpochOffset() const @@ -149,21 +87,18 @@ EthiopicCalendar::getJDEpochOffset() const return JD_EPOCH_OFFSET_AMETE_MIHRET; } +int32_t EthiopicCalendar::extendedYearToEra(int32_t extendedYear) const { + return extendedYear <= 0 ? AMETE_ALEM : AMETE_MIHRET; +} -#if 0 -// We do not want to introduce this API in ICU4C. -// It was accidentally introduced in ICU4J as a public API. - -//------------------------------------------------------------------------- -// Calendar system Conversion methods... -//------------------------------------------------------------------------- +int32_t EthiopicCalendar::extendedYearToYear(int32_t extendedYear) const { + return extendedYear <= 0 ? extendedYear + AMETE_MIHRET_DELTA : extendedYear; +} -int32_t -EthiopicCalendar::ethiopicToJD(int32_t year, int32_t month, int32_t date) -{ - return ceToJD(year, month, date, JD_EPOCH_OFFSET_AMETE_MIHRET); +int32_t EthiopicCalendar::getRelatedYearDifference() const { + constexpr int32_t kEthiopicCalendarRelatedYearDifference = 8; + return kEthiopicCalendarRelatedYearDifference; } -#endif //------------------------------------------------------------------------- // Constructors... @@ -196,62 +131,42 @@ EthiopicAmeteAlemCalendar::getType() const } int32_t -EthiopicAmeteAlemCalendar::handleGetExtendedYear() +EthiopicAmeteAlemCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // Ethiopic calendar uses EXTENDED_YEAR aligned to // Amelete Hihret year always. if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return internalGet(UCAL_YEAR, 1 + AMETE_MIHRET_DELTA) - - AMETE_MIHRET_DELTA; // Default to year 1 of Amelete Mihret -} - -void -EthiopicAmeteAlemCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) -{ - int32_t eyear, month, day; - jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); - - internalSet(UCAL_EXTENDED_YEAR, eyear); - internalSet(UCAL_ERA, AMETE_ALEM); - internalSet(UCAL_YEAR, eyear + AMETE_MIHRET_DELTA); - internalSet(UCAL_MONTH, month); - internalSet(UCAL_ORDINAL_MONTH, month); - internalSet(UCAL_DATE, day); - internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); + // Default to year 1 + return internalGet(UCAL_YEAR, 1); } int32_t -EthiopicAmeteAlemCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const +EthiopicAmeteAlemCalendar::getJDEpochOffset() const { - if (field == UCAL_ERA) { - return 0; // Only one era in this mode, era is always 0 - } - return EthiopicCalendar::handleGetLimit(field, limitType); + return JD_EPOCH_OFFSET_AMETE_ALEM; } -constexpr uint32_t kEthiopicAmeteAlemRelatedYearDiff = -5492; - -int32_t EthiopicAmeteAlemCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { - return 0; - } - return year + kEthiopicAmeteAlemRelatedYearDiff; +int32_t EthiopicAmeteAlemCalendar::extendedYearToEra(int32_t /* extendedYear */) const { + return AMETE_ALEM; } -void EthiopicAmeteAlemCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kEthiopicAmeteAlemRelatedYearDiff); +int32_t EthiopicAmeteAlemCalendar::extendedYearToYear(int32_t extendedYear) const { + return extendedYear; } + int32_t -EthiopicAmeteAlemCalendar::defaultCenturyStartYear() const +EthiopicAmeteAlemCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { - return EthiopicCalendar::defaultCenturyStartYear() + AMETE_MIHRET_DELTA; + if (field == UCAL_ERA) { + return 0; // Only one era in this mode, era is always 0 + } + return EthiopicCalendar::handleGetLimit(field, limitType); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/ethpccal.h b/deps/icu-small/source/i18n/ethpccal.h index 19d9e0efb7e0a5..0912b1377f239a 100644 --- a/deps/icu-small/source/i18n/ethpccal.h +++ b/deps/icu-small/source/i18n/ethpccal.h @@ -141,25 +141,16 @@ class EthiopicCalendar : public CECalendar { */ virtual const char * getType() const override; - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - protected: //------------------------------------------------------------------------- // Calendar framework //------------------------------------------------------------------------- + /** + * @internal + */ + int32_t getRelatedYearDifference() const override; + /** * Return the extended year defined by the current fields. * This calendar uses both AMETE_ALEM and AMETE_MIHRET. @@ -169,32 +160,27 @@ class EthiopicCalendar : public CECalendar { * 1 AMETE_MIHRET 1 * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; - /** - * Compute fields from the JD - * @internal - */ - virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 + * Return the date offset from Julian * @internal */ - virtual UDate defaultCenturyStart() const override; + int32_t getJDEpochOffset() const override; /** - * Returns the year in which the default century begins + * Compute the era from extended year. * @internal */ - virtual int32_t defaultCenturyStartYear() const override; + int32_t extendedYearToEra(int32_t extendedYear) const override; /** - * Return the date offset from Julian + * Compute the year from extended year. * @internal */ - virtual int32_t getJDEpochOffset() const override; + int32_t extendedYearToYear(int32_t extendedYear) const override; public: /** @@ -313,20 +299,6 @@ class EthiopicAmeteAlemCalendar : public EthiopicCalendar { */ U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - protected: //------------------------------------------------------------------------- // Calendar framework @@ -341,24 +313,31 @@ class EthiopicAmeteAlemCalendar : public EthiopicCalendar { * 1 AMETE_ALEM 5501 * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** - * Compute fields from the JD + * Calculate the limit for a specified type of limit and field * @internal */ - virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; + virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; /** - * Calculate the limit for a specified type of limit and field + * Return the date offset from Julian * @internal */ - virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; + int32_t getJDEpochOffset() const override; + + /** + * Compute the era from extended year. + * @internal + */ + int32_t extendedYearToEra(int32_t extendedYear) const override; + /** - * Returns the year in which the default century begins + * Compute the year from extended year. * @internal */ - virtual int32_t defaultCenturyStartYear() const override; + int32_t extendedYearToYear(int32_t extendedYear) const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/fmtable.cpp b/deps/icu-small/source/i18n/fmtable.cpp index 65dafc95aa256a..41fda1fd2ff93d 100644 --- a/deps/icu-small/source/i18n/fmtable.cpp +++ b/deps/icu-small/source/i18n/fmtable.cpp @@ -26,9 +26,9 @@ #include "unicode/measure.h" #include "unicode/curramt.h" #include "unicode/uformattable.h" -#include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "fixedstring.h" #include "fmtableimp.h" #include "number_decimalquantity.h" @@ -258,16 +258,11 @@ Formattable::operator=(const Formattable& source) break; } - UErrorCode status = U_ZERO_ERROR; if (source.fDecimalQuantity != nullptr) { fDecimalQuantity = new DecimalQuantity(*source.fDecimalQuantity); } if (source.fDecimalStr != nullptr) { - fDecimalStr = new CharString(*source.fDecimalStr, status); - if (U_FAILURE(status)) { - delete fDecimalStr; - fDecimalStr = nullptr; - } + fDecimalStr = new FixedString(*source.fDecimalStr); } } return *this; @@ -399,7 +394,7 @@ Formattable::getLong(UErrorCode& status) const switch (fType) { case Formattable::kLong: - return (int32_t)fValue.fInt64; + return static_cast<int32_t>(fValue.fInt64); case Formattable::kInt64: if (fValue.fInt64 > INT32_MAX) { status = U_INVALID_FORMAT_ERROR; @@ -408,7 +403,7 @@ Formattable::getLong(UErrorCode& status) const status = U_INVALID_FORMAT_ERROR; return INT32_MIN; } else { - return (int32_t)fValue.fInt64; + return static_cast<int32_t>(fValue.fInt64); } case Formattable::kDouble: if (fValue.fDouble > INT32_MAX) { @@ -418,7 +413,7 @@ Formattable::getLong(UErrorCode& status) const status = U_INVALID_FORMAT_ERROR; return INT32_MIN; } else { - return (int32_t)fValue.fDouble; // loses fraction + return static_cast<int32_t>(fValue.fDouble); // loses fraction } case Formattable::kObject: if (fValue.fObject == nullptr) { @@ -456,10 +451,10 @@ Formattable::getInt64(UErrorCode& status) const case Formattable::kInt64: return fValue.fInt64; case Formattable::kDouble: - if (fValue.fDouble > (double)U_INT64_MAX) { + if (fValue.fDouble > static_cast<double>(U_INT64_MAX)) { status = U_INVALID_FORMAT_ERROR; return U_INT64_MAX; - } else if (fValue.fDouble < (double)U_INT64_MIN) { + } else if (fValue.fDouble < static_cast<double>(U_INT64_MIN)) { status = U_INVALID_FORMAT_ERROR; return U_INT64_MIN; } else if (fabs(fValue.fDouble) > U_DOUBLE_MAX_EXACT_INT && fDecimalQuantity != nullptr) { @@ -471,7 +466,7 @@ Formattable::getInt64(UErrorCode& status) const return fDecimalQuantity->isNegative() ? U_INT64_MIN : U_INT64_MAX; } } else { - return (int64_t)fValue.fDouble; + return static_cast<int64_t>(fValue.fDouble); } case Formattable::kObject: if (fValue.fObject == nullptr) { @@ -500,7 +495,7 @@ Formattable::getDouble(UErrorCode& status) const switch (fType) { case Formattable::kLong: case Formattable::kInt64: // loses precision - return (double)fValue.fInt64; + return static_cast<double>(fValue.fInt64); case Formattable::kDouble: return fValue.fDouble; case Formattable::kObject: @@ -688,7 +683,7 @@ Formattable::getArray(int32_t& count, UErrorCode& status) const UnicodeString* Formattable::getBogus() const { - return (UnicodeString*)&fBogus; /* cast away const :-( */ + return const_cast<UnicodeString*>(&fBogus); /* cast away const :-( */ } @@ -698,18 +693,18 @@ StringPiece Formattable::getDecimalNumber(UErrorCode &status) { return ""; } if (fDecimalStr != nullptr) { - return fDecimalStr->toStringPiece(); + return fDecimalStr->data(); } - CharString *decimalStr = internalGetCharString(status); + FixedString* decimalStr = internalGetFixedString(status); if(decimalStr == nullptr) { return ""; // getDecimalNumber returns "" for error cases } else { - return decimalStr->toStringPiece(); + return decimalStr->data(); } } -CharString *Formattable::internalGetCharString(UErrorCode &status) { +FixedString *Formattable::internalGetFixedString(UErrorCode &status) { if(fDecimalStr == nullptr) { if (fDecimalQuantity == nullptr) { // No decimal number for the formattable yet. Which means the value was @@ -724,7 +719,7 @@ CharString *Formattable::internalGetCharString(UErrorCode &status) { fDecimalQuantity = dq.orphan(); } - fDecimalStr = new CharString(); + fDecimalStr = new FixedString(); if (fDecimalStr == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -733,16 +728,20 @@ CharString *Formattable::internalGetCharString(UErrorCode &status) { // DecimalQuantity::toScientificString(). The biggest difference is that uprv_decNumberToString does // not print scientific notation for magnitudes greater than -5 and smaller than some amount (+5?). if (fDecimalQuantity->isInfinite()) { - fDecimalStr->append("Infinity", status); + *fDecimalStr = "Infinity"; } else if (fDecimalQuantity->isNaN()) { - fDecimalStr->append("NaN", status); + *fDecimalStr = "NaN"; } else if (fDecimalQuantity->isZeroish()) { - fDecimalStr->append("0", -1, status); + *fDecimalStr = "0"; } else if (fType==kLong || fType==kInt64 || // use toPlainString for integer types (fDecimalQuantity->getMagnitude() != INT32_MIN && std::abs(fDecimalQuantity->getMagnitude()) < 5)) { - fDecimalStr->appendInvariantChars(fDecimalQuantity->toPlainString(), status); + copyInvariantChars(fDecimalQuantity->toPlainString(), *fDecimalStr, status); } else { - fDecimalStr->appendInvariantChars(fDecimalQuantity->toScientificString(), status); + copyInvariantChars(fDecimalQuantity->toScientificString(), *fDecimalStr, status); + } + if (U_SUCCESS(status) && fDecimalStr->isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; } } return fDecimalStr; @@ -775,9 +774,7 @@ Formattable::populateDecimalQuantity(number::impl::DecimalQuantity& output, UErr // --------------------------------------- void Formattable::adoptDecimalQuantity(DecimalQuantity *dq) { - if (fDecimalQuantity != nullptr) { - delete fDecimalQuantity; - } + delete fDecimalQuantity; fDecimalQuantity = dq; if (dq == nullptr) { // allow adoptDigitList(nullptr) to clear return; @@ -1016,7 +1013,7 @@ ufmt_getDecNumChars(UFormattable *fmt, int32_t *len, UErrorCode *status) { return ""; } Formattable *obj = Formattable::fromUFormattable(fmt); - CharString *charString = obj->internalGetCharString(*status); + FixedString *charString = obj->internalGetFixedString(*status); if(U_FAILURE(*status)) { return ""; } @@ -1025,7 +1022,7 @@ ufmt_getDecNumChars(UFormattable *fmt, int32_t *len, UErrorCode *status) { return ""; } else { if(len!=nullptr) { - *len = charString->length(); + *len = static_cast<int32_t>(uprv_strlen(charString->data())); } return charString->data(); } diff --git a/deps/icu-small/source/i18n/format.cpp b/deps/icu-small/source/i18n/format.cpp index 10856a4acba286..07919d20f61ef4 100644 --- a/deps/icu-small/source/i18n/format.cpp +++ b/deps/icu-small/source/i18n/format.cpp @@ -70,9 +70,8 @@ FieldPosition::clone() const { // default constructor Format::Format() - : UObject() + : UObject(), actualLocale(Locale::getRoot()), validLocale(Locale::getRoot()) { - *validLocale = *actualLocale = 0; } // ------------------------------------- @@ -97,8 +96,8 @@ Format& Format::operator=(const Format& that) { if (this != &that) { - uprv_strcpy(validLocale, that.validLocale); - uprv_strcpy(actualLocale, that.actualLocale); + actualLocale = that.actualLocale; + validLocale = that.validLocale; } return *this; } @@ -196,20 +195,18 @@ void Format::syntaxError(const UnicodeString& pattern, Locale Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocale(type, status); + return LocaleBased::getLocale(validLocale, actualLocale, type, status); } const char * Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { - U_LOCALE_BASED(locBased, *this); - return locBased.getLocaleID(type, status); + return LocaleBased::getLocaleID(validLocale,actualLocale, type, status); } void Format::setLocaleIDs(const char* valid, const char* actual) { - U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs(valid, actual); + actualLocale = Locale(actual); + validLocale = Locale(valid); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/formatted_string_builder.cpp b/deps/icu-small/source/i18n/formatted_string_builder.cpp index 8dbf954af9ffa8..94082dc379f231 100644 --- a/deps/icu-small/source/i18n/formatted_string_builder.cpp +++ b/deps/icu-small/source/i18n/formatted_string_builder.cpp @@ -72,8 +72,8 @@ FormattedStringBuilder &FormattedStringBuilder::operator=(const FormattedStringB if (capacity > DEFAULT_CAPACITY) { // FIXME: uprv_malloc // C++ note: malloc appears in two places: here and in prepareForInsertHelper. - auto newChars = static_cast<char16_t *> (uprv_malloc(sizeof(char16_t) * capacity)); - auto newFields = static_cast<Field *>(uprv_malloc(sizeof(Field) * capacity)); + auto* newChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * capacity)); + auto* newFields = static_cast<Field*>(uprv_malloc(sizeof(Field) * capacity)); if (newChars == nullptr || newFields == nullptr) { // UErrorCode is not available; fail silently. uprv_free(newChars); @@ -153,13 +153,15 @@ FormattedStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field if (U_FAILURE(status)) { return count; } + auto* charPtr = getCharPtr(); + auto* fieldPtr = getFieldPtr(); if (count == 1) { - getCharPtr()[position] = (char16_t) codePoint; - getFieldPtr()[position] = field; + charPtr[position] = static_cast<char16_t>(codePoint); + fieldPtr[position] = field; } else { - getCharPtr()[position] = U16_LEAD(codePoint); - getCharPtr()[position + 1] = U16_TRAIL(codePoint); - getFieldPtr()[position] = getFieldPtr()[position + 1] = field; + charPtr[position] = U16_LEAD(codePoint); + charPtr[position + 1] = U16_TRAIL(codePoint); + fieldPtr[position] = fieldPtr[position + 1] = field; } return count; } @@ -306,8 +308,10 @@ int32_t FormattedStringBuilder::prepareForInsertHelper(int32_t index, int32_t co newZero = (newCapacity - newLength) / 2; // C++ note: malloc appears in two places: here and in the assignment operator. - auto newChars = static_cast<char16_t *> (uprv_malloc(sizeof(char16_t) * static_cast<size_t>(newCapacity))); - auto newFields = static_cast<Field *>(uprv_malloc(sizeof(Field) * static_cast<size_t>(newCapacity))); + auto* newChars = + static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * static_cast<size_t>(newCapacity))); + auto* newFields = + static_cast<Field*>(uprv_malloc(sizeof(Field) * static_cast<size_t>(newCapacity))); if (newChars == nullptr || newFields == nullptr) { uprv_free(newChars); uprv_free(newFields); @@ -378,7 +382,7 @@ UnicodeString FormattedStringBuilder::toUnicodeString() const { return UnicodeString(getCharPtr() + fZero, fLength); } -const UnicodeString FormattedStringBuilder::toTempUnicodeString() const { +UnicodeString FormattedStringBuilder::toTempUnicodeString() const { // Readonly-alias constructor: return UnicodeString(false, getCharPtr() + fZero, fLength); } diff --git a/deps/icu-small/source/i18n/formatted_string_builder.h b/deps/icu-small/source/i18n/formatted_string_builder.h index 32e0900ae23ac8..2ea7ac4f1b0ad1 100644 --- a/deps/icu-small/source/i18n/formatted_string_builder.h +++ b/deps/icu-small/source/i18n/formatted_string_builder.h @@ -171,7 +171,7 @@ class U_I18N_API FormattedStringBuilder : public UMemory { * Gets an "unsafe" UnicodeString that is valid only as long as the FormattedStringBuilder is alive and * unchanged. Slightly faster than toUnicodeString(). */ - const UnicodeString toTempUnicodeString() const; + UnicodeString toTempUnicodeString() const; UnicodeString toDebugString() const; @@ -219,8 +219,8 @@ class U_I18N_API FormattedStringBuilder : public UMemory { static_assert( // std::is_pod<> is deprecated. - std::is_standard_layout<FormattedStringBuilder::Field>::value && - std::is_trivial<FormattedStringBuilder::Field>::value, + std::is_standard_layout_v<FormattedStringBuilder::Field> && + std::is_trivial_v<FormattedStringBuilder::Field>, "Field should be a POD type for efficient initialization"); constexpr FormattedStringBuilder::Field::Field(uint8_t category, uint8_t field) diff --git a/deps/icu-small/source/i18n/formattedval_impl.h b/deps/icu-small/source/i18n/formattedval_impl.h index e19392c5b9d662..6b18d257876466 100644 --- a/deps/icu-small/source/i18n/formattedval_impl.h +++ b/deps/icu-small/source/i18n/formattedval_impl.h @@ -125,18 +125,6 @@ struct U_I18N_API SpanInfo { int32_t length; }; -// Export an explicit template instantiation of the MaybeStackArray that -// is used as a data member of CEBuffer. -// -// When building DLLs for Windows this is required even though -// no direct access to the MaybeStackArray leaks out of the i18n library. -// -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -// -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<SpanInfo, 8>; -#endif - /** * Implementation of FormattedValue based on FormattedStringBuilder. * @@ -145,13 +133,12 @@ template class U_I18N_API MaybeStackArray<SpanInfo, 8>; * * @author sffc (Shane Carr) */ -// Exported as U_I18N_API for tests -class U_I18N_API FormattedValueStringBuilderImpl : public UMemory, public FormattedValue { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS FormattedValueStringBuilderImpl : public UMemory, public FormattedValue { public: + U_I18N_API FormattedValueStringBuilderImpl(FormattedStringBuilder::Field numericField); - FormattedValueStringBuilderImpl(FormattedStringBuilder::Field numericField); - - virtual ~FormattedValueStringBuilderImpl(); + U_I18N_API virtual ~FormattedValueStringBuilderImpl(); FormattedValueStringBuilderImpl(FormattedValueStringBuilderImpl&&) = default; FormattedValueStringBuilderImpl& operator=(FormattedValueStringBuilderImpl&&) = default; @@ -164,8 +151,8 @@ class U_I18N_API FormattedValueStringBuilderImpl : public UMemory, public Format UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override; // Additional helper functions: - UBool nextFieldPosition(FieldPosition& fp, UErrorCode& status) const; - void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; + U_I18N_API UBool nextFieldPosition(FieldPosition& fp, UErrorCode& status) const; + U_I18N_API void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; inline FormattedStringBuilder& getStringRef() { return fString; } diff --git a/deps/icu-small/source/i18n/formattedvalue.cpp b/deps/icu-small/source/i18n/formattedvalue.cpp index aacd6ac70e090f..f2bfdda6e465f2 100644 --- a/deps/icu-small/source/i18n/formattedvalue.cpp +++ b/deps/icu-small/source/i18n/formattedvalue.cpp @@ -193,6 +193,11 @@ ucfpos_close(UConstrainedFieldPosition* ptr) { } +// -Wreturn-local-addr first found in https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gcc/Warning-Options.html#Warning-Options +#if U_GCC_MAJOR_MINOR >= 409 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wreturn-local-addr" +#endif U_CAPI const char16_t* U_EXPORT2 ufmtval_getString( const UFormattedValue* ufmtval, @@ -213,6 +218,9 @@ ufmtval_getString( // defined to return memory owned by the ufmtval argument. return readOnlyAlias.getBuffer(); } +#if U_GCC_MAJOR_MINOR >= 409 +#pragma GCC diagnostic pop +#endif U_CAPI UBool U_EXPORT2 diff --git a/deps/icu-small/source/i18n/fphdlimp.h b/deps/icu-small/source/i18n/fphdlimp.h index ad09c6c90362d7..9cad36ac86b159 100644 --- a/deps/icu-small/source/i18n/fphdlimp.h +++ b/deps/icu-small/source/i18n/fphdlimp.h @@ -76,9 +76,7 @@ class U_I18N_API FieldPositionIteratorHandler : public FieldPositionHandler { // This attempts to encourage that by blocking heap allocation. static void* U_EXPORT2 operator new(size_t) noexcept = delete; static void* U_EXPORT2 operator new[](size_t) noexcept = delete; -#if U_HAVE_PLACEMENT_NEW static void* U_EXPORT2 operator new(size_t, void*) noexcept = delete; -#endif public: FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& status); diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index d023b50218a548..6e9d8d2ac03604 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -25,7 +25,6 @@ #include "unicode/ugender.h" #include "unicode/ures.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -108,7 +107,7 @@ const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& stat const char* key = locale.getName(); { Mutex lock(&gGenderMetaLock); - result = (const GenderInfo*) uhash_get(gGenderInfoCache, key); + result = static_cast<const GenderInfo*>(uhash_get(gGenderInfoCache, key)); } if (result) { return result; @@ -124,7 +123,7 @@ const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& stat // favor the GenderInfo object that is already in the cache. { Mutex lock(&gGenderMetaLock); - GenderInfo* temp = (GenderInfo*) uhash_get(gGenderInfoCache, key); + GenderInfo* temp = static_cast<GenderInfo*>(uhash_get(gGenderInfoCache, key)); if (temp) { result = temp; } else { @@ -156,11 +155,9 @@ const GenderInfo* GenderInfo::loadInstance(const Locale& locale, UErrorCode& sta CharString parentLocaleName(curLocaleName, key_status); while (s == nullptr) { { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(parentLocaleName.data(), sink, &status); - if (tmp.isEmpty()) break; - parentLocaleName = std::move(tmp); + CharString tmp = ulocimp_getParent(parentLocaleName.data(), status); + if (tmp.isEmpty()) break; + parentLocaleName = std::move(tmp); } key_status = U_ZERO_ERROR; resLen = 0; diff --git a/deps/icu-small/source/i18n/gregocal.cpp b/deps/icu-small/source/i18n/gregocal.cpp index ec14abbbf10c81..3dc3950e274f79 100644 --- a/deps/icu-small/source/i18n/gregocal.cpp +++ b/deps/icu-small/source/i18n/gregocal.cpp @@ -147,6 +147,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GregorianCalendar) // in Java, -12219292800000L //const UDate GregorianCalendar::kPapalCutover = -12219292800000L; static const uint32_t kCutoverJulianDay = 2299161; +static const int32_t kDefaultCutoverYear = 1582; static const UDate kPapalCutover = (2299161.0 - kEpochStartAsJulianDay) * U_MILLIS_PER_DAY; //static const UDate kPapalCutoverJulian = (2299161.0 - kEpochStartAsJulianDay); @@ -155,7 +156,7 @@ static const UDate kPapalCutover = (2299161.0 - kEpochStartAsJulianDay) * U_MILL GregorianCalendar::GregorianCalendar(UErrorCode& status) : Calendar(status), fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), +fCutoverJulianDay(kCutoverJulianDay), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -164,34 +165,22 @@ fIsGregorian(true), fInvertGregorian(false) // ------------------------------------- GregorianCalendar::GregorianCalendar(TimeZone* zone, UErrorCode& status) -: Calendar(zone, Locale::getDefault(), status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(zone, Locale::getDefault(), status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- GregorianCalendar::GregorianCalendar(const TimeZone& zone, UErrorCode& status) -: Calendar(zone, Locale::getDefault(), status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(zone, Locale::getDefault(), status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- GregorianCalendar::GregorianCalendar(const Locale& aLocale, UErrorCode& status) -: Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, status), -fGregorianCutover(kPapalCutover), -fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), -fIsGregorian(true), fInvertGregorian(false) +: GregorianCalendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, status) { - setTimeInMillis(getNow(), status); } // ------------------------------------- @@ -200,7 +189,7 @@ GregorianCalendar::GregorianCalendar(TimeZone* zone, const Locale& aLocale, UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -212,7 +201,7 @@ GregorianCalendar::GregorianCalendar(const TimeZone& zone, const Locale& aLocale UErrorCode& status) : Calendar(zone, aLocale, status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { setTimeInMillis(getNow(), status); @@ -224,7 +213,7 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& status) : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), + fCutoverJulianDay(kCutoverJulianDay), fGregorianCutoverYear(kDefaultCutoverYear), fIsGregorian(true), fInvertGregorian(false) { set(UCAL_ERA, AD); @@ -237,15 +226,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& status) - : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), - fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), - fIsGregorian(true), fInvertGregorian(false) + : GregorianCalendar(year, month, date, status) { - set(UCAL_ERA, AD); - set(UCAL_YEAR, year); - set(UCAL_MONTH, month); - set(UCAL_DATE, date); set(UCAL_HOUR_OF_DAY, hour); set(UCAL_MINUTE, minute); } @@ -255,17 +237,8 @@ GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, GregorianCalendar::GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& status) - : Calendar(TimeZone::createDefault(), Locale::getDefault(), status), - fGregorianCutover(kPapalCutover), - fCutoverJulianDay(kCutoverJulianDay), fNormalizedGregorianCutover(fGregorianCutover), fGregorianCutoverYear(1582), - fIsGregorian(true), fInvertGregorian(false) + : GregorianCalendar(year, month, date, hour, minute, status) { - set(UCAL_ERA, AD); - set(UCAL_YEAR, year); - set(UCAL_MONTH, month); - set(UCAL_DATE, date); - set(UCAL_HOUR_OF_DAY, hour); - set(UCAL_MINUTE, minute); set(UCAL_SECOND, second); } @@ -280,7 +253,7 @@ GregorianCalendar::~GregorianCalendar() GregorianCalendar::GregorianCalendar(const GregorianCalendar &source) : Calendar(source), fGregorianCutover(source.fGregorianCutover), -fCutoverJulianDay(source.fCutoverJulianDay), fNormalizedGregorianCutover(source.fNormalizedGregorianCutover), fGregorianCutoverYear(source.fGregorianCutoverYear), +fCutoverJulianDay(source.fCutoverJulianDay), fGregorianCutoverYear(source.fGregorianCutoverYear), fIsGregorian(source.fIsGregorian), fInvertGregorian(source.fInvertGregorian) { } @@ -301,7 +274,6 @@ GregorianCalendar::operator=(const GregorianCalendar &right) { Calendar::operator=(right); fGregorianCutover = right.fGregorianCutover; - fNormalizedGregorianCutover = right.fNormalizedGregorianCutover; fGregorianCutoverYear = right.fGregorianCutoverYear; fCutoverJulianDay = right.fCutoverJulianDay; } @@ -331,19 +303,18 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) // normalized cutover is in pure date milliseconds; it contains no time // of day or timezone component, and it used to compare against other // pure date values. - double cutoverDay = ClockMath::floorDivide(date, (double)kOneDay); + double cutoverDay = ClockMath::floorDivide(date, kOneDay); // Handle the rare case of numeric overflow where the user specifies a time // outside of INT32_MIN .. INT32_MAX number of days. if (cutoverDay <= INT32_MIN) { cutoverDay = INT32_MIN; - fGregorianCutover = fNormalizedGregorianCutover = cutoverDay * kOneDay; + fGregorianCutover = cutoverDay * kOneDay; } else if (cutoverDay >= INT32_MAX) { cutoverDay = INT32_MAX; - fGregorianCutover = fNormalizedGregorianCutover = cutoverDay * kOneDay; + fGregorianCutover = cutoverDay * kOneDay; } else { - fNormalizedGregorianCutover = cutoverDay * kOneDay; fGregorianCutover = date; } @@ -351,27 +322,27 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) // values. GregorianCalendar *cal = new GregorianCalendar(getTimeZone(), status); /* test for nullptr */ - if (cal == 0) { + if (cal == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - if(U_FAILURE(status)) + if(U_FAILURE(status)) { return; + } cal->setTime(date, status); fGregorianCutoverYear = cal->get(UCAL_YEAR, status); - if (cal->get(UCAL_ERA, status) == BC) + if (cal->get(UCAL_ERA, status) == BC) { fGregorianCutoverYear = 1 - fGregorianCutoverYear; - fCutoverJulianDay = (int32_t)cutoverDay; + } + fCutoverJulianDay = static_cast<int32_t>(cutoverDay); delete cal; } - void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { int32_t eyear, month, dayOfMonth, dayOfYear, unusedRemainder; - - if(U_FAILURE(status)) { - return; + if(U_FAILURE(status)) { + return; } #if defined (U_DEBUG_CAL) @@ -379,7 +350,6 @@ void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& statu __FILE__, __LINE__, julianDay, getGregorianDayOfYear(), fCutoverJulianDay); #endif - if (julianDay >= fCutoverJulianDay) { month = getGregorianMonth(); dayOfMonth = getGregorianDayOfMonth(); @@ -389,10 +359,10 @@ void GregorianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& statu // The Julian epoch day (not the same as Julian Day) // is zero on Saturday December 30, 0 (Gregorian). int32_t julianEpochDay = julianDay - (kJan1_1JulianDay - 2); - eyear = (int32_t) ClockMath::floorDivide((4.0*julianEpochDay) + 1464.0, (int32_t) 1461, &unusedRemainder); + eyear = static_cast<int32_t>(ClockMath::floorDivide((4.0 * julianEpochDay) + 1464.0, static_cast<int32_t>(1461), &unusedRemainder)); // Compute the Julian calendar day number for January 1, eyear - int32_t january1 = 365*(eyear-1) + ClockMath::floorDivide(eyear-1, (int32_t)4); + int32_t january1 = 365 * (eyear - 1) + ClockMath::floorDivide(eyear - 1, static_cast<int32_t>(4)); dayOfYear = (julianEpochDay - january1); // 0-based // Julian leap years occurred historically every 4 years starting @@ -472,17 +442,20 @@ GregorianCalendar::isLeapYear(int32_t year) const // ------------------------------------- -int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) +int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode& status) { fInvertGregorian = false; - int32_t jd = Calendar::handleComputeJulianDay(bestField); + int32_t jd = Calendar::handleComputeJulianDay(bestField, status); + if (U_FAILURE(status)) { + return 0; + } if((bestField == UCAL_WEEK_OF_YEAR) && // if we are doing WOY calculations, we are counting relative to Jan 1 *julian* (internalGet(UCAL_EXTENDED_YEAR)==fGregorianCutoverYear) && jd >= fCutoverJulianDay) { fInvertGregorian = true; // So that the Julian Jan 1 will be used in handleComputeMonthStart - return Calendar::handleComputeJulianDay(bestField); + return Calendar::handleComputeJulianDay(bestField, status); } @@ -495,7 +468,10 @@ int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) __FILE__, __LINE__, jd); #endif fInvertGregorian = true; - jd = Calendar::handleComputeJulianDay(bestField); + jd = Calendar::handleComputeJulianDay(bestField, status); + if (U_FAILURE(status)) { + return 0; + } #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: fIsGregorian %s, fInvertGregorian %s - ", __FILE__, __LINE__,fIsGregorian?"T":"F", fInvertGregorian?"T":"F"); @@ -530,21 +506,29 @@ int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField) return jd; } -int32_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, +int64_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, - UBool /* useMonth */) const + UBool /* useMonth */, UErrorCode& status) const { - GregorianCalendar *nonConstThis = (GregorianCalendar*)this; // cast away const + if (U_FAILURE(status)) { + return 0; + } + GregorianCalendar* nonConstThis = const_cast<GregorianCalendar*>(this); // cast away const // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { - eyear += ClockMath::floorDivide(month, 12, &month); + if (uprv_add32_overflow(ClockMath::floorDivide(month, 12, &month), + eyear, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } UBool isLeap = eyear%4 == 0; - int64_t y = (int64_t)eyear-1; - int64_t julianDay = 365*y + ClockMath::floorDivide(y, (int64_t)4) + (kJan1_1JulianDay - 3); + int64_t y = static_cast<int64_t>(eyear) - 1; + int64_t julianDay = 365LL * y + + ClockMath::floorDivideInt64(y, 4LL) + kJan1_1JulianDay - 3LL; nonConstThis->fIsGregorian = (eyear >= fGregorianCutoverYear); #if defined (U_DEBUG_CAL) @@ -574,10 +558,10 @@ int32_t GregorianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, julianDay += isLeap?kLeapNumDays[month]:kNumDays[month]; } - return static_cast<int32_t>(julianDay); + return julianDay; } -int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const +int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& /* status */) const { // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. @@ -588,16 +572,17 @@ int32_t GregorianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t mo return isLeapYear(extendedYear) ? kLeapMonthLength[month] : kMonthLength[month]; } -int32_t GregorianCalendar::handleGetYearLength(int32_t eyear) const { +int32_t GregorianCalendar::handleGetYearLength(int32_t eyear, UErrorCode& status) const { + if (U_FAILURE(status)) return 0; return isLeapYear(eyear) ? 366 : 365; } int32_t -GregorianCalendar::monthLength(int32_t month) const +GregorianCalendar::monthLength(int32_t month, UErrorCode& status) const { int32_t year = internalGet(UCAL_EXTENDED_YEAR); - return handleGetMonthLength(year, month); + return handleGetMonthLength(year, month, status); } // ------------------------------------- @@ -625,8 +610,8 @@ GregorianCalendar::validateFields() const // Ignore DATE and DAY_OF_YEAR which are handled below if (field != UCAL_DATE && field != UCAL_DAY_OF_YEAR && - isSet((UCalendarDateFields)field) && - ! boundsCheck(internalGet((UCalendarDateFields)field), (UCalendarDateFields)field)) + isSet(static_cast<UCalendarDateFields>(field)) && + !boundsCheck(internalGet(static_cast<UCalendarDateFields>(field)), static_cast<UCalendarDateFields>(field))) return false; } @@ -634,10 +619,12 @@ GregorianCalendar::validateFields() const // specially. if (isSet(UCAL_DATE)) { int32_t date = internalGet(UCAL_DATE); + UErrorCode internalStatus = U_ZERO_ERROR; if (date < getMinimum(UCAL_DATE) || - date > monthLength(internalGetMonth())) { + date > monthLength(internalGetMonth(internalStatus), internalStatus) || + U_FAILURE(internalStatus)) { return false; - } + } } if (isSet(UCAL_DAY_OF_YEAR)) { @@ -760,10 +747,10 @@ double GregorianCalendar::computeJulianDayOfYear(UBool isGregorian, // ------------------------------------- -double +double GregorianCalendar::millisToJulianDay(UDate millis) { - return (double)kEpochStartAsJulianDay + ClockMath::floorDivide(millis, (double)kOneDay); + return static_cast<double>(kEpochStartAsJulianDay) + ClockMath::floorDivide(millis, kOneDay); } // ------------------------------------- @@ -771,17 +758,17 @@ GregorianCalendar::millisToJulianDay(UDate millis) UDate GregorianCalendar::julianDayToMillis(double julian) { - return (UDate) ((julian - kEpochStartAsJulianDay) * (double) kOneDay); + return static_cast<UDate>((julian - kEpochStartAsJulianDay) * kOneDay); } // ------------------------------------- int32_t -GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) +GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) { - return (((stamp_a != kUnset && stamp_b != kUnset) + return (((stamp_a != kUnset && stamp_b != kUnset) ? uprv_max(stamp_a, stamp_b) - : (int32_t)kUnset)); + : static_cast<int32_t>(kUnset))); } // ------------------------------------- @@ -791,9 +778,9 @@ GregorianCalendar::aggregateStamp(int32_t stamp_a, int32_t stamp_b) * Note: This will be made public later. [LIU] */ -void +void GregorianCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { - roll((UCalendarDateFields) field, amount, status); + roll(static_cast<UCalendarDateFields>(field), amount, status); } void @@ -814,7 +801,10 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s case UCAL_DAY_OF_MONTH: case UCAL_WEEK_OF_MONTH: { - int32_t max = monthLength(internalGetMonth()); + int32_t max = monthLength(internalGetMonth(status), status); + if (U_FAILURE(status)) { + return; + } UDate t = internalGetTime(); // We subtract 1 from the DAY_OF_MONTH to make it zero-based, and an // additional 10 if we are after the cutover. Thus the monthStart @@ -825,7 +815,7 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if ((cMonthStart < fGregorianCutover) && (cMonthStart + (cMonthLen=(max-10))*kOneDay >= fGregorianCutover)) { inCutoverMonth = true; - } + } } break; default: @@ -847,16 +837,24 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s // may be one year before or after the calendar year. int32_t isoYear = get(UCAL_YEAR_WOY, status); int32_t isoDoy = internalGet(UCAL_DAY_OF_YEAR); - if (internalGetMonth() == UCAL_JANUARY) { + int32_t month = internalGetMonth(status); + if (U_FAILURE(status)) { + return; + } + if (month == UCAL_JANUARY) { if (woy >= 52) { - isoDoy += handleGetYearLength(isoYear); + isoDoy += handleGetYearLength(isoYear, status); } } else { if (woy == 1) { - isoDoy -= handleGetYearLength(isoYear - 1); + isoDoy -= handleGetYearLength(isoYear - 1, status); } } - woy += amount; + if (U_FAILURE(status)) return; + if (uprv_add32_overflow(woy, amount, &woy)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Do fast checks to avoid unnecessary computation: if (woy < 1 || woy > 52) { // Determine the last week of the ISO year. @@ -865,7 +863,8 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s // days at the end of the year are going to fall into // week 1 of the next year, we drop the last week by // subtracting 7 from the last day of the year. - int32_t lastDoy = handleGetYearLength(isoYear); + int32_t lastDoy = handleGetYearLength(isoYear, status); + if (U_FAILURE(status)) return; int32_t lastRelDow = (lastDoy - isoDoy + internalGet(UCAL_DAY_OF_WEEK) - getFirstDayOfWeek()) % 7; if (lastRelDow < 0) lastRelDow += 7; @@ -882,7 +881,8 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if( !inCutoverMonth ) { Calendar::roll(field, amount, status); return; - } else { + } + { // [j81] 1582 special case for DOM // The default computation works except when the current month // contains the Gregorian cutover. We handle this special case @@ -905,7 +905,8 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s if( !inCutoverMonth ) { Calendar::roll(field, amount, status); return; - } else { + } + { #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: roll WOM %d ??????????????????? \n", __FILE__, __LINE__,amount); @@ -1028,12 +1029,12 @@ GregorianCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& s */ int32_t GregorianCalendar::getActualMinimum(EDateFields field) const { - return getMinimum((UCalendarDateFields)field); + return getMinimum(static_cast<UCalendarDateFields>(field)); } int32_t GregorianCalendar::getActualMinimum(EDateFields field, UErrorCode& /* status */) const { - return getMinimum((UCalendarDateFields)field); + return getMinimum(static_cast<UCalendarDateFields>(field)); } /** @@ -1151,19 +1152,18 @@ int32_t GregorianCalendar::getActualMaximum(UCalendarDateFields field, UErrorCod } -int32_t GregorianCalendar::handleGetExtendedYear() { +int32_t GregorianCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // the year to return int32_t year = kEpochYear; // year field to use - int32_t yearField = UCAL_EXTENDED_YEAR; - // There are three separate fields which could be used to // derive the proper year. Use the one most recently set. - if (fStamp[yearField] < fStamp[UCAL_YEAR]) - yearField = UCAL_YEAR; - if (fStamp[yearField] < fStamp[UCAL_YEAR_WOY]) - yearField = UCAL_YEAR_WOY; + UCalendarDateFields yearField = newerField( + newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR), UCAL_YEAR_WOY); // based on the "best" year field, get the year switch(yearField) { @@ -1177,14 +1177,21 @@ int32_t GregorianCalendar::handleGetExtendedYear() { int32_t era = internalGet(UCAL_ERA, AD); if (era == BC) { year = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year - } else { + } else if (era == AD) { year = internalGet(UCAL_YEAR, kEpochYear); + } else { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } } break; case UCAL_YEAR_WOY: - year = handleGetExtendedYearFromWeekFields(internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR)); + year = handleGetExtendedYearFromWeekFields( + internalGet(UCAL_YEAR_WOY), internalGet(UCAL_WEEK_OF_YEAR), status); + if (U_FAILURE(status)) { + return 0; + } #if defined (U_DEBUG_CAL) // if(internalGet(UCAL_YEAR_WOY) != year) { fprintf(stderr, "%s:%d: hGEYFWF[%d,%d] -> %d\n", @@ -1199,14 +1206,17 @@ int32_t GregorianCalendar::handleGetExtendedYear() { return year; } -int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) +int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // convert year to extended form int32_t era = internalGet(UCAL_ERA, AD); if(era == BC) { yearWoy = 1 - yearWoy; } - return Calendar::handleGetExtendedYearFromWeekFields(yearWoy, woy); + return Calendar::handleGetExtendedYearFromWeekFields(yearWoy, woy, status); } @@ -1218,7 +1228,7 @@ int32_t GregorianCalendar::handleGetExtendedYearFromWeekFields(int32_t yearWoy, */ int32_t GregorianCalendar::internalGetEra() const { - return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : (int32_t)AD; + return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : static_cast<int32_t>(AD); } const char * @@ -1228,51 +1238,7 @@ GregorianCalendar::getType() const { return "gregorian"; } -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool GregorianCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - GregorianCalendar calendar(status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate GregorianCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t GregorianCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(GregorianCalendar, "@calendar=gregory") U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index 31b5aeed8354fc..5253c9ed0bd0f9 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -27,12 +27,21 @@ int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) { numerator / denominator : ((numerator + 1) / denominator) - 1; } -int64_t ClockMath::floorDivide(int64_t numerator, int64_t denominator) { +int64_t ClockMath::floorDivideInt64(int64_t numerator, int64_t denominator) { return (numerator >= 0) ? numerator / denominator : ((numerator + 1) / denominator) - 1; } -int32_t ClockMath::floorDivide(double numerator, int32_t denominator, +int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator, + int32_t* remainder) { + int64_t quotient = floorDivide(numerator, denominator); + if (remainder != nullptr) { + *remainder = numerator - (quotient * denominator); + } + return quotient; +} + +double ClockMath::floorDivide(double numerator, int32_t denominator, int32_t* remainder) { // For an integer n and representable ⌊x/n⌋, ⌊RN(x/n)⌋=⌊x/n⌋, where RN is // rounding to nearest. @@ -42,9 +51,9 @@ int32_t ClockMath::floorDivide(double numerator, int32_t denominator, // expression `(int32_t) (x + n)` evaluated with rounding to nearest // differs from ⌊x+n⌋ if 0 < ⌈x⌉−x ≪ x+n, as `x + n` is rounded up to // n+⌈x⌉ = ⌊x+n⌋ + 1. Rewriting it as ⌊x⌋+n makes the addition exact. - *remainder = (int32_t) (uprv_floor(numerator) - (quotient * denominator)); + *remainder = static_cast<int32_t>(uprv_floor(numerator) - (quotient * denominator)); } - return (int32_t) quotient; + return quotient; } double ClockMath::floorDivide(double dividend, double divisor, @@ -95,64 +104,113 @@ const int8_t Grego::MONTH_LENGTH[24] = {31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; -double Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { +int64_t Grego::fieldsToDay(int32_t year, int32_t month, int32_t dom) { - int32_t y = year - 1; + int64_t y = year; + y--; - double julian = 365 * y + ClockMath::floorDivide(y, 4) + (JULIAN_1_CE - 3) + // Julian cal - ClockMath::floorDivide(y, 400) - ClockMath::floorDivide(y, 100) + 2 + // => Gregorian cal + int64_t julian = 365LL * y + + ClockMath::floorDivideInt64(y, 4LL) + (JULIAN_1_CE - 3) + // Julian cal + ClockMath::floorDivideInt64(y, 400LL) - + ClockMath::floorDivideInt64(y, 100LL) + 2 + // => Gregorian cal DAYS_BEFORE[month + (isLeapYear(year) ? 12 : 0)] + dom; // => month/dom return julian - JULIAN_1970_CE; // JD => epoch day } -void Grego::dayToFields(double day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy) { +void Grego::dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, UErrorCode& status) { + year = dayToYear(day, doy, status); // one-based doy + if (U_FAILURE(status)) return; // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) - day += JULIAN_1970_CE - JULIAN_1_CE; + if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + // Gregorian day zero is a Monday. + dow = (day + 1) % 7; + dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY; + + // Common Julian/Gregorian calculation + int32_t correction = 0; + bool isLeap = isLeapYear(year); + int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 + if (doy > march1) { + correction = isLeap ? 1 : 2; + } + month = (12 * (doy - 1 + correction) + 6) / 367; // zero-based month + dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)]; // one-based DOM +} + +int32_t Grego::dayToYear(int32_t day, UErrorCode& status) { + int16_t unusedDOY; + return dayToYear(day, unusedDOY, status); +} + +int32_t Grego::dayToYear(int32_t day, int16_t& doy, UErrorCode& status) { + if (U_FAILURE(status)) return 0; + // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) + if (uprv_add32_overflow(day, JULIAN_1970_CE - JULIAN_1_CE, &day)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } // Convert from the day number to the multiple radix // representation. We use 400-year, 100-year, and 4-year cycles. // For example, the 4-year cycle has 4 years + 1 leap day; giving // 1461 == 365*4 + 1 days. - int32_t n400 = ClockMath::floorDivide(day, 146097, &doy); // 400-year cycle length - int32_t n100 = ClockMath::floorDivide(doy, 36524, &doy); // 100-year cycle length - int32_t n4 = ClockMath::floorDivide(doy, 1461, &doy); // 4-year cycle length - int32_t n1 = ClockMath::floorDivide(doy, 365, &doy); - year = 400*n400 + 100*n100 + 4*n4 + n1; + int32_t doy32; + int32_t n400 = ClockMath::floorDivide(day, 146097, &doy32); // 400-year cycle length + int32_t n100 = ClockMath::floorDivide(doy32, 36524, &doy32); // 100-year cycle length + int32_t n4 = ClockMath::floorDivide(doy32, 1461, &doy32); // 4-year cycle length + int32_t n1 = ClockMath::floorDivide(doy32, 365, &doy32); + int32_t year = 400*n400 + 100*n100 + 4*n4 + n1; if (n100 == 4 || n1 == 4) { doy = 365; // Dec 31 at end of 4- or 400-year cycle } else { + doy = doy32; ++year; } - - UBool isLeap = isLeapYear(year); - - // Gregorian day zero is a Monday. - dow = (int32_t) uprv_fmod(day + 1, 7); - dow += (dow < 0) ? (UCAL_SUNDAY + 7) : UCAL_SUNDAY; + doy++; // one-based doy + return year; +} - // Common Julian/Gregorian calculation - int32_t correction = 0; - int32_t march1 = isLeap ? 60 : 59; // zero-based DOY for March 1 - if (doy >= march1) { - correction = isLeap ? 1 : 2; +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int32_t& mid, UErrorCode& status) { + int8_t unusedDOW; + timeToFields(time, year, month, dom, unusedDOW, mid, status); +} + +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int32_t& mid, UErrorCode& status) { + int16_t unusedDOY; + timeToFields(time, year, month, dom, dow, unusedDOY, mid, status); +} + +void Grego::timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, int32_t& mid, UErrorCode& status) { + if (U_FAILURE(status)) return; + double day = ClockMath::floorDivide(time, U_MILLIS_PER_DAY, &mid); + if (day > INT32_MAX || day < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; } - month = (12 * (doy + correction) + 6) / 367; // zero-based month - dom = doy - DAYS_BEFORE[month + (isLeap ? 12 : 0)] + 1; // one-based DOM - doy++; // one-based doy + dayToFields(day, year, month, dom, dow, doy, status); } -void Grego::timeToFields(UDate time, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, int32_t& mid) { - double millisInDay; - double day = ClockMath::floorDivide((double)time, (double)U_MILLIS_PER_DAY, &millisInDay); - mid = (int32_t)millisInDay; - dayToFields(day, year, month, dom, dow, doy); +int32_t Grego::timeToYear(UDate time, UErrorCode& status) { + if (U_FAILURE(status)) return 0; + double day = ClockMath::floorDivide(time, double(U_MILLIS_PER_DAY)); + if (day > INT32_MAX || day < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return Grego::dayToYear(day, status); } -int32_t Grego::dayOfWeek(double day) { +int32_t Grego::dayOfWeek(int32_t day) { int32_t dow; ClockMath::floorDivide(day + int{UCAL_THURSDAY}, 7, &dow); return (dow == 0) ? UCAL_SATURDAY : dow; diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index d65d6a4f88e928..1b656d64271dac 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -14,6 +14,7 @@ #ifndef GREGOIMP_H #define GREGOIMP_H #include "unicode/utypes.h" +#include "unicode/calendar.h" #if !UCONFIG_NO_FORMATTING #include "unicode/ures.h" @@ -49,7 +50,7 @@ class ClockMath { * @param denominator a divisor which must be != 0 * @return the floor of the quotient */ - static int64_t floorDivide(int64_t numerator, int64_t denominator); + static int64_t floorDivideInt64(int64_t numerator, int64_t denominator); /** * Divide two numbers, returning the floor of the quotient. @@ -77,7 +78,25 @@ class ClockMath { * |denominator|)</code>. * @return the floor of the quotient */ - static int32_t floorDivide(double numerator, int32_t denominator, + static int32_t floorDivide(int32_t numerator, int32_t denominator, + int32_t* remainder); + + /** + * Divide two numbers, returning the floor of the quotient and + * the modulus remainder. Unlike the built-in division, this is + * mathematically well-behaved. E.g., <code>-1/4</code> => 0 and + * <code>-1%4</code> => -1, but <code>floorDivide(-1,4)</code> => + * -1 with <code>remainder</code> => 3. NOTE: If numerator is + * too large, the returned quotient may overflow. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @param remainder output parameter to receive the + * remainder. Unlike <code>numerator % denominator</code>, this + * will always be non-negative, in the half-open range <code>[0, + * |denominator|)</code>. + * @return the floor of the quotient + */ + static double floorDivide(double numerator, int32_t denominator, int32_t* remainder); /** @@ -178,32 +197,52 @@ class Grego { * @param dom 1-based day of month * @return the day number, with day 0 == Jan 1 1970 */ - static double fieldsToDay(int32_t year, int32_t month, int32_t dom); + static int64_t fieldsToDay(int32_t year, int32_t month, int32_t dom); /** * Convert a 1970-epoch day number to proleptic Gregorian year, * month, day-of-month, and day-of-week. - * @param day 1970-epoch day (integral value) + * @param day 1970-epoch day * @param year output parameter to receive year * @param month output parameter to receive month (0-based, 0==Jan) * @param dom output parameter to receive day-of-month (1-based) * @param dow output parameter to receive day-of-week (1-based, 1==Sun) * @param doy output parameter to receive day-of-year (1-based) + * @param status error code. */ - static void dayToFields(double day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy); + static void dayToFields(int32_t day, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, UErrorCode& status); /** - * Convert a 1970-epoch day number to proleptic Gregorian year, - * month, day-of-month, and day-of-week. - * @param day 1970-epoch day (integral value) + * Convert a 1970-epoch day number to proleptic Gregorian year. + * @param day 1970-epoch day + * @param status error code. + * @return year. + */ + static int32_t dayToYear(int32_t day, UErrorCode& status); + /** + * Convert a 1970-epoch day number to proleptic Gregorian year. + * @param day 1970-epoch day + * @param doy output parameter to receive day-of-year (1-based) + * @param status error code. + * @return year. + */ + static int32_t dayToYear(int32_t day, int16_t& doy, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year, + * month, day-of-month, and day-of-week, day of year and millis-in-day. + * @param time 1970-epoch milliseconds * @param year output parameter to receive year * @param month output parameter to receive month (0-based, 0==Jan) * @param dom output parameter to receive day-of-month (1-based) * @param dow output parameter to receive day-of-week (1-based, 1==Sun) + * @param doy output parameter to receive day-of-year (1-based) + * @param mid output parameter to receive millis-in-day + * @param status error code. */ - static inline void dayToFields(double day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow); + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int16_t& doy, int32_t& mid, UErrorCode& status); /** * Convert a 1970-epoch milliseconds to proleptic Gregorian year, @@ -213,18 +252,39 @@ class Grego { * @param month output parameter to receive month (0-based, 0==Jan) * @param dom output parameter to receive day-of-month (1-based) * @param dow output parameter to receive day-of-week (1-based, 1==Sun) - * @param doy output parameter to receive day-of-year (1-based) * @param mid output parameter to receive millis-in-day + * @param status error code. + */ + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int8_t& dow, int32_t& mid, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year, + * month, day-of-month, and day-of-week, day of year and millis-in-day. + * @param time 1970-epoch milliseconds + * @param year output parameter to receive year + * @param month output parameter to receive month (0-based, 0==Jan) + * @param dom output parameter to receive day-of-month (1-based) + * @param mid output parameter to receive millis-in-day + * @param status error code. + */ + static void timeToFields(UDate time, int32_t& year, int8_t& month, + int8_t& dom, int32_t& mid, UErrorCode& status); + + /** + * Convert a 1970-epoch milliseconds to proleptic Gregorian year. + * @param time 1970-epoch milliseconds + * @param status error code. + * @return year. */ - static void timeToFields(UDate time, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow, int32_t& doy, int32_t& mid); + static int32_t timeToYear(UDate time, UErrorCode& status); /** * Return the day of week on the 1970-epoch day - * @param day the 1970-epoch day (integral value) + * @param day the 1970-epoch day * @return the day of week */ - static int32_t dayOfWeek(double day); + static int32_t dayOfWeek(int32_t day); /** * Returns the ordinal number for the specified day of week within the month. @@ -283,27 +343,61 @@ Grego::previousMonthLength(int y, int m) { return (m > 0) ? monthLength(y, m-1) : 31; } -inline void Grego::dayToFields(double day, int32_t& year, int32_t& month, - int32_t& dom, int32_t& dow) { - int32_t doy_unused; - dayToFields(day,year,month,dom,dow,doy_unused); -} - inline double Grego::julianDayToMillis(int32_t julian) { - return (julian - kEpochStartAsJulianDay) * kOneDay; + return (static_cast<double>(julian) - kEpochStartAsJulianDay) * kOneDay; } inline int32_t Grego::millisToJulianDay(double millis) { - return (int32_t) (kEpochStartAsJulianDay + ClockMath::floorDivide(millis, (double)kOneDay)); + return static_cast<int32_t>(kEpochStartAsJulianDay + ClockMath::floorDivide(millis, kOneDay)); } inline int32_t Grego::gregorianShift(int32_t eyear) { - int64_t y = (int64_t)eyear-1; - int32_t gregShift = static_cast<int32_t>(ClockMath::floorDivide(y, (int64_t)400) - ClockMath::floorDivide(y, (int64_t)100) + 2); - return gregShift; + int64_t y = static_cast<int64_t>(eyear) - 1; + int64_t gregShift = ClockMath::floorDivideInt64(y, 400LL) - ClockMath::floorDivideInt64(y, 100LL) + 2; + return static_cast<int32_t>(gregShift); } +#define IMPL_SYSTEM_DEFAULT_CENTURY(T, U) \ + /** \ + * The system maintains a static default century start date and Year. They \ + * are initialized the first time they are used. Once the system default \ + * century date and year are set, they do not change \ + */ \ + namespace { \ + static UDate gSystemDefaultCenturyStart = DBL_MIN; \ + static int32_t gSystemDefaultCenturyStartYear = -1; \ + static icu::UInitOnce gSystemDefaultCenturyInit {}; \ + static void U_CALLCONV \ + initializeSystemDefaultCentury() { \ + UErrorCode status = U_ZERO_ERROR; \ + T calendar(U, status); \ + /* initialize systemDefaultCentury and systemDefaultCenturyYear based */ \ + /* on the current time. They'll be set to 80 years before */ \ + /* the current time. */ \ + if (U_FAILURE(status)) { \ + return; \ + } \ + calendar.setTime(Calendar::getNow(), status); \ + calendar.add(UCAL_YEAR, -80, status); \ + gSystemDefaultCenturyStart = calendar.getTime(status); \ + gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); \ + /* We have no recourse upon failure unless we want to propagate the */ \ + /* failure out. */ \ + } \ + } /* namespace */ \ + UDate T::defaultCenturyStart() const { \ + /* lazy-evaluate systemDefaultCenturyStart */ \ + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \ + return gSystemDefaultCenturyStart; \ + } \ + int32_t T::defaultCenturyStartYear() const { \ + /* lazy-evaluate systemDefaultCenturyStart */ \ + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); \ + return gSystemDefaultCenturyStartYear; \ + } \ + UBool T::haveDefaultCentury() const { return true; } + U_NAMESPACE_END #endif // !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/hebrwcal.cpp b/deps/icu-small/source/i18n/hebrwcal.cpp index 6451c89c599aef..83f1707990354b 100644 --- a/deps/icu-small/source/i18n/hebrwcal.cpp +++ b/deps/icu-small/source/i18n/hebrwcal.cpp @@ -136,6 +136,10 @@ static const int16_t LEAP_MONTH_START[][3] = { { 383, 384, 385 }, // Elul }; +// There are 235 months in 19 years cycle. +static const int32_t MONTHS_IN_CYCLE = 235; +static const int32_t YEARS_IN_CYCLE = 19; + static icu::CalendarCache *gCache = nullptr; U_CDECL_BEGIN @@ -160,7 +164,6 @@ HebrewCalendar::HebrewCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } @@ -227,12 +230,23 @@ void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& // ADAR_1 -- then we have to bump to ADAR_2 aka ADAR. But // if amount is -2 and we land in ADAR_1, then we have to // bump the other way -- down to SHEVAT. - Alan 11/00 - int32_t month = get(UCAL_MONTH, status); + int64_t month = get(UCAL_MONTH, status); int32_t year = get(UCAL_YEAR, status); UBool acrossAdar1; if (amount > 0) { acrossAdar1 = (month < ADAR_1); // started before ADAR_1? month += amount; + // We know there are total 235 months in every 19 years. To speed + // up the iteration, we first fast forward in the multiple of 235 + // months for 19 years before the iteration which check the leap year. + if (month >= MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(year, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + month %= MONTHS_IN_CYCLE; + } + for (;;) { if (acrossAdar1 && month>=ADAR_1 && !isLeapYear(year)) { ++month; @@ -247,6 +261,16 @@ void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& } else { acrossAdar1 = (month > ADAR_1); // started after ADAR_1? month += amount; + // We know there are total 235 months in every 19 years. To speed + // up the iteration, we first fast forward in the multiple of 235 + // months for 19 years before the iteration which check the leap year. + if (month <= -MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(year, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + month %= MONTHS_IN_CYCLE; + } for (;;) { if (acrossAdar1 && month<=ADAR_1 && !isLeapYear(year)) { --month; @@ -276,9 +300,15 @@ void HebrewCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& */ void HebrewCalendar::add(EDateFields field, int32_t amount, UErrorCode& status) { - add((UCalendarDateFields)field, amount, status); + add(static_cast<UCalendarDateFields>(field), amount, status); } +namespace { + +int32_t monthsInYear(int32_t year); + +} // namespace + /** * Rolls (up/down) a specified amount time on the given field. For * example, to roll the current date up by three days, you can call @@ -347,7 +377,7 @@ void HebrewCalendar::roll(UCalendarDateFields field, int32_t amount, UErrorCode& } void HebrewCalendar::roll(EDateFields field, int32_t amount, UErrorCode& status) { - roll((UCalendarDateFields)field, amount, status); + roll(static_cast<UCalendarDateFields>(field), amount, status); } //------------------------------------------------------------------------- @@ -371,6 +401,8 @@ static const int32_t MONTH_PARTS = MONTH_DAYS*DAY_PARTS + MONTH_FRACT; // Bet (Monday), Hey (5 hours from sunset), Resh-Daled (204). static const int32_t BAHARAD = 11*HOUR_PARTS + 204; +namespace { + /** * Finds the day # of the first day in the given Hebrew year. * To do this, we want to calculate the time of the Tishri 1 new moon @@ -391,17 +423,21 @@ static const int32_t BAHARAD = 11*HOUR_PARTS + 204; * http://www.faqs.org/faqs/calendars/faq/</a> * </ul> */ -int32_t HebrewCalendar::startOfYear(int32_t year, UErrorCode &status) +int32_t startOfYear(int32_t year, UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_HEBREW_CALENDAR, calendar_hebrew_cleanup); - int32_t day = CalendarCache::get(&gCache, year, status); + int64_t day = CalendarCache::get(&gCache, year, status); + if(U_FAILURE(status)) { + return 0; + } if (day == 0) { // # of months before year - int32_t months = (int32_t)ClockMath::floorDivide((235 * (int64_t)year - 234), (int64_t)19); + int64_t months = ClockMath::floorDivideInt64( + (235LL * static_cast<int64_t>(year) - 234LL), 19LL); - int64_t frac = (int64_t)months * MONTH_FRACT + BAHARAD; // Fractional part of day # - day = months * 29 + (int32_t)(frac / DAY_PARTS); // Whole # part of calculation + int64_t frac = months * MONTH_FRACT + BAHARAD; // Fractional part of day # + day = months * 29LL + frac / DAY_PARTS; // Whole # part of calculation frac = frac % DAY_PARTS; // Time of day int32_t wd = (day % 7); // Day of week (0 == Monday) @@ -410,45 +446,51 @@ int32_t HebrewCalendar::startOfYear(int32_t year, UErrorCode &status) // If the 1st is on Sun, Wed, or Fri, postpone to the next day day += 1; wd = (day % 7); - } - if (wd == 1 && frac > 15*HOUR_PARTS+204 && !isLeapYear(year) ) { + } else if (wd == 1 && frac > 15*HOUR_PARTS+204 && !HebrewCalendar::isLeapYear(year) ) { // If the new moon falls after 3:11:20am (15h204p from the previous noon) // on a Tuesday and it is not a leap year, postpone by 2 days. // This prevents 356-day years. day += 2; } - else if (wd == 0 && frac > 21*HOUR_PARTS+589 && isLeapYear(year-1) ) { + else if (wd == 0 && frac > 21*HOUR_PARTS+589 && HebrewCalendar::isLeapYear(year-1) ) { // If the new moon falls after 9:32:43 1/3am (21h589p from yesterday noon) // on a Monday and *last* year was a leap year, postpone by 1 day. // Prevents 382-day years. day += 1; } - CalendarCache::put(&gCache, year, day, status); + if (day > INT32_MAX || day < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CalendarCache::put(&gCache, year, static_cast<int32_t>(day), status); } + // Out of range value is alread rejected before putting into cache. + U_ASSERT(INT32_MIN <= day && day <= INT32_MAX); return day; } -/** -* Find the day of the week for a given day -* -* @param day The # of days since the start of the Hebrew calendar, -* 1-based (i.e. 1/1/1 AM is day 1). -*/ -int32_t HebrewCalendar::absoluteDayToDayOfWeek(int32_t day) -{ - // We know that 1/1/1 AM is a Monday, which makes the math easy... - return (day % 7) + 1; +int32_t daysInYear(int32_t eyear, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + return startOfYear(eyear+1, status) - startOfYear(eyear, status); } /** -* Returns the the type of a given year. +* Returns the type of a given year. * 0 "Deficient" year with 353 or 383 days * 1 "Normal" year with 354 or 384 days * 2 "Complete" year with 355 or 385 days */ -int32_t HebrewCalendar::yearType(int32_t year) const +int32_t yearType(int32_t year, UErrorCode& status) { - int32_t yearLength = handleGetYearLength(year); + if (U_FAILURE(status)) { + return 0; + } + int32_t yearLength = daysInYear(year, status); + if (U_FAILURE(status)) { + return 0; + } if (yearLength > 380) { yearLength -= 30; // Subtract length of leap month. @@ -470,6 +512,8 @@ int32_t HebrewCalendar::yearType(int32_t year) const return type; } +} // namespace + // /** * Determine whether a given Hebrew year is a leap year * @@ -478,14 +522,18 @@ int32_t HebrewCalendar::yearType(int32_t year) const */ UBool HebrewCalendar::isLeapYear(int32_t year) { //return (year * 12 + 17) % 19 >= 12; - int32_t x = (year*12 + 17) % 19; + int64_t x = (year*12LL + 17) % YEARS_IN_CYCLE; return x >= ((x < 0) ? -7 : 12); } -int32_t HebrewCalendar::monthsInYear(int32_t year) { - return isLeapYear(year) ? 13 : 12; +namespace{ + +int32_t monthsInYear(int32_t year) { + return HebrewCalendar::isLeapYear(year) ? 13 : 12; } +} // namespace + //------------------------------------------------------------------------- // Calendar framework //------------------------------------------------------------------------- @@ -501,7 +549,10 @@ int32_t HebrewCalendar::handleGetLimit(UCalendarDateFields field, ELimitType lim * Returns the length of the given month in the given year * @internal */ -int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const { + if(U_FAILURE(status)) { + return 0; + } // Resolve out-of-range months. This is necessary in order to // obtain the correct year. We correct to // a 12- or 13-month year (add/subtract 12 or 13, depending @@ -519,8 +570,14 @@ int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month switch (month) { case HESHVAN: case KISLEV: - // These two month lengths can vary - return MONTH_LENGTH[month][yearType(extendedYear)]; + { + // These two month lengths can vary + int32_t type = yearType(extendedYear, status); + if(U_FAILURE(status)) { + return 0; + } + return MONTH_LENGTH[month][type]; + } default: // The rest are a fixed length @@ -532,14 +589,16 @@ int32_t HebrewCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month * Returns the number of days in the given Hebrew year * @internal */ -int32_t HebrewCalendar::handleGetYearLength(int32_t eyear) const { - UErrorCode status = U_ZERO_ERROR; - return startOfYear(eyear+1, status) - startOfYear(eyear, status); +int32_t HebrewCalendar::handleGetYearLength(int32_t eyear, UErrorCode& status) const { + return daysInYear(eyear, status); } void HebrewCalendar::validateField(UCalendarDateFields field, UErrorCode &status) { if ((field == UCAL_MONTH || field == UCAL_ORDINAL_MONTH) - && !isLeapYear(handleGetExtendedYear()) && internalGetMonth() == ADAR_1) { + && !isLeapYear(handleGetExtendedYear(status)) && internalGetMonth(status) == ADAR_1) { + if (U_FAILURE(status)) { + return; + } status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -571,26 +630,39 @@ void HebrewCalendar::validateField(UCalendarDateFields field, UErrorCode &status * @internal */ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } int32_t d = julianDay - 347997; - double m = ClockMath::floorDivide((d * (double)DAY_PARTS), (double) MONTH_PARTS); // Months (approx) - int32_t year = (int32_t)(ClockMath::floorDivide((19. * m + 234.), 235.) + 1.); // Years (approx) + double m = ClockMath::floorDivide((d * static_cast<double>(DAY_PARTS)), static_cast<double>(MONTH_PARTS)); // Months (approx) + int32_t year = static_cast<int32_t>(ClockMath::floorDivide((19. * m + 234.), 235.) + 1.); // Years (approx) int32_t ys = startOfYear(year, status); // 1st day of year + if (U_FAILURE(status)) { + return; + } int32_t dayOfYear = (d - ys); // Because of the postponement rules, it's possible to guess wrong. Fix it. while (dayOfYear < 1) { year--; ys = startOfYear(year, status); + if (U_FAILURE(status)) { + return; + } dayOfYear = (d - ys); } // Now figure out which month we're in, and the date within that month - int32_t type = yearType(year); + int32_t type = yearType(year, status); + if (U_FAILURE(status)) { + return; + } UBool isLeap = isLeapYear(year); int32_t month = 0; int32_t momax = UPRV_LENGTHOF(MONTH_START); - while (month < momax && dayOfYear > ( isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type] ) ) { + while (month < momax && + dayOfYear > ( isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type] ) ) { month++; } if (month >= momax || month<=0) { @@ -610,16 +682,33 @@ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) int dayOfMonth = dayOfYear - (isLeap ? LEAP_MONTH_START[month][type] : MONTH_START[month][type]); internalSet(UCAL_ERA, 0); + // Check out of bound year + int32_t min_year = handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MINIMUM); + if (year < min_year) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + year = min_year; + } + int32_t max_year = handleGetLimit(UCAL_EXTENDED_YEAR, UCAL_LIMIT_MAXIMUM); + if (max_year < year) { + if (!isLenient()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + year = max_year; + } internalSet(UCAL_YEAR, year); internalSet(UCAL_EXTENDED_YEAR, year); int32_t ordinal_month = month; if (!isLeap && ordinal_month > ADAR_1) { - ordinal_month--; + ordinal_month--; } internalSet(UCAL_ORDINAL_MONTH, ordinal_month); internalSet(UCAL_MONTH, month); internalSet(UCAL_DAY_OF_MONTH, dayOfMonth); - internalSet(UCAL_DAY_OF_YEAR, dayOfYear); + internalSet(UCAL_DAY_OF_YEAR, dayOfYear); } //------------------------------------------------------------------------- @@ -629,119 +718,88 @@ void HebrewCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) /** * @internal */ -int32_t HebrewCalendar::handleGetExtendedYear() { - int32_t year; +int32_t HebrewCalendar::handleGetExtendedYear(UErrorCode& status ) { + if (U_FAILURE(status)) { + return 0; + } if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - year = internalGet(UCAL_YEAR, 1); // Default to year 1 + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return year; + return internalGet(UCAL_YEAR, 1); // Default to year 1 } /** * Return JD of start of given month/year. * @internal */ -int32_t HebrewCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/) const { - UErrorCode status = U_ZERO_ERROR; +int64_t HebrewCalendar::handleComputeMonthStart( + int32_t eyear, int32_t month, UBool /*useMonth*/, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // Resolve out-of-range months. This is necessary in order to // obtain the correct year. We correct to // a 12- or 13-month year (add/subtract 12 or 13, depending // on the year) but since we _always_ number from 0..12, and // the leap year determines whether or not month 5 (Adar 1) // is present, we allow 0..12 in any given year. + + // The month could be in large value, we first roll 235 months to 19 years + // before the while loop. + if (month <= -MONTHS_IN_CYCLE || month >= MONTHS_IN_CYCLE) { + if (uprv_add32_overflow(eyear, (month / MONTHS_IN_CYCLE) * YEARS_IN_CYCLE, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + month %= MONTHS_IN_CYCLE; + } while (month < 0) { - month += monthsInYear(--eyear); + if (uprv_add32_overflow(eyear, -1, &eyear) || + uprv_add32_overflow(month, monthsInYear(eyear), &month)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } // Careful: allow 0..12 in all years while (month > 12) { - month -= monthsInYear(eyear++); + if (uprv_add32_overflow(month, -monthsInYear(eyear), &month) || + uprv_add32_overflow(eyear, 1, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - int32_t day = startOfYear(eyear, status); + int64_t day = startOfYear(eyear, status); if(U_FAILURE(status)) { return 0; } if (month != 0) { + int32_t type = yearType(eyear, status); + if (U_FAILURE(status)) { + return 0; + } if (isLeapYear(eyear)) { - day += LEAP_MONTH_START[month][yearType(eyear)]; + day += LEAP_MONTH_START[month][type]; } else { - day += MONTH_START[month][yearType(eyear)]; + day += MONTH_START[month][type]; } } - return (int) (day + 347997); + return day + 347997LL; } -constexpr uint32_t kHebrewRelatedYearDiff = -3760; +IMPL_SYSTEM_DEFAULT_CENTURY(HebrewCalendar, "@calendar=hebrew") -int32_t HebrewCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); +bool HebrewCalendar::inTemporalLeapYear(UErrorCode& status) const { if (U_FAILURE(status)) { - return 0; + return false; } - return year + kHebrewRelatedYearDiff; -} - -void HebrewCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kHebrewRelatedYearDiff); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -UBool HebrewCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - HebrewCalendar calendar(Locale("@calendar=hebrew"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - - -UDate HebrewCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t HebrewCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} - -bool HebrewCalendar::inTemporalLeapYear(UErrorCode& status) const { - if (U_FAILURE(status)) return false; int32_t eyear = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) return false; + if (U_FAILURE(status)) { + return false; + } return isLeapYear(eyear); } @@ -752,13 +810,17 @@ static const char * const gTemporalMonthCodesForHebrew[] = { const char* HebrewCalendar::getTemporalMonthCode(UErrorCode& status) const { int32_t month = get(UCAL_MONTH, status); - if (U_FAILURE(status)) return nullptr; + if (U_FAILURE(status)) { + return nullptr; + } return gTemporalMonthCodesForHebrew[month]; } void HebrewCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } int32_t len = static_cast<int32_t>(uprv_strlen(code)); if (len == 3 || len == 4) { for (int m = 0; gTemporalMonthCodesForHebrew[m] != nullptr; m++) { @@ -771,15 +833,31 @@ void HebrewCalendar::setTemporalMonthCode(const char* code, UErrorCode& status ) status = U_ILLEGAL_ARGUMENT_ERROR; } -int32_t HebrewCalendar::internalGetMonth() const { +int32_t HebrewCalendar::internalGetMonth(UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } if (resolveFields(kMonthPrecedence) == UCAL_ORDINAL_MONTH) { int32_t ordinalMonth = internalGet(UCAL_ORDINAL_MONTH); - HebrewCalendar *nonConstThis = (HebrewCalendar*)this; // cast away const + HebrewCalendar* nonConstThis = const_cast<HebrewCalendar*>(this); // cast away const - int32_t year = nonConstThis->handleGetExtendedYear(); - return ordinalMonth + (((!isLeapYear(year)) && (ordinalMonth > ADAR_1)) ? 1: 0); + int32_t year = nonConstThis->handleGetExtendedYear(status); + if (U_FAILURE(status)) { + return 0; + } + if (isLeapYear(year) || ordinalMonth <= ADAR_1) { + return ordinalMonth; + } + if (!uprv_add32_overflow(ordinalMonth, 1, &ordinalMonth)) { + return ordinalMonth; + } } - return Calendar::internalGetMonth(); + return Calendar::internalGetMonth(status); +} + +int32_t HebrewCalendar::getRelatedYearDifference() const { + constexpr int32_t kHebrewCalendarRelatedYearDifference = -3760; + return kHebrewCalendarRelatedYearDifference; } UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HebrewCalendar) diff --git a/deps/icu-small/source/i18n/hebrwcal.h b/deps/icu-small/source/i18n/hebrwcal.h index 829a642211a84d..a959ac307b3757 100644 --- a/deps/icu-small/source/i18n/hebrwcal.h +++ b/deps/icu-small/source/i18n/hebrwcal.h @@ -40,7 +40,7 @@ U_NAMESPACE_BEGIN * solar year (approximately 365.24 days) is not an even multiple of * the lunar month (approximately 29.53 days) an extra "leap month" is * inserted in 7 out of every 19 years. To make matters even more - * interesting, the start of a year can be delayed by up to three days + * interesting, the start of a year can be delayed by up to two days * in order to prevent certain holidays from falling on the Sabbath and * to prevent certain illegal year lengths. Finally, the lengths of certain * months can vary depending on the number of days in the year. @@ -273,21 +273,11 @@ class U_I18N_API HebrewCalendar : public Calendar { */ static UBool isLeapYear(int32_t year) ; + protected: /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field * @internal */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - - protected: + int32_t getRelatedYearDifference() const override; /** * Subclass API for defining limits of different types. @@ -319,16 +309,17 @@ class U_I18N_API HebrewCalendar : public Calendar { * implementation than the default implementation in Calendar. * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given extended year of this * calendar system. Subclasses should override this method if they can * provide a more correct or more efficient implementation than the * default implementation in Calendar. - * @stable ICU 2.0 + * @internal */ - virtual int32_t handleGetYearLength(int32_t eyear) const override; + virtual int32_t handleGetYearLength(int32_t eyear, UErrorCode& status) const override; + /** * Subclasses may override this method to compute several fields * specific to each calendar system. These are: @@ -350,10 +341,11 @@ class U_I18N_API HebrewCalendar : public Calendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Return the Julian day number of day before the first day of the * given month in the given extended year. Subclasses should override @@ -367,8 +359,8 @@ class U_I18N_API HebrewCalendar : public Calendar { * day of the given month and year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, - UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth, UErrorCode& status) const override; /** @@ -380,24 +372,7 @@ class U_I18N_API HebrewCalendar : public Calendar { virtual void validateField(UCalendarDateFields field, UErrorCode &status) override; protected: - /** - * Returns true because the Hebrew Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY public: /** @@ -442,45 +417,7 @@ class U_I18N_API HebrewCalendar : public Calendar { virtual void setTemporalMonthCode(const char* code, UErrorCode& status ) override; protected: - virtual int32_t internalGetMonth() const override; - - private: // Calendar-specific implementation - /** - * Finds the day # of the first day in the given Hebrew year. - * To do this, we want to calculate the time of the Tishri 1 new moon - * in that year. - * <p> - * The algorithm here is similar to ones described in a number of - * references, including: - * <ul> - * <li>"Calendrical Calculations", by Nachum Dershowitz & Edward Reingold, - * Cambridge University Press, 1997, pages 85-91. - * - * <li>Hebrew Calendar Science and Myths, - * <a href="http://www.geocities.com/Athens/1584/"> - * http://www.geocities.com/Athens/1584/</a> - * - * <li>The Calendar FAQ, - * <a href="http://www.faqs.org/faqs/calendars/faq/"> - * http://www.faqs.org/faqs/calendars/faq/</a> - * </ul> - * @param year extended year - * @return day number (JD) - * @internal - */ - static int32_t startOfYear(int32_t year, UErrorCode& status); - - static int32_t absoluteDayToDayOfWeek(int32_t day) ; - - /** - * @internal - */ - int32_t yearType(int32_t year) const; - - /** - * @internal - */ - static int32_t monthsInYear(int32_t year) ; + virtual int32_t internalGetMonth(UErrorCode& status) const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/indiancal.cpp b/deps/icu-small/source/i18n/indiancal.cpp index 29c2749f48cd44..8c8365b0b304a2 100644 --- a/deps/icu-small/source/i18n/indiancal.cpp +++ b/deps/icu-small/source/i18n/indiancal.cpp @@ -41,7 +41,6 @@ IndianCalendar* IndianCalendar::clone() const { IndianCalendar::IndianCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } IndianCalendar::IndianCalendar(const IndianCalendar& other) : Calendar(other) { @@ -108,7 +107,7 @@ static UBool isGregorianLeap(int32_t year) * @param eyear The year in Saka Era * @param month The month(0-based) in Indian calendar */ -int32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month) const { +int32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month, UErrorCode& /* status */) const { if (month < 0 || month > 11) { eyear += ClockMath::floorDivide(month, 12, &month); } @@ -129,7 +128,8 @@ int32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month) const * * @param eyear The year in Saka Era. */ -int32_t IndianCalendar::handleGetYearLength(int32_t eyear) const { +int32_t IndianCalendar::handleGetYearLength(int32_t eyear, UErrorCode& status) const { + if (U_FAILURE(status)) return 0; return isGregorianLeap(eyear + INDIAN_ERA_START) ? 366 : 365; } /* @@ -143,18 +143,6 @@ static double gregorianToJD(int32_t year, int32_t month, int32_t date) { return Grego::fieldsToDay(year, month, date) + kEpochStartAsJulianDay - 0.5; } -/* - * Returns the Gregorian Date corresponding to a given Julian Day - * Month is 0 based. - * @param jd The Julian Day - */ -static int32_t* jdToGregorian(double jd, int32_t gregorianDate[3]) { - int32_t gdow; - Grego::dayToFields(jd - kEpochStartAsJulianDay, - gregorianDate[0], gregorianDate[1], gregorianDate[2], gdow); - return gregorianDate; -} - //------------------------------------------------------------------------- // Functions for converting from field values to milliseconds.... @@ -203,14 +191,20 @@ static double IndianToJD(int32_t year, int32_t month, int32_t date) { * @param eyear The year in Indian Calendar measured from Saka Era (78 AD). * @param month The month in Indian calendar */ -int32_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */ ) const { +int64_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } //month is 0 based; converting it to 1-based int32_t imonth; // If the month is out of range, adjust it into range, and adjust the extended year accordingly if (month < 0 || month > 11) { - eyear += (int32_t)ClockMath::floorDivide(month, 12, &month); + if (uprv_add32_overflow(eyear, ClockMath::floorDivide(month, 12, &month), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } if(month == 12){ @@ -219,16 +213,19 @@ int32_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UB imonth = month + 1; } - double jd = IndianToJD(eyear ,imonth, 1); + int64_t jd = IndianToJD(eyear ,imonth, 1); - return (int32_t)jd; + return jd; } //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values //------------------------------------------------------------------------- -int32_t IndianCalendar::handleGetExtendedYear() { +int32_t IndianCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { @@ -254,16 +251,15 @@ int32_t IndianCalendar::handleGetExtendedYear() { * method is called. The getGregorianXxx() methods return Gregorian * calendar equivalents for the given Julian day. */ -void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* status */) { +void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* status */) { double jdAtStartOfGregYear; int32_t leapMonth, IndianYear, yday, IndianMonth, IndianDayOfMonth, mday; - int32_t gregorianYear; // Stores gregorian date corresponding to Julian day; - int32_t gd[3]; + // Stores gregorian date corresponding to Julian day; + int32_t gregorianYear = getGregorianYear(); - gregorianYear = jdToGregorian(julianDay, gd)[0]; // Gregorian date for Julian day IndianYear = gregorianYear - INDIAN_ERA_START; // Year in Saka era jdAtStartOfGregYear = gregorianToJD(gregorianYear, 0, 1); // JD at start of Gregorian year - yday = (int32_t)(julianDay - jdAtStartOfGregYear); // Day number in Gregorian year (starting from 0) + yday = static_cast<int32_t>(julianDay - jdAtStartOfGregYear); // Day number in Gregorian year (starting from 0) if (yday < INDIAN_YEAR_START) { // Day is at the end of the preceding Saka year @@ -281,11 +277,11 @@ void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* stat } else { mday = yday - leapMonth; if (mday < (31 * 5)) { - IndianMonth = (int32_t)uprv_floor(mday / 31) + 1; + IndianMonth = static_cast<int32_t>(uprv_floor(mday / 31)) + 1; IndianDayOfMonth = (mday % 31) + 1; } else { mday -= 31 * 5; - IndianMonth = (int32_t)uprv_floor(mday / 30) + 6; + IndianMonth = static_cast<int32_t>(uprv_floor(mday / 30)) + 6; IndianDayOfMonth = (mday % 30) + 1; } } @@ -297,82 +293,17 @@ void IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* stat internalSet(UCAL_ORDINAL_MONTH, IndianMonth); internalSet(UCAL_DAY_OF_MONTH, IndianDayOfMonth); internalSet(UCAL_DAY_OF_YEAR, yday + 1); // yday is 0-based -} - -constexpr uint32_t kIndianRelatedYearDiff = 79; - -int32_t IndianCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { - return 0; - } - return year + kIndianRelatedYearDiff; } -void IndianCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kIndianRelatedYearDiff); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool IndianCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV -initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - - IndianCalendar calendar ( Locale ( "@calendar=Indian" ), status); - if ( U_SUCCESS ( status ) ) { - calendar.setTime ( Calendar::getNow(), status ); - calendar.add ( UCAL_YEAR, -80, status ); - - UDate newStart = calendar.getTime ( status ); - int32_t newYear = calendar.get ( UCAL_YEAR, status ); - - gSystemDefaultCenturyStart = newStart; - gSystemDefaultCenturyStartYear = newYear; - } - // We have no recourse upon failure. -} +IMPL_SYSTEM_DEFAULT_CENTURY(IndianCalendar, "@calendar=indian") +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndianCalendar) -UDate -IndianCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; +int32_t IndianCalendar::getRelatedYearDifference() const { + constexpr int32_t kIndianCalendarRelatedYearDifference = 79; + return kIndianCalendarRelatedYearDifference; } -int32_t -IndianCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} - - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndianCalendar) - U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/i18n/indiancal.h b/deps/icu-small/source/i18n/indiancal.h index 5ef9113a85a4a4..411abc638afc23 100644 --- a/deps/icu-small/source/i18n/indiancal.h +++ b/deps/icu-small/source/i18n/indiancal.h @@ -209,13 +209,13 @@ class U_I18N_API IndianCalendar : public Calendar { * @param year The month(0-based) in Indian year * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Indian year * @internal */ - virtual int32_t handleGetYearLength(int32_t extendedYear) const override; + virtual int32_t handleGetYearLength(int32_t extendedYear, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from field values to milliseconds.... @@ -225,7 +225,7 @@ class U_I18N_API IndianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values @@ -234,7 +234,7 @@ class U_I18N_API IndianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Override Calendar to compute several fields specific to the Indian @@ -284,44 +284,17 @@ class U_I18N_API IndianCalendar : public Calendar { */ virtual const char * getType() const override; - /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field - * @internal - */ - virtual void setRelatedYear(int32_t year) override; - - private: IndianCalendar() = delete; // default constructor not implemented - // Default century. protected: /** - * Returns true because the Indian Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 * @internal */ - virtual UDate defaultCenturyStart() const override; + int32_t getRelatedYearDifference() const override; - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + // Default century. + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/inputext.cpp b/deps/icu-small/source/i18n/inputext.cpp index bce9862c0fe5c0..4a7712404ca315 100644 --- a/deps/icu-small/source/i18n/inputext.cpp +++ b/deps/icu-small/source/i18n/inputext.cpp @@ -30,8 +30,8 @@ InputText::InputText(UErrorCode &status) // removed if appropriate. fByteStats(NEW_ARRAY(int16_t, 256)), // byte frequency statistics for the input text. // Value is percent, not absolute. - fDeclaredEncoding(0), - fRawInput(0), + fDeclaredEncoding(nullptr), + fRawInput(nullptr), fRawLength(0) { if (fInputBytes == nullptr || fByteStats == nullptr) { @@ -50,15 +50,15 @@ void InputText::setText(const char *in, int32_t len) { fInputLen = 0; fC1Bytes = false; - fRawInput = (const uint8_t *) in; - fRawLength = len == -1? (int32_t)uprv_strlen(in) : len; + fRawInput = reinterpret_cast<const uint8_t*>(in); + fRawLength = len == -1 ? static_cast<int32_t>(uprv_strlen(in)) : len; } void InputText::setDeclaredEncoding(const char* encoding, int32_t len) { if(encoding) { if (len == -1) { - len = (int32_t)uprv_strlen(encoding); + len = static_cast<int32_t>(uprv_strlen(encoding)); } len += 1; // to make place for the \0 at the end. @@ -98,7 +98,7 @@ void InputText::MungeInput(UBool fStripTags) { for (srci = 0; srci < fRawLength && dsti < BUFFER_SIZE; srci += 1) { b = fRawInput[srci]; - if (b == (uint8_t)0x3C) { /* Check for the ASCII '<' */ + if (b == static_cast<uint8_t>(0x3C)) { /* Check for the ASCII '<' */ if (inMarkup) { badTags += 1; } @@ -111,7 +111,7 @@ void InputText::MungeInput(UBool fStripTags) { fInputBytes[dsti++] = b; } - if (b == (uint8_t)0x3E) { /* Check for the ASCII '>' */ + if (b == static_cast<uint8_t>(0x3E)) { /* Check for the ASCII '>' */ inMarkup = false; } } diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index c21530a736eb58..e847ac28c894cc 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -55,7 +55,6 @@ static void debug_islamcal_msg(const char *pat, ...) // --- The cache -- // cache of months static icu::CalendarCache *gMonthCache = nullptr; -static icu::CalendarAstronomer *gIslamicCalendarAstro = nullptr; U_CDECL_BEGIN static UBool calendar_islamic_cleanup() { @@ -63,10 +62,6 @@ static UBool calendar_islamic_cleanup() { delete gMonthCache; gMonthCache = nullptr; } - if (gIslamicCalendarAstro) { - delete gIslamicCalendarAstro; - gIslamicCalendarAstro = nullptr; - } return true; } U_CDECL_END @@ -192,15 +187,6 @@ static const int UMALQURA_MONTHLENGTH[] = { 0x06AA, 0x0AD6, 0x055D, 0x029D }; -int32_t getUmalqura_MonthLength(int32_t y, int32_t m) { - int32_t mask = (int32_t) (0x01 << (11 - m)); // set mask for bit corresponding to month - if((UMALQURA_MONTHLENGTH[y] & mask) == 0 ) - return 29; - else - return 30; - -} - //------------------------------------------------------------------------- // Constructors... //------------------------------------------------------------------------- @@ -216,7 +202,6 @@ IslamicCalendar* IslamicCalendar::clone() const { IslamicCalendar::IslamicCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } IslamicCalendar::~IslamicCalendar() @@ -273,6 +258,8 @@ int32_t IslamicCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li // Assorted calculation utilities // +namespace { + // we could compress this down more if we need to static const int8_t umAlQuraYrStartEstimateFix[] = { 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, // 1300.. @@ -311,17 +298,20 @@ static const int8_t umAlQuraYrStartEstimateFix[] = { /** * Determine whether a year is a leap year in the Islamic civil calendar */ -UBool IslamicCalendar::civilLeapYear(int32_t year) -{ +inline bool civilLeapYear(int32_t year) { return (14 + 11 * year) % 30 < 11; } +int32_t trueMonthStart(int32_t month, UErrorCode& status); + +} // namespace + /** * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicCalendar::yearStart(int32_t year) const{ - return trueMonthStart(12*(year-1)); +int64_t IslamicCalendar::yearStart(int32_t year, UErrorCode& status) const { + return trueMonthStart(12*(year-1), status); } /** @@ -331,10 +321,33 @@ int32_t IslamicCalendar::yearStart(int32_t year) const{ * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicCalendar::monthStart(int32_t year, int32_t month) const { - return trueMonthStart(12*(year-1) + month); +int64_t IslamicCalendar::monthStart(int32_t year, int32_t month, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } + int32_t temp; + if (uprv_add32_overflow(year, -1, &temp) || + uprv_mul32_overflow(temp, 12, &temp) || + uprv_add32_overflow(temp, month, &month)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + return trueMonthStart(month, status); } +namespace { +/** + * Return the "age" of the moon at the given time; this is the difference + * in ecliptic latitude between the moon and the sun. This method simply + * calls CalendarAstronomer.moonAge, converts to degrees, + * and adjusts the resultto be in the range [-180, 180]. + * + * @param time The time at which the moon's age is desired, + * in millis since 1/1/1970. + */ +double moonAge(UDate time); + /** * Find the day number on which a particular month of the true/lunar * Islamic calendar starts. @@ -343,82 +356,48 @@ int32_t IslamicCalendar::monthStart(int32_t year, int32_t month) const { * * @return The day number on which the given month starts. */ -int32_t IslamicCalendar::trueMonthStart(int32_t month) const -{ - UErrorCode status = U_ZERO_ERROR; - int32_t start = CalendarCache::get(&gMonthCache, month, status); +int32_t trueMonthStart(int32_t month, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + ucln_i18n_registerCleanup(UCLN_I18N_ISLAMIC_CALENDAR, calendar_islamic_cleanup); + int64_t start = CalendarCache::get(&gMonthCache, month, status); - if (start==0) { + if (U_SUCCESS(status) && start==0) { // Make a guess at when the month started, using the average length UDate origin = HIJRA_MILLIS + uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH) * kOneDay; // moonAge will fail due to memory allocation error - double age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + double age = moonAge(origin); if (age >= 0) { // The month has already started do { origin -= kOneDay; - age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + age = moonAge(origin); } while (age >= 0); } else { // Preceding month has not ended yet. do { origin += kOneDay; - age = moonAge(origin, status); - if (U_FAILURE(status)) { - goto trueMonthStartEnd; - } + age = moonAge(origin); } while (age < 0); } - start = (int32_t)(ClockMath::floorDivide( - (int64_t)((int64_t)origin - HIJRA_MILLIS), (int64_t)kOneDay) + 1); + start = ClockMath::floorDivideInt64( + static_cast<int64_t>(static_cast<int64_t>(origin) - HIJRA_MILLIS), static_cast<int64_t>(kOneDay)) + 1; CalendarCache::put(&gMonthCache, month, start, status); } -trueMonthStartEnd : if(U_FAILURE(status)) { start = 0; } return start; } -/** -* Return the "age" of the moon at the given time; this is the difference -* in ecliptic latitude between the moon and the sun. This method simply -* calls CalendarAstronomer.moonAge, converts to degrees, -* and adjusts the result to be in the range [-180, 180]. -* -* @param time The time at which the moon's age is desired, -* in millis since 1/1/1970. -*/ -double IslamicCalendar::moonAge(UDate time, UErrorCode &status) -{ - double age = 0; - - static UMutex astroLock; // pod bay door lock - umtx_lock(&astroLock); - if(gIslamicCalendarAstro == nullptr) { - gIslamicCalendarAstro = new CalendarAstronomer(); - if (gIslamicCalendarAstro == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return age; - } - ucln_i18n_registerCleanup(UCLN_I18N_ISLAMIC_CALENDAR, calendar_islamic_cleanup); - } - gIslamicCalendarAstro->setTime(time); - age = gIslamicCalendarAstro->getMoonAge(); - umtx_unlock(&astroLock); - +double moonAge(UDate time) { // Convert to degrees and normalize... - age = age * 180 / CalendarAstronomer::PI; + double age = CalendarAstronomer(time).getMoonAge() * 180 / CalendarAstronomer::PI; if (age > 180) { age = age - 360; } @@ -426,6 +405,7 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) return age; } +} // namespace //---------------------------------------------------------------------- // Calendar framework //---------------------------------------------------------------------- @@ -437,18 +417,34 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) * @param year The hijri month, 0-based * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t IslamicCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& status) const { month = 12*(extendedYear-1) + month; - return trueMonthStart(month+1) - trueMonthStart(month) ; + int32_t len = trueMonthStart(month+1, status) - trueMonthStart(month, status) ; + if (U_FAILURE(status)) { + return 0; + } + return len; } +namespace { + +int32_t yearLength(int32_t extendedYear, UErrorCode& status) { + int32_t month = 12*(extendedYear-1); + int32_t length = trueMonthStart(month + 12, status) - trueMonthStart(month, status); + if (U_FAILURE(status)) { + return 0; + } + return length; +} + +} // namepsace /** * Return the number of days in the given Islamic year * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleGetYearLength(int32_t extendedYear) const { - int32_t month = 12*(extendedYear-1); - return (trueMonthStart(month + 12) - trueMonthStart(month)); +int32_t IslamicCalendar::handleGetYearLength(int32_t extendedYear, UErrorCode& status) const { + return yearLength(extendedYear, status); } //------------------------------------------------------------------------- @@ -463,18 +459,29 @@ int32_t IslamicCalendar::handleGetYearLength(int32_t extendedYear) const { /** * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */) const { +int64_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, + UBool /* useMonth */, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // This may be called by Calendar::handleComputeJulianDay with months out of the range // 0..11. Need to handle that here since monthStart requires months in the range 0.11. if (month > 11) { - eyear += (month / 12); + if (uprv_add32_overflow(eyear, (month / 12), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } month %= 12; } else if (month < 0) { month++; - eyear += (month / 12) - 1; + if (uprv_add32_overflow(eyear, (month / 12) - 1, &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } month = (month % 12) + 11; } - return monthStart(eyear, month) + getEpoc() - 1; + return monthStart(eyear, month, status) + getEpoc() - 1; } //------------------------------------------------------------------------- @@ -484,14 +491,11 @@ int32_t IslamicCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, U /** * @draft ICU 2.4 */ -int32_t IslamicCalendar::handleGetExtendedYear() { - int32_t year; +int32_t IslamicCalendar::handleGetExtendedYear(UErrorCode& /* status */) { if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - year = internalGet(UCAL_YEAR, 1); // Default to year 1 + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return year; + return internalGet(UCAL_YEAR, 1); // Default to year 1 } /** @@ -511,19 +515,17 @@ int32_t IslamicCalendar::handleGetExtendedYear() { * @draft ICU 2.4 */ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } int32_t days = julianDay - getEpoc(); // Guess at the number of elapsed full months since the epoch - int32_t month = (int32_t)uprv_floor((double)days / CalendarAstronomer::SYNODIC_MONTH); + int32_t month = static_cast<int32_t>(uprv_floor(static_cast<double>(days) / CalendarAstronomer::SYNODIC_MONTH)); - int32_t startDate = (int32_t)uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH); + int32_t startDate = static_cast<int32_t>(uprv_floor(month * CalendarAstronomer::SYNODIC_MONTH)); - double age = moonAge(internalGetTime(), status); - if (U_FAILURE(status)) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } + double age = moonAge(internalGetTime()); if ( days - startDate >= 25 && age > 0) { // If we're near the end of the month, assume next month and search backwards month++; @@ -531,17 +533,37 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) // Find out the last time that the new moon was actually visible at this longitude // This returns midnight the night that the moon was visible at sunset. - while ((startDate = trueMonthStart(month)) > days) { + while ((startDate = trueMonthStart(month, status)) > days) { + if (U_FAILURE(status)) { + return; + } // If it was after the date in question, back up a month and try again month--; } + if (U_FAILURE(status)) { + return; + } int32_t year = month >= 0 ? ((month / 12) + 1) : ((month + 1 ) / 12); month = ((month % 12) + 12 ) % 12; - int32_t dayOfMonth = (days - monthStart(year, month)) + 1; + int64_t dayOfMonth = (days - monthStart(year, month, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfMonth > INT32_MAX || dayOfMonth < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Now figure out the day of the year. - int32_t dayOfYear = (days - monthStart(year, 0)) + 1; + int64_t dayOfYear = (days - monthStart(year, 0, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfYear > INT32_MAX || dayOfYear < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); @@ -582,7 +604,8 @@ int32_t IslamicCalendar::getRelatedYear(UErrorCode &status) const return gregoYearFromIslamicStart(year); } -static int32_t firstIslamicStartYearFromGrego(int32_t year) { +void IslamicCalendar::setRelatedYear(int32_t year) +{ // ad hoc conversion, improve under #10752 // rough est for now, ok for grego 1846-2138, // otherwise occasionally wrong (for 3% of years) @@ -596,69 +619,20 @@ static int32_t firstIslamicStartYearFromGrego(int32_t year) { offset = -(year - 1976) % 65; shift = 2*cycle + ((offset <= 32)? 1: 0); } - return year - 579 + shift; -} - -void IslamicCalendar::setRelatedYear(int32_t year) -{ - set(UCAL_EXTENDED_YEAR, firstIslamicStartYearFromGrego(year)); -} - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - - -UBool IslamicCalendar::haveDefaultCentury() const -{ - return true; + year = year - 579 + shift; + set(UCAL_EXTENDED_YEAR, year); } -UDate IslamicCalendar::defaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t IslamicCalendar::defaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(IslamicCalendar, "@calendar=islamic-civil") bool IslamicCalendar::inTemporalLeapYear(UErrorCode &status) const { int32_t days = getActualMaximum(UCAL_DAY_OF_YEAR, status); - if (U_FAILURE(status)) return false; - return days == 355; -} - - -U_CFUNC void U_CALLCONV -IslamicCalendar::initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - IslamicCalendar calendar(Locale("@calendar=islamic-civil"),status); - if (U_SUCCESS(status)) { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); + if (U_FAILURE(status)) { + return false; } - // We have no recourse upon failure unless we want to propagate the failure - // out. + return days == 355; } /***************************************************************************** @@ -685,10 +659,8 @@ IslamicCivilCalendar* IslamicCivilCalendar::clone() const { * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicCivilCalendar::yearStart(int32_t year) const{ - return static_cast<int32_t>( - (year-1)*354 + ClockMath::floorDivide((3+11*static_cast<int64_t>(year)), - static_cast<int64_t>(30))); +int64_t IslamicCivilCalendar::yearStart(int32_t year, UErrorCode& /* status */) const { + return 354LL * (year-1LL) + ClockMath::floorDivideInt64(3 + 11LL * year, 30LL); } /** @@ -698,13 +670,12 @@ int32_t IslamicCivilCalendar::yearStart(int32_t year) const{ * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month) const { +int64_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month, UErrorCode& /*status*/) const { // This does not handle months out of the range 0..11 - return static_cast<int32_t>( - uprv_ceil(29.5*month) + (year-1)*354 + - static_cast<int32_t>(ClockMath::floorDivide( - 3+11*static_cast<int64_t>(year), - static_cast<int64_t>(30)))); + return static_cast<int64_t>( + uprv_ceil(29.5*month) + 354LL*(year-1LL) + + ClockMath::floorDivideInt64( + 11LL*static_cast<int64_t>(year) + 3LL, 30LL)); } /** @@ -714,7 +685,8 @@ int32_t IslamicCivilCalendar::monthStart(int32_t year, int32_t month) const { * @param year The hijri month, 0-based * @draft ICU 2.4 */ -int32_t IslamicCivilCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t IslamicCivilCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& /* status */) const { int32_t length = 29 + (month+1) % 2; if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) { length++; @@ -726,7 +698,8 @@ int32_t IslamicCivilCalendar::handleGetMonthLength(int32_t extendedYear, int32_t * Return the number of days in the given Islamic year * @draft ICU 2.4 */ -int32_t IslamicCivilCalendar::handleGetYearLength(int32_t extendedYear) const { +int32_t IslamicCivilCalendar::handleGetYearLength(int32_t extendedYear, UErrorCode& status) const { + if (U_FAILURE(status)) return 0; return 354 + (civilLeapYear(extendedYear) ? 1 : 0); } @@ -747,21 +720,39 @@ int32_t IslamicCivilCalendar::handleGetYearLength(int32_t extendedYear) const { * @draft ICU 2.4 */ void IslamicCivilCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { + return; + } int32_t days = julianDay - getEpoc(); // Use the civil calendar approximation, which is just arithmetic - int32_t year = static_cast<int32_t>( - ClockMath::floorDivide(30 * static_cast<int64_t>(days) + 10646, - static_cast<int64_t>(10631))); + int64_t year = + ClockMath::floorDivideInt64(30LL * days + 10646LL, 10631LL); int32_t month = static_cast<int32_t>( - uprv_ceil((days - 29 - yearStart(year)) / 29.5 )); + uprv_ceil((days - 29 - yearStart(year, status)) / 29.5 )); + if (U_FAILURE(status)) { + return; + } month = month<11?month:11; - int32_t dayOfMonth = (days - monthStart(year, month)) + 1; + int64_t dayOfMonth = (days - monthStart(year, month, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfMonth > INT32_MAX || dayOfMonth < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } // Now figure out the day of the year. - int32_t dayOfYear = (days - monthStart(year, 0)) + 1; + int64_t dayOfYear = (days - monthStart(year, 0, status)) + 1; + if (U_FAILURE(status)) { + return; + } + if (dayOfYear > INT32_MAX || dayOfYear < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); @@ -799,7 +790,7 @@ int32_t IslamicTBLACalendar::getEpoc() const { * IslamicUmalquraCalendar *****************************************************************************/ IslamicUmalquraCalendar::IslamicUmalquraCalendar(const Locale& aLocale, UErrorCode& success) - : IslamicCalendar(aLocale, success) + : IslamicCivilCalendar(aLocale, success) { } @@ -819,16 +810,14 @@ IslamicUmalquraCalendar* IslamicUmalquraCalendar::clone() const { * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ -int32_t IslamicUmalquraCalendar::yearStart(int32_t year) const { +int64_t IslamicUmalquraCalendar::yearStart(int32_t year, UErrorCode& status) const { if (year < UMALQURA_YEAR_START || year > UMALQURA_YEAR_END) { - return static_cast<int32_t>( - (year-1)*354 + ClockMath::floorDivide((3+11*static_cast<int64_t>(year)), - static_cast<int64_t>(30))); + return IslamicCivilCalendar::yearStart(year, status); } year -= UMALQURA_YEAR_START; // rounded least-squares fit of the dates previously calculated from UMALQURA_MONTHLENGTH iteration - int32_t yrStartLinearEstimate = static_cast<int32_t>( - (354.36720 * (double)year) + 460322.05 + 0.5); + int64_t yrStartLinearEstimate = static_cast<int64_t>( + (354.36720 * static_cast<double>(year)) + 460322.05 + 0.5); // need a slight correction to some return yrStartLinearEstimate + umAlQuraYrStartEstimateFix[year]; } @@ -840,10 +829,16 @@ int32_t IslamicUmalquraCalendar::yearStart(int32_t year) const { * @param year The hijri year * @param month The hijri month, 0-based (assumed to be in range 0..11) */ -int32_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month) const { - int32_t ms = yearStart(year); +int64_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month, UErrorCode& status) const { + int64_t ms = yearStart(year, status); + if (U_FAILURE(status)) { + return 0; + } for(int i=0; i< month; i++){ - ms+= handleGetMonthLength(year, i); + ms+= handleGetMonthLength(year, i, status); + if (U_FAILURE(status)) { + return 0; + } } return ms; } @@ -854,31 +849,40 @@ int32_t IslamicUmalquraCalendar::monthStart(int32_t year, int32_t month) const { * @param year The hijri year * @param year The hijri month, 0-based */ -int32_t IslamicUmalquraCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { - int32_t length = 0; +int32_t IslamicUmalquraCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, + UErrorCode& status) const { + if (extendedYear<UMALQURA_YEAR_START || extendedYear>UMALQURA_YEAR_END) { + return IslamicCivilCalendar::handleGetMonthLength(extendedYear, month, status); + } + int32_t length = 29; + int32_t mask = static_cast<int32_t>(0x01 << (11 - month)); // set mask for bit corresponding to month + int32_t index = extendedYear - UMALQURA_YEAR_START; + if ((UMALQURA_MONTHLENGTH[index] & mask) != 0) { + length++; + } + return length; +} + +int32_t IslamicUmalquraCalendar::yearLength(int32_t extendedYear, UErrorCode& status) const { if (extendedYear<UMALQURA_YEAR_START || extendedYear>UMALQURA_YEAR_END) { - length = 29 + (month+1) % 2; - if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) { - length++; + return IslamicCivilCalendar::handleGetYearLength(extendedYear, status); + } + int length = 0; + for(int i=0; i<12; i++) { + length += handleGetMonthLength(extendedYear, i, status); + if (U_FAILURE(status)) { + return 0; } - return length; } - return getUmalqura_MonthLength(extendedYear - UMALQURA_YEAR_START, month); + return length; } /** * Return the number of days in the given Islamic year * @draft ICU 2.4 */ -int32_t IslamicUmalquraCalendar::handleGetYearLength(int32_t extendedYear) const { - if (extendedYear<UMALQURA_YEAR_START || extendedYear>UMALQURA_YEAR_END) { - return 354 + (civilLeapYear(extendedYear) ? 1 : 0); - } - int len = 0; - for(int i=0; i<12; i++) { - len += handleGetMonthLength(extendedYear, i); - } - return len; +int32_t IslamicUmalquraCalendar::handleGetYearLength(int32_t extendedYear, UErrorCode& status) const { + return yearLength(extendedYear, status); } /** @@ -898,46 +902,67 @@ int32_t IslamicUmalquraCalendar::handleGetYearLength(int32_t extendedYear) const * @draft ICU 2.4 */ void IslamicUmalquraCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) { - if (U_FAILURE(status)) return; - int32_t year, month, dayOfMonth, dayOfYear; + if (U_FAILURE(status)) { + return; + } + int64_t year; + int32_t month; int32_t days = julianDay - getEpoc(); - int32_t umalquraStartdays = yearStart(UMALQURA_YEAR_START) ; - if (days < umalquraStartdays) { - //Use Civil calculation - year = (int32_t)ClockMath::floorDivide( - (30 * (int64_t)days + 10646) , (int64_t)10631.0 ); - month = (int32_t)uprv_ceil((days - 29 - yearStart(year)) / 29.5 ); - month = month < 11 ? month : 11; - } else { - int y =UMALQURA_YEAR_START-1, m =0; - long d = 1; - while (d > 0) { - y++; - d = days - yearStart(y) +1; - if (d == handleGetYearLength(y)) { - m=11; - break; - } - if (d < handleGetYearLength(y)){ - int monthLen = handleGetMonthLength(y, m); - m=0; - while(d > monthLen){ - d -= monthLen; - m++; - monthLen = handleGetMonthLength(y, m); + static int64_t kUmalquraStart = yearStart(UMALQURA_YEAR_START, status); + if (U_FAILURE(status)) { + return; + } + if (days < kUmalquraStart) { + IslamicCivilCalendar::handleComputeFields(julianDay, status); + return; + } + // Estimate a value y which is closer to but not greater than the year. + // It is the inverse function of the logic inside + // IslamicUmalquraCalendar::yearStart(). + year = ((static_cast<double>(days) - (460322.05 + 0.5)) / 354.36720) + UMALQURA_YEAR_START - 1; + month = 0; + int32_t d = 1; + // need a slight correction to some + while (d > 0) { + d = days - yearStart(++year, status) + 1; + int32_t length = yearLength(year, status); + if (U_FAILURE(status)) { + return; + } + if (d == length) { + month = 11; + break; + } + if (d < length){ + int32_t monthLen = handleGetMonthLength(year, month, status); + for (month = 0; + d > monthLen; + monthLen = handleGetMonthLength(year, ++month, status)) { + if (U_FAILURE(status)) { + return; } - break; + d -= monthLen; } + break; } - year = y; - month = m; } - dayOfMonth = (days - monthStart(year, month)) + 1; - - // Now figure out the day of the year. - dayOfYear = (days - monthStart(year, 0)) + 1; + int32_t dayOfMonth = monthStart(year, month, status); + int32_t dayOfYear = monthStart(year, 0, status); + if (U_FAILURE(status)) { + return; + } + if (uprv_mul32_overflow(dayOfMonth, -1, &dayOfMonth) || + uprv_add32_overflow(dayOfMonth, days, &dayOfMonth) || + uprv_add32_overflow(dayOfMonth, 1, &dayOfMonth) || + // Now figure out the day of the year. + uprv_mul32_overflow(dayOfYear, -1, &dayOfYear) || + uprv_add32_overflow(dayOfYear, days, &dayOfYear) || + uprv_add32_overflow(dayOfYear, 1, &dayOfYear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); diff --git a/deps/icu-small/source/i18n/islamcal.h b/deps/icu-small/source/i18n/islamcal.h index 8469269bccc473..db90255b5b5a4f 100644 --- a/deps/icu-small/source/i18n/islamcal.h +++ b/deps/icu-small/source/i18n/islamcal.h @@ -197,16 +197,11 @@ class U_I18N_API IslamicCalendar : public Calendar { virtual IslamicCalendar* clone() const override; protected: - /** - * Determine whether a year is a leap year in the Islamic civil calendar - */ - static UBool civilLeapYear(int32_t year); - /** * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ - virtual int32_t yearStart(int32_t year) const; + virtual int64_t yearStart(int32_t year, UErrorCode& status) const; /** * Return the day # on which the given month starts. Days are counted @@ -215,29 +210,8 @@ class U_I18N_API IslamicCalendar : public Calendar { * @param year The hijri year * @param year The hijri month, 0-based */ - virtual int32_t monthStart(int32_t year, int32_t month) const; - - /** - * Find the day number on which a particular month of the true/lunar - * Islamic calendar starts. - * - * @param month The month in question, origin 0 from the Hijri epoch - * - * @return The day number on which the given month starts. - */ - int32_t trueMonthStart(int32_t month) const; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const; - private: - /** - * Return the "age" of the moon at the given time; this is the difference - * in ecliptic latitude between the moon and the sun. This method simply - * calls CalendarAstronomer.moonAge, converts to degrees, - * and adjusts the resultto be in the range [-180, 180]. - * - * @param time The time at which the moon's age is desired, - * in millis since 1/1/1970. - */ - static double moonAge(UDate time, UErrorCode &status); //---------------------------------------------------------------------- // Calendar framework @@ -255,13 +229,13 @@ class U_I18N_API IslamicCalendar : public Calendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year * @internal */ - virtual int32_t handleGetYearLength(int32_t extendedYear) const override; + virtual int32_t handleGetYearLength(int32_t extendedYear, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from field values to milliseconds.... @@ -271,7 +245,7 @@ class U_I18N_API IslamicCalendar : public Calendar { /** * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values @@ -280,7 +254,7 @@ class U_I18N_API IslamicCalendar : public Calendar { /** * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Override Calendar to compute several fields specific to the Islamic @@ -364,32 +338,8 @@ class U_I18N_API IslamicCalendar : public Calendar { // Default century. protected: - /** - * Returns true because the Islamic Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; - private: - /** - * Initializes the 100-year window that dates with 2-digit years - * are considered to fall within so that its start date is 80 years - * before the current time. - */ - static void U_CALLCONV initializeSystemDefaultCentury(); + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; /* @@ -463,7 +413,7 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * from the Hijri epoch, origin 0. * @internal */ - virtual int32_t yearStart(int32_t year) const override; + virtual int64_t yearStart(int32_t year, UErrorCode& status) const override; /** * Return the day # on which the given month starts. Days are counted @@ -473,7 +423,7 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t monthStart(int32_t year, int32_t month) const override; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override; /** * Return the length (in days) of the given month. @@ -482,13 +432,13 @@ class U_I18N_API IslamicCivilCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year * @internal */ - virtual int32_t handleGetYearLength(int32_t extendedYear) const override; + virtual int32_t handleGetYearLength(int32_t extendedYear, UErrorCode& status) const override; /** * Override Calendar to compute several fields specific to the Islamic @@ -584,7 +534,7 @@ class U_I18N_API IslamicTBLACalendar : public IslamicCivilCalendar { * IslamicUmalquraCalendar * This calendar is referred as "Islamic calendar, Umm al-Qura" in CLDR. */ -class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { +class U_I18N_API IslamicUmalquraCalendar : public IslamicCivilCalendar { public: /** * Constructs an IslamicUmalquraCalendar based on the current time in the default time zone @@ -646,7 +596,7 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * from the Hijri epoch, origin 0. * @internal */ - virtual int32_t yearStart(int32_t year) const override; + virtual int64_t yearStart(int32_t year, UErrorCode& status) const override; /** * Return the day # on which the given month starts. Days are counted @@ -656,7 +606,7 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t monthStart(int32_t year, int32_t month) const override; + virtual int64_t monthStart(int32_t year, int32_t month, UErrorCode& status) const override; /** * Return the length (in days) of the given month. @@ -665,13 +615,13 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * @param year The hijri month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Islamic year * @internal */ - virtual int32_t handleGetYearLength(int32_t extendedYear) const override; + virtual int32_t handleGetYearLength(int32_t extendedYear, UErrorCode& status) const override; /** * Override Calendar to compute several fields specific to the Islamic @@ -690,6 +640,9 @@ class U_I18N_API IslamicUmalquraCalendar : public IslamicCalendar { * @internal */ virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; + + private: + virtual int32_t yearLength(int32_t extendedYear, UErrorCode& status) const; }; diff --git a/deps/icu-small/source/i18n/iso8601cal.cpp b/deps/icu-small/source/i18n/iso8601cal.cpp index c3288bc6b5d64e..6bb7579e72da33 100644 --- a/deps/icu-small/source/i18n/iso8601cal.cpp +++ b/deps/icu-small/source/i18n/iso8601cal.cpp @@ -14,11 +14,12 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ISO8601Calendar) ISO8601Calendar::ISO8601Calendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - UErrorCode fwStatus = U_ZERO_ERROR; - int32_t fwLength = aLocale.getKeywordValue("fw", nullptr, 0, fwStatus); - // Do not set first day of week for iso8601 to Monday if we have fw keyword + UErrorCode tempStatus = U_ZERO_ERROR; + int32_t length = aLocale.getKeywordValue("fw", nullptr, 0, tempStatus) + + aLocale.getKeywordValue("rg", nullptr, 0, tempStatus); + // Do not set first day of week for iso8601 to Monday if we have fw or rg keywords // and let the value set by the Calendar constructor to take care of it. - if (U_SUCCESS(fwStatus) && fwLength == 0) { + if (U_SUCCESS(tempStatus) && length == 0) { setFirstDayOfWeek(UCAL_MONDAY); } setMinimalDaysInFirstWeek(4); diff --git a/deps/icu-small/source/i18n/iso8601cal.h b/deps/icu-small/source/i18n/iso8601cal.h index 688fac3588b783..957f12e4f230e7 100644 --- a/deps/icu-small/source/i18n/iso8601cal.h +++ b/deps/icu-small/source/i18n/iso8601cal.h @@ -90,6 +90,8 @@ class ISO8601Calendar : public GregorianCalendar { */ virtual const char * getType() const override; + protected: + virtual bool isEra0CountingBackward() const override { return false; } private: diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index fc18d6c0eb11d9..b71b935e4ed8b0 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -98,7 +98,7 @@ static void U_CALLCONV initializeEras(UErrorCode &status) { if (U_FAILURE(status)) { return; } - gCurrentEra = gJapaneseEraRules->getCurrentEraIndex(); + gCurrentEra = gJapaneseEraRules->getCurrentEraCode(); } static void init(UErrorCode &status) { @@ -115,7 +115,6 @@ JapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { init(success); - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } JapaneseCalendar::~JapaneseCalendar() @@ -130,12 +129,6 @@ JapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source) U_ASSERT(U_SUCCESS(status)); } -JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - JapaneseCalendar* JapaneseCalendar::clone() const { return new JapaneseCalendar(*this); @@ -146,8 +139,11 @@ const char *JapaneseCalendar::getType() const return "japanese"; } -int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) +int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } int32_t era = internalGetEra(); // TODO do we assume we can trust 'era'? What if it is denormalized? @@ -155,9 +151,10 @@ int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) // Find out if we are at the edge of an era int32_t eraStart[3] = { 0,0,0 }; - UErrorCode status = U_ZERO_ERROR; gJapaneseEraRules->getStartDate(era, eraStart, status); - U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) { + return 0; + } if(eyear == eraStart[0]) { // Yes, we're in the first year of this era. return eraStart[1] // month @@ -167,21 +164,22 @@ int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) return month; } -int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month) +int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } int32_t era = internalGetEra(); int32_t day = 1; int32_t eraStart[3] = { 0,0,0 }; - UErrorCode status = U_ZERO_ERROR; gJapaneseEraRules->getStartDate(era, eraStart, status); - U_ASSERT(U_SUCCESS(status)); - if(eyear == eraStart[0]) { - if(month == eraStart[1] - 1) { - return eraStart[2]; - } + if (U_FAILURE(status)) { + return 0; + } + if (eyear == eraStart[0] && (month == eraStart[1] - 1)) { + return eraStart[2]; } - return day; } @@ -191,24 +189,29 @@ int32_t JapaneseCalendar::internalGetEra() const return internalGet(UCAL_ERA, gCurrentEra); } -int32_t JapaneseCalendar::handleGetExtendedYear() +int32_t JapaneseCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year // The default value of EXTENDED_YEAR is 1970 (Showa 45) - int32_t year; if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); - } else { - UErrorCode status = U_ZERO_ERROR; - int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); - U_ASSERT(U_SUCCESS(status)); - - // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc - year = internalGet(UCAL_YEAR, 1) // pin to minimum of year 1 (first year) - + eraStartYear // add gregorian starting year - - 1; // Subtract one because year starts at 1 + return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } + int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); + if (U_FAILURE(status)) { + return 0; + } + + // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc + int32_t year = internalGet(UCAL_YEAR, 1); // pin to minimum of year 1 (first year) + // add gregorian starting year, subtract one because year starts at 1 + if (uprv_add32_overflow(year, eraStartYear - 1, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } return year; } @@ -219,10 +222,18 @@ void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status //Calendar::timeToFields(theTime, quick, status); GregorianCalendar::handleComputeFields(julianDay, status); int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year - int32_t eraIdx = gJapaneseEraRules->getEraIndex(year, internalGetMonth() + 1, internalGet(UCAL_DAY_OF_MONTH), status); + int32_t eraCode = gJapaneseEraRules->getEraCode(year, internalGetMonth(status) + 1, internalGet(UCAL_DAY_OF_MONTH), status); - internalSet(UCAL_ERA, eraIdx); - internalSet(UCAL_YEAR, year - gJapaneseEraRules->getStartYear(eraIdx, status) + 1); + int32_t startYear = gJapaneseEraRules->getStartYear(eraCode, status) - 1; + if (U_FAILURE(status)) { + return; + } + if (uprv_add32_overflow(year, -startYear, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + internalSet(UCAL_ERA, eraCode); + internalSet(UCAL_YEAR, year); } /* @@ -250,7 +261,7 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { return 0; } - return gJapaneseEraRules->getNumberOfEras() - 1; // max known era, not gCurrentEra + return gJapaneseEraRules->getMaxEraCode(); // max known era, not gCurrentEra case UCAL_YEAR: { switch (limitType) { @@ -277,31 +288,30 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l } int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { - if (field == UCAL_YEAR) { - int32_t era = get(UCAL_ERA, status); - if (U_FAILURE(status)) { - return 0; // error case... any value - } - if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra - // TODO: Investigate what value should be used here - revisit after 4.0. - return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); - } else { - int32_t nextEraStart[3] = { 0,0,0 }; - gJapaneseEraRules->getStartDate(era + 1, nextEraStart, status); - int32_t nextEraYear = nextEraStart[0]; - int32_t nextEraMonth = nextEraStart[1]; // 1-base - int32_t nextEraDate = nextEraStart[2]; - - int32_t eraStartYear = gJapaneseEraRules->getStartYear(era, status); - int32_t maxYear = nextEraYear - eraStartYear + 1; // 1-base - if (nextEraMonth == 1 && nextEraDate == 1) { - // Subtract 1, because the next era starts at Jan 1 - maxYear--; - } - return maxYear; - } + if (field != UCAL_YEAR) { + return GregorianCalendar::getActualMaximum(field, status); + } + int32_t era = get(UCAL_ERA, status); + if (U_FAILURE(status)) { + return 0; // error case... any value + } + if (era == gJapaneseEraRules->getMaxEraCode()) { // max known era, not gCurrentEra + // TODO: Investigate what value should be used here - revisit after 4.0. + return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); + } + int32_t nextEraStart[3] = { 0,0,0 }; + gJapaneseEraRules->getStartDate(era + 1, nextEraStart, status); + int32_t nextEraYear = nextEraStart[0]; + int32_t nextEraMonth = nextEraStart[1]; // 1-base + int32_t nextEraDate = nextEraStart[2]; + + int32_t eraStartYear = gJapaneseEraRules->getStartYear(era, status); + int32_t maxYear = nextEraYear - eraStartYear + 1; // 1-base + if (nextEraMonth == 1 && nextEraDate == 1) { + // Subtract 1, because the next era starts at Jan 1 + maxYear--; } - return GregorianCalendar::getActualMaximum(field, status); + return maxYear; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index 3ae4900a2cdd96..3271cbfb794a9e 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -104,13 +104,6 @@ class JapaneseCalendar : public GregorianCalendar { */ JapaneseCalendar(const JapaneseCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - JapaneseCalendar& operator=(const JapaneseCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. @@ -123,7 +116,7 @@ class JapaneseCalendar : public GregorianCalendar { * Japanese calendar case, this is equal to the equivalent extended Gregorian year. * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Return the maximum value that this field could have, given the current date. @@ -166,22 +159,7 @@ class JapaneseCalendar : public GregorianCalendar { */ virtual const char * getType() const override; - /** - * @return false - no default century in Japanese - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Not used - no default century. - * @internal - */ - virtual UDate defaultCenturyStart() const override; - /** - * Not used - no default century. - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY private: JapaneseCalendar(); // default constructor not implemented @@ -210,9 +188,10 @@ class JapaneseCalendar : public GregorianCalendar { * taking year and era into account. Will return the first month of the given era, if * the current year is an ascension year. * @param eyear the extended year + * @param status Indicates the status. * @internal */ - virtual int32_t getDefaultMonthInYear(int32_t eyear) override; + virtual int32_t getDefaultMonthInYear(int32_t eyear, UErrorCode& status) override; /*** * Called by computeJulianDay. Returns the default day (1-based) for the month, @@ -220,9 +199,12 @@ class JapaneseCalendar : public GregorianCalendar { * era, if the current month is an ascension year and month. * @param eyear the extended year * @param mon the month in the year + * @param status Indicates the status. * @internal */ - virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month) override; + virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month, UErrorCode& status) override; + + virtual bool isEra0CountingBackward() const override { return false; } }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/listformatter.cpp b/deps/icu-small/source/i18n/listformatter.cpp index 3405b5de383349..06bea83b6ebeeb 100644 --- a/deps/icu-small/source/i18n/listformatter.cpp +++ b/deps/icu-small/source/i18n/listformatter.cpp @@ -121,16 +121,16 @@ class ContextualHandler : public PatternHandler { ContextualHandler::~ContextualHandler() { } -static const char16_t *spanishY = u"{0} y {1}"; -static const char16_t *spanishE = u"{0} e {1}"; -static const char16_t *spanishO = u"{0} o {1}"; -static const char16_t *spanishU = u"{0} u {1}"; -static const char16_t *hebrewVav = u"{0} \u05D5{1}"; -static const char16_t *hebrewVavDash = u"{0} \u05D5-{1}"; +const char16_t* spanishY = u"{0} y {1}"; +const char16_t* spanishE = u"{0} e {1}"; +const char16_t* spanishO = u"{0} o {1}"; +const char16_t* spanishU = u"{0} u {1}"; +const char16_t* hebrewVav = u"{0} \u05D5{1}"; +const char16_t* hebrewVavDash = u"{0} \u05D5-{1}"; // Condiction to change to e. // Starts with "hi" or "i" but not with "hie" nor "hia" -static bool shouldChangeToE(const UnicodeString& text) { +bool shouldChangeToE(const UnicodeString& text) { int32_t len = text.length(); if (len == 0) { return false; } // Case insensitive match hi but not hie nor hia. @@ -147,7 +147,7 @@ static bool shouldChangeToE(const UnicodeString& text) { // Condiction to change to u. // Starts with "o", "ho", and "8". Also "11" by itself. // re: ^((o|ho|8).*|11)$ -static bool shouldChangeToU(const UnicodeString& text) { +bool shouldChangeToU(const UnicodeString& text) { int32_t len = text.length(); if (len == 0) { return false; } // Case insensitive match o.* and 8.* @@ -164,7 +164,7 @@ static bool shouldChangeToU(const UnicodeString& text) { // Condiction to change to VAV follow by a dash. // Starts with non Hebrew letter. -static bool shouldChangeToVavDash(const UnicodeString& text) { +bool shouldChangeToVavDash(const UnicodeString& text) { if (text.isEmpty()) { return false; } UErrorCode status = U_ZERO_ERROR; return uscript_getScript(text.char32At(0), &status) != USCRIPT_HEBREW; diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index da4e69b49b7dfc..ee4bcb9e5be0d7 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -489,7 +489,6 @@ void MeasureFormat::parseObject( const UnicodeString & /*source*/, Formattable & /*result*/, ParsePosition& /*pos*/) const { - return; } UnicodeString &MeasureFormat::formatMeasurePerUnit( @@ -501,14 +500,14 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit( if (U_FAILURE(status)) { return appendTo; } - auto* df = dynamic_cast<const DecimalFormat*>(&getNumberFormatInternal()); + const auto* df = dynamic_cast<const DecimalFormat*>(&getNumberFormatInternal()); if (df == nullptr) { // Don't know how to handle other types of NumberFormat status = U_UNSUPPORTED_ERROR; return appendTo; } UFormattedNumberData result; - if (auto* lnf = df->toNumberFormatter(status)) { + if (const auto* lnf = df->toNumberFormatter(status)) { result.quantity.setToDouble(measure.getNumber().getDouble(status)); lnf->unit(measure.getUnit()) .perUnit(perUnit) @@ -691,7 +690,7 @@ UnicodeString &MeasureFormat::formatMeasure( pos, status); } - auto* df = dynamic_cast<const DecimalFormat*>(&nf); + const auto* df = dynamic_cast<const DecimalFormat*>(&nf); if (df == nullptr) { // Handle other types of NumberFormat using the ICU 63 code, modified to // get the unitPattern from LongNameHandler and handle fallback to OTHER. @@ -708,7 +707,7 @@ UnicodeString &MeasureFormat::formatMeasure( return QuantityFormatter::format(formatter, formattedNumber, appendTo, pos, status); } UFormattedNumberData result; - if (auto* lnf = df->toNumberFormatter(status)) { + if (const auto* lnf = df->toNumberFormatter(status)) { result.quantity.setToDouble(amtNumber.getDouble(status)); lnf->unit(amtUnit) .unitWidth(getUnitWidth(fWidth)) @@ -761,7 +760,7 @@ UnicodeString &MeasureFormat::formatNumeric( return appendTo; } number::LocalizedNumberFormatter numberFormatter2; - if (auto* lnf = numberFormatter->toNumberFormatter(status)) { + if (const auto* lnf = numberFormatter->toNumberFormatter(status)) { numberFormatter2 = lnf->integerWidth(number::IntegerWidth::zeroFillTo(2)); } else { return appendTo; diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index abb21997705a11..06b2436940ae87 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -39,28 +39,29 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureUnit) static const int32_t gOffsets[] = { 0, 2, - 7, - 17, - 27, - 31, - 332, - 343, - 360, - 364, - 373, - 376, - 380, - 388, - 410, - 414, - 429, - 430, - 436, - 447, - 452, - 456, - 458, - 492 + 8, + 21, + 34, + 38, + 340, + 351, + 370, + 378, + 392, + 396, + 400, + 408, + 439, + 443, + 445, + 462, + 463, + 469, + 481, + 487, + 492, + 494, + 538 }; static const int32_t kCurrencyOffset = 5; @@ -82,6 +83,7 @@ static const char * const gTypes[] = { "graphics", "length", "light", + "magnetic", "mass", "none", "power", @@ -101,9 +103,13 @@ static const char * const gSubTypes[] = { "degree", "radian", "revolution", + "steradian", "acre", + "bu-jp", + "cho", "dunam", "hectare", + "se-jp", "square-centimeter", "square-foot", "square-inch", @@ -113,13 +119,16 @@ static const char * const gSubTypes[] = { "square-yard", "item", "karat", + "katal", "milligram-ofglucose-per-deciliter", - "milligram-per-deciliter", "millimole-per-liter", "mole", + "ofglucose", + "part", + "part-per-1e6", + "part-per-1e9", "percent", "permille", - "permillion", "permyriad", "liter-per-100-kilometer", "liter-per-kilometer", @@ -423,6 +432,7 @@ static const char * const gSubTypes[] = { "ZRZ", "ZWC", "ZWD", + "ZWG", "ZWL", "ZWN", "ZWR", @@ -441,6 +451,7 @@ static const char * const gSubTypes[] = { "day", "day-person", "decade", + "fortnight", "hour", "microsecond", "millisecond", @@ -448,6 +459,7 @@ static const char * const gSubTypes[] = { "month", "month-person", "nanosecond", + "night", "quarter", "second", "week", @@ -455,18 +467,28 @@ static const char * const gSubTypes[] = { "year", "year-person", "ampere", + "coulomb", + "farad", + "henry", "milliampere", "ohm", + "siemens", "volt", + "becquerel", "british-thermal-unit", + "british-thermal-unit-it", "calorie", + "calorie-it", "electronvolt", "foodcalorie", + "gray", "joule", "kilocalorie", "kilojoule", "kilowatt-hour", + "sievert", "therm-us", + "kilogram-force", "kilowatt-hour-per-100-kilometer", "newton", "pound-force", @@ -484,12 +506,15 @@ static const char * const gSubTypes[] = { "pixel-per-inch", "astronomical-unit", "centimeter", + "chain", "decimeter", "earth-radius", "fathom", "foot", "furlong", "inch", + "jo-jp", + "ken", "kilometer", "light-year", "meter", @@ -502,15 +527,24 @@ static const char * const gSubTypes[] = { "parsec", "picometer", "point", + "ri-jp", + "rin", + "rod", + "shaku-cloth", + "shaku-length", "solar-radius", + "sun", "yard", "candela", "lumen", "lux", "solar-luminosity", + "tesla", + "weber", "carat", "dalton", "earth-mass", + "fun", "grain", "gram", "kilogram", @@ -519,6 +553,7 @@ static const char * const gSubTypes[] = { "ounce", "ounce-troy", "pound", + "slug", "solar-mass", "stone", "ton", @@ -539,17 +574,20 @@ static const char * const gSubTypes[] = { "megapascal", "millibar", "millimeter-ofhg", + "ofhg", "pascal", "pound-force-per-square-inch", "beaufort", "kilometer-per-hour", "knot", + "light-speed", "meter-per-second", "mile-per-hour", "celsius", "fahrenheit", "generic", "kelvin", + "rankine", "newton-meter", "pound-force-foot", "acre-foot", @@ -564,6 +602,8 @@ static const char * const gSubTypes[] = { "cubic-mile", "cubic-yard", "cup", + "cup-imperial", + "cup-jp", "cup-metric", "deciliter", "dessert-spoon", @@ -572,24 +612,32 @@ static const char * const gSubTypes[] = { "drop", "fluid-ounce", "fluid-ounce-imperial", + "fluid-ounce-metric", "gallon", "gallon-imperial", "hectoliter", "jigger", + "koku", + "kosaji", "liter", "megaliter", "milliliter", + "osaji", "pinch", "pint", + "pint-imperial", "pint-metric", "quart", "quart-imperial", + "sai", + "shaku", "tablespoon", - "teaspoon" + "teaspoon", + "to-jp" }; // Shortcuts to the base unit in order to make the default constructor fast -static const int32_t kBaseTypeIdx = 16; +static const int32_t kBaseTypeIdx = 17; static const int32_t kBaseSubTypeIdx = 0; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { @@ -648,6 +696,14 @@ MeasureUnit MeasureUnit::getRevolutionAngle() { return MeasureUnit(1, 4); } +MeasureUnit *MeasureUnit::createSteradian(UErrorCode &status) { + return MeasureUnit::create(1, 5, status); +} + +MeasureUnit MeasureUnit::getSteradian() { + return MeasureUnit(1, 5); +} + MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) { return MeasureUnit::create(2, 0, status); } @@ -656,78 +712,102 @@ MeasureUnit MeasureUnit::getAcre() { return MeasureUnit(2, 0); } -MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) { +MeasureUnit *MeasureUnit::createBuJp(UErrorCode &status) { return MeasureUnit::create(2, 1, status); } -MeasureUnit MeasureUnit::getDunam() { +MeasureUnit MeasureUnit::getBuJp() { return MeasureUnit(2, 1); } -MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { +MeasureUnit *MeasureUnit::createCho(UErrorCode &status) { return MeasureUnit::create(2, 2, status); } -MeasureUnit MeasureUnit::getHectare() { +MeasureUnit MeasureUnit::getCho() { return MeasureUnit(2, 2); } -MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) { return MeasureUnit::create(2, 3, status); } -MeasureUnit MeasureUnit::getSquareCentimeter() { +MeasureUnit MeasureUnit::getDunam() { return MeasureUnit(2, 3); } -MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { +MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { return MeasureUnit::create(2, 4, status); } -MeasureUnit MeasureUnit::getSquareFoot() { +MeasureUnit MeasureUnit::getHectare() { return MeasureUnit(2, 4); } -MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSeJp(UErrorCode &status) { return MeasureUnit::create(2, 5, status); } -MeasureUnit MeasureUnit::getSquareInch() { +MeasureUnit MeasureUnit::getSeJp() { return MeasureUnit(2, 5); } -MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { return MeasureUnit::create(2, 6, status); } -MeasureUnit MeasureUnit::getSquareKilometer() { +MeasureUnit MeasureUnit::getSquareCentimeter() { return MeasureUnit(2, 6); } -MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { return MeasureUnit::create(2, 7, status); } -MeasureUnit MeasureUnit::getSquareMeter() { +MeasureUnit MeasureUnit::getSquareFoot() { return MeasureUnit(2, 7); } -MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { return MeasureUnit::create(2, 8, status); } -MeasureUnit MeasureUnit::getSquareMile() { +MeasureUnit MeasureUnit::getSquareInch() { return MeasureUnit(2, 8); } -MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { return MeasureUnit::create(2, 9, status); } -MeasureUnit MeasureUnit::getSquareYard() { +MeasureUnit MeasureUnit::getSquareKilometer() { return MeasureUnit(2, 9); } +MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { + return MeasureUnit::create(2, 10, status); +} + +MeasureUnit MeasureUnit::getSquareMeter() { + return MeasureUnit(2, 10); +} + +MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { + return MeasureUnit::create(2, 11, status); +} + +MeasureUnit MeasureUnit::getSquareMile() { + return MeasureUnit(2, 11); +} + +MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { + return MeasureUnit::create(2, 12, status); +} + +MeasureUnit MeasureUnit::getSquareYard() { + return MeasureUnit(2, 12); +} + MeasureUnit *MeasureUnit::createItem(UErrorCode &status) { return MeasureUnit::create(3, 0, status); } @@ -744,14 +824,22 @@ MeasureUnit MeasureUnit::getKarat() { return MeasureUnit(3, 1); } -MeasureUnit *MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createKatal(UErrorCode &status) { return MeasureUnit::create(3, 2, status); } -MeasureUnit MeasureUnit::getMilligramOfglucosePerDeciliter() { +MeasureUnit MeasureUnit::getKatal() { return MeasureUnit(3, 2); } +MeasureUnit *MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode &status) { + return MeasureUnit::create(3, 3, status); +} + +MeasureUnit MeasureUnit::getMilligramOfglucosePerDeciliter() { + return MeasureUnit(3, 3); +} + MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) { return MeasureUnit::create(3, 3, status); } @@ -776,22 +864,30 @@ MeasureUnit MeasureUnit::getMole() { return MeasureUnit(3, 5); } -MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { +MeasureUnit *MeasureUnit::createOfglucose(UErrorCode &status) { return MeasureUnit::create(3, 6, status); } -MeasureUnit MeasureUnit::getPercent() { +MeasureUnit MeasureUnit::getOfglucose() { return MeasureUnit(3, 6); } -MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { +MeasureUnit *MeasureUnit::createPart(UErrorCode &status) { return MeasureUnit::create(3, 7, status); } -MeasureUnit MeasureUnit::getPermille() { +MeasureUnit MeasureUnit::getPart() { return MeasureUnit(3, 7); } +MeasureUnit *MeasureUnit::createPartPer1E6(UErrorCode &status) { + return MeasureUnit::create(3, 8, status); +} + +MeasureUnit MeasureUnit::getPartPer1E6() { + return MeasureUnit(3, 8); +} + MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) { return MeasureUnit::create(3, 8, status); } @@ -800,14 +896,38 @@ MeasureUnit MeasureUnit::getPartPerMillion() { return MeasureUnit(3, 8); } -MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) { +MeasureUnit *MeasureUnit::createPartPer1E9(UErrorCode &status) { return MeasureUnit::create(3, 9, status); } -MeasureUnit MeasureUnit::getPermyriad() { +MeasureUnit MeasureUnit::getPartPer1E9() { return MeasureUnit(3, 9); } +MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { + return MeasureUnit::create(3, 10, status); +} + +MeasureUnit MeasureUnit::getPercent() { + return MeasureUnit(3, 10); +} + +MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { + return MeasureUnit::create(3, 11, status); +} + +MeasureUnit MeasureUnit::getPermille() { + return MeasureUnit(3, 11); +} + +MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) { + return MeasureUnit::create(3, 12, status); +} + +MeasureUnit MeasureUnit::getPermyriad() { + return MeasureUnit(3, 12); +} + MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) { return MeasureUnit::create(4, 0, status); } @@ -960,110 +1080,126 @@ MeasureUnit MeasureUnit::getDecade() { return MeasureUnit(7, 3); } -MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { +MeasureUnit *MeasureUnit::createFortnight(UErrorCode &status) { return MeasureUnit::create(7, 4, status); } -MeasureUnit MeasureUnit::getHour() { +MeasureUnit MeasureUnit::getFortnight() { return MeasureUnit(7, 4); } -MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { +MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { return MeasureUnit::create(7, 5, status); } -MeasureUnit MeasureUnit::getMicrosecond() { +MeasureUnit MeasureUnit::getHour() { return MeasureUnit(7, 5); } -MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { return MeasureUnit::create(7, 6, status); } -MeasureUnit MeasureUnit::getMillisecond() { +MeasureUnit MeasureUnit::getMicrosecond() { return MeasureUnit(7, 6); } -MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { return MeasureUnit::create(7, 7, status); } -MeasureUnit MeasureUnit::getMinute() { +MeasureUnit MeasureUnit::getMillisecond() { return MeasureUnit(7, 7); } -MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { return MeasureUnit::create(7, 8, status); } -MeasureUnit MeasureUnit::getMonth() { +MeasureUnit MeasureUnit::getMinute() { return MeasureUnit(7, 8); } -MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { return MeasureUnit::create(7, 9, status); } -MeasureUnit MeasureUnit::getMonthPerson() { +MeasureUnit MeasureUnit::getMonth() { return MeasureUnit(7, 9); } -MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) { return MeasureUnit::create(7, 10, status); } -MeasureUnit MeasureUnit::getNanosecond() { +MeasureUnit MeasureUnit::getMonthPerson() { return MeasureUnit(7, 10); } -MeasureUnit *MeasureUnit::createQuarter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { return MeasureUnit::create(7, 11, status); } -MeasureUnit MeasureUnit::getQuarter() { +MeasureUnit MeasureUnit::getNanosecond() { return MeasureUnit(7, 11); } -MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNight(UErrorCode &status) { return MeasureUnit::create(7, 12, status); } -MeasureUnit MeasureUnit::getSecond() { +MeasureUnit MeasureUnit::getNight() { return MeasureUnit(7, 12); } -MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { +MeasureUnit *MeasureUnit::createQuarter(UErrorCode &status) { return MeasureUnit::create(7, 13, status); } -MeasureUnit MeasureUnit::getWeek() { +MeasureUnit MeasureUnit::getQuarter() { return MeasureUnit(7, 13); } -MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { return MeasureUnit::create(7, 14, status); } -MeasureUnit MeasureUnit::getWeekPerson() { +MeasureUnit MeasureUnit::getSecond() { return MeasureUnit(7, 14); } -MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { +MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { return MeasureUnit::create(7, 15, status); } -MeasureUnit MeasureUnit::getYear() { +MeasureUnit MeasureUnit::getWeek() { return MeasureUnit(7, 15); } -MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) { +MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) { return MeasureUnit::create(7, 16, status); } -MeasureUnit MeasureUnit::getYearPerson() { +MeasureUnit MeasureUnit::getWeekPerson() { return MeasureUnit(7, 16); } +MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { + return MeasureUnit::create(7, 17, status); +} + +MeasureUnit MeasureUnit::getYear() { + return MeasureUnit(7, 17); +} + +MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) { + return MeasureUnit::create(7, 18, status); +} + +MeasureUnit MeasureUnit::getYearPerson() { + return MeasureUnit(7, 18); +} + MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) { return MeasureUnit::create(8, 0, status); } @@ -1072,126 +1208,206 @@ MeasureUnit MeasureUnit::getAmpere() { return MeasureUnit(8, 0); } -MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { +MeasureUnit *MeasureUnit::createCoulomb(UErrorCode &status) { return MeasureUnit::create(8, 1, status); } -MeasureUnit MeasureUnit::getMilliampere() { +MeasureUnit MeasureUnit::getCoulomb() { return MeasureUnit(8, 1); } -MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { +MeasureUnit *MeasureUnit::createFarad(UErrorCode &status) { return MeasureUnit::create(8, 2, status); } -MeasureUnit MeasureUnit::getOhm() { +MeasureUnit MeasureUnit::getFarad() { return MeasureUnit(8, 2); } -MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { +MeasureUnit *MeasureUnit::createHenry(UErrorCode &status) { return MeasureUnit::create(8, 3, status); } -MeasureUnit MeasureUnit::getVolt() { +MeasureUnit MeasureUnit::getHenry() { return MeasureUnit(8, 3); } -MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { + return MeasureUnit::create(8, 4, status); +} + +MeasureUnit MeasureUnit::getMilliampere() { + return MeasureUnit(8, 4); +} + +MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { + return MeasureUnit::create(8, 5, status); +} + +MeasureUnit MeasureUnit::getOhm() { + return MeasureUnit(8, 5); +} + +MeasureUnit *MeasureUnit::createSiemens(UErrorCode &status) { + return MeasureUnit::create(8, 6, status); +} + +MeasureUnit MeasureUnit::getSiemens() { + return MeasureUnit(8, 6); +} + +MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { + return MeasureUnit::create(8, 7, status); +} + +MeasureUnit MeasureUnit::getVolt() { + return MeasureUnit(8, 7); +} + +MeasureUnit *MeasureUnit::createBecquerel(UErrorCode &status) { return MeasureUnit::create(9, 0, status); } -MeasureUnit MeasureUnit::getBritishThermalUnit() { +MeasureUnit MeasureUnit::getBecquerel() { return MeasureUnit(9, 0); } -MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { +MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) { return MeasureUnit::create(9, 1, status); } -MeasureUnit MeasureUnit::getCalorie() { +MeasureUnit MeasureUnit::getBritishThermalUnit() { return MeasureUnit(9, 1); } -MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) { +MeasureUnit *MeasureUnit::createBritishThermalUnitIt(UErrorCode &status) { return MeasureUnit::create(9, 2, status); } -MeasureUnit MeasureUnit::getElectronvolt() { +MeasureUnit MeasureUnit::getBritishThermalUnitIt() { return MeasureUnit(9, 2); } -MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { +MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { return MeasureUnit::create(9, 3, status); } -MeasureUnit MeasureUnit::getFoodcalorie() { +MeasureUnit MeasureUnit::getCalorie() { return MeasureUnit(9, 3); } -MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { +MeasureUnit *MeasureUnit::createCalorieIt(UErrorCode &status) { return MeasureUnit::create(9, 4, status); } -MeasureUnit MeasureUnit::getJoule() { +MeasureUnit MeasureUnit::getCalorieIt() { return MeasureUnit(9, 4); } -MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { +MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) { return MeasureUnit::create(9, 5, status); } -MeasureUnit MeasureUnit::getKilocalorie() { +MeasureUnit MeasureUnit::getElectronvolt() { return MeasureUnit(9, 5); } -MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { +MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { return MeasureUnit::create(9, 6, status); } -MeasureUnit MeasureUnit::getKilojoule() { +MeasureUnit MeasureUnit::getFoodcalorie() { return MeasureUnit(9, 6); } -MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { +MeasureUnit *MeasureUnit::createGray(UErrorCode &status) { return MeasureUnit::create(9, 7, status); } -MeasureUnit MeasureUnit::getKilowattHour() { +MeasureUnit MeasureUnit::getGray() { return MeasureUnit(9, 7); } -MeasureUnit *MeasureUnit::createThermUs(UErrorCode &status) { +MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { return MeasureUnit::create(9, 8, status); } -MeasureUnit MeasureUnit::getThermUs() { +MeasureUnit MeasureUnit::getJoule() { return MeasureUnit(9, 8); } -MeasureUnit *MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode &status) { +MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { + return MeasureUnit::create(9, 9, status); +} + +MeasureUnit MeasureUnit::getKilocalorie() { + return MeasureUnit(9, 9); +} + +MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { + return MeasureUnit::create(9, 10, status); +} + +MeasureUnit MeasureUnit::getKilojoule() { + return MeasureUnit(9, 10); +} + +MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { + return MeasureUnit::create(9, 11, status); +} + +MeasureUnit MeasureUnit::getKilowattHour() { + return MeasureUnit(9, 11); +} + +MeasureUnit *MeasureUnit::createSievert(UErrorCode &status) { + return MeasureUnit::create(9, 12, status); +} + +MeasureUnit MeasureUnit::getSievert() { + return MeasureUnit(9, 12); +} + +MeasureUnit *MeasureUnit::createThermUs(UErrorCode &status) { + return MeasureUnit::create(9, 13, status); +} + +MeasureUnit MeasureUnit::getThermUs() { + return MeasureUnit(9, 13); +} + +MeasureUnit *MeasureUnit::createKilogramForce(UErrorCode &status) { return MeasureUnit::create(10, 0, status); } -MeasureUnit MeasureUnit::getKilowattHourPer100Kilometer() { +MeasureUnit MeasureUnit::getKilogramForce() { return MeasureUnit(10, 0); } -MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { +MeasureUnit *MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode &status) { return MeasureUnit::create(10, 1, status); } -MeasureUnit MeasureUnit::getNewton() { +MeasureUnit MeasureUnit::getKilowattHourPer100Kilometer() { return MeasureUnit(10, 1); } -MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { return MeasureUnit::create(10, 2, status); } -MeasureUnit MeasureUnit::getPoundForce() { +MeasureUnit MeasureUnit::getNewton() { return MeasureUnit(10, 2); } +MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { + return MeasureUnit::create(10, 3, status); +} + +MeasureUnit MeasureUnit::getPoundForce() { + return MeasureUnit(10, 3); +} + MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { return MeasureUnit::create(11, 0, status); } @@ -1304,164 +1520,236 @@ MeasureUnit MeasureUnit::getCentimeter() { return MeasureUnit(13, 1); } -MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createChain(UErrorCode &status) { return MeasureUnit::create(13, 2, status); } -MeasureUnit MeasureUnit::getDecimeter() { +MeasureUnit MeasureUnit::getChain() { return MeasureUnit(13, 2); } -MeasureUnit *MeasureUnit::createEarthRadius(UErrorCode &status) { +MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { return MeasureUnit::create(13, 3, status); } -MeasureUnit MeasureUnit::getEarthRadius() { +MeasureUnit MeasureUnit::getDecimeter() { return MeasureUnit(13, 3); } -MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { +MeasureUnit *MeasureUnit::createEarthRadius(UErrorCode &status) { return MeasureUnit::create(13, 4, status); } -MeasureUnit MeasureUnit::getFathom() { +MeasureUnit MeasureUnit::getEarthRadius() { return MeasureUnit(13, 4); } -MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { +MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { return MeasureUnit::create(13, 5, status); } -MeasureUnit MeasureUnit::getFoot() { +MeasureUnit MeasureUnit::getFathom() { return MeasureUnit(13, 5); } -MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { +MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { return MeasureUnit::create(13, 6, status); } -MeasureUnit MeasureUnit::getFurlong() { - return MeasureUnit(13, 6); +MeasureUnit MeasureUnit::getFoot() { + return MeasureUnit(13, 6); +} + +MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { + return MeasureUnit::create(13, 7, status); +} + +MeasureUnit MeasureUnit::getFurlong() { + return MeasureUnit(13, 7); +} + +MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { + return MeasureUnit::create(13, 8, status); +} + +MeasureUnit MeasureUnit::getInch() { + return MeasureUnit(13, 8); +} + +MeasureUnit *MeasureUnit::createJoJp(UErrorCode &status) { + return MeasureUnit::create(13, 9, status); +} + +MeasureUnit MeasureUnit::getJoJp() { + return MeasureUnit(13, 9); } -MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { - return MeasureUnit::create(13, 7, status); +MeasureUnit *MeasureUnit::createKen(UErrorCode &status) { + return MeasureUnit::create(13, 10, status); } -MeasureUnit MeasureUnit::getInch() { - return MeasureUnit(13, 7); +MeasureUnit MeasureUnit::getKen() { + return MeasureUnit(13, 10); } MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) { - return MeasureUnit::create(13, 8, status); + return MeasureUnit::create(13, 11, status); } MeasureUnit MeasureUnit::getKilometer() { - return MeasureUnit(13, 8); + return MeasureUnit(13, 11); } MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) { - return MeasureUnit::create(13, 9, status); + return MeasureUnit::create(13, 12, status); } MeasureUnit MeasureUnit::getLightYear() { - return MeasureUnit(13, 9); + return MeasureUnit(13, 12); } MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) { - return MeasureUnit::create(13, 10, status); + return MeasureUnit::create(13, 13, status); } MeasureUnit MeasureUnit::getMeter() { - return MeasureUnit(13, 10); + return MeasureUnit(13, 13); } MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) { - return MeasureUnit::create(13, 11, status); + return MeasureUnit::create(13, 14, status); } MeasureUnit MeasureUnit::getMicrometer() { - return MeasureUnit(13, 11); + return MeasureUnit(13, 14); } MeasureUnit *MeasureUnit::createMile(UErrorCode &status) { - return MeasureUnit::create(13, 12, status); + return MeasureUnit::create(13, 15, status); } MeasureUnit MeasureUnit::getMile() { - return MeasureUnit(13, 12); + return MeasureUnit(13, 15); } MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) { - return MeasureUnit::create(13, 13, status); + return MeasureUnit::create(13, 16, status); } MeasureUnit MeasureUnit::getMileScandinavian() { - return MeasureUnit(13, 13); + return MeasureUnit(13, 16); } MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { - return MeasureUnit::create(13, 14, status); + return MeasureUnit::create(13, 17, status); } MeasureUnit MeasureUnit::getMillimeter() { - return MeasureUnit(13, 14); + return MeasureUnit(13, 17); } MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { - return MeasureUnit::create(13, 15, status); + return MeasureUnit::create(13, 18, status); } MeasureUnit MeasureUnit::getNanometer() { - return MeasureUnit(13, 15); + return MeasureUnit(13, 18); } MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { - return MeasureUnit::create(13, 16, status); + return MeasureUnit::create(13, 19, status); } MeasureUnit MeasureUnit::getNauticalMile() { - return MeasureUnit(13, 16); + return MeasureUnit(13, 19); } MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { - return MeasureUnit::create(13, 17, status); + return MeasureUnit::create(13, 20, status); } MeasureUnit MeasureUnit::getParsec() { - return MeasureUnit(13, 17); + return MeasureUnit(13, 20); } MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { - return MeasureUnit::create(13, 18, status); + return MeasureUnit::create(13, 21, status); } MeasureUnit MeasureUnit::getPicometer() { - return MeasureUnit(13, 18); + return MeasureUnit(13, 21); } MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { - return MeasureUnit::create(13, 19, status); + return MeasureUnit::create(13, 22, status); } MeasureUnit MeasureUnit::getPoint() { - return MeasureUnit(13, 19); + return MeasureUnit(13, 22); +} + +MeasureUnit *MeasureUnit::createRiJp(UErrorCode &status) { + return MeasureUnit::create(13, 23, status); +} + +MeasureUnit MeasureUnit::getRiJp() { + return MeasureUnit(13, 23); +} + +MeasureUnit *MeasureUnit::createRin(UErrorCode &status) { + return MeasureUnit::create(13, 24, status); +} + +MeasureUnit MeasureUnit::getRin() { + return MeasureUnit(13, 24); +} + +MeasureUnit *MeasureUnit::createRod(UErrorCode &status) { + return MeasureUnit::create(13, 25, status); +} + +MeasureUnit MeasureUnit::getRod() { + return MeasureUnit(13, 25); +} + +MeasureUnit *MeasureUnit::createShakuCloth(UErrorCode &status) { + return MeasureUnit::create(13, 26, status); +} + +MeasureUnit MeasureUnit::getShakuCloth() { + return MeasureUnit(13, 26); +} + +MeasureUnit *MeasureUnit::createShakuLength(UErrorCode &status) { + return MeasureUnit::create(13, 27, status); +} + +MeasureUnit MeasureUnit::getShakuLength() { + return MeasureUnit(13, 27); } MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) { - return MeasureUnit::create(13, 20, status); + return MeasureUnit::create(13, 28, status); } MeasureUnit MeasureUnit::getSolarRadius() { - return MeasureUnit(13, 20); + return MeasureUnit(13, 28); +} + +MeasureUnit *MeasureUnit::createSun(UErrorCode &status) { + return MeasureUnit::create(13, 29, status); +} + +MeasureUnit MeasureUnit::getSun() { + return MeasureUnit(13, 29); } MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { - return MeasureUnit::create(13, 21, status); + return MeasureUnit::create(13, 30, status); } MeasureUnit MeasureUnit::getYard() { - return MeasureUnit(13, 21); + return MeasureUnit(13, 30); } MeasureUnit *MeasureUnit::createCandela(UErrorCode &status) { @@ -1496,628 +1784,764 @@ MeasureUnit MeasureUnit::getSolarLuminosity() { return MeasureUnit(14, 3); } -MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { +MeasureUnit *MeasureUnit::createTesla(UErrorCode &status) { return MeasureUnit::create(15, 0, status); } -MeasureUnit MeasureUnit::getCarat() { +MeasureUnit MeasureUnit::getTesla() { return MeasureUnit(15, 0); } -MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) { +MeasureUnit *MeasureUnit::createWeber(UErrorCode &status) { return MeasureUnit::create(15, 1, status); } -MeasureUnit MeasureUnit::getDalton() { +MeasureUnit MeasureUnit::getWeber() { return MeasureUnit(15, 1); } +MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { + return MeasureUnit::create(16, 0, status); +} + +MeasureUnit MeasureUnit::getCarat() { + return MeasureUnit(16, 0); +} + +MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) { + return MeasureUnit::create(16, 1, status); +} + +MeasureUnit MeasureUnit::getDalton() { + return MeasureUnit(16, 1); +} + MeasureUnit *MeasureUnit::createEarthMass(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); } MeasureUnit MeasureUnit::getEarthMass() { - return MeasureUnit(15, 2); + return MeasureUnit(16, 2); +} + +MeasureUnit *MeasureUnit::createFun(UErrorCode &status) { + return MeasureUnit::create(16, 3, status); +} + +MeasureUnit MeasureUnit::getFun() { + return MeasureUnit(16, 3); } MeasureUnit *MeasureUnit::createGrain(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 4, status); } MeasureUnit MeasureUnit::getGrain() { - return MeasureUnit(15, 3); + return MeasureUnit(16, 4); } MeasureUnit *MeasureUnit::createGram(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 5, status); } MeasureUnit MeasureUnit::getGram() { - return MeasureUnit(15, 4); + return MeasureUnit(16, 5); } MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) { - return MeasureUnit::create(15, 5, status); + return MeasureUnit::create(16, 6, status); } MeasureUnit MeasureUnit::getKilogram() { - return MeasureUnit(15, 5); -} - -MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { - return MeasureUnit::create(15, 14, status); -} - -MeasureUnit MeasureUnit::getMetricTon() { - return MeasureUnit(15, 14); + return MeasureUnit(16, 6); } MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) { - return MeasureUnit::create(15, 6, status); + return MeasureUnit::create(16, 7, status); } MeasureUnit MeasureUnit::getMicrogram() { - return MeasureUnit(15, 6); + return MeasureUnit(16, 7); } MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) { - return MeasureUnit::create(15, 7, status); + return MeasureUnit::create(16, 8, status); } MeasureUnit MeasureUnit::getMilligram() { - return MeasureUnit(15, 7); + return MeasureUnit(16, 8); } MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) { - return MeasureUnit::create(15, 8, status); + return MeasureUnit::create(16, 9, status); } MeasureUnit MeasureUnit::getOunce() { - return MeasureUnit(15, 8); + return MeasureUnit(16, 9); } MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) { - return MeasureUnit::create(15, 9, status); + return MeasureUnit::create(16, 10, status); } MeasureUnit MeasureUnit::getOunceTroy() { - return MeasureUnit(15, 9); + return MeasureUnit(16, 10); } MeasureUnit *MeasureUnit::createPound(UErrorCode &status) { - return MeasureUnit::create(15, 10, status); + return MeasureUnit::create(16, 11, status); } MeasureUnit MeasureUnit::getPound() { - return MeasureUnit(15, 10); + return MeasureUnit(16, 11); +} + +MeasureUnit *MeasureUnit::createSlug(UErrorCode &status) { + return MeasureUnit::create(16, 12, status); +} + +MeasureUnit MeasureUnit::getSlug() { + return MeasureUnit(16, 12); } MeasureUnit *MeasureUnit::createSolarMass(UErrorCode &status) { - return MeasureUnit::create(15, 11, status); + return MeasureUnit::create(16, 13, status); } MeasureUnit MeasureUnit::getSolarMass() { - return MeasureUnit(15, 11); + return MeasureUnit(16, 13); } MeasureUnit *MeasureUnit::createStone(UErrorCode &status) { - return MeasureUnit::create(15, 12, status); + return MeasureUnit::create(16, 14, status); } MeasureUnit MeasureUnit::getStone() { - return MeasureUnit(15, 12); + return MeasureUnit(16, 14); } MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { - return MeasureUnit::create(15, 13, status); + return MeasureUnit::create(16, 15, status); } MeasureUnit MeasureUnit::getTon() { - return MeasureUnit(15, 13); + return MeasureUnit(16, 15); } MeasureUnit *MeasureUnit::createTonne(UErrorCode &status) { - return MeasureUnit::create(15, 14, status); + return MeasureUnit::create(16, 16, status); } MeasureUnit MeasureUnit::getTonne() { - return MeasureUnit(15, 14); + return MeasureUnit(16, 16); +} + +MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { + return MeasureUnit::create(16, 16, status); +} + +MeasureUnit MeasureUnit::getMetricTon() { + return MeasureUnit(16, 16); } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); } MeasureUnit MeasureUnit::getGigawatt() { - return MeasureUnit(17, 0); + return MeasureUnit(18, 0); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); } MeasureUnit MeasureUnit::getHorsepower() { - return MeasureUnit(17, 1); + return MeasureUnit(18, 1); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); } MeasureUnit MeasureUnit::getKilowatt() { - return MeasureUnit(17, 2); + return MeasureUnit(18, 2); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); } MeasureUnit MeasureUnit::getMegawatt() { - return MeasureUnit(17, 3); + return MeasureUnit(18, 3); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(17, 4, status); + return MeasureUnit::create(18, 4, status); } MeasureUnit MeasureUnit::getMilliwatt() { - return MeasureUnit(17, 4); + return MeasureUnit(18, 4); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(17, 5, status); + return MeasureUnit::create(18, 5, status); } MeasureUnit MeasureUnit::getWatt() { - return MeasureUnit(17, 5); + return MeasureUnit(18, 5); } MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); } MeasureUnit MeasureUnit::getAtmosphere() { - return MeasureUnit(18, 0); + return MeasureUnit(19, 0); } MeasureUnit *MeasureUnit::createBar(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); } MeasureUnit MeasureUnit::getBar() { - return MeasureUnit(18, 1); + return MeasureUnit(19, 1); } MeasureUnit *MeasureUnit::createGasolineEnergyDensity(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); } MeasureUnit MeasureUnit::getGasolineEnergyDensity() { - return MeasureUnit(18, 2); + return MeasureUnit(19, 2); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); } MeasureUnit MeasureUnit::getHectopascal() { - return MeasureUnit(18, 3); + return MeasureUnit(19, 3); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(18, 4, status); + return MeasureUnit::create(19, 4, status); } MeasureUnit MeasureUnit::getInchHg() { - return MeasureUnit(18, 4); + return MeasureUnit(19, 4); } MeasureUnit *MeasureUnit::createKilopascal(UErrorCode &status) { - return MeasureUnit::create(18, 5, status); + return MeasureUnit::create(19, 5, status); } MeasureUnit MeasureUnit::getKilopascal() { - return MeasureUnit(18, 5); + return MeasureUnit(19, 5); } MeasureUnit *MeasureUnit::createMegapascal(UErrorCode &status) { - return MeasureUnit::create(18, 6, status); + return MeasureUnit::create(19, 6, status); } MeasureUnit MeasureUnit::getMegapascal() { - return MeasureUnit(18, 6); + return MeasureUnit(19, 6); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(18, 7, status); + return MeasureUnit::create(19, 7, status); } MeasureUnit MeasureUnit::getMillibar() { - return MeasureUnit(18, 7); + return MeasureUnit(19, 7); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(18, 8, status); + return MeasureUnit::create(19, 8, status); } MeasureUnit MeasureUnit::getMillimeterOfMercury() { - return MeasureUnit(18, 8); + return MeasureUnit(19, 8); +} + +MeasureUnit *MeasureUnit::createOfhg(UErrorCode &status) { + return MeasureUnit::create(19, 9, status); +} + +MeasureUnit MeasureUnit::getOfhg() { + return MeasureUnit(19, 9); } MeasureUnit *MeasureUnit::createPascal(UErrorCode &status) { - return MeasureUnit::create(18, 9, status); + return MeasureUnit::create(19, 10, status); } MeasureUnit MeasureUnit::getPascal() { - return MeasureUnit(18, 9); + return MeasureUnit(19, 10); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(18, 10, status); + return MeasureUnit::create(19, 11, status); } MeasureUnit MeasureUnit::getPoundPerSquareInch() { - return MeasureUnit(18, 10); + return MeasureUnit(19, 11); } MeasureUnit *MeasureUnit::createBeaufort(UErrorCode &status) { - return MeasureUnit::create(19, 0, status); + return MeasureUnit::create(20, 0, status); } MeasureUnit MeasureUnit::getBeaufort() { - return MeasureUnit(19, 0); + return MeasureUnit(20, 0); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(19, 1, status); + return MeasureUnit::create(20, 1, status); } MeasureUnit MeasureUnit::getKilometerPerHour() { - return MeasureUnit(19, 1); + return MeasureUnit(20, 1); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(19, 2, status); + return MeasureUnit::create(20, 2, status); } MeasureUnit MeasureUnit::getKnot() { - return MeasureUnit(19, 2); + return MeasureUnit(20, 2); +} + +MeasureUnit *MeasureUnit::createLightSpeed(UErrorCode &status) { + return MeasureUnit::create(20, 3, status); +} + +MeasureUnit MeasureUnit::getLightSpeed() { + return MeasureUnit(20, 3); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(19, 3, status); + return MeasureUnit::create(20, 4, status); } MeasureUnit MeasureUnit::getMeterPerSecond() { - return MeasureUnit(19, 3); + return MeasureUnit(20, 4); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(19, 4, status); + return MeasureUnit::create(20, 5, status); } MeasureUnit MeasureUnit::getMilePerHour() { - return MeasureUnit(19, 4); + return MeasureUnit(20, 5); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(20, 0, status); + return MeasureUnit::create(21, 0, status); } MeasureUnit MeasureUnit::getCelsius() { - return MeasureUnit(20, 0); + return MeasureUnit(21, 0); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(20, 1, status); + return MeasureUnit::create(21, 1, status); } MeasureUnit MeasureUnit::getFahrenheit() { - return MeasureUnit(20, 1); + return MeasureUnit(21, 1); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(20, 2, status); + return MeasureUnit::create(21, 2, status); } MeasureUnit MeasureUnit::getGenericTemperature() { - return MeasureUnit(20, 2); + return MeasureUnit(21, 2); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(20, 3, status); + return MeasureUnit::create(21, 3, status); } MeasureUnit MeasureUnit::getKelvin() { - return MeasureUnit(20, 3); + return MeasureUnit(21, 3); +} + +MeasureUnit *MeasureUnit::createRankine(UErrorCode &status) { + return MeasureUnit::create(21, 4, status); +} + +MeasureUnit MeasureUnit::getRankine() { + return MeasureUnit(21, 4); } MeasureUnit *MeasureUnit::createNewtonMeter(UErrorCode &status) { - return MeasureUnit::create(21, 0, status); + return MeasureUnit::create(22, 0, status); } MeasureUnit MeasureUnit::getNewtonMeter() { - return MeasureUnit(21, 0); + return MeasureUnit(22, 0); } MeasureUnit *MeasureUnit::createPoundFoot(UErrorCode &status) { - return MeasureUnit::create(21, 1, status); + return MeasureUnit::create(22, 1, status); } MeasureUnit MeasureUnit::getPoundFoot() { - return MeasureUnit(21, 1); + return MeasureUnit(22, 1); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(22, 0, status); + return MeasureUnit::create(23, 0, status); } MeasureUnit MeasureUnit::getAcreFoot() { - return MeasureUnit(22, 0); + return MeasureUnit(23, 0); } MeasureUnit *MeasureUnit::createBarrel(UErrorCode &status) { - return MeasureUnit::create(22, 1, status); + return MeasureUnit::create(23, 1, status); } MeasureUnit MeasureUnit::getBarrel() { - return MeasureUnit(22, 1); + return MeasureUnit(23, 1); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(22, 2, status); + return MeasureUnit::create(23, 2, status); } MeasureUnit MeasureUnit::getBushel() { - return MeasureUnit(22, 2); + return MeasureUnit(23, 2); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(22, 3, status); + return MeasureUnit::create(23, 3, status); } MeasureUnit MeasureUnit::getCentiliter() { - return MeasureUnit(22, 3); + return MeasureUnit(23, 3); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(22, 4, status); + return MeasureUnit::create(23, 4, status); } MeasureUnit MeasureUnit::getCubicCentimeter() { - return MeasureUnit(22, 4); + return MeasureUnit(23, 4); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(22, 5, status); + return MeasureUnit::create(23, 5, status); } MeasureUnit MeasureUnit::getCubicFoot() { - return MeasureUnit(22, 5); + return MeasureUnit(23, 5); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(22, 6, status); + return MeasureUnit::create(23, 6, status); } MeasureUnit MeasureUnit::getCubicInch() { - return MeasureUnit(22, 6); + return MeasureUnit(23, 6); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(22, 7, status); + return MeasureUnit::create(23, 7, status); } MeasureUnit MeasureUnit::getCubicKilometer() { - return MeasureUnit(22, 7); + return MeasureUnit(23, 7); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(22, 8, status); + return MeasureUnit::create(23, 8, status); } MeasureUnit MeasureUnit::getCubicMeter() { - return MeasureUnit(22, 8); + return MeasureUnit(23, 8); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(22, 9, status); + return MeasureUnit::create(23, 9, status); } MeasureUnit MeasureUnit::getCubicMile() { - return MeasureUnit(22, 9); + return MeasureUnit(23, 9); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(22, 10, status); + return MeasureUnit::create(23, 10, status); } MeasureUnit MeasureUnit::getCubicYard() { - return MeasureUnit(22, 10); + return MeasureUnit(23, 10); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(22, 11, status); + return MeasureUnit::create(23, 11, status); } MeasureUnit MeasureUnit::getCup() { - return MeasureUnit(22, 11); + return MeasureUnit(23, 11); +} + +MeasureUnit *MeasureUnit::createCupImperial(UErrorCode &status) { + return MeasureUnit::create(23, 12, status); +} + +MeasureUnit MeasureUnit::getCupImperial() { + return MeasureUnit(23, 12); +} + +MeasureUnit *MeasureUnit::createCupJp(UErrorCode &status) { + return MeasureUnit::create(23, 13, status); +} + +MeasureUnit MeasureUnit::getCupJp() { + return MeasureUnit(23, 13); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(22, 12, status); + return MeasureUnit::create(23, 14, status); } MeasureUnit MeasureUnit::getCupMetric() { - return MeasureUnit(22, 12); + return MeasureUnit(23, 14); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(22, 13, status); + return MeasureUnit::create(23, 15, status); } MeasureUnit MeasureUnit::getDeciliter() { - return MeasureUnit(22, 13); + return MeasureUnit(23, 15); } MeasureUnit *MeasureUnit::createDessertSpoon(UErrorCode &status) { - return MeasureUnit::create(22, 14, status); + return MeasureUnit::create(23, 16, status); } MeasureUnit MeasureUnit::getDessertSpoon() { - return MeasureUnit(22, 14); + return MeasureUnit(23, 16); } MeasureUnit *MeasureUnit::createDessertSpoonImperial(UErrorCode &status) { - return MeasureUnit::create(22, 15, status); + return MeasureUnit::create(23, 17, status); } MeasureUnit MeasureUnit::getDessertSpoonImperial() { - return MeasureUnit(22, 15); + return MeasureUnit(23, 17); } MeasureUnit *MeasureUnit::createDram(UErrorCode &status) { - return MeasureUnit::create(22, 16, status); + return MeasureUnit::create(23, 18, status); } MeasureUnit MeasureUnit::getDram() { - return MeasureUnit(22, 16); + return MeasureUnit(23, 18); } MeasureUnit *MeasureUnit::createDrop(UErrorCode &status) { - return MeasureUnit::create(22, 17, status); + return MeasureUnit::create(23, 19, status); } MeasureUnit MeasureUnit::getDrop() { - return MeasureUnit(22, 17); + return MeasureUnit(23, 19); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(22, 18, status); + return MeasureUnit::create(23, 20, status); } MeasureUnit MeasureUnit::getFluidOunce() { - return MeasureUnit(22, 18); + return MeasureUnit(23, 20); } MeasureUnit *MeasureUnit::createFluidOunceImperial(UErrorCode &status) { - return MeasureUnit::create(22, 19, status); + return MeasureUnit::create(23, 21, status); } MeasureUnit MeasureUnit::getFluidOunceImperial() { - return MeasureUnit(22, 19); + return MeasureUnit(23, 21); +} + +MeasureUnit *MeasureUnit::createFluidOunceMetric(UErrorCode &status) { + return MeasureUnit::create(23, 22, status); +} + +MeasureUnit MeasureUnit::getFluidOunceMetric() { + return MeasureUnit(23, 22); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(22, 20, status); + return MeasureUnit::create(23, 23, status); } MeasureUnit MeasureUnit::getGallon() { - return MeasureUnit(22, 20); + return MeasureUnit(23, 23); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(22, 21, status); + return MeasureUnit::create(23, 24, status); } MeasureUnit MeasureUnit::getGallonImperial() { - return MeasureUnit(22, 21); + return MeasureUnit(23, 24); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(22, 22, status); + return MeasureUnit::create(23, 25, status); } MeasureUnit MeasureUnit::getHectoliter() { - return MeasureUnit(22, 22); + return MeasureUnit(23, 25); } MeasureUnit *MeasureUnit::createJigger(UErrorCode &status) { - return MeasureUnit::create(22, 23, status); + return MeasureUnit::create(23, 26, status); } MeasureUnit MeasureUnit::getJigger() { - return MeasureUnit(22, 23); + return MeasureUnit(23, 26); +} + +MeasureUnit *MeasureUnit::createKoku(UErrorCode &status) { + return MeasureUnit::create(23, 27, status); +} + +MeasureUnit MeasureUnit::getKoku() { + return MeasureUnit(23, 27); +} + +MeasureUnit *MeasureUnit::createKosaji(UErrorCode &status) { + return MeasureUnit::create(23, 28, status); +} + +MeasureUnit MeasureUnit::getKosaji() { + return MeasureUnit(23, 28); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(22, 24, status); + return MeasureUnit::create(23, 29, status); } MeasureUnit MeasureUnit::getLiter() { - return MeasureUnit(22, 24); + return MeasureUnit(23, 29); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(22, 25, status); + return MeasureUnit::create(23, 30, status); } MeasureUnit MeasureUnit::getMegaliter() { - return MeasureUnit(22, 25); + return MeasureUnit(23, 30); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(22, 26, status); + return MeasureUnit::create(23, 31, status); } MeasureUnit MeasureUnit::getMilliliter() { - return MeasureUnit(22, 26); + return MeasureUnit(23, 31); +} + +MeasureUnit *MeasureUnit::createOsaji(UErrorCode &status) { + return MeasureUnit::create(23, 32, status); +} + +MeasureUnit MeasureUnit::getOsaji() { + return MeasureUnit(23, 32); } MeasureUnit *MeasureUnit::createPinch(UErrorCode &status) { - return MeasureUnit::create(22, 27, status); + return MeasureUnit::create(23, 33, status); } MeasureUnit MeasureUnit::getPinch() { - return MeasureUnit(22, 27); + return MeasureUnit(23, 33); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(22, 28, status); + return MeasureUnit::create(23, 34, status); } MeasureUnit MeasureUnit::getPint() { - return MeasureUnit(22, 28); + return MeasureUnit(23, 34); +} + +MeasureUnit *MeasureUnit::createPintImperial(UErrorCode &status) { + return MeasureUnit::create(23, 35, status); +} + +MeasureUnit MeasureUnit::getPintImperial() { + return MeasureUnit(23, 35); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(22, 29, status); + return MeasureUnit::create(23, 36, status); } MeasureUnit MeasureUnit::getPintMetric() { - return MeasureUnit(22, 29); + return MeasureUnit(23, 36); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(22, 30, status); + return MeasureUnit::create(23, 37, status); } MeasureUnit MeasureUnit::getQuart() { - return MeasureUnit(22, 30); + return MeasureUnit(23, 37); } MeasureUnit *MeasureUnit::createQuartImperial(UErrorCode &status) { - return MeasureUnit::create(22, 31, status); + return MeasureUnit::create(23, 38, status); } MeasureUnit MeasureUnit::getQuartImperial() { - return MeasureUnit(22, 31); + return MeasureUnit(23, 38); +} + +MeasureUnit *MeasureUnit::createSai(UErrorCode &status) { + return MeasureUnit::create(23, 39, status); +} + +MeasureUnit MeasureUnit::getSai() { + return MeasureUnit(23, 39); +} + +MeasureUnit *MeasureUnit::createShaku(UErrorCode &status) { + return MeasureUnit::create(23, 40, status); +} + +MeasureUnit MeasureUnit::getShaku() { + return MeasureUnit(23, 40); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(22, 32, status); + return MeasureUnit::create(23, 41, status); } MeasureUnit MeasureUnit::getTablespoon() { - return MeasureUnit(22, 32); + return MeasureUnit(23, 41); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(22, 33, status); + return MeasureUnit::create(23, 42, status); } MeasureUnit MeasureUnit::getTeaspoon() { - return MeasureUnit(22, 33); + return MeasureUnit(23, 42); +} + +MeasureUnit *MeasureUnit::createToJp(UErrorCode &status) { + return MeasureUnit::create(23, 43, status); +} + +MeasureUnit MeasureUnit::getToJp() { + return MeasureUnit(23, 43); } // End generated code for measunit.cpp @@ -2160,7 +2584,7 @@ MeasureUnit::MeasureUnit(MeasureUnit &&other) noexcept MeasureUnit::MeasureUnit(MeasureUnitImpl&& impl) : fImpl(nullptr), fSubTypeId(-1), fTypeId(-1) { - if (!findBySubType(impl.identifier.toStringPiece(), this)) { + if (!findBySubType(impl.identifier.data(), this)) { fImpl = new MeasureUnitImpl(std::move(impl)); } } @@ -2169,9 +2593,7 @@ MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) { if (this == &other) { return *this; } - if (fImpl != nullptr) { - delete fImpl; - } + delete fImpl; if (other.fImpl) { ErrorCode localStatus; fImpl = new MeasureUnitImpl(other.fImpl->copy(localStatus)); @@ -2192,9 +2614,7 @@ MeasureUnit &MeasureUnit::operator=(MeasureUnit &&other) noexcept { if (this == &other) { return *this; } - if (fImpl != nullptr) { - delete fImpl; - } + delete fImpl; fImpl = other.fImpl; other.fImpl = nullptr; fTypeId = other.fTypeId; @@ -2352,10 +2772,16 @@ void MeasureUnit::initCurrency(StringPiece isoCurrency) { result = binarySearch( gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency); if (result == -1) { - fImpl = new MeasureUnitImpl(MeasureUnitImpl::forCurrencyCode(isoCurrency)); - if (fImpl) { - fSubTypeId = -1; - return; + UErrorCode status = U_ZERO_ERROR; + fImpl = new MeasureUnitImpl(MeasureUnitImpl::forCurrencyCode(isoCurrency, status)); + if (fImpl != nullptr) { + if (U_SUCCESS(status)) { + fSubTypeId = -1; + return; + } else { + delete fImpl; + fImpl = nullptr; + } } // malloc error: fall back to the undefined currency result = binarySearch( @@ -2384,7 +2810,12 @@ int32_t MeasureUnit::getOffset() const { MeasureUnitImpl MeasureUnitImpl::copy(UErrorCode &status) const { MeasureUnitImpl result; result.complexity = complexity; - result.identifier.append(identifier, status); + result.identifier = identifier; + if (result.identifier.isEmpty() != identifier.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + return result; + } + result.constantDenominator = constantDenominator; for (int32_t i = 0; i < singleUnits.length(); i++) { SingleUnitImpl *item = result.singleUnits.emplaceBack(*singleUnits[i]); if (!item) { diff --git a/deps/icu-small/source/i18n/measunit_extra.cpp b/deps/icu-small/source/i18n/measunit_extra.cpp index 295d6a8ce85545..442daa94e8a47b 100644 --- a/deps/icu-small/source/i18n/measunit_extra.cpp +++ b/deps/icu-small/source/i18n/measunit_extra.cpp @@ -15,6 +15,7 @@ #include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "double-conversion-string-to-double.h" #include "measunit_impl.h" #include "resource.h" #include "uarrsort.h" @@ -30,13 +31,15 @@ #include "unicode/ustringtrie.h" #include "uresimp.h" #include "util.h" +#include <limits.h> #include <cstdlib> - U_NAMESPACE_BEGIN namespace { +using icu::double_conversion::StringToDoubleConverter; + // TODO: Propose a new error code for this? constexpr UErrorCode kUnitIdentifierSyntaxError = U_ILLEGAL_ARGUMENT_ERROR; @@ -97,11 +100,16 @@ enum PowerPart { // "fluid-ounce-imperial". constexpr int32_t kSimpleUnitOffset = 512; +// Trie value offset for aliases, e.g. "portion" replaced by "part" +constexpr int32_t kAliasOffset = 51200; // This will give a very big space for the units ids. + const struct UnitPrefixStrings { const char* const string; UMeasurePrefix value; } gUnitPrefixStrings[] = { // SI prefixes + { "quetta", UMEASURE_PREFIX_QUETTA }, + { "ronna", UMEASURE_PREFIX_RONNA }, { "yotta", UMEASURE_PREFIX_YOTTA }, { "zetta", UMEASURE_PREFIX_ZETTA }, { "exa", UMEASURE_PREFIX_EXA }, @@ -122,6 +130,8 @@ const struct UnitPrefixStrings { { "atto", UMEASURE_PREFIX_ATTO }, { "zepto", UMEASURE_PREFIX_ZEPTO }, { "yocto", UMEASURE_PREFIX_YOCTO }, + { "ronto", UMEASURE_PREFIX_RONTO }, + { "quecto", UMEASURE_PREFIX_QUECTO }, // Binary prefixes { "yobi", UMEASURE_PREFIX_YOBI }, { "zebi", UMEASURE_PREFIX_ZEBI }, @@ -248,6 +258,58 @@ class SimpleUnitIdentifiersSink : public icu::ResourceSink { int32_t outIndex; }; +class UnitAliasesSink : public icu::ResourceSink { + public: + /** + * Constructor. + * @param unitAliases The output vector of unit alias identifiers (CharString). + * @param unitReplacements The output vector of replacements for the unit aliases (CharString). + */ + explicit UnitAliasesSink(MaybeStackVector<CharString> &unitAliases, + MaybeStackVector<CharString> &unitReplacements) + : unitAliases(unitAliases), unitReplacements(unitReplacements) {} + + /** + * Adds the unit alias key and its replacement to the unitAliases and unitReplacements vectors. + * @param key The unit alias identifier (e.g., "meter-and-liter"). + * @param value Should be a ResourceTable value containing the replacement, + * when ures_getAllChildrenWithFallback() is called correctly for this sink. + * @param noFallback Ignored. + * @param status The standard ICU error code output parameter. + */ + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &status) override { + if (U_FAILURE(status)) return; + + // Add the unit alias key to the unitAliases vector + int32_t keyLen = static_cast<int32_t>(uprv_strlen(key)); + unitAliases.emplaceBackAndCheckErrorCode(status)->append(key, keyLen, status); + if (U_FAILURE(status)) { + return; + } + + // Find the replacement for this unit alias from the alias table resource. + ResourceTable aliasTable = value.getTable(status); + if (U_FAILURE(status)) { + return; + } + + if (!aliasTable.findValue("replacement", value)) { + status = U_MISSING_RESOURCE_ERROR; + return; + } + + int32_t len; + const char16_t *uReplacement = value.getString(len, status); + unitReplacements.emplaceBackAndCheckErrorCode(status)->appendInvariantChars(uReplacement, + len, status); + } + + private: + MaybeStackVector<CharString> &unitAliases; + MaybeStackVector<CharString> &unitReplacements; +}; + /** * A ResourceSink that collects information from `unitQuantities` in the `units` * resource to provide key->value lookups from base unit to category, as well as @@ -314,6 +376,11 @@ class CategoriesSink : public icu::ResourceSink { icu::UInitOnce gUnitExtrasInitOnce {}; +// Array of unit aliases. +const char** gUnitReplacements; +const char* gUnitReplacementStrings; +int32_t gNumUnitReplacements; + // Array of simple unit IDs. // // The array memory itself is owned by this pointer, but the individual char* in @@ -348,6 +415,11 @@ UBool U_CALLCONV cleanupUnitExtras() { gSimpleUnitCategories = nullptr; uprv_free(gSimpleUnits); gSimpleUnits = nullptr; + uprv_free((void*)gUnitReplacementStrings); + gUnitReplacementStrings = nullptr; + uprv_free(gUnitReplacements); + gUnitReplacements = nullptr; + gNumUnitReplacements = 0; gUnitExtrasInitOnce.reset(); return true; } @@ -446,6 +518,45 @@ void U_CALLCONV initUnitExtras(UErrorCode& status) { simpleUnitsCount, b, kSimpleUnitOffset); ures_getAllItemsWithFallback(unitsBundle.getAlias(), "convertUnits", identifierSink, status); + // Populate gUnitReplacements and its associated data structures. + LocalUResourceBundlePointer aliasBundle(ures_open(U_ICUDATA_ALIAS, "metadata", &status)); + if (U_FAILURE(status)) { + return; + } + MaybeStackVector<CharString> unitAliases; + MaybeStackVector<CharString> unitReplacements; + + UnitAliasesSink aliasSink(unitAliases, unitReplacements); + ures_getAllChildrenWithFallback(aliasBundle.getAlias(), "alias/unit", aliasSink, status); + if (U_FAILURE(status)) { + return; + } + + for (int32_t i = 0; i < unitAliases.length(); i++) { + b.add(unitAliases[i]->data(), i + kAliasOffset, status); + if (U_FAILURE(status)) { + return; + } + } + + int32_t unitReplacementStringLength = 0; + for (int32_t i = 0; i < unitReplacements.length(); i++) { + unitReplacementStringLength += unitReplacements[i]->length() + 1; + } + gUnitReplacementStrings = (const char*)uprv_malloc(unitReplacementStringLength * sizeof(char)); + gUnitReplacements = (const char**)uprv_malloc(unitReplacements.length() * sizeof(const char**)); + if (gUnitReplacementStrings == nullptr || gUnitReplacements == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + gNumUnitReplacements = unitReplacements.length(); + char* p = const_cast<char*>(gUnitReplacementStrings); + for (int32_t i = 0; i < unitReplacements.length(); i++) { + gUnitReplacements[i] = p; + uprv_strcpy(p, unitReplacements[i]->data()); + p += unitReplacements[i]->length() + 1; + } + // Build the CharsTrie // TODO: Use SLOW or FAST here? StringPiece result = b.buildStringPiece(USTRINGTRIE_BUILD_FAST, status); @@ -463,37 +574,58 @@ void U_CALLCONV initUnitExtras(UErrorCode& status) { class Token { public: - Token(int32_t match) : fMatch(match) {} - - enum Type { - TYPE_UNDEFINED, - TYPE_PREFIX, - // Token type for "-per-", "-", and "-and-". - TYPE_COMPOUND_PART, - // Token type for "per-". - TYPE_INITIAL_COMPOUND_PART, - TYPE_POWER_PART, - TYPE_SIMPLE_UNIT, - }; - - // Calling getType() is invalid, resulting in an assertion failure, if Token - // value isn't positive. - Type getType() const { - U_ASSERT(fMatch > 0); - if (fMatch < kCompoundPartOffset) { - return TYPE_PREFIX; - } - if (fMatch < kInitialCompoundPartOffset) { - return TYPE_COMPOUND_PART; - } - if (fMatch < kPowerPartOffset) { - return TYPE_INITIAL_COMPOUND_PART; - } - if (fMatch < kSimpleUnitOffset) { - return TYPE_POWER_PART; - } - return TYPE_SIMPLE_UNIT; - } + Token(int64_t match) : fMatch(match) { + if (fMatch < kCompoundPartOffset) { + this->fType = TYPE_PREFIX; + } else if (fMatch < kInitialCompoundPartOffset) { + this->fType = TYPE_COMPOUND_PART; + } else if (fMatch < kPowerPartOffset) { + this->fType = TYPE_INITIAL_COMPOUND_PART; + } else if (fMatch < kSimpleUnitOffset) { + this->fType = TYPE_POWER_PART; + } else if (fMatch < kAliasOffset) { + this->fType = TYPE_SIMPLE_UNIT; + } else { + this->fType = TYPE_ALIAS; + } + } + + static Token constantToken(StringPiece str, UErrorCode &status) { + Token result; + auto value = Token::parseStringToLong(str, status); + if (U_FAILURE(status)) { + return result; + } + result.fMatch = value; + result.fType = TYPE_CONSTANT_DENOMINATOR; + return result; + } + + enum Type { + TYPE_UNDEFINED, + TYPE_PREFIX, + // Token type for "-per-", "-", and "-and-". + TYPE_COMPOUND_PART, + // Token type for "per-". + TYPE_INITIAL_COMPOUND_PART, + TYPE_POWER_PART, + TYPE_SIMPLE_UNIT, + TYPE_CONSTANT_DENOMINATOR, + TYPE_ALIAS, + }; + + // Calling getType() is invalid, resulting in an assertion failure, if Token + // value isn't positive. + Type getType() const { + U_ASSERT(fMatch >= 0); + return this->fType; + } + + // Retrieve the value of the constant denominator if the token is of type TYPE_CONSTANT_DENOMINATOR. + uint64_t getConstantDenominator() const { + U_ASSERT(getType() == TYPE_CONSTANT_DENOMINATOR); + return static_cast<uint64_t>(fMatch); + } UMeasurePrefix getUnitPrefix() const { U_ASSERT(getType() == TYPE_PREFIX); @@ -526,8 +658,46 @@ class Token { return fMatch - kSimpleUnitOffset; } + int32_t getAliasIndex() const { + U_ASSERT(getType() == TYPE_ALIAS); + return static_cast<int32_t>(fMatch - kAliasOffset); + } + + // TODO: Consider moving this to a separate utility class. + // Utility function to parse a string into an unsigned long value. + // The value must be a positive integer within the range [1, INT64_MAX]. + // The input can be in integer or scientific notation. + static uint64_t parseStringToLong(const StringPiece strNum, UErrorCode &status) { + // We are processing well-formed input, so we don't need any special options to + // StringToDoubleConverter. + StringToDoubleConverter converter(0, 0, 0, "", ""); + int32_t count; + double double_result = converter.StringToDouble(strNum.data(), strNum.length(), &count); + if (count != strNum.length()) { + status = kUnitIdentifierSyntaxError; + return 0; + } + + if (U_FAILURE(status) || double_result < 1.0 || double_result > static_cast<double>(INT64_MAX)) { + status = kUnitIdentifierSyntaxError; + return 0; + } + + // Check if the value is integer. + uint64_t int_result = static_cast<uint64_t>(double_result); + const double kTolerance = 1e-9; + if (abs(double_result - int_result) > kTolerance) { + status = kUnitIdentifierSyntaxError; + return 0; + } + + return int_result; + } + private: - int32_t fMatch; + Token() = default; + int64_t fMatch; + Type fType = TYPE_UNDEFINED; }; class Parser { @@ -542,15 +712,59 @@ class Parser { */ static Parser from(StringPiece source, UErrorCode& status) { if (U_FAILURE(status)) { - return Parser(); + return {}; } umtx_initOnce(gUnitExtrasInitOnce, &initUnitExtras, status); if (U_FAILURE(status)) { - return Parser(); + return {}; } - return Parser(source); + return {source}; } + /** + * A single unit or a constant denominator. + */ + struct SingleUnitOrConstant { + enum ValueType { + kSingleUnit, + kConstantDenominator, + }; + + ValueType type = kSingleUnit; + SingleUnitImpl singleUnit; + uint64_t constantDenominator; + + static SingleUnitOrConstant singleUnitValue(SingleUnitImpl singleUnit) { + SingleUnitOrConstant result; + result.type = kSingleUnit; + result.singleUnit = singleUnit; + result.constantDenominator = 0; + return result; + } + + static SingleUnitOrConstant constantDenominatorValue(uint64_t constant) { + SingleUnitOrConstant result; + result.type = kConstantDenominator; + result.singleUnit = {}; + result.constantDenominator = constant; + return result; + } + + uint64_t getConstantDenominator() const { + U_ASSERT(type == kConstantDenominator); + return constantDenominator; + } + + SingleUnitImpl getSingleUnit() const { + U_ASSERT(type == kSingleUnit); + return singleUnit; + } + + bool isSingleUnit() const { return type == kSingleUnit; } + + bool isConstantDenominator() const { return type == kConstantDenominator; } + }; + MeasureUnitImpl parse(UErrorCode& status) { MeasureUnitImpl result; @@ -565,12 +779,23 @@ class Parser { while (hasNext()) { bool sawAnd = false; - SingleUnitImpl singleUnit = nextSingleUnit(sawAnd, status); + auto singleUnitOrConstant = nextSingleUnitOrConstant(sawAnd, status); if (U_FAILURE(status)) { return result; } - bool added = result.appendSingleUnit(singleUnit, status); + if (singleUnitOrConstant.isConstantDenominator()) { + if (result.constantDenominator > 0) { + status = kUnitIdentifierSyntaxError; + return result; + } + result.constantDenominator = singleUnitOrConstant.getConstantDenominator(); + result.complexity = UMEASURE_UNIT_COMPOUND; + continue; + } + + U_ASSERT(singleUnitOrConstant.isSingleUnit()); + bool added = result.appendSingleUnit(singleUnitOrConstant.getSingleUnit(), status); if (U_FAILURE(status)) { return result; } @@ -600,6 +825,12 @@ class Parser { } } + if (result.singleUnits.length() == 0) { + // The identifier was empty or only had a constant denominator. + status = kUnitIdentifierSyntaxError; + return result; // add it for code consistency. + } + return result; } @@ -613,11 +844,18 @@ class Parser { StringPiece fSource; BytesTrie fTrie; + // Storage for modified source string when aliases are expanded + CharString fModifiedSource; + // Set to true when we've seen a "-per-" or a "per-", after which all units // are in the denominator. Until we find an "-and-", at which point the // identifier is invalid pending TODO(CLDR-13701). bool fAfterPer = false; + // Set to true when we've just seen a "per-". This is used to determine if + // the next token can be a constant denominator token. + bool fJustSawPer = false; + Parser() : fSource(""), fTrie(u"") {} Parser(StringPiece source) @@ -636,6 +874,10 @@ class Parser { // Saves the position in the fSource string for the end of the most // recent matching token. int32_t previ = -1; + + // Saves the position in the fSource string for later use in case of unit constant found. + int32_t currentFIndex = fIndex; + // Find the longest token that matches a value in the trie: while (fIndex < fSource.length()) { auto result = fTrie.next(fSource.data()[fIndex++]); @@ -654,12 +896,25 @@ class Parser { // continue; } - if (match < 0) { - status = kUnitIdentifierSyntaxError; - } else { + if (match >= 0) { fIndex = previ; + return {match}; + } + + // If no match was found, we check if the token is a constant denominator. + // 1. We find the index of the start of the next token or the end of the string. + int32_t endOfConstantIndex = fSource.find("-", currentFIndex); + endOfConstantIndex = (endOfConstantIndex == -1) ? fSource.length() : endOfConstantIndex; + if (endOfConstantIndex <= currentFIndex) { + status = kUnitIdentifierSyntaxError; + return {match}; } - return Token(match); + + // 2. We extract the substring from the start of the constant to the end of the constant. + StringPiece constantDenominatorStr = + fSource.substr(currentFIndex, endOfConstantIndex - currentFIndex); + fIndex = endOfConstantIndex; + return Token::constantToken(constantDenominatorStr, status); } /** @@ -676,10 +931,10 @@ class Parser { * unit", sawAnd is set to true. If not, it is left as is. * @param status ICU error code. */ - SingleUnitImpl nextSingleUnit(bool &sawAnd, UErrorCode &status) { - SingleUnitImpl result; + SingleUnitOrConstant nextSingleUnitOrConstant(bool &sawAnd, UErrorCode &status) { + SingleUnitImpl singleUnitResult; if (U_FAILURE(status)) { - return result; + return {}; } // state: @@ -691,19 +946,35 @@ class Parser { bool atStart = fIndex == 0; Token token = nextToken(status); if (U_FAILURE(status)) { - return result; + return {}; } + // Handles the case where the alias replacement begins with "per-". + // For example: + // if the alias is "permeter" and the replacement is "per-meter". + // NOTE: This case does not currently exist in CLDR, but this code anticipates possible future + // additions. + if (token.getType() == Token::TYPE_ALIAS) { + processAlias(token, status); + token = nextToken(status); + if (U_FAILURE(status)) { + return {}; + } + } + + fJustSawPer = false; + if (atStart) { // Identifiers optionally start with "per-". if (token.getType() == Token::TYPE_INITIAL_COMPOUND_PART) { U_ASSERT(token.getInitialCompoundPart() == INITIAL_COMPOUND_PART_PER); fAfterPer = true; - result.dimensionality = -1; + fJustSawPer = true; + singleUnitResult.dimensionality = -1; token = nextToken(status); if (U_FAILURE(status)) { - return result; + return {}; } } } else { @@ -711,7 +982,7 @@ class Parser { // via a compound part: if (token.getType() != Token::TYPE_COMPOUND_PART) { status = kUnitIdentifierSyntaxError; - return result; + return {}; } switch (token.getMatch()) { @@ -720,15 +991,16 @@ class Parser { // Mixed compound units not yet supported, // TODO(CLDR-13701). status = kUnitIdentifierSyntaxError; - return result; + return {}; } fAfterPer = true; - result.dimensionality = -1; + fJustSawPer = true; + singleUnitResult.dimensionality = -1; break; case COMPOUND_PART_TIMES: if (fAfterPer) { - result.dimensionality = -1; + singleUnitResult.dimensionality = -1; } break; @@ -737,7 +1009,7 @@ class Parser { // Can't start with "-and-", and mixed compound units // not yet supported, TODO(CLDR-13701). status = kUnitIdentifierSyntaxError; - return result; + return {}; } sawAnd = true; break; @@ -745,60 +1017,117 @@ class Parser { token = nextToken(status); if (U_FAILURE(status)) { - return result; + return {}; } } + if (token.getType() == Token::TYPE_CONSTANT_DENOMINATOR) { + if (!fJustSawPer) { + status = kUnitIdentifierSyntaxError; + return {}; + } + + return SingleUnitOrConstant::constantDenominatorValue(token.getConstantDenominator()); + } + // Read tokens until we have a complete SingleUnit or we reach the end. while (true) { switch (token.getType()) { - case Token::TYPE_POWER_PART: - if (state > 0) { - status = kUnitIdentifierSyntaxError; - return result; - } - result.dimensionality *= token.getPower(); - state = 1; - break; - - case Token::TYPE_PREFIX: - if (state > 1) { - status = kUnitIdentifierSyntaxError; - return result; - } - result.unitPrefix = token.getUnitPrefix(); - state = 2; - break; - - case Token::TYPE_SIMPLE_UNIT: - result.index = token.getSimpleUnitIndex(); - return result; + case Token::TYPE_POWER_PART: + if (state > 0) { + status = kUnitIdentifierSyntaxError; + return {}; + } + singleUnitResult.dimensionality *= token.getPower(); + state = 1; + break; - default: + case Token::TYPE_PREFIX: + if (state > 1) { status = kUnitIdentifierSyntaxError; - return result; + return {}; + } + singleUnitResult.unitPrefix = token.getUnitPrefix(); + state = 2; + break; + + case Token::TYPE_SIMPLE_UNIT: + singleUnitResult.index = token.getSimpleUnitIndex(); + break; + + case Token::TYPE_ALIAS: + processAlias(token, status); + break; + + default: + status = kUnitIdentifierSyntaxError; + return {}; + } + + if (token.getType() == Token::TYPE_SIMPLE_UNIT) { + break; } if (!hasNext()) { // We ran out of tokens before finding a complete single unit. status = kUnitIdentifierSyntaxError; - return result; + return {}; } token = nextToken(status); if (U_FAILURE(status)) { - return result; + return {}; } } - return result; + return SingleUnitOrConstant::singleUnitValue(singleUnitResult); + } + + private: + /** + * Helper function to process alias replacement. + * + * @param token The token of TYPE_ALIAS to process + * @param status ICU error code + */ + void processAlias(const Token &token, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + + auto aliasIndex = token.getAliasIndex(); + if (aliasIndex < 0 || aliasIndex >= gNumUnitReplacements) { + status = kUnitIdentifierSyntaxError; + return; + } + const char* replacement = gUnitReplacements[aliasIndex]; + + // Create new source string: replacement + remaining unparsed portion + fModifiedSource.clear(); + fModifiedSource.append(StringPiece(replacement), status); + + // Add the remaining unparsed portion of fSource which starts from fIndex + if (fIndex < fSource.length()) { + StringPiece remaining = fSource.substr(fIndex); + fModifiedSource.append(remaining.data(), remaining.length(), status); + } + + if (U_FAILURE(status)) { + return; + } + + // Update parser state with new source and reset index + fSource = StringPiece(fModifiedSource.data(), fModifiedSource.length()); + fIndex = 0; + + return; } }; // Sorting function wrapping SingleUnitImpl::compareTo for use with uprv_sortArray. int32_t U_CALLCONV compareSingleUnits(const void* /*context*/, const void* left, const void* right) { - auto realLeft = static_cast<const SingleUnitImpl* const*>(left); - auto realRight = static_cast<const SingleUnitImpl* const*>(right); + const auto* realLeft = static_cast<const SingleUnitImpl* const*>(left); + const auto* realRight = static_cast<const SingleUnitImpl* const*>(right); return (*realLeft)->compareTo(**realRight); } @@ -1116,6 +1445,51 @@ MeasureUnitImpl::extractIndividualUnitsWithIndices(UErrorCode &status) const { return result; } +int32_t countCharacter(const CharString &str, char c) { + int32_t count = 0; + for (int32_t i = 0, n = str.length(); i < n; i++) { + if (str[i] == c) { + count++; + } + } + return count; +} + +/** + * Internal function that returns a string of the constants in the correct + * format. + * + * Example: + * 1000 --> "-per-1000" + * 1000000 --> "-per-1e6" + * + * NOTE: this function is only used when the constant denominator is greater + * than 0. + */ +CharString getConstantsString(uint64_t constantDenominator, UErrorCode &status) { + U_ASSERT(constantDenominator > 0 && constantDenominator <= LLONG_MAX); + + CharString result; + result.appendNumber(constantDenominator, status); + if (U_FAILURE(status)) { + return result; + } + + if (constantDenominator <= 1000) { + return result; + } + + // Check if the constant is a power of 10. + int32_t zeros = countCharacter(result, '0'); + if (zeros == result.length() - 1 && result[0] == '1') { + result.clear(); + result.append(StringPiece("1e"), status); + result.appendNumber(zeros, status); + } + + return result; +} + /** * Normalize a MeasureUnitImpl and generate the identifier string in place. */ @@ -1124,7 +1498,7 @@ void MeasureUnitImpl::serialize(UErrorCode &status) { return; } - if (this->singleUnits.length() == 0) { + if (this->singleUnits.length() == 0 && this->constantDenominator == 0) { // Dimensionless, constructed by the default constructor. return; } @@ -1141,6 +1515,7 @@ void MeasureUnitImpl::serialize(UErrorCode &status) { CharString result; bool beforePer = true; bool firstTimeNegativeDimension = false; + bool constantDenominatorAppended = false; for (int32_t i = 0; i < this->singleUnits.length(); i++) { if (beforePer && (*this->singleUnits[i]).dimensionality < 0) { beforePer = false; @@ -1164,43 +1539,106 @@ void MeasureUnitImpl::serialize(UErrorCode &status) { } else { result.append(StringPiece("-per-"), status); } - } else { - if (result.length() != 0) { + + if (this->constantDenominator > 0) { + result.append(getConstantsString(this->constantDenominator, status), status); result.append(StringPiece("-"), status); + constantDenominatorAppended = true; } + + } else if (result.length() != 0) { + result.append(StringPiece("-"), status); } } this->singleUnits[i]->appendNeutralIdentifier(result, status); } - this->identifier = CharString(result, status); + if (!constantDenominatorAppended && this->constantDenominator > 0) { + result.append(StringPiece("-per-"), status); + result.append(getConstantsString(this->constantDenominator, status), status); + } + + if (U_FAILURE(status)) { + return; + } + this->identifier = result.toStringPiece(); + if (this->identifier.isEmpty() != result.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } } -MeasureUnit MeasureUnitImpl::build(UErrorCode& status) && { +MeasureUnit MeasureUnitImpl::build(UErrorCode &status) && { this->serialize(status); return MeasureUnit(std::move(*this)); } -MeasureUnit MeasureUnit::forIdentifier(StringPiece identifier, UErrorCode& status) { +MeasureUnit MeasureUnit::forIdentifier(StringPiece identifier, UErrorCode &status) { return Parser::from(identifier, status).parse(status).build(status); } -UMeasureUnitComplexity MeasureUnit::getComplexity(UErrorCode& status) const { +UMeasureUnitComplexity MeasureUnit::getComplexity(UErrorCode &status) const { MeasureUnitImpl temp; return MeasureUnitImpl::forMeasureUnit(*this, temp, status).complexity; } -UMeasurePrefix MeasureUnit::getPrefix(UErrorCode& status) const { +UMeasurePrefix MeasureUnit::getPrefix(UErrorCode &status) const { return SingleUnitImpl::forMeasureUnit(*this, status).unitPrefix; } -MeasureUnit MeasureUnit::withPrefix(UMeasurePrefix prefix, UErrorCode& status) const UPRV_NO_SANITIZE_UNDEFINED { +MeasureUnit MeasureUnit::withPrefix(UMeasurePrefix prefix, + UErrorCode &status) const UPRV_NO_SANITIZE_UNDEFINED { SingleUnitImpl singleUnit = SingleUnitImpl::forMeasureUnit(*this, status); singleUnit.unitPrefix = prefix; return singleUnit.build(status); } +uint64_t MeasureUnit::getConstantDenominator(UErrorCode &status) const { + // TODO(ICU-23219) + auto measureUnitImpl = MeasureUnitImpl::forMeasureUnitMaybeCopy(*this, status); + if (U_FAILURE(status)) { + return 0; + } + + auto complexity = measureUnitImpl.complexity; + + if (complexity != UMEASURE_UNIT_SINGLE && complexity != UMEASURE_UNIT_COMPOUND) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + + return measureUnitImpl.constantDenominator; +} + +MeasureUnit MeasureUnit::withConstantDenominator(uint64_t denominator, UErrorCode &status) const { + // To match the behavior of the Java API, we do not allow a constant denominator + // bigger than LONG_MAX. + if (denominator > LONG_MAX) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + auto complexity = this->getComplexity(status); + if (U_FAILURE(status)) { + return {}; + } + if (complexity != UMEASURE_UNIT_SINGLE && complexity != UMEASURE_UNIT_COMPOUND) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + MeasureUnitImpl impl = MeasureUnitImpl::forMeasureUnitMaybeCopy(*this, status); + if (U_FAILURE(status)) { + return {}; + } + + impl.constantDenominator = denominator; + impl.complexity = (impl.singleUnits.length() < 2 && denominator == 0) ? UMEASURE_UNIT_SINGLE + : UMEASURE_UNIT_COMPOUND; + return std::move(impl).build(status); +} + int32_t MeasureUnit::getDimensionality(UErrorCode& status) const { SingleUnitImpl singleUnit = SingleUnitImpl::forMeasureUnit(*this, status); if (U_FAILURE(status)) { return 0; } @@ -1218,6 +1656,11 @@ MeasureUnit MeasureUnit::withDimensionality(int32_t dimensionality, UErrorCode& MeasureUnit MeasureUnit::reciprocal(UErrorCode& status) const { MeasureUnitImpl impl = MeasureUnitImpl::forMeasureUnitMaybeCopy(*this, status); + // The reciprocal of a unit that has a constant denominator is not allowed. + if (impl.constantDenominator != 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } impl.takeReciprocal(status); return std::move(impl).build(status); } @@ -1233,9 +1676,25 @@ MeasureUnit MeasureUnit::product(const MeasureUnit& other, UErrorCode& status) c for (int32_t i = 0; i < otherImpl.singleUnits.length(); i++) { impl.appendSingleUnit(*otherImpl.singleUnits[i], status); } - if (impl.singleUnits.length() > 1) { + + uint64_t currentConstatDenominator = impl.constantDenominator; + uint64_t otherConstantDenominator = otherImpl.constantDenominator; + + // TODO: we can also multiply the constant denominators instead of returning an error. + if (currentConstatDenominator != 0 && otherConstantDenominator != 0) { + // There is only `one` constant denominator in a compound unit. + // Therefore, we Cannot multiply units that both of them have a constant denominator + status = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + // Because either one of the constant denominators is zero, we can use the maximum of them. + impl.constantDenominator = uprv_max(currentConstatDenominator, otherConstantDenominator); + + if (impl.singleUnits.length() > 1 || impl.constantDenominator > 0) { impl.complexity = UMEASURE_UNIT_COMPOUND; } + return std::move(impl).build(status); } diff --git a/deps/icu-small/source/i18n/measunit_impl.h b/deps/icu-small/source/i18n/measunit_impl.h index c60ff2fc33bdc9..36beadc1ea83ed 100644 --- a/deps/icu-small/source/i18n/measunit_impl.h +++ b/deps/icu-small/source/i18n/measunit_impl.h @@ -11,14 +11,13 @@ #include "unicode/measunit.h" #include "cmemory.h" #include "charstr.h" +#include "fixedstring.h" U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { class LongNameHandler; } -} // namespace number static const char16_t kDefaultCurrency[] = u"XXX"; static const char kDefaultCurrency8[] = "XXX"; @@ -41,12 +40,12 @@ CharString U_I18N_API getUnitQuantity(const MeasureUnitImpl &baseMeasureUnitImpl /** * A struct representing a single unit (optional SI or binary prefix, and dimensionality). */ -struct U_I18N_API SingleUnitImpl : public UMemory { +struct U_I18N_API_CLASS SingleUnitImpl : public UMemory { /** * Gets a single unit from the MeasureUnit. If there are multiple single units, sets an error * code and returns the base dimensionless unit. Parses if necessary. */ - static SingleUnitImpl forMeasureUnit(const MeasureUnit& measureUnit, UErrorCode& status); + U_I18N_API static SingleUnitImpl forMeasureUnit(const MeasureUnit& measureUnit, UErrorCode& status); /** Transform this SingleUnitImpl into a MeasureUnit, simplifying if possible. */ MeasureUnit build(UErrorCode& status) const; @@ -59,7 +58,7 @@ struct U_I18N_API SingleUnitImpl : public UMemory { * The returned pointer points at memory that exists for the duration of the * program's running. */ - const char *getSimpleUnitID() const; + U_I18N_API const char* getSimpleUnitID() const; /** * Generates and append a neutral identifier string for a single unit which means we do not include @@ -198,20 +197,11 @@ struct U_I18N_API SingleUnitImpl : public UMemory { // Forward declaration struct MeasureUnitImplWithIndex; -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<SingleUnitImpl *, 8>; -template class U_I18N_API MemoryPool<SingleUnitImpl, 8>; -template class U_I18N_API MaybeStackVector<SingleUnitImpl, 8>; -#endif - /** * Internal representation of measurement units. Capable of representing all complexities of units, * including mixed and compound units. */ -class U_I18N_API MeasureUnitImpl : public UMemory { +class U_I18N_API_CLASS MeasureUnitImpl : public UMemory { public: MeasureUnitImpl() = default; MeasureUnitImpl(MeasureUnitImpl &&other) = default; @@ -234,7 +224,7 @@ class U_I18N_API MeasureUnitImpl : public UMemory { * @return A newly parsed value object. Behaviour of this unit is * unspecified if an error is returned via status. */ - static MeasureUnitImpl forIdentifier(StringPiece identifier, UErrorCode& status); + U_I18N_API static MeasureUnitImpl forIdentifier(StringPiece identifier, UErrorCode& status); /** * Extract the MeasureUnitImpl from a MeasureUnit, or parse if it is not present. @@ -244,7 +234,7 @@ class U_I18N_API MeasureUnitImpl : public UMemory { * @param status Set if an error occurs. * @return A reference to either measureUnit.fImpl or memory. */ - static const MeasureUnitImpl& forMeasureUnit( + U_I18N_API static const MeasureUnitImpl& forMeasureUnit( const MeasureUnit& measureUnit, MeasureUnitImpl& memory, UErrorCode& status); /** @@ -260,16 +250,19 @@ class U_I18N_API MeasureUnitImpl : public UMemory { /** * Used for currency units. */ - static inline MeasureUnitImpl forCurrencyCode(StringPiece currencyCode) { + static inline MeasureUnitImpl forCurrencyCode(StringPiece currencyCode, UErrorCode& status) { MeasureUnitImpl result; - UErrorCode localStatus = U_ZERO_ERROR; - result.identifier.append(currencyCode, localStatus); - // localStatus is not expected to fail since currencyCode should be 3 chars long + if (U_SUCCESS(status)) { + result.identifier = currencyCode; + if (result.identifier.isEmpty() != currencyCode.empty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } return result; } /** Transform this MeasureUnitImpl into a MeasureUnit, simplifying if possible. */ - MeasureUnit build(UErrorCode& status) &&; + U_I18N_API MeasureUnit build(UErrorCode& status) &&; /** * Create a copy of this MeasureUnitImpl. Don't use copy constructor to make this explicit. @@ -306,7 +299,7 @@ class U_I18N_API MeasureUnitImpl : public UMemory { * @return true if a new item was added. If unit is the dimensionless unit, * it is never added: the return value will always be false. */ - bool appendSingleUnit(const SingleUnitImpl& singleUnit, UErrorCode& status); + U_I18N_API bool appendSingleUnit(const SingleUnitImpl& singleUnit, UErrorCode& status); /** * Normalizes a MeasureUnitImpl and generate the identifier string in place. @@ -328,14 +321,22 @@ class U_I18N_API MeasureUnitImpl : public UMemory { /** * The full unit identifier. Owned by the MeasureUnitImpl. Empty if not computed. */ - CharString identifier; + FixedString identifier; + + /** + * Represents the unit constant denominator. + * + * NOTE: + * if set to 0, it means that the constant is not set. + */ + uint64_t constantDenominator = 0; // For calling serialize // TODO(icu-units#147): revisit serialization friend class number::impl::LongNameHandler; }; -struct U_I18N_API MeasureUnitImplWithIndex : public UMemory { +struct MeasureUnitImplWithIndex : public UMemory { const int32_t index; MeasureUnitImpl unitImpl; // Makes a copy of unitImpl. @@ -347,29 +348,6 @@ struct U_I18N_API MeasureUnitImplWithIndex : public UMemory { } }; -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<MeasureUnitImplWithIndex *, 8>; -template class U_I18N_API MemoryPool<MeasureUnitImplWithIndex, 8>; -template class U_I18N_API MaybeStackVector<MeasureUnitImplWithIndex, 8>; - -// Export an explicit template instantiation of the LocalPointer that is used as a -// data member of MeasureUnitImpl. -// (When building DLLs for Windows this is required.) -#if defined(_MSC_VER) -// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(push) -#pragma warning(disable : 4661) -#endif -template class U_I18N_API LocalPointerBase<MeasureUnitImpl>; -template class U_I18N_API LocalPointer<MeasureUnitImpl>; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif -#endif - U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/measure.cpp b/deps/icu-small/source/i18n/measure.cpp index cdbd995034aacf..3280bcda467ee0 100644 --- a/deps/icu-small/source/i18n/measure.cpp +++ b/deps/icu-small/source/i18n/measure.cpp @@ -29,7 +29,7 @@ Measure::Measure(const Formattable& _number, MeasureUnit* adoptedUnit, UErrorCode& ec) : number(_number), unit(adoptedUnit) { if (U_SUCCESS(ec) && - (!number.isNumeric() || adoptedUnit == 0)) { + (!number.isNumeric() || adoptedUnit == nullptr)) { ec = U_ILLEGAL_ARGUMENT_ERROR; } } diff --git a/deps/icu-small/source/i18n/messageformat2.cpp b/deps/icu-small/source/i18n/messageformat2.cpp new file mode 100644 index 00000000000000..b7202ccb8ad654 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2.cpp @@ -0,0 +1,793 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model.h" +#include "unicode/messageformat2_formattable.h" +#include "unicode/messageformat2.h" +#include "unicode/normalizer2.h" +#include "unicode/unistr.h" +#include "messageformat2_allocation.h" +#include "messageformat2_checker.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" + + +U_NAMESPACE_BEGIN + +namespace message2 { + +using namespace data_model; + +// ------------------------------------------------------ +// Formatting + +// The result of formatting a literal is just itself. +static Formattable evalLiteral(const Literal& lit) { + return Formattable(lit.unquoted()); +} + +// Assumes that `var` is a message argument; returns the argument's value. +[[nodiscard]] FormattedPlaceholder MessageFormatter::evalArgument(const UnicodeString& fallback, + const VariableName& var, + MessageContext& context, + UErrorCode& errorCode) const { + if (U_SUCCESS(errorCode)) { + const Formattable* val = context.getGlobal(var, errorCode); + if (U_SUCCESS(errorCode)) { + // Note: the fallback string has to be passed in because in a declaration like: + // .local $foo = {$bar :number} + // the fallback for $bar is "$foo". + UnicodeString fallbackToUse = fallback; + if (fallbackToUse.isEmpty()) { + fallbackToUse += DOLLAR; + fallbackToUse += var; + } + return (FormattedPlaceholder(*val, fallbackToUse)); + } + } + return {}; +} + +// Helper function to re-escape any escaped-char characters +static UnicodeString reserialize(const UnicodeString& s) { + UnicodeString result(PIPE); + for (int32_t i = 0; i < s.length(); i++) { + switch(s[i]) { + case BACKSLASH: + case PIPE: + case LEFT_CURLY_BRACE: + case RIGHT_CURLY_BRACE: { + result += BACKSLASH; + break; + } + default: + break; + } + result += s[i]; + } + result += PIPE; + return result; +} + +// Returns the contents of the literal +[[nodiscard]] FormattedPlaceholder MessageFormatter::formatLiteral(const UnicodeString& fallback, + const Literal& lit) const { + // The fallback for a literal is itself, unless another fallback is passed in + // (same reasoning as evalArgument()) + UnicodeString fallbackToUse = fallback.isEmpty() ? reserialize(lit.unquoted()) : fallback; + return FormattedPlaceholder(evalLiteral(lit), fallbackToUse); +} + +[[nodiscard]] InternalValue* MessageFormatter::formatOperand(const UnicodeString& fallback, + const Environment& env, + const Operand& rand, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + if (rand.isNull()) { + return create<InternalValue>(InternalValue(FormattedPlaceholder()), status); + } + if (rand.isVariable()) { + // Check if it's local or global + // Note: there is no name shadowing; this is enforced by the parser + const VariableName& var = rand.asVariable(); + // TODO: Currently, this code implements lazy evaluation of locals. + // That is, the environment binds names to a closure, not a resolved value. + // Eager vs. lazy evaluation is an open issue: + // see https://github.com/unicode-org/message-format-wg/issues/299 + + // NFC-normalize the variable name. See + // https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md#names-and-identifiers + const VariableName normalized = StandardFunctions::normalizeNFC(var); + + // Look up the variable in the environment + if (env.has(normalized)) { + // `var` is a local -- look it up + const Closure& rhs = env.lookup(normalized); + // Format the expression using the environment from the closure + // The name of this local variable is the fallback for its RHS. + UnicodeString newFallback(DOLLAR); + newFallback += var; + return formatExpression(newFallback, rhs.getEnv(), rhs.getExpr(), context, status); + } + // Variable wasn't found in locals -- check if it's global + FormattedPlaceholder result = evalArgument(fallback, normalized, context, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + // Unbound variable -- set a resolution error + context.getErrors().setUnresolvedVariable(var, status); + // Use fallback per + // https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution + UnicodeString str(DOLLAR); + str += var; + return create<InternalValue>(InternalValue(FormattedPlaceholder(str)), status); + } + return create<InternalValue>(InternalValue(std::move(result)), status); + } else { + U_ASSERT(rand.isLiteral()); + return create<InternalValue>(InternalValue(formatLiteral(fallback, rand.asLiteral())), status); + } +} + +// Resolves a function's options +FunctionOptions MessageFormatter::resolveOptions(const Environment& env, const OptionMap& options, MessageContext& context, UErrorCode& status) const { + LocalPointer<UVector> optionsVector(createUVector(status)); + if (U_FAILURE(status)) { + return {}; + } + LocalPointer<ResolvedFunctionOption> resolvedOpt; + for (int i = 0; i < options.size(); i++) { + const Option& opt = options.getOption(i, status); + if (U_FAILURE(status)) { + return {}; + } + const UnicodeString& k = opt.getName(); + const Operand& v = opt.getValue(); + + // Options are fully evaluated before calling the function + // Format the operand + LocalPointer<InternalValue> rhsVal(formatOperand({}, env, v, context, status)); + if (U_FAILURE(status)) { + return {}; + } + // Note: this means option values are "eagerly" evaluated. + // Currently, options don't have options. This will be addressed by the + // full FormattedPlaceholder redesign. + FormattedPlaceholder optValue = rhsVal->forceFormatting(context.getErrors(), status); + resolvedOpt.adoptInstead(create<ResolvedFunctionOption> + (ResolvedFunctionOption(k, + optValue.asFormattable(), + v.isLiteral()), + status)); + if (U_FAILURE(status)) { + return {}; + } + optionsVector->adoptElement(resolvedOpt.orphan(), status); + } + return FunctionOptions(std::move(*optionsVector), status); +} + +// Overload that dispatches on argument type. Syntax doesn't provide for options in this case. +[[nodiscard]] InternalValue* MessageFormatter::evalFunctionCall(FormattedPlaceholder&& argument, + MessageContext& context, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } + + // These cases should have been checked for already + U_ASSERT(!argument.isFallback() && !argument.isNullOperand()); + + const Formattable& toFormat = argument.asFormattable(); + switch (toFormat.getType()) { + case UFMT_OBJECT: { + const FormattableObject* obj = toFormat.getObject(status); + U_ASSERT(U_SUCCESS(status)); + U_ASSERT(obj != nullptr); + const UnicodeString& type = obj->tag(); + FunctionName functionName; + if (!getDefaultFormatterNameByType(type, functionName)) { + // No formatter for this type -- follow default behavior + break; + } + return evalFunctionCall(functionName, + create<InternalValue>(std::move(argument), status), + FunctionOptions(), + context, + status); + } + default: { + // TODO: The array case isn't handled yet; not sure whether it's desirable + // to have a default list formatter + break; + } + } + // No formatter for this type, or it's a primitive type (which will be formatted later) + // -- just return the argument itself + return create<InternalValue>(std::move(argument), status); +} + +// Overload that dispatches on function name +// Adopts `arg` +[[nodiscard]] InternalValue* MessageFormatter::evalFunctionCall(const FunctionName& functionName, + InternalValue* arg_, + FunctionOptions&& options, + MessageContext& context, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + + LocalPointer<InternalValue> arg(arg_); + + // Look up the formatter or selector + LocalPointer<Formatter> formatterImpl(nullptr); + LocalPointer<Selector> selectorImpl(nullptr); + if (isFormatter(functionName)) { + formatterImpl.adoptInstead(getFormatter(functionName, status)); + U_ASSERT(U_SUCCESS(status)); + } + if (isSelector(functionName)) { + selectorImpl.adoptInstead(getSelector(context, functionName, status)); + U_ASSERT(U_SUCCESS(status)); + } + if (formatterImpl == nullptr && selectorImpl == nullptr) { + // Unknown function error + context.getErrors().setUnknownFunction(functionName, status); + + if (arg->hasNullOperand()) { + // Non-selector used as selector; an error would have been recorded earlier + UnicodeString fallback(COLON); + fallback += functionName; + return new InternalValue(FormattedPlaceholder(fallback)); + } else { + return new InternalValue(FormattedPlaceholder(arg->getFallback())); + } + } + return new InternalValue(arg.orphan(), + std::move(options), + functionName, + formatterImpl.isValid() ? formatterImpl.orphan() : nullptr, + selectorImpl.isValid() ? selectorImpl.orphan() : nullptr); +} + +// Formats an expression using `globalEnv` for the values of variables +[[nodiscard]] InternalValue* MessageFormatter::formatExpression(const UnicodeString& fallback, + const Environment& globalEnv, + const Expression& expr, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return {}; + } + + const Operand& rand = expr.getOperand(); + // Format the operand (formatOperand handles the case of a null operand) + LocalPointer<InternalValue> randVal(formatOperand(fallback, globalEnv, rand, context, status)); + + FormattedPlaceholder maybeRand = randVal->takeArgument(status); + + if (!expr.isFunctionCall() && U_SUCCESS(status)) { + // Dispatch based on type of `randVal` + if (maybeRand.isFallback()) { + return randVal.orphan(); + } + return evalFunctionCall(std::move(maybeRand), context, status); + } else if (expr.isFunctionCall()) { + status = U_ZERO_ERROR; + const Operator* rator = expr.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + const FunctionName& functionName = rator->getFunctionName(); + const OptionMap& options = rator->getOptionsInternal(); + // Resolve the options + FunctionOptions resolvedOptions = resolveOptions(globalEnv, options, context, status); + + // Call the formatter function + return evalFunctionCall(functionName, + randVal.orphan(), + std::move(resolvedOptions), + context, + status); + } else { + status = U_ZERO_ERROR; + return randVal.orphan(); + } +} + +// Formats each text and expression part of a pattern, appending the results to `result` +void MessageFormatter::formatPattern(MessageContext& context, const Environment& globalEnv, const Pattern& pat, UErrorCode &status, UnicodeString& result) const { + CHECK_ERROR(status); + + for (int32_t i = 0; i < pat.numParts(); i++) { + const PatternPart& part = pat.getPart(i); + if (part.isText()) { + result += part.asText(); + } else if (part.isMarkup()) { + // Markup is ignored + } else { + // Format the expression + LocalPointer<InternalValue> partVal( + formatExpression({}, globalEnv, part.contents(), context, status)); + FormattedPlaceholder partResult = partVal->forceFormatting(context.getErrors(), + status); + // Force full evaluation, e.g. applying default formatters to + // unformatted input (or formatting numbers as strings) + result += partResult.formatToString(locale, status); + // Handle formatting errors. `formatToString()` can't take a context and thus can't + // register an error directly + if (status == U_MF_FORMATTING_ERROR) { + status = U_ZERO_ERROR; + // TODO: The name of the formatter that failed is unavailable. + // Not ideal, but it's hard for `formatToString()` + // to pass along more detailed diagnostics + context.getErrors().setFormattingError(status); + } + } + } +} + +// ------------------------------------------------------ +// Selection + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-selectors +// `res` is a vector of ResolvedSelectors +void MessageFormatter::resolveSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UVector& res) const { + CHECK_ERROR(status); + U_ASSERT(!dataModel.hasPattern()); + + const VariableName* selectors = dataModel.getSelectorsInternal(); + // 1. Let res be a new empty list of resolved values that support selection. + // (Implicit, since `res` is an out-parameter) + // 2. For each expression exp of the message's selectors + for (int32_t i = 0; i < dataModel.numSelectors(); i++) { + // 2i. Let rv be the resolved value of exp. + LocalPointer<InternalValue> rv(formatOperand({}, env, Operand(selectors[i]), context, status)); + if (rv->canSelect()) { + // 2ii. If selection is supported for rv: + // (True if this code has been reached) + } else { + // 2iii. Else: + // Let nomatch be a resolved value for which selection always fails. + // Append nomatch as the last element of the list res. + // Emit a Selection Error. + // (Note: in this case, rv, being a fallback, serves as `nomatch`) + DynamicErrors& err = context.getErrors(); + err.setSelectorError(rv->getFunctionName(), status); + rv.adoptInstead(new InternalValue(FormattedPlaceholder(rv->getFallback()))); + if (!rv.isValid()) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } + // 2ii(a). Append rv as the last element of the list res. + // (Also fulfills 2iii) + res.adoptElement(rv.orphan(), status); + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences +// `keys` and `matches` are vectors of strings +void MessageFormatter::matchSelectorKeys(const UVector& keys, + MessageContext& context, + InternalValue* rv, // Does not adopt `rv` + UVector& keysOut, + UErrorCode& status) const { + CHECK_ERROR(status); + + if (U_FAILURE(status)) { + // Return an empty list of matches + status = U_ZERO_ERROR; + return; + } + + UErrorCode savedStatus = status; + + // Convert `keys` to an array + int32_t keysLen = keys.size(); + UnicodeString* keysArr = new UnicodeString[keysLen]; + if (keysArr == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + for (int32_t i = 0; i < keysLen; i++) { + const UnicodeString* k = static_cast<UnicodeString*>(keys[i]); + U_ASSERT(k != nullptr); + keysArr[i] = *k; + } + LocalArray<UnicodeString> adoptedKeys(keysArr); + + // Create an array to hold the output + UnicodeString* prefsArr = new UnicodeString[keysLen]; + if (prefsArr == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + LocalArray<UnicodeString> adoptedPrefs(prefsArr); + int32_t prefsLen = 0; + + // Call the selector + FunctionName name = rv->getFunctionName(); + rv->forceSelection(context.getErrors(), + adoptedKeys.getAlias(), keysLen, + adoptedPrefs.getAlias(), prefsLen, + status); + + // Update errors + if (savedStatus != status) { + if (U_FAILURE(status)) { + status = U_ZERO_ERROR; + context.getErrors().setSelectorError(name, status); + } else { + // Ignore warnings + status = savedStatus; + } + } + + CHECK_ERROR(status); + + // Copy the resulting keys (if there was no error) + keysOut.removeAllElements(); + for (int32_t i = 0; i < prefsLen; i++) { + UnicodeString* k = message2::create<UnicodeString>(std::move(prefsArr[i]), status); + if (k == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + keysOut.adoptElement(k, status); + CHECK_ERROR(status); + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences +// `res` is a vector of FormattedPlaceholders; +// `pref` is a vector of vectors of strings +void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, UVector& pref, UErrorCode &status) const { + CHECK_ERROR(status); + + // 1. Let pref be a new empty list of lists of strings. + // (Implicit, since `pref` is an out-parameter) + UnicodeString ks; + LocalPointer<UnicodeString> ksP; + int32_t numVariants = dataModel.numVariants(); + const Variant* variants = dataModel.getVariantsInternal(); + // 2. For each index i in res + for (int32_t i = 0; i < res.size(); i++) { + // 2i. Let keys be a new empty list of strings. + LocalPointer<UVector> keys(createUVector(status)); + CHECK_ERROR(status); + // 2ii. For each variant `var` of the message + for (int32_t variantNum = 0; variantNum < numVariants; variantNum++) { + const SelectorKeys& selectorKeys = variants[variantNum].getKeys(); + + // Note: Here, `var` names the key list of `var`, + // not a Variant itself + const Key* var = selectorKeys.getKeysInternal(); + // 2ii(a). Let `key` be the `var` key at position i. + U_ASSERT(i < selectorKeys.len); // established by semantic check in formatSelectors() + const Key& key = var[i]; + // 2ii(b). If `key` is not the catch-all key '*' + if (!key.isWildcard()) { + // 2ii(b)(a) Assert that key is a literal. + // (Not needed) + // 2ii(b)(b) Let `ks` be the resolved value of `key` in Unicode Normalization Form C. + ks = StandardFunctions::normalizeNFC(key.asLiteral().unquoted()); + // 2ii(b)(c) Append `ks` as the last element of the list `keys`. + ksP.adoptInstead(create<UnicodeString>(std::move(ks), status)); + CHECK_ERROR(status); + keys->adoptElement(ksP.orphan(), status); + } + } + // 2iii. Let `rv` be the resolved value at index `i` of `res`. + U_ASSERT(i < res.size()); + InternalValue* rv = static_cast<InternalValue*>(res[i]); + // 2iv. Let matches be the result of calling the method MatchSelectorKeys(rv, keys) + LocalPointer<UVector> matches(createUVector(status)); + matchSelectorKeys(*keys, context, std::move(rv), *matches, status); + // 2v. Append `matches` as the last element of the list `pref` + pref.adoptElement(matches.orphan(), status); + } +} + +// `v` is assumed to be a vector of strings +static int32_t vectorFind(const UVector& v, const UnicodeString& k) { + for (int32_t i = 0; i < v.size(); i++) { + if (*static_cast<UnicodeString*>(v[i]) == k) { + return i; + } + } + return -1; +} + +static UBool vectorContains(const UVector& v, const UnicodeString& k) { + return (vectorFind(v, k) != -1); +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#filter-variants +// `pref` is a vector of vectors of strings. `vars` is a vector of PrioritizedVariants +void MessageFormatter::filterVariants(const UVector& pref, UVector& vars, UErrorCode& status) const { + const Variant* variants = dataModel.getVariantsInternal(); + + // 1. Let `vars` be a new empty list of variants. + // (Not needed since `vars` is an out-parameter) + // 2. For each variant `var` of the message: + for (int32_t j = 0; j < dataModel.numVariants(); j++) { + const SelectorKeys& selectorKeys = variants[j].getKeys(); + const Pattern& p = variants[j].getPattern(); + + // Note: Here, `var` names the key list of `var`, + // not a Variant itself + const Key* var = selectorKeys.getKeysInternal(); + // 2i. For each index `i` in `pref`: + bool noMatch = false; + for (int32_t i = 0; i < pref.size(); i++) { + // 2i(a). Let `key` be the `var` key at position `i`. + U_ASSERT(i < selectorKeys.len); + const Key& key = var[i]; + // 2i(b). If key is the catch-all key '*': + if (key.isWildcard()) { + // 2i(b)(a). Continue the inner loop on pref. + continue; + } + // 2i(c). Assert that `key` is a literal. + // (Not needed) + // 2i(d). Let `ks` be the resolved value of `key`. + UnicodeString ks = StandardFunctions::normalizeNFC(key.asLiteral().unquoted()); + // 2i(e). Let `matches` be the list of strings at index `i` of `pref`. + const UVector& matches = *(static_cast<UVector*>(pref[i])); // `matches` is a vector of strings + // 2i(f). If `matches` includes `ks` + if (vectorContains(matches, ks)) { + // 2i(f)(a). Continue the inner loop on `pref`. + continue; + } + // 2i(g). Else: + // 2i(g)(a). Continue the outer loop on message variants. + noMatch = true; + break; + } + if (!noMatch) { + // Append `var` as the last element of the list `vars`. + PrioritizedVariant* tuple = create<PrioritizedVariant>(PrioritizedVariant(-1, selectorKeys, p), status); + CHECK_ERROR(status); + vars.adoptElement(tuple, status); + } + } +} + +// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#sort-variants +// Leaves the preferred variant as element 0 in `sortable` +// Note: this sorts in-place, so `sortable` is just `vars` +// `pref` is a vector of vectors of strings; `vars` is a vector of PrioritizedVariants +void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCode& status) const { + CHECK_ERROR(status); + +// Note: steps 1 and 2 are omitted since we use `vars` as `sortable` (we sort in-place) + // 1. Let `sortable` be a new empty list of (integer, variant) tuples. + // (Not needed since `sortable` is an out-parameter) + // 2. For each variant `var` of `vars` + // 2i. Let tuple be a new tuple (-1, var). + // 2ii. Append `tuple` as the last element of the list `sortable`. + + // 3. Let `len` be the integer count of items in `pref`. + int32_t len = pref.size(); + // 4. Let `i` be `len` - 1. + int32_t i = len - 1; + // 5. While i >= 0: + while (i >= 0) { + // 5i. Let `matches` be the list of strings at index `i` of `pref`. + U_ASSERT(pref[i] != nullptr); + const UVector& matches = *(static_cast<UVector*>(pref[i])); // `matches` is a vector of strings + // 5ii. Let `minpref` be the integer count of items in `matches`. + int32_t minpref = matches.size(); + // 5iii. For each tuple `tuple` of `sortable`: + for (int32_t j = 0; j < vars.size(); j++) { + U_ASSERT(vars[j] != nullptr); + PrioritizedVariant& tuple = *(static_cast<PrioritizedVariant*>(vars[j])); + // 5iii(a). Let matchpref be an integer with the value minpref. + int32_t matchpref = minpref; + // 5iii(b). Let `key` be the tuple variant key at position `i`. + const Key* tupleVariantKeys = tuple.keys.getKeysInternal(); + U_ASSERT(i < tuple.keys.len); // Given by earlier semantic checking + const Key& key = tupleVariantKeys[i]; + // 5iii(c) If `key` is not the catch-all key '*': + if (!key.isWildcard()) { + // 5iii(c)(a). Assert that `key` is a literal. + // (Not needed) + // 5iii(c)(b). Let `ks` be the resolved value of `key`. + UnicodeString ks = StandardFunctions::normalizeNFC(key.asLiteral().unquoted()); + // 5iii(c)(c) Let matchpref be the integer position of ks in `matches`. + matchpref = vectorFind(matches, ks); + U_ASSERT(matchpref >= 0); + } + // 5iii(d) Set the `tuple` integer value as matchpref. + tuple.priority = matchpref; + } + // 5iv. Set `sortable` to be the result of calling the method SortVariants(`sortable`) + vars.sort(comparePrioritizedVariants, status); + CHECK_ERROR(status); + // 5v. Set `i` to be `i` - 1. + i--; + } + // The caller is responsible for steps 6 and 7 + // 6. Let `var` be the `variant` element of the first element of `sortable`. + // 7. Select the pattern of `var` +} + +void MessageFormatter::formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const { + CHECK_ERROR(status); + + // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection + + // Resolve Selectors + // res is a vector of InternalValues + LocalPointer<UVector> res(createUVector(status)); + CHECK_ERROR(status); + resolveSelectors(context, env, status, *res); + + // Resolve Preferences + // pref is a vector of vectors of strings + LocalPointer<UVector> pref(createUVector(status)); + CHECK_ERROR(status); + resolvePreferences(context, *res, *pref, status); + + // Filter Variants + // vars is a vector of PrioritizedVariants + LocalPointer<UVector> vars(createUVector(status)); + CHECK_ERROR(status); + filterVariants(*pref, *vars, status); + + // Sort Variants and select the final pattern + // Note: `sortable` in the spec is just `vars` here, + // which is sorted in-place + sortVariants(*pref, *vars, status); + + CHECK_ERROR(status); + + // 6. Let `var` be the `variant` element of the first element of `sortable`. + U_ASSERT(vars->size() > 0); // This should have been checked earlier (having 0 variants would be a data model error) + const PrioritizedVariant& var = *(static_cast<PrioritizedVariant*>(vars->elementAt(0))); + // 7. Select the pattern of `var` + const Pattern& pat = var.pat; + + // Format the pattern + formatPattern(context, env, pat, status, result); +} + +// Note: this is non-const due to the function registry being non-const, which is in turn +// due to the values (`FormatterFactory` objects in the map) having mutable state. +// In other words, formatting a message can mutate the underlying `MessageFormatter` by changing +// state within the factory objects that represent custom formatters. +UnicodeString MessageFormatter::formatToString(const MessageArguments& arguments, UErrorCode &status) { + EMPTY_ON_ERROR(status); + + // Create a new context with the given arguments and the `errors` structure + MessageContext context(arguments, *errors, status); + UnicodeString result; + + if (!(errors->hasSyntaxError() || errors->hasDataModelError())) { + // Create a new environment that will store closures for all local variables + // Check for unresolved variable errors + // checkDeclarations needs a reference to the pointer to the environment + // since it uses its `env` argument as an out-parameter. So it needs to be + // temporarily not a LocalPointer... + Environment* env(Environment::create(status)); + checkDeclarations(context, env, status); + // ...and then it's adopted to avoid leaks + LocalPointer<Environment> globalEnv(env); + + if (dataModel.hasPattern()) { + formatPattern(context, *globalEnv, dataModel.getPattern(), status, result); + } else { + // Check for errors/warnings -- if so, then the result of pattern selection is the fallback value + // See https://www.unicode.org/reports/tr35/tr35-messageFormat.html#pattern-selection + const DynamicErrors& err = context.getErrors(); + if (err.hasSyntaxError() || err.hasDataModelError()) { + result += REPLACEMENT; + } else { + formatSelectors(context, *globalEnv, status, result); + } + } + } + + // Update status according to all errors seen while formatting + if (signalErrors) { + context.checkErrors(status); + } + if (U_FAILURE(status)) { + result.remove(); + } + return result; +} + +// ---------------------------------------- +// Checking for resolution errors + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const OptionMap& options, UErrorCode& status) const { + // Check the RHS of each option + for (int32_t i = 0; i < options.size(); i++) { + const Option& opt = options.getOption(i, status); + CHECK_ERROR(status); + check(context, localEnv, opt.getValue(), status); + } +} + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const Operand& rand, UErrorCode& status) const { + // Nothing to check for literals + if (rand.isLiteral() || rand.isNull()) { + return; + } + + // Check that variable is in scope + const VariableName& var = rand.asVariable(); + UnicodeString normalized = StandardFunctions::normalizeNFC(var); + + // Check local scope + if (localEnv.has(normalized)) { + return; + } + // Check global scope + context.getGlobal(normalized, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + context.getErrors().setUnresolvedVariable(var, status); + } + // Either `var` is a global, or some other error occurred. + // Nothing more to do either way + return; +} + +void MessageFormatter::check(MessageContext& context, const Environment& localEnv, const Expression& expr, UErrorCode& status) const { + // Check for unresolved variable errors + if (expr.isFunctionCall()) { + const Operator* rator = expr.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + const Operand& rand = expr.getOperand(); + check(context, localEnv, rand, status); + check(context, localEnv, rator->getOptionsInternal(), status); + } +} + +// Check for resolution errors +void MessageFormatter::checkDeclarations(MessageContext& context, Environment*& env, UErrorCode &status) const { + CHECK_ERROR(status); + + const Binding* decls = getDataModel().getLocalVariablesInternal(); + U_ASSERT(env != nullptr && (decls != nullptr || getDataModel().bindingsLen == 0)); + + for (int32_t i = 0; i < getDataModel().bindingsLen; i++) { + const Binding& decl = decls[i]; + const Expression& rhs = decl.getValue(); + check(context, *env, rhs, status); + + // Add a closure to the global environment, + // memoizing the value of localEnv up to this point + + // Add the LHS to the environment for checking the next declaration + env = Environment::create(StandardFunctions::normalizeNFC(decl.getVariable()), + Closure(rhs, *env), + env, + status); + CHECK_ERROR(status); + } +} +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_allocation.h b/deps/icu-small/source/i18n/messageformat2_allocation.h new file mode 100644 index 00000000000000..5b06d0851296a1 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_allocation.h @@ -0,0 +1,151 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_UTILS_H +#define MESSAGEFORMAT2_UTILS_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/unistr.h" +#include "uvector.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + // Helpers + + template<typename T> + static T* copyArray(const T* source, int32_t len, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + U_ASSERT(source != nullptr); + U_ASSERT(len >= 0); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = source[i]; + } + } + return dest; + } + + template<typename T> + static T* copyVectorToArray(const UVector& source, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + int32_t len = source.size(); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = *(static_cast<T*>(source.elementAt(i))); + } + } + return dest; + } + + template<typename T> + static T* moveVectorToArray(UVector& source, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + int32_t len = source.size(); + T* dest = new T[len]; + if (dest == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } else { + for (int32_t i = 0; i < len; i++) { + dest[i] = std::move(*static_cast<T*>(source.elementAt(i))); + } + source.removeAllElements(); + } + return dest; + } + + inline UVector* createUVectorNoAdopt(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer<UVector> result(new UVector(status)); + if (U_FAILURE(status)) { + return nullptr; + } + return result.orphan(); + } + + inline UVector* createUVector(UErrorCode& status) { + UVector* result = createUVectorNoAdopt(status); + if (U_FAILURE(status)) { + return nullptr; + } + result->setDeleter(uprv_deleteUObject); + return result; + } + + static UBool stringsEqual(const UElement s1, const UElement s2) { + return (*static_cast<UnicodeString*>(s1.pointer) == *static_cast<UnicodeString*>(s2.pointer)); + } + + inline UVector* createStringUVector(UErrorCode& status) { + UVector* v = createUVector(status); + if (U_FAILURE(status)) { + return nullptr; + } + v->setComparer(stringsEqual); + return v; + } + + inline UVector* createStringVectorNoAdopt(UErrorCode& status) { + UVector* v = createUVectorNoAdopt(status); + if (U_FAILURE(status)) { + return nullptr; + } + v->setComparer(stringsEqual); + return v; + } + + template<typename T> + inline T* create(T&& node, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + T* result = new T(std::move(node)); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_UTILS_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_arguments.cpp b/deps/icu-small/source/i18n/messageformat2_arguments.cpp new file mode 100644 index 00000000000000..bf402fe6d5f0a0 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_arguments.cpp @@ -0,0 +1,69 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2.h" +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model_names.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_function_registry_internal.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // ------------------------------------------------------ + // MessageArguments + + using Arguments = MessageArguments; + + const Formattable* Arguments::getArgument(const VariableName& arg, + UErrorCode& errorCode) const { + if (U_SUCCESS(errorCode)) { + U_ASSERT(argsLen == 0 || arguments.isValid()); + for (int32_t i = 0; i < argsLen; i++) { + UnicodeString normalized = StandardFunctions::normalizeNFC(argumentNames[i]); + // arg already assumed to be normalized + if (normalized == arg) { + return &arguments[i]; + } + } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return nullptr; + } + + MessageArguments::~MessageArguments() {} + + // Message arguments + // ----------------- + + MessageArguments& MessageArguments::operator=(MessageArguments&& other) noexcept { + U_ASSERT(other.arguments.isValid() || other.argsLen == 0); + argsLen = other.argsLen; + if (argsLen != 0) { + argumentNames.adoptInstead(other.argumentNames.orphan()); + arguments.adoptInstead(other.arguments.orphan()); + } + return *this; + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_checker.cpp b/deps/icu-small/source/i18n/messageformat2_checker.cpp new file mode 100644 index 00000000000000..1956d78aea61d5 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_checker.cpp @@ -0,0 +1,325 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2.h" +#include "messageformat2_allocation.h" +#include "messageformat2_checker.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + +/* +Checks data model errors +(see https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#error-handling ) + +The following are checked here: +Variant Key Mismatch +Duplicate Variant +Missing Fallback Variant (called NonexhaustivePattern here) +Missing Selector Annotation +Duplicate Declaration + - Most duplicate declaration errors are checked by the parser, + but the checker checks for declarations of input variables + that were previously implicitly declared +(Duplicate option names and duplicate declarations are checked by the parser) +*/ + +// Type environments +// ----------------- + +TypeEnvironment::TypeEnvironment(UErrorCode& status) { + CHECK_ERROR(status); + + UVector* temp; + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + annotated.adoptInstead(temp); + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + unannotated.adoptInstead(temp); + temp = createStringVectorNoAdopt(status); + CHECK_ERROR(status); + freeVars.adoptInstead(temp); +} + + static bool has(const UVector& v, const VariableName& var) { + return v.contains(const_cast<void*>(static_cast<const void*>(&var))); + } + +// Returns true if `var` was either previously used (implicit declaration), +// or is in scope by an explicit declaration +bool TypeEnvironment::known(const VariableName& var) const { + return has(*annotated, var) || has(*unannotated, var) || has(*freeVars, var); +} + +TypeEnvironment::Type TypeEnvironment::get(const VariableName& var) const { + U_ASSERT(annotated.isValid()); + if (has(*annotated, var)) { + return Annotated; + } + U_ASSERT(unannotated.isValid()); + if (has(*unannotated, var)) { + return Unannotated; + } + U_ASSERT(freeVars.isValid()); + if (has(*freeVars, var)) { + return FreeVariable; + } + // This case is a "free variable without an implicit declaration", + // i.e. one used only in a selector expression and not in a declaration RHS + return Unannotated; +} + +void TypeEnvironment::extend(const VariableName& var, TypeEnvironment::Type t, UErrorCode& status) { + if (t == Unannotated) { + U_ASSERT(unannotated.isValid()); + // See comment below + unannotated->addElement(const_cast<void*>(static_cast<const void*>(&var)), status); + return; + } + + if (t == FreeVariable) { + U_ASSERT(freeVars.isValid()); + // See comment below + freeVars->addElement(const_cast<void*>(static_cast<const void*>(&var)), status); + return; + } + + U_ASSERT(annotated.isValid()); + // This is safe because elements of `annotated` are never written + // and the lifetime of `var` is guaranteed to include the lifetime of + // `annotated` + annotated->addElement(const_cast<void*>(static_cast<const void*>(&var)), status); +} + +TypeEnvironment::~TypeEnvironment() {} + +// --------------------- + +Key Checker::normalizeNFC(const Key& k) const { + if (k.isWildcard()) { + return k; + } + return Key(Literal(k.asLiteral().isQuoted(), + StandardFunctions::normalizeNFC(k.asLiteral().unquoted()))); +} + +static bool areDefaultKeys(const Key* keys, int32_t len) { + U_ASSERT(len > 0); + for (int32_t i = 0; i < len; i++) { + if (!keys[i].isWildcard()) { + return false; + } + } + return true; +} + +void Checker::addFreeVars(TypeEnvironment& t, const Operand& rand, UErrorCode& status) { + CHECK_ERROR(status); + + if (rand.isVariable()) { + const VariableName& v = rand.asVariable(); + if (!t.known(v)) { + t.extend(v, TypeEnvironment::Type::FreeVariable, status); + } + } +} + +void Checker::addFreeVars(TypeEnvironment& t, const OptionMap& opts, UErrorCode& status) { + for (int32_t i = 0; i < opts.size(); i++) { + const Option& o = opts.getOption(i, status); + CHECK_ERROR(status); + addFreeVars(t, o.getValue(), status); + } +} + +void Checker::addFreeVars(TypeEnvironment& t, const Operator& rator, UErrorCode& status) { + CHECK_ERROR(status); + + addFreeVars(t, rator.getOptionsInternal(), status); +} + +void Checker::addFreeVars(TypeEnvironment& t, const Expression& rhs, UErrorCode& status) { + CHECK_ERROR(status); + + if (rhs.isFunctionCall()) { + const Operator* rator = rhs.getOperator(status); + U_ASSERT(U_SUCCESS(status)); + addFreeVars(t, *rator, status); + } + addFreeVars(t, rhs.getOperand(), status); +} + +void Checker::checkVariants(UErrorCode& status) { + CHECK_ERROR(status); + + U_ASSERT(!dataModel.hasPattern()); + + // Check that each variant has a key list with size + // equal to the number of selectors + const Variant* variants = dataModel.getVariantsInternal(); + + // Check that one variant includes only wildcards + bool defaultExists = false; + bool duplicatesExist = false; + + for (int32_t i = 0; i < dataModel.numVariants(); i++) { + const SelectorKeys& k = variants[i].getKeys(); + const Key* keys = k.getKeysInternal(); + int32_t len = k.len; + if (len != dataModel.numSelectors()) { + // Variant key mismatch + errors.addError(StaticErrorType::VariantKeyMismatchError, status); + return; + } + defaultExists |= areDefaultKeys(keys, len); + + // Check if this variant's keys are duplicated by any other variant's keys + if (!duplicatesExist) { + // This check takes quadratic time, but it can be optimized if checking + // this property turns out to be a bottleneck. + for (int32_t j = 0; j < i; j++) { + const SelectorKeys& k1 = variants[j].getKeys(); + const Key* keys1 = k1.getKeysInternal(); + bool allEqual = true; + // This variant was already checked, + // so we know keys1.len == len + for (int32_t kk = 0; kk < len; kk++) { + if (!(normalizeNFC(keys[kk]) == normalizeNFC(keys1[kk]))) { + allEqual = false; + break; + } + } + if (allEqual) { + duplicatesExist = true; + } + } + } + } + + if (duplicatesExist) { + errors.addError(StaticErrorType::DuplicateVariant, status); + } + if (!defaultExists) { + errors.addError(StaticErrorType::NonexhaustivePattern, status); + } +} + +void Checker::requireAnnotated(const TypeEnvironment& t, + const VariableName& selectorVar, + UErrorCode& status) { + CHECK_ERROR(status); + + if (t.get(selectorVar) == TypeEnvironment::Type::Annotated) { + return; // No error + } + // If this code is reached, an error was detected + errors.addError(StaticErrorType::MissingSelectorAnnotation, status); +} + +void Checker::checkSelectors(const TypeEnvironment& t, UErrorCode& status) { + U_ASSERT(!dataModel.hasPattern()); + + // Check each selector; if it's not annotated, emit a + // "missing selector annotation" error + const VariableName* selectors = dataModel.getSelectorsInternal(); + for (int32_t i = 0; i < dataModel.numSelectors(); i++) { + requireAnnotated(t, selectors[i], status); + } +} + +TypeEnvironment::Type typeOf(TypeEnvironment& t, const Expression& expr) { + if (expr.isFunctionCall()) { + return TypeEnvironment::Type::Annotated; + } + const Operand& rand = expr.getOperand(); + U_ASSERT(!rand.isNull()); + if (rand.isLiteral()) { + return TypeEnvironment::Type::Unannotated; + } + U_ASSERT(rand.isVariable()); + return t.get(rand.asVariable()); +} + +void Checker::checkDeclarations(TypeEnvironment& t, UErrorCode& status) { + CHECK_ERROR(status); + + // For each declaration, extend the type environment with its type + // Only a very simple type system is necessary: variables + // have the type "annotated", "unannotated", or "free". + // For "missing selector annotation" checking, free variables + // (message arguments) are treated as unannotated. + // Free variables are also used for checking duplicate declarations. + const Binding* env = dataModel.getLocalVariablesInternal(); + for (int32_t i = 0; i < dataModel.bindingsLen; i++) { + const Binding& b = env[i]; + const VariableName& lhs = b.getVariable(); + const Expression& rhs = b.getValue(); + + // First, add free variables from the RHS of b + // This must be done first so we can catch: + // .local $foo = {$foo} + // (where the RHS is the first use of $foo) + if (b.isLocal()) { + addFreeVars(t, rhs, status); + + // Next, check if the LHS equals any free variables + // whose implicit declarations are in scope + if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) { + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } else { + // Input declaration; if b has no annotation, there's nothing to check + if (!b.isLocal() && b.hasAnnotation()) { + const OptionMap& opts = b.getOptionsInternal(); + // For .input declarations, we just need to add any variables + // referenced in the options + addFreeVars(t, opts, status); + } + // Next, check if the LHS equals any free variables + // whose implicit declarations are in scope + if (t.known(lhs) && t.get(lhs) == TypeEnvironment::Type::FreeVariable) { + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } + // Next, extend the type environment with a binding from lhs to its type + t.extend(lhs, typeOf(t, rhs), status); + } +} + +void Checker::check(UErrorCode& status) { + CHECK_ERROR(status); + + TypeEnvironment typeEnv(status); + checkDeclarations(typeEnv, status); + // Pattern message + if (dataModel.hasPattern()) { + return; + } else { + // Selectors message + checkSelectors(typeEnv, status); + checkVariants(status); + } +} + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_checker.h b/deps/icu-small/source/i18n/messageformat2_checker.h new file mode 100644 index 00000000000000..122f668f4b7e9b --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_checker.h @@ -0,0 +1,109 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT_CHECKER_H +#define MESSAGEFORMAT_CHECKER_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" +#include "messageformat2_errors.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // Used for checking missing selector annotation errors + // and duplicate declaration errors (specifically for + // implicit declarations) + class TypeEnvironment : public UMemory { + public: + // MessageFormat has a simple type system; + // variables are in-scope and annotated; in-scope and unannotated; + // or free (a free variable has no explicit declaration in the scope + // of its use.) + enum Type { + Annotated, + Unannotated, + FreeVariable + }; + void extend(const VariableName&, Type, UErrorCode& status); + Type get(const VariableName&) const; + bool known(const VariableName&) const; + TypeEnvironment(UErrorCode& status); + + virtual ~TypeEnvironment(); + + private: + // Stores variables known to be annotated. + LocalPointer<UVector> annotated; // Vector of `VariableName`s + // Stores variables that are in-scope but unannotated. + LocalPointer<UVector> unannotated; // Vector of `VariableName`s + // Stores free variables that are used in the RHS of a declaration + LocalPointer<UVector> freeVars; // Vector of `VariableNames`; tracks free variables + // This can't just be "variables that don't appear in + // `annotated` or `unannotated`", as a use introduces + // an explicit declaration + }; // class TypeEnvironment + + class MessageFormatter; + + // Checks a data model for semantic errors + // (Errors are defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md ) + class Checker { + public: + void check(UErrorCode&); + Checker(const MFDataModel& d, StaticErrors& e, const MessageFormatter& mf) + : dataModel(d), errors(e), context(mf) {} + private: + + Key normalizeNFC(const Key&) const; + + void requireAnnotated(const TypeEnvironment&, const VariableName&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Operand&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Operator&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const OptionMap&, UErrorCode&); + void addFreeVars(TypeEnvironment& t, const Expression&, UErrorCode&); + void checkDeclarations(TypeEnvironment&, UErrorCode&); + void checkSelectors(const TypeEnvironment&, UErrorCode&); + void checkVariants(UErrorCode&); + void check(const OptionMap&); + void check(const Operand&); + void check(const Expression&); + void check(const Pattern&); + const MFDataModel& dataModel; + StaticErrors& errors; + + // Used for NFC normalization + const MessageFormatter& context; + }; // class Checker + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_CHECKER_H + +#endif // U_HIDE_DEPRECATED_API +// eof + diff --git a/deps/icu-small/source/i18n/messageformat2_data_model.cpp b/deps/icu-small/source/i18n/messageformat2_data_model.cpp new file mode 100644 index 00000000000000..56c92d3843aabc --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_data_model.cpp @@ -0,0 +1,928 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" +#include "messageformat2_allocation.h" +#include "messageformat2_macros.h" +#include "uvector.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + +namespace data_model { + +// Implementation + +//------------------ SelectorKeys + +const Key* SelectorKeys::getKeysInternal() const { + return keys.getAlias(); +} + +// Lexically order key lists +bool SelectorKeys::operator<(const SelectorKeys& other) const { + // Handle key lists of different sizes first -- + // this case does have to be handled (even though it would + // reflect a data model error) because of the need to produce + // partial output + if (len < other.len) { + return true; + } + if (len > other.len) { + return false; + } + + for (int32_t i = 0; i < len; i++) { + if (keys[i] < other.keys[i]) { + return true; + } + if (!(keys[i] == other.keys[i])) { + return false; + } + } + // If we've reached here, all keys must be equal + return false; +} + +SelectorKeys::Builder::Builder(UErrorCode& status) { + keys = createUVector(status); +} + +SelectorKeys::Builder& SelectorKeys::Builder::add(Key&& key, UErrorCode& status) noexcept { + U_ASSERT(keys != nullptr); + if (U_SUCCESS(status)) { + Key* k = create<Key>(std::move(key), status); + keys->adoptElement(k, status); + } + return *this; +} + +SelectorKeys SelectorKeys::Builder::build(UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + U_ASSERT(keys != nullptr); + return SelectorKeys(*keys, status); +} + +SelectorKeys::Builder::~Builder() { + if (keys != nullptr) { + delete keys; + } +} + +SelectorKeys::SelectorKeys(const UVector& ks, UErrorCode& status) : len(ks.size()) { + Key* result = copyVectorToArray<Key>(ks, status); + if (U_FAILURE(status)) { + return; + } + keys.adoptInstead(result); +} + +SelectorKeys& SelectorKeys::operator=(SelectorKeys other) noexcept { + swap(*this, other); + return *this; +} + +SelectorKeys::SelectorKeys(const SelectorKeys& other) : len(other.len) { + UErrorCode localErrorCode = U_ZERO_ERROR; + if (len != 0) { + keys.adoptInstead(copyArray(other.keys.getAlias(), len, localErrorCode)); + } + if (U_FAILURE(localErrorCode)) { + len = 0; + } +} + +SelectorKeys::~SelectorKeys() { + len = 0; +} + +//------------------ Literal + +bool Literal::operator<(const Literal& other) const { + // Ignore quoting for the purposes of ordering + return contents < other.contents; +} + +bool Literal::operator==(const Literal& other) const { + // Ignore quoting for the purposes of ordering + return contents == other.contents; +} + +UnicodeString Literal::quoted() const { + UnicodeString result(PIPE); + result += unquoted(); + result += PIPE; + return result; +} + +const UnicodeString& Literal::unquoted() const { return contents; } + +Literal& Literal::operator=(Literal other) noexcept { + swap(*this, other); + + return *this; +} + +Literal::~Literal() { + thisIsQuoted = false; +} + +//------------------ Operand + +Operand::Operand(const Operand& other) : contents(other.contents) {} + +Operand& Operand::operator=(Operand other) noexcept { + swap(*this, other); + + return *this; +} + +UBool Operand::isVariable() const { + return (contents.has_value() && std::holds_alternative<VariableName>(*contents)); +} +UBool Operand::isLiteral() const { + return (contents.has_value() && std::holds_alternative<Literal>(*contents)); +} +UBool Operand::isNull() const { return !contents.has_value(); } + +const Literal& Operand::asLiteral() const { + U_ASSERT(isLiteral()); + return *(std::get_if<Literal>(&(*contents))); +} + +const VariableName& Operand::asVariable() const { + U_ASSERT(isVariable()); + return *(std::get_if<VariableName>(&(*contents))); +} + +Operand::~Operand() {} + +//---------------- Key + +Key& Key::operator=(Key other) noexcept { + swap(*this, other); + return *this; +} + +bool Key::operator<(const Key& other) const { + // Arbitrarily treat * as greater than all concrete keys + if (isWildcard()) { + return false; + } + if (other.isWildcard()) { + return true; + } + return (asLiteral() < other.asLiteral()); +} + +bool Key::operator==(const Key& other) const { + if (isWildcard()) { + return other.isWildcard(); + } + if (other.isWildcard()) { + return false; + } + return (asLiteral() == other.asLiteral()); +} + +const Literal& Key::asLiteral() const { + U_ASSERT(!isWildcard()); + return *contents; +} + +Key::~Key() {} + +//------------------------ Operator + +OptionMap::OptionMap(const UVector& opts, UErrorCode& status) : len(opts.size()) { + Option* result = copyVectorToArray<Option>(opts, status); + if (U_FAILURE(status)) { + bogus = true; + return; + } + options.adoptInstead(result); + bogus = false; +} + +OptionMap::OptionMap(const OptionMap& other) : len(other.len) { + U_ASSERT(!other.bogus); + if (len == 0) { + bogus = false; + return; + } + UErrorCode localErrorCode = U_ZERO_ERROR; + Option* result = copyArray(other.options.getAlias(), len, localErrorCode); + if (U_FAILURE(localErrorCode)) { + bogus = true; + return; + } + bogus = false; + options.adoptInstead(result); +} + +OptionMap& OptionMap::operator=(OptionMap other) { + swap(*this, other); + return *this; +} + +const Option& OptionMap::getOption(int32_t i, UErrorCode& status) const { + if (U_FAILURE(status) || bogus) { + if (bogus) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } else { + U_ASSERT(options.isValid()); + U_ASSERT(i < len); + } + return options[i]; +} + +int32_t OptionMap::size() const { + U_ASSERT(options.isValid() || len == 0); + return len; +} + +OptionMap::~OptionMap() {} + +OptionMap OptionMap::Builder::build(UErrorCode& status) { + return OptionMap(*options, status); +} + +OptionMap::Builder::Builder(UErrorCode& status) { + options = createStringUVector(status); +} + +OptionMap::Builder::Builder(OptionMap::Builder&& other) { + checkDuplicates = other.checkDuplicates; + options = other.options; + other.options = nullptr; +} + +OptionMap::Builder& OptionMap::Builder::operator=(OptionMap::Builder other) noexcept { + swap(*this, other); + return *this; +} + +/* static */ OptionMap::Builder OptionMap::Builder::attributes(UErrorCode& status) { + Builder b(status); + // The same code is re-used for representing attributes and options. + // Duplicate attributes are allowed, while duplicate options are disallowed. + b.checkDuplicates = false; + return b; +} + +static UBool hasOptionNamed(const UVector& v, const UnicodeString& s) { + for (int32_t i = 0; i < v.size(); i++) { + const Option* opt = static_cast<Option*>(v[i]); + U_ASSERT(opt != nullptr); + if (opt->getName() == s) { + return true; + } + } + return false; +} + +OptionMap::Builder& OptionMap::Builder::add(Option&& opt, UErrorCode& status) { + THIS_ON_ERROR(status); + + // If the option name is already in the map, emit a data model error + if (checkDuplicates && hasOptionNamed(*options, opt.getName())) { + status = U_MF_DUPLICATE_OPTION_NAME_ERROR; + } else { + Option* newOption = create<Option>(std::move(opt), status); + options->adoptElement(newOption, status); + } + return *this; +} + +OptionMap::Builder::~Builder() { + if (options != nullptr) { + delete options; + } +} + +const OptionMap& Operator::getOptionsInternal() const { + return options; +} + +Option::Option(const Option& other): name(other.name), rand(other.rand) {} + +Option& Option::operator=(Option other) noexcept { + swap(*this, other); + return *this; +} + +Option::~Option() {} + +Operator::Builder::Builder(UErrorCode& status) : options(OptionMap::Builder(status)) {} + +Operator::Builder& Operator::Builder::setFunctionName(FunctionName&& func) { + functionName = std::move(func); + return *this; +} + +const FunctionName& Operator::getFunctionName() const { + return name; +} + +Operator::Builder& Operator::Builder::addOption(const UnicodeString &key, Operand&& value, UErrorCode& errorCode) noexcept { + THIS_ON_ERROR(errorCode); + + options.add(Option(key, std::move(value)), errorCode); + return *this; +} + +Operator Operator::Builder::build(UErrorCode& errorCode) { + return Operator(functionName, options.build(errorCode)); +} + +Operator::Operator(const Operator& other) noexcept + : name(other.name), options(other.options) {} + +Operator& Operator::operator=(Operator other) noexcept { + swap(*this, other); + return *this; +} + +// Function call + +Operator::Operator(const FunctionName& f, const OptionMap& opts) : name(f), options(opts) {} + +Operator::Builder::~Builder() {} + +Operator::~Operator() {} + +// ------------ Markup + +Markup::Builder::Builder(UErrorCode& status) + : options(OptionMap::Builder(status)), attributes(OptionMap::Builder::attributes(status)) {} + +Markup::Markup(UMarkupType ty, UnicodeString n, OptionMap&& o, OptionMap&& a) + : type(ty), name(n), options(std::move(o)), attributes(std::move(a)) {} + +Markup::Builder& Markup::Builder::addOption(const UnicodeString &key, + Operand&& value, + UErrorCode& errorCode) { + options.add(Option(key, std::move(value)), errorCode); + return *this; +} + +Markup::Builder& Markup::Builder::addAttribute(const UnicodeString &key, + Operand&& value, + UErrorCode& errorCode) { + attributes.add(Option(key, std::move(value)), errorCode); + return *this; +} + +Markup Markup::Builder::build(UErrorCode& errorCode) { + Markup result; + + if (U_FAILURE(errorCode)) { + return result; + } + + if (type == UMARKUP_COUNT || name.length() == 0) { + // One of `setOpen()`, `setClose()`, or `setStandalone()` + // must be called before calling build() + // setName() must be called before calling build() + errorCode = U_INVALID_STATE_ERROR; + } else { + result = Markup(type, + name, + options.build(errorCode), + attributes.build(errorCode)); + } + return result; +} + +Markup::Builder::~Builder() {} + +Markup::~Markup() {} + +// ------------ Expression + +Expression::Builder::Builder(UErrorCode& status) + : attributes(OptionMap::Builder::attributes(status)) {} + +UBool Expression::isStandaloneAnnotation() const { + return rand.isNull(); +} + +// Returns true for function calls with operands as well as +// standalone annotations. +UBool Expression::isFunctionCall() const { + return rator.has_value(); +} + +const Operator* Expression::getOperator(UErrorCode& status) const { + NULL_ON_ERROR(status); + + if (!isFunctionCall()) { + status = U_INVALID_STATE_ERROR; + return nullptr; + } + U_ASSERT(rator); + return &(*rator); +} + +// May return null operand +const Operand& Expression::getOperand() const { return rand; } + +Expression::Builder& Expression::Builder::setOperand(Operand&& rAnd) { + hasOperand = true; + rand = std::move(rAnd); + return *this; +} + +Expression::Builder& Expression::Builder::setOperator(Operator&& rAtor) { + hasOperator = true; + rator = std::move(rAtor); + return *this; +} + +Expression::Builder& Expression::Builder::addAttribute(const UnicodeString& k, + Operand&& v, + UErrorCode& status) { + attributes.add(Option(k, std::move(v)), status); + return *this; +} + +Expression Expression::Builder::build(UErrorCode& errorCode) { + Expression result; + + if (U_FAILURE(errorCode)) { + return result; + } + + if ((!hasOperand || rand.isNull()) && !hasOperator) { + errorCode = U_INVALID_STATE_ERROR; + return result; + } + + OptionMap attributeMap = attributes.build(errorCode); + if (hasOperand && hasOperator) { + result = Expression(rator, rand, std::move(attributeMap)); + } else if (hasOperand && !hasOperator) { + result = Expression(rand, std::move(attributeMap)); + } else { + // rator is valid, rand is not valid + result = Expression(rator, std::move(attributeMap)); + } + return result; +} + +Expression::Expression() : rator(std::nullopt) {} + +Expression::Expression(const Expression& other) : rator(other.rator), rand(other.rand), attributes(other.attributes) {} + +Expression& Expression::operator=(Expression other) noexcept { + swap(*this, other); + return *this; +} + +Expression::Builder::~Builder() {} + +Expression::~Expression() {} + +// ----------- PatternPart + +// PatternPart needs a copy constructor in order to make Pattern deeply copyable +// If !isRawText and the copy of the other expression fails, +// then isBogus() will be true for this PatternPart +PatternPart::PatternPart(const PatternPart& other) : piece(other.piece) {} + +const Expression& PatternPart::contents() const { + U_ASSERT(isExpression()); + return *std::get_if<Expression>(&piece); +} + +const Markup& PatternPart::asMarkup() const { + U_ASSERT(isMarkup()); + return *std::get_if<Markup>(&piece); +} + +// Precondition: isText(); +const UnicodeString& PatternPart::asText() const { + U_ASSERT(isText()); + return *std::get_if<UnicodeString>(&piece); +} + +PatternPart& PatternPart::operator=(PatternPart other) noexcept { + swap(*this, other); + return *this; +} + +PatternPart::~PatternPart() {} + +// ---------------- Pattern + +Pattern::Pattern(const UVector& ps, UErrorCode& status) : len(ps.size()) { + if (U_FAILURE(status)) { + return; + } + PatternPart* result = copyVectorToArray<PatternPart>(ps, status); + CHECK_ERROR(status); + parts.adoptInstead(result); +} + +// Copy constructor +Pattern::Pattern(const Pattern& other) : len(other.len) { + U_ASSERT(!other.bogus); + UErrorCode localErrorCode = U_ZERO_ERROR; + if (len == 0) { + parts.adoptInstead(nullptr); + } else { + parts.adoptInstead(copyArray(other.parts.getAlias(), len, localErrorCode)); + } + if (U_FAILURE(localErrorCode)) { + bogus = true; + } +} + +int32_t Pattern::numParts() const { + U_ASSERT(!bogus); + return len; +} + +const PatternPart& Pattern::getPart(int32_t i) const { + U_ASSERT(!bogus && i < numParts()); + return parts[i]; +} + +Pattern::Builder::Builder(UErrorCode& status) { + parts = createUVector(status); +} + +Pattern Pattern::Builder::build(UErrorCode& status) const noexcept { + if (U_FAILURE(status)) { + return {}; + } + U_ASSERT(parts != nullptr); + return Pattern(*parts, status); +} + +Pattern::Builder& Pattern::Builder::add(Expression&& part, UErrorCode& status) noexcept { + U_ASSERT(parts != nullptr); + if (U_SUCCESS(status)) { + PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status); + parts->adoptElement(l, status); + } + return *this; +} + +Pattern::Builder& Pattern::Builder::add(Markup&& part, UErrorCode& status) noexcept { + U_ASSERT(parts != nullptr); + if (U_SUCCESS(status)) { + PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status); + parts->adoptElement(l, status); + } + return *this; +} + +Pattern::Builder& Pattern::Builder::add(UnicodeString&& part, UErrorCode& status) noexcept { + U_ASSERT(parts != nullptr); + if (U_SUCCESS(status)) { + PatternPart* l = create<PatternPart>(PatternPart(std::move(part)), status); + parts->adoptElement(l, status); + } + return *this; +} + +Pattern& Pattern::operator=(Pattern other) noexcept { + swap(*this, other); + + return *this; +} + +Pattern::Builder::~Builder() { + if (parts != nullptr) { + delete parts; + } +} + +Pattern::~Pattern() {} + +// ---------------- Binding + +const Expression& Binding::getValue() const { + return expr; +} + +/* static */ Binding Binding::input(UnicodeString&& variableName, Expression&& rhs, UErrorCode& errorCode) { + Binding b; + if (U_SUCCESS(errorCode)) { + const Operand& rand = rhs.getOperand(); + if (!(rand.isVariable() && (rand.asVariable() == variableName))) { + errorCode = U_INVALID_STATE_ERROR; + } else { + const Operator* rator = rhs.getOperator(errorCode); + bool hasOperator = U_SUCCESS(errorCode); + // Clear error code -- the "error" from the absent operator + // is handled + errorCode = U_ZERO_ERROR; + b = Binding(variableName, std::move(rhs)); + b.local = false; + if (hasOperator) { + rator = b.getValue().getOperator(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + b.annotation = rator; + } else { + b.annotation = nullptr; + } + U_ASSERT(!hasOperator || b.annotation != nullptr); + } + } + return b; +} + +const OptionMap& Binding::getOptionsInternal() const { + U_ASSERT(annotation != nullptr); + return annotation->getOptionsInternal(); +} + +void Binding::updateAnnotation() { + UErrorCode localErrorCode = U_ZERO_ERROR; + const Operator* rator = expr.getOperator(localErrorCode); + if (U_FAILURE(localErrorCode)) { + return; + } + U_ASSERT(U_SUCCESS(localErrorCode)); + annotation = rator; +} + +Binding::Binding(const Binding& other) : var(other.var), expr(other.expr), local(other.local) { + updateAnnotation(); +} + +Binding& Binding::operator=(Binding other) noexcept { + swap(*this, other); + return *this; +} + +Binding::~Binding() {} + +// --------------- Variant + +Variant& Variant::operator=(Variant other) noexcept { + swap(*this, other); + return *this; +} + +Variant::Variant(const Variant& other) : k(other.k), p(other.p) {} + +Variant::~Variant() {} + +// ------------- Matcher + +Matcher& Matcher::operator=(Matcher other) { + swap(*this, other); + return *this; +} + +Matcher::Matcher(const Matcher& other) { + U_ASSERT(!other.bogus); + numSelectors = other.numSelectors; + numVariants = other.numVariants; + UErrorCode localErrorCode = U_ZERO_ERROR; + selectors.adoptInstead(copyArray<VariableName>(other.selectors.getAlias(), + numSelectors, + localErrorCode)); + variants.adoptInstead(copyArray<Variant>(other.variants.getAlias(), + numVariants, + localErrorCode)); + if (U_FAILURE(localErrorCode)) { + bogus = true; + } +} + +Matcher::Matcher(VariableName* ss, int32_t ns, Variant* vs, int32_t nv) + : selectors(ss), numSelectors(ns), variants(vs), numVariants(nv) {} + +Matcher::~Matcher() {} + +// --------------- MFDataModel + +const Pattern& MFDataModel::getPattern() const { + if (std::holds_alternative<Matcher>(body)) { + // Return reference to empty pattern if this is a selectors message + return empty; + } + return *(std::get_if<Pattern>(&body)); +} + +// Returns nullptr if no bindings +const Binding* MFDataModel::getLocalVariablesInternal() const { + U_ASSERT(!bogus); + U_ASSERT(bindingsLen == 0 || bindings.isValid()); + return bindings.getAlias(); +} + +const VariableName* MFDataModel::getSelectorsInternal() const { + U_ASSERT(!bogus); + U_ASSERT(!hasPattern()); + return std::get_if<Matcher>(&body)->selectors.getAlias(); +} + +const Variant* MFDataModel::getVariantsInternal() const { + U_ASSERT(!bogus); + U_ASSERT(!hasPattern()); + return std::get_if<Matcher>(&body)->variants.getAlias(); +} + +MFDataModel::Builder::Builder(UErrorCode& status) { + bindings = createUVector(status); +} + +// Invalidate pattern and create selectors/variants if necessary +void MFDataModel::Builder::buildSelectorsMessage(UErrorCode& status) { + CHECK_ERROR(status); + + if (hasPattern) { + selectors = createUVector(status); + variants = createUVector(status); + hasPattern = false; + } + hasPattern = false; + hasSelectors = true; +} + +void MFDataModel::Builder::checkDuplicate(const VariableName& var, UErrorCode& status) const { + CHECK_ERROR(status); + + // This means that handling declarations is quadratic in the number of variables, + // but the `UVector` of locals in the builder could be changed to a `Hashtable` + // if that's a problem + // Note: this also doesn't check _all_ duplicate declaration errors, + // see MessageFormatter::Checker::checkDeclarations() + for (int32_t i = 0; i < bindings->size(); i++) { + if ((static_cast<Binding*>(bindings->elementAt(i)))->getVariable() == var) { + status = U_MF_DUPLICATE_DECLARATION_ERROR; + break; + } + } +} + +MFDataModel::Builder& MFDataModel::Builder::addBinding(Binding&& b, UErrorCode& status) { + if (U_SUCCESS(status)) { + U_ASSERT(bindings != nullptr); + checkDuplicate(b.getVariable(), status); + UErrorCode savedStatus = status; + if (status == U_MF_DUPLICATE_DECLARATION_ERROR) { + // Want to add the binding anyway even if it's a duplicate + status = U_ZERO_ERROR; + } + bindings->adoptElement(create<Binding>(std::move(b), status), status); + if (U_SUCCESS(status) || savedStatus == U_MF_DUPLICATE_DECLARATION_ERROR) { + status = savedStatus; + } + } + return *this; +} + +MFDataModel::Builder& MFDataModel::Builder::addSelector(VariableName&& selector, + UErrorCode& status) { + THIS_ON_ERROR(status); + + buildSelectorsMessage(status); + U_ASSERT(selectors != nullptr); + selectors->adoptElement(create<VariableName>(std::move(selector), status), status); + + return *this; +} + +/* + `pattern` must be non-null +*/ +MFDataModel::Builder& MFDataModel::Builder::addVariant(SelectorKeys&& keys, Pattern&& pattern, UErrorCode& errorCode) noexcept { + buildSelectorsMessage(errorCode); + Variant* v = create<Variant>(Variant(std::move(keys), std::move(pattern)), errorCode); + if (U_SUCCESS(errorCode)) { + variants->adoptElement(v, errorCode); + } + return *this; +} + +MFDataModel::Builder& MFDataModel::Builder::setPattern(Pattern&& pat) { + pattern = std::move(pat); + hasPattern = true; + hasSelectors = false; + // Invalidate variants + if (variants != nullptr) { + variants->removeAllElements(); + } + return *this; +} + +MFDataModel::MFDataModel(const MFDataModel& other) : body(Pattern()) { + U_ASSERT(!other.bogus); + + UErrorCode localErrorCode = U_ZERO_ERROR; + + if (other.hasPattern()) { + body = *std::get_if<Pattern>(&other.body); + } else { + const VariableName* otherSelectors = other.getSelectorsInternal(); + const Variant* otherVariants = other.getVariantsInternal(); + int32_t numSelectors = other.numSelectors(); + int32_t numVariants = other.numVariants(); + LocalArray<VariableName> copiedSelectors(copyArray(otherSelectors, numSelectors, localErrorCode), localErrorCode); + LocalArray<Variant> copiedVariants(copyArray(otherVariants, numVariants, localErrorCode), localErrorCode); + if (U_FAILURE(localErrorCode)) { + bogus = true; + return; + } + body = Matcher(copiedSelectors.orphan(), numSelectors, copiedVariants.orphan(), numVariants); + } + + bindingsLen = other.bindingsLen; + if (bindingsLen > 0) { + bindings.adoptInstead(copyArray(other.bindings.getAlias(), bindingsLen, localErrorCode)); + } + if (U_FAILURE(localErrorCode)) { + bogus = true; + } +} + +MFDataModel::MFDataModel(const MFDataModel::Builder& builder, UErrorCode& errorCode) noexcept : body(Pattern()) { + CHECK_ERROR(errorCode); + + if (builder.hasPattern) { + body.emplace<Pattern>(builder.pattern); + } else { + U_ASSERT(builder.variants != nullptr); + U_ASSERT(builder.selectors != nullptr); + int32_t numVariants = builder.variants->size(); + int32_t numSelectors = builder.selectors->size(); + LocalArray<Variant> variants(copyVectorToArray<Variant>(*builder.variants, errorCode), errorCode); + LocalArray<VariableName> selectors(copyVectorToArray<VariableName>(*builder.selectors, + errorCode), + errorCode); + if (U_FAILURE(errorCode)) { + bogus = true; + return; + } + body.emplace<Matcher>(Matcher(selectors.orphan(), numSelectors, variants.orphan(), numVariants)); + } + + U_ASSERT(builder.bindings != nullptr); + bindingsLen = builder.bindings->size(); + if (bindingsLen > 0) { + bindings.adoptInstead(copyVectorToArray<Binding>(*builder.bindings, errorCode)); + } + if (U_FAILURE(errorCode)) { + bogus = true; + } +} + +MFDataModel::MFDataModel() : body(Pattern()) {} + +MFDataModel& MFDataModel::operator=(MFDataModel other) noexcept { + U_ASSERT(!other.bogus); + swap(*this, other); + return *this; +} + +MFDataModel MFDataModel::Builder::build(UErrorCode& errorCode) const noexcept { + if (U_FAILURE(errorCode)) { + return {}; + } + if (!hasPattern && !hasSelectors) { + errorCode = U_INVALID_STATE_ERROR; + } + return MFDataModel(*this, errorCode); +} + +MFDataModel::~MFDataModel() {} +MFDataModel::Builder::~Builder() { + if (selectors != nullptr) { + delete selectors; + } + if (variants != nullptr) { + delete variants; + } + if (bindings != nullptr) { + delete bindings; + } +} + +} // namespace data_model +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_errors.cpp b/deps/icu-small/source/i18n/messageformat2_errors.cpp new file mode 100644 index 00000000000000..c4a96544fe68b5 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_errors.cpp @@ -0,0 +1,318 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "messageformat2_allocation.h" +#include "messageformat2_errors.h" +#include "messageformat2_macros.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + + // Errors + // ----------- + + void DynamicErrors::setFormattingError(const FunctionName& formatterName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::FormattingError, formatterName), status); + } + + void DynamicErrors::setFormattingError(UErrorCode& status) { + addError(DynamicError(DynamicErrorType::FormattingError, UnicodeString("unknown formatter")), status); + } + + void DynamicErrors::setBadOption(const FunctionName& formatterName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::BadOptionError, formatterName), status); + } + + void DynamicErrors::setRecoverableBadOption(const FunctionName& formatterName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::RecoverableBadOptionError, formatterName), status); + } + + void DynamicErrors::setOperandMismatchError(const FunctionName& formatterName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::OperandMismatchError, formatterName), status); + } + + void StaticErrors::setDuplicateOptionName(UErrorCode& status) { + addError(StaticError(StaticErrorType::DuplicateOptionName), status); + } + + void StaticErrors::setMissingSelectorAnnotation(UErrorCode& status) { + addError(StaticError(StaticErrorType::MissingSelectorAnnotation), status); + } + + void DynamicErrors::setSelectorError(const FunctionName& selectorName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::SelectorError, selectorName), status); + } + + void DynamicErrors::setUnknownFunction(const FunctionName& functionName, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::UnknownFunction, functionName), status); + } + + void DynamicErrors::setUnresolvedVariable(const VariableName& v, UErrorCode& status) { + addError(DynamicError(DynamicErrorType::UnresolvedVariable, v), status); + } + + DynamicErrors::DynamicErrors(const StaticErrors& e, UErrorCode& status) : staticErrors(e) { + resolutionAndFormattingErrors.adoptInstead(createUVector(status)); + } + + StaticErrors::StaticErrors(UErrorCode& status) { + syntaxAndDataModelErrors.adoptInstead(createUVector(status)); + } + + StaticErrors::StaticErrors(StaticErrors&& other) noexcept { + U_ASSERT(other.syntaxAndDataModelErrors.isValid()); + syntaxAndDataModelErrors.adoptInstead(other.syntaxAndDataModelErrors.orphan()); + dataModelError = other.dataModelError; + missingSelectorAnnotationError = other.missingSelectorAnnotationError; + syntaxError = other.syntaxError; + } + + StaticErrors::StaticErrors(const StaticErrors& other, UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + U_ASSERT(other.syntaxAndDataModelErrors.isValid()); + syntaxAndDataModelErrors.adoptInstead(createUVector(errorCode)); + CHECK_ERROR(errorCode); + for (int32_t i = 0; i < other.syntaxAndDataModelErrors->size(); i++) { + StaticError* e = static_cast<StaticError*>(other.syntaxAndDataModelErrors->elementAt(i)); + U_ASSERT(e != nullptr); + StaticError* copy = new StaticError(*e); + if (copy == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + syntaxAndDataModelErrors->adoptElement(copy, errorCode); + } + dataModelError = other.dataModelError; + missingSelectorAnnotationError = other.missingSelectorAnnotationError; + syntaxError = other.syntaxError; + } + + int32_t DynamicErrors::count() const { + U_ASSERT(resolutionAndFormattingErrors.isValid() && staticErrors.syntaxAndDataModelErrors.isValid()); + return resolutionAndFormattingErrors->size() + staticErrors.syntaxAndDataModelErrors->size(); + } + + bool DynamicErrors::hasError() const { + return count() > 0; + } + + bool DynamicErrors::hasStaticError() const { + U_ASSERT(staticErrors.syntaxAndDataModelErrors.isValid()); + return staticErrors.syntaxAndDataModelErrors->size() > 0; + } + + const DynamicError& DynamicErrors::first() const { + U_ASSERT(resolutionAndFormattingErrors->size() > 0); + return *static_cast<DynamicError*>(resolutionAndFormattingErrors->elementAt(0)); + } + + void DynamicErrors::checkErrors(UErrorCode& status) const { + if (status != U_ZERO_ERROR) { + return; + } + + // Just handle the first error + // TODO: Eventually want to return all errors to caller + if (count() == 0) { + return; + } + staticErrors.checkErrors(status); + if (U_FAILURE(status)) { + return; + } + U_ASSERT(resolutionAndFormattingErrors->size() > 0); + switch (first().type) { + case DynamicErrorType::UnknownFunction: { + status = U_MF_UNKNOWN_FUNCTION_ERROR; + break; + } + case DynamicErrorType::UnresolvedVariable: { + status = U_MF_UNRESOLVED_VARIABLE_ERROR; + break; + } + case DynamicErrorType::FormattingError: { + status = U_MF_FORMATTING_ERROR; + break; + } + case DynamicErrorType::BadOptionError: + case DynamicErrorType::RecoverableBadOptionError: { + status = U_MF_BAD_OPTION; + break; + } + case DynamicErrorType::OperandMismatchError: { + status = U_MF_OPERAND_MISMATCH_ERROR; + break; + } + case DynamicErrorType::SelectorError: { + status = U_MF_SELECTOR_ERROR; + break; + } + } + } + + void StaticErrors::addSyntaxError(UErrorCode& status) { + addError(StaticError(StaticErrorType::SyntaxError), status); + } + + void StaticErrors::addError(StaticError&& e, UErrorCode& status) { + CHECK_ERROR(status); + + StaticErrorType type = e.type; + + void* errorP = static_cast<void*>(create<StaticError>(std::move(e), status)); + U_ASSERT(syntaxAndDataModelErrors.isValid()); + + switch (type) { + case StaticErrorType::SyntaxError: { + syntaxError = true; + break; + } + case StaticErrorType::DuplicateDeclarationError: { + dataModelError = true; + break; + } + case StaticErrorType::DuplicateOptionName: { + dataModelError = true; + break; + } + case StaticErrorType::VariantKeyMismatchError: { + dataModelError = true; + break; + } + case StaticErrorType::DuplicateVariant: { + dataModelError = true; + break; + } + case StaticErrorType::NonexhaustivePattern: { + dataModelError = true; + break; + } + case StaticErrorType::MissingSelectorAnnotation: { + missingSelectorAnnotationError = true; + dataModelError = true; + break; + } + } + syntaxAndDataModelErrors->adoptElement(errorP, status); + } + + void DynamicErrors::addError(DynamicError&& e, UErrorCode& status) { + CHECK_ERROR(status); + + DynamicErrorType type = e.type; + + void* errorP = static_cast<void*>(create<DynamicError>(std::move(e), status)); + U_ASSERT(resolutionAndFormattingErrors.isValid()); + + switch (type) { + case DynamicErrorType::UnresolvedVariable: { + unresolvedVariableError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::FormattingError: { + formattingError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::OperandMismatchError: { + formattingError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::SelectorError: { + selectorError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::UnknownFunction: { + unknownFunctionError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::BadOptionError: { + badOptionError = true; + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + case DynamicErrorType::RecoverableBadOptionError: { + resolutionAndFormattingErrors->adoptElement(errorP, status); + break; + } + } + } + + void StaticErrors::checkErrors(UErrorCode& status) const { + if (U_FAILURE(status)) { + return; + } + if (syntaxAndDataModelErrors->size() > 0) { + switch (first().type) { + case StaticErrorType::DuplicateDeclarationError: { + status = U_MF_DUPLICATE_DECLARATION_ERROR; + break; + } + case StaticErrorType::DuplicateOptionName: { + status = U_MF_DUPLICATE_OPTION_NAME_ERROR; + break; + } + case StaticErrorType::VariantKeyMismatchError: { + status = U_MF_VARIANT_KEY_MISMATCH_ERROR; + break; + } + case StaticErrorType::DuplicateVariant: { + status = U_MF_DUPLICATE_VARIANT_ERROR; + break; + } + case StaticErrorType::NonexhaustivePattern: { + status = U_MF_NONEXHAUSTIVE_PATTERN_ERROR; + break; + } + case StaticErrorType::MissingSelectorAnnotation: { + status = U_MF_MISSING_SELECTOR_ANNOTATION_ERROR; + break; + } + case StaticErrorType::SyntaxError: { + status = U_MF_SYNTAX_ERROR; + break; + } + } + } + } + + const StaticError& StaticErrors::first() const { + U_ASSERT(syntaxAndDataModelErrors.isValid() && syntaxAndDataModelErrors->size() > 0); + return *static_cast<StaticError*>(syntaxAndDataModelErrors->elementAt(0)); + } + + StaticErrors::~StaticErrors() {} + DynamicErrors::~DynamicErrors() {} + + template<typename ErrorType> + Error<ErrorType>::~Error() {} + + template<> + Error<StaticErrorType>::~Error() {} + template<> + Error<DynamicErrorType>::~Error() {} + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_errors.h b/deps/icu-small/source/i18n/messageformat2_errors.h new file mode 100644 index 00000000000000..42cea5b2b12335 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_errors.h @@ -0,0 +1,178 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_ERRORS_H +#define MESSAGEFORMAT2_ERRORS_H + +#if U_SHOW_CPLUSPLUS_API + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/unistr.h" + +#include "uvector.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // Errors + // ---------- + + class DynamicErrors; + class StaticErrors; + + // Internal class -- used as a private field in MessageFormatter + template <typename ErrorType> + class Error : public UObject { + public: + Error(ErrorType ty) : type(ty) {} + Error(ErrorType ty, const UnicodeString& s) : type(ty), contents(s) {} + virtual ~Error(); + private: + friend class DynamicErrors; + friend class StaticErrors; + + ErrorType type; + UnicodeString contents; + }; // class Error + + enum StaticErrorType { + DuplicateDeclarationError, + DuplicateOptionName, + DuplicateVariant, + MissingSelectorAnnotation, + NonexhaustivePattern, + SyntaxError, + VariantKeyMismatchError + }; + + enum DynamicErrorType { + UnresolvedVariable, + FormattingError, + BadOptionError, + /** + This is used to signal errors from :number and :integer when a + bad `select` option is passed. In this case, fallback output + is not used, so it must be distinguished from a regular bad + option error (but it maps to a bad option error in the final + error code). + See https://github.com/unicode-org/message-format-wg/blob/main/spec/functions/number.md#number-selection + "The formatting of the _resolved value_ is not affected by the `select` option.") + */ + RecoverableBadOptionError, + OperandMismatchError, + SelectorError, + UnknownFunction, + }; + + using StaticError = Error<StaticErrorType>; + using DynamicError = Error<DynamicErrorType>; + + // These explicit instantiations have to come before the + // destructor definitions + template<> + Error<StaticErrorType>::~Error(); + template<> + Error<DynamicErrorType>::~Error(); + + class StaticErrors : public UObject { + private: + friend class DynamicErrors; + + LocalPointer<UVector> syntaxAndDataModelErrors; + bool dataModelError = false; + bool missingSelectorAnnotationError = false; + bool syntaxError = false; + + public: + StaticErrors(UErrorCode&); + + void setMissingSelectorAnnotation(UErrorCode&); + void setDuplicateOptionName(UErrorCode&); + void addSyntaxError(UErrorCode&); + bool hasDataModelError() const { return dataModelError; } + bool hasSyntaxError() const { return syntaxError; } + bool hasMissingSelectorAnnotationError() const { return missingSelectorAnnotationError; } + void addError(StaticError&&, UErrorCode&); + void checkErrors(UErrorCode&) const; + + void clear(); + const StaticError& first() const; + StaticErrors(const StaticErrors&, UErrorCode&); + StaticErrors(StaticErrors&&) noexcept; + virtual ~StaticErrors(); + }; // class StaticErrors + + class DynamicErrors : public UObject { + private: + const StaticErrors& staticErrors; + LocalPointer<UVector> resolutionAndFormattingErrors; + bool formattingError = false; + bool badOptionError = false; + bool selectorError = false; + bool unknownFunctionError = false; + bool unresolvedVariableError = false; + + public: + DynamicErrors(const StaticErrors&, UErrorCode&); + + int32_t count() const; + void setSelectorError(const FunctionName&, UErrorCode&); + void setUnresolvedVariable(const VariableName&, UErrorCode&); + void setUnknownFunction(const FunctionName&, UErrorCode&); + void setFormattingError(const FunctionName&, UErrorCode&); + // Used when the name of the offending formatter is unknown + void setFormattingError(UErrorCode&); + void setBadOption(const FunctionName&, UErrorCode&); + void setRecoverableBadOption(const FunctionName&, UErrorCode&); + void setOperandMismatchError(const FunctionName&, UErrorCode&); + bool hasDataModelError() const { return staticErrors.hasDataModelError(); } + bool hasFormattingError() const { return formattingError; } + bool hasBadOptionError() const { return badOptionError; } + bool hasSelectorError() const { return selectorError; } + bool hasSyntaxError() const { return staticErrors.hasSyntaxError(); } + bool hasUnknownFunctionError() const { return unknownFunctionError; } + bool hasMissingSelectorAnnotationError() const { return staticErrors.hasMissingSelectorAnnotationError(); } + bool hasUnresolvedVariableError() const { return unresolvedVariableError; } + void addError(DynamicError&&, UErrorCode&); + void checkErrors(UErrorCode&) const; + bool hasError() const; + bool hasStaticError() const; + + const DynamicError& first() const; + virtual ~DynamicErrors(); + }; // class DynamicErrors + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_ERRORS_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_evaluation.cpp b/deps/icu-small/source/i18n/messageformat2_evaluation.cpp new file mode 100644 index 00000000000000..1a88ece4724f2e --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_evaluation.cpp @@ -0,0 +1,508 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "messageformat2_allocation.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +// Auxiliary data structures used during formatting a message + +namespace message2 { + +using namespace data_model; + +// Functions +// ------------- + +ResolvedFunctionOption::ResolvedFunctionOption(ResolvedFunctionOption&& other) { + name = std::move(other.name); + value = std::move(other.value); + sourceIsLiteral = other.sourceIsLiteral; +} + +ResolvedFunctionOption::~ResolvedFunctionOption() {} + + +const ResolvedFunctionOption* FunctionOptions::getResolvedFunctionOptions(int32_t& len) const { + len = functionOptionsLen; + U_ASSERT(len == 0 || options != nullptr); + return options; +} + +FunctionOptions::FunctionOptions(UVector&& optionsVector, UErrorCode& status) { + CHECK_ERROR(status); + + functionOptionsLen = optionsVector.size(); + options = moveVectorToArray<ResolvedFunctionOption>(optionsVector, status); +} + +// Returns false if option doesn't exist +UBool FunctionOptions::wasSetFromLiteral(const UnicodeString& key) const { + if (options == nullptr) { + U_ASSERT(functionOptionsLen == 0); + } + for (int32_t i = 0; i < functionOptionsLen; i++) { + const ResolvedFunctionOption& opt = options[i]; + if (opt.getName() == key) { + return opt.isLiteral(); + } + } + return false; +} + +UBool FunctionOptions::getFunctionOption(std::u16string_view key, Formattable& option) const { + if (options == nullptr) { + U_ASSERT(functionOptionsLen == 0); + } + for (int32_t i = 0; i < functionOptionsLen; i++) { + const ResolvedFunctionOption& opt = options[i]; + if (opt.getName() == key) { + option = opt.getValue(); + return true; + } + } + return false; +} + +UnicodeString FunctionOptions::getStringFunctionOption(std::u16string_view key) const { + Formattable option; + if (getFunctionOption(key, option)) { + if (option.getType() == UFMT_STRING) { + UErrorCode localErrorCode = U_ZERO_ERROR; + UnicodeString val = option.getString(localErrorCode); + U_ASSERT(U_SUCCESS(localErrorCode)); + return val; + } + } + // For anything else, including non-string values, return "". + // Alternately, could try to stringify the non-string option. + // (Currently, no tests require that.) + return {}; +} + +FunctionOptions& FunctionOptions::operator=(FunctionOptions&& other) noexcept { + functionOptionsLen = other.functionOptionsLen; + options = other.options; + other.functionOptionsLen = 0; + other.options = nullptr; + return *this; +} + +FunctionOptions::FunctionOptions(FunctionOptions&& other) { + *this = std::move(other); +} + +FunctionOptions::~FunctionOptions() { + if (options != nullptr) { + delete[] options; + options = nullptr; + } +} + +static bool containsOption(const UVector& opts, const ResolvedFunctionOption& opt) { + for (int32_t i = 0; i < opts.size(); i++) { + if (static_cast<ResolvedFunctionOption*>(opts[i])->getName() + == opt.getName()) { + return true; + } + } + return false; +} + +// Options in `this` take precedence +// `this` can't be used after mergeOptions is called +FunctionOptions FunctionOptions::mergeOptions(FunctionOptions&& other, + UErrorCode& status) { + UVector mergedOptions(status); + mergedOptions.setDeleter(uprv_deleteUObject); + + if (U_FAILURE(status)) { + return {}; + } + + // Create a new vector consisting of the options from this `FunctionOptions` + for (int32_t i = 0; i < functionOptionsLen; i++) { + mergedOptions.adoptElement(create<ResolvedFunctionOption>(std::move(options[i]), status), + status); + } + + // Add each option from `other` that doesn't appear in this `FunctionOptions` + for (int i = 0; i < other.functionOptionsLen; i++) { + // Note: this is quadratic in the length of `options` + if (!containsOption(mergedOptions, other.options[i])) { + mergedOptions.adoptElement(create<ResolvedFunctionOption>(std::move(other.options[i]), + status), + status); + } + } + + delete[] options; + options = nullptr; + functionOptionsLen = 0; + + return FunctionOptions(std::move(mergedOptions), status); +} + +// PrioritizedVariant +// ------------------ + +UBool PrioritizedVariant::operator<(const PrioritizedVariant& other) const { + if (priority < other.priority) { + return true; + } + return false; +} + +PrioritizedVariant::~PrioritizedVariant() {} + + // ---------------- Environments and closures + + Environment* Environment::create(const VariableName& var, Closure&& c, Environment* parent, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + Environment* result = new NonEmptyEnvironment(var, std::move(c), parent); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return result; + } + + Environment* Environment::create(UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + Environment* result = new EmptyEnvironment(); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return result; + } + + const Closure& EmptyEnvironment::lookup(const VariableName& v) const { + (void) v; + U_ASSERT(false); + UPRV_UNREACHABLE_EXIT; + } + + const Closure& NonEmptyEnvironment::lookup(const VariableName& v) const { + if (v == var) { + return rhs; + } + return parent->lookup(v); + } + + bool EmptyEnvironment::has(const VariableName& v) const { + (void) v; + return false; + } + + bool NonEmptyEnvironment::has(const VariableName& v) const { + if (v == var) { + return true; + } + return parent->has(v); + } + + Environment::~Environment() {} + NonEmptyEnvironment::~NonEmptyEnvironment() {} + EmptyEnvironment::~EmptyEnvironment() {} + + Closure::~Closure() {} + + // MessageContext methods + + void MessageContext::checkErrors(UErrorCode& status) const { + CHECK_ERROR(status); + errors.checkErrors(status); + } + + const Formattable* MessageContext::getGlobal(const VariableName& v, + UErrorCode& errorCode) const { + return arguments.getArgument(v, errorCode); + } + + MessageContext::MessageContext(const MessageArguments& args, + const StaticErrors& e, + UErrorCode& status) : arguments(args), errors(e, status) {} + + MessageContext::~MessageContext() {} + + // InternalValue + // ------------- + + bool InternalValue::isFallback() const { + return std::holds_alternative<FormattedPlaceholder>(argument) + && std::get_if<FormattedPlaceholder>(&argument)->isFallback(); + } + + bool InternalValue::hasNullOperand() const { + return std::holds_alternative<FormattedPlaceholder>(argument) + && std::get_if<FormattedPlaceholder>(&argument)->isNullOperand(); + } + + FormattedPlaceholder InternalValue::takeArgument(UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + if (std::holds_alternative<FormattedPlaceholder>(argument)) { + return std::move(*std::get_if<FormattedPlaceholder>(&argument)); + } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + const UnicodeString& InternalValue::getFallback() const { + if (std::holds_alternative<FormattedPlaceholder>(argument)) { + return std::get_if<FormattedPlaceholder>(&argument)->getFallback(); + } + return (*std::get_if<InternalValue*>(&argument))->getFallback(); + } + + const Selector* InternalValue::getSelector(UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } + + if (selector == nullptr) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return selector; + } + + InternalValue::InternalValue(FormattedPlaceholder&& arg) { + argument = std::move(arg); + selector = nullptr; + formatter = nullptr; + } + + InternalValue::InternalValue(InternalValue* operand, + FunctionOptions&& opts, + const FunctionName& functionName, + const Formatter* f, + const Selector* s) { + argument = operand; + options = std::move(opts); + name = functionName; + selector = s; + formatter = f; + U_ASSERT(selector != nullptr || formatter != nullptr); + } + + // `this` cannot be used after calling this method + void InternalValue::forceSelection(DynamicErrors& errs, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return; + } + + if (!canSelect()) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + // Find the argument and complete set of options by traversing `argument` + FunctionOptions opts; + InternalValue* p = this; + FunctionName selectorName = name; + + bool operandSelect = false; + while (std::holds_alternative<InternalValue*>(p->argument)) { + if (p->name != selectorName) { + // Can only compose calls to the same selector + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + // Very special case to detect something like: + // .local $sel = {1 :integer select=exact} .local $bad = {$sel :integer} .match $bad 1 {{ONE}} * {{operand select {$bad}}} + // This can be done better once function composition is fully implemented. + if (p != this && + !p->options.getStringFunctionOption(options::SELECT).isEmpty() + && (selectorName == functions::NUMBER || selectorName == functions::INTEGER)) { + // In this case, we want to call the selector normally but emit a + // `bad-option` error, possibly with the outcome of normal-looking output (with relaxed + // error handling) and an error (with strict error handling). + operandSelect = true; + } + // First argument to mergeOptions takes precedence + opts = opts.mergeOptions(std::move(p->options), errorCode); + if (U_FAILURE(errorCode)) { + return; + } + InternalValue* next = *std::get_if<InternalValue*>(&p->argument); + p = next; + } + FormattedPlaceholder arg = std::move(*std::get_if<FormattedPlaceholder>(&p->argument)); + + // This condition can't be checked in the selector. + // Effectively, there are two different kinds of "bad option" errors: + // one that can be recovered from (used for select=$var) and one that + // can't (used for bad digit size options and other cases). + // The checking of the recoverable error has to be done here; otherwise, + // the "bad option" signaled by the selector implementation would cause + // fallback output to be used when formatting the `*` pattern. + bool badSelectOption = !checkSelectOption(); + + selector->selectKey(std::move(arg), std::move(opts), + keys, keysLen, + prefs, prefsLen, errorCode); + if (errorCode == U_MF_SELECTOR_ERROR) { + errorCode = U_ZERO_ERROR; + errs.setSelectorError(selectorName, errorCode); + } else if (errorCode == U_MF_BAD_OPTION) { + errorCode = U_ZERO_ERROR; + errs.setBadOption(selectorName, errorCode); + } else if (operandSelect || badSelectOption) { + errs.setRecoverableBadOption(selectorName, errorCode); + // In this case, only the `*` variant should match + prefsLen = 0; + } + } + + bool InternalValue::checkSelectOption() const { + if (name != UnicodeString("number") && name != UnicodeString("integer")) { + return true; + } + + // Per the spec, if the "select" option is present, it must have been + // set from a literal + + Formattable opt; + // Returns false if the `select` option is present and it was not set from a literal + + // OK if the option wasn't present + if (!options.getFunctionOption(UnicodeString("select"), opt)) { + return true; + } + // Otherwise, return true if the option was set from a literal + return options.wasSetFromLiteral(UnicodeString("select")); + } + + FormattedPlaceholder InternalValue::forceFormatting(DynamicErrors& errs, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + if (formatter == nullptr && selector == nullptr) { + U_ASSERT(std::holds_alternative<FormattedPlaceholder>(argument)); + return std::move(*std::get_if<FormattedPlaceholder>(&argument)); + } + if (formatter == nullptr) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + FormattedPlaceholder arg; + + if (std::holds_alternative<FormattedPlaceholder>(argument)) { + arg = std::move(*std::get_if<FormattedPlaceholder>(&argument)); + } else { + arg = (*std::get_if<InternalValue*>(&argument))->forceFormatting(errs, + errorCode); + } + + if (U_FAILURE(errorCode)) { + return {}; + } + + if (arg.isFallback()) { + return arg; + } + + // The fallback for a nullary function call is the function name + UnicodeString fallback; + if (arg.isNullOperand()) { + fallback = u":"; + fallback += name; + } else { + fallback = arg.getFallback(); + } + + // Very special case for :number select=foo and :integer select=foo + // This check can't be done inside the function implementation because + // it doesn't have a way to both signal an error and return usable output, + // and the spec stipulates that fallback output shouldn't be used in the + // case of a bad `select` option to a formatting call. + bool badSelect = !checkSelectOption(); + + // Call the function with the argument + FormattedPlaceholder result = formatter->format(std::move(arg), std::move(options), errorCode); + if (U_SUCCESS(errorCode) && errorCode == U_USING_DEFAULT_WARNING) { + // Ignore this warning + errorCode = U_ZERO_ERROR; + } + if (U_FAILURE(errorCode)) { + if (errorCode == U_MF_OPERAND_MISMATCH_ERROR) { + errorCode = U_ZERO_ERROR; + errs.setOperandMismatchError(name, errorCode); + } else if (errorCode == U_MF_BAD_OPTION) { + errorCode = U_ZERO_ERROR; + errs.setBadOption(name, errorCode); + } else { + errorCode = U_ZERO_ERROR; + // Convey any other error generated by the formatter + // as a formatting error + errs.setFormattingError(name, errorCode); + } + } + // Ignore the output if any error occurred + // We don't ignore the output in the case of a Bad Option Error, + // because of the select=bad case where we want both an error + // and non-fallback output. + if (errs.hasFormattingError() || errs.hasBadOptionError()) { + return FormattedPlaceholder(fallback); + } + if (badSelect) { + // In this case, we want to set an error but not replace + // the output with a fallback + errs.setRecoverableBadOption(name, errorCode); + } + return result; + } + + InternalValue& InternalValue::operator=(InternalValue&& other) noexcept { + argument = std::move(other.argument); + other.argument = nullptr; + options = std::move(other.options); + name = other.name; + selector = other.selector; + formatter = other.formatter; + other.selector = nullptr; + other.formatter = nullptr; + + return *this; + } + + InternalValue::~InternalValue() { + delete selector; + selector = nullptr; + delete formatter; + formatter = nullptr; + if (std::holds_alternative<InternalValue*>(argument)) { + delete *std::get_if<InternalValue*>(&argument); + argument = nullptr; + } + } + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_evaluation.h b/deps/icu-small/source/i18n/messageformat2_evaluation.h new file mode 100644 index 00000000000000..f73b444229f5e4 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_evaluation.h @@ -0,0 +1,234 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_EVALUATION_H +#define MESSAGEFORMAT2_EVALUATION_H + +#if U_SHOW_CPLUSPLUS_API + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model.h" +#include "unicode/messageformat2_function_registry.h" +#include "messageformat2_errors.h" + +// Auxiliary data structures used during formatting a message + +U_NAMESPACE_BEGIN + +namespace message2 { + + namespace functions { + static constexpr std::u16string_view DATETIME = u"datetime"; + static constexpr std::u16string_view DATE = u"date"; + static constexpr std::u16string_view TIME = u"time"; + static constexpr std::u16string_view NUMBER = u"number"; + static constexpr std::u16string_view INTEGER = u"integer"; + static constexpr std::u16string_view TEST_FUNCTION = u"test:function"; + static constexpr std::u16string_view TEST_FORMAT = u"test:format"; + static constexpr std::u16string_view TEST_SELECT = u"test:select"; + static constexpr std::u16string_view STRING = u"string"; + } + + using namespace data_model; + + // PrioritizedVariant + + // For how this class is used, see the references to (integer, variant) tuples + // in https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection + class PrioritizedVariant : public UObject { + public: + PrioritizedVariant() = default; + PrioritizedVariant(PrioritizedVariant&&) = default; + PrioritizedVariant& operator=(PrioritizedVariant&&) noexcept = default; + UBool operator<(const PrioritizedVariant&) const; + int32_t priority; + /* const */ SelectorKeys keys; + /* const */ Pattern pat; + PrioritizedVariant(uint32_t p, + const SelectorKeys& k, + const Pattern& pattern) noexcept : priority(p), keys(k), pat(pattern) {} + virtual ~PrioritizedVariant(); + }; // class PrioritizedVariant + + static inline int32_t comparePrioritizedVariants(UElement left, UElement right) { + const PrioritizedVariant& tuple1 = *(static_cast<const PrioritizedVariant*>(left.pointer)); + const PrioritizedVariant& tuple2 = *(static_cast<const PrioritizedVariant*>(right.pointer)); + if (tuple1 < tuple2) { + return -1; + } + if (tuple1.priority == tuple2.priority) { + return 0; + } + return 1; + } + + // Closures and environments + // ------------------------- + + class Environment; + + // A closure represents the right-hand side of a variable + // declaration, along with an environment giving values + // to its free variables + class Closure : public UMemory { + public: + const Expression& getExpr() const { + return expr; + } + const Environment& getEnv() const { + return env; + } + Closure(const Expression& expression, const Environment& environment) : expr(expression), env(environment) {} + Closure(Closure&&) = default; + + virtual ~Closure(); + private: + + // An unevaluated expression + const Expression& expr; + // The environment mapping names used in this + // expression to other expressions + const Environment& env; + }; + + // An environment is represented as a linked chain of + // non-empty environments, terminating at an empty environment. + // It's searched using linear search. + class Environment : public UMemory { + public: + virtual bool has(const VariableName&) const = 0; + virtual const Closure& lookup(const VariableName&) const = 0; + static Environment* create(UErrorCode&); + static Environment* create(const VariableName&, Closure&&, Environment*, UErrorCode&); + virtual ~Environment(); + }; + + class NonEmptyEnvironment; + class EmptyEnvironment : public Environment { + public: + EmptyEnvironment() = default; + virtual ~EmptyEnvironment(); + + private: + friend class Environment; + + bool has(const VariableName&) const override; + const Closure& lookup(const VariableName&) const override; + static EmptyEnvironment* create(UErrorCode&); + static NonEmptyEnvironment* create(const VariableName&, Closure&&, Environment*, UErrorCode&); + }; + + class NonEmptyEnvironment : public Environment { + private: + friend class Environment; + + bool has(const VariableName&) const override; + const Closure& lookup(const VariableName&) const override; + static NonEmptyEnvironment* create(const VariableName&, Closure&&, const Environment*, UErrorCode&); + virtual ~NonEmptyEnvironment(); + private: + friend class Environment; + + NonEmptyEnvironment(const VariableName& v, Closure&& c, Environment* e) : var(v), rhs(std::move(c)), parent(e) {} + + // Maps VariableName onto Closure* + // Chain of linked environments + VariableName var; + Closure rhs; + const LocalPointer<Environment> parent; + }; + + // The context contains all the information needed to process + // an entire message: arguments, formatter cache, and error list + + class MessageFormatter; + + class MessageContext : public UMemory { + public: + MessageContext(const MessageArguments&, const StaticErrors&, UErrorCode&); + + const Formattable* getGlobal(const VariableName&, UErrorCode&) const; + + // If any errors were set, update `status` accordingly + void checkErrors(UErrorCode& status) const; + DynamicErrors& getErrors() { return errors; } + + virtual ~MessageContext(); + + private: + + const MessageArguments& arguments; // External message arguments + // Errors accumulated during parsing/formatting + DynamicErrors errors; + + }; // class MessageContext + + // InternalValue + // ---------------- + + class InternalValue : public UObject { + public: + const FunctionName& getFunctionName() const { return name; } + bool canSelect() const { return selector != nullptr; } + const Selector* getSelector(UErrorCode&) const; + FormattedPlaceholder forceFormatting(DynamicErrors& errs, + UErrorCode& errorCode); + void forceSelection(DynamicErrors& errs, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& errorCode); + // Needs to be deep-copyable and movable + virtual ~InternalValue(); + InternalValue(FormattedPlaceholder&&); + // Formatter and selector may be null + InternalValue(InternalValue*, FunctionOptions&&, const FunctionName&, const Formatter*, + const Selector*); + const UnicodeString& getFallback() const; + bool isFallback() const; + bool hasNullOperand() const; + // Can't be used anymore after calling this + FormattedPlaceholder takeArgument(UErrorCode& errorCode); + InternalValue(InternalValue&& other) { *this = std::move(other); } + InternalValue& operator=(InternalValue&& other) noexcept; + private: + // InternalValue is owned (if present) + std::variant<InternalValue*, FormattedPlaceholder> argument; + FunctionOptions options; + FunctionName name; + const Selector* selector; // May be null + const Formatter* formatter; // May be null, but one or the other should be non-null unless argument is a FormattedPlaceholder + bool checkSelectOption() const; + }; // class InternalValue + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_EVALUATION_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_formattable.cpp b/deps/icu-small/source/i18n/messageformat2_formattable.cpp new file mode 100644 index 00000000000000..0bbecaf25d773e --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_formattable.cpp @@ -0,0 +1,338 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_formattable.h" +#include "unicode/smpdtfmt.h" +#include "messageformat2_allocation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" + +#include "limits.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + // Fallback values are enclosed in curly braces; + // see https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#formatting-fallback-values + + static UnicodeString fallbackToString(const UnicodeString& s) { + UnicodeString result; + result += LEFT_CURLY_BRACE; + result += s; + result += RIGHT_CURLY_BRACE; + return result; + } + + Formattable& Formattable::operator=(Formattable other) noexcept { + swap(*this, other); + return *this; + } + + Formattable::Formattable(const Formattable& other) { + contents = other.contents; + } + + Formattable Formattable::forDecimal(std::string_view number, UErrorCode &status) { + Formattable f; + // The relevant overload of the StringPiece constructor + // casts the string length to int32_t, so we have to check + // that the length makes sense + if (number.size() > INT_MAX) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } else { + f.contents = icu::Formattable(StringPiece(number), status); + } + return f; + } + + UFormattableType Formattable::getType() const { + if (std::holds_alternative<double>(contents)) { + return UFMT_DOUBLE; + } + if (std::holds_alternative<int64_t>(contents)) { + return UFMT_INT64; + } + if (std::holds_alternative<UnicodeString>(contents)) { + return UFMT_STRING; + } + if (isDecimal()) { + switch (std::get_if<icu::Formattable>(&contents)->getType()) { + case icu::Formattable::Type::kLong: { + return UFMT_LONG; + } + case icu::Formattable::Type::kDouble: { + return UFMT_DOUBLE; + } + default: { + return UFMT_INT64; + } + } + } + if (isDate()) { + return UFMT_DATE; + } + if (std::holds_alternative<const FormattableObject*>(contents)) { + return UFMT_OBJECT; + } + return UFMT_ARRAY; + } + + const Formattable* Formattable::getArray(int32_t& len, UErrorCode& status) const { + NULL_ON_ERROR(status); + + if (getType() != UFMT_ARRAY) { + len = 0; + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + const std::pair<const Formattable*, int32_t>& p = *std::get_if<std::pair<const Formattable*, int32_t>>(&contents); + U_ASSERT(p.first != nullptr); + len = p.second; + return p.first; + } + + int64_t Formattable::getInt64(UErrorCode& status) const { + if (isDecimal() && isNumeric()) { + return std::get_if<icu::Formattable>(&contents)->getInt64(status); + } + + switch (getType()) { + case UFMT_LONG: + case UFMT_INT64: { + return *std::get_if<int64_t>(&contents); + } + case UFMT_DOUBLE: { + return icu::Formattable(*std::get_if<double>(&contents)).getInt64(status); + } + default: { + status = U_INVALID_FORMAT_ERROR; + return 0; + } + } + } + + icu::Formattable Formattable::asICUFormattable(UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + // Type must not be UFMT_ARRAY or UFMT_OBJECT + if (getType() == UFMT_ARRAY || getType() == UFMT_OBJECT) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + + if (isDecimal()) { + return *std::get_if<icu::Formattable>(&contents); + } + + switch (getType()) { + case UFMT_DATE: { + return icu::Formattable(*std::get_if<double>(&contents), icu::Formattable::kIsDate); + } + case UFMT_DOUBLE: { + return icu::Formattable(*std::get_if<double>(&contents)); + } + case UFMT_LONG: { + return icu::Formattable(static_cast<int32_t>(*std::get_if<double>(&contents))); + } + case UFMT_INT64: { + return icu::Formattable(*std::get_if<int64_t>(&contents)); + } + case UFMT_STRING: { + return icu::Formattable(*std::get_if<UnicodeString>(&contents)); + } + default: { + // Already checked for UFMT_ARRAY and UFMT_OBJECT + return icu::Formattable(); + } + } + } + + Formattable::~Formattable() {} + + FormattableObject::~FormattableObject() {} + + FormattedMessage::~FormattedMessage() {} + + FormattedValue::FormattedValue(const UnicodeString& s) { + type = kString; + stringOutput = std::move(s); + } + + FormattedValue::FormattedValue(number::FormattedNumber&& n) { + type = kNumber; + numberOutput = std::move(n); + } + + FormattedValue& FormattedValue::operator=(FormattedValue&& other) noexcept { + type = other.type; + if (type == kString) { + stringOutput = std::move(other.stringOutput); + } else { + numberOutput = std::move(other.numberOutput); + } + return *this; + } + + FormattedValue::~FormattedValue() {} + + FormattedPlaceholder& FormattedPlaceholder::operator=(FormattedPlaceholder&& other) noexcept { + type = other.type; + source = other.source; + if (type == kEvaluated) { + formatted = std::move(other.formatted); + previousOptions = std::move(other.previousOptions); + } + fallback = other.fallback; + return *this; + } + + const Formattable& FormattedPlaceholder::asFormattable() const { + return source; + } + + // Default formatters + // ------------------ + + number::FormattedNumber formatNumberWithDefaults(const Locale& locale, double toFormat, UErrorCode& errorCode) { + return number::NumberFormatter::withLocale(locale).formatDouble(toFormat, errorCode); + } + + number::FormattedNumber formatNumberWithDefaults(const Locale& locale, int32_t toFormat, UErrorCode& errorCode) { + return number::NumberFormatter::withLocale(locale).formatInt(toFormat, errorCode); + } + + number::FormattedNumber formatNumberWithDefaults(const Locale& locale, int64_t toFormat, UErrorCode& errorCode) { + return number::NumberFormatter::withLocale(locale).formatInt(toFormat, errorCode); + } + + number::FormattedNumber formatNumberWithDefaults(const Locale& locale, StringPiece toFormat, UErrorCode& errorCode) { + return number::NumberFormatter::withLocale(locale).formatDecimal(toFormat, errorCode); + } + + DateFormat* defaultDateTimeInstance(const Locale& locale, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + LocalPointer<DateFormat> df(DateFormat::createDateTimeInstance(DateFormat::SHORT, DateFormat::SHORT, locale)); + if (!df.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return df.orphan(); + } + + // Called when output is required and the contents are an unevaluated `Formattable`; + // formats the source `Formattable` to a string with defaults, if it can be + // formatted with a default formatter + static FormattedPlaceholder formatWithDefaults(const Locale& locale, const FormattedPlaceholder& input, UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + const Formattable& toFormat = input.asFormattable(); + // Try as decimal number first + if (toFormat.isNumeric()) { + // Note: the ICU Formattable has to be created here since the StringPiece + // refers to state inside the Formattable; so otherwise we'll have a reference + // to a temporary object + icu::Formattable icuFormattable = toFormat.asICUFormattable(status); + StringPiece asDecimal = icuFormattable.getDecimalNumber(status); + if (U_FAILURE(status)) { + return {}; + } + if (asDecimal != nullptr) { + return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, asDecimal, status))); + } + } + + UFormattableType type = toFormat.getType(); + switch (type) { + case UFMT_DATE: { + UnicodeString result; + const DateInfo* dateInfo = toFormat.getDate(status); + U_ASSERT(U_SUCCESS(status)); + formatDateWithDefaults(locale, *dateInfo, result, status); + return FormattedPlaceholder(input, FormattedValue(std::move(result))); + } + case UFMT_DOUBLE: { + double d = toFormat.getDouble(status); + U_ASSERT(U_SUCCESS(status)); + return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, d, status))); + } + case UFMT_LONG: { + int32_t l = toFormat.getLong(status); + U_ASSERT(U_SUCCESS(status)); + return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, l, status))); + } + case UFMT_INT64: { + int64_t i = toFormat.getInt64Value(status); + U_ASSERT(U_SUCCESS(status)); + return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, i, status))); + } + case UFMT_STRING: { + const UnicodeString& s = toFormat.getString(status); + U_ASSERT(U_SUCCESS(status)); + return FormattedPlaceholder(input, FormattedValue(UnicodeString(s))); + } + default: { + // No default formatters for other types; use fallback + status = U_MF_FORMATTING_ERROR; + // Note: it would be better to set an internal formatting error so that a string + // (e.g. the type tag) can be provided. However, this method is called by the + // public method formatToString() and thus can't take a MessageContext + return FormattedPlaceholder(input.getFallback()); + } + } + } + + // Called when string output is required; forces output to be produced + // if none is present (including formatting number output as a string) + UnicodeString FormattedPlaceholder::formatToString(const Locale& locale, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; + } + if (isFallback() || isNullOperand()) { + return fallbackToString(fallback); + } + + // Evaluated value: either just return the string, or format the number + // as a string and return it + if (isEvaluated()) { + if (formatted.isString()) { + return formatted.getString(); + } else { + return formatted.getNumber().toString(status); + } + } + // Unevaluated value: first evaluate it fully, then format + UErrorCode savedStatus = status; + FormattedPlaceholder evaluated = formatWithDefaults(locale, *this, status); + if (status == U_MF_FORMATTING_ERROR) { + U_ASSERT(evaluated.isFallback()); + return evaluated.getFallback(); + } + // Ignore U_USING_DEFAULT_WARNING + if (status == U_USING_DEFAULT_WARNING) { + status = savedStatus; + } + return evaluated.formatToString(locale, status); + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_formatter.cpp b/deps/icu-small/source/i18n/messageformat2_formatter.cpp new file mode 100644 index 00000000000000..6c555ecbc0e2dc --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_formatter.cpp @@ -0,0 +1,366 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2.h" +#include "messageformat2_allocation.h" +#include "messageformat2_checker.h" +#include "messageformat2_errors.h" +#include "messageformat2_evaluation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" +#include "messageformat2_parser.h" +#include "messageformat2_serializer.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + + // MessageFormatter::Builder + + // ------------------------------------- + // Creates a MessageFormat instance based on the pattern. + + void MessageFormatter::Builder::clearState() { + normalizedInput.remove(); + delete errors; + errors = nullptr; + } + + MessageFormatter::Builder& MessageFormatter::Builder::setPattern(const UnicodeString& pat, + UParseError& parseError, + UErrorCode& errorCode) { + clearState(); + // Create errors + errors = create<StaticErrors>(StaticErrors(errorCode), errorCode); + THIS_ON_ERROR(errorCode); + + // Parse the pattern + MFDataModel::Builder tree(errorCode); + Parser(pat, tree, *errors, normalizedInput, errorCode) + .parse(parseError, errorCode); + + // Fail on syntax errors + if (errors->hasSyntaxError()) { + errors->checkErrors(errorCode); + // Check that the checkErrors() method set the error code + U_ASSERT(U_FAILURE(errorCode)); + } + + // Build the data model based on what was parsed + dataModel = tree.build(errorCode); + hasDataModel = true; + hasPattern = true; + pattern = pat; + + return *this; + } + + // Precondition: `reg` is non-null + // Does not adopt `reg` + MessageFormatter::Builder& MessageFormatter::Builder::setFunctionRegistry(const MFFunctionRegistry& reg) { + customMFFunctionRegistry = ® + return *this; + } + + MessageFormatter::Builder& MessageFormatter::Builder::setLocale(const Locale& loc) { + locale = loc; + return *this; + } + + MessageFormatter::Builder& MessageFormatter::Builder::setDataModel(MFDataModel&& newDataModel) { + clearState(); + hasPattern = false; + hasDataModel = true; + dataModel = std::move(newDataModel); + + return *this; + } + + MessageFormatter::Builder& + MessageFormatter::Builder::setErrorHandlingBehavior( + MessageFormatter::UMFErrorHandlingBehavior type) { + signalErrors = type == U_MF_STRICT; + return *this; + } + + /* + This build() method is non-destructive, which entails the risk that + its borrowed MFFunctionRegistry and (if the setDataModel() method was called) + MFDataModel pointers could become invalidated. + */ + MessageFormatter MessageFormatter::Builder::build(UErrorCode& errorCode) const { + return MessageFormatter(*this, errorCode); + } + + MessageFormatter::Builder::Builder(UErrorCode& errorCode) : locale(Locale::getDefault()), customMFFunctionRegistry(nullptr) { + // Initialize errors + errors = new StaticErrors(errorCode); + CHECK_ERROR(errorCode); + if (errors == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + } + + MessageFormatter::Builder::~Builder() { + if (errors != nullptr) { + delete errors; + errors = nullptr; + } + } + + // MessageFormatter + + MessageFormatter::MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &success) : locale(builder.locale), customMFFunctionRegistry(builder.customMFFunctionRegistry) { + CHECK_ERROR(success); + + // Set up the standard function registry + MFFunctionRegistry::Builder standardFunctionsBuilder(success); + + FormatterFactory* dateTime = StandardFunctions::DateTimeFactory::dateTime(success); + FormatterFactory* date = StandardFunctions::DateTimeFactory::date(success); + FormatterFactory* time = StandardFunctions::DateTimeFactory::time(success); + FormatterFactory* number = new StandardFunctions::NumberFactory(); + FormatterFactory* integer = new StandardFunctions::IntegerFactory(); + standardFunctionsBuilder.adoptFormatter(FunctionName(functions::DATETIME), dateTime, success) + .adoptFormatter(FunctionName(functions::DATE), date, success) + .adoptFormatter(FunctionName(functions::TIME), time, success) + .adoptFormatter(FunctionName(functions::NUMBER), number, success) + .adoptFormatter(FunctionName(functions::INTEGER), integer, success) + .adoptFormatter(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestFormatFactory(), success) + .adoptFormatter(FunctionName(functions::TEST_FORMAT), new StandardFunctions::TestFormatFactory(), success) + .adoptSelector(FunctionName(functions::NUMBER), new StandardFunctions::PluralFactory(UPLURAL_TYPE_CARDINAL), success) + .adoptSelector(FunctionName(functions::INTEGER), new StandardFunctions::PluralFactory(StandardFunctions::PluralFactory::integer()), success) + .adoptSelector(FunctionName(functions::STRING), new StandardFunctions::TextFactory(), success) + .adoptSelector(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestSelectFactory(), success) + .adoptSelector(FunctionName(functions::TEST_SELECT), new StandardFunctions::TestSelectFactory(), success); + CHECK_ERROR(success); + standardMFFunctionRegistry = standardFunctionsBuilder.build(); + CHECK_ERROR(success); + standardMFFunctionRegistry.checkStandard(); + + normalizedInput = builder.normalizedInput; + signalErrors = builder.signalErrors; + + // Build data model + // First, check that there is a data model + // (which might have been set by setDataModel(), or to + // the data model parsed from the pattern by setPattern()) + + if (!builder.hasDataModel) { + success = U_INVALID_STATE_ERROR; + return; + } + + dataModel = builder.dataModel; + if (builder.errors != nullptr) { + errors = new StaticErrors(*builder.errors, success); + } else { + // Initialize errors + LocalPointer<StaticErrors> errorsNew(new StaticErrors(success)); + CHECK_ERROR(success); + errors = errorsNew.orphan(); + } + + // Note: we currently evaluate variables lazily, + // without memoization. This call is still necessary + // to check out-of-scope uses of local variables in + // right-hand sides (unresolved variable errors can + // only be checked when arguments are known) + + // Check for resolution errors + Checker(dataModel, *errors, *this).check(success); + } + + void MessageFormatter::cleanup() noexcept { + if (errors != nullptr) { + delete errors; + errors = nullptr; + } + } + + MessageFormatter& MessageFormatter::operator=(MessageFormatter&& other) noexcept { + cleanup(); + + locale = std::move(other.locale); + standardMFFunctionRegistry = std::move(other.standardMFFunctionRegistry); + customMFFunctionRegistry = other.customMFFunctionRegistry; + dataModel = std::move(other.dataModel); + normalizedInput = std::move(other.normalizedInput); + signalErrors = other.signalErrors; + errors = other.errors; + other.errors = nullptr; + return *this; + } + + const MFDataModel& MessageFormatter::getDataModel() const { return dataModel; } + + UnicodeString MessageFormatter::getPattern() const { + // Converts the current data model back to a string + UnicodeString result; + Serializer serializer(getDataModel(), result); + serializer.serialize(); + return result; + } + + // Precondition: custom function registry exists + const MFFunctionRegistry& MessageFormatter::getCustomMFFunctionRegistry() const { + U_ASSERT(hasCustomMFFunctionRegistry()); + return *customMFFunctionRegistry; + } + + MessageFormatter::~MessageFormatter() { + cleanup(); + } + + // Selector and formatter lookup + // ----------------------------- + + // Postcondition: selector != nullptr || U_FAILURE(status) + Selector* MessageFormatter::getSelector(MessageContext& context, const FunctionName& functionName, UErrorCode& status) const { + NULL_ON_ERROR(status); + U_ASSERT(isSelector(functionName)); + + const SelectorFactory* selectorFactory = lookupSelectorFactory(context, functionName, status); + NULL_ON_ERROR(status); + if (selectorFactory == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + // Create a specific instance of the selector + auto result = selectorFactory->createSelector(getLocale(), status); + NULL_ON_ERROR(status); + return result; + } + + // Returns an owned pointer + Formatter* MessageFormatter::getFormatter(const FunctionName& functionName, UErrorCode& status) const { + NULL_ON_ERROR(status); + + // Create the formatter + + // First, look up the formatter factory for this function + FormatterFactory* formatterFactory = lookupFormatterFactory(functionName, status); + NULL_ON_ERROR(status); + + U_ASSERT(formatterFactory != nullptr); + + // Create a specific instance of the formatter + Formatter* formatter = formatterFactory->createFormatter(locale, status); + NULL_ON_ERROR(status); + if (formatter == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return formatter; + } + + bool MessageFormatter::getDefaultFormatterNameByType(const UnicodeString& type, + FunctionName& name) const { + if (!hasCustomMFFunctionRegistry()) { + return false; + } + const MFFunctionRegistry& reg = getCustomMFFunctionRegistry(); + return reg.getDefaultFormatterNameByType(type, name); + } + + // --------------------------------------------------- + // Function registry + + bool MessageFormatter::isBuiltInSelector(const FunctionName& functionName) const { + return standardMFFunctionRegistry.hasSelector(functionName); + } + + bool MessageFormatter::isBuiltInFormatter(const FunctionName& functionName) const { + return standardMFFunctionRegistry.hasFormatter(functionName); + } + + // https://github.com/unicode-org/message-format-wg/issues/409 + // Unknown function = unknown function error + // Formatter used as selector = selector error + // Selector used as formatter = formatting error + const SelectorFactory* MessageFormatter::lookupSelectorFactory(MessageContext& context, const FunctionName& functionName, UErrorCode& status) const { + DynamicErrors& err = context.getErrors(); + + if (isBuiltInSelector(functionName)) { + return standardMFFunctionRegistry.getSelector(functionName); + } + if (isBuiltInFormatter(functionName)) { + err.setSelectorError(functionName, status); + return nullptr; + } + if (hasCustomMFFunctionRegistry()) { + const MFFunctionRegistry& customMFFunctionRegistry = getCustomMFFunctionRegistry(); + const SelectorFactory* selectorFactory = customMFFunctionRegistry.getSelector(functionName); + if (selectorFactory != nullptr) { + return selectorFactory; + } + if (customMFFunctionRegistry.getFormatter(functionName) != nullptr) { + err.setSelectorError(functionName, status); + return nullptr; + } + } + // Either there is no custom function registry and the function + // isn't built-in, or the function doesn't exist in either the built-in + // or custom registry. + // Unknown function error + err.setUnknownFunction(functionName, status); + return nullptr; + } + + FormatterFactory* MessageFormatter::lookupFormatterFactory(const FunctionName& functionName, + UErrorCode& status) const { + NULL_ON_ERROR(status); + + if (isBuiltInFormatter(functionName)) { + return standardMFFunctionRegistry.getFormatter(functionName); + } + if (isBuiltInSelector(functionName)) { + status = U_MF_FORMATTING_ERROR; + return nullptr; + } + if (hasCustomMFFunctionRegistry()) { + const MFFunctionRegistry& customMFFunctionRegistry = getCustomMFFunctionRegistry(); + FormatterFactory* formatterFactory = customMFFunctionRegistry.getFormatter(functionName); + if (formatterFactory != nullptr) { + return formatterFactory; + } + if (customMFFunctionRegistry.getSelector(functionName) != nullptr) { + status = U_MF_FORMATTING_ERROR; + return nullptr; + } + } + // Either there is no custom function registry and the function + // isn't built-in, or the function doesn't exist in either the built-in + // or custom registry. + // Unknown function error + status = U_MF_UNKNOWN_FUNCTION_ERROR; + return nullptr; + } + + bool MessageFormatter::isCustomFormatter(const FunctionName& fn) const { + return hasCustomMFFunctionRegistry() && getCustomMFFunctionRegistry().getFormatter(fn) != nullptr; + } + + + bool MessageFormatter::isCustomSelector(const FunctionName& fn) const { + return hasCustomMFFunctionRegistry() && getCustomMFFunctionRegistry().getSelector(fn) != nullptr; + } + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_function_registry.cpp b/deps/icu-small/source/i18n/messageformat2_function_registry.cpp new file mode 100644 index 00000000000000..3e924ce97804a2 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_function_registry.cpp @@ -0,0 +1,1916 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include <math.h> +#include <cmath> + +#include "unicode/dtptngen.h" +#include "unicode/messageformat2.h" +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/messageformat2_function_registry.h" +#include "unicode/normalizer2.h" +#include "unicode/simpletz.h" +#include "unicode/smpdtfmt.h" +#include "charstr.h" +#include "double-conversion.h" +#include "messageformat2_allocation.h" +#include "messageformat2_function_registry_internal.h" +#include "messageformat2_macros.h" +#include "hash.h" +#include "mutex.h" +#include "number_types.h" +#include "ucln_in.h" +#include "uvector.h" // U_ASSERT + +// The C99 standard suggested that C++ implementations not define PRId64 etc. constants +// unless this macro is defined. +// See the Notes at https://en.cppreference.com/w/cpp/types/integer . +// Similar to defining __STDC_LIMIT_MACROS in unicode/ptypes.h . +#ifndef __STDC_FORMAT_MACROS +# define __STDC_FORMAT_MACROS +#endif +#include <inttypes.h> +#include <math.h> + +U_NAMESPACE_BEGIN + +namespace message2 { + +// Function registry implementation + +Formatter::~Formatter() {} +Selector::~Selector() {} +FormatterFactory::~FormatterFactory() {} +SelectorFactory::~SelectorFactory() {} + +MFFunctionRegistry MFFunctionRegistry::Builder::build() { + U_ASSERT(formatters != nullptr && selectors != nullptr && formattersByType != nullptr); + MFFunctionRegistry result = MFFunctionRegistry(formatters, selectors, formattersByType); + formatters = nullptr; + selectors = nullptr; + formattersByType = nullptr; + return result; +} + +MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptSelector(const FunctionName& selectorName, SelectorFactory* selectorFactory, UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + U_ASSERT(selectors != nullptr); + selectors->put(selectorName, selectorFactory, errorCode); + } + return *this; +} + +MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptFormatter(const FunctionName& formatterName, FormatterFactory* formatterFactory, UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + U_ASSERT(formatters != nullptr); + formatters->put(formatterName, formatterFactory, errorCode); + } + return *this; +} + +MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::setDefaultFormatterNameByType(const UnicodeString& type, const FunctionName& functionName, UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + U_ASSERT(formattersByType != nullptr); + FunctionName* f = create<FunctionName>(FunctionName(functionName), errorCode); + formattersByType->put(type, f, errorCode); + } + return *this; +} + +MFFunctionRegistry::Builder::Builder(UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + formatters = new Hashtable(); + selectors = new Hashtable(); + formattersByType = new Hashtable(); + if (!(formatters != nullptr && selectors != nullptr && formattersByType != nullptr)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } else { + formatters->setValueDeleter(uprv_deleteUObject); + selectors->setValueDeleter(uprv_deleteUObject); + formattersByType->setValueDeleter(uprv_deleteUObject); + } +} + +MFFunctionRegistry::Builder::~Builder() { + if (formatters != nullptr) { + delete formatters; + } + if (selectors != nullptr) { + delete selectors; + } + if (formattersByType != nullptr) { + delete formattersByType; + } +} + +// Returns non-owned pointer. Returns pointer rather than reference because it can fail. +// Returns non-const because FormatterFactory is mutable. +// TODO: This is unsafe because of the cached-formatters map +// (the caller could delete the resulting pointer) +FormatterFactory* MFFunctionRegistry::getFormatter(const FunctionName& formatterName) const { + U_ASSERT(formatters != nullptr); + return static_cast<FormatterFactory*>(formatters->get(formatterName)); +} + +UBool MFFunctionRegistry::getDefaultFormatterNameByType(const UnicodeString& type, FunctionName& name) const { + U_ASSERT(formatters != nullptr); + const FunctionName* f = static_cast<FunctionName*>(formattersByType->get(type)); + if (f != nullptr) { + name = *f; + return true; + } + return false; +} + +const SelectorFactory* MFFunctionRegistry::getSelector(const FunctionName& selectorName) const { + U_ASSERT(selectors != nullptr); + return static_cast<const SelectorFactory*>(selectors->get(selectorName)); +} + +bool MFFunctionRegistry::hasFormatter(const FunctionName& f) const { + return getFormatter(f) != nullptr; +} + +bool MFFunctionRegistry::hasSelector(const FunctionName& s) const { + return getSelector(s) != nullptr; +} + +void MFFunctionRegistry::checkFormatter(const char* s) const { +#if U_DEBUG + U_ASSERT(hasFormatter(FunctionName(UnicodeString(s)))); +#else + (void) s; +#endif +} + +void MFFunctionRegistry::checkSelector(const char* s) const { +#if U_DEBUG + U_ASSERT(hasSelector(FunctionName(UnicodeString(s)))); +#else + (void) s; +#endif +} + +// Debugging +void MFFunctionRegistry::checkStandard() const { + checkFormatter("datetime"); + checkFormatter("date"); + checkFormatter("time"); + checkFormatter("number"); + checkFormatter("integer"); + checkFormatter("test:function"); + checkFormatter("test:format"); + checkSelector("number"); + checkSelector("integer"); + checkSelector("string"); + checkSelector("test:function"); + checkSelector("test:select"); +} + +// Formatter/selector helpers + +// Returns the NFC-normalized version of s, returning s itself +// if it's already normalized. +/* static */ UnicodeString StandardFunctions::normalizeNFC(const UnicodeString& s) { + UErrorCode status = U_ZERO_ERROR; + const Normalizer2* nfcNormalizer = Normalizer2::getNFCInstance(status); + if (U_FAILURE(status)) { + return s; + } + // Check if string is already normalized + UNormalizationCheckResult result = nfcNormalizer->quickCheck(s, status); + // If so, return it + if (U_SUCCESS(status) && result == UNORM_YES) { + return s; + } + // Otherwise, normalize it + UnicodeString normalized = nfcNormalizer->normalize(s, status); + if (U_FAILURE(status)) { + return {}; + } + return normalized; +} + +// Converts `s` to a double, indicating failure via `errorCode` +static void strToDouble(const UnicodeString& s, double& result, UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + // Using en-US locale because it happens to correspond to the spec: + // https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#number-operands + // Ideally, this should re-use the code for parsing number literals (Parser::parseUnquotedLiteral()) + // It's hard to reuse the same code because of how parse errors work. + // TODO: Refactor + LocalPointer<NumberFormat> numberFormat(NumberFormat::createInstance(Locale("en-US"), errorCode)); + CHECK_ERROR(errorCode); + icu::Formattable asNumber; + numberFormat->parse(s, asNumber, errorCode); + CHECK_ERROR(errorCode); + result = asNumber.getDouble(errorCode); +} + +static double tryStringAsNumber(const Locale& locale, const Formattable& val, UErrorCode& errorCode) { + // Check for a string option, try to parse it as a number if present + UnicodeString tempString = val.getString(errorCode); + LocalPointer<NumberFormat> numberFormat(NumberFormat::createInstance(locale, errorCode)); + if (U_SUCCESS(errorCode)) { + icu::Formattable asNumber; + numberFormat->parse(tempString, asNumber, errorCode); + if (U_SUCCESS(errorCode)) { + return asNumber.getDouble(errorCode); + } + } + return 0; +} + +static int64_t getInt64Value(const Locale& locale, const Formattable& value, UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + if (!value.isNumeric()) { + double doubleResult = tryStringAsNumber(locale, value, errorCode); + if (U_SUCCESS(errorCode)) { + return static_cast<int64_t>(doubleResult); + } + } + else { + int64_t result = value.getInt64(errorCode); + if (U_SUCCESS(errorCode)) { + return result; + } + } + } + // Option was numeric but couldn't be converted to int64_t -- could be overflow + return 0; +} + +// Adopts its arguments +MFFunctionRegistry::MFFunctionRegistry(FormatterMap* f, SelectorMap* s, Hashtable* byType) : formatters(f), selectors(s), formattersByType(byType) { + U_ASSERT(f != nullptr && s != nullptr && byType != nullptr); +} + +MFFunctionRegistry& MFFunctionRegistry::operator=(MFFunctionRegistry&& other) noexcept { + cleanup(); + + formatters = other.formatters; + selectors = other.selectors; + formattersByType = other.formattersByType; + other.formatters = nullptr; + other.selectors = nullptr; + other.formattersByType = nullptr; + + return *this; +} + +void MFFunctionRegistry::cleanup() noexcept { + if (formatters != nullptr) { + delete formatters; + } + if (selectors != nullptr) { + delete selectors; + } + if (formattersByType != nullptr) { + delete formattersByType; + } +} + + +MFFunctionRegistry::~MFFunctionRegistry() { + cleanup(); +} + +// Specific formatter implementations + +// --------- Number + +bool inBounds(const UnicodeString& s, int32_t i) { + return i < s.length(); +} + +bool isDigit(UChar32 c) { + return c >= '0' && c <= '9'; +} + +bool parseDigits(const UnicodeString& s, int32_t& i) { + if (!isDigit(s[i])) { + return false; + } + while (inBounds(s, i) && isDigit(s[i])) { + i++; + } + return true; +} + +// number-literal = ["-"] (%x30 / (%x31-39 *DIGIT)) ["." 1*DIGIT] [%i"e" ["-" / "+"] 1*DIGIT] +bool validateNumberLiteral(const UnicodeString& s) { + int32_t i = 0; + + if (s.isEmpty()) { + return false; + } + + // Parse optional sign + // ["-"] + if (s[0] == HYPHEN) { + i++; + } + + if (!inBounds(s, i)) { + return false; + } + + // Parse integer digits + // (%x30 / (%x31-39 *DIGIT)) + if (s[i] == '0') { + if (!inBounds(s, i + 1) || s[i + 1] != PERIOD) { + return false; + } + i++; + } else { + if (!parseDigits(s, i)) { + return false; + } + } + // The rest is optional + if (!inBounds(s, i)) { + return true; + } + + // Parse optional decimal digits + // ["." 1*DIGIT] + if (s[i] == PERIOD) { + i++; + if (!parseDigits(s, i)) { + return false; + } + } + + if (!inBounds(s, i)) { + return true; + } + + // Parse optional exponent + // [%i"e" ["-" / "+"] 1*DIGIT] + if (s[i] == 'e' || s[i] == 'E') { + i++; + if (!inBounds(s, i)) { + return false; + } + // Parse optional sign + if (s[i] == HYPHEN || s[i] == PLUS) { + i++; + } + if (!inBounds(s, i)) { + return false; + } + if (!parseDigits(s, i)) { + return false; + } + } + if (i != s.length()) { + return false; + } + return true; +} + +bool isInteger(const Formattable& s) { + switch (s.getType()) { + case UFMT_DOUBLE: + case UFMT_LONG: + case UFMT_INT64: + return true; + case UFMT_STRING: { + UErrorCode ignore = U_ZERO_ERROR; + const UnicodeString& str = s.getString(ignore); + return validateNumberLiteral(str); + } + default: + return false; + } +} + +bool isDigitSizeOption(const UnicodeString& s) { + return s == UnicodeString("minimumIntegerDigits") + || s == UnicodeString("minimumFractionDigits") + || s == UnicodeString("maximumFractionDigits") + || s == UnicodeString("minimumSignificantDigits") + || s == UnicodeString("maximumSignificantDigits"); +} + +/* static */ void StandardFunctions::validateDigitSizeOptions(const FunctionOptions& opts, + UErrorCode& status) { + CHECK_ERROR(status); + + for (int32_t i = 0; i < opts.optionsCount(); i++) { + const ResolvedFunctionOption& opt = opts.options[i]; + if (isDigitSizeOption(opt.getName()) && !isInteger(opt.getValue())) { + status = U_MF_BAD_OPTION; + return; + } + } +} + +/* static */ number::LocalizedNumberFormatter StandardFunctions::formatterForOptions(const Number& number, + const FunctionOptions& opts, + UErrorCode& status) { + number::UnlocalizedNumberFormatter nf; + + using namespace number; + + validateDigitSizeOptions(opts, status); + if (U_FAILURE(status)) { + return {}; + } + + if (U_SUCCESS(status)) { + Formattable opt; + nf = NumberFormatter::with(); + bool isInteger = number.isInteger; + + if (isInteger) { + nf = nf.precision(Precision::integer()); + } + + // Notation options + if (!isInteger) { + // These options only apply to `:number` + + // Default notation is simple + Notation notation = Notation::simple(); + UnicodeString notationOpt = opts.getStringFunctionOption(options::NOTATION); + if (notationOpt == options::SCIENTIFIC) { + notation = Notation::scientific(); + } else if (notationOpt == options::ENGINEERING) { + notation = Notation::engineering(); + } else if (notationOpt == options::COMPACT) { + UnicodeString displayOpt = opts.getStringFunctionOption(options::COMPACT_DISPLAY); + if (displayOpt == options::LONG) { + notation = Notation::compactLong(); + } else { + // Default is short + notation = Notation::compactShort(); + } + } else { + // Already set to default + } + nf = nf.notation(notation); + } + + // Style options -- specific to `:number` + if (!isInteger) { + if (number.usePercent(opts)) { + nf = nf.unit(NoUnit::percent()).scale(Scale::powerOfTen(2)); + } + } + + int32_t maxSignificantDigits = number.maximumSignificantDigits(opts); + if (!isInteger) { + int32_t minFractionDigits = number.minimumFractionDigits(opts); + int32_t maxFractionDigits = number.maximumFractionDigits(opts); + int32_t minSignificantDigits = number.minimumSignificantDigits(opts); + Precision p = Precision::unlimited(); + bool precisionOptions = false; + + // Returning -1 means the option wasn't provided + if (maxFractionDigits != -1 && minFractionDigits != -1) { + precisionOptions = true; + p = Precision::minMaxFraction(minFractionDigits, maxFractionDigits); + } else if (minFractionDigits != -1) { + precisionOptions = true; + p = Precision::minFraction(minFractionDigits); + } else if (maxFractionDigits != -1) { + precisionOptions = true; + p = Precision::maxFraction(maxFractionDigits); + } + + if (minSignificantDigits != -1) { + precisionOptions = true; + p = p.minSignificantDigits(minSignificantDigits); + } + if (maxSignificantDigits != -1) { + precisionOptions = true; + p = p.maxSignificantDigits(maxSignificantDigits); + } + if (precisionOptions) { + nf = nf.precision(p); + } + } else { + // maxSignificantDigits applies to `:integer`, but the other precision options don't + Precision p = Precision::integer(); + if (maxSignificantDigits != -1) { + p = p.maxSignificantDigits(maxSignificantDigits); + } + nf = nf.precision(p); + } + + // All other options apply to both `:number` and `:integer` + int32_t minIntegerDigits = number.minimumIntegerDigits(opts); + nf = nf.integerWidth(IntegerWidth::zeroFillTo(minIntegerDigits)); + + // signDisplay + UnicodeString sd = opts.getStringFunctionOption(options::SIGN_DISPLAY); + UNumberSignDisplay signDisplay; + if (sd == options::ALWAYS) { + signDisplay = UNumberSignDisplay::UNUM_SIGN_ALWAYS; + } else if (sd == options::EXCEPT_ZERO) { + signDisplay = UNumberSignDisplay::UNUM_SIGN_EXCEPT_ZERO; + } else if (sd == options::NEGATIVE) { + signDisplay = UNumberSignDisplay::UNUM_SIGN_NEGATIVE; + } else if (sd == options::NEVER) { + signDisplay = UNumberSignDisplay::UNUM_SIGN_NEVER; + } else { + signDisplay = UNumberSignDisplay::UNUM_SIGN_AUTO; + } + nf = nf.sign(signDisplay); + + // useGrouping + UnicodeString ug = opts.getStringFunctionOption(options::USE_GROUPING); + UNumberGroupingStrategy grp; + if (ug == options::ALWAYS) { + grp = UNumberGroupingStrategy::UNUM_GROUPING_ON_ALIGNED; + } else if (ug == options::NEVER) { + grp = UNumberGroupingStrategy::UNUM_GROUPING_OFF; + } else if (ug == options::MIN2) { + grp = UNumberGroupingStrategy::UNUM_GROUPING_MIN2; + } else { + // Default is "auto" + grp = UNumberGroupingStrategy::UNUM_GROUPING_AUTO; + } + nf = nf.grouping(grp); + + // numberingSystem + UnicodeString ns = opts.getStringFunctionOption(options::NUMBERING_SYSTEM); + if (ns.length() > 0) { + ns = ns.toLower(Locale("en-US")); + CharString buffer; + // Ignore bad option values, so use a local status + UErrorCode localStatus = U_ZERO_ERROR; + // Copied from number_skeletons.cpp (helpers::parseNumberingSystemOption) + buffer.appendInvariantChars({false, ns.getBuffer(), ns.length()}, localStatus); + if (U_SUCCESS(localStatus)) { + LocalPointer<NumberingSystem> symbols + (NumberingSystem::createInstanceByName(buffer.data(), localStatus)); + if (U_SUCCESS(localStatus)) { + nf = nf.adoptSymbols(symbols.orphan()); + } + } + } + } + return nf.locale(number.locale); +} + +Formatter* StandardFunctions::NumberFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + Formatter* result = new Number(locale); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +Formatter* StandardFunctions::IntegerFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + Formatter* result = new Number(Number::integer(locale)); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +StandardFunctions::IntegerFactory::~IntegerFactory() {} + +static FormattedPlaceholder notANumber(const FormattedPlaceholder& input) { + return FormattedPlaceholder(input, FormattedValue(UnicodeString("NaN"))); +} + +static double parseNumberLiteral(const Formattable& input, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + // Copying string to avoid GCC dangling-reference warning + // (although the reference is safe) + UnicodeString inputStr = input.getString(errorCode); + // Precondition: `input`'s source Formattable has type string + if (U_FAILURE(errorCode)) { + return {}; + } + + // Validate string according to `number-literal` production + // in the spec for `:number`. This is because some cases are + // forbidden by this grammar, but allowed by StringToDouble. + if (!validateNumberLiteral(inputStr)) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return 0; + } + + // Convert to double using double_conversion::StringToDoubleConverter + using namespace double_conversion; + int processedCharactersCount = 0; + StringToDoubleConverter converter(0, 0, 0, "", ""); + int32_t len = inputStr.length(); + double result = + converter.StringToDouble(reinterpret_cast<const uint16_t*>(inputStr.getBuffer()), + len, + &processedCharactersCount); + if (processedCharactersCount != len) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + } + return result; +} + +static UChar32 digitToChar(int32_t val, UErrorCode errorCode) { + if (U_FAILURE(errorCode)) { + return '0'; + } + if (val < 0 || val > 9) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + switch(val) { + case 0: + return '0'; + case 1: + return '1'; + case 2: + return '2'; + case 3: + return '3'; + case 4: + return '4'; + case 5: + return '5'; + case 6: + return '6'; + case 7: + return '7'; + case 8: + return '8'; + case 9: + return '9'; + default: + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return '0'; + } +} + +int32_t StandardFunctions::Number::maximumFractionDigits(const FunctionOptions& opts) const { + Formattable opt; + + if (isInteger) { + return 0; + } + + if (opts.getFunctionOption(options::MAXIMUM_FRACTION_DIGITS, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + int64_t val = getInt64Value(locale, opt, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return static_cast<int32_t>(val); + } + } + // Returning -1 indicates that the option wasn't provided or was a non-integer. + // The caller needs to check for that case, since passing -1 to Precision::maxFraction() + // is an error. + return -1; +} + +int32_t StandardFunctions::Number::minimumFractionDigits(const FunctionOptions& opts) const { + Formattable opt; + + if (!isInteger) { + if (opts.getFunctionOption(options::MINIMUM_FRACTION_DIGITS, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + int64_t val = getInt64Value(locale, opt, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return static_cast<int32_t>(val); + } + } + } + // Returning -1 indicates that the option wasn't provided or was a non-integer. + // The caller needs to check for that case, since passing -1 to Precision::minFraction() + // is an error. + return -1; +} + +int32_t StandardFunctions::Number::minimumIntegerDigits(const FunctionOptions& opts) const { + Formattable opt; + + if (opts.getFunctionOption(options::MINIMUM_INTEGER_DIGITS, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + int64_t val = getInt64Value(locale, opt, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return static_cast<int32_t>(val); + } + } + return 1; +} + +int32_t StandardFunctions::Number::minimumSignificantDigits(const FunctionOptions& opts) const { + Formattable opt; + + if (!isInteger) { + if (opts.getFunctionOption(options::MINIMUM_SIGNIFICANT_DIGITS, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + int64_t val = getInt64Value(locale, opt, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return static_cast<int32_t>(val); + } + } + } + // Returning -1 indicates that the option wasn't provided or was a non-integer. + // The caller needs to check for that case, since passing -1 to Precision::minSignificantDigits() + // is an error. + return -1; +} + +int32_t StandardFunctions::Number::maximumSignificantDigits(const FunctionOptions& opts) const { + Formattable opt; + + if (opts.getFunctionOption(options::MAXIMUM_SIGNIFICANT_DIGITS, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + int64_t val = getInt64Value(locale, opt, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return static_cast<int32_t>(val); + } + } + // Returning -1 indicates that the option wasn't provided or was a non-integer. + // The caller needs to check for that case, since passing -1 to Precision::maxSignificantDigits() + // is an error. + return -1; // Not a valid value for Precision; has to be checked +} + +bool StandardFunctions::Number::usePercent(const FunctionOptions& opts) const { + Formattable opt; + if (isInteger + || !opts.getFunctionOption(options::STYLE, opt) + || opt.getType() != UFMT_STRING) { + return false; + } + UErrorCode localErrorCode = U_ZERO_ERROR; + const UnicodeString& style = opt.getString(localErrorCode); + U_ASSERT(U_SUCCESS(localErrorCode)); + return (style == options::PERCENT_STRING); +} + +/* static */ StandardFunctions::Number StandardFunctions::Number::integer(const Locale& loc) { + return StandardFunctions::Number(loc, true); +} + +FormattedPlaceholder StandardFunctions::Number::format(FormattedPlaceholder&& arg, FunctionOptions&& opts, UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return {}; + } + + // No argument => return "NaN" + if (!arg.canFormat()) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return notANumber(arg); + } + + number::LocalizedNumberFormatter realFormatter; + realFormatter = formatterForOptions(*this, opts, errorCode); + + number::FormattedNumber numberResult; + int64_t integerValue = 0; + + if (U_SUCCESS(errorCode)) { + // Already checked that contents can be formatted + const Formattable& toFormat = arg.asFormattable(); + switch (toFormat.getType()) { + case UFMT_DOUBLE: { + double d = toFormat.getDouble(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + numberResult = realFormatter.formatDouble(d, errorCode); + integerValue = static_cast<int64_t>(std::round(d)); + break; + } + case UFMT_LONG: { + int32_t l = toFormat.getLong(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + numberResult = realFormatter.formatInt(l, errorCode); + integerValue = l; + break; + } + case UFMT_INT64: { + int64_t i = toFormat.getInt64(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + numberResult = realFormatter.formatInt(i, errorCode); + integerValue = i; + break; + } + case UFMT_STRING: { + // Try to parse the string as a number + double d = parseNumberLiteral(toFormat, errorCode); + if (U_FAILURE(errorCode)) + return {}; + numberResult = realFormatter.formatDouble(d, errorCode); + integerValue = static_cast<int64_t>(std::round(d)); + break; + } + default: { + // Other types can't be parsed as a number + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return notANumber(arg); + } + } + } + + // Need to return the integer value if invoked as :integer + if (isInteger) { + return FormattedPlaceholder(FormattedPlaceholder(Formattable(integerValue), arg.getFallback()), + std::move(opts), + FormattedValue(std::move(numberResult))); + } + return FormattedPlaceholder(arg, std::move(opts), FormattedValue(std::move(numberResult))); +} + +StandardFunctions::Number::~Number() {} +StandardFunctions::NumberFactory::~NumberFactory() {} + +// --------- PluralFactory + +StandardFunctions::Plural::PluralType StandardFunctions::Plural::pluralType(const FunctionOptions& opts) const { + Formattable opt; + + if (opts.getFunctionOption(options::SELECT, opt)) { + UErrorCode localErrorCode = U_ZERO_ERROR; + UnicodeString val = opt.getString(localErrorCode); + if (U_SUCCESS(localErrorCode)) { + if (val == options::ORDINAL) { + return PluralType::PLURAL_ORDINAL; + } + if (val == options::EXACT) { + return PluralType::PLURAL_EXACT; + } + } + } + return PluralType::PLURAL_CARDINAL; +} + +Selector* StandardFunctions::PluralFactory::createSelector(const Locale& locale, UErrorCode& errorCode) const { + NULL_ON_ERROR(errorCode); + + Selector* result; + if (isInteger) { + result = new Plural(Plural::integer(locale, errorCode)); + } else { + result = new Plural(locale, errorCode); + } + NULL_ON_ERROR(errorCode); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, + FunctionOptions&& opts, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& errorCode) const { + CHECK_ERROR(errorCode); + + // No argument => return "NaN" + if (!toFormat.canFormat()) { + errorCode = U_MF_SELECTOR_ERROR; + return; + } + + // Handle any formatting options + PluralType type = pluralType(opts); + FormattedPlaceholder resolvedSelector = numberFormatter->format(std::move(toFormat), + std::move(opts), + errorCode); + CHECK_ERROR(errorCode); + + U_ASSERT(resolvedSelector.isEvaluated() && resolvedSelector.output().isNumber()); + + // See https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#number-selection + // 1. Let exact be the JSON string representation of the numeric value of resolvedSelector + const number::FormattedNumber& formattedNumber = resolvedSelector.output().getNumber(); + UnicodeString exact = formattedNumber.toString(errorCode); + + if (U_FAILURE(errorCode)) { + // Non-number => selector error + errorCode = U_MF_SELECTOR_ERROR; + return; + } + + // Step 2. Let keyword be a string which is the result of rule selection on resolvedSelector. + // If the option select is set to exact, rule-based selection is not used. Return the empty string. + UnicodeString keyword; + if (type != PluralType::PLURAL_EXACT) { + UPluralType t = type == PluralType::PLURAL_ORDINAL ? UPLURAL_TYPE_ORDINAL : UPLURAL_TYPE_CARDINAL; + // Look up plural rules by locale and type + LocalPointer<PluralRules> rules(PluralRules::forLocale(locale, t, errorCode)); + CHECK_ERROR(errorCode); + + keyword = rules->select(formattedNumber, errorCode); + } + + // Steps 3-4 elided: + // 3. Let resultExact be a new empty list of strings. + // 4. Let resultKeyword be a new empty list of strings. + // Instead, we use `prefs` the concatenation of `resultExact` + // and `resultKeyword`. + + prefsLen = 0; + + // 5. For each string key in keys: + double keyAsDouble = 0; + for (int32_t i = 0; i < keysLen; i++) { + // Try parsing the key as a double + UErrorCode localErrorCode = U_ZERO_ERROR; + strToDouble(keys[i], keyAsDouble, localErrorCode); + // 5i. If the value of key matches the production number-literal, then + if (U_SUCCESS(localErrorCode)) { + // 5i(a). If key and exact consist of the same sequence of Unicode code points, then + if (exact == keys[i]) { + // 5i(a)(a) Append key as the last element of the list resultExact. + prefs[prefsLen] = keys[i]; + prefsLen++; + break; + } + } + } + + // Return immediately if exact matching was requested + if (prefsLen == keysLen || type == PluralType::PLURAL_EXACT) { + return; + } + + + for (int32_t i = 0; i < keysLen; i ++) { + if (prefsLen >= keysLen) { + break; + } + // 5ii. Else if key is one of the keywords zero, one, two, few, many, or other, then + // 5ii(a). If key and keyword consist of the same sequence of Unicode code points, then + if (keyword == keys[i]) { + // 5ii(a)(a) Append key as the last element of the list resultKeyword. + prefs[prefsLen] = keys[i]; + prefsLen++; + } + } + + // Note: Step 5(iii) "Else, emit a Selection Error" is omitted in both loops + + // 6. Return a new list whose elements are the concatenation of the elements + // (in order) of resultExact followed by the elements (in order) of resultKeyword. + // (Implicit, since `prefs` is an out-parameter) +} + +StandardFunctions::Plural::Plural(const Locale& loc, UErrorCode& status) : locale(loc) { + CHECK_ERROR(status); + + numberFormatter.adoptInstead(new StandardFunctions::Number(loc)); + if (!numberFormatter.isValid()) { + status = U_MEMORY_ALLOCATION_ERROR; + } +} + +StandardFunctions::Plural::Plural(const Locale& loc, bool isInt, UErrorCode& status) : locale(loc), isInteger(isInt) { + CHECK_ERROR(status); + + if (isInteger) { + numberFormatter.adoptInstead(new StandardFunctions::Number(loc, true)); + } else { + numberFormatter.adoptInstead(new StandardFunctions::Number(loc)); + } + + if (!numberFormatter.isValid()) { + status = U_MEMORY_ALLOCATION_ERROR; + } +} + +StandardFunctions::Plural::~Plural() {} + +StandardFunctions::PluralFactory::~PluralFactory() {} + +// --------- DateTimeFactory + +/* static */ UnicodeString StandardFunctions::getStringOption(const FunctionOptions& opts, + std::u16string_view optionName, + UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + Formattable opt; + if (opts.getFunctionOption(optionName, opt)) { + return opt.getString(errorCode); // In case it's not a string, error code will be set + } else { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + } + // Default is empty string + return {}; +} + +// Date/time options only +static UnicodeString defaultForOption(std::u16string_view optionName) { + if (optionName == options::DATE_STYLE + || optionName == options::TIME_STYLE + || optionName == options::STYLE) { + return UnicodeString(options::SHORT); + } + return {}; // Empty string is default +} + +// TODO +// Only DateTime currently uses the function options stored in the placeholder. +// It also doesn't use them very consistently (it looks at the previous set of options, +// and others aren't preserved). This needs to be generalized, +// but that depends on https://github.com/unicode-org/message-format-wg/issues/515 +// Finally, the option value is assumed to be a string, +// which works for datetime options but not necessarily in general. +UnicodeString StandardFunctions::DateTime::getFunctionOption(const FormattedPlaceholder& toFormat, + const FunctionOptions& opts, + std::u16string_view optionName) const { + // Options passed to the current function invocation take priority + Formattable opt; + UnicodeString s; + UErrorCode localErrorCode = U_ZERO_ERROR; + s = getStringOption(opts, optionName, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return s; + } + // Next try the set of options used to construct `toFormat` + localErrorCode = U_ZERO_ERROR; + s = getStringOption(toFormat.options(), optionName, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return s; + } + // Finally, use default + return defaultForOption(optionName); +} + +// Used for options that don't have defaults +UnicodeString StandardFunctions::DateTime::getFunctionOption(const FormattedPlaceholder& toFormat, + const FunctionOptions& opts, + std::u16string_view optionName, + UErrorCode& errorCode) const { + if (U_SUCCESS(errorCode)) { + // Options passed to the current function invocation take priority + Formattable opt; + UnicodeString s; + UErrorCode localErrorCode = U_ZERO_ERROR; + s = getStringOption(opts, optionName, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return s; + } + // Next try the set of options used to construct `toFormat` + localErrorCode = U_ZERO_ERROR; + s = getStringOption(toFormat.options(), optionName, localErrorCode); + if (U_SUCCESS(localErrorCode)) { + return s; + } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return {}; +} + +static DateFormat::EStyle stringToStyle(UnicodeString option, UErrorCode& errorCode) { + if (U_SUCCESS(errorCode)) { + UnicodeString upper = option.toUpper(); + if (upper == options::FULL_UPPER) { + return DateFormat::EStyle::kFull; + } + if (upper == options::LONG_UPPER) { + return DateFormat::EStyle::kLong; + } + if (upper == options::MEDIUM_UPPER) { + return DateFormat::EStyle::kMedium; + } + if (upper == options::SHORT_UPPER) { + return DateFormat::EStyle::kShort; + } + if (upper.isEmpty() || upper == options::DEFAULT_UPPER) { + return DateFormat::EStyle::kDefault; + } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return DateFormat::EStyle::kNone; +} + +/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::dateTime(UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + DateTimeFactory* result = new StandardFunctions::DateTimeFactory(DateTimeType::DateTime); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::date(UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + DateTimeFactory* result = new DateTimeFactory(DateTimeType::Date); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::time(UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + DateTimeFactory* result = new DateTimeFactory(DateTimeType::Time); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +Formatter* StandardFunctions::DateTimeFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + Formatter* result = new StandardFunctions::DateTime(locale, type); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +// DateFormat parsers that are shared across threads +static DateFormat* dateParser = nullptr; +static DateFormat* dateTimeParser = nullptr; +static DateFormat* dateTimeUTCParser = nullptr; +static DateFormat* dateTimeZoneParser = nullptr; +static icu::UInitOnce gMF2DateParsersInitOnce {}; + +// Clean up shared DateFormat objects +static UBool mf2_date_parsers_cleanup() { + if (dateParser != nullptr) { + delete dateParser; + dateParser = nullptr; + } + if (dateTimeParser != nullptr) { + delete dateTimeParser; + dateTimeParser = nullptr; + } + if (dateTimeUTCParser != nullptr) { + delete dateTimeUTCParser; + dateTimeUTCParser = nullptr; + } + if (dateTimeZoneParser != nullptr) { + delete dateTimeZoneParser; + dateTimeZoneParser = nullptr; + } + return true; +} + +// Initialize DateFormat objects used for parsing date literals +static void initDateParsersOnce(UErrorCode& errorCode) { + U_ASSERT(dateParser == nullptr); + U_ASSERT(dateTimeParser == nullptr); + U_ASSERT(dateTimeUTCParser == nullptr); + U_ASSERT(dateTimeZoneParser == nullptr); + + // Handles ISO 8601 date + dateParser = new SimpleDateFormat(UnicodeString("YYYY-MM-dd"), errorCode); + // Handles ISO 8601 datetime without time zone + dateTimeParser = new SimpleDateFormat(UnicodeString("YYYY-MM-dd'T'HH:mm:ss"), errorCode); + // Handles ISO 8601 datetime with 'Z' to denote UTC + dateTimeUTCParser = new SimpleDateFormat(UnicodeString("YYYY-MM-dd'T'HH:mm:ssZ"), errorCode); + // Handles ISO 8601 datetime with timezone offset; 'zzzz' denotes timezone offset + dateTimeZoneParser = new SimpleDateFormat(UnicodeString("YYYY-MM-dd'T'HH:mm:sszzzz"), errorCode); + + if (!dateParser || !dateTimeParser || !dateTimeUTCParser || !dateTimeZoneParser) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + mf2_date_parsers_cleanup(); + return; + } + ucln_i18n_registerCleanup(UCLN_I18N_MF2_DATE_PARSERS, mf2_date_parsers_cleanup); +} + +// Lazily initialize DateFormat objects used for parsing date literals +static void initDateParsers(UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + umtx_initOnce(gMF2DateParsersInitOnce, &initDateParsersOnce, errorCode); +} + +// From https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#date-and-time-operands : +// "A date/time literal value is a non-empty string consisting of an ISO 8601 date, or +// an ISO 8601 datetime optionally followed by a timezone offset." +UDate StandardFunctions::DateTime::tryPatterns(const UnicodeString& sourceStr, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return 0; + } + // Handle ISO 8601 datetime (tryTimeZonePatterns() handles the case + // where a timezone offset follows) + if (sourceStr.length() > 10) { + return dateTimeParser->parse(sourceStr, errorCode); + } + // Handle ISO 8601 date + return dateParser->parse(sourceStr, errorCode); +} + +// See comment on tryPatterns() for spec reference +UDate StandardFunctions::DateTime::tryTimeZonePatterns(const UnicodeString& sourceStr, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return 0; + } + int32_t len = sourceStr.length(); + if (len > 0 && sourceStr[len] == 'Z') { + return dateTimeUTCParser->parse(sourceStr, errorCode); + } + return dateTimeZoneParser->parse(sourceStr, errorCode); +} + +static TimeZone* createTimeZone(const DateInfo& dateInfo, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + TimeZone* tz; + if (dateInfo.zoneId.isEmpty()) { + // Floating time value -- use default time zone + tz = TimeZone::createDefault(); + } else { + tz = TimeZone::createTimeZone(dateInfo.zoneId); + } + if (tz == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return tz; +} + +// Returns true iff `sourceStr` ends in an offset like +03:30 or -06:00 +// (This function is just used to determine whether to call tryPatterns() +// or tryTimeZonePatterns(); tryTimeZonePatterns() checks fully that the +// string matches the expected format) +static bool hasTzOffset(const UnicodeString& sourceStr) { + int32_t len = sourceStr.length(); + + if (len <= 6) { + return false; + } + return ((sourceStr[len - 6] == PLUS || sourceStr[len - 6] == HYPHEN) + && sourceStr[len - 3] == COLON); +} + +// Note: `calendar` option to :datetime not implemented yet; +// Gregorian calendar is assumed +DateInfo StandardFunctions::DateTime::createDateInfoFromString(const UnicodeString& sourceStr, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return {}; + } + + UDate absoluteDate; + + // Check if the string has a time zone part + int32_t indexOfZ = sourceStr.indexOf('Z'); + int32_t indexOfPlus = sourceStr.lastIndexOf('+'); + int32_t indexOfMinus = sourceStr.lastIndexOf('-'); + int32_t indexOfSign = indexOfPlus > -1 ? indexOfPlus : indexOfMinus; + bool isTzOffset = hasTzOffset(sourceStr); + bool isGMT = indexOfZ > 0; + UnicodeString offsetPart; + bool hasTimeZone = isTzOffset || isGMT; + + if (!hasTimeZone) { + // No time zone; parse the date and time + absoluteDate = tryPatterns(sourceStr, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } else { + // Try to split into time zone and non-time-zone parts + UnicodeString dateTimePart; + if (isGMT) { + dateTimePart = sourceStr.tempSubString(0, indexOfZ); + } else { + dateTimePart = sourceStr.tempSubString(0, indexOfSign); + } + // Parse the date from the date/time part + tryPatterns(dateTimePart, errorCode); + // Failure -- can't parse this string + if (U_FAILURE(errorCode)) { + return {}; + } + // Success -- now parse the time zone part + if (isGMT) { + dateTimePart += UnicodeString("GMT"); + absoluteDate = tryTimeZonePatterns(dateTimePart, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } else { + // Try to parse time zone in offset format: [+-]nn:nn + absoluteDate = tryTimeZonePatterns(sourceStr, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + offsetPart = sourceStr.tempSubString(indexOfSign, sourceStr.length()); + } + } + + // If the time zone was provided, get its canonical ID, + // in order to return it in the DateInfo + UnicodeString canonicalID; + if (hasTimeZone) { + UnicodeString tzID("GMT"); + if (!isGMT) { + tzID += offsetPart; + } + TimeZone::getCanonicalID(tzID, canonicalID, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } + + return { absoluteDate, canonicalID }; +} + +void formatDateWithDefaults(const Locale& locale, + const DateInfo& dateInfo, + UnicodeString& result, + UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + LocalPointer<DateFormat> df(defaultDateTimeInstance(locale, errorCode)); + CHECK_ERROR(errorCode); + + df->adoptTimeZone(createTimeZone(dateInfo, errorCode)); + CHECK_ERROR(errorCode); + df->format(dateInfo.date, result, nullptr, errorCode); +} + +FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& toFormat, + FunctionOptions&& opts, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return {}; + } + + // Argument must be present + if (!toFormat.canFormat()) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return std::move(toFormat); + } + + LocalPointer<DateFormat> df; + Formattable opt; + + DateFormat::EStyle dateStyle = DateFormat::kShort; + DateFormat::EStyle timeStyle = DateFormat::kShort; + + UnicodeString dateStyleName("dateStyle"); + UnicodeString timeStyleName("timeStyle"); + UnicodeString styleName("style"); + + bool hasDateStyleOption = opts.getFunctionOption(dateStyleName, opt); + bool hasTimeStyleOption = opts.getFunctionOption(timeStyleName, opt); + bool noOptions = opts.optionsCount() == 0; + + bool useStyle = (type == DateTimeFactory::DateTimeType::DateTime + && (hasDateStyleOption || hasTimeStyleOption + || noOptions)) + || (type != DateTimeFactory::DateTimeType::DateTime); + + bool useDate = type == DateTimeFactory::DateTimeType::Date + || (type == DateTimeFactory::DateTimeType::DateTime + && hasDateStyleOption); + bool useTime = type == DateTimeFactory::DateTimeType::Time + || (type == DateTimeFactory::DateTimeType::DateTime + && hasTimeStyleOption); + + if (useStyle) { + // Extract style options + if (type == DateTimeFactory::DateTimeType::DateTime) { + // Note that the options-getting has to be repeated across the three cases, + // since `:datetime` uses "dateStyle"/"timeStyle" and `:date` and `:time` + // use "style" + dateStyle = stringToStyle(getFunctionOption(toFormat, opts, dateStyleName), errorCode); + timeStyle = stringToStyle(getFunctionOption(toFormat, opts, timeStyleName), errorCode); + + if (useDate && !useTime) { + df.adoptInstead(DateFormat::createDateInstance(dateStyle, locale)); + } else if (useTime && !useDate) { + df.adoptInstead(DateFormat::createTimeInstance(timeStyle, locale)); + } else { + df.adoptInstead(DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale)); + } + } else if (type == DateTimeFactory::DateTimeType::Date) { + dateStyle = stringToStyle(getFunctionOption(toFormat, opts, styleName), errorCode); + df.adoptInstead(DateFormat::createDateInstance(dateStyle, locale)); + } else { + // :time + timeStyle = stringToStyle(getFunctionOption(toFormat, opts, styleName), errorCode); + df.adoptInstead(DateFormat::createTimeInstance(timeStyle, locale)); + } + } else { + // Build up a skeleton based on the field options, then use that to + // create the date formatter + + UnicodeString skeleton; + #define ADD_PATTERN(s) skeleton += UnicodeString(s) + if (U_SUCCESS(errorCode)) { + // Year + UnicodeString year = getFunctionOption(toFormat, opts, options::YEAR, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useDate = true; + if (year == options::TWO_DIGIT) { + ADD_PATTERN("YY"); + } else if (year == options::NUMERIC) { + ADD_PATTERN("YYYY"); + } + } + // Month + UnicodeString month = getFunctionOption(toFormat, opts, options::MONTH, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useDate = true; + /* numeric, 2-digit, long, short, narrow */ + if (month == options::LONG) { + ADD_PATTERN("MMMM"); + } else if (month == options::SHORT) { + ADD_PATTERN("MMM"); + } else if (month == options::NARROW) { + ADD_PATTERN("MMMMM"); + } else if (month == options::NUMERIC) { + ADD_PATTERN("M"); + } else if (month == options::TWO_DIGIT) { + ADD_PATTERN("MM"); + } + } + // Weekday + UnicodeString weekday = getFunctionOption(toFormat, opts, options::WEEKDAY, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useDate = true; + if (weekday == options::LONG) { + ADD_PATTERN("EEEE"); + } else if (weekday == options::SHORT) { + ADD_PATTERN("EEEEE"); + } else if (weekday == options::NARROW) { + ADD_PATTERN("EEEEE"); + } + } + // Day + UnicodeString day = getFunctionOption(toFormat, opts, options::DAY, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useDate = true; + if (day == options::NUMERIC) { + ADD_PATTERN("d"); + } else if (day == options::TWO_DIGIT) { + ADD_PATTERN("dd"); + } + } + // Hour + UnicodeString hour = getFunctionOption(toFormat, opts, options::HOUR, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useTime = true; + if (hour == options::NUMERIC) { + ADD_PATTERN("h"); + } else if (hour == options::TWO_DIGIT) { + ADD_PATTERN("hh"); + } + } + // Minute + UnicodeString minute = getFunctionOption(toFormat, opts, options::MINUTE, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useTime = true; + if (minute == options::NUMERIC) { + ADD_PATTERN("m"); + } else if (minute == options::TWO_DIGIT) { + ADD_PATTERN("mm"); + } + } + // Second + UnicodeString second = getFunctionOption(toFormat, opts, options::SECOND, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_ZERO_ERROR; + } else { + useTime = true; + if (second == options::NUMERIC) { + ADD_PATTERN("s"); + } else if (second == options::TWO_DIGIT) { + ADD_PATTERN("ss"); + } + } + } + /* + TODO + fractionalSecondDigits + hourCycle + timeZoneName + era + */ + df.adoptInstead(DateFormat::createInstanceForSkeleton(skeleton, errorCode)); + } + + if (U_FAILURE(errorCode)) { + return {}; + } + if (!df.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return {}; + } + + UnicodeString result; + const Formattable& source = toFormat.asFormattable(); + switch (source.getType()) { + case UFMT_STRING: { + // Lazily initialize date parsers used for parsing date literals + initDateParsers(errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + + const UnicodeString& sourceStr = source.getString(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + + DateInfo dateInfo = createDateInfoFromString(sourceStr, errorCode); + if (U_FAILURE(errorCode)) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return {}; + } + df->adoptTimeZone(createTimeZone(dateInfo, errorCode)); + + // Use the parsed date as the source value + // in the returned FormattedPlaceholder; this is necessary + // so the date can be re-formatted + df->format(dateInfo.date, result, 0, errorCode); + toFormat = FormattedPlaceholder(message2::Formattable(std::move(dateInfo)), + toFormat.getFallback()); + break; + } + case UFMT_DATE: { + const DateInfo* dateInfo = source.getDate(errorCode); + if (U_SUCCESS(errorCode)) { + // If U_SUCCESS(errorCode), then source.getDate() returned + // a non-null pointer + df->adoptTimeZone(createTimeZone(*dateInfo, errorCode)); + df->format(dateInfo->date, result, 0, errorCode); + if (U_FAILURE(errorCode)) { + if (errorCode == U_ILLEGAL_ARGUMENT_ERROR) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + } + } + } + break; + } + // Any other cases are an error + default: { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + break; + } + } + if (U_FAILURE(errorCode)) { + return {}; + } + return FormattedPlaceholder(toFormat, std::move(opts), FormattedValue(std::move(result))); +} + +StandardFunctions::DateTimeFactory::~DateTimeFactory() {} +StandardFunctions::DateTime::~DateTime() {} + +// --------- TextFactory + +Selector* StandardFunctions::TextFactory::createSelector(const Locale& locale, UErrorCode& errorCode) const { + Selector* result = new TextSelector(locale); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return result; +} + +void StandardFunctions::TextSelector::selectKey(FormattedPlaceholder&& toFormat, + FunctionOptions&& opts, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& errorCode) const { + // No options + (void) opts; + + CHECK_ERROR(errorCode); + + // Just compares the key and value as strings + + // Argument must be present + if (!toFormat.canFormat()) { + errorCode = U_MF_SELECTOR_ERROR; + return; + } + + prefsLen = 0; + + // Convert to string + const UnicodeString& formattedValue = toFormat.formatToString(locale, errorCode); + if (U_FAILURE(errorCode)) { + return; + } + // Normalize result + UnicodeString normalized = normalizeNFC(formattedValue); + + for (int32_t i = 0; i < keysLen; i++) { + if (keys[i] == normalized) { + prefs[0] = keys[i]; + prefsLen = 1; + break; + } + } +} + +StandardFunctions::TextFactory::~TextFactory() {} +StandardFunctions::TextSelector::~TextSelector() {} + +// ------------ TestFormatFactory + +Formatter* StandardFunctions::TestFormatFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + // Results are not locale-dependent + (void) locale; + + Formatter* result = new TestFormat(); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +StandardFunctions::TestFormatFactory::~TestFormatFactory() {} +StandardFunctions::TestFormat::~TestFormat() {} + +// Extract numeric value from a Formattable or, if it's a string, +// parse it as a number according to the MF2 `number-literal` grammar production +double formattableToNumber(const Formattable& arg, UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + + double result = 0; + + switch (arg.getType()) { + case UFMT_DOUBLE: { + result = arg.getDouble(status); + U_ASSERT(U_SUCCESS(status)); + break; + } + case UFMT_LONG: { + result = (double) arg.getLong(status); + U_ASSERT(U_SUCCESS(status)); + break; + } + case UFMT_INT64: { + result = (double) arg.getInt64(status); + U_ASSERT(U_SUCCESS(status)); + break; + } + case UFMT_STRING: { + // Try to parse the string as a number + result = parseNumberLiteral(arg, status); + if (U_FAILURE(status)) { + status = U_MF_OPERAND_MISMATCH_ERROR; + } + break; + } + default: { + // Other types can't be parsed as a number + status = U_MF_OPERAND_MISMATCH_ERROR; + break; + } + } + return result; +} + + +/* static */ void StandardFunctions::TestFormat::testFunctionParameters(const FormattedPlaceholder& arg, + const FunctionOptions& options, + int32_t& decimalPlaces, + bool& failsFormat, + bool& failsSelect, + double& input, + UErrorCode& status) { + CHECK_ERROR(status); + + // 1. Let DecimalPlaces be 0. + decimalPlaces = 0; + + // 2. Let FailsFormat be false. + failsFormat = false; + + // 3. Let FailsSelect be false. + failsSelect = false; + + // 4. Let arg be the resolved value of the expression operand. + // (already true) + + // Step 5 omitted because composition isn't fully implemented yet + // 6. Else if arg is a numerical value or a string matching the number-literal production, then + input = formattableToNumber(arg.asFormattable(), status); + if (U_FAILURE(status)) { + // 7. Else, + // 7i. Emit "bad-input" Resolution Error. + status = U_MF_OPERAND_MISMATCH_ERROR; + // 7ii. Use a fallback value as the resolved value of the expression. + // Further steps of this algorithm are not followed. + } + // 8. If the decimalPlaces option is set, then + Formattable opt; + if (options.getFunctionOption(options::DECIMAL_PLACES, opt)) { + // 8i. If its value resolves to a numerical integer value 0 or 1 + // or their corresponding string representations '0' or '1', then + double decimalPlacesInput = formattableToNumber(opt, status); + if (U_SUCCESS(status)) { + if (decimalPlacesInput == 0 || decimalPlacesInput == 1) { + // 8ia. Set DecimalPlaces to be the numerical value of the option. + decimalPlaces = decimalPlacesInput; + } + } + // 8ii. Else if its value is not an unresolved value set by option resolution, + else { + // 8iia. Emit "bad-option" Resolution Error. + status = U_MF_BAD_OPTION; + // 8iib. Use a fallback value as the resolved value of the expression. + } + } + // 9. If the fails option is set, then + Formattable failsOpt; + if (options.getFunctionOption(options::FAILS, failsOpt)) { + UnicodeString failsString = failsOpt.getString(status); + if (U_SUCCESS(status)) { + // 9i. If its value resolves to the string 'always', then + if (failsString == u"always") { + // 9ia. Set FailsFormat to be true + failsFormat = true; + // 9ib. Set FailsSelect to be true. + failsSelect = true; + } + // 9ii. Else if its value resolves to the string "format", then + else if (failsString == u"format") { + // 9ia. Set FailsFormat to be true + failsFormat = true; + } + // 9iii. Else if its value resolves to the string "select", then + else if (failsString == u"select") { + // 9iiia. Set FailsSelect to be true. + failsSelect = true; + } + // 9iv. Else if its value does not resolve to the string "never", then + else if (failsString != u"never") { + // 9iv(a). Emit "bad-option" Resolution Error. + status = U_MF_BAD_OPTION; + } + } else { + // 9iv. again + status = U_MF_BAD_OPTION; + } + } +} + +FormattedPlaceholder StandardFunctions::TestFormat::format(FormattedPlaceholder&& arg, + FunctionOptions&& options, + UErrorCode& status) const{ + + int32_t decimalPlaces; + bool failsFormat; + bool failsSelect; + double input; + + testFunctionParameters(arg, options, decimalPlaces, + failsFormat, failsSelect, input, status); + if (U_FAILURE(status)) { + return FormattedPlaceholder(arg.getFallback()); + } + + // If FailsFormat is true, attempting to format the placeholder to any + // formatting target will fail. + if (failsFormat) { + status = U_MF_FORMATTING_ERROR; + return FormattedPlaceholder(arg.getFallback()); + } + UnicodeString result; + // When :test:function is used as a formatter, a placeholder resolving to a value + // with a :test:function expression is formatted as a concatenation of the following parts: + // 1. If Input is less than 0, the character - U+002D Hyphen-Minus. + if (input < 0) { + result += HYPHEN; + } + // 2. The truncated absolute integer value of Input, i.e. floor(abs(Input)), formatted as a + // sequence of decimal digit characters (U+0030...U+0039). + char buffer[256]; + bool ignore; + int ignoreLen; + int ignorePoint; + double_conversion::DoubleToStringConverter::DoubleToAscii(floor(abs(input)), + double_conversion::DoubleToStringConverter::DtoaMode::SHORTEST, + 0, + buffer, + 256, + &ignore, + &ignoreLen, + &ignorePoint); + result += UnicodeString(buffer); + // 3. If DecimalPlaces is 1, then + if (decimalPlaces == 1) { + // 3i. The character . U+002E Full Stop. + result += u"."; + // 3ii. The single decimal digit character representing the value + // floor((abs(Input) - floor(abs(Input))) * 10) + int32_t val = floor((abs(input) - floor(abs(input)) * 10)); + result += digitToChar(val, status); + U_ASSERT(U_SUCCESS(status)); + } + return FormattedPlaceholder(result); +} + +// ------------ TestSelectFactory + +StandardFunctions::TestSelectFactory::~TestSelectFactory() {} +StandardFunctions::TestSelect::~TestSelect() {} + +Selector* StandardFunctions::TestSelectFactory::createSelector(const Locale& locale, + UErrorCode& errorCode) const { + NULL_ON_ERROR(errorCode); + + // Results are not locale-dependent + (void) locale; + + Selector* result = new TestSelect(); + if (result == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +void StandardFunctions::TestSelect::selectKey(FormattedPlaceholder&& val, + FunctionOptions&& options, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& status) const { + int32_t decimalPlaces; + bool failsFormat; + bool failsSelect; + double input; + + TestFormat::testFunctionParameters(val, options, decimalPlaces, + failsFormat, failsSelect, input, status); + + if (U_FAILURE(status)) { + return; + } + + if (failsSelect) { + status = U_MF_SELECTOR_ERROR; + return; + } + + // If the Input is 1 and DecimalPlaces is 1, the method will return some slice + // of the list « '1.0', '1' », depending on whether those values are included in keys. + bool include1point0 = false; + bool include1 = false; + if (input == 1 && decimalPlaces == 1) { + include1point0 = true; + include1 = true; + } else if (input == 1 && decimalPlaces == 0) { + include1 = true; + } + + // If the Input is 1 and DecimalPlaces is 0, the method will return the list « '1' » if + // keys includes '1', or an empty list otherwise. + // If the Input is any other value, the method will return an empty list. + for (int32_t i = 0; i < keysLen; i++) { + if ((keys[i] == u"1" && include1) + || (keys[i] == u"1.0" && include1point0)) { + prefs[prefsLen] = keys[i]; + prefsLen++; + } + } +} + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h b/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h new file mode 100644 index 00000000000000..25d2a467502d76 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h @@ -0,0 +1,353 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_FUNCTION_REGISTRY_INTERNAL_H +#define MESSAGEFORMAT2_FUNCTION_REGISTRY_INTERNAL_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/datefmt.h" +#include "unicode/messageformat2_function_registry.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + +// Constants for option names +namespace options { +static constexpr std::u16string_view ALWAYS = u"always"; +static constexpr std::u16string_view COMPACT = u"compact"; +static constexpr std::u16string_view COMPACT_DISPLAY = u"compactDisplay"; +static constexpr std::u16string_view DATE_STYLE = u"dateStyle"; +static constexpr std::u16string_view DAY = u"day"; +static constexpr std::u16string_view DECIMAL_PLACES = u"decimalPlaces"; +static constexpr std::u16string_view DEFAULT_UPPER = u"DEFAULT"; +static constexpr std::u16string_view ENGINEERING = u"engineering"; +static constexpr std::u16string_view EXACT = u"exact"; +static constexpr std::u16string_view EXCEPT_ZERO = u"exceptZero"; +static constexpr std::u16string_view FAILS = u"fails"; +static constexpr std::u16string_view FULL_UPPER = u"FULL"; +static constexpr std::u16string_view HOUR = u"hour"; +static constexpr std::u16string_view LONG = u"long"; +static constexpr std::u16string_view LONG_UPPER = u"LONG"; +static constexpr std::u16string_view MAXIMUM_FRACTION_DIGITS = u"maximumFractionDigits"; +static constexpr std::u16string_view MAXIMUM_SIGNIFICANT_DIGITS = u"maximumSignificantDigits"; +static constexpr std::u16string_view MEDIUM_UPPER = u"MEDIUM"; +static constexpr std::u16string_view MIN2 = u"min2"; +static constexpr std::u16string_view MINIMUM_FRACTION_DIGITS = u"minimumFractionDigits"; +static constexpr std::u16string_view MINIMUM_INTEGER_DIGITS = u"minimumIntegerDigits"; +static constexpr std::u16string_view MINIMUM_SIGNIFICANT_DIGITS = u"minimumSignificantDigits"; +static constexpr std::u16string_view MINUTE = u"minute"; +static constexpr std::u16string_view MONTH = u"month"; +static constexpr std::u16string_view NARROW = u"narrow"; +static constexpr std::u16string_view NEGATIVE = u"negative"; +static constexpr std::u16string_view NEVER = u"never"; +static constexpr std::u16string_view NOTATION = u"notation"; +static constexpr std::u16string_view NUMBERING_SYSTEM = u"numberingSystem"; +static constexpr std::u16string_view NUMERIC = u"numeric"; +static constexpr std::u16string_view ORDINAL = u"ordinal"; +static constexpr std::u16string_view PERCENT_STRING = u"percent"; +static constexpr std::u16string_view SCIENTIFIC = u"scientific"; +static constexpr std::u16string_view SECOND = u"second"; +static constexpr std::u16string_view SELECT = u"select"; +static constexpr std::u16string_view SHORT = u"short"; +static constexpr std::u16string_view SHORT_UPPER = u"SHORT"; +static constexpr std::u16string_view SIGN_DISPLAY = u"signDisplay"; +static constexpr std::u16string_view STYLE = u"style"; +static constexpr std::u16string_view TIME_STYLE = u"timeStyle"; +static constexpr std::u16string_view TWO_DIGIT = u"2-digit"; +static constexpr std::u16string_view USE_GROUPING = u"useGrouping"; +static constexpr std::u16string_view WEEKDAY = u"weekday"; +static constexpr std::u16string_view YEAR = u"year"; +} // namespace options + + // Built-in functions + /* + The standard functions are :datetime, :date, :time, + :number, :integer, and :string, + per https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md + as of https://github.com/unicode-org/message-format-wg/releases/tag/LDML45-alpha + */ + class StandardFunctions { + friend class MessageFormatter; + + public: + // Used for normalizing variable names and keys for comparison + static UnicodeString normalizeNFC(const UnicodeString&); + + private: + static void validateDigitSizeOptions(const FunctionOptions&, UErrorCode&); + static void checkSelectOption(const FunctionOptions&, UErrorCode&); + static UnicodeString getStringOption(const FunctionOptions& opts, + std::u16string_view optionName, + UErrorCode& errorCode); + + class DateTime; + + class DateTimeFactory : public FormatterFactory { + public: + Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; + static DateTimeFactory* date(UErrorCode&); + static DateTimeFactory* time(UErrorCode&); + static DateTimeFactory* dateTime(UErrorCode&); + DateTimeFactory() = delete; + virtual ~DateTimeFactory(); + + private: + friend class DateTime; + + typedef enum DateTimeType { + Date, + Time, + DateTime + } DateTimeType; + + DateTimeType type; + DateTimeFactory(DateTimeType t) : type(t) {} + }; + + class DateTime : public Formatter { + public: + FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; + virtual ~DateTime(); + + private: + const Locale& locale; + const DateTimeFactory::DateTimeType type; + friend class DateTimeFactory; + DateTime(const Locale& l, DateTimeFactory::DateTimeType t) + : locale(l), type(t) {} + const LocalPointer<icu::DateFormat> icuFormatter; + + // Methods for parsing date literals + UDate tryPatterns(const UnicodeString&, UErrorCode&) const; + UDate tryTimeZonePatterns(const UnicodeString&, UErrorCode&) const; + DateInfo createDateInfoFromString(const UnicodeString&, UErrorCode&) const; + + /* + Looks up an option by name, first checking `opts`, then the cached options + in `toFormat` if applicable, and finally using a default + + Ignores any options with non-string values + */ + UnicodeString getFunctionOption(const FormattedPlaceholder& toFormat, + const FunctionOptions& opts, + std::u16string_view optionName) const; + // Version for options that don't have defaults; sets the error + // code instead of returning a default value + UnicodeString getFunctionOption(const FormattedPlaceholder& toFormat, + const FunctionOptions& opts, + std::u16string_view optionName, + UErrorCode& errorCode) const; + + }; + + // Note: IntegerFactory doesn't implement SelectorFactory; + // instead, an instance of PluralFactory is registered to the integer + // selector + // TODO + class IntegerFactory : public FormatterFactory { + public: + Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; + virtual ~IntegerFactory(); + }; + + class NumberFactory : public FormatterFactory { + public: + Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; + virtual ~NumberFactory(); + private: + friend class IntegerFactory; + static NumberFactory integer(const Locale& locale, UErrorCode& status); + }; + + class Number : public Formatter { + public: + FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; + virtual ~Number(); + + private: + friend class NumberFactory; + friend class StandardFunctions; + + Number(const Locale& loc) : locale(loc), icuFormatter(number::NumberFormatter::withLocale(loc)) {} + Number(const Locale& loc, bool isInt) : locale(loc), isInteger(isInt), icuFormatter(number::NumberFormatter::withLocale(loc)) {} + static Number integer(const Locale& loc); + + // These options have their own accessor methods, since they have different default values. + int32_t maximumFractionDigits(const FunctionOptions& options) const; + int32_t minimumFractionDigits(const FunctionOptions& options) const; + int32_t minimumSignificantDigits(const FunctionOptions& options) const; + int32_t maximumSignificantDigits(const FunctionOptions& options) const; + int32_t minimumIntegerDigits(const FunctionOptions& options) const; + + bool usePercent(const FunctionOptions& options) const; + const Locale& locale; + const bool isInteger = false; + const number::LocalizedNumberFormatter icuFormatter; + }; + + static number::LocalizedNumberFormatter formatterForOptions(const Number& number, + const FunctionOptions& opts, + UErrorCode& status); + + class PluralFactory : public SelectorFactory { + public: + Selector* createSelector(const Locale& locale, UErrorCode& status) const override; + virtual ~PluralFactory(); + + private: + friend class IntegerFactory; + friend class MessageFormatter; + + PluralFactory() {} + PluralFactory(bool isInt) : isInteger(isInt) {} + static PluralFactory integer() { return PluralFactory(true);} + const bool isInteger = false; + }; + + class Plural : public Selector { + public: + void selectKey(FormattedPlaceholder&& val, + FunctionOptions&& options, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& status) const override; + virtual ~Plural(); + + private: + friend class IntegerFactory; + friend class PluralFactory; + + // Can't use UPluralType for this since we want to include + // exact matching as an option + typedef enum PluralType { + PLURAL_ORDINAL, + PLURAL_CARDINAL, + PLURAL_EXACT + } PluralType; + Plural(const Locale& loc, UErrorCode& errorCode); + Plural(const Locale& loc, bool isInt, UErrorCode& errorCode); + static Plural integer(const Locale& loc, UErrorCode& errorCode) { return Plural(loc, true, errorCode); } + PluralType pluralType(const FunctionOptions& opts) const; + const Locale& locale; + const bool isInteger = false; + LocalPointer<StandardFunctions::Number> numberFormatter; + }; + + class TextFactory : public SelectorFactory { + public: + Selector* createSelector(const Locale& locale, UErrorCode& status) const override; + virtual ~TextFactory(); + }; + + class TextSelector : public Selector { + public: + void selectKey(FormattedPlaceholder&& val, + FunctionOptions&& options, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& status) const override; + virtual ~TextSelector(); + + private: + friend class TextFactory; + + // Formatting `value` to a string might require the locale + const Locale& locale; + + TextSelector(const Locale& l) : locale(l) {} + }; + + // See https://github.com/unicode-org/message-format-wg/blob/main/test/README.md + class TestFormatFactory : public FormatterFactory { + public: + Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; + TestFormatFactory() {} + virtual ~TestFormatFactory(); + }; + + class TestSelect; + + class TestFormat : public Formatter { + public: + FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; + virtual ~TestFormat(); + + private: + friend class TestFormatFactory; + friend class TestSelect; + TestFormat() {} + static void testFunctionParameters(const FormattedPlaceholder& arg, + const FunctionOptions& options, + int32_t& decimalPlaces, + bool& failsFormat, + bool& failsSelect, + double& input, + UErrorCode& status); + + }; + + // See https://github.com/unicode-org/message-format-wg/blob/main/test/README.md + class TestSelectFactory : public SelectorFactory { + public: + Selector* createSelector(const Locale& locale, UErrorCode& status) const override; + TestSelectFactory() {} + virtual ~TestSelectFactory(); + }; + + class TestSelect : public Selector { + public: + void selectKey(FormattedPlaceholder&& val, + FunctionOptions&& options, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& status) const override; + virtual ~TestSelect(); + + private: + friend class TestSelectFactory; + TestSelect() {} + }; + + }; + + extern void formatDateWithDefaults(const Locale& locale, const DateInfo& date, UnicodeString&, UErrorCode& errorCode); + extern number::FormattedNumber formatNumberWithDefaults(const Locale& locale, double toFormat, UErrorCode& errorCode); + extern number::FormattedNumber formatNumberWithDefaults(const Locale& locale, int32_t toFormat, UErrorCode& errorCode); + extern number::FormattedNumber formatNumberWithDefaults(const Locale& locale, int64_t toFormat, UErrorCode& errorCode); + extern number::FormattedNumber formatNumberWithDefaults(const Locale& locale, StringPiece toFormat, UErrorCode& errorCode); + extern DateFormat* defaultDateTimeInstance(const Locale&, UErrorCode&); + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_FUNCTION_REGISTRY_INTERNAL_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_macros.h b/deps/icu-small/source/i18n/messageformat2_macros.h new file mode 100644 index 00000000000000..20e81377d4d5cf --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_macros.h @@ -0,0 +1,109 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT2_MACROS_H +#define MESSAGEFORMAT2_MACROS_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/format.h" +#include "unicode/unistr.h" +#include "plurrule_impl.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + +using namespace pluralimpl; + +// Tokens for parser and serializer + +// Syntactically significant characters +#define LEFT_CURLY_BRACE ((UChar32)0x007B) +#define RIGHT_CURLY_BRACE ((UChar32)0x007D) +#define HTAB ((UChar32)0x0009) +#define CR ((UChar32)0x000D) +#define LF ((UChar32)0x000A) +#define IDEOGRAPHIC_SPACE ((UChar32)0x3000) + +#define PIPE ((UChar32)0x007C) +#define EQUALS ((UChar32)0x003D) +#define DOLLAR ((UChar32)0x0024) +#define COLON ((UChar32)0x003A) +#define PLUS ((UChar32)0x002B) +#define HYPHEN ((UChar32)0x002D) +#define PERIOD ((UChar32)0x002E) +#define UNDERSCORE ((UChar32)0x005F) + +#define LOWERCASE_E ((UChar32)0x0065) +#define UPPERCASE_E ((UChar32)0x0045) + +// Reserved sigils +#define BANG ((UChar32)0x0021) +#define AT ((UChar32)0x0040) +#define PERCENT ((UChar32)0x0025) +#define CARET ((UChar32)0x005E) +#define AMPERSAND ((UChar32)0x0026) +#define LESS_THAN ((UChar32)0x003C) +#define GREATER_THAN ((UChar32)0x003E) +#define QUESTION ((UChar32)0x003F) +#define TILDE ((UChar32)0x007E) + +// Fallback +#define REPLACEMENT ((UChar32) 0xFFFD) + +// MessageFormat2 uses three keywords: `.input`, `.local`, and `.match`. + +static constexpr std::u16string_view ID_INPUT = u".input"; +static constexpr std::u16string_view ID_LOCAL = u".local"; +static constexpr std::u16string_view ID_MATCH = u".match"; + +// Returns immediately if `errorCode` indicates failure +#define CHECK_ERROR(errorCode) \ + if (U_FAILURE(errorCode)) { \ + return; \ + } + +// Returns immediately if `errorCode` indicates failure +#define NULL_ON_ERROR(errorCode) \ + if (U_FAILURE(errorCode)) { \ + return nullptr; \ + } + +// Returns immediately if `errorCode` indicates failure +#define THIS_ON_ERROR(errorCode) \ + if (U_FAILURE(errorCode)) { \ + return *this; \ + } + +// Returns immediately if `errorCode` indicates failure +#define EMPTY_ON_ERROR(errorCode) \ + if (U_FAILURE(errorCode)) { \ + return {}; \ + } + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_MACROS_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_parser.cpp b/deps/icu-small/source/i18n/messageformat2_parser.cpp new file mode 100644 index 00000000000000..879c7024fc9cd1 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_parser.cpp @@ -0,0 +1,2172 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/uniset.h" +#include "messageformat2_errors.h" +#include "messageformat2_macros.h" +#include "messageformat2_parser.h" +#include "ucln_in.h" +#include "umutex.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + +using namespace pluralimpl; + +using namespace data_model; + +/* + The `ERROR()` macro sets a syntax error in the context + and sets the offset in `parseError` to `index`. It does not alter control flow. +*/ +#define ERROR(errorCode) \ + if (!errors.hasSyntaxError()) { \ + setParseError(parseError, index); \ + errors.addSyntaxError(errorCode); \ + } + +#define ERROR_AT(errorCode, i) \ + if (!errors.hasSyntaxError()) { \ + setParseError(parseError, i); \ + errors.addSyntaxError(errorCode); \ + } + +// Increments the line number and updates the "characters seen before +// current line" count in `parseError`, iff `peek()` is a newline +void Parser::maybeAdvanceLine() { + if (peek() == LF) { + parseError.line++; + // add 1 to index to get the number of characters seen so far + // (including the newline) + parseError.lengthBeforeCurrentLine = index + 1; + } +} + +/* + Signals an error and returns either if `parseError` already denotes an + error, or `index` is out of bounds for the string `source` +*/ +#define CHECK_BOUNDS(errorCode) \ + if (!inBounds()) { \ + ERROR(errorCode); \ + return; \ + } +#define CHECK_BOUNDS_1(errorCode) \ + if (!inBounds(1)) { \ + ERROR_AT(errorCode, index + 1); \ + return; \ + } + +// ------------------------------------- +// Helper functions + +static void copyContext(const UChar in[U_PARSE_CONTEXT_LEN], UChar out[U_PARSE_CONTEXT_LEN]) { + for (int32_t i = 0; i < U_PARSE_CONTEXT_LEN; i++) { + out[i] = in[i]; + if (in[i] == '\0') { + break; + } + } +} + +/* static */ void Parser::translateParseError(const MessageParseError &messageParseError, UParseError &parseError) { + parseError.line = messageParseError.line; + parseError.offset = messageParseError.offset; + copyContext(messageParseError.preContext, parseError.preContext); + copyContext(messageParseError.postContext, parseError.postContext); +} + +/* static */ void Parser::setParseError(MessageParseError &parseError, uint32_t index) { + // Translate absolute to relative offset + parseError.offset = index // Start with total number of characters seen + - parseError.lengthBeforeCurrentLine; // Subtract all characters before the current line + // TODO: Fill this in with actual pre and post-context + parseError.preContext[0] = 0; + parseError.postContext[0] = 0; +} + +// ------------------------------------- +// Initialization of UnicodeSets + +namespace unisets { + +UnicodeSet* gUnicodeSets[unisets::UNISETS_KEY_COUNT] = {}; + +inline UnicodeSet* getImpl(Key key) { + return gUnicodeSets[key]; +} + +icu::UInitOnce gMF2ParseUniSetsInitOnce {}; +} + +UnicodeSet* initContentChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* result = new UnicodeSet(0x0001, 0x0008); // Omit NULL, HTAB and LF + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(0x000B, 0x000C); // Omit CR + result->add(0x000E, 0x001F); // Omit SP + result->add(0x0021, 0x002D); // Omit '.' + result->add(0x002F, 0x003F); // Omit '@' + result->add(0x0041, 0x005B); // Omit '\' + result->add(0x005D, 0x007A); // Omit { | } + result->add(0x007E, 0x2FFF); // Omit IDEOGRAPHIC_SPACE + result->add(0x3001, 0x10FFFF); // Allowing surrogates is intentional + result->freeze(); + return result; +} + +UnicodeSet* initWhitespace(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(SPACE); + result->add(HTAB); + result->add(CR); + result->add(LF); + result->add(IDEOGRAPHIC_SPACE); + result->freeze(); + return result; +} + +UnicodeSet* initBidiControls(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[\\u061C]"), status); + if (U_FAILURE(status)) { + return nullptr; + } + result->add(0x200E, 0x200F); + result->add(0x2066, 0x2069); + result->freeze(); + return result; +} + +UnicodeSet* initAlpha(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:letter:]"), status); + if (U_FAILURE(status)) { + return nullptr; + } + result->freeze(); + return result; +} + +UnicodeSet* initDigits(UErrorCode& status) { + UnicodeSet* result = new UnicodeSet(UnicodeString("[:number:]"), status); + if (U_FAILURE(status)) { + return nullptr; + } + result->freeze(); + return result; +} + +UnicodeSet* initNameStartChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* isAlpha = unisets::gUnicodeSets[unisets::ALPHA] = initAlpha(status); + if (U_FAILURE(status)) { + return nullptr; + } + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + + result->addAll(*isAlpha); + result->add(0x002B); + result->add(0x005F); + result->add(0x00A1, 0x061B); + result->add(0x061D, 0x167F); + result->add(0x1681, 0x1FFF); + result->add(0x200B, 0x200D); + result->add(0x2010, 0x2027); + result->add(0x2030, 0x205E); + result->add(0x2060, 0x2065); + result->add(0x206A, 0x2FFF); + result->add(0x3001, 0xD7FF); + result->add(0xE000, 0xFDCF); + result->add(0xFDF0, 0xFFFD); + result->add(0x10000, 0x1FFFD); + result->add(0x20000, 0x2FFFD); + result->add(0x30000, 0x3FFFD); + result->add(0x40000, 0x4FFFD); + result->add(0x50000, 0x5FFFD); + result->add(0x60000, 0x6FFFD); + result->add(0x70000, 0x7FFFD); + result->add(0x80000, 0x8FFFD); + result->add(0x90000, 0x9FFFD); + result->add(0xA0000, 0xAFFFD); + result->add(0xB0000, 0xBFFFD); + result->add(0xC0000, 0xCFFFD); + result->add(0xD0000, 0xDFFFD); + result->add(0xE0000, 0xEFFFD); + result->add(0xF0000, 0xFFFFD); + result->add(0x100000, 0x10FFFD); + result->freeze(); + return result; +} + +UnicodeSet* initNameChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* nameStart = unisets::gUnicodeSets[unisets::NAME_START] = initNameStartChars(status); + UnicodeSet* digit = unisets::gUnicodeSets[unisets::DIGIT] = initDigits(status); + if (U_FAILURE(status)) { + return nullptr; + } + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*nameStart); + result->addAll(*digit); + result->add(HYPHEN); + result->add(PERIOD); + result->freeze(); + return result; +} + +UnicodeSet* initTextChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* content = unisets::gUnicodeSets[unisets::CONTENT] = initContentChars(status); + UnicodeSet* whitespace = unisets::gUnicodeSets[unisets::WHITESPACE] = initWhitespace(status); + if (U_FAILURE(status)) { + return nullptr; + } + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + result->addAll(*content); + result->addAll(*whitespace); + result->add(PERIOD); + result->add(AT); + result->add(PIPE); + result->freeze(); + return result; +} + +UnicodeSet* initQuotedChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + unisets::gUnicodeSets[unisets::TEXT] = initTextChars(status); + if (U_FAILURE(status)) { + return nullptr; + } + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + }; + // content and whitespace were initialized by `initTextChars()` + UnicodeSet* content = unisets::getImpl(unisets::CONTENT); + if (content == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->addAll(*content); + UnicodeSet* whitespace = unisets::getImpl(unisets::WHITESPACE); + if (whitespace == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->addAll(*whitespace); + result->add(PERIOD); + result->add(AT); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +UnicodeSet* initEscapableChars(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + + UnicodeSet* result = new UnicodeSet(); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + result->add(PIPE); + result->add(BACKSLASH); + result->add(LEFT_CURLY_BRACE); + result->add(RIGHT_CURLY_BRACE); + result->freeze(); + return result; +} + +namespace unisets { + +UBool U_CALLCONV cleanupMF2ParseUniSets() { + for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) { + delete gUnicodeSets[i]; + gUnicodeSets[i] = nullptr; + } + gMF2ParseUniSetsInitOnce.reset(); + return true; +} + +void U_CALLCONV initMF2ParseUniSets(UErrorCode& status) { + ucln_i18n_registerCleanup(UCLN_I18N_MF2_UNISETS, cleanupMF2ParseUniSets); + /* + Each of the init functions initializes the UnicodeSets + that it depends on. + + initBidiControls (no dependencies) + + initEscapableChars (no dependencies) + + initNameChars depends on + initDigits + initNameStartChars depends on + initAlpha + + initQuotedChars depends on + initTextChars depends on + initContentChars + initWhitespace + */ + gUnicodeSets[unisets::BIDI] = initBidiControls(status); + gUnicodeSets[unisets::NAME_CHAR] = initNameChars(status); + gUnicodeSets[unisets::QUOTED] = initQuotedChars(status); + gUnicodeSets[unisets::ESCAPABLE] = initEscapableChars(status); + + if (U_FAILURE(status)) { + cleanupMF2ParseUniSets(); + } +} + +const UnicodeSet* get(Key key, UErrorCode& status) { + umtx_initOnce(gMF2ParseUniSetsInitOnce, &initMF2ParseUniSets, status); + if (U_FAILURE(status)) { + return nullptr; + } + UnicodeSet* result = getImpl(key); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; +} + +} + +// ------------------------------------- +// Predicates + +/* + The following helper predicates should exactly match nonterminals in the MessageFormat 2 grammar: + + `isContentChar()` : `content-char` + `isTextChar()` : `text-char` + `isAlpha()` : `ALPHA` + `isDigit()` : `DIGIT` + `isNameStart()` : `name-start` + `isNameChar()` : `name-char` + `isUnquotedStart()` : `unquoted-start` + `isQuotedChar()` : `quoted-char` + `isWhitespace()` : `s` +*/ + +bool Parser::isContentChar(UChar32 c) const { + return contentChars->contains(c); +} + +// See `bidi` in the MF2 grammar +bool Parser::isBidiControl(UChar32 c) const { + return bidiControlChars->contains(c); +} + +// See `ws` in the MessageFormat 2 grammar +bool Parser::isWhitespace(UChar32 c) const { + return whitespaceChars->contains(c); +} + +bool Parser::isTextChar(UChar32 c) const { + return textChars->contains(c); +} + +bool Parser::isAlpha(UChar32 c) const { + return alphaChars->contains(c); +} + +bool Parser::isDigit(UChar32 c) const { + return digitChars->contains(c); +} + +bool Parser::isNameStart(UChar32 c) const { + return nameStartChars->contains(c); +} + +bool Parser::isNameChar(UChar32 c) const { + return nameChars->contains(c); +} + +bool Parser::isUnquotedStart(UChar32 c) const { + return isNameChar(c); +} + +bool Parser::isQuotedChar(UChar32 c) const { + return quotedChars->contains(c); +} + +bool Parser::isEscapableChar(UChar32 c) const { + return escapableChars->contains(c); +} + +// Returns true iff `c` can begin a `function` nonterminal +static bool isFunctionStart(UChar32 c) { + switch (c) { + case COLON: { + return true; + } + default: { + return false; + } + } +} + +// Returns true iff `c` can begin an `annotation` nonterminal +static bool isAnnotationStart(UChar32 c) { + return isFunctionStart(c); +} + +// Returns true iff `c` can begin a `literal` nonterminal +bool Parser::isLiteralStart(UChar32 c) const { + return (c == PIPE || isNameStart(c) || c == HYPHEN || isDigit(c)); +} + +// Returns true iff `c` can begin a `key` nonterminal +bool Parser::isKeyStart(UChar32 c) const { + return (c == ASTERISK || isLiteralStart(c)); +} + +bool Parser::isDeclarationStart() { + return (peek() == ID_LOCAL[0] + && inBounds(1) + && peek(1) == ID_LOCAL[1]) + || (peek() == ID_INPUT[0] + && inBounds(1) + && peek(1) == ID_INPUT[1]); +} + +// ------------------------------------- +// Parsing functions + + +/* + TODO: Since handling the whitespace ambiguities needs to be repeated + in several different places and is hard to factor out, + it probably would be better to replace the parser with a lexer + parser + to separate tokenizing from parsing, which would simplify the code significantly. + This has the disadvantage that there is no token grammar for MessageFormat, + so one would have to be invented that isn't a component of the spec. + */ + +/* + This is a recursive-descent scannerless parser that, + with a few exceptions, uses 1 character of lookahead. + + This may not be an exhaustive list, as the additions of attributes and reserved + statements introduced several new ambiguities. + +All but three of the exceptions involve ambiguities about the meaning of whitespace. +One ambiguity not involving whitespace is: +identifier -> namespace ":" name +vs. +identifier -> name + +`namespace` and `name` can't be distinguished without arbitrary lookahead. +(For how this is handled, see parseIdentifier()) + +The second ambiguity not involving whitespace is: +complex-message -> *(declaration[s]) complex-body + -> declaration *(declaration[s]) complex-body + -> declaration complex-body + -> reserved-statement complex-body + -> .foo {$x} .match // ... +When processing the '.', arbitrary lookahead is required to distinguish the +arbitrary-length unsupported keyword from `.match`. +(For how this is handled, see parseDeclarations()). + +The third ambiguity not involving whitespace is: +complex-message -> *(declaration [s]) complex-body + -> reserved-statement *(declaration [s]) complex-body + -> reserved-statement complex-body + -> reserved-statement quotedPattern + -> reserved-keyword [s reserved-body] 1*([s] expression) quoted-pattern + -> reserved-keyword expression quoted-pattern + Example: .foo {1} {{1}} + + Without lookahead, the opening '{' of the quoted pattern can't be distinguished + from the opening '{' of another expression in the unsupported statement. + (Though this only requires 1 character of lookahead.) + + Otherwise: + +There are at least seven ambiguities in the grammar that can't be resolved with finite +lookahead (since whitespace sequences can be arbitrarily long). They are resolved +with a form of backtracking (early exit). No state needs to be saved/restored +since whitespace doesn't affect the shape of the resulting parse tree, so it's +not true backtracking. + +In addition, the grammar has been refactored +in a semantics-preserving way in some cases to make the code easier to structure. + +First: variant = when 1*(s key) [s] pattern + Example: when k {a} + When reading the first space after 'k', it's ambiguous whether it's the + required space before another key, or the optional space before `pattern`. + (See comments in parseNonEmptyKeys()) + +Second: expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + annotation = (function *(s option)) / reserved + Example: {:f } + When reading the first space after 'f', it's ambiguous whether it's the + required space before an option, or the optional trailing space after an options list + (in this case, the options list is empty). + (See comments in parseOptions() -- handling this case also meant it was easier to base + the code on a slightly refactored grammar, which should be semantically equivalent.) + +Third: expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + annotation = (function *(s option)) / reserved + Example: {@a } + Similar to the previous case; see comments in parseReserved() + +Fourth: expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + Example: {|foo| } + When reading the first space after the '|', it's ambiguous whether it's the required + space before an annotation, or the optional trailing space before the '}'. + (See comments in parseLiteralOrVariableWithAnnotation(); handling this case relies on + the same grammar refactoring as the second exception.) + + Most functions match a non-terminal in the grammar, except as explained + in comments. + +Fifth: matcher = match-statement 1*([s] variant) + -> match 1 *([s] selector) 1*([s] variant) + Example: match {42} * {{_}} + When reading the space after the first '}', it's unclear whether + it's the optional space before another selector, or the optional space + before a variant. + +Sixth: annotation-expression = "{" [s] annotation *(s attribute) [s] "}" + -> "{" [s] function *(s attribute) [s] "}" + -> "{" [s] ":" identifier *(s option) *(s attribute) [s] "}" + -> "{" [s] ":" identifier s attribute *(s attribute) [s] "}" + + Example: {:func @foo} +(Note: the same ambiguity is present with variable-expression and literal-expression) + +Seventh: + + +When parsing the space, it's unclear whether it's the optional space before an +option, or the optional space before an attribute. + + Unless otherwise noted in a comment, all helper functions that take + a `source` string, an `index` unsigned int, and an `errorCode` `UErrorCode` + have the precondition: + `index` < `len()` + and the postcondition: + `U_FAILURE(errorCode)` || `index < `len()` +*/ + +/* + No pre, no post. + A message may end with whitespace, so `index` may equal `len()` on exit. +*/ +void Parser::parseRequiredWS(UErrorCode& errorCode) { + bool sawWhitespace = false; + + // The loop exits either when we consume all the input, + // or when we see a non-whitespace character. + while (true) { + // Check if all input has been consumed + if (!inBounds()) { + // If whitespace isn't required -- or if we saw it already -- + // then the caller is responsible for checking this case and + // setting an error if necessary. + if (sawWhitespace) { + // Not an error. + return; + } + // Otherwise, whitespace is required; the end of the input has + // been reached without whitespace. This is an error. + ERROR(errorCode); + return; + } + + // Input remains; process the next character if it's whitespace, + // exit the loop otherwise + if (isWhitespace(peek())) { + sawWhitespace = true; + // Increment line number in parse error if we consume a newline + maybeAdvanceLine(); + next(); + } else { + break; + } + } + + if (!sawWhitespace) { + ERROR(errorCode); + } +} + +void Parser::parseOptionalBidi() { + while (true) { + if (!inBounds()) { + return; + } + if (isBidiControl(peek())) { + next(); + } else { + break; + } + } +} + +/* + No pre, no post, because a message may end with whitespace + Matches `s` in the MF2 grammar +*/ +void Parser::parseRequiredWhitespace(UErrorCode& errorCode) { + parseOptionalBidi(); + parseRequiredWS(errorCode); + parseOptionalWhitespace(); + normalizedInput += SPACE; +} + +/* + No pre, no post, for the same reason as `parseWhitespaceMaybeRequired()`. +*/ +void Parser::parseOptionalWhitespace() { + while (true) { + if (!inBounds()) { + return; + } + auto cp = peek(); + if (isWhitespace(cp) || isBidiControl(cp)) { + maybeAdvanceLine(); + next(); + } else { + break; + } + } +} + +// Consumes a single character, signaling an error if `peek()` != `c` +// No postcondition -- a message can end with a '}' token +void Parser::parseToken(UChar32 c, UErrorCode& errorCode) { + CHECK_BOUNDS(errorCode); + + if (peek() == c) { + next(); + normalizedInput += c; + return; + } + // Next character didn't match -- error out + ERROR(errorCode); +} + +/* + Consumes a fixed-length token, signaling an error if the token isn't a prefix of + the string beginning at `peek()` + No postcondition -- a message can end with a '}' token +*/ +void Parser::parseToken(const std::u16string_view& token, UErrorCode& errorCode) { + U_ASSERT(inBounds()); + + int32_t tokenPos = 0; + while (tokenPos < static_cast<int32_t>(token.length())) { + if (peek() != token[tokenPos]) { + ERROR(errorCode); + return; + } + normalizedInput += token[tokenPos]; + next(); + tokenPos++; + } +} + +/* + Consumes optional whitespace, possibly advancing `index` to `index'`, + then consumes a fixed-length token (signaling an error if the token isn't a prefix of + the string beginning at `source[index']`), + then consumes optional whitespace again +*/ +void Parser::parseTokenWithWhitespace(const std::u16string_view& token, UErrorCode& errorCode) { + // No need for error check or bounds check before parseOptionalWhitespace + parseOptionalWhitespace(); + // Establish precondition + CHECK_BOUNDS(errorCode); + parseToken(token, errorCode); + parseOptionalWhitespace(); + // Guarantee postcondition + CHECK_BOUNDS(errorCode); +} + +/* + Consumes optional whitespace, possibly advancing `index` to `index'`, + then consumes a single character (signaling an error if it doesn't match + `source[index']`), + then consumes optional whitespace again +*/ +void Parser::parseTokenWithWhitespace(UChar32 c, UErrorCode& errorCode) { + // No need for error check or bounds check before parseOptionalWhitespace() + parseOptionalWhitespace(); + // Establish precondition + CHECK_BOUNDS(errorCode); + parseToken(c, errorCode); + parseOptionalWhitespace(); + // Guarantee postcondition + CHECK_BOUNDS(errorCode); +} + +/* + Consumes a possibly-empty sequence of name-chars. Appends to `str` + and returns `str`. +*/ +UnicodeString Parser::parseNameChars(UnicodeString& str, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + while (isNameChar(peek())) { + UChar32 c = peek(); + str += c; + normalizedInput += c; + next(); + if (!inBounds()) { + ERROR(errorCode); + break; + } + } + + return str; +} + +/* + Consumes a non-empty sequence of `name-char`s, the first of which is + also a `name-start`. + that begins with a character `start` such that `isNameStart(start)`. + + Returns this sequence. + + (Matches the `name` nonterminal in the grammar.) +*/ +UnicodeString Parser::parseName(UErrorCode& errorCode) { + UnicodeString name; + + U_ASSERT(inBounds()); + + if (!(isNameStart(peek()) || isBidiControl(peek()))) { + ERROR(errorCode); + return name; + } + + // name = [bidi] name-start *name-char [bidi] + + // [bidi] + parseOptionalBidi(); + + // name-start *name-char + parseNameChars(name, errorCode); + + // [bidi] + parseOptionalBidi(); + + return name; +} + +/* + Consumes a '$' followed by a `name`, returning a VariableName + with `name` as its name + + (Matches the `variable` nonterminal in the grammar.) +*/ +VariableName Parser::parseVariableName(UErrorCode& errorCode) { + VariableName result; + + U_ASSERT(inBounds()); + + parseToken(DOLLAR, errorCode); + if (!inBounds()) { + ERROR(errorCode); + return result; + } + return VariableName(parseName(errorCode)); +} + +/* + Corresponds to the `identifier` nonterminal in the grammar +*/ +UnicodeString Parser::parseIdentifier(UErrorCode& errorCode) { + U_ASSERT(inBounds()); + + UnicodeString result; + // The following is a hack to get around ambiguity in the grammar: + // identifier -> namespace ":" name + // vs. + // identifier -> name + // can't be distinguished without arbitrary lookahead. + // Instead, we treat the production as: + // identifier -> namespace *(":"name) + // and then check for multiple colons. + + // Parse namespace + result += parseName(errorCode); + int32_t firstColon = -1; + while (inBounds() && peek() == COLON) { + // Parse ':' separator + if (firstColon == -1) { + firstColon = index; + } + parseToken(COLON, errorCode); + result += COLON; + // Check for message ending with something like "foo:" + if (!inBounds()) { + ERROR(errorCode); + } else { + // Parse name part + result += parseName(errorCode); + } + } + + // If there's at least one ':', scan from the first ':' + // to the end of the name to check for multiple ':'s + if (firstColon != -1) { + for (int32_t i = firstColon + 1; i < result.length(); i++) { + if (result[i] == COLON) { + ERROR_AT(errorCode, i); + return {}; + } + } + } + + return result; +} + +/* + Consumes a reference to a function, matching the ": identifier" + in the `function` nonterminal in the grammar. + + Returns the function name. +*/ +FunctionName Parser::parseFunction(UErrorCode& errorCode) { + U_ASSERT(inBounds()); + if (!isFunctionStart(peek())) { + ERROR(errorCode); + return FunctionName(); + } + + normalizedInput += peek(); + next(); // Consume the function start character + if (!inBounds()) { + ERROR(errorCode); + return FunctionName(); + } + return parseIdentifier(errorCode); +} + + +/* + Precondition: peek() == BACKSLASH + + Consume an escaped character. + Corresponds to `escaped-char` in the grammar. + + No postcondition (a message can end with an escaped char) +*/ +UnicodeString Parser::parseEscapeSequence(UErrorCode& errorCode) { + U_ASSERT(inBounds()); + U_ASSERT(peek() == BACKSLASH); + normalizedInput += BACKSLASH; + next(); // Skip the initial backslash + UnicodeString str; + if (inBounds()) { + // Expect a '{', '|' or '}' + switch (peek()) { + case LEFT_CURLY_BRACE: + case RIGHT_CURLY_BRACE: + case PIPE: + case BACKSLASH: { + /* Append to the output string */ + str += peek(); + /* Update normalizedInput */ + normalizedInput += peek(); + /* Consume the character */ + next(); + return str; + } + default: { + // No other characters are allowed here + break; + } + } + } + // If control reaches here, there was an error + ERROR(errorCode); + return str; +} + + +/* + Consume and return a quoted literal, matching the `literal` nonterminal in the grammar. +*/ +Literal Parser::parseQuotedLiteral(UErrorCode& errorCode) { + bool error = false; + + UnicodeString contents; + if (U_SUCCESS(errorCode)) { + // Parse the opening '|' + parseToken(PIPE, errorCode); + if (!inBounds()) { + ERROR(errorCode); + error = true; + } else { + // Parse the contents + bool done = false; + while (!done) { + if (peek() == BACKSLASH) { + contents += parseEscapeSequence(errorCode); + } else if (isQuotedChar(peek())) { + contents += peek(); + // Handle cases like: + // |}{| -- we want to escape everywhere that + // can be escaped, to make round-trip checking + // easier -- so this case normalizes to + // |\}\{| + if (isEscapableChar(peek())) { + normalizedInput += BACKSLASH; + } + normalizedInput += peek(); + next(); // Consume this character + maybeAdvanceLine(); + } else { + // Assume the sequence of literal characters ends here + done = true; + } + if (!inBounds()) { + ERROR(errorCode); + error = true; + break; + } + } + } + } + + if (error) { + return {}; + } + + // Parse the closing '|' + parseToken(PIPE, errorCode); + + return Literal(true, contents); +} + +// Parse (1*DIGIT) +UnicodeString Parser::parseDigits(UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + U_ASSERT(isDigit(peek())); + + UnicodeString contents; + do { + contents += peek(); + normalizedInput += peek(); + next(); + if (!inBounds()) { + ERROR(errorCode); + return {}; + } + } while (isDigit(peek())); + + return contents; +} +/* + Consume and return an unquoted literal, matching the `unquoted` nonterminal in the grammar. +*/ +Literal Parser::parseUnquotedLiteral(UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + // unquoted-literal = 1*name-char + + if (!(isNameChar(peek()))) { + ERROR(errorCode); + return {}; + } + + UnicodeString contents; + parseNameChars(contents, errorCode); + return Literal(false, contents); +} + +/* + Consume and return a literal, matching the `literal` nonterminal in the grammar. +*/ +Literal Parser::parseLiteral(UErrorCode& errorCode) { + Literal result; + if (!inBounds()) { + ERROR(errorCode); + } else { + if (peek() == PIPE) { + result = parseQuotedLiteral(errorCode); + } else { + result = parseUnquotedLiteral(errorCode); + } + // Guarantee postcondition + if (!inBounds()) { + ERROR(errorCode); + } + } + + return result; +} + +/* + Consume a @name-value pair, matching the `attribute` nonterminal in the grammar. + + Adds the option to `options` +*/ +template<class T> +void Parser::parseAttribute(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) { + U_ASSERT(inBounds()); + + U_ASSERT(peek() == AT); + // Consume the '@' + parseToken(AT, errorCode); + + // Parse LHS + UnicodeString lhs = parseIdentifier(errorCode); + + // Prepare to "backtrack" to resolve ambiguity + // about whether whitespace precedes another + // attribute, or the '=' sign + int32_t savedIndex = index; + parseOptionalWhitespace(); + + Operand rand; + if (peek() == EQUALS) { + // Parse '=' + parseTokenWithWhitespace(EQUALS, errorCode); + + UnicodeString rhsStr; + // Parse RHS, which must be a literal + // attribute = "@" identifier [o "=" o literal] + rand = Operand(parseLiteral(errorCode)); + } else { + // attribute -> "@" identifier [[s] "=" [s]] + // Use null operand, which `rand` is already set to + // "Backtrack" by restoring the whitespace (if there was any) + index = savedIndex; + } + + attrAdder.addAttribute(lhs, std::move(Operand(rand)), errorCode); +} + +/* + Consume a name-value pair, matching the `option` nonterminal in the grammar. + + Adds the option to `optionList` +*/ +template<class T> +void Parser::parseOption(OptionAdder<T>& addOption, UErrorCode& errorCode) { + U_ASSERT(inBounds()); + + // Parse LHS + UnicodeString lhs = parseIdentifier(errorCode); + + // Parse '=' + parseTokenWithWhitespace(EQUALS, errorCode); + + UnicodeString rhsStr; + Operand rand; + // Parse RHS, which is either a literal or variable + switch (peek()) { + case DOLLAR: { + rand = Operand(parseVariableName(errorCode)); + break; + } + default: { + // Must be a literal + rand = Operand(parseLiteral(errorCode)); + break; + } + } + U_ASSERT(!rand.isNull()); + + // Finally, add the key=value mapping + // Use a local error code, check for duplicate option error and + // record it as with other errors + UErrorCode status = U_ZERO_ERROR; + addOption.addOption(lhs, std::move(rand), status); + if (U_FAILURE(status)) { + U_ASSERT(status == U_MF_DUPLICATE_OPTION_NAME_ERROR); + errors.setDuplicateOptionName(errorCode); + } +} + +/* + Note: there are multiple overloads of parseOptions() for parsing + options within markup, vs. within an expression, vs. parsing + attributes. This should be refactored. TODO + */ + +/* + Consume optional whitespace followed by a sequence of options + (possibly empty), separated by whitespace +*/ +template <class T> +void Parser::parseOptions(OptionAdder<T>& addOption, UErrorCode& errorCode) { + // Early exit if out of bounds -- no more work is possible + CHECK_BOUNDS(errorCode); + +/* +Arbitrary lookahead is required to parse option lists. To see why, consider +these rules from the grammar: + +expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" +annotation = (function *(s option)) / reserved + +And this example: +{:foo } + +Derivation: +expression -> "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + -> "{" [s] annotation [s] "}" + -> "{" [s] ((function *(s option)) / reserved) [s] "}" + -> "{" [s] function *(s option) [s] "}" + +In this example, knowing whether to expect a '}' or the start of another option +after the whitespace would require arbitrary lookahead -- in other words, which +rule should we apply? + *(s option) -> s option *(s option) + or + *(s option) -> + +The same would apply to the example {:foo k=v } (note the trailing space after "v"). + +This is addressed using a form of backtracking and (to make the backtracking easier +to apply) a slight refactoring to the grammar. + +This code is written as if the grammar is: + expression = "{" [s] (((literal / variable) ([s] / [s annotation])) / annotation) "}" + annotation = (function *(s option) [s]) / (reserved [s]) + +Parsing the `*(s option) [s]` sequence can be done within `parseOptions()`, meaning +that `parseExpression()` can safely require a '}' after `parseOptions()` finishes. + +Note that when "backtracking" really just means early exit, since only whitespace +is involved and there's no state to save. + +There is a separate but similar ambiguity as to whether the space precedes +an option or an attribute. +*/ + + while(true) { + // If the next character is not whitespace, that means we've already + // parsed the entire options list (which may have been empty) and there's + // no trailing whitespace. In that case, exit. + if (!isWhitespace(peek())) { + break; + } + int32_t firstWhitespace = index; + + // In any case other than an empty options list, there must be at least + // one whitespace character. + parseRequiredWhitespace(errorCode); + // Restore precondition + CHECK_BOUNDS(errorCode); + + // If a name character follows, then at least one more option remains + // in the list. + // Otherwise, we've consumed all the options and any trailing whitespace, + // and can exit. + // Note that exiting is sort of like backtracking: "(s option)" doesn't apply, + // so we back out to [s]. + if (!isNameStart(peek())) { + // We've consumed all the options (meaning that either we consumed non-empty + // whitespace, or consumed at least one option.) + // Done. + // Remove the required whitespace from normalizedInput + normalizedInput.truncate(normalizedInput.length() - 1); + // "Backtrack" so as to leave the optional whitespace there + // when parsing attributes + index = firstWhitespace; + break; + } + parseOption(addOption, errorCode); + } +} + +/* + Consume optional whitespace followed by a sequence of attributes + (possibly empty), separated by whitespace +*/ +template<class T> +void Parser::parseAttributes(AttributeAdder<T>& attrAdder, UErrorCode& errorCode) { + + // Early exit if out of bounds -- no more work is possible + if (!inBounds()) { + ERROR(errorCode); + return; + } + +/* +Arbitrary lookahead is required to parse attribute lists, similarly to option lists. +(See comment in parseOptions()). +*/ + + while(true) { + // If the next character is not whitespace, that means we've already + // parsed the entire attributes list (which may have been empty) and there's + // no trailing whitespace. In that case, exit. + if (!isWhitespace(peek())) { + break; + } + + // In any case other than an empty attributes list, there must be at least + // one whitespace character. + parseRequiredWhitespace(errorCode); + // Restore precondition + if (!inBounds()) { + ERROR(errorCode); + break; + } + + // If an '@' follows, then at least one more attribute remains + // in the list. + // Otherwise, we've consumed all the attributes and any trailing whitespace, + // and can exit. + // Note that exiting is sort of like backtracking: "(s attributes)" doesn't apply, + // so we back out to [s]. + if (peek() != AT) { + // We've consumed all the attributes (meaning that either we consumed non-empty + // whitespace, or consumed at least one attribute.) + // Done. + // Remove the whitespace from normalizedInput + normalizedInput.truncate(normalizedInput.length() - 1); + break; + } + parseAttribute(attrAdder, errorCode); + } +} + +/* + Consume a function call, matching the `annotation` + nonterminal in the grammar + + Returns an `Operator` representing this (a reserved is a parse error) +*/ +Operator Parser::parseAnnotation(UErrorCode& status) { + U_ASSERT(inBounds()); + Operator::Builder ratorBuilder(status); + if (U_FAILURE(status)) { + return {}; + } + if (isFunctionStart(peek())) { + // Consume the function name + FunctionName func = parseFunction(status); + ratorBuilder.setFunctionName(std::move(func)); + + OptionAdder<Operator::Builder> addOptions(ratorBuilder); + // Consume the options (which may be empty) + parseOptions(addOptions, status); + } else { + ERROR(status); + } + return ratorBuilder.build(status); +} + +/* + Consume a literal or variable (depending on `isVariable`), + followed by either required whitespace followed by an annotation, + or optional whitespace. +*/ +void Parser::parseLiteralOrVariableWithAnnotation(bool isVariable, + Expression::Builder& builder, + UErrorCode& status) { + CHECK_ERROR(status); + + U_ASSERT(inBounds()); + + Operand rand; + if (isVariable) { + rand = Operand(parseVariableName(status)); + } else { + rand = Operand(parseLiteral(status)); + } + + builder.setOperand(std::move(rand)); + +/* +Parsing a literal or variable with an optional annotation requires arbitrary lookahead. +To see why, consider this rule from the grammar: + +expression = "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + +And this example: + +{|foo| } + +Derivation: +expression -> "{" [s] (((literal / variable) [s annotation]) / annotation) [s] "}" + -> "{" [s] ((literal / variable) [s annotation]) [s] "}" + -> "{" [s] (literal [s annotation]) [s] "}" + +When reading the ' ' after the second '|', it's ambiguous whether that's the required +space before an annotation, or the optional space before the '}'. + +To make this ambiguity easier to handle, this code is based on the same grammar +refactoring for the `expression` nonterminal that `parseOptions()` relies on. See +the comment in `parseOptions()` for details. +*/ + + if (isWhitespace(peek())) { + int32_t firstWhitespace = index; + + // If the next character is whitespace, either [s annotation] or [s] applies + // (the character is either the required space before an annotation, or optional + // trailing space after the literal or variable). It's still ambiguous which + // one does apply. + parseOptionalWhitespace(); + // Restore precondition + CHECK_BOUNDS(status); + + // This next check resolves the ambiguity between [s annotation] and [s] + bool isSAnnotation = isAnnotationStart(peek()); + + if (isSAnnotation) { + normalizedInput += SPACE; + } + + if (isSAnnotation) { + // The previously consumed whitespace precedes an annotation + builder.setOperator(parseAnnotation(status)); + } else { + // Either there's a right curly brace (will be consumed by the caller), + // or there's an error and the trailing whitespace should be + // handled by the caller. However, this is not an error + // here because we're just parsing `literal [s annotation]`. + index = firstWhitespace; + } + } else { + // Either there was never whitespace, or + // the previously consumed whitespace is the optional trailing whitespace; + // either the next character is '}' or the error will be handled by parseExpression. + // Do nothing, since the operand was already set + } + + // At the end of this code, the next character should either be '}', + // whitespace followed by a '}', + // or end-of-input +} + +/* + Consume an expression, matching the `expression` nonterminal in the grammar +*/ + +static void exprFallback(Expression::Builder& exprBuilder) { + // Construct a literal consisting just of The U+FFFD REPLACEMENT CHARACTER + // per https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution + exprBuilder.setOperand(Operand(Literal(false, UnicodeString(REPLACEMENT)))); +} + +static Expression exprFallback(UErrorCode& status) { + Expression result; + if (U_SUCCESS(status)) { + Expression::Builder exprBuilder(status); + if (U_SUCCESS(status)) { + // Construct a literal consisting just of The U+FFFD REPLACEMENT CHARACTER + // per https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution + exprBuilder.setOperand(Operand(Literal(false, UnicodeString(REPLACEMENT)))); + UErrorCode status = U_ZERO_ERROR; + result = exprBuilder.build(status); + // An operand was set, so there can't be an error + U_ASSERT(U_SUCCESS(status)); + } + } + return result; +} + +Expression Parser::parseExpression(UErrorCode& status) { + if (U_FAILURE(status)) { + return {}; + } + + // Early return if out of input -- no more work is possible + U_ASSERT(inBounds()); + + // Parse opening brace + parseToken(LEFT_CURLY_BRACE, status); + // Optional whitespace after opening brace + parseOptionalWhitespace(); + + Expression::Builder exprBuilder(status); + // Restore precondition + if (!inBounds()) { + exprFallback(exprBuilder); + } else { + // literal '|', variable '$' or annotation + switch (peek()) { + case PIPE: { + // Quoted literal + parseLiteralOrVariableWithAnnotation(false, exprBuilder, status); + break; + } + case DOLLAR: { + // Variable + parseLiteralOrVariableWithAnnotation(true, exprBuilder, status); + break; + } + default: { + if (isAnnotationStart(peek())) { + Operator rator = parseAnnotation(status); + exprBuilder.setOperator(std::move(rator)); + } else if (isUnquotedStart(peek())) { + // Unquoted literal + parseLiteralOrVariableWithAnnotation(false, exprBuilder, status); + } else { + // Not a literal, variable or annotation -- error out + ERROR(status); + exprFallback(exprBuilder); + break; + } + break; + } + } + } + + // Parse attributes + AttributeAdder<Expression::Builder> attrAdder(exprBuilder); + parseAttributes(attrAdder, status); + + // Parse optional space + // (the last [s] in e.g. "{" [s] literal [s annotation] *(s attribute) [s] "}") + parseOptionalWhitespace(); + + // Either an operand or operator (or both) must have been set already, + // so there can't be an error + UErrorCode localStatus = U_ZERO_ERROR; + Expression result = exprBuilder.build(localStatus); + U_ASSERT(U_SUCCESS(localStatus)); + + // Check for end-of-input and missing '}' + if (!inBounds()) { + ERROR(status); + } else { + // Otherwise, it's safe to check for the '}' + parseToken(RIGHT_CURLY_BRACE, status); + } + return result; +} + +/* + Parse a .local declaration, matching the `local-declaration` + production in the grammar +*/ +void Parser::parseLocalDeclaration(UErrorCode& status) { + // End-of-input here would be an error; even empty + // declarations must be followed by a body + CHECK_BOUNDS(status); + + parseToken(ID_LOCAL, status); + parseRequiredWhitespace(status); + + // Restore precondition + CHECK_BOUNDS(status); + VariableName lhs = parseVariableName(status); + parseTokenWithWhitespace(EQUALS, status); + // Restore precondition before calling parseExpression() + CHECK_BOUNDS(status); + + Expression rhs = parseExpression(status); + + // Add binding from lhs to rhs, unless there was an error + // (This ensures that if there was a correct lhs but a + // parse error in rhs, the fallback for uses of the + // lhs will be its own name rather than the rhs) + /* This affects the behavior of this test case, which the spec + is ambiguous about: + + .local $bar {|foo|} {{{$bar}}} + + Should `$bar` still be bound to a value although + its declaration is syntactically incorrect (missing the '=')? + This code says no, but it needs to change if + https://github.com/unicode-org/message-format-wg/issues/703 + is resolved differently. + */ + CHECK_ERROR(status); + if (!errors.hasSyntaxError()) { + dataModel.addBinding(Binding(std::move(lhs), std::move(rhs)), status); + // Check if status is U_DUPLICATE_DECLARATION_ERROR + // and add that as an internal error if so + if (status == U_MF_DUPLICATE_DECLARATION_ERROR) { + status = U_ZERO_ERROR; + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } +} + +/* + Parse an .input declaration, matching the `local-declaration` + production in the grammar +*/ +void Parser::parseInputDeclaration(UErrorCode& status) { + // End-of-input here would be an error; even empty + // declarations must be followed by a body + CHECK_BOUNDS(status); + + parseToken(ID_INPUT, status); + parseOptionalWhitespace(); + + // Restore precondition before calling parseExpression() + CHECK_BOUNDS(status); + + // Save the index for error diagnostics + int32_t exprIndex = index; + Expression rhs = parseExpression(status); + + // Here we have to check that the rhs is a variable-expression + if (!rhs.getOperand().isVariable()) { + // This case is a syntax error; report it at the beginning + // of the expression + ERROR_AT(status, exprIndex); + return; + } + + VariableName lhs = rhs.getOperand().asVariable(); + + // Add binding from lhs to rhs + // This just adds a new local variable that shadows the message + // argument referred to, which is harmless. + // When evaluating the RHS, the new local is not in scope + // and the message argument will be correctly referred to. + CHECK_ERROR(status); + if (!errors.hasSyntaxError()) { + dataModel.addBinding(Binding::input(std::move(lhs), std::move(rhs), status), status); + // Check if status is U_MF_DUPLICATE_DECLARATION_ERROR + // and add that as an internal error if so + if (status == U_MF_DUPLICATE_DECLARATION_ERROR) { + status = U_ZERO_ERROR; + errors.addError(StaticErrorType::DuplicateDeclarationError, status); + } + } +} + +/* + Consume a possibly-empty sequence of declarations separated by whitespace; + each declaration matches the `declaration` nonterminal in the grammar + + Builds up an environment representing those declarations +*/ +void Parser::parseDeclarations(UErrorCode& status) { + // End-of-input here would be an error; even empty + // declarations must be followed by a body + CHECK_BOUNDS(status); + + while (peek() == PERIOD) { + CHECK_BOUNDS_1(status); + if (peek(1) == ID_LOCAL[1]) { + parseLocalDeclaration(status); + } else if (peek(1) == ID_INPUT[1]) { + parseInputDeclaration(status); + } else { + // Done parsing declarations + break; + } + + // Avoid looping infinitely + CHECK_ERROR(status); + + parseOptionalWhitespace(); + // Restore precondition + CHECK_BOUNDS(status); + } +} + +/* + Consume a text character + matching the `text-char` nonterminal in the grammar + + No postcondition (a message can end with a text-char) +*/ +UnicodeString Parser::parseTextChar(UErrorCode& status) { + UnicodeString str; + if (!inBounds() || !(isTextChar(peek()))) { + // Error -- text-char is expected here + ERROR(status); + } else { + // See comment in parseQuotedLiteral() + if (isEscapableChar(peek())) { + normalizedInput += BACKSLASH; + } + normalizedInput += peek(); + str += peek(); + next(); + maybeAdvanceLine(); + } + return str; +} + +/* + Consume an `nmtoken`, `literal`, or the string "*", matching + the `key` nonterminal in the grammar +*/ +Key Parser::parseKey(UErrorCode& status) { + U_ASSERT(inBounds()); + + Key k; // wildcard by default + // Literal | '*' + switch (peek()) { + case ASTERISK: { + next(); + normalizedInput += ASTERISK; + // Guarantee postcondition + if (!inBounds()) { + ERROR(status); + return k; + } + break; + } + default: { + // Literal + k = Key(parseLiteral(status)); + break; + } + } + return k; +} + +/* + Consume a non-empty sequence of `key`s separated by whitespace + + Takes ownership of `keys` +*/ +SelectorKeys Parser::parseNonEmptyKeys(UErrorCode& status) { + SelectorKeys result; + + if (U_FAILURE(status)) { + return result; + } + + U_ASSERT(inBounds()); + +/* +Arbitrary lookahead is required to parse key lists. To see why, consider +this rule from the grammar: + +variant = key *(s key) [s] quoted-pattern + +And this example: +when k1 k2 {a} + +Derivation: + variant -> key *(s key) [s] quoted-pattern + -> key s key *(s key) quoted-pattern + +After matching ' ' to `s` and 'k2' to `key`, it would require arbitrary lookahead +to know whether to expect the start of a pattern or the start of another key. +In other words: is the second whitespace sequence the required space in *(s key), +or the optional space in [s] quoted-pattern? + +This is addressed using "backtracking" (similarly to `parseOptions()`). +*/ + + SelectorKeys::Builder keysBuilder(status); + if (U_FAILURE(status)) { + return result; + } + + // Since the first key is required, it's simplest to parse it separately. + keysBuilder.add(parseKey(status), status); + + // Restore precondition + if (!inBounds()) { + ERROR(status); + return result; + } + + // We've seen at least one whitespace-key pair, so now we can parse + // *(s key) [s] + while (peek() != LEFT_CURLY_BRACE || isWhitespace(peek()) || isBidiControl(peek())) { + bool wasWhitespace = isWhitespace(peek()) || isBidiControl(peek()); + parseRequiredWhitespace(status); + if (!wasWhitespace) { + // Avoid infinite loop when parsing something like: + // when * @{!... + next(); + } + + // Restore precondition + if (!inBounds()) { + ERROR(status); + return result; + } + + // At this point, it's ambiguous whether we are inside (s key) or [s]. + // This check resolves that ambiguity. + if (peek() == LEFT_CURLY_BRACE) { + // A pattern follows, so what we just parsed was the optional + // trailing whitespace. All the keys have been parsed. + + // Unpush the whitespace from `normalizedInput` + normalizedInput.truncate(normalizedInput.length() - 1); + break; + } + keysBuilder.add(parseKey(status), status); + } + + return keysBuilder.build(status); +} + +Pattern Parser::parseQuotedPattern(UErrorCode& status) { + U_ASSERT(inBounds()); + + parseToken(LEFT_CURLY_BRACE, status); + parseToken(LEFT_CURLY_BRACE, status); + Pattern p = parseSimpleMessage(status); + parseToken(RIGHT_CURLY_BRACE, status); + parseToken(RIGHT_CURLY_BRACE, status); + return p; +} + +/* + Consume a `placeholder`, matching the nonterminal in the grammar + No postcondition (a markup can end a message) +*/ +Markup Parser::parseMarkup(UErrorCode& status) { + U_ASSERT(inBounds(1)); + + U_ASSERT(peek() == LEFT_CURLY_BRACE); + + Markup::Builder builder(status); + if (U_FAILURE(status)) { + return {}; + } + + // Consume the '{' + next(); + normalizedInput += LEFT_CURLY_BRACE; + parseOptionalWhitespace(); + bool closing = false; + switch (peek()) { + case NUMBER_SIGN: { + // Open or standalone; consume the '#' + normalizedInput += peek(); + next(); + break; + } + case SLASH: { + // Closing + normalizedInput += peek(); + closing = true; + next(); + break; + } + default: { + ERROR(status); + return {}; + } + } + + // Parse the markup identifier + builder.setName(parseIdentifier(status)); + + // Parse the options, which must begin with a ' ' + // if present + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { + OptionAdder<Markup::Builder> optionAdder(builder); + parseOptions(optionAdder, status); + } + + // Parse the attributes, which also must begin + // with a ' ' + if (inBounds() && (isWhitespace(peek()) || isBidiControl(peek()))) { + AttributeAdder<Markup::Builder> attrAdder(builder); + parseAttributes(attrAdder, status); + } + + parseOptionalWhitespace(); + + bool standalone = false; + // Check if this is a standalone or not + if (!closing) { + if (inBounds() && peek() == SLASH) { + standalone = true; + normalizedInput += SLASH; + next(); + } + } + + parseToken(RIGHT_CURLY_BRACE, status); + + if (standalone) { + builder.setStandalone(); + } else if (closing) { + builder.setClose(); + } else { + builder.setOpen(); + } + + return builder.build(status); +} + +/* + Consume a `placeholder`, matching the nonterminal in the grammar + No postcondition (a placeholder can end a message) +*/ +std::variant<Expression, Markup> Parser::parsePlaceholder(UErrorCode& status) { + U_ASSERT(peek() == LEFT_CURLY_BRACE); + + if (!inBounds()) { + ERROR(status); + return exprFallback(status); + } + + // Need to look ahead arbitrarily since whitespace + // can appear before the '{' and '#' + // in markup + int32_t tempIndex = 1; + bool isMarkup = false; + while (inBounds(1)) { + UChar32 c = peek(tempIndex); + if (c == NUMBER_SIGN || c == SLASH) { + isMarkup = true; + break; + } + if (!(isWhitespace(c) || isBidiControl(c))) { + break; + } + tempIndex++; + } + + if (isMarkup) { + return parseMarkup(status); + } + return parseExpression(status); +} + +/* + Consume a `simple-message`, matching the nonterminal in the grammar + Postcondition: `index == len()` or U_FAILURE(status); + for a syntactically correct message, this will consume the entire input +*/ +Pattern Parser::parseSimpleMessage(UErrorCode& status) { + Pattern::Builder result(status); + + if (U_SUCCESS(status)) { + Expression expression; + while (inBounds()) { + switch (peek()) { + case LEFT_CURLY_BRACE: { + // Must be placeholder + std::variant<Expression, Markup> piece = parsePlaceholder(status); + if (std::holds_alternative<Expression>(piece)) { + Expression expr = *std::get_if<Expression>(&piece); + result.add(std::move(expr), status); + } else { + Markup markup = *std::get_if<Markup>(&piece); + result.add(std::move(markup), status); + } + break; + } + case BACKSLASH: { + // Must be escaped-char + result.add(parseEscapeSequence(status), status); + break; + } + case RIGHT_CURLY_BRACE: { + // Distinguish unescaped '}' from end of quoted pattern + break; + } + default: { + // Must be text-char + result.add(parseTextChar(status), status); + break; + } + } + if (peek() == RIGHT_CURLY_BRACE) { + // End of quoted pattern + break; + } + // Don't loop infinitely + if (errors.hasSyntaxError() || U_FAILURE(status)) { + break; + } + } + } + return result.build(status); +} + +void Parser::parseVariant(UErrorCode& status) { + CHECK_ERROR(status); + + // At least one key is required + SelectorKeys keyList(parseNonEmptyKeys(status)); + + // parseNonEmptyKeys() consumes any trailing whitespace, + // so the pattern can be consumed next. + + // Restore precondition before calling parsePattern() + // (which must return a non-null value) + CHECK_BOUNDS(status); + Pattern rhs = parseQuotedPattern(status); + + dataModel.addVariant(std::move(keyList), std::move(rhs), status); +} + +/* + Consume a `selectors` (matching the nonterminal in the grammar), + followed by a non-empty sequence of `variant`s (matching the nonterminal + in the grammar) preceded by whitespace + No postcondition (on return, `index` might equal `len()` with no syntax error + because a message can end with a variant) +*/ +void Parser::parseSelectors(UErrorCode& status) { + CHECK_ERROR(status); + + U_ASSERT(inBounds()); + + parseToken(ID_MATCH, status); + + bool empty = true; + // Parse selectors + // "Backtracking" is required here. It's not clear if whitespace is + // (`[s]` selector) or (`[s]` variant) + while (isWhitespace(peek()) || peek() == DOLLAR) { + int32_t whitespaceStart = index; + parseRequiredWhitespace(status); + // Restore precondition + CHECK_BOUNDS(status); + if (peek() != DOLLAR) { + // This is not necessarily an error, but rather, + // means the whitespace we parsed was the optional + // whitespace preceding the first variant, not the + // required whitespace preceding a subsequent variable. + // In that case, "push back" the whitespace. + normalizedInput.truncate(normalizedInput.length() - 1); + index = whitespaceStart; + break; + } + VariableName var = parseVariableName(status); + empty = false; + + dataModel.addSelector(std::move(var), status); + CHECK_ERROR(status); + } + + // At least one selector is required + if (empty) { + ERROR(status); + return; + } + + #define CHECK_END_OF_INPUT \ + if (!inBounds()) { \ + break; \ + } \ + + // Parse variants + // matcher = match-statement s variant *(o variant) + + // Parse first variant + parseRequiredWhitespace(status); + if (!inBounds()) { + ERROR(status); + return; + } + parseVariant(status); + if (!inBounds()) { + // Not an error; there might be only one variant + return; + } + + while (isWhitespace(peek()) || isBidiControl(peek()) || isKeyStart(peek())) { + parseOptionalWhitespace(); + // Restore the precondition. + // Trailing whitespace is allowed. + if (!inBounds()) { + return; + } + + parseVariant(status); + + // Restore the precondition, *without* erroring out if we've + // reached the end of input. That's because it's valid for the + // message to end with a variant that has no trailing whitespace. + // Why do we need to check this condition twice inside the loop? + // Because if we don't check it here, the `isWhitespace()` call in + // the loop head will read off the end of the input string. + CHECK_END_OF_INPUT + + if (errors.hasSyntaxError() || U_FAILURE(status)) { + break; + } + } +} + +/* + Consume a `body` (matching the nonterminal in the grammar), + No postcondition (on return, `index` might equal `len()` with no syntax error, + because a message can end with a body (trailing whitespace is optional) +*/ + +void Parser::errorPattern(UErrorCode& status) { + errors.addSyntaxError(status); + // Set to empty pattern + Pattern::Builder result = Pattern::Builder(status); + CHECK_ERROR(status); + + // If still in bounds, then add the remaining input as a single text part + // to the pattern + /* + TODO: this behavior isn't documented in the spec, but it comes from + https://github.com/messageformat/messageformat/blob/e0087bff312d759b67a9129eac135d318a1f0ce7/packages/mf2-messageformat/src/__fixtures/test-messages.json#L236 + and a pending pull request https://github.com/unicode-org/message-format-wg/pull/462 will clarify + whether this is the intent behind the spec + */ + UnicodeString partStr(LEFT_CURLY_BRACE); + while (inBounds()) { + partStr += peek(); + next(); + } + // Add curly braces around the entire output (same comment as above) + partStr += RIGHT_CURLY_BRACE; + result.add(std::move(partStr), status); + dataModel.setPattern(result.build(status)); +} + +void Parser::parseBody(UErrorCode& status) { + CHECK_ERROR(status); + + // Out-of-input is a syntax warning + if (!inBounds()) { + errorPattern(status); + return; + } + + // Body must be either a pattern or selectors + switch (peek()) { + case LEFT_CURLY_BRACE: { + // Pattern + dataModel.setPattern(parseQuotedPattern(status)); + break; + } + case ID_MATCH[0]: { + // Selectors + parseSelectors(status); + return; + } + default: { + ERROR(status); + errorPattern(status); + return; + } + } +} + +// ------------------------------------- +// Parses the source pattern. + +void Parser::parse(UParseError &parseErrorResult, UErrorCode& status) { + CHECK_ERROR(status); + + bool complex = false; + // First, "look ahead" to determine if this is a simple or complex + // message. To do that, check the first non-whitespace character. + while (inBounds(index) && (isWhitespace(peek()) || isBidiControl(peek()))) { + next(); + } + + // Message can be empty, so we need to only look ahead + // if we know it's non-empty + if (inBounds()) { + if (peek() == PERIOD + || (inBounds(1) + && peek() == LEFT_CURLY_BRACE + && peek(1) == LEFT_CURLY_BRACE)) { + complex = true; + } + } + // Reset index + index = 0; + + // Message can be empty, so we need to only look ahead + // if we know it's non-empty + if (complex) { + parseOptionalWhitespace(); + parseDeclarations(status); + parseBody(status); + parseOptionalWhitespace(); + } else { + // Simple message + // For normalization, quote the pattern + normalizedInput += LEFT_CURLY_BRACE; + normalizedInput += LEFT_CURLY_BRACE; + dataModel.setPattern(parseSimpleMessage(status)); + normalizedInput += RIGHT_CURLY_BRACE; + normalizedInput += RIGHT_CURLY_BRACE; + } + + CHECK_ERROR(status); + + // There are no errors; finally, check that the entire input was consumed + if (!allConsumed()) { + ERROR(status); + } + + // Finally, copy the relevant fields of the internal `MessageParseError` + // into the `UParseError` argument + translateParseError(parseError, parseErrorResult); +} + +Parser::~Parser() {} + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_parser.h b/deps/icu-small/source/i18n/messageformat2_parser.h new file mode 100644 index 00000000000000..e3af5349fd4d58 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_parser.h @@ -0,0 +1,252 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT_PARSER_H +#define MESSAGEFORMAT_PARSER_H + +#include "unicode/messageformat2_data_model.h" +#include "unicode/parseerr.h" +#include "unicode/uniset.h" + +#include "messageformat2_allocation.h" +#include "messageformat2_errors.h" + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // Used for parameterizing options parsing code + // over the two builders that use it (Operator and Markup) + template <class T> + class OptionAdder { + private: + T& builder; + public: + OptionAdder(T& b) : builder(b) {} + void addOption(const UnicodeString& k, Operand&& r, UErrorCode& s) { + builder.addOption(k, std::move(r), s); + } + }; + + // Used for parameterizing attributes parsing code + // over the two builders that use it (Expression and Markup) + // Unfortunately the same OptionAdder class can't just be reused, + // becaues duplicate options are forbidden while duplicate attributes are not + template <class T> + class AttributeAdder { + private: + T& builder; + public: + AttributeAdder(T& b) : builder(b) {} + void addAttribute(const UnicodeString& k, Operand&& r, UErrorCode& s) { + builder.addAttribute(k, std::move(r), s); + } + }; + + + // Initialization of UnicodeSets + namespace unisets { + enum Key { + CONTENT, + WHITESPACE, + BIDI, + ALPHA, + DIGIT, + NAME_START, + NAME_CHAR, + TEXT, + QUOTED, + ESCAPABLE, + UNISETS_KEY_COUNT + }; + + U_I18N_API const UnicodeSet* get(Key key, UErrorCode& status); + } + + // Parser class (private) + class Parser : public UMemory { + public: + virtual ~Parser(); + private: + friend class MessageFormatter; + + void parse(UParseError&, UErrorCode&); + + /* + Use an internal "parse error" structure to make it easier to translate + absolute offsets to line offsets. + This is translated back to a `UParseError` at the end of parsing. + */ + typedef struct MessageParseError { + // The line on which the error occurred + uint32_t line; + // The offset, relative to the erroneous line, on which the error occurred + uint32_t offset; + // The total number of characters seen before advancing to the current line. It has a value of 0 if line == 0. + // It includes newline characters, because the index does too. + uint32_t lengthBeforeCurrentLine; + + // This parser doesn't yet use the last two fields. + UChar preContext[U_PARSE_CONTEXT_LEN]; + UChar postContext[U_PARSE_CONTEXT_LEN]; + } MessageParseError; + + Parser(const UnicodeString &input, + MFDataModel::Builder& dataModelBuilder, + StaticErrors& e, + UnicodeString& normalizedInputRef, + UErrorCode& status) + : contentChars(unisets::get(unisets::CONTENT, status)), + whitespaceChars(unisets::get(unisets::WHITESPACE, status)), + bidiControlChars(unisets::get(unisets::BIDI, status)), + alphaChars(unisets::get(unisets::ALPHA, status)), + digitChars(unisets::get(unisets::DIGIT, status)), + nameStartChars(unisets::get(unisets::NAME_START, status)), + nameChars(unisets::get(unisets::NAME_CHAR, status)), + textChars(unisets::get(unisets::TEXT, status)), + quotedChars(unisets::get(unisets::QUOTED, status)), + escapableChars(unisets::get(unisets::ESCAPABLE, status)), + source(input), index(0), errors(e), normalizedInput(normalizedInputRef), dataModel(dataModelBuilder) { + (void) status; + parseError.line = 0; + parseError.offset = 0; + parseError.lengthBeforeCurrentLine = 0; + parseError.preContext[0] = '\0'; + parseError.postContext[0] = '\0'; + } + + bool isContentChar(UChar32) const; + bool isBidiControl(UChar32) const; + bool isWhitespace(UChar32) const; + bool isTextChar(UChar32) const; + bool isQuotedChar(UChar32) const; + bool isEscapableChar(UChar32) const; + bool isAlpha(UChar32) const; + bool isDigit(UChar32) const; + bool isNameStart(UChar32) const; + bool isNameChar(UChar32) const; + bool isUnquotedStart(UChar32) const; + bool isLiteralStart(UChar32) const; + bool isKeyStart(UChar32) const; + + static void translateParseError(const MessageParseError&, UParseError&); + static void setParseError(MessageParseError&, uint32_t); + void maybeAdvanceLine(); + Pattern parseSimpleMessage(UErrorCode&); + void parseBody(UErrorCode&); + void parseDeclarations(UErrorCode&); + void parseUnsupportedStatement(UErrorCode&); + void parseLocalDeclaration(UErrorCode&); + void parseInputDeclaration(UErrorCode&); + void parseSelectors(UErrorCode&); + void parseVariant(UErrorCode&); + + void parseRequiredWS(UErrorCode&); + void parseRequiredWhitespace(UErrorCode&); + void parseOptionalBidi(); + void parseOptionalWhitespace(); + void parseToken(UChar32, UErrorCode&); + void parseTokenWithWhitespace(UChar32, UErrorCode&); + void parseToken(const std::u16string_view&, UErrorCode&); + void parseTokenWithWhitespace(const std::u16string_view&, UErrorCode&); + bool nextIs(const std::u16string_view&) const; + UnicodeString parseNameChars(UnicodeString&, UErrorCode&); + UnicodeString parseName(UErrorCode&); + UnicodeString parseIdentifier(UErrorCode&); + UnicodeString parseDigits(UErrorCode&); + VariableName parseVariableName(UErrorCode&); + FunctionName parseFunction(UErrorCode&); + UnicodeString parseEscapeSequence(UErrorCode&); + Literal parseUnquotedLiteral(UErrorCode&); + Literal parseQuotedLiteral(UErrorCode&); + Literal parseLiteral(UErrorCode&); + template<class T> + void parseAttribute(AttributeAdder<T>&, UErrorCode&); + template<class T> + void parseAttributes(AttributeAdder<T>&, UErrorCode&); + template<class T> + void parseOption(OptionAdder<T>&, UErrorCode&); + template<class T> + void parseOptions(OptionAdder<T>&, UErrorCode&); + Operator parseAnnotation(UErrorCode&); + void parseLiteralOrVariableWithAnnotation(bool, Expression::Builder&, UErrorCode&); + Markup parseMarkup(UErrorCode&); + Expression parseExpression(UErrorCode&); + std::variant<Expression, Markup> parsePlaceholder(UErrorCode&); + UnicodeString parseTextChar(UErrorCode&); + Key parseKey(UErrorCode&); + SelectorKeys parseNonEmptyKeys(UErrorCode&); + void errorPattern(UErrorCode& status); + Pattern parseQuotedPattern(UErrorCode&); + bool isDeclarationStart(); + + UChar32 peek() const { return source.char32At(index) ; } + UChar32 peek(uint32_t i) const { + return source.char32At(source.moveIndex32(index, i)); + } + void next() { index = source.moveIndex32(index, 1); } + + bool inBounds() const { return (int32_t) index < source.length(); } + bool inBounds(uint32_t i) const { return source.moveIndex32(index, i) < source.length(); } + bool allConsumed() const { return (int32_t) index == source.length(); } + + // UnicodeSets for checking character ranges + const UnicodeSet* contentChars; + const UnicodeSet* whitespaceChars; + const UnicodeSet* bidiControlChars; + const UnicodeSet* alphaChars; + const UnicodeSet* digitChars; + const UnicodeSet* nameStartChars; + const UnicodeSet* nameChars; + const UnicodeSet* textChars; + const UnicodeSet* quotedChars; + const UnicodeSet* escapableChars; + + // The input string + const UnicodeString &source; + // The current position within the input string -- counting in UChar32 + uint32_t index; + // Represents the current line (and when an error is indicated), + // character offset within the line of the parse error + MessageParseError parseError; + + // The structure to use for recording errors + StaticErrors& errors; + + // Normalized version of the input string (optional whitespace removed) + UnicodeString& normalizedInput; + + // The parent builder + MFDataModel::Builder &dataModel; + + }; // class Parser +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_PARSER_H + +#endif // U_HIDE_DEPRECATED_API +// eof diff --git a/deps/icu-small/source/i18n/messageformat2_serializer.cpp b/deps/icu-small/source/i18n/messageformat2_serializer.cpp new file mode 100644 index 00000000000000..dfae0083392bf1 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_serializer.cpp @@ -0,0 +1,292 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" +#include "messageformat2_macros.h" +#include "messageformat2_serializer.h" +#include "uvector.h" // U_ASSERT + +U_NAMESPACE_BEGIN + +namespace message2 { + +// Generates a string representation of a data model +// ------------------------------------------------ + +using namespace data_model; + +// Private helper methods + +void Serializer::whitespace() { + result += SPACE; +} + +void Serializer::emit(UChar32 c) { + result += c; +} + +void Serializer::emit(const UnicodeString& s) { + result += s; +} + +void Serializer::emit(const std::u16string_view& token) { + result.append(token); +} + +void Serializer::emit(const Literal& l) { + if (l.isQuoted()) { + emit(PIPE); + } + const UnicodeString& contents = l.unquoted(); + for (int32_t i = 0; ((int32_t) i) < contents.length(); i++) { + // Re-escape any escaped-char characters + switch(contents[i]) { + case BACKSLASH: + case PIPE: + case LEFT_CURLY_BRACE: + case RIGHT_CURLY_BRACE: { + emit(BACKSLASH); + break; + } + default: { + break; + } + } + emit(contents[i]); + } + if (l.isQuoted()) { + emit(PIPE); + } +} + +void Serializer::emit(const Key& k) { + if (k.isWildcard()) { + emit(ASTERISK); + return; + } + emit(k.asLiteral()); +} + +void Serializer::emit(const SelectorKeys& k) { + const Key* ks = k.getKeysInternal(); + int32_t len = k.len; + // It would be an error for `keys` to be empty; + // that would mean this is the single `pattern` + // variant, and in that case, this method shouldn't be called + U_ASSERT(len > 0); + for (int32_t i = 0; i < len; i++) { + if (i != 0) { + whitespace(); + } + emit(ks[i]); + } +} + +void Serializer::emit(const Operand& rand) { + U_ASSERT(!rand.isNull()); + + if (rand.isVariable()) { + emit(DOLLAR); + emit(rand.asVariable()); + } else { + // Literal: quoted or unquoted + emit(rand.asLiteral()); + } +} + +void Serializer::emit(const OptionMap& options) { + // Errors should have been checked before this point + UErrorCode localStatus = U_ZERO_ERROR; + U_ASSERT(!options.bogus); + for (int32_t i = 0; i < options.size(); i++) { + const Option& opt = options.getOption(i, localStatus); + // No need to check error code, since we already checked + // that !bogus + whitespace(); + emit(opt.getName()); + emit(EQUALS); + emit(opt.getValue()); + } +} + +void Serializer::emitAttributes(const OptionMap& attributes) { + // Errors should have been checked before this point + UErrorCode localStatus = U_ZERO_ERROR; + U_ASSERT(!attributes.bogus); + for (int32_t i = 0; i < attributes.size(); i++) { + const Option& attr = attributes.getOption(i, localStatus); + // No need to check error code, since we already checked + // that !bogus + whitespace(); + emit(AT); + emit(attr.getName()); + const Operand& v = attr.getValue(); + if (!v.isNull()) { + emit(EQUALS); + emit(v); + } + } +} + + void Serializer::emit(const Expression& expr) { + emit(LEFT_CURLY_BRACE); + + if (!expr.isFunctionCall()) { + // Literal or variable, no annotation + emit(expr.getOperand()); + } else { + // Function call or reserved + if (!expr.isStandaloneAnnotation()) { + // Must be a function call that has an operand + emit(expr.getOperand()); + whitespace(); + } + UErrorCode localStatus = U_ZERO_ERROR; + const Operator* rator = expr.getOperator(localStatus); + U_ASSERT(U_SUCCESS(localStatus)); + emit(COLON); + emit(rator->getFunctionName()); + // No whitespace after function name, in case it has + // no options. (when there are options, emit(OptionMap) will + // emit the leading whitespace) + emit(rator->getOptionsInternal()); + } + emitAttributes(expr.getAttributesInternal()); + emit(RIGHT_CURLY_BRACE); +} + +void Serializer::emit(const PatternPart& part) { + if (part.isText()) { + // Raw text + const UnicodeString& text = part.asText(); + // Re-escape '{'/'}'/'\''|' + for (int32_t i = 0; ((int32_t) i) < text.length(); i++) { + switch(text[i]) { + case PIPE: + case BACKSLASH: + case LEFT_CURLY_BRACE: + case RIGHT_CURLY_BRACE: { + emit(BACKSLASH); + break; + } + default: + break; + } + emit(text[i]); + } + return; + } + // Markup + if (part.isMarkup()) { + const Markup& markup = part.asMarkup(); + emit(LEFT_CURLY_BRACE); + if (markup.isClose()) { + emit(SLASH); + } else { + emit(NUMBER_SIGN); + } + emit(markup.getName()); + emit(markup.getOptionsInternal()); + emitAttributes(markup.getAttributesInternal()); + if (markup.isStandalone()) { + emit(SLASH); + } + emit(RIGHT_CURLY_BRACE); + return; + } + // Expression + emit(part.contents()); +} + +void Serializer::emit(const Pattern& pat) { + int32_t len = pat.numParts(); + // Always quote pattern, which should match the normalized input + // if the parser is constructing it correctly + emit(LEFT_CURLY_BRACE); + emit(LEFT_CURLY_BRACE); + for (int32_t i = 0; i < len; i++) { + // No whitespace is needed here -- see the `pattern` nonterminal in the grammar + emit(pat.getPart(i)); + } + emit(RIGHT_CURLY_BRACE); + emit(RIGHT_CURLY_BRACE); +} + +void Serializer::serializeDeclarations() { + const Binding* bindings = dataModel.getLocalVariablesInternal(); + U_ASSERT(dataModel.bindingsLen == 0 || bindings != nullptr); + + for (int32_t i = 0; i < dataModel.bindingsLen; i++) { + const Binding& b = bindings[i]; + if (b.isLocal()) { + // No whitespace needed here -- see `message` in the grammar + emit(ID_LOCAL); + whitespace(); + emit(DOLLAR); + emit(b.getVariable()); + // No whitespace needed here -- see `local-declaration` in the grammar + emit(EQUALS); + // No whitespace needed here -- see `local-declaration` in the grammar + } else { + // Input declaration + emit(ID_INPUT); + // No whitespace needed here -- see `input-declaration` in the grammar + } + emit(b.getValue()); + } +} + +void Serializer::serializeSelectors() { + U_ASSERT(!dataModel.hasPattern()); + const VariableName* selectors = dataModel.getSelectorsInternal(); + + emit(ID_MATCH); + for (int32_t i = 0; i < dataModel.numSelectors(); i++) { + whitespace(); + emit(DOLLAR); + emit(selectors[i]); + } +} + +void Serializer::serializeVariants() { + U_ASSERT(!dataModel.hasPattern()); + const Variant* variants = dataModel.getVariantsInternal(); + whitespace(); + for (int32_t i = 0; i < dataModel.numVariants(); i++) { + const Variant& v = variants[i]; + emit(v.getKeys()); + // No whitespace needed here -- see `variant` in the grammar + emit(v.getPattern()); + } +} + + +// Main (public) serializer method +void Serializer::serialize() { + serializeDeclarations(); + // Pattern message + if (dataModel.hasPattern()) { + emit(dataModel.getPattern()); + } else { + // Selectors message + serializeSelectors(); + serializeVariants(); + } +} + +} // namespace message2 +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ diff --git a/deps/icu-small/source/i18n/messageformat2_serializer.h b/deps/icu-small/source/i18n/messageformat2_serializer.h new file mode 100644 index 00000000000000..f190b255f0d3e5 --- /dev/null +++ b/deps/icu-small/source/i18n/messageformat2_serializer.h @@ -0,0 +1,76 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef U_HIDE_DEPRECATED_API + +#ifndef MESSAGEFORMAT_SERIALIZER_H +#define MESSAGEFORMAT_SERIALIZER_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model.h" + +U_NAMESPACE_BEGIN + +namespace message2 { + + using namespace data_model; + + // Serializer class (private) + // Converts a data model back to a string + // TODO: Should be private; made public so tests + // can use it + class U_I18N_API Serializer : public UMemory { + public: + Serializer(const MFDataModel& m, UnicodeString& s) : dataModel(m), result(s) {} + void serialize(); + + const MFDataModel& dataModel; + UnicodeString& result; + + private: + + void whitespace(); + void emit(UChar32); + void emit(const std::u16string_view&); + void emit(const UnicodeString&); + void emit(const Literal&); + void emit(const Key&); + void emit(const SelectorKeys&); + void emit(const Operand&); + void emit(const Expression&); + void emit(const PatternPart&); + void emit(const Pattern&); + void emit(const Variant*); + void emitAttributes(const OptionMap&); + void emit(const OptionMap&); + void serializeDeclarations(); + void serializeSelectors(); + void serializeVariants(); + }; // class Serializer + +} // namespace message2 + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_SERIALIZER_H + +#endif // U_HIDE_DEPRECATED_API +// eof + diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 29fb4b3a01bf5f..ae6e76c99debd3 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -355,8 +355,8 @@ UBool MessageFormat::allocateArgTypes(int32_t capacity, UErrorCode& status) { } else if (capacity < 2*argTypeCapacity) { capacity = 2*argTypeCapacity; } - Formattable::Type* a = (Formattable::Type*) - uprv_realloc(argTypes, sizeof(*argTypes) * capacity); + Formattable::Type* a = static_cast<Formattable::Type*>( + uprv_realloc(argTypes, sizeof(*argTypes) * capacity)); if (a == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return false; @@ -424,8 +424,8 @@ MessageFormat::operator==(const Format& rhs) const if (cur->key.integer != rhs_cur->key.integer) { return false; } - const Format* format = (const Format*)uhash_iget(cachedFormatters, cur->key.integer); - const Format* rhs_format = (const Format*)uhash_iget(that.cachedFormatters, rhs_cur->key.integer); + const Format* format = static_cast<const Format*>(uhash_iget(cachedFormatters, cur->key.integer)); + const Format* rhs_format = static_cast<const Format*>(uhash_iget(that.cachedFormatters, rhs_cur->key.integer)); if (*format != *rhs_format) { return false; } @@ -596,8 +596,8 @@ Format* MessageFormat::getCachedFormatter(int32_t argumentNumber) const { return nullptr; } void* ptr = uhash_iget(cachedFormatters, argumentNumber); - if (ptr != nullptr && dynamic_cast<DummyFormat*>((Format*)ptr) == nullptr) { - return (Format*) ptr; + if (ptr != nullptr && dynamic_cast<DummyFormat*>(static_cast<Format*>(ptr)) == nullptr) { + return static_cast<Format*>(ptr); } else { // Not cached, or a DummyFormat representing setFormat(nullptr). return nullptr; @@ -820,16 +820,16 @@ MessageFormat::getFormats(int32_t& cnt) const cnt = 0; if (formatAliases == nullptr) { t->formatAliasesCapacity = totalCapacity; - Format** a = (Format**) - uprv_malloc(sizeof(Format*) * formatAliasesCapacity); + Format** a = static_cast<Format**>( + uprv_malloc(sizeof(Format*) * formatAliasesCapacity)); if (a == nullptr) { t->formatAliasesCapacity = 0; return nullptr; } t->formatAliases = a; } else if (totalCapacity > formatAliasesCapacity) { - Format** a = (Format**) - uprv_realloc(formatAliases, sizeof(Format*) * totalCapacity); + Format** a = static_cast<Format**>( + uprv_realloc(formatAliases, sizeof(Format*) * totalCapacity)); if (a == nullptr) { t->formatAliasesCapacity = 0; return nullptr; @@ -1086,7 +1086,7 @@ void MessageFormat::format(int32_t msgStart, const void *plNumber, // that formats the number without subtracting the offset. appendTo.formatAndAppend(pluralNumber.formatter, *arg, success); } - } else if ((formatter = getCachedFormatter(i -2)) != 0) { + } else if ((formatter = getCachedFormatter(i - 2)) != nullptr) { // Handles all ArgType.SIMPLE, and formatters from setFormat() and its siblings. if (dynamic_cast<const ChoiceFormat*>(formatter) || dynamic_cast<const PluralFormat*>(formatter) || @@ -1346,7 +1346,7 @@ void MessageFormat::copyObjects(const MessageFormat& that, UErrorCode& ec) { int32_t pos, idx; for (idx = 0, pos = UHASH_FIRST; idx < count && U_SUCCESS(ec); ++idx) { const UHashElement* cur = uhash_nextElement(that.cachedFormatters, &pos); - Format* newFormat = ((Format*)(cur->value.pointer))->clone(); + Format* newFormat = static_cast<Format*>(cur->value.pointer)->clone(); if (newFormat) { uhash_iput(cachedFormatters, cur->key.integer, newFormat, &ec); } else { @@ -1827,7 +1827,7 @@ MessageFormat::createIntegerFormat(const Locale& locale, UErrorCode& status) con */ const NumberFormat* MessageFormat::getDefaultNumberFormat(UErrorCode& ec) const { if (defaultNumberFormat == nullptr) { - MessageFormat* t = (MessageFormat*) this; + MessageFormat* t = const_cast<MessageFormat*>(this); t->defaultNumberFormat = NumberFormat::createInstance(fLocale, ec); if (U_FAILURE(ec)) { delete t->defaultNumberFormat; @@ -1848,7 +1848,7 @@ const NumberFormat* MessageFormat::getDefaultNumberFormat(UErrorCode& ec) const */ const DateFormat* MessageFormat::getDefaultDateFormat(UErrorCode& ec) const { if (defaultDateFormat == nullptr) { - MessageFormat* t = (MessageFormat*) this; + MessageFormat* t = const_cast<MessageFormat*>(this); t->defaultDateFormat = DateFormat::createDateTimeInstance(DateFormat::kShort, DateFormat::kShort, fLocale); if (t->defaultDateFormat == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; @@ -1868,7 +1868,7 @@ MessageFormat::getArgTypeCount() const { } UBool MessageFormat::equalFormats(const void* left, const void* right) { - return *(const Format*)left==*(const Format*)right; + return *static_cast<const Format*>(left) == *static_cast<const Format*>(right); } @@ -1923,7 +1923,7 @@ FormatNameEnumeration::FormatNameEnumeration(LocalPointer<UVector> nameList, UEr const UnicodeString* FormatNameEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && pos < fFormatNames->size()) { - return (const UnicodeString*)fFormatNames->elementAt(pos++); + return static_cast<const UnicodeString*>(fFormatNames->elementAt(pos++)); } return nullptr; } @@ -1972,7 +1972,7 @@ UnicodeString MessageFormat::PluralSelectorProvider::select(void *ctx, double nu context.numberArgIndex = msgFormat.findFirstPluralNumberArg(otherIndex, context.argName); if(context.numberArgIndex > 0 && msgFormat.cachedFormatters != nullptr) { context.formatter = - (const Format*)uhash_iget(msgFormat.cachedFormatters, context.numberArgIndex); + static_cast<const Format*>(uhash_iget(msgFormat.cachedFormatters, context.numberArgIndex)); } if(context.formatter == nullptr) { context.formatter = msgFormat.getDefaultNumberFormat(ec); @@ -1983,7 +1983,7 @@ UnicodeString MessageFormat::PluralSelectorProvider::select(void *ctx, double nu return UnicodeString(false, OTHER_STRING, 5); } context.formatter->format(context.number, context.numberString, ec); - auto* decFmt = dynamic_cast<const DecimalFormat *>(context.formatter); + const auto* decFmt = dynamic_cast<const DecimalFormat*>(context.formatter); if(decFmt != nullptr) { number::impl::DecimalQuantity dq; decFmt->formatToDecimalQuantity(context.number, dq, ec); diff --git a/deps/icu-small/source/i18n/name2uni.cpp b/deps/icu-small/source/i18n/name2uni.cpp index 2d26dba812c46d..a15a0469cb5cd1 100644 --- a/deps/icu-small/source/i18n/name2uni.cpp +++ b/deps/icu-small/source/i18n/name2uni.cpp @@ -66,7 +66,7 @@ NameUnicodeTransliterator::NameUnicodeTransliterator(UnicodeFilter* adoptedFilte UnicodeSet *legalPtr = &legal; // Get the legal character set USetAdder sa = { - (USet *)legalPtr, // USet* == UnicodeSet* + reinterpret_cast<USet*>(legalPtr), // USet* == UnicodeSet* _set_add, nullptr, // Don't need _set_addRange nullptr, // Don't need _set_addString @@ -121,7 +121,7 @@ void NameUnicodeTransliterator::handleTransliterate(Replaceable& text, UTransPos // Accommodate the longest possible name ++maxLen; // allow for temporary trailing space - char* cbuf = (char*) uprv_malloc(maxLen); + char* cbuf = static_cast<char*>(uprv_malloc(maxLen)); if (cbuf == nullptr) { offsets.start = offsets.limit; return; diff --git a/deps/icu-small/source/i18n/name2uni.h b/deps/icu-small/source/i18n/name2uni.h index 6881c6bc85745c..ba8fbc823990e3 100644 --- a/deps/icu-small/source/i18n/name2uni.h +++ b/deps/icu-small/source/i18n/name2uni.h @@ -33,7 +33,7 @@ class NameUnicodeTransliterator : public Transliterator { * Constructs a transliterator. * @param adoptedFilter the filter for this transliterator. */ - NameUnicodeTransliterator(UnicodeFilter* adoptedFilter = 0); + NameUnicodeTransliterator(UnicodeFilter* adoptedFilter = nullptr); /** * Destructor. diff --git a/deps/icu-small/source/i18n/nfrlist.h b/deps/icu-small/source/i18n/nfrlist.h index 1864d4d3bd99e5..bb19cb2beac9a9 100644 --- a/deps/icu-small/source/i18n/nfrlist.h +++ b/deps/icu-small/source/i18n/nfrlist.h @@ -39,7 +39,7 @@ class NFRuleList : public UMemory { uint32_t fCapacity; public: NFRuleList(uint32_t capacity = 10) - : fStuff(capacity ? (NFRule**)uprv_malloc(capacity * sizeof(NFRule*)) : nullptr) + : fStuff(capacity ? static_cast<NFRule**>(uprv_malloc(capacity * sizeof(NFRule*))) : nullptr) , fCount(0) , fCapacity(capacity) {} ~NFRuleList() { @@ -65,7 +65,7 @@ class NFRuleList : public UMemory { void add(NFRule* thing) { if (fCount == fCapacity) { fCapacity += 10; - fStuff = (NFRule**)uprv_realloc(fStuff, fCapacity * sizeof(NFRule*)); // assume success + fStuff = static_cast<NFRule**>(uprv_realloc(fStuff, fCapacity * sizeof(NFRule*))); // assume success } if (fStuff != nullptr) { fStuff[fCount++] = thing; diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 1f4b9b9d2945d8..75b279cccef47d 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -152,7 +152,7 @@ NFRuleSet::NFRuleSet(RuleBasedNumberFormat *_owner, UnicodeString* descriptions, UnicodeString& description = descriptions[index]; // !!! make sure index is valid - if (description.length() == 0) { + if (description.isEmpty()) { // throw new IllegalArgumentException("Empty rule set description"); status = U_PARSE_ERROR; return; @@ -164,9 +164,11 @@ NFRuleSet::NFRuleSet(RuleBasedNumberFormat *_owner, UnicodeString* descriptions, // and delete it from the description if (description.charAt(0) == gPercent) { int32_t pos = description.indexOf(gColon); - if (pos == -1) { + // if there are no name or the name is "%". + if (pos < 2) { // throw new IllegalArgumentException("Rule set name doesn't end in colon"); status = U_PARSE_ERROR; + return; } else { name.setTo(description, 0, pos); while (pos < description.length() && PatternProps::isWhiteSpace(description.charAt(++pos))) { @@ -177,16 +179,17 @@ NFRuleSet::NFRuleSet(RuleBasedNumberFormat *_owner, UnicodeString* descriptions, name.setTo(UNICODE_STRING_SIMPLE("%default")); } - if (description.length() == 0) { + if (description.isEmpty()) { // throw new IllegalArgumentException("Empty rule set description"); status = U_PARSE_ERROR; + return; } fIsPublic = name.indexOf(gPercentPercent, 2, 0) != 0; - if ( name.endsWith(gNoparse,8) ) { + if (name.endsWith(gNoparse, 8)) { fIsParseable = false; - name.truncate(name.length()-8); // remove the @noparse from the name + name.truncate(name.length() - 8); // remove the @noparse from the name } // all of the other members of NFRuleSet are initialized @@ -220,6 +223,9 @@ NFRuleSet::parseRules(UnicodeString& description, UErrorCode& status) } currentDescription.setTo(description, oldP, p - oldP); NFRule::makeRules(currentDescription, this, rules.last(), owner, rules, status); + if (U_FAILURE(status)) { + return; + } oldP = p + 1; } @@ -244,6 +250,9 @@ NFRuleSet::parseRules(UnicodeString& description, UErrorCode& status) // same as the preceding rule's base value in fraction // rule sets) rule->setBaseValue(defaultBaseValue, status); + if (U_FAILURE(status)) { + return; + } } else { // if it's a regular rule that already knows its base value, @@ -267,27 +276,35 @@ NFRuleSet::parseRules(UnicodeString& description, UErrorCode& status) * @param rule The rule to set. */ void NFRuleSet::setNonNumericalRule(NFRule *rule) { - int64_t baseValue = rule->getBaseValue(); - if (baseValue == NFRule::kNegativeNumberRule) { - delete nonNumericalRules[NEGATIVE_RULE_INDEX]; - nonNumericalRules[NEGATIVE_RULE_INDEX] = rule; - } - else if (baseValue == NFRule::kImproperFractionRule) { - setBestFractionRule(IMPROPER_FRACTION_RULE_INDEX, rule, true); - } - else if (baseValue == NFRule::kProperFractionRule) { - setBestFractionRule(PROPER_FRACTION_RULE_INDEX, rule, true); - } - else if (baseValue == NFRule::kDefaultRule) { - setBestFractionRule(DEFAULT_RULE_INDEX, rule, true); - } - else if (baseValue == NFRule::kInfinityRule) { - delete nonNumericalRules[INFINITY_RULE_INDEX]; - nonNumericalRules[INFINITY_RULE_INDEX] = rule; - } - else if (baseValue == NFRule::kNaNRule) { - delete nonNumericalRules[NAN_RULE_INDEX]; - nonNumericalRules[NAN_RULE_INDEX] = rule; + switch (rule->getBaseValue()) { + case NFRule::kNegativeNumberRule: + delete nonNumericalRules[NEGATIVE_RULE_INDEX]; + nonNumericalRules[NEGATIVE_RULE_INDEX] = rule; + return; + case NFRule::kImproperFractionRule: + setBestFractionRule(IMPROPER_FRACTION_RULE_INDEX, rule, true); + return; + case NFRule::kProperFractionRule: + setBestFractionRule(PROPER_FRACTION_RULE_INDEX, rule, true); + return; + case NFRule::kDefaultRule: + setBestFractionRule(DEFAULT_RULE_INDEX, rule, true); + return; + case NFRule::kInfinityRule: + delete nonNumericalRules[INFINITY_RULE_INDEX]; + nonNumericalRules[INFINITY_RULE_INDEX] = rule; + return; + case NFRule::kNaNRule: + delete nonNumericalRules[NAN_RULE_INDEX]; + nonNumericalRules[NAN_RULE_INDEX] = rule; + return; + case NFRule::kNoBase: + case NFRule::kOtherRule: + default: + // If we do not remember the rule inside the object. + // delete it here to prevent memory leak. + delete rule; + return; } } @@ -490,7 +507,7 @@ NFRuleSet::findNormalRule(int64_t number) const // to find the rule (we should only go into this clause if the // value is 0) if (fIsFractionRuleSet) { - return findFractionRuleSetRule((double)number); + return findFractionRuleSetRule(static_cast<double>(number)); } // if the number is negative, return the negative-number rule @@ -590,7 +607,7 @@ NFRuleSet::findFractionRuleSetRule(double number) const for (uint32_t i = 1; i < rules.size(); ++i) { leastCommonMultiple = util_lcm(leastCommonMultiple, rules[i]->getBaseValue()); } - numerator = util64_fromDouble(number * (double)leastCommonMultiple + 0.5); + numerator = util64_fromDouble(number * static_cast<double>(leastCommonMultiple) + 0.5); } // for each rule, do the following... int64_t tempDifference; @@ -632,9 +649,9 @@ NFRuleSet::findFractionRuleSetRule(double number) const // the numerator of the fraction is anything else (this lets us // do things like "one third"/"two thirds" without having to define // a whole bunch of extra rule sets) - if ((unsigned)(winner + 1) < rules.size() && + if (static_cast<unsigned>(winner + 1) < rules.size() && rules[winner + 1]->getBaseValue() == rules[winner]->getBaseValue()) { - double n = ((double)rules[winner]->getBaseValue()) * number; + double n = static_cast<double>(rules[winner]->getBaseValue()) * number; if (n < 0.5 || n >= 2) { ++winner; } @@ -681,7 +698,7 @@ static void dumpUS(FILE* f, const UnicodeString& us) { #endif UBool -NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, Formattable& result) const +NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, int32_t recursionCount, Formattable& result) const { // try matching each rule in the rule set against the text being // parsed. Whichever one matches the most characters is the one @@ -689,6 +706,12 @@ NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBoun result.setLong(0); + // dump out if we've reached the recursion limit + if (recursionCount >= RECURSION_LIMIT) { + // stop recursion + return false; + } + // dump out if there's no text to parse if (text.length() == 0) { return 0; @@ -712,7 +735,7 @@ NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBoun nonNumericalExecutedRuleMask |= 1 << i; Formattable tempResult; - UBool success = nonNumericalRules[i]->doParse(text, workingPos, 0, upperBound, nonNumericalExecutedRuleMask, tempResult); + UBool success = nonNumericalRules[i]->doParse(text, workingPos, 0, upperBound, nonNumericalExecutedRuleMask, recursionCount + 1, tempResult); if (success && (workingPos.getIndex() > highWaterMark.getIndex())) { result = tempResult; highWaterMark = workingPos; @@ -751,7 +774,7 @@ NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBoun continue; } Formattable tempResult; - UBool success = rules[i]->doParse(text, workingPos, fIsFractionRuleSet, upperBound, nonNumericalExecutedRuleMask, tempResult); + UBool success = rules[i]->doParse(text, workingPos, fIsFractionRuleSet, upperBound, nonNumericalExecutedRuleMask, recursionCount + 1, tempResult); if (success && workingPos.getIndex() > highWaterMark.getIndex()) { result = tempResult; highWaterMark = workingPos; @@ -825,7 +848,7 @@ int64_t util64_fromDouble(double d) { if (neg) { d = -d; } - result = (int64_t)uprv_floor(d); + result = static_cast<int64_t>(uprv_floor(d)); if (neg) { result = -result; } @@ -860,7 +883,7 @@ static const uint8_t asciiDigits[] = { 0x77u, 0x78u, 0x79u, 0x7au, }; -static const char16_t kUMinus = (char16_t)0x002d; +static const char16_t kUMinus = static_cast<char16_t>(0x002d); #ifdef RBNF_DEBUG static const char kMinus = '-'; @@ -998,15 +1021,15 @@ uint32_t util64_tou(int64_t w, char16_t* buf, uint32_t len, uint32_t radix, UBoo *p++ = kUMinus; --len; } else if (len && (w == 0)) { - *p++ = (char16_t)raw ? 0 : asciiDigits[0]; + *p++ = static_cast<char16_t>(raw) ? 0 : asciiDigits[0]; --len; } while (len && (w != 0)) { int64_t n = w / base; int64_t m = n * base; - int32_t d = (int32_t)(w-m); - *p++ = (char16_t)(raw ? d : asciiDigits[d]); + int32_t d = static_cast<int32_t>(w - m); + *p++ = static_cast<char16_t>(raw ? d : asciiDigits[d]); w = n; --len; } @@ -1014,7 +1037,7 @@ uint32_t util64_tou(int64_t w, char16_t* buf, uint32_t len, uint32_t radix, UBoo *p = 0; // null terminate if room for caller convenience } - len = (uint32_t)(p - buf); + len = static_cast<uint32_t>(p - buf); if (*buf == kUMinus) { ++buf; } diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index a1beedda17d79e..5e448395f7b6c5 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -55,7 +55,7 @@ class NFRuleSet : public UMemory { void format(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; void format(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; - UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, Formattable& result) const; + UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, int32_t recursionCount, Formattable& result) const; void appendRules(UnicodeString& result) const; // toString diff --git a/deps/icu-small/source/i18n/nfrule.cpp b/deps/icu-small/source/i18n/nfrule.cpp index 51bd4c974f4aa3..26a6e818d5a9b2 100644 --- a/deps/icu-small/source/i18n/nfrule.cpp +++ b/deps/icu-small/source/i18n/nfrule.cpp @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN NFRule::NFRule(const RuleBasedNumberFormat* _rbnf, const UnicodeString &_ruleText, UErrorCode &status) - : baseValue((int32_t)0) + : baseValue(static_cast<int32_t>(0)) , radix(10) , exponent(0) , decimalPoint(0) @@ -64,6 +64,7 @@ NFRule::~NFRule() static const char16_t gLeftBracket = 0x005b; static const char16_t gRightBracket = 0x005d; +static const char16_t gVerticalLine = 0x007C; static const char16_t gColon = 0x003a; static const char16_t gZero = 0x0030; static const char16_t gNine = 0x0039; @@ -112,13 +113,19 @@ NFRule::makeRules(UnicodeString& description, NFRuleList& rules, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } // we know we're making at least one rule, so go ahead and // new it up and initialize its basevalue and divisor // (this also strips the rule descriptor, if any, off the // description string) - NFRule* rule1 = new NFRule(rbnf, description, status); + LocalPointer<NFRule> rule1(new NFRule(rbnf, description, status)); + if (U_FAILURE(status)) { + return; + } /* test for nullptr */ - if (rule1 == 0) { + if (rule1.isNull()) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -140,17 +147,22 @@ NFRule::makeRules(UnicodeString& description, || rule1->getType() == kNaNRule) { rule1->extractSubstitutions(owner, description, predecessor, status); + if (U_FAILURE(status)) { + return; + } } else { // if the description does contain a matched pair of brackets, // then it's really shorthand for two rules (with one exception) - NFRule* rule2 = nullptr; + LocalPointer<NFRule> rule2; UnicodeString sbuf; + int32_t orElseOp = description.indexOf(gVerticalLine); // we'll actually only split the rule into two rules if its // base value is an even multiple of its divisor (or it's one // of the special rules) if ((rule1->baseValue > 0 + && (rule1->radix != 0) // ICU-23109 Ensure next line won't "% 0" && (rule1->baseValue % util64_pow(rule1->radix, rule1->exponent)) == 0) || rule1->getType() == kImproperFractionRule || rule1->getType() == kDefaultRule) { @@ -160,9 +172,12 @@ NFRule::makeRules(UnicodeString& description, // set, they both have the same base value; otherwise, // increment the original rule's base value ("rule1" actually // goes SECOND in the rule set's rule list) - rule2 = new NFRule(rbnf, UnicodeString(), status); + rule2.adoptInstead(new NFRule(rbnf, UnicodeString(), status)); + if (U_FAILURE(status)) { + return; + } /* test for nullptr */ - if (rule2 == 0) { + if (rule2.isNull()) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -193,44 +208,59 @@ NFRule::makeRules(UnicodeString& description, rule2->radix = rule1->radix; rule2->exponent = rule1->exponent; - // rule2's rule text omits the stuff in brackets: initialize - // its rule text and substitutions accordingly + // By default, rule2's rule text omits the stuff in brackets, + // unless it contains a | between the brackets. + // Initialize its rule text and substitutions accordingly. sbuf.append(description, 0, brack1); + if (orElseOp >= 0) { + sbuf.append(description, orElseOp + 1, brack2 - orElseOp - 1); + } if (brack2 + 1 < description.length()) { sbuf.append(description, brack2 + 1, description.length() - brack2 - 1); } rule2->extractSubstitutions(owner, sbuf, predecessor, status); + if (U_FAILURE(status)) { + return; + } } // rule1's text includes the text in the brackets but omits // the brackets themselves: initialize _its_ rule text and // substitutions accordingly sbuf.setTo(description, 0, brack1); - sbuf.append(description, brack1 + 1, brack2 - brack1 - 1); + if (orElseOp >= 0) { + sbuf.append(description, brack1 + 1, orElseOp - brack1 - 1); + } + else { + sbuf.append(description, brack1 + 1, brack2 - brack1 - 1); + } if (brack2 + 1 < description.length()) { sbuf.append(description, brack2 + 1, description.length() - brack2 - 1); } rule1->extractSubstitutions(owner, sbuf, predecessor, status); + if (U_FAILURE(status)) { + return; + } // if we only have one rule, return it; if we have two, return // a two-element array containing them (notice that rule2 goes // BEFORE rule1 in the list: in all cases, rule2 OMITS the // material in the brackets and rule1 INCLUDES the material // in the brackets) - if (rule2 != nullptr) { + if (!rule2.isNull()) { if (rule2->baseValue >= kNoBase) { - rules.add(rule2); + rules.add(rule2.orphan()); } else { - owner->setNonNumericalRule(rule2); + owner->setNonNumericalRule(rule2.orphan()); } } } if (rule1->baseValue >= kNoBase) { - rules.add(rule1); + rules.add(rule1.orphan()); } else { - owner->setNonNumericalRule(rule1); + owner->setNonNumericalRule(rule1.orphan()); } } @@ -285,11 +315,17 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // into "tempValue", skip periods, commas, and spaces, // stop on a slash or > sign (or at the end of the string), // and throw an exception on any other character - int64_t ll_10 = 10; while (p < descriptorLength) { c = descriptor.charAt(p); if (c >= gZero && c <= gNine) { - val = val * ll_10 + (int32_t)(c - gZero); + int64_t digit = static_cast<int64_t>(c - gZero); + if ((val > 0 && val > (INT64_MAX - digit) / 10) || + (val < 0 && val < (INT64_MIN - digit) / 10)) { + // out of int64_t range + status = U_PARSE_ERROR; + return; + } + val = val * 10 + digit; } else if (c == gSlash || c == gGreaterThan) { break; @@ -314,11 +350,17 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) if (c == gSlash) { val = 0; ++p; - ll_10 = 10; while (p < descriptorLength) { c = descriptor.charAt(p); if (c >= gZero && c <= gNine) { - val = val * ll_10 + (int32_t)(c - gZero); + int64_t digit = static_cast<int64_t>(c - gZero); + if ((val > 0 && val > (INT64_MAX - digit) / 10) || + (val < 0 && val < (INT64_MIN - digit) / 10)) { + // out of int64_t range + status = U_PARSE_ERROR; + return; + } + val = val * 10 + digit; } else if (c == gGreaterThan) { break; @@ -335,7 +377,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // tempValue now contain's the rule's radix. Set it // accordingly, and recalculate the rule's exponent - radix = (int32_t)val; + radix = static_cast<int32_t>(val); if (radix == 0) { // throw new IllegalArgumentException("Rule can't have radix of 0"); status = U_PARSE_ERROR; @@ -392,7 +434,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // finally, if the rule body begins with an apostrophe, strip it off // (this is generally used to put whitespace at the beginning of // a rule's rule text) - if (description.length() > 0 && description.charAt(0) == gTick) { + if (!description.isEmpty() && description.charAt(0) == gTick) { description.removeBetween(0, 1); } @@ -581,7 +623,8 @@ NFRule::expectedExponent() const // we get rounding error in some cases-- for example, log 1000 / log 10 // gives us 1.9999999996 instead of 2. The extra logic here is to take // that into account - int16_t tempResult = (int16_t)(uprv_log((double)baseValue) / uprv_log((double)radix)); + int16_t tempResult = static_cast<int16_t>(uprv_log(static_cast<double>(baseValue)) / + uprv_log(static_cast<double>(radix))); int64_t temp = util64_pow(radix, tempResult + 1); if (temp <= baseValue) { tempResult += 1; @@ -721,6 +764,14 @@ int64_t NFRule::getDivisor() const return util64_pow(radix, exponent); } +/** + * Internal function to facilitate numerical rounding. See the explanation in MultiplierSubstitution::transformNumber(). + */ +bool NFRule::hasModulusSubstitution() const +{ + return (sub1 != nullptr && sub1->isModulusSubstitution()) || (sub2 != nullptr && sub2->isModulusSubstitution()); +} + //----------------------------------------------------------------------- // formatting @@ -756,7 +807,7 @@ NFRule::doFormat(int64_t number, UnicodeString& toInsertInto, int32_t pos, int32 toInsertInto.insert(pos, fRuleText.tempSubString(pluralRuleEnd + 2)); } toInsertInto.insert(pos, - rulePatternFormat->format((int32_t)(number/util64_pow(radix, exponent)), status)); + rulePatternFormat->format(static_cast<int32_t>(number / util64_pow(radix, exponent)), status)); if (pluralRuleStart > 0) { toInsertInto.insert(pos, fRuleText.tempSubString(0, pluralRuleStart)); } @@ -810,7 +861,7 @@ NFRule::doFormat(double number, UnicodeString& toInsertInto, int32_t pos, int32_ else { pluralVal = pluralVal / util64_pow(radix, exponent); } - toInsertInto.insert(pos, rulePatternFormat->format((int32_t)(pluralVal), status)); + toInsertInto.insert(pos, rulePatternFormat->format(static_cast<int32_t>(pluralVal), status)); if (pluralRuleStart > 0) { toInsertInto.insert(pos, fRuleText.tempSubString(0, pluralRuleStart)); } @@ -901,6 +952,7 @@ NFRule::doParse(const UnicodeString& text, UBool isFractionRule, double upperBound, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& resVal) const { // internally we operate on a copy of the string being parsed @@ -990,7 +1042,7 @@ NFRule::doParse(const UnicodeString& text, int highWaterMark = 0; double result = 0; int start = 0; - double tempBaseValue = (double)(baseValue <= 0 ? 0 : baseValue); + double tempBaseValue = static_cast<double>(baseValue <= 0 ? 0 : baseValue); UnicodeString temp; do { @@ -1004,6 +1056,7 @@ NFRule::doParse(const UnicodeString& text, double partialResult = matchToDelimiter(workText, start, tempBaseValue, temp, pp, sub1, nonNumericalExecutedRuleMask, + recursionCount, upperBound); // if we got a successful match (or were trying to match a @@ -1025,6 +1078,7 @@ NFRule::doParse(const UnicodeString& text, partialResult = matchToDelimiter(workText2, 0, partialResult, temp, pp2, sub2, nonNumericalExecutedRuleMask, + recursionCount, upperBound); // if we got a successful match on this second @@ -1162,6 +1216,7 @@ NFRule::matchToDelimiter(const UnicodeString& text, ParsePosition& pp, const NFSubstitution* sub, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, double upperBound) const { UErrorCode status = U_ZERO_ERROR; @@ -1196,6 +1251,7 @@ NFRule::matchToDelimiter(const UnicodeString& text, formatter->isLenient(), #endif nonNumericalExecutedRuleMask, + recursionCount, result); // if the substitution could match all the text up to @@ -1250,6 +1306,7 @@ NFRule::matchToDelimiter(const UnicodeString& text, formatter->isLenient(), #endif nonNumericalExecutedRuleMask, + recursionCount, result); if (success && (tempPP.getIndex() != 0)) { // if there's a successful match (or it's a null diff --git a/deps/icu-small/source/i18n/nfrule.h b/deps/icu-small/source/i18n/nfrule.h index fda74fabf2c578..284d915c9424db 100644 --- a/deps/icu-small/source/i18n/nfrule.h +++ b/deps/icu-small/source/i18n/nfrule.h @@ -57,8 +57,8 @@ class NFRule : public UMemory { bool operator==(const NFRule& rhs) const; bool operator!=(const NFRule& rhs) const { return !operator==(rhs); } - ERuleType getType() const { return (ERuleType)(baseValue <= kNoBase ? (ERuleType)baseValue : kOtherRule); } - void setType(ERuleType ruleType) { baseValue = (int32_t)ruleType; } + ERuleType getType() const { return (baseValue <= kNoBase ? static_cast<ERuleType>(baseValue) : kOtherRule); } + void setType(ERuleType ruleType) { baseValue = static_cast<int32_t>(ruleType); } int64_t getBaseValue() const { return baseValue; } void setBaseValue(int64_t value, UErrorCode& status); @@ -66,6 +66,8 @@ class NFRule : public UMemory { char16_t getDecimalPoint() const { return decimalPoint; } int64_t getDivisor() const; + + bool hasModulusSubstitution() const; void doFormat(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; void doFormat(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; @@ -75,6 +77,7 @@ class NFRule : public UMemory { UBool isFractional, double upperBound, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const; UBool shouldRollBack(int64_t number) const; @@ -96,6 +99,7 @@ class NFRule : public UMemory { double matchToDelimiter(const UnicodeString& text, int32_t startPos, double baseValue, const UnicodeString& delimiter, ParsePosition& pp, const NFSubstitution* sub, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, double upperBound) const; void stripPrefix(UnicodeString& text, const UnicodeString& prefix, ParsePosition& pp) const; @@ -117,6 +121,9 @@ class NFRule : public UMemory { NFRule(const NFRule &other); // forbid copying of this class NFRule &operator=(const NFRule &other); // forbid copying of this class + + // TODO: temporary hack to allow MultiplierSubstitution to get to formatter's rounding mode + friend class MultiplierSubstitution; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index 5256b8a39bb301..5efbd2a72c8ef8 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -62,7 +62,7 @@ class SameValueSubstitution : public NFSubstitution { virtual double transformNumber(double number) const override { return number; } virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const override { return newRuleValue; } virtual double calcUpperBound(double oldUpperBound) const override { return oldUpperBound; } - virtual char16_t tokenChar() const override { return (char16_t)0x003d; } // '=' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003d); } // '=' public: static UClassID getStaticClassID(); @@ -73,6 +73,7 @@ SameValueSubstitution::~SameValueSubstitution() {} class MultiplierSubstitution : public NFSubstitution { int64_t divisor; + const NFRule* owningRule; public: MultiplierSubstitution(int32_t _pos, @@ -80,7 +81,7 @@ class MultiplierSubstitution : public NFSubstitution { const NFRuleSet* _ruleSet, const UnicodeString& description, UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, description, status), divisor(rule->getDivisor()) + : NFSubstitution(_pos, _ruleSet, description, status), divisor(rule->getDivisor()), owningRule(rule) { if (divisor == 0) { status = U_PARSE_ERROR; @@ -103,25 +104,22 @@ class MultiplierSubstitution : public NFSubstitution { } virtual double transformNumber(double number) const override { - bool doFloor = getRuleSet() != nullptr; - if (!doFloor) { - // This is a HACK that partially addresses ICU-22313. The original code wanted us to do - // floor() on the result if we were passing it to another rule set, but not if we were passing - // it to a DecimalFormat. But the DurationRules rule set has multiplier substitutions where - // we DO want to do the floor() operation. What we REALLY want is to do floor() any time - // the owning rule also has a ModulusSubsitution, but we don't have access to that information - // here, so instead we're doing a floor() any time the DecimalFormat has maxFracDigits equal to - // 0. This seems to work with our existing rule sets, but could be a problem in the future, - // but the "real" fix for DurationRules isn't worth doing, since we're deprecating DurationRules - // anyway. This is enough to keep it from being egregiously wrong, without obvious side - // effects. --rtg 8/16/23 - const DecimalFormat* decimalFormat = getNumberFormat(); - if (decimalFormat == nullptr || decimalFormat->getMaximumFractionDigits() == 0) { - doFloor = true; - } - } - - if (doFloor) { + // Most of the time, when a number is handled by an NFSubstitution, we do a floor() on it, but + // if a substitution uses a DecimalFormat to format the number instead of a ruleset, we generally + // don't want to do a floor()-- we want to keep the value intact so that the DecimalFormat can + // either include the fractional part or round properly. The big exception to this is here in + // MultiplierSubstitution. If the rule includes two substitutions, the MultiplierSubstitution + // (which is handling the larger part of the number) really _does_ want to do a floor(), because + // the ModulusSubstitution (which is handling the smaller part of the number) will take + // care of the fractional part. (Consider something like `1/12: <0< feet >0.0> inches;`.) + // But if there is no ModulusSubstitution, we're shortening the number in some way-- the "larger part" + // of the number is the only part we're keeping. Even if the DecimalFormat doesn't include the + // fractional part in its output, we still want it to round. (Consider something like `1/1000: <0<K;`.) + // (TODO: The kRoundFloor thing is a kludge to preserve the previous floor-always behavior. What we + // probably really want to do is just set the rounding mode on the DecimalFormat to match the rounding + // mode on the RuleBasedNumberFormat and then pass the number to it whole and let it do its own rounding. + // But before making that change, we'd have to make sure it didn't have undesirable side effects.) + if (getRuleSet() != nullptr || owningRule->hasModulusSubstitution() || owningRule->formatter->getRoundingMode() == NumberFormat::kRoundFloor) { return uprv_floor(number / divisor); } else { return number / divisor; @@ -134,7 +132,7 @@ class MultiplierSubstitution : public NFSubstitution { virtual double calcUpperBound(double /*oldUpperBound*/) const override { return static_cast<double>(divisor); } - virtual char16_t tokenChar() const override { return (char16_t)0x003c; } // '<' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003c); } // '<' public: static UClassID getStaticClassID(); @@ -177,6 +175,7 @@ class ModulusSubstitution : public NFSubstitution { double upperBound, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const override; virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const override { @@ -187,7 +186,7 @@ class ModulusSubstitution : public NFSubstitution { virtual UBool isModulusSubstitution() const override { return true; } - virtual char16_t tokenChar() const override { return (char16_t)0x003e; } // '>' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003e); } // '>' virtual void toString(UnicodeString& result) const override; @@ -211,7 +210,7 @@ class IntegralPartSubstitution : public NFSubstitution { virtual double transformNumber(double number) const override { return uprv_floor(number); } virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const override { return newRuleValue + oldRuleValue; } virtual double calcUpperBound(double /*oldUpperBound*/) const override { return DBL_MAX; } - virtual char16_t tokenChar() const override { return (char16_t)0x003c; } // '<' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003c); } // '<' public: static UClassID getStaticClassID(); @@ -244,11 +243,12 @@ class FractionalPartSubstitution : public NFSubstitution { double upperBound, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const override; virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const override { return newRuleValue + oldRuleValue; } virtual double calcUpperBound(double /*oldUpperBound*/) const override { return 0.0; } - virtual char16_t tokenChar() const override { return (char16_t)0x003e; } // '>' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003e); } // '>' public: static UClassID getStaticClassID(); @@ -270,7 +270,7 @@ class AbsoluteValueSubstitution : public NFSubstitution { virtual double transformNumber(double number) const override { return uprv_fabs(number); } virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const override { return -newRuleValue; } virtual double calcUpperBound(double /*oldUpperBound*/) const override { return DBL_MAX; } - virtual char16_t tokenChar() const override { return (char16_t)0x003e; } // '>' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003e); } // '>' public: static UClassID getStaticClassID(); @@ -316,11 +316,12 @@ class NumeratorSubstitution : public NFSubstitution { double upperBound, UBool /*lenientParse*/, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const override; virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const override { return newRuleValue / oldRuleValue; } virtual double calcUpperBound(double /*oldUpperBound*/) const override { return denominator; } - virtual char16_t tokenChar() const override { return (char16_t)0x003c; } // '<' + virtual char16_t tokenChar() const override { return static_cast<char16_t>(0x003c); } // '<' private: static const char16_t LTLT[2]; @@ -340,6 +341,7 @@ NFSubstitution::makeSubstitution(int32_t pos, const UnicodeString& description, UErrorCode& status) { + if (U_FAILURE(status)) return nullptr; // if the description is empty, return a NullSubstitution if (description.length() == 0) { return nullptr; @@ -367,7 +369,7 @@ NFSubstitution::makeSubstitution(int32_t pos, // if the rule set containing the rule is a fraction // rule set, return a NumeratorSubstitution else if (ruleSet->isFractionRuleSet()) { - return new NumeratorSubstitution(pos, (double)rule->getBaseValue(), + return new NumeratorSubstitution(pos, static_cast<double>(rule->getBaseValue()), formatter->getDefaultRuleSet(), description, status); } @@ -426,6 +428,7 @@ NFSubstitution::NFSubstitution(int32_t _pos, UErrorCode& status) : pos(_pos), ruleSet(nullptr), numberFormat(nullptr) { + if (U_FAILURE(status)) return; // the description should begin and end with the same character. // If it doesn't that's a syntax error. Otherwise, // makeSubstitution() was the only thing that needed to know @@ -591,6 +594,7 @@ NFSubstitution::toString(UnicodeString& text) const void NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; if (ruleSet != nullptr) { // Perform a transformation on the number that is dependent // on the type of substitution this is, then just call its @@ -598,17 +602,11 @@ NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3 ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos, recursionCount, status); } else if (numberFormat != nullptr) { if (number <= MAX_INT64_IN_DOUBLE) { - // or perform the transformation on the number (preserving - // the result's fractional part if the formatter it set - // to show it), then use that formatter's format() method + // or perform the transformation on the number, + // then use that formatter's format() method // to format the result - double numberToFormat = transformNumber((double)number); - if (numberFormat->getMaximumFractionDigits() == 0) { - numberToFormat = uprv_floor(numberToFormat); - } - UnicodeString temp; - numberFormat->format(numberToFormat, temp, status); + numberFormat->format(transformNumber(static_cast<double>(number)), temp, status); toInsertInto.insert(_pos + this->pos, temp); } else { @@ -639,6 +637,7 @@ NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int3 */ void NFSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; // perform a transformation on the number being formatted that // is dependent on the type of substitution this is double numberToFormat = transformNumber(number); @@ -714,6 +713,7 @@ NFSubstitution::doParse(const UnicodeString& text, double upperBound, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const { #ifdef RBNF_DEBUG @@ -734,7 +734,7 @@ NFSubstitution::doParse(const UnicodeString& text, // on), then also try parsing the text using a default- // constructed NumberFormat if (ruleSet != nullptr) { - ruleSet->parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask, result); + ruleSet->parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask, recursionCount, result); if (lenientParse && !ruleSet->isFractionRuleSet() && parsePosition.getIndex() == 0) { UErrorCode status = U_ZERO_ERROR; NumberFormat* fmt = NumberFormat::createInstance(status); @@ -854,6 +854,7 @@ ModulusSubstitution::ModulusSubstitution(int32_t _pos, , divisor(rule->getDivisor()) , ruleToUse(nullptr) { + if (U_FAILURE(status)) return; // the owning rule's divisor controls the behavior of this // substitution: rather than keeping a backpointer to the rule, // we keep a copy of the divisor @@ -897,6 +898,7 @@ bool ModulusSubstitution::operator==(const NFSubstitution& rhs) const void ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; // if this isn't a >>> substitution, just use the inherited version // of this function (which uses either a rule set or a DecimalFormat // to format its substitution value) @@ -922,6 +924,7 @@ ModulusSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, void ModulusSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; // if this isn't a >>> substitution, just use the inherited version // of this function (which uses either a rule set or a DecimalFormat // to format its substitution value) @@ -957,18 +960,19 @@ ModulusSubstitution::doParse(const UnicodeString& text, double upperBound, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const { // if this isn't a >>> substitution, we can just use the // inherited parse() routine to do the parsing if (ruleToUse == nullptr) { - return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask, result); + return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask, recursionCount, result); // but if it IS a >>> substitution, we have to do it here: we // use the specific rule's doParse() method, and then we have to // do some of the other work of NFRuleSet.parse() } else { - ruleToUse->doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask, result); + ruleToUse->doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask, recursionCount, result); if (parsePosition.getIndex() != 0) { UErrorCode status = U_ZERO_ERROR; @@ -1029,6 +1033,7 @@ FractionalPartSubstitution::FractionalPartSubstitution(int32_t _pos, , useSpaces(true) { + if (U_FAILURE(status)) return; // akk, ruleSet can change in superclass constructor if (0 == description.compare(gGreaterGreaterThan, 2) || 0 == description.compare(gGreaterGreaterGreaterThan, 3) || @@ -1039,7 +1044,12 @@ FractionalPartSubstitution::FractionalPartSubstitution(int32_t _pos, } } else { // cast away const - ((NFRuleSet*)getRuleSet())->makeIntoFractionRuleSet(); + NFRuleSet* rs = const_cast<NFRuleSet*>(getRuleSet()); + if (rs != nullptr) { + rs->makeIntoFractionRuleSet(); + } else { + status = U_PARSE_ERROR; + } } } @@ -1061,6 +1071,7 @@ void FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; // if we're not in "byDigits" mode, just use the inherited // doSubstitution() routine if (!byDigits) { @@ -1111,7 +1122,7 @@ FractionalPartSubstitution::doSubstitution(double number, UnicodeString& toInser if (!pad) { // hack around lack of precision in digitlist. if we would end up with // "foo point" make sure we add a " zero" to the end. - getRuleSet()->format((int64_t)0, toInsertInto, _pos + getPos(), recursionCount, status); + getRuleSet()->format(static_cast<int64_t>(0), toInsertInto, _pos + getPos(), recursionCount, status); } } } @@ -1144,12 +1155,13 @@ FractionalPartSubstitution::doParse(const UnicodeString& text, double /*upperBound*/, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& resVal) const { // if we're not in byDigits mode, we can just use the inherited // doParse() if (!byDigits) { - return NFSubstitution::doParse(text, parsePosition, baseValue, 0, lenientParse, nonNumericalExecutedRuleMask, resVal); + return NFSubstitution::doParse(text, parsePosition, baseValue, 0, lenientParse, nonNumericalExecutedRuleMask, recursionCount, resVal); // if we ARE in byDigits mode, parse the text one digit at a time // using this substitution's owning rule set (we do this by setting @@ -1168,7 +1180,7 @@ FractionalPartSubstitution::doParse(const UnicodeString& text, while (workText.length() > 0 && workPos.getIndex() != 0) { workPos.setIndex(0); Formattable temp; - getRuleSet()->parse(workText, workPos, 10, nonNumericalExecutedRuleMask, temp); + getRuleSet()->parse(workText, workPos, 10, nonNumericalExecutedRuleMask, recursionCount, temp); UErrorCode status = U_ZERO_ERROR; digit = temp.getLong(status); // digit = temp.getType() == Formattable::kLong ? @@ -1235,6 +1247,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(AbsoluteValueSubstitution) void NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto, int32_t apos, int32_t recursionCount, UErrorCode& status) const { + if (U_FAILURE(status)) return; // perform a transformation on the number being formatted that // is dependent on the type of substitution this is @@ -1248,7 +1261,7 @@ NumeratorSubstitution::doSubstitution(double number, UnicodeString& toInsertInto int32_t len = toInsertInto.length(); while ((nf *= 10) < denominator) { toInsertInto.insert(apos + getPos(), gSpace); - aruleSet->format((int64_t)0, toInsertInto, apos + getPos(), recursionCount, status); + aruleSet->format(static_cast<int64_t>(0), toInsertInto, apos + getPos(), recursionCount, status); } apos += toInsertInto.length() - len; } @@ -1279,6 +1292,7 @@ NumeratorSubstitution::doParse(const UnicodeString& text, double upperBound, UBool /*lenientParse*/, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const { // we don't have to do anything special to do the parsing here, @@ -1297,7 +1311,7 @@ NumeratorSubstitution::doParse(const UnicodeString& text, while (workText.length() > 0 && workPos.getIndex() != 0) { workPos.setIndex(0); - getRuleSet()->parse(workText, workPos, 1, nonNumericalExecutedRuleMask, temp); // parse zero or nothing at all + getRuleSet()->parse(workText, workPos, 1, nonNumericalExecutedRuleMask, recursionCount, temp); // parse zero or nothing at all if (workPos.getIndex() == 0) { // we failed, either there were no more zeros, or the number was formatted with digits // either way, we're done @@ -1314,12 +1328,12 @@ NumeratorSubstitution::doParse(const UnicodeString& text, } workText = text; - workText.remove(0, (int32_t)parsePosition.getIndex()); + workText.remove(0, parsePosition.getIndex()); parsePosition.setIndex(0); } // we've parsed off the zeros, now let's parse the rest from our current position - NFSubstitution::doParse(workText, parsePosition, withZeros ? 1 : baseValue, upperBound, false, nonNumericalExecutedRuleMask, result); + NFSubstitution::doParse(workText, parsePosition, withZeros ? 1 : baseValue, upperBound, false, nonNumericalExecutedRuleMask, recursionCount, result); if (withZeros) { // any base value will do in this case. is there a way to @@ -1337,7 +1351,7 @@ NumeratorSubstitution::doParse(const UnicodeString& text, --zeroCount; } // d is now our true denominator - result.setDouble((double)n/(double)d); + result.setDouble(static_cast<double>(n) / static_cast<double>(d)); } return true; diff --git a/deps/icu-small/source/i18n/nfsubs.h b/deps/icu-small/source/i18n/nfsubs.h index d252f864993168..a14c04459f1acf 100644 --- a/deps/icu-small/source/i18n/nfsubs.h +++ b/deps/icu-small/source/i18n/nfsubs.h @@ -192,6 +192,7 @@ class NFSubstitution : public UObject { double upperBound, UBool lenientParse, uint32_t nonNumericalExecutedRuleMask, + int32_t recursionCount, Formattable& result) const; /** diff --git a/deps/icu-small/source/i18n/nortrans.cpp b/deps/icu-small/source/i18n/nortrans.cpp index d793433b3d2496..c57418dfdd2ead 100644 --- a/deps/icu-small/source/i18n/nortrans.cpp +++ b/deps/icu-small/source/i18n/nortrans.cpp @@ -59,8 +59,8 @@ void NormalizationTransliterator::registerIDs() { */ Transliterator* NormalizationTransliterator::_create(const UnicodeString& ID, Token context) { - const char *name = (const char *)context.pointer; - UNormalization2Mode mode = (UNormalization2Mode)uprv_strchr(name, 0)[1]; + const char* name = static_cast<const char*>(context.pointer); + UNormalization2Mode mode = static_cast<UNormalization2Mode>(uprv_strchr(name, 0)[1]); UErrorCode errorCode = U_ZERO_ERROR; const Normalizer2 *norm2 = Normalizer2::getInstance(nullptr, name, mode, errorCode); if(U_SUCCESS(errorCode)) { @@ -75,7 +75,7 @@ Transliterator* NormalizationTransliterator::_create(const UnicodeString& ID, */ NormalizationTransliterator::NormalizationTransliterator(const UnicodeString& id, const Normalizer2 &norm2) : - Transliterator(id, 0), fNorm2(norm2) {} + Transliterator(id, nullptr), fNorm2(norm2) {} /** * Destructor. diff --git a/deps/icu-small/source/i18n/nultrans.cpp b/deps/icu-small/source/i18n/nultrans.cpp index 439cc55d381a2a..de128857e147ff 100644 --- a/deps/icu-small/source/i18n/nultrans.cpp +++ b/deps/icu-small/source/i18n/nultrans.cpp @@ -20,7 +20,7 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NullTransliterator) -NullTransliterator::NullTransliterator() : Transliterator(UNICODE_STRING_SIMPLE("Any-Null"), 0) {} +NullTransliterator::NullTransliterator() : Transliterator(UNICODE_STRING_SIMPLE("Any-Null"), nullptr) {} NullTransliterator::~NullTransliterator() {} diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h index 5cfde61ffd0ca2..e59096546e116d 100644 --- a/deps/icu-small/source/i18n/number_affixutils.h +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -14,8 +14,8 @@ #include "formatted_string_builder.h" #include "unicode/uniset.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { enum AffixPatternState { STATE_BASE = 0, @@ -234,8 +234,7 @@ class U_I18N_API AffixUtils { } }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_asformat.cpp b/deps/icu-small/source/i18n/number_asformat.cpp index 8f2314d6898e0d..aac765f3fbcfdd 100644 --- a/deps/icu-small/source/i18n/number_asformat.cpp +++ b/deps/icu-small/source/i18n/number_asformat.cpp @@ -33,7 +33,7 @@ LocalizedNumberFormatterAsFormat::LocalizedNumberFormatterAsFormat( LocalizedNumberFormatterAsFormat::~LocalizedNumberFormatterAsFormat() = default; bool LocalizedNumberFormatterAsFormat::operator==(const Format& other) const { - auto* _other = dynamic_cast<const LocalizedNumberFormatterAsFormat*>(&other); + const auto* _other = dynamic_cast<const LocalizedNumberFormatterAsFormat*>(&other); if (_other == nullptr) { return false; } diff --git a/deps/icu-small/source/i18n/number_asformat.h b/deps/icu-small/source/i18n/number_asformat.h index f921b429420670..3e4d109bd5f8ac 100644 --- a/deps/icu-small/source/i18n/number_asformat.h +++ b/deps/icu-small/source/i18n/number_asformat.h @@ -18,8 +18,8 @@ #include "decNumber.h" #include "charstr.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { /** * A wrapper around LocalizedNumberFormatter implementing the Format interface, enabling improved @@ -27,44 +27,50 @@ namespace impl { * * @see NumberFormatter */ -class U_I18N_API LocalizedNumberFormatterAsFormat : public Format { +class U_I18N_API_CLASS LocalizedNumberFormatterAsFormat : public Format { public: - LocalizedNumberFormatterAsFormat(const LocalizedNumberFormatter& formatter, const Locale& locale); + U_I18N_API LocalizedNumberFormatterAsFormat(const LocalizedNumberFormatter& formatter, + const Locale& locale); /** * Destructor. */ - ~LocalizedNumberFormatterAsFormat() override; + U_I18N_API ~LocalizedNumberFormatterAsFormat() override; /** * Equals operator. */ - bool operator==(const Format& other) const override; + U_I18N_API bool operator==(const Format& other) const override; /** * Creates a copy of this object. */ - LocalizedNumberFormatterAsFormat* clone() const override; + U_I18N_API LocalizedNumberFormatterAsFormat* clone() const override; /** * Formats a Number using the wrapped LocalizedNumberFormatter. The provided formattable must be a * number type. */ - UnicodeString& format(const Formattable& obj, UnicodeString& appendTo, FieldPosition& pos, - UErrorCode& status) const override; + U_I18N_API UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const override; /** * Formats a Number using the wrapped LocalizedNumberFormatter. The provided formattable must be a * number type. */ - UnicodeString& format(const Formattable& obj, UnicodeString& appendTo, FieldPositionIterator* posIter, - UErrorCode& status) const override; + U_I18N_API UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const override; /** * Not supported: sets an error index and returns. */ - void parseObject(const UnicodeString& source, Formattable& result, - ParsePosition& parse_pos) const override; + U_I18N_API void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const override; /** * Gets the LocalizedNumberFormatter that this wrapper class uses to format numbers. @@ -84,10 +90,10 @@ class U_I18N_API LocalizedNumberFormatterAsFormat : public Format { * * @return The unwrapped LocalizedNumberFormatter. */ - const LocalizedNumberFormatter& getNumberFormatter() const; + U_I18N_API const LocalizedNumberFormatter& getNumberFormatter() const; - UClassID getDynamicClassID() const override; - static UClassID U_EXPORT2 getStaticClassID(); + U_I18N_API UClassID getDynamicClassID() const override; + U_I18N_API static UClassID getStaticClassID(); private: LocalizedNumberFormatter fFormatter; @@ -97,8 +103,7 @@ class U_I18N_API LocalizedNumberFormatterAsFormat : public Format { Locale fLocale; }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif // __NUMBER_ASFORMAT_H__ diff --git a/deps/icu-small/source/i18n/number_capi.cpp b/deps/icu-small/source/i18n/number_capi.cpp index abada9ad8693eb..a35680a6200330 100644 --- a/deps/icu-small/source/i18n/number_capi.cpp +++ b/deps/icu-small/source/i18n/number_capi.cpp @@ -25,8 +25,7 @@ using namespace icu::number::impl; U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { /** * Implementation class for UNumberFormatter. Wraps a LocalizedNumberFormatter. @@ -84,8 +83,7 @@ void UFormattedNumberImpl::setTo(FormattedNumber value) { fData = std::move(*value.fData); } -} -} +} // namespace number::impl U_NAMESPACE_END @@ -98,7 +96,7 @@ UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL( const DecimalQuantity* icu::number::impl::validateUFormattedNumberToDecimalQuantity( const UFormattedNumber* uresult, UErrorCode& status) { - auto* result = UFormattedNumberApiHelper::validate(uresult, status); + const auto* result = UFormattedNumberApiHelper::validate(uresult, status); if (U_FAILURE(status)) { return nullptr; } @@ -311,12 +309,12 @@ usnum_setMinimumFractionDigits(USimpleNumber* unumber, int32_t minimumFractionDi } U_CAPI void U_EXPORT2 -usnum_truncateStart(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec) { +usnum_setMaximumIntegerDigits(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec) { auto* number = USimpleNumberData::validate(unumber, *ec); if (U_FAILURE(*ec)) { return; } - number->fNumber.truncateStart(maximumIntegerDigits, *ec); + number->fNumber.setMaximumIntegerDigits(maximumIntegerDigits, *ec); } U_CAPI void U_EXPORT2 @@ -357,7 +355,7 @@ usnumf_format( USimpleNumber* unumber, UFormattedNumber* uresult, UErrorCode* ec) { - auto* formatter = USimpleNumberFormatterData::validate(uformatter, *ec); + const auto* formatter = USimpleNumberFormatterData::validate(uformatter, *ec); auto* number = USimpleNumberData::validate(unumber, *ec); auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { @@ -376,7 +374,7 @@ usnumf_formatInt64( int64_t value, UFormattedNumber* uresult, UErrorCode* ec) { - auto* formatter = USimpleNumberFormatterData::validate(uformatter, *ec); + const auto* formatter = USimpleNumberFormatterData::validate(uformatter, *ec); auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; diff --git a/deps/icu-small/source/i18n/number_compact.cpp b/deps/icu-small/source/i18n/number_compact.cpp index 2cfa65a031ddde..63180f213e21ef 100644 --- a/deps/icu-small/source/i18n/number_compact.cpp +++ b/deps/icu-small/source/i18n/number_compact.cpp @@ -143,7 +143,7 @@ void CompactData::getUniquePatterns(UVector &output, UErrorCode &status) const { U_ASSERT(output.isEmpty()); // NOTE: In C++, this is done more manually with a UVector. // In Java, we can take advantage of JDK HashSet. - for (auto pattern : patterns) { + for (const auto* pattern : patterns) { if (pattern == nullptr || pattern == USE_FALLBACK) { continue; } @@ -279,7 +279,7 @@ void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReferen } for (int32_t i = 0; i < precomputedModsLength; i++) { - auto patternString = static_cast<const char16_t *>(allPatterns[i]); + const auto* patternString = static_cast<const char16_t*>(allPatterns[i]); UnicodeString hello(patternString); CompactModInfo &info = precomputedMods[i]; ParsedPatternInfo patternInfo; diff --git a/deps/icu-small/source/i18n/number_compact.h b/deps/icu-small/source/i18n/number_compact.h index aee1df74523c0c..95896c029a26a2 100644 --- a/deps/icu-small/source/i18n/number_compact.h +++ b/deps/icu-small/source/i18n/number_compact.h @@ -14,8 +14,8 @@ #include "resource.h" #include "number_patternmodifier.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { static const int32_t COMPACT_MAX_DIGITS = 20; @@ -90,9 +90,7 @@ class CompactHandler : public MicroPropsGenerator, public UMemory { void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status); }; - -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_COMPACT_H__ diff --git a/deps/icu-small/source/i18n/number_currencysymbols.cpp b/deps/icu-small/source/i18n/number_currencysymbols.cpp index 8d5127556be91a..7687efbbc7d221 100644 --- a/deps/icu-small/source/i18n/number_currencysymbols.cpp +++ b/deps/icu-small/source/i18n/number_currencysymbols.cpp @@ -126,7 +126,7 @@ icu::number::impl::resolveCurrency(const DecimalFormatProperties& properties, co return CurrencyUnit(buf, status); } else { // Default currency (XXX) - return CurrencyUnit(); + return {}; } } } diff --git a/deps/icu-small/source/i18n/number_currencysymbols.h b/deps/icu-small/source/i18n/number_currencysymbols.h index c2223bd0f0be5c..f18111b325ae73 100644 --- a/deps/icu-small/source/i18n/number_currencysymbols.h +++ b/deps/icu-small/source/i18n/number_currencysymbols.h @@ -11,12 +11,11 @@ #include "charstr.h" #include "number_decimfmtprops.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { - -// Exported as U_I18N_API for tests -class U_I18N_API CurrencySymbols : public UMemory { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS CurrencySymbols : public UMemory { public: CurrencySymbols() = default; // default constructor: leaves class in valid but undefined state @@ -24,8 +23,10 @@ class U_I18N_API CurrencySymbols : public UMemory { CurrencySymbols(CurrencyUnit currency, const Locale& locale, UErrorCode& status); /** Creates an instance in which some symbols might be pre-populated. */ - CurrencySymbols(CurrencyUnit currency, const Locale& locale, const DecimalFormatSymbols& symbols, - UErrorCode& status); + U_I18N_API CurrencySymbols(CurrencyUnit currency, + const Locale& locale, + const DecimalFormatSymbols& symbols, + UErrorCode& status); const char16_t* getIsoCode() const; @@ -62,9 +63,7 @@ class U_I18N_API CurrencySymbols : public UMemory { CurrencyUnit resolveCurrency(const DecimalFormatProperties& properties, const Locale& locale, UErrorCode& status); - -} // namespace impl -} // namespace numparse +} // namespace number::impl U_NAMESPACE_END #endif //__SOURCE_NUMBER_CURRENCYSYMBOLS_H__ diff --git a/deps/icu-small/source/i18n/number_decimalquantity.cpp b/deps/icu-small/source/i18n/number_decimalquantity.cpp index 659465d0870db9..ca1dacd3579d85 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.cpp +++ b/deps/icu-small/source/i18n/number_decimalquantity.cpp @@ -44,7 +44,7 @@ inline int32_t safeSubtract(int32_t a, int32_t b) { return diff; } -static double DOUBLE_MULTIPLIERS[] = { +double DOUBLE_MULTIPLIERS[] = { 1e0, 1e1, 1e2, @@ -131,18 +131,24 @@ void DecimalQuantity::clear() { setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data } -void DecimalQuantity::setMinInteger(int32_t minInt) { +void DecimalQuantity::decreaseMinIntegerTo(int32_t minInt) { + // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. + U_ASSERT(minInt >= 0); + + if (lReqPos > minInt) { + lReqPos = minInt; + } +} + +void DecimalQuantity::increaseMinIntegerTo(int32_t minInt) { // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. U_ASSERT(minInt >= 0); // Special behavior: do not set minInt to be less than what is already set. // This is so significant digits rounding can set the integer length. - if (minInt < lReqPos) { - minInt = lReqPos; + if (lReqPos < minInt) { + lReqPos = minInt; } - - // Save values into internal state - lReqPos = minInt; } void DecimalQuantity::setMinFraction(int32_t minFrac) { @@ -1076,7 +1082,7 @@ UnicodeString DecimalQuantity::toScientificString() const { result.append(u'E'); int32_t _scale = upperPos + scale + exponent; if (_scale == INT32_MIN) { - result.append({u"-2147483648", -1}); + result.append(u"-2147483648"); return result; } else if (_scale < 0) { _scale *= -1; @@ -1107,7 +1113,7 @@ int8_t DecimalQuantity::getDigitPos(int32_t position) const { return fBCD.bcdBytes.ptr[position]; } else { if (position < 0 || position >= 16) { return 0; } - return (int8_t) ((fBCD.bcdLong >> (position * 4)) & 0xf); + return static_cast<int8_t>((fBCD.bcdLong >> (position * 4)) & 0xf); } } @@ -1122,12 +1128,12 @@ void DecimalQuantity::setDigitPos(int32_t position, int8_t value) { fBCD.bcdBytes.ptr[position] = value; } else { int shift = position * 4; - fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | ((long) value << shift); + fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | (static_cast<long>(value) << shift); } } void DecimalQuantity::shiftLeft(int32_t numDigits) { - if (!usingBytes && precision + numDigits > 16) { + if (!usingBytes && precision + numDigits >= 16) { switchStorage(); } if (usingBytes) { @@ -1322,7 +1328,7 @@ void DecimalQuantity::ensureCapacity(int32_t capacity) { // Initialize the byte array to zeros (this is done automatically in Java) uprv_memset(fBCD.bcdBytes.ptr, 0, capacity * sizeof(int8_t)); } else if (oldCapacity < capacity) { - auto bcd1 = static_cast<int8_t*>(uprv_malloc(capacity * 2 * sizeof(int8_t))); + auto* bcd1 = static_cast<int8_t*>(uprv_malloc(capacity * 2 * sizeof(int8_t))); uprv_memcpy(bcd1, fBCD.bcdBytes.ptr, oldCapacity * sizeof(int8_t)); // Initialize the rest of the byte array to zeros (this is done automatically in Java) uprv_memset(bcd1 + oldCapacity, 0, (capacity - oldCapacity) * sizeof(int8_t)); diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h index 2211fe9c19eb71..2303186c6d581f 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.h +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -13,8 +13,8 @@ #include "plurrule_impl.h" #include "number_types.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { // Forward-declare (maybe don't want number_utils.h included here): class DecNum; @@ -52,13 +52,21 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { /** Move assignment */ DecimalQuantity &operator=(DecimalQuantity&& src) noexcept; + /** + * If the minimum integer digits are greater than `minInt`, + * sets it to `minInt`. + * + * @param minInt The minimum number of integer digits. + */ + void decreaseMinIntegerTo(int32_t minInt); + /** * Sets the minimum integer digits that this {@link DecimalQuantity} should generate. * This method does not perform rounding. * * @param minInt The minimum number of integer digits. */ - void setMinInteger(int32_t minInt); + void increaseMinIntegerTo(int32_t minInt); /** * Sets the minimum fraction digits that this {@link DecimalQuantity} should generate. @@ -549,8 +557,7 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { void switchStorage(); }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.h b/deps/icu-small/source/i18n/number_decimfmtprops.h index 5f72f649842e66..a6b641f5d6cda7 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.h +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -21,20 +21,11 @@ U_NAMESPACE_BEGIN // data member of CurrencyPluralInfoWrapper. // (When building DLLs for Windows this is required.) #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -#if defined(_MSC_VER) -// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(push) -#pragma warning(disable: 4661) -#endif template class U_I18N_API LocalPointerBase<CurrencyPluralInfo>; template class U_I18N_API LocalPointer<CurrencyPluralInfo>; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif #endif -namespace number { -namespace impl { +namespace number::impl { // Exported as U_I18N_API because it is a public member field of exported DecimalFormatProperties // Using this wrapper is rather unfortunate, but is needed on Windows platforms in order to allow @@ -166,8 +157,8 @@ struct U_I18N_API DecimalFormatProperties : public UMemory { bool _equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const; }; -} // namespace impl -} // namespace number +} // namespace number::impl + U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_decnum.h b/deps/icu-small/source/i18n/number_decnum.h index 94a0b31bcb5dd7..db0e69f6831f59 100644 --- a/deps/icu-small/source/i18n/number_decnum.h +++ b/deps/icu-small/source/i18n/number_decnum.h @@ -15,21 +15,13 @@ U_NAMESPACE_BEGIN #define DECNUM_INITIAL_CAPACITY 34 -// Export an explicit template instantiation of the MaybeStackHeaderAndArray that is used as a data member of DecNum. -// When building DLLs for Windows this is required even though no direct access to the MaybeStackHeaderAndArray leaks out of the i18n library. -// (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackHeaderAndArray<decNumber, char, DECNUM_INITIAL_CAPACITY>; -#endif - -namespace number { -namespace impl { +namespace number::impl { /** A very thin C++ wrapper around decNumber.h */ -// Exported as U_I18N_API for tests -class U_I18N_API DecNum : public UMemory { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS DecNum : public UMemory { public: - DecNum(); // leaves object in valid but undefined state + U_I18N_API DecNum(); // leaves object in valid but undefined state // Copy-like constructor; use the default move operators. DecNum(const DecNum& other, UErrorCode& status); @@ -84,8 +76,7 @@ class U_I18N_API DecNum : public UMemory { void _setTo(const char* str, int32_t maxDigits, UErrorCode& status); }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_fluent.cpp b/deps/icu-small/source/i18n/number_fluent.cpp index 45d6b06c6df828..0ce01c854caea3 100644 --- a/deps/icu-small/source/i18n/number_fluent.cpp +++ b/deps/icu-small/source/i18n/number_fluent.cpp @@ -430,6 +430,14 @@ UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(const NFS<UNF>& other) // No additional fields to assign } +UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(const impl::MacroProps ¯os) { + fMacros = macros; +} + +UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(impl::MacroProps &¯os) { + fMacros = macros; +} + // Make default copy constructor call the NumberFormatterSettings copy constructor. UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(UNF&& src) noexcept : UNF(static_cast<NFS<UNF>&&>(src)) {} @@ -565,7 +573,7 @@ LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale& locale FormattedNumber LocalizedNumberFormatter::formatInt(int64_t value, UErrorCode& status) const { if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } - auto results = new UFormattedNumberData(); + auto* results = new UFormattedNumberData(); if (results == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return FormattedNumber(status); @@ -584,7 +592,7 @@ FormattedNumber LocalizedNumberFormatter::formatInt(int64_t value, UErrorCode& s FormattedNumber LocalizedNumberFormatter::formatDouble(double value, UErrorCode& status) const { if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } - auto results = new UFormattedNumberData(); + auto* results = new UFormattedNumberData(); if (results == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return FormattedNumber(status); @@ -603,7 +611,7 @@ FormattedNumber LocalizedNumberFormatter::formatDouble(double value, UErrorCode& FormattedNumber LocalizedNumberFormatter::formatDecimal(StringPiece value, UErrorCode& status) const { if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } - auto results = new UFormattedNumberData(); + auto* results = new UFormattedNumberData(); if (results == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return FormattedNumber(status); @@ -623,7 +631,7 @@ FormattedNumber LocalizedNumberFormatter::formatDecimal(StringPiece value, UErro FormattedNumber LocalizedNumberFormatter::formatDecimalQuantity(const DecimalQuantity& dq, UErrorCode& status) const { if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } - auto results = new UFormattedNumberData(); + auto* results = new UFormattedNumberData(); if (results == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return FormattedNumber(status); @@ -726,6 +734,18 @@ int32_t LocalizedNumberFormatter::getCallCount() const { // Note: toFormat defined in number_asformat.cpp +UnlocalizedNumberFormatter LocalizedNumberFormatter::withoutLocale() const & { + MacroProps macros(fMacros); + macros.locale = Locale(); + return UnlocalizedNumberFormatter(macros); +} + +UnlocalizedNumberFormatter LocalizedNumberFormatter::withoutLocale() && { + MacroProps macros(std::move(fMacros)); + macros.locale = Locale(); + return UnlocalizedNumberFormatter(std::move(macros)); +} + const DecimalFormatSymbols* LocalizedNumberFormatter::getDecimalFormatSymbols() const { return fMacros.symbols.getDecimalFormatSymbols(); } diff --git a/deps/icu-small/source/i18n/number_formatimpl.cpp b/deps/icu-small/source/i18n/number_formatimpl.cpp index 53bac49a55c522..45baa94615edfa 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.cpp +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -229,7 +229,7 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, return nullptr; } } - auto patternInfo = new ParsedPatternInfo(); + auto* patternInfo = new ParsedPatternInfo(); if (patternInfo == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -252,12 +252,12 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, status = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - auto usagePrefsHandler = + auto* usagePrefsHandler = new UsagePrefsHandler(macros.locale, macros.unit, macros.usage.fValue, chain, status); fUsagePrefsHandler.adoptInsteadAndCheckErrorCode(usagePrefsHandler, status); chain = fUsagePrefsHandler.getAlias(); } else if (isMixedUnit) { - auto unitConversionHandler = new UnitConversionHandler(macros.unit, chain, status); + auto* unitConversionHandler = new UnitConversionHandler(macros.unit, chain, status); fUnitConversionHandler.adoptInsteadAndCheckErrorCode(unitConversionHandler, status); chain = fUnitConversionHandler.getAlias(); } @@ -333,7 +333,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, // Inner modifier (scientific notation) if (macros.notation.fType == Notation::NTN_SCIENTIFIC) { - auto newScientificHandler = new ScientificHandler(¯os.notation, fMicros.simple.symbols, chain); + auto* newScientificHandler = + new ScientificHandler(¯os.notation, fMicros.simple.symbols, chain); if (newScientificHandler == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -346,7 +347,7 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, } // Middle modifier (patterns, positive/negative, currency symbols, percent) - auto patternModifier = new MutablePatternModifier(false); + auto* patternModifier = new MutablePatternModifier(false); if (patternModifier == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -444,7 +445,7 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, if (isCompactNotation) { CompactType compactType = (isCurrency && unitWidth != UNUM_UNIT_WIDTH_FULL_NAME) ? CompactType::TYPE_CURRENCY : CompactType::TYPE_DECIMAL; - auto newCompactHandler = new CompactHandler( + auto* newCompactHandler = new CompactHandler( macros.notation.fUnion.compactStyle, macros.locale, nsName, diff --git a/deps/icu-small/source/i18n/number_formatimpl.h b/deps/icu-small/source/i18n/number_formatimpl.h index 62d532126161fa..ba979d8bdc63c7 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.h +++ b/deps/icu-small/source/i18n/number_formatimpl.h @@ -18,8 +18,8 @@ #include "number_microprops.h" #include "number_utypes.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { /** * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a MacroProps and a @@ -170,8 +170,7 @@ class NumberFormatterImpl : public UMemory { UErrorCode &status); }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_grouping.cpp b/deps/icu-small/source/i18n/number_grouping.cpp index 54aeffee811de3..4ad16df2a298b5 100644 --- a/deps/icu-small/source/i18n/number_grouping.cpp +++ b/deps/icu-small/source/i18n/number_grouping.cpp @@ -78,7 +78,7 @@ void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Lo auto grouping2 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff); auto grouping3 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff); if (grouping2 == -1) { - grouping1 = fGrouping1 == -4 ? (short) 3 : (short) -1; + grouping1 = fGrouping1 == -4 ? static_cast<short>(3) : static_cast<short>(-1); } if (grouping3 == -1) { grouping2 = grouping1; diff --git a/deps/icu-small/source/i18n/number_integerwidth.cpp b/deps/icu-small/source/i18n/number_integerwidth.cpp index 10b853423c847a..a0fc2b192ff584 100644 --- a/deps/icu-small/source/i18n/number_integerwidth.cpp +++ b/deps/icu-small/source/i18n/number_integerwidth.cpp @@ -46,14 +46,14 @@ void IntegerWidth::apply(impl::DecimalQuantity& quantity, UErrorCode& status) co if (fHasError) { status = U_ILLEGAL_ARGUMENT_ERROR; } else if (fUnion.minMaxInt.fMaxInt == -1) { - quantity.setMinInteger(fUnion.minMaxInt.fMinInt); + quantity.increaseMinIntegerTo(fUnion.minMaxInt.fMinInt); } else { // Enforce the backwards-compatibility feature "FormatFailIfMoreThanMaxDigits" if (fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits && fUnion.minMaxInt.fMaxInt < quantity.getMagnitude()) { status = U_ILLEGAL_ARGUMENT_ERROR; } - quantity.setMinInteger(fUnion.minMaxInt.fMinInt); + quantity.increaseMinIntegerTo(fUnion.minMaxInt.fMinInt); quantity.applyMaxInteger(fUnion.minMaxInt.fMaxInt); } } diff --git a/deps/icu-small/source/i18n/number_longnames.cpp b/deps/icu-small/source/i18n/number_longnames.cpp index 96c6ca6bf8905d..f0d8cca33ba676 100644 --- a/deps/icu-small/source/i18n/number_longnames.cpp +++ b/deps/icu-small/source/i18n/number_longnames.cpp @@ -9,6 +9,8 @@ #include "unicode/simpleformatter.h" #include "unicode/ures.h" +#include "unicode/plurrule.h" +#include "unicode/strenum.h" #include "ureslocs.h" #include "charstr.h" #include "uresimp.h" @@ -18,6 +20,7 @@ #include <algorithm> #include "cstring.h" #include "util.h" +#include "sharedpluralrules.h" using namespace icu; using namespace icu::number; @@ -45,8 +48,12 @@ constexpr int32_t PER_INDEX = StandardPlural::Form::COUNT + 1; * Gender of the word, in languages with grammatical gender. */ constexpr int32_t GENDER_INDEX = StandardPlural::Form::COUNT + 2; +/** + * Denominator constant of the unit. + */ +constexpr int32_t CONSTANT_DENOMINATOR_INDEX = StandardPlural::Form::COUNT + 3; // Number of keys in the array populated by PluralTableSink. -constexpr int32_t ARRAY_LENGTH = StandardPlural::Form::COUNT + 3; +constexpr int32_t ARRAY_LENGTH = StandardPlural::Form::COUNT + 4; // TODO(icu-units#28): load this list from resources, after creating a "&set" // function for use in ldml2icu rules. @@ -89,7 +96,7 @@ const char *getGenderString(UnicodeString uGender, UErrorCode status) { } // Returns the array index that corresponds to the given pluralKeyword. -static int32_t getIndex(const char* pluralKeyword, UErrorCode& status) { +int32_t getIndex(const char* pluralKeyword, UErrorCode& status) { // pluralKeyword can also be "dnam", "per", or "gender" switch (*pluralKeyword) { case 'd': @@ -119,7 +126,7 @@ static int32_t getIndex(const char* pluralKeyword, UErrorCode& status) { // // The `strings` array must have ARRAY_LENGTH items: one corresponding to each // of the plural forms, plus a display name ("dnam") and a "per" form. -static UnicodeString getWithPlural( +UnicodeString getWithPlural( const UnicodeString* strings, StandardPlural::Form plural, UErrorCode& status) { @@ -431,6 +438,7 @@ void getMeasureData(const Locale &locale, subKey.append(unit.getType(), status); subKey.append("/", status); + // TODO(ICU-23226): Refactor LongNameHandler to use gUnitAliases and gUnitReplacements measunit_extra.cpp instead of local reasource bundle. // Check if unitSubType is an alias or not. LocalUResourceBundlePointer aliasBundle(ures_open(U_ICUDATA_ALIAS, "metadata", &status)); @@ -519,10 +527,35 @@ void getCurrencyLongNameData(const Locale &locale, const CurrencyUnit ¤cy, // In ICU4J, this method gets a CurrencyData from CurrencyData.provider. // TODO(ICU4J): Implement this without going through CurrencyData, like in ICU4C? PluralTableSink sink(outArray); + // Here all outArray entries are bogus. LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_CURR, locale.getName(), &status)); if (U_FAILURE(status)) { return; } ures_getAllChildrenWithFallback(unitsBundle.getAlias(), "CurrencyUnitPatterns", sink, status); if (U_FAILURE(status)) { return; } + // Here the outArray[] entries are filled in with any CurrencyUnitPatterns data for locale, + // or if there is no CurrencyUnitPatterns data for locale since the patterns all inherited + // from the "other" pattern in root (which is true for many locales in CLDR 46), then only + // the "other" entry has a currency pattern. So now what we do is: For all valid plural keywords + // for the locale, if the corresponding outArray[] entry is bogus, fill it in from the "other" + // entry. In the longer run, clients of this should instead consider using CurrencyPluralInfo + // (see i18n/unicode/currpinf.h). + UErrorCode localStatus = U_ZERO_ERROR; + const SharedPluralRules *pr = PluralRules::createSharedInstance( + locale, UPLURAL_TYPE_CARDINAL, localStatus); + if (U_SUCCESS(localStatus)) { + LocalPointer<StringEnumeration> keywords((*pr)->getKeywords(localStatus), localStatus); + if (U_SUCCESS(localStatus)) { + const char* keyword; + while (((keyword = keywords->next(nullptr, localStatus)) != nullptr) && U_SUCCESS(localStatus)) { + int32_t index = StandardPlural::indexOrOtherIndexFromString(keyword); + if (index != StandardPlural::Form::OTHER && outArray[index].isBogus()) { + outArray[index].setTo(outArray[StandardPlural::Form::OTHER]); + } + } + } + pr->removeRef(); + } + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { UnicodeString &pattern = outArray[i]; if (pattern.isBogus()) { @@ -982,6 +1015,11 @@ void LongNameHandler::forArbitraryUnit(const Locale &loc, // denominator (the part after the "-per-). If both are empty, fail MeasureUnitImpl unit; MeasureUnitImpl perUnit; + + if (unitRef.getConstantDenominator(status) != 0) { + perUnit.constantDenominator = unitRef.getConstantDenominator(status); + } + { MeasureUnitImpl fullUnit = MeasureUnitImpl::forMeasureUnitMaybeCopy(unitRef, status); if (U_FAILURE(status)) { @@ -1115,13 +1153,13 @@ void LongNameHandler::processPatternTimes(MeasureUnitImpl &&productUnit, if (U_FAILURE(status)) { return; } - if (productUnit.identifier.length() == 0) { + if (productUnit.identifier.isEmpty()) { // MeasureUnit(): no units: return empty strings. return; } MeasureUnit builtinUnit; - if (MeasureUnit::findBySubType(productUnit.identifier.toStringPiece(), &builtinUnit)) { + if (MeasureUnit::findBySubType(productUnit.identifier.data(), &builtinUnit)) { // TODO(icu-units#145): spec doesn't cover builtin-per-builtin, it // breaks them all down. Do we want to drop this? // - findBySubType isn't super efficient, if we skip it and go to basic @@ -1168,6 +1206,12 @@ void LongNameHandler::processPatternTimes(MeasureUnitImpl &&productUnit, DerivedComponents derivedTimesCases(loc, "case", "times"); DerivedComponents derivedPowerCases(loc, "case", "power"); + if (productUnit.constantDenominator != 0) { + CharString constantString; + constantString.appendNumber(productUnit.constantDenominator, status); + outArray[CONSTANT_DENOMINATOR_INDEX] = UnicodeString::fromUTF8(constantString.toStringPiece()); + } + // 4. For each single_unit in product_unit for (int32_t singleUnitIndex = 0; singleUnitIndex < productUnit.singleUnits.length(); singleUnitIndex++) { @@ -1426,6 +1470,39 @@ void LongNameHandler::processPatternTimes(MeasureUnitImpl &&productUnit, } } } + + // 5. Handling constant denominator if it exists. + if (productUnit.constantDenominator != 0) { + int32_t pluralIndex = -1; + for (int32_t index = 0; index < StandardPlural::Form::COUNT; index++) { + if (!outArray[index].isBogus()) { + pluralIndex = index; + break; + } + } + + U_ASSERT(pluralIndex >= 0); // "No plural form found for constant denominator" + + // TODO(ICU-23039): + // Improve the handling of constant_denominator representation. + // For instance, a constant_denominator of 1000000 should be adaptable to + // formats like + // 1,000,000, 1e6, or 1 million. + // Furthermore, ensure consistent pluralization rules for units. For example, + // "meter per 100 seconds" should be evaluated for correct singular/plural + // usage: "second" or "seconds"? + // Similarly, "kilogram per 1000 meters" should be checked for "meter" or + // "meters"? + if (outArray[pluralIndex].length() == 0) { + outArray[pluralIndex] = outArray[CONSTANT_DENOMINATOR_INDEX]; + } else { + UnicodeString tmp; + timesPatternFormatter.format(outArray[CONSTANT_DENOMINATOR_INDEX], outArray[pluralIndex], + tmp, status); + outArray[pluralIndex] = tmp; + } + } + for (int32_t pluralIndex = 0; pluralIndex < StandardPlural::Form::COUNT; pluralIndex++) { if (globalPlaceholder[pluralIndex] == PH_BEGINNING) { UnicodeString tmp; @@ -1481,9 +1558,8 @@ LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status) { - auto* result = new LongNameHandler(rules, parent); - if (result == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + LocalPointer<LongNameHandler> result(new LongNameHandler(rules, parent), status); + if (U_FAILURE(status)) { return nullptr; } UnicodeString simpleFormats[ARRAY_LENGTH]; @@ -1491,7 +1567,7 @@ LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const if (U_FAILURE(status)) { return nullptr; } result->simpleFormatsToModifiers(simpleFormats, {UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD}, status); // TODO(icu-units#28): currency gender? - return result; + return result.orphan(); } void LongNameHandler::simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h index 56d8c9b24e8d71..ef1ce74104f291 100644 --- a/deps/icu-small/source/i18n/number_longnames.h +++ b/deps/icu-small/source/i18n/number_longnames.h @@ -13,8 +13,8 @@ #include "number_utils.h" #include "number_modifiers.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { // LongNameHandler takes care of formatting currency and measurement unit names, // as well as populating the gender of measure units. @@ -263,8 +263,7 @@ class LongNameMultiplexer : public MicroPropsGenerator, public UMemory { } }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_LONGNAMES_H__ diff --git a/deps/icu-small/source/i18n/number_mapper.cpp b/deps/icu-small/source/i18n/number_mapper.cpp index 2f398d4a9392fb..457fbc0d0712a3 100644 --- a/deps/icu-small/source/i18n/number_mapper.cpp +++ b/deps/icu-small/source/i18n/number_mapper.cpp @@ -74,9 +74,11 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert !properties.currencyPluralInfo.fPtr.isNull() || !properties.currencyUsage.isNull() || warehouse.affixProvider.get().hasCurrencySign()); - CurrencyUnit currency = resolveCurrency(properties, locale, status); - UCurrencyUsage currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD); + CurrencyUnit currency; + UCurrencyUsage currencyUsage; if (useCurrency) { + currency = resolveCurrency(properties, locale, status); + currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD); // NOTE: Slicing is OK. macros.unit = currency; // NOLINT } @@ -129,6 +131,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert } Precision precision; if (!properties.currencyUsage.isNull()) { + U_ASSERT(useCurrency); precision = Precision::constructCurrency(currencyUsage).withCurrency(currency); } else if (roundingIncrement != 0.0) { if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) { @@ -276,7 +279,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert exportedProperties->maximumIntegerDigits = maxInt == -1 ? INT32_MAX : maxInt; Precision rounding_; - if (precision.fType == Precision::PrecisionType::RND_CURRENCY) { + if (useCurrency && precision.fType == Precision::PrecisionType::RND_CURRENCY) { rounding_ = precision.withCurrency(currency, status); } else { rounding_ = precision; diff --git a/deps/icu-small/source/i18n/number_mapper.h b/deps/icu-small/source/i18n/number_mapper.h index c01607e5688f9e..fc5617cb463367 100644 --- a/deps/icu-small/source/i18n/number_mapper.h +++ b/deps/icu-small/source/i18n/number_mapper.h @@ -16,9 +16,7 @@ #include "numparse_impl.h" U_NAMESPACE_BEGIN -namespace number { -namespace impl { - +namespace number::impl { class AutoAffixPatternProvider; class CurrencyPluralInfoAffixProvider; @@ -142,9 +140,9 @@ class AutoAffixPatternProvider { } inline void setTo(const AffixPatternProvider* provider, UErrorCode& status) { - if (auto ptr = dynamic_cast<const PropertiesAffixPatternProvider*>(provider)) { + if (const auto* ptr = dynamic_cast<const PropertiesAffixPatternProvider*>(provider)) { propertiesAPP = *ptr; - } else if (auto ptr = dynamic_cast<const CurrencyPluralInfoAffixProvider*>(provider)) { + } else if (const auto* ptr = dynamic_cast<const CurrencyPluralInfoAffixProvider*>(provider)) { currencyPluralInfoAPP = *ptr; } else { status = U_INTERNAL_PROGRAM_ERROR; @@ -257,9 +255,7 @@ class NumberPropertyMapper { DecimalFormatProperties* exportedProperties, UErrorCode& status); }; - -} // namespace impl -} // namespace numparse +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_MAPPER_H__ diff --git a/deps/icu-small/source/i18n/number_microprops.h b/deps/icu-small/source/i18n/number_microprops.h index 18addaae0878d3..6d58bc3c36070e 100644 --- a/deps/icu-small/source/i18n/number_microprops.h +++ b/deps/icu-small/source/i18n/number_microprops.h @@ -20,8 +20,8 @@ #include "charstr.h" #include "util.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { /** * A copyable container for the integer values of mixed unit measurements. @@ -188,8 +188,7 @@ struct MicroProps : public MicroPropsGenerator { bool exhausted = false; }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif // __NUMBER_MICROPROPS_H__ diff --git a/deps/icu-small/source/i18n/number_modifiers.cpp b/deps/icu-small/source/i18n/number_modifiers.cpp index 0f6fdafb093fef..9982a715baa542 100644 --- a/deps/icu-small/source/i18n/number_modifiers.cpp +++ b/deps/icu-small/source/i18n/number_modifiers.cpp @@ -60,6 +60,41 @@ Modifier::Parameters::Parameters( const ModifierStore* _obj, Signum _signum, StandardPlural::Form _plural) : obj(_obj), signum(_signum), plural(_plural) {} +bool Modifier::semanticallyEquivalent(const Modifier& other) const { + Parameters paramsThis; + Parameters paramsOther; + getParameters(paramsThis); + other.getParameters(paramsOther); + if (paramsThis.obj == nullptr && paramsOther.obj == nullptr) { + return strictEquals(other); + } else if (paramsThis.obj == nullptr || paramsOther.obj == nullptr) { + return false; + } + for (size_t i=0; i<SIGNUM_COUNT; i++) { + auto signum = static_cast<Signum>(i); + for (size_t j=0; j<StandardPlural::COUNT; j++) { + auto plural = static_cast<StandardPlural::Form>(j); + const auto* mod1 = paramsThis.obj->getModifier(signum, plural); + const auto* mod2 = paramsOther.obj->getModifier(signum, plural); + if (mod1 == mod2) { + // Equal pointers + continue; + } else if (mod1 == nullptr || mod2 == nullptr) { + // One pointer is null but not the other + return false; + } else if (!mod1->strictEquals(*mod2)) { + // The modifiers are NOT equivalent + return false; + } else { + // The modifiers are equivalent + continue; + } + } + } + return true; +} + + ModifierStore::~ModifierStore() = default; AdoptingSignumModifierStore::~AdoptingSignumModifierStore() { @@ -110,8 +145,8 @@ void ConstantAffixModifier::getParameters(Parameters& output) const { UPRV_UNREACHABLE_EXIT; } -bool ConstantAffixModifier::semanticallyEquivalent(const Modifier& other) const { - auto* _other = dynamic_cast<const ConstantAffixModifier*>(&other); +bool ConstantAffixModifier::strictEquals(const Modifier& other) const { + const auto* _other = dynamic_cast<const ConstantAffixModifier*>(&other); if (_other == nullptr) { return false; } @@ -197,14 +232,11 @@ void SimpleModifier::getParameters(Parameters& output) const { output = fParameters; } -bool SimpleModifier::semanticallyEquivalent(const Modifier& other) const { - auto* _other = dynamic_cast<const SimpleModifier*>(&other); +bool SimpleModifier::strictEquals(const Modifier& other) const { + const auto* _other = dynamic_cast<const SimpleModifier*>(&other); if (_other == nullptr) { return false; } - if (fParameters.obj != nullptr) { - return fParameters.obj == _other->fParameters.obj; - } return fCompiledPattern == _other->fCompiledPattern && fField == _other->fField && fStrong == _other->fStrong; @@ -327,14 +359,11 @@ void ConstantMultiFieldModifier::getParameters(Parameters& output) const { output = fParameters; } -bool ConstantMultiFieldModifier::semanticallyEquivalent(const Modifier& other) const { - auto* _other = dynamic_cast<const ConstantMultiFieldModifier*>(&other); +bool ConstantMultiFieldModifier::strictEquals(const Modifier& other) const { + const auto* _other = dynamic_cast<const ConstantMultiFieldModifier*>(&other); if (_other == nullptr) { return false; } - if (fParameters.obj != nullptr) { - return fParameters.obj == _other->fParameters.obj; - } return fPrefix.contentEquals(_other->fPrefix) && fSuffix.contentEquals(_other->fSuffix) && fOverwrite == _other->fOverwrite @@ -469,7 +498,7 @@ CurrencySpacingEnabledModifier::getUnicodeSet(const DecimalFormatSymbols &symbol // Ensure the static defaults are initialized: umtx_initOnce(gDefaultCurrencySpacingInitOnce, &initDefaultCurrencySpacing, status); if (U_FAILURE(status)) { - return UnicodeSet(); + return {}; } const UnicodeString& pattern = symbols.getPatternForCurrencySpacing( diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h index da6956bcfb438c..1afee495de1dda 100644 --- a/deps/icu-small/source/i18n/number_modifiers.h +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -15,8 +15,8 @@ #include "formatted_string_builder.h" #include "number_types.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { /** * The canonical implementation of {@link Modifier}, containing a prefix and suffix string. @@ -41,7 +41,7 @@ class U_I18N_API ConstantAffixModifier : public Modifier, public UObject { void getParameters(Parameters& output) const override; - bool semanticallyEquivalent(const Modifier& other) const override; + bool strictEquals(const Modifier& other) const override; private: UnicodeString fPrefix; @@ -77,7 +77,7 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory { void getParameters(Parameters& output) const override; - bool semanticallyEquivalent(const Modifier& other) const override; + bool strictEquals(const Modifier& other) const override; /** * TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because @@ -170,7 +170,7 @@ class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory { void getParameters(Parameters& output) const override; - bool semanticallyEquivalent(const Modifier& other) const override; + bool strictEquals(const Modifier& other) const override; protected: // NOTE: In Java, these are stored as array pointers. In C++, the FormattedStringBuilder is stored by @@ -264,7 +264,7 @@ class U_I18N_API EmptyModifier : public Modifier, public UMemory { output.obj = nullptr; } - bool semanticallyEquivalent(const Modifier& other) const override { + bool strictEquals(const Modifier& other) const override { return other.getCodePointCount() == 0; } @@ -350,8 +350,7 @@ class U_I18N_API AdoptingModifierStore : public ModifierStore, public UMemory { AdoptingSignumModifierStore mods[StandardPlural::COUNT] = {}; }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_multiplier.cpp b/deps/icu-small/source/i18n/number_multiplier.cpp index dd5b3f8e069826..e6bc2a1e38a4f4 100644 --- a/deps/icu-small/source/i18n/number_multiplier.cpp +++ b/deps/icu-small/source/i18n/number_multiplier.cpp @@ -66,9 +66,7 @@ Scale::Scale(Scale&& src) noexcept Scale& Scale::operator=(Scale&& src) noexcept { fMagnitude = src.fMagnitude; - if (fArbitrary != nullptr) { - delete fArbitrary; - } + delete fArbitrary; fArbitrary = src.fArbitrary; fError = src.fError; // Take ownership away from src if necessary diff --git a/deps/icu-small/source/i18n/number_multiplier.h b/deps/icu-small/source/i18n/number_multiplier.h index c752935b78313f..62b04778e8507d 100644 --- a/deps/icu-small/source/i18n/number_multiplier.h +++ b/deps/icu-small/source/i18n/number_multiplier.h @@ -10,9 +10,8 @@ #include "numparse_types.h" #include "number_decimfmtprops.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { - +U_NAMESPACE_BEGIN +namespace number::impl { /** * Wraps a {@link Multiplier} for use in the number formatting pipeline. @@ -48,9 +47,7 @@ static inline Scale scaleFromProperties(const DecimalFormatProperties& propertie } } - -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__SOURCE_NUMBER_MULTIPLIER_H__ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.cpp b/deps/icu-small/source/i18n/number_patternmodifier.cpp index 6f398c6acf0dec..a5a21557091475 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.cpp +++ b/deps/icu-small/source/i18n/number_patternmodifier.cpp @@ -85,7 +85,7 @@ ImmutablePatternModifier* MutablePatternModifier::createImmutable(UErrorCode& st StandardPlural::Form::MANY, StandardPlural::Form::OTHER}; - auto pm = new AdoptingModifierStore(); + auto* pm = new AdoptingModifierStore(); if (pm == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -176,7 +176,7 @@ void MutablePatternModifier::processQuantity(DecimalQuantity& fq, MicroProps& mi } // The unsafe code path performs self-mutation, so we need a const_cast. // This method needs to be const because it overrides a const method in the parent class. - auto nonConstThis = const_cast<MutablePatternModifier*>(this); + auto* nonConstThis = const_cast<MutablePatternModifier*>(this); if (needsPlurals()) { StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, fRules, fq, status); nonConstThis->setNumberProperties(fq.signum(), pluralForm); @@ -190,7 +190,7 @@ int32_t MutablePatternModifier::apply(FormattedStringBuilder& output, int32_t le UErrorCode& status) const { // The unsafe code path performs self-mutation, so we need a const_cast. // This method needs to be const because it overrides a const method in the parent class. - auto nonConstThis = const_cast<MutablePatternModifier*>(this); + auto* nonConstThis = const_cast<MutablePatternModifier*>(this); int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status); int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status); // If the pattern had no decimal stem body (like #,##0.00), overwrite the value. @@ -219,7 +219,7 @@ int32_t MutablePatternModifier::apply(FormattedStringBuilder& output, int32_t le int32_t MutablePatternModifier::getPrefixLength() const { // The unsafe code path performs self-mutation, so we need a const_cast. // This method needs to be const because it overrides a const method in the parent class. - auto nonConstThis = const_cast<MutablePatternModifier*>(this); + auto* nonConstThis = const_cast<MutablePatternModifier*>(this); // Enter and exit CharSequence Mode to get the length. UErrorCode status = U_ZERO_ERROR; // status fails only with an iilegal argument exception @@ -231,7 +231,7 @@ int32_t MutablePatternModifier::getPrefixLength() const { int32_t MutablePatternModifier::getCodePointCount() const { // The unsafe code path performs self-mutation, so we need a const_cast. // This method needs to be const because it overrides a const method in the parent class. - auto nonConstThis = const_cast<MutablePatternModifier*>(this); + auto* nonConstThis = const_cast<MutablePatternModifier*>(this); // Render the affixes to get the length UErrorCode status = U_ZERO_ERROR; // status fails only with an iilegal argument exception @@ -258,7 +258,7 @@ void MutablePatternModifier::getParameters(Parameters& output) const { UPRV_UNREACHABLE_EXIT; } -bool MutablePatternModifier::semanticallyEquivalent(const Modifier& other) const { +bool MutablePatternModifier::strictEquals(const Modifier& other) const { (void)other; // This method is not currently used. UPRV_UNREACHABLE_EXIT; @@ -334,7 +334,7 @@ UnicodeString MutablePatternModifier::getCurrencySymbolForUnitWidth(UErrorCode& case UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT: return fCurrencySymbols.getVariantCurrencySymbol(status); case UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN: - return UnicodeString(); + return {}; default: return fCurrencySymbols.getCurrencySymbol(status); } diff --git a/deps/icu-small/source/i18n/number_patternmodifier.h b/deps/icu-small/source/i18n/number_patternmodifier.h index ee38c20c9c9700..23d843d10265fc 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.h +++ b/deps/icu-small/source/i18n/number_patternmodifier.h @@ -17,36 +17,21 @@ U_NAMESPACE_BEGIN -// Export an explicit template instantiation of the LocalPointer that is used as a -// data member of AdoptingModifierStore. -// (When building DLLs for Windows this is required.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -#if defined(_MSC_VER) -// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(push) -#pragma warning(disable : 4661) -#endif -template class U_I18N_API LocalPointerBase<number::impl::AdoptingModifierStore>; -template class U_I18N_API LocalPointer<number::impl::AdoptingModifierStore>; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif -#endif - -namespace number { -namespace impl { +namespace number::impl { // Forward declaration class MutablePatternModifier; -// Exported as U_I18N_API because it is needed for the unit test PatternModifierTest -class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public UMemory { +// Exported as U_I18N_API_CLASS because it is needed for the unit test PatternModifierTest +class U_I18N_API_CLASS ImmutablePatternModifier : public MicroPropsGenerator, public UMemory { public: ~ImmutablePatternModifier() override = default; void processQuantity(DecimalQuantity&, MicroProps& micros, UErrorCode& status) const override; - void applyToMicros(MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const; + U_I18N_API void applyToMicros(MicroProps& micros, + const DecimalQuantity& quantity, + UErrorCode& status) const; const Modifier* getModifier(Signum signum, StandardPlural::Form plural) const; @@ -82,7 +67,7 @@ class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public U * {@link MutablePatternModifier#createImmutable}, in effect treating this instance as a builder for the immutable * variant. */ -class U_I18N_API MutablePatternModifier +class U_I18N_API_CLASS MutablePatternModifier : public MicroPropsGenerator, public Modifier, public SymbolProvider, @@ -97,7 +82,7 @@ class U_I18N_API MutablePatternModifier * {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should be considered * as non-strong. */ - explicit MutablePatternModifier(bool isStrong); + U_I18N_API explicit MutablePatternModifier(bool isStrong); /** * Sets a reference to the parsed decimal format pattern, usually obtained from @@ -107,7 +92,7 @@ class U_I18N_API MutablePatternModifier * @param field * Which field to use for literal characters in the pattern. */ - void setPatternInfo(const AffixPatternProvider *patternInfo, Field field); + U_I18N_API void setPatternInfo(const AffixPatternProvider *patternInfo, Field field); /** * Sets attributes that imply changes to the literal interpretation of the pattern string affixes. @@ -119,7 +104,8 @@ class U_I18N_API MutablePatternModifier * @param approximately * Whether to prepend approximately to the sign */ - void setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille, bool approximately); + U_I18N_API void setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille, + bool approximately); /** * Sets locale-specific details that affect the symbols substituted into the pattern string affixes. @@ -136,8 +122,8 @@ class U_I18N_API MutablePatternModifier * @param status * Set if an error occurs while loading currency data. */ - void setSymbols(const DecimalFormatSymbols* symbols, const CurrencyUnit& currency, - UNumberUnitWidth unitWidth, const PluralRules* rules, UErrorCode& status); + U_I18N_API void setSymbols(const DecimalFormatSymbols* symbols, const CurrencyUnit& currency, + UNumberUnitWidth unitWidth, const PluralRules* rules, UErrorCode& status); /** * Sets attributes of the current number being processed. @@ -148,7 +134,7 @@ class U_I18N_API MutablePatternModifier * The plural form of the number, required only if the pattern contains the triple * currency sign, "¤¤¤" (and as indicated by {@link #needsPlurals()}). */ - void setNumberProperties(Signum signum, StandardPlural::Form plural); + U_I18N_API void setNumberProperties(Signum signum, StandardPlural::Form plural); /** * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize. @@ -157,7 +143,8 @@ class U_I18N_API MutablePatternModifier bool needsPlurals() const; /** Creates a quantity-dependent Modifier for the specified plural form. */ - AdoptingSignumModifierStore createImmutableForPlural(StandardPlural::Form plural, UErrorCode& status); + U_I18N_API AdoptingSignumModifierStore createImmutableForPlural(StandardPlural::Form plural, + UErrorCode& status); /** * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable @@ -172,14 +159,15 @@ class U_I18N_API MutablePatternModifier * * @return An immutable that supports both positive and negative numbers. */ - ImmutablePatternModifier *createImmutable(UErrorCode &status); + U_I18N_API ImmutablePatternModifier *createImmutable(UErrorCode &status); - MicroPropsGenerator &addToChain(const MicroPropsGenerator *parent); + U_I18N_API MicroPropsGenerator &addToChain(const MicroPropsGenerator *parent); - void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const override; + U_I18N_API void processQuantity(DecimalQuantity &, MicroProps µs, + UErrorCode &status) const override; - int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex, - UErrorCode &status) const override; + U_I18N_API int32_t apply(FormattedStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const override; int32_t getPrefixLength() const override; @@ -191,7 +179,7 @@ class U_I18N_API MutablePatternModifier void getParameters(Parameters& output) const override; - bool semanticallyEquivalent(const Modifier& other) const override; + bool strictEquals(const Modifier& other) const override; /** * Returns the string that substitutes a given symbol type in a pattern. @@ -255,9 +243,8 @@ class U_I18N_API MutablePatternModifier void prepareAffix(bool isPrefix); }; +} // namespace number::impl -} // namespace impl -} // namespace number U_NAMESPACE_END #endif //__NUMBER_PATTERNMODIFIER_H__ diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp index aa082be5a8732e..75e5062082905d 100644 --- a/deps/icu-small/source/i18n/number_patternstring.cpp +++ b/deps/icu-small/source/i18n/number_patternstring.cpp @@ -66,7 +66,7 @@ int32_t ParsedPatternInfo::getLengthFromEndpoints(const Endpoints& endpoints) { UnicodeString ParsedPatternInfo::getString(int32_t flags) const { const Endpoints& endpoints = getEndpoints(flags); if (endpoints.start == endpoints.end) { - return UnicodeString(); + return {}; } // Create a new UnicodeString return UnicodeString(pattern, endpoints.start, endpoints.end - endpoints.start); @@ -768,7 +768,7 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP incrementQuantity.roundToInfinity(); digitsStringScale = incrementQuantity.getLowerDisplayMagnitude(); incrementQuantity.adjustMagnitude(-digitsStringScale); - incrementQuantity.setMinInteger(minInt - digitsStringScale); + incrementQuantity.increaseMinIntegerTo(minInt - digitsStringScale); UnicodeString str = incrementQuantity.toPlainString(); if (str.charAt(0) == u'-') { // TODO: Unsupported operation exception or fail silently? diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h index 989d0d3464b20a..2b3ab02be0f232 100644 --- a/deps/icu-small/source/i18n/number_patternstring.h +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -16,8 +16,8 @@ #include "number_decimfmtprops.h" #include "number_affixutils.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { // Forward declaration class PatternParser; @@ -330,8 +330,7 @@ class U_I18N_API PatternStringUtils { UErrorCode& status); }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp index e6bb509ffd75a4..0f3975393c581b 100644 --- a/deps/icu-small/source/i18n/number_rounding.cpp +++ b/deps/icu-small/source/i18n/number_rounding.cpp @@ -278,23 +278,23 @@ Precision IncrementPrecision::withMinFraction(int32_t minFrac) const { } FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) { - FractionSignificantSettings settings; + FractionSignificantSettings settings{}; settings.fMinFrac = static_cast<digits_t>(minFrac); settings.fMaxFrac = static_cast<digits_t>(maxFrac); settings.fMinSig = -1; settings.fMaxSig = -1; - PrecisionUnion union_; + PrecisionUnion union_{}; union_.fracSig = settings; return {RND_FRACTION, union_}; } Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) { - FractionSignificantSettings settings; + FractionSignificantSettings settings{}; settings.fMinFrac = -1; settings.fMaxFrac = -1; settings.fMinSig = static_cast<digits_t>(minSig); settings.fMaxSig = static_cast<digits_t>(maxSig); - PrecisionUnion union_; + PrecisionUnion union_{}; union_.fracSig = settings; return {RND_SIGNIFICANT, union_}; } @@ -311,20 +311,20 @@ Precision::constructFractionSignificant( settings.fMaxSig = static_cast<digits_t>(maxSig); settings.fPriority = priority; settings.fRetain = retain; - PrecisionUnion union_; + PrecisionUnion union_{}; union_.fracSig = settings; return {RND_FRACTION_SIGNIFICANT, union_}; } IncrementPrecision Precision::constructIncrement(uint64_t increment, digits_t magnitude) { - IncrementSettings settings; + IncrementSettings settings{}; // Note: For number formatting, fIncrement is used for RND_INCREMENT but not // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all // three when constructing a skeleton. settings.fIncrement = increment; settings.fIncrementMagnitude = magnitude; settings.fMinFrac = magnitude > 0 ? 0 : -magnitude; - PrecisionUnion union_; + PrecisionUnion union_{}; union_.increment = settings; if (increment == 1) { // NOTE: In C++, we must return the correct value type with the correct union. @@ -339,7 +339,7 @@ IncrementPrecision Precision::constructIncrement(uint64_t increment, digits_t ma } CurrencyPrecision Precision::constructCurrency(UCurrencyUsage usage) { - PrecisionUnion union_; + PrecisionUnion union_{}; union_.currencyUsage = usage; return {RND_CURRENCY, union_}; } @@ -437,7 +437,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)); // Make sure that digits are displayed on zero. if (value.isZeroish() && fPrecision.fUnion.fracSig.fMinSig > 0) { - value.setMinInteger(1); + value.increaseMinIntegerTo(1); } break; diff --git a/deps/icu-small/source/i18n/number_roundingutils.h b/deps/icu-small/source/i18n/number_roundingutils.h index 66571272545854..08c62dd6aee2ae 100644 --- a/deps/icu-small/source/i18n/number_roundingutils.h +++ b/deps/icu-small/source/i18n/number_roundingutils.h @@ -11,8 +11,7 @@ #include "string_segment.h" U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { namespace roundingutils { enum Section { @@ -238,8 +237,7 @@ class RoundingImpl { */ void parseIncrementOption(const StringSegment &segment, Precision &outPrecision, UErrorCode &status); -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_ROUNDINGUTILS_H__ diff --git a/deps/icu-small/source/i18n/number_scientific.cpp b/deps/icu-small/source/i18n/number_scientific.cpp index d365d982d4ce85..f7c5434b79c3fd 100644 --- a/deps/icu-small/source/i18n/number_scientific.cpp +++ b/deps/icu-small/source/i18n/number_scientific.cpp @@ -104,8 +104,8 @@ void ScientificModifier::getParameters(Parameters& output) const { output.obj = nullptr; } -bool ScientificModifier::semanticallyEquivalent(const Modifier& other) const { - auto* _other = dynamic_cast<const ScientificModifier*>(&other); +bool ScientificModifier::strictEquals(const Modifier& other) const { + const auto* _other = dynamic_cast<const ScientificModifier*>(&other); if (_other == nullptr) { return false; } diff --git a/deps/icu-small/source/i18n/number_scientific.h b/deps/icu-small/source/i18n/number_scientific.h index 22140a09afc95b..60122b1551155a 100644 --- a/deps/icu-small/source/i18n/number_scientific.h +++ b/deps/icu-small/source/i18n/number_scientific.h @@ -9,8 +9,8 @@ #include "number_types.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { +U_NAMESPACE_BEGIN +namespace number::impl { // Forward-declare class ScientificHandler; @@ -34,7 +34,7 @@ class U_I18N_API ScientificModifier : public UMemory, public Modifier { void getParameters(Parameters& output) const override; - bool semanticallyEquivalent(const Modifier& other) const override; + bool strictEquals(const Modifier& other) const override; private: int32_t fExponent; @@ -59,8 +59,7 @@ class ScientificHandler : public UMemory, public MicroPropsGenerator, public Mul friend class ScientificModifier; }; -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_SCIENTIFIC_H__ diff --git a/deps/icu-small/source/i18n/number_simple.cpp b/deps/icu-small/source/i18n/number_simple.cpp index a2af6be42d60a1..4d8706d9bd07a0 100644 --- a/deps/icu-small/source/i18n/number_simple.cpp +++ b/deps/icu-small/source/i18n/number_simple.cpp @@ -20,12 +20,12 @@ using namespace icu::number::impl; SimpleNumber SimpleNumber::forInt64(int64_t value, UErrorCode& status) { if (U_FAILURE(status)) { - return SimpleNumber(); + return {}; } - auto results = new UFormattedNumberData(); + auto* results = new UFormattedNumberData(); if (results == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return SimpleNumber(); + return {}; } results->quantity.setToLong(value); return SimpleNumber(results, status); @@ -81,7 +81,8 @@ void SimpleNumber::setMinimumIntegerDigits(uint32_t position, UErrorCode& status status = U_INVALID_STATE_ERROR; return; } - fData->quantity.setMinInteger(position); + fData->quantity.decreaseMinIntegerTo(position); + fData->quantity.increaseMinIntegerTo(position); } void SimpleNumber::setMinimumFractionDigits(uint32_t position, UErrorCode& status) { @@ -95,7 +96,7 @@ void SimpleNumber::setMinimumFractionDigits(uint32_t position, UErrorCode& statu fData->quantity.setMinFraction(position); } -void SimpleNumber::truncateStart(uint32_t position, UErrorCode& status) { +void SimpleNumber::setMaximumIntegerDigits(uint32_t position, UErrorCode& status) { if (U_FAILURE(status)) { return; } @@ -103,6 +104,7 @@ void SimpleNumber::truncateStart(uint32_t position, UErrorCode& status) { status = U_INVALID_STATE_ERROR; return; } + fData->quantity.decreaseMinIntegerTo(position); fData->quantity.applyMaxInteger(position); } @@ -176,7 +178,7 @@ void SimpleNumberFormatter::initialize( } fMicros->symbols = &symbols; - auto pattern = utils::getPatternForStyle( + const auto* pattern = utils::getPatternForStyle( locale, symbols.getNumberingSystemName(), CLDR_PATTERN_STYLE_DECIMAL, @@ -203,7 +205,6 @@ void SimpleNumberFormatter::initialize( fPatternModifier = new AdoptingSignumModifierStore(patternModifier.createImmutableForPlural(StandardPlural::COUNT, status)); fGroupingStrategy = groupingStrategy; - return; } FormattedNumber SimpleNumberFormatter::format(SimpleNumber value, UErrorCode &status) const { @@ -211,7 +212,7 @@ FormattedNumber SimpleNumberFormatter::format(SimpleNumber value, UErrorCode &st // Do not save the results object if we encountered a failure. if (U_SUCCESS(status)) { - auto temp = value.fData; + auto* temp = value.fData; value.fData = nullptr; return FormattedNumber(temp); } else { diff --git a/deps/icu-small/source/i18n/number_skeletons.cpp b/deps/icu-small/source/i18n/number_skeletons.cpp index ef3befbffad365..67a38dad073766 100644 --- a/deps/icu-small/source/i18n/number_skeletons.cpp +++ b/deps/icu-small/source/i18n/number_skeletons.cpp @@ -184,7 +184,7 @@ Notation stem_to_object::notation(skeleton::StemEnum stem) { MeasureUnit stem_to_object::unit(skeleton::StemEnum stem) { switch (stem) { case STEM_BASE_UNIT: - return MeasureUnit(); + return {}; case STEM_PERCENT: return MeasureUnit::getPercent(); case STEM_PERMILLE: @@ -1015,6 +1015,12 @@ blueprint_helpers::parseExponentSignOption(const StringSegment& segment, MacroPr return true; } +// The function is called by skeleton::parseOption which called by skeleton::parseSkeleton +// the data pointed in the return macros.unit is stack allocated in the parseSkeleton function. +#if U_GCC_MAJOR_MINOR >= 1204 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdangling-pointer" +#endif void blueprint_helpers::parseCurrencyOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status) { // Unlike ICU4J, have to check length manually because ICU4C CurrencyUnit does not check it for us @@ -1034,6 +1040,9 @@ void blueprint_helpers::parseCurrencyOption(const StringSegment& segment, MacroP // Slicing is OK macros.unit = currency; // NOLINT } +#if U_GCC_MAJOR_MINOR >= 1204 +#pragma GCC diagnostic pop +#endif void blueprint_helpers::generateCurrencyOption(const CurrencyUnit& currency, UnicodeString& sb, UErrorCode&) { @@ -1287,7 +1296,6 @@ void blueprint_helpers::parseScientificStem(const StringSegment& segment, MacroP fail: void(); // throw new SkeletonSyntaxException("Invalid scientific stem", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; - return; } void blueprint_helpers::parseIntegerStem(const StringSegment& segment, MacroProps& macros, UErrorCode& status) { @@ -1305,7 +1313,6 @@ void blueprint_helpers::parseIntegerStem(const StringSegment& segment, MacroProp return; } macros.integerWidth = IntegerWidth::zeroFillTo(offset); - return; } bool blueprint_helpers::parseFracSigOption(const StringSegment& segment, MacroProps& macros, @@ -1344,7 +1351,7 @@ bool blueprint_helpers::parseFracSigOption(const StringSegment& segment, MacroPr // @, @@, @@@ maxSig = minSig; } - auto& oldPrecision = static_cast<const FractionPrecision&>(macros.precision); + const auto& oldPrecision = static_cast<const FractionPrecision&>(macros.precision); if (offset < segment.length()) { UNumberRoundingPriority priority; if (maxSig == -1) { diff --git a/deps/icu-small/source/i18n/number_skeletons.h b/deps/icu-small/source/i18n/number_skeletons.h index 27f69cd48c39e9..47a1a7ace899bc 100644 --- a/deps/icu-small/source/i18n/number_skeletons.h +++ b/deps/icu-small/source/i18n/number_skeletons.h @@ -13,8 +13,7 @@ #include "string_segment.h" U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { // Forward-declaration struct SeenMacroProps; @@ -385,8 +384,7 @@ UPRV_BLOCK_MACRO_BEGIN { \ } // namespace -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__SOURCE_NUMBER_SKELETONS_H__ diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h index 84846efb9242ac..a67099e5e3bdd7 100644 --- a/deps/icu-small/source/i18n/number_types.h +++ b/deps/icu-small/source/i18n/number_types.h @@ -20,8 +20,7 @@ #include "formatted_string_builder.h" U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { // For convenience and historical reasons, import the Field typedef to the namespace. typedef FormattedStringBuilder::Field Field; @@ -224,11 +223,16 @@ class U_I18N_API Modifier { */ virtual void getParameters(Parameters& output) const = 0; + /** + * Returns whether this Modifier equals another Modifier. + */ + virtual bool strictEquals(const Modifier& other) const = 0; + /** * Returns whether this Modifier is *semantically equivalent* to the other Modifier; * in many cases, this is the same as equal, but parameters should be ignored. */ - virtual bool semanticallyEquivalent(const Modifier& other) const = 0; + bool semanticallyEquivalent(const Modifier& other) const; }; @@ -364,9 +368,7 @@ class U_I18N_API NullableValue { T fValue; }; - -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__NUMBER_TYPES_H__ diff --git a/deps/icu-small/source/i18n/number_usageprefs.cpp b/deps/icu-small/source/i18n/number_usageprefs.cpp index 6f7fdaa9dcaddb..5c15c1cc3fb8bd 100644 --- a/deps/icu-small/source/i18n/number_usageprefs.cpp +++ b/deps/icu-small/source/i18n/number_usageprefs.cpp @@ -49,7 +49,7 @@ StringProp &StringProp::operator=(const StringProp &other) { // copying an errored StringProp. return *this; } - fValue = (char *)uprv_malloc(other.fLength + 1); + fValue = static_cast<char*>(uprv_malloc(other.fLength + 1)); if (fValue == nullptr) { fError = U_MEMORY_ALLOCATION_ERROR; return *this; @@ -96,7 +96,7 @@ void StringProp::set(StringPiece value) { fValue = nullptr; } fLength = value.length(); - fValue = (char *)uprv_malloc(fLength + 1); + fValue = static_cast<char*>(uprv_malloc(fLength + 1)); if (fValue == nullptr) { fLength = 0; fError = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/i18n/number_usageprefs.h b/deps/icu-small/source/i18n/number_usageprefs.h index e90df99d396f56..7b3dc85959e494 100644 --- a/deps/icu-small/source/i18n/number_usageprefs.h +++ b/deps/icu-small/source/i18n/number_usageprefs.h @@ -23,15 +23,14 @@ U_NAMESPACE_BEGIN using ::icu::units::ComplexUnitsConverter; using ::icu::units::UnitsRouter; -namespace number { -namespace impl { +namespace number::impl { /** * A MicroPropsGenerator which uses UnitsRouter to produce output converted to a * MeasureUnit appropriate for a particular localized usage: see * NumberFormatterSettings::usage(). */ -class U_I18N_API UsagePrefsHandler : public MicroPropsGenerator, public UMemory { +class UsagePrefsHandler : public MicroPropsGenerator, public UMemory { public: UsagePrefsHandler(const Locale &locale, const MeasureUnit &inputUnit, const StringPiece usage, const MicroPropsGenerator *parent, UErrorCode &status); @@ -62,37 +61,12 @@ class U_I18N_API UsagePrefsHandler : public MicroPropsGenerator, public UMemory const MicroPropsGenerator *fParent; }; -} // namespace impl -} // namespace number - -// Export explicit template instantiations of LocalPointerBase and LocalPointer. -// This is required when building DLLs for Windows. (See datefmt.h, -// collationiterator.h, erarules.h and others for similar examples.) -// -// Note: These need to be outside of the number::impl namespace, or Clang will -// generate a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -#if defined(_MSC_VER) -// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(push) -#pragma warning(disable: 4661) -#endif -template class U_I18N_API LocalPointerBase<ComplexUnitsConverter>; -template class U_I18N_API LocalPointer<ComplexUnitsConverter>; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif -#endif - -namespace number { -namespace impl { - /** * A MicroPropsGenerator which converts a measurement from one MeasureUnit to * another. In particular, the output MeasureUnit may be a mixed unit. (The * input unit may not be a mixed unit.) */ -class U_I18N_API UnitConversionHandler : public MicroPropsGenerator, public UMemory { +class UnitConversionHandler : public MicroPropsGenerator, public UMemory { public: /** * Constructor. @@ -118,8 +92,8 @@ class U_I18N_API UnitConversionHandler : public MicroPropsGenerator, public UMem const MicroPropsGenerator *fParent; }; -} // namespace impl -} // namespace number +} // namespace number::impl + U_NAMESPACE_END #endif // __NUMBER_USAGEPREFS_H__ diff --git a/deps/icu-small/source/i18n/number_utils.h b/deps/icu-small/source/i18n/number_utils.h index bc369c940f7962..39c56f4d1842fa 100644 --- a/deps/icu-small/source/i18n/number_utils.h +++ b/deps/icu-small/source/i18n/number_utils.h @@ -21,8 +21,7 @@ U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { enum CldrPatternStyle { CLDR_PATTERN_STYLE_DECIMAL, @@ -102,8 +101,7 @@ inline StandardPlural::Form getPluralSafe( } // namespace utils -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_utypes.h b/deps/icu-small/source/i18n/number_utypes.h index 0c130401894af7..9f606f17891707 100644 --- a/deps/icu-small/source/i18n/number_utypes.h +++ b/deps/icu-small/source/i18n/number_utypes.h @@ -13,9 +13,8 @@ #include "formatted_string_builder.h" #include "formattedval_impl.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { - +U_NAMESPACE_BEGIN +namespace number::impl { /** Helper function used in upluralrules.cpp */ const DecimalQuantity* validateUFormattedNumberToDecimalQuantity( @@ -50,9 +49,7 @@ class U_I18N_API UFormattedNumberData : public FormattedValueStringBuilderImpl { const char *gender = ""; }; - -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__SOURCE_NUMBER_UTYPES_H__ diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index 74689e1363a829..7c877a33ab8450 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -661,7 +661,7 @@ NumberFormat::format(int64_t number, FieldPosition& pos) const { // default so we don't introduce a new abstract method - return format((int32_t)number, appendTo, pos); + return format(static_cast<int32_t>(number), appendTo, pos); } // ------------------------------------- @@ -861,7 +861,7 @@ class ICUNumberFormatFactory : public ICUResourceBundleFactory { virtual ~ICUNumberFormatFactory(); protected: virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /* service */, UErrorCode& status) const override { - return NumberFormat::makeInstance(loc, (UNumberFormatStyle)kind, status); + return NumberFormat::makeInstance(loc, static_cast<UNumberFormatStyle>(kind), status); } }; @@ -893,7 +893,7 @@ class NFFactory : public LocaleKeyFactory { lkey->canonicalLocale(loc); int32_t kind = lkey->kind(); - UObject* result = _delegate->createFormat(loc, (UNumberFormatStyle)kind); + UObject* result = _delegate->createFormat(loc, static_cast<UNumberFormatStyle>(kind)); if (result == nullptr) { result = service->getKey(const_cast<ICUServiceKey&>(key) /* cast away const */, nullptr, this, status); } @@ -914,7 +914,7 @@ class NFFactory : public LocaleKeyFactory { if (!_ids) { int32_t count = 0; const UnicodeString * const idlist = _delegate->getSupportedIDs(count, status); - ((NFFactory*)this)->_ids = new Hashtable(status); /* cast away const */ + const_cast<NFFactory*>(this)->_ids = new Hashtable(status); /* cast away const */ if (_ids) { for (int i = 0; i < count; ++i) { _ids->put(idlist[i], (void*)this, status); @@ -954,7 +954,7 @@ class ICUNumberFormatService : public ICULocaleService { int32_t kind = lkey->kind(); Locale loc; lkey->currentLocale(loc); - return NumberFormat::makeInstance(loc, (UNumberFormatStyle)kind, status); + return NumberFormat::makeInstance(loc, static_cast<UNumberFormatStyle>(kind), status); } virtual UBool isDefault() const override { @@ -1216,7 +1216,7 @@ void NumberFormat::setContext(UDisplayContext value, UErrorCode& status) { if (U_FAILURE(status)) return; - if ( (UDisplayContextType)((uint32_t)value >> 8) == UDISPCTX_TYPE_CAPITALIZATION ) { + if (static_cast<UDisplayContextType>(static_cast<uint32_t>(value) >> 8) == UDISPCTX_TYPE_CAPITALIZATION) { fCapitalizationContext = value; } else { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -1227,10 +1227,10 @@ void NumberFormat::setContext(UDisplayContext value, UErrorCode& status) UDisplayContext NumberFormat::getContext(UDisplayContextType type, UErrorCode& status) const { if (U_FAILURE(status)) - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); if (type != UDISPCTX_TYPE_CAPITALIZATION) { status = U_ILLEGAL_ARGUMENT_ERROR; - return (UDisplayContext)0; + return static_cast<UDisplayContext>(0); } return fCapitalizationContext; } @@ -1378,7 +1378,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale, static UMutex nscacheMutex; Mutex lock(&nscacheMutex); - ns = (NumberingSystem *)uhash_iget(NumberingSystem_cache, hashKey); + ns = static_cast<NumberingSystem*>(uhash_iget(NumberingSystem_cache, hashKey)); if (ns == nullptr) { ns = NumberingSystem::createInstance(desiredLocale,status); uhash_iput(NumberingSystem_cache, hashKey, (void*)ns, &status); diff --git a/deps/icu-small/source/i18n/numparse_affixes.cpp b/deps/icu-small/source/i18n/numparse_affixes.cpp index ad3d48b4731f48..94a2513a7f7ecd 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.cpp +++ b/deps/icu-small/source/i18n/numparse_affixes.cpp @@ -29,7 +29,7 @@ namespace { * Either both arguments must be null or the pattern string inside the AffixPatternMatcher must equal * the given pattern string. */ -static bool matched(const AffixPatternMatcher* affix, const UnicodeString& patternString) { +bool matched(const AffixPatternMatcher* affix, const UnicodeString& patternString) { return (affix == nullptr && patternString.isBogus()) || (affix != nullptr && affix->getPattern() == patternString); } @@ -37,7 +37,7 @@ static bool matched(const AffixPatternMatcher* affix, const UnicodeString& patte /** * Helper method to return the length of the given AffixPatternMatcher. Returns 0 for null. */ -static int32_t length(const AffixPatternMatcher* matcher) { +int32_t length(const AffixPatternMatcher* matcher) { return matcher == nullptr ? 0 : matcher->getPattern().length(); } @@ -45,7 +45,7 @@ static int32_t length(const AffixPatternMatcher* matcher) { * Helper method to return whether (1) both lhs and rhs are null/invalid, or (2) if they are both * valid, whether they are equal according to operator==. Similar to Java Objects.equals() */ -static bool equals(const AffixPatternMatcher* lhs, const AffixPatternMatcher* rhs) { +bool equals(const AffixPatternMatcher* lhs, const AffixPatternMatcher* rhs) { if (lhs == nullptr && rhs == nullptr) { return true; } @@ -86,6 +86,9 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, case TYPE_PLUS_SIGN: addMatcher(fWarehouse.plusSign()); break; + case TYPE_APPROXIMATELY_SIGN: + addMatcher(fWarehouse.approximatelySign()); + break; case TYPE_PERCENT: addMatcher(fWarehouse.percent()); break; @@ -97,6 +100,7 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, case TYPE_CURRENCY_TRIPLE: case TYPE_CURRENCY_QUAD: case TYPE_CURRENCY_QUINT: + case TYPE_CURRENCY_OVERFLOW: // All currency symbols use the same matcher addMatcher(fWarehouse.currency(status)); break; @@ -142,6 +146,10 @@ NumberParseMatcher& AffixTokenMatcherWarehouse::plusSign() { return fPlusSign = {fSetupData->dfs, true}; } +NumberParseMatcher& AffixTokenMatcherWarehouse::approximatelySign() { + return fApproximatelySign = {fSetupData->dfs, true}; +} + NumberParseMatcher& AffixTokenMatcherWarehouse::percent() { return fPercent = {fSetupData->dfs}; } diff --git a/deps/icu-small/source/i18n/numparse_affixes.h b/deps/icu-small/source/i18n/numparse_affixes.h index 81b633c2626c38..655547c219232d 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.h +++ b/deps/icu-small/source/i18n/numparse_affixes.h @@ -16,8 +16,8 @@ #include "number_currencysymbols.h" U_NAMESPACE_BEGIN -namespace numparse { -namespace impl { + +namespace numparse::impl { // Forward-declaration of implementation classes for friending class AffixPatternMatcherBuilder; @@ -28,7 +28,7 @@ using ::icu::number::impl::TokenConsumer; using ::icu::number::impl::CurrencySymbols; -class U_I18N_API CodePointMatcher : public NumberParseMatcher, public UMemory { +class CodePointMatcher : public NumberParseMatcher, public UMemory { public: CodePointMatcher() = default; // WARNING: Leaves the object in an unusable state @@ -44,22 +44,6 @@ class U_I18N_API CodePointMatcher : public NumberParseMatcher, public UMemory { UChar32 fCp; }; -} // namespace impl -} // namespace numparse - -// Export a explicit template instantiations of MaybeStackArray, MemoryPool and CompactUnicodeString. -// When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. -// (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) -// Note: These need to be outside of the numparse::impl namespace, or Clang will generate a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<numparse::impl::CodePointMatcher*, 8>; -template class U_I18N_API MaybeStackArray<char16_t, 4>; -template class U_I18N_API MemoryPool<numparse::impl::CodePointMatcher, 8>; -template class U_I18N_API numparse::impl::CompactUnicodeString<4>; -#endif - -namespace numparse { -namespace impl { struct AffixTokenMatcherSetupData { const CurrencySymbols& currencySymbols; @@ -80,22 +64,24 @@ struct AffixTokenMatcherSetupData { * * @author sffc */ -// Exported as U_I18N_API for tests -class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS AffixTokenMatcherWarehouse : public UMemory { public: AffixTokenMatcherWarehouse() = default; // WARNING: Leaves the object in an unusable state - AffixTokenMatcherWarehouse(const AffixTokenMatcherSetupData* setupData); + U_I18N_API AffixTokenMatcherWarehouse(const AffixTokenMatcherSetupData* setupData); NumberParseMatcher& minusSign(); NumberParseMatcher& plusSign(); + NumberParseMatcher& approximatelySign(); + NumberParseMatcher& percent(); NumberParseMatcher& permille(); - NumberParseMatcher& currency(UErrorCode& status); + U_I18N_API NumberParseMatcher& currency(UErrorCode& status); IgnorablesMatcher& ignorables(); @@ -110,6 +96,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { // NOTE: These are default-constructed and should not be used until initialized. MinusSignMatcher fMinusSign; PlusSignMatcher fPlusSign; + ApproximatelySignMatcher fApproximatelySign; PercentMatcher fPercent; PermilleMatcher fPermille; CombinedCurrencyMatcher fCurrency; @@ -145,15 +132,15 @@ class AffixPatternMatcherBuilder : public TokenConsumer, public MutableMatcherCo }; -// Exported as U_I18N_API for tests -class U_I18N_API AffixPatternMatcher : public ArraySeriesMatcher { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS AffixPatternMatcher : public ArraySeriesMatcher { public: AffixPatternMatcher() = default; // WARNING: Leaves the object in an unusable state - static AffixPatternMatcher fromAffixPattern(const UnicodeString& affixPattern, - AffixTokenMatcherWarehouse& warehouse, - parse_flags_t parseFlags, bool* success, - UErrorCode& status); + U_I18N_API static AffixPatternMatcher fromAffixPattern(const UnicodeString& affixPattern, + AffixTokenMatcherWarehouse& warehouse, + parse_flags_t parseFlags, bool* success, + UErrorCode& status); UnicodeString getPattern() const; @@ -221,9 +208,8 @@ class AffixMatcherWarehouse { parse_flags_t parseFlags, UErrorCode& status); }; +} // namespace numparse::impl -} // namespace impl -} // namespace numparse U_NAMESPACE_END #endif //__NUMPARSE_AFFIXES_H__ diff --git a/deps/icu-small/source/i18n/numparse_compositions.cpp b/deps/icu-small/source/i18n/numparse_compositions.cpp index 2f7e1ab28d1d22..259e566d462dc2 100644 --- a/deps/icu-small/source/i18n/numparse_compositions.cpp +++ b/deps/icu-small/source/i18n/numparse_compositions.cpp @@ -24,7 +24,7 @@ bool SeriesMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCo int32_t initialOffset = segment.getOffset(); bool maybeMore = true; - for (auto* it = begin(); it < end();) { + for (const auto* it = begin(); it < end();) { const NumberParseMatcher* matcher = *it; int matcherOffset = segment.getOffset(); if (segment.length() != 0) { @@ -64,7 +64,7 @@ bool SeriesMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCo bool SeriesMatcher::smokeTest(const StringSegment& segment) const { // NOTE: The range-based for loop calls the virtual begin() and end() methods. // NOTE: We only want the first element. Use the for loop for boundary checking. - for (auto& matcher : *this) { + for (const auto& matcher : *this) { // SeriesMatchers are never allowed to start with a Flexible matcher. U_ASSERT(!matcher->isFlexible()); return matcher->smokeTest(segment); @@ -74,7 +74,7 @@ bool SeriesMatcher::smokeTest(const StringSegment& segment) const { void SeriesMatcher::postProcess(ParsedNumber& result) const { // NOTE: The range-based for loop calls the virtual begin() and end() methods. - for (auto* matcher : *this) { + for (const auto* matcher : *this) { matcher->postProcess(result); } } diff --git a/deps/icu-small/source/i18n/numparse_compositions.h b/deps/icu-small/source/i18n/numparse_compositions.h index f085912def1533..ff637391ecf1c8 100644 --- a/deps/icu-small/source/i18n/numparse_compositions.h +++ b/deps/icu-small/source/i18n/numparse_compositions.h @@ -11,15 +11,7 @@ U_NAMESPACE_BEGIN -// Export an explicit template instantiation of the MaybeStackArray that is used as a data member of ArraySeriesMatcher. -// When building DLLs for Windows this is required even though no direct access to the MaybeStackArray leaks out of the i18n library. -// (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<const numparse::impl::NumberParseMatcher*, 3>; -#endif - -namespace numparse { -namespace impl { +namespace numparse::impl { /** * Base class for AnyMatcher and SeriesMatcher. @@ -91,19 +83,19 @@ class U_I18N_API SeriesMatcher : public CompositionMatcher { * * The object adopts the array, but NOT the matchers contained inside the array. */ -// Exported as U_I18N_API for tests -class U_I18N_API ArraySeriesMatcher : public SeriesMatcher { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS ArraySeriesMatcher : public SeriesMatcher { public: - ArraySeriesMatcher(); // WARNING: Leaves the object in an unusable state + U_I18N_API ArraySeriesMatcher(); // WARNING: Leaves the object in an unusable state typedef MaybeStackArray<const NumberParseMatcher*, 3> MatcherArray; /** The array is std::move'd */ - ArraySeriesMatcher(MatcherArray& matchers, int32_t matchersLen); + U_I18N_API ArraySeriesMatcher(MatcherArray& matchers, int32_t matchersLen); UnicodeString toString() const override; - int32_t length() const override; + U_I18N_API int32_t length() const override; protected: const NumberParseMatcher* const* begin() const override; @@ -115,9 +107,8 @@ class U_I18N_API ArraySeriesMatcher : public SeriesMatcher { int32_t fMatchersLen; }; +} // namespace numparse::impl -} // namespace impl -} // namespace numparse U_NAMESPACE_END #endif //__SOURCE_NUMPARSE_COMPOSITIONS__ diff --git a/deps/icu-small/source/i18n/numparse_currency.h b/deps/icu-small/source/i18n/numparse_currency.h index 4e99334a31bc78..4e1466a305357f 100644 --- a/deps/icu-small/source/i18n/numparse_currency.h +++ b/deps/icu-small/source/i18n/numparse_currency.h @@ -13,8 +13,8 @@ #include "number_currencysymbols.h" #include "unicode/uniset.h" -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { +U_NAMESPACE_BEGIN +namespace numparse::impl { using ::icu::number::impl::CurrencySymbols; @@ -29,8 +29,8 @@ using ::icu::number::impl::CurrencySymbols; * * @author sffc */ -// Exported as U_I18N_API for tests -class U_I18N_API CombinedCurrencyMatcher : public NumberParseMatcher, public UMemory { +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS CombinedCurrencyMatcher : public NumberParseMatcher, public UMemory { public: CombinedCurrencyMatcher() = default; // WARNING: Leaves the object in an unusable state @@ -65,9 +65,7 @@ class U_I18N_API CombinedCurrencyMatcher : public NumberParseMatcher, public UMe bool matchCurrency(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; }; - -} // namespace impl -} // namespace numparse +} // namespace numparse::impl U_NAMESPACE_END #endif //__NUMPARSE_CURRENCY_H__ diff --git a/deps/icu-small/source/i18n/numparse_decimal.cpp b/deps/icu-small/source/i18n/numparse_decimal.cpp index 8b99fd7ad4fa10..0497bb13676194 100644 --- a/deps/icu-small/source/i18n/numparse_decimal.cpp +++ b/deps/icu-small/source/i18n/numparse_decimal.cpp @@ -33,12 +33,32 @@ DecimalMatcher::DecimalMatcher(const DecimalFormatSymbols& symbols, const Groupe decimalSeparator = symbols.getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); } bool strictSeparators = 0 != (parseFlags & PARSE_FLAG_STRICT_SEPARATORS); - unisets::Key groupingKey = strictSeparators ? unisets::STRICT_ALL_SEPARATORS - : unisets::ALL_SEPARATORS; - // Attempt to find separators in the static cache + // Parsing is very lenient even in strict mode, almost any dot or comma is a + // grouping separator. Parsing strings like "1.234" in French was treating '.' + // like an ignorable grouping separator, and we want it to be excluded. + // We keep the public behavior when strictParse is false, but when it is true + // we restrict grouping separators to the smaller set of equivalents. + unisets::Key groupingKey = unisets::chooseFrom(groupingSeparator, + strictSeparators ? unisets::STRICT_COMMA : unisets::ALL_SEPARATORS, + strictSeparators ? unisets::STRICT_PERIOD : unisets::ALL_SEPARATORS); + if (groupingKey < 0) { + groupingKey = unisets::chooseFrom( + groupingSeparator, unisets::OTHER_GROUPING_SEPARATORS); + } + if (groupingKey >= 0) { + // Attempt to find separators in the static cache + groupingUniSet = unisets::get(groupingKey); + } else if (!groupingSeparator.isEmpty()) { + auto* set = new UnicodeSet(); + set->add(groupingSeparator.char32At(0)); + set->freeze(); + groupingUniSet = set; + fLocalGroupingUniSet.adoptInstead(set); + } else { + groupingUniSet = unisets::get(unisets::EMPTY); + } - groupingUniSet = unisets::get(groupingKey); unisets::Key decimalKey = unisets::chooseFrom( decimalSeparator, strictSeparators ? unisets::STRICT_COMMA : unisets::COMMA, @@ -74,7 +94,7 @@ DecimalMatcher::DecimalMatcher(const DecimalFormatSymbols& symbols, const Groupe UChar32 cpZero = symbols.getCodePointZero(); if (cpZero == -1 || !u_isdigit(cpZero) || u_digit(cpZero, 10) != 0) { // Uncommon case: okay to allocate. - auto digitStrings = new UnicodeString[10]; + auto* digitStrings = new UnicodeString[10]; fLocalDigitStrings.adoptInstead(digitStrings); for (int32_t i = 0; i <= 9; i++) { digitStrings[i] = symbols.getConstDigitSymbol(i); diff --git a/deps/icu-small/source/i18n/numparse_decimal.h b/deps/icu-small/source/i18n/numparse_decimal.h index 07c9afeccc9d64..7c1b13deb16edd 100644 --- a/deps/icu-small/source/i18n/numparse_decimal.h +++ b/deps/icu-small/source/i18n/numparse_decimal.h @@ -10,8 +10,8 @@ #include "unicode/uniset.h" #include "numparse_types.h" -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { +U_NAMESPACE_BEGIN +namespace numparse::impl { using ::icu::number::impl::Grouper; @@ -61,15 +61,14 @@ class DecimalMatcher : public NumberParseMatcher, public UMemory { // Make this class the owner of a few objects that could be allocated. // The first three LocalPointers are used for assigning ownership only. LocalPointer<const UnicodeSet> fLocalDecimalUniSet; + LocalPointer<const UnicodeSet> fLocalGroupingUniSet; LocalPointer<const UnicodeSet> fLocalSeparatorSet; LocalArray<const UnicodeString> fLocalDigitStrings; bool validateGroup(int32_t sepType, int32_t count, bool isPrimary) const; }; - -} // namespace impl -} // namespace numparse +} // namespace numparse::impl U_NAMESPACE_END #endif //__NUMPARSE_DECIMAL_H__ diff --git a/deps/icu-small/source/i18n/numparse_impl.cpp b/deps/icu-small/source/i18n/numparse_impl.cpp index 91c60747f2129f..ee7a2cddb1cd93 100644 --- a/deps/icu-small/source/i18n/numparse_impl.cpp +++ b/deps/icu-small/source/i18n/numparse_impl.cpp @@ -65,6 +65,7 @@ NumberParserImpl::createSimpleParser(const Locale& locale, const UnicodeString& parser->addMatcher(parser->fLocalMatchers.decimal = {symbols, grouper, parseFlags}); parser->addMatcher(parser->fLocalMatchers.minusSign = {symbols, false}); parser->addMatcher(parser->fLocalMatchers.plusSign = {symbols, false}); + parser->addMatcher(parser->fLocalMatchers.approximatelySign = {symbols, false}); parser->addMatcher(parser->fLocalMatchers.percent = {symbols}); parser->addMatcher(parser->fLocalMatchers.permille = {symbols}); parser->addMatcher(parser->fLocalMatchers.nan = {symbols}); @@ -164,6 +165,7 @@ NumberParserImpl::createParserFromProperties(const number::impl::DecimalFormatPr if (!isStrict) { parser->addMatcher(parser->fLocalMatchers.plusSign = {symbols, false}); parser->addMatcher(parser->fLocalMatchers.minusSign = {symbols, false}); + parser->addMatcher(parser->fLocalMatchers.approximatelySign = {symbols, false}); } parser->addMatcher(parser->fLocalMatchers.nan = {symbols}); parser->addMatcher(parser->fLocalMatchers.infinity = {symbols}); diff --git a/deps/icu-small/source/i18n/numparse_impl.h b/deps/icu-small/source/i18n/numparse_impl.h index 380d9aa4c64289..8a8472d6d977ff 100644 --- a/deps/icu-small/source/i18n/numparse_impl.h +++ b/deps/icu-small/source/i18n/numparse_impl.h @@ -22,23 +22,17 @@ U_NAMESPACE_BEGIN -// Export an explicit template instantiation of the MaybeStackArray that is used as a data member of NumberParserImpl. -// When building DLLs for Windows this is required even though no direct access to the MaybeStackArray leaks out of the i18n library. -// (See numparse_compositions.h, numparse_affixes.h, datefmt.h, and others for similar examples.) -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<const numparse::impl::NumberParseMatcher*, 10>; -#endif - -namespace numparse { -namespace impl { - -// Exported as U_I18N_API for tests -class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMemory { +namespace numparse::impl { + +// Exported as U_I18N_API_CLASS for tests +class U_I18N_API_CLASS NumberParserImpl : public MutableMatcherCollection, public UMemory { public: virtual ~NumberParserImpl(); - static NumberParserImpl* createSimpleParser(const Locale& locale, const UnicodeString& patternString, - parse_flags_t parseFlags, UErrorCode& status); + U_I18N_API static NumberParserImpl *createSimpleParser(const Locale& locale, + const UnicodeString& patternString, + parse_flags_t parseFlags, + UErrorCode& status); static NumberParserImpl* createParserFromProperties( const number::impl::DecimalFormatProperties& properties, const DecimalFormatSymbols& symbols, @@ -55,12 +49,13 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem parse_flags_t getParseFlags() const; - void parse(const UnicodeString& input, bool greedy, ParsedNumber& result, UErrorCode& status) const; + U_I18N_API void parse(const UnicodeString& input, bool greedy, ParsedNumber& result, + UErrorCode& status) const; void parse(const UnicodeString& input, int32_t start, bool greedy, ParsedNumber& result, UErrorCode& status) const; - UnicodeString toString() const; + U_I18N_API UnicodeString toString() const; private: parse_flags_t fParseFlags; @@ -80,6 +75,7 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem PercentMatcher percent; PermilleMatcher permille; PlusSignMatcher plusSign; + ApproximatelySignMatcher approximatelySign; DecimalMatcher decimal; ScientificMatcher scientific; CombinedCurrencyMatcher currency; @@ -102,9 +98,8 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem StringSegment& segment, ParsedNumber& result, int32_t recursionLevels, UErrorCode& status) const; }; +} // namespace numparse::impl -} // namespace impl -} // namespace numparse U_NAMESPACE_END #endif //__NUMPARSE_IMPL_H__ diff --git a/deps/icu-small/source/i18n/numparse_scientific.h b/deps/icu-small/source/i18n/numparse_scientific.h index 5617c0c6a60822..ed214b71711a80 100644 --- a/deps/icu-small/source/i18n/numparse_scientific.h +++ b/deps/icu-small/source/i18n/numparse_scientific.h @@ -14,9 +14,8 @@ using icu::number::impl::Grouper; -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { - +U_NAMESPACE_BEGIN +namespace numparse::impl { class ScientificMatcher : public NumberParseMatcher, public UMemory { public: @@ -38,9 +37,7 @@ class ScientificMatcher : public NumberParseMatcher, public UMemory { UnicodeString fCustomPlusSign; }; - -} // namespace impl -} // namespace numparse +} // namespace numparse::impl U_NAMESPACE_END #endif //__NUMPARSE_SCIENTIFIC_H__ diff --git a/deps/icu-small/source/i18n/numparse_symbols.cpp b/deps/icu-small/source/i18n/numparse_symbols.cpp index 608f4f5c8b0ee7..6c25640428fcff 100644 --- a/deps/icu-small/source/i18n/numparse_symbols.cpp +++ b/deps/icu-small/source/i18n/numparse_symbols.cpp @@ -195,4 +195,21 @@ void PlusSignMatcher::accept(StringSegment& segment, ParsedNumber& result) const } +ApproximatelySignMatcher::ApproximatelySignMatcher( + const DecimalFormatSymbols& dfs, bool allowTrailing) : + SymbolMatcher( + dfs.getConstSymbol(DecimalFormatSymbols::kApproximatelySignSymbol), + unisets::APPROXIMATELY_SIGN), + fAllowTrailing(allowTrailing) { +} + +bool ApproximatelySignMatcher::isDisabled(const ParsedNumber& result) const { + return !fAllowTrailing && result.seenNumber(); +} + +void ApproximatelySignMatcher::accept(StringSegment& segment, ParsedNumber& result) const { + result.setCharsConsumed(segment); +} + + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/numparse_symbols.h b/deps/icu-small/source/i18n/numparse_symbols.h index beb133f7d07a53..f7810612bb5d51 100644 --- a/deps/icu-small/source/i18n/numparse_symbols.h +++ b/deps/icu-small/source/i18n/numparse_symbols.h @@ -11,9 +11,8 @@ #include "unicode/uniset.h" #include "static_unicode_sets.h" -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { - +U_NAMESPACE_BEGIN +namespace numparse::impl { /** * A base class for many matchers that performs a simple match against a UnicodeString and/or UnicodeSet. @@ -165,8 +164,23 @@ class U_I18N_API PlusSignMatcher : public SymbolMatcher { }; -} // namespace impl -} // namespace numparse +// Exported as U_I18N_API for tests +class U_I18N_API ApproximatelySignMatcher : public SymbolMatcher { + public: + ApproximatelySignMatcher() = default; // WARNING: Leaves the object in an unusable state + + ApproximatelySignMatcher(const DecimalFormatSymbols& dfs, bool allowTrailing); + + protected: + bool isDisabled(const ParsedNumber& result) const override; + + void accept(StringSegment& segment, ParsedNumber& result) const override; + + private: + bool fAllowTrailing; +}; + +} // namespace numparse::impl U_NAMESPACE_END #endif //__NUMPARSE_SYMBOLS_H__ diff --git a/deps/icu-small/source/i18n/numparse_types.h b/deps/icu-small/source/i18n/numparse_types.h index 8e881793fd3e8c..d5a53379be1ba4 100644 --- a/deps/icu-small/source/i18n/numparse_types.h +++ b/deps/icu-small/source/i18n/numparse_types.h @@ -12,8 +12,7 @@ #include "string_segment.h" U_NAMESPACE_BEGIN -namespace numparse { -namespace impl { +namespace numparse::impl { // Forward-declarations class ParsedNumber; @@ -263,9 +262,7 @@ class U_I18N_API MutableMatcherCollection { virtual void addMatcher(NumberParseMatcher& matcher) = 0; }; - -} // namespace impl -} // namespace numparse +} // namespace numparse::impl U_NAMESPACE_END #endif //__NUMPARSE_TYPES_H__ diff --git a/deps/icu-small/source/i18n/numparse_utils.h b/deps/icu-small/source/i18n/numparse_utils.h index 8fda4f4369b071..a842c6fae0c36b 100644 --- a/deps/icu-small/source/i18n/numparse_utils.h +++ b/deps/icu-small/source/i18n/numparse_utils.h @@ -10,10 +10,8 @@ #include "numparse_types.h" #include "unicode/uniset.h" -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { -namespace utils { - +U_NAMESPACE_BEGIN +namespace numparse::impl::utils { inline static void putLeadCodePoints(const UnicodeSet* input, UnicodeSet* output) { for (int32_t i = 0; i < input->getRangeCount(); i++) { @@ -33,10 +31,7 @@ inline static void copyCurrencyCode(char16_t* dest, const char16_t* src) { dest[3] = 0; } - -} // namespace utils -} // namespace impl -} // namespace numparse +} // namespace numparse::impl::utils U_NAMESPACE_END #endif //__NUMPARSE_UTILS_H__ diff --git a/deps/icu-small/source/i18n/numparse_validators.cpp b/deps/icu-small/source/i18n/numparse_validators.cpp index 12d3465c4ef3a4..98637eeca02c7e 100644 --- a/deps/icu-small/source/i18n/numparse_validators.cpp +++ b/deps/icu-small/source/i18n/numparse_validators.cpp @@ -46,8 +46,9 @@ RequireDecimalSeparatorValidator::RequireDecimalSeparatorValidator(bool patternH } void RequireDecimalSeparatorValidator::postProcess(ParsedNumber& result) const { + bool parseIsInfNaN = 0 != (result.flags & FLAG_INFINITY) || 0 != (result.flags & FLAG_NAN); bool parseHasDecimalSeparator = 0 != (result.flags & FLAG_HAS_DECIMAL_SEPARATOR); - if (parseHasDecimalSeparator != fPatternHasDecimalSeparator) { + if (!parseIsInfNaN && parseHasDecimalSeparator != fPatternHasDecimalSeparator) { result.flags |= FLAG_FAIL; } } diff --git a/deps/icu-small/source/i18n/numparse_validators.h b/deps/icu-small/source/i18n/numparse_validators.h index 9bb4b482b55f16..3425bb07a79730 100644 --- a/deps/icu-small/source/i18n/numparse_validators.h +++ b/deps/icu-small/source/i18n/numparse_validators.h @@ -10,9 +10,8 @@ #include "numparse_types.h" #include "static_unicode_sets.h" -U_NAMESPACE_BEGIN namespace numparse { -namespace impl { - +U_NAMESPACE_BEGIN +namespace numparse::impl { class ValidationMatcher : public NumberParseMatcher { public: @@ -86,9 +85,7 @@ class MultiplierParseHandler : public ValidationMatcher, public UMemory { ::icu::number::Scale fMultiplier; }; - -} // namespace impl -} // namespace numparse +} // namespace numparse::impl U_NAMESPACE_END #endif //__SOURCE_NUMPARSE_VALIDATORS_H__ diff --git a/deps/icu-small/source/i18n/numrange_capi.cpp b/deps/icu-small/source/i18n/numrange_capi.cpp index 9222969eb49f47..ef1a29e3950a2b 100644 --- a/deps/icu-small/source/i18n/numrange_capi.cpp +++ b/deps/icu-small/source/i18n/numrange_capi.cpp @@ -24,8 +24,7 @@ using namespace icu::number::impl; U_NAMESPACE_BEGIN -namespace number { -namespace impl { +namespace number::impl { /** * Implementation class for UNumberRangeFormatter. Wraps a LocalizedRangeNumberFormatter. @@ -59,8 +58,7 @@ UFormattedNumberRangeImpl::~UFormattedNumberRangeImpl() { fImpl.fData = nullptr; } -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END @@ -73,7 +71,7 @@ UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL( const UFormattedNumberRangeData* number::impl::validateUFormattedNumberRange( const UFormattedNumberRange* uresult, UErrorCode& status) { - auto* result = UFormattedNumberRangeApiHelper::validate(uresult, status); + const auto* result = UFormattedNumberRangeApiHelper::validate(uresult, status); if (U_FAILURE(status)) { return nullptr; } @@ -147,7 +145,7 @@ U_CAPI UNumberRangeIdentityResult U_EXPORT2 unumrf_resultGetIdentityResult( const UFormattedNumberRange* uresult, UErrorCode* ec) { - auto* result = UFormattedNumberRangeApiHelper::validate(uresult, *ec); + const auto* result = UFormattedNumberRangeApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return UNUM_IDENTITY_RESULT_COUNT; } diff --git a/deps/icu-small/source/i18n/numrange_fluent.cpp b/deps/icu-small/source/i18n/numrange_fluent.cpp index 0944f3024ff56d..a02ae5b9c2c1f9 100644 --- a/deps/icu-small/source/i18n/numrange_fluent.cpp +++ b/deps/icu-small/source/i18n/numrange_fluent.cpp @@ -212,6 +212,14 @@ UnlocalizedNumberRangeFormatter::UnlocalizedNumberRangeFormatter(NFS<UNF>&& src) // No additional fields to assign } +UnlocalizedNumberRangeFormatter::UnlocalizedNumberRangeFormatter(const impl::RangeMacroProps ¯os) { + fMacros = macros; +} + +UnlocalizedNumberRangeFormatter::UnlocalizedNumberRangeFormatter(impl::RangeMacroProps &¯os) { + fMacros = macros; +} + UnlocalizedNumberRangeFormatter& UnlocalizedNumberRangeFormatter::operator=(const UNF& other) { NFS<UNF>::operator=(static_cast<const NFS<UNF>&>(other)); // No additional fields to assign @@ -286,15 +294,27 @@ LocalizedNumberRangeFormatter UnlocalizedNumberRangeFormatter::locale(const Loca } +UnlocalizedNumberRangeFormatter LocalizedNumberRangeFormatter::withoutLocale() const & { + RangeMacroProps macros(fMacros); + macros.locale = Locale(); + return UnlocalizedNumberRangeFormatter(macros); +} + +UnlocalizedNumberRangeFormatter LocalizedNumberRangeFormatter::withoutLocale() && { + RangeMacroProps macros(std::move(fMacros)); + macros.locale = Locale(); + return UnlocalizedNumberRangeFormatter(std::move(macros)); +} + + FormattedNumberRange LocalizedNumberRangeFormatter::formatFormattableRange( const Formattable& first, const Formattable& second, UErrorCode& status) const { if (U_FAILURE(status)) { return FormattedNumberRange(U_ILLEGAL_ARGUMENT_ERROR); } - auto results = new UFormattedNumberRangeData(); - if (results == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + LocalPointer<UFormattedNumberRangeData> results(new UFormattedNumberRangeData(), status); + if (U_FAILURE(status)) { return FormattedNumberRange(status); } @@ -312,16 +332,15 @@ FormattedNumberRange LocalizedNumberRangeFormatter::formatFormattableRange( // Do not save the results object if we encountered a failure. if (U_SUCCESS(status)) { - return FormattedNumberRange(results); + return FormattedNumberRange(results.orphan()); } else { - delete results; return FormattedNumberRange(status); } } void LocalizedNumberRangeFormatter::formatImpl( UFormattedNumberRangeData& results, bool equalBeforeRounding, UErrorCode& status) const { - auto* impl = getFormatter(status); + const auto* impl = getFormatter(status); if (U_FAILURE(status)) { return; } @@ -352,13 +371,8 @@ LocalizedNumberRangeFormatter::getFormatter(UErrorCode& status) const { } // Try computing the formatter on our own - auto* temp = new NumberRangeFormatterImpl(fMacros, status); + LocalPointer<NumberRangeFormatterImpl> temp(new NumberRangeFormatterImpl(fMacros, status), status); if (U_FAILURE(status)) { - delete temp; - return nullptr; - } - if (temp == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } @@ -366,13 +380,12 @@ LocalizedNumberRangeFormatter::getFormatter(UErrorCode& status) const { // it is set to what is actually stored in the atomic // if another thread beat us to computing the formatter object. auto* nonConstThis = const_cast<LocalizedNumberRangeFormatter*>(this); - if (!nonConstThis->fAtomicFormatter.compare_exchange_strong(ptr, temp)) { + if (!nonConstThis->fAtomicFormatter.compare_exchange_strong(ptr, temp.getAlias())) { // Another thread beat us to computing the formatter - delete temp; return ptr; } else { // Our copy of the formatter got stored in the atomic - return temp; + return temp.orphan(); } } diff --git a/deps/icu-small/source/i18n/numrange_impl.cpp b/deps/icu-small/source/i18n/numrange_impl.cpp index 002a8b2a2101f0..0b1590158a4c6e 100644 --- a/deps/icu-small/source/i18n/numrange_impl.cpp +++ b/deps/icu-small/source/i18n/numrange_impl.cpp @@ -160,6 +160,8 @@ void NumberRangeFormatterImpl::format(UFormattedNumberRangeData& data, bool equa return; } + DecimalQuantity quantityBackup(data.quantity1); + MicroProps micros1; MicroProps micros2; formatterImpl1.preProcess(data.quantity1, micros1, status); @@ -216,7 +218,7 @@ void NumberRangeFormatterImpl::format(UFormattedNumberRangeData& data, bool equa UNUM_IDENTITY_RESULT_EQUAL_BEFORE_ROUNDING): case identity2d(UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE, UNUM_IDENTITY_RESULT_EQUAL_AFTER_ROUNDING): - formatApproximately(data, micros1, micros2, status); + formatApproximately(data, quantityBackup, micros1, micros2, status); break; case identity2d(UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE, @@ -248,15 +250,15 @@ void NumberRangeFormatterImpl::formatSingleValue(UFormattedNumberRangeData& data void NumberRangeFormatterImpl::formatApproximately (UFormattedNumberRangeData& data, + DecimalQuantity quantity, MicroProps& micros1, MicroProps& micros2, UErrorCode& status) const { if (U_FAILURE(status)) { return; } if (fSameFormatters) { // Re-format using the approximately formatter: MicroProps microsAppx; - data.quantity1.resetExponent(); - fApproximatelyFormatter.preProcess(data.quantity1, microsAppx, status); - int32_t length = NumberFormatterImpl::writeNumber(microsAppx.simple, data.quantity1, data.getStringRef(), 0, status); + fApproximatelyFormatter.preProcess(quantity, microsAppx, status); + int32_t length = NumberFormatterImpl::writeNumber(microsAppx.simple, quantity, data.getStringRef(), 0, status); length += microsAppx.modInner->apply(data.getStringRef(), 0, length, status); length += microsAppx.modMiddle->apply(data.getStringRef(), 0, length, status); microsAppx.modOuter->apply(data.getStringRef(), 0, length, status); diff --git a/deps/icu-small/source/i18n/numrange_impl.h b/deps/icu-small/source/i18n/numrange_impl.h index ac1d8a58972743..7d024816c43681 100644 --- a/deps/icu-small/source/i18n/numrange_impl.h +++ b/deps/icu-small/source/i18n/numrange_impl.h @@ -17,9 +17,8 @@ #include "formattedval_impl.h" #include "pluralranges.h" -U_NAMESPACE_BEGIN namespace number { -namespace impl { - +U_NAMESPACE_BEGIN +namespace number::impl { /** * Class similar to UFormattedNumberData. @@ -65,6 +64,7 @@ class NumberRangeFormatterImpl : public UMemory { UErrorCode& status) const; void formatApproximately(UFormattedNumberRangeData& data, + DecimalQuantity quantity, MicroProps& micros1, MicroProps& micros2, UErrorCode& status) const; @@ -80,9 +80,7 @@ class NumberRangeFormatterImpl : public UMemory { const UFormattedNumberRangeData* validateUFormattedNumberRange( const UFormattedNumberRange* uresult, UErrorCode& status); - -} // namespace impl -} // namespace number +} // namespace number::impl U_NAMESPACE_END #endif //__SOURCE_NUMRANGE_TYPES_H__ diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 0d5c43e4b27444..3123a5c8da3937 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -258,7 +258,7 @@ void NumberingSystem::setDesc(const UnicodeString &d) { } void NumberingSystem::setName(const char *n) { if ( n == nullptr ) { - name[0] = (char) 0; + name[0] = static_cast<char>(0); } else { uprv_strncpy(name,n,kInternalNumSysNameCapacity); name[kInternalNumSysNameCapacity] = '\0'; // Make sure it is null terminated. @@ -320,7 +320,6 @@ U_CFUNC void initNumsysNames(UErrorCode &status) { if (U_SUCCESS(status)) { gNumsysNames = numsysNames.orphan(); } - return; } } // end anonymous namespace @@ -338,7 +337,7 @@ NumsysNameEnumeration::NumsysNameEnumeration(UErrorCode& status) : pos(0) { const UnicodeString* NumsysNameEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && (gNumsysNames != nullptr) && (pos < gNumsysNames->size())) { - return (const UnicodeString*)gNumsysNames->elementAt(pos++); + return static_cast<const UnicodeString*>(gNumsysNames->elementAt(pos++)); } return nullptr; } diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index 260e345d7953b1..7826d47a7d06f5 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -181,7 +181,7 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, if (U_SUCCESS(ec) && (len < 2 || len > 0x7FFE || (len & 1) != 0)) { ec = U_INVALID_FORMAT_ERROR; } - typeCount = (int16_t) len >> 1; + typeCount = static_cast<int16_t>(len) >> 1; // Type map data must be of the same size as the transition count typeMapData = nullptr; @@ -212,12 +212,12 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, finalZone = new SimpleTimeZone( ruleRaw * U_MILLIS_PER_SECOND, emptyStr, - (int8_t)ruleData[0], (int8_t)ruleData[1], (int8_t)ruleData[2], + static_cast<int8_t>(ruleData[0]), static_cast<int8_t>(ruleData[1]), static_cast<int8_t>(ruleData[2]), ruleData[3] * U_MILLIS_PER_SECOND, - (SimpleTimeZone::TimeMode) ruleData[4], - (int8_t)ruleData[5], (int8_t)ruleData[6], (int8_t)ruleData[7], + static_cast<SimpleTimeZone::TimeMode>(ruleData[4]), + static_cast<int8_t>(ruleData[5]), static_cast<int8_t>(ruleData[6]), static_cast<int8_t>(ruleData[7]), ruleData[8] * U_MILLIS_PER_SECOND, - (SimpleTimeZone::TimeMode) ruleData[9], + static_cast<SimpleTimeZone::TimeMode>(ruleData[9]), ruleData[10] * U_MILLIS_PER_SECOND, ec); if (finalZone == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; @@ -266,7 +266,7 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, * Copy constructor */ OlsonTimeZone::OlsonTimeZone(const OlsonTimeZone& other) : - BasicTimeZone(other), finalZone(0) { + BasicTimeZone(other), finalZone(nullptr) { *this = other; } @@ -290,7 +290,7 @@ OlsonTimeZone& OlsonTimeZone::operator=(const OlsonTimeZone& other) { typeMapData = other.typeMapData; delete finalZone; - finalZone = (other.finalZone != 0) ? other.finalZone->clone() : 0; + finalZone = other.finalZone != nullptr ? other.finalZone->clone() : nullptr; finalStartYear = other.finalStartYear; finalStartMillis = other.finalStartMillis; @@ -379,7 +379,7 @@ int32_t OlsonTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, } // Compute local epoch millis from input fields - UDate date = (UDate)(Grego::fieldsToDay(year, month, dom) * U_MILLIS_PER_DAY + millis); + UDate date = static_cast<UDate>(Grego::fieldsToDay(year, month, dom) * U_MILLIS_PER_DAY + millis); int32_t rawoff, dstoff; getHistoricalOffset(date, true, kDaylight, kStandard, rawoff, dstoff); return rawoff + dstoff; @@ -436,11 +436,11 @@ int32_t OlsonTimeZone::getRawOffset() const { #if defined U_DEBUG_TZ void printTime(double ms) { - int32_t year, month, dom, dow; - double millis=0; - double days = ClockMath::floorDivide(((double)ms), (double)U_MILLIS_PER_DAY, millis); - - Grego::dayToFields(days, year, month, dom, dow); + int32_t year; + int8_t month, dom, dow; + int32_t millis=0; + UErrorCode status = U_ZERO_ERROR; + Grego::timeToFields(ms, year, month, dom, dow, millis, status); U_DEBUG_TZ_MSG((" getHistoricalOffset: time %.1f (%04d.%02d.%02d+%.1fh)\n", ms, year, month+1, dom, (millis/kOneHour))); } @@ -451,18 +451,18 @@ OlsonTimeZone::transitionTimeInSeconds(int16_t transIdx) const { U_ASSERT(transIdx >= 0 && transIdx < transitionCount()); if (transIdx < transitionCountPre32) { - return (((int64_t)((uint32_t)transitionTimesPre32[transIdx << 1])) << 32) - | ((int64_t)((uint32_t)transitionTimesPre32[(transIdx << 1) + 1])); + return (static_cast<int64_t>(static_cast<uint32_t>(transitionTimesPre32[transIdx << 1])) << 32) + | static_cast<int64_t>(static_cast<uint32_t>(transitionTimesPre32[(transIdx << 1) + 1])); } transIdx -= transitionCountPre32; if (transIdx < transitionCount32) { - return (int64_t)transitionTimes32[transIdx]; + return static_cast<int64_t>(transitionTimes32[transIdx]); } transIdx -= transitionCount32; - return (((int64_t)((uint32_t)transitionTimesPost32[transIdx << 1])) << 32) - | ((int64_t)((uint32_t)transitionTimesPost32[(transIdx << 1) + 1])); + return (static_cast<int64_t>(static_cast<uint32_t>(transitionTimesPost32[transIdx << 1])) << 32) + | static_cast<int64_t>(static_cast<uint32_t>(transitionTimesPost32[(transIdx << 1) + 1])); } // Maximum absolute offset in seconds (86400 seconds = 1 day) @@ -568,8 +568,10 @@ UBool OlsonTimeZone::useDaylightTime() const { return finalZone->useDaylightTime(); } - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(current, year, month, dom, dow, doy, mid); + UErrorCode status = U_ZERO_ERROR; + int32_t year = Grego::timeToYear(current, status); + U_ASSERT(U_SUCCESS(status)); + if (U_FAILURE(status)) return false; // If error, just return false. // Find start of this year, and start of next year double start = Grego::fieldsToDay(year, 0, 1) * SECONDS_PER_DAY; @@ -578,7 +580,7 @@ UBool OlsonTimeZone::useDaylightTime() const { // Return true if DST is observed at any time during the current // year. for (int16_t i = 0; i < transitionCount(); ++i) { - double transition = (double)transitionTimeInSeconds(i); + double transition = static_cast<double>(transitionTimeInSeconds(i)); if (transition >= limit) { break; } @@ -664,18 +666,10 @@ OlsonTimeZone::clearTransitionRules() { void OlsonTimeZone::deleteTransitionRules() { - if (initialRule != nullptr) { - delete initialRule; - } - if (firstTZTransition != nullptr) { - delete firstTZTransition; - } - if (firstFinalTZTransition != nullptr) { - delete firstFinalTZTransition; - } - if (finalZoneWithStartYear != nullptr) { - delete finalZoneWithStartYear; - } + delete initialRule; + delete firstTZTransition; + delete firstFinalTZTransition; + delete finalZoneWithStartYear; if (historicRules != nullptr) { for (int i = 0; i < historicRuleCount; i++) { if (historicRules[i] != nullptr) { @@ -744,7 +738,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) { // Actually no transitions... } else { // Build historic rule array - UDate* times = (UDate*)uprv_malloc(sizeof(UDate)*transCount); /* large enough to store all transition times */ + UDate* times = static_cast<UDate*>(uprv_malloc(sizeof(UDate) * transCount)); /* large enough to store all transition times */ if (times == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; deleteTransitionRules(); @@ -754,8 +748,8 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) { // Gather all start times for each pair of offsets int32_t nTimes = 0; for (transitionIdx = firstTZTransitionIdx; transitionIdx < transCount; transitionIdx++) { - if (typeIdx == (int16_t)typeMapData[transitionIdx]) { - UDate tt = (UDate)transitionTime(transitionIdx); + if (typeIdx == static_cast<int16_t>(typeMapData[transitionIdx])) { + UDate tt = static_cast<UDate>(transitionTime(transitionIdx)); if (finalZone == nullptr || tt <= finalStartMillis) { // Exclude transitions after finalMillis times[nTimes++] = tt; @@ -768,7 +762,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) { dst = typeOffsets[(typeIdx << 1) + 1] * U_MILLIS_PER_SECOND; if (historicRules == nullptr) { historicRuleCount = typeCount; - historicRules = (TimeArrayTimeZoneRule**)uprv_malloc(sizeof(TimeArrayTimeZoneRule*)*historicRuleCount); + historicRules = static_cast<TimeArrayTimeZoneRule**>(uprv_malloc(sizeof(TimeArrayTimeZoneRule*) * historicRuleCount)); if (historicRules == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; deleteTransitionRules(); @@ -793,8 +787,8 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) { uprv_free(times); // Create initial transition - typeIdx = (int16_t)typeMapData[firstTZTransitionIdx]; - firstTZTransition = new TimeZoneTransition((UDate)transitionTime(firstTZTransitionIdx), + typeIdx = static_cast<int16_t>(typeMapData[firstTZTransitionIdx]); + firstTZTransition = new TimeZoneTransition(static_cast<UDate>(transitionTime(firstTZTransitionIdx)), *initialRule, *historicRules[typeIdx]); // Check to make sure firstTZTransition was created. if (firstTZTransition == nullptr) { @@ -806,7 +800,7 @@ OlsonTimeZone::initTransitionRules(UErrorCode& status) { } if (finalZone != nullptr) { // Get the first occurrence of final rule starts - UDate startTime = (UDate)finalStartMillis; + UDate startTime = static_cast<UDate>(finalStartMillis); TimeZoneRule *firstFinalRule = nullptr; if (finalZone->useDaylightTime()) { @@ -903,7 +897,7 @@ OlsonTimeZone::getNextTransition(UDate base, UBool inclusive, TimeZoneTransition int16_t transCount = transitionCount(); int16_t ttidx = transCount - 1; for (; ttidx >= firstTZTransitionIdx; ttidx--) { - UDate t = (UDate)transitionTime(ttidx); + UDate t = static_cast<UDate>(transitionTime(ttidx)); if (base > t || (!inclusive && base == t)) { break; } @@ -922,7 +916,7 @@ OlsonTimeZone::getNextTransition(UDate base, UBool inclusive, TimeZoneTransition // Create a TimeZoneTransition TimeZoneRule *to = historicRules[typeMapData[ttidx + 1]]; TimeZoneRule *from = historicRules[typeMapData[ttidx]]; - UDate startTime = (UDate)transitionTime(ttidx+1); + UDate startTime = static_cast<UDate>(transitionTime(ttidx + 1)); // The transitions loaded from zoneinfo.res may contain non-transition data UnicodeString fromName, toName; @@ -968,7 +962,7 @@ OlsonTimeZone::getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransi // Find a historical transition int16_t ttidx = transitionCount() - 1; for (; ttidx >= firstTZTransitionIdx; ttidx--) { - UDate t = (UDate)transitionTime(ttidx); + UDate t = static_cast<UDate>(transitionTime(ttidx)); if (base > t || (inclusive && base == t)) { break; } @@ -983,7 +977,7 @@ OlsonTimeZone::getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransi // Create a TimeZoneTransition TimeZoneRule *to = historicRules[typeMapData[ttidx]]; TimeZoneRule *from = historicRules[typeMapData[ttidx-1]]; - UDate startTime = (UDate)transitionTime(ttidx); + UDate startTime = static_cast<UDate>(transitionTime(ttidx)); // The transitions loaded from zoneinfo.res may contain non-transition data UnicodeString fromName, toName; diff --git a/deps/icu-small/source/i18n/olsontz.h b/deps/icu-small/source/i18n/olsontz.h index 9fe0d5dfed1ba9..33d9f66c362185 100644 --- a/deps/icu-small/source/i18n/olsontz.h +++ b/deps/icu-small/source/i18n/olsontz.h @@ -113,7 +113,7 @@ class SimpleTimeZone; * (UN M.49 - World). This data is generated from "zone.tab" * in the tz database. */ -class U_I18N_API OlsonTimeZone: public BasicTimeZone { +class U_I18N_API_CLASS OlsonTimeZone : public BasicTimeZone { public: /** * Construct from a resource bundle. @@ -141,7 +141,7 @@ class U_I18N_API OlsonTimeZone: public BasicTimeZone { /** * Assignment operator */ - OlsonTimeZone& operator=(const OlsonTimeZone& other); + U_I18N_API OlsonTimeZone& operator=(const OlsonTimeZone& other); /** * Returns true if the two TimeZone objects are equal. @@ -156,7 +156,7 @@ class U_I18N_API OlsonTimeZone: public BasicTimeZone { /** * TimeZone API. */ - static UClassID U_EXPORT2 getStaticClassID(); + U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); /** * TimeZone API. @@ -410,7 +410,7 @@ OlsonTimeZone::transitionCount() const { inline double OlsonTimeZone::transitionTime(int16_t transIdx) const { - return (double)transitionTimeInSeconds(transIdx) * U_MILLIS_PER_SECOND; + return static_cast<double>(transitionTimeInSeconds(transIdx)) * U_MILLIS_PER_SECOND; } inline int32_t diff --git a/deps/icu-small/source/i18n/persncal.cpp b/deps/icu-small/source/i18n/persncal.cpp index ab13f43434875f..3375216cca107b 100644 --- a/deps/icu-small/source/i18n/persncal.cpp +++ b/deps/icu-small/source/i18n/persncal.cpp @@ -21,9 +21,13 @@ #if !UCONFIG_NO_FORMATTING +#include "uassert.h" #include "umutex.h" #include "gregoimp.h" // Math #include <float.h> +#include "cmemory.h" +#include "ucln_in.h" +#include "unicode/uniset.h" static const int16_t kPersianNumDays[] = {0,31,62,93,124,155,186,216,246,276,306,336}; // 0-based, for day-in-year @@ -61,6 +65,45 @@ static const int32_t kPersianCalendarLimits[UCAL_FIELD_COUNT][4] = { { 0, 0, 11, 11}, // ORDINAL_MONTH }; +namespace { // anonymous + +static const icu::UnicodeSet *gLeapCorrection = nullptr; +static icu::UInitOnce gCorrectionInitOnce {}; +static int32_t gMinCorrection; +} // namespace +U_CDECL_BEGIN +static UBool calendar_persian_cleanup() { + if (gLeapCorrection) { + delete gLeapCorrection; + gLeapCorrection = nullptr; + } + gCorrectionInitOnce.reset(); + return true; +} +U_CDECL_END + +namespace { // anonymous +static void U_CALLCONV initLeapCorrection() { + static int16_t nonLeapYears[] = { + 1502, 1601, 1634, 1667, 1700, 1733, 1766, 1799, 1832, 1865, 1898, 1931, 1964, 1997, 2030, 2059, + 2063, 2096, 2129, 2158, 2162, 2191, 2195, 2224, 2228, 2257, 2261, 2290, 2294, 2323, 2327, 2356, + 2360, 2389, 2393, 2422, 2426, 2455, 2459, 2488, 2492, 2521, 2525, 2554, 2558, 2587, 2591, 2620, + 2624, 2653, 2657, 2686, 2690, 2719, 2723, 2748, 2752, 2756, 2781, 2785, 2789, 2818, 2822, 2847, + 2851, 2855, 2880, 2884, 2888, 2913, 2917, 2921, 2946, 2950, 2954, 2979, 2983, 2987, + }; + gMinCorrection = nonLeapYears[0]; + icu::UnicodeSet prefab; + for (auto year : nonLeapYears) { + prefab.add(year); + } + gLeapCorrection = prefab.cloneAsThawed()->freeze(); + ucln_i18n_registerCleanup(UCLN_I18N_PERSIAN_CALENDAR, calendar_persian_cleanup); +} +const icu::UnicodeSet* getLeapCorrection() { + umtx_initOnce(gCorrectionInitOnce, &initLeapCorrection); + return gLeapCorrection; +} +} // namespace anonymous U_NAMESPACE_BEGIN static const int32_t PERSIAN_EPOCH = 1948320; @@ -82,7 +125,6 @@ PersianCalendar* PersianCalendar::clone() const { PersianCalendar::PersianCalendar(const Locale& aLocale, UErrorCode& success) : Calendar(TimeZone::forLocaleOrDefault(aLocale), aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } PersianCalendar::PersianCalendar(const PersianCalendar& other) : Calendar(other) { @@ -110,17 +152,23 @@ int32_t PersianCalendar::handleGetLimit(UCalendarDateFields field, ELimitType li */ UBool PersianCalendar::isLeapYear(int32_t year) { - int32_t remainder; - ClockMath::floorDivide(25 * year + 11, 33, &remainder); - return (remainder < 8); + if (year >= gMinCorrection && getLeapCorrection()->contains(year)) { + return false; + } + if (year > gMinCorrection && getLeapCorrection()->contains(year-1)) { + return true; + } + int64_t y = static_cast<int64_t>(year) * 25LL + 11LL; + bool res = (y % 33L < 8); + return res; } /** * Return the day # on which the given year starts. Days are counted * from the Persian epoch, origin 0. */ -int32_t PersianCalendar::yearStart(int32_t year) { - return handleComputeMonthStart(year,0,false); +int32_t PersianCalendar::yearStart(int32_t year, UErrorCode& status) { + return handleComputeMonthStart(year,0,false, status); } /** @@ -130,8 +178,8 @@ int32_t PersianCalendar::yearStart(int32_t year) { * @param year The Persian year * @param year The Persian month, 0-based */ -int32_t PersianCalendar::monthStart(int32_t year, int32_t month) const { - return handleComputeMonthStart(year,month,true); +int32_t PersianCalendar::monthStart(int32_t year, int32_t month, UErrorCode& status) const { + return handleComputeMonthStart(year,month,true, status); } //---------------------------------------------------------------------- @@ -144,7 +192,7 @@ int32_t PersianCalendar::monthStart(int32_t year, int32_t month) const { * @param year The Persian year * @param year The Persian month, 0-based */ -int32_t PersianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month) const { +int32_t PersianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& /*status*/) const { // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { @@ -157,7 +205,8 @@ int32_t PersianCalendar::handleGetMonthLength(int32_t extendedYear, int32_t mont /** * Return the number of days in the given Persian year */ -int32_t PersianCalendar::handleGetYearLength(int32_t extendedYear) const { +int32_t PersianCalendar::handleGetYearLength(int32_t extendedYear, UErrorCode& status) const { + if (U_FAILURE(status)) return 0; return isLeapYear(extendedYear) ? 366 : 365; } @@ -165,15 +214,30 @@ int32_t PersianCalendar::handleGetYearLength(int32_t extendedYear) const { // Functions for converting from field values to milliseconds.... //------------------------------------------------------------------------- +static int64_t firstJulianOfYear(int64_t year) { + int64_t julianDay = 365LL * (year - 1LL) + ClockMath::floorDivide(8LL * year + 21, 33); + if (year > gMinCorrection && getLeapCorrection()->contains(year-1)) { + julianDay--; + } + return julianDay; +} + + // Return JD of start of given month/year -int32_t PersianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/) const { +int64_t PersianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /*useMonth*/, UErrorCode& status) const { + if (U_FAILURE(status)) { + return 0; + } // If the month is out of range, adjust it into range, and // modify the extended year value accordingly. if (month < 0 || month > 11) { - eyear += ClockMath::floorDivide(month, 12, &month); + if (uprv_add32_overflow(eyear, ClockMath::floorDivide(month, 12, &month), &eyear)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } - int32_t julianDay = PERSIAN_EPOCH - 1 + 365 * (eyear - 1) + ClockMath::floorDivide(8 * eyear + 21, 33); + int64_t julianDay = PERSIAN_EPOCH - 1LL + firstJulianOfYear(eyear); if (month != 0) { julianDay += kPersianNumDays[month]; @@ -186,14 +250,14 @@ int32_t PersianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, U // Functions for converting from milliseconds to field values //------------------------------------------------------------------------- -int32_t PersianCalendar::handleGetExtendedYear() { - int32_t year; +int32_t PersianCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 - } else { - year = internalGet(UCAL_YEAR, 1); // Default to year 1 + return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 } - return year; + return internalGet(UCAL_YEAR, 1); // Default to year 1 } /** @@ -210,21 +274,41 @@ int32_t PersianCalendar::handleGetExtendedYear() { * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this * method is called. */ -void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) { - int32_t year, month, dayOfMonth, dayOfYear; +void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { + int64_t daysSinceEpoch = julianDay; + daysSinceEpoch -= PERSIAN_EPOCH; + + int64_t year = ClockMath::floorDivideInt64( + 33LL * daysSinceEpoch + 3LL, 12053LL) + 1LL; + if (year > INT32_MAX || year < INT32_MIN) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + int64_t farvardin1 = firstJulianOfYear(year); - int32_t daysSinceEpoch = julianDay - PERSIAN_EPOCH; - year = 1 + (int32_t)ClockMath::floorDivide(33 * (int64_t)daysSinceEpoch + 3, (int64_t)12053); + int32_t dayOfYear = daysSinceEpoch - farvardin1; // 0-based + U_ASSERT(dayOfYear >= 0); + U_ASSERT(dayOfYear < 366); - int32_t farvardin1 = 365 * (year - 1) + ClockMath::floorDivide(8 * year + 21, 33); - dayOfYear = (daysSinceEpoch - farvardin1); // 0-based + if (dayOfYear == 365 && year >= gMinCorrection && getLeapCorrection()->contains(year)) { + year++; + dayOfYear = 0; + } + int32_t month; if (dayOfYear < 216) { // Compute 0-based month month = dayOfYear / 31; } else { month = (dayOfYear - 6) / 30; } - dayOfMonth = dayOfYear - kPersianNumDays[month] + 1; + U_ASSERT(month >= 0); + U_ASSERT(month < 12); + ++dayOfYear; // Make it 1-based now + int32_t dayOfMonth = dayOfYear - kPersianNumDays[month]; + U_ASSERT(dayOfMonth > 0); + U_ASSERT(dayOfMonth <= 31); + internalSet(UCAL_ERA, 0); internalSet(UCAL_YEAR, year); @@ -235,67 +319,15 @@ void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*statu internalSet(UCAL_DAY_OF_YEAR, dayOfYear); } -constexpr uint32_t kPersianRelatedYearDiff = 622; - -int32_t PersianCalendar::getRelatedYear(UErrorCode &status) const -{ - int32_t year = get(UCAL_EXTENDED_YEAR, status); - if (U_FAILURE(status)) { - return 0; - } - return year + kPersianRelatedYearDiff; -} - -void PersianCalendar::setRelatedYear(int32_t year) -{ - // set extended year - set(UCAL_EXTENDED_YEAR, year - kPersianRelatedYearDiff); -} - -// default century - -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -UBool PersianCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV initializeSystemDefaultCentury() { - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - PersianCalendar calendar(Locale("@calendar=persian"),status); - if (U_SUCCESS(status)) - { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); - } - // We have no recourse upon failure unless we want to propagate the failure - // out. -} - -UDate PersianCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t PersianCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(PersianCalendar, "@calendar=persian") UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PersianCalendar) +int32_t +PersianCalendar::getRelatedYearDifference() const { + constexpr int32_t kPersianCalendarRelatedYearDifference = 622; + return kPersianCalendarRelatedYearDifference; +} U_NAMESPACE_END #endif - diff --git a/deps/icu-small/source/i18n/persncal.h b/deps/icu-small/source/i18n/persncal.h index b943321a54d031..8c550cd2d4c7f0 100644 --- a/deps/icu-small/source/i18n/persncal.h +++ b/deps/icu-small/source/i18n/persncal.h @@ -176,7 +176,7 @@ class PersianCalendar : public Calendar { * Return the day # on which the given year starts. Days are counted * from the Hijri epoch, origin 0. */ - int32_t yearStart(int32_t year); + int32_t yearStart(int32_t year, UErrorCode& status); /** * Return the day # on which the given month starts. Days are counted @@ -185,7 +185,7 @@ class PersianCalendar : public Calendar { * @param year The hijri shamsi year * @param year The hijri shamsi month, 0-based */ - int32_t monthStart(int32_t year, int32_t month) const; + int32_t monthStart(int32_t year, int32_t month, UErrorCode& status) const; //---------------------------------------------------------------------- // Calendar framework @@ -203,13 +203,13 @@ class PersianCalendar : public Calendar { * @param year The hijri shamsi month, 0-based * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given Persian year * @internal */ - virtual int32_t handleGetYearLength(int32_t extendedYear) const override; + virtual int32_t handleGetYearLength(int32_t extendedYear, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from field values to milliseconds.... @@ -219,7 +219,7 @@ class PersianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values @@ -228,7 +228,7 @@ class PersianCalendar : public Calendar { /** * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Override Calendar to compute several fields specific to the Persian @@ -278,42 +278,17 @@ class PersianCalendar : public Calendar { */ virtual const char * getType() const override; + protected: /** - * @return The related Gregorian year; will be obtained by modifying the value - * obtained by get from UCAL_EXTENDED_YEAR field - * @internal - */ - virtual int32_t getRelatedYear(UErrorCode &status) const override; - - /** - * @param year The related Gregorian year to set; will be modified as necessary then - * set in UCAL_EXTENDED_YEAR field * @internal */ - virtual void setRelatedYear(int32_t year) override; + int32_t getRelatedYearDifference() const override; private: PersianCalendar(); // default constructor not implemented protected: - /** - * Returns true because the Persian Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/pluralranges.h b/deps/icu-small/source/i18n/pluralranges.h index eba59c70ed7f02..c06317850ae4e1 100644 --- a/deps/icu-small/source/i18n/pluralranges.h +++ b/deps/icu-small/source/i18n/pluralranges.h @@ -17,11 +17,9 @@ U_NAMESPACE_BEGIN // Forward declarations -namespace number { -namespace impl { +namespace number::impl { class UFormattedNumberRangeData; } -} class StandardPluralRanges : public UMemory { public: diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 33a539cd198d6a..8effc71dff6228 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -149,13 +149,8 @@ PluralFormat::PluralFormat(const PluralFormat& other) void PluralFormat::copyObjects(const PluralFormat& other) { UErrorCode status = U_ZERO_ERROR; - if (numberFormat != nullptr) { - delete numberFormat; - } - if (pluralRulesWrapper.pluralRules != nullptr) { - delete pluralRulesWrapper.pluralRules; - } - + delete numberFormat; + delete pluralRulesWrapper.pluralRules; if (other.numberFormat == nullptr) { numberFormat = NumberFormat::createInstance(locale, status); } else { @@ -239,7 +234,7 @@ PluralFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { - return format(Formattable(number), (double)number, appendTo, pos, status); + return format(Formattable(number), static_cast<double>(number), appendTo, pos, status); } UnicodeString& @@ -247,7 +242,7 @@ PluralFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { - return format(Formattable(number), (double)number, appendTo, pos, status); + return format(Formattable(number), number, appendTo, pos, status); } UnicodeString& diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 839d14147cc267..cfb50a83fbbab5 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -22,7 +22,6 @@ #include "unicode/numfmt.h" #include "unicode/decimfmt.h" #include "unicode/numberrangeformatter.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -656,6 +655,11 @@ PluralRuleParser::parse(const UnicodeString& ruleData, PluralRules *prules, UErr case tEqual: { U_ASSERT(curAndConstraint != nullptr); + if (curAndConstraint->rangeList != nullptr) { + // Already get a '='. + status = U_UNEXPECTED_TOKEN; + break; + } LocalPointer<UVector32> newRangeList(new UVector32(status), status); if (U_FAILURE(status)) { break; @@ -673,20 +677,40 @@ PluralRuleParser::parse(const UnicodeString& ruleData, PluralRules *prules, UErr U_ASSERT(curAndConstraint != nullptr); if ( (curAndConstraint->op==AndConstraint::MOD)&& (curAndConstraint->opNum == -1 ) ) { - curAndConstraint->opNum=getNumberValue(token); + int32_t num = getNumberValue(token); + if (num == -1) { + status = U_UNEXPECTED_TOKEN; + break; + } + curAndConstraint->opNum=num; } else { if (curAndConstraint->rangeList == nullptr) { // this is for an 'is' rule - curAndConstraint->value = getNumberValue(token); + int32_t num = getNumberValue(token); + if (num == -1) { + status = U_UNEXPECTED_TOKEN; + break; + } + curAndConstraint->value = num; } else { // this is for an 'in' or 'within' rule if (curAndConstraint->rangeList->elementAti(rangeLowIdx) == -1) { - curAndConstraint->rangeList->setElementAt(getNumberValue(token), rangeLowIdx); - curAndConstraint->rangeList->setElementAt(getNumberValue(token), rangeHiIdx); + int32_t num = getNumberValue(token); + if (num == -1) { + status = U_UNEXPECTED_TOKEN; + break; + } + curAndConstraint->rangeList->setElementAt(num, rangeLowIdx); + curAndConstraint->rangeList->setElementAt(num, rangeHiIdx); } else { - curAndConstraint->rangeList->setElementAt(getNumberValue(token), rangeHiIdx); + int32_t num = getNumberValue(token); + if (num == -1) { + status = U_UNEXPECTED_TOKEN; + break; + } + curAndConstraint->rangeList->setElementAt(num, rangeHiIdx); if (curAndConstraint->rangeList->elementAti(rangeLowIdx) > curAndConstraint->rangeList->elementAti(rangeHiIdx)) { // Range Lower bound > Range Upper bound. @@ -836,9 +860,7 @@ PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorC for (;;) { { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(parentLocaleName.data(), sink, &status); + CharString tmp = ulocimp_getParent(parentLocaleName.data(), status); if (tmp.isEmpty()) break; parentLocaleName = std::move(tmp); } @@ -1258,13 +1280,8 @@ PluralRuleParser::~PluralRuleParser() { int32_t PluralRuleParser::getNumberValue(const UnicodeString& token) { - int32_t i; - char digits[128]; - - i = token.extract(0, token.length(), digits, UPRV_LENGTHOF(digits), US_INV); - digits[i]='\0'; - - return((int32_t)atoi(digits)); + int32_t pos = 0; + return ICU_Utility::parseNumber(token, pos, 10); } @@ -1582,7 +1599,7 @@ PluralKeywordEnumeration::PluralKeywordEnumeration(RuleChain *header, UErrorCode const UnicodeString* PluralKeywordEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && pos < fKeywordNames.size()) { - return (const UnicodeString*)fKeywordNames.elementAt(pos++); + return static_cast<const UnicodeString*>(fKeywordNames.elementAt(pos++)); } return nullptr; } @@ -1758,13 +1775,15 @@ void FixedDecimal::init(double n, int32_t v, int64_t f, int32_t e, int32_t c) { if (exponent == 0) { exponent = c; } - if (_isNaN || _isInfinite) { + if (_isNaN || _isInfinite || + source > static_cast<double>(U_INT64_MAX) || + source < static_cast<double>(U_INT64_MIN)) { v = 0; f = 0; intValue = 0; _hasIntegerValue = false; } else { - intValue = (int64_t)source; + intValue = static_cast<int64_t>(source); _hasIntegerValue = (source == intValue); } @@ -1848,17 +1867,17 @@ int64_t FixedDecimal::getFractionalDigits(double n, int32_t v) { n = fabs(n); double fract = n - floor(n); switch (v) { - case 1: return (int64_t)(fract*10.0 + 0.5); - case 2: return (int64_t)(fract*100.0 + 0.5); - case 3: return (int64_t)(fract*1000.0 + 0.5); + case 1: return static_cast<int64_t>(fract * 10.0 + 0.5); + case 2: return static_cast<int64_t>(fract * 100.0 + 0.5); + case 3: return static_cast<int64_t>(fract * 1000.0 + 0.5); default: - double scaled = floor(fract * pow(10.0, (double)v) + 0.5); + double scaled = floor(fract * pow(10.0, static_cast<double>(v)) + 0.5); if (scaled >= static_cast<double>(U_INT64_MAX)) { // Note: a double cannot accurately represent U_INT64_MAX. Casting it to double // will round up to the next representable value, which is U_INT64_MAX + 1. return U_INT64_MAX; } else { - return (int64_t)scaled; + return static_cast<int64_t>(scaled); } } } @@ -1883,7 +1902,7 @@ void FixedDecimal::adjustForMinFractionDigits(int32_t minFractionDigits) { double FixedDecimal::getPluralOperand(PluralOperand operand) const { switch(operand) { case PLURAL_OPERAND_N: return (exponent == 0 ? source : source * pow(10.0, exponent)); - case PLURAL_OPERAND_I: return (double) longValue(); + case PLURAL_OPERAND_I: return static_cast<double>(longValue()); case PLURAL_OPERAND_F: return static_cast<double>(decimalDigits); case PLURAL_OPERAND_T: return static_cast<double>(decimalDigitsWithoutTrailingZeros); case PLURAL_OPERAND_V: return visibleDecimalDigitCount; @@ -1940,7 +1959,7 @@ int64_t FixedDecimal::longValue() const { if (exponent == 0) { return intValue; } else { - return (long) (pow(10.0, exponent) * intValue); + return static_cast<long>(pow(10.0, exponent) * intValue); } } diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index 4de6d6460aaa19..e57f931af3c45d 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -50,67 +50,67 @@ namespace pluralimpl { // TODO: Remove this and replace with u"" literals. Was for EBCDIC compatibility. -static const char16_t DOT = ((char16_t) 0x002E); -static const char16_t SINGLE_QUOTE = ((char16_t) 0x0027); -static const char16_t SLASH = ((char16_t) 0x002F); -static const char16_t BACKSLASH = ((char16_t) 0x005C); -static const char16_t SPACE = ((char16_t) 0x0020); -static const char16_t EXCLAMATION = ((char16_t) 0x0021); -static const char16_t QUOTATION_MARK = ((char16_t) 0x0022); -static const char16_t NUMBER_SIGN = ((char16_t) 0x0023); -static const char16_t PERCENT_SIGN = ((char16_t) 0x0025); -static const char16_t ASTERISK = ((char16_t) 0x002A); -static const char16_t COMMA = ((char16_t) 0x002C); -static const char16_t HYPHEN = ((char16_t) 0x002D); -static const char16_t U_ZERO = ((char16_t) 0x0030); -static const char16_t U_ONE = ((char16_t) 0x0031); -static const char16_t U_TWO = ((char16_t) 0x0032); -static const char16_t U_THREE = ((char16_t) 0x0033); -static const char16_t U_FOUR = ((char16_t) 0x0034); -static const char16_t U_FIVE = ((char16_t) 0x0035); -static const char16_t U_SIX = ((char16_t) 0x0036); -static const char16_t U_SEVEN = ((char16_t) 0x0037); -static const char16_t U_EIGHT = ((char16_t) 0x0038); -static const char16_t U_NINE = ((char16_t) 0x0039); -static const char16_t COLON = ((char16_t) 0x003A); -static const char16_t SEMI_COLON = ((char16_t) 0x003B); -static const char16_t EQUALS = ((char16_t) 0x003D); -static const char16_t AT = ((char16_t) 0x0040); -static const char16_t CAP_A = ((char16_t) 0x0041); -static const char16_t CAP_B = ((char16_t) 0x0042); -static const char16_t CAP_R = ((char16_t) 0x0052); -static const char16_t CAP_Z = ((char16_t) 0x005A); -static const char16_t LOWLINE = ((char16_t) 0x005F); -static const char16_t LEFTBRACE = ((char16_t) 0x007B); -static const char16_t RIGHTBRACE = ((char16_t) 0x007D); -static const char16_t TILDE = ((char16_t) 0x007E); -static const char16_t ELLIPSIS = ((char16_t) 0x2026); - -static const char16_t LOW_A = ((char16_t) 0x0061); -static const char16_t LOW_B = ((char16_t) 0x0062); -static const char16_t LOW_C = ((char16_t) 0x0063); -static const char16_t LOW_D = ((char16_t) 0x0064); -static const char16_t LOW_E = ((char16_t) 0x0065); -static const char16_t LOW_F = ((char16_t) 0x0066); -static const char16_t LOW_G = ((char16_t) 0x0067); -static const char16_t LOW_H = ((char16_t) 0x0068); -static const char16_t LOW_I = ((char16_t) 0x0069); -static const char16_t LOW_J = ((char16_t) 0x006a); -static const char16_t LOW_K = ((char16_t) 0x006B); -static const char16_t LOW_L = ((char16_t) 0x006C); -static const char16_t LOW_M = ((char16_t) 0x006D); -static const char16_t LOW_N = ((char16_t) 0x006E); -static const char16_t LOW_O = ((char16_t) 0x006F); -static const char16_t LOW_P = ((char16_t) 0x0070); -static const char16_t LOW_Q = ((char16_t) 0x0071); -static const char16_t LOW_R = ((char16_t) 0x0072); -static const char16_t LOW_S = ((char16_t) 0x0073); -static const char16_t LOW_T = ((char16_t) 0x0074); -static const char16_t LOW_U = ((char16_t) 0x0075); -static const char16_t LOW_V = ((char16_t) 0x0076); -static const char16_t LOW_W = ((char16_t) 0x0077); -static const char16_t LOW_Y = ((char16_t) 0x0079); -static const char16_t LOW_Z = ((char16_t) 0x007A); +static const char16_t DOT = static_cast<char16_t>(0x002E); +static const char16_t SINGLE_QUOTE = static_cast<char16_t>(0x0027); +static const char16_t SLASH = static_cast<char16_t>(0x002F); +static const char16_t BACKSLASH = static_cast<char16_t>(0x005C); +static const char16_t SPACE = static_cast<char16_t>(0x0020); +static const char16_t EXCLAMATION = static_cast<char16_t>(0x0021); +static const char16_t QUOTATION_MARK = static_cast<char16_t>(0x0022); +static const char16_t NUMBER_SIGN = static_cast<char16_t>(0x0023); +static const char16_t PERCENT_SIGN = static_cast<char16_t>(0x0025); +static const char16_t ASTERISK = static_cast<char16_t>(0x002A); +static const char16_t COMMA = static_cast<char16_t>(0x002C); +static const char16_t HYPHEN = static_cast<char16_t>(0x002D); +static const char16_t U_ZERO = static_cast<char16_t>(0x0030); +static const char16_t U_ONE = static_cast<char16_t>(0x0031); +static const char16_t U_TWO = static_cast<char16_t>(0x0032); +static const char16_t U_THREE = static_cast<char16_t>(0x0033); +static const char16_t U_FOUR = static_cast<char16_t>(0x0034); +static const char16_t U_FIVE = static_cast<char16_t>(0x0035); +static const char16_t U_SIX = static_cast<char16_t>(0x0036); +static const char16_t U_SEVEN = static_cast<char16_t>(0x0037); +static const char16_t U_EIGHT = static_cast<char16_t>(0x0038); +static const char16_t U_NINE = static_cast<char16_t>(0x0039); +static const char16_t COLON = static_cast<char16_t>(0x003A); +static const char16_t SEMI_COLON = static_cast<char16_t>(0x003B); +static const char16_t EQUALS = static_cast<char16_t>(0x003D); +static const char16_t AT = static_cast<char16_t>(0x0040); +static const char16_t CAP_A = static_cast<char16_t>(0x0041); +static const char16_t CAP_B = static_cast<char16_t>(0x0042); +static const char16_t CAP_R = static_cast<char16_t>(0x0052); +static const char16_t CAP_Z = static_cast<char16_t>(0x005A); +static const char16_t LOWLINE = static_cast<char16_t>(0x005F); +static const char16_t LEFTBRACE = static_cast<char16_t>(0x007B); +static const char16_t RIGHTBRACE = static_cast<char16_t>(0x007D); +static const char16_t TILDE = static_cast<char16_t>(0x007E); +static const char16_t ELLIPSIS = static_cast<char16_t>(0x2026); + +static const char16_t LOW_A = static_cast<char16_t>(0x0061); +static const char16_t LOW_B = static_cast<char16_t>(0x0062); +static const char16_t LOW_C = static_cast<char16_t>(0x0063); +static const char16_t LOW_D = static_cast<char16_t>(0x0064); +static const char16_t LOW_E = static_cast<char16_t>(0x0065); +static const char16_t LOW_F = static_cast<char16_t>(0x0066); +static const char16_t LOW_G = static_cast<char16_t>(0x0067); +static const char16_t LOW_H = static_cast<char16_t>(0x0068); +static const char16_t LOW_I = static_cast<char16_t>(0x0069); +static const char16_t LOW_J = static_cast<char16_t>(0x006a); +static const char16_t LOW_K = static_cast<char16_t>(0x006B); +static const char16_t LOW_L = static_cast<char16_t>(0x006C); +static const char16_t LOW_M = static_cast<char16_t>(0x006D); +static const char16_t LOW_N = static_cast<char16_t>(0x006E); +static const char16_t LOW_O = static_cast<char16_t>(0x006F); +static const char16_t LOW_P = static_cast<char16_t>(0x0070); +static const char16_t LOW_Q = static_cast<char16_t>(0x0071); +static const char16_t LOW_R = static_cast<char16_t>(0x0072); +static const char16_t LOW_S = static_cast<char16_t>(0x0073); +static const char16_t LOW_T = static_cast<char16_t>(0x0074); +static const char16_t LOW_U = static_cast<char16_t>(0x0075); +static const char16_t LOW_V = static_cast<char16_t>(0x0076); +static const char16_t LOW_W = static_cast<char16_t>(0x0077); +static const char16_t LOW_Y = static_cast<char16_t>(0x0079); +static const char16_t LOW_Z = static_cast<char16_t>(0x007A); } diff --git a/deps/icu-small/source/i18n/quant.cpp b/deps/icu-small/source/i18n/quant.cpp index 4a45db1bf5c268..a4c21c8e721b15 100644 --- a/deps/icu-small/source/i18n/quant.cpp +++ b/deps/icu-small/source/i18n/quant.cpp @@ -103,21 +103,21 @@ UnicodeString& Quantifier::toPattern(UnicodeString& result, matcher->toMatcher()->toPattern(result, escapeUnprintable); if (minCount == 0) { if (maxCount == 1) { - return result.append((char16_t)63); /*?*/ + return result.append(static_cast<char16_t>(63)); /*?*/ } else if (maxCount == MAX) { - return result.append((char16_t)42); /***/ + return result.append(static_cast<char16_t>(42)); /***/ } // else fall through } else if (minCount == 1 && maxCount == MAX) { - return result.append((char16_t)43); /*+*/ + return result.append(static_cast<char16_t>(43)); /*+*/ } - result.append((char16_t)123); /*{*/ + result.append(static_cast<char16_t>(123)); /*{*/ ICU_Utility::appendNumber(result, minCount); - result.append((char16_t)44); /*,*/ + result.append(static_cast<char16_t>(44)); /*,*/ if (maxCount != MAX) { ICU_Utility::appendNumber(result, maxCount); } - result.append((char16_t)125); /*}*/ + result.append(static_cast<char16_t>(125)); /*}*/ return result; } diff --git a/deps/icu-small/source/i18n/quantityformatter.cpp b/deps/icu-small/source/i18n/quantityformatter.cpp index 0a1982e3d4c86d..f350c521f819d2 100644 --- a/deps/icu-small/source/i18n/quantityformatter.cpp +++ b/deps/icu-small/source/i18n/quantityformatter.cpp @@ -166,7 +166,7 @@ StandardPlural::Form QuantityFormatter::selectPlural( } else if (number.getType() == Formattable::kLong) { pluralKeyword = rules.select(number.getLong()); } else if (number.getType() == Formattable::kInt64) { - pluralKeyword = rules.select((double) number.getInt64()); + pluralKeyword = rules.select(static_cast<double>(number.getInt64())); } else { status = U_ILLEGAL_ARGUMENT_ERROR; return StandardPlural::OTHER; diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index 06599b4fd16db7..97017f031739e0 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -226,9 +226,9 @@ class VArray { cap += 256; } if (buf == nullptr) { - buf = (void**)uprv_malloc(cap * sizeof(void*)); + buf = static_cast<void**>(uprv_malloc(cap * sizeof(void*))); } else { - buf = (void**)uprv_realloc(buf, cap * sizeof(void*)); + buf = static_cast<void**>(uprv_realloc(buf, cap * sizeof(void*))); } if (buf == nullptr) { // if we couldn't realloc, we leak the memory we've already allocated, but we're in deep trouble anyway @@ -460,7 +460,7 @@ LocDataParser::doParse() { array.add(nullptr, ec); if (U_SUCCESS(ec)) { int32_t numLocs = array.length() - 2; // subtract first, nullptr - char16_t*** result = (char16_t***)array.release(); + char16_t*** result = reinterpret_cast<char16_t***>(array.release()); return new StringLocalizationInfo(data, result, requiredLength-2, numLocs); // subtract first, nullptr } @@ -515,7 +515,7 @@ LocDataParser::nextArray(int32_t& requiredLength) { ERROR("Array not of required length"); } - return (char16_t**)array.release(); + return reinterpret_cast<char16_t**>(array.release()); } ERROR("Unknown Error"); } @@ -583,11 +583,11 @@ void LocDataParser::parseError(const char* EXPLANATION_ARG) if (limit > e) { limit = e; } - u_strncpy(pe.preContext, start, (int32_t)(p-start)); + u_strncpy(pe.preContext, start, static_cast<int32_t>(p - start)); pe.preContext[p-start] = 0; - u_strncpy(pe.postContext, p, (int32_t)(limit-p)); + u_strncpy(pe.postContext, p, static_cast<int32_t>(limit - p)); pe.postContext[limit-p] = 0; - pe.offset = (int32_t)(p - data); + pe.offset = static_cast<int32_t>(p - data); #ifdef RBNF_DEBUG fprintf(stderr, "%s at or near character %ld: ", EXPLANATION_ARG, p-data); @@ -632,7 +632,7 @@ StringLocalizationInfo::create(const UnicodeString& info, UParseError& perror, U return nullptr; // no error; } - char16_t* p = (char16_t*)uprv_malloc(len * sizeof(char16_t)); + char16_t* p = static_cast<char16_t*>(uprv_malloc(len * sizeof(char16_t))); if (!p) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -647,7 +647,7 @@ StringLocalizationInfo::create(const UnicodeString& info, UParseError& perror, U } StringLocalizationInfo::~StringLocalizationInfo() { - for (char16_t*** p = (char16_t***)data; *p; ++p) { + for (char16_t*** p = data; *p; ++p) { // remaining data is simply pointer into our unicode string data. if (*p) uprv_free(*p); } @@ -990,7 +990,7 @@ UnicodeString RuleBasedNumberFormat::getRuleSetName(int32_t index) const { if (localizations) { - UnicodeString string(true, localizations->getRuleSetName(index), (int32_t)-1); + UnicodeString string(true, localizations->getRuleSetName(index), static_cast<int32_t>(-1)); return string; } else if (fRuleSets) { @@ -1037,7 +1037,7 @@ RuleBasedNumberFormat::getNumberOfRuleSetDisplayNameLocales() const { Locale RuleBasedNumberFormat::getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const { if (U_FAILURE(status)) { - return Locale(""); + return {""}; } if (localizations && index >= 0 && index < localizations->getNumberOfDisplayLocales()) { UnicodeString name(true, localizations->getLocaleName(index), -1); @@ -1045,10 +1045,10 @@ RuleBasedNumberFormat::getRuleSetDisplayNameLocale(int32_t index, UErrorCode& st int32_t cap = name.length() + 1; char* bp = buffer; if (cap > 64) { - bp = (char *)uprv_malloc(cap); + bp = static_cast<char*>(uprv_malloc(cap)); if (bp == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return Locale(""); + return {""}; } } name.extract(0, name.length(), bp, cap, UnicodeString::kInvariant); @@ -1159,7 +1159,7 @@ RuleBasedNumberFormat::format(int32_t number, UnicodeString& toAppendTo, FieldPosition& pos) const { - return format((int64_t)number, toAppendTo, pos); + return format(static_cast<int64_t>(number), toAppendTo, pos); } @@ -1196,7 +1196,7 @@ RuleBasedNumberFormat::format(int32_t number, FieldPosition& pos, UErrorCode& status) const { - return format((int64_t)number, ruleSetName, toAppendTo, pos, status); + return format(static_cast<int64_t>(number), ruleSetName, toAppendTo, pos, status); } @@ -1362,7 +1362,7 @@ RuleBasedNumberFormat::parse(const UnicodeString& text, ParsePosition working_pp(0); Formattable working_result; - rp->parse(workingText, working_pp, kMaxDouble, 0, working_result); + rp->parse(workingText, working_pp, kMaxDouble, 0, 0, working_result); if (working_pp.getIndex() > high_pp.getIndex()) { high_pp = working_pp; high_result = working_result; @@ -1555,9 +1555,9 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali ++numRuleSets; // our rule list is an array of the appropriate size - fRuleSets = (NFRuleSet **)uprv_malloc((numRuleSets + 1) * sizeof(NFRuleSet *)); + fRuleSets = static_cast<NFRuleSet**>(uprv_malloc((numRuleSets + 1) * sizeof(NFRuleSet*))); /* test for nullptr */ - if (fRuleSets == 0) { + if (fRuleSets == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1568,12 +1568,12 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali // divide up the descriptions into individual rule-set descriptions // and store them in a temporary array. At each step, we also - // new up a rule set, but all this does is initialize its name + // create a rule set, but all this does is initialize its name // and remove it from its description. We can't actually parse // the rest of the descriptions and finish initializing everything // because we have to know the names and locations of all the rule // sets before we can actually set everything up - if(!numRuleSets) { + if (!numRuleSets) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -1592,6 +1592,8 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status); if (fRuleSets[curRuleSet] == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(status)) { return; } ++curRuleSet; @@ -1601,6 +1603,8 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali fRuleSets[curRuleSet] = new NFRuleSet(this, ruleSetDescriptions, curRuleSet, status); if (fRuleSets[curRuleSet] == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; + } + if (U_FAILURE(status)) { return; } } @@ -1616,12 +1620,15 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali // last public rule set, no matter what the localization data says. initDefaultRuleSet(); - // finally, we can go back through the temporary descriptions - // list and finish setting up the substructure (and we throw - // away the temporary descriptions as we go) + // Now that we know all the rule names, we can go back through + // the temporary descriptions list and finish setting up the substructure + // (and we throw away the temporary descriptions as we go) { for (int i = 0; i < numRuleSets; i++) { fRuleSets[i]->parseRules(ruleSetDescriptions[i], status); + if (U_FAILURE(status)) { + return; + } } } @@ -1641,6 +1648,9 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali if (rs == nullptr) { break; // error } + if (U_FAILURE(status)) { + return; + } if (i == 0) { defaultRuleSet = rs; } @@ -1706,10 +1716,13 @@ RuleBasedNumberFormat::stripWhitespace(UnicodeString& description) UnicodeString result; int start = 0; - while (start != -1 && start < description.length()) { - // seek to the first non-whitespace character... + UChar ch; + while (start < description.length()) { + // Seek to the first non-whitespace character... + // If the first non-whitespace character is semicolon, skip it and continue while (start < description.length() - && PatternProps::isWhiteSpace(description.charAt(start))) { + && (PatternProps::isWhiteSpace(ch = description.charAt(start)) || ch == gSemiColon)) + { ++start; } @@ -1720,20 +1733,16 @@ RuleBasedNumberFormat::stripWhitespace(UnicodeString& description) // or if we don't find a semicolon, just copy the rest of // the string into the result result.append(description, start, description.length() - start); - start = -1; + break; } else if (p < description.length()) { result.append(description, start, p + 1 - start); start = p + 1; } - - // when we get here, we've seeked off the end of the string, and + // when we get here from the else, we've seeked off the end of the string, and // we terminate the loop (we continue until *start* is -1 rather // than until *p* is -1, because otherwise we'd miss the last // rule in the description) - else { - start = -1; - } } description.setTo(result); @@ -1829,7 +1838,7 @@ RuleBasedNumberFormat::getCollator() const if (U_SUCCESS(status)) { newCollator->setAttribute(UCOL_DECOMPOSITION_MODE, UCOL_ON, status); // cast away const - ((RuleBasedNumberFormat*)this)->collator = newCollator; + const_cast<RuleBasedNumberFormat*>(this)->collator = newCollator; } else { delete newCollator; } @@ -1923,10 +1932,7 @@ RuleBasedNumberFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsTo return; // do not allow caller to set decimalFormatSymbols to nullptr } - if (decimalFormatSymbols != nullptr) { - delete decimalFormatSymbols; - } - + delete decimalFormatSymbols; decimalFormatSymbols = symbolsToAdopt; { diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp index 2176e89fddc949..f34ddc9c385427 100644 --- a/deps/icu-small/source/i18n/rbt.cpp +++ b/deps/icu-small/source/i18n/rbt.cpp @@ -33,7 +33,7 @@ void RuleBasedTransliterator::_construct(const UnicodeString& rules, UTransDirection direction, UParseError& parseError, UErrorCode& status) { - fData = 0; + fData = nullptr; isDataOwned = true; if (U_FAILURE(status)) { return; @@ -52,7 +52,7 @@ void RuleBasedTransliterator::_construct(const UnicodeString& rules, return; } - fData = (TransliterationRuleData*)parser.dataVector.orphanElementAt(0); + fData = static_cast<TransliterationRuleData*>(parser.dataVector.orphanElementAt(0)); setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); } @@ -142,7 +142,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, const TransliterationRuleData* theData, UnicodeFilter* adoptedFilter) : Transliterator(id, adoptedFilter), - fData((TransliterationRuleData*)theData), // cast away const + fData(const_cast<TransliterationRuleData*>(theData)), // cast away const isDataOwned(false) { setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); } @@ -153,7 +153,7 @@ RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, RuleBasedTransliterator::RuleBasedTransliterator(const UnicodeString& id, TransliterationRuleData* theData, UBool isDataAdopted) : - Transliterator(id, 0), + Transliterator(id, nullptr), fData(theData), isDataOwned(isDataAdopted) { setMaximumContextLength(fData->ruleSet.getMaximumContextLength()); diff --git a/deps/icu-small/source/i18n/rbt.h b/deps/icu-small/source/i18n/rbt.h index 59fa286a45a406..fdb0047df34077 100644 --- a/deps/icu-small/source/i18n/rbt.h +++ b/deps/icu-small/source/i18n/rbt.h @@ -115,7 +115,7 @@ class RuleBasedTransliterator : public Transliterator { */ RuleBasedTransliterator(const UnicodeString& id, const TransliterationRuleData* theData, - UnicodeFilter* adoptedFilter = 0); + UnicodeFilter* adoptedFilter = nullptr); friend class Transliterator; // to access following ct diff --git a/deps/icu-small/source/i18n/rbt_data.cpp b/deps/icu-small/source/i18n/rbt_data.cpp index f4212848cb5555..6079e70caf9b48 100644 --- a/deps/icu-small/source/i18n/rbt_data.cpp +++ b/deps/icu-small/source/i18n/rbt_data.cpp @@ -25,13 +25,13 @@ U_NAMESPACE_BEGIN TransliterationRuleData::TransliterationRuleData(UErrorCode& status) : UMemory(), ruleSet(status), variableNames(status), - variables(0), variablesAreOwned(true) + variables(nullptr), variablesAreOwned(true) { if (U_FAILURE(status)) { return; } variableNames.setValueDeleter(uprv_deleteUObject); - variables = 0; + variables = nullptr; variablesLength = 0; } @@ -46,21 +46,21 @@ TransliterationRuleData::TransliterationRuleData(const TransliterationRuleData& variableNames.setValueDeleter(uprv_deleteUObject); int32_t pos = UHASH_FIRST; const UHashElement *e; - while ((e = other.variableNames.nextElement(pos)) != 0) { + while ((e = other.variableNames.nextElement(pos)) != nullptr) { UnicodeString* value = - new UnicodeString(*(const UnicodeString*)e->value.pointer); + new UnicodeString(*static_cast<const UnicodeString*>(e->value.pointer)); // Exit out if value could not be created. if (value == nullptr) { return; } - variableNames.put(*(UnicodeString*)e->key.pointer, value, status); + variableNames.put(*static_cast<UnicodeString*>(e->key.pointer), value, status); } - variables = 0; - if (other.variables != 0) { - variables = (UnicodeFunctor **)uprv_malloc(variablesLength * sizeof(UnicodeFunctor *)); + variables = nullptr; + if (other.variables != nullptr) { + variables = static_cast<UnicodeFunctor**>(uprv_malloc(variablesLength * sizeof(UnicodeFunctor*))); /* test for nullptr */ - if (variables == 0) { + if (variables == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -87,7 +87,7 @@ TransliterationRuleData::TransliterationRuleData(const TransliterationRuleData& } TransliterationRuleData::~TransliterationRuleData() { - if (variablesAreOwned && variables != 0) { + if (variablesAreOwned && variables != nullptr) { for (int32_t i=0; i<variablesLength; ++i) { delete variables[i]; } @@ -98,19 +98,19 @@ TransliterationRuleData::~TransliterationRuleData() { UnicodeFunctor* TransliterationRuleData::lookup(UChar32 standIn) const { int32_t i = standIn - variablesBase; - return (i >= 0 && i < variablesLength) ? variables[i] : 0; + return (i >= 0 && i < variablesLength) ? variables[i] : nullptr; } UnicodeMatcher* TransliterationRuleData::lookupMatcher(UChar32 standIn) const { UnicodeFunctor *f = lookup(standIn); - return (f != 0) ? f->toMatcher() : 0; + return f != nullptr ? f->toMatcher() : nullptr; } UnicodeReplacer* TransliterationRuleData::lookupReplacer(UChar32 standIn) const { UnicodeFunctor *f = lookup(standIn); - return (f != 0) ? f->toReplacer() : 0; + return f != nullptr ? f->toReplacer() : nullptr; } diff --git a/deps/icu-small/source/i18n/rbt_pars.cpp b/deps/icu-small/source/i18n/rbt_pars.cpp index 10482d5edb19c6..e2dbb058d5c58d 100644 --- a/deps/icu-small/source/i18n/rbt_pars.cpp +++ b/deps/icu-small/source/i18n/rbt_pars.cpp @@ -142,9 +142,9 @@ class ParseData : public UMemory, public SymbolTable { const Hashtable* variableNames; // alias - ParseData(const TransliterationRuleData* data = 0, - const UVector* variablesVector = 0, - const Hashtable* variableNames = 0); + ParseData(const TransliterationRuleData* data = nullptr, + const UVector* variablesVector = nullptr, + const Hashtable* variableNames = nullptr); virtual ~ParseData(); @@ -182,7 +182,7 @@ ParseData::~ParseData() {} * Implement SymbolTable API. */ const UnicodeString* ParseData::lookup(const UnicodeString& name) const { - return (const UnicodeString*) variableNames->get(name); + return static_cast<const UnicodeString*>(variableNames->get(name)); } /** @@ -196,7 +196,7 @@ const UnicodeFunctor* ParseData::lookupMatcher(UChar32 ch) const { if (i >= 0 && i < variablesVector->size()) { int32_t j = ch - data->variablesBase; set = (j < variablesVector->size()) ? - (UnicodeFunctor*) variablesVector->elementAt(j) : 0; + static_cast<UnicodeFunctor*>(variablesVector->elementAt(j)) : nullptr; } return set; } @@ -230,7 +230,7 @@ UBool ParseData::isMatcher(UChar32 ch) { // set array has not been constructed yet. int32_t i = ch - data->variablesBase; if (i >= 0 && i < variablesVector->size()) { - UnicodeFunctor *f = (UnicodeFunctor*) variablesVector->elementAt(i); + UnicodeFunctor* f = static_cast<UnicodeFunctor*>(variablesVector->elementAt(i)); return f != nullptr && f->toMatcher() != nullptr; } return true; @@ -245,7 +245,7 @@ UBool ParseData::isReplacer(UChar32 ch) { // set array has not been constructed yet. int i = ch - data->variablesBase; if (i >= 0 && i < variablesVector->size()) { - UnicodeFunctor *f = (UnicodeFunctor*) variablesVector->elementAt(i); + UnicodeFunctor* f = static_cast<UnicodeFunctor*>(variablesVector->elementAt(i)); return f != nullptr && f->toReplacer() != nullptr; } return true; @@ -446,7 +446,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l return syntaxError(U_TRAILING_BACKSLASH, rule, start, status); } UChar32 escaped = rule.unescapeAt(pos); // pos is already past '\\' - if (escaped == (UChar32) -1) { + if (escaped == static_cast<UChar32>(-1)) { return syntaxError(U_MALFORMED_UNICODE_ESCAPE, rule, start, status); } if (!parser.checkVariableRange(escaped)) { @@ -535,15 +535,14 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l // in buf, starting at offset bufSegStart. Extract them // into a string matcher, and replace them with a // standin for that matcher. - StringMatcher* m = - new StringMatcher(buf, bufSegStart, buf.length(), - segmentNumber, *parser.curData); - if (m == nullptr) { + LocalPointer<StringMatcher> m(new StringMatcher(buf, bufSegStart, buf.length(), + segmentNumber, *parser.curData), status); + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } // Record and associate object and segment number - parser.setSegmentObject(segmentNumber, m, status); + parser.setSegmentObject(segmentNumber, m.orphan(), status); buf.truncate(bufSegStart); buf.append(parser.getSegmentStandin(segmentNumber, status)); } @@ -577,15 +576,15 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l // in buf, starting at offset bufSegStart. UnicodeString output; buf.extractBetween(bufSegStart, buf.length(), output); - FunctionReplacer *r = - new FunctionReplacer(t, new StringReplacer(output, parser.curData)); - if (r == nullptr) { + LocalPointer<FunctionReplacer> r( + new FunctionReplacer(t, new StringReplacer(output, parser.curData)), status); + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } // Replace the buffer contents with a stand-in buf.truncate(bufSegStart); - buf.append(parser.generateStandInFor(r, status)); + buf.append(parser.generateStandInFor(r.orphan(), status)); } break; case SymbolTable::SYMBOL_REF: @@ -671,9 +670,9 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l qlimit = qstart + 1; } - UnicodeFunctor *m = - new StringMatcher(buf, qstart, qlimit, 0, *parser.curData); - if (m == nullptr) { + LocalPointer<UnicodeFunctor> m( + new StringMatcher(buf, qstart, qlimit, 0, *parser.curData), status); + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } int32_t min = 0; @@ -689,12 +688,16 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l // case KLEENE_STAR: // do nothing -- min, max already set } - m = new Quantifier(m, min, max); - if (m == nullptr) { + LocalPointer<UnicodeFunctor> m2(new Quantifier(m.getAlias(), min, max), status); + if (m2.isValid()) { + m.orphan(); + } + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } + m = std::move(m2); buf.truncate(qstart); - buf.append(parser.generateStandInFor(m, status)); + buf.append(parser.generateStandInFor(m.orphan(), status)); } break; @@ -844,11 +847,11 @@ segmentObjects(statusReturn) */ TransliteratorParser::~TransliteratorParser() { while (!dataVector.isEmpty()) - delete (TransliterationRuleData*)(dataVector.orphanElementAt(0)); + delete static_cast<TransliterationRuleData*>(dataVector.orphanElementAt(0)); delete compoundFilter; delete parseData; while (!variablesVector.isEmpty()) - delete (UnicodeFunctor*)variablesVector.orphanElementAt(0); + delete static_cast<UnicodeFunctor*>(variablesVector.orphanElementAt(0)); } void @@ -895,7 +898,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, int32_t ruleCount = 0; while (!dataVector.isEmpty()) { - delete (TransliterationRuleData*)(dataVector.orphanElementAt(0)); + delete static_cast<TransliterationRuleData*>(dataVector.orphanElementAt(0)); } if (U_FAILURE(status)) { return; @@ -910,18 +913,18 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, compoundFilter = nullptr; while (!variablesVector.isEmpty()) { - delete (UnicodeFunctor*)variablesVector.orphanElementAt(0); + delete static_cast<UnicodeFunctor*>(variablesVector.orphanElementAt(0)); } variableNames.removeAll(); - parseData = new ParseData(0, &variablesVector, &variableNames); + parseData = new ParseData(nullptr, &variablesVector, &variableNames); if (parseData == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - dotStandIn = (char16_t) -1; + dotStandIn = static_cast<char16_t>(-1); - UnicodeString *tempstr = nullptr; // used for memory allocation error checking + LocalPointer<UnicodeString> tempstr; // used for memory allocation error checking UnicodeString str; // scratch UnicodeString idBlockResult; int32_t pos = 0; @@ -943,7 +946,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, } // Skip lines starting with the comment character if (c == RULE_COMMENT_CHAR) { - pos = rule.indexOf((char16_t)0x000A /*\n*/, pos) + 1; + pos = rule.indexOf(static_cast<char16_t>(0x000A) /*\n*/, pos) + 1; if (pos == 0) { break; // No "\n" found; rest of rule is a comment } @@ -1029,17 +1032,16 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, pos = p; } else { if (parsingIDs) { - tempstr = new UnicodeString(idBlockResult); + tempstr.adoptInsteadAndCheckErrorCode(new UnicodeString(idBlockResult), status); // nullptr pointer check - if (tempstr == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + if (U_FAILURE(status)) { return; } U_ASSERT(idBlockVector.hasDeleter()); if (direction == UTRANS_FORWARD) - idBlockVector.adoptElement(tempstr, status); + idBlockVector.adoptElement(tempstr.orphan(), status); else - idBlockVector.insertElementAt(tempstr, 0, status); + idBlockVector.insertElementAt(tempstr.orphan(), 0, status); if (U_FAILURE(status)) { return; } @@ -1074,18 +1076,17 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, } if (parsingIDs && idBlockResult.length() > 0) { - tempstr = new UnicodeString(idBlockResult); + tempstr.adoptInsteadAndCheckErrorCode(new UnicodeString(idBlockResult), status); // nullptr pointer check - if (tempstr == nullptr) { + if (U_FAILURE(status)) { // TODO: Testing, forcing this path, shows many memory leaks. ICU-21701 // intltest translit/TransliteratorTest/TestInstantiation - status = U_MEMORY_ALLOCATION_ERROR; return; } if (direction == UTRANS_FORWARD) - idBlockVector.adoptElement(tempstr, status); + idBlockVector.adoptElement(tempstr.orphan(), status); else - idBlockVector.insertElementAt(tempstr, 0, status); + idBlockVector.insertElementAt(tempstr.orphan(), 0, status); if (U_FAILURE(status)) { return; } @@ -1106,12 +1107,12 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, // Convert the set vector to an array int32_t i, dataVectorSize = dataVector.size(); for (i = 0; i < dataVectorSize; i++) { - TransliterationRuleData* data = (TransliterationRuleData*)dataVector.elementAt(i); + TransliterationRuleData* data = static_cast<TransliterationRuleData*>(dataVector.elementAt(i)); data->variablesLength = variablesVector.size(); if (data->variablesLength == 0) { - data->variables = 0; + data->variables = nullptr; } else { - data->variables = (UnicodeFunctor**)uprv_malloc(data->variablesLength * sizeof(UnicodeFunctor*)); + data->variables = static_cast<UnicodeFunctor**>(uprv_malloc(data->variablesLength * sizeof(UnicodeFunctor*))); // nullptr pointer check if (data->variables == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -1129,12 +1130,12 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, int32_t p = UHASH_FIRST; const UHashElement* he = variableNames.nextElement(p); while (he != nullptr) { - UnicodeString* tempus = ((UnicodeString*)(he->value.pointer))->clone(); + UnicodeString* tempus = static_cast<UnicodeString*>(he->value.pointer)->clone(); if (tempus == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - data->variableNames.put(*((UnicodeString*)(he->key.pointer)), + data->variableNames.put(*static_cast<UnicodeString*>(he->key.pointer), tempus, status); he = variableNames.nextElement(p); } @@ -1150,10 +1151,10 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, } for (i = 0; i < dataVectorSize; i++) { - TransliterationRuleData* data = (TransliterationRuleData*)dataVector.elementAt(i); + TransliterationRuleData* data = static_cast<TransliterationRuleData*>(dataVector.elementAt(i)); data->ruleSet.freeze(parseError, status); } - if (idBlockVector.size() == 1 && ((UnicodeString*)idBlockVector.elementAt(0))->isEmpty()) { + if (idBlockVector.size() == 1 && static_cast<UnicodeString*>(idBlockVector.elementAt(0))->isEmpty()) { idBlockVector.removeElementAt(0); } } @@ -1168,10 +1169,10 @@ void TransliteratorParser::setVariableRange(int32_t start, int32_t end, UErrorCo return; } - curData->variablesBase = (char16_t) start; + curData->variablesBase = static_cast<char16_t>(start); if (dataVector.size() == 0) { - variableNext = (char16_t) start; - variableLimit = (char16_t) (end + 1); + variableNext = static_cast<char16_t>(start); + variableLimit = static_cast<char16_t>(end + 1); } } @@ -1365,12 +1366,12 @@ int32_t TransliteratorParser::parseRule(const UnicodeString& rule, int32_t pos, return syntaxError(U_MALFORMED_VARIABLE_DEFINITION, rule, start, status); } // We allow anything on the right, including an empty string. - UnicodeString* value = new UnicodeString(right->text); + LocalPointer<UnicodeString> value(new UnicodeString(right->text), status); // nullptr pointer check - if (value == nullptr) { + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } - variableNames.put(undefinedVariableName, value, status); + variableNames.put(undefinedVariableName, value.orphan(), status); ++variableLimit; return pos; } @@ -1451,30 +1452,32 @@ int32_t TransliteratorParser::parseRule(const UnicodeString& rule, int32_t pos, } // Flatten segment objects vector to an array - UnicodeFunctor** segmentsArray = nullptr; + LocalMemory<UnicodeFunctor*> segmentsArray; if (segmentObjects.size() > 0) { - segmentsArray = (UnicodeFunctor **)uprv_malloc(segmentObjects.size() * sizeof(UnicodeFunctor *)); + segmentsArray.adoptInstead(static_cast<UnicodeFunctor**>(uprv_malloc(segmentObjects.size() * sizeof(UnicodeFunctor*)))); // Null pointer check - if (segmentsArray == nullptr) { + if (segmentsArray.isNull()) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } - segmentObjects.toArray((void**) segmentsArray); + segmentObjects.toArray(reinterpret_cast<void**>(segmentsArray.getAlias())); } - TransliterationRule* temptr = new TransliterationRule( + LocalPointer<TransliterationRule> temptr(new TransliterationRule( left->text, left->ante, left->post, right->text, right->cursor, right->cursorOffset, - segmentsArray, + segmentsArray.getAlias(), segmentObjects.size(), left->anchorStart, left->anchorEnd, curData, - status); + status), status); //Null pointer check - if (temptr == nullptr) { - uprv_free(segmentsArray); + if (temptr.isValid()) { + segmentsArray.orphan(); + } + if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } - curData->ruleSet.addRule(temptr, status); + curData->ruleSet.addRule(temptr.orphan(), status); return pos; } @@ -1513,7 +1516,7 @@ int32_t TransliteratorParser::syntaxError(UErrorCode parseErrorCode, //null terminate the buffer parseError.postContext[stop-start]= 0; - status = (UErrorCode)parseErrorCode; + status = parseErrorCode; return pos; } @@ -1529,7 +1532,7 @@ char16_t TransliteratorParser::parseSet(const UnicodeString& rule, // Null pointer check if (set == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return (char16_t)0x0000; // Return empty character with error. + return static_cast<char16_t>(0x0000); // Return empty character with error. } set->compact(); return generateStandInFor(set, status); @@ -1546,7 +1549,7 @@ char16_t TransliteratorParser::generateStandInFor(UnicodeFunctor* adopted, UErro // (typical n is 0, 1, or 2); linear search is optimal. for (int32_t i=0; i<variablesVector.size(); ++i) { if (variablesVector.elementAt(i) == adopted) { // [sic] pointer comparison - return (char16_t) (curData->variablesBase + i); + return static_cast<char16_t>(curData->variablesBase + i); } } @@ -1619,14 +1622,13 @@ void TransliteratorParser::setSegmentObject(int32_t seg, StringMatcher* adopted, * time and reused thereafter. */ char16_t TransliteratorParser::getDotStandIn(UErrorCode& status) { - if (dotStandIn == (char16_t) -1) { - UnicodeSet* tempus = new UnicodeSet(UnicodeString(true, DOT_SET, -1), status); + if (dotStandIn == static_cast<char16_t>(-1)) { + LocalPointer<UnicodeSet> tempus(new UnicodeSet(UnicodeString(true, DOT_SET, -1), status), status); // Null pointer check. - if (tempus == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return (char16_t)0x0000; + if (U_FAILURE(status)) { + return static_cast<char16_t>(0x0000); } - dotStandIn = generateStandInFor(tempus, status); + dotStandIn = generateStandInFor(tempus.orphan(), status); } return dotStandIn; } @@ -1638,7 +1640,7 @@ char16_t TransliteratorParser::getDotStandIn(UErrorCode& status) { void TransliteratorParser::appendVariableDef(const UnicodeString& name, UnicodeString& buf, UErrorCode& status) { - const UnicodeString* s = (const UnicodeString*) variableNames.get(name); + const UnicodeString* s = static_cast<const UnicodeString*>(variableNames.get(name)); if (s == nullptr) { // We allow one undefined variable so that variable definition // statements work. For the first undefined variable we return @@ -1651,7 +1653,7 @@ void TransliteratorParser::appendVariableDef(const UnicodeString& name, status = U_ILLEGAL_ARGUMENT_ERROR; return; } - buf.append((char16_t) --variableLimit); + buf.append(--variableLimit); } else { //throw new IllegalArgumentException("Undefined variable $" // + name); @@ -1693,7 +1695,7 @@ utrans_stripRules(const char16_t *source, int32_t sourceLen, char16_t *target, U U16_NEXT_UNSAFE(source, index, c); source+=index; if(c == QUOTE) { - quoted = (UBool)!quoted; + quoted = !quoted; } else if (!quoted) { if (c == RULE_COMMENT_CHAR) { @@ -1739,7 +1741,7 @@ utrans_stripRules(const char16_t *source, int32_t sourceLen, char16_t *target, U } else if (c2 == QUOTE) { /* \' seen. Make sure we don't do anything when we see it again. */ - quoted = (UBool)!quoted; + quoted = !quoted; } } } diff --git a/deps/icu-small/source/i18n/rbt_rule.cpp b/deps/icu-small/source/i18n/rbt_rule.cpp index da8e4eaa1fb747..a39bb98772c011 100644 --- a/deps/icu-small/source/i18n/rbt_rule.cpp +++ b/deps/icu-small/source/i18n/rbt_rule.cpp @@ -50,7 +50,7 @@ U_NAMESPACE_BEGIN * segments, or null if there are none. The array itself is adopted, * but the pointers within it are not. * @param segsCount number of elements in segs[] - * @param anchorStart true if the the rule is anchored on the left to + * @param anchorStart true if the rule is anchored on the left to * the context start * @param anchorEnd true if the rule is anchored on the right to the * context limit @@ -65,7 +65,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, const TransliterationRuleData* theData, UErrorCode& status) : UMemory(), - segments(0), + segments(nullptr), data(theData) { if (U_FAILURE(status)) { @@ -121,7 +121,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, anteContext = new StringMatcher(pattern, 0, anteContextLength, false, *data); /* test for nullptr */ - if (anteContext == 0) { + if (anteContext == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -132,7 +132,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, key = new StringMatcher(pattern, anteContextLength, anteContextLength + keyLength, false, *data); /* test for nullptr */ - if (key == 0) { + if (key == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -144,7 +144,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, postContext = new StringMatcher(pattern, anteContextLength + keyLength, pattern.length(), false, *data); /* test for nullptr */ - if (postContext == 0) { + if (postContext == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -152,7 +152,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, this->output = new StringReplacer(outputStr, cursorPosition + cursorOffset, data); /* test for nullptr */ - if (this->output == 0) { + if (this->output == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -175,7 +175,7 @@ TransliterationRule::TransliterationRule(TransliterationRule& other) : segments = nullptr; segmentsCount = 0; if (other.segmentsCount > 0) { - segments = (UnicodeFunctor **)uprv_malloc(other.segmentsCount * sizeof(UnicodeFunctor *)); + segments = static_cast<UnicodeFunctor**>(uprv_malloc(other.segmentsCount * sizeof(UnicodeFunctor*))); uprv_memcpy(segments, other.segments, (size_t)other.segmentsCount*sizeof(segments[0])); } @@ -225,7 +225,7 @@ int16_t TransliterationRule::getIndexValue() const { return -1; } UChar32 c = pattern.char32At(anteContextLength); - return (int16_t)(data->lookupMatcher(c) == nullptr ? (c & 0xFF) : -1); + return static_cast<int16_t>(data->lookupMatcher(c) == nullptr ? (c & 0xFF) : -1); } /** @@ -481,27 +481,27 @@ UnicodeString& TransliterationRule::toRule(UnicodeString& rule, // Emit start anchor if ((flags & ANCHOR_START) != 0) { - rule.append((char16_t)94/*^*/); + rule.append(static_cast<char16_t>(94)/*^*/); } // Emit the input pattern ICU_Utility::appendToRule(rule, anteContext, escapeUnprintable, quoteBuf); if (emitBraces) { - ICU_Utility::appendToRule(rule, (char16_t) 0x007B /*{*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x007B) /*{*/, true, escapeUnprintable, quoteBuf); } ICU_Utility::appendToRule(rule, key, escapeUnprintable, quoteBuf); if (emitBraces) { - ICU_Utility::appendToRule(rule, (char16_t) 0x007D /*}*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x007D) /*}*/, true, escapeUnprintable, quoteBuf); } ICU_Utility::appendToRule(rule, postContext, escapeUnprintable, quoteBuf); // Emit end anchor if ((flags & ANCHOR_END) != 0) { - rule.append((char16_t)36/*$*/); + rule.append(static_cast<char16_t>(36)/*$*/); } ICU_Utility::appendToRule(rule, UnicodeString(true, FORWARD_OP, 3), true, escapeUnprintable, quoteBuf); @@ -511,7 +511,7 @@ UnicodeString& TransliterationRule::toRule(UnicodeString& rule, ICU_Utility::appendToRule(rule, output->toReplacer()->toReplacerPattern(str, escapeUnprintable), true, escapeUnprintable, quoteBuf); - ICU_Utility::appendToRule(rule, (char16_t) 0x003B /*;*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x003B) /*;*/, true, escapeUnprintable, quoteBuf); return rule; } diff --git a/deps/icu-small/source/i18n/rbt_rule.h b/deps/icu-small/source/i18n/rbt_rule.h index c6f5151d4cf0bb..755fc8d0506f4d 100644 --- a/deps/icu-small/source/i18n/rbt_rule.h +++ b/deps/icu-small/source/i18n/rbt_rule.h @@ -172,7 +172,7 @@ class TransliterationRule : public UMemory { * segments, or null if there are none. The array itself is adopted, * but the pointers within it are not. * @param segsCount number of elements in segs[]. - * @param anchorStart true if the the rule is anchored on the left to + * @param anchorStart true if the rule is anchored on the left to * the context start. * @param anchorEnd true if the rule is anchored on the right to the * context limit. diff --git a/deps/icu-small/source/i18n/rbt_set.cpp b/deps/icu-small/source/i18n/rbt_set.cpp index c0a2ccd8687053..93852d9af97668 100644 --- a/deps/icu-small/source/i18n/rbt_set.cpp +++ b/deps/icu-small/source/i18n/rbt_set.cpp @@ -193,11 +193,11 @@ TransliterationRuleSet::TransliterationRuleSet(const TransliterationRuleSet& oth len = other.ruleVector->size(); for (i=0; i<len && U_SUCCESS(status); ++i) { LocalPointer<TransliterationRule> tempTranslitRule( - new TransliterationRule(*(TransliterationRule*)other.ruleVector->elementAt(i)), status); + new TransliterationRule(*static_cast<TransliterationRule*>(other.ruleVector->elementAt(i))), status); ruleVector->adoptElement(tempTranslitRule.orphan(), status); } } - if (other.rules != 0 && U_SUCCESS(status)) { + if (other.rules != nullptr && U_SUCCESS(status)) { UParseError p; freeze(p, status); } @@ -253,7 +253,7 @@ void TransliterationRuleSet::addRule(TransliterationRule* adoptedRule, } uprv_free(rules); - rules = 0; + rules = nullptr; } /** @@ -295,14 +295,14 @@ void TransliterationRuleSet::freeze(UParseError& parseError,UErrorCode& status) /* Precompute the index values. This saves a LOT of time. * Be careful not to call malloc(0). */ - int16_t* indexValue = (int16_t*) uprv_malloc( sizeof(int16_t) * (n > 0 ? n : 1) ); + int16_t* indexValue = static_cast<int16_t*>(uprv_malloc(sizeof(int16_t) * (n > 0 ? n : 1))); /* test for nullptr */ - if (indexValue == 0) { + if (indexValue == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } for (j=0; j<n; ++j) { - TransliterationRule* r = (TransliterationRule*) ruleVector->elementAt(j); + TransliterationRule* r = static_cast<TransliterationRule*>(ruleVector->elementAt(j)); indexValue[j] = r->getIndexValue(); } for (x=0; x<256; ++x) { @@ -317,8 +317,8 @@ void TransliterationRuleSet::freeze(UParseError& parseError,UErrorCode& status) // a set, and we must use the more time-consuming // matchesIndexValue check. In practice this happens // rarely, so we seldom treat this code path. - TransliterationRule* r = (TransliterationRule*) ruleVector->elementAt(j); - if (r->matchesIndexValue((uint8_t)x)) { + TransliterationRule* r = static_cast<TransliterationRule*>(ruleVector->elementAt(j)); + if (r->matchesIndexValue(static_cast<uint8_t>(x))) { v.addElement(r, status); } } @@ -339,14 +339,14 @@ void TransliterationRuleSet::freeze(UParseError& parseError,UErrorCode& status) rules = nullptr; return; } - rules = (TransliterationRule **)uprv_malloc(v.size() * sizeof(TransliterationRule *)); + rules = static_cast<TransliterationRule**>(uprv_malloc(v.size() * sizeof(TransliterationRule*))); /* test for nullptr */ - if (rules == 0) { + if (rules == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } for (j=0; j<v.size(); ++j) { - rules[j] = (TransliterationRule*) v.elementAt(j); + rules[j] = static_cast<TransliterationRule*>(v.elementAt(j)); } // TODO Add error reporting that indicates the rules that @@ -401,7 +401,7 @@ void TransliterationRuleSet::freeze(UParseError& parseError,UErrorCode& status) UBool TransliterationRuleSet::transliterate(Replaceable& text, UTransPosition& pos, UBool incremental) { - int16_t indexByte = (int16_t) (text.char32At(pos.start) & 0xFF); + int16_t indexByte = static_cast<int16_t>(text.char32At(pos.start) & 0xFF); for (int32_t i=index[indexByte]; i<index[indexByte+1]; ++i) { UMatchDegree m = rules[i]->matchAndReplace(text, pos, incremental); switch (m) { @@ -431,10 +431,10 @@ UnicodeString& TransliterationRuleSet::toRules(UnicodeString& ruleSource, ruleSource.truncate(0); for (i=0; i<count; ++i) { if (i != 0) { - ruleSource.append((char16_t) 0x000A /*\n*/); + ruleSource.append(static_cast<char16_t>(0x000A) /*\n*/); } TransliterationRule *r = - (TransliterationRule*) ruleVector->elementAt(i); + static_cast<TransliterationRule*>(ruleVector->elementAt(i)); r->toRule(ruleSource, escapeUnprintable); } return ruleSource; @@ -451,7 +451,7 @@ UnicodeSet& TransliterationRuleSet::getSourceTargetSet(UnicodeSet& result, int32_t count = ruleVector->size(); for (int32_t i=0; i<count; ++i) { TransliterationRule* r = - (TransliterationRule*) ruleVector->elementAt(i); + static_cast<TransliterationRule*>(ruleVector->elementAt(i)); if (getTarget) { r->addTargetSetTo(result); } else { diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp index e4d71436c58c61..ad79bd60b164f9 100644 --- a/deps/icu-small/source/i18n/rbtz.cpp +++ b/deps/icu-small/source/i18n/rbtz.cpp @@ -49,8 +49,8 @@ static UBool compareRules(UVector* rules1, UVector* rules2) { return false; } for (int32_t i = 0; i < size; i++) { - TimeZoneRule *r1 = (TimeZoneRule*)rules1->elementAt(i); - TimeZoneRule *r2 = (TimeZoneRule*)rules2->elementAt(i); + TimeZoneRule* r1 = static_cast<TimeZoneRule*>(rules1->elementAt(i)); + TimeZoneRule* r2 = static_cast<TimeZoneRule*>(rules2->elementAt(i)); if (*r1 != *r2) { return false; } @@ -195,7 +195,7 @@ RuleBasedTimeZone::complete(UErrorCode& status) { if (fHistoricRules != nullptr && fHistoricRules->size() > 0) { int32_t i; int32_t historicCount = fHistoricRules->size(); - LocalMemory<bool> done((bool *)uprv_malloc(sizeof(bool) * historicCount)); + LocalMemory<bool> done(static_cast<bool*>(uprv_malloc(sizeof(bool) * historicCount))); if (done == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto cleanup; @@ -218,7 +218,7 @@ RuleBasedTimeZone::complete(UErrorCode& status) { if (done[i]) { continue; } - r = (TimeZoneRule*)fHistoricRules->elementAt(i); + r = static_cast<TimeZoneRule*>(fHistoricRules->elementAt(i)); avail = r->getNextStart(lastTransitionTime, curStdOffset, curDstSavings, false, tt); if (!avail) { // No more transitions from this rule - skip this rule next time @@ -254,11 +254,11 @@ RuleBasedTimeZone::complete(UErrorCode& status) { if (fFinalRules != nullptr) { // Check if one of final rules has earlier transition date for (i = 0; i < 2 /* fFinalRules->size() */; i++) { - TimeZoneRule *fr = (TimeZoneRule*)fFinalRules->elementAt(i); + TimeZoneRule* fr = static_cast<TimeZoneRule*>(fFinalRules->elementAt(i)); if (*fr == *curRule) { continue; } - r = (TimeZoneRule*)fFinalRules->elementAt(i); + r = static_cast<TimeZoneRule*>(fFinalRules->elementAt(i)); avail = r->getNextStart(lastTransitionTime, curStdOffset, curDstSavings, false, tt); if (avail) { if (tt < nextTransitionTime) { @@ -307,8 +307,8 @@ RuleBasedTimeZone::complete(UErrorCode& status) { fHistoricTransitions = lpHistoricTransitions.orphan(); } // Append the first transition for each - TimeZoneRule *rule0 = (TimeZoneRule*)fFinalRules->elementAt(0); - TimeZoneRule *rule1 = (TimeZoneRule*)fFinalRules->elementAt(1); + TimeZoneRule* rule0 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(0)); + TimeZoneRule* rule1 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(1)); UDate tt0, tt1; UBool avail0 = rule0->getNextStart(lastTransitionTime, curRule->getRawOffset(), curRule->getDSTSavings(), false, tt0); UBool avail1 = rule1->getNextStart(lastTransitionTime, curRule->getRawOffset(), curRule->getDSTSavings(), false, tt1); @@ -385,7 +385,7 @@ RuleBasedTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t d year = 1 - year; } int32_t rawOffset, dstOffset; - UDate time = (UDate)Grego::fieldsToDay(year, month, day) * U_MILLIS_PER_DAY + millis; + UDate time = static_cast<UDate>(Grego::fieldsToDay(year, month, day)) * U_MILLIS_PER_DAY + millis; getOffsetInternal(time, true, kDaylight, kStandard, rawOffset, dstOffset, status); if (U_FAILURE(status)) { return 0; @@ -431,13 +431,13 @@ RuleBasedTimeZone::getOffsetInternal(UDate date, UBool local, if (fHistoricTransitions == nullptr) { rule = fInitialRule; } else { - UDate tstart = getTransitionTime((Transition*)fHistoricTransitions->elementAt(0), + UDate tstart = getTransitionTime(static_cast<Transition*>(fHistoricTransitions->elementAt(0)), local, NonExistingTimeOpt, DuplicatedTimeOpt); if (date < tstart) { rule = fInitialRule; } else { int32_t idx = fHistoricTransitions->size() - 1; - UDate tend = getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx), + UDate tend = getTransitionTime(static_cast<Transition*>(fHistoricTransitions->elementAt(idx)), local, NonExistingTimeOpt, DuplicatedTimeOpt); if (date > tend) { if (fFinalRules != nullptr) { @@ -446,18 +446,18 @@ RuleBasedTimeZone::getOffsetInternal(UDate date, UBool local, if (rule == nullptr) { // no final rules or the given time is before the first transition // specified by the final rules -> use the last rule - rule = ((Transition*)fHistoricTransitions->elementAt(idx))->to; + rule = static_cast<Transition*>(fHistoricTransitions->elementAt(idx))->to; } } else { // Find a historical transition while (idx >= 0) { - if (date >= getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx), + if (date >= getTransitionTime(static_cast<Transition*>(fHistoricTransitions->elementAt(idx)), local, NonExistingTimeOpt, DuplicatedTimeOpt)) { break; } idx--; } - rule = ((Transition*)fHistoricTransitions->elementAt(idx))->to; + rule = static_cast<Transition*>(fHistoricTransitions->elementAt(idx))->to; } } } @@ -605,14 +605,14 @@ RuleBasedTimeZone::getTimeZoneRules(const InitialTimeZoneRule*& initial, int32_t historicCount = fHistoricRules->size(); idx = 0; while (cnt < trscount && idx < historicCount) { - trsrules[cnt++] = (const TimeZoneRule*)fHistoricRules->elementAt(idx++); + trsrules[cnt++] = static_cast<const TimeZoneRule*>(fHistoricRules->elementAt(idx++)); } } if (fFinalRules != nullptr && cnt < trscount) { int32_t finalCount = fFinalRules->size(); idx = 0; while (cnt < trscount && idx < finalCount) { - trsrules[cnt++] = (const TimeZoneRule*)fFinalRules->elementAt(idx++); + trsrules[cnt++] = static_cast<const TimeZoneRule*>(fFinalRules->elementAt(idx++)); } } // Set the result length @@ -635,9 +635,7 @@ RuleBasedTimeZone::deleteRules() { void RuleBasedTimeZone::deleteTransitions() { - if (fHistoricTransitions != nullptr) { - delete fHistoricTransitions; - } + delete fHistoricTransitions; fHistoricTransitions = nullptr; } @@ -654,7 +652,7 @@ RuleBasedTimeZone::copyRules(UVector* source) { } int32_t i; for (i = 0; i < size; i++) { - LocalPointer<TimeZoneRule> rule(((TimeZoneRule*)source->elementAt(i))->clone(), ec); + LocalPointer<TimeZoneRule> rule(static_cast<TimeZoneRule*>(source->elementAt(i))->clone(), ec); rules->adoptElement(rule.orphan(), ec); if (U_FAILURE(ec)) { return nullptr; @@ -670,8 +668,8 @@ RuleBasedTimeZone::findRuleInFinal(UDate date, UBool local, return nullptr; } - AnnualTimeZoneRule* fr0 = (AnnualTimeZoneRule*)fFinalRules->elementAt(0); - AnnualTimeZoneRule* fr1 = (AnnualTimeZoneRule*)fFinalRules->elementAt(1); + AnnualTimeZoneRule* fr0 = static_cast<AnnualTimeZoneRule*>(fFinalRules->elementAt(0)); + AnnualTimeZoneRule* fr1 = static_cast<AnnualTimeZoneRule*>(fFinalRules->elementAt(1)); if (fr0 == nullptr || fr1 == nullptr) { return nullptr; } @@ -720,14 +718,14 @@ RuleBasedTimeZone::findNext(UDate base, UBool inclusive, UDate& transitionTime, UBool isFinal = false; UBool found = false; Transition result; - Transition *tzt = (Transition*)fHistoricTransitions->elementAt(0); + Transition* tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(0)); UDate tt = tzt->time; if (tt > base || (inclusive && tt == base)) { result = *tzt; found = true; } else { int32_t idx = fHistoricTransitions->size() - 1; - tzt = (Transition*)fHistoricTransitions->elementAt(idx); + tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(idx)); tt = tzt->time; if (inclusive && tt == base) { result = *tzt; @@ -735,8 +733,8 @@ RuleBasedTimeZone::findNext(UDate base, UBool inclusive, UDate& transitionTime, } else if (tt <= base) { if (fFinalRules != nullptr) { // Find a transion time with finalRules - TimeZoneRule *r0 = (TimeZoneRule*)fFinalRules->elementAt(0); - TimeZoneRule *r1 = (TimeZoneRule*)fFinalRules->elementAt(1); + TimeZoneRule* r0 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(0)); + TimeZoneRule* r1 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(1)); UDate start0, start1; UBool avail0 = r0->getNextStart(base, r1->getRawOffset(), r1->getDSTSavings(), inclusive, start0); UBool avail1 = r1->getNextStart(base, r0->getRawOffset(), r0->getDSTSavings(), inclusive, start1); @@ -761,7 +759,7 @@ RuleBasedTimeZone::findNext(UDate base, UBool inclusive, UDate& transitionTime, idx--; Transition *prev = tzt; while (idx > 0) { - tzt = (Transition*)fHistoricTransitions->elementAt(idx); + tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(idx)); tt = tzt->time; if (tt < base || (!inclusive && tt == base)) { break; @@ -803,14 +801,14 @@ RuleBasedTimeZone::findPrev(UDate base, UBool inclusive, UDate& transitionTime, } UBool found = false; Transition result; - Transition *tzt = (Transition*)fHistoricTransitions->elementAt(0); + Transition* tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(0)); UDate tt = tzt->time; if (inclusive && tt == base) { result = *tzt; found = true; } else if (tt < base) { int32_t idx = fHistoricTransitions->size() - 1; - tzt = (Transition*)fHistoricTransitions->elementAt(idx); + tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(idx)); tt = tzt->time; if (inclusive && tt == base) { result = *tzt; @@ -818,8 +816,8 @@ RuleBasedTimeZone::findPrev(UDate base, UBool inclusive, UDate& transitionTime, } else if (tt < base) { if (fFinalRules != nullptr) { // Find a transion time with finalRules - TimeZoneRule *r0 = (TimeZoneRule*)fFinalRules->elementAt(0); - TimeZoneRule *r1 = (TimeZoneRule*)fFinalRules->elementAt(1); + TimeZoneRule* r0 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(0)); + TimeZoneRule* r1 = static_cast<TimeZoneRule*>(fFinalRules->elementAt(1)); UDate start0, start1; UBool avail0 = r0->getPreviousStart(base, r1->getRawOffset(), r1->getDSTSavings(), inclusive, start0); UBool avail1 = r1->getPreviousStart(base, r0->getRawOffset(), r0->getDSTSavings(), inclusive, start1); @@ -844,7 +842,7 @@ RuleBasedTimeZone::findPrev(UDate base, UBool inclusive, UDate& transitionTime, // Find a transition within the historic transitions idx--; while (idx >= 0) { - tzt = (Transition*)fHistoricTransitions->elementAt(idx); + tzt = static_cast<Transition*>(fHistoricTransitions->elementAt(idx)); tt = tzt->time; if (tt < base || (inclusive && tt == base)) { break; diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp index 0a0d095ca462f8..881fa8e5777933 100644 --- a/deps/icu-small/source/i18n/regexcmp.cpp +++ b/deps/icu-small/source/i18n/regexcmp.cpp @@ -165,7 +165,7 @@ void RegexCompile::compile( // Main loop for the regex pattern parsing state machine. // Runs once per state transition. // Each time through optionally performs, depending on the state table, - // - an advance to the the next pattern char + // - an advance to the next pattern char // - an action to be performed. // - pushing or popping a state to/from the local state return stack. // file regexcst.txt is the source for the state table. The logic behind @@ -207,14 +207,14 @@ void RegexCompile::compile( // Table row specified "quoted" and the char was quoted. break; } - if (tableEl->fCharClass == 253 && fC.fChar == (UChar32)-1) { + if (tableEl->fCharClass == 253 && fC.fChar == static_cast<UChar32>(-1)) { // Table row specified eof and we hit eof on the input. break; } if (tableEl->fCharClass >= 128 && tableEl->fCharClass < 240 && // Table specs a char class && fC.fQuoted == false && // char is not escaped && - fC.fChar != (UChar32)-1) { // char is not EOF + fC.fChar != static_cast<UChar32>(-1)) { // char is not EOF U_ASSERT(tableEl->fCharClass <= 137); if (RegexStaticSets::gStaticSets->fRuleSets[tableEl->fCharClass-128].contains(fC.fChar)) { // Table row specified a character class, or set of characters, @@ -323,7 +323,7 @@ void RegexCompile::compile( } int32_t i; for (i=0; i<numSets; i++) { - UnicodeSet *s = (UnicodeSet *)fRXPat->fSets->elementAt(i); + UnicodeSet* s = static_cast<UnicodeSet*>(fRXPat->fSets->elementAt(i)); fRXPat->fSets8[i].init(s); } @@ -347,7 +347,7 @@ UBool RegexCompile::doParseActions(int32_t action) { UBool returnVal = true; - switch ((Regex_PatternParseAction)action) { + switch (static_cast<Regex_PatternParseAction>(action)) { case doPatStart: // Start of pattern compiles to: @@ -403,7 +403,7 @@ UBool RegexCompile::doParseActions(int32_t action) // side fails to match and backtracks. Locate the position for the // save from the location on the top of the parentheses stack. int32_t savePosition = fParenStack.popi(); - int32_t op = (int32_t)fRXPat->fCompiledPat->elementAti(savePosition); + int32_t op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(savePosition)); U_ASSERT(URX_TYPE(op) == URX_NOP); // original contents of reserved location op = buildOp(URX_STATE_SAVE, fRXPat->fCompiledPat->size()+1); fRXPat->fCompiledPat->setElementAt(op, savePosition); @@ -793,7 +793,7 @@ UBool RegexCompile::doParseActions(int32_t action) // Check for simple constructs, which may get special optimized code. if (topLoc == fRXPat->fCompiledPat->size() - 1) { - int32_t repeatedOp = (int32_t)fRXPat->fCompiledPat->elementAti(topLoc); + int32_t repeatedOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(topLoc)); if (URX_TYPE(repeatedOp) == URX_SETREF) { // Emit optimized code for [char set]+ @@ -925,7 +925,7 @@ UBool RegexCompile::doParseActions(int32_t action) // Check for simple *, where the construct being repeated // compiled to single opcode, and might be optimizable. if (topLoc == fRXPat->fCompiledPat->size() - 1) { - int32_t repeatedOp = (int32_t)fRXPat->fCompiledPat->elementAti(topLoc); + int32_t repeatedOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(topLoc)); if (URX_TYPE(repeatedOp) == URX_SETREF) { // Emit optimized code for a [char set]* @@ -1015,11 +1015,11 @@ UBool RegexCompile::doParseActions(int32_t action) { int32_t digitValue = u_charDigitValue(fC.fChar); U_ASSERT(digitValue >= 0); - int64_t val = (int64_t)fIntervalLow*10 + digitValue; + int64_t val = static_cast<int64_t>(fIntervalLow) * 10 + digitValue; if (val > INT32_MAX) { error(U_REGEX_NUMBER_TOO_BIG); } else { - fIntervalLow = (int32_t)val; + fIntervalLow = static_cast<int32_t>(val); } } break; @@ -1032,11 +1032,11 @@ UBool RegexCompile::doParseActions(int32_t action) } int32_t digitValue = u_charDigitValue(fC.fChar); U_ASSERT(digitValue >= 0); - int64_t val = (int64_t)fIntervalUpper*10 + digitValue; + int64_t val = static_cast<int64_t>(fIntervalUpper) * 10 + digitValue; if (val > INT32_MAX) { error(U_REGEX_NUMBER_TOO_BIG); } else { - fIntervalUpper = (int32_t)val; + fIntervalUpper = static_cast<int32_t>(val); } } break; @@ -1075,7 +1075,7 @@ UBool RegexCompile::doParseActions(int32_t action) int32_t op = buildOp(URX_STO_SP, varLoc); fRXPat->fCompiledPat->setElementAt(op, topLoc); - int32_t loopOp = (int32_t)fRXPat->fCompiledPat->popi(); + int32_t loopOp = static_cast<int32_t>(fRXPat->fCompiledPat->popi()); U_ASSERT(URX_TYPE(loopOp) == URX_CTR_LOOP && URX_VAL(loopOp) == topLoc); loopOp++; // point LoopOp after the just-inserted STO_SP fRXPat->fCompiledPat->push(loopOp, *fStatus); @@ -1545,28 +1545,28 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetAddAmp: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); set->add(chAmp); } break; case doSetAddDash: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); set->add(chDash); } break; case doSetBackslash_s: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); set->addAll(RegexStaticSets::gStaticSets->fPropSets[URX_ISSPACE_SET]); break; } case doSetBackslash_S: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet SSet; SSet.addAll(RegexStaticSets::gStaticSets->fPropSets[URX_ISSPACE_SET]).complement(); set->addAll(SSet); @@ -1575,7 +1575,7 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetBackslash_d: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); // TODO - make a static set, ticket 6058. addCategory(set, U_GC_ND_MASK, *fStatus); break; @@ -1583,7 +1583,7 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetBackslash_D: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet digits; // TODO - make a static set, ticket 6058. digits.applyIntPropertyValue(UCHAR_GENERAL_CATEGORY_MASK, U_GC_ND_MASK, *fStatus); @@ -1594,20 +1594,20 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetBackslash_h: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet h; h.applyIntPropertyValue(UCHAR_GENERAL_CATEGORY_MASK, U_GC_ZS_MASK, *fStatus); - h.add((UChar32)9); // Tab + h.add(static_cast<UChar32>(9)); // Tab set->addAll(h); break; } case doSetBackslash_H: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet h; h.applyIntPropertyValue(UCHAR_GENERAL_CATEGORY_MASK, U_GC_ZS_MASK, *fStatus); - h.add((UChar32)9); // Tab + h.add(static_cast<UChar32>(9)); // Tab h.complement(); set->addAll(h); break; @@ -1615,20 +1615,20 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetBackslash_v: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); - set->add((UChar32)0x0a, (UChar32)0x0d); // add range - set->add((UChar32)0x85); - set->add((UChar32)0x2028, (UChar32)0x2029); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); + set->add(static_cast<UChar32>(0x0a), static_cast<UChar32>(0x0d)); // add range + set->add(static_cast<UChar32>(0x85)); + set->add(static_cast<UChar32>(0x2028), static_cast<UChar32>(0x2029)); break; } case doSetBackslash_V: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet v; - v.add((UChar32)0x0a, (UChar32)0x0d); // add range - v.add((UChar32)0x85); - v.add((UChar32)0x2028, (UChar32)0x2029); + v.add(static_cast<UChar32>(0x0a), static_cast<UChar32>(0x0d)); // add range + v.add(static_cast<UChar32>(0x85)); + v.add(static_cast<UChar32>(0x2028), static_cast<UChar32>(0x2029)); v.complement(); set->addAll(v); break; @@ -1636,14 +1636,14 @@ UBool RegexCompile::doParseActions(int32_t action) case doSetBackslash_w: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); set->addAll(RegexStaticSets::gStaticSets->fPropSets[URX_ISWORD_SET]); break; } case doSetBackslash_W: { - UnicodeSet *set = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* set = static_cast<UnicodeSet*>(fSetStack.peek()); UnicodeSet SSet; SSet.addAll(RegexStaticSets::gStaticSets->fPropSets[URX_ISWORD_SET]).complement(); set->addAll(SSet); @@ -1716,7 +1716,7 @@ UBool RegexCompile::doParseActions(int32_t action) // the operator stack should be empty and the operand stack should have just // one entry, the result set. U_ASSERT(fSetOpStack.empty()); - UnicodeSet *theSet = (UnicodeSet *)fSetStack.pop(); + UnicodeSet* theSet = static_cast<UnicodeSet*>(fSetStack.pop()); U_ASSERT(fSetStack.empty()); compileSet(theSet); break; @@ -1735,7 +1735,7 @@ UBool RegexCompile::doParseActions(int32_t action) // as union-ing in a literal' { setEval(setUnion); - UnicodeSet *s = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* s = static_cast<UnicodeSet*>(fSetStack.peek()); s->add(fC.fChar); fLastSetLiteral = fC.fChar; break; @@ -1752,7 +1752,7 @@ UBool RegexCompile::doParseActions(int32_t action) error(U_REGEX_BAD_ESCAPE_SEQUENCE); } setEval(setUnion); - UnicodeSet *s = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* s = static_cast<UnicodeSet*>(fSetStack.peek()); s->add(fC.fChar); fLastSetLiteral = fC.fChar; break; @@ -1765,7 +1765,7 @@ UBool RegexCompile::doParseActions(int32_t action) { UChar32 c = scanNamedChar(); setEval(setUnion); - UnicodeSet *s = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* s = static_cast<UnicodeSet*>(fSetStack.peek()); s->add(c); fLastSetLiteral = c; break; @@ -1782,7 +1782,7 @@ UBool RegexCompile::doParseActions(int32_t action) if (U_SUCCESS(*fStatus) && (fLastSetLiteral == U_SENTINEL || fLastSetLiteral > c)) { error(U_REGEX_INVALID_RANGE); } - UnicodeSet *s = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* s = static_cast<UnicodeSet*>(fSetStack.peek()); s->add(fLastSetLiteral, c); fLastSetLiteral = c; break; @@ -1821,7 +1821,7 @@ UBool RegexCompile::doParseActions(int32_t action) { UnicodeSet *s = scanPosixProp(); if (s != nullptr) { - UnicodeSet *tos = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* tos = static_cast<UnicodeSet*>(fSetStack.peek()); tos->addAll(*s); delete s; } // else error. scanProp() reported the error status already. @@ -1833,7 +1833,7 @@ UBool RegexCompile::doParseActions(int32_t action) { UnicodeSet *s = scanProp(); if (s != nullptr) { - UnicodeSet *tos = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* tos = static_cast<UnicodeSet*>(fSetStack.peek()); tos->addAll(*s); delete s; } // else error. scanProp() reported the error status already. @@ -1852,7 +1852,7 @@ UBool RegexCompile::doParseActions(int32_t action) if (fLastSetLiteral == U_SENTINEL || fLastSetLiteral > fC.fChar) { error(U_REGEX_INVALID_RANGE); } - UnicodeSet *s = (UnicodeSet *)fSetStack.peek(); + UnicodeSet* s = static_cast<UnicodeSet*>(fSetStack.peek()); s->add(fLastSetLiteral, fC.fChar); break; } @@ -2026,7 +2026,7 @@ void RegexCompile::insertOp(int32_t where) { // were moved down by the insert. Fix them. int32_t loc; for (loc=0; loc<code->size(); loc++) { - int32_t op = (int32_t)code->elementAti(loc); + int32_t op = static_cast<int32_t>(code->elementAti(loc)); int32_t opType = URX_TYPE(op); int32_t opValue = URX_VAL(op); if ((opType == URX_JMP || @@ -2152,7 +2152,7 @@ int32_t RegexCompile::blockTopLoc(UBool reserveLoc) { // No slot for STATE_SAVE was pre-reserved in the compiled code. // We need to make space now. theLoc = fRXPat->fCompiledPat->size()-1; - int32_t opAtTheLoc = (int32_t)fRXPat->fCompiledPat->elementAti(theLoc); + int32_t opAtTheLoc = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(theLoc)); if (URX_TYPE(opAtTheLoc) == URX_STRING_LEN) { // Strings take two opcode, we want the position of the first one. // We can have a string at this point if a single character case-folded to two. @@ -2202,7 +2202,7 @@ void RegexCompile::handleCloseParen() { break; } U_ASSERT(patIdx>0 && patIdx <= fRXPat->fCompiledPat->size()); - patOp = (int32_t)fRXPat->fCompiledPat->elementAti(patIdx); + patOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(patIdx)); U_ASSERT(URX_VAL(patOp) == 0); // Branch target for JMP should not be set. patOp |= fRXPat->fCompiledPat->size(); // Set it now. fRXPat->fCompiledPat->setElementAt(patOp, patIdx); @@ -2230,7 +2230,7 @@ void RegexCompile::handleCloseParen() { // The frame offset of the variables for this cg is obtained from the // start capture op and put it into the end-capture op. { - int32_t captureOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen+1); + int32_t captureOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen + 1)); U_ASSERT(URX_TYPE(captureOp) == URX_START_CAPTURE); int32_t frameVarLocation = URX_VAL(captureOp); @@ -2242,7 +2242,7 @@ void RegexCompile::handleCloseParen() { // Insert a LD_SP operation to restore the state stack to the position // it was when the atomic parens were entered. { - int32_t stoOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen+1); + int32_t stoOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen + 1)); U_ASSERT(URX_TYPE(stoOp) == URX_STO_SP); int32_t stoLoc = URX_VAL(stoOp); appendOp(URX_LD_SP, stoLoc); @@ -2251,7 +2251,7 @@ void RegexCompile::handleCloseParen() { case lookAhead: { - int32_t startOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen-5); + int32_t startOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen - 5)); U_ASSERT(URX_TYPE(startOp) == URX_LA_START); int32_t dataLoc = URX_VAL(startOp); appendOp(URX_LA_END, dataLoc); @@ -2261,7 +2261,7 @@ void RegexCompile::handleCloseParen() { case negLookAhead: { // See comment at doOpenLookAheadNeg - int32_t startOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen-1); + int32_t startOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen - 1)); U_ASSERT(URX_TYPE(startOp) == URX_LA_START); int32_t dataLoc = URX_VAL(startOp); appendOp(URX_LA_END, dataLoc); @@ -2270,7 +2270,7 @@ void RegexCompile::handleCloseParen() { // Patch the URX_SAVE near the top of the block. // The destination of the SAVE is the final LA_END that was just added. - int32_t saveOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen); + int32_t saveOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen)); U_ASSERT(URX_TYPE(saveOp) == URX_STATE_SAVE); int32_t dest = fRXPat->fCompiledPat->size()-1; saveOp = buildOp(URX_STATE_SAVE, dest); @@ -2283,7 +2283,7 @@ void RegexCompile::handleCloseParen() { // See comment at doOpenLookBehind. // Append the URX_LB_END and URX_LA_END to the compiled pattern. - int32_t startOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen-4); + int32_t startOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen - 4)); U_ASSERT(URX_TYPE(startOp) == URX_LB_START); int32_t dataLoc = URX_VAL(startOp); appendOp(URX_LB_END, dataLoc); @@ -2327,7 +2327,7 @@ void RegexCompile::handleCloseParen() { // See comment at doOpenLookBehindNeg. // Append the URX_LBN_END to the compiled pattern. - int32_t startOp = (int32_t)fRXPat->fCompiledPat->elementAti(fMatchOpenParen-5); + int32_t startOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(fMatchOpenParen - 5)); U_ASSERT(URX_TYPE(startOp) == URX_LB_START); int32_t dataLoc = URX_VAL(startOp); appendOp(URX_LBN_END, dataLoc); @@ -2535,7 +2535,7 @@ UBool RegexCompile::compileInlineInterval() { // Pick up the opcode that is to be repeated // - int32_t op = (int32_t)fRXPat->fCompiledPat->elementAti(topOfBlock); + int32_t op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(topOfBlock)); // Compute the pattern location where the inline sequence // will end, and set up the state save op that will be needed. @@ -2718,7 +2718,7 @@ void RegexCompile::matchStartType() { } for (loc = 3; loc<end; loc++) { - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); opType = URX_TYPE(op); // The loop is advancing linearly through the pattern. @@ -2785,7 +2785,7 @@ void RegexCompile::matchStartType() { if (currentLen == 0) { int32_t sn = URX_VAL(op); U_ASSERT(sn > 0 && sn < fRXPat->fSets->size()); - const UnicodeSet *s = (UnicodeSet *)fRXPat->fSets->elementAt(sn); + const UnicodeSet* s = static_cast<UnicodeSet*>(fRXPat->fSets->elementAt(sn)); fRXPat->fInitialChars->addAll(*s); numInitialStrings += 2; } @@ -2799,7 +2799,7 @@ void RegexCompile::matchStartType() { if (currentLen == 0) { int32_t sn = URX_VAL(op); U_ASSERT(sn > 0 && sn < fRXPat->fSets->size()); - const UnicodeSet *s = (UnicodeSet *)fRXPat->fSets->elementAt(sn); + const UnicodeSet* s = static_cast<UnicodeSet*>(fRXPat->fSets->elementAt(sn)); fRXPat->fInitialChars->addAll(*s); numInitialStrings += 2; } @@ -2867,7 +2867,7 @@ void RegexCompile::matchStartType() { if (currentLen == 0) { UnicodeSet s; s.applyIntPropertyValue(UCHAR_GENERAL_CATEGORY_MASK, U_GC_ZS_MASK, *fStatus); - s.add((UChar32)9); // Tab + s.add(static_cast<UChar32>(9)); // Tab if (URX_VAL(op) != 0) { s.complement(); } @@ -2883,9 +2883,9 @@ void RegexCompile::matchStartType() { case URX_BACKSLASH_V: // Any line ending code point, with optional negation if (currentLen == 0) { UnicodeSet s; - s.add((UChar32)0x0a, (UChar32)0x0d); // add range - s.add((UChar32)0x85); - s.add((UChar32)0x2028, (UChar32)0x2029); + s.add(static_cast<UChar32>(0x0a), static_cast<UChar32>(0x0d)); // add range + s.add(static_cast<UChar32>(0x85)); + s.add(static_cast<UChar32>(0x2028), static_cast<UChar32>(0x2029)); if (URX_VAL(op) != 0) { // Complement option applies to URX_BACKSLASH_V only. s.complement(); @@ -2995,7 +2995,7 @@ void RegexCompile::matchStartType() { case URX_STRING: { loc++; - int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t stringLenOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); int32_t stringLen = URX_VAL(stringLenOp); U_ASSERT(URX_TYPE(stringLenOp) == URX_STRING_LEN); U_ASSERT(stringLenOp >= 2); @@ -3024,7 +3024,7 @@ void RegexCompile::matchStartType() { // attempt a string search for possible match positions. But we // do update the set of possible starting characters. loc++; - int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t stringLenOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); int32_t stringLen = URX_VAL(stringLenOp); U_ASSERT(URX_TYPE(stringLenOp) == URX_STRING_LEN); U_ASSERT(stringLenOp >= 2); @@ -3053,9 +3053,9 @@ void RegexCompile::matchStartType() { // move loc forwards to the end of the loop, skipping over the body. // If the min count is > 0, // continue normal processing of the body of the loop. - int32_t loopEndLoc = (int32_t)fRXPat->fCompiledPat->elementAti(loc+1); + int32_t loopEndLoc = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc + 1)); loopEndLoc = URX_VAL(loopEndLoc); - int32_t minLoopCount = (int32_t)fRXPat->fCompiledPat->elementAti(loc+2); + int32_t minLoopCount = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc + 2)); if (minLoopCount == 0) { // Min Loop Count of 0, treat like a forward branch and // move the current minimum length up to the target @@ -3097,7 +3097,7 @@ void RegexCompile::matchStartType() { int32_t depth = (opType == URX_LA_START? 2: 1); for (;;) { loc++; - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); if (URX_TYPE(op) == URX_LA_START) { depth+=2; } @@ -3177,7 +3177,7 @@ void RegexCompile::matchStartType() { fRXPat->fStartType = START_CHAR; fRXPat->fInitialChar = fRXPat->fInitialChars->charAt(0); U_ASSERT(fRXPat->fInitialChar != (UChar32)-1); - } else if (fRXPat->fInitialChars->contains((UChar32)0, (UChar32)0x10ffff) == false && + } else if (fRXPat->fInitialChars->contains(static_cast<UChar32>(0), static_cast<UChar32>(0x10ffff)) == false && fRXPat->fMinMatchLen > 0) { // Matches start with a set of character smaller than the set of all chars. fRXPat->fStartType = START_SET; @@ -3185,8 +3185,6 @@ void RegexCompile::matchStartType() { // Matches can start with anything fRXPat->fStartType = START_NO_INFO; } - - return; } @@ -3232,7 +3230,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { } for (loc = start; loc<=end; loc++) { - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); opType = URX_TYPE(op); // The loop is advancing linearly through the pattern. @@ -3344,7 +3342,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { case URX_STRING: { loc++; - int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t stringLenOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); currentLen = safeIncrement(currentLen, URX_VAL(stringLenOp)); } break; @@ -3370,9 +3368,9 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { // move loc forwards to the end of the loop, skipping over the body. // If the min count is > 0, // continue normal processing of the body of the loop. - int32_t loopEndLoc = (int32_t)fRXPat->fCompiledPat->elementAti(loc+1); + int32_t loopEndLoc = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc + 1)); loopEndLoc = URX_VAL(loopEndLoc); - int32_t minLoopCount = (int32_t)fRXPat->fCompiledPat->elementAti(loc+2); + int32_t minLoopCount = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc + 2)); if (minLoopCount == 0) { loc = loopEndLoc; } else { @@ -3407,7 +3405,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { int32_t depth = (opType == URX_LA_START? 2: 1); for (;;) { loc++; - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); if (URX_TYPE(op) == URX_LA_START) { // The boilerplate for look-ahead includes two LA_END instructions, // Depth will be decremented by each one when it is seen. @@ -3501,7 +3499,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { } for (loc = start; loc<=end; loc++) { - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); opType = URX_TYPE(op); // The loop is advancing linearly through the pattern. @@ -3630,7 +3628,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { case URX_STRING: { loc++; - int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t stringLenOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); currentLen = safeIncrement(currentLen, URX_VAL(stringLenOp)); break; } @@ -3658,7 +3656,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { // { loc++; - int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t stringLenOp = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); currentLen = safeIncrement(currentLen, URX_VAL(stringLenOp)); } break; @@ -3685,12 +3683,12 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { U_ASSERT(loopEndLoc >= loc+4); int64_t blockLen = maxMatchLength(loc+4, loopEndLoc-1); // Recursive call. - int64_t updatedLen = (int64_t)currentLen + blockLen * maxLoopCount; + int64_t updatedLen = static_cast<int64_t>(currentLen) + blockLen * maxLoopCount; if (updatedLen >= INT32_MAX) { currentLen = INT32_MAX; break; } - currentLen = (int32_t)updatedLen; + currentLen = static_cast<int32_t>(updatedLen); loc = loopEndLoc; break; } @@ -3727,7 +3725,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { // without processing the look-behind block. int32_t dataLoc = URX_VAL(op); for (loc = loc + 1; loc <= end; ++loc) { - op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); int32_t opType = URX_TYPE(op); if ((opType == URX_LA_END || opType == URX_LBN_END) && (URX_VAL(op) == dataLoc)) { break; @@ -3781,7 +3779,7 @@ void RegexCompile::stripNOPs() { int32_t d = 0; for (loc=0; loc<end; loc++) { deltas.addElement(d, *fStatus); - int32_t op = (int32_t)fRXPat->fCompiledPat->elementAti(loc); + int32_t op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(loc)); if (URX_TYPE(op) == URX_NOP) { d++; } @@ -3796,7 +3794,7 @@ void RegexCompile::stripNOPs() { int32_t src; int32_t dst = 0; for (src=0; src<end; src++) { - int32_t op = (int32_t)fRXPat->fCompiledPat->elementAti(src); + int32_t op = static_cast<int32_t>(fRXPat->fCompiledPat->elementAti(src)); int32_t opType = URX_TYPE(op); switch (opType) { case URX_NOP: @@ -3920,11 +3918,11 @@ void RegexCompile::error(UErrorCode e) { fParseErr->line = 0; fParseErr->offset = -1; } else if (fCharNum > 0x7FFFFFFF) { - fParseErr->line = (int32_t)fLineNum; + fParseErr->line = static_cast<int32_t>(fLineNum); fParseErr->offset = -1; } else { - fParseErr->line = (int32_t)fLineNum; - fParseErr->offset = (int32_t)fCharNum; + fParseErr->line = static_cast<int32_t>(fLineNum); + fParseErr->offset = static_cast<int32_t>(fCharNum); } UErrorCode status = U_ZERO_ERROR; // throwaway status for extracting context @@ -4036,8 +4034,8 @@ void RegexCompile::nextChar(RegexPatternChar &c) { if (fQuoteMode) { c.fQuoted = true; - if ((c.fChar==chBackSlash && peekCharLL()==chE && ((fModeFlags & UREGEX_LITERAL) == 0)) || - c.fChar == (UChar32)-1) { + if ((c.fChar == chBackSlash && peekCharLL() == chE && ((fModeFlags & UREGEX_LITERAL) == 0)) || + c.fChar == static_cast<UChar32>(-1)) { fQuoteMode = false; // Exit quote mode, nextCharLL(); // discard the E // nextChar(c); // recurse to get the real next char @@ -4062,14 +4060,14 @@ void RegexCompile::nextChar(RegexPatternChar &c) { // Scan through any white space and comments, until we // reach a significant character or the end of input. for (;;) { - if (c.fChar == (UChar32)-1) { + if (c.fChar == static_cast<UChar32>(-1)) { break; // End of Input } if (c.fChar == chPound && fEOLComments) { // Start of a comment. Consume the rest of it, until EOF or a new line for (;;) { c.fChar = nextCharLL(); - if (c.fChar == (UChar32)-1 || // EOF + if (c.fChar == static_cast<UChar32>(-1) || // EOF c.fChar == chCR || c.fChar == chLF || c.fChar == chNEL || @@ -4101,8 +4099,8 @@ void RegexCompile::nextChar(RegexPatternChar &c) { c.fQuoted = true; if (UTEXT_FULL_TEXT_IN_CHUNK(fRXPat->fPattern, fPatternLength)) { - int32_t endIndex = (int32_t)pos; - c.fChar = u_unescapeAt(uregex_ucstr_unescape_charAt, &endIndex, (int32_t)fPatternLength, (void *)fRXPat->fPattern->chunkContents); + int32_t endIndex = static_cast<int32_t>(pos); + c.fChar = u_unescapeAt(uregex_ucstr_unescape_charAt, &endIndex, static_cast<int32_t>(fPatternLength), const_cast<char16_t*>(fRXPat->fPattern->chunkContents)); if (endIndex == pos) { error(U_REGEX_BAD_ESCAPE_SEQUENCE); @@ -4222,7 +4220,7 @@ UChar32 RegexCompile::scanNamedChar() { char name[100]; if (!uprv_isInvariantUString(charName.getBuffer(), charName.length()) || - (uint32_t)charName.length()>=sizeof(name)) { + static_cast<uint32_t>(charName.length()) >= sizeof(name)) { // All Unicode character names have only invariant characters. // The API to get a character, given a name, accepts only char *, forcing us to convert, // which requires this error check @@ -4620,7 +4618,7 @@ void RegexCompile::setEval(int32_t nextOp) { } fSetOpStack.popi(); U_ASSERT(fSetStack.empty() == false); - rightOperand = (UnicodeSet *)fSetStack.peek(); + rightOperand = static_cast<UnicodeSet*>(fSetStack.peek()); // ICU 70 adds emoji properties of strings, but createSetForProperty() removes all strings // (see comments there). // We also do not yet support string literals in character classes, @@ -4640,20 +4638,20 @@ void RegexCompile::setEval(int32_t nextOp) { case setDifference1: case setDifference2: fSetStack.pop(); - leftOperand = (UnicodeSet *)fSetStack.peek(); + leftOperand = static_cast<UnicodeSet*>(fSetStack.peek()); leftOperand->removeAll(*rightOperand); delete rightOperand; break; case setIntersection1: case setIntersection2: fSetStack.pop(); - leftOperand = (UnicodeSet *)fSetStack.peek(); + leftOperand = static_cast<UnicodeSet*>(fSetStack.peek()); leftOperand->retainAll(*rightOperand); delete rightOperand; break; case setUnion: fSetStack.pop(); - leftOperand = (UnicodeSet *)fSetStack.peek(); + leftOperand = static_cast<UnicodeSet*>(fSetStack.peek()); leftOperand->addAll(*rightOperand); delete rightOperand; break; diff --git a/deps/icu-small/source/i18n/regexcmp.h b/deps/icu-small/source/i18n/regexcmp.h index 81ac9e51784398..c36a6afa559ad6 100644 --- a/deps/icu-small/source/i18n/regexcmp.h +++ b/deps/icu-small/source/i18n/regexcmp.h @@ -13,8 +13,8 @@ // -#ifndef RBBISCAN_H -#define RBBISCAN_H +#ifndef REGEXCMP_H +#define REGEXCMP_H #include "unicode/utypes.h" #if !UCONFIG_NO_REGULAR_EXPRESSIONS @@ -231,4 +231,4 @@ enum SetOperations { U_NAMESPACE_END #endif // !UCONFIG_NO_REGULAR_EXPRESSIONS -#endif // RBBISCAN_H +#endif // REGEXCMP_H diff --git a/deps/icu-small/source/i18n/regexcst.h b/deps/icu-small/source/i18n/regexcst.h index a475b6b363ed8f..e694e5b3b4a8a7 100644 --- a/deps/icu-small/source/i18n/regexcst.h +++ b/deps/icu-small/source/i18n/regexcst.h @@ -11,8 +11,8 @@ // and others. All rights reserved. // //--------------------------------------------------------------------------------- -#ifndef RBBIRPT_H -#define RBBIRPT_H +#ifndef REGEXCST_H +#define REGEXCST_H #include "unicode/utypes.h" @@ -20,118 +20,118 @@ U_NAMESPACE_BEGIN // // Character classes for regex pattern scanning. // - static const uint8_t kRuleSet_digit_char = 128; - static const uint8_t kRuleSet_ascii_letter = 129; + static const uint8_t kRuleSet_ascii_letter = 128; + static const uint8_t kRuleSet_digit_char = 129; static const uint8_t kRuleSet_rule_char = 130; constexpr uint32_t kRuleSet_count = 131-128; enum Regex_PatternParseAction { - doSetBackslash_D, - doBackslashh, - doBackslashH, - doSetLiteralEscaped, - doOpenLookAheadNeg, - doCompleteNamedBackRef, - doPatStart, - doBackslashS, + doBackRef, + doBackslashA, + doBackslashB, doBackslashD, - doNGStar, - doNOP, - doBackslashX, - doSetLiteral, - doContinueNamedCapture, doBackslashG, + doBackslashH, doBackslashR, - doSetBegin, - doSetBackslash_v, - doPossessivePlus, - doPerlInline, - doBackslashZ, - doSetAddAmp, - doSetBeginDifference1, - doIntervalError, - doSetNegate, - doIntervalInit, - doSetIntersection2, - doPossessiveInterval, - doRuleError, + doBackslashS, + doBackslashV, doBackslashW, - doContinueNamedBackRef, - doOpenNonCaptureParen, - doExit, - doSetNamedChar, - doSetBackslash_V, - doConditionalExpr, - doEscapeError, - doBadOpenParenType, - doPossessiveStar, - doSetAddDash, - doEscapedLiteralChar, - doSetBackslash_w, - doIntervalUpperDigit, + doBackslashX, + doBackslashZ, + doBackslashb, + doBackslashd, + doBackslashh, + doBackslashs, doBackslashv, - doSetBackslash_S, - doSetNoCloseError, - doSetProp, - doBackslashB, - doSetEnd, - doSetRange, - doMatchModeParen, - doPlus, - doBackslashV, - doSetMatchMode, + doBackslashw, doBackslashz, - doSetNamedRange, - doOpenLookBehindNeg, - doInterval, + doBadModeFlag, doBadNamedCapture, + doBadOpenParenType, doBeginMatchMode, - doBackslashd, - doPatFinish, - doNamedChar, - doNGPlus, - doSetDifference2, - doSetBackslash_H, + doBeginNamedBackRef, + doBeginNamedCapture, + doCaret, doCloseParen, + doCompleteNamedBackRef, + doConditionalExpr, + doContinueNamedBackRef, + doContinueNamedCapture, + doDollar, doDotAny, - doOpenCaptureParen, doEnterQuoteMode, + doEscapeError, + doEscapedLiteralChar, + doExit, + doInterval, + doIntervalError, + doIntervalInit, + doIntervalSame, + doIntervalUpperDigit, + doIntevalLowerDigit, + doLiteralChar, + doMatchMode, + doMatchModeParen, + doMismatchedParenErr, + doNGInterval, + doNGOpt, + doNGPlus, + doNGStar, + doNOP, + doNamedChar, doOpenAtomicParen, - doBadModeFlag, + doOpenCaptureParen, + doOpenLookAhead, + doOpenLookAheadNeg, + doOpenLookBehind, + doOpenLookBehindNeg, + doOpenNonCaptureParen, + doOpt, + doOrOperator, + doPatFinish, + doPatStart, + doPerlInline, + doPlus, + doPossessiveInterval, + doPossessiveOpt, + doPossessivePlus, + doPossessiveStar, + doProperty, + doRuleError, + doSetAddAmp, + doSetAddDash, + doSetBackslash_D, + doSetBackslash_H, + doSetBackslash_S, + doSetBackslash_V, + doSetBackslash_W, doSetBackslash_d, + doSetBackslash_h, + doSetBackslash_s, + doSetBackslash_v, + doSetBackslash_w, + doSetBegin, + doSetBeginDifference1, + doSetBeginIntersection1, + doSetBeginUnion, + doSetDifference2, + doSetEnd, doSetFinish, - doProperty, - doBeginNamedBackRef, - doBackRef, - doOpt, - doDollar, - doBeginNamedCapture, - doNGInterval, + doSetIntersection2, + doSetLiteral, + doSetLiteralEscaped, + doSetMatchMode, + doSetNamedChar, + doSetNamedRange, + doSetNegate, + doSetNoCloseError, doSetOpError, doSetPosixProp, - doSetBeginIntersection1, - doBackslashb, - doSetBeginUnion, - doIntevalLowerDigit, - doSetBackslash_h, + doSetProp, + doSetRange, doStar, - doMatchMode, - doBackslashA, - doOpenLookBehind, - doPossessiveOpt, - doOrOperator, - doBackslashw, - doBackslashs, - doLiteralChar, doSuppressComments, - doCaret, - doIntervalSame, - doNGOpt, - doOpenLookAhead, - doSetBackslash_W, - doMismatchedParenErr, - doSetBackslash_s, - rbbiLastAction}; + regexLastAction}; //------------------------------------------------------------------------------- // @@ -197,7 +197,7 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doBadOpenParenType, 255, 206,0, false} // 45 , {doOpenLookBehind, 61 /* = */, 2, 20, true} // 46 open-paren-lookbehind , {doOpenLookBehindNeg, 33 /* ! */, 2, 20, true} // 47 - , {doBeginNamedCapture, 129, 64,0, false} // 48 + , {doBeginNamedCapture, 128, 64,0, false} // 48 , {doBadOpenParenType, 255, 206,0, false} // 49 , {doNOP, 41 /* ) */, 255,0, true} // 50 paren-comment , {doMismatchedParenErr, 253, 206,0, false} // 51 @@ -213,8 +213,8 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doSetMatchMode, 41 /* ) */, 2,0, true} // 61 , {doMatchModeParen, 58 /* : */, 2, 14, true} // 62 , {doBadModeFlag, 255, 206,0, false} // 63 - , {doContinueNamedCapture, 129, 64,0, true} // 64 named-capture - , {doContinueNamedCapture, 128, 64,0, true} // 65 + , {doContinueNamedCapture, 128, 64,0, true} // 64 named-capture + , {doContinueNamedCapture, 129, 64,0, true} // 65 , {doOpenCaptureParen, 62 /* > */, 2, 14, true} // 66 , {doBadNamedCapture, 255, 206,0, false} // 67 , {doNGStar, 63 /* ? */, 20,0, true} // 68 quant-star @@ -226,13 +226,13 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doNGOpt, 63 /* ? */, 20,0, true} // 74 quant-opt , {doPossessiveOpt, 43 /* + */, 20,0, true} // 75 , {doOpt, 255, 20,0, false} // 76 - , {doNOP, 128, 79,0, false} // 77 interval-open + , {doNOP, 129, 79,0, false} // 77 interval-open , {doIntervalError, 255, 206,0, false} // 78 - , {doIntevalLowerDigit, 128, 79,0, true} // 79 interval-lower + , {doIntevalLowerDigit, 129, 79,0, true} // 79 interval-lower , {doNOP, 44 /* , */, 83,0, true} // 80 , {doIntervalSame, 125 /* } */, 86,0, true} // 81 , {doIntervalError, 255, 206,0, false} // 82 - , {doIntervalUpperDigit, 128, 83,0, true} // 83 interval-upper + , {doIntervalUpperDigit, 129, 83,0, true} // 83 interval-upper , {doNOP, 125 /* } */, 86,0, true} // 84 , {doIntervalError, 255, 206,0, false} // 85 , {doNGInterval, 63 /* ? */, 20,0, true} // 86 interval-type @@ -261,15 +261,15 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doBackslashX, 88 /* X */, 14,0, true} // 109 , {doBackslashZ, 90 /* Z */, 2,0, true} // 110 , {doBackslashz, 122 /* z */, 2,0, true} // 111 - , {doBackRef, 128, 14,0, true} // 112 + , {doBackRef, 129, 14,0, true} // 112 , {doEscapeError, 253, 206,0, false} // 113 , {doEscapedLiteralChar, 255, 14,0, true} // 114 , {doBeginNamedBackRef, 60 /* < */, 117,0, true} // 115 named-backref , {doBadNamedCapture, 255, 206,0, false} // 116 - , {doContinueNamedBackRef, 129, 119,0, true} // 117 named-backref-2 + , {doContinueNamedBackRef, 128, 119,0, true} // 117 named-backref-2 , {doBadNamedCapture, 255, 206,0, false} // 118 - , {doContinueNamedBackRef, 129, 119,0, true} // 119 named-backref-3 - , {doContinueNamedBackRef, 128, 119,0, true} // 120 + , {doContinueNamedBackRef, 128, 119,0, true} // 119 named-backref-3 + , {doContinueNamedBackRef, 129, 119,0, true} // 120 , {doCompleteNamedBackRef, 62 /* > */, 14,0, true} // 121 , {doBadNamedCapture, 255, 206,0, false} // 122 , {doSetNegate, 94 /* ^ */, 126,0, true} // 123 set-open @@ -357,214 +357,214 @@ static const struct RegexTableEl gRuleParseStateTable[] = { , {doSetFinish, 255, 14,0, false} // 205 set-finish , {doExit, 255, 206,0, true} // 206 errorDeath }; -static const char * const RegexStateNames[] = { 0, - "start", - "term", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "expr-quant", - 0, - 0, - 0, - 0, - 0, - "expr-cont", - 0, - 0, - "open-paren-quant", - 0, - "open-paren-quant2", - 0, - "open-paren", - 0, - "open-paren-extended", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "open-paren-lookbehind", - 0, - 0, - 0, - "paren-comment", - 0, - 0, - "paren-flag", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "named-capture", - 0, - 0, - 0, - "quant-star", - 0, - 0, - "quant-plus", - 0, - 0, - "quant-opt", - 0, - 0, - "interval-open", - 0, - "interval-lower", - 0, - 0, - 0, - "interval-upper", - 0, - 0, - "interval-type", - 0, - 0, - "backslash", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "named-backref", - 0, - "named-backref-2", - 0, - "named-backref-3", - 0, - 0, - 0, - "set-open", - 0, - 0, - "set-open2", - 0, - "set-posix", - 0, - 0, - "set-start", - 0, - 0, - 0, - 0, - 0, - "set-start-dash", - 0, - "set-start-amp", - 0, - "set-after-lit", - 0, - 0, - 0, - 0, - 0, - 0, - "set-after-set", - 0, - 0, - 0, - 0, - 0, - 0, - "set-after-range", - 0, - 0, - 0, - 0, - 0, - 0, - "set-after-op", - 0, - 0, - 0, - "set-set-amp", - 0, - 0, - "set-lit-amp", - 0, - "set-set-dash", - 0, - 0, - "set-range-dash", - 0, - "set-range-amp", - 0, - "set-lit-dash", - 0, - 0, - 0, - 0, - "set-lit-dash-escape", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "set-escape", - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - "set-finish", - "errorDeath", - 0}; +static const char * const RegexStateNames[] = { nullptr, + "start", + "term", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "expr-quant", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "expr-cont", + nullptr, + nullptr, + "open-paren-quant", + nullptr, + "open-paren-quant2", + nullptr, + "open-paren", + nullptr, + "open-paren-extended", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "open-paren-lookbehind", + nullptr, + nullptr, + nullptr, + "paren-comment", + nullptr, + nullptr, + "paren-flag", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "named-capture", + nullptr, + nullptr, + nullptr, + "quant-star", + nullptr, + nullptr, + "quant-plus", + nullptr, + nullptr, + "quant-opt", + nullptr, + nullptr, + "interval-open", + nullptr, + "interval-lower", + nullptr, + nullptr, + nullptr, + "interval-upper", + nullptr, + nullptr, + "interval-type", + nullptr, + nullptr, + "backslash", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "named-backref", + nullptr, + "named-backref-2", + nullptr, + "named-backref-3", + nullptr, + nullptr, + nullptr, + "set-open", + nullptr, + nullptr, + "set-open2", + nullptr, + "set-posix", + nullptr, + nullptr, + "set-start", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-start-dash", + nullptr, + "set-start-amp", + nullptr, + "set-after-lit", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-after-set", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-after-range", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-after-op", + nullptr, + nullptr, + nullptr, + "set-set-amp", + nullptr, + nullptr, + "set-lit-amp", + nullptr, + "set-set-dash", + nullptr, + nullptr, + "set-range-dash", + nullptr, + "set-range-amp", + nullptr, + "set-lit-dash", + nullptr, + nullptr, + nullptr, + nullptr, + "set-lit-dash-escape", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-escape", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "set-finish", + "errorDeath", + nullptr}; U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/i18n/regexcst.pl b/deps/icu-small/source/i18n/regexcst.pl index 24596d4122d26e..84aa31bbc6615d 100755 --- a/deps/icu-small/source/i18n/regexcst.pl +++ b/deps/icu-small/source/i18n/regexcst.pl @@ -63,7 +63,7 @@ $state_name =~ s/://; # strip off the colon from the state name. if ($states{$state_name} != 0) { - print " rbbicst: at line $line-num duplicate definition of state $state_name\n"; + print " regexcst: at line $line-num duplicate definition of state $state_name\n"; } $states{$state_name} = $num_states; $stateNames[$num_states] = $state_name; @@ -100,7 +100,7 @@ # We've got the name of a character class. $state_char_class[$num_states] = $fields[0]; if ($fields[0] =~ /[\W]/) { - print " rbbicsts: at line $line_num, bad character literal or character class name.\n"; + print " regexcst: at line $line_num, bad character literal or character class name.\n"; print " scanning $fields[0]\n"; exit(-1); } @@ -121,7 +121,7 @@ # $state_dest_state[$num_states] = $fields[0]; if ($fields[0] eq "") { - print " rbbicsts: at line $line_num, destination state missing.\n"; + print " regexcst: at line $line_num, destination state missing.\n"; exit(-1); } shift @fields; @@ -133,7 +133,7 @@ $fields[0] =~ s/^\^//; $state_push_state[$num_states] = $fields[0]; if ($fields[0] eq "" ) { - print " rbbicsts: at line $line_num, expected state after ^ (no spaces).\n"; + print " regexcst: at line $line_num, expected state after ^ (no spaces).\n"; exit(-1); } shift @fields; @@ -151,7 +151,7 @@ # There should be no fields left on the line at this point. # if (@fields > 0) { - print " rbbicsts: at line $line_num, unexpected extra stuff on input line.\n"; + print " regexcst: at line $line_num, unexpected extra stuff on input line.\n"; print " scanning $fields[0]\n"; } $num_states++; @@ -214,8 +214,8 @@ print "// and others. All rights reserved. \n"; print "//\n"; print "//---------------------------------------------------------------------------------\n"; -print "#ifndef RBBIRPT_H\n"; -print "#define RBBIRPT_H\n"; +print "#ifndef REGEXCST_H\n"; +print "#define REGEXCST_H\n"; print "\n"; print "#include \"unicode/utypes.h\"\n"; print "\n"; @@ -234,7 +234,7 @@ # They have no corresponding UnicodeSet object in the state machine, # but are handled by special case code. So we emit no reference # to a UnicodeSet object to them here. -foreach $setName (keys %charClasses) { +foreach my $setName (sort keys %charClasses) { if ($setName eq "default") { $charClasses{$setName} = 255;} elsif ($setName eq "quoted") { @@ -255,10 +255,10 @@ # Emit the enum for the actions to be performed. # print "enum Regex_PatternParseAction {\n"; -foreach $act (keys %actions) { +foreach my $act (sort keys %actions) { print " $act,\n"; } -print " rbbiLastAction};\n\n"; +print " regexLastAction};\n\n"; # # Emit the struct definition for transition table elements. @@ -321,15 +321,13 @@ print "static const char * const RegexStateNames[] = {"; for ($state=0; $state<$num_states; $state++) { if ($stateNames[$state] ne "") { - print " \"$stateNames[$state]\",\n"; + print " \"$stateNames[$state]\",\n"; } else { - print " 0,\n"; + print " nullptr,\n"; } } -print " 0};\n\n"; +print " nullptr};\n\n"; print "U_NAMESPACE_END\n"; print "#endif\n"; - - diff --git a/deps/icu-small/source/i18n/regeximp.cpp b/deps/icu-small/source/i18n/regeximp.cpp index 86e238c0f7150c..59dba630482a24 100644 --- a/deps/icu-small/source/i18n/regeximp.cpp +++ b/deps/icu-small/source/i18n/regeximp.cpp @@ -41,7 +41,7 @@ UChar32 CaseFoldingUTextIterator::next() { if (fFoldLength < 0) { fFoldLength = ~fFoldLength; } - foldedC = (UChar32)fFoldLength; + foldedC = static_cast<UChar32>(fFoldLength); fFoldChars = nullptr; return foldedC; } @@ -89,7 +89,7 @@ UChar32 CaseFoldingUCharIterator::next() { if (fFoldLength < 0) { fFoldLength = ~fFoldLength; } - foldedC = (UChar32)fFoldLength; + foldedC = static_cast<UChar32>(fFoldLength); fFoldChars = nullptr; return foldedC; } diff --git a/deps/icu-small/source/i18n/regeximp.h b/deps/icu-small/source/i18n/regeximp.h index 446cd90747c3a6..36cdaba98f3ccc 100644 --- a/deps/icu-small/source/i18n/regeximp.h +++ b/deps/icu-small/source/i18n/regeximp.h @@ -353,7 +353,9 @@ inline void Regex8BitSet::init(const UnicodeSet *s) { } inline void Regex8BitSet::operator = (const Regex8BitSet &s) { - uprv_memcpy(d, s.d, sizeof(d)); + if (this != &s) { + uprv_memcpy(d, s.d, sizeof(d)); + } } diff --git a/deps/icu-small/source/i18n/region.cpp b/deps/icu-small/source/i18n/region.cpp index 26440b6593cee2..ad5bdbe0115dc7 100644 --- a/deps/icu-small/source/i18n/region.cpp +++ b/deps/icu-small/source/i18n/region.cpp @@ -172,7 +172,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { if ( U_FAILURE(status) ) { return; } - UnicodeString *regionName = (UnicodeString *)allRegions->elementAt(i); + UnicodeString* regionName = static_cast<UnicodeString*>(allRegions->elementAt(i)); r->idStr = *regionName; r->idStr.extract(0,r->idStr.length(),r->id,sizeof(r->id),US_INV); @@ -203,7 +203,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { if (U_FAILURE(status)) { break; } - Region *grouping = (Region *) uhash_get(newRegionIDMap.getAlias(), groupingName); + Region* grouping = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), groupingName)); if (grouping != nullptr) { for (int32_t i = 0; i < ures_getSize(groupingBundle) && U_SUCCESS(status); i++) { UnicodeString child = ures_getUnicodeStringByIndex(groupingBundle, i, &status); @@ -232,8 +232,8 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { UnicodeString aliasTo = ures_getUnicodeStringByKey(res.getAlias(),"replacement",&status); res.adoptInstead(nullptr); - const Region *aliasToRegion = (Region *) uhash_get(newRegionIDMap.getAlias(),&aliasTo); - Region *aliasFromRegion = (Region *)uhash_get(newRegionIDMap.getAlias(),aliasFromStr.getAlias()); + const Region* aliasToRegion = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &aliasTo)); + Region* aliasFromRegion = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), aliasFromStr.getAlias())); if ( aliasToRegion != nullptr && aliasFromRegion == nullptr ) { // This is just an alias from some string to a region uhash_put(newRegionAliases.getAlias(),(void *)aliasFromStr.orphan(), (void *)aliasToRegion,&status); @@ -275,7 +275,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { currentRegion.append(aliasTo.charAt(i)); } if ( aliasTo.charAt(i) == 0x0020 || i+1 == aliasTo.length() ) { - Region *target = (Region *)uhash_get(newRegionIDMap.getAlias(),(void *)¤tRegion); + Region* target = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), ¤tRegion)); if (target) { LocalPointer<UnicodeString> preferredValue(new UnicodeString(target->idStr), status); aliasFromRegion->preferredValues->adoptElement(preferredValue.orphan(),status); // may add null if err @@ -294,7 +294,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { UnicodeString codeMappingNumber = ures_getUnicodeStringByIndex(mapping,1,&status); UnicodeString codeMapping3Letter = ures_getUnicodeStringByIndex(mapping,2,&status); - Region *r = (Region *)uhash_get(newRegionIDMap.getAlias(),(void *)&codeMappingID); + Region* r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &codeMappingID)); if ( r ) { int32_t pos = 0; int32_t result = ICU_Utility::parseAsciiInteger(codeMappingNumber, pos); @@ -312,26 +312,26 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { // Now fill in the special cases for WORLD, UNKNOWN, CONTINENTS, and GROUPINGS Region *r; UnicodeString WORLD_ID_STRING(WORLD_ID); - r = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)&WORLD_ID_STRING); + r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &WORLD_ID_STRING)); if ( r ) { r->fType = URGN_WORLD; } UnicodeString UNKNOWN_REGION_ID_STRING(UNKNOWN_REGION_ID); - r = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)&UNKNOWN_REGION_ID_STRING); + r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &UNKNOWN_REGION_ID_STRING)); if ( r ) { r->fType = URGN_UNKNOWN; } for ( int32_t i = 0 ; i < continents->size() ; i++ ) { - r = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)continents->elementAt(i)); + r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), continents->elementAt(i))); if ( r ) { r->fType = URGN_CONTINENT; } } for ( int32_t i = 0 ; i < groupings->size() ; i++ ) { - r = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)groupings->elementAt(i)); + r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), groupings->elementAt(i))); if ( r ) { r->fType = URGN_GROUPING; } @@ -341,7 +341,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { // even though it looks like a territory code. Need to handle it here. UnicodeString OUTLYING_OCEANIA_REGION_ID_STRING(OUTLYING_OCEANIA_REGION_ID); - r = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)&OUTLYING_OCEANIA_REGION_ID_STRING); + r = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &OUTLYING_OCEANIA_REGION_ID_STRING)); if ( r ) { r->fType = URGN_SUBCONTINENT; } @@ -358,11 +358,11 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { // #11232 is to do something useful with these. } UnicodeString parentStr = UnicodeString(parent, -1 , US_INV); - Region *parentRegion = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)&parentStr); + Region* parentRegion = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &parentStr)); for ( int j = 0 ; j < ures_getSize(mapping.getAlias()); j++ ) { UnicodeString child = ures_getUnicodeStringByIndex(mapping.getAlias(),j,&status); - Region *childRegion = (Region *) uhash_get(newRegionIDMap.getAlias(),(void *)&child); + Region* childRegion = static_cast<Region*>(uhash_get(newRegionIDMap.getAlias(), &child)); if ( parentRegion != nullptr && childRegion != nullptr ) { // Add the child region to the set of regions contained by the parent @@ -398,7 +398,7 @@ void U_CALLCONV Region::loadRegionData(UErrorCode &status) { // Create the availableRegions lists int32_t pos = UHASH_FIRST; while ( const UHashElement* element = uhash_nextElement(newRegionIDMap.getAlias(),&pos)) { - Region *ar = (Region *)element->value.pointer; + Region* ar = static_cast<Region*>(element->value.pointer); if ( availableRegions[ar->fType] == nullptr ) { LocalPointer<UVector> newAr(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status); availableRegions[ar->fType] = newAr.orphan(); @@ -455,12 +455,8 @@ Region::Region () } Region::~Region () { - if (containedRegions) { - delete containedRegions; - } - if (preferredValues) { - delete preferredValues; - } + delete containedRegions; + delete preferredValues; } /** @@ -501,10 +497,10 @@ Region::getInstance(const char *region_code, UErrorCode &status) { } UnicodeString regionCodeString = UnicodeString(region_code, -1, US_INV); - Region *r = (Region *)uhash_get(regionIDMap,(void *)®ionCodeString); + Region* r = static_cast<Region*>(uhash_get(regionIDMap, ®ionCodeString)); if ( !r ) { - r = (Region *)uhash_get(regionAliases,(void *)®ionCodeString); + r = static_cast<Region*>(uhash_get(regionAliases, ®ionCodeString)); } if ( !r ) { // Unknown region code @@ -516,7 +512,7 @@ Region::getInstance(const char *region_code, UErrorCode &status) { StringEnumeration *pv = r->getPreferredValues(status); pv->reset(status); const UnicodeString *ustr = pv->snext(status); - r = (Region *)uhash_get(regionIDMap,(void *)ustr); + r = static_cast<Region*>(uhash_get(regionIDMap, ustr)); delete pv; } @@ -536,12 +532,12 @@ Region::getInstance (int32_t code, UErrorCode &status) { return nullptr; } - Region *r = (Region *)uhash_iget(numericCodeMap,code); + Region* r = static_cast<Region*>(uhash_iget(numericCodeMap, code)); if ( !r ) { // Just in case there's an alias that's numeric, try to find it. UnicodeString id; ICU_Utility::appendNumber(id, code, 10, 1); - r = (Region *)uhash_get(regionAliases,&id); + r = static_cast<Region*>(uhash_get(regionAliases, &id)); } if( U_FAILURE(status) ) { @@ -557,7 +553,7 @@ Region::getInstance (int32_t code, UErrorCode &status) { StringEnumeration *pv = r->getPreferredValues(status); pv->reset(status); const UnicodeString *ustr = pv->snext(status); - r = (Region *)uhash_get(regionIDMap,(void *)ustr); + r = static_cast<Region*>(uhash_get(regionIDMap, ustr)); delete pv; } @@ -674,8 +670,8 @@ Region::contains(const Region &other) const { return true; } else { for ( int32_t i = 0 ; i < containedRegions->size() ; i++ ) { - UnicodeString *crStr = (UnicodeString *)containedRegions->elementAt(i); - Region *cr = (Region *) uhash_get(regionIDMap,(void *)crStr); + UnicodeString* crStr = static_cast<UnicodeString*>(containedRegions->elementAt(i)); + Region* cr = static_cast<Region*>(uhash_get(regionIDMap, crStr)); if ( cr && cr->contains(other) ) { return true; } @@ -729,7 +725,7 @@ RegionNameEnumeration::RegionNameEnumeration(UVector *nameList, UErrorCode& stat LocalPointer<UVector> regionNames( new UVector(uprv_deleteUObject, uhash_compareUnicodeString, nameList->size(), status), status); for ( int32_t i = 0 ; U_SUCCESS(status) && i < nameList->size() ; i++ ) { - UnicodeString* this_region_name = (UnicodeString *)nameList->elementAt(i); + UnicodeString* this_region_name = static_cast<UnicodeString*>(nameList->elementAt(i)); LocalPointer<UnicodeString> new_region_name(new UnicodeString(*this_region_name), status); regionNames->adoptElement(new_region_name.orphan(), status); } @@ -744,7 +740,7 @@ RegionNameEnumeration::snext(UErrorCode& status) { if (U_FAILURE(status) || (fRegionNames==nullptr)) { return nullptr; } - const UnicodeString* nextStr = (const UnicodeString *)fRegionNames->elementAt(pos); + const UnicodeString* nextStr = static_cast<const UnicodeString*>(fRegionNames->elementAt(pos)); if (nextStr!=nullptr) { pos++; } diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index ebdf6c9716eb98..fa1adfa78726c3 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -1161,7 +1161,8 @@ void RelativeDateTimeFormatter::formatRelativeImpl( if (offset > -2.1 && offset < 2.1) { // Allow a 1% epsilon, so offsets in -1.01..-0.99 map to LAST double offsetx100 = offset * 100.0; - int32_t intoffset = (offsetx100 < 0)? (int32_t)(offsetx100-0.5) : (int32_t)(offsetx100+0.5); + int32_t intoffset = offsetx100 < 0 ? static_cast<int32_t>(offsetx100 - 0.5) + : static_cast<int32_t>(offsetx100 + 0.5); switch (intoffset) { case -200/*-2*/: direction = UDAT_DIRECTION_LAST_2; break; case -100/*-1*/: direction = UDAT_DIRECTION_LAST; break; @@ -1380,7 +1381,7 @@ ureldatefmt_formatNumericToResult( if (U_FAILURE(*status)) { return; } - auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt); + const auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt); auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); resultImpl->fImpl = fmt->formatNumericToValue(offset, unit, *status); } @@ -1423,7 +1424,7 @@ ureldatefmt_formatToResult( if (U_FAILURE(*status)) { return; } - auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt); + const auto* fmt = reinterpret_cast<const RelativeDateTimeFormatter*>(reldatefmt); auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); resultImpl->fImpl = fmt->formatToValue(offset, unit, *status); } @@ -1447,8 +1448,8 @@ ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt, *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString relDateStr((UBool)(relativeDateStringLen == -1), relativeDateString, relativeDateStringLen); - UnicodeString timeStr((UBool)(timeStringLen == -1), timeString, timeStringLen); + UnicodeString relDateStr(relativeDateStringLen == -1, relativeDateString, relativeDateStringLen); + UnicodeString timeStr(timeStringLen == -1, timeString, timeStringLen); UnicodeString res(result, 0, resultCapacity); ((RelativeDateTimeFormatter*)reldatefmt)->combineDateAndTime(relDateStr, timeStr, res, *status); if (U_FAILURE(*status)) { diff --git a/deps/icu-small/source/i18n/reldtfmt.cpp b/deps/icu-small/source/i18n/reldtfmt.cpp index 7015c13089986a..6b41af8f13ef33 100644 --- a/deps/icu-small/source/i18n/reldtfmt.cpp +++ b/deps/icu-small/source/i18n/reldtfmt.cpp @@ -57,7 +57,7 @@ RelativeDateFormat::RelativeDateFormat(const RelativeDateFormat& other) : fCombinedFormat = new SimpleFormatter(*other.fCombinedFormat); } if (fDatesLen > 0) { - fDates = (URelativeString*) uprv_malloc(sizeof(fDates[0])*(size_t)fDatesLen); + fDates = static_cast<URelativeString*>(uprv_malloc(sizeof(fDates[0]) * static_cast<size_t>(fDatesLen))); uprv_memcpy(fDates, other.fDates, sizeof(fDates[0])*(size_t)fDatesLen); } #if !UCONFIG_NO_BREAK_ITERATION @@ -92,12 +92,12 @@ RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatS status = U_ILLEGAL_ARGUMENT_ERROR; return; } - UDateFormatStyle baseDateStyle = (dateStyle > UDAT_SHORT)? (UDateFormatStyle)(dateStyle & ~UDAT_RELATIVE): dateStyle; + UDateFormatStyle baseDateStyle = (dateStyle > UDAT_SHORT) ? static_cast<UDateFormatStyle>(dateStyle & ~UDAT_RELATIVE) : dateStyle; DateFormat * df; // Get fDateTimeFormatter from either date or time style (does not matter, we will override the pattern). // We do need to get separate patterns for the date & time styles. if (baseDateStyle != UDAT_NONE) { - df = createDateInstance((EStyle)baseDateStyle, locale); + df = createDateInstance(static_cast<EStyle>(baseDateStyle), locale); fDateTimeFormatter=dynamic_cast<SimpleDateFormat *>(df); if (fDateTimeFormatter == nullptr) { status = U_UNSUPPORTED_ERROR; @@ -105,7 +105,7 @@ RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatS } fDateTimeFormatter->toPattern(fDatePattern); if (timeStyle != UDAT_NONE) { - df = createTimeInstance((EStyle)timeStyle, locale); + df = createTimeInstance(static_cast<EStyle>(timeStyle), locale); SimpleDateFormat *sdf = dynamic_cast<SimpleDateFormat *>(df); if (sdf != nullptr) { sdf->toPattern(fTimePattern); @@ -114,7 +114,7 @@ RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatS } } else { // does not matter whether timeStyle is UDAT_NONE, we need something for fDateTimeFormatter - df = createTimeInstance((EStyle)timeStyle, locale); + df = createTimeInstance(static_cast<EStyle>(timeStyle), locale); fDateTimeFormatter=dynamic_cast<SimpleDateFormat *>(df); if (fDateTimeFormatter == nullptr) { status = U_UNSUPPORTED_ERROR; @@ -157,7 +157,7 @@ bool RelativeDateFormat::operator==(const Format& other) const { return false; } -static const char16_t APOSTROPHE = (char16_t)0x0027; +static const char16_t APOSTROPHE = static_cast<char16_t>(0x0027); UnicodeString& RelativeDateFormat::format( Calendar& cal, UnicodeString& appendTo, @@ -503,7 +503,7 @@ struct RelDateFmtDataSink : public ResourceSink { // Put in the proper spot, but don't override existing data. n = offset + UDAT_DIRECTION_THIS; // Converts to index in UDAT_R - if (n < fDatesLen && fDatesPtr[n].string == nullptr) { + if (0 <= n && n < fDatesLen && fDatesPtr[n].string == nullptr) { // Not found and n is an empty slot. fDatesPtr[n].offset = offset; fDatesPtr[n].string = value.getString(len, errorCode); @@ -536,8 +536,8 @@ void RelativeDateFormat::loadDates(UErrorCode &status) { int32_t glueIndex = kDateTime; if (patternsSize >= (kDateTimeOffset + kShort + 1)) { int32_t offsetIncrement = (fDateStyle & ~kRelative); // Remove relative bit. - if (offsetIncrement >= (int32_t)kFull && - offsetIncrement <= (int32_t)kShortRelative) { + if (offsetIncrement >= static_cast<int32_t>(kFull) && + offsetIncrement <= static_cast<int32_t>(kShortRelative)) { glueIndex = kDateTimeOffset + offsetIncrement; } } @@ -552,7 +552,7 @@ void RelativeDateFormat::loadDates(UErrorCode &status) { // Data loading for relative names, e.g., "yesterday", "today", "tomorrow". fDatesLen = UDAT_DIRECTION_COUNT; // Maximum defined by data. - fDates = (URelativeString*) uprv_malloc(sizeof(fDates[0])*fDatesLen); + fDates = static_cast<URelativeString*>(uprv_malloc(sizeof(fDates[0]) * fDatesLen)); RelDateFmtDataSink sink(fDates, fDatesLen); ures_getAllItemsWithFallback(rb, "fields/day/relative", sink, status); diff --git a/deps/icu-small/source/i18n/reldtfmt.h b/deps/icu-small/source/i18n/reldtfmt.h index 3af43d49cab28c..0aa7443fa928bb 100644 --- a/deps/icu-small/source/i18n/reldtfmt.h +++ b/deps/icu-small/source/i18n/reldtfmt.h @@ -199,7 +199,7 @@ class RelativeDateFormat : public DateFormat { virtual UnicodeString& toPattern(UnicodeString& result, UErrorCode& status) const; /** - * Get the date pattern for the the date formatter associated with this object. + * Get the date pattern for the date formatter associated with this object. * @param result Output param to receive the date pattern. * @return A reference to 'result'. * @internal ICU 4.2 technology preview @@ -207,7 +207,7 @@ class RelativeDateFormat : public DateFormat { virtual UnicodeString& toPatternDate(UnicodeString& result, UErrorCode& status) const; /** - * Get the time pattern for the the time formatter associated with this object. + * Get the time pattern for the time formatter associated with this object. * @param result Output param to receive the time pattern. * @return A reference to 'result'. * @internal ICU 4.2 technology preview diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index 7a39afbf7b71d8..cac4b0e271ec4e 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -165,9 +165,7 @@ RegexMatcher::~RegexMatcher() { fPattern = nullptr; } - if (fInput) { - delete fInput; - } + delete fInput; if (fInputText) { utext_close(fInputText); } @@ -244,7 +242,7 @@ void RegexMatcher::init2(UText *input, UErrorCode &status) { } if (fPattern->fDataSize > UPRV_LENGTHOF(fSmallData)) { - fData = (int64_t *)uprv_malloc(fPattern->fDataSize * sizeof(int64_t)); + fData = static_cast<int64_t*>(uprv_malloc(fPattern->fDataSize * sizeof(int64_t))); if (fData == nullptr) { status = fDeferredStatus = U_MEMORY_ALLOCATION_ERROR; return; @@ -319,16 +317,16 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest, if (fMatchStart > fAppendPosition) { if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { destLen += utext_replace(dest, destLen, destLen, fInputText->chunkContents+fAppendPosition, - (int32_t)(fMatchStart-fAppendPosition), &status); + static_cast<int32_t>(fMatchStart - fAppendPosition), &status); } else { int32_t len16; if (UTEXT_USES_U16(fInputText)) { - len16 = (int32_t)(fMatchStart-fAppendPosition); + len16 = static_cast<int32_t>(fMatchStart - fAppendPosition); } else { UErrorCode lengthStatus = U_ZERO_ERROR; len16 = utext_extract(fInputText, fAppendPosition, fMatchStart, nullptr, 0, &lengthStatus); } - char16_t *inputChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(len16+1)); + char16_t* inputChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (len16 + 1))); if (inputChars == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return *this; @@ -362,9 +360,9 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest, int32_t offset = 0; struct URegexUTextUnescapeCharContext context = U_REGEX_UTEXT_UNESCAPE_CONTEXT(replacement); UChar32 escapedChar = u_unescapeAt(uregex_utext_unescape_charAt, &offset, INT32_MAX, &context); - if (escapedChar != (UChar32)0xFFFFFFFF) { + if (escapedChar != static_cast<UChar32>(0xFFFFFFFF)) { if (U_IS_BMP(escapedChar)) { - char16_t c16 = (char16_t)escapedChar; + char16_t c16 = static_cast<char16_t>(escapedChar); destLen += utext_replace(dest, destLen, destLen, &c16, 1, &status); } else { char16_t surrogate[2]; @@ -386,7 +384,7 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest, (void)UTEXT_NEXT32(replacement); // Plain backslash escape. Just put out the escaped character. if (U_IS_BMP(c)) { - char16_t c16 = (char16_t)c; + char16_t c16 = static_cast<char16_t>(c); destLen += utext_replace(dest, destLen, destLen, &c16, 1, &status); } else { char16_t surrogate[2]; @@ -400,7 +398,7 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest, } else if (c != DOLLARSIGN) { // Normal char, not a $. Copy it out without further checks. if (U_IS_BMP(c)) { - char16_t c16 = (char16_t)c; + char16_t c16 = static_cast<char16_t>(c); destLen += utext_replace(dest, destLen, destLen, &c16, 1, &status); } else { char16_t surrogate[2]; @@ -518,17 +516,17 @@ UText *RegexMatcher::appendTail(UText *dest, UErrorCode &status) { if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { int64_t destLen = utext_nativeLength(dest); utext_replace(dest, destLen, destLen, fInputText->chunkContents+fAppendPosition, - (int32_t)(fInputLength-fAppendPosition), &status); + static_cast<int32_t>(fInputLength - fAppendPosition), &status); } else { int32_t len16; if (UTEXT_USES_U16(fInputText)) { - len16 = (int32_t)(fInputLength-fAppendPosition); + len16 = static_cast<int32_t>(fInputLength - fAppendPosition); } else { len16 = utext_extract(fInputText, fAppendPosition, fInputLength, nullptr, 0, &status); status = U_ZERO_ERROR; // buffer overflow } - char16_t *inputChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(len16)); + char16_t* inputChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (len16))); if (inputChars == nullptr) { fDeferredStatus = U_MEMORY_ALLOCATION_ERROR; } else { @@ -585,7 +583,7 @@ int64_t RegexMatcher::end64(int32_t group, UErrorCode &err) const { } int32_t RegexMatcher::end(int32_t group, UErrorCode &err) const { - return (int32_t)end64(group, err); + return static_cast<int32_t>(end64(group, err)); } //-------------------------------------------------------------------------------- @@ -928,9 +926,9 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { // matcher has been reset. // - int32_t startPos = (int32_t)fMatchEnd; + int32_t startPos = static_cast<int32_t>(fMatchEnd); if (startPos==0) { - startPos = (int32_t)fActiveStart; + startPos = static_cast<int32_t>(fActiveStart); } const char16_t *inputBuf = fInputText->chunkContents; @@ -965,7 +963,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { // Note: some patterns that cannot match anything will have fMinMatchLength==Max Int. // Be aware of possible overflows if making changes here. // Note: a match can begin at inputBuf + testLen; it is an inclusive limit. - int32_t testLen = (int32_t)(fActiveLimit - fPattern->fMinMatchLen); + int32_t testLen = static_cast<int32_t>(fActiveLimit - fPattern->fMinMatchLen); if (startPos > testLen) { fMatch = false; fHitEnd = true; @@ -1220,12 +1218,15 @@ UnicodeString RegexMatcher::group(int32_t groupNum, UErrorCode &status) const { // Get the group length using a utext_extract preflight. // UText is actually pretty efficient at this when underlying encoding is UTF-16. - int32_t length = utext_extract(fInputText, groupStart, groupEnd, nullptr, 0, &status); - if (status != U_BUFFER_OVERFLOW_ERROR) { + UErrorCode bufferStatus = U_ZERO_ERROR; + int32_t length = utext_extract(fInputText, groupStart, groupEnd, nullptr, 0, &bufferStatus); + if (bufferStatus != U_BUFFER_OVERFLOW_ERROR) { + if (U_FAILURE(bufferStatus)) { + status = bufferStatus; + } return result; } - status = U_ZERO_ERROR; char16_t *buf = result.getBuffer(length); if (buf == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -1285,16 +1286,16 @@ int64_t RegexMatcher::appendGroup(int32_t groupNum, UText *dest, UErrorCode &sta int64_t deltaLen; if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { U_ASSERT(e <= fInputLength); - deltaLen = utext_replace(dest, destLen, destLen, fInputText->chunkContents+s, (int32_t)(e-s), &status); + deltaLen = utext_replace(dest, destLen, destLen, fInputText->chunkContents + s, static_cast<int32_t>(e - s), &status); } else { int32_t len16; if (UTEXT_USES_U16(fInputText)) { - len16 = (int32_t)(e-s); + len16 = static_cast<int32_t>(e - s); } else { UErrorCode lengthStatus = U_ZERO_ERROR; len16 = utext_extract(fInputText, s, e, nullptr, 0, &lengthStatus); } - char16_t *groupChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(len16+1)); + char16_t* groupChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (len16 + 1))); if (groupChars == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return 0; @@ -1359,7 +1360,7 @@ const UnicodeString &RegexMatcher::input() const { UErrorCode status = U_ZERO_ERROR; int32_t len16; if (UTEXT_USES_U16(fInputText)) { - len16 = (int32_t)fInputLength; + len16 = static_cast<int32_t>(fInputLength); } else { len16 = utext_extract(fInputText, 0, fInputLength, nullptr, 0, &status); status = U_ZERO_ERROR; // overflow, length status @@ -1370,7 +1371,7 @@ const UnicodeString &RegexMatcher::input() const { utext_extract(fInputText, 0, fInputLength, inputChars, len16, &status); // unterminated warning result->releaseBuffer(len16); - (*(const UnicodeString **)&fInput) = result; // pointer assignment, rather than operator= + *const_cast<const UnicodeString**>(&fInput) = result; // pointer assignment, rather than operator= } return *fInput; @@ -1402,16 +1403,16 @@ UText *RegexMatcher::getInput (UText *dest, UErrorCode &status) const { if (dest) { if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { - utext_replace(dest, 0, utext_nativeLength(dest), fInputText->chunkContents, (int32_t)fInputLength, &status); + utext_replace(dest, 0, utext_nativeLength(dest), fInputText->chunkContents, static_cast<int32_t>(fInputLength), &status); } else { int32_t input16Len; if (UTEXT_USES_U16(fInputText)) { - input16Len = (int32_t)fInputLength; + input16Len = static_cast<int32_t>(fInputLength); } else { UErrorCode lengthStatus = U_ZERO_ERROR; input16Len = utext_extract(fInputText, 0, fInputLength, nullptr, 0, &lengthStatus); // buffer overflow error } - char16_t *inputChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(input16Len)); + char16_t* inputChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (input16Len))); if (inputChars == nullptr) { return dest; } @@ -1480,7 +1481,7 @@ UBool RegexMatcher::lookingAt(UErrorCode &status) { resetPreserveRegion(); } if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { - MatchChunkAt((int32_t)fActiveStart, false, status); + MatchChunkAt(static_cast<int32_t>(fActiveStart), false, status); } else { MatchAt(fActiveStart, false, status); } @@ -1518,7 +1519,7 @@ UBool RegexMatcher::lookingAt(int64_t start, UErrorCode &status) { } if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { - MatchChunkAt((int32_t)nativeStart, false, status); + MatchChunkAt(static_cast<int32_t>(nativeStart), false, status); } else { MatchAt(nativeStart, false, status); } @@ -1552,7 +1553,7 @@ UBool RegexMatcher::matches(UErrorCode &status) { } if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { - MatchChunkAt((int32_t)fActiveStart, true, status); + MatchChunkAt(static_cast<int32_t>(fActiveStart), true, status); } else { MatchAt(fActiveStart, true, status); } @@ -1590,7 +1591,7 @@ UBool RegexMatcher::matches(int64_t start, UErrorCode &status) { } if (UTEXT_FULL_TEXT_IN_CHUNK(fInputText, fInputLength)) { - MatchChunkAt((int32_t)nativeStart, true, status); + MatchChunkAt(static_cast<int32_t>(nativeStart), true, status); } else { MatchAt(nativeStart, true, status); } @@ -1668,7 +1669,7 @@ RegexMatcher &RegexMatcher::region(int64_t start, int64_t limit, UErrorCode &sta // //-------------------------------------------------------------------------------- int32_t RegexMatcher::regionEnd() const { - return (int32_t)fRegionLimit; + return static_cast<int32_t>(fRegionLimit); } int64_t RegexMatcher::regionEnd64() const { @@ -1681,7 +1682,7 @@ int64_t RegexMatcher::regionEnd64() const { // //-------------------------------------------------------------------------------- int32_t RegexMatcher::regionStart() const { - return (int32_t)fRegionStart; + return static_cast<int32_t>(fRegionStart); } int64_t RegexMatcher::regionStart64() const { @@ -1997,11 +1998,12 @@ static UText *utext_extract_replace(UText *src, UText *dest, int64_t start, int6 return utext_openUChars(nullptr, nullptr, 0, status); } } - int32_t length = utext_extract(src, start, limit, nullptr, 0, status); - if (*status != U_BUFFER_OVERFLOW_ERROR && U_FAILURE(*status)) { + UErrorCode bufferStatus = U_ZERO_ERROR; + int32_t length = utext_extract(src, start, limit, nullptr, 0, &bufferStatus); + if (bufferStatus != U_BUFFER_OVERFLOW_ERROR && U_FAILURE(bufferStatus)) { + *status = bufferStatus; return dest; } - *status = U_ZERO_ERROR; MaybeStackArray<char16_t, 40> buffer; if (length >= buffer.getCapacity()) { char16_t *newBuf = buffer.resize(length+1); // Leave space for terminating Nul. @@ -2052,7 +2054,7 @@ int32_t RegexMatcher::split(const UnicodeString &input, return 0; } - UText **destText = (UText **)uprv_malloc(sizeof(UText*)*destCapacity); + UText** destText = static_cast<UText**>(uprv_malloc(sizeof(UText*) * destCapacity)); if (destText == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return 0; @@ -2121,7 +2123,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i]) { utext_replace(dest[i], 0, utext_nativeLength(dest[i]), input->chunkContents+nextOutputStringStart, - (int32_t)(fActiveLimit-nextOutputStringStart), &status); + static_cast<int32_t>(fActiveLimit - nextOutputStringStart), &status); } else { UText remainingText = UTEXT_INITIALIZER; utext_openUChars(&remainingText, input->chunkContents+nextOutputStringStart, @@ -2133,7 +2135,7 @@ int32_t RegexMatcher::split(UText *input, UErrorCode lengthStatus = U_ZERO_ERROR; int32_t remaining16Length = utext_extract(input, nextOutputStringStart, fActiveLimit, nullptr, 0, &lengthStatus); - char16_t *remainingChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(remaining16Length+1)); + char16_t* remainingChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (remaining16Length + 1))); if (remainingChars == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; break; @@ -2161,7 +2163,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i]) { utext_replace(dest[i], 0, utext_nativeLength(dest[i]), input->chunkContents+nextOutputStringStart, - (int32_t)(fMatchStart-nextOutputStringStart), &status); + static_cast<int32_t>(fMatchStart - nextOutputStringStart), &status); } else { UText remainingText = UTEXT_INITIALIZER; utext_openUChars(&remainingText, input->chunkContents+nextOutputStringStart, @@ -2172,7 +2174,7 @@ int32_t RegexMatcher::split(UText *input, } else { UErrorCode lengthStatus = U_ZERO_ERROR; int32_t remaining16Length = utext_extract(input, nextOutputStringStart, fMatchStart, nullptr, 0, &lengthStatus); - char16_t *remainingChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(remaining16Length+1)); + char16_t* remainingChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (remaining16Length + 1))); if (remainingChars == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; break; @@ -2215,7 +2217,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i] == nullptr) { dest[i] = utext_openUChars(nullptr, nullptr, 0, &status); } else { - static const char16_t emptyString[] = {(char16_t)0}; + static const char16_t emptyString[] = {static_cast<char16_t>(0)}; utext_replace(dest[i], 0, utext_nativeLength(dest[i]), emptyString, 0, &status); } } @@ -2231,7 +2233,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i]) { utext_replace(dest[i], 0, utext_nativeLength(dest[i]), input->chunkContents+nextOutputStringStart, - (int32_t)(fActiveLimit-nextOutputStringStart), &status); + static_cast<int32_t>(fActiveLimit - nextOutputStringStart), &status); } else { UText remainingText = UTEXT_INITIALIZER; utext_openUChars(&remainingText, input->chunkContents+nextOutputStringStart, @@ -2242,7 +2244,7 @@ int32_t RegexMatcher::split(UText *input, } else { UErrorCode lengthStatus = U_ZERO_ERROR; int32_t remaining16Length = utext_extract(input, nextOutputStringStart, fActiveLimit, nullptr, 0, &lengthStatus); - char16_t *remainingChars = (char16_t *)uprv_malloc(sizeof(char16_t)*(remaining16Length+1)); + char16_t* remainingChars = static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (remaining16Length + 1))); if (remainingChars == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; break; @@ -2320,7 +2322,7 @@ int64_t RegexMatcher::start64(int32_t group, UErrorCode &status) const { int32_t RegexMatcher::start(int32_t group, UErrorCode &status) const { - return (int32_t)start64(group, status); + return static_cast<int32_t>(start64(group, status)); } //-------------------------------------------------------------------------------- @@ -2514,7 +2516,7 @@ REStackFrame *RegexMatcher::resetStack() { // where they indicate that a group has not yet matched anything. fStack->removeAllElements(); - REStackFrame *iFrame = (REStackFrame *)fStack->reserveBlock(fPattern->fFrameSize, fDeferredStatus); + REStackFrame* iFrame = reinterpret_cast<REStackFrame*>(fStack->reserveBlock(fPattern->fFrameSize, fDeferredStatus)); if(U_FAILURE(fDeferredStatus)) { return nullptr; } @@ -2652,7 +2654,7 @@ UBool RegexMatcher::isUWordBoundary(int64_t pos, UErrorCode &status) { // words are not boundaries. All non-word chars stand by themselves, // with word boundaries on both sides. } else { - returnVal = fWordBreakItr->isBoundary((int32_t)pos); + returnVal = fWordBreakItr->isBoundary(static_cast<int32_t>(pos)); } #endif return returnVal; @@ -2745,10 +2747,10 @@ inline REStackFrame *RegexMatcher::StateSave(REStackFrame *fp, int64_t savePatId // be looked at again. return fp; } - fp = (REStackFrame *)(newFP - fFrameSize); // in case of realloc of stack. + fp = reinterpret_cast<REStackFrame*>(newFP - fFrameSize); // in case of realloc of stack. // New stack frame = copy of old top frame. - int64_t *source = (int64_t *)fp; + int64_t* source = reinterpret_cast<int64_t*>(fp); int64_t *dest = newFP; for (;;) { *dest++ = *source++; @@ -2762,7 +2764,7 @@ inline REStackFrame *RegexMatcher::StateSave(REStackFrame *fp, int64_t savePatId IncrementTime(status); // Re-initializes fTickCounter } fp->fPatIdx = savePatIdx; - return (REStackFrame *)newFP; + return reinterpret_cast<REStackFrame*>(newFP); } #if defined(REGEX_DEBUG) @@ -2835,7 +2837,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // One iteration of the loop per pattern operation performed. // for (;;) { - op = (int32_t)pat[fp->fPatIdx]; + op = static_cast<int32_t>(pat[fp->fPatIdx]); opType = URX_TYPE(op); opValue = URX_VAL(op); #ifdef REGEX_RUN_DEBUG @@ -2859,7 +2861,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Force a backtrack. In some circumstances, the pattern compiler // will notice that the pattern can't possibly match anything, and will // emit one of these at that point. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -2874,7 +2876,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } else { fHitEnd = true; } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -2885,7 +2887,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // offset to the string text, and one for the length. int32_t stringStartIdx = opValue; - op = (int32_t)pat[fp->fPatIdx]; // Fetch the second operand + op = static_cast<int32_t>(pat[fp->fPatIdx]); // Fetch the second operand fp->fPatIdx++; opType = URX_TYPE(op); int32_t stringLen = URX_VAL(op); @@ -2915,7 +2917,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -2931,7 +2933,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // when we reach the end of the pattern. if (toEnd && fp->fInputIdx != fActiveLimit) { // The pattern matched, but not to the end of input. Try some more. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } isMatch = true; @@ -2992,7 +2994,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3015,7 +3017,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } // Not at end of input. Back-track out. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -3040,7 +3042,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } } // not at a new line. Fail. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3057,7 +3059,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // It makes no difference where the new-line is within the input. UTEXT_SETNATIVEINDEX(fInputText, fp->fInputIdx); if (UTEXT_CURRENT32(fInputText) != 0x0a) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3065,7 +3067,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_CARET: // ^, test for start of line if (fp->fInputIdx != fAnchorStart) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3086,7 +3088,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { break; } // Not at the start of a line. Fail. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3104,7 +3106,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { UChar32 c = UTEXT_PREVIOUS32(fInputText); if (c != 0x0a) { // Not at the start of a line. Back-track out. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3112,9 +3114,9 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_BACKSLASH_B: // Test for word boundaries { UBool success = isWordBoundary(fp->fInputIdx); - success ^= (UBool)(opValue != 0); // flip sense for \B + success ^= static_cast<UBool>(opValue != 0); // flip sense for \B if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3123,9 +3125,9 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_BACKSLASH_BU: // Test for word boundaries, Unicode-style { UBool success = isUWordBoundary(fp->fInputIdx, status); - success ^= (UBool)(opValue != 0); // flip sense for \B + success ^= static_cast<UBool>(opValue != 0); // flip sense for \B if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3135,7 +3137,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3144,11 +3146,11 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { UChar32 c = UTEXT_NEXT32(fInputText); int8_t ctype = u_charType(c); // TODO: make a unicode set for this. Will be faster. UBool success = (ctype == U_DECIMAL_DIGIT_NUMBER); - success ^= (UBool)(opValue != 0); // flip sense for \D + success ^= static_cast<UBool>(opValue != 0); // flip sense for \D if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3156,7 +3158,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_BACKSLASH_G: // Test for position at end of previous match if (!((fMatch && fp->fInputIdx==fMatchEnd) || (fMatch==false && fp->fInputIdx==fActiveStart))) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3165,18 +3167,18 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UTEXT_SETNATIVEINDEX(fInputText, fp->fInputIdx); UChar32 c = UTEXT_NEXT32(fInputText); int8_t ctype = u_charType(c); UBool success = (ctype == U_SPACE_SEPARATOR || c == 9); // SPACE_SEPARATOR || TAB - success ^= (UBool)(opValue != 0); // flip sense for \H + success ^= static_cast<UBool>(opValue != 0); // flip sense for \H if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3186,7 +3188,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UTEXT_SETNATIVEINDEX(fInputText, fp->fInputIdx); @@ -3197,7 +3199,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3207,17 +3209,17 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UTEXT_SETNATIVEINDEX(fInputText, fp->fInputIdx); UChar32 c = UTEXT_NEXT32(fInputText); UBool success = isLineTerminator(c); - success ^= (UBool)(opValue != 0); // flip sense for \V + success ^= static_cast<UBool>(opValue != 0); // flip sense for \V if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3229,7 +3231,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Fail if at end of input if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3243,7 +3245,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_BACKSLASH_Z: // Test for end of Input if (fp->fInputIdx < fAnchorLimit) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } else { fHitEnd = true; fRequireEnd = true; @@ -3261,7 +3263,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // 1: success if input char is not in set. if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3286,7 +3288,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { // the character wasn't in the set. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3298,7 +3300,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // the predefined sets (Word Characters, for example) if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3321,7 +3323,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } } // the character wasn't in the set. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3329,7 +3331,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_SETREF: if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } else { UTEXT_SETNATIVEINDEX(fInputText, fp->fInputIdx); @@ -3344,7 +3346,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { break; } } else { - UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue); + UnicodeSet* s = static_cast<UnicodeSet*>(fSets->elementAt(opValue)); if (s->contains(c)) { // The character is in the set. A Match. fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); @@ -3353,7 +3355,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } // the character wasn't in the set. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -3364,7 +3366,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3374,7 +3376,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { UChar32 c = UTEXT_NEXT32(fInputText); if (isLineTerminator(c)) { // End of line in normal mode. . does not match. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); @@ -3388,7 +3390,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3418,7 +3420,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3428,7 +3430,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { UChar32 c = UTEXT_NEXT32(fInputText); if (c == 0x0a) { // End of line in normal mode. '.' does not match the \n - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } else { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } @@ -3457,7 +3459,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // data address of the input position at the start of the loop. { U_ASSERT(opValue > 0 && opValue < fPattern->fCompiledPat->size()); - int32_t stoOp = (int32_t)pat[opValue-1]; + int32_t stoOp = static_cast<int32_t>(pat[opValue - 1]); U_ASSERT(URX_TYPE(stoOp) == URX_STO_INP_LOC); int32_t frameLoc = URX_VAL(stoOp); U_ASSERT(frameLoc >= 0 && frameLoc < fFrameSize); @@ -3481,11 +3483,11 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Pick up the three extra operands that CTR_INIT has, and // skip the pattern location counter past - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 3; int32_t loopLoc = URX_VAL(pat[instrOperandLoc]); - int32_t minCount = (int32_t)pat[instrOperandLoc+1]; - int32_t maxCount = (int32_t)pat[instrOperandLoc+2]; + int32_t minCount = static_cast<int32_t>(pat[instrOperandLoc + 1]); + int32_t maxCount = static_cast<int32_t>(pat[instrOperandLoc + 2]); U_ASSERT(minCount>=0); U_ASSERT(maxCount>=minCount || maxCount==-1); U_ASSERT(loopLoc>=fp->fPatIdx); @@ -3496,7 +3498,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (maxCount == -1) { fp->fExtra[opValue+1] = fp->fInputIdx; // For loop breaking. } else if (maxCount == 0) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3504,13 +3506,13 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_CTR_LOOP: { U_ASSERT(opValue>0 && opValue < fp->fPatIdx-2); - int32_t initOp = (int32_t)pat[opValue]; + int32_t initOp = static_cast<int32_t>(pat[opValue]); U_ASSERT(URX_TYPE(initOp) == URX_CTR_INIT); int64_t *pCounter = &fp->fExtra[URX_VAL(initOp)]; - int32_t minCount = (int32_t)pat[opValue+2]; - int32_t maxCount = (int32_t)pat[opValue+3]; + int32_t minCount = static_cast<int32_t>(pat[opValue + 2]); + int32_t maxCount = static_cast<int32_t>(pat[opValue + 3]); (*pCounter)++; - if ((uint64_t)*pCounter >= (uint32_t)maxCount && maxCount != -1) { + if (static_cast<uint64_t>(*pCounter) >= static_cast<uint32_t>(maxCount) && maxCount != -1) { U_ASSERT(*pCounter == maxCount); break; } @@ -3546,11 +3548,11 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Pick up the three extra operands that CTR_INIT_NG has, and // skip the pattern location counter past - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 3; int32_t loopLoc = URX_VAL(pat[instrOperandLoc]); - int32_t minCount = (int32_t)pat[instrOperandLoc+1]; - int32_t maxCount = (int32_t)pat[instrOperandLoc+2]; + int32_t minCount = static_cast<int32_t>(pat[instrOperandLoc + 1]); + int32_t maxCount = static_cast<int32_t>(pat[instrOperandLoc + 2]); U_ASSERT(minCount>=0); U_ASSERT(maxCount>=minCount || maxCount==-1); U_ASSERT(loopLoc>fp->fPatIdx); @@ -3571,14 +3573,14 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { // Non-greedy {min, max} loops U_ASSERT(opValue>0 && opValue < fp->fPatIdx-2); - int32_t initOp = (int32_t)pat[opValue]; + int32_t initOp = static_cast<int32_t>(pat[opValue]); U_ASSERT(URX_TYPE(initOp) == URX_CTR_INIT_NG); int64_t *pCounter = &fp->fExtra[URX_VAL(initOp)]; - int32_t minCount = (int32_t)pat[opValue+2]; - int32_t maxCount = (int32_t)pat[opValue+3]; + int32_t minCount = static_cast<int32_t>(pat[opValue + 2]); + int32_t maxCount = static_cast<int32_t>(pat[opValue + 3]); (*pCounter)++; - if ((uint64_t)*pCounter >= (uint32_t)maxCount && maxCount != -1) { + if (static_cast<uint64_t>(*pCounter) >= static_cast<uint32_t>(maxCount) && maxCount != -1) { // The loop has matched the maximum permitted number of times. // Break out of here with no action. Matching will // continue with the following pattern. @@ -3625,17 +3627,17 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_LD_SP: { U_ASSERT(opValue >= 0 && opValue < fPattern->fDataSize); - int32_t newStackSize = (int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(newStackSize <= fStack->size()); int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize; - if (newFP == (int64_t *)fp) { + if (newFP == reinterpret_cast<int64_t*>(fp)) { break; } int32_t j; for (j=0; j<fFrameSize; j++) { - newFP[j] = ((int64_t *)fp)[j]; + newFP[j] = reinterpret_cast<int64_t*>(fp)[j]; } - fp = (REStackFrame *)newFP; + fp = reinterpret_cast<REStackFrame*>(newFP); fStack->setSize(newStackSize); } break; @@ -3648,7 +3650,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { U_ASSERT(groupStartIdx <= groupEndIdx); if (groupStartIdx < 0) { // This capture group has not participated in the match thus far, - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no match. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no match. break; } UTEXT_SETNATIVEINDEX(fAltInputText, groupStartIdx); @@ -3680,7 +3682,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -3695,7 +3697,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { U_ASSERT(groupStartIdx <= groupEndIdx); if (groupStartIdx < 0) { // This capture group has not participated in the match thus far, - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no match. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no match. break; } utext_setNativeIndex(fAltInputText, groupStartIdx); @@ -3736,7 +3738,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } @@ -3751,7 +3753,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { case URX_JMPX: { - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 1; int32_t dataLoc = URX_VAL(pat[instrOperandLoc]); U_ASSERT(dataLoc >= 0 && dataLoc < fFrameSize); @@ -3760,7 +3762,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (savedInputIdx < fp->fInputIdx) { fp->fPatIdx = opValue; // JMP } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no progress in loop. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no progress in loop. } } break; @@ -3785,7 +3787,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // restore Stack Ptr, Input Pos to positions they had on entry to block. U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize); int32_t stackSize = fStack->size(); - int32_t newStackSize =(int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(stackSize >= newStackSize); if (stackSize > newStackSize) { // Copy the current top frame back to the new (cut back) top frame. @@ -3794,9 +3796,9 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize; int32_t j; for (j=0; j<fFrameSize; j++) { - newFP[j] = ((int64_t *)fp)[j]; + newFP[j] = reinterpret_cast<int64_t*>(fp)[j]; } - fp = (REStackFrame *)newFP; + fp = reinterpret_cast<REStackFrame*>(newFP); fStack->setSize(newStackSize); } fp->fInputIdx = fData[opValue+1]; @@ -3826,7 +3828,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { fHitEnd = true; } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; case URX_STRING_I: @@ -3839,7 +3841,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { const char16_t *patternString = litText + opValue; int32_t patternStringIdx = 0; - op = (int32_t)pat[fp->fPatIdx]; + op = static_cast<int32_t>(pat[fp->fPatIdx]); fp->fPatIdx++; opType = URX_TYPE(op); opValue = URX_VAL(op); @@ -3873,7 +3875,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (success) { fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } } @@ -3906,8 +3908,8 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Fetch the min and max possible match lengths. They are the operands // of this op in the pattern. - int32_t minML = (int32_t)pat[fp->fPatIdx++]; - int32_t maxML = (int32_t)pat[fp->fPatIdx++]; + int32_t minML = static_cast<int32_t>(pat[fp->fPatIdx++]); + int32_t maxML = static_cast<int32_t>(pat[fp->fPatIdx++]); if (!UTEXT_USES_U16(fInputText)) { // utf-8 fix to maximum match length. The pattern compiler assumes utf-16. // The max length need not be exact; it just needs to be >= actual maximum. @@ -3943,7 +3945,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // We have tried all potential match starting points without // getting a match. Backtrack out, and out of the // Look Behind altogether. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); fActiveStart = fData[opValue+2]; fActiveLimit = fData[opValue+3]; U_ASSERT(fActiveStart >= 0); @@ -3968,7 +3970,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // FAIL out of here, which will take us back to the LB_CONT, which // will retry the match starting at another position or fail // the look-behind altogether, whichever is appropriate. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -3989,14 +3991,14 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // at all possible input starting positions. // Fetch the extra parameters of this op. - int32_t minML = (int32_t)pat[fp->fPatIdx++]; - int32_t maxML = (int32_t)pat[fp->fPatIdx++]; + int32_t minML = static_cast<int32_t>(pat[fp->fPatIdx++]); + int32_t maxML = static_cast<int32_t>(pat[fp->fPatIdx++]); if (!UTEXT_USES_U16(fInputText)) { // utf-8 fix to maximum match length. The pattern compiler assumes utf-16. // The max length need not be exact; it just needs to be >= actual maximum. maxML *= 3; } - int32_t continueLoc = (int32_t)pat[fp->fPatIdx++]; + int32_t continueLoc = static_cast<int32_t>(pat[fp->fPatIdx++]); continueLoc = URX_VAL(continueLoc); U_ASSERT(minML <= maxML); U_ASSERT(minML >= 0); @@ -4054,7 +4056,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // FAIL out of here, which will take us back to the LB_CONT, which // will retry the match starting at another position or succeed // the look-behind altogether, whichever is appropriate. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4072,13 +4074,13 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Restore original stack position, discarding any state saved // by the successful pattern match. U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize); - int32_t newStackSize = (int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(fStack->size() > newStackSize); fStack->setSize(newStackSize); // FAIL, which will take control back to someplace // prior to entering the look-behind test. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4091,7 +4093,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { { U_ASSERT(opValue > 0 && opValue < fSets->size()); Regex8BitSet *s8 = &fPattern->fSets8[opValue]; - UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue); + UnicodeSet* s = static_cast<UnicodeSet*>(fSets->elementAt(opValue)); // Loop through input, until either the input is exhausted or // we reach a character that is not a member of the set. @@ -4125,7 +4127,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Peek ahead in the compiled pattern, to the URX_LOOP_C that // must follow. It's operand is the stack location // that holds the starting input index for the match of this [set]* - int32_t loopcOp = (int32_t)pat[fp->fPatIdx]; + int32_t loopcOp = static_cast<int32_t>(pat[fp->fPatIdx]); U_ASSERT(URX_TYPE(loopcOp) == URX_LOOP_C); int32_t stackLoc = URX_VAL(loopcOp); U_ASSERT(stackLoc >= 0 && stackLoc < fFrameSize); @@ -4186,7 +4188,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // Peek ahead in the compiled pattern, to the URX_LOOP_C that // must follow. It's operand is the stack location // that holds the starting input index for the match of this .* - int32_t loopcOp = (int32_t)pat[fp->fPatIdx]; + int32_t loopcOp = static_cast<int32_t>(pat[fp->fPatIdx]); U_ASSERT(URX_TYPE(loopcOp) == URX_LOOP_C); int32_t stackLoc = URX_VAL(loopcOp); U_ASSERT(stackLoc >= 0 && stackLoc < fFrameSize); @@ -4227,7 +4229,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { if (prevC == 0x0a && fp->fInputIdx > backSearchIndex && twoPrevC == 0x0d) { - int32_t prevOp = (int32_t)pat[fp->fPatIdx-2]; + int32_t prevOp = static_cast<int32_t>(pat[fp->fPatIdx - 2]); if (URX_TYPE(prevOp) == URX_LOOP_DOT_I) { // .*, stepping back over CRLF pair. fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText); @@ -4278,7 +4280,6 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { fFrame = fp; // The active stack frame when the engine stopped. // Contains the capture group results that we need to // access later. - return; } @@ -4345,7 +4346,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // One iteration of the loop per pattern operation performed. // for (;;) { - op = (int32_t)pat[fp->fPatIdx]; + op = static_cast<int32_t>(pat[fp->fPatIdx]); opType = URX_TYPE(op); opValue = URX_VAL(op); #ifdef REGEX_RUN_DEBUG @@ -4369,7 +4370,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Force a backtrack. In some circumstances, the pattern compiler // will notice that the pattern can't possibly match anything, and will // emit one of these at that point. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -4383,7 +4384,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } else { fHitEnd = true; } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -4395,7 +4396,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu int32_t stringStartIdx = opValue; int32_t stringLen; - op = (int32_t)pat[fp->fPatIdx]; // Fetch the second operand + op = static_cast<int32_t>(pat[fp->fPatIdx]); // Fetch the second operand fp->fPatIdx++; opType = URX_TYPE(op); stringLen = URX_VAL(op); @@ -4419,10 +4420,18 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } } + // If the pattern string ends with an unpaired lead surrogate that + // matched the lead surrogate of a valid pair in the input text, + // this does not count as a match. + if (success && U16_IS_LEAD(*(pInp-1)) && + pInp < pInpLimit && U16_IS_TRAIL(*(pInp))) { + success = false; + } + if (success) { fp->fInputIdx += stringLen; } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4438,7 +4447,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // when we reach the end of the pattern. if (toEnd && fp->fInputIdx != fActiveLimit) { // The pattern matched, but not to the end of input. Try some more. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } isMatch = true; @@ -4469,7 +4478,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (fp->fInputIdx < fAnchorLimit-2) { // We are no where near the end of input. Fail. // This is the common case. Keep it first. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } if (fp->fInputIdx >= fAnchorLimit) { @@ -4500,7 +4509,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu break; // At CR/LF at end of input. Success } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -4524,7 +4533,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } // Not at end of input. Back-track out. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; @@ -4548,7 +4557,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } } // not at a new line. Fail. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4564,7 +4573,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // If we are not positioned just before a new-line, the test fails; backtrack out. // It makes no difference where the new-line is within the input. if (inputBuf[fp->fInputIdx] != 0x0a) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4572,7 +4581,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_CARET: // ^, test for start of line if (fp->fInputIdx != fAnchorStart) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4593,7 +4602,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu break; } // Not at the start of a line. Fail. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4610,17 +4619,17 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu char16_t c = inputBuf[fp->fInputIdx - 1]; if (c != 0x0a) { // Not at the start of a line. Back-track out. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; case URX_BACKSLASH_B: // Test for word boundaries { - UBool success = isChunkWordBoundary((int32_t)fp->fInputIdx); - success ^= (UBool)(opValue != 0); // flip sense for \B + UBool success = isChunkWordBoundary(static_cast<int32_t>(fp->fInputIdx)); + success ^= static_cast<UBool>(opValue != 0); // flip sense for \B if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4629,9 +4638,9 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_BACKSLASH_BU: // Test for word boundaries, Unicode-style { UBool success = isUWordBoundary(fp->fInputIdx, status); - success ^= (UBool)(opValue != 0); // flip sense for \B + success ^= static_cast<UBool>(opValue != 0); // flip sense for \B if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4641,7 +4650,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4649,9 +4658,9 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c); int8_t ctype = u_charType(c); // TODO: make a unicode set for this. Will be faster. UBool success = (ctype == U_DECIMAL_DIGIT_NUMBER); - success ^= (UBool)(opValue != 0); // flip sense for \D + success ^= static_cast<UBool>(opValue != 0); // flip sense for \D if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4659,7 +4668,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_BACKSLASH_G: // Test for position at end of previous match if (!((fMatch && fp->fInputIdx==fMatchEnd) || (fMatch==false && fp->fInputIdx==fActiveStart))) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4668,16 +4677,16 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UChar32 c; U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c); int8_t ctype = u_charType(c); UBool success = (ctype == U_SPACE_SEPARATOR || c == 9); // SPACE_SEPARATOR || TAB - success ^= (UBool)(opValue != 0); // flip sense for \H + success ^= static_cast<UBool>(opValue != 0); // flip sense for \H if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4687,7 +4696,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UChar32 c; @@ -4702,7 +4711,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } } } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4712,15 +4721,15 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } UChar32 c; U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c); UBool success = isLineTerminator(c); - success ^= (UBool)(opValue != 0); // flip sense for \V + success ^= static_cast<UBool>(opValue != 0); // flip sense for \V if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4732,7 +4741,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Fail if at end of input if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4746,7 +4755,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_BACKSLASH_Z: // Test for end of Input if (fp->fInputIdx < fAnchorLimit) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } else { fHitEnd = true; fRequireEnd = true; @@ -4764,7 +4773,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // 1: success if input char is not in set. if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4786,7 +4795,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } } if (!success) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4798,7 +4807,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // the predefined sets (Word Characters, for example) if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4817,7 +4826,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu break; } } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4826,7 +4835,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { if (fp->fInputIdx >= fActiveLimit) { fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4842,7 +4851,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu break; } } else { - UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue); + UnicodeSet* s = static_cast<UnicodeSet*>(fSets->elementAt(opValue)); if (s->contains(c)) { // The character is in the set. A Match. break; @@ -4850,7 +4859,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } // the character wasn't in the set. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -4861,7 +4870,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4870,7 +4879,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c); if (isLineTerminator(c)) { // End of line in normal mode. . does not match. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } } @@ -4883,7 +4892,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4908,7 +4917,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (fp->fInputIdx >= fActiveLimit) { // At end of input. Match failed. Backtrack out. fHitEnd = true; - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -4917,7 +4926,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu U16_NEXT(inputBuf, fp->fInputIdx, fActiveLimit, c); if (c == 0x0a) { // End of line in normal mode. '.' does not match the \n - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4944,11 +4953,11 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // data address of the input position at the start of the loop. { U_ASSERT(opValue > 0 && opValue < fPattern->fCompiledPat->size()); - int32_t stoOp = (int32_t)pat[opValue-1]; + int32_t stoOp = static_cast<int32_t>(pat[opValue - 1]); U_ASSERT(URX_TYPE(stoOp) == URX_STO_INP_LOC); int32_t frameLoc = URX_VAL(stoOp); U_ASSERT(frameLoc >= 0 && frameLoc < fFrameSize); - int32_t prevInputIdx = (int32_t)fp->fExtra[frameLoc]; + int32_t prevInputIdx = static_cast<int32_t>(fp->fExtra[frameLoc]); U_ASSERT(prevInputIdx <= fp->fInputIdx); if (prevInputIdx < fp->fInputIdx) { // The match did make progress. Repeat the loop. @@ -4968,11 +4977,11 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Pick up the three extra operands that CTR_INIT has, and // skip the pattern location counter past - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 3; int32_t loopLoc = URX_VAL(pat[instrOperandLoc]); - int32_t minCount = (int32_t)pat[instrOperandLoc+1]; - int32_t maxCount = (int32_t)pat[instrOperandLoc+2]; + int32_t minCount = static_cast<int32_t>(pat[instrOperandLoc + 1]); + int32_t maxCount = static_cast<int32_t>(pat[instrOperandLoc + 2]); U_ASSERT(minCount>=0); U_ASSERT(maxCount>=minCount || maxCount==-1); U_ASSERT(loopLoc>=fp->fPatIdx); @@ -4983,7 +4992,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (maxCount == -1) { fp->fExtra[opValue+1] = fp->fInputIdx; // For loop breaking. } else if (maxCount == 0) { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -4991,13 +5000,13 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_CTR_LOOP: { U_ASSERT(opValue>0 && opValue < fp->fPatIdx-2); - int32_t initOp = (int32_t)pat[opValue]; + int32_t initOp = static_cast<int32_t>(pat[opValue]); U_ASSERT(URX_TYPE(initOp) == URX_CTR_INIT); int64_t *pCounter = &fp->fExtra[URX_VAL(initOp)]; - int32_t minCount = (int32_t)pat[opValue+2]; - int32_t maxCount = (int32_t)pat[opValue+3]; + int32_t minCount = static_cast<int32_t>(pat[opValue + 2]); + int32_t maxCount = static_cast<int32_t>(pat[opValue + 3]); (*pCounter)++; - if ((uint64_t)*pCounter >= (uint32_t)maxCount && maxCount != -1) { + if (static_cast<uint64_t>(*pCounter) >= static_cast<uint32_t>(maxCount) && maxCount != -1) { U_ASSERT(*pCounter == maxCount); break; } @@ -5032,11 +5041,11 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Pick up the three extra operands that CTR_INIT_NG has, and // skip the pattern location counter past - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 3; int32_t loopLoc = URX_VAL(pat[instrOperandLoc]); - int32_t minCount = (int32_t)pat[instrOperandLoc+1]; - int32_t maxCount = (int32_t)pat[instrOperandLoc+2]; + int32_t minCount = static_cast<int32_t>(pat[instrOperandLoc + 1]); + int32_t maxCount = static_cast<int32_t>(pat[instrOperandLoc + 2]); U_ASSERT(minCount>=0); U_ASSERT(maxCount>=minCount || maxCount==-1); U_ASSERT(loopLoc>fp->fPatIdx); @@ -5057,14 +5066,14 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { // Non-greedy {min, max} loops U_ASSERT(opValue>0 && opValue < fp->fPatIdx-2); - int32_t initOp = (int32_t)pat[opValue]; + int32_t initOp = static_cast<int32_t>(pat[opValue]); U_ASSERT(URX_TYPE(initOp) == URX_CTR_INIT_NG); int64_t *pCounter = &fp->fExtra[URX_VAL(initOp)]; - int32_t minCount = (int32_t)pat[opValue+2]; - int32_t maxCount = (int32_t)pat[opValue+3]; + int32_t minCount = static_cast<int32_t>(pat[opValue + 2]); + int32_t maxCount = static_cast<int32_t>(pat[opValue + 3]); (*pCounter)++; - if ((uint64_t)*pCounter >= (uint32_t)maxCount && maxCount != -1) { + if (static_cast<uint64_t>(*pCounter) >= static_cast<uint32_t>(maxCount) && maxCount != -1) { // The loop has matched the maximum permitted number of times. // Break out of here with no action. Matching will // continue with the following pattern. @@ -5110,17 +5119,17 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_LD_SP: { U_ASSERT(opValue >= 0 && opValue < fPattern->fDataSize); - int32_t newStackSize = (int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(newStackSize <= fStack->size()); int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize; - if (newFP == (int64_t *)fp) { + if (newFP == reinterpret_cast<int64_t*>(fp)) { break; } int32_t j; for (j=0; j<fFrameSize; j++) { - newFP[j] = ((int64_t *)fp)[j]; + newFP[j] = reinterpret_cast<int64_t*>(fp)[j]; } - fp = (REStackFrame *)newFP; + fp = reinterpret_cast<REStackFrame*>(newFP); fStack->setSize(newStackSize); } break; @@ -5134,7 +5143,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu int64_t inputIndex = fp->fInputIdx; if (groupStartIdx < 0) { // This capture group has not participated in the match thus far, - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no match. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no match. break; } UBool success = true; @@ -5158,7 +5167,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (success) { fp->fInputIdx = inputIndex; } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -5171,7 +5180,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu U_ASSERT(groupStartIdx <= groupEndIdx); if (groupStartIdx < 0) { // This capture group has not participated in the match thus far, - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no match. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no match. break; } CaseFoldingUCharIterator captureGroupItr(inputBuf, groupStartIdx, groupEndIdx); @@ -5210,7 +5219,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (success) { fp->fInputIdx = inputItr.getIndex(); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -5224,16 +5233,16 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_JMPX: { - int32_t instrOperandLoc = (int32_t)fp->fPatIdx; + int32_t instrOperandLoc = static_cast<int32_t>(fp->fPatIdx); fp->fPatIdx += 1; int32_t dataLoc = URX_VAL(pat[instrOperandLoc]); U_ASSERT(dataLoc >= 0 && dataLoc < fFrameSize); - int32_t savedInputIdx = (int32_t)fp->fExtra[dataLoc]; + int32_t savedInputIdx = static_cast<int32_t>(fp->fExtra[dataLoc]); U_ASSERT(savedInputIdx <= fp->fInputIdx); if (savedInputIdx < fp->fInputIdx) { fp->fPatIdx = opValue; // JMP } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); // FAIL, no progress in loop. + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); // FAIL, no progress in loop. } } break; @@ -5258,7 +5267,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // restore Stack Ptr, Input Pos to positions they had on entry to block. U_ASSERT(opValue>=0 && opValue+3<fPattern->fDataSize); int32_t stackSize = fStack->size(); - int32_t newStackSize = (int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(stackSize >= newStackSize); if (stackSize > newStackSize) { // Copy the current top frame back to the new (cut back) top frame. @@ -5267,9 +5276,9 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize; int32_t j; for (j=0; j<fFrameSize; j++) { - newFP[j] = ((int64_t *)fp)[j]; + newFP[j] = reinterpret_cast<int64_t*>(fp)[j]; } - fp = (REStackFrame *)newFP; + fp = reinterpret_cast<REStackFrame*>(newFP); fStack->setSize(newStackSize); } fp->fInputIdx = fData[opValue+1]; @@ -5293,7 +5302,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } else { fHitEnd = true; } - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; case URX_STRING_I: @@ -5304,7 +5313,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { const char16_t *patternString = litText + opValue; - op = (int32_t)pat[fp->fPatIdx]; + op = static_cast<int32_t>(pat[fp->fPatIdx]); fp->fPatIdx++; opType = URX_TYPE(op); opValue = URX_VAL(op); @@ -5334,7 +5343,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (success) { fp->fInputIdx = inputIterator.getIndex(); } else { - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } } break; @@ -5366,8 +5375,8 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Fetch the min and max possible match lengths. They are the operands // of this op in the pattern. - int32_t minML = (int32_t)pat[fp->fPatIdx++]; - int32_t maxML = (int32_t)pat[fp->fPatIdx++]; + int32_t minML = static_cast<int32_t>(pat[fp->fPatIdx++]); + int32_t maxML = static_cast<int32_t>(pat[fp->fPatIdx++]); U_ASSERT(minML <= maxML); U_ASSERT(minML >= 0); @@ -5394,7 +5403,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // We have tried all potential match starting points without // getting a match. Backtrack out, and out of the // Look Behind altogether. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); fActiveStart = fData[opValue+2]; fActiveLimit = fData[opValue+3]; U_ASSERT(fActiveStart >= 0); @@ -5419,7 +5428,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // FAIL out of here, which will take us back to the LB_CONT, which // will retry the match starting at another position or fail // the look-behind altogether, whichever is appropriate. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -5440,9 +5449,9 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // at all possible input starting positions. // Fetch the extra parameters of this op. - int32_t minML = (int32_t)pat[fp->fPatIdx++]; - int32_t maxML = (int32_t)pat[fp->fPatIdx++]; - int32_t continueLoc = (int32_t)pat[fp->fPatIdx++]; + int32_t minML = static_cast<int32_t>(pat[fp->fPatIdx++]); + int32_t maxML = static_cast<int32_t>(pat[fp->fPatIdx++]); + int32_t continueLoc = static_cast<int32_t>(pat[fp->fPatIdx++]); continueLoc = URX_VAL(continueLoc); U_ASSERT(minML <= maxML); U_ASSERT(minML >= 0); @@ -5496,7 +5505,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // FAIL out of here, which will take us back to the LB_CONT, which // will retry the match starting at another position or succeed // the look-behind altogether, whichever is appropriate. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); break; } @@ -5514,13 +5523,13 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Restore original stack position, discarding any state saved // by the successful pattern match. U_ASSERT(opValue>=0 && opValue+1<fPattern->fDataSize); - int32_t newStackSize = (int32_t)fData[opValue]; + int32_t newStackSize = static_cast<int32_t>(fData[opValue]); U_ASSERT(fStack->size() > newStackSize); fStack->setSize(newStackSize); // FAIL, which will take control back to someplace // prior to entering the look-behind test. - fp = (REStackFrame *)fStack->popFrame(fFrameSize); + fp = reinterpret_cast<REStackFrame*>(fStack->popFrame(fFrameSize)); } break; @@ -5533,11 +5542,11 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu { U_ASSERT(opValue > 0 && opValue < fSets->size()); Regex8BitSet *s8 = &fPattern->fSets8[opValue]; - UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue); + UnicodeSet* s = static_cast<UnicodeSet*>(fSets->elementAt(opValue)); // Loop through input, until either the input is exhausted or // we reach a character that is not a member of the set. - int32_t ix = (int32_t)fp->fInputIdx; + int32_t ix = static_cast<int32_t>(fp->fInputIdx); for (;;) { if (ix >= fActiveLimit) { fHitEnd = true; @@ -5568,7 +5577,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Peek ahead in the compiled pattern, to the URX_LOOP_C that // must follow. It's operand is the stack location // that holds the starting input index for the match of this [set]* - int32_t loopcOp = (int32_t)pat[fp->fPatIdx]; + int32_t loopcOp = static_cast<int32_t>(pat[fp->fPatIdx]); U_ASSERT(URX_TYPE(loopcOp) == URX_LOOP_C); int32_t stackLoc = URX_VAL(loopcOp); U_ASSERT(stackLoc >= 0 && stackLoc < fFrameSize); @@ -5594,12 +5603,12 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu int32_t ix; if ((opValue & 1) == 1) { // Dot-matches-All mode. Jump straight to the end of the string. - ix = (int32_t)fActiveLimit; + ix = static_cast<int32_t>(fActiveLimit); fHitEnd = true; } else { // NOT DOT ALL mode. Line endings do not match '.' // Scan forward until a line ending or end of input. - ix = (int32_t)fp->fInputIdx; + ix = static_cast<int32_t>(fp->fInputIdx); for (;;) { if (ix >= fActiveLimit) { fHitEnd = true; @@ -5630,7 +5639,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // Peek ahead in the compiled pattern, to the URX_LOOP_C that // must follow. It's operand is the stack location // that holds the starting input index for the match of this .* - int32_t loopcOp = (int32_t)pat[fp->fPatIdx]; + int32_t loopcOp = static_cast<int32_t>(pat[fp->fPatIdx]); U_ASSERT(URX_TYPE(loopcOp) == URX_LOOP_C); int32_t stackLoc = URX_VAL(loopcOp); U_ASSERT(stackLoc >= 0 && stackLoc < fFrameSize); @@ -5649,7 +5658,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu case URX_LOOP_C: { U_ASSERT(opValue>=0 && opValue<fFrameSize); - backSearchIndex = (int32_t)fp->fExtra[opValue]; + backSearchIndex = static_cast<int32_t>(fp->fExtra[opValue]); U_ASSERT(backSearchIndex <= fp->fInputIdx); if (backSearchIndex == fp->fInputIdx) { // We've backed up the input idx to the point that the loop started. @@ -5669,7 +5678,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu if (prevC == 0x0a && fp->fInputIdx > backSearchIndex && inputBuf[fp->fInputIdx-1] == 0x0d) { - int32_t prevOp = (int32_t)pat[fp->fPatIdx-2]; + int32_t prevOp = static_cast<int32_t>(pat[fp->fPatIdx - 2]); if (URX_TYPE(prevOp) == URX_LOOP_DOT_I) { // .*, stepping back over CRLF pair. U16_BACK_1(inputBuf, 0, fp->fInputIdx); @@ -5720,8 +5729,6 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu fFrame = fp; // The active stack frame when the engine stopped. // Contains the capture group results that we need to // access later. - - return; } diff --git a/deps/icu-small/source/i18n/remtrans.cpp b/deps/icu-small/source/i18n/remtrans.cpp index 40af1845c7beb4..015adb8d0b1f70 100644 --- a/deps/icu-small/source/i18n/remtrans.cpp +++ b/deps/icu-small/source/i18n/remtrans.cpp @@ -44,13 +44,13 @@ void RemoveTransliterator::registerIDs() { UNICODE_STRING_SIMPLE("Null"), false); } -RemoveTransliterator::RemoveTransliterator() : Transliterator(UnicodeString(true, ::CURR_ID, -1), 0) {} +RemoveTransliterator::RemoveTransliterator() : Transliterator(UnicodeString(true, ::CURR_ID, -1), nullptr) {} RemoveTransliterator::~RemoveTransliterator() {} RemoveTransliterator* RemoveTransliterator::clone() const { RemoveTransliterator* result = new RemoveTransliterator(); - if (result != nullptr && getFilter() != 0) { + if (result != nullptr && getFilter() != nullptr) { result->adoptFilter(getFilter()->clone()); } return result; diff --git a/deps/icu-small/source/i18n/repattrn.cpp b/deps/icu-small/source/i18n/repattrn.cpp index c0a88f70d9256b..f0cc709e9739b3 100644 --- a/deps/icu-small/source/i18n/repattrn.cpp +++ b/deps/icu-small/source/i18n/repattrn.cpp @@ -125,7 +125,7 @@ RegexPattern &RegexPattern::operator = (const RegexPattern &other) { if (U_FAILURE(fDeferredStatus)) { return *this; } - UnicodeSet *sourceSet = (UnicodeSet *)other.fSets->elementAt(i); + UnicodeSet* sourceSet = static_cast<UnicodeSet*>(other.fSets->elementAt(i)); UnicodeSet *newSet = new UnicodeSet(*sourceSet); if (newSet == nullptr) { fDeferredStatus = U_MEMORY_ALLOCATION_ERROR; @@ -142,7 +142,7 @@ RegexPattern &RegexPattern::operator = (const RegexPattern &other) { if (U_FAILURE(fDeferredStatus)) { break; } - const UnicodeString *name = (const UnicodeString *)hashEl->key.pointer; + const UnicodeString* name = static_cast<const UnicodeString*>(hashEl->key.pointer); UnicodeString *key = new UnicodeString(*name); int32_t val = hashEl->value.integer; if (key == nullptr) { @@ -164,7 +164,7 @@ RegexPattern &RegexPattern::operator = (const RegexPattern &other) { //-------------------------------------------------------------------------- void RegexPattern::init() { fFlags = 0; - fCompiledPat = 0; + fCompiledPat = nullptr; fLiteralText.remove(); fSets = nullptr; fSets8 = nullptr; @@ -199,7 +199,7 @@ void RegexPattern::init() { } // Slot zero of the vector of sets is reserved. Fill it here. - fSets->addElement((int32_t)0, fDeferredStatus); + fSets->addElement(static_cast<int32_t>(0), fDeferredStatus); } @@ -232,10 +232,8 @@ void RegexPattern::zap() { int i; for (i=1; i<fSets->size(); i++) { UnicodeSet *s; - s = (UnicodeSet *)fSets->elementAt(i); - if (s != nullptr) { - delete s; - } + s = static_cast<UnicodeSet*>(fSets->elementAt(i)); + delete s; } delete fSets; fSets = nullptr; @@ -579,7 +577,7 @@ UnicodeString RegexPattern::pattern() const { if (fPatternString != nullptr) { return *fPatternString; } else if (fPattern == nullptr) { - return UnicodeString(); + return {}; } else { UErrorCode status = U_ZERO_ERROR; int64_t nativeLen = utext_nativeLength(fPattern); diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index cf4cfc87f2aac3..3d91b3c592b8cd 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -32,7 +32,6 @@ #include "unicode/utf8.h" #include "unicode/uversion.h" #include "bocsu.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "collation.h" @@ -428,7 +427,7 @@ RuleBasedCollator::getAttribute(UColAttribute attr, UErrorCode &errorCode) const option = CollationSettings::CHECK_FCD; break; case UCOL_STRENGTH: - return (UColAttributeValue)settings->getStrength(); + return static_cast<UColAttributeValue>(settings->getStrength()); case UCOL_HIRAGANA_QUATERNARY_MODE: // Deprecated attribute, unsettable. return UCOL_OFF; @@ -540,7 +539,7 @@ RuleBasedCollator::setMaxVariable(UColReorderCode group, UErrorCode &errorCode) } if(group == UCOL_REORDER_CODE_DEFAULT) { - group = (UColReorderCode)( + group = static_cast<UColReorderCode>( UCOL_REORDER_CODE_FIRST + int32_t{defaultSettings.getMaxVariable()}); } uint32_t varTop = data->getLastPrimaryForGroup(group); @@ -559,7 +558,7 @@ RuleBasedCollator::setMaxVariable(UColReorderCode group, UErrorCode &errorCode) UColReorderCode RuleBasedCollator::getMaxVariable() const { - return (UColReorderCode)(UCOL_REORDER_CODE_FIRST + int32_t{settings->getMaxVariable()}); + return static_cast<UColReorderCode>(UCOL_REORDER_CODE_FIRST + int32_t{settings->getMaxVariable()}); } uint32_t @@ -594,7 +593,7 @@ RuleBasedCollator::setVariableTop(const char16_t *varTop, int32_t len, UErrorCod errorCode = U_CE_NOT_FOUND_ERROR; return 0; } - setVariableTop((uint32_t)(ce1 >> 32), errorCode); + setVariableTop(static_cast<uint32_t>(ce1 >> 32), errorCode); return settings->variableTop; } @@ -863,7 +862,7 @@ class FCDUTF16NFDIterator : public UTF16NFDIterator { s = text; limit = spanLimit; } else { - str.setTo(text, (int32_t)(spanLimit - text)); + str.setTo(text, static_cast<int32_t>(spanLimit - text)); { ReorderingBuffer r_buffer(nfcImpl, str); if(r_buffer.init(str.length(), errorCode)) { @@ -1064,7 +1063,7 @@ RuleBasedCollator::doCompare(const char16_t *left, int32_t leftLength, } } if(result != UCOL_EQUAL || settings->getStrength() < UCOL_IDENTICAL || U_FAILURE(errorCode)) { - return (UCollationResult)result; + return static_cast<UCollationResult>(result); } // Note: If NUL-terminated, we could get the actual limits from the iterators now. @@ -1189,7 +1188,7 @@ RuleBasedCollator::doCompare(const uint8_t *left, int32_t leftLength, } } if(result != UCOL_EQUAL || settings->getStrength() < UCOL_IDENTICAL || U_FAILURE(errorCode)) { - return (UCollationResult)result; + return static_cast<UCollationResult>(result); } // Note: If NUL-terminated, we could get the actual limits from the iterators now. @@ -1365,13 +1364,13 @@ RuleBasedCollator::writeIdenticalLevel(const char16_t *s, const char16_t *limit, sink.Append(Collation::LEVEL_SEPARATOR_BYTE); UChar32 prev = 0; if(nfdQCYesLimit != s) { - prev = u_writeIdenticalLevelRun(prev, s, (int32_t)(nfdQCYesLimit - s), sink); + prev = u_writeIdenticalLevelRun(prev, s, static_cast<int32_t>(nfdQCYesLimit - s), sink); } // Is there non-NFD text? int32_t destLengthEstimate; if(limit != nullptr) { if(nfdQCYesLimit == limit) { return; } - destLengthEstimate = (int32_t)(limit - nfdQCYesLimit); + destLengthEstimate = static_cast<int32_t>(limit - nfdQCYesLimit); } else { // s is NUL-terminated if(*nfdQCYesLimit == 0) { return; } @@ -1433,10 +1432,10 @@ RuleBasedCollator::internalNextSortKeyPart(UCharIterator *iter, uint32_t state[2 if(count == 0) { return 0; } FixedSortKeyByteSink sink(reinterpret_cast<char *>(dest), count); - sink.IgnoreBytes((int32_t)state[1]); + sink.IgnoreBytes(static_cast<int32_t>(state[1])); iter->move(iter, 0, UITER_START); - Collation::Level level = (Collation::Level)state[0]; + Collation::Level level = static_cast<Collation::Level>(state[0]); if(level <= Collation::QUATERNARY_LEVEL) { UBool numeric = settings->isNumeric(); PartLevelCallback callback(sink); @@ -1451,8 +1450,8 @@ RuleBasedCollator::internalNextSortKeyPart(UCharIterator *iter, uint32_t state[2 } if(U_FAILURE(errorCode)) { return 0; } if(sink.NumberOfBytesAppended() > count) { - state[0] = (uint32_t)callback.getLevel(); - state[1] = (uint32_t)callback.getLevelCapacity(); + state[0] = static_cast<uint32_t>(callback.getLevel()); + state[1] = static_cast<uint32_t>(callback.getLevelCapacity()); return count; } // All of the normal levels are done. @@ -1469,20 +1468,20 @@ RuleBasedCollator::internalNextSortKeyPart(UCharIterator *iter, uint32_t state[2 for(;;) { UChar32 c = iter->next(iter); if(c < 0) { break; } - s.append((char16_t)c); + s.append(static_cast<char16_t>(c)); } const char16_t *sArray = s.getBuffer(); writeIdenticalLevel(sArray, sArray + s.length(), sink, errorCode); if(U_FAILURE(errorCode)) { return 0; } if(sink.NumberOfBytesAppended() > count) { - state[0] = (uint32_t)level; - state[1] = (uint32_t)levelCapacity; + state[0] = static_cast<uint32_t>(level); + state[1] = static_cast<uint32_t>(levelCapacity); return count; } } // ZERO_LEVEL: Fill the remainder of dest with 00 bytes. - state[0] = (uint32_t)Collation::ZERO_LEVEL; + state[0] = static_cast<uint32_t>(Collation::ZERO_LEVEL); state[1] = 0; int32_t length = sink.NumberOfBytesAppended(); int32_t i = length; @@ -1561,7 +1560,6 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, // Append items in alphabetic order of their short definition letters. CharString result; - char subtag[ULOC_KEYWORD_AND_VALUES_CAPACITY]; if(attributeHasBeenSetExplicitly(UCOL_ALTERNATE_HANDLING)) { appendAttribute(result, 'A', getAttribute(UCOL_ALTERNATE_HANDLING, errorCode), errorCode); @@ -1581,30 +1579,27 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, appendAttribute(result, 'F', getAttribute(UCOL_FRENCH_COLLATION, errorCode), errorCode); } // Note: UCOL_HIRAGANA_QUATERNARY_MODE is deprecated and never changes away from default. - { - CharString collation; - CharStringByteSink sink(&collation); - ulocimp_getKeywordValue(resultLocale, "collation", sink, &errorCode); - appendSubtag(result, 'K', collation.data(), collation.length(), errorCode); - } - length = uloc_getLanguage(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - if (length == 0) { + CharString collation = ulocimp_getKeywordValue(resultLocale, "collation", errorCode); + appendSubtag(result, 'K', collation.data(), collation.length(), errorCode); + CharString language; + CharString script; + CharString region; + CharString variant; + ulocimp_getSubtags(resultLocale, &language, &script, ®ion, &variant, nullptr, errorCode); + if (language.isEmpty()) { appendSubtag(result, 'L', "root", 4, errorCode); } else { - appendSubtag(result, 'L', subtag, length, errorCode); + appendSubtag(result, 'L', language.data(), language.length(), errorCode); } if(attributeHasBeenSetExplicitly(UCOL_NORMALIZATION_MODE)) { appendAttribute(result, 'N', getAttribute(UCOL_NORMALIZATION_MODE, errorCode), errorCode); } - length = uloc_getCountry(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - appendSubtag(result, 'R', subtag, length, errorCode); + appendSubtag(result, 'R', region.data(), region.length(), errorCode); if(attributeHasBeenSetExplicitly(UCOL_STRENGTH)) { appendAttribute(result, 'S', getAttribute(UCOL_STRENGTH, errorCode), errorCode); } - length = uloc_getVariant(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - appendSubtag(result, 'V', subtag, length, errorCode); - length = uloc_getScript(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - appendSubtag(result, 'Z', subtag, length, errorCode); + appendSubtag(result, 'V', variant.data(), variant.length(), errorCode); + appendSubtag(result, 'Z', script.data(), script.length(), errorCode); if(U_FAILURE(errorCode)) { return 0; } return result.extract(buffer, capacity, errorCode); diff --git a/deps/icu-small/source/i18n/scriptset.cpp b/deps/icu-small/source/i18n/scriptset.cpp index 736a85cf8c1f24..2bdb32d6feadc6 100644 --- a/deps/icu-small/source/i18n/scriptset.cpp +++ b/deps/icu-small/source/i18n/scriptset.cpp @@ -40,7 +40,9 @@ ScriptSet::ScriptSet(const ScriptSet &other) { } ScriptSet & ScriptSet::operator =(const ScriptSet &other) { - uprv_memcpy(bits, other.bits, sizeof(bits)); + if (this != &other) { + uprv_memcpy(bits, other.bits, sizeof(bits)); + } return *this; } @@ -57,7 +59,7 @@ UBool ScriptSet::test(UScriptCode script, UErrorCode &status) const { if (U_FAILURE(status)) { return false; } - if (script < 0 || (int32_t)script >= SCRIPT_LIMIT) { + if (script < 0 || static_cast<int32_t>(script) >= SCRIPT_LIMIT) { status = U_ILLEGAL_ARGUMENT_ERROR; return false; } @@ -71,7 +73,7 @@ ScriptSet &ScriptSet::set(UScriptCode script, UErrorCode &status) { if (U_FAILURE(status)) { return *this; } - if (script < 0 || (int32_t)script >= SCRIPT_LIMIT) { + if (script < 0 || static_cast<int32_t>(script) >= SCRIPT_LIMIT) { status = U_ILLEGAL_ARGUMENT_ERROR; return *this; } @@ -85,7 +87,7 @@ ScriptSet &ScriptSet::reset(UScriptCode script, UErrorCode &status) { if (U_FAILURE(status)) { return *this; } - if (script < 0 || (int32_t)script >= SCRIPT_LIMIT) { + if (script < 0 || static_cast<int32_t>(script) >= SCRIPT_LIMIT) { status = U_ILLEGAL_ARGUMENT_ERROR; return *this; } @@ -178,7 +180,7 @@ int32_t ScriptSet::nextSetBit(int32_t fromIndex) const { } UErrorCode status = U_ZERO_ERROR; for (int32_t scriptIndex = fromIndex; scriptIndex < SCRIPT_LIMIT; scriptIndex++) { - if (test((UScriptCode)scriptIndex, status)) { + if (test(static_cast<UScriptCode>(scriptIndex), status)) { return scriptIndex; } } @@ -198,10 +200,10 @@ UnicodeString &ScriptSet::displayScripts(UnicodeString &dest) const { UBool firstTime = true; for (int32_t i = nextSetBit(0); i >= 0; i = nextSetBit(i + 1)) { if (!firstTime) { - dest.append((char16_t)0x20); + dest.append(static_cast<char16_t>(0x20)); } firstTime = false; - const char *scriptName = uscript_getShortName((UScriptCode(i))); + const char* scriptName = uscript_getShortName(static_cast<UScriptCode>(i)); dest.append(UnicodeString(scriptName, -1, US_INV)); } return dest; @@ -230,7 +232,7 @@ ScriptSet &ScriptSet::parseScripts(const UnicodeString &scriptString, UErrorCode if (sc == UCHAR_INVALID_CODE) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { - this->set((UScriptCode)sc, status); + this->set(static_cast<UScriptCode>(sc), status); } if (U_FAILURE(status)) { return *this; @@ -285,19 +287,19 @@ uhash_equalsScriptSet(const UElement key1, const UElement key2) { return (*s1 == *s2); } -U_CAPI int8_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_compareScriptSet(UElement key0, UElement key1) { icu::ScriptSet *s0 = static_cast<icu::ScriptSet *>(key0.pointer); icu::ScriptSet *s1 = static_cast<icu::ScriptSet *>(key1.pointer); int32_t diff = s0->countMembers() - s1->countMembers(); - if (diff != 0) return static_cast<UBool>(diff); + if (diff != 0) return diff; int32_t i0 = s0->nextSetBit(0); int32_t i1 = s1->nextSetBit(0); while ((diff = i0-i1) == 0 && i0 > 0) { i0 = s0->nextSetBit(i0+1); i1 = s1->nextSetBit(i1+1); } - return (int8_t)diff; + return diff; } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h index df5cfdc7486890..d21d0db8a0144b 100644 --- a/deps/icu-small/source/i18n/scriptset.h +++ b/deps/icu-small/source/i18n/scriptset.h @@ -74,7 +74,7 @@ class U_I18N_API ScriptSet: public UMemory { U_NAMESPACE_END -U_CAPI UBool U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uhash_compareScriptSet(const UElement key1, const UElement key2); U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/i18n/search.cpp b/deps/icu-small/source/i18n/search.cpp index ec5028ca81b7b0..fd46f702a4cc1c 100644 --- a/deps/icu-small/source/i18n/search.cpp +++ b/deps/icu-small/source/i18n/search.cpp @@ -27,7 +27,7 @@ SearchIterator::SearchIterator(const SearchIterator &other) { m_breakiterator_ = other.m_breakiterator_; m_text_ = other.m_text_; - m_search_ = (USearch *)uprv_malloc(sizeof(USearch)); + m_search_ = static_cast<USearch*>(uprv_malloc(sizeof(USearch))); m_search_->breakIter = other.m_search_->breakIter; m_search_->isCanonicalMatch = other.m_search_->isCanonicalMatch; m_search_->isOverlap = other.m_search_->isOverlap; @@ -62,7 +62,7 @@ void SearchIterator::setAttribute(USearchAttribute attribute, break; case USEARCH_ELEMENT_COMPARISON : if (value == USEARCH_PATTERN_BASE_WEIGHT_IS_WILDCARD || value == USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD) { - m_search_->elementComparisonType = (int16_t)value; + m_search_->elementComparisonType = static_cast<int16_t>(value); } else { m_search_->elementComparisonType = 0; } @@ -88,7 +88,7 @@ USearchAttributeValue SearchIterator::getAttribute( { int16_t value = m_search_->elementComparisonType; if (value == USEARCH_PATTERN_BASE_WEIGHT_IS_WILDCARD || value == USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD) { - return (USearchAttributeValue)value; + return static_cast<USearchAttributeValue>(value); } else { return USEARCH_STANDARD_ELEMENT_COMPARISON; } @@ -136,7 +136,7 @@ void SearchIterator::setBreakIterator(BreakIterator *breakiter, // // Besides, a UBreakIterator is a BreakIterator, so // any subclass of BreakIterator should work fine here... - m_search_->breakIter = (UBreakIterator *) breakiter; + m_search_->breakIter = reinterpret_cast<UBreakIterator*>(breakiter); #endif m_breakiterator_ = breakiter; @@ -344,7 +344,7 @@ void SearchIterator::reset() SearchIterator::SearchIterator() { - m_search_ = (USearch *)uprv_malloc(sizeof(USearch)); + m_search_ = static_cast<USearch*>(uprv_malloc(sizeof(USearch))); m_search_->breakIter = nullptr; m_search_->isOverlap = false; m_search_->isCanonicalMatch = false; @@ -363,7 +363,7 @@ SearchIterator::SearchIterator(const UnicodeString &text, m_breakiterator_(breakiter), m_text_(text) { - m_search_ = (USearch *)uprv_malloc(sizeof(USearch)); + m_search_ = static_cast<USearch*>(uprv_malloc(sizeof(USearch))); m_search_->breakIter = nullptr; m_search_->isOverlap = false; m_search_->isCanonicalMatch = false; @@ -380,7 +380,7 @@ SearchIterator::SearchIterator(CharacterIterator &text, BreakIterator *breakiter) : m_breakiterator_(breakiter) { - m_search_ = (USearch *)uprv_malloc(sizeof(USearch)); + m_search_ = static_cast<USearch*>(uprv_malloc(sizeof(USearch))); m_search_->breakIter = nullptr; m_search_->isOverlap = false; m_search_->isCanonicalMatch = false; diff --git a/deps/icu-small/source/i18n/shareddateformatsymbols.h b/deps/icu-small/source/i18n/shareddateformatsymbols.h index b51fad98b0bfa6..10e5ac6f0809ad 100644 --- a/deps/icu-small/source/i18n/shareddateformatsymbols.h +++ b/deps/icu-small/source/i18n/shareddateformatsymbols.h @@ -22,13 +22,12 @@ U_NAMESPACE_BEGIN -class U_I18N_API SharedDateFormatSymbols : public SharedObject { +class U_I18N_API_CLASS SharedDateFormatSymbols : public SharedObject { public: - SharedDateFormatSymbols( - const Locale &loc, const char *type, UErrorCode &status) - : dfs(loc, type, status) { } - virtual ~SharedDateFormatSymbols(); - const DateFormatSymbols &get() const { return dfs; } + U_I18N_API SharedDateFormatSymbols(const Locale& loc, const char* type, UErrorCode& status) + : dfs(loc, type, status) {} + U_I18N_API virtual ~SharedDateFormatSymbols(); + U_I18N_API const DateFormatSymbols& get() const { return dfs; } private: DateFormatSymbols dfs; SharedDateFormatSymbols(const SharedDateFormatSymbols &) = delete; diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp index 8b21152f52f289..3f3b236ea45ca9 100644 --- a/deps/icu-small/source/i18n/simpletz.cpp +++ b/deps/icu-small/source/i18n/simpletz.cpp @@ -310,9 +310,9 @@ void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek, int32_t time, TimeMode mode, UErrorCode& status) { - startMonth = (int8_t)month; - startDay = (int8_t)dayOfWeekInMonth; - startDayOfWeek = (int8_t)dayOfWeek; + startMonth = static_cast<int8_t>(month); + startDay = static_cast<int8_t>(dayOfWeekInMonth); + startDayOfWeek = static_cast<int8_t>(dayOfWeek); startTime = time; startTimeMode = mode; decodeStartRule(status); @@ -362,9 +362,9 @@ void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek, int32_t time, TimeMode mode, UErrorCode& status) { - endMonth = (int8_t)month; - endDay = (int8_t)dayOfWeekInMonth; - endDayOfWeek = (int8_t)dayOfWeek; + endMonth = static_cast<int8_t>(month); + endDay = static_cast<int8_t>(dayOfWeekInMonth); + endDayOfWeek = static_cast<int8_t>(dayOfWeek); endTime = time; endTimeMode = mode; decodeEndRule(status); @@ -475,11 +475,11 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, // Compare the date to the starting and ending rules.+1 = date>rule, -1 // = date<rule, 0 = date==rule. - int32_t startCompare = compareToRule((int8_t)month, (int8_t)monthLength, (int8_t)prevMonthLength, - (int8_t)day, (int8_t)dayOfWeek, millis, + int32_t startCompare = compareToRule(static_cast<int8_t>(month), static_cast<int8_t>(monthLength), static_cast<int8_t>(prevMonthLength), + static_cast<int8_t>(day), static_cast<int8_t>(dayOfWeek), millis, startTimeMode == UTC_TIME ? -rawOffset : 0, - startMode, (int8_t)startMonth, (int8_t)startDayOfWeek, - (int8_t)startDay, startTime); + startMode, startMonth, startDayOfWeek, + startDay, startTime); int32_t endCompare = 0; /* We don't always have to compute endCompare. For many instances, @@ -489,12 +489,12 @@ SimpleTimeZone::getOffset(uint8_t era, int32_t year, int32_t month, int32_t day, * must have DST. This is reflected in the way the next if statement * (not the one immediately following) short circuits. */ if(southern != (startCompare >= 0)) { - endCompare = compareToRule((int8_t)month, (int8_t)monthLength, (int8_t)prevMonthLength, - (int8_t)day, (int8_t)dayOfWeek, millis, + endCompare = compareToRule(static_cast<int8_t>(month), static_cast<int8_t>(monthLength), static_cast<int8_t>(prevMonthLength), + static_cast<int8_t>(day), static_cast<int8_t>(dayOfWeek), millis, endTimeMode == WALL_TIME ? dstSavings : (endTimeMode == UTC_TIME ? -rawOffset : 0), - endMode, (int8_t)endMonth, (int8_t)endDayOfWeek, - (int8_t)endDay, endTime); + endMode, endMonth, endDayOfWeek, + endDay, endTime); } // Check for both the northern and southern hemisphere cases. We @@ -518,13 +518,14 @@ SimpleTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingT } rawOffsetGMT = getRawOffset(); - int32_t year, month, dom, dow, millis; - int32_t day = ClockMath::floorDivide(date, U_MILLIS_PER_DAY, &millis); + int32_t year, millis; + int8_t month, dom, dow; - Grego::dayToFields(day, year, month, dom, dow); + Grego::timeToFields(date, year, month, dom, dow, millis, status); + if (U_FAILURE(status)) return; savingsDST = getOffset(GregorianCalendar::AD, year, month, dom, - (uint8_t) dow, millis, + static_cast<uint8_t>(dow), millis, Grego::monthLength(year, month), status) - rawOffsetGMT; if (U_FAILURE(status)) { @@ -548,10 +549,10 @@ SimpleTimeZone::getOffsetFromLocal(UDate date, UTimeZoneLocalOption nonExistingT } } if (recalc) { - day = ClockMath::floorDivide(date, U_MILLIS_PER_DAY, &millis); - Grego::dayToFields(day, year, month, dom, dow); + Grego::timeToFields(date, year, month, dom, dow, millis, status); + if (U_FAILURE(status)) return; savingsDST = getOffset(GregorianCalendar::AD, year, month, dom, - (uint8_t) dow, millis, + static_cast<uint8_t>(dow), millis, Grego::monthLength(year, month), status) - rawOffsetGMT; } @@ -580,7 +581,7 @@ SimpleTimeZone::compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen while (millis >= U_MILLIS_PER_DAY) { millis -= U_MILLIS_PER_DAY; ++dayOfMonth; - dayOfWeek = (int8_t)(1 + (dayOfWeek % 7)); // dayOfWeek is one-based + dayOfWeek = static_cast<int8_t>(1 + (dayOfWeek % 7)); // dayOfWeek is one-based if (dayOfMonth > monthLen) { dayOfMonth = 1; /* When incrementing the month, it is desirable to overflow @@ -593,7 +594,7 @@ SimpleTimeZone::compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen while (millis < 0) { millis += U_MILLIS_PER_DAY; --dayOfMonth; - dayOfWeek = (int8_t)(1 + ((dayOfWeek+5) % 7)); // dayOfWeek is one-based + dayOfWeek = static_cast<int8_t>(1 + ((dayOfWeek + 5) % 7)); // dayOfWeek is one-based if (dayOfMonth < 1) { dayOfMonth = prevMonthLen; --month; @@ -726,7 +727,7 @@ UBool SimpleTimeZone::inDaylightTime(UDate date, UErrorCode& status) const if (U_FAILURE(status)) return false; GregorianCalendar *gc = new GregorianCalendar(*this, status); /* test for nullptr */ - if (gc == 0) { + if (gc == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return false; } @@ -870,7 +871,7 @@ SimpleTimeZone::decodeStartRule(UErrorCode& status) { if(U_FAILURE(status)) return; - useDaylight = (UBool)((startDay != 0) && (endDay != 0) ? true : false); + useDaylight = static_cast<UBool>(startDay != 0 && endDay != 0); if (useDaylight && dstSavings == 0) { dstSavings = U_MILLIS_PER_HOUR; } @@ -890,11 +891,11 @@ SimpleTimeZone::decodeStartRule(UErrorCode& status) if (startDayOfWeek > 0) { startMode = DOW_IN_MONTH_MODE; } else { - startDayOfWeek = (int8_t)-startDayOfWeek; + startDayOfWeek = static_cast<int8_t>(-startDayOfWeek); if (startDay > 0) { startMode = DOW_GE_DOM_MODE; } else { - startDay = (int8_t)-startDay; + startDay = static_cast<int8_t>(-startDay); startMode = DOW_LE_DOM_MODE; } } @@ -925,7 +926,7 @@ SimpleTimeZone::decodeEndRule(UErrorCode& status) { if(U_FAILURE(status)) return; - useDaylight = (UBool)((startDay != 0) && (endDay != 0) ? true : false); + useDaylight = static_cast<UBool>(startDay != 0 && endDay != 0); if (useDaylight && dstSavings == 0) { dstSavings = U_MILLIS_PER_HOUR; } @@ -945,11 +946,11 @@ SimpleTimeZone::decodeEndRule(UErrorCode& status) if (endDayOfWeek > 0) { endMode = DOW_IN_MONTH_MODE; } else { - endDayOfWeek = (int8_t)-endDayOfWeek; + endDayOfWeek = static_cast<int8_t>(-endDayOfWeek); if (endDay > 0) { endMode = DOW_GE_DOM_MODE; } else { - endDay = (int8_t)-endDay; + endDay = static_cast<int8_t>(-endDay); endMode = DOW_LE_DOM_MODE; } } @@ -1049,18 +1050,10 @@ SimpleTimeZone::clearTransitionRules() { void SimpleTimeZone::deleteTransitionRules() { - if (initialRule != nullptr) { - delete initialRule; - } - if (firstTransition != nullptr) { - delete firstTransition; - } - if (stdRule != nullptr) { - delete stdRule; - } - if (dstRule != nullptr) { - delete dstRule; - } + delete initialRule; + delete firstTransition; + delete stdRule; + delete dstRule; clearTransitionRules(); } diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 628f7febe04aeb..2549f0cd453d76 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -77,6 +77,10 @@ #include "dayperiodrules.h" #include "tznames_impl.h" // ZONE_NAME_U16_MAX #include "number_utypes.h" +#include "chnsecal.h" +#include "dangical.h" +#include "japancal.h" +#include <typeinfo> #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include <stdio.h> @@ -297,8 +301,8 @@ static const SharedNumberFormat *createSharedNumberFormat( } static const SharedNumberFormat **allocSharedNumberFormatters() { - const SharedNumberFormat **result = (const SharedNumberFormat**) - uprv_malloc(UDAT_FIELD_COUNT * sizeof(const SharedNumberFormat*)); + const SharedNumberFormat** result = static_cast<const SharedNumberFormat**>( + uprv_malloc(UDAT_FIELD_COUNT * sizeof(const SharedNumberFormat*))); if (result == nullptr) { return nullptr; } @@ -332,9 +336,7 @@ SimpleDateFormat::~SimpleDateFormat() if (fSharedNumberFormatters) { freeSharedNumberFormatters(fSharedNumberFormatters); } - if (fTimeZoneFormat) { - delete fTimeZoneFormat; - } + delete fTimeZoneFormat; delete fSimpleNumberFormatter; #if !UCONFIG_NO_BREAK_ITERATION @@ -348,7 +350,7 @@ SimpleDateFormat::SimpleDateFormat(UErrorCode& status) : fLocale(Locale::getDefault()) { initializeBooleanAttributes(); - construct(kShort, (EStyle) (kShort + kDateOffset), fLocale, status); + construct(kShort, static_cast<EStyle>(kShort + kDateOffset), fLocale, status); initializeDefaultCentury(); } @@ -507,7 +509,7 @@ SimpleDateFormat::SimpleDateFormat(const Locale& locale, // This constructor doesn't fail; it uses last resort data fSymbols = new DateFormatSymbols(status); /* test for nullptr */ - if (fSymbols == 0) { + if (fSymbols == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -709,7 +711,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, fSymbols = DateFormatSymbols::createForLocale(locale, status); if (U_FAILURE(status)) return; /* test for nullptr */ - if (fSymbols == 0) { + if (fSymbols == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -728,16 +730,17 @@ void SimpleDateFormat::construct(EStyle timeStyle, if (locale.getKeywordValue("rg", nullptr, 0, dummyErr1) > 0 || locale.getKeywordValue("hours", nullptr, 0, dummyErr2) > 0) { hasRgOrHcSubtag = true; } - + const char* baseLocID = locale.getBaseName(); - if (baseLocID[0]!=0 && uprv_strcmp(baseLocID,"und")!=0) { + if (baseLocID != nullptr && uprv_strcmp(baseLocID,"und")!=0) { UErrorCode useStatus = U_ZERO_ERROR; Locale baseLoc(baseLocID); Locale validLoc(getLocale(ULOC_VALID_LOCALE, useStatus)); if (hasRgOrHcSubtag || (U_SUCCESS(useStatus) && validLoc!=baseLoc)) { bool useDTPG = hasRgOrHcSubtag; const char* baseReg = baseLoc.getCountry(); // empty string if no region - if ((baseReg[0]!=0 && uprv_strncmp(baseReg,validLoc.getCountry(),ULOC_COUNTRY_CAPACITY)!=0) + if ((baseReg != nullptr && baseReg[0] != 0 && + uprv_strncmp(baseReg,validLoc.getCountry(),ULOC_COUNTRY_CAPACITY)!=0) || uprv_strncmp(baseLoc.getLanguage(),validLoc.getLanguage(),ULOC_LANG_CAPACITY)!=0) { // use DTPG if // * baseLoc has a region and validLoc does not have the same one (or has none), OR @@ -773,7 +776,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, UnicodeString tempus1(timePattern); if (tempus1.length() == 0) { currentBundle.adoptInstead( - ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)timeStyle, nullptr, &status)); + ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(timeStyle), nullptr, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; @@ -799,7 +802,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, } currentBundle.adoptInstead( - ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)dateStyle, nullptr, &status)); + ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(dateStyle), nullptr, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; @@ -849,7 +852,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, int32_t patternsSize = ures_getSize(dateTimePatterns.getAlias()); if (patternsSize >= (kDateTimeOffset + kShort + 1)) { // Get proper date time format - glueIndex = (int32_t)(kDateTimeOffset + (dateStyle - kDateOffset)); + glueIndex = static_cast<int32_t>(kDateTimeOffset + (dateStyle - kDateOffset)); } resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), glueIndex, &resStrLen, &status); @@ -864,7 +867,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, fPattern.setTo(timePattern); if (fPattern.length() == 0) { currentBundle.adoptInstead( - ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)timeStyle, nullptr, &status)); + ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(timeStyle), nullptr, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; @@ -890,7 +893,7 @@ void SimpleDateFormat::construct(EStyle timeStyle, } else if (dateStyle != kNone) { currentBundle.adoptInstead( - ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)dateStyle, nullptr, &status)); + ures_getByIndex(dateTimePatterns.getAlias(), static_cast<int32_t>(dateStyle), nullptr, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; @@ -946,7 +949,8 @@ SimpleDateFormat::initialize(const Locale& locale, // if format is non-numeric (includes 年) and fDateOverride is not already specified. // Now this does get updated if applyPattern subsequently changes the pattern type. if (fDateOverride.isBogus() && fHasHanYearChar && - fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + fCalendar != nullptr && + typeid(*fCalendar) == typeid(JapaneseCalendar) && uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { fDateOverride.setTo(u"y=jpanyear", -1); } @@ -1051,7 +1055,7 @@ SimpleDateFormat::_format(Calendar& cal, UnicodeString& appendTo, } Calendar* workCal = &cal; Calendar* calClone = nullptr; - if (&cal != fCalendar && uprv_strcmp(cal.getType(), fCalendar->getType()) != 0) { + if (&cal != fCalendar && typeid(cal) != typeid(*fCalendar)) { // Different calendar type // We use the time and time zone from the input calendar, but // do not use the input calendar for field calculation. @@ -1074,7 +1078,8 @@ SimpleDateFormat::_format(Calendar& cal, UnicodeString& appendTo, UDisplayContext capitalizationContext = getContext(UDISPCTX_TYPE_CAPITALIZATION, status); // loop through the pattern string character by character - for (int32_t i = 0; i < fPattern.length() && U_SUCCESS(status); ++i) { + int32_t patternLength = fPattern.length(); + for (int32_t i = 0; i < patternLength && U_SUCCESS(status); ++i) { char16_t ch = fPattern[i]; // Use subFormat() to format a repeated pattern character @@ -1087,8 +1092,8 @@ SimpleDateFormat::_format(Calendar& cal, UnicodeString& appendTo, if (ch == QUOTE) { // Consecutive single quotes are a single quote literal, // either outside of quotes or between quotes - if ((i+1) < fPattern.length() && fPattern[i+1] == QUOTE) { - appendTo += (char16_t)QUOTE; + if ((i+1) < patternLength && fPattern[i+1] == QUOTE) { + appendTo += QUOTE; ++i; } else { inQuote = ! inQuote; @@ -1112,9 +1117,7 @@ SimpleDateFormat::_format(Calendar& cal, UnicodeString& appendTo, prevCh, handler, *workCal, status); } - if (calClone != nullptr) { - delete calClone; - } + delete calClone; return appendTo; } @@ -1310,7 +1313,7 @@ SimpleDateFormat::initSimpleNumberFormatter(UErrorCode &status) { if (U_FAILURE(status)) { return; } - auto* df = dynamic_cast<const DecimalFormat*>(fNumberFormat); + const auto* df = dynamic_cast<const DecimalFormat*>(fNumberFormat); if (df == nullptr) { return; } @@ -1367,7 +1370,7 @@ SimpleDateFormat::processOverrideString(const Locale &locale, const UnicodeStrin NSOverride *overrideList = nullptr; while (moreToProcess) { - int32_t delimiterPosition = str.indexOf((char16_t)ULOC_KEYWORD_ITEM_SEPARATOR_UNICODE,start); + int32_t delimiterPosition = str.indexOf(static_cast<char16_t>(ULOC_KEYWORD_ITEM_SEPARATOR_UNICODE), start); if (delimiterPosition == -1) { moreToProcess = false; len = str.length() - start; @@ -1375,7 +1378,7 @@ SimpleDateFormat::processOverrideString(const Locale &locale, const UnicodeStrin len = delimiterPosition - start; } UnicodeString currentString(str,start,len); - int32_t equalSignPosition = currentString.indexOf((char16_t)ULOC_KEYWORD_ASSIGN_UNICODE,0); + int32_t equalSignPosition = currentString.indexOf(static_cast<char16_t>(ULOC_KEYWORD_ASSIGN_UNICODE), 0); if (equalSignPosition == -1) { // Simple override string such as "hebrew" nsName.setTo(currentString); ovrField.setToBogus(); @@ -1480,6 +1483,9 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const { + static const int32_t maxIntCount = 10; + static const UnicodeString hebr(u"hebr"); + if (U_FAILURE(status)) { return; } @@ -1488,14 +1494,9 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // text for an individual pattern symbol (e.g., "HH" or "yyyy") UDateFormatField patternCharIndex = DateFormatSymbols::getPatternCharIndex(ch); - const int32_t maxIntCount = 10; int32_t beginOffset = appendTo.length(); - const NumberFormat *currentNumberFormat; DateFormatSymbols::ECapitalizationContextUsageType capContextUsageType = DateFormatSymbols::kCapContextUsageOther; - UBool isHebrewCalendar = (uprv_strcmp(cal.getType(),"hebrew") == 0); - UBool isChineseCalendar = (uprv_strcmp(cal.getType(),"chinese") == 0 || uprv_strcmp(cal.getType(),"dangi") == 0); - // if the pattern character is unrecognized, signal an error and dump out if (patternCharIndex == UDAT_FIELD_COUNT) { @@ -1510,35 +1511,37 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // Don't get value unless it is useful if (field < UCAL_FIELD_COUNT) { value = (patternCharIndex != UDAT_RELATED_YEAR_FIELD)? cal.get(field, status): cal.getRelatedYear(status); - } - if (U_FAILURE(status)) { - return; + if (U_FAILURE(status)) { + return; + } } - currentNumberFormat = getNumberFormatByIndex(patternCharIndex); + const NumberFormat *currentNumberFormat = getNumberFormatByIndex(patternCharIndex); if (currentNumberFormat == nullptr) { status = U_INTERNAL_PROGRAM_ERROR; return; } - UnicodeString hebr("hebr", 4, US_INV); switch (patternCharIndex) { // for any "G" symbol, write out the appropriate era string // "GGGG" is wide era name, "GGGGG" is narrow era name, anything else is abbreviated name case UDAT_ERA_FIELD: - if (isChineseCalendar) { - zeroPaddingNumber(currentNumberFormat,appendTo, value, 1, 9); // as in ICU4J - } else { - if (count == 5) { - _appendSymbol(appendTo, value, fSymbols->fNarrowEras, fSymbols->fNarrowErasCount); - capContextUsageType = DateFormatSymbols::kCapContextUsageEraNarrow; - } else if (count == 4) { - _appendSymbol(appendTo, value, fSymbols->fEraNames, fSymbols->fEraNamesCount); - capContextUsageType = DateFormatSymbols::kCapContextUsageEraWide; + { + if (typeid(cal) == typeid(ChineseCalendar) || + typeid(cal) == typeid(DangiCalendar)) { + zeroPaddingNumber(currentNumberFormat,appendTo, value, 1, 9); // as in ICU4J } else { - _appendSymbol(appendTo, value, fSymbols->fEras, fSymbols->fErasCount); - capContextUsageType = DateFormatSymbols::kCapContextUsageEraAbbrev; + if (count == 5) { + _appendSymbol(appendTo, value, fSymbols->fNarrowEras, fSymbols->fNarrowErasCount); + capContextUsageType = DateFormatSymbols::kCapContextUsageEraNarrow; + } else if (count == 4) { + _appendSymbol(appendTo, value, fSymbols->fEraNames, fSymbols->fEraNamesCount); + capContextUsageType = DateFormatSymbols::kCapContextUsageEraWide; + } else { + _appendSymbol(appendTo, value, fSymbols->fEras, fSymbols->fErasCount); + capContextUsageType = DateFormatSymbols::kCapContextUsageEraAbbrev; + } } } break; @@ -1577,11 +1580,10 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // for "MMMMM"/"LLLLL", use the narrow form case UDAT_MONTH_FIELD: case UDAT_STANDALONE_MONTH_FIELD: - if ( isHebrewCalendar ) { - HebrewCalendar *hc = (HebrewCalendar*)&cal; - if (hc->isLeapYear(hc->get(UCAL_YEAR,status)) && value == 6 && count >= 3 ) + if (typeid(cal) == typeid(HebrewCalendar)) { + if (HebrewCalendar::isLeapYear(cal.get(UCAL_YEAR,status)) && value == 6 && count >= 3 ) value = 13; // Show alternate form for Adar II in leap years in Hebrew calendar. - if (!hc->isLeapYear(hc->get(UCAL_YEAR,status)) && value >= 6 && count < 3 ) + if (!HebrewCalendar::isLeapYear(cal.get(UCAL_YEAR,status)) && value >= 6 && count < 3 ) value--; // Adjust the month number down 1 in Hebrew non-leap years, i.e. Adar is 6, not 7. } { @@ -1724,12 +1726,15 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // for "a" symbol, write out the whole AM/PM string case UDAT_AM_PM_FIELD: - if (count < 5) { - _appendSymbol(appendTo, value, fSymbols->fAmPms, - fSymbols->fAmPmsCount); - } else { + if (count == 4) { + _appendSymbol(appendTo, value, fSymbols->fWideAmPms, + fSymbols->fWideAmPmsCount); + } else if (count == 5) { _appendSymbol(appendTo, value, fSymbols->fNarrowAmPms, fSymbols->fNarrowAmPmsCount); + } else { + _appendSymbol(appendTo, value, fSymbols->fAmPms, + fSymbols->fAmPmsCount); } break; @@ -1765,7 +1770,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, UDate date = cal.getTime(status); const TimeZoneFormat *tzfmt = tzFormat(status); if (U_SUCCESS(status)) { - if (patternCharIndex == UDAT_TIMEZONE_FIELD) { + switch (patternCharIndex) { + case UDAT_TIMEZONE_FIELD: if (count < 4) { // "z", "zz", "zzz" tzfmt->format(UTZFMT_STYLE_SPECIFIC_SHORT, tz, date, zoneString); @@ -1775,8 +1781,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, tzfmt->format(UTZFMT_STYLE_SPECIFIC_LONG, tz, date, zoneString); capContextUsageType = DateFormatSymbols::kCapContextUsageMetazoneLong; } - } - else if (patternCharIndex == UDAT_TIMEZONE_RFC_FIELD) { + break; + case UDAT_TIMEZONE_RFC_FIELD: if (count < 4) { // "Z" tzfmt->format(UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL, tz, date, zoneString); @@ -1787,8 +1793,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // "ZZ", "ZZZ", "ZZZZ" tzfmt->format(UTZFMT_STYLE_LOCALIZED_GMT, tz, date, zoneString); } - } - else if (patternCharIndex == UDAT_TIMEZONE_GENERIC_FIELD) { + break; + case UDAT_TIMEZONE_GENERIC_FIELD: if (count == 1) { // "v" tzfmt->format(UTZFMT_STYLE_GENERIC_SHORT, tz, date, zoneString); @@ -1798,8 +1804,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, tzfmt->format(UTZFMT_STYLE_GENERIC_LONG, tz, date, zoneString); capContextUsageType = DateFormatSymbols::kCapContextUsageMetazoneLong; } - } - else if (patternCharIndex == UDAT_TIMEZONE_SPECIAL_FIELD) { + break; + case UDAT_TIMEZONE_SPECIAL_FIELD: if (count == 1) { // "V" tzfmt->format(UTZFMT_STYLE_ZONE_ID_SHORT, tz, date, zoneString); @@ -1814,8 +1820,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, tzfmt->format(UTZFMT_STYLE_GENERIC_LOCATION, tz, date, zoneString); capContextUsageType = DateFormatSymbols::kCapContextUsageZoneLong; } - } - else if (patternCharIndex == UDAT_TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD) { + break; + case UDAT_TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD: if (count == 1) { // "O" tzfmt->format(UTZFMT_STYLE_LOCALIZED_GMT_SHORT, tz, date, zoneString); @@ -1823,8 +1829,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // "OOOO" tzfmt->format(UTZFMT_STYLE_LOCALIZED_GMT, tz, date, zoneString); } - } - else if (patternCharIndex == UDAT_TIMEZONE_ISO_FIELD) { + break; + case UDAT_TIMEZONE_ISO_FIELD: if (count == 1) { // "X" tzfmt->format(UTZFMT_STYLE_ISO_BASIC_SHORT, tz, date, zoneString); @@ -1841,8 +1847,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // "XXXXX" tzfmt->format(UTZFMT_STYLE_ISO_EXTENDED_FULL, tz, date, zoneString); } - } - else if (patternCharIndex == UDAT_TIMEZONE_ISO_LOCAL_FIELD) { + break; + case UDAT_TIMEZONE_ISO_LOCAL_FIELD: if (count == 1) { // "x" tzfmt->format(UTZFMT_STYLE_ISO_BASIC_LOCAL_SHORT, tz, date, zoneString); @@ -1859,8 +1865,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, // "xxxxx" tzfmt->format(UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FULL, tz, date, zoneString); } - } - else { + break; + default: UPRV_UNREACHABLE_EXIT; } } @@ -1993,7 +1999,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, if (periodType != DayPeriodRules::DAYPERIOD_AM && periodType != DayPeriodRules::DAYPERIOD_PM && periodType != DayPeriodRules::DAYPERIOD_MIDNIGHT) { - index = (int32_t)periodType; + index = static_cast<int32_t>(periodType); if (count <= 3) { toAppend = &fSymbols->fAbbreviatedDayPeriods[index]; // i.e. short } else if (count == 4 || count > 5) { @@ -2011,7 +2017,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, (periodType == DayPeriodRules::DAYPERIOD_MIDNIGHT || periodType == DayPeriodRules::DAYPERIOD_NOON)) { periodType = ruleSet->getDayPeriodForHour(hour); - index = (int32_t)periodType; + index = static_cast<int32_t>(periodType); if (count <= 3) { toAppend = &fSymbols->fAbbreviatedDayPeriods[index]; // i.e. short @@ -2157,21 +2163,29 @@ SimpleDateFormat::zeroPaddingNumber( if (currentNumberFormat == fNumberFormat && fSimpleNumberFormatter) { // Can use fast path + // We create UFormattedNumberData ourselves to avoid a heap allocation + // and corresponding free. Set the pointer to null afterwards to prevent + // the implementation from attempting to free it. UErrorCode localStatus = U_ZERO_ERROR; - number::SimpleNumber number = number::SimpleNumber::forInt64(value, localStatus); + number::impl::UFormattedNumberData data; + data.quantity.setToLong(value); + number::SimpleNumber number(&data, localStatus); number.setMinimumIntegerDigits(minDigits, localStatus); - number.truncateStart(maxDigits, localStatus); + number.setMaximumIntegerDigits(maxDigits, localStatus); number::FormattedNumber result = fSimpleNumberFormatter->format(std::move(number), localStatus); if (U_FAILURE(localStatus)) { + result.fData = nullptr; return; } - appendTo.append(result.toTempString(localStatus)); + UnicodeStringAppendable appendable(appendTo); + result.appendTo(appendable, localStatus); + result.fData = nullptr; return; } // Check for RBNF (no clone necessary) - auto* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(currentNumberFormat); + const auto* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(currentNumberFormat); if (rbnf != nullptr) { FieldPosition pos(FieldPosition::DONT_CARE); rbnf->format(value, appendTo, pos); // 3rd arg is there to speed up processing @@ -2266,7 +2280,7 @@ SimpleDateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& Calendar* calClone = nullptr; Calendar *workCal = &cal; - if (&cal != fCalendar && uprv_strcmp(cal.getType(), fCalendar->getType()) != 0) { + if (&cal != fCalendar && typeid(cal) != typeid(*fCalendar)) { // Different calendar type // We use the time/zone from the input calendar, but // do not use the input calendar for field calculation. @@ -2413,7 +2427,7 @@ SimpleDateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& // If dayPeriod is set, use it in conjunction with hour-of-day to determine am/pm. if (dayPeriodInt >= 0) { - DayPeriodRules::DayPeriod dayPeriod = (DayPeriodRules::DayPeriod)dayPeriodInt; + DayPeriodRules::DayPeriod dayPeriod = static_cast<DayPeriodRules::DayPeriod>(dayPeriodInt); const DayPeriodRules *ruleSet = DayPeriodRules::getInstance(this->getSmpFmtLocale(), status); if (!cal.isSet(UCAL_HOUR) && !cal.isSet(UCAL_HOUR_OF_DAY)) { @@ -2425,7 +2439,7 @@ SimpleDateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& if (U_SUCCESS(status)) { // Truncate midPoint toward zero to get the hour. // Any leftover means it was a half-hour. - int32_t midPointHour = (int32_t) midPoint; + int32_t midPointHour = static_cast<int32_t>(midPoint); int32_t midPointMinute = (midPoint - midPointHour) > 0 ? 30 : 0; // No need to set am/pm because hour-of-day is set last therefore takes precedence. @@ -2645,12 +2659,8 @@ SimpleDateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& cal.setTime(workCal->getTime(status), status); } - if (numericLeapMonthFormatter != nullptr) { - delete numericLeapMonthFormatter; - } - if (calClone != nullptr) { - delete calClone; - } + delete numericLeapMonthFormatter; + delete calClone; // If any Calendar calls failed, we pretend that we // couldn't parse the string, when in reality this isn't quite accurate-- @@ -2901,7 +2911,7 @@ int32_t SimpleDateFormat::matchAlphaMonthStrings(const UnicodeString& text, if (bestMatch >= 0) { // Adjustment for Hebrew Calendar month Adar II - if (!strcmp(cal.getType(),"hebrew") && bestMatch==13) { + if (typeid(cal) == typeid(HebrewCalendar) && bestMatch==13) { cal.set(UCAL_MONTH,6); } else { cal.set(UCAL_MONTH, bestMatch); @@ -2961,7 +2971,7 @@ int32_t SimpleDateFormat::matchString(const UnicodeString& text, if (bestMatch >= 0) { if (field < UCAL_FIELD_COUNT) { // Adjustment for Hebrew Calendar month Adar II - if (!strcmp(cal.getType(),"hebrew") && field==UCAL_MONTH && bestMatch==13) { + if (typeid(cal) == typeid(HebrewCalendar) && field==UCAL_MONTH && bestMatch==13) { cal.set(field,6); } else { if (field == UCAL_YEAR) { @@ -3048,9 +3058,8 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch UnicodeString hebr("hebr", 4, US_INV); if (numericLeapMonthFormatter != nullptr) { - numericLeapMonthFormatter->setFormats((const Format **)¤tNumberFormat, 1); + numericLeapMonthFormatter->setFormats(reinterpret_cast<const Format**>(¤tNumberFormat), 1); } - UBool isChineseCalendar = (uprv_strcmp(cal.getType(),"chinese") == 0 || uprv_strcmp(cal.getType(),"dangi") == 0); // If there are any spaces here, skip over them. If we hit the end // of the string, then fail. @@ -3066,6 +3075,8 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch } pos.setIndex(start); + UBool isChineseCalendar = typeid(cal) == typeid(ChineseCalendar) || + typeid(cal) == typeid(DangiCalendar); // We handle a few special cases here where we need to parse // a number value. We handle further, more generic cases below. We need // to handle some of them here because some fields require extra processing on @@ -3287,7 +3298,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch // When parsing month numbers from the Hebrew Calendar, we might need to adjust the month depending on whether // or not it was a leap year. We may or may not yet know what year it is, so might have to delay checking until // the year is parsed. - if (!strcmp(cal.getType(),"hebrew")) { + if (typeid(cal) == typeid(HebrewCalendar)) { HebrewCalendar *hc = (HebrewCalendar*)&cal; if (cal.isSet(UCAL_YEAR)) { UErrorCode monthStatus = U_ZERO_ERROR; @@ -3475,8 +3486,14 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch { // optionally try both wide/abbrev and narrow forms int32_t newStart = 0; - // try wide/abbrev - if( getBooleanAttribute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, status) || count < 5 ) { + // try wide + if( getBooleanAttribute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, status) || count == 4 ) { + if ((newStart = matchString(text, start, UCAL_AM_PM, fSymbols->fWideAmPms, fSymbols->fWideAmPmsCount, nullptr, cal)) > 0) { + return newStart; + } + } + // try abbreviated + if( getBooleanAttribute(UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH, status) || count <= 3 ) { if ((newStart = matchString(text, start, UCAL_AM_PM, fSymbols->fAmPms, fSymbols->fAmPmsCount, nullptr, cal)) > 0) { return newStart; } @@ -3850,7 +3867,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch switch (patternCharIndex) { case UDAT_MONTH_FIELD: // See notes under UDAT_MONTH_FIELD case above - if (!strcmp(cal.getType(),"hebrew")) { + if (typeid(cal) == typeid(HebrewCalendar)) { HebrewCalendar *hc = (HebrewCalendar*)&cal; if (cal.isSet(UCAL_YEAR)) { UErrorCode monthStatus = U_ZERO_ERROR; @@ -3911,7 +3928,7 @@ void SimpleDateFormat::parseInt(const UnicodeString& text, UBool allowNegative, const NumberFormat *fmt) const { UnicodeString oldPrefix; - auto* fmtAsDF = dynamic_cast<const DecimalFormat*>(fmt); + const auto* fmtAsDF = dynamic_cast<const DecimalFormat*>(fmt); LocalPointer<DecimalFormat> df; if (!allowNegative && fmtAsDF != nullptr) { df.adoptInstead(fmtAsDF->clone()); @@ -4032,7 +4049,7 @@ SimpleDateFormat::applyPattern(const UnicodeString& pattern) // Hack to update use of Gannen year numbering for ja@calendar=japanese - // use only if format is non-numeric (includes 年) and no other fDateOverride. - if (fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + if (fCalendar != nullptr && typeid(*fCalendar) == typeid(JapaneseCalendar) && uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { if (fDateOverride==UnicodeString(u"y=jpanyear") && !fHasHanYearChar) { // Gannen numbering is set but new pattern should not use it, unset; @@ -4359,7 +4376,7 @@ SimpleDateFormat::compareSimpleAffix(const UnicodeString& affix, int32_t SimpleDateFormat::skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const { const char16_t* s = text.getBuffer(); - return (int32_t)(PatternProps::skipWhiteSpace(s + pos, text.length() - pos) - s); + return static_cast<int32_t>(PatternProps::skipWhiteSpace(s + pos, text.length() - pos) - s); } //---------------------------------------------------------------------- diff --git a/deps/icu-small/source/i18n/string_segment.cpp b/deps/icu-small/source/i18n/string_segment.cpp index 2ddb738f4d0549..ddfd6ebf6832bb 100644 --- a/deps/icu-small/source/i18n/string_segment.cpp +++ b/deps/icu-small/source/i18n/string_segment.cpp @@ -62,7 +62,7 @@ UnicodeString StringSegment::toUnicodeString() const { return UnicodeString(fStr.getBuffer() + fStart, fEnd - fStart); } -const UnicodeString StringSegment::toTempUnicodeString() const { +UnicodeString StringSegment::toTempUnicodeString() const { // Use the readonly-aliasing constructor for efficiency. return UnicodeString(false, fStr.getBuffer() + fStart, fEnd - fStart); } diff --git a/deps/icu-small/source/i18n/string_segment.h b/deps/icu-small/source/i18n/string_segment.h index b581f7e57599eb..38eb62370373a4 100644 --- a/deps/icu-small/source/i18n/string_segment.h +++ b/deps/icu-small/source/i18n/string_segment.h @@ -61,7 +61,7 @@ class U_I18N_API StringSegment : public UMemory { UnicodeString toUnicodeString() const; - const UnicodeString toTempUnicodeString() const; + UnicodeString toTempUnicodeString() const; /** * Returns the first code point in the string segment, or -1 if the string starts with an invalid diff --git a/deps/icu-small/source/i18n/strmatch.cpp b/deps/icu-small/source/i18n/strmatch.cpp index ff52eeacdc48c1..1c8734c1a96df5 100644 --- a/deps/icu-small/source/i18n/strmatch.cpp +++ b/deps/icu-small/source/i18n/strmatch.cpp @@ -98,7 +98,7 @@ UMatchDegree StringMatcher::matches(const Replaceable& text, for (i=pattern.length()-1; i>=0; --i) { char16_t keyChar = pattern.charAt(i); UnicodeMatcher* subm = data->lookupMatcher(keyChar); - if (subm == 0) { + if (subm == nullptr) { if (cursor > limit && keyChar == text.charAt(cursor)) { --cursor; @@ -129,7 +129,7 @@ UMatchDegree StringMatcher::matches(const Replaceable& text, } char16_t keyChar = pattern.charAt(i); UnicodeMatcher* subm = data->lookupMatcher(keyChar); - if (subm == 0) { + if (subm == nullptr) { // Don't need the cursor < limit check if // incremental is true (because it's done above); do need // it otherwise. @@ -165,12 +165,12 @@ UnicodeString& StringMatcher::toPattern(UnicodeString& result, result.truncate(0); UnicodeString str, quoteBuf; if (segmentNumber > 0) { - result.append((char16_t)40); /*(*/ + result.append(static_cast<char16_t>(40)); /*(*/ } for (int32_t i=0; i<pattern.length(); ++i) { char16_t keyChar = pattern.charAt(i); const UnicodeMatcher* m = data->lookupMatcher(keyChar); - if (m == 0) { + if (m == nullptr) { ICU_Utility::appendToRule(result, keyChar, false, escapeUnprintable, quoteBuf); } else { ICU_Utility::appendToRule(result, m->toPattern(str, escapeUnprintable), @@ -178,7 +178,7 @@ UnicodeString& StringMatcher::toPattern(UnicodeString& result, } } if (segmentNumber > 0) { - result.append((char16_t)41); /*)*/ + result.append(static_cast<char16_t>(41)); /*)*/ } // Flush quoteBuf out to result ICU_Utility::appendToRule(result, -1, @@ -195,7 +195,7 @@ UBool StringMatcher::matchesIndexValue(uint8_t v) const { } UChar32 c = pattern.char32At(0); const UnicodeMatcher *m = data->lookupMatcher(c); - return (m == 0) ? ((c & 0xFF) == v) : m->matchesIndexValue(v); + return (m == nullptr) ? ((c & 0xFF) == v) : m->matchesIndexValue(v); } /** @@ -247,7 +247,7 @@ UnicodeString& StringMatcher::toReplacerPattern(UnicodeString& rule, UBool /*escapeUnprintable*/) const { // assert(segmentNumber > 0); rule.truncate(0); - rule.append((char16_t)0x0024 /*$*/); + rule.append(static_cast<char16_t>(0x0024) /*$*/); ICU_Utility::appendNumber(rule, segmentNumber, 10, 1); return rule; } diff --git a/deps/icu-small/source/i18n/strrepl.cpp b/deps/icu-small/source/i18n/strrepl.cpp index 2981553869a7c5..a3a0eae1e77fee 100644 --- a/deps/icu-small/source/i18n/strrepl.cpp +++ b/deps/icu-small/source/i18n/strrepl.cpp @@ -149,7 +149,7 @@ int32_t StringReplacer::replace(Replaceable& text, text.copy(start-len, start, tempStart); destStart += len; } else { - UnicodeString str((char16_t) 0xFFFF); + UnicodeString str(static_cast<char16_t>(0xFFFF)); text.handleReplaceBetween(tempStart, tempStart, str); destStart++; } @@ -249,14 +249,14 @@ UnicodeString& StringReplacer::toReplacerPattern(UnicodeString& rule, // Handle a cursor preceding the output if (hasCursor && cursor < 0) { while (cursor++ < 0) { - ICU_Utility::appendToRule(rule, (char16_t)0x0040 /*@*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x0040) /*@*/, true, escapeUnprintable, quoteBuf); } // Fall through and append '|' below } for (int32_t i=0; i<output.length(); ++i) { if (hasCursor && i == cursor) { - ICU_Utility::appendToRule(rule, (char16_t)0x007C /*|*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x007C) /*|*/, true, escapeUnprintable, quoteBuf); } char16_t c = output.charAt(i); // Ok to use 16-bits here @@ -266,8 +266,8 @@ UnicodeString& StringReplacer::toReplacerPattern(UnicodeString& rule, } else { UnicodeString buf; r->toReplacerPattern(buf, escapeUnprintable); - buf.insert(0, (char16_t)0x20); - buf.append((char16_t)0x20); + buf.insert(0, static_cast<char16_t>(0x20)); + buf.append(static_cast<char16_t>(0x20)); ICU_Utility::appendToRule(rule, buf, true, escapeUnprintable, quoteBuf); } @@ -279,9 +279,9 @@ UnicodeString& StringReplacer::toReplacerPattern(UnicodeString& rule, if (hasCursor && cursor > output.length()) { cursor -= output.length(); while (cursor-- > 0) { - ICU_Utility::appendToRule(rule, (char16_t)0x0040 /*@*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x0040) /*@*/, true, escapeUnprintable, quoteBuf); } - ICU_Utility::appendToRule(rule, (char16_t)0x007C /*|*/, true, escapeUnprintable, quoteBuf); + ICU_Utility::appendToRule(rule, static_cast<char16_t>(0x007C) /*|*/, true, escapeUnprintable, quoteBuf); } // Flush quoteBuf out to result ICU_Utility::appendToRule(rule, -1, diff --git a/deps/icu-small/source/i18n/stsearch.cpp b/deps/icu-small/source/i18n/stsearch.cpp index 395ce1cdc11c82..c41e8de21dc16a 100644 --- a/deps/icu-small/source/i18n/stsearch.cpp +++ b/deps/icu-small/source/i18n/stsearch.cpp @@ -38,7 +38,7 @@ StringSearch::StringSearch(const UnicodeString &pattern, m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), m_text_.getBuffer(), m_text_.length(), - locale.getName(), (UBreakIterator *)breakiter, + locale.getName(), reinterpret_cast<UBreakIterator*>(breakiter), &status); uprv_free(m_search_); m_search_ = nullptr; @@ -70,7 +70,7 @@ StringSearch::StringSearch(const UnicodeString &pattern, m_pattern_.length(), m_text_.getBuffer(), m_text_.length(), coll->toUCollator(), - (UBreakIterator *)breakiter, + reinterpret_cast<UBreakIterator*>(breakiter), &status); uprv_free(m_search_); m_search_ = nullptr; @@ -95,7 +95,7 @@ StringSearch::StringSearch(const UnicodeString &pattern, } m_strsrch_ = usearch_open(m_pattern_.getBuffer(), m_pattern_.length(), m_text_.getBuffer(), m_text_.length(), - locale.getName(), (UBreakIterator *)breakiter, + locale.getName(), reinterpret_cast<UBreakIterator*>(breakiter), &status); uprv_free(m_search_); m_search_ = nullptr; @@ -127,7 +127,7 @@ StringSearch::StringSearch(const UnicodeString &pattern, m_pattern_.length(), m_text_.getBuffer(), m_text_.length(), coll->toUCollator(), - (UBreakIterator *)breakiter, + reinterpret_cast<UBreakIterator*>(breakiter), &status); uprv_free(m_search_); m_search_ = nullptr; @@ -159,7 +159,7 @@ StringSearch::StringSearch(const StringSearch &that) : m_text_.getBuffer(), m_text_.length(), that.m_strsrch_->collator, - (UBreakIterator *)that.m_breakiterator_, + reinterpret_cast<UBreakIterator*>(that.m_breakiterator_), &status); if (U_SUCCESS(status)) { // m_search_ has been created by the base SearchIterator class @@ -291,9 +291,9 @@ StringSearch * StringSearch::safeClone() const m_breakiterator_, status); /* test for nullptr */ - if (result == 0) { + if (result == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } result->setOffset(getOffset(), status); result->setMatchStart(m_strsrch_->search->matchedIndex); diff --git a/deps/icu-small/source/i18n/taiwncal.cpp b/deps/icu-small/source/i18n/taiwncal.cpp index 48f0b99e18d2a2..1f948031002205 100644 --- a/deps/icu-small/source/i18n/taiwncal.cpp +++ b/deps/icu-small/source/i18n/taiwncal.cpp @@ -20,6 +20,7 @@ #if !UCONFIG_NO_FORMATTING #include "taiwncal.h" +#include "gregoimp.h" #include "unicode/gregocal.h" #include "umutex.h" #include <float.h> @@ -30,12 +31,11 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TaiwanCalendar) static const int32_t kTaiwanEraStart = 1911; // 1911 (Gregorian) -static const int32_t kGregorianEpoch = 1970; +static const int32_t kGregorianEpoch = 1970; TaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success) : GregorianCalendar(aLocale, success) { - setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } TaiwanCalendar::~TaiwanCalendar() @@ -47,12 +47,6 @@ TaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source) { } -TaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right) -{ - GregorianCalendar::operator=(right); - return *this; -} - TaiwanCalendar* TaiwanCalendar::clone() const { return new TaiwanCalendar(*this); @@ -63,24 +57,37 @@ const char *TaiwanCalendar::getType() const return "roc"; } -int32_t TaiwanCalendar::handleGetExtendedYear() +int32_t TaiwanCalendar::handleGetExtendedYear(UErrorCode& status) { + if (U_FAILURE(status)) { + return 0; + } + // EXTENDED_YEAR in TaiwanCalendar is a Gregorian year // The default value of EXTENDED_YEAR is 1970 (Minguo 59) - int32_t year = kGregorianEpoch; - if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { - year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); - } else { - int32_t era = internalGet(UCAL_ERA, MINGUO); - if(era == MINGUO) { - year = internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; - } else if(era == BEFORE_MINGUO) { - year = 1 - internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; - } + return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } + int32_t era = internalGet(UCAL_ERA, MINGUO); + int32_t year = internalGet(UCAL_YEAR, 1); + switch (era) { + case MINGUO: + if (uprv_add32_overflow(year, kTaiwanEraStart, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; + case BEFORE_MINGUO: + if (uprv_add32_overflow(1 + kTaiwanEraStart, -year, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + return year; + default: + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; } - return year; } void TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) @@ -98,85 +105,16 @@ void TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) int32_t TaiwanCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { - if(field == UCAL_ERA) { - if(limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { - return BEFORE_MINGUO; - } else { - return MINGUO; - } - } else { + if(field != UCAL_ERA) { return GregorianCalendar::handleGetLimit(field,limitType); } -} - -#if 0 -void TaiwanCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) -{ - //Calendar::timeToFields(theTime, quick, status); - - int32_t era = internalGet(UCAL_ERA); - int32_t year = internalGet(UCAL_YEAR); - - if(era == GregorianCalendar::BC) { - year = 1-year; - era = TaiwanCalendar::MINGUO; - } else if(era == GregorianCalendar::AD) { - era = TaiwanCalendar::MINGUO; - } else { - status = U_INTERNAL_PROGRAM_ERROR; - } - - year = year - kTaiwanEraStart; - - internalSet(UCAL_ERA, era); - internalSet(UCAL_YEAR, year); -} -#endif - -/** - * The system maintains a static default century start date and Year. They are - * initialized the first time they are used. Once the system default century date - * and year are set, they do not change. - */ -static UDate gSystemDefaultCenturyStart = DBL_MIN; -static int32_t gSystemDefaultCenturyStartYear = -1; -static icu::UInitOnce gSystemDefaultCenturyInit {}; - -UBool TaiwanCalendar::haveDefaultCentury() const -{ - return true; -} - -static void U_CALLCONV initializeSystemDefaultCentury() -{ - // initialize systemDefaultCentury and systemDefaultCenturyYear based - // on the current time. They'll be set to 80 years before - // the current time. - UErrorCode status = U_ZERO_ERROR; - TaiwanCalendar calendar(Locale("@calendar=roc"),status); - if (U_SUCCESS(status)) - { - calendar.setTime(Calendar::getNow(), status); - calendar.add(UCAL_YEAR, -80, status); - - gSystemDefaultCenturyStart = calendar.getTime(status); - gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); + if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { + return BEFORE_MINGUO; } - // We have no recourse upon failure unless we want to propagate the failure - // out. + return MINGUO; } -UDate TaiwanCalendar::defaultCenturyStart() const { - // lazy-evaluate systemDefaultCenturyStart - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStart; -} - -int32_t TaiwanCalendar::defaultCenturyStartYear() const { - // lazy-evaluate systemDefaultCenturyStartYear - umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); - return gSystemDefaultCenturyStartYear; -} +IMPL_SYSTEM_DEFAULT_CENTURY(TaiwanCalendar, "@calendar=roc") U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/taiwncal.h b/deps/icu-small/source/i18n/taiwncal.h index b0a30f91080f39..d12ab1c4a2ee6d 100644 --- a/deps/icu-small/source/i18n/taiwncal.h +++ b/deps/icu-small/source/i18n/taiwncal.h @@ -79,13 +79,6 @@ class TaiwanCalendar : public GregorianCalendar { */ TaiwanCalendar(const TaiwanCalendar& source); - /** - * Default assignment operator - * @param right the object to be copied. - * @internal - */ - TaiwanCalendar& operator=(const TaiwanCalendar& right); - /** * Create and return a polymorphic copy of this calendar. * @return return a polymorphic copy of this calendar. @@ -139,7 +132,7 @@ class TaiwanCalendar : public GregorianCalendar { * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Subclasses may override this method to compute several fields * specific to each calendar system. @@ -155,24 +148,7 @@ class TaiwanCalendar : public GregorianCalendar { */ virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; - /** - * Returns true because the Taiwan Calendar does have a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * Returns the date of the start of the default century - * @return start of century - in milliseconds since epoch, 1970 - * @internal - */ - virtual UDate defaultCenturyStart() const override; - - /** - * Returns the year in which the default century begins - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index 02cbc78ceffbdf..8028c4ecf5cb96 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -42,7 +42,9 @@ #include "unicode/utypes.h" #include "unicode/ustring.h" #include "uassert.h" +#include "uinvchar.h" #include "ustr_imp.h" +#include "util.h" #ifdef U_DEBUG_TZ # include <stdio.h> @@ -75,7 +77,6 @@ static char gStrBuf[256]; #include "unicode/gregocal.h" #include "unicode/ures.h" #include "unicode/tzfmt.h" -#include "unicode/numfmt.h" #include "gregoimp.h" #include "uresimp.h" // struct UResourceBundle #include "olsontz.h" @@ -159,17 +160,17 @@ static UBool U_CALLCONV timeZone_cleanup() LEN_SYSTEM_ZONES = 0; uprv_free(MAP_SYSTEM_ZONES); - MAP_SYSTEM_ZONES = 0; + MAP_SYSTEM_ZONES = nullptr; gSystemZonesInitOnce.reset(); LEN_CANONICAL_SYSTEM_ZONES = 0; uprv_free(MAP_CANONICAL_SYSTEM_ZONES); - MAP_CANONICAL_SYSTEM_ZONES = 0; + MAP_CANONICAL_SYSTEM_ZONES = nullptr; gCanonicalZonesInitOnce.reset(); LEN_CANONICAL_SYSTEM_LOCATION_ZONES = 0; uprv_free(MAP_CANONICAL_SYSTEM_LOCATION_ZONES); - MAP_CANONICAL_SYSTEM_LOCATION_ZONES = 0; + MAP_CANONICAL_SYSTEM_LOCATION_ZONES = nullptr; gCanonicalLocationZonesInitOnce.reset(); return true; @@ -194,7 +195,7 @@ static int32_t findInStringArray(UResourceBundle* array, const UnicodeString& id U_DEBUG_TZ_MSG(("fisa: Looking for %s, between %d and %d\n", U_DEBUG_TZ_STR(UnicodeString(id).getTerminatedBuffer()), start, limit)); for (;;) { - mid = (int32_t)((start + limit) / 2); + mid = static_cast<int32_t>((start + limit) / 2); if (lastMid == mid) { /* Have we moved? */ break; /* We haven't moved, and it wasn't found. */ } @@ -257,7 +258,7 @@ static UResourceBundle* getZoneByName(const UResourceBundle* top, const UnicodeS UResourceBundle* TimeZone::loadRule(const UResourceBundle* top, const UnicodeString& ruleid, UResourceBundle* oldbundle, UErrorCode& status) { char key[64]; - ruleid.extract(0, sizeof(key)-1, key, (int32_t)sizeof(key)-1, US_INV); + ruleid.extract(0, sizeof(key) - 1, key, static_cast<int32_t>(sizeof(key)) - 1, US_INV); U_DEBUG_TZ_MSG(("loadRule(%s)\n", key)); UResourceBundle *r = ures_getByKey(top, kRULES, oldbundle, &status); U_DEBUG_TZ_MSG(("loadRule(%s) -> kRULES [%s]\n", key, u_errorName(status))); @@ -282,7 +283,7 @@ static UResourceBundle* openOlsonResource(const UnicodeString& id, char buf[128]; id.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); #endif - UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *top = ures_openDirect(nullptr, kZONEINFO, &ec); U_DEBUG_TZ_MSG(("pre: res sz=%d\n", ures_getSize(&res))); /* &res = */ getZoneByName(top, id, &res, ec); // Dereference if this is an alias. Docs say result should be 1 @@ -391,7 +392,7 @@ createSystemTimeZone(const UnicodeString& id, UErrorCode& ec) { if (U_FAILURE(ec)) { return nullptr; } - TimeZone* z = 0; + TimeZone* z = nullptr; StackUResourceBundle res; U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec))); UResourceBundle *top = openOlsonResource(id, res.ref(), ec); @@ -625,11 +626,11 @@ TimeZone::setDefault(const TimeZone& zone) static void U_CALLCONV initMap(USystemTimeZoneType type, UErrorCode& ec) { ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); - UResourceBundle *res = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *res = ures_openDirect(nullptr, kZONEINFO, &ec); res = ures_getByKey(res, kNAMES, res, &ec); // dereference Zones section if (U_SUCCESS(ec)) { int32_t size = ures_getSize(res); - int32_t *m = (int32_t *)uprv_malloc(size * sizeof(int32_t)); + int32_t* m = static_cast<int32_t*>(uprv_malloc(size * sizeof(int32_t))); if (m == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; } else { @@ -668,7 +669,7 @@ static void U_CALLCONV initMap(USystemTimeZoneType type, UErrorCode& ec) { } if (U_SUCCESS(ec)) { int32_t *tmp = m; - m = (int32_t *)uprv_realloc(tmp, numEntries * sizeof(int32_t)); + m = static_cast<int32_t*>(uprv_realloc(tmp, numEntries * sizeof(int32_t))); if (m == nullptr) { // realloc failed.. use the original one even it has unused // area at the end @@ -729,13 +730,13 @@ void TimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset, // (with 7 args) twice when local == true and DST is // detected in the initial call. for (int32_t pass=0; ; ++pass) { - int32_t year, month, dom, dow, millis; - double day = ClockMath::floorDivide(date, U_MILLIS_PER_DAY, &millis); - - Grego::dayToFields(day, year, month, dom, dow); + int32_t year, millis; + int8_t month, dom, dow; + Grego::timeToFields(date, year, month, dom, dow, millis, ec); + if (U_FAILURE(ec)) return; dstOffset = getOffset(GregorianCalendar::AD, year, month, dom, - (uint8_t) dow, millis, + static_cast<uint8_t>(dow), millis, Grego::monthLength(year, month), ec) - rawOffset; @@ -773,7 +774,7 @@ class TZEnumeration : public StringEnumeration { UBool getID(int32_t i, UErrorCode& ec) { int32_t idLen = 0; const char16_t* id = nullptr; - UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *top = ures_openDirect(nullptr, kZONEINFO, &ec); top = ures_getByKey(top, kNAMES, top, &ec); // dereference Zones section id = ures_getStringByIndex(top, i, &idLen, &ec); if(U_FAILURE(ec)) { @@ -842,14 +843,14 @@ class TZEnumeration : public StringEnumeration { if (region != nullptr || rawOffset != nullptr) { int32_t filteredMapSize = DEFAULT_FILTERED_MAP_SIZE; - filteredMap = (int32_t *)uprv_malloc(filteredMapSize * sizeof(int32_t)); + filteredMap = static_cast<int32_t*>(uprv_malloc(filteredMapSize * sizeof(int32_t))); if (filteredMap == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; return nullptr; } // Walk through the base map - UResourceBundle *res = ures_openDirect(0, kZONEINFO, &ec); + UResourceBundle *res = ures_openDirect(nullptr, kZONEINFO, &ec); res = ures_getByKey(res, kNAMES, res, &ec); // dereference Zones section for (int32_t i = 0; i < baseLen; i++) { int32_t zidx = baseMap[i]; @@ -886,7 +887,7 @@ class TZEnumeration : public StringEnumeration { if (filteredMapSize <= numEntries) { filteredMapSize += MAP_INCREMENT_SIZE; - int32_t *tmp = (int32_t *)uprv_realloc(filteredMap, filteredMapSize * sizeof(int32_t)); + int32_t* tmp = static_cast<int32_t*>(uprv_realloc(filteredMap, filteredMapSize * sizeof(int32_t))); if (tmp == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; break; @@ -929,7 +930,7 @@ class TZEnumeration : public StringEnumeration { TZEnumeration(const TZEnumeration &other) : StringEnumeration(), map(nullptr), localMap(nullptr), len(0), pos(0) { if (other.localMap != nullptr) { - localMap = (int32_t *)uprv_malloc(other.len * sizeof(int32_t)); + localMap = static_cast<int32_t*>(uprv_malloc(other.len * sizeof(int32_t))); if (localMap != nullptr) { len = other.len; uprv_memcpy(localMap, other.localMap, len * sizeof(int32_t)); @@ -964,7 +965,7 @@ class TZEnumeration : public StringEnumeration { ++pos; return &unistr; } - return 0; + return nullptr; } virtual void reset(UErrorCode& /*status*/) override { @@ -1050,7 +1051,7 @@ TimeZone::countEquivalentIDs(const UnicodeString& id) { // --------------------------------------- -const UnicodeString U_EXPORT2 +UnicodeString U_EXPORT2 TimeZone::getEquivalentID(const UnicodeString& id, int32_t index) { U_DEBUG_TZ_MSG(("gEI(%d)\n", index)); UnicodeString result; @@ -1369,123 +1370,94 @@ TimeZone::getCustomID(const UnicodeString& id, UnicodeString& normalized, UError UBool TimeZone::parseCustomID(const UnicodeString& id, int32_t& sign, int32_t& hour, int32_t& min, int32_t& sec) { - static const int32_t kParseFailed = -99999; - - NumberFormat* numberFormat = 0; - UnicodeString idUppercase = id; - idUppercase.toUpper(""); - - if (id.length() > GMT_ID_LENGTH && - idUppercase.startsWith(GMT_ID, GMT_ID_LENGTH)) - { - ParsePosition pos(GMT_ID_LENGTH); - sign = 1; - hour = 0; - min = 0; - sec = 0; - - if (id[pos.getIndex()] == MINUS /*'-'*/) { - sign = -1; - } else if (id[pos.getIndex()] != PLUS /*'+'*/) { + if (id.length() < GMT_ID_LENGTH) { + return false; + } + if (0 != u_strncasecmp(id.getBuffer(), GMT_ID, GMT_ID_LENGTH, 0)) { + return false; + } + sign = 1; + hour = 0; + min = 0; + sec = 0; + + if (id[GMT_ID_LENGTH] == MINUS /*'-'*/) { + sign = -1; + } else if (id[GMT_ID_LENGTH] != PLUS /*'+'*/) { + return false; + } + + int32_t start = GMT_ID_LENGTH + 1; + int32_t pos = start; + hour = ICU_Utility::parseNumber(id, pos, 10); + if (pos == id.length()) { + // Handle the following cases + // HHmmss + // Hmmss + // HHmm + // Hmm + // HH + // H + + // Get all digits + // Should be 1 to 6 digits. + int32_t length = pos - start; + switch (length) { + case 1: // H + case 2: // HH + // already set to hour + break; + case 3: // Hmm + case 4: // HHmm + min = hour % 100; + hour /= 100; + break; + case 5: // Hmmss + case 6: // HHmmss + sec = hour % 100; + min = (hour/100) % 100; + hour /= 10000; + break; + default: + // invalid range + return false; + } + } else { + // Handle the following cases + // HH:mm:ss + // H:mm:ss + // HH:mm + // H:mm + if (pos - start < 1 || pos - start > 2 || id[pos] != COLON) { return false; } - pos.setIndex(pos.getIndex() + 1); - - UErrorCode success = U_ZERO_ERROR; - numberFormat = NumberFormat::createInstance(success); - if(U_FAILURE(success)){ + pos++; // skip : after H or HH + if (id.length() == pos) { return false; } - numberFormat->setParseIntegerOnly(true); - //numberFormat->setLenient(true); // TODO: May need to set this, depends on latest timezone parsing - - // Look for either hh:mm, hhmm, or hh - int32_t start = pos.getIndex(); - Formattable n(kParseFailed); - numberFormat->parse(id, n, pos); - if (pos.getIndex() == start) { - delete numberFormat; + start = pos; + min = ICU_Utility::parseNumber(id, pos, 10); + if (pos - start != 2) { return false; } - hour = n.getLong(); - - if (pos.getIndex() < id.length()) { - if (pos.getIndex() - start > 2 - || id[pos.getIndex()] != COLON) { - delete numberFormat; + if (id.length() > pos) { + if (id[pos] != COLON) { return false; } - // hh:mm - pos.setIndex(pos.getIndex() + 1); - int32_t oldPos = pos.getIndex(); - n.setLong(kParseFailed); - numberFormat->parse(id, n, pos); - if ((pos.getIndex() - oldPos) != 2) { - // must be 2 digits - delete numberFormat; + pos++; // skip : after mm + start = pos; + sec = ICU_Utility::parseNumber(id, pos, 10); + if (pos - start != 2 || id.length() > pos) { return false; } - min = n.getLong(); - if (pos.getIndex() < id.length()) { - if (id[pos.getIndex()] != COLON) { - delete numberFormat; - return false; - } - // [:ss] - pos.setIndex(pos.getIndex() + 1); - oldPos = pos.getIndex(); - n.setLong(kParseFailed); - numberFormat->parse(id, n, pos); - if (pos.getIndex() != id.length() - || (pos.getIndex() - oldPos) != 2) { - delete numberFormat; - return false; - } - sec = n.getLong(); - } - } else { - // Supported formats are below - - // - // HHmmss - // Hmmss - // HHmm - // Hmm - // HH - // H - - int32_t length = pos.getIndex() - start; - if (length <= 0 || 6 < length) { - // invalid length - delete numberFormat; - return false; - } - switch (length) { - case 1: - case 2: - // already set to hour - break; - case 3: - case 4: - min = hour % 100; - hour /= 100; - break; - case 5: - case 6: - sec = hour % 100; - min = (hour/100) % 100; - hour /= 10000; - break; - } - } - - delete numberFormat; - - if (hour > kMAX_CUSTOM_HOUR || min > kMAX_CUSTOM_MIN || sec > kMAX_CUSTOM_SEC) { - return false; } - return true; } - return false; + if (hour > kMAX_CUSTOM_HOUR || + min > kMAX_CUSTOM_MIN || + sec > kMAX_CUSTOM_SEC) { + return false; + } + return true; } UnicodeString& @@ -1495,33 +1467,33 @@ TimeZone::formatCustomID(int32_t hour, int32_t min, int32_t sec, id.setTo(GMT_ID, GMT_ID_LENGTH); if (hour | min | sec) { if (negative) { - id += (char16_t)MINUS; + id += static_cast<char16_t>(MINUS); } else { - id += (char16_t)PLUS; + id += static_cast<char16_t>(PLUS); } if (hour < 10) { - id += (char16_t)ZERO_DIGIT; + id += static_cast<char16_t>(ZERO_DIGIT); } else { - id += (char16_t)(ZERO_DIGIT + hour/10); + id += static_cast<char16_t>(ZERO_DIGIT + hour / 10); } - id += (char16_t)(ZERO_DIGIT + hour%10); - id += (char16_t)COLON; + id += static_cast<char16_t>(ZERO_DIGIT + hour % 10); + id += static_cast<char16_t>(COLON); if (min < 10) { - id += (char16_t)ZERO_DIGIT; + id += static_cast<char16_t>(ZERO_DIGIT); } else { - id += (char16_t)(ZERO_DIGIT + min/10); + id += static_cast<char16_t>(ZERO_DIGIT + min / 10); } - id += (char16_t)(ZERO_DIGIT + min%10); + id += static_cast<char16_t>(ZERO_DIGIT + min % 10); if (sec) { - id += (char16_t)COLON; + id += static_cast<char16_t>(COLON); if (sec < 10) { - id += (char16_t)ZERO_DIGIT; + id += static_cast<char16_t>(ZERO_DIGIT); } else { - id += (char16_t)(ZERO_DIGIT + sec/10); + id += static_cast<char16_t>(ZERO_DIGIT + sec / 10); } - id += (char16_t)(ZERO_DIGIT + sec%10); + id += static_cast<char16_t>(ZERO_DIGIT + sec % 10); } } return id; @@ -1543,7 +1515,7 @@ static void U_CALLCONV initTZDataVersion(UErrorCode &status) { const char16_t *tzver = ures_getStringByKey(bundle.getAlias(), kTZVERSION, &len, &status); if (U_SUCCESS(status)) { - if (len >= (int32_t)sizeof(TZDATA_VERSION)) { + if (len >= static_cast<int32_t>(sizeof(TZDATA_VERSION))) { // Ensure that there is always space for a trailing nul in TZDATA_VERSION len = sizeof(TZDATA_VERSION) - 1; } @@ -1629,8 +1601,11 @@ TimeZone::getWindowsID(const UnicodeString& id, UnicodeString& winid, UErrorCode return winid; } - UResourceBundle *mapTimezones = ures_openDirect(nullptr, "windowsZones", &status); - ures_getByKey(mapTimezones, "mapTimezones", mapTimezones, &status); + LocalUResourceBundlePointer mapTimezones(ures_openDirect(nullptr, "windowsZones", &status)); + if (U_FAILURE(status)) { + return winid; + } + ures_getByKey(mapTimezones.getAlias(), "mapTimezones", mapTimezones.getAlias(), &status); if (U_FAILURE(status)) { return winid; @@ -1638,8 +1613,8 @@ TimeZone::getWindowsID(const UnicodeString& id, UnicodeString& winid, UErrorCode UResourceBundle *winzone = nullptr; UBool found = false; - while (ures_hasNext(mapTimezones) && !found) { - winzone = ures_getNextResource(mapTimezones, winzone, &status); + while (ures_hasNext(mapTimezones.getAlias()) && !found) { + winzone = ures_getNextResource(mapTimezones.getAlias(), winzone, &status); if (U_FAILURE(status)) { break; } @@ -1664,7 +1639,7 @@ TimeZone::getWindowsID(const UnicodeString& id, UnicodeString& winid, UErrorCode const char16_t *start = tzids; UBool hasNext = true; while (hasNext) { - const char16_t *end = u_strchr(start, (char16_t)0x20); + const char16_t* end = u_strchr(start, static_cast<char16_t>(0x20)); if (end == nullptr) { end = tzids + len; hasNext = false; @@ -1680,7 +1655,6 @@ TimeZone::getWindowsID(const UnicodeString& id, UnicodeString& winid, UErrorCode ures_close(regionalData); } ures_close(winzone); - ures_close(mapTimezones); return winid; } @@ -1705,7 +1679,7 @@ TimeZone::getIDForWindowsID(const UnicodeString& winid, const char* region, Unic char winidKey[MAX_WINDOWS_ID_SIZE]; int32_t winKeyLen = winid.extract(0, winid.length(), winidKey, sizeof(winidKey) - 1, US_INV); - if (winKeyLen == 0 || winKeyLen >= (int32_t)sizeof(winidKey)) { + if (winKeyLen == 0 || winKeyLen >= static_cast<int32_t>(sizeof(winidKey))) { ures_close(zones); return id; } @@ -1726,7 +1700,7 @@ TimeZone::getIDForWindowsID(const UnicodeString& winid, const char* region, Unic // regional mapping is optional if (U_SUCCESS(tmperr)) { // first ID delimited by space is the default one - const char16_t *end = u_strchr(tzids, (char16_t)0x20); + const char16_t* end = u_strchr(tzids, static_cast<char16_t>(0x20)); if (end == nullptr) { id.setTo(tzids, -1); } else { diff --git a/deps/icu-small/source/i18n/titletrn.cpp b/deps/icu-small/source/i18n/titletrn.cpp index d3732893a78cd0..4f2baa00708ce3 100644 --- a/deps/icu-small/source/i18n/titletrn.cpp +++ b/deps/icu-small/source/i18n/titletrn.cpp @@ -132,7 +132,7 @@ void TitlecaseTransliterator::handleTransliterate( } else { result=ucase_toFullLower(c, utrans_rep_caseContextIterator, &csc, &s, UCASE_LOC_ROOT); } - doTitle = (UBool)(type==0); // doTitle=isUncased + doTitle = static_cast<UBool>(type == 0); // doTitle=isUncased if(csc.b1 && isIncremental) { // fMap() tried to look beyond the context limit diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index dc48b2ee2a4789..f96ab4322647c8 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -17,7 +17,6 @@ #include "unicode/localpointer.h" #include "plurrule_impl.h" #include "uvector.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -117,7 +116,7 @@ TimeUnitFormat::TimeUnitFormat(const TimeUnitFormat& other) { for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { UErrorCode status = U_ZERO_ERROR; fTimeUnitToCountToPatterns[i] = initHash(status); if (U_SUCCESS(status)) { @@ -133,7 +132,7 @@ TimeUnitFormat::TimeUnitFormat(const TimeUnitFormat& other) TimeUnitFormat::~TimeUnitFormat() { for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { deleteHash(fTimeUnitToCountToPatterns[i]); fTimeUnitToCountToPatterns[i] = nullptr; } @@ -154,13 +153,13 @@ TimeUnitFormat::operator=(const TimeUnitFormat& other) { MeasureFormat::operator=(other); for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { deleteHash(fTimeUnitToCountToPatterns[i]); fTimeUnitToCountToPatterns[i] = nullptr; } for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { UErrorCode status = U_ZERO_ERROR; fTimeUnitToCountToPatterns[i] = initHash(status); if (U_SUCCESS(status)) { @@ -194,22 +193,22 @@ TimeUnitFormat::parseObject(const UnicodeString& source, // and looking for the longest match. for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { Hashtable* countToPatterns = fTimeUnitToCountToPatterns[i]; int32_t elemPos = UHASH_FIRST; const UHashElement* elem = nullptr; while ((elem = countToPatterns->nextElement(elemPos)) != nullptr){ const UHashTok keyTok = elem->key; - UnicodeString* count = (UnicodeString*)keyTok.pointer; + UnicodeString* count = static_cast<UnicodeString*>(keyTok.pointer); #ifdef TMUTFMT_DEBUG count->extract(0, count->length(), res, "UTF-8"); std::cout << "parse plural count: " << res << "\n"; #endif const UHashTok valueTok = elem->value; // the value is a pair of MessageFormat* - MessageFormat** patterns = (MessageFormat**)valueTok.pointer; + MessageFormat** patterns = static_cast<MessageFormat**>(valueTok.pointer); for (UTimeUnitFormatStyle style = UTMUTFMT_FULL_STYLE; style < UTMUTFMT_FORMAT_STYLE_COUNT; - style = (UTimeUnitFormatStyle)(style + 1)) { + style = static_cast<UTimeUnitFormatStyle>(style + 1)) { MessageFormat* pattern = patterns[style]; pos.setErrorIndex(-1); pos.setIndex(oldPos); @@ -296,7 +295,7 @@ TimeUnitFormat::create(UTimeUnitFormatStyle style, UErrorCode& status) { // before checking for failure status. for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { fTimeUnitToCountToPatterns[i] = nullptr; } @@ -347,7 +346,7 @@ TimeUnitFormat::initDataMembers(UErrorCode& err){ } for (TimeUnit::UTimeUnitFields i = TimeUnit::UTIMEUNIT_YEAR; i < TimeUnit::UTIMEUNIT_FIELD_COUNT; - i = (TimeUnit::UTimeUnitFields)(i+1)) { + i = static_cast<TimeUnit::UTimeUnitFields>(i + 1)) { deleteHash(fTimeUnitToCountToPatterns[i]); fTimeUnitToCountToPatterns[i] = nullptr; } @@ -433,10 +432,10 @@ struct TimeUnitFormatReadSink : public ResourceSink { return; } MessageFormat** formatters = - (MessageFormat**)countToPatterns->get(pluralCountUniStr); + static_cast<MessageFormat**>(countToPatterns->get(pluralCountUniStr)); if (formatters == nullptr) { LocalMemory<MessageFormat *> localFormatters( - (MessageFormat **)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*))); + static_cast<MessageFormat**>(uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT * sizeof(MessageFormat*)))); if (localFormatters.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -522,14 +521,14 @@ TimeUnitFormat::checkConsistency(UTimeUnitFormatStyle style, const char* key, UE return; } } - MessageFormat** formatters = (MessageFormat**)countToPatterns->get(*pluralCount); + MessageFormat** formatters = static_cast<MessageFormat**>(countToPatterns->get(*pluralCount)); if( formatters == nullptr || formatters[style] == nullptr ) { // look through parents const char* localeName = getLocaleID(err); CharString pluralCountChars; pluralCountChars.appendInvariantChars(*pluralCount, err); searchInLocaleChain(style, key, localeName, - (TimeUnit::UTimeUnitFields)i, + static_cast<TimeUnit::UTimeUnitFields>(i), *pluralCount, pluralCountChars.data(), countToPatterns, err); } @@ -563,12 +562,7 @@ TimeUnitFormat::searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, CharString parentLocale(localeName, status); U_ASSERT(countToPatterns != nullptr); for (;;) { - { - CharString tmp; - CharStringByteSink sink(&tmp); - ulocimp_getParent(parentLocale.data(), sink, &status); - parentLocale = std::move(tmp); - } + parentLocale = ulocimp_getParent(parentLocale.data(), status); // look for pattern for srcPluralCount in locale tree LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_UNIT, parentLocale.data(), &status)); LocalUResourceBundlePointer unitsRes(ures_getByKey(rb.getAlias(), key, nullptr, &status)); @@ -584,10 +578,10 @@ TimeUnitFormat::searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, if (U_FAILURE(err)) { return; } - MessageFormat** formatters = (MessageFormat**)countToPatterns->get(srcPluralCount); + MessageFormat** formatters = static_cast<MessageFormat**>(countToPatterns->get(srcPluralCount)); if (formatters == nullptr) { LocalMemory<MessageFormat *> localFormatters( - (MessageFormat**)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*))); + static_cast<MessageFormat**>(uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT * sizeof(MessageFormat*)))); formatters = localFormatters.getAlias(); localFormatters[UTMUTFMT_FULL_STYLE] = nullptr; localFormatters[UTMUTFMT_ABBREVIATED_STYLE] = nullptr; @@ -621,7 +615,7 @@ TimeUnitFormat::searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, if (U_FAILURE(err)) { return; } - MessageFormat** formatters = (MessageFormat**)countToPatterns->get(srcPluralCount); + MessageFormat** formatters = static_cast<MessageFormat**>(countToPatterns->get(srcPluralCount)); if (formatters != nullptr && formatters[style] != nullptr) { return; } @@ -655,10 +649,10 @@ TimeUnitFormat::searchInLocaleChain(UTimeUnitFormatStyle style, const char* key, if (U_FAILURE(err)) { return; } - MessageFormat** formatters = (MessageFormat**)countToPatterns->get(srcPluralCount); + MessageFormat** formatters = static_cast<MessageFormat**>(countToPatterns->get(srcPluralCount)); if (formatters == nullptr) { LocalMemory<MessageFormat *> localFormatters ( - (MessageFormat**)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*))); + static_cast<MessageFormat**>(uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT * sizeof(MessageFormat*)))); if (localFormatters.isNull()) { err = U_MEMORY_ALLOCATION_ERROR; return; @@ -703,7 +697,7 @@ TimeUnitFormat::deleteHash(Hashtable* htable) { if ( htable ) { while ( (element = htable->nextElement(pos)) != nullptr ) { const UHashTok valueTok = element->value; - const MessageFormat** value = (const MessageFormat**)valueTok.pointer; + const MessageFormat** value = static_cast<const MessageFormat**>(valueTok.pointer); delete value[UTMUTFMT_FULL_STYLE]; delete value[UTMUTFMT_ABBREVIATED_STYLE]; //delete[] value; @@ -724,10 +718,10 @@ TimeUnitFormat::copyHash(const Hashtable* source, Hashtable* target, UErrorCode& if ( source ) { while ( (element = source->nextElement(pos)) != nullptr ) { const UHashTok keyTok = element->key; - const UnicodeString* key = (UnicodeString*)keyTok.pointer; + const UnicodeString* key = static_cast<UnicodeString*>(keyTok.pointer); const UHashTok valueTok = element->value; - const MessageFormat** value = (const MessageFormat**)valueTok.pointer; - MessageFormat** newVal = (MessageFormat**)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*)); + const MessageFormat** value = static_cast<const MessageFormat**>(valueTok.pointer); + MessageFormat** newVal = static_cast<MessageFormat**>(uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT * sizeof(MessageFormat*))); newVal[0] = value[0]->clone(); newVal[1] = value[1]->clone(); target->put(UnicodeString(*key), newVal, status); diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp index 29d38b12c7f0a3..7b1e9f57135a7a 100644 --- a/deps/icu-small/source/i18n/translit.cpp +++ b/deps/icu-small/source/i18n/translit.cpp @@ -96,7 +96,7 @@ static icu::UMutex registryMutex; /** * System transliterator registry; non-null when initialized. */ -static icu::TransliteratorRegistry* registry = 0; +static icu::TransliteratorRegistry* registry = nullptr; // Macro to check/initialize the registry. ONLY USE WITHIN // MUTEX. Avoids function call when registry is initialized. @@ -132,7 +132,7 @@ Transliterator::Transliterator(const UnicodeString& theID, maximumContextLength(0) { // NUL-terminate the ID string, which is a non-aliased copy. - ID.append((char16_t)0); + ID.append(static_cast<char16_t>(0)); ID.truncate(ID.length()-1); } @@ -140,23 +140,21 @@ Transliterator::Transliterator(const UnicodeString& theID, * Destructor. */ Transliterator::~Transliterator() { - if (filter) { - delete filter; - } + delete filter; } /** * Copy constructor. */ Transliterator::Transliterator(const Transliterator& other) : - UObject(other), ID(other.ID), filter(0), + UObject(other), ID(other.ID), filter(nullptr), maximumContextLength(other.maximumContextLength) { // NUL-terminate the ID string, which is a non-aliased copy. - ID.append((char16_t)0); + ID.append(static_cast<char16_t>(0)); ID.truncate(ID.length()-1); - if (other.filter != 0) { + if (other.filter != nullptr) { // We own the filter, so we must have our own copy filter = other.filter->clone(); } @@ -176,7 +174,7 @@ Transliterator& Transliterator::operator=(const Transliterator& other) { ID.getTerminatedBuffer(); maximumContextLength = other.maximumContextLength; - adoptFilter((other.filter == 0) ? 0 : other.filter->clone()); + adoptFilter(other.filter == nullptr ? nullptr : other.filter->clone()); return *this; } @@ -322,7 +320,7 @@ void Transliterator::transliterate(Replaceable& text, void Transliterator::transliterate(Replaceable& text, UTransPosition& index, UErrorCode& status) const { - _transliterate(text, index, 0, status); + _transliterate(text, index, nullptr, status); } /** @@ -365,7 +363,7 @@ void Transliterator::_transliterate(Replaceable& text, } // int32_t originalStart = index.contextStart; - if (insertion != 0) { + if (insertion != nullptr) { text.handleReplaceBetween(index.limit, index.limit, *insertion); index.limit += insertion->length(); index.contextLimit += insertion->length(); @@ -431,7 +429,7 @@ void Transliterator::filteredTransliterate(Replaceable& text, UBool rollback) const { // Short circuit path for transliterators with no filter in // non-incremental mode. - if (filter == 0 && !rollback) { + if (filter == nullptr && !rollback) { handleTransliterate(text, index, incremental); return; } @@ -761,8 +759,8 @@ UnicodeString& U_EXPORT2 Transliterator::getDisplayName(const UnicodeString& id, if (uprv_isInvariantUString(ID.getBuffer(), ID.length())) { char key[200]; uprv_strcpy(key, RB_DISPLAY_NAME_PREFIX); - int32_t length=(int32_t)uprv_strlen(RB_DISPLAY_NAME_PREFIX); - ID.extract(0, (int32_t)(sizeof(key)-length), key+length, (int32_t)(sizeof(key)-length), US_INV); + int32_t length = static_cast<int32_t>(uprv_strlen(RB_DISPLAY_NAME_PREFIX)); + ID.extract(0, static_cast<int32_t>(sizeof(key) - length), key + length, static_cast<int32_t>(sizeof(key) - length), US_INV); // Try to retrieve a UnicodeString from the bundle. UnicodeString resString = bundle.getStringEx(key, status); @@ -795,13 +793,13 @@ UnicodeString& U_EXPORT2 Transliterator::getDisplayName(const UnicodeString& id, // Use display names for the scripts, if they exist UnicodeString s; - length=(int32_t)uprv_strlen(RB_SCRIPT_DISPLAY_NAME_PREFIX); + length = static_cast<int32_t>(uprv_strlen(RB_SCRIPT_DISPLAY_NAME_PREFIX)); for (int j=1; j<=2; ++j) { status = U_ZERO_ERROR; uprv_strcpy(key, RB_SCRIPT_DISPLAY_NAME_PREFIX); args[j].getString(s); if (uprv_isInvariantUString(s.getBuffer(), s.length())) { - s.extract(0, sizeof(key)-length-1, key+length, (int32_t)sizeof(key)-length-1, US_INV); + s.extract(0, sizeof(key) - length - 1, key + length, static_cast<int32_t>(sizeof(key)) - length - 1, US_INV); resString = bundle.getStringEx(key, status); @@ -915,7 +913,7 @@ Transliterator::createInstance(const UnicodeString& ID, UErrorCode& status) { if (U_FAILURE(status)) { - return 0; + return nullptr; } UnicodeString canonID; @@ -951,7 +949,7 @@ Transliterator::createInstance(const UnicodeString& ID, t = new CompoundTransliterator(list, parseError, status); } else { - t = (Transliterator*)list.elementAt(0); + t = static_cast<Transliterator*>(list.elementAt(0)); } // Check null pointer if (t != nullptr) { @@ -978,8 +976,8 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, const UnicodeString* canon) { UParseError pe; UErrorCode ec = U_ZERO_ERROR; - TransliteratorAlias* alias = 0; - Transliterator* t = 0; + TransliteratorAlias* alias = nullptr; + Transliterator* t = nullptr; umtx_lock(®istryMutex); if (HAVE_REGISTRY(ec)) { @@ -990,7 +988,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, if (U_FAILURE(ec)) { delete t; delete alias; - return 0; + return nullptr; } // We may have not gotten a transliterator: Because we can't @@ -1000,7 +998,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, // registry mutex. The alias may, in turn, generate another alias, so // we handle aliases in a loop. The max times through the loop is two. // [alan] - while (alias != 0) { + while (alias != nullptr) { U_ASSERT(t==0); // Rule-based aliases are handled with TransliteratorAlias:: // parse(), followed by TransliteratorRegistry::reget(). @@ -1010,7 +1008,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, TransliteratorParser parser(ec); alias->parse(parser, pe, ec); delete alias; - alias = 0; + alias = nullptr; // Step 2. reget umtx_lock(®istryMutex); @@ -1023,7 +1021,7 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, } else { t = alias->create(pe, ec); delete alias; - alias = 0; + alias = nullptr; break; } if (U_FAILURE(ec)) { @@ -1062,7 +1060,7 @@ Transliterator::createFromRules(const UnicodeString& ID, parser.parse(rules, dir, parseError, status); if (U_FAILURE(status)) { - return 0; + return nullptr; } // NOTE: The logic here matches that in TransliteratorRegistry. @@ -1070,7 +1068,7 @@ Transliterator::createFromRules(const UnicodeString& ID, t = new NullTransliterator(); } else if (parser.idBlockVector.size() == 0 && parser.dataVector.size() == 1) { - t = new RuleBasedTransliterator(ID, (TransliterationRuleData*)parser.dataVector.orphanElementAt(0), true); + t = new RuleBasedTransliterator(ID, static_cast<TransliterationRuleData*>(parser.dataVector.orphanElementAt(0)), true); } else if (parser.idBlockVector.size() == 1 && parser.dataVector.size() == 0) { // idBlock, no data -- this is an alias. The ID has @@ -1081,10 +1079,10 @@ Transliterator::createFromRules(const UnicodeString& ID, UnicodeString filterPattern; parser.compoundFilter->toPattern(filterPattern, false); t = createInstance(filterPattern + UnicodeString(ID_DELIM) - + *((UnicodeString*)parser.idBlockVector.elementAt(0)), UTRANS_FORWARD, parseError, status); + + *static_cast<UnicodeString*>(parser.idBlockVector.elementAt(0)), UTRANS_FORWARD, parseError, status); } else - t = createInstance(*((UnicodeString*)parser.idBlockVector.elementAt(0)), UTRANS_FORWARD, parseError, status); + t = createInstance(*static_cast<UnicodeString*>(parser.idBlockVector.elementAt(0)), UTRANS_FORWARD, parseError, status); if (t != nullptr) { @@ -1103,7 +1101,7 @@ Transliterator::createFromRules(const UnicodeString& ID, for (int32_t i = 0; i < limit; i++) { if (i < parser.idBlockVector.size()) { - UnicodeString* idBlock = (UnicodeString*)parser.idBlockVector.elementAt(i); + UnicodeString* idBlock = static_cast<UnicodeString*>(parser.idBlockVector.elementAt(i)); if (!idBlock->isEmpty()) { Transliterator* temp = createInstance(*idBlock, UTRANS_FORWARD, parseError, status); if (U_FAILURE(status)) { @@ -1122,7 +1120,7 @@ Transliterator::createFromRules(const UnicodeString& ID, } } if (!parser.dataVector.isEmpty()) { - TransliterationRuleData* data = (TransliterationRuleData*)parser.dataVector.orphanElementAt(0); + TransliterationRuleData* data = static_cast<TransliterationRuleData*>(parser.dataVector.orphanElementAt(0)); // TODO: Should passNumber be turned into a decimal-string representation (1 -> "1")? RuleBasedTransliterator* temprbt = new RuleBasedTransliterator(UnicodeString(CompoundTransliterator::PASS_STRING) + UnicodeString(passNumber++), data, true); @@ -1476,14 +1474,14 @@ char16_t Transliterator::filteredCharAt(const Replaceable& text, int32_t i) cons * cannot itself proceed until the registry is initialized. */ UBool Transliterator::initializeRegistry(UErrorCode &status) { - if (registry != 0) { + if (registry != nullptr) { return true; } registry = new TransliteratorRegistry(status); - if (registry == 0 || U_FAILURE(status)) { + if (registry == nullptr || U_FAILURE(status)) { delete registry; - registry = 0; + registry = nullptr; return false; // can't create registry, no recovery } @@ -1526,7 +1524,7 @@ UBool Transliterator::initializeRegistry(UErrorCode &status) { UErrorCode lstatus = U_ZERO_ERROR; UResourceBundle *bundle, *transIDs, *colBund; bundle = ures_open(U_ICUDATA_TRANSLIT, nullptr/*open default locale*/, &lstatus); - transIDs = ures_getByKey(bundle, RB_RULE_BASED_IDS, 0, &lstatus); + transIDs = ures_getByKey(bundle, RB_RULE_BASED_IDS, nullptr, &lstatus); const UnicodeString T_PART = UNICODE_STRING_SIMPLE("-t-"); int32_t row, maxRows; @@ -1539,7 +1537,7 @@ UBool Transliterator::initializeRegistry(UErrorCode &status) { if (U_SUCCESS(lstatus)) { maxRows = ures_getSize(transIDs); for (row = 0; row < maxRows; row++) { - colBund = ures_getByIndex(transIDs, row, 0, &lstatus); + colBund = ures_getByIndex(transIDs, row, nullptr, &lstatus); if (U_SUCCESS(lstatus)) { UnicodeString id(ures_getKey(colBund), -1, US_INV); if(id.indexOf(T_PART) != -1) { diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index 3441076334f563..5f050f2e2bd325 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -85,7 +85,7 @@ TransliteratorAlias::TransliteratorAlias(const UnicodeString& theAliasID, const UnicodeSet* cpdFilter) : ID(), aliasesOrRules(theAliasID), - transes(0), + transes(nullptr), compoundFilter(cpdFilter), direction(UTRANS_FORWARD), type(TransliteratorAlias::SIMPLE) { @@ -108,8 +108,8 @@ TransliteratorAlias::TransliteratorAlias(const UnicodeString& theID, UTransDirection dir) : ID(theID), aliasesOrRules(rules), - transes(0), - compoundFilter(0), + transes(nullptr), + compoundFilter(nullptr), direction(dir), type(TransliteratorAlias::RULES) { } @@ -122,16 +122,16 @@ TransliteratorAlias::~TransliteratorAlias() { Transliterator* TransliteratorAlias::create(UParseError& pe, UErrorCode& ec) { if (U_FAILURE(ec)) { - return 0; + return nullptr; } Transliterator *t = nullptr; switch (type) { case SIMPLE: t = Transliterator::createInstance(aliasesOrRules, UTRANS_FORWARD, pe, ec); if(U_FAILURE(ec)){ - return 0; + return nullptr; } - if (compoundFilter != 0) + if (compoundFilter != nullptr) t->adoptFilter(compoundFilter->clone()); break; case COMPOUND: @@ -142,8 +142,8 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, // to see whether there really are ID blocks at the beginning and end (by looking for U+FFFF, which // marks the position where an anonymous transliterator goes) and adjust accordingly int32_t anonymousRBTs = transes->size(); - UnicodeString noIDBlock((char16_t)(0xffff)); - noIDBlock += ((char16_t)(0xffff)); + UnicodeString noIDBlock(static_cast<char16_t>(0xffff)); + noIDBlock += static_cast<char16_t>(0xffff); int32_t pos = aliasesOrRules.indexOf(noIDBlock); while (pos >= 0) { pos = aliasesOrRules.indexOf(noIDBlock, pos + 1); @@ -151,7 +151,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, UVector transliterators(uprv_deleteUObject, nullptr, ec); UnicodeString idBlock; - int32_t blockSeparatorPos = aliasesOrRules.indexOf((char16_t)(0xffff)); + int32_t blockSeparatorPos = aliasesOrRules.indexOf(static_cast<char16_t>(0xffff)); while (blockSeparatorPos >= 0) { aliasesOrRules.extract(0, blockSeparatorPos, idBlock); aliasesOrRules.remove(0, blockSeparatorPos + 1); @@ -159,7 +159,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, transliterators.adoptElement(Transliterator::createInstance(idBlock, UTRANS_FORWARD, pe, ec), ec); if (!transes->isEmpty()) transliterators.adoptElement(transes->orphanElementAt(0), ec); - blockSeparatorPos = aliasesOrRules.indexOf((char16_t)(0xffff)); + blockSeparatorPos = aliasesOrRules.indexOf(static_cast<char16_t>(0xffff)); } if (!aliasesOrRules.isEmpty()) transliterators.adoptElement(Transliterator::createInstance(aliasesOrRules, UTRANS_FORWARD, pe, ec), ec); @@ -171,13 +171,13 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, t = new CompoundTransliterator(ID, transliterators, (compoundFilter ? compoundFilter->clone() : nullptr), anonymousRBTs, pe, ec); - if (t == 0) { + if (t == nullptr) { ec = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } } else { for (int32_t i = 0; i < transliterators.size(); i++) - delete (Transliterator*)(transliterators.elementAt(i)); + delete static_cast<Transliterator*>(transliterators.elementAt(i)); } } break; @@ -253,7 +253,7 @@ class TransliteratorSpec : public UMemory { TransliteratorSpec::TransliteratorSpec(const UnicodeString& theSpec) : top(theSpec), - res(0) + res(nullptr) { UErrorCode status = U_ZERO_ERROR; Locale topLoc(""); @@ -261,12 +261,12 @@ TransliteratorSpec::TransliteratorSpec(const UnicodeString& theSpec) if (!topLoc.isBogus()) { res = new ResourceBundle(U_ICUDATA_TRANSLIT, topLoc, status); /* test for nullptr */ - if (res == 0) { + if (res == nullptr) { return; } if (U_FAILURE(status) || status == U_USING_DEFAULT_WARNING) { delete res; - res = 0; + res = nullptr; } } @@ -281,7 +281,7 @@ TransliteratorSpec::TransliteratorSpec(const UnicodeString& theSpec) } // Canonicalize top - if (res != 0) { + if (res != nullptr) { // Canonicalize locale name UnicodeString locStr; LocaleUtility::initNameFromLocale(topLoc, locStr); @@ -308,7 +308,7 @@ UBool TransliteratorSpec::hasFallback() const { void TransliteratorSpec::reset() { if (spec != top) { spec = top; - isSpecLocale = (res != 0); + isSpecLocale = (res != nullptr); setupNext(); } } @@ -474,7 +474,7 @@ class TransliteratorEntry : public UMemory { }; TransliteratorEntry::TransliteratorEntry() { - u.prototype = 0; + u.prototype = nullptr; compoundFilter = nullptr; entryType = NONE; DEBUG_newEntry(this); @@ -492,7 +492,7 @@ TransliteratorEntry::~TransliteratorEntry() { delete u.data; } else if (entryType == COMPOUND_RBT) { while (u.dataVector != nullptr && !u.dataVector->isEmpty()) - delete (TransliterationRuleData*)u.dataVector->orphanElementAt(0); + delete static_cast<TransliterationRuleData*>(u.dataVector->orphanElementAt(0)); delete u.dataVector; } delete compoundFilter; @@ -553,7 +553,7 @@ Transliterator* TransliteratorRegistry::get(const UnicodeString& ID, UErrorCode& status) { U_ASSERT(aliasReturn == nullptr); TransliteratorEntry *entry = find(ID); - return (entry == 0) ? 0 + return entry == nullptr ? nullptr : instantiateEntry(ID, entry, aliasReturn, status); } @@ -564,11 +564,11 @@ Transliterator* TransliteratorRegistry::reget(const UnicodeString& ID, U_ASSERT(aliasReturn == nullptr); TransliteratorEntry *entry = find(ID); - if (entry == 0) { + if (entry == nullptr) { // We get to this point if there are two threads, one of which // is instantiating an ID, and another of which is removing // the same ID from the registry, and the timing is just right. - return 0; + return nullptr; } // The usage model for the caller is that they will first call @@ -588,16 +588,16 @@ Transliterator* TransliteratorRegistry::reget(const UnicodeString& ID, entry->entryType == TransliteratorEntry::LOCALE_RULES) { if (parser.idBlockVector.isEmpty() && parser.dataVector.isEmpty()) { - entry->u.data = 0; + entry->u.data = nullptr; entry->entryType = TransliteratorEntry::ALIAS; entry->stringArg = UNICODE_STRING_SIMPLE("Any-nullptr"); } else if (parser.idBlockVector.isEmpty() && parser.dataVector.size() == 1) { - entry->u.data = (TransliterationRuleData*)parser.dataVector.orphanElementAt(0); + entry->u.data = static_cast<TransliterationRuleData*>(parser.dataVector.orphanElementAt(0)); entry->entryType = TransliteratorEntry::RBT_DATA; } else if (parser.idBlockVector.size() == 1 && parser.dataVector.isEmpty()) { - entry->stringArg = *(UnicodeString*)(parser.idBlockVector.elementAt(0)); + entry->stringArg = *static_cast<UnicodeString*>(parser.idBlockVector.elementAt(0)); entry->compoundFilter = parser.orphanCompoundFilter(); entry->entryType = TransliteratorEntry::ALIAS; } @@ -615,17 +615,17 @@ Transliterator* TransliteratorRegistry::reget(const UnicodeString& ID, for (int32_t i = 0; i < limit; i++) { if (i < parser.idBlockVector.size()) { - UnicodeString* idBlock = (UnicodeString*)parser.idBlockVector.elementAt(i); + UnicodeString* idBlock = static_cast<UnicodeString*>(parser.idBlockVector.elementAt(i)); if (!idBlock->isEmpty()) entry->stringArg += *idBlock; } if (!parser.dataVector.isEmpty()) { - TransliterationRuleData* data = (TransliterationRuleData*)parser.dataVector.orphanElementAt(0); + TransliterationRuleData* data = static_cast<TransliterationRuleData*>(parser.dataVector.orphanElementAt(0)); entry->u.dataVector->addElement(data, status); if (U_FAILURE(status)) { delete data; } - entry->stringArg += (char16_t)0xffff; // use U+FFFF to mark position of RBTs in ID block + entry->stringArg += static_cast<char16_t>(0xffff); // use U+FFFF to mark position of RBTs in ID block } } } @@ -751,7 +751,7 @@ const UnicodeString& TransliteratorRegistry::getAvailableID(int32_t index) const } if (e != nullptr) { - return *(UnicodeString*) e->key.pointer; + return *static_cast<UnicodeString*>(e->key.pointer); } // If the code reaches here, the hash table was likely modified during iteration. @@ -771,54 +771,54 @@ int32_t TransliteratorRegistry::countAvailableSources() const { UnicodeString& TransliteratorRegistry::getAvailableSource(int32_t index, UnicodeString& result) const { int32_t pos = UHASH_FIRST; - const UHashElement *e = 0; + const UHashElement* e = nullptr; while (index-- >= 0) { e = specDAG.nextElement(pos); - if (e == 0) { + if (e == nullptr) { break; } } - if (e == 0) { + if (e == nullptr) { result.truncate(0); } else { - result = *(UnicodeString*) e->key.pointer; + result = *static_cast<UnicodeString*>(e->key.pointer); } return result; } int32_t TransliteratorRegistry::countAvailableTargets(const UnicodeString& source) const { - Hashtable *targets = (Hashtable*) specDAG.get(source); - return (targets == 0) ? 0 : targets->count(); + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); + return (targets == nullptr) ? 0 : targets->count(); } UnicodeString& TransliteratorRegistry::getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result) const { - Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); + if (targets == nullptr) { result.truncate(0); // invalid source return result; } int32_t pos = UHASH_FIRST; - const UHashElement *e = 0; + const UHashElement* e = nullptr; while (index-- >= 0) { e = targets->nextElement(pos); - if (e == 0) { + if (e == nullptr) { break; } } - if (e == 0) { + if (e == nullptr) { result.truncate(0); // invalid index } else { - result = *(UnicodeString*) e->key.pointer; + result = *static_cast<UnicodeString*>(e->key.pointer); } return result; } int32_t TransliteratorRegistry::countAvailableVariants(const UnicodeString& source, const UnicodeString& target) const { - Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); + if (targets == nullptr) { return 0; } uint32_t varMask = targets->geti(target); @@ -836,8 +836,8 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result) const { - Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); + if (targets == nullptr) { result.truncate(0); // invalid source return result; } @@ -847,7 +847,7 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, while (varMask > 0) { if (varMask & 1) { if (varCount == index) { - UnicodeString *v = (UnicodeString*) variantList.elementAt(varListIndex); + UnicodeString* v = static_cast<UnicodeString*>(variantList.elementAt(varListIndex)); if (v != nullptr) { result = *v; return result; @@ -905,7 +905,7 @@ const UnicodeString* TransliteratorRegistry::Enumeration::snext(UErrorCode& stat } // Copy the string! This avoids lifetime problems. - unistr = *(const UnicodeString*) element->key.pointer; + unistr = *static_cast<const UnicodeString*>(element->key.pointer); return &unistr; } @@ -985,8 +985,8 @@ void TransliteratorRegistry::registerSTV(const UnicodeString& source, // assert(source.length() > 0); // assert(target.length() > 0); UErrorCode status = U_ZERO_ERROR; - Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); + if (targets == nullptr) { int32_t size = 3; if (source.compare(ANY,3) == 0) { size = ANY_TARGETS_INIT_SIZE; @@ -1030,7 +1030,7 @@ void TransliteratorRegistry::removeSTV(const UnicodeString& source, // assert(source.length() > 0); // assert(target.length() > 0); UErrorCode status = U_ZERO_ERROR; - Hashtable *targets = (Hashtable*) specDAG.get(source); + Hashtable* targets = static_cast<Hashtable*>(specDAG.get(source)); if (targets == nullptr) { return; // should never happen for valid s-t/v } @@ -1065,7 +1065,7 @@ TransliteratorEntry* TransliteratorRegistry::findInDynamicStore(const Transliter const UnicodeString& variant) const { UnicodeString ID; TransliteratorIDParser::STVtoID(src, trg, variant, ID); - TransliteratorEntry *e = (TransliteratorEntry*) registry.get(ID); + TransliteratorEntry* e = static_cast<TransliteratorEntry*>(registry.get(ID)); DEBUG_useEntry(e); return e; } @@ -1084,7 +1084,7 @@ TransliteratorEntry* TransliteratorRegistry::findInDynamicStore(const Transliter TransliteratorEntry* TransliteratorRegistry::findInStaticStore(const TransliteratorSpec& src, const TransliteratorSpec& trg, const UnicodeString& variant) { - TransliteratorEntry* entry = 0; + TransliteratorEntry* entry = nullptr; if (src.isLocale()) { entry = findInBundle(src, trg, variant, UTRANS_FORWARD); } else if (trg.isLocale()) { @@ -1093,7 +1093,7 @@ TransliteratorEntry* TransliteratorRegistry::findInStaticStore(const Translitera // If we found an entry, store it in the Hashtable for next // time. - if (entry != 0) { + if (entry != nullptr) { registerEntry(src.getTop(), trg.getTop(), variant, entry, false); } @@ -1179,7 +1179,7 @@ TransliteratorEntry* TransliteratorRegistry::findInBundle(const TransliteratorSp // We have succeeded in loading a string from the locale // resources. Create a new registry entry to hold it and return it. TransliteratorEntry *entry = new TransliteratorEntry(); - if (entry != 0) { + if (entry != nullptr) { // The direction is always forward for the // TransliterateTo_xxx and TransliterateFrom_xxx // items; those are unidirectional forward rules. @@ -1239,8 +1239,8 @@ TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, // ICU ticket #8089 UnicodeString ID; TransliteratorIDParser::STVtoID(source, target, variant, ID); - entry = (TransliteratorEntry*) registry.get(ID); - if (entry != 0) { + entry = static_cast<TransliteratorEntry*>(registry.get(ID)); + if (entry != nullptr) { // std::string ss; // std::cout << ID.toUTF8String(ss) << std::endl; return entry; @@ -1250,13 +1250,13 @@ TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, // Seek exact match in hashtable entry = findInDynamicStore(src, trg, variant); - if (entry != 0) { + if (entry != nullptr) { return entry; } - + // Seek exact match in locale resources entry = findInStaticStore(src, trg, variant); - if (entry != 0) { + if (entry != nullptr) { return entry; } } @@ -1266,13 +1266,13 @@ TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, for (;;) { // Seek match in hashtable entry = findInDynamicStore(src, trg, NO_VARIANT); - if (entry != 0) { + if (entry != nullptr) { return entry; } - + // Seek match in locale resources entry = findInStaticStore(src, trg, NO_VARIANT); - if (entry != 0) { + if (entry != nullptr) { return entry; } if (!src.hasFallback()) { @@ -1286,7 +1286,7 @@ TransliteratorEntry* TransliteratorRegistry::find(UnicodeString& source, trg.next(); } - return 0; + return nullptr; } /** @@ -1305,31 +1305,31 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID TransliteratorEntry *entry, TransliteratorAlias* &aliasReturn, UErrorCode& status) { - Transliterator *t = 0; + Transliterator* t = nullptr; U_ASSERT(aliasReturn == 0); switch (entry->entryType) { case TransliteratorEntry::RBT_DATA: t = new RuleBasedTransliterator(ID, entry->u.data); - if (t == 0) { + if (t == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } return t; case TransliteratorEntry::PROTOTYPE: t = entry->u.prototype->clone(); - if (t == 0) { + if (t == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } return t; case TransliteratorEntry::ALIAS: aliasReturn = new TransliteratorAlias(entry->stringArg, entry->compoundFilter); - if (aliasReturn == 0) { + if (aliasReturn == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } - return 0; + return nullptr; case TransliteratorEntry::FACTORY: t = entry->u.factory.function(ID, entry->u.factory.context); - if (t == 0) { + if (t == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } return t; @@ -1345,30 +1345,30 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID for (int32_t i = 0; U_SUCCESS(status) && i < entry->u.dataVector->size(); i++) { // TODO: Should passNumber be turned into a decimal-string representation (1 -> "1")? Transliterator* tl = new RuleBasedTransliterator(UnicodeString(CompoundTransliterator::PASS_STRING) + UnicodeString(passNumber++), - (TransliterationRuleData*)(entry->u.dataVector->elementAt(i)), false); - if (tl == 0) + static_cast<TransliterationRuleData*>(entry->u.dataVector->elementAt(i)), false); + if (tl == nullptr) status = U_MEMORY_ALLOCATION_ERROR; else rbts->adoptElement(tl, status); } if (U_FAILURE(status)) { delete rbts; - return 0; + return nullptr; } rbts->setDeleter(nullptr); aliasReturn = new TransliteratorAlias(ID, entry->stringArg, rbts, entry->compoundFilter); } - if (aliasReturn == 0) { + if (aliasReturn == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } - return 0; + return nullptr; case TransliteratorEntry::LOCALE_RULES: aliasReturn = new TransliteratorAlias(ID, entry->stringArg, - (UTransDirection) entry->intArg); - if (aliasReturn == 0) { + static_cast<UTransDirection>(entry->intArg)); + if (aliasReturn == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } - return 0; + return nullptr; case TransliteratorEntry::RULES_FORWARD: case TransliteratorEntry::RULES_REVERSE: // Process the rule data into a TransliteratorRuleData object, @@ -1404,12 +1404,12 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID aliasReturn = new TransliteratorAlias(ID, rules, ((entry->entryType == TransliteratorEntry::RULES_REVERSE) ? UTRANS_REVERSE : UTRANS_FORWARD)); - if (aliasReturn == 0) { + if (aliasReturn == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } //} } - return 0; + return nullptr; default: UPRV_UNREACHABLE_EXIT; // can't get here } diff --git a/deps/icu-small/source/i18n/tridpars.cpp b/deps/icu-small/source/i18n/tridpars.cpp index 6c23a0dc902658..5c769dc39fbcec 100644 --- a/deps/icu-small/source/i18n/tridpars.cpp +++ b/deps/icu-small/source/i18n/tridpars.cpp @@ -279,9 +279,9 @@ UnicodeSet* TransliteratorIDParser::parseGlobalFilter(const UnicodeString& id, i UErrorCode ec = U_ZERO_ERROR; filter = new UnicodeSet(id, ppos, USET_IGNORE_SPACE, nullptr, ec); /* test for nullptr */ - if (filter == 0) { + if (filter == nullptr) { pos = start; - return 0; + return nullptr; } if (U_FAILURE(ec)) { delete filter; @@ -413,7 +413,7 @@ UBool TransliteratorIDParser::parseCompoundID(const UnicodeString& id, int32_t d // Construct canonical ID for (i=0; i<list.size(); ++i) { - SingleID* single = (SingleID*) list.elementAt(i); + SingleID* single = static_cast<SingleID*>(list.elementAt(i)); canonID.append(single->canonID); if (i != (list.size()-1)) { canonID.append(ID_DELIM); @@ -489,7 +489,7 @@ void TransliteratorIDParser::instantiateList(UVector& list, break; } - SingleID* single = (SingleID*) list.elementAt(i); + SingleID* single = static_cast<SingleID*>(list.elementAt(i)); if (single->basicID.length() != 0) { t = single->createInstance(); if (t == nullptr) { @@ -522,7 +522,7 @@ void TransliteratorIDParser::instantiateList(UVector& list, list.setDeleter(_deleteTransliteratorTrIDPars); while (tlist.size() > 0) { - t = (Transliterator*) tlist.orphanElementAt(0); + t = static_cast<Transliterator*>(tlist.orphanElementAt(0)); list.adoptElement(t, ec); if (U_FAILURE(ec)) { list.removeAllElements(); @@ -607,7 +607,7 @@ void TransliteratorIDParser::STVtoID(const UnicodeString& source, } // NUL-terminate the ID string for getTerminatedBuffer. // This prevents valgrind and Purify warnings. - id.append((char16_t)0); + id.append(static_cast<char16_t>(0)); id.truncate(id.length()-1); } @@ -862,7 +862,7 @@ TransliteratorIDParser::specsToSpecialInverse(const Specs& specs, UErrorCode &st UnicodeString* inverseTarget; umtx_lock(&LOCK); - inverseTarget = (UnicodeString*) SPECIAL_INVERSES->get(specs.target); + inverseTarget = static_cast<UnicodeString*>(SPECIAL_INVERSES->get(specs.target)); umtx_unlock(&LOCK); if (inverseTarget != nullptr) { diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index ed53438c414495..aaec9f31c42e94 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -19,7 +19,6 @@ #include "unicode/udat.h" #include "unicode/ustring.h" #include "unicode/utf16.h" -#include "bytesinkutil.h" #include "charstr.h" #include "tzgnames.h" #include "cmemory.h" @@ -158,15 +157,11 @@ U_CDECL_BEGIN */ static UBool U_CALLCONV tzfmt_cleanup() { - if (gZoneIdTrie != nullptr) { - delete gZoneIdTrie; - } + delete gZoneIdTrie; gZoneIdTrie = nullptr; gZoneIdTrieInitOnce.reset(); - if (gShortZoneIdTrie != nullptr) { - delete gShortZoneIdTrie; - } + delete gShortZoneIdTrie; gShortZoneIdTrie = nullptr; gShortZoneIdTrieInitOnce.reset(); @@ -230,7 +225,7 @@ GMTOffsetField::createText(const UnicodeString& text, UErrorCode& status) { } int32_t len = text.length(); - result->fText = (char16_t*)uprv_malloc((len + 1) * sizeof(char16_t)); + result->fText = static_cast<char16_t*>(uprv_malloc((len + 1) * sizeof(char16_t))); if (result->fText == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; delete result; @@ -327,19 +322,16 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status) const char* region = fLocale.getCountry(); int32_t regionLen = static_cast<int32_t>(uprv_strlen(region)); if (regionLen == 0) { - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_addLikelySubtags(fLocale.getName(), sink, &status); - } + UErrorCode tempStatus = U_ZERO_ERROR; + CharString loc = ulocimp_addLikelySubtags(fLocale.getName(), tempStatus); - regionLen = uloc_getCountry(loc.data(), fTargetRegion, sizeof(fTargetRegion), &status); - if (U_SUCCESS(status)) { + regionLen = uloc_getCountry(loc.data(), fTargetRegion, sizeof(fTargetRegion), &tempStatus); + if (U_SUCCESS(tempStatus)) { fTargetRegion[regionLen] = 0; } else { - return; + fTargetRegion[0] = 0; } - } else if (regionLen < (int32_t)sizeof(fTargetRegion)) { + } else if (regionLen < static_cast<int32_t>(sizeof(fTargetRegion))) { uprv_strcpy(fTargetRegion, region); } else { fTargetRegion[0] = 0; @@ -382,10 +374,10 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status) UBool useDefaultOffsetPatterns = true; if (hourFormats) { - char16_t *sep = u_strchr(hourFormats, (char16_t)0x003B /* ';' */); + char16_t* sep = u_strchr(hourFormats, static_cast<char16_t>(0x003B) /* ';' */); if (sep != nullptr) { UErrorCode tmpStatus = U_ZERO_ERROR; - fGMTOffsetPatterns[UTZFMT_PAT_POSITIVE_HM].setTo(false, hourFormats, (int32_t)(sep - hourFormats)); + fGMTOffsetPatterns[UTZFMT_PAT_POSITIVE_HM].setTo(false, hourFormats, static_cast<int32_t>(sep - hourFormats)); fGMTOffsetPatterns[UTZFMT_PAT_NEGATIVE_HM].setTo(true, sep + 1, -1); expandOffsetPattern(fGMTOffsetPatterns[UTZFMT_PAT_POSITIVE_HM], fGMTOffsetPatterns[UTZFMT_PAT_POSITIVE_HMS], tmpStatus); expandOffsetPattern(fGMTOffsetPatterns[UTZFMT_PAT_NEGATIVE_HM], fGMTOffsetPatterns[UTZFMT_PAT_NEGATIVE_HMS], tmpStatus); @@ -1350,7 +1342,7 @@ TimeZoneFormat::formatGeneric(const TimeZone& tz, int32_t genType, UDate date, U } return gnames->getGenericLocationName(UnicodeString(true, canonicalID, -1), name); } - return gnames->getDisplayName(tz, (UTimeZoneGenericNameType)genType, date, name); + return gnames->getDisplayName(tz, static_cast<UTimeZoneGenericNameType>(genType), date, name); } UnicodeString& @@ -1548,8 +1540,8 @@ TimeZoneFormat::formatOffsetISO8601(int32_t offset, UBool isBasic, UBool useUtcI if (sep && idx != 0) { result.append(sep); } - result.append((char16_t)(0x0030 + fields[idx]/10)); - result.append((char16_t)(0x0030 + fields[idx]%10)); + result.append(static_cast<char16_t>(0x0030 + fields[idx] / 10)); + result.append(static_cast<char16_t>(0x0030 + fields[idx] % 10)); } return result; @@ -1567,11 +1559,6 @@ TimeZoneFormat::formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeS return result; } - if (offset == 0) { - result.setTo(fGMTZeroFormat); - return result; - } - UBool positive = true; if (offset < 0) { offset = -offset; @@ -1611,7 +1598,7 @@ TimeZoneFormat::formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeS result.setTo(fGMTPatternPrefix); for (int32_t i = 0; i < offsetPatternItems->size(); i++) { - const GMTOffsetField* item = (GMTOffsetField*)offsetPatternItems->elementAt(i); + const GMTOffsetField* item = static_cast<GMTOffsetField*>(offsetPatternItems->elementAt(i)); GMTOffsetField::FieldType type = item->getType(); switch (type) { @@ -1649,7 +1636,7 @@ TimeZoneFormat::parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos } char16_t firstChar = text.charAt(start); - if (firstChar == ISO8601_UTC || firstChar == (char16_t)(ISO8601_UTC + 0x20)) { + if (firstChar == ISO8601_UTC || firstChar == static_cast<char16_t>(ISO8601_UTC + 0x20)) { // "Z" (or "z") - indicates UTC pos.setIndex(start + 1); return 0; @@ -1864,7 +1851,7 @@ TimeZoneFormat::parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t for (int32_t i = 0; i < patternItems->size(); i++) { int32_t len = 0; - const GMTOffsetField* field = (const GMTOffsetField*)patternItems->elementAt(i); + const GMTOffsetField* field = static_cast<const GMTOffsetField*>(patternItems->elementAt(i)); GMTOffsetField::FieldType fieldType = field->getType(); if (fieldType == GMTOffsetField::TEXT) { const char16_t* patStr = field->getPatternText(); @@ -2199,8 +2186,8 @@ TimeZoneFormat::formatOffsetWithAsciiDigits(int32_t offset, char16_t sep, Offset if (sep && idx != 0) { result.append(sep); } - result.append((char16_t)(0x0030 + fields[idx]/10)); - result.append((char16_t)(0x0030 + fields[idx]%10)); + result.append(static_cast<char16_t>(0x0030 + fields[idx] / 10)); + result.append(static_cast<char16_t>(0x0030 + fields[idx] % 10)); } return result; @@ -2585,7 +2572,7 @@ TimeZoneFormat::expandOffsetPattern(const UnicodeString& offsetHM, UnicodeString } UnicodeString sep; - int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf((char16_t)0x0048 /* H */); + int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf(static_cast<char16_t>(0x0048) /* H */); if (idx_H >= 0) { sep = offsetHM.tempSubString(idx_H + 1, idx_mm - (idx_H + 1)); } @@ -2615,7 +2602,7 @@ TimeZoneFormat::truncateOffsetPattern(const UnicodeString& offsetHM, UnicodeStri if (idx_HH >= 0) { return result.setTo(offsetHM.tempSubString(0, idx_HH + 2)); } - int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf((char16_t)0x0048, 0); + int32_t idx_H = offsetHM.tempSubString(0, idx_mm).lastIndexOf(static_cast<char16_t>(0x0048), 0); if (idx_H >= 0) { return result.setTo(offsetHM.tempSubString(0, idx_H + 1)); } @@ -2655,7 +2642,7 @@ TimeZoneFormat::checkAbuttingHoursAndMinutes() { UBool afterH = false; UVector *items = fGMTOffsetPatternItems[type]; for (int32_t i = 0; i < items->size(); i++) { - const GMTOffsetField* item = (GMTOffsetField*)items->elementAt(i); + const GMTOffsetField* item = static_cast<GMTOffsetField*>(items->elementAt(i)); GMTOffsetField::FieldType fieldType = item->getType(); if (fieldType != GMTOffsetField::TEXT) { if (afterH) { @@ -2753,7 +2740,7 @@ ZoneIdMatchHandler::handleMatch(int32_t matchLength, const CharacterNode *node, return false; } if (node->hasValues()) { - const char16_t* id = (const char16_t*)node->getValue(0); + const char16_t* id = static_cast<const char16_t*>(node->getValue(0)); if (id != nullptr) { if (fLen < matchLength) { fID = id; diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index d55b0fd2ae0133..b513843208bbd7 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -21,10 +21,10 @@ #include "unicode/strenum.h" #include "unicode/vtzone.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "fixedstring.h" #include "mutex.h" #include "uhash.h" #include "uassert.h" @@ -51,7 +51,7 @@ static const char16_t gEmpty[] = {0x00}; static const char16_t gDefRegionPattern[] = {0x7B, 0x30, 0x7D, 0x00}; // "{0}" static const char16_t gDefFallbackPattern[] = {0x7B, 0x31, 0x7D, 0x20, 0x28, 0x7B, 0x30, 0x7D, 0x29, 0x00}; // "{1} ({0})" -static const double kDstCheckRange = (double)184*U_MILLIS_PER_DAY; +static const double kDstCheckRange = static_cast<double>(184) * U_MILLIS_PER_DAY; @@ -145,9 +145,7 @@ TimeZoneGenericNameMatchInfo::TimeZoneGenericNameMatchInfo(UVector* matches) } TimeZoneGenericNameMatchInfo::~TimeZoneGenericNameMatchInfo() { - if (fMatches != nullptr) { - delete fMatches; - } + delete fMatches; } int32_t @@ -160,7 +158,7 @@ TimeZoneGenericNameMatchInfo::size() const { UTimeZoneGenericNameType TimeZoneGenericNameMatchInfo::getGenericNameType(int32_t index) const { - GMatchInfo *minfo = (GMatchInfo *)fMatches->elementAt(index); + GMatchInfo* minfo = static_cast<GMatchInfo*>(fMatches->elementAt(index)); if (minfo != nullptr) { return static_cast<UTimeZoneGenericNameType>(minfo->gnameInfo->type); } @@ -169,7 +167,7 @@ TimeZoneGenericNameMatchInfo::getGenericNameType(int32_t index) const { int32_t TimeZoneGenericNameMatchInfo::getMatchLength(int32_t index) const { - ZMatchInfo *minfo = (ZMatchInfo *)fMatches->elementAt(index); + ZMatchInfo* minfo = static_cast<ZMatchInfo*>(fMatches->elementAt(index)); if (minfo != nullptr) { return minfo->matchLength; } @@ -178,7 +176,7 @@ TimeZoneGenericNameMatchInfo::getMatchLength(int32_t index) const { UnicodeString& TimeZoneGenericNameMatchInfo::getTimeZoneID(int32_t index, UnicodeString& tzID) const { - GMatchInfo *minfo = (GMatchInfo *)fMatches->elementAt(index); + GMatchInfo* minfo = static_cast<GMatchInfo*>(fMatches->elementAt(index)); if (minfo != nullptr && minfo->gnameInfo->tzID != nullptr) { tzID.setTo(true, minfo->gnameInfo->tzID, -1); } else { @@ -209,9 +207,7 @@ GNameSearchHandler::GNameSearchHandler(uint32_t types) } GNameSearchHandler::~GNameSearchHandler() { - if (fResults != nullptr) { - delete fResults; - } + delete fResults; } UBool @@ -235,7 +231,7 @@ GNameSearchHandler::handleMatch(int32_t matchLength, const CharacterNode *node, } fResults = lpResults.orphan(); } - GMatchInfo *gmatch = (GMatchInfo *)uprv_malloc(sizeof(GMatchInfo)); + GMatchInfo* gmatch = static_cast<GMatchInfo*>(uprv_malloc(sizeof(GMatchInfo))); if (gmatch == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return false; @@ -299,7 +295,7 @@ class TZGNCore : public UMemory { TextTrieMap fGNamesTrie; UBool fGNamesTrieFullyLoaded; - char fTargetRegion[ULOC_COUNTRY_CAPACITY]; + FixedString fTargetRegion; void initialize(const Locale& locale, UErrorCode& status); void cleanup(); @@ -339,7 +335,8 @@ TZGNCore::TZGNCore(const Locale& locale, UErrorCode& status) fLocaleDisplayNames(nullptr), fStringPool(status), fGNamesTrie(true, deleteGNameInfo), - fGNamesTrieFullyLoaded(false) { + fGNamesTrieFullyLoaded(false), + fTargetRegion() { initialize(locale, status); } @@ -409,23 +406,26 @@ TZGNCore::initialize(const Locale& locale, UErrorCode& status) { const char* region = fLocale.getCountry(); int32_t regionLen = static_cast<int32_t>(uprv_strlen(region)); if (regionLen == 0) { - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_addLikelySubtags(fLocale.getName(), sink, &status); + CharString loc = ulocimp_addLikelySubtags(fLocale.getName(), status); + CharString tmp; + ulocimp_getSubtags(loc.toStringPiece(), nullptr, nullptr, &tmp, nullptr, nullptr, status); + if (U_FAILURE(status)) { + cleanup(); + return; } - - regionLen = uloc_getCountry(loc.data(), fTargetRegion, sizeof(fTargetRegion), &status); - if (U_SUCCESS(status)) { - fTargetRegion[regionLen] = 0; - } else { + fTargetRegion = tmp.toStringPiece(); + if (fTargetRegion.isEmpty() != tmp.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; cleanup(); return; } - } else if (regionLen < (int32_t)sizeof(fTargetRegion)) { - uprv_strcpy(fTargetRegion, region); } else { - fTargetRegion[0] = 0; + fTargetRegion = {region, static_cast<std::string_view::size_type>(regionLen)}; + if (fTargetRegion.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + cleanup(); + return; + } } // preload generic names for the default zone @@ -439,12 +439,8 @@ TZGNCore::initialize(const Locale& locale, UErrorCode& status) { void TZGNCore::cleanup() { - if (fLocaleDisplayNames != nullptr) { - delete fLocaleDisplayNames; - } - if (fTimeZoneNames != nullptr) { - delete fTimeZoneNames; - } + delete fLocaleDisplayNames; + delete fTimeZoneNames; uhash_close(fLocationNamesMap); uhash_close(fPartialLocationNamesMap); @@ -519,7 +515,7 @@ TZGNCore::getGenericLocationName(const UnicodeString& tzCanonicalID) { U_ASSERT(status == U_ZERO_ERROR); // already checked length above tzIDKey[tzIDKeyLen] = 0; - const char16_t *locname = (const char16_t *)uhash_get(fLocationNamesMap, tzIDKey); + const char16_t* locname = static_cast<const char16_t*>(uhash_get(fLocationNamesMap, tzIDKey)); if (locname != nullptr) { // gEmpty indicate the name is not available @@ -577,7 +573,7 @@ TZGNCore::getGenericLocationName(const UnicodeString& tzCanonicalID) { locname = nullptr; } else { // put the name info into the trie - GNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(GNameInfo)); + GNameInfo* nameinfo = static_cast<ZNameInfo*>(uprv_malloc(sizeof(GNameInfo))); if (nameinfo != nullptr) { nameinfo->type = UTZGNM_LOCATION; nameinfo->tzID = cacheID; @@ -704,7 +700,7 @@ TZGNCore::formatGenericNonLocationName(const TimeZone& tz, UTimeZoneGenericNameT // golden zone at the given date. char16_t idBuf[32]; UnicodeString goldenID(idBuf, 0, UPRV_LENGTHOF(idBuf)); - fTimeZoneNames->getReferenceZoneID(mzID, fTargetRegion, goldenID); + fTimeZoneNames->getReferenceZoneID(mzID, fTargetRegion.data(), goldenID); if (!goldenID.isEmpty() && goldenID != tzID) { TimeZone *goldenZone = TimeZone::createTimeZone(goldenID); int32_t raw1, sav1; @@ -773,7 +769,7 @@ TZGNCore::getPartialLocationName(const UnicodeString& tzCanonicalID, key.isLong = isLong; U_ASSERT(key.tzID != nullptr && key.mzID != nullptr); - const char16_t* uplname = (const char16_t*)uhash_get(fPartialLocationNamesMap, (void *)&key); + const char16_t* uplname = static_cast<const char16_t*>(uhash_get(fPartialLocationNamesMap, &key)); if (uplname != nullptr) { return uplname; } @@ -816,7 +812,7 @@ TZGNCore::getPartialLocationName(const UnicodeString& tzCanonicalID, uplname = fStringPool.get(name, status); if (U_SUCCESS(status)) { // Add the name to cache - PartialLocationKey* cacheKey = (PartialLocationKey *)uprv_malloc(sizeof(PartialLocationKey)); + PartialLocationKey* cacheKey = static_cast<PartialLocationKey*>(uprv_malloc(sizeof(PartialLocationKey))); if (cacheKey != nullptr) { cacheKey->tzID = key.tzID; cacheKey->mzID = key.mzID; @@ -826,7 +822,7 @@ TZGNCore::getPartialLocationName(const UnicodeString& tzCanonicalID, uprv_free(cacheKey); } else { // put the name to the local trie as well - GNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(GNameInfo)); + GNameInfo* nameinfo = static_cast<ZNameInfo*>(uprv_malloc(sizeof(GNameInfo))); if (nameinfo != nullptr) { nameinfo->type = isLong ? UTZGNM_LONG : UTZGNM_SHORT; nameinfo->tzID = key.tzID; @@ -866,7 +862,7 @@ TZGNCore::loadStrings(const UnicodeString& tzCanonicalID) { // if this time zone is not the golden zone of the meta zone, // partial location name (such as "PT (Los Angeles)") might be // available. - fTimeZoneNames->getReferenceZoneID(*mzID, fTargetRegion, goldenID); + fTimeZoneNames->getReferenceZoneID(*mzID, fTargetRegion.data(), goldenID); if (tzCanonicalID != goldenID) { for (int32_t i = 0; genNonLocTypes[i] != UTZNM_UNKNOWN; i++) { fTimeZoneNames->getMetaZoneDisplayName(*mzID, genNonLocTypes[i], mzGenName); @@ -878,9 +874,7 @@ TZGNCore::loadStrings(const UnicodeString& tzCanonicalID) { } } } - if (mzIDs != nullptr) { - delete mzIDs; - } + delete mzIDs; } int32_t @@ -914,7 +908,7 @@ TZGNCore::findBestMatch(const UnicodeString& text, int32_t start, uint32_t types if (!tznamesMatches->getTimeZoneIDAt(i, bestMatchTzID)) { // name for a meta zone if (tznamesMatches->getMetaZoneIDAt(i, mzID)) { - fTimeZoneNames->getReferenceZoneID(mzID, fTargetRegion, bestMatchTzID); + fTimeZoneNames->getReferenceZoneID(mzID, fTargetRegion.data(), bestMatchTzID); } } UTimeZoneNameType nameType = tznamesMatches->getNameTypeAt(i); @@ -1035,9 +1029,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE return gmatchInfo; } - if (results != nullptr) { - delete results; - } + delete results; // All names are not yet loaded into the local trie. // Load all available names into the trie. This could be very heavy. @@ -1054,9 +1046,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE nonConstThis->loadStrings(*tzID); } } - if (tzIDs != nullptr) { - delete tzIDs; - } + delete tzIDs; if (U_SUCCESS(status)) { nonConstThis->fGNamesTrieFullyLoaded = true; @@ -1165,10 +1155,10 @@ U_CDECL_END static void sweepCache() { int32_t pos = UHASH_FIRST; const UHashElement* elem; - double now = (double)uprv_getUTCtime(); + double now = static_cast<double>(uprv_getUTCtime()); while ((elem = uhash_nextElement(gTZGNCoreCache, &pos)) != nullptr) { - TZGNCoreRef *entry = (TZGNCoreRef *)elem->value.pointer; + TZGNCoreRef* entry = static_cast<TZGNCoreRef*>(elem->value.pointer); if (entry->refCount <= 0 && (now - entry->lastAccess) > CACHE_EXPIRATION) { // delete this entry uhash_removeElement(gTZGNCoreCache, elem); @@ -1177,7 +1167,7 @@ static void sweepCache() { } TimeZoneGenericNames::TimeZoneGenericNames() -: fRef(0) { +: fRef(nullptr) { } TimeZoneGenericNames::~TimeZoneGenericNames() { @@ -1195,9 +1185,8 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { if (U_FAILURE(status)) { return nullptr; } - TimeZoneGenericNames* instance = new TimeZoneGenericNames(); - if (instance == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + LocalPointer<TimeZoneGenericNames> instance(new TimeZoneGenericNames(), status); + if (U_FAILURE(status)) { return nullptr; } @@ -1221,7 +1210,7 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { // Check the cache, if not available, create new one and cache const char *key = locale.getName(); - cacheEntry = (TZGNCoreRef *)uhash_get(gTZGNCoreCache, key); + cacheEntry = static_cast<TZGNCoreRef*>(uhash_get(gTZGNCoreCache, key)); if (cacheEntry == nullptr) { TZGNCore *tzgnCore = nullptr; char *newKey = nullptr; @@ -1231,7 +1220,7 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { status = U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(status)) { - newKey = (char *)uprv_malloc(uprv_strlen(key) + 1); + newKey = static_cast<char*>(uprv_malloc(uprv_strlen(key) + 1)); if (newKey == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { @@ -1239,21 +1228,19 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { } } if (U_SUCCESS(status)) { - cacheEntry = (TZGNCoreRef *)uprv_malloc(sizeof(TZGNCoreRef)); + cacheEntry = static_cast<TZGNCoreRef*>(uprv_malloc(sizeof(TZGNCoreRef))); if (cacheEntry == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { cacheEntry->obj = tzgnCore; cacheEntry->refCount = 1; - cacheEntry->lastAccess = (double)uprv_getUTCtime(); + cacheEntry->lastAccess = static_cast<double>(uprv_getUTCtime()); uhash_put(gTZGNCoreCache, newKey, cacheEntry, &status); } } if (U_FAILURE(status)) { - if (tzgnCore != nullptr) { - delete tzgnCore; - } + delete tzgnCore; if (newKey != nullptr) { uprv_free(newKey); } @@ -1265,7 +1252,7 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { } else { // Update the reference count cacheEntry->refCount++; - cacheEntry->lastAccess = (double)uprv_getUTCtime(); + cacheEntry->lastAccess = static_cast<double>(uprv_getUTCtime()); } gAccessCount++; if (gAccessCount >= SWEEP_INTERVAL) { @@ -1276,12 +1263,11 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { } // End of mutex locked block if (cacheEntry == nullptr) { - delete instance; return nullptr; } instance->fRef = cacheEntry; - return instance; + return instance.orphan(); } bool diff --git a/deps/icu-small/source/i18n/tznames.cpp b/deps/icu-small/source/i18n/tznames.cpp index 900499fd400847..87fc40bfdfd645 100644 --- a/deps/icu-small/source/i18n/tznames.cpp +++ b/deps/icu-small/source/i18n/tznames.cpp @@ -72,8 +72,12 @@ static UBool U_CALLCONV timeZoneNames_cleanup() static void U_CALLCONV deleteTimeZoneNamesCacheEntry(void *obj) { icu::TimeZoneNamesCacheEntry *entry = (icu::TimeZoneNamesCacheEntry*)obj; - delete (icu::TimeZoneNamesImpl*) entry->names; - uprv_free(entry); + if (entry->refCount <= 1) { + delete (icu::TimeZoneNamesImpl*) entry->names; + uprv_free(entry); + } else { + entry->refCount--; + } } U_CDECL_END @@ -85,10 +89,10 @@ U_CDECL_END static void sweepCache() { int32_t pos = UHASH_FIRST; const UHashElement* elem; - double now = (double)uprv_getUTCtime(); + double now = static_cast<double>(uprv_getUTCtime()); - while ((elem = uhash_nextElement(gTimeZoneNamesCache, &pos)) != 0) { - TimeZoneNamesCacheEntry *entry = (TimeZoneNamesCacheEntry *)elem->value.pointer; + while ((elem = uhash_nextElement(gTimeZoneNamesCache, &pos)) != nullptr) { + TimeZoneNamesCacheEntry* entry = static_cast<TimeZoneNamesCacheEntry*>(elem->value.pointer); if (entry->refCount <= 0 && (now - entry->lastAccess) > CACHE_EXPIRATION) { // delete this entry uhash_removeElement(gTimeZoneNamesCache, elem); @@ -128,7 +132,7 @@ class TimeZoneNamesDelegate : public TimeZoneNames { }; TimeZoneNamesDelegate::TimeZoneNamesDelegate() -: fTZnamesCacheEntry(0) { +: fTZnamesCacheEntry(nullptr) { } TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& status) { @@ -152,7 +156,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s TimeZoneNamesCacheEntry *cacheEntry = nullptr; const char *key = locale.getName(); - cacheEntry = (TimeZoneNamesCacheEntry *)uhash_get(gTimeZoneNamesCache, key); + cacheEntry = static_cast<TimeZoneNamesCacheEntry*>(uhash_get(gTimeZoneNamesCache, key)); if (cacheEntry == nullptr) { TimeZoneNames *tznames = nullptr; char *newKey = nullptr; @@ -162,7 +166,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s status = U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(status)) { - newKey = (char *)uprv_malloc(uprv_strlen(key) + 1); + newKey = static_cast<char*>(uprv_malloc(uprv_strlen(key) + 1)); if (newKey == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { @@ -170,21 +174,21 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s } } if (U_SUCCESS(status)) { - cacheEntry = (TimeZoneNamesCacheEntry *)uprv_malloc(sizeof(TimeZoneNamesCacheEntry)); + cacheEntry = static_cast<TimeZoneNamesCacheEntry*>(uprv_malloc(sizeof(TimeZoneNamesCacheEntry))); if (cacheEntry == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; } else { cacheEntry->names = tznames; - cacheEntry->refCount = 1; - cacheEntry->lastAccess = (double)uprv_getUTCtime(); + // The initial refCount is 2 because the entry is referenced both + // by this TimeZoneDelegate and by the gTimeZoneNamesCache + cacheEntry->refCount = 2; + cacheEntry->lastAccess = static_cast<double>(uprv_getUTCtime()); uhash_put(gTimeZoneNamesCache, newKey, cacheEntry, &status); } } if (U_FAILURE(status)) { - if (tznames != nullptr) { - delete tznames; - } + delete tznames; if (newKey != nullptr) { uprv_free(newKey); } @@ -196,7 +200,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s } else { // Update the reference count cacheEntry->refCount++; - cacheEntry->lastAccess = (double)uprv_getUTCtime(); + cacheEntry->lastAccess = static_cast<double>(uprv_getUTCtime()); } gAccessCount++; if (gAccessCount >= SWEEP_INTERVAL) { @@ -211,9 +215,13 @@ TimeZoneNamesDelegate::~TimeZoneNamesDelegate() { umtx_lock(&gTimeZoneNamesLock); { if (fTZnamesCacheEntry) { - U_ASSERT(fTZnamesCacheEntry->refCount > 0); - // Just decrement the reference count - fTZnamesCacheEntry->refCount--; + if (fTZnamesCacheEntry->refCount <= 1) { + delete fTZnamesCacheEntry->names; + uprv_free(fTZnamesCacheEntry); + } else { + // Just decrement the reference count + fTZnamesCacheEntry->refCount--; + } } } umtx_unlock(&gTimeZoneNamesLock); @@ -403,9 +411,7 @@ TimeZoneNames::MatchInfoCollection::MatchInfoCollection() } TimeZoneNames::MatchInfoCollection::~MatchInfoCollection() { - if (fMatches != nullptr) { - delete fMatches; - } + delete fMatches; } void @@ -446,7 +452,7 @@ TimeZoneNames::MatchInfoCollection::size() const { UTimeZoneNameType TimeZoneNames::MatchInfoCollection::getNameTypeAt(int32_t idx) const { - const MatchInfo* match = (const MatchInfo*)fMatches->elementAt(idx); + const MatchInfo* match = static_cast<const MatchInfo*>(fMatches->elementAt(idx)); if (match) { return match->nameType; } @@ -455,7 +461,7 @@ TimeZoneNames::MatchInfoCollection::getNameTypeAt(int32_t idx) const { int32_t TimeZoneNames::MatchInfoCollection::getMatchLengthAt(int32_t idx) const { - const MatchInfo* match = (const MatchInfo*)fMatches->elementAt(idx); + const MatchInfo* match = static_cast<const MatchInfo*>(fMatches->elementAt(idx)); if (match) { return match->matchLength; } @@ -465,7 +471,7 @@ TimeZoneNames::MatchInfoCollection::getMatchLengthAt(int32_t idx) const { UBool TimeZoneNames::MatchInfoCollection::getTimeZoneIDAt(int32_t idx, UnicodeString& tzID) const { tzID.remove(); - const MatchInfo* match = (const MatchInfo*)fMatches->elementAt(idx); + const MatchInfo* match = static_cast<const MatchInfo*>(fMatches->elementAt(idx)); if (match && match->isTZID) { tzID.setTo(match->id); return true; @@ -476,7 +482,7 @@ TimeZoneNames::MatchInfoCollection::getTimeZoneIDAt(int32_t idx, UnicodeString& UBool TimeZoneNames::MatchInfoCollection::getMetaZoneIDAt(int32_t idx, UnicodeString& mzID) const { mzID.remove(); - const MatchInfo* match = (const MatchInfo*)fMatches->elementAt(idx); + const MatchInfo* match = static_cast<const MatchInfo*>(fMatches->elementAt(idx)); if (match && !match->isTZID) { mzID.setTo(match->id); return true; diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index 8e52fd90a68245..cbcfb98e849bda 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -16,12 +16,12 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/strenum.h" +#include "unicode/stringpiece.h" #include "unicode/ustring.h" #include "unicode/timezone.h" #include "unicode/utf16.h" #include "tznames_impl.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -33,6 +33,7 @@ #include "ureslocs.h" #include "zonemeta.h" #include "ucln_in.h" +#include "uinvchar.h" #include "uvector.h" #include "olsontz.h" @@ -72,7 +73,9 @@ enum UTimeZoneNameTypeIndex { UTZNM_INDEX_SHORT_DAYLIGHT, UTZNM_INDEX_COUNT }; -static const char16_t* const EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; +static const char16_t* const EMPTY_NAMES[UTZNM_INDEX_COUNT] = { + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr +}; U_CDECL_BEGIN static UBool U_CALLCONV tzdbTimeZoneNames_cleanup() { @@ -110,7 +113,7 @@ struct ZMatchInfo { }; // Helper functions -static void mergeTimeZoneKey(const UnicodeString& mzID, char* result); +static void mergeTimeZoneKey(const UnicodeString& mzID, char* result, size_t capacity, UErrorCode& status); #define DEFAULT_CHARACTERNODE_CAPACITY 1 @@ -129,7 +132,7 @@ void CharacterNode::deleteValues(UObjectDeleter *valueDeleter) { valueDeleter(fValues); } } else { - delete (UVector *)fValues; + delete static_cast<UVector*>(fValues); } } @@ -165,7 +168,7 @@ CharacterNode::addValue(void *value, UObjectDeleter *valueDeleter, UErrorCode &s fHasValuesVector = true; } // Add the new value. - UVector *values = (UVector *)fValues; + UVector* values = static_cast<UVector*>(fValues); if (values->hasDeleter()) { values->adoptElement(value, status); } else { @@ -232,31 +235,25 @@ TextTrieMap::put(const char16_t *key, void *value, UErrorCode &status) { LocalPointer<UVector> lpLazyContents(new UVector(status), status); fLazyContents = lpLazyContents.orphan(); } - if (U_FAILURE(status)) { - if (fValueDeleter) { - fValueDeleter((void*) key); + if (U_SUCCESS(status)) { + U_ASSERT(fLazyContents != nullptr); + char16_t *s = const_cast<char16_t *>(key); + fLazyContents->addElement(s, status); + if (U_SUCCESS(status)) { + fLazyContents->addElement(value, status); + return; } - return; } - U_ASSERT(fLazyContents != nullptr); - - char16_t *s = const_cast<char16_t *>(key); - fLazyContents->addElement(s, status); - if (U_FAILURE(status)) { - if (fValueDeleter) { - fValueDeleter((void*) key); - } - return; + if (fValueDeleter) { + fValueDeleter(value); } - - fLazyContents->addElement(value, status); } void TextTrieMap::putImpl(const UnicodeString &key, void *value, UErrorCode &status) { if (fNodes == nullptr) { fNodesCapacity = 512; - fNodes = (CharacterNode *)uprv_malloc(fNodesCapacity * sizeof(CharacterNode)); + fNodes = static_cast<CharacterNode*>(uprv_malloc(fNodesCapacity * sizeof(CharacterNode))); if (fNodes == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; @@ -295,7 +292,7 @@ TextTrieMap::growNodes() { if (newCapacity > 0xffff) { newCapacity = 0xffff; } - CharacterNode *newNodes = (CharacterNode *)uprv_malloc(newCapacity * sizeof(CharacterNode)); + CharacterNode* newNodes = static_cast<CharacterNode*>(uprv_malloc(newCapacity * sizeof(CharacterNode))); if (newNodes == nullptr) { return false; } @@ -328,7 +325,7 @@ TextTrieMap::addChildNode(CharacterNode *parent, char16_t c, UErrorCode &status) // Ensure capacity. Grow fNodes[] if needed. if (fNodesCount == fNodesCapacity) { - int32_t parentIndex = (int32_t)(parent - fNodes); + int32_t parentIndex = static_cast<int32_t>(parent - fNodes); if (!growNodes()) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -342,9 +339,9 @@ TextTrieMap::addChildNode(CharacterNode *parent, char16_t c, UErrorCode &status) node->fCharacter = c; node->fNextSibling = nodeIndex; if (prevIndex == 0) { - parent->fFirstChild = (uint16_t)fNodesCount; + parent->fFirstChild = static_cast<uint16_t>(fNodesCount); } else { - fNodes[prevIndex].fNextSibling = (uint16_t)fNodesCount; + fNodes[prevIndex].fNextSibling = static_cast<uint16_t>(fNodesCount); } ++fNodesCount; return node; @@ -375,7 +372,7 @@ TextTrieMap::getChildNode(CharacterNode *parent, char16_t c) const { void TextTrieMap::buildTrie(UErrorCode &status) { if (fLazyContents != nullptr) { for (int32_t i=0; i<fLazyContents->size(); i+=2) { - const char16_t *key = (char16_t *)fLazyContents->elementAt(i); + const char16_t* key = static_cast<char16_t*>(fLazyContents->elementAt(i)); void *val = fLazyContents->elementAt(i+1); UnicodeString keyString(true, key, -1); // Aliasing UnicodeString constructor. putImpl(keyString, val, status); @@ -675,7 +672,7 @@ class ZNames : public UMemory { if (locationNameUniStr.length() > 0) { const char16_t* buff = locationNameUniStr.getTerminatedBuffer(); int32_t len = sizeof(char16_t) * (locationNameUniStr.length() + 1); - locationName = (char16_t*) uprv_malloc(len); + locationName = static_cast<char16_t*>(uprv_malloc(len)); if (locationName == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -718,15 +715,15 @@ class ZNames : public UMemory { for (int32_t i = 0; i < UTZNM_INDEX_COUNT; i++) { const char16_t* name = fNames[i]; if (name != nullptr) { - ZNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(ZNameInfo)); - if (nameinfo == nullptr) { + LocalMemory<ZNameInfo> nameinfo(static_cast<ZNameInfo*>(uprv_malloc(sizeof(ZNameInfo)))); + if (nameinfo.isNull()) { status = U_MEMORY_ALLOCATION_ERROR; return; } nameinfo->mzID = mzID; nameinfo->tzID = tzID; - nameinfo->type = getTZNameType((UTimeZoneNameTypeIndex)i); - trie.put(name, nameinfo, status); // trie.put() takes ownership of the key + nameinfo->type = getTZNameType(static_cast<UTimeZoneNameTypeIndex>(i)); + trie.put(name, nameinfo.orphan(), status); // trie.put() takes ownership of the key if (U_FAILURE(status)) { return; } @@ -755,7 +752,7 @@ struct ZNames::ZNamesLoader : public ResourceSink { if (U_FAILURE(errorCode)) { return; } char key[ZID_KEY_MAX + 1]; - mergeTimeZoneKey(mzID, key); + mergeTimeZoneKey(mzID, key, sizeof(key), errorCode); loadNames(zoneStrings, key, errorCode); } @@ -764,12 +761,16 @@ struct ZNames::ZNamesLoader : public ResourceSink { // Replace "/" with ":". UnicodeString uKey(tzID); for (int32_t i = 0; i < uKey.length(); i++) { - if (uKey.charAt(i) == (char16_t)0x2F) { - uKey.setCharAt(i, (char16_t)0x3A); + if (uKey.charAt(i) == static_cast<char16_t>(0x2F)) { + uKey.setCharAt(i, static_cast<char16_t>(0x3A)); } } char key[ZID_KEY_MAX + 1]; + if (uKey.length() > ZID_KEY_MAX) { + errorCode = U_INTERNAL_PROGRAM_ERROR; + return; + } uKey.extract(0, uKey.length(), key, sizeof(key), US_INV); loadNames(zoneStrings, key, errorCode); @@ -898,7 +899,7 @@ MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(LocalPointer<UVector> mzIDs) const UnicodeString* MetaZoneIDsEnumeration::snext(UErrorCode& status) { if (U_SUCCESS(status) && fMetaZoneIDs != nullptr && fPos < fLen) { - unistr.setTo((const char16_t*)fMetaZoneIDs->elementAt(fPos++), -1); + unistr.setTo(static_cast<const char16_t*>(fMetaZoneIDs->elementAt(fPos++)), -1); return &unistr; } return nullptr; @@ -940,9 +941,7 @@ ZNameSearchHandler::ZNameSearchHandler(uint32_t types) } ZNameSearchHandler::~ZNameSearchHandler() { - if (fResults != nullptr) { - delete fResults; - } + delete fResults; } UBool @@ -1069,8 +1068,6 @@ TimeZoneNamesImpl::initialize(const Locale& locale, UErrorCode& status) { loadStrings(UnicodeString(tzID), status); } delete tz; - - return; } /* @@ -1165,7 +1162,7 @@ TimeZoneNamesImpl::_getAvailableMetaZoneIDs(const UnicodeString& tzID, UErrorCod U_ASSERT(mzIDs.isValid()); for (int32_t i = 0; U_SUCCESS(status) && i < mappings->size(); i++) { - OlsonToMetaMappingEntry *map = (OlsonToMetaMappingEntry *)mappings->elementAt(i); + OlsonToMetaMappingEntry* map = static_cast<OlsonToMetaMappingEntry*>(mappings->elementAt(i)); const char16_t *mzID = map->mzid; if (!mzIDs->contains((void *)mzID)) { mzIDs->addElement((void *)mzID, status); @@ -1282,19 +1279,30 @@ TimeZoneNamesImpl::getExemplarLocationName(const UnicodeString& tzID, UnicodeStr // Merge the MZ_PREFIX and mzId -static void mergeTimeZoneKey(const UnicodeString& mzID, char* result) { +static void mergeTimeZoneKey(const UnicodeString& mzID, char* result, size_t capacity, + UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } if (mzID.isEmpty()) { result[0] = '\0'; return; } - char mzIdChar[ZID_KEY_MAX + 1]; - int32_t keyLen; - int32_t prefixLen = static_cast<int32_t>(uprv_strlen(gMZPrefix)); - keyLen = mzID.extract(0, mzID.length(), mzIdChar, ZID_KEY_MAX + 1, US_INV); - uprv_memcpy((void *)result, (void *)gMZPrefix, prefixLen); - uprv_memcpy((void *)(result + prefixLen), (void *)mzIdChar, keyLen); - result[keyLen + prefixLen] = '\0'; + if (MZ_PREFIX_LEN + 1 > capacity) { + result[0] = '\0'; + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + uprv_memcpy((void *)result, (void *)gMZPrefix, MZ_PREFIX_LEN); + if (static_cast<size_t>(MZ_PREFIX_LEN + mzID.length() + 1) > capacity) { + result[0] = '\0'; + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + int32_t keyLen = mzID.extract(0, mzID.length(), result + MZ_PREFIX_LEN, + static_cast<int32_t>(capacity - MZ_PREFIX_LEN), US_INV); + result[keyLen + MZ_PREFIX_LEN] = '\0'; } /* @@ -1303,11 +1311,16 @@ static void mergeTimeZoneKey(const UnicodeString& mzID, char* result) { ZNames* TimeZoneNamesImpl::loadMetaZoneNames(const UnicodeString& mzID, UErrorCode& status) { if (U_FAILURE(status)) { return nullptr; } - U_ASSERT(mzID.length() <= ZID_KEY_MAX - MZ_PREFIX_LEN); + if (mzID.length() > ZID_KEY_MAX - MZ_PREFIX_LEN) { + status = U_INTERNAL_PROGRAM_ERROR; + return nullptr; + } char16_t mzIDKey[ZID_KEY_MAX + 1]; - mzID.extract(mzIDKey, ZID_KEY_MAX + 1, status); - U_ASSERT(U_SUCCESS(status)); // already checked length above + mzID.extract(mzIDKey, ZID_KEY_MAX, status); + if (U_FAILURE(status)) { + return nullptr; + } mzIDKey[mzID.length()] = 0; void* mznames = uhash_get(fMZNamesMap, mzIDKey); @@ -1319,7 +1332,7 @@ TimeZoneNamesImpl::loadMetaZoneNames(const UnicodeString& mzID, UErrorCode& stat } if (mznames != EMPTY) { - return (ZNames*)mznames; + return static_cast<ZNames*>(mznames); } else { return nullptr; } @@ -1331,10 +1344,13 @@ TimeZoneNamesImpl::loadMetaZoneNames(const UnicodeString& mzID, UErrorCode& stat ZNames* TimeZoneNamesImpl::loadTimeZoneNames(const UnicodeString& tzID, UErrorCode& status) { if (U_FAILURE(status)) { return nullptr; } - U_ASSERT(tzID.length() <= ZID_KEY_MAX); + if (tzID.length() > ZID_KEY_MAX) { + status = U_INTERNAL_PROGRAM_ERROR; + return nullptr; + } char16_t tzIDKey[ZID_KEY_MAX + 1]; - int32_t tzIDKeyLen = tzID.extract(tzIDKey, ZID_KEY_MAX + 1, status); + int32_t tzIDKeyLen = tzID.extract(tzIDKey, ZID_KEY_MAX, status); U_ASSERT(U_SUCCESS(status)); // already checked length above tzIDKey[tzIDKeyLen] = 0; @@ -1347,7 +1363,7 @@ TimeZoneNamesImpl::loadTimeZoneNames(const UnicodeString& tzID, UErrorCode& stat } // tznames is never EMPTY - return (ZNames*)tznames; + return static_cast<ZNames*>(tznames); } TimeZoneNames::MatchInfoCollection* @@ -1419,8 +1435,8 @@ void TimeZoneNamesImpl::addAllNamesIntoTrie(UErrorCode& status) { pos = UHASH_FIRST; while ((element = uhash_nextElement(fMZNamesMap, &pos)) != nullptr) { if (element->value.pointer == EMPTY) { continue; } - char16_t* mzID = (char16_t*) element->key.pointer; - ZNames* znames = (ZNames*) element->value.pointer; + char16_t* mzID = static_cast<char16_t*>(element->key.pointer); + ZNames* znames = static_cast<ZNames*>(element->value.pointer); znames->addAsMetaZoneIntoTrie(mzID, fNamesTrie, status); if (U_FAILURE(status)) { return; } } @@ -1428,8 +1444,8 @@ void TimeZoneNamesImpl::addAllNamesIntoTrie(UErrorCode& status) { pos = UHASH_FIRST; while ((element = uhash_nextElement(fTZNamesMap, &pos)) != nullptr) { if (element->value.pointer == EMPTY) { continue; } - char16_t* tzID = (char16_t*) element->key.pointer; - ZNames* znames = (ZNames*) element->value.pointer; + char16_t* tzID = static_cast<char16_t*>(element->key.pointer); + ZNames* znames = static_cast<ZNames*>(element->value.pointer); znames->addAsTimeZoneIntoTrie(tzID, fNamesTrie, status); if (U_FAILURE(status)) { return; } } @@ -1459,7 +1475,7 @@ struct TimeZoneNamesImpl::ZoneStringsLoader : public ResourceSink { void* createKey(const char* key, UErrorCode& status) { int32_t len = sizeof(char) * (static_cast<int32_t>(uprv_strlen(key)) + 1); - char* newKey = (char*) uprv_malloc(len); + char* newKey = static_cast<char*>(uprv_malloc(len)); if (newKey == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -1496,8 +1512,8 @@ struct TimeZoneNamesImpl::ZoneStringsLoader : public ResourceSink { const UHashElement* element; while ((element = uhash_nextElement(keyToLoader, &pos)) != nullptr) { if (element->value.pointer == DUMMY_LOADER) { continue; } - ZNames::ZNamesLoader* loader = (ZNames::ZNamesLoader*) element->value.pointer; - char* key = (char*) element->key.pointer; + ZNames::ZNamesLoader* loader = static_cast<ZNames::ZNamesLoader*>(element->value.pointer); + char* key = static_cast<char*>(element->key.pointer); if (isMetaZone(key)) { UnicodeString mzID = mzIDFromKey(key); @@ -1556,7 +1572,7 @@ struct TimeZoneNamesImpl::ZoneStringsLoader : public ResourceSink { if (loader != DUMMY_LOADER) { // Let the ZNamesLoader consume the names table. - ((ZNames::ZNamesLoader*)loader)->put(key, value, noFallback, status); + static_cast<ZNames::ZNamesLoader*>(loader)->put(key, value, noFallback, status); } } @@ -1612,7 +1628,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, // Load the values into the dest array for (int i = 0; i < numTypes; i++) { UTimeZoneNameType type = types[i]; - const char16_t* name = ((ZNames*)tznames)->getName(type); + const char16_t* name = static_cast<ZNames*>(tznames)->getName(type); if (name == nullptr) { if (mznames == nullptr) { // Load the meta zone name @@ -1635,7 +1651,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, } U_ASSERT(mznames != nullptr); if (mznames != EMPTY) { - name = ((ZNames*)mznames)->getName(type); + name = static_cast<ZNames*>(mznames)->getName(type); } } if (name != nullptr) { @@ -1673,9 +1689,7 @@ void TimeZoneNamesImpl::internalLoadAllDisplayNames(UErrorCode& status) { } } } - if (tzIDs != nullptr) { - delete tzIDs; - } + delete tzIDs; } } @@ -1696,11 +1710,11 @@ TimeZoneNamesImpl::getDefaultExemplarLocationName(const UnicodeString& tzID, Uni return name; } - int32_t sep = tzID.lastIndexOf((char16_t)0x2F /* '/' */); + int32_t sep = tzID.lastIndexOf(static_cast<char16_t>(0x2F) /* '/' */); if (sep > 0 && sep + 1 < tzID.length()) { name.setTo(tzID, sep + 1); - name.findAndReplace(UnicodeString((char16_t)0x5f /* _ */), - UnicodeString((char16_t)0x20 /* space */)); + name.findAndReplace(UnicodeString(static_cast<char16_t>(0x5f) /* _ */), + UnicodeString(static_cast<char16_t>(0x20) /* space */)); } else { name.setToBogus(); } @@ -1770,7 +1784,7 @@ TZDBNames::createInstance(UResourceBundle* rb, const char* key) { return nullptr; } - names = (const char16_t **)uprv_malloc(sizeof(const char16_t*) * TZDBNAMES_KEYS_SIZE); + names = static_cast<const char16_t**>(uprv_malloc(sizeof(const char16_t*) * TZDBNAMES_KEYS_SIZE)); UBool isEmpty = true; if (names != nullptr) { for (int32_t i = 0; i < TZDBNAMES_KEYS_SIZE; i++) { @@ -1797,7 +1811,7 @@ TZDBNames::createInstance(UResourceBundle* rb, const char* key) { if (U_SUCCESS(status)) { numRegions = ures_getSize(regionsRes); if (numRegions > 0) { - regions = (char**)uprv_malloc(sizeof(char*) * numRegions); + regions = static_cast<char**>(uprv_malloc(sizeof(char*) * numRegions)); if (regions != nullptr) { char **pRegion = regions; for (int32_t i = 0; i < numRegions; i++, pRegion++) { @@ -1812,7 +1826,7 @@ TZDBNames::createInstance(UResourceBundle* rb, const char* key) { regionError = true; break; } - *pRegion = (char*)uprv_malloc(sizeof(char) * (len + 1)); + *pRegion = static_cast<char*>(uprv_malloc(sizeof(char) * (len + 1))); if (*pRegion == nullptr) { regionError = true; break; @@ -1889,7 +1903,7 @@ U_CDECL_END class TZDBNameSearchHandler : public TextTrieMapSearchResultHandler { public: - TZDBNameSearchHandler(uint32_t types, const char* region); + TZDBNameSearchHandler(uint32_t types, StringPiece region); virtual ~TZDBNameSearchHandler(); UBool handleMatch(int32_t matchLength, const CharacterNode *node, UErrorCode &status) override; @@ -1899,17 +1913,15 @@ class TZDBNameSearchHandler : public TextTrieMapSearchResultHandler { uint32_t fTypes; int32_t fMaxMatchLen; TimeZoneNames::MatchInfoCollection* fResults; - const char* fRegion; + StringPiece fRegion; }; -TZDBNameSearchHandler::TZDBNameSearchHandler(uint32_t types, const char* region) +TZDBNameSearchHandler::TZDBNameSearchHandler(uint32_t types, StringPiece region) : fTypes(types), fMaxMatchLen(0), fResults(nullptr), fRegion(region) { } TZDBNameSearchHandler::~TZDBNameSearchHandler() { - if (fResults != nullptr) { - delete fResults; - } + delete fResults; } UBool @@ -1951,7 +1963,7 @@ TZDBNameSearchHandler::handleMatch(int32_t matchLength, const CharacterNode *nod // as metazone China (China Standard Time). for (int32_t j = 0; j < ninfo->nRegions; j++) { const char *region = ninfo->parseRegions[j]; - if (uprv_strcmp(fRegion, region) == 0) { + if (fRegion == region) { match = ninfo; matchRegion = true; break; @@ -2064,7 +2076,7 @@ static void U_CALLCONV prepareFind(UErrorCode &status) { const UnicodeString *mzID; StringEnumeration *mzIDs = TimeZoneNamesImpl::_getAvailableMetaZoneIDs(status); if (U_SUCCESS(status)) { - while ((mzID = mzIDs->snext(status)) != 0 && U_SUCCESS(status)) { + while ((mzID = mzIDs->snext(status)) != nullptr && U_SUCCESS(status)) { const TZDBNames *names = TZDBTimeZoneNames::getMetaZoneNames(*mzID, status); if (U_FAILURE(status)) { break; @@ -2130,27 +2142,28 @@ static void U_CALLCONV prepareFind(UErrorCode &status) { U_CDECL_END TZDBTimeZoneNames::TZDBTimeZoneNames(const Locale& locale) -: fLocale(locale) { +: fLocale(locale), fRegion() { UBool useWorld = true; const char* region = fLocale.getCountry(); int32_t regionLen = static_cast<int32_t>(uprv_strlen(region)); if (regionLen == 0) { UErrorCode status = U_ZERO_ERROR; - CharString loc; - { - CharStringByteSink sink(&loc); - ulocimp_addLikelySubtags(fLocale.getName(), sink, &status); - } - regionLen = uloc_getCountry(loc.data(), fRegion, sizeof(fRegion), &status); - if (U_SUCCESS(status) && regionLen < (int32_t)sizeof(fRegion)) { + CharString loc = ulocimp_addLikelySubtags(fLocale.getName(), status); + CharString tmp; + ulocimp_getSubtags(loc.toStringPiece(), nullptr, nullptr, &tmp, nullptr, nullptr, status); + fRegion = tmp.toStringPiece(); + U_ASSERT(fRegion.isEmpty() == tmp.isEmpty()); + if (U_SUCCESS(status)) { useWorld = false; } - } else if (regionLen < (int32_t)sizeof(fRegion)) { - uprv_strcpy(fRegion, region); + } else { + fRegion = {region, static_cast<std::string_view::size_type>(regionLen)}; + U_ASSERT(!fRegion.isEmpty()); useWorld = false; } if (useWorld) { - uprv_strcpy(fRegion, "001"); + fRegion = "001"; + U_ASSERT(!fRegion.isEmpty()); } } @@ -2228,7 +2241,7 @@ TZDBTimeZoneNames::find(const UnicodeString& text, int32_t start, uint32_t types return nullptr; } - TZDBNameSearchHandler handler(types, fRegion); + TZDBNameSearchHandler handler(types, fRegion.data()); gTZDBNamesTrie->search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); if (U_FAILURE(status)) { return nullptr; @@ -2247,9 +2260,15 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu TZDBNames* tzdbNames = nullptr; char16_t mzIDKey[ZID_KEY_MAX + 1]; - mzID.extract(mzIDKey, ZID_KEY_MAX + 1, status); - U_ASSERT(status == U_ZERO_ERROR); // already checked length above + mzID.extract(mzIDKey, ZID_KEY_MAX, status); + if (U_FAILURE(status)) { + return nullptr; + } mzIDKey[mzID.length()] = 0; + if (!uprv_isInvariantUString(mzIDKey, mzID.length())) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } static UMutex gTZDBNamesMapLock; umtx_lock(&gTZDBNamesMapLock); @@ -2258,9 +2277,9 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu if (cacheVal == nullptr) { UResourceBundle *zoneStringsRes = ures_openDirect(U_ICUDATA_ZONE, "tzdbNames", &status); zoneStringsRes = ures_getByKey(zoneStringsRes, gZoneStrings, zoneStringsRes, &status); + char key[ZID_KEY_MAX + 1]; + mergeTimeZoneKey(mzID, key, sizeof(key), status); if (U_SUCCESS(status)) { - char key[ZID_KEY_MAX + 1]; - mergeTimeZoneKey(mzID, key); tzdbNames = TZDBNames::createInstance(zoneStringsRes, key); if (tzdbNames == nullptr) { @@ -2292,7 +2311,7 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu } ures_close(zoneStringsRes); } else if (cacheVal != EMPTY) { - tzdbNames = (TZDBNames *)cacheVal; + tzdbNames = static_cast<TZDBNames*>(cacheVal); } } umtx_unlock(&gTZDBNamesMapLock); diff --git a/deps/icu-small/source/i18n/tznames_impl.h b/deps/icu-small/source/i18n/tznames_impl.h index 8ca2f84e73dba0..290613d989a365 100644 --- a/deps/icu-small/source/i18n/tznames_impl.h +++ b/deps/icu-small/source/i18n/tznames_impl.h @@ -26,6 +26,7 @@ #include "uhash.h" #include "uvector.h" #include "umutex.h" +#include "fixedstring.h" // Some zone display names involving supplementary characters can be over 50 chars, 100 UTF-16 code units, 200 UTF-8 bytes #define ZONE_NAME_U16_MAX 128 @@ -98,21 +99,21 @@ struct CharacterNode { }; inline UBool CharacterNode::hasValues() const { - return (UBool)(fValues != nullptr); + return fValues != nullptr; } inline int32_t CharacterNode::countValues() const { return fValues == nullptr ? 0 : !fHasValuesVector ? 1 : - ((const UVector *)fValues)->size(); + static_cast<const UVector*>(fValues)->size(); } inline const void *CharacterNode::getValue(int32_t index) const { if (!fHasValuesVector) { return fValues; // Assume index == 0. } else { - return ((const UVector *)fValues)->elementAt(index); + return static_cast<const UVector*>(fValues)->elementAt(index); } } @@ -255,7 +256,7 @@ class TZDBTimeZoneNames : public TimeZoneNames { private: Locale fLocale; - char fRegion[ULOC_COUNTRY_CAPACITY]; + FixedString fRegion; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/tzrule.cpp b/deps/icu-small/source/i18n/tzrule.cpp index a3522f1d8b2d57..8d6a37a844cbd8 100644 --- a/deps/icu-small/source/i18n/tzrule.cpp +++ b/deps/icu-small/source/i18n/tzrule.cpp @@ -355,8 +355,9 @@ AnnualTimeZoneRule::getNextStart(UDate base, int32_t prevDSTSavings, UBool inclusive, UDate& result) const { - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(base, year, month, dom, dow, doy, mid); + UErrorCode status = U_ZERO_ERROR; + int32_t year = Grego::timeToYear(base, status); + U_ASSERT(U_SUCCESS(status)); if (year < fStartYear) { return getFirstStart(prevRawOffset, prevDSTSavings, result); } @@ -379,8 +380,9 @@ AnnualTimeZoneRule::getPreviousStart(UDate base, int32_t prevDSTSavings, UBool inclusive, UDate& result) const { - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(base, year, month, dom, dow, doy, mid); + UErrorCode status = U_ZERO_ERROR; + int32_t year = Grego::timeToYear(base, status); + U_ASSERT(U_SUCCESS(status)); if (year > fEndYear) { return getFinalStart(prevRawOffset, prevDSTSavings, result); } @@ -587,7 +589,7 @@ TimeArrayTimeZoneRule::initStartTimes(const UDate source[], int32_t size, UError } // Allocate new one if needed if (size > TIMEARRAY_STACK_BUFFER_SIZE) { - fStartTimes = (UDate*)uprv_malloc(sizeof(UDate)*size); + fStartTimes = static_cast<UDate*>(uprv_malloc(sizeof(UDate) * size)); if (fStartTimes == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; fNumStartTimes = 0; @@ -599,7 +601,7 @@ TimeArrayTimeZoneRule::initStartTimes(const UDate source[], int32_t size, UError uprv_memcpy(fStartTimes, source, sizeof(UDate)*size); fNumStartTimes = size; // Sort dates - uprv_sortArray(fStartTimes, fNumStartTimes, (int32_t)sizeof(UDate), compareDates, nullptr, true, &status); + uprv_sortArray(fStartTimes, fNumStartTimes, static_cast<int32_t>(sizeof(UDate)), compareDates, nullptr, true, &status); if (U_FAILURE(status)) { if (fStartTimes != nullptr && fStartTimes != fLocalStartTimes) { uprv_free(fStartTimes); diff --git a/deps/icu-small/source/i18n/tztrans.cpp b/deps/icu-small/source/i18n/tztrans.cpp index dbce3422020d2e..45e1678aa3737a 100644 --- a/deps/icu-small/source/i18n/tztrans.cpp +++ b/deps/icu-small/source/i18n/tztrans.cpp @@ -40,12 +40,8 @@ TimeZoneTransition::TimeZoneTransition(const TimeZoneTransition& source) } TimeZoneTransition::~TimeZoneTransition() { - if (fFrom != nullptr) { - delete fFrom; - } - if (fTo != nullptr) { - delete fTo; - } + delete fFrom; + delete fTo; } TimeZoneTransition* @@ -96,33 +92,25 @@ TimeZoneTransition::setTime(UDate time) { void TimeZoneTransition::setFrom(const TimeZoneRule& from) { - if (fFrom != nullptr) { - delete fFrom; - } + delete fFrom; fFrom = from.clone(); } void TimeZoneTransition::adoptFrom(TimeZoneRule* from) { - if (fFrom != nullptr) { - delete fFrom; - } + delete fFrom; fFrom = from; } void TimeZoneTransition::setTo(const TimeZoneRule& to) { - if (fTo != nullptr) { - delete fTo; - } + delete fTo; fTo = to.clone(); } void TimeZoneTransition::adoptTo(TimeZoneRule* to) { - if (fTo != nullptr) { - delete fTo; - } + delete fTo; fTo = to; } diff --git a/deps/icu-small/source/i18n/ucal.cpp b/deps/icu-small/source/i18n/ucal.cpp index dfc8e4f2511cb9..b8905fe9a3d19f 100644 --- a/deps/icu-small/source/i18n/ucal.cpp +++ b/deps/icu-small/source/i18n/ucal.cpp @@ -22,6 +22,7 @@ #include "unicode/ustring.h" #include "unicode/strenum.h" #include "unicode/localpointer.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "iso8601cal.h" @@ -41,7 +42,7 @@ _createTimeZone(const char16_t* zoneID, int32_t len, UErrorCode* ec) { // failure we will see is a memory allocation failure. int32_t l = (len<0 ? u_strlen(zoneID) : len); UnicodeString zoneStrID; - zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */ + zoneStrID.setTo(static_cast<UBool>(len < 0), zoneID, l); /* temporary read-only alias */ zone = TimeZone::createTimeZone(zoneStrID); if (zone == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; @@ -167,21 +168,15 @@ ucal_open( const char16_t* zoneID, } if ( caltype == UCAL_GREGORIAN ) { - char localeBuf[ULOC_LOCALE_IDENTIFIER_CAPACITY]; if ( locale == nullptr ) { locale = uloc_getDefault(); } - int32_t localeLength = static_cast<int32_t>(uprv_strlen(locale)); - if (localeLength >= ULOC_LOCALE_IDENTIFIER_CAPACITY) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; - } - uprv_strcpy(localeBuf, locale); - uloc_setKeywordValue("calendar", "gregorian", localeBuf, ULOC_LOCALE_IDENTIFIER_CAPACITY, status); + CharString localeBuf(locale, *status); + ulocimp_setKeywordValue("calendar", "gregorian", localeBuf, *status); if (U_FAILURE(*status)) { return nullptr; } - return (UCalendar*)Calendar::createInstance(zone.orphan(), Locale(localeBuf), *status); + return (UCalendar*)Calendar::createInstance(zone.orphan(), Locale(localeBuf.data()), *status); } return (UCalendar*)Calendar::createInstance(zone.orphan(), Locale(locale), *status); } @@ -198,13 +193,13 @@ U_CAPI UCalendar* U_EXPORT2 ucal_clone(const UCalendar* cal, UErrorCode* status) { - if(U_FAILURE(*status)) return 0; - + if (U_FAILURE(*status)) return nullptr; + Calendar* res = ((Calendar*)cal)->clone(); - if(res == 0) { + if (res == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } return (UCalendar*) res; @@ -549,7 +544,7 @@ ucal_getLimit( const UCalendar* cal, UCalendarDateFields field, UCalendarLimitType type, UErrorCode *status) UPRV_NO_SANITIZE_UNDEFINED { - if(status==0 || U_FAILURE(*status)) { + if (status == nullptr || U_FAILURE(*status)) { return -1; } if (field < 0 || UCAL_FIELD_COUNT <= field) { @@ -605,13 +600,13 @@ ucal_getTZDataVersion(UErrorCode* status) U_CAPI int32_t U_EXPORT2 ucal_getCanonicalTimeZoneID(const char16_t* id, int32_t len, char16_t* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status) { - if(status == 0 || U_FAILURE(*status)) { + if (status == nullptr || U_FAILURE(*status)) { return 0; } if (isSystemID) { *isSystemID = false; } - if (id == 0 || len == 0 || result == 0 || resultCapacity <= 0) { + if (id == nullptr || len == 0 || result == nullptr || resultCapacity <= 0) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -721,13 +716,12 @@ static const char * const CAL_TYPES[] = { U_CAPI UEnumeration* U_EXPORT2 ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool commonlyUsed, UErrorCode *status) { // Resolve region - char prefRegion[ULOC_COUNTRY_CAPACITY]; - (void)ulocimp_getRegionForSupplementalData(locale, true, prefRegion, sizeof(prefRegion), status); - + CharString prefRegion = ulocimp_getRegionForSupplementalData(locale, true, *status); + // Read preferred calendar values from supplementalData calendarPreference UResourceBundle *rb = ures_openDirect(nullptr, "supplementalData", status); ures_getByKey(rb, "calendarPreferenceData", rb, status); - UResourceBundle *order = ures_getByKey(rb, prefRegion, nullptr, status); + UResourceBundle *order = ures_getByKey(rb, prefRegion.data(), nullptr, status); if (*status == U_MISSING_RESOURCE_ERROR && rb != nullptr) { *status = U_ZERO_ERROR; order = ures_getByKey(rb, "001", nullptr, status); diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 765cdd559fb4e2..722a1aaf56939d 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -39,6 +39,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_HEBREW_CALENDAR, UCLN_I18N_ASTRO_CALENDAR, UCLN_I18N_DANGI_CALENDAR, + UCLN_I18N_PERSIAN_CALENDAR, UCLN_I18N_CALENDAR, UCLN_I18N_TIMEZONEFORMAT, UCLN_I18N_TZDBTIMEZONENAMES, @@ -62,6 +63,8 @@ typedef enum ECleanupI18NType { UCLN_I18N_REGION, UCLN_I18N_LIST_FORMATTER, UCLN_I18N_NUMSYS, + UCLN_I18N_MF2_UNISETS, + UCLN_I18N_MF2_DATE_PARSERS, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index 4ec6582f8906ad..480575c6e50b18 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -59,10 +59,10 @@ U_NAMESPACE_BEGIN namespace { -static const char16_t *rootRules = nullptr; -static int32_t rootRulesLength = 0; -static UResourceBundle *rootBundle = nullptr; -static UInitOnce gInitOnceUcolRes {}; +const char16_t* rootRules = nullptr; +int32_t rootRulesLength = 0; +UResourceBundle* rootBundle = nullptr; +UInitOnce gInitOnceUcolRes{}; } // namespace @@ -654,7 +654,7 @@ struct KeywordsSink : public ResourceSink { } } } else if (type == URES_TABLE && uprv_strncmp(key, "private-", 8) != 0) { - if (!ulist_containsString(values, key, (int32_t)uprv_strlen(key))) { + if (!ulist_containsString(values, key, static_cast<int32_t>(uprv_strlen(key)))) { ulist_addItemEndList(values, key, false, &errorCode); } } diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index 2e5bce2cbaafea..f8fa02fad71997 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -21,7 +21,6 @@ #include "utracimp.h" #include "ucol_imp.h" #include "ulocimp.h" -#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "uresimp.h" @@ -239,7 +238,7 @@ readHexCodeUnit(const char **string, UErrorCode *status) #endif return 0; } - result = (result << 4) | (char16_t)value; + result = (result << 4) | static_cast<char16_t>(value); noDigits++; (*string)++; } @@ -320,7 +319,7 @@ const char* ucol_sit_readOption(const char *start, CollatorSpec *spec, fprintf(stderr, "***Set %d to %s...\n", i, start); #endif // assume 'start' does not go away through all this - spec->entries[i].copyFrom(CharString(start, (int32_t)(end - start), *status), *status); + spec->entries[i].copyFrom(CharString(start, static_cast<int32_t>(end - start), *status), *status); return end; } } @@ -344,7 +343,7 @@ ucol_sit_readSpecs(CollatorSpec *s, const char *string, } } if(U_FAILURE(*status)) { - parseError->offset = (int32_t)(string - definition); + parseError->offset = static_cast<int32_t>(string - definition); } return string; } @@ -451,22 +450,14 @@ ucol_prepareShortStringOpen( const char *definition, ucol_sit_readSpecs(&s, definition, parseError, status); ucol_sit_calculateWholeLocale(&s, *status); - CharString buffer; - { - CharStringByteSink sink(&buffer); - ulocimp_canonicalize(s.locale.data(), sink, status); - } + CharString buffer = ulocimp_canonicalize(s.locale.toStringPiece(), *status); UResourceBundle *b = ures_open(U_ICUDATA_COLL, buffer.data(), status); /* we try to find stuff from keyword */ UResourceBundle *collations = ures_getByKey(b, "collations", nullptr, status); UResourceBundle *collElem = nullptr; - CharString keyBuffer; - { - // if there is a keyword, we pick it up and try to get elements - CharStringByteSink sink(&keyBuffer); - ulocimp_getKeywordValue(buffer.data(), "collation", sink, status); - } + // if there is a keyword, we pick it up and try to get elements + CharString keyBuffer = ulocimp_getKeywordValue(buffer.data(), "collation", *status); if(keyBuffer.isEmpty()) { // no keyword // we try to find the default setting, which will give us the keyword value @@ -497,7 +488,7 @@ ucol_openFromShortString( const char *definition, UTRACE_ENTRY_OC(UTRACE_UCOL_OPEN_FROM_SHORT_STRING); UTRACE_DATA1(UTRACE_INFO, "short string = \"%s\"", definition); - if(U_FAILURE(*status)) return 0; + if (U_FAILURE(*status)) return nullptr; UParseError internalParseError; @@ -523,11 +514,7 @@ ucol_openFromShortString( const char *definition, #ifdef UCOL_TRACE_SIT fprintf(stderr, "DEF %s, DATA %s, ERR %s\n", definition, s.locale.data(), u_errorName(*status)); #endif - CharString buffer; - { - CharStringByteSink sink(&buffer); - ulocimp_canonicalize(s.locale.data(), sink, status); - } + CharString buffer = ulocimp_canonicalize(s.locale.toStringPiece(), *status); UCollator *result = ucol_open(buffer.data(), status); int32_t i = 0; diff --git a/deps/icu-small/source/i18n/ucoleitr.cpp b/deps/icu-small/source/i18n/ucoleitr.cpp index 36b83c4c1043ad..429fd847c1ab5f 100644 --- a/deps/icu-small/source/i18n/ucoleitr.cpp +++ b/deps/icu-small/source/i18n/ucoleitr.cpp @@ -289,7 +289,7 @@ ucol_openElements(const UCollator *coll, return nullptr; } - UnicodeString s((UBool)(textLength < 0), text, textLength); + UnicodeString s(textLength < 0, text, textLength); CollationElementIterator *cei = rbc->createCollationElementIterator(s); if (cei == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -350,7 +350,7 @@ UCollationPCE::nextProcessed( break; } - result = processCE((uint32_t)ce); + result = processCE(static_cast<uint32_t>(ce)); } while (result == UCOL_IGNORABLE); if (ixLow != nullptr) { @@ -412,7 +412,7 @@ UCollationPCE::previousProcessed( goto finish; } - rceb.put((uint32_t)ce, low, high, *status); + rceb.put(static_cast<uint32_t>(ce), low, high, *status); } while (U_SUCCESS(*status) && ((ce & UCOL_PRIMARYORDERMASK) == 0 || isContinuation(ce))); // process the raw CEs @@ -488,7 +488,7 @@ ucol_setText( UCollationElements *elems, *status = U_ILLEGAL_ARGUMENT_ERROR; return; } - UnicodeString s((UBool)(textLength < 0), text, textLength); + UnicodeString s(textLength < 0, text, textLength); return CollationElementIterator::fromUCollationElements(elems)->setText(s, *status); } diff --git a/deps/icu-small/source/i18n/ucsdet.cpp b/deps/icu-small/source/i18n/ucsdet.cpp index c8b8712fbaa601..c3f6737feeed07 100644 --- a/deps/icu-small/source/i18n/ucsdet.cpp +++ b/deps/icu-small/source/i18n/ucsdet.cpp @@ -32,7 +32,7 @@ U_CAPI UCharsetDetector * U_EXPORT2 ucsdet_open(UErrorCode *status) { if(U_FAILURE(*status)) { - return 0; + return nullptr; } CharsetDetector* csd = new CharsetDetector(*status); diff --git a/deps/icu-small/source/i18n/udat.cpp b/deps/icu-small/source/i18n/udat.cpp index e249be3aee9ce8..6f9cc95299e16b 100644 --- a/deps/icu-small/source/i18n/udat.cpp +++ b/deps/icu-small/source/i18n/udat.cpp @@ -142,7 +142,7 @@ udat_open(UDateFormatStyle timeStyle, { DateFormat *fmt; if(U_FAILURE(*status)) { - return 0; + return nullptr; } if(gOpener!=nullptr) { // if it's registered fmt = (DateFormat*) (*gOpener)(timeStyle,dateStyle,locale,tzID,tzIDLength,pattern,patternLength,status); @@ -151,7 +151,7 @@ udat_open(UDateFormatStyle timeStyle, } // else fall through. } if(timeStyle != UDAT_PATTERN) { - if(locale == 0) { + if (locale == nullptr) { fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle, (DateFormat::EStyle)timeStyle); } @@ -162,9 +162,9 @@ udat_open(UDateFormatStyle timeStyle, } } else { - UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength); + UnicodeString pat(patternLength == -1, pattern, patternLength); - if(locale == 0) { + if (locale == nullptr) { fmt = new SimpleDateFormat(pat, *status); } else { @@ -181,12 +181,12 @@ udat_open(UDateFormatStyle timeStyle, return nullptr; } - if(tzID != 0) { - TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength)); - if(zone == 0) { + if (tzID != nullptr) { + TimeZone* zone = TimeZone::createTimeZone(UnicodeString(tzIDLength == -1, tzID, tzIDLength)); + if (zone == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; delete fmt; - return 0; + return nullptr; } fmt->adoptTimeZone(zone); } @@ -206,13 +206,13 @@ U_CAPI UDateFormat* U_EXPORT2 udat_clone(const UDateFormat *fmt, UErrorCode *status) { - if(U_FAILURE(*status)) return 0; + if (U_FAILURE(*status)) return nullptr; Format *res = ((DateFormat*)fmt)->clone(); - if(res == 0) { + if (res == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } return (UDateFormat*) res; @@ -243,12 +243,12 @@ udat_format( const UDateFormat* format, FieldPosition fp; - if(position != 0) + if (position != nullptr) fp.setField(position->field); ((DateFormat*)format)->format(dateToFormat, res, fp); - if(position != 0) { + if (position != nullptr) { position->beginIndex = fp.getBeginIndex(); position->endIndex = fp.getEndIndex(); } @@ -281,12 +281,12 @@ udat_formatCalendar(const UDateFormat* format, FieldPosition fp; - if(position != 0) + if (position != nullptr) fp.setField(position->field); ((DateFormat*)format)->format(*(Calendar*)calendar, res, fp); - if(position != 0) { + if (position != nullptr) { position->beginIndex = fp.getBeginIndex(); position->endIndex = fp.getEndIndex(); } @@ -359,7 +359,7 @@ udat_parse( const UDateFormat* format, { if(U_FAILURE(*status)) return (UDate)0; - const UnicodeString src((UBool)(textLength == -1), text, textLength); + const UnicodeString src(textLength == -1, text, textLength); ParsePosition pp; int32_t stackParsePos = 0; UDate res; @@ -392,7 +392,7 @@ udat_parseCalendar(const UDateFormat* format, { if(U_FAILURE(*status)) return; - const UnicodeString src((UBool)(textLength == -1), text, textLength); + const UnicodeString src(textLength == -1, text, textLength); ParsePosition pp; int32_t stackParsePos = 0; @@ -581,7 +581,7 @@ udat_applyPattern( UDateFormat *format, const char16_t *pattern, int32_t patternLength) { - const UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength); + const UnicodeString pat(patternLength == -1, pattern, patternLength); UErrorCode status = U_ZERO_ERROR; verifyIsSimpleDateFormat(format, &status); @@ -645,6 +645,14 @@ udat_getSymbols(const UDateFormat *fmt, res = syms->getAmPmStrings(count); break; + case UDAT_AM_PMS_NARROW: + res = syms->getAmPmStrings(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW); + break; + + case UDAT_AM_PMS_WIDE: + res = syms->getAmPmStrings(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); + break; + case UDAT_LOCALIZED_CHARS: { UnicodeString res1; @@ -795,6 +803,14 @@ udat_countSymbols( const UDateFormat *fmt, syms->getAmPmStrings(count); break; + case UDAT_AM_PMS_NARROW: + syms->getAmPmStrings(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW); + break; + + case UDAT_AM_PMS_WIDE: + syms->getAmPmStrings(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE); + break; + case UDAT_LOCALIZED_CHARS: count = 1; break; @@ -1114,6 +1130,20 @@ class DateFormatSymbolsSingleSetter /* not : public UObject because all methods setSymbol(syms->fAmPms, syms->fAmPmsCount, index, value, valueLength, errorCode); } + static void + setAmPmNarrow(DateFormatSymbols *syms, int32_t index, + const char16_t *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fNarrowAmPms, syms->fNarrowAmPmsCount, index, value, valueLength, errorCode); + } + + static void + setAmPmWide(DateFormatSymbols *syms, int32_t index, + const char16_t *value, int32_t valueLength, UErrorCode &errorCode) + { + setSymbol(syms->fWideAmPms, syms->fWideAmPmsCount, index, value, valueLength, errorCode); + } + static void setLocalPatternChars(DateFormatSymbols *syms, const char16_t *value, int32_t valueLength, UErrorCode &errorCode) @@ -1238,6 +1268,14 @@ udat_setSymbols( UDateFormat *format, DateFormatSymbolsSingleSetter::setAmPm(syms, index, value, valueLength, *status); break; + case UDAT_AM_PMS_NARROW: + DateFormatSymbolsSingleSetter::setAmPmNarrow(syms, index, value, valueLength, *status); + break; + + case UDAT_AM_PMS_WIDE: + DateFormatSymbolsSingleSetter::setAmPmWide(syms, index, value, valueLength, *status); + break; + case UDAT_LOCALIZED_CHARS: DateFormatSymbolsSingleSetter::setLocalPatternChars(syms, value, valueLength, *status); break; @@ -1270,7 +1308,6 @@ udat_setContext(UDateFormat* fmt, UDisplayContext value, UErrorCode* status) return; } ((DateFormat*)fmt)->setContext(value, *status); - return; } U_CAPI UDisplayContext U_EXPORT2 @@ -1356,8 +1393,8 @@ udat_applyPatternRelative(UDateFormat *format, { verifyIsRelativeDateFormat(format, status); if(U_FAILURE(*status)) return; - const UnicodeString datePat((UBool)(datePatternLength == -1), datePattern, datePatternLength); - const UnicodeString timePat((UBool)(timePatternLength == -1), timePattern, timePatternLength); + const UnicodeString datePat(datePatternLength == -1, datePattern, datePatternLength); + const UnicodeString timePat(timePatternLength == -1, timePattern, timePatternLength); ((RelativeDateFormat*)format)->applyPatterns(datePat, timePat, *status); } diff --git a/deps/icu-small/source/i18n/udateintervalformat.cpp b/deps/icu-small/source/i18n/udateintervalformat.cpp index a332eacc533c2a..b67ba05e1fe097 100644 --- a/deps/icu-small/source/i18n/udateintervalformat.cpp +++ b/deps/icu-small/source/i18n/udateintervalformat.cpp @@ -51,14 +51,14 @@ udtitvfmt_open(const char* locale, *status = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - UnicodeString skel((UBool)(skeletonLength == -1), skeleton, skeletonLength); + UnicodeString skel(skeletonLength == -1, skeleton, skeletonLength); LocalPointer<DateIntervalFormat> formatter( DateIntervalFormat::createInstance(skel, Locale(locale), *status)); if (U_FAILURE(*status)) { return nullptr; } - if(tzID != 0) { - TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength)); + if (tzID != nullptr) { + TimeZone* zone = TimeZone::createTimeZone(UnicodeString(tzIDLength == -1, tzID, tzIDLength)); if(zone == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -99,7 +99,7 @@ udtitvfmt_format(const UDateIntervalFormat* formatter, res.setTo(result, 0, resultCapacity); } FieldPosition fp; - if (position != 0) { + if (position != nullptr) { fp.setField(position->field); } @@ -108,7 +108,7 @@ udtitvfmt_format(const UDateIntervalFormat* formatter, if (U_FAILURE(*status)) { return -1; } - if (position != 0) { + if (position != nullptr) { position->beginIndex = fp.getBeginIndex(); position->endIndex = fp.getEndIndex(); } diff --git a/deps/icu-small/source/i18n/udatpg.cpp b/deps/icu-small/source/i18n/udatpg.cpp index 07aee36882dd5a..666dfba0aeda62 100644 --- a/deps/icu-small/source/i18n/udatpg.cpp +++ b/deps/icu-small/source/i18n/udatpg.cpp @@ -78,7 +78,7 @@ udatpg_getBestPatternWithOptions(UDateTimePatternGenerator *dtpg, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString skeletonString((UBool)(length<0), skeleton, length); + UnicodeString skeletonString(length < 0, skeleton, length); UnicodeString result=((DateTimePatternGenerator *)dtpg)->getBestPattern(skeletonString, options, *pErrorCode); return result.extract(bestPattern, capacity, *pErrorCode); } @@ -95,7 +95,7 @@ udatpg_getSkeleton(UDateTimePatternGenerator * /* dtpg */, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString patternString((UBool)(length<0), pattern, length); + UnicodeString patternString(length < 0, pattern, length); UnicodeString result=DateTimePatternGenerator::staticGetSkeleton( patternString, *pErrorCode); return result.extract(skeleton, capacity, *pErrorCode); @@ -113,7 +113,7 @@ udatpg_getBaseSkeleton(UDateTimePatternGenerator * /* dtpg */, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString patternString((UBool)(length<0), pattern, length); + UnicodeString patternString(length < 0, pattern, length); UnicodeString result=DateTimePatternGenerator::staticGetBaseSkeleton( patternString, *pErrorCode); return result.extract(skeleton, capacity, *pErrorCode); @@ -132,7 +132,7 @@ udatpg_addPattern(UDateTimePatternGenerator *dtpg, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return UDATPG_NO_CONFLICT; } - UnicodeString patternString((UBool)(patternLength<0), pattern, patternLength); + UnicodeString patternString(patternLength < 0, pattern, patternLength); UnicodeString conflictingPatternString; UDateTimePatternConflict result=((DateTimePatternGenerator *)dtpg)-> addPattern(patternString, override, conflictingPatternString, *pErrorCode); @@ -147,7 +147,7 @@ U_CAPI void U_EXPORT2 udatpg_setAppendItemFormat(UDateTimePatternGenerator *dtpg, UDateTimePatternField field, const char16_t *value, int32_t length) { - UnicodeString valueString((UBool)(length<0), value, length); + UnicodeString valueString(length < 0, value, length); ((DateTimePatternGenerator *)dtpg)->setAppendItemFormat(field, valueString); } @@ -166,7 +166,7 @@ U_CAPI void U_EXPORT2 udatpg_setAppendItemName(UDateTimePatternGenerator *dtpg, UDateTimePatternField field, const char16_t *value, int32_t length) { - UnicodeString valueString((UBool)(length<0), value, length); + UnicodeString valueString(length < 0, value, length); ((DateTimePatternGenerator *)dtpg)->setAppendItemName(field, valueString); } @@ -203,7 +203,7 @@ udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg, U_CAPI void U_EXPORT2 udatpg_setDateTimeFormat(const UDateTimePatternGenerator *dtpg, const char16_t *dtFormat, int32_t length) { - UnicodeString dtFormatString((UBool)(length<0), dtFormat, length); + UnicodeString dtFormatString(length < 0, dtFormat, length); ((DateTimePatternGenerator *)dtpg)->setDateTimeFormat(dtFormatString); } @@ -226,7 +226,7 @@ udatpg_setDateTimeFormatForStyle(UDateTimePatternGenerator *udtpg, return; } DateTimePatternGenerator *dtpg = reinterpret_cast<DateTimePatternGenerator *>(udtpg); - UnicodeString dtFormatString((UBool)(length<0), dateTimeFormat, length); + UnicodeString dtFormatString(length < 0, dateTimeFormat, length); dtpg->setDateTimeFormat(style, dtFormatString, *pErrorCode); } @@ -255,7 +255,7 @@ udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator *udtpg, U_CAPI void U_EXPORT2 udatpg_setDecimal(UDateTimePatternGenerator *dtpg, const char16_t *decimal, int32_t length) { - UnicodeString decimalString((UBool)(length<0), decimal, length); + UnicodeString decimalString(length < 0, decimal, length); ((DateTimePatternGenerator *)dtpg)->setDecimal(decimalString); } @@ -294,8 +294,8 @@ udatpg_replaceFieldTypesWithOptions(UDateTimePatternGenerator *dtpg, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString patternString((UBool)(patternLength<0), pattern, patternLength); - UnicodeString skeletonString((UBool)(skeletonLength<0), skeleton, skeletonLength); + UnicodeString patternString(patternLength < 0, pattern, patternLength); + UnicodeString skeletonString(skeletonLength < 0, skeleton, skeletonLength); UnicodeString result=((DateTimePatternGenerator *)dtpg)->replaceFieldTypes(patternString, skeletonString, options, *pErrorCode); return result.extract(dest, destCapacity, *pErrorCode); } @@ -318,7 +318,7 @@ U_CAPI const char16_t * U_EXPORT2 udatpg_getPatternForSkeleton(const UDateTimePatternGenerator *dtpg, const char16_t *skeleton, int32_t skeletonLength, int32_t *pLength) { - UnicodeString skeletonString((UBool)(skeletonLength<0), skeleton, skeletonLength); + UnicodeString skeletonString(skeletonLength < 0, skeleton, skeletonLength); const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getPatternForSkeleton(skeletonString); if(pLength!=nullptr) { *pLength=result.length(); diff --git a/deps/icu-small/source/i18n/uitercollationiterator.cpp b/deps/icu-small/source/i18n/uitercollationiterator.cpp index 6f840f3fe5e04b..e0d91514852c3e 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.cpp +++ b/deps/icu-small/source/i18n/uitercollationiterator.cpp @@ -54,7 +54,7 @@ char16_t UIterCollationIterator::handleGetTrailSurrogate() { UChar32 trail = iter.next(&iter); if(!U16_IS_TRAIL(trail) && trail >= 0) { iter.previous(&iter); } - return (char16_t)trail; + return static_cast<char16_t>(trail); } UChar32 @@ -149,7 +149,7 @@ FCDUIterCollationIterator::handleGetTrailSurrogate() { } else if(trail >= 0) { iter.previous(&iter); } - return (char16_t)trail; + return static_cast<char16_t>(trail); } else { U_ASSERT(pos < normalized.length()); char16_t trail; @@ -315,7 +315,7 @@ FCDUIterCollationIterator::nextSegment(UErrorCode &errorCode) { UChar32 c = uiter_next32(&iter); if(c < 0) { break; } uint16_t fcd16 = nfcImpl.getFCD16(c); - uint8_t leadCC = (uint8_t)(fcd16 >> 8); + uint8_t leadCC = static_cast<uint8_t>(fcd16 >> 8); if(leadCC == 0 && !s.isEmpty()) { // FCD boundary before this character. uiter_previous32(&iter); @@ -340,7 +340,7 @@ FCDUIterCollationIterator::nextSegment(UErrorCode &errorCode) { pos = 0; return true; } - prevCC = (uint8_t)fcd16; + prevCC = static_cast<uint8_t>(fcd16); if(prevCC == 0) { // FCD boundary after the last character. break; @@ -396,7 +396,7 @@ FCDUIterCollationIterator::previousSegment(UErrorCode &errorCode) { UChar32 c = uiter_previous32(&iter); if(c < 0) { break; } uint16_t fcd16 = nfcImpl.getFCD16(c); - uint8_t trailCC = (uint8_t)fcd16; + uint8_t trailCC = static_cast<uint8_t>(fcd16); if(trailCC == 0 && !s.isEmpty()) { // FCD boundary after this character. uiter_next32(&iter); @@ -424,7 +424,7 @@ FCDUIterCollationIterator::previousSegment(UErrorCode &errorCode) { pos = normalized.length(); return true; } - nextCC = (uint8_t)(fcd16 >> 8); + nextCC = static_cast<uint8_t>(fcd16 >> 8); if(nextCC == 0) { // FCD boundary before the following character. break; diff --git a/deps/icu-small/source/i18n/ulocdata.cpp b/deps/icu-small/source/i18n/ulocdata.cpp index 0aab6295819ef2..a1b2daa4436ab6 100644 --- a/deps/icu-small/source/i18n/ulocdata.cpp +++ b/deps/icu-small/source/i18n/ulocdata.cpp @@ -16,6 +16,7 @@ * created by: Ram Viswanadha,John Emmons */ +#include "charstr.h" #include "cmemory.h" #include "unicode/ustring.h" #include "unicode/ures.h" @@ -197,17 +198,20 @@ ulocdata_getDelimiter(ULocaleData *uld, ULocaleDataDelimiterType type, return len; } -static UResourceBundle * measurementTypeBundleForLocale(const char *localeID, const char *measurementType, UErrorCode *status){ - char region[ULOC_COUNTRY_CAPACITY]; +namespace { + +UResourceBundle * measurementTypeBundleForLocale(const char *localeID, const char *measurementType, UErrorCode *status){ + if (U_FAILURE(*status)) { return nullptr; } + UResourceBundle *rb; UResourceBundle *measTypeBundle = nullptr; - - ulocimp_getRegionForSupplementalData(localeID, true, region, ULOC_COUNTRY_CAPACITY, status); - + + icu::CharString region = ulocimp_getRegionForSupplementalData(localeID, true, *status); + rb = ures_openDirect(nullptr, "supplementalData", status); ures_getByKey(rb, "measurementData", rb, status); if (rb != nullptr) { - UResourceBundle *measDataBundle = ures_getByKey(rb, region, nullptr, status); + UResourceBundle *measDataBundle = ures_getByKey(rb, region.data(), nullptr, status); if (U_SUCCESS(*status)) { measTypeBundle = ures_getByKey(measDataBundle, measurementType, nullptr, status); } @@ -225,6 +229,8 @@ static UResourceBundle * measurementTypeBundleForLocale(const char *localeID, co return measTypeBundle; } +} // namespace + U_CAPI UMeasurementSystem U_EXPORT2 ulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status){ @@ -275,6 +281,7 @@ ulocdata_getPaperSize(const char* localeID, int32_t *height, int32_t *width, UEr U_CAPI void U_EXPORT2 ulocdata_getCLDRVersion(UVersionInfo versionArray, UErrorCode *status) { + if (U_FAILURE(*status)) { return; } UResourceBundle *rb = nullptr; rb = ures_openDirect(nullptr, "supplementalData", status); ures_getVersionByKey(rb, "cldrVersion", versionArray, status); diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index ea6e62e2aaf99c..292fa7b87687f1 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -232,11 +232,11 @@ umsg_open( const char16_t *pattern, //check arguments if(status==nullptr || U_FAILURE(*status)) { - return 0; + return nullptr; } if(pattern==nullptr||patternLength<-1){ *status=U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } UParseError tErr; @@ -282,9 +282,9 @@ umsg_clone(const UMessageFormat *fmt, return nullptr; } UMessageFormat retVal = (UMessageFormat)((MessageFormat*)fmt)->clone(); - if(retVal == 0) { + if (retVal == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } return retVal; } @@ -344,7 +344,7 @@ umsg_toPattern(const UMessageFormat *fmt, if(status ==nullptr||U_FAILURE(*status)){ return -1; } - if(fmt==nullptr||resultLength<0 || (resultLength>0 && result==0)){ + if (fmt == nullptr || resultLength < 0 || (resultLength > 0 && result == nullptr)) { *status=U_ILLEGAL_ARGUMENT_ERROR; return -1; } @@ -393,11 +393,11 @@ umsg_vformat( const UMessageFormat *fmt, UErrorCode *status) { //check arguments - if(status==0 || U_FAILURE(*status)) + if (status == nullptr || U_FAILURE(*status)) { return -1; } - if(fmt==nullptr||resultLength<0 || (resultLength>0 && result==0)) { + if (fmt == nullptr || resultLength < 0 || (resultLength > 0 && result == nullptr)) { *status=U_ILLEGAL_ARGUMENT_ERROR; return -1; } @@ -558,7 +558,7 @@ umsg_vparse(const UMessageFormat *fmt, case Formattable::kLong: aInt = va_arg(ap, int32_t*); if(aInt){ - *aInt = (int32_t) args[i].getLong(); + *aInt = args[i].getLong(); }else{ *status=U_ILLEGAL_ARGUMENT_ERROR; } diff --git a/deps/icu-small/source/i18n/unesctrn.cpp b/deps/icu-small/source/i18n/unesctrn.cpp index cce191ca62e7e3..774d82a32e5699 100644 --- a/deps/icu-small/source/i18n/unesctrn.cpp +++ b/deps/icu-small/source/i18n/unesctrn.cpp @@ -84,7 +84,7 @@ static char16_t* copySpec(const char16_t* spec) { ++len; } ++len; - char16_t *result = (char16_t *)uprv_malloc(len*sizeof(char16_t)); + char16_t* result = static_cast<char16_t*>(uprv_malloc(len * sizeof(char16_t))); // Check for memory allocation error. if (result != nullptr) { uprv_memcpy(result, spec, (size_t)len*sizeof(result[0])); @@ -186,7 +186,7 @@ void UnescapeTransliterator::handleTransliterate(Replaceable& text, UTransPositi // Read the header int32_t prefixLen = spec[ipat++]; int32_t suffixLen = spec[ipat++]; - int8_t radix = (int8_t) spec[ipat++]; + int8_t radix = static_cast<int8_t>(spec[ipat++]); int32_t minDigits = spec[ipat++]; int32_t maxDigits = spec[ipat++]; diff --git a/deps/icu-small/source/i18n/uni2name.cpp b/deps/icu-small/source/i18n/uni2name.cpp index 727f8953dbbfeb..5173ee1d0c7628 100644 --- a/deps/icu-small/source/i18n/uni2name.cpp +++ b/deps/icu-small/source/i18n/uni2name.cpp @@ -82,7 +82,7 @@ void UnicodeNameTransliterator::handleTransliterate(Replaceable& text, UTransPos } // Accommodate the longest possible name plus padding - char* buf = (char*) uprv_malloc(maxLen); + char* buf = static_cast<char*>(uprv_malloc(maxLen)); if (buf == nullptr) { offsets.start = offsets.limit; return; diff --git a/deps/icu-small/source/i18n/uni2name.h b/deps/icu-small/source/i18n/uni2name.h index 1e01d784237a67..44f8d94d7b3cd8 100644 --- a/deps/icu-small/source/i18n/uni2name.h +++ b/deps/icu-small/source/i18n/uni2name.h @@ -33,7 +33,7 @@ class UnicodeNameTransliterator : public Transliterator { * Constructs a transliterator. * @param adoptedFilter the filter to be adopted. */ - UnicodeNameTransliterator(UnicodeFilter* adoptedFilter = 0); + UnicodeNameTransliterator(UnicodeFilter* adoptedFilter = nullptr); /** * Destructor. diff --git a/deps/icu-small/source/i18n/unicode/alphaindex.h b/deps/icu-small/source/i18n/unicode/alphaindex.h index cbce2127176756..7aca9f10348692 100644 --- a/deps/icu-small/source/i18n/unicode/alphaindex.h +++ b/deps/icu-small/source/i18n/unicode/alphaindex.h @@ -647,7 +647,6 @@ class U_I18N_API AlphabeticIndex: public UObject { private: /** * No Copy constructor. - * @internal (private) */ AlphabeticIndex(const AlphabeticIndex &other) = delete; @@ -658,13 +657,11 @@ class U_I18N_API AlphabeticIndex: public UObject { /** * No Equality operators. - * @internal (private) */ virtual bool operator==(const AlphabeticIndex& other) const; /** * Inequality operator. - * @internal (private) */ virtual bool operator!=(const AlphabeticIndex& other) const; @@ -723,7 +720,6 @@ class U_I18N_API AlphabeticIndex: public UObject { /** * Holds all user records before they are distributed into buckets. * Type of contents is (Record *) - * @internal (private) */ UVector *inputList_; diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index 26781f8a05685f..dfcdd3fe620db6 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -186,7 +186,7 @@ class BasicTimeZone; * * @stable ICU 2.0 */ -class U_I18N_API Calendar : public UObject { +class U_I18N_API_CLASS Calendar : public UObject { public: #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -284,7 +284,7 @@ class U_I18N_API Calendar : public UObject { * destructor * @stable ICU 2.0 */ - virtual ~Calendar(); + U_I18N_API virtual ~Calendar(); /** * Create and return a polymorphic copy of this calendar. @@ -292,7 +292,7 @@ class U_I18N_API Calendar : public UObject { * @return a polymorphic copy of this calendar. * @stable ICU 2.0 */ - virtual Calendar* clone() const = 0; + U_I18N_API virtual Calendar* clone() const = 0; /** * Creates a Calendar using the default timezone and locale. Clients are responsible @@ -305,7 +305,7 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(UErrorCode& success); /** * Creates a Calendar using the given timezone and the default locale. @@ -319,7 +319,7 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success); /** * Creates a Calendar using the given timezone and the default locale. The TimeZone @@ -332,7 +332,7 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success); /** * Creates a Calendar using the default timezone and the given locale. @@ -344,7 +344,7 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success); /** * Creates a Calendar using the given timezone and given locale. @@ -359,7 +359,9 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, + const Locale& aLocale, + UErrorCode& success); /** * Gets a Calendar using the given timezone and given locale. The TimeZone @@ -373,7 +375,9 @@ class U_I18N_API Calendar : public UObject { * @return A Calendar if created successfully. nullptr otherwise. * @stable ICU 2.0 */ - static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); + U_I18N_API static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, + const Locale& aLocale, + UErrorCode& success); /** * Returns a list of the locales for which Calendars are installed. @@ -384,8 +388,7 @@ class U_I18N_API Calendar : public UObject { * the caller must NOT delete it. Does not include user-registered Calendars. * @stable ICU 2.0 */ - static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); - + U_I18N_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Given a key and a locale, returns an array of string values in a preferred @@ -403,8 +406,10 @@ class U_I18N_API Calendar : public UObject { * @return a string enumeration over keyword values for the given key and the locale. * @stable ICU 4.2 */ - static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key, - const Locale& locale, UBool commonlyUsed, UErrorCode& status); + U_I18N_API static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key, + const Locale& locale, + UBool commonlyUsed, + UErrorCode& status); /** * Returns the current UTC (GMT) time measured in milliseconds since 0:00:00 on 1/1/70 @@ -413,7 +418,7 @@ class U_I18N_API Calendar : public UObject { * @return The current UTC time in milliseconds. * @stable ICU 2.0 */ - static UDate U_EXPORT2 getNow(void); + U_I18N_API static UDate U_EXPORT2 getNow(); /** * Gets this Calendar's time as milliseconds. May involve recalculation of time due @@ -428,7 +433,7 @@ class U_I18N_API Calendar : public UObject { * failed. * @stable ICU 2.0 */ - inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); } + U_I18N_API inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); } /** * Sets this Calendar's current time with the given UDate. The time specified should @@ -440,7 +445,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.0 */ - inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); } + U_I18N_API inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); } /** * Compares the equality of two Calendar objects. Objects of different subclasses @@ -453,7 +458,7 @@ class U_I18N_API Calendar : public UObject { * otherwise. * @stable ICU 2.0 */ - virtual bool operator==(const Calendar& that) const; + U_I18N_API virtual bool operator==(const Calendar& that) const; /** * Compares the inequality of two Calendar objects. @@ -463,7 +468,7 @@ class U_I18N_API Calendar : public UObject { * otherwise. * @stable ICU 2.0 */ - bool operator!=(const Calendar& that) const {return !operator==(that);} + U_I18N_API bool operator!=(const Calendar& that) const { return !operator==(that); } /** * Returns true if the given Calendar object is equivalent to this @@ -475,7 +480,7 @@ class U_I18N_API Calendar : public UObject { * @param other the Calendar to be compared with this Calendar * @stable ICU 2.4 */ - virtual UBool isEquivalentTo(const Calendar& other) const; + U_I18N_API virtual UBool isEquivalentTo(const Calendar& other) const; /** * Compares the Calendar time, whereas Calendar::operator== compares the equality of @@ -491,7 +496,7 @@ class U_I18N_API Calendar : public UObject { * Calendar when; false otherwise. * @stable ICU 2.0 */ - UBool equals(const Calendar& when, UErrorCode& status) const; + U_I18N_API UBool equals(const Calendar& when, UErrorCode& status) const; /** * Returns true if this Calendar's current time is before "when"'s current time. @@ -506,7 +511,7 @@ class U_I18N_API Calendar : public UObject { * Calendar when; false otherwise. * @stable ICU 2.0 */ - UBool before(const Calendar& when, UErrorCode& status) const; + U_I18N_API UBool before(const Calendar& when, UErrorCode& status) const; /** * Returns true if this Calendar's current time is after "when"'s current time. @@ -521,7 +526,7 @@ class U_I18N_API Calendar : public UObject { * Calendar when; false otherwise. * @stable ICU 2.0 */ - UBool after(const Calendar& when, UErrorCode& status) const; + U_I18N_API UBool after(const Calendar& when, UErrorCode& status) const; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -544,7 +549,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @deprecated ICU 2.6. use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. */ - virtual void add(EDateFields field, int32_t amount, UErrorCode& status); + U_I18N_API virtual void add(EDateFields field, int32_t amount, UErrorCode& status); #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -567,7 +572,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.6. */ - virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); + U_I18N_API virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); #ifndef U_HIDE_DEPRECATED_API /** @@ -602,7 +607,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, UBool up, UErrorCode& status) instead. */ - inline void roll(EDateFields field, UBool up, UErrorCode& status); + U_I18N_API inline void roll(EDateFields field, UBool up, UErrorCode& status); #endif /* U_HIDE_DEPRECATED_API */ /** @@ -637,7 +642,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.6. */ - inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); + U_I18N_API inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -671,7 +676,7 @@ class U_I18N_API Calendar : public UObject { * an error status. * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. */ - virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); + U_I18N_API virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -705,7 +710,7 @@ class U_I18N_API Calendar : public UObject { * an error status. * @stable ICU 2.6. */ - virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); + U_I18N_API virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -763,7 +768,7 @@ class U_I18N_API Calendar : public UObject { * <code>field</code>. * @deprecated ICU 2.6. Use fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status). */ - virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status); + U_I18N_API virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status); #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -821,7 +826,9 @@ class U_I18N_API Calendar : public UObject { * <code>field</code>. * @stable ICU 2.6. */ - virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status); + U_I18N_API virtual int32_t fieldDifference(UDate when, + UCalendarDateFields field, + UErrorCode& status); /** * Sets the calendar's time zone to be the one passed in. The Calendar takes ownership @@ -831,7 +838,7 @@ class U_I18N_API Calendar : public UObject { * @param value The given time zone. * @stable ICU 2.0 */ - void adoptTimeZone(TimeZone* value); + U_I18N_API void adoptTimeZone(TimeZone* value); /** * Sets the calendar's time zone to be the same as the one passed in. The TimeZone @@ -840,7 +847,7 @@ class U_I18N_API Calendar : public UObject { * @param zone The given time zone. * @stable ICU 2.0 */ - void setTimeZone(const TimeZone& zone); + U_I18N_API void setTimeZone(const TimeZone& zone); /** * Returns a reference to the time zone owned by this calendar. The returned reference @@ -850,7 +857,7 @@ class U_I18N_API Calendar : public UObject { * @return The time zone object associated with this calendar. * @stable ICU 2.0 */ - const TimeZone& getTimeZone(void) const; + U_I18N_API const TimeZone& getTimeZone() const; /** * Returns the time zone owned by this calendar. The caller owns the returned object @@ -860,7 +867,7 @@ class U_I18N_API Calendar : public UObject { * @return The time zone object which was associated with this calendar. * @stable ICU 2.0 */ - TimeZone* orphanTimeZone(void); + U_I18N_API TimeZone* orphanTimeZone(); /** * Queries if the current date for this Calendar is in Daylight Savings Time. @@ -870,7 +877,7 @@ class U_I18N_API Calendar : public UObject { * false, otherwise. * @stable ICU 2.0 */ - virtual UBool inDaylightTime(UErrorCode& status) const; + U_I18N_API virtual UBool inDaylightTime(UErrorCode& status) const; /** * Specifies whether or not date/time interpretation is to be lenient. With lenient @@ -884,7 +891,7 @@ class U_I18N_API Calendar : public UObject { * @see DateFormat#setLenient * @stable ICU 2.0 */ - void setLenient(UBool lenient); + U_I18N_API void setLenient(UBool lenient); /** * Tells whether date/time interpretation is to be lenient. @@ -892,7 +899,7 @@ class U_I18N_API Calendar : public UObject { * @return True tells that date/time interpretation is to be lenient. * @stable ICU 2.0 */ - UBool isLenient(void) const; + U_I18N_API UBool isLenient() const; /** * Sets the behavior for handling wall time repeating multiple times @@ -914,7 +921,7 @@ class U_I18N_API Calendar : public UObject { * @see #getRepeatedWallTimeOption * @stable ICU 49 */ - void setRepeatedWallTimeOption(UCalendarWallTimeOption option); + U_I18N_API void setRepeatedWallTimeOption(UCalendarWallTimeOption option); /** * Gets the behavior for handling wall time repeating multiple times @@ -925,7 +932,7 @@ class U_I18N_API Calendar : public UObject { * @see #setRepeatedWallTimeOption * @stable ICU 49 */ - UCalendarWallTimeOption getRepeatedWallTimeOption(void) const; + U_I18N_API UCalendarWallTimeOption getRepeatedWallTimeOption() const; /** * Sets the behavior for handling skipped wall time at positive time zone offset @@ -948,7 +955,7 @@ class U_I18N_API Calendar : public UObject { * * @stable ICU 49 */ - void setSkippedWallTimeOption(UCalendarWallTimeOption option); + U_I18N_API void setSkippedWallTimeOption(UCalendarWallTimeOption option); /** * Gets the behavior for handling skipped wall time at positive time zone offset @@ -960,7 +967,7 @@ class U_I18N_API Calendar : public UObject { * @see #setSkippedWallTimeOption * @stable ICU 49 */ - UCalendarWallTimeOption getSkippedWallTimeOption(void) const; + U_I18N_API UCalendarWallTimeOption getSkippedWallTimeOption() const; /** * Sets what the first day of the week is; e.g., Sunday in US, Monday in France. @@ -968,7 +975,7 @@ class U_I18N_API Calendar : public UObject { * @param value The given first day of the week. * @stable ICU 2.6. */ - void setFirstDayOfWeek(UCalendarDaysOfWeek value); + U_I18N_API void setFirstDayOfWeek(UCalendarDaysOfWeek value); #ifndef U_HIDE_DEPRECATED_API /** @@ -977,7 +984,7 @@ class U_I18N_API Calendar : public UObject { * @return The first day of the week. * @deprecated ICU 2.6 use the overload with error code */ - EDaysOfWeek getFirstDayOfWeek(void) const; + U_I18N_API EDaysOfWeek getFirstDayOfWeek() const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -987,7 +994,7 @@ class U_I18N_API Calendar : public UObject { * @return The first day of the week. * @stable ICU 2.6 */ - UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const; + U_I18N_API UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode& status) const; /** * Sets what the minimal days required in the first week of the year are; For @@ -998,7 +1005,7 @@ class U_I18N_API Calendar : public UObject { * @param value The given minimal days required in the first week of the year. * @stable ICU 2.0 */ - void setMinimalDaysInFirstWeek(uint8_t value); + U_I18N_API void setMinimalDaysInFirstWeek(uint8_t value); /** * Gets what the minimal days required in the first week of the year are; e.g., if @@ -1009,7 +1016,7 @@ class U_I18N_API Calendar : public UObject { * @return The minimal days required in the first week of the year. * @stable ICU 2.0 */ - uint8_t getMinimalDaysInFirstWeek(void) const; + U_I18N_API uint8_t getMinimalDaysInFirstWeek() const; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -1020,7 +1027,7 @@ class U_I18N_API Calendar : public UObject { * @return The minimum value for the given time field. * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead. */ - virtual int32_t getMinimum(EDateFields field) const; + U_I18N_API virtual int32_t getMinimum(EDateFields field) const; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -1031,7 +1038,7 @@ class U_I18N_API Calendar : public UObject { * @return The minimum value for the given time field. * @stable ICU 2.6. */ - virtual int32_t getMinimum(UCalendarDateFields field) const; + U_I18N_API virtual int32_t getMinimum(UCalendarDateFields field) const; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -1042,7 +1049,7 @@ class U_I18N_API Calendar : public UObject { * @return The maximum value for the given time field. * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead. */ - virtual int32_t getMaximum(EDateFields field) const; + U_I18N_API virtual int32_t getMaximum(EDateFields field) const; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -1053,7 +1060,7 @@ class U_I18N_API Calendar : public UObject { * @return The maximum value for the given time field. * @stable ICU 2.6. */ - virtual int32_t getMaximum(UCalendarDateFields field) const; + U_I18N_API virtual int32_t getMaximum(UCalendarDateFields field) const; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -1064,7 +1071,7 @@ class U_I18N_API Calendar : public UObject { * @return The highest minimum value for the given time field. * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead. */ - virtual int32_t getGreatestMinimum(EDateFields field) const; + U_I18N_API virtual int32_t getGreatestMinimum(EDateFields field) const; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -1075,7 +1082,7 @@ class U_I18N_API Calendar : public UObject { * @return The highest minimum value for the given time field. * @stable ICU 2.6. */ - virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; + U_I18N_API virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -1086,7 +1093,7 @@ class U_I18N_API Calendar : public UObject { * @return The lowest maximum value for the given time field. * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead. */ - virtual int32_t getLeastMaximum(EDateFields field) const; + U_I18N_API virtual int32_t getLeastMaximum(EDateFields field) const; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -1097,7 +1104,7 @@ class U_I18N_API Calendar : public UObject { * @return The lowest maximum value for the given time field. * @stable ICU 2.6. */ - virtual int32_t getLeastMaximum(UCalendarDateFields field) const; + U_I18N_API virtual int32_t getLeastMaximum(UCalendarDateFields field) const; #ifndef U_HIDE_DEPRECATED_API /** @@ -1114,7 +1121,7 @@ class U_I18N_API Calendar : public UObject { * @return the minimum of the given field for the current date of this Calendar * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field, UErrorCode& status) instead. */ - int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; + U_I18N_API int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -1131,7 +1138,7 @@ class U_I18N_API Calendar : public UObject { * @return the minimum of the given field for the current date of this Calendar * @stable ICU 2.6. */ - virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; + U_I18N_API virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; /** * Return the maximum value that this field could have, given the current date. @@ -1149,7 +1156,7 @@ class U_I18N_API Calendar : public UObject { * @return the maximum of the given field for the current date of this Calendar * @stable ICU 2.6. */ - virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; + U_I18N_API virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; /** * Gets the value for a given time field. Recalculate the current time field values @@ -1164,7 +1171,7 @@ class U_I18N_API Calendar : public UObject { * and set() has been called for any other field. * @stable ICU 2.6. */ - int32_t get(UCalendarDateFields field, UErrorCode& status) const; + U_I18N_API int32_t get(UCalendarDateFields field, UErrorCode& status) const; /** * Determines if the given time field has a value set. This can affect in the @@ -1174,7 +1181,7 @@ class U_I18N_API Calendar : public UObject { * @return True if the given time field has a value set; false otherwise. * @stable ICU 2.6. */ - UBool isSet(UCalendarDateFields field) const; + U_I18N_API UBool isSet(UCalendarDateFields field) const; /** * Sets the given time field with the given value. @@ -1183,7 +1190,7 @@ class U_I18N_API Calendar : public UObject { * @param value The value to be set for the given time field. * @stable ICU 2.6. */ - void set(UCalendarDateFields field, int32_t value); + U_I18N_API void set(UCalendarDateFields field, int32_t value); /** * Sets the values for the fields YEAR, MONTH, and DATE. Other field values are @@ -1195,7 +1202,7 @@ class U_I18N_API Calendar : public UObject { * @param date The value used to set the DATE time field. * @stable ICU 2.0 */ - void set(int32_t year, int32_t month, int32_t date); + U_I18N_API void set(int32_t year, int32_t month, int32_t date); /** * Sets the values for the fields YEAR, MONTH, DATE, HOUR_OF_DAY, and MINUTE. Other @@ -1209,7 +1216,7 @@ class U_I18N_API Calendar : public UObject { * @param minute The value used to set the MINUTE time field. * @stable ICU 2.0 */ - void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); + U_I18N_API void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); /** * Sets the values for the fields YEAR, MONTH, DATE, HOUR_OF_DAY, MINUTE, and SECOND. @@ -1224,7 +1231,8 @@ class U_I18N_API Calendar : public UObject { * @param second The value used to set the SECOND time field. * @stable ICU 2.0 */ - void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second); + U_I18N_API void set(int32_t year, int32_t month, int32_t date, + int32_t hour, int32_t minute, int32_t second); /** * Clears the values of all the time fields, making them both unset and assigning @@ -1232,7 +1240,7 @@ class U_I18N_API Calendar : public UObject { * resolving of time into time fields. * @stable ICU 2.0 */ - void clear(void); + U_I18N_API void clear(); /** * Clears the value in the given time field, both making it unset and assigning it a @@ -1243,7 +1251,7 @@ class U_I18N_API Calendar : public UObject { * @param field The time field to be cleared. * @stable ICU 2.6. */ - void clear(UCalendarDateFields field); + U_I18N_API void clear(UCalendarDateFields field); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. This method is to @@ -1260,7 +1268,7 @@ class U_I18N_API Calendar : public UObject { * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + U_I18N_API virtual UClassID getDynamicClassID() const override = 0; /** * Returns the calendar type name string for this Calendar object. @@ -1294,7 +1302,7 @@ class U_I18N_API Calendar : public UObject { * @return legacy calendar type name string * @stable ICU 49 */ - virtual const char * getType() const = 0; + U_I18N_API virtual const char* getType() const = 0; /** * Returns whether the given day of the week is a weekday, a weekend day, @@ -1312,7 +1320,8 @@ class U_I18N_API Calendar : public UObject { * @return The UCalendarWeekdayType for the day of the week. * @stable ICU 4.4 */ - virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; + U_I18N_API virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, + UErrorCode& status) const; /** * Returns the time during the day at which the weekend begins or ends in @@ -1328,7 +1337,8 @@ class U_I18N_API Calendar : public UObject { * @return The milliseconds after midnight at which the weekend begins or ends. * @stable ICU 4.4 */ - virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; + U_I18N_API virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, + UErrorCode& status) const; /** * Returns true if the given UDate is in the weekend in @@ -1339,7 +1349,7 @@ class U_I18N_API Calendar : public UObject { * this calendar system, false otherwise. * @stable ICU 4.4 */ - virtual UBool isWeekend(UDate date, UErrorCode &status) const; + U_I18N_API virtual UBool isWeekend(UDate date, UErrorCode& status) const; /** * Returns true if this Calendar's current date-time is in the weekend in @@ -1348,9 +1358,8 @@ class U_I18N_API Calendar : public UObject { * this calendar system, false otherwise. * @stable ICU 4.4 */ - virtual UBool isWeekend(void) const; + U_I18N_API virtual UBool isWeekend() const; -#ifndef U_FORCE_HIDE_DRAFT_API /** * Returns true if the date is in a leap year. Recalculate the current time * field values if the time value has been changed by a call to * setTime(). @@ -1363,9 +1372,9 @@ class U_I18N_API Calendar : public UObject { * @param status ICU Error Code * @return True if the date in the fields is in a Temporal proposal * defined leap year. False otherwise. - * @draft ICU 73 + * @stable ICU 73 */ - virtual bool inTemporalLeapYear(UErrorCode& status) const; + U_I18N_API virtual bool inTemporalLeapYear(UErrorCode& status) const; /** * Gets The Temporal monthCode value corresponding to the month for the date. @@ -1383,9 +1392,9 @@ class U_I18N_API Calendar : public UObject { * * @param status ICU Error Code * @return One of 25 possible strings in {"M01".."M13", "M01L".."M12L"}. - * @draft ICU 73 + * @stable ICU 73 */ - virtual const char* getTemporalMonthCode(UErrorCode& status) const; + U_I18N_API virtual const char* getTemporalMonthCode(UErrorCode& status) const; /** * Sets The Temporal monthCode which is a string identifier that starts @@ -1404,11 +1413,9 @@ class U_I18N_API Calendar : public UObject { * @param temporalMonth The value to be set for temporal monthCode. * @param status ICU Error Code * - * @draft ICU 73 + * @stable ICU 73 */ - virtual void setTemporalMonthCode(const char* temporalMonth, UErrorCode& status); - -#endif // U_FORCE_HIDE_DRAFT_API + U_I18N_API virtual void setTemporalMonthCode(const char* temporalMonth, UErrorCode& status); protected: @@ -1420,7 +1427,7 @@ class U_I18N_API Calendar : public UObject { * U_ZERO_ERROR if constructed successfully. * @stable ICU 2.0 */ - Calendar(UErrorCode& success); + U_I18N_API Calendar(UErrorCode& success); /** * Copy constructor @@ -1428,7 +1435,7 @@ class U_I18N_API Calendar : public UObject { * @param source Calendar object to be copied from * @stable ICU 2.0 */ - Calendar(const Calendar& source); + U_I18N_API Calendar(const Calendar& source); /** * Default assignment operator @@ -1436,7 +1443,7 @@ class U_I18N_API Calendar : public UObject { * @param right Calendar object to be copied * @stable ICU 2.0 */ - Calendar& operator=(const Calendar& right); + U_I18N_API Calendar& operator=(const Calendar& right); /** * Constructs a Calendar with the given time zone and locale. Clients are no longer @@ -1448,7 +1455,7 @@ class U_I18N_API Calendar : public UObject { * U_ZERO_ERROR if constructed successfully. * @stable ICU 2.0 */ - Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); + U_I18N_API Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); /** * Constructs a Calendar with the given time zone and locale. @@ -1459,7 +1466,7 @@ class U_I18N_API Calendar : public UObject { * U_ZERO_ERROR if constructed successfully. * @stable ICU 2.0 */ - Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); + U_I18N_API Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); /** * Converts Calendar's time field values to GMT as milliseconds. @@ -1469,7 +1476,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.0 */ - virtual void computeTime(UErrorCode& status); + U_I18N_API virtual void computeTime(UErrorCode& status); /** * Converts GMT as milliseconds to time field values. This allows you to sync up the @@ -1482,7 +1489,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.0 */ - virtual void computeFields(UErrorCode& status); + U_I18N_API virtual void computeFields(UErrorCode& status); /** * Gets this Calendar's current time as a long. @@ -1493,7 +1500,7 @@ class U_I18N_API Calendar : public UObject { * @return the current time as UTC milliseconds from the epoch. * @stable ICU 2.0 */ - double getTimeInMillis(UErrorCode& status) const; + U_I18N_API double getTimeInMillis(UErrorCode& status) const; /** * Sets this Calendar's current time from the given long value. @@ -1503,7 +1510,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.0 */ - void setTimeInMillis( double millis, UErrorCode& status ); + U_I18N_API void setTimeInMillis(double millis, UErrorCode& status); /** * Recomputes the current time from currently set fields, and then fills in any @@ -1514,7 +1521,7 @@ class U_I18N_API Calendar : public UObject { * leniency, this will be set to an error status. * @stable ICU 2.0 */ - void complete(UErrorCode& status); + U_I18N_API void complete(UErrorCode& status); #ifndef U_HIDE_DEPRECATED_API /** @@ -1525,7 +1532,7 @@ class U_I18N_API Calendar : public UObject { * @return The value for the given time field. * @deprecated ICU 2.6. Use internalGet(UCalendarDateFields field) instead. */ - inline int32_t internalGet(EDateFields field) const {return fFields[field];} + U_I18N_API inline int32_t internalGet(EDateFields field) const { return fFields[field]; } #endif /* U_HIDE_DEPRECATED_API */ #ifndef U_HIDE_INTERNAL_API @@ -1539,7 +1546,9 @@ class U_I18N_API Calendar : public UObject { * @return The value for the given time field. * @internal */ - inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;} + U_I18N_API inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const { + return fStamp[field] > kUnset ? fFields[field] : defaultValue; + } /** * Gets the value for a given time field. Subclasses can use this function to get @@ -1549,7 +1558,22 @@ class U_I18N_API Calendar : public UObject { * @return The value for the given time field. * @internal */ - inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];} + U_I18N_API inline int32_t internalGet(UCalendarDateFields field) const { return fFields[field]; } + + /** + * The year in this calendar is counting from 1 backward if the era is 0. + * @return The year in era 0 of this calendar is counting backward from 1. + * @internal + */ + U_I18N_API virtual bool isEra0CountingBackward() const { return false; } + + /** + * Related year difference. + * @return The difference in Related year. + * @internal + */ + U_I18N_API virtual int32_t getRelatedYearDifference() const; + #endif /* U_HIDE_INTERNAL_API */ /** @@ -1561,7 +1585,7 @@ class U_I18N_API Calendar : public UObject { * @return The value for the UCAL_MONTH. * @internal */ - virtual int32_t internalGetMonth() const; + U_I18N_API virtual int32_t internalGetMonth(UErrorCode& status) const; /** * Use this function instead of internalGet(UCAL_MONTH, defaultValue). The implementation @@ -1571,10 +1595,12 @@ class U_I18N_API Calendar : public UObject { * * @param defaultValue a default value used if the UCAL_MONTH and * UCAL_ORDINAL are both unset. + * @param status Output param set to failure code on function return + * when this function fails. * @return The value for the UCAL_MONTH. * @internal */ - virtual int32_t internalGetMonth(int32_t defaultValue) const; + U_I18N_API virtual int32_t internalGetMonth(int32_t defaultValue, UErrorCode& status) const; #ifndef U_HIDE_DEPRECATED_API /** @@ -1586,7 +1612,7 @@ class U_I18N_API Calendar : public UObject { * @param value The value for the given time field. * @deprecated ICU 2.6. Use internalSet(UCalendarDateFields field, int32_t value) instead. */ - void internalSet(EDateFields field, int32_t value); + U_I18N_API void internalSet(EDateFields field, int32_t value); #endif /* U_HIDE_DEPRECATED_API */ /** @@ -1598,7 +1624,7 @@ class U_I18N_API Calendar : public UObject { * @param value The value for the given time field. * @stable ICU 2.6. */ - inline void internalSet(UCalendarDateFields field, int32_t value); + U_I18N_API inline void internalSet(UCalendarDateFields field, int32_t value); /** * Prepare this calendar for computing the actual minimum or maximum. @@ -1606,7 +1632,9 @@ class U_I18N_API Calendar : public UObject { * temporary calendar. * @internal */ - virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status); + U_I18N_API virtual void prepareGetActual(UCalendarDateFields field, + UBool isMinimum, + UErrorCode& status); /** * Limit enums. Not in sync with UCalendarLimitType (refers to internal fields). @@ -1643,7 +1671,7 @@ class U_I18N_API Calendar : public UObject { * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code> * @internal */ - virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0; + U_I18N_API virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0; /** * Return a limit for a field. @@ -1652,7 +1680,7 @@ class U_I18N_API Calendar : public UObject { * @see #ELimitType * @internal */ - virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const; + U_I18N_API virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const; /** * Return the Julian day number of day before the first day of the @@ -1663,12 +1691,16 @@ class U_I18N_API Calendar : public UObject { * @param useMonth if false, compute the day before the first day of * the given year, otherwise, compute the day before the first day of * the given month + * @param status Output param set to failure code on function return + * when this function fails. * @return the Julian day number of the day before the first * day of the given month and year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, - UBool useMonth) const = 0; + U_I18N_API virtual int64_t handleComputeMonthStart(int32_t eyear, + int32_t month, + UBool useMonth, + UErrorCode& status) const = 0; /** * Return the number of days in the given month of the given extended @@ -1677,37 +1709,40 @@ class U_I18N_API Calendar : public UObject { * implementation than the default implementation in Calendar. * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ; + U_I18N_API virtual int32_t handleGetMonthLength(int32_t extendedYear, + int32_t month, + UErrorCode& status) const; /** * Return the number of days in the given extended year of this * calendar system. Subclasses should override this method if they can * provide a more correct or more efficient implementation than the * default implementation in Calendar. - * @stable ICU 2.0 + * @internal */ - virtual int32_t handleGetYearLength(int32_t eyear) const; - + U_I18N_API virtual int32_t handleGetYearLength(int32_t eyear, UErrorCode& status) const; /** * Return the extended year defined by the current fields. This will * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status ICU Error Code * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() = 0; + U_I18N_API virtual int32_t handleGetExtendedYear(UErrorCode& status) = 0; /** * Subclasses may override this. This method calls * handleGetMonthLength() to obtain the calendar-specific month * length. * @param bestField which field to use to calculate the date + * @param status ICU Error Code * @return julian day specified by calendar fields. * @internal */ - virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField); + U_I18N_API virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode& status); /** * Subclasses must override this to convert from week fields @@ -1717,7 +1752,9 @@ class U_I18N_API Calendar : public UObject { * @return the extended year, UCAL_EXTENDED_YEAR * @internal */ - virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy); + U_I18N_API virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, + int32_t woy, + UErrorCode& status); /** * Validate a single field of this calendar. Subclasses should @@ -1725,16 +1762,17 @@ class U_I18N_API Calendar : public UObject { * Generic fields can be handled by `Calendar::validateField()`. * @internal */ - virtual void validateField(UCalendarDateFields field, UErrorCode &status); + U_I18N_API virtual void validateField(UCalendarDateFields field, UErrorCode& status); #ifndef U_HIDE_INTERNAL_API /** * Compute the Julian day from fields. Will determine whether to use * the JULIAN_DAY field directly, or other fields. + * @param status ICU Error Code * @return the julian day * @internal */ - int32_t computeJulianDay(); + U_I18N_API int32_t computeJulianDay(UErrorCode& status); /** * Compute the milliseconds in the day from the fields. This is a @@ -1743,7 +1781,7 @@ class U_I18N_API Calendar : public UObject { * reflects local zone wall time. * @internal */ - double computeMillisInDay(); + U_I18N_API double computeMillisInDay(); /** * This method can assume EXTENDED_YEAR has been set. @@ -1754,8 +1792,7 @@ class U_I18N_API Calendar : public UObject { * when this function fails. * @internal */ - int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec); - + U_I18N_API int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode& ec); /** * Determine the best stamp in a range. @@ -1765,7 +1802,9 @@ class U_I18N_API Calendar : public UObject { * @return the stamp value of the best stamp * @internal */ - int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const; + U_I18N_API int32_t newestStamp(UCalendarDateFields start, + UCalendarDateFields end, + int32_t bestSoFar) const; /** * Marker for end of resolve set (row or group). Value for field resolution tables. @@ -1773,7 +1812,8 @@ class U_I18N_API Calendar : public UObject { * @see #resolveFields * @internal */ - static constexpr int32_t kResolveSTOP = -1; + U_I18N_API static constexpr int32_t kResolveSTOP = -1; + /** * Value to be bitwised "ORed" against resolve table field values for remapping. * Example: (UCAL_DATE | kResolveRemap) in 1st column will cause 'UCAL_DATE' to be returned, @@ -1783,35 +1823,35 @@ class U_I18N_API Calendar : public UObject { * @see #resolveFields * @internal */ - static constexpr int32_t kResolveRemap = 32; + U_I18N_API static constexpr int32_t kResolveRemap = 32; /** * Precedence table for Dates * @see #resolveFields * @internal */ - static const UFieldResolutionTable kDatePrecedence[]; + U_I18N_API static const UFieldResolutionTable kDatePrecedence[]; /** * Precedence table for Year * @see #resolveFields * @internal */ - static const UFieldResolutionTable kYearPrecedence[]; + U_I18N_API static const UFieldResolutionTable kYearPrecedence[]; /** * Precedence table for Day of Week * @see #resolveFields * @internal */ - static const UFieldResolutionTable kDOWPrecedence[]; + U_I18N_API static const UFieldResolutionTable kDOWPrecedence[]; /** * Precedence table for Months * @see #resolveFields * @internal */ - static const UFieldResolutionTable kMonthPrecedence[]; + U_I18N_API static const UFieldResolutionTable kMonthPrecedence[]; /** * Given a precedence table, return the newest field combination in @@ -1840,14 +1880,13 @@ class U_I18N_API Calendar : public UObject { * match, then UCAL_FIELD_COUNT is returned. * @internal */ - UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable) const; + U_I18N_API UCalendarDateFields resolveFields(const UFieldResolutionTable* precedenceTable) const; #endif /* U_HIDE_INTERNAL_API */ - /** * @internal */ - virtual const UFieldResolutionTable* getFieldResolutionTable() const; + U_I18N_API virtual const UFieldResolutionTable* getFieldResolutionTable() const; #ifndef U_HIDE_INTERNAL_API /** @@ -1855,7 +1894,8 @@ class U_I18N_API Calendar : public UObject { * alternateField. If neither is newer or neither is set, return defaultField. * @internal */ - UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const; + U_I18N_API UCalendarDateFields newerField(UCalendarDateFields defaultField, + UCalendarDateFields alternateField) const; #endif /* U_HIDE_INTERNAL_API */ @@ -1866,53 +1906,17 @@ class U_I18N_API Calendar : public UObject { * @param startValue starting (least max) value of field * @param endValue ending (greatest max) value of field * @param status return type - * @internal (private) */ int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; - protected: - /** - * The flag which indicates if the current time is set in the calendar. - * @stable ICU 2.0 - */ - UBool fIsTimeSet; - - /** - * True if the fields are in sync with the currently set time of this Calendar. - * If false, then the next attempt to get the value of a field will - * force a recomputation of all fields from the current value of the time - * field. - * <P> - * This should really be named areFieldsInSync, but the old name is retained - * for backward compatibility. - * @stable ICU 2.0 - */ - UBool fAreFieldsSet; - - /** - * True if all of the fields have been set. This is initially false, and set to - * true by computeFields(). - * @stable ICU 2.0 - */ - UBool fAreAllFieldsSet; - - /** - * True if all fields have been virtually set, but have not yet been - * computed. This occurs only in setTimeInMillis(). A calendar set - * to this state will compute all fields from the time if it becomes - * necessary, but otherwise will delay such computation. - * @stable ICU 3.0 - */ - UBool fAreFieldsVirtuallySet; - /** * Get the current time without recomputing. * * @return the current time without recomputing. * @stable ICU 2.0 */ - UDate internalGetTime(void) const { return fTime; } + U_I18N_API UDate internalGetTime() const { return fTime; } /** * Set the current time without affecting flags or fields. @@ -1921,7 +1925,7 @@ class U_I18N_API Calendar : public UObject { * @return the current time without recomputing. * @stable ICU 2.0 */ - void internalSetTime(UDate time) { fTime = time; } + U_I18N_API void internalSetTime(UDate time) { fTime = time; } /** * The time fields containing values into which the millis is computed. @@ -1929,14 +1933,7 @@ class U_I18N_API Calendar : public UObject { */ int32_t fFields[UCAL_FIELD_COUNT]; -#ifndef U_FORCE_HIDE_DEPRECATED_API - /** - * The flags which tell if a specified time field for the calendar is set. - * @deprecated ICU 2.8 use (fStamp[n]!=kUnset) - */ - UBool fIsSet[UCAL_FIELD_COUNT]; -#endif // U_FORCE_HIDE_DEPRECATED_API - +protected: /** Special values of stamp[] * @stable ICU 2.0 */ @@ -1946,14 +1943,15 @@ class U_I18N_API Calendar : public UObject { kMinimumUserStamp }; +private: /** * Pseudo-time-stamps which specify when each field was set. There * are two special values, UNSET and INTERNALLY_SET. Values from - * MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values. - * @stable ICU 2.0 + * MINIMUM_USER_SET to STAMP_MAX are legal user set values. */ - int32_t fStamp[UCAL_FIELD_COUNT]; + int8_t fStamp[UCAL_FIELD_COUNT]; +protected: /** * Subclasses may override this method to compute several fields * specific to each calendar system. These are: @@ -1978,7 +1976,7 @@ class U_I18N_API Calendar : public UObject { * a pure proleptic Gregorian calendar. * @internal */ - virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); + U_I18N_API virtual void handleComputeFields(int32_t julianDay, UErrorCode& status); #ifndef U_HIDE_INTERNAL_API /** @@ -1986,7 +1984,7 @@ class U_I18N_API Calendar : public UObject { * <code>computeGregorianFields()</code>. * @internal */ - int32_t getGregorianYear() const { + U_I18N_API int32_t getGregorianYear() const { return fGregorianYear; } @@ -1995,7 +1993,7 @@ class U_I18N_API Calendar : public UObject { * <code>computeGregorianFields()</code>. * @internal */ - int32_t getGregorianMonth() const { + U_I18N_API int32_t getGregorianMonth() const { return fGregorianMonth; } @@ -2004,7 +2002,7 @@ class U_I18N_API Calendar : public UObject { * computed by <code>computeGregorianFields()</code>. * @internal */ - int32_t getGregorianDayOfYear() const { + U_I18N_API int32_t getGregorianDayOfYear() const { return fGregorianDayOfYear; } @@ -2013,7 +2011,7 @@ class U_I18N_API Calendar : public UObject { * computed by <code>computeGregorianFields()</code>. * @internal */ - int32_t getGregorianDayOfMonth() const { + U_I18N_API int32_t getGregorianDayOfMonth() const { return fGregorianDayOfMonth; } #endif /* U_HIDE_INTERNAL_API */ @@ -2022,19 +2020,22 @@ class U_I18N_API Calendar : public UObject { * Called by computeJulianDay. Returns the default month (0-based) for the year, * taking year and era into account. Defaults to 0 for Gregorian, which doesn't care. * @param eyear The extended year + * @param status Output param set to failure code on function return + * when this function fails. * @internal */ - virtual int32_t getDefaultMonthInYear(int32_t eyear) ; - + U_I18N_API virtual int32_t getDefaultMonthInYear(int32_t eyear, UErrorCode& status); /** * Called by computeJulianDay. Returns the default day (1-based) for the month, * taking currently-set year and era into account. Defaults to 1 for Gregorian. * @param eyear the extended year * @param month the month in the year + * @param status Output param set to failure code on function return + * when this function fails. * @internal */ - virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month); + U_I18N_API virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month, UErrorCode& status); //------------------------------------------------------------------------- // Protected utility methods for use by subclasses. These are very handy @@ -2070,7 +2071,7 @@ class U_I18N_API Calendar : public UObject { * @see #getActualMaximum * @stable ICU 2.0 */ - virtual void pinField(UCalendarDateFields field, UErrorCode& status); + U_I18N_API virtual void pinField(UCalendarDateFields field, UErrorCode& status); /** * Return the week number of a day, within a period. This may be the week number in @@ -2115,8 +2116,7 @@ class U_I18N_API Calendar : public UObject { * * @stable ICU 2.8 */ - int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); - + U_I18N_API int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); #ifndef U_HIDE_INTERNAL_API /** @@ -2149,13 +2149,13 @@ class U_I18N_API Calendar : public UObject { * is more than one. * @internal */ - inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); + U_I18N_API inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); /** * returns the local DOW, valid range 0..6 * @internal */ - int32_t getLocalDOW(); + U_I18N_API int32_t getLocalDOW(UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ private: @@ -2163,7 +2163,7 @@ class U_I18N_API Calendar : public UObject { /** * The next available value for fStamp[] */ - int32_t fNextStamp;// = MINIMUM_USER_STAMP; + int8_t fNextStamp = kMinimumUserStamp; /** * Recalculates the time stamp array (fStamp). @@ -2174,30 +2174,60 @@ class U_I18N_API Calendar : public UObject { /** * The current time set for the calendar. */ - UDate fTime; + UDate fTime = 0; /** - * @see #setLenient + * Time zone affects the time calculation done by Calendar. Calendar subclasses use + * the time zone data to produce the local time. Always set; never nullptr. */ - UBool fLenient; + TimeZone* fZone = nullptr; /** - * Time zone affects the time calculation done by Calendar. Calendar subclasses use - * the time zone data to produce the local time. Always set; never nullptr. + * The flag which indicates if the current time is set in the calendar. + */ + bool fIsTimeSet:1; + + /** + * True if the fields are in sync with the currently set time of this Calendar. + * If false, then the next attempt to get the value of a field will + * force a recomputation of all fields from the current value of the time + * field. + * <P> + * This should really be named areFieldsInSync, but the old name is retained + * for backward compatibility. + */ + bool fAreFieldsSet:1; + + /** + * True if all of the fields have been set. This is initially false, and set to + * true by computeFields(). */ - TimeZone* fZone; + bool fAreAllFieldsSet:1; + + /** + * True if all fields have been virtually set, but have not yet been + * computed. This occurs only in setTimeInMillis(). A calendar set + * to this state will compute all fields from the time if it becomes + * necessary, but otherwise will delay such computation. + */ + bool fAreFieldsVirtuallySet:1; + + /** + * @see #setLenient + */ + bool fLenient:1; /** * Option for repeated wall time * @see #setRepeatedWallTimeOption */ - UCalendarWallTimeOption fRepeatedWallTime; + UCalendarWallTimeOption fRepeatedWallTime:3; // Somehow MSVC need 3 bits for UCalendarWallTimeOption /** * Option for skipped wall time * @see #setSkippedWallTimeOption */ - UCalendarWallTimeOption fSkippedWallTime; + UCalendarWallTimeOption fSkippedWallTime:3; // Somehow MSVC need 3 bits for UCalendarWallTimeOption /** * Both firstDayOfWeek and minimalDaysInFirstWeek are locale-dependent. They are @@ -2207,11 +2237,14 @@ class U_I18N_API Calendar : public UObject { * out the week count for a specific date for a given locale. These must be set when * a Calendar is constructed. */ - UCalendarDaysOfWeek fFirstDayOfWeek; - uint8_t fMinimalDaysInFirstWeek; - UCalendarDaysOfWeek fWeekendOnset; + UCalendarDaysOfWeek fFirstDayOfWeek:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + UCalendarDaysOfWeek fWeekendOnset:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + UCalendarDaysOfWeek fWeekendCease:4; // Somehow MSVC need 4 bits for + // UCalendarDaysOfWeek + uint8_t fMinimalDaysInFirstWeek; int32_t fWeekendOnsetMillis; - UCalendarDaysOfWeek fWeekendCease; int32_t fWeekendCeaseMillis; /** @@ -2249,32 +2282,24 @@ class U_I18N_API Calendar : public UObject { * returned by getGregorianMonth(). * @see #computeGregorianFields */ - int32_t fGregorianMonth; + int8_t fGregorianMonth; /** - * The Gregorian day of the year, as computed by - * computeGregorianFields() and returned by getGregorianDayOfYear(). + * The Gregorian day of the month, as computed by + * computeGregorianFields() and returned by getGregorianDayOfMonth(). * @see #computeGregorianFields */ - int32_t fGregorianDayOfYear; + int8_t fGregorianDayOfMonth; /** - * The Gregorian day of the month, as computed by - * computeGregorianFields() and returned by getGregorianDayOfMonth(). + * The Gregorian day of the year, as computed by + * computeGregorianFields() and returned by getGregorianDayOfYear(). * @see #computeGregorianFields */ - int32_t fGregorianDayOfMonth; + int16_t fGregorianDayOfYear; /* calculations */ - /** - * Compute the Gregorian calendar year, month, and day of month from - * the given Julian day. These values are not stored in fields, but in - * member variables gregorianXxx. Also compute the DAY_OF_WEEK and - * DOW_LOCAL fields. - */ - void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); - protected: /** @@ -2284,7 +2309,7 @@ class U_I18N_API Calendar : public UObject { * subclasses that are Gregorian derivatives. Subclasses may call this * method to perform a Gregorian calendar millis->fields computation. */ - void computeGregorianFields(int32_t julianDay, UErrorCode &ec); + U_I18N_API void computeGregorianFields(int32_t julianDay, UErrorCode& ec); private: @@ -2340,12 +2365,12 @@ class U_I18N_API Calendar : public UObject { * @return Day number from 1..7 (SUN..SAT). * @internal */ - static uint8_t julianDayToDayOfWeek(double julian); + U_I18N_API static uint8_t julianDayToDayOfWeek(int32_t julian); #endif /* U_HIDE_INTERNAL_API */ private: - char validLocale[ULOC_FULLNAME_CAPACITY]; - char actualLocale[ULOC_FULLNAME_CAPACITY]; + Locale validLocale; + Locale actualLocale; public: #if !UCONFIG_NO_SERVICE @@ -2360,7 +2385,7 @@ class U_I18N_API Calendar : public UObject { * @return a StringEnumeration over the locales available at the time of the call * @internal */ - static StringEnumeration* getAvailableLocales(void); + U_I18N_API static StringEnumeration* getAvailableLocales(); /** * Register a new Calendar factory. The factory will be adopted. @@ -2375,7 +2400,7 @@ class U_I18N_API Calendar : public UObject { * @return a registry key that can be used to unregister this factory * @internal */ - static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status); + U_I18N_API static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status); /** * Unregister a previously-registered CalendarFactory using the key returned from the @@ -2392,7 +2417,7 @@ class U_I18N_API Calendar : public UObject { * @return true if the factory for the key was successfully unregistered * @internal */ - static UBool unregister(URegistryKey key, UErrorCode& status); + U_I18N_API static UBool unregister(URegistryKey key, UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ /** @@ -2418,18 +2443,19 @@ class U_I18N_API Calendar : public UObject { * @return true if this calendar has a default century (i.e. 03 -> 2003) * @internal */ - virtual UBool haveDefaultCentury() const = 0; + U_I18N_API virtual UBool haveDefaultCentury() const = 0; /** * @return the start of the default century, as a UDate * @internal */ - virtual UDate defaultCenturyStart() const = 0; + U_I18N_API virtual UDate defaultCenturyStart() const = 0; + /** * @return the beginning year of the default century, as a year * @internal */ - virtual int32_t defaultCenturyStartYear() const = 0; + U_I18N_API virtual int32_t defaultCenturyStartYear() const = 0; /** Get the locale for this calendar object. You can choose between valid and actual locale. * @param type type of the locale we're looking for (valid or actual) @@ -2437,21 +2463,21 @@ class U_I18N_API Calendar : public UObject { * @return the locale * @stable ICU 2.8 */ - Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; + U_I18N_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; /** * @return The related Gregorian year; will be obtained by modifying the value * obtained by get from UCAL_EXTENDED_YEAR field * @internal */ - virtual int32_t getRelatedYear(UErrorCode &status) const; + U_I18N_API virtual int32_t getRelatedYear(UErrorCode& status) const; /** * @param year The related Gregorian year to set; will be modified as necessary then * set in UCAL_EXTENDED_YEAR field * @internal */ - virtual void setRelatedYear(int32_t year); + U_I18N_API virtual void setRelatedYear(int32_t year); #ifndef U_HIDE_INTERNAL_API /** Get the locale for this calendar object. You can choose between valid and actual locale. @@ -2460,7 +2486,7 @@ class U_I18N_API Calendar : public UObject { * @return the locale * @internal */ - const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; + U_I18N_API const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; #endif /* U_HIDE_INTERNAL_API */ private: @@ -2489,8 +2515,7 @@ class U_I18N_API Calendar : public UObject { * @return the new Calendar object with no time or timezone set. * @internal For ICU use only. */ - static Calendar * U_EXPORT2 makeInstance( - const Locale &locale, UErrorCode &status); + U_I18N_API static Calendar* U_EXPORT2 makeInstance(const Locale& locale, UErrorCode& status); /** * Get the calendar type for given locale. @@ -2502,11 +2527,10 @@ class U_I18N_API Calendar : public UObject { * @param status error, if any, returned here. * @internal For ICU use only. */ - static void U_EXPORT2 getCalendarTypeFromLocale( - const Locale &locale, - char *typeBuffer, - int32_t typeBufferSize, - UErrorCode &status); + U_I18N_API static void U_EXPORT2 getCalendarTypeFromLocale(const Locale& locale, + char* typeBuffer, + int32_t typeBufferSize, + UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ }; @@ -2524,14 +2548,14 @@ Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) inline void Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status) { - roll(field, (int32_t)(up ? +1 : -1), status); + roll(field, static_cast<int32_t>(up ? +1 : -1), status); } #ifndef U_HIDE_DEPRECATED_API inline void Calendar::roll(EDateFields field, UBool up, UErrorCode& status) { - roll((UCalendarDateFields) field, up, status); + roll(static_cast<UCalendarDateFields>(field), up, status); } #endif /* U_HIDE_DEPRECATED_API */ @@ -2548,9 +2572,18 @@ Calendar::internalSet(UCalendarDateFields field, int32_t value) { fFields[field] = value; fStamp[field] = kInternallySet; - fIsSet[field] = true; // Remove later } +/** + * Macro for the class to declare it override + * haveDefaultCentury, defaultCenturyStart, and + * defaultCenturyStartYear functions in this class. + * @internal + */ +#define DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY \ + virtual UBool haveDefaultCentury() const override; \ + virtual UDate defaultCenturyStart() const override; \ + virtual int32_t defaultCenturyStartYear() const override; #ifndef U_HIDE_INTERNAL_API inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) diff --git a/deps/icu-small/source/i18n/unicode/choicfmt.h b/deps/icu-small/source/i18n/unicode/choicfmt.h index 429fa0cebd82c3..2b6fb626ac833c 100644 --- a/deps/icu-small/source/i18n/unicode/choicfmt.h +++ b/deps/icu-small/source/i18n/unicode/choicfmt.h @@ -454,7 +454,7 @@ class U_I18N_API ChoiceFormat: public NumberFormat { * other classes have different class IDs. * @deprecated ICU 49 Use MessageFormat instead, with plural and select arguments. */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Returns the class ID for this class. This is useful only for @@ -467,7 +467,7 @@ class U_I18N_API ChoiceFormat: public NumberFormat { * @return The class ID for all objects of this class. * @deprecated ICU 49 Use MessageFormat instead, with plural and select arguments. */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); private: /** diff --git a/deps/icu-small/source/i18n/unicode/coleitr.h b/deps/icu-small/source/i18n/unicode/coleitr.h index bd0c569f35c80a..a147d6cfba1489 100644 --- a/deps/icu-small/source/i18n/unicode/coleitr.h +++ b/deps/icu-small/source/i18n/unicode/coleitr.h @@ -128,7 +128,7 @@ class U_I18N_API CollationElementIterator final : public UObject { * NULLORDER indicates that an error has occurred while processing * @stable ICU 2.0 */ - NULLORDER = (int32_t)0xffffffff + NULLORDER = static_cast<int32_t>(0xffffffff) }; // CollationElementIterator public constructor/destructor ------------------- @@ -171,7 +171,7 @@ class U_I18N_API CollationElementIterator final : public UObject { * Resets the cursor to the beginning of the string. * @stable ICU 2.0 */ - void reset(void); + void reset(); /** * Gets the ordering priority of the next character in the string. @@ -263,7 +263,7 @@ class U_I18N_API CollationElementIterator final : public UObject { * @return the offset of the character. * @stable ICU 2.0 */ - int32_t getOffset(void) const; + int32_t getOffset() const; /** * Sets the offset of the currently processed character in the source string. diff --git a/deps/icu-small/source/i18n/unicode/coll.h b/deps/icu-small/source/i18n/unicode/coll.h index fc5af953495529..1c14ab13c9d3b5 100644 --- a/deps/icu-small/source/i18n/unicode/coll.h +++ b/deps/icu-small/source/i18n/unicode/coll.h @@ -58,12 +58,18 @@ #if !UCONFIG_NO_COLLATION +#include <functional> +#include <string_view> +#include <type_traits> + +#include "unicode/char16ptr.h" #include "unicode/uobject.h" #include "unicode/ucol.h" #include "unicode/unorm.h" #include "unicode/locid.h" #include "unicode/uniset.h" #include "unicode/umisc.h" +#include "unicode/unistr.h" #include "unicode/uiter.h" #include "unicode/stringpiece.h" @@ -535,7 +541,7 @@ class U_I18N_API Collator : public UObject { * Generates the hash code for the collation object * @stable ICU 2.0 */ - virtual int32_t hashCode(void) const = 0; + virtual int32_t hashCode() const = 0; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -588,6 +594,48 @@ class U_I18N_API Collator : public UObject { */ UBool equals(const UnicodeString& source, const UnicodeString& target) const; + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::equal_to</code> but uses the collator instead of <code>operator==</code>. + * @stable ICU 76 + */ + inline auto equal_to() const { return Predicate<std::equal_to, UCOL_EQUAL>(*this); } + + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::greater</code> but uses the collator instead of <code>operator></code>. + * @stable ICU 76 + */ + inline auto greater() const { return Predicate<std::equal_to, UCOL_GREATER>(*this); } + + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::less</code> but uses the collator instead of <code>operator<</code>. + * @stable ICU 76 + */ + inline auto less() const { return Predicate<std::equal_to, UCOL_LESS>(*this); } + + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::not_equal_to</code> but uses the collator instead of <code>operator!=</code>. + * @stable ICU 76 + */ + inline auto not_equal_to() const { return Predicate<std::not_equal_to, UCOL_EQUAL>(*this); } + + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::greater_equal</code> but uses the collator instead of <code>operator>=</code>. + * @stable ICU 76 + */ + inline auto greater_equal() const { return Predicate<std::not_equal_to, UCOL_LESS>(*this); } + + /** + * Creates a comparison function object that uses this collator. + * Like <code>std::less_equal</code> but uses the collator instead of <code>operator<=</code>. + * @stable ICU 76 + */ + inline auto less_equal() const { return Predicate<std::not_equal_to, UCOL_GREATER>(*this); } + #ifndef U_FORCE_HIDE_DEPRECATED_API /** * Determines the minimum strength that will be used in comparison or @@ -599,7 +647,7 @@ class U_I18N_API Collator : public UObject { * @see Collator#setStrength * @deprecated ICU 2.6 Use getAttribute(UCOL_STRENGTH...) instead */ - virtual ECollationStrength getStrength(void) const; + virtual ECollationStrength getStrength() const; /** * Sets the minimum strength to be used in comparison or transformation. @@ -730,7 +778,7 @@ class U_I18N_API Collator : public UObject { * @return a StringEnumeration over the locales available at the time of the call * @stable ICU 2.6 */ - static StringEnumeration* U_EXPORT2 getAvailableLocales(void); + static StringEnumeration* U_EXPORT2 getAvailableLocales(); /** * Create a string enumerator of all possible keywords that are relevant to @@ -864,7 +912,7 @@ class U_I18N_API Collator : public UObject { * IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; /** * Universal attribute setter @@ -1210,6 +1258,45 @@ class U_I18N_API Collator : public UObject { friend class ICUCollatorService; static Collator* makeInstance(const Locale& desiredLocale, UErrorCode& status); + + /** + * Function object for performing comparisons using a Collator. + * @internal + */ + template <template <typename...> typename Compare, UCollationResult result> + class Predicate { + public: + explicit Predicate(const Collator& parent) : collator(parent) {} + + template < + typename T, typename U, + typename = std::enable_if_t<ConvertibleToU16StringView<T> && ConvertibleToU16StringView<U>>> + bool operator()(const T& lhs, const U& rhs) const { + UErrorCode status = U_ZERO_ERROR; + return compare( + collator.compare( + UnicodeString::readOnlyAlias(lhs), + UnicodeString::readOnlyAlias(rhs), + status), + result); + } + + bool operator()(std::string_view lhs, std::string_view rhs) const { + UErrorCode status = U_ZERO_ERROR; + return compare(collator.compareUTF8(lhs, rhs, status), result); + } + +#if defined(__cpp_char8_t) + bool operator()(std::u8string_view lhs, std::u8string_view rhs) const { + UErrorCode status = U_ZERO_ERROR; + return compare(collator.compareUTF8(lhs, rhs, status), result); + } +#endif + + private: + const Collator& collator; + static constexpr Compare<UCollationResult> compare{}; + }; }; #if !UCONFIG_NO_SERVICE @@ -1245,7 +1332,7 @@ class U_I18N_API CollatorFactory : public UObject { * @return true if the factory is visible. * @stable ICU 2.6 */ - virtual UBool visible(void) const; + virtual UBool visible() const; /** * Return a collator for the provided locale. If the locale diff --git a/deps/icu-small/source/i18n/unicode/datefmt.h b/deps/icu-small/source/i18n/unicode/datefmt.h index 27240a4e1c6dd2..e8f553850eaa53 100644 --- a/deps/icu-small/source/i18n/unicode/datefmt.h +++ b/deps/icu-small/source/i18n/unicode/datefmt.h @@ -45,18 +45,6 @@ U_NAMESPACE_BEGIN class TimeZone; class DateTimePatternGenerator; -/** - * \cond - * Export an explicit template instantiation. (See digitlst.h, datefmt.h, and others.) - * (When building DLLs for Windows this is required.) - */ -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) -template class U_I18N_API EnumSet<UDateFormatBooleanAttribute, - 0, - UDAT_BOOLEAN_ATTRIBUTE_COUNT>; -#endif -/** \endcond */ - /** * DateFormat is an abstract class for a family of classes that convert dates and * times from their internal representations to textual form and back again in a @@ -153,7 +141,7 @@ template class U_I18N_API EnumSet<UDateFormatBooleanAttribute, * subclasses, such code will not necessarily work and will not be * guaranteed to work stably from release to release. */ -class U_I18N_API DateFormat : public Format { +class U_I18N_API_CLASS DateFormat : public Format { public: /** @@ -221,7 +209,7 @@ class U_I18N_API DateFormat : public Format { * Destructor. * @stable ICU 2.0 */ - virtual ~DateFormat(); + U_I18N_API virtual ~DateFormat(); /** * Clones this object polymorphically. @@ -229,13 +217,13 @@ class U_I18N_API DateFormat : public Format { * @return clone, or nullptr if an error occurred * @stable ICU 2.0 */ - virtual DateFormat* clone() const override = 0; + U_I18N_API virtual DateFormat* clone() const override = 0; /** * Equality operator. Returns true if the two formats have the same behavior. * @stable ICU 2.0 */ - virtual bool operator==(const Format&) const override; + U_I18N_API virtual bool operator==(const Format&) const override; using Format::format; @@ -254,10 +242,10 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const override; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const override; /** * Format an object to produce a string. This method handles Formattable @@ -274,10 +262,10 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.4 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPositionIterator* posIter, - UErrorCode& status) const override; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const override; /** * Formats a date into a date/time string. This is an abstract method which * concrete subclasses must implement. @@ -311,9 +299,9 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.1 */ - virtual UnicodeString& format( Calendar& cal, - UnicodeString& appendTo, - FieldPosition& fieldPosition) const = 0; + U_I18N_API virtual UnicodeString& format(Calendar& cal, + UnicodeString& appendTo, + FieldPosition& fieldPosition) const = 0; /** * Formats a date into a date/time string. Subclasses should implement this method. @@ -333,10 +321,10 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.4 */ - virtual UnicodeString& format(Calendar& cal, - UnicodeString& appendTo, - FieldPositionIterator* posIter, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& format(Calendar& cal, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const; /** * Formats a UDate into a date/time string. * <P> @@ -364,9 +352,9 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - UnicodeString& format( UDate date, - UnicodeString& appendTo, - FieldPosition& fieldPosition) const; + U_I18N_API UnicodeString& format(UDate date, + UnicodeString& appendTo, + FieldPosition& fieldPosition) const; /** * Formats a UDate into a date/time string. @@ -381,10 +369,10 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.4 */ - UnicodeString& format(UDate date, - UnicodeString& appendTo, - FieldPositionIterator* posIter, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(UDate date, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const; /** * Formats a UDate into a date/time string. If there is a problem, you won't * know, using this method. Use the overloaded format() method which takes a @@ -396,7 +384,7 @@ class U_I18N_API DateFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - UnicodeString& format(UDate date, UnicodeString& appendTo) const; + U_I18N_API UnicodeString& format(UDate date, UnicodeString& appendTo) const; /** * Parse a date/time string. For example, a time text "07/10/96 4:5 PM, PDT" @@ -432,8 +420,7 @@ class U_I18N_API DateFormat : public Format { * @return The parsed UDate value, if successful. * @stable ICU 2.0 */ - virtual UDate parse( const UnicodeString& text, - UErrorCode& status) const; + U_I18N_API virtual UDate parse(const UnicodeString& text, UErrorCode& status) const; /** * Parse a date/time string beginning at the given parse position. For @@ -461,9 +448,9 @@ class U_I18N_API DateFormat : public Format { * start position if the parse failed. * @stable ICU 2.1 */ - virtual void parse( const UnicodeString& text, - Calendar& cal, - ParsePosition& pos) const = 0; + U_I18N_API virtual void parse(const UnicodeString& text, + Calendar& cal, + ParsePosition& pos) const = 0; /** * Parse a date/time string beginning at the given parse position. For @@ -495,8 +482,7 @@ class U_I18N_API DateFormat : public Format { * @return A valid UDate if the input could be parsed. * @stable ICU 2.0 */ - UDate parse( const UnicodeString& text, - ParsePosition& pos) const; + U_I18N_API UDate parse(const UnicodeString& text, ParsePosition& pos) const; /** * Parse a string to produce an object. This methods handles parsing of @@ -521,9 +507,9 @@ class U_I18N_API DateFormat : public Format { * will remain unchanged. * @stable ICU 2.0 */ - virtual void parseObject(const UnicodeString& source, - Formattable& result, - ParsePosition& parse_pos) const override; + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const override; /** * Create a default date/time formatter that uses the SHORT style for both @@ -532,7 +518,7 @@ class U_I18N_API DateFormat : public Format { * @return A date/time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* U_EXPORT2 createInstance(void); + U_I18N_API static DateFormat* U_EXPORT2 createInstance(); /** * Creates a time formatter with the given formatting style for the given @@ -545,8 +531,8 @@ class U_I18N_API DateFormat : public Format { * @return A time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* U_EXPORT2 createTimeInstance(EStyle style = kDefault, - const Locale& aLocale = Locale::getDefault()); + U_I18N_API static DateFormat* U_EXPORT2 + createTimeInstance(EStyle style = kDefault, const Locale& aLocale = Locale::getDefault()); /** * Creates a date formatter with the given formatting style for the given @@ -563,8 +549,8 @@ class U_I18N_API DateFormat : public Format { * @return A date formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* U_EXPORT2 createDateInstance(EStyle style = kDefault, - const Locale& aLocale = Locale::getDefault()); + U_I18N_API static DateFormat* U_EXPORT2 + createDateInstance(EStyle style = kDefault, const Locale& aLocale = Locale::getDefault()); /** * Creates a date/time formatter with the given formatting styles for the @@ -584,9 +570,10 @@ class U_I18N_API DateFormat : public Format { * @return A date/time formatter which the caller owns. * @stable ICU 2.0 */ - static DateFormat* U_EXPORT2 createDateTimeInstance(EStyle dateStyle = kDefault, - EStyle timeStyle = kDefault, - const Locale& aLocale = Locale::getDefault()); + U_I18N_API static DateFormat* U_EXPORT2 + createDateTimeInstance(EStyle dateStyle = kDefault, + EStyle timeStyle = kDefault, + const Locale& aLocale = Locale::getDefault()); #ifndef U_HIDE_INTERNAL_API /** @@ -597,10 +584,9 @@ class U_I18N_API DateFormat : public Format { * @return the best pattern. * @internal For ICU use only. */ - static UnicodeString getBestPattern( - const Locale &locale, - const UnicodeString &skeleton, - UErrorCode &status); + U_I18N_API static UnicodeString getBestPattern(const Locale& locale, + const UnicodeString& skeleton, + UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ /** @@ -616,9 +602,8 @@ class U_I18N_API DateFormat : public Format { * @return A date/time formatter which the caller owns. * @stable ICU 55 */ - static DateFormat* U_EXPORT2 createInstanceForSkeleton( - const UnicodeString& skeleton, - UErrorCode &status); + U_I18N_API static DateFormat* U_EXPORT2 createInstanceForSkeleton(const UnicodeString& skeleton, + UErrorCode& status); /** * Creates a date/time formatter for the given skeleton and locale. @@ -633,10 +618,9 @@ class U_I18N_API DateFormat : public Format { * @return A date/time formatter which the caller owns. * @stable ICU 55 */ - static DateFormat* U_EXPORT2 createInstanceForSkeleton( - const UnicodeString& skeleton, - const Locale &locale, - UErrorCode &status); + U_I18N_API static DateFormat* U_EXPORT2 createInstanceForSkeleton(const UnicodeString& skeleton, + const Locale& locale, + UErrorCode& status); /** * Creates a date/time formatter for the given skeleton and locale. @@ -652,12 +636,10 @@ class U_I18N_API DateFormat : public Format { * @return A date/time formatter which the caller owns. * @stable ICU 55 */ - static DateFormat* U_EXPORT2 createInstanceForSkeleton( - Calendar *calendarToAdopt, - const UnicodeString& skeleton, - const Locale &locale, - UErrorCode &status); - + U_I18N_API static DateFormat* U_EXPORT2 createInstanceForSkeleton(Calendar* calendarToAdopt, + const UnicodeString& skeleton, + const Locale& locale, + UErrorCode& status); /** * Gets the set of locales for which DateFormats are installed. @@ -666,14 +648,14 @@ class U_I18N_API DateFormat : public Format { * does NOT own this list and must not delete it. * @stable ICU 2.0 */ - static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); + U_I18N_API static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** * Returns whether both date/time parsing in the encapsulated Calendar object and DateFormat whitespace & * numeric processing is lenient. * @stable ICU 2.0 */ - virtual UBool isLenient(void) const; + U_I18N_API virtual UBool isLenient() const; /** * Specifies whether date/time parsing is to be lenient. With @@ -695,15 +677,14 @@ class U_I18N_API DateFormat : public Format { * @see Calendar::setLenient * @stable ICU 2.0 */ - virtual void setLenient(UBool lenient); + U_I18N_API virtual void setLenient(UBool lenient); /** * Returns whether date/time parsing in the encapsulated Calendar object processing is lenient. * @stable ICU 53 */ - virtual UBool isCalendarLenient(void) const; - + U_I18N_API virtual UBool isCalendarLenient() const; /** * Specifies whether encapsulated Calendar date/time parsing is to be lenient. With @@ -714,7 +695,7 @@ class U_I18N_API DateFormat : public Format { * @see com.ibm.icu.util.Calendar#setLenient * @stable ICU 53 */ - virtual void setCalendarLenient(UBool lenient); + U_I18N_API virtual void setCalendarLenient(UBool lenient); /** @@ -725,7 +706,7 @@ class U_I18N_API DateFormat : public Format { * @return the calendar associated with this date/time formatter. * @stable ICU 2.0 */ - virtual const Calendar* getCalendar(void) const; + U_I18N_API virtual const Calendar* getCalendar() const; /** * Set the calendar to be used by this date format. Initially, the default @@ -736,7 +717,7 @@ class U_I18N_API DateFormat : public Format { * @param calendarToAdopt Calendar object to be adopted. * @stable ICU 2.0 */ - virtual void adoptCalendar(Calendar* calendarToAdopt); + U_I18N_API virtual void adoptCalendar(Calendar* calendarToAdopt); /** * Set the calendar to be used by this date format. Initially, the default @@ -745,8 +726,7 @@ class U_I18N_API DateFormat : public Format { * @param newCalendar Calendar object to be set. * @stable ICU 2.0 */ - virtual void setCalendar(const Calendar& newCalendar); - + U_I18N_API virtual void setCalendar(const Calendar& newCalendar); /** * Gets the number formatter which this date/time formatter uses to format @@ -754,7 +734,7 @@ class U_I18N_API DateFormat : public Format { * @return the number formatter which this date/time formatter uses. * @stable ICU 2.0 */ - virtual const NumberFormat* getNumberFormat(void) const; + U_I18N_API virtual const NumberFormat* getNumberFormat() const; /** * Allows you to set the number formatter. The caller should @@ -762,21 +742,21 @@ class U_I18N_API DateFormat : public Format { * @param formatToAdopt NumberFormat object to be adopted. * @stable ICU 2.0 */ - virtual void adoptNumberFormat(NumberFormat* formatToAdopt); + U_I18N_API virtual void adoptNumberFormat(NumberFormat* formatToAdopt); /** * Allows you to set the number formatter. * @param newNumberFormat NumberFormat object to be set. * @stable ICU 2.0 */ - virtual void setNumberFormat(const NumberFormat& newNumberFormat); + U_I18N_API virtual void setNumberFormat(const NumberFormat& newNumberFormat); /** * Returns a reference to the TimeZone used by this DateFormat's calendar. * @return the time zone associated with the calendar of DateFormat. * @stable ICU 2.0 */ - virtual const TimeZone& getTimeZone(void) const; + U_I18N_API virtual const TimeZone& getTimeZone() const; /** * Sets the time zone for the calendar of this DateFormat object. The caller @@ -784,14 +764,14 @@ class U_I18N_API DateFormat : public Format { * @param zoneToAdopt the TimeZone to be adopted. * @stable ICU 2.0 */ - virtual void adoptTimeZone(TimeZone* zoneToAdopt); + U_I18N_API virtual void adoptTimeZone(TimeZone* zoneToAdopt); /** * Sets the time zone for the calendar of this DateFormat object. * @param zone the new time zone. * @stable ICU 2.0 */ - virtual void setTimeZone(const TimeZone& zone); + U_I18N_API virtual void setTimeZone(const TimeZone& zone); /** * Set a particular UDisplayContext value in the formatter, such as @@ -802,7 +782,7 @@ class U_I18N_API DateFormat : public Format { * updated with any new status from the function. * @stable ICU 53 */ - virtual void setContext(UDisplayContext value, UErrorCode& status); + U_I18N_API virtual void setContext(UDisplayContext value, UErrorCode& status); /** * Get the formatter's UDisplayContext value for the specified UDisplayContextType, @@ -814,9 +794,9 @@ class U_I18N_API DateFormat : public Format { * @return The UDisplayContextValue for the specified type. * @stable ICU 53 */ - virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; + U_I18N_API virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; - /** + /** * Sets an boolean attribute on this DateFormat. * May return U_UNSUPPORTED_ERROR if this instance does not support * the specified attribute. @@ -826,10 +806,8 @@ class U_I18N_API DateFormat : public Format { * @return *this - for chaining (example: format.setAttribute(...).setAttribute(...) ) * @stable ICU 53 */ - - virtual DateFormat& U_EXPORT2 setBooleanAttribute(UDateFormatBooleanAttribute attr, - UBool newvalue, - UErrorCode &status); + U_I18N_API virtual DateFormat& U_EXPORT2 setBooleanAttribute(UDateFormatBooleanAttribute attr, + UBool newvalue, UErrorCode& status); /** * Returns a boolean from this DateFormat @@ -840,7 +818,8 @@ class U_I18N_API DateFormat : public Format { * @return the attribute value. Undefined if there is an error. * @stable ICU 53 */ - virtual UBool U_EXPORT2 getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &status) const; + U_I18N_API virtual UBool U_EXPORT2 getBooleanAttribute(UDateFormatBooleanAttribute attr, + UErrorCode& status) const; protected: /** @@ -849,19 +828,19 @@ class U_I18N_API DateFormat : public Format { * the calendar and numberFormat fields. * @stable ICU 2.0 */ - DateFormat(); + U_I18N_API DateFormat(); /** * Copy constructor. * @stable ICU 2.0 */ - DateFormat(const DateFormat&); + U_I18N_API DateFormat(const DateFormat&); /** * Default assignment operator. * @stable ICU 2.0 */ - DateFormat& operator=(const DateFormat&); + U_I18N_API DateFormat& operator=(const DateFormat&); /** * The calendar that DateFormat uses to produce the time field values needed diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h index 6b79c99000e774..24bc7693296cb5 100644 --- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h @@ -83,7 +83,7 @@ U_NAMESPACE_BEGIN * between the last one and the end of the integer is the one that is * used. So "#,##,###,####" == "######,####" == "##,####,####". */ -class U_I18N_API DecimalFormatSymbols : public UObject { +class U_I18N_API_CLASS DecimalFormatSymbols : public UObject { public: /** * Constants for specifying a number format symbol. @@ -187,7 +187,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * failure code upon return. * @stable ICU 2.0 */ - DecimalFormatSymbols(const Locale& locale, UErrorCode& status); + U_I18N_API DecimalFormatSymbols(const Locale& locale, UErrorCode& status); /** * Creates a DecimalFormatSymbols instance for the given locale with digits and symbols @@ -205,7 +205,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * failure code upon return. * @stable ICU 60 */ - DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status); + U_I18N_API DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status); /** * Create a DecimalFormatSymbols object for the default locale. @@ -217,7 +217,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * failure code upon return. * @stable ICU 2.0 */ - DecimalFormatSymbols(UErrorCode& status); + U_I18N_API DecimalFormatSymbols(UErrorCode& status); /** * Creates a DecimalFormatSymbols object with last-resort data. @@ -234,25 +234,25 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return last-resort symbols * @stable ICU 52 */ - static DecimalFormatSymbols* createWithLastResortData(UErrorCode& status); + U_I18N_API static DecimalFormatSymbols* createWithLastResortData(UErrorCode& status); /** * Copy constructor. * @stable ICU 2.0 */ - DecimalFormatSymbols(const DecimalFormatSymbols&); + U_I18N_API DecimalFormatSymbols(const DecimalFormatSymbols&); /** * Assignment operator. * @stable ICU 2.0 */ - DecimalFormatSymbols& operator=(const DecimalFormatSymbols&); + U_I18N_API DecimalFormatSymbols& operator=(const DecimalFormatSymbols&); /** * Destructor. * @stable ICU 2.0 */ - virtual ~DecimalFormatSymbols(); + U_I18N_API virtual ~DecimalFormatSymbols(); /** * Return true if another object is semantically equal to this one. @@ -261,7 +261,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return true if another object is semantically equal to this one. * @stable ICU 2.0 */ - bool operator==(const DecimalFormatSymbols& other) const; + U_I18N_API bool operator==(const DecimalFormatSymbols& other) const; /** * Return true if another object is semantically unequal to this one. @@ -270,7 +270,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return true if another object is semantically unequal to this one. * @stable ICU 2.0 */ - bool operator!=(const DecimalFormatSymbols& other) const { return !operator==(other); } + U_I18N_API bool operator!=(const DecimalFormatSymbols& other) const { return !operator==(other); } /** * Get one of the format symbols by its enum constant. @@ -281,7 +281,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return the format symbols by the param 'symbol' * @stable ICU 2.0 */ - inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const; + U_I18N_API inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const; /** * Set one of the format symbols by its enum constant. @@ -295,7 +295,9 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * it is being set to corresponds to a known Unicode zero digit. * @stable ICU 2.0 */ - void setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propagateDigits); + U_I18N_API void setSymbol(ENumberFormatSymbol symbol, + const UnicodeString& value, + const UBool propagateDigits); #ifndef U_HIDE_INTERNAL_API /** @@ -305,21 +307,21 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * * @internal */ - void setCurrency(const char16_t* currency, UErrorCode& status); + U_I18N_API void setCurrency(const char16_t* currency, UErrorCode& status); #endif // U_HIDE_INTERNAL_API /** * Returns the locale for which this object was constructed. * @stable ICU 2.6 */ - inline Locale getLocale() const; + U_I18N_API inline Locale getLocale() const; /** * Returns the locale for this object. Two flavors are available: * valid and actual locale. * @stable ICU 2.8 */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + U_I18N_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; /** * Get pattern string for 'CurrencySpacing' that can be applied to @@ -337,36 +339,37 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * locales. * @stable ICU 4.8 */ - const UnicodeString& getPatternForCurrencySpacing(UCurrencySpacing type, + U_I18N_API const UnicodeString& getPatternForCurrencySpacing(UCurrencySpacing type, + UBool beforeCurrency, + UErrorCode& status) const; + + /** + * Set pattern string for 'CurrencySpacing' that can be applied to + * currency format. + * + * @param type : UNUM_CURRENCY_MATCH, UNUM_CURRENCY_SURROUNDING_MATCH or UNUM_CURRENCY_INSERT. + * @param beforeCurrency : true if the pattern is for before currency symbol. + * false if the pattern is for after currency symbol. + * @param pattern : pattern string to override current setting. + * @stable ICU 4.8 + */ + U_I18N_API void setPatternForCurrencySpacing(UCurrencySpacing type, UBool beforeCurrency, - UErrorCode& status) const; - /** - * Set pattern string for 'CurrencySpacing' that can be applied to - * currency format. - * - * @param type : UNUM_CURRENCY_MATCH, UNUM_CURRENCY_SURROUNDING_MATCH or UNUM_CURRENCY_INSERT. - * @param beforeCurrency : true if the pattern is for before currency symbol. - * false if the pattern is for after currency symbol. - * @param pattern : pattern string to override current setting. - * @stable ICU 4.8 - */ - void setPatternForCurrencySpacing(UCurrencySpacing type, - UBool beforeCurrency, - const UnicodeString& pattern); + const UnicodeString& pattern); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @stable ICU 2.2 */ - virtual UClassID getDynamicClassID() const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @stable ICU 2.2 */ - static UClassID U_EXPORT2 getStaticClassID(); + U_I18N_API static UClassID getStaticClassID(); private: DecimalFormatSymbols(); @@ -397,21 +400,21 @@ class U_I18N_API DecimalFormatSymbols : public UObject { /** * @internal For ICU use only */ - inline UBool isCustomCurrencySymbol() const { + U_I18N_API inline UBool isCustomCurrencySymbol() const { return fIsCustomCurrencySymbol; } /** * @internal For ICU use only */ - inline UBool isCustomIntlCurrencySymbol() const { + U_I18N_API inline UBool isCustomIntlCurrencySymbol() const { return fIsCustomIntlCurrencySymbol; } /** * @internal For ICU use only */ - inline UChar32 getCodePointZero() const { + U_I18N_API inline UChar32 getCodePointZero() const { return fCodePointZero; } #endif /* U_HIDE_INTERNAL_API */ @@ -431,7 +434,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return the format symbol by the param 'symbol' * @internal */ - inline const UnicodeString& getConstSymbol(ENumberFormatSymbol symbol) const; + U_I18N_API inline const UnicodeString& getConstSymbol(ENumberFormatSymbol symbol) const; #ifndef U_HIDE_INTERNAL_API /** @@ -449,19 +452,19 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @return the format symbol for the given digit. * @internal This API is currently for ICU use only. */ - inline const UnicodeString& getConstDigitSymbol(int32_t digit) const; + U_I18N_API inline const UnicodeString& getConstDigitSymbol(int32_t digit) const; /** * Returns that pattern stored in currency info. Internal API for use by NumberFormat API. * @internal */ - inline const char16_t* getCurrencyPattern(void) const; + U_I18N_API inline const char16_t* getCurrencyPattern() const; /** * Returns the numbering system with which this DecimalFormatSymbols was initialized. * @internal */ - inline const char* getNumberingSystemName(void) const; + U_I18N_API inline const char* getNumberingSystemName() const; #endif /* U_HIDE_INTERNAL_API */ private: @@ -504,8 +507,8 @@ class U_I18N_API DecimalFormatSymbols : public UObject { Locale locale; - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; + Locale actualLocale; + Locale validLocale; const char16_t* currPattern = nullptr; UnicodeString currencySpcBeforeSym[UNUM_CURRENCY_SPACING_COUNT]; @@ -576,7 +579,7 @@ DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString fCodePointZero = sym; for ( int8_t i = 1 ; i<= 9 ; i++ ) { sym++; - fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym); + fSymbols[static_cast<int>(kOneDigitSymbol) + i - 1] = UnicodeString(sym); } } else { fCodePointZero = -1; diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index f72ba687258ffa..d1da0e4f451780 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -60,11 +60,9 @@ class UFormattedNumberData; } } -namespace numparse { -namespace impl { +namespace numparse::impl { class NumberParserImpl; } -} /** * **IMPORTANT:** New users are strongly encouraged to see if @@ -1163,7 +1161,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see DecimalFormatSymbols * @stable ICU 2.0 */ - virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; + virtual const DecimalFormatSymbols* getDecimalFormatSymbols() const; /** * Sets the decimal format symbols, which is generally not changed @@ -1188,7 +1186,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @return desired CurrencyPluralInfo * @stable ICU 4.2 */ - virtual const CurrencyPluralInfo* getCurrencyPluralInfo(void) const; + virtual const CurrencyPluralInfo* getCurrencyPluralInfo() const; /** * Sets the currency plural format information, @@ -1220,7 +1218,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { /** * Set the positive prefix. * - * @param newValue the new value of the the positive prefix to be set. + * @param newValue the new value of the positive prefix to be set. * Examples: +123, $123, sFr123 * @stable ICU 2.0 */ @@ -1239,7 +1237,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { /** * Set the negative prefix. * - * @param newValue the new value of the the negative prefix to be set. + * @param newValue the new value of the negative prefix to be set. * Examples: -123, ($123) (with negative suffix), sFr-123 * @stable ICU 2.0 */ @@ -1315,7 +1313,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 * @stable ICU 2.0 */ - int32_t getMultiplier(void) const; + int32_t getMultiplier() const; /** * Set the multiplier for use in percent, permill, etc. @@ -1344,7 +1342,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @return the current value of the power-of-ten multiplier. * @stable ICU 62 */ - int32_t getMultiplierScale(void) const; + int32_t getMultiplierScale() const; /** * Sets a power of ten by which number should be multiplied before formatting, which @@ -1376,7 +1374,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setRoundingMode * @stable ICU 2.0 */ - virtual double getRoundingIncrement(void) const; + virtual double getRoundingIncrement() const; /** * Set the rounding increment. In the absence of a rounding increment, @@ -1399,7 +1397,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setRoundingMode * @stable ICU 2.0 */ - virtual ERoundingMode getRoundingMode(void) const override; + virtual ERoundingMode getRoundingMode() const override; /** * Set the rounding mode. @@ -1422,7 +1420,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setPadPosition * @stable ICU 2.0 */ - virtual int32_t getFormatWidth(void) const; + virtual int32_t getFormatWidth() const; /** * Set the width to which the output of format() is padded. @@ -1485,7 +1483,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #EPadPosition * @stable ICU 2.0 */ - virtual EPadPosition getPadPosition(void) const; + virtual EPadPosition getPadPosition() const; /** * Set the position at which padding will take place. This is the location @@ -1515,7 +1513,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setExponentSignAlwaysShown * @stable ICU 2.0 */ - virtual UBool isScientificNotation(void) const; + virtual UBool isScientificNotation() const; /** * Set whether or not scientific notation is used. When scientific notation @@ -1544,7 +1542,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setExponentSignAlwaysShown * @stable ICU 2.0 */ - virtual int8_t getMinimumExponentDigits(void) const; + virtual int8_t getMinimumExponentDigits() const; /** * Set the minimum exponent digits that will be shown. This has no @@ -1572,7 +1570,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see #setExponentSignAlwaysShown * @stable ICU 2.0 */ - virtual UBool isExponentSignAlwaysShown(void) const; + virtual UBool isExponentSignAlwaysShown() const; /** * Set whether the exponent sign is always shown. This has no effect @@ -1600,7 +1598,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see DecimalFormatSymbols::getGroupingSeparator * @stable ICU 2.0 */ - int32_t getGroupingSize(void) const; + int32_t getGroupingSize() const; /** * Set the grouping size. Grouping size is the number of digits between @@ -1633,7 +1631,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @see DecimalFormatSymbols::getGroupingSeparator * @stable ICU 2.4 */ - int32_t getSecondaryGroupingSize(void) const; + int32_t getSecondaryGroupingSize() const; /** * Set the secondary grouping size. If set to a value less than 1, @@ -1700,7 +1698,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 * @stable ICU 2.0 */ - UBool isDecimalSeparatorAlwaysShown(void) const; + UBool isDecimalSeparatorAlwaysShown() const; /** * Allows you to set the behavior of the decimal separator with integers. @@ -1718,7 +1716,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @return true if input must contain a match to decimal mark in pattern * @stable ICU 54 */ - UBool isDecimalPatternMatchRequired(void) const; + UBool isDecimalPatternMatchRequired() const; /** * Allows you to set the parse behavior of the pattern decimal mark. @@ -2124,7 +2122,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. @@ -2137,7 +2135,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * other classes have different class IDs. * @stable ICU 2.0 */ - UClassID getDynamicClassID(void) const override; + UClassID getDynamicClassID() const override; private: diff --git a/deps/icu-small/source/i18n/unicode/dtfmtsym.h b/deps/icu-small/source/i18n/unicode/dtfmtsym.h index 3cd54092e0e3a7..23983f5758d81c 100644 --- a/deps/icu-small/source/i18n/unicode/dtfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dtfmtsym.h @@ -81,7 +81,7 @@ class Hashtable; * locale at least contains any resources that are to be particularized for the * calendar type. */ -class U_I18N_API DateFormatSymbols final : public UObject { +class U_I18N_API_CLASS DateFormatSymbols final : public UObject { public: /** * Construct a DateFormatSymbols object by loading format data from @@ -96,7 +96,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * found or cannot be loaded * @stable ICU 2.0 */ - DateFormatSymbols(UErrorCode& status); + U_I18N_API DateFormatSymbols(UErrorCode& status); /** * Construct a DateFormatSymbols object by loading format data from @@ -108,8 +108,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * found or cannot be loaded * @stable ICU 2.0 */ - DateFormatSymbols(const Locale& locale, - UErrorCode& status); + U_I18N_API DateFormatSymbols(const Locale& locale, UErrorCode& status); #ifndef U_HIDE_INTERNAL_API /** @@ -128,7 +127,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * found or cannot be loaded * @internal */ - DateFormatSymbols(const char *type, UErrorCode& status); + U_I18N_API DateFormatSymbols(const char* type, UErrorCode& status); /** * Construct a DateFormatSymbols object by loading format data from @@ -143,29 +142,27 @@ class U_I18N_API DateFormatSymbols final : public UObject { * found or cannot be loaded * @internal */ - DateFormatSymbols(const Locale& locale, - const char *type, - UErrorCode& status); + U_I18N_API DateFormatSymbols(const Locale& locale, const char* type, UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ /** * Copy constructor. * @stable ICU 2.0 */ - DateFormatSymbols(const DateFormatSymbols&); + U_I18N_API DateFormatSymbols(const DateFormatSymbols&); /** * Assignment operator. * @stable ICU 2.0 */ - DateFormatSymbols& operator=(const DateFormatSymbols&); + U_I18N_API DateFormatSymbols& operator=(const DateFormatSymbols&); /** * Destructor. This is nonvirtual because this class is not designed to be * subclassed. * @stable ICU 2.0 */ - virtual ~DateFormatSymbols(); + U_I18N_API virtual ~DateFormatSymbols(); /** * Return true if another object is semantically equal to this one. @@ -174,7 +171,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return true if other is semantically equal to this. * @stable ICU 2.0 */ - bool operator==(const DateFormatSymbols& other) const; + U_I18N_API bool operator==(const DateFormatSymbols& other) const; /** * Return true if another object is semantically unequal to this one. @@ -183,7 +180,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return true if other is semantically unequal to this. * @stable ICU 2.0 */ - bool operator!=(const DateFormatSymbols& other) const { return !operator==(other); } + U_I18N_API bool operator!=(const DateFormatSymbols& other) const { return !operator==(other); } /** * Gets abbreviated era strings. For example: "AD" and "BC". @@ -192,7 +189,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the era strings. * @stable ICU 2.0 */ - const UnicodeString* getEras(int32_t& count) const; + U_I18N_API const UnicodeString* getEras(int32_t& count) const; /** * Sets abbreviated era strings. For example: "AD" and "BC". @@ -200,7 +197,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 2.0 */ - void setEras(const UnicodeString* eras, int32_t count); + U_I18N_API void setEras(const UnicodeString* eras, int32_t count); /** * Gets era name strings. For example: "Anno Domini" and "Before Christ". @@ -209,7 +206,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the era name strings. * @stable ICU 3.4 */ - const UnicodeString* getEraNames(int32_t& count) const; + U_I18N_API const UnicodeString* getEraNames(int32_t& count) const; /** * Sets era name strings. For example: "Anno Domini" and "Before Christ". @@ -217,7 +214,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 3.6 */ - void setEraNames(const UnicodeString* eraNames, int32_t count); + U_I18N_API void setEraNames(const UnicodeString* eraNames, int32_t count); /** * Gets narrow era strings. For example: "A" and "B". @@ -226,7 +223,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the narrow era strings. * @stable ICU 4.2 */ - const UnicodeString* getNarrowEras(int32_t& count) const; + U_I18N_API const UnicodeString* getNarrowEras(int32_t& count) const; /** * Sets narrow era strings. For example: "A" and "B". @@ -234,7 +231,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 4.2 */ - void setNarrowEras(const UnicodeString* narrowEras, int32_t count); + U_I18N_API void setNarrowEras(const UnicodeString* narrowEras, int32_t count); /** * Gets month strings. For example: "January", "February", etc. @@ -242,7 +239,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the month strings. (DateFormatSymbols retains ownership.) * @stable ICU 2.0 */ - const UnicodeString* getMonths(int32_t& count) const; + U_I18N_API const UnicodeString* getMonths(int32_t& count) const; /** * Sets month strings. For example: "January", "February", etc. @@ -251,7 +248,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 2.0 */ - void setMonths(const UnicodeString* months, int32_t count); + U_I18N_API void setMonths(const UnicodeString* months, int32_t count); /** * Gets short month strings. For example: "Jan", "Feb", etc. @@ -260,7 +257,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the short month strings. (DateFormatSymbols retains ownership.) * @stable ICU 2.0 */ - const UnicodeString* getShortMonths(int32_t& count) const; + U_I18N_API const UnicodeString* getShortMonths(int32_t& count) const; /** * Sets short month strings. For example: "Jan", "Feb", etc. @@ -268,7 +265,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param shortMonths the new short month strings. (not adopted; caller retains ownership) * @stable ICU 2.0 */ - void setShortMonths(const UnicodeString* shortMonths, int32_t count); + U_I18N_API void setShortMonths(const UnicodeString* shortMonths, int32_t count); /** * Selector for date formatting context @@ -316,7 +313,9 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the month strings. (DateFormatSymbols retains ownership.) * @stable ICU 3.4 */ - const UnicodeString* getMonths(int32_t& count, DtContextType context, DtWidthType width) const; + U_I18N_API const UnicodeString* getMonths(int32_t& count, + DtContextType context, + DtWidthType width) const; /** * Sets month strings by width and context. For example: "January", "February", etc. @@ -327,7 +326,10 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW. * @stable ICU 3.6 */ - void setMonths(const UnicodeString* months, int32_t count, DtContextType context, DtWidthType width); + U_I18N_API void setMonths(const UnicodeString* months, + int32_t count, + DtContextType context, + DtWidthType width); /** * Gets wide weekday strings. For example: "Sunday", "Monday", etc. @@ -335,8 +337,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the weekday strings. (DateFormatSymbols retains ownership.) * @stable ICU 2.0 */ - const UnicodeString* getWeekdays(int32_t& count) const; - + U_I18N_API const UnicodeString* getWeekdays(int32_t& count) const; /** * Sets wide weekday strings. For example: "Sunday", "Monday", etc. @@ -344,7 +345,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 2.0 */ - void setWeekdays(const UnicodeString* weekdays, int32_t count); + U_I18N_API void setWeekdays(const UnicodeString* weekdays, int32_t count); /** * Gets abbreviated weekday strings. For example: "Sun", "Mon", etc. (Note: The method name is @@ -353,7 +354,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the abbreviated weekday strings. (DateFormatSymbols retains ownership.) * @stable ICU 2.0 */ - const UnicodeString* getShortWeekdays(int32_t& count) const; + U_I18N_API const UnicodeString* getShortWeekdays(int32_t& count) const; /** * Sets abbreviated weekday strings. For example: "Sun", "Mon", etc. (Note: The method name is @@ -362,7 +363,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param count Filled in with length of the array. * @stable ICU 2.0 */ - void setShortWeekdays(const UnicodeString* abbrevWeekdays, int32_t count); + U_I18N_API void setShortWeekdays(const UnicodeString* abbrevWeekdays, int32_t count); /** * Gets weekday strings by width and context. For example: "Sunday", "Monday", etc. @@ -372,7 +373,9 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the month strings. (DateFormatSymbols retains ownership.) * @stable ICU 3.4 */ - const UnicodeString* getWeekdays(int32_t& count, DtContextType context, DtWidthType width) const; + U_I18N_API const UnicodeString* getWeekdays(int32_t& count, + DtContextType context, + DtWidthType width) const; /** * Sets weekday strings by width and context. For example: "Sunday", "Monday", etc. @@ -382,7 +385,10 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param width The width of returned strings, either WIDE, ABBREVIATED, SHORT, or NARROW * @stable ICU 3.6 */ - void setWeekdays(const UnicodeString* weekdays, int32_t count, DtContextType context, DtWidthType width); + U_I18N_API void setWeekdays(const UnicodeString* weekdays, + int32_t count, + DtContextType context, + DtWidthType width); /** * Gets quarter strings by width and context. For example: "1st Quarter", "2nd Quarter", etc. @@ -392,34 +398,66 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the quarter strings. (DateFormatSymbols retains ownership.) * @stable ICU 3.6 */ - const UnicodeString* getQuarters(int32_t& count, DtContextType context, DtWidthType width) const; + U_I18N_API const UnicodeString* getQuarters(int32_t& count, + DtContextType context, + DtWidthType width) const; /** * Sets quarter strings by width and context. For example: "1st Quarter", "2nd Quarter", etc. * * @param quarters The new quarter strings. (not adopted; caller retains ownership) - * @param count Filled in with length of the array. + * @param count The number of strings in the array. * @param context The formatting context, either FORMAT or STANDALONE - * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW. + * @param width The width of set strings, either WIDE, ABBREVIATED, or NARROW. * @stable ICU 3.6 */ - void setQuarters(const UnicodeString* quarters, int32_t count, DtContextType context, DtWidthType width); + U_I18N_API void setQuarters(const UnicodeString* quarters, + int32_t count, + DtContextType context, + DtWidthType width); /** * Gets AM/PM strings. For example: "AM" and "PM". - * @param count Filled in with length of the array. - * @return the weekday strings. (DateFormatSymbols retains ownership.) + * @param count Filled in with length of the array. + * @return The AM/PM strings. (DateFormatSymbols retains ownership.) * @stable ICU 2.0 */ - const UnicodeString* getAmPmStrings(int32_t& count) const; + U_I18N_API const UnicodeString* getAmPmStrings(int32_t& count) const; /** * Sets ampm strings. For example: "AM" and "PM". - * @param ampms the new ampm strings. (not adopted; caller retains ownership) - * @param count Filled in with length of the array. + * @param ampms The new ampm strings. (not adopted; caller retains ownership) + * @param count The number of strings in the array. * @stable ICU 2.0 */ - void setAmPmStrings(const UnicodeString* ampms, int32_t count); + U_I18N_API void setAmPmStrings(const UnicodeString* ampms, int32_t count); + +#ifndef U_HIDE_DRAFT_API + /** + * Gets AM/PM strings with the specified width. For example: "A" and "P". + * @param count Filled in with length of the array. + * @param context The usage context. Currently ignored; FORMAT names always returned. + * @param width The width of returned strings, either WIDE, ABBREVIATED, or NARROW. + * @return The AM/PM strings. (DateFormatSymbols retains ownership.) + * @draft ICU 78 + */ + U_I18N_API const UnicodeString* getAmPmStrings(int32_t& count, + DtContextType context, + DtWidthType width) const; + + /** + * Sets AM/PM strings with the specified width. For example: "A" and "P". + * @param ampms The new AM/PM strings. (not adopted; caller retains ownership) + * @param count The number of strings in the array. + * @param context The usage context. Currently ignored; always sets FORMAT names. + * @param width The width of set strings, either WIDE, ABBREVIATED, or NARROW. + * @draft ICU 78 + */ + U_I18N_API void setAmPmStrings(const UnicodeString* ampms, + int32_t count, + DtContextType context, + DtWidthType width); +#endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_INTERNAL_API /** @@ -427,13 +465,13 @@ class U_I18N_API DateFormatSymbols final : public UObject { * doesn't specify any time separator, and always recognized when parsing. * @internal */ - static const char16_t DEFAULT_TIME_SEPARATOR = 0x003a; // ':' + U_I18N_API static const char16_t DEFAULT_TIME_SEPARATOR = 0x003a; // ':' /** * This alternate time separator is always recognized when parsing. * @internal */ - static const char16_t ALTERNATE_TIME_SEPARATOR = 0x002e; // '.' + U_I18N_API static const char16_t ALTERNATE_TIME_SEPARATOR = 0x002e; // '.' /** * Gets the time separator string. For example: ":". @@ -441,14 +479,14 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return A reference to 'result'. * @internal */ - UnicodeString& getTimeSeparatorString(UnicodeString& result) const; + U_I18N_API UnicodeString& getTimeSeparatorString(UnicodeString& result) const; /** * Sets the time separator string. For example: ":". * @param newTimeSeparator the new time separator string. * @internal */ - void setTimeSeparatorString(const UnicodeString& newTimeSeparator); + U_I18N_API void setTimeSeparatorString(const UnicodeString& newTimeSeparator); #endif /* U_HIDE_INTERNAL_API */ /** @@ -461,8 +499,9 @@ class U_I18N_API DateFormatSymbols final : public UObject { * or null if they are not available for this calendar. * @stable ICU 54 */ - const UnicodeString* getYearNames(int32_t& count, - DtContextType context, DtWidthType width) const; + U_I18N_API const UnicodeString* getYearNames(int32_t& count, + DtContextType context, + DtWidthType width) const; /** * Sets cyclic year name strings by width and context. For example: "jia-zi", "yi-chou", etc. @@ -473,8 +512,10 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param width The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported). * @stable ICU 54 */ - void setYearNames(const UnicodeString* yearNames, int32_t count, - DtContextType context, DtWidthType width); + U_I18N_API void setYearNames(const UnicodeString* yearNames, + int32_t count, + DtContextType context, + DtWidthType width); /** * Gets calendar zodiac name strings if the calendar has them, by width and context. @@ -486,8 +527,9 @@ class U_I18N_API DateFormatSymbols final : public UObject { * or null if they are not available for this calendar. * @stable ICU 54 */ - const UnicodeString* getZodiacNames(int32_t& count, - DtContextType context, DtWidthType width) const; + U_I18N_API const UnicodeString* getZodiacNames(int32_t& count, + DtContextType context, + DtWidthType width) const; /** * Sets calendar zodiac name strings by width and context. For example: "Rat", "Ox", "Tiger", etc. @@ -498,8 +540,10 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param width The name width: WIDE, ABBREVIATED, NARROW (currently only ABBREVIATED is supported). * @stable ICU 54 */ - void setZodiacNames(const UnicodeString* zodiacNames, int32_t count, - DtContextType context, DtWidthType width); + U_I18N_API void setZodiacNames(const UnicodeString* zodiacNames, + int32_t count, + DtContextType context, + DtWidthType width); #ifndef U_HIDE_INTERNAL_API /** @@ -534,7 +578,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * May be nullptr if there are no leap month patterns for this calendar. * @internal */ - const UnicodeString* getLeapMonthPatterns(int32_t& count) const; + U_I18N_API const UnicodeString* getLeapMonthPatterns(int32_t& count) const; #endif /* U_HIDE_INTERNAL_API */ @@ -546,7 +590,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return The timezone strings as a 2-d array. (DateFormatSymbols retains ownership.) * @deprecated ICU 3.6 */ - const UnicodeString** getZoneStrings(int32_t& rowCount, int32_t& columnCount) const; + U_I18N_API const UnicodeString** getZoneStrings(int32_t& rowCount, int32_t& columnCount) const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -560,14 +604,16 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @param columnCount The number of columns (count of second index). * @stable ICU 2.0 */ - void setZoneStrings(const UnicodeString* const* strings, int32_t rowCount, int32_t columnCount); + U_I18N_API void setZoneStrings(const UnicodeString* const* strings, + int32_t rowCount, + int32_t columnCount); /** * Get the non-localized date-time pattern characters. * @return the non-localized date-time pattern characters * @stable ICU 2.0 */ - static const char16_t * U_EXPORT2 getPatternUChars(void); + U_I18N_API static const char16_t* getPatternUChars(); /** * Gets localized date-time pattern characters. For example: 'u', 't', etc. @@ -579,7 +625,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return A reference to 'result'. * @stable ICU 2.0 */ - UnicodeString& getLocalPatternChars(UnicodeString& result) const; + U_I18N_API UnicodeString& getLocalPatternChars(UnicodeString& result) const; /** * Sets localized date-time pattern characters. For example: 'u', 't', etc. @@ -587,14 +633,14 @@ class U_I18N_API DateFormatSymbols final : public UObject { * pattern characters. * @stable ICU 2.0 */ - void setLocalPatternChars(const UnicodeString& newLocalPatternChars); + U_I18N_API void setLocalPatternChars(const UnicodeString& newLocalPatternChars); /** * Returns the locale for this object. Two flavors are available: * valid and actual locale. * @stable ICU 2.8 */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + U_I18N_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; /* The following type and kCapContextUsageTypeCount cannot be #ifndef U_HIDE_INTERNAL_API, they are needed for .h file declarations. */ @@ -628,14 +674,14 @@ class U_I18N_API DateFormatSymbols final : public UObject { * * @stable ICU 2.2 */ - virtual UClassID getDynamicClassID() const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @stable ICU 2.2 */ - static UClassID U_EXPORT2 getStaticClassID(); + U_I18N_API static UClassID getStaticClassID(); private: @@ -750,6 +796,13 @@ class U_I18N_API DateFormatSymbols final : public UObject { UnicodeString* fAmPms; int32_t fAmPmsCount; + /** + * Wide Ampm strings. For example: "ante meridiem" and "post meridiem". + * These strings are uncommon but exist in a handful of locales. + */ + UnicodeString* fWideAmPms; + int32_t fWideAmPmsCount; + /** * Narrow Ampm strings. For example: "a" and "p". */ @@ -917,8 +970,8 @@ class U_I18N_API DateFormatSymbols final : public UObject { /** valid/actual locale information * these are always ICU locales, so the length should not be a problem */ - char validLocale[ULOC_FULLNAME_CAPACITY]; - char actualLocale[ULOC_FULLNAME_CAPACITY]; + Locale validLocale; + Locale actualLocale; DateFormatSymbols() = delete; // default constructor not implemented @@ -971,7 +1024,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { /** * Delete all the storage owned by this object. */ - void dispose(void); + void dispose(); /** * Copy all of the other's data to this. @@ -982,12 +1035,12 @@ class U_I18N_API DateFormatSymbols final : public UObject { /** * Create zone strings array by locale if not yet available */ - void initZoneStringsArray(void); + void initZoneStringsArray(); /** * Delete just the zone strings. */ - void disposeZoneStrings(void); + void disposeZoneStrings(); /** * Returns the date format field index of the pattern character c, @@ -1017,8 +1070,7 @@ class U_I18N_API DateFormatSymbols final : public UObject { * @return the new DateFormatSymbols which the caller owns. * @internal For ICU use only. */ - static DateFormatSymbols * U_EXPORT2 createForLocale( - const Locale &locale, UErrorCode &status); + U_I18N_API static DateFormatSymbols* createForLocale(const Locale& locale, UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ }; diff --git a/deps/icu-small/source/i18n/unicode/dtitvfmt.h b/deps/icu-small/source/i18n/unicode/dtitvfmt.h index b4dc8cabf04572..654aba668f2109 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvfmt.h +++ b/deps/icu-small/source/i18n/unicode/dtitvfmt.h @@ -297,7 +297,7 @@ class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue { * \endcode * </pre> */ -class U_I18N_API DateIntervalFormat : public Format { +class U_I18N_API_CLASS DateIntervalFormat : public Format { public: /** @@ -313,9 +313,8 @@ class U_I18N_API DateIntervalFormat : public Format { * @return a date time interval formatter which the caller owns. * @stable ICU 4.0 */ - static DateIntervalFormat* U_EXPORT2 createInstance( - const UnicodeString& skeleton, - UErrorCode& status); + U_I18N_API static DateIntervalFormat* createInstance(const UnicodeString& skeleton, + UErrorCode& status); /** * Construct a DateIntervalFormat from skeleton and a given locale. @@ -344,17 +343,11 @@ class U_I18N_API DateIntervalFormat : public Format { * @param status output param set to success/failure code on exit * @return a date time interval formatter which the caller owns. * @stable ICU 4.0 - * <p> - * <h4>Sample code</h4> - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined1 - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined - * <p> */ - static DateIntervalFormat* U_EXPORT2 createInstance( - const UnicodeString& skeleton, - const Locale& locale, - UErrorCode& status); + U_I18N_API static DateIntervalFormat* createInstance(const UnicodeString& skeleton, + const Locale& locale, + UErrorCode& status); /** * Construct a DateIntervalFormat from skeleton @@ -371,10 +364,9 @@ class U_I18N_API DateIntervalFormat : public Format { * @return a date time interval formatter which the caller owns. * @stable ICU 4.0 */ - static DateIntervalFormat* U_EXPORT2 createInstance( - const UnicodeString& skeleton, - const DateIntervalInfo& dtitvinf, - UErrorCode& status); + U_I18N_API static DateIntervalFormat* createInstance(const UnicodeString& skeleton, + const DateIntervalInfo& dtitvinf, + UErrorCode& status); /** * Construct a DateIntervalFormat from skeleton @@ -410,23 +402,17 @@ class U_I18N_API DateIntervalFormat : public Format { * @param status output param set to success/failure code on exit * @return a date time interval formatter which the caller owns. * @stable ICU 4.0 - * <p> - * <h4>Sample code</h4> - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtPreDefined1 - * \snippet samples/dtitvfmtsample/dtitvfmtsample.cpp dtitvfmtCustomized - * <p> */ - static DateIntervalFormat* U_EXPORT2 createInstance( - const UnicodeString& skeleton, - const Locale& locale, - const DateIntervalInfo& dtitvinf, - UErrorCode& status); + U_I18N_API static DateIntervalFormat* createInstance(const UnicodeString& skeleton, + const Locale& locale, + const DateIntervalInfo& dtitvinf, + UErrorCode& status); /** * Destructor. * @stable ICU 4.0 */ - virtual ~DateIntervalFormat(); + U_I18N_API virtual ~DateIntervalFormat(); /** * Clone this Format object polymorphically. The caller owns the result and @@ -434,7 +420,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return A copy of the object. * @stable ICU 4.0 */ - virtual DateIntervalFormat* clone() const override; + U_I18N_API virtual DateIntervalFormat* clone() const override; /** * Return true if the given Format objects are semantically equal. Objects @@ -443,7 +429,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return true if the given Format objects are semantically equal. * @stable ICU 4.0 */ - virtual bool operator==(const Format& other) const override; + U_I18N_API virtual bool operator==(const Format& other) const override; /** * Return true if the given Format objects are not semantically equal. @@ -452,8 +438,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return true if the given Format objects are not semantically equal. * @stable ICU 4.0 */ - bool operator!=(const Format& other) const; - + U_I18N_API bool operator!=(const Format& other) const; using Format::format; @@ -476,12 +461,10 @@ class U_I18N_API DateIntervalFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.0 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPosition& fieldPosition, - UErrorCode& status) const override; - - + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& fieldPosition, + UErrorCode& status) const override; /** * Format a DateInterval to produce a string. @@ -498,10 +481,10 @@ class U_I18N_API DateIntervalFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.0 */ - UnicodeString& format(const DateInterval* dtInterval, - UnicodeString& appendTo, - FieldPosition& fieldPosition, - UErrorCode& status) const ; + U_I18N_API UnicodeString& format(const DateInterval* dtInterval, + UnicodeString& appendTo, + FieldPosition& fieldPosition, + UErrorCode& status) const; /** * Format a DateInterval to produce a FormattedDateInterval. @@ -513,9 +496,8 @@ class U_I18N_API DateIntervalFormat : public Format { * @return A FormattedDateInterval containing the format result. * @stable ICU 64 */ - FormattedDateInterval formatToValue( - const DateInterval& dtInterval, - UErrorCode& status) const; + U_I18N_API FormattedDateInterval formatToValue(const DateInterval& dtInterval, + UErrorCode& status) const; /** * Format 2 Calendars to produce a string. @@ -540,11 +522,11 @@ class U_I18N_API DateIntervalFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.0 */ - UnicodeString& format(Calendar& fromCalendar, - Calendar& toCalendar, - UnicodeString& appendTo, - FieldPosition& fieldPosition, - UErrorCode& status) const ; + U_I18N_API UnicodeString& format(Calendar& fromCalendar, + Calendar& toCalendar, + UnicodeString& appendTo, + FieldPosition& fieldPosition, + UErrorCode& status) const; /** * Format 2 Calendars to produce a FormattedDateInterval. @@ -562,10 +544,9 @@ class U_I18N_API DateIntervalFormat : public Format { * @return A FormattedDateInterval containing the format result. * @stable ICU 64 */ - FormattedDateInterval formatToValue( - Calendar& fromCalendar, - Calendar& toCalendar, - UErrorCode& status) const; + U_I18N_API FormattedDateInterval formatToValue(Calendar& fromCalendar, + Calendar& toCalendar, + UErrorCode& status) const; /** * Date interval parsing is not supported. Please do not use. @@ -593,10 +574,9 @@ class U_I18N_API DateIntervalFormat : public Format { * delete it when done. * @internal ICU 4.0 */ - virtual void parseObject(const UnicodeString& source, - Formattable& result, - ParsePosition& parse_pos) const override; - + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const override; /** * Gets the date time interval patterns. @@ -604,8 +584,7 @@ class U_I18N_API DateIntervalFormat : public Format { * this date interval formatter. * @stable ICU 4.0 */ - const DateIntervalInfo* getDateIntervalInfo(void) const; - + U_I18N_API const DateIntervalInfo* getDateIntervalInfo() const; /** * Set the date time interval patterns. @@ -613,9 +592,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @param status output param set to success/failure code on exit * @stable ICU 4.0 */ - void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns, - UErrorCode& status); - + U_I18N_API void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns, UErrorCode& status); /** * Gets the date formatter. The DateIntervalFormat instance continues to own @@ -628,14 +605,14 @@ class U_I18N_API DateIntervalFormat : public Format { * @return the date formatter associated with this date interval formatter. * @stable ICU 4.0 */ - const DateFormat* getDateFormat(void) const; + U_I18N_API const DateFormat* getDateFormat() const; /** * Returns a reference to the TimeZone used by this DateIntervalFormat's calendar. * @return the time zone associated with the calendar of DateIntervalFormat. * @stable ICU 4.8 */ - virtual const TimeZone& getTimeZone(void) const; + U_I18N_API virtual const TimeZone& getTimeZone() const; /** * Sets the time zone for the calendar used by this DateIntervalFormat object. The @@ -643,14 +620,14 @@ class U_I18N_API DateIntervalFormat : public Format { * @param zoneToAdopt the TimeZone to be adopted. * @stable ICU 4.8 */ - virtual void adoptTimeZone(TimeZone* zoneToAdopt); + U_I18N_API virtual void adoptTimeZone(TimeZone* zoneToAdopt); /** * Sets the time zone for the calendar used by this DateIntervalFormat object. * @param zone the new time zone. * @stable ICU 4.8 */ - virtual void setTimeZone(const TimeZone& zone); + U_I18N_API virtual void setTimeZone(const TimeZone& zone); /** * Set a particular UDisplayContext value in the formatter, such as @@ -664,7 +641,7 @@ class U_I18N_API DateIntervalFormat : public Format { * updated with any new status from the function. * @stable ICU 68 */ - virtual void setContext(UDisplayContext value, UErrorCode& status); + U_I18N_API virtual void setContext(UDisplayContext value, UErrorCode& status); /** * Get the formatter's UDisplayContext value for the specified UDisplayContextType, @@ -676,7 +653,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return The UDisplayContextValue for the specified type. * @stable ICU 68 */ - virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; + U_I18N_API virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; /** * Return the class ID for this class. This is useful only for comparing to @@ -689,7 +666,7 @@ class U_I18N_API DateIntervalFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 4.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -702,7 +679,7 @@ class U_I18N_API DateIntervalFormat : public Format { * other classes have different class IDs. * @stable ICU 4.0 */ - virtual UClassID getDynamicClassID(void) const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; protected: @@ -755,7 +732,6 @@ class U_I18N_API DateIntervalFormat : public Format { /** * default constructor - * @internal (private) */ DateIntervalFormat(); @@ -793,10 +769,10 @@ class U_I18N_API DateIntervalFormat : public Format { * @param status Output param set to success/failure code. * @return a date time interval formatter which the caller owns. */ - static DateIntervalFormat* U_EXPORT2 create(const Locale& locale, - DateIntervalInfo* dtitvinf, - const UnicodeString* skeleton, - UErrorCode& status); + U_I18N_API static DateIntervalFormat* create(const Locale& locale, + DateIntervalInfo* dtitvinf, + const UnicodeString* skeleton, + UErrorCode& status); /** * Below are for generating interval patterns local to the formatter @@ -831,7 +807,6 @@ class U_I18N_API DateIntervalFormat : public Format { * @param fphandler See formatImpl for more information. * @param status output param set to success/failure code on exit * @return Reference to 'appendTo' parameter. - * @internal (private) */ UnicodeString& fallbackFormat(Calendar& fromCalendar, Calendar& toCalendar, @@ -931,13 +906,11 @@ class U_I18N_API DateIntervalFormat : public Format { * skeleton. * */ - static void U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton, - UnicodeString& date, - UnicodeString& normalizedDate, - UnicodeString& time, - UnicodeString& normalizedTime); - - + U_I18N_API static void getDateTimeSkeleton(const UnicodeString& skeleton, + UnicodeString& date, + UnicodeString& normalizedDate, + UnicodeString& time, + UnicodeString& normalizedTime); /** * Generate date or time interval pattern from resource, @@ -1027,13 +1000,12 @@ class U_I18N_API DateIntervalFormat : public Format { * @param suppressDayPeriodField if true, remove the day period field from the pattern, if there is one * @param adjustedIntervalPattern adjusted interval pattern */ - static void U_EXPORT2 adjustFieldWidth( - const UnicodeString& inputSkeleton, - const UnicodeString& bestMatchSkeleton, - const UnicodeString& bestMatchIntervalPattern, - int8_t differenceInfo, - UBool suppressDayPeriodField, - UnicodeString& adjustedIntervalPattern); + U_I18N_API static void adjustFieldWidth(const UnicodeString& inputSkeleton, + const UnicodeString& bestMatchSkeleton, + const UnicodeString& bestMatchIntervalPattern, + int8_t differenceInfo, + UBool suppressDayPeriodField, + UnicodeString& adjustedIntervalPattern); /** * Does the same thing as UnicodeString::findAndReplace(), except that it won't perform @@ -1042,9 +1014,9 @@ class U_I18N_API DateIntervalFormat : public Format { * @param strToReplace The string to search for and replace in the target string. * @param strToReplaceWith The string to substitute in wherever `stringToReplace` was found. */ - static void U_EXPORT2 findReplaceInPattern(UnicodeString& targetString, - const UnicodeString& strToReplace, - const UnicodeString& strToReplaceWith); + U_I18N_API static void findReplaceInPattern(UnicodeString& targetString, + const UnicodeString& strToReplace, + const UnicodeString& strToReplaceWith); /** * Concat a single date pattern with a time interval pattern, @@ -1068,17 +1040,15 @@ class U_I18N_API DateIntervalFormat : public Format { * @param skeleton given skeleton on which to check the calendar field * @return true if field present in a skeleton. */ - static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field, - const UnicodeString& skeleton); - + U_I18N_API static UBool fieldExistsInSkeleton(UCalendarDateFields field, + const UnicodeString& skeleton); /** * Split interval patterns into 2 part. * @param intervalPattern interval pattern * @return the index in interval pattern which split the pattern into 2 part */ - static int32_t U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern); - + U_I18N_API static int32_t splitPatternInto2Part(const UnicodeString& intervalPattern); /** * Break interval patterns as 2 part and save them into pattern info. @@ -1137,7 +1107,6 @@ class U_I18N_API DateIntervalFormat : public Format { * Caller needs to make sure it is SUCCESS * at the function entrance * @return Reference to 'appendTo' parameter. - * @internal (private) */ UnicodeString& formatImpl(Calendar& fromCalendar, Calendar& toCalendar, diff --git a/deps/icu-small/source/i18n/unicode/dtitvinf.h b/deps/icu-small/source/i18n/unicode/dtitvinf.h index 5b9a45351c2630..6d93310a2ee06e 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvinf.h +++ b/deps/icu-small/source/i18n/unicode/dtitvinf.h @@ -197,14 +197,13 @@ class U_I18N_API DateIntervalInfo final : public UObject { * @return a copy of the object * @stable ICU 4.0 */ - virtual DateIntervalInfo* clone() const; + DateIntervalInfo* clone() const; /** * Destructor. - * It is virtual to be safe, but it is not designed to be subclassed. * @stable ICU 4.0 */ - virtual ~DateIntervalInfo(); + ~DateIntervalInfo(); /** @@ -214,7 +213,7 @@ class U_I18N_API DateIntervalInfo final : public UObject { * @return true if other is semantically equal to this. * @stable ICU 4.0 */ - virtual bool operator==(const DateIntervalInfo& other) const; + bool operator==(const DateIntervalInfo& other) const; /** * Return true if another object is semantically unequal to this one. diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index 8c374a3094376c..f73450e1100a42 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -55,7 +55,7 @@ class SharedDateTimePatternGenerator; * That would be useful for getting the UI order of field elements.</i> * @stable ICU 3.8 **/ -class U_I18N_API DateTimePatternGenerator : public UObject { +class U_I18N_API_CLASS DateTimePatternGenerator : public UObject { public: /** * Construct a flexible generator according to default locale. @@ -63,7 +63,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @stable ICU 3.8 */ - static DateTimePatternGenerator* U_EXPORT2 createInstance(UErrorCode& status); + U_I18N_API static DateTimePatternGenerator* createInstance(UErrorCode& status); /** * Construct a flexible generator according to data for a given locale. @@ -72,7 +72,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @stable ICU 3.8 */ - static DateTimePatternGenerator* U_EXPORT2 createInstance(const Locale& uLocale, UErrorCode& status); + U_I18N_API static DateTimePatternGenerator* createInstance(const Locale& uLocale, UErrorCode& status); #ifndef U_HIDE_INTERNAL_API @@ -81,7 +81,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * * @internal */ - static DateTimePatternGenerator* U_EXPORT2 createInstanceNoStdPat(const Locale& uLocale, UErrorCode& status); + U_I18N_API static DateTimePatternGenerator* createInstanceNoStdPat(const Locale& uLocale, + UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ @@ -91,29 +92,29 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @stable ICU 3.8 */ - static DateTimePatternGenerator* U_EXPORT2 createEmptyInstance(UErrorCode& status); + U_I18N_API static DateTimePatternGenerator* createEmptyInstance(UErrorCode& status); /** * Destructor. * @stable ICU 3.8 */ - virtual ~DateTimePatternGenerator(); + U_I18N_API virtual ~DateTimePatternGenerator(); /** * Clone DateTimePatternGenerator object. Clients are responsible for * deleting the DateTimePatternGenerator object cloned. * @stable ICU 3.8 */ - DateTimePatternGenerator* clone() const; + U_I18N_API DateTimePatternGenerator* clone() const; - /** - * Return true if another object is semantically equal to this one. - * - * @param other the DateTimePatternGenerator object to be compared with. - * @return true if other is semantically equal to this. - * @stable ICU 3.8 - */ - bool operator==(const DateTimePatternGenerator& other) const; + /** + * Return true if another object is semantically equal to this one. + * + * @param other the DateTimePatternGenerator object to be compared with. + * @return true if other is semantically equal to this. + * @stable ICU 3.8 + */ + U_I18N_API bool operator==(const DateTimePatternGenerator& other) const; /** * Return true if another object is semantically unequal to this one. @@ -122,7 +123,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return true if other is semantically unequal to this. * @stable ICU 3.8 */ - bool operator!=(const DateTimePatternGenerator& other) const; + U_I18N_API bool operator!=(const DateTimePatternGenerator& other) const; /** * Utility to return a unique skeleton from a given pattern. For example, @@ -134,7 +135,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return skeleton such as "MMMdd" * @stable ICU 56 */ - static UnicodeString staticGetSkeleton(const UnicodeString& pattern, UErrorCode& status); + U_I18N_API static UnicodeString staticGetSkeleton(const UnicodeString& pattern, UErrorCode& status); /** * Utility to return a unique skeleton from a given pattern. For example, @@ -148,7 +149,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return skeleton such as "MMMdd" * @stable ICU 3.8 */ - UnicodeString getSkeleton(const UnicodeString& pattern, UErrorCode& status); /* { + U_I18N_API UnicodeString getSkeleton(const UnicodeString& pattern, UErrorCode& status); /* { The function is commented out because it is a stable API calling a draft API. After staticGetSkeleton becomes stable, staticGetSkeleton can be used and these comments and the definition of getSkeleton in dtptngen.cpp should be removed. @@ -168,7 +169,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return base skeleton, such as "MMMd" * @stable ICU 56 */ - static UnicodeString staticGetBaseSkeleton(const UnicodeString& pattern, UErrorCode& status); + U_I18N_API static UnicodeString staticGetBaseSkeleton(const UnicodeString& pattern, + UErrorCode& status); /** * Utility to return a unique base skeleton from a given pattern. This is @@ -185,7 +187,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return base skeleton, such as "MMMd" * @stable ICU 3.8 */ - UnicodeString getBaseSkeleton(const UnicodeString& pattern, UErrorCode& status); /* { + U_I18N_API UnicodeString getBaseSkeleton(const UnicodeString& pattern, UErrorCode& status); /* { The function is commented out because it is a stable API calling a draft API. After staticGetBaseSkeleton becomes stable, staticGetBaseSkeleton can be used and these comments and the definition of getBaseSkeleton in dtptngen.cpp should be removed. @@ -211,16 +213,24 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return conflicting status. The value could be UDATPG_NO_CONFLICT, * UDATPG_BASE_CONFLICT or UDATPG_CONFLICT. * @stable ICU 3.8 - * <p> - * <h4>Sample code</h4> - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample - * <p> */ - UDateTimePatternConflict addPattern(const UnicodeString& pattern, - UBool override, - UnicodeString& conflictingPattern, - UErrorCode& status); + U_I18N_API UDateTimePatternConflict addPattern(const UnicodeString& pattern, + UBool override, + UnicodeString& conflictingPattern, + UErrorCode& status); + +#ifndef U_HIDE_INTERNAL_API + /** + * Like addPattern, but associates the pattern with the given skeleton. + * + * @internal ICU 78 + */ + U_I18N_API UDateTimePatternConflict addPatternWithSkeleton(const UnicodeString& pattern, + const UnicodeString& skeletonToUse, + UBool override, + UnicodeString& conflictingPattern, + UErrorCode& status); +#endif /* U_HIDE_INTERNAL_API */ /** * An AppendItem format is a pattern used to append a field if there is no @@ -240,7 +250,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param value pattern, such as "{0}, {1}" * @stable ICU 3.8 */ - void setAppendItemFormat(UDateTimePatternField field, const UnicodeString& value); + U_I18N_API void setAppendItemFormat(UDateTimePatternField field, const UnicodeString& value); /** * Getter corresponding to setAppendItemFormat. Values below 0 or at or @@ -250,7 +260,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return append pattern for field * @stable ICU 3.8 */ - const UnicodeString& getAppendItemFormat(UDateTimePatternField field) const; + U_I18N_API const UnicodeString& getAppendItemFormat(UDateTimePatternField field) const; /** * Sets the names of field, eg "era" in English for ERA. These are only @@ -263,7 +273,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param value name of the field * @stable ICU 3.8 */ - void setAppendItemName(UDateTimePatternField field, const UnicodeString& value); + U_I18N_API void setAppendItemName(UDateTimePatternField field, const UnicodeString& value); /** * Getter corresponding to setAppendItemNames. Values below 0 or at or above @@ -275,7 +285,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @see getFieldDisplayName * @stable ICU 3.8 */ - const UnicodeString& getAppendItemName(UDateTimePatternField field) const; + U_I18N_API const UnicodeString& getAppendItemName(UDateTimePatternField field) const; /** * The general interface to get a display name for a particular date/time field, @@ -286,7 +296,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return The display name for field * @stable ICU 61 */ - UnicodeString getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const; + U_I18N_API UnicodeString getFieldDisplayName(UDateTimePatternField field, + UDateTimePGDisplayWidth width) const; /** * The DateTimeFormat is a message format pattern used to compose date and @@ -314,7 +325,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * pattern and {0} will be replaced by the time pattern. * @stable ICU 3.8 */ - void setDateTimeFormat(const UnicodeString& dateTimeFormat); + U_I18N_API void setDateTimeFormat(const UnicodeString& dateTimeFormat); /** * Getter corresponding to setDateTimeFormat. @@ -327,7 +338,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return DateTimeFormat. * @stable ICU 3.8 */ - const UnicodeString& getDateTimeFormat() const; + U_I18N_API const UnicodeString& getDateTimeFormat() const; #if !UCONFIG_NO_FORMATTING /** @@ -345,15 +356,16 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param style * one of DateFormat.FULL..DateFormat.SHORT. Error if out of range. * @param dateTimeFormat - * the new dateTimeFormat to set for the the specified style + * the new dateTimeFormat to set for the specified style * @param status * in/out parameter; if no failure status is already set, * it will be set according to result of the function (e.g. * U_ILLEGAL_ARGUMENT_ERROR for style out of range). * @stable ICU 71 */ - void setDateTimeFormat(UDateFormatStyle style, const UnicodeString& dateTimeFormat, - UErrorCode& status); + U_I18N_API void setDateTimeFormat(UDateFormatStyle style, + const UnicodeString& dateTimeFormat, + UErrorCode& status); /** * Getter corresponding to setDateTimeFormat. @@ -365,15 +377,14 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * it will be set according to result of the function (e.g. * U_ILLEGAL_ARGUMENT_ERROR for style out of range). * @return - * the current dateTimeFormat for the the specified style, or + * the current dateTimeFormat for the specified style, or * empty string in case of error. The UnicodeString reference, * or the contents of the string, may no longer be valid if * setDateTimeFormat is called, or the DateTimePatternGenerator * object is deleted. * @stable ICU 71 */ - const UnicodeString& getDateTimeFormat(UDateFormatStyle style, - UErrorCode& status) const; + U_I18N_API const UnicodeString& getDateTimeFormat(UDateFormatStyle style, UErrorCode& status) const; #endif /* #if !UCONFIG_NO_FORMATTING */ /** @@ -388,14 +399,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return bestPattern * The best pattern found from the given skeleton. * @stable ICU 3.8 - * <p> - * <h4>Sample code</h4> - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample - * <p> */ - UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status); - + U_I18N_API UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status); /** * Return the best pattern matching the input skeleton. It is guaranteed to @@ -416,10 +421,9 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * The best pattern found from the given skeleton. * @stable ICU 4.4 */ - UnicodeString getBestPattern(const UnicodeString& skeleton, - UDateTimePatternMatchOptions options, - UErrorCode& status); - + U_I18N_API UnicodeString getBestPattern(const UnicodeString& skeleton, + UDateTimePatternMatchOptions options, + UErrorCode& status); /** * Adjusts the field types (width and subtype) of a pattern to match what is @@ -436,15 +440,10 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @return pattern adjusted to match the skeleton fields widths and subtypes. * @stable ICU 3.8 - * <p> - * <h4>Sample code</h4> - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample - * <p> */ - UnicodeString replaceFieldTypes(const UnicodeString& pattern, - const UnicodeString& skeleton, - UErrorCode& status); + U_I18N_API UnicodeString replaceFieldTypes(const UnicodeString& pattern, + const UnicodeString& skeleton, + UErrorCode& status); /** * Adjusts the field types (width and subtype) of a pattern to match what is @@ -468,10 +467,10 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return pattern adjusted to match the skeleton fields widths and subtypes. * @stable ICU 4.4 */ - UnicodeString replaceFieldTypes(const UnicodeString& pattern, - const UnicodeString& skeleton, - UDateTimePatternMatchOptions options, - UErrorCode& status); + U_I18N_API UnicodeString replaceFieldTypes(const UnicodeString& pattern, + const UnicodeString& skeleton, + UDateTimePatternMatchOptions options, + UErrorCode& status); /** * Return a list of all the skeletons (in canonical form) from this class. @@ -484,15 +483,15 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * The caller must delete the object. * @stable ICU 3.8 */ - StringEnumeration* getSkeletons(UErrorCode& status) const; + U_I18N_API StringEnumeration* getSkeletons(UErrorCode& status) const; - /** - * Get the pattern corresponding to a given skeleton. - * @param skeleton - * @return pattern corresponding to a given skeleton. - * @stable ICU 3.8 - */ - const UnicodeString& getPatternForSkeleton(const UnicodeString& skeleton) const; + /** + * Get the pattern corresponding to a given skeleton. + * @param skeleton + * @return pattern corresponding to a given skeleton. + * @stable ICU 3.8 + */ + U_I18N_API const UnicodeString& getPatternForSkeleton(const UnicodeString& skeleton) const; /** * Return a list of all the base skeletons (in canonical form) from this class. @@ -503,7 +502,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * The caller must delete the object. * @stable ICU 3.8 */ - StringEnumeration* getBaseSkeletons(UErrorCode& status) const; + U_I18N_API StringEnumeration* getBaseSkeletons(UErrorCode& status) const; #ifndef U_HIDE_INTERNAL_API /** @@ -518,7 +517,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * The caller must delete the object. * @internal ICU 3.8 */ - StringEnumeration* getRedundants(UErrorCode& status); + U_I18N_API StringEnumeration* getRedundants(UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ /** @@ -532,14 +531,14 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param decimal * @stable ICU 3.8 */ - void setDecimal(const UnicodeString& decimal); + U_I18N_API void setDecimal(const UnicodeString& decimal); /** * Getter corresponding to setDecimal. * @return UnicodeString corresponding to the decimal point * @stable ICU 3.8 */ - const UnicodeString& getDecimal() const; + U_I18N_API const UnicodeString& getDecimal() const; #if !UCONFIG_NO_FORMATTING @@ -555,7 +554,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return the default hour cycle. * @stable ICU 67 */ - UDateFormatHourCycle getDefaultHourCycle(UErrorCode& status) const; + U_I18N_API UDateFormatHourCycle getDefaultHourCycle(UErrorCode& status) const; #endif /* #if !UCONFIG_NO_FORMATTING */ @@ -564,14 +563,14 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID() const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); private: /** @@ -634,7 +633,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { void getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err); void consumeShortTimePattern(const UnicodeString& shortTimePattern, UErrorCode& status); void addCLDRData(const Locale& locale, UErrorCode& status); - UDateTimePatternConflict addPatternWithSkeleton(const UnicodeString& pattern, const UnicodeString * skeletonToUse, UBool override, UnicodeString& conflictingPattern, UErrorCode& status); + UDateTimePatternConflict addPatternWithOptionalSkeleton(const UnicodeString& pattern, const UnicodeString * skeletonToUse, UBool override, UnicodeString& conflictingPattern, UErrorCode& status); void initHashtable(UErrorCode& status); void setDateTimeFromCalendar(const Locale& locale, UErrorCode& status); void setDecimalSymbols(const Locale& locale, UErrorCode& status); @@ -645,7 +644,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UnicodeString& getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width); void getAppendName(UDateTimePatternField field, UnicodeString& value); UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status); - const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, UErrorCode& status, const PtnSkeleton** specifiedSkeletonPtr = 0); + const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, UErrorCode& status, const PtnSkeleton** specifiedSkeletonPtr = nullptr); UnicodeString adjustFieldTypes(const UnicodeString& pattern, const PtnSkeleton* specifiedSkeleton, int32_t flags, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); UnicodeString getBestAppending(int32_t missingFields, int32_t flags, UErrorCode& status, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); int32_t getTopBitNumber(int32_t foundMask) const; diff --git a/deps/icu-small/source/i18n/unicode/dtrule.h b/deps/icu-small/source/i18n/unicode/dtrule.h index 19e94bc981c817..6e10bfcb04c303 100644 --- a/deps/icu-small/source/i18n/unicode/dtrule.h +++ b/deps/icu-small/source/i18n/unicode/dtrule.h @@ -160,7 +160,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The date rule type. * @stable ICU 3.8 */ - DateRuleType getDateRuleType(void) const; + DateRuleType getDateRuleType() const; /** * Gets the time rule type @@ -168,14 +168,14 @@ class U_I18N_API DateTimeRule : public UObject { * or <code>UTC_TIME</code>. * @stable ICU 3.8 */ - TimeRuleType getTimeRuleType(void) const; + TimeRuleType getTimeRuleType() const; /** * Gets the rule month. * @return The rule month. * @stable ICU 3.8 */ - int32_t getRuleMonth(void) const; + int32_t getRuleMonth() const; /** * Gets the rule day of month. When the date rule type @@ -183,7 +183,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of month * @stable ICU 3.8 */ - int32_t getRuleDayOfMonth(void) const; + int32_t getRuleDayOfMonth() const; /** * Gets the rule day of week. When the date rule type @@ -191,7 +191,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of week. * @stable ICU 3.8 */ - int32_t getRuleDayOfWeek(void) const; + int32_t getRuleDayOfWeek() const; /** * Gets the ordinal number of the occurrence of the day of week @@ -200,16 +200,16 @@ class U_I18N_API DateTimeRule : public UObject { * @return The rule day of week ordinal number in the month. * @stable ICU 3.8 */ - int32_t getRuleWeekInMonth(void) const; + int32_t getRuleWeekInMonth() const; /** * Gets the rule time in the rule day. * @return The time in the rule day in milliseconds. * @stable ICU 3.8 */ - int32_t getRuleMillisInDay(void) const; + int32_t getRuleMillisInDay() const; -private: + private: int32_t fMonth; int32_t fDayOfMonth; int32_t fDayOfWeek; @@ -230,7 +230,7 @@ class U_I18N_API DateTimeRule : public UObject { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -243,7 +243,7 @@ class U_I18N_API DateTimeRule : public UObject { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/fieldpos.h b/deps/icu-small/source/i18n/unicode/fieldpos.h index 0c092a00522935..23c6a1884e2baa 100644 --- a/deps/icu-small/source/i18n/unicode/fieldpos.h +++ b/deps/icu-small/source/i18n/unicode/fieldpos.h @@ -192,14 +192,14 @@ class U_I18N_API FieldPosition : public UObject { * @return the field identifier. * @stable ICU 2.0 */ - int32_t getField(void) const { return fField; } + int32_t getField() const { return fField; } /** * Retrieve the index of the first character in the requested field. * @return the index of the first character in the requested field. * @stable ICU 2.0 */ - int32_t getBeginIndex(void) const { return fBeginIndex; } + int32_t getBeginIndex() const { return fBeginIndex; } /** * Retrieve the index of the character following the last character in the @@ -208,8 +208,8 @@ class U_I18N_API FieldPosition : public UObject { * requested field. * @stable ICU 2.0 */ - int32_t getEndIndex(void) const { return fEndIndex; } - + int32_t getEndIndex() const { return fEndIndex; } + /** * Set the field. * @param f the new value of the field. diff --git a/deps/icu-small/source/i18n/unicode/fmtable.h b/deps/icu-small/source/i18n/unicode/fmtable.h index 6bda3576042143..cb3bb318ebb95f 100644 --- a/deps/icu-small/source/i18n/unicode/fmtable.h +++ b/deps/icu-small/source/i18n/unicode/fmtable.h @@ -34,12 +34,11 @@ U_NAMESPACE_BEGIN -class CharString; -namespace number { -namespace impl { +class FixedString; + +namespace number::impl { class DecimalQuantity; } -} /** * Formattable objects can be passed to the Format class or @@ -274,7 +273,7 @@ class U_I18N_API Formattable : public UObject { * @return the data type of this Formattable object. * @stable ICU 2.0 */ - Type getType(void) const; + Type getType() const; /** * Returns true if the data type of this Formattable object @@ -290,7 +289,7 @@ class U_I18N_API Formattable : public UObject { * @return the double value of this object. * @stable ICU 2.0 */ - double getDouble(void) const { return fValue.fDouble; } + double getDouble() const { return fValue.fDouble; } /** * Gets the double value of this object. If this object is of type @@ -312,7 +311,7 @@ class U_I18N_API Formattable : public UObject { * @return the long value of this object. * @stable ICU 2.0 */ - int32_t getLong(void) const { return (int32_t)fValue.fInt64; } + int32_t getLong() const { return static_cast<int32_t>(fValue.fInt64); } /** * Gets the long value of this object. If the magnitude is too @@ -338,7 +337,7 @@ class U_I18N_API Formattable : public UObject { * @return the int64 value of this object. * @stable ICU 2.8 */ - int64_t getInt64(void) const { return fValue.fInt64; } + int64_t getInt64() const { return fValue.fInt64; } /** * Gets the int64 value of this object. If this object is of a numeric @@ -403,7 +402,7 @@ class U_I18N_API Formattable : public UObject { * @return a const reference to the string value of this object. * @stable ICU 2.0 */ - inline const UnicodeString& getString(void) const; + inline const UnicodeString& getString() const; /** * Gets a const reference to the string value of this object. If @@ -421,7 +420,7 @@ class U_I18N_API Formattable : public UObject { * @return a reference to the string value of this object. * @stable ICU 2.0 */ - inline UnicodeString& getString(void); + inline UnicodeString& getString(); /** * Gets a reference to the string value of this object. If the @@ -566,7 +565,7 @@ class U_I18N_API Formattable : public UObject { void adoptObject(UObject* objectToAdopt); /** - * Sets the the numeric value from a decimal number string, and changes + * Sets the numeric value from a decimal number string, and changes * the type to to a numeric type appropriate for the number. * The syntax of the number is a "numeric string" * as defined in the Decimal Arithmetic Specification, available at @@ -666,12 +665,12 @@ class U_I18N_API Formattable : public UObject { void adoptDecimalQuantity(number::impl::DecimalQuantity *dq); /** - * Internal function to return the CharString pointer. + * Internal function to return the FixedString pointer. * @param status error code - * @return pointer to the CharString - may become invalid if the object is modified + * @return pointer to the FixedString - may become invalid if the object is modified * @internal */ - CharString *internalGetCharString(UErrorCode &status); + FixedString *internalGetFixedString(UErrorCode &status); #endif /* U_HIDE_INTERNAL_API */ @@ -680,7 +679,7 @@ class U_I18N_API Formattable : public UObject { * Cleans up the memory for unwanted values. For example, the adopted * string or array objects. */ - void dispose(void); + void dispose(); /** * Common initialization, for use by constructors. @@ -701,7 +700,7 @@ class U_I18N_API Formattable : public UObject { } fArrayAndCount; } fValue; - CharString *fDecimalStr; + FixedString* fDecimalStr; number::impl::DecimalQuantity *fDecimalQuantity; @@ -719,11 +718,11 @@ inline UDate Formattable::getDate(UErrorCode& status) const { return fValue.fDate; } -inline const UnicodeString& Formattable::getString(void) const { +inline const UnicodeString& Formattable::getString() const { return *fValue.fString; } -inline UnicodeString& Formattable::getString(void) { +inline UnicodeString& Formattable::getString() { return *fValue.fString; } diff --git a/deps/icu-small/source/i18n/unicode/format.h b/deps/icu-small/source/i18n/unicode/format.h index a21e61ad56d85c..fcfd72ca7cee27 100644 --- a/deps/icu-small/source/i18n/unicode/format.h +++ b/deps/icu-small/source/i18n/unicode/format.h @@ -84,7 +84,7 @@ U_NAMESPACE_BEGIN * <P> * If formatting is unsuccessful, a failing UErrorCode is returned when * the Format cannot format the type of object, otherwise if there is - * something illformed about the the Unicode replacement character + * something illformed about the Unicode replacement character * 0xFFFD is returned. * <P> * If there is no match when parsing, a parse failure UErrorCode is @@ -95,13 +95,13 @@ U_NAMESPACE_BEGIN * subclasses, such code will not necessarily work and will not be * guaranteed to work stably from release to release. */ -class U_I18N_API Format : public UObject { +class U_I18N_API_CLASS Format : public UObject { public: /** Destructor * @stable ICU 2.4 */ - virtual ~Format(); + U_I18N_API virtual ~Format(); /** * Return true if the given Format objects are semantically equal. @@ -111,7 +111,7 @@ class U_I18N_API Format : public UObject { * Objects of different subclasses are considered unequal. * @stable ICU 2.0 */ - virtual bool operator==(const Format& other) const = 0; + U_I18N_API virtual bool operator==(const Format& other) const = 0; /** * Return true if the given Format objects are not semantically @@ -120,7 +120,7 @@ class U_I18N_API Format : public UObject { * @return Return true if the given Format objects are not semantically. * @stable ICU 2.0 */ - bool operator!=(const Format& other) const { return !operator==(other); } + U_I18N_API bool operator!=(const Format& other) const { return !operator==(other); } /** * Clone this object polymorphically. The caller is responsible @@ -128,7 +128,7 @@ class U_I18N_API Format : public UObject { * @return A copy of the object * @stable ICU 2.0 */ - virtual Format* clone() const = 0; + U_I18N_API virtual Format* clone() const = 0; /** * Formats an object to produce a string. @@ -140,9 +140,9 @@ class U_I18N_API Format : public UObject { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + UErrorCode& status) const; /** * Format an object to produce a string. This is a pure virtual method which @@ -160,10 +160,11 @@ class U_I18N_API Format : public UObject { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const = 0; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const = 0; + /** * Format an object to produce a string. Subclasses should override this * method. This method allows polymorphic formatting of Formattable objects. @@ -180,10 +181,10 @@ class U_I18N_API Format : public UObject { * @return Reference to 'appendTo' parameter. * @stable ICU 4.4 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPositionIterator* posIter, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const; /** * Parse a string to produce an object. This is a pure virtual @@ -224,9 +225,9 @@ class U_I18N_API Format : public UObject { * will remain unchanged. * @stable ICU 2.0 */ - virtual void parseObject(const UnicodeString& source, - Formattable& result, - ParsePosition& parse_pos) const = 0; + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const = 0; /** * Parses a string to produce an object. This is a convenience method @@ -240,9 +241,9 @@ class U_I18N_API Format : public UObject { * result code. * @stable ICU 2.0 */ - void parseObject(const UnicodeString& source, - Formattable& result, - UErrorCode& status) const; + U_I18N_API void parseObject(const UnicodeString& source, + Formattable& result, + UErrorCode& status) const; /** Get the locale for this format object. You can choose between valid and actual locale. * @param type type of the locale we're looking for (valid or actual) @@ -250,7 +251,7 @@ class U_I18N_API Format : public UObject { * @return the locale * @stable ICU 2.8 */ - Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; + U_I18N_API Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; #ifndef U_HIDE_INTERNAL_API /** Get the locale for this format object. You can choose between valid and actual locale. @@ -259,31 +260,30 @@ class U_I18N_API Format : public UObject { * @return the locale * @internal */ - const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; + U_I18N_API const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; #endif /* U_HIDE_INTERNAL_API */ protected: /** @stable ICU 2.8 */ - void setLocaleIDs(const char* valid, const char* actual); + U_I18N_API void setLocaleIDs(const char* valid, const char* actual); protected: /** * Default constructor for subclass use only. Does nothing. * @stable ICU 2.0 */ - Format(); + U_I18N_API Format(); /** * @stable ICU 2.0 */ - Format(const Format&); // Does nothing; for subclasses only + U_I18N_API Format(const Format&); // Does nothing; for subclasses only /** * @stable ICU 2.0 */ - Format& operator=(const Format&); // Does nothing; for subclasses + U_I18N_API Format& operator=(const Format&); // Does nothing; for subclasses - /** * Simple function for initializing a UParseError from a UnicodeString. * @@ -292,13 +292,13 @@ class U_I18N_API Format : public UObject { * @param parseError The UParseError object to fill in * @stable ICU 2.4 */ - static void syntaxError(const UnicodeString& pattern, - int32_t pos, - UParseError& parseError); + U_I18N_API static void syntaxError(const UnicodeString& pattern, + int32_t pos, + UParseError& parseError); private: - char actualLocale[ULOC_FULLNAME_CAPACITY]; - char validLocale[ULOC_FULLNAME_CAPACITY]; + Locale actualLocale; + Locale validLocale; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/formattednumber.h b/deps/icu-small/source/i18n/unicode/formattednumber.h index 83178ea40efe85..056b318d0de0b5 100644 --- a/deps/icu-small/source/i18n/unicode/formattednumber.h +++ b/deps/icu-small/source/i18n/unicode/formattednumber.h @@ -25,6 +25,7 @@ U_NAMESPACE_BEGIN class FieldPositionIteratorHandler; +class SimpleDateFormat; namespace number { // icu::number @@ -174,7 +175,6 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue { /** * Internal constructor from data type. Adopts the data pointer. - * @internal (private) */ explicit FormattedNumber(impl::UFormattedNumberData *results) : fData(results), fErrorCode(U_ZERO_ERROR) {} @@ -190,6 +190,9 @@ class U_I18N_API FormattedNumber : public UMemory, public FormattedValue { // To give C API access to internals friend struct impl::UFormattedNumberImpl; + + // To give access to the data pointer for non-heap allocation + friend class icu::SimpleDateFormat; }; template<typename StringClass> diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 0e38d0b78b3a48..cae0dafd29d9de 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -67,7 +67,7 @@ class U_I18N_API FieldPositionIterator : public UObject { * Constructs a new, empty iterator. * @stable ICU 4.4 */ - FieldPositionIterator(void); + FieldPositionIterator(); /** * Copy constructor. If the copy failed for some reason, the new iterator will diff --git a/deps/icu-small/source/i18n/unicode/gregocal.h b/deps/icu-small/source/i18n/unicode/gregocal.h index ab5a9c15716bc2..588dc9b9626946 100644 --- a/deps/icu-small/source/i18n/unicode/gregocal.h +++ b/deps/icu-small/source/i18n/unicode/gregocal.h @@ -324,7 +324,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return The Gregorian cutover time for this calendar. * @stable ICU 2.0 */ - UDate getGregorianChange(void) const; + UDate getGregorianChange() const; /** * Return true if the given year is a leap year. Determination of whether a year is @@ -435,7 +435,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Return the class ID for this class. This is useful only for comparing to a return @@ -448,7 +448,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns the calendar type name string for this Calendar object. @@ -483,22 +483,24 @@ class U_I18N_API GregorianCalendar: public Calendar { * @param useMonth if false, compute the day before the first day of * the given year, otherwise, compute the day before the first day of * the given month + * @param status Fill-in parameter which receives the status of this operation. * @return the Julian day number of the day before the first * day of the given month and year * @internal */ - virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, - UBool useMonth) const override; + virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, + UBool useMonth, UErrorCode& status) const override; /** * Subclasses may override this. This method calls * handleGetMonthLength() to obtain the calendar-specific month * length. * @param bestField which field to use to calculate the date + * @param status Fill-in parameter which receives the status of this operation. * @return julian day specified by calendar fields. * @internal */ - virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField) override; + virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField, UErrorCode& status) override; /** * Return the number of days in the given month of the given extended @@ -507,7 +509,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * implementation than the default implementation in Calendar. * @internal */ - virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const override; + virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; /** * Return the number of days in the given extended year of this @@ -516,15 +518,16 @@ class U_I18N_API GregorianCalendar: public Calendar { * default implementation in Calendar. * @stable ICU 2.0 */ - virtual int32_t handleGetYearLength(int32_t eyear) const override; + virtual int32_t handleGetYearLength(int32_t eyear, UErrorCode& status) const override; /** * return the length of the given month. * @param month the given month. + * @param status Fill-in parameter which receives the status of this operation. * @return the length of the given month. * @internal */ - virtual int32_t monthLength(int32_t month) const; + virtual int32_t monthLength(int32_t month, UErrorCode& status) const; /** * return the length of the month according to the given year. @@ -541,7 +544,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return the length of the year field * @internal */ - int32_t yearLength(void) const; + int32_t yearLength() const; #endif /* U_HIDE_INTERNAL_API */ @@ -582,10 +585,11 @@ class U_I18N_API GregorianCalendar: public Calendar { * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such * as UCAL_ERA) specific to the calendar system, depending on which set of * fields is newer. + * @param status * @return the extended year * @internal */ - virtual int32_t handleGetExtendedYear() override; + virtual int32_t handleGetExtendedYear(UErrorCode& status) override; /** * Subclasses may override this to convert from week fields @@ -595,7 +599,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * @return the extended year, UCAL_EXTENDED_YEAR * @internal */ - virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy) override; + virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy, UErrorCode& status) override; /** @@ -615,6 +619,15 @@ class U_I18N_API GregorianCalendar: public Calendar { */ virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; +#ifndef U_HIDE_INTERNAL_API + /** + * The year in this calendar is counting from 1 backward if the era is 0. + * @return The year in era 0 of this calendar is counting backward from 1. + * @internal + */ + virtual bool isEra0CountingBackward() const override { return true; } +#endif // U_HIDE_INTERNAL_API + private: /** * Compute the julian day number of the given year. @@ -630,7 +643,7 @@ class U_I18N_API GregorianCalendar: public Calendar { * Validates the values of the set time fields. True if they're all valid. * @return True if the set time fields are all valid. */ - UBool validateFields(void) const; + UBool validateFields() const; /** * Validates the value of the given time field. True if it's valid. @@ -662,13 +675,6 @@ class U_I18N_API GregorianCalendar: public Calendar { */ int32_t fCutoverJulianDay; - /** - * Midnight, local time (using this Calendar's TimeZone) at or before the - * gregorianCutover. This is a pure date value with no time of day or - * timezone component. - */ - UDate fNormalizedGregorianCutover;// = gregorianCutover; - /** * The year of the gregorianCutover, with 0 representing * 1 BC, -1 representing 2 BC, etc. @@ -709,23 +715,8 @@ class U_I18N_API GregorianCalendar: public Calendar { public: // internal implementation - /** - * @return true if this calendar has the notion of a default century - * @internal - */ - virtual UBool haveDefaultCentury() const override; - - /** - * @return the start of the default century - * @internal - */ - virtual UDate defaultCenturyStart() const override; + DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY - /** - * @return the beginning year of the default century - * @internal - */ - virtual int32_t defaultCenturyStartYear() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index 59bf546a905294..c9894f0b5916e1 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -273,7 +273,7 @@ class U_I18N_API MeasureFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -286,7 +286,7 @@ class U_I18N_API MeasureFormat : public Format { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 8f358357826808..b5f3a2986f74b2 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -33,11 +33,9 @@ U_NAMESPACE_BEGIN class StringEnumeration; class MeasureUnitImpl; -namespace number { -namespace impl { +namespace number::impl { class LongNameHandler; -} -} // namespace number +} // namespace number::impl /** * Enumeration for unit complexity. There are three levels: @@ -107,13 +105,32 @@ typedef enum UMeasurePrefix { */ UMEASURE_PREFIX_YOTTA = UMEASURE_PREFIX_ONE + 24, + /** + * SI prefix: ronna, 10^27. + * + * @stable ICU 75 + */ + UMEASURE_PREFIX_RONNA = UMEASURE_PREFIX_ONE + 27, + + /** + * SI prefix: quetta, 10^30. + * + * @stable ICU 75 + */ + UMEASURE_PREFIX_QUETTA = UMEASURE_PREFIX_ONE + 30, + #ifndef U_HIDE_INTERNAL_API /** * ICU use only. * Used to determine the set of base-10 SI prefixes. * @internal */ +#ifndef U_HIDE_DRAFT_API + UMEASURE_PREFIX_INTERNAL_MAX_SI = UMEASURE_PREFIX_QUETTA, +#else /* U_HIDE_DRAFT_API */ UMEASURE_PREFIX_INTERNAL_MAX_SI = UMEASURE_PREFIX_YOTTA, +#endif /* U_HIDE_DRAFT_API */ + #endif /* U_HIDE_INTERNAL_API */ /** @@ -249,13 +266,32 @@ typedef enum UMeasurePrefix { */ UMEASURE_PREFIX_YOCTO = UMEASURE_PREFIX_ONE + -24, + /** + * SI prefix: ronto, 10^-27. + * + * @stable ICU 75 + */ + UMEASURE_PREFIX_RONTO = UMEASURE_PREFIX_ONE + -27, + + /** + * SI prefix: quecto, 10^-30. + * + * @stable ICU 75 + */ + UMEASURE_PREFIX_QUECTO = UMEASURE_PREFIX_ONE + -30, + #ifndef U_HIDE_INTERNAL_API /** * ICU use only. * Used to determine the set of base-10 SI prefixes. * @internal */ +#ifndef U_HIDE_DRAFT_API + UMEASURE_PREFIX_INTERNAL_MIN_SI = UMEASURE_PREFIX_QUECTO, +#else /* U_HIDE_DRAFT_API */ UMEASURE_PREFIX_INTERNAL_MIN_SI = UMEASURE_PREFIX_YOCTO, +#endif /* U_HIDE_DRAFT_API */ + #endif // U_HIDE_INTERNAL_API // Cannot conditionalize the following with #ifndef U_HIDE_INTERNAL_API, @@ -390,16 +426,19 @@ class U_I18N_API MeasureUnit: public UObject { MeasureUnit(MeasureUnit &&other) noexcept; /** - * Construct a MeasureUnit from a CLDR Core Unit Identifier, defined in UTS - * 35. (Core unit identifiers and mixed unit identifiers are supported, long - * unit identifiers are not.) Validates and canonicalizes the identifier. + * Constructs a MeasureUnit from a CLDR Core Unit Identifier, as defined in UTS 35. + * This method supports core unit identifiers and mixed unit identifiers. + * It validates and canonicalizes the given identifier. + * * + * Example usage: * <pre> - * MeasureUnit example = MeasureUnit::forIdentifier("furlong-per-nanosecond") + * MeasureUnit example = MeasureUnit::forIdentifier("meter-per-second", status); * </pre> * - * @param identifier The CLDR Unit Identifier. - * @param status Set if the identifier is invalid. + * @param identifier the CLDR Unit Identifier + * @param status Set error if the identifier is invalid. + * @return the corresponding MeasureUnit * @stable ICU 67 */ static MeasureUnit forIdentifier(StringPiece identifier, UErrorCode& status); @@ -512,6 +551,44 @@ class U_I18N_API MeasureUnit: public UObject { */ UMeasurePrefix getPrefix(UErrorCode& status) const; +#ifndef U_HIDE_DRAFT_API + + /** + * Creates a new MeasureUnit with a specified constant denominator. + * + * This method is applicable only to COMPOUND and SINGLE units. If invoked on a + * MIXED unit, an error will be set in the status. + * + * NOTE: If the constant denominator is set to 0, it means that you are removing + * the constant denominator. + * + * @param denominator The constant denominator to set. + * @param status Set if this is not a COMPOUND or SINGLE unit or if another error occurs. + * @return A new MeasureUnit with the specified constant denominator. + * @draft ICU 77 + */ + MeasureUnit withConstantDenominator(uint64_t denominator, UErrorCode &status) const; + + /** + * Retrieves the constant denominator for this COMPOUND unit. + * + * Examples: + * - For the unit "liter-per-1000-kiloliter", the constant denominator is 1000. + * - For the unit "liter-per-kilometer", the constant denominator is zero. + * + * This method is applicable only to COMPOUND and SINGLE units. If invoked on + * a MIXED unit, an error will be set in the status. + * + * NOTE: If no constant denominator exists, the method returns 0. + * + * @param status Set if this is not a COMPOUND or SINGLE unit or if another error occurs. + * @return The value of the constant denominator. + * @draft ICU 77 + */ + uint64_t getConstantDenominator(UErrorCode &status) const; + +#endif /* U_HIDE_DRAFT_API */ + /** * Creates a MeasureUnit which is this SINGLE unit augmented with the specified dimensionality * (power). For example, if dimensionality is 2, the unit will be squared. @@ -551,7 +628,9 @@ class U_I18N_API MeasureUnit: public UObject { * NOTE: Only works on SINGLE and COMPOUND units. If this is a MIXED unit, an error will * occur. For more information, see UMeasureUnitComplexity. * - * @param status Set if this is a MIXED unit or if another error occurs. + * NOTE: An Error will be returned for units that have a constant denominator. + * + * @param status Set if this is a MIXED unit, has a constant denominator or if another error occurs. * @return The reciprocal of the target unit. * @stable ICU 67 */ @@ -587,6 +666,10 @@ class U_I18N_API MeasureUnit: public UObject { * * If this is a SINGLE unit, an array of length 1 will be returned. * + * NOTE: For units with a constant denominator, the returned single units will + * not include the constant denominator. To obtain the constant denominator, + * retrieve it from the original unit. + * * @param status Set if an error occurs. * @return A pair with the list of units as a LocalArray and the number of units in the list. * @stable ICU 68 @@ -648,7 +731,7 @@ class U_I18N_API MeasureUnit: public UObject { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -661,7 +744,7 @@ class U_I18N_API MeasureUnit: public UObject { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; #ifndef U_HIDE_INTERNAL_API /** @@ -792,6 +875,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getRevolutionAngle(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of angle: steradian. + * Caller owns returned value and must free it. + * Also see {@link #getSteradian()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSteradian(UErrorCode &status); + + /** + * Returns by value, unit of angle: steradian. + * Also see {@link #createSteradian()}. + * @draft ICU 78 + */ + static MeasureUnit getSteradian(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of area: acre. * Caller owns returned value and must free it. @@ -808,6 +909,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getAcre(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of area: bu-jp. + * Caller owns returned value and must free it. + * Also see {@link #getBuJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createBuJp(UErrorCode &status); + + /** + * Returns by value, unit of area: bu-jp. + * Also see {@link #createBuJp()}. + * @draft ICU 78 + */ + static MeasureUnit getBuJp(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of area: cho. + * Caller owns returned value and must free it. + * Also see {@link #getCho()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createCho(UErrorCode &status); + + /** + * Returns by value, unit of area: cho. + * Also see {@link #createCho()}. + * @draft ICU 78 + */ + static MeasureUnit getCho(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of area: dunam. * Caller owns returned value and must free it. @@ -840,6 +977,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getHectare(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of area: se-jp. + * Caller owns returned value and must free it. + * Also see {@link #getSeJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSeJp(UErrorCode &status); + + /** + * Returns by value, unit of area: se-jp. + * Also see {@link #createSeJp()}. + * @draft ICU 78 + */ + static MeasureUnit getSeJp(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of area: square-centimeter. * Caller owns returned value and must free it. @@ -984,6 +1139,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getKarat(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: katal. + * Caller owns returned value and must free it. + * Also see {@link #getKatal()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createKatal(UErrorCode &status); + + /** + * Returns by value, unit of concentr: katal. + * Also see {@link #createKatal()}. + * @draft ICU 78 + */ + static MeasureUnit getKatal(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of concentr: milligram-ofglucose-per-deciliter. * Caller owns returned value and must free it. @@ -1000,21 +1173,27 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getMilligramOfglucosePerDeciliter(); +#ifndef U_HIDE_DEPRECATED_API /** * Returns by pointer, unit of concentr: milligram-per-deciliter. + * (renamed to milligram-ofglucose-per-deciliter in CLDR 39 / ICU 69). * Caller owns returned value and must free it. + * Also see {@link #createMilligramOfglucosePerDeciliter()}. * Also see {@link #getMilligramPerDeciliter()}. * @param status ICU error code. - * @stable ICU 57 + * @deprecated ICU 78 use createMilligramOfglucosePerDeciliter(UErrorCode &status) */ static MeasureUnit *createMilligramPerDeciliter(UErrorCode &status); /** * Returns by value, unit of concentr: milligram-per-deciliter. + * (renamed to milligram-ofglucose-per-deciliter in CLDR 39 / ICU 69). + * Also see {@link #getMilligramOfglucosePerDeciliter()}. * Also see {@link #createMilligramPerDeciliter()}. - * @stable ICU 64 + * @deprecated ICU 78 use getMilligramOfglucosePerDeciliter() */ static MeasureUnit getMilligramPerDeciliter(); +#endif /* U_HIDE_DEPRECATED_API */ /** * Returns by pointer, unit of concentr: millimole-per-liter. @@ -1048,6 +1227,98 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getMole(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: ofglucose. + * Caller owns returned value and must free it. + * Also see {@link #getOfglucose()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createOfglucose(UErrorCode &status); + + /** + * Returns by value, unit of concentr: ofglucose. + * Also see {@link #createOfglucose()}. + * @draft ICU 78 + */ + static MeasureUnit getOfglucose(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: part. + * Caller owns returned value and must free it. + * Also see {@link #getPart()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createPart(UErrorCode &status); + + /** + * Returns by value, unit of concentr: part. + * Also see {@link #createPart()}. + * @draft ICU 78 + */ + static MeasureUnit getPart(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: part-per-1e6. + * Caller owns returned value and must free it. + * Also see {@link #getPartPer1E6()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createPartPer1E6(UErrorCode &status); + + /** + * Returns by value, unit of concentr: part-per-1e6. + * Also see {@link #createPartPer1E6()}. + * @draft ICU 78 + */ + static MeasureUnit getPartPer1E6(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of concentr: part-per-million. + * (renamed to part-per-1e6 in CLDR 48 / ICU 78). + * Caller owns returned value and must free it. + * Also see {@link #createPartPer1E6()}. + * Also see {@link #getPartPerMillion()}. + * @param status ICU error code. + * @stable ICU 57 + */ + static MeasureUnit *createPartPerMillion(UErrorCode &status); + + /** + * Returns by value, unit of concentr: part-per-million. + * (renamed to part-per-1e6 in CLDR 48 / ICU 78). + * Also see {@link #getPartPer1E6()}. + * Also see {@link #createPartPerMillion()}. + * @stable ICU 64 + */ + static MeasureUnit getPartPerMillion(); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: part-per-1e9. + * Caller owns returned value and must free it. + * Also see {@link #getPartPer1E9()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createPartPer1E9(UErrorCode &status); + + /** + * Returns by value, unit of concentr: part-per-1e9. + * Also see {@link #createPartPer1E9()}. + * @draft ICU 78 + */ + static MeasureUnit getPartPer1E9(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of concentr: percent. * Caller owns returned value and must free it. @@ -1080,22 +1351,6 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPermille(); - /** - * Returns by pointer, unit of concentr: permillion. - * Caller owns returned value and must free it. - * Also see {@link #getPartPerMillion()}. - * @param status ICU error code. - * @stable ICU 57 - */ - static MeasureUnit *createPartPerMillion(UErrorCode &status); - - /** - * Returns by value, unit of concentr: permillion. - * Also see {@link #createPartPerMillion()}. - * @stable ICU 64 - */ - static MeasureUnit getPartPerMillion(); - /** * Returns by pointer, unit of concentr: permyriad. * Caller owns returned value and must free it. @@ -1416,6 +1671,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getDecade(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of duration: fortnight. + * Caller owns returned value and must free it. + * Also see {@link #getFortnight()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createFortnight(UErrorCode &status); + + /** + * Returns by value, unit of duration: fortnight. + * Also see {@link #createFortnight()}. + * @draft ICU 78 + */ + static MeasureUnit getFortnight(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of duration: hour. * Caller owns returned value and must free it. @@ -1528,6 +1801,22 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getNanosecond(); + /** + * Returns by pointer, unit of duration: night. + * Caller owns returned value and must free it. + * Also see {@link #getNight()}. + * @param status ICU error code. + * @stable ICU 76 + */ + static MeasureUnit *createNight(UErrorCode &status); + + /** + * Returns by value, unit of duration: night. + * Also see {@link #createNight()}. + * @stable ICU 76 + */ + static MeasureUnit getNight(); + /** * Returns by pointer, unit of duration: quarter. * Caller owns returned value and must free it. @@ -1640,6 +1929,60 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getAmpere(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of electric: coulomb. + * Caller owns returned value and must free it. + * Also see {@link #getCoulomb()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createCoulomb(UErrorCode &status); + + /** + * Returns by value, unit of electric: coulomb. + * Also see {@link #createCoulomb()}. + * @draft ICU 78 + */ + static MeasureUnit getCoulomb(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of electric: farad. + * Caller owns returned value and must free it. + * Also see {@link #getFarad()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createFarad(UErrorCode &status); + + /** + * Returns by value, unit of electric: farad. + * Also see {@link #createFarad()}. + * @draft ICU 78 + */ + static MeasureUnit getFarad(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of electric: henry. + * Caller owns returned value and must free it. + * Also see {@link #getHenry()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createHenry(UErrorCode &status); + + /** + * Returns by value, unit of electric: henry. + * Also see {@link #createHenry()}. + * @draft ICU 78 + */ + static MeasureUnit getHenry(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of electric: milliampere. * Caller owns returned value and must free it. @@ -1672,6 +2015,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getOhm(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of electric: siemens. + * Caller owns returned value and must free it. + * Also see {@link #getSiemens()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSiemens(UErrorCode &status); + + /** + * Returns by value, unit of electric: siemens. + * Also see {@link #createSiemens()}. + * @draft ICU 78 + */ + static MeasureUnit getSiemens(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of electric: volt. * Caller owns returned value and must free it. @@ -1688,6 +2049,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getVolt(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: becquerel. + * Caller owns returned value and must free it. + * Also see {@link #getBecquerel()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createBecquerel(UErrorCode &status); + + /** + * Returns by value, unit of energy: becquerel. + * Also see {@link #createBecquerel()}. + * @draft ICU 78 + */ + static MeasureUnit getBecquerel(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of energy: british-thermal-unit. * Caller owns returned value and must free it. @@ -1704,6 +2083,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getBritishThermalUnit(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: british-thermal-unit-it. + * Caller owns returned value and must free it. + * Also see {@link #getBritishThermalUnitIt()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createBritishThermalUnitIt(UErrorCode &status); + + /** + * Returns by value, unit of energy: british-thermal-unit-it. + * Also see {@link #createBritishThermalUnitIt()}. + * @draft ICU 78 + */ + static MeasureUnit getBritishThermalUnitIt(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of energy: calorie. * Caller owns returned value and must free it. @@ -1720,6 +2117,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getCalorie(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: calorie-it. + * Caller owns returned value and must free it. + * Also see {@link #getCalorieIt()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createCalorieIt(UErrorCode &status); + + /** + * Returns by value, unit of energy: calorie-it. + * Also see {@link #createCalorieIt()}. + * @draft ICU 78 + */ + static MeasureUnit getCalorieIt(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of energy: electronvolt. * Caller owns returned value and must free it. @@ -1752,12 +2167,30 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getFoodcalorie(); +#ifndef U_HIDE_DRAFT_API /** - * Returns by pointer, unit of energy: joule. + * Returns by pointer, unit of energy: gray. * Caller owns returned value and must free it. - * Also see {@link #getJoule()}. + * Also see {@link #getGray()}. * @param status ICU error code. - * @stable ICU 54 + * @draft ICU 78 + */ + static MeasureUnit *createGray(UErrorCode &status); + + /** + * Returns by value, unit of energy: gray. + * Also see {@link #createGray()}. + * @draft ICU 78 + */ + static MeasureUnit getGray(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: joule. + * Caller owns returned value and must free it. + * Also see {@link #getJoule()}. + * @param status ICU error code. + * @stable ICU 54 */ static MeasureUnit *createJoule(UErrorCode &status); @@ -1816,6 +2249,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getKilowattHour(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: sievert. + * Caller owns returned value and must free it. + * Also see {@link #getSievert()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSievert(UErrorCode &status); + + /** + * Returns by value, unit of energy: sievert. + * Also see {@link #createSievert()}. + * @draft ICU 78 + */ + static MeasureUnit getSievert(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of energy: therm-us. * Caller owns returned value and must free it. @@ -1832,6 +2283,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getThermUs(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of force: kilogram-force. + * Caller owns returned value and must free it. + * Also see {@link #getKilogramForce()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createKilogramForce(UErrorCode &status); + + /** + * Returns by value, unit of force: kilogram-force. + * Also see {@link #createKilogramForce()}. + * @draft ICU 78 + */ + static MeasureUnit getKilogramForce(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of force: kilowatt-hour-per-100-kilometer. * Caller owns returned value and must free it. @@ -2104,6 +2573,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getCentimeter(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: chain. + * Caller owns returned value and must free it. + * Also see {@link #getChain()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createChain(UErrorCode &status); + + /** + * Returns by value, unit of length: chain. + * Also see {@link #createChain()}. + * @draft ICU 78 + */ + static MeasureUnit getChain(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of length: decimeter. * Caller owns returned value and must free it. @@ -2200,6 +2687,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getInch(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: jo-jp. + * Caller owns returned value and must free it. + * Also see {@link #getJoJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createJoJp(UErrorCode &status); + + /** + * Returns by value, unit of length: jo-jp. + * Also see {@link #createJoJp()}. + * @draft ICU 78 + */ + static MeasureUnit getJoJp(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: ken. + * Caller owns returned value and must free it. + * Also see {@link #getKen()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createKen(UErrorCode &status); + + /** + * Returns by value, unit of length: ken. + * Also see {@link #createKen()}. + * @draft ICU 78 + */ + static MeasureUnit getKen(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of length: kilometer. * Caller owns returned value and must free it. @@ -2392,6 +2915,96 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPoint(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: ri-jp. + * Caller owns returned value and must free it. + * Also see {@link #getRiJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createRiJp(UErrorCode &status); + + /** + * Returns by value, unit of length: ri-jp. + * Also see {@link #createRiJp()}. + * @draft ICU 78 + */ + static MeasureUnit getRiJp(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: rin. + * Caller owns returned value and must free it. + * Also see {@link #getRin()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createRin(UErrorCode &status); + + /** + * Returns by value, unit of length: rin. + * Also see {@link #createRin()}. + * @draft ICU 78 + */ + static MeasureUnit getRin(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: rod. + * Caller owns returned value and must free it. + * Also see {@link #getRod()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createRod(UErrorCode &status); + + /** + * Returns by value, unit of length: rod. + * Also see {@link #createRod()}. + * @draft ICU 78 + */ + static MeasureUnit getRod(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: shaku-cloth. + * Caller owns returned value and must free it. + * Also see {@link #getShakuCloth()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createShakuCloth(UErrorCode &status); + + /** + * Returns by value, unit of length: shaku-cloth. + * Also see {@link #createShakuCloth()}. + * @draft ICU 78 + */ + static MeasureUnit getShakuCloth(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: shaku-length. + * Caller owns returned value and must free it. + * Also see {@link #getShakuLength()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createShakuLength(UErrorCode &status); + + /** + * Returns by value, unit of length: shaku-length. + * Also see {@link #createShakuLength()}. + * @draft ICU 78 + */ + static MeasureUnit getShakuLength(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of length: solar-radius. * Caller owns returned value and must free it. @@ -2408,6 +3021,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getSolarRadius(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: sun. + * Caller owns returned value and must free it. + * Also see {@link #getSun()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSun(UErrorCode &status); + + /** + * Returns by value, unit of length: sun. + * Also see {@link #createSun()}. + * @draft ICU 78 + */ + static MeasureUnit getSun(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of length: yard. * Caller owns returned value and must free it. @@ -2488,6 +3119,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getSolarLuminosity(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of magnetic: tesla. + * Caller owns returned value and must free it. + * Also see {@link #getTesla()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createTesla(UErrorCode &status); + + /** + * Returns by value, unit of magnetic: tesla. + * Also see {@link #createTesla()}. + * @draft ICU 78 + */ + static MeasureUnit getTesla(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of magnetic: weber. + * Caller owns returned value and must free it. + * Also see {@link #getWeber()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createWeber(UErrorCode &status); + + /** + * Returns by value, unit of magnetic: weber. + * Also see {@link #createWeber()}. + * @draft ICU 78 + */ + static MeasureUnit getWeber(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of mass: carat. * Caller owns returned value and must free it. @@ -2536,6 +3203,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getEarthMass(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of mass: fun. + * Caller owns returned value and must free it. + * Also see {@link #getFun()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createFun(UErrorCode &status); + + /** + * Returns by value, unit of mass: fun. + * Also see {@link #createFun()}. + * @draft ICU 78 + */ + static MeasureUnit getFun(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of mass: grain. * Caller owns returned value and must free it. @@ -2584,30 +3269,6 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getKilogram(); - /** - * Returns by pointer, unit of mass: metric-ton - * (renamed to tonne in CLDR 42 / ICU 72). - * Caller owns returned value and must free it. - * Note: In ICU 74 this will be deprecated in favor of - * createTonne(), which is currently draft but will - * become stable in ICU 74, and which uses the preferred naming. - * Also see {@link #getMetricTon()} and {@link #createTonne()}. - * @param status ICU error code. - * @stable ICU 54 - */ - static MeasureUnit *createMetricTon(UErrorCode &status); - - /** - * Returns by value, unit of mass: metric-ton - * (renamed to tonne in CLDR 42 / ICU 72). - * Note: In ICU 74 this will be deprecated in favor of - * getTonne(), which is currently draft but will - * become stable in ICU 74, and which uses the preferred naming. - * Also see {@link #createMetricTon()} and {@link #getTonne()}. - * @stable ICU 64 - */ - static MeasureUnit getMetricTon(); - /** * Returns by pointer, unit of mass: microgram. * Caller owns returned value and must free it. @@ -2688,6 +3349,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPound(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of mass: slug. + * Caller owns returned value and must free it. + * Also see {@link #getSlug()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSlug(UErrorCode &status); + + /** + * Returns by value, unit of mass: slug. + * Also see {@link #createSlug()}. + * @draft ICU 78 + */ + static MeasureUnit getSlug(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of mass: solar-mass. * Caller owns returned value and must free it. @@ -2752,6 +3431,26 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getTonne(); +#ifndef U_HIDE_DEPRECATED_API + /** + * Returns by pointer, unit of mass: metric-ton + * (renamed to tonne in CLDR 42 / ICU 72). + * Caller owns returned value and must free it. + * Also see {@link #getMetricTon()} and {@link #createTonne()}. + * @param status ICU error code. + * @deprecated ICU 78 use createTonne(UErrorCode &status) + */ + static MeasureUnit *createMetricTon(UErrorCode &status); + + /** + * Returns by value, unit of mass: metric-ton + * (renamed to tonne in CLDR 42 / ICU 72). + * Also see {@link #createMetricTon()} and {@link #getTonne()}. + * @deprecated ICU 78 use getTonne() + */ + static MeasureUnit getMetricTon(); +#endif /* U_HIDE_DEPRECATED_API */ + /** * Returns by pointer, unit of power: gigawatt. * Caller owns returned value and must free it. @@ -2880,23 +3579,21 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getBar(); -#ifndef U_HIDE_DRAFT_API /** * Returns by pointer, unit of pressure: gasoline-energy-density. * Caller owns returned value and must free it. * Also see {@link #getGasolineEnergyDensity()}. * @param status ICU error code. - * @draft ICU 74 + * @stable ICU 74 */ static MeasureUnit *createGasolineEnergyDensity(UErrorCode &status); /** * Returns by value, unit of pressure: gasoline-energy-density. * Also see {@link #createGasolineEnergyDensity()}. - * @draft ICU 74 + * @stable ICU 74 */ static MeasureUnit getGasolineEnergyDensity(); -#endif /* U_HIDE_DRAFT_API */ /** * Returns by pointer, unit of pressure: hectopascal. @@ -2994,6 +3691,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getMillimeterOfMercury(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of pressure: ofhg. + * Caller owns returned value and must free it. + * Also see {@link #getOfhg()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createOfhg(UErrorCode &status); + + /** + * Returns by value, unit of pressure: ofhg. + * Also see {@link #createOfhg()}. + * @draft ICU 78 + */ + static MeasureUnit getOfhg(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of pressure: pascal. * Caller owns returned value and must free it. @@ -3026,23 +3741,21 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPoundPerSquareInch(); -#ifndef U_HIDE_DRAFT_API /** * Returns by pointer, unit of speed: beaufort. * Caller owns returned value and must free it. * Also see {@link #getBeaufort()}. * @param status ICU error code. - * @draft ICU 73 + * @stable ICU 73 */ static MeasureUnit *createBeaufort(UErrorCode &status); /** * Returns by value, unit of speed: beaufort. * Also see {@link #createBeaufort()}. - * @draft ICU 73 + * @stable ICU 73 */ static MeasureUnit getBeaufort(); -#endif /* U_HIDE_DRAFT_API */ /** * Returns by pointer, unit of speed: kilometer-per-hour. @@ -3076,6 +3789,22 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getKnot(); + /** + * Returns by pointer, unit of speed: light-speed. + * Caller owns returned value and must free it. + * Also see {@link #getLightSpeed()}. + * @param status ICU error code. + * @stable ICU 76 + */ + static MeasureUnit *createLightSpeed(UErrorCode &status); + + /** + * Returns by value, unit of speed: light-speed. + * Also see {@link #createLightSpeed()}. + * @stable ICU 76 + */ + static MeasureUnit getLightSpeed(); + /** * Returns by pointer, unit of speed: meter-per-second. * Caller owns returned value and must free it. @@ -3172,6 +3901,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getKelvin(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of temperature: rankine. + * Caller owns returned value and must free it. + * Also see {@link #getRankine()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createRankine(UErrorCode &status); + + /** + * Returns by value, unit of temperature: rankine. + * Also see {@link #createRankine()}. + * @draft ICU 78 + */ + static MeasureUnit getRankine(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of torque: newton-meter. * Caller owns returned value and must free it. @@ -3396,6 +4143,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getCup(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: cup-imperial. + * Caller owns returned value and must free it. + * Also see {@link #getCupImperial()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createCupImperial(UErrorCode &status); + + /** + * Returns by value, unit of volume: cup-imperial. + * Also see {@link #createCupImperial()}. + * @draft ICU 78 + */ + static MeasureUnit getCupImperial(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: cup-jp. + * Caller owns returned value and must free it. + * Also see {@link #getCupJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createCupJp(UErrorCode &status); + + /** + * Returns by value, unit of volume: cup-jp. + * Also see {@link #createCupJp()}. + * @draft ICU 78 + */ + static MeasureUnit getCupJp(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: cup-metric. * Caller owns returned value and must free it. @@ -3524,6 +4307,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getFluidOunceImperial(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: fluid-ounce-metric. + * Caller owns returned value and must free it. + * Also see {@link #getFluidOunceMetric()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createFluidOunceMetric(UErrorCode &status); + + /** + * Returns by value, unit of volume: fluid-ounce-metric. + * Also see {@link #createFluidOunceMetric()}. + * @draft ICU 78 + */ + static MeasureUnit getFluidOunceMetric(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: gallon. * Caller owns returned value and must free it. @@ -3588,6 +4389,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getJigger(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: koku. + * Caller owns returned value and must free it. + * Also see {@link #getKoku()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createKoku(UErrorCode &status); + + /** + * Returns by value, unit of volume: koku. + * Also see {@link #createKoku()}. + * @draft ICU 78 + */ + static MeasureUnit getKoku(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: kosaji. + * Caller owns returned value and must free it. + * Also see {@link #getKosaji()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createKosaji(UErrorCode &status); + + /** + * Returns by value, unit of volume: kosaji. + * Also see {@link #createKosaji()}. + * @draft ICU 78 + */ + static MeasureUnit getKosaji(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: liter. * Caller owns returned value and must free it. @@ -3636,6 +4473,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getMilliliter(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: osaji. + * Caller owns returned value and must free it. + * Also see {@link #getOsaji()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createOsaji(UErrorCode &status); + + /** + * Returns by value, unit of volume: osaji. + * Also see {@link #createOsaji()}. + * @draft ICU 78 + */ + static MeasureUnit getOsaji(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: pinch. * Caller owns returned value and must free it. @@ -3668,6 +4523,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPint(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: pint-imperial. + * Caller owns returned value and must free it. + * Also see {@link #getPintImperial()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createPintImperial(UErrorCode &status); + + /** + * Returns by value, unit of volume: pint-imperial. + * Also see {@link #createPintImperial()}. + * @draft ICU 78 + */ + static MeasureUnit getPintImperial(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: pint-metric. * Caller owns returned value and must free it. @@ -3716,6 +4589,42 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getQuartImperial(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: sai. + * Caller owns returned value and must free it. + * Also see {@link #getSai()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createSai(UErrorCode &status); + + /** + * Returns by value, unit of volume: sai. + * Also see {@link #createSai()}. + * @draft ICU 78 + */ + static MeasureUnit getSai(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: shaku. + * Caller owns returned value and must free it. + * Also see {@link #getShaku()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createShaku(UErrorCode &status); + + /** + * Returns by value, unit of volume: shaku. + * Also see {@link #createShaku()}. + * @draft ICU 78 + */ + static MeasureUnit getShaku(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of volume: tablespoon. * Caller owns returned value and must free it. @@ -3748,6 +4657,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getTeaspoon(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: to-jp. + * Caller owns returned value and must free it. + * Also see {@link #getToJp()}. + * @param status ICU error code. + * @draft ICU 78 + */ + static MeasureUnit *createToJp(UErrorCode &status); + + /** + * Returns by value, unit of volume: to-jp. + * Also see {@link #createToJp()}. + * @draft ICU 78 + */ + static MeasureUnit getToJp(); +#endif /* U_HIDE_DRAFT_API */ + // End generated createXXX methods protected: diff --git a/deps/icu-small/source/i18n/unicode/measure.h b/deps/icu-small/source/i18n/unicode/measure.h index fbef17c8f03884..b2812a6b879387 100644 --- a/deps/icu-small/source/i18n/unicode/measure.h +++ b/deps/icu-small/source/i18n/unicode/measure.h @@ -89,15 +89,13 @@ class U_I18N_API Measure: public UObject { */ bool operator==(const UObject& other) const; -#ifndef U_HIDE_DRAFT_API /** * Inequality operator. Returns true if this object is not equal to the other object. * @param other the object to compare with * @return true if the objects are not equal - * @draft ICU 74 + * @stable ICU 74 */ inline bool operator!=(const UObject& other) const { return !operator==(other); } -#endif // U_HIDE_DRAFT_API /** * Return a reference to the numeric value of this object. The @@ -124,7 +122,7 @@ class U_I18N_API Measure: public UObject { * @return The class ID for all objects of this class. * @stable ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -137,7 +135,7 @@ class U_I18N_API Measure: public UObject { * other classes have different class IDs. * @stable ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; protected: /** diff --git a/deps/icu-small/source/i18n/unicode/messageformat2.h b/deps/icu-small/source/i18n/unicode/messageformat2.h new file mode 100644 index 00000000000000..f98e591fad3f3f --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2.h @@ -0,0 +1,481 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_H +#define MESSAGEFORMAT2_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ + +#include "unicode/messageformat2_arguments.h" +#include "unicode/messageformat2_data_model.h" +#include "unicode/messageformat2_function_registry.h" +#include "unicode/normalizer2.h" +#include "unicode/unistr.h" + +#ifndef U_HIDE_DEPRECATED_API + +U_NAMESPACE_BEGIN + +namespace message2 { + + class Environment; + class MessageContext; + class StaticErrors; + class InternalValue; + + /** + * <p>MessageFormatter is a Technical Preview API implementing MessageFormat 2.0. + * + * <p>See <a target="github" href="https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md">the + * description of the syntax with examples and use cases</a> and the corresponding + * <a target="github" href="https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf">ABNF</a> grammar.</p> + * + * The MessageFormatter class is mutable and movable. It is not copyable. + * (It is mutable because if it has a custom function registry, the registry may include + * `FormatterFactory` objects implementing custom formatters, which are allowed to contain + * mutable state.) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS MessageFormatter : public UObject { + // Note: This class does not currently inherit from the existing + // `Format` class. + public: + /** + * Move assignment operator: + * The source MessageFormatter will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MessageFormatter& operator=(MessageFormatter&&) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~MessageFormatter(); + + /** + * Formats the message to a string, using the data model that was previously set or parsed, + * and the given `arguments` object. + * + * @param arguments Reference to message arguments + * @param status Input/output error code used to indicate syntax errors, data model + * errors, resolution errors, formatting errors, selection errors, as well + * as other errors (such as memory allocation failures). Partial output + * is still provided in the presence of most error types. + * @return The string result of formatting the message with the given arguments. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UnicodeString formatToString(const MessageArguments& arguments, UErrorCode& status); + + /** + * Not yet implemented; formats the message to a `FormattedMessage` object, + * using the data model that was previously set or parsed, + * and the given `arguments` object. + * + * @param arguments Reference to message arguments + * @param status Input/output error code used to indicate syntax errors, data model + * errors, resolution errors, formatting errors, selection errors, as well + * as other errors (such as memory allocation failures). Partial output + * is still provided in the presence of most error types. + * @return The `FormattedMessage` representing the formatted message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedMessage format(const MessageArguments& arguments, UErrorCode& status) const { + (void) arguments; + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return FormattedMessage(status); + } + + /** + * Accesses the locale that this `MessageFormatter` object was created with. + * + * @return A reference to the locale. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Locale& getLocale() const { return locale; } + + /** + * Serializes the data model as a string in MessageFormat 2.0 syntax. + * + * @return result A string representation of the data model. + * The string is a valid MessageFormat 2.0 message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UnicodeString getPattern() const; + + /** + * Accesses the data model referred to by this + * `MessageFormatter` object. + * + * @return A reference to the data model. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const MFDataModel& getDataModel() const; + + /** + * Used in conjunction with the + * MessageFormatter::Builder::setErrorHandlingBehavior() method. + * + * @internal ICU 76 technology preview + * @deprecated This API is for technology preview only. + */ + typedef enum UMFErrorHandlingBehavior { + /** + * Suppress errors and return best-effort output. + * + * @internal ICU 76 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BEST_EFFORT = 0, + /** + * Signal all MessageFormat errors using the UErrorCode + * argument. + * + * @internal ICU 76 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_STRICT + } UMFErrorHandlingBehavior; + + /** + * The mutable Builder class allows each part of the MessageFormatter to be initialized + * separately; calling its `build()` method yields an immutable MessageFormatter. + * + * Not copyable or movable. + */ + class U_I18N_API_CLASS Builder : public UObject { + private: + friend class MessageFormatter; + + // The pattern to be parsed to generate the formatted message + UnicodeString pattern; + bool hasPattern = false; + bool hasDataModel = false; + // The data model to be used to generate the formatted message + // Initialized either by `setDataModel()`, or by the parser + // through a call to `setPattern()` + MFDataModel dataModel; + // Normalized representation of the pattern; + // ignored if `setPattern()` wasn't called + UnicodeString normalizedInput; + // Errors (internal representation of parse errors) + // Ignored if `setPattern()` wasn't called + StaticErrors* errors; + Locale locale; + // Not owned + const MFFunctionRegistry* customMFFunctionRegistry; + // Error behavior; see comment in `MessageFormatter` class + bool signalErrors = false; + + void clearState(); + public: + /** + * Sets the locale to use for formatting. + * + * @param locale The desired locale. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setLocale(const Locale& locale); + /** + * Sets the pattern (contents of the message) and parses it + * into a data model. If a data model was + * previously set, it is removed. + * + * @param pattern A string in MessageFormat 2.0 syntax. + * @param parseError Struct to receive information on the position + * of an error within the pattern. + * @param status Input/output error code. If the + * pattern cannot be parsed, set to failure code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setPattern(const UnicodeString& pattern, + UParseError& parseError, + UErrorCode& status); + /** + * Sets a custom function registry. + * + * @param functionRegistry Reference to the function registry to use. + * `functionRegistry` is not copied, + * and the caller must ensure its lifetime contains + * the lifetime of the `MessageFormatter` object built by this + * builder. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setFunctionRegistry(const MFFunctionRegistry& functionRegistry); + /** + * Sets a data model. If a pattern was previously set, it is removed. + * + * @param dataModel Data model to format. Passed by move. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setDataModel(MFDataModel&& dataModel); + /** + * Set the error handling behavior for this formatter. + * + * "Strict" error behavior means that that formatting methods + * will set their UErrorCode arguments to signal MessageFormat + * data model, resolution, and runtime errors. Syntax errors are + * always signaled. + * + * "Best effort" error behavior means that MessageFormat errors are + * suppressed: formatting methods will _not_ set their + * UErrorCode arguments to signal MessageFormat data model, + * resolution, or runtime errors. Best-effort output + * will be returned. Syntax errors are always signaled. + * This is the default behavior. + * + * @param type An enum with type UMFErrorHandlingBehavior; + * if type == `U_MF_STRICT`, then + * errors are handled strictly. + * If type == `U_MF_BEST_EFFORT`, then + * best-effort output is returned. + * + * The default is to suppress all MessageFormat errors + * and return best-effort output. + * + * @return A reference to the builder. + * + * @internal ICU 76 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setErrorHandlingBehavior(UMFErrorHandlingBehavior type); + /** + * Constructs a new immutable MessageFormatter using the pattern or data model + * that was previously set, and the locale (if it was previously set) + * or default locale (otherwise). + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code. If neither the pattern + * nor the data model is set, set to failure code. + * @return The new MessageFormatter object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MessageFormatter build(UErrorCode& status) const; + /** + * Default constructor. + * Returns a Builder with the default locale and with no + * data model or pattern set. Either `setPattern()` + * or `setDataModel()` has to be called before calling `build()`. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Builder(); + }; // class MessageFormatter::Builder + + // TODO: Shouldn't be public; only used for testing + /** + * Returns a string consisting of the input with optional spaces removed. + * + * @return A normalized string representation of the input + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& getNormalizedPattern() const { return normalizedInput; } + + private: + friend class Builder; + friend class Checker; + friend class MessageArguments; + friend class MessageContext; + + MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &status); + + MessageFormatter() = delete; // default constructor not implemented + + // Do not define default assignment operator + const MessageFormatter &operator=(const MessageFormatter &) = delete; + + // Selection methods + + // Takes a vector of FormattedPlaceholders + void resolveSelectors(MessageContext&, const Environment& env, UErrorCode&, UVector&) const; + // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (output) + void filterVariants(const UVector&, UVector&, UErrorCode&) const; + // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (input/output) + void sortVariants(const UVector&, UVector&, UErrorCode&) const; + // Takes a vector of strings (input) and a vector of strings (output) + void matchSelectorKeys(const UVector&, MessageContext&, InternalValue* rv, UVector&, UErrorCode&) const; + // Takes a vector of FormattedPlaceholders (input), + // and a vector of vectors of strings (output) + void resolvePreferences(MessageContext&, UVector&, UVector&, UErrorCode&) const; + + // Formatting methods + + [[nodiscard]] FormattedPlaceholder formatLiteral(const UnicodeString&, const data_model::Literal&) const; + void formatPattern(MessageContext&, const Environment&, const data_model::Pattern&, UErrorCode&, UnicodeString&) const; + // Evaluates a function call + // Dispatches on argument type + [[nodiscard]] InternalValue* evalFunctionCall(FormattedPlaceholder&& argument, + MessageContext& context, + UErrorCode& status) const; + // Dispatches on function name + [[nodiscard]] InternalValue* evalFunctionCall(const FunctionName& functionName, + InternalValue* argument, + FunctionOptions&& options, + MessageContext& context, + UErrorCode& status) const; + // Formats an expression that appears in a pattern or as the definition of a local variable + [[nodiscard]] InternalValue* formatExpression(const UnicodeString&, + const Environment&, + const data_model::Expression&, + MessageContext&, + UErrorCode&) const; + [[nodiscard]] FunctionOptions resolveOptions(const Environment& env, const OptionMap&, MessageContext&, UErrorCode&) const; + [[nodiscard]] InternalValue* formatOperand(const UnicodeString&, + const Environment&, + const data_model::Operand&, + MessageContext&, + UErrorCode&) const; + [[nodiscard]] FormattedPlaceholder evalArgument(const UnicodeString&, + const data_model::VariableName&, + MessageContext&, + UErrorCode&) const; + void formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const; + + // Function registry methods + bool hasCustomMFFunctionRegistry() const { + return (customMFFunctionRegistry != nullptr); + } + + // Precondition: custom function registry exists + // Note: this is non-const because the values in the MFFunctionRegistry are mutable + // (a FormatterFactory can have mutable state) + const MFFunctionRegistry& getCustomMFFunctionRegistry() const; + + bool isCustomFormatter(const FunctionName&) const; + FormatterFactory* lookupFormatterFactory(const FunctionName&, UErrorCode& status) const; + bool isBuiltInSelector(const FunctionName&) const; + bool isBuiltInFormatter(const FunctionName&) const; + bool isCustomSelector(const FunctionName&) const; + const SelectorFactory* lookupSelectorFactory(MessageContext&, const FunctionName&, UErrorCode&) const; + bool isSelector(const FunctionName& fn) const { return isBuiltInSelector(fn) || isCustomSelector(fn); } + bool isFormatter(const FunctionName& fn) const { return isBuiltInFormatter(fn) || isCustomFormatter(fn); } + const Formatter* lookupFormatter(const FunctionName&, UErrorCode&) const; + + Selector* getSelector(MessageContext&, const FunctionName&, UErrorCode&) const; + Formatter* getFormatter(const FunctionName&, UErrorCode&) const; + bool getDefaultFormatterNameByType(const UnicodeString&, FunctionName&) const; + + // Checking for resolution errors + void checkDeclarations(MessageContext&, Environment*&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const data_model::Expression&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const data_model::Operand&, UErrorCode&) const; + void check(MessageContext&, const Environment&, const OptionMap&, UErrorCode&) const; + + void initErrors(UErrorCode&); + void clearErrors() const; + void cleanup() noexcept; + + // The locale this MessageFormatter was created with + /* const */ Locale locale; + + // Registry for built-in functions + MFFunctionRegistry standardMFFunctionRegistry; + // Registry for custom functions; may be null if no custom registry supplied + // Note: this is *not* owned by the MessageFormatter object + // The reason for this choice is to have a non-destructive MessageFormatter::Builder, + // while also not requiring the function registry to be deeply-copyable. Making the + // function registry copyable would impose a requirement on any implementations + // of the FormatterFactory and SelectorFactory interfaces to implement a custom + // clone() method, which is necessary to avoid sharing between copies of the + // function registry (and thus double-frees) + // Not deeply immutable (the values in the function registry are mutable, + // as a FormatterFactory can have mutable state + const MFFunctionRegistry* customMFFunctionRegistry; + + // Data model, representing the parsed message + MFDataModel dataModel; + + // Normalized version of the input string (optional whitespace removed) + UnicodeString normalizedInput; + + // Errors -- only used while parsing and checking for data model errors; then + // the MessageContext keeps track of errors + // Must be a raw pointer to avoid including the internal header file + // defining StaticErrors + // Owned by `this` + StaticErrors* errors = nullptr; + + // Error handling behavior. + // If true, then formatting methods set their UErrorCode arguments + // to signal MessageFormat errors, and no useful output is returned. + // If false, then MessageFormat errors are not signaled and the + // formatting methods return best-effort output. + // The default is false. + bool signalErrors = false; + + }; // class MessageFormatter + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h b/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h new file mode 100644 index 00000000000000..c0d31f3ff37702 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_arguments.h @@ -0,0 +1,129 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_ARGUMENTS_H +#define MESSAGEFORMAT2_ARGUMENTS_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +/** + * \file + * \brief C++ API: Formats messages using the draft MessageFormat 2.0. + */ + +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/messageformat2_formattable.h" +#include "unicode/unistr.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include <map> + +U_NAMESPACE_BEGIN + +namespace message2 { + + class MessageFormatter; + + // Arguments + // ---------- + + /** + * + * The `MessageArguments` class represents the named arguments to a message. + * It is immutable and movable. It is not copyable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS MessageArguments : public UObject { + public: + /** + * Message arguments constructor, which takes a map and returns a container + * of arguments that can be passed to a `MessageFormatter`. + * + * @param args A reference to a map from strings (argument names) to `message2::Formattable` + * objects (argument values). The keys and values of the map are copied into the result. + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MessageArguments(const std::map<UnicodeString, Formattable>& args, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + argumentNames = LocalArray<UnicodeString>(new UnicodeString[argsLen = static_cast<int32_t>(args.size())]); + arguments = LocalArray<Formattable>(new Formattable[argsLen]); + if (!argumentNames.isValid() || !arguments.isValid()) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + int32_t i = 0; + for (auto iter = args.begin(); iter != args.end(); ++iter) { + argumentNames[i] = iter->first; + arguments[i] = iter->second; + i++; + } + } + /** + * Move operator: + * The source MessageArguments will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MessageArguments& operator=(MessageArguments&&) noexcept; + /** + * Default constructor. + * Returns an empty arguments mapping. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MessageArguments() = default; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~MessageArguments(); + private: + friend class MessageContext; + + const Formattable* getArgument(const data_model::VariableName&, + UErrorCode&) const; + + // Avoids using Hashtable so that code constructing a Hashtable + // doesn't have to appear in this header file + LocalArray<UnicodeString> argumentNames; + LocalArray<Formattable> arguments; + int32_t argsLen = 0; + }; // class MessageArguments + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_ARGUMENTS_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h new file mode 100644 index 00000000000000..27bff72843603c --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h @@ -0,0 +1,2423 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT_DATA_MODEL_H +#define MESSAGEFORMAT_DATA_MODEL_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/localpointer.h" +#include "unicode/messageformat2_data_model_names.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include <algorithm> +#include <cstddef> +#include <iterator> +#include <optional> +#include <variant> +#include <vector> + +U_NAMESPACE_BEGIN + +class UVector; + +// Helpers + +// Note: this _must_ be declared `inline` or else gcc will generate code +// for its instantiations, which needs to be avoided because it returns +// a std::vector +template<typename T> +static inline std::vector<T> toStdVector(const T* arr, int32_t len) { + std::vector<T> result; + for (int32_t i = 0; i < len; i++) { + result.push_back(arr[i]); + } + return result; +} + +#if defined(U_REAL_MSVC) +#pragma warning(push) +// Ignore warning 4251 as these templates are instantiated later in this file, +// after the classes used to instantiate them have been defined. +#pragma warning(disable: 4251) +#endif + +namespace message2 { + class Checker; + class MessageFormatter; + class Parser; + class Serializer; + + + namespace data_model { + class Binding; + class Literal; + class Operator; + class MFDataModel; + + /** + * The `Literal` class corresponds to the `literal` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf and the + * `Literal` interface defined in + * // https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions + * + * `Literal` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Literal : public UObject { + public: + /** + * Returns the quoted representation of this literal (enclosed in '|' characters) + * + * @return A string representation of the literal enclosed in quote characters. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString quoted() const; + /** + * Returns the parsed string contents of this literal. + * + * @return A string representation of this literal. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& unquoted() const; + /** + * Determines if this literal appeared as a quoted literal in the message. + * + * @return true if and only if this literal appeared as a quoted literal in the + * message. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isQuoted() const { return thisIsQuoted; } + /** + * Literal constructor. + * + * @param q True if and only if this literal was parsed with the `quoted` nonterminal + * (appeared enclosed in '|' characters in the message text). + * @param s The string contents of this literal; escape sequences are assumed to have + * been interpreted already. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal(UBool q, const UnicodeString& s) : thisIsQuoted(q), contents(s) {} + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal(const Literal& other) : thisIsQuoted(other.thisIsQuoted), contents(other.contents) {} + /** + * Non-member swap function. + * @param l1 will get l2's contents + * @param l2 will get l1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Literal& l1, Literal& l2) noexcept { + using std::swap; + + swap(l1.thisIsQuoted, l2.thisIsQuoted); + swap(l1.contents, l2.contents); + } + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal& operator=(Literal) noexcept; + /** + * Default constructor. + * Puts the Literal into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Literal() = default; + /** + * Less than operator. Compares `this.stringContents()` with + * `other.stringContents()`. This method is used in representing + * the mapping from key lists to patterns in a message with variants, + * and is not expected to be useful otherwise. + * + * @param other The Literal to compare to this one. + * @return true if the parsed string corresponding to this `Literal` + * is less than the parsed string corresponding to the other `Literal` + * (according to `UnicodeString`'s less-than operator). + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator<(const Literal& other) const; + /** + * Equality operator. Compares `this.stringContents()` with + * `other.stringContents()`. This method is used in representing + * the mapping from key lists to patterns in a message with variants, + * and is not expected to be useful otherwise. + * + * @param other The Literal to compare to this one. + * @return true if the parsed string corresponding to this `Literal` + * equals the parsed string corresponding to the other `Literal` + * (according to `UnicodeString`'s equality operator). + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool operator==(const Literal& other) const; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Literal(); + + private: + /* const */ bool thisIsQuoted = false; + /* const */ UnicodeString contents; + }; + + /** + * The `Operand` class corresponds to the `operand` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf . + * It represents a `Literal | VariableRef` -- see the `operand?` field of the `FunctionRef` + * interface defined at: + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#expressions + * with the difference that it can also represent a null operand (the absent operand in an + * `annotation` with no operand). + * + * `Operand` is immutable and is copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS Operand : public UObject { + public: + /** + * Determines if this operand represents a variable. + * + * @return True if and only if the operand is a variable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isVariable() const; + /** + * Determines if this operand represents a literal. + * + * @return True if and only if the operand is a literal. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isLiteral() const; + /** + * Determines if this operand is the null operand. + * + * @return True if and only if the operand is the null operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UBool isNull() const; + /** + * Returns a reference to this operand's variable name. + * Precondition: isVariable() + * + * @return A reference to the name of the variable + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& asVariable() const; + /** + * Returns a reference to this operand's literal contents. + * Precondition: isLiteral() + * + * @return A reference to the literal + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Literal& asLiteral() const; + /** + * Default constructor. + * Creates a null Operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Operand() : contents(std::nullopt) {} + /** + * Variable operand constructor. + * + * @param v The variable name; an operand corresponding + * to a reference to `v` is returned. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit Operand(const UnicodeString& v) : contents(VariableName(v)) {} + /** + * Literal operand constructor. + * + * @param l The literal to use for this operand; an operand + * corresponding to `l` is returned. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit Operand(const Literal& l) : contents(l) {} + /** + * Non-member swap function. + * @param o1 will get o2's contents + * @param o2 will get o1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Operand& o1, Operand& o2) noexcept { + using std::swap; + (void) o1; + (void) o2; + swap(o1.contents, o2.contents); + } + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual Operand& operator=(Operand) noexcept; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Operand(const Operand&); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Operand(); + private: + std::optional<std::variant<VariableName, Literal>> contents; + }; // class Operand + + /** + * The `Key` class corresponds to the `key` nonterminal in the MessageFormat 2 grammar, + * https://github.com/unicode-org/message-format-wg/blob/main/spec/message.abnf . + * It also corresponds to + * the `Literal | CatchallKey` that is the + * element type of the `keys` array in the `Variant` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#messages + * + * A key is either a literal or the wildcard symbol (represented in messages as '*') + * + * `Key` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS Key : public UObject { + public: + /** + * Determines if this is a wildcard key + * + * @return True if and only if this is the wildcard key + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isWildcard() const { return !contents.has_value(); } + /** + * Returns the contents of this key as a literal. + * Precondition: !isWildcard() + * + * @return The literal contents of the key + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Literal& asLiteral() const; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Key(const Key& other) : contents(other.contents) {} + /** + * Wildcard constructor; constructs a Key representing the + * catchall or wildcard key, '*'. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Key() : contents(std::nullopt) {} + /** + * Literal key constructor. + * + * @param lit A Literal to use for this key. The result matches the + * literal `lit`. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit Key(const Literal& lit) : contents(lit) {} + /** + * Non-member swap function. + * @param k1 will get k2's contents + * @param k2 will get k1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Key& k1, Key& k2) noexcept { + using std::swap; + + swap(k1.contents, k2.contents); + } + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Key& operator=(Key) noexcept; + /** + * Less than operator. Compares the literal of `this` with the literal of `other`. + * This method is used in representing the mapping from key lists to patterns + * in a message with variants, and is not expected to be useful otherwise. + * + * @param other The Key to compare to this one. + * @return true if the two `Key`s are not wildcards and if `this.asLiteral()` + * < `other.asLiteral()`. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool operator<(const Key& other) const; + /** + * Equality operator. Compares the literal of `this` with the literal of `other`. + * This method is used in representing the mapping from key lists to patterns + * in a message with variants, and is not expected to be useful otherwise. + * + * @param other The Key to compare to this one. + * @return true if either both `Key`s are wildcards, or `this.asLiteral()` + * == `other.asLiteral()`. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool operator==(const Key& other) const; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Key(); + private: + /* const */ std::optional<Literal> contents; + }; // class Key + + /** + * The `SelectorKeys` class represents the key list for a single variant. + * It corresponds to the `keys` array in the `Variant` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#messages + * + * `SelectorKeys` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS SelectorKeys : public UObject { + public: + /** + * Returns the underlying list of keys. + * + * @return The list of keys for this variant. + * Returns an empty list if allocating this `SelectorKeys` + * object previously failed. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API std::vector<Key> getKeys() const { + return toStdVector<Key>(keys.getAlias(), len); + } + /** + * The mutable `SelectorKeys::Builder` class allows the key list to be constructed + * one key at a time. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class SelectorKeys; + UVector* keys; // This is a raw pointer and not a LocalPointer<UVector> to avoid undefined behavior warnings, + // since UVector is forward-declared + // The vector owns its elements + public: + /** + * Adds a single key to the list. + * + * @param key The key to be added. Passed by move + * @param status Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(Key&& key, UErrorCode& status) noexcept; + /** + * Constructs a new immutable `SelectorKeys` using the list of keys + * set with previous `add()` calls. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code + * @return The new SelectorKeys object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorKeys build(UErrorCode& status) const; + /** + * Default constructor. + * Returns a Builder with an empty list of keys. + * + * @param status Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class SelectorKeys::Builder + /** + * Less than operator. Compares the two key lists lexicographically. + * This method makes it possible for a `SelectorKeys` to be used as a map + * key, which allows variants to be represented as a map. It is not expected + * to be useful otherwise. + * + * @param other The SelectorKeys to compare to this one. + * @return true if `this` is less than `other`, comparing the two key lists + * lexicographically. + * Returns false otherwise. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool operator<(const SelectorKeys& other) const; + /** + * Default constructor. + * Puts the SelectorKeys into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API SelectorKeys() : len(0) {} + /** + * Non-member swap function. + * @param s1 will get s2's contents + * @param s2 will get s1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(SelectorKeys& s1, SelectorKeys& s2) noexcept { + using std::swap; + + swap(s1.len, s2.len); + swap(s1.keys, s2.keys); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API SelectorKeys(const SelectorKeys& other); + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API SelectorKeys& operator=(SelectorKeys other) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~SelectorKeys(); + private: + friend class Builder; + friend class message2::Checker; + friend class message2::MessageFormatter; + friend class message2::Serializer; + + /* const */ LocalArray<Key> keys; + /* const */ int32_t len; + + const Key* getKeysInternal() const; + SelectorKeys(const UVector& ks, UErrorCode& status); + }; // class SelectorKeys + + class Operator; + + /** + * An `Option` pairs an option name with an Operand. + * + * `Option` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Option : public UObject { + public: + /** + * Accesses the right-hand side of the option. + * + * @return A reference to the operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Operand& getValue() const { return rand; } + /** + * Accesses the left-hand side of the option. + * + * @return A reference to the option name. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& getName() const { return name; } + /** + * Constructor. Returns an `Option` representing the + * named option "name=rand". + * + * @param n The name of the option. + * @param r The value of the option. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option(const UnicodeString& n, Operand&& r) : name(n), rand(std::move(r)) {} + /** + * Default constructor. + * Returns an Option in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option() {} + /** + * Non-member swap function. + * @param o1 will get o2's contents + * @param o2 will get o1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Option& o1, Option& o2) noexcept { + using std::swap; + + swap(o1.name, o2.name); + swap(o1.rand, o2.rand); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option(const Option& other); + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Option& operator=(Option other) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Option(); + private: + /* const */ UnicodeString name; + /* const */ Operand rand; + }; // class Option + + // Internal only + #ifndef U_IN_DOXYGEN + // Options + // This is a wrapper class around a vector of options that provides lookup operations + class U_I18N_API_CLASS OptionMap : public UObject { + public: + U_I18N_API int32_t size() const; + // Needs to take an error code b/c an earlier copy might have failed + U_I18N_API const Option& getOption(int32_t, UErrorCode&) const; + U_I18N_API friend inline void swap(OptionMap& m1, OptionMap& m2) noexcept { + using std::swap; + + swap(m1.bogus, m2.bogus); + swap(m1.options, m2.options); + swap(m1.len, m2.len); + } + U_I18N_API OptionMap() : len(0) {} + U_I18N_API OptionMap(const OptionMap&); + U_I18N_API OptionMap& operator=(OptionMap); + U_I18N_API std::vector<Option> getOptions() const { + return toStdVector<Option>(options.getAlias(), len); + } + U_I18N_API OptionMap(const UVector&, UErrorCode&); + U_I18N_API OptionMap(Option*, int32_t); + U_I18N_API virtual ~OptionMap(); + + class U_I18N_API Builder : public UObject { + private: + UVector* options; + bool checkDuplicates = true; + public: + Builder& add(Option&& opt, UErrorCode&); + Builder(UErrorCode&); + static Builder attributes(UErrorCode&); + // As this class is private, build() is destructive + OptionMap build(UErrorCode&); + friend inline void swap(Builder& m1, Builder& m2) noexcept { + using std::swap; + + swap(m1.options, m2.options); + swap(m1.checkDuplicates, m2.checkDuplicates); + } + Builder(Builder&&); + Builder(const Builder&) = delete; + Builder& operator=(Builder) noexcept; + virtual ~Builder(); + }; // class OptionMap::Builder + private: + friend class message2::Serializer; + + bool bogus = false; + LocalArray<Option> options; + int32_t len; + }; // class OptionMap + #endif + + /** + * The `Operator` class corresponds to the `FunctionRef` type in the + * `Expression` interface defined in + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#patterns + * + * It represents the annotation that an expression can have: a function name paired + * with a map from option names to operands (possibly empty). + * + * `Operator` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Operator : public UObject { + public: + /** + * Accesses the function name. + * + * @return The function name of this operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const FunctionName& getFunctionName() const; + /** + * Accesses function options. + * + * @return A vector of function options for this operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + std::vector<Option> getOptions() const { + return options.getOptions(); + } + /** + * The mutable `Operator::Builder` class allows the operator to be constructed + * incrementally. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class Operator; + FunctionName functionName; + OptionMap::Builder options; + public: + /** + * Sets this operator to be a function annotation and sets its name + * to `func`. + * + * @param func The function name. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setFunctionName(FunctionName&& func); + /** + * Sets this operator to be a function annotation and adds a + * single option. + * + * @param key The name of the option. + * @param value The value (right-hand side) of the option. + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addOption(const UnicodeString &key, Operand&& value, UErrorCode& status) noexcept; + /** + * Constructs a new immutable `Operator` using the + * function name and options that were previously set. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * The `build()` method is non-const for internal implementation reasons, + * but is observably const. + * + * @param status Input/output error code. + * @return The new Operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operator build(UErrorCode& status); + /** + * Default constructor. + * Returns a Builder with no function name or options set. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Operator::Builder + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operator(const Operator& other) noexcept; + /** + * Non-member swap function. + * @param o1 will get o2's contents + * @param o2 will get o1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Operator& o1, Operator& o2) noexcept { + using std::swap; + + swap(o1.name, o2.name); + swap(o1.options, o2.options); + } + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operator& operator=(Operator) noexcept; + /** + * Default constructor. + * Puts the Operator into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Operator() {} + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Operator(); + private: + friend class Binding; + friend class Builder; + friend class message2::Checker; + friend class message2::MessageFormatter; + friend class message2::Serializer; + + // Function call constructor + Operator(const FunctionName& f, const UVector& options, UErrorCode&); + + const OptionMap& getOptionsInternal() const; + Operator(const FunctionName&, const OptionMap&); + + /* const */ FunctionName name; + /* const */ OptionMap options; + }; // class Operator + + // Internal only + typedef enum UMarkupType { + UMARKUP_OPEN = 0, + UMARKUP_CLOSE, + UMARKUP_STANDALONE, + UMARKUP_COUNT + } UMarkupType; + + /** + * The `Markup` class corresponds to the `markup` nonterminal in the MessageFormat 2 + * grammar and the `markup` interface defined in + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model/message.json + * + * `Markup` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Markup : public UObject { + public: + /** + * Checks if this markup is an opening tag. + * + * @return True if and only if this represents an opening tag. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isOpen() const { return (type == UMARKUP_OPEN); } + /** + * Checks if this markup is an closing tag. + * + * @return True if and only if this represents an closing tag. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isClose() const { return (type == UMARKUP_CLOSE); } + /** + * Checks if this markup is an standalone tag. + * + * @return True if and only if this represents a standalone tag. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isStandalone() const { return (type == UMARKUP_STANDALONE); } + /** + * Gets the name of this markup + * + * @return A reference to the string identifying the markup + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& getName() const { return name; } + /** + * Gets the options of this markup + * + * @return A reference to the string identifying the markup + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + std::vector<Option> getOptions() const { return options.getOptions(); } + /** + * Gets the attributes of this markup + * + * @return A vector of attributes + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + std::vector<Option> getAttributes() const { return attributes.getOptions(); } + /** + * Default constructor. + * Puts the Markup into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Markup() {} + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Markup(); + /** + * The mutable `Markup::Builder` class allows the markup to be constructed + * incrementally. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class Markup; + + UnicodeString name; + OptionMap::Builder options; + OptionMap::Builder attributes; + UMarkupType type = UMARKUP_COUNT; + public: + /** + * Sets the name of this markup. + * + * @param n A string representing the name. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setName(const UnicodeString& n) { name = n; return *this; } + /** + * Sets this to be an opening markup. + * + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setOpen() { type = UMARKUP_OPEN; return *this; } + /** + * Sets this to be an closing markup. + * + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setClose() { type = UMARKUP_CLOSE; return *this; } + /** + * Sets this to be a standalone markup. + * + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setStandalone() { type = UMARKUP_STANDALONE; return *this; } + /** + * Adds a single option. + * + * @param key The name of the option. + * @param value The value (right-hand side) of the option. + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addOption(const UnicodeString &key, Operand&& value, UErrorCode& status); + /** + * Adds a single attribute. + * + * @param key The name of the attribute. + * @param value The value (right-hand side) of the attribute. + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addAttribute(const UnicodeString &key, Operand&& value, UErrorCode& status); + /** + * Constructs a new immutable `Markup` using the name and type + * and (optionally) options and attributes that were previously set. + * If `setName()` and at least one of `setOpen()`, `setClose()`, and `setStandalone()` + * were not previously called, + * then `status` is set to U_INVALID_STATE_ERROR. + * + * The builder object (`this`) can still be used after calling `build()`. + * The `build()` method is non-const for internal implementation reasons, + * but is observably const. + * + * @param status Input/output error code. + * @return The new Markup. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Markup build(UErrorCode& status); + /** + * Default constructor. + * Returns a Builder with no name, type, options, or attributes set. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Markup::Builder + + private: + friend class Builder; + friend class message2::Serializer; + + UMarkupType type; + UnicodeString name; + OptionMap options; + OptionMap attributes; + const OptionMap& getOptionsInternal() const { return options; } + const OptionMap& getAttributesInternal() const { return attributes; } + Markup(UMarkupType, UnicodeString, OptionMap&&, OptionMap&&); + }; // class Markup + + /** + * The `Expression` class corresponds to the `expression` nonterminal in the MessageFormat 2 + * grammar and the `Expression` interface defined in + * https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#patterns + * + * It represents either an operand with no annotation; an annotation with no operand; + * or an operand annotated with an annotation. + * + * `Expression` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS Expression : public UObject { + public: + /** + * Checks if this expression is an annotation + * with no operand. + * + * @return True if and only if the expression has + * an annotation and has no operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isStandaloneAnnotation() const; + /** + * Checks if this expression has a function + * annotation (with or without an operand). + * + * @return True if and only if the expression has an annotation + * that is a function. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isFunctionCall() const; + /** + * Accesses the function + * annotating this expression. + * If !(isFunctionCall()), sets + * `status` to U_INVALID_STATE_ERROR. + * + * @param status Input/output error code. + * @return A non-owned pointer to the operator of this expression, + * which does not outlive the expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Operator* getOperator(UErrorCode& status) const; + /** + * Accesses the operand of this expression. + * + * @return A reference to the operand of this expression, + * which may be the null operand. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Operand& getOperand() const; + /** + * Gets the attributes of this expression + * + * @return A vector of attributes + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API std::vector<Option> getAttributes() const { return attributes.getOptions(); } + /** + * The mutable `Expression::Builder` class allows the operator to be constructed + * incrementally. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class Expression; + + bool hasOperand = false; + bool hasOperator = false; + Operand rand; + Operator rator; + OptionMap::Builder attributes; + public: + /** + * Sets the operand of this expression. + * + * @param rAnd The operand to set. Passed by move. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setOperand(Operand&& rAnd); + /** + * Sets the operator of this expression. + * + * @param rAtor The operator to set. Passed by move. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setOperator(Operator&& rAtor); + /** + * Adds a single attribute. + * + * @param key The name of the attribute. + * @param value The value (right-hand side) of the attribute. + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addAttribute(const UnicodeString &key, Operand&& value, UErrorCode& status); + /** + * Constructs a new immutable `Expression` using the operand and operator that + * were previously set. If neither `setOperand()` nor `setOperator()` was + * previously called, or if `setOperand()` was called with the null operand + * and `setOperator()` was never called, then `status` is set to + * U_INVALID_STATE_ERROR. + * + * The builder object (`this`) can still be used after calling `build()`. + * The `build()` method is non-const for internal implementation reasons, + * but is observably const. + + * @param status Input/output error code. + * @return The new Expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Expression build(UErrorCode& status); + /** + * Default constructor. + * Returns a Builder with no operator or operand set. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Expression::Builder + /** + * Non-member swap function. + * @param e1 will get e2's contents + * @param e2 will get e1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Expression& e1, Expression& e2) noexcept { + using std::swap; + + swap(e1.rator, e2.rator); + swap(e1.rand, e2.rand); + swap(e1.attributes, e2.attributes); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Expression(const Expression& other); + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Expression& operator=(Expression) noexcept; + /** + * Default constructor. + * Puts the Expression into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Expression(); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Expression(); + private: + friend class message2::Serializer; + + /* + Internally, an expression is represented as the application of an optional operator to an operand. + The operand is always present; for function calls with no operand, it's represented + as an operand for which `isNull()` is true. + + Operator | Operand + -------------------------------- + { |42| :fun opt=value } => (FunctionName=fun, | Literal(quoted=true, contents="42") + options={opt: value}) + { abcd } => null | Literal(quoted=false, contents="abcd") + { : fun opt=value } => (FunctionName=fun, + options={opt: value}) | NullOperand() + */ + + Expression(const Operator &rAtor, const Operand &rAnd, const OptionMap& attrs) : rator(rAtor), rand(rAnd), attributes(attrs) {} + Expression(const Operand &rAnd, const OptionMap& attrs) : rator(std::nullopt), rand(Operand(rAnd)), attributes(attrs) {} + Expression(const Operator &rAtor, const OptionMap& attrs) : rator(rAtor), rand(), attributes(attrs) {} + /* const */ std::optional<Operator> rator; + /* const */ Operand rand; + /* const */ OptionMap attributes; + const OptionMap& getAttributesInternal() const { return attributes; } + }; // class Expression + + class Pattern; + + // Despite the comments, `PatternPart` is internal-only + /** + * A `PatternPart` is a single element (text or expression) in a `Pattern`. + * It corresponds to the `body` field of the `Pattern` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#patterns + * + * `PatternPart` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS PatternPart : public UObject { + public: + /** + * Checks if the part is a text part. + * + * @return True if and only if this is a text part. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isText() const { return std::holds_alternative<UnicodeString>(piece); } + /** + * Checks if the part is a markup part. + * + * @return True if and only if this is a markup part. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isMarkup() const { return std::holds_alternative<Markup>(piece); } + /** + * Checks if the part is an expression part. + * + * @return True if and only if this is an expression part. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isExpression() const { return std::holds_alternative<Expression>(piece); } + /** + * Accesses the expression of the part. + * Precondition: isExpression() + * + * @return A reference to the part's underlying expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Expression& contents() const; + /** + * Accesses the expression of the part. + * Precondition: isMarkup() + * + * @return A reference to the part's underlying expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Markup& asMarkup() const; + /** + * Accesses the text contents of the part. + * Precondition: isText() + * + * @return A reference to a string representing the part's text.. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& asText() const; + /** + * Non-member swap function. + * @param p1 will get p2's contents + * @param p2 will get p1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(PatternPart& p1, PatternPart& p2) noexcept { + using std::swap; + + swap(p1.piece, p2.piece); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API PatternPart(const PatternPart& other); + /** + * Assignment operator. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API PatternPart& operator=(PatternPart) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~PatternPart(); + /** + * Text part constructor. Returns a text pattern part + * with text `t`. + * + * @param t A text string. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit PatternPart(const UnicodeString& t) : piece(t) {} + /** + * Expression part constructor. Returns an Expression pattern + * part with expression `e`. + * + * @param e An Expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit PatternPart(Expression&& e) : piece(e) {} + /** + * Markup part constructor. Returns a Markup pattern + * part with markup `m` + * + * @param m A Markup. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit PatternPart(Markup&& m) : piece(m) {} + /** + * Default constructor. + * Puts the PatternPart into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API PatternPart() = default; + private: + friend class Pattern; + + std::variant<UnicodeString, Expression, Markup> piece; + }; // class PatternPart + + /** + * A `Pattern` is a sequence of formattable parts. + * It corresponds to the `Pattern` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#patterns + * + * `Pattern` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS Pattern : public UObject { + private: + friend class PatternPart; + + public: + #ifndef U_IN_DOXYGEN + struct U_I18N_API Iterator; + #endif + /** + * Returns the parts of this pattern + * + * @return A forward iterator of variants. Each element is either a string (text part) + * or an expression part. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Iterator begin() const { + return Iterator(this, 0); + } + /** + * Returns a special value to mark the end of iteration + * + * @return A forward iterator of variants. This should only be used for comparisons + * against an iterator returned by incrementing begin(). + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Iterator end() const { + return Iterator(this, len); + } + /** + * The mutable `Pattern::Builder` class allows the pattern to be + * constructed one part at a time. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class Pattern; + + UVector* parts; // Not a LocalPointer for the same reason as in `SelectorKeys::Builder` + + public: + /** + * Adds a single expression part to the pattern. + * + * @param part The part to be added (passed by move) + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(Expression&& part, UErrorCode& status) noexcept; + /** + * Adds a single markup part to the pattern. + * + * @param part The part to be added (passed by move) + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(Markup&& part, UErrorCode& status) noexcept; + /** + * Adds a single text part to the pattern. Copies `part`. + * + * @param part The part to be added (passed by move) + * @param status Input/output error code. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& add(UnicodeString&& part, UErrorCode& status) noexcept; + /** + * Constructs a new immutable `Pattern` using the list of parts + * set with previous `add()` calls. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code. + * @return The pattern object + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Pattern build(UErrorCode& status) const noexcept; + /** + * Default constructor. + * Returns a Builder with an empty sequence of PatternParts. + * + * @param status Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Pattern::Builder + + /** + * Default constructor. + * Puts the Pattern into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Pattern() : parts(LocalArray<PatternPart>()) {} + /** + * Non-member swap function. + * @param p1 will get p2's contents + * @param p2 will get p1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Pattern& p1, Pattern& p2) noexcept { + using std::swap; + + swap(p1.bogus, p2.bogus); + swap(p1.len, p2.len); + swap(p1.parts, p2.parts); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Pattern(const Pattern& other); + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Pattern& operator=(Pattern) noexcept; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Pattern(); + + /** + * The `Pattern::Iterator` class provides an iterator over the formattable + * parts of a pattern. + * + * `Pattern::Iterator` is mutable and is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + struct U_I18N_API Iterator { + private: + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = std::variant<UnicodeString, Expression, Markup>; + using pointer = value_type*; + using reference = const value_type&; + + friend class Pattern; + Iterator(const Pattern* p, int32_t i) : pos(i), pat(p) {} + friend bool operator== (const Iterator& a, const Iterator& b) { return (a.pat == b.pat && a.pos == b.pos); } + + int32_t pos; + const Pattern* pat; + + public: + /** + * Dereference operator (gets the element at the current iterator position) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + reference operator*() const { + const PatternPart& part = pat->parts[pos]; + return patternContents(part); + } + /** + * Increment operator (advances to the next iterator position) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Iterator operator++() { pos++; return *this; } + /** + * Inequality comparison operator (used for comparing an iterator to the result of end()) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend bool operator!= (const Iterator& a, const Iterator& b) { return !(a == b); } + }; // struct Iterator + + private: + friend class Builder; + friend class message2::MessageFormatter; + friend class message2::Serializer; + + // Set to true if a copy constructor fails; + // needed in order to distinguish an uninitialized + // Pattern from a 0-length pattern + bool bogus = false; + + // Possibly-empty array of parts + int32_t len = 0; + LocalArray<PatternPart> parts; + + Pattern(const UVector& parts, UErrorCode& status); + // Helper + static void initParts(Pattern&, const Pattern&); + + /** + * Returns the size. + * + * @return The number of parts in the pattern. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + int32_t numParts() const; + /** + * Returns the `i`th part in the pattern. + * Precondition: i < numParts() + * + * @param i Index of the part being accessed. + * @return A reference to the part at index `i`. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const PatternPart& getPart(int32_t i) const; + + // Gets around not being able to declare Pattern::Iterator as a friend + // in PatternPart + static const std::variant<UnicodeString, Expression, Markup>& + patternContents(const PatternPart& p) { return p.piece; } + }; // class Pattern + + /** + * A `Variant` pairs a list of keys with a pattern + * It corresponds to the `Variant` interface + * defined in https://github.com/unicode-org/message-format-wg/tree/main/spec/data-model + * + * `Variant` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Variant : public UObject { + public: + /** + * Accesses the pattern of the variant. + * + * @return A reference to the pattern. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Pattern& getPattern() const { return p; } + /** + * Accesses the keys of the variant. + * + * @return A reference to the keys. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const SelectorKeys& getKeys() const { return k; } + /** + * Constructor. Returns a variant that formats to `pattern` + * when `keys` match the selector expressions in the enclosing + * `match` construct. + * + * @param keys A reference to a `SelectorKeys`. + * @param pattern A pattern (passed by move) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Variant(const SelectorKeys& keys, Pattern&& pattern) : k(keys), p(std::move(pattern)) {} + /** + * Non-member swap function. + * @param v1 will get v2's contents + * @param v2 will get v1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Variant& v1, Variant& v2) noexcept { + using std::swap; + + swap(v1.k, v2.k); + swap(v1.p, v2.p); + } + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Variant& operator=(Variant other) noexcept; + /** + * Default constructor. + * Returns a Variant in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Variant() = default; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Variant(const Variant&); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Variant(); + private: + /* const */ SelectorKeys k; + /* const */ Pattern p; + }; // class Variant + + /** + * A `Binding` pairs a variable name with an expression. + * It corresponds to the `Declaration` interface + * defined in https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md#messages + * + * `Binding` is immutable and copyable. It is not movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Binding : public UObject { + public: + /** + * Accesses the right-hand side of a binding. + * + * @return A reference to the expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const Expression& getValue() const; + /** + * Accesses the left-hand side of the binding. + * + * @return A reference to the variable name. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const VariableName& getVariable() const { return var; } + /** + * Constructor for input binding. + * + * @param variableName The variable name (left-hand side) of the binding. Passed by move. + * @param rhs The right-hand side of the input binding. Passed by move. + * `rhs` must have an operand that is a variable reference to `variableName`. + * If `rhs` has an operator, it must be a function call. + * If either of these properties is violated, `errorCode` is set to + * U_INVALID_STATE_ERROR. + * @param errorCode Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + static Binding input(UnicodeString&& variableName, Expression&& rhs, UErrorCode& errorCode); + /** + * Returns true if and only if this binding represents a local declaration. + * Otherwise, it's an input declaration. + * + * @return True if this binding represents a variable and expression; + * false if it represents a variable plus an annotation. + * @internal ICU 78 technology preview + * @deprecated This API is for technology preview only. + */ + UBool isLocal() const { return local; } + /** + * Constructor. + * + * @param v A variable name. + * @param e An expression. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Binding(const VariableName& v, Expression&& e) : var(v), expr(std::move(e)), local(true), annotation(nullptr) {} + /** + * Non-member swap function. + * @param b1 will get b2's contents + * @param b2 will get b1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + friend inline void swap(Binding& b1, Binding& b2) noexcept { + using std::swap; + + swap(b1.var, b2.var); + swap(b1.expr, b2.expr); + swap(b1.local, b2.local); + b1.updateAnnotation(); + b2.updateAnnotation(); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Binding(const Binding& other); + /** + * Copy assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Binding& operator=(Binding) noexcept; + /** + * Default constructor. + * Puts the Binding into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Binding() : local(true) {} + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Binding(); + private: + friend class message2::Checker; + friend class message2::MessageFormatter; + friend class message2::Parser; + friend class message2::Serializer; + + /* const */ VariableName var; + /* const */ Expression expr; + /* const */ bool local; + + // The following field is always nullptr for a local + // declaration, and possibly nullptr for an .input declaration + // If non-null, the referent is a member of `expr` so + // its lifetime is the same as the lifetime of the enclosing Binding + // (as long as there's no mutation) + const Operator* annotation = nullptr; + + const OptionMap& getOptionsInternal() const; + + bool hasAnnotation() const { return !local && (annotation != nullptr); } + void updateAnnotation(); + }; // class Binding + + // Internal only + + #ifndef U_IN_DOXYGEN + class U_I18N_API_CLASS Matcher : public UObject { + public: + U_I18N_API Matcher& operator=(Matcher); + U_I18N_API Matcher(const Matcher&); + /** + * Non-member swap function. + * @param m1 will get m2's contents + * @param m2 will get m1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Matcher& m1, Matcher& m2) noexcept { + using std::swap; + + if (m1.bogus) { + m2.bogus = true; + return; + } + if (m2.bogus) { + m1.bogus = true; + return; + } + swap(m1.selectors, m2.selectors); + swap(m1.numSelectors, m2.numSelectors); + swap(m1.variants, m2.variants); + swap(m1.numVariants, m2.numVariants); + } + U_I18N_API virtual ~Matcher(); + private: + + friend class MFDataModel; + + Matcher(VariableName* ss, int32_t ns, Variant* vs, int32_t nv); + Matcher() {} + + // A Matcher may have numSelectors=0 and numVariants=0 + // (this is a data model error, but it's representable). + // So we have to keep a separate flag to track failed copies. + bool bogus = false; + + // The variables that are being matched on. + LocalArray<VariableName> selectors; + // The number of selectors + int32_t numSelectors = 0; + // The list of `when` clauses (case arms). + LocalArray<Variant> variants; + // The number of variants + int32_t numVariants = 0; + }; // class Matcher + #endif + + // ----------------------------------------------------------------------- + // Public MFDataModel class + + /** + * + * The `MFDataModel` class describes a parsed representation of the text of a message. + * This representation is public as higher-level APIs for messages will need to know its public + * interface: for example, to re-instantiate a parsed message with different values for imported + variables. + * + * The MFDataModel API implements <a target="github" + href="https://github.com/unicode-org/message-format-wg/blob/main/spec/data-model.md">the + * specification of the abstract syntax (data model representation)</a> for MessageFormat. + * + * `MFDataModel` is immutable, copyable and movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS MFDataModel : public UMemory { + /* + Classes that represent nodes in the data model are nested inside the + `MFDataModel` class. + + Classes such as `Expression`, `Pattern` and `VariantMap` are immutable and + are constructed using the builder pattern. + + Most classes representing nodes have copy constructors. This is because builders + contain immutable data that must be copied when calling `build()`, since the builder + could go out of scope before the immutable result of the builder does. Copying is + also necessary to prevent unexpected mutation if intermediate builders are saved + and mutated again after calling `build()`. + + The copy constructors perform a deep copy, for example by copying the entire + list of options for an `Operator` (and copying the entire underlying vector.) + Some internal fields should be `const`, but are declared as non-`const` to make + the copy constructor simpler to implement. (These are noted throughout.) In + other words, those fields are `const` except during the execution of a copy + constructor. + + On the other hand, intermediate `Builder` methods that return a `Builder&` + mutate the state of the builder, so in code like: + + Expression::Builder& exprBuilder = Expression::builder()-> setOperand(foo); + Expression::Builder& exprBuilder2 = exprBuilder.setOperator(bar); + + the call to `setOperator()` would mutate `exprBuilder`, since `exprBuilder` + and `exprBuilder2` are references to the same object. + + An alternate choice would be to make `build()` destructive, so that copying would + be unnecessary. Or, both copying and moving variants of `build()` could be + provided. Copying variants of the intermediate `Builder` methods could be + provided as well, if this proved useful. + */ + public: + /** + * Accesses the local variable declarations for this data model. + * + * @return A vector of bindings for local variables. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API std::vector<Binding> getLocalVariables() const { + std::vector<Binding> result; + if (!bogus) { + return toStdVector<Binding>(bindings.getAlias(), bindingsLen); + } + return {}; + } + /** + * Accesses the selectors. Returns an empty vector if this is a pattern message. + * + * @return A vector of selectors. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API std::vector<VariableName> getSelectors() const { + if (std::holds_alternative<Pattern>(body)) { + return {}; + } + const Matcher* match = std::get_if<Matcher>(&body); + // match must be non-null, given the previous check + return toStdVector<VariableName>(match->selectors.getAlias(), match->numSelectors); + } + /** + * Accesses the variants. Returns an empty vector if this is a pattern message. + * + * @return A vector of variants. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API std::vector<Variant> getVariants() const { + // Return empty vector if no variants + if (std::holds_alternative<Pattern>(body)) { + return {}; + } + const Matcher* match = std::get_if<Matcher>(&body); + // match must be non-null, given the previous check + return toStdVector<Variant>(match->variants.getAlias(), match->numVariants); + return {}; + } + /** + * Accesses the pattern (in a message without selectors). + * Returns a reference to an empty pattern if the message has selectors. + * + * @return A reference to the pattern. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Pattern& getPattern() const; + /** + * The mutable `MFDataModel::Builder` class allows the data model to be + * constructed incrementally. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder; + /** + * Default constructor. + * Puts the MFDataModel into a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MFDataModel(); + /** + * Non-member swap function. + * @param m1 will get m2's contents + * @param m2 will get m1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(MFDataModel& m1, MFDataModel& m2) noexcept { + using std::swap; + + if (m1.bogus) { + m2.bogus = true; + return; + } + if (m2.bogus) { + m1.bogus = true; + return; + } + swap(m1.body, m2.body); + swap(m1.bindings, m2.bindings); + swap(m1.bindingsLen, m2.bindingsLen); + } + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MFDataModel& operator=(MFDataModel) noexcept; + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API MFDataModel(const MFDataModel& other); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~MFDataModel(); + + /** + * The mutable `MFDataModel::Builder` class allows the data model to be + * constructed incrementally. Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UMemory { + private: + friend class MFDataModel; + + void checkDuplicate(const VariableName&, UErrorCode&) const; + void buildSelectorsMessage(UErrorCode&); + bool hasPattern = true; + bool hasSelectors = false; + Pattern pattern; + // The following members are not LocalPointers for the same reason as in SelectorKeys::Builder + UVector* selectors = nullptr; + UVector* variants = nullptr; + UVector* bindings = nullptr; + public: + /** + * Adds a binding, There must not already be a binding + * with the same name. + * + * @param b The binding. Passed by move. + * @param status Input/output error code. Set to U_DUPLICATE_DECLARATION_ERROR + * if `addBinding()` was previously called with a binding + * with the same variable name as `b`. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addBinding(Binding&& b, UErrorCode& status); + /** + * Adds a selector variable. + * If a pattern was previously set, clears the pattern. + * + * @param selector Variable to add as a selector. Passed by move. + * @param errorCode Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addSelector(VariableName&& selector, UErrorCode& errorCode); + /** + * Adds a single variant. + * If a pattern was previously set using `setPattern()`, clears the pattern. + * + * @param keys Keys for the variant. Passed by move. + * @param pattern Pattern for the variant. Passed by move. + * @param errorCode Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& addVariant(SelectorKeys&& keys, Pattern&& pattern, UErrorCode& errorCode) noexcept; + /** + * Sets the body of the message as a pattern. + * If selectors and/or variants were previously set, clears them. + * + * @param pattern Pattern to represent the body of the message. + * Passed by move. + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setPattern(Pattern&& pattern); + /** + * Constructs a new immutable data model. + * If `setPattern()` has not been called and if `addSelector()` and + * `addVariant()` were not each called at least once, + * `status` is set to `U_INVALID_STATE_ERROR`. + * If `addSelector()` was called and `addVariant()` was never called, + * or vice versa, then `status` is set to U_INVALID_STATE_ERROR. + * Otherwise, either a Pattern or Selectors message is constructed + * based on the pattern that was previously set, or selectors and variants + * that were previously set. + * + * The builder object (`this`) can still be used after calling `build()`. + * + * @param status Input/output error code. + * @return The new MFDataModel + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MFDataModel build(UErrorCode& status) const noexcept; + /** + * Default constructor. + * Returns a Builder with no pattern or selectors set. + * Either `setPattern()` or both `addSelector()` and + * `addVariant()` must be called before calling `build()` + * on the resulting builder. + * + * @param status Input/output error code. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& status); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; + Builder(Builder&&) = delete; + Builder& operator=(Builder&&) = delete; + }; // class Builder + + private: + friend class message2::Checker; + friend class message2::MessageFormatter; + friend class message2::Serializer; + + Pattern empty; // Provided so that `getPattern()` can return a result + // if called on a selectors message + bool hasPattern() const { return std::holds_alternative<Pattern>(body); } + + bool bogus = false; // Set if a copy constructor fails + + // A message body is either a matcher (selector list and variant list), + // or a single pattern + std::variant<Matcher, Pattern> body; + + // Bindings for local variables + /* const */ LocalArray<Binding> bindings; + int32_t bindingsLen = 0; + + const Binding* getLocalVariablesInternal() const; + const VariableName* getSelectorsInternal() const; + const Variant* getVariantsInternal() const; + + int32_t numSelectors() const { + const Matcher* matcher = std::get_if<Matcher>(&body); + return (matcher == nullptr ? 0 : matcher->numSelectors); + } + int32_t numVariants() const { + const Matcher* matcher = std::get_if<Matcher>(&body); + return (matcher == nullptr ? 0 : matcher->numVariants); + } + + // Helper + void initBindings(const Binding*); + + MFDataModel(const Builder& builder, UErrorCode&) noexcept; + }; // class MFDataModel + } // namespace data_model +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_DATA_MODEL_H + +// eof + diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_data_model_names.h b/deps/icu-small/source/i18n/unicode/messageformat2_data_model_names.h new file mode 100644 index 00000000000000..fb3070793223ed --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_data_model_names.h @@ -0,0 +1,42 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT_DATA_MODEL_NAMES_H +#define MESSAGEFORMAT_DATA_MODEL_NAMES_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/unistr.h" + +#ifndef U_HIDE_DEPRECATED_API + +U_NAMESPACE_BEGIN + +namespace message2 { + + namespace data_model { + typedef UnicodeString VariableName; + typedef UnicodeString FunctionName; + } // namespace data_model +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT_DATA_MODEL_NAMES_H + +// eof + diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h b/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h new file mode 100644 index 00000000000000..9311bd07bcc17a --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h @@ -0,0 +1,1023 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_FORMATTABLE_H +#define MESSAGEFORMAT2_FORMATTABLE_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/chariter.h" +#include "unicode/numberformatter.h" +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/smpdtfmt.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include <map> +#include <variant> + +U_NAMESPACE_BEGIN + +class Hashtable; +class UVector; + +namespace message2 { + + class Formatter; + class MessageContext; + class Selector; + + // Formattable + // ---------- + + /** + * `FormattableObject` is an abstract class that can be implemented in order to define + * an arbitrary class that can be passed to a custom formatter or selector function. + * To be passed in such a way, it must be wrapped in a `Formattable` object. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API FormattableObject : public UObject { + public: + /** + * Returns an arbitrary string representing the type of this object. + * It's up to the implementor of this class, as well as the implementors + * of any custom functions that rely on particular values of this tag + * corresponding to particular classes that the object contents can be + * downcast to, to ensure that the type tags are used soundly. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual const UnicodeString& tag() const = 0; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~FormattableObject(); + }; // class FormattableObject + + /** + * The `DateInfo` struct represents all the information needed to + * format a date with a time zone. It includes an absolute date and a time zone name, + * as well as a calendar name. The calendar name is not currently used. + * + * @internal ICU 78 technology preview + * @deprecated This API is for technology preview only. + */ + struct U_I18N_API DateInfo { + /** + * Date in UTC + * + * @internal ICU 78 technology preview + * @deprecated This API is for technology preview only. + */ + UDate date; + /** + * IANA time zone name; "UTC" if UTC; empty string if value is floating + * The time zone is required in order to format the date/time value + * (its offset is added to/subtracted from the datestamp in order to + * produce the formatted date). + * + * @internal ICU 78 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString zoneId; + }; + + /** + * The `Formattable` class represents a typed value that can be formatted, + * originating either from a message argument or a literal in the code. + * ICU's Formattable class is not used in MessageFormat 2 because it's unsafe to copy an + * icu::Formattable value that contains an object. (See ICU-20275). + * + * `Formattable` is immutable (not deeply immutable) and + * is movable and copyable. + * (Copying does not do a deep copy when the wrapped value is an array or + * object. Likewise, while a pointer to a wrapped array or object is `const`, + * the referents of the pointers may be mutated by other code.) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS Formattable : public UObject { + public: + + /** + * Gets the data type of this Formattable object. + * @return the data type of this Formattable object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UFormattableType getType() const; + + /** + * Gets the double value of this object. If this object is not of type + * UFMT_DOUBLE, then the result is undefined and the error code is set. + * + * @param status Input/output error code. + * @return the double value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API double getDouble(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (isDecimal() && getType() == UFMT_DOUBLE) { + return (std::get_if<icu::Formattable>(&contents))->getDouble(); + } + if (std::holds_alternative<double>(contents)) { + return *(std::get_if<double>(&contents)); + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + /** + * Gets the long value of this object. If this object is not of type + * UFMT_LONG then the result is undefined and the error code is set. + * + * @param status Input/output error code. + * @return the long value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API int32_t getLong(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (isDecimal() && getType() == UFMT_LONG) { + return std::get_if<icu::Formattable>(&contents)->getLong(); + } + if (std::holds_alternative<int64_t>(contents)) { + return static_cast<int32_t>(*(std::get_if<int64_t>(&contents))); + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + /** + * Gets the int64 value of this object. If this object is not of type + * kInt64 then the result is undefined and the error code is set. + * If conversion to int64 is desired, call getInt64() + * + * @param status Input/output error code. + * @return the int64 value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API int64_t getInt64Value(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (isDecimal() && getType() == UFMT_INT64) { + return std::get_if<icu::Formattable>(&contents)->getInt64(); + } + if (std::holds_alternative<int64_t>(contents)) { + return *(std::get_if<int64_t>(&contents)); + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return 0; + } + + /** + * Gets the int64 value of this object. If this object is of a numeric + * type and the magnitude is too large to fit in an int64, then + * the maximum or minimum int64 value, as appropriate, is returned + * and the status is set to U_INVALID_FORMAT_ERROR. If the + * magnitude fits in an int64, then a casting conversion is + * performed, with truncation of any fractional part. If this object is + * not a numeric type, then 0 is returned and + * the status is set to U_INVALID_FORMAT_ERROR. + * @param status the error code + * @return the int64 value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API int64_t getInt64(UErrorCode& status) const; + /** + * Gets the string value of this object. If this object is not of type + * kString then the result is undefined and the error code is set. + * + * @param status Input/output error code. + * @return A reference to the string value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& getString(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (std::holds_alternative<UnicodeString>(contents)) { + return *std::get_if<UnicodeString>(&contents); + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return bogusString; + } + + /** + * Gets the struct representing the date value of this object. + * If this object is not of type kDate then the result is + * undefined and the error code is set. + * + * @param status Input/output error code. + * @return A non-owned pointer to a DateInfo object + * representing the underlying date of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const DateInfo* getDate(UErrorCode& status) const { + if (U_SUCCESS(status)) { + if (isDate()) { + return std::get_if<DateInfo>(&contents); + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return nullptr; + } + + /** + * Returns true if the data type of this Formattable object + * is kDouble + * @return true if this is a pure numeric object + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UBool isNumeric() const { return (getType() == UFMT_DOUBLE || getType() == UFMT_LONG || getType() == UFMT_INT64); } + + /** + * Gets the array value and count of this object. If this object + * is not of type kArray then the result is undefined and the error code is set. + * + * @param count fill-in with the count of this object. + * @param status Input/output error code. + * @return the array value of this object. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Formattable* getArray(int32_t& count, UErrorCode& status) const; + + /** + * Returns a pointer to the FormattableObject contained within this + * formattable, or if this object does not contain a FormattableObject, + * returns nullptr and sets the error code. + * + * @param status Input/output error code. + * @return a FormattableObject pointer, or nullptr + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const FormattableObject* getObject(UErrorCode& status) const { + if (U_SUCCESS(status)) { + // Can't return a reference since FormattableObject + // is an abstract class + if (getType() == UFMT_OBJECT) { + return *std::get_if<const FormattableObject*>(&contents); + // TODO: should assert that if type is object, object is non-null + } + status = U_ILLEGAL_ARGUMENT_ERROR; + } + return nullptr; + } + /** + * Non-member swap function. + * @param f1 will get f2's contents + * @param f2 will get f1's contents + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API friend inline void swap(Formattable& f1, Formattable& f2) noexcept { + using std::swap; + + swap(f1.contents, f2.contents); + } + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(const Formattable&); + /** + * Assignment operator + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable& operator=(Formattable) noexcept; + /** + * Default constructor. Leaves the Formattable in a + * valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable() : contents(0.0) {} + /** + * String constructor. + * + * @param s A string to wrap as a Formattable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(const UnicodeString& s) : contents(s) {} + /** + * Double constructor. + * + * @param d A double value to wrap as a Formattable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(double d) : contents(d) {} + /** + * Int64 constructor. + * + * @param i An int64 value to wrap as a Formattable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(int64_t i) : contents(i) {} + /** + * Date constructor. + * + * @param d A DateInfo struct representing a date, + * to wrap as a Formattable. + * Passed by move + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(DateInfo&& d) : contents(std::move(d)) {} + /** + * Creates a Formattable object of an appropriate numeric type from a + * a decimal number in string form. The Formattable will retain the + * full precision of the input in decimal format, even when it exceeds + * what can be represented by a double or int64_t. + * + * @param number the unformatted (not localized) string representation + * of the Decimal number. + * @param status the error code. Possible errors include U_INVALID_FORMAT_ERROR + * if the format of the string does not conform to that of a + * decimal number. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API static Formattable forDecimal(std::string_view number, UErrorCode& status); + /** + * Array constructor. + * + * @param arr An array of Formattables, which is adopted. + * @param len The length of the array. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(const Formattable* arr, int32_t len) : contents(std::pair(arr, len)) {} + /** + * Object constructor. + * + * @param obj A FormattableObject (not adopted). + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Formattable(const FormattableObject* obj) : contents(obj) {} + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~Formattable(); + /** + * Converts the Formattable object to an ICU Formattable object. + * If this has type UFMT_OBJECT or kArray, then `status` is set to + * U_ILLEGAL_ARGUMENT_ERROR. + * + * @param status Input/output error code. + * @return An icu::Formattable value with the same value as this. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API icu::Formattable asICUFormattable(UErrorCode& status) const; + private: + + std::variant<double, + int64_t, + UnicodeString, + icu::Formattable, // represents a Decimal + DateInfo, + const FormattableObject*, + std::pair<const Formattable*, int32_t>> contents; + UnicodeString bogusString; // :(((( + + UBool isDecimal() const { + return std::holds_alternative<icu::Formattable>(contents); + } + UBool isDate() const { + return std::holds_alternative<DateInfo>(contents); + } + }; // class Formattable + +/** + * Internal use only, but has to be included here as part of the implementation + * of the header-only `FunctionOptions::getOptions()` method + * + * A `ResolvedFunctionOption` represents the result of evaluating + * a single named function option. It pairs the given name with the `Formattable` + * value resulting from evaluating the option's value. + * + * `ResolvedFunctionOption` is immutable and is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ +#ifndef U_IN_DOXYGEN +class U_I18N_API_CLASS ResolvedFunctionOption : public UObject { + private: + + /* const */ UnicodeString name; + /* const */ Formattable value; + // True iff this option was represented in the syntax by a literal value. + // This is necessary in order to implement the spec for the `select` option + // of `:number` and `:integer`. + /* const */ bool sourceIsLiteral; + + public: + U_I18N_API const UnicodeString& getName() const { return name; } + U_I18N_API const Formattable& getValue() const { return value; } + U_I18N_API bool isLiteral() const { return sourceIsLiteral; } + U_I18N_API ResolvedFunctionOption(const UnicodeString& n, const Formattable& f, bool s) + : name(n), value(f), sourceIsLiteral(s) {} + U_I18N_API ResolvedFunctionOption() {} + U_I18N_API ResolvedFunctionOption(ResolvedFunctionOption&&); + U_I18N_API ResolvedFunctionOption& operator=(ResolvedFunctionOption&& other) noexcept { + name = std::move(other.name); + value = std::move(other.value); + sourceIsLiteral = other.sourceIsLiteral; + return *this; + } + U_I18N_API virtual ~ResolvedFunctionOption(); +}; // class ResolvedFunctionOption +#endif + +/** + * Mapping from option names to `message2::Formattable` objects, obtained + * by calling `getOptions()` on a `FunctionOptions` object. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ +using FunctionOptionsMap = std::map<UnicodeString, message2::Formattable>; + +/** + * Structure encapsulating named options passed to a custom selector or formatter. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ +class U_I18N_API FunctionOptions : public UObject { + public: + /** + * Returns a map of all name-value pairs provided as options to this function. + * The syntactic order of options is not guaranteed to + * be preserved. + * + * This class is immutable and movable but not copyable. + * + * @return A map from strings to `message2::Formattable` objects representing + * the results of resolving each option value. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptionsMap getOptions() const { + int32_t len; + const ResolvedFunctionOption* resolvedOptions = getResolvedFunctionOptions(len); + FunctionOptionsMap result; + for (int32_t i = 0; i < len; i++) { + const ResolvedFunctionOption& opt = resolvedOptions[i]; + result[opt.getName()] = opt.getValue(); + } + return result; + } + /** + * Default constructor. + * Returns an empty mapping. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions() { options = nullptr; } + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~FunctionOptions(); + /** + * Move assignment operator: + * The source FunctionOptions will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions& operator=(FunctionOptions&&) noexcept; + /** + * Move constructor: + * The source FunctionOptions will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions(FunctionOptions&&); + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions& operator=(const FunctionOptions&) = delete; + private: + friend class InternalValue; + friend class MessageFormatter; + friend class StandardFunctions; + + explicit FunctionOptions(UVector&&, UErrorCode&); + + const ResolvedFunctionOption* getResolvedFunctionOptions(int32_t& len) const; + UBool getFunctionOption(std::u16string_view, Formattable&) const; + UBool wasSetFromLiteral(const UnicodeString&) const; + // Returns empty string if option doesn't exist + UnicodeString getStringFunctionOption(std::u16string_view) const; + int32_t optionsCount() const { return functionOptionsLen; } + + // Named options passed to functions + // This is not a Hashtable in order to make it possible for code in a public header file + // to construct a std::map from it, on-the-fly. Otherwise, it would be impossible to put + // that code in the header because it would have to call internal Hashtable methods. + ResolvedFunctionOption* options; + int32_t functionOptionsLen = 0; + + /** + * The original FunctionOptions isn't usable after this call. + * @returns A new, merged FunctionOptions. + */ + FunctionOptions mergeOptions(FunctionOptions&& other, UErrorCode&); +}; // class FunctionOptions + + /** + * A `FormattedValue` represents the result of formatting a `message2::Formattable`. + * It contains either a string or a formatted number. (More types could be added + * in the future.) + * + * `FormattedValue` is immutable and movable. It is not copyable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API FormattedValue : public UObject { + public: + /** + * Formatted string constructor. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + explicit FormattedValue(const UnicodeString&); + /** + * Formatted number constructor. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + explicit FormattedValue(number::FormattedNumber&&); + /** + * Default constructor. Leaves the FormattedValue in + * a valid but undefined state. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormattedValue() : type(kString) {} + /** + * Returns true iff this is a formatted string. + * + * @return True if and only if this value is a formatted string. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool isString() const { return type == kString; } + /** + * Returns true iff this is a formatted number. + * + * @return True if and only if this value is a formatted number. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + bool isNumber() const { return type == kNumber; } + /** + * Gets the string contents of this value. If !isString(), then + * the result is undefined. + * @return A reference to a formatted string. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const UnicodeString& getString() const { return stringOutput; } + /** + * Gets the number contents of this value. If !isNumber(), then + * the result is undefined. + * @return A reference to a formatted number. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const number::FormattedNumber& getNumber() const { return numberOutput; } + /** + * Move assignment operator: + * The source FormattedValue will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormattedValue& operator=(FormattedValue&&) noexcept; + /** + * Move constructor: + * The source FormattedValue will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormattedValue(FormattedValue&& other) { *this = std::move(other); } + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~FormattedValue(); + private: + enum Type { + kString, + kNumber + }; + Type type; + UnicodeString stringOutput; + number::FormattedNumber numberOutput; + }; // class FormattedValue + + /** + * A `FormattablePlaceholder` encapsulates an input value (a `message2::Formattable`) + * together with an optional output value (a `message2::FormattedValue`). + * More information, such as source line/column numbers, could be added to the class + * in the future. + * + * `FormattablePlaceholder` is immutable (not deeply immutable) and movable. + * It is not copyable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS FormattedPlaceholder : public UObject { + public: + /** + * Fallback constructor. Constructs a value that represents a formatting error, + * without recording an input `Formattable` as the source. + * + * @param s An error string. (See the MessageFormat specification for details + * on fallback strings.) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API explicit FormattedPlaceholder(const UnicodeString& s) : fallback(s), type(kFallback) {} + /** + * Constructor for fully formatted placeholders. + * + * @param input A `FormattedPlaceholder` containing the fallback string and source + * `Formattable` used to construct the formatted value. + * @param output A `FormattedValue` representing the formatted output of `input`. + * Passed by move. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder(const FormattedPlaceholder& input, FormattedValue&& output) + : fallback(input.fallback), source(input.source), + formatted(std::move(output)), previousOptions(FunctionOptions()), type(kEvaluated) {} + /** + * Constructor for fully formatted placeholders with options. + * + * @param input A `FormattedPlaceholder` containing the fallback string and source + * `Formattable` used to construct the formatted value. + * @param opts Function options that were used to construct `output`. May be the empty map. + * @param output A `FormattedValue` representing the formatted output of `input`. + * Passed by move. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder(const FormattedPlaceholder& input, FunctionOptions&& opts, FormattedValue&& output) + : fallback(input.fallback), source(input.source), + formatted(std::move(output)), previousOptions(std::move(opts)), type(kEvaluated) {} + /** + * Constructor for unformatted placeholders. + * + * @param input A `Formattable` object. + * @param fb Fallback string to use if an error occurs while formatting the input. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder(const Formattable& input, const UnicodeString& fb) + : fallback(fb), source(input), type(kUnevaluated) {} + /** + * Default constructor. Leaves the FormattedPlaceholder in a + * valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder() : type(kNull) {} + /** + * Returns the source `Formattable` value for this placeholder. + * The result is undefined if this is a null operand. + * + * @return A message2::Formattable value. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const message2::Formattable& asFormattable() const; + /** + * Returns true iff this is a fallback placeholder. + * + * @return True if and only if this placeholder was constructed from a fallback string, + * with no `Formattable` source or formatting output. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool isFallback() const { return type == kFallback; } + /** + * Returns true iff this is a null placeholder. + * + * @return True if and only if this placeholder represents the absent argument to a formatter + * that was invoked without an argument. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool isNullOperand() const { return type == kNull; } + /** + * Returns true iff this has formatting output. + * + * @return True if and only if this was constructed from both an input `Formattable` and + * output `FormattedValue`. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool isEvaluated() const { return (type == kEvaluated); } + /** + * Returns true iff this represents a valid argument to the formatter. + * + * @return True if and only if this is neither the null argument nor a fallback placeholder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API bool canFormat() const { return !(isFallback() || isNullOperand()); } + /** + * Gets the fallback value of this placeholder, to be used in its place if an error occurs while + * formatting it. + * @return A reference to this placeholder's fallback string. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& getFallback() const { return fallback; } + /** + * Returns the options of this placeholder. The result is the empty map if !isEvaluated(). + * @return A reference to an option map, capturing the options that were used + * in producing the output of this `FormattedPlaceholder` + * (or empty if there is no output) + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const FunctionOptions& options() const { return previousOptions; } + /** + * Returns the formatted output of this placeholder. The result is undefined if !isEvaluated(). + * @return A fully formatted `FormattedPlaceholder`. + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const FormattedValue& output() const { return formatted; } + /** + * Move assignment operator: + * The source FormattedPlaceholder will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder& operator=(FormattedPlaceholder&&) noexcept; + /** + * Move constructor: + * The source FormattedPlaceholder will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FormattedPlaceholder(FormattedPlaceholder&& other) { *this = std::move(other); } + /** + * Formats this as a string, using defaults. If this is + * either the null operand or is a fallback value, the return value is the result of formatting the + * fallback value (which is the default fallback string if this is the null operand). + * If there is no formatted output and the input is object- or array-typed, + * then the argument is treated as a fallback value, since there is no default formatter + * for objects or arrays. + * + * @param locale The locale to use for formatting numbers or dates + * @param status Input/output error code + * @return The result of formatting this placeholder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UnicodeString formatToString(const Locale& locale, + UErrorCode& status) const; + + private: + friend class MessageFormatter; + + enum Type { + kFallback, // Represents the result of formatting that encountered an error + kNull, // Represents the absence of both an output and an input (not necessarily an error) + kUnevaluated, // `source` should be valid, but there's no result yet + kEvaluated, // `formatted` exists + }; + UnicodeString fallback; + Formattable source; + FormattedValue formatted; + FunctionOptions previousOptions; // Ignored unless type is kEvaluated + Type type; + }; // class FormattedPlaceholder + + /** + * Not yet implemented: The result of a message formatting operation. Based on + * ICU4J's FormattedMessage.java. + * + * The class will contain information allowing the result to be viewed as a string, + * iterator, etc. (TBD) + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API FormattedMessage : public icu::FormattedValue { + public: + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + FormattedMessage(UErrorCode& status) { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + int32_t length(UErrorCode& status) const { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return -1; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + char16_t charAt(int32_t index, UErrorCode& status) const { + (void) index; + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return 0; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + StringPiece subSequence(int32_t start, int32_t end, UErrorCode& status) const { + (void) start; + (void) end; + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return ""; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + UnicodeString toString(UErrorCode& status) const override { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return {}; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + UnicodeString toTempString(UErrorCode& status) const override { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return {}; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + Appendable& appendTo(Appendable& appendable, UErrorCode& status) const override { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return appendable; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override { + (void) cfpos; + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return false; + } + /** + * Not yet implemented. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + CharacterIterator* toCharacterIterator(UErrorCode& status) { + if (U_SUCCESS(status)) { + status = U_UNSUPPORTED_ERROR; + } + return nullptr; + } + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for ICU internal use only. + */ + virtual ~FormattedMessage(); + }; // class FormattedMessage + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_FORMATTABLE_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h b/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h new file mode 100644 index 00000000000000..37690d5e04a1e3 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h @@ -0,0 +1,433 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#ifndef MESSAGEFORMAT2_FUNCTION_REGISTRY_H +#define MESSAGEFORMAT2_FUNCTION_REGISTRY_H + +#if U_SHOW_CPLUSPLUS_API + +#if !UCONFIG_NO_NORMALIZATION + +#if !UCONFIG_NO_FORMATTING + +#if !UCONFIG_NO_MF2 + +#include "unicode/messageformat2_data_model_names.h" +#include "unicode/messageformat2_formattable.h" + +#ifndef U_HIDE_DEPRECATED_API + +#include <map> + +U_NAMESPACE_BEGIN + +class Hashtable; +class UVector; + +namespace message2 { + + using namespace data_model; + + /** + * Interface that factory classes for creating formatters must implement. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API FormatterFactory : public UObject { + // TODO: the coding guidelines say that interface classes + // shouldn't inherit from UObject, but if I change it so these + // classes don't, and the individual formatter factory classes + // inherit from public FormatterFactory, public UObject, then + // memory leaks ensue + public: + /** + * Constructs a new formatter object. This method is not const; + * formatter factories with local state may be defined. + * + * @param locale Locale to be used by the formatter. + * @param status Input/output error code. + * @return The new Formatter, which is non-null if U_SUCCESS(status). + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual Formatter* createFormatter(const Locale& locale, UErrorCode& status) = 0; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~FormatterFactory(); + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormatterFactory& operator=(const FormatterFactory&) = delete; + }; // class FormatterFactory + + /** + * Interface that factory classes for creating selectors must implement. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API SelectorFactory : public UObject { + public: + /** + * Constructs a new selector object. + * + * @param locale Locale to be used by the selector. + * @param status Input/output error code. + * @return The new selector, which is non-null if U_SUCCESS(status). + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual Selector* createSelector(const Locale& locale, UErrorCode& status) const = 0; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~SelectorFactory(); + /** + * Copy constructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + SelectorFactory& operator=(const SelectorFactory&) = delete; + }; // class SelectorFactory + + /** + * Defines mappings from names of formatters and selectors to functions implementing them. + * The required set of formatter and selector functions is defined in the spec. Users can + * also define custom formatter and selector functions. + * + * `MFFunctionRegistry` is immutable and movable. It is not copyable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API MFFunctionRegistry : public UObject { + private: + + using FormatterMap = Hashtable; // Map from stringified function names to FormatterFactory* + using SelectorMap = Hashtable; // Map from stringified function names to SelectorFactory* + + public: + /** + * Looks up a formatter factory by the name of the formatter. The result is non-const, + * since formatter factories may have local state. Returns the result by pointer + * rather than by reference since it can fail. + * + * @param formatterName Name of the desired formatter. + * @return A pointer to the `FormatterFactory` registered under `formatterName`, or null + * if no formatter was registered under that name. The pointer is not owned + * by the caller. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + FormatterFactory* getFormatter(const FunctionName& formatterName) const; + /** + * Looks up a selector factory by the name of the selector. (This returns the result by pointer + * rather than by reference since `FormatterFactory` is an abstract class.) + * + * @param selectorName Name of the desired selector. + * @return A pointer to the `SelectorFactory` registered under `selectorName`, or null + * if no formatter was registered under that name. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + const SelectorFactory* getSelector(const FunctionName& selectorName) const; + /** + * Looks up a formatter factory by a type tag. This method gets the name of the default formatter registered + * for that type. If no formatter was explicitly registered for this type, it returns false. + * + * @param formatterType Type tag for the desired `FormattableObject` type to be formatted. + * @param name Output parameter; initialized to the name of the default formatter for `formatterType` + * if one has been registered. Its value is undefined otherwise. + * @return True if and only if the function registry contains a default formatter for `formatterType`. + * If the return value is false, then the value of `name` is undefined. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + UBool getDefaultFormatterNameByType(const UnicodeString& formatterType, FunctionName& name) const; + /** + * The mutable Builder class allows each formatter and selector factory + * to be initialized separately; calling its `build()` method yields an + * immutable MFFunctionRegistry object. + * + * Builder is not copyable or movable. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Builder : public UObject { + private: + // Must use raw pointers to avoid instantiating `LocalPointer` on an internal type + FormatterMap* formatters; + SelectorMap* selectors; + Hashtable* formattersByType; + + // Do not define copy constructor/assignment operator + Builder& operator=(const Builder&) = delete; + Builder(const Builder&) = delete; + + public: + /* + Notes about `adoptFormatter()`'s type signature: + + Alternative considered: take a non-owned FormatterFactory* + This is unsafe. + + Alternative considered: take a FormatterFactory& + This requires getFormatter() to cast the reference to a pointer, + as it must return an unowned FormatterFactory* since it can fail. + That is also unsafe, since the caller could delete the pointer. + + The "TemperatureFormatter" test from the previous ICU4J version doesn't work now, + as it only works if the `formatterFactory` argument is non-owned. + If registering a non-owned FormatterFactory is desirable, this could + be re-thought. + */ + /** + * Registers a formatter factory to a given formatter name. + * + * @param formatterName Name of the formatter being registered. + * @param formatterFactory A pointer to a FormatterFactory object to use + * for creating `formatterName` formatters. This argument is adopted. + * @param errorCode Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& adoptFormatter(const data_model::FunctionName& formatterName, FormatterFactory* formatterFactory, UErrorCode& errorCode); + /** + * Registers a formatter factory to a given type tag. + * (See `FormattableObject` for details on type tags.) + * + * @param type Tag for objects to be formatted with this formatter. + * @param functionName A reference to the name of the function to use for + * creating formatters for `formatterType` objects. + * @param errorCode Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& setDefaultFormatterNameByType(const UnicodeString& type, const data_model::FunctionName& functionName, UErrorCode& errorCode); + + /** + * Registers a selector factory to a given selector name. Adopts `selectorFactory`. + * + * @param selectorName Name of the selector being registered. + * @param selectorFactory A SelectorFactory object to use for creating `selectorName` + * selectors. + * @param errorCode Input/output error code + * @return A reference to the builder. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder& adoptSelector(const data_model::FunctionName& selectorName, SelectorFactory* selectorFactory, UErrorCode& errorCode); + /** + * Creates an immutable `MFFunctionRegistry` object with the selectors and formatters + * that were previously registered. The builder cannot be used after this call. + * The `build()` method is destructive to avoid the need for a deep copy of the + * `FormatterFactory` and `SelectorFactory` objects (this would be necessary because + * `FormatterFactory` can have mutable state), which in turn would require implementors + * of those interfaces to implement a `clone()` method. + * + * @return The new MFFunctionRegistry + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MFFunctionRegistry build(); + /** + * Default constructor. + * Returns a Builder with no functions registered. + * + * @param errorCode Input/output error code + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + Builder(UErrorCode& errorCode); + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Builder(); + }; // class MFFunctionRegistry::Builder + + /** + * Move assignment operator: + * The source MFFunctionRegistry will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MFFunctionRegistry& operator=(MFFunctionRegistry&&) noexcept; + /** + * Move constructor: + * The source MFFunctionRegistry will be left in a valid but undefined state. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + MFFunctionRegistry(MFFunctionRegistry&& other) { *this = std::move(other); } + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~MFFunctionRegistry(); + + private: + friend class MessageContext; + friend class MessageFormatter; + + // Do not define copy constructor or copy assignment operator + MFFunctionRegistry& operator=(const MFFunctionRegistry&) = delete; + MFFunctionRegistry(const MFFunctionRegistry&) = delete; + + MFFunctionRegistry(FormatterMap* f, SelectorMap* s, Hashtable* byType); + + MFFunctionRegistry() {} + + // Debugging; should only be called on a function registry with + // all the standard functions registered + void checkFormatter(const char*) const; + void checkSelector(const char*) const; + void checkStandard() const; + + bool hasFormatter(const data_model::FunctionName& f) const; + bool hasSelector(const data_model::FunctionName& s) const; + void cleanup() noexcept; + + // Must use raw pointers to avoid instantiating `LocalPointer` on an internal type + FormatterMap* formatters = nullptr; + SelectorMap* selectors = nullptr; + // Mapping from strings (type tags) to FunctionNames + Hashtable* formattersByType = nullptr; + }; // class MFFunctionRegistry + + /** + * Interface that formatter classes must implement. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Formatter : public UObject { + public: + /** + * Formats the input passed in `context` by setting an output using one of the + * `FormattingContext` methods or indicating an error. + * + * @param toFormat Placeholder, including a source formattable value and possibly + * the output of a previous formatter applied to it; see + * `message2::FormattedPlaceholder` for details. Passed by move. + * @param options The named function options. Passed by move + * @param status Input/output error code. Should not be set directly by the + * custom formatter, which should use `FormattingContext::setFormattingWarning()` + * to signal errors. The custom formatter may pass `status` to other ICU functions + * that can signal errors using this mechanism. + * + * @return The formatted value. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual FormattedPlaceholder format(FormattedPlaceholder&& toFormat, + FunctionOptions&& options, + UErrorCode& status) const = 0; + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Formatter(); + }; // class Formatter + + /** + * Interface that selector classes must implement. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API Selector : public UObject { + public: + /** + * Compares the input to an array of keys, and returns an array of matching + * keys sorted by preference. + * + * @param toFormat The unnamed function argument; passed by move. + * @param options A reference to the named function options. + * @param keys An array of strings that are compared to the input + * (`context.getFormattableInput()`) in an implementation-specific way. + * @param keysLen The length of `keys`. + * @param prefs An array of strings with length `keysLen`. The contents of + * the array is undefined. `selectKey()` should set the contents + * of `prefs` to a subset of `keys`, with the best match placed at the lowest index. + * @param prefsLen A reference that `selectKey()` should set to the length of `prefs`, + * which must be less than or equal to `keysLen`. + * @param status Input/output error code. Should not be set directly by the + * custom selector, which should use `FormattingContext::setSelectorError()` + * to signal errors. The custom selector may pass `status` to other ICU functions + * that can signal errors using this mechanism. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual void selectKey(FormattedPlaceholder&& toFormat, + FunctionOptions&& options, + const UnicodeString* keys, + int32_t keysLen, + UnicodeString* prefs, + int32_t& prefsLen, + UErrorCode& status) const = 0; + // Note: This takes array arguments because the internal MessageFormat code has to + // call this method, and can't include any code that constructs std::vectors. + /** + * Destructor. + * + * @internal ICU 75 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Selector(); + }; // class Selector + +} // namespace message2 + +U_NAMESPACE_END + +#endif // U_HIDE_DEPRECATED_API + +#endif /* #if !UCONFIG_NO_MF2 */ + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif /* #if !UCONFIG_NO_NORMALIZATION */ + +#endif /* U_SHOW_CPLUSPLUS_API */ + +#endif // MESSAGEFORMAT2_FUNCTION_REGISTRY_H + +// eof diff --git a/deps/icu-small/source/i18n/unicode/msgfmt.h b/deps/icu-small/source/i18n/unicode/msgfmt.h index a8a61f90e3f6a9..a7bfd24d3a5f11 100644 --- a/deps/icu-small/source/i18n/unicode/msgfmt.h +++ b/deps/icu-small/source/i18n/unicode/msgfmt.h @@ -342,7 +342,7 @@ class NumberFormat; * * @stable ICU 2.0 */ -class U_I18N_API MessageFormat : public Format { +class U_I18N_API_CLASS MessageFormat : public Format { public: #ifndef U_HIDE_OBSOLETE_API /** @@ -369,8 +369,7 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 2.0 */ - MessageFormat(const UnicodeString& pattern, - UErrorCode &status); + U_I18N_API MessageFormat(const UnicodeString& pattern, UErrorCode& status); /** * Constructs a new MessageFormat using the given pattern and locale. @@ -380,9 +379,7 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 2.0 */ - MessageFormat(const UnicodeString& pattern, - const Locale& newLocale, - UErrorCode& status); + U_I18N_API MessageFormat(const UnicodeString& pattern, const Locale& newLocale, UErrorCode& status); /** * Constructs a new MessageFormat using the given pattern and locale. * @param pattern Pattern used to construct object. @@ -393,34 +390,34 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 2.0 */ - MessageFormat(const UnicodeString& pattern, - const Locale& newLocale, - UParseError& parseError, - UErrorCode& status); + U_I18N_API MessageFormat(const UnicodeString& pattern, + const Locale& newLocale, + UParseError& parseError, + UErrorCode& status); /** * Constructs a new MessageFormat from an existing one. * @stable ICU 2.0 */ - MessageFormat(const MessageFormat&); + U_I18N_API MessageFormat(const MessageFormat&); /** * Assignment operator. * @stable ICU 2.0 */ - const MessageFormat& operator=(const MessageFormat&); + U_I18N_API const MessageFormat& operator=(const MessageFormat&); /** * Destructor. * @stable ICU 2.0 */ - virtual ~MessageFormat(); + U_I18N_API virtual ~MessageFormat(); /** * Clones this Format object polymorphically. The caller owns the * result and should delete it when done. * @stable ICU 2.0 */ - virtual MessageFormat* clone() const override; + U_I18N_API virtual MessageFormat* clone() const override; /** * Returns true if the given Format objects are semantically equal. @@ -429,14 +426,14 @@ class U_I18N_API MessageFormat : public Format { * @return true if the given Format objects are semantically equal. * @stable ICU 2.0 */ - virtual bool operator==(const Format& other) const override; + U_I18N_API virtual bool operator==(const Format& other) const override; /** * Sets the locale to be used for creating argument Format objects. * @param theLocale the new locale value to be set. * @stable ICU 2.0 */ - virtual void setLocale(const Locale& theLocale); + U_I18N_API virtual void setLocale(const Locale& theLocale); /** * Gets the locale used for creating argument Format objects. @@ -444,7 +441,7 @@ class U_I18N_API MessageFormat : public Format { * @return the locale of the object. * @stable ICU 2.0 */ - virtual const Locale& getLocale(void) const; + U_I18N_API virtual const Locale& getLocale() const; /** * Applies the given pattern string to this message format. @@ -454,8 +451,7 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 2.0 */ - virtual void applyPattern(const UnicodeString& pattern, - UErrorCode& status); + U_I18N_API virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status); /** * Applies the given pattern string to this message format. * @@ -466,9 +462,9 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 2.0 */ - virtual void applyPattern(const UnicodeString& pattern, - UParseError& parseError, - UErrorCode& status); + U_I18N_API virtual void applyPattern(const UnicodeString& pattern, + UParseError& parseError, + UErrorCode& status); /** * Sets the UMessagePatternApostropheMode and the pattern used by this message format. @@ -488,16 +484,16 @@ class U_I18N_API MessageFormat : public Format { * pattern cannot be parsed, set to failure code. * @stable ICU 4.8 */ - virtual void applyPattern(const UnicodeString& pattern, - UMessagePatternApostropheMode aposMode, - UParseError* parseError, - UErrorCode& status); + U_I18N_API virtual void applyPattern(const UnicodeString& pattern, + UMessagePatternApostropheMode aposMode, + UParseError* parseError, + UErrorCode& status); /** * @return this instance's UMessagePatternApostropheMode. * @stable ICU 4.8 */ - UMessagePatternApostropheMode getApostropheMode() const { + U_I18N_API UMessagePatternApostropheMode getApostropheMode() const { return msgPattern.getApostropheMode(); } @@ -509,7 +505,7 @@ class U_I18N_API MessageFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - virtual UnicodeString& toPattern(UnicodeString& appendTo) const; + U_I18N_API virtual UnicodeString& toPattern(UnicodeString& appendTo) const; /** * Sets subformats. @@ -527,7 +523,7 @@ class U_I18N_API MessageFormat : public Format { * @param formatsToAdopt the format to be adopted. * @param count the size of the array. */ - virtual void adoptFormats(Format** formatsToAdopt, int32_t count); + U_I18N_API virtual void adoptFormats(Format** formatsToAdopt, int32_t count); /** * Sets subformats. @@ -543,8 +539,7 @@ class U_I18N_API MessageFormat : public Format { * @param newFormats the new format to be set. * @param cnt the size of the array. */ - virtual void setFormats(const Format** newFormats, int32_t cnt); - + U_I18N_API virtual void setFormats(const Format** newFormats, int32_t cnt); /** * Sets one subformat. @@ -560,7 +555,7 @@ class U_I18N_API MessageFormat : public Format { * @param formatNumber index of the subformat. * @param formatToAdopt the format to be adopted. */ - virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt); + U_I18N_API virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt); /** * Sets one subformat. @@ -571,7 +566,7 @@ class U_I18N_API MessageFormat : public Format { * @param format the format to be set. * @stable ICU 2.0 */ - virtual void setFormat(int32_t formatNumber, const Format& format); + U_I18N_API virtual void setFormat(int32_t formatNumber, const Format& format); /** * Gets format names. This function returns formatNames in StringEnumerations @@ -581,7 +576,7 @@ class U_I18N_API MessageFormat : public Format { * @param status output param set to success/failure code. * @stable ICU 4.0 */ - virtual StringEnumeration* getFormatNames(UErrorCode& status); + U_I18N_API virtual StringEnumeration* getFormatNames(UErrorCode& status); /** * Gets subformat pointer for given format name. @@ -596,7 +591,7 @@ class U_I18N_API MessageFormat : public Format { * @param status output param set to success/failure code. * @stable ICU 4.0 */ - virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status); + U_I18N_API virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status); /** * Sets one subformat for given format name. @@ -611,7 +606,9 @@ class U_I18N_API MessageFormat : public Format { * @param status output param set to success/failure code. * @stable ICU 4.0 */ - virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status); + U_I18N_API virtual void setFormat(const UnicodeString& formatName, + const Format& format, + UErrorCode& status); /** * Sets one subformat for given format name. @@ -627,7 +624,9 @@ class U_I18N_API MessageFormat : public Format { * @param status output param set to success/failure code. * @stable ICU 4.0 */ - virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status); + U_I18N_API virtual void adoptFormat(const UnicodeString& formatName, + Format* formatToAdopt, + UErrorCode& status); /** * Gets an array of subformats of this object. The returned array @@ -641,8 +640,7 @@ class U_I18N_API MessageFormat : public Format { * memory. Any or all of the array elements may be nullptr. * @stable ICU 2.0 */ - virtual const Format** getFormats(int32_t& count) const; - + U_I18N_API virtual const Format** getFormats(int32_t& count) const; using Format::format; @@ -663,11 +661,11 @@ class U_I18N_API MessageFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - UnicodeString& format(const Formattable* source, - int32_t count, - UnicodeString& appendTo, - FieldPosition& ignore, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(const Formattable* source, + int32_t count, + UnicodeString& appendTo, + FieldPosition& ignore, + UErrorCode& status) const; /** * Formats the given array of arguments into a user-readable string @@ -686,11 +684,11 @@ class U_I18N_API MessageFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - static UnicodeString& format(const UnicodeString& pattern, - const Formattable* arguments, - int32_t count, - UnicodeString& appendTo, - UErrorCode& status); + U_I18N_API static UnicodeString& format(const UnicodeString& pattern, + const Formattable* arguments, + int32_t count, + UnicodeString& appendTo, + UErrorCode& status); /** * Formats the given array of arguments into a user-readable @@ -712,10 +710,10 @@ class U_I18N_API MessageFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 2.0 */ - virtual UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const override; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const override; /** * Formats the given array of arguments into a user-defined argument name @@ -735,11 +733,11 @@ class U_I18N_API MessageFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 4.0 */ - UnicodeString& format(const UnicodeString* argumentNames, - const Formattable* arguments, - int32_t count, - UnicodeString& appendTo, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(const UnicodeString* argumentNames, + const Formattable* arguments, + int32_t count, + UnicodeString& appendTo, + UErrorCode& status) const; /** * Parses the given string into an array of output arguments. * @@ -753,9 +751,9 @@ class U_I18N_API MessageFormat : public Format { * the array and its contents. * @stable ICU 2.0 */ - virtual Formattable* parse(const UnicodeString& source, - ParsePosition& pos, - int32_t& count) const; + U_I18N_API virtual Formattable* parse(const UnicodeString& source, + ParsePosition& pos, + int32_t& count) const; /** * Parses the given string into an array of output arguments. @@ -772,9 +770,9 @@ class U_I18N_API MessageFormat : public Format { * * @stable ICU 2.0 */ - virtual Formattable* parse(const UnicodeString& source, - int32_t& count, - UErrorCode& status) const; + U_I18N_API virtual Formattable* parse(const UnicodeString& source, + int32_t& count, + UErrorCode& status) const; /** * Parses the given string into an array of output arguments @@ -788,9 +786,9 @@ class U_I18N_API MessageFormat : public Format { * fails. * @stable ICU 2.0 */ - virtual void parseObject(const UnicodeString& source, - Formattable& result, - ParsePosition& pos) const override; + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& pos) const override; /** * Convert an 'apostrophe-friendly' pattern into a standard @@ -811,9 +809,7 @@ class U_I18N_API MessageFormat : public Format { * @return the standard equivalent of the original pattern * @stable ICU 3.4 */ - static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern, - UErrorCode& status); - + U_I18N_API static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern, UErrorCode& status); /** * Returns true if this MessageFormat uses named arguments, @@ -822,8 +818,7 @@ class U_I18N_API MessageFormat : public Format { * @return true if named arguments are used. * @stable ICU 4.0 */ - UBool usesNamedArguments() const; - + U_I18N_API UBool usesNamedArguments() const; #ifndef U_HIDE_INTERNAL_API /** @@ -836,7 +831,7 @@ class U_I18N_API MessageFormat : public Format { * @return The number of formattable types in the pattern * @internal */ - int32_t getArgTypeCount() const; + U_I18N_API int32_t getArgTypeCount() const; #endif /* U_HIDE_INTERNAL_API */ /** @@ -850,7 +845,7 @@ class U_I18N_API MessageFormat : public Format { * other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * Return the class ID for this class. This is useful only for @@ -863,7 +858,7 @@ class U_I18N_API MessageFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); #ifndef U_HIDE_INTERNAL_API /** @@ -876,7 +871,7 @@ class U_I18N_API MessageFormat : public Format { * @return whether the two objects are the same * @internal */ - static UBool equalFormats(const void* left, const void* right); + U_I18N_API static UBool equalFormats(const void* left, const void* right); #endif /* U_HIDE_INTERNAL_API */ private: @@ -894,7 +889,7 @@ class U_I18N_API MessageFormat : public Format { * For example, if the number matches an explicit-value selector like "=1" * we do not need any PluralRules. */ - class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector { + class PluralSelectorProvider : public PluralFormat::PluralSelector { public: PluralSelectorProvider(const MessageFormat &mf, UPluralType type); virtual ~PluralSelectorProvider(); @@ -1084,7 +1079,7 @@ class U_I18N_API MessageFormat : public Format { * A DummyFormatter that we use solely to store a nullptr value. UHash does * not support storing nullptr values. */ - class U_I18N_API DummyFormat : public Format { + class DummyFormat : public Format { public: virtual bool operator==(const Format&) const override; virtual DummyFormat* clone() const override; diff --git a/deps/icu-small/source/i18n/unicode/nounit.h b/deps/icu-small/source/i18n/unicode/nounit.h index 96aca35d0132e9..6646074cedf326 100644 --- a/deps/icu-small/source/i18n/unicode/nounit.h +++ b/deps/icu-small/source/i18n/unicode/nounit.h @@ -43,7 +43,7 @@ namespace NoUnit { * @stable ICU 68 */ static inline MeasureUnit U_EXPORT2 base() { - return MeasureUnit(); + return {}; } /** diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h index 069324a9ef3eec..6b20e383b8194d 100644 --- a/deps/icu-small/source/i18n/unicode/numberformatter.h +++ b/deps/icu-small/source/i18n/unicode/numberformatter.h @@ -93,15 +93,13 @@ class IFixedDecimal; class FieldPositionIteratorHandler; class FormattedStringBuilder; -namespace numparse { -namespace impl { +namespace numparse::impl { // Forward declarations: class NumberParserImpl; class MultiplierParseHandler; -} -} +} // namespace numparse::impl namespace units { @@ -1258,7 +1256,6 @@ class U_I18N_API StringProp : public UMemory { StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) { } - /** @internal (private) */ UBool copyErrorTo(UErrorCode &status) const { if (U_FAILURE(fError)) { status = fError; @@ -1519,9 +1516,10 @@ class U_I18N_API Padder : public UMemory { friend class impl::GeneratorHelpers; }; -// Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field +// Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field. +// U_I18N_API because intltest uses it. /** @internal */ -struct U_I18N_API MacroProps : public UMemory { +struct U_I18N_API_CLASS MacroProps : public UMemory { /** @internal */ Notation notation; @@ -1590,7 +1588,7 @@ struct U_I18N_API MacroProps : public UMemory { * Check all members for errors. * @internal */ - bool copyErrorTo(UErrorCode &status) const { + U_I18N_API bool copyErrorTo(UErrorCode &status) const { return notation.copyErrorTo(status) || precision.copyErrorTo(status) || padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) || symbols.copyErrorTo(status) || scale.copyErrorTo(status) || usage.copyErrorTo(status) || @@ -2497,11 +2495,18 @@ class U_I18N_API UnlocalizedNumberFormatter explicit UnlocalizedNumberFormatter( NumberFormatterSettings<UnlocalizedNumberFormatter>&& src) noexcept; + explicit UnlocalizedNumberFormatter(const impl::MacroProps ¯os); + + explicit UnlocalizedNumberFormatter(impl::MacroProps &¯os); + // To give the fluent setters access to this class's constructor: friend class NumberFormatterSettings<UnlocalizedNumberFormatter>; // To give NumberFormatter::with() access to this class's constructor: friend class NumberFormatter; + + // To give LNF::withoutLocale() access to this class's constructor: + friend class LocalizedNumberFormatter; }; /** @@ -2604,6 +2609,23 @@ class U_I18N_API LocalizedNumberFormatter */ Format* toFormat(UErrorCode& status) const; + /** + * Disassociate the locale from this formatter. + * + * @return The fluent chain. + * @stable ICU 75 + */ + UnlocalizedNumberFormatter withoutLocale() const &; + + /** + * Overload of withoutLocale() for use on an rvalue reference. + * + * @return The fluent chain. + * @see #withoutLocale + * @stable ICU 75 + */ + UnlocalizedNumberFormatter withoutLocale() &&; + /** * Default constructor: puts the formatter into a valid but undefined state. * diff --git a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h index 8ca20f31d714c9..228d8c7ec25f4d 100644 --- a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h +++ b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h @@ -68,29 +68,13 @@ struct UFormattedNumberRangeImpl; } // namespace impl -/** - * \cond - * Export an explicit template instantiation. See datefmt.h - * (When building DLLs for Windows this is required.) - */ -#if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN) && !defined(U_STATIC_IMPLEMENTATION) -} // namespace icu::number -U_NAMESPACE_END - -template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>; - -U_NAMESPACE_BEGIN -namespace number { // icu::number -#endif -/** \endcond */ - // Other helper classes would go here, but there are none. namespace impl { // icu::number::impl // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field /** @internal */ -struct U_I18N_API RangeMacroProps : public UMemory { +struct RangeMacroProps : public UMemory { /** @internal */ UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with(); @@ -462,11 +446,18 @@ class U_I18N_API UnlocalizedNumberRangeFormatter explicit UnlocalizedNumberRangeFormatter( NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>&& src) noexcept; + explicit UnlocalizedNumberRangeFormatter(const impl::RangeMacroProps ¯os); + + explicit UnlocalizedNumberRangeFormatter(impl::RangeMacroProps &¯os); + // To give the fluent setters access to this class's constructor: friend class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>; // To give NumberRangeFormatter::with() access to this class's constructor: friend class NumberRangeFormatter; + + // To give LNRF::withoutLocale() access to this class's constructor: + friend class LocalizedNumberRangeFormatter; }; /** @@ -477,7 +468,7 @@ class U_I18N_API UnlocalizedNumberRangeFormatter * @see NumberFormatter * @stable ICU 63 */ -class U_I18N_API LocalizedNumberRangeFormatter +class U_I18N_API_CLASS LocalizedNumberRangeFormatter : public NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>, public UMemory { public: /** @@ -493,41 +484,58 @@ class U_I18N_API LocalizedNumberRangeFormatter * @return A FormattedNumberRange object; call .toString() to get the string. * @stable ICU 63 */ - FormattedNumberRange formatFormattableRange( + U_I18N_API FormattedNumberRange formatFormattableRange( const Formattable& first, const Formattable& second, UErrorCode& status) const; + /** + * Disassociate the locale from this formatter. + * + * @return The fluent chain. + * @stable ICU 75 + */ + U_I18N_API UnlocalizedNumberRangeFormatter withoutLocale() const &; + + /** + * Overload of withoutLocale() for use on an rvalue reference. + * + * @return The fluent chain. + * @see #withoutLocale + * @stable ICU 75 + */ + U_I18N_API UnlocalizedNumberRangeFormatter withoutLocale() &&; + /** * Default constructor: puts the formatter into a valid but undefined state. * * @stable ICU 63 */ - LocalizedNumberRangeFormatter() = default; + U_I18N_API LocalizedNumberRangeFormatter() = default; /** * Returns a copy of this LocalizedNumberRangeFormatter. * @stable ICU 63 */ - LocalizedNumberRangeFormatter(const LocalizedNumberRangeFormatter &other); + U_I18N_API LocalizedNumberRangeFormatter(const LocalizedNumberRangeFormatter &other); /** * Move constructor: * The source LocalizedNumberRangeFormatter will be left in a valid but undefined state. * @stable ICU 63 */ - LocalizedNumberRangeFormatter(LocalizedNumberRangeFormatter&& src) noexcept; + U_I18N_API LocalizedNumberRangeFormatter(LocalizedNumberRangeFormatter&& src) noexcept; /** * Copy assignment operator. * @stable ICU 63 */ - LocalizedNumberRangeFormatter& operator=(const LocalizedNumberRangeFormatter& other); + U_I18N_API LocalizedNumberRangeFormatter& operator=(const LocalizedNumberRangeFormatter& other); /** * Move assignment operator: * The source LocalizedNumberRangeFormatter will be left in a valid but undefined state. * @stable ICU 63 */ - LocalizedNumberRangeFormatter& operator=(LocalizedNumberRangeFormatter&& src) noexcept; + U_I18N_API LocalizedNumberRangeFormatter& operator=(LocalizedNumberRangeFormatter&& src) noexcept; #ifndef U_HIDE_INTERNAL_API @@ -541,8 +549,8 @@ class U_I18N_API LocalizedNumberRangeFormatter * Set if an error occurs while formatting. * @internal */ - void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding, - UErrorCode& status) const; + U_I18N_API void formatImpl(impl::UFormattedNumberRangeData &results, bool equalBeforeRounding, + UErrorCode &status) const; #endif /* U_HIDE_INTERNAL_API */ @@ -550,7 +558,7 @@ class U_I18N_API LocalizedNumberRangeFormatter * Destruct this LocalizedNumberRangeFormatter, cleaning up any memory it might own. * @stable ICU 63 */ - ~LocalizedNumberRangeFormatter(); + U_I18N_API ~LocalizedNumberRangeFormatter(); private: std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {}; diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index e1aa3092761dc4..aabbad4f18ac2b 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -199,23 +199,21 @@ class U_I18N_API NumberFormat : public Format { * @stable ICU 4.8 */ kRoundUnnecessary, -#ifndef U_HIDE_DRAFT_API /** * Rounds ties toward the odd number. - * @draft ICU 73 + * @stable ICU 73 */ kRoundHalfOdd, /** * Rounds ties toward +∞. - * @draft ICU 73 + * @stable ICU 73 */ kRoundHalfCeiling, /** * Rounds ties toward -∞. - * @draft ICU 73 + * @stable ICU 73 */ kRoundHalfFloor, -#endif /* U_HIDE_DRAFT_API */ }; /** @@ -707,7 +705,7 @@ class U_I18N_API NumberFormat : public Format { * only. * @stable ICU 2.0 */ - UBool isParseIntegerOnly(void) const; + UBool isParseIntegerOnly() const; /** * Sets whether or not numbers should be parsed as integers only. @@ -735,7 +733,7 @@ class U_I18N_API NumberFormat : public Format { * @see #setLenient * @stable ICU 4.8 */ - virtual UBool isLenient(void) const; + virtual UBool isLenient() const; /** * Create a default style NumberFormat for the current default locale. @@ -898,7 +896,7 @@ class U_I18N_API NumberFormat : public Format { * @return a StringEnumeration over the locales available at the time of the call * @stable ICU 2.6 */ - static StringEnumeration* U_EXPORT2 getAvailableLocales(void); + static StringEnumeration* U_EXPORT2 getAvailableLocales(); #endif /* UCONFIG_NO_SERVICE */ /** @@ -910,7 +908,7 @@ class U_I18N_API NumberFormat : public Format { * @see setGroupingUsed * @stable ICU 2.0 */ - UBool isGroupingUsed(void) const; + UBool isGroupingUsed() const; /** * Set whether or not grouping will be used in this format. @@ -928,7 +926,7 @@ class U_I18N_API NumberFormat : public Format { * @see setMaximumIntegerDigits * @stable ICU 2.0 */ - int32_t getMaximumIntegerDigits(void) const; + int32_t getMaximumIntegerDigits() const; /** * Sets the maximum number of digits allowed in the integer portion of a @@ -952,7 +950,7 @@ class U_I18N_API NumberFormat : public Format { * @see setMinimumIntegerDigits * @stable ICU 2.0 */ - int32_t getMinimumIntegerDigits(void) const; + int32_t getMinimumIntegerDigits() const; /** * Sets the minimum number of digits allowed in the integer portion of a @@ -974,7 +972,7 @@ class U_I18N_API NumberFormat : public Format { * @see setMaximumFractionDigits * @stable ICU 2.0 */ - int32_t getMaximumFractionDigits(void) const; + int32_t getMaximumFractionDigits() const; /** * Sets the maximum number of digits allowed in the fraction portion of a @@ -996,7 +994,7 @@ class U_I18N_API NumberFormat : public Format { * @see setMinimumFractionDigits * @stable ICU 2.0 */ - int32_t getMinimumFractionDigits(void) const; + int32_t getMinimumFractionDigits() const; /** * Sets the minimum number of digits allowed in the fraction portion of a @@ -1062,7 +1060,7 @@ class U_I18N_API NumberFormat : public Format { * @return A rounding mode * @stable ICU 60 */ - virtual ERoundingMode getRoundingMode(void) const; + virtual ERoundingMode getRoundingMode() const; /** * Set the rounding mode. If a subclass does not support rounding, this will do nothing. @@ -1081,7 +1079,7 @@ class U_I18N_API NumberFormat : public Format { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. @@ -1094,7 +1092,7 @@ class U_I18N_API NumberFormat : public Format { * other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; protected: @@ -1204,7 +1202,7 @@ class U_I18N_API NumberFormatFactory : public UObject { * be listed by getAvailableLocales. * @stable ICU 2.6 */ - virtual UBool visible(void) const = 0; + virtual UBool visible() const = 0; /** * Return the locale names directly supported by this factory. The number of names @@ -1255,7 +1253,7 @@ class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory { /** * @stable ICU 2.6 */ - virtual UBool visible(void) const override; + virtual UBool visible() const override; /** * @stable ICU 2.6 diff --git a/deps/icu-small/source/i18n/unicode/numsys.h b/deps/icu-small/source/i18n/unicode/numsys.h index 51a6e147b10792..58072ff665f18e 100644 --- a/deps/icu-small/source/i18n/unicode/numsys.h +++ b/deps/icu-small/source/i18n/unicode/numsys.h @@ -185,7 +185,7 @@ class U_I18N_API NumberingSystem : public UObject { * @stable ICU 4.2 * */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. diff --git a/deps/icu-small/source/i18n/unicode/plurfmt.h b/deps/icu-small/source/i18n/unicode/plurfmt.h index 8e6cbb44540591..adba324d2eb507 100644 --- a/deps/icu-small/source/i18n/unicode/plurfmt.h +++ b/deps/icu-small/source/i18n/unicode/plurfmt.h @@ -145,7 +145,7 @@ class NFRule; * @stable ICU 4.0 */ -class U_I18N_API PluralFormat : public Format { +class U_I18N_API_CLASS PluralFormat : public Format { public: /** @@ -156,7 +156,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(UErrorCode& status); + U_I18N_API PluralFormat(UErrorCode& status); /** * Creates a new cardinal-number <code>PluralFormat</code> for a given locale. @@ -167,7 +167,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const Locale& locale, UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for a given set of rules. @@ -178,7 +178,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const PluralRules& rules, UErrorCode& status); + U_I18N_API PluralFormat(const PluralRules& rules, UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for a given set of rules. @@ -190,13 +190,8 @@ class U_I18N_API PluralFormat : public Format { * @param status output param set to success/failure code on exit, which * must not indicate a failure before the function call. * @stable ICU 4.0 - * <p> - * <h4>Sample code</h4> - * \snippet samples/plurfmtsample/plurfmtsample.cpp PluralFormatExample1 - * \snippet samples/plurfmtsample/plurfmtsample.cpp PluralFormatExample - * <p> */ - PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for the plural type. @@ -208,7 +203,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 50 */ - PluralFormat(const Locale& locale, UPluralType type, UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, UPluralType type, UErrorCode& status); /** * Creates a new cardinal-number <code>PluralFormat</code> for a given pattern string. @@ -220,7 +215,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const UnicodeString& pattern, UErrorCode& status); + U_I18N_API PluralFormat(const UnicodeString& pattern, UErrorCode& status); /** * Creates a new cardinal-number <code>PluralFormat</code> for a given pattern string and @@ -236,7 +231,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for a given set of rules, a @@ -249,9 +244,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const PluralRules& rules, - const UnicodeString& pattern, - UErrorCode& status); + U_I18N_API PluralFormat(const PluralRules& rules, const UnicodeString& pattern, UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for a given set of rules, a @@ -267,10 +260,10 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - PluralFormat(const Locale& locale, - const PluralRules& rules, - const UnicodeString& pattern, - UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, + const PluralRules& rules, + const UnicodeString& pattern, + UErrorCode& status); /** * Creates a new <code>PluralFormat</code> for a plural type, a @@ -285,22 +278,22 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 50 */ - PluralFormat(const Locale& locale, - UPluralType type, - const UnicodeString& pattern, - UErrorCode& status); + U_I18N_API PluralFormat(const Locale& locale, + UPluralType type, + const UnicodeString& pattern, + UErrorCode& status); /** * copy constructor. * @stable ICU 4.0 */ - PluralFormat(const PluralFormat& other); + U_I18N_API PluralFormat(const PluralFormat& other); /** * Destructor. * @stable ICU 4.0 */ - virtual ~PluralFormat(); + U_I18N_API virtual ~PluralFormat(); /** * Sets the pattern used by this plural format. @@ -314,8 +307,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - void applyPattern(const UnicodeString& pattern, UErrorCode& status); - + U_I18N_API void applyPattern(const UnicodeString& pattern, UErrorCode& status); using Format::format; @@ -331,7 +323,7 @@ class U_I18N_API PluralFormat : public Format { * @return the string containing the formatted plural message. * @stable ICU 4.0 */ - UnicodeString format(int32_t number, UErrorCode& status) const; + U_I18N_API UnicodeString format(int32_t number, UErrorCode& status) const; /** * Formats a plural message for a given number. @@ -345,7 +337,7 @@ class U_I18N_API PluralFormat : public Format { * @return the string containing the formatted plural message. * @stable ICU 4.0 */ - UnicodeString format(double number, UErrorCode& status) const; + U_I18N_API UnicodeString format(double number, UErrorCode& status) const; /** * Formats a plural message for a given number. @@ -363,10 +355,10 @@ class U_I18N_API PluralFormat : public Format { * @return the string containing the formatted plural message. * @stable ICU 4.0 */ - UnicodeString& format(int32_t number, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(int32_t number, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const; /** * Formats a plural message for a given number. @@ -384,10 +376,10 @@ class U_I18N_API PluralFormat : public Format { * @return the string containing the formatted plural message. * @stable ICU 4.0 */ - UnicodeString& format(double number, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const; + U_I18N_API UnicodeString& format(double number, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const; #ifndef U_HIDE_DEPRECATED_API /** @@ -405,7 +397,7 @@ class U_I18N_API PluralFormat : public Format { * a different kind of PluralRules instance; * use one of the constructors to create a new instance instead. */ - void setLocale(const Locale& locale, UErrorCode& status); + U_I18N_API void setLocale(const Locale& locale, UErrorCode& status); #endif /* U_HIDE_DEPRECATED_API */ /** @@ -417,7 +409,7 @@ class U_I18N_API PluralFormat : public Format { * must not indicate a failure before the function call. * @stable ICU 4.0 */ - void setNumberFormat(const NumberFormat* format, UErrorCode& status); + U_I18N_API void setNumberFormat(const NumberFormat* format, UErrorCode& status); /** * Assignment operator @@ -425,7 +417,7 @@ class U_I18N_API PluralFormat : public Format { * @param other the PluralFormat object to copy from. * @stable ICU 4.0 */ - PluralFormat& operator=(const PluralFormat& other); + U_I18N_API PluralFormat& operator=(const PluralFormat& other); /** * Return true if another object is semantically equal to this one. @@ -434,7 +426,7 @@ class U_I18N_API PluralFormat : public Format { * @return true if other is semantically equal to this. * @stable ICU 4.0 */ - virtual bool operator==(const Format& other) const override; + U_I18N_API virtual bool operator==(const Format& other) const override; /** * Return true if another object is semantically unequal to this one. @@ -443,69 +435,69 @@ class U_I18N_API PluralFormat : public Format { * @return true if other is semantically unequal to this. * @stable ICU 4.0 */ - virtual bool operator!=(const Format& other) const; + U_I18N_API virtual bool operator!=(const Format& other) const; /** * Clones this Format object polymorphically. The caller owns the * result and should delete it when done. * @stable ICU 4.0 */ - virtual PluralFormat* clone() const override; - - /** - * Formats a plural message for a number taken from a Formattable object. - * - * @param obj The object containing a number for which the - * plural message should be formatted. - * The object must be of a numeric type. - * @param appendTo output parameter to receive result. - * Result is appended to existing contents. - * @param pos On input: an alignment field, if desired. - * On output: the offsets of the alignment field. - * @param status output param filled with success/failure status. - * @return Reference to 'appendTo' parameter. - * @stable ICU 4.0 - */ - UnicodeString& format(const Formattable& obj, - UnicodeString& appendTo, - FieldPosition& pos, - UErrorCode& status) const override; - - /** - * Returns the pattern from applyPattern() or constructor(). - * - * @param appendTo output parameter to receive result. + U_I18N_API virtual PluralFormat* clone() const override; + + /** + * Formats a plural message for a number taken from a Formattable object. + * + * @param obj The object containing a number for which the + * plural message should be formatted. + * The object must be of a numeric type. + * @param appendTo output parameter to receive result. + * Result is appended to existing contents. + * @param pos On input: an alignment field, if desired. + * On output: the offsets of the alignment field. + * @param status output param filled with success/failure status. + * @return Reference to 'appendTo' parameter. + * @stable ICU 4.0 + */ + U_I18N_API UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const override; + + /** + * Returns the pattern from applyPattern() or constructor(). + * + * @param appendTo output parameter to receive result. * Result is appended to existing contents. - * @return the UnicodeString with inserted pattern. - * @stable ICU 4.0 - */ - UnicodeString& toPattern(UnicodeString& appendTo); - - /** - * This method is not yet supported by <code>PluralFormat</code>. - * <P> - * Before calling, set parse_pos.index to the offset you want to start - * parsing at in the source. After calling, parse_pos.index is the end of - * the text you parsed. If error occurs, index is unchanged. - * <P> - * When parsing, leading whitespace is discarded (with a successful parse), - * while trailing whitespace is left as is. - * <P> - * See Format::parseObject() for more. - * - * @param source The string to be parsed into an object. - * @param result Formattable to be set to the parse result. - * If parse fails, return contents are undefined. - * @param parse_pos The position to start parsing at. Upon return - * this param is set to the position after the - * last character successfully parsed. If the - * source is not parsed successfully, this param - * will remain unchanged. - * @stable ICU 4.0 - */ - virtual void parseObject(const UnicodeString& source, - Formattable& result, - ParsePosition& parse_pos) const override; + * @return the UnicodeString with inserted pattern. + * @stable ICU 4.0 + */ + U_I18N_API UnicodeString& toPattern(UnicodeString& appendTo); + + /** + * This method is not yet supported by <code>PluralFormat</code>. + * <P> + * Before calling, set parse_pos.index to the offset you want to start + * parsing at in the source. After calling, parse_pos.index is the end of + * the text you parsed. If error occurs, index is unchanged. + * <P> + * When parsing, leading whitespace is discarded (with a successful parse), + * while trailing whitespace is left as is. + * <P> + * See Format::parseObject() for more. + * + * @param source The string to be parsed into an object. + * @param result Formattable to be set to the parse result. + * If parse fails, return contents are undefined. + * @param parse_pos The position to start parsing at. Upon return + * this param is set to the position after the + * last character successfully parsed. If the + * source is not parsed successfully, this param + * will remain unchanged. + * @stable ICU 4.0 + */ + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const override; /** * ICU "poor man's RTTI", returns a UClassID for this class. @@ -513,20 +505,17 @@ class U_I18N_API PluralFormat : public Format { * @stable ICU 4.0 * */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @stable ICU 4.0 */ - virtual UClassID getDynamicClassID() const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; private: - /** - * @internal (private) - */ - class U_I18N_API PluralSelector : public UMemory { + class PluralSelector : public UMemory { public: virtual ~PluralSelector(); /** @@ -536,12 +525,11 @@ class U_I18N_API PluralFormat : public Format { * @param number The number to be plural-formatted. * @param ec Error code. * @return The selected PluralFormat keyword. - * @internal (private) */ virtual UnicodeString select(void *context, double number, UErrorCode& ec) const = 0; }; - class U_I18N_API PluralSelectorAdapter : public PluralSelector { + class PluralSelectorAdapter : public PluralSelector { public: PluralSelectorAdapter() : pluralRules(nullptr) { } diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index b7d95175f558c0..7e2fe37f7389e2 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -553,7 +553,7 @@ class U_I18N_API PluralRules : public UObject { * @stable ICU 4.0 * */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index f9a1c8f93a5b85..50c0d195a46395 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -88,23 +88,24 @@ enum URBNFRuleSetTag { }; /** - * The RuleBasedNumberFormat class formats numbers according to a set of rules. This number formatter is - * typically used for spelling out numeric values in words (e.g., 25,3476 as - * "twenty-five thousand three hundred seventy-six" or "vingt-cinq mille trois - * cents soixante-seize" or + * The RuleBasedNumberFormat class formats numbers according to a set of rules. + * + * <p>This number formatter is typically used for spelling out numeric values in words (e.g., 25,376 + * as "twenty-five thousand three hundred seventy-six" or "vingt-cinq mille trois + * cent soixante-seize" or * "fünfundzwanzigtausenddreihundertsechsundsiebzig"), but can also be used for - * other complicated formatting tasks, such as formatting a number of seconds as hours, - * minutes and seconds (e.g., 3,730 as "1:02:10"). + * other complicated formatting tasks. For example, formatting a number as Roman numerals (e.g. 8 as VIII) + * or as ordinal digits (e.g. 1st, 2nd, 3rd, 4th).</p> * * <p>The resources contain three predefined formatters for each locale: spellout, which * spells out a value in words (123 is "one hundred twenty-three"); ordinal, which * appends an ordinal suffix to the end of a numeral (123 is "123rd"); and - * duration, which shows a duration in seconds as hours, minutes, and seconds (123 is - * "2:03").  The client can also define more specialized <tt>RuleBasedNumberFormat</tt>s + * numbering system, which shows a number in other non-decimal based systems (e.g. Roman numerals). + * The client can also define more specialized <code>RuleBasedNumberFormat</code>s * by supplying programmer-defined rule sets.</p> * - * <p>The behavior of a <tt>RuleBasedNumberFormat</tt> is specified by a textual description - * that is either passed to the constructor as a <tt>String</tt> or loaded from a resource + * <p>The behavior of a <code>RuleBasedNumberFormat</code> is specified by a textual description + * that is either passed to the constructor as a <code>String</code> or loaded from a resource * bundle. In its simplest form, the description consists of a semicolon-delimited list of <em>rules.</em> * Each rule has a string of output text and a value or range of values it is applicable to. * In a typical spellout rule set, the first twenty rules are the words for the numbers from @@ -116,7 +117,8 @@ enum URBNFRuleSetTag { * <p>For larger numbers, we can use the preceding set of rules to format the ones place, and * we only have to supply the words for the multiples of 10:</p> * - * <pre> 20: twenty[->>]; + * <pre> + * 20: twenty[->>]; * 30: thirty[->>]; * 40: forty[->>]; * 50: fifty[->>]; @@ -137,7 +139,8 @@ enum URBNFRuleSetTag { * <p>For even larger numbers, we can actually look up several parts of the number in the * list:</p> * - * <pre>100: << hundred[ >>];</pre> + * <pre> + * 100: << hundred[ >>];</pre> * * <p>The "<<" represents a new kind of substitution. The << isolates * the hundreds digit (and any digits to its left), formats it using this same rule set, and @@ -155,52 +158,54 @@ enum URBNFRuleSetTag { * * <p>This rule covers values up to 999, at which point we add another rule:</p> * - * <pre>1000: << thousand[ >>];</pre> + * <pre> + * 1000: << thousand[ >>];</pre> * - * <p>Again, the meanings of the brackets and substitution tokens shift because the rule's + * <p>Just like the 100 rule, the meanings of the brackets and substitution tokens shift because the rule's * base value is a higher power of 10, changing the rule's divisor. This rule can actually be * used all the way up to 999,999. This allows us to finish out the rules as follows:</p> * - * <pre> 1,000,000: << million[ >>]; + * <pre> + * 1,000,000: << million[ >>]; * 1,000,000,000: << billion[ >>]; * 1,000,000,000,000: << trillion[ >>]; * 1,000,000,000,000,000: OUT OF RANGE!;</pre> * * <p>Commas, periods, and spaces can be used in the base values to improve legibility and * are ignored by the rule parser. The last rule in the list is customarily treated as an - * "overflow rule," applying to everything from its base value on up, and often (as + * "overflow rule", applying to everything from its base value on up, and often (as * in this example) being used to print out an error message or default representation. * Notice also that the size of the major groupings in large numbers is controlled by the * spacing of the rules: because in English we group numbers by thousand, the higher rules * are separated from each other by a factor of 1,000.</p> * - * <p>To see how these rules actually work in practice, consider the following example: - * Formatting 25,430 with this rule set would work like this:</p> + * <p>To see how these rules actually work in practice, consider the following example. + * Formatting 25,340 with this rule set would work like this:</p> * - * <table border="0" width="100%"> + * <table style="border-collapse: collapse;"> * <tr> - * <td><strong><< thousand >></strong></td> - * <td>[the rule whose base value is 1,000 is applicable to 25,340]</td> + * <td style="width: 257; vertical-align: top;"><strong><< thousand >></strong></td> + * <td style="width: 340; vertical-align: top;">[the rule whose base value is 1,000 is applicable to 25,340]</td> * </tr> * <tr> - * <td><strong>twenty->></strong> thousand >></td> - * <td>[25,340 over 1,000 is 25. The rule for 20 applies.]</td> + * <td style="width: 257; vertical-align: top;"><strong>twenty->></strong> thousand >></td> + * <td style="width: 340; vertical-align: top;">[25,340 over 1,000 is 25. The rule for 20 applies.]</td> * </tr> * <tr> - * <td>twenty-<strong>five</strong> thousand >></td> - * <td>[25 mod 10 is 5. The rule for 5 is "five."</td> + * <td style="width: 257; vertical-align: top;">twenty-<strong>five</strong> thousand >></td> + * <td style="width: 340; vertical-align: top;">[25 mod 10 is 5. The rule for 5 is "five."</td> * </tr> * <tr> - * <td>twenty-five thousand <strong><< hundred >></strong></td> - * <td>[25,340 mod 1,000 is 340. The rule for 100 applies.]</td> + * <td style="width: 257; vertical-align: top;">twenty-five thousand <strong><< hundred >></strong></td> + * <td style="width: 340; vertical-align: top;">[25,340 mod 1,000 is 340. The rule for 100 applies.]</td> * </tr> * <tr> - * <td>twenty-five thousand <strong>three</strong> hundred >></td> - * <td>[340 over 100 is 3. The rule for 3 is "three."]</td> + * <td style="width: 257; vertical-align: top;">twenty-five thousand <strong>three</strong> hundred >></td> + * <td style="width: 340; vertical-align: top;">[340 over 100 is 3. The rule for 3 is "three."]</td> * </tr> * <tr> - * <td>twenty-five thousand three hundred <strong>forty</strong></td> - * <td>[340 mod 100 is 40. The rule for 40 applies. Since 40 divides + * <td style="width: 257; vertical-align: top;">twenty-five thousand three hundred <strong>forty</strong></td> + * <td style="width: 340; vertical-align: top;">[340 mod 100 is 40. The rule for 40 applies. Since 40 divides * evenly by 10, the hyphen and substitution in the brackets are omitted.]</td> * </tr> * </table> @@ -215,7 +220,7 @@ enum URBNFRuleSetTag { * >> token here means "find the number's absolute value, format it with these * rules, and put the result here."</p> * - * <p>We also add a special rule called a <em>fraction rule </em>for numbers with fractional + * <p>We also add a special rule called a <em>fraction rule</em> for numbers with fractional * parts:</p> * * <pre>x.x: << point >>;</pre> @@ -237,20 +242,20 @@ enum URBNFRuleSetTag { * * <hr> * - * <p>The description of a <tt>RuleBasedNumberFormat</tt>'s behavior consists of one or more <em>rule - * sets.</em> Each rule set consists of a name, a colon, and a list of <em>rules.</em> A rule - * set name must begin with a % sign. Rule sets with names that begin with a single % sign - * are <em>public:</em> the caller can specify that they be used to format and parse numbers. - * Rule sets with names that begin with %% are <em>private:</em> they exist only for the use + * <p>The description of a <code>RuleBasedNumberFormat</code>'s behavior consists of one or more <em>rule + * sets.</em> Each rule set consists of a name, a colon, and a list of <em>rules</em>. A rule + * set name must begin with a % sign. Rule sets with a name that begins with a single % sign + * are <em>public</em>, and that name can be referenced to format and parse numbers. + * Rule sets with names that begin with %% are <em>private.</em>. They exist only for the use * of other rule sets. If a formatter only has one rule set, the name may be omitted.</p> * - * <p>The user can also specify a special "rule set" named <tt>%%lenient-parse</tt>. - * The body of <tt>%%lenient-parse</tt> isn't a set of number-formatting rules, but a <tt>RuleBasedCollator</tt> + * <p>The user can also specify a special "rule set" named <code>%%lenient-parse</code>. + * The body of <code>%%lenient-parse</code> isn't a set of number-formatting rules, but a <code>RuleBasedCollator</code> * description which is used to define equivalences for lenient parsing. For more information - * on the syntax, see <tt>RuleBasedCollator</tt>. For more information on lenient parsing, - * see <tt>setLenientParse()</tt>. <em>Note:</em> symbols that have syntactic meaning + * on the syntax, see <code>RuleBasedCollator</code>. For more information on lenient parsing, + * see <code>setLenientParse()</code>. <em>Note:</em> symbols that have syntactic meaning * in collation rules, such as '&', have no particular meaning when appearing outside - * of the <tt>lenient-parse</tt> rule set.</p> + * of the <code>lenient-parse</code> rule set.</p> * * <p>The body of a rule set consists of an ordered, semicolon-delimited list of <em>rules.</em> * Internally, every rule has a base value, a divisor, rule text, and zero, one, or two <em>substitutions.</em> @@ -260,42 +265,46 @@ enum URBNFRuleSetTag { * <p>A rule descriptor can take one of the following forms (text in <em>italics</em> is the * name of a token):</p> * - * <table border="0" width="100%"> + * <table style="border-collapse: collapse;"> * <tr> - * <td><em>bv</em>:</td> - * <td><em>bv</em> specifies the rule's base value. <em>bv</em> is a decimal + * <th style="padding-left: 1em; padding-right: 1em;">Descriptor</th> + * <th>Description</th> + * </tr> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;"><em>bv</em>:</td> + * <td style="vertical-align: top;"><em>bv</em> specifies the rule's base value. <em>bv</em> is a decimal * number expressed using ASCII digits. <em>bv</em> may contain spaces, period, and commas, * which are ignored. The rule's divisor is the highest power of 10 less than or equal to * the base value.</td> * </tr> - * <tr> - * <td><em>bv</em>/<em>rad</em>:</td> - * <td><em>bv</em> specifies the rule's base value. The rule's divisor is the + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;"><em>bv</em>/<em>rad</em>:</td> + * <td style="vertical-align: top;"><em>bv</em> specifies the rule's base value. The rule's divisor is the * highest power of <em>rad</em> less than or equal to the base value.</td> * </tr> - * <tr> - * <td><em>bv</em>>:</td> - * <td><em>bv</em> specifies the rule's base value. To calculate the divisor, + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;"><em>bv</em>>:</td> + * <td style="vertical-align: top;"><em>bv</em> specifies the rule's base value. To calculate the divisor, * let the radix be 10, and the exponent be the highest exponent of the radix that yields a * result less than or equal to the base value. Every > character after the base value * decreases the exponent by 1. If the exponent is positive or 0, the divisor is the radix * raised to the power of the exponent; otherwise, the divisor is 1.</td> * </tr> - * <tr> - * <td><em>bv</em>/<em>rad</em>>:</td> - * <td><em>bv</em> specifies the rule's base value. To calculate the divisor, + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;"><em>bv</em>/<em>rad</em>>:</td> + * <td style="vertical-align: top;"><em>bv</em> specifies the rule's base value. To calculate the divisor, * let the radix be <em>rad</em>, and the exponent be the highest exponent of the radix that * yields a result less than or equal to the base value. Every > character after the radix * decreases the exponent by 1. If the exponent is positive or 0, the divisor is the radix * raised to the power of the exponent; otherwise, the divisor is 1.</td> * </tr> - * <tr> - * <td>-x:</td> - * <td>The rule is a negative-number rule.</td> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">-x:</td> + * <td style="vertical-align: top;">The rule is a negative-number rule.</td> * </tr> - * <tr> - * <td>x.x:</td> - * <td>The rule is an <em>improper fraction rule</em>. If the full stop in + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">x.x:</td> + * <td style="vertical-align: top;">The rule is an <em>improper fraction rule</em>. If the full stop in * the middle of the rule name is replaced with the decimal point * that is used in the language or DecimalFormatSymbols, then that rule will * have precedence when formatting and parsing this rule. For example, some @@ -304,41 +313,41 @@ enum URBNFRuleSetTag { * handle the decimal point that matches the language's natural spelling of * the punctuation of either the full stop or comma.</td> * </tr> - * <tr> - * <td>0.x:</td> - * <td>The rule is a <em>proper fraction rule</em>. If the full stop in + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">0.x:</td> + * <td style="vertical-align: top;">The rule is a <em>proper fraction rule</em>. If the full stop in * the middle of the rule name is replaced with the decimal point * that is used in the language or DecimalFormatSymbols, then that rule will * have precedence when formatting and parsing this rule. For example, some * languages use the comma, and can thus be written as 0,x instead. For example, * you can use "0.x: point >>;0,x: comma >>;" to * handle the decimal point that matches the language's natural spelling of - * the punctuation of either the full stop or comma.</td> + * the punctuation of either the full stop or comma</td> * </tr> - * <tr> - * <td>x.0:</td> - * <td>The rule is a <em>default rule</em>. If the full stop in + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">x.0:</td> + * <td style="vertical-align: top;">The rule is a <em>default rule</em>. If the full stop in * the middle of the rule name is replaced with the decimal point * that is used in the language or DecimalFormatSymbols, then that rule will * have precedence when formatting and parsing this rule. For example, some * languages use the comma, and can thus be written as x,0 instead. For example, * you can use "x.0: << point;x,0: << comma;" to * handle the decimal point that matches the language's natural spelling of - * the punctuation of either the full stop or comma.</td> + * the punctuation of either the full stop or comma</td> * </tr> - * <tr> - * <td>Inf:</td> - * <td>The rule for infinity.</td> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">Inf:</td> + * <td style="vertical-align: top;">The rule for infinity.</td> * </tr> - * <tr> - * <td>NaN:</td> - * <td>The rule for an IEEE 754 NaN (not a number).</td> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">NaN:</td> + * <td style="vertical-align: top;">The rule for an IEEE 754 NaN (not a number).</td> * </tr> - * <tr> - * <td><em>nothing</em></td> - * <td>If the rule's rule descriptor is left out, the base value is one plus the + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;"><em>nothing</em></td> + * <td style="vertical-align: top;">If the rule's rule descriptor is left out, the base value is one plus the * preceding rule's base value (or zero if this is the first rule in the list) in a normal - * rule set.  In a fraction rule set, the base value is the same as the preceding rule's + * rule set. In a fraction rule set, the base value is the same as the preceding rule's * base value.</td> * </tr> * </table> @@ -352,9 +361,9 @@ enum URBNFRuleSetTag { * algorithms: If the rule set is a regular rule set, do the following: * * <ul> - * <li>If the rule set includes a default rule (and the number was passed in as a <tt>double</tt>), - * use the default rule.  (If the number being formatted was passed in as a <tt>long</tt>, - * the default rule is ignored.)</li> + * <li>If the rule set includes a default rule (and the number was passed in as a <code>double</code>), + * use the default rule. If the number being formatted was passed in as a <code>long</code>, + * the default rule is ignored.</li> * <li>If the number is negative, use the negative-number rule.</li> * <li>If the number has a fractional part and is greater than 1, use the improper fraction * rule.</li> @@ -400,112 +409,142 @@ enum URBNFRuleSetTag { * * <p>The meanings of the substitution token characters are as follows:</p> * - * <table border="0" width="100%"> + * <table style="border-collapse: collapse;"> * <tr> - * <td>>></td> - * <td>in normal rule</td> + * <th>Syntax</th> + * <th>Usage</th> + * <th>Description</th> + * </tr> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;" rowspan="4">>></td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in normal rule</td> * <td>Divide the number by the rule's divisor and format the remainder</td> * </tr> * <tr> - * <td></td> - * <td>in negative-number rule</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in negative-number rule</td> * <td>Find the absolute value of the number and format the result</td> * </tr> * <tr> - * <td></td> - * <td>in fraction or default rule</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in fraction or default rule</td> * <td>Isolate the number's fractional part and format it.</td> * </tr> * <tr> - * <td></td> - * <td>in rule in fraction rule set</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in rule in fraction rule set</td> * <td>Not allowed.</td> * </tr> - * <tr> - * <td>>>></td> - * <td>in normal rule</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;" rowspan="2">>>></td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in normal rule</td> * <td>Divide the number by the rule's divisor and format the remainder, * but bypass the normal rule-selection process and just use the * rule that precedes this one in this rule list.</td> * </tr> * <tr> - * <td></td> - * <td>in all other rules</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in all other rules</td> * <td>Not allowed.</td> * </tr> - * <tr> - * <td><<</td> - * <td>in normal rule</td> - * <td>Divide the number by the rule's divisor and format the quotient</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;" rowspan="4"><<</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in normal rule</td> + * <td>Divide the number by the rule's divisor, perform floor() on the quotient, + * and format the resulting value.<br> + * If there is a DecimalFormat pattern between the < characters and the + * rule does NOT also contain a >> substitution, we DON'T perform + * floor() on the quotient. The quotient is passed through to the DecimalFormat + * intact. That is, for the value 1,900:<br> + * - "1/1000: << thousand;" will produce "one thousand"<br> + * - "1/1000: <0< thousand;" will produce "2 thousand" (NOT "1 thousand")<br> + * - "1/1000: <0< seconds >0> milliseconds;" will produce "1 second 900 milliseconds" + * </td> * </tr> * <tr> - * <td></td> - * <td>in negative-number rule</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in negative-number rule</td> * <td>Not allowed.</td> * </tr> * <tr> - * <td></td> - * <td>in fraction or default rule</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in fraction or default rule</td> * <td>Isolate the number's integral part and format it.</td> * </tr> * <tr> - * <td></td> - * <td>in rule in fraction rule set</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in rule in fraction rule set</td> * <td>Multiply the number by the rule's base value and format the result.</td> * </tr> - * <tr> - * <td>==</td> - * <td>in all rule sets</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;">==</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in all rule sets</td> * <td>Format the number unchanged</td> * </tr> - * <tr> - * <td>[]</td> - * <td>in normal rule</td> - * <td>Omit the optional text if the number is an even multiple of the rule's divisor</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;" rowspan="6">[]<br/>[|]</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in normal rule</td> + * <td> + * <ul> + * <li>When the number is not an even multiple of the rule's divisor, use the text and rules between the beginning square bracket, + * and the end square bracket or the | symbol.</li> + * <li>When the number is an even multiple of the rule's divisor, and no | symbol is used, omit the text.</li> + * <li>When the number is an even multiple of the rule's divisor, and | symbol is used, use the text and rules between the | symbol, + * and the end square bracket.</li> + * </ul> + * </td> * </tr> * <tr> - * <td></td> - * <td>in negative-number rule</td> - * <td>Not allowed.</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in improper-fraction rule</td> + * <td>This syntax is the same as specifying both an x.x rule and a 0.x rule. + * <ul> + * <li>When the number is not between 0 and 1, use the text and rules between the beginning square bracket, + * and the end square bracket or the | symbol.</li> + * <li>When the number is between 0 and 1, and no | symbol is used, omit the text.</li> + * <li>When the number is between 0 and 1, and | symbol is used, use the text and rules between the | symbol, + * and the end square bracket.</li> + * </ul> + * </td> * </tr> * <tr> - * <td></td> - * <td>in improper-fraction rule</td> - * <td>Omit the optional text if the number is between 0 and 1 (same as specifying both an - * x.x rule and a 0.x rule)</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in default rule</td> + * <td>This syntax is the same as specifying both an x.x rule and an x.0 rule. + * <ul> + * <li>When the number is not an integer, use the text and rules between the beginning square bracket, + * and the end square bracket or the | symbol.</li> + * <li>When the number is an integer, and no | symbol is used, omit the text.</li> + * <li>When the number is an integer, and | symbol is used, use the text and rules between the | symbol, + * and the end square bracket.</li> + * </ul> + * </td> * </tr> * <tr> - * <td></td> - * <td>in default rule</td> - * <td>Omit the optional text if the number is an integer (same as specifying both an x.x - * rule and an x.0 rule)</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in rule in fraction rule set</td> + * <td> + * <ul> + * <li>When multiplying the number by the rule's base value does not yield 1, use the text and rules between the beginning square bracket, + * and the end square bracket or the | symbol.</li> + * <li>When multiplying the number by the rule's base value yields 1, and no | symbol is used, omit the text.</li> + * <li>When multiplying the number by the rule's base value yields 1, and | symbol is used, use the text and rules between the | symbol, + * and the end square bracket.</li> + * </ul> + * </td> * </tr> * <tr> - * <td></td> - * <td>in proper-fraction rule</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in proper-fraction rule</td> * <td>Not allowed.</td> * </tr> * <tr> - * <td></td> - * <td>in rule in fraction rule set</td> - * <td>Omit the optional text if multiplying the number by the rule's base value yields 1.</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in negative-number rule</td> + * <td>Not allowed.</td> * </tr> - * <tr> - * <td width="37">$(cardinal,<i>plural syntax</i>)$</td> - * <td width="23"></td> - * <td width="165" valign="top">in all rule sets</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;">$(cardinal,<i>plural syntax</i>)$</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in all rule sets</td> * <td>This provides the ability to choose a word based on the number divided by the radix to the power of the * exponent of the base value for the specified locale, which is normally equivalent to the << value. - * This uses the cardinal plural rules from PluralFormat. All strings used in the plural format are treated + * This uses the cardinal plural rules from {@link PluralFormat}. All strings used in the plural format are treated * as the same base value for parsing.</td> * </tr> - * <tr> - * <td width="37">$(ordinal,<i>plural syntax</i>)$</td> - * <td width="23"></td> - * <td width="165" valign="top">in all rule sets</td> + * <tr style="border-top: 1px solid black;"> + * <td style="white-space: nowrap;">$(ordinal,<i>plural syntax</i>)$</td> + * <td style="white-space: nowrap; vertical-align: top; padding-left: 1em; padding-right: 1em;">in all rule sets</td> * <td>This provides the ability to choose a word based on the number divided by the radix to the power of the * exponent of the base value for the specified locale, which is normally equivalent to the << value. - * This uses the ordinal plural rules from PluralFormat. All strings used in the plural format are treated + * This uses the ordinal plural rules from {@link PluralFormat}. All strings used in the plural format are treated * as the same base value for parsing.</td> * </tr> * </table> @@ -513,22 +552,25 @@ enum URBNFRuleSetTag { * <p>The substitution descriptor (i.e., the text between the token characters) may take one * of three forms:</p> * - * <table border="0" width="100%"> + * <table style="border-collapse: collapse;"> * <tr> - * <td>a rule set name</td> + * <th>Descriptor</th> + * <th>Description</th> + * </tr> + * <tr> + * <td style="vertical-align: top;">a rule set name</td> * <td>Perform the mathematical operation on the number, and format the result using the * named rule set.</td> * </tr> - * <tr> - * <td>a DecimalFormat pattern</td> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">a DecimalFormat pattern</td> * <td>Perform the mathematical operation on the number, and format the result using a - * DecimalFormat with the specified pattern.  The pattern must begin with 0 or #.</td> + * DecimalFormat with the specified pattern. The pattern must begin with 0 or #.</td> * </tr> - * <tr> - * <td>nothing</td> + * <tr style="border-top: 1px solid black;"> + * <td style="vertical-align: top;">nothing</td> * <td>Perform the mathematical operation on the number, and format the result using the rule - * set containing the current rule, except: - * <ul> + * set containing the current rule, except:<ul> * <li>You can't have an empty substitution descriptor with a == substitution.</li> * <li>If you omit the substitution descriptor in a >> substitution in a fraction rule, * format the result one digit at a time using the rule set containing the current rule.</li> @@ -579,7 +621,7 @@ enum URBNFRuleSetTag { * @see PluralRules * @stable ICU 2.0 */ -class U_I18N_API RuleBasedNumberFormat : public NumberFormat { +class U_I18N_API_CLASS RuleBasedNumberFormat : public NumberFormat { public: //----------------------------------------------------------------------- @@ -596,7 +638,9 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param status The status indicating whether the constructor succeeded. * @stable ICU 3.2 */ - RuleBasedNumberFormat(const UnicodeString& rules, UParseError& perror, UErrorCode& status); + U_I18N_API RuleBasedNumberFormat(const UnicodeString& rules, + UParseError& perror, + UErrorCode& status); /** * Creates a RuleBasedNumberFormat that behaves according to the description @@ -621,26 +665,30 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param status The status indicating whether the constructor succeeded. * @stable ICU 3.2 */ - RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations, - UParseError& perror, UErrorCode& status); + U_I18N_API RuleBasedNumberFormat(const UnicodeString& rules, + const UnicodeString& localizations, + UParseError& perror, + UErrorCode& status); - /** - * Creates a RuleBasedNumberFormat that behaves according to the rules - * passed in. The formatter uses the specified locale to determine the - * characters to use when formatting numerals, and to define equivalences - * for lenient parsing. - * @param rules The formatter rules. - * See the class documentation for a complete explanation of the rule - * syntax. - * @param locale A locale that governs which characters are used for - * formatting values in numerals and which characters are equivalent in - * lenient parsing. - * @param perror The parse error if an error was encountered. - * @param status The status indicating whether the constructor succeeded. - * @stable ICU 2.0 - */ - RuleBasedNumberFormat(const UnicodeString& rules, const Locale& locale, - UParseError& perror, UErrorCode& status); + /** + * Creates a RuleBasedNumberFormat that behaves according to the rules + * passed in. The formatter uses the specified locale to determine the + * characters to use when formatting numerals, and to define equivalences + * for lenient parsing. + * @param rules The formatter rules. + * See the class documentation for a complete explanation of the rule + * syntax. + * @param locale A locale that governs which characters are used for + * formatting values in numerals and which characters are equivalent in + * lenient parsing. + * @param perror The parse error if an error was encountered. + * @param status The status indicating whether the constructor succeeded. + * @stable ICU 2.0 + */ + U_I18N_API RuleBasedNumberFormat(const UnicodeString& rules, + const Locale& locale, + UParseError& perror, + UErrorCode& status); /** * Creates a RuleBasedNumberFormat that behaves according to the description @@ -668,8 +716,11 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param status The status indicating whether the constructor succeeded. * @stable ICU 3.2 */ - RuleBasedNumberFormat(const UnicodeString& rules, const UnicodeString& localizations, - const Locale& locale, UParseError& perror, UErrorCode& status); + U_I18N_API RuleBasedNumberFormat(const UnicodeString& rules, + const UnicodeString& localizations, + const Locale& locale, + UParseError& perror, + UErrorCode& status); /** * Creates a RuleBasedNumberFormat from a predefined ruleset. The selector @@ -689,7 +740,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param status The status indicating whether the constructor succeeded. * @stable ICU 2.0 */ - RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status); + U_I18N_API RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& locale, UErrorCode& status); //----------------------------------------------------------------------- // boilerplate @@ -700,20 +751,20 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param rhs the object to be copied from. * @stable ICU 2.6 */ - RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs); + U_I18N_API RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs); /** * Assignment operator * @param rhs the object to be copied from. * @stable ICU 2.6 */ - RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs); + U_I18N_API RuleBasedNumberFormat& operator=(const RuleBasedNumberFormat& rhs); /** * Release memory allocated for a RuleBasedNumberFormat when you are finished with it. * @stable ICU 2.6 */ - virtual ~RuleBasedNumberFormat(); + U_I18N_API virtual ~RuleBasedNumberFormat(); /** * Clone this object polymorphically. The caller is responsible @@ -721,7 +772,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A copy of the object. * @stable ICU 2.6 */ - virtual RuleBasedNumberFormat* clone() const override; + U_I18N_API virtual RuleBasedNumberFormat* clone() const override; /** * Return true if the given Format objects are semantically equal. @@ -730,7 +781,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return true if the given Format objects are semantically equal. * @stable ICU 2.6 */ - virtual bool operator==(const Format& other) const override; + U_I18N_API virtual bool operator==(const Format& other) const override; //----------------------------------------------------------------------- // public API functions @@ -741,14 +792,14 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return the result String that was passed in * @stable ICU 2.0 */ - virtual UnicodeString getRules() const; + U_I18N_API virtual UnicodeString getRules() const; /** * Return the number of public rule set names. * @return the number of public rule set names. * @stable ICU 2.0 */ - virtual int32_t getNumberOfRuleSetNames() const; + U_I18N_API virtual int32_t getNumberOfRuleSetNames() const; /** * Return the name of the index'th public ruleSet. If index is not valid, @@ -757,14 +808,14 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return the name of the index'th public ruleSet. * @stable ICU 2.0 */ - virtual UnicodeString getRuleSetName(int32_t index) const; + U_I18N_API virtual UnicodeString getRuleSetName(int32_t index) const; /** * Return the number of locales for which we have localized rule set display names. * @return the number of locales for which we have localized rule set display names. * @stable ICU 3.2 */ - virtual int32_t getNumberOfRuleSetDisplayNameLocales(void) const; + U_I18N_API virtual int32_t getNumberOfRuleSetDisplayNameLocales() const; /** * Return the index'th display name locale. @@ -774,7 +825,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @see #getNumberOfRuleSetDisplayNameLocales * @stable ICU 3.2 */ - virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const; + U_I18N_API virtual Locale getRuleSetDisplayNameLocale(int32_t index, UErrorCode& status) const; /** * Return the rule set display names for the provided locale. These are in the same order @@ -789,8 +840,8 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @see #getRuleSetName * @stable ICU 3.2 */ - virtual UnicodeString getRuleSetDisplayName(int32_t index, - const Locale& locale = Locale::getDefault()); + U_I18N_API virtual UnicodeString getRuleSetDisplayName(int32_t index, + const Locale& locale = Locale::getDefault()); /** * Return the rule set display name for the provided rule set and locale. @@ -800,8 +851,8 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @stable ICU 3.2 * @see #getRuleSetDisplayName */ - virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName, - const Locale& locale = Locale::getDefault()); + U_I18N_API virtual UnicodeString getRuleSetDisplayName(const UnicodeString& ruleSetName, + const Locale& locale = Locale::getDefault()); using NumberFormat::format; @@ -814,9 +865,9 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.0 */ - virtual UnicodeString& format(int32_t number, - UnicodeString& toAppendTo, - FieldPosition& pos) const override; + U_I18N_API virtual UnicodeString& format(int32_t number, + UnicodeString& toAppendTo, + FieldPosition& pos) const override; /** * Formats the specified 64-bit number using the default ruleset. @@ -826,9 +877,9 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.1 */ - virtual UnicodeString& format(int64_t number, - UnicodeString& toAppendTo, - FieldPosition& pos) const override; + U_I18N_API virtual UnicodeString& format(int64_t number, + UnicodeString& toAppendTo, + FieldPosition& pos) const override; /** * Formats the specified number using the default ruleset. * @param number The number to format. @@ -837,9 +888,9 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.0 */ - virtual UnicodeString& format(double number, - UnicodeString& toAppendTo, - FieldPosition& pos) const override; + U_I18N_API virtual UnicodeString& format(double number, + UnicodeString& toAppendTo, + FieldPosition& pos) const override; /** * Formats the specified number using the named ruleset. @@ -852,11 +903,11 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.0 */ - virtual UnicodeString& format(int32_t number, - const UnicodeString& ruleSetName, - UnicodeString& toAppendTo, - FieldPosition& pos, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& format(int32_t number, + const UnicodeString& ruleSetName, + UnicodeString& toAppendTo, + FieldPosition& pos, + UErrorCode& status) const; /** * Formats the specified 64-bit number using the named ruleset. * @param number The number to format. @@ -868,11 +919,11 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.1 */ - virtual UnicodeString& format(int64_t number, - const UnicodeString& ruleSetName, - UnicodeString& toAppendTo, - FieldPosition& pos, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& format(int64_t number, + const UnicodeString& ruleSetName, + UnicodeString& toAppendTo, + FieldPosition& pos, + UErrorCode& status) const; /** * Formats the specified number using the named ruleset. * @param number The number to format. @@ -884,11 +935,11 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return A textual representation of the number. * @stable ICU 2.0 */ - virtual UnicodeString& format(double number, - const UnicodeString& ruleSetName, - UnicodeString& toAppendTo, - FieldPosition& pos, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& format(double number, + const UnicodeString& ruleSetName, + UnicodeString& toAppendTo, + FieldPosition& pos, + UErrorCode& status) const; protected: /** @@ -930,9 +981,9 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @see #setLenient * @stable ICU 2.0 */ - virtual void parse(const UnicodeString& text, - Formattable& result, - ParsePosition& parsePosition) const override; + U_I18N_API virtual void parse(const UnicodeString& text, + Formattable& result, + ParsePosition& parsePosition) const override; #if !UCONFIG_NO_COLLATION @@ -969,7 +1020,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @see RuleBasedCollator * @stable ICU 2.0 */ - virtual void setLenient(UBool enabled) override; + U_I18N_API virtual void setLenient(UBool enabled) override; /** * Returns true if lenient-parse mode is turned on. Lenient parsing is off @@ -978,7 +1029,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @see #setLenient * @stable ICU 2.0 */ - virtual inline UBool isLenient(void) const override; + U_I18N_API virtual inline UBool isLenient() const override; #endif @@ -990,7 +1041,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param status set to failure code when a problem occurs. * @stable ICU 2.6 */ - virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status); + U_I18N_API virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status); /** * Return the name of the current default rule set. If the current rule set is @@ -998,7 +1049,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @return the name of the current default rule set * @stable ICU 3.0 */ - virtual UnicodeString getDefaultRuleSetName() const; + U_I18N_API virtual UnicodeString getDefaultRuleSetName() const; /** * Set a particular UDisplayContext value in the formatter, such as @@ -1010,21 +1061,21 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * updated with any new status from the function. * @stable ICU 53 */ - virtual void setContext(UDisplayContext value, UErrorCode& status) override; + U_I18N_API virtual void setContext(UDisplayContext value, UErrorCode& status) override; /** * Get the rounding mode. * @return A rounding mode * @stable ICU 60 */ - virtual ERoundingMode getRoundingMode(void) const override; + U_I18N_API virtual ERoundingMode getRoundingMode() const override; /** * Set the rounding mode. * @param roundingMode A rounding mode * @stable ICU 60 */ - virtual void setRoundingMode(ERoundingMode roundingMode) override; + U_I18N_API virtual void setRoundingMode(ERoundingMode roundingMode) override; public: /** @@ -1032,14 +1083,14 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * * @stable ICU 2.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @stable ICU 2.8 */ - virtual UClassID getDynamicClassID(void) const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * Sets the decimal format symbols, which is generally not changed @@ -1049,7 +1100,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param symbolsToAdopt DecimalFormatSymbols to be adopted. * @stable ICU 49 */ - virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); + U_I18N_API virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); /** * Sets the decimal format symbols, which is generally not changed @@ -1060,7 +1111,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { * @param symbols DecimalFormatSymbols. * @stable ICU 49 */ - virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); + U_I18N_API virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); private: RuleBasedNumberFormat() = delete; // default constructor not implemented @@ -1122,7 +1173,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { #if !UCONFIG_NO_COLLATION inline UBool -RuleBasedNumberFormat::isLenient(void) const { +RuleBasedNumberFormat::isLenient() const { return lenient; } diff --git a/deps/icu-small/source/i18n/unicode/rbtz.h b/deps/icu-small/source/i18n/unicode/rbtz.h index 1cc3483ebf2191..3393b3d97a9115 100644 --- a/deps/icu-small/source/i18n/unicode/rbtz.h +++ b/deps/icu-small/source/i18n/unicode/rbtz.h @@ -217,7 +217,7 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { * @return The TimeZone's raw GMT offset. * @stable ICU 3.8 */ - virtual int32_t getRawOffset(void) const override; + virtual int32_t getRawOffset() const override; /** * Queries if this time zone uses daylight savings time. @@ -225,7 +225,7 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { * false, otherwise. * @stable ICU 3.8 */ - virtual UBool useDaylightTime(void) const override; + virtual UBool useDaylightTime() const override; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -313,8 +313,8 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override; private: - void deleteRules(void); - void deleteTransitions(void); + void deleteRules(); + void deleteTransitions(); UVector* copyRules(UVector* source); TimeZoneRule* findRuleInFinal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const; @@ -346,7 +346,7 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -359,7 +359,7 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/regex.h b/deps/icu-small/source/i18n/unicode/regex.h index cc2f9249295ee0..9cb34fd02f225e 100644 --- a/deps/icu-small/source/i18n/unicode/regex.h +++ b/deps/icu-small/source/i18n/unicode/regex.h @@ -145,7 +145,7 @@ class U_I18N_API RegexPattern final : public UObject { * @return the copy of this RegexPattern * @stable ICU 2.4 */ - virtual RegexPattern *clone() const; + RegexPattern *clone() const; /** @@ -325,7 +325,7 @@ class U_I18N_API RegexPattern final : public UObject { * @return the #URegexpFlag match mode flags * @stable ICU 2.4 */ - virtual uint32_t flags() const; + uint32_t flags() const; /** * Creates a RegexMatcher that will match the given input against this pattern. The @@ -344,7 +344,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 2.4 */ - virtual RegexMatcher *matcher(const UnicodeString &input, + RegexMatcher *matcher(const UnicodeString &input, UErrorCode &status) const; private: @@ -376,7 +376,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 2.6 */ - virtual RegexMatcher *matcher(UErrorCode &status) const; + RegexMatcher *matcher(UErrorCode &status) const; /** @@ -425,7 +425,7 @@ class U_I18N_API RegexPattern final : public UObject { * the returned string may no longer reflect the RegexPattern object. * @stable ICU 2.4 */ - virtual UnicodeString pattern() const; + UnicodeString pattern() const; /** @@ -438,7 +438,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 4.6 */ - virtual UText *patternText(UErrorCode &status) const; + UText *patternText(UErrorCode &status) const; /** @@ -454,7 +454,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 55 */ - virtual int32_t groupNumberFromName(const UnicodeString &groupName, UErrorCode &status) const; + int32_t groupNumberFromName(const UnicodeString &groupName, UErrorCode &status) const; /** @@ -473,7 +473,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 55 */ - virtual int32_t groupNumberFromName(const char *groupName, int32_t nameLength, UErrorCode &status) const; + int32_t groupNumberFromName(const char *groupName, int32_t nameLength, UErrorCode &status) const; /** @@ -514,7 +514,7 @@ class U_I18N_API RegexPattern final : public UObject { * @return The number of fields into which the input string was split. * @stable ICU 2.4 */ - virtual int32_t split(const UnicodeString &input, + int32_t split(const UnicodeString &input, UnicodeString dest[], int32_t destCapacity, UErrorCode &status) const; @@ -558,7 +558,7 @@ class U_I18N_API RegexPattern final : public UObject { * * @stable ICU 4.6 */ - virtual int32_t split(UText *input, + int32_t split(UText *input, UText *dest[], int32_t destCapacity, UErrorCode &status) const; @@ -767,7 +767,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if there is a match * @stable ICU 2.4 */ - virtual UBool matches(UErrorCode &status); + UBool matches(UErrorCode &status); /** @@ -780,7 +780,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if there is a match * @stable ICU 2.8 */ - virtual UBool matches(int64_t startIndex, UErrorCode &status); + UBool matches(int64_t startIndex, UErrorCode &status); /** @@ -796,7 +796,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if there is a match at the start of the input string. * @stable ICU 2.4 */ - virtual UBool lookingAt(UErrorCode &status); + UBool lookingAt(UErrorCode &status); /** @@ -812,7 +812,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if there is a match. * @stable ICU 2.8 */ - virtual UBool lookingAt(int64_t startIndex, UErrorCode &status); + UBool lookingAt(int64_t startIndex, UErrorCode &status); /** @@ -827,7 +827,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if a match is found. * @stable ICU 2.4 */ - virtual UBool find(); + UBool find(); /** @@ -844,7 +844,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if a match is found. * @stable ICU 55 */ - virtual UBool find(UErrorCode &status); + UBool find(UErrorCode &status); /** * Resets this RegexMatcher and then attempts to find the next substring of the @@ -855,7 +855,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if a match is found. * @stable ICU 2.4 */ - virtual UBool find(int64_t start, UErrorCode &status); + UBool find(int64_t start, UErrorCode &status); /** @@ -867,7 +867,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return a string containing the matched input text. * @stable ICU 2.4 */ - virtual UnicodeString group(UErrorCode &status) const; + UnicodeString group(UErrorCode &status) const; /** @@ -887,14 +887,14 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the captured text * @stable ICU 2.4 */ - virtual UnicodeString group(int32_t groupNum, UErrorCode &status) const; + UnicodeString group(int32_t groupNum, UErrorCode &status) const; /** * Returns the number of capturing groups in this matcher's pattern. * @return the number of capture groups * @stable ICU 2.4 */ - virtual int32_t groupCount() const; + int32_t groupCount() const; /** @@ -911,7 +911,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *group(UText *dest, int64_t &group_len, UErrorCode &status) const; + UText *group(UText *dest, int64_t &group_len, UErrorCode &status) const; /** * Returns a shallow clone of the entire live input string with the UText current native index @@ -933,7 +933,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *group(int32_t groupNum, UText *dest, int64_t &group_len, UErrorCode &status) const; + UText *group(int32_t groupNum, UText *dest, int64_t &group_len, UErrorCode &status) const; /** * Returns the index in the input string of the start of the text matched @@ -942,7 +942,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The (native) position in the input string of the start of the last match. * @stable ICU 2.4 */ - virtual int32_t start(UErrorCode &status) const; + int32_t start(UErrorCode &status) const; /** * Returns the index in the input string of the start of the text matched @@ -951,7 +951,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The (native) position in the input string of the start of the last match. * @stable ICU 4.6 */ - virtual int64_t start64(UErrorCode &status) const; + int64_t start64(UErrorCode &status) const; /** @@ -967,7 +967,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the (native) start position of substring matched by the specified group. * @stable ICU 2.4 */ - virtual int32_t start(int32_t group, UErrorCode &status) const; + int32_t start(int32_t group, UErrorCode &status) const; /** * Returns the index in the input string of the start of the text matched by the @@ -982,7 +982,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the (native) start position of substring matched by the specified group. * @stable ICU 4.6 */ - virtual int64_t start64(int32_t group, UErrorCode &status) const; + int64_t start64(int32_t group, UErrorCode &status) const; /** * Returns the index in the input string of the first character following the @@ -997,7 +997,7 @@ class U_I18N_API RegexMatcher final : public UObject { * a byte index for UTF-8. * @stable ICU 2.4 */ - virtual int32_t end(UErrorCode &status) const; + int32_t end(UErrorCode &status) const; /** * Returns the index in the input string of the first character following the @@ -1012,7 +1012,7 @@ class U_I18N_API RegexMatcher final : public UObject { * a byte index for UTF-8. * @stable ICU 4.6 */ - virtual int64_t end64(UErrorCode &status) const; + int64_t end64(UErrorCode &status) const; /** @@ -1032,7 +1032,7 @@ class U_I18N_API RegexMatcher final : public UObject { * a byte index for UTF8. * @stable ICU 2.4 */ - virtual int32_t end(int32_t group, UErrorCode &status) const; + int32_t end(int32_t group, UErrorCode &status) const; /** * Returns the index in the input string of the character following the @@ -1051,7 +1051,7 @@ class U_I18N_API RegexMatcher final : public UObject { * a byte index for UTF8. * @stable ICU 4.6 */ - virtual int64_t end64(int32_t group, UErrorCode &status) const; + int64_t end64(int32_t group, UErrorCode &status) const; /** * Resets this matcher. The effect is to remove any memory of previous matches, @@ -1061,7 +1061,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return this RegexMatcher. * @stable ICU 2.4 */ - virtual RegexMatcher &reset(); + RegexMatcher &reset(); /** @@ -1079,7 +1079,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return this RegexMatcher. * @stable ICU 2.8 */ - virtual RegexMatcher &reset(int64_t index, UErrorCode &status); + RegexMatcher &reset(int64_t index, UErrorCode &status); /** @@ -1099,7 +1099,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return this RegexMatcher. * @stable ICU 2.4 */ - virtual RegexMatcher &reset(const UnicodeString &input); + RegexMatcher &reset(const UnicodeString &input); /** @@ -1115,7 +1115,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual RegexMatcher &reset(UText *input); + RegexMatcher &reset(UText *input); /** @@ -1142,7 +1142,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.8 */ - virtual RegexMatcher &refreshInputText(UText *input, UErrorCode &status); + RegexMatcher &refreshInputText(UText *input, UErrorCode &status); private: /** @@ -1167,7 +1167,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the input string * @stable ICU 2.4 */ - virtual const UnicodeString &input() const; + const UnicodeString &input() const; /** * Returns the input string being matched. This is the live input text; it should not be @@ -1177,7 +1177,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *inputText() const; + UText *inputText() const; /** * Returns the input string being matched, either by copying it into the provided @@ -1189,7 +1189,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *getInput(UText *dest, UErrorCode &status) const; + UText *getInput(UText *dest, UErrorCode &status) const; /** Sets the limits of this matcher's region. @@ -1210,7 +1210,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.0 */ - virtual RegexMatcher ®ion(int64_t start, int64_t limit, UErrorCode &status); + RegexMatcher ®ion(int64_t start, int64_t limit, UErrorCode &status); /** * Identical to region(start, limit, status) but also allows a start position without @@ -1223,7 +1223,7 @@ class U_I18N_API RegexMatcher final : public UObject { * U_INDEX_OUTOFBOUNDS_ERROR is returned. * @stable ICU 4.6 */ - virtual RegexMatcher ®ion(int64_t regionStart, int64_t regionLimit, int64_t startIndex, UErrorCode &status); + RegexMatcher ®ion(int64_t regionStart, int64_t regionLimit, int64_t startIndex, UErrorCode &status); /** * Reports the start index of this matcher's region. The searches this matcher @@ -1233,7 +1233,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The starting (native) index of this matcher's region. * @stable ICU 4.0 */ - virtual int32_t regionStart() const; + int32_t regionStart() const; /** * Reports the start index of this matcher's region. The searches this matcher @@ -1243,7 +1243,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The starting (native) index of this matcher's region. * @stable ICU 4.6 */ - virtual int64_t regionStart64() const; + int64_t regionStart64() const; /** @@ -1254,7 +1254,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The ending point (native) of this matcher's region. * @stable ICU 4.0 */ - virtual int32_t regionEnd() const; + int32_t regionEnd() const; /** * Reports the end (limit) index (exclusive) of this matcher's region. The searches @@ -1264,7 +1264,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The ending point (native) of this matcher's region. * @stable ICU 4.6 */ - virtual int64_t regionEnd64() const; + int64_t regionEnd64() const; /** * Queries the transparency of region bounds for this matcher. @@ -1274,7 +1274,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if this matcher is using opaque bounds, false if it is not. * @stable ICU 4.0 */ - virtual UBool hasTransparentBounds() const; + UBool hasTransparentBounds() const; /** * Sets the transparency of region bounds for this matcher. @@ -1294,7 +1294,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return This Matcher; * @stable ICU 4.0 **/ - virtual RegexMatcher &useTransparentBounds(UBool b); + RegexMatcher &useTransparentBounds(UBool b); /** @@ -1304,7 +1304,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if this matcher is using anchoring bounds. * @stable ICU 4.0 */ - virtual UBool hasAnchoringBounds() const; + UBool hasAnchoringBounds() const; /** @@ -1319,7 +1319,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return This Matcher * @stable ICU 4.0 */ - virtual RegexMatcher &useAnchoringBounds(UBool b); + RegexMatcher &useAnchoringBounds(UBool b); /** @@ -1334,7 +1334,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if the most recent match hit the end of input * @stable ICU 4.0 */ - virtual UBool hitEnd() const; + UBool hitEnd() const; /** * Return true the most recent match succeeded and additional input could cause @@ -1345,7 +1345,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return true if more input could cause the most recent match to no longer match. * @stable ICU 4.0 */ - virtual UBool requireEnd() const; + UBool requireEnd() const; /** @@ -1353,7 +1353,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the RegexPattern for this RegexMatcher * @stable ICU 2.4 */ - virtual const RegexPattern &pattern() const; + const RegexPattern &pattern() const; /** @@ -1372,7 +1372,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return a string containing the results of the find and replace. * @stable ICU 2.4 */ - virtual UnicodeString replaceAll(const UnicodeString &replacement, UErrorCode &status); + UnicodeString replaceAll(const UnicodeString &replacement, UErrorCode &status); /** @@ -1395,7 +1395,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *replaceAll(UText *replacement, UText *dest, UErrorCode &status); + UText *replaceAll(UText *replacement, UText *dest, UErrorCode &status); /** @@ -1418,7 +1418,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return a string containing the results of the find and replace. * @stable ICU 2.4 */ - virtual UnicodeString replaceFirst(const UnicodeString &replacement, UErrorCode &status); + UnicodeString replaceFirst(const UnicodeString &replacement, UErrorCode &status); /** @@ -1445,7 +1445,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *replaceFirst(UText *replacement, UText *dest, UErrorCode &status); + UText *replaceFirst(UText *replacement, UText *dest, UErrorCode &status); /** @@ -1475,7 +1475,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @stable ICU 2.4 * */ - virtual RegexMatcher &appendReplacement(UnicodeString &dest, + RegexMatcher &appendReplacement(UnicodeString &dest, const UnicodeString &replacement, UErrorCode &status); @@ -1506,7 +1506,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual RegexMatcher &appendReplacement(UText *dest, + RegexMatcher &appendReplacement(UText *dest, UText *replacement, UErrorCode &status); @@ -1520,7 +1520,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the destination string. * @stable ICU 2.4 */ - virtual UnicodeString &appendTail(UnicodeString &dest); + UnicodeString &appendTail(UnicodeString &dest); /** @@ -1536,7 +1536,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual UText *appendTail(UText *dest, UErrorCode &status); + UText *appendTail(UText *dest, UErrorCode &status); /** @@ -1562,7 +1562,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return The number of fields into which the input string was split. * @stable ICU 2.6 */ - virtual int32_t split(const UnicodeString &input, + int32_t split(const UnicodeString &input, UnicodeString dest[], int32_t destCapacity, UErrorCode &status); @@ -1591,7 +1591,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.6 */ - virtual int32_t split(UText *input, + int32_t split(UText *input, UText *dest[], int32_t destCapacity, UErrorCode &status); @@ -1617,7 +1617,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.0 */ - virtual void setTimeLimit(int32_t limit, UErrorCode &status); + void setTimeLimit(int32_t limit, UErrorCode &status); /** * Get the time limit, if any, for match operations made with this Matcher. @@ -1625,7 +1625,7 @@ class U_I18N_API RegexMatcher final : public UObject { * @return the maximum allowed time for a match, in units of processing steps. * @stable ICU 4.0 */ - virtual int32_t getTimeLimit() const; + int32_t getTimeLimit() const; /** * Set the amount of heap storage available for use by the match backtracking stack. @@ -1648,7 +1648,7 @@ class U_I18N_API RegexMatcher final : public UObject { * * @stable ICU 4.0 */ - virtual void setStackLimit(int32_t limit, UErrorCode &status); + void setStackLimit(int32_t limit, UErrorCode &status); /** * Get the size of the heap storage available for use by the back tracking stack. @@ -1657,7 +1657,7 @@ class U_I18N_API RegexMatcher final : public UObject { * stack size is unlimited. * @stable ICU 4.0 */ - virtual int32_t getStackLimit() const; + int32_t getStackLimit() const; /** @@ -1673,9 +1673,9 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.0 */ - virtual void setMatchCallback(URegexMatchCallback *callback, - const void *context, - UErrorCode &status); + void setMatchCallback(URegexMatchCallback *callback, + const void *context, + UErrorCode &status); /** @@ -1688,9 +1688,9 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.0 */ - virtual void getMatchCallback(URegexMatchCallback *&callback, - const void *&context, - UErrorCode &status); + void getMatchCallback(URegexMatchCallback *&callback, + const void *&context, + UErrorCode &status); /** @@ -1706,9 +1706,9 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.6 */ - virtual void setFindProgressCallback(URegexFindProgressCallback *callback, - const void *context, - UErrorCode &status); + void setFindProgressCallback(URegexFindProgressCallback *callback, + const void *context, + UErrorCode &status); /** @@ -1721,9 +1721,9 @@ class U_I18N_API RegexMatcher final : public UObject { * @param status A reference to a UErrorCode to receive any errors. * @stable ICU 4.6 */ - virtual void getFindProgressCallback(URegexFindProgressCallback *&callback, - const void *&context, - UErrorCode &status); + void getFindProgressCallback(URegexFindProgressCallback *&callback, + const void *&context, + UErrorCode &status); #ifndef U_HIDE_INTERNAL_API /** diff --git a/deps/icu-small/source/i18n/unicode/reldatefmt.h b/deps/icu-small/source/i18n/unicode/reldatefmt.h index 5dc4905b12a825..60e312e8a74760 100644 --- a/deps/icu-small/source/i18n/unicode/reldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/reldatefmt.h @@ -384,27 +384,29 @@ class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedVal * </pre> * </blockquote> * <p> - * In the future, we may add more forms, such as abbreviated/short forms - * (3 secs ago), and relative day periods ("yesterday afternoon"), etc. + * The UDateRelativeDateTimeFormatterStyle parameter allows selection of + * different length styles: LONG ("3 seconds ago"), SHORT ("3 sec. ago"), + * NARROW ("3s ago"). In the future, we may add more forms, such as + * relative day periods ("yesterday afternoon"), etc. * * The RelativeDateTimeFormatter class is not intended for public subclassing. * * @stable ICU 53 */ -class U_I18N_API RelativeDateTimeFormatter : public UObject { +class U_I18N_API_CLASS RelativeDateTimeFormatter : public UObject { public: /** * Create RelativeDateTimeFormatter with default locale. * @stable ICU 53 */ - RelativeDateTimeFormatter(UErrorCode& status); + U_I18N_API RelativeDateTimeFormatter(UErrorCode& status); /** * Create RelativeDateTimeFormatter with given locale. * @stable ICU 53 */ - RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status); + U_I18N_API RelativeDateTimeFormatter(const Locale& locale, UErrorCode& status); /** * Create RelativeDateTimeFormatter with given locale and NumberFormat. @@ -416,7 +418,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @param status Any error is returned here. * @stable ICU 53 */ - RelativeDateTimeFormatter( + U_I18N_API RelativeDateTimeFormatter( const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status); /** @@ -434,7 +436,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @param status Any error is returned here. * @stable ICU 54 */ - RelativeDateTimeFormatter( + U_I18N_API RelativeDateTimeFormatter( const Locale& locale, NumberFormat *nfToAdopt, UDateRelativeDateTimeFormatterStyle style, @@ -445,20 +447,20 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * Copy constructor. * @stable ICU 53 */ - RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other); + U_I18N_API RelativeDateTimeFormatter(const RelativeDateTimeFormatter& other); /** * Assignment operator. * @stable ICU 53 */ - RelativeDateTimeFormatter& operator=( + U_I18N_API RelativeDateTimeFormatter& operator=( const RelativeDateTimeFormatter& other); /** * Destructor. * @stable ICU 53 */ - virtual ~RelativeDateTimeFormatter(); + U_I18N_API virtual ~RelativeDateTimeFormatter(); /** * Formats a relative date with a quantity such as "in 5 days" or @@ -479,7 +481,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return appendTo * @stable ICU 53 */ - UnicodeString& format( + U_I18N_API UnicodeString& format( double quantity, UDateDirection direction, UDateRelativeUnit unit, @@ -503,7 +505,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return The formatted relative datetime * @stable ICU 64 */ - FormattedRelativeDateTime formatToValue( + U_I18N_API FormattedRelativeDateTime formatToValue( double quantity, UDateDirection direction, UDateRelativeUnit unit, @@ -525,7 +527,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return appendTo * @stable ICU 53 */ - UnicodeString& format( + U_I18N_API UnicodeString& format( UDateDirection direction, UDateAbsoluteUnit unit, UnicodeString& appendTo, @@ -546,7 +548,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return The formatted relative datetime * @stable ICU 64 */ - FormattedRelativeDateTime formatToValue( + U_I18N_API FormattedRelativeDateTime formatToValue( UDateDirection direction, UDateAbsoluteUnit unit, UErrorCode& status) const; @@ -571,7 +573,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return appendTo * @stable ICU 57 */ - UnicodeString& formatNumeric( + U_I18N_API UnicodeString& formatNumeric( double offset, URelativeDateTimeUnit unit, UnicodeString& appendTo, @@ -595,7 +597,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return The formatted relative datetime * @stable ICU 64 */ - FormattedRelativeDateTime formatNumericToValue( + U_I18N_API FormattedRelativeDateTime formatNumericToValue( double offset, URelativeDateTimeUnit unit, UErrorCode& status) const; @@ -620,7 +622,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return appendTo * @stable ICU 57 */ - UnicodeString& format( + U_I18N_API UnicodeString& format( double offset, URelativeDateTimeUnit unit, UnicodeString& appendTo, @@ -644,7 +646,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return The formatted relative datetime * @stable ICU 64 */ - FormattedRelativeDateTime formatToValue( + U_I18N_API FormattedRelativeDateTime formatToValue( double offset, URelativeDateTimeUnit unit, UErrorCode& status) const; @@ -661,7 +663,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * @return appendTo * @stable ICU 53 */ - UnicodeString& combineDateAndTime( + U_I18N_API UnicodeString& combineDateAndTime( const UnicodeString& relativeDateString, const UnicodeString& timeString, UnicodeString& appendTo, @@ -672,21 +674,21 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * * @stable ICU 53 */ - const NumberFormat& getNumberFormat() const; + U_I18N_API const NumberFormat& getNumberFormat() const; /** * Returns the capitalization context. * * @stable ICU 54 */ - UDisplayContext getCapitalizationContext() const; + U_I18N_API UDisplayContext getCapitalizationContext() const; /** * Returns the format style. * * @stable ICU 54 */ - UDateRelativeDateTimeFormatterStyle getFormatStyle() const; + U_I18N_API UDateRelativeDateTimeFormatterStyle getFormatStyle() const; private: const RelativeDateTimeCacheData* fCache; diff --git a/deps/icu-small/source/i18n/unicode/search.h b/deps/icu-small/source/i18n/unicode/search.h index a8004efc43116e..d4fd9ce93bd469 100644 --- a/deps/icu-small/source/i18n/unicode/search.h +++ b/deps/icu-small/source/i18n/unicode/search.h @@ -124,7 +124,7 @@ class U_I18N_API SearchIterator : public UObject { * @return current index in the text being searched. * @stable ICU 2.0 */ - virtual int32_t getOffset(void) const = 0; + virtual int32_t getOffset() const = 0; /** * Sets the text searching attributes located in the enum @@ -163,7 +163,7 @@ class U_I18N_API SearchIterator : public UObject { * @see #last * @stable ICU 2.0 */ - int32_t getMatchedStart(void) const; + int32_t getMatchedStart() const; /** * Returns the length of text in the string which matches the search @@ -179,8 +179,8 @@ class U_I18N_API SearchIterator : public UObject { * @see #last * @stable ICU 2.0 */ - int32_t getMatchedLength(void) const; - + int32_t getMatchedLength() const; + /** * Returns the text that was matched by the most recent call to * <tt>first</tt>, <tt>next</tt>, <tt>previous</tt>, or <tt>last</tt>. @@ -224,7 +224,7 @@ class U_I18N_API SearchIterator : public UObject { * @see #setBreakIterator * @stable ICU 2.0 */ - const BreakIterator * getBreakIterator(void) const; + const BreakIterator* getBreakIterator() const; /** * Set the string text to be searched. Text iteration will hence begin at @@ -260,7 +260,7 @@ class U_I18N_API SearchIterator : public UObject { * @return text string to be searched. * @stable ICU 2.0 */ - const UnicodeString & getText(void) const; + const UnicodeString& getText() const; // operator overloading ---------------------------------------------- @@ -291,7 +291,7 @@ class U_I18N_API SearchIterator : public UObject { * @return cloned object * @stable ICU 2.0 */ - virtual SearchIterator* safeClone(void) const = 0; + virtual SearchIterator* safeClone() const = 0; /** * Returns the first index at which the string text matches the search diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h index 180238031277f0..ead51454844651 100644 --- a/deps/icu-small/source/i18n/unicode/selfmt.h +++ b/deps/icu-small/source/i18n/unicode/selfmt.h @@ -337,7 +337,7 @@ class U_I18N_API SelectFormat : public Format { * ICU "poor man's RTTI", returns a UClassID for this class. * @stable ICU 4.4 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. diff --git a/deps/icu-small/source/i18n/unicode/simplenumberformatter.h b/deps/icu-small/source/i18n/unicode/simplenumberformatter.h index 32b79a94da403a..83fa8a8b1c92ca 100644 --- a/deps/icu-small/source/i18n/unicode/simplenumberformatter.h +++ b/deps/icu-small/source/i18n/unicode/simplenumberformatter.h @@ -30,6 +30,8 @@ U_NAMESPACE_BEGIN +/* forward declaration */ +class SimpleDateFormat; namespace number { // icu::number @@ -41,22 +43,19 @@ class AdoptingSignumModifierStore; } // icu::number::impl -#ifndef U_HIDE_DRAFT_API - - /** * An input type for SimpleNumberFormatter. * * This class is mutable and not intended for public subclassing. This class is movable but not copyable. * - * @draft ICU 73 + * @stable ICU 73 */ class U_I18N_API SimpleNumber : public UMemory { public: /** * Creates a SimpleNumber for an integer. * - * @draft ICU 73 + * @stable ICU 73 */ static SimpleNumber forInt64(int64_t value, UErrorCode& status); @@ -65,43 +64,38 @@ class U_I18N_API SimpleNumber : public UMemory { * * This function immediately mutates the inner value. * - * @draft ICU 73 + * @stable ICU 73 */ void multiplyByPowerOfTen(int32_t power, UErrorCode& status); /** - * Rounds the value currently stored in the SimpleNumber to the given power of 10. + * Rounds the value currently stored in the SimpleNumber to the given power of 10, + * which can be before or after the decimal separator. * - * This function immediately mutates the inner value. + * This function does not change minimum integer digits. * - * @draft ICU 73 + * @stable ICU 73 */ void roundTo(int32_t power, UNumberFormatRoundingMode roundingMode, UErrorCode& status); /** - * Truncates the most significant digits to the given maximum number of integer digits. - * - * This function immediately mutates the inner value. + * Sets the number of integer digits to the given amount, truncating if necessary. * - * @draft ICU 73 + * @stable ICU 75 */ - void truncateStart(uint32_t maximumIntegerDigits, UErrorCode& status); + void setMaximumIntegerDigits(uint32_t maximumIntegerDigits, UErrorCode& status); /** * Pads the beginning of the number with zeros up to the given minimum number of integer digits. * - * This setting is applied upon formatting the number. - * - * @draft ICU 73 + * @stable ICU 73 */ void setMinimumIntegerDigits(uint32_t minimumIntegerDigits, UErrorCode& status); /** * Pads the end of the number with zeros up to the given minimum number of fraction digits. * - * This setting is applied upon formatting the number. - * - * @draft ICU 73 + * @stable ICU 73 */ void setMinimumFractionDigits(uint32_t minimumFractionDigits, UErrorCode& status); @@ -112,7 +106,7 @@ class U_I18N_API SimpleNumber : public UMemory { * * NOTE: This does not support accounting sign notation. * - * @draft ICU 73 + * @stable ICU 73 */ void setSign(USimpleNumberSign sign, UErrorCode& status); @@ -121,14 +115,14 @@ class U_I18N_API SimpleNumber : public UMemory { * * NOTE: This number will fail to format; use forInt64() to create a SimpleNumber with a value. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumber() = default; /** * Destruct this SimpleNumber, cleaning up any memory it might own. * - * @draft ICU 73 + * @stable ICU 73 */ ~SimpleNumber() { cleanup(); @@ -137,7 +131,7 @@ class U_I18N_API SimpleNumber : public UMemory { /** * SimpleNumber move constructor. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumber(SimpleNumber&& other) noexcept { fData = other.fData; @@ -148,7 +142,7 @@ class U_I18N_API SimpleNumber : public UMemory { /** * SimpleNumber move assignment. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumber& operator=(SimpleNumber&& other) noexcept { cleanup(); @@ -169,6 +163,9 @@ class U_I18N_API SimpleNumber : public UMemory { USimpleNumberSign fSign = UNUM_SIMPLE_NUMBER_NO_SIGN; friend class SimpleNumberFormatter; + + // Uses the private constructor to avoid a heap allocation + friend class icu::SimpleDateFormat; }; @@ -180,14 +177,14 @@ class U_I18N_API SimpleNumber : public UMemory { * * This class is immutable and not intended for public subclassing. This class is movable but not copyable. * - * @draft ICU 73 + * @stable ICU 73 */ class U_I18N_API SimpleNumberFormatter : public UMemory { public: /** * Creates a new SimpleNumberFormatter with all locale defaults. * - * @draft ICU 73 + * @stable ICU 73 */ static SimpleNumberFormatter forLocale( const icu::Locale &locale, @@ -196,7 +193,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { /** * Creates a new SimpleNumberFormatter, overriding the grouping strategy. * - * @draft ICU 73 + * @stable ICU 73 */ static SimpleNumberFormatter forLocaleAndGroupingStrategy( const icu::Locale &locale, @@ -209,7 +206,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { * IMPORTANT: For efficiency, this function borrows the symbols. The symbols MUST remain valid * for the lifetime of the SimpleNumberFormatter. * - * @draft ICU 73 + * @stable ICU 73 */ static SimpleNumberFormatter forLocaleAndSymbolsAndGroupingStrategy( const icu::Locale &locale, @@ -223,7 +220,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { * The SimpleNumber argument is "consumed". A new SimpleNumber object should be created for * every formatting operation. * - * @draft ICU 73 + * @stable ICU 73 */ FormattedNumber format(SimpleNumber value, UErrorCode &status) const; @@ -232,7 +229,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { * * For more control over the formatting, use SimpleNumber. * - * @draft ICU 73 + * @stable ICU 73 */ FormattedNumber formatInt64(int64_t value, UErrorCode &status) const { return format(SimpleNumber::forInt64(value, status), status); @@ -249,7 +246,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { /** * Destruct this SimpleNumberFormatter, cleaning up any memory it might own. * - * @draft ICU 73 + * @stable ICU 73 */ ~SimpleNumberFormatter() { cleanup(); @@ -258,14 +255,14 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { /** * Creates a shell, initialized but non-functional SimpleNumberFormatter. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumberFormatter() = default; /** * SimpleNumberFormatter: Move constructor. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumberFormatter(SimpleNumberFormatter&& other) noexcept { fGroupingStrategy = other.fGroupingStrategy; @@ -280,7 +277,7 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { /** * SimpleNumberFormatter: Move assignment. * - * @draft ICU 73 + * @stable ICU 73 */ SimpleNumberFormatter& operator=(SimpleNumberFormatter&& other) noexcept { cleanup(); @@ -316,8 +313,6 @@ class U_I18N_API SimpleNumberFormatter : public UMemory { }; -#endif // U_HIDE_DRAFT_API - } // namespace number U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/simpletz.h b/deps/icu-small/source/i18n/unicode/simpletz.h index 9005c9ccbaf6ec..bf45c918547857 100644 --- a/deps/icu-small/source/i18n/unicode/simpletz.h +++ b/deps/icu-small/source/i18n/unicode/simpletz.h @@ -636,7 +636,7 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { * @return The TimeZone's raw GMT offset. * @stable ICU 2.0 */ - virtual int32_t getRawOffset(void) const override; + virtual int32_t getRawOffset() const override; /** * Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add @@ -666,7 +666,7 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { * but not 0. * @stable ICU 2.0 */ - virtual int32_t getDSTSavings(void) const override; + virtual int32_t getDSTSavings() const override; /** * Queries if this TimeZone uses Daylight Savings Time. @@ -674,7 +674,7 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { * @return True if this TimeZone uses Daylight Savings Time; false otherwise. * @stable ICU 2.0 */ - virtual UBool useDaylightTime(void) const override; + virtual UBool useDaylightTime() const override; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -773,7 +773,7 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; /** * Return the class ID for this class. This is useful only for comparing to a return @@ -786,7 +786,7 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); private: /** @@ -882,8 +882,8 @@ class U_I18N_API SimpleTimeZone: public BasicTimeZone { /* Private for BasicTimeZone implementation */ void checkTransitionRules(UErrorCode& status) const; void initTransitionRules(UErrorCode& status); - void clearTransitionRules(void); - void deleteTransitionRules(void); + void clearTransitionRules(); + void deleteTransitionRules(); UBool transitionRulesInitialized; InitialTimeZoneRule* initialRule; TimeZoneTransition* firstTransition; diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index 4343bfbca53aa9..c5242fd5a0867c 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -69,7 +69,8 @@ class SimpleNumberFormatter; * getDateInstance(), getDateInstance(), or getDateTimeInstance() rather than * explicitly constructing an instance of SimpleDateFormat. This way, the client * is guaranteed to get an appropriate formatting pattern for whatever locale the - * program is running in. However, if the client needs something more unusual than + * program is running in. If the client needs more control, they should consider using + * DateFormat::createInstanceForSkeleton(). However, if the client needs something more unusual than * the default patterns in the locales, he can construct a SimpleDateFormat directly * and give it an appropriate pattern (or use one of the factory methods on DateFormat * and modify the pattern after the fact with toPattern() and applyPattern(). @@ -77,46 +78,32 @@ class SimpleNumberFormatter; * <p><strong>Date and Time Patterns:</strong></p> * * <p>Date and time formats are specified by <em>date and time pattern</em> strings. + * The full syntax for date and time patterns can be found at + * <a href="https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns">https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns</a>. + * * Within date and time pattern strings, all unquoted ASCII letters [A-Za-z] are reserved - * as pattern letters representing calendar fields. <code>SimpleDateFormat</code> supports - * the date and time formatting algorithm and pattern letters defined by - * <a href="http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table">UTS#35 - * Unicode Locale Data Markup Language (LDML)</a> and further documented for ICU in the - * <a href="https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table">ICU - * User Guide</a>. The following pattern letters are currently available (note that the actual - * values depend on CLDR and may change from the examples shown here):</p> + * as pattern letters representing calendar fields. Some of the most commonly used pattern letters are:</p> * * <table border="1"> * <tr> - * <th>Field</th> * <th style="text-align: center">Sym.</th> * <th style="text-align: center">No.</th> * <th>Example</th> * <th>Description</th> * </tr> * <tr> - * <th rowspan="3">era</th> - * <td style="text-align: center" rowspan="3">G</td> + * <td style="text-align: center">G</td> * <td style="text-align: center">1..3</td> * <td>AD</td> - * <td rowspan="3">Era - Replaced with the Era string for the current date. One to three letters for the + * <td>Era - Replaced with the Era string for the current date. One to three letters for the * abbreviated form, four letters for the long (wide) form, five for the narrow form.</td> * </tr> * <tr> - * <td style="text-align: center">4</td> - * <td>Anno Domini</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>A</td> - * </tr> - * <tr> - * <th rowspan="6">year</th> * <td style="text-align: center">y</td> * <td style="text-align: center">1..n</td> * <td>1996</td> * <td>Year. Normally the length specifies the padding, but for two letters it also specifies the maximum - * length. Example:<div align="center"> + * length. Example:<div style="text-align: center"> * <center> * <table border="1" cellpadding="2" cellspacing="0"> * <tr> @@ -172,64 +159,11 @@ class SimpleNumberFormatter; * </td> * </tr> * <tr> - * <td style="text-align: center">Y</td> - * <td style="text-align: center">1..n</td> - * <td>1997</td> - * <td>Year (in "Week of Year" based calendars). Normally the length specifies the padding, - * but for two letters it also specifies the maximum length. This year designation is used in ISO - * year-week calendar as defined by ISO 8601, but can be used in non-Gregorian based calendar systems - * where week date processing is desired. May not always be the same value as calendar year.</td> - * </tr> - * <tr> - * <td style="text-align: center">u</td> - * <td style="text-align: center">1..n</td> - * <td>4601</td> - * <td>Extended year. This is a single number designating the year of this calendar system, encompassing - * all supra-year fields. For example, for the Julian calendar system, year numbers are positive, with an - * era of BCE or CE. An extended year value for the Julian calendar system assigns positive values to CE - * years and negative values to BCE years, with 1 BCE being year 0.</td> - * </tr> - * <tr> - * <td style="text-align: center" rowspan="3">U</td> - * <td style="text-align: center">1..3</td> - * <td>甲子</td> - * <td rowspan="3">Cyclic year name. Calendars such as the Chinese lunar calendar (and related calendars) - * and the Hindu calendars use 60-year cycles of year names. Use one through three letters for the abbreviated - * name, four for the full (wide) name, or five for the narrow name (currently the data only provides abbreviated names, - * which will be used for all requested name widths). If the calendar does not provide cyclic year name data, - * or if the year value to be formatted is out of the range of years for which cyclic name data is provided, - * then numeric formatting is used (behaves like 'y').</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>(currently also 甲子)</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>(currently also 甲子)</td> - * </tr> - * <tr> - * <th rowspan="6">quarter</th> * <td rowspan="3" style="text-align: center">Q</td> * <td style="text-align: center">1..2</td> * <td>02</td> - * <td rowspan="3">Quarter - Use one or two for the numerical quarter, three for the abbreviation, or four for the - * full (wide) name (five for the narrow name is not yet supported).</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>Q2</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>2nd quarter</td> - * </tr> - * <tr> - * <td rowspan="3" style="text-align: center">q</td> - * <td style="text-align: center">1..2</td> - * <td>02</td> - * <td rowspan="3"><b>Stand-Alone</b> Quarter - Use one or two for the numerical quarter, three for the abbreviation, - * or four for the full name (five for the narrow name is not yet supported).</td> + * <td rowspan="3">Quarter - Use one or two for the numerical quarter, three for the abbreviation, or four + * for the full (wide) name (five for the narrow name is not yet supported).</td> * </tr> * <tr> * <td style="text-align: center">3</td> @@ -240,33 +174,12 @@ class SimpleNumberFormatter; * <td>2nd quarter</td> * </tr> * <tr> - * <th rowspan="8">month</th> * <td rowspan="4" style="text-align: center">M</td> * <td style="text-align: center">1..2</td> * <td>09</td> * <td rowspan="4">Month - Use one or two for the numerical month, three for the abbreviation, four for * the full (wide) name, or five for the narrow name. With two ("MM"), the month number is zero-padded - * if necessary (e.g. "08")</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>Sep</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>September</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>S</td> - * </tr> - * <tr> - * <td rowspan="4" style="text-align: center">L</td> - * <td style="text-align: center">1..2</td> - * <td>09</td> - * <td rowspan="4"><b>Stand-Alone</b> Month - Use one or two for the numerical month, three for the abbreviation, - * four for the full (wide) name, or 5 for the narrow name. With two ("LL"), the month number is zero-padded if - * necessary (e.g. "08")</td> + * if necessary (e.g. "08").</td> * </tr> * <tr> * <td style="text-align: center">3</td> @@ -281,21 +194,6 @@ class SimpleNumberFormatter; * <td>S</td> * </tr> * <tr> - * <th rowspan="2">week</th> - * <td style="text-align: center">w</td> - * <td style="text-align: center">1..2</td> - * <td>27</td> - * <td>Week of Year. Use "w" to show the minimum number of digits, or "ww" to always show two digits - * (zero-padding if necessary, e.g. "08").</td> - * </tr> - * <tr> - * <td style="text-align: center">W</td> - * <td style="text-align: center">1</td> - * <td>3</td> - * <td>Week of Month</td> - * </tr> - * <tr> - * <th rowspan="4">day</th> * <td style="text-align: center">d</td> * <td style="text-align: center">1..2</td> * <td>1</td> @@ -303,29 +201,6 @@ class SimpleNumberFormatter; * two digits (zero-padding if necessary, e.g. "08").</td> * </tr> * <tr> - * <td style="text-align: center">D</td> - * <td style="text-align: center">1..3</td> - * <td>345</td> - * <td>Day of year</td> - * </tr> - * <tr> - * <td style="text-align: center">F</td> - * <td style="text-align: center">1</td> - * <td>2</td> - * <td>Day of Week in Month. The example is for the 2nd Wed in July</td> - * </tr> - * <tr> - * <td style="text-align: center">g</td> - * <td style="text-align: center">1..n</td> - * <td>2451334</td> - * <td>Modified Julian day. This is different from the conventional Julian day number in two regards. - * First, it demarcates days at local zone midnight, rather than noon GMT. Second, it is a local number; - * that is, it depends on the local time zone. It can be thought of as a single number that encompasses - * all the date-related fields.</td> - * </tr> - * <tr> - * <th rowspan="14">week<br> - * day</th> * <td rowspan="4" style="text-align: center">E</td> * <td style="text-align: center">1..3</td> * <td>Tue</td> @@ -345,61 +220,12 @@ class SimpleNumberFormatter; * <td>Tu</td> * </tr> * <tr> - * <td rowspan="5" style="text-align: center">e</td> - * <td style="text-align: center">1..2</td> - * <td>2</td> - * <td rowspan="5">Local day of week. Same as E except adds a numeric value that will depend on the local - * starting day of the week, using one or two letters. For this example, Monday is the first day of the week.</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>Tue</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>Tuesday</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>T</td> - * </tr> - * <tr> - * <td style="text-align: center">6</td> - * <td>Tu</td> - * </tr> - * <tr> - * <td rowspan="5" style="text-align: center">c</td> - * <td style="text-align: center">1</td> - * <td>2</td> - * <td rowspan="5"><b>Stand-Alone</b> local day of week - Use one letter for the local numeric value (same - * as 'e'), three for the short day, four for the full (wide) name, five for the narrow name, or six for - * the short name.</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>Tue</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>Tuesday</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>T</td> - * </tr> - * <tr> - * <td style="text-align: center">6</td> - * <td>Tu</td> - * </tr> - * <tr> - * <th>period</th> * <td style="text-align: center">a</td> * <td style="text-align: center">1</td> * <td>AM</td> * <td>AM or PM</td> * </tr> * <tr> - * <th rowspan="4">hour</th> * <td style="text-align: center">h</td> * <td style="text-align: center">1..2</td> * <td>11</td> @@ -416,27 +242,13 @@ class SimpleNumberFormatter; * 12-hour-cycle format (h or K). Use HH for zero padding.</td> * </tr> * <tr> - * <td style="text-align: center">K</td> - * <td style="text-align: center">1..2</td> - * <td>0</td> - * <td>Hour [0-11]. When used in a skeleton, only matches K or h, see above. Use KK for zero padding.</td> - * </tr> - * <tr> - * <td style="text-align: center">k</td> - * <td style="text-align: center">1..2</td> - * <td>24</td> - * <td>Hour [1-24]. When used in a skeleton, only matches k or H, see above. Use kk for zero padding.</td> - * </tr> - * <tr> - * <th>minute</th> * <td style="text-align: center">m</td> * <td style="text-align: center">1..2</td> * <td>59</td> * <td>Minute. Use "m" to show the minimum number of digits, or "mm" to always show two digits - * (zero-padding if necessary, e.g. "08").</td> + * (zero-padding if necessary, e.g. "08")..</td> * </tr> * <tr> - * <th rowspan="3">second</th> * <td style="text-align: center">s</td> * <td style="text-align: center">1..2</td> * <td>12</td> @@ -444,28 +256,10 @@ class SimpleNumberFormatter; * (zero-padding if necessary, e.g. "08").</td> * </tr> * <tr> - * <td style="text-align: center">S</td> - * <td style="text-align: center">1..n</td> - * <td>3450</td> - * <td>Fractional Second - truncates (like other time fields) to the count of letters when formatting. - * Appends zeros if more than 3 letters specified. Truncates at three significant digits when parsing. - * (example shows display using pattern SSSS for seconds value 12.34567)</td> - * </tr> - * <tr> - * <td style="text-align: center">A</td> - * <td style="text-align: center">1..n</td> - * <td>69540000</td> - * <td>Milliseconds in day. This field behaves <i>exactly</i> like a composite of all time-related fields, - * not including the zone fields. As such, it also reflects discontinuities of those fields on DST transition - * days. On a day of DST onset, it will jump forward. On a day of DST cessation, it will jump backward. This - * reflects the fact that is must be combined with the offset field to obtain a unique local time value.</td> - * </tr> - * <tr> - * <th rowspan="23">zone</th> * <td rowspan="2" style="text-align: center">z</td> * <td style="text-align: center">1..3</td> * <td>PDT</td> - * <td>The <i>short specific non-location format</i>. + * <td>Time zone. The <i>short specific non-location format</i>. * Where that is unavailable, falls back to the <i>short localized GMT format</i> ("O").</td> * </tr> * <tr> @@ -475,43 +269,10 @@ class SimpleNumberFormatter; * Where that is unavailable, falls back to the <i>long localized GMT format</i> ("OOOO").</td> * </tr> * <tr> - * <td rowspan="3" style="text-align: center">Z</td> - * <td style="text-align: center">1..3</td> - * <td>-0800</td> - * <td>The <i>ISO8601 basic format</i> with hours, minutes and optional seconds fields. - * The format is equivalent to RFC 822 zone format (when optional seconds field is absent). - * This is equivalent to the "xxxx" specifier.</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>GMT-8:00</td> - * <td>The <i>long localized GMT format</i>. - * This is equivalent to the "OOOO" specifier.</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>-08:00<br> - * -07:52:58</td> - * <td>The <i>ISO8601 extended format</i> with hours, minutes and optional seconds fields. - * The ISO8601 UTC indicator "Z" is used when local time offset is 0. - * This is equivalent to the "XXXXX" specifier.</td> - * </tr> - * <tr> - * <td rowspan="2" style="text-align: center">O</td> - * <td style="text-align: center">1</td> - * <td>GMT-8</td> - * <td>The <i>short localized GMT format</i>.</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>GMT-08:00</td> - * <td>The <i>long localized GMT format</i>.</td> - * </tr> - * <tr> * <td rowspan="2" style="text-align: center">v</td> * <td style="text-align: center">1</td> * <td>PT</td> - * <td>The <i>short generic non-location format</i>. + * <td>Time zone. The <i>short generic non-location format</i>. * Where that is unavailable, falls back to the <i>generic location format</i> ("VVVV"), * then the <i>short localized GMT format</i> as the final fallback.</td> * </tr> @@ -521,109 +282,6 @@ class SimpleNumberFormatter; * <td>The <i>long generic non-location format</i>. * Where that is unavailable, falls back to <i>generic location format</i> ("VVVV"). * </tr> - * <tr> - * <td rowspan="4" style="text-align: center">V</td> - * <td style="text-align: center">1</td> - * <td>uslax</td> - * <td>The short time zone ID. - * Where that is unavailable, the special short time zone ID <i>unk</i> (Unknown Zone) is used.<br> - * <i><b>Note</b>: This specifier was originally used for a variant of the short specific non-location format, - * but it was deprecated in the later version of the LDML specification. In CLDR 23/ICU 51, the definition of - * the specifier was changed to designate a short time zone ID.</i></td> - * </tr> - * <tr> - * <td style="text-align: center">2</td> - * <td>America/Los_Angeles</td> - * <td>The long time zone ID.</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>Los Angeles</td> - * <td>The exemplar city (location) for the time zone. - * Where that is unavailable, the localized exemplar city name for the special zone <i>Etc/Unknown</i> is used - * as the fallback (for example, "Unknown City"). </td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>Los Angeles Time</td> - * <td>The <i>generic location format</i>. - * Where that is unavailable, falls back to the <i>long localized GMT format</i> ("OOOO"; - * Note: Fallback is only necessary with a GMT-style Time Zone ID, like Etc/GMT-830.)<br> - * This is especially useful when presenting possible timezone choices for user selection, - * since the naming is more uniform than the "v" format.</td> - * </tr> - * <tr> - * <td rowspan="5" style="text-align: center">X</td> - * <td style="text-align: center">1</td> - * <td>-08<br> - * +0530<br> - * Z</td> - * <td>The <i>ISO8601 basic format</i> with hours field and optional minutes field. - * The ISO8601 UTC indicator "Z" is used when local time offset is 0.</td> - * </tr> - * <tr> - * <td style="text-align: center">2</td> - * <td>-0800<br> - * Z</td> - * <td>The <i>ISO8601 basic format</i> with hours and minutes fields. - * The ISO8601 UTC indicator "Z" is used when local time offset is 0.</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>-08:00<br> - * Z</td> - * <td>The <i>ISO8601 extended format</i> with hours and minutes fields. - * The ISO8601 UTC indicator "Z" is used when local time offset is 0.</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>-0800<br> - * -075258<br> - * Z</td> - * <td>The <i>ISO8601 basic format</i> with hours, minutes and optional seconds fields. - * (Note: The seconds field is not supported by the ISO8601 specification.) - * The ISO8601 UTC indicator "Z" is used when local time offset is 0.</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>-08:00<br> - * -07:52:58<br> - * Z</td> - * <td>The <i>ISO8601 extended format</i> with hours, minutes and optional seconds fields. - * (Note: The seconds field is not supported by the ISO8601 specification.) - * The ISO8601 UTC indicator "Z" is used when local time offset is 0.</td> - * </tr> - * <tr> - * <td rowspan="5" style="text-align: center">x</td> - * <td style="text-align: center">1</td> - * <td>-08<br> - * +0530</td> - * <td>The <i>ISO8601 basic format</i> with hours field and optional minutes field.</td> - * </tr> - * <tr> - * <td style="text-align: center">2</td> - * <td>-0800</td> - * <td>The <i>ISO8601 basic format</i> with hours and minutes fields.</td> - * </tr> - * <tr> - * <td style="text-align: center">3</td> - * <td>-08:00</td> - * <td>The <i>ISO8601 extended format</i> with hours and minutes fields.</td> - * </tr> - * <tr> - * <td style="text-align: center">4</td> - * <td>-0800<br> - * -075258</td> - * <td>The <i>ISO8601 basic format</i> with hours, minutes and optional seconds fields. - * (Note: The seconds field is not supported by the ISO8601 specification.)</td> - * </tr> - * <tr> - * <td style="text-align: center">5</td> - * <td>-08:00<br> - * -07:52:58</td> - * <td>The <i>ISO8601 extended format</i> with hours, minutes and optional seconds fields. - * (Note: The seconds field is not supported by the ISO8601 specification.)</td> - * </tr> * </table> * * <P> @@ -724,7 +382,7 @@ class SimpleNumberFormatter; * subclasses, such code will not necessarily work and will not be * guaranteed to work stably from release to release. */ -class U_I18N_API SimpleDateFormat: public DateFormat { +class U_I18N_API_CLASS SimpleDateFormat: public DateFormat { public: /** * Construct a SimpleDateFormat using the default pattern for the default @@ -735,7 +393,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/failure code. * @stable ICU 2.0 */ - SimpleDateFormat(UErrorCode& status); + U_I18N_API SimpleDateFormat(UErrorCode& status); /** * Construct a SimpleDateFormat using the given pattern and the default locale. @@ -748,7 +406,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/failure code. * @stable ICU 2.0 */ - SimpleDateFormat(const UnicodeString& pattern, + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, UErrorCode& status); /** @@ -772,9 +430,9 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/failure code. * @stable ICU 4.2 */ - SimpleDateFormat(const UnicodeString& pattern, - const UnicodeString& override, - UErrorCode& status); + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, + const UnicodeString& override, + UErrorCode& status); /** * Construct a SimpleDateFormat using the given pattern and locale. @@ -788,9 +446,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/failure code. * @stable ICU 2.0 */ - SimpleDateFormat(const UnicodeString& pattern, - const Locale& locale, - UErrorCode& status); + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, const Locale& locale, UErrorCode& status); /** * Construct a SimpleDateFormat using the given pattern, numbering system override, and locale. @@ -813,10 +469,10 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/failure code. * @stable ICU 4.2 */ - SimpleDateFormat(const UnicodeString& pattern, - const UnicodeString& override, - const Locale& locale, - UErrorCode& status); + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, + const UnicodeString& override, + const Locale& locale, + UErrorCode& status); /** * Construct a SimpleDateFormat using the given pattern and locale-specific @@ -827,9 +483,9 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/faulure code. * @stable ICU 2.0 */ - SimpleDateFormat(const UnicodeString& pattern, - DateFormatSymbols* formatDataToAdopt, - UErrorCode& status); + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, + DateFormatSymbols* formatDataToAdopt, + UErrorCode& status); /** * Construct a SimpleDateFormat using the given pattern and locale-specific @@ -840,27 +496,27 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param status Output param set to success/faulure code. * @stable ICU 2.0 */ - SimpleDateFormat(const UnicodeString& pattern, - const DateFormatSymbols& formatData, - UErrorCode& status); + U_I18N_API SimpleDateFormat(const UnicodeString& pattern, + const DateFormatSymbols& formatData, + UErrorCode& status); /** * Copy constructor. * @stable ICU 2.0 */ - SimpleDateFormat(const SimpleDateFormat&); + U_I18N_API SimpleDateFormat(const SimpleDateFormat&); /** * Assignment operator. * @stable ICU 2.0 */ - SimpleDateFormat& operator=(const SimpleDateFormat&); + U_I18N_API SimpleDateFormat& operator=(const SimpleDateFormat&); /** * Destructor. * @stable ICU 2.0 */ - virtual ~SimpleDateFormat(); + U_I18N_API virtual ~SimpleDateFormat(); /** * Clone this Format object polymorphically. The caller owns the result and @@ -868,7 +524,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return A copy of the object. * @stable ICU 2.0 */ - virtual SimpleDateFormat* clone() const override; + U_I18N_API virtual SimpleDateFormat* clone() const override; /** * Return true if the given Format objects are semantically equal. Objects @@ -877,8 +533,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return true if the given Format objects are semantically equal. * @stable ICU 2.0 */ - virtual bool operator==(const Format& other) const override; - + U_I18N_API virtual bool operator==(const Format& other) const override; using DateFormat::format; @@ -898,9 +553,9 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return Reference to 'appendTo' parameter. * @stable ICU 2.1 */ - virtual UnicodeString& format( Calendar& cal, - UnicodeString& appendTo, - FieldPosition& pos) const override; + U_I18N_API virtual UnicodeString& format(Calendar& cal, + UnicodeString& appendTo, + FieldPosition& pos) const override; /** * Format a date or time, which is the standard millis since 24:00 GMT, Jan @@ -920,10 +575,10 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return Reference to 'appendTo' parameter. * @stable ICU 4.4 */ - virtual UnicodeString& format( Calendar& cal, - UnicodeString& appendTo, - FieldPositionIterator* posIter, - UErrorCode& status) const override; + U_I18N_API virtual UnicodeString& format(Calendar& cal, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const override; using DateFormat::parse; @@ -953,10 +608,9 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * start position if the parse failed. * @stable ICU 2.1 */ - virtual void parse( const UnicodeString& text, - Calendar& cal, - ParsePosition& pos) const override; - + U_I18N_API virtual void parse(const UnicodeString& text, + Calendar& cal, + ParsePosition& pos) const override; /** * Set the start UDate used to interpret two-digit year strings. @@ -974,7 +628,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * an error value if there was a parse error. * @stable ICU 2.0 */ - virtual void set2DigitYearStart(UDate d, UErrorCode& status); + U_I18N_API virtual void set2DigitYearStart(UDate d, UErrorCode& status); /** * Get the start UDate used to interpret two-digit year strings. @@ -991,7 +645,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * an error value if there was a parse error. * @stable ICU 2.0 */ - UDate get2DigitYearStart(UErrorCode& status) const; + U_I18N_API UDate get2DigitYearStart(UErrorCode& status) const; /** * Return a pattern string describing this date format. @@ -999,7 +653,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return A reference to 'result'. * @stable ICU 2.0 */ - virtual UnicodeString& toPattern(UnicodeString& result) const; + U_I18N_API virtual UnicodeString& toPattern(UnicodeString& result) const; /** * Return a localized pattern string describing this date format. @@ -1023,8 +677,8 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return A reference to 'result'. * @stable ICU 2.0 */ - virtual UnicodeString& toLocalizedPattern(UnicodeString& result, - UErrorCode& status) const; + U_I18N_API virtual UnicodeString& toLocalizedPattern(UnicodeString& result, + UErrorCode& status) const; /** * Apply the given unlocalized pattern string to this date format. @@ -1034,7 +688,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param pattern The pattern to be applied. * @stable ICU 2.0 */ - virtual void applyPattern(const UnicodeString& pattern); + U_I18N_API virtual void applyPattern(const UnicodeString& pattern); /** * Apply the given localized pattern string to this date format. @@ -1046,8 +700,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * set to a failure result. * @stable ICU 2.0 */ - virtual void applyLocalizedPattern(const UnicodeString& pattern, - UErrorCode& status); + U_I18N_API virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status); /** * Gets the date/time formatting symbols (this is an object carrying @@ -1057,7 +710,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * with this date-time formatter. * @stable ICU 2.0 */ - virtual const DateFormatSymbols* getDateFormatSymbols(void) const; + U_I18N_API virtual const DateFormatSymbols* getDateFormatSymbols() const; /** * Set the date/time formatting symbols. The caller no longer owns the @@ -1065,14 +718,14 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param newFormatSymbols the given date-time formatting symbols to copy. * @stable ICU 2.0 */ - virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols); + U_I18N_API virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols); /** * Set the date/time formatting data. * @param newFormatSymbols the given date-time formatting symbols to copy. * @stable ICU 2.0 */ - virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols); + U_I18N_API virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols); /** * Return the class ID for this class. This is useful only for comparing to @@ -1085,7 +738,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -1098,7 +751,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * Set the calendar to be used by this date format. Initially, the default @@ -1109,7 +762,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param calendarToAdopt Calendar object to be adopted. * @stable ICU 2.0 */ - virtual void adoptCalendar(Calendar* calendarToAdopt) override; + U_I18N_API virtual void adoptCalendar(Calendar* calendarToAdopt) override; /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */ /** @@ -1119,21 +772,21 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param timeZoneFormatToAdopt The TimeZoneFormat object to be adopted. * @internal ICU 49 technology preview */ - virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt); + U_I18N_API virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt); /** * Sets the TimeZoneFormat to be used by this date/time formatter. * @param newTimeZoneFormat The TimeZoneFormat object to copy. * @internal ICU 49 technology preview */ - virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat); + U_I18N_API virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat); /** * Gets the time zone format object associated with this date/time formatter. * @return the time zone format associated with this date/time formatter. * @internal ICU 49 technology preview */ - virtual const TimeZoneFormat* getTimeZoneFormat(void) const; + U_I18N_API virtual const TimeZoneFormat* getTimeZoneFormat() const; /** * Set a particular UDisplayContext value in the formatter, such as @@ -1145,7 +798,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * updated with any new status from the function. * @stable ICU 53 */ - virtual void setContext(UDisplayContext value, UErrorCode& status) override; + U_I18N_API virtual void setContext(UDisplayContext value, UErrorCode& status) override; /** * Overrides base class method and @@ -1154,7 +807,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param formatToAdopt the NumbeferFormat used * @stable ICU 54 */ - void adoptNumberFormat(NumberFormat *formatToAdopt) override; + U_I18N_API void adoptNumberFormat(NumberFormat* formatToAdopt) override; /** * Allow the user to set the NumberFormat for several fields @@ -1171,14 +824,16 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * if the operation succeeds. * @stable ICU 54 */ - void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status); + U_I18N_API void adoptNumberFormat(const UnicodeString& fields, + NumberFormat* formatToAdopt, + UErrorCode& status); /** * Get the numbering system to be used for a particular field. * @param field The UDateFormatField to get * @stable ICU 54 */ - const NumberFormat * getNumberFormatForField(char16_t field) const; + U_I18N_API const NumberFormat* getNumberFormatForField(char16_t field) const; #ifndef U_HIDE_INTERNAL_API /** @@ -1191,8 +846,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * covered in pattern. false otherwise. * @internal ICU 4.0 */ - UBool isFieldUnitIgnored(UCalendarDateFields field) const; - + U_I18N_API UBool isFieldUnitIgnored(UCalendarDateFields field) const; /** * This is for ICU internal use only. Please do not use. @@ -1205,8 +859,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * covered in pattern. false otherwise. * @internal ICU 4.0 */ - static UBool isFieldUnitIgnored(const UnicodeString& pattern, - UCalendarDateFields field); + U_I18N_API static UBool isFieldUnitIgnored(const UnicodeString& pattern, UCalendarDateFields field); /** * This is for ICU internal use only. Please do not use. @@ -1216,16 +869,16 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return locale in this simple date formatter * @internal ICU 4.0 */ - const Locale& getSmpFmtLocale(void) const; + U_I18N_API const Locale& getSmpFmtLocale() const; #endif /* U_HIDE_INTERNAL_API */ private: friend class DateFormat; friend class DateIntervalFormat; - void initializeDefaultCentury(void); + void initializeDefaultCentury(); - void initializeBooleanAttributes(void); + void initializeBooleanAttributes(); SimpleDateFormat() = delete; // default constructor not implemented diff --git a/deps/icu-small/source/i18n/unicode/sortkey.h b/deps/icu-small/source/i18n/unicode/sortkey.h index 401b5abad0a14c..6679beb9357a74 100644 --- a/deps/icu-small/source/i18n/unicode/sortkey.h +++ b/deps/icu-small/source/i18n/unicode/sortkey.h @@ -162,7 +162,7 @@ class U_I18N_API CollationKey : public UObject { * @return Returns true if the key is in an invalid, false otherwise. * @stable ICU 2.0 */ - UBool isBogus(void) const; + UBool isBogus() const; /** * Returns a pointer to the collation key values. The storage is owned @@ -231,7 +231,7 @@ class U_I18N_API CollationKey : public UObject { * @see UnicodeString#hashCode * @stable ICU 2.0 */ - int32_t hashCode(void) const; + int32_t hashCode() const; /** * ICU "poor man's RTTI", returns a UClassID for the actual class. @@ -264,7 +264,7 @@ class U_I18N_API CollationKey : public UObject { return (fFlagAndLength >= 0) ? fUnion.fStackBuffer : fUnion.fFields.fBytes; } int32_t getCapacity() const { - return (fFlagAndLength >= 0) ? (int32_t)sizeof(fUnion) : fUnion.fFields.fCapacity; + return fFlagAndLength >= 0 ? static_cast<int32_t>(sizeof(fUnion)) : fUnion.fFields.fCapacity; } int32_t getLength() const { return fFlagAndLength & 0x7fffffff; } @@ -272,12 +272,12 @@ class U_I18N_API CollationKey : public UObject { * Set the CollationKey to a "bogus" or invalid state * @return this CollationKey */ - CollationKey& setToBogus(void); + CollationKey& setToBogus(); /** * Resets this CollationKey to an empty state * @return this CollationKey */ - CollationKey& reset(void); + CollationKey& reset(); /** * Allow private access to RuleBasedCollator diff --git a/deps/icu-small/source/i18n/unicode/stsearch.h b/deps/icu-small/source/i18n/unicode/stsearch.h index b916aebf246015..bbad9d22a371a7 100644 --- a/deps/icu-small/source/i18n/unicode/stsearch.h +++ b/deps/icu-small/source/i18n/unicode/stsearch.h @@ -264,7 +264,7 @@ class U_I18N_API StringSearch final : public SearchIterator * If a collator is created in the constructor, it will be destroyed here. * @stable ICU 2.0 */ - virtual ~StringSearch(void); + virtual ~StringSearch(); /** * Clone this object. @@ -324,7 +324,7 @@ class U_I18N_API StringSearch final : public SearchIterator * @return current index in the text being searched. * @stable ICU 2.0 */ - virtual int32_t getOffset(void) const override; + virtual int32_t getOffset() const override; /** * Set the target text to be searched. diff --git a/deps/icu-small/source/i18n/unicode/tblcoll.h b/deps/icu-small/source/i18n/unicode/tblcoll.h index 43cf35d1a81b4c..abf0e177436a78 100644 --- a/deps/icu-small/source/i18n/unicode/tblcoll.h +++ b/deps/icu-small/source/i18n/unicode/tblcoll.h @@ -112,7 +112,7 @@ class UVector64; * Note, RuleBasedCollator is not to be subclassed. * @see Collator */ -class U_I18N_API RuleBasedCollator final : public Collator { +class U_I18N_API_CLASS RuleBasedCollator final : public Collator { public: /** * RuleBasedCollator constructor. This takes the table rules and builds a @@ -122,7 +122,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status reporting a success or an error. * @stable ICU 2.0 */ - RuleBasedCollator(const UnicodeString& rules, UErrorCode& status); + U_I18N_API RuleBasedCollator(const UnicodeString& rules, UErrorCode& status); /** * RuleBasedCollator constructor. This takes the table rules and builds a @@ -133,9 +133,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status reporting a success or an error. * @stable ICU 2.0 */ - RuleBasedCollator(const UnicodeString& rules, - ECollationStrength collationStrength, - UErrorCode& status); + U_I18N_API RuleBasedCollator(const UnicodeString& rules, + ECollationStrength collationStrength, + UErrorCode& status); /** * RuleBasedCollator constructor. This takes the table rules and builds a @@ -146,9 +146,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status reporting a success or an error. * @stable ICU 2.0 */ - RuleBasedCollator(const UnicodeString& rules, - UColAttributeValue decompositionMode, - UErrorCode& status); + U_I18N_API RuleBasedCollator(const UnicodeString& rules, + UColAttributeValue decompositionMode, + UErrorCode& status); /** * RuleBasedCollator constructor. This takes the table rules and builds a @@ -160,19 +160,20 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status reporting a success or an error. * @stable ICU 2.0 */ - RuleBasedCollator(const UnicodeString& rules, - ECollationStrength collationStrength, - UColAttributeValue decompositionMode, - UErrorCode& status); + U_I18N_API RuleBasedCollator(const UnicodeString& rules, + ECollationStrength collationStrength, + UColAttributeValue decompositionMode, + UErrorCode& status); #ifndef U_HIDE_INTERNAL_API /** * TODO: document & propose as public API * @internal */ - RuleBasedCollator(const UnicodeString &rules, - UParseError &parseError, UnicodeString &reason, - UErrorCode &errorCode); + U_I18N_API RuleBasedCollator(const UnicodeString& rules, + UParseError& parseError, + UnicodeString& reason, + UErrorCode& errorCode); #endif /* U_HIDE_INTERNAL_API */ /** @@ -180,8 +181,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param other the RuleBasedCollator object to be copied * @stable ICU 2.0 */ - RuleBasedCollator(const RuleBasedCollator& other); - + U_I18N_API RuleBasedCollator(const RuleBasedCollator& other); /** Opens a collator from a collator binary image created using * cloneBinary. Binary image used in instantiation of the @@ -200,22 +200,23 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see cloneBinary * @stable ICU 3.4 */ - RuleBasedCollator(const uint8_t *bin, int32_t length, - const RuleBasedCollator *base, - UErrorCode &status); + U_I18N_API RuleBasedCollator(const uint8_t* bin, + int32_t length, + const RuleBasedCollator* base, + UErrorCode& status); /** * Destructor. * @stable ICU 2.0 */ - virtual ~RuleBasedCollator(); + U_I18N_API virtual ~RuleBasedCollator(); /** * Assignment operator. * @param other other RuleBasedCollator object to copy from. * @stable ICU 2.0 */ - RuleBasedCollator& operator=(const RuleBasedCollator& other); + U_I18N_API RuleBasedCollator& operator=(const RuleBasedCollator& other); /** * Returns true if argument is the same as this object. @@ -223,14 +224,14 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return true if arguments is the same as this object. * @stable ICU 2.0 */ - virtual bool operator==(const Collator& other) const override; + U_I18N_API virtual bool operator==(const Collator& other) const override; /** * Makes a copy of this object. * @return a copy of this object, owned by the caller * @stable ICU 2.0 */ - virtual RuleBasedCollator* clone() const override; + U_I18N_API virtual RuleBasedCollator* clone() const override; /** * Creates a collation element iterator for the source string. The caller of @@ -242,8 +243,8 @@ class U_I18N_API RuleBasedCollator final : public Collator { * the based Collator. * @stable ICU 2.2 */ - virtual CollationElementIterator* createCollationElementIterator( - const UnicodeString& source) const; + U_I18N_API CollationElementIterator* + createCollationElementIterator(const UnicodeString& source) const; /** * Creates a collation element iterator for the source. The caller of this @@ -254,8 +255,8 @@ class U_I18N_API RuleBasedCollator final : public Collator { * based Collator. * @stable ICU 2.2 */ - virtual CollationElementIterator* createCollationElementIterator( - const CharacterIterator& source) const; + U_I18N_API CollationElementIterator* + createCollationElementIterator(const CharacterIterator& source) const; // Make deprecated versions of Collator::compare() visible. using Collator::compare; @@ -272,9 +273,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * than target * @stable ICU 2.6 **/ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - UErrorCode &status) const override; + U_I18N_API virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + UErrorCode& status) const override; /** * Does the same thing as compare but limits the comparison to a specified @@ -289,10 +290,10 @@ class U_I18N_API RuleBasedCollator final : public Collator { * length) is less than target. * @stable ICU 2.6 */ - virtual UCollationResult compare(const UnicodeString& source, - const UnicodeString& target, - int32_t length, - UErrorCode &status) const override; + U_I18N_API virtual UCollationResult compare(const UnicodeString& source, + const UnicodeString& target, + int32_t length, + UErrorCode& status) const override; /** * The comparison function compares the character data stored in two @@ -310,9 +311,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * than target * @stable ICU 2.6 */ - virtual UCollationResult compare(const char16_t* source, int32_t sourceLength, - const char16_t* target, int32_t targetLength, - UErrorCode &status) const override; + U_I18N_API virtual UCollationResult compare(const char16_t* source, int32_t sourceLength, + const char16_t* target, int32_t targetLength, + UErrorCode& status) const override; /** * Compares two strings using the Collator. @@ -325,9 +326,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return UCOL_LESS, UCOL_EQUAL or UCOL_GREATER * @stable ICU 4.2 */ - virtual UCollationResult compare(UCharIterator &sIter, - UCharIterator &tIter, - UErrorCode &status) const override; + U_I18N_API virtual UCollationResult compare(UCharIterator& sIter, + UCharIterator& tIter, + UErrorCode& status) const override; /** * Compares two UTF-8 strings using the Collator. @@ -342,9 +343,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return UCOL_LESS, UCOL_EQUAL or UCOL_GREATER * @stable ICU 51 */ - virtual UCollationResult compareUTF8(const StringPiece &source, - const StringPiece &target, - UErrorCode &status) const override; + U_I18N_API virtual UCollationResult compareUTF8(const StringPiece& source, + const StringPiece& target, + UErrorCode& status) const override; /** * Transforms the string into a series of characters @@ -360,9 +361,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see CollationKey * @stable ICU 2.0 */ - virtual CollationKey& getCollationKey(const UnicodeString& source, - CollationKey& key, - UErrorCode& status) const override; + U_I18N_API virtual CollationKey& getCollationKey(const UnicodeString& source, + CollationKey& key, + UErrorCode& status) const override; /** * Transforms a specified region of the string into a series of characters @@ -379,17 +380,17 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see CollationKey * @stable ICU 2.0 */ - virtual CollationKey& getCollationKey(const char16_t *source, - int32_t sourceLength, - CollationKey& key, - UErrorCode& status) const override; + U_I18N_API virtual CollationKey& getCollationKey(const char16_t* source, + int32_t sourceLength, + CollationKey& key, + UErrorCode& status) const override; /** * Generates the hash code for the rule-based collation object. * @return the hash code. * @stable ICU 2.0 */ - virtual int32_t hashCode() const override; + U_I18N_API virtual int32_t hashCode() const override; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -402,7 +403,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * was instantiated from rules, locale is empty. * @deprecated ICU 2.8 likely to change in ICU 3.0, based on feedback */ - virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const override; + U_I18N_API virtual Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const override; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -410,14 +411,14 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return the collation tailoring from which this collator was created * @stable ICU 2.0 */ - const UnicodeString& getRules() const; + U_I18N_API const UnicodeString& getRules() const; /** * Gets the version information for a Collator. * @param info the version # information, the result will be filled in * @stable ICU 2.0 */ - virtual void getVersion(UVersionInfo info) const override; + U_I18N_API virtual void getVersion(UVersionInfo info) const override; #ifndef U_HIDE_DEPRECATED_API /** @@ -436,7 +437,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see CollationElementIterator#getMaxExpansion * @deprecated ICU 51 Use CollationElementIterator::getMaxExpansion() instead. */ - int32_t getMaxExpansion(int32_t order) const; + U_I18N_API int32_t getMaxExpansion(int32_t order) const; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -449,7 +450,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; /** * Returns the class ID for this class. This is useful only for comparing to @@ -462,7 +463,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); #ifndef U_HIDE_DEPRECATED_API /** @@ -475,7 +476,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return memory, owned by the caller, of size 'length' bytes. * @deprecated ICU 52. Use cloneBinary() instead. */ - uint8_t *cloneRuleData(int32_t &length, UErrorCode &status) const; + U_I18N_API uint8_t* cloneRuleData(int32_t& length, UErrorCode& status) const; #endif /* U_HIDE_DEPRECATED_API */ /** Creates a binary image of a collator. This binary image can be stored and @@ -488,7 +489,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see ucol_openBinary * @stable ICU 3.4 */ - int32_t cloneBinary(uint8_t *buffer, int32_t capacity, UErrorCode &status) const; + U_I18N_API int32_t cloneBinary(uint8_t* buffer, int32_t capacity, UErrorCode& status) const; /** * Returns current rules. Delta defines whether full rules are returned or @@ -501,7 +502,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @stable ICU 2.2 * @see UCOL_FULL_RULES */ - void getRules(UColRuleOption delta, UnicodeString &buffer) const; + U_I18N_API void getRules(UColRuleOption delta, UnicodeString& buffer) const; /** * Universal attribute setter @@ -510,8 +511,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status to indicate whether the operation went on smoothly or there were errors * @stable ICU 2.2 */ - virtual void setAttribute(UColAttribute attr, UColAttributeValue value, - UErrorCode &status) override; + U_I18N_API virtual void setAttribute(UColAttribute attr, + UColAttributeValue value, + UErrorCode& status) override; /** * Universal attribute getter. @@ -520,8 +522,8 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return attribute value * @stable ICU 2.2 */ - virtual UColAttributeValue getAttribute(UColAttribute attr, - UErrorCode &status) const override; + U_I18N_API virtual UColAttributeValue getAttribute(UColAttribute attr, + UErrorCode& status) const override; /** * Sets the variable top to the top of the specified reordering group. @@ -539,7 +541,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see getMaxVariable * @stable ICU 53 */ - virtual Collator &setMaxVariable(UColReorderCode group, UErrorCode &errorCode) override; + U_I18N_API virtual Collator& setMaxVariable(UColReorderCode group, UErrorCode& errorCode) override; /** * Returns the maximum reordering group whose characters are affected by UCOL_ALTERNATE_HANDLING. @@ -547,7 +549,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see setMaxVariable * @stable ICU 53 */ - virtual UColReorderCode getMaxVariable() const override; + U_I18N_API virtual UColReorderCode getMaxVariable() const override; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -566,7 +568,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return variable top primary weight * @deprecated ICU 53 Call setMaxVariable() instead. */ - virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status) override; + U_I18N_API virtual uint32_t setVariableTop(const char16_t* varTop, + int32_t len, + UErrorCode& status) override; /** * Sets the variable top to the primary weight of the specified string. @@ -583,7 +587,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return variable top primary weight * @deprecated ICU 53 Call setMaxVariable() instead. */ - virtual uint32_t setVariableTop(const UnicodeString &varTop, UErrorCode &status) override; + U_I18N_API virtual uint32_t setVariableTop(const UnicodeString& varTop, UErrorCode& status) override; /** * Sets the variable top to the specified primary weight. @@ -596,7 +600,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param status error code * @deprecated ICU 53 Call setMaxVariable() instead. */ - virtual void setVariableTop(uint32_t varTop, UErrorCode &status) override; + U_I18N_API virtual void setVariableTop(uint32_t varTop, UErrorCode& status) override; #endif // U_FORCE_HIDE_DEPRECATED_API /** @@ -606,7 +610,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see getMaxVariable * @stable ICU 2.0 */ - virtual uint32_t getVariableTop(UErrorCode &status) const override; + U_I18N_API virtual uint32_t getVariableTop(UErrorCode& status) const override; /** * Get a UnicodeSet that contains all the characters and sequences tailored in @@ -617,7 +621,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * in the root collator. The object must be disposed of by using delete * @stable ICU 2.4 */ - virtual UnicodeSet *getTailoredSet(UErrorCode &status) const override; + U_I18N_API virtual UnicodeSet* getTailoredSet(UErrorCode& status) const override; /** * Get the sort key as an array of bytes from a UnicodeString. @@ -633,8 +637,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return Number of bytes needed for storing the sort key * @stable ICU 2.0 */ - virtual int32_t getSortKey(const UnicodeString& source, uint8_t *result, - int32_t resultLength) const override; + U_I18N_API virtual int32_t getSortKey(const UnicodeString& source, + uint8_t* result, + int32_t resultLength) const override; /** * Get the sort key as an array of bytes from a char16_t buffer. @@ -652,8 +657,10 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @return Number of bytes needed for storing the sort key * @stable ICU 2.2 */ - virtual int32_t getSortKey(const char16_t *source, int32_t sourceLength, - uint8_t *result, int32_t resultLength) const override; + U_I18N_API virtual int32_t getSortKey(const char16_t* source, + int32_t sourceLength, + uint8_t* result, + int32_t resultLength) const override; /** * Retrieves the reordering codes for this collator. @@ -668,9 +675,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see Collator#setReorderCodes * @stable ICU 4.8 */ - virtual int32_t getReorderCodes(int32_t *dest, - int32_t destCapacity, - UErrorCode& status) const override; + U_I18N_API virtual int32_t getReorderCodes(int32_t* dest, + int32_t destCapacity, + UErrorCode& status) const override; /** * Sets the ordering of scripts for this collator. @@ -683,18 +690,17 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see Collator#getEquivalentReorderCodes * @stable ICU 4.8 */ - virtual void setReorderCodes(const int32_t* reorderCodes, - int32_t reorderCodesLength, - UErrorCode& status) override; + U_I18N_API virtual void setReorderCodes(const int32_t* reorderCodes, + int32_t reorderCodesLength, + UErrorCode& status) override; /** * Implements ucol_strcollUTF8(). * @internal */ - virtual UCollationResult internalCompareUTF8( - const char *left, int32_t leftLength, - const char *right, int32_t rightLength, - UErrorCode &errorCode) const override; + U_I18N_API virtual UCollationResult internalCompareUTF8(const char* left, int32_t leftLength, + const char* right, int32_t rightLength, + UErrorCode& errorCode) const override; /** Get the short definition string for a collator. This internal API harvests the collator's * locale and the attribute set and produces a string that can be used for opening @@ -719,25 +725,27 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @see ucol_getShortDefinitionString * @internal */ - virtual int32_t internalGetShortDefinitionString(const char *locale, - char *buffer, - int32_t capacity, - UErrorCode &status) const override; + U_I18N_API virtual int32_t internalGetShortDefinitionString(const char* locale, + char* buffer, + int32_t capacity, + UErrorCode& status) const override; /** * Implements ucol_nextSortKeyPart(). * @internal */ - virtual int32_t internalNextSortKeyPart( - UCharIterator *iter, uint32_t state[2], - uint8_t *dest, int32_t count, UErrorCode &errorCode) const override; + U_I18N_API virtual int32_t internalNextSortKeyPart(UCharIterator* iter, + uint32_t state[2], + uint8_t* dest, + int32_t count, + UErrorCode& errorCode) const override; // Do not enclose the default constructor with #ifndef U_HIDE_INTERNAL_API /** * Only for use in ucol_openRules(). * @internal */ - RuleBasedCollator(); + U_I18N_API RuleBasedCollator(); #ifndef U_HIDE_INTERNAL_API /** @@ -746,7 +754,7 @@ class U_I18N_API RuleBasedCollator final : public Collator { * getLocale() returns a copy of a Locale, with minimal lifetime in a C wrapper. * @internal */ - const char *internalGetLocaleID(ULocDataLocaleType type, UErrorCode &errorCode) const; + U_I18N_API const char* internalGetLocaleID(ULocDataLocaleType type, UErrorCode& errorCode) const; /** * Implements ucol_getContractionsAndExpansions(). @@ -760,27 +768,28 @@ class U_I18N_API RuleBasedCollator final : public Collator { * @param errorCode in/out ICU error code * @internal */ - void internalGetContractionsAndExpansions( - UnicodeSet *contractions, UnicodeSet *expansions, - UBool addPrefixes, UErrorCode &errorCode) const; + U_I18N_API void internalGetContractionsAndExpansions(UnicodeSet* contractions, + UnicodeSet* expansions, + UBool addPrefixes, + UErrorCode& errorCode) const; /** * Adds the contractions that start with character c to the set. * Ignores prefixes. Used by AlphabeticIndex. * @internal */ - void internalAddContractions(UChar32 c, UnicodeSet &set, UErrorCode &errorCode) const; + U_I18N_API void internalAddContractions(UChar32 c, UnicodeSet& set, UErrorCode& errorCode) const; /** * Implements from-rule constructors, and ucol_openRules(). * @internal */ - void internalBuildTailoring( - const UnicodeString &rules, - int32_t strength, - UColAttributeValue decompositionMode, - UParseError *outParseError, UnicodeString *outReason, - UErrorCode &errorCode); + U_I18N_API void internalBuildTailoring(const UnicodeString& rules, + int32_t strength, + UColAttributeValue decompositionMode, + UParseError* outParseError, + UnicodeString* outReason, + UErrorCode& errorCode); /** @internal */ static inline RuleBasedCollator *rbcFromUCollator(UCollator *uc) { @@ -795,7 +804,9 @@ class U_I18N_API RuleBasedCollator final : public Collator { * Appends the CEs for the string to the vector. * @internal for tests & tools */ - void internalGetCEs(const UnicodeString &str, UVector64 &ces, UErrorCode &errorCode) const; + U_I18N_API void internalGetCEs(const UnicodeString& str, + UVector64& ces, + UErrorCode& errorCode) const; #endif // U_HIDE_INTERNAL_API protected: @@ -843,14 +854,14 @@ class U_I18N_API RuleBasedCollator final : public Collator { const CollationSettings &getDefaultSettings() const; void setAttributeDefault(int32_t attribute) { - explicitlySetAttributes &= ~((uint32_t)1 << attribute); + explicitlySetAttributes &= ~(static_cast<uint32_t>(1) << attribute); } void setAttributeExplicitly(int32_t attribute) { - explicitlySetAttributes |= (uint32_t)1 << attribute; + explicitlySetAttributes |= static_cast<uint32_t>(1) << attribute; } UBool attributeHasBeenSetExplicitly(int32_t attribute) const { // assert(0 <= attribute < ATTR_LIMIT); - return (UBool)((explicitlySetAttributes & ((uint32_t)1 << attribute)) != 0); + return (explicitlySetAttributes & (static_cast<uint32_t>(1) << attribute)) != 0; } /** diff --git a/deps/icu-small/source/i18n/unicode/timezone.h b/deps/icu-small/source/i18n/unicode/timezone.h index e512ef7f92cf75..9591b7d90affad 100644 --- a/deps/icu-small/source/i18n/unicode/timezone.h +++ b/deps/icu-small/source/i18n/unicode/timezone.h @@ -163,7 +163,7 @@ class U_I18N_API TimeZone : public UObject { * @see getUnknown * @stable ICU 2.0 */ - static const TimeZone* U_EXPORT2 getGMT(void); + static const TimeZone* U_EXPORT2 getGMT(); /** * Creates a <code>TimeZone</code> for the given ID. @@ -323,7 +323,7 @@ class U_I18N_API TimeZone : public UObject { * @see #countEquivalentIDs * @stable ICU 2.0 */ - static const UnicodeString U_EXPORT2 getEquivalentID(const UnicodeString& id, + static UnicodeString U_EXPORT2 getEquivalentID(const UnicodeString& id, int32_t index); /** @@ -364,7 +364,7 @@ class U_I18N_API TimeZone : public UObject { * @see getUnknown * @stable ICU 2.0 */ - static TimeZone* U_EXPORT2 createDefault(void); + static TimeZone* U_EXPORT2 createDefault(); #ifndef U_HIDE_INTERNAL_API /** @@ -445,7 +445,6 @@ class U_I18N_API TimeZone : public UObject { UnicodeString& canonicalID, UBool& isSystemID, UErrorCode& status); -#ifndef U_HIDE_DRAFT_API /** * Returns the preferred time zone ID in the IANA time zone database for the given time zone ID. * There are two types of preferred IDs. The first type is the one defined in zone.tab file, @@ -469,11 +468,10 @@ class U_I18N_API TimeZone : public UObject { * @param status Receives the status. When the given time zone ID is not a known time zone * ID, U_ILLEGAL_ARGUMENT_ERROR is set. * @return A reference to the result. - * @draft ICU 74 + * @stable ICU 74 */ static UnicodeString& U_EXPORT2 getIanaID(const UnicodeString&id, UnicodeString& ianaID, UErrorCode& status); -#endif // U_HIDE_DRAFT_API /** * Converts a system time zone ID to an equivalent Windows time zone ID. For example, @@ -644,7 +642,7 @@ class U_I18N_API TimeZone : public UObject { * @return The TimeZone's raw GMT offset. * @stable ICU 2.0 */ - virtual int32_t getRawOffset(void) const = 0; + virtual int32_t getRawOffset() const = 0; /** * Fills in "ID" with the TimeZone's ID. @@ -813,7 +811,7 @@ class U_I18N_API TimeZone : public UObject { * * @stable ICU 2.0 */ - virtual UBool useDaylightTime(void) const = 0; + virtual UBool useDaylightTime() const = 0; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -857,7 +855,7 @@ class U_I18N_API TimeZone : public UObject { * @return The class ID for all objects of this class. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. This method is to @@ -870,8 +868,8 @@ class U_I18N_API TimeZone : public UObject { * same class ID. Objects of other classes have different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; - + virtual UClassID getDynamicClassID() const override = 0; + /** * Returns the amount of time to be added to local standard time * to get local wall clock time. diff --git a/deps/icu-small/source/i18n/unicode/tmunit.h b/deps/icu-small/source/i18n/unicode/tmunit.h index 24abb49f198274..1e0630993dbcbe 100644 --- a/deps/icu-small/source/i18n/unicode/tmunit.h +++ b/deps/icu-small/source/i18n/unicode/tmunit.h @@ -124,7 +124,6 @@ class U_I18N_API TimeUnit: public MeasureUnit { /** * Constructor - * @internal (private) */ TimeUnit(UTimeUnitFields timeUnitField); diff --git a/deps/icu-small/source/i18n/unicode/tmutamt.h b/deps/icu-small/source/i18n/unicode/tmutamt.h index 88e892fb0c26c2..c73673b629ec53 100644 --- a/deps/icu-small/source/i18n/unicode/tmutamt.h +++ b/deps/icu-small/source/i18n/unicode/tmutamt.h @@ -126,8 +126,7 @@ class U_I18N_API TimeUnitAmount: public Measure { * @return The class ID for all objects of this class. * @stable ICU 4.2 */ - static UClassID U_EXPORT2 getStaticClassID(void); - + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -140,8 +139,7 @@ class U_I18N_API TimeUnitAmount: public Measure { * other classes have different class IDs. * @stable ICU 4.2 */ - virtual UClassID getDynamicClassID(void) const override; - + virtual UClassID getDynamicClassID() const override; /** * Get the time unit. diff --git a/deps/icu-small/source/i18n/unicode/tmutfmt.h b/deps/icu-small/source/i18n/unicode/tmutfmt.h index 02e0563a010e63..4f4684a4d80d2d 100644 --- a/deps/icu-small/source/i18n/unicode/tmutfmt.h +++ b/deps/icu-small/source/i18n/unicode/tmutfmt.h @@ -171,7 +171,7 @@ class U_I18N_API TimeUnitFormat: public MeasureFormat { * @return The class ID for all objects of this class. * @deprecated ICU 53 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -184,7 +184,7 @@ class U_I18N_API TimeUnitFormat: public MeasureFormat { * other classes have different class IDs. * @deprecated ICU 53 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; private: Hashtable* fTimeUnitToCountToPatterns[TimeUnit::UTIMEUNIT_FIELD_COUNT]; diff --git a/deps/icu-small/source/i18n/unicode/translit.h b/deps/icu-small/source/i18n/unicode/translit.h index 9ae32967fc45dc..70ba1c87fa3863 100644 --- a/deps/icu-small/source/i18n/unicode/translit.h +++ b/deps/icu-small/source/i18n/unicode/translit.h @@ -938,7 +938,7 @@ class U_I18N_API Transliterator : public UObject { * transliterator needs to examine * @stable ICU 2.0 */ - int32_t getMaximumContextLength(void) const; + int32_t getMaximumContextLength() const; protected: @@ -962,7 +962,7 @@ class U_I18N_API Transliterator : public UObject { * @see #getAvailableIDs * @stable ICU 2.0 */ - virtual const UnicodeString& getID(void) const; + virtual const UnicodeString& getID() const; /** * Returns a name for this transliterator that is appropriate for @@ -1008,7 +1008,7 @@ class U_I18N_API Transliterator : public UObject { * if this transliterator uses no filter. * @stable ICU 2.0 */ - const UnicodeFilter* getFilter(void) const; + const UnicodeFilter* getFilter() const; /** * Returns the filter used by this transliterator, or <tt>nullptr</tt> if this @@ -1019,7 +1019,7 @@ class U_I18N_API Transliterator : public UObject { * transliterator uses no filter. * @stable ICU 2.4 */ - UnicodeFilter* orphanFilter(void); + UnicodeFilter* orphanFilter(); /** * Changes the filter used by this transliterator. If the filter @@ -1374,7 +1374,7 @@ class U_I18N_API Transliterator : public UObject { * @return the number of registered source specifiers. * @stable ICU 2.0 */ - static int32_t U_EXPORT2 countAvailableSources(void); + static int32_t U_EXPORT2 countAvailableSources(); /** * Return a registered source specifier. @@ -1448,7 +1448,7 @@ class U_I18N_API Transliterator : public UObject { * Non-mutexed internal method * @internal */ - static int32_t _countAvailableSources(void); + static int32_t _countAvailableSources(); /** * Non-mutexed internal method @@ -1510,7 +1510,7 @@ class U_I18N_API Transliterator : public UObject { * @return The class ID for class Transliterator. * @stable ICU 2.0 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID <b>polymorphically</b>. This method @@ -1527,7 +1527,7 @@ class U_I18N_API Transliterator : public UObject { * different class IDs. * @stable ICU 2.0 */ - virtual UClassID getDynamicClassID(void) const override = 0; + virtual UClassID getDynamicClassID() const override = 0; private: static UBool initializeRegistry(UErrorCode &status); @@ -1541,7 +1541,7 @@ class U_I18N_API Transliterator : public UObject { * @return the number of IDs currently registered with the system. * @obsolete ICU 3.4 use getAvailableIDs() instead */ - static int32_t U_EXPORT2 countAvailableIDs(void); + static int32_t U_EXPORT2 countAvailableIDs(); /** * Return the index-th available ID. index must be between 0 @@ -1559,14 +1559,14 @@ class U_I18N_API Transliterator : public UObject { #endif /* U_HIDE_OBSOLETE_API */ }; -inline int32_t Transliterator::getMaximumContextLength(void) const { +inline int32_t Transliterator::getMaximumContextLength() const { return maximumContextLength; } inline void Transliterator::setID(const UnicodeString& id) { ID = id; // NUL-terminate the ID string, which is a non-aliased copy. - ID.append((char16_t)0); + ID.append(static_cast<char16_t>(0)); ID.truncate(ID.length()-1); } diff --git a/deps/icu-small/source/i18n/unicode/tzfmt.h b/deps/icu-small/source/i18n/unicode/tzfmt.h index 4bd80e0e343ea1..78b31438b1cf19 100644 --- a/deps/icu-small/source/i18n/unicode/tzfmt.h +++ b/deps/icu-small/source/i18n/unicode/tzfmt.h @@ -271,25 +271,25 @@ class UVector; * @see TimeZoneNames * @stable ICU 50 */ -class U_I18N_API TimeZoneFormat : public Format { +class U_I18N_API_CLASS TimeZoneFormat : public Format { public: /** * Copy constructor. * @stable ICU 50 */ - TimeZoneFormat(const TimeZoneFormat& other); + U_I18N_API TimeZoneFormat(const TimeZoneFormat& other); /** * Destructor. * @stable ICU 50 */ - virtual ~TimeZoneFormat(); + U_I18N_API virtual ~TimeZoneFormat(); /** * Assignment operator. * @stable ICU 50 */ - TimeZoneFormat& operator=(const TimeZoneFormat& other); + U_I18N_API TimeZoneFormat& operator=(const TimeZoneFormat& other); /** * Return true if the given Format objects are semantically equal. @@ -299,7 +299,7 @@ class U_I18N_API TimeZoneFormat : public Format { * Objects of different subclasses are considered unequal. * @stable ICU 50 */ - virtual bool operator==(const Format& other) const override; + U_I18N_API virtual bool operator==(const Format& other) const override; /** * Clone this object polymorphically. The caller is responsible @@ -307,7 +307,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @return A copy of the object * @stable ICU 50 */ - virtual TimeZoneFormat* clone() const override; + U_I18N_API virtual TimeZoneFormat* clone() const override; /** * Creates an instance of <code>TimeZoneFormat</code> for the given locale. @@ -317,14 +317,14 @@ class U_I18N_API TimeZoneFormat : public Format { * owned by the caller. * @stable ICU 50 */ - static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status); + U_I18N_API static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status); /** * Returns the time zone display name data used by this instance. * @return The time zone display name data. * @stable ICU 50 */ - const TimeZoneNames* getTimeZoneNames() const; + U_I18N_API const TimeZoneNames* getTimeZoneNames() const; /** * Sets the time zone display name data to this format instance. @@ -333,14 +333,14 @@ class U_I18N_API TimeZoneFormat : public Format { * @param tznames TimeZoneNames object to be adopted. * @stable ICU 50 */ - void adoptTimeZoneNames(TimeZoneNames *tznames); + U_I18N_API void adoptTimeZoneNames(TimeZoneNames* tznames); /** * Sets the time zone display name data to this format instance. * @param tznames TimeZoneNames object to be set. * @stable ICU 50 */ - void setTimeZoneNames(const TimeZoneNames &tznames); + U_I18N_API void setTimeZoneNames(const TimeZoneNames& tznames); /** * Returns the localized GMT format pattern. @@ -349,7 +349,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #setGMTPattern * @stable ICU 50 */ - UnicodeString& getGMTPattern(UnicodeString& pattern) const; + U_I18N_API UnicodeString& getGMTPattern(UnicodeString& pattern) const; /** * Sets the localized GMT format pattern. The pattern must contain @@ -359,7 +359,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #getGMTPattern * @stable ICU 50 */ - void setGMTPattern(const UnicodeString& pattern, UErrorCode& status); + U_I18N_API void setGMTPattern(const UnicodeString& pattern, UErrorCode& status); /** * Returns the offset pattern used for localized GMT format. @@ -369,7 +369,8 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #setGMTOffsetPattern * @stable ICU 50 */ - UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, UnicodeString& pattern) const; + U_I18N_API UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, + UnicodeString& pattern) const; /** * Sets the offset pattern for the given offset type. @@ -379,7 +380,8 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #getGMTOffsetPattern * @stable ICU 50 */ - void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, const UnicodeString& pattern, UErrorCode& status); + U_I18N_API void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, + const UnicodeString& pattern, UErrorCode& status); /** * Returns the decimal digit characters used for localized GMT format. @@ -390,7 +392,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #setGMTOffsetDigits * @stable ICU 50 */ - UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const; + U_I18N_API UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const; /** * Sets the decimal digit characters used for localized GMT format. @@ -404,7 +406,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #getGMTOffsetDigits * @stable ICU 50 */ - void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status); + U_I18N_API void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status); /** * Returns the localized GMT format string for GMT(UTC) itself (GMT offset is 0). @@ -413,7 +415,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #setGMTZeroFormat * @stable ICU 50 */ - UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const; + U_I18N_API UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const; /** * Sets the localized GMT format string for GMT(UTC) itself (GMT offset is 0). @@ -422,7 +424,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #getGMTZeroFormat * @stable ICU 50 */ - void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status); + U_I18N_API void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status); /** * Returns the bitwise flags of UTimeZoneFormatParseOption representing the default parse @@ -431,7 +433,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see ParseOption * @stable ICU 50 */ - uint32_t getDefaultParseOptions(void) const; + U_I18N_API uint32_t getDefaultParseOptions() const; /** * Sets the default parse options. @@ -441,7 +443,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #UTimeZoneFormatParseOption * @stable ICU 50 */ - void setDefaultParseOptions(uint32_t flags); + U_I18N_API void setDefaultParseOptions(uint32_t flags); /** * Returns the ISO 8601 basic time zone string for the given offset. @@ -458,8 +460,12 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #parseOffsetISO8601 * @stable ICU 51 */ - UnicodeString& formatOffsetISO8601Basic(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds, - UnicodeString& result, UErrorCode& status) const; + U_I18N_API UnicodeString& formatOffsetISO8601Basic(int32_t offset, + UBool useUtcIndicator, + UBool isShort, + UBool ignoreSeconds, + UnicodeString& result, + UErrorCode& status) const; /** * Returns the ISO 8601 extended time zone string for the given offset. @@ -476,8 +482,12 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #parseOffsetISO8601 * @stable ICU 51 */ - UnicodeString& formatOffsetISO8601Extended(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds, - UnicodeString& result, UErrorCode& status) const; + U_I18N_API UnicodeString& formatOffsetISO8601Extended(int32_t offset, + UBool useUtcIndicator, + UBool isShort, + UBool ignoreSeconds, + UnicodeString& result, + UErrorCode& status) const; /** * Returns the localized GMT(UTC) offset format for the given offset. @@ -498,7 +508,9 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #parseOffsetLocalizedGMT * @stable ICU 50 */ - UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const; + U_I18N_API UnicodeString& formatOffsetLocalizedGMT(int32_t offset, + UnicodeString& result, + UErrorCode& status) const; /** * Returns the short localized GMT(UTC) offset format for the given offset. @@ -519,7 +531,9 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #parseOffsetShortLocalizedGMT * @stable ICU 51 */ - UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const; + U_I18N_API UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, + UnicodeString& result, + UErrorCode& status) const; using Format::format; @@ -536,8 +550,11 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #UTimeZoneFormatTimeType * @stable ICU 50 */ - virtual UnicodeString& format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate date, - UnicodeString& name, UTimeZoneFormatTimeType* timeType = nullptr) const; + U_I18N_API virtual UnicodeString& format(UTimeZoneFormatStyle style, + const TimeZone& tz, + UDate date, + UnicodeString& name, + UTimeZoneFormatTimeType* timeType = nullptr) const; /** * Returns offset from GMT(UTC) in milliseconds for the given ISO 8601 @@ -553,7 +570,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #formatOffsetISO8601Extended * @stable ICU 50 */ - int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const; + U_I18N_API int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const; /** * Returns offset from GMT(UTC) in milliseconds for the given localized GMT @@ -567,7 +584,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #formatOffsetLocalizedGMT * @stable ICU 50 */ - int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const; + U_I18N_API int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const; /** * Returns offset from GMT(UTC) in milliseconds for the given short localized GMT @@ -581,7 +598,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @see #formatOffsetShortLocalizedGMT * @stable ICU 51 */ - int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const; + U_I18N_API int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const; /** * Returns a <code>TimeZone</code> by parsing the time zone string according to @@ -599,8 +616,11 @@ class U_I18N_API TimeZoneFormat : public Format { * @see UTimeZoneFormatTimeType * @stable ICU 50 */ - virtual TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos, - int32_t parseOptions, UTimeZoneFormatTimeType* timeType = nullptr) const; + U_I18N_API virtual TimeZone* parse(UTimeZoneFormatStyle style, + const UnicodeString& text, + ParsePosition& pos, + int32_t parseOptions, + UTimeZoneFormatTimeType* timeType = nullptr) const; /** * Returns a <code>TimeZone</code> by parsing the time zone string according to @@ -617,8 +637,10 @@ class U_I18N_API TimeZoneFormat : public Format { * @see UTimeZoneFormatTimeType * @stable ICU 50 */ - TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos, - UTimeZoneFormatTimeType* timeType = nullptr) const; + U_I18N_API TimeZone* parse(UTimeZoneFormatStyle style, + const UnicodeString& text, + ParsePosition& pos, + UTimeZoneFormatTimeType* timeType = nullptr) const; /* ---------------------------------------------- * Format APIs @@ -635,8 +657,10 @@ class U_I18N_API TimeZoneFormat : public Format { * @return Reference to 'appendTo' parameter. * @stable ICU 50 */ - virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo, - FieldPosition& pos, UErrorCode& status) const override; + U_I18N_API virtual UnicodeString& format(const Formattable& obj, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const override; /** * Parse a string to produce an object. This methods handles parsing of @@ -650,19 +674,21 @@ class U_I18N_API TimeZoneFormat : public Format { * delete it when done. * @stable ICU 50 */ - virtual void parseObject(const UnicodeString& source, Formattable& result, ParsePosition& parse_pos) const override; + U_I18N_API virtual void parseObject(const UnicodeString& source, + Formattable& result, + ParsePosition& parse_pos) const override; /** * ICU "poor man's RTTI", returns a UClassID for this class. * @stable ICU 50 */ - static UClassID U_EXPORT2 getStaticClassID(void); + U_I18N_API static UClassID getStaticClassID(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * @stable ICU 50 */ - virtual UClassID getDynamicClassID() const override; + U_I18N_API virtual UClassID getDynamicClassID() const override; protected: /** @@ -671,7 +697,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @param status receives the status. * @stable ICU 50 */ - TimeZoneFormat(const Locale& locale, UErrorCode& status); + U_I18N_API TimeZoneFormat(const Locale& locale, UErrorCode& status); private: /* Locale of this object */ diff --git a/deps/icu-small/source/i18n/unicode/tzrule.h b/deps/icu-small/source/i18n/unicode/tzrule.h index 9ec1e96179c9f4..835e6b262f51aa 100644 --- a/deps/icu-small/source/i18n/unicode/tzrule.h +++ b/deps/icu-small/source/i18n/unicode/tzrule.h @@ -80,7 +80,7 @@ class U_I18N_API TimeZoneRule : public UObject { * @return The standard time offset from UTC in milliseconds. * @stable ICU 3.8 */ - int32_t getRawOffset(void) const; + int32_t getRawOffset() const; /** * Gets the amount of daylight saving delta time from the standard time. @@ -88,7 +88,7 @@ class U_I18N_API TimeZoneRule : public UObject { * in milliseconds. * @stable ICU 3.8 */ - int32_t getDSTSavings(void) const; + int32_t getDSTSavings() const; /** * Returns if this rule represents the same rule and offsets as another. @@ -340,7 +340,7 @@ class U_I18N_API InitialTimeZoneRule : public TimeZoneRule { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -353,7 +353,7 @@ class U_I18N_API InitialTimeZoneRule : public TimeZoneRule { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; /** @@ -461,7 +461,7 @@ class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule { * rule used by this time zone rule. * @stable ICU 3.8 */ - const DateTimeRule* getRule(void) const; + const DateTimeRule* getRule() const; /** * Gets the first year when this rule takes effect. @@ -469,7 +469,7 @@ class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule { * with 0 == 1 BCE, -1 == 2 BCE, etc. * @stable ICU 3.8 */ - int32_t getStartYear(void) const; + int32_t getStartYear() const; /** * Gets the end year when this rule takes effect. @@ -477,7 +477,7 @@ class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule { * with 0 == 1 BCE, -1 == 2 BCE, etc. * @stable ICU 3.8 */ - int32_t getEndYear(void) const; + int32_t getEndYear() const; /** * Gets the time when this rule takes effect in the given year. @@ -581,7 +581,7 @@ class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -594,7 +594,7 @@ class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; /** @@ -679,7 +679,7 @@ class U_I18N_API TimeArrayTimeZoneRule : public TimeZoneRule { * @return The time type used of the start times used by this rule. * @stable ICU 3.8 */ - DateTimeRule::TimeRuleType getTimeType(void) const; + DateTimeRule::TimeRuleType getTimeType() const; /** * Gets a start time at the index stored in this rule. @@ -697,7 +697,7 @@ class U_I18N_API TimeArrayTimeZoneRule : public TimeZoneRule { * @return The number of start times. * @stable ICU 3.8 */ - int32_t countStartTimes(void) const; + int32_t countStartTimes() const; /** * Returns if this rule represents the same rule and offsets as another. @@ -792,7 +792,7 @@ class U_I18N_API TimeArrayTimeZoneRule : public TimeZoneRule { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -805,7 +805,7 @@ class U_I18N_API TimeArrayTimeZoneRule : public TimeZoneRule { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; diff --git a/deps/icu-small/source/i18n/unicode/tztrans.h b/deps/icu-small/source/i18n/unicode/tztrans.h index 5adbeb35e43a66..57751c6fc23007 100644 --- a/deps/icu-small/source/i18n/unicode/tztrans.h +++ b/deps/icu-small/source/i18n/unicode/tztrans.h @@ -102,7 +102,7 @@ class U_I18N_API TimeZoneTransition : public UObject { * @return The time of the transition in milliseconds since the 1970 Jan 1 epoch time. * @stable ICU 3.8 */ - UDate getTime(void) const; + UDate getTime() const; /** * Sets the time of transition in milliseconds. @@ -116,7 +116,7 @@ class U_I18N_API TimeZoneTransition : public UObject { * @return The time zone rule used after the transition. * @stable ICU 3.8 */ - const TimeZoneRule* getFrom(void) const; + const TimeZoneRule* getFrom() const; /** * Sets the rule used before the transition. The caller remains @@ -155,7 +155,7 @@ class U_I18N_API TimeZoneTransition : public UObject { * @return The time zone rule used after the transition. * @stable ICU 3.8 */ - const TimeZoneRule* getTo(void) const; + const TimeZoneRule* getTo() const; private: UDate fTime; @@ -174,7 +174,7 @@ class U_I18N_API TimeZoneTransition : public UObject { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -187,7 +187,7 @@ class U_I18N_API TimeZoneTransition : public UObject { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h index f351b6c9dbb1eb..87b0532c40b9af 100644 --- a/deps/icu-small/source/i18n/unicode/ucal.h +++ b/deps/icu-small/source/i18n/unicode/ucal.h @@ -442,7 +442,6 @@ enum UCalendarDateFields { */ UCAL_IS_LEAP_MONTH, -#ifndef U_HIDE_DRAFT_API /** * Field number indicating the month. This is a calendar-specific value. * Differ from UCAL_MONTH, this value is continuous and unique within a @@ -464,10 +463,9 @@ enum UCalendarDateFields { * and there is an extra "Leap Month 5" which associated with UCAL_ORDINAL_MONTH * value 5 before "Month 6" of year 4664. * - * @draft ICU 73 + * @stable ICU 73 */ UCAL_ORDINAL_MONTH, -#endif // U_HIDE_DRAFT_API /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, * it is needed for layout of Calendar, DateFormat, and other objects */ @@ -476,12 +474,7 @@ enum UCalendarDateFields { * One more than the highest normal UCalendarDateFields value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ -#ifdef U_HIDE_DRAFT_API - // Must include all fields that will be in structs - UCAL_FIELD_COUNT = UCAL_IS_LEAP_MONTH + 2, -#else // U_HIDE_DRAFT_API (for UCAL_ORDINAL_MONTH) UCAL_FIELD_COUNT = UCAL_ORDINAL_MONTH + 1, -#endif // U_HIDE_DRAFT_API (for UCAL_ORDINAL_MONTH) #endif // U_FORCE_HIDE_DEPRECATED_API @@ -1394,7 +1387,6 @@ U_CAPI int32_t U_EXPORT2 ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len, UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status); -#ifndef U_HIDE_DRAFT_API /** * Returns the preferred time zone ID in the IANA time zone database for the given time zone ID. * There are two types of preferred IDs. The first type is the one defined in zone.tab file, @@ -1418,12 +1410,11 @@ ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len, * @param status Receives the status. When the given time zone ID is not a known system time zone * ID, U_ILLEGAL_ARGUMENT_ERROR is set. * @return The result string length, not including the terminating null. - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 ucal_getIanaTimeZoneID(const UChar* id, int32_t len, UChar* result, int32_t resultCapacity, UErrorCode* status); -#endif // U_HIDE_DRAFT_API /** * Get the resource keyword value string designating the calendar type for the UCalendar. @@ -1542,7 +1533,7 @@ ucal_isWeekend(const UCalendar *cal, UDate date, UErrorCode *status); /** * Return the difference between the target time and the time this calendar object is currently set to. - * If the target time is after the current calendar setting, the the returned value will be positive. + * If the target time is after the current calendar setting, the returned value will be positive. * The field parameter specifies the units of the return value. For example, if field is UCAL_MONTH * and ucal_getFieldDifference returns 3, then the target time is 3 to less than 4 months after the * current calendar setting. diff --git a/deps/icu-small/source/i18n/unicode/ucol.h b/deps/icu-small/source/i18n/unicode/ucol.h index e4ec2f74185aee..a107e90b5c2e33 100644 --- a/deps/icu-small/source/i18n/unicode/ucol.h +++ b/deps/icu-small/source/i18n/unicode/ucol.h @@ -418,7 +418,7 @@ ucol_open(const char *loc, UErrorCode *status); * Produce a UCollator instance according to the rules supplied. * The rules are used to change the default ordering, defined in the * UCA in a process called tailoring. The resulting UCollator pointer - * can be used in the same way as the one obtained by {@link #ucol_strcoll }. + * can be used in the same way as the one obtained by {@link #ucol_open }. * @param rules A string describing the collation rules. For the syntax * of the rules please see users guide. * @param rulesLength The length of rules, or -1 if null-terminated. @@ -426,8 +426,10 @@ ucol_open(const char *loc, UErrorCode *status); * UCOL_OFF (expect the text to not need normalization), * UCOL_ON (normalize), or * UCOL_DEFAULT (set the mode according to the rules) - * @param strength The default collation strength; one of UCOL_PRIMARY, UCOL_SECONDARY, - * UCOL_TERTIARY, UCOL_IDENTICAL,UCOL_DEFAULT_STRENGTH - can be also set in the rules. + * @param strength The collation strength; one of UCOL_PRIMARY, UCOL_SECONDARY, + * UCOL_TERTIARY, UCOL_QUATERNARY, UCOL_IDENTICAL, UCOL_DEFAULT_STRENGTH. + * If you want to set the strength via the rules, + * then use UCOL_DEFAULT to not override that. * @param parseError A pointer to UParseError to receive information about errors * occurred during parsing. This argument can currently be set * to NULL, but at users own risk. Please provide a real structure. @@ -1519,6 +1521,149 @@ ucol_openBinary(const uint8_t *bin, int32_t length, const UCollator *base, UErrorCode *status); +#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API + +#include <functional> +#include <string_view> +#include <type_traits> + +#include "unicode/char16ptr.h" +#include "unicode/unistr.h" + +namespace U_HEADER_ONLY_NAMESPACE { + +namespace collator { + +namespace internal { + +/** + * Function object for performing comparisons using a UCollator. + * @internal + */ +template <template <typename...> typename Compare, UCollationResult result> +class Predicate { + public: + /** @internal */ + explicit Predicate(const UCollator* ucol) : collator(ucol) {} + +#if U_SHOW_CPLUSPLUS_API + /** @internal */ + template < + typename T, typename U, + typename = std::enable_if_t<ConvertibleToU16StringView<T> && ConvertibleToU16StringView<U>>> + bool operator()(const T& lhs, const U& rhs) const { + return match(UnicodeString::readOnlyAlias(lhs), UnicodeString::readOnlyAlias(rhs)); + } +#else + /** @internal */ + bool operator()(std::u16string_view lhs, std::u16string_view rhs) const { + return match(lhs, rhs); + } + +#if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) + /** @internal */ + bool operator()(std::basic_string_view<uint16_t> lhs, std::basic_string_view<uint16_t> rhs) const { + return match({uprv_char16PtrFromUint16(lhs.data()), lhs.length()}, + {uprv_char16PtrFromUint16(rhs.data()), rhs.length()}); + } +#endif + +#if U_SIZEOF_WCHAR_T==2 + /** @internal */ + bool operator()(std::wstring_view lhs, std::wstring_view rhs) const { + return match({uprv_char16PtrFromWchar(lhs.data()), lhs.length()}, + {uprv_char16PtrFromWchar(rhs.data()), rhs.length()}); + } +#endif +#endif + + /** @internal */ + bool operator()(std::string_view lhs, std::string_view rhs) const { + return match(lhs, rhs); + } + +#if defined(__cpp_char8_t) + /** @internal */ + bool operator()(std::u8string_view lhs, std::u8string_view rhs) const { + return match({reinterpret_cast<const char*>(lhs.data()), lhs.length()}, + {reinterpret_cast<const char*>(rhs.data()), rhs.length()}); + } +#endif + + private: + bool match(std::u16string_view lhs, std::u16string_view rhs) const { + return compare( + ucol_strcoll( + collator, + toUCharPtr(lhs.data()), static_cast<int32_t>(lhs.length()), + toUCharPtr(rhs.data()), static_cast<int32_t>(rhs.length())), + result); + } + + bool match(std::string_view lhs, std::string_view rhs) const { + UErrorCode status = U_ZERO_ERROR; + return compare( + ucol_strcollUTF8( + collator, + lhs.data(), static_cast<int32_t>(lhs.length()), + rhs.data(), static_cast<int32_t>(rhs.length()), + &status), + result); + } + + const UCollator* const collator; + static constexpr Compare<UCollationResult> compare{}; +}; + +} // namespace internal + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::equal_to</code> but uses the collator instead of <code>operator==</code>. + * @stable ICU 76 + */ +using equal_to = internal::Predicate<std::equal_to, UCOL_EQUAL>; + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::greater</code> but uses the collator instead of <code>operator></code>. + * @stable ICU 76 + */ +using greater = internal::Predicate<std::equal_to, UCOL_GREATER>; + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::less</code> but uses the collator instead of <code>operator<</code>. + * @stable ICU 76 + */ +using less = internal::Predicate<std::equal_to, UCOL_LESS>; + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::not_equal_to</code> but uses the collator instead of <code>operator!=</code>. + * @stable ICU 76 + */ +using not_equal_to = internal::Predicate<std::not_equal_to, UCOL_EQUAL>; + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::greater_equal</code> but uses the collator instead of <code>operator>=</code>. + * @stable ICU 76 + */ +using greater_equal = internal::Predicate<std::not_equal_to, UCOL_LESS>; + +/** + * Function object for performing comparisons using this collator. + * Like <code>std::less_equal</code> but uses the collator instead of <code>operator<=</code>. + * @stable ICU 76 + */ +using less_equal = internal::Predicate<std::not_equal_to, UCOL_GREATER>; + +} // namespace collator + +} // namespace U_HEADER_ONLY_NAMESPACE + +#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API #endif /* #if !UCONFIG_NO_COLLATION */ diff --git a/deps/icu-small/source/i18n/unicode/udat.h b/deps/icu-small/source/i18n/unicode/udat.h index 3823dc88c4fa88..bfa318df1be92d 100644 --- a/deps/icu-small/source/i18n/unicode/udat.h +++ b/deps/icu-small/source/i18n/unicode/udat.h @@ -1542,7 +1542,21 @@ typedef enum UDateFormatSymbolType { * The narrow standalone quarter names, for example 1 * @stable ICU 70 */ - UDAT_STANDALONE_NARROW_QUARTERS + UDAT_STANDALONE_NARROW_QUARTERS, + +#ifndef U_HIDE_DRAFT_API + /** + * Narrow AM/PM names. For example: "A" and "P". + * @draft ICU 78 + */ + UDAT_AM_PMS_NARROW, + + /** + * Wide AM/PM names. For example: "Ante Meridiem" and "Post Meridiem". + * @draft ICU 78 + */ + UDAT_AM_PMS_WIDE, +#endif /* U_HIDE_DRAFT_API */ } UDateFormatSymbolType; struct UDateFormatSymbols; diff --git a/deps/icu-small/source/i18n/unicode/udatpg.h b/deps/icu-small/source/i18n/unicode/udatpg.h index 1d3060350ec0f1..edda227896bdc3 100644 --- a/deps/icu-small/source/i18n/unicode/udatpg.h +++ b/deps/icu-small/source/i18n/unicode/udatpg.h @@ -543,7 +543,7 @@ udatpg_getDateTimeFormat(const UDateTimePatternGenerator *dtpg, * @param style * one of UDAT_FULL..UDAT_SHORT. Error if out of range. * @param dateTimeFormat - * the new dateTimeFormat to set for the the specified style + * the new dateTimeFormat to set for the specified style * @param length * the length of dateTimeFormat, or -1 if unknown and pattern * is null-terminated diff --git a/deps/icu-small/source/i18n/unicode/ulocdata.h b/deps/icu-small/source/i18n/unicode/ulocdata.h index 3647df9596ae63..9ff7ec56a215c2 100644 --- a/deps/icu-small/source/i18n/unicode/ulocdata.h +++ b/deps/icu-small/source/i18n/unicode/ulocdata.h @@ -142,7 +142,7 @@ ulocdata_setNoSubstitute(ULocaleData *uld, UBool setting); * data available for that method, given the locale ID * supplied to ulocdata_open(). * - * @param uld Pointer to the The locale data object to set. + * @param uld Pointer to the locale data object to set. * @return UBool Value of the "no substitute" attribute. * @stable ICU 3.4 */ diff --git a/deps/icu-small/source/i18n/unicode/usimplenumberformatter.h b/deps/icu-small/source/i18n/unicode/usimplenumberformatter.h index ef89b46b9c5cdd..ccc5754b4348bb 100644 --- a/deps/icu-small/source/i18n/unicode/usimplenumberformatter.h +++ b/deps/icu-small/source/i18n/unicode/usimplenumberformatter.h @@ -50,31 +50,28 @@ * </pre> */ -#ifndef U_HIDE_DRAFT_API - - /** * An explicit sign option for a SimpleNumber. * - * @draft ICU 73 + * @stable ICU 73 */ typedef enum USimpleNumberSign { /** * Render a plus sign. * - * @draft ICU 73 + * @stable ICU 73 */ UNUM_SIMPLE_NUMBER_PLUS_SIGN, /** * Render no sign. * - * @draft ICU 73 + * @stable ICU 73 */ UNUM_SIMPLE_NUMBER_NO_SIGN, /** * Render a minus sign. * - * @draft ICU 73 + * @stable ICU 73 */ UNUM_SIMPLE_NUMBER_MINUS_SIGN, } USimpleNumberSign; @@ -84,7 +81,7 @@ struct USimpleNumber; /** * C-compatible version of icu::number::SimpleNumber. * - * @draft ICU 73 + * @stable ICU 73 */ typedef struct USimpleNumber USimpleNumber; @@ -93,7 +90,7 @@ struct USimpleNumberFormatter; /** * C-compatible version of icu::number::SimpleNumberFormatter. * - * @draft ICU 73 + * @stable ICU 73 */ typedef struct USimpleNumberFormatter USimpleNumberFormatter; @@ -101,7 +98,7 @@ typedef struct USimpleNumberFormatter USimpleNumberFormatter; /** * Creates a new USimpleNumber to be formatted with a USimpleNumberFormatter. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI USimpleNumber* U_EXPORT2 usnum_openForInt64(int64_t value, UErrorCode* ec); @@ -112,7 +109,7 @@ usnum_openForInt64(int64_t value, UErrorCode* ec); * * This can be used to reset the number value after formatting. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_setToInt64(USimpleNumber* unumber, int64_t value, UErrorCode* ec); @@ -123,18 +120,19 @@ usnum_setToInt64(USimpleNumber* unumber, int64_t value, UErrorCode* ec); * * This function immediately mutates the inner value. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_multiplyByPowerOfTen(USimpleNumber* unumber, int32_t power, UErrorCode* ec); /** - * Rounds the value currently stored in the USimpleNumber to the given power of 10. + * Rounds the value currently stored in the USimpleNumber to the given power of 10, + * which can be before or after the decimal separator. * - * This function immediately mutates the inner value. + * This function does not change minimum integer digits. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_roundTo(USimpleNumber* unumber, int32_t power, UNumberFormatRoundingMode roundingMode, UErrorCode* ec); @@ -143,9 +141,7 @@ usnum_roundTo(USimpleNumber* unumber, int32_t power, UNumberFormatRoundingMode r /** * Pads the beginning of the number with zeros up to the given minimum number of integer digits. * - * This setting is applied upon formatting the number. - * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_setMinimumIntegerDigits(USimpleNumber* unumber, int32_t minimumIntegerDigits, UErrorCode* ec); @@ -154,23 +150,19 @@ usnum_setMinimumIntegerDigits(USimpleNumber* unumber, int32_t minimumIntegerDigi /** * Pads the end of the number with zeros up to the given minimum number of fraction digits. * - * This setting is applied upon formatting the number. - * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_setMinimumFractionDigits(USimpleNumber* unumber, int32_t minimumFractionDigits, UErrorCode* ec); /** - * Truncates digits from the beginning of the number to the given maximum number of integer digits. + * Sets the number of integer digits to the given amount, truncating if necessary. * - * This function immediately mutates the inner value. - * - * @draft ICU 73 + * @stable ICU 75 */ U_CAPI void U_EXPORT2 -usnum_truncateStart(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec); +usnum_setMaximumIntegerDigits(USimpleNumber* unumber, int32_t maximumIntegerDigits, UErrorCode* ec); /** @@ -180,7 +172,7 @@ usnum_truncateStart(USimpleNumber* unumber, int32_t maximumIntegerDigits, UError * * NOTE: This does not support accounting sign notation. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_setSign(USimpleNumber* unumber, USimpleNumberSign sign, UErrorCode* ec); @@ -189,7 +181,7 @@ usnum_setSign(USimpleNumber* unumber, USimpleNumberSign sign, UErrorCode* ec); /** * Creates a new USimpleNumberFormatter with all locale defaults. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI USimpleNumberFormatter* U_EXPORT2 usnumf_openForLocale(const char* locale, UErrorCode* ec); @@ -198,7 +190,7 @@ usnumf_openForLocale(const char* locale, UErrorCode* ec); /** * Creates a new USimpleNumberFormatter, overriding the grouping strategy. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI USimpleNumberFormatter* U_EXPORT2 usnumf_openForLocaleAndGroupingStrategy( @@ -211,7 +203,7 @@ usnumf_openForLocaleAndGroupingStrategy( * The USimpleNumber is cleared after calling this function. It can be re-used via * usnum_setToInt64. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnumf_format( @@ -226,7 +218,7 @@ usnumf_format( * * For more control over the formatting, use USimpleNumber. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnumf_formatInt64( @@ -241,7 +233,7 @@ usnumf_formatInt64( * * NOTE: Normally, a USimpleNumber should be adopted by usnumf_formatAndAdoptNumber. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnum_close(USimpleNumber* unumber); @@ -250,7 +242,7 @@ usnum_close(USimpleNumber* unumber); /** * Frees the memory held by a USimpleNumberFormatter. * - * @draft ICU 73 + * @stable ICU 73 */ U_CAPI void U_EXPORT2 usnumf_close(USimpleNumberFormatter* uformatter); @@ -275,7 +267,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 73 + * @stable ICU 73 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberPointer, USimpleNumber, usnum_close); @@ -292,14 +284,12 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberPointer, USimpleNumber, usnum_clos * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 73 + * @stable ICU 73 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSimpleNumberFormatterPointer, USimpleNumberFormatter, usnumf_close); U_NAMESPACE_END #endif // U_SHOW_CPLUSPLUS_API -#endif // U_HIDE_DRAFT_API - #endif /* #if !UCONFIG_NO_FORMATTING */ #endif //__USIMPLENUMBERFORMATTER_H__ diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h index 20d29d62b23fd4..4e029fe951c9ac 100644 --- a/deps/icu-small/source/i18n/unicode/uspoof.h +++ b/deps/icu-small/source/i18n/unicode/uspoof.h @@ -1224,7 +1224,6 @@ uspoof_areConfusable(const USpoofChecker *sc, const UChar *id2, int32_t length2, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * Check whether two specified strings are visually confusable when * displayed in a context with the given paragraph direction. @@ -1269,13 +1268,12 @@ uspoof_areConfusable(const USpoofChecker *sc, * enum USpoofChecks. Zero is returned if the identifiers * are not confusable. * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI uint32_t U_EXPORT2 uspoof_areBidiConfusable(const USpoofChecker *sc, UBiDiDirection direction, const UChar *id1, int32_t length1, const UChar *id2, int32_t length2, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * A version of {@link uspoof_areConfusable} accepting strings in UTF-8 format. @@ -1308,7 +1306,6 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, const char *id2, int32_t length2, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * A version of {@link uspoof_areBidiConfusable} accepting strings in UTF-8 format. * @@ -1332,7 +1329,7 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, * enum USpoofChecks. Zero is returned if the strings * are not confusable. * - * @draft ICU 74 + * @stable ICU 74 * * @see uspoof_areBidiConfusable */ @@ -1340,7 +1337,6 @@ U_CAPI uint32_t U_EXPORT2 uspoof_areBidiConfusableUTF8(const USpoofChecker *sc, const char *id1, int32_t length1, const char *id2, int32_t length2, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * Get the "skeleton" for an identifier. @@ -1380,7 +1376,6 @@ uspoof_getSkeleton(const USpoofChecker *sc, UChar *dest, int32_t destCapacity, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * Get the "bidiSkeleton" for an identifier and a direction. * Skeletons are a transformation of the input identifier; @@ -1410,14 +1405,13 @@ uspoof_getSkeleton(const USpoofChecker *sc, * is always that of the complete skeleton, even when the * supplied buffer is too small (or of zero length) * - * @draft ICU 74 + * @stable ICU 74 * @see uspoof_areBidiConfusable */ U_CAPI int32_t U_EXPORT2 uspoof_getBidiSkeleton(const USpoofChecker *sc, UBiDiDirection direction, const UChar *id, int32_t length, UChar *dest, int32_t destCapacity, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * Get the "skeleton" for an identifier. @@ -1459,7 +1453,6 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc, char *dest, int32_t destCapacity, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * Get the "bidiSkeleton" for an identifier and a direction. * Skeletons are a transformation of the input identifier; @@ -1492,12 +1485,11 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc, * is always that of the complete skeleton, even when the * supplied buffer is too small (or of zero length) * - * @draft ICU 74 + * @stable ICU 74 */ U_CAPI int32_t U_EXPORT2 uspoof_getBidiSkeletonUTF8(const USpoofChecker *sc, UBiDiDirection direction, const char *id, int32_t length, char *dest, int32_t destCapacity, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * Get the set of Candidate Characters for Inclusion in Identifiers, as defined @@ -1736,7 +1728,6 @@ uspoof_areConfusableUnicodeString(const USpoofChecker *sc, const icu::UnicodeString &s2, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * A version of {@link uspoof_areBidiConfusable} accepting UnicodeStrings. * @@ -1756,7 +1747,7 @@ uspoof_areConfusableUnicodeString(const USpoofChecker *sc, * enum USpoofChecks. Zero is returned if the identifiers * are not confusable. * - * @draft ICU 74 + * @stable ICU 74 * * @see uspoof_areBidiConfusable */ @@ -1765,7 +1756,6 @@ U_CAPI uint32_t U_EXPORT2 uspoof_areBidiConfusableUnicodeString(const USpoofChec const icu::UnicodeString &s1, const icu::UnicodeString &s2, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * Get the "skeleton" for an identifier. @@ -1797,7 +1787,6 @@ uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, icu::UnicodeString &dest, UErrorCode *status); -#ifndef U_HIDE_DRAFT_API /** * Get the "bidiSkeleton" for an identifier and a direction. * Skeletons are a transformation of the input identifier; @@ -1820,12 +1809,11 @@ uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, * perform the check. * @return A reference to the destination (skeleton) string. * - * @draft ICU 74 + * @stable ICU 74 */ U_I18N_API icu::UnicodeString &U_EXPORT2 uspoof_getBidiSkeletonUnicodeString( const USpoofChecker *sc, UBiDiDirection direction, const icu::UnicodeString &id, icu::UnicodeString &dest, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** * Get the set of Candidate Characters for Inclusion in Identifiers, as defined diff --git a/deps/icu-small/source/i18n/unicode/vtzone.h b/deps/icu-small/source/i18n/unicode/vtzone.h index 93f4ecb93958fb..5e5e8d7d7ef7cb 100644 --- a/deps/icu-small/source/i18n/unicode/vtzone.h +++ b/deps/icu-small/source/i18n/unicode/vtzone.h @@ -289,7 +289,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone { * @return The TimeZone's raw GMT offset. * @stable ICU 3.8 */ - virtual int32_t getRawOffset(void) const override; + virtual int32_t getRawOffset() const override; /** * Queries if this time zone uses daylight savings time. @@ -297,7 +297,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone { * false, otherwise. * @stable ICU 3.8 */ - virtual UBool useDaylightTime(void) const override; + virtual UBool useDaylightTime() const override; #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -445,7 +445,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone { * @return The class ID for all objects of this class. * @stable ICU 3.8 */ - static UClassID U_EXPORT2 getStaticClassID(void); + static UClassID U_EXPORT2 getStaticClassID(); /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This @@ -458,7 +458,7 @@ class U_I18N_API VTimeZone : public BasicTimeZone { * other classes have different class IDs. * @stable ICU 3.8 */ - virtual UClassID getDynamicClassID(void) const override; + virtual UClassID getDynamicClassID() const override; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/units_complexconverter.h b/deps/icu-small/source/i18n/units_complexconverter.h index d56ce8d4ce378f..74799df5f010a6 100644 --- a/deps/icu-small/source/i18n/units_complexconverter.h +++ b/deps/icu-small/source/i18n/units_complexconverter.h @@ -17,24 +17,6 @@ U_NAMESPACE_BEGIN -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -// -// Note: These need to be outside of the units namespace, or Clang will generate -// a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<units::UnitsConverter*, 8>; -template class U_I18N_API MemoryPool<units::UnitsConverter, 8>; -template class U_I18N_API MaybeStackVector<units::UnitsConverter, 8>; -template class U_I18N_API MaybeStackArray<MeasureUnitImpl*, 8>; -template class U_I18N_API MemoryPool<MeasureUnitImpl, 8>; -template class U_I18N_API MaybeStackVector<MeasureUnitImpl, 8>; -template class U_I18N_API MaybeStackArray<MeasureUnit*, 8>; -template class U_I18N_API MemoryPool<MeasureUnit, 8>; -template class U_I18N_API MaybeStackVector<MeasureUnit, 8>; -#endif - namespace units { /** @@ -46,7 +28,7 @@ namespace units { * single unit to another single unit). Therefore, `ComplexUnitsConverter` class contains multiple * instances of the `UnitsConverter` to perform the conversion. */ -class U_I18N_API ComplexUnitsConverter : public UMemory { +class U_I18N_API_CLASS ComplexUnitsConverter : public UMemory { public: /** * Constructs `ComplexUnitsConverter` for an `targetUnit` that could be Single, Compound or Mixed. @@ -75,8 +57,9 @@ class U_I18N_API ComplexUnitsConverter : public UMemory { * @param outputUnits represents the output unit. could be any type. (single, compound or mixed). * @param status */ - ComplexUnitsConverter(StringPiece inputUnitIdentifier, StringPiece outputUnitsIdentifier, - UErrorCode &status); + U_I18N_API ComplexUnitsConverter(StringPiece inputUnitIdentifier, + StringPiece outputUnitsIdentifier, + UErrorCode &status); /** * Constructor of `ComplexUnitsConverter`. @@ -89,8 +72,10 @@ class U_I18N_API ComplexUnitsConverter : public UMemory { * @param ratesInfo a ConversionRates instance containing the unit conversion rates. * @param status */ - ComplexUnitsConverter(const MeasureUnitImpl &inputUnit, const MeasureUnitImpl &outputUnits, - const ConversionRates &ratesInfo, UErrorCode &status); + U_I18N_API ComplexUnitsConverter(const MeasureUnitImpl &inputUnit, + const MeasureUnitImpl &outputUnits, + const ConversionRates &ratesInfo, + UErrorCode &status); // Returns true if the specified `quantity` of the `inputUnit`, expressed in terms of the biggest // unit in the MeasureUnit `outputUnit`, is greater than or equal to `limit`. @@ -105,7 +90,7 @@ class U_I18N_API ComplexUnitsConverter : public UMemory { // NOTE: // the smallest element is the only element that could have fractional values. And all // other elements are floored to the nearest integer - MaybeStackVector<Measure> + U_I18N_API MaybeStackVector<Measure> convert(double quantity, icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const; // TODO(ICU-21937): Make it private after submitting the public units conversion API. diff --git a/deps/icu-small/source/i18n/units_converter.cpp b/deps/icu-small/source/i18n/units_converter.cpp index 6758c129e5373b..a9df393205f020 100644 --- a/deps/icu-small/source/i18n/units_converter.cpp +++ b/deps/icu-small/source/i18n/units_converter.cpp @@ -7,6 +7,7 @@ #include "charstr.h" #include "cmemory.h" +#include "cstring.h" #include "double-conversion-string-to-double.h" #include "measunit_impl.h" #include "putilimp.h" @@ -23,7 +24,7 @@ U_NAMESPACE_BEGIN namespace units { -void U_I18N_API Factor::multiplyBy(const Factor &rhs) { +void Factor::multiplyBy(const Factor& rhs) { factorNum *= rhs.factorNum; factorDen *= rhs.factorDen; for (int i = 0; i < CONSTANTS_COUNT; i++) { @@ -36,7 +37,7 @@ void U_I18N_API Factor::multiplyBy(const Factor &rhs) { offset = std::max(rhs.offset, offset); } -void U_I18N_API Factor::divideBy(const Factor &rhs) { +void Factor::divideBy(const Factor& rhs) { factorNum *= rhs.factorDen; factorDen *= rhs.factorNum; for (int i = 0; i < CONSTANTS_COUNT; i++) { @@ -49,7 +50,9 @@ void U_I18N_API Factor::divideBy(const Factor &rhs) { offset = std::max(rhs.offset, offset); } -void U_I18N_API Factor::power(int32_t power) { +void Factor::divideBy(const uint64_t constant) { factorDen *= constant; } + +void Factor::power(int32_t power) { // multiply all the constant by the power. for (int i = 0; i < CONSTANTS_COUNT; i++) { constantExponents[i] *= power; @@ -67,14 +70,15 @@ void U_I18N_API Factor::power(int32_t power) { } } -void U_I18N_API Factor::applyPrefix(UMeasurePrefix unitPrefix) { +void Factor::applyPrefix(UMeasurePrefix unitPrefix) { if (unitPrefix == UMeasurePrefix::UMEASURE_PREFIX_ONE) { // No need to do anything return; } int32_t prefixPower = umeas_getPrefixPower(unitPrefix); - double prefixFactor = std::pow((double)umeas_getPrefixBase(unitPrefix), (double)std::abs(prefixPower)); + double prefixFactor = std::pow(static_cast<double>(umeas_getPrefixBase(unitPrefix)), + static_cast<double>(std::abs(prefixPower))); if (prefixPower >= 0) { factorNum *= prefixFactor; } else { @@ -82,7 +86,7 @@ void U_I18N_API Factor::applyPrefix(UMeasurePrefix unitPrefix) { } } -void U_I18N_API Factor::substituteConstants() { +void Factor::substituteConstants() { for (int i = 0; i < CONSTANTS_COUNT; i++) { if (this->constantExponents[i] == 0) { continue; @@ -180,7 +184,7 @@ void addFactorElement(Factor &factor, StringPiece elementStr, Signum signum, UEr Factor extractFactorConversions(StringPiece stringFactor, UErrorCode &status) { Factor result; Signum signum = Signum::POSITIVE; - auto factorData = stringFactor.data(); + const auto* factorData = stringFactor.data(); for (int32_t i = 0, start = 0, n = stringFactor.length(); i < n; i++) { if (factorData[i] == '*' || factorData[i] == '/') { StringPiece factorElement = stringFactor.substr(start, i - start); @@ -202,15 +206,15 @@ Factor extractFactorConversions(StringPiece stringFactor, UErrorCode &status) { // Load factor for a single source Factor loadSingleFactor(StringPiece source, const ConversionRates &ratesInfo, UErrorCode &status) { - const auto conversionUnit = ratesInfo.extractConversionInfo(source, status); - if (U_FAILURE(status)) return Factor(); + const auto* const conversionUnit = ratesInfo.extractConversionInfo(source, status); + if (U_FAILURE(status)) return {}; if (conversionUnit == nullptr) { status = U_INTERNAL_PROGRAM_ERROR; - return Factor(); + return {}; } - Factor result = extractFactorConversions(conversionUnit->factor.toStringPiece(), status); - result.offset = strHasDivideSignToDouble(conversionUnit->offset.toStringPiece(), status); + Factor result = extractFactorConversions(conversionUnit->factor.data(), status); + result.offset = strHasDivideSignToDouble(conversionUnit->offset.data(), status); return result; } @@ -238,6 +242,12 @@ Factor loadCompoundFactor(const MeasureUnitImpl &source, const ConversionRates & result.multiplyBy(singleFactor); } + // If the source has a constant denominator, then we need to divide the + // factor by the constant denominator. + if (source.constantDenominator != 0) { + result.divideBy(source.constantDenominator); + } + return result; } @@ -270,49 +280,103 @@ UBool checkSimpleUnit(const MeasureUnitImpl &unit, UErrorCode &status) { return true; } +// Map the MeasureUnitImpl for a simpleUnit to a SingleUnitImpl, then use that +// SingleUnitImpl's simpleUnitID to get the corresponding ConversionRateInfo; +// from that we get the specialMappingName (which may be empty if the simple unit +// converts to base using factor + offset instelad of a special mapping). +StringPiece getSpecialMappingName(const MeasureUnitImpl& simpleUnit, const ConversionRates& ratesInfo, + UErrorCode& status) { + if (!checkSimpleUnit(simpleUnit, status)) { + return {}; + } + SingleUnitImpl singleUnit = *simpleUnit.singleUnits[0]; + const auto* const conversionUnit = + ratesInfo.extractConversionInfo(singleUnit.getSimpleUnitID(), status); + if (U_FAILURE(status)) { + return {}; + } + if (conversionUnit == nullptr) { + status = U_INTERNAL_PROGRAM_ERROR; + return {}; + } + return conversionUnit->specialMappingName.data(); +} + /** * Extract conversion rate from `source` to `target` */ // In ICU4J, this function is partially inlined in the UnitsConverter constructor. +// TODO ICU-22683: Consider splitting handling of special mappings into separate class void loadConversionRate(ConversionRate &conversionRate, const MeasureUnitImpl &source, const MeasureUnitImpl &target, Convertibility unitsState, const ConversionRates &ratesInfo, UErrorCode &status) { - // Represents the conversion factor from the source to the target. - Factor finalFactor; - - // Represents the conversion factor from the source to the base unit that specified in the conversion - // data which is considered as the root of the source and the target. - Factor sourceToBase = loadCompoundFactor(source, ratesInfo, status); - Factor targetToBase = loadCompoundFactor(target, ratesInfo, status); - - // Merger Factors - finalFactor.multiplyBy(sourceToBase); - if (unitsState == Convertibility::CONVERTIBLE) { - finalFactor.divideBy(targetToBase); - } else if (unitsState == Convertibility::RECIPROCAL) { - finalFactor.multiplyBy(targetToBase); - } else { - status = UErrorCode::U_ARGUMENT_TYPE_MISMATCH; + StringPiece specialSource = getSpecialMappingName(source, ratesInfo, status); + StringPiece specialTarget = getSpecialMappingName(target, ratesInfo, status); + + conversionRate.specialSource = specialSource; + conversionRate.specialTarget = specialTarget; + + if (conversionRate.specialSource.isEmpty() != specialSource.empty() || + conversionRate.specialTarget.isEmpty() != specialTarget.empty()) { + status = U_MEMORY_ALLOCATION_ERROR; return; } - finalFactor.substituteConstants(); + if (conversionRate.specialSource.isEmpty() && conversionRate.specialTarget.isEmpty()) { + // Represents the conversion factor from the source to the target. + Factor finalFactor; - conversionRate.factorNum = finalFactor.factorNum; - conversionRate.factorDen = finalFactor.factorDen; + // Represents the conversion factor from the source to the base unit that specified in the conversion + // data which is considered as the root of the source and the target. + Factor sourceToBase = loadCompoundFactor(source, ratesInfo, status); + Factor targetToBase = loadCompoundFactor(target, ratesInfo, status); - // This code corresponds to ICU4J's ConversionRates.getOffset(). - // In case of simple units (such as: celsius or fahrenheit), offsets are considered. - if (checkSimpleUnit(source, status) && checkSimpleUnit(target, status)) { - conversionRate.sourceOffset = - sourceToBase.offset * sourceToBase.factorDen / sourceToBase.factorNum; - conversionRate.targetOffset = - targetToBase.offset * targetToBase.factorDen / targetToBase.factorNum; - } - // TODO(icu-units#127): should we consider failure if there's an offset for - // a not-simple-unit? What about kilokelvin / kilocelsius? + // Merger Factors + finalFactor.multiplyBy(sourceToBase); + if (unitsState == Convertibility::CONVERTIBLE) { + finalFactor.divideBy(targetToBase); + } else if (unitsState == Convertibility::RECIPROCAL) { + finalFactor.multiplyBy(targetToBase); + } else { + status = UErrorCode::U_ARGUMENT_TYPE_MISMATCH; + return; + } + + finalFactor.substituteConstants(); - conversionRate.reciprocal = unitsState == Convertibility::RECIPROCAL; + conversionRate.factorNum = finalFactor.factorNum; + conversionRate.factorDen = finalFactor.factorDen; + + // This code corresponds to ICU4J's ConversionRates.getOffset(). + // In case of simple units (such as: celsius or fahrenheit), offsets are considered. + if (checkSimpleUnit(source, status) && checkSimpleUnit(target, status)) { + conversionRate.sourceOffset = + sourceToBase.offset * sourceToBase.factorDen / sourceToBase.factorNum; + conversionRate.targetOffset = + targetToBase.offset * targetToBase.factorDen / targetToBase.factorNum; + } + // TODO(icu-units#127): should we consider failure if there's an offset for + // a not-simple-unit? What about kilokelvin / kilocelsius? + + conversionRate.reciprocal = unitsState == Convertibility::RECIPROCAL; + } else if (conversionRate.specialSource.isEmpty() || conversionRate.specialTarget.isEmpty()) { + // Still need to set factorNum/factorDen for either source to base or base to target + if (unitsState != Convertibility::CONVERTIBLE) { + status = UErrorCode::U_ARGUMENT_TYPE_MISMATCH; + return; + } + Factor finalFactor; + if (conversionRate.specialSource.isEmpty()) { + // factorNum/factorDen is for source to base only + finalFactor = loadCompoundFactor(source, ratesInfo, status); + } else { + // factorNum/factorDen is for base to target only + finalFactor = loadCompoundFactor(target, ratesInfo, status); + } + finalFactor.substituteConstants(); + conversionRate.factorNum = finalFactor.factorNum; + conversionRate.factorDen = finalFactor.factorDen; + } } struct UnitIndexAndDimension : UMemory { @@ -418,9 +482,9 @@ void U_I18N_API addSingleFactorConstant(StringPiece baseStr, int32_t power, Sign * Extracts the compound base unit of a compound unit (`source`). For example, if the source unit is * `square-mile-per-hour`, the compound base unit will be `square-meter-per-second` */ -MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source, - const ConversionRates &conversionRates, - UErrorCode &status) { +MeasureUnitImpl extractCompoundBaseUnit(const MeasureUnitImpl& source, + const ConversionRates& conversionRates, + UErrorCode& status) { MeasureUnitImpl result; if (U_FAILURE(status)) return result; @@ -430,7 +494,7 @@ MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source const auto &singleUnit = *singleUnits[i]; // Extract `ConversionRateInfo` using the absolute unit. For example: in case of `square-meter`, // we will use `meter` - const auto rateInfo = + const auto* const rateInfo = conversionRates.extractConversionInfo(singleUnit.getSimpleUnitID(), status); if (U_FAILURE(status)) { return result; @@ -443,7 +507,7 @@ MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source // Multiply the power of the singleUnit by the power of the baseUnit. For example, square-hectare // must be pow4-meter. (NOTE: hectare --> square-meter) auto baseUnits = - MeasureUnitImpl::forIdentifier(rateInfo->baseUnit.toStringPiece(), status).singleUnits; + MeasureUnitImpl::forIdentifier(rateInfo->baseUnit.data(), status).singleUnits; for (int32_t i = 0, baseUnitsCount = baseUnits.length(); i < baseUnitsCount; i++) { baseUnits[i]->dimensionality *= singleUnit.dimensionality; // TODO: Deal with SI-prefix @@ -569,6 +633,21 @@ int32_t UnitsConverter::compareTwoUnits(const MeasureUnitImpl &firstUnit, return 0; } + StringPiece firstSpecial = getSpecialMappingName(firstUnit, ratesInfo, status); + StringPiece secondSpecial = getSpecialMappingName(secondUnit, ratesInfo, status); + if (!firstSpecial.empty() || !secondSpecial.empty()) { + if (firstSpecial.empty()) { + // non-specials come first + return -1; + } + if (secondSpecial.empty()) { + // non-specials come first + return 1; + } + // both are specials, compare lexicographically + return firstSpecial.compare(secondSpecial); + } + // Represents the conversion factor from the firstUnit to the base // unit that specified in the conversion data which is considered as // the root of the firstUnit and the secondUnit. @@ -593,8 +672,115 @@ int32_t UnitsConverter::compareTwoUnits(const MeasureUnitImpl &firstUnit, return 0; } +// TODO per CLDR-17421 and ICU-22683: consider getting the data below from CLDR +static double minMetersPerSecForBeaufort[] = { + // Minimum m/s (base) values for each Bft value, plus an extra artificial value; + // when converting from Bft to m/s, the middle of the range will be used + // (Values from table in Wikipedia, except for artificial value). + // Since this is 0 based, max Beaufort value is thus array dimension minus 2. + 0.0, // 0 Bft + 0.3, // 1 + 1.6, // 2 + 3.4, // 3 + 5.5, // 4 + 8.0, // 5 + 10.8, // 6 + 13.9, // 7 + 17.2, // 8 + 20.8, // 9 + 24.5, // 10 + 28.5, // 11 + 32.7, // 12 + 36.9, // 13 + 41.4, // 14 + 46.1, // 15 + 51.1, // 16 + 55.8, // 17 + 61.4, // artificial end of range 17 to give reasonable midpoint +}; + +static int maxBeaufort = UPRV_LENGTHOF(minMetersPerSecForBeaufort) - 2; + +// Convert from what should be discrete scale values for a particular unit like beaufort +// to a corresponding value in the base unit (which can have any decimal value, like meters/sec). +// First we round the scale value to the nearest integer (in case it is specified with a fractional value), +// then we map that to a value in middle of the range of corresponding base values. +// This can handle different scales, specified by minBaseForScaleValues[]. +double UnitsConverter::scaleToBase(double scaleValue, double minBaseForScaleValues[], int scaleMax) const { + if (scaleValue < 0) { + scaleValue = -scaleValue; + } + scaleValue += 0.5; // adjust up for later truncation + if (scaleValue > static_cast<double>(scaleMax)) { + scaleValue = static_cast<double>(scaleMax); + } + int scaleInt = static_cast<int>(scaleValue); + return (minBaseForScaleValues[scaleInt] + minBaseForScaleValues[scaleInt+1])/2.0; +} + +// Binary search to find the range that includes key; +// if key (non-negative) is in the range rangeStarts[i] to just under rangeStarts[i+1], +// then we return i; if key is >= rangeStarts[max] then we return max. +// Note that max is the maximum scale value, not the number of elements in the array +// (which should be larger than max). +// The ranges for index 0 start at 0.0. +static int bsearchRanges(double rangeStarts[], int max, double key) { + if (key >= rangeStarts[max]) { + return max; + } + int beg = 0, mid = 0, end = max + 1; + while (beg < end) { + mid = (beg + end) / 2; + if (key < rangeStarts[mid]) { + end = mid; + } else if (key > rangeStarts[mid+1]) { + beg = mid+1; + } else { + break; + } + } + return mid; +} + +// Convert from a value in the base unit (which can have any decimal value, like meters/sec) to a corresponding +// discrete value in a scale (like beaufort), where each scale value represents a range of base values. +// We binary-search the ranges to find the one that contains the specified base value, and return its index. +// This can handle different scales, specified by minBaseForScaleValues[]. +double UnitsConverter::baseToScale(double baseValue, double minBaseForScaleValues[], int scaleMax) const { + if (baseValue < 0) { + baseValue = -baseValue; + } + int scaleIndex = bsearchRanges(minBaseForScaleValues, scaleMax, baseValue); + return static_cast<double>(scaleIndex); +} + double UnitsConverter::convert(double inputValue) const { - double result = + double result = inputValue; + if (!conversionRate_.specialSource.isEmpty() || !conversionRate_.specialTarget.isEmpty()) { + double base = inputValue; + // convert input (=source) to base + if (!conversionRate_.specialSource.isEmpty()) { + // We have a special mapping from source to base (not using factor, offset). + // Currently the only supported mapping is a scale-based mapping for beaufort. + base = uprv_strcmp(conversionRate_.specialSource.data(), "beaufort") == 0 ? + scaleToBase(inputValue, minMetersPerSecForBeaufort, maxBeaufort): inputValue; + } else { + // Standard mapping (using factor) from source to base. + base = inputValue * conversionRate_.factorNum / conversionRate_.factorDen; + } + // convert base to result (=target) + if (!conversionRate_.specialTarget.isEmpty()) { + // We have a special mapping from base to target (not using factor, offset). + // Currently the only supported mapping is a scale-based mapping for beaufort. + result = uprv_strcmp(conversionRate_.specialTarget.data(), "beaufort") == 0 ? + baseToScale(base, minMetersPerSecForBeaufort, maxBeaufort): base; + } else { + // Standard mapping (using factor) from base to target. + result = base * conversionRate_.factorDen / conversionRate_.factorNum; + } + return result; + } + result = inputValue + conversionRate_.sourceOffset; // Reset the input to the target zero index. // Convert the quantity to from the source scale to the target scale. result *= conversionRate_.factorNum / conversionRate_.factorDen; @@ -613,6 +799,30 @@ double UnitsConverter::convert(double inputValue) const { double UnitsConverter::convertInverse(double inputValue) const { double result = inputValue; + if (!conversionRate_.specialSource.isEmpty() || !conversionRate_.specialTarget.isEmpty()) { + double base = inputValue; + // convert input (=target) to base + if (!conversionRate_.specialTarget.isEmpty()) { + // We have a special mapping from target to base (not using factor). + // Currently the only supported mapping is a scale-based mapping for beaufort. + base = uprv_strcmp(conversionRate_.specialTarget.data(), "beaufort") == 0 ? + scaleToBase(inputValue, minMetersPerSecForBeaufort, maxBeaufort): inputValue; + } else { + // Standard mapping (using factor) from target to base. + base = inputValue * conversionRate_.factorNum / conversionRate_.factorDen; + } + // convert base to result (=source) + if (!conversionRate_.specialSource.isEmpty()) { + // We have a special mapping from base to source (not using factor). + // Currently the only supported mapping is a scale-based mapping for beaufort. + result = uprv_strcmp(conversionRate_.specialSource.data(), "beaufort") == 0 ? + baseToScale(base, minMetersPerSecForBeaufort, maxBeaufort): base; + } else { + // Standard mapping (using factor) from base to source. + result = base * conversionRate_.factorDen / conversionRate_.factorNum; + } + return result; + } if (conversionRate_.reciprocal) { if (result == 0) { return uprv_getInfinity(); diff --git a/deps/icu-small/source/i18n/units_converter.h b/deps/icu-small/source/i18n/units_converter.h index 8dc40cd102ca7f..e1736ed4d9cddd 100644 --- a/deps/icu-small/source/i18n/units_converter.h +++ b/deps/icu-small/source/i18n/units_converter.h @@ -8,6 +8,7 @@ #define __UNITS_CONVERTER_H__ #include "cmemory.h" +#include "fixedstring.h" #include "measunit_impl.h" #include "unicode/errorcode.h" #include "unicode/stringpiece.h" @@ -71,7 +72,7 @@ typedef enum Signum { } Signum; /* Represents a conversion factor */ -struct U_I18N_API Factor { +struct U_I18N_API_CLASS Factor { double factorNum = 1; double factorDen = 1; double offset = 0; @@ -82,6 +83,7 @@ struct U_I18N_API Factor { void multiplyBy(const Factor &rhs); void divideBy(const Factor &rhs); + void divideBy(const uint64_t constant); // Apply the power to the factor. void power(int32_t power); @@ -93,10 +95,10 @@ struct U_I18N_API Factor { // constantExponents (resetting the exponents). // // In ICU4J, see UnitConverter.Factor.getConversionRate(). - void substituteConstants(); + U_I18N_API void substituteConstants(); }; -struct U_I18N_API ConversionInfo { +struct ConversionInfo { double conversionRate; double offset; bool reciprocal; @@ -110,10 +112,14 @@ void U_I18N_API addSingleFactorConstant(StringPiece baseStr, int32_t power, Sign /** * Represents the conversion rate between `source` and `target`. + * TODO ICU-22683: COnsider moving the handling of special mappings (e.g. beaufort) to a separate + * struct. */ -struct U_I18N_API ConversionRate : public UMemory { +struct ConversionRate : public UMemory { const MeasureUnitImpl source; const MeasureUnitImpl target; + FixedString specialSource; + FixedString specialTarget; double factorNum = 1; double factorDen = 1; double sourceOffset = 0; @@ -121,7 +127,7 @@ struct U_I18N_API ConversionRate : public UMemory { bool reciprocal = false; ConversionRate(MeasureUnitImpl &&source, MeasureUnitImpl &&target) - : source(std::move(source)), target(std::move(target)) {} + : source(std::move(source)), target(std::move(target)), specialSource(), specialTarget() {} }; enum Convertibility { @@ -130,9 +136,9 @@ enum Convertibility { UNCONVERTIBLE, }; -MeasureUnitImpl U_I18N_API extractCompoundBaseUnit(const MeasureUnitImpl &source, - const ConversionRates &conversionRates, - UErrorCode &status); +MeasureUnitImpl extractCompoundBaseUnit(const MeasureUnitImpl& source, + const ConversionRates& conversionRates, + UErrorCode& status); /** * Check if the convertibility between `source` and `target`. @@ -157,7 +163,7 @@ Convertibility U_I18N_API extractConvertibility(const MeasureUnitImpl &source, * Only works with SINGLE and COMPOUND units. If one of the units is a * MIXED unit, an error will occur. For more information, see UMeasureUnitComplexity. */ -class U_I18N_API UnitsConverter : public UMemory { +class U_I18N_API_CLASS UnitsConverter : public UMemory { public: /** * Constructor of `UnitConverter`. @@ -171,7 +177,8 @@ class U_I18N_API UnitsConverter : public UMemory { * @param targetIdentifier represents the target unit identifier. * @param status */ - UnitsConverter(StringPiece sourceIdentifier, StringPiece targetIdentifier, UErrorCode &status); + U_I18N_API UnitsConverter(StringPiece sourceIdentifier, StringPiece targetIdentifier, + UErrorCode &status); /** * Constructor of `UnitConverter`. @@ -184,8 +191,8 @@ class U_I18N_API UnitsConverter : public UMemory { * @param ratesInfo Contains all the needed conversion rates. * @param status */ - UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target, - const ConversionRates &ratesInfo, UErrorCode &status); + U_I18N_API UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target, + const ConversionRates &ratesInfo, UErrorCode &status); /** * Compares two single units and returns 1 if the first one is greater, -1 if the second @@ -204,7 +211,7 @@ class U_I18N_API UnitsConverter : public UMemory { * @param inputValue the value to be converted. * @return the converted value. */ - double convert(double inputValue) const; + U_I18N_API double convert(double inputValue) const; /** * The inverse of convert(): convert a measurement expressed in the target @@ -213,9 +220,9 @@ class U_I18N_API UnitsConverter : public UMemory { * @param inputValue the value to be converted. * @return the converted value. */ - double convertInverse(double inputValue) const; + U_I18N_API double convertInverse(double inputValue) const; - ConversionInfo getConversionInfo() const; + U_I18N_API ConversionInfo getConversionInfo() const; private: ConversionRate conversionRate_; @@ -224,6 +231,21 @@ class U_I18N_API UnitsConverter : public UMemory { * Initialises the object. */ void init(const ConversionRates &ratesInfo, UErrorCode &status); + + /** + * Convert from what should be discrete scale values for a particular unit like beaufort + * to a corresponding value in the base unit (which can have any decimal value, like meters/sec). + * This can handle different scales, specified by minBaseForScaleValues[]. + */ + double scaleToBase(double scaleValue, double minBaseForScaleValues[], int scaleMax) const; + + /** + * Convert from a value in the base unit (which can have any decimal value, like meters/sec) to a corresponding + * discrete value in a scale (like beaufort), where each scale value represents a range of base values. + * This can handle different scales, specified by minBaseForScaleValues[]. + */ + double baseToScale(double baseValue, double minBaseForScaleValues[], int scaleMax) const; + }; } // namespace units diff --git a/deps/icu-small/source/i18n/units_data.cpp b/deps/icu-small/source/i18n/units_data.cpp index b1e069660f2df2..559aec397e9ef0 100644 --- a/deps/icu-small/source/i18n/units_data.cpp +++ b/deps/icu-small/source/i18n/units_data.cpp @@ -6,6 +6,7 @@ #if !UCONFIG_NO_FORMATTING #include "bytesinkutil.h" +#include "charstr.h" #include "cstring.h" #include "measunit_impl.h" #include "number_decimalquantity.h" @@ -80,6 +81,7 @@ class ConversionRateDataSink : public ResourceSink { UnicodeString baseUnit = ICU_Utility::makeBogusString(); UnicodeString factor = ICU_Utility::makeBogusString(); UnicodeString offset = ICU_Utility::makeBogusString(); + UnicodeString special = ICU_Utility::makeBogusString(); UnicodeString systems = ICU_Utility::makeBogusString(); for (int32_t i = 0; unitTable.getKeyAndValue(i, key, value); i++) { if (uprv_strcmp(key, "target") == 0) { @@ -88,12 +90,14 @@ class ConversionRateDataSink : public ResourceSink { factor = value.getUnicodeString(status); } else if (uprv_strcmp(key, "offset") == 0) { offset = value.getUnicodeString(status); + } else if (uprv_strcmp(key, "special") == 0) { + special = value.getUnicodeString(status); // the name of a special mapping used instead of factor + optional offset. } else if (uprv_strcmp(key, "systems") == 0) { systems = value.getUnicodeString(status); } } if (U_FAILURE(status)) { return; } - if (baseUnit.isBogus() || factor.isBogus()) { + if (baseUnit.isBogus() || (factor.isBogus() && special.isBogus())) { // We could not find a usable conversion rate: bad resource. status = U_MISSING_RESOURCE_ERROR; return; @@ -105,15 +109,27 @@ class ConversionRateDataSink : public ResourceSink { status = U_MEMORY_ALLOCATION_ERROR; return; } else { - cr->sourceUnit.append(srcUnit, status); - cr->baseUnit.appendInvariantChars(baseUnit, status); - cr->factor.appendInvariantChars(factor, status); - cr->systems.appendInvariantChars(systems, status); - trimSpaces(cr->factor, status); - if (!offset.isBogus()) cr->offset.appendInvariantChars(offset, status); + cr->sourceUnit = srcUnit; + if (cr->sourceUnit.isEmpty() != (*srcUnit == '\0')) { + status = U_MEMORY_ALLOCATION_ERROR; + } + copyInvariantChars(baseUnit, cr->baseUnit, status); + if (U_SUCCESS(status) && !factor.isBogus()) { + CharString tmp; + tmp.appendInvariantChars(factor, status); + trimSpaces(tmp, status); + if (U_SUCCESS(status)) { + cr->factor = tmp.toStringPiece(); + if (cr->factor.isEmpty() != tmp.isEmpty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } + } + if (!offset.isBogus()) { copyInvariantChars(offset, cr->offset, status); } + if (!special.isBogus()) { copyInvariantChars(special, cr->specialMappingName, status); } + copyInvariantChars(systems, cr->systems, status); } } - return; } private: @@ -210,9 +226,7 @@ class UnitPreferencesSink : public ResourceSink { if (U_FAILURE(status)) { return; } for (int32_t i = 0; unitPref.getKeyAndValue(i, key, value); ++i) { if (uprv_strcmp(key, "unit") == 0) { - int32_t length; - const char16_t *u = value.getString(length, status); - up->unit.appendInvariantChars(u, length, status); + copyInvariantChars(value.getUnicodeString(status), up->unit, status); } else if (uprv_strcmp(key, "geq") == 0) { int32_t length; const char16_t *g = value.getString(length, status); @@ -382,36 +396,34 @@ void U_I18N_API getAllConversionRates(MaybeStackVector<ConversionRateInfo> &resu const ConversionRateInfo *ConversionRates::extractConversionInfo(StringPiece source, UErrorCode &status) const { for (size_t i = 0, n = conversionInfo_.length(); i < n; ++i) { - if (conversionInfo_[i]->sourceUnit.toStringPiece() == source) return conversionInfo_[i]; + if (uprv_strncmp(conversionInfo_[i]->sourceUnit.data(), source.data(), source.size()) == 0) { + return conversionInfo_[i]; + } } status = U_INTERNAL_PROGRAM_ERROR; return nullptr; } -U_I18N_API UnitPreferences::UnitPreferences(UErrorCode &status) { +UnitPreferences::UnitPreferences(UErrorCode& status) { LocalUResourceBundlePointer unitsBundle(ures_openDirect(nullptr, "units", &status)); UnitPreferencesSink sink(&unitPrefs_, &metadata_); ures_getAllItemsWithFallback(unitsBundle.getAlias(), "unitPreferenceData", sink, status); } CharString getKeyWordValue(const Locale &locale, StringPiece kw, UErrorCode &status) { - CharString result; - if (U_FAILURE(status)) { return result; } - { - CharStringByteSink sink(&result); - locale.getKeywordValue(kw, sink, status); - } + if (U_FAILURE(status)) { return {}; } + auto result = locale.getKeywordValue<CharString>(kw, status); if (U_SUCCESS(status) && result.isEmpty()) { status = U_MISSING_RESOURCE_ERROR; } return result; } -MaybeStackVector<UnitPreference> - U_I18N_API UnitPreferences::getPreferencesFor(StringPiece category, StringPiece usage, - const Locale &locale, UErrorCode &status) const { - +MaybeStackVector<UnitPreference> UnitPreferences::getPreferencesFor(StringPiece category, + StringPiece usage, + const Locale& locale, + UErrorCode& status) const { MaybeStackVector<UnitPreference> result; // TODO: remove this once all the categories are allowed. @@ -430,17 +442,19 @@ MaybeStackVector<UnitPreference> || localeUnitCharString == "kelvin" ) { UnitPreference unitPref; - unitPref.unit.append(localeUnitCharString, status); + unitPref.unit = localeUnitCharString.toStringPiece(); + if (unitPref.unit.isEmpty() != localeUnitCharString.isEmpty()) { + status = U_MISSING_RESOURCE_ERROR; + return result; + } result.emplaceBackAndCheckErrorCode(status, unitPref); return result; } } } - char regionBuf[8]; - ulocimp_getRegionForSupplementalData(locale.getName(), false, regionBuf, 8, &status); - CharString region(regionBuf, status); - + CharString region = ulocimp_getRegionForSupplementalData(locale.getName(), true, status); + // Check the locale system tag, e.g `ms=metric`. UErrorCode internalMeasureTagStatus = U_ZERO_ERROR; CharString localeSystem = getKeyWordValue(locale, "measure", internalMeasureTagStatus); @@ -470,9 +484,10 @@ MaybeStackVector<UnitPreference> for (int32_t j = 0; unitsMatchSystem && j < measureUnit.singleUnits.length(); j++) { const SingleUnitImpl* singleUnit = measureUnit.singleUnits[j]; const ConversionRateInfo* rateInfo = rates.extractConversionInfo(singleUnit->getSimpleUnitID(), status); - CharString systems(rateInfo->systems, status); - if (!systems.contains("metric_adjacent")) { // "metric-adjacent" is considered to match all the locale systems - if (!systems.contains(localeSystem.data())) { + const char* systems = rateInfo->systems.data(); + // "metric-adjacent" is considered to match all the locale systems + if (uprv_strstr(systems, "metric_adjacent") == nullptr) { + if (uprv_strstr(systems, localeSystem.data()) == nullptr) { unitsMatchSystem = false; } } diff --git a/deps/icu-small/source/i18n/units_data.h b/deps/icu-small/source/i18n/units_data.h index ad5033513cb5f0..d7444037a7764a 100644 --- a/deps/icu-small/source/i18n/units_data.h +++ b/deps/icu-small/source/i18n/units_data.h @@ -11,6 +11,7 @@ #include "charstr.h" #include "cmemory.h" +#include "fixedstring.h" #include "unicode/stringpiece.h" #include "unicode/uobject.h" @@ -26,40 +27,28 @@ namespace units { * precision conversion - going from feet to inches should cancel out the * `ft_to_m` constant. */ -class U_I18N_API ConversionRateInfo : public UMemory { +class ConversionRateInfo : public UMemory { public: ConversionRateInfo() {} ConversionRateInfo(StringPiece sourceUnit, StringPiece baseUnit, StringPiece factor, StringPiece offset, UErrorCode &status) - : sourceUnit(), baseUnit(), factor(), offset() { - this->sourceUnit.append(sourceUnit, status); - this->baseUnit.append(baseUnit, status); - this->factor.append(factor, status); - this->offset.append(offset, status); + : sourceUnit(sourceUnit), baseUnit(baseUnit), factor(factor), offset(offset), + specialMappingName(), systems() { + if (this->sourceUnit.isEmpty() != sourceUnit.empty() || + this->baseUnit.isEmpty() != baseUnit.empty() || + this->factor.isEmpty() != factor.empty() || + this->offset.isEmpty() != offset.empty()) { + status = U_MEMORY_ALLOCATION_ERROR; + } } - CharString sourceUnit; - CharString baseUnit; - CharString factor; - CharString offset; - CharString systems; + FixedString sourceUnit; + FixedString baseUnit; + FixedString factor; + FixedString offset; + FixedString specialMappingName; // the name of a special mapping used instead of factor + optional offset. + FixedString systems; }; -} // namespace units - -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -// -// Note: These need to be outside of the units namespace, or Clang will generate -// a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<units::ConversionRateInfo*, 8>; -template class U_I18N_API MemoryPool<units::ConversionRateInfo, 8>; -template class U_I18N_API MaybeStackVector<units::ConversionRateInfo, 8>; -#endif - -namespace units { - /** * Returns ConversionRateInfo for all supported conversions. * @@ -71,7 +60,7 @@ void U_I18N_API getAllConversionRates(MaybeStackVector<ConversionRateInfo> &resu /** * Contains all the supported conversion rates. */ -class U_I18N_API ConversionRates { +class ConversionRates { public: /** * Constructor @@ -94,16 +83,15 @@ class U_I18N_API ConversionRates { // Encapsulates unitPreferenceData information from units resources, specifying // a sequence of output unit preferences. -struct U_I18N_API UnitPreference : public UMemory { +struct UnitPreference : public UMemory { // Set geq to 1.0 by default UnitPreference() : geq(1.0) {} - CharString unit; + FixedString unit; double geq; UnicodeString skeleton; UnitPreference(const UnitPreference &other) { - UErrorCode status = U_ZERO_ERROR; - this->unit.append(other.unit, status); + this->unit = other.unit; this->geq = other.geq; this->skeleton = other.skeleton; } @@ -117,7 +105,7 @@ struct U_I18N_API UnitPreference : public UMemory { * UnitPreferenceMetadata lives in the anonymous namespace, because it should * only be useful to internal code and unit testing code. */ -class U_I18N_API UnitPreferenceMetadata : public UMemory { +class UnitPreferenceMetadata : public UMemory { public: UnitPreferenceMetadata() {} // Constructor, makes copies of the parameters passed to it. @@ -144,36 +132,17 @@ class U_I18N_API UnitPreferenceMetadata : public UMemory { bool *foundRegion) const; }; -} // namespace units - -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -// -// Note: These need to be outside of the units namespace, or Clang will generate -// a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<units::UnitPreferenceMetadata*, 8>; -template class U_I18N_API MemoryPool<units::UnitPreferenceMetadata, 8>; -template class U_I18N_API MaybeStackVector<units::UnitPreferenceMetadata, 8>; -template class U_I18N_API MaybeStackArray<units::UnitPreference*, 8>; -template class U_I18N_API MemoryPool<units::UnitPreference, 8>; -template class U_I18N_API MaybeStackVector<units::UnitPreference, 8>; -#endif - -namespace units { - /** * Unit Preferences information for various locales and usages. */ -class U_I18N_API UnitPreferences { +class U_I18N_API_CLASS UnitPreferences { public: /** * Constructor, loads all the preference data. * * @param status Receives status. */ - UnitPreferences(UErrorCode &status); + U_I18N_API UnitPreferences(UErrorCode& status); /** * Returns the set of unit preferences in the particular category that best @@ -198,10 +167,10 @@ class U_I18N_API UnitPreferences { * result set. * @param status Receives status. */ - MaybeStackVector<UnitPreference> getPreferencesFor(StringPiece category, StringPiece usage, - const Locale &locale, - - UErrorCode &status) const; + U_I18N_API MaybeStackVector<UnitPreference> getPreferencesFor(StringPiece category, + StringPiece usage, + const Locale& locale, + UErrorCode& status) const; protected: // Metadata about the sets of preferences, this is the index for looking up diff --git a/deps/icu-small/source/i18n/units_router.cpp b/deps/icu-small/source/i18n/units_router.cpp index 03c9b4d1d7c416..0a51cda9f9253f 100644 --- a/deps/icu-small/source/i18n/units_router.cpp +++ b/deps/icu-small/source/i18n/units_router.cpp @@ -77,7 +77,7 @@ void UnitsRouter::init(const MeasureUnit &inputUnit, const Locale &locale, Strin prefs.getPreferencesFor(category.toStringPiece(), usage, locale, status); for (int32_t i = 0, n = unitPrefs.length(); i < n; ++i) { U_ASSERT(unitPrefs[i] != nullptr); - const auto preference = unitPrefs[i]; + const auto* const preference = unitPrefs[i]; MeasureUnitImpl complexTargetUnitImpl = MeasureUnitImpl::forIdentifier(preference->unit.data(), status); diff --git a/deps/icu-small/source/i18n/units_router.h b/deps/icu-small/source/i18n/units_router.h index 978fdf91fd5b4e..88c32c60e3d471 100644 --- a/deps/icu-small/source/i18n/units_router.h +++ b/deps/icu-small/source/i18n/units_router.h @@ -73,22 +73,6 @@ struct ConverterPreference : UMemory { precision(std::move(precision)), targetUnit(complexTarget.copy(status)) {} }; -} // namespace units - -// Export explicit template instantiations of MaybeStackArray, MemoryPool and -// MaybeStackVector. This is required when building DLLs for Windows. (See -// datefmt.h, collationiterator.h, erarules.h and others for similar examples.) -// -// Note: These need to be outside of the units namespace, or Clang will generate -// a compile error. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template class U_I18N_API MaybeStackArray<units::ConverterPreference*, 8>; -template class U_I18N_API MemoryPool<units::ConverterPreference, 8>; -template class U_I18N_API MaybeStackVector<units::ConverterPreference, 8>; -#endif - -namespace units { - /** * `UnitsRouter` responsible for converting from a single unit (such as `meter` or `meter-per-second`) to * one of the complex units based on the limits. @@ -117,12 +101,12 @@ namespace units { * `UnitRouter` uses internally `ComplexUnitConverter` in order to convert the input units to the * desired complex units and to check the limit too. */ -class U_I18N_API UnitsRouter { +class U_I18N_API_CLASS UnitsRouter { public: - UnitsRouter(StringPiece inputUnitIdentifier, const Locale &locale, StringPiece usage, - UErrorCode &status); - UnitsRouter(const MeasureUnit &inputUnit, const Locale &locale, StringPiece usage, - UErrorCode &status); + U_I18N_API UnitsRouter(StringPiece inputUnitIdentifier, const Locale &locale, StringPiece usage, + UErrorCode &status); + U_I18N_API UnitsRouter(const MeasureUnit &inputUnit, const Locale &locale, StringPiece usage, + UErrorCode &status); /** * Performs locale and usage sensitive unit conversion. @@ -133,7 +117,8 @@ class U_I18N_API UnitsRouter { * and locale preference, alternatively with the default precision. * @param status Receives status. */ - RouteResult route(double quantity, icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const; + U_I18N_API RouteResult route(double quantity, icu::number::impl::RoundingImpl *rounder, + UErrorCode &status) const; /** * Returns the list of possible output units, i.e. the full set of diff --git a/deps/icu-small/source/i18n/unum.cpp b/deps/icu-small/source/i18n/unum.cpp index eb6c86252b7ab6..d6d18abed1fa18 100644 --- a/deps/icu-small/source/i18n/unum.cpp +++ b/deps/icu-small/source/i18n/unum.cpp @@ -167,9 +167,9 @@ unum_clone(const UNumberFormat *fmt, UErrorCode *status) { if(U_FAILURE(*status)) - return 0; - - Format *res = 0; + return nullptr; + + Format* res = nullptr; const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt); const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf); if (df != nullptr) { @@ -180,9 +180,9 @@ unum_clone(const UNumberFormat *fmt, res = rbnf->clone(); } - if(res == 0) { + if (res == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return nullptr; } return (UNumberFormat*) res; @@ -218,13 +218,13 @@ unum_formatInt64(const UNumberFormat* fmt, } FieldPosition fp; - - if(pos != 0) + + if (pos != nullptr) fp.setField(pos->field); ((const NumberFormat*)fmt)->format(number, res, fp, *status); - if(pos != 0) { + if (pos != nullptr) { pos->beginIndex = fp.getBeginIndex(); pos->endIndex = fp.getEndIndex(); } @@ -251,13 +251,13 @@ unum_formatDouble( const UNumberFormat* fmt, } FieldPosition fp; - - if(pos != 0) + + if (pos != nullptr) fp.setField(pos->field); ((const NumberFormat*)fmt)->format(number, res, fp, *status); - - if(pos != 0) { + + if (pos != nullptr) { pos->beginIndex = fp.getBeginIndex(); pos->endIndex = fp.getEndIndex(); } @@ -311,7 +311,7 @@ unum_formatDecimal(const UNumberFormat* fmt, } FieldPosition fp; - if(pos != 0) { + if (pos != nullptr) { fp.setField(pos->field); } @@ -327,7 +327,7 @@ unum_formatDecimal(const UNumberFormat* fmt, resultStr.setTo(result, 0, resultLength); } ((const NumberFormat*)fmt)->format(numFmtbl, resultStr, fp, *status); - if(pos != 0) { + if (pos != nullptr) { pos->beginIndex = fp.getBeginIndex(); pos->endIndex = fp.getEndIndex(); } @@ -355,7 +355,7 @@ unum_formatDoubleCurrency(const UNumberFormat* fmt, } FieldPosition fp; - if (pos != 0) { + if (pos != nullptr) { fp.setField(pos->field); } CurrencyAmount *tempCurrAmnt = new CurrencyAmount(number, currency, *status); @@ -366,8 +366,8 @@ unum_formatDoubleCurrency(const UNumberFormat* fmt, } Formattable n(tempCurrAmnt); ((const NumberFormat*)fmt)->format(n, res, fp, *status); - - if (pos != 0) { + + if (pos != nullptr) { pos->beginIndex = fp.getBeginIndex(); pos->endIndex = fp.getEndIndex(); } @@ -386,20 +386,20 @@ parseRes(Formattable& res, if(U_FAILURE(*status)) return; - const UnicodeString src((UBool)(textLength == -1), text, textLength); + const UnicodeString src(static_cast<UBool>(textLength == -1), text, textLength); ParsePosition pp; - - if(parsePos != 0) + + if (parsePos != nullptr) pp.setIndex(*parsePos); - ((const NumberFormat*)fmt)->parse(src, res, pp); + reinterpret_cast<const NumberFormat*>(fmt)->parse(src, res, pp); if(pp.getErrorIndex() != -1) { *status = U_PARSE_ERROR; - if(parsePos != 0) { + if (parsePos != nullptr) { *parsePos = pp.getErrorIndex(); } - } else if(parsePos != 0) { + } else if (parsePos != nullptr) { *parsePos = pp.getIndex(); } } @@ -485,7 +485,7 @@ unum_parseDoubleCurrency(const UNumberFormat* fmt, if (U_FAILURE(*status)) { return doubleVal; } - const UnicodeString src((UBool)(textLength == -1), text, textLength); + const UnicodeString src(textLength == -1, text, textLength); ParsePosition pp; if (parsePos != nullptr) { pp.setIndex(*parsePos); @@ -923,7 +923,6 @@ unum_setContext(UNumberFormat* fmt, UDisplayContext value, UErrorCode* status) return; } ((NumberFormat*)fmt)->setContext(value, *status); - return; } U_CAPI UDisplayContext U_EXPORT2 @@ -978,12 +977,12 @@ unum_formatUFormattable(const UNumberFormat* fmt, FieldPosition fp; - if(pos != 0) + if (pos != nullptr) fp.setField(pos->field); ((const NumberFormat*)fmt)->format(*(Formattable::fromUFormattable(number)), res, fp, *status); - if(pos != 0) { + if (pos != nullptr) { pos->beginIndex = fp.getBeginIndex(); pos->endIndex = fp.getEndIndex(); } diff --git a/deps/icu-small/source/i18n/upluralrules.cpp b/deps/icu-small/source/i18n/upluralrules.cpp index 9c473128119e43..e6b2313f2ca3af 100644 --- a/deps/icu-small/source/i18n/upluralrules.cpp +++ b/deps/icu-small/source/i18n/upluralrules.cpp @@ -54,7 +54,7 @@ UnicodeString select(const PluralRules &rules, const Formattable& obj, const Num } } } - return UnicodeString(); + return {}; } } // namespace diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index 2a520209fadbb0..5a5ff1d0387d6d 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -637,7 +637,7 @@ uregex_groupNumberFromName(URegularExpression *regexp2, const char16_t *groupName, int32_t nameLength, UErrorCode *status) { - RegularExpression *regexp = (RegularExpression*)regexp2; + RegularExpression* regexp = reinterpret_cast<RegularExpression*>(regexp2); if (validateRE(regexp, false, status) == false) { return 0; } @@ -650,7 +650,7 @@ uregex_groupNumberFromCName(URegularExpression *regexp2, const char *groupName, int32_t nameLength, UErrorCode *status) { - RegularExpression *regexp = (RegularExpression*)regexp2; + RegularExpression* regexp = reinterpret_cast<RegularExpression*>(regexp2); if (validateRE(regexp, false, status) == false) { return 0; } @@ -1204,11 +1204,11 @@ uregex_replaceAllUText(URegularExpression *regexp2, UErrorCode *status) { RegularExpression *regexp = (RegularExpression*)regexp2; if (validateRE(regexp, true, status) == false) { - return 0; + return nullptr; } if (replacementText == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } dest = regexp->fMatcher->replaceAll(replacementText, dest, *status); @@ -1265,11 +1265,11 @@ uregex_replaceFirstUText(URegularExpression *regexp2, UErrorCode *status) { RegularExpression *regexp = (RegularExpression*)regexp2; if (validateRE(regexp, true, status) == false) { - return 0; + return nullptr; } if (replacementText == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return nullptr; } dest = regexp->fMatcher->replaceFirst(replacementText, dest, *status); @@ -1389,8 +1389,8 @@ int32_t RegexCImpl::appendReplacement(RegularExpression *regexp, int32_t matchStart; int32_t lastMatchEnd; if (UTEXT_USES_U16(m->fInputText)) { - lastMatchEnd = (int32_t)m->fLastMatchEnd; - matchStart = (int32_t)m->fMatchStart; + lastMatchEnd = static_cast<int32_t>(m->fLastMatchEnd); + matchStart = static_cast<int32_t>(m->fMatchStart); } else { // !!!: Would like a better way to do this! UErrorCode tempStatus = U_ZERO_ERROR; @@ -1440,9 +1440,9 @@ int32_t RegexCImpl::appendReplacement(RegularExpression *regexp, replacementLength, // Length of replacement text (void *)replacementText); - if (escapedChar != (UChar32)0xFFFFFFFF) { + if (escapedChar != static_cast<UChar32>(0xFFFFFFFF)) { if (escapedChar <= 0xffff) { - appendToBuf((char16_t)escapedChar, &destIdx, dest, capacity); + appendToBuf(static_cast<char16_t>(escapedChar), &destIdx, dest, capacity); } else { appendToBuf(U16_LEAD(escapedChar), &destIdx, dest, capacity); appendToBuf(U16_TRAIL(escapedChar), &destIdx, dest, capacity); @@ -1527,7 +1527,7 @@ int32_t RegexCImpl::appendReplacement(RegularExpression *regexp, // Finally, append the capture group data to the destination. if (U_SUCCESS(*status)) { - destIdx += uregex_group((URegularExpression*)regexp, groupNum, + destIdx += uregex_group(reinterpret_cast<URegularExpression*>(regexp), groupNum, dest==nullptr?nullptr:&dest[destIdx], REMAINING_CAPACITY(destIdx, capacity), status); if (*status == U_BUFFER_OVERFLOW_ERROR) { // Ignore buffer overflow when extracting the group. We need to @@ -1653,7 +1653,7 @@ int32_t RegexCImpl::appendTail(RegularExpression *regexp, if (nativeIdx == -1) { srcIdx = 0; } else if (UTEXT_USES_U16(m->fInputText)) { - srcIdx = (int32_t)nativeIdx; + srcIdx = static_cast<int32_t>(nativeIdx); } else { UErrorCode newStatus = U_ZERO_ERROR; srcIdx = utext_extract(m->fInputText, 0, nativeIdx, nullptr, 0, &newStatus); @@ -1842,7 +1842,7 @@ int32_t RegexCImpl::split(RegularExpression *regexp, // No fields are left. Recycle the last one for holding the trailing part of // the input string. i = destFieldsCapacity-1; - destIdx = (int32_t)(destFields[i] - destFields[0]); + destIdx = static_cast<int32_t>(destFields[i] - destFields[0]); } destFields[i] = (destBuf == nullptr) ? nullptr : &destBuf[destIdx]; @@ -1879,7 +1879,7 @@ int32_t RegexCImpl::split(RegularExpression *regexp, // Set up to extract the capture group contents into the dest buffer. destFields[i] = &destBuf[destIdx]; tStatus = U_ZERO_ERROR; - int32_t t = uregex_group((URegularExpression*)regexp, + int32_t t = uregex_group(reinterpret_cast<URegularExpression*>(regexp), groupNum, destFields[i], REMAINING_CAPACITY(destIdx, destCapacity), diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index 6d9b60cef72f1f..e36d0f2cfe53d9 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -111,7 +111,7 @@ uint16_t getFCD(const char16_t *str, int32_t *offset, { const char16_t *temp = str + *offset; uint16_t result = g_nfcImpl->nextFCD16(temp, str + strlength); - *offset = (int32_t)(temp - str); + *offset = static_cast<int32_t>(temp - str); return result; } @@ -151,58 +151,44 @@ inline int32_t getCE(const UStringSearch *strsrch, uint32_t sourcece) return sourcece; } -/** -* Allocate a memory and returns nullptr if it failed. -* Internal method, status assumed to be a success. -* @param size to allocate -* @param status output error if any, caller to check status before calling -* method, status assumed to be success when passed in. -* @return newly allocated array, nullptr otherwise -*/ -static -inline void * allocateMemory(uint32_t size, UErrorCode *status) -{ - uint32_t *result = (uint32_t *)uprv_malloc(size); - if (result == nullptr) { - *status = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - /** * Adds a uint32_t value to a destination array. * Creates a new array if we run out of space. The caller will have to * manually deallocate the newly allocated array. -* Internal method, status assumed to be success, caller has to check status -* before calling this method. destination not to be nullptr and has at least -* size destinationlength. +* destination not to be nullptr and has at least size destinationCapacity. * @param destination target array +* @param destinationCapacity target array size, return value for the new size +* @param destOnHeap whether the destination array is heap-allocated * @param offset destination offset to add value -* @param destinationlength target array size, return value for the new size * @param value to be added * @param increments incremental size expected -* @param status output error if any, caller to check status before calling -* method, status assumed to be success when passed in. +* @param status output error if any * @return new destination array, destination if there was no new allocation */ static inline int32_t * addTouint32_tArray(int32_t *destination, + uint32_t *destinationCapacity, + bool destOnHeap, uint32_t offset, - uint32_t *destinationlength, uint32_t value, uint32_t increments, UErrorCode *status) { - uint32_t newlength = *destinationlength; - if (offset + 1 == newlength) { - newlength += increments; - int32_t *temp = (int32_t *)allocateMemory( - sizeof(int32_t) * newlength, status); - if (U_FAILURE(*status)) { - return nullptr; + if (U_FAILURE(*status)) { + return destination; + } + if (offset >= *destinationCapacity) { + uint32_t newlength = offset + increments; + int32_t* temp = static_cast<int32_t*>(uprv_malloc(sizeof(int32_t) * newlength)); + if (temp == nullptr) { + *status = U_MEMORY_ALLOCATION_ERROR; + return destination; } uprv_memcpy(temp, destination, sizeof(int32_t) * (size_t)offset); - *destinationlength = newlength; + if (destOnHeap) { + uprv_free(destination); + } + *destinationCapacity = newlength; destination = temp; } destination[offset] = value; @@ -213,43 +199,43 @@ inline int32_t * addTouint32_tArray(int32_t *destination, * Adds a uint64_t value to a destination array. * Creates a new array if we run out of space. The caller will have to * manually deallocate the newly allocated array. -* Internal method, status assumed to be success, caller has to check status -* before calling this method. destination not to be nullptr and has at least -* size destinationlength. +* destination not to be nullptr and has at least size destinationCapacity. * @param destination target array +* @param destinationCapacity target array size, return value for the new size +* @param destOnHeap whether the destination array is heap-allocated * @param offset destination offset to add value -* @param destinationlength target array size, return value for the new size * @param value to be added * @param increments incremental size expected -* @param status output error if any, caller to check status before calling -* method, status assumed to be success when passed in. +* @param status output error if any * @return new destination array, destination if there was no new allocation */ static inline int64_t * addTouint64_tArray(int64_t *destination, + uint32_t *destinationCapacity, + bool destOnHeap, uint32_t offset, - uint32_t *destinationlength, uint64_t value, uint32_t increments, UErrorCode *status) { - uint32_t newlength = *destinationlength; - if (offset + 1 == newlength) { - newlength += increments; - int64_t *temp = (int64_t *)allocateMemory( - sizeof(int64_t) * newlength, status); - - if (U_FAILURE(*status)) { - return nullptr; + if (U_FAILURE(*status)) { + return destination; + } + if (offset >= *destinationCapacity) { + uint32_t newlength = offset + increments; + int64_t* temp = static_cast<int64_t*>(uprv_malloc(sizeof(int64_t) * newlength)); + if (temp == nullptr) { + *status = U_MEMORY_ALLOCATION_ERROR; + return destination; } - uprv_memcpy(temp, destination, sizeof(int64_t) * (size_t)offset); - *destinationlength = newlength; + if (destOnHeap) { + uprv_free(destination); + } + *destinationCapacity = newlength; destination = temp; } - destination[offset] = value; - return destination; } @@ -299,22 +285,22 @@ inline void initializePatternCETable(UStringSearch *strsrch, UErrorCode *status) U_SUCCESS(*status)) { uint32_t newce = getCE(strsrch, ce); if (newce) { - int32_t *temp = addTouint32_tArray(cetable, offset, &cetablesize, - newce, - patternlength - ucol_getOffset(coleiter) + 1, - status); - if (U_FAILURE(*status)) { - return; - } + cetable = addTouint32_tArray( + cetable, &cetablesize, /* destOnHeap= */ cetable != pattern->cesBuffer, + offset, newce, patternlength - ucol_getOffset(coleiter) + 1, status); offset ++; - if (cetable != temp && cetable != pattern->cesBuffer) { - uprv_free(cetable); - } - cetable = temp; } } - cetable[offset] = 0; + cetable = addTouint32_tArray( + cetable, &cetablesize, /* destOnHeap= */ cetable != pattern->cesBuffer, + offset, 0, 1, status); + if (U_FAILURE(*status)) { + if (cetable != pattern->cesBuffer) { + uprv_free(cetable); + } + return; + } pattern->ces = cetable; pattern->cesLength = offset; } @@ -368,25 +354,21 @@ inline void initializePatternPCETable(UStringSearch *strsrch, // ** whether a CE is signed or unsigned. For example, look at routine above this one.) while ((pce = iter.nextProcessed(nullptr, nullptr, status)) != UCOL_PROCESSED_NULLORDER && U_SUCCESS(*status)) { - int64_t *temp = addTouint64_tArray(pcetable, offset, &pcetablesize, - pce, - patternlength - ucol_getOffset(coleiter) + 1, - status); - - if (U_FAILURE(*status)) { - return; - } - + pcetable = addTouint64_tArray( + pcetable, &pcetablesize, /* destOnHeap= */ pcetable != pattern->pcesBuffer, + offset, pce, patternlength - ucol_getOffset(coleiter) + 1, status); offset += 1; + } - if (pcetable != temp && pcetable != pattern->pcesBuffer) { + pcetable = addTouint64_tArray( + pcetable, &pcetablesize, /* destOnHeap= */ pcetable != pattern->pcesBuffer, + offset, 0, 1, status); + if (U_FAILURE(*status)) { + if (pcetable != pattern->pcesBuffer) { uprv_free(pcetable); } - - pcetable = temp; + return; } - - pcetable[offset] = 0; pattern->pces = pcetable; pattern->pcesLength = offset; } @@ -1432,7 +1414,7 @@ CEIBuffer::CEIBuffer(UStringSearch *ss, UErrorCode *status) { if (!initTextProcessedIter(ss, status)) { return; } if (bufSize>DEFAULT_CEBUFFER_SIZE) { - buf = (CEI *)uprv_malloc(bufSize * sizeof(CEI)); + buf = static_cast<CEI*>(uprv_malloc(bufSize * sizeof(CEI))); if (buf == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; } @@ -1705,8 +1687,8 @@ static UCompareCEsResult compareCE64s(int64_t targCE, int64_t patCE, int16_t com int64_t mask; mask = 0xFFFF0000; - int32_t targLev1 = (int32_t)(targCEshifted & mask); - int32_t patLev1 = (int32_t)(patCEshifted & mask); + int32_t targLev1 = static_cast<int32_t>(targCEshifted & mask); + int32_t patLev1 = static_cast<int32_t>(patCEshifted & mask); if ( targLev1 != patLev1 ) { if ( targLev1 == 0 ) { return U_CE_SKIP_TARG; @@ -1718,8 +1700,8 @@ static UCompareCEsResult compareCE64s(int64_t targCE, int64_t patCE, int16_t com } mask = 0x0000FFFF; - int32_t targLev2 = (int32_t)(targCEshifted & mask); - int32_t patLev2 = (int32_t)(patCEshifted & mask); + int32_t targLev2 = static_cast<int32_t>(targCEshifted & mask); + int32_t patLev2 = static_cast<int32_t>(patCEshifted & mask); if ( targLev2 != patLev2 ) { if ( targLev2 == 0 ) { return U_CE_SKIP_TARG; @@ -1732,8 +1714,8 @@ static UCompareCEsResult compareCE64s(int64_t targCE, int64_t patCE, int16_t com } mask = 0xFFFF0000; - int32_t targLev3 = (int32_t)(targCE & mask); - int32_t patLev3 = (int32_t)(patCE & mask); + int32_t targLev3 = static_cast<int32_t>(targCE & mask); + int32_t patLev3 = static_cast<int32_t>(patCE & mask); if ( targLev3 != patLev3 ) { return (patLev3 == U_CE_LEVEL3_BASE || (compareType == USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD && targLev3 == U_CE_LEVEL3_BASE) )? U_CE_MATCH: U_CE_NO_MATCH; @@ -1905,7 +1887,7 @@ U_CAPI UBool U_EXPORT2 usearch_search(UStringSearch *strsrch, // 1. The match extended to the last CE from the target text, which is OK, or // 2. The last CE that was part of the match is in an expansion that extends // to the first CE after the match. In this case, we reject the match. - const CEI *nextCEI = 0; + const CEI* nextCEI = nullptr; if (strsrch->search->elementComparisonType == 0) { nextCEI = ceb.get(targetIx + targetIxOffset); maxLimit = nextCEI->lowIndex; diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 47dac8418e4497..51cf99564ba61a 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -58,99 +58,26 @@ uspoof_cleanup() { } void U_CALLCONV initializeStatics(UErrorCode &status) { - static const char16_t *inclusionPat = - u"['\\-.\\:\\u00B7\\u0375\\u058A\\u05F3\\u05F4\\u06FD\\u06FE\\u0F0B\\u2010" - u"\\u2019\\u2027\\u30A0\\u30FB]"; - gInclusionSet = new UnicodeSet(UnicodeString(inclusionPat), status); - if (gInclusionSet == nullptr) { + gInclusionSet = new UnicodeSet(); + gRecommendedSet = new UnicodeSet(); + if (gInclusionSet == nullptr || gRecommendedSet == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; + delete gInclusionSet; + gInclusionSet = nullptr; + delete gRecommendedSet; + gRecommendedSet = nullptr; return; } - gInclusionSet->freeze(); - - // Note: data from IdentifierStatus.txt & IdentifierType.txt - // There is tooling to generate this constant in the unicodetools project: - // org.unicode.text.tools.RecommendedSetGenerator - // It will print the Java and C++ code to the console for easy copy-paste into this file. - static const char16_t *recommendedPat = - u"[0-9A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u0131\\u0134-\\u013E" - u"\\u0141-\\u0148\\u014A-\\u017E\\u018F\\u01A0\\u01A1\\u01AF\\u01B0\\u01CD-" - u"\\u01DC\\u01DE-\\u01E3\\u01E6-\\u01F0\\u01F4\\u01F5\\u01F8-\\u021B\\u021E" - u"\\u021F\\u0226-\\u0233\\u0259\\u02BB\\u02BC\\u02EC\\u0300-\\u0304\\u0306-" - u"\\u030C\\u030F-\\u0311\\u0313\\u0314\\u031B\\u0323-\\u0328\\u032D\\u032E" - u"\\u0330\\u0331\\u0335\\u0338\\u0339\\u0342\\u0345\\u037B-\\u037D\\u0386" - u"\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03FC-\\u045F\\u048A-" - u"\\u04FF\\u0510-\\u0529\\u052E\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0586" - u"\\u05B4\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u063F\\u0641-\\u0655\\u0660-" - u"\\u0669\\u0670-\\u0672\\u0674\\u0679-\\u068D\\u068F-\\u06A0\\u06A2-\\u06D3" - u"\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0750-\\u07B1\\u0870-\\u0887" - u"\\u0889-\\u088E\\u08A0-\\u08AC\\u08B2\\u08B5-\\u08C9\\u0901-\\u094D\\u094F" - u"\\u0950\\u0956\\u0957\\u0960-\\u0963\\u0966-\\u096F\\u0971-\\u0977\\u0979-" - u"\\u097F\\u0981-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-" - u"\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE" - u"\\u09D7\\u09E0-\\u09E3\\u09E6-\\u09F1\\u09FE\\u0A01-\\u0A03\\u0A05-\\u0A0A" - u"\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A35\\u0A38\\u0A39" - u"\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A5C\\u0A66-\\u0A74" - u"\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0" - u"\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD" - u"\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B05-" - u"\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-" - u"\\u0B39\\u0B3C-\\u0B43\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B55-\\u0B57\\u0B5F-" - u"\\u0B61\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90" - u"\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-" - u"\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0" - u"\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-" - u"\\u0C33\\u0C35-\\u0C39\\u0C3C-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55" - u"\\u0C56\\u0C5D\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C80\\u0C82\\u0C83\\u0C85-" - u"\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-" - u"\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDD\\u0CE0-\\u0CE3" - u"\\u0CE6-\\u0CEF\\u0CF1-\\u0CF3\\u0D00\\u0D02\\u0D03\\u0D05-\\u0D0C\\u0D0E-" - u"\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-" - u"\\u0D57\\u0D60\\u0D61\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-" - u"\\u0D8E\\u0D91-\\u0D96\\u0D9A-\\u0DA5\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD" - u"\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDE\\u0DF2\\u0E01-" - u"\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84" - u"\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB2\\u0EB4-\\u0EBD\\u0EC0-" - u"\\u0EC4\\u0EC6\\u0EC8-\\u0ECE\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00\\u0F20-" - u"\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-" - u"\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71" - u"\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97" - u"\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8" - u"\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD\\u10D0-" - u"\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D\\u1250-" - u"\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0" - u"\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-" - u"\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-" - u"\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CD\\u17D0\\u17D2\\u17D7" - u"\\u17DC\\u17E0-\\u17E9\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-\\u1E99\\u1E9E" - u"\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D" - u"\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74\\u1F76" - u"\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-\\u1FC4" - u"\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-\\u1FE2" - u"\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA\\u1FFC\\u2D27" - u"\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-" - u"\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-" - u"\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-\\u30FA\\u30FC-" - u"\\u30FE\\u3105-\\u312D\\u312F\\u31A0-\\u31BF\\u3400-\\u4DBF\\u4E00-\\u9FFF" - u"\\uA67F\\uA717-\\uA71F\\uA788\\uA78D\\uA792\\uA793\\uA7AA\\uA7C0-\\uA7CA" - u"\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-" - u"\\uAA7F\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-" - u"\\uAB2E\\uAB66\\uAB67\\uAC00-\\uD7A3\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14" - u"\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29\\U00011301\\U00011303" - u"\\U0001133B\\U0001133C\\U00016FF0\\U00016FF1\\U0001B11F-\\U0001B122" - u"\\U0001B132\\U0001B150-\\U0001B152\\U0001B155\\U0001B164-\\U0001B167" - u"\\U0001DF00-\\U0001DF1E\\U0001DF25-\\U0001DF2A\\U0001E08F\\U0001E7E0-" - u"\\U0001E7E6\\U0001E7E8-\\U0001E7EB\\U0001E7ED\\U0001E7EE\\U0001E7F0-" - u"\\U0001E7FE\\U00020000-\\U0002A6DF\\U0002A700-\\U0002B739\\U0002B740-" - u"\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-\\U0002EBE0\\U0002EBF0-" - u"\\U0002EE5D\\U00030000-\\U0003134A\\U00031350-\\U000323AF]"; - - gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat), status); - if (gRecommendedSet == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + gInclusionSet->applyIntPropertyValue(UCHAR_IDENTIFIER_TYPE, U_ID_TYPE_INCLUSION, status); + gRecommendedSet->applyIntPropertyValue(UCHAR_IDENTIFIER_TYPE, U_ID_TYPE_RECOMMENDED, status); + if (U_FAILURE(status)) { delete gInclusionSet; + gInclusionSet = nullptr; + delete gRecommendedSet; + gRecommendedSet = nullptr; return; } + gInclusionSet->freeze(); gRecommendedSet->freeze(); gNfdNormalizer = Normalizer2::getNFDInstance(status); ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup); diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp index 42dba1c0378456..2eb812f3a8a6c1 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.cpp +++ b/deps/icu-small/source/i18n/uspoof_conf.cpp @@ -79,7 +79,7 @@ SPUStringPool::SPUStringPool(UErrorCode &status) : fVec(nullptr), fHash(nullptr) return; } vec->setDeleter( - [](void *obj) {delete (SPUString *)obj;}); + [](void *obj) {delete static_cast<SPUString*>(obj);}); fVec = vec.orphan(); fHash = uhash_open(uhash_hashUnicodeString, // key hash function uhash_compareUnicodeString, // Key Comparator @@ -99,7 +99,7 @@ int32_t SPUStringPool::size() { } SPUString *SPUStringPool::getByIndex(int32_t index) { - SPUString *retString = (SPUString *)fVec->elementAt(index); + SPUString* retString = static_cast<SPUString*>(fVec->elementAt(index)); return retString; } @@ -232,11 +232,14 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL if (U_FAILURE(status)) { return; } - u_strFromUTF8(nullptr, 0, &inputLen, confusables, confusablesLen, &status); - if (status != U_BUFFER_OVERFLOW_ERROR) { + UErrorCode bufferStatus = U_ZERO_ERROR; + u_strFromUTF8(nullptr, 0, &inputLen, confusables, confusablesLen, &bufferStatus); + if (bufferStatus != U_BUFFER_OVERFLOW_ERROR) { + if (U_FAILURE(bufferStatus)) { + status = bufferStatus; + } return; } - status = U_ZERO_ERROR; fInput = static_cast<char16_t *>(uprv_malloc((inputLen+1) * sizeof(char16_t))); if (fInput == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; @@ -393,7 +396,6 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL // All of the intermediate allocated data belongs to the ConfusabledataBuilder // object (this), and is deleted in the destructor. - return; } // @@ -431,7 +433,7 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { previousCodePoint = codePoint; } SpoofDataHeader *rawData = fSpoofImpl->fSpoofData->fRawData; - rawData->fCFUKeys = (int32_t)((char *)keys - (char *)rawData); + rawData->fCFUKeys = static_cast<int32_t>(reinterpret_cast<char*>(keys) - reinterpret_cast<char*>(rawData)); rawData->fCFUKeysSize = numKeys; fSpoofImpl->fSpoofData->fCFUKeys = keys; @@ -450,7 +452,7 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { values[i] = static_cast<uint16_t>(value); } rawData = fSpoofImpl->fSpoofData->fRawData; - rawData->fCFUStringIndex = (int32_t)((char *)values - (char *)rawData); + rawData->fCFUStringIndex = static_cast<int32_t>(reinterpret_cast<char*>(values) - reinterpret_cast<char*>(rawData)); rawData->fCFUStringIndexSize = numValues; fSpoofImpl->fSpoofData->fCFUValues = values; @@ -467,7 +469,7 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { fStringTable->extract(strings, stringsLength+1, status); rawData = fSpoofImpl->fSpoofData->fRawData; U_ASSERT(rawData->fCFUStringTable == 0); - rawData->fCFUStringTable = (int32_t)((char *)strings - (char *)rawData); + rawData->fCFUStringTable = static_cast<int32_t>(reinterpret_cast<char*>(strings) - reinterpret_cast<char*>(rawData)); rawData->fCFUStringTableLen = stringsLength; fSpoofImpl->fSpoofData->fCFUStrings = strings; } diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index 7a6084a1096d56..c727fafb37b1ea 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -108,7 +108,7 @@ USpoofChecker *SpoofImpl::asUSpoofChecker() { // received from the C API. // const SpoofImpl *SpoofImpl::validateThis(const USpoofChecker *sc, UErrorCode &status) { - auto* This = validate(sc, status); + const auto* This = validate(sc, status); if (U_FAILURE(status)) { return nullptr; } @@ -148,7 +148,7 @@ void SpoofImpl::setAllowedLocales(const char *localesList, UErrorCode &status) { if (trimmedEnd <= locStart) { break; } - const char *locale = uprv_strndup(locStart, (int32_t)(trimmedEnd + 1 - locStart)); + const char* locale = uprv_strndup(locStart, static_cast<int32_t>(trimmedEnd + 1 - locStart)); localeListCount++; // We have one locale from the locales list. @@ -305,7 +305,7 @@ void SpoofImpl::getNumerics(const UnicodeString& input, UnicodeSet& result, UErr if (u_charType(codePoint) == U_DECIMAL_DIGIT_NUMBER) { // Store the zero character as a representative for comparison. // Unicode guarantees it is codePoint - value - result.add(codePoint - (UChar32)u_getNumericValue(codePoint)); + result.add(codePoint - static_cast<UChar32>(u_getNumericValue(codePoint))); } } } @@ -432,7 +432,7 @@ UChar32 SpoofImpl::ScanHex(const char16_t *s, int32_t start, int32_t limit, UErr status = U_PARSE_ERROR; val = 0; } - return (UChar32)val; + return static_cast<UChar32>(val); } @@ -601,7 +601,7 @@ SpoofData::SpoofData(const void *data, int32_t length, UErrorCode &status) if (U_FAILURE(status)) { return; } - if ((size_t)length < sizeof(SpoofDataHeader)) { + if (static_cast<size_t>(length) < sizeof(SpoofDataHeader)) { status = U_INVALID_FORMAT_ERROR; return; } @@ -688,13 +688,13 @@ void SpoofData::initPtrs(UErrorCode &status) { return; } if (fRawData->fCFUKeys != 0) { - fCFUKeys = (int32_t *)((char *)fRawData + fRawData->fCFUKeys); + fCFUKeys = reinterpret_cast<int32_t*>(reinterpret_cast<char*>(fRawData) + fRawData->fCFUKeys); } if (fRawData->fCFUStringIndex != 0) { - fCFUValues = (uint16_t *)((char *)fRawData + fRawData->fCFUStringIndex); + fCFUValues = reinterpret_cast<uint16_t*>(reinterpret_cast<char*>(fRawData) + fRawData->fCFUStringIndex); } if (fRawData->fCFUStringTable != 0) { - fCFUStrings = (char16_t *)((char *)fRawData + fRawData->fCFUStringTable); + fCFUStrings = reinterpret_cast<char16_t*>(reinterpret_cast<char*>(fRawData) + fRawData->fCFUStringTable); } } @@ -739,7 +739,7 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) { fRawData->fLength = fMemLimit; uprv_memset((char *)fRawData + returnOffset, 0, numBytes); initPtrs(status); - return (char *)fRawData + returnOffset; + return reinterpret_cast<char*>(fRawData) + returnOffset; } int32_t SpoofData::serialize(void *buf, int32_t capacity, UErrorCode &status) const { @@ -806,7 +806,7 @@ int32_t SpoofData::appendValueTo(int32_t index, UnicodeString& dest) const { // an index into the string table (for longer strings) uint16_t value = fCFUValues[index]; if (stringLength == 1) { - dest.append((char16_t)value); + dest.append(static_cast<char16_t>(value)); } else { dest.append(fCFUStrings + value, stringLength); } diff --git a/deps/icu-small/source/i18n/utf16collationiterator.cpp b/deps/icu-small/source/i18n/utf16collationiterator.cpp index e04721f7d7d4c8..64c454b5d36807 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf16collationiterator.cpp @@ -53,7 +53,7 @@ UTF16CollationIterator::resetToOffset(int32_t newOffset) { int32_t UTF16CollationIterator::getOffset() const { - return (int32_t)(pos - start); + return static_cast<int32_t>(pos - start); } uint32_t @@ -198,11 +198,11 @@ FCDUTF16CollationIterator::resetToOffset(int32_t newOffset) { int32_t FCDUTF16CollationIterator::getOffset() const { if(checkDir != 0 || start == segmentStart) { - return (int32_t)(pos - rawStart); + return static_cast<int32_t>(pos - rawStart); } else if(pos == start) { - return (int32_t)(segmentStart - rawStart); + return static_cast<int32_t>(segmentStart - rawStart); } else { - return (int32_t)(segmentLimit - rawStart); + return static_cast<int32_t>(segmentLimit - rawStart); } } @@ -381,7 +381,7 @@ FCDUTF16CollationIterator::nextSegment(UErrorCode &errorCode) { // Fetch the next character's fcd16 value. const char16_t *q = p; uint16_t fcd16 = nfcImpl.nextFCD16(p, rawLimit); - uint8_t leadCC = (uint8_t)(fcd16 >> 8); + uint8_t leadCC = static_cast<uint8_t>(fcd16 >> 8); if(leadCC == 0 && q != pos) { // FCD boundary before the [q, p[ character. limit = segmentLimit = q; @@ -396,7 +396,7 @@ FCDUTF16CollationIterator::nextSegment(UErrorCode &errorCode) { pos = start; break; } - prevCC = (uint8_t)fcd16; + prevCC = static_cast<uint8_t>(fcd16); if(p == rawLimit || prevCC == 0) { // FCD boundary after the last character. limit = segmentLimit = p; @@ -445,7 +445,7 @@ FCDUTF16CollationIterator::previousSegment(UErrorCode &errorCode) { // Fetch the previous character's fcd16 value. const char16_t *q = p; uint16_t fcd16 = nfcImpl.previousFCD16(rawStart, p); - uint8_t trailCC = (uint8_t)fcd16; + uint8_t trailCC = static_cast<uint8_t>(fcd16); if(trailCC == 0 && q != pos) { // FCD boundary after the [p, q[ character. start = segmentStart = q; @@ -462,7 +462,7 @@ FCDUTF16CollationIterator::previousSegment(UErrorCode &errorCode) { pos = limit; break; } - nextCC = (uint8_t)(fcd16 >> 8); + nextCC = static_cast<uint8_t>(fcd16 >> 8); if(p == rawStart || nextCC == 0) { // FCD boundary before the following character. start = segmentStart = p; @@ -478,7 +478,7 @@ UBool FCDUTF16CollationIterator::normalize(const char16_t *from, const char16_t *to, UErrorCode &errorCode) { // NFD without argument checking. U_ASSERT(U_SUCCESS(errorCode)); - nfcImpl.decompose(from, to, normalized, (int32_t)(to - from), errorCode); + nfcImpl.decompose(from, to, normalized, static_cast<int32_t>(to - from), errorCode); if(U_FAILURE(errorCode)) { return false; } // Switch collation processing into the FCD buffer // with the result of normalizing [segmentStart, segmentLimit[. diff --git a/deps/icu-small/source/i18n/utf8collationiterator.cpp b/deps/icu-small/source/i18n/utf8collationiterator.cpp index ea7278afc6ca66..470a757accd858 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf8collationiterator.cpp @@ -396,7 +396,7 @@ FCDUTF8CollationIterator::nextSegment(UErrorCode &errorCode) { UChar32 c; U8_NEXT_OR_FFFD(u8, pos, length, c); uint16_t fcd16 = nfcImpl.getFCD16(c); - uint8_t leadCC = (uint8_t)(fcd16 >> 8); + uint8_t leadCC = static_cast<uint8_t>(fcd16 >> 8); if(leadCC == 0 && cpStart != segmentStart) { // FCD boundary before this character. pos = cpStart; @@ -421,7 +421,7 @@ FCDUTF8CollationIterator::nextSegment(UErrorCode &errorCode) { pos = 0; return true; } - prevCC = (uint8_t)fcd16; + prevCC = static_cast<uint8_t>(fcd16); if(pos == length || prevCC == 0) { // FCD boundary after the last character. break; @@ -475,7 +475,7 @@ FCDUTF8CollationIterator::previousSegment(UErrorCode &errorCode) { UChar32 c; U8_PREV_OR_FFFD(u8, 0, pos, c); uint16_t fcd16 = nfcImpl.getFCD16(c); - uint8_t trailCC = (uint8_t)fcd16; + uint8_t trailCC = static_cast<uint8_t>(fcd16); if(trailCC == 0 && cpLimit != segmentLimit) { // FCD boundary after this character. pos = cpLimit; @@ -503,7 +503,7 @@ FCDUTF8CollationIterator::previousSegment(UErrorCode &errorCode) { pos = normalized.length(); return true; } - nextCC = (uint8_t)(fcd16 >> 8); + nextCC = static_cast<uint8_t>(fcd16 >> 8); if(pos == 0 || nextCC == 0) { // FCD boundary before the following character. break; diff --git a/deps/icu-small/source/i18n/utrans.cpp b/deps/icu-small/source/i18n/utrans.cpp index 390335f3342e03..1e4970c3dbb972 100644 --- a/deps/icu-small/source/i18n/utrans.cpp +++ b/deps/icu-small/source/i18n/utrans.cpp @@ -323,7 +323,7 @@ utrans_enum_unext(UEnumeration *uenum, int32_t* resultLength, UErrorCode *pErrorCode) { if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; } UTransEnumeration *ute=(UTransEnumeration *)uenum; @@ -405,7 +405,7 @@ utrans_trans(const UTransliterator* trans, utrans_ENTRY(status); - if (trans == 0 || rep == 0 || repFunc == 0 || limit == 0) { + if (trans == nullptr || rep == nullptr || repFunc == nullptr || limit == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -424,7 +424,7 @@ utrans_transIncremental(const UTransliterator* trans, utrans_ENTRY(status); - if (trans == 0 || rep == 0 || repFunc == 0 || pos == 0) { + if (trans == nullptr || rep == nullptr || repFunc == nullptr || pos == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -445,7 +445,7 @@ utrans_transUChars(const UTransliterator* trans, utrans_ENTRY(status); - if (trans == 0 || text == 0 || limit == 0) { + if (trans == nullptr || text == nullptr || limit == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; return; } @@ -475,7 +475,7 @@ utrans_transIncrementalUChars(const UTransliterator* trans, utrans_ENTRY(status); - if (trans == 0 || text == 0 || pos == 0) { + if (trans == nullptr || text == nullptr || pos == nullptr) { *status = U_ILLEGAL_ARGUMENT_ERROR; return; } diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index 25af556aa228d3..8c0295bdcbe8b5 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -139,7 +139,7 @@ static UnicodeString& appendAsciiDigits(int32_t number, uint8_t length, UnicodeS str.append(MINUS); } for (i = length - 1; i >= 0; i--) { - str.append((char16_t)(digits[i] + 0x0030)); + str.append(static_cast<char16_t>(digits[i] + 0x0030)); } return str; } @@ -151,11 +151,11 @@ static UnicodeString& appendMillis(UDate date, UnicodeString& str) { int64_t number; if (date < MIN_MILLIS) { - number = (int64_t)MIN_MILLIS; + number = static_cast<int64_t>(MIN_MILLIS); } else if (date > MAX_MILLIS) { - number = (int64_t)MAX_MILLIS; + number = static_cast<int64_t>(MAX_MILLIS); } else { - number = (int64_t)date; + number = static_cast<int64_t>(date); } if (number < 0) { negative = true; @@ -163,7 +163,7 @@ static UnicodeString& appendMillis(UDate date, UnicodeString& str) { } i = 0; do { - digits[i++] = (int32_t)(number % 10); + digits[i++] = static_cast<int32_t>(number % 10); number /= 10; } while (number != 0); @@ -172,7 +172,7 @@ static UnicodeString& appendMillis(UDate date, UnicodeString& str) { } i--; while (i >= 0) { - str.append((char16_t)(digits[i--] + 0x0030)); + str.append(static_cast<char16_t>(digits[i--] + 0x0030)); } return str; } @@ -180,15 +180,18 @@ static UnicodeString& appendMillis(UDate date, UnicodeString& str) { /* * Convert date/time to RFC2445 Date-Time form #1 DATE WITH LOCAL TIME */ -static UnicodeString& getDateTimeString(UDate time, UnicodeString& str) { - int32_t year, month, dom, dow, doy, mid; - Grego::timeToFields(time, year, month, dom, dow, doy, mid); +static UnicodeString& getDateTimeString(UDate time, UnicodeString& str, UErrorCode& status) { + if (U_FAILURE(status)) {return str;} + int32_t year, mid; + int8_t month, dom, dow; + Grego::timeToFields(time, year, month, dom, dow, mid, status); + if (U_FAILURE(status)) {return str;} str.remove(); appendAsciiDigits(year, 4, str); appendAsciiDigits(month + 1, 2, str); appendAsciiDigits(dom, 2, str); - str.append((char16_t)0x0054 /*'T'*/); + str.append(static_cast<char16_t>(0x0054) /*'T'*/); int32_t t = mid; int32_t hour = t / U_MILLIS_PER_HOUR; @@ -206,9 +209,9 @@ static UnicodeString& getDateTimeString(UDate time, UnicodeString& str) { /* * Convert date/time to RFC2445 Date-Time form #2 DATE WITH UTC TIME */ -static UnicodeString& getUTCDateTimeString(UDate time, UnicodeString& str) { - getDateTimeString(time, str); - str.append((char16_t)0x005A /*'Z'*/); +static UnicodeString& getUTCDateTimeString(UDate time, UnicodeString& str, UErrorCode& status) { + getDateTimeString(time, str, status); + str.append(static_cast<char16_t>(0x005A) /*'Z'*/); return str; } @@ -529,7 +532,7 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff DateTimeRule *adtr = nullptr; // Parse the first rule - UnicodeString rrule = *((UnicodeString*)dates->elementAt(0)); + UnicodeString rrule = *static_cast<UnicodeString*>(dates->elementAt(0)); int32_t month, dayOfWeek, nthDayOfWeek, dayOfMonth = 0; int32_t days[7]; int32_t daysCount = UPRV_LENGTHOF(days); @@ -605,7 +608,7 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff int32_t anotherMonth = -1; for (i = 1; i < dates->size(); i++) { - rrule = *((UnicodeString*)dates->elementAt(i)); + rrule = *static_cast<UnicodeString*>(dates->elementAt(i)); UDate tmp_until; int32_t tmp_month, tmp_dayOfWeek, tmp_nthDayOfWeek; int32_t tmp_days[7]; @@ -673,9 +676,13 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff } // Calculate start/end year and missing fields - int32_t startYear, startMonth, startDOM, startDOW, startDOY, startMID; + int32_t startYear, startMID; + int8_t startMonth, startDOM; Grego::timeToFields(start + fromOffset, startYear, startMonth, startDOM, - startDOW, startDOY, startMID); + startMID, status); + if (U_FAILURE(status)) { + return nullptr; + } if (month == -1) { // If BYMONTH is not set, use the month of DTSTART month = startMonth; @@ -687,8 +694,8 @@ static TimeZoneRule* createRuleByRRULE(const UnicodeString& zonename, int rawOff int32_t endYear; if (until != MIN_MILLIS) { - int32_t endMonth, endDOM, endDOW, endDOY, endMID; - Grego::timeToFields(until, endYear, endMonth, endDOM, endDOW, endDOY, endMID); + endYear = Grego::timeToYear(until, status); + if (U_FAILURE(status)) return nullptr; } else { endYear = AnnualTimeZoneRule::MAX_YEAR; } @@ -731,13 +738,13 @@ static TimeZoneRule* createRuleByRDATE(const UnicodeString& zonename, int32_t ra } else { // Create an array of transition times int32_t size = dates->size(); - UDate* times = (UDate*)uprv_malloc(sizeof(UDate) * size); + UDate* times = static_cast<UDate*>(uprv_malloc(sizeof(UDate) * size)); if (times == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } for (int32_t i = 0; i < size; i++) { - UnicodeString *datestr = (UnicodeString*)dates->elementAt(i); + UnicodeString* datestr = static_cast<UnicodeString*>(dates->elementAt(i)); times[i] = parseDateTimeString(*datestr, fromOffset, status); if (U_FAILURE(status)) { uprv_free(times); @@ -974,7 +981,7 @@ VTimeZone::VTimeZone(const VTimeZone& source) return; } for (int32_t i = 0; i < size; i++) { - UnicodeString *line = ((UnicodeString*)source.vtzlines->elementAt(i))->clone(); + UnicodeString* line = static_cast<UnicodeString*>(source.vtzlines->elementAt(i))->clone(); lpVtzLines->adoptElement(line, status); if (U_FAILURE(status) || line == nullptr) { return; @@ -985,12 +992,8 @@ VTimeZone::VTimeZone(const VTimeZone& source) } VTimeZone::~VTimeZone() { - if (tz != nullptr) { - delete tz; - } - if (vtzlines != nullptr) { - delete vtzlines; - } + delete tz; + delete vtzlines; } VTimeZone& @@ -1019,7 +1022,7 @@ VTimeZone::operator=(const VTimeZone& right) { if (U_SUCCESS(status)) { for (int32_t i = 0; i < size; i++) { LocalPointer<UnicodeString> line( - ((UnicodeString*)right.vtzlines->elementAt(i))->clone(), status); + static_cast<UnicodeString*>(right.vtzlines->elementAt(i))->clone(), status); lpVtzLines->adoptElement(line.orphan(), status); if (U_FAILURE(status)) { break; @@ -1399,7 +1402,7 @@ VTimeZone::parse(UErrorCode& status) { } for (n = 0; n < vtzlines->size(); n++) { - UnicodeString *line = (UnicodeString*)vtzlines->elementAt(n); + UnicodeString* line = static_cast<UnicodeString*>(vtzlines->elementAt(n)); int32_t valueSep = line->indexOf(COLON); if (valueSep < 0) { continue; @@ -1610,7 +1613,7 @@ VTimeZone::parse(UErrorCode& status) { } for (n = 0; n < rules.size(); n++) { - TimeZoneRule *r = (TimeZoneRule*)rules.elementAt(n); + TimeZoneRule* r = static_cast<TimeZoneRule*>(rules.elementAt(n)); AnnualTimeZoneRule *atzrule = dynamic_cast<AnnualTimeZoneRule *>(r); if (atzrule != nullptr) { if (atzrule->getEndYear() == AnnualTimeZoneRule::MAX_YEAR) { @@ -1633,7 +1636,7 @@ VTimeZone::parse(UErrorCode& status) { rules.removeAllElements(); } else { // Normalize the final rule - AnnualTimeZoneRule *finalRule = (AnnualTimeZoneRule*)rules.elementAt(finalRuleIdx); + AnnualTimeZoneRule* finalRule = static_cast<AnnualTimeZoneRule*>(rules.elementAt(finalRuleIdx)); int32_t tmpRaw = finalRule->getRawOffset(); int32_t tmpDST = finalRule->getDSTSavings(); @@ -1645,7 +1648,7 @@ VTimeZone::parse(UErrorCode& status) { if (finalRuleIdx == n) { continue; } - TimeZoneRule *r = (TimeZoneRule*)rules.elementAt(n); + TimeZoneRule* r = static_cast<TimeZoneRule*>(rules.elementAt(n)); UDate lastStart; r->getFinalStart(tmpRaw, tmpDST, lastStart); if (lastStart > start) { @@ -1672,8 +1675,8 @@ VTimeZone::parse(UErrorCode& status) { status); } else { // Update the end year - int32_t y, m, d, dow, doy, mid; - Grego::timeToFields(start, y, m, d, dow, doy, mid); + int32_t y = Grego::timeToYear(start, status); + if (U_FAILURE(status)) return; newRule.adoptInsteadAndCheckErrorCode( new AnnualTimeZoneRule( finalRule->getName(tznam), @@ -1696,7 +1699,7 @@ VTimeZone::parse(UErrorCode& status) { } while (!rules.isEmpty()) { - TimeZoneRule *tzr = (TimeZoneRule*)rules.orphanElementAt(0); + TimeZoneRule* tzr = static_cast<TimeZoneRule*>(rules.orphanElementAt(0)); rbtz->addTransitionRule(tzr, status); if (U_FAILURE(status)) { return; @@ -1713,9 +1716,10 @@ VTimeZone::parse(UErrorCode& status) { void VTimeZone::write(VTZWriter& writer, UErrorCode& status) const { + if (U_FAILURE(status)) return; if (vtzlines != nullptr) { for (int32_t i = 0; i < vtzlines->size(); i++) { - UnicodeString *line = (UnicodeString*)vtzlines->elementAt(i); + UnicodeString* line = static_cast<UnicodeString*>(vtzlines->elementAt(i)); if (line->startsWith(ICAL_TZURL, -1) && line->charAt(u_strlen(ICAL_TZURL)) == COLON) { writer.write(ICAL_TZURL); @@ -1727,7 +1731,8 @@ VTimeZone::write(VTZWriter& writer, UErrorCode& status) const { UnicodeString utcString; writer.write(ICAL_LASTMOD); writer.write(COLON); - writer.write(getUTCDateTimeString(lastmod, utcString)); + writer.write(getUTCDateTimeString(lastmod, utcString, status)); + if (U_FAILURE(status)) return; writer.write(ICAL_NEWLINE); } else { writer.write(*line); @@ -1772,7 +1777,7 @@ VTimeZone::write(UDate start, VTZWriter& writer, UErrorCode& status) const { if (lpTransitionRules.isValid()) { U_ASSERT(transitionRules->hasDeleter()); // Assumed for U_FAILURE early return, below. while (!lpTransitionRules->isEmpty()) { - TimeZoneRule *tr = (TimeZoneRule*)lpTransitionRules->orphanElementAt(0); + TimeZoneRule* tr = static_cast<TimeZoneRule*>(lpTransitionRules->orphanElementAt(0)); rbtz.addTransitionRule(tr, status); if (U_FAILURE(status)) { return; @@ -1791,11 +1796,11 @@ VTimeZone::write(UDate start, VTZWriter& writer, UErrorCode& status) const { return; } icutzprop->append(olsonzid); - icutzprop->append((char16_t)0x005B/*'['*/); + icutzprop->append(static_cast<char16_t>(0x005B)/*'['*/); icutzprop->append(icutzver); icutzprop->append(ICU_TZINFO_PARTIAL, -1); appendMillis(start, *icutzprop); - icutzprop->append((char16_t)0x005D/*']'*/); + icutzprop->append(static_cast<char16_t>(0x005D)/*']'*/); customProps.adoptElement(icutzprop, status); if (U_FAILURE(status)) { return; @@ -1838,11 +1843,11 @@ VTimeZone::writeSimple(UDate time, VTZWriter& writer, UErrorCode& status) const return; } icutzprop->append(olsonzid); - icutzprop->append((char16_t)0x005B/*'['*/); + icutzprop->append(static_cast<char16_t>(0x005B)/*'['*/); icutzprop->append(icutzver); icutzprop->append(ICU_TZINFO_SIMPLE, -1); appendMillis(time, *icutzprop); - icutzprop->append((char16_t)0x005D/*']'*/); + icutzprop->append(static_cast<char16_t>(0x005D)/*']'*/); customProps.adoptElement(icutzprop.orphan(), status); } writeZone(writer, rbtz, &customProps, status); @@ -1862,7 +1867,7 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, if (customProps != nullptr) { for (int32_t i = 0; i < customProps->size(); i++) { - UnicodeString *custprop = (UnicodeString*)customProps->elementAt(i); + UnicodeString* custprop = static_cast<UnicodeString*>(customProps->elementAt(i)); w.write(*custprop); w.write(ICAL_NEWLINE); } @@ -1897,7 +1902,8 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, int32_t stdCount = 0; AnnualTimeZoneRule *finalStdRule = nullptr; - int32_t year, month, dom, dow, doy, mid; + int32_t year, mid; + int8_t month, dom, dow; UBool hasTransitions = false; TimeZoneTransition tzt; UBool tztAvail; @@ -1917,7 +1923,8 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, int32_t fromOffset = tzt.getFrom()->getRawOffset() + tzt.getFrom()->getDSTSavings(); int32_t fromDSTSavings = tzt.getFrom()->getDSTSavings(); int32_t toOffset = tzt.getTo()->getRawOffset() + tzt.getTo()->getDSTSavings(); - Grego::timeToFields(tzt.getTime() + fromOffset, year, month, dom, dow, doy, mid); + Grego::timeToFields(tzt.getTime() + fromOffset, year, month, dom, dow, mid, status); + if (U_FAILURE(status)) return; int32_t weekInMonth = Grego::dayOfWeekInMonth(year, month, dom); UBool sameRule = false; const AnnualTimeZoneRule *atzrule; @@ -2132,12 +2139,8 @@ VTimeZone::writeZone(VTZWriter& w, BasicTimeZone& basictz, cleanupWriteZone: - if (finalStdRule != nullptr) { - delete finalStdRule; - } - if (finalDstRule != nullptr) { - delete finalDstRule; - } + delete finalStdRule; + delete finalDstRule; } void @@ -2166,7 +2169,7 @@ VTimeZone::writeHeaders(VTZWriter& writer, UErrorCode& status) const { UnicodeString lastmodStr; writer.write(ICAL_LASTMOD); writer.write(COLON); - writer.write(getUTCDateTimeString(lastmod, lastmodStr)); + writer.write(getUTCDateTimeString(lastmod, lastmodStr, status)); writer.write(ICAL_NEWLINE); } } @@ -2203,8 +2206,11 @@ VTimeZone::writeZonePropsByTime(VTZWriter& writer, UBool isDst, const UnicodeStr writer.write(ICAL_RDATE); writer.write(COLON); UnicodeString timestr; - writer.write(getDateTimeString(time + fromOffset, timestr)); + writer.write(getDateTimeString(time + fromOffset, timestr, status)); writer.write(ICAL_NEWLINE); + if (U_FAILURE(status)) { + return; + } } endZoneProps(writer, isDst, status); if (U_FAILURE(status)) { @@ -2237,7 +2243,7 @@ VTimeZone::writeZonePropsByDOM(VTZWriter& writer, UBool isDst, const UnicodeStri appendAsciiDigits(dayOfMonth, 0, dstr); writer.write(dstr); if (untilTime != MAX_MILLIS) { - appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr), status); + appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr, status), status); if (U_FAILURE(status)) { return; } @@ -2273,7 +2279,7 @@ VTimeZone::writeZonePropsByDOW(VTZWriter& writer, UBool isDst, const UnicodeStri writer.write(ICAL_DOW_NAMES[dayOfWeek - 1]); // SU, MO, TU... if (untilTime != MAX_MILLIS) { - appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr), status); + appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr, status), status); if (U_FAILURE(status)) { return; } @@ -2398,7 +2404,7 @@ VTimeZone::writeZonePropsByDOW_GEQ_DOM_sub(VTZWriter& writer, int32_t month, int } if (untilTime != MAX_MILLIS) { - appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr), status); + appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr, status), status); if (U_FAILURE(status)) { return; } @@ -2537,7 +2543,10 @@ VTimeZone::beginZoneProps(VTZWriter& writer, UBool isDst, const UnicodeString& z // DTSTART writer.write(ICAL_DTSTART); writer.write(COLON); - writer.write(getDateTimeString(startTime + fromOffset, dstr)); + writer.write(getDateTimeString(startTime + fromOffset, dstr, status)); + if (U_FAILURE(status)) { + return; + } writer.write(ICAL_NEWLINE); } diff --git a/deps/icu-small/source/i18n/vzone.cpp b/deps/icu-small/source/i18n/vzone.cpp index 5517e5144c0a4c..50935618edeace 100644 --- a/deps/icu-small/source/i18n/vzone.cpp +++ b/deps/icu-small/source/i18n/vzone.cpp @@ -87,8 +87,6 @@ vzone_write(VZone* zone, char16_t* & result, int32_t & resultLength, UErrorCode& resultLength = s.length(); result = (char16_t*)uprv_malloc(resultLength); memcpy(result,s.getBuffer(),resultLength); - - return; } U_CAPI void U_EXPORT2 @@ -99,8 +97,6 @@ vzone_writeFromStart(VZone* zone, UDate start, char16_t* & result, int32_t & res resultLength = s.length(); result = (char16_t*)uprv_malloc(resultLength); memcpy(result,s.getBuffer(),resultLength); - - return; } U_CAPI void U_EXPORT2 @@ -111,8 +107,6 @@ vzone_writeSimple(VZone* zone, UDate time, char16_t* & result, int32_t & resultL resultLength = s.length(); result = (char16_t*)uprv_malloc(resultLength); memcpy(result,s.getBuffer(),resultLength); - - return; } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index 6d705b299d797e..f1d5c25f3ead9b 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -30,7 +30,6 @@ #include "unicode/timezone.h" #include "unicode/utmscale.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "ulocimp.h" @@ -47,6 +46,7 @@ # define NOIME # define NOMCX #include <windows.h> +#include <typeinfo> U_NAMESPACE_BEGIN @@ -104,11 +104,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt UErrorCode status = U_ZERO_ERROR; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - CharString asciiBCP47Tag; - { - CharStringByteSink sink(&asciiBCP47Tag); - ulocimp_toLanguageTag(locale.getName(), sink, false, &status); - } + CharString asciiBCP47Tag = ulocimp_toLanguageTag(locale.getName(), false, status); if (U_SUCCESS(status)) { @@ -256,7 +252,7 @@ UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, F formatDate(&st_local, date); formatTime(&st_local, time); - if (strcmp(fCalendar->getType(), cal.getType()) != 0) { + if (typeid(cal) != typeid(*fCalendar)) { pattern = getTimeDateFormat(&cal, &fLocale, status); } @@ -277,7 +273,7 @@ void Win32DateFormat::parse(const UnicodeString& /* text */, Calendar& /* cal */ void Win32DateFormat::adoptCalendar(Calendar *newCalendar) { - if (fCalendar == nullptr || strcmp(fCalendar->getType(), newCalendar->getType()) != 0) { + if (fCalendar == nullptr || typeid(*fCalendar) != typeid(*newCalendar)) { UErrorCode status = U_ZERO_ERROR; if (fDateStyle != DateFormat::kNone && fTimeStyle != DateFormat::kNone) { @@ -412,4 +408,3 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // U_PLATFORM_USES_ONLY_WIN32_API - diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index bf0bd20095c00b..a23e3eb8c58d0c 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -24,7 +24,6 @@ #include "unicode/locid.h" #include "unicode/ustring.h" -#include "bytesinkutil.h" #include "charstr.h" #include "cmemory.h" #include "uassert.h" @@ -149,11 +148,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt UErrorCode status = U_ZERO_ERROR; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - CharString asciiBCP47Tag; - { - CharStringByteSink sink(&asciiBCP47Tag); - ulocimp_toLanguageTag(locale.getName(), sink, false, &status); - } + CharString asciiBCP47Tag = ulocimp_toLanguageTag(locale.getName(), false, status); if (U_SUCCESS(status)) { diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index 78d2391479f2ef..6257d4a2b9ca8e 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -258,7 +258,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { // Check if it was already cached umtx_lock(&gZoneMetaLock); { - canonicalID = (const char16_t *)uhash_get(gCanonicalIDCache, utzid); + canonicalID = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, utzid)); } umtx_unlock(&gZoneMetaLock); @@ -309,7 +309,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { } else { int32_t len = u_strlen(derefer); u_UCharsToChars(derefer,id,len); - id[len] = (char) 0; // Make sure it is null terminated. + id[len] = static_cast<char>(0); // Make sure it is null terminated. // replace '/' with ':' char *q = id; @@ -343,20 +343,20 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { // Put the resolved canonical ID to the cache umtx_lock(&gZoneMetaLock); { - const char16_t* idInCache = (const char16_t *)uhash_get(gCanonicalIDCache, utzid); + const char16_t* idInCache = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, utzid)); if (idInCache == nullptr) { const char16_t* key = ZoneMeta::findTimeZoneID(tzid); U_ASSERT(key != nullptr); if (key != nullptr) { - idInCache = (const char16_t *)uhash_put(gCanonicalIDCache, (void *)key, (void *)canonicalID, &status); + idInCache = static_cast<const char16_t*>(uhash_put(gCanonicalIDCache, const_cast<char16_t*>(key), const_cast<char16_t*>(canonicalID), &status)); U_ASSERT(idInCache == nullptr); } } if (U_SUCCESS(status) && isInputCanonical) { // Also put canonical ID itself into the cache if not exist - const char16_t *canonicalInCache = (const char16_t*)uhash_get(gCanonicalIDCache, canonicalID); + const char16_t* canonicalInCache = static_cast<const char16_t*>(uhash_get(gCanonicalIDCache, canonicalID)); if (canonicalInCache == nullptr) { - canonicalInCache = (const char16_t *)uhash_put(gCanonicalIDCache, (void *)canonicalID, (void *)canonicalID, &status); + canonicalInCache = static_cast<const char16_t*>(uhash_put(gCanonicalIDCache, const_cast<char16_t*>(canonicalID), const_cast<char16_t*>(canonicalID), &status)); U_ASSERT(canonicalInCache == nullptr); } } @@ -550,7 +550,7 @@ ZoneMeta::getMetazoneID(const UnicodeString &tzid, UDate date, UnicodeString &re const UVector *mappings = getMetazoneMappings(tzid); if (mappings != nullptr) { for (int32_t i = 0; i < mappings->size(); i++) { - OlsonToMetaMappingEntry *mzm = (OlsonToMetaMappingEntry*)mappings->elementAt(i); + OlsonToMetaMappingEntry* mzm = static_cast<OlsonToMetaMappingEntry*>(mappings->elementAt(i)); if (mzm->from <= date && mzm->to > date) { result.setTo(mzm->mzid, -1); isSet = true; @@ -596,7 +596,7 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { umtx_lock(&gZoneMetaLock); { - result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); + result = static_cast<UVector*>(uhash_get(gOlsonToMeta, tzidUChars)); } umtx_unlock(&gZoneMetaLock); @@ -615,11 +615,11 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { umtx_lock(&gZoneMetaLock); { // make sure it's already created - result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); + result = static_cast<UVector*>(uhash_get(gOlsonToMeta, tzidUChars)); if (result == nullptr) { // add the one just created int32_t tzidLen = tzid.length() + 1; - char16_t *key = (char16_t*)uprv_malloc(tzidLen * sizeof(char16_t)); + char16_t* key = static_cast<char16_t*>(uprv_malloc(tzidLen * sizeof(char16_t))); if (key == nullptr) { // memory allocation error.. just return nullptr result = nullptr; @@ -806,7 +806,7 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { } const char *mzID = ures_getKey(res.getAlias()); int32_t len = static_cast<int32_t>(uprv_strlen(mzID)); - LocalMemory<char16_t> uMzID((char16_t*)uprv_malloc(sizeof(char16_t) * (len + 1))); + LocalMemory<char16_t> uMzID(static_cast<char16_t*>(uprv_malloc(sizeof(char16_t) * (len + 1)))); if (uMzID.isNull()) { status = U_MEMORY_ALLOCATION_ERROR; break; @@ -847,7 +847,7 @@ ZoneMeta::findMetaZoneID(const UnicodeString& mzid) { if (gMetaZoneIDTable == nullptr) { return nullptr; } - return (const char16_t*)uhash_get(gMetaZoneIDTable, &mzid); + return static_cast<const char16_t*>(uhash_get(gMetaZoneIDTable, &mzid)); } const char16_t* @@ -883,20 +883,20 @@ ZoneMeta::formatCustomID(uint8_t hour, uint8_t min, uint8_t sec, UBool negative, id.setTo(gCustomTzPrefix, -1); if (hour != 0 || min != 0) { if (negative) { - id.append((char16_t)0x2D); // '-' + id.append(static_cast<char16_t>(0x2D)); // '-' } else { - id.append((char16_t)0x2B); // '+' + id.append(static_cast<char16_t>(0x2B)); // '+' } // Always use US-ASCII digits - id.append((char16_t)(0x30 + (hour%100)/10)); - id.append((char16_t)(0x30 + (hour%10))); - id.append((char16_t)0x3A); // ':' - id.append((char16_t)(0x30 + (min%100)/10)); - id.append((char16_t)(0x30 + (min%10))); + id.append(static_cast<char16_t>(0x30 + (hour % 100) / 10)); + id.append(static_cast<char16_t>(0x30 + (hour % 10))); + id.append(static_cast<char16_t>(0x3A)); // ':' + id.append(static_cast<char16_t>(0x30 + (min % 100) / 10)); + id.append(static_cast<char16_t>(0x30 + (min % 10))); if (sec != 0) { - id.append((char16_t)0x3A); // ':' - id.append((char16_t)(0x30 + (sec%100)/10)); - id.append((char16_t)(0x30 + (sec%10))); + id.append(static_cast<char16_t>(0x3A)); // ':' + id.append(static_cast<char16_t>(0x30 + (sec % 100) / 10)); + id.append(static_cast<char16_t>(0x30 + (sec % 10))); } } return id; @@ -933,7 +933,7 @@ ZoneMeta::getShortIDFromCanonical(const char16_t* canonicalID) { char tzidKey[ZID_KEY_MAX + 1]; u_UCharsToChars(canonicalID, tzidKey, len); - tzidKey[len] = (char) 0; // Make sure it is null terminated. + tzidKey[len] = static_cast<char>(0); // Make sure it is null terminated. // replace '/' with ':' char *p = tzidKey; diff --git a/deps/icu-small/source/i18n/zrule.cpp b/deps/icu-small/source/i18n/zrule.cpp index 1ba0c9705e9817..39f6eeedfd4c01 100644 --- a/deps/icu-small/source/i18n/zrule.cpp +++ b/deps/icu-small/source/i18n/zrule.cpp @@ -45,7 +45,6 @@ zrule_getName(ZRule* rule, char16_t* name, int32_t nameLength) { s = ((TimeZoneRule*)rule)->TimeZoneRule::getName(s); nameLength = s.length(); memcpy(name, s.getBuffer(), nameLength); - return; } U_CAPI int32_t U_EXPORT2 @@ -96,7 +95,6 @@ izrule_getName(IZRule* rule, char16_t* & name, int32_t & nameLength) { nameLength = s.length(); name = (char16_t*)uprv_malloc(nameLength); memcpy(name, s.getBuffer(), nameLength); - return; } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/tools/escapesrc/cptbl.h b/deps/icu-small/source/tools/escapesrc/cptbl.h index 898e16c925d2f0..6c82ff1b51ab51 100644 --- a/deps/icu-small/source/tools/escapesrc/cptbl.h +++ b/deps/icu-small/source/tools/escapesrc/cptbl.h @@ -1,263 +1,263 @@ // Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html // generated by tblgen. You weren't going to edit it by hand, were you? -static const char cp1047_8859_1[256] = { - (char)0x00, /* 00 */ - (char)0x01, /* 01 */ - (char)0x02, /* 02 */ - (char)0x03, /* 03 */ - (char)0x9C, /* 04 */ - (char)0x09, /* 05 */ - (char)0x86, /* 06 */ - (char)0x7F, /* 07 */ - (char)0x97, /* 08 */ - (char)0x8D, /* 09 */ - (char)0x8E, /* 0A */ - (char)0x0B, /* 0B */ - (char)0x0C, /* 0C */ - (char)0x0D, /* 0D */ - (char)0x0E, /* 0E */ - (char)0x0F, /* 0F */ - (char)0x10, /* 10 */ - (char)0x11, /* 11 */ - (char)0x12, /* 12 */ - (char)0x13, /* 13 */ - (char)0x9D, /* 14 */ - (char)0x85, /* 15 */ - (char)0x08, /* 16 */ - (char)0x87, /* 17 */ - (char)0x18, /* 18 */ - (char)0x19, /* 19 */ - (char)0x92, /* 1A */ - (char)0x8F, /* 1B */ - (char)0x1C, /* 1C */ - (char)0x1D, /* 1D */ - (char)0x1E, /* 1E */ - (char)0x1F, /* 1F */ - (char)0x80, /* 20 */ - (char)0x81, /* 21 */ - (char)0x82, /* 22 */ - (char)0x83, /* 23 */ - (char)0x84, /* 24 */ - (char)0x0A, /* 25 */ - (char)0x17, /* 26 */ - (char)0x1B, /* 27 */ - (char)0x88, /* 28 */ - (char)0x89, /* 29 */ - (char)0x8A, /* 2A */ - (char)0x8B, /* 2B */ - (char)0x8C, /* 2C */ - (char)0x05, /* 2D */ - (char)0x06, /* 2E */ - (char)0x07, /* 2F */ - (char)0x90, /* 30 */ - (char)0x91, /* 31 */ - (char)0x16, /* 32 */ - (char)0x93, /* 33 */ - (char)0x94, /* 34 */ - (char)0x95, /* 35 */ - (char)0x96, /* 36 */ - (char)0x04, /* 37 */ - (char)0x98, /* 38 */ - (char)0x99, /* 39 */ - (char)0x9A, /* 3A */ - (char)0x9B, /* 3B */ - (char)0x14, /* 3C */ - (char)0x15, /* 3D */ - (char)0x9E, /* 3E */ - (char)0x1A, /* 3F */ - (char)0x20, /* 40 */ - (char)0xA0, /* 41 */ - (char)0xE2, /* 42 */ - (char)0xE4, /* 43 */ - (char)0xE0, /* 44 */ - (char)0xE1, /* 45 */ - (char)0xE3, /* 46 */ - (char)0xE5, /* 47 */ - (char)0xE7, /* 48 */ - (char)0xF1, /* 49 */ - (char)0xA2, /* 4A */ - (char)0x2E, /* 4B */ - (char)0x3C, /* 4C */ - (char)0x28, /* 4D */ - (char)0x2B, /* 4E */ - (char)0x7C, /* 4F */ - (char)0x26, /* 50 */ - (char)0xE9, /* 51 */ - (char)0xEA, /* 52 */ - (char)0xEB, /* 53 */ - (char)0xE8, /* 54 */ - (char)0xED, /* 55 */ - (char)0xEE, /* 56 */ - (char)0xEF, /* 57 */ - (char)0xEC, /* 58 */ - (char)0xDF, /* 59 */ - (char)0x21, /* 5A */ - (char)0x24, /* 5B */ - (char)0x2A, /* 5C */ - (char)0x29, /* 5D */ - (char)0x3B, /* 5E */ - (char)0x5E, /* 5F */ - (char)0x2D, /* 60 */ - (char)0x2F, /* 61 */ - (char)0xC2, /* 62 */ - (char)0xC4, /* 63 */ - (char)0xC0, /* 64 */ - (char)0xC1, /* 65 */ - (char)0xC3, /* 66 */ - (char)0xC5, /* 67 */ - (char)0xC7, /* 68 */ - (char)0xD1, /* 69 */ - (char)0xA6, /* 6A */ - (char)0x2C, /* 6B */ - (char)0x25, /* 6C */ - (char)0x5F, /* 6D */ - (char)0x3E, /* 6E */ - (char)0x3F, /* 6F */ - (char)0xF8, /* 70 */ - (char)0xC9, /* 71 */ - (char)0xCA, /* 72 */ - (char)0xCB, /* 73 */ - (char)0xC8, /* 74 */ - (char)0xCD, /* 75 */ - (char)0xCE, /* 76 */ - (char)0xCF, /* 77 */ - (char)0xCC, /* 78 */ - (char)0x60, /* 79 */ - (char)0x3A, /* 7A */ - (char)0x23, /* 7B */ - (char)0x40, /* 7C */ - (char)0x27, /* 7D */ - (char)0x3D, /* 7E */ - (char)0x22, /* 7F */ - (char)0xD8, /* 80 */ - (char)0x61, /* 81 */ - (char)0x62, /* 82 */ - (char)0x63, /* 83 */ - (char)0x64, /* 84 */ - (char)0x65, /* 85 */ - (char)0x66, /* 86 */ - (char)0x67, /* 87 */ - (char)0x68, /* 88 */ - (char)0x69, /* 89 */ - (char)0xAB, /* 8A */ - (char)0xBB, /* 8B */ - (char)0xF0, /* 8C */ - (char)0xFD, /* 8D */ - (char)0xFE, /* 8E */ - (char)0xB1, /* 8F */ - (char)0xB0, /* 90 */ - (char)0x6A, /* 91 */ - (char)0x6B, /* 92 */ - (char)0x6C, /* 93 */ - (char)0x6D, /* 94 */ - (char)0x6E, /* 95 */ - (char)0x6F, /* 96 */ - (char)0x70, /* 97 */ - (char)0x71, /* 98 */ - (char)0x72, /* 99 */ - (char)0xAA, /* 9A */ - (char)0xBA, /* 9B */ - (char)0xE6, /* 9C */ - (char)0xB8, /* 9D */ - (char)0xC6, /* 9E */ - (char)0xA4, /* 9F */ - (char)0xB5, /* A0 */ - (char)0x7E, /* A1 */ - (char)0x73, /* A2 */ - (char)0x74, /* A3 */ - (char)0x75, /* A4 */ - (char)0x76, /* A5 */ - (char)0x77, /* A6 */ - (char)0x78, /* A7 */ - (char)0x79, /* A8 */ - (char)0x7A, /* A9 */ - (char)0xA1, /* AA */ - (char)0xBF, /* AB */ - (char)0xD0, /* AC */ - (char)0x5B, /* AD */ - (char)0xDE, /* AE */ - (char)0xAE, /* AF */ - (char)0xAC, /* B0 */ - (char)0xA3, /* B1 */ - (char)0xA5, /* B2 */ - (char)0xB7, /* B3 */ - (char)0xA9, /* B4 */ - (char)0xA7, /* B5 */ - (char)0xB6, /* B6 */ - (char)0xBC, /* B7 */ - (char)0xBD, /* B8 */ - (char)0xBE, /* B9 */ - (char)0xDD, /* BA */ - (char)0xA8, /* BB */ - (char)0xAF, /* BC */ - (char)0x5D, /* BD */ - (char)0xB4, /* BE */ - (char)0xD7, /* BF */ - (char)0x7B, /* C0 */ - (char)0x41, /* C1 */ - (char)0x42, /* C2 */ - (char)0x43, /* C3 */ - (char)0x44, /* C4 */ - (char)0x45, /* C5 */ - (char)0x46, /* C6 */ - (char)0x47, /* C7 */ - (char)0x48, /* C8 */ - (char)0x49, /* C9 */ - (char)0xAD, /* CA */ - (char)0xF4, /* CB */ - (char)0xF6, /* CC */ - (char)0xF2, /* CD */ - (char)0xF3, /* CE */ - (char)0xF5, /* CF */ - (char)0x7D, /* D0 */ - (char)0x4A, /* D1 */ - (char)0x4B, /* D2 */ - (char)0x4C, /* D3 */ - (char)0x4D, /* D4 */ - (char)0x4E, /* D5 */ - (char)0x4F, /* D6 */ - (char)0x50, /* D7 */ - (char)0x51, /* D8 */ - (char)0x52, /* D9 */ - (char)0xB9, /* DA */ - (char)0xFB, /* DB */ - (char)0xFC, /* DC */ - (char)0xF9, /* DD */ - (char)0xFA, /* DE */ - (char)0xFF, /* DF */ - (char)0x5C, /* E0 */ - (char)0xF7, /* E1 */ - (char)0x53, /* E2 */ - (char)0x54, /* E3 */ - (char)0x55, /* E4 */ - (char)0x56, /* E5 */ - (char)0x57, /* E6 */ - (char)0x58, /* E7 */ - (char)0x59, /* E8 */ - (char)0x5A, /* E9 */ - (char)0xB2, /* EA */ - (char)0xD4, /* EB */ - (char)0xD6, /* EC */ - (char)0xD2, /* ED */ - (char)0xD3, /* EE */ - (char)0xD5, /* EF */ - (char)0x30, /* F0 */ - (char)0x31, /* F1 */ - (char)0x32, /* F2 */ - (char)0x33, /* F3 */ - (char)0x34, /* F4 */ - (char)0x35, /* F5 */ - (char)0x36, /* F6 */ - (char)0x37, /* F7 */ - (char)0x38, /* F8 */ - (char)0x39, /* F9 */ - (char)0xB3, /* FA */ - (char)0xDB, /* FB */ - (char)0xDC, /* FC */ - (char)0xD9, /* FD */ - (char)0xDA, /* FE */ - (char)0x9F, /* FF */ +static const char cp1047_8859_1[256] = { + static_cast<char>(0x00), /* 00 */ + static_cast<char>(0x01), /* 01 */ + static_cast<char>(0x02), /* 02 */ + static_cast<char>(0x03), /* 03 */ + static_cast<char>(0x9C), /* 04 */ + static_cast<char>(0x09), /* 05 */ + static_cast<char>(0x86), /* 06 */ + static_cast<char>(0x7F), /* 07 */ + static_cast<char>(0x97), /* 08 */ + static_cast<char>(0x8D), /* 09 */ + static_cast<char>(0x8E), /* 0A */ + static_cast<char>(0x0B), /* 0B */ + static_cast<char>(0x0C), /* 0C */ + static_cast<char>(0x0D), /* 0D */ + static_cast<char>(0x0E), /* 0E */ + static_cast<char>(0x0F), /* 0F */ + static_cast<char>(0x10), /* 10 */ + static_cast<char>(0x11), /* 11 */ + static_cast<char>(0x12), /* 12 */ + static_cast<char>(0x13), /* 13 */ + static_cast<char>(0x9D), /* 14 */ + static_cast<char>(0x85), /* 15 */ + static_cast<char>(0x08), /* 16 */ + static_cast<char>(0x87), /* 17 */ + static_cast<char>(0x18), /* 18 */ + static_cast<char>(0x19), /* 19 */ + static_cast<char>(0x92), /* 1A */ + static_cast<char>(0x8F), /* 1B */ + static_cast<char>(0x1C), /* 1C */ + static_cast<char>(0x1D), /* 1D */ + static_cast<char>(0x1E), /* 1E */ + static_cast<char>(0x1F), /* 1F */ + static_cast<char>(0x80), /* 20 */ + static_cast<char>(0x81), /* 21 */ + static_cast<char>(0x82), /* 22 */ + static_cast<char>(0x83), /* 23 */ + static_cast<char>(0x84), /* 24 */ + static_cast<char>(0x0A), /* 25 */ + static_cast<char>(0x17), /* 26 */ + static_cast<char>(0x1B), /* 27 */ + static_cast<char>(0x88), /* 28 */ + static_cast<char>(0x89), /* 29 */ + static_cast<char>(0x8A), /* 2A */ + static_cast<char>(0x8B), /* 2B */ + static_cast<char>(0x8C), /* 2C */ + static_cast<char>(0x05), /* 2D */ + static_cast<char>(0x06), /* 2E */ + static_cast<char>(0x07), /* 2F */ + static_cast<char>(0x90), /* 30 */ + static_cast<char>(0x91), /* 31 */ + static_cast<char>(0x16), /* 32 */ + static_cast<char>(0x93), /* 33 */ + static_cast<char>(0x94), /* 34 */ + static_cast<char>(0x95), /* 35 */ + static_cast<char>(0x96), /* 36 */ + static_cast<char>(0x04), /* 37 */ + static_cast<char>(0x98), /* 38 */ + static_cast<char>(0x99), /* 39 */ + static_cast<char>(0x9A), /* 3A */ + static_cast<char>(0x9B), /* 3B */ + static_cast<char>(0x14), /* 3C */ + static_cast<char>(0x15), /* 3D */ + static_cast<char>(0x9E), /* 3E */ + static_cast<char>(0x1A), /* 3F */ + static_cast<char>(0x20), /* 40 */ + static_cast<char>(0xA0), /* 41 */ + static_cast<char>(0xE2), /* 42 */ + static_cast<char>(0xE4), /* 43 */ + static_cast<char>(0xE0), /* 44 */ + static_cast<char>(0xE1), /* 45 */ + static_cast<char>(0xE3), /* 46 */ + static_cast<char>(0xE5), /* 47 */ + static_cast<char>(0xE7), /* 48 */ + static_cast<char>(0xF1), /* 49 */ + static_cast<char>(0xA2), /* 4A */ + static_cast<char>(0x2E), /* 4B */ + static_cast<char>(0x3C), /* 4C */ + static_cast<char>(0x28), /* 4D */ + static_cast<char>(0x2B), /* 4E */ + static_cast<char>(0x7C), /* 4F */ + static_cast<char>(0x26), /* 50 */ + static_cast<char>(0xE9), /* 51 */ + static_cast<char>(0xEA), /* 52 */ + static_cast<char>(0xEB), /* 53 */ + static_cast<char>(0xE8), /* 54 */ + static_cast<char>(0xED), /* 55 */ + static_cast<char>(0xEE), /* 56 */ + static_cast<char>(0xEF), /* 57 */ + static_cast<char>(0xEC), /* 58 */ + static_cast<char>(0xDF), /* 59 */ + static_cast<char>(0x21), /* 5A */ + static_cast<char>(0x24), /* 5B */ + static_cast<char>(0x2A), /* 5C */ + static_cast<char>(0x29), /* 5D */ + static_cast<char>(0x3B), /* 5E */ + static_cast<char>(0x5E), /* 5F */ + static_cast<char>(0x2D), /* 60 */ + static_cast<char>(0x2F), /* 61 */ + static_cast<char>(0xC2), /* 62 */ + static_cast<char>(0xC4), /* 63 */ + static_cast<char>(0xC0), /* 64 */ + static_cast<char>(0xC1), /* 65 */ + static_cast<char>(0xC3), /* 66 */ + static_cast<char>(0xC5), /* 67 */ + static_cast<char>(0xC7), /* 68 */ + static_cast<char>(0xD1), /* 69 */ + static_cast<char>(0xA6), /* 6A */ + static_cast<char>(0x2C), /* 6B */ + static_cast<char>(0x25), /* 6C */ + static_cast<char>(0x5F), /* 6D */ + static_cast<char>(0x3E), /* 6E */ + static_cast<char>(0x3F), /* 6F */ + static_cast<char>(0xF8), /* 70 */ + static_cast<char>(0xC9), /* 71 */ + static_cast<char>(0xCA), /* 72 */ + static_cast<char>(0xCB), /* 73 */ + static_cast<char>(0xC8), /* 74 */ + static_cast<char>(0xCD), /* 75 */ + static_cast<char>(0xCE), /* 76 */ + static_cast<char>(0xCF), /* 77 */ + static_cast<char>(0xCC), /* 78 */ + static_cast<char>(0x60), /* 79 */ + static_cast<char>(0x3A), /* 7A */ + static_cast<char>(0x23), /* 7B */ + static_cast<char>(0x40), /* 7C */ + static_cast<char>(0x27), /* 7D */ + static_cast<char>(0x3D), /* 7E */ + static_cast<char>(0x22), /* 7F */ + static_cast<char>(0xD8), /* 80 */ + static_cast<char>(0x61), /* 81 */ + static_cast<char>(0x62), /* 82 */ + static_cast<char>(0x63), /* 83 */ + static_cast<char>(0x64), /* 84 */ + static_cast<char>(0x65), /* 85 */ + static_cast<char>(0x66), /* 86 */ + static_cast<char>(0x67), /* 87 */ + static_cast<char>(0x68), /* 88 */ + static_cast<char>(0x69), /* 89 */ + static_cast<char>(0xAB), /* 8A */ + static_cast<char>(0xBB), /* 8B */ + static_cast<char>(0xF0), /* 8C */ + static_cast<char>(0xFD), /* 8D */ + static_cast<char>(0xFE), /* 8E */ + static_cast<char>(0xB1), /* 8F */ + static_cast<char>(0xB0), /* 90 */ + static_cast<char>(0x6A), /* 91 */ + static_cast<char>(0x6B), /* 92 */ + static_cast<char>(0x6C), /* 93 */ + static_cast<char>(0x6D), /* 94 */ + static_cast<char>(0x6E), /* 95 */ + static_cast<char>(0x6F), /* 96 */ + static_cast<char>(0x70), /* 97 */ + static_cast<char>(0x71), /* 98 */ + static_cast<char>(0x72), /* 99 */ + static_cast<char>(0xAA), /* 9A */ + static_cast<char>(0xBA), /* 9B */ + static_cast<char>(0xE6), /* 9C */ + static_cast<char>(0xB8), /* 9D */ + static_cast<char>(0xC6), /* 9E */ + static_cast<char>(0xA4), /* 9F */ + static_cast<char>(0xB5), /* A0 */ + static_cast<char>(0x7E), /* A1 */ + static_cast<char>(0x73), /* A2 */ + static_cast<char>(0x74), /* A3 */ + static_cast<char>(0x75), /* A4 */ + static_cast<char>(0x76), /* A5 */ + static_cast<char>(0x77), /* A6 */ + static_cast<char>(0x78), /* A7 */ + static_cast<char>(0x79), /* A8 */ + static_cast<char>(0x7A), /* A9 */ + static_cast<char>(0xA1), /* AA */ + static_cast<char>(0xBF), /* AB */ + static_cast<char>(0xD0), /* AC */ + static_cast<char>(0x5B), /* AD */ + static_cast<char>(0xDE), /* AE */ + static_cast<char>(0xAE), /* AF */ + static_cast<char>(0xAC), /* B0 */ + static_cast<char>(0xA3), /* B1 */ + static_cast<char>(0xA5), /* B2 */ + static_cast<char>(0xB7), /* B3 */ + static_cast<char>(0xA9), /* B4 */ + static_cast<char>(0xA7), /* B5 */ + static_cast<char>(0xB6), /* B6 */ + static_cast<char>(0xBC), /* B7 */ + static_cast<char>(0xBD), /* B8 */ + static_cast<char>(0xBE), /* B9 */ + static_cast<char>(0xDD), /* BA */ + static_cast<char>(0xA8), /* BB */ + static_cast<char>(0xAF), /* BC */ + static_cast<char>(0x5D), /* BD */ + static_cast<char>(0xB4), /* BE */ + static_cast<char>(0xD7), /* BF */ + static_cast<char>(0x7B), /* C0 */ + static_cast<char>(0x41), /* C1 */ + static_cast<char>(0x42), /* C2 */ + static_cast<char>(0x43), /* C3 */ + static_cast<char>(0x44), /* C4 */ + static_cast<char>(0x45), /* C5 */ + static_cast<char>(0x46), /* C6 */ + static_cast<char>(0x47), /* C7 */ + static_cast<char>(0x48), /* C8 */ + static_cast<char>(0x49), /* C9 */ + static_cast<char>(0xAD), /* CA */ + static_cast<char>(0xF4), /* CB */ + static_cast<char>(0xF6), /* CC */ + static_cast<char>(0xF2), /* CD */ + static_cast<char>(0xF3), /* CE */ + static_cast<char>(0xF5), /* CF */ + static_cast<char>(0x7D), /* D0 */ + static_cast<char>(0x4A), /* D1 */ + static_cast<char>(0x4B), /* D2 */ + static_cast<char>(0x4C), /* D3 */ + static_cast<char>(0x4D), /* D4 */ + static_cast<char>(0x4E), /* D5 */ + static_cast<char>(0x4F), /* D6 */ + static_cast<char>(0x50), /* D7 */ + static_cast<char>(0x51), /* D8 */ + static_cast<char>(0x52), /* D9 */ + static_cast<char>(0xB9), /* DA */ + static_cast<char>(0xFB), /* DB */ + static_cast<char>(0xFC), /* DC */ + static_cast<char>(0xF9), /* DD */ + static_cast<char>(0xFA), /* DE */ + static_cast<char>(0xFF), /* DF */ + static_cast<char>(0x5C), /* E0 */ + static_cast<char>(0xF7), /* E1 */ + static_cast<char>(0x53), /* E2 */ + static_cast<char>(0x54), /* E3 */ + static_cast<char>(0x55), /* E4 */ + static_cast<char>(0x56), /* E5 */ + static_cast<char>(0x57), /* E6 */ + static_cast<char>(0x58), /* E7 */ + static_cast<char>(0x59), /* E8 */ + static_cast<char>(0x5A), /* E9 */ + static_cast<char>(0xB2), /* EA */ + static_cast<char>(0xD4), /* EB */ + static_cast<char>(0xD6), /* EC */ + static_cast<char>(0xD2), /* ED */ + static_cast<char>(0xD3), /* EE */ + static_cast<char>(0xD5), /* EF */ + static_cast<char>(0x30), /* F0 */ + static_cast<char>(0x31), /* F1 */ + static_cast<char>(0x32), /* F2 */ + static_cast<char>(0x33), /* F3 */ + static_cast<char>(0x34), /* F4 */ + static_cast<char>(0x35), /* F5 */ + static_cast<char>(0x36), /* F6 */ + static_cast<char>(0x37), /* F7 */ + static_cast<char>(0x38), /* F8 */ + static_cast<char>(0x39), /* F9 */ + static_cast<char>(0xB3), /* FA */ + static_cast<char>(0xDB), /* FB */ + static_cast<char>(0xDC), /* FC */ + static_cast<char>(0xD9), /* FD */ + static_cast<char>(0xDA), /* FE */ + static_cast<char>(0x9F), /* FF */ }; static const bool oldIllegal[256] = { diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index 10ac3d1aef04d6..215be86e1241bd 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -113,7 +113,7 @@ inline const char *skipws(const char *p, const char *e) { void appendByte(std::string &outstr, uint8_t byte) { char tmp2[5]; - snprintf(tmp2, sizeof(tmp2), "\\x%02X", 0xFF & (int)(byte)); + snprintf(tmp2, sizeof(tmp2), "\\x%02X", 0xFF & static_cast<int>(byte)); outstr += tmp2; } @@ -270,7 +270,7 @@ bool fixAt(std::string &linestr, size_t pos) { #endif // Proceed to decode utf-8 - const uint8_t *s = (const uint8_t*) (linestr.c_str()); + const uint8_t* s = reinterpret_cast<const uint8_t*>(linestr.c_str()); int32_t length = linestr.size(); UChar32 c; if(U8_IS_SINGLE((uint8_t)s[i]) && oldIllegal[s[i]]) { @@ -285,7 +285,7 @@ bool fixAt(std::string &linestr, size_t pos) { U8_NEXT(s, i, length, c); } if(c<0) { - fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", (int)old_pos); + fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", static_cast<int>(old_pos)); fprintf(stderr, "Line: >>%s<<\n", linestr.c_str()); return true; } diff --git a/deps/icu-small/source/tools/escapesrc/tblgen.cpp b/deps/icu-small/source/tools/escapesrc/tblgen.cpp index dce4af6867d698..cc43c083ebf3f0 100644 --- a/deps/icu-small/source/tools/escapesrc/tblgen.cpp +++ b/deps/icu-small/source/tools/escapesrc/tblgen.cpp @@ -6,6 +6,9 @@ #include "unicode/uniset.h" #include <stdio.h> +using icu::LocalUConverterPointer; +using icu::UnicodeSet; + static const char *kConverter = "ibm-1047"; int main(int argc, const char *argv[]) { diff --git a/deps/icu-small/source/tools/genccode/genccode.c b/deps/icu-small/source/tools/genccode/genccode.c index 9fb7dbcdf2eb95..0f243952a7d452 100644 --- a/deps/icu-small/source/tools/genccode/genccode.c +++ b/deps/icu-small/source/tools/genccode/genccode.c @@ -70,6 +70,7 @@ enum { #ifdef CAN_GENERATE_OBJECTS kOptObject, kOptMatchArch, + kOptCpuArch, kOptSkipDllExport, #endif kOptFilename, @@ -86,6 +87,7 @@ static UOption options[]={ #ifdef CAN_GENERATE_OBJECTS /*6*/UOPTION_DEF("object", 'o', UOPT_NO_ARG), UOPTION_DEF("match-arch", 'm', UOPT_REQUIRES_ARG), + UOPTION_DEF("cpu-arch", 'c', UOPT_REQUIRES_ARG), UOPTION_DEF("skip-dll-export", '\0', UOPT_NO_ARG), #endif UOPTION_DEF("filename", 'f', UOPT_REQUIRES_ARG), @@ -131,6 +133,8 @@ main(int argc, char* argv[]) { "\t-o or --object write a .obj file instead of .c\n" "\t-m or --match-arch file.o match the architecture (CPU, 32/64 bits) of the specified .o\n" "\t ELF format defaults to i386. Windows defaults to the native platform.\n" + "\t-c or --cpu-arch Specify a CPU architecture for which to write a .obj file for ClangCL on Windows\n" + "\t Valid values for this opton are x64, x86 and arm64.\n" "\t--skip-dll-export Don't export the ICU data entry point symbol (for use when statically linking)\n"); #endif fprintf(stderr, @@ -193,9 +197,17 @@ main(int argc, char* argv[]) { break; #ifdef CAN_GENERATE_OBJECTS case CALL_WRITEOBJECT: + if(options[kOptCpuArch].doesOccur) { + if (!checkCpuArchitecture(options[kOptCpuArch].value)) { + fprintf(stderr, + "CPU architecture \"%s\" is unknown.\n", options[kOptCpuArch].value); + return -1; + } + } writeObjectCode(filename, options[kOptDestDir].value, options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, options[kOptMatchArch].doesOccur ? options[kOptMatchArch].value : NULL, + options[kOptCpuArch].doesOccur ? options[kOptCpuArch].value : NULL, options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, NULL, 0, diff --git a/deps/icu-small/source/tools/genrb/derb.cpp b/deps/icu-small/source/tools/genrb/derb.cpp index 3b28289569268a..a53d1931903ac2 100644 --- a/deps/icu-small/source/tools/genrb/derb.cpp +++ b/deps/icu-small/source/tools/genrb/derb.cpp @@ -194,7 +194,7 @@ main(int argc, char* argv[]) { if (q == nullptr) { locale.append(p, status); } else { - locale.append(p, (int32_t)(q - p), status); + locale.append(p, static_cast<int32_t>(q - p), status); } } if (U_FAILURE(status)) { @@ -223,7 +223,7 @@ main(int argc, char* argv[]) { #endif infile.append(inputDir, status); if(q != nullptr) { - infile.appendPathPart(icu::StringPiece(arg, (int32_t)(q - arg)), status); + infile.appendPathPart(icu::StringPiece(arg, static_cast<int32_t>(q - arg)), status); } if (U_FAILURE(status)) { return status; @@ -234,13 +234,13 @@ main(int argc, char* argv[]) { if (thename) { bundle = ures_openDirect(thename, locale.data(), &status); } else { - bundle = ures_open(fromICUData ? 0 : inputDir, locale.data(), &status); + bundle = ures_open(fromICUData ? nullptr : inputDir, locale.data(), &status); } if (U_SUCCESS(status)) { UFILE *out = nullptr; - const char *filename = 0; - const char *ext = 0; + const char* filename = nullptr; + const char* ext = nullptr; if (locale.isEmpty() || !tostdout) { filename = findBasename(arg); @@ -259,7 +259,7 @@ main(int argc, char* argv[]) { } thefile.appendPathPart(filename, status); if (*ext) { - thefile.truncate(thefile.length() - (int32_t)uprv_strlen(ext)); + thefile.truncate(thefile.length() - static_cast<int32_t>(uprv_strlen(ext))); } thefile.append(".txt", status); if (U_FAILURE(status)) { @@ -275,7 +275,7 @@ main(int argc, char* argv[]) { } // now, set the callback. - ucnv_setFromUCallBack(u_fgetConverter(out), UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_C, 0, 0, &status); + ucnv_setFromUCallBack(u_fgetConverter(out), UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_C, nullptr, nullptr, &status); if (U_FAILURE(status)) { u_fprintf(ustderr, "%s: couldn't configure converter for encoding\n", pname); u_fclose(ustderr); @@ -301,7 +301,7 @@ main(int argc, char* argv[]) { if (!locale.isEmpty()) { u_fprintf(out, "%s", locale.data()); } else { - u_fprintf(out, "%.*s%.*S", (int32_t)(ext - filename), filename, UPRV_LENGTHOF(sp), sp); + u_fprintf(out, "%.*s%.*S", static_cast<int32_t>(ext - filename), filename, UPRV_LENGTHOF(sp), sp); } printOutBundle(out, bundle, 0, pname, &status); @@ -334,7 +334,7 @@ static char16_t *quotedString(const char16_t *string) { } } - newstr = (char16_t *) uprv_malloc((1 + alen) * U_SIZEOF_UCHAR); + newstr = static_cast<char16_t*>(uprv_malloc((1 + alen) * U_SIZEOF_UCHAR)); for (sp = string, np = newstr; *sp; ++sp) { switch (*sp) { case '\n': @@ -392,7 +392,7 @@ static void printOutAlias(UFILE *out, UResourceBundle *parent, Resource r, cons char msg[128]; printIndent(out, indent); snprintf(msg, sizeof(msg), "// WARNING: this resource, size %li is truncated to %li\n", - (long)len, (long)truncsize/2); + static_cast<long>(len), static_cast<long>(truncsize) / 2); printCString(out, msg, -1); len = truncsize; } @@ -436,7 +436,7 @@ static void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent char msg[128]; printIndent(out, indent); snprintf(msg, sizeof(msg), "// WARNING: this resource, size %li is truncated to %li\n", - (long)len, (long)(truncsize/2)); + static_cast<long>(len), static_cast<long>(truncsize / 2)); printCString(out, msg, -1); len = truncsize/2; } @@ -444,7 +444,7 @@ static void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent if(key != nullptr) { static const char16_t openStr[] = { 0x0020, 0x007B, 0x0020, 0x0022 }; /* " { \"" */ static const char16_t closeStr[] = { 0x0022, 0x0020, 0x007D }; /* "\" }" */ - printCString(out, key, (int32_t)uprv_strlen(key)); + printCString(out, key, static_cast<int32_t>(uprv_strlen(key))); printString(out, openStr, UPRV_LENGTHOF(openStr)); printString(out, string, len); printString(out, closeStr, UPRV_LENGTHOF(closeStr)); @@ -453,7 +453,7 @@ static void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent static const char16_t closeStr[] = { 0x0022, 0x002C }; /* "\"," */ printString(out, openStr, UPRV_LENGTHOF(openStr)); - printString(out, string, (int32_t)(u_strlen(string))); + printString(out, string, u_strlen(string)); printString(out, closeStr, UPRV_LENGTHOF(closeStr)); } @@ -490,12 +490,12 @@ static void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent case URES_BINARY : { int32_t len = 0; - const int8_t *data = (const int8_t *)ures_getBinary(resource, &len, status); + const int8_t* data = reinterpret_cast<const int8_t*>(ures_getBinary(resource, &len, status)); if(opt_truncate && len > truncsize) { char msg[128]; printIndent(out, indent); snprintf(msg, sizeof(msg), "// WARNING: this resource, size %li is truncated to %li\n", - (long)len, (long)(truncsize/2)); + static_cast<long>(len), static_cast<long>(truncsize / 2)); printCString(out, msg, -1); len = truncsize; } @@ -590,7 +590,7 @@ static void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent } else { /* we have to use low level access to do this */ Resource r; int32_t resSize = ures_getSize(resource); - UBool isTable = (UBool)(ures_getType(resource) == URES_TABLE); + UBool isTable = static_cast<UBool>(ures_getType(resource) == URES_TABLE); for(i = 0; i < resSize; i++) { /* need to know if it's an alias */ if(isTable) { diff --git a/deps/icu-small/source/tools/genrb/errmsg.c b/deps/icu-small/source/tools/genrb/errmsg.c index a99d797ec5ce80..d0d9af357034cd 100644 --- a/deps/icu-small/source/tools/genrb/errmsg.c +++ b/deps/icu-small/source/tools/genrb/errmsg.c @@ -42,19 +42,19 @@ U_CFUNC void setShowWarning(UBool val) gShowWarning = val; } -U_CFUNC UBool getShowWarning(){ +U_CFUNC UBool getShowWarning(void){ return gShowWarning; } static UBool gStrict =false; -U_CFUNC UBool isStrict(){ +U_CFUNC UBool isStrict(void){ return gStrict; } U_CFUNC void setStrict(UBool val){ gStrict = val; } static UBool gVerbose =false; -U_CFUNC UBool isVerbose(){ +U_CFUNC UBool isVerbose(void){ return gVerbose; } U_CFUNC void setVerbose(UBool val){ diff --git a/deps/icu-small/source/tools/genrb/filterrb.cpp b/deps/icu-small/source/tools/genrb/filterrb.cpp index dcc02fc6210903..494aedce778780 100644 --- a/deps/icu-small/source/tools/genrb/filterrb.cpp +++ b/deps/icu-small/source/tools/genrb/filterrb.cpp @@ -2,6 +2,7 @@ // License & terms of use: http://www.unicode.org/copyright.html #include <iostream> +#include <memory> #include <stack> #include "filterrb.h" @@ -59,7 +60,7 @@ const std::list<std::string>& ResKeyPath::pieces() const { std::ostream& operator<<(std::ostream& out, const ResKeyPath& value) { if (value.pieces().empty()) { out << "/"; - } else for (auto& key : value.pieces()) { + } else for (const auto& key : value.pieces()) { out << "/" << key; } return out; @@ -108,7 +109,7 @@ PathFilter::EInclusion SimpleRuleBasedPathFilter::match(const ResKeyPath& path) // even if additional subpaths are added to the given key bool isLeaf = false; - for (auto& key : path.pieces()) { + for (const auto& key : path.pieces()) { auto child = node->fChildren.find(key); // Leaf case 1: input path descends outside the filter tree if (child == node->fChildren.end()) { @@ -150,7 +151,7 @@ SimpleRuleBasedPathFilter::Tree::Tree(const Tree& other) : fIncluded(other.fIncluded), fChildren(other.fChildren) { // Note: can't use the default copy assignment because of the std::unique_ptr if (other.fWildcard) { - fWildcard.reset(new Tree(*other.fWildcard)); + fWildcard = std::make_unique<Tree>(*other.fWildcard); } } @@ -177,11 +178,11 @@ void SimpleRuleBasedPathFilter::Tree::applyRule( } // Recursive Step - auto& key = *it; + const auto& key = *it; if (key == "*") { // Case 1: Wildcard if (!fWildcard) { - fWildcard.reset(new Tree()); + fWildcard = std::make_unique<Tree>(); } // Apply the rule to fWildcard and also to all existing children. it++; @@ -211,7 +212,7 @@ void SimpleRuleBasedPathFilter::Tree::applyRule( void SimpleRuleBasedPathFilter::Tree::print(std::ostream& out, int32_t indent) const { for (int32_t i=0; i<indent; i++) out << "\t"; out << "included: " << kEInclusionNames[fIncluded] << std::endl; - for (auto& child : fChildren) { + for (const auto& child : fChildren) { for (int32_t i=0; i<indent; i++) out << "\t"; out << child.first << ": {" << std::endl; child.second.print(out, indent + 1); diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index fbf396d468a833..f386a67e022034 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -163,7 +163,7 @@ main(int argc, } if(options[FORMAT_VERSION].doesOccur) { const char *s = options[FORMAT_VERSION].value; - if(uprv_strlen(s) != 1 || (s[0] < '1' && '3' < s[0])) { + if(uprv_strlen(s) != 1 || (s[0] < '1' || '3' < s[0])) { fprintf(stderr, "%s: unsupported --formatVersion %s\n", argv[0], s); illegalArg = true; } else if(s[0] == '1' && @@ -411,13 +411,13 @@ main(int argc, poolFileName.data(), u_errorName(status)); return status; } - header = (const DataHeader *)poolBundle.fBytes; + header = reinterpret_cast<const DataHeader*>(poolBundle.fBytes); if (header->info.formatVersion[0] < 2) { fprintf(stderr, "invalid format of pool bundle file %s\n", poolFileName.data()); return U_INVALID_FORMAT_ERROR; } - const int32_t *pRoot = (const int32_t *)( - (const char *)header + header->dataHeader.headerSize); + const int32_t* pRoot = reinterpret_cast<const int32_t*>( + reinterpret_cast<const char*>(header) + header->dataHeader.headerSize); poolBundle.fIndexes = pRoot + 1; indexLength = poolBundle.fIndexes[URES_INDEX_LENGTH] & 0xff; if (indexLength <= URES_INDEX_POOL_CHECKSUM) { @@ -426,7 +426,7 @@ main(int argc, } int32_t keysBottom = 1 + indexLength; int32_t keysTop = poolBundle.fIndexes[URES_INDEX_KEYS_TOP]; - poolBundle.fKeys = (const char *)(pRoot + keysBottom); + poolBundle.fKeys = reinterpret_cast<const char*>(pRoot + keysBottom); poolBundle.fKeysLength = (keysTop - keysBottom) * 4; poolBundle.fChecksum = poolBundle.fIndexes[URES_INDEX_POOL_CHECKSUM]; @@ -449,7 +449,7 @@ main(int argc, } // The PseudoListResource constructor call did not allocate further memory. assert(U_SUCCESS(status)); - const char16_t *p = (const char16_t *)(pRoot + keysTop); + const char16_t* p = reinterpret_cast<const char16_t*>(pRoot + keysTop); int32_t remaining = stringUnitsLength; do { int32_t first = *p; @@ -469,7 +469,7 @@ main(int argc, length = ((first - 0xdfef) << 16) | p[1]; } else if (first == 0xdfff && remaining >= 3) { numCharsForLength = 3; - length = ((int32_t)p[1] << 16) | p[2]; + length = (static_cast<int32_t>(p[1]) << 16) | p[2]; } else { break; // overrun } @@ -514,10 +514,10 @@ main(int argc, T_FileStream_close(poolFile); setUsePoolBundle(true); if (isVerbose() && poolBundle.fStrings != nullptr) { - printf("number of shared strings: %d\n", (int)poolBundle.fStrings->fCount); + printf("number of shared strings: %d\n", static_cast<int>(poolBundle.fStrings->fCount)); int32_t length = poolBundle.fStringIndexLimit + 1; // incl. last NUL printf("16-bit units for strings: %6d = %6d bytes\n", - (int)length, (int)length * 2); + static_cast<int>(length), static_cast<int>(length) * 2); } } @@ -622,14 +622,14 @@ processFile(const char *filename, const char *cp, * This is very important when the resource file includes * another file, like UCARules.txt or thaidict.brk. */ - int32_t filenameSize = (int32_t)(filenameBegin - filename + 1); + int32_t filenameSize = static_cast<int32_t>(filenameBegin - filename + 1); inputDirBuf.append(filename, filenameSize, status); inputDir = inputDirBuf.data(); dirlen = inputDirBuf.length(); } }else{ - dirlen = (int32_t)uprv_strlen(inputDir); + dirlen = static_cast<int32_t>(uprv_strlen(inputDir)); if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) { /* @@ -779,28 +779,28 @@ make_res_filename(const char *filename, if (U_FAILURE(status)) { - return 0; + return nullptr; } if(packageName != nullptr) { - pkgLen = (int32_t)(1 + uprv_strlen(packageName)); + pkgLen = static_cast<int32_t>(1 + uprv_strlen(packageName)); } /* setup */ - basename = dirname = resName = 0; + basename = dirname = resName = nullptr; /* determine basename, and compiled file names */ - basename = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1)); - if(basename == 0) { + basename = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1))); + if (basename == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto finish; } get_basename(basename, filename); - dirname = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1)); - if(dirname == 0) { + dirname = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1))); + if (dirname == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto finish; } @@ -809,11 +809,11 @@ make_res_filename(const char *filename, if (outputDir == nullptr) { /* output in same dir as .txt */ - resName = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(dirname) + resName = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(dirname) + pkgLen + uprv_strlen(basename) - + uprv_strlen(RES_SUFFIX) + 8)); - if(resName == 0) { + + uprv_strlen(RES_SUFFIX) + 8))); + if (resName == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; goto finish; } @@ -829,10 +829,10 @@ make_res_filename(const char *filename, uprv_strcat(resName, basename); } else { - int32_t dirlen = (int32_t)uprv_strlen(outputDir); - int32_t basenamelen = (int32_t)uprv_strlen(basename); + int32_t dirlen = static_cast<int32_t>(uprv_strlen(outputDir)); + int32_t basenamelen = static_cast<int32_t>(uprv_strlen(basename)); - resName = (char*) uprv_malloc(sizeof(char) * (dirlen + pkgLen + basenamelen + 8)); + resName = static_cast<char*>(uprv_malloc(sizeof(char) * (dirlen + pkgLen + basenamelen + 8))); if (resName == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 1e82bda6e5e051..4b71bcaaa918d0 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -297,7 +297,7 @@ static char *getInvariantString(ParseState* state, uint32_t *line, struct UStrin if(!uprv_isInvariantUString(tokenValue->fChars, tokenValue->fLength)) { *status = U_INVALID_FORMAT_ERROR; - error(*line, "invariant characters required for table keys, binary data, etc."); + error((line == nullptr) ? 0 : *line, "invariant characters required for table keys, binary data, etc."); return nullptr; } @@ -320,9 +320,8 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt struct SResource *result = nullptr; struct UString *tokenValue; FileStream *file = nullptr; - char filename[256] = { '\0' }; - char cs[128] = { '\0' }; - uint32_t line; + CharString filename; + uint32_t line; UBool quoted = false; UCHARBUF *ucbuf=nullptr; UChar32 c = 0; @@ -335,7 +334,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt expect(state, TOK_STRING, &tokenValue, nullptr, &line, status); if(isVerbose()){ - printf(" %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if (U_FAILURE(*status)) @@ -345,15 +344,15 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt /* make the filename including the directory */ if (state->inputdir != nullptr) { - uprv_strcat(filename, state->inputdir); + filename.append(state->inputdir, -1, *status); if (state->inputdir[state->inputdirLength - 1] != U_FILE_SEP_CHAR) { - uprv_strcat(filename, U_FILE_SEP_STRING); + filename.append(U_FILE_SEP_CHAR, *status); } } - u_UCharsToChars(tokenValue->fChars, cs, tokenValue->fLength); + filename.appendInvariantChars(tokenValue->fChars, tokenValue->fLength, *status); expect(state, TOK_CLOSE_BRACE, nullptr, nullptr, nullptr, status); @@ -361,16 +360,15 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt { return nullptr; } - uprv_strcat(filename, cs); if(state->omitCollationRules) { return res_none(); } - ucbuf = ucbuf_open(filename, &cp, getShowWarning(),false, status); + ucbuf = ucbuf_open(filename.data(), &cp, getShowWarning(),false, status); if (U_FAILURE(*status)) { - error(line, "An error occurred while opening the input file %s\n", filename); + error(line, "An error occurred while opening the input file %s\n", filename.data()); return nullptr; } @@ -379,7 +377,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt * is not known in UTF-8 byte stream */ size = ucbuf_size(ucbuf) + 1; - pTarget = (char16_t*) uprv_malloc(U_SIZEOF_UCHAR * size); + pTarget = static_cast<char16_t*>(uprv_malloc(U_SIZEOF_UCHAR * size)); uprv_memset(pTarget, 0, size*U_SIZEOF_UCHAR); target = pTarget; targetLimit = pTarget+size; @@ -389,7 +387,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt { c = ucbuf_getc(ucbuf, status); if(c == QUOTE) { - quoted = (UBool)!quoted; + quoted = static_cast<UBool>(!quoted); } /* weiv (06/26/2002): adding the following: * - preserving spaces in commands [...] @@ -417,7 +415,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt { c = unescape(ucbuf, status); - if (c == (UChar32)U_ERR) + if (c == static_cast<UChar32>(U_ERR)) { uprv_free(pTarget); T_FileStream_close(file); @@ -433,7 +431,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt } /* Append char16_t * after dissembling if c > 0xffff*/ - if (c != (UChar32)U_EOF) + if (c != static_cast<UChar32>(U_EOF)) { U_APPEND_CHAR32_ONLY(c, target); } @@ -448,7 +446,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt *target = 0x0000; } - result = string_open(state->bundle, tag, pTarget, (int32_t)(target - pTarget), nullptr, status); + result = string_open(state->bundle, tag, pTarget, static_cast<int32_t>(target - pTarget), nullptr, status); ucbuf_close(ucbuf); @@ -476,7 +474,7 @@ parseTransliterator(ParseState* state, char *tag, uint32_t startline, const stru expect(state, TOK_STRING, &tokenValue, nullptr, &line, status); if(isVerbose()){ - printf(" %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if (U_FAILURE(*status)) @@ -517,7 +515,7 @@ parseTransliterator(ParseState* state, char *tag, uint32_t startline, const stru * is not known in UTF-8 byte stream */ pSource = ucbuf_getBuffer(ucbuf, &size, status); - pTarget = (char16_t*) uprv_malloc(U_SIZEOF_UCHAR * (size + 1)); + pTarget = static_cast<char16_t*>(uprv_malloc(U_SIZEOF_UCHAR * (size + 1))); uprv_memset(pTarget, 0, size*U_SIZEOF_UCHAR); #if !UCONFIG_NO_TRANSLITERATION @@ -549,7 +547,7 @@ parseDependency(ParseState* state, char *tag, uint32_t startline, const struct U expect(state, TOK_STRING, &tokenValue, nullptr, &line, status); if(isVerbose()){ - printf(" %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if (U_FAILURE(*status)) @@ -609,7 +607,7 @@ parseString(ParseState* state, char *tag, uint32_t startline, const struct UStri return parseUCARules(tag, startline, status); }*/ if(isVerbose()){ - printf(" string %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" string %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } expect(state, TOK_STRING, &tokenValue, nullptr, nullptr, status); @@ -642,7 +640,7 @@ parseAlias(ParseState* state, char *tag, uint32_t startline, const struct UStrin expect(state, TOK_STRING, &tokenValue, nullptr, nullptr, status); if(isVerbose()){ - printf(" alias %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" alias %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if (U_SUCCESS(*status)) @@ -668,7 +666,7 @@ parseAlias(ParseState* state, char *tag, uint32_t startline, const struct UStrin namespace { -static struct SResource* resLookup(struct SResource* res, const char* key){ +struct SResource* resLookup(struct SResource* res, const char* key) { if (res == res_none() || !res->isTable()) { return nullptr; } @@ -728,12 +726,12 @@ GenrbImporter::getRules( */ StringPiece dir = filename.toStringPiece(); const char *filenameLimit = filename.data() + filename.length(); - dir.remove_suffix((int32_t)(filenameLimit - filenameBegin)); + dir.remove_suffix(static_cast<int32_t>(filenameLimit - filenameBegin)); inputDirBuf.append(dir, errorCode); inputDir = inputDirBuf.data(); } }else{ - int32_t dirlen = (int32_t)uprv_strlen(inputDir); + int32_t dirlen = static_cast<int32_t>(uprv_strlen(inputDir)); if((filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')) { /* @@ -794,7 +792,7 @@ GenrbImporter::getRules( // Quick-and-dirty escaping function. // Assumes that we are on an ASCII-based platform. -static void +void escape(const char16_t *s, char *buffer, size_t n) { int32_t length = u_strlen(s); int32_t i = 0; @@ -806,9 +804,9 @@ escape(const char16_t *s, char *buffer, size_t n) { return; } else if (0x20 <= c && c <= 0x7e) { // printable ASCII - *buffer++ = (char)c; // assumes ASCII-based platform + *buffer++ = static_cast<char>(c); // assumes ASCII-based platform } else { - buffer += snprintf(buffer, n, "\\u%04X", (int)c); + buffer += snprintf(buffer, n, "\\u%04X", static_cast<int>(c)); } } } @@ -882,14 +880,14 @@ writeCollationDiacriticsTOML(const char* outputdir, const char* name, const char limit = c; break; } else { - uint64_t ce = uint64_t(icu::Collation::ceFromCE32(ce32)); - if ((ce & 0xFFFFFFFF0000FFFF) != uint64_t(icu::Collation::COMMON_TERTIARY_CE)) { + uint64_t ce = static_cast<uint64_t>(icu::Collation::ceFromCE32(ce32)); + if ((ce & 0xFFFFFFFF0000FFFF) != static_cast<uint64_t>(icu::Collation::COMMON_TERTIARY_CE)) { // Not a CE where only the secondary weight differs from the expected // pattern. limit = c; break; } - secondary = uint16_t(ce >> 16); + secondary = static_cast<uint16_t>(ce >> 16); } secondaries[c - ICU4X_DIACRITIC_BASE] = secondary; @@ -1023,7 +1021,7 @@ writeCollationSpecialPrimariesTOML(const char* outputdir, const char* name, cons for (int32_t i = 0; i < 4; ++i) { // getLastPrimaryForGroup subtracts one from a 16-bit value, so we add one // back to get a value that fits in 16 bits. - lastPrimaries[i] = (uint16_t)((data->getLastPrimaryForGroup(UCOL_REORDER_CODE_FIRST + i) + 1) >> 16); + lastPrimaries[i] = static_cast<uint16_t>((data->getLastPrimaryForGroup(UCOL_REORDER_CODE_FIRST + i) + 1) >> 16); } uint32_t numericPrimary = data->numericPrimary; @@ -1034,6 +1032,7 @@ writeCollationSpecialPrimariesTOML(const char* outputdir, const char* name, cons } usrc_writeArray(f, "last_primaries = [\n ", lastPrimaries, 16, 4, " ", "\n]\n"); + usrc_writeArray(f, "compressible_bytes = [\n ", data->compressibleBytes, 1, 256, " ", "\n]\n"); fprintf(f, "numeric_primary = 0x%X\n", numericPrimary >> 24); fclose(f); } @@ -1098,7 +1097,7 @@ writeCollationTOML(const char* outputdir, const char* name, const char* collatio } } - uint32_t maxVariable = (uint32_t)settings->getMaxVariable(); + uint32_t maxVariable = static_cast<uint32_t>(settings->getMaxVariable()); if (maxVariable >= 4) { printf("Max variable out of range"); *status = U_INTERNAL_PROGRAM_ERROR; @@ -1153,7 +1152,7 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp struct UString *tokenValue; struct UString comment; enum ETokenType token; - char subtag[1024]; + CharString subtag; UnicodeString rules; UBool haveRules = false; UVersionInfo version; @@ -1189,15 +1188,15 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp return nullptr; } - u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); - + subtag.clear(); + subtag.appendInvariantChars(tokenValue->fChars, u_strlen(tokenValue->fChars), *status); if (U_FAILURE(*status)) { res_close(result); return nullptr; } - member = parseResource(state, subtag, nullptr, status); + member = parseResource(state, subtag.data(), nullptr, status); if (U_FAILURE(*status)) { @@ -1208,7 +1207,7 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp { // Ignore the parsed resources, continue parsing. } - else if (uprv_strcmp(subtag, "Version") == 0 && member->isString()) + else if (uprv_strcmp(subtag.data(), "Version") == 0 && member->isString()) { StringResource *sr = static_cast<StringResource *>(member); char ver[40]; @@ -1225,11 +1224,11 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp result->add(member, line, *status); member = nullptr; } - else if(uprv_strcmp(subtag, "%%CollationBin")==0) + else if(uprv_strcmp(subtag.data(), "%%CollationBin")==0) { /* discard duplicate %%CollationBin if any*/ } - else if (uprv_strcmp(subtag, "Sequence") == 0 && member->isString()) + else if (uprv_strcmp(subtag.data(), "Sequence") == 0 && member->isString()) { StringResource *sr = static_cast<StringResource *>(member); rules = sr->fString; @@ -1298,7 +1297,7 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp if(reason == nullptr) { reason = ""; } error(line, "CollationBuilder failed at %s~%s/Sequence rule offset %ld: %s %s", state->filename, collationType, - (long)parseError.offset, u_errorName(intStatus), reason); + static_cast<long>(parseError.offset), u_errorName(intStatus), reason); if(parseError.preContext[0] != 0 || parseError.postContext[0] != 0) { // Print pre- and post-context. char preBuffer[100], postBuffer[100]; @@ -1330,7 +1329,7 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp uint8_t *dest = buffer.allocateInsteadAndCopy(capacity); if(dest == nullptr) { fprintf(stderr, "memory allocation (%ld bytes) for file contents failed\n", - (long)capacity); + static_cast<long>(capacity)); *status = U_MEMORY_ALLOCATION_ERROR; res_close(result); return nullptr; @@ -1344,7 +1343,7 @@ addCollation(ParseState* state, TableResource *result, const char *collationTyp dest = buffer.allocateInsteadAndCopy(capacity); if(dest == nullptr) { fprintf(stderr, "memory allocation (%ld bytes) for file contents failed\n", - (long)capacity); + static_cast<long>(capacity)); *status = U_MEMORY_ALLOCATION_ERROR; res_close(result); return nullptr; @@ -1395,7 +1394,7 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n struct UString *tokenValue; struct UString comment; enum ETokenType token; - char subtag[1024], typeKeyword[1024]; + CharString subtag, typeKeyword; uint32_t line; result = table_open(state->bundle, tag, nullptr, status); @@ -1405,7 +1404,7 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n return nullptr; } if(isVerbose()){ - printf(" collation elements %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" collation elements %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if(!newCollation) { return addCollation(state, result, "(no type)", startline, status); @@ -1437,7 +1436,8 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n return nullptr; } - u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); + subtag.clear(); + subtag.appendInvariantChars(tokenValue->fChars, u_strlen(tokenValue->fChars), *status); if (U_FAILURE(*status)) { @@ -1445,9 +1445,9 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n return nullptr; } - if (uprv_strcmp(subtag, "default") == 0) + if (uprv_strcmp(subtag.data(), "default") == 0) { - member = parseResource(state, subtag, nullptr, status); + member = parseResource(state, subtag.data(), nullptr, status); if (U_FAILURE(*status)) { @@ -1466,22 +1466,29 @@ parseCollationElements(ParseState* state, char *tag, uint32_t startline, UBool n if(token == TOK_OPEN_BRACE) { token = getToken(state, &tokenValue, &comment, &line, status); TableResource *collationRes; - if (keepCollationType(subtag)) { - collationRes = table_open(state->bundle, subtag, nullptr, status); + if (keepCollationType(subtag.data())) { + collationRes = table_open(state->bundle, subtag.data(), nullptr, status); } else { collationRes = nullptr; } // need to parse the collation data regardless - collationRes = addCollation(state, collationRes, subtag, startline, status); + collationRes = addCollation(state, collationRes, subtag.data(), startline, status); if (collationRes != nullptr) { result->add(collationRes, startline, *status); } } else if(token == TOK_COLON) { /* right now, we'll just try to see if we have aliases */ /* we could have a table too */ token = peekToken(state, 1, &tokenValue, &line, &comment, status); - u_UCharsToChars(tokenValue->fChars, typeKeyword, u_strlen(tokenValue->fChars) + 1); - if(uprv_strcmp(typeKeyword, "alias") == 0) { - member = parseResource(state, subtag, nullptr, status); + typeKeyword.clear(); + typeKeyword.appendInvariantChars(tokenValue->fChars, u_strlen(tokenValue->fChars), *status); + if (U_FAILURE(*status)) + { + res_close(result); + return nullptr; + } + + if(uprv_strcmp(typeKeyword.data(), "alias") == 0) { + member = parseResource(state, subtag.data(), nullptr, status); if (U_FAILURE(*status)) { res_close(result); @@ -1523,14 +1530,14 @@ realParseTable(ParseState* state, TableResource *table, char *tag, uint32_t star struct UString *tokenValue=nullptr; struct UString comment; enum ETokenType token; - char subtag[1024]; + CharString subtag; uint32_t line; UBool readToken = false; /* '{' . (name resource)* '}' */ if(isVerbose()){ - printf(" parsing table %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" parsing table %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } for (;;) { @@ -1562,7 +1569,8 @@ realParseTable(ParseState* state, TableResource *table, char *tag, uint32_t star } if(uprv_isInvariantUString(tokenValue->fChars, -1)) { - u_UCharsToChars(tokenValue->fChars, subtag, u_strlen(tokenValue->fChars) + 1); + subtag.clear(); + subtag.appendInvariantChars(tokenValue->fChars, u_strlen(tokenValue->fChars), *status); } else { *status = U_INVALID_FORMAT_ERROR; error(line, "invariant characters required for table keys"); @@ -1575,7 +1583,7 @@ realParseTable(ParseState* state, TableResource *table, char *tag, uint32_t star return nullptr; } - member = parseResource(state, subtag, &comment, status); + member = parseResource(state, subtag.data(), &comment, status); if (member == nullptr || U_FAILURE(*status)) { @@ -1612,7 +1620,7 @@ parseTable(ParseState* state, char *tag, uint32_t startline, const struct UStrin return parseCollationElements(state, tag, startline, true, status); } if(isVerbose()){ - printf(" table %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" table %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } TableResource *result = table_open(state->bundle, tag, comment, status); @@ -1640,7 +1648,7 @@ parseArray(ParseState* state, char *tag, uint32_t startline, const struct UStrin return nullptr; } if(isVerbose()){ - printf(" array %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" array %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } ustr_init(&memberComments); @@ -1729,7 +1737,7 @@ parseIntVector(ParseState* state, char *tag, uint32_t startline, const struct US } if(isVerbose()){ - printf(" vector %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" vector %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } ustr_init(&memberComments); /* '{' . string [','] '}' */ @@ -1762,7 +1770,7 @@ parseIntVector(ParseState* state, char *tag, uint32_t startline, const struct US /* For handling illegal char in the Intvector */ value = uprv_strtoul(string, &stopstring, 0);/* make intvector support decimal,hexdigit,octal digit ranging from -2^31-2^32-1*/ - int32_t len = (int32_t)(stopstring-string); + int32_t len = static_cast<int32_t>(stopstring - string); if(len==stringLength) { @@ -1816,7 +1824,7 @@ parseBinary(ParseState* state, char *tag, uint32_t startline, const struct UStri } if(isVerbose()){ - printf(" binary %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" binary %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } LocalMemory<uint8_t> value; @@ -1842,8 +1850,8 @@ parseBinary(ParseState* state, char *tag, uint32_t startline, const struct UStri toConv[1] = string[i++]; char *stopstring; - value[count++] = (uint8_t) uprv_strtoul(toConv, &stopstring, 16); - uint32_t len=(uint32_t)(stopstring-toConv); + value[count++] = static_cast<uint8_t>(uprv_strtoul(toConv, &stopstring, 16)); + uint32_t len = static_cast<uint32_t>(stopstring - toConv); if(len!=2) { @@ -1886,7 +1894,7 @@ parseInteger(ParseState* state, char *tag, uint32_t startline, const struct UStr } if(isVerbose()){ - printf(" integer %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" integer %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } if (stringLength == 0) @@ -1897,7 +1905,7 @@ parseInteger(ParseState* state, char *tag, uint32_t startline, const struct UStr /* Allow integer support for hexdecimal, octal digit and decimal*/ /* and handle illegal char in the integer*/ value = uprv_strtoul(string, &stopstring, 0); - int32_t len = (int32_t)(stopstring-string); + int32_t len = static_cast<int32_t>(stopstring - string); if(len==stringLength) { result = int_open(state->bundle, tag, value, comment, status); @@ -1930,7 +1938,7 @@ parseImport(ParseState* state, char *tag, uint32_t startline, const struct UStri } if(isVerbose()){ - printf(" import %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" import %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } /* Open the input file for reading */ @@ -1997,10 +2005,10 @@ parseInclude(ParseState* state, char *tag, uint32_t startline, const struct UStr } if(isVerbose()){ - printf(" include %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" include %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } - fullname = (char *) uprv_malloc(state->inputdirLength + stringLength + 2); + fullname = static_cast<char*>(uprv_malloc(state->inputdirLength + stringLength + 2)); /* test for nullptr */ if(fullname == nullptr) { @@ -2137,7 +2145,7 @@ void initParser() } static inline UBool isTable(enum EResourceType type) { - return (UBool)(type==RESTYPE_TABLE || type==RESTYPE_TABLE_NO_FALLBACK); + return type == RESTYPE_TABLE || type == RESTYPE_TABLE_NO_FALLBACK; } static enum EResourceType @@ -2159,7 +2167,7 @@ parseResourceType(ParseState* state, UErrorCode *status) /* Search for normal types */ result=RESTYPE_UNKNOWN; - while ((result=(EResourceType)(result+1)) < RESTYPE_RESERVED) { + while ((result = static_cast<EResourceType>(result + 1)) < RESTYPE_RESERVED) { if (u_strcmp(tokenValue->fChars, gResourceTypes[result].nameUChars) == 0) { break; } @@ -2197,7 +2205,7 @@ parseResource(ParseState* state, char *tag, const struct UString *comment, UErro token = getToken(state, &tokenValue, nullptr, &startline, status); if(isVerbose()){ - printf(" resource %s at line %i \n", (tag == nullptr) ? "(null)" : tag, (int)startline); + printf(" resource %s at line %i \n", tag == nullptr ? "(null)" : tag, static_cast<int>(startline)); } /* name . [ ':' type ] '{' resource '}' */ @@ -2334,9 +2342,9 @@ parse(UCHARBUF *buf, const char *inputDir, const char *outputDir, const char *fi initLookahead(&state, buf, status); state.inputdir = inputDir; - state.inputdirLength = (state.inputdir != nullptr) ? (uint32_t)uprv_strlen(state.inputdir) : 0; + state.inputdirLength = state.inputdir != nullptr ? static_cast<uint32_t>(uprv_strlen(state.inputdir)) : 0; state.outputdir = outputDir; - state.outputdirLength = (state.outputdir != nullptr) ? (uint32_t)uprv_strlen(state.outputdir) : 0; + state.outputdirLength = state.outputdir != nullptr ? static_cast<uint32_t>(uprv_strlen(state.outputdir)) : 0; state.filename = filename; state.makeBinaryCollation = makeBinaryCollation; state.omitCollationRules = omitCollationRules; diff --git a/deps/icu-small/source/tools/genrb/read.c b/deps/icu-small/source/tools/genrb/read.c index 0d4a318a8984e0..f4199acf4b203a 100644 --- a/deps/icu-small/source/tools/genrb/read.c +++ b/deps/icu-small/source/tools/genrb/read.c @@ -53,7 +53,7 @@ static void seekUntilEndOfComment (UCHARBUF *buf, struct UString *token, UErr static UBool isWhitespace (UChar32 c); static UBool isNewline (UChar32 c); -U_CFUNC void resetLineNumber() { +U_CFUNC void resetLineNumber(void) { lineCount = 1; } @@ -453,6 +453,7 @@ static UBool isWhitespace(UChar32 c) { case 0x000A: case 0x2029: lineCount++; + U_FALLTHROUGH; case 0x000D: case 0x0020: case 0x0009: @@ -470,6 +471,7 @@ static UBool isNewline(UChar32 c) { case 0x000A: case 0x2029: lineCount++; + U_FALLTHROUGH; case 0x000D: return true; diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index e1c2d25061cd34..c6748a33b909c1 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -118,7 +118,7 @@ static const UVersionInfo gFormatVersions[4] = { /* indexed by a major-formatVe static uint8_t calcPadding(uint32_t size) { /* returns space we need to pad */ - return (uint8_t) ((size % sizeof(uint32_t)) ? (sizeof(uint32_t) - (size % sizeof(uint32_t))) : 0); + return static_cast<uint8_t>(size % sizeof(uint32_t) ? sizeof(uint32_t) - (size % sizeof(uint32_t)) : 0); } @@ -416,7 +416,7 @@ StringResource::handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, // This is a duplicate of a pool bundle string or of an earlier-visited string. if (++fSame->fNumCopies == 1) { assert(fSame->fWritten); - int32_t poolStringIndex = (int32_t)RES_GET_OFFSET(fSame->fRes); + int32_t poolStringIndex = static_cast<int32_t>(RES_GET_OFFSET(fSame->fRes)); if (poolStringIndex >= bundle->fPoolStringIndexLimit) { bundle->fPoolStringIndexLimit = poolStringIndex + 1; } @@ -430,7 +430,7 @@ StringResource::handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, if (bundle->fStringsForm != STRINGS_UTF16_V1) { int32_t len = length(); if (len <= MAX_IMPLICIT_STRING_LENGTH && - !U16_IS_TRAIL(fString[0]) && fString.indexOf((char16_t)0) < 0) { + !U16_IS_TRAIL(fString[0]) && fString.indexOf(static_cast<char16_t>(0)) < 0) { /* * This string will be stored without an explicit length. * Runtime will detect !U16_IS_TRAIL(s[0]) and call u_strlen(). @@ -483,7 +483,7 @@ SRBRoot::makeRes16(uint32_t resWord) const { return 0; /* empty string */ } uint32_t type = RES_GET_TYPE(resWord); - int32_t offset = (int32_t)RES_GET_OFFSET(resWord); + int32_t offset = static_cast<int32_t>(RES_GET_OFFSET(resWord)); if (type == URES_STRING_V2) { assert(offset > 0); if (offset < fPoolStringIndexLimit) { @@ -542,7 +542,7 @@ StringResource::handleWrite16(SRBRoot * /*bundle*/) { void ContainerResource::writeAllRes16(SRBRoot *bundle) { for (SResource *current = fFirst; current != nullptr; current = current->fNext) { - bundle->f16BitUnits.append((char16_t)current->fRes16); + bundle->f16BitUnits.append(static_cast<char16_t>(current->fRes16)); } fWritten = true; } @@ -562,7 +562,7 @@ ArrayResource::handleWrite16(SRBRoot *bundle) { } if (fCount <= 0xffff && res16 >= 0 && gFormatVersion > 1) { fRes = URES_MAKE_RESOURCE(URES_ARRAY16, bundle->f16BitUnits.length()); - bundle->f16BitUnits.append((char16_t)fCount); + bundle->f16BitUnits.append(static_cast<char16_t>(fCount)); writeAllRes16(bundle); } } @@ -582,16 +582,16 @@ TableResource::handleWrite16(SRBRoot *bundle) { key16 |= current->fKey16; res16 |= current->fRes16; } - if(fCount > (uint32_t)bundle->fMaxTableLength) { + if (fCount > static_cast<uint32_t>(bundle->fMaxTableLength)) { bundle->fMaxTableLength = fCount; } if (fCount <= 0xffff && key16 >= 0) { if (res16 >= 0 && gFormatVersion > 1) { /* 16-bit count, key offsets and values */ fRes = URES_MAKE_RESOURCE(URES_TABLE16, bundle->f16BitUnits.length()); - bundle->f16BitUnits.append((char16_t)fCount); + bundle->f16BitUnits.append(static_cast<char16_t>(fCount)); for (SResource *current = fFirst; current != nullptr; current = current->fNext) { - bundle->f16BitUnits.append((char16_t)current->fKey16); + bundle->f16BitUnits.append(static_cast<char16_t>(current->fKey16)); } writeAllRes16(bundle); } else { @@ -807,7 +807,7 @@ void TableResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { writeAllRes(mem, byteOffset); if(fTableType == URES_TABLE) { - udata_write16(mem, (uint16_t)fCount); + udata_write16(mem, static_cast<uint16_t>(fCount)); for (SResource *current = fFirst; current != nullptr; current = current->fNext) { udata_write16(mem, current->fKey16); } @@ -820,7 +820,7 @@ TableResource::handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) { } else /* URES_TABLE32 */ { udata_write32(mem, fCount); for (SResource *current = fFirst; current != nullptr; current = current->fNext) { - udata_write32(mem, (uint32_t)current->fKey); + udata_write32(mem, static_cast<uint32_t>(current->fKey)); } *byteOffset += (1 + fCount)* 4; } @@ -862,7 +862,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, * Safe because the capacity is a multiple of 4. */ while (fKeysTop & 3) { - fKeys[fKeysTop++] = (char)0xaa; + fKeys[fKeysTop++] = static_cast<char>(0xaa); } /* * In URES_TABLE, use all local key offsets that fit into 16 bits, @@ -921,8 +921,8 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, } else { // Set the pool index threshold so that 16-bit indexes work // for some pool strings and some local strings. - fPoolStringIndex16Limit = (int32_t)( - ((int64_t)fPoolStringIndexLimit * 0xffff) / sum); + fPoolStringIndex16Limit = static_cast<int32_t>( + (static_cast<int64_t>(fPoolStringIndexLimit) * 0xffff) / sum); } } else if (gIsDefaultFormatVersion && formatVersion == 3 && !fIsPoolBundle) { // If we just default to formatVersion 3 @@ -938,7 +938,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, return; } if (f16BitUnits.length() & 1) { - f16BitUnits.append((char16_t)0xaaaa); /* pad to multiple of 4 bytes */ + f16BitUnits.append(static_cast<char16_t>(0xaaaa)); /* pad to multiple of 4 bytes */ } byteOffset = fKeysTop + f16BitUnits.length() * 2; @@ -964,12 +964,12 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if(outputPkg != nullptr) { uprv_strcpy(writtenFilename+off, outputPkg); - off += (int32_t)uprv_strlen(outputPkg); + off += static_cast<int32_t>(uprv_strlen(outputPkg)); writtenFilename[off] = '_'; ++off; } - len = (int32_t)uprv_strlen(fLocale); + len = static_cast<int32_t>(uprv_strlen(fLocale)); if (len > writtenFilenameLen) { len = writtenFilenameLen; } @@ -1012,7 +1012,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, uprv_memset(indexes, 0, sizeof(indexes)); indexes[URES_INDEX_LENGTH]= fIndexLength; indexes[URES_INDEX_KEYS_TOP]= fKeysTop>>2; - indexes[URES_INDEX_RESOURCES_TOP]= (int32_t)(top>>2); + indexes[URES_INDEX_RESOURCES_TOP] = static_cast<int32_t>(top >> 2); indexes[URES_INDEX_BUNDLE_TOP]= indexes[URES_INDEX_RESOURCES_TOP]; indexes[URES_INDEX_MAX_TABLE_LENGTH]= fMaxTableLength; @@ -1034,13 +1034,13 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if (URES_INDEX_POOL_CHECKSUM < fIndexLength) { if (fIsPoolBundle) { indexes[URES_INDEX_ATTRIBUTES] |= URES_ATT_IS_POOL_BUNDLE | URES_ATT_NO_FALLBACK; - uint32_t checksum = computeCRC((const char *)(fKeys + fKeysBottom), - (uint32_t)(fKeysTop - fKeysBottom), 0); + uint32_t checksum = computeCRC(static_cast<const char*>(fKeys + fKeysBottom), + static_cast<uint32_t>(fKeysTop - fKeysBottom), 0); if (f16BitUnits.length() <= 1) { // no pool strings to checksum } else if (U_IS_BIG_ENDIAN) { checksum = computeCRC(reinterpret_cast<const char *>(f16BitUnits.getBuffer()), - (uint32_t)f16BitUnits.length() * 2, checksum); + static_cast<uint32_t>(f16BitUnits.length()) * 2, checksum); } else { // Swap to big-endian so we get the same checksum on all platforms // (except for charset family, due to the key strings). @@ -1050,13 +1050,13 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, char16_t* p = s.getBuffer(f16BitUnits.length()); for (int32_t count = f16BitUnits.length(); count > 0; --count) { uint16_t x = *p; - *p++ = (uint16_t)((x << 8) | (x >> 8)); + *p++ = static_cast<uint16_t>((x << 8) | (x >> 8)); } s.releaseBuffer(f16BitUnits.length()); - checksum = computeCRC((const char *)s.getBuffer(), - (uint32_t)f16BitUnits.length() * 2, checksum); + checksum = computeCRC(reinterpret_cast<const char*>(s.getBuffer()), + static_cast<uint32_t>(f16BitUnits.length()) * 2, checksum); } - indexes[URES_INDEX_POOL_CHECKSUM] = (int32_t)checksum; + indexes[URES_INDEX_POOL_CHECKSUM] = static_cast<int32_t>(checksum); } else if (gUsePoolBundle) { indexes[URES_INDEX_ATTRIBUTES] |= URES_ATT_USES_POOL_BUNDLE; indexes[URES_INDEX_POOL_CHECKSUM] = fUsePoolBundle->fChecksum; @@ -1086,7 +1086,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, size = udata_finish(mem, &errorCode); if(top != size) { fprintf(stderr, "genrb error: wrote %u bytes but counted %u\n", - (int)size, (int)top); + static_cast<int>(size), static_cast<int>(top)); errorCode = U_INTERNAL_PROGRAM_ERROR; } } @@ -1149,10 +1149,10 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo if (gFormatVersion > 1) { // f16BitUnits must start with a zero for empty resources. // We might be able to omit it if there are no empty 16-bit resources. - f16BitUnits.append((char16_t)0); + f16BitUnits.append(static_cast<char16_t>(0)); } - fKeys = (char *) uprv_malloc(sizeof(char) * KEY_SPACE_SIZE); + fKeys = static_cast<char*>(uprv_malloc(sizeof(char) * KEY_SPACE_SIZE)); if (isPoolBundle) { fRoot = new PseudoListResource(this, errorCode); } else { @@ -1206,7 +1206,7 @@ void SRBRoot::setLocale(char16_t *locale, UErrorCode &errorCode) { } uprv_free(fLocale); - fLocale = (char*) uprv_malloc(sizeof(char) * (u_strlen(locale)+1)); + fLocale = static_cast<char*>(uprv_malloc(sizeof(char) * (u_strlen(locale) + 1))); if(fLocale == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; @@ -1286,7 +1286,7 @@ SRBRoot::addTag(const char *tag, UErrorCode &errorCode) { return -1; } - keypos = addKeyBytes(tag, (int32_t)(uprv_strlen(tag) + 1), errorCode); + keypos = addKeyBytes(tag, static_cast<int32_t>(uprv_strlen(tag) + 1), errorCode); if (U_SUCCESS(errorCode)) { ++fKeysCount; } @@ -1310,9 +1310,9 @@ compareInt32(int32_t lPos, int32_t rPos) { static int32_t U_CALLCONV compareKeySuffixes(const void *context, const void *l, const void *r) { - const struct SRBRoot *bundle=(const struct SRBRoot *)context; - int32_t lPos = ((const KeyMapEntry *)l)->oldpos; - int32_t rPos = ((const KeyMapEntry *)r)->oldpos; + const struct SRBRoot* bundle = static_cast<const struct SRBRoot*>(context); + int32_t lPos = static_cast<const KeyMapEntry*>(l)->oldpos; + int32_t rPos = static_cast<const KeyMapEntry*>(r)->oldpos; const char *lStart = bundle->getKeyString(lPos); const char *lLimit = lStart; const char *rStart = bundle->getKeyString(rPos); @@ -1322,13 +1322,13 @@ compareKeySuffixes(const void *context, const void *l, const void *r) { while (*rLimit != 0) { ++rLimit; } /* compare keys in reverse character order */ while (lStart < lLimit && rStart < rLimit) { - diff = (int32_t)(uint8_t)*--lLimit - (int32_t)(uint8_t)*--rLimit; + diff = static_cast<int32_t>(static_cast<uint8_t>(*--lLimit)) - static_cast<int32_t>(static_cast<uint8_t>(*--rLimit)); if (diff != 0) { return diff; } } /* sort equal suffixes by descending key length */ - diff = (int32_t)(rLimit - rStart) - (int32_t)(lLimit - lStart); + diff = static_cast<int32_t>(rLimit - rStart) - static_cast<int32_t>(lLimit - lStart); if (diff != 0) { return diff; } @@ -1338,12 +1338,14 @@ compareKeySuffixes(const void *context, const void *l, const void *r) { static int32_t U_CALLCONV compareKeyNewpos(const void * /*context*/, const void *l, const void *r) { - return compareInt32(((const KeyMapEntry *)l)->newpos, ((const KeyMapEntry *)r)->newpos); + return compareInt32(static_cast<const KeyMapEntry*>(l)->newpos, + static_cast<const KeyMapEntry*>(r)->newpos); } static int32_t U_CALLCONV compareKeyOldpos(const void * /*context*/, const void *l, const void *r) { - return compareInt32(((const KeyMapEntry *)l)->oldpos, ((const KeyMapEntry *)r)->oldpos); + return compareInt32(static_cast<const KeyMapEntry*>(l)->oldpos, + static_cast<const KeyMapEntry*>(r)->oldpos); } void SResource::collectKeys(std::function<void(int32_t)> collector) const { @@ -1379,15 +1381,15 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { if (U_FAILURE(errorCode) || fKeyMap != nullptr) { return; } - map = (KeyMapEntry *)uprv_malloc(keysCount * sizeof(KeyMapEntry)); + map = static_cast<KeyMapEntry*>(uprv_malloc(keysCount * sizeof(KeyMapEntry))); if (map == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } - keys = (char *)fUsePoolBundle->fKeys; + keys = const_cast<char*>(fUsePoolBundle->fKeys); for (i = 0; i < fUsePoolBundle->fKeysCount; ++i) { map[i].oldpos = - (int32_t)(keys - fUsePoolBundle->fKeys) | 0x80000000; /* negative oldpos */ + static_cast<int32_t>(keys - fUsePoolBundle->fKeys) | 0x80000000; /* negative oldpos */ map[i].newpos = 0; while (*keys != 0) { ++keys; } /* skip the key */ ++keys; /* skip the NUL */ @@ -1412,7 +1414,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { fKeysTop = static_cast<int32_t>(keys - fKeys); } /* Sort the keys so that each one is immediately followed by all of its suffixes. */ - uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry), + uprv_sortArray(map, keysCount, static_cast<int32_t>(sizeof(KeyMapEntry)), compareKeySuffixes, this, false, &errorCode); /* * Make suffixes point into earlier, longer strings that contain them @@ -1465,7 +1467,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { * Re-sort by newpos, then modify the key characters array in-place * to squeeze out unused bytes, and readjust the newpos offsets. */ - uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry), + uprv_sortArray(map, keysCount, static_cast<int32_t>(sizeof(KeyMapEntry)), compareKeyNewpos, nullptr, false, &errorCode); if (U_SUCCESS(errorCode)) { int32_t oldpos, newpos, limit; @@ -1490,7 +1492,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { } fKeysTop = newpos; /* Re-sort once more, by old offsets for binary searching. */ - uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry), + uprv_sortArray(map, keysCount, static_cast<int32_t>(sizeof(KeyMapEntry)), compareKeyOldpos, nullptr, false, &errorCode); if (U_SUCCESS(errorCode)) { /* key size reduction by limit - newpos */ @@ -1504,8 +1506,8 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { static int32_t U_CALLCONV compareStringSuffixes(const void * /*context*/, const void *l, const void *r) { - const StringResource *left = *((const StringResource **)l); - const StringResource *right = *((const StringResource **)r); + const StringResource *left = *static_cast<const StringResource* const*>(l); + const StringResource *right = *static_cast<const StringResource* const*>(r); const char16_t *lStart = left->getBuffer(); const char16_t *lLimit = lStart + left->length(); const char16_t *rStart = right->getBuffer(); @@ -1513,7 +1515,7 @@ compareStringSuffixes(const void * /*context*/, const void *l, const void *r) { int32_t diff; /* compare keys in reverse character order */ while (lStart < lLimit && rStart < rLimit) { - diff = (int32_t)*--lLimit - (int32_t)*--rLimit; + diff = static_cast<int32_t>(*--lLimit) - static_cast<int32_t>(*--rLimit); if (diff != 0) { return diff; } @@ -1524,11 +1526,11 @@ compareStringSuffixes(const void * /*context*/, const void *l, const void *r) { static int32_t U_CALLCONV compareStringLengths(const void * /*context*/, const void *l, const void *r) { - const StringResource *left = *((const StringResource **)l); - const StringResource *right = *((const StringResource **)r); + const StringResource *left = *static_cast<const StringResource* const*>(l); + const StringResource *right = *static_cast<const StringResource* const*>(r); int32_t diff; /* Make "is suffix of another string" compare greater than a non-suffix. */ - diff = (int)(left->fSame != nullptr) - (int)(right->fSame != nullptr); + diff = static_cast<int>(left->fSame != nullptr) - static_cast<int>(right->fSame != nullptr); if (diff != 0) { return diff; } @@ -1555,22 +1557,22 @@ StringResource::writeUTF16v2(int32_t base, UnicodeString &dest) { case 0: break; case 1: - dest.append((char16_t)(0xdc00 + len)); + dest.append(static_cast<char16_t>(0xdc00 + len)); break; case 2: - dest.append((char16_t)(0xdfef + (len >> 16))); - dest.append((char16_t)len); + dest.append(static_cast<char16_t>(0xdfef + (len >> 16))); + dest.append(static_cast<char16_t>(len)); break; case 3: - dest.append((char16_t)0xdfff); - dest.append((char16_t)(len >> 16)); - dest.append((char16_t)len); + dest.append(static_cast<char16_t>(0xdfff)); + dest.append(static_cast<char16_t>(len >> 16)); + dest.append(static_cast<char16_t>(len)); break; default: break; /* will not occur */ } dest.append(fString); - dest.append((char16_t)0); + dest.append(static_cast<char16_t>(0)); } void @@ -1587,10 +1589,10 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { return; } for (int32_t pos = UHASH_FIRST, i = 0; i < count; ++i) { - array[i] = (StringResource *)uhash_nextElement(stringSet, &pos)->key.pointer; + array[i] = static_cast<StringResource*>(uhash_nextElement(stringSet, &pos)->key.pointer); } /* Sort the strings so that each one is immediately followed by all of its suffixes. */ - uprv_sortArray(array.getAlias(), count, (int32_t)sizeof(struct SResource **), + uprv_sortArray(array.getAlias(), count, static_cast<int32_t>(sizeof(struct SResource**)), compareStringSuffixes, nullptr, false, &errorCode); if (U_FAILURE(errorCode)) { return; @@ -1627,7 +1629,7 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { // Compute the resource word and collect the maximum. suffixRes->fRes = res->fRes + res->fNumCharsForLength + suffixRes->fSuffixOffset; - int32_t poolStringIndex = (int32_t)RES_GET_OFFSET(suffixRes->fRes); + int32_t poolStringIndex = static_cast<int32_t>(RES_GET_OFFSET(suffixRes->fRes)); if (poolStringIndex >= fPoolStringIndexLimit) { fPoolStringIndexLimit = poolStringIndex + 1; } @@ -1648,7 +1650,7 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { * to optimize for URES_TABLE16 and URES_ARRAY16: * Keep as many as possible within reach of 16-bit offsets. */ - uprv_sortArray(array.getAlias(), count, (int32_t)sizeof(struct SResource **), + uprv_sortArray(array.getAlias(), count, static_cast<int32_t>(sizeof(struct SResource**)), compareStringLengths, nullptr, false, &errorCode); if (U_FAILURE(errorCode)) { return; @@ -1679,13 +1681,13 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { errorCode = U_MEMORY_ALLOCATION_ERROR; } if (getShowWarning()) { // not quiet - printf("number of shared strings: %d\n", (int)numStringsWritten); + printf("number of shared strings: %d\n", static_cast<int>(numStringsWritten)); printf("16-bit units for strings: %6d = %6d bytes\n", - (int)f16BitUnits.length(), (int)f16BitUnits.length() * 2); + static_cast<int>(f16BitUnits.length()), static_cast<int>(f16BitUnits.length()) * 2); printf("16-bit units saved: %6d = %6d bytes\n", - (int)numUnitsSaved, (int)numUnitsSaved * 2); + static_cast<int>(numUnitsSaved), static_cast<int>(numUnitsSaved) * 2); printf("16-bit units not saved: %6d = %6d bytes\n", - (int)numUnitsNotSaved, (int)numUnitsNotSaved * 2); + static_cast<int>(numUnitsNotSaved), static_cast<int>(numUnitsNotSaved) * 2); } } else { assert(fPoolStringIndexLimit <= fUsePoolBundle->fStringIndexLimit); @@ -1728,7 +1730,7 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { StringResource *same = res->fSame; assert(res->length() != same->length()); // Set strings are unique. res->fRes = same->fRes + same->fNumCharsForLength + res->fSuffixOffset; - int32_t localStringIndex = (int32_t)RES_GET_OFFSET(res->fRes) - fPoolStringIndexLimit; + int32_t localStringIndex = static_cast<int32_t>(RES_GET_OFFSET(res->fRes)) - fPoolStringIndexLimit; // Suffixes of pool strings have been set already. assert(localStringIndex >= 0); if (localStringIndex >= fLocalStringIndexLimit) { diff --git a/deps/icu-small/source/tools/genrb/rle.c b/deps/icu-small/source/tools/genrb/rle.c index f737c454914153..68427764aca362 100644 --- a/deps/icu-small/source/tools/genrb/rle.c +++ b/deps/icu-small/source/tools/genrb/rle.c @@ -92,13 +92,12 @@ encodeRunByte(uint16_t* buffer,uint16_t* bufLimit, uint8_t value, int32_t length return buffer; } -#define APPEND( buffer, bufLimit, value, num, status) UPRV_BLOCK_MACRO_BEGIN { \ +#define APPEND( buffer, bufLimit, value, status) UPRV_BLOCK_MACRO_BEGIN { \ if(buffer<bufLimit){ \ *buffer++=(value); \ }else{ \ *status = U_BUFFER_OVERFLOW_ERROR; \ } \ - num++; \ } UPRV_BLOCK_MACRO_END /** @@ -107,29 +106,28 @@ encodeRunByte(uint16_t* buffer,uint16_t* bufLimit, uint8_t value, int32_t length */ static uint16_t* encodeRunShort(uint16_t* buffer,uint16_t* bufLimit, uint16_t value, int32_t length,UErrorCode* status) { - int32_t num=0; if (length < 4) { int j=0; for (; j<length; ++j) { if (value == (int32_t) ESCAPE){ - APPEND(buffer,bufLimit,ESCAPE, num, status); + APPEND(buffer,bufLimit,ESCAPE, status); } - APPEND(buffer,bufLimit,value,num, status); + APPEND(buffer,bufLimit,value,status); } } else { if (length == (int32_t) ESCAPE) { if (value == (int32_t) ESCAPE){ - APPEND(buffer,bufLimit,ESCAPE,num,status); + APPEND(buffer,bufLimit,ESCAPE,status); } - APPEND(buffer,bufLimit,value,num,status); + APPEND(buffer,bufLimit,value,status); --length; } - APPEND(buffer,bufLimit,ESCAPE,num,status); - APPEND(buffer,bufLimit,(uint16_t) length, num,status); - APPEND(buffer,bufLimit,(uint16_t)value, num, status); /* Don't need to escape this value */ + APPEND(buffer,bufLimit,ESCAPE,status); + APPEND(buffer,bufLimit,(uint16_t) length,status); + APPEND(buffer,bufLimit,(uint16_t)value, status); /* Don't need to escape this value */ } return buffer; } @@ -164,12 +162,12 @@ usArrayToRLEString(const uint16_t* src,int32_t srcLen,uint16_t* buffer, int32_t if (s == runValue && runLength < 0xFFFF){ ++runLength; }else { - buffer = encodeRunShort(buffer,bufLimit, (uint16_t)runValue, runLength,status); + buffer = encodeRunShort(buffer, bufLimit, runValue, runLength, status); runValue = s; runLength = 1; } } - buffer= encodeRunShort(buffer,bufLimit,(uint16_t)runValue, runLength,status); + buffer = encodeRunShort(buffer, bufLimit, runValue, runLength, status); }else{ *status = U_BUFFER_OVERFLOW_ERROR; } diff --git a/deps/icu-small/source/tools/genrb/wrtjava.cpp b/deps/icu-small/source/tools/genrb/wrtjava.cpp index cb04b5a44ab949..ca268dce125780 100644 --- a/deps/icu-small/source/tools/genrb/wrtjava.cpp +++ b/deps/icu-small/source/tools/genrb/wrtjava.cpp @@ -122,18 +122,17 @@ uCharsToChars(char *target, int32_t targetLen, const char16_t *source, int32_t s if(source[i-1]=='\''){ if(j+2<targetLen){ uprv_strcat(target,"\\"); - target[j+1]= (char)source[i]; + target[j + 1] = static_cast<char>(source[i]); } j+=2; }else if(source[i-1]!='\\'){ - if(j+2<targetLen){ uprv_strcat(target,"\\"); - target[j+1]= (char)source[i]; + target[j + 1] = static_cast<char>(source[i]); } j+=2; - }else if(source[i-1]=='\\'){ - target[j++]= (char)source[i]; + }else{ + target[j++] = static_cast<char>(source[i]); } }else if(source[i]=='\\'){ if(i+1<sourceLen){ @@ -161,7 +160,7 @@ uCharsToChars(char *target, int32_t targetLen, const char16_t *source, int32_t s break; default : if(j<targetLen){ - target[j]=(char)source[i]; + target[j] = static_cast<char>(source[i]); } j++; break; @@ -174,7 +173,7 @@ uCharsToChars(char *target, int32_t targetLen, const char16_t *source, int32_t s } }else if(source[i]>=0x20 && source[i]<0x7F/*ASCII*/){ if(j<targetLen){ - target[j] = (char) source[i]; + target[j] = static_cast<char>(source[i]); } j++; }else{ @@ -208,11 +207,11 @@ strrch(const char* source,uint32_t sourceLen,char find){ const char* tSourceEnd =source + (sourceLen-1); while(tSourceEnd>= source){ if(*tSourceEnd==find){ - return (uint32_t)(tSourceEnd-source); + return static_cast<uint32_t>(tSourceEnd - source); } tSourceEnd--; } - return (uint32_t)(tSourceEnd-source); + return static_cast<uint32_t>(tSourceEnd - source); } static int32_t getColumnCount(int32_t len){ @@ -234,7 +233,7 @@ str_write_java(const char16_t *src, int32_t srcLen, UBool printEndLine, UErrorCo uint32_t length = srcLen*8; uint32_t bufLen = 0; uint32_t columnCount; - char* buf = (char*) malloc(sizeof(char)*length); + char* buf = static_cast<char*>(malloc(sizeof(char) * length)); if(buf == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -330,7 +329,6 @@ string_write_java(const StringResource *res,UErrorCode *status) { static void array_write_java(const ArrayResource *res, UErrorCode *status) { - uint32_t i = 0; const char* arr ="new String[] { \n"; struct SResource *current = nullptr; UBool allStrings = true; @@ -342,7 +340,6 @@ array_write_java(const ArrayResource *res, UErrorCode *status) { if (res->fCount > 0) { current = res->fFirst; - i = 0; while(current != nullptr){ if(!current->isString()){ allStrings = false; @@ -355,11 +352,11 @@ array_write_java(const ArrayResource *res, UErrorCode *status) { if(allStrings==false){ const char* object = "new Object[]{\n"; write_tabs(out); - T_FileStream_write(out, object, (int32_t)uprv_strlen(object)); + T_FileStream_write(out, object, static_cast<int32_t>(uprv_strlen(object))); tabCount++; }else{ write_tabs(out); - T_FileStream_write(out, arr, (int32_t)uprv_strlen(arr)); + T_FileStream_write(out, arr, static_cast<int32_t>(uprv_strlen(arr))); tabCount++; } while (current != nullptr) { @@ -370,7 +367,6 @@ array_write_java(const ArrayResource *res, UErrorCode *status) { if(U_FAILURE(*status)){ return; } - i++; current = current->fNext; } T_FileStream_write(out,"\n",1); @@ -381,7 +377,7 @@ array_write_java(const ArrayResource *res, UErrorCode *status) { } else { write_tabs(out); - T_FileStream_write(out,arr,(int32_t)uprv_strlen(arr)); + T_FileStream_write(out, arr, static_cast<int32_t>(uprv_strlen(arr))); write_tabs(out); T_FileStream_write(out,"},\n",3); } @@ -400,7 +396,7 @@ intvector_write_java(const IntVectorResource *res, UErrorCode * /*status*/) { write_tabs(out); if(resname != nullptr && uprv_strcmp(resname,"DateTimeElements")==0){ - T_FileStream_write(out, stringArr, (int32_t)uprv_strlen(stringArr)); + T_FileStream_write(out, stringArr, static_cast<int32_t>(uprv_strlen(stringArr))); tabCount++; for(i = 0; i<res->fCount; i++) { write_tabs(out); @@ -411,7 +407,7 @@ intvector_write_java(const IntVectorResource *res, UErrorCode * /*status*/) { T_FileStream_write(out,"\n",1); } }else{ - T_FileStream_write(out, intArr, (int32_t)uprv_strlen(intArr)); + T_FileStream_write(out, intArr, static_cast<int32_t>(uprv_strlen(intArr))); tabCount++; for(i = 0; i<res->fCount; i++) { write_tabs(out); @@ -437,7 +433,7 @@ int_write_java(const IntResource *res, UErrorCode * /*status*/) { /* write the binary data */ write_tabs(out); - T_FileStream_write(out, intC, (int32_t)uprv_strlen(intC)); + T_FileStream_write(out, intC, static_cast<int32_t>(uprv_strlen(intC))); len=itostr(buf, res->fValue, 10, 0); T_FileStream_write(out,buf,len); T_FileStream_write(out,"),\n",3 ); @@ -457,7 +453,7 @@ bytes_write_java(const BinaryResource *res, UErrorCode * /*status*/) { byteArray = res->fData; write_tabs(out); - T_FileStream_write(out, type, (int32_t)uprv_strlen(type)); + T_FileStream_write(out, type, static_cast<int32_t>(uprv_strlen(type))); T_FileStream_write(out, "\n", 1); tabCount++; @@ -477,7 +473,7 @@ bytes_write_java(const BinaryResource *res, UErrorCode * /*status*/) { snprintf(byteBuffer, sizeof(byteBuffer), byteDecl, (byteArray[byteIterator]-256)); } - T_FileStream_write(out, byteBuffer, (int32_t)uprv_strlen(byteBuffer)); + T_FileStream_write(out, byteBuffer, static_cast<int32_t>(uprv_strlen(byteBuffer))); if (byteIterator%16 == 15) { @@ -500,7 +496,7 @@ bytes_write_java(const BinaryResource *res, UErrorCode * /*status*/) { { /* Empty array */ write_tabs(out); - T_FileStream_write(out,type,(int32_t)uprv_strlen(type)); + T_FileStream_write(out, type, static_cast<int32_t>(uprv_strlen(type))); T_FileStream_write(out,"},\n",3); } @@ -521,7 +517,7 @@ table_write_java(const TableResource *res, UErrorCode *status) { if (res->fCount > 0) { if(start==false){ write_tabs(out); - T_FileStream_write(out, obj, (int32_t)uprv_strlen(obj)); + T_FileStream_write(out, obj, static_cast<int32_t>(uprv_strlen(obj))); tabCount++; } start = false; @@ -544,7 +540,7 @@ table_write_java(const TableResource *res, UErrorCode *status) { if(currentKeyString != nullptr) { T_FileStream_write(out, "\"", 1); T_FileStream_write(out, currentKeyString, - (int32_t)uprv_strlen(currentKeyString)); + static_cast<int32_t>(uprv_strlen(currentKeyString))); T_FileStream_write(out, "\",\n", 2); T_FileStream_write(out, "\n", 1); @@ -567,7 +563,7 @@ table_write_java(const TableResource *res, UErrorCode *status) { } else { write_tabs(out); - T_FileStream_write(out,obj,(int32_t)uprv_strlen(obj)); + T_FileStream_write(out, obj, static_cast<int32_t>(uprv_strlen(obj))); write_tabs(out); T_FileStream_write(out,"},\n",3); @@ -665,15 +661,15 @@ bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outp return; } if(getIncludeCopyright()){ - T_FileStream_write(out, copyRight, (int32_t)uprv_strlen(copyRight)); - T_FileStream_write(out, warningMsg, (int32_t)uprv_strlen(warningMsg)); + T_FileStream_write(out, copyRight, static_cast<int32_t>(uprv_strlen(copyRight))); + T_FileStream_write(out, warningMsg, static_cast<int32_t>(uprv_strlen(warningMsg))); } - T_FileStream_write(out,"package ",(int32_t)uprv_strlen("package ")); - T_FileStream_write(out,pName,(int32_t)uprv_strlen(pName)); + T_FileStream_write(out, "package ", static_cast<int32_t>(uprv_strlen("package "))); + T_FileStream_write(out, pName, static_cast<int32_t>(uprv_strlen(pName))); T_FileStream_write(out,";\n\n",3); - T_FileStream_write(out, javaClass, (int32_t)uprv_strlen(javaClass)); - T_FileStream_write(out, className, (int32_t)uprv_strlen(className)); - T_FileStream_write(out, javaClass1, (int32_t)uprv_strlen(javaClass1)); + T_FileStream_write(out, javaClass, static_cast<int32_t>(uprv_strlen(javaClass))); + T_FileStream_write(out, className, static_cast<int32_t>(uprv_strlen(className))); + T_FileStream_write(out, javaClass1, static_cast<int32_t>(uprv_strlen(javaClass1))); /* if(j1){ T_FileStream_write(out, javaClass1, (int32_t)uprv_strlen(javaClass1)); @@ -693,7 +689,7 @@ bundle_write_java(struct SRBRoot *bundle, const char *outputDir,const char* outp } res_write_java(bundle->fRoot, status); - T_FileStream_write(out, closeClass, (int32_t)uprv_strlen(closeClass)); + T_FileStream_write(out, closeClass, static_cast<int32_t>(uprv_strlen(closeClass))); T_FileStream_close(out); diff --git a/deps/icu-small/source/tools/genrb/wrtxml.cpp b/deps/icu-small/source/tools/genrb/wrtxml.cpp index 16f67fabcaf301..24ddf52e07892b 100644 --- a/deps/icu-small/source/tools/genrb/wrtxml.cpp +++ b/deps/icu-small/source/tools/genrb/wrtxml.cpp @@ -78,7 +78,7 @@ static int32_t write_utf8_file(FileStream* fileStream, UnicodeString outString) &status); // allocate the buffer - char* dest = (char*)uprv_malloc(len); + char* dest = static_cast<char*>(uprv_malloc(len)); status = U_ZERO_ERROR; // convert the data @@ -106,11 +106,11 @@ static void write_tabs(FileStream* os){ /*get ID for each element. ID is globally unique.*/ static char* getID(const char* id, const char* curKey, char* result) { if(curKey == nullptr) { - result = (char *)uprv_malloc(sizeof(char)*uprv_strlen(id) + 1); + result = static_cast<char*>(uprv_malloc(sizeof(char) * uprv_strlen(id) + 1)); uprv_memset(result, 0, sizeof(char)*uprv_strlen(id) + 1); uprv_strcpy(result, id); } else { - result = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1); + result = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1)); uprv_memset(result, 0, sizeof(char)*(uprv_strlen(id) + 1 + uprv_strlen(curKey)) + 1); if(id[0]!='\0'){ uprv_strcpy(result, id); @@ -165,7 +165,7 @@ uint32_t computeCRC(const char *ptr, uint32_t len, uint32_t lastcrc){ crc = lastcrc; while(len--!=0) { - temp1 = (uint32_t)crc>>8; + temp1 = static_cast<uint32_t>(crc) >> 8; temp2 = crc_ta[(crc^*ptr) & 0xFF]; crc = temp1^temp2; ptr++; @@ -186,8 +186,8 @@ static void strnrepchr(char* src, int32_t srcLen, char s, char r){ * use "en" as the default value for language */ static char* parseFilename(const char* id, char* /*lang*/) { - int idLen = (int) uprv_strlen(id); - char* localeID = (char*) uprv_malloc(idLen); + int idLen = static_cast<int>(uprv_strlen(id)); + char* localeID = static_cast<char*>(uprv_malloc(idLen+1)); int pos = 0; int canonCapacity = 0; char* canon = nullptr; @@ -197,7 +197,7 @@ static char* parseFilename(const char* id, char* /*lang*/) { const char *ext = uprv_strchr(id, '.'); if(ext != nullptr){ - pos = (int) (ext - id); + pos = static_cast<int>(ext - id); } else { pos = idLen; } @@ -205,7 +205,7 @@ static char* parseFilename(const char* id, char* /*lang*/) { localeID[pos]=0; /* NUL terminate the string */ canonCapacity =pos*3; - canon = (char*) uprv_malloc(canonCapacity); + canon = static_cast<char*>(uprv_malloc(canonCapacity)); canonLen = uloc_canonicalize(localeID, canon, canonCapacity, &status); if(U_FAILURE(status)){ @@ -246,7 +246,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength dest =*pDest; if(dest==nullptr || destCap <=0){ destCap = srcLen * 8; - dest = (char*) uprv_malloc(sizeof(char) * destCap); + dest = static_cast<char*>(uprv_malloc(sizeof(char) * destCap)); if(dest==nullptr){ *status=U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -272,23 +272,23 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength switch(c) { case '\x26': uprv_strcpy(dest+( destLen),"\x26\x61\x6d\x70\x3b"); /* &*/ - destLen+=(int32_t)uprv_strlen("\x26\x61\x6d\x70\x3b"); + destLen += static_cast<int32_t>(uprv_strlen("\x26\x61\x6d\x70\x3b")); break; case '\x3c': uprv_strcpy(dest+(destLen),"\x26\x6c\x74\x3b"); /* <*/ - destLen+=(int32_t)uprv_strlen("\x26\x6c\x74\x3b"); + destLen += static_cast<int32_t>(uprv_strlen("\x26\x6c\x74\x3b")); break; case '\x3e': uprv_strcpy(dest+(destLen),"\x26\x67\x74\x3b"); /* >*/ - destLen+=(int32_t)uprv_strlen("\x26\x67\x74\x3b"); + destLen += static_cast<int32_t>(uprv_strlen("\x26\x67\x74\x3b")); break; case '\x22': uprv_strcpy(dest+(destLen),"\x26\x71\x75\x6f\x74\x3b"); /* "*/ - destLen+=(int32_t)uprv_strlen("\x26\x71\x75\x6f\x74\x3b"); + destLen += static_cast<int32_t>(uprv_strlen("\x26\x71\x75\x6f\x74\x3b")); break; case '\x27': uprv_strcpy(dest+(destLen),"\x26\x61\x70\x6f\x73\x3b"); /* ' */ - destLen+=(int32_t)uprv_strlen("\x26\x61\x70\x6f\x73\x3b"); + destLen += static_cast<int32_t>(uprv_strlen("\x26\x61\x70\x6f\x73\x3b")); break; /* Disallow C0 controls except TAB, CR, LF*/ @@ -325,18 +325,18 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength case 0x1E: case 0x1F: *status = U_ILLEGAL_CHAR_FOUND; - fprintf(stderr, "Illegal Character \\u%04X!\n",(int)c); + fprintf(stderr, "Illegal Character \\u%04X!\n", static_cast<int>(c)); uprv_free(dest); return nullptr; default: - dest[destLen++]=(char)c; + dest[destLen++] = static_cast<char>(c); } }else{ UBool isError = false; U8_APPEND((unsigned char*)dest,destLen,destCap,c,isError); if(isError){ *status = U_ILLEGAL_CHAR_FOUND; - fprintf(stderr, "Illegal Character \\U%08X!\n",(int)c); + fprintf(stderr, "Illegal Character \\U%08X!\n", static_cast<int>(c)); uprv_free(dest); return nullptr; } @@ -344,7 +344,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength }else{ destCap += destLen; - temp = (char*) uprv_malloc(sizeof(char)*destCap); + temp = static_cast<char*>(uprv_malloc(sizeof(char) * destCap)); if(temp==nullptr){ *status=U_MEMORY_ALLOCATION_ERROR; uprv_free(dest); @@ -406,8 +406,8 @@ print(char16_t* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UE return; } - buf = (char*) (uprv_malloc(bufCapacity)); - if(buf==0){ + buf = static_cast<char*>(uprv_malloc(bufCapacity)); + if (buf == nullptr) { fprintf(stderr, "Could not allocate memory!!"); exit(U_MEMORY_ALLOCATION_ERROR); } @@ -438,7 +438,7 @@ printNoteElements(const UString *src, UErrorCode *status){ } capacity = src->fLength; - note = (char16_t*) uprv_malloc(U_SIZEOF_UCHAR * capacity); + note = static_cast<char16_t*>(uprv_malloc(U_SIZEOF_UCHAR * capacity)); count = getCount(src->fChars,src->fLength, UPC_NOTE, status); if(U_FAILURE(*status)){ @@ -497,8 +497,8 @@ printComments(struct UString *src, const char *resName, UBool printTranslate, UE int32_t capacity = src->fLength + 1; char* buf = nullptr; int32_t bufLen = 0; - char16_t* desc = (char16_t*) uprv_malloc(U_SIZEOF_UCHAR * capacity); - char16_t* trans = (char16_t*) uprv_malloc(U_SIZEOF_UCHAR * capacity); + char16_t* desc = static_cast<char16_t*>(uprv_malloc(U_SIZEOF_UCHAR * capacity)); + char16_t* trans = static_cast<char16_t*>(uprv_malloc(U_SIZEOF_UCHAR * capacity)); int32_t descLen = 0, transLen=0; if(desc==nullptr || trans==nullptr){ @@ -567,18 +567,18 @@ static char *printContainer(SResource *res, const char *container, const char *r write_utf8_file(out, UnicodeString("<")); write_utf8_file(out, UnicodeString(container)); - printAttribute("id", sid, (int32_t) uprv_strlen(sid)); + printAttribute("id", sid, static_cast<int32_t>(uprv_strlen(sid))); if (resname != nullptr) { - printAttribute("resname", resname, (int32_t) uprv_strlen(resname)); + printAttribute("resname", resname, static_cast<int32_t>(uprv_strlen(resname))); } if (mimetype != nullptr) { - printAttribute("mime-type", mimetype, (int32_t) uprv_strlen(mimetype)); + printAttribute("mime-type", mimetype, static_cast<int32_t>(uprv_strlen(mimetype))); } if (restype != nullptr) { - printAttribute("restype", restype, (int32_t) uprv_strlen(restype)); + printAttribute("restype", restype, static_cast<int32_t>(uprv_strlen(restype))); } tabCount += 1; @@ -639,6 +639,8 @@ string_write_xml(StringResource *res, const char* id, const char* /*language*/, buf = convertAndEscape(&buf, 0, &bufLen, res->getBuffer(), res->length(), status); if (U_FAILURE(*status)) { + uprv_free(buf); + uprv_free(sid); return; } @@ -671,6 +673,8 @@ alias_write_xml(AliasResource *res, const char* id, const char* /*language*/, UE buf = convertAndEscape(&buf, 0, &bufLen, res->getBuffer(), res->length(), status); if(U_FAILURE(*status)){ + uprv_free(buf); + uprv_free(sid); return; } write_utf8_file(out, UnicodeString(buf, bufLen, "UTF-8")); @@ -711,6 +715,7 @@ array_write_xml(ArrayResource *res, const char* id, const char* language, UError subId = nullptr; if(U_FAILURE(*status)){ + uprv_free(sid); return; } @@ -745,8 +750,8 @@ intvector_write_xml(IntVectorResource *res, const char* id, const char* /*langua write_utf8_file(out, UnicodeString("<")); write_utf8_file(out, UnicodeString(trans_unit)); - printAttribute("id", ivd, (int32_t)uprv_strlen(ivd)); - printAttribute("restype", integer_restype, (int32_t) strlen(integer_restype)); + printAttribute("id", ivd, static_cast<int32_t>(uprv_strlen(ivd))); + printAttribute("restype", integer_restype, static_cast<int32_t>(strlen(integer_restype))); write_utf8_file(out, UnicodeString(">\n")); @@ -808,10 +813,10 @@ bin_write_xml(BinaryResource *res, const char* id, const char* /*language*/, UEr uint32_t crc = 0xFFFFFFFF; char fileName[1024] ={0}; - int32_t tLen = ( outDir == nullptr) ? 0 :(int32_t)uprv_strlen(outDir); - char* fn = (char*) uprv_malloc(sizeof(char) * (tLen+1024 + + int32_t tLen = outDir == nullptr ? 0 : static_cast<int32_t>(uprv_strlen(outDir)); + char* fn = static_cast<char*>(uprv_malloc(sizeof(char) * (tLen + 1024 + (res->fFileName !=nullptr ? - uprv_strlen(res->fFileName) :0))); + uprv_strlen(res->fFileName) :0)))); const char* ext = nullptr; char* f = nullptr; @@ -855,7 +860,7 @@ bin_write_xml(BinaryResource *res, const char* id, const char* /*language*/, UEr write_tabs(out); write_utf8_file(out, UnicodeString(external_file)); - printAttribute("href", f, (int32_t)uprv_strlen(f)); + printAttribute("href", f, static_cast<int32_t>(uprv_strlen(f))); write_utf8_file(out, UnicodeString("/>\n")); tabCount -= 1; write_tabs(out); @@ -880,7 +885,7 @@ bin_write_xml(BinaryResource *res, const char* id, const char* /*language*/, UEr write_tabs(out); write_utf8_file(out, UnicodeString(internal_file)); - printAttribute("form", application_mimetype, (int32_t) uprv_strlen(application_mimetype)); + printAttribute("form", application_mimetype, static_cast<int32_t>(uprv_strlen(application_mimetype))); while(i <res->fLength){ len = itostr(temp, res->fData[i], 16, 2); @@ -943,6 +948,7 @@ table_write_xml(TableResource *res, const char* id, const char* language, UBool res_write_xml(current, sid, language, false, status); if(U_FAILURE(*status)){ + uprv_free(sid); return; } @@ -1038,12 +1044,12 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu pos = uprv_strrchr(filename, '\\'); if(pos != nullptr) { - first = (int32_t)(pos - filename + 1); + first = static_cast<int32_t>(pos - filename + 1); } else { first = 0; } - index = (int32_t)(uprv_strlen(filename) - uprv_strlen(textExt) - first); - originalFileName = (char *)uprv_malloc(sizeof(char)*index+1); + index = static_cast<int32_t>(uprv_strlen(filename) - uprv_strlen(textExt) - first); + originalFileName = static_cast<char*>(uprv_malloc(sizeof(char) * index + 1)); uprv_memset(originalFileName, 0, sizeof(char)*index+1); uprv_strncpy(originalFileName, filename + first, index); @@ -1052,7 +1058,7 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu } temp = originalFileName; - originalFileName = (char *)uprv_malloc(sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1); + originalFileName = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(temp) + uprv_strlen(textExt)) + 1)); uprv_memset(originalFileName, 0, sizeof(char)* (uprv_strlen(temp)+uprv_strlen(textExt)) + 1); uprv_strcat(originalFileName, temp); uprv_strcat(originalFileName, textExt); @@ -1088,26 +1094,26 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu } /* }*/ } else { - lang = (char *)uprv_malloc(sizeof(char)*uprv_strlen(language) +1); + lang = static_cast<char*>(uprv_malloc(sizeof(char) * uprv_strlen(language) + 1)); uprv_memset(lang, 0, sizeof(char)*uprv_strlen(language) +1); uprv_strcpy(lang, language); } if(outFileName) { - outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(outFileName) + 1); + outputFileName = static_cast<char*>(uprv_malloc(sizeof(char) * uprv_strlen(outFileName) + 1)); uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(outFileName) + 1); uprv_strcpy(outputFileName,outFileName); } else { - outputFileName = (char *)uprv_malloc(sizeof(char)*uprv_strlen(srBundle->fLocale) + 1); + outputFileName = static_cast<char*>(uprv_malloc(sizeof(char) * uprv_strlen(srBundle->fLocale) + 1)); uprv_memset(outputFileName, 0, sizeof(char)*uprv_strlen(srBundle->fLocale) + 1); uprv_strcpy(outputFileName,srBundle->fLocale); } if(outputDir) { - xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputDir) + uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1); + xmlfileName = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(outputDir) + uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) + 1)); uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputDir)+ uprv_strlen(outputFileName) + uprv_strlen(xliffExt) + 1) +1); } else { - xmlfileName = (char *)uprv_malloc(sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1); + xmlfileName = static_cast<char*>(uprv_malloc(sizeof(char) * (uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) + 1)); uprv_memset(xmlfileName, 0, sizeof(char)*(uprv_strlen(outputFileName) + uprv_strlen(xliffExt)) +1); } @@ -1170,8 +1176,8 @@ bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outpu write_tabs(out); write_utf8_file(out, UnicodeString(tool_start)); - printAttribute("tool-id", tool_id, (int32_t) uprv_strlen(tool_id)); - printAttribute("tool-name", tool_name, (int32_t) uprv_strlen(tool_name)); + printAttribute("tool-id", tool_id, static_cast<int32_t>(uprv_strlen(tool_id))); + printAttribute("tool-name", tool_name, static_cast<int32_t>(uprv_strlen(tool_name))); write_utf8_file(out, UnicodeString("/>\n")); tabCount -= 1; diff --git a/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp b/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp index 4aea2c1e285ac8..954db1d36720f9 100644 --- a/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp +++ b/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp @@ -26,6 +26,7 @@ #include "unicode/ucharstriebuilder.h" #include "ucase.h" #include "unicode/normalizer2.h" +#include "uprops.h" #include "normalizer2impl.h" #include "writesrc.h" @@ -46,73 +47,9 @@ int16_t DATAEXPORT_SCRIPT_X_WITH_COMMON = 0x0400; int16_t DATAEXPORT_SCRIPT_X_WITH_INHERITED = 0x0800; int16_t DATAEXPORT_SCRIPT_X_WITH_OTHER = 0x0c00; -// TODO(ICU-21821): Replace this with a call to a library function -int32_t scxCodePoints[] = { - 7415, 7377, 7380, 7387, 7390, 7391, 7394, 7395, 7396, 7397, - 7398, 7399, 7400, 7403, 7404, 7406, 7407, 7408, 7409, 113824, - 113825, 113826, 113827, 834, 837, 7616, 7617, 12294, 12350, 12351, - 12688, 12689, 12690, 12691, 12692, 12693, 12694, 12695, 12696, 12697, - 12698, 12699, 12700, 12701, 12702, 12703, 12736, 12737, 12738, 12739, - 12740, 12741, 12742, 12743, 12744, 12745, 12746, 12747, 12748, 12749, - 12750, 12751, 12752, 12753, 12754, 12755, 12756, 12757, 12758, 12759, - 12760, 12761, 12762, 12763, 12764, 12765, 12766, 12767, 12768, 12769, - 12770, 12771, 12832, 12833, 12834, 12835, 12836, 12837, 12838, 12839, - 12840, 12841, 12842, 12843, 12844, 12845, 12846, 12847, 12848, 12849, - 12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12858, 12859, - 12860, 12861, 12862, 12863, 12864, 12865, 12866, 12867, 12868, 12869, - 12870, 12871, 12928, 12929, 12930, 12931, 12932, 12933, 12934, 12935, - 12936, 12937, 12938, 12939, 12940, 12941, 12942, 12943, 12944, 12945, - 12946, 12947, 12948, 12949, 12950, 12951, 12952, 12953, 12954, 12955, - 12956, 12957, 12958, 12959, 12960, 12961, 12962, 12963, 12964, 12965, - 12966, 12967, 12968, 12969, 12970, 12971, 12972, 12973, 12974, 12975, - 12976, 12992, 12993, 12994, 12995, 12996, 12997, 12998, 12999, 13000, - 13001, 13002, 13003, 13055, 13144, 13145, 13146, 13147, 13148, 13149, - 13150, 13151, 13152, 13153, 13154, 13155, 13156, 13157, 13158, 13159, - 13160, 13161, 13162, 13163, 13164, 13165, 13166, 13167, 13168, 13179, - 13180, 13181, 13182, 13183, 13280, 13281, 13282, 13283, 13284, 13285, - 13286, 13287, 13288, 13289, 13290, 13291, 13292, 13293, 13294, 13295, - 13296, 13297, 13298, 13299, 13300, 13301, 13302, 13303, 13304, 13305, - 13306, 13307, 13308, 13309, 13310, 119648, 119649, 119650, 119651, 119652, - 119653, 119654, 119655, 119656, 119657, 119658, 119659, 119660, 119661, 119662, - 119663, 119664, 119665, 127568, 127569, 867, 868, 869, 870, 871, - 872, 873, 874, 875, 876, 877, 878, 879, 7418, 7674, - 66272, 66273, 66274, 66275, 66276, 66277, 66278, 66279, 66280, 66281, - 66282, 66283, 66284, 66285, 66286, 66287, 66288, 66289, 66290, 66291, - 66292, 66293, 66294, 66295, 66296, 66297, 66298, 66299, 1748, 64830, - 64831, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, - 1620, 1621, 1648, 65010, 65021, 7381, 7382, 7384, 7393, 7402, - 7405, 7413, 7414, 43249, 12330, 12331, 12332, 12333, 43471, 65794, - 65847, 65848, 65849, 65850, 65851, 65852, 65853, 65854, 65855, 1156, - 1159, 11843, 42607, 1157, 1158, 1155, 7672, 7379, 7411, 7416, - 7417, 7401, 7383, 7385, 7388, 7389, 7392, 43251, 4347, 3046, - 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, - 3057, 3058, 3059, 70401, 70403, 70459, 70460, 73680, 73681, 73683, - 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, - 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, - 42752, 42753, 42754, 42755, 42756, 42757, 42758, 42759, 12337, 12338, - 12339, 12340, 12341, 12441, 12442, 12443, 12444, 12448, 12540, 65392, - 65438, 65439, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, - 3310, 3311, 8239, 68338, 6146, 6147, 6149, 1564, 1632, 1633, - 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 2534, 2535, - 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 4160, 4161, - 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 65792, 65793, - 65799, 65800, 65801, 65802, 65803, 65804, 65805, 65806, 65807, 65808, - 65809, 65810, 65811, 65812, 65813, 65814, 65815, 65816, 65817, 65818, - 65819, 65820, 65821, 65822, 65823, 65824, 65825, 65826, 65827, 65828, - 65829, 65830, 65831, 65832, 65833, 65834, 65835, 65836, 65837, 65838, - 65839, 65840, 65841, 65842, 65843, 7412, 8432, 12348, 12349, 43310, - 7376, 7378, 5941, 5942, 2406, 2407, 2408, 2409, 2410, 2411, - 2412, 2413, 2414, 2415, 12291, 12307, 12316, 12317, 12318, 12319, - 12336, 12343, 65093, 65094, 1548, 1563, 12289, 12290, 12296, 12297, - 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12308, 12309, - 12310, 12311, 12312, 12313, 12314, 12315, 12539, 65377, 65378, 65379, - 65380, 65381, 7386, 1567, 7410, 1600, 43062, 43063, 43064, 43065, - 2386, 2385, 43059, 43060, 43061, 43056, 43057, 43058, 2404, 2405 - }; - -void handleError(ErrorCode& status, const char* context) { +void handleError(ErrorCode& status, int line, const char* context) { if (status.isFailure()) { - std::cerr << "Error: " << context << ": " << status.errorName() << std::endl; + std::cerr << "Error[" << line << "]: " << context << ": " << status.errorName() << std::endl; exit(status.reset()); } } @@ -138,7 +75,7 @@ void dumpPropertyAliases(UProperty uproperty, FILE* f) { while(true) { // The API works by having extra names after U_LONG_PROPERTY_NAME, sequentially, // and returning null after that - const char* alias = u_getPropertyName(uproperty, (UPropertyNameChoice) i); + const char* alias = u_getPropertyName(uproperty, static_cast<UPropertyNameChoice>(i)); if (!alias) { break; } @@ -159,7 +96,7 @@ void dumpBinaryProperty(UProperty uproperty, FILE* f) { const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); const USet* uset = u_getBinaryPropertySet(uproperty, status); - handleError(status, fullPropName); + handleError(status, __LINE__, fullPropName); fputs("[[binary_property]]\n", f); fprintf(f, "long_name = \"%s\"\n", fullPropName); @@ -190,7 +127,7 @@ void dumpValueEntry(UProperty uproperty, int v, bool is_mask, FILE* f) { while(true) { // The API works by having extra names after U_LONG_PROPERTY_NAME, sequentially, // and returning null after that - const char* alias = u_getPropertyValueName(uproperty, v, (UPropertyNameChoice) i); + const char* alias = u_getPropertyValueName(uproperty, v, static_cast<UPropertyNameChoice>(i)); if (!alias) { break; } @@ -212,7 +149,7 @@ void dumpEnumeratedProperty(UProperty uproperty, FILE* f) { const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); const UCPMap* umap = u_getIntPropertyMap(uproperty, status); - handleError(status, fullPropName); + handleError(status, __LINE__, fullPropName); fputs("[[enum_property]]\n", f); fprintf(f, "long_name = \"%s\"\n", fullPropName); @@ -248,7 +185,7 @@ void dumpEnumeratedProperty(UProperty uproperty, FILE* f) { trieType, width, status)); - handleError(status, fullPropName); + handleError(status, __LINE__, fullPropName); fputs("[enum_property.code_point_trie]\n", f); usrc_writeUCPTrie(f, shortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); @@ -265,7 +202,7 @@ void dumpBidiMirroringGlyph(FILE* f) { IcuToolErrorCode status("icuexportdata: dumpBidiMirroringGlyph"); const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); - handleError(status, fullPropName); + handleError(status, __LINE__, fullPropName); // Store 21-bit code point as is UCPTrieValueWidth width = UCPTRIE_VALUE_BITS_32; @@ -290,7 +227,7 @@ void dumpBidiMirroringGlyph(FILE* f) { trieType, width, status)); - handleError(status, fullPropName); + handleError(status, __LINE__, fullPropName); // currently a trie and inversion map are the same (as relied upon in characterproperties.cpp) const UCPMap* umap = reinterpret_cast<UCPMap *>(utrie.getAlias()); @@ -331,13 +268,13 @@ void dumpGeneralCategoryMask(FILE* f) { fprintf(f, "mask_for = \"General_Category\"\n"); - uint32_t minValue = u_getIntPropertyMinValue(UCHAR_GENERAL_CATEGORY); + int32_t minValue = u_getIntPropertyMinValue(UCHAR_GENERAL_CATEGORY); U_ASSERT(minValue >= 0); - uint32_t maxValue = u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY); + int32_t maxValue = u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY); U_ASSERT(maxValue >= 0); fprintf(f, "values = [\n"); - for (uint32_t v = minValue; v <= maxValue; v++) { + for (int32_t v = minValue; v <= maxValue; v++) { dumpValueEntry(uproperty, U_MASK(v), true, f); // We want to dump these masks "in order", which means they @@ -354,6 +291,34 @@ void dumpGeneralCategoryMask(FILE* f) { fprintf(f, "]\n"); } +namespace { + +void U_CALLCONV +set_add(USet *set, UChar32 c) { + UnicodeSet::fromUSet(set)->add(c); +} + +void U_CALLCONV +set_addRange(USet *set, UChar32 start, UChar32 end) { + UnicodeSet::fromUSet(set)->add(start, end); +} + +} + +UnicodeSet getScriptExtensionsCodePoints(IcuToolErrorCode &errorCode) { + UnicodeSet scxCPs; + USetAdder sa = { + scxCPs.toUSet(), + set_add, + set_addRange, + nullptr, // don't need addString, + nullptr, // don't need remove() + nullptr // don't need removeRange() + }; + uprv_addScriptExtensionsCodePoints(&sa, errorCode); + return scxCPs; +} + void dumpScriptExtensions(FILE* f) { IcuToolErrorCode status("icuexportdata: dumpScriptExtensions"); @@ -372,9 +337,9 @@ void dumpScriptExtensions(FILE* f) { // Create a mutable UCPTrie builder populated with Script property values data. const UCPMap* scInvMap = u_getIntPropertyMap(UCHAR_SCRIPT, status); - handleError(status, scxFullPropName); + handleError(status, __LINE__, scxFullPropName); LocalUMutableCPTriePointer builder(umutablecptrie_fromUCPMap(scInvMap, status)); - handleError(status, scxFullPropName); + handleError(status, __LINE__, scxFullPropName); // The values for the output scx companion array. // Invariant is that all subvectors are distinct. @@ -382,14 +347,15 @@ void dumpScriptExtensions(FILE* f) { // The sc/scx companion array is an array of arrays (of script codes) fputs("script_code_array = [\n", f); - for(const UChar32 cp : scxCodePoints) { + UnicodeSet scxCodePoints = getScriptExtensionsCodePoints(status); + for(const UChar32 cp : scxCodePoints.codePoints()) { // Get the Script value uint32_t scVal = umutablecptrie_get(builder.getAlias(), cp); // Get the Script_Extensions value (array of Script codes) const int32_t SCX_ARRAY_CAPACITY = 32; UScriptCode scxValArray[SCX_ARRAY_CAPACITY]; int32_t numScripts = uscript_getScriptExtensions(cp, scxValArray, SCX_ARRAY_CAPACITY, status); - handleError(status, scxFullPropName); + handleError(status, __LINE__, scxFullPropName); // Convert the scx array into a vector std::vector<uint16_t> scxValVec; @@ -444,7 +410,7 @@ void dumpScriptExtensions(FILE* f) { // Update the code point in the mutable trie builder with the trie value umutablecptrie_set(builder.getAlias(), cp, newScVal, status); - handleError(status, scxFullPropName); + handleError(status, __LINE__, scxFullPropName); } fputs("]\n\n", f); // Print the TOML close delimiter for the outer array. @@ -454,7 +420,7 @@ void dumpScriptExtensions(FILE* f) { trieType, scWidth, status)); - handleError(status, scxFullPropName); + handleError(status, __LINE__, scxFullPropName); fputs("[script_extensions.code_point_trie]\n", f); usrc_writeUCPTrie(f, scxShortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); @@ -468,7 +434,7 @@ FILE* prepareOutputFile(const char* basename) { } outFileName.append(basename, status); outFileName.append(".toml", status); - handleError(status, basename); + handleError(status, __LINE__, basename); FILE* f = fopen(outFileName.data(), "w"); if (f == nullptr) { @@ -489,12 +455,29 @@ FILE* prepareOutputFile(const char* basename) { #if !UCONFIG_NO_NORMALIZATION -struct PendingDescriptor { +class PendingDescriptor { +public: UChar32 scalar; - uint32_t descriptor; + uint32_t descriptorOrFlags; + // If false, we use the above fields only. If true, descriptor only + // contains the two highest-bit flags and the rest is computed later + // from the fields below. + UBool complex; UBool supplementary; + UBool onlyNonStartersInTrail; + uint32_t len; + uint32_t offset; + + PendingDescriptor(UChar32 scalar, uint32_t descriptor); + PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset); }; +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t descriptor) + : scalar(scalar), descriptorOrFlags(descriptor), complex(false), supplementary(false), onlyNonStartersInTrail(false), len(0), offset(0) {} + +PendingDescriptor::PendingDescriptor(UChar32 scalar, uint32_t flags, UBool supplementary, UBool onlyNonStartersInTrail, uint32_t len, uint32_t offset) + : scalar(scalar), descriptorOrFlags(flags), complex(true), supplementary(supplementary), onlyNonStartersInTrail(onlyNonStartersInTrail), len(len), offset(offset) {} + void writeCanonicalCompositions(USet* backwardCombiningStarters) { IcuToolErrorCode status("icuexportdata: computeCanonicalCompositions"); const char* basename = "compositions"; @@ -527,7 +510,7 @@ void writeCanonicalCompositions(USet* backwardCombiningStarters) { } if (c != composite) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } if (!u_getCombiningClass(second)) { uset_add(backwardCombiningStarters, second); @@ -540,14 +523,14 @@ void writeCanonicalCompositions(USet* backwardCombiningStarters) { UnicodeString backward; backward.append(second); backward.append(starter); - backwardBuilder->add(backward, int32_t(composite), status); + backwardBuilder->add(backward, static_cast<int32_t>(composite), status); } UnicodeString canonicalCompositionTrie; backwardBuilder->buildUnicodeString(USTRINGTRIE_BUILD_SMALL, canonicalCompositionTrie, status); usrc_writeArray(f, "compositions = [\n ", canonicalCompositionTrie.getBuffer(), 16, canonicalCompositionTrie.length(), " ", "\n]\n"); fclose(f); - handleError(status, basename); + handleError(status, __LINE__, basename); } void writeDecompositionTables(const char* basename, const uint16_t* ptr16, size_t len16, const uint32_t* ptr32, size_t len32) { @@ -557,21 +540,18 @@ void writeDecompositionTables(const char* basename, const uint16_t* ptr16, size_ fclose(f); } -void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector<PendingDescriptor>& pendingTrieInsertions, char16_t passthroughCap) { - IcuToolErrorCode status("icuexportdata: writeDecompositionData"); - FILE* f = prepareOutputFile(basename); - - // Zero is a magic number that means the character decomposes to itself. - LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - +void pendingInsertionsToTrie(const char* basename, UMutableCPTrie* trie, const std::vector<PendingDescriptor>& pendingTrieInsertions, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16) { + IcuToolErrorCode status("icuexportdata: pendingInsertionsToTrie"); // Iterate backwards to insert lower code points in the trie first in case it matters // for trie block allocation. for (int32_t i = pendingTrieInsertions.size() - 1; i >= 0; --i) { const PendingDescriptor& pending = pendingTrieInsertions[i]; - uint32_t additional = 0; - if (!(pending.descriptor & 0xFFFE0000)) { - uint32_t offset = pending.descriptor & 0xFFF; + if (pending.complex) { + uint32_t additional = 0; + uint32_t offset = pending.offset; + uint32_t len = pending.len; if (!pending.supplementary) { + len -= 2; if (offset >= baseSize16) { // This is a offset to supplementary 16-bit data. We have // 16-bit base data and 32-bit base data before. However, @@ -579,6 +559,7 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize32; } } else { + len -= 1; if (offset >= baseSize32) { // This is an offset to supplementary 32-bit data. We have 16-bit // base data, 32-bit base data, and 16-bit supplementary data before. @@ -591,34 +572,69 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t additional = baseSize16; } } + // +1 to make offset always non-zero + offset += 1; if (offset + additional > 0xFFF) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); + } + if (len > 7) { + status.set(U_INTERNAL_PROGRAM_ERROR); + handleError(status, __LINE__, basename); } + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags | (uint32_t(pending.onlyNonStartersInTrail) << 4) | len | (offset + additional) << 16, status); + } else { + umutablecptrie_set(trie, pending.scalar, pending.descriptorOrFlags, status); } - // It turns out it's better to swap the halves compared to the initial - // idea in order to put special marker values close to zero so that - // an important marker value becomes 1, so it's efficient to compare - // "1 or 0". Unfortunately, going through all the code to swap - // things is too error prone, so let's do the swapping here in one - // place. - uint32_t oldTrieValue = pending.descriptor + additional; - uint32_t swappedTrieValue = (oldTrieValue >> 16) | (oldTrieValue << 16); - umutablecptrie_set(builder.getAlias(), pending.scalar, swappedTrieValue, status); } +} + +/// Marker that the decomposition does not round trip via NFC. +const uint32_t NON_ROUND_TRIP_MASK = (1 << 30); + +/// Marker that the first character of the decomposition can combine +/// backwards. +const uint32_t BACKWARD_COMBINING_MASK = (1 << 31); + +void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t baseSize32, uint32_t supplementSize16, USet* uset, USet* reference, const std::vector<PendingDescriptor>& pendingTrieInsertions, const std::vector<PendingDescriptor>& nfdPendingTrieInsertions, char16_t passthroughCap) { + IcuToolErrorCode status("icuexportdata: writeDecompositionData"); + FILE* f = prepareOutputFile(basename); + + // Zero is a magic number that means the character decomposes to itself. + LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); + + if (uprv_strcmp(basename, "uts46d") != 0) { + // Make surrogates decompose to U+FFFD. Don't do this for UTS 46, since this + // optimization is only used by the UTF-16 slice mode, and UTS 46 is not + // supported in slice modes (which do not support ignorables). + // Mark these as potentially backward-combining, to make lead surrogates + // for non-BMP characters that are backward-combining count as + // backward-combining just in case, though the backward-combiningness + // is not actually being looked at today. + umutablecptrie_setRange(builder.getAlias(), 0xD800, 0xDFFF, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xFFFD, status); + } + + // Add a marker value for Hangul syllables + umutablecptrie_setRange(builder.getAlias(), 0xAC00, 0xD7A3, 1, status); + + // First put the NFD data in the trie, to be partially overwritten in the NFKD and UTS 46 cases. + // This is easier that changing the logic that computes the pending insertions. + pendingInsertionsToTrie(basename, builder.getAlias(), nfdPendingTrieInsertions, baseSize16, baseSize32, supplementSize16); + pendingInsertionsToTrie(basename, builder.getAlias(), pendingTrieInsertions, baseSize16, baseSize32, supplementSize16); LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( builder.getAlias(), trieType, UCPTRIE_VALUE_BITS_32, status)); - handleError(status, basename); + handleError(status, __LINE__, basename); + // The ICU4X side has changed enough this whole block of expectation checking might be more appropriate to remove. if (reference) { if (uset_contains(reference, 0xFF9E) || uset_contains(reference, 0xFF9F) || !uset_contains(reference, 0x0345)) { // NFD expectations don't hold. The set must not contain the half-width // kana voicing marks and must contain iota subscript. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } USet* halfWidthVoicing = uset_openEmpty(); @@ -628,18 +644,14 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t USet* iotaSubscript = uset_openEmpty(); uset_add(iotaSubscript, 0x0345); - uint8_t flags = 0; - USet* halfWidthCheck = uset_cloneAsThawed(uset); uset_removeAll(halfWidthCheck, reference); - if (uset_equals(halfWidthCheck, halfWidthVoicing)) { - flags |= 1; - } else if (!uset_isEmpty(halfWidthCheck)) { + if (!uset_equals(halfWidthCheck, halfWidthVoicing) && !uset_isEmpty(halfWidthCheck)) { // The result was neither empty nor contained exactly // the two half-width voicing marks. The ICU4X // normalizer doesn't know how to deal with this case. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } uset_close(halfWidthCheck); @@ -650,66 +662,19 @@ void writeDecompositionData(const char* basename, uint32_t baseSize16, uint32_t // the iota subscript. The ICU4X normalizer doesn't // know how to deal with this case. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } uset_close(iotaSubscript); uset_close(halfWidthVoicing); - - fprintf(f, "flags = 0x%X\n", flags); - fprintf(f, "cap = 0x%X\n", passthroughCap); } + fprintf(f, "cap = 0x%X\n", passthroughCap); fprintf(f, "[trie]\n"); usrc_writeUCPTrie(f, "trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); fclose(f); - handleError(status, basename); -} - -// Special marker for the NFKD form of U+FDFA -const int32_t FDFA_MARKER = 3; - -// Special marker for characters whose decomposition starts with a non-starter -// and the decomposition isn't the character itself. -const int32_t SPECIAL_NON_STARTER_DECOMPOSITION_MARKER = 2; - -// Special marker for starters that decompose to themselves but that may -// combine backwards under canonical composition -const int32_t BACKWARD_COMBINING_STARTER_MARKER = 1; - -/// Marker that a complex decomposition isn't round-trippable -/// under re-composition. -const uint32_t NON_ROUND_TRIP_MARKER = 1; - -UBool permissibleBmpPair(UBool knownToRoundTrip, UChar32 c, UChar32 second) { - if (knownToRoundTrip) { - return true; - } - // Nuktas, Hebrew presentation forms and polytonic Greek with oxia - // are special-cased in ICU4X. - if (c >= 0xFB1D && c <= 0xFB4E) { - // Hebrew presentation forms - return true; - } - if (c >= 0x1F71 && c <= 0x1FFB) { - // Polytonic Greek with oxia - return true; - } - if ((second & 0x7F) == 0x3C && second >= 0x0900 && second <= 0x0BFF) { - // Nukta - return true; - } - // To avoid more branchiness, 4 characters that decompose to - // a BMP starter followed by a BMP non-starter are excluded - // from being encoded directly into the trie value and are - // handled as complex decompositions instead. These are: - // U+0F76 TIBETAN VOWEL SIGN VOCALIC R - // U+0F78 TIBETAN VOWEL SIGN VOCALIC L - // U+212B ANGSTROM SIGN - // U+2ADC FORKING - return false; + handleError(status, __LINE__, basename); } - // Find the slice `needle` within `storage` and return its index, failing which, // append all elements of `needle` to `storage` and return the index of it at the end. template<typename T> @@ -722,7 +687,7 @@ size_t findOrAppend(std::vector<T>& storage, const UChar32* needle, size_t needl if (j == needleLen) { return i; // found a match } - if (storage[i + j] != uint32_t(needle[j])) { + if (storage[i + j] != static_cast<uint32_t>(needle[j])) { break; } } @@ -730,7 +695,7 @@ size_t findOrAppend(std::vector<T>& storage, const UChar32* needle, size_t needl // We didn't find anything. Append, keeping the append index in mind. size_t index = storage.size(); for(size_t i = 0; i < needleLen; i++) { - storage.push_back(T(needle[i])); + storage.push_back(static_cast<T>(needle[i])); } return index; @@ -738,6 +703,8 @@ size_t findOrAppend(std::vector<T>& storage, const UChar32* needle, size_t needl // Computes data for canonical decompositions +// See components/normalizer/trie-value-format.md in the ICU4X repo +// for documentation of the trie value format. void computeDecompositions(const char* basename, const USet* backwardCombiningStarters, std::vector<uint16_t>& storage16, @@ -755,9 +722,12 @@ void computeDecompositions(const char* basename, std::vector<uint32_t> nonRecursive32; LocalUMutableCPTriePointer nonRecursiveBuilder(umutablecptrie_open(0, 0, status)); + UBool uts46 = false; + if (uprv_strcmp(basename, "nfkd") == 0) { mainNormalizer = Normalizer2::getNFKDInstance(status); } else if (uprv_strcmp(basename, "uts46d") == 0) { + uts46 = true; mainNormalizer = Normalizer2::getInstance(nullptr, "uts46", UNORM2_COMPOSE, status); } else { mainNormalizer = nfdNormalizer; @@ -800,12 +770,23 @@ void computeDecompositions(const char* basename, // Surrogate continue; } + if (c == 0xFFFD) { + // REPLACEMENT CHARACTER + // This character is a starter that decomposes to self, + // so without a special case here it would end up as + // passthrough-eligible in all normalizations forms. + // However, in the potentially-ill-formed UTF-8 case + // UTF-8 errors return U+FFFD from the iterator, and + // errors need to be treated as ineligible for + // passthrough on the slice fast path. By giving + // U+FFFD a trie value whose flags make it ineligible + // for passthrough avoids a specific U+FFFD branch on + // the passthrough fast path. + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK}); + continue; + } UnicodeString src; UnicodeString dst; - // True if we're building non-NFD or we're building NFD but - // the `c` round trips to NFC. - // False if we're building NFD and `c` does not round trip to NFC. - UBool nonNfdOrRoundTrips = true; src.append(c); if (mainNormalizer != nfdNormalizer) { UnicodeString inter; @@ -813,34 +794,23 @@ void computeDecompositions(const char* basename, nfdNormalizer->normalize(inter, dst, status); } else { nfdNormalizer->normalize(src, dst, status); - UnicodeString nfc; - nfcNormalizer->normalize(dst, nfc, status); - nonNfdOrRoundTrips = (src == nfc); } + + UnicodeString nfc; + nfcNormalizer->normalize(dst, nfc, status); + UBool roundTripsViaCanonicalComposition = (src == nfc); + int32_t len = dst.toUTF32(utf32, DECOMPOSITION_BUFFER_SIZE, status); + if (!len || (len == 1 && utf32[0] == 0xFFFD && c != 0xFFFD)) { - // Characters that normalize to nothing or to U+FFFD (without the - // input being U+FFFD) in ICU4C's UTS 46 normalization normalize - // as in NFD in ICU4X's UTF 46 normalization in the interest - // of data size and ICU4X's normalizer being unable to handle - // normalizing to nothing. - // When UTS 46 is implemented on top of ICU4X, a preprocessing - // step is supposed to remove these characters before the - // normalization step. - if (uprv_strcmp(basename, "uts46d") != 0) { + if (!uts46) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - nfdNormalizer->normalize(src, dst, status); - len = dst.toUTF32(utf32, DECOMPOSITION_BUFFER_SIZE, status); - if (!len || (len == 1 && utf32[0] == 0xFFFD && c != 0xFFFD)) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } } if (len > DECOMPOSITION_BUFFER_SIZE) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } uint8_t firstCombiningClass = u_getCombiningClass(utf32[0]); bool specialNonStarterDecomposition = false; @@ -850,12 +820,12 @@ void computeDecompositions(const char* basename, compositionPassthroughBound = c; uset_add(decompositionStartsWithNonStarter, c); if (src != dst) { - if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || c == 0xFF9E || c == 0xFF9F) { + if (c == 0x0340 || c == 0x0341 || c == 0x0343 || c == 0x0344 || c == 0x0F73 || c == 0x0F75 || c == 0x0F81 || (c == 0xFF9E && utf32[0] == 0x3099) || (c == 0xFF9F && utf32[0] == 0x309A)) { specialNonStarterDecomposition = true; } else { // A character whose decomposition starts with a non-starter and isn't the same as the character itself and isn't already hard-coded into ICU4X. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } } } else if (uset_contains(backwardCombiningStarters, utf32[0])) { @@ -863,18 +833,6 @@ void computeDecompositions(const char* basename, startsWithBackwardCombiningStarter = true; uset_add(decompositionStartsWithBackwardCombiningStarter, c); } - if (c != BACKWARD_COMBINING_STARTER_MARKER && len == 1 && utf32[0] == BACKWARD_COMBINING_STARTER_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - if (c != SPECIAL_NON_STARTER_DECOMPOSITION_MARKER && len == 1 && utf32[0] == SPECIAL_NON_STARTER_DECOMPOSITION_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - if (c != FDFA_MARKER && len == 1 && utf32[0] == FDFA_MARKER) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } if (mainNormalizer != nfdNormalizer) { UnicodeString nfd; nfdNormalizer->normalize(src, nfd, status); @@ -883,30 +841,35 @@ void computeDecompositions(const char* basename, } decompositionPassthroughBound = c; compositionPassthroughBound = c; - } else if (firstCombiningClass) { + } + if (firstCombiningClass) { len = 1; if (specialNonStarterDecomposition) { - utf32[0] = SPECIAL_NON_STARTER_DECOMPOSITION_MARKER; // magic value + // Special marker + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | BACKWARD_COMBINING_MASK | 0xD900 | u_getCombiningClass(c)}); } else { // Use the surrogate range to store the canonical combining class - utf32[0] = 0xD800 | UChar32(firstCombiningClass); + // XXX: Should non-started that decompose to self be marked as non-round-trippable in + // case such semantics turn out to be more useful for `NON_ROUND_TRIP_MASK`? + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK | 0xD800 | static_cast<uint32_t>(firstCombiningClass)}); } + continue; } else { if (src == dst) { if (startsWithBackwardCombiningStarter) { - pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_STARTER_MARKER << 16, false}); + pendingTrieInsertions.push_back({c, BACKWARD_COMBINING_MASK}); } continue; } decompositionPassthroughBound = c; // ICU4X hard-codes ANGSTROM SIGN - if (c != 0x212B) { + if (c != 0x212B && mainNormalizer == nfdNormalizer) { UnicodeString raw; if (!nfdNormalizer->getRawDecomposition(c, raw)) { // We're always supposed to have a non-recursive decomposition // if we had a recursive one. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } // In addition to actual difference, put the whole range that contains characters // with oxia into the non-recursive trie in order to catch cases where characters @@ -917,79 +880,75 @@ void computeDecompositions(const char* basename, int32_t rawLen = raw.toUTF32(rawUtf32, RAW_DECOMPOSITION_BUFFER_SIZE, status); if (!rawLen) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } if (rawLen == 1) { if (c >= 0xFFFF) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } - umutablecptrie_set(nonRecursiveBuilder.getAlias(), c, uint32_t(rawUtf32[0]), status); + umutablecptrie_set(nonRecursiveBuilder.getAlias(), c, static_cast<uint32_t>(rawUtf32[0]), status); } else if (rawUtf32[0] <= 0xFFFF && rawUtf32[1] <= 0xFFFF) { if (!rawUtf32[0] || !rawUtf32[1]) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } // Swapped for consistency with the primary trie - uint32_t bmpPair = uint32_t(rawUtf32[1]) << 16 | uint32_t(rawUtf32[0]); + uint32_t bmpPair = static_cast<uint32_t>(rawUtf32[1]) << 16 | static_cast<uint32_t>(rawUtf32[0]); umutablecptrie_set(nonRecursiveBuilder.getAlias(), c, bmpPair, status); } else { // Let's add 1 to index to make it always non-zero to distinguish // it from the default zero. uint32_t index = nonRecursive32.size() + 1; - nonRecursive32.push_back(uint32_t(rawUtf32[0])); - nonRecursive32.push_back(uint32_t(rawUtf32[1])); + nonRecursive32.push_back(static_cast<uint32_t>(rawUtf32[0])); + nonRecursive32.push_back(static_cast<uint32_t>(rawUtf32[1])); if (index > 0xFFFF) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } umutablecptrie_set(nonRecursiveBuilder.getAlias(), c, index << 16, status); } } } } - if (!nonNfdOrRoundTrips) { + if (!roundTripsViaCanonicalComposition) { compositionPassthroughBound = c; } - if (len == 1 && utf32[0] <= 0xFFFF) { - if (startsWithBackwardCombiningStarter) { - if (mainNormalizer == nfdNormalizer) { - // Not supposed to happen in NFD - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } else if (!((utf32[0] >= 0x1161 && utf32[0] <= 0x1175) || (utf32[0] >= 0x11A8 && utf32[0] <= 0x11C2))) { - // Other than conjoining jamo vowels and trails - // unsupported for non-NFD. - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } + if (!len) { + if (!uts46) { + status.set(U_INTERNAL_PROGRAM_ERROR); + handleError(status, __LINE__, basename); + } + pendingTrieInsertions.push_back({c, uint32_t(0xFFFFFFFF)}); + } else if (len == 1 && ((utf32[0] >= 0x1161 && utf32[0] <= 0x1175) || (utf32[0] >= 0x11A8 && utf32[0] <= 0x11C2))) { + // Singleton decompositions to conjoining jamo. + if (mainNormalizer == nfdNormalizer) { + // Not supposed to happen in NFD + status.set(U_INTERNAL_PROGRAM_ERROR); + handleError(status, __LINE__, basename); } - pendingTrieInsertions.push_back({c, uint32_t(utf32[0]) << 16, false}); - } else if (len == 2 && - utf32[0] <= 0xFFFF && - utf32[1] <= 0xFFFF && + pendingTrieInsertions.push_back({c, static_cast<uint32_t>(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); + } else if (!startsWithBackwardCombiningStarter && len == 1 && utf32[0] <= 0xFFFF) { + pendingTrieInsertions.push_back({c, static_cast<uint32_t>(utf32[0]) | NON_ROUND_TRIP_MASK | (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0)}); + } else if (c != 0x212B && // ANGSTROM SIGN is special to make the Harfbuzz case branch less in the more common case. + !startsWithBackwardCombiningStarter && + len == 2 && + utf32[0] <= 0x7FFF && + utf32[1] <= 0x7FFF && + utf32[0] > 0x1F && + utf32[1] > 0x1F && !u_getCombiningClass(utf32[0]) && - u_getCombiningClass(utf32[1]) && - permissibleBmpPair(nonNfdOrRoundTrips, c, utf32[1])) { + u_getCombiningClass(utf32[1])) { for (int32_t i = 0; i < len; ++i) { if (((utf32[i] == 0x0345) && (uprv_strcmp(basename, "uts46d") == 0)) || utf32[i] == 0xFF9E || utf32[i] == 0xFF9F) { // Assert that iota subscript and half-width voicing marks never occur in these // expansions in the normalization forms where they are special. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } } - if (startsWithBackwardCombiningStarter) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - pendingTrieInsertions.push_back({c, (uint32_t(utf32[0]) << 16) | uint32_t(utf32[1]), false}); + pendingTrieInsertions.push_back({c, static_cast<uint32_t>(utf32[0]) | (static_cast<uint32_t>(utf32[1]) << 15) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK)}); } else { - if (startsWithBackwardCombiningStarter) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - UBool supplementary = false; UBool nonInitialStarter = false; for (int32_t i = 0; i < len; ++i) { @@ -997,7 +956,7 @@ void computeDecompositions(const char* basename, // Assert that iota subscript and half-width voicing marks never occur in these // expansions in the normalization forms where they are special. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } if (utf32[i] > 0xFFFF) { @@ -1005,79 +964,55 @@ void computeDecompositions(const char* basename, } if (utf32[i] == 0) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } if (i != 0 && !u_getCombiningClass(utf32[i])) { nonInitialStarter = true; } } + if (len == 1) { + // The format doesn't allow for length 1 for BMP, + // so if these ever occur, they need to be promoted + // to wider storage. As of Unicode 16 alpha, this + // case does not arise. + supplementary = true; + } if (!supplementary) { if (len > LONGEST_ENCODABLE_LENGTH_16 || !len || len == 1) { if (len == 18 && c == 0xFDFA) { // Special marker for the one character whose decomposition - // is too long. - pendingTrieInsertions.push_back({c, FDFA_MARKER << 16, supplementary}); + // is too long. (Too long even if we took the fourth bit into use!) + pendingTrieInsertions.push_back({c, NON_ROUND_TRIP_MASK | 1}); continue; } else { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } } } else if (len > LONGEST_ENCODABLE_LENGTH_32 || !len) { + // Note: There's a fourth bit available, but let's error out + // if it's ever needed so that it doesn't get used without + // updating docs. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - // Complex decomposition - // Format for 16-bit value: - // 15..13: length minus two for 16-bit case and length minus one for - // the 32-bit case. Length 8 needs to fit in three bits in - // the 16-bit case, and this way the value is future-proofed - // up to 9 in the 16-bit case. Zero is unused and length one - // in the 16-bit case goes directly into the trie. - // 12: 1 if all trailing characters are guaranteed non-starters, - // 0 if no guarantees about non-starterness. - // Note: The bit choice is this way around to allow for - // dynamically falling back to not having this but instead - // having one more bit for length by merely choosing - // different masks. - // 11..0: Start offset in storage. The offset is to the logical - // sequence of scalars16, scalars32, supplementary_scalars16, - // supplementary_scalars32. - uint32_t descriptor = uint32_t(!nonInitialStarter) << 12; - if (!supplementary) { - descriptor |= (uint32_t(len) - 2) << 13; - } else { - descriptor |= (uint32_t(len) - 1) << 13; - } - if (descriptor & 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); + handleError(status, __LINE__, basename); } + size_t index = 0; if (!supplementary) { index = findOrAppend(storage16, utf32, len); } else { index = findOrAppend(storage32, utf32, len); } - if (index > 0xFFF) { - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - descriptor |= uint32_t(index); - if (!descriptor || descriptor > 0xFFFF) { - // > 0xFFFF should never happen if the code above is correct. - // == 0 should not happen due to the nature of the data. - status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, basename); - } - uint32_t nonRoundTripMarker = 0; - if (!nonNfdOrRoundTrips) { - nonRoundTripMarker = (NON_ROUND_TRIP_MARKER << 16); - } - pendingTrieInsertions.push_back({c, descriptor | nonRoundTripMarker, supplementary}); + pendingTrieInsertions.push_back({c, (startsWithBackwardCombiningStarter ? BACKWARD_COMBINING_MASK : 0) | (roundTripsViaCanonicalComposition ? 0 : NON_ROUND_TRIP_MASK), supplementary, !nonInitialStarter, uint32_t(len), uint32_t(index)}); } } if (storage16.size() + storage32.size() > 0xFFF) { + // We actually have 14 bits available, but let's error out so + // that docs can be updated when taking a reserved bit out of + // potential future flag usage. status.set(U_INTERNAL_PROGRAM_ERROR); } if (f) { @@ -1088,14 +1023,14 @@ void computeDecompositions(const char* basename, trieType, UCPTRIE_VALUE_BITS_32, status)); - handleError(status, basename); + handleError(status, __LINE__, basename); fprintf(f, "[trie]\n"); usrc_writeUCPTrie(f, "trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); fclose(f); } - handleError(status, basename); + handleError(status, __LINE__, basename); } #endif // !UCONFIG_NO_NORMALIZATION @@ -1290,9 +1225,9 @@ struct AddRangeHelper { static UBool U_CALLCONV addRangeToUCPTrie(const void* context, UChar32 start, UChar32 end, uint32_t value) { IcuToolErrorCode status("addRangeToUCPTrie"); - UMutableCPTrie* ucptrie = ((const AddRangeHelper*) context)->ucptrie; + UMutableCPTrie* ucptrie = static_cast<const AddRangeHelper*>(context)->ucptrie; umutablecptrie_setRange(ucptrie, start, end, value, status); - handleError(status, "setRange"); + handleError(status, __LINE__, "setRange"); return true; } @@ -1306,7 +1241,7 @@ int exportCase(int argc, char* argv[]) { IcuToolErrorCode status("icuexportdata"); LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - handleError(status, "exportCase"); + handleError(status, __LINE__, "exportCase"); int32_t exceptionsLength, unfoldLength; const UCaseProps *caseProps = ucase_getSingleton(&exceptionsLength, &unfoldLength); @@ -1321,7 +1256,7 @@ int exportCase(int argc, char* argv[]) { trieType, width, status)); - handleError(status, "exportCase"); + handleError(status, __LINE__, "exportCase"); FILE* f = prepareOutputFile("ucase"); @@ -1385,7 +1320,7 @@ int exportNorm() { if (!(nfdBound == 0xC0 && nfcBound == 0x300)) { // Unexpected bounds for NFD/NFC. status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } uint32_t baseSize16 = storage16.size(); @@ -1407,17 +1342,17 @@ int exportNorm() { nfkcBound); if (!(nfkdBound <= 0xC0 && nfkcBound <= 0x300)) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } if (nfkcBound > 0xC0) { if (nfkdBound != 0xC0) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } } else { if (nfkdBound != nfkcBound) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } } @@ -1437,26 +1372,26 @@ int exportNorm() { uts46Bound); if (!(uts46dBound <= 0xC0 && uts46Bound <= 0x300)) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } if (uts46Bound > 0xC0) { if (uts46dBound != 0xC0) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } } else { if (uts46dBound != uts46Bound) { status.set(U_INTERNAL_PROGRAM_ERROR); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); } } uint32_t supplementSize16 = storage16.size() - baseSize16; uint32_t supplementSize32 = storage32.size() - baseSize32; - writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, char16_t(nfcBound)); - writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, char16_t(nfkcBound)); - writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, char16_t(uts46Bound)); + writeDecompositionData("nfd", baseSize16, baseSize32, supplementSize16, nfdDecompositionStartsWithNonStarter, nullptr, nfdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast<char16_t>(nfcBound)); + writeDecompositionData("nfkd", baseSize16, baseSize32, supplementSize16, nfkdDecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, nfkdPendingTrieInsertions, nfdPendingTrieInsertions, static_cast<char16_t>(nfkcBound)); + writeDecompositionData("uts46d", baseSize16, baseSize32, supplementSize16, uts46DecompositionStartsWithNonStarter, nfdDecompositionStartsWithNonStarter, uts46PendingTrieInsertions, nfdPendingTrieInsertions, static_cast<char16_t>(uts46Bound)); writeDecompositionTables("nfdex", storage16.data(), baseSize16, storage32.data(), baseSize32); writeDecompositionTables("nfkdex", storage16.data() + baseSize16, supplementSize16, storage32.data() + baseSize32, supplementSize32); @@ -1470,7 +1405,7 @@ int exportNorm() { uset_close(uts46DecompositionStartsWithBackwardCombiningStarter); uset_close(backwardCombiningStarters); - handleError(status, "exportNorm"); + handleError(status, __LINE__, "exportNorm"); return 0; } diff --git a/deps/icu-small/source/tools/icupkg/icupkg.cpp b/deps/icu-small/source/tools/icupkg/icupkg.cpp index 392ed588991270..3da4af7457863a 100644 --- a/deps/icu-small/source/tools/icupkg/icupkg.cpp +++ b/deps/icu-small/source/tools/icupkg/icupkg.cpp @@ -252,8 +252,8 @@ static UBool isPackageName(const char *filename) { int32_t len; - len=(int32_t)strlen(filename)-4; /* -4: subtract the length of ".dat" */ - return (UBool)(len>0 && 0==strcmp(filename+len, ".dat")); + len = static_cast<int32_t>(strlen(filename)) - 4; /* -4: subtract the length of ".dat" */ + return len > 0 && 0 == strcmp(filename + len, ".dat"); } /* This line is required by MinGW because it incorrectly globs the arguments. @@ -350,7 +350,7 @@ main(int argc, char *argv[]) { outFilename=nullptr; } else /* !isPackage */ { outFilename=inFilename; - isModified=(UBool)(sourcePath!=destPath); + isModified = static_cast<UBool>(sourcePath != destPath); } /* parse the output type option */ @@ -378,7 +378,7 @@ main(int argc, char *argv[]) { * If we swap a single file, just assume that we are modifying it. * The Package class does not give us access to the item and its type. */ - isModified|=(UBool)(!isPackage || outType!=pkg->getInType()); + isModified |= static_cast<UBool>(!isPackage || outType != pkg->getInType()); } else if(isPackage) { outType=pkg->getInType(); // default to input type } else /* !isPackage: swap single file */ { diff --git a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp index c2ac112f6efcc4..f5d6b17a4041e5 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp +++ b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp @@ -60,11 +60,9 @@ U_CDECL_BEGIN U_CDECL_END #if U_HAVE_POPEN - -using icu::LocalPointerBase; - +U_NAMESPACE_BEGIN U_DEFINE_LOCAL_OPEN_POINTER(LocalPipeFilePointer, FILE, pclose); - +U_NAMESPACE_END #endif using icu::LocalMemory; @@ -135,7 +133,7 @@ static struct { const char *name, *alt_name; const char *desc; } modes[] = { - { "files", 0, "Uses raw data files (no effect). Installation copies all files to the target location." }, + { "files", nullptr, "Uses raw data files (no effect). Installation copies all files to the target location." }, #if U_PLATFORM_HAS_WIN32_API { "dll", "library", "Generates one common data file and one shared library, <package>.dll"}, { "common", "archive", "Generates just the common file, <package>.dat"}, @@ -372,15 +370,15 @@ main(int argc, char* argv[]) { uprv_memset(&o, 0, sizeof(o)); o.mode = options[MODE].value; - o.version = options[REVISION].doesOccur ? options[REVISION].value : 0; + o.version = options[REVISION].doesOccur ? options[REVISION].value : nullptr; o.shortName = options[NAME].value; { - int32_t len = (int32_t)uprv_strlen(o.shortName); + int32_t len = static_cast<int32_t>(uprv_strlen(o.shortName)); char *csname, *cp; const char *sp; - cp = csname = (char *) uprv_malloc((len + 1 + 1) * sizeof(*o.cShortName)); + cp = csname = static_cast<char*>(uprv_malloc((len + 1 + 1) * sizeof(*o.cShortName))); if (*(sp = o.shortName)) { *cp++ = isalpha(*sp) ? * sp : '_'; for (++sp; *sp; ++sp) { @@ -478,6 +476,10 @@ main(int argc, char* argv[]) { fprintf(stdout, "Note: Ignoring option -b (windows-dynamicbase).\n"); } + if (options[WIN_DLL_ARCH].doesOccur) { + o.cpuArch = options[WIN_DLL_ARCH].value; + } + /* OK options are set up. Now the file lists. */ tail = nullptr; for( n=1; n<argc; n++) { @@ -503,7 +505,7 @@ main(int argc, char* argv[]) { } if (o.cShortName != nullptr) { - uprv_free((char *)o.cShortName); + uprv_free(const_cast<char*>(o.cShortName)); } if (o.fileListFiles != nullptr) { pkg_deleteList(o.fileListFiles); @@ -549,7 +551,7 @@ static int runCommand(const char* command, UBool specialHandling) { #if !(defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400) normal_command_mode: #endif - cmd = (char *)command; + cmd = const_cast<char*>(command); } printf("pkgdata: %s\n", cmd); @@ -777,6 +779,7 @@ static int32_t pkg_executeOptions(UPKGOptions *o) { o->tmpDir, o->entryName, (optMatchArch[0] == 0 ? nullptr : optMatchArch), + o->cpuArch, nullptr, gencFilePath, sizeof(gencFilePath), @@ -854,7 +857,7 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { int32_t tmpResult = 0; /* Initialize pkgdataFlags */ - pkgDataFlags = (char**)uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE); + pkgDataFlags = static_cast<char**>(uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE)); /* If we run out of space, allocate more */ #if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) @@ -862,7 +865,7 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { #endif if (pkgDataFlags != nullptr) { for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { - pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * currentBufferSize); + pkgDataFlags[i] = static_cast<char*>(uprv_malloc(sizeof(char) * currentBufferSize)); if (pkgDataFlags[i] != nullptr) { pkgDataFlags[i][0] = 0; } else { @@ -889,7 +892,7 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { fprintf(stdout, "# Reading options file %s\n", o->options); } status = U_ZERO_ERROR; - tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, (int32_t)PKGDATA_FLAGS_SIZE, &status); + tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, static_cast<int32_t>(PKGDATA_FLAGS_SIZE), &status); if (status == U_BUFFER_OVERFLOW_ERROR) { for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { if (pkgDataFlags[i]) { @@ -925,6 +928,10 @@ static int32_t initializePkgDataFlags(UPKGOptions *o) { static void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, UBool reverseExt, UBool noVersion) { const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; const char* FILE_SUFFIX = pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : ""; +#if defined(__GNUC__) && !defined(__clang__) + _Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wformat-truncation\"") +#endif #if U_PLATFORM == U_PF_MINGW /* MinGW does not need the library prefix when building in dll mode. */ @@ -1038,6 +1045,10 @@ static void createFileNames(UPKGOptions *o, const char mode, const char *version fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s (static)\n", libFileNames[LIB_FILE_VERSION]); } } +#if defined(__GNUC__) && !defined(__clang__) + _Pragma("GCC diagnostic pop") +#endif + } /* Create the symbolic links for the final library file. */ @@ -1134,7 +1145,7 @@ static int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling) static int32_t pkg_installLibrary(const char *installDir, const char *targetDir, UBool noVersion) { int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE]; + char cmd[LARGE_BUFFER_MAX_SIZE]; auto ret = snprintf(cmd, sizeof(cmd), @@ -1205,7 +1216,7 @@ static int32_t pkg_installLibrary(const char *installDir, const char *targetDir, static int32_t pkg_installCommonMode(const char *installDir, const char *fileName) { int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE] = ""; + char cmd[LARGE_BUFFER_MAX_SIZE] = ""; if (!T_FileStream_file_exists(installDir)) { UErrorCode status = U_ZERO_ERROR; @@ -1237,7 +1248,7 @@ static int32_t pkg_installCommonMode(const char *installDir, const char *fileNam #endif static int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName) { int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE] = ""; + char cmd[LARGE_BUFFER_MAX_SIZE] = ""; if (!T_FileStream_file_exists(installDir)) { UErrorCode status = U_ZERO_ERROR; @@ -1311,11 +1322,19 @@ static int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UB * archive file suffix is the same, then the final library needs to be archived. */ if (uprv_strcmp(pkgDataFlags[SOBJ_EXT], pkgDataFlags[SO_EXT]) != 0 && uprv_strcmp(pkgDataFlags[A_EXT], pkgDataFlags[SO_EXT]) == 0) { +#if defined(__GNUC__) && !defined(__clang__) + _Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wformat-truncation\"") +#endif + snprintf(libFileNames[LIB_FILE_VERSION], sizeof(libFileNames[LIB_FILE_VERSION]), "%s%s%s.%s", libFileNames[LIB_FILE], pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", reverseExt ? version : pkgDataFlags[SO_EXT], reverseExt ? pkgDataFlags[SO_EXT] : version); +#if defined(__GNUC__) && !defined(__clang__) + _Pragma("GCC diagnostic pop") +#endif snprintf(cmd, sizeof(cmd), "%s %s %s%s %s%s", pkgDataFlags[AR], @@ -1386,7 +1405,7 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c if (cmd == nullptr) { length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE); - if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == nullptr) { + if ((cmd = static_cast<char*>(uprv_malloc(sizeof(char) * length))) == nullptr) { fprintf(stderr, "Unable to allocate memory for command.\n"); return -1; } @@ -1420,7 +1439,7 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c #elif U_PLATFORM == U_PF_MINGW length += static_cast<int32_t>(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW])); #endif - if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == nullptr) { + if ((cmd = static_cast<char*>(uprv_malloc(sizeof(char) * length))) == nullptr) { fprintf(stderr, "Unable to allocate memory for command.\n"); return -1; } @@ -1468,63 +1487,12 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c result = runCommand(cmd); #if U_PLATFORM == U_PF_OS390 - char *env_tmp; - char PDS_LibName[512]; - char PDS_Name[512]; - - PDS_Name[0] = 0; - PDS_LibName[0] = 0; - if (specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata") == 0) { - if (env_tmp = getenv("ICU_PDS_NAME")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - "DA"); - strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); - } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - U_ICU_VERSION_SHORT "DA"); - } else { - sprintf(PDS_Name, "%s%s", - "IXMI", - U_ICU_VERSION_SHORT "DA"); - } - } else if (!specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata_stub") == 0) { - if (env_tmp = getenv("ICU_PDS_NAME")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - "D1"); - strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); - } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - U_ICU_VERSION_SHORT "D1"); - } else { - sprintf(PDS_Name, "%s%s", - "IXMI", - U_ICU_VERSION_SHORT "D1"); - } - } - - if (PDS_Name[0]) { - sprintf(PDS_LibName,"%s%s%s%s%s", - "\"//'", - getenv("LOADMOD"), - "(", - PDS_Name, - ")'\""); - sprintf(cmd, "%s %s -o %s %s %s%s %s %s", - pkgDataFlags[GENLIB], - pkgDataFlags[LDICUDTFLAGS], - PDS_LibName, - objectFile, - pkgDataFlags[LD_SONAME], - pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], - pkgDataFlags[RPATH_FLAGS], - pkgDataFlags[BIR_FLAGS]); + sprintf(cmd, "%s %s -o %s%s %s %s%s %s %s", pkgDataFlags[GENLIB], pkgDataFlags[LDICUDTFLAGS], + targetDir, BATCH_STUB_TARGET, objectFile, pkgDataFlags[LD_SONAME], + pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], + pkgDataFlags[RPATH_FLAGS], pkgDataFlags[BIR_FLAGS]); - result = runCommand(cmd); - } + result = runCommand(cmd); #endif } @@ -1551,7 +1519,7 @@ static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode length = static_cast<int32_t>(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE); - LocalMemory<char> cmd((char *)uprv_malloc(sizeof(char) * length)); + LocalMemory<char> cmd(static_cast<char*>(uprv_malloc(sizeof(char) * length))); if (cmd.isNull()) { return -1; } @@ -1640,10 +1608,10 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD return -1; } - if ((cmd = (char *)uprv_malloc((listSize + 2) * SMALL_BUFFER_MAX_SIZE)) == nullptr) { + if ((cmd = static_cast<char*>(uprv_malloc((listSize + 2) * SMALL_BUFFER_MAX_SIZE))) == nullptr) { fprintf(stderr, "Unable to allocate memory for cmd.\n"); return -1; - } else if ((buffer = (char *)uprv_malloc((listSize + 1) * SMALL_BUFFER_MAX_SIZE)) == nullptr) { + } else if ((buffer = static_cast<char*>(uprv_malloc((listSize + 1) * SMALL_BUFFER_MAX_SIZE))) == nullptr) { fprintf(stderr, "Unable to allocate memory for buffer.\n"); uprv_free(cmd); return -1; @@ -2094,7 +2062,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) while(T_FileStream_readLine(in, line, sizeof(line))!=nullptr) { /* for each line */ ln++; if(uprv_strlen(line)>lineMax) { - fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, (int)ln, (int)lineMax); + fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, static_cast<int>(ln), static_cast<int>(lineMax)); exit(1); } /* remove spaces at the beginning */ @@ -2131,14 +2099,14 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) lineNext = uprv_strchr(linePtr+1, '"'); if(lineNext == nullptr) { fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", - l->str, (int)ln); + l->str, static_cast<int>(ln)); exit(1); } else { lineNext++; if(*lineNext) { if(*lineNext != ' ') { fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", - l->str, (int)ln, (int)(lineNext-line), (*lineNext)?*lineNext:'0'); + l->str, static_cast<int>(ln), static_cast<int>(lineNext - line), *lineNext ? *lineNext : '0'); exit(1); } *lineNext = 0; @@ -2154,7 +2122,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) } /* add the file */ - s = (char*)getLongPathname(linePtr); + s = const_cast<char*>(getLongPathname(linePtr)); /* normal mode.. o->files is just the bare list without package names */ o->files = pkg_appendToList(o->files, &tail, uprv_strdup(linePtr)); @@ -2164,7 +2132,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) } /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ tmpLength = static_cast<int32_t>(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5); - if((tmp = (char *)uprv_malloc(tmpLength)) == nullptr) { + if ((tmp = static_cast<char*>(uprv_malloc(tmpLength))) == nullptr) { fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); exit(U_MEMORY_ALLOCATION_ERROR); } @@ -2184,7 +2152,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) static UBool getPkgDataPath(const char *cmd, UBool verbose, char *buf, size_t items) { icu::CharString cmdBuf; UErrorCode status = U_ZERO_ERROR; - LocalPipeFilePointer p; + icu::LocalPipeFilePointer p; size_t n; cmdBuf.append(cmd, status); diff --git a/deps/icu-small/source/tools/pkgdata/pkgtypes.h b/deps/icu-small/source/tools/pkgdata/pkgtypes.h index 51c11e0a14d751..4b4ffdf07d3388 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgtypes.h +++ b/deps/icu-small/source/tools/pkgdata/pkgtypes.h @@ -124,6 +124,7 @@ typedef struct UPKGOptions_ const char *install; /* Where to install to (nullptr = don't install) */ const char *icuroot; /* where does ICU lives */ const char *libName; /* name for library (default: shortName) */ + const char* cpuArch; /* CPU Architecture for Clang-CL on Windows. See genccode.c --cpu-arch */ UBool rebuild; UBool verbose; UBool quiet; diff --git a/deps/icu-small/source/tools/toolutil/collationinfo.cpp b/deps/icu-small/source/tools/toolutil/collationinfo.cpp index 6bad90e13331c7..fead7ca4028534 100644 --- a/deps/icu-small/source/tools/toolutil/collationinfo.cpp +++ b/deps/icu-small/source/tools/toolutil/collationinfo.cpp @@ -30,85 +30,85 @@ void CollationInfo::printSizes(int32_t sizeWithHeader, const int32_t indexes[]) { int32_t totalSize = indexes[CollationDataReader::IX_TOTAL_SIZE]; if(sizeWithHeader > totalSize) { - printf(" header size: %6ld\n", (long)(sizeWithHeader - totalSize)); + printf(" header size: %6ld\n", static_cast<long>(sizeWithHeader - totalSize)); } int32_t length = indexes[CollationDataReader::IX_INDEXES_LENGTH]; - printf(" indexes: %6ld *4 = %6ld\n", (long)length, (long)length * 4); + printf(" indexes: %6ld *4 = %6ld\n", static_cast<long>(length), static_cast<long>(length) * 4); length = getDataLength(indexes, CollationDataReader::IX_REORDER_CODES_OFFSET); if(length != 0) { - printf(" reorder codes: %6ld *4 = %6ld\n", (long)length / 4, (long)length); + printf(" reorder codes: %6ld *4 = %6ld\n", static_cast<long>(length) / 4, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_REORDER_TABLE_OFFSET); if(length != 0) { U_ASSERT(length >= 256); - printf(" reorder table: %6ld\n", (long)length); + printf(" reorder table: %6ld\n", static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_TRIE_OFFSET); if(length != 0) { - printf(" trie size: %6ld\n", (long)length); + printf(" trie size: %6ld\n", static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_RESERVED8_OFFSET); if(length != 0) { - printf(" reserved (offset 8): %6ld\n", (long)length); + printf(" reserved (offset 8): %6ld\n", static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_CES_OFFSET); if(length != 0) { - printf(" CEs: %6ld *8 = %6ld\n", (long)length / 8, (long)length); + printf(" CEs: %6ld *8 = %6ld\n", static_cast<long>(length) / 8, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_RESERVED10_OFFSET); if(length != 0) { - printf(" reserved (offset 10): %6ld\n", (long)length); + printf(" reserved (offset 10): %6ld\n", static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_CE32S_OFFSET); if(length != 0) { - printf(" CE32s: %6ld *4 = %6ld\n", (long)length / 4, (long)length); + printf(" CE32s: %6ld *4 = %6ld\n", static_cast<long>(length) / 4, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_ROOT_ELEMENTS_OFFSET); if(length != 0) { - printf(" rootElements: %6ld *4 = %6ld\n", (long)length / 4, (long)length); + printf(" rootElements: %6ld *4 = %6ld\n", static_cast<long>(length) / 4, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_CONTEXTS_OFFSET); if(length != 0) { - printf(" contexts: %6ld *2 = %6ld\n", (long)length / 2, (long)length); + printf(" contexts: %6ld *2 = %6ld\n", static_cast<long>(length) / 2, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_UNSAFE_BWD_OFFSET); if(length != 0) { - printf(" unsafeBwdSet: %6ld *2 = %6ld\n", (long)length / 2, (long)length); + printf(" unsafeBwdSet: %6ld *2 = %6ld\n", static_cast<long>(length) / 2, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_FAST_LATIN_TABLE_OFFSET); if(length != 0) { - printf(" fastLatin table: %6ld *2 = %6ld\n", (long)length / 2, (long)length); + printf(" fastLatin table: %6ld *2 = %6ld\n", static_cast<long>(length) / 2, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_SCRIPTS_OFFSET); if(length != 0) { - printf(" scripts data: %6ld *2 = %6ld\n", (long)length / 2, (long)length); + printf(" scripts data: %6ld *2 = %6ld\n", static_cast<long>(length) / 2, static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_COMPRESSIBLE_BYTES_OFFSET); if(length != 0) { U_ASSERT(length >= 256); - printf(" compressibleBytes: %6ld\n", (long)length); + printf(" compressibleBytes: %6ld\n", static_cast<long>(length)); } length = getDataLength(indexes, CollationDataReader::IX_RESERVED18_OFFSET); if(length != 0) { - printf(" reserved (offset 18): %6ld\n", (long)length); + printf(" reserved (offset 18): %6ld\n", static_cast<long>(length)); } - printf(" collator binary total size: %6ld\n", (long)sizeWithHeader); + printf(" collator binary total size: %6ld\n", static_cast<long>(sizeWithHeader)); } int32_t @@ -130,7 +130,7 @@ CollationInfo::printReorderRanges(const CollationData &data, const int32_t *code for(int32_t i = 0; i < ranges.size(); ++i) { int32_t pair = ranges.elementAti(i); int32_t limit = (pair >> 16) & 0xffff; - int16_t offset = (int16_t)pair; + int16_t offset = static_cast<int16_t>(pair); if(offset == 0) { // [inclusive-start, exclusive-limit[ printf(" [%04x, %04x[\n", start, limit); diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.cpp b/deps/icu-small/source/tools/toolutil/dbgutil.cpp index d42b267f730252..824c6c8ba8cc7c 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/dbgutil.cpp @@ -62,10 +62,10 @@ static void udbg_setup() { //fflush(stderr); UnicodeString **newStrs = new UnicodeString*[UDBG_ENUM_COUNT+1]; for(int t=0;t<UDBG_ENUM_COUNT;t++) { - int32_t c = udbg_enumCount((UDebugEnumType)t); + int32_t c = udbg_enumCount(static_cast<UDebugEnumType>(t)); newStrs[t] = new UnicodeString[c+1]; for(int f=0;f<=c;f++) { - _fieldString((UDebugEnumType)t, f, newStrs[t][f]); + _fieldString(static_cast<UDebugEnumType>(t), f, newStrs[t][f]); } } newStrs[UDBG_ENUM_COUNT] = new UnicodeString[1]; // empty string diff --git a/deps/icu-small/source/tools/toolutil/filestrm.cpp b/deps/icu-small/source/tools/toolutil/filestrm.cpp index 9a2695197a6d19..3eb06c6f970edb 100644 --- a/deps/icu-small/source/tools/toolutil/filestrm.cpp +++ b/deps/icu-small/source/tools/toolutil/filestrm.cpp @@ -74,7 +74,7 @@ T_FileStream_wopen(const wchar_t* filename, const wchar_t* mode) U_CAPI void U_EXPORT2 T_FileStream_close(FileStream* fileStream) { - if (fileStream != 0) + if (fileStream != nullptr) fclose((FILE*)fileStream); } @@ -190,7 +190,7 @@ T_FileStream_eof(FileStream* fileStream) U_CAPI int U_EXPORT2 T_FileStream_error(FileStream* fileStream) { - return (fileStream == 0 || ferror((FILE*)fileStream)); + return (fileStream == nullptr || ferror((FILE*)fileStream)); } /* This function doesn't work. */ diff --git a/deps/icu-small/source/tools/toolutil/json-json.hpp b/deps/icu-small/source/tools/toolutil/json-json.hpp new file mode 100644 index 00000000000000..e502b671ec48dd --- /dev/null +++ b/deps/icu-small/source/tools/toolutil/json-json.hpp @@ -0,0 +1,24793 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +// +// From the nlohmann/json library. Original license: +// +// MIT License +// +// Copyright (c) 2013-2022 Niels Lohmann +// +// 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. + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include <algorithm> // all_of, find, for_each +#include <cstddef> // nullptr_t, ptrdiff_t, size_t +#include <functional> // hash, less +#include <initializer_list> // initializer_list +#ifndef JSON_NO_IO + #include <iosfwd> // istream, ostream +#endif // JSON_NO_IO +#include <iterator> // random_access_iterator_tag +#include <memory> // unique_ptr +#include <string> // string, stoi, to_string +#include <utility> // declval, forward, move, pair, swap +#include <vector> // vector + +// #include <nlohmann/adl_serializer.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <utility> + +// #include <nlohmann/detail/abi_macros.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 3 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include <nlohmann/detail/conversions/from_json.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // transform +#include <array> // array +#include <forward_list> // forward_list +#include <iterator> // inserter, front_inserter, end +#include <map> // map +#include <string> // string +#include <tuple> // tuple, make_tuple +#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include <unordered_map> // unordered_map +#include <utility> // pair, declval +#include <valarray> // valarray + +// #include <nlohmann/detail/exceptions.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> // nullptr_t +#include <exception> // exception +#if JSON_DIAGNOSTICS + #include <numeric> // accumulate +#endif +#include <stdexcept> // runtime_error +#include <string> // to_string +#include <vector> // vector + +// #include <nlohmann/detail/value_t.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <array> // array +#include <cstddef> // size_t +#include <cstdint> // uint8_t +#include <string> // string + +// #include <nlohmann/detail/macro_scope.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <utility> // declval, pair +// #include <nlohmann/detail/meta/detected.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <type_traits> + +// #include <nlohmann/detail/meta/void_t.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename ...Ts> struct make_void +{ + using type = void; +}; +template<typename ...Ts> using void_t = typename make_void<Ts...>::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template<class Default, + class AlwaysVoid, + template<class...> class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template<class Default, template<class...> class Op, class... Args> +struct detector<Default, void_t<Op<Args...>>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op<Args...>; +}; + +template<template<class...> class Op, class... Args> +using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t; + +template<template<class...> class Op, class... Args> +struct is_detected_lazy : is_detected<Op, Args...> { }; + +template<template<class...> class Op, class... Args> +using detected_t = typename detector<nonesuch, void, Op, Args...>::type; + +template<class Default, template<class...> class Op, class... Args> +using detected_or = detector<Default, void, Op, Args...>; + +template<class Default, template<class...> class Op, class... Args> +using detected_or_t = typename detected_or<Default, Op, Args...>::type; + +template<class Expected, template<class...> class Op, class... Args> +using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>; + +template<class To, template<class...> class Op, class... Args> +using is_detected_convertible = + std::is_convertible<detected_t<Op, Args...>, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/thirdparty/hedley/hedley.hpp> + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson <evan@nemerson.com> +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson <evan@nemerson.com> + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include <stdint.h> + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include <stdint.h> + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include <nlohmann/detail/abi_macros.hpp> + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include(<version>) + #include <version> + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include(<filesystem>) + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include(<experimental/filesystem>) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include <cstdlib> + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include <cassert> // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template<typename BasicJsonType> \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template<typename BasicJsonType> \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template<template<typename, typename, typename...> class ObjectType, \ + template<typename, typename...> class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template<typename> class AllocatorType, \ + template<typename, typename = void> class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json<ObjectType, ArrayType, StringType, BooleanType, \ + NumberIntegerType, NumberUnsignedType, NumberFloatType, \ + AllocatorType, JSONSerializer, BinaryType, CustomBaseClass> + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_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, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows to call any std function as if (e.g. with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template<typename... T> \ + using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template<typename... T> \ + std_name##_tag std_name(T&&...); \ + \ + template<typename... T> \ + using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \ + \ + template<typename... T> \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact<std_name##_tag, result_of_##std_name, T...>::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template<typename... T> \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name<T...> \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include <compare> // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array<std::uint8_t, 9> order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast<std::size_t>(lhs); + const auto r_index = static_cast<std::size_t>(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/string_escape.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template<typename StringType> +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template<typename StringType> +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template<typename StringType> +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/input/position_t.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> // size_t + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include <array> // array +#include <cstddef> // size_t +#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include <utility> // index_sequence, make_index_sequence, index_sequence_for + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename T> +using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template<bool B, typename T = void> +using enable_if_t = typename std::enable_if<B, T>::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence<T, Ints...>` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence<T, Ints...>); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence<int, 5>()); +// } +template <typename T, T... Ints> +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template <size_t... Ints> +using index_sequence = integer_sequence<size_t, Ints...>; + +namespace utility_internal +{ + +template <typename Seq, size_t SeqSize, size_t Rem> +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template <typename T, T... Ints, size_t SeqSize> +struct Extend<integer_sequence<T, Ints...>, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template <typename T, T... Ints, size_t SeqSize> +struct Extend<integer_sequence<T, Ints...>, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence<T, N>'. +// 'Gen<T, N>::type' is an alias for 'integer_sequence<T, 0, 1, ... N-1>'. +template <typename T, size_t N> +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template <typename T> +struct Gen<T, 0> +{ + using type = integer_sequence<T>; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence<int, 0, 1, ..., N-1>`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template <typename T, T N> +using make_integer_sequence = typename utility_internal::Gen<T, N>::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template <size_t N> +using make_index_sequence = make_integer_sequence<size_t, N>; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template <typename... Ts> +using index_sequence_for = make_index_sequence<sizeof...(Ts)>; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template<unsigned N> struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template<typename T> +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template<typename T> + constexpr T static_const<T>::value; +#endif + +template<typename T, typename... Args> +inline constexpr std::array<T, sizeof...(Args)> make_array(Args&& ... args) +{ + return std::array<T, sizeof...(Args)> {{static_cast<T>(std::forward<Args>(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/type_traits.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <limits> // numeric_limits +#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type +#include <utility> // declval +#include <tuple> // tuple +#include <string> // char_traits + +// #include <nlohmann/detail/iterators/iterator_traits.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <iterator> // random_access_iterator_tag + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/meta/void_t.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename It, typename = void> +struct iterator_types {}; + +template<typename It> +struct iterator_types < + It, + void_t<typename It::difference_type, typename It::value_type, typename It::pointer, + typename It::reference, typename It::iterator_category >> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template<typename T, typename = void> +struct iterator_traits +{ +}; + +template<typename T> +struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >> + : iterator_types<T> +{ +}; + +template<typename T> +struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/call_std/begin.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/call_std/end.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/detected.hpp> + +// #include <nlohmann/json_fwd.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include <cstdint> // int64_t, uint64_t + #include <map> // map + #include <memory> // allocator + #include <string> // string + #include <vector> // vector + + // #include <nlohmann/detail/abi_macros.hpp> + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template<typename T = void, typename SFINAE = void> + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template<template<typename U, typename V, typename... Args> class ObjectType = + std::map, + template<typename U, typename... Args> class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template<typename U> class AllocatorType = std::allocator, + template<typename T, typename SFINAE = void> class JSONSerializer = + adl_serializer, + class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template<typename RefStringType> + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template<class Key, class T, class IgnoredLess, class Allocator> + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json<nlohmann::ordered_map>; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval<T>()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template<typename> struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template<typename BasicJsonContext> +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json<typename std::remove_cv<typename std::remove_pointer<BasicJsonContext>::type>::type>::value + || std::is_same<BasicJsonContext, std::nullptr_t>::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template<typename> +class json_ref; + +template<typename> +struct is_json_ref : std::false_type {}; + +template<typename T> +struct is_json_ref<json_ref<T>> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template<typename T> +using mapped_type_t = typename T::mapped_type; + +template<typename T> +using key_type_t = typename T::key_type; + +template<typename T> +using value_type_t = typename T::value_type; + +template<typename T> +using difference_type_t = typename T::difference_type; + +template<typename T> +using pointer_t = typename T::pointer; + +template<typename T> +using reference_t = typename T::reference; + +template<typename T> +using iterator_category_t = typename T::iterator_category; + +template<typename T, typename... Args> +using to_json_function = decltype(T::to_json(std::declval<Args>()...)); + +template<typename T, typename... Args> +using from_json_function = decltype(T::from_json(std::declval<Args>()...)); + +template<typename T, typename U> +using get_template_function = decltype(std::declval<T>().template get<U>()); + +// trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists +template<typename BasicJsonType, typename T, typename = void> +struct has_from_json : std::false_type {}; + +// trait checking if j.get<T> is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template <typename BasicJsonType, typename T> +struct is_getable +{ + static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value; +}; + +template<typename BasicJsonType, typename T> +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> +{ + using serializer = typename BasicJsonType::template json_serializer<T, void>; + + static constexpr bool value = + is_detected_exact<void, from_json_function, serializer, + const BasicJsonType&, T&>::value; +}; + +// This trait checks if JSONSerializer<T>::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template<typename BasicJsonType, typename T, typename = void> +struct has_non_default_from_json : std::false_type {}; + +template<typename BasicJsonType, typename T> +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> +{ + using serializer = typename BasicJsonType::template json_serializer<T, void>; + + static constexpr bool value = + is_detected_exact<T, from_json_function, serializer, + const BasicJsonType&>::value; +}; + +// This trait checks if BasicJsonType::json_serializer<T>::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template<typename BasicJsonType, typename T, typename = void> +struct has_to_json : std::false_type {}; + +template<typename BasicJsonType, typename T> +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> +{ + using serializer = typename BasicJsonType::template json_serializer<T, void>; + + static constexpr bool value = + is_detected_exact<void, to_json_function, serializer, BasicJsonType&, + T>::value; +}; + +template<typename T> +using detect_key_compare = typename T::key_compare; + +template<typename T> +struct has_key_compare : std::integral_constant<bool, is_detected<detect_key_compare, T>::value> {}; + +// obtains the actual object key comparator +template<typename BasicJsonType> +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare<object_t>::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template<typename BasicJsonType> +using actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template<typename T> +struct char_traits : std::char_traits<T> +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits<unsigned char> : std::char_traits<char> +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast<int_type>(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast<char_type>(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast<int_type>(EOF); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits<signed char> : std::char_traits<char> +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast<int_type>(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast<char_type>(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast<int_type>(EOF); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template<class...> struct conjunction : std::true_type { }; +template<class B> struct conjunction<B> : B { }; +template<class B, class... Bn> +struct conjunction<B, Bn...> +: std::conditional<static_cast<bool>(B::value), conjunction<Bn...>, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template<class B> struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template <typename T> +struct is_default_constructible : std::is_default_constructible<T> {}; + +template <typename T1, typename T2> +struct is_default_constructible<std::pair<T1, T2>> + : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {}; + +template <typename T1, typename T2> +struct is_default_constructible<const std::pair<T1, T2>> + : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {}; + +template <typename... Ts> +struct is_default_constructible<std::tuple<Ts...>> + : conjunction<is_default_constructible<Ts>...> {}; + +template <typename... Ts> +struct is_default_constructible<const std::tuple<Ts...>> + : conjunction<is_default_constructible<Ts>...> {}; + +template <typename T, typename... Args> +struct is_constructible : std::is_constructible<T, Args...> {}; + +template <typename T1, typename T2> +struct is_constructible<std::pair<T1, T2>> : is_default_constructible<std::pair<T1, T2>> {}; + +template <typename T1, typename T2> +struct is_constructible<const std::pair<T1, T2>> : is_default_constructible<const std::pair<T1, T2>> {}; + +template <typename... Ts> +struct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple<Ts...>> {}; + +template <typename... Ts> +struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {}; + +template<typename T, typename = void> +struct is_iterator_traits : std::false_type {}; + +template<typename T> +struct is_iterator_traits<iterator_traits<T>> +{ + private: + using traits = iterator_traits<T>; + + public: + static constexpr auto value = + is_detected<value_type_t, traits>::value && + is_detected<difference_type_t, traits>::value && + is_detected<pointer_t, traits>::value && + is_detected<iterator_category_t, traits>::value && + is_detected<reference_t, traits>::value; +}; + +template<typename T> +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference<T>::type; + + using iterator = detected_t<result_of_begin, t_ref>; + using sentinel = detected_t<result_of_end, t_ref>; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits<iterator_traits<iterator>>::value; + + public: + static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value && is_iterator_begin; +}; + +template<typename R> +using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>; + +template<typename T> +using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template<typename T, typename = void> +struct is_complete_type : std::false_type {}; + +template<typename T> +struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {}; + +template<typename BasicJsonType, typename CompatibleObjectType, + typename = void> +struct is_compatible_object_type_impl : std::false_type {}; + +template<typename BasicJsonType, typename CompatibleObjectType> +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&& + is_detected<key_type_t, CompatibleObjectType>::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible<typename object_t::key_type, + typename CompatibleObjectType::key_type>::value && + is_constructible<typename object_t::mapped_type, + typename CompatibleObjectType::mapped_type>::value; +}; + +template<typename BasicJsonType, typename CompatibleObjectType> +struct is_compatible_object_type + : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {}; + +template<typename BasicJsonType, typename ConstructibleObjectType, + typename = void> +struct is_constructible_object_type_impl : std::false_type {}; + +template<typename BasicJsonType, typename ConstructibleObjectType> +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&& + is_detected<key_type_t, ConstructibleObjectType>::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible<ConstructibleObjectType>::value && + (std::is_move_assignable<ConstructibleObjectType>::value || + std::is_copy_assignable<ConstructibleObjectType>::value) && + (is_constructible<typename ConstructibleObjectType::key_type, + typename object_t::key_type>::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json<BasicJsonType, + typename ConstructibleObjectType::mapped_type>::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template<typename BasicJsonType, typename ConstructibleObjectType> +struct is_constructible_object_type + : is_constructible_object_type_impl<BasicJsonType, + ConstructibleObjectType> {}; + +template<typename BasicJsonType, typename CompatibleStringType> +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value; +}; + +template<typename BasicJsonType, typename ConstructibleStringType> +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval<ConstructibleStringType>()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible<laundered_type, typename BasicJsonType::string_t>, + is_detected_exact<typename BasicJsonType::string_t::value_type, + value_type_t, laundered_type >>::value; +}; + +template<typename BasicJsonType, typename CompatibleArrayType, typename = void> +struct is_compatible_array_type_impl : std::false_type {}; + +template<typename BasicJsonType, typename CompatibleArrayType> +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected<iterator_t, CompatibleArrayType>::value&& + is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same<CompatibleArrayType, detected_t<range_value_t, CompatibleArrayType>>::value >> +{ + static constexpr bool value = + is_constructible<BasicJsonType, + range_value_t<CompatibleArrayType>>::value; +}; + +template<typename BasicJsonType, typename CompatibleArrayType> +struct is_compatible_array_type + : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {}; + +template<typename BasicJsonType, typename ConstructibleArrayType, typename = void> +struct is_constructible_array_type_impl : std::false_type {}; + +template<typename BasicJsonType, typename ConstructibleArrayType> +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t<std::is_same<ConstructibleArrayType, + typename BasicJsonType::value_type>::value >> + : std::true_type {}; + +template<typename BasicJsonType, typename ConstructibleArrayType> +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same<ConstructibleArrayType, + typename BasicJsonType::value_type>::value&& + !is_compatible_string_type<BasicJsonType, ConstructibleArrayType>::value&& + is_default_constructible<ConstructibleArrayType>::value&& +(std::is_move_assignable<ConstructibleArrayType>::value || + std::is_copy_assignable<ConstructibleArrayType>::value)&& +is_detected<iterator_t, ConstructibleArrayType>::value&& +is_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&& +is_detected<range_value_t, ConstructibleArrayType>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same<ConstructibleArrayType, detected_t<range_value_t, ConstructibleArrayType>>::value&& + is_complete_type < + detected_t<range_value_t, ConstructibleArrayType >>::value >> +{ + using value_type = range_value_t<ConstructibleArrayType>; + + static constexpr bool value = + std::is_same<value_type, + typename BasicJsonType::array_t::value_type>::value || + has_from_json<BasicJsonType, + value_type>::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template<typename BasicJsonType, typename ConstructibleArrayType> +struct is_constructible_array_type + : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {}; + +template<typename RealIntegerType, typename CompatibleNumberIntegerType, + typename = void> +struct is_compatible_integer_type_impl : std::false_type {}; + +template<typename RealIntegerType, typename CompatibleNumberIntegerType> +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral<RealIntegerType>::value&& + std::is_integral<CompatibleNumberIntegerType>::value&& + !std::is_same<bool, CompatibleNumberIntegerType>::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits<RealIntegerType>; + using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>; + + static constexpr auto value = + is_constructible<RealIntegerType, + CompatibleNumberIntegerType>::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template<typename RealIntegerType, typename CompatibleNumberIntegerType> +struct is_compatible_integer_type + : is_compatible_integer_type_impl<RealIntegerType, + CompatibleNumberIntegerType> {}; + +template<typename BasicJsonType, typename CompatibleType, typename = void> +struct is_compatible_type_impl: std::false_type {}; + +template<typename BasicJsonType, typename CompatibleType> +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t<is_complete_type<CompatibleType>::value >> +{ + static constexpr bool value = + has_to_json<BasicJsonType, CompatibleType>::value; +}; + +template<typename BasicJsonType, typename CompatibleType> +struct is_compatible_type + : is_compatible_type_impl<BasicJsonType, CompatibleType> {}; + +template<typename T1, typename T2> +struct is_constructible_tuple : std::false_type {}; + +template<typename T1, typename... Args> +struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {}; + +template<typename BasicJsonType, typename T> +struct is_json_iterator_of : std::false_type {}; + +template<typename BasicJsonType> +struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::iterator> : std::true_type {}; + +template<typename BasicJsonType> +struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::const_iterator> : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template<template <typename...> class Primary, typename T> +struct is_specialization_of : std::false_type {}; + +template<template <typename...> class Primary, typename... Args> +struct is_specialization_of<Primary, Primary<Args...>> : std::true_type {}; + +template<typename T> +using is_json_pointer = is_specialization_of<::nlohmann::json_pointer, uncvref_t<T>>; + +// checks if A and B are comparable using Compare functor +template<typename Compare, typename A, typename B, typename = void> +struct is_comparable : std::false_type {}; + +template<typename Compare, typename A, typename B> +struct is_comparable<Compare, A, B, void_t< +decltype(std::declval<Compare>()(std::declval<A>(), std::declval<B>())), +decltype(std::declval<Compare>()(std::declval<B>(), std::declval<A>())) +>> : std::true_type {}; + +template<typename T> +using detect_is_transparent = typename T::is_transparent; + +// type trait to check if KeyType can be used as object key (without a BasicJsonType) +// see is_usable_as_basic_json_key_type below +template<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, + bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>> +using is_usable_as_key_type = typename std::conditional < + is_comparable<Comparator, ObjectKeyType, KeyTypeCVRef>::value + && !(ExcludeObjectKeyType && std::is_same<KeyType, + ObjectKeyType>::value) + && (!RequireTransparentComparator + || is_detected <detect_is_transparent, Comparator>::value) + && !is_json_pointer<KeyType>::value, + std::true_type, + std::false_type >::type; + +// type trait to check if KeyType can be used as object key +// true if: +// - KeyType is comparable with BasicJsonType::object_t::key_type +// - if ExcludeObjectKeyType is true, KeyType is not BasicJsonType::object_t::key_type +// - the comparator is transparent or RequireTransparentComparator is false +// - KeyType is not a JSON iterator or json_pointer +template<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, + bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>> +using is_usable_as_basic_json_key_type = typename std::conditional < + is_usable_as_key_type<typename BasicJsonType::object_comparator_t, + typename BasicJsonType::object_t::key_type, KeyTypeCVRef, + RequireTransparentComparator, ExcludeObjectKeyType>::value + && !is_json_iterator_of<BasicJsonType, KeyType>::value, + std::true_type, + std::false_type >::type; + +template<typename ObjectType, typename KeyType> +using detect_erase_with_key_type = decltype(std::declval<ObjectType&>().erase(std::declval<KeyType>())); + +// type trait to check if object_t has an erase() member functions accepting KeyType +template<typename BasicJsonType, typename KeyType> +using has_erase_with_key_type = typename std::conditional < + is_detected < + detect_erase_with_key_type, + typename BasicJsonType::object_t, KeyType >::value, + std::true_type, + std::false_type >::type; + +// a naive helper to check if a type is an ordered_map (exploits the fact that +// ordered_map inherits capacity() from std::vector) +template <typename T> +struct is_ordered_map +{ + using one = char; + + struct two + { + char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + }; + + template <typename C> static one test( decltype(&C::capacity) ) ; + template <typename C> static two test(...); + + enum { value = sizeof(test<T>(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) +}; + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 > +T conditional_static_cast(U value) +{ + return static_cast<T>(value); +} + +template<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0> +T conditional_static_cast(U value) +{ + return value; +} + +template<typename... Types> +using all_integral = conjunction<std::is_integral<Types>...>; + +template<typename... Types> +using all_signed = conjunction<std::is_signed<Types>...>; + +template<typename... Types> +using all_unsigned = conjunction<std::is_unsigned<Types>...>; + +// there's a disjunction trait in another PR; replace when merged +template<typename... Types> +using same_sign = std::integral_constant < bool, + all_signed<Types...>::value || all_unsigned<Types...>::value >; + +template<typename OfType, typename T> +using never_out_of_range = std::integral_constant < bool, + (std::is_signed<OfType>::value && (sizeof(T) < sizeof(OfType))) + || (same_sign<OfType, T>::value && sizeof(OfType) == sizeof(T)) >; + +template<typename OfType, typename T, + bool OfTypeSigned = std::is_signed<OfType>::value, + bool TSigned = std::is_signed<T>::value> +struct value_in_range_of_impl2; + +template<typename OfType, typename T> +struct value_in_range_of_impl2<OfType, T, false, false> +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type<OfType, T>::type; + return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)()); + } +}; + +template<typename OfType, typename T> +struct value_in_range_of_impl2<OfType, T, true, false> +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type<OfType, T>::type; + return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)()); + } +}; + +template<typename OfType, typename T> +struct value_in_range_of_impl2<OfType, T, false, true> +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type<OfType, T>::type; + return val >= 0 && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)()); + } +}; + +template<typename OfType, typename T> +struct value_in_range_of_impl2<OfType, T, true, true> +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type<OfType, T>::type; + return static_cast<CommonType>(val) >= static_cast<CommonType>((std::numeric_limits<OfType>::min)()) + && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)()); + } +}; + +template<typename OfType, typename T, + bool NeverOutOfRange = never_out_of_range<OfType, T>::value, + typename = detail::enable_if_t<all_integral<OfType, T>::value>> +struct value_in_range_of_impl1; + +template<typename OfType, typename T> +struct value_in_range_of_impl1<OfType, T, false> +{ + static constexpr bool test(T val) + { + return value_in_range_of_impl2<OfType, T>::test(val); + } +}; + +template<typename OfType, typename T> +struct value_in_range_of_impl1<OfType, T, true> +{ + static constexpr bool test(T /*val*/) + { + return true; + } +}; + +template<typename OfType, typename T> +inline constexpr bool value_in_range_of(T val) +{ + return value_in_range_of_impl1<OfType, T>::test(val); +} + +template<bool Value> +using bool_constant = std::integral_constant<bool, Value>; + +/////////////////////////////////////////////////////////////////////////////// +// is_c_string +/////////////////////////////////////////////////////////////////////////////// + +namespace impl +{ + +template<typename T> +inline constexpr bool is_c_string() +{ + using TUnExt = typename std::remove_extent<T>::type; + using TUnCVExt = typename std::remove_cv<TUnExt>::type; + using TUnPtr = typename std::remove_pointer<T>::type; + using TUnCVPtr = typename std::remove_cv<TUnPtr>::type; + return + (std::is_array<T>::value && std::is_same<TUnCVExt, char>::value) + || (std::is_pointer<T>::value && std::is_same<TUnCVPtr, char>::value); +} + +} // namespace impl + +// checks whether T is a [cv] char */[cv] char[] C string +template<typename T> +struct is_c_string : bool_constant<impl::is_c_string<T>()> {}; + +template<typename T> +using is_c_string_uncvref = is_c_string<uncvref_t<T>>; + +/////////////////////////////////////////////////////////////////////////////// +// is_transparent +/////////////////////////////////////////////////////////////////////////////// + +namespace impl +{ + +template<typename T> +inline constexpr bool is_transparent() +{ + return is_detected<detect_is_transparent, T>::value; +} + +} // namespace impl + +// checks whether T has a member named is_transparent +template<typename T> +struct is_transparent : bool_constant<impl::is_transparent<T>()> {}; + +/////////////////////////////////////////////////////////////////////////////// + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/string_concat.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstring> // strlen +#include <string> // string +#include <utility> // forward + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/detected.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +inline std::size_t concat_length() +{ + return 0; +} + +template<typename... Args> +inline std::size_t concat_length(const char* cstr, const Args& ... rest); + +template<typename StringType, typename... Args> +inline std::size_t concat_length(const StringType& str, const Args& ... rest); + +template<typename... Args> +inline std::size_t concat_length(const char /*c*/, const Args& ... rest) +{ + return 1 + concat_length(rest...); +} + +template<typename... Args> +inline std::size_t concat_length(const char* cstr, const Args& ... rest) +{ + // cppcheck-suppress ignoredReturnValue + return ::strlen(cstr) + concat_length(rest...); +} + +template<typename StringType, typename... Args> +inline std::size_t concat_length(const StringType& str, const Args& ... rest) +{ + return str.size() + concat_length(rest...); +} + +template<typename OutStringType> +inline void concat_into(OutStringType& /*out*/) +{} + +template<typename StringType, typename Arg> +using string_can_append = decltype(std::declval<StringType&>().append(std::declval < Arg && > ())); + +template<typename StringType, typename Arg> +using detect_string_can_append = is_detected<string_can_append, StringType, Arg>; + +template<typename StringType, typename Arg> +using string_can_append_op = decltype(std::declval<StringType&>() += std::declval < Arg && > ()); + +template<typename StringType, typename Arg> +using detect_string_can_append_op = is_detected<string_can_append_op, StringType, Arg>; + +template<typename StringType, typename Arg> +using string_can_append_iter = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end())); + +template<typename StringType, typename Arg> +using detect_string_can_append_iter = is_detected<string_can_append_iter, StringType, Arg>; + +template<typename StringType, typename Arg> +using string_can_append_data = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size())); + +template<typename StringType, typename Arg> +using detect_string_can_append_data = is_detected<string_can_append_data, StringType, Arg>; + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && detect_string_can_append_op<OutStringType, Arg>::value, int > = 0 > +inline void concat_into(OutStringType& out, Arg && arg, Args && ... rest); + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && !detect_string_can_append_op<OutStringType, Arg>::value + && detect_string_can_append_iter<OutStringType, Arg>::value, int > = 0 > +inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest); + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && !detect_string_can_append_op<OutStringType, Arg>::value + && !detect_string_can_append_iter<OutStringType, Arg>::value + && detect_string_can_append_data<OutStringType, Arg>::value, int > = 0 > +inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest); + +template<typename OutStringType, typename Arg, typename... Args, + enable_if_t<detect_string_can_append<OutStringType, Arg>::value, int> = 0> +inline void concat_into(OutStringType& out, Arg && arg, Args && ... rest) +{ + out.append(std::forward<Arg>(arg)); + concat_into(out, std::forward<Args>(rest)...); +} + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && detect_string_can_append_op<OutStringType, Arg>::value, int > > +inline void concat_into(OutStringType& out, Arg&& arg, Args&& ... rest) +{ + out += std::forward<Arg>(arg); + concat_into(out, std::forward<Args>(rest)...); +} + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && !detect_string_can_append_op<OutStringType, Arg>::value + && detect_string_can_append_iter<OutStringType, Arg>::value, int > > +inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) +{ + out.append(arg.begin(), arg.end()); + concat_into(out, std::forward<Args>(rest)...); +} + +template < typename OutStringType, typename Arg, typename... Args, + enable_if_t < !detect_string_can_append<OutStringType, Arg>::value + && !detect_string_can_append_op<OutStringType, Arg>::value + && !detect_string_can_append_iter<OutStringType, Arg>::value + && detect_string_can_append_data<OutStringType, Arg>::value, int > > +inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) +{ + out.append(arg.data(), arg.size()); + concat_into(out, std::forward<Args>(rest)...); +} + +template<typename OutStringType = std::string, typename... Args> +inline OutStringType concat(Args && ... args) +{ + OutStringType str; + str.reserve(concat_length(args...)); + concat_into(str, std::forward<Args>(args)...); + return str; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +//////////////// +// exceptions // +//////////////// + +/// @brief general exception of the @ref basic_json class +/// @sa https://json.nlohmann.me/api/basic_json/exception/ +class exception : public std::exception +{ + public: + /// returns the explanatory string + const char* what() const noexcept override + { + return m.what(); + } + + /// the id of the exception + const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes) + + protected: + JSON_HEDLEY_NON_NULL(3) + exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing) + + static std::string name(const std::string& ename, int id_) + { + return concat("[json.exception.", ename, '.', std::to_string(id_), "] "); + } + + static std::string diagnostics(std::nullptr_t /*leaf_element*/) + { + return ""; + } + + template<typename BasicJsonType> + static std::string diagnostics(const BasicJsonType* leaf_element) + { +#if JSON_DIAGNOSTICS + std::vector<std::string> tokens; + for (const auto* current = leaf_element; current != nullptr && current->m_parent != nullptr; current = current->m_parent) + { + switch (current->m_parent->type()) + { + case value_t::array: + { + for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i) + { + if (¤t->m_parent->m_data.m_value.array->operator[](i) == current) + { + tokens.emplace_back(std::to_string(i)); + break; + } + } + break; + } + + case value_t::object: + { + for (const auto& element : *current->m_parent->m_data.m_value.object) + { + if (&element.second == current) + { + tokens.emplace_back(element.first.c_str()); + break; + } + } + break; + } + + case value_t::null: // LCOV_EXCL_LINE + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + break; // LCOV_EXCL_LINE + } + } + + if (tokens.empty()) + { + return ""; + } + + auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{}, + [](const std::string & a, const std::string & b) + { + return concat(a, '/', detail::escape(b)); + }); + return concat('(', str, ") "); +#else + static_cast<void>(leaf_element); + return ""; +#endif + } + + private: + /// an exception object as storage for error messages + std::runtime_error m; +}; + +/// @brief exception indicating a parse error +/// @sa https://json.nlohmann.me/api/basic_json/parse_error/ +class parse_error : public exception +{ + public: + /*! + @brief create a parse error exception + @param[in] id_ the id of the exception + @param[in] pos the position where the error occurred (or with + chars_read_total=0 if the position cannot be + determined) + @param[in] what_arg the explanatory string + @return parse_error object + */ + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("parse_error", id_), "parse error", + position_string(pos), ": ", exception::diagnostics(context), what_arg); + return {id_, pos.chars_read_total, w.c_str()}; + } + + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("parse_error", id_), "parse error", + (byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""), + ": ", exception::diagnostics(context), what_arg); + return {id_, byte_, w.c_str()}; + } + + /*! + @brief byte index of the parse error + + The byte index of the last read character in the input file. + + @note For an input with n bytes, 1 is the index of the first character and + n+1 is the index of the terminating null byte or the end of file. + This also holds true when reading a byte vector (CBOR or MessagePack). + */ + const std::size_t byte; + + private: + parse_error(int id_, std::size_t byte_, const char* what_arg) + : exception(id_, what_arg), byte(byte_) {} + + static std::string position_string(const position_t& pos) + { + return concat(" at line ", std::to_string(pos.lines_read + 1), + ", column ", std::to_string(pos.chars_read_current_line)); + } +}; + +/// @brief exception indicating errors with iterators +/// @sa https://json.nlohmann.me/api/basic_json/invalid_iterator/ +class invalid_iterator : public exception +{ + public: + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + invalid_iterator(int id_, const char* what_arg) + : exception(id_, what_arg) {} +}; + +/// @brief exception indicating executing a member function with a wrong type +/// @sa https://json.nlohmann.me/api/basic_json/type_error/ +class type_error : public exception +{ + public: + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static type_error create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating access out of the defined range +/// @sa https://json.nlohmann.me/api/basic_json/out_of_range/ +class out_of_range : public exception +{ + public: + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +/// @brief exception indicating other library errors +/// @sa https://json.nlohmann.me/api/basic_json/other_error/ +class other_error : public exception +{ + public: + template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0> + static other_error create(int id_, const std::string& what_arg, BasicJsonContext context) + { + const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg); + return {id_, w.c_str()}; + } + + private: + JSON_HEDLEY_NON_NULL(3) + other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/identity_tag.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// dispatching helper struct +template <class T> struct identity_tag {}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/std_fs.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/macro_scope.hpp> + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include <experimental/filesystem> +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#elif JSON_HAS_FILESYSTEM +#include <filesystem> +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#endif + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_null())) + { + JSON_THROW(type_error::create(302, concat("type must be null, but is ", j.type_name()), &j)); + } + n = nullptr; +} + +// overloads for basic_json template parameters +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < std::is_arithmetic<ArithmeticType>::value&& + !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value, + int > = 0 > +void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast<value_t>(j)) + { + case value_t::number_unsigned: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>()); + break; + } + case value_t::number_integer: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>()); + break; + } + case value_t::number_float: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j)); + } +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) + { + JSON_THROW(type_error::create(302, concat("type must be boolean, but is ", j.type_name()), &j)); + } + b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>(); +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); +} + +template < + typename BasicJsonType, typename StringType, + enable_if_t < + std::is_assignable<StringType&, const typename BasicJsonType::string_t>::value + && is_detected_exact<typename BasicJsonType::string_t::value_type, value_type_t, StringType>::value + && !std::is_same<typename BasicJsonType::string_t, StringType>::value + && !is_json_ref<StringType>::value, int > = 0 > +inline void from_json(const BasicJsonType& j, StringType& s) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + + s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +{ + get_arithmetic_value(j, val); +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +{ + get_arithmetic_value(j, val); +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +{ + get_arithmetic_value(j, val); +} + +#if !JSON_DISABLE_ENUM_SERIALIZATION +template<typename BasicJsonType, typename EnumType, + enable_if_t<std::is_enum<EnumType>::value, int> = 0> +inline void from_json(const BasicJsonType& j, EnumType& e) +{ + typename std::underlying_type<EnumType>::type val; + get_arithmetic_value(j, val); + e = static_cast<EnumType>(val); +} +#endif // JSON_DISABLE_ENUM_SERIALIZATION + +// forward_list doesn't have an insert method +template<typename BasicJsonType, typename T, typename Allocator, + enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0> +inline void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + l.clear(); + std::transform(j.rbegin(), j.rend(), + std::front_inserter(l), [](const BasicJsonType & i) + { + return i.template get<T>(); + }); +} + +// valarray doesn't have an insert method +template<typename BasicJsonType, typename T, + enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0> +inline void from_json(const BasicJsonType& j, std::valarray<T>& l) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + l.resize(j.size()); + std::transform(j.begin(), j.end(), std::begin(l), + [](const BasicJsonType & elem) + { + return elem.template get<T>(); + }); +} + +template<typename BasicJsonType, typename T, std::size_t N> +auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +-> decltype(j.template get<T>(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get<T>(); + } +} + +template<typename BasicJsonType> +inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +{ + arr = *j.template get_ptr<const typename BasicJsonType::array_t*>(); +} + +template<typename BasicJsonType, typename T, std::size_t N> +auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr, + priority_tag<2> /*unused*/) +-> decltype(j.template get<T>(), void()) +{ + for (std::size_t i = 0; i < N; ++i) + { + arr[i] = j.at(i).template get<T>(); + } +} + +template<typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t< + std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value, + int> = 0> +auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) +-> decltype( + arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()), + j.template get<typename ConstructibleArrayType::value_type>(), + void()) +{ + using std::end; + + ConstructibleArrayType ret; + ret.reserve(j.size()); + std::transform(j.begin(), j.end(), + std::inserter(ret, end(ret)), [](const BasicJsonType & i) + { + // get<BasicJsonType>() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get<typename ConstructibleArrayType::value_type>(); + }); + arr = std::move(ret); +} + +template<typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t< + std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value, + int> = 0> +inline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) +{ + using std::end; + + ConstructibleArrayType ret; + std::transform( + j.begin(), j.end(), std::inserter(ret, end(ret)), + [](const BasicJsonType & i) + { + // get<BasicJsonType>() returns *this, this won't call a from_json + // method when value_type is BasicJsonType + return i.template get<typename ConstructibleArrayType::value_type>(); + }); + arr = std::move(ret); +} + +template < typename BasicJsonType, typename ConstructibleArrayType, + enable_if_t < + is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&& + !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&& + !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&& + !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&& + !is_basic_json<ConstructibleArrayType>::value, + int > = 0 > +auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) +-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), +j.template get<typename ConstructibleArrayType::value_type>(), +void()) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + from_json_array_impl(j, arr, priority_tag<3> {}); +} + +template < typename BasicJsonType, typename T, std::size_t... Idx > +std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType&& j, + identity_tag<std::array<T, sizeof...(Idx)>> /*unused*/, index_sequence<Idx...> /*unused*/) +{ + return { { std::forward<BasicJsonType>(j).at(Idx).template get<T>()... } }; +} + +template < typename BasicJsonType, typename T, std::size_t N > +auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag) +-> decltype(from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + return from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {}); +} + +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) + { + JSON_THROW(type_error::create(302, concat("type must be binary, but is ", j.type_name()), &j)); + } + + bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>(); +} + +template<typename BasicJsonType, typename ConstructibleObjectType, + enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0> +inline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_object())) + { + JSON_THROW(type_error::create(302, concat("type must be object, but is ", j.type_name()), &j)); + } + + ConstructibleObjectType ret; + const auto* inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>(); + using value_type = typename ConstructibleObjectType::value_type; + std::transform( + inner_object->begin(), inner_object->end(), + std::inserter(ret, ret.begin()), + [](typename BasicJsonType::object_t::value_type const & p) + { + return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>()); + }); + obj = std::move(ret); +} + +// overload for arithmetic types, not chosen for basic_json template arguments +// (BooleanType, etc..); note: Is it really necessary to provide explicit +// overloads for boolean_t etc. in case of a custom BooleanType which is not +// an arithmetic type? +template < typename BasicJsonType, typename ArithmeticType, + enable_if_t < + std::is_arithmetic<ArithmeticType>::value&& + !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&& + !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&& + !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&& + !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value, + int > = 0 > +inline void from_json(const BasicJsonType& j, ArithmeticType& val) +{ + switch (static_cast<value_t>(j)) + { + case value_t::number_unsigned: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>()); + break; + } + case value_t::number_integer: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>()); + break; + } + case value_t::number_float: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>()); + break; + } + case value_t::boolean: + { + val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>()); + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::string: + case value_t::binary: + case value_t::discarded: + default: + JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j)); + } +} + +template<typename BasicJsonType, typename... Args, std::size_t... Idx> +std::tuple<Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<Idx...> /*unused*/) +{ + return std::make_tuple(std::forward<BasicJsonType>(j).at(Idx).template get<Args>()...); +} + +template < typename BasicJsonType, class A1, class A2 > +std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/) +{ + return {std::forward<BasicJsonType>(j).at(0).template get<A1>(), + std::forward<BasicJsonType>(j).at(1).template get<A2>()}; +} + +template<typename BasicJsonType, typename A1, typename A2> +inline void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, priority_tag<1> /*unused*/) +{ + p = from_json_tuple_impl(std::forward<BasicJsonType>(j), identity_tag<std::pair<A1, A2>> {}, priority_tag<0> {}); +} + +template<typename BasicJsonType, typename... Args> +std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::tuple<Args...>> /*unused*/, priority_tag<2> /*unused*/) +{ + return from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {}); +} + +template<typename BasicJsonType, typename... Args> +inline void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t, priority_tag<3> /*unused*/) +{ + t = from_json_tuple_impl_base<BasicJsonType, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {}); +} + +template<typename BasicJsonType, typename TupleRelated> +auto from_json(BasicJsonType&& j, TupleRelated&& t) +-> decltype(from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {})) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + + return from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {}); +} + +template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +inline void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j)); + } + m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>()); + } +} + +template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, + typename = enable_if_t < !std::is_constructible < + typename BasicJsonType::string_t, Key >::value >> +inline void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j)); + } + m.clear(); + for (const auto& p : j) + { + if (JSON_HEDLEY_UNLIKELY(!p.is_array())) + { + JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j)); + } + m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>()); + } +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template<typename BasicJsonType> +inline void from_json(const BasicJsonType& j, std_fs::path& p) +{ + if (JSON_HEDLEY_UNLIKELY(!j.is_string())) + { + JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j)); + } + p = *j.template get_ptr<const typename BasicJsonType::string_t*>(); +} +#endif + +struct from_json_fn +{ + template<typename BasicJsonType, typename T> + auto operator()(const BasicJsonType& j, T&& val) const + noexcept(noexcept(from_json(j, std::forward<T>(val)))) + -> decltype(from_json(j, std::forward<T>(val))) + { + return from_json(j, std::forward<T>(val)); + } +}; + +} // namespace detail + +#ifndef JSON_HAS_CPP_17 +/// namespace to hold default `from_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +#endif +JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers) + detail::static_const<detail::from_json_fn>::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/conversions/to_json.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // copy +#include <iterator> // begin, end +#include <string> // string +#include <tuple> // tuple, get +#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type +#include <utility> // move, forward, declval, pair +#include <valarray> // valarray +#include <vector> // vector + +// #include <nlohmann/detail/iterators/iteration_proxy.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> // size_t +#include <iterator> // input_iterator_tag +#include <string> // string, to_string +#include <tuple> // tuple_size, get, tuple_element +#include <utility> // move + +#if JSON_HAS_RANGES + #include <ranges> // enable_borrowed_range +#endif + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename string_type> +void int_to_string( string_type& target, std::size_t value ) +{ + // For ADL + using std::to_string; + target = to_string(value); +} +template<typename IteratorType> class iteration_proxy_value +{ + public: + using difference_type = std::ptrdiff_t; + using value_type = iteration_proxy_value; + using pointer = value_type *; + using reference = value_type &; + using iterator_category = std::input_iterator_tag; + using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type; + + private: + /// the iterator + IteratorType anchor{}; + /// an index for arrays (used to create key names) + std::size_t array_index = 0; + /// last stringified array index + mutable std::size_t array_index_last = 0; + /// a string representation of the array index + mutable string_type array_index_str = "0"; + /// an empty string (to return a reference for primitive values) + string_type empty_str{}; + + public: + explicit iteration_proxy_value() = default; + explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0) + noexcept(std::is_nothrow_move_constructible<IteratorType>::value + && std::is_nothrow_default_constructible<string_type>::value) + : anchor(std::move(it)) + , array_index(array_index_) + {} + + iteration_proxy_value(iteration_proxy_value const&) = default; + iteration_proxy_value& operator=(iteration_proxy_value const&) = default; + // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions + iteration_proxy_value(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_constructible<IteratorType>::value + && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations) + iteration_proxy_value& operator=(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_assignable<IteratorType>::value + && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations) + ~iteration_proxy_value() = default; + + /// dereference operator (needed for range-based for) + const iteration_proxy_value& operator*() const + { + return *this; + } + + /// increment operator (needed for range-based for) + iteration_proxy_value& operator++() + { + ++anchor; + ++array_index; + + return *this; + } + + iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp) + { + auto tmp = iteration_proxy_value(anchor, array_index); + ++anchor; + ++array_index; + return tmp; + } + + /// equality operator (needed for InputIterator) + bool operator==(const iteration_proxy_value& o) const + { + return anchor == o.anchor; + } + + /// inequality operator (needed for range-based for) + bool operator!=(const iteration_proxy_value& o) const + { + return anchor != o.anchor; + } + + /// return key of the iterator + const string_type& key() const + { + JSON_ASSERT(anchor.m_object != nullptr); + + switch (anchor.m_object->type()) + { + // use integer array index as key + case value_t::array: + { + if (array_index != array_index_last) + { + int_to_string( array_index_str, array_index ); + array_index_last = array_index; + } + return array_index_str; + } + + // use key from the object + case value_t::object: + return anchor.key(); + + // use an empty key for all primitive types + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return empty_str; + } + } + + /// return value of the iterator + typename IteratorType::reference value() const + { + return anchor.value(); + } +}; + +/// proxy class for the items() function +template<typename IteratorType> class iteration_proxy +{ + private: + /// the container to iterate + typename IteratorType::pointer container = nullptr; + + public: + explicit iteration_proxy() = default; + + /// construct iteration proxy from a container + explicit iteration_proxy(typename IteratorType::reference cont) noexcept + : container(&cont) {} + + iteration_proxy(iteration_proxy const&) = default; + iteration_proxy& operator=(iteration_proxy const&) = default; + iteration_proxy(iteration_proxy&&) noexcept = default; + iteration_proxy& operator=(iteration_proxy&&) noexcept = default; + ~iteration_proxy() = default; + + /// return iterator begin (needed for range-based for) + iteration_proxy_value<IteratorType> begin() const noexcept + { + return iteration_proxy_value<IteratorType>(container->begin()); + } + + /// return iterator end (needed for range-based for) + iteration_proxy_value<IteratorType> end() const noexcept + { + return iteration_proxy_value<IteratorType>(container->end()); + } +}; + +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0> +auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key()) +{ + return i.key(); +} +// Structured Bindings Support +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +template<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0> +auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value()) +{ + return i.value(); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// The Addition to the STD Namespace is required to add +// Structured Bindings Support to the iteration_proxy_value class +// For further reference see https://blog.tartanllama.xyz/structured-bindings/ +// And see https://github.com/nlohmann/json/pull/1391 +namespace std +{ + +#if defined(__clang__) + // Fix: https://github.com/nlohmann/json/issues/1401 + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wmismatched-tags" +#endif +template<typename IteratorType> +class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>> // NOLINT(cert-dcl58-cpp) + : public std::integral_constant<std::size_t, 2> {}; + +template<std::size_t N, typename IteratorType> +class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >> // NOLINT(cert-dcl58-cpp) +{ + public: + using type = decltype( + get<N>(std::declval < + ::nlohmann::detail::iteration_proxy_value<IteratorType >> ())); +}; +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +} // namespace std + +#if JSON_HAS_RANGES + template <typename IteratorType> + inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy<IteratorType>> = true; +#endif + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/std_fs.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +////////////////// +// constructors // +////////////////// + +/* + * Note all external_constructor<>::construct functions need to call + * j.m_data.m_value.destroy(j.m_data.m_type) to avoid a memory leak in case j contains an + * allocated value (e.g., a string). See bug issue + * https://github.com/nlohmann/json/issues/2865 for more information. + */ + +template<value_t> struct external_constructor; + +template<> +struct external_constructor<value_t::boolean> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::boolean; + j.m_data.m_value = b; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::string> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::string; + j.m_data.m_value = s; + j.assert_invariant(); + } + + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::string; + j.m_data.m_value = std::move(s); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleStringType, + enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleStringType& str) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::string; + j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::binary> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::binary; + j.m_data.m_value = typename BasicJsonType::binary_t(b); + j.assert_invariant(); + } + + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::binary; + j.m_data.m_value = typename BasicJsonType::binary_t(std::move(b)); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::number_float> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::number_float; + j.m_data.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::number_unsigned> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::number_unsigned; + j.m_data.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::number_integer> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::number_integer; + j.m_data.m_value = val; + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::array> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::array; + j.m_data.m_value = arr; + j.set_parents(); + j.assert_invariant(); + } + + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::array; + j.m_data.m_value = std::move(arr); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value, + int > = 0 > + static void construct(BasicJsonType& j, const CompatibleArrayType& arr) + { + using std::begin; + using std::end; + + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::array; + j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr)); + j.set_parents(); + j.assert_invariant(); + } + + template<typename BasicJsonType> + static void construct(BasicJsonType& j, const std::vector<bool>& arr) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::array; + j.m_data.m_value = value_t::array; + j.m_data.m_value.array->reserve(arr.size()); + for (const bool x : arr) + { + j.m_data.m_value.array->push_back(x); + j.set_parent(j.m_data.m_value.array->back()); + } + j.assert_invariant(); + } + + template<typename BasicJsonType, typename T, + enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0> + static void construct(BasicJsonType& j, const std::valarray<T>& arr) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::array; + j.m_data.m_value = value_t::array; + j.m_data.m_value.array->resize(arr.size()); + if (arr.size() > 0) + { + std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin()); + } + j.set_parents(); + j.assert_invariant(); + } +}; + +template<> +struct external_constructor<value_t::object> +{ + template<typename BasicJsonType> + static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::object; + j.m_data.m_value = obj; + j.set_parents(); + j.assert_invariant(); + } + + template<typename BasicJsonType> + static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) + { + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::object; + j.m_data.m_value = std::move(obj); + j.set_parents(); + j.assert_invariant(); + } + + template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 > + static void construct(BasicJsonType& j, const CompatibleObjectType& obj) + { + using std::begin; + using std::end; + + j.m_data.m_value.destroy(j.m_data.m_type); + j.m_data.m_type = value_t::object; + j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj)); + j.set_parents(); + j.assert_invariant(); + } +}; + +///////////// +// to_json // +///////////// + +template<typename BasicJsonType, typename T, + enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0> +inline void to_json(BasicJsonType& j, T b) noexcept +{ + external_constructor<value_t::boolean>::construct(j, b); +} + +template < typename BasicJsonType, typename BoolRef, + enable_if_t < + ((std::is_same<std::vector<bool>::reference, BoolRef>::value + && !std::is_same <std::vector<bool>::reference, typename BasicJsonType::boolean_t&>::value) + || (std::is_same<std::vector<bool>::const_reference, BoolRef>::value + && !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>, + typename BasicJsonType::boolean_t >::value)) + && std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value, int > = 0 > +inline void to_json(BasicJsonType& j, const BoolRef& b) noexcept +{ + external_constructor<value_t::boolean>::construct(j, static_cast<typename BasicJsonType::boolean_t>(b)); +} + +template<typename BasicJsonType, typename CompatibleString, + enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0> +inline void to_json(BasicJsonType& j, const CompatibleString& s) +{ + external_constructor<value_t::string>::construct(j, s); +} + +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +{ + external_constructor<value_t::string>::construct(j, std::move(s)); +} + +template<typename BasicJsonType, typename FloatType, + enable_if_t<std::is_floating_point<FloatType>::value, int> = 0> +inline void to_json(BasicJsonType& j, FloatType val) noexcept +{ + external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val)); +} + +template<typename BasicJsonType, typename CompatibleNumberUnsignedType, + enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0> +inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +{ + external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val)); +} + +template<typename BasicJsonType, typename CompatibleNumberIntegerType, + enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0> +inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +{ + external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val)); +} + +#if !JSON_DISABLE_ENUM_SERIALIZATION +template<typename BasicJsonType, typename EnumType, + enable_if_t<std::is_enum<EnumType>::value, int> = 0> +inline void to_json(BasicJsonType& j, EnumType e) noexcept +{ + using underlying_type = typename std::underlying_type<EnumType>::type; + external_constructor<value_t::number_integer>::construct(j, static_cast<underlying_type>(e)); +} +#endif // JSON_DISABLE_ENUM_SERIALIZATION + +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, const std::vector<bool>& e) +{ + external_constructor<value_t::array>::construct(j, e); +} + +template < typename BasicJsonType, typename CompatibleArrayType, + enable_if_t < is_compatible_array_type<BasicJsonType, + CompatibleArrayType>::value&& + !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&& + !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&& + !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&& + !is_basic_json<CompatibleArrayType>::value, + int > = 0 > +inline void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +{ + external_constructor<value_t::array>::construct(j, arr); +} + +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +{ + external_constructor<value_t::binary>::construct(j, bin); +} + +template<typename BasicJsonType, typename T, + enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0> +inline void to_json(BasicJsonType& j, const std::valarray<T>& arr) +{ + external_constructor<value_t::array>::construct(j, std::move(arr)); +} + +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +{ + external_constructor<value_t::array>::construct(j, std::move(arr)); +} + +template < typename BasicJsonType, typename CompatibleObjectType, + enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 > +inline void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +{ + external_constructor<value_t::object>::construct(j, obj); +} + +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +{ + external_constructor<value_t::object>::construct(j, std::move(obj)); +} + +template < + typename BasicJsonType, typename T, std::size_t N, + enable_if_t < !std::is_constructible<typename BasicJsonType::string_t, + const T(&)[N]>::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + int > = 0 > +inline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + external_constructor<value_t::array>::construct(j, arr); +} + +template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 > +inline void to_json(BasicJsonType& j, const std::pair<T1, T2>& p) +{ + j = { p.first, p.second }; +} + +// for https://github.com/nlohmann/json/pull/1134 +template<typename BasicJsonType, typename T, + enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0> +inline void to_json(BasicJsonType& j, const T& b) +{ + j = { {b.key(), b.value()} }; +} + +template<typename BasicJsonType, typename Tuple, std::size_t... Idx> +inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/) +{ + j = { std::get<Idx>(t)... }; +} + +template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0> +inline void to_json(BasicJsonType& j, const T& t) +{ + to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {}); +} + +#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM +template<typename BasicJsonType> +inline void to_json(BasicJsonType& j, const std_fs::path& p) +{ + j = p.string(); +} +#endif + +struct to_json_fn +{ + template<typename BasicJsonType, typename T> + auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val)))) + -> decltype(to_json(j, std::forward<T>(val)), void()) + { + return to_json(j, std::forward<T>(val)); + } +}; +} // namespace detail + +#ifndef JSON_HAS_CPP_17 +/// namespace to hold default `to_json` function +/// to see why this is required: +/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html +namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) +{ +#endif +JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers) + detail::static_const<detail::to_json_fn>::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/identity_tag.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @sa https://json.nlohmann.me/api/adl_serializer/ +template<typename ValueType, typename> +struct adl_serializer +{ + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template<typename BasicJsonType, typename TargetType = ValueType> + static auto from_json(BasicJsonType && j, TargetType& val) noexcept( + noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val))) + -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void()) + { + ::nlohmann::from_json(std::forward<BasicJsonType>(j), val); + } + + /// @brief convert a JSON value to any value type + /// @sa https://json.nlohmann.me/api/adl_serializer/from_json/ + template<typename BasicJsonType, typename TargetType = ValueType> + static auto from_json(BasicJsonType && j) noexcept( + noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {}))) + -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})) + { + return ::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {}); + } + + /// @brief convert any value type to a JSON value + /// @sa https://json.nlohmann.me/api/adl_serializer/to_json/ + template<typename BasicJsonType, typename TargetType = ValueType> + static auto to_json(BasicJsonType& j, TargetType && val) noexcept( + noexcept(::nlohmann::to_json(j, std::forward<TargetType>(val)))) + -> decltype(::nlohmann::to_json(j, std::forward<TargetType>(val)), void()) + { + ::nlohmann::to_json(j, std::forward<TargetType>(val)); + } +}; + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/byte_container_with_subtype.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstdint> // uint8_t, uint64_t +#include <tuple> // tie +#include <utility> // move + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @brief an internal type for a backed binary type +/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ +template<typename BinaryType> +class byte_container_with_subtype : public BinaryType +{ + public: + using container_type = BinaryType; + using subtype_type = std::uint64_t; + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype() noexcept(noexcept(container_type())) + : container_type() + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) + : container_type(b) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b))) + : container_type(b) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/byte_container_with_subtype/ + byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b)))) + : container_type(std::move(b)) + , m_subtype(subtype_) + , m_has_subtype(true) + {} + + bool operator==(const byte_container_with_subtype& rhs) const + { + return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) == + std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype); + } + + bool operator!=(const byte_container_with_subtype& rhs) const + { + return !(rhs == *this); + } + + /// @brief sets the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/set_subtype/ + void set_subtype(subtype_type subtype_) noexcept + { + m_subtype = subtype_; + m_has_subtype = true; + } + + /// @brief return the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/subtype/ + constexpr subtype_type subtype() const noexcept + { + return m_has_subtype ? m_subtype : static_cast<subtype_type>(-1); + } + + /// @brief return whether the value has a subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/ + constexpr bool has_subtype() const noexcept + { + return m_has_subtype; + } + + /// @brief clears the binary subtype + /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/clear_subtype/ + void clear_subtype() noexcept + { + m_subtype = 0; + m_has_subtype = false; + } + + private: + subtype_type m_subtype = 0; + bool m_has_subtype = false; +}; + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/conversions/from_json.hpp> + +// #include <nlohmann/detail/conversions/to_json.hpp> + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/hash.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstdint> // uint8_t +#include <cstddef> // size_t +#include <functional> // hash + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// boost::hash_combine +inline std::size_t combine(std::size_t seed, std::size_t h) noexcept +{ + seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); + return seed; +} + +/*! +@brief hash a JSON value + +The hash function tries to rely on std::hash where possible. Furthermore, the +type of the JSON value is taken into account to have different hash values for +null, 0, 0U, and false, etc. + +@tparam BasicJsonType basic_json specialization +@param j JSON value to hash +@return hash value of j +*/ +template<typename BasicJsonType> +std::size_t hash(const BasicJsonType& j) +{ + using string_t = typename BasicJsonType::string_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + + const auto type = static_cast<std::size_t>(j.type()); + switch (j.type()) + { + case BasicJsonType::value_t::null: + case BasicJsonType::value_t::discarded: + { + return combine(type, 0); + } + + case BasicJsonType::value_t::object: + { + auto seed = combine(type, j.size()); + for (const auto& element : j.items()) + { + const auto h = std::hash<string_t> {}(element.key()); + seed = combine(seed, h); + seed = combine(seed, hash(element.value())); + } + return seed; + } + + case BasicJsonType::value_t::array: + { + auto seed = combine(type, j.size()); + for (const auto& element : j) + { + seed = combine(seed, hash(element)); + } + return seed; + } + + case BasicJsonType::value_t::string: + { + const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>()); + return combine(type, h); + } + + case BasicJsonType::value_t::boolean: + { + const auto h = std::hash<bool> {}(j.template get<bool>()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_integer: + { + const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_unsigned: + { + const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>()); + return combine(type, h); + } + + case BasicJsonType::value_t::number_float: + { + const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>()); + return combine(type, h); + } + + case BasicJsonType::value_t::binary: + { + auto seed = combine(type, j.get_binary().size()); + const auto h = std::hash<bool> {}(j.get_binary().has_subtype()); + seed = combine(seed, h); + seed = combine(seed, static_cast<std::size_t>(j.get_binary().subtype())); + for (const auto byte : j.get_binary()) + { + seed = combine(seed, std::hash<std::uint8_t> {}(byte)); + } + return seed; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return 0; // LCOV_EXCL_LINE + } +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/input/binary_reader.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // generate_n +#include <array> // array +#include <cmath> // ldexp +#include <cstddef> // size_t +#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t +#include <cstdio> // snprintf +#include <cstring> // memcpy +#include <iterator> // back_inserter +#include <limits> // numeric_limits +#include <string> // char_traits, string +#include <utility> // make_pair, move +#include <vector> // vector + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/input/input_adapters.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <array> // array +#include <cstddef> // size_t +#include <cstring> // strlen +#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next +#include <memory> // shared_ptr, make_shared, addressof +#include <numeric> // accumulate +#include <string> // string, char_traits +#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer +#include <utility> // pair, declval + +#ifndef JSON_NO_IO + #include <cstdio> // FILE * + #include <istream> // istream +#endif // JSON_NO_IO + +// #include <nlohmann/detail/iterators/iterator_traits.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// the supported input formats +enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata }; + +//////////////////// +// input adapters // +//////////////////// + +#ifndef JSON_NO_IO +/*! +Input adapter for stdio file access. This adapter read only 1 byte and do not use any + buffer. This adapter is a very low level adapter. +*/ +class file_input_adapter +{ + public: + using char_type = char; + + JSON_HEDLEY_NON_NULL(2) + explicit file_input_adapter(std::FILE* f) noexcept + : m_file(f) + { + JSON_ASSERT(m_file != nullptr); + } + + // make class move-only + file_input_adapter(const file_input_adapter&) = delete; + file_input_adapter(file_input_adapter&&) noexcept = default; + file_input_adapter& operator=(const file_input_adapter&) = delete; + file_input_adapter& operator=(file_input_adapter&&) = delete; + ~file_input_adapter() = default; + + std::char_traits<char>::int_type get_character() noexcept + { + return std::fgetc(m_file); + } + + private: + /// the file pointer to read from + std::FILE* m_file; +}; + +/*! +Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at +beginning of input. Does not support changing the underlying std::streambuf +in mid-input. Maintains underlying std::istream and std::streambuf to support +subsequent use of standard std::istream operations to process any input +characters following those used in parsing the JSON input. Clears the +std::istream flags; any input errors (e.g., EOF) will be detected by the first +subsequent call for input from the std::istream. +*/ +class input_stream_adapter +{ + public: + using char_type = char; + + ~input_stream_adapter() + { + // clear stream flags; we use underlying streambuf I/O, do not + // maintain ifstream flags, except eof + if (is != nullptr) + { + is->clear(is->rdstate() & std::ios::eofbit); + } + } + + explicit input_stream_adapter(std::istream& i) + : is(&i), sb(i.rdbuf()) + {} + + // delete because of pointer members + input_stream_adapter(const input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&) = delete; + input_stream_adapter& operator=(input_stream_adapter&&) = delete; + + input_stream_adapter(input_stream_adapter&& rhs) noexcept + : is(rhs.is), sb(rhs.sb) + { + rhs.is = nullptr; + rhs.sb = nullptr; + } + + // std::istream/std::streambuf use std::char_traits<char>::to_int_type, to + // ensure that std::char_traits<char>::eof() and the character 0xFF do not + // end up as the same value, e.g. 0xFFFFFFFF. + std::char_traits<char>::int_type get_character() + { + auto res = sb->sbumpc(); + // set eof manually, as we don't use the istream interface. + if (JSON_HEDLEY_UNLIKELY(res == std::char_traits<char>::eof())) + { + is->clear(is->rdstate() | std::ios::eofbit); + } + return res; + } + + private: + /// the associated input stream + std::istream* is = nullptr; + std::streambuf* sb = nullptr; +}; +#endif // JSON_NO_IO + +// General-purpose iterator-based adapter. It might not be as fast as +// theoretically possible for some containers, but it is extremely versatile. +template<typename IteratorType> +class iterator_input_adapter +{ + public: + using char_type = typename std::iterator_traits<IteratorType>::value_type; + + iterator_input_adapter(IteratorType first, IteratorType last) + : current(std::move(first)), end(std::move(last)) + {} + + typename char_traits<char_type>::int_type get_character() + { + if (JSON_HEDLEY_LIKELY(current != end)) + { + auto result = char_traits<char_type>::to_int_type(*current); + std::advance(current, 1); + return result; + } + + return char_traits<char_type>::eof(); + } + + private: + IteratorType current; + IteratorType end; + + template<typename BaseInputAdapter, size_t T> + friend struct wide_string_input_helper; + + bool empty() const + { + return current == end; + } +}; + +template<typename BaseInputAdapter, size_t T> +struct wide_string_input_helper; + +template<typename BaseInputAdapter> +struct wide_string_input_helper<BaseInputAdapter, 4> +{ + // UTF-32 + static void fill_buffer(BaseInputAdapter& input, + std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits<char>::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-32 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu)); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (wc <= 0xFFFF) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu)); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else if (wc <= 0x10FFFF) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u)); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + // unknown character + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } +}; + +template<typename BaseInputAdapter> +struct wide_string_input_helper<BaseInputAdapter, 2> +{ + // UTF-16 + static void fill_buffer(BaseInputAdapter& input, + std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, + size_t& utf8_bytes_index, + size_t& utf8_bytes_filled) + { + utf8_bytes_index = 0; + + if (JSON_HEDLEY_UNLIKELY(input.empty())) + { + utf8_bytes[0] = std::char_traits<char>::eof(); + utf8_bytes_filled = 1; + } + else + { + // get the current character + const auto wc = input.get_character(); + + // UTF-16 to UTF-8 encoding + if (wc < 0x80) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc); + utf8_bytes_filled = 1; + } + else if (wc <= 0x7FF) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u))); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); + utf8_bytes_filled = 2; + } + else if (0xD800 > wc || wc >= 0xE000) + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u))); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); + utf8_bytes_filled = 3; + } + else + { + if (JSON_HEDLEY_UNLIKELY(!input.empty())) + { + const auto wc2 = static_cast<unsigned int>(input.get_character()); + const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u)); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); + utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); + utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu)); + utf8_bytes_filled = 4; + } + else + { + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc); + utf8_bytes_filled = 1; + } + } + } + } +}; + +// Wraps another input adapter to convert wide character types into individual bytes. +template<typename BaseInputAdapter, typename WideCharType> +class wide_string_input_adapter +{ + public: + using char_type = char; + + wide_string_input_adapter(BaseInputAdapter base) + : base_adapter(base) {} + + typename std::char_traits<char>::int_type get_character() noexcept + { + // check if buffer needs to be filled + if (utf8_bytes_index == utf8_bytes_filled) + { + fill_buffer<sizeof(WideCharType)>(); + + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index == 0); + } + + // use buffer + JSON_ASSERT(utf8_bytes_filled > 0); + JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); + return utf8_bytes[utf8_bytes_index++]; + } + + private: + BaseInputAdapter base_adapter; + + template<size_t T> + void fill_buffer() + { + wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); + } + + /// a buffer for UTF-8 bytes + std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; + + /// index to the utf8_codes array for the next valid byte + std::size_t utf8_bytes_index = 0; + /// number of valid bytes in the utf8_codes array + std::size_t utf8_bytes_filled = 0; +}; + +template<typename IteratorType, typename Enable = void> +struct iterator_input_adapter_factory +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits<iterator_type>::value_type; + using adapter_type = iterator_input_adapter<iterator_type>; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(std::move(first), std::move(last)); + } +}; + +template<typename T> +struct is_iterator_of_multibyte +{ + using value_type = typename std::iterator_traits<T>::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; + +template<typename IteratorType> +struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> +{ + using iterator_type = IteratorType; + using char_type = typename std::iterator_traits<iterator_type>::value_type; + using base_adapter_type = iterator_input_adapter<iterator_type>; + using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>; + + static adapter_type create(IteratorType first, IteratorType last) + { + return adapter_type(base_adapter_type(std::move(first), std::move(last))); + } +}; + +// General purpose iterator-based input +template<typename IteratorType> +typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last) +{ + using factory_type = iterator_input_adapter_factory<IteratorType>; + return factory_type::create(first, last); +} + +// Convenience shorthand from container to iterator +// Enables ADL on begin(container) and end(container) +// Encloses the using declarations in namespace for not to leak them to outside scope + +namespace container_input_adapter_factory_impl +{ + +using std::begin; +using std::end; + +template<typename ContainerType, typename Enable = void> +struct container_input_adapter_factory {}; + +template<typename ContainerType> +struct container_input_adapter_factory< ContainerType, + void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>> + { + using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))); + + static adapter_type create(const ContainerType& container) +{ + return input_adapter(begin(container), end(container)); +} + }; + +} // namespace container_input_adapter_factory_impl + +template<typename ContainerType> +typename container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::adapter_type input_adapter(const ContainerType& container) +{ + return container_input_adapter_factory_impl::container_input_adapter_factory<ContainerType>::create(container); +} + +#ifndef JSON_NO_IO +// Special cases with fast paths +inline file_input_adapter input_adapter(std::FILE* file) +{ + return file_input_adapter(file); +} + +inline input_stream_adapter input_adapter(std::istream& stream) +{ + return input_stream_adapter(stream); +} + +inline input_stream_adapter input_adapter(std::istream&& stream) +{ + return input_stream_adapter(stream); +} +#endif // JSON_NO_IO + +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>())); + +// Null-delimited strings, and the like. +template < typename CharT, + typename std::enable_if < + std::is_pointer<CharT>::value&& + !std::is_array<CharT>::value&& + std::is_integral<typename std::remove_pointer<CharT>::type>::value&& + sizeof(typename std::remove_pointer<CharT>::type) == 1, + int >::type = 0 > +contiguous_bytes_input_adapter input_adapter(CharT b) +{ + auto length = std::strlen(reinterpret_cast<const char*>(b)); + const auto* ptr = reinterpret_cast<const char*>(b); + return input_adapter(ptr, ptr + length); +} + +template<typename T, std::size_t N> +auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +{ + return input_adapter(array, array + N); +} + +// This class only handles inputs of input_buffer_adapter type. +// It's required so that expressions like {ptr, len} can be implicitly cast +// to the correct adapter. +class span_input_adapter +{ + public: + template < typename CharT, + typename std::enable_if < + std::is_pointer<CharT>::value&& + std::is_integral<typename std::remove_pointer<CharT>::type>::value&& + sizeof(typename std::remove_pointer<CharT>::type) == 1, + int >::type = 0 > + span_input_adapter(CharT b, std::size_t l) + : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {} + + template<class IteratorType, + typename std::enable_if< + std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value, + int>::type = 0> + span_input_adapter(IteratorType first, IteratorType last) + : ia(input_adapter(first, last)) {} + + contiguous_bytes_input_adapter&& get() + { + return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg) + } + + private: + contiguous_bytes_input_adapter ia; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/input/json_sax.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> +#include <string> // string +#include <utility> // move +#include <vector> // vector + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/*! +@brief SAX interface + +This class describes the SAX interface used by @ref nlohmann::json::sax_parse. +Each function is called in different situations while the input is parsed. The +boolean return value informs the parser whether to continue processing the +input. +*/ +template<typename BasicJsonType> +struct json_sax +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @brief a null value was read + @return whether parsing should proceed + */ + virtual bool null() = 0; + + /*! + @brief a boolean value was read + @param[in] val boolean value + @return whether parsing should proceed + */ + virtual bool boolean(bool val) = 0; + + /*! + @brief an integer number was read + @param[in] val integer value + @return whether parsing should proceed + */ + virtual bool number_integer(number_integer_t val) = 0; + + /*! + @brief an unsigned integer number was read + @param[in] val unsigned integer value + @return whether parsing should proceed + */ + virtual bool number_unsigned(number_unsigned_t val) = 0; + + /*! + @brief a floating-point number was read + @param[in] val floating-point value + @param[in] s raw token value + @return whether parsing should proceed + */ + virtual bool number_float(number_float_t val, const string_t& s) = 0; + + /*! + @brief a string value was read + @param[in] val string value + @return whether parsing should proceed + @note It is safe to move the passed string value. + */ + virtual bool string(string_t& val) = 0; + + /*! + @brief a binary value was read + @param[in] val binary value + @return whether parsing should proceed + @note It is safe to move the passed binary value. + */ + virtual bool binary(binary_t& val) = 0; + + /*! + @brief the beginning of an object was read + @param[in] elements number of object elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_object(std::size_t elements) = 0; + + /*! + @brief an object key was read + @param[in] val object key + @return whether parsing should proceed + @note It is safe to move the passed string. + */ + virtual bool key(string_t& val) = 0; + + /*! + @brief the end of an object was read + @return whether parsing should proceed + */ + virtual bool end_object() = 0; + + /*! + @brief the beginning of an array was read + @param[in] elements number of array elements or -1 if unknown + @return whether parsing should proceed + @note binary formats may report the number of elements + */ + virtual bool start_array(std::size_t elements) = 0; + + /*! + @brief the end of an array was read + @return whether parsing should proceed + */ + virtual bool end_array() = 0; + + /*! + @brief a parse error occurred + @param[in] position the position in the input where the error occurs + @param[in] last_token the last read token + @param[in] ex an exception object describing the error + @return whether parsing should proceed (must return false) + */ + virtual bool parse_error(std::size_t position, + const std::string& last_token, + const detail::exception& ex) = 0; + + json_sax() = default; + json_sax(const json_sax&) = default; + json_sax(json_sax&&) noexcept = default; + json_sax& operator=(const json_sax&) = default; + json_sax& operator=(json_sax&&) noexcept = default; + virtual ~json_sax() = default; +}; + +namespace detail +{ +/*! +@brief SAX implementation to create a JSON value from SAX events + +This class implements the @ref json_sax interface and processes the SAX events +to create a JSON value which makes it basically a DOM parser. The structure or +hierarchy of the JSON value is managed by the stack `ref_stack` which contains +a pointer to the respective array or object for each recursion depth. + +After successful parsing, the value that is passed by reference to the +constructor contains the parsed value. + +@tparam BasicJsonType the JSON type +*/ +template<typename BasicJsonType> +class json_sax_dom_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + /*! + @param[in,out] r reference to a JSON value that is manipulated while + parsing + @param[in] allow_exceptions_ whether parse errors yield exceptions + */ + explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) + : root(r), allow_exceptions(allow_exceptions_) + {} + + // make class move-only + json_sax_dom_parser(const json_sax_dom_parser&) = delete; + json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; + json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_object()); + + // add null at given key and store the reference for later + object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val)); + return true; + } + + bool end_object() + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_object()); + + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + bool start_array(std::size_t len) + { + ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); + + if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool end_array() + { + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(ref_stack.back()->is_array()); + + ref_stack.back()->set_parents(); + ref_stack.pop_back(); + return true; + } + + template<class Exception> + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast<void>(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + */ + template<typename Value> + JSON_HEDLEY_RETURNS_NON_NULL + BasicJsonType* handle_value(Value&& v) + { + if (ref_stack.empty()) + { + root = BasicJsonType(std::forward<Value>(v)); + return &root; + } + + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v)); + return &(ref_stack.back()->m_data.m_value.array->back()); + } + + JSON_ASSERT(ref_stack.back()->is_object()); + JSON_ASSERT(object_element); + *object_element = BasicJsonType(std::forward<Value>(v)); + return object_element; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector<BasicJsonType*> ref_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +template<typename BasicJsonType> +class json_sax_dom_callback_parser +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using parser_callback_t = typename BasicJsonType::parser_callback_t; + using parse_event_t = typename BasicJsonType::parse_event_t; + + json_sax_dom_callback_parser(BasicJsonType& r, + const parser_callback_t cb, + const bool allow_exceptions_ = true) + : root(r), callback(cb), allow_exceptions(allow_exceptions_) + { + keep_stack.push_back(true); + } + + // make class move-only + json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; + json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~json_sax_dom_callback_parser() = default; + + bool null() + { + handle_value(nullptr); + return true; + } + + bool boolean(bool val) + { + handle_value(val); + return true; + } + + bool number_integer(number_integer_t val) + { + handle_value(val); + return true; + } + + bool number_unsigned(number_unsigned_t val) + { + handle_value(val); + return true; + } + + bool number_float(number_float_t val, const string_t& /*unused*/) + { + handle_value(val); + return true; + } + + bool string(string_t& val) + { + handle_value(val); + return true; + } + + bool binary(binary_t& val) + { + handle_value(std::move(val)); + return true; + } + + bool start_object(std::size_t len) + { + // check callback for object start + const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::object, true); + ref_stack.push_back(val.second); + + // check object limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool key(string_t& val) + { + BasicJsonType k = BasicJsonType(val); + + // check callback for key + const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k); + key_keep_stack.push_back(keep); + + // add discarded value at given key and store the reference for later + if (keep && ref_stack.back()) + { + object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded); + } + + return true; + } + + bool end_object() + { + if (ref_stack.back()) + { + if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) + { + // discard object + *ref_stack.back() = discarded; + } + else + { + ref_stack.back()->set_parents(); + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) + { + // remove discarded value + for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) + { + if (it->is_discarded()) + { + ref_stack.back()->erase(it); + break; + } + } + } + + return true; + } + + bool start_array(std::size_t len) + { + const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded); + keep_stack.push_back(keep); + + auto val = handle_value(BasicJsonType::value_t::array, true); + ref_stack.push_back(val.second); + + // check array limit + if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size())) + { + JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back())); + } + + return true; + } + + bool end_array() + { + bool keep = true; + + if (ref_stack.back()) + { + keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); + if (keep) + { + ref_stack.back()->set_parents(); + } + else + { + // discard array + *ref_stack.back() = discarded; + } + } + + JSON_ASSERT(!ref_stack.empty()); + JSON_ASSERT(!keep_stack.empty()); + ref_stack.pop_back(); + keep_stack.pop_back(); + + // remove discarded value + if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) + { + ref_stack.back()->m_data.m_value.array->pop_back(); + } + + return true; + } + + template<class Exception> + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, + const Exception& ex) + { + errored = true; + static_cast<void>(ex); + if (allow_exceptions) + { + JSON_THROW(ex); + } + return false; + } + + constexpr bool is_errored() const + { + return errored; + } + + private: + /*! + @param[in] v value to add to the JSON value we build during parsing + @param[in] skip_callback whether we should skip calling the callback + function; this is required after start_array() and + start_object() SAX events, because otherwise we would call the + callback function with an empty array or object, respectively. + + @invariant If the ref stack is empty, then the passed value will be the new + root. + @invariant If the ref stack contains a value, then it is an array or an + object to which we can add elements + + @return pair of boolean (whether value should be kept) and pointer (to the + passed value in the ref_stack hierarchy; nullptr if not kept) + */ + template<typename Value> + std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false) + { + JSON_ASSERT(!keep_stack.empty()); + + // do not handle this value if we know it would be added to a discarded + // container + if (!keep_stack.back()) + { + return {false, nullptr}; + } + + // create value + auto value = BasicJsonType(std::forward<Value>(v)); + + // check callback + const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value); + + // do not handle this value if we just learnt it shall be discarded + if (!keep) + { + return {false, nullptr}; + } + + if (ref_stack.empty()) + { + root = std::move(value); + return {true, & root}; + } + + // skip this value if we already decided to skip the parent + // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) + if (!ref_stack.back()) + { + return {false, nullptr}; + } + + // we now only expect arrays and objects + JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); + + // array + if (ref_stack.back()->is_array()) + { + ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value)); + return {true, & (ref_stack.back()->m_data.m_value.array->back())}; + } + + // object + JSON_ASSERT(ref_stack.back()->is_object()); + // check if we should store an element for the current key + JSON_ASSERT(!key_keep_stack.empty()); + const bool store_element = key_keep_stack.back(); + key_keep_stack.pop_back(); + + if (!store_element) + { + return {false, nullptr}; + } + + JSON_ASSERT(object_element); + *object_element = std::move(value); + return {true, object_element}; + } + + /// the parsed JSON value + BasicJsonType& root; + /// stack to model hierarchy of values + std::vector<BasicJsonType*> ref_stack {}; + /// stack to manage which values to keep + std::vector<bool> keep_stack {}; + /// stack to manage which object keys to keep + std::vector<bool> key_keep_stack {}; + /// helper to hold the reference for the next object element + BasicJsonType* object_element = nullptr; + /// whether a syntax error occurred + bool errored = false; + /// callback function + const parser_callback_t callback = nullptr; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; + /// a discarded value for the callback + BasicJsonType discarded = BasicJsonType::value_t::discarded; +}; + +template<typename BasicJsonType> +class json_sax_acceptor +{ + public: + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + + bool null() + { + return true; + } + + bool boolean(bool /*unused*/) + { + return true; + } + + bool number_integer(number_integer_t /*unused*/) + { + return true; + } + + bool number_unsigned(number_unsigned_t /*unused*/) + { + return true; + } + + bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) + { + return true; + } + + bool string(string_t& /*unused*/) + { + return true; + } + + bool binary(binary_t& /*unused*/) + { + return true; + } + + bool start_object(std::size_t /*unused*/ = static_cast<std::size_t>(-1)) + { + return true; + } + + bool key(string_t& /*unused*/) + { + return true; + } + + bool end_object() + { + return true; + } + + bool start_array(std::size_t /*unused*/ = static_cast<std::size_t>(-1)) + { + return true; + } + + bool end_array() + { + return true; + } + + bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) + { + return false; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/input/lexer.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <array> // array +#include <clocale> // localeconv +#include <cstddef> // size_t +#include <cstdio> // snprintf +#include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull +#include <initializer_list> // initializer_list +#include <string> // char_traits, string +#include <utility> // move +#include <vector> // vector + +// #include <nlohmann/detail/input/input_adapters.hpp> + +// #include <nlohmann/detail/input/position_t.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////// +// lexer // +/////////// + +template<typename BasicJsonType> +class lexer_base +{ + public: + /// token types for the parser + enum class token_type + { + uninitialized, ///< indicating the scanner is uninitialized + literal_true, ///< the `true` literal + literal_false, ///< the `false` literal + literal_null, ///< the `null` literal + value_string, ///< a string -- use get_string() for actual value + value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value + value_integer, ///< a signed integer -- use get_number_integer() for actual value + value_float, ///< an floating point number -- use get_number_float() for actual value + begin_array, ///< the character for array begin `[` + begin_object, ///< the character for object begin `{` + end_array, ///< the character for array end `]` + end_object, ///< the character for object end `}` + name_separator, ///< the name separator `:` + value_separator, ///< the value separator `,` + parse_error, ///< indicating a parse error + end_of_input, ///< indicating the end of the input buffer + literal_or_value ///< a literal or the begin of a value (only for diagnostics) + }; + + /// return name of values of type token_type (only used for errors) + JSON_HEDLEY_RETURNS_NON_NULL + JSON_HEDLEY_CONST + static const char* token_type_name(const token_type t) noexcept + { + switch (t) + { + case token_type::uninitialized: + return "<uninitialized>"; + case token_type::literal_true: + return "true literal"; + case token_type::literal_false: + return "false literal"; + case token_type::literal_null: + return "null literal"; + case token_type::value_string: + return "string literal"; + case token_type::value_unsigned: + case token_type::value_integer: + case token_type::value_float: + return "number literal"; + case token_type::begin_array: + return "'['"; + case token_type::begin_object: + return "'{'"; + case token_type::end_array: + return "']'"; + case token_type::end_object: + return "'}'"; + case token_type::name_separator: + return "':'"; + case token_type::value_separator: + return "','"; + case token_type::parse_error: + return "<parse error>"; + case token_type::end_of_input: + return "end of input"; + case token_type::literal_or_value: + return "'[', '{', or a literal"; + // LCOV_EXCL_START + default: // catch non-enum values + return "unknown token"; + // LCOV_EXCL_STOP + } + } +}; +/*! +@brief lexical analysis + +This class organizes the lexical analysis during JSON deserialization. +*/ +template<typename BasicJsonType, typename InputAdapterType> +class lexer : public lexer_base<BasicJsonType> +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename char_traits<char_type>::int_type; + + public: + using token_type = typename lexer_base<BasicJsonType>::token_type; + + explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept + : ia(std::move(adapter)) + , ignore_comments(ignore_comments_) + , decimal_point_char(static_cast<char_int_type>(get_decimal_point())) + {} + + // delete because of pointer members + lexer(const lexer&) = delete; + lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + lexer& operator=(lexer&) = delete; + lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~lexer() = default; + + private: + ///////////////////// + // locales + ///////////////////// + + /// return the locale-dependent decimal point + JSON_HEDLEY_PURE + static char get_decimal_point() noexcept + { + const auto* loc = localeconv(); + JSON_ASSERT(loc != nullptr); + return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); + } + + ///////////////////// + // scan functions + ///////////////////// + + /*! + @brief get codepoint from 4 hex characters following `\u` + + For input "\u c1 c2 c3 c4" the codepoint is: + (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 + = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) + + Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' + must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The + conversion is done by subtracting the offset (0x30, 0x37, and 0x57) + between the ASCII value of the character and the desired integer value. + + @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or + non-hex character) + */ + int get_codepoint() + { + // this function only makes sense after reading `\u` + JSON_ASSERT(current == 'u'); + int codepoint = 0; + + const auto factors = { 12u, 8u, 4u, 0u }; + for (const auto factor : factors) + { + get(); + + if (current >= '0' && current <= '9') + { + codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor); + } + else if (current >= 'A' && current <= 'F') + { + codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor); + } + else if (current >= 'a' && current <= 'f') + { + codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor); + } + else + { + return -1; + } + } + + JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); + return codepoint; + } + + /*! + @brief check if the next byte(s) are inside a given range + + Adds the current byte and, for each passed range, reads a new byte and + checks if it is inside the range. If a violation was detected, set up an + error message and return false. Otherwise, return true. + + @param[in] ranges list of integers; interpreted as list of pairs of + inclusive lower and upper bound, respectively + + @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, + 1, 2, or 3 pairs. This precondition is enforced by an assertion. + + @return true if and only if no range violation was detected + */ + bool next_byte_in_range(std::initializer_list<char_int_type> ranges) + { + JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); + add(current); + + for (auto range = ranges.begin(); range != ranges.end(); ++range) + { + get(); + if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) // NOLINT(bugprone-inc-dec-in-conditions) + { + add(current); + } + else + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return false; + } + } + + return true; + } + + /*! + @brief scan a string literal + + This function scans a string according to Sect. 7 of RFC 8259. While + scanning, bytes are escaped and copied into buffer token_buffer. Then the + function returns successfully, token_buffer is *not* null-terminated (as it + may contain \0 bytes), and token_buffer.size() is the number of bytes in the + string. + + @return token_type::value_string if string could be successfully scanned, + token_type::parse_error otherwise + + @note In case of errors, variable error_message contains a textual + description. + */ + token_type scan_string() + { + // reset token_buffer (ignore opening quote) + reset(); + + // we entered the function by reading an open quote + JSON_ASSERT(current == '\"'); + + while (true) + { + // get next character + switch (get()) + { + // end of file while parsing string + case char_traits<char_type>::eof(): + { + error_message = "invalid string: missing closing quote"; + return token_type::parse_error; + } + + // closing quote + case '\"': + { + return token_type::value_string; + } + + // escapes + case '\\': + { + switch (get()) + { + // quotation mark + case '\"': + add('\"'); + break; + // reverse solidus + case '\\': + add('\\'); + break; + // solidus + case '/': + add('/'); + break; + // backspace + case 'b': + add('\b'); + break; + // form feed + case 'f': + add('\f'); + break; + // line feed + case 'n': + add('\n'); + break; + // carriage return + case 'r': + add('\r'); + break; + // tab + case 't': + add('\t'); + break; + + // unicode escapes + case 'u': + { + const int codepoint1 = get_codepoint(); + int codepoint = codepoint1; // start with codepoint1 + + if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if code point is a high surrogate + if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) + { + // expect next \uxxxx entry + if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) + { + const int codepoint2 = get_codepoint(); + + if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) + { + error_message = "invalid string: '\\u' must be followed by 4 hex digits"; + return token_type::parse_error; + } + + // check if codepoint2 is a low surrogate + if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) + { + // overwrite codepoint + codepoint = static_cast<int>( + // high surrogate occupies the most significant 22 bits + (static_cast<unsigned int>(codepoint1) << 10u) + // low surrogate occupies the least significant 15 bits + + static_cast<unsigned int>(codepoint2) + // there is still the 0xD800, 0xDC00 and 0x10000 noise + // in the result, so we have to subtract with: + // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 + - 0x35FDC00u); + } + else + { + // ICU PATCH - See ICU-23090 + codepoint = codepoint1; + } + } + else + { + // ICU PATCH - See ICU-23090 + codepoint = codepoint1; + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) + { + // ICU PATCH - See ICU-23090 + codepoint = codepoint1; + } + } + + // result of the above calculation yields a proper codepoint + JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); + + // translate codepoint into bytes + if (codepoint < 0x80) + { + // 1-byte characters: 0xxxxxxx (ASCII) + add(static_cast<char_int_type>(codepoint)); + } + else if (codepoint <= 0x7FF) + { + // 2-byte characters: 110xxxxx 10xxxxxx + add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u))); + add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu))); + } + else if (codepoint <= 0xFFFF) + { + // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx + add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u))); + add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu))); + add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu))); + } + else + { + // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u))); + add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu))); + add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu))); + add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu))); + } + + break; + } + + // other characters after escape + default: + error_message = "invalid string: forbidden character after backslash"; + return token_type::parse_error; + } + + break; + } + + // invalid control characters + case 0x00: + { + error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; + return token_type::parse_error; + } + + case 0x01: + { + error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; + return token_type::parse_error; + } + + case 0x02: + { + error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; + return token_type::parse_error; + } + + case 0x03: + { + error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; + return token_type::parse_error; + } + + case 0x04: + { + error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; + return token_type::parse_error; + } + + case 0x05: + { + error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; + return token_type::parse_error; + } + + case 0x06: + { + error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; + return token_type::parse_error; + } + + case 0x07: + { + error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; + return token_type::parse_error; + } + + case 0x08: + { + error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; + return token_type::parse_error; + } + + case 0x09: + { + error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; + return token_type::parse_error; + } + + case 0x0A: + { + error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; + return token_type::parse_error; + } + + case 0x0B: + { + error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; + return token_type::parse_error; + } + + case 0x0C: + { + error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; + return token_type::parse_error; + } + + case 0x0D: + { + error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; + return token_type::parse_error; + } + + case 0x0E: + { + error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; + return token_type::parse_error; + } + + case 0x0F: + { + error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; + return token_type::parse_error; + } + + case 0x10: + { + error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; + return token_type::parse_error; + } + + case 0x11: + { + error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; + return token_type::parse_error; + } + + case 0x12: + { + error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; + return token_type::parse_error; + } + + case 0x13: + { + error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; + return token_type::parse_error; + } + + case 0x14: + { + error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; + return token_type::parse_error; + } + + case 0x15: + { + error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; + return token_type::parse_error; + } + + case 0x16: + { + error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; + return token_type::parse_error; + } + + case 0x17: + { + error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; + return token_type::parse_error; + } + + case 0x18: + { + error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; + return token_type::parse_error; + } + + case 0x19: + { + error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; + return token_type::parse_error; + } + + case 0x1A: + { + error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; + return token_type::parse_error; + } + + case 0x1B: + { + error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; + return token_type::parse_error; + } + + case 0x1C: + { + error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; + return token_type::parse_error; + } + + case 0x1D: + { + error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; + return token_type::parse_error; + } + + case 0x1E: + { + error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; + return token_type::parse_error; + } + + case 0x1F: + { + error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; + return token_type::parse_error; + } + + // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) + case 0x20: + case 0x21: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + { + add(current); + break; + } + + // U+0080..U+07FF: bytes C2..DF 80..BF + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + { + if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) + { + return token_type::parse_error; + } + break; + } + + // U+0800..U+0FFF: bytes E0 A0..BF 80..BF + case 0xE0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF + // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xEE: + case 0xEF: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+D000..U+D7FF: bytes ED 80..9F 80..BF + case 0xED: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF + case 0xF0: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF + case 0xF1: + case 0xF2: + case 0xF3: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF + case 0xF4: + { + if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) + { + return token_type::parse_error; + } + break; + } + + // remaining bytes (80..C1 and F5..FF) are ill-formed + default: + { + error_message = "invalid string: ill-formed UTF-8 byte"; + return token_type::parse_error; + } + } + } + } + + /*! + * @brief scan a comment + * @return whether comment could be scanned successfully + */ + bool scan_comment() + { + switch (get()) + { + // single-line comments skip input until a newline or EOF is read + case '/': + { + while (true) + { + switch (get()) + { + case '\n': + case '\r': + case char_traits<char_type>::eof(): + case '\0': + return true; + + default: + break; + } + } + } + + // multi-line comments skip input until */ is read + case '*': + { + while (true) + { + switch (get()) + { + case char_traits<char_type>::eof(): + case '\0': + { + error_message = "invalid comment; missing closing '*/'"; + return false; + } + + case '*': + { + switch (get()) + { + case '/': + return true; + + default: + { + unget(); + continue; + } + } + } + + default: + continue; + } + } + } + + // unexpected character after reading '/' + default: + { + error_message = "invalid comment; expecting '/' or '*' after '/'"; + return false; + } + } + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(float& f, const char* str, char** endptr) noexcept + { + f = std::strtof(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(double& f, const char* str, char** endptr) noexcept + { + f = std::strtod(str, endptr); + } + + JSON_HEDLEY_NON_NULL(2) + static void strtof(long double& f, const char* str, char** endptr) noexcept + { + f = std::strtold(str, endptr); + } + + /*! + @brief scan a number literal + + This function scans a string according to Sect. 6 of RFC 8259. + + The function is realized with a deterministic finite state machine derived + from the grammar described in RFC 8259. Starting in state "init", the + input is read and used to determined the next state. Only state "done" + accepts the number. State "error" is a trap state to model errors. In the + table below, "anything" means any character but the ones listed before. + + state | 0 | 1-9 | e E | + | - | . | anything + ---------|----------|----------|----------|---------|---------|----------|----------- + init | zero | any1 | [error] | [error] | minus | [error] | [error] + minus | zero | any1 | [error] | [error] | [error] | [error] | [error] + zero | done | done | exponent | done | done | decimal1 | done + any1 | any1 | any1 | exponent | done | done | decimal1 | done + decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] + decimal2 | decimal2 | decimal2 | exponent | done | done | done | done + exponent | any2 | any2 | [error] | sign | sign | [error] | [error] + sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] + any2 | any2 | any2 | done | done | done | done | done + + The state machine is realized with one label per state (prefixed with + "scan_number_") and `goto` statements between them. The state machine + contains cycles, but any cycle can be left when EOF is read. Therefore, + the function is guaranteed to terminate. + + During scanning, the read bytes are stored in token_buffer. This string is + then converted to a signed integer, an unsigned integer, or a + floating-point number. + + @return token_type::value_unsigned, token_type::value_integer, or + token_type::value_float if number could be successfully scanned, + token_type::parse_error otherwise + + @note The scanner is independent of the current locale. Internally, the + locale's decimal point is used instead of `.` to work with the + locale-dependent converters. + */ + token_type scan_number() // lgtm [cpp/use-of-goto] + { + // reset token_buffer to store the number's bytes + reset(); + + // the type of the parsed number; initially set to unsigned; will be + // changed if minus sign, decimal point or exponent is read + token_type number_type = token_type::value_unsigned; + + // state (init): we just found out we need to scan a number + switch (current) + { + case '-': + { + add(current); + goto scan_number_minus; + } + + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + // all other characters are rejected outside scan_number() + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + +scan_number_minus: + // state: we just parsed a leading minus sign + number_type = token_type::value_integer; + switch (get()) + { + case '0': + { + add(current); + goto scan_number_zero; + } + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + default: + { + error_message = "invalid number; expected digit after '-'"; + return token_type::parse_error; + } + } + +scan_number_zero: + // state: we just parse a zero (maybe with a leading minus sign) + switch (get()) + { + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_any1: + // state: we just parsed a number 0-9 (maybe with a leading minus sign) + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any1; + } + + case '.': + { + add(decimal_point_char); + goto scan_number_decimal1; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_decimal1: + // state: we just parsed a decimal point + number_type = token_type::value_float; + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + default: + { + error_message = "invalid number; expected digit after '.'"; + return token_type::parse_error; + } + } + +scan_number_decimal2: + // we just parsed at least one number after a decimal point + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_decimal2; + } + + case 'e': + case 'E': + { + add(current); + goto scan_number_exponent; + } + + default: + goto scan_number_done; + } + +scan_number_exponent: + // we just parsed an exponent + number_type = token_type::value_float; + switch (get()) + { + case '+': + case '-': + { + add(current); + goto scan_number_sign; + } + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = + "invalid number; expected '+', '-', or digit after exponent"; + return token_type::parse_error; + } + } + +scan_number_sign: + // we just parsed an exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + { + error_message = "invalid number; expected digit after exponent sign"; + return token_type::parse_error; + } + } + +scan_number_any2: + // we just parsed a number after the exponent or exponent sign + switch (get()) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + add(current); + goto scan_number_any2; + } + + default: + goto scan_number_done; + } + +scan_number_done: + // unget the character after the number (we only read it to know that + // we are done scanning a number) + unget(); + + char* endptr = nullptr; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + errno = 0; + + // try to parse integers first and fall back to floats + if (number_type == token_type::value_unsigned) + { + const auto x = std::strtoull(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_unsigned = static_cast<number_unsigned_t>(x); + if (value_unsigned == x) + { + return token_type::value_unsigned; + } + } + } + else if (number_type == token_type::value_integer) + { + const auto x = std::strtoll(token_buffer.data(), &endptr, 10); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + if (errno == 0) + { + value_integer = static_cast<number_integer_t>(x); + if (value_integer == x) + { + return token_type::value_integer; + } + } + } + + // this code is reached if we parse a floating-point number or if an + // integer conversion above failed + strtof(value_float, token_buffer.data(), &endptr); + + // we checked the number format before + JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); + + return token_type::value_float; + } + + /*! + @param[in] literal_text the literal text to expect + @param[in] length the length of the passed literal text + @param[in] return_type the token type to return on success + */ + JSON_HEDLEY_NON_NULL(2) + token_type scan_literal(const char_type* literal_text, const std::size_t length, + token_type return_type) + { + JSON_ASSERT(char_traits<char_type>::to_char_type(current) == literal_text[0]); + for (std::size_t i = 1; i < length; ++i) + { + if (JSON_HEDLEY_UNLIKELY(char_traits<char_type>::to_char_type(get()) != literal_text[i])) + { + error_message = "invalid literal"; + return token_type::parse_error; + } + } + return return_type; + } + + ///////////////////// + // input management + ///////////////////// + + /// reset token_buffer; current character is beginning of token + void reset() noexcept + { + token_buffer.clear(); + token_string.clear(); + token_string.push_back(char_traits<char_type>::to_char_type(current)); + } + + /* + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a + `char_traits<char>::eof()` in that case. Stores the scanned characters + for use in error messages. + + @return character read from the input + */ + char_int_type get() + { + ++position.chars_read_total; + ++position.chars_read_current_line; + + if (next_unget) + { + // just reset the next_unget variable and work with current + next_unget = false; + } + else + { + current = ia.get_character(); + } + + if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof())) + { + token_string.push_back(char_traits<char_type>::to_char_type(current)); + } + + if (current == '\n') + { + ++position.lines_read; + position.chars_read_current_line = 0; + } + + return current; + } + + /*! + @brief unget current character (read it again on next get) + + We implement unget by setting variable next_unget to true. The input is not + changed - we just simulate ungetting by modifying chars_read_total, + chars_read_current_line, and token_string. The next call to get() will + behave as if the unget character is read again. + */ + void unget() + { + next_unget = true; + + --position.chars_read_total; + + // in case we "unget" a newline, we have to also decrement the lines_read + if (position.chars_read_current_line == 0) + { + if (position.lines_read > 0) + { + --position.lines_read; + } + } + else + { + --position.chars_read_current_line; + } + + if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof())) + { + JSON_ASSERT(!token_string.empty()); + token_string.pop_back(); + } + } + + /// add a character to token_buffer + void add(char_int_type c) + { + token_buffer.push_back(static_cast<typename string_t::value_type>(c)); + } + + public: + ///////////////////// + // value getters + ///////////////////// + + /// return integer value + constexpr number_integer_t get_number_integer() const noexcept + { + return value_integer; + } + + /// return unsigned integer value + constexpr number_unsigned_t get_number_unsigned() const noexcept + { + return value_unsigned; + } + + /// return floating-point value + constexpr number_float_t get_number_float() const noexcept + { + return value_float; + } + + /// return current string value (implicitly resets the token; useful only once) + string_t& get_string() + { + return token_buffer; + } + + ///////////////////// + // diagnostics + ///////////////////// + + /// return position of last read token + constexpr position_t get_position() const noexcept + { + return position; + } + + /// return the last read token (for errors only). Will never contain EOF + /// (an arbitrary value that is not a valid char value, often -1), because + /// 255 may legitimately occur. May contain NUL, which should be escaped. + std::string get_token_string() const + { + // escape control characters + std::string result; + for (const auto c : token_string) + { + if (static_cast<unsigned char>(c) <= '\x1F') + { + // escape control characters + std::array<char, 9> cs{{}}; + static_cast<void>((std::snprintf)(cs.data(), cs.size(), "<U+%.4X>", static_cast<unsigned char>(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + result += cs.data(); + } + else + { + // add character as is + result.push_back(static_cast<std::string::value_type>(c)); + } + } + + return result; + } + + /// return syntax error message + JSON_HEDLEY_RETURNS_NON_NULL + constexpr const char* get_error_message() const noexcept + { + return error_message; + } + + ///////////////////// + // actual scanner + ///////////////////// + + /*! + @brief skip the UTF-8 byte order mark + @return true iff there is no BOM or the correct BOM has been skipped + */ + bool skip_bom() + { + if (get() == 0xEF) + { + // check if we completely parse the BOM + return get() == 0xBB && get() == 0xBF; + } + + // the first character is not the beginning of the BOM; unget it to + // process is later + unget(); + return true; + } + + void skip_whitespace() + { + do + { + get(); + } + while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); + } + + token_type scan() + { + // initially, skip the BOM + if (position.chars_read_total == 0 && !skip_bom()) + { + error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; + return token_type::parse_error; + } + + // read next character and ignore whitespace + skip_whitespace(); + + // ignore comments + while (ignore_comments && current == '/') + { + if (!scan_comment()) + { + return token_type::parse_error; + } + + // skip following whitespace + skip_whitespace(); + } + + switch (current) + { + // structural characters + case '[': + return token_type::begin_array; + case ']': + return token_type::end_array; + case '{': + return token_type::begin_object; + case '}': + return token_type::end_object; + case ':': + return token_type::name_separator; + case ',': + return token_type::value_separator; + + // literals + case 't': + { + std::array<char_type, 4> true_literal = {{static_cast<char_type>('t'), static_cast<char_type>('r'), static_cast<char_type>('u'), static_cast<char_type>('e')}}; + return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); + } + case 'f': + { + std::array<char_type, 5> false_literal = {{static_cast<char_type>('f'), static_cast<char_type>('a'), static_cast<char_type>('l'), static_cast<char_type>('s'), static_cast<char_type>('e')}}; + return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); + } + case 'n': + { + std::array<char_type, 4> null_literal = {{static_cast<char_type>('n'), static_cast<char_type>('u'), static_cast<char_type>('l'), static_cast<char_type>('l')}}; + return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); + } + + // string + case '\"': + return scan_string(); + + // number + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return scan_number(); + + // end of input (the null byte is needed when parsing from + // string literals) + case '\0': + case char_traits<char_type>::eof(): + return token_type::end_of_input; + + // error + default: + error_message = "invalid literal"; + return token_type::parse_error; + } + } + + private: + /// input adapter + InputAdapterType ia; + + /// whether comments should be ignored (true) or signaled as errors (false) + const bool ignore_comments = false; + + /// the current character + char_int_type current = char_traits<char_type>::eof(); + + /// whether the next get() call should just return current + bool next_unget = false; + + /// the start position of the current token + position_t position {}; + + /// raw input token string (for error messages) + std::vector<char_type> token_string {}; + + /// buffer for variable-length tokens (numbers, strings) + string_t token_buffer {}; + + /// a description of occurred lexer errors + const char* error_message = ""; + + // number values + number_integer_t value_integer = 0; + number_unsigned_t value_unsigned = 0; + number_float_t value_float = 0; + + /// the decimal point + const char_int_type decimal_point_char = '.'; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/is_sax.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstdint> // size_t +#include <utility> // declval +#include <string> // string + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/meta/detected.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename T> +using null_function_t = decltype(std::declval<T&>().null()); + +template<typename T> +using boolean_function_t = + decltype(std::declval<T&>().boolean(std::declval<bool>())); + +template<typename T, typename Integer> +using number_integer_function_t = + decltype(std::declval<T&>().number_integer(std::declval<Integer>())); + +template<typename T, typename Unsigned> +using number_unsigned_function_t = + decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>())); + +template<typename T, typename Float, typename String> +using number_float_function_t = decltype(std::declval<T&>().number_float( + std::declval<Float>(), std::declval<const String&>())); + +template<typename T, typename String> +using string_function_t = + decltype(std::declval<T&>().string(std::declval<String&>())); + +template<typename T, typename Binary> +using binary_function_t = + decltype(std::declval<T&>().binary(std::declval<Binary&>())); + +template<typename T> +using start_object_function_t = + decltype(std::declval<T&>().start_object(std::declval<std::size_t>())); + +template<typename T, typename String> +using key_function_t = + decltype(std::declval<T&>().key(std::declval<String&>())); + +template<typename T> +using end_object_function_t = decltype(std::declval<T&>().end_object()); + +template<typename T> +using start_array_function_t = + decltype(std::declval<T&>().start_array(std::declval<std::size_t>())); + +template<typename T> +using end_array_function_t = decltype(std::declval<T&>().end_array()); + +template<typename T, typename Exception> +using parse_error_function_t = decltype(std::declval<T&>().parse_error( + std::declval<std::size_t>(), std::declval<const std::string&>(), + std::declval<const Exception&>())); + +template<typename SAX, typename BasicJsonType> +struct is_sax +{ + private: + static_assert(is_basic_json<BasicJsonType>::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static constexpr bool value = + is_detected_exact<bool, null_function_t, SAX>::value && + is_detected_exact<bool, boolean_function_t, SAX>::value && + is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value && + is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value && + is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value && + is_detected_exact<bool, string_function_t, SAX, string_t>::value && + is_detected_exact<bool, binary_function_t, SAX, binary_t>::value && + is_detected_exact<bool, start_object_function_t, SAX>::value && + is_detected_exact<bool, key_function_t, SAX, string_t>::value && + is_detected_exact<bool, end_object_function_t, SAX>::value && + is_detected_exact<bool, start_array_function_t, SAX>::value && + is_detected_exact<bool, end_array_function_t, SAX>::value && + is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value; +}; + +template<typename SAX, typename BasicJsonType> +struct is_sax_static_asserts +{ + private: + static_assert(is_basic_json<BasicJsonType>::value, + "BasicJsonType must be of type basic_json<...>"); + + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using exception_t = typename BasicJsonType::exception; + + public: + static_assert(is_detected_exact<bool, null_function_t, SAX>::value, + "Missing/invalid function: bool null()"); + static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value, + "Missing/invalid function: bool boolean(bool)"); + static_assert( + is_detected_exact<bool, number_integer_function_t, SAX, + number_integer_t>::value, + "Missing/invalid function: bool number_integer(number_integer_t)"); + static_assert( + is_detected_exact<bool, number_unsigned_function_t, SAX, + number_unsigned_t>::value, + "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); + static_assert(is_detected_exact<bool, number_float_function_t, SAX, + number_float_t, string_t>::value, + "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); + static_assert( + is_detected_exact<bool, string_function_t, SAX, string_t>::value, + "Missing/invalid function: bool string(string_t&)"); + static_assert( + is_detected_exact<bool, binary_function_t, SAX, binary_t>::value, + "Missing/invalid function: bool binary(binary_t&)"); + static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value, + "Missing/invalid function: bool start_object(std::size_t)"); + static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value, + "Missing/invalid function: bool key(string_t&)"); + static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value, + "Missing/invalid function: bool end_object()"); + static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value, + "Missing/invalid function: bool start_array(std::size_t)"); + static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value, + "Missing/invalid function: bool end_array()"); + static_assert( + is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value, + "Missing/invalid function: bool parse_error(std::size_t, const " + "std::string&, const exception&)"); +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// how to treat CBOR tags +enum class cbor_tag_handler_t +{ + error, ///< throw a parse_error exception in case of a tag + ignore, ///< ignore tags + store ///< store tags as binary type +}; + +/*! +@brief determine system byte order + +@return true if and only if system's byte order is little endian + +@note from https://stackoverflow.com/a/1001328/266378 +*/ +static inline bool little_endianness(int num = 1) noexcept +{ + return *reinterpret_cast<char*>(&num) == 1; +} + +/////////////////// +// binary reader // +/////////////////// + +/*! +@brief deserialization of CBOR, MessagePack, and UBJSON values +*/ +template<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType>> +class binary_reader +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using json_sax_t = SAX; + using char_type = typename InputAdapterType::char_type; + using char_int_type = typename char_traits<char_type>::int_type; + + public: + /*! + @brief create a binary reader + + @param[in] adapter input adapter to read from + */ + explicit binary_reader(InputAdapterType&& adapter, const input_format_t format = input_format_t::json) noexcept : ia(std::move(adapter)), input_format(format) + { + (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {}; + } + + // make class move-only + binary_reader(const binary_reader&) = delete; + binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + binary_reader& operator=(const binary_reader&) = delete; + binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor) + ~binary_reader() = default; + + /*! + @param[in] format the binary format to parse + @param[in] sax_ a SAX event processor + @param[in] strict whether to expect the input to be consumed completed + @param[in] tag_handler how to treat CBOR tags + + @return whether parsing was successful + */ + JSON_HEDLEY_NON_NULL(3) + bool sax_parse(const input_format_t format, + json_sax_t* sax_, + const bool strict = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + sax = sax_; + bool result = false; + + switch (format) + { + case input_format_t::bson: + result = parse_bson_internal(); + break; + + case input_format_t::cbor: + result = parse_cbor_internal(true, tag_handler); + break; + + case input_format_t::msgpack: + result = parse_msgpack_internal(); + break; + + case input_format_t::ubjson: + case input_format_t::bjdata: + result = parse_ubjson_internal(); + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + // strict mode: next byte must be EOF + if (result && strict) + { + if (input_format == input_format_t::ubjson || input_format == input_format_t::bjdata) + { + get_ignore_noop(); + } + else + { + get(); + } + + if (JSON_HEDLEY_UNLIKELY(current != char_traits<char_type>::eof())) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read, + exception_message(input_format, concat("expected end of input; last byte: 0x", get_token_string()), "value"), nullptr)); + } + } + + return result; + } + + private: + ////////// + // BSON // + ////////// + + /*! + @brief Reads in a BSON-object and passes it to the SAX-parser. + @return whether a valid BSON-value was passed to the SAX parser + */ + bool parse_bson_internal() + { + std::int32_t document_size{}; + get_number<std::int32_t, true>(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast<std::size_t>(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) + { + return false; + } + + return sax->end_object(); + } + + /*! + @brief Parses a C-style string from the BSON input. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @return `true` if the \x00-byte indicating the end of the string was + encountered before the EOF; false` indicates an unexpected EOF. + */ + bool get_bson_cstr(string_t& result) + { + auto out = std::back_inserter(result); + while (true) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) + { + return false; + } + if (current == 0x00) + { + return true; + } + *out++ = static_cast<typename string_t::value_type>(current); + } + } + + /*! + @brief Parses a zero-terminated string of length @a len from the BSON + input. + @param[in] len The length (including the zero-byte at the end) of the + string to be read. + @param[in,out] result A reference to the string variable where the read + string is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 1 + @return `true` if the string was successfully parsed + */ + template<typename NumberType> + bool get_bson_string(const NumberType len, string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 1)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::bson, concat("string length must be at least 1, is ", std::to_string(len)), "string"), nullptr)); + } + + return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != char_traits<char_type>::eof(); + } + + /*! + @brief Parses a byte array input of length @a len from the BSON input. + @param[in] len The length of the byte array to be read. + @param[in,out] result A reference to the binary variable where the read + array is to be stored. + @tparam NumberType The type of the length @a len + @pre len >= 0 + @return `true` if the byte array was successfully parsed + */ + template<typename NumberType> + bool get_bson_binary(const NumberType len, binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(len < 0)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::bson, concat("byte array length cannot be negative, is ", std::to_string(len)), "binary"), nullptr)); + } + + // All BSON binary values have a subtype + std::uint8_t subtype{}; + get_number<std::uint8_t>(input_format_t::bson, subtype); + result.set_subtype(subtype); + + return get_binary(input_format_t::bson, len, result); + } + + /*! + @brief Read a BSON document element of the given @a element_type. + @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html + @param[in] element_type_parse_position The position in the input stream, + where the `element_type` was read. + @warning Not all BSON element types are supported yet. An unsupported + @a element_type will give rise to a parse_error.114: + Unsupported BSON record type 0x... + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_internal(const char_int_type element_type, + const std::size_t element_type_parse_position) + { + switch (element_type) + { + case 0x01: // double + { + double number{}; + return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 0x02: // string + { + std::int32_t len{}; + string_t value; + return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); + } + + case 0x03: // object + { + return parse_bson_internal(); + } + + case 0x04: // array + { + return parse_bson_array(); + } + + case 0x05: // binary + { + std::int32_t len{}; + binary_t value; + return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); + } + + case 0x08: // boolean + { + return sax->boolean(get() != 0); + } + + case 0x0A: // null + { + return sax->null(); + } + + case 0x10: // int32 + { + std::int32_t value{}; + return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value); + } + + case 0x12: // int64 + { + std::int64_t value{}; + return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value); + } + + default: // anything else not supported (yet) + { + std::array<char, 3> cr{{}}; + static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + const std::string cr_str{cr.data()}; + return sax->parse_error(element_type_parse_position, cr_str, + parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr)); + } + } + } + + /*! + @brief Read a BSON element list (as specified in the BSON-spec) + + The same binary layout is used for objects and arrays, hence it must be + indicated with the argument @a is_array which one is expected + (true --> array, false --> object). + + @param[in] is_array Determines if the element list being read is to be + treated as an object (@a is_array == false), or as an + array (@a is_array == true). + @return whether a valid BSON-object/array was passed to the SAX parser + */ + bool parse_bson_element_list(const bool is_array) + { + string_t key; + + while (auto element_type = get()) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) + { + return false; + } + + const std::size_t element_type_parse_position = chars_read; + if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) + { + return false; + } + + if (!is_array && !sax->key(key)) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) + { + return false; + } + + // get_bson_cstr only appends + key.clear(); + } + + return true; + } + + /*! + @brief Reads an array from the BSON input and passes it to the SAX-parser. + @return whether a valid BSON-array was passed to the SAX parser + */ + bool parse_bson_array() + { + std::int32_t document_size{}; + get_number<std::int32_t, true>(input_format_t::bson, document_size); + + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast<std::size_t>(-1)))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) + { + return false; + } + + return sax->end_array(); + } + + ////////// + // CBOR // + ////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true) or whether the last read character should + be considered instead (false) + @param[in] tag_handler how CBOR tags should be treated + + @return whether a valid CBOR value was passed to the SAX parser + */ + bool parse_cbor_internal(const bool get_char, + const cbor_tag_handler_t tag_handler) + { + switch (get_char ? get() : current) + { + // EOF + case char_traits<char_type>::eof(): + return unexpect_eof(input_format_t::cbor, "value"); + + // Integer 0x00..0x17 (0..23) + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return sax->number_unsigned(static_cast<number_unsigned_t>(current)); + + case 0x18: // Unsigned integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x19: // Unsigned integer (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1A: // Unsigned integer (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + case 0x1B: // Unsigned integer (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); + } + + // Negative integer -1-0x00..-1-0x17 (-1..-24) + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current)); + + case 0x38: // Negative integer (one-byte uint8_t follows) + { + std::uint8_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number); + } + + case 0x39: // Negative integer -1-n (two-byte uint16_t follows) + { + std::uint16_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number); + } + + case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) + { + std::uint32_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number); + } + + case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) + { + std::uint64_t number{}; + return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) + - static_cast<number_integer_t>(number)); + } + + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: // Binary data (one-byte uint8_t for n follows) + case 0x59: // Binary data (two-byte uint16_t for n follow) + case 0x5A: // Binary data (four-byte uint32_t for n follow) + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + case 0x5F: // Binary data (indefinite length) + { + binary_t b; + return get_cbor_binary(b) && sax->binary(b); + } + + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + case 0x7F: // UTF-8 string (indefinite length) + { + string_t s; + return get_cbor_string(s) && sax->string(s); + } + + // array (0x00..0x17 data items follow) + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + return get_cbor_array( + conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler); + + case 0x98: // array (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler); + } + + case 0x99: // array (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler); + } + + case 0x9A: // array (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler); + } + + case 0x9B: // array (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler); + } + + case 0x9F: // array (indefinite length) + return get_cbor_array(static_cast<std::size_t>(-1), tag_handler); + + // map (0x00..0x17 pairs of data items follow) + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + return get_cbor_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler); + + case 0xB8: // map (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler); + } + + case 0xB9: // map (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler); + } + + case 0xBA: // map (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler); + } + + case 0xBB: // map (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler); + } + + case 0xBF: // map (indefinite length) + return get_cbor_object(static_cast<std::size_t>(-1), tag_handler); + + case 0xC6: // tagged item + case 0xC7: + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD8: // tagged item (1 bytes follow) + case 0xD9: // tagged item (2 bytes follow) + case 0xDA: // tagged item (4 bytes follow) + case 0xDB: // tagged item (8 bytes follow) + { + switch (tag_handler) + { + case cbor_tag_handler_t::error: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + + case cbor_tag_handler_t::ignore: + { + // ignore binary subtype + switch (current) + { + case 0xD8: + { + std::uint8_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xD9: + { + std::uint16_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDA: + { + std::uint32_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + case 0xDB: + { + std::uint64_t subtype_to_ignore{}; + get_number(input_format_t::cbor, subtype_to_ignore); + break; + } + default: + break; + } + return parse_cbor_internal(true, tag_handler); + } + + case cbor_tag_handler_t::store: + { + binary_t b; + // use binary subtype and store in binary container + switch (current) + { + case 0xD8: + { + std::uint8_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype)); + break; + } + case 0xD9: + { + std::uint16_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype)); + break; + } + case 0xDA: + { + std::uint32_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype)); + break; + } + case 0xDB: + { + std::uint64_t subtype{}; + get_number(input_format_t::cbor, subtype); + b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype)); + break; + } + default: + return parse_cbor_internal(true, tag_handler); + } + get(); + return get_cbor_binary(b) && sax->binary(b); + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + case 0xF4: // false + return sax->boolean(false); + + case 0xF5: // true + return sax->boolean(true); + + case 0xF6: // null + return sax->null(); + + case 0xF9: // Half-Precision Float (two-byte IEEE 754) + { + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) + { + return false; + } + + const auto byte1 = static_cast<unsigned char>(byte1_raw); + const auto byte2 = static_cast<unsigned char>(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits<double>::infinity() + : std::numeric_limits<double>::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast<number_float_t>(-val) + : static_cast<number_float_t>(val), ""); + } + + case 0xFA: // Single-Precision Float (four-byte IEEE 754) + { + float number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 0xFB: // Double-Precision Float (eight-byte IEEE 754) + { + double number{}; + return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + default: // anything else (0xFF is handled inside the other types) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + } + } + + /*! + @brief reads a CBOR string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + Additionally, CBOR's strings with indefinite lengths are supported. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_cbor_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) + { + return false; + } + + switch (current) + { + // UTF-8 string (0x00..0x17 bytes follow) + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + { + return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result); + } + + case 0x78: // UTF-8 string (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x79: // UTF-8 string (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); + } + + case 0x7F: // UTF-8 string (indefinite length) + { + while (get() != 0xFF) + { + string_t chunk; + if (!get_cbor_string(chunk)) + { + return false; + } + result.append(chunk); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::cbor, concat("expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x", last_token), "string"), nullptr)); + } + } + } + + /*! + @brief reads a CBOR byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into the byte array. + Additionally, CBOR's byte arrays with indefinite lengths are supported. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_cbor_binary(binary_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) + { + return false; + } + + switch (current) + { + // Binary data (0x00..0x17 bytes follow) + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + { + return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result); + } + + case 0x58: // Binary data (one-byte uint8_t for n follows) + { + std::uint8_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x59: // Binary data (two-byte uint16_t for n follow) + { + std::uint16_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5A: // Binary data (four-byte uint32_t for n follow) + { + std::uint32_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5B: // Binary data (eight-byte uint64_t for n follow) + { + std::uint64_t len{}; + return get_number(input_format_t::cbor, len) && + get_binary(input_format_t::cbor, len, result); + } + + case 0x5F: // Binary data (indefinite length) + { + while (get() != 0xFF) + { + binary_t chunk; + if (!get_cbor_binary(chunk)) + { + return false; + } + result.insert(result.end(), chunk.begin(), chunk.end()); + } + return true; + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::cbor, concat("expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x", last_token), "binary"), nullptr)); + } + } + } + + /*! + @param[in] len the length of the array or static_cast<std::size_t>(-1) for an + array of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether array creation completed + */ + bool get_cbor_array(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + if (len != static_cast<std::size_t>(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) + { + return false; + } + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object or static_cast<std::size_t>(-1) for an + object of indefinite size + @param[in] tag_handler how CBOR tags should be treated + @return whether object creation completed + */ + bool get_cbor_object(const std::size_t len, + const cbor_tag_handler_t tag_handler) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + if (len != 0) + { + string_t key; + if (len != static_cast<std::size_t>(-1)) + { + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + else + { + while (get() != 0xFF) + { + if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) + { + return false; + } + key.clear(); + } + } + } + + return sax->end_object(); + } + + ///////////// + // MsgPack // + ///////////// + + /*! + @return whether a valid MessagePack value was passed to the SAX parser + */ + bool parse_msgpack_internal() + { + switch (get()) + { + // EOF + case char_traits<char_type>::eof(): + return unexpect_eof(input_format_t::msgpack, "value"); + + // positive fixint + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + case 0x68: + case 0x69: + case 0x6A: + case 0x6B: + case 0x6C: + case 0x6D: + case 0x6E: + case 0x6F: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + case 0x78: + case 0x79: + case 0x7A: + case 0x7B: + case 0x7C: + case 0x7D: + case 0x7E: + case 0x7F: + return sax->number_unsigned(static_cast<number_unsigned_t>(current)); + + // fixmap + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + case 0x8A: + case 0x8B: + case 0x8C: + case 0x8D: + case 0x8E: + case 0x8F: + return get_msgpack_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu)); + + // fixarray + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9A: + case 0x9B: + case 0x9C: + case 0x9D: + case 0x9E: + case 0x9F: + return get_msgpack_array(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu)); + + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + case 0xD9: // str 8 + case 0xDA: // str 16 + case 0xDB: // str 32 + { + string_t s; + return get_msgpack_string(s) && sax->string(s); + } + + case 0xC0: // nil + return sax->null(); + + case 0xC2: // false + return sax->boolean(false); + + case 0xC3: // true + return sax->boolean(true); + + case 0xC4: // bin 8 + case 0xC5: // bin 16 + case 0xC6: // bin 32 + case 0xC7: // ext 8 + case 0xC8: // ext 16 + case 0xC9: // ext 32 + case 0xD4: // fixext 1 + case 0xD5: // fixext 2 + case 0xD6: // fixext 4 + case 0xD7: // fixext 8 + case 0xD8: // fixext 16 + { + binary_t b; + return get_msgpack_binary(b) && sax->binary(b); + } + + case 0xCA: // float 32 + { + float number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 0xCB: // float 64 + { + double number{}; + return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 0xCC: // uint 8 + { + std::uint8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCD: // uint 16 + { + std::uint16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCE: // uint 32 + { + std::uint32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xCF: // uint 64 + { + std::uint64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); + } + + case 0xD0: // int 8 + { + std::int8_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD1: // int 16 + { + std::int16_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD2: // int 32 + { + std::int32_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xD3: // int 64 + { + std::int64_t number{}; + return get_number(input_format_t::msgpack, number) && sax->number_integer(number); + } + + case 0xDC: // array 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len)); + } + + case 0xDD: // array 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast<std::size_t>(len)); + } + + case 0xDE: // map 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len)); + } + + case 0xDF: // map 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast<std::size_t>(len)); + } + + // negative fixint + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: + return sax->number_integer(static_cast<std::int8_t>(current)); + + default: // anything else + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format_t::msgpack, concat("invalid byte: 0x", last_token), "value"), nullptr)); + } + } + } + + /*! + @brief reads a MessagePack string + + This function first reads starting bytes to determine the expected + string length and then copies this number of bytes into a string. + + @param[out] result created string + + @return whether string creation completed + */ + bool get_msgpack_string(string_t& result) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) + { + return false; + } + + switch (current) + { + // fixstr + case 0xA0: + case 0xA1: + case 0xA2: + case 0xA3: + case 0xA4: + case 0xA5: + case 0xA6: + case 0xA7: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAB: + case 0xAC: + case 0xAD: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + { + return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result); + } + + case 0xD9: // str 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDA: // str 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + case 0xDB: // str 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); + } + + default: + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format_t::msgpack, concat("expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x", last_token), "string"), nullptr)); + } + } + } + + /*! + @brief reads a MessagePack byte array + + This function first reads starting bytes to determine the expected + byte array length and then copies this number of bytes into a byte array. + + @param[out] result created byte array + + @return whether byte array creation completed + */ + bool get_msgpack_binary(binary_t& result) + { + // helper function to set the subtype + auto assign_and_return_true = [&result](std::int8_t subtype) + { + result.set_subtype(static_cast<std::uint8_t>(subtype)); + return true; + }; + + switch (current) + { + case 0xC4: // bin 8 + { + std::uint8_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC5: // bin 16 + { + std::uint16_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC6: // bin 32 + { + std::uint32_t len{}; + return get_number(input_format_t::msgpack, len) && + get_binary(input_format_t::msgpack, len, result); + } + + case 0xC7: // ext 8 + { + std::uint8_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC8: // ext 16 + { + std::uint16_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xC9: // ext 32 + { + std::uint32_t len{}; + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, len) && + get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, len, result) && + assign_and_return_true(subtype); + } + + case 0xD4: // fixext 1 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 1, result) && + assign_and_return_true(subtype); + } + + case 0xD5: // fixext 2 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 2, result) && + assign_and_return_true(subtype); + } + + case 0xD6: // fixext 4 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 4, result) && + assign_and_return_true(subtype); + } + + case 0xD7: // fixext 8 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 8, result) && + assign_and_return_true(subtype); + } + + case 0xD8: // fixext 16 + { + std::int8_t subtype{}; + return get_number(input_format_t::msgpack, subtype) && + get_binary(input_format_t::msgpack, 16, result) && + assign_and_return_true(subtype); + } + + default: // LCOV_EXCL_LINE + return false; // LCOV_EXCL_LINE + } + } + + /*! + @param[in] len the length of the array + @return whether array creation completed + */ + bool get_msgpack_array(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) + { + return false; + } + + for (std::size_t i = 0; i < len; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + } + + return sax->end_array(); + } + + /*! + @param[in] len the length of the object + @return whether object creation completed + */ + bool get_msgpack_object(const std::size_t len) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) + { + return false; + } + + string_t key; + for (std::size_t i = 0; i < len; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) + { + return false; + } + + if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) + { + return false; + } + key.clear(); + } + + return sax->end_object(); + } + + //////////// + // UBJSON // + //////////// + + /*! + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether a valid UBJSON value was passed to the SAX parser + */ + bool parse_ubjson_internal(const bool get_char = true) + { + return get_ubjson_value(get_char ? get_ignore_noop() : current); + } + + /*! + @brief reads a UBJSON string + + This function is either called after reading the 'S' byte explicitly + indicating a string, or in case of an object key where the 'S' byte can be + left out. + + @param[out] result created string + @param[in] get_char whether a new character should be retrieved from the + input (true, default) or whether the last read + character should be considered instead + + @return whether string creation completed + */ + bool get_ubjson_string(string_t& result, const bool get_char = true) + { + if (get_char) + { + get(); // TODO(niels): may we ignore N here? + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) + { + return false; + } + + switch (current) + { + case 'U': + { + std::uint8_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'i': + { + std::int8_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'I': + { + std::int16_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'l': + { + std::int32_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'L': + { + std::int64_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t len{}; + return get_number(input_format, len) && get_string(input_format, len, result); + } + + default: + break; + } + auto last_token = get_token_string(); + std::string message; + + if (input_format != input_format_t::bjdata) + { + message = "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token; + } + else + { + message = "expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x" + last_token; + } + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "string"), nullptr)); + } + + /*! + @param[out] dim an integer vector storing the ND array dimensions + @return whether reading ND array size vector is successful + */ + bool get_ubjson_ndarray_size(std::vector<size_t>& dim) + { + std::pair<std::size_t, char_int_type> size_and_type; + size_t dimlen = 0; + bool no_ndarray = true; + + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, no_ndarray))) + { + return false; + } + + if (size_and_type.first != npos) + { + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, size_and_type.second))) + { + return false; + } + dim.push_back(dimlen); + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray))) + { + return false; + } + dim.push_back(dimlen); + } + } + } + else + { + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, current))) + { + return false; + } + dim.push_back(dimlen); + get_ignore_noop(); + } + } + return true; + } + + /*! + @param[out] result determined size + @param[in,out] is_ndarray for input, `true` means already inside an ndarray vector + or ndarray dimension is not allowed; `false` means ndarray + is allowed; for output, `true` means an ndarray is found; + is_ndarray can only return `true` when its initial value + is `false` + @param[in] prefix type marker if already read, otherwise set to 0 + + @return whether size determination completed + */ + bool get_ubjson_size_value(std::size_t& result, bool& is_ndarray, char_int_type prefix = 0) + { + if (prefix == 0) + { + prefix = get_ignore_noop(); + } + + switch (prefix) + { + case 'U': + { + std::uint8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = static_cast<std::size_t>(number); + return true; + } + + case 'i': + { + std::int8_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast<std::size_t>(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char + return true; + } + + case 'I': + { + std::int16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast<std::size_t>(number); + return true; + } + + case 'l': + { + std::int32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + result = static_cast<std::size_t>(number); + return true; + } + + case 'L': + { + std::int64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (number < 0) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, + exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); + } + if (!value_in_range_of<std::size_t>(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } + result = static_cast<std::size_t>(number); + return true; + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = static_cast<std::size_t>(number); + return true; + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + result = conditional_static_cast<std::size_t>(number); + return true; + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t number{}; + if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) + { + return false; + } + if (!value_in_range_of<std::size_t>(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } + result = detail::conditional_static_cast<std::size_t>(number); + return true; + } + + case '[': + { + if (input_format != input_format_t::bjdata) + { + break; + } + if (is_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimensional vector is not allowed", "size"), nullptr)); + } + std::vector<size_t> dim; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim))) + { + return false; + } + if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector + { + result = dim.at(dim.size() - 1); + return true; + } + if (!dim.empty()) // if ndarray, convert to an object in JData annotated array format + { + for (auto i : dim) // test if any dimension in an ndarray is 0, if so, return a 1D empty container + { + if ( i == 0 ) + { + result = 0; + return true; + } + } + + string_t key = "_ArraySize_"; + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(3) || !sax->key(key) || !sax->start_array(dim.size()))) + { + return false; + } + result = 1; + for (auto i : dim) + { + result *= i; + if (result == 0 || result == npos) // because dim elements shall not have zeros, result = 0 means overflow happened; it also can't be npos as it is used to initialize size in get_ubjson_size_type() + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, "excessive ndarray size caused overflow", "size"), nullptr)); + } + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(static_cast<number_unsigned_t>(i)))) + { + return false; + } + } + is_ndarray = true; + return sax->end_array(); + } + result = 0; + return true; + } + + default: + break; + } + auto last_token = get_token_string(); + std::string message; + + if (input_format != input_format_t::bjdata) + { + message = "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token; + } + else + { + message = "expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x" + last_token; + } + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "size"), nullptr)); + } + + /*! + @brief determine the type and size for a container + + In the optimized UBJSON format, a type and a size can be provided to allow + for a more compact representation. + + @param[out] result pair of the size and the type + @param[in] inside_ndarray whether the parser is parsing an ND array dimensional vector + + @return whether pair creation completed + */ + bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result, bool inside_ndarray = false) + { + result.first = npos; // size + result.second = 0; // type + bool is_ndarray = false; + + get_ignore_noop(); + + if (current == '$') + { + result.second = get(); // must not ignore 'N', because 'N' maybe the type + if (input_format == input_format_t::bjdata + && JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second))) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, concat("marker 0x", last_token, " is not a permitted optimized array type"), "type"), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "type"))) + { + return false; + } + + get_ignore_noop(); + if (JSON_HEDLEY_UNLIKELY(current != '#')) + { + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) + { + return false; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr)); + } + + const bool is_error = get_ubjson_size_value(result.first, is_ndarray); + if (input_format == input_format_t::bjdata && is_ndarray) + { + if (inside_ndarray) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read, + exception_message(input_format, "ndarray can not be recursive", "size"), nullptr)); + } + result.second |= (1 << 8); // use bit 8 to indicate ndarray, all UBJSON and BJData markers should be ASCII letters + } + return is_error; + } + + if (current == '#') + { + const bool is_error = get_ubjson_size_value(result.first, is_ndarray); + if (input_format == input_format_t::bjdata && is_ndarray) + { + return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read, + exception_message(input_format, "ndarray requires both type and size", "size"), nullptr)); + } + return is_error; + } + + return true; + } + + /*! + @param prefix the previously read or set type prefix + @return whether value creation completed + */ + bool get_ubjson_value(const char_int_type prefix) + { + switch (prefix) + { + case char_traits<char_type>::eof(): // EOF + return unexpect_eof(input_format, "value"); + + case 'T': // true + return sax->boolean(true); + case 'F': // false + return sax->boolean(false); + + case 'Z': // null + return sax->null(); + + case 'U': + { + std::uint8_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'i': + { + std::int8_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'I': + { + std::int16_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'l': + { + std::int32_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'L': + { + std::int64_t number{}; + return get_number(input_format, number) && sax->number_integer(number); + } + + case 'u': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint16_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'm': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint32_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'M': + { + if (input_format != input_format_t::bjdata) + { + break; + } + std::uint64_t number{}; + return get_number(input_format, number) && sax->number_unsigned(number); + } + + case 'h': + { + if (input_format != input_format_t::bjdata) + { + break; + } + const auto byte1_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + const auto byte2_raw = get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + + const auto byte1 = static_cast<unsigned char>(byte1_raw); + const auto byte2 = static_cast<unsigned char>(byte2_raw); + + // code from RFC 7049, Appendix D, Figure 3: + // As half-precision floating-point numbers were only added + // to IEEE 754 in 2008, today's programming platforms often + // still only have limited support for them. It is very + // easy to include at least decoding support for them even + // without such support. An example of a small decoder for + // half-precision floating-point numbers in the C language + // is shown in Fig. 3. + const auto half = static_cast<unsigned int>((byte2 << 8u) + byte1); + const double val = [&half] + { + const int exp = (half >> 10u) & 0x1Fu; + const unsigned int mant = half & 0x3FFu; + JSON_ASSERT(0 <= exp&& exp <= 32); + JSON_ASSERT(mant <= 1024); + switch (exp) + { + case 0: + return std::ldexp(mant, -24); + case 31: + return (mant == 0) + ? std::numeric_limits<double>::infinity() + : std::numeric_limits<double>::quiet_NaN(); + default: + return std::ldexp(mant + 1024, exp - 25); + } + }(); + return sax->number_float((half & 0x8000u) != 0 + ? static_cast<number_float_t>(-val) + : static_cast<number_float_t>(val), ""); + } + + case 'd': + { + float number{}; + return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 'D': + { + double number{}; + return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), ""); + } + + case 'H': + { + return get_ubjson_high_precision_number(); + } + + case 'C': // char + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "char"))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(current > 127)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, + exception_message(input_format, concat("byte after 'C' must be in range 0x00..0x7F; last byte: 0x", last_token), "char"), nullptr)); + } + string_t s(1, static_cast<typename string_t::value_type>(current)); + return sax->string(s); + } + + case 'S': // string + { + string_t s; + return get_ubjson_string(s) && sax->string(s); + } + + case '[': // array + return get_ubjson_array(); + + case '{': // object + return get_ubjson_object(); + + default: // anything else + break; + } + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format, "invalid byte: 0x" + last_token, "value"), nullptr)); + } + + /*! + @return whether array creation completed + */ + bool get_ubjson_array() + { + std::pair<std::size_t, char_int_type> size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + // if bit-8 of size_and_type.second is set to 1, encode bjdata ndarray as an object in JData annotated array format (https://github.com/NeuroJSON/jdata): + // {"_ArrayType_" : "typeid", "_ArraySize_" : [n1, n2, ...], "_ArrayData_" : [v1, v2, ...]} + + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) + { + size_and_type.second &= ~(static_cast<char_int_type>(1) << 8); // use bit 8 to indicate ndarray, here we remove the bit to restore the type marker + auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](const bjd_type & p, char_int_type t) + { + return p.first < t; + }); + string_t key = "_ArrayType_"; + if (JSON_HEDLEY_UNLIKELY(it == bjd_types_map.end() || it->first != size_and_type.second)) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, "invalid byte: 0x" + last_token, "type"), nullptr)); + } + + string_t type = it->second; // sax->string() takes a reference + if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(type))) + { + return false; + } + + if (size_and_type.second == 'C') + { + size_and_type.second = 'U'; + } + + key = "_ArrayData_"; + if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->start_array(size_and_type.first) )) + { + return false; + } + + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + + return (sax->end_array() && sax->end_object()); + } + + if (size_and_type.first != npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + if (size_and_type.second != 'N') + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + } + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast<std::size_t>(-1)))) + { + return false; + } + + while (current != ']') + { + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) + { + return false; + } + get_ignore_noop(); + } + } + + return sax->end_array(); + } + + /*! + @return whether object creation completed + */ + bool get_ubjson_object() + { + std::pair<std::size_t, char_int_type> size_and_type; + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) + { + return false; + } + + // do not accept ND-array size in objects in BJData + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) + { + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, + exception_message(input_format, "BJData object does not support ND-array size in optimized format", "object"), nullptr)); + } + + string_t key; + if (size_and_type.first != npos) + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) + { + return false; + } + + if (size_and_type.second != 0) + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) + { + return false; + } + key.clear(); + } + } + else + { + for (std::size_t i = 0; i < size_and_type.first; ++i) + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + key.clear(); + } + } + } + else + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast<std::size_t>(-1)))) + { + return false; + } + + while (current != '}') + { + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) + { + return false; + } + if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) + { + return false; + } + get_ignore_noop(); + key.clear(); + } + } + + return sax->end_object(); + } + + // Note, no reader for UBJSON binary types is implemented because they do + // not exist + + bool get_ubjson_high_precision_number() + { + // get size of following number string + std::size_t size{}; + bool no_ndarray = true; + auto res = get_ubjson_size_value(size, no_ndarray); + if (JSON_HEDLEY_UNLIKELY(!res)) + { + return res; + } + + // get number string + std::vector<char> number_vector; + for (std::size_t i = 0; i < size; ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) + { + return false; + } + number_vector.push_back(static_cast<char>(current)); + } + + // parse number string + using ia_type = decltype(detail::input_adapter(number_vector)); + auto number_lexer = detail::lexer<BasicJsonType, ia_type>(detail::input_adapter(number_vector), false); + const auto result_number = number_lexer.scan(); + const auto number_string = number_lexer.get_token_string(); + const auto result_remainder = number_lexer.scan(); + + using token_type = typename detail::lexer_base<BasicJsonType>::token_type; + + if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) + { + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, + exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr)); + } + + switch (result_number) + { + case token_type::value_integer: + return sax->number_integer(number_lexer.get_number_integer()); + case token_type::value_unsigned: + return sax->number_unsigned(number_lexer.get_number_unsigned()); + case token_type::value_float: + return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); + case token_type::uninitialized: + case token_type::literal_true: + case token_type::literal_false: + case token_type::literal_null: + case token_type::value_string: + case token_type::begin_array: + case token_type::begin_object: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::parse_error: + case token_type::end_of_input: + case token_type::literal_or_value: + default: + return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, + exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr)); + } + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /*! + @brief get next character from the input + + This function provides the interface to the used input adapter. It does + not throw in case the input reached EOF, but returns a -'ve valued + `char_traits<char_type>::eof()` in that case. + + @return character read from the input + */ + char_int_type get() + { + ++chars_read; + return current = ia.get_character(); + } + + /*! + @return character read from the input after ignoring all 'N' entries + */ + char_int_type get_ignore_noop() + { + do + { + get(); + } + while (current == 'N'); + + return current; + } + + /* + @brief read a number from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[out] result number of type @a NumberType + + @return whether conversion completed + + @note This function needs to respect the system's endianness, because + bytes in CBOR, MessagePack, and UBJSON are stored in network order + (big endian) and therefore need reordering on little endian systems. + On the other hand, BSON and BJData use little endian and should reorder + on big endian systems. + */ + template<typename NumberType, bool InputIsLittleEndian = false> + bool get_number(const input_format_t format, NumberType& result) + { + // step 1: read input into array with system's byte order + std::array<std::uint8_t, sizeof(NumberType)> vec{}; + for (std::size_t i = 0; i < sizeof(NumberType); ++i) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) + { + return false; + } + + // reverse byte order prior to conversion if necessary + if (is_little_endian != (InputIsLittleEndian || format == input_format_t::bjdata)) + { + vec[sizeof(NumberType) - i - 1] = static_cast<std::uint8_t>(current); + } + else + { + vec[i] = static_cast<std::uint8_t>(current); // LCOV_EXCL_LINE + } + } + + // step 2: convert array into number of type T and return + std::memcpy(&result, vec.data(), sizeof(NumberType)); + return true; + } + + /*! + @brief create a string by reading characters from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of characters to read + @param[out] result string created by reading @a len bytes + + @return whether string creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of string memory. + */ + template<typename NumberType> + bool get_string(const input_format_t format, + const NumberType len, + string_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) + { + success = false; + break; + } + result.push_back(static_cast<typename string_t::value_type>(current)); + } + return success; + } + + /*! + @brief create a byte array by reading bytes from the input + + @tparam NumberType the type of the number + @param[in] format the current format (for diagnostics) + @param[in] len number of bytes to read + @param[out] result byte array created by reading @a len bytes + + @return whether byte array creation completed + + @note We can not reserve @a len bytes for the result, because @a len + may be too large. Usually, @ref unexpect_eof() detects the end of + the input before we run out of memory. + */ + template<typename NumberType> + bool get_binary(const input_format_t format, + const NumberType len, + binary_t& result) + { + bool success = true; + for (NumberType i = 0; i < len; i++) + { + get(); + if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) + { + success = false; + break; + } + result.push_back(static_cast<std::uint8_t>(current)); + } + return success; + } + + /*! + @param[in] format the current format (for diagnostics) + @param[in] context further context information (for diagnostics) + @return whether the last read character is not EOF + */ + JSON_HEDLEY_NON_NULL(3) + bool unexpect_eof(const input_format_t format, const char* context) const + { + if (JSON_HEDLEY_UNLIKELY(current == char_traits<char_type>::eof())) + { + return sax->parse_error(chars_read, "<end of file>", + parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), nullptr)); + } + return true; + } + + /*! + @return a string representation of the last read byte + */ + std::string get_token_string() const + { + std::array<char, 3> cr{{}}; + static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + return std::string{cr.data()}; + } + + /*! + @param[in] format the current format + @param[in] detail a detailed error message + @param[in] context further context information + @return a message string to use in the parse_error exceptions + */ + std::string exception_message(const input_format_t format, + const std::string& detail, + const std::string& context) const + { + std::string error_msg = "syntax error while parsing "; + + switch (format) + { + case input_format_t::cbor: + error_msg += "CBOR"; + break; + + case input_format_t::msgpack: + error_msg += "MessagePack"; + break; + + case input_format_t::ubjson: + error_msg += "UBJSON"; + break; + + case input_format_t::bson: + error_msg += "BSON"; + break; + + case input_format_t::bjdata: + error_msg += "BJData"; + break; + + case input_format_t::json: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + + return concat(error_msg, ' ', context, ": ", detail); + } + + private: + static JSON_INLINE_VARIABLE constexpr std::size_t npos = static_cast<std::size_t>(-1); + + /// input adapter + InputAdapterType ia; + + /// the current character + char_int_type current = char_traits<char_type>::eof(); + + /// the number of characters read + std::size_t chars_read = 0; + + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// input format + const input_format_t input_format = input_format_t::json; + + /// the SAX parser + json_sax_t* sax = nullptr; + + // excluded markers in bjdata optimized type +#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \ + make_array<char_int_type>('F', 'H', 'N', 'S', 'T', 'Z', '[', '{') + +#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \ + make_array<bjd_type>( \ + bjd_type{'C', "char"}, \ + bjd_type{'D', "double"}, \ + bjd_type{'I', "int16"}, \ + bjd_type{'L', "int64"}, \ + bjd_type{'M', "uint64"}, \ + bjd_type{'U', "uint8"}, \ + bjd_type{'d', "single"}, \ + bjd_type{'i', "int8"}, \ + bjd_type{'l', "int32"}, \ + bjd_type{'m', "uint32"}, \ + bjd_type{'u', "uint16"}) + + JSON_PRIVATE_UNLESS_TESTED: + // lookup tables + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_) bjd_optimized_type_markers = + JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_; + + using bjd_type = std::pair<char_int_type, string_t>; + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map = + JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_; + +#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ +#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ +}; + +#ifndef JSON_HAS_CPP_17 + template<typename BasicJsonType, typename InputAdapterType, typename SAX> + constexpr std::size_t binary_reader<BasicJsonType, InputAdapterType, SAX>::npos; +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/input/input_adapters.hpp> + +// #include <nlohmann/detail/input/lexer.hpp> + +// #include <nlohmann/detail/input/parser.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cmath> // isfinite +#include <cstdint> // uint8_t +#include <functional> // function +#include <string> // string +#include <utility> // move +#include <vector> // vector + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/input/input_adapters.hpp> + +// #include <nlohmann/detail/input/json_sax.hpp> + +// #include <nlohmann/detail/input/lexer.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/is_sax.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +//////////// +// parser // +//////////// + +enum class parse_event_t : std::uint8_t +{ + /// the parser read `{` and started to process a JSON object + object_start, + /// the parser read `}` and finished processing a JSON object + object_end, + /// the parser read `[` and started to process a JSON array + array_start, + /// the parser read `]` and finished processing a JSON array + array_end, + /// the parser read a key of a value in an object + key, + /// the parser finished reading a JSON value + value +}; + +template<typename BasicJsonType> +using parser_callback_t = + std::function<bool(int /*depth*/, parse_event_t /*event*/, BasicJsonType& /*parsed*/)>; + +/*! +@brief syntax analysis + +This class implements a recursive descent parser. +*/ +template<typename BasicJsonType, typename InputAdapterType> +class parser +{ + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using number_float_t = typename BasicJsonType::number_float_t; + using string_t = typename BasicJsonType::string_t; + using lexer_t = lexer<BasicJsonType, InputAdapterType>; + using token_type = typename lexer_t::token_type; + + public: + /// a parser reading from an input adapter + explicit parser(InputAdapterType&& adapter, + const parser_callback_t<BasicJsonType> cb = nullptr, + const bool allow_exceptions_ = true, + const bool skip_comments = false) + : callback(cb) + , m_lexer(std::move(adapter), skip_comments) + , allow_exceptions(allow_exceptions_) + { + // read first token + get_token(); + } + + /*! + @brief public parser interface + + @param[in] strict whether to expect the last token to be EOF + @param[in,out] result parsed JSON value + + @throw parse_error.101 in case of an unexpected token + @throw parse_error.102 if to_unicode fails or surrogate error + @throw parse_error.103 if to_unicode fails + */ + void parse(const bool strict, BasicJsonType& result) + { + if (callback) + { + json_sax_dom_callback_parser<BasicJsonType> sdp(result, callback, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + exception_message(token_type::end_of_input, "value"), nullptr)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + + // set top-level value to null if it was discarded by the callback + // function + if (result.is_discarded()) + { + result = nullptr; + } + } + else + { + json_sax_dom_parser<BasicJsonType> sdp(result, allow_exceptions); + sax_parse_internal(&sdp); + + // in strict mode, input must be completely read + if (strict && (get_token() != token_type::end_of_input)) + { + sdp.parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr)); + } + + // in case of an error, return discarded value + if (sdp.is_errored()) + { + result = value_t::discarded; + return; + } + } + + result.assert_invariant(); + } + + /*! + @brief public accept interface + + @param[in] strict whether to expect the last token to be EOF + @return whether the input is a proper JSON text + */ + bool accept(const bool strict = true) + { + json_sax_acceptor<BasicJsonType> sax_acceptor; + return sax_parse(&sax_acceptor, strict); + } + + template<typename SAX> + JSON_HEDLEY_NON_NULL(2) + bool sax_parse(SAX* sax, const bool strict = true) + { + (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {}; + const bool result = sax_parse_internal(sax); + + // strict mode: next byte must be EOF + if (result && strict && (get_token() != token_type::end_of_input)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr)); + } + + return result; + } + + private: + template<typename SAX> + JSON_HEDLEY_NON_NULL(2) + bool sax_parse_internal(SAX* sax) + { + // stack to remember the hierarchy of structured values we are parsing + // true = array; false = object + std::vector<bool> states; + // value to avoid a goto (see comment where set to true) + bool skip_to_state_evaluation = false; + + while (true) + { + if (!skip_to_state_evaluation) + { + // invariant: get_token() was called before each iteration + switch (last_token) + { + case token_type::begin_object: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_object(static_cast<std::size_t>(-1)))) + { + return false; + } + + // closing } -> we are done + if (get_token() == token_type::end_object) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + break; + } + + // parse key + if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr)); + } + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr)); + } + + // remember we are now inside an object + states.push_back(false); + + // parse values + get_token(); + continue; + } + + case token_type::begin_array: + { + if (JSON_HEDLEY_UNLIKELY(!sax->start_array(static_cast<std::size_t>(-1)))) + { + return false; + } + + // closing ] -> we are done + if (get_token() == token_type::end_array) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + break; + } + + // remember we are now inside an array + states.push_back(true); + + // parse values (no need to call get_token) + continue; + } + + case token_type::value_float: + { + const auto res = m_lexer.get_number_float(); + + if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + out_of_range::create(406, concat("number overflow parsing '", m_lexer.get_token_string(), '\''), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) + { + return false; + } + + break; + } + + case token_type::literal_false: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) + { + return false; + } + break; + } + + case token_type::literal_null: + { + if (JSON_HEDLEY_UNLIKELY(!sax->null())) + { + return false; + } + break; + } + + case token_type::literal_true: + { + if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) + { + return false; + } + break; + } + + case token_type::value_integer: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) + { + return false; + } + break; + } + + case token_type::value_string: + { + if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) + { + return false; + } + break; + } + + case token_type::value_unsigned: + { + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) + { + return false; + } + break; + } + + case token_type::parse_error: + { + // using "uninitialized" to avoid "expected" message + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), nullptr)); + } + case token_type::end_of_input: + { + if (JSON_HEDLEY_UNLIKELY(m_lexer.get_position().chars_read_total == 1)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), + "attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr)); + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr)); + } + case token_type::uninitialized: + case token_type::end_array: + case token_type::end_object: + case token_type::name_separator: + case token_type::value_separator: + case token_type::literal_or_value: + default: // the last token was unexpected + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr)); + } + } + } + else + { + skip_to_state_evaluation = false; + } + + // we reached this line after we successfully parsed a value + if (states.empty()) + { + // empty stack: we reached the end of the hierarchy: done + return true; + } + + if (states.back()) // array + { + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse a new value + get_token(); + continue; + } + + // closing ] + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) + { + return false; + } + + // We are done with this array. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), nullptr)); + } + + // states.back() is false -> object + + // comma -> next value + if (get_token() == token_type::value_separator) + { + // parse key + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr)); + } + + if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) + { + return false; + } + + // parse separator (:) + if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) + { + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr)); + } + + // parse values + get_token(); + continue; + } + + // closing } + if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) + { + if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) + { + return false; + } + + // We are done with this object. Before we can parse a + // new value, we need to evaluate the new state first. + // By setting skip_to_state_evaluation to false, we + // are effectively jumping to the beginning of this if. + JSON_ASSERT(!states.empty()); + states.pop_back(); + skip_to_state_evaluation = true; + continue; + } + + return sax->parse_error(m_lexer.get_position(), + m_lexer.get_token_string(), + parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), nullptr)); + } + } + + /// get next token from lexer + token_type get_token() + { + return last_token = m_lexer.scan(); + } + + std::string exception_message(const token_type expected, const std::string& context) + { + std::string error_msg = "syntax error "; + + if (!context.empty()) + { + error_msg += concat("while parsing ", context, ' '); + } + + error_msg += "- "; + + if (last_token == token_type::parse_error) + { + error_msg += concat(m_lexer.get_error_message(), "; last read: '", + m_lexer.get_token_string(), '\''); + } + else + { + error_msg += concat("unexpected ", lexer_t::token_type_name(last_token)); + } + + if (expected != token_type::uninitialized) + { + error_msg += concat("; expected ", lexer_t::token_type_name(expected)); + } + + return error_msg; + } + + private: + /// callback function + const parser_callback_t<BasicJsonType> callback = nullptr; + /// the type of the last read token + token_type last_token = token_type::uninitialized; + /// the lexer + lexer_t m_lexer; + /// whether to throw exceptions in case of errors + const bool allow_exceptions = true; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/iterators/internal_iterator.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/iterators/primitive_iterator.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> // ptrdiff_t +#include <limits> // numeric_limits + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/* +@brief an iterator for primitive JSON types + +This class models an iterator for primitive JSON types (boolean, number, +string). It's only purpose is to allow the iterator/const_iterator classes +to "iterate" over primitive values. Internally, the iterator is modeled by +a `difference_type` variable. Value begin_value (`0`) models the begin, +end_value (`1`) models past the end. +*/ +class primitive_iterator_t +{ + private: + using difference_type = std::ptrdiff_t; + static constexpr difference_type begin_value = 0; + static constexpr difference_type end_value = begin_value + 1; + + JSON_PRIVATE_UNLESS_TESTED: + /// iterator as signed integer type + difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)(); + + public: + constexpr difference_type get_value() const noexcept + { + return m_it; + } + + /// set iterator to a defined beginning + void set_begin() noexcept + { + m_it = begin_value; + } + + /// set iterator to a defined past the end + void set_end() noexcept + { + m_it = end_value; + } + + /// return whether the iterator can be dereferenced + constexpr bool is_begin() const noexcept + { + return m_it == begin_value; + } + + /// return whether the iterator is at end + constexpr bool is_end() const noexcept + { + return m_it == end_value; + } + + friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it == rhs.m_it; + } + + friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it < rhs.m_it; + } + + primitive_iterator_t operator+(difference_type n) noexcept + { + auto result = *this; + result += n; + return result; + } + + friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept + { + return lhs.m_it - rhs.m_it; + } + + primitive_iterator_t& operator++() noexcept + { + ++m_it; + return *this; + } + + primitive_iterator_t operator++(int)& noexcept // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + ++m_it; + return result; + } + + primitive_iterator_t& operator--() noexcept + { + --m_it; + return *this; + } + + primitive_iterator_t operator--(int)& noexcept // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + --m_it; + return result; + } + + primitive_iterator_t& operator+=(difference_type n) noexcept + { + m_it += n; + return *this; + } + + primitive_iterator_t& operator-=(difference_type n) noexcept + { + m_it -= n; + return *this; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief an iterator value + +@note This structure could easily be a union, but MSVC currently does not allow +unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. +*/ +template<typename BasicJsonType> struct internal_iterator +{ + /// iterator for JSON objects + typename BasicJsonType::object_t::iterator object_iterator {}; + /// iterator for JSON arrays + typename BasicJsonType::array_t::iterator array_iterator {}; + /// generic iterator for all other types + primitive_iterator_t primitive_iterator {}; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/iterators/iter_impl.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next +#include <type_traits> // conditional, is_const, remove_const + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/iterators/internal_iterator.hpp> + +// #include <nlohmann/detail/iterators/primitive_iterator.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// forward declare, to be able to friend it later on +template<typename IteratorType> class iteration_proxy; +template<typename IteratorType> class iteration_proxy_value; + +/*! +@brief a template for a bidirectional iterator for the @ref basic_json class +This class implements a both iterators (iterator and const_iterator) for the +@ref basic_json class. +@note An iterator is called *initialized* when a pointer to a JSON value has + been set (e.g., by a constructor or a copy assignment). If the iterator is + default-constructed, it is *uninitialized* and most methods are undefined. + **The library uses assertions to detect calls on uninitialized iterators.** +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +@since version 1.0.0, simplified in version 2.0.9, change to bidirectional + iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) +*/ +template<typename BasicJsonType> +class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) +{ + /// the iterator with BasicJsonType of different const-ness + using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>; + /// allow basic_json to access private members + friend other_iter_impl; + friend BasicJsonType; + friend iteration_proxy<iter_impl>; + friend iteration_proxy_value<iter_impl>; + + using object_t = typename BasicJsonType::object_t; + using array_t = typename BasicJsonType::array_t; + // make sure BasicJsonType is basic_json or const basic_json + static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value, + "iter_impl only accepts (const) basic_json"); + // superficial check for the LegacyBidirectionalIterator named requirement + static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value + && std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>::value, + "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement."); + + public: + /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. + /// The C++ Standard has never required user-defined iterators to derive from std::iterator. + /// A user-defined iterator should provide publicly accessible typedefs named + /// iterator_category, value_type, difference_type, pointer, and reference. + /// Note that value_type is required to be non-const, even for constant iterators. + using iterator_category = std::bidirectional_iterator_tag; + + /// the type of the values when the iterator is dereferenced + using value_type = typename BasicJsonType::value_type; + /// a type to represent differences between iterators + using difference_type = typename BasicJsonType::difference_type; + /// defines a pointer to the type iterated over (value_type) + using pointer = typename std::conditional<std::is_const<BasicJsonType>::value, + typename BasicJsonType::const_pointer, + typename BasicJsonType::pointer>::type; + /// defines a reference to the type iterated over (value_type) + using reference = + typename std::conditional<std::is_const<BasicJsonType>::value, + typename BasicJsonType::const_reference, + typename BasicJsonType::reference>::type; + + iter_impl() = default; + ~iter_impl() = default; + iter_impl(iter_impl&&) noexcept = default; + iter_impl& operator=(iter_impl&&) noexcept = default; + + /*! + @brief constructor for a given JSON instance + @param[in] object pointer to a JSON object for this iterator + @pre object != nullptr + @post The iterator is initialized; i.e. `m_object != nullptr`. + */ + explicit iter_impl(pointer object) noexcept : m_object(object) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + m_it.object_iterator = typename object_t::iterator(); + break; + } + + case value_t::array: + { + m_it.array_iterator = typename array_t::iterator(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator = primitive_iterator_t(); + break; + } + } + } + + /*! + @note The conventional copy constructor and copy assignment are implicitly + defined. Combined with the following converting constructor and + assignment, they support: (1) copy from iterator to iterator, (2) + copy from const iterator to const iterator, and (3) conversion from + iterator to const iterator. However conversion from const iterator + to iterator is not defined. + */ + + /*! + @brief const copy constructor + @param[in] other const iterator to copy from + @note This copy constructor had to be defined explicitly to circumvent a bug + occurring on msvc v19.0 compiler (VS 2015) debug build. For more + information refer to: https://github.com/nlohmann/json/issues/1608 + */ + iter_impl(const iter_impl<const BasicJsonType>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept + { + if (&other != this) + { + m_object = other.m_object; + m_it = other.m_it; + } + return *this; + } + + /*! + @brief converting constructor + @param[in] other non-const iterator to copy from + @note It is not checked whether @a other is initialized. + */ + iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept + : m_object(other.m_object), m_it(other.m_it) + {} + + /*! + @brief converting assignment + @param[in] other non-const iterator to copy from + @return const/non-const iterator + @note It is not checked whether @a other is initialized. + */ + iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept // NOLINT(cert-oop54-cpp) + { + m_object = other.m_object; + m_it = other.m_it; + return *this; + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief set the iterator to the first value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_begin() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_data.m_value.object->begin(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_data.m_value.array->begin(); + break; + } + + case value_t::null: + { + // set to end so begin()==end() is true: null is empty + m_it.primitive_iterator.set_end(); + break; + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_begin(); + break; + } + } + } + + /*! + @brief set the iterator past the last value + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + void set_end() noexcept + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + m_it.object_iterator = m_object->m_data.m_value.object->end(); + break; + } + + case value_t::array: + { + m_it.array_iterator = m_object->m_data.m_value.array->end(); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator.set_end(); + break; + } + } + } + + public: + /*! + @brief return a reference to the value pointed to by the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator*() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end()); + return m_it.object_iterator->second; + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end()); + return *m_it.array_iterator; + } + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief dereference the iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + pointer operator->() const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end()); + return &(m_it.object_iterator->second); + } + + case value_t::array: + { + JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end()); + return &*m_it.array_iterator; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) + { + return m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief post-increment (it++) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + ++(*this); + return result; + } + + /*! + @brief pre-increment (++it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator++() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, 1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, 1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + ++m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief post-decrement (it--) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp) + { + auto result = *this; + --(*this); + return result; + } + + /*! + @brief pre-decrement (--it) + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator--() + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + { + std::advance(m_it.object_iterator, -1); + break; + } + + case value_t::array: + { + std::advance(m_it.array_iterator, -1); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + --m_it.primitive_iterator; + break; + } + } + + return *this; + } + + /*! + @brief comparison: equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr > + bool operator==(const IterImpl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + return (m_it.object_iterator == other.m_it.object_iterator); + + case value_t::array: + return (m_it.array_iterator == other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator == other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: not equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr > + bool operator!=(const IterImpl& other) const + { + return !operator==(other); + } + + /*! + @brief comparison: smaller + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<(const iter_impl& other) const + { + // if objects are not the same, the comparison is undefined + if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) + { + JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object)); + } + + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object)); + + case value_t::array: + return (m_it.array_iterator < other.m_it.array_iterator); + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return (m_it.primitive_iterator < other.m_it.primitive_iterator); + } + } + + /*! + @brief comparison: less than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator<=(const iter_impl& other) const + { + return !other.operator < (*this); + } + + /*! + @brief comparison: greater than + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>(const iter_impl& other) const + { + return !operator<=(other); + } + + /*! + @brief comparison: greater than or equal + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + bool operator>=(const iter_impl& other) const + { + return !operator<(other); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator+=(difference_type i) + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object)); + + case value_t::array: + { + std::advance(m_it.array_iterator, i); + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + m_it.primitive_iterator += i; + break; + } + } + + return *this; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl& operator-=(difference_type i) + { + return operator+=(-i); + } + + /*! + @brief add to iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator+(difference_type i) const + { + auto result = *this; + result += i; + return result; + } + + /*! + @brief addition of distance and iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + friend iter_impl operator+(difference_type i, const iter_impl& it) + { + auto result = it; + result += i; + return result; + } + + /*! + @brief subtract from iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + iter_impl operator-(difference_type i) const + { + auto result = *this; + result -= i; + return result; + } + + /*! + @brief return difference + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + difference_type operator-(const iter_impl& other) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object)); + + case value_t::array: + return m_it.array_iterator - other.m_it.array_iterator; + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + return m_it.primitive_iterator - other.m_it.primitive_iterator; + } + } + + /*! + @brief access to successor + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference operator[](difference_type n) const + { + JSON_ASSERT(m_object != nullptr); + + switch (m_object->m_data.m_type) + { + case value_t::object: + JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object)); + + case value_t::array: + return *std::next(m_it.array_iterator, n); + + case value_t::null: + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) + { + return *m_object; + } + + JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object)); + } + } + } + + /*! + @brief return the key of an object iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + const typename object_t::key_type& key() const + { + JSON_ASSERT(m_object != nullptr); + + if (JSON_HEDLEY_LIKELY(m_object->is_object())) + { + return m_it.object_iterator->first; + } + + JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", m_object)); + } + + /*! + @brief return the value of an iterator + @pre The iterator is initialized; i.e. `m_object != nullptr`. + */ + reference value() const + { + return operator*(); + } + + JSON_PRIVATE_UNLESS_TESTED: + /// associated JSON instance + pointer m_object = nullptr; + /// the actual iterator of the associated instance + internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {}; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/iterators/iteration_proxy.hpp> + +// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <cstddef> // ptrdiff_t +#include <iterator> // reverse_iterator +#include <utility> // declval + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +////////////////////// +// reverse_iterator // +////////////////////// + +/*! +@brief a template for a reverse iterator class + +@tparam Base the base iterator type to reverse. Valid types are @ref +iterator (to create @ref reverse_iterator) and @ref const_iterator (to +create @ref const_reverse_iterator). + +@requirement The class satisfies the following concept requirements: +- +[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): + The iterator that can be moved can be moved in both directions (i.e. + incremented and decremented). +- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): + It is possible to write to the pointed-to element (only if @a Base is + @ref iterator). + +@since version 1.0.0 +*/ +template<typename Base> +class json_reverse_iterator : public std::reverse_iterator<Base> +{ + public: + using difference_type = std::ptrdiff_t; + /// shortcut to the reverse iterator adapter + using base_iterator = std::reverse_iterator<Base>; + /// the reference type for the pointed-to element + using reference = typename Base::reference; + + /// create reverse iterator from iterator + explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept + : base_iterator(it) {} + + /// create reverse iterator from base class + explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} + + /// post-increment (it++) + json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp) + { + return static_cast<json_reverse_iterator>(base_iterator::operator++(1)); + } + + /// pre-increment (++it) + json_reverse_iterator& operator++() + { + return static_cast<json_reverse_iterator&>(base_iterator::operator++()); + } + + /// post-decrement (it--) + json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp) + { + return static_cast<json_reverse_iterator>(base_iterator::operator--(1)); + } + + /// pre-decrement (--it) + json_reverse_iterator& operator--() + { + return static_cast<json_reverse_iterator&>(base_iterator::operator--()); + } + + /// add to iterator + json_reverse_iterator& operator+=(difference_type i) + { + return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i)); + } + + /// add to iterator + json_reverse_iterator operator+(difference_type i) const + { + return static_cast<json_reverse_iterator>(base_iterator::operator+(i)); + } + + /// subtract from iterator + json_reverse_iterator operator-(difference_type i) const + { + return static_cast<json_reverse_iterator>(base_iterator::operator-(i)); + } + + /// return difference + difference_type operator-(const json_reverse_iterator& other) const + { + return base_iterator(*this) - base_iterator(other); + } + + /// access to successor + reference operator[](difference_type n) const + { + return *(this->operator+(n)); + } + + /// return the key of an object iterator + auto key() const -> decltype(std::declval<Base>().key()) + { + auto it = --this->base(); + return it.key(); + } + + /// return the value of an iterator + reference value() const + { + auto it = --this->base(); + return it.operator * (); + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/iterators/primitive_iterator.hpp> + +// #include <nlohmann/detail/json_custom_base_class.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <type_traits> // conditional, is_same + +// #include <nlohmann/detail/abi_macros.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief Default base class of the @ref basic_json class. + +So that the correct implementations of the copy / move ctors / assign operators +of @ref basic_json do not require complex case distinctions +(no base class / custom base class used as customization point), +@ref basic_json always has a base class. +By default, this class is used because it is empty and thus has no effect +on the behavior of @ref basic_json. +*/ +struct json_default_base {}; + +template<class T> +using json_base_class = typename std::conditional < + std::is_same<T, void>::value, + json_default_base, + T + >::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/json_pointer.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // all_of +#include <cctype> // isdigit +#include <cerrno> // errno, ERANGE +#include <cstdlib> // strtoull +#ifndef JSON_NO_IO + #include <iosfwd> // ostream +#endif // JSON_NO_IO +#include <limits> // max +#include <numeric> // accumulate +#include <string> // string +#include <utility> // move +#include <vector> // vector + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/string_escape.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document +/// @sa https://json.nlohmann.me/api/json_pointer/ +template<typename RefStringType> +class json_pointer +{ + // allow basic_json to access private members + NLOHMANN_BASIC_JSON_TPL_DECLARATION + friend class basic_json; + + template<typename> + friend class json_pointer; + + template<typename T> + struct string_t_helper + { + using type = T; + }; + + NLOHMANN_BASIC_JSON_TPL_DECLARATION + struct string_t_helper<NLOHMANN_BASIC_JSON_TPL> + { + using type = StringType; + }; + + public: + // for backwards compatibility accept BasicJsonType + using string_t = typename string_t_helper<RefStringType>::type; + + /// @brief create JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/json_pointer/ + explicit json_pointer(const string_t& s = "") + : reference_tokens(split(s)) + {} + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/to_string/ + string_t to_string() const + { + return std::accumulate(reference_tokens.begin(), reference_tokens.end(), + string_t{}, + [](const string_t& a, const string_t& b) + { + return detail::concat(a, '/', detail::escape(b)); + }); + } + + /// @brief return a string representation of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string()) + operator string_t() const + { + return to_string(); + } + +#ifndef JSON_NO_IO + /// @brief write string representation of the JSON pointer to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr) + { + o << ptr.to_string(); + return o; + } +#endif + + /// @brief append another JSON pointer at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(const json_pointer& ptr) + { + reference_tokens.insert(reference_tokens.end(), + ptr.reference_tokens.begin(), + ptr.reference_tokens.end()); + return *this; + } + + /// @brief append an unescaped reference token at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(string_t token) + { + push_back(std::move(token)); + return *this; + } + + /// @brief append an array index at the end of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ + json_pointer& operator/=(std::size_t array_idx) + { + return *this /= std::to_string(array_idx); + } + + /// @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, + const json_pointer& rhs) + { + return json_pointer(lhs) /= rhs; + } + + /// @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param) + { + return json_pointer(lhs) /= std::move(token); + } + + /// @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/operator_slash/ + friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) + { + return json_pointer(lhs) /= array_idx; + } + + /// @brief returns the parent of this JSON pointer + /// @sa https://json.nlohmann.me/api/json_pointer/parent_pointer/ + json_pointer parent_pointer() const + { + if (empty()) + { + return *this; + } + + json_pointer res = *this; + res.pop_back(); + return res; + } + + /// @brief remove last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/pop_back/ + void pop_back() + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + reference_tokens.pop_back(); + } + + /// @brief return last reference token + /// @sa https://json.nlohmann.me/api/json_pointer/back/ + const string_t& back() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + return reference_tokens.back(); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(const string_t& token) + { + reference_tokens.push_back(token); + } + + /// @brief append an unescaped token at the end of the reference pointer + /// @sa https://json.nlohmann.me/api/json_pointer/push_back/ + void push_back(string_t&& token) + { + reference_tokens.push_back(std::move(token)); + } + + /// @brief return whether pointer points to the root document + /// @sa https://json.nlohmann.me/api/json_pointer/empty/ + bool empty() const noexcept + { + return reference_tokens.empty(); + } + + private: + /*! + @param[in] s reference token to be converted into an array index + + @return integer representation of @a s + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index begins not with a digit + @throw out_of_range.404 if string @a s could not be converted to an integer + @throw out_of_range.410 if an array index exceeds size_type + */ + template<typename BasicJsonType> + static typename BasicJsonType::size_type array_index(const string_t& s) + { + using size_type = typename BasicJsonType::size_type; + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) + { + JSON_THROW(detail::parse_error::create(106, 0, detail::concat("array index '", s, "' must not begin with '0'"), nullptr)); + } + + // error condition (cf. RFC 6901, Sect. 4) + if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) + { + JSON_THROW(detail::parse_error::create(109, 0, detail::concat("array index '", s, "' is not a number"), nullptr)); + } + + const char* p = s.c_str(); + char* p_end = nullptr; + errno = 0; // strtoull doesn't reset errno + const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int) + if (p == p_end // invalid input or empty string + || errno == ERANGE // out of range + || JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read + { + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", s, "'"), nullptr)); + } + + // only triggered on special platforms (like 32bit), see also + // https://github.com/nlohmann/json/pull/2203 + if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)())) // NOLINT(runtime/int) + { + JSON_THROW(detail::out_of_range::create(410, detail::concat("array index ", s, " exceeds size_type"), nullptr)); // LCOV_EXCL_LINE + } + + return static_cast<size_type>(res); + } + + JSON_PRIVATE_UNLESS_TESTED: + json_pointer top() const + { + if (JSON_HEDLEY_UNLIKELY(empty())) + { + JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr)); + } + + json_pointer result = *this; + result.reference_tokens = {reference_tokens[0]}; + return result; + } + + private: + /*! + @brief create and return a reference to the pointed to value + + @complexity Linear in the number of reference tokens. + + @throw parse_error.109 if array index is not a number + @throw type_error.313 if value cannot be unflattened + */ + template<typename BasicJsonType> + BasicJsonType& get_and_create(BasicJsonType& j) const + { + auto* result = &j; + + // in case no reference tokens exist, return a reference to the JSON value + // j which will be overwritten by a primitive value + for (const auto& reference_token : reference_tokens) + { + switch (result->type()) + { + case detail::value_t::null: + { + if (reference_token == "0") + { + // start a new array if reference token is 0 + result = &result->operator[](0); + } + else + { + // start a new object otherwise + result = &result->operator[](reference_token); + } + break; + } + + case detail::value_t::object: + { + // create an entry in the object + result = &result->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + // create an entry in the array + result = &result->operator[](array_index<BasicJsonType>(reference_token)); + break; + } + + /* + The following code is only reached if there exists a reference + token _and_ the current value is primitive. In this case, we have + an error situation, because primitive values may only occur as + single value; that is, with an empty list of reference tokens. + */ + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", &j)); + } + } + + return *result; + } + + /*! + @brief return a reference to the pointed to value + + @note This version does not throw if a value is not present, but tries to + create nested values instead. For instance, calling this function + with pointer `"/this/that"` on a null value is equivalent to calling + `operator[]("this").operator[]("that")` on that value, effectively + changing the null value to an object. + + @param[in] ptr a JSON value + + @return reference to the JSON value pointed to by the JSON pointer + + @complexity Linear in the length of the JSON pointer. + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template<typename BasicJsonType> + BasicJsonType& get_unchecked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + // convert null values to arrays or objects before continuing + if (ptr->is_null()) + { + // check if reference token is a number + const bool nums = + std::all_of(reference_token.begin(), reference_token.end(), + [](const unsigned char x) + { + return std::isdigit(x); + }); + + // change value to array for numbers or "-" or to object otherwise + *ptr = (nums || reference_token == "-") + ? detail::value_t::array + : detail::value_t::object; + } + + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (reference_token == "-") + { + // explicitly treat "-" as index beyond the end + ptr = &ptr->operator[](ptr->m_data.m_value.array->size()); + } + else + { + // convert array index to number; unchecked access + ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token)); + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template<typename BasicJsonType> + BasicJsonType& get_checked(BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, detail::concat( + "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), + ") is out of range"), ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index<BasicJsonType>(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @brief return a const reference to the pointed to value + + @param[in] ptr a JSON value + + @return const reference to the JSON value pointed to by the JSON + pointer + + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template<typename BasicJsonType> + const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // use unchecked object access + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" cannot be used for const access + JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), ") is out of range"), ptr)); + } + + // use unchecked array access + ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + @throw out_of_range.402 if the array index '-' is used + @throw out_of_range.404 if the JSON pointer can not be resolved + */ + template<typename BasicJsonType> + const BasicJsonType& get_checked(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + // note: at performs range check + ptr = &ptr->at(reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + JSON_THROW(detail::out_of_range::create(402, detail::concat( + "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), + ") is out of range"), ptr)); + } + + // note: at performs range check + ptr = &ptr->at(array_index<BasicJsonType>(reference_token)); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr)); + } + } + + return *ptr; + } + + /*! + @throw parse_error.106 if an array index begins with '0' + @throw parse_error.109 if an array index was not a number + */ + template<typename BasicJsonType> + bool contains(const BasicJsonType* ptr) const + { + for (const auto& reference_token : reference_tokens) + { + switch (ptr->type()) + { + case detail::value_t::object: + { + if (!ptr->contains(reference_token)) + { + // we did not find the key in the object + return false; + } + + ptr = &ptr->operator[](reference_token); + break; + } + + case detail::value_t::array: + { + if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) + { + // "-" always fails the range check + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) + { + // invalid char + return false; + } + if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) + { + if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) + { + // first char should be between '1' and '9' + return false; + } + for (std::size_t i = 1; i < reference_token.size(); i++) + { + if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) + { + // other char should be between '0' and '9' + return false; + } + } + } + + const auto idx = array_index<BasicJsonType>(reference_token); + if (idx >= ptr->size()) + { + // index out of range + return false; + } + + ptr = &ptr->operator[](idx); + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // we do not expect primitive values if there is still a + // reference token to process + return false; + } + } + } + + // no reference token left means we found a primitive value + return true; + } + + /*! + @brief split the string input to reference tokens + + @note This function is only called by the json_pointer constructor. + All exceptions below are documented there. + + @throw parse_error.107 if the pointer is not empty or begins with '/' + @throw parse_error.108 if character '~' is not followed by '0' or '1' + */ + static std::vector<string_t> split(const string_t& reference_string) + { + std::vector<string_t> result; + + // special case: empty reference string -> no reference tokens + if (reference_string.empty()) + { + return result; + } + + // check if nonempty reference string begins with slash + if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) + { + JSON_THROW(detail::parse_error::create(107, 1, detail::concat("JSON pointer must be empty or begin with '/' - was: '", reference_string, "'"), nullptr)); + } + + // extract the reference tokens: + // - slash: position of the last read slash (or end of string) + // - start: position after the previous slash + for ( + // search for the first slash after the first character + std::size_t slash = reference_string.find_first_of('/', 1), + // set the beginning of the first reference token + start = 1; + // we can stop if start == 0 (if slash == string_t::npos) + start != 0; + // set the beginning of the next reference token + // (will eventually be 0 if slash == string_t::npos) + start = (slash == string_t::npos) ? 0 : slash + 1, + // find next slash + slash = reference_string.find_first_of('/', start)) + { + // use the text between the beginning of the reference token + // (start) and the last slash (slash). + auto reference_token = reference_string.substr(start, slash - start); + + // check reference tokens are properly escaped + for (std::size_t pos = reference_token.find_first_of('~'); + pos != string_t::npos; + pos = reference_token.find_first_of('~', pos + 1)) + { + JSON_ASSERT(reference_token[pos] == '~'); + + // ~ must be followed by 0 or 1 + if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || + (reference_token[pos + 1] != '0' && + reference_token[pos + 1] != '1'))) + { + JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", nullptr)); + } + } + + // finally, store the reference token + detail::unescape(reference_token); + result.push_back(reference_token); + } + + return result; + } + + private: + /*! + @param[in] reference_string the reference string to the current value + @param[in] value the value to consider + @param[in,out] result the result object to insert values to + + @note Empty objects or arrays are flattened to `null`. + */ + template<typename BasicJsonType> + static void flatten(const string_t& reference_string, + const BasicJsonType& value, + BasicJsonType& result) + { + switch (value.type()) + { + case detail::value_t::array: + { + if (value.m_data.m_value.array->empty()) + { + // flatten empty array as null + result[reference_string] = nullptr; + } + else + { + // iterate array and use index as reference string + for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i) + { + flatten(detail::concat(reference_string, '/', std::to_string(i)), + value.m_data.m_value.array->operator[](i), result); + } + } + break; + } + + case detail::value_t::object: + { + if (value.m_data.m_value.object->empty()) + { + // flatten empty object as null + result[reference_string] = nullptr; + } + else + { + // iterate object and use keys as reference string + for (const auto& element : *value.m_data.m_value.object) + { + flatten(detail::concat(reference_string, '/', detail::escape(element.first)), element.second, result); + } + } + break; + } + + case detail::value_t::null: + case detail::value_t::string: + case detail::value_t::boolean: + case detail::value_t::number_integer: + case detail::value_t::number_unsigned: + case detail::value_t::number_float: + case detail::value_t::binary: + case detail::value_t::discarded: + default: + { + // add primitive value with its reference string + result[reference_string] = value; + break; + } + } + } + + /*! + @param[in] value flattened JSON + + @return unflattened JSON + + @throw parse_error.109 if array index is not a number + @throw type_error.314 if value is not an object + @throw type_error.315 if object values are not primitive + @throw type_error.313 if value cannot be unflattened + */ + template<typename BasicJsonType> + static BasicJsonType + unflatten(const BasicJsonType& value) + { + if (JSON_HEDLEY_UNLIKELY(!value.is_object())) + { + JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", &value)); + } + + BasicJsonType result; + + // iterate the JSON object values + for (const auto& element : *value.m_data.m_value.object) + { + if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) + { + JSON_THROW(detail::type_error::create(315, "values in object must be primitive", &element.second)); + } + + // assign value to reference pointed to by JSON pointer; Note that if + // the JSON pointer is "" (i.e., points to the whole value), function + // get_and_create returns a reference to result itself. An assignment + // will then create a primitive value. + json_pointer(element.first).get_and_create(result) = element.second; + } + + return result; + } + + // can't use conversion operator because of ambiguity + json_pointer<string_t> convert() const& + { + json_pointer<string_t> result; + result.reference_tokens = reference_tokens; + return result; + } + + json_pointer<string_t> convert()&& + { + json_pointer<string_t> result; + result.reference_tokens = std::move(reference_tokens); + return result; + } + + public: +#if JSON_HAS_THREE_WAY_COMPARISON + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template<typename RefStringTypeRhs> + bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept + { + return reference_tokens == rhs.reference_tokens; + } + + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer)) + bool operator==(const string_t& rhs) const + { + return *this == json_pointer(rhs); + } + + /// @brief 3-way compares two JSON pointers + template<typename RefStringTypeRhs> + std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD* + { + return reference_tokens <=> rhs.reference_tokens; // *NOPAD* + } +#else + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template<typename RefStringTypeLhs, typename RefStringTypeRhs> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept; + + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template<typename RefStringTypeLhs, typename StringType> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs, + const StringType& rhs); + + /// @brief compares string and JSON pointer for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template<typename RefStringTypeRhs, typename StringType> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const StringType& lhs, + const json_pointer<RefStringTypeRhs>& rhs); + + /// @brief compares two JSON pointers for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template<typename RefStringTypeLhs, typename RefStringTypeRhs> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept; + + /// @brief compares JSON pointer and string for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template<typename RefStringTypeLhs, typename StringType> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs, + const StringType& rhs); + + /// @brief compares string and JSON pointer for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template<typename RefStringTypeRhs, typename StringType> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const StringType& lhs, + const json_pointer<RefStringTypeRhs>& rhs); + + /// @brief compares two JSON pointer for less-than + template<typename RefStringTypeLhs, typename RefStringTypeRhs> + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept; +#endif + + private: + /// the reference tokens + std::vector<string_t> reference_tokens; +}; + +#if !JSON_HAS_THREE_WAY_COMPARISON +// functions cannot be defined inside class due to ODR violations +template<typename RefStringTypeLhs, typename RefStringTypeRhs> +inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept +{ + return lhs.reference_tokens == rhs.reference_tokens; +} + +template<typename RefStringTypeLhs, + typename StringType = typename json_pointer<RefStringTypeLhs>::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs, + const StringType& rhs) +{ + return lhs == json_pointer<RefStringTypeLhs>(rhs); +} + +template<typename RefStringTypeRhs, + typename StringType = typename json_pointer<RefStringTypeRhs>::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const StringType& lhs, + const json_pointer<RefStringTypeRhs>& rhs) +{ + return json_pointer<RefStringTypeRhs>(lhs) == rhs; +} + +template<typename RefStringTypeLhs, typename RefStringTypeRhs> +inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept +{ + return !(lhs == rhs); +} + +template<typename RefStringTypeLhs, + typename StringType = typename json_pointer<RefStringTypeLhs>::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs, + const StringType& rhs) +{ + return !(lhs == rhs); +} + +template<typename RefStringTypeRhs, + typename StringType = typename json_pointer<RefStringTypeRhs>::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const StringType& lhs, + const json_pointer<RefStringTypeRhs>& rhs) +{ + return !(lhs == rhs); +} + +template<typename RefStringTypeLhs, typename RefStringTypeRhs> +inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs, + const json_pointer<RefStringTypeRhs>& rhs) noexcept +{ + return lhs.reference_tokens < rhs.reference_tokens; +} +#endif + +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/json_ref.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <initializer_list> +#include <utility> + +// #include <nlohmann/detail/abi_macros.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template<typename BasicJsonType> +class json_ref +{ + public: + using value_type = BasicJsonType; + + json_ref(value_type&& value) + : owned_value(std::move(value)) + {} + + json_ref(const value_type& value) + : value_ref(&value) + {} + + json_ref(std::initializer_list<json_ref> init) + : owned_value(init) + {} + + template < + class... Args, + enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 > + json_ref(Args && ... args) + : owned_value(std::forward<Args>(args)...) + {} + + // class should be movable only + json_ref(json_ref&&) noexcept = default; + json_ref(const json_ref&) = delete; + json_ref& operator=(const json_ref&) = delete; + json_ref& operator=(json_ref&&) = delete; + ~json_ref() = default; + + value_type moved_or_copied() const + { + if (value_ref == nullptr) + { + return std::move(owned_value); + } + return *value_ref; + } + + value_type const& operator*() const + { + return value_ref ? *value_ref : owned_value; + } + + value_type const* operator->() const + { + return &** this; + } + + private: + mutable value_type owned_value = nullptr; + value_type const* value_ref = nullptr; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/string_escape.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + +// #include <nlohmann/detail/output/binary_writer.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // reverse +#include <array> // array +#include <map> // map +#include <cmath> // isnan, isinf +#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t +#include <cstring> // memcpy +#include <limits> // numeric_limits +#include <string> // string +#include <utility> // move +#include <vector> // vector + +// #include <nlohmann/detail/input/binary_reader.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/output/output_adapters.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // copy +#include <cstddef> // size_t +#include <iterator> // back_inserter +#include <memory> // shared_ptr, make_shared +#include <string> // basic_string +#include <vector> // vector + +#ifndef JSON_NO_IO + #include <ios> // streamsize + #include <ostream> // basic_ostream +#endif // JSON_NO_IO + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// abstract output adapter interface +template<typename CharType> struct output_adapter_protocol +{ + virtual void write_character(CharType c) = 0; + virtual void write_characters(const CharType* s, std::size_t length) = 0; + virtual ~output_adapter_protocol() = default; + + output_adapter_protocol() = default; + output_adapter_protocol(const output_adapter_protocol&) = default; + output_adapter_protocol(output_adapter_protocol&&) noexcept = default; + output_adapter_protocol& operator=(const output_adapter_protocol&) = default; + output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default; +}; + +/// a type to simplify interfaces +template<typename CharType> +using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>; + +/// output adapter for byte vectors +template<typename CharType, typename AllocatorType = std::allocator<CharType>> +class output_vector_adapter : public output_adapter_protocol<CharType> +{ + public: + explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept + : v(vec) + {} + + void write_character(CharType c) override + { + v.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + v.insert(v.end(), s, s + length); + } + + private: + std::vector<CharType, AllocatorType>& v; +}; + +#ifndef JSON_NO_IO +/// output adapter for output streams +template<typename CharType> +class output_stream_adapter : public output_adapter_protocol<CharType> +{ + public: + explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept + : stream(s) + {} + + void write_character(CharType c) override + { + stream.put(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + stream.write(s, static_cast<std::streamsize>(length)); + } + + private: + std::basic_ostream<CharType>& stream; +}; +#endif // JSON_NO_IO + +/// output adapter for basic_string +template<typename CharType, typename StringType = std::basic_string<CharType>> +class output_string_adapter : public output_adapter_protocol<CharType> +{ + public: + explicit output_string_adapter(StringType& s) noexcept + : str(s) + {} + + void write_character(CharType c) override + { + str.push_back(c); + } + + JSON_HEDLEY_NON_NULL(2) + void write_characters(const CharType* s, std::size_t length) override + { + str.append(s, length); + } + + private: + StringType& str; +}; + +template<typename CharType, typename StringType = std::basic_string<CharType>> +class output_adapter +{ + public: + template<typename AllocatorType = std::allocator<CharType>> + output_adapter(std::vector<CharType, AllocatorType>& vec) + : oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {} + +#ifndef JSON_NO_IO + output_adapter(std::basic_ostream<CharType>& s) + : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {} +#endif // JSON_NO_IO + + output_adapter(StringType& s) + : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {} + + operator output_adapter_t<CharType>() + { + return oa; + } + + private: + output_adapter_t<CharType> oa = nullptr; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/string_concat.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////// +// binary writer // +/////////////////// + +/*! +@brief serialization to CBOR and MessagePack values +*/ +template<typename BasicJsonType, typename CharType> +class binary_writer +{ + using string_t = typename BasicJsonType::string_t; + using binary_t = typename BasicJsonType::binary_t; + using number_float_t = typename BasicJsonType::number_float_t; + + public: + /*! + @brief create a binary writer + + @param[in] adapter output adapter to write to + */ + explicit binary_writer(output_adapter_t<CharType> adapter) : oa(std::move(adapter)) + { + JSON_ASSERT(oa); + } + + /*! + @param[in] j JSON value to serialize + @pre j.type() == value_t::object + */ + void write_bson(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + { + write_bson_object(*j.m_data.m_value.object); + break; + } + + case value_t::null: + case value_t::array: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + JSON_THROW(type_error::create(317, concat("to serialize to BSON, top-level type must be object, but is ", j.type_name()), &j)); + } + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_cbor(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: + { + oa->write_character(to_char_type(0xF6)); + break; + } + + case value_t::boolean: + { + oa->write_character(j.m_data.m_value.boolean + ? to_char_type(0xF5) + : to_char_type(0xF4)); + break; + } + + case value_t::number_integer: + { + if (j.m_data.m_value.number_integer >= 0) + { + // CBOR does not differentiate between positive signed + // integers and unsigned integers. Therefore, we used the + // code from the value_t::number_unsigned case here. + if (j.m_data.m_value.number_integer <= 0x17) + { + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer)); + } + } + else + { + // The conversions below encode the sign in the first + // byte, and the value is converted to a positive number. + const auto positive_number = -1 - j.m_data.m_value.number_integer; + if (j.m_data.m_value.number_integer >= -24) + { + write_number(static_cast<std::uint8_t>(0x20 + positive_number)); + } + else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x38)); + write_number(static_cast<std::uint8_t>(positive_number)); + } + else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x39)); + write_number(static_cast<std::uint16_t>(positive_number)); + } + else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x3A)); + write_number(static_cast<std::uint32_t>(positive_number)); + } + else + { + oa->write_character(to_char_type(0x3B)); + write_number(static_cast<std::uint64_t>(positive_number)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_data.m_value.number_unsigned <= 0x17) + { + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x18)); + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x19)); + write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_unsigned)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x1A)); + write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_unsigned)); + } + else + { + oa->write_character(to_char_type(0x1B)); + write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_unsigned)); + } + break; + } + + case value_t::number_float: + { + if (std::isnan(j.m_data.m_value.number_float)) + { + // NaN is 0xf97e00 in CBOR + oa->write_character(to_char_type(0xF9)); + oa->write_character(to_char_type(0x7E)); + oa->write_character(to_char_type(0x00)); + } + else if (std::isinf(j.m_data.m_value.number_float)) + { + // Infinity is 0xf97c00, -Infinity is 0xf9fc00 + oa->write_character(to_char_type(0xf9)); + oa->write_character(j.m_data.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); + oa->write_character(to_char_type(0x00)); + } + else + { + write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::cbor); + } + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_data.m_value.string->size(); + if (N <= 0x17) + { + write_number(static_cast<std::uint8_t>(0x60 + N)); + } + else if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x78)); + write_number(static_cast<std::uint8_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x79)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x7A)); + write_number(static_cast<std::uint32_t>(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits<std::uint64_t>::max)()) + { + oa->write_character(to_char_type(0x7B)); + write_number(static_cast<std::uint64_t>(N)); + } + // LCOV_EXCL_STOP + + // step 2: write the string + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()), + j.m_data.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_data.m_value.array->size(); + if (N <= 0x17) + { + write_number(static_cast<std::uint8_t>(0x80 + N)); + } + else if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x98)); + write_number(static_cast<std::uint8_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x99)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x9A)); + write_number(static_cast<std::uint32_t>(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits<std::uint64_t>::max)()) + { + oa->write_character(to_char_type(0x9B)); + write_number(static_cast<std::uint64_t>(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_data.m_value.array) + { + write_cbor(el); + } + break; + } + + case value_t::binary: + { + if (j.m_data.m_value.binary->has_subtype()) + { + if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)()) + { + write_number(static_cast<std::uint8_t>(0xd8)); + write_number(static_cast<std::uint8_t>(j.m_data.m_value.binary->subtype())); + } + else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)()) + { + write_number(static_cast<std::uint8_t>(0xd9)); + write_number(static_cast<std::uint16_t>(j.m_data.m_value.binary->subtype())); + } + else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)()) + { + write_number(static_cast<std::uint8_t>(0xda)); + write_number(static_cast<std::uint32_t>(j.m_data.m_value.binary->subtype())); + } + else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)()) + { + write_number(static_cast<std::uint8_t>(0xdb)); + write_number(static_cast<std::uint64_t>(j.m_data.m_value.binary->subtype())); + } + } + + // step 1: write control byte and the binary array size + const auto N = j.m_data.m_value.binary->size(); + if (N <= 0x17) + { + write_number(static_cast<std::uint8_t>(0x40 + N)); + } + else if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0x58)); + write_number(static_cast<std::uint8_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0x59)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0x5A)); + write_number(static_cast<std::uint32_t>(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits<std::uint64_t>::max)()) + { + oa->write_character(to_char_type(0x5B)); + write_number(static_cast<std::uint64_t>(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_data.m_value.object->size(); + if (N <= 0x17) + { + write_number(static_cast<std::uint8_t>(0xA0 + N)); + } + else if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + oa->write_character(to_char_type(0xB8)); + write_number(static_cast<std::uint8_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + oa->write_character(to_char_type(0xB9)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + oa->write_character(to_char_type(0xBA)); + write_number(static_cast<std::uint32_t>(N)); + } + // LCOV_EXCL_START + else if (N <= (std::numeric_limits<std::uint64_t>::max)()) + { + oa->write_character(to_char_type(0xBB)); + write_number(static_cast<std::uint64_t>(N)); + } + // LCOV_EXCL_STOP + + // step 2: write each element + for (const auto& el : *j.m_data.m_value.object) + { + write_cbor(el.first); + write_cbor(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + */ + void write_msgpack(const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::null: // nil + { + oa->write_character(to_char_type(0xC0)); + break; + } + + case value_t::boolean: // true and false + { + oa->write_character(j.m_data.m_value.boolean + ? to_char_type(0xC3) + : to_char_type(0xC2)); + break; + } + + case value_t::number_integer: + { + if (j.m_data.m_value.number_integer >= 0) + { + // MessagePack does not differentiate between positive + // signed integers and unsigned integers. Therefore, we used + // the code from the value_t::number_unsigned case here. + if (j.m_data.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer)); + } + } + else + { + if (j.m_data.m_value.number_integer >= -32) + { + // negative fixnum + write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() && + j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)()) + { + // int 8 + oa->write_character(to_char_type(0xD0)); + write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() && + j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)()) + { + // int 16 + oa->write_character(to_char_type(0xD1)); + write_number(static_cast<std::int16_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() && + j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)()) + { + // int 32 + oa->write_character(to_char_type(0xD2)); + write_number(static_cast<std::int32_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() && + j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)()) + { + // int 64 + oa->write_character(to_char_type(0xD3)); + write_number(static_cast<std::int64_t>(j.m_data.m_value.number_integer)); + } + } + break; + } + + case value_t::number_unsigned: + { + if (j.m_data.m_value.number_unsigned < 128) + { + // positive fixnum + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) + { + // uint 8 + oa->write_character(to_char_type(0xCC)); + write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) + { + // uint 16 + oa->write_character(to_char_type(0xCD)); + write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) + { + // uint 32 + oa->write_character(to_char_type(0xCE)); + write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer)); + } + else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) + { + // uint 64 + oa->write_character(to_char_type(0xCF)); + write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer)); + } + break; + } + + case value_t::number_float: + { + write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::msgpack); + break; + } + + case value_t::string: + { + // step 1: write control byte and the string length + const auto N = j.m_data.m_value.string->size(); + if (N <= 31) + { + // fixstr + write_number(static_cast<std::uint8_t>(0xA0 | N)); + } + else if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + // str 8 + oa->write_character(to_char_type(0xD9)); + write_number(static_cast<std::uint8_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + // str 16 + oa->write_character(to_char_type(0xDA)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + // str 32 + oa->write_character(to_char_type(0xDB)); + write_number(static_cast<std::uint32_t>(N)); + } + + // step 2: write the string + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()), + j.m_data.m_value.string->size()); + break; + } + + case value_t::array: + { + // step 1: write control byte and the array size + const auto N = j.m_data.m_value.array->size(); + if (N <= 15) + { + // fixarray + write_number(static_cast<std::uint8_t>(0x90 | N)); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + // array 16 + oa->write_character(to_char_type(0xDC)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + // array 32 + oa->write_character(to_char_type(0xDD)); + write_number(static_cast<std::uint32_t>(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_data.m_value.array) + { + write_msgpack(el); + } + break; + } + + case value_t::binary: + { + // step 0: determine if the binary type has a set subtype to + // determine whether or not to use the ext or fixext types + const bool use_ext = j.m_data.m_value.binary->has_subtype(); + + // step 1: write control byte and the byte string length + const auto N = j.m_data.m_value.binary->size(); + if (N <= (std::numeric_limits<std::uint8_t>::max)()) + { + std::uint8_t output_type{}; + bool fixed = true; + if (use_ext) + { + switch (N) + { + case 1: + output_type = 0xD4; // fixext 1 + break; + case 2: + output_type = 0xD5; // fixext 2 + break; + case 4: + output_type = 0xD6; // fixext 4 + break; + case 8: + output_type = 0xD7; // fixext 8 + break; + case 16: + output_type = 0xD8; // fixext 16 + break; + default: + output_type = 0xC7; // ext 8 + fixed = false; + break; + } + + } + else + { + output_type = 0xC4; // bin 8 + fixed = false; + } + + oa->write_character(to_char_type(output_type)); + if (!fixed) + { + write_number(static_cast<std::uint8_t>(N)); + } + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + const std::uint8_t output_type = use_ext + ? 0xC8 // ext 16 + : 0xC5; // bin 16 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + const std::uint8_t output_type = use_ext + ? 0xC9 // ext 32 + : 0xC6; // bin 32 + + oa->write_character(to_char_type(output_type)); + write_number(static_cast<std::uint32_t>(N)); + } + + // step 1.5: if this is an ext type, write the subtype + if (use_ext) + { + write_number(static_cast<std::int8_t>(j.m_data.m_value.binary->subtype())); + } + + // step 2: write the byte string + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()), + N); + + break; + } + + case value_t::object: + { + // step 1: write control byte and the object size + const auto N = j.m_data.m_value.object->size(); + if (N <= 15) + { + // fixmap + write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF))); + } + else if (N <= (std::numeric_limits<std::uint16_t>::max)()) + { + // map 16 + oa->write_character(to_char_type(0xDE)); + write_number(static_cast<std::uint16_t>(N)); + } + else if (N <= (std::numeric_limits<std::uint32_t>::max)()) + { + // map 32 + oa->write_character(to_char_type(0xDF)); + write_number(static_cast<std::uint32_t>(N)); + } + + // step 2: write each element + for (const auto& el : *j.m_data.m_value.object) + { + write_msgpack(el.first); + write_msgpack(el.second); + } + break; + } + + case value_t::discarded: + default: + break; + } + } + + /*! + @param[in] j JSON value to serialize + @param[in] use_count whether to use '#' prefixes (optimized format) + @param[in] use_type whether to use '$' prefixes (optimized format) + @param[in] add_prefix whether prefixes need to be used for this value + @param[in] use_bjdata whether write in BJData format, default is false + */ + void write_ubjson(const BasicJsonType& j, const bool use_count, + const bool use_type, const bool add_prefix = true, + const bool use_bjdata = false) + { + switch (j.type()) + { + case value_t::null: + { + if (add_prefix) + { + oa->write_character(to_char_type('Z')); + } + break; + } + + case value_t::boolean: + { + if (add_prefix) + { + oa->write_character(j.m_data.m_value.boolean + ? to_char_type('T') + : to_char_type('F')); + } + break; + } + + case value_t::number_integer: + { + write_number_with_ubjson_prefix(j.m_data.m_value.number_integer, add_prefix, use_bjdata); + break; + } + + case value_t::number_unsigned: + { + write_number_with_ubjson_prefix(j.m_data.m_value.number_unsigned, add_prefix, use_bjdata); + break; + } + + case value_t::number_float: + { + write_number_with_ubjson_prefix(j.m_data.m_value.number_float, add_prefix, use_bjdata); + break; + } + + case value_t::string: + { + if (add_prefix) + { + oa->write_character(to_char_type('S')); + } + write_number_with_ubjson_prefix(j.m_data.m_value.string->size(), true, use_bjdata); + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()), + j.m_data.m_value.string->size()); + break; + } + + case value_t::array: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + bool prefix_required = true; + if (use_type && !j.m_data.m_value.array->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata); + const bool same_prefix = std::all_of(j.begin() + 1, j.end(), + [this, first_prefix, use_bjdata](const BasicJsonType & v) + { + return ubjson_prefix(v, use_bjdata) == first_prefix; + }); + + std::vector<CharType> bjdx = {'[', '{', 'S', 'H', 'T', 'F', 'N', 'Z'}; // excluded markers in bjdata optimized type + + if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end())) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_data.m_value.array->size(), true, use_bjdata); + } + + for (const auto& el : *j.m_data.m_value.array) + { + write_ubjson(el, use_count, use_type, prefix_required, use_bjdata); + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::binary: + { + if (add_prefix) + { + oa->write_character(to_char_type('[')); + } + + if (use_type && !j.m_data.m_value.binary->empty()) + { + JSON_ASSERT(use_count); + oa->write_character(to_char_type('$')); + oa->write_character('U'); + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_data.m_value.binary->size(), true, use_bjdata); + } + + if (use_type) + { + oa->write_characters( + reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()), + j.m_data.m_value.binary->size()); + } + else + { + for (size_t i = 0; i < j.m_data.m_value.binary->size(); ++i) + { + oa->write_character(to_char_type('U')); + oa->write_character(j.m_data.m_value.binary->data()[i]); + } + } + + if (!use_count) + { + oa->write_character(to_char_type(']')); + } + + break; + } + + case value_t::object: + { + if (use_bjdata && j.m_data.m_value.object->size() == 3 && j.m_data.m_value.object->find("_ArrayType_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArraySize_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArrayData_") != j.m_data.m_value.object->end()) + { + if (!write_bjdata_ndarray(*j.m_data.m_value.object, use_count, use_type)) // decode bjdata ndarray in the JData format (https://github.com/NeuroJSON/jdata) + { + break; + } + } + + if (add_prefix) + { + oa->write_character(to_char_type('{')); + } + + bool prefix_required = true; + if (use_type && !j.m_data.m_value.object->empty()) + { + JSON_ASSERT(use_count); + const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata); + const bool same_prefix = std::all_of(j.begin(), j.end(), + [this, first_prefix, use_bjdata](const BasicJsonType & v) + { + return ubjson_prefix(v, use_bjdata) == first_prefix; + }); + + std::vector<CharType> bjdx = {'[', '{', 'S', 'H', 'T', 'F', 'N', 'Z'}; // excluded markers in bjdata optimized type + + if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end())) + { + prefix_required = false; + oa->write_character(to_char_type('$')); + oa->write_character(first_prefix); + } + } + + if (use_count) + { + oa->write_character(to_char_type('#')); + write_number_with_ubjson_prefix(j.m_data.m_value.object->size(), true, use_bjdata); + } + + for (const auto& el : *j.m_data.m_value.object) + { + write_number_with_ubjson_prefix(el.first.size(), true, use_bjdata); + oa->write_characters( + reinterpret_cast<const CharType*>(el.first.c_str()), + el.first.size()); + write_ubjson(el.second, use_count, use_type, prefix_required, use_bjdata); + } + + if (!use_count) + { + oa->write_character(to_char_type('}')); + } + + break; + } + + case value_t::discarded: + default: + break; + } + } + + private: + ////////// + // BSON // + ////////// + + /*! + @return The size of a BSON document entry header, including the id marker + and the entry name size (and its null-terminator). + */ + static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) + { + const auto it = name.find(static_cast<typename string_t::value_type>(0)); + if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) + { + JSON_THROW(out_of_range::create(409, concat("BSON key cannot contain code point U+0000 (at byte ", std::to_string(it), ")"), &j)); + static_cast<void>(j); + } + + return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; + } + + /*! + @brief Writes the given @a element_type and @a name to the output adapter + */ + void write_bson_entry_header(const string_t& name, + const std::uint8_t element_type) + { + oa->write_character(to_char_type(element_type)); // boolean + oa->write_characters( + reinterpret_cast<const CharType*>(name.c_str()), + name.size() + 1u); + } + + /*! + @brief Writes a BSON element with key @a name and boolean value @a value + */ + void write_bson_boolean(const string_t& name, + const bool value) + { + write_bson_entry_header(name, 0x08); + oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and double value @a value + */ + void write_bson_double(const string_t& name, + const double value) + { + write_bson_entry_header(name, 0x01); + write_number<double>(value, true); + } + + /*! + @return The size of the BSON-encoded string in @a value + */ + static std::size_t calc_bson_string_size(const string_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and string value @a value + */ + void write_bson_string(const string_t& name, + const string_t& value) + { + write_bson_entry_header(name, 0x02); + + write_number<std::int32_t>(static_cast<std::int32_t>(value.size() + 1ul), true); + oa->write_characters( + reinterpret_cast<const CharType*>(value.c_str()), + value.size() + 1); + } + + /*! + @brief Writes a BSON element with key @a name and null value + */ + void write_bson_null(const string_t& name) + { + write_bson_entry_header(name, 0x0A); + } + + /*! + @return The size of the BSON-encoded integer @a value + */ + static std::size_t calc_bson_integer_size(const std::int64_t value) + { + return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)() + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and integer @a value + */ + void write_bson_integer(const string_t& name, + const std::int64_t value) + { + if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()) + { + write_bson_entry_header(name, 0x10); // int32 + write_number<std::int32_t>(static_cast<std::int32_t>(value), true); + } + else + { + write_bson_entry_header(name, 0x12); // int64 + write_number<std::int64_t>(static_cast<std::int64_t>(value), true); + } + } + + /*! + @return The size of the BSON-encoded unsigned integer in @a j + */ + static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept + { + return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) + ? sizeof(std::int32_t) + : sizeof(std::int64_t); + } + + /*! + @brief Writes a BSON element with key @a name and unsigned @a value + */ + void write_bson_unsigned(const string_t& name, + const BasicJsonType& j) + { + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) + { + write_bson_entry_header(name, 0x10 /* int32 */); + write_number<std::int32_t>(static_cast<std::int32_t>(j.m_data.m_value.number_unsigned), true); + } + else if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) + { + write_bson_entry_header(name, 0x12 /* int64 */); + write_number<std::int64_t>(static_cast<std::int64_t>(j.m_data.m_value.number_unsigned), true); + } + else + { + JSON_THROW(out_of_range::create(407, concat("integer number ", std::to_string(j.m_data.m_value.number_unsigned), " cannot be represented by BSON as it does not fit int64"), &j)); + } + } + + /*! + @brief Writes a BSON element with key @a name and object @a value + */ + void write_bson_object_entry(const string_t& name, + const typename BasicJsonType::object_t& value) + { + write_bson_entry_header(name, 0x03); // object + write_bson_object(value); + } + + /*! + @return The size of the BSON-encoded array @a value + */ + static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) + { + std::size_t array_index = 0ul; + + const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast<std::size_t>(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) + { + return result + calc_bson_element_size(std::to_string(array_index++), el); + }); + + return sizeof(std::int32_t) + embedded_document_size + 1ul; + } + + /*! + @return The size of the BSON-encoded binary array @a value + */ + static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) + { + return sizeof(std::int32_t) + value.size() + 1ul; + } + + /*! + @brief Writes a BSON element with key @a name and array @a value + */ + void write_bson_array(const string_t& name, + const typename BasicJsonType::array_t& value) + { + write_bson_entry_header(name, 0x04); // array + write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_array_size(value)), true); + + std::size_t array_index = 0ul; + + for (const auto& el : value) + { + write_bson_element(std::to_string(array_index++), el); + } + + oa->write_character(to_char_type(0x00)); + } + + /*! + @brief Writes a BSON element with key @a name and binary value @a value + */ + void write_bson_binary(const string_t& name, + const binary_t& value) + { + write_bson_entry_header(name, 0x05); + + write_number<std::int32_t>(static_cast<std::int32_t>(value.size()), true); + write_number(value.has_subtype() ? static_cast<std::uint8_t>(value.subtype()) : static_cast<std::uint8_t>(0x00)); + + oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size()); + } + + /*! + @brief Calculates the size necessary to serialize the JSON value @a j with its @a name + @return The calculated size for the BSON document entry for @a j with the given @a name. + */ + static std::size_t calc_bson_element_size(const string_t& name, + const BasicJsonType& j) + { + const auto header_size = calc_bson_entry_header_size(name, j); + switch (j.type()) + { + case value_t::object: + return header_size + calc_bson_object_size(*j.m_data.m_value.object); + + case value_t::array: + return header_size + calc_bson_array_size(*j.m_data.m_value.array); + + case value_t::binary: + return header_size + calc_bson_binary_size(*j.m_data.m_value.binary); + + case value_t::boolean: + return header_size + 1ul; + + case value_t::number_float: + return header_size + 8ul; + + case value_t::number_integer: + return header_size + calc_bson_integer_size(j.m_data.m_value.number_integer); + + case value_t::number_unsigned: + return header_size + calc_bson_unsigned_size(j.m_data.m_value.number_unsigned); + + case value_t::string: + return header_size + calc_bson_string_size(*j.m_data.m_value.string); + + case value_t::null: + return header_size + 0ul; + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return 0ul; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Serializes the JSON value @a j to BSON and associates it with the + key @a name. + @param name The name to associate with the JSON entity @a j within the + current BSON document + */ + void write_bson_element(const string_t& name, + const BasicJsonType& j) + { + switch (j.type()) + { + case value_t::object: + return write_bson_object_entry(name, *j.m_data.m_value.object); + + case value_t::array: + return write_bson_array(name, *j.m_data.m_value.array); + + case value_t::binary: + return write_bson_binary(name, *j.m_data.m_value.binary); + + case value_t::boolean: + return write_bson_boolean(name, j.m_data.m_value.boolean); + + case value_t::number_float: + return write_bson_double(name, j.m_data.m_value.number_float); + + case value_t::number_integer: + return write_bson_integer(name, j.m_data.m_value.number_integer); + + case value_t::number_unsigned: + return write_bson_unsigned(name, j); + + case value_t::string: + return write_bson_string(name, *j.m_data.m_value.string); + + case value_t::null: + return write_bson_null(name); + + // LCOV_EXCL_START + case value_t::discarded: + default: + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) + return; + // LCOV_EXCL_STOP + } + } + + /*! + @brief Calculates the size of the BSON serialization of the given + JSON-object @a j. + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) + { + const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0), + [](size_t result, const typename BasicJsonType::object_t::value_type & el) + { + return result += calc_bson_element_size(el.first, el.second); + }); + + return sizeof(std::int32_t) + document_size + 1ul; + } + + /*! + @param[in] value JSON value to serialize + @pre value.type() == value_t::object + */ + void write_bson_object(const typename BasicJsonType::object_t& value) + { + write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_object_size(value)), true); + + for (const auto& el : value) + { + write_bson_element(el.first, el.second); + } + + oa->write_character(to_char_type(0x00)); + } + + ////////// + // CBOR // + ////////// + + static constexpr CharType get_cbor_float_prefix(float /*unused*/) + { + return to_char_type(0xFA); // Single-Precision Float + } + + static constexpr CharType get_cbor_float_prefix(double /*unused*/) + { + return to_char_type(0xFB); // Double-Precision Float + } + + ///////////// + // MsgPack // + ///////////// + + static constexpr CharType get_msgpack_float_prefix(float /*unused*/) + { + return to_char_type(0xCA); // float 32 + } + + static constexpr CharType get_msgpack_float_prefix(double /*unused*/) + { + return to_char_type(0xCB); // float 64 + } + + //////////// + // UBJSON // + //////////// + + // UBJSON: write number (floating point) + template<typename NumberType, typename std::enable_if< + std::is_floating_point<NumberType>::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix, + const bool use_bjdata) + { + if (add_prefix) + { + oa->write_character(get_ubjson_float_prefix(n)); + } + write_number(n, use_bjdata); + } + + // UBJSON: write number (unsigned integer) + template<typename NumberType, typename std::enable_if< + std::is_unsigned<NumberType>::value, int>::type = 0> + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix, + const bool use_bjdata) + { + if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast<std::uint8_t>(n), use_bjdata); + } + else if (n <= (std::numeric_limits<std::uint8_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast<std::uint8_t>(n), use_bjdata); + } + else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast<std::int16_t>(n), use_bjdata); + } + else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint16_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('u')); // uint16 - bjdata only + } + write_number(static_cast<std::uint16_t>(n), use_bjdata); + } + else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast<std::int32_t>(n), use_bjdata); + } + else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint32_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('m')); // uint32 - bjdata only + } + write_number(static_cast<std::uint32_t>(n), use_bjdata); + } + else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast<std::int64_t>(n), use_bjdata); + } + else if (use_bjdata && n <= (std::numeric_limits<uint64_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('M')); // uint64 - bjdata only + } + write_number(static_cast<std::uint64_t>(n), use_bjdata); + } + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true, use_bjdata); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i]))); + } + } + } + + // UBJSON: write number (signed integer) + template < typename NumberType, typename std::enable_if < + std::is_signed<NumberType>::value&& + !std::is_floating_point<NumberType>::value, int >::type = 0 > + void write_number_with_ubjson_prefix(const NumberType n, + const bool add_prefix, + const bool use_bjdata) + { + if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('i')); // int8 + } + write_number(static_cast<std::int8_t>(n), use_bjdata); + } + else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)())) + { + if (add_prefix) + { + oa->write_character(to_char_type('U')); // uint8 + } + write_number(static_cast<std::uint8_t>(n), use_bjdata); + } + else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('I')); // int16 + } + write_number(static_cast<std::int16_t>(n), use_bjdata); + } + else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::max)()))) + { + if (add_prefix) + { + oa->write_character(to_char_type('u')); // uint16 - bjdata only + } + write_number(static_cast<uint16_t>(n), use_bjdata); + } + else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('l')); // int32 + } + write_number(static_cast<std::int32_t>(n), use_bjdata); + } + else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::max)()))) + { + if (add_prefix) + { + oa->write_character(to_char_type('m')); // uint32 - bjdata only + } + write_number(static_cast<uint32_t>(n), use_bjdata); + } + else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)()) + { + if (add_prefix) + { + oa->write_character(to_char_type('L')); // int64 + } + write_number(static_cast<std::int64_t>(n), use_bjdata); + } + // LCOV_EXCL_START + else + { + if (add_prefix) + { + oa->write_character(to_char_type('H')); // high-precision number + } + + const auto number = BasicJsonType(n).dump(); + write_number_with_ubjson_prefix(number.size(), true, use_bjdata); + for (std::size_t i = 0; i < number.size(); ++i) + { + oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i]))); + } + } + // LCOV_EXCL_STOP + } + + /*! + @brief determine the type prefix of container values + */ + CharType ubjson_prefix(const BasicJsonType& j, const bool use_bjdata) const noexcept + { + switch (j.type()) + { + case value_t::null: + return 'Z'; + + case value_t::boolean: + return j.m_data.m_value.boolean ? 'T' : 'F'; + + case value_t::number_integer: + { + if ((std::numeric_limits<std::int8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)()) + { + return 'i'; + } + if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) + { + return 'U'; + } + if ((std::numeric_limits<std::int16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)()) + { + return 'I'; + } + if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())) + { + return 'u'; + } + if ((std::numeric_limits<std::int32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)()) + { + return 'l'; + } + if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())) + { + return 'm'; + } + if ((std::numeric_limits<std::int64_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)()) + { + return 'L'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_unsigned: + { + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)())) + { + return 'i'; + } + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)())) + { + return 'U'; + } + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)())) + { + return 'I'; + } + if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint16_t>::max)())) + { + return 'u'; + } + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) + { + return 'l'; + } + if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint32_t>::max)())) + { + return 'm'; + } + if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) + { + return 'L'; + } + if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) + { + return 'M'; + } + // anything else is treated as high-precision number + return 'H'; // LCOV_EXCL_LINE + } + + case value_t::number_float: + return get_ubjson_float_prefix(j.m_data.m_value.number_float); + + case value_t::string: + return 'S'; + + case value_t::array: // fallthrough + case value_t::binary: + return '['; + + case value_t::object: + return '{'; + + case value_t::discarded: + default: // discarded values + return 'N'; + } + } + + static constexpr CharType get_ubjson_float_prefix(float /*unused*/) + { + return 'd'; // float 32 + } + + static constexpr CharType get_ubjson_float_prefix(double /*unused*/) + { + return 'D'; // float 64 + } + + /*! + @return false if the object is successfully converted to a bjdata ndarray, true if the type or size is invalid + */ + bool write_bjdata_ndarray(const typename BasicJsonType::object_t& value, const bool use_count, const bool use_type) + { + std::map<string_t, CharType> bjdtype = {{"uint8", 'U'}, {"int8", 'i'}, {"uint16", 'u'}, {"int16", 'I'}, + {"uint32", 'm'}, {"int32", 'l'}, {"uint64", 'M'}, {"int64", 'L'}, {"single", 'd'}, {"double", 'D'}, {"char", 'C'} + }; + + string_t key = "_ArrayType_"; + auto it = bjdtype.find(static_cast<string_t>(value.at(key))); + if (it == bjdtype.end()) + { + return true; + } + CharType dtype = it->second; + + key = "_ArraySize_"; + std::size_t len = (value.at(key).empty() ? 0 : 1); + for (const auto& el : value.at(key)) + { + len *= static_cast<std::size_t>(el.m_data.m_value.number_unsigned); + } + + key = "_ArrayData_"; + if (value.at(key).size() != len) + { + return true; + } + + oa->write_character('['); + oa->write_character('$'); + oa->write_character(dtype); + oa->write_character('#'); + + key = "_ArraySize_"; + write_ubjson(value.at(key), use_count, use_type, true, true); + + key = "_ArrayData_"; + if (dtype == 'U' || dtype == 'C') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::uint8_t>(el.m_data.m_value.number_unsigned), true); + } + } + else if (dtype == 'i') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::int8_t>(el.m_data.m_value.number_integer), true); + } + } + else if (dtype == 'u') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::uint16_t>(el.m_data.m_value.number_unsigned), true); + } + } + else if (dtype == 'I') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::int16_t>(el.m_data.m_value.number_integer), true); + } + } + else if (dtype == 'm') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::uint32_t>(el.m_data.m_value.number_unsigned), true); + } + } + else if (dtype == 'l') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::int32_t>(el.m_data.m_value.number_integer), true); + } + } + else if (dtype == 'M') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::uint64_t>(el.m_data.m_value.number_unsigned), true); + } + } + else if (dtype == 'L') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<std::int64_t>(el.m_data.m_value.number_integer), true); + } + } + else if (dtype == 'd') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<float>(el.m_data.m_value.number_float), true); + } + } + else if (dtype == 'D') + { + for (const auto& el : value.at(key)) + { + write_number(static_cast<double>(el.m_data.m_value.number_float), true); + } + } + return false; + } + + /////////////////////// + // Utility functions // + /////////////////////// + + /* + @brief write a number to output input + @param[in] n number of type @a NumberType + @param[in] OutputIsLittleEndian Set to true if output data is + required to be little endian + @tparam NumberType the type of the number + + @note This function needs to respect the system's endianness, because bytes + in CBOR, MessagePack, and UBJSON are stored in network order (big + endian) and therefore need reordering on little endian systems. + On the other hand, BSON and BJData use little endian and should reorder + on big endian systems. + */ + template<typename NumberType> + void write_number(const NumberType n, const bool OutputIsLittleEndian = false) + { + // step 1: write number to array of length NumberType + std::array<CharType, sizeof(NumberType)> vec{}; + std::memcpy(vec.data(), &n, sizeof(NumberType)); + + // step 2: write array to output (with possible reordering) + if (is_little_endian != OutputIsLittleEndian) + { + // reverse byte order prior to conversion if necessary + std::reverse(vec.begin(), vec.end()); + } + + oa->write_characters(vec.data(), sizeof(NumberType)); + } + + void write_compact_float(const number_float_t n, detail::input_format_t format) + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) && + static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) && + static_cast<double>(static_cast<float>(n)) == static_cast<double>(n)) + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(static_cast<float>(n)) + : get_msgpack_float_prefix(static_cast<float>(n))); + write_number(static_cast<float>(n)); + } + else + { + oa->write_character(format == detail::input_format_t::cbor + ? get_cbor_float_prefix(n) + : get_msgpack_float_prefix(n)); + write_number(n); + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + public: + // The following to_char_type functions are implement the conversion + // between uint8_t and CharType. In case CharType is not unsigned, + // such a conversion is required to allow values greater than 128. + // See <https://github.com/nlohmann/json/issues/1286> for a discussion. + template < typename C = CharType, + enable_if_t < std::is_signed<C>::value && std::is_signed<char>::value > * = nullptr > + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return *reinterpret_cast<char*>(&x); + } + + template < typename C = CharType, + enable_if_t < std::is_signed<C>::value && std::is_unsigned<char>::value > * = nullptr > + static CharType to_char_type(std::uint8_t x) noexcept + { + static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); + static_assert(std::is_trivial<CharType>::value, "CharType must be trivial"); + CharType result; + std::memcpy(&result, &x, sizeof(x)); + return result; + } + + template<typename C = CharType, + enable_if_t<std::is_unsigned<C>::value>* = nullptr> + static constexpr CharType to_char_type(std::uint8_t x) noexcept + { + return x; + } + + template < typename InputCharType, typename C = CharType, + enable_if_t < + std::is_signed<C>::value && + std::is_signed<char>::value && + std::is_same<char, typename std::remove_cv<InputCharType>::type>::value + > * = nullptr > + static constexpr CharType to_char_type(InputCharType x) noexcept + { + return x; + } + + private: + /// whether we can assume little endianness + const bool is_little_endian = little_endianness(); + + /// the output + output_adapter_t<CharType> oa = nullptr; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/output/output_adapters.hpp> + +// #include <nlohmann/detail/output/serializer.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2008-2009 Björn Hoehrmann <bjoern@hoehrmann.de> +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <algorithm> // reverse, remove, fill, find, none_of +#include <array> // array +#include <clocale> // localeconv, lconv +#include <cmath> // labs, isfinite, isnan, signbit +#include <cstddef> // size_t, ptrdiff_t +#include <cstdint> // uint8_t +#include <cstdio> // snprintf +#include <limits> // numeric_limits +#include <string> // string, char_traits +#include <iomanip> // setfill, setw +#include <type_traits> // is_same +#include <utility> // move + +// #include <nlohmann/detail/conversions/to_chars.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2009 Florian Loitsch <https://florian.loitsch.com/> +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <array> // array +#include <cmath> // signbit, isfinite +#include <cstdint> // intN_t, uintN_t +#include <cstring> // memcpy, memmove +#include <limits> // numeric_limits +#include <type_traits> // conditional + +// #include <nlohmann/detail/macro_scope.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief implements the Grisu2 algorithm for binary to decimal floating-point +conversion. + +This implementation is a slightly modified version of the reference +implementation which may be obtained from +http://florian.loitsch.com/publications (bench.tar.gz). + +The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. + +For a detailed description of the algorithm see: + +[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with + Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming + Language Design and Implementation, PLDI 2010 +[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", + Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language + Design and Implementation, PLDI 1996 +*/ +namespace dtoa_impl +{ + +template<typename Target, typename Source> +Target reinterpret_bits(const Source source) +{ + static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); + + Target target; + std::memcpy(&target, &source, sizeof(Source)); + return target; +} + +struct diyfp // f * 2^e +{ + static constexpr int kPrecision = 64; // = q + + std::uint64_t f = 0; + int e = 0; + + constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} + + /*! + @brief returns x - y + @pre x.e == y.e and x.f >= y.f + */ + static diyfp sub(const diyfp& x, const diyfp& y) noexcept + { + JSON_ASSERT(x.e == y.e); + JSON_ASSERT(x.f >= y.f); + + return {x.f - y.f, x.e}; + } + + /*! + @brief returns x * y + @note The result is rounded. (Only the upper q bits are returned.) + */ + static diyfp mul(const diyfp& x, const diyfp& y) noexcept + { + static_assert(kPrecision == 64, "internal error"); + + // Computes: + // f = round((x.f * y.f) / 2^q) + // e = x.e + y.e + q + + // Emulate the 64-bit * 64-bit multiplication: + // + // p = u * v + // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) + // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) + // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) + // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) + // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) + // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) + // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) + // + // (Since Q might be larger than 2^32 - 1) + // + // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) + // + // (Q_hi + H does not overflow a 64-bit int) + // + // = p_lo + 2^64 p_hi + + const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; + const std::uint64_t u_hi = x.f >> 32u; + const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; + const std::uint64_t v_hi = y.f >> 32u; + + const std::uint64_t p0 = u_lo * v_lo; + const std::uint64_t p1 = u_lo * v_hi; + const std::uint64_t p2 = u_hi * v_lo; + const std::uint64_t p3 = u_hi * v_hi; + + const std::uint64_t p0_hi = p0 >> 32u; + const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; + const std::uint64_t p1_hi = p1 >> 32u; + const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; + const std::uint64_t p2_hi = p2 >> 32u; + + std::uint64_t Q = p0_hi + p1_lo + p2_lo; + + // The full product might now be computed as + // + // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) + // p_lo = p0_lo + (Q << 32) + // + // But in this particular case here, the full p_lo is not required. + // Effectively we only need to add the highest bit in p_lo to p_hi (and + // Q_hi + 1 does not overflow). + + Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up + + const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); + + return {h, x.e + y.e + 64}; + } + + /*! + @brief normalize x such that the significand is >= 2^(q-1) + @pre x.f != 0 + */ + static diyfp normalize(diyfp x) noexcept + { + JSON_ASSERT(x.f != 0); + + while ((x.f >> 63u) == 0) + { + x.f <<= 1u; + x.e--; + } + + return x; + } + + /*! + @brief normalize x such that the result has the exponent E + @pre e >= x.e and the upper e - x.e bits of x.f must be zero. + */ + static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept + { + const int delta = x.e - target_exponent; + + JSON_ASSERT(delta >= 0); + JSON_ASSERT(((x.f << delta) >> delta) == x.f); + + return {x.f << delta, target_exponent}; + } +}; + +struct boundaries +{ + diyfp w; + diyfp minus; + diyfp plus; +}; + +/*! +Compute the (normalized) diyfp representing the input number 'value' and its +boundaries. + +@pre value must be finite and positive +*/ +template<typename FloatType> +boundaries compute_boundaries(FloatType value) +{ + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // Convert the IEEE representation into a diyfp. + // + // If v is denormal: + // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) + // If v is normalized: + // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) + + static_assert(std::numeric_limits<FloatType>::is_iec559, + "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); + + constexpr int kPrecision = std::numeric_limits<FloatType>::digits; // = p (includes the hidden bit) + constexpr int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1); + constexpr int kMinExp = 1 - kBias; + constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) + + using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type; + + const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value)); + const std::uint64_t E = bits >> (kPrecision - 1); + const std::uint64_t F = bits & (kHiddenBit - 1); + + const bool is_denormal = E == 0; + const diyfp v = is_denormal + ? diyfp(F, kMinExp) + : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias); + + // Compute the boundaries m- and m+ of the floating-point value + // v = f * 2^e. + // + // Determine v- and v+, the floating-point predecessor and successor if v, + // respectively. + // + // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) + // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) + // + // v+ = v + 2^e + // + // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ + // between m- and m+ round to v, regardless of how the input rounding + // algorithm breaks ties. + // + // ---+-------------+-------------+-------------+-------------+--- (A) + // v- m- v m+ v+ + // + // -----------------+------+------+-------------+-------------+--- (B) + // v- m- v m+ v+ + + const bool lower_boundary_is_closer = F == 0 && E > 1; + const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); + const diyfp m_minus = lower_boundary_is_closer + ? diyfp(4 * v.f - 1, v.e - 2) // (B) + : diyfp(2 * v.f - 1, v.e - 1); // (A) + + // Determine the normalized w+ = m+. + const diyfp w_plus = diyfp::normalize(m_plus); + + // Determine w- = m- such that e_(w-) = e_(w+). + const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); + + return {diyfp::normalize(v), w_minus, w_plus}; +} + +// Given normalized diyfp w, Grisu needs to find a (normalized) cached +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies +// within a certain range [alpha, gamma] (Definition 3.2 from [1]) +// +// alpha <= e = e_c + e_w + q <= gamma +// +// or +// +// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q +// <= f_c * f_w * 2^gamma +// +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies +// +// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma +// +// or +// +// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) +// +// The choice of (alpha,gamma) determines the size of the table and the form of +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well +// in practice: +// +// The idea is to cut the number c * w = f * 2^e into two parts, which can be +// processed independently: An integral part p1, and a fractional part p2: +// +// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e +// = (f div 2^-e) + (f mod 2^-e) * 2^e +// = p1 + p2 * 2^e +// +// The conversion of p1 into decimal form requires a series of divisions and +// modulos by (a power of) 10. These operations are faster for 32-bit than for +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be +// achieved by choosing +// +// -e >= 32 or e <= -32 := gamma +// +// In order to convert the fractional part +// +// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... +// +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits +// d[-i] are extracted in order: +// +// (10 * p2) div 2^-e = d[-1] +// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... +// +// The multiplication by 10 must not overflow. It is sufficient to choose +// +// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. +// +// Since p2 = f mod 2^-e < 2^-e, +// +// -e <= 60 or e >= -60 := alpha + +constexpr int kAlpha = -60; +constexpr int kGamma = -32; + +struct cached_power // c = f * 2^e ~= 10^k +{ + std::uint64_t f; + int e; + int k; +}; + +/*! +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c +satisfies (Definition 3.2 from [1]) + + alpha <= e_c + e + q <= gamma. +*/ +inline cached_power get_cached_power_for_binary_exponent(int e) +{ + // Now + // + // alpha <= e_c + e + q <= gamma (1) + // ==> f_c * 2^alpha <= c * 2^e * 2^q + // + // and since the c's are normalized, 2^(q-1) <= f_c, + // + // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) + // ==> 2^(alpha - e - 1) <= c + // + // If c were an exact power of ten, i.e. c = 10^k, one may determine k as + // + // k = ceil( log_10( 2^(alpha - e - 1) ) ) + // = ceil( (alpha - e - 1) * log_10(2) ) + // + // From the paper: + // "In theory the result of the procedure could be wrong since c is rounded, + // and the computation itself is approximated [...]. In practice, however, + // this simple function is sufficient." + // + // For IEEE double precision floating-point numbers converted into + // normalized diyfp's w = f * 2^e, with q = 64, + // + // e >= -1022 (min IEEE exponent) + // -52 (p - 1) + // -52 (p - 1, possibly normalize denormal IEEE numbers) + // -11 (normalize the diyfp) + // = -1137 + // + // and + // + // e <= +1023 (max IEEE exponent) + // -52 (p - 1) + // -11 (normalize the diyfp) + // = 960 + // + // This binary exponent range [-1137,960] results in a decimal exponent + // range [-307,324]. One does not need to store a cached power for each + // k in this range. For each such k it suffices to find a cached power + // such that the exponent of the product lies in [alpha,gamma]. + // This implies that the difference of the decimal exponents of adjacent + // table entries must be less than or equal to + // + // floor( (gamma - alpha) * log_10(2) ) = 8. + // + // (A smaller distance gamma-alpha would require a larger table.) + + // NB: + // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. + + constexpr int kCachedPowersMinDecExp = -300; + constexpr int kCachedPowersDecStep = 8; + + static constexpr std::array<cached_power, 79> kCachedPowers = + { + { + { 0xAB70FE17C79AC6CA, -1060, -300 }, + { 0xFF77B1FCBEBCDC4F, -1034, -292 }, + { 0xBE5691EF416BD60C, -1007, -284 }, + { 0x8DD01FAD907FFC3C, -980, -276 }, + { 0xD3515C2831559A83, -954, -268 }, + { 0x9D71AC8FADA6C9B5, -927, -260 }, + { 0xEA9C227723EE8BCB, -901, -252 }, + { 0xAECC49914078536D, -874, -244 }, + { 0x823C12795DB6CE57, -847, -236 }, + { 0xC21094364DFB5637, -821, -228 }, + { 0x9096EA6F3848984F, -794, -220 }, + { 0xD77485CB25823AC7, -768, -212 }, + { 0xA086CFCD97BF97F4, -741, -204 }, + { 0xEF340A98172AACE5, -715, -196 }, + { 0xB23867FB2A35B28E, -688, -188 }, + { 0x84C8D4DFD2C63F3B, -661, -180 }, + { 0xC5DD44271AD3CDBA, -635, -172 }, + { 0x936B9FCEBB25C996, -608, -164 }, + { 0xDBAC6C247D62A584, -582, -156 }, + { 0xA3AB66580D5FDAF6, -555, -148 }, + { 0xF3E2F893DEC3F126, -529, -140 }, + { 0xB5B5ADA8AAFF80B8, -502, -132 }, + { 0x87625F056C7C4A8B, -475, -124 }, + { 0xC9BCFF6034C13053, -449, -116 }, + { 0x964E858C91BA2655, -422, -108 }, + { 0xDFF9772470297EBD, -396, -100 }, + { 0xA6DFBD9FB8E5B88F, -369, -92 }, + { 0xF8A95FCF88747D94, -343, -84 }, + { 0xB94470938FA89BCF, -316, -76 }, + { 0x8A08F0F8BF0F156B, -289, -68 }, + { 0xCDB02555653131B6, -263, -60 }, + { 0x993FE2C6D07B7FAC, -236, -52 }, + { 0xE45C10C42A2B3B06, -210, -44 }, + { 0xAA242499697392D3, -183, -36 }, + { 0xFD87B5F28300CA0E, -157, -28 }, + { 0xBCE5086492111AEB, -130, -20 }, + { 0x8CBCCC096F5088CC, -103, -12 }, + { 0xD1B71758E219652C, -77, -4 }, + { 0x9C40000000000000, -50, 4 }, + { 0xE8D4A51000000000, -24, 12 }, + { 0xAD78EBC5AC620000, 3, 20 }, + { 0x813F3978F8940984, 30, 28 }, + { 0xC097CE7BC90715B3, 56, 36 }, + { 0x8F7E32CE7BEA5C70, 83, 44 }, + { 0xD5D238A4ABE98068, 109, 52 }, + { 0x9F4F2726179A2245, 136, 60 }, + { 0xED63A231D4C4FB27, 162, 68 }, + { 0xB0DE65388CC8ADA8, 189, 76 }, + { 0x83C7088E1AAB65DB, 216, 84 }, + { 0xC45D1DF942711D9A, 242, 92 }, + { 0x924D692CA61BE758, 269, 100 }, + { 0xDA01EE641A708DEA, 295, 108 }, + { 0xA26DA3999AEF774A, 322, 116 }, + { 0xF209787BB47D6B85, 348, 124 }, + { 0xB454E4A179DD1877, 375, 132 }, + { 0x865B86925B9BC5C2, 402, 140 }, + { 0xC83553C5C8965D3D, 428, 148 }, + { 0x952AB45CFA97A0B3, 455, 156 }, + { 0xDE469FBD99A05FE3, 481, 164 }, + { 0xA59BC234DB398C25, 508, 172 }, + { 0xF6C69A72A3989F5C, 534, 180 }, + { 0xB7DCBF5354E9BECE, 561, 188 }, + { 0x88FCF317F22241E2, 588, 196 }, + { 0xCC20CE9BD35C78A5, 614, 204 }, + { 0x98165AF37B2153DF, 641, 212 }, + { 0xE2A0B5DC971F303A, 667, 220 }, + { 0xA8D9D1535CE3B396, 694, 228 }, + { 0xFB9B7CD9A4A7443C, 720, 236 }, + { 0xBB764C4CA7A44410, 747, 244 }, + { 0x8BAB8EEFB6409C1A, 774, 252 }, + { 0xD01FEF10A657842C, 800, 260 }, + { 0x9B10A4E5E9913129, 827, 268 }, + { 0xE7109BFBA19C0C9D, 853, 276 }, + { 0xAC2820D9623BF429, 880, 284 }, + { 0x80444B5E7AA7CF85, 907, 292 }, + { 0xBF21E44003ACDD2D, 933, 300 }, + { 0x8E679C2F5E44FF8F, 960, 308 }, + { 0xD433179D9C8CB841, 986, 316 }, + { 0x9E19DB92B4E31BA9, 1013, 324 }, + } + }; + + // This computation gives exactly the same results for k as + // k = ceil((kAlpha - e - 1) * 0.30102999566398114) + // for |e| <= 1500, but doesn't require floating-point operations. + // NB: log_10(2) ~= 78913 / 2^18 + JSON_ASSERT(e >= -1500); + JSON_ASSERT(e <= 1500); + const int f = kAlpha - e - 1; + const int k = (f * 78913) / (1 << 18) + static_cast<int>(f > 0); + + const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; + JSON_ASSERT(index >= 0); + JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size()); + + const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)]; + JSON_ASSERT(kAlpha <= cached.e + e + 64); + JSON_ASSERT(kGamma >= cached.e + e + 64); + + return cached; +} + +/*! +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. +For n == 0, returns 1 and sets pow10 := 1. +*/ +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) +{ + // LCOV_EXCL_START + if (n >= 1000000000) + { + pow10 = 1000000000; + return 10; + } + // LCOV_EXCL_STOP + if (n >= 100000000) + { + pow10 = 100000000; + return 9; + } + if (n >= 10000000) + { + pow10 = 10000000; + return 8; + } + if (n >= 1000000) + { + pow10 = 1000000; + return 7; + } + if (n >= 100000) + { + pow10 = 100000; + return 6; + } + if (n >= 10000) + { + pow10 = 10000; + return 5; + } + if (n >= 1000) + { + pow10 = 1000; + return 4; + } + if (n >= 100) + { + pow10 = 100; + return 3; + } + if (n >= 10) + { + pow10 = 10; + return 2; + } + + pow10 = 1; + return 1; +} + +inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, + std::uint64_t rest, std::uint64_t ten_k) +{ + JSON_ASSERT(len >= 1); + JSON_ASSERT(dist <= delta); + JSON_ASSERT(rest <= delta); + JSON_ASSERT(ten_k > 0); + + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // ten_k + // <------> + // <---- rest ----> + // --------------[------------------+----+--------------]-------------- + // w V + // = buf * 10^k + // + // ten_k represents a unit-in-the-last-place in the decimal representation + // stored in buf. + // Decrement buf by ten_k while this takes buf closer to w. + + // The tests are written in this order to avoid overflow in unsigned + // integer arithmetic. + + while (rest < dist + && delta - rest >= ten_k + && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) + { + JSON_ASSERT(buf[len - 1] != '0'); + buf[len - 1]--; + rest += ten_k; + } +} + +/*! +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. +M- and M+ must be normalized and share the same exponent -60 <= e <= -32. +*/ +inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, + diyfp M_minus, diyfp w, diyfp M_plus) +{ + static_assert(kAlpha >= -60, "internal error"); + static_assert(kGamma <= -32, "internal error"); + + // Generates the digits (and the exponent) of a decimal floating-point + // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's + // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. + // + // <--------------------------- delta ----> + // <---- dist ---------> + // --------------[------------------+-------------------]-------------- + // M- w M+ + // + // Grisu2 generates the digits of M+ from left to right and stops as soon as + // V is in [M-,M+]. + + JSON_ASSERT(M_plus.e >= kAlpha); + JSON_ASSERT(M_plus.e <= kGamma); + + std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) + std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) + + // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): + // + // M+ = f * 2^e + // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e + // = ((p1 ) * 2^-e + (p2 )) * 2^e + // = p1 + p2 * 2^e + + const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); + + auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) + std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e + + // 1) + // + // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] + + JSON_ASSERT(p1 > 0); + + std::uint32_t pow10{}; + const int k = find_largest_pow10(p1, pow10); + + // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) + // + // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) + // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) + // + // M+ = p1 + p2 * 2^e + // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e + // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e + // = d[k-1] * 10^(k-1) + ( rest) * 2^e + // + // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) + // + // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] + // + // but stop as soon as + // + // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e + + int n = k; + while (n > 0) + { + // Invariants: + // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) + // pow10 = 10^(n-1) <= p1 < 10^n + // + const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) + const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) + // + // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e + // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) + // + p1 = r; + n--; + // + // M+ = buffer * 10^n + (p1 + p2 * 2^e) + // pow10 = 10^n + // + + // Now check if enough digits have been generated. + // Compute + // + // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e + // + // Note: + // Since rest and delta share the same exponent e, it suffices to + // compare the significands. + const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; + if (rest <= delta) + { + // V = buffer * 10^n, with M- <= V <= M+. + + decimal_exponent += n; + + // We may now just stop. But instead look if the buffer could be + // decremented to bring V closer to w. + // + // pow10 = 10^n is now 1 ulp in the decimal representation V. + // The rounding procedure works with diyfp's with an implicit + // exponent of e. + // + // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e + // + const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; + grisu2_round(buffer, length, dist, delta, rest, ten_n); + + return; + } + + pow10 /= 10; + // + // pow10 = 10^(n-1) <= p1 < 10^n + // Invariants restored. + } + + // 2) + // + // The digits of the integral part have been generated: + // + // M+ = d[k-1]...d[1]d[0] + p2 * 2^e + // = buffer + p2 * 2^e + // + // Now generate the digits of the fractional part p2 * 2^e. + // + // Note: + // No decimal point is generated: the exponent is adjusted instead. + // + // p2 actually represents the fraction + // + // p2 * 2^e + // = p2 / 2^-e + // = d[-1] / 10^1 + d[-2] / 10^2 + ... + // + // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) + // + // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m + // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) + // + // using + // + // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) + // = ( d) * 2^-e + ( r) + // + // or + // 10^m * p2 * 2^e = d + r * 2^e + // + // i.e. + // + // M+ = buffer + p2 * 2^e + // = buffer + 10^-m * (d + r * 2^e) + // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e + // + // and stop as soon as 10^-m * r * 2^e <= delta * 2^e + + JSON_ASSERT(p2 > delta); + + int m = 0; + for (;;) + { + // Invariant: + // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e + // = buffer * 10^-m + 10^-m * (p2 ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e + // + JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10); + p2 *= 10; + const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e + const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e + // + // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e + // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) + // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + JSON_ASSERT(d <= 9); + buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d + // + // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e + // + p2 = r; + m++; + // + // M+ = buffer * 10^-m + 10^-m * p2 * 2^e + // Invariant restored. + + // Check if enough digits have been generated. + // + // 10^-m * p2 * 2^e <= delta * 2^e + // p2 * 2^e <= 10^m * delta * 2^e + // p2 <= 10^m * delta + delta *= 10; + dist *= 10; + if (p2 <= delta) + { + break; + } + } + + // V = buffer * 10^-m, with M- <= V <= M+. + + decimal_exponent -= m; + + // 1 ulp in the decimal representation is now 10^-m. + // Since delta and dist are now scaled by 10^m, we need to do the + // same with ulp in order to keep the units in sync. + // + // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e + // + const std::uint64_t ten_m = one.f; + grisu2_round(buffer, length, dist, delta, p2, ten_m); + + // By construction this algorithm generates the shortest possible decimal + // number (Loitsch, Theorem 6.2) which rounds back to w. + // For an input number of precision p, at least + // + // N = 1 + ceil(p * log_10(2)) + // + // decimal digits are sufficient to identify all binary floating-point + // numbers (Matula, "In-and-Out conversions"). + // This implies that the algorithm does not produce more than N decimal + // digits. + // + // N = 17 for p = 53 (IEEE double precision) + // N = 9 for p = 24 (IEEE single precision) +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +JSON_HEDLEY_NON_NULL(1) +inline void grisu2(char* buf, int& len, int& decimal_exponent, + diyfp m_minus, diyfp v, diyfp m_plus) +{ + JSON_ASSERT(m_plus.e == m_minus.e); + JSON_ASSERT(m_plus.e == v.e); + + // --------(-----------------------+-----------------------)-------- (A) + // m- v m+ + // + // --------------------(-----------+-----------------------)-------- (B) + // m- v m+ + // + // First scale v (and m- and m+) such that the exponent is in the range + // [alpha, gamma]. + + const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); + + const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k + + // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] + const diyfp w = diyfp::mul(v, c_minus_k); + const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); + const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); + + // ----(---+---)---------------(---+---)---------------(---+---)---- + // w- w w+ + // = c*m- = c*v = c*m+ + // + // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and + // w+ are now off by a small amount. + // In fact: + // + // w - v * 10^k < 1 ulp + // + // To account for this inaccuracy, add resp. subtract 1 ulp. + // + // --------+---[---------------(---+---)---------------]---+-------- + // w- M- w M+ w+ + // + // Now any number in [M-, M+] (bounds included) will round to w when input, + // regardless of how the input rounding algorithm breaks ties. + // + // And digit_gen generates the shortest possible such number in [M-, M+]. + // Note that this does not mean that Grisu2 always generates the shortest + // possible number in the interval (m-, m+). + const diyfp M_minus(w_minus.f + 1, w_minus.e); + const diyfp M_plus (w_plus.f - 1, w_plus.e ); + + decimal_exponent = -cached.k; // = -(-k) = k + + grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); +} + +/*! +v = buf * 10^decimal_exponent +len is the length of the buffer (number of decimal digits) +The buffer must be large enough, i.e. >= max_digits10. +*/ +template<typename FloatType> +JSON_HEDLEY_NON_NULL(1) +void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) +{ + static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3, + "internal error: not enough precision"); + + JSON_ASSERT(std::isfinite(value)); + JSON_ASSERT(value > 0); + + // If the neighbors (and boundaries) of 'value' are always computed for double-precision + // numbers, all float's can be recovered using strtod (and strtof). However, the resulting + // decimal representations are not exactly "short". + // + // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) + // says "value is converted to a string as if by std::sprintf in the default ("C") locale" + // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars' + // does. + // On the other hand, the documentation for 'std::to_chars' requires that "parsing the + // representation using the corresponding std::from_chars function recovers value exactly". That + // indicates that single precision floating-point numbers should be recovered using + // 'std::strtof'. + // + // NB: If the neighbors are computed for single-precision numbers, there is a single float + // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision + // value is off by 1 ulp. +#if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if) + const boundaries w = compute_boundaries(static_cast<double>(value)); +#else + const boundaries w = compute_boundaries(value); +#endif + + grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); +} + +/*! +@brief appends a decimal representation of e to buf +@return a pointer to the element following the exponent. +@pre -1000 < e < 1000 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* append_exponent(char* buf, int e) +{ + JSON_ASSERT(e > -1000); + JSON_ASSERT(e < 1000); + + if (e < 0) + { + e = -e; + *buf++ = '-'; + } + else + { + *buf++ = '+'; + } + + auto k = static_cast<std::uint32_t>(e); + if (k < 10) + { + // Always print at least two digits in the exponent. + // This is for compatibility with printf("%g"). + *buf++ = '0'; + *buf++ = static_cast<char>('0' + k); + } + else if (k < 100) + { + *buf++ = static_cast<char>('0' + k / 10); + k %= 10; + *buf++ = static_cast<char>('0' + k); + } + else + { + *buf++ = static_cast<char>('0' + k / 100); + k %= 100; + *buf++ = static_cast<char>('0' + k / 10); + k %= 10; + *buf++ = static_cast<char>('0' + k); + } + + return buf; +} + +/*! +@brief prettify v = buf * 10^decimal_exponent + +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point +notation. Otherwise it will be printed in exponential notation. + +@pre min_exp < 0 +@pre max_exp > 0 +*/ +JSON_HEDLEY_NON_NULL(1) +JSON_HEDLEY_RETURNS_NON_NULL +inline char* format_buffer(char* buf, int len, int decimal_exponent, + int min_exp, int max_exp) +{ + JSON_ASSERT(min_exp < 0); + JSON_ASSERT(max_exp > 0); + + const int k = len; + const int n = len + decimal_exponent; + + // v = buf * 10^(n-k) + // k is the length of the buffer (number of decimal digits) + // n is the position of the decimal point relative to the start of the buffer. + + if (k <= n && n <= max_exp) + { + // digits[000] + // len <= max_exp + 2 + + std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k)); + // Make it look like a floating-point number (#362, #378) + buf[n + 0] = '.'; + buf[n + 1] = '0'; + return buf + (static_cast<size_t>(n) + 2); + } + + if (0 < n && n <= max_exp) + { + // dig.its + // len <= max_digits10 + 1 + + JSON_ASSERT(k > n); + + std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n)); + buf[n] = '.'; + return buf + (static_cast<size_t>(k) + 1U); + } + + if (min_exp < n && n <= 0) + { + // 0.[000]digits + // len <= 2 + (-min_exp - 1) + max_digits10 + + std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k)); + buf[0] = '0'; + buf[1] = '.'; + std::memset(buf + 2, '0', static_cast<size_t>(-n)); + return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k)); + } + + if (k == 1) + { + // dE+123 + // len <= 1 + 5 + + buf += 1; + } + else + { + // d.igitsE+123 + // len <= max_digits10 + 1 + 5 + + std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1); + buf[1] = '.'; + buf += 1 + static_cast<size_t>(k); + } + + *buf++ = 'e'; + return append_exponent(buf, n - 1); +} + +} // namespace dtoa_impl + +/*! +@brief generates a decimal representation of the floating-point number value in [first, last). + +The format of the resulting decimal representation is similar to printf's %g +format. Returns an iterator pointing past-the-end of the decimal representation. + +@note The input number must be finite, i.e. NaN's and Inf's are not supported. +@note The buffer must be large enough. +@note The result is NOT null-terminated. +*/ +template<typename FloatType> +JSON_HEDLEY_NON_NULL(1, 2) +JSON_HEDLEY_RETURNS_NON_NULL +char* to_chars(char* first, const char* last, FloatType value) +{ + static_cast<void>(last); // maybe unused - fix warning + JSON_ASSERT(std::isfinite(value)); + + // Use signbit(value) instead of (value < 0) since signbit works for -0. + if (std::signbit(value)) + { + value = -value; + *first++ = '-'; + } + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (value == 0) // +-0 + { + *first++ = '0'; + // Make it look like a floating-point number (#362, #378) + *first++ = '.'; + *first++ = '0'; + return first; + } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10); + + // Compute v = buffer * 10^decimal_exponent. + // The decimal digits are stored in the buffer, which needs to be interpreted + // as an unsigned decimal integer. + // len is the length of the buffer, i.e. the number of decimal digits. + int len = 0; + int decimal_exponent = 0; + dtoa_impl::grisu2(first, len, decimal_exponent, value); + + JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10); + + // Format the buffer like printf("%.*g", prec, value) + constexpr int kMinExp = -4; + // Use digits10 here to increase compatibility with version 2. + constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10; + + JSON_ASSERT(last - first >= kMaxExp + 2); + JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10); + JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6); + + return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/exceptions.hpp> + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/cpp_future.hpp> + +// #include <nlohmann/detail/output/binary_writer.hpp> + +// #include <nlohmann/detail/output/output_adapters.hpp> + +// #include <nlohmann/detail/string_concat.hpp> + +// #include <nlohmann/detail/value_t.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////// +// serialization // +/////////////////// + +/// how to treat decoding errors +enum class error_handler_t +{ + strict, ///< throw a type_error exception in case of invalid UTF-8 + replace, ///< replace invalid UTF-8 sequences with U+FFFD + ignore ///< ignore invalid UTF-8 sequences +}; + +template<typename BasicJsonType> +class serializer +{ + using string_t = typename BasicJsonType::string_t; + using number_float_t = typename BasicJsonType::number_float_t; + using number_integer_t = typename BasicJsonType::number_integer_t; + using number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using binary_char_t = typename BasicJsonType::binary_t::value_type; + static constexpr std::uint8_t UTF8_ACCEPT = 0; + static constexpr std::uint8_t UTF8_REJECT = 1; + + public: + /*! + @param[in] s output stream to serialize to + @param[in] ichar indentation character to use + @param[in] error_handler_ how to react on decoding errors + */ + serializer(output_adapter_t<char> s, const char ichar, + error_handler_t error_handler_ = error_handler_t::strict) + : o(std::move(s)) + , loc(std::localeconv()) + , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits<char>::to_char_type(* (loc->thousands_sep))) + , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits<char>::to_char_type(* (loc->decimal_point))) + , indent_char(ichar) + , indent_string(512, indent_char) + , error_handler(error_handler_) + {} + + // delete because of pointer members + serializer(const serializer&) = delete; + serializer& operator=(const serializer&) = delete; + serializer(serializer&&) = delete; + serializer& operator=(serializer&&) = delete; + ~serializer() = default; + + /*! + @brief internal implementation of the serialization function + + This function is called by the public member function dump and organizes + the serialization internally. The indentation level is propagated as + additional parameter. In case of arrays and objects, the function is + called recursively. + + - strings and object keys are escaped using `escape_string()` + - integer numbers are converted implicitly via `operator<<` + - floating-point numbers are converted to a string using `"%g"` format + - binary values are serialized as objects containing the subtype and the + byte array + + @param[in] val value to serialize + @param[in] pretty_print whether the output shall be pretty-printed + @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters + in the output are escaped with `\uXXXX` sequences, and the result consists + of ASCII characters only. + @param[in] indent_step the indent level + @param[in] current_indent the current indent level (only used internally) + */ + void dump(const BasicJsonType& val, + const bool pretty_print, + const bool ensure_ascii, + const unsigned int indent_step, + const unsigned int current_indent = 0) + { + switch (val.m_data.m_type) + { + case value_t::object: + { + if (val.m_data.m_value.object->empty()) + { + o->write_characters("{}", 2); + return; + } + + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + auto i = val.m_data.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(i != val.m_data.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend()); + o->write_characters(indent_string.c_str(), new_indent); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\": ", 3); + dump(i->second, true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_character('{'); + + // first n-1 elements + auto i = val.m_data.m_value.object->cbegin(); + for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i) + { + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(i != val.m_data.m_value.object->cend()); + JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend()); + o->write_character('\"'); + dump_escaped(i->first, ensure_ascii); + o->write_characters("\":", 2); + dump(i->second, false, ensure_ascii, indent_step, current_indent); + + o->write_character('}'); + } + + return; + } + + case value_t::array: + { + if (val.m_data.m_value.array->empty()) + { + o->write_characters("[]", 2); + return; + } + + if (pretty_print) + { + o->write_characters("[\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + // first n-1 elements + for (auto i = val.m_data.m_value.array->cbegin(); + i != val.m_data.m_value.array->cend() - 1; ++i) + { + o->write_characters(indent_string.c_str(), new_indent); + dump(*i, true, ensure_ascii, indent_step, new_indent); + o->write_characters(",\n", 2); + } + + // last element + JSON_ASSERT(!val.m_data.m_value.array->empty()); + o->write_characters(indent_string.c_str(), new_indent); + dump(val.m_data.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); + + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character(']'); + } + else + { + o->write_character('['); + + // first n-1 elements + for (auto i = val.m_data.m_value.array->cbegin(); + i != val.m_data.m_value.array->cend() - 1; ++i) + { + dump(*i, false, ensure_ascii, indent_step, current_indent); + o->write_character(','); + } + + // last element + JSON_ASSERT(!val.m_data.m_value.array->empty()); + dump(val.m_data.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); + + o->write_character(']'); + } + + return; + } + + case value_t::string: + { + o->write_character('\"'); + dump_escaped(*val.m_data.m_value.string, ensure_ascii); + o->write_character('\"'); + return; + } + + case value_t::binary: + { + if (pretty_print) + { + o->write_characters("{\n", 2); + + // variable to hold indentation for recursive calls + const auto new_indent = current_indent + indent_step; + if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) + { + indent_string.resize(indent_string.size() * 2, ' '); + } + + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"bytes\": [", 10); + + if (!val.m_data.m_value.binary->empty()) + { + for (auto i = val.m_data.m_value.binary->cbegin(); + i != val.m_data.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_characters(", ", 2); + } + dump_integer(val.m_data.m_value.binary->back()); + } + + o->write_characters("],\n", 3); + o->write_characters(indent_string.c_str(), new_indent); + + o->write_characters("\"subtype\": ", 11); + if (val.m_data.m_value.binary->has_subtype()) + { + dump_integer(val.m_data.m_value.binary->subtype()); + } + else + { + o->write_characters("null", 4); + } + o->write_character('\n'); + o->write_characters(indent_string.c_str(), current_indent); + o->write_character('}'); + } + else + { + o->write_characters("{\"bytes\":[", 10); + + if (!val.m_data.m_value.binary->empty()) + { + for (auto i = val.m_data.m_value.binary->cbegin(); + i != val.m_data.m_value.binary->cend() - 1; ++i) + { + dump_integer(*i); + o->write_character(','); + } + dump_integer(val.m_data.m_value.binary->back()); + } + + o->write_characters("],\"subtype\":", 12); + if (val.m_data.m_value.binary->has_subtype()) + { + dump_integer(val.m_data.m_value.binary->subtype()); + o->write_character('}'); + } + else + { + o->write_characters("null}", 5); + } + } + return; + } + + case value_t::boolean: + { + if (val.m_data.m_value.boolean) + { + o->write_characters("true", 4); + } + else + { + o->write_characters("false", 5); + } + return; + } + + case value_t::number_integer: + { + dump_integer(val.m_data.m_value.number_integer); + return; + } + + case value_t::number_unsigned: + { + dump_integer(val.m_data.m_value.number_unsigned); + return; + } + + case value_t::number_float: + { + dump_float(val.m_data.m_value.number_float); + return; + } + + case value_t::discarded: + { + o->write_characters("<discarded>", 11); + return; + } + + case value_t::null: + { + o->write_characters("null", 4); + return; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief dump escaped string + + Escape a string by replacing certain special characters by a sequence of an + escape character (backslash) and another character and other control + characters by a sequence of "\u" followed by a four-digit hex + representation. The escaped string is written to output stream @a o. + + @param[in] s the string to escape + @param[in] ensure_ascii whether to escape non-ASCII characters with + \uXXXX sequences + + @complexity Linear in the length of string @a s. + */ + void dump_escaped(const string_t& s, const bool ensure_ascii) + { + std::uint32_t codepoint{}; + std::uint8_t state = UTF8_ACCEPT; + std::size_t bytes = 0; // number of bytes written to string_buffer + + // number of bytes written at the point of the last valid byte + std::size_t bytes_after_last_accept = 0; + std::size_t undumped_chars = 0; + + for (std::size_t i = 0; i < s.size(); ++i) + { + const auto byte = static_cast<std::uint8_t>(s[i]); + + switch (decode(state, codepoint, byte)) + { + case UTF8_ACCEPT: // decode found a new code point + { + switch (codepoint) + { + case 0x08: // backspace + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'b'; + break; + } + + case 0x09: // horizontal tab + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 't'; + break; + } + + case 0x0A: // newline + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'n'; + break; + } + + case 0x0C: // formfeed + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'f'; + break; + } + + case 0x0D: // carriage return + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'r'; + break; + } + + case 0x22: // quotation mark + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\"'; + break; + } + + case 0x5C: // reverse solidus + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = '\\'; + break; + } + + default: + { + // escape control characters (0x00..0x1F) or, if + // ensure_ascii parameter is used, non-ASCII characters + if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) + { + if (codepoint <= 0xFFFF) + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", + static_cast<std::uint16_t>(codepoint))); + bytes += 6; + } + else + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", + static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)), + static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu)))); + bytes += 12; + } + } + else + { + // copy byte to buffer (all previous bytes + // been copied have in default case above) + string_buffer[bytes++] = s[i]; + } + break; + } + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + // remember the byte position of this accept + bytes_after_last_accept = bytes; + undumped_chars = 0; + break; + } + + case UTF8_REJECT: // decode found invalid UTF-8 byte + { + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, concat("invalid UTF-8 byte at index ", std::to_string(i), ": 0x", hex_bytes(byte | 0)), nullptr)); + } + + case error_handler_t::ignore: + case error_handler_t::replace: + { + // in case we saw this character the first time, we + // would like to read it again, because the byte + // may be OK for itself, but just not OK for the + // previous sequence + if (undumped_chars > 0) + { + --i; + } + + // reset length buffer to the last accepted index; + // thus removing/ignoring the invalid characters + bytes = bytes_after_last_accept; + + if (error_handler == error_handler_t::replace) + { + // add a replacement character + if (ensure_ascii) + { + string_buffer[bytes++] = '\\'; + string_buffer[bytes++] = 'u'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'f'; + string_buffer[bytes++] = 'd'; + } + else + { + string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xEF'); + string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBF'); + string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBD'); + } + + // write buffer and reset index; there must be 13 bytes + // left, as this is the maximal number of bytes to be + // written ("\uxxxx\uxxxx\0") for one code point + if (string_buffer.size() - bytes < 13) + { + o->write_characters(string_buffer.data(), bytes); + bytes = 0; + } + + bytes_after_last_accept = bytes; + } + + undumped_chars = 0; + + // continue processing the string + state = UTF8_ACCEPT; + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + break; + } + + default: // decode found yet incomplete multi-byte code point + { + if (!ensure_ascii) + { + // code point will not be escaped - copy byte to buffer + string_buffer[bytes++] = s[i]; + } + ++undumped_chars; + break; + } + } + } + + // we finished processing the string + if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) + { + // write buffer + if (bytes > 0) + { + o->write_characters(string_buffer.data(), bytes); + } + } + else + { + // we finish reading, but do not accept: string was incomplete + switch (error_handler) + { + case error_handler_t::strict: + { + JSON_THROW(type_error::create(316, concat("incomplete UTF-8 string; last byte: 0x", hex_bytes(static_cast<std::uint8_t>(s.back() | 0))), nullptr)); + } + + case error_handler_t::ignore: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + break; + } + + case error_handler_t::replace: + { + // write all accepted bytes + o->write_characters(string_buffer.data(), bytes_after_last_accept); + // add a replacement character + if (ensure_ascii) + { + o->write_characters("\\ufffd", 6); + } + else + { + o->write_characters("\xEF\xBF\xBD", 3); + } + break; + } + + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + } + } + + private: + /*! + @brief count digits + + Count the number of decimal (base 10) digits for an input unsigned integer. + + @param[in] x unsigned integer number to count its digits + @return number of decimal digits + */ + inline unsigned int count_digits(number_unsigned_t x) noexcept + { + unsigned int n_digits = 1; + for (;;) + { + if (x < 10) + { + return n_digits; + } + if (x < 100) + { + return n_digits + 1; + } + if (x < 1000) + { + return n_digits + 2; + } + if (x < 10000) + { + return n_digits + 3; + } + x = x / 10000u; + n_digits += 4; + } + } + + /*! + * @brief convert a byte to a uppercase hex representation + * @param[in] byte byte to represent + * @return representation ("00".."FF") + */ + static std::string hex_bytes(std::uint8_t byte) + { + std::string result = "FF"; + constexpr const char* nibble_to_hex = "0123456789ABCDEF"; + result[0] = nibble_to_hex[byte / 16]; + result[1] = nibble_to_hex[byte % 16]; + return result; + } + + // templates to avoid warnings about useless casts + template <typename NumberType, enable_if_t<std::is_signed<NumberType>::value, int> = 0> + bool is_negative_number(NumberType x) + { + return x < 0; + } + + template < typename NumberType, enable_if_t <std::is_unsigned<NumberType>::value, int > = 0 > + bool is_negative_number(NumberType /*unused*/) + { + return false; + } + + /*! + @brief dump an integer + + Dump a given integer to output stream @a o. Works internally with + @a number_buffer. + + @param[in] x integer number (signed or unsigned) to dump + @tparam NumberType either @a number_integer_t or @a number_unsigned_t + */ + template < typename NumberType, detail::enable_if_t < + std::is_integral<NumberType>::value || + std::is_same<NumberType, number_unsigned_t>::value || + std::is_same<NumberType, number_integer_t>::value || + std::is_same<NumberType, binary_char_t>::value, + int > = 0 > + void dump_integer(NumberType x) + { + static constexpr std::array<std::array<char, 2>, 100> digits_to_99 + { + { + {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, + {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, + {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, + {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, + {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, + {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, + {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, + {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, + {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, + {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, + } + }; + + // special case for "0" + if (x == 0) + { + o->write_character('0'); + return; + } + + // use a pointer to fill the buffer + auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg) + + number_unsigned_t abs_value; + + unsigned int n_chars{}; + + if (is_negative_number(x)) + { + *buffer_ptr = '-'; + abs_value = remove_sign(static_cast<number_integer_t>(x)); + + // account one more byte for the minus sign + n_chars = 1 + count_digits(abs_value); + } + else + { + abs_value = static_cast<number_unsigned_t>(x); + n_chars = count_digits(abs_value); + } + + // spare 1 byte for '\0' + JSON_ASSERT(n_chars < number_buffer.size() - 1); + + // jump to the end to generate the string from backward, + // so we later avoid reversing the result + buffer_ptr += n_chars; + + // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu + // See: https://www.youtube.com/watch?v=o4-CwDo2zpg + while (abs_value >= 100) + { + const auto digits_index = static_cast<unsigned>((abs_value % 100)); + abs_value /= 100; + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + + if (abs_value >= 10) + { + const auto digits_index = static_cast<unsigned>(abs_value); + *(--buffer_ptr) = digits_to_99[digits_index][1]; + *(--buffer_ptr) = digits_to_99[digits_index][0]; + } + else + { + *(--buffer_ptr) = static_cast<char>('0' + abs_value); + } + + o->write_characters(number_buffer.data(), n_chars); + } + + /*! + @brief dump a floating-point number + + Dump a given floating-point number to output stream @a o. Works internally + with @a number_buffer. + + @param[in] x floating-point number to dump + */ + void dump_float(number_float_t x) + { + // NaN / inf + if (!std::isfinite(x)) + { + o->write_characters("null", 4); + return; + } + + // If number_float_t is an IEEE-754 single or double precision number, + // use the Grisu2 algorithm to produce short numbers which are + // guaranteed to round-trip, using strtof and strtod, resp. + // + // NB: The test below works if <long double> == <double>. + static constexpr bool is_ieee_single_or_double + = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) || + (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024); + + dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>()); + } + + void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) + { + auto* begin = number_buffer.data(); + auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); + + o->write_characters(begin, static_cast<size_t>(end - begin)); + } + + void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) + { + // get number of digits for a float -> text -> float round-trip + static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10; + + // the actual conversion + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); + + // negative value indicates an error + JSON_ASSERT(len > 0); + // check if buffer was large enough + JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size()); + + // erase thousands separator + if (thousands_sep != '\0') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); + std::fill(end, number_buffer.end(), '\0'); + JSON_ASSERT((end - number_buffer.begin()) <= len); + len = (end - number_buffer.begin()); + } + + // convert decimal point to '.' + if (decimal_point != '\0' && decimal_point != '.') + { + // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081 + const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); + if (dec_pos != number_buffer.end()) + { + *dec_pos = '.'; + } + } + + o->write_characters(number_buffer.data(), static_cast<std::size_t>(len)); + + // determine if we need to append ".0" + const bool value_is_int_like = + std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, + [](char c) + { + return c == '.' || c == 'e'; + }); + + if (value_is_int_like) + { + o->write_characters(".0", 2); + } + } + + /*! + @brief check whether a string is UTF-8 encoded + + The function checks each byte of a string whether it is UTF-8 encoded. The + result of the check is stored in the @a state parameter. The function must + be called initially with state 0 (accept). State 1 means the string must + be rejected, because the current byte is not allowed. If the string is + completely processed, but the state is non-zero, the string ended + prematurely; that is, the last byte indicated more bytes should have + followed. + + @param[in,out] state the state of the decoding + @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) + @param[in] byte next byte to decode + @return new state + + @note The function has been edited: a std::array is used. + + @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de> + @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + */ + static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept + { + static const std::array<std::uint8_t, 400> utf8d = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F + 0, 0, 0, 0, 0, 0, 0, 0, 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..3F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF + 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF + 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF + 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF + 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 + 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 + 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 + } + }; + + JSON_ASSERT(byte < utf8d.size()); + const std::uint8_t type = utf8d[byte]; + + codep = (state != UTF8_ACCEPT) + ? (byte & 0x3fu) | (codep << 6u) + : (0xFFu >> type) & (byte); + + const std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type); + JSON_ASSERT(index < utf8d.size()); + state = utf8d[index]; + return state; + } + + /* + * Overload to make the compiler happy while it is instantiating + * dump_integer for number_unsigned_t. + * Must never be called. + */ + number_unsigned_t remove_sign(number_unsigned_t x) + { + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + return x; // LCOV_EXCL_LINE + } + + /* + * Helper function for dump_integer + * + * This function takes a negative signed integer and returns its absolute + * value as unsigned integer. The plus/minus shuffling is necessary as we can + * not directly remove the sign of an arbitrary signed integer as the + * absolute values of INT_MIN and INT_MAX are usually not the same. See + * #1708 for details. + */ + inline number_unsigned_t remove_sign(number_integer_t x) noexcept + { + JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)()); // NOLINT(misc-redundant-expression) + return static_cast<number_unsigned_t>(-(x + 1)) + 1; + } + + private: + /// the output of the serializer + output_adapter_t<char> o = nullptr; + + /// a (hopefully) large enough character buffer + std::array<char, 64> number_buffer{{}}; + + /// the locale + const std::lconv* loc = nullptr; + /// the locale's thousand separator character + const char thousands_sep = '\0'; + /// the locale's decimal point character + const char decimal_point = '\0'; + + /// string buffer + std::array<char, 512> string_buffer{{}}; + + /// the indentation character + const char indent_char; + /// the indentation string + string_t indent_string; + + /// error_handler how to react on decoding errors + const error_handler_t error_handler; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include <nlohmann/detail/value_t.hpp> + +// #include <nlohmann/json_fwd.hpp> + +// #include <nlohmann/ordered_map.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#include <functional> // equal_to, less +#include <initializer_list> // initializer_list +#include <iterator> // input_iterator_tag, iterator_traits +#include <memory> // allocator +#include <stdexcept> // for out_of_range +#include <type_traits> // enable_if, is_convertible +#include <utility> // pair +#include <vector> // vector + +// #include <nlohmann/detail/macro_scope.hpp> + +// #include <nlohmann/detail/meta/type_traits.hpp> + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +/// ordered_map: a minimal map-like container that preserves insertion order +/// for use within nlohmann::basic_json<ordered_map> +template <class Key, class T, class IgnoredLess = std::less<Key>, + class Allocator = std::allocator<std::pair<const Key, T>>> + struct ordered_map : std::vector<std::pair<const Key, T>, Allocator> +{ + using key_type = Key; + using mapped_type = T; + using Container = std::vector<std::pair<const Key, T>, Allocator>; + using iterator = typename Container::iterator; + using const_iterator = typename Container::const_iterator; + using size_type = typename Container::size_type; + using value_type = typename Container::value_type; +#ifdef JSON_HAS_CPP_14 + using key_compare = std::equal_to<>; +#else + using key_compare = std::equal_to<Key>; +#endif + + // Explicit constructors instead of `using Container::Container` + // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) + ordered_map() noexcept(noexcept(Container())) : Container{} {} + explicit ordered_map(const Allocator& alloc) noexcept(noexcept(Container(alloc))) : Container{alloc} {} + template <class It> + ordered_map(It first, It last, const Allocator& alloc = Allocator()) + : Container{first, last, alloc} {} + ordered_map(std::initializer_list<value_type> init, const Allocator& alloc = Allocator() ) + : Container{init, alloc} {} + + std::pair<iterator, bool> emplace(const key_type& key, T&& t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return {it, false}; + } + } + Container::emplace_back(key, std::forward<T>(t)); + return {std::prev(this->end()), true}; + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + std::pair<iterator, bool> emplace(KeyType && key, T && t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return {it, false}; + } + } + Container::emplace_back(std::forward<KeyType>(key), std::forward<T>(t)); + return {std::prev(this->end()), true}; + } + + T& operator[](const key_type& key) + { + return emplace(key, T{}).first->second; + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + T & operator[](KeyType && key) + { + return emplace(std::forward<KeyType>(key), T{}).first->second; + } + + const T& operator[](const key_type& key) const + { + return at(key); + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + const T & operator[](KeyType && key) const + { + return at(std::forward<KeyType>(key)); + } + + T& at(const key_type& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + T & at(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + const T& at(const key_type& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + const T & at(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const key_type& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + size_type erase(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + iterator erase(iterator pos) + { + return erase(pos, std::next(pos)); + } + + iterator erase(iterator first, iterator last) + { + if (first == last) + { + return first; + } + + const auto elements_affected = std::distance(first, last); + const auto offset = std::distance(Container::begin(), first); + + // This is the start situation. We need to delete elements_affected + // elements (3 in this example: e, f, g), and need to return an + // iterator past the last deleted element (h in this example). + // Note that offset is the distance from the start of the vector + // to first. We will need this later. + + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // first last + + // Since we cannot move const Keys, we re-construct them in place. + // We start at first and re-construct (viz. copy) the elements from + // the back of the vector. Example for first iteration: + + // ,--------. + // v | destroy e and re-construct with h + // [ a, b, c, d, e, f, g, h, i, j ] + // ^ ^ + // it it + elements_affected + + for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) + { + it->~value_type(); // destroy but keep allocation + new (&*it) value_type{std::move(*std::next(it, elements_affected))}; // "move" next element to it + } + + // [ a, b, c, d, h, i, j, h, i, j ] + // ^ ^ + // first last + + // remove the unneeded elements at the end of the vector + Container::resize(this->size() - static_cast<size_type>(elements_affected)); + + // [ a, b, c, d, h, i, j ] + // ^ ^ + // first last + + // first is now pointing past the last deleted element, but we cannot + // use this iterator, because it may have been invalidated by the + // resize call. Instead, we can return begin() + offset. + return Container::begin() + offset; + } + + size_type count(const key_type& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return 1; + } + } + return 0; + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + size_type count(KeyType && key) const // NOLINT(cppcoreguidelines-missing-std-forward) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return 1; + } + } + return 0; + } + + iterator find(const key_type& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it; + } + } + return Container::end(); + } + + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0> + iterator find(KeyType && key) // NOLINT(cppcoreguidelines-missing-std-forward) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const key_type& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it; + } + } + return Container::end(); + } + + std::pair<iterator, bool> insert( value_type&& value ) + { + return emplace(value.first, std::move(value.second)); + } + + std::pair<iterator, bool> insert( const value_type& value ) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, value.first)) + { + return {it, false}; + } + } + Container::push_back(value); + return {--this->end(), true}; + } + + template<typename InputIt> + using require_input_iter = typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIt>::iterator_category, + std::input_iterator_tag>::value>::type; + + template<typename InputIt, typename = require_input_iter<InputIt>> + void insert(InputIt first, InputIt last) + { + for (auto it = first; it != last; ++it) + { + insert(*it); + } + } + +private: + JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare(); +}; + +NLOHMANN_JSON_NAMESPACE_END + + +#if defined(JSON_HAS_CPP_17) + #if JSON_HAS_STATIC_RTTI + #include <any> + #endif + #include <string_view> +#endif + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +NLOHMANN_JSON_NAMESPACE_BEGIN + +/*! +@brief a class to store JSON values + +@internal +@invariant The member variables @a m_value and @a m_type have the following +relationship: +- If `m_type == value_t::object`, then `m_value.object != nullptr`. +- If `m_type == value_t::array`, then `m_value.array != nullptr`. +- If `m_type == value_t::string`, then `m_value.string != nullptr`. +The invariants are checked by member function assert_invariant(). + +@note ObjectType trick from https://stackoverflow.com/a/9860911 +@endinternal + +@since version 1.0.0 + +@nosubgrouping +*/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions) + : public ::nlohmann::detail::json_base_class<CustomBaseClass> +{ + private: + template<detail::value_t> friend struct detail::external_constructor; + + template<typename> + friend class ::nlohmann::json_pointer; + // can be restored when json_pointer backwards compatibility is removed + // friend ::nlohmann::json_pointer<StringType>; + + template<typename BasicJsonType, typename InputType> + friend class ::nlohmann::detail::parser; + friend ::nlohmann::detail::serializer<basic_json>; + template<typename BasicJsonType> + friend class ::nlohmann::detail::iter_impl; + template<typename BasicJsonType, typename CharType> + friend class ::nlohmann::detail::binary_writer; + template<typename BasicJsonType, typename InputType, typename SAX> + friend class ::nlohmann::detail::binary_reader; + template<typename BasicJsonType> + friend class ::nlohmann::detail::json_sax_dom_parser; + template<typename BasicJsonType> + friend class ::nlohmann::detail::json_sax_dom_callback_parser; + friend class ::nlohmann::detail::exception; + + /// workaround type for MSVC + using basic_json_t = NLOHMANN_BASIC_JSON_TPL; + using json_base_class_t = ::nlohmann::detail::json_base_class<CustomBaseClass>; + + JSON_PRIVATE_UNLESS_TESTED: + // convenience aliases for types residing in namespace detail; + using lexer = ::nlohmann::detail::lexer_base<basic_json>; + + template<typename InputAdapterType> + static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser( + InputAdapterType adapter, + detail::parser_callback_t<basic_json>cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false + ) + { + return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter), + std::move(cb), allow_exceptions, ignore_comments); + } + + private: + using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; + template<typename BasicJsonType> + using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>; + template<typename BasicJsonType> + using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>; + template<typename Iterator> + using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>; + template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>; + + template<typename CharType> + using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>; + + template<typename InputType> + using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>; + template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>; + + JSON_PRIVATE_UNLESS_TESTED: + using serializer = ::nlohmann::detail::serializer<basic_json>; + + public: + using value_t = detail::value_t; + /// JSON Pointer, see @ref nlohmann::json_pointer + using json_pointer = ::nlohmann::json_pointer<StringType>; + template<typename T, typename SFINAE> + using json_serializer = JSONSerializer<T, SFINAE>; + /// how to treat decoding errors + using error_handler_t = detail::error_handler_t; + /// how to treat CBOR tags + using cbor_tag_handler_t = detail::cbor_tag_handler_t; + /// helper type for initializer lists of basic_json values + using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>; + + using input_format_t = detail::input_format_t; + /// SAX interface type, see @ref nlohmann::json_sax + using json_sax_t = json_sax<basic_json>; + + //////////////// + // exceptions // + //////////////// + + /// @name exceptions + /// Classes to implement user-defined exceptions. + /// @{ + + using exception = detail::exception; + using parse_error = detail::parse_error; + using invalid_iterator = detail::invalid_iterator; + using type_error = detail::type_error; + using out_of_range = detail::out_of_range; + using other_error = detail::other_error; + + /// @} + + ///////////////////// + // container types // + ///////////////////// + + /// @name container types + /// The canonic container types to use @ref basic_json like any other STL + /// container. + /// @{ + + /// the type of elements in a basic_json container + using value_type = basic_json; + + /// the type of an element reference + using reference = value_type&; + /// the type of an element const reference + using const_reference = const value_type&; + + /// a type to represent differences between iterators + using difference_type = std::ptrdiff_t; + /// a type to represent container sizes + using size_type = std::size_t; + + /// the allocator type + using allocator_type = AllocatorType<basic_json>; + + /// the type of an element pointer + using pointer = typename std::allocator_traits<allocator_type>::pointer; + /// the type of an element const pointer + using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer; + + /// an iterator for a basic_json container + using iterator = iter_impl<basic_json>; + /// a const iterator for a basic_json container + using const_iterator = iter_impl<const basic_json>; + /// a reverse iterator for a basic_json container + using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>; + /// a const reverse iterator for a basic_json container + using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>; + + /// @} + + /// @brief returns the allocator associated with the container + /// @sa https://json.nlohmann.me/api/basic_json/get_allocator/ + static allocator_type get_allocator() + { + return allocator_type(); + } + + /// @brief returns version information on the library + /// @sa https://json.nlohmann.me/api/basic_json/meta/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json meta() + { + basic_json result; + + result["copyright"] = "(C) 2013-2023 Niels Lohmann"; + result["name"] = "JSON for Modern C++"; + result["url"] = "https://github.com/nlohmann/json"; + result["version"]["string"] = + detail::concat(std::to_string(NLOHMANN_JSON_VERSION_MAJOR), '.', + std::to_string(NLOHMANN_JSON_VERSION_MINOR), '.', + std::to_string(NLOHMANN_JSON_VERSION_PATCH)); + result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; + result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; + result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; + +#ifdef _WIN32 + result["platform"] = "win32"; +#elif defined __linux__ + result["platform"] = "linux"; +#elif defined __APPLE__ + result["platform"] = "apple"; +#elif defined __unix__ + result["platform"] = "unix"; +#else + result["platform"] = "unknown"; +#endif + +#if defined(__ICC) || defined(__INTEL_COMPILER) + result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; +#elif defined(__clang__) + result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; +#elif defined(__GNUC__) || defined(__GNUG__) + result["compiler"] = {{"family", "gcc"}, {"version", detail::concat( + std::to_string(__GNUC__), '.', + std::to_string(__GNUC_MINOR__), '.', + std::to_string(__GNUC_PATCHLEVEL__)) + } + }; +#elif defined(__HP_cc) || defined(__HP_aCC) + result["compiler"] = "hp" +#elif defined(__IBMCPP__) + result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; +#elif defined(_MSC_VER) + result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; +#elif defined(__PGI) + result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; +#elif defined(__SUNPRO_CC) + result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; +#else + result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; +#endif + +#if defined(_MSVC_LANG) + result["compiler"]["c++"] = std::to_string(_MSVC_LANG); +#elif defined(__cplusplus) + result["compiler"]["c++"] = std::to_string(__cplusplus); +#else + result["compiler"]["c++"] = "unknown"; +#endif + return result; + } + + /////////////////////////// + // JSON value data types // + /////////////////////////// + + /// @name JSON value data types + /// The data types to store a JSON value. These types are derived from + /// the template arguments passed to class @ref basic_json. + /// @{ + + /// @brief default object key comparator type + /// The actual object key comparator type (@ref object_comparator_t) may be + /// different. + /// @sa https://json.nlohmann.me/api/basic_json/default_object_comparator_t/ +#if defined(JSON_HAS_CPP_14) + // use of transparent comparator avoids unnecessary repeated construction of temporaries + // in functions involving lookup by key with types other than object_t::key_type (aka. StringType) + using default_object_comparator_t = std::less<>; +#else + using default_object_comparator_t = std::less<StringType>; +#endif + + /// @brief a type for an object + /// @sa https://json.nlohmann.me/api/basic_json/object_t/ + using object_t = ObjectType<StringType, + basic_json, + default_object_comparator_t, + AllocatorType<std::pair<const StringType, + basic_json>>>; + + /// @brief a type for an array + /// @sa https://json.nlohmann.me/api/basic_json/array_t/ + using array_t = ArrayType<basic_json, AllocatorType<basic_json>>; + + /// @brief a type for a string + /// @sa https://json.nlohmann.me/api/basic_json/string_t/ + using string_t = StringType; + + /// @brief a type for a boolean + /// @sa https://json.nlohmann.me/api/basic_json/boolean_t/ + using boolean_t = BooleanType; + + /// @brief a type for a number (integer) + /// @sa https://json.nlohmann.me/api/basic_json/number_integer_t/ + using number_integer_t = NumberIntegerType; + + /// @brief a type for a number (unsigned) + /// @sa https://json.nlohmann.me/api/basic_json/number_unsigned_t/ + using number_unsigned_t = NumberUnsignedType; + + /// @brief a type for a number (floating-point) + /// @sa https://json.nlohmann.me/api/basic_json/number_float_t/ + using number_float_t = NumberFloatType; + + /// @brief a type for a packed binary type + /// @sa https://json.nlohmann.me/api/basic_json/binary_t/ + using binary_t = nlohmann::byte_container_with_subtype<BinaryType>; + + /// @brief object key comparator type + /// @sa https://json.nlohmann.me/api/basic_json/object_comparator_t/ + using object_comparator_t = detail::actual_object_comparator_t<basic_json>; + + /// @} + + private: + + /// helper for exception-safe object creation + template<typename T, typename... Args> + JSON_HEDLEY_RETURNS_NON_NULL + static T* create(Args&& ... args) + { + AllocatorType<T> alloc; + using AllocatorTraits = std::allocator_traits<AllocatorType<T>>; + + auto deleter = [&](T * obj) + { + AllocatorTraits::deallocate(alloc, obj, 1); + }; + std::unique_ptr<T, decltype(deleter)> obj(AllocatorTraits::allocate(alloc, 1), deleter); + AllocatorTraits::construct(alloc, obj.get(), std::forward<Args>(args)...); + JSON_ASSERT(obj != nullptr); + return obj.release(); + } + + //////////////////////// + // JSON value storage // + //////////////////////// + + JSON_PRIVATE_UNLESS_TESTED: + /*! + @brief a JSON value + + The actual storage for a JSON value of the @ref basic_json class. This + union combines the different storage types for the JSON value types + defined in @ref value_t. + + JSON type | value_t type | used type + --------- | --------------- | ------------------------ + object | object | pointer to @ref object_t + array | array | pointer to @ref array_t + string | string | pointer to @ref string_t + boolean | boolean | @ref boolean_t + number | number_integer | @ref number_integer_t + number | number_unsigned | @ref number_unsigned_t + number | number_float | @ref number_float_t + binary | binary | pointer to @ref binary_t + null | null | *no value is stored* + + @note Variable-length types (objects, arrays, and strings) are stored as + pointers. The size of the union should not exceed 64 bits if the default + value types are used. + + @since version 1.0.0 + */ + union json_value + { + /// object (stored with pointer to save storage) + object_t* object; + /// array (stored with pointer to save storage) + array_t* array; + /// string (stored with pointer to save storage) + string_t* string; + /// binary (stored with pointer to save storage) + binary_t* binary; + /// boolean + boolean_t boolean; + /// number (integer) + number_integer_t number_integer; + /// number (unsigned integer) + number_unsigned_t number_unsigned; + /// number (floating-point) + number_float_t number_float; + + /// default constructor (for null values) + json_value() = default; + /// constructor for booleans + json_value(boolean_t v) noexcept : boolean(v) {} + /// constructor for numbers (integer) + json_value(number_integer_t v) noexcept : number_integer(v) {} + /// constructor for numbers (unsigned) + json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} + /// constructor for numbers (floating-point) + json_value(number_float_t v) noexcept : number_float(v) {} + /// constructor for empty values of a given type + json_value(value_t t) + { + switch (t) + { + case value_t::object: + { + object = create<object_t>(); + break; + } + + case value_t::array: + { + array = create<array_t>(); + break; + } + + case value_t::string: + { + string = create<string_t>(""); + break; + } + + case value_t::binary: + { + binary = create<binary_t>(); + break; + } + + case value_t::boolean: + { + boolean = static_cast<boolean_t>(false); + break; + } + + case value_t::number_integer: + { + number_integer = static_cast<number_integer_t>(0); + break; + } + + case value_t::number_unsigned: + { + number_unsigned = static_cast<number_unsigned_t>(0); + break; + } + + case value_t::number_float: + { + number_float = static_cast<number_float_t>(0.0); + break; + } + + case value_t::null: + { + object = nullptr; // silence warning, see #821 + break; + } + + case value_t::discarded: + default: + { + object = nullptr; // silence warning, see #821 + if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) + { + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.11.3", nullptr)); // LCOV_EXCL_LINE + } + break; + } + } + } + + /// constructor for strings + json_value(const string_t& value) : string(create<string_t>(value)) {} + + /// constructor for rvalue strings + json_value(string_t&& value) : string(create<string_t>(std::move(value))) {} + + /// constructor for objects + json_value(const object_t& value) : object(create<object_t>(value)) {} + + /// constructor for rvalue objects + json_value(object_t&& value) : object(create<object_t>(std::move(value))) {} + + /// constructor for arrays + json_value(const array_t& value) : array(create<array_t>(value)) {} + + /// constructor for rvalue arrays + json_value(array_t&& value) : array(create<array_t>(std::move(value))) {} + + /// constructor for binary arrays + json_value(const typename binary_t::container_type& value) : binary(create<binary_t>(value)) {} + + /// constructor for rvalue binary arrays + json_value(typename binary_t::container_type&& value) : binary(create<binary_t>(std::move(value))) {} + + /// constructor for binary arrays (internal type) + json_value(const binary_t& value) : binary(create<binary_t>(value)) {} + + /// constructor for rvalue binary arrays (internal type) + json_value(binary_t&& value) : binary(create<binary_t>(std::move(value))) {} + + void destroy(value_t t) + { + if ( + (t == value_t::object && object == nullptr) || + (t == value_t::array && array == nullptr) || + (t == value_t::string && string == nullptr) || + (t == value_t::binary && binary == nullptr) + ) + { + //not initialized (e.g. due to exception in the ctor) + return; + } + if (t == value_t::array || t == value_t::object) + { + // flatten the current json_value to a heap-allocated stack + std::vector<basic_json> stack; + + // move the top-level items to stack + if (t == value_t::array) + { + stack.reserve(array->size()); + std::move(array->begin(), array->end(), std::back_inserter(stack)); + } + else + { + stack.reserve(object->size()); + for (auto&& it : *object) + { + stack.push_back(std::move(it.second)); + } + } + + while (!stack.empty()) + { + // move the last item to local variable to be processed + basic_json current_item(std::move(stack.back())); + stack.pop_back(); + + // if current_item is array/object, move + // its children to the stack to be processed later + if (current_item.is_array()) + { + std::move(current_item.m_data.m_value.array->begin(), current_item.m_data.m_value.array->end(), std::back_inserter(stack)); + + current_item.m_data.m_value.array->clear(); + } + else if (current_item.is_object()) + { + for (auto&& it : *current_item.m_data.m_value.object) + { + stack.push_back(std::move(it.second)); + } + + current_item.m_data.m_value.object->clear(); + } + + // it's now safe that current_item get destructed + // since it doesn't have any children + } + } + + switch (t) + { + case value_t::object: + { + AllocatorType<object_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, object); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1); + break; + } + + case value_t::array: + { + AllocatorType<array_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, array); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1); + break; + } + + case value_t::string: + { + AllocatorType<string_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, string); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1); + break; + } + + case value_t::binary: + { + AllocatorType<binary_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, binary); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1); + break; + } + + case value_t::null: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::discarded: + default: + { + break; + } + } + } + }; + + private: + /*! + @brief checks the class invariants + + This function asserts the class invariants. It needs to be called at the + end of every constructor to make sure that created objects respect the + invariant. Furthermore, it has to be called each time the type of a JSON + value is changed, because the invariant expresses a relationship between + @a m_type and @a m_value. + + Furthermore, the parent relation is checked for arrays and objects: If + @a check_parents true and the value is an array or object, then the + container's elements must have the current value as parent. + + @param[in] check_parents whether the parent relation should be checked. + The value is true by default and should only be set to false + during destruction of objects when the invariant does not + need to hold. + */ + void assert_invariant(bool check_parents = true) const noexcept + { + JSON_ASSERT(m_data.m_type != value_t::object || m_data.m_value.object != nullptr); + JSON_ASSERT(m_data.m_type != value_t::array || m_data.m_value.array != nullptr); + JSON_ASSERT(m_data.m_type != value_t::string || m_data.m_value.string != nullptr); + JSON_ASSERT(m_data.m_type != value_t::binary || m_data.m_value.binary != nullptr); + +#if JSON_DIAGNOSTICS + JSON_TRY + { + // cppcheck-suppress assertWithSideEffect + JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json & j) + { + return j.m_parent == this; + })); + } + JSON_CATCH(...) {} // LCOV_EXCL_LINE +#endif + static_cast<void>(check_parents); + } + + void set_parents() + { +#if JSON_DIAGNOSTICS + switch (m_data.m_type) + { + case value_t::array: + { + for (auto& element : *m_data.m_value.array) + { + element.m_parent = this; + } + break; + } + + case value_t::object: + { + for (auto& element : *m_data.m_value.object) + { + element.second.m_parent = this; + } + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + break; + } +#endif + } + + iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) + { +#if JSON_DIAGNOSTICS + for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) + { + (it + i)->m_parent = this; + } +#else + static_cast<void>(count_set_parents); +#endif + return it; + } + + reference set_parent(reference j, std::size_t old_capacity = static_cast<std::size_t>(-1)) + { +#if JSON_DIAGNOSTICS + if (old_capacity != static_cast<std::size_t>(-1)) + { + // see https://github.com/nlohmann/json/issues/2838 + JSON_ASSERT(type() == value_t::array); + if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + return j; + } + } + + // ordered_json uses a vector internally, so pointers could have + // been invalidated; see https://github.com/nlohmann/json/issues/2962 +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning(push ) +#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr +#endif + if (detail::is_ordered_map<object_t>::value) + { + set_parents(); + return j; + } +#ifdef JSON_HEDLEY_MSVC_VERSION +#pragma warning( pop ) +#endif + + j.m_parent = this; +#else + static_cast<void>(j); + static_cast<void>(old_capacity); +#endif + return j; + } + + public: + ////////////////////////// + // JSON parser callback // + ////////////////////////// + + /// @brief parser event types + /// @sa https://json.nlohmann.me/api/basic_json/parse_event_t/ + using parse_event_t = detail::parse_event_t; + + /// @brief per-element parser callback type + /// @sa https://json.nlohmann.me/api/basic_json/parser_callback_t/ + using parser_callback_t = detail::parser_callback_t<basic_json>; + + ////////////////// + // constructors // + ////////////////// + + /// @name constructors and destructors + /// Constructors of class @ref basic_json, copy/move constructor, copy + /// assignment, static functions creating objects, and the destructor. + /// @{ + + /// @brief create an empty value with a given type + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const value_t v) + : m_data(v) + { + assert_invariant(); + } + + /// @brief create a null object + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(std::nullptr_t = nullptr) noexcept // NOLINT(bugprone-exception-escape) + : basic_json(value_t::null) + { + assert_invariant(); + } + + /// @brief create a JSON value from compatible types + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename CompatibleType, + typename U = detail::uncvref_t<CompatibleType>, + detail::enable_if_t < + !detail::is_basic_json<U>::value && detail::is_compatible_type<basic_json_t, U>::value, int > = 0 > + basic_json(CompatibleType && val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape) + JSONSerializer<U>::to_json(std::declval<basic_json_t&>(), + std::forward<CompatibleType>(val)))) + { + JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val)); + set_parents(); + assert_invariant(); + } + + /// @brief create a JSON value from an existing one + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 > + basic_json(const BasicJsonType& val) + { + using other_boolean_t = typename BasicJsonType::boolean_t; + using other_number_float_t = typename BasicJsonType::number_float_t; + using other_number_integer_t = typename BasicJsonType::number_integer_t; + using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; + using other_string_t = typename BasicJsonType::string_t; + using other_object_t = typename BasicJsonType::object_t; + using other_array_t = typename BasicJsonType::array_t; + using other_binary_t = typename BasicJsonType::binary_t; + + switch (val.type()) + { + case value_t::boolean: + JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>()); + break; + case value_t::number_float: + JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>()); + break; + case value_t::number_integer: + JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>()); + break; + case value_t::number_unsigned: + JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>()); + break; + case value_t::string: + JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>()); + break; + case value_t::object: + JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>()); + break; + case value_t::array: + JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>()); + break; + case value_t::binary: + JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>()); + break; + case value_t::null: + *this = nullptr; + break; + case value_t::discarded: + m_data.m_type = value_t::discarded; + break; + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + JSON_ASSERT(m_data.m_type == val.type()); + set_parents(); + assert_invariant(); + } + + /// @brief create a container (array or object) from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(initializer_list_t init, + bool type_deduction = true, + value_t manual_type = value_t::array) + { + // check if each element is an array with two elements whose first + // element is a string + bool is_an_object = std::all_of(init.begin(), init.end(), + [](const detail::json_ref<basic_json>& element_ref) + { + // The cast is to ensure op[size_type] is called, bearing in mind size_type may not be int; + // (many string types can be constructed from 0 via its null-pointer guise, so we get a + // broken call to op[key_type], the wrong semantics and a 4804 warning on Windows) + return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string(); + }); + + // adjust type if type deduction is not wanted + if (!type_deduction) + { + // if array is wanted, do not create an object though possible + if (manual_type == value_t::array) + { + is_an_object = false; + } + + // if object is wanted but impossible, throw an exception + if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) + { + JSON_THROW(type_error::create(301, "cannot create object from initializer list", nullptr)); + } + } + + if (is_an_object) + { + // the initializer list is a list of pairs -> create object + m_data.m_type = value_t::object; + m_data.m_value = value_t::object; + + for (auto& element_ref : init) + { + auto element = element_ref.moved_or_copied(); + m_data.m_value.object->emplace( + std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)), + std::move((*element.m_data.m_value.array)[1])); + } + } + else + { + // the initializer list describes an array -> create array + m_data.m_type = value_t::array; + m_data.m_value.array = create<array_t>(init.begin(), init.end()); + } + + set_parents(); + assert_invariant(); + } + + /// @brief explicitly create a binary array (without subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init) + { + auto res = basic_json(); + res.m_data.m_type = value_t::binary; + res.m_data.m_value = init; + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_data.m_type = value_t::binary; + res.m_data.m_value = binary_t(init, subtype); + return res; + } + + /// @brief explicitly create a binary array + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init) + { + auto res = basic_json(); + res.m_data.m_type = value_t::binary; + res.m_data.m_value = std::move(init); + return res; + } + + /// @brief explicitly create a binary array (with subtype) + /// @sa https://json.nlohmann.me/api/basic_json/binary/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) + { + auto res = basic_json(); + res.m_data.m_type = value_t::binary; + res.m_data.m_value = binary_t(std::move(init), subtype); + return res; + } + + /// @brief explicitly create an array from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/array/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json array(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::array); + } + + /// @brief explicitly create an object from an initializer list + /// @sa https://json.nlohmann.me/api/basic_json/object/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json object(initializer_list_t init = {}) + { + return basic_json(init, false, value_t::object); + } + + /// @brief construct an array with count copies of given value + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(size_type cnt, const basic_json& val): + m_data{cnt, val} + { + set_parents(); + assert_invariant(); + } + + /// @brief construct a JSON container given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + template < class InputIT, typename std::enable_if < + std::is_same<InputIT, typename basic_json_t::iterator>::value || + std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 > + basic_json(InputIT first, InputIT last) + { + JSON_ASSERT(first.m_object != nullptr); + JSON_ASSERT(last.m_object != nullptr); + + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", nullptr)); + } + + // copy type from first iterator + m_data.m_type = first.m_object->m_data.m_type; + + // check if iterator range is complete for primitive values + switch (m_data.m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + { + if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", first.m_object)); + } + break; + } + + case value_t::null: + case value_t::object: + case value_t::array: + case value_t::binary: + case value_t::discarded: + default: + break; + } + + switch (m_data.m_type) + { + case value_t::number_integer: + { + m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_data.m_value.number_float = first.m_object->m_data.m_value.number_float; + break; + } + + case value_t::boolean: + { + m_data.m_value.boolean = first.m_object->m_data.m_value.boolean; + break; + } + + case value_t::string: + { + m_data.m_value = *first.m_object->m_data.m_value.string; + break; + } + + case value_t::object: + { + m_data.m_value.object = create<object_t>(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + m_data.m_value.array = create<array_t>(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::binary: + { + m_data.m_value = *first.m_object->m_data.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(invalid_iterator::create(206, detail::concat("cannot construct with iterators from ", first.m_object->type_name()), first.m_object)); + } + + set_parents(); + assert_invariant(); + } + + /////////////////////////////////////// + // other constructors and destructor // + /////////////////////////////////////// + + template<typename JsonRef, + detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>, + std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 > + basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} + + /// @brief copy constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(const basic_json& other) + : json_base_class_t(other) + { + m_data.m_type = other.m_data.m_type; + // check of passed value is valid + other.assert_invariant(); + + switch (m_data.m_type) + { + case value_t::object: + { + m_data.m_value = *other.m_data.m_value.object; + break; + } + + case value_t::array: + { + m_data.m_value = *other.m_data.m_value.array; + break; + } + + case value_t::string: + { + m_data.m_value = *other.m_data.m_value.string; + break; + } + + case value_t::boolean: + { + m_data.m_value = other.m_data.m_value.boolean; + break; + } + + case value_t::number_integer: + { + m_data.m_value = other.m_data.m_value.number_integer; + break; + } + + case value_t::number_unsigned: + { + m_data.m_value = other.m_data.m_value.number_unsigned; + break; + } + + case value_t::number_float: + { + m_data.m_value = other.m_data.m_value.number_float; + break; + } + + case value_t::binary: + { + m_data.m_value = *other.m_data.m_value.binary; + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + + set_parents(); + assert_invariant(); + } + + /// @brief move constructor + /// @sa https://json.nlohmann.me/api/basic_json/basic_json/ + basic_json(basic_json&& other) noexcept + : json_base_class_t(std::forward<json_base_class_t>(other)), + m_data(std::move(other.m_data)) + { + // check that passed value is valid + other.assert_invariant(false); + + // invalidate payload + other.m_data.m_type = value_t::null; + other.m_data.m_value = {}; + + set_parents(); + assert_invariant(); + } + + /// @brief copy assignment + /// @sa https://json.nlohmann.me/api/basic_json/operator=/ + basic_json& operator=(basic_json other) noexcept ( + std::is_nothrow_move_constructible<value_t>::value&& + std::is_nothrow_move_assignable<value_t>::value&& + std::is_nothrow_move_constructible<json_value>::value&& + std::is_nothrow_move_assignable<json_value>::value&& + std::is_nothrow_move_assignable<json_base_class_t>::value + ) + { + // check that passed value is valid + other.assert_invariant(); + + using std::swap; + swap(m_data.m_type, other.m_data.m_type); + swap(m_data.m_value, other.m_data.m_value); + json_base_class_t::operator=(std::move(other)); + + set_parents(); + assert_invariant(); + return *this; + } + + /// @brief destructor + /// @sa https://json.nlohmann.me/api/basic_json/~basic_json/ + ~basic_json() noexcept + { + assert_invariant(false); + } + + /// @} + + public: + /////////////////////// + // object inspection // + /////////////////////// + + /// @name object inspection + /// Functions to inspect the type of a JSON value. + /// @{ + + /// @brief serialization + /// @sa https://json.nlohmann.me/api/basic_json/dump/ + string_t dump(const int indent = -1, + const char indent_char = ' ', + const bool ensure_ascii = false, + const error_handler_t error_handler = error_handler_t::strict) const + { + string_t result; + serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler); + + if (indent >= 0) + { + s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent)); + } + else + { + s.dump(*this, false, ensure_ascii, 0); + } + + return result; + } + + /// @brief return the type of the JSON value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/type/ + constexpr value_t type() const noexcept + { + return m_data.m_type; + } + + /// @brief return whether type is primitive + /// @sa https://json.nlohmann.me/api/basic_json/is_primitive/ + constexpr bool is_primitive() const noexcept + { + return is_null() || is_string() || is_boolean() || is_number() || is_binary(); + } + + /// @brief return whether type is structured + /// @sa https://json.nlohmann.me/api/basic_json/is_structured/ + constexpr bool is_structured() const noexcept + { + return is_array() || is_object(); + } + + /// @brief return whether value is null + /// @sa https://json.nlohmann.me/api/basic_json/is_null/ + constexpr bool is_null() const noexcept + { + return m_data.m_type == value_t::null; + } + + /// @brief return whether value is a boolean + /// @sa https://json.nlohmann.me/api/basic_json/is_boolean/ + constexpr bool is_boolean() const noexcept + { + return m_data.m_type == value_t::boolean; + } + + /// @brief return whether value is a number + /// @sa https://json.nlohmann.me/api/basic_json/is_number/ + constexpr bool is_number() const noexcept + { + return is_number_integer() || is_number_float(); + } + + /// @brief return whether value is an integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_integer/ + constexpr bool is_number_integer() const noexcept + { + return m_data.m_type == value_t::number_integer || m_data.m_type == value_t::number_unsigned; + } + + /// @brief return whether value is an unsigned integer number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_unsigned/ + constexpr bool is_number_unsigned() const noexcept + { + return m_data.m_type == value_t::number_unsigned; + } + + /// @brief return whether value is a floating-point number + /// @sa https://json.nlohmann.me/api/basic_json/is_number_float/ + constexpr bool is_number_float() const noexcept + { + return m_data.m_type == value_t::number_float; + } + + /// @brief return whether value is an object + /// @sa https://json.nlohmann.me/api/basic_json/is_object/ + constexpr bool is_object() const noexcept + { + return m_data.m_type == value_t::object; + } + + /// @brief return whether value is an array + /// @sa https://json.nlohmann.me/api/basic_json/is_array/ + constexpr bool is_array() const noexcept + { + return m_data.m_type == value_t::array; + } + + /// @brief return whether value is a string + /// @sa https://json.nlohmann.me/api/basic_json/is_string/ + constexpr bool is_string() const noexcept + { + return m_data.m_type == value_t::string; + } + + /// @brief return whether value is a binary array + /// @sa https://json.nlohmann.me/api/basic_json/is_binary/ + constexpr bool is_binary() const noexcept + { + return m_data.m_type == value_t::binary; + } + + /// @brief return whether value is discarded + /// @sa https://json.nlohmann.me/api/basic_json/is_discarded/ + constexpr bool is_discarded() const noexcept + { + return m_data.m_type == value_t::discarded; + } + + /// @brief return the type of the JSON value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/operator_value_t/ + constexpr operator value_t() const noexcept + { + return m_data.m_type; + } + + /// @} + + private: + ////////////////// + // value access // + ////////////////// + + /// get a boolean (explicit) + boolean_t get_impl(boolean_t* /*unused*/) const + { + if (JSON_HEDLEY_LIKELY(is_boolean())) + { + return m_data.m_value.boolean; + } + + JSON_THROW(type_error::create(302, detail::concat("type must be boolean, but is ", type_name()), this)); + } + + /// get a pointer to the value (object) + object_t* get_impl_ptr(object_t* /*unused*/) noexcept + { + return is_object() ? m_data.m_value.object : nullptr; + } + + /// get a pointer to the value (object) + constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept + { + return is_object() ? m_data.m_value.object : nullptr; + } + + /// get a pointer to the value (array) + array_t* get_impl_ptr(array_t* /*unused*/) noexcept + { + return is_array() ? m_data.m_value.array : nullptr; + } + + /// get a pointer to the value (array) + constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept + { + return is_array() ? m_data.m_value.array : nullptr; + } + + /// get a pointer to the value (string) + string_t* get_impl_ptr(string_t* /*unused*/) noexcept + { + return is_string() ? m_data.m_value.string : nullptr; + } + + /// get a pointer to the value (string) + constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept + { + return is_string() ? m_data.m_value.string : nullptr; + } + + /// get a pointer to the value (boolean) + boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept + { + return is_boolean() ? &m_data.m_value.boolean : nullptr; + } + + /// get a pointer to the value (boolean) + constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept + { + return is_boolean() ? &m_data.m_value.boolean : nullptr; + } + + /// get a pointer to the value (integer number) + number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept + { + return is_number_integer() ? &m_data.m_value.number_integer : nullptr; + } + + /// get a pointer to the value (integer number) + constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept + { + return is_number_integer() ? &m_data.m_value.number_integer : nullptr; + } + + /// get a pointer to the value (unsigned number) + number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept + { + return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (unsigned number) + constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept + { + return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr; + } + + /// get a pointer to the value (floating-point number) + number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept + { + return is_number_float() ? &m_data.m_value.number_float : nullptr; + } + + /// get a pointer to the value (floating-point number) + constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept + { + return is_number_float() ? &m_data.m_value.number_float : nullptr; + } + + /// get a pointer to the value (binary) + binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept + { + return is_binary() ? m_data.m_value.binary : nullptr; + } + + /// get a pointer to the value (binary) + constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept + { + return is_binary() ? m_data.m_value.binary : nullptr; + } + + /*! + @brief helper function to implement get_ref() + + This function helps to implement get_ref() without code duplication for + const and non-const overloads + + @tparam ThisType will be deduced as `basic_json` or `const basic_json` + + @throw type_error.303 if ReferenceType does not match underlying value + type of the current JSON + */ + template<typename ReferenceType, typename ThisType> + static ReferenceType get_ref_impl(ThisType& obj) + { + // delegate the call to get_ptr<>() + auto* ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>(); + + if (JSON_HEDLEY_LIKELY(ptr != nullptr)) + { + return *ptr; + } + + JSON_THROW(type_error::create(303, detail::concat("incompatible ReferenceType for get_ref, actual type is ", obj.type_name()), &obj)); + } + + public: + /// @name value access + /// Direct access to the stored value of a JSON value. + /// @{ + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template<typename PointerType, typename std::enable_if< + std::is_pointer<PointerType>::value, int>::type = 0> + auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>())) + { + // delegate the call to get_impl_ptr<>() + return get_impl_ptr(static_cast<PointerType>(nullptr)); + } + + /// @brief get a pointer value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ptr/ + template < typename PointerType, typename std::enable_if < + std::is_pointer<PointerType>::value&& + std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 > + constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>())) + { + // delegate the call to get_impl_ptr<>() const + return get_impl_ptr(static_cast<PointerType>(nullptr)); + } + + private: + /*! + @brief get a value (explicit) + + Explicit type conversion between the JSON value and a compatible value + which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer<ValueType> + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + ValueType ret; + JSONSerializer<ValueType>::from_json(*this, ret); + return ret; + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json, + - @ref json_serializer<ValueType> has a `from_json()` method of the form + `void from_json(const basic_json&, ValueType&)`, and + - @ref json_serializer<ValueType> does not have a `from_json()` method of + the form `ValueType from_json(const basic_json&)` + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer<ValueType> `from_json()` method throws + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector<short>`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map<std::string\, + json>`.,get__ValueType_const} + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::is_default_constructible<ValueType>::value&& + detail::has_from_json<basic_json_t, ValueType>::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept( + JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>()))) + { + auto ret = ValueType(); + JSONSerializer<ValueType>::from_json(*this, ret); + return ret; + } + + /*! + @brief get a value (explicit); special case + + Explicit type conversion between the JSON value and a compatible value + which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) + and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). + The value is converted by calling the @ref json_serializer<ValueType> + `from_json()` method. + + The function is equivalent to executing + @code {.cpp} + return JSONSerializer<ValueType>::from_json(*this); + @endcode + + This overloads is chosen if: + - @a ValueType is not @ref basic_json and + - @ref json_serializer<ValueType> has a `from_json()` method of the form + `ValueType from_json(const basic_json&)` + + @note If @ref json_serializer<ValueType> has both overloads of + `from_json()`, this one is chosen. + + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @a ValueType + + @throw what @ref json_serializer<ValueType> `from_json()` method throws + + @since version 2.1.0 + */ + template < typename ValueType, + detail::enable_if_t < + detail::has_non_default_from_json<basic_json_t, ValueType>::value, + int > = 0 > + ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept( + JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>()))) + { + return JSONSerializer<ValueType>::from_json(*this); + } + + /*! + @brief get special-case overload + + This overloads converts the current @ref basic_json in a different + @ref basic_json type + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this, converted into @a BasicJsonType + + @complexity Depending on the implementation of the called `from_json()` + method. + + @since version 3.2.0 + */ + template < typename BasicJsonType, + detail::enable_if_t < + detail::is_basic_json<BasicJsonType>::value, + int > = 0 > + BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const + { + return *this; + } + + /*! + @brief get special-case overload + + This overloads avoids a lot of template boilerplate, it can be seen as the + identity method + + @tparam BasicJsonType == @ref basic_json + + @return a copy of *this + + @complexity Constant. + + @since version 2.1.0 + */ + template<typename BasicJsonType, + detail::enable_if_t< + std::is_same<BasicJsonType, basic_json_t>::value, + int> = 0> + basic_json get_impl(detail::priority_tag<3> /*unused*/) const + { + return *this; + } + + /*! + @brief get a pointer value (explicit) + @copydoc get() + */ + template<typename PointerType, + detail::enable_if_t< + std::is_pointer<PointerType>::value, + int> = 0> + constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept + -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>()) + { + // delegate the call to get_ptr + return get_ptr<PointerType>(); + } + + public: + /*! + @brief get a (pointer) value (explicit) + + Performs explicit type conversion between the JSON value and a compatible value if required. + + - If the requested type is a pointer to the internally stored JSON value that pointer is returned. + No copies are made. + + - If the requested type is the current @ref basic_json, or a different @ref basic_json convertible + from the current @ref basic_json. + + - Otherwise the value is converted by calling the @ref json_serializer<ValueType> `from_json()` + method. + + @tparam ValueTypeCV the provided value type + @tparam ValueType the returned value type + + @return copy of the JSON value, converted to @tparam ValueType if necessary + + @throw what @ref json_serializer<ValueType> `from_json()` method throws if conversion is required + + @since version 2.1.0 + */ + template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>> +#if defined(JSON_HAS_CPP_14) + constexpr +#endif + auto get() const noexcept( + noexcept(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {}))) + -> decltype(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {})) + { + // we cannot static_assert on ValueTypeCV being non-const, because + // there is support for get<const basic_json_t>(), which is why we + // still need the uncvref + static_assert(!std::is_reference<ValueTypeCV>::value, + "get() cannot be used with reference types, you might want to use get_ref()"); + return get_impl<ValueType>(detail::priority_tag<4> {}); + } + + /*! + @brief get a pointer value (explicit) + + Explicit pointer access to the internally stored JSON value. No copies are + made. + + @warning The pointer becomes invalid if the underlying JSON object + changes. + + @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref + object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, + @ref number_unsigned_t, or @ref number_float_t. + + @return pointer to the internally stored JSON value if the requested + pointer type @a PointerType fits to the JSON value; `nullptr` otherwise + + @complexity Constant. + + @liveexample{The example below shows how pointers to internal values of a + JSON value can be requested. Note that no type conversions are made and a + `nullptr` is returned if the value and the requested pointer type does not + match.,get__PointerType} + + @sa see @ref get_ptr() for explicit pointer-member access + + @since version 1.0.0 + */ + template<typename PointerType, typename std::enable_if< + std::is_pointer<PointerType>::value, int>::type = 0> + auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>()) + { + // delegate the call to get_ptr + return get_ptr<PointerType>(); + } + + /// @brief get a value (explicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_to/ + template < typename ValueType, + detail::enable_if_t < + !detail::is_basic_json<ValueType>::value&& + detail::has_from_json<basic_json_t, ValueType>::value, + int > = 0 > + ValueType & get_to(ValueType& v) const noexcept(noexcept( + JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v))) + { + JSONSerializer<ValueType>::from_json(*this, v); + return v; + } + + // specialization to allow calling get_to with a basic_json value + // see https://github.com/nlohmann/json/issues/2175 + template<typename ValueType, + detail::enable_if_t < + detail::is_basic_json<ValueType>::value, + int> = 0> + ValueType & get_to(ValueType& v) const + { + v = *this; + return v; + } + + template < + typename T, std::size_t N, + typename Array = T (&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + detail::enable_if_t < + detail::has_from_json<basic_json_t, Array>::value, int > = 0 > + Array get_to(T (&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) + noexcept(noexcept(JSONSerializer<Array>::from_json( + std::declval<const basic_json_t&>(), v))) + { + JSONSerializer<Array>::from_json(*this, v); + return v; + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template<typename ReferenceType, typename std::enable_if< + std::is_reference<ReferenceType>::value, int>::type = 0> + ReferenceType get_ref() + { + // delegate call to get_ref_impl + return get_ref_impl<ReferenceType>(*this); + } + + /// @brief get a reference value (implicit) + /// @sa https://json.nlohmann.me/api/basic_json/get_ref/ + template < typename ReferenceType, typename std::enable_if < + std::is_reference<ReferenceType>::value&& + std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 > + ReferenceType get_ref() const + { + // delegate call to get_ref_impl + return get_ref_impl<ReferenceType>(*this); + } + + /*! + @brief get a value (implicit) + + Implicit type conversion between the JSON value and a compatible value. + The call is realized by calling @ref get() const. + + @tparam ValueType non-pointer type compatible to the JSON value, for + instance `int` for JSON integer numbers, `bool` for JSON booleans, or + `std::vector` types for JSON arrays. The character type of @ref string_t + as well as an initializer list of this type is excluded to avoid + ambiguities as these types implicitly convert to `std::string`. + + @return copy of the JSON value, converted to type @a ValueType + + @throw type_error.302 in case passed type @a ValueType is incompatible + to the JSON value type (e.g., the JSON value is of type boolean, but a + string is requested); see example below + + @complexity Linear in the size of the JSON value. + + @liveexample{The example below shows several conversions from JSON values + to other types. There a few things to note: (1) Floating-point numbers can + be converted to integers\, (2) A JSON array can be converted to a standard + `std::vector<short>`\, (3) A JSON object can be converted to C++ + associative containers such as `std::unordered_map<std::string\, + json>`.,operator__ValueType} + + @since version 1.0.0 + */ + template < typename ValueType, typename std::enable_if < + detail::conjunction < + detail::negation<std::is_pointer<ValueType>>, + detail::negation<std::is_same<ValueType, std::nullptr_t>>, + detail::negation<std::is_same<ValueType, detail::json_ref<basic_json>>>, + detail::negation<std::is_same<ValueType, typename string_t::value_type>>, + detail::negation<detail::is_basic_json<ValueType>>, + detail::negation<std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>>, +#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) + detail::negation<std::is_same<ValueType, std::string_view>>, +#endif +#if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI + detail::negation<std::is_same<ValueType, std::any>>, +#endif + detail::is_detected_lazy<detail::get_template_function, const basic_json_t&, ValueType> + >::value, int >::type = 0 > + JSON_EXPLICIT operator ValueType() const + { + // delegate the call to get<>() const + return get<ValueType>(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + binary_t& get_binary() + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, detail::concat("type must be binary, but is ", type_name()), this)); + } + + return *get_ptr<binary_t*>(); + } + + /// @brief get a binary value + /// @sa https://json.nlohmann.me/api/basic_json/get_binary/ + const binary_t& get_binary() const + { + if (!is_binary()) + { + JSON_THROW(type_error::create(302, detail::concat("type must be binary, but is ", type_name()), this)); + } + + return *get_ptr<const binary_t*>(); + } + + /// @} + + //////////////////// + // element access // + //////////////////// + + /// @name element access + /// Access to the JSON value. + /// @{ + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(size_type idx) + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return set_parent(m_data.m_value.array->at(idx)); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this)); + } + } + else + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + } + + /// @brief access specified array element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(size_type idx) const + { + // at only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + JSON_TRY + { + return m_data.m_value.array->at(idx); + } + JSON_CATCH (std::out_of_range&) + { + // create better exception explanation + JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this)); + } + } + else + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const typename object_t::key_type& key) + { + // at only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + + auto it = m_data.m_value.object->find(key); + if (it == m_data.m_value.object->end()) + { + JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this)); + } + return set_parent(it->second); + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + reference at(KeyType && key) + { + // at only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + + auto it = m_data.m_value.object->find(std::forward<KeyType>(key)); + if (it == m_data.m_value.object->end()) + { + JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this)); + } + return set_parent(it->second); + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const typename object_t::key_type& key) const + { + // at only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + + auto it = m_data.m_value.object->find(key); + if (it == m_data.m_value.object->end()) + { + JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this)); + } + return it->second; + } + + /// @brief access specified object element with bounds checking + /// @sa https://json.nlohmann.me/api/basic_json/at/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + const_reference at(KeyType && key) const + { + // at only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this)); + } + + auto it = m_data.m_value.object->find(std::forward<KeyType>(key)); + if (it == m_data.m_value.object->end()) + { + JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this)); + } + return it->second; + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](size_type idx) + { + // implicitly convert null value to an empty array + if (is_null()) + { + m_data.m_type = value_t::array; + m_data.m_value.array = create<array_t>(); + assert_invariant(); + } + + // operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // fill up array with null values if given idx is outside range + if (idx >= m_data.m_value.array->size()) + { +#if JSON_DIAGNOSTICS + // remember array size & capacity before resizing + const auto old_size = m_data.m_value.array->size(); + const auto old_capacity = m_data.m_value.array->capacity(); +#endif + m_data.m_value.array->resize(idx + 1); + +#if JSON_DIAGNOSTICS + if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity)) + { + // capacity has changed: update all parents + set_parents(); + } + else + { + // set parent for values added above + set_parents(begin() + static_cast<typename iterator::difference_type>(old_size), static_cast<typename iterator::difference_type>(idx + 1 - old_size)); + } +#endif + assert_invariant(); + } + + return m_data.m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this)); + } + + /// @brief access specified array element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](size_type idx) const + { + // const operator[] only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + return m_data.m_value.array->operator[](idx); + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](typename object_t::key_type key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_data.m_type = value_t::object; + m_data.m_value.object = create<object_t>(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto result = m_data.m_value.object->emplace(std::move(key), nullptr); + return set_parent(result.first->second); + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const typename object_t::key_type& key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto it = m_data.m_value.object->find(key); + JSON_ASSERT(it != m_data.m_value.object->end()); + return it->second; + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this)); + } + + // these two functions resolve a (const) char * ambiguity affecting Clang and MSVC + // (they seemingly cannot be constrained to resolve the ambiguity) + template<typename T> + reference operator[](T* key) + { + return operator[](typename object_t::key_type(key)); + } + + template<typename T> + const_reference operator[](T* key) const + { + return operator[](typename object_t::key_type(key)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 > + reference operator[](KeyType && key) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_data.m_type = value_t::object; + m_data.m_value.object = create<object_t>(); + assert_invariant(); + } + + // operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto result = m_data.m_value.object->emplace(std::forward<KeyType>(key), nullptr); + return set_parent(result.first->second); + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this)); + } + + /// @brief access specified object element + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 > + const_reference operator[](KeyType && key) const + { + // const operator[] only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + auto it = m_data.m_value.object->find(std::forward<KeyType>(key)); + JSON_ASSERT(it != m_data.m_value.object->end()); + return it->second; + } + + JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this)); + } + + private: + template<typename KeyType> + using is_comparable_with_object_key = detail::is_comparable < + object_comparator_t, const typename object_t::key_type&, KeyType >; + + template<typename ValueType> + using value_return_type = std::conditional < + detail::is_c_string_uncvref<ValueType>::value, + string_t, typename std::decay<ValueType>::type >; + + public: + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, detail::enable_if_t < + !detail::is_transparent<object_comparator_t>::value + && detail::is_getable<basic_json_t, ValueType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get<ValueType>(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type, + detail::enable_if_t < + !detail::is_transparent<object_comparator_t>::value + && detail::is_getable<basic_json_t, ReturnType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ReturnType value(const typename object_t::key_type& key, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get<ReturnType>(); + } + + return std::forward<ValueType>(default_value); + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class KeyType, detail::enable_if_t < + detail::is_transparent<object_comparator_t>::value + && !detail::is_json_pointer<KeyType>::value + && is_comparable_with_object_key<KeyType>::value + && detail::is_getable<basic_json_t, ValueType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ValueType value(KeyType && key, const ValueType& default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(std::forward<KeyType>(key)); + if (it != end()) + { + return it->template get<ValueType>(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class KeyType, class ReturnType = typename value_return_type<ValueType>::type, + detail::enable_if_t < + detail::is_transparent<object_comparator_t>::value + && !detail::is_json_pointer<KeyType>::value + && is_comparable_with_object_key<KeyType>::value + && detail::is_getable<basic_json_t, ReturnType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ReturnType value(KeyType && key, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(std::forward<KeyType>(key)); + if (it != end()) + { + return it->template get<ReturnType>(); + } + + return std::forward<ValueType>(default_value); + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, detail::enable_if_t < + detail::is_getable<basic_json_t, ValueType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ValueType value(const json_pointer& ptr, const ValueType& default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get<ValueType>(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return default_value; + } + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type, + detail::enable_if_t < + detail::is_getable<basic_json_t, ReturnType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + ReturnType value(const json_pointer& ptr, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get<ReturnType>(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return std::forward<ValueType>(default_value); + } + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + template < class ValueType, class BasicJsonType, detail::enable_if_t < + detail::is_basic_json<BasicJsonType>::value + && detail::is_getable<basic_json_t, ValueType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + ValueType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, const ValueType& default_value) const + { + return value(ptr.convert(), default_value); + } + + template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type<ValueType>::type, + detail::enable_if_t < + detail::is_basic_json<BasicJsonType>::value + && detail::is_getable<basic_json_t, ReturnType>::value + && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 > + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + ReturnType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, ValueType && default_value) const + { + return value(ptr.convert(), std::forward<ValueType>(default_value)); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + reference front() + { + return *begin(); + } + + /// @brief access the first element + /// @sa https://json.nlohmann.me/api/basic_json/front/ + const_reference front() const + { + return *cbegin(); + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + reference back() + { + auto tmp = end(); + --tmp; + return *tmp; + } + + /// @brief access the last element + /// @sa https://json.nlohmann.me/api/basic_json/back/ + const_reference back() const + { + auto tmp = cend(); + --tmp; + return *tmp; + } + + /// @brief remove element given an iterator + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, detail::enable_if_t < + std::is_same<IteratorType, typename basic_json_t::iterator>::value || + std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 > + IteratorType erase(IteratorType pos) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this)); + } + + IteratorType result = end(); + + switch (m_data.m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) + { + JSON_THROW(invalid_iterator::create(205, "iterator out of range", this)); + } + + if (is_string()) + { + AllocatorType<string_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1); + m_data.m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType<binary_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1); + m_data.m_value.binary = nullptr; + } + + m_data.m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_data.m_value.object->erase(pos.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_data.m_value.array->erase(pos.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this)); + } + + return result; + } + + /// @brief remove elements given an iterator range + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template < class IteratorType, detail::enable_if_t < + std::is_same<IteratorType, typename basic_json_t::iterator>::value || + std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 > + IteratorType erase(IteratorType first, IteratorType last) + { + // make sure iterator fits the current value + if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) + { + JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", this)); + } + + IteratorType result = end(); + + switch (m_data.m_type) + { + case value_t::boolean: + case value_t::number_float: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::string: + case value_t::binary: + { + if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() + || !last.m_it.primitive_iterator.is_end())) + { + JSON_THROW(invalid_iterator::create(204, "iterators out of range", this)); + } + + if (is_string()) + { + AllocatorType<string_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1); + m_data.m_value.string = nullptr; + } + else if (is_binary()) + { + AllocatorType<binary_t> alloc; + std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary); + std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1); + m_data.m_value.binary = nullptr; + } + + m_data.m_type = value_t::null; + assert_invariant(); + break; + } + + case value_t::object: + { + result.m_it.object_iterator = m_data.m_value.object->erase(first.m_it.object_iterator, + last.m_it.object_iterator); + break; + } + + case value_t::array: + { + result.m_it.array_iterator = m_data.m_value.array->erase(first.m_it.array_iterator, + last.m_it.array_iterator); + break; + } + + case value_t::null: + case value_t::discarded: + default: + JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this)); + } + + return result; + } + + private: + template < typename KeyType, detail::enable_if_t < + detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 > + size_type erase_internal(KeyType && key) + { + // this erase only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this)); + } + + return m_data.m_value.object->erase(std::forward<KeyType>(key)); + } + + template < typename KeyType, detail::enable_if_t < + !detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 > + size_type erase_internal(KeyType && key) + { + // this erase only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this)); + } + + const auto it = m_data.m_value.object->find(std::forward<KeyType>(key)); + if (it != m_data.m_value.object->end()) + { + m_data.m_value.object->erase(it); + return 1; + } + return 0; + } + + public: + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + size_type erase(const typename object_t::key_type& key) + { + // the indirection via erase_internal() is added to avoid making this + // function a template and thus de-rank it during overload resolution + return erase_internal(key); + } + + /// @brief remove element from a JSON object given a key + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + size_type erase(KeyType && key) + { + return erase_internal(std::forward<KeyType>(key)); + } + + /// @brief remove element from a JSON array given an index + /// @sa https://json.nlohmann.me/api/basic_json/erase/ + void erase(const size_type idx) + { + // this erase only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + if (JSON_HEDLEY_UNLIKELY(idx >= size())) + { + JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this)); + } + + m_data.m_value.array->erase(m_data.m_value.array->begin() + static_cast<difference_type>(idx)); + } + else + { + JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this)); + } + } + + /// @} + + //////////// + // lookup // + //////////// + + /// @name lookup + /// @{ + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + iterator find(const typename object_t::key_type& key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_data.m_value.object->find(key); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + const_iterator find(const typename object_t::key_type& key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_data.m_value.object->find(key); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + iterator find(KeyType && key) + { + auto result = end(); + + if (is_object()) + { + result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key)); + } + + return result; + } + + /// @brief find an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/find/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + const_iterator find(KeyType && key) const + { + auto result = cend(); + + if (is_object()) + { + result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key)); + } + + return result; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + size_type count(const typename object_t::key_type& key) const + { + // return 0 for all nonobject types + return is_object() ? m_data.m_value.object->count(key) : 0; + } + + /// @brief returns the number of occurrences of a key in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/count/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + size_type count(KeyType && key) const + { + // return 0 for all nonobject types + return is_object() ? m_data.m_value.object->count(std::forward<KeyType>(key)) : 0; + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const typename object_t::key_type& key) const + { + return is_object() && m_data.m_value.object->find(key) != m_data.m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + template<class KeyType, detail::enable_if_t< + detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0> + bool contains(KeyType && key) const + { + return is_object() && m_data.m_value.object->find(std::forward<KeyType>(key)) != m_data.m_value.object->end(); + } + + /// @brief check the existence of an element in a JSON object given a JSON pointer + /// @sa https://json.nlohmann.me/api/basic_json/contains/ + bool contains(const json_pointer& ptr) const + { + return ptr.contains(this); + } + + template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0> + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + bool contains(const typename ::nlohmann::json_pointer<BasicJsonType>& ptr) const + { + return ptr.contains(this); + } + + /// @} + + /////////////// + // iterators // + /////////////// + + /// @name iterators + /// @{ + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + iterator begin() noexcept + { + iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/begin/ + const_iterator begin() const noexcept + { + return cbegin(); + } + + /// @brief returns a const iterator to the first element + /// @sa https://json.nlohmann.me/api/basic_json/cbegin/ + const_iterator cbegin() const noexcept + { + const_iterator result(this); + result.set_begin(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + iterator end() noexcept + { + iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/end/ + const_iterator end() const noexcept + { + return cend(); + } + + /// @brief returns an iterator to one past the last element + /// @sa https://json.nlohmann.me/api/basic_json/cend/ + const_iterator cend() const noexcept + { + const_iterator result(this); + result.set_end(); + return result; + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + /// @brief returns an iterator to the reverse-beginning + /// @sa https://json.nlohmann.me/api/basic_json/rbegin/ + const_reverse_iterator rbegin() const noexcept + { + return crbegin(); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + /// @brief returns an iterator to the reverse-end + /// @sa https://json.nlohmann.me/api/basic_json/rend/ + const_reverse_iterator rend() const noexcept + { + return crend(); + } + + /// @brief returns a const reverse iterator to the last element + /// @sa https://json.nlohmann.me/api/basic_json/crbegin/ + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(cend()); + } + + /// @brief returns a const reverse iterator to one before the first + /// @sa https://json.nlohmann.me/api/basic_json/crend/ + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(cbegin()); + } + + public: + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept + { + return ref.items(); + } + + /// @brief wrapper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + /// @deprecated This function is deprecated since 3.1.0 and will be removed in + /// version 4.0.0 of the library. Please use @ref items() instead; + /// that is, replace `json::iterator_wrapper(j)` with `j.items()`. + JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) + static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept + { + return ref.items(); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy<iterator> items() noexcept + { + return iteration_proxy<iterator>(*this); + } + + /// @brief helper to access iterator member functions in range-based for + /// @sa https://json.nlohmann.me/api/basic_json/items/ + iteration_proxy<const_iterator> items() const noexcept + { + return iteration_proxy<const_iterator>(*this); + } + + /// @} + + ////////////// + // capacity // + ////////////// + + /// @name capacity + /// @{ + + /// @brief checks whether the container is empty. + /// @sa https://json.nlohmann.me/api/basic_json/empty/ + bool empty() const noexcept + { + switch (m_data.m_type) + { + case value_t::null: + { + // null values are empty + return true; + } + + case value_t::array: + { + // delegate call to array_t::empty() + return m_data.m_value.array->empty(); + } + + case value_t::object: + { + // delegate call to object_t::empty() + return m_data.m_value.object->empty(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types are nonempty + return false; + } + } + } + + /// @brief returns the number of elements + /// @sa https://json.nlohmann.me/api/basic_json/size/ + size_type size() const noexcept + { + switch (m_data.m_type) + { + case value_t::null: + { + // null values are empty + return 0; + } + + case value_t::array: + { + // delegate call to array_t::size() + return m_data.m_value.array->size(); + } + + case value_t::object: + { + // delegate call to object_t::size() + return m_data.m_value.object->size(); + } + + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have size 1 + return 1; + } + } + } + + /// @brief returns the maximum possible number of elements + /// @sa https://json.nlohmann.me/api/basic_json/max_size/ + size_type max_size() const noexcept + { + switch (m_data.m_type) + { + case value_t::array: + { + // delegate call to array_t::max_size() + return m_data.m_value.array->max_size(); + } + + case value_t::object: + { + // delegate call to object_t::max_size() + return m_data.m_value.object->max_size(); + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // all other types have max_size() == size() + return size(); + } + } + } + + /// @} + + /////////////// + // modifiers // + /////////////// + + /// @name modifiers + /// @{ + + /// @brief clears the contents + /// @sa https://json.nlohmann.me/api/basic_json/clear/ + void clear() noexcept + { + switch (m_data.m_type) + { + case value_t::number_integer: + { + m_data.m_value.number_integer = 0; + break; + } + + case value_t::number_unsigned: + { + m_data.m_value.number_unsigned = 0; + break; + } + + case value_t::number_float: + { + m_data.m_value.number_float = 0.0; + break; + } + + case value_t::boolean: + { + m_data.m_value.boolean = false; + break; + } + + case value_t::string: + { + m_data.m_value.string->clear(); + break; + } + + case value_t::binary: + { + m_data.m_value.binary->clear(); + break; + } + + case value_t::array: + { + m_data.m_value.array->clear(); + break; + } + + case value_t::object: + { + m_data.m_value.object->clear(); + break; + } + + case value_t::null: + case value_t::discarded: + default: + break; + } + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(basic_json&& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this)); + } + + // transform null object into an array + if (is_null()) + { + m_data.m_type = value_t::array; + m_data.m_value = value_t::array; + assert_invariant(); + } + + // add element to array (move semantics) + const auto old_capacity = m_data.m_value.array->capacity(); + m_data.m_value.array->push_back(std::move(val)); + set_parent(m_data.m_value.array->back(), old_capacity); + // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(basic_json&& val) + { + push_back(std::move(val)); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const basic_json& val) + { + // push_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this)); + } + + // transform null object into an array + if (is_null()) + { + m_data.m_type = value_t::array; + m_data.m_value = value_t::array; + assert_invariant(); + } + + // add element to array + const auto old_capacity = m_data.m_value.array->capacity(); + m_data.m_value.array->push_back(val); + set_parent(m_data.m_value.array->back(), old_capacity); + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const basic_json& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(const typename object_t::value_type& val) + { + // push_back only works for null objects or objects + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this)); + } + + // transform null object into an object + if (is_null()) + { + m_data.m_type = value_t::object; + m_data.m_value = value_t::object; + assert_invariant(); + } + + // add element to object + auto res = m_data.m_value.object->insert(val); + set_parent(res.first->second); + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(const typename object_t::value_type& val) + { + push_back(val); + return *this; + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/push_back/ + void push_back(initializer_list_t init) + { + if (is_object() && init.size() == 2 && (*init.begin())->is_string()) + { + basic_json&& key = init.begin()->moved_or_copied(); + push_back(typename object_t::value_type( + std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied())); + } + else + { + push_back(basic_json(init)); + } + } + + /// @brief add an object to an object + /// @sa https://json.nlohmann.me/api/basic_json/operator+=/ + reference operator+=(initializer_list_t init) + { + push_back(init); + return *this; + } + + /// @brief add an object to an array + /// @sa https://json.nlohmann.me/api/basic_json/emplace_back/ + template<class... Args> + reference emplace_back(Args&& ... args) + { + // emplace_back only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) + { + JSON_THROW(type_error::create(311, detail::concat("cannot use emplace_back() with ", type_name()), this)); + } + + // transform null object into an array + if (is_null()) + { + m_data.m_type = value_t::array; + m_data.m_value = value_t::array; + assert_invariant(); + } + + // add element to array (perfect forwarding) + const auto old_capacity = m_data.m_value.array->capacity(); + m_data.m_value.array->emplace_back(std::forward<Args>(args)...); + return set_parent(m_data.m_value.array->back(), old_capacity); + } + + /// @brief add an object to an object if key does not exist + /// @sa https://json.nlohmann.me/api/basic_json/emplace/ + template<class... Args> + std::pair<iterator, bool> emplace(Args&& ... args) + { + // emplace only works for null objects or arrays + if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) + { + JSON_THROW(type_error::create(311, detail::concat("cannot use emplace() with ", type_name()), this)); + } + + // transform null object into an object + if (is_null()) + { + m_data.m_type = value_t::object; + m_data.m_value = value_t::object; + assert_invariant(); + } + + // add element to array (perfect forwarding) + auto res = m_data.m_value.object->emplace(std::forward<Args>(args)...); + set_parent(res.first->second); + + // create result iterator and set iterator to the result of emplace + auto it = begin(); + it.m_it.object_iterator = res.first; + + // return pair of iterator and boolean + return {it, res.second}; + } + + /// Helper for insertion of an iterator + /// @note: This uses std::distance to support GCC 4.8, + /// see https://github.com/nlohmann/json/pull/1257 + template<typename... Args> + iterator insert_iterator(const_iterator pos, Args&& ... args) + { + iterator result(this); + JSON_ASSERT(m_data.m_value.array != nullptr); + + auto insert_pos = std::distance(m_data.m_value.array->begin(), pos.m_it.array_iterator); + m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...); + result.m_it.array_iterator = m_data.m_value.array->begin() + insert_pos; + + // This could have been written as: + // result.m_it.array_iterator = m_data.m_value.array->insert(pos.m_it.array_iterator, cnt, val); + // but the return value of insert is missing in GCC 4.8, so it is written this way instead. + + set_parents(); + return result; + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this)); + } + + // insert to array and return iterator + return insert_iterator(pos, val); + } + + JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this)); + } + + /// @brief inserts element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, basic_json&& val) + { + return insert(pos, val); + } + + /// @brief inserts copies of element into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, size_type cnt, const basic_json& val) + { + // insert only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this)); + } + + // insert to array and return iterator + return insert_iterator(pos, cnt, val); + } + + JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this)); + } + + /// @brief inserts range of elements into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, const_iterator first, const_iterator last) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this)); + } + + if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) + { + JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", this)); + } + + // insert to array and return iterator + return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); + } + + /// @brief inserts elements from initializer list into array + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + iterator insert(const_iterator pos, initializer_list_t ilist) + { + // insert only works for arrays + if (JSON_HEDLEY_UNLIKELY(!is_array())) + { + JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this)); + } + + // check if iterator pos fits to this JSON value + if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) + { + JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this)); + } + + // insert to array and return iterator + return insert_iterator(pos, ilist.begin(), ilist.end()); + } + + /// @brief inserts range of elements into object + /// @sa https://json.nlohmann.me/api/basic_json/insert/ + void insert(const_iterator first, const_iterator last) + { + // insert only works for objects + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", this)); + } + + m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_reference j, bool merge_objects = false) + { + update(j.begin(), j.end(), merge_objects); + } + + /// @brief updates a JSON object from another object, overwriting existing keys + /// @sa https://json.nlohmann.me/api/basic_json/update/ + void update(const_iterator first, const_iterator last, bool merge_objects = false) + { + // implicitly convert null value to an empty object + if (is_null()) + { + m_data.m_type = value_t::object; + m_data.m_value.object = create<object_t>(); + assert_invariant(); + } + + if (JSON_HEDLEY_UNLIKELY(!is_object())) + { + JSON_THROW(type_error::create(312, detail::concat("cannot use update() with ", type_name()), this)); + } + + // check if range iterators belong to the same JSON object + if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) + { + JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this)); + } + + // passed iterators must belong to objects + if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) + { + JSON_THROW(type_error::create(312, detail::concat("cannot use update() with ", first.m_object->type_name()), first.m_object)); + } + + for (auto it = first; it != last; ++it) + { + if (merge_objects && it.value().is_object()) + { + auto it2 = m_data.m_value.object->find(it.key()); + if (it2 != m_data.m_value.object->end()) + { + it2->second.update(it.value(), true); + continue; + } + } + m_data.m_value.object->operator[](it.key()) = it.value(); +#if JSON_DIAGNOSTICS + m_data.m_value.object->operator[](it.key()).m_parent = this; +#endif + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(reference other) noexcept ( + std::is_nothrow_move_constructible<value_t>::value&& + std::is_nothrow_move_assignable<value_t>::value&& + std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + std::is_nothrow_move_assignable<json_value>::value + ) + { + std::swap(m_data.m_type, other.m_data.m_type); + std::swap(m_data.m_value, other.m_data.m_value); + + set_parents(); + other.set_parents(); + assert_invariant(); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + friend void swap(reference left, reference right) noexcept ( + std::is_nothrow_move_constructible<value_t>::value&& + std::is_nothrow_move_assignable<value_t>::value&& + std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + std::is_nothrow_move_assignable<json_value>::value + ) + { + left.swap(right); + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + { + // swap only works for arrays + if (JSON_HEDLEY_LIKELY(is_array())) + { + using std::swap; + swap(*(m_data.m_value.array), other); + } + else + { + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(array_t&) with ", type_name()), this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + { + // swap only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + using std::swap; + swap(*(m_data.m_value.object), other); + } + else + { + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(object_t&) with ", type_name()), this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_string())) + { + using std::swap; + swap(*(m_data.m_value.string), other); + } + else + { + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(string_t&) with ", type_name()), this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + using std::swap; + swap(*(m_data.m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t&) with ", type_name()), this)); + } + } + + /// @brief exchanges the values + /// @sa https://json.nlohmann.me/api/basic_json/swap/ + void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape) + { + // swap only works for strings + if (JSON_HEDLEY_LIKELY(is_binary())) + { + using std::swap; + swap(*(m_data.m_value.binary), other); + } + else + { + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t::container_type&) with ", type_name()), this)); + } + } + + /// @} + + ////////////////////////////////////////// + // lexicographical comparison operators // + ////////////////////////////////////////// + + /// @name lexicographical comparison operators + /// @{ + + // note parentheses around operands are necessary; see + // https://github.com/nlohmann/json/issues/1530 +#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result) \ + const auto lhs_type = lhs.type(); \ + const auto rhs_type = rhs.type(); \ + \ + if (lhs_type == rhs_type) /* NOLINT(readability/braces) */ \ + { \ + switch (lhs_type) \ + { \ + case value_t::array: \ + return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array); \ + \ + case value_t::object: \ + return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \ + \ + case value_t::null: \ + return (null_result); \ + \ + case value_t::string: \ + return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \ + \ + case value_t::boolean: \ + return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean); \ + \ + case value_t::number_integer: \ + return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer); \ + \ + case value_t::number_unsigned: \ + return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned); \ + \ + case value_t::number_float: \ + return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float); \ + \ + case value_t::binary: \ + return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary); \ + \ + case value_t::discarded: \ + default: \ + return (unordered_result); \ + } \ + } \ + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) \ + { \ + return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float; \ + } \ + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) \ + { \ + return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer); \ + } \ + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) \ + { \ + return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float; \ + } \ + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) \ + { \ + return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned); \ + } \ + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) \ + { \ + return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \ + } \ + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) \ + { \ + return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \ + } \ + else if(compares_unordered(lhs, rhs))\ + {\ + return (unordered_result);\ + }\ + \ + return (default_result); + + JSON_PRIVATE_UNLESS_TESTED: + // returns true if: + // - any operand is NaN and the other operand is of number type + // - any operand is discarded + // in legacy mode, discarded values are considered ordered if + // an operation is computed as an odd number of inverses of others + static bool compares_unordered(const_reference lhs, const_reference rhs, bool inverse = false) noexcept + { + if ((lhs.is_number_float() && std::isnan(lhs.m_data.m_value.number_float) && rhs.is_number()) + || (rhs.is_number_float() && std::isnan(rhs.m_data.m_value.number_float) && lhs.is_number())) + { + return true; + } +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + return (lhs.is_discarded() || rhs.is_discarded()) && !inverse; +#else + static_cast<void>(inverse); + return lhs.is_discarded() || rhs.is_discarded(); +#endif + } + + private: + bool compares_unordered(const_reference rhs, bool inverse = false) const noexcept + { + return compares_unordered(*this, rhs, inverse); + } + + public: +#if JSON_HAS_THREE_WAY_COMPARISON + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + bool operator==(const_reference rhs) const noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const_reference lhs = *this; + JSON_IMPLEMENT_OPERATOR( ==, true, false, false) +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template<typename ScalarType> + requires std::is_scalar_v<ScalarType> + bool operator==(ScalarType rhs) const noexcept + { + return *this == basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + bool operator!=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !operator==(rhs); + } + + /// @brief comparison: 3-way + /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/ + std::partial_ordering operator<=>(const_reference rhs) const noexcept // *NOPAD* + { + const_reference lhs = *this; + // default_result is used if we cannot compare values. In that case, + // we compare types. + JSON_IMPLEMENT_OPERATOR(<=>, // *NOPAD* + std::partial_ordering::equivalent, + std::partial_ordering::unordered, + lhs_type <=> rhs_type) // *NOPAD* + } + + /// @brief comparison: 3-way + /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/ + template<typename ScalarType> + requires std::is_scalar_v<ScalarType> + std::partial_ordering operator<=>(ScalarType rhs) const noexcept // *NOPAD* + { + return *this <=> basic_json(rhs); // *NOPAD* + } + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + // all operators that are computed as an odd number of inverses of others + // need to be overloaded to emulate the legacy comparison behavior + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON) + bool operator<=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !(rhs < *this); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template<typename ScalarType> + requires std::is_scalar_v<ScalarType> + bool operator<=(ScalarType rhs) const noexcept + { + return *this <= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON) + bool operator>=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !(*this < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template<typename ScalarType> + requires std::is_scalar_v<ScalarType> + bool operator>=(ScalarType rhs) const noexcept + { + return *this >= basic_json(rhs); + } +#endif +#else + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + friend bool operator==(const_reference lhs, const_reference rhs) noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + JSON_IMPLEMENT_OPERATOR( ==, true, false, false) +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator==(const_reference lhs, ScalarType rhs) noexcept + { + return lhs == basic_json(rhs); + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator==(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) == rhs; + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + friend bool operator!=(const_reference lhs, const_reference rhs) noexcept + { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } + return !(lhs == rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs != basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) != rhs; + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + friend bool operator<(const_reference lhs, const_reference rhs) noexcept + { + // default_result is used if we cannot compare values. In that case, + // we compare types. Note we have to call the operator explicitly, + // because MSVC has problems otherwise. + JSON_IMPLEMENT_OPERATOR( <, false, false, operator<(lhs_type, rhs_type)) + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator<(const_reference lhs, ScalarType rhs) noexcept + { + return lhs < basic_json(rhs); + } + + /// @brief comparison: less than + /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator<(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) < rhs; + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + friend bool operator<=(const_reference lhs, const_reference rhs) noexcept + { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } + return !(rhs < lhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs <= basic_json(rhs); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) <= rhs; + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + friend bool operator>(const_reference lhs, const_reference rhs) noexcept + { + // double inverse + if (compares_unordered(lhs, rhs)) + { + return false; + } + return !(lhs <= rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator>(const_reference lhs, ScalarType rhs) noexcept + { + return lhs > basic_json(rhs); + } + + /// @brief comparison: greater than + /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator>(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) > rhs; + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + friend bool operator>=(const_reference lhs, const_reference rhs) noexcept + { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } + return !(lhs < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept + { + return lhs >= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template<typename ScalarType, typename std::enable_if< + std::is_scalar<ScalarType>::value, int>::type = 0> + friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept + { + return basic_json(lhs) >= rhs; + } +#endif + +#undef JSON_IMPLEMENT_OPERATOR + + /// @} + + /////////////////// + // serialization // + /////////////////// + + /// @name serialization + /// @{ +#ifndef JSON_NO_IO + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const basic_json& j) + { + // read width member and use it as indentation parameter if nonzero + const bool pretty_print = o.width() > 0; + const auto indentation = pretty_print ? o.width() : 0; + + // reset width to 0 for subsequent calls to this stream + o.width(0); + + // do the actual serialization + serializer s(detail::output_adapter<char>(o), o.fill()); + s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation)); + return o; + } + + /// @brief serialize to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + /// @deprecated This function is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator<<(std::ostream&, const basic_json&) instead; that is, + /// replace calls like `j >> o;` with `o << j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) + friend std::ostream& operator>>(const basic_json& j, std::ostream& o) + { + return o << j; + } +#endif // JSON_NO_IO + /// @} + + ///////////////////// + // deserialization // + ///////////////////// + + /// @name deserialization + /// @{ + + /// @brief deserialize from a compatible input + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(InputType&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief deserialize from a pair of character iterators + /// @sa https://json.nlohmann.me/api/basic_json/parse/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json parse(IteratorType first, + IteratorType last, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) + static basic_json parse(detail::span_input_adapter&& i, + const parser_callback_t cb = nullptr, + const bool allow_exceptions = true, + const bool ignore_comments = false) + { + basic_json result; + parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); + return result; + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template<typename InputType> + static bool accept(InputType&& i, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments).accept(true); + } + + /// @brief check if the input is valid JSON + /// @sa https://json.nlohmann.me/api/basic_json/accept/ + template<typename IteratorType> + static bool accept(IteratorType first, IteratorType last, + const bool ignore_comments = false) + { + return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) + static bool accept(detail::span_input_adapter&& i, + const bool ignore_comments = false) + { + return parser(i.get(), nullptr, false, ignore_comments).accept(true); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template <typename InputType, typename SAX> + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(InputType&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::forward<InputType>(i)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + template<class IteratorType, class SAX> + JSON_HEDLEY_NON_NULL(3) + static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = detail::input_adapter(std::move(first), std::move(last)); + return format == input_format_t::json + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict); + } + + /// @brief generate SAX events + /// @sa https://json.nlohmann.me/api/basic_json/sax_parse/ + /// @deprecated This function is deprecated since 3.8.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// sax_parse(ptr, ptr + len) instead. + template <typename SAX> + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) + JSON_HEDLEY_NON_NULL(2) + static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, + input_format_t format = input_format_t::json, + const bool strict = true, + const bool ignore_comments = false) + { + auto ia = i.get(); + return format == input_format_t::json + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict); + } +#ifndef JSON_NO_IO + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + /// @deprecated This stream operator is deprecated since 3.0.0 and will be removed in + /// version 4.0.0 of the library. Please use + /// operator>>(std::istream&, basic_json&) instead; that is, + /// replace calls like `j << i;` with `i >> j;`. + JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) + friend std::istream& operator<<(basic_json& j, std::istream& i) + { + return operator>>(i, j); + } + + /// @brief deserialize from stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_gtgt/ + friend std::istream& operator>>(std::istream& i, basic_json& j) + { + parser(detail::input_adapter(i)).parse(false, j); + return i; + } +#endif // JSON_NO_IO + /// @} + + /////////////////////////// + // convenience functions // + /////////////////////////// + + /// @brief return the type as string + /// @sa https://json.nlohmann.me/api/basic_json/type_name/ + JSON_HEDLEY_RETURNS_NON_NULL + const char* type_name() const noexcept + { + switch (m_data.m_type) + { + case value_t::null: + return "null"; + case value_t::object: + return "object"; + case value_t::array: + return "array"; + case value_t::string: + return "string"; + case value_t::boolean: + return "boolean"; + case value_t::binary: + return "binary"; + case value_t::discarded: + return "discarded"; + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + default: + return "number"; + } + } + + JSON_PRIVATE_UNLESS_TESTED: + ////////////////////// + // member variables // + ////////////////////// + + struct data + { + /// the type of the current element + value_t m_type = value_t::null; + + /// the value of the current element + json_value m_value = {}; + + data(const value_t v) + : m_type(v), m_value(v) + { + } + + data(size_type cnt, const basic_json& val) + : m_type(value_t::array) + { + m_value.array = create<array_t>(cnt, val); + } + + data() noexcept = default; + data(data&&) noexcept = default; + data(const data&) noexcept = delete; + data& operator=(data&&) noexcept = delete; + data& operator=(const data&) noexcept = delete; + + ~data() noexcept + { + m_value.destroy(m_type); + } + }; + + data m_data = {}; + +#if JSON_DIAGNOSTICS + /// a pointer to a parent value (for debugging purposes) + basic_json* m_parent = nullptr; +#endif + + ////////////////////////////////////////// + // binary serialization/deserialization // + ////////////////////////////////////////// + + /// @name binary serialization/deserialization support + /// @{ + + public: + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static std::vector<std::uint8_t> to_cbor(const basic_json& j) + { + std::vector<std::uint8_t> result; + to_cbor(j, result); + return result; + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter<std::uint8_t> o) + { + binary_writer<std::uint8_t>(o).write_cbor(j); + } + + /// @brief create a CBOR serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_cbor/ + static void to_cbor(const basic_json& j, detail::output_adapter<char> o) + { + binary_writer<char>(o).write_cbor(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static std::vector<std::uint8_t> to_msgpack(const basic_json& j) + { + std::vector<std::uint8_t> result; + to_msgpack(j, result); + return result; + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter<std::uint8_t> o) + { + binary_writer<std::uint8_t>(o).write_msgpack(j); + } + + /// @brief create a MessagePack serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_msgpack/ + static void to_msgpack(const basic_json& j, detail::output_adapter<char> o) + { + binary_writer<char>(o).write_msgpack(j); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static std::vector<std::uint8_t> to_ubjson(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector<std::uint8_t> result; + to_ubjson(j, result, use_size, use_type); + return result; + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter<std::uint8_t> o, + const bool use_size = false, const bool use_type = false) + { + binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a UBJSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_ubjson/ + static void to_ubjson(const basic_json& j, detail::output_adapter<char> o, + const bool use_size = false, const bool use_type = false) + { + binary_writer<char>(o).write_ubjson(j, use_size, use_type); + } + + /// @brief create a BJData serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/ + static std::vector<std::uint8_t> to_bjdata(const basic_json& j, + const bool use_size = false, + const bool use_type = false) + { + std::vector<std::uint8_t> result; + to_bjdata(j, result, use_size, use_type); + return result; + } + + /// @brief create a BJData serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/ + static void to_bjdata(const basic_json& j, detail::output_adapter<std::uint8_t> o, + const bool use_size = false, const bool use_type = false) + { + binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type, true, true); + } + + /// @brief create a BJData serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bjdata/ + static void to_bjdata(const basic_json& j, detail::output_adapter<char> o, + const bool use_size = false, const bool use_type = false) + { + binary_writer<char>(o).write_ubjson(j, use_size, use_type, true, true); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static std::vector<std::uint8_t> to_bson(const basic_json& j) + { + std::vector<std::uint8_t> result; + to_bson(j, result); + return result; + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter<std::uint8_t> o) + { + binary_writer<std::uint8_t>(o).write_bson(j); + } + + /// @brief create a BSON serialization of a given JSON value + /// @sa https://json.nlohmann.me/api/basic_json/to_bson/ + static void to_bson(const basic_json& j, detail::output_adapter<char> o) + { + binary_writer<char>(o).write_bson(j); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward<InputType>(i)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in CBOR format + /// @sa https://json.nlohmann.me/api/basic_json/from_cbor/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_cbor(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + template<typename T> + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) + static basic_json from_cbor(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true, + const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward<InputType>(i)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in MessagePack format + /// @sa https://json.nlohmann.me/api/basic_json/from_msgpack/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_msgpack(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template<typename T> + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_msgpack(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) + static basic_json from_msgpack(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward<InputType>(i)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in UBJSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_ubjson/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_ubjson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template<typename T> + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_ubjson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) + static basic_json from_ubjson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BJData format + /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bjdata(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward<InputType>(i)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BJData format + /// @sa https://json.nlohmann.me/api/basic_json/from_bjdata/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bjdata(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template<typename InputType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(InputType&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::forward<InputType>(i)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + /// @brief create a JSON value from an input in BSON format + /// @sa https://json.nlohmann.me/api/basic_json/from_bson/ + template<typename IteratorType> + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json from_bson(IteratorType first, IteratorType last, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = detail::input_adapter(std::move(first), std::move(last)); + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + + template<typename T> + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(const T* ptr, std::size_t len, + const bool strict = true, + const bool allow_exceptions = true) + { + return from_bson(ptr, ptr + len, strict, allow_exceptions); + } + + JSON_HEDLEY_WARN_UNUSED_RESULT + JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) + static basic_json from_bson(detail::span_input_adapter&& i, + const bool strict = true, + const bool allow_exceptions = true) + { + basic_json result; + detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions); + auto ia = i.get(); + // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg) + const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); + return res ? result : basic_json(value_t::discarded); + } + /// @} + + ////////////////////////// + // JSON Pointer support // + ////////////////////////// + + /// @name JSON Pointer functions + /// @{ + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + reference operator[](const json_pointer& ptr) + { + return ptr.get_unchecked(this); + } + + template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0> + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr) + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ + const_reference operator[](const json_pointer& ptr) const + { + return ptr.get_unchecked(this); + } + + template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0> + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + const_reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr) const + { + return ptr.get_unchecked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + reference at(const json_pointer& ptr) + { + return ptr.get_checked(this); + } + + template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0> + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr) + { + return ptr.get_checked(this); + } + + /// @brief access specified element via JSON Pointer + /// @sa https://json.nlohmann.me/api/basic_json/at/ + const_reference at(const json_pointer& ptr) const + { + return ptr.get_checked(this); + } + + template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0> + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens) + const_reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr) const + { + return ptr.get_checked(this); + } + + /// @brief return flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/flatten/ + basic_json flatten() const + { + basic_json result(value_t::object); + json_pointer::flatten("", *this, result); + return result; + } + + /// @brief unflatten a previously flattened JSON value + /// @sa https://json.nlohmann.me/api/basic_json/unflatten/ + basic_json unflatten() const + { + return json_pointer::unflatten(*this); + } + + /// @} + + ////////////////////////// + // JSON Patch functions // + ////////////////////////// + + /// @name JSON Patch functions + /// @{ + + /// @brief applies a JSON patch in-place without copying the object + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + void patch_inplace(const basic_json& json_patch) + { + basic_json& result = *this; + // the valid JSON Patch operations + enum class patch_operations {add, remove, replace, move, copy, test, invalid}; + + const auto get_op = [](const std::string & op) + { + if (op == "add") + { + return patch_operations::add; + } + if (op == "remove") + { + return patch_operations::remove; + } + if (op == "replace") + { + return patch_operations::replace; + } + if (op == "move") + { + return patch_operations::move; + } + if (op == "copy") + { + return patch_operations::copy; + } + if (op == "test") + { + return patch_operations::test; + } + + return patch_operations::invalid; + }; + + // wrapper for "add" operation; add value at ptr + const auto operation_add = [&result](json_pointer & ptr, basic_json val) + { + // adding to the root of the target document means replacing it + if (ptr.empty()) + { + result = val; + return; + } + + // make sure the top element of the pointer exists + json_pointer const top_pointer = ptr.top(); + if (top_pointer != ptr) + { + result.at(top_pointer); + } + + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + // parent must exist when performing patch add per RFC6902 specs + basic_json& parent = result.at(ptr); + + switch (parent.m_data.m_type) + { + case value_t::null: + case value_t::object: + { + // use operator[] to add value + parent[last_path] = val; + break; + } + + case value_t::array: + { + if (last_path == "-") + { + // special case: append to back + parent.push_back(val); + } + else + { + const auto idx = json_pointer::template array_index<basic_json_t>(last_path); + if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) + { + // avoid undefined behavior + JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), &parent)); + } + + // default case: insert add offset + parent.insert(parent.begin() + static_cast<difference_type>(idx), val); + } + break; + } + + // if there exists a parent it cannot be primitive + case value_t::string: // LCOV_EXCL_LINE + case value_t::boolean: // LCOV_EXCL_LINE + case value_t::number_integer: // LCOV_EXCL_LINE + case value_t::number_unsigned: // LCOV_EXCL_LINE + case value_t::number_float: // LCOV_EXCL_LINE + case value_t::binary: // LCOV_EXCL_LINE + case value_t::discarded: // LCOV_EXCL_LINE + default: // LCOV_EXCL_LINE + JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE + } + }; + + // wrapper for "remove" operation; remove value at ptr + const auto operation_remove = [this, & result](json_pointer & ptr) + { + // get reference to parent of JSON pointer ptr + const auto last_path = ptr.back(); + ptr.pop_back(); + basic_json& parent = result.at(ptr); + + // remove child + if (parent.is_object()) + { + // perform range check + auto it = parent.find(last_path); + if (JSON_HEDLEY_LIKELY(it != parent.end())) + { + parent.erase(it); + } + else + { + JSON_THROW(out_of_range::create(403, detail::concat("key '", last_path, "' not found"), this)); + } + } + else if (parent.is_array()) + { + // note erase performs range check + parent.erase(json_pointer::template array_index<basic_json_t>(last_path)); + } + }; + + // type check: top level value must be an array + if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", &json_patch)); + } + + // iterate and apply the operations + for (const auto& val : json_patch) + { + // wrapper to get a value for an operation + const auto get_value = [&val](const std::string & op, + const std::string & member, + bool string_type) -> basic_json & + { + // find value + auto it = val.m_data.m_value.object->find(member); + + // context-sensitive error message + const auto error_msg = (op == "op") ? "operation" : detail::concat("operation '", op, '\''); + + // check if desired value is present + if (JSON_HEDLEY_UNLIKELY(it == val.m_data.m_value.object->end())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, " must have member '", member, "'"), &val)); + } + + // check if result is of type string + if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) + { + // NOLINTNEXTLINE(performance-inefficient-string-concatenation) + JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, " must have string member '", member, "'"), &val)); + } + + // no error: return value + return it->second; + }; + + // type check: every element of the array must be an object + if (JSON_HEDLEY_UNLIKELY(!val.is_object())) + { + JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", &val)); + } + + // collect mandatory members + const auto op = get_value("op", "op", true).template get<std::string>(); + const auto path = get_value(op, "path", true).template get<std::string>(); + json_pointer ptr(path); + + switch (get_op(op)) + { + case patch_operations::add: + { + operation_add(ptr, get_value("add", "value", false)); + break; + } + + case patch_operations::remove: + { + operation_remove(ptr); + break; + } + + case patch_operations::replace: + { + // the "path" location must exist - use at() + result.at(ptr) = get_value("replace", "value", false); + break; + } + + case patch_operations::move: + { + const auto from_path = get_value("move", "from", true).template get<std::string>(); + json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json const v = result.at(from_ptr); + + // The move operation is functionally identical to a + // "remove" operation on the "from" location, followed + // immediately by an "add" operation at the target + // location with the value that was just removed. + operation_remove(from_ptr); + operation_add(ptr, v); + break; + } + + case patch_operations::copy: + { + const auto from_path = get_value("copy", "from", true).template get<std::string>(); + const json_pointer from_ptr(from_path); + + // the "from" location must exist - use at() + basic_json const v = result.at(from_ptr); + + // The copy is functionally identical to an "add" + // operation at the target location using the value + // specified in the "from" member. + operation_add(ptr, v); + break; + } + + case patch_operations::test: + { + bool success = false; + JSON_TRY + { + // check if "value" matches the one at "path" + // the "path" location must exist - use at() + success = (result.at(ptr) == get_value("test", "value", false)); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + // ignore out of range errors: success remains false + } + + // throw an exception if test fails + if (JSON_HEDLEY_UNLIKELY(!success)) + { + JSON_THROW(other_error::create(501, detail::concat("unsuccessful: ", val.dump()), &val)); + } + + break; + } + + case patch_operations::invalid: + default: + { + // op must be "add", "remove", "replace", "move", "copy", or + // "test" + JSON_THROW(parse_error::create(105, 0, detail::concat("operation value '", op, "' is invalid"), &val)); + } + } + } + } + + /// @brief applies a JSON patch to a copy of the current object + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + basic_json result = *this; + result.patch_inplace(json_patch); + return result; + } + + /// @brief creates a diff as a JSON patch + /// @sa https://json.nlohmann.me/api/basic_json/diff/ + JSON_HEDLEY_WARN_UNUSED_RESULT + static basic_json diff(const basic_json& source, const basic_json& target, + const std::string& path = "") + { + // the patch + basic_json result(value_t::array); + + // if the values are the same, return empty patch + if (source == target) + { + return result; + } + + if (source.type() != target.type()) + { + // different types: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + return result; + } + + switch (source.type()) + { + case value_t::array: + { + // first pass: traverse common elements + std::size_t i = 0; + while (i < source.size() && i < target.size()) + { + // recursive call to compare array values at index i + auto temp_diff = diff(source[i], target[i], detail::concat(path, '/', std::to_string(i))); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + ++i; + } + + // We now reached the end of at least one array + // in a second pass, traverse the remaining elements + + // remove my remaining elements + const auto end_index = static_cast<difference_type>(result.size()); + while (i < source.size()) + { + // add operations in reverse order to avoid invalid + // indices + result.insert(result.begin() + end_index, object( + { + {"op", "remove"}, + {"path", detail::concat(path, '/', std::to_string(i))} + })); + ++i; + } + + // add other remaining elements + while (i < target.size()) + { + result.push_back( + { + {"op", "add"}, + {"path", detail::concat(path, "/-")}, + {"value", target[i]} + }); + ++i; + } + + break; + } + + case value_t::object: + { + // first pass: traverse this object's elements + for (auto it = source.cbegin(); it != source.cend(); ++it) + { + // escape the key name to be used in a JSON patch + const auto path_key = detail::concat(path, '/', detail::escape(it.key())); + + if (target.find(it.key()) != target.end()) + { + // recursive call to compare object values at key it + auto temp_diff = diff(it.value(), target[it.key()], path_key); + result.insert(result.end(), temp_diff.begin(), temp_diff.end()); + } + else + { + // found a key that is not in o -> remove it + result.push_back(object( + { + {"op", "remove"}, {"path", path_key} + })); + } + } + + // second pass: traverse other object's elements + for (auto it = target.cbegin(); it != target.cend(); ++it) + { + if (source.find(it.key()) == source.end()) + { + // found a key that is not in this -> add it + const auto path_key = detail::concat(path, '/', detail::escape(it.key())); + result.push_back( + { + {"op", "add"}, {"path", path_key}, + {"value", it.value()} + }); + } + } + + break; + } + + case value_t::null: + case value_t::string: + case value_t::boolean: + case value_t::number_integer: + case value_t::number_unsigned: + case value_t::number_float: + case value_t::binary: + case value_t::discarded: + default: + { + // both primitive type: replace value + result.push_back( + { + {"op", "replace"}, {"path", path}, {"value", target} + }); + break; + } + } + + return result; + } + /// @} + + //////////////////////////////// + // JSON Merge Patch functions // + //////////////////////////////// + + /// @name JSON Merge Patch functions + /// @{ + + /// @brief applies a JSON Merge Patch + /// @sa https://json.nlohmann.me/api/basic_json/merge_patch/ + void merge_patch(const basic_json& apply_patch) + { + if (apply_patch.is_object()) + { + if (!is_object()) + { + *this = object(); + } + for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) + { + if (it.value().is_null()) + { + erase(it.key()); + } + else + { + operator[](it.key()).merge_patch(it.value()); + } + } + } + else + { + *this = apply_patch; + } + } + + /// @} +}; + +/// @brief user-defined to_string function for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/to_string/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) +{ + return j.dump(); +} + +inline namespace literals +{ +inline namespace json_literals +{ + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) + inline nlohmann::json operator ""_json(const char* s, std::size_t n) +#else + inline nlohmann::json operator "" _json(const char* s, std::size_t n) +#endif +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) + inline nlohmann::json::json_pointer operator ""_json_pointer(const char* s, std::size_t n) +#else + inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +#endif +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +} // namespace json_literals +} // namespace literals +NLOHMANN_JSON_NAMESPACE_END + +/////////////////////// +// nonmember support // +/////////////////////// + +namespace std // NOLINT(cert-dcl58-cpp) +{ + +/// @brief hash value for JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_hash/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct hash<nlohmann::NLOHMANN_BASIC_JSON_TPL> // NOLINT(cert-dcl58-cpp) +{ + std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const + { + return nlohmann::detail::hash(j); + } +}; + +// specialization for std::less<value_t> +template<> +struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679 +{ + /*! + @brief compare two value_t enum values + @since version 3.0.0 + */ + bool operator()(::nlohmann::detail::value_t lhs, + ::nlohmann::detail::value_t rhs) const noexcept + { +#if JSON_HAS_THREE_WAY_COMPARISON + return std::is_lt(lhs <=> rhs); // *NOPAD* +#else + return ::nlohmann::detail::operator<(lhs, rhs); +#endif + } +}; + +// C++20 prohibit function specialization in the std namespace. +#ifndef JSON_HAS_CPP_20 + +/// @brief exchanges the values of two JSON objects +/// @sa https://json.nlohmann.me/api/basic_json/std_swap/ +NLOHMANN_BASIC_JSON_TPL_DECLARATION +inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) + is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap) + is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value) +{ + j1.swap(j2); +} + +#endif + +} // namespace std + +#if JSON_USE_GLOBAL_UDLS + #if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) + using nlohmann::literals::json_literals::operator ""_json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers) + using nlohmann::literals::json_literals::operator ""_json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers) + #else + using nlohmann::literals::json_literals::operator "" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers) + using nlohmann::literals::json_literals::operator "" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers) + #endif +#endif + +// #include <nlohmann/detail/macro_unscope.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +// restore clang diagnostic settings +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +// clean up +#undef JSON_ASSERT +#undef JSON_INTERNAL_CATCH +#undef JSON_THROW +#undef JSON_PRIVATE_UNLESS_TESTED +#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION +#undef NLOHMANN_BASIC_JSON_TPL +#undef JSON_EXPLICIT +#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL +#undef JSON_INLINE_VARIABLE +#undef JSON_NO_UNIQUE_ADDRESS +#undef JSON_DISABLE_ENUM_SERIALIZATION +#undef JSON_USE_GLOBAL_UDLS + +#ifndef JSON_TEST_KEEP_MACROS + #undef JSON_CATCH + #undef JSON_TRY + #undef JSON_HAS_CPP_11 + #undef JSON_HAS_CPP_14 + #undef JSON_HAS_CPP_17 + #undef JSON_HAS_CPP_20 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #undef JSON_HAS_THREE_WAY_COMPARISON + #undef JSON_HAS_RANGES + #undef JSON_HAS_STATIC_RTTI + #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp> +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.3 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me> +// SPDX-License-Identifier: MIT + + + +#undef JSON_HEDLEY_ALWAYS_INLINE +#undef JSON_HEDLEY_ARM_VERSION +#undef JSON_HEDLEY_ARM_VERSION_CHECK +#undef JSON_HEDLEY_ARRAY_PARAM +#undef JSON_HEDLEY_ASSUME +#undef JSON_HEDLEY_BEGIN_C_DECLS +#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#undef JSON_HEDLEY_CLANG_HAS_FEATURE +#undef JSON_HEDLEY_CLANG_HAS_WARNING +#undef JSON_HEDLEY_COMPCERT_VERSION +#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#undef JSON_HEDLEY_CONCAT +#undef JSON_HEDLEY_CONCAT3 +#undef JSON_HEDLEY_CONCAT3_EX +#undef JSON_HEDLEY_CONCAT_EX +#undef JSON_HEDLEY_CONST +#undef JSON_HEDLEY_CONSTEXPR +#undef JSON_HEDLEY_CONST_CAST +#undef JSON_HEDLEY_CPP_CAST +#undef JSON_HEDLEY_CRAY_VERSION +#undef JSON_HEDLEY_CRAY_VERSION_CHECK +#undef JSON_HEDLEY_C_DECL +#undef JSON_HEDLEY_DEPRECATED +#undef JSON_HEDLEY_DEPRECATED_FOR +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#undef JSON_HEDLEY_DIAGNOSTIC_POP +#undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#undef JSON_HEDLEY_DMC_VERSION +#undef JSON_HEDLEY_DMC_VERSION_CHECK +#undef JSON_HEDLEY_EMPTY_BASES +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#undef JSON_HEDLEY_END_C_DECLS +#undef JSON_HEDLEY_FLAGS +#undef JSON_HEDLEY_FLAGS_CAST +#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_BUILTIN +#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GCC_HAS_EXTENSION +#undef JSON_HEDLEY_GCC_HAS_FEATURE +#undef JSON_HEDLEY_GCC_HAS_WARNING +#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#undef JSON_HEDLEY_GCC_VERSION +#undef JSON_HEDLEY_GCC_VERSION_CHECK +#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#undef JSON_HEDLEY_GNUC_HAS_FEATURE +#undef JSON_HEDLEY_GNUC_HAS_WARNING +#undef JSON_HEDLEY_GNUC_VERSION +#undef JSON_HEDLEY_GNUC_VERSION_CHECK +#undef JSON_HEDLEY_HAS_ATTRIBUTE +#undef JSON_HEDLEY_HAS_BUILTIN +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#undef JSON_HEDLEY_HAS_EXTENSION +#undef JSON_HEDLEY_HAS_FEATURE +#undef JSON_HEDLEY_HAS_WARNING +#undef JSON_HEDLEY_IAR_VERSION +#undef JSON_HEDLEY_IAR_VERSION_CHECK +#undef JSON_HEDLEY_IBM_VERSION +#undef JSON_HEDLEY_IBM_VERSION_CHECK +#undef JSON_HEDLEY_IMPORT +#undef JSON_HEDLEY_INLINE +#undef JSON_HEDLEY_INTEL_CL_VERSION +#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#undef JSON_HEDLEY_INTEL_VERSION +#undef JSON_HEDLEY_INTEL_VERSION_CHECK +#undef JSON_HEDLEY_IS_CONSTANT +#undef JSON_HEDLEY_IS_CONSTEXPR_ +#undef JSON_HEDLEY_LIKELY +#undef JSON_HEDLEY_MALLOC +#undef JSON_HEDLEY_MCST_LCC_VERSION +#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#undef JSON_HEDLEY_MESSAGE +#undef JSON_HEDLEY_MSVC_VERSION +#undef JSON_HEDLEY_MSVC_VERSION_CHECK +#undef JSON_HEDLEY_NEVER_INLINE +#undef JSON_HEDLEY_NON_NULL +#undef JSON_HEDLEY_NO_ESCAPE +#undef JSON_HEDLEY_NO_RETURN +#undef JSON_HEDLEY_NO_THROW +#undef JSON_HEDLEY_NULL +#undef JSON_HEDLEY_PELLES_VERSION +#undef JSON_HEDLEY_PELLES_VERSION_CHECK +#undef JSON_HEDLEY_PGI_VERSION +#undef JSON_HEDLEY_PGI_VERSION_CHECK +#undef JSON_HEDLEY_PREDICT +#undef JSON_HEDLEY_PRINTF_FORMAT +#undef JSON_HEDLEY_PRIVATE +#undef JSON_HEDLEY_PUBLIC +#undef JSON_HEDLEY_PURE +#undef JSON_HEDLEY_REINTERPRET_CAST +#undef JSON_HEDLEY_REQUIRE +#undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#undef JSON_HEDLEY_REQUIRE_MSG +#undef JSON_HEDLEY_RESTRICT +#undef JSON_HEDLEY_RETURNS_NON_NULL +#undef JSON_HEDLEY_SENTINEL +#undef JSON_HEDLEY_STATIC_ASSERT +#undef JSON_HEDLEY_STATIC_CAST +#undef JSON_HEDLEY_STRINGIFY +#undef JSON_HEDLEY_STRINGIFY_EX +#undef JSON_HEDLEY_SUNPRO_VERSION +#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#undef JSON_HEDLEY_TINYC_VERSION +#undef JSON_HEDLEY_TINYC_VERSION_CHECK +#undef JSON_HEDLEY_TI_ARMCL_VERSION +#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL2000_VERSION +#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL430_VERSION +#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL6X_VERSION +#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CL7X_VERSION +#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#undef JSON_HEDLEY_TI_CLPRU_VERSION +#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#undef JSON_HEDLEY_TI_VERSION +#undef JSON_HEDLEY_TI_VERSION_CHECK +#undef JSON_HEDLEY_UNAVAILABLE +#undef JSON_HEDLEY_UNLIKELY +#undef JSON_HEDLEY_UNPREDICTABLE +#undef JSON_HEDLEY_UNREACHABLE +#undef JSON_HEDLEY_UNREACHABLE_RETURN +#undef JSON_HEDLEY_VERSION +#undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#undef JSON_HEDLEY_VERSION_DECODE_MINOR +#undef JSON_HEDLEY_VERSION_DECODE_REVISION +#undef JSON_HEDLEY_VERSION_ENCODE +#undef JSON_HEDLEY_WARNING +#undef JSON_HEDLEY_WARN_UNUSED_RESULT +#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#undef JSON_HEDLEY_FALL_THROUGH + + + +#endif // INCLUDE_NLOHMANN_JSON_HPP_ diff --git a/deps/icu-small/source/tools/toolutil/package.cpp b/deps/icu-small/source/tools/toolutil/package.cpp index 3098f5d57d4523..e58c6648b647d8 100644 --- a/deps/icu-small/source/tools/toolutil/package.cpp +++ b/deps/icu-small/source/tools/toolutil/package.cpp @@ -46,12 +46,12 @@ static const int32_t kItemsChunk = 256; /* How much to increase the filesarray b /* UDataInfo cf. udata.h */ static const UDataInfo dataInfo={ - (uint16_t)sizeof(UDataInfo), + static_cast<uint16_t>(sizeof(UDataInfo)), 0, U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, - (uint8_t)sizeof(char16_t), + static_cast<uint8_t>(sizeof(char16_t)), 0, {0x43, 0x6d, 0x6e, 0x44}, /* dataFormat="CmnD" */ @@ -68,7 +68,7 @@ U_CDECL_END static uint16_t readSwapUInt16(uint16_t x) { - return (uint16_t)((x<<8)|(x>>8)); + return static_cast<uint16_t>((x << 8) | (x >> 8)); } // platform types ---------------------------------------------------------- *** @@ -79,7 +79,7 @@ enum { TYPE_L, TYPE_B, TYPE_LE, TYPE_E, TYPE_COUNT }; static inline int32_t makeTypeEnum(uint8_t charset, UBool isBigEndian) { - return 2*(int32_t)charset+isBigEndian; + return 2 * static_cast<int32_t>(charset) + isBigEndian; } static inline int32_t @@ -104,8 +104,8 @@ makeTypeLetter(int32_t typeEnum) { static void makeTypeProps(char type, uint8_t &charset, UBool &isBigEndian) { int32_t typeEnum=makeTypeEnum(type); - charset=(uint8_t)(typeEnum>>1); - isBigEndian=(UBool)(typeEnum&1); + charset = static_cast<uint8_t>(typeEnum >> 1); + isBigEndian = static_cast<UBool>(typeEnum & 1); } U_CFUNC const UDataInfo * @@ -168,7 +168,7 @@ getTypeEnumForInputData(const uint8_t *data, int32_t length, return -1; } - return makeTypeEnum(pInfo->charsetFamily, (UBool)pInfo->isBigEndian); + return makeTypeEnum(pInfo->charsetFamily, static_cast<UBool>(pInfo->isBigEndian)); } // file handling ----------------------------------------------------------- *** @@ -180,7 +180,7 @@ extractPackageName(const char *filename, int32_t len; basename=findBasename(filename); - len=(int32_t)strlen(basename)-4; /* -4: subtract the length of ".dat" */ + len = static_cast<int32_t>(strlen(basename)) - 4; /* -4: subtract the length of ".dat" */ if(len<=0 || 0!=strcmp(basename+len, ".dat")) { fprintf(stderr, "icupkg: \"%s\" is not recognized as a package filename (must end with .dat)\n", @@ -190,7 +190,7 @@ extractPackageName(const char *filename, if(len>=capacity) { fprintf(stderr, "icupkg: the package name \"%s\" is too long (>=%ld)\n", - basename, (long)capacity); + basename, static_cast<long>(capacity)); exit(U_ILLEGAL_ARGUMENT_ERROR); } @@ -203,7 +203,7 @@ getFileLength(FILE *f) { int32_t length; fseek(f, 0, SEEK_END); - length=(int32_t)ftell(f); + length = static_cast<int32_t>(ftell(f)); fseek(f, 0, SEEK_SET); return length; } @@ -254,7 +254,7 @@ makeFullFilename(const char *path, const char *name, // prepend the path unless nullptr or empty if(path!=nullptr && path[0]!=0) { - if((int32_t)(strlen(path)+1)>=capacity) { + if (static_cast<int32_t>(strlen(path) + 1) >= capacity) { fprintf(stderr, "pathname too long: \"%s\"\n", path); exit(U_BUFFER_OVERFLOW_ERROR); } @@ -270,7 +270,7 @@ makeFullFilename(const char *path, const char *name, } // turn the name into a filename, turn tree separators into file separators - if((int32_t)((s-filename)+strlen(name))>=capacity) { + if (static_cast<int32_t>((s - filename) + strlen(name)) >= capacity) { fprintf(stderr, "path/filename too long: \"%s%s\"\n", filename, name); exit(U_BUFFER_OVERFLOW_ERROR); } @@ -309,7 +309,7 @@ readFile(const char *path, const char *name, int32_t &length, char &type) { UErrorCode errorCode; int32_t fileLength, typeEnum; - makeFullFilename(path, name, filename, (int32_t)sizeof(filename)); + makeFullFilename(path, name, filename, static_cast<int32_t>(sizeof(filename))); /* open the input file, get its length, allocate memory for it, read the file */ file=fopen(filename, "rb"); @@ -328,15 +328,15 @@ readFile(const char *path, const char *name, int32_t &length, char &type) { /* allocate the buffer, pad to multiple of 16 */ length=(fileLength+0xf)&~0xf; - icu::LocalMemory<uint8_t> data((uint8_t *)uprv_malloc(length)); + icu::LocalMemory<uint8_t> data(static_cast<uint8_t*>(uprv_malloc(length))); if(data.isNull()) { fclose(file); - fprintf(stderr, "icupkg: malloc error allocating %d bytes.\n", (int)length); + fprintf(stderr, "icupkg: malloc error allocating %d bytes.\n", static_cast<int>(length)); exit(U_MEMORY_ALLOCATION_ERROR); } /* read the file */ - if(fileLength!=(int32_t)fread(data.getAlias(), 1, fileLength, file)) { + if (fileLength != static_cast<int32_t>(fread(data.getAlias(), 1, fileLength, file))) { fprintf(stderr, "icupkg: error reading \"%s\"\n", filename); fclose(file); exit(U_FILE_ACCESS_ERROR); @@ -403,18 +403,18 @@ Package::Package() // create a header for an empty package DataHeader *pHeader; - pHeader=(DataHeader *)header; + pHeader = reinterpret_cast<DataHeader*>(header); pHeader->dataHeader.magic1=0xda; pHeader->dataHeader.magic2=0x27; memcpy(&pHeader->info, &dataInfo, sizeof(dataInfo)); - headerLength=(int32_t)(4+sizeof(dataInfo)); + headerLength = static_cast<int32_t>(4 + sizeof(dataInfo)); if(headerLength&0xf) { /* NUL-pad the header to a multiple of 16 */ int32_t length=(headerLength+0xf)&~0xf; memset(header+headerLength, 0, length-headerLength); headerLength=length; } - pHeader->dataHeader.headerSize=(uint16_t)headerLength; + pHeader->dataHeader.headerSize = static_cast<uint16_t>(headerLength); } Package::~Package() { @@ -454,7 +454,7 @@ Package::readPackage(const char *filename) { const UDataOffsetTOCEntry *inEntries; - extractPackageName(filename, inPkgName, (int32_t)sizeof(inPkgName)); + extractPackageName(filename, inPkgName, static_cast<int32_t>(sizeof(inPkgName))); /* read the file */ inData=readFile(nullptr, filename, inLength, type); @@ -486,7 +486,7 @@ Package::readPackage(const char *filename) { } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(reinterpret_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==0x43 && /* dataFormat="CmnD" */ pInfo->dataFormat[1]==0x6d && @@ -500,11 +500,11 @@ Package::readPackage(const char *filename) { pInfo->formatVersion[0]); exit(U_UNSUPPORTED_ERROR); } - inIsBigEndian=(UBool)pInfo->isBigEndian; + inIsBigEndian = static_cast<UBool>(pInfo->isBigEndian); inCharset=pInfo->charsetFamily; inBytes=(const uint8_t *)inData+headerLength; - inEntries=(const UDataOffsetTOCEntry *)(inBytes+4); + inEntries = reinterpret_cast<const UDataOffsetTOCEntry*>(inBytes + 4); /* check that the itemCount fits, then the ToC table, then at least the header of the last item */ length-=headerLength; @@ -512,7 +512,7 @@ Package::readPackage(const char *filename) { /* itemCount does not fit */ offset=0x7fffffff; } else { - itemCount=udata_readInt32(ds, *(const int32_t *)inBytes); + itemCount = udata_readInt32(ds, *reinterpret_cast<const int32_t*>(inBytes)); setItemCapacity(itemCount); /* resize so there's space */ if(itemCount==0) { offset=4; @@ -521,12 +521,12 @@ Package::readPackage(const char *filename) { offset=0x7fffffff; } else { /* offset of the last item plus at least 20 bytes for its header */ - offset=20+(int32_t)ds->readUInt32(inEntries[itemCount-1].dataOffset); + offset = 20 + static_cast<int32_t>(ds->readUInt32(inEntries[itemCount - 1].dataOffset)); } } if(length<offset) { fprintf(stderr, "icupkg: too few bytes (%ld after header) for a .dat package\n", - (long)length); + static_cast<long>(length)); exit(U_INDEX_OUTOFBOUNDS_ERROR); } /* do not modify the package length variable until the last item's length is set */ @@ -547,7 +547,7 @@ Package::readPackage(const char *filename) { /* swap the item name strings */ int32_t stringsOffset=4+8*itemCount; - itemLength=(int32_t)(ds->readUInt32(inEntries[0].dataOffset))-stringsOffset; + itemLength = static_cast<int32_t>(ds->readUInt32(inEntries[0].dataOffset)) - stringsOffset; // don't include padding bytes at the end of the item names while(itemLength>0 && inBytes[stringsOffset+itemLength-1]!=0) { @@ -577,7 +577,7 @@ Package::readPackage(const char *filename) { * while old-style ICU .dat packages (before multi-tree support) * use an underscore ('_') between package and item names. */ - offset=(int32_t)ds->readUInt32(inEntries[0].nameOffset)-stringsOffset; + offset = static_cast<int32_t>(ds->readUInt32(inEntries[0].nameOffset)) - stringsOffset; s=inItemStrings+offset; // name of the first entry int32_t prefixLength; if(doAutoPrefix) { @@ -590,7 +590,7 @@ Package::readPackage(const char *filename) { s, U_TREE_ENTRY_SEP_CHAR); exit(U_INVALID_FORMAT_ERROR); } - prefixLength=(int32_t)(prefixLimit-s); + prefixLength = static_cast<int32_t>(prefixLimit - s); if(prefixLength==0 || prefixLength>=UPRV_LENGTHOF(pkgPrefix)) { fprintf(stderr, "icupkg: --auto_toc_prefix[_with_type] but " @@ -614,7 +614,7 @@ Package::readPackage(const char *filename) { memcpy(prefix, inPkgName, inPkgNameLength); prefixLength=inPkgNameLength; - if( (int32_t)strlen(s)>=(inPkgNameLength+2) && + if (static_cast<int32_t>(strlen(s)) >= (inPkgNameLength + 2) && 0==memcmp(s, inPkgName, inPkgNameLength) && s[inPkgNameLength]=='_' ) { @@ -633,7 +633,7 @@ Package::readPackage(const char *filename) { for(i=0; i<itemCount; ++i) { // skip the package part of the item name, error if it does not match the actual package name // or if nothing follows the package name - offset=(int32_t)ds->readUInt32(inEntries[i].nameOffset)-stringsOffset; + offset = static_cast<int32_t>(ds->readUInt32(inEntries[i].nameOffset)) - stringsOffset; s=inItemStrings+offset; if(0!=strncmp(s, prefix, prefixLength) || s[prefixLength]==0) { fprintf(stderr, "icupkg: input .dat item name \"%s\" does not start with \"%s\"\n", @@ -643,9 +643,9 @@ Package::readPackage(const char *filename) { items[i].name=s+prefixLength; // set the item's data - items[i].data=(uint8_t *)inBytes+ds->readUInt32(inEntries[i].dataOffset); + items[i].data = const_cast<uint8_t*>(inBytes) + ds->readUInt32(inEntries[i].dataOffset); if(i>0) { - items[i-1].length=(int32_t)(items[i].data-items[i-1].data); + items[i - 1].length = static_cast<int32_t>(items[i].data - items[i - 1].data); // set the previous item's platform type typeEnum=getTypeEnumForInputData(items[i-1].data, items[i-1].length, &errorCode); @@ -703,10 +703,10 @@ Package::writePackage(const char *filename, char outType, const char *comment) { DataHeader *pHeader; int32_t length; - pHeader=(DataHeader *)header; + pHeader = reinterpret_cast<DataHeader*>(header); headerLength=4+pHeader->info.size; - length=(int32_t)strlen(comment); - if((int32_t)(headerLength+length)>=(int32_t)sizeof(header)) { + length = static_cast<int32_t>(strlen(comment)); + if ((headerLength + length) >= static_cast<int32_t>(sizeof(header))) { fprintf(stderr, "icupkg: comment too long\n"); exit(U_BUFFER_OVERFLOW_ERROR); } @@ -718,7 +718,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { memset(header+headerLength, 0, length-headerLength); headerLength=length; } - pHeader->dataHeader.headerSize=(uint16_t)headerLength; + pHeader->dataHeader.headerSize = static_cast<uint16_t>(headerLength); } makeTypeProps(outType, outCharset, outIsBigEndian); @@ -760,7 +760,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { exit(errorCode); } } - length=(int32_t)fwrite(header, 1, headerLength, file); + length = static_cast<int32_t>(fwrite(header, 1, headerLength, file)); if(length!=headerLength) { fprintf(stderr, "icupkg: unable to write complete header to file \"%s\"\n", filename); exit(U_FILE_ACCESS_ERROR); @@ -769,9 +769,9 @@ Package::writePackage(const char *filename, char outType, const char *comment) { // prepare and swap the package name with a tree separator // for prepending to item names if(pkgPrefix[0]==0) { - prefixLength=(int32_t)strlen(prefix); + prefixLength = static_cast<int32_t>(strlen(prefix)); } else { - prefixLength=(int32_t)strlen(pkgPrefix); + prefixLength = static_cast<int32_t>(strlen(pkgPrefix)); memcpy(prefix, pkgPrefix, prefixLength); if(prefixEndsWithType) { prefix[prefixLength-1]=outType; @@ -797,7 +797,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { // create the output item names in sorted order, with the package name prepended to each for(i=0; i<itemCount; ++i) { - length=(int32_t)strlen(items[i].name); + length = static_cast<int32_t>(strlen(items[i].name)); name=allocString(false, length+prefixLength); memcpy(name, prefix, prefixLength); memcpy(name+prefixLength, items[i].name, length+1); @@ -824,7 +824,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { exit(errorCode); } } - length=(int32_t)fwrite(&outInt32, 1, 4, file); + length = static_cast<int32_t>(fwrite(&outInt32, 1, 4, file)); if(length!=4) { fprintf(stderr, "icupkg: unable to write complete item count to file \"%s\"\n", filename); exit(U_FILE_ACCESS_ERROR); @@ -833,18 +833,18 @@ Package::writePackage(const char *filename, char outType, const char *comment) { // then write the item entries (and collect the maxItemLength) maxItemLength=0; for(i=0; i<itemCount; ++i) { - entry.nameOffset=(uint32_t)(basenameOffset+(items[i].name-outStrings)); - entry.dataOffset=(uint32_t)offset; + entry.nameOffset = static_cast<uint32_t>(basenameOffset + (items[i].name - outStrings)); + entry.dataOffset = static_cast<uint32_t>(offset); if(dsLocalToOut!=nullptr) { dsLocalToOut->swapArray32(dsLocalToOut, &entry, 8, &entry, &errorCode); if(U_FAILURE(errorCode)) { - fprintf(stderr, "icupkg: swapArray32(item entry %ld) failed - %s\n", (long)i, u_errorName(errorCode)); + fprintf(stderr, "icupkg: swapArray32(item entry %ld) failed - %s\n", static_cast<long>(i), u_errorName(errorCode)); exit(errorCode); } } - length=(int32_t)fwrite(&entry, 1, 8, file); + length = static_cast<int32_t>(fwrite(&entry, 1, 8, file)); if(length!=8) { - fprintf(stderr, "icupkg: unable to write complete item entry %ld to file \"%s\"\n", (long)i, filename); + fprintf(stderr, "icupkg: unable to write complete item entry %ld to file \"%s\"\n", static_cast<long>(i), filename); exit(U_FILE_ACCESS_ERROR); } @@ -856,7 +856,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { } // write the item names - length=(int32_t)fwrite(outStrings, 1, outStringTop, file); + length = static_cast<int32_t>(fwrite(outStrings, 1, outStringTop, file)); if(length!=outStringTop) { fprintf(stderr, "icupkg: unable to write complete item names to file \"%s\"\n", filename); exit(U_FILE_ACCESS_ERROR); @@ -872,13 +872,13 @@ Package::writePackage(const char *filename, char outType, const char *comment) { pItem->data, pItem->length, pItem->data, &errorCode); if(U_FAILURE(errorCode)) { - fprintf(stderr, "icupkg: udata_swap(item %ld) failed - %s\n", (long)i, u_errorName(errorCode)); + fprintf(stderr, "icupkg: udata_swap(item %ld) failed - %s\n", static_cast<long>(i), u_errorName(errorCode)); exit(errorCode); } } - length=(int32_t)fwrite(pItem->data, 1, pItem->length, file); + length = static_cast<int32_t>(fwrite(pItem->data, 1, pItem->length, file)); if(length!=pItem->length) { - fprintf(stderr, "icupkg: unable to write complete item %ld to file \"%s\"\n", (long)i, filename); + fprintf(stderr, "icupkg: unable to write complete item %ld to file \"%s\"\n", static_cast<long>(i), filename); exit(U_FILE_ACCESS_ERROR); } } @@ -948,12 +948,12 @@ Package::findItems(const char *pattern) { wild=strchr(pattern, '*'); if(wild==nullptr) { // no wildcard - findPrefixLength=(int32_t)strlen(pattern); + findPrefixLength = static_cast<int32_t>(strlen(pattern)); } else { // one wildcard - findPrefixLength=(int32_t)(wild-pattern); + findPrefixLength = static_cast<int32_t>(wild - pattern); findSuffix=wild+1; - findSuffixLength=(int32_t)strlen(findSuffix); + findSuffixLength = static_cast<int32_t>(strlen(findSuffix)); if(nullptr!=strchr(findSuffix, '*')) { // two or more wildcards fprintf(stderr, "icupkg: syntax error (more than one '*') in item pattern \"%s\"\n", pattern); @@ -980,7 +980,7 @@ Package::findNextItem() { while(findNextIndex<itemCount) { idx=findNextIndex++; name=items[idx].name; - nameLength=(int32_t)strlen(name); + nameLength = static_cast<int32_t>(strlen(name)); if(nameLength<(findPrefixLength+findSuffixLength)) { // item name too short for prefix & suffix continue; @@ -1148,7 +1148,7 @@ Package::extractItem(const char *filesPath, const char *outName, int32_t idx, ch ds=udata_openSwapper(itemIsBigEndian, itemCharset, outIsBigEndian, outCharset, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "icupkg: udata_openSwapper(item %ld) failed - %s\n", - (long)idx, u_errorName(errorCode)); + static_cast<long>(idx), u_errorName(errorCode)); exit(errorCode); } @@ -1158,7 +1158,7 @@ Package::extractItem(const char *filesPath, const char *outName, int32_t idx, ch // swap the item from its platform properties to the desired ones udata_swap(ds, pItem->data, pItem->length, pItem->data, &errorCode); if(U_FAILURE(errorCode)) { - fprintf(stderr, "icupkg: udata_swap(item %ld) failed - %s\n", (long)idx, u_errorName(errorCode)); + fprintf(stderr, "icupkg: udata_swap(item %ld) failed - %s\n", static_cast<long>(idx), u_errorName(errorCode)); exit(errorCode); } udata_closeSwapper(ds); @@ -1166,13 +1166,13 @@ Package::extractItem(const char *filesPath, const char *outName, int32_t idx, ch } // create the file and write its contents - makeFullFilenameAndDirs(filesPath, outName, filename, (int32_t)sizeof(filename)); + makeFullFilenameAndDirs(filesPath, outName, filename, static_cast<int32_t>(sizeof(filename))); file=fopen(filename, "wb"); if(file==nullptr) { fprintf(stderr, "icupkg: unable to create file \"%s\"\n", filename); exit(U_FILE_ACCESS_ERROR); } - fileLength=(int32_t)fwrite(pItem->data, 1, pItem->length, file); + fileLength = static_cast<int32_t>(fwrite(pItem->data, 1, pItem->length, file)); if(ferror(file) || fileLength!=pItem->length) { fprintf(stderr, "icupkg: unable to write complete file \"%s\"\n", filename); @@ -1222,7 +1222,7 @@ Package::getItem(int32_t idx) const { void Package::checkDependency(void *context, const char *itemName, const char *targetName) { // check dependency: make sure the target item is in the package - Package *me=(Package *)context; + Package* me = static_cast<Package*>(context); if(me->findItem(targetName)<0) { me->isMissingItems=true; fprintf(stderr, "Item %s depends on missing item %s\n", itemName, targetName); @@ -1233,7 +1233,7 @@ UBool Package::checkDependencies() { isMissingItems=false; enumDependencies(this, checkDependency); - return (UBool)!isMissingItems; + return !isMissingItems; } void @@ -1274,7 +1274,7 @@ Package::allocString(UBool in, int32_t length) { void Package::sortItems() { UErrorCode errorCode=U_ZERO_ERROR; - uprv_sortArray(items, itemCount, (int32_t)sizeof(Item), compareItems, nullptr, false, &errorCode); + uprv_sortArray(items, itemCount, static_cast<int32_t>(sizeof(Item)), compareItems, nullptr, false, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "icupkg: sorting item names failed - %s\n", u_errorName(errorCode)); exit(errorCode); @@ -1286,11 +1286,11 @@ void Package::setItemCapacity(int32_t max) if(max<=itemMax) { return; } - Item *newItems = (Item*)uprv_malloc(max * sizeof(items[0])); + Item* newItems = static_cast<Item*>(uprv_malloc(max * sizeof(items[0]))); Item *oldItems = items; if(newItems == nullptr) { fprintf(stderr, "icupkg: Out of memory trying to allocate %lu bytes for %d items\n", - (unsigned long)(max*sizeof(items[0])), max); + max * sizeof(items[0]), max); exit(U_MEMORY_ALLOCATION_ERROR); } if(items && itemCount>0) { diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp index 741a8a5228ca68..e2ecf079647b6d 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -16,6 +16,9 @@ # define NOMCX #include <windows.h> #include <time.h> +# if defined(__clang__) +# include <exception> +# endif # ifdef __GNUC__ # define WINDOWS_WITH_GNUC # endif @@ -294,6 +297,12 @@ checkAssemblyHeaderName(const char* optAssembly) { return false; } +U_CAPI UBool U_EXPORT2 +checkCpuArchitecture(const char* optCpuArch) { + return strcmp(optCpuArch, "x64") == 0 || strcmp(optCpuArch, "x86") == 0 || strcmp(optCpuArch, "arm64") == 0 || strcmp(optCpuArch, "arm") == 0 + || strcmp(optCpuArch, "X64") == 0 || strcmp(optCpuArch, "X86") == 0 || strcmp(optCpuArch, "ARM64") == 0 || strcmp(optCpuArch, "ARM") == 0; +} + U_CAPI void U_EXPORT2 printAssemblyHeadersToStdErr() { @@ -598,7 +607,7 @@ write32(FileStream *out, uint32_t bitField, uint32_t column) { int32_t i; char bitFieldStr[64]; /* This is more bits than needed for a 32-bit number */ char *s = bitFieldStr; - uint8_t *ptrIdx = (uint8_t *)&bitField; + uint8_t* ptrIdx = reinterpret_cast<uint8_t*>(&bitField); static const char hexToStr[16] = { '0','1','2','3', '4','5','6','7', @@ -665,14 +674,14 @@ write8(FileStream *out, uint8_t byte, uint32_t column) { /* convert the byte value to a string */ if(byte>=100) { - s[i++]=(char)('0'+byte/100); + s[i++] = static_cast<char>('0' + byte / 100); byte%=100; } if(i>0 || byte>=10) { - s[i++]=(char)('0'+byte/10); + s[i++] = static_cast<char>('0' + byte / 10); byte%=10; } - s[i++]=(char)('0'+byte); + s[i++] = static_cast<char>('0' + byte); s[i]=0; /* write the value, possibly with comma and newline */ @@ -799,7 +808,12 @@ getOutFilename( #ifdef CAN_GENERATE_OBJECTS static void -getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char *optMatchArch) { +getArchitecture( + uint16_t *pCPU, + uint16_t *pBits, + UBool *pIsBigEndian, + const char *optMatchArch, + [[maybe_unused]] const char *optCpuArch) { union { char bytes[2048]; #ifdef U_ELF @@ -830,7 +844,7 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char /* set EM_386 because elf.h does not provide better defaults */ *pCPU=EM_386; *pBits=32; - *pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB); + *pIsBigEndian = static_cast<UBool>(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB); #elif U_PLATFORM_HAS_WIN32_API // Windows always runs in little-endian mode. *pIsBigEndian = false; @@ -847,7 +861,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char # if defined(_M_IX86) *pCPU = IMAGE_FILE_MACHINE_I386; # else - *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; + // Linker for ClangCL doesn't handle IMAGE_FILE_MACHINE_UNKNOWN the same as + // linker for MSVC. Because of this optCpuArch is used to define the CPU + // architecture in that case. While _M_AMD64 and _M_ARM64 could be used, + // this would potentially be problematic when cross-compiling as this code + // would most likely be ran on host machine to generate the .obj file for + // the target architecture. +# if defined(__clang__) + if (!optCpuArch) { + fprintf(stderr, "genccode: CPU architecture must be set for Clang-CL\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } if (strcmp(optCpuArch, "x64") == 0 || strcmp(optCpuArch, "X64") == 0) { + *pCPU = IMAGE_FILE_MACHINE_AMD64; + } else if (strcmp(optCpuArch, "x86") == 0 || strcmp(optCpuArch, "X86") == 0) { + *pCPU = IMAGE_FILE_MACHINE_I386; + } else if (strcmp(optCpuArch, "arm64") == 0 || strcmp(optCpuArch, "ARM64") == 0) { + *pCPU = IMAGE_FILE_MACHINE_ARM64; + } else if (strcmp(optCpuArch, "arm") == 0 || strcmp(optCpuArch, "ARM") == 0) { + *pCPU = IMAGE_FILE_MACHINE_ARM; + } else { + std::terminate(); // Unreachable. + } +# else + *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; +# endif # endif # if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64) *pBits = 64; // Doesn't seem to be used for anything interesting though? @@ -870,7 +907,7 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char length=T_FileStream_read(in, buffer.bytes, sizeof(buffer.bytes)); #ifdef U_ELF - if(length<(int32_t)sizeof(Elf32_Ehdr)) { + if (length < static_cast<int32_t>(sizeof(Elf32_Ehdr))) { fprintf(stderr, "genccode: match-arch file %s is too short\n", filename); exit(U_UNSUPPORTED_ERROR); } @@ -898,7 +935,7 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char } #endif - *pIsBigEndian=(UBool)(buffer.header32.e_ident[EI_DATA]==ELFDATA2MSB); + *pIsBigEndian = static_cast<UBool>(buffer.header32.e_ident[EI_DATA] == ELFDATA2MSB); if(*pIsBigEndian!=U_IS_BIG_ENDIAN) { fprintf(stderr, "genccode: currently only same-endianness ELF formats are supported\n"); exit(U_UNSUPPORTED_ERROR); @@ -934,6 +971,7 @@ writeObjectCode( const char *destdir, const char *optEntryPoint, const char *optMatchArch, + const char *optCpuArch, const char *optFilename, char *outFilePath, size_t outFilePathCapacity, @@ -1201,7 +1239,7 @@ writeObjectCode( #endif /* deal with options, files and the entry point name */ - getArchitecture(&cpu, &bits, &makeBigEndian, optMatchArch); + getArchitecture(&cpu, &bits, &makeBigEndian, optMatchArch, optCpuArch); if (optMatchArch) { printf("genccode: --match-arch cpu=%hu bits=%hu big-endian=%d\n", cpu, bits, makeBigEndian); @@ -1371,7 +1409,7 @@ writeObjectCode( if(length==0) { break; } - T_FileStream_write(out, buffer, (int32_t)length); + T_FileStream_write(out, buffer, length); } #if U_PLATFORM_HAS_WIN32_API diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.h b/deps/icu-small/source/tools/toolutil/pkg_genc.h index 2dd1b45cde992e..ef966aba1306e9 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.h +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.h @@ -59,9 +59,8 @@ #define PKGDATA_FILE_SEP_STRING U_FILE_SEP_STRING #endif -#define LARGE_BUFFER_MAX_SIZE 2048 -#define SMALL_BUFFER_MAX_SIZE 512 -#define SMALL_BUFFER_FLAG_NAMES 32 +#define LARGE_BUFFER_MAX_SIZE 16384 +#define SMALL_BUFFER_MAX_SIZE 4096 #define BUFFER_PADDING_SIZE 20 /** End platform defines **/ @@ -74,6 +73,9 @@ printAssemblyHeadersToStdErr(void); U_CAPI UBool U_EXPORT2 checkAssemblyHeaderName(const char* optAssembly); +U_CAPI UBool U_EXPORT2 +checkCpuArchitecture(const char* optCpuArch); + U_CAPI void U_EXPORT2 writeCCode( const char *filename, @@ -99,6 +101,7 @@ writeObjectCode( const char *destdir, const char *optEntryPoint, const char *optMatchArch, + const char *optCpuArch, const char *optFilename, char *outFilePath, size_t outFilePathCapacity, diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp index a301c322ebec09..c1a46e9aed1d5d 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp @@ -360,7 +360,7 @@ createCommonDataFile(const char *destDir, const char *name, const char *entrypoi snprintf( buffer, sizeof(buffer), - "U_EXPORT struct {\n" + "U_EXPORT const struct {\n" " uint16_t headerSize;\n" " uint8_t magic1, magic2;\n" " UDataInfo info;\n" @@ -412,9 +412,9 @@ addFile(const char *filename, const char *name, const char *source, UBool source if(fileCount==fileMax) { fileMax += CHUNK_FILE_COUNT; - files = (File *)uprv_realloc(files, fileMax*sizeof(files[0])); /* note: never freed. */ + files = static_cast<File*>(uprv_realloc(files, fileMax * sizeof(files[0]))); /* note: never freed. */ if(files==nullptr) { - fprintf(stderr, "pkgdata/gencmn: Could not allocate %u bytes for %d files\n", (unsigned int)(fileMax*sizeof(files[0])), fileCount); + fprintf(stderr, "pkgdata/gencmn: Could not allocate %u bytes for %d files\n", static_cast<unsigned int>(fileMax * sizeof(files[0])), fileCount); exit(U_MEMORY_ALLOCATION_ERROR); } } @@ -428,7 +428,7 @@ addFile(const char *filename, const char *name, const char *source, UBool source } fullPath = pathToFullPath(filename, source); /* store the pathname */ - length = (uint32_t)(uprv_strlen(filename) + 1 + uprv_strlen(name) + 1); + length = static_cast<uint32_t>(uprv_strlen(filename) + 1 + uprv_strlen(name) + 1); s=allocString(length); uprv_strcpy(s, name); uprv_strcat(s, U_TREE_ENTRY_SEP_STRING); @@ -462,7 +462,7 @@ addFile(const char *filename, const char *name, const char *source, UBool source /* do not add files that are longer than maxSize */ if(maxSize && length>maxSize) { if (verbose) { - printf("%s ignored (size %ld > %ld)\n", fullPath, (long)length, (long)maxSize); + printf("%s ignored (size %ld > %ld)\n", fullPath, static_cast<long>(length), static_cast<long>(maxSize)); } return; } @@ -471,7 +471,7 @@ addFile(const char *filename, const char *name, const char *source, UBool source char *t; /* get and store the basename */ /* need to include the package name */ - length = (uint32_t)(uprv_strlen(filename) + 1 + uprv_strlen(name) + 1); + length = static_cast<uint32_t>(uprv_strlen(filename) + 1 + uprv_strlen(name) + 1); s=allocString(length); uprv_strcpy(s, name); uprv_strcat(s, U_TREE_ENTRY_SEP_STRING); @@ -515,16 +515,16 @@ pathToFullPath(const char *path, const char *source) { char *fullPath; int32_t n; - length = (uint32_t)(uprv_strlen(path) + 1); - newLength = (length + 1 + (int32_t)uprv_strlen(source)); - fullPath = (char *)uprv_malloc(newLength); + length = static_cast<uint32_t>(uprv_strlen(path) + 1); + newLength = (length + 1 + static_cast<int32_t>(uprv_strlen(source))); + fullPath = static_cast<char*>(uprv_malloc(newLength)); if(source != nullptr) { uprv_strcpy(fullPath, source); uprv_strcat(fullPath, U_FILE_SEP_STRING); } else { fullPath[0] = 0; } - n = (int32_t)uprv_strlen(fullPath); + n = static_cast<int32_t>(uprv_strlen(fullPath)); fullPath[n] = 0; /* Suppress compiler warning for unused variable n */ /* when conditional code below is not compiled. */ uprv_strcat(fullPath, path); diff --git a/deps/icu-small/source/tools/toolutil/pkgitems.cpp b/deps/icu-small/source/tools/toolutil/pkgitems.cpp index e49775d56da5df..ca7c31ae6c024f 100644 --- a/deps/icu-small/source/tools/toolutil/pkgitems.cpp +++ b/deps/icu-small/source/tools/toolutil/pkgitems.cpp @@ -90,7 +90,7 @@ class NativeItem { if(pInfo->isBigEndian==U_IS_BIG_ENDIAN && pInfo->charsetFamily==U_CHARSET_FAMILY) { bytes=pItem->data+itemHeaderLength; } else { - UDataSwapper *ds=udata_openSwapper((UBool)pInfo->isBigEndian, pInfo->charsetFamily, U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &errorCode); + UDataSwapper* ds = udata_openSwapper(static_cast<UBool>(pInfo->isBigEndian), pInfo->charsetFamily, U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &errorCode); if(U_FAILURE(errorCode)) { fprintf(stderr, "icupkg: udata_openSwapper(\"%s\") failed - %s\n", pItem->name, u_errorName(errorCode)); @@ -142,15 +142,15 @@ makeTargetName(const char *itemName, const char *id, int32_t idLength, const cha } // build the target string - treeLength=(int32_t)(itemID-itemName); + treeLength = static_cast<int32_t>(itemID - itemName); if(idLength<0) { - idLength=(int32_t)strlen(id); + idLength = static_cast<int32_t>(strlen(id)); } - suffixLength=(int32_t)strlen(suffix); + suffixLength = static_cast<int32_t>(strlen(suffix)); targetLength=treeLength+idLength+suffixLength; if(targetLength>=capacity) { fprintf(stderr, "icupkg/makeTargetName(%s) target item name length %ld too long\n", - itemName, (long)targetLength); + itemName, static_cast<long>(targetLength)); *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } @@ -165,7 +165,7 @@ checkIDSuffix(const char *itemName, const char *id, int32_t idLength, const char CheckDependency check, void *context, UErrorCode *pErrorCode) { char target[200]; - makeTargetName(itemName, id, idLength, suffix, target, (int32_t)sizeof(target), pErrorCode); + makeTargetName(itemName, id, idLength, suffix, target, static_cast<int32_t>(sizeof(target)), pErrorCode); if(U_SUCCESS(*pErrorCode)) { check(context, itemName, target); } @@ -199,7 +199,7 @@ checkParent(const char *itemName, CheckDependency check, void *context, if(parentLimit!=itemID) { // get the parent item name by truncating the last part of this item's name */ parent=itemID; - parentLength=(int32_t)(parentLimit-itemID); + parentLength = static_cast<int32_t>(parentLimit - itemID); } else { // no '_' in the item name: the parent is the root bundle parent="root"; @@ -261,9 +261,9 @@ checkAlias(const char *itemName, // convert the Unicode string to char * char localeID[48]; - if(length>=(int32_t)sizeof(localeID)) { + if (length >= static_cast<int32_t>(sizeof(localeID))) { fprintf(stderr, "icupkg/ures_enumDependencies(%s res=%08x) alias locale ID length %ld too long\n", - itemName, res, (long)length); + itemName, res, static_cast<long>(length)); *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return; } @@ -389,7 +389,7 @@ ures_enumDependencies(const char *itemName, const UDataInfo *pInfo, if(resData.usesPoolBundle) { char poolName[200]; - makeTargetName(itemName, "pool", 4, ".res", poolName, (int32_t)sizeof(poolName), pErrorCode); + makeTargetName(itemName, "pool", 4, ".res", poolName, static_cast<int32_t>(sizeof(poolName)), pErrorCode); if(U_FAILURE(*pErrorCode)) { return; } @@ -407,7 +407,7 @@ ures_enumDependencies(const char *itemName, const UDataInfo *pInfo, fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName); return; } - const int32_t *poolRoot=(const int32_t *)nativePool.getBytes(); + const int32_t* poolRoot = reinterpret_cast<const int32_t*>(nativePool.getBytes()); const int32_t *poolIndexes=poolRoot+1; int32_t poolIndexLength=poolIndexes[URES_INDEX_LENGTH]&0xff; if(!(poolIndexLength>URES_INDEX_POOL_CHECKSUM && @@ -417,8 +417,8 @@ ures_enumDependencies(const char *itemName, const UDataInfo *pInfo, return; } if(resData.pRoot[1+URES_INDEX_POOL_CHECKSUM]==poolIndexes[URES_INDEX_POOL_CHECKSUM]) { - resData.poolBundleKeys=(const char *)(poolIndexes+poolIndexLength); - resData.poolBundleStrings=(const uint16_t *)(poolRoot+poolIndexes[URES_INDEX_KEYS_TOP]); + resData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + poolIndexLength); + resData.poolBundleStrings = reinterpret_cast<const uint16_t*>(poolRoot + poolIndexes[URES_INDEX_KEYS_TOP]); } else { fprintf(stderr, "icupkg: %s has mismatched checksum for %s\n", poolName, itemName); return; @@ -475,10 +475,10 @@ ucnv_enumDependencies(const UDataSwapper *ds, } /* read the initial UConverterStaticData structure after the UDataInfo header */ - inStaticData=(const UConverterStaticData *)inBytes; + inStaticData = reinterpret_cast<const UConverterStaticData*>(inBytes); - if( length<(int32_t)sizeof(UConverterStaticData) || - (uint32_t)length<(staticDataSize=ds->readUInt32(inStaticData->structSize)) + if (length < static_cast<int32_t>(sizeof(UConverterStaticData)) || + static_cast<uint32_t>(length) < (staticDataSize = ds->readUInt32(inStaticData->structSize)) ) { udata_printError(ds, "icupkg/ucnv_enumDependencies(): too few bytes (%d after header) for an ICU .cnv conversion table\n", length); @@ -487,7 +487,7 @@ ucnv_enumDependencies(const UDataSwapper *ds, } inBytes+=staticDataSize; - length-=(int32_t)staticDataSize; + length -= static_cast<int32_t>(staticDataSize); /* check for supported conversionType values */ if(inStaticData->conversionType==UCNV_MBCS) { @@ -495,9 +495,9 @@ ucnv_enumDependencies(const UDataSwapper *ds, uint32_t mbcsHeaderLength, mbcsHeaderFlags, mbcsHeaderOptions; int32_t extOffset; - inMBCSHeader=(const _MBCSHeader *)inBytes; + inMBCSHeader = reinterpret_cast<const _MBCSHeader*>(inBytes); - if(length<(int32_t)sizeof(_MBCSHeader)) { + if (length < static_cast<int32_t>(sizeof(_MBCSHeader))) { udata_printError(ds, "icupkg/ucnv_enumDependencies(): too few bytes (%d after headers) for an ICU MBCS .cnv conversion table\n", length); *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; @@ -518,8 +518,8 @@ ucnv_enumDependencies(const UDataSwapper *ds, } mbcsHeaderFlags=ds->readUInt32(inMBCSHeader->flags); - extOffset=(int32_t)(mbcsHeaderFlags>>8); - outputType=(uint8_t)mbcsHeaderFlags; + extOffset = static_cast<int32_t>(mbcsHeaderFlags >> 8); + outputType = static_cast<uint8_t>(mbcsHeaderFlags); if(outputType==MBCS_OUTPUT_EXT_ONLY) { /* @@ -538,9 +538,9 @@ ucnv_enumDependencies(const UDataSwapper *ds, } /* swap the base name, between the header and the extension data */ - const char *inBaseName=(const char *)inBytes+mbcsHeaderLength*4; - baseNameLength=(int32_t)strlen(inBaseName); - if(baseNameLength>=(int32_t)sizeof(baseName)) { + const char* inBaseName = reinterpret_cast<const char*>(inBytes) + mbcsHeaderLength * 4; + baseNameLength = static_cast<int32_t>(strlen(inBaseName)); + if (baseNameLength >= static_cast<int32_t>(sizeof(baseName))) { udata_printError(ds, "icupkg/ucnv_enumDependencies(%s): base name length %ld too long\n", itemName, baseNameLength); *pErrorCode=U_UNSUPPORTED_ERROR; @@ -612,7 +612,7 @@ Package::enumDependencies(Item *pItem, void *context, CheckDependency check) { { // TODO: share/cache swappers UDataSwapper *ds=udata_openSwapper( - (UBool)pInfo->isBigEndian, pInfo->charsetFamily, + static_cast<UBool>(pInfo->isBigEndian), pInfo->charsetFamily, U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &errorCode); if(U_FAILURE(errorCode)) { diff --git a/deps/icu-small/source/tools/toolutil/ppucd.cpp b/deps/icu-small/source/tools/toolutil/ppucd.cpp index 0d59b28ce48a7b..4ac73d2acddef8 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.cpp +++ b/deps/icu-small/source/tools/toolutil/ppucd.cpp @@ -29,24 +29,6 @@ U_NAMESPACE_BEGIN PropertyNames::~PropertyNames() {} -// TODO: Create a concrete subclass for the default PropertyNames implementation -// using the ICU library built-in property names API & data. -// Currently only the genprops tool uses PreparsedUCD, and provides its own -// PropertyNames implementation using its just-build property names data and its own code. -// At some point, we should use PreparsedUCD in tests, and then we will need the -// default implementation somewhere. -#if 0 -int32_t -PropertyNames::getPropertyEnum(const char *name) const { - return u_getPropertyEnum(name); -} - -int32_t -PropertyNames::getPropertyValueEnum(int32_t property, const char *name) const { - return u_getPropertyValueEnum((UProperty)property, name); -} -#endif - UniProps::UniProps() : start(U_SENTINEL), end(U_SENTINEL), bmg(U_SENTINEL), bpb(U_SENTINEL), @@ -127,7 +109,7 @@ PreparsedUCD::readLine(UErrorCode &errorCode) { if(result==nullptr) { if(ferror(file)) { perror("error reading preparsed UCD"); - fprintf(stderr, "error reading preparsed UCD before line %ld\n", (long)lineNumber); + fprintf(stderr, "error reading preparsed UCD before line %ld\n", static_cast<long>(lineNumber)); errorCode=U_FILE_ACCESS_ERROR; } return NO_LINE; @@ -159,7 +141,7 @@ PreparsedUCD::readLine(UErrorCode &errorCode) { if(type==LINE_TYPE_COUNT) { fprintf(stderr, "error in preparsed UCD: unknown line type (first field) '%s' on line %ld\n", - line, (long)lineNumber); + line, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return NO_LINE; } @@ -167,7 +149,7 @@ PreparsedUCD::readLine(UErrorCode &errorCode) { break; } } - lineType=(LineType)type; + lineType = static_cast<LineType>(type); if(lineType==UNICODE_VERSION_LINE && fieldLimit<lineLimit) { u_versionFromString(ucdVersion, fieldLimit+1); } @@ -204,7 +186,7 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { fprintf(stderr, "error in preparsed UCD: missing default/block/cp range field " "(no second field) on line %ld\n", - (long)lineNumber); + static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return nullptr; } @@ -218,21 +200,21 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { if(blockLineIndex>=0) { fprintf(stderr, "error in preparsed UCD: default line %ld after one or more block lines\n", - (long)lineNumber); + static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return nullptr; } if(defaultLineIndex>=0) { fprintf(stderr, "error in preparsed UCD: second line with default properties on line %ld\n", - (long)lineNumber); + static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return nullptr; } if(start!=0 || end!=0x10ffff) { fprintf(stderr, "error in preparsed UCD: default range must be 0..10FFFF, not '%s' on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return nullptr; } @@ -259,7 +241,7 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { // Except, it inherits the one blk=Block property. int32_t blkIndex=UCHAR_BLOCK-UCHAR_INT_START; cpProps.intProps[blkIndex]=blockProps.intProps[blkIndex]; - newValues.remove((UChar32)UCHAR_BLOCK); + newValues.remove(static_cast<UChar32>(UCHAR_BLOCK)); } } else if(start>blockProps.end || end<blockProps.start) { // Code point range fully outside the last block inherits the default properties. @@ -269,7 +251,7 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { fprintf(stderr, "error in preparsed UCD: cp range %s on line %ld only " "partially overlaps with block range %04lX..%04lX\n", - field, (long)lineNumber, (long)blockProps.start, (long)blockProps.end); + field, static_cast<long>(lineNumber), static_cast<long>(blockProps.start), static_cast<long>(blockProps.end)); errorCode=U_PARSE_ERROR; return nullptr; } @@ -326,7 +308,7 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV fprintf(stderr, "error in preparsed UCD: mix of binary-property-no and " "enum-property syntax '%s' on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return false; } @@ -337,7 +319,7 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV } else { binaryValue=-1; // Copy out the property name rather than modifying the field (writing a NUL). - pBuffer.append(p, (int32_t)(v-p), errorCode); + pBuffer.append(p, static_cast<int32_t>(v - p), errorCode); p=pBuffer.data(); ++v; } @@ -357,13 +339,13 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV } if(prop<UCHAR_BINARY_LIMIT) { if(binaryValue>=0) { - props.binProps[prop]=(UBool)binaryValue; + props.binProps[prop] = static_cast<UBool>(binaryValue); } else { // No binary value for a binary property. fprintf(stderr, "error in preparsed UCD: enum-property syntax '%s' " "for binary property on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } } else if(binaryValue>=0) { @@ -371,12 +353,12 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV fprintf(stderr, "error in preparsed UCD: binary-property syntax '%s' " "for non-binary property on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } else if (prop < UCHAR_INT_START) { fprintf(stderr, "error in preparsed UCD: prop value is invalid: '%d' for line %ld\n", - prop, (long)lineNumber); + prop, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } else if(prop<UCHAR_INT_LIMIT) { int32_t value=pnames->getPropertyValueEnum(prop, v); @@ -385,13 +367,13 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV char *end; unsigned long ccc=uprv_strtoul(v, &end, 10); if(v<end && *end==0 && ccc<=254) { - value=(int32_t)ccc; + value = static_cast<int32_t>(ccc); } } if(value==UCHAR_INVALID_CODE) { fprintf(stderr, "error in preparsed UCD: '%s' is not a valid value on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } else { props.intProps[prop-UCHAR_INT_START]=value; @@ -435,7 +417,7 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV default: fprintf(stderr, "error in preparsed UCD: '%s' is not a valid default value on line %ld\n", - field, (long)lineNumber); + field, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } } else { @@ -496,13 +478,16 @@ PreparsedUCD::parseProperty(UniProps &props, const char *field, UnicodeSet &newV case UCHAR_SCRIPT_EXTENSIONS: parseScriptExtensions(v, props.scx, errorCode); break; + case UCHAR_IDENTIFIER_TYPE: + parseIdentifierType(v, props.idType, errorCode); + break; default: // Ignore unhandled properties. return true; } } if(U_SUCCESS(errorCode)) { - newValues.add((UChar32)prop); + newValues.add(static_cast<UChar32>(prop)); return true; } else { return false; @@ -523,7 +508,7 @@ PreparsedUCD::getRangeForAlgNames(UChar32 &start, UChar32 &end, UErrorCode &erro fprintf(stderr, "error in preparsed UCD: missing algnamesrange range field " "(no second field) on line %ld\n", - (long)lineNumber); + static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return false; } @@ -533,15 +518,15 @@ PreparsedUCD::getRangeForAlgNames(UChar32 &start, UChar32 &end, UErrorCode &erro UChar32 PreparsedUCD::parseCodePoint(const char *s, UErrorCode &errorCode) { char *end; - uint32_t value=(uint32_t)uprv_strtoul(s, &end, 16); + uint32_t value = static_cast<uint32_t>(uprv_strtoul(s, &end, 16)); if(end<=s || *end!=0 || value>=0x110000) { fprintf(stderr, "error in preparsed UCD: '%s' is not a valid code point on line %ld\n", - s, (long)lineNumber); + s, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return U_SENTINEL; } - return (UChar32)value; + return static_cast<UChar32>(value); } UBool @@ -551,11 +536,11 @@ PreparsedUCD::parseCodePointRange(const char *s, UChar32 &start, UChar32 &end, U if(U_FAILURE(errorCode)) { fprintf(stderr, "error in preparsed UCD: '%s' is not a valid code point range on line %ld\n", - s, (long)lineNumber); + s, static_cast<long>(lineNumber)); return false; } - start=(UChar32)st; - end=(UChar32)e; + start = static_cast<UChar32>(st); + end = static_cast<UChar32>(e); return true; } @@ -573,7 +558,7 @@ PreparsedUCD::parseString(const char *s, UnicodeString &uni, UErrorCode &errorCo if(U_FAILURE(errorCode)) { fprintf(stderr, "error in preparsed UCD: '%s' is not a valid Unicode string on line %ld\n", - s, (long)lineNumber); + s, static_cast<long>(lineNumber)); } } @@ -586,7 +571,7 @@ PreparsedUCD::parseScriptExtensions(const char *s, UnicodeSet &scx, UErrorCode & const char *scs; const char *scLimit=strchr(s, ' '); if(scLimit!=nullptr) { - scs=scString.clear().append(s, (int32_t)(scLimit-s), errorCode).data(); + scs = scString.clear().append(s, static_cast<int32_t>(scLimit - s), errorCode).data(); if(U_FAILURE(errorCode)) { return; } } else { scs=s; @@ -595,13 +580,13 @@ PreparsedUCD::parseScriptExtensions(const char *s, UnicodeSet &scx, UErrorCode & if(script==UCHAR_INVALID_CODE) { fprintf(stderr, "error in preparsed UCD: '%s' is not a valid script code on line %ld\n", - scs, (long)lineNumber); + scs, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return; } else if(scx.contains(script)) { fprintf(stderr, "error in preparsed UCD: scx has duplicate '%s' codes on line %ld\n", - scs, (long)lineNumber); + scs, static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; return; } else { @@ -614,7 +599,51 @@ PreparsedUCD::parseScriptExtensions(const char *s, UnicodeSet &scx, UErrorCode & } } if(scx.isEmpty()) { - fprintf(stderr, "error in preparsed UCD: empty scx= on line %ld\n", (long)lineNumber); + fprintf(stderr, "error in preparsed UCD: empty scx= on line %ld\n", static_cast<long>(lineNumber)); + errorCode=U_PARSE_ERROR; + } +} + +void +PreparsedUCD::parseIdentifierType(const char *s, UnicodeSet &idType, UErrorCode &errorCode) { + if(U_FAILURE(errorCode)) { return; } + idType.clear(); + CharString typeString; + for(;;) { + const char *typeChars; + const char *limit=strchr(s, ' '); + if(limit!=nullptr) { + typeChars = typeString.clear().append(s, static_cast<int32_t>(limit - s), errorCode).data(); + if(U_FAILURE(errorCode)) { return; } + } else { + typeChars=s; + } + int32_t type=pnames->getPropertyValueEnum(UCHAR_IDENTIFIER_TYPE, typeChars); + if(type==UCHAR_INVALID_CODE) { + fprintf(stderr, + "error in preparsed UCD: '%s' is not a valid Identifier_Type on line %ld\n", + typeChars, static_cast<long>(lineNumber)); + errorCode=U_PARSE_ERROR; + return; + } else if(idType.contains(type)) { + fprintf(stderr, + "error in preparsed UCD: Identifier_Type has duplicate '%s' values on line %ld\n", + typeChars, static_cast<long>(lineNumber)); + errorCode=U_PARSE_ERROR; + return; + } else { + idType.add(type); + } + if(limit!=nullptr) { + s=limit+1; + } else { + break; + } + } + if(idType.isEmpty()) { + fprintf(stderr, + "error in preparsed UCD: empty Identifier_Type= on line %ld\n", + static_cast<long>(lineNumber)); errorCode=U_PARSE_ERROR; } } diff --git a/deps/icu-small/source/tools/toolutil/ppucd.h b/deps/icu-small/source/tools/toolutil/ppucd.h index d5c63fab497420..2d54a4335c6f3a 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.h +++ b/deps/icu-small/source/tools/toolutil/ppucd.h @@ -57,7 +57,7 @@ struct U_TOOLUTIL_API UniProps { const char *name; const char *nameAlias; UnicodeString cf, lc, tc, uc; - UnicodeSet scx; + UnicodeSet scx, idType; }; class U_TOOLUTIL_API PreparsedUCD { @@ -156,6 +156,7 @@ class U_TOOLUTIL_API PreparsedUCD { UBool parseCodePointRange(const char *s, UChar32 &start, UChar32 &end, UErrorCode &errorCode); void parseString(const char *s, UnicodeString &uni, UErrorCode &errorCode); void parseScriptExtensions(const char *s, UnicodeSet &scx, UErrorCode &errorCode); + void parseIdentifierType(const char *s, UnicodeSet &idType, UErrorCode &errorCode); static const int32_t kNumLineBuffers=3; diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.cpp b/deps/icu-small/source/tools/toolutil/swapimpl.cpp index 9c585639657cca..d060db4083c59c 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.cpp +++ b/deps/icu-small/source/tools/toolutil/swapimpl.cpp @@ -111,7 +111,7 @@ upname_swap(const UDataSwapper *ds, // formatVersion 2 initially has indexes[8], 32 bytes. if(length<32) { udata_printError(ds, "upname_swap(): too few bytes (%d after header) for pnames.icu\n", - (int)length); + static_cast<int>(length)); *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } @@ -123,7 +123,7 @@ upname_swap(const UDataSwapper *ds, if(length<totalSize) { udata_printError(ds, "upname_swap(): too few bytes (%d after header, should be %d) " "for pnames.icu\n", - (int)length, (int)totalSize); + static_cast<int>(length), static_cast<int>(totalSize)); *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } @@ -176,13 +176,13 @@ uprops_swap(const UDataSwapper *ds, } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==0x55 && /* dataFormat="UPro" */ pInfo->dataFormat[1]==0x50 && pInfo->dataFormat[2]==0x72 && pInfo->dataFormat[3]==0x6f && - (3<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=7) && + (3<=pInfo->formatVersion[0] && pInfo->formatVersion[0]<=9) && (pInfo->formatVersion[0]>=7 || (pInfo->formatVersion[2]==UTRIE_SHIFT && pInfo->formatVersion[3]==UTRIE_INDEX_SHIFT)) @@ -196,7 +196,7 @@ uprops_swap(const UDataSwapper *ds, } /* the properties file must contain at least the indexes array */ - if(length>=0 && (length-headerSize)<(int32_t)sizeof(dataIndexes)) { + if (length >= 0 && (length - headerSize) < static_cast<int32_t>(sizeof(dataIndexes))) { udata_printError(ds, "uprops_swap(): too few bytes (%d after header) for a Unicode properties file\n", length-headerSize); *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; @@ -204,7 +204,7 @@ uprops_swap(const UDataSwapper *ds, } /* read the indexes */ - inData32=(const int32_t *)((const char *)inData+headerSize); + inData32 = reinterpret_cast<const int32_t*>(static_cast<const char*>(inData) + headerSize); for(i=0; i<UPROPS_INDEX_COUNT; ++i) { dataIndexes[i]=udata_readInt32(ds, inData32[i]); } @@ -231,7 +231,7 @@ uprops_swap(const UDataSwapper *ds, return 0; } - outData32=(int32_t *)((char *)outData+headerSize); + outData32 = reinterpret_cast<int32_t*>(static_cast<char*>(outData) + headerSize); /* copy everything for inaccessible data (padding) */ if(inData32!=outData32) { @@ -296,13 +296,21 @@ uprops_swap(const UDataSwapper *ds, // SCX const uint16_t scriptExtensions[2*(i7-i6)]; ds->swapArray16(ds, inData32+dataIndexes[UPROPS_SCRIPT_EXTENSIONS_INDEX], - 4*(dataIndexes[UPROPS_RESERVED_INDEX_7]-dataIndexes[UPROPS_SCRIPT_EXTENSIONS_INDEX]), + 4*(dataIndexes[UPROPS_BLOCK_TRIE_INDEX]-dataIndexes[UPROPS_SCRIPT_EXTENSIONS_INDEX]), outData32+dataIndexes[UPROPS_SCRIPT_EXTENSIONS_INDEX], pErrorCode); + + // Swap the Block UCPTrie=CodePointTrie. + int32_t partOffset = dataIndexes[UPROPS_BLOCK_TRIE_INDEX]; + int32_t nextOffset = dataIndexes[UPROPS_RESERVED_INDEX_8]; + int32_t partLength = 4 * (nextOffset - partOffset); + if (partLength >= 0) { + utrie_swapAnyVersion(ds, inData32 + partOffset, partLength, + outData32 + partOffset, pErrorCode); + } } - /* i7 reservedIndex7; -- 32-bit unit index to the top of the Script_Extensions data */ - return headerSize+4*dataIndexes[UPROPS_RESERVED_INDEX_7]; + return headerSize+4*dataIndexes[UPROPS_RESERVED_INDEX_8]; } /* Unicode case mapping data swapping --------------------------------------- */ @@ -329,7 +337,7 @@ ucase_swap(const UDataSwapper *ds, } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==UCASE_FMT_0 && /* dataFormat="cAsE" */ pInfo->dataFormat[1]==UCASE_FMT_1 && @@ -348,10 +356,10 @@ ucase_swap(const UDataSwapper *ds, return 0; } - inBytes=(const uint8_t *)inData+headerSize; - outBytes=(uint8_t *)outData+headerSize; + inBytes = static_cast<const uint8_t*>(inData) + headerSize; + outBytes = static_cast<uint8_t*>(outData) + headerSize; - inIndexes=(const int32_t *)inBytes; + inIndexes = reinterpret_cast<const int32_t*>(inBytes); if(length>=0) { length-=headerSize; @@ -431,7 +439,7 @@ ubidi_swap(const UDataSwapper *ds, } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==UBIDI_FMT_0 && /* dataFormat="BiDi" */ pInfo->dataFormat[1]==UBIDI_FMT_1 && @@ -450,10 +458,10 @@ ubidi_swap(const UDataSwapper *ds, return 0; } - inBytes=(const uint8_t *)inData+headerSize; - outBytes=(uint8_t *)outData+headerSize; + inBytes = static_cast<const uint8_t*>(inData) + headerSize; + outBytes = static_cast<uint8_t*>(outData) + headerSize; - inIndexes=(const int32_t *)inBytes; + inIndexes = reinterpret_cast<const int32_t*>(inBytes); if(length>=0) { length-=headerSize; @@ -541,7 +549,7 @@ unorm_swap(const UDataSwapper *ds, } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==0x4e && /* dataFormat="Norm" */ pInfo->dataFormat[1]==0x6f && @@ -557,10 +565,10 @@ unorm_swap(const UDataSwapper *ds, return 0; } - inBytes=(const uint8_t *)inData+headerSize; - outBytes=(uint8_t *)outData+headerSize; + inBytes = static_cast<const uint8_t*>(inData) + headerSize; + outBytes = static_cast<uint8_t*>(outData) + headerSize; - inIndexes=(const int32_t *)inBytes; + inIndexes = reinterpret_cast<const int32_t*>(inBytes); if(length>=0) { length-=headerSize; @@ -655,7 +663,7 @@ ulayout_swap(const UDataSwapper *ds, } // Check data format and format version. - const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4); + const UDataInfo* pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if (!( pInfo->dataFormat[0] == ULAYOUT_FMT_0 && // dataFormat="Layo" pInfo->dataFormat[1] == ULAYOUT_FMT_1 && @@ -672,10 +680,10 @@ ulayout_swap(const UDataSwapper *ds, return 0; } - const uint8_t *inBytes = (const uint8_t *)inData + headerSize; - uint8_t *outBytes = (uint8_t *)outData + headerSize; + const uint8_t* inBytes = static_cast<const uint8_t*>(inData) + headerSize; + uint8_t* outBytes = static_cast<uint8_t*>(outData) + headerSize; - const int32_t *inIndexes = (const int32_t *)inBytes; + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); if (length >= 0) { length -= headerSize; @@ -755,7 +763,7 @@ uemoji_swap(const UDataSwapper *ds, } // Check data format and format version. - const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4); + const UDataInfo* pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if (!( pInfo->dataFormat[0] == u'E' && pInfo->dataFormat[1] == u'm' && @@ -772,10 +780,10 @@ uemoji_swap(const UDataSwapper *ds, return 0; } - const uint8_t *inBytes = (const uint8_t *)inData + headerSize; - uint8_t *outBytes = (uint8_t *)outData + headerSize; + const uint8_t* inBytes = static_cast<const uint8_t*>(inData) + headerSize; + uint8_t* outBytes = static_cast<uint8_t*>(outData) + headerSize; - const int32_t *inIndexes = (const int32_t *)inBytes; + const int32_t* inIndexes = reinterpret_cast<const int32_t*>(inBytes); if (length >= 0) { length -= headerSize; @@ -872,7 +880,7 @@ test_swap(const UDataSwapper *ds, } /* check data format and format version */ - pInfo=(const UDataInfo *)((const char *)inData+4); + pInfo = reinterpret_cast<const UDataInfo*>(static_cast<const char*>(inData) + 4); if(!( pInfo->dataFormat[0]==0x54 && /* dataFormat="Norm" */ pInfo->dataFormat[1]==0x65 && @@ -888,8 +896,8 @@ test_swap(const UDataSwapper *ds, return 0; } - inBytes=(const uint8_t *)inData+headerSize; - outBytes=(uint8_t *)outData+headerSize; + inBytes = static_cast<const uint8_t*>(inData) + headerSize; + outBytes = static_cast<uint8_t*>(outData) + headerSize; int32_t size16 = 2; // 16bit plus padding int32_t sizeStr = 5; // 4 char inv-str plus null diff --git a/deps/icu-small/source/tools/toolutil/toolutil.cpp b/deps/icu-small/source/tools/toolutil/toolutil.cpp index 7e7bdc78a127fc..cc912722c3bd3e 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.cpp +++ b/deps/icu-small/source/tools/toolutil/toolutil.cpp @@ -66,9 +66,13 @@ #include "unicode/errorcode.h" #include "unicode/putil.h" +#include "unicode/uchar.h" +#include "unicode/umutablecptrie.h" +#include "unicode/ucptrie.h" #include "cmemory.h" #include "cstring.h" #include "toolutil.h" +#include "uassert.h" U_NAMESPACE_BEGIN @@ -82,6 +86,72 @@ void IcuToolErrorCode::handleFailure() const { exit(errorCode); } +namespace toolutil { + +void setCPTrieBit(UMutableCPTrie *mutableCPTrie, + UChar32 start, UChar32 end, int32_t shift, bool on, UErrorCode &errorCode) { + uint32_t mask = U_MASK(shift); + uint32_t value = on ? mask : 0; + setCPTrieBits(mutableCPTrie, start, end, mask, value, errorCode); +} + +void setCPTrieBits(UMutableCPTrie *mutableCPTrie, + UChar32 start, UChar32 end, uint32_t mask, uint32_t value, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } + // The value must not have any bits set outside of the mask. + if ((value & ~mask) != 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (start == end) { + uint32_t oldValue = umutablecptrie_get(mutableCPTrie, start); + uint32_t newValue = (oldValue & ~mask) | value; + if (newValue != oldValue) { + umutablecptrie_set(mutableCPTrie, start, newValue, &errorCode); + } + return; + } + while (start <= end && U_SUCCESS(errorCode)) { + uint32_t oldValue; + UChar32 rangeEnd = umutablecptrie_getRange( + mutableCPTrie, start, UCPMAP_RANGE_NORMAL, 0, nullptr, nullptr, &oldValue); + if (rangeEnd > end) { + rangeEnd = end; + } + uint32_t newValue = (oldValue & ~mask) | value; + if (newValue != oldValue) { + umutablecptrie_setRange(mutableCPTrie, start, rangeEnd, newValue, &errorCode); + } + start = rangeEnd + 1; + } +} + +int32_t getCPTrieSize(UMutableCPTrie *mt, UCPTrieType type, UCPTrieValueWidth valueWidth) { + UErrorCode errorCode = U_ZERO_ERROR; + UCPTrie *cpTrie = umutablecptrie_buildImmutable(mt, type, valueWidth, &errorCode); + if (U_FAILURE(errorCode)) { + fprintf(stderr, + "toolutil/getCPTrieSize error: umutablecptrie_buildImmutable() failed: %s\n", + u_errorName(errorCode)); + return -1; + } + uint8_t block[100000]; + int32_t size = ucptrie_toBinary(cpTrie, block, sizeof(block), &errorCode); + ucptrie_close(cpTrie); + if (U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { + fprintf(stderr, + "toolutil/getCPTrieSize error: ucptrie_toBinary() failed: %s (length %ld)\n", + u_errorName(errorCode), static_cast<long>(size)); + return -1; + } + U_ASSERT((size & 3) == 0); // multiple of 4 bytes + return size; +} + +} // toolutil + U_NAMESPACE_END static int32_t currentYear = -1; @@ -322,7 +392,7 @@ utm_hasCapacity(UToolMemory *mem, int32_t capacity) { if(mem->maxCapacity<capacity) { fprintf(stderr, "error: %s - trying to use more than maxCapacity=%ld units\n", - mem->name, (long)mem->maxCapacity); + mem->name, static_cast<long>(mem->maxCapacity)); exit(U_MEMORY_ALLOCATION_ERROR); } diff --git a/deps/icu-small/source/tools/toolutil/toolutil.h b/deps/icu-small/source/tools/toolutil/toolutil.h index b32a0b87628392..98988f144eb990 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.h +++ b/deps/icu-small/source/tools/toolutil/toolutil.h @@ -26,6 +26,7 @@ #ifdef __cplusplus #include "unicode/errorcode.h" +#include "unicode/umutablecptrie.h" U_NAMESPACE_BEGIN @@ -46,6 +47,30 @@ class U_TOOLUTIL_API IcuToolErrorCode : public ErrorCode { const char *location; }; +namespace toolutil { + +/** + * Sets one bit in the trie values of the start..end range, + * without changing the other bits in the trie values of that range. + */ +U_TOOLUTIL_API void +setCPTrieBit(UMutableCPTrie *mutableCPTrie, + UChar32 start, UChar32 end, int32_t shift, bool on, UErrorCode &errorCode); + +/** + * Sets a bit set (defined by the mask) in the trie values of the start..end range, + * without changing the other bits in the trie values of that range. + * The given value must not have any bits set outside of the mask. + */ +U_TOOLUTIL_API void +setCPTrieBits(UMutableCPTrie *mutableCPTrie, + UChar32 start, UChar32 end, uint32_t mask, uint32_t value, UErrorCode &errorCode); + +U_TOOLUTIL_API int32_t +getCPTrieSize(UMutableCPTrie *mt, UCPTrieType type, UCPTrieValueWidth valueWidth); + +} // toolutil + U_NAMESPACE_END #endif @@ -99,7 +124,7 @@ findDirname(const char *path, char *buffer, int32_t bufLen, UErrorCode* status); * Return the current year in the Gregorian calendar. Used for copyright generation. */ U_CAPI int32_t U_EXPORT2 -getCurrentYear(); +getCurrentYear(void); /* * Creates a directory with pathname. diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp index 1eb54e260e6b3c..d9d2649750160b 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp +++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp @@ -174,7 +174,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ pTarget = buf->buffer; /* check if we arrived here without exhausting the buffer*/ if(buf->currentPos<buf->bufLimit){ - offset = (int32_t)(buf->bufLimit-buf->currentPos); + offset = static_cast<int32_t>(buf->bufLimit - buf->currentPos); memmove(buf->buffer,buf->currentPos,offset* sizeof(char16_t)); } @@ -189,7 +189,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ }else{ cbufSize = T_FileStream_size(buf->in); - cbuf = (char*)uprv_malloc(cbufSize); + cbuf = static_cast<char*>(uprv_malloc(cbufSize)); if (cbuf == nullptr) { *error = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -221,7 +221,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ sourceLimit = source + inputRead; ucnv_toUnicode(buf->conv,&target,target+(buf->bufCapacity-offset), &source,sourceLimit,nullptr, - (UBool)(buf->remaining==0),error); + static_cast<UBool>(buf->remaining == 0), error); if(U_FAILURE(*error)){ char context[CONTEXT_LEN+1]; @@ -245,7 +245,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ ucnv_getInvalidChars(buf->conv,context,&len,&error1); context[len]= 0 ; /* null terminate the buffer */ - pos = (int32_t)(source - cbuf - len); + pos = static_cast<int32_t>(source - cbuf - len); /* for pre-context */ start = (pos <=CONTEXT_LEN)? 0 : (pos - (CONTEXT_LEN-1)); @@ -257,7 +257,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ /* for post-context */ start = pos+len; - stop = (int32_t)(((pos+CONTEXT_LEN)<= (sourceLimit-cbuf) )? (pos+(CONTEXT_LEN-1)) : (sourceLimit-cbuf)); + stop = static_cast<int32_t>(pos + CONTEXT_LEN <= sourceLimit - cbuf ? pos + (CONTEXT_LEN - 1) : sourceLimit - cbuf); memcpy(postContext,source,stop-start); /* null terminate the buffer */ @@ -290,10 +290,10 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ /* re convert */ ucnv_toUnicode(buf->conv,&target,target+(buf->bufCapacity-offset), &source,sourceLimit,nullptr, - (UBool)(buf->remaining==0),&error1); + static_cast<UBool>(buf->remaining == 0), &error1); } - outputWritten = (int32_t)(target - pTarget); + outputWritten = static_cast<int32_t>(target - pTarget); #ifdef UCBUF_DEBUG { @@ -342,7 +342,7 @@ ucbuf_getc(UCHARBUF* buf,UErrorCode* error){ /* get a UChar32 from the stream*/ U_CAPI int32_t U_EXPORT2 ucbuf_getc32(UCHARBUF* buf,UErrorCode* error){ - int32_t retVal = (int32_t)U_EOF; + int32_t retVal = U_EOF; if(error==nullptr || U_FAILURE(*error)){ return false; } @@ -367,7 +367,7 @@ ucbuf_getc32(UCHARBUF* buf,UErrorCode* error){ /* u_unescapeAt() callback to return a char16_t*/ static char16_t U_CALLCONV _charAt(int32_t offset, void *context) { - return ((UCHARBUF*) context)->currentPos[offset]; + return static_cast<UCHARBUF*>(context)->currentPos[offset]; } /* getc and escape it */ diff --git a/deps/icu-small/source/tools/toolutil/ucm.cpp b/deps/icu-small/source/tools/toolutil/ucm.cpp index 272570e72f4e64..824362a6939205 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.cpp +++ b/deps/icu-small/source/tools/toolutil/ucm.cpp @@ -46,7 +46,7 @@ printMapping(UCMapping *m, UChar32 *codePoints, uint8_t *bytes, FILE *f) { int32_t j; for(j=0; j<m->uLen; ++j) { - fprintf(f, "<U%04lX>", (long)codePoints[j]); + fprintf(f, "<U%04lX>", static_cast<long>(codePoints[j])); } fputc(' ', f); @@ -310,7 +310,7 @@ enum { static uint8_t checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UBool moveToExt, UBool intersectBase) { + UBool moveToExt, int8_t intersectBase) { (void)baseStates; UCMapping *mb, *me, *mbLimit, *meLimit; @@ -416,7 +416,7 @@ checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, static uint8_t checkBaseExtBytes(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UBool moveToExt, UBool intersectBase) { + UBool moveToExt, int8_t intersectBase) { UCMapping *mb, *me; int32_t *baseMap, *extMap; int32_t b, e, bLimit, eLimit, cmp; @@ -432,7 +432,7 @@ checkBaseExtBytes(UCMStates *baseStates, UCMTable *base, UCMTable *ext, result=0; - isSISO=(UBool)(baseStates->outputType==MBCS_OUTPUT_2_SISO); + isSISO = static_cast<UBool>(baseStates->outputType == MBCS_OUTPUT_2_SISO); for(;;) { /* skip irrelevant mappings on both sides */ @@ -556,7 +556,7 @@ ucm_checkValidity(UCMTable *table, UCMStates *baseStates) { U_CAPI UBool U_EXPORT2 ucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext, UCMTable *moveTarget, - UBool intersectBase) { + int8_t intersectBase) { uint8_t result; /* if we have an extension table, we must always use precision flags */ @@ -575,8 +575,8 @@ ucm_checkBaseExt(UCMStates *baseStates, /* check */ result= - checkBaseExtUnicode(baseStates, base, ext, (UBool)(moveTarget!=nullptr), intersectBase)| - checkBaseExtBytes(baseStates, base, ext, (UBool)(moveTarget!=nullptr), intersectBase); + checkBaseExtUnicode(baseStates, base, ext, moveTarget != nullptr, intersectBase) | + checkBaseExtBytes(baseStates, base, ext, moveTarget != nullptr, intersectBase); if(result&HAS_ERRORS) { return false; @@ -735,7 +735,7 @@ ucm_separateMappings(UCMFile *ucm, UBool isSISO) { } if(needsMove) { ucm_moveMappings(ucm->base, ucm->ext); - return ucm_checkBaseExt(&ucm->states, ucm->base, ucm->ext, ucm->ext, false); + return ucm_checkBaseExt(&ucm->states, ucm->base, ucm->ext, ucm->ext, 0); } else { ucm_sortTable(ucm->base); return true; diff --git a/deps/icu-small/source/tools/toolutil/ucm.h b/deps/icu-small/source/tools/toolutil/ucm.h index 8ea90604d475ed..8f78b52e9687cd 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.h +++ b/deps/icu-small/source/tools/toolutil/ucm.h @@ -227,7 +227,7 @@ ucm_checkValidity(UCMTable *ext, UCMStates *baseStates); */ U_CAPI UBool U_EXPORT2 ucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext, - UCMTable *moveTarget, UBool intersectBase); + UCMTable *moveTarget, int8_t intersectBase); U_CAPI void U_EXPORT2 ucm_printTable(UCMTable *table, FILE *f, UBool byUnicode); diff --git a/deps/icu-small/source/tools/toolutil/ucmstate.cpp b/deps/icu-small/source/tools/toolutil/ucmstate.cpp index 08782f68d110bc..1be23b2bbafc5a 100644 --- a/deps/icu-small/source/tools/toolutil/ucmstate.cpp +++ b/deps/icu-small/source/tools/toolutil/ucmstate.cpp @@ -695,7 +695,7 @@ compactToUnicode2(UCMStates *states, return; } if(verbose) { - printf("compacting toUnicode data saves %ld bytes\n", (long)savings); + printf("compacting toUnicode data saves %ld bytes\n", static_cast<long>(savings)); } if(states->countStates>=MBCS_MAX_STATE_COUNT) { fprintf(stderr, "cannot compact toUnicode because the maximum number of states is reached\n"); @@ -703,7 +703,7 @@ compactToUnicode2(UCMStates *states, } /* make a copy of the state table */ - oldStateTable=(int32_t (*)[256])uprv_malloc(states->countStates*1024); + oldStateTable = static_cast<int32_t(*)[256]>(uprv_malloc(states->countStates * 1024)); if(oldStateTable==nullptr) { fprintf(stderr, "cannot compact toUnicode: out of memory\n"); return; @@ -754,10 +754,10 @@ compactToUnicode2(UCMStates *states, uprv_free(oldStateTable); return; } - *pUnicodeCodeUnits=(uint16_t *)uprv_malloc(sum*sizeof(uint16_t)); + *pUnicodeCodeUnits = static_cast<uint16_t*>(uprv_malloc(sum * sizeof(uint16_t))); if(*pUnicodeCodeUnits==nullptr) { fprintf(stderr, "cannot compact toUnicode: out of memory allocating %ld 16-bit code units\n", - (long)sum); + static_cast<long>(sum)); /* revert to the old state table */ *pUnicodeCodeUnits=oldUnicodeCodeUnits; --states->countStates; @@ -785,7 +785,7 @@ compactToUnicode2(UCMStates *states, for(i=0; i<256; ++i) { entry=states->stateTable[leadState][i]; if(MBCS_ENTRY_IS_TRANSITION(entry)) { - trailState=(uint8_t)MBCS_ENTRY_TRANSITION_STATE(entry); + trailState = static_cast<uint8_t>(MBCS_ENTRY_TRANSITION_STATE(entry)); /* the new state does not have assigned states */ if(trailState!=newState) { trailOffset=MBCS_ENTRY_TRANSITION_OFFSET(entry); @@ -857,12 +857,12 @@ findUnassigned(UCMStates *states, toUFallbacks, countToUFallbacks, MBCS_ENTRY_TRANSITION_STATE(entry), offset+MBCS_ENTRY_TRANSITION_OFFSET(entry), - (b<<8)|(uint32_t)i); + (b << 8) | static_cast<uint32_t>(i)); if(savings<0) { haveAssigned=true; } else if(savings>0) { printf(" all-unassigned sequences from prefix 0x%02lx state %ld use %ld bytes\n", - (unsigned long)((b<<8)|i), (long)state, (long)savings); + static_cast<unsigned long>((b << 8) | i), static_cast<long>(state), static_cast<long>(savings)); belowSavings+=savings; } } else if(!haveAssigned) { @@ -911,7 +911,7 @@ compactToUnicodeHelper(UCMStates *states, state, 0, 0); if(savings>0) { printf(" all-unassigned sequences from initial state %ld use %ld bytes\n", - (long)state, (long)savings); + static_cast<long>(state), static_cast<long>(savings)); } } } diff --git a/deps/icu-small/source/tools/toolutil/udbgutil.cpp b/deps/icu-small/source/tools/toolutil/udbgutil.cpp index 3f4bf3718ef573..72508bf7297b82 100644 --- a/deps/icu-small/source/tools/toolutil/udbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/udbgutil.cpp @@ -16,6 +16,8 @@ #include "unicode/ucnv.h" #include "unicode/unistr.h" #include "cstr.h" +#include "mutex.h" +#include "umutex.h" /* To add a new enum type @@ -107,9 +109,7 @@ static const Field names_UCalendarDateFields[] = FIELD_NAME_STR( LEN_UCAL, UCAL_JULIAN_DAY ), FIELD_NAME_STR( LEN_UCAL, UCAL_MILLISECONDS_IN_DAY ), FIELD_NAME_STR( LEN_UCAL, UCAL_IS_LEAP_MONTH ), -#ifndef U_HIDE_DRAFT_API FIELD_NAME_STR( LEN_UCAL, UCAL_ORDINAL_MONTH ), -#endif // U_HIDE_DRAFT_API }; @@ -564,7 +564,7 @@ static const USystemParams systemParams[] = { #define U_SYSPARAM_COUNT UPRV_LENGTHOF(systemParams) U_CAPI const char *udbg_getSystemParameterNameByIndex(int32_t i) { - if(i>=0 && i < (int32_t)U_SYSPARAM_COUNT) { + if (i >= 0 && i < U_SYSPARAM_COUNT) { return systemParams[i].paramName; } else { return nullptr; @@ -573,7 +573,7 @@ U_CAPI const char *udbg_getSystemParameterNameByIndex(int32_t i) { U_CAPI int32_t udbg_getSystemParameterValueByIndex(int32_t i, char *buffer, int32_t bufferCapacity, UErrorCode *status) { - if(i>=0 && i< (int32_t)U_SYSPARAM_COUNT) { + if (i >= 0 && i < U_SYSPARAM_COUNT) { return systemParams[i].paramFunction(&(systemParams[i]),buffer,bufferCapacity,status); } else { return 0; @@ -610,6 +610,8 @@ U_CAPI void udbg_writeIcuInfo(FILE *out) { #include <ostream> #include <iostream> +static icu::UMutex gKnownIssuesLock; + class KnownIssues { public: KnownIssues(); @@ -652,6 +654,7 @@ static std::string mapTicketId(const char *ticketStr) { void KnownIssues::add(const char *ticketStr, const char *where, const char16_t *msg, UBool *firstForTicket, UBool *firstForWhere) { const std::string ticket = mapTicketId(ticketStr); + icu::Mutex mutex(&gKnownIssuesLock); if(fTable.find(ticket) == fTable.end()) { if(firstForTicket!=nullptr) *firstForTicket = true; fTable[ticket] = std::map < std::string, std::set < std::string > >(); @@ -676,6 +679,7 @@ void KnownIssues::add(const char *ticketStr, const char *where, const char16_t * void KnownIssues::add(const char *ticketStr, const char *where, const char *msg, UBool *firstForTicket, UBool *firstForWhere) { const std::string ticket = mapTicketId(ticketStr); + icu::Mutex mutex(&gKnownIssuesLock); if(fTable.find(ticket) == fTable.end()) { if(firstForTicket!=nullptr) *firstForTicket = true; fTable[ticket] = std::map < std::string, std::set < std::string > >(); @@ -698,6 +702,7 @@ void KnownIssues::add(const char *ticketStr, const char *where, const char *msg, UBool KnownIssues::print() { + icu::Mutex mutex(&gKnownIssuesLock); if(fTable.empty()) { return false; } diff --git a/deps/icu-small/source/tools/toolutil/ujson.h b/deps/icu-small/source/tools/toolutil/ujson.h new file mode 100644 index 00000000000000..c6dcf454bd7d12 --- /dev/null +++ b/deps/icu-small/source/tools/toolutil/ujson.h @@ -0,0 +1,38 @@ +// © 2024 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +#ifndef __UJSON_H__ +#define __UJSON_H__ + +/* + Without this code, the output if the JSON library code + throws an exception would look like: + terminate called after throwing an instance of 'nlohmann::json_abi_v3_11_3::detail::parse_error' + what(): [json.exception.parse_error.101] parse error at line 1, column 1: attempting to parse an empty input; check that your input string or stream contains the expected JSON +Aborted (core dumped) + + (for example, if one of the JSON tests files contains an error or a file doesn't exist.) + + With this code, the output is: + + JSON exception thrown; modify tools/ctestfw//ujson.h to get diagnostics. + Exiting immediately. + + The entire #if block can be commented out in order to temporarily enable exceptions + and get a better parse error message (temporarily, while debugging). + */ + +// Disable exceptions in JSON parser + +#if _HAS_EXCEPTIONS == 0 +#define JSON_TRY_USER if(true) +#define JSON_CATCH_USER(exception) if(false) +#define JSON_THROW_USER(exception) { \ + printf("JSON exception thrown; modify tools/toolutil/ujson.h to get diagnostics.\n\ +Exiting immediately.\n"); \ + exit(1); \ +} +#endif + +#include "json-json.hpp" + +#endif /* __UJSON_H__ */ diff --git a/deps/icu-small/source/tools/toolutil/writesrc.cpp b/deps/icu-small/source/tools/toolutil/writesrc.cpp index 55c2f277b33ca6..5d0ac40bd542e6 100644 --- a/deps/icu-small/source/tools/toolutil/writesrc.cpp +++ b/deps/icu-small/source/tools/toolutil/writesrc.cpp @@ -136,7 +136,7 @@ usrc_writeFileNameGeneratedBy( time(&t); lt=localtime(&t); - if(generator==nullptr) { + if(generator==nullptr && lt!=nullptr) { strftime(buffer, sizeof(buffer), "%Y-%m-%d", lt); fprintf(f, pattern, prefix, prefix, filename, prefix, prefix, buffer); } else { @@ -162,6 +162,7 @@ usrc_writeArray(FILE *f, p32=nullptr; p64=nullptr; switch(width) { + case 1: case 8: p8=(const uint8_t *)p; break; @@ -192,6 +193,7 @@ usrc_writeArray(FILE *f, } } switch(width) { + case 1: case 8: value=p8[i]; break; @@ -208,7 +210,11 @@ usrc_writeArray(FILE *f, value=0; /* unreachable */ break; } - fprintf(f, value<=9 ? "%" PRId64 : "0x%" PRIx64, value); + if (width == 1) { + fprintf(f, value ? "true" : "false"); + } else { + fprintf(f, value<=9 ? "%" PRId64 : "0x%" PRIx64, value); + } } if(postfix!=nullptr) { fputs(postfix, f); diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.cpp b/deps/icu-small/source/tools/toolutil/xmlparser.cpp index edb85bdab0e937..c834b30cf8b645 100644 --- a/deps/icu-small/source/tools/toolutil/xmlparser.cpp +++ b/deps/icu-small/source/tools/toolutil/xmlparser.cpp @@ -146,7 +146,7 @@ UXMLParser::UXMLParser(UErrorCode &status) : fNames(status), fElementStack(status), - fOneLF((char16_t)0x0a) // Plain new-line string, used in new line normalization. + fOneLF(static_cast<char16_t>(0x0a)) // Plain new-line string, used in new line normalization. { } @@ -182,8 +182,8 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { return nullptr; } - bytesLength=T_FileStream_read(f, bytes, (int32_t)sizeof(bytes)); - if(bytesLength<(int32_t)sizeof(bytes)) { + bytesLength = T_FileStream_read(f, bytes, static_cast<int32_t>(sizeof(bytes))); + if (bytesLength < static_cast<int32_t>(sizeof(bytes))) { // we have already read the entire file fileLength=bytesLength; } else { @@ -222,7 +222,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { &pu, buffer+src.getCapacity(), &pb, bytes+bytesLength, nullptr, true, &errorCode); - src.releaseBuffer(U_SUCCESS(errorCode) ? (int32_t)(pu-buffer) : 0); + src.releaseBuffer(U_SUCCESS(errorCode) ? static_cast<int32_t>(pu - buffer) : 0); ucnv_close(cnv); cnv=nullptr; if(U_FAILURE(errorCode)) { @@ -235,7 +235,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { if(mXMLDecl.reset(src).lookingAt(0, errorCode)) { int32_t declEnd=mXMLDecl.end(errorCode); // go beyond <?xml - int32_t pos=src.indexOf((char16_t)x_l)+1; + int32_t pos = src.indexOf(static_cast<char16_t>(x_l)) + 1; mAttrValue.reset(src); while(pos<declEnd && mAttrValue.lookingAt(pos, errorCode)) { // loop runs once per attribute on this element. @@ -248,7 +248,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { attValue.truncate(attValue.length()-1); // and one from the end. if(attName==UNICODE_STRING("encoding", 8)) { - length=attValue.extract(0, 0x7fffffff, charsetBuffer, (int32_t)sizeof(charsetBuffer)); + length = attValue.extract(0, 0x7fffffff, charsetBuffer, static_cast<int32_t>(sizeof(charsetBuffer))); charset=charsetBuffer; break; } @@ -290,7 +290,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { cnv, &pu, buffer+src.getCapacity(), &pb, bytes+bytesLength, nullptr, false, &errorCode); - src.releaseBuffer(U_SUCCESS(errorCode) ? (int32_t)(pu-buffer) : 0); + src.releaseBuffer(U_SUCCESS(errorCode) ? static_cast<int32_t>(pu - buffer) : 0); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { errorCode=U_ZERO_ERROR; capacity=(3*src.getCapacity())/2; // increase capacity by 50% @@ -308,7 +308,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { } // read next block - bytesLength=T_FileStream_read(f, bytes, (int32_t)sizeof(bytes)); + bytesLength = T_FileStream_read(f, bytes, static_cast<int32_t>(sizeof(bytes))); if(bytesLength==0) { // reached end of file, convert once more to flush the converter flush=true; @@ -438,7 +438,7 @@ UXMLParser::parse(const UnicodeString &src, UErrorCode &status) { el = nullptr; break; } - el = (UXMLElement *)fElementStack.pop(); + el = static_cast<UXMLElement*>(fElementStack.pop()); continue; } @@ -514,7 +514,7 @@ UXMLParser::createElement(RegexMatcher &mEl, UErrorCode &status) { // Next change all xml white space chars to plain \u0020 spaces. mAttrNormalizer.reset(attValue); - UnicodeString oneSpace((char16_t)0x0020); + UnicodeString oneSpace(static_cast<char16_t>(0x0020)); attValue = mAttrNormalizer.replaceAll(oneSpace, status); // Replace character entities. @@ -565,7 +565,7 @@ UnicodeString UXMLParser::scanContent(UErrorCode &status) { UnicodeString result; if (mXMLCharData.lookingAt(fPos, status)) { - result = mXMLCharData.group((int32_t)0, status); + result = mXMLCharData.group(static_cast<int32_t>(0), status); // Normalize the new-lines. (Before char ref substitution) mNewLineNormalizer.reset(result); result = mNewLineNormalizer.replaceAll(fOneLF, status); @@ -595,15 +595,15 @@ UXMLParser::replaceCharRefs(UnicodeString &s, UErrorCode &status) { // which is flagged by start() of that group not being -1. while (mAmps.find()) { if (mAmps.start(1, status) != -1) { - replacement.setTo((char16_t)x_AMP); + replacement.setTo(static_cast<char16_t>(x_AMP)); } else if (mAmps.start(2, status) != -1) { - replacement.setTo((char16_t)x_LT); + replacement.setTo(static_cast<char16_t>(x_LT)); } else if (mAmps.start(3, status) != -1) { - replacement.setTo((char16_t)x_GT); + replacement.setTo(static_cast<char16_t>(x_GT)); } else if (mAmps.start(4, status) != -1) { - replacement.setTo((char16_t)x_APOS); + replacement.setTo(static_cast<char16_t>(x_APOS)); } else if (mAmps.start(5, status) != -1) { - replacement.setTo((char16_t)x_QUOT); + replacement.setTo(static_cast<char16_t>(x_QUOT)); } else if (mAmps.start(6, status) != -1) { UnicodeString hexString = mAmps.group(6, status); UChar32 val = 0; @@ -624,7 +624,7 @@ UXMLParser::replaceCharRefs(UnicodeString &s, UErrorCode &status) { // An unrecognized &entity; Leave it alone. // TODO: check that it really looks like an entity, and is not some // random & in the text. - replacement = mAmps.group((int32_t)0, status); + replacement = mAmps.group(static_cast<int32_t>(0), status); } mAmps.appendReplacement(result, replacement, status); } @@ -639,7 +639,7 @@ UXMLParser::error(const char *message, UErrorCode &status) { int line = 0; int ci = 0; while (ci < fPos && ci>=0) { - ci = src.indexOf((char16_t)0x0a, ci+1); + ci = src.indexOf(static_cast<char16_t>(0x0a), ci + 1); line++; } fprintf(stderr, "Error: %s at line %d\n", message, line); @@ -655,12 +655,12 @@ UXMLParser::intern(const UnicodeString &s, UErrorCode &errorCode) { const UHashElement *he=fNames.find(s); if(he!=nullptr) { // already a known name, return its hashed key pointer - return (const UnicodeString *)he->key.pointer; + return static_cast<const UnicodeString*>(he->key.pointer); } else { // add this new name and return its hashed key pointer fNames.puti(s, 1, errorCode); he=fNames.find(s); - return (const UnicodeString *)he->key.pointer; + return static_cast<const UnicodeString*>(he->key.pointer); } } @@ -669,7 +669,7 @@ UXMLParser::findName(const UnicodeString &s) const { const UHashElement *he=fNames.find(s); if(he!=nullptr) { // a known name, return its hashed key pointer - return (const UnicodeString *)he->key.pointer; + return static_cast<const UnicodeString*>(he->key.pointer); } else { // unknown name return nullptr; @@ -692,10 +692,10 @@ UXMLElement::~UXMLElement() { int i; // attribute names are owned by the UXMLParser, don't delete them here for (i=fAttValues.size()-1; i>=0; i--) { - delete (UObject *)fAttValues.elementAt(i); + delete static_cast<UObject*>(fAttValues.elementAt(i)); } for (i=fChildren.size()-1; i>=0; i--) { - delete (UObject *)fChildren.elementAt(i); + delete static_cast<UObject*>(fChildren.elementAt(i)); } } @@ -716,7 +716,7 @@ UXMLElement::appendText(UnicodeString &text, UBool recurse) const { const UObject *node; int32_t i, count=fChildren.size(); for(i=0; i<count; ++i) { - node=(const UObject *)fChildren.elementAt(i); + node = static_cast<const UObject*>(fChildren.elementAt(i)); const UnicodeString *s=dynamic_cast<const UnicodeString *>(node); if(s!=nullptr) { text.append(*s); @@ -734,8 +734,8 @@ UXMLElement::countAttributes() const { const UnicodeString * UXMLElement::getAttribute(int32_t i, UnicodeString &name, UnicodeString &value) const { if(0<=i && i<fAttNames.size()) { - name.setTo(*(const UnicodeString *)fAttNames.elementAt(i)); - value.setTo(*(const UnicodeString *)fAttValues.elementAt(i)); + name.setTo(*static_cast<const UnicodeString*>(fAttNames.elementAt(i))); + value.setTo(*static_cast<const UnicodeString*>(fAttValues.elementAt(i))); return &value; // or return (UnicodeString *)fAttValues.elementAt(i); } else { return nullptr; @@ -753,8 +753,8 @@ UXMLElement::getAttribute(const UnicodeString &name) const { int32_t i, count=fAttNames.size(); for(i=0; i<count; ++i) { - if(p==(const UnicodeString *)fAttNames.elementAt(i)) { - return (const UnicodeString *)fAttValues.elementAt(i); + if (p == static_cast<const UnicodeString*>(fAttNames.elementAt(i))) { + return static_cast<const UnicodeString*>(fAttValues.elementAt(i)); } } return nullptr; @@ -768,7 +768,7 @@ UXMLElement::countChildren() const { const UObject * UXMLElement::getChild(int32_t i, UXMLNodeType &type) const { if(0<=i && i<fChildren.size()) { - const UObject *node=(const UObject *)fChildren.elementAt(i); + const UObject* node = static_cast<const UObject*>(fChildren.elementAt(i)); if(dynamic_cast<const UXMLElement *>(node)!=nullptr) { type=UXML_NODE_TYPE_ELEMENT; } else { @@ -789,7 +789,7 @@ UXMLElement::nextChildElement(int32_t &i) const { const UObject *node; int32_t count=fChildren.size(); while(i<count) { - node=(const UObject *)fChildren.elementAt(i++); + node = static_cast<const UObject*>(fChildren.elementAt(i++)); const UXMLElement *elem=dynamic_cast<const UXMLElement *>(node); if(elem!=nullptr) { return elem; @@ -810,7 +810,7 @@ UXMLElement::getChildElement(const UnicodeString &name) const { const UObject *node; int32_t i, count=fChildren.size(); for(i=0; i<count; ++i) { - node=(const UObject *)fChildren.elementAt(i); + node = static_cast<const UObject*>(fChildren.elementAt(i)); const UXMLElement *elem=dynamic_cast<const UXMLElement *>(node); if(elem!=nullptr) { if(p==elem->fName) { diff --git a/deps/inspector_protocol/BUILD.gn b/deps/inspector_protocol/BUILD.gn new file mode 100644 index 00000000000000..ee03d87826b952 --- /dev/null +++ b/deps/inspector_protocol/BUILD.gn @@ -0,0 +1,95 @@ +# Copyright 2018 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This BUILD.gn file is specific to the standalone project. Do not +# copy this downstream. + +import("//testing/test.gni") + +static_library("crdtp") { + sources = [ + "crdtp/cbor.cc", + "crdtp/cbor.h", + "crdtp/dispatch.cc", + "crdtp/dispatch.h", + "crdtp/error_support.cc", + "crdtp/error_support.h", + "crdtp/export.h", + "crdtp/find_by_first.h", + "crdtp/frontend_channel.h", + "crdtp/glue.h", + "crdtp/json.cc", + "crdtp/json.h", + "crdtp/parser_handler.h", + "crdtp/protocol_core.cc", + "crdtp/protocol_core.h", + "crdtp/serializable.cc", + "crdtp/serializable.h", + "crdtp/span.cc", + "crdtp/span.h", + "crdtp/status.cc", + "crdtp/status.h", + ] + deps = [ ":crdtp_platform" ] +} + +# A small adapter library which only :crdtp may depend on. +static_library("crdtp_platform") { + sources = [ + "crdtp/json_platform.cc", + "crdtp/json_platform.h", + ] +} + +# In this (upstream) standalone package, we declare crdtp_test, and a +# few minimal files in testing (accessed via test_platform.{h,cc}) to +# make it look like Chromium's testing package. In Chromium, +# we run these tests as part of the content_unittests, declared in +# content/test/BUILD.gn, and in V8, we run them via unittests, declared +# in test/unittests/BUILD.gn. + +test("crdtp_test") { + sources = [ + "crdtp/cbor_test.cc", + "crdtp/dispatch_test.cc", + "crdtp/error_support_test.cc", + "crdtp/find_by_first_test.cc", + "crdtp/json_test.cc", + "crdtp/protocol_core_test.cc", + "crdtp/serializable_test.cc", + "crdtp/span_test.cc", + "crdtp/status_test.cc", + "crdtp/status_test_support.cc", + "crdtp/status_test_support.h", + "crdtp/test_string_traits.cc", + "crdtp/test_string_traits.h", + ] + include_dirs = [ "." ] + deps = [ + ":crdtp", + ":crdtp_test_platform", + ] +} + +# A small adapter library which only :crdtp_test may depend on. +static_library("crdtp_test_platform") { + sources = [ + "crdtp/test_platform.cc", + "crdtp/test_platform.h", + ] + testonly = true + include_dirs = [ "." ] + public_deps = [ + "//base", + "//testing/gmock", + "//testing/gtest", + "//testing/gtest:gtest_main", + ] +} + +# A command line utility for converting between JSON and CBOR. +executable("transcode") { + sources = [ "crdtp/transcode.cc" ] + deps = [ ":crdtp" ] +} diff --git a/deps/inspector_protocol/LICENSE b/deps/inspector_protocol/LICENSE new file mode 100644 index 00000000000000..4d9a34a914c948 --- /dev/null +++ b/deps/inspector_protocol/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2016 The Chromium Authors. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/inspector_protocol/README.md b/deps/inspector_protocol/README.md new file mode 100644 index 00000000000000..d15f719fdda32c --- /dev/null +++ b/deps/inspector_protocol/README.md @@ -0,0 +1,18 @@ +# Chromium inspector (devtools) protocol + +This package contains code generators and templates for the Chromium +inspector protocol. + +The canonical location of this package is at +https://chromium.googlesource.com/deps/inspector_protocol/ + +In the Chromium tree, it's rolled into +https://cs.chromium.org/chromium/src/third_party/inspector_protocol/ + +In the V8 tree, it's rolled into +https://cs.chromium.org/chromium/src/v8/third_party/inspector_protocol/ + +See also [Contributing to Chrome Devtools Protocol](https://docs.google.com/document/d/1c-COD2kaK__5iMM5SEx-PzNA7HFmgttcYfOHHX0HaOM/edit). + +To build and run the tests of the crdtp library, see +[CRDTP - Chrome DevTools Protocol](crdtp/README.md). diff --git a/tools/inspector_protocol/README.node b/deps/inspector_protocol/README.node similarity index 88% rename from tools/inspector_protocol/README.node rename to deps/inspector_protocol/README.node index a8380198576d46..af4618cd6160e5 100644 --- a/tools/inspector_protocol/README.node +++ b/deps/inspector_protocol/README.node @@ -2,7 +2,7 @@ Name: inspector protocol Short Name: inspector_protocol URL: https://chromium.googlesource.com/deps/inspector_protocol/ Version: 0 -Revision: 0aafd2876f7485db7b07c513c0457b7cbbbe3304 +Revision: 69d69ddf3aa698b171886551a4a672c5af1ad902 License: BSD License File: LICENSE Security Critical: no diff --git a/tools/inspector_protocol/check_protocol_compatibility.py b/deps/inspector_protocol/check_protocol_compatibility.py similarity index 92% rename from tools/inspector_protocol/check_protocol_compatibility.py rename to deps/inspector_protocol/check_protocol_compatibility.py index d2df244fa97154..ca72da24e99828 100755 --- a/tools/inspector_protocol/check_protocol_compatibility.py +++ b/deps/inspector_protocol/check_protocol_compatibility.py @@ -1,31 +1,7 @@ -#!/usr/bin/env python -# Copyright (c) 2011 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#!/usr/bin/env python3 +# Copyright 2011 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. # # Inspector protocol validator. # diff --git a/deps/inspector_protocol/code_generator.py b/deps/inspector_protocol/code_generator.py new file mode 100755 index 00000000000000..ce989e4869002e --- /dev/null +++ b/deps/inspector_protocol/code_generator.py @@ -0,0 +1,739 @@ +#!/usr/bin/env python3 +# Copyright 2016 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import os.path +import sys +import argparse +import collections +import functools +import re +import copy +try: + import json +except ImportError: + import simplejson as json + +import pdl + +try: + unicode +except NameError: + # Define unicode for Py3 + def unicode(s, *_): + return s + +# Path handling for libraries and templates +# Paths have to be normalized because Jinja uses the exact template path to +# determine the hash used in the cache filename, and we need a pre-caching step +# to be concurrency-safe. Use absolute path because __file__ is absolute if +# module is imported, and relative if executed directly. +# If paths differ between pre-caching and individual file compilation, the cache +# is regenerated, which causes a race condition and breaks concurrent build, +# since some compile processes will try to read the partially written cache. +module_path, module_filename = os.path.split(os.path.realpath(__file__)) + +def read_config(): + # pylint: disable=W0703 + def json_to_object(data, output_base, config_base): + def json_object_hook(object_dict): + items = [(k, os.path.join(config_base, v) if k == "path" else v) + for (k, v) in object_dict.items()] + items = [(k, os.path.join(output_base, v) if k == "output" else v) + for (k, v) in items] + keys, values = list(zip(*items)) + # 'async' is a keyword since Python 3.7. + # Avoid namedtuple(rename=True) for compatibility with Python 2.X. + keys = tuple('async_' if k == 'async' else k for k in keys) + return collections.namedtuple('X', keys)(*values) + return json.loads(data, object_hook=json_object_hook) + + def init_defaults(config_tuple, path, defaults): + keys = list(config_tuple._fields) # pylint: disable=E1101 + values = [getattr(config_tuple, k) for k in keys] + for i in range(len(keys)): + if hasattr(values[i], "_fields"): + values[i] = init_defaults(values[i], path + "." + keys[i], defaults) + for optional in defaults: + if optional.find(path + ".") != 0: + continue + optional_key = optional[len(path) + 1:] + if optional_key.find(".") == -1 and optional_key not in keys: + keys.append(optional_key) + values.append(defaults[optional]) + return collections.namedtuple('X', keys)(*values) + + try: + cmdline_parser = argparse.ArgumentParser() + cmdline_parser.add_argument("--output_base", type=unicode, required=True) + cmdline_parser.add_argument("--jinja_dir", type=unicode, required=True) + cmdline_parser.add_argument("--config", type=unicode, required=True) + cmdline_parser.add_argument("--config_value", default=[], action="append") + cmdline_parser.add_argument( + "--inspector_protocol_dir", type=unicode, required=True, + help=("directory with code_generator.py and C++ encoding / binding " + "libraries, relative to the root of the source tree.")) + arg_options = cmdline_parser.parse_args() + jinja_dir = arg_options.jinja_dir + output_base = arg_options.output_base + config_file = arg_options.config + config_base = os.path.dirname(config_file) + config_values = arg_options.config_value + inspector_protocol_dir = arg_options.inspector_protocol_dir.lstrip('/') + except Exception: + # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html + exc = sys.exc_info()[1] + sys.stderr.write("Failed to parse command-line arguments: %s\n\n" % exc) + exit(1) + + try: + config_json_file = open(config_file, "r") + config_json_string = config_json_file.read() + config_partial = json_to_object(config_json_string, output_base, + config_base) + config_json_file.close() + defaults = { + ".use_snake_file_names": False, + ".use_title_case_methods": False, + ".use_embedder_types": False, + ".imported": False, + ".imported.export_macro": "", + ".imported.export_header": False, + ".imported.header": False, + ".imported.package": False, + ".imported.options": False, + ".protocol.export_macro": "", + ".protocol.export_header": False, + ".protocol.options": False, + ".protocol.file_name_prefix": "", + ".exported": False, + ".exported.export_macro": "", + ".exported.export_header": False, + ".lib": False, + ".lib.export_macro": "", + ".lib.export_header": False, + ".crdtp": False, + ".crdtp.dir": os.path.join(inspector_protocol_dir, "crdtp"), + ".crdtp.namespace": "crdtp", + } + for key_value in config_values: + parts = key_value.split("=") + if len(parts) == 2: + defaults["." + parts[0]] = parts[1] + return (jinja_dir, config_file, init_defaults(config_partial, "", defaults)) + except Exception: + # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html + exc = sys.exc_info()[1] + sys.stderr.write("Failed to parse config file: %s\n\n" % exc) + exit(1) + + +# ---- Begin of utilities exposed to generator ---- + + +def to_title_case(name): + return name[:1].upper() + name[1:] + + +def dash_to_camelcase(word): + prefix = "" + if word[0] == "-": + prefix = "Negative" + word = word[1:] + return prefix + "".join(to_title_case(x) or "-" for x in word.split("-")) + + +def to_snake_case(name): + name = re.sub(r"([A-Z]{2,})([A-Z][a-z])", r"\1_\2", name) + return re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", name, count=sys.maxsize).lower() + + +def to_method_case(config, name): + if config.use_title_case_methods: + return to_title_case(name) + return name + + +def join_arrays(dict, keys): + result = [] + for key in keys: + if key in dict: + result += dict[key] + return result + + +def format_include(config, header, file_name=None): + if file_name is not None: + header = header + "/" + file_name + ".h" + header = "\"" + header + "\"" if header[0] not in "<\"" else header + if config.use_snake_file_names: + header = to_snake_case(header) + return header + + +def format_domain_include(config, header, file_name): + return format_include(config, header, + config.protocol.file_name_prefix + file_name) + + +def to_file_name(config, file_name): + if config.use_snake_file_names: + return to_snake_case(file_name).replace(".cpp", ".cc") + return file_name + + +# ---- End of utilities exposed to generator ---- + + +def initialize_jinja_env(jinja_dir, cache_dir, config): + # pylint: disable=F0401 + sys.path.insert(1, os.path.abspath(jinja_dir)) + import jinja2 + + jinja_env = jinja2.Environment( + loader=jinja2.FileSystemLoader(module_path), + # Bytecode cache is not concurrency-safe unless pre-cached: + # if pre-cached this is read-only, but writing creates a race condition. + bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir), + keep_trailing_newline=True, # newline-terminate generated files + lstrip_blocks=True, # so can indent control flow tags + trim_blocks=True) + jinja_env.filters.update({ + "to_title_case": to_title_case, + "dash_to_camelcase": dash_to_camelcase, + "to_method_case": functools.partial(to_method_case, config)}) + jinja_env.add_extension("jinja2.ext.loopcontrols") + return jinja_env + + +def create_imported_type_definition(domain_name, type, imported_namespace): + # pylint: disable=W0622 + return { + "return_type": "std::unique_ptr<%s::%s::API::%s>" % ( + imported_namespace, domain_name, type["id"]), + "pass_type": "std::unique_ptr<%s::%s::API::%s>" % ( + imported_namespace, domain_name, type["id"]), + "to_raw_type": "%s.get()", + "to_pass_type": "std::move(%s)", + "to_rvalue": "std::move(%s)", + "type": "std::unique_ptr<%s::%s::API::%s>" % ( + imported_namespace, domain_name, type["id"]), + "raw_type": "%s::%s::API::%s" % ( + imported_namespace, domain_name, type["id"]), + "raw_pass_type": "%s::%s::API::%s*" % ( + imported_namespace, domain_name, type["id"]), + "raw_return_type": "%s::%s::API::%s*" % ( + imported_namespace, domain_name, type["id"]), + } + + +def create_user_type_definition(domain_name, type): + # pylint: disable=W0622 + return { + "return_type": "std::unique_ptr<protocol::%s::%s>" % ( + domain_name, type["id"]), + "pass_type": "std::unique_ptr<protocol::%s::%s>" % ( + domain_name, type["id"]), + "to_raw_type": "%s.get()", + "to_pass_type": "std::move(%s)", + "to_rvalue": "std::move(%s)", + "type": "std::unique_ptr<protocol::%s::%s>" % (domain_name, type["id"]), + "raw_type": "protocol::%s::%s" % (domain_name, type["id"]), + "raw_pass_type": "protocol::%s::%s*" % (domain_name, type["id"]), + "raw_return_type": "protocol::%s::%s*" % (domain_name, type["id"]), + } + + +def create_object_type_definition(): + # pylint: disable=W0622 + return { + "return_type": "std::unique_ptr<protocol::DictionaryValue>", + "pass_type": "std::unique_ptr<protocol::DictionaryValue>", + "to_raw_type": "%s.get()", + "to_pass_type": "std::move(%s)", + "to_rvalue": "std::move(%s)", + "type": "std::unique_ptr<protocol::DictionaryValue>", + "raw_type": "protocol::DictionaryValue", + "raw_pass_type": "protocol::DictionaryValue*", + "raw_return_type": "protocol::DictionaryValue*", + } + + +def create_any_type_definition(): + # pylint: disable=W0622 + return { + "return_type": "std::unique_ptr<protocol::Value>", + "pass_type": "std::unique_ptr<protocol::Value>", + "to_raw_type": "%s.get()", + "to_pass_type": "std::move(%s)", + "to_rvalue": "std::move(%s)", + "type": "std::unique_ptr<protocol::Value>", + "raw_type": "protocol::Value", + "raw_pass_type": "protocol::Value*", + "raw_return_type": "protocol::Value*", + } + + +def create_string_type_definition(): + # pylint: disable=W0622 + return { + "return_type": "String", + "pass_type": "const String&", + "to_pass_type": "%s", + "to_raw_type": "%s", + "to_rvalue": "%s", + "type": "String", + "raw_type": "String", + "raw_pass_type": "const String&", + "raw_return_type": "String", + "is_primitive": True + } + + +def create_binary_type_definition(): + # pylint: disable=W0622 + return { + "return_type": "Binary", + "pass_type": "const Binary&", + "to_pass_type": "%s", + "to_raw_type": "%s", + "to_rvalue": "%s", + "type": "Binary", + "raw_type": "Binary", + "raw_pass_type": "const Binary&", + "raw_return_type": "Binary", + "is_primitive": True + } + + +def create_primitive_type_definition(type): + # pylint: disable=W0622 + typedefs = { + "number": "double", + "integer": "int", + "boolean": "bool" + } + defaults = { + "number": "0", + "integer": "0", + "boolean": "false" + } + jsontypes = { + "number": "TypeDouble", + "integer": "TypeInteger", + "boolean": "TypeBoolean", + } + return { + "return_type": typedefs[type], + "pass_type": typedefs[type], + "to_pass_type": "%s", + "to_raw_type": "%s", + "to_rvalue": "%s", + "type": typedefs[type], + "raw_type": typedefs[type], + "raw_pass_type": typedefs[type], + "raw_return_type": typedefs[type], + "default_value": defaults[type], + "is_primitive": True + } + +def wrap_array_definition(type): + # pylint: disable=W0622 + return { + "return_type": "std::unique_ptr<protocol::Array<%s>>" % type["raw_type"], + "pass_type": "std::unique_ptr<protocol::Array<%s>>" % type["raw_type"], + "to_raw_type": "%s.get()", + "to_pass_type": "std::move(%s)", + "to_rvalue": "std::move(%s)", + "type": "std::unique_ptr<protocol::Array<%s>>" % type["raw_type"], + "raw_type": "protocol::Array<%s>" % type["raw_type"], + "raw_pass_type": "protocol::Array<%s>*" % type["raw_type"], + "raw_return_type": "protocol::Array<%s>*" % type["raw_type"], + "out_type": "protocol::Array<%s>&" % type["raw_type"], + } + + +class Protocol(object): + + def __init__(self, config): + self.config = config + self.json_api = {"domains": []} + self.imported_domains = [] + self.exported_domains = [] + self.generate_domains = self.read_protocol_file(config.protocol.path) + + if config.protocol.options: + self.generate_domains = [rule.domain for rule in config.protocol.options] + self.exported_domains = [rule.domain for rule in config.protocol.options + if hasattr(rule, "exported")] + + if config.imported: + self.imported_domains = self.read_protocol_file(config.imported.path) + if config.imported.options: + self.imported_domains = [rule.domain + for rule in config.imported.options] + + self.patch_full_qualified_refs() + self.create_type_definitions() + self.generate_used_types() + + def read_protocol_file(self, file_name): + input_file = open(file_name, "r") + parsed_json = pdl.loads(input_file.read(), file_name) + input_file.close() + version = '%s.%s' % (parsed_json["version"]["major"], + parsed_json["version"]["minor"]) + domains = [] + for domain in parsed_json["domains"]: + domains.append(domain["domain"]) + domain["version"] = version + self.json_api["domains"] += parsed_json["domains"] + return domains + + def patch_full_qualified_refs(self): + def patch_full_qualified_refs_in_domain(json, domain_name): + if isinstance(json, list): + for item in json: + patch_full_qualified_refs_in_domain(item, domain_name) + if not isinstance(json, dict): + return + for key in json: + if key == "type" and json[key] == "string": + json[key] = domain_name + ".string" + if key != "$ref": + patch_full_qualified_refs_in_domain(json[key], domain_name) + continue + if json["$ref"].find(".") == -1: + json["$ref"] = domain_name + "." + json["$ref"] + return + + for domain in self.json_api["domains"]: + patch_full_qualified_refs_in_domain(domain, domain["domain"]) + + def all_references(self, json): + refs = set() + if isinstance(json, list): + for item in json: + refs |= self.all_references(item) + if not isinstance(json, dict): + return refs + for key in json: + if key != "$ref": + refs |= self.all_references(json[key]) + else: + refs.add(json["$ref"]) + return refs + + def check_if_dependency_declared(self, domain, refs): + dependencies = domain.get('dependencies', set()) + for ref in refs: + type_definition = self.type_definitions[ref] + if type_definition.get('is_primitive', False): + continue + domain_match = re.match(r'^(.*)[.]', ref) + if domain_match: + referenced_domain_name = domain_match.group(1) + if referenced_domain_name != domain['domain'] and not referenced_domain_name in dependencies: + sys.stderr.write(("Domains [%s] uses type [%s] from domain [%s], but did not declare the dependency\n\n" + ) % (domain["domain"], ref, referenced_domain_name)) + exit(1) + + def generate_used_types(self): + all_refs = set() + for domain in self.json_api["domains"]: + domain_name = domain["domain"] + if "commands" in domain: + for command in domain["commands"]: + if self.generate_command(domain_name, command["name"]): + all_refs_command = self.all_references(command) + # If the command has a redirect, it is as if it didn't exist on this domain. + if not command.get('redirect', False): + self.check_if_dependency_declared(domain, all_refs_command) + all_refs |= all_refs_command + + if "events" in domain: + for event in domain["events"]: + if self.generate_event(domain_name, event["name"]): + all_refs_event = self.all_references(event) + self.check_if_dependency_declared(domain, all_refs_event) + all_refs |= all_refs_event + + + dependencies = self.generate_type_dependencies() + queue = set(all_refs) + while len(queue): + ref = queue.pop() + if ref in dependencies: + queue |= dependencies[ref] - all_refs + all_refs |= dependencies[ref] + self.used_types = all_refs + + def generate_type_dependencies(self): + dependencies = dict() + domains_with_types = (x for x in self.json_api["domains"] if "types" in x) + for domain in domains_with_types: + domain_name = domain["domain"] + for type in domain["types"]: + related_types = self.all_references(type) + if len(related_types): + dependencies[domain_name + "." + type["id"]] = related_types + return dependencies + + def create_type_definitions(self): + imported_namespace = "" + if self.config.imported: + imported_namespace = "::".join(self.config.imported.namespace) + self.type_definitions = {} + self.type_definitions["number"] = create_primitive_type_definition("number") + self.type_definitions["integer"] = create_primitive_type_definition("integer") + self.type_definitions["boolean"] = create_primitive_type_definition("boolean") + self.type_definitions["object"] = create_object_type_definition() + self.type_definitions["any"] = create_any_type_definition() + self.type_definitions["binary"] = create_binary_type_definition() + for domain in self.json_api["domains"]: + self.type_definitions[domain["domain"] + ".string"] = ( + create_string_type_definition()) + self.type_definitions[domain["domain"] + ".binary"] = ( + create_binary_type_definition()) + if not ("types" in domain): + continue + for type in domain["types"]: + type_name = domain["domain"] + "." + type["id"] + if type["type"] == "object" and domain["domain"] in self.imported_domains: + self.type_definitions[type_name] = create_imported_type_definition( + domain["domain"], type, imported_namespace) + elif type["type"] == "object": + self.type_definitions[type_name] = create_user_type_definition( + domain["domain"], type) + elif type["type"] == "array": + self.type_definitions[type_name] = self.resolve_type(type) + elif type["type"] == domain["domain"] + ".string": + self.type_definitions[type_name] = create_string_type_definition() + elif type["type"] == domain["domain"] + ".binary": + self.type_definitions[type_name] = create_binary_type_definition() + else: + self.type_definitions[type_name] = create_primitive_type_definition( + type["type"]) + + def check_options(self, options, domain, name, include_attr, exclude_attr, + default): + for rule in options: + if rule.domain != domain: + continue + if include_attr and hasattr(rule, include_attr): + return name in getattr(rule, include_attr) + if exclude_attr and hasattr(rule, exclude_attr): + return name not in getattr(rule, exclude_attr) + return default + return False + + + # ---- Begin of methods exposed to generator + + def type_definition(self, name): + return self.type_definitions[name] + + def resolve_type(self, prop): + if "$ref" in prop: + return self.type_definitions[prop["$ref"]] + if prop["type"] == "array": + return wrap_array_definition(self.resolve_type(prop["items"])) + return self.type_definitions[prop["type"]] + + def optional_type(self, prop): + type = self.resolve_type(prop) + template = ("std::optional<{}>" if type.get('is_primitive', False) + else "std::unique_ptr<{}>") + return template.format(type.get("raw_type")) + + def generate_command(self, domain, command): + if not self.config.protocol.options: + return domain in self.generate_domains + return self.check_options(self.config.protocol.options, domain, command, + "include", "exclude", True) + + def generate_event(self, domain, event): + if not self.config.protocol.options: + return domain in self.generate_domains + return self.check_options(self.config.protocol.options, domain, event, + "include_events", "exclude_events", True) + + def generate_type(self, domain, typename): + return domain + "." + typename in self.used_types + + def is_async_command(self, domain, command): + if not self.config.protocol.options: + return False + return self.check_options(self.config.protocol.options, domain, command, + "async_", None, False) + + def is_exported(self, domain, name): + if not self.config.protocol.options: + return False + return self.check_options(self.config.protocol.options, domain, name, + "exported", None, False) + + def is_imported(self, domain, name): + if not self.config.imported: + return False + if not self.config.imported.options: + return domain in self.imported_domains + return self.check_options(self.config.imported.options, domain, name, + "imported", None, False) + + def is_exported_domain(self, domain): + return domain in self.exported_domains + + def generate_disable(self, domain): + if "commands" not in domain: + return True + for command in domain["commands"]: + if command["name"] == "disable" and self.generate_command( + domain["domain"], "disable"): + return False + return True + + def is_imported_dependency(self, domain): + return domain in self.generate_domains or domain in self.imported_domains + + +def main(): + jinja_dir, config_file, config = read_config() + + protocol = Protocol(config) + + if not config.exported and len(protocol.exported_domains): + sys.stderr.write(("Domains [%s] are exported, but config is missing export " + "entry\n\n") % ", ".join(protocol.exported_domains)) + exit(1) + + if not os.path.exists(config.protocol.output): + os.mkdir(config.protocol.output) + if len(protocol.exported_domains) and not os.path.exists( + config.exported.output): + os.mkdir(config.exported.output) + jinja_env = initialize_jinja_env(jinja_dir, config.protocol.output, config) + + inputs = [] + inputs.append(__file__) + inputs.append(config_file) + inputs.append(config.protocol.path) + if config.imported: + inputs.append(config.imported.path) + templates_dir = os.path.join(module_path, "templates") + inputs.append(os.path.join(templates_dir, "TypeBuilder_h.template")) + inputs.append(os.path.join(templates_dir, "TypeBuilder_cpp.template")) + inputs.append(os.path.join(templates_dir, "Exported_h.template")) + inputs.append(os.path.join(templates_dir, "Imported_h.template")) + + h_template = jinja_env.get_template("templates/TypeBuilder_h.template") + cpp_template = jinja_env.get_template("templates/TypeBuilder_cpp.template") + exported_template = jinja_env.get_template("templates/Exported_h.template") + imported_template = jinja_env.get_template("templates/Imported_h.template") + + outputs = dict() + + for domain in protocol.json_api["domains"]: + class_name = domain["domain"] + file_name = config.protocol.file_name_prefix + class_name + template_context = { + "protocol": protocol, + "config": config, + "domain": domain, + "join_arrays": join_arrays, + "format_include": functools.partial(format_include, config), + "format_domain_include": functools.partial(format_domain_include, config), + } + + if domain["domain"] in protocol.generate_domains: + outputs[os.path.join(config.protocol.output, to_file_name( + config, file_name + ".h"))] = h_template.render(template_context) + outputs[os.path.join(config.protocol.output, to_file_name( + config, file_name + ".cpp"))] = cpp_template.render(template_context) + if domain["domain"] in protocol.exported_domains: + outputs[os.path.join(config.exported.output, to_file_name( + config, file_name + ".h"))] = exported_template.render( + template_context) + if domain["domain"] in protocol.imported_domains: + outputs[os.path.join(config.protocol.output, to_file_name( + config, file_name + ".h"))] = imported_template.render( + template_context) + + if config.lib: + template_context = { + "config": config, + "format_include": functools.partial(format_include, config), + } + + lib_templates_dir = os.path.join(module_path, "lib") + # Note these should be sorted in the right order. + + # TODO(dgozman): sort them programmatically based on commented includes. + + forward_h_templates = [ + "Forward_h.template", + ] + + protocol_h_templates = [] + protocol_cpp_templates = [] + + if not config.use_embedder_types: + protocol_h_templates += [ + "Values_h.template", + "Object_h.template", + "ValueConversions_h.template", + ] + protocol_cpp_templates += [ + "Protocol_cpp.template", + "Values_cpp.template", + "Object_cpp.template", + "ValueConversions_cpp.template", + ] + else: + protocol_h_templates += [ + "Forward_h.template", + ] + + def generate_lib_file(file_name, template_files): + parts = [] + for template_file in template_files: + inputs.append(os.path.join(lib_templates_dir, template_file)) + template = jinja_env.get_template("lib/" + template_file) + parts.append(template.render(template_context)) + outputs[file_name] = "\n\n".join(parts) + + generate_lib_file(os.path.join(config.lib.output, to_file_name( + config, "Forward.h")), forward_h_templates) + generate_lib_file(os.path.join(config.lib.output, to_file_name( + config, "Protocol.h")), protocol_h_templates) + + if not config.use_embedder_types: + generate_lib_file(os.path.join(config.lib.output, to_file_name( + config, "Protocol.cpp")), protocol_cpp_templates) + + # Make gyp / make generatos happy, otherwise make rebuilds world. + inputs_ts = max(map(os.path.getmtime, inputs)) + up_to_date = True + for output_file in outputs.keys(): + if (not os.path.exists(output_file) + or os.path.getmtime(output_file) < inputs_ts): + up_to_date = False + break + if up_to_date: + sys.exit() + + for file_name, content in outputs.items(): + # Remove output file first to account for potential case changes. + try: + os.remove(file_name) + except OSError: + pass + out_file = open(file_name, "w") + out_file.write(content) + out_file.close() + + +if __name__ == "__main__": + main() diff --git a/deps/inspector_protocol/concatenate_protocols.py b/deps/inspector_protocol/concatenate_protocols.py new file mode 100755 index 00000000000000..11f1fed06c49f6 --- /dev/null +++ b/deps/inspector_protocol/concatenate_protocols.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# Copyright 2016 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os.path +import sys + +try: + import json +except ImportError: + import simplejson as json + +import pdl + +def main(argv): + if len(argv) < 1: + sys.stderr.write( + "Usage: %s <protocol-1> [<protocol-2> [, <protocol-3>...]] " + "<output-file>\n" % sys.argv[0]) + return 1 + + domains = [] + version = None + for protocol in argv[:-1]: + file_name = os.path.normpath(protocol) + if not os.path.isfile(file_name): + sys.stderr.write("Cannot find %s\n" % file_name) + return 1 + input_file = open(file_name, "r") + parsed_json = pdl.loads(input_file.read(), file_name) + domains += parsed_json["domains"] + version = parsed_json["version"] + + output_file = open(argv[-1], "w") + json.dump({"version": version, "domains": domains}, output_file, + indent=4, sort_keys=False, separators=(',', ': ')) + output_file.close() + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/deps/inspector_protocol/convert_protocol_to_json.py b/deps/inspector_protocol/convert_protocol_to_json.py new file mode 100755 index 00000000000000..e31dd7f127e151 --- /dev/null +++ b/deps/inspector_protocol/convert_protocol_to_json.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +# Copyright 2017 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import argparse +import json +import os.path +import sys + +import pdl + +def open_to_write(path): + if sys.version_info >= (3,0): + return open(path, 'w', encoding='utf-8') + else: + return open(path, 'wb') + + +def main(argv): + parser = argparse.ArgumentParser(description=( + "Converts from .pdl to .json by invoking the pdl Python module.")) + parser.add_argument('--map_binary_to_string', type=bool, + help=('If set, binary in the .pdl is mapped to a ' + 'string in .json. Client code will have to ' + 'base64 decode the string to get the payload.')) + parser.add_argument("pdl_file", help="The .pdl input file to parse.") + parser.add_argument("json_file", help="The .json output file write.") + args = parser.parse_args(argv) + file_name = os.path.normpath(args.pdl_file) + input_file = open(file_name, "r") + pdl_string = input_file.read() + protocol = pdl.loads(pdl_string, file_name, args.map_binary_to_string) + input_file.close() + output_file = open_to_write(os.path.normpath(args.json_file)) + json.dump(protocol, output_file, indent=4, separators=(',', ': ')) + output_file.close() + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/deps/inspector_protocol/crdtp/README.md b/deps/inspector_protocol/crdtp/README.md new file mode 100644 index 00000000000000..a3bc75943fd213 --- /dev/null +++ b/deps/inspector_protocol/crdtp/README.md @@ -0,0 +1,114 @@ +# CRDTP - Chrome DevTools Protocol Library. + +[Canonical location for this library.](https://chromium.googlesource.com/deps/inspector_protocol/+/refs/heads/main) + +This is a support library for the Chrome DevTools protocol implementation. + +It's used from within the Jinja templates which we use for code generation +(see ../lib and ../templates) as well as from Chromium (headless, +chrome, content, blink), V8, and other code bases that use the DevTools +protocol. + +The library is designed to be portable. The only allowed dependencies are: + +- The C/C++ standard libraries, up to C++14. + The litmus test is that it compiles and passes tests for all platforms + supported by V8. + +- For testing, we depend on mini_chromium and gtest. This is isolated + into the `crdtp/test_platform.{h,cc}` library. + +We support 32 bit and 64 bit architectures. + +# Common types used in this library. + +- `uint8_t`: a byte, e.g. for raw bytes or UTF8 characters + +- `uint16_t`: two bytes, e.g. for UTF16 characters + +For input parameters: + +- `span<uint8_t>`: pointer to bytes and length + +- `span<uint16_t>`: pointer to UTF16 chars and length + +For output parameters: + +- `std::vector<uint8_t>` - Owned segment of bytes / utf8 characters and length. + +- `std::string` - Same, for compatibility, even though char is signed. + +# Building and running the tests. + +If you're familiar with +[Chromium's development process](https://www.chromium.org/developers/contributing-code) +and have the depot_tools installed, you may use these commands +to fetch the package (and dependencies) and build and run the tests: + + fetch inspector_protocol + cd src + gn gen out/Release + ninja -C out/Release crdtp_test + out/Release/crdtp_test + +You'll probably also need to install libstdc++, since Clang uses this to find the +standard C++ headers. E.g., + + sudo apt-get install libstdc++-14-dev + +# Purpose of the tests + +crdtp comes with unittest coverage. + +Upstream, in this standalone package, the unittests make development +more pleasant because they are very fast and light (try the previous +section to see). + +Downstream (in Chromium, V8, etc.), they ensure that the library behaves +correctly within each specific code base. We have seen bugs from different +architectures / compilers / etc. in the past. We have also seen +that a tweaked downstream crdtp_platform library did not behave correctly, +becaues V8's strtod routine interprets out of range literals as 'inf'. +Thus, the unittests function as a conformance test suite for such code-base +specific tweaks downstream. + +# Customization by downstream users (Chrome, V8, google3, etc.). + +Downstream users may need to customize the library. We isolate these typical +customizations into two platform libraries (crdtp_plaform and +crdtp_test_platform), to reduce the chance of merge conflicts and grief when +rolling as much as possible. While customized platform libraries may +depend on the downstream code base (e.g. abseil, Chromium's base, V8's utility +functions, Boost, etc.), they are not exposed to the headers that +downstream code depends on. + +## crdtp_platform + +This platform library is only used by the crdtp library; it is not part of the +crdtp API. Thus far it consists only of json_platform.h and json_platform.cc, +because conversion between a `std::string` and a double is tricky, and different +code bases have different preferences in this regard. In this repository +(upstream), json_platform.cc provides a reference implementation which uses the +C++ standard library. + +Downstream, in Chromium, json_platform_chromium.cc has a different +implementation that uses the routines in Chromium's //base, that is, it's a .cc +file that's specific to Chromium. Similarly, in V8, json_platform_v8.cc uses +V8's number conversion utilities, so it's a .cc file that's specific to V8. And +in google3, we use the absl library. crdtp/json_platform.cc is designed to be +easy to modify or replace, and the interface defined by its header is designed +to be stable. + +## crdtp_test_platform + +This platform library is only used by the tests. Upstream, it's setup to +use mini_chromium and gtest. Downstream, Chromium uses its //base libraries, +and V8 uses theirs; and a small amount of tweaking is needed in each code +base - e.g., Chromium, V8, and google3 each place `#include` declarations into +test_platform.h that are specific to their code base, and they have their +own routines in test_platform.cc which uses their own libraries. + +The purpose of crdtp_test_platform is to isolate the tweaking to this small, +stable library (modifying test_platform.h and test_platform.cc). This avoids +having to modify the actual tests (json_test.cc, cbor_test.cc, ...) +when rolling changes downstream. We try to not use patch files. diff --git a/deps/inspector_protocol/crdtp/cbor.cc b/deps/inspector_protocol/crdtp/cbor.cc new file mode 100644 index 00000000000000..801c1708022763 --- /dev/null +++ b/deps/inspector_protocol/crdtp/cbor.cc @@ -0,0 +1,1078 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cbor.h" + +#include <algorithm> +#include <cassert> +#include <cmath> +#include <cstring> +#include <limits> +#include <stack> + +namespace crdtp { +namespace cbor { +namespace { +// Indicates the number of bits the "initial byte" needs to be shifted to the +// right after applying |kMajorTypeMask| to produce the major type in the +// lowermost bits. +static constexpr uint8_t kMajorTypeBitShift = 5u; +// Mask selecting the low-order 5 bits of the "initial byte", which is where +// the additional information is encoded. +static constexpr uint8_t kAdditionalInformationMask = 0x1f; +// Mask selecting the high-order 3 bits of the "initial byte", which indicates +// the major type of the encoded value. +static constexpr uint8_t kMajorTypeMask = 0xe0; +// Indicates the integer is in the following byte. +static constexpr uint8_t kAdditionalInformation1Byte = 24u; +// Indicates the integer is in the next 2 bytes. +static constexpr uint8_t kAdditionalInformation2Bytes = 25u; +// Indicates the integer is in the next 4 bytes. +static constexpr uint8_t kAdditionalInformation4Bytes = 26u; +// Indicates the integer is in the next 8 bytes. +static constexpr uint8_t kAdditionalInformation8Bytes = 27u; + +// Encodes the initial byte, consisting of the |type| in the first 3 bits +// followed by 5 bits of |additional_info|. +constexpr uint8_t EncodeInitialByte(MajorType type, uint8_t additional_info) { + return (static_cast<uint8_t>(type) << kMajorTypeBitShift) | + (additional_info & kAdditionalInformationMask); +} + +// TAG 24 indicates that what follows is a byte string which is +// encoded in CBOR format. We use this as a wrapper for +// maps and arrays, allowing us to skip them, because the +// byte string carries its size (byte length). +// https://tools.ietf.org/html/rfc7049#section-2.4.4.1 +static constexpr uint8_t kInitialByteForEnvelope = + EncodeInitialByte(MajorType::TAG, kAdditionalInformation1Byte); + +// The standalone byte for "envelope" tag, to follow kInitialByteForEnvelope +// in the correct implementation, as it is above in-tag value max (which is +// also, confusingly, 24). See EnvelopeHeader::Parse() for more. +static constexpr uint8_t kCBOREnvelopeTag = 24; + +// The initial byte for a byte string with at most 2^32 bytes +// of payload. This is used for envelope encoding, even if +// the byte string is shorter. +static constexpr uint8_t kInitialByteFor32BitLengthByteString = + EncodeInitialByte(MajorType::BYTE_STRING, 26); + +// See RFC 7049 Section 2.2.1, indefinite length arrays / maps have additional +// info = 31. +static constexpr uint8_t kInitialByteIndefiniteLengthArray = + EncodeInitialByte(MajorType::ARRAY, 31); +static constexpr uint8_t kInitialByteIndefiniteLengthMap = + EncodeInitialByte(MajorType::MAP, 31); +// See RFC 7049 Section 2.3, Table 1; this is used for finishing indefinite +// length maps / arrays. +static constexpr uint8_t kStopByte = + EncodeInitialByte(MajorType::SIMPLE_VALUE, 31); + +// See RFC 7049 Section 2.3, Table 2. +static constexpr uint8_t kEncodedTrue = + EncodeInitialByte(MajorType::SIMPLE_VALUE, 21); +static constexpr uint8_t kEncodedFalse = + EncodeInitialByte(MajorType::SIMPLE_VALUE, 20); +static constexpr uint8_t kEncodedNull = + EncodeInitialByte(MajorType::SIMPLE_VALUE, 22); +static constexpr uint8_t kInitialByteForDouble = + EncodeInitialByte(MajorType::SIMPLE_VALUE, 27); + +// See RFC 7049 Table 3 and Section 2.4.4.2. This is used as a prefix for +// arbitrary binary data encoded as BYTE_STRING. +static constexpr uint8_t kExpectedConversionToBase64Tag = + EncodeInitialByte(MajorType::TAG, 22); + +// Writes the bytes for |v| to |out|, starting with the most significant byte. +// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html +template <typename T> +void WriteBytesMostSignificantByteFirst(T v, std::vector<uint8_t>* out) { + for (int shift_bytes = sizeof(T) - 1; shift_bytes >= 0; --shift_bytes) + out->push_back(0xff & (v >> (shift_bytes * 8))); +} + +// Extracts sizeof(T) bytes from |in| to extract a value of type T +// (e.g. uint64_t, uint32_t, ...), most significant byte first. +// See also: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html +template <typename T> +T ReadBytesMostSignificantByteFirst(span<uint8_t> in) { + assert(in.size() >= sizeof(T)); + T result = 0; + for (size_t shift_bytes = 0; shift_bytes < sizeof(T); ++shift_bytes) + result |= T(in[sizeof(T) - 1 - shift_bytes]) << (shift_bytes * 8); + return result; +} +} // namespace + +namespace internals { +// Reads the start of a token with definitive size from |bytes|. +// |type| is the major type as specified in RFC 7049 Section 2.1. +// |value| is the payload (e.g. for MajorType::UNSIGNED) or is the size +// (e.g. for BYTE_STRING). +// If successful, returns the number of bytes read. Otherwise returns 0. +size_t ReadTokenStart(span<uint8_t> bytes, MajorType* type, uint64_t* value) { + if (bytes.empty()) + return 0; + uint8_t initial_byte = bytes[0]; + *type = MajorType((initial_byte & kMajorTypeMask) >> kMajorTypeBitShift); + + uint8_t additional_information = initial_byte & kAdditionalInformationMask; + if (additional_information < 24) { + // Values 0-23 are encoded directly into the additional info of the + // initial byte. + *value = additional_information; + return 1; + } + if (additional_information == kAdditionalInformation1Byte) { + // Values 24-255 are encoded with one initial byte, followed by the value. + if (bytes.size() < 2) + return 0; + *value = ReadBytesMostSignificantByteFirst<uint8_t>(bytes.subspan(1)); + return 2; + } + if (additional_information == kAdditionalInformation2Bytes) { + // Values 256-65535: 1 initial byte + 2 bytes payload. + if (bytes.size() < 1 + sizeof(uint16_t)) + return 0; + *value = ReadBytesMostSignificantByteFirst<uint16_t>(bytes.subspan(1)); + return 3; + } + if (additional_information == kAdditionalInformation4Bytes) { + // 32 bit uint: 1 initial byte + 4 bytes payload. + if (bytes.size() < 1 + sizeof(uint32_t)) + return 0; + *value = ReadBytesMostSignificantByteFirst<uint32_t>(bytes.subspan(1)); + return 5; + } + if (additional_information == kAdditionalInformation8Bytes) { + // 64 bit uint: 1 initial byte + 8 bytes payload. + if (bytes.size() < 1 + sizeof(uint64_t)) + return 0; + *value = ReadBytesMostSignificantByteFirst<uint64_t>(bytes.subspan(1)); + return 9; + } + return 0; +} + +// Writes the start of a token with |type|. The |value| may indicate the size, +// or it may be the payload if the value is an unsigned integer. +void WriteTokenStart(MajorType type, + uint64_t value, + std::vector<uint8_t>* encoded) { + if (value < 24) { + // Values 0-23 are encoded directly into the additional info of the + // initial byte. + encoded->push_back(EncodeInitialByte(type, /*additional_info=*/value)); + return; + } + if (value <= std::numeric_limits<uint8_t>::max()) { + // Values 24-255 are encoded with one initial byte, followed by the value. + encoded->push_back(EncodeInitialByte(type, kAdditionalInformation1Byte)); + encoded->push_back(value); + return; + } + if (value <= std::numeric_limits<uint16_t>::max()) { + // Values 256-65535: 1 initial byte + 2 bytes payload. + encoded->push_back(EncodeInitialByte(type, kAdditionalInformation2Bytes)); + WriteBytesMostSignificantByteFirst<uint16_t>(value, encoded); + return; + } + if (value <= std::numeric_limits<uint32_t>::max()) { + // 32 bit uint: 1 initial byte + 4 bytes payload. + encoded->push_back(EncodeInitialByte(type, kAdditionalInformation4Bytes)); + WriteBytesMostSignificantByteFirst<uint32_t>(static_cast<uint32_t>(value), + encoded); + return; + } + // 64 bit uint: 1 initial byte + 8 bytes payload. + encoded->push_back(EncodeInitialByte(type, kAdditionalInformation8Bytes)); + WriteBytesMostSignificantByteFirst<uint64_t>(value, encoded); +} +} // namespace internals + +// ============================================================================= +// Detecting CBOR content +// ============================================================================= + +bool IsCBORMessage(span<uint8_t> msg) { + return msg.size() >= 4 && msg[0] == kInitialByteForEnvelope && + (msg[1] == kInitialByteFor32BitLengthByteString || + (msg[1] == kCBOREnvelopeTag && + msg[2] == kInitialByteFor32BitLengthByteString)); +} + +Status CheckCBORMessage(span<uint8_t> msg) { + if (msg.empty()) + return Status(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0); + if (msg[0] != kInitialByteForEnvelope) + return Status(Error::CBOR_INVALID_START_BYTE, 0); + StatusOr<EnvelopeHeader> status_or_header = EnvelopeHeader::Parse(msg); + if (!status_or_header.ok()) + return status_or_header.status(); + const size_t pos = (*status_or_header).header_size(); + assert(pos < msg.size()); // EnvelopeParser would not allow empty envelope. + if (msg[pos] != EncodeIndefiniteLengthMapStart()) + return Status(Error::CBOR_MAP_START_EXPECTED, pos); + return Status(); +} + +// ============================================================================= +// Encoding invidiual CBOR items +// ============================================================================= + +uint8_t EncodeTrue() { + return kEncodedTrue; +} + +uint8_t EncodeFalse() { + return kEncodedFalse; +} + +uint8_t EncodeNull() { + return kEncodedNull; +} + +uint8_t EncodeIndefiniteLengthArrayStart() { + return kInitialByteIndefiniteLengthArray; +} + +uint8_t EncodeIndefiniteLengthMapStart() { + return kInitialByteIndefiniteLengthMap; +} + +uint8_t EncodeStop() { + return kStopByte; +} + +void EncodeInt32(int32_t value, std::vector<uint8_t>* out) { + if (value >= 0) { + internals::WriteTokenStart(MajorType::UNSIGNED, value, out); + } else { + uint64_t representation = static_cast<uint64_t>(-(value + 1)); + internals::WriteTokenStart(MajorType::NEGATIVE, representation, out); + } +} + +void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out) { + uint64_t byte_length = static_cast<uint64_t>(in.size_bytes()); + internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out); + // When emitting UTF16 characters, we always write the least significant byte + // first; this is because it's the native representation for X86. + // TODO(johannes): Implement a more efficient thing here later, e.g. + // casting *iff* the machine has this byte order. + // The wire format for UTF16 chars will probably remain the same + // (least significant byte first) since this way we can have + // golden files, unittests, etc. that port easily and universally. + // See also: + // https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html + for (const uint16_t two_bytes : in) { + out->push_back(two_bytes); + out->push_back(two_bytes >> 8); + } +} + +void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out) { + internals::WriteTokenStart(MajorType::STRING, + static_cast<uint64_t>(in.size_bytes()), out); + out->insert(out->end(), in.begin(), in.end()); +} + +void EncodeFromLatin1(span<uint8_t> latin1, std::vector<uint8_t>* out) { + for (size_t ii = 0; ii < latin1.size(); ++ii) { + if (latin1[ii] <= 127) + continue; + // If there's at least one non-ASCII char, convert to UTF8. + std::vector<uint8_t> utf8(latin1.begin(), latin1.begin() + ii); + for (; ii < latin1.size(); ++ii) { + if (latin1[ii] <= 127) { + utf8.push_back(latin1[ii]); + } else { + // 0xC0 means it's a UTF8 sequence with 2 bytes. + utf8.push_back((latin1[ii] >> 6) | 0xc0); + utf8.push_back((latin1[ii] | 0x80) & 0xbf); + } + } + EncodeString8(SpanFrom(utf8), out); + return; + } + EncodeString8(latin1, out); +} + +void EncodeFromUTF16(span<uint16_t> utf16, std::vector<uint8_t>* out) { + // If there's at least one non-ASCII char, encode as STRING16 (UTF16). + for (uint16_t ch : utf16) { + if (ch <= 127) + continue; + EncodeString16(utf16, out); + return; + } + // It's all US-ASCII, strip out every second byte and encode as UTF8. + internals::WriteTokenStart(MajorType::STRING, + static_cast<uint64_t>(utf16.size()), out); + out->insert(out->end(), utf16.begin(), utf16.end()); +} + +void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out) { + out->push_back(kExpectedConversionToBase64Tag); + uint64_t byte_length = static_cast<uint64_t>(in.size_bytes()); + internals::WriteTokenStart(MajorType::BYTE_STRING, byte_length, out); + out->insert(out->end(), in.begin(), in.end()); +} + +// A double is encoded with a specific initial byte +// (kInitialByteForDouble) plus the 64 bits of payload for its value. +constexpr size_t kEncodedDoubleSize = 1 + sizeof(uint64_t); + +void EncodeDouble(double value, std::vector<uint8_t>* out) { + // The additional_info=27 indicates 64 bits for the double follow. + // See RFC 7049 Section 2.3, Table 1. + out->push_back(kInitialByteForDouble); + union { + double from_double; + uint64_t to_uint64; + } reinterpret; + reinterpret.from_double = value; + WriteBytesMostSignificantByteFirst<uint64_t>(reinterpret.to_uint64, out); +} + +// ============================================================================= +// cbor::EnvelopeEncoder - for wrapping submessages +// ============================================================================= + +void EnvelopeEncoder::EncodeStart(std::vector<uint8_t>* out) { + assert(byte_size_pos_ == 0); + out->push_back(kInitialByteForEnvelope); + out->push_back(kCBOREnvelopeTag); + out->push_back(kInitialByteFor32BitLengthByteString); + byte_size_pos_ = out->size(); + out->resize(out->size() + sizeof(uint32_t)); +} + +bool EnvelopeEncoder::EncodeStop(std::vector<uint8_t>* out) { + assert(byte_size_pos_ != 0); + // The byte size is the size of the payload, that is, all the + // bytes that were written past the byte size position itself. + uint64_t byte_size = out->size() - (byte_size_pos_ + sizeof(uint32_t)); + // We store exactly 4 bytes, so at most INT32MAX, with most significant + // byte first. + if (byte_size > std::numeric_limits<uint32_t>::max()) + return false; + for (int shift_bytes = sizeof(uint32_t) - 1; shift_bytes >= 0; + --shift_bytes) { + (*out)[byte_size_pos_++] = 0xff & (byte_size >> (shift_bytes * 8)); + } + return true; +} + +// static +StatusOr<EnvelopeHeader> EnvelopeHeader::Parse(span<uint8_t> in) { + auto header_or_status = ParseFromFragment(in); + if (!header_or_status.ok()) + return header_or_status; + if ((*header_or_status).outer_size() > in.size()) { + return StatusOr<EnvelopeHeader>( + Status(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, in.size())); + } + return header_or_status; +} + +// static +StatusOr<EnvelopeHeader> EnvelopeHeader::ParseFromFragment(span<uint8_t> in) { + // Our copy of StatusOr<> requires explicit constructor. + using Ret = StatusOr<EnvelopeHeader>; + constexpr size_t kMinEnvelopeSize = 2 + /* for envelope tag */ + 1 + /* for byte string */ + 1; /* for contents, a map or an array */ + if (in.size() < kMinEnvelopeSize) + return Ret(Status(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, in.size())); + assert(in[0] == kInitialByteForEnvelope); // Caller should assure that. + size_t offset = 1; + // TODO(caseq): require this! We're currently accepting both a legacy, + // non spec-compliant envelope tag (that this implementation still currently + // produces), as well as a well-formed two-byte tag that a correct + // implementation should emit. + if (in[offset] == kCBOREnvelopeTag) + ++offset; + MajorType type; + uint64_t size; + size_t string_header_size = + internals::ReadTokenStart(in.subspan(offset), &type, &size); + if (!string_header_size) + return Ret(Status(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, in.size())); + if (type != MajorType::BYTE_STRING) + return Ret(Status(Error::CBOR_INVALID_ENVELOPE, offset)); + // Do not allow empty envelopes -- at least an empty map/array should fit. + if (!size) { + return Ret(Status(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, + offset + string_header_size)); + } + if (size > std::numeric_limits<uint32_t>::max()) + return Ret(Status(Error::CBOR_INVALID_ENVELOPE, offset)); + offset += string_header_size; + return Ret(EnvelopeHeader(offset, static_cast<size_t>(size))); +} + +// ============================================================================= +// cbor::NewCBOREncoder - for encoding from a streaming parser +// ============================================================================= + +namespace { +class CBOREncoder : public ParserHandler { + public: + CBOREncoder(std::vector<uint8_t>* out, Status* status) + : out_(out), status_(status) { + *status_ = Status(); + } + + void HandleMapBegin() override { + if (!status_->ok()) + return; + envelopes_.emplace_back(); + envelopes_.back().EncodeStart(out_); + out_->push_back(kInitialByteIndefiniteLengthMap); + } + + void HandleMapEnd() override { + if (!status_->ok()) + return; + out_->push_back(kStopByte); + assert(!envelopes_.empty()); + if (!envelopes_.back().EncodeStop(out_)) { + HandleError( + Status(Error::CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED, out_->size())); + return; + } + envelopes_.pop_back(); + } + + void HandleArrayBegin() override { + if (!status_->ok()) + return; + envelopes_.emplace_back(); + envelopes_.back().EncodeStart(out_); + out_->push_back(kInitialByteIndefiniteLengthArray); + } + + void HandleArrayEnd() override { + if (!status_->ok()) + return; + out_->push_back(kStopByte); + assert(!envelopes_.empty()); + if (!envelopes_.back().EncodeStop(out_)) { + HandleError( + Status(Error::CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED, out_->size())); + return; + } + envelopes_.pop_back(); + } + + void HandleString8(span<uint8_t> chars) override { + if (!status_->ok()) + return; + EncodeString8(chars, out_); + } + + void HandleString16(span<uint16_t> chars) override { + if (!status_->ok()) + return; + EncodeFromUTF16(chars, out_); + } + + void HandleBinary(span<uint8_t> bytes) override { + if (!status_->ok()) + return; + EncodeBinary(bytes, out_); + } + + void HandleDouble(double value) override { + if (!status_->ok()) + return; + EncodeDouble(value, out_); + } + + void HandleInt32(int32_t value) override { + if (!status_->ok()) + return; + EncodeInt32(value, out_); + } + + void HandleBool(bool value) override { + if (!status_->ok()) + return; + // See RFC 7049 Section 2.3, Table 2. + out_->push_back(value ? kEncodedTrue : kEncodedFalse); + } + + void HandleNull() override { + if (!status_->ok()) + return; + // See RFC 7049 Section 2.3, Table 2. + out_->push_back(kEncodedNull); + } + + void HandleError(Status error) override { + if (!status_->ok()) + return; + *status_ = error; + out_->clear(); + } + + private: + std::vector<uint8_t>* out_; + std::vector<EnvelopeEncoder> envelopes_; + Status* status_; +}; +} // namespace + +std::unique_ptr<ParserHandler> NewCBOREncoder(std::vector<uint8_t>* out, + Status* status) { + return std::unique_ptr<ParserHandler>(new CBOREncoder(out, status)); +} + +// ============================================================================= +// cbor::CBORTokenizer - for parsing individual CBOR items +// ============================================================================= + +CBORTokenizer::CBORTokenizer(span<uint8_t> bytes) + : bytes_(bytes), status_(Error::OK, 0) { + ReadNextToken(); +} + +CBORTokenizer::~CBORTokenizer() {} + +CBORTokenTag CBORTokenizer::TokenTag() const { + return token_tag_; +} + +void CBORTokenizer::Next() { + if (token_tag_ == CBORTokenTag::ERROR_VALUE || + token_tag_ == CBORTokenTag::DONE) + return; + ReadNextToken(); +} + +void CBORTokenizer::EnterEnvelope() { + token_byte_length_ = GetEnvelopeHeader().header_size(); + ReadNextToken(); +} + +Status CBORTokenizer::Status() const { + return status_; +} + +// The following accessor functions ::GetInt32, ::GetDouble, +// ::GetString8, ::GetString16WireRep, ::GetBinary, ::GetEnvelopeContents +// assume that a particular token was recognized in ::ReadNextToken. +// That's where all the error checking is done. By design, +// the accessors (assuming the token was recognized) never produce +// an error. + +int32_t CBORTokenizer::GetInt32() const { + assert(token_tag_ == CBORTokenTag::INT32); + // The range checks happen in ::ReadNextToken(). + return static_cast<int32_t>( + token_start_type_ == MajorType::UNSIGNED + ? token_start_internal_value_ + : -static_cast<int64_t>(token_start_internal_value_) - 1); +} + +double CBORTokenizer::GetDouble() const { + assert(token_tag_ == CBORTokenTag::DOUBLE); + union { + uint64_t from_uint64; + double to_double; + } reinterpret; + reinterpret.from_uint64 = ReadBytesMostSignificantByteFirst<uint64_t>( + bytes_.subspan(status_.pos + 1)); + return reinterpret.to_double; +} + +span<uint8_t> CBORTokenizer::GetString8() const { + assert(token_tag_ == CBORTokenTag::STRING8); + auto length = static_cast<size_t>(token_start_internal_value_); + return bytes_.subspan(status_.pos + (token_byte_length_ - length), length); +} + +span<uint8_t> CBORTokenizer::GetString16WireRep() const { + assert(token_tag_ == CBORTokenTag::STRING16); + auto length = static_cast<size_t>(token_start_internal_value_); + return bytes_.subspan(status_.pos + (token_byte_length_ - length), length); +} + +span<uint8_t> CBORTokenizer::GetBinary() const { + assert(token_tag_ == CBORTokenTag::BINARY); + auto length = static_cast<size_t>(token_start_internal_value_); + return bytes_.subspan(status_.pos + (token_byte_length_ - length), length); +} + +span<uint8_t> CBORTokenizer::GetEnvelope() const { + return bytes_.subspan(status_.pos, GetEnvelopeHeader().outer_size()); +} + +span<uint8_t> CBORTokenizer::GetEnvelopeContents() const { + const EnvelopeHeader& header = GetEnvelopeHeader(); + return bytes_.subspan(status_.pos + header.header_size(), + header.content_size()); +} + +const EnvelopeHeader& CBORTokenizer::GetEnvelopeHeader() const { + assert(token_tag_ == CBORTokenTag::ENVELOPE); + return envelope_header_; +} + +// All error checking happens in ::ReadNextToken, so that the accessors +// can avoid having to carry an error return value. +// +// With respect to checking the encoded lengths of strings, arrays, etc: +// On the wire, CBOR uses 1,2,4, and 8 byte unsigned integers, so +// we initially read them as uint64_t, usually into token_start_internal_value_. +// +// However, since these containers have a representation on the machine, +// we need to do corresponding size computations on the input byte array, +// output span (e.g. the payload for a string), etc., and size_t is +// machine specific (in practice either 32 bit or 64 bit). +// +// Further, we must avoid overflowing size_t. Therefore, we use this +// kMaxValidLength constant to: +// - Reject values that are larger than the architecture specific +// max size_t (differs between 32 bit and 64 bit arch). +// - Reserve at least one bit so that we can check against overflows +// when adding lengths (array / string length / etc.); we do this by +// ensuring that the inputs to an addition are <= kMaxValidLength, +// and then checking whether the sum went past it. +// +// See also +// https://chromium.googlesource.com/chromium/src/+/main/docs/security/integer-semantics.md +static const uint64_t kMaxValidLength = + std::min<uint64_t>(std::numeric_limits<uint64_t>::max() >> 2, + std::numeric_limits<size_t>::max()); + +void CBORTokenizer::ReadNextToken() { + status_.pos += token_byte_length_; + status_.error = Error::OK; + envelope_header_ = EnvelopeHeader(); + if (status_.pos >= bytes_.size()) { + token_tag_ = CBORTokenTag::DONE; + return; + } + const size_t remaining_bytes = bytes_.size() - status_.pos; + switch (bytes_[status_.pos]) { + case kStopByte: + SetToken(CBORTokenTag::STOP, 1); + return; + case kInitialByteIndefiniteLengthMap: + SetToken(CBORTokenTag::MAP_START, 1); + return; + case kInitialByteIndefiniteLengthArray: + SetToken(CBORTokenTag::ARRAY_START, 1); + return; + case kEncodedTrue: + SetToken(CBORTokenTag::TRUE_VALUE, 1); + return; + case kEncodedFalse: + SetToken(CBORTokenTag::FALSE_VALUE, 1); + return; + case kEncodedNull: + SetToken(CBORTokenTag::NULL_VALUE, 1); + return; + case kExpectedConversionToBase64Tag: { // BINARY + const size_t bytes_read = internals::ReadTokenStart( + bytes_.subspan(status_.pos + 1), &token_start_type_, + &token_start_internal_value_); + if (!bytes_read || token_start_type_ != MajorType::BYTE_STRING || + token_start_internal_value_ > kMaxValidLength) { + SetError(Error::CBOR_INVALID_BINARY); + return; + } + const uint64_t token_byte_length = token_start_internal_value_ + + /* tag before token start: */ 1 + + /* token start: */ bytes_read; + if (token_byte_length > remaining_bytes) { + SetError(Error::CBOR_INVALID_BINARY); + return; + } + SetToken(CBORTokenTag::BINARY, static_cast<size_t>(token_byte_length)); + return; + } + case kInitialByteForDouble: { // DOUBLE + if (kEncodedDoubleSize > remaining_bytes) { + SetError(Error::CBOR_INVALID_DOUBLE); + return; + } + SetToken(CBORTokenTag::DOUBLE, kEncodedDoubleSize); + return; + } + case kInitialByteForEnvelope: { // ENVELOPE + StatusOr<EnvelopeHeader> status_or_header = + EnvelopeHeader::Parse(bytes_.subspan(status_.pos)); + if (!status_or_header.ok()) { + status_.pos += status_or_header.status().pos; + SetError(status_or_header.status().error); + return; + } + assert((*status_or_header).outer_size() <= remaining_bytes); + envelope_header_ = *status_or_header; + SetToken(CBORTokenTag::ENVELOPE, envelope_header_.outer_size()); + return; + } + default: { + const size_t bytes_read = internals::ReadTokenStart( + bytes_.subspan(status_.pos), &token_start_type_, + &token_start_internal_value_); + switch (token_start_type_) { + case MajorType::UNSIGNED: // INT32. + // INT32 is a signed int32 (int32 makes sense for the + // inspector protocol, it's not a CBOR limitation), so we check + // against the signed max, so that the allowable values are + // 0, 1, 2, ... 2^31 - 1. + if (!bytes_read || + static_cast<uint64_t>(std::numeric_limits<int32_t>::max()) < + static_cast<uint64_t>(token_start_internal_value_)) { + SetError(Error::CBOR_INVALID_INT32); + return; + } + SetToken(CBORTokenTag::INT32, bytes_read); + return; + case MajorType::NEGATIVE: { // INT32. + // INT32 is a signed int32 (int32 makes sense for the + // inspector protocol, it's not a CBOR limitation); in CBOR, the + // negative values for INT32 are represented as NEGATIVE, that is, -1 + // INT32 is represented as 1 << 5 | 0 (major type 1, additional info + // value 0). + // The represented allowed values range is -1 to -2^31. + // They are mapped into the encoded range of 0 to 2^31-1. + // We check the payload in token_start_internal_value_ against + // that range (2^31-1 is also known as + // std::numeric_limits<int32_t>::max()). + if (!bytes_read || + static_cast<uint64_t>(token_start_internal_value_) > + static_cast<uint64_t>(std::numeric_limits<int32_t>::max())) { + SetError(Error::CBOR_INVALID_INT32); + return; + } + SetToken(CBORTokenTag::INT32, bytes_read); + return; + } + case MajorType::STRING: { // STRING8. + if (!bytes_read || token_start_internal_value_ > kMaxValidLength) { + SetError(Error::CBOR_INVALID_STRING8); + return; + } + uint64_t token_byte_length = token_start_internal_value_ + bytes_read; + if (token_byte_length > remaining_bytes) { + SetError(Error::CBOR_INVALID_STRING8); + return; + } + SetToken(CBORTokenTag::STRING8, + static_cast<size_t>(token_byte_length)); + return; + } + case MajorType::BYTE_STRING: { // STRING16. + // Length must be divisible by 2 since UTF16 is 2 bytes per + // character, hence the &1 check. + if (!bytes_read || token_start_internal_value_ > kMaxValidLength || + token_start_internal_value_ & 1) { + SetError(Error::CBOR_INVALID_STRING16); + return; + } + uint64_t token_byte_length = token_start_internal_value_ + bytes_read; + if (token_byte_length > remaining_bytes) { + SetError(Error::CBOR_INVALID_STRING16); + return; + } + SetToken(CBORTokenTag::STRING16, + static_cast<size_t>(token_byte_length)); + return; + } + case MajorType::ARRAY: + case MajorType::MAP: + case MajorType::TAG: + case MajorType::SIMPLE_VALUE: + SetError(Error::CBOR_UNSUPPORTED_VALUE); + return; + } + } + } +} + +void CBORTokenizer::SetToken(CBORTokenTag token_tag, size_t token_byte_length) { + token_tag_ = token_tag; + token_byte_length_ = token_byte_length; +} + +void CBORTokenizer::SetError(Error error) { + token_tag_ = CBORTokenTag::ERROR_VALUE; + status_.error = error; +} + +// ============================================================================= +// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages +// ============================================================================= + +namespace { +// When parsing CBOR, we limit recursion depth for objects and arrays +// to this constant. +static constexpr int kStackLimit = 300; + +// Below are three parsing routines for CBOR, which cover enough +// to roundtrip JSON messages. +bool ParseMap(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out); +bool ParseArray(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out); +bool ParseValue(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out); + +void ParseUTF16String(CBORTokenizer* tokenizer, ParserHandler* out) { + std::vector<uint16_t> value; + span<uint8_t> rep = tokenizer->GetString16WireRep(); + for (size_t ii = 0; ii < rep.size(); ii += 2) + value.push_back((rep[ii + 1] << 8) | rep[ii]); + out->HandleString16(span<uint16_t>(value.data(), value.size())); + tokenizer->Next(); +} + +bool ParseUTF8String(CBORTokenizer* tokenizer, ParserHandler* out) { + assert(tokenizer->TokenTag() == CBORTokenTag::STRING8); + out->HandleString8(tokenizer->GetString8()); + tokenizer->Next(); + return true; +} + +bool ParseEnvelope(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out) { + assert(tokenizer->TokenTag() == CBORTokenTag::ENVELOPE); + // Before we enter the envelope, we save the position that we + // expect to see after we're done parsing the envelope contents. + // This way we can compare and produce an error if the contents + // didn't fit exactly into the envelope length. + size_t pos_past_envelope = + tokenizer->Status().pos + tokenizer->GetEnvelopeHeader().outer_size(); + tokenizer->EnterEnvelope(); + switch (tokenizer->TokenTag()) { + case CBORTokenTag::ERROR_VALUE: + out->HandleError(tokenizer->Status()); + return false; + case CBORTokenTag::MAP_START: + if (!ParseMap(stack_depth + 1, tokenizer, out)) + return false; + break; // Continue to check pos_past_envelope below. + case CBORTokenTag::ARRAY_START: + if (!ParseArray(stack_depth + 1, tokenizer, out)) + return false; + break; // Continue to check pos_past_envelope below. + default: + out->HandleError(Status{Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, + tokenizer->Status().pos}); + return false; + } + // The contents of the envelope parsed OK, now check that we're at + // the expected position. + if (pos_past_envelope != tokenizer->Status().pos) { + out->HandleError(Status{Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, + tokenizer->Status().pos}); + return false; + } + return true; +} + +bool ParseValue(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out) { + if (stack_depth > kStackLimit) { + out->HandleError( + Status{Error::CBOR_STACK_LIMIT_EXCEEDED, tokenizer->Status().pos}); + return false; + } + switch (tokenizer->TokenTag()) { + case CBORTokenTag::ERROR_VALUE: + out->HandleError(tokenizer->Status()); + return false; + case CBORTokenTag::DONE: + out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, + tokenizer->Status().pos}); + return false; + case CBORTokenTag::ENVELOPE: + return ParseEnvelope(stack_depth, tokenizer, out); + case CBORTokenTag::TRUE_VALUE: + out->HandleBool(true); + tokenizer->Next(); + return true; + case CBORTokenTag::FALSE_VALUE: + out->HandleBool(false); + tokenizer->Next(); + return true; + case CBORTokenTag::NULL_VALUE: + out->HandleNull(); + tokenizer->Next(); + return true; + case CBORTokenTag::INT32: + out->HandleInt32(tokenizer->GetInt32()); + tokenizer->Next(); + return true; + case CBORTokenTag::DOUBLE: + out->HandleDouble(tokenizer->GetDouble()); + tokenizer->Next(); + return true; + case CBORTokenTag::STRING8: + return ParseUTF8String(tokenizer, out); + case CBORTokenTag::STRING16: + ParseUTF16String(tokenizer, out); + return true; + case CBORTokenTag::BINARY: { + out->HandleBinary(tokenizer->GetBinary()); + tokenizer->Next(); + return true; + } + case CBORTokenTag::MAP_START: + return ParseMap(stack_depth + 1, tokenizer, out); + case CBORTokenTag::ARRAY_START: + return ParseArray(stack_depth + 1, tokenizer, out); + default: + out->HandleError( + Status{Error::CBOR_UNSUPPORTED_VALUE, tokenizer->Status().pos}); + return false; + } +} + +// |bytes| must start with the indefinite length array byte, so basically, +// ParseArray may only be called after an indefinite length array has been +// detected. +bool ParseArray(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out) { + assert(tokenizer->TokenTag() == CBORTokenTag::ARRAY_START); + tokenizer->Next(); + out->HandleArrayBegin(); + while (tokenizer->TokenTag() != CBORTokenTag::STOP) { + if (tokenizer->TokenTag() == CBORTokenTag::DONE) { + out->HandleError( + Status{Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, tokenizer->Status().pos}); + return false; + } + if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) { + out->HandleError(tokenizer->Status()); + return false; + } + // Parse value. + if (!ParseValue(stack_depth, tokenizer, out)) + return false; + } + out->HandleArrayEnd(); + tokenizer->Next(); + return true; +} + +// |bytes| must start with the indefinite length array byte, so basically, +// ParseArray may only be called after an indefinite length array has been +// detected. +bool ParseMap(int32_t stack_depth, + CBORTokenizer* tokenizer, + ParserHandler* out) { + assert(tokenizer->TokenTag() == CBORTokenTag::MAP_START); + out->HandleMapBegin(); + tokenizer->Next(); + while (tokenizer->TokenTag() != CBORTokenTag::STOP) { + if (tokenizer->TokenTag() == CBORTokenTag::DONE) { + out->HandleError( + Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer->Status().pos}); + return false; + } + if (tokenizer->TokenTag() == CBORTokenTag::ERROR_VALUE) { + out->HandleError(tokenizer->Status()); + return false; + } + // Parse key. + if (tokenizer->TokenTag() == CBORTokenTag::STRING8) { + if (!ParseUTF8String(tokenizer, out)) + return false; + } else if (tokenizer->TokenTag() == CBORTokenTag::STRING16) { + ParseUTF16String(tokenizer, out); + } else { + out->HandleError( + Status{Error::CBOR_INVALID_MAP_KEY, tokenizer->Status().pos}); + return false; + } + // Parse value. + if (!ParseValue(stack_depth, tokenizer, out)) + return false; + } + out->HandleMapEnd(); + tokenizer->Next(); + return true; +} +} // namespace + +void ParseCBOR(span<uint8_t> bytes, ParserHandler* out) { + if (bytes.empty()) { + out->HandleError(Status{Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0}); + return; + } + CBORTokenizer tokenizer(bytes); + if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) { + out->HandleError(tokenizer.Status()); + return; + } + if (!ParseValue(/*stack_depth=*/0, &tokenizer, out)) + return; + if (tokenizer.TokenTag() == CBORTokenTag::DONE) + return; + if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) { + out->HandleError(tokenizer.Status()); + return; + } + out->HandleError(Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos}); +} + +// ============================================================================= +// cbor::AppendString8EntryToMap - for limited in-place editing of messages +// ============================================================================= + +Status AppendString8EntryToCBORMap(span<uint8_t> string8_key, + span<uint8_t> string8_value, + std::vector<uint8_t>* cbor) { + span<uint8_t> bytes(cbor->data(), cbor->size()); + CBORTokenizer tokenizer(bytes); + if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) + return tokenizer.Status(); + if (tokenizer.TokenTag() != CBORTokenTag::ENVELOPE) + return Status(Error::CBOR_INVALID_ENVELOPE, 0); + EnvelopeHeader env_header = tokenizer.GetEnvelopeHeader(); + size_t old_size = cbor->size(); + if (old_size != env_header.outer_size()) + return Status(Error::CBOR_INVALID_ENVELOPE, 0); + assert(env_header.content_size() > 0); + if (tokenizer.GetEnvelopeContents()[0] != EncodeIndefiniteLengthMapStart()) + return Status(Error::CBOR_MAP_START_EXPECTED, env_header.header_size()); + if (bytes[bytes.size() - 1] != EncodeStop()) + return Status(Error::CBOR_MAP_STOP_EXPECTED, cbor->size() - 1); + // We generally accept envelope headers with size specified in all possible + // widths, but when it comes to modifying, we only support the fixed 4 byte + // widths that we produce. + const size_t byte_string_pos = bytes[1] == kCBOREnvelopeTag ? 2 : 1; + if (bytes[byte_string_pos] != kInitialByteFor32BitLengthByteString) + return Status(Error::CBOR_INVALID_ENVELOPE, byte_string_pos); + cbor->pop_back(); + EncodeString8(string8_key, cbor); + EncodeString8(string8_value, cbor); + cbor->push_back(EncodeStop()); + size_t new_envelope_size = + env_header.content_size() + (cbor->size() - old_size); + if (new_envelope_size > std::numeric_limits<uint32_t>::max()) + return Status(Error::CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED, 0); + std::vector<uint8_t>::iterator out = + cbor->begin() + env_header.header_size() - sizeof(int32_t); + *(out++) = (new_envelope_size >> 24) & 0xff; + *(out++) = (new_envelope_size >> 16) & 0xff; + *(out++) = (new_envelope_size >> 8) & 0xff; + *(out) = new_envelope_size & 0xff; + return Status(); +} +} // namespace cbor +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/cbor.h b/deps/inspector_protocol/crdtp/cbor.h new file mode 100644 index 00000000000000..2d925fad5cc30b --- /dev/null +++ b/deps/inspector_protocol/crdtp/cbor.h @@ -0,0 +1,330 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_CBOR_H_ +#define CRDTP_CBOR_H_ + +#include <cstddef> +#include <cstdint> +#include <memory> +#include <string> +#include <vector> + +#include "export.h" +#include "parser_handler.h" +#include "span.h" + +namespace crdtp { +namespace cbor { +// The binary encoding for the inspector protocol follows the CBOR specification +// (RFC 7049). Additional constraints: +// - Only indefinite length maps and arrays are supported. +// - Maps and arrays are wrapped with an envelope, that is, a +// CBOR tag with value 24 followed by a byte string specifying +// the byte length of the enclosed map / array. The byte string +// must use a 32 bit wide length. +// - At the top level, a message must be an indefinite length map +// wrapped by an envelope. +// - Maximal size for messages is 2^32 (4 GB). +// - For scalars, we support only the int32_t range, encoded as +// UNSIGNED/NEGATIVE (major types 0 / 1). +// - UTF16 strings, including with unbalanced surrogate pairs, are encoded +// as CBOR BYTE_STRING (major type 2). For such strings, the number of +// bytes encoded must be even. +// - UTF8 strings (major type 3) are supported. +// - 7 bit US-ASCII strings must always be encoded as UTF8 strings, never +// as UTF16 strings. +// - Arbitrary byte arrays, in the inspector protocol called 'binary', +// are encoded as BYTE_STRING (major type 2), prefixed with a byte +// indicating base64 when rendered as JSON. + +// ============================================================================= +// Detecting CBOR content +// ============================================================================= + +// Checks whether |msg| is a cbor message. +CRDTP_EXPORT bool IsCBORMessage(span<uint8_t> msg); + +// Performs a leightweight check of |msg|. +// Disallows: +// - Empty message +// - Not starting with the two bytes 0xd8, 0x5a +// - Empty envelope (all length bytes are 0) +// - Not starting with a map after the envelope stanza +// DevTools messages should pass this check. +CRDTP_EXPORT Status CheckCBORMessage(span<uint8_t> msg); + +// ============================================================================= +// Encoding individual CBOR items +// ============================================================================= + +// Some constants for CBOR tokens that only take a single byte on the wire. +CRDTP_EXPORT uint8_t EncodeTrue(); +CRDTP_EXPORT uint8_t EncodeFalse(); +CRDTP_EXPORT uint8_t EncodeNull(); +CRDTP_EXPORT uint8_t EncodeIndefiniteLengthArrayStart(); +CRDTP_EXPORT uint8_t EncodeIndefiniteLengthMapStart(); +CRDTP_EXPORT uint8_t EncodeStop(); + +// Encodes |value| as |UNSIGNED| (major type 0) iff >= 0, or |NEGATIVE| +// (major type 1) iff < 0. +CRDTP_EXPORT void EncodeInt32(int32_t value, std::vector<uint8_t>* out); + +// Encodes a UTF16 string as a BYTE_STRING (major type 2). Each utf16 +// character in |in| is emitted with most significant byte first, +// appending to |out|. +CRDTP_EXPORT void EncodeString16(span<uint16_t> in, std::vector<uint8_t>* out); + +// Encodes a UTF8 string |in| as STRING (major type 3). +CRDTP_EXPORT void EncodeString8(span<uint8_t> in, std::vector<uint8_t>* out); + +// Encodes the given |latin1| string as STRING8. +// If any non-ASCII character is present, it will be represented +// as a 2 byte UTF8 sequence. +CRDTP_EXPORT void EncodeFromLatin1(span<uint8_t> latin1, + std::vector<uint8_t>* out); + +// Encodes the given |utf16| string as STRING8 if it's entirely US-ASCII. +// Otherwise, encodes as STRING16. +CRDTP_EXPORT void EncodeFromUTF16(span<uint16_t> utf16, + std::vector<uint8_t>* out); + +// Encodes arbitrary binary data in |in| as a BYTE_STRING (major type 2) with +// definitive length, prefixed with tag 22 indicating expected conversion to +// base64 (see RFC 7049, Table 3 and Section 2.4.4.2). +CRDTP_EXPORT void EncodeBinary(span<uint8_t> in, std::vector<uint8_t>* out); + +// Encodes / decodes a double as Major type 7 (SIMPLE_VALUE), +// with additional info = 27, followed by 8 bytes in big endian. +CRDTP_EXPORT void EncodeDouble(double value, std::vector<uint8_t>* out); + +// ============================================================================= +// cbor::EnvelopeEncoder - for wrapping submessages +// ============================================================================= + +// An envelope indicates the byte length of a wrapped item. +// We use this for maps and array, which allows the decoder +// to skip such (nested) values whole sale. +// It's implemented as a CBOR tag (major type 6) with additional +// info = 24, followed by a byte string with a 32 bit length value; +// so the maximal structure that we can wrap is 2^32 bits long. +// See also: https://tools.ietf.org/html/rfc7049#section-2.4.4.1 +class CRDTP_EXPORT EnvelopeEncoder { + public: + // Emits the envelope start bytes and records the position for the + // byte size in |byte_size_pos_|. Also emits empty bytes for the + // byte sisze so that encoding can continue. + void EncodeStart(std::vector<uint8_t>* out); + // This records the current size in |out| at position byte_size_pos_. + // Returns true iff successful. + bool EncodeStop(std::vector<uint8_t>* out); + + private: + size_t byte_size_pos_ = 0; +}; + +class CRDTP_EXPORT EnvelopeHeader { + public: + EnvelopeHeader() = default; + ~EnvelopeHeader() = default; + + // Parse envelope. Implies that `in` accomodates the entire size of envelope. + static StatusOr<EnvelopeHeader> Parse(span<uint8_t> in); + // Parse envelope, but allow `in` to only include the beginning of the + // envelope. + static StatusOr<EnvelopeHeader> ParseFromFragment(span<uint8_t> in); + + size_t header_size() const { return header_size_; } + size_t content_size() const { return content_size_; } + size_t outer_size() const { return header_size_ + content_size_; } + + private: + EnvelopeHeader(size_t header_size, size_t content_size) + : header_size_(header_size), content_size_(content_size) {} + + size_t header_size_ = 0; + size_t content_size_ = 0; +}; + +// ============================================================================= +// cbor::NewCBOREncoder - for encoding from a streaming parser +// ============================================================================= + +// This can be used to convert to CBOR, by passing the return value to a parser +// that drives it. The handler will encode into |out|, and iff an error occurs +// it will set |status| to an error and clear |out|. Otherwise, |status.ok()| +// will be |true|. +CRDTP_EXPORT std::unique_ptr<ParserHandler> NewCBOREncoder( + std::vector<uint8_t>* out, + Status* status); + +// ============================================================================= +// cbor::CBORTokenizer - for parsing individual CBOR items +// ============================================================================= + +// Tags for the tokens within a CBOR message that CBORTokenizer understands. +// Note that this is not the same terminology as the CBOR spec (RFC 7049), +// but rather, our adaptation. For instance, we lump unsigned and signed +// major type into INT32 here (and disallow values outside the int32_t range). +enum class CBORTokenTag { + // Encountered an error in the structure of the message. Consult + // status() for details. + ERROR_VALUE, + // Booleans and NULL. + TRUE_VALUE, + FALSE_VALUE, + NULL_VALUE, + // An int32_t (signed 32 bit integer). + INT32, + // A double (64 bit floating point). + DOUBLE, + // A UTF8 string. + STRING8, + // A UTF16 string. + STRING16, + // A binary string. + BINARY, + // Starts an indefinite length map; after the map start we expect + // alternating keys and values, followed by STOP. + MAP_START, + // Starts an indefinite length array; after the array start we + // expect values, followed by STOP. + ARRAY_START, + // Ends a map or an array. + STOP, + // An envelope indicator, wrapping a map or array. + // Internally this carries the byte length of the wrapped + // map or array. While CBORTokenizer::Next() will read / skip the entire + // envelope, CBORTokenizer::EnterEnvelope() reads the tokens + // inside of it. + ENVELOPE, + // We've reached the end there is nothing else to read. + DONE, +}; + +// The major types from RFC 7049 Section 2.1. +enum class MajorType { + UNSIGNED = 0, + NEGATIVE = 1, + BYTE_STRING = 2, + STRING = 3, + ARRAY = 4, + MAP = 5, + TAG = 6, + SIMPLE_VALUE = 7 +}; + +// CBORTokenizer segments a CBOR message, presenting the tokens therein as +// numbers, strings, etc. This is not a complete CBOR parser, but makes it much +// easier to implement one (e.g. ParseCBOR, above). It can also be used to parse +// messages partially. +class CRDTP_EXPORT CBORTokenizer { + public: + explicit CBORTokenizer(span<uint8_t> bytes); + ~CBORTokenizer(); + + // Identifies the current token that we're looking at, + // or ERROR_VALUE (in which ase ::Status() has details) + // or DONE (if we're past the last token). + CBORTokenTag TokenTag() const; + + // Advances to the next token. + void Next(); + // Can only be called if TokenTag() == CBORTokenTag::ENVELOPE. + // While Next() would skip past the entire envelope / what it's + // wrapping, EnterEnvelope positions the cursor inside of the envelope, + // letting the client explore the nested structure. + void EnterEnvelope(); + + // If TokenTag() is CBORTokenTag::ERROR_VALUE, then Status().error describes + // the error more precisely; otherwise it'll be set to Error::OK. + // In either case, Status().pos is the current position. + struct Status Status() const; + + // The following methods retrieve the token values. They can only + // be called if TokenTag() matches. + + // To be called only if ::TokenTag() == CBORTokenTag::INT32. + int32_t GetInt32() const; + + // To be called only if ::TokenTag() == CBORTokenTag::DOUBLE. + double GetDouble() const; + + // To be called only if ::TokenTag() == CBORTokenTag::STRING8. + span<uint8_t> GetString8() const; + + // Wire representation for STRING16 is low byte first (little endian). + // To be called only if ::TokenTag() == CBORTokenTag::STRING16. The result is + // guaranteed to have even length. + span<uint8_t> GetString16WireRep() const; + + // To be called only if ::TokenTag() == CBORTokenTag::BINARY. + span<uint8_t> GetBinary() const; + + // To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE. + // Returns the envelope including its payload; message which + // can be passed to the CBORTokenizer constructor, which will + // then see the envelope token first (looking at it a second time, + // basically). + span<uint8_t> GetEnvelope() const; + + // To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE. + // Returns only the payload inside the envelope, e.g., a map + // or an array. This is not a complete message by our + // IsCBORMessage definition, since it doesn't include the + // enclosing envelope (the header, basically). + span<uint8_t> GetEnvelopeContents() const; + + // To be called only if ::TokenTag() == CBORTokenTag::ENVELOPE. + // Returns the envelope header. + const EnvelopeHeader& GetEnvelopeHeader() const; + + private: + void ReadNextToken(); + void SetToken(CBORTokenTag token, size_t token_byte_length); + void SetError(Error error); + + const span<uint8_t> bytes_; + CBORTokenTag token_tag_; + struct Status status_; + size_t token_byte_length_ = 0; + MajorType token_start_type_; + uint64_t token_start_internal_value_; + EnvelopeHeader envelope_header_; +}; + +// ============================================================================= +// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages +// ============================================================================= + +// Parses a CBOR encoded message from |bytes|, sending events to +// |out|. If an error occurs, sends |out->HandleError|, and parsing stops. +// The client is responsible for discarding the already received information in +// that case. +CRDTP_EXPORT void ParseCBOR(span<uint8_t> bytes, ParserHandler* out); + +// ============================================================================= +// cbor::AppendString8EntryToMap - for limited in-place editing of messages +// ============================================================================= + +// Modifies the |cbor| message by appending a new key/value entry at the end +// of the map. Patches up the envelope size; Status.ok() iff successful. +// If not successful, |cbor| may be corrupted after this call. +CRDTP_EXPORT Status AppendString8EntryToCBORMap(span<uint8_t> string8_key, + span<uint8_t> string8_value, + std::vector<uint8_t>* cbor); + +namespace internals { // Exposed only for writing tests. +CRDTP_EXPORT size_t ReadTokenStart(span<uint8_t> bytes, + cbor::MajorType* type, + uint64_t* value); + +CRDTP_EXPORT void WriteTokenStart(cbor::MajorType type, + uint64_t value, + std::vector<uint8_t>* encoded); +} // namespace internals +} // namespace cbor +} // namespace crdtp + +#endif // CRDTP_CBOR_H_ diff --git a/deps/inspector_protocol/crdtp/cbor_test.cc b/deps/inspector_protocol/crdtp/cbor_test.cc new file mode 100644 index 00000000000000..058cd787d6416b --- /dev/null +++ b/deps/inspector_protocol/crdtp/cbor_test.cc @@ -0,0 +1,1449 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cbor.h" + +#include <array> +#include <clocale> +#include <cmath> +#include <cstdlib> +#include <cstring> +#include <iomanip> +#include <iostream> +#include <sstream> +#include <string> +#include "json.h" +#include "parser_handler.h" +#include "span.h" +#include "status.h" +#include "status_test_support.h" +#include "test_platform.h" + +using testing::ElementsAreArray; +using testing::Eq; + +namespace crdtp { +namespace cbor { +// ============================================================================= +// Detecting CBOR content +// ============================================================================= + +TEST(IsCBORMessage, SomeSmokeTests) { + std::vector<uint8_t> empty; + EXPECT_FALSE(IsCBORMessage(SpanFrom(empty))); + std::vector<uint8_t> hello = {'H', 'e', 'l', 'o', ' ', 't', + 'h', 'e', 'r', 'e', '!'}; + EXPECT_FALSE(IsCBORMessage(SpanFrom(hello))); + std::vector<uint8_t> example = {0xd8, 0x5a, 0, 0, 0, 0}; + EXPECT_TRUE(IsCBORMessage(SpanFrom(example))); + std::vector<uint8_t> one = {0xd8, 0x5a, 0, 0, 0, 1, 1}; + EXPECT_TRUE(IsCBORMessage(SpanFrom(one))); +} + +TEST(CheckCBORMessage, SmallestValidExample) { + // The smallest example that we consider valid for this lightweight check is + // an empty dictionary inside of an envelope. + std::vector<uint8_t> empty_dict = { + 0xd8, 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop()}; + Status status = CheckCBORMessage(SpanFrom(empty_dict)); + EXPECT_THAT(status, StatusIsOk()); +} + +TEST(CheckCBORMessage, ValidCBORButNotValidMessage) { + // The CBOR parser supports parsing values that aren't messages. E.g., this is + // the encoded unsigned int 7 (CBOR really encodes it as a single byte with + // value 7). + std::vector<uint8_t> not_a_message = {7}; + + // Show that the parser (happily) decodes it into JSON + std::string json; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&json, &status); + ParseCBOR(SpanFrom(not_a_message), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ("7", json); + + // ... but it's not a message. + EXPECT_THAT(CheckCBORMessage(SpanFrom(not_a_message)), + StatusIs(Error::CBOR_INVALID_START_BYTE, 0)); +} + +TEST(CheckCBORMessage, EmptyMessage) { + std::vector<uint8_t> empty; + Status status = CheckCBORMessage(SpanFrom(empty)); + EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0)); +} + +TEST(CheckCBORMessage, InvalidStartByte) { + // Here we test that some actual json, which usually starts with {, is not + // considered CBOR. CBOR messages must start with 0xd8, 0x5a, the envelope + // start bytes. + Status status = CheckCBORMessage(SpanFrom("{\"msg\": \"Hello, world.\"}")); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_START_BYTE, 0)); +} + +TEST(CheckCBORMessage, InvalidEnvelopes) { + std::vector<uint8_t> bytes = {0xd8, 0x5a}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 2)); + bytes = {0xd8, 0x5a, 0}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 3)); + bytes = {0xd8, 0x5a, 0, 0}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 4)); + bytes = {0xd8, 0x5a, 0, 0, 0}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 5)); + bytes = {0xd8, 0x5a, 0, 0, 0, 0}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, 6)); +} + +TEST(CheckCBORMessage, MapStartExpected) { + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, 1}; + EXPECT_THAT(CheckCBORMessage(SpanFrom(bytes)), + StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, 6)); +} + +// ============================================================================= +// Encoding individual CBOR items +// cbor::CBORTokenizer - for parsing individual CBOR items +// ============================================================================= + +// +// EncodeInt32 / CBORTokenTag::INT32 +// +TEST(EncodeDecodeInt32Test, Roundtrips23) { + // This roundtrips the int32_t value 23 through the pair of EncodeInt32 / + // CBORTokenizer; this is interesting since 23 is encoded as a single byte. + std::vector<uint8_t> encoded; + EncodeInt32(23, &encoded); + // first three bits: major type = 0; remaining five bits: additional info = + // value 23. + EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{23}})); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(23, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, RoundtripsUint8) { + // This roundtrips the int32_t value 42 through the pair of EncodeInt32 / + // CBORTokenizer. This is different from Roundtrip23 because 42 is encoded + // in an extra byte after the initial one. + std::vector<uint8_t> encoded; + EncodeInt32(42, &encoded); + // first three bits: major type = 0; + // remaining five bits: additional info = 24, indicating payload is uint8. + EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 2>{{24, 42}})); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(42, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, RoundtripsUint16) { + // 500 is encoded as a uint16 after the initial byte. + std::vector<uint8_t> encoded; + EncodeInt32(500, &encoded); + // 1 for initial byte, 2 for uint16. + EXPECT_EQ(3u, encoded.size()); + // first three bits: major type = 0; + // remaining five bits: additional info = 25, indicating payload is uint16. + EXPECT_EQ(25, encoded[0]); + EXPECT_EQ(0x01, encoded[1]); + EXPECT_EQ(0xf4, encoded[2]); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(500, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, RoundtripsInt32Max) { + // std::numeric_limits<int32_t> is encoded as a uint32 after the initial byte. + std::vector<uint8_t> encoded; + EncodeInt32(std::numeric_limits<int32_t>::max(), &encoded); + // 1 for initial byte, 4 for the uint32. + // first three bits: major type = 0; + // remaining five bits: additional info = 26, indicating payload is uint32. + EXPECT_THAT( + encoded, + ElementsAreArray(std::array<uint8_t, 5>{{26, 0x7f, 0xff, 0xff, 0xff}})); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(std::numeric_limits<int32_t>::max(), tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, RoundtripsInt32Min) { + // std::numeric_limits<int32_t> is encoded as a uint32 (4 unsigned bytes) + // after the initial byte, which effectively carries the sign by + // designating the token as NEGATIVE. + std::vector<uint8_t> encoded; + EncodeInt32(std::numeric_limits<int32_t>::min(), &encoded); + // 1 for initial byte, 4 for the uint32. + // first three bits: major type = 1; + // remaining five bits: additional info = 26, indicating payload is uint32. + EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 5>{ + {1 << 5 | 26, 0x7f, 0xff, 0xff, 0xff}})); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(std::numeric_limits<int32_t>::min(), tokenizer.GetInt32()); + // It's nice to see how the min int32 value reads in hex: + // That is, -1 minus the unsigned payload (0x7fffffff, see above). + int32_t expected = -1 - 0x7fffffff; + EXPECT_EQ(expected, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, CantRoundtripUint32) { + // 0xdeadbeef is a value which does not fit below + // std::numerical_limits<int32_t>::max(), so we can't encode + // it with EncodeInt32. However, CBOR does support this, so we + // encode it here manually with the internal routine, just to observe + // that it's considered an invalid int32 by CBORTokenizer. + std::vector<uint8_t> encoded; + internals::WriteTokenStart(MajorType::UNSIGNED, 0xdeadbeef, &encoded); + // 1 for initial byte, 4 for the uint32. + // first three bits: major type = 0; + // remaining five bits: additional info = 26, indicating payload is uint32. + EXPECT_THAT( + encoded, + ElementsAreArray(std::array<uint8_t, 5>{{26, 0xde, 0xad, 0xbe, 0xef}})); + + // Now try to decode; we treat this as an invalid INT32. + CBORTokenizer tokenizer(SpanFrom(encoded)); + // 0xdeadbeef is > std::numerical_limits<int32_t>::max(). + EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIs(Error::CBOR_INVALID_INT32, 0u)); +} + +TEST(EncodeDecodeInt32Test, DecodeErrorCases) { + struct TestCase { + std::vector<uint8_t> data; + std::string msg; + }; + std::vector<TestCase> tests{{ + TestCase{ + {24}, + "additional info = 24 would require 1 byte of payload (but it's 0)"}, + TestCase{{27, 0xaa, 0xbb, 0xcc}, + "additional info = 27 would require 8 bytes of payload (but " + "it's 3)"}, + TestCase{{29}, "additional info = 29 isn't recognized"}, + TestCase{{1 << 5 | 27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + "Max UINT64 payload is outside the allowed range"}, + TestCase{{1 << 5 | 26, 0xff, 0xff, 0xff, 0xff}, + "Max UINT32 payload is outside the allowed range"}, + TestCase{{1 << 5 | 26, 0x80, 0x00, 0x00, 0x00}, + "UINT32 payload w/ high bit set is outside the allowed range"}, + }}; + for (const TestCase& test : tests) { + SCOPED_TRACE(test.msg); + CBORTokenizer tokenizer(SpanFrom(test.data)); + EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIs(Error::CBOR_INVALID_INT32, 0u)); + } +} + +TEST(EncodeDecodeInt32Test, RoundtripsMinus24) { + // This roundtrips the int32_t value -24 through the pair of EncodeInt32 / + // CBORTokenizer; this is interesting since -24 is encoded as + // a single byte as NEGATIVE, and it tests the specific encoding + // (note how for unsigned the single byte covers values up to 23). + // Additional examples are covered in RoundtripsAdditionalExamples. + std::vector<uint8_t> encoded; + EncodeInt32(-24, &encoded); + // first three bits: major type = 1; remaining five bits: additional info = + // value 23. + EXPECT_THAT(encoded, ElementsAreArray(std::array<uint8_t, 1>{{1 << 5 | 23}})); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(-24, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeInt32Test, RoundtripsAdditionalNegativeExamples) { + std::vector<int32_t> examples = {-1, + -10, + -24, + -25, + -300, + -30000, + -300 * 1000, + -1000 * 1000, + -1000 * 1000 * 1000, + std::numeric_limits<int32_t>::min()}; + for (int32_t example : examples) { + SCOPED_TRACE(std::string("example ") + std::to_string(example)); + std::vector<uint8_t> encoded; + EncodeInt32(example, &encoded); + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::INT32, tokenizer.TokenTag()); + EXPECT_EQ(example, tokenizer.GetInt32()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); + } +} + +// +// EncodeString16 / CBORTokenTag::STRING16 +// +TEST(EncodeDecodeString16Test, RoundtripsEmpty) { + // This roundtrips the empty utf16 string through the pair of EncodeString16 / + // CBORTokenizer. + std::vector<uint8_t> encoded; + EncodeString16(span<uint16_t>(), &encoded); + EXPECT_EQ(1u, encoded.size()); + // first three bits: major type = 2; remaining five bits: additional info = + // size 0. + EXPECT_EQ(2 << 5, encoded[0]); + + // Reverse direction: decode with CBORTokenizer. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); + span<uint8_t> decoded_string16_wirerep = tokenizer.GetString16WireRep(); + EXPECT_TRUE(decoded_string16_wirerep.empty()); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +// On the wire, we STRING16 is encoded as little endian (least +// significant byte first). The host may or may not be little endian, +// so this routine follows the advice in +// https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html. +std::vector<uint16_t> String16WireRepToHost(span<uint8_t> in) { + // must be even number of bytes. + CHECK_EQ(in.size() & 1, 0u); + std::vector<uint16_t> host_out; + for (size_t ii = 0; ii < in.size(); ii += 2) + host_out.push_back(in[ii + 1] << 8 | in[ii]); + return host_out; +} + +TEST(EncodeDecodeString16Test, RoundtripsHelloWorld) { + // This roundtrips the hello world message which is given here in utf16 + // characters. 0xd83c, 0xdf0e: UTF16 encoding for the "Earth Globe Americas" + // character, 🌎. + std::array<uint16_t, 10> msg{ + {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}}; + std::vector<uint8_t> encoded; + EncodeString16(span<uint16_t>(msg.data(), msg.size()), &encoded); + // This will be encoded as BYTE_STRING of length 20, so the 20 is encoded in + // the additional info part of the initial byte. Payload is two bytes for each + // UTF16 character. + uint8_t initial_byte = /*major type=*/2 << 5 | /*additional info=*/20; + std::array<uint8_t, 21> encoded_expected = { + {initial_byte, 'H', 0, 'e', 0, 'l', 0, 'l', 0, 'o', 0, + ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}}; + EXPECT_THAT(encoded, ElementsAreArray(encoded_expected)); + + // Now decode to complete the roundtrip. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); + std::vector<uint16_t> decoded = + String16WireRepToHost(tokenizer.GetString16WireRep()); + EXPECT_THAT(decoded, ElementsAreArray(msg)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); + + // For bonus points, we look at the decoded message in UTF8 as well so we can + // easily see it on the terminal screen. + std::string utf8_decoded = UTF16ToUTF8(SpanFrom(decoded)); + EXPECT_EQ("Hello, 🌎.", utf8_decoded); +} + +TEST(EncodeDecodeString16Test, Roundtrips500) { + // We roundtrip a message that has 250 16 bit values. Each of these are just + // set to their index. 250 is interesting because the cbor spec uses a + // BYTE_STRING of length 500 for one of their examples of how to encode the + // start of it (section 2.1) so it's easy for us to look at the first three + // bytes closely. + std::vector<uint16_t> two_fifty; + for (uint16_t ii = 0; ii < 250; ++ii) + two_fifty.push_back(ii); + std::vector<uint8_t> encoded; + EncodeString16(span<uint16_t>(two_fifty.data(), two_fifty.size()), &encoded); + EXPECT_EQ(3u + 250u * 2, encoded.size()); + // Now check the first three bytes: + // Major type: 2 (BYTE_STRING) + // Additional information: 25, indicating size is represented by 2 bytes. + // Bytes 1 and 2 encode 500 (0x01f4). + EXPECT_EQ(2 << 5 | 25, encoded[0]); + EXPECT_EQ(0x01, encoded[1]); + EXPECT_EQ(0xf4, encoded[2]); + + // Now decode to complete the roundtrip. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); + std::vector<uint16_t> decoded = + String16WireRepToHost(tokenizer.GetString16WireRep()); + EXPECT_THAT(decoded, ElementsAreArray(two_fifty)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeString16Test, ErrorCases) { + struct TestCase { + std::vector<uint8_t> data; + std::string msg; + }; + std::vector<TestCase> tests{ + {TestCase{{2 << 5 | 1, 'a'}, + "length must be divisible by 2 (but it's 1)"}, + TestCase{{2 << 5 | 29}, "additional info = 29 isn't recognized"}, + TestCase{{2 << 5 | 9, 1, 2, 3, 4, 5, 6, 7, 8}, + "length (9) points just past the end of the test case"}, + TestCase{{2 << 5 | 27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 'a', 'b', 'c'}, + "large length pointing past the end of the test case"}}}; + for (const TestCase& test : tests) { + SCOPED_TRACE(test.msg); + CBORTokenizer tokenizer(SpanFrom(test.data)); + EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIs(Error::CBOR_INVALID_STRING16, 0u)); + } +} + +// +// EncodeString8 / CBORTokenTag::STRING8 +// +TEST(EncodeDecodeString8Test, RoundtripsHelloWorld) { + // This roundtrips the hello world message which is given here in utf8 + // characters. 🌎 is a four byte utf8 character. + std::string utf8_msg = "Hello, 🌎."; + std::vector<uint8_t> msg(utf8_msg.begin(), utf8_msg.end()); + std::vector<uint8_t> encoded; + EncodeString8(SpanFrom(utf8_msg), &encoded); + // This will be encoded as STRING of length 12, so the 12 is encoded in + // the additional info part of the initial byte. Payload is one byte per + // utf8 byte. + uint8_t initial_byte = /*major type=*/3 << 5 | /*additional info=*/12; + std::array<uint8_t, 13> encoded_expected = {{initial_byte, 'H', 'e', 'l', 'l', + 'o', ',', ' ', 0xF0, 0x9f, 0x8c, + 0x8e, '.'}}; + EXPECT_THAT(encoded, ElementsAreArray(encoded_expected)); + + // Now decode to complete the roundtrip. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + std::vector<uint8_t> decoded(tokenizer.GetString8().begin(), + tokenizer.GetString8().end()); + EXPECT_THAT(decoded, ElementsAreArray(msg)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeString8Test, ErrorCases) { + struct TestCase { + std::vector<uint8_t> data; + std::string msg; + }; + std::vector<TestCase> tests{ + {TestCase{{3 << 5 | 29}, "additional info = 29 isn't recognized"}, + TestCase{{3 << 5 | 9, 1, 2, 3, 4, 5, 6, 7, 8}, + "length (9) points just past the end of the test case"}, + TestCase{{3 << 5 | 27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 'a', 'b', 'c'}, + "large length pointing past the end of the test case"}}}; + for (const TestCase& test : tests) { + SCOPED_TRACE(test.msg); + CBORTokenizer tokenizer(SpanFrom(test.data)); + EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIs(Error::CBOR_INVALID_STRING8, 0u)); + } +} + +TEST(EncodeFromLatin1Test, ConvertsToUTF8IfNeeded) { + std::vector<std::pair<std::string, std::string>> examples = { + {"Hello, world.", "Hello, world."}, + {"Above: \xDC" + "ber", + "Above: Über"}, + {"\xA5 500 are about \xA3 3.50; a y with umlaut is \xFF", + "¥ 500 are about £ 3.50; a y with umlaut is ÿ"}}; + + for (const auto& example : examples) { + const std::string& latin1 = example.first; + const std::string& expected_utf8 = example.second; + std::vector<uint8_t> encoded; + EncodeFromLatin1(SpanFrom(latin1), &encoded); + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + std::vector<uint8_t> decoded(tokenizer.GetString8().begin(), + tokenizer.GetString8().end()); + std::string decoded_str(decoded.begin(), decoded.end()); + EXPECT_THAT(decoded_str, testing::Eq(expected_utf8)); + } +} + +TEST(EncodeFromUTF16Test, ConvertsToUTF8IfEasy) { + std::vector<uint16_t> ascii = {'e', 'a', 's', 'y'}; + std::vector<uint8_t> encoded; + EncodeFromUTF16(span<uint16_t>(ascii.data(), ascii.size()), &encoded); + + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + std::vector<uint8_t> decoded(tokenizer.GetString8().begin(), + tokenizer.GetString8().end()); + std::string decoded_str(decoded.begin(), decoded.end()); + EXPECT_THAT(decoded_str, testing::Eq("easy")); +} + +TEST(EncodeFromUTF16Test, EncodesAsString16IfNeeded) { + // Since this message contains non-ASCII characters, the routine is + // forced to encode as UTF16. We see this below by checking that the + // token tag is STRING16. + std::vector<uint16_t> msg = {'H', 'e', 'l', 'l', 'o', + ',', ' ', 0xd83c, 0xdf0e, '.'}; + std::vector<uint8_t> encoded; + EncodeFromUTF16(span<uint16_t>(msg.data(), msg.size()), &encoded); + + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); + std::vector<uint16_t> decoded = + String16WireRepToHost(tokenizer.GetString16WireRep()); + std::string utf8_decoded = UTF16ToUTF8(SpanFrom(decoded)); + EXPECT_EQ("Hello, 🌎.", utf8_decoded); +} + +// +// EncodeBinary / CBORTokenTag::BINARY +// +TEST(EncodeDecodeBinaryTest, RoundtripsHelloWorld) { + std::vector<uint8_t> binary = {'H', 'e', 'l', 'l', 'o', ',', ' ', + 'w', 'o', 'r', 'l', 'd', '.'}; + std::vector<uint8_t> encoded; + EncodeBinary(span<uint8_t>(binary.data(), binary.size()), &encoded); + // So, on the wire we see that the binary blob travels unmodified. + EXPECT_THAT( + encoded, + ElementsAreArray(std::array<uint8_t, 15>{ + {(6 << 5 | 22), // tag 22 indicating base64 interpretation in JSON + (2 << 5 | 13), // BYTE_STRING (type 2) of length 13 + 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}})); + std::vector<uint8_t> decoded; + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::BINARY, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIsOk()); + decoded = std::vector<uint8_t>(tokenizer.GetBinary().begin(), + tokenizer.GetBinary().end()); + EXPECT_THAT(decoded, ElementsAreArray(binary)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeBinaryTest, ErrorCases) { + struct TestCase { + std::vector<uint8_t> data; + std::string msg; + }; + std::vector<TestCase> tests{{TestCase{ + {6 << 5 | 22, // tag 22 indicating base64 interpretation in JSON + 2 << 5 | 27, // BYTE_STRING (type 2), followed by 8 bytes length + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + "large length pointing past the end of the test case"}}}; + for (const TestCase& test : tests) { + SCOPED_TRACE(test.msg); + CBORTokenizer tokenizer(SpanFrom(test.data)); + EXPECT_EQ(CBORTokenTag::ERROR_VALUE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.Status(), StatusIs(Error::CBOR_INVALID_BINARY, 0u)); + } +} + +// +// EncodeDouble / CBORTokenTag::DOUBLE +// +TEST(EncodeDecodeDoubleTest, RoundtripsWikipediaExample) { + // https://en.wikipedia.org/wiki/Double-precision_floating-point_format + // provides the example of a hex representation 3FD5 5555 5555 5555, which + // approximates 1/3. + + const double kOriginalValue = 1.0 / 3; + std::vector<uint8_t> encoded; + EncodeDouble(kOriginalValue, &encoded); + // first three bits: major type = 7; remaining five bits: additional info = + // value 27. This is followed by 8 bytes of payload (which match Wikipedia). + EXPECT_THAT( + encoded, + ElementsAreArray(std::array<uint8_t, 9>{ + {7 << 5 | 27, 0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}})); + + // Reverse direction: decode and compare with original value. + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag()); + EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(kOriginalValue)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +TEST(EncodeDecodeDoubleTest, RoundtripsAdditionalExamples) { + std::vector<double> examples = {0.0, + 1.0, + -1.0, + 3.1415, + std::numeric_limits<double>::min(), + std::numeric_limits<double>::max(), + std::numeric_limits<double>::infinity(), + std::numeric_limits<double>::quiet_NaN()}; + for (double example : examples) { + SCOPED_TRACE(std::string("example ") + std::to_string(example)); + std::vector<uint8_t> encoded; + EncodeDouble(example, &encoded); + CBORTokenizer tokenizer(SpanFrom(encoded)); + EXPECT_EQ(CBORTokenTag::DOUBLE, tokenizer.TokenTag()); + if (std::isnan(example)) + EXPECT_TRUE(std::isnan(tokenizer.GetDouble())); + else + EXPECT_THAT(tokenizer.GetDouble(), testing::DoubleEq(example)); + tokenizer.Next(); + EXPECT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); + } +} + +TEST(EncodeDecodeEnvelopesTest, MessageWithNestingAndEnvelopeContentsAccess) { + // This encodes and decodes the following message, which has some nesting + // and therefore envelopes. + // { "inner": { "foo" : "bar" } } + // The decoding is done with the Tokenizer, + // and we test both ::GetEnvelopeContents and GetEnvelope here. + std::vector<uint8_t> message; + EnvelopeEncoder envelope; + envelope.EncodeStart(&message); + size_t pos_after_header = message.size(); + message.push_back(EncodeIndefiniteLengthMapStart()); + EncodeString8(SpanFrom("inner"), &message); + size_t pos_inside_inner = message.size(); + EnvelopeEncoder inner_envelope; + inner_envelope.EncodeStart(&message); + size_t pos_inside_inner_contents = message.size(); + message.push_back(EncodeIndefiniteLengthMapStart()); + EncodeString8(SpanFrom("foo"), &message); + EncodeString8(SpanFrom("bar"), &message); + message.push_back(EncodeStop()); + size_t pos_after_inner = message.size(); + inner_envelope.EncodeStop(&message); + message.push_back(EncodeStop()); + envelope.EncodeStop(&message); + + CBORTokenizer tokenizer(SpanFrom(message)); + ASSERT_EQ(CBORTokenTag::ENVELOPE, tokenizer.TokenTag()); + EXPECT_EQ(message.size(), tokenizer.GetEnvelope().size()); + EXPECT_EQ(message.data(), tokenizer.GetEnvelope().data()); + EXPECT_EQ(message.data() + pos_after_header, + tokenizer.GetEnvelopeContents().data()); + EXPECT_EQ(message.size() - pos_after_header, + tokenizer.GetEnvelopeContents().size()); + tokenizer.EnterEnvelope(); + ASSERT_EQ(CBORTokenTag::MAP_START, tokenizer.TokenTag()); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + EXPECT_EQ("inner", std::string(tokenizer.GetString8().begin(), + tokenizer.GetString8().end())); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::ENVELOPE, tokenizer.TokenTag()); + EXPECT_EQ(message.data() + pos_inside_inner, tokenizer.GetEnvelope().data()); + EXPECT_EQ(pos_after_inner - pos_inside_inner, tokenizer.GetEnvelope().size()); + EXPECT_EQ(message.data() + pos_inside_inner_contents, + tokenizer.GetEnvelopeContents().data()); + EXPECT_EQ(pos_after_inner - pos_inside_inner_contents, + tokenizer.GetEnvelopeContents().size()); + tokenizer.EnterEnvelope(); + ASSERT_EQ(CBORTokenTag::MAP_START, tokenizer.TokenTag()); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + EXPECT_EQ("foo", std::string(tokenizer.GetString8().begin(), + tokenizer.GetString8().end())); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); + EXPECT_EQ("bar", std::string(tokenizer.GetString8().begin(), + tokenizer.GetString8().end())); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::STOP, tokenizer.TokenTag()); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::STOP, tokenizer.TokenTag()); + tokenizer.Next(); + ASSERT_EQ(CBORTokenTag::DONE, tokenizer.TokenTag()); +} + +// ============================================================================= +// cbor::NewCBOREncoder - for encoding from a streaming parser +// ============================================================================= + +TEST(JSONToCBOREncoderTest, SevenBitStrings) { + // When a string can be represented as 7 bit ASCII, the encoder will use the + // STRING (major Type 3) type, so the actual characters end up as bytes on the + // wire. + std::vector<uint8_t> encoded; + Status status; + std::unique_ptr<ParserHandler> encoder = NewCBOREncoder(&encoded, &status); + std::vector<uint16_t> utf16 = {'f', 'o', 'o'}; + encoder->HandleString16(span<uint16_t>(utf16.data(), utf16.size())); + EXPECT_THAT(status, StatusIsOk()); + // Here we assert that indeed, seven bit strings are represented as + // bytes on the wire, "foo" is just "foo". + EXPECT_THAT(encoded, + ElementsAreArray(std::array<uint8_t, 4>{ + {/*major type 3*/ 3 << 5 | /*length*/ 3, 'f', 'o', 'o'}})); +} + +TEST(JsonCborRoundtrip, EncodingDecoding) { + // Hits all the cases except binary and error in ParserHandler, first + // parsing a JSON message into CBOR, then parsing it back from CBOR into JSON. + std::string json = + "{" + "\"string\":\"Hello, \\ud83c\\udf0e.\"," + "\"double\":3.1415," + "\"int\":1," + "\"negative int\":-1," + "\"bool\":true," + "\"null\":null," + "\"array\":[1,2,3]" + "}"; + std::vector<uint8_t> encoded; + Status status; + std::unique_ptr<ParserHandler> encoder = NewCBOREncoder(&encoded, &status); + span<uint8_t> ascii_in = SpanFrom(json); + json::ParseJSON(ascii_in, encoder.get()); + std::vector<uint8_t> expected = { + 0xd8, 0x18, // envelope + 0x5a, // byte string with 32 bit length + 0, 0, 0, 95, // length is 95 bytes + }; + expected.push_back(0xbf); // indef length map start + EncodeString8(SpanFrom("string"), &expected); + // This is followed by the encoded string for "Hello, 🌎." + // So, it's the same bytes that we tested above in + // EncodeDecodeString16Test.RoundtripsHelloWorld. + expected.push_back(/*major type=*/2 << 5 | /*additional info=*/20); + for (uint8_t ch : std::array<uint8_t, 20>{ + {'H', 0, 'e', 0, 'l', 0, 'l', 0, 'o', 0, + ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}}) + expected.push_back(ch); + EncodeString8(SpanFrom("double"), &expected); + EncodeDouble(3.1415, &expected); + EncodeString8(SpanFrom("int"), &expected); + EncodeInt32(1, &expected); + EncodeString8(SpanFrom("negative int"), &expected); + EncodeInt32(-1, &expected); + EncodeString8(SpanFrom("bool"), &expected); + expected.push_back(7 << 5 | 21); // RFC 7049 Section 2.3, Table 2: true + EncodeString8(SpanFrom("null"), &expected); + expected.push_back(7 << 5 | 22); // RFC 7049 Section 2.3, Table 2: null + EncodeString8(SpanFrom("array"), &expected); + expected.push_back(0xd8); // envelope (tag first byte) + expected.push_back(0x18); // envelope (tag second byte) + expected.push_back(0x5a); // byte string with 32 bit length + // the length is 5 bytes (that's up to end indef length array below). + for (uint8_t ch : std::array<uint8_t, 4>{{0, 0, 0, 5}}) + expected.push_back(ch); + expected.push_back(0x9f); // RFC 7049 Section 2.2.1, indef length array start + expected.push_back(1); // Three UNSIGNED values (easy since Major Type 0) + expected.push_back(2); + expected.push_back(3); + expected.push_back(0xff); // End indef length array + expected.push_back(0xff); // End indef length map + EXPECT_TRUE(status.ok()); + EXPECT_THAT(encoded, ElementsAreArray(expected)); + + // And now we roundtrip, decoding the message we just encoded. + std::string decoded; + std::unique_ptr<ParserHandler> json_encoder = + json::NewJSONEncoder(&decoded, &status); + ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_encoder.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ(json, decoded); +} + +TEST(JsonCborRoundtrip, MoreRoundtripExamples) { + std::vector<std::string> examples = { + // Tests that after closing a nested objects, additional key/value pairs + // are considered. + "{\"foo\":{\"bar\":1},\"baz\":2}", "{\"foo\":[1,2,3],\"baz\":2}"}; + for (const std::string& json : examples) { + SCOPED_TRACE(std::string("example: ") + json); + std::vector<uint8_t> encoded; + Status status; + std::unique_ptr<ParserHandler> encoder = NewCBOREncoder(&encoded, &status); + span<uint8_t> ascii_in = SpanFrom(json); + json::ParseJSON(ascii_in, encoder.get()); + std::string decoded; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&decoded, &status); + ParseCBOR(span<uint8_t>(encoded.data(), encoded.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ(json, decoded); + } +} + +TEST(JSONToCBOREncoderTest, HelloWorldBinary_WithTripToJson) { + // The ParserHandler::HandleBinary is a special case: The JSON parser + // will never call this method, because JSON does not natively support the + // binary type. So, we can't fully roundtrip. However, the other direction + // works: binary will be rendered in JSON, as a base64 string. So, we make + // calls to the encoder directly here, to construct a message, and one of + // these calls is ::HandleBinary, to which we pass a "binary" string + // containing "Hello, world.". + std::vector<uint8_t> encoded; + Status status; + std::unique_ptr<ParserHandler> encoder = NewCBOREncoder(&encoded, &status); + encoder->HandleMapBegin(); + // Emit a key. + std::vector<uint16_t> key = {'f', 'o', 'o'}; + encoder->HandleString16(SpanFrom(key)); + // Emit the binary payload, an arbitrary array of bytes that happens to + // be the ascii message "Hello, world.". + encoder->HandleBinary(SpanFrom(std::vector<uint8_t>{ + 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'})); + encoder->HandleMapEnd(); + EXPECT_THAT(status, StatusIsOk()); + + // Now drive the json writer via the CBOR decoder. + std::string decoded; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&decoded, &status); + ParseCBOR(SpanFrom(encoded), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + // "Hello, world." in base64 is "SGVsbG8sIHdvcmxkLg==". + EXPECT_EQ("{\"foo\":\"SGVsbG8sIHdvcmxkLg==\"}", decoded); +} + +// ============================================================================= +// cbor::ParseCBOR - for receiving streaming parser events for CBOR messages +// ============================================================================= + +TEST(ParseCBORTest, ParseEmptyCBORMessage) { + // An envelope starting with 0xd8, 0x5a, with the byte length + // of 2, containing a map that's empty (0xbf for map + // start, and 0xff for map end). + std::vector<uint8_t> in = {0xd8, 0x5a, 0, 0, 0, 2, 0xbf, 0xff}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ("{}", out); +} + +TEST(ParseCBORTest, ParseCBORHelloWorld) { + const uint8_t kPayloadLen = 27; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen}; + bytes.push_back(0xbf); // start indef length map. + EncodeString8(SpanFrom("msg"), &bytes); // key: msg + // Now write the value, the familiar "Hello, 🌎." where the globe is expressed + // as two utf16 chars. + bytes.push_back(/*major type=*/2 << 5 | /*additional info=*/20); + for (uint8_t ch : std::array<uint8_t, 20>{ + {'H', 0, 'e', 0, 'l', 0, 'l', 0, 'o', 0, + ',', 0, ' ', 0, 0x3c, 0xd8, 0x0e, 0xdf, '.', 0}}) + bytes.push_back(ch); + bytes.push_back(0xff); // stop byte + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ("{\"msg\":\"Hello, \\ud83c\\udf0e.\"}", out); +} + +TEST(ParseCBORTest, UTF8IsSupportedInKeys) { + const uint8_t kPayloadLen = 11; + std::vector<uint8_t> bytes = {0xd8, 0x5a, // envelope + 0, 0, 0, kPayloadLen}; + bytes.push_back(cbor::EncodeIndefiniteLengthMapStart()); + // Two UTF16 chars. + EncodeString8(SpanFrom("🌎"), &bytes); + // Can be encoded as a single UTF16 char. + EncodeString8(SpanFrom("☾"), &bytes); + bytes.push_back(cbor::EncodeStop()); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ("{\"\\ud83c\\udf0e\":\"\\u263e\"}", out); +} + +TEST(ParseCBORTest, NoInputError) { + std::vector<uint8_t> in = {}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(in.data(), in.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0u)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, UnexpectedEofExpectedValueError) { + constexpr uint8_t kPayloadLen = 5; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + // A key; so value would be next. + EncodeString8(SpanFrom("key"), &bytes); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, + bytes.size())); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, UnexpectedEofInArrayError) { + constexpr uint8_t kPayloadLen = 8; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // The byte for starting a map. + // A key; so value would be next. + EncodeString8(SpanFrom("array"), &bytes); + bytes.push_back(0x9f); // byte for indefinite length array start. + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, + StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, bytes.size())); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, UnexpectedEofInMapError) { + constexpr uint8_t kPayloadLen = 1; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // The byte for starting a map. + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_MAP, 7u)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, EnvelopeEncodingLegacy) { + constexpr uint8_t kPayloadLen = 8; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen}; // envelope + bytes.push_back(cbor::EncodeIndefiniteLengthMapStart()); + EncodeString8(SpanFrom("foo"), &bytes); + EncodeInt32(42, &bytes); + bytes.emplace_back(EncodeStop()); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ(out, "{\"foo\":42}"); +} + +TEST(ParseCBORTest, EnvelopeEncodingBySpec) { + constexpr uint8_t kPayloadLen = 8; + std::vector<uint8_t> bytes = {0xd8, 0x18, 0x5a, 0, + 0, 0, kPayloadLen}; // envelope + bytes.push_back(cbor::EncodeIndefiniteLengthMapStart()); + EncodeString8(SpanFrom("foo"), &bytes); + EncodeInt32(42, &bytes); + bytes.emplace_back(EncodeStop()); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ(out, "{\"foo\":42}"); +} + +TEST(ParseCBORTest, NoEmptyEnvelopesAllowed) { + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, 0}; // envelope + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, + bytes.size())); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, OnlyMapsAndArraysSupportedInsideEnvelopes) { + // The top level is a map with key "foo", and the value + // is an envelope that contains just a number (1). We don't + // allow numbers to be contained in an envelope though, only + // maps and arrays. + constexpr uint8_t kPayloadLen = 8; + std::vector<uint8_t> bytes = {0xd8, + 0x5a, + 0, + 0, + 0, + kPayloadLen, // envelope + EncodeIndefiniteLengthMapStart()}; + EncodeString8(SpanFrom("foo"), &bytes); + for (uint8_t byte : {0xd8, 0x5a, 0, 0, 0, /*payload_len*/ 1}) + bytes.emplace_back(byte); + size_t error_pos = bytes.size(); + bytes.push_back(1); // Envelope contents / payload = number 1. + bytes.emplace_back(EncodeStop()); + + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, + error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidMapKeyError) { + constexpr uint8_t kPayloadLen = 2; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, + 0, 0, kPayloadLen, // envelope + 0xbf, // map start + 7 << 5 | 22}; // null (not a valid map key) + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_MAP_KEY, 7u)); + EXPECT_EQ("", out); +} + +std::vector<uint8_t> MakeNestedCBOR(int depth) { + std::vector<uint8_t> bytes; + std::vector<EnvelopeEncoder> envelopes; + for (int ii = 0; ii < depth; ++ii) { + envelopes.emplace_back(); + envelopes.back().EncodeStart(&bytes); + bytes.push_back(0xbf); // indef length map start + EncodeString8(SpanFrom("key"), &bytes); + } + EncodeString8(SpanFrom("innermost_value"), &bytes); + for (int ii = 0; ii < depth; ++ii) { + bytes.push_back(0xff); // stop byte, finishes map. + envelopes.back().EncodeStop(&bytes); + envelopes.pop_back(); + } + return bytes; +} + +TEST(ParseCBORTest, StackLimitExceededError) { + { // Depth 3: no stack limit exceeded error and is easy to inspect. + std::vector<uint8_t> bytes = MakeNestedCBOR(3); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + EXPECT_EQ("{\"key\":{\"key\":{\"key\":\"innermost_value\"}}}", out); + } + { // Depth 300: no stack limit exceeded. + std::vector<uint8_t> bytes = MakeNestedCBOR(300); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIsOk()); + } + + // We just want to know the length of one opening map so we can compute + // where the error is encountered. So we look at a small example and find + // the second envelope start. + std::vector<uint8_t> small_example = MakeNestedCBOR(3); + size_t opening_segment_size = 1; // Start after the first envelope start. + while (opening_segment_size < small_example.size() && + small_example[opening_segment_size] != 0xd8) + opening_segment_size++; + + { // Depth 301: limit exceeded. + std::vector<uint8_t> bytes = MakeNestedCBOR(301); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, + opening_segment_size * 301)); + } + { // Depth 320: still limit exceeded, and at the same pos as for 1001 + std::vector<uint8_t> bytes = MakeNestedCBOR(320); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, + opening_segment_size * 301)); + } +} + +TEST(ParseCBORTest, UnsupportedValueError) { + constexpr uint8_t kPayloadLen = 6; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + bytes.push_back(6 << 5 | 5); // tags aren't supported yet. + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_UNSUPPORTED_VALUE, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidString16Error) { + constexpr uint8_t kPayloadLen = 11; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + // a BYTE_STRING of length 5 as value; since we interpret these as string16, + // it's going to be invalid as each character would need two bytes, but + // 5 isn't divisible by 2. + bytes.push_back(2 << 5 | 5); + for (int ii = 0; ii < 5; ++ii) + bytes.push_back(' '); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING16, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidString8Error) { + constexpr uint8_t kPayloadLen = 6; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + // a STRING of length 5 as value, but we're at the end of the bytes array + // so it can't be decoded successfully. + bytes.push_back(3 << 5 | 5); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING8, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidBinaryError) { + constexpr uint8_t kPayloadLen = 9; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + bytes.push_back(6 << 5 | 22); // base64 hint for JSON; indicates binary + bytes.push_back(2 << 5 | 10); // BYTE_STRING (major type 2) of length 10 + // Just two garbage bytes, not enough for the binary. + bytes.push_back(0x31); + bytes.push_back(0x23); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_BINARY, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidDoubleError) { + constexpr uint8_t kPayloadLen = 8; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + bytes.push_back(7 << 5 | 27); // initial byte for double + // Just two garbage bytes, not enough to represent an actual double. + bytes.push_back(0x31); + bytes.push_back(0x23); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_DOUBLE, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, InvalidSignedError) { + constexpr uint8_t kPayloadLen = 14; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + size_t error_pos = bytes.size(); + // uint64_t max is a perfectly fine value to encode as CBOR unsigned, + // but we don't support this since we only cover the int32_t range. + internals::WriteTokenStart(MajorType::UNSIGNED, + std::numeric_limits<uint64_t>::max(), &bytes); + EXPECT_EQ(kPayloadLen, bytes.size() - 6); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_INT32, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, TrailingJunk) { + constexpr uint8_t kPayloadLen = 12; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + EncodeString8(SpanFrom("value"), &bytes); + bytes.push_back(0xff); // Up to here, it's a perfectly fine msg. + ASSERT_EQ(kPayloadLen, bytes.size() - 6); + size_t error_pos = bytes.size(); + // Now write some trailing junk after the message. + EncodeString8(SpanFrom("trailing junk"), &bytes); + internals::WriteTokenStart(MajorType::UNSIGNED, + std::numeric_limits<uint64_t>::max(), &bytes); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_TRAILING_JUNK, error_pos)); + EXPECT_EQ("", out); +} + +TEST(ParseCBORTest, EnvelopeContentsLengthMismatch) { + constexpr uint8_t kPartialPayloadLen = 5; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, + 0, 0, kPartialPayloadLen, // envelope + 0xbf}; // map start + EncodeString8(SpanFrom("key"), &bytes); + // kPartialPayloadLen would need to indicate the length of the entire map, + // all the way past the 0xff map stop character. Instead, it only covers + // a portion of the map. + EXPECT_EQ(bytes.size() - 6, kPartialPayloadLen); + EncodeString8(SpanFrom("value"), &bytes); + bytes.push_back(0xff); // map stop + + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get()); + EXPECT_THAT(status, StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, + bytes.size())); + EXPECT_EQ("", out); +} + +// ============================================================================= +// cbor::EnvelopeHeader - for parsing envelope headers +// ============================================================================= +// Note most of converage for this is historically on a higher level of +// ParseCBOR(). This provides just a few essnetial scenarios for now. + +template <typename T> +class EnvelopeHeaderTest : public ::testing::Test {}; + +TEST(EnvelopeHeaderTest, EnvelopeStartLegacy) { + std::vector<uint8_t> bytes = {0xd8, // Tag start + 0x5a, // Byte string, 4 bytes length + 0, 0, 0, 2, // Length + 0xbf, 0xff}; // map start / map end + auto result = EnvelopeHeader::Parse(SpanFrom(bytes)); + ASSERT_THAT(result.status(), StatusIsOk()); + EXPECT_THAT((*result).header_size(), Eq(6u)); + EXPECT_THAT((*result).content_size(), Eq(2u)); + EXPECT_THAT((*result).outer_size(), Eq(8u)); +} + +TEST(EnvelopeHeaderTest, EnvelopeStartSpecCompliant) { + std::vector<uint8_t> bytes = {0xd8, // Tag start + 0x18, // Tag type (CBOR) + 0x5a, // Byte string, 4 bytes length + 0, 0, 0, 2, // Length + 0xbf, 0xff}; // map start / map end + auto result = EnvelopeHeader::Parse(SpanFrom(bytes)); + ASSERT_THAT(result.status(), StatusIsOk()); + EXPECT_THAT((*result).header_size(), Eq(7u)); + EXPECT_THAT((*result).content_size(), Eq(2u)); + EXPECT_THAT((*result).outer_size(), Eq(9u)); +} + +TEST(EnvelopeHeaderTest, EnvelopeStartShortLen) { + std::vector<uint8_t> bytes = {0xd8, // Tag start + 0x18, // Tag type (CBOR) + 0x58, // Byte string, 1 byte length + 2, // Length + 0xbf, 0xff}; // map start / map end + auto result = EnvelopeHeader::Parse(SpanFrom(bytes)); + ASSERT_THAT(result.status(), StatusIsOk()); + EXPECT_THAT((*result).header_size(), Eq(4u)); + EXPECT_THAT((*result).content_size(), Eq(2u)); + EXPECT_THAT((*result).outer_size(), Eq(6u)); +} + +TEST(EnvelopeHeaderTest, ParseFragment) { + std::vector<uint8_t> bytes = {0xd8, // Tag start + 0x18, // Tag type (CBOR) + 0x5a, // Byte string, 4 bytes length + 0, 0, 0, 20, 0xbf}; // map start + auto result = EnvelopeHeader::ParseFromFragment(SpanFrom(bytes)); + ASSERT_THAT(result.status(), StatusIsOk()); + EXPECT_THAT((*result).header_size(), Eq(7u)); + EXPECT_THAT((*result).content_size(), Eq(20u)); + EXPECT_THAT((*result).outer_size(), Eq(27u)); + + result = EnvelopeHeader::Parse(SpanFrom(bytes)); + ASSERT_THAT(result.status(), + StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, 8)); +} + +// ============================================================================= +// cbor::AppendString8EntryToMap - for limited in-place editing of messages +// ============================================================================= + +template <typename T> +class AppendString8EntryToMapTest : public ::testing::Test {}; + +using ContainerTestTypes = ::testing::Types<std::vector<uint8_t>, std::string>; +TYPED_TEST_SUITE(AppendString8EntryToMapTest, ContainerTestTypes); + +TEST(AppendString8EntryToMapTest, AppendsEntrySuccessfully) { + constexpr uint8_t kPayloadLen = 12; + std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen, // envelope + 0xbf}; // map start + size_t pos_before_payload = bytes.size() - 1; + EncodeString8(SpanFrom("key"), &bytes); + EncodeString8(SpanFrom("value"), &bytes); + bytes.push_back(0xff); // A perfectly fine cbor message. + EXPECT_EQ(kPayloadLen, bytes.size() - pos_before_payload); + + std::vector<uint8_t> msg(bytes.begin(), bytes.end()); + + Status status = + AppendString8EntryToCBORMap(SpanFrom("foo"), SpanFrom("bar"), &msg); + EXPECT_THAT(status, StatusIsOk()); + std::string out; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(SpanFrom(msg), json_writer.get()); + EXPECT_EQ("{\"key\":\"value\",\"foo\":\"bar\"}", out); + EXPECT_THAT(status, StatusIsOk()); +} + +TYPED_TEST(AppendString8EntryToMapTest, AppendThreeEntries) { + std::vector<uint8_t> encoded = { + 0xd8, 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop()}; + EXPECT_THAT( + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &encoded), + StatusIsOk()); + EXPECT_THAT(AppendString8EntryToCBORMap(SpanFrom("key1"), SpanFrom("value1"), + &encoded), + StatusIsOk()); + EXPECT_THAT(AppendString8EntryToCBORMap(SpanFrom("key2"), SpanFrom("value2"), + &encoded), + StatusIsOk()); + TypeParam msg(encoded.begin(), encoded.end()); + std::string out; + Status status; + std::unique_ptr<ParserHandler> json_writer = + json::NewJSONEncoder(&out, &status); + ParseCBOR(SpanFrom(msg), json_writer.get()); + EXPECT_EQ("{\"key\":\"value\",\"key1\":\"value1\",\"key2\":\"value2\"}", out); + EXPECT_THAT(status, StatusIsOk()); +} + +TEST(AppendString8EntryToMapTest, MapStartExpected_Error) { + std::vector<uint8_t> msg = { + 0xd8, 0x5a, 0, 0, 0, 1, EncodeIndefiniteLengthArrayStart()}; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_START_EXPECTED, 6u)); +} + +TEST(AppendString8EntryToMapTest, MapStopExpected_Error) { + std::vector<uint8_t> msg = { + 0xd8, 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), 42}; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_STOP_EXPECTED, 7u)); +} + +TEST(AppendString8EntryToMapTest, InvalidEnvelope_Error) { + { // Second byte is wrong. + std::vector<uint8_t> msg = { + 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop(), 0}; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_ENVELOPE, 0u)); + } + { // Second byte is wrong. + std::vector<uint8_t> msg = { + 0xd8, 0x7a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop()}; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_ENVELOPE, 1u)); + } + { // Invalid envelope size example. + std::vector<uint8_t> msg = { + 0xd8, 0x5a, 0, 0, 0, 3, EncodeIndefiniteLengthMapStart(), EncodeStop(), + }; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, + StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, 8u)); + } + { // Invalid envelope size example. + std::vector<uint8_t> msg = { + 0xd8, 0x5a, 0, 0, 0, 1, EncodeIndefiniteLengthMapStart(), EncodeStop(), + }; + Status status = + AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg); + EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_ENVELOPE, 0)); + } +} +} // namespace cbor +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/dispatch.cc b/deps/inspector_protocol/crdtp/dispatch.cc new file mode 100644 index 00000000000000..b36b91ad0e37e6 --- /dev/null +++ b/deps/inspector_protocol/crdtp/dispatch.cc @@ -0,0 +1,584 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "dispatch.h" + +#include <cassert> +#include "cbor.h" +#include "error_support.h" +#include "find_by_first.h" +#include "frontend_channel.h" +#include "protocol_core.h" + +namespace crdtp { +// ============================================================================= +// DispatchResponse - Error status and chaining / fall through +// ============================================================================= + +// static +DispatchResponse DispatchResponse::Success() { + DispatchResponse result; + result.code_ = DispatchCode::SUCCESS; + return result; +} + +// static +DispatchResponse DispatchResponse::FallThrough() { + DispatchResponse result; + result.code_ = DispatchCode::FALL_THROUGH; + return result; +} + +// static +DispatchResponse DispatchResponse::ParseError(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::PARSE_ERROR; + result.message_ = std::move(message); + return result; +} + +// static +DispatchResponse DispatchResponse::InvalidRequest(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::INVALID_REQUEST; + result.message_ = std::move(message); + return result; +} + +// static +DispatchResponse DispatchResponse::MethodNotFound(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::METHOD_NOT_FOUND; + result.message_ = std::move(message); + return result; +} + +// static +DispatchResponse DispatchResponse::InvalidParams(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::INVALID_PARAMS; + result.message_ = std::move(message); + return result; +} + +// static +DispatchResponse DispatchResponse::InternalError() { + DispatchResponse result; + result.code_ = DispatchCode::INTERNAL_ERROR; + result.message_ = "Internal error"; + return result; +} + +// static +DispatchResponse DispatchResponse::ServerError(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::SERVER_ERROR; + result.message_ = std::move(message); + return result; +} + +// static +DispatchResponse DispatchResponse::SessionNotFound(std::string message) { + DispatchResponse result; + result.code_ = DispatchCode::SESSION_NOT_FOUND; + result.message_ = std::move(message); + return result; +} + +// ============================================================================= +// Dispatchable - a shallow parser for CBOR encoded DevTools messages +// ============================================================================= +Dispatchable::Dispatchable(span<uint8_t> serialized) : serialized_(serialized) { + Status s = cbor::CheckCBORMessage(serialized); + if (!s.ok()) { + status_ = {Error::MESSAGE_MUST_BE_AN_OBJECT, s.pos}; + return; + } + cbor::CBORTokenizer tokenizer(serialized); + if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) { + status_ = tokenizer.Status(); + return; + } + + // We checked for the envelope start byte above, so the tokenizer + // must agree here, since it's not an error. + assert(tokenizer.TokenTag() == cbor::CBORTokenTag::ENVELOPE); + + // Before we enter the envelope, we save the position that we + // expect to see after we're done parsing the envelope contents. + // This way we can compare and produce an error if the contents + // didn't fit exactly into the envelope length. + const size_t pos_past_envelope = + tokenizer.Status().pos + tokenizer.GetEnvelopeHeader().outer_size(); + tokenizer.EnterEnvelope(); + if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) { + status_ = tokenizer.Status(); + return; + } + if (tokenizer.TokenTag() != cbor::CBORTokenTag::MAP_START) { + status_ = {Error::MESSAGE_MUST_BE_AN_OBJECT, tokenizer.Status().pos}; + return; + } + assert(tokenizer.TokenTag() == cbor::CBORTokenTag::MAP_START); + tokenizer.Next(); // Now we should be pointed at the map key. + while (tokenizer.TokenTag() != cbor::CBORTokenTag::STOP) { + switch (tokenizer.TokenTag()) { + case cbor::CBORTokenTag::DONE: + status_ = + Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer.Status().pos}; + return; + case cbor::CBORTokenTag::ERROR_VALUE: + status_ = tokenizer.Status(); + return; + case cbor::CBORTokenTag::STRING8: + if (!MaybeParseProperty(&tokenizer)) + return; + break; + default: + // We require the top-level keys to be UTF8 (US-ASCII in practice). + status_ = Status{Error::CBOR_INVALID_MAP_KEY, tokenizer.Status().pos}; + return; + } + } + tokenizer.Next(); + if (!has_call_id_) { + status_ = Status{Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY, + tokenizer.Status().pos}; + return; + } + if (method_.empty()) { + status_ = Status{Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY, + tokenizer.Status().pos}; + return; + } + // The contents of the envelope parsed OK, now check that we're at + // the expected position. + if (pos_past_envelope != tokenizer.Status().pos) { + status_ = Status{Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, + tokenizer.Status().pos}; + return; + } + if (tokenizer.TokenTag() != cbor::CBORTokenTag::DONE) { + status_ = Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos}; + return; + } +} + +bool Dispatchable::ok() const { + return status_.ok(); +} + +DispatchResponse Dispatchable::DispatchError() const { + // TODO(johannes): Replace with DCHECK / similar? + if (status_.ok()) + return DispatchResponse::Success(); + + if (status_.IsMessageError()) + return DispatchResponse::InvalidRequest(status_.Message()); + return DispatchResponse::ParseError(status_.ToASCIIString()); +} + +bool Dispatchable::MaybeParseProperty(cbor::CBORTokenizer* tokenizer) { + span<uint8_t> property_name = tokenizer->GetString8(); + if (SpanEquals(SpanFrom("id"), property_name)) + return MaybeParseCallId(tokenizer); + if (SpanEquals(SpanFrom("method"), property_name)) + return MaybeParseMethod(tokenizer); + if (SpanEquals(SpanFrom("params"), property_name)) + return MaybeParseParams(tokenizer); + if (SpanEquals(SpanFrom("sessionId"), property_name)) + return MaybeParseSessionId(tokenizer); + status_ = + Status{Error::MESSAGE_HAS_UNKNOWN_PROPERTY, tokenizer->Status().pos}; + return false; +} + +bool Dispatchable::MaybeParseCallId(cbor::CBORTokenizer* tokenizer) { + if (has_call_id_) { + status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos}; + return false; + } + tokenizer->Next(); + if (tokenizer->TokenTag() != cbor::CBORTokenTag::INT32) { + status_ = Status{Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY, + tokenizer->Status().pos}; + return false; + } + call_id_ = tokenizer->GetInt32(); + has_call_id_ = true; + tokenizer->Next(); + return true; +} + +bool Dispatchable::MaybeParseMethod(cbor::CBORTokenizer* tokenizer) { + if (!method_.empty()) { + status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos}; + return false; + } + tokenizer->Next(); + if (tokenizer->TokenTag() != cbor::CBORTokenTag::STRING8) { + status_ = Status{Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY, + tokenizer->Status().pos}; + return false; + } + method_ = tokenizer->GetString8(); + tokenizer->Next(); + return true; +} + +bool Dispatchable::MaybeParseParams(cbor::CBORTokenizer* tokenizer) { + if (params_seen_) { + status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos}; + return false; + } + params_seen_ = true; + tokenizer->Next(); + if (tokenizer->TokenTag() == cbor::CBORTokenTag::NULL_VALUE) { + tokenizer->Next(); + return true; + } + if (tokenizer->TokenTag() != cbor::CBORTokenTag::ENVELOPE) { + status_ = Status{Error::MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY, + tokenizer->Status().pos}; + return false; + } + params_ = tokenizer->GetEnvelope(); + tokenizer->Next(); + return true; +} + +bool Dispatchable::MaybeParseSessionId(cbor::CBORTokenizer* tokenizer) { + if (!session_id_.empty()) { + status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos}; + return false; + } + tokenizer->Next(); + if (tokenizer->TokenTag() != cbor::CBORTokenTag::STRING8) { + status_ = Status{Error::MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY, + tokenizer->Status().pos}; + return false; + } + session_id_ = tokenizer->GetString8(); + tokenizer->Next(); + return true; +} + +namespace { +class ProtocolError : public Serializable { + public: + explicit ProtocolError(DispatchResponse dispatch_response) + : dispatch_response_(std::move(dispatch_response)) {} + + void AppendSerialized(std::vector<uint8_t>* out) const override { + Status status; + std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status); + encoder->HandleMapBegin(); + if (has_call_id_) { + encoder->HandleString8(SpanFrom("id")); + encoder->HandleInt32(call_id_); + } + encoder->HandleString8(SpanFrom("error")); + encoder->HandleMapBegin(); + encoder->HandleString8(SpanFrom("code")); + encoder->HandleInt32(static_cast<int32_t>(dispatch_response_.Code())); + encoder->HandleString8(SpanFrom("message")); + encoder->HandleString8(SpanFrom(dispatch_response_.Message())); + if (!data_.empty()) { + encoder->HandleString8(SpanFrom("data")); + encoder->HandleString8(SpanFrom(data_)); + } + encoder->HandleMapEnd(); + encoder->HandleMapEnd(); + assert(status.ok()); + } + + void SetCallId(int call_id) { + has_call_id_ = true; + call_id_ = call_id; + } + void SetData(std::string data) { data_ = std::move(data); } + + private: + const DispatchResponse dispatch_response_; + std::string data_; + int call_id_ = 0; + bool has_call_id_ = false; +}; +} // namespace + +// ============================================================================= +// Helpers for creating protocol cresponses and notifications. +// ============================================================================= + +std::unique_ptr<Serializable> CreateErrorResponse( + int call_id, + DispatchResponse dispatch_response) { + auto protocol_error = + std::make_unique<ProtocolError>(std::move(dispatch_response)); + protocol_error->SetCallId(call_id); + return protocol_error; +} + +std::unique_ptr<Serializable> CreateErrorResponse( + int call_id, + DispatchResponse dispatch_response, + const DeserializerState& state) { + auto protocol_error = + std::make_unique<ProtocolError>(std::move(dispatch_response)); + protocol_error->SetCallId(call_id); + // TODO(caseq): should we plumb the call name here? + protocol_error->SetData(state.ErrorMessage(MakeSpan("params"))); + return protocol_error; +} + +std::unique_ptr<Serializable> CreateErrorNotification( + DispatchResponse dispatch_response) { + return std::make_unique<ProtocolError>(std::move(dispatch_response)); +} + +namespace { +class Response : public Serializable { + public: + Response(int call_id, std::unique_ptr<Serializable> params) + : call_id_(call_id), params_(std::move(params)) {} + + void AppendSerialized(std::vector<uint8_t>* out) const override { + Status status; + std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status); + encoder->HandleMapBegin(); + encoder->HandleString8(SpanFrom("id")); + encoder->HandleInt32(call_id_); + encoder->HandleString8(SpanFrom("result")); + if (params_) { + params_->AppendSerialized(out); + } else { + encoder->HandleMapBegin(); + encoder->HandleMapEnd(); + } + encoder->HandleMapEnd(); + assert(status.ok()); + } + + private: + const int call_id_; + std::unique_ptr<Serializable> params_; +}; + +class Notification : public Serializable { + public: + Notification(const char* method, std::unique_ptr<Serializable> params) + : method_(method), params_(std::move(params)) {} + + void AppendSerialized(std::vector<uint8_t>* out) const override { + Status status; + std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status); + encoder->HandleMapBegin(); + encoder->HandleString8(SpanFrom("method")); + encoder->HandleString8(SpanFrom(method_)); + encoder->HandleString8(SpanFrom("params")); + if (params_) { + params_->AppendSerialized(out); + } else { + encoder->HandleMapBegin(); + encoder->HandleMapEnd(); + } + encoder->HandleMapEnd(); + assert(status.ok()); + } + + private: + const char* method_; + std::unique_ptr<Serializable> params_; +}; +} // namespace + +std::unique_ptr<Serializable> CreateResponse( + int call_id, + std::unique_ptr<Serializable> params) { + return std::make_unique<Response>(call_id, std::move(params)); +} + +std::unique_ptr<Serializable> CreateNotification( + const char* method, + std::unique_ptr<Serializable> params) { + return std::make_unique<Notification>(method, std::move(params)); +} + +// ============================================================================= +// DomainDispatcher - Dispatching betwen protocol methods within a domain. +// ============================================================================= +DomainDispatcher::WeakPtr::WeakPtr(DomainDispatcher* dispatcher) + : dispatcher_(dispatcher) {} + +DomainDispatcher::WeakPtr::~WeakPtr() { + if (dispatcher_) + dispatcher_->weak_ptrs_.erase(this); +} + +DomainDispatcher::Callback::~Callback() = default; + +void DomainDispatcher::Callback::dispose() { + backend_impl_ = nullptr; +} + +DomainDispatcher::Callback::Callback( + std::unique_ptr<DomainDispatcher::WeakPtr> backend_impl, + int call_id, + span<uint8_t> method, + span<uint8_t> message) + : backend_impl_(std::move(backend_impl)), + call_id_(call_id), + method_(method), + message_(message.begin(), message.end()) {} + +void DomainDispatcher::Callback::sendIfActive( + std::unique_ptr<Serializable> partialMessage, + const DispatchResponse& response) { + if (!backend_impl_ || !backend_impl_->get()) + return; + backend_impl_->get()->sendResponse(call_id_, response, + std::move(partialMessage)); + backend_impl_ = nullptr; +} + +void DomainDispatcher::Callback::fallThroughIfActive() { + if (!backend_impl_ || !backend_impl_->get()) + return; + backend_impl_->get()->channel()->FallThrough(call_id_, method_, + SpanFrom(message_)); + backend_impl_ = nullptr; +} + +DomainDispatcher::DomainDispatcher(FrontendChannel* frontendChannel) + : frontend_channel_(frontendChannel) {} + +DomainDispatcher::~DomainDispatcher() { + clearFrontend(); +} + +void DomainDispatcher::sendResponse(int call_id, + const DispatchResponse& response, + std::unique_ptr<Serializable> result) { + if (!frontend_channel_) + return; + std::unique_ptr<Serializable> serializable; + if (response.IsError()) { + serializable = CreateErrorResponse(call_id, response); + } else { + serializable = CreateResponse(call_id, std::move(result)); + } + frontend_channel_->SendProtocolResponse(call_id, std::move(serializable)); +} + +void DomainDispatcher::ReportInvalidParams(const Dispatchable& dispatchable, + const DeserializerState& state) { + assert(!state.status().ok()); + if (frontend_channel_) { + frontend_channel_->SendProtocolResponse( + dispatchable.CallId(), + CreateErrorResponse( + dispatchable.CallId(), + DispatchResponse::InvalidParams("Invalid parameters"), state)); + } +} + +void DomainDispatcher::clearFrontend() { + frontend_channel_ = nullptr; + for (auto& weak : weak_ptrs_) + weak->dispose(); + weak_ptrs_.clear(); +} + +std::unique_ptr<DomainDispatcher::WeakPtr> DomainDispatcher::weakPtr() { + auto weak = std::make_unique<DomainDispatcher::WeakPtr>(this); + weak_ptrs_.insert(weak.get()); + return weak; +} + +// ============================================================================= +// UberDispatcher - dispatches between domains (backends). +// ============================================================================= +UberDispatcher::DispatchResult::DispatchResult(bool method_found, + std::function<void()> runnable) + : method_found_(method_found), runnable_(runnable) {} + +void UberDispatcher::DispatchResult::Run() { + if (!runnable_) + return; + runnable_(); + runnable_ = nullptr; +} + +UberDispatcher::UberDispatcher(FrontendChannel* frontend_channel) + : frontend_channel_(frontend_channel) { + assert(frontend_channel); +} + +UberDispatcher::~UberDispatcher() = default; + +constexpr size_t kNotFound = std::numeric_limits<size_t>::max(); + +namespace { +size_t DotIdx(span<uint8_t> method) { + const void* p = memchr(method.data(), '.', method.size()); + return p ? reinterpret_cast<const uint8_t*>(p) - method.data() : kNotFound; +} +} // namespace + +UberDispatcher::DispatchResult UberDispatcher::Dispatch( + const Dispatchable& dispatchable) const { + span<uint8_t> method = FindByFirst(redirects_, dispatchable.Method(), + /*default_value=*/dispatchable.Method()); + size_t dot_idx = DotIdx(method); + if (dot_idx != kNotFound) { + span<uint8_t> domain = method.subspan(0, dot_idx); + span<uint8_t> command = method.subspan(dot_idx + 1); + DomainDispatcher* dispatcher = FindByFirst(dispatchers_, domain); + if (dispatcher) { + std::function<void(const Dispatchable&)> dispatched = + dispatcher->Dispatch(command); + if (dispatched) { + return DispatchResult( + true, [dispatchable, dispatched = std::move(dispatched)]() { + dispatched(dispatchable); + }); + } + } + } + return DispatchResult(false, [this, dispatchable]() { + frontend_channel_->SendProtocolResponse( + dispatchable.CallId(), + CreateErrorResponse(dispatchable.CallId(), + DispatchResponse::MethodNotFound( + "'" + + std::string(dispatchable.Method().begin(), + dispatchable.Method().end()) + + "' wasn't found"))); + }); +} + +template <typename T> +struct FirstLessThan { + bool operator()(const std::pair<span<uint8_t>, T>& left, + const std::pair<span<uint8_t>, T>& right) { + return SpanLessThan(left.first, right.first); + } +}; + +void UberDispatcher::WireBackend( + span<uint8_t> domain, + const std::vector<std::pair<span<uint8_t>, span<uint8_t>>>& + sorted_redirects, + std::unique_ptr<DomainDispatcher> dispatcher) { + auto it = redirects_.insert(redirects_.end(), sorted_redirects.begin(), + sorted_redirects.end()); + std::inplace_merge(redirects_.begin(), it, redirects_.end(), + FirstLessThan<span<uint8_t>>()); + auto jt = dispatchers_.insert(dispatchers_.end(), + std::make_pair(domain, std::move(dispatcher))); + std::inplace_merge(dispatchers_.begin(), jt, dispatchers_.end(), + FirstLessThan<std::unique_ptr<DomainDispatcher>>()); +} + +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/dispatch.h b/deps/inspector_protocol/crdtp/dispatch.h new file mode 100644 index 00000000000000..8da8255c6fe882 --- /dev/null +++ b/deps/inspector_protocol/crdtp/dispatch.h @@ -0,0 +1,313 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_DISPATCH_H_ +#define CRDTP_DISPATCH_H_ + +#include <cassert> +#include <cstdint> +#include <functional> +#include <string> +#include <unordered_set> +#include "export.h" +#include "serializable.h" +#include "span.h" +#include "status.h" + +namespace crdtp { +class DeserializerState; +class ErrorSupport; +class FrontendChannel; +namespace cbor { +class CBORTokenizer; +} // namespace cbor + +// ============================================================================= +// DispatchResponse - Error status and chaining / fall through +// ============================================================================= +enum class DispatchCode { + SUCCESS = 1, + FALL_THROUGH = 2, + // For historical reasons, these error codes correspond to commonly used + // XMLRPC codes (e.g. see METHOD_NOT_FOUND in + // https://github.com/python/cpython/blob/main/Lib/xmlrpc/client.py). + PARSE_ERROR = -32700, + INVALID_REQUEST = -32600, + METHOD_NOT_FOUND = -32601, + INVALID_PARAMS = -32602, + INTERNAL_ERROR = -32603, + SERVER_ERROR = -32000, + SESSION_NOT_FOUND = SERVER_ERROR - 1, +}; + +// Information returned by command handlers. Usually returned after command +// execution attempts. +class CRDTP_EXPORT DispatchResponse { + public: + const std::string& Message() const { return message_; } + + DispatchCode Code() const { return code_; } + + bool IsSuccess() const { return code_ == DispatchCode::SUCCESS; } + bool IsFallThrough() const { return code_ == DispatchCode::FALL_THROUGH; } + bool IsError() const { return code_ < DispatchCode::SUCCESS; } + + static DispatchResponse Success(); + static DispatchResponse FallThrough(); + + // Indicates that a message could not be parsed. E.g., malformed JSON. + static DispatchResponse ParseError(std::string message); + + // Indicates that a request is lacking required top-level properties + // ('id', 'method'), has top-level properties of the wrong type, or has + // unknown top-level properties. + static DispatchResponse InvalidRequest(std::string message); + + // Indicates that a protocol method such as "Page.bringToFront" could not be + // dispatched because it's not known to the (domain) dispatcher. + static DispatchResponse MethodNotFound(std::string message); + + // Indicates that the params sent to a domain handler are invalid. + static DispatchResponse InvalidParams(std::string message); + + // Used for application level errors, e.g. within protocol agents. + static DispatchResponse InternalError(); + + // Used for application level errors, e.g. within protocol agents. + static DispatchResponse ServerError(std::string message); + + // Indicate that session with the id specified in the protocol message + // was not found (e.g. because it has already been detached). + static DispatchResponse SessionNotFound(std::string message); + + private: + DispatchResponse() = default; + DispatchCode code_; + std::string message_; +}; + +// ============================================================================= +// Dispatchable - a shallow parser for CBOR encoded DevTools messages +// ============================================================================= + +// This parser extracts only the known top-level fields from a CBOR encoded map; +// method, id, sessionId, and params. +class CRDTP_EXPORT Dispatchable { + public: + // This constructor parses the |serialized| message. If successful, + // |ok()| will yield |true|, and |Method()|, |SessionId()|, |CallId()|, + // |Params()| can be used to access, the extracted contents. Otherwise, + // |ok()| will yield |false|, and |DispatchError()| can be + // used to send a response or notification to the client. + explicit Dispatchable(span<uint8_t> serialized); + + // The serialized message that we just parsed. + span<uint8_t> Serialized() const { return serialized_; } + + // Yields true if parsing was successful. This is cheaper than calling + // ::DispatchError(). + bool ok() const; + + // If !ok(), returns a DispatchResponse with appropriate code and error + // which can be sent to the client as a response or notification. + DispatchResponse DispatchError() const; + + // Top level field: the command to be executed, fully qualified by + // domain. E.g. "Page.createIsolatedWorld". + span<uint8_t> Method() const { return method_; } + // Used to identify protocol connections attached to a specific + // target. See Target.attachToTarget, Target.setAutoAttach. + span<uint8_t> SessionId() const { return session_id_; } + // The call id, a sequence number that's used in responses to indicate + // the request to which the response belongs. + int32_t CallId() const { return call_id_; } + bool HasCallId() const { return has_call_id_; } + // The payload of the request in CBOR format. The |Dispatchable| parser does + // not parse into this; it only provides access to its raw contents here. + span<uint8_t> Params() const { return params_; } + + private: + bool MaybeParseProperty(cbor::CBORTokenizer* tokenizer); + bool MaybeParseCallId(cbor::CBORTokenizer* tokenizer); + bool MaybeParseMethod(cbor::CBORTokenizer* tokenizer); + bool MaybeParseParams(cbor::CBORTokenizer* tokenizer); + bool MaybeParseSessionId(cbor::CBORTokenizer* tokenizer); + + span<uint8_t> serialized_; + + Status status_; + + bool has_call_id_ = false; + int32_t call_id_; + span<uint8_t> method_; + bool params_seen_ = false; + span<uint8_t> params_; + span<uint8_t> session_id_; +}; + +// ============================================================================= +// Helpers for creating protocol cresponses and notifications. +// ============================================================================= + +// The resulting notifications can be sent to a protocol client, +// usually via a FrontendChannel (see frontend_channel.h). + +CRDTP_EXPORT std::unique_ptr<Serializable> CreateErrorResponse( + int callId, + DispatchResponse dispatch_response); + +CRDTP_EXPORT std::unique_ptr<Serializable> CreateErrorNotification( + DispatchResponse dispatch_response); + +CRDTP_EXPORT std::unique_ptr<Serializable> CreateResponse( + int callId, + std::unique_ptr<Serializable> params); + +CRDTP_EXPORT std::unique_ptr<Serializable> CreateNotification( + const char* method, + std::unique_ptr<Serializable> params = nullptr); + +// ============================================================================= +// DomainDispatcher - Dispatching betwen protocol methods within a domain. +// ============================================================================= + +// This class is subclassed by |DomainDispatcherImpl|, which we generate per +// DevTools domain. It contains routines called from the generated code, +// e.g. ::MaybeReportInvalidParams, which are optimized for small code size. +// The most important method is ::Dispatch, which implements method dispatch +// by command name lookup. +class CRDTP_EXPORT DomainDispatcher { + public: + class CRDTP_EXPORT WeakPtr { + public: + explicit WeakPtr(DomainDispatcher*); + ~WeakPtr(); + DomainDispatcher* get() { return dispatcher_; } + void dispose() { dispatcher_ = nullptr; } + + private: + DomainDispatcher* dispatcher_; + }; + + class CRDTP_EXPORT Callback { + public: + virtual ~Callback(); + void dispose(); + + protected: + // |method| must point at static storage (a C++ string literal in practice). + Callback(std::unique_ptr<WeakPtr> backend_impl, + int call_id, + span<uint8_t> method, + span<uint8_t> message); + + void sendIfActive(std::unique_ptr<Serializable> partialMessage, + const DispatchResponse& response); + void fallThroughIfActive(); + + private: + std::unique_ptr<WeakPtr> backend_impl_; + int call_id_; + // Subclasses of this class are instantiated from generated code which + // passes a string literal for the method name to the constructor. So the + // storage for |method| is the binary of the running process. + span<uint8_t> method_; + std::vector<uint8_t> message_; + }; + + explicit DomainDispatcher(FrontendChannel*); + virtual ~DomainDispatcher(); + + // Given a |command_name| without domain qualification, looks up the + // corresponding method. If the method is not found, returns nullptr. + // Otherwise, Returns a closure that will parse the provided + // Dispatchable.params() to a protocol object and execute the + // apprpropriate method. If the parsing fails it will issue an + // error response on the frontend channel, otherwise it will execute the + // command. + virtual std::function<void(const Dispatchable&)> Dispatch( + span<uint8_t> command_name) = 0; + + // Sends a response to the client via the channel. + void sendResponse(int call_id, + const DispatchResponse&, + std::unique_ptr<Serializable> result = nullptr); + + void ReportInvalidParams(const Dispatchable& dispatchable, + const DeserializerState& state); + + FrontendChannel* channel() { return frontend_channel_; } + + void clearFrontend(); + + std::unique_ptr<WeakPtr> weakPtr(); + + private: + FrontendChannel* frontend_channel_; + std::unordered_set<WeakPtr*> weak_ptrs_; +}; + +// ============================================================================= +// UberDispatcher - dispatches between domains (backends). +// ============================================================================= +class CRDTP_EXPORT UberDispatcher { + public: + // Return type for ::Dispatch. + class CRDTP_EXPORT DispatchResult { + public: + DispatchResult(bool method_found, std::function<void()> runnable); + + // Indicates whether the method was found, that is, it could be dispatched + // to a backend registered with this dispatcher. + bool MethodFound() const { return method_found_; } + + // Runs the dispatched result. This will send the appropriate error + // responses if the method wasn't found or if something went wrong during + // parameter parsing. + void Run(); + + private: + bool method_found_; + std::function<void()> runnable_; + }; + + // |frontend_hannel| can't be nullptr. + explicit UberDispatcher(FrontendChannel* frontend_channel); + virtual ~UberDispatcher(); + + // Dispatches the provided |dispatchable| considering all redirects and domain + // handlers registered with this uber dispatcher. Also see |DispatchResult|. + // |dispatchable.ok()| must hold - callers must check this separately and + // deal with errors. + DispatchResult Dispatch(const Dispatchable& dispatchable) const; + + // Invoked from generated code for wiring domain backends; that is, + // connecting domain handlers to an uber dispatcher. + // See <domain-namespace>::Dispatcher::Wire(UberDispatcher*,Backend*). + FrontendChannel* channel() const { + assert(frontend_channel_); + return frontend_channel_; + } + + // Invoked from generated code for wiring domain backends; that is, + // connecting domain handlers to an uber dispatcher. + // See <domain-namespace>::Dispatcher::Wire(UberDispatcher*,Backend*). + void WireBackend(span<uint8_t> domain, + const std::vector<std::pair<span<uint8_t>, span<uint8_t>>>&, + std::unique_ptr<DomainDispatcher> dispatcher); + + private: + DomainDispatcher* findDispatcher(span<uint8_t> method); + FrontendChannel* const frontend_channel_; + // Pairs of ascii strings of the form ("Domain1.method1","Domain2.method2") + // indicating that the first element of each pair redirects to the second. + // Sorted by first element. + std::vector<std::pair<span<uint8_t>, span<uint8_t>>> redirects_; + // Domain dispatcher instances, sorted by their domain name. + std::vector<std::pair<span<uint8_t>, std::unique_ptr<DomainDispatcher>>> + dispatchers_; +}; +} // namespace crdtp + +#endif // CRDTP_DISPATCH_H_ diff --git a/deps/inspector_protocol/crdtp/dispatch_test.cc b/deps/inspector_protocol/crdtp/dispatch_test.cc new file mode 100644 index 00000000000000..c7290f92961367 --- /dev/null +++ b/deps/inspector_protocol/crdtp/dispatch_test.cc @@ -0,0 +1,444 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <vector> + +#include "cbor.h" +#include "dispatch.h" +#include "error_support.h" +#include "frontend_channel.h" +#include "json.h" +#include "test_platform.h" + +namespace crdtp { +// ============================================================================= +// DispatchResponse - Error status and chaining / fall through +// ============================================================================= +TEST(DispatchResponseTest, OK) { + EXPECT_EQ(DispatchCode::SUCCESS, DispatchResponse::Success().Code()); + EXPECT_TRUE(DispatchResponse::Success().IsSuccess()); +} + +TEST(DispatchResponseTest, ServerError) { + DispatchResponse error = DispatchResponse::ServerError("Oops!"); + EXPECT_FALSE(error.IsSuccess()); + EXPECT_EQ(DispatchCode::SERVER_ERROR, error.Code()); + EXPECT_EQ("Oops!", error.Message()); +} + +TEST(DispatchResponseTest, SessionNotFound) { + DispatchResponse error = DispatchResponse::SessionNotFound("OMG!"); + EXPECT_FALSE(error.IsSuccess()); + EXPECT_EQ(DispatchCode::SESSION_NOT_FOUND, error.Code()); + EXPECT_EQ("OMG!", error.Message()); +} + +TEST(DispatchResponseTest, InternalError) { + DispatchResponse error = DispatchResponse::InternalError(); + EXPECT_FALSE(error.IsSuccess()); + EXPECT_EQ(DispatchCode::INTERNAL_ERROR, error.Code()); + EXPECT_EQ("Internal error", error.Message()); +} + +TEST(DispatchResponseTest, InvalidParams) { + DispatchResponse error = DispatchResponse::InvalidParams("too cool"); + EXPECT_FALSE(error.IsSuccess()); + EXPECT_EQ(DispatchCode::INVALID_PARAMS, error.Code()); + EXPECT_EQ("too cool", error.Message()); +} + +TEST(DispatchResponseTest, FallThrough) { + DispatchResponse error = DispatchResponse::FallThrough(); + EXPECT_FALSE(error.IsSuccess()); + EXPECT_TRUE(error.IsFallThrough()); + EXPECT_EQ(DispatchCode::FALL_THROUGH, error.Code()); +} + +// ============================================================================= +// Dispatchable - a shallow parser for CBOR encoded DevTools messages +// ============================================================================= +TEST(DispatchableTest, MessageMustBeAnObject) { + // Provide no input whatsoever. + span<uint8_t> empty_span; + Dispatchable empty(empty_span); + EXPECT_FALSE(empty.ok()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, empty.DispatchError().Code()); + EXPECT_EQ("Message must be an object", empty.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMustHaveIntegerIdProperty) { + // Construct an empty map inside of an envelope. + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom("{}"), &cbor).ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_FALSE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message must have integer 'id' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMustHaveIntegerIdProperty_IncorrectType) { + // This time we set the id property, but fail to make it an int32. + std::vector<uint8_t> cbor; + ASSERT_TRUE( + json::ConvertJSONToCBOR(SpanFrom("{\"id\":\"foo\"}"), &cbor).ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_FALSE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message must have integer 'id' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMustHaveStringMethodProperty) { + // This time we set the id property, but not the method property. + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom("{\"id\":42}"), &cbor).ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message must have string 'method' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMustHaveStringMethodProperty_IncorrectType) { + // This time we set the method property, but fail to make it a string. + std::vector<uint8_t> cbor; + ASSERT_TRUE( + json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":42}"), &cbor) + .ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message must have string 'method' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMayHaveStringSessionIdProperty) { + // This time, the session id is an int but it should be a string. Method and + // call id are present. + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR( + SpanFrom("{\"id\":42,\"method\":\"Foo.executeBar\"," + "\"sessionId\":42" // int32 is wrong type + "}"), + &cbor) + .ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message may have string 'sessionId' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageMayHaveObjectParamsProperty) { + // This time, we fail to use the correct type for the params property. + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR( + SpanFrom("{\"id\":42,\"method\":\"Foo.executeBar\"," + "\"params\":42" // int32 is wrong type + "}"), + &cbor) + .ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ("Message may have object 'params' property", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, MessageWithUnknownProperty) { + // This time we set the 'unknown' property, so we are told what's allowed. + std::vector<uint8_t> cbor; + ASSERT_TRUE( + json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"unknown\":42}"), &cbor) + .ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code()); + EXPECT_EQ( + "Message has property other than 'id', 'method', 'sessionId', 'params'", + dispatchable.DispatchError().Message()); +} + +TEST(DispatchableTest, DuplicateMapKey) { + const std::array<std::string, 4> jsons = { + {"{\"id\":42,\"id\":42}", "{\"params\":null,\"params\":null}", + "{\"method\":\"foo\",\"method\":\"foo\"}", + "{\"sessionId\":\"42\",\"sessionId\":\"42\"}"}}; + for (const std::string& json : jsons) { + SCOPED_TRACE("json = " + json); + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom(json), &cbor).ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_EQ(DispatchCode::PARSE_ERROR, dispatchable.DispatchError().Code()); + EXPECT_THAT(dispatchable.DispatchError().Message(), + testing::StartsWith("CBOR: duplicate map key at position ")); + } +} + +TEST(DispatchableTest, ValidMessageParsesOK_NoParams) { + const std::array<std::string, 2> jsons = { + {"{\"id\":42,\"method\":\"Foo.executeBar\",\"sessionId\":" + "\"f421ssvaz4\"}", + "{\"id\":42,\"method\":\"Foo.executeBar\",\"sessionId\":\"f421ssvaz4\"," + "\"params\":null}"}}; + for (const std::string& json : jsons) { + SCOPED_TRACE("json = " + json); + std::vector<uint8_t> cbor; + ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom(json), &cbor).ok()); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_TRUE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(42, dispatchable.CallId()); + EXPECT_EQ("Foo.executeBar", std::string(dispatchable.Method().begin(), + dispatchable.Method().end())); + EXPECT_EQ("f421ssvaz4", std::string(dispatchable.SessionId().begin(), + dispatchable.SessionId().end())); + EXPECT_TRUE(dispatchable.Params().empty()); + } +} + +TEST(DispatchableTest, ValidMessageParsesOK_WithParams) { + std::vector<uint8_t> cbor; + cbor::EnvelopeEncoder envelope; + envelope.EncodeStart(&cbor); + cbor.push_back(cbor::EncodeIndefiniteLengthMapStart()); + cbor::EncodeString8(SpanFrom("id"), &cbor); + cbor::EncodeInt32(42, &cbor); + cbor::EncodeString8(SpanFrom("method"), &cbor); + cbor::EncodeString8(SpanFrom("Foo.executeBar"), &cbor); + cbor::EncodeString8(SpanFrom("params"), &cbor); + cbor::EnvelopeEncoder params_envelope; + params_envelope.EncodeStart(&cbor); + // The |Dispatchable| class does not parse into the "params" envelope, + // so we can stick anything into there for the purpose of this test. + // For convenience, we use a String8. + cbor::EncodeString8(SpanFrom("params payload"), &cbor); + params_envelope.EncodeStop(&cbor); + cbor::EncodeString8(SpanFrom("sessionId"), &cbor); + cbor::EncodeString8(SpanFrom("f421ssvaz4"), &cbor); + cbor.push_back(cbor::EncodeStop()); + envelope.EncodeStop(&cbor); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_TRUE(dispatchable.ok()); + EXPECT_TRUE(dispatchable.HasCallId()); + EXPECT_EQ(42, dispatchable.CallId()); + EXPECT_EQ("Foo.executeBar", std::string(dispatchable.Method().begin(), + dispatchable.Method().end())); + EXPECT_EQ("f421ssvaz4", std::string(dispatchable.SessionId().begin(), + dispatchable.SessionId().end())); + cbor::CBORTokenizer params_tokenizer(dispatchable.Params()); + ASSERT_EQ(cbor::CBORTokenTag::ENVELOPE, params_tokenizer.TokenTag()); + params_tokenizer.EnterEnvelope(); + ASSERT_EQ(cbor::CBORTokenTag::STRING8, params_tokenizer.TokenTag()); + EXPECT_EQ("params payload", std::string(params_tokenizer.GetString8().begin(), + params_tokenizer.GetString8().end())); +} + +TEST(DispatchableTest, FaultyCBORTrailingJunk) { + // In addition to the higher level parsing errors, we also catch CBOR + // structural corruption. E.g., in this case, the message would be + // OK but has some extra trailing bytes. + std::vector<uint8_t> cbor; + cbor::EnvelopeEncoder envelope; + envelope.EncodeStart(&cbor); + cbor.push_back(cbor::EncodeIndefiniteLengthMapStart()); + cbor::EncodeString8(SpanFrom("id"), &cbor); + cbor::EncodeInt32(42, &cbor); + cbor::EncodeString8(SpanFrom("method"), &cbor); + cbor::EncodeString8(SpanFrom("Foo.executeBar"), &cbor); + cbor::EncodeString8(SpanFrom("sessionId"), &cbor); + cbor::EncodeString8(SpanFrom("f421ssvaz4"), &cbor); + cbor.push_back(cbor::EncodeStop()); + envelope.EncodeStop(&cbor); + size_t trailing_junk_pos = cbor.size(); + cbor.push_back('t'); + cbor.push_back('r'); + cbor.push_back('a'); + cbor.push_back('i'); + cbor.push_back('l'); + Dispatchable dispatchable(SpanFrom(cbor)); + EXPECT_FALSE(dispatchable.ok()); + EXPECT_EQ(DispatchCode::PARSE_ERROR, dispatchable.DispatchError().Code()); + EXPECT_EQ(57u, trailing_junk_pos); + EXPECT_EQ("CBOR: trailing junk at position 57", + dispatchable.DispatchError().Message()); +} + +// ============================================================================= +// Helpers for creating protocol cresponses and notifications. +// ============================================================================= +TEST(CreateErrorResponseTest, SmokeTest) { + auto serializable = CreateErrorResponse( + 42, DispatchResponse::InvalidParams("invalid params message")); + std::string json; + auto status = + json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json); + ASSERT_TRUE(status.ok()); + EXPECT_EQ( + "{\"id\":42,\"error\":" + "{\"code\":-32602," + "\"message\":\"invalid params message\"}}", + json); +} + +TEST(CreateErrorNotificationTest, SmokeTest) { + auto serializable = + CreateErrorNotification(DispatchResponse::InvalidRequest("oops!")); + std::string json; + auto status = + json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json); + ASSERT_TRUE(status.ok()); + EXPECT_EQ("{\"error\":{\"code\":-32600,\"message\":\"oops!\"}}", json); +} + +TEST(CreateResponseTest, SmokeTest) { + auto serializable = CreateResponse(42, nullptr); + std::string json; + auto status = + json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json); + ASSERT_TRUE(status.ok()); + EXPECT_EQ("{\"id\":42,\"result\":{}}", json); +} + +TEST(CreateNotificationTest, SmokeTest) { + auto serializable = CreateNotification("Foo.bar"); + std::string json; + auto status = + json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json); + ASSERT_TRUE(status.ok()); + EXPECT_EQ("{\"method\":\"Foo.bar\",\"params\":{}}", json); +} + +// ============================================================================= +// UberDispatcher - dispatches between domains (backends). +// ============================================================================= +class TestChannel : public FrontendChannel { + public: + std::string JSON() const { + std::string json; + json::ConvertCBORToJSON(SpanFrom(cbor_), &json); + return json; + } + + private: + void SendProtocolResponse(int call_id, + std::unique_ptr<Serializable> message) override { + cbor_ = message->Serialize(); + } + + void SendProtocolNotification( + std::unique_ptr<Serializable> message) override { + cbor_ = message->Serialize(); + } + + void FallThrough(int call_id, + span<uint8_t> method, + span<uint8_t> message) override {} + + void FlushProtocolNotifications() override {} + + std::vector<uint8_t> cbor_; +}; + +TEST(UberDispatcherTest, MethodNotFound) { + // No domain dispatchers are registered, so unsuprisingly, we'll get a method + // not found error and can see that DispatchResult::MethodFound() yields + // false. + TestChannel channel; + UberDispatcher dispatcher(&channel); + std::vector<uint8_t> message; + json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":\"Foo.bar\"}"), + &message); + Dispatchable dispatchable(SpanFrom(message)); + ASSERT_TRUE(dispatchable.ok()); + UberDispatcher::DispatchResult dispatched = dispatcher.Dispatch(dispatchable); + EXPECT_FALSE(dispatched.MethodFound()); + dispatched.Run(); + EXPECT_EQ( + "{\"id\":42,\"error\":" + "{\"code\":-32601,\"message\":\"'Foo.bar' wasn't found\"}}", + channel.JSON()); +} + +// A domain dispatcher which captured dispatched and executed commands in fields +// for testing. +class TestDomain : public DomainDispatcher { + public: + explicit TestDomain(FrontendChannel* channel) : DomainDispatcher(channel) {} + + std::function<void(const Dispatchable&)> Dispatch( + span<uint8_t> command_name) override { + dispatched_commands_.push_back( + std::string(command_name.begin(), command_name.end())); + return [this](const Dispatchable& dispatchable) { + executed_commands_.push_back(dispatchable.CallId()); + }; + } + + // Command names of the dispatched commands. + std::vector<std::string> DispatchedCommands() const { + return dispatched_commands_; + } + + // Call ids of the executed commands. + std::vector<int32_t> ExecutedCommands() const { return executed_commands_; } + + private: + std::vector<std::string> dispatched_commands_; + std::vector<int32_t> executed_commands_; +}; + +TEST(UberDispatcherTest, DispatchingToDomainWithRedirects) { + // This time, we register two domain dispatchers (Foo and Bar) and issue one + // command 'Foo.execute' which executes on Foo and one command 'Foo.redirect' + // which executes as 'Bar.redirected'. + TestChannel channel; + UberDispatcher dispatcher(&channel); + auto foo_dispatcher = std::make_unique<TestDomain>(&channel); + TestDomain* foo = foo_dispatcher.get(); + auto bar_dispatcher = std::make_unique<TestDomain>(&channel); + TestDomain* bar = bar_dispatcher.get(); + + dispatcher.WireBackend( + SpanFrom("Foo"), {{SpanFrom("Foo.redirect"), SpanFrom("Bar.redirected")}}, + std::move(foo_dispatcher)); + dispatcher.WireBackend(SpanFrom("Bar"), {}, std::move(bar_dispatcher)); + + { + std::vector<uint8_t> message; + json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":\"Foo.execute\"}"), + &message); + Dispatchable dispatchable(SpanFrom(message)); + ASSERT_TRUE(dispatchable.ok()); + UberDispatcher::DispatchResult dispatched = + dispatcher.Dispatch(dispatchable); + EXPECT_TRUE(dispatched.MethodFound()); + dispatched.Run(); + } + { + std::vector<uint8_t> message; + json::ConvertJSONToCBOR(SpanFrom("{\"id\":43,\"method\":\"Foo.redirect\"}"), + &message); + Dispatchable dispatchable(SpanFrom(message)); + ASSERT_TRUE(dispatchable.ok()); + UberDispatcher::DispatchResult dispatched = + dispatcher.Dispatch(dispatchable); + EXPECT_TRUE(dispatched.MethodFound()); + dispatched.Run(); + } + EXPECT_THAT(foo->DispatchedCommands(), testing::ElementsAre("execute")); + EXPECT_THAT(foo->ExecutedCommands(), testing::ElementsAre(42)); + EXPECT_THAT(bar->DispatchedCommands(), testing::ElementsAre("redirected")); + EXPECT_THAT(bar->ExecutedCommands(), testing::ElementsAre(43)); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/error_support.cc b/deps/inspector_protocol/crdtp/error_support.cc new file mode 100644 index 00000000000000..da4c2bed760bcc --- /dev/null +++ b/deps/inspector_protocol/crdtp/error_support.cc @@ -0,0 +1,59 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "error_support.h" + +#include <cassert> + +namespace crdtp { + +void ErrorSupport::Push() { + stack_.emplace_back(); +} + +void ErrorSupport::Pop() { + stack_.pop_back(); +} + +void ErrorSupport::SetName(const char* name) { + assert(!stack_.empty()); + stack_.back().type = NAME; + stack_.back().name = name; +} + +void ErrorSupport::SetIndex(size_t index) { + assert(!stack_.empty()); + stack_.back().type = INDEX; + stack_.back().index = index; +} + +void ErrorSupport::AddError(const char* error) { + assert(!stack_.empty()); + if (!errors_.empty()) + errors_ += "; "; + for (size_t ii = 0; ii < stack_.size(); ++ii) { + if (ii) + errors_ += "."; + const Segment& s = stack_[ii]; + switch (s.type) { + case NAME: + errors_ += s.name; + continue; + case INDEX: + errors_ += std::to_string(s.index); + continue; + default: + assert(s.type != EMPTY); + continue; + } + } + errors_ += ": "; + errors_ += error; +} + +span<uint8_t> ErrorSupport::Errors() const { + return SpanFrom(errors_); +} + +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/error_support.h b/deps/inspector_protocol/crdtp/error_support.h new file mode 100644 index 00000000000000..231bf3e8ea63be --- /dev/null +++ b/deps/inspector_protocol/crdtp/error_support.h @@ -0,0 +1,62 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_ERROR_SUPPORT_H_ +#define CRDTP_ERROR_SUPPORT_H_ + +#include <cstdint> +#include <string> +#include <vector> +#include "export.h" +#include "span.h" + +namespace crdtp { +// ============================================================================= +// ErrorSupport - For tracking errors in tree structures. +// ============================================================================= + +// This abstraction is used when converting between Values and inspector +// objects, e.g. in lib/ValueConversions_{h,cc}.template. As the processing +// enters and exits a branch, we call Push / Pop. Within the branch, +// we either set the name or an index (in case we're processing the element of a +// list/vector). Only once an error is seen, the path which is now on the +// stack is materialized and prefixes the error message. E.g., +// "foo.bar.2: some error". After error collection, ::Errors() is used to +// access the message. +class CRDTP_EXPORT ErrorSupport { + public: + // Push / Pop operations for the path segments; after Push, either SetName or + // SetIndex must be called exactly once. + void Push(); + void Pop(); + + // Sets the name of the current segment on the stack; e.g. a field name. + // |name| must be a C++ string literal in 7 bit US-ASCII. + void SetName(const char* name); + // Sets the index of the current segment on the stack; e.g. an array index. + void SetIndex(size_t index); + + // Materializes the error internally. |error| must be a C++ string literal + // in 7 bit US-ASCII. + void AddError(const char* error); + + // Returns the semicolon-separated list of errors as in 7 bit ASCII. + span<uint8_t> Errors() const; + + private: + enum SegmentType { EMPTY, NAME, INDEX }; + struct Segment { + SegmentType type = EMPTY; + union { + const char* name; + size_t index; + }; + }; + std::vector<Segment> stack_; + std::string errors_; +}; + +} // namespace crdtp + +#endif // CRDTP_ERROR_SUPPORT_H_ diff --git a/deps/inspector_protocol/crdtp/error_support_test.cc b/deps/inspector_protocol/crdtp/error_support_test.cc new file mode 100644 index 00000000000000..87b27113dae8d0 --- /dev/null +++ b/deps/inspector_protocol/crdtp/error_support_test.cc @@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "error_support.h" + +#include <string> +#include <vector> + +#include "test_platform.h" + +namespace crdtp { +TEST(ErrorSupportTest, Empty) { + ErrorSupport errors; + EXPECT_TRUE(errors.Errors().empty()); +} + +TEST(ErrorSupportTest, Nesting) { + ErrorSupport errors; + // Enter field foo, inter element at index 42, enter field bar, and encounter + // an error there ("something wrong"). + errors.Push(); + errors.SetName("foo"); + errors.Push(); + errors.SetIndex(42); + errors.Push(); + errors.SetName("bar_sibling"); + errors.SetName("bar"); + errors.AddError("something wrong"); + errors.Pop(); // bar + errors.Pop(); // 42 + // The common case is actually that we'll enter some field, set the name + // or index, and leave without ever producing an error. + errors.Push(); + errors.SetName("no_error_here"); + errors.Pop(); // no_error_here + errors.Push(); + errors.SetName("bang"); + errors.AddError("one last error"); + errors.Pop(); // bang + errors.Pop(); // foo + std::string out(errors.Errors().begin(), errors.Errors().end()); + EXPECT_EQ("foo.42.bar: something wrong; foo.bang: one last error", out); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/export.h b/deps/inspector_protocol/crdtp/export.h new file mode 100644 index 00000000000000..92fa1427c3b299 --- /dev/null +++ b/deps/inspector_protocol/crdtp/export.h @@ -0,0 +1,29 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_EXPORT_H_ +#define CRDTP_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(CRDTP_IMPLEMENTATION) +#define CRDTP_EXPORT __declspec(dllexport) +#else +#define CRDTP_EXPORT __declspec(dllimport) +#endif // defined(CRDTP_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(CRDTP_IMPLEMENTATION) +#define CRDTP_EXPORT __attribute__((visibility("default"))) +#else +#define CRDTP_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define CRDTP_EXPORT +#endif + +#endif // CRDTP_EXPORT_H_ diff --git a/deps/inspector_protocol/crdtp/find_by_first.h b/deps/inspector_protocol/crdtp/find_by_first.h new file mode 100644 index 00000000000000..68c2715913402a --- /dev/null +++ b/deps/inspector_protocol/crdtp/find_by_first.h @@ -0,0 +1,58 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_FIND_BY_FIRST_H_ +#define CRDTP_FIND_BY_FIRST_H_ + +#include <algorithm> +#include <cstdint> +#include <memory> +#include <vector> + +#include "export.h" +#include "span.h" + +namespace crdtp { +// ============================================================================= +// FindByFirst - Retrieval from a sorted vector that's keyed by span<uint8_t>. +// ============================================================================= + +// Given a vector of pairs sorted by the first element of each pair, find +// the corresponding value given a key to be compared to the first element. +// Together with std::inplace_merge and pre-sorting or std::sort, this can +// be used to implement a minimalistic equivalent of Chromium's flat_map. + +// In this variant, the template parameter |T| is a value type and a +// |default_value| is provided. +template <typename T> +T FindByFirst(const std::vector<std::pair<span<uint8_t>, T>>& sorted_by_first, + span<uint8_t> key, + T default_value) { + auto it = std::lower_bound( + sorted_by_first.begin(), sorted_by_first.end(), key, + [](const std::pair<span<uint8_t>, T>& left, span<uint8_t> right) { + return SpanLessThan(left.first, right); + }); + return (it != sorted_by_first.end() && SpanEquals(it->first, key)) + ? it->second + : default_value; +} + +// In this variant, the template parameter |T| is a class or struct that's +// instantiated in std::unique_ptr, and we return either a T* or a nullptr. +template <typename T> +T* FindByFirst(const std::vector<std::pair<span<uint8_t>, std::unique_ptr<T>>>& + sorted_by_first, + span<uint8_t> key) { + auto it = std::lower_bound( + sorted_by_first.begin(), sorted_by_first.end(), key, + [](const std::pair<span<uint8_t>, std::unique_ptr<T>>& left, + span<uint8_t> right) { return SpanLessThan(left.first, right); }); + return (it != sorted_by_first.end() && SpanEquals(it->first, key)) + ? it->second.get() + : nullptr; +} +} // namespace crdtp + +#endif // CRDTP_FIND_BY_FIRST_H_ diff --git a/deps/inspector_protocol/crdtp/find_by_first_test.cc b/deps/inspector_protocol/crdtp/find_by_first_test.cc new file mode 100644 index 00000000000000..93c79e3f721a3f --- /dev/null +++ b/deps/inspector_protocol/crdtp/find_by_first_test.cc @@ -0,0 +1,76 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "find_by_first.h" +#include "test_platform.h" + +namespace crdtp { +// ============================================================================= +// FindByFirst - Efficient retrieval from a sorted vector. +// ============================================================================= +TEST(FindByFirst, SpanBySpan) { + std::vector<std::pair<span<uint8_t>, span<uint8_t>>> sorted_span_by_span = { + {SpanFrom("foo1"), SpanFrom("bar1")}, + {SpanFrom("foo2"), SpanFrom("bar2")}, + {SpanFrom("foo3"), SpanFrom("bar3")}, + }; + { + auto result = FindByFirst(sorted_span_by_span, SpanFrom("foo1"), + SpanFrom("not_found")); + EXPECT_EQ("bar1", std::string(result.begin(), result.end())); + } + { + auto result = FindByFirst(sorted_span_by_span, SpanFrom("foo3"), + SpanFrom("not_found")); + EXPECT_EQ("bar3", std::string(result.begin(), result.end())); + } + { + auto result = FindByFirst(sorted_span_by_span, SpanFrom("baz"), + SpanFrom("not_found")); + EXPECT_EQ("not_found", std::string(result.begin(), result.end())); + } +} + +namespace { +class TestObject { + public: + explicit TestObject(const std::string& message) : message_(message) {} + + const std::string& message() const { return message_; } + + private: + std::string message_; +}; +} // namespace + +TEST(FindByFirst, ObjectBySpan) { + std::vector<std::pair<span<uint8_t>, std::unique_ptr<TestObject>>> + sorted_object_by_span; + sorted_object_by_span.push_back( + std::make_pair(SpanFrom("foo1"), std::make_unique<TestObject>("bar1"))); + sorted_object_by_span.push_back( + std::make_pair(SpanFrom("foo2"), std::make_unique<TestObject>("bar2"))); + sorted_object_by_span.push_back( + std::make_pair(SpanFrom("foo3"), std::make_unique<TestObject>("bar3"))); + { + TestObject* result = + FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("foo1")); + ASSERT_TRUE(result); + ASSERT_EQ("bar1", result->message()); + } + { + TestObject* result = + FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("foo3")); + ASSERT_TRUE(result); + ASSERT_EQ("bar3", result->message()); + } + { + TestObject* result = + FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("baz")); + ASSERT_FALSE(result); + } +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/frontend_channel.h b/deps/inspector_protocol/crdtp/frontend_channel.h new file mode 100644 index 00000000000000..652c65219d4d4c --- /dev/null +++ b/deps/inspector_protocol/crdtp/frontend_channel.h @@ -0,0 +1,47 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_FRONTEND_CHANNEL_H_ +#define CRDTP_FRONTEND_CHANNEL_H_ + +#include <cstdint> +#include <memory> +#include "export.h" +#include "serializable.h" +#include "span.h" + +namespace crdtp { +// ============================================================================= +// FrontendChannel - For sending notifications and responses to protocol clients +// ============================================================================= +class CRDTP_EXPORT FrontendChannel { + public: + virtual ~FrontendChannel() = default; + + // Sends protocol responses and notifications. The |call_id| parameter is + // seemingly redundant because it's also included in the message, but + // responses may be sent from an untrusted source to a trusted process (e.g. + // from Chromium's renderer (blink) to the browser process), which needs + // to be able to match the response to an earlier request without parsing the + // message. + virtual void SendProtocolResponse(int call_id, + std::unique_ptr<Serializable> message) = 0; + virtual void SendProtocolNotification( + std::unique_ptr<Serializable> message) = 0; + + // FallThrough indicates that |message| should be handled in another layer. + // Usually this means the layer responding to the message didn't handle it, + // but in some cases messages are handled by multiple layers (e.g. both + // the embedder and the content layer in Chromium). + virtual void FallThrough(int call_id, + span<uint8_t> method, + span<uint8_t> message) = 0; + + // Session implementations may queue notifications for performance or + // other considerations; this is a hook for domain handlers to manually flush. + virtual void FlushProtocolNotifications() = 0; +}; +} // namespace crdtp + +#endif // CRDTP_FRONTEND_CHANNEL_H_ diff --git a/deps/inspector_protocol/crdtp/json.cc b/deps/inspector_protocol/crdtp/json.cc new file mode 100644 index 00000000000000..479f9ba51875ab --- /dev/null +++ b/deps/inspector_protocol/crdtp/json.cc @@ -0,0 +1,1037 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "json.h" + +#include <algorithm> +#include <cassert> +#include <cmath> +#include <cstring> +#include <limits> +#include <stack> + +#include "cbor.h" +#include "json_platform.h" + +namespace crdtp { +namespace json { +// ============================================================================= +// json::NewJSONEncoder - for encoding streaming parser events as JSON +// ============================================================================= + +namespace { +// Prints |value| to |out| with 4 hex digits, most significant chunk first. +template <typename C> +void PrintHex(uint16_t value, C* out) { + for (int ii = 3; ii >= 0; --ii) { + int four_bits = 0xf & (value >> (4 * ii)); + out->push_back(four_bits + ((four_bits <= 9) ? '0' : ('a' - 10))); + } +} + +// In the writer below, we maintain a stack of State instances. +// It is just enough to emit the appropriate delimiters and brackets +// in JSON. +enum class Container { + // Used for the top-level, initial state. + NONE, + // Inside a JSON object. + MAP, + // Inside a JSON array. + ARRAY +}; + +class State { + public: + explicit State(Container container) : container_(container) {} + void StartElement(std::vector<uint8_t>* out) { StartElementTmpl(out); } + void StartElement(std::string* out) { StartElementTmpl(out); } + Container container() const { return container_; } + + private: + template <typename C> + void StartElementTmpl(C* out) { + assert(container_ != Container::NONE || size_ == 0); + if (size_ != 0) { + char delim = (!(size_ & 1) || container_ == Container::ARRAY) ? ',' : ':'; + out->push_back(delim); + } + ++size_; + } + + Container container_ = Container::NONE; + int size_ = 0; +}; + +constexpr char kBase64Table[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789+/"; + +template <typename C> +void Base64Encode(const span<uint8_t>& in, C* out) { + // The following three cases are based on the tables in the example + // section in https://en.wikipedia.org/wiki/Base64. We process three + // input bytes at a time, emitting 4 output bytes at a time. + size_t ii = 0; + + // While possible, process three input bytes. + for (; ii + 3 <= in.size(); ii += 3) { + uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8) | in[ii + 2]; + out->push_back(kBase64Table[(twentyfour_bits >> 18)]); + out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]); + out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]); + out->push_back(kBase64Table[twentyfour_bits & 0x3f]); + } + if (ii + 2 <= in.size()) { // Process two input bytes. + uint32_t twentyfour_bits = (in[ii] << 16) | (in[ii + 1] << 8); + out->push_back(kBase64Table[(twentyfour_bits >> 18)]); + out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]); + out->push_back(kBase64Table[(twentyfour_bits >> 6) & 0x3f]); + out->push_back('='); // Emit padding. + return; + } + if (ii + 1 <= in.size()) { // Process a single input byte. + uint32_t twentyfour_bits = (in[ii] << 16); + out->push_back(kBase64Table[(twentyfour_bits >> 18)]); + out->push_back(kBase64Table[(twentyfour_bits >> 12) & 0x3f]); + out->push_back('='); // Emit padding. + out->push_back('='); // Emit padding. + } +} + +// Implements a handler for JSON parser events to emit a JSON string. +template <typename C> +class JSONEncoder : public ParserHandler { + public: + JSONEncoder(C* out, Status* status) : out_(out), status_(status) { + *status_ = Status(); + state_.emplace(Container::NONE); + } + + void HandleMapBegin() override { + if (!status_->ok()) + return; + assert(!state_.empty()); + state_.top().StartElement(out_); + state_.emplace(Container::MAP); + Emit('{'); + } + + void HandleMapEnd() override { + if (!status_->ok()) + return; + assert(state_.size() >= 2 && state_.top().container() == Container::MAP); + state_.pop(); + Emit('}'); + } + + void HandleArrayBegin() override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + state_.emplace(Container::ARRAY); + Emit('['); + } + + void HandleArrayEnd() override { + if (!status_->ok()) + return; + assert(state_.size() >= 2 && state_.top().container() == Container::ARRAY); + state_.pop(); + Emit(']'); + } + + void HandleString16(span<uint16_t> chars) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + Emit('"'); + for (const uint16_t ch : chars) { + if (ch == '"') { + Emit('\\'); Emit('"'); + } else if (ch == '\\') { + Emit('\\'); Emit('\\'); + } else if (ch >= 32 && ch <= 127) { + Emit(ch); + } else if (ch == '\n') { + Emit('\\'); Emit('n'); + } else if (ch == '\r') { + Emit('\\'); Emit('r'); + } else if (ch == '\t') { + Emit('\\'); Emit('t'); + } else if (ch == '\b') { + Emit('\\'); Emit('b'); + } else if (ch == '\f') { + Emit('\\'); Emit('f'); + } else { + Emit('\\'); Emit('u'); + PrintHex(ch, out_); + } + } + Emit('"'); + } + + void HandleString8(span<uint8_t> chars) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + Emit('"'); + for (size_t ii = 0; ii < chars.size(); ++ii) { + uint8_t c = chars[ii]; + if (c == '"') { + Emit('\\'); Emit('"'); + } else if (c == '\\') { + Emit('\\'); Emit('\\'); + } else if (c >= 32 && c <= 127) { + Emit(c); + } else if (c == '\n') { + Emit('\\'); Emit('n'); + } else if (c == '\r') { + Emit('\\'); Emit('r'); + } else if (c == '\t') { + Emit('\\'); Emit('t'); + } else if (c == '\b') { + Emit('\\'); Emit('b'); + } else if (c == '\f') { + Emit('\\'); Emit('f'); + } else if (c < 32) { + Emit('\\'); Emit('u'); + PrintHex(static_cast<uint16_t>(c), out_); + } else { + // Inspect the leading byte to figure out how long the utf8 + // byte sequence is; while doing this initialize |codepoint| + // with the first few bits. + // See table in: https://en.wikipedia.org/wiki/UTF-8 + // byte one is 110x xxxx -> 2 byte utf8 sequence + // byte one is 1110 xxxx -> 3 byte utf8 sequence + // byte one is 1111 0xxx -> 4 byte utf8 sequence + uint32_t codepoint; + int num_bytes_left; + if ((c & 0xe0) == 0xc0) { // 2 byte utf8 sequence + num_bytes_left = 1; + codepoint = c & 0x1f; + } else if ((c & 0xf0) == 0xe0) { // 3 byte utf8 sequence + num_bytes_left = 2; + codepoint = c & 0x0f; + } else if ((c & 0xf8) == 0xf0) { // 4 byte utf8 sequence + codepoint = c & 0x07; + num_bytes_left = 3; + } else { + continue; // invalid leading byte + } + + // If we have enough bytes in our input, decode the remaining ones + // belonging to this Unicode character into |codepoint|. + if (ii + num_bytes_left >= chars.size()) + continue; + bool invalid_byte_seen = false; + while (num_bytes_left > 0) { + c = chars[++ii]; + --num_bytes_left; + // Check the next byte is a continuation byte, that is 10xx xxxx. + if ((c & 0xc0) != 0x80) + invalid_byte_seen = true; + codepoint = (codepoint << 6) | (c & 0x3f); + } + if (invalid_byte_seen) + continue; + + // Disallow overlong encodings for ascii characters, as these + // would include " and other characters significant to JSON + // string termination / control. + if (codepoint <= 0x7f) + continue; + // Invalid in UTF8, and can't be represented in UTF16 anyway. + if (codepoint > 0x10ffff) + continue; + + // So, now we transcode to UTF16, + // using the math described at https://en.wikipedia.org/wiki/UTF-16, + // for either one or two 16 bit characters. + if (codepoint <= 0xffff) { + Emit("\\u"); + PrintHex(static_cast<uint16_t>(codepoint), out_); + continue; + } + codepoint -= 0x10000; + // high surrogate + Emit("\\u"); + PrintHex(static_cast<uint16_t>((codepoint >> 10) + 0xd800), out_); + // low surrogate + Emit("\\u"); + PrintHex(static_cast<uint16_t>((codepoint & 0x3ff) + 0xdc00), out_); + } + } + Emit('"'); + } + + void HandleBinary(span<uint8_t> bytes) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + Emit('"'); + Base64Encode(bytes, out_); + Emit('"'); + } + + void HandleDouble(double value) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + // JSON cannot represent NaN or Infinity. So, for compatibility, + // we behave like the JSON object in web browsers: emit 'null'. + if (!std::isfinite(value)) { + Emit("null"); + return; + } + // If |value| is a scalar, emit it as an int. Taken from json_writer.cc in + // Chromium. + if (value < static_cast<double>(std::numeric_limits<int64_t>::max()) && + value >= std::numeric_limits<int64_t>::min() && + std::floor(value) == value) { + Emit(std::to_string(static_cast<int64_t>(value))); + return; + } + std::string str_value = json::platform::DToStr(value); + // The following is somewhat paranoid, but also taken from json_writer.cc + // in Chromium: + // Ensure that the number has a .0 if there's no decimal or 'e'. This + // makes sure that when we read the JSON back, it's interpreted as a + // real rather than an int. + if (str_value.find_first_of(".eE") == std::string::npos) + str_value.append(".0"); + + // DToStr may fail to emit a 0 before the decimal dot. E.g. this is + // the case in base::NumberToString in Chromium (which is based on + // dmg_fp). So, much like + // https://cs.chromium.org/chromium/src/base/json/json_writer.cc + // we probe for this and emit the leading 0 anyway if necessary. + if (str_value[0] == '.') { + Emit('0'); + Emit(str_value); + } else if (str_value[0] == '-' && str_value[1] == '.') { + Emit("-0"); + // Skip the '-' from the original string and emit the rest. + out_->insert(out_->end(), str_value.begin() + 1, str_value.end()); + } else { + Emit(str_value); + } + } + + void HandleInt32(int32_t value) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + Emit(std::to_string(value)); + } + + void HandleBool(bool value) override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + if (value) + Emit("true"); + else + Emit("false"); + } + + void HandleNull() override { + if (!status_->ok()) + return; + state_.top().StartElement(out_); + Emit("null"); + } + + void HandleError(Status error) override { + assert(!error.ok()); + *status_ = error; + out_->clear(); + } + + private: + inline void Emit(char c) { out_->push_back(c); } + template<size_t N> + inline void Emit(const char (&str)[N]) { + out_->insert(out_->end(), str, str + N - 1); + } + inline void Emit(const std::string& str) { + out_->insert(out_->end(), str.begin(), str.end()); + } + + C* out_; + Status* status_; + std::stack<State> state_; +}; +} // namespace + +std::unique_ptr<ParserHandler> NewJSONEncoder(std::vector<uint8_t>* out, + Status* status) { + return std::unique_ptr<ParserHandler>( + new JSONEncoder<std::vector<uint8_t>>(out, status)); +} + +std::unique_ptr<ParserHandler> NewJSONEncoder(std::string* out, + Status* status) { + return std::unique_ptr<ParserHandler>( + new JSONEncoder<std::string>(out, status)); +} + +// ============================================================================= +// json::ParseJSON - for receiving streaming parser events for JSON. +// ============================================================================= + +namespace { +const int kStackLimit = 300; + +enum Token { + ObjectBegin, + ObjectEnd, + ArrayBegin, + ArrayEnd, + StringLiteral, + Number, + BoolTrue, + BoolFalse, + NullToken, + ListSeparator, + ObjectPairSeparator, + InvalidToken, + NoInput +}; + +const char* const kNullString = "null"; +const char* const kTrueString = "true"; +const char* const kFalseString = "false"; + +template <typename Char> +class JsonParser { + public: + explicit JsonParser(ParserHandler* handler) : handler_(handler) {} + + void Parse(const Char* start, size_t length) { + start_pos_ = start; + const Char* end = start + length; + const Char* tokenEnd = nullptr; + ParseValue(start, end, &tokenEnd, 0); + if (error_) + return; + if (tokenEnd != end) { + HandleError(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, tokenEnd); + } + } + + private: + bool CharsToDouble(const uint16_t* chars, size_t length, double* result) { + std::string buffer; + buffer.reserve(length + 1); + for (size_t ii = 0; ii < length; ++ii) { + bool is_ascii = !(chars[ii] & ~0x7F); + if (!is_ascii) + return false; + buffer.push_back(static_cast<char>(chars[ii])); + } + return platform::StrToD(buffer.c_str(), result); + } + + bool CharsToDouble(const uint8_t* chars, size_t length, double* result) { + std::string buffer(reinterpret_cast<const char*>(chars), length); + return platform::StrToD(buffer.c_str(), result); + } + + static bool ParseConstToken(const Char* start, + const Char* end, + const Char** token_end, + const char* token) { + // |token| is \0 terminated, it's one of the constants at top of the file. + while (start < end && *token != '\0' && *start++ == *token++) { + } + if (*token != '\0') + return false; + *token_end = start; + return true; + } + + static bool ReadInt(const Char* start, + const Char* end, + const Char** token_end, + bool allow_leading_zeros) { + if (start == end) + return false; + bool has_leading_zero = '0' == *start; + int length = 0; + while (start < end && '0' <= *start && *start <= '9') { + ++start; + ++length; + } + if (!length) + return false; + if (!allow_leading_zeros && length > 1 && has_leading_zero) + return false; + *token_end = start; + return true; + } + + static bool ParseNumberToken(const Char* start, + const Char* end, + const Char** token_end) { + // We just grab the number here. We validate the size in DecodeNumber. + // According to RFC4627, a valid number is: [minus] int [frac] [exp] + if (start == end) + return false; + Char c = *start; + if ('-' == c) + ++start; + + if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/false)) + return false; + if (start == end) { + *token_end = start; + return true; + } + + // Optional fraction part + c = *start; + if ('.' == c) { + ++start; + if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true)) + return false; + if (start == end) { + *token_end = start; + return true; + } + c = *start; + } + + // Optional exponent part + if ('e' == c || 'E' == c) { + ++start; + if (start == end) + return false; + c = *start; + if ('-' == c || '+' == c) { + ++start; + if (start == end) + return false; + } + if (!ReadInt(start, end, &start, /*allow_leading_zeros=*/true)) + return false; + } + + *token_end = start; + return true; + } + + static bool ReadHexDigits(const Char* start, + const Char* end, + const Char** token_end, + int digits) { + if (end - start < digits) + return false; + for (int i = 0; i < digits; ++i) { + Char c = *start++; + if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F'))) + return false; + } + *token_end = start; + return true; + } + + static bool ParseStringToken(const Char* start, + const Char* end, + const Char** token_end) { + while (start < end) { + Char c = *start++; + if ('\\' == c) { + if (start == end) + return false; + c = *start++; + // Make sure the escaped char is valid. + switch (c) { + case 'x': + if (!ReadHexDigits(start, end, &start, 2)) + return false; + break; + case 'u': + if (!ReadHexDigits(start, end, &start, 4)) + return false; + break; + case '\\': + case '/': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + case 'v': + case '"': + break; + default: + return false; + } + } else if ('"' == c) { + *token_end = start; + return true; + } + } + return false; + } + + static bool SkipComment(const Char* start, + const Char* end, + const Char** comment_end) { + if (start == end) + return false; + + if (*start != '/' || start + 1 >= end) + return false; + ++start; + + if (*start == '/') { + // Single line comment, read to newline. + for (++start; start < end; ++start) { + if (*start == '\n' || *start == '\r') { + *comment_end = start + 1; + return true; + } + } + *comment_end = end; + // Comment reaches end-of-input, which is fine. + return true; + } + + if (*start == '*') { + Char previous = '\0'; + // Block comment, read until end marker. + for (++start; start < end; previous = *start++) { + if (previous == '*' && *start == '/') { + *comment_end = start + 1; + return true; + } + } + // Block comment must close before end-of-input. + return false; + } + + return false; + } + + static bool IsSpaceOrNewLine(Char c) { + // \v = vertial tab; \f = form feed page break. + return c == ' ' || c == '\n' || c == '\v' || c == '\f' || c == '\r' || + c == '\t'; + } + + static void SkipWhitespaceAndComments(const Char* start, + const Char* end, + const Char** whitespace_end) { + while (start < end) { + if (IsSpaceOrNewLine(*start)) { + ++start; + } else if (*start == '/') { + const Char* comment_end = nullptr; + if (!SkipComment(start, end, &comment_end)) + break; + start = comment_end; + } else { + break; + } + } + *whitespace_end = start; + } + + static Token ParseToken(const Char* start, + const Char* end, + const Char** tokenStart, + const Char** token_end) { + SkipWhitespaceAndComments(start, end, tokenStart); + start = *tokenStart; + + if (start == end) + return NoInput; + + switch (*start) { + case 'n': + if (ParseConstToken(start, end, token_end, kNullString)) + return NullToken; + break; + case 't': + if (ParseConstToken(start, end, token_end, kTrueString)) + return BoolTrue; + break; + case 'f': + if (ParseConstToken(start, end, token_end, kFalseString)) + return BoolFalse; + break; + case '[': + *token_end = start + 1; + return ArrayBegin; + case ']': + *token_end = start + 1; + return ArrayEnd; + case ',': + *token_end = start + 1; + return ListSeparator; + case '{': + *token_end = start + 1; + return ObjectBegin; + case '}': + *token_end = start + 1; + return ObjectEnd; + case ':': + *token_end = start + 1; + return ObjectPairSeparator; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + if (ParseNumberToken(start, end, token_end)) + return Number; + break; + case '"': + if (ParseStringToken(start + 1, end, token_end)) + return StringLiteral; + break; + } + return InvalidToken; + } + + static int HexToInt(Char c) { + if ('0' <= c && c <= '9') + return c - '0'; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + if ('a' <= c && c <= 'f') + return c - 'a' + 10; + assert(false); // Unreachable. + return 0; + } + + static bool DecodeString(const Char* start, + const Char* end, + std::vector<uint16_t>* output) { + if (start == end) + return true; + if (start > end) + return false; + output->reserve(end - start); + while (start < end) { + uint16_t c = *start++; + // If the |Char| we're dealing with is really a byte, then + // we have utf8 here, and we need to check for multibyte characters + // and transcode them to utf16 (either one or two utf16 chars). + if (sizeof(Char) == sizeof(uint8_t) && c > 0x7f) { + // Inspect the leading byte to figure out how long the utf8 + // byte sequence is; while doing this initialize |codepoint| + // with the first few bits. + // See table in: https://en.wikipedia.org/wiki/UTF-8 + // byte one is 110x xxxx -> 2 byte utf8 sequence + // byte one is 1110 xxxx -> 3 byte utf8 sequence + // byte one is 1111 0xxx -> 4 byte utf8 sequence + uint32_t codepoint; + int num_bytes_left; + if ((c & 0xe0) == 0xc0) { // 2 byte utf8 sequence + num_bytes_left = 1; + codepoint = c & 0x1f; + } else if ((c & 0xf0) == 0xe0) { // 3 byte utf8 sequence + num_bytes_left = 2; + codepoint = c & 0x0f; + } else if ((c & 0xf8) == 0xf0) { // 4 byte utf8 sequence + codepoint = c & 0x07; + num_bytes_left = 3; + } else { + return false; // invalid leading byte + } + + // If we have enough bytes in our inpput, decode the remaining ones + // belonging to this Unicode character into |codepoint|. + if (start + num_bytes_left > end) + return false; + while (num_bytes_left > 0) { + c = *start++; + --num_bytes_left; + // Check the next byte is a continuation byte, that is 10xx xxxx. + if ((c & 0xc0) != 0x80) + return false; + codepoint = (codepoint << 6) | (c & 0x3f); + } + + // Disallow overlong encodings for ascii characters, as these + // would include " and other characters significant to JSON + // string termination / control. + if (codepoint <= 0x7f) + return false; + // Invalid in UTF8, and can't be represented in UTF16 anyway. + if (codepoint > 0x10ffff) + return false; + + // So, now we transcode to UTF16, + // using the math described at https://en.wikipedia.org/wiki/UTF-16, + // for either one or two 16 bit characters. + if (codepoint <= 0xffff) { + output->push_back(codepoint); + continue; + } + codepoint -= 0x10000; + output->push_back((codepoint >> 10) + 0xd800); // high surrogate + output->push_back((codepoint & 0x3ff) + 0xdc00); // low surrogate + continue; + } + if ('\\' != c) { + output->push_back(c); + continue; + } + if (start == end) + return false; + c = *start++; + + if (c == 'x') { + // \x is not supported. + return false; + } + + switch (c) { + case '"': + case '/': + case '\\': + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'v': + c = '\v'; + break; + case 'u': + c = (HexToInt(*start) << 12) + (HexToInt(*(start + 1)) << 8) + + (HexToInt(*(start + 2)) << 4) + HexToInt(*(start + 3)); + start += 4; + break; + default: + return false; + } + output->push_back(c); + } + return true; + } + + void ParseValue(const Char* start, + const Char* end, + const Char** value_token_end, + int depth) { + if (depth > kStackLimit) { + HandleError(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, start); + return; + } + const Char* token_start = nullptr; + const Char* token_end = nullptr; + Token token = ParseToken(start, end, &token_start, &token_end); + switch (token) { + case NoInput: + HandleError(Error::JSON_PARSER_NO_INPUT, token_start); + return; + case InvalidToken: + HandleError(Error::JSON_PARSER_INVALID_TOKEN, token_start); + return; + case NullToken: + handler_->HandleNull(); + break; + case BoolTrue: + handler_->HandleBool(true); + break; + case BoolFalse: + handler_->HandleBool(false); + break; + case Number: { + double value; + if (!CharsToDouble(token_start, token_end - token_start, &value)) { + HandleError(Error::JSON_PARSER_INVALID_NUMBER, token_start); + return; + } + if (value >= std::numeric_limits<int32_t>::min() && + value <= std::numeric_limits<int32_t>::max() && + static_cast<int32_t>(value) == value) + handler_->HandleInt32(static_cast<int32_t>(value)); + else + handler_->HandleDouble(value); + break; + } + case StringLiteral: { + std::vector<uint16_t> value; + bool ok = DecodeString(token_start + 1, token_end - 1, &value); + if (!ok) { + HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); + return; + } + handler_->HandleString16(span<uint16_t>(value.data(), value.size())); + break; + } + case ArrayBegin: { + handler_->HandleArrayBegin(); + start = token_end; + token = ParseToken(start, end, &token_start, &token_end); + while (token != ArrayEnd) { + ParseValue(start, end, &token_end, depth + 1); + if (error_) + return; + + // After a list value, we expect a comma or the end of the list. + start = token_end; + token = ParseToken(start, end, &token_start, &token_end); + if (token == ListSeparator) { + start = token_end; + token = ParseToken(start, end, &token_start, &token_end); + if (token == ArrayEnd) { + HandleError(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, token_start); + return; + } + } else if (token != ArrayEnd) { + // Unexpected value after list value. Bail out. + HandleError(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED, + token_start); + return; + } + } + handler_->HandleArrayEnd(); + break; + } + case ObjectBegin: { + handler_->HandleMapBegin(); + start = token_end; + token = ParseToken(start, end, &token_start, &token_end); + while (token != ObjectEnd) { + if (token != StringLiteral) { + HandleError(Error::JSON_PARSER_STRING_LITERAL_EXPECTED, + token_start); + return; + } + std::vector<uint16_t> key; + if (!DecodeString(token_start + 1, token_end - 1, &key)) { + HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); + return; + } + handler_->HandleString16(span<uint16_t>(key.data(), key.size())); + start = token_end; + + token = ParseToken(start, end, &token_start, &token_end); + if (token != ObjectPairSeparator) { + HandleError(Error::JSON_PARSER_COLON_EXPECTED, token_start); + return; + } + start = token_end; + + ParseValue(start, end, &token_end, depth + 1); + if (error_) + return; + start = token_end; + + // After a key/value pair, we expect a comma or the end of the + // object. + token = ParseToken(start, end, &token_start, &token_end); + if (token == ListSeparator) { + start = token_end; + token = ParseToken(start, end, &token_start, &token_end); + if (token == ObjectEnd) { + HandleError(Error::JSON_PARSER_UNEXPECTED_MAP_END, token_start); + return; + } + } else if (token != ObjectEnd) { + // Unexpected value after last object value. Bail out. + HandleError(Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED, + token_start); + return; + } + } + handler_->HandleMapEnd(); + break; + } + + default: + // We got a token that's not a value. + HandleError(Error::JSON_PARSER_VALUE_EXPECTED, token_start); + return; + } + + SkipWhitespaceAndComments(token_end, end, value_token_end); + } + + void HandleError(Error error, const Char* pos) { + assert(error != Error::OK); + if (!error_) { + handler_->HandleError( + Status{error, static_cast<size_t>(pos - start_pos_)}); + error_ = true; + } + } + + const Char* start_pos_ = nullptr; + bool error_ = false; + ParserHandler* handler_; +}; +} // namespace + +void ParseJSON(span<uint8_t> chars, ParserHandler* handler) { + JsonParser<uint8_t> parser(handler); + parser.Parse(chars.data(), chars.size()); +} + +void ParseJSON(span<uint16_t> chars, ParserHandler* handler) { + JsonParser<uint16_t> parser(handler); + parser.Parse(chars.data(), chars.size()); +} + +// ============================================================================= +// json::ConvertCBORToJSON, json::ConvertJSONToCBOR - for transcoding +// ============================================================================= +template <typename C> +Status ConvertCBORToJSONTmpl(span<uint8_t> cbor, C* json) { + Status status; + std::unique_ptr<ParserHandler> json_writer = NewJSONEncoder(json, &status); + cbor::ParseCBOR(cbor, json_writer.get()); + return status; +} + +Status ConvertCBORToJSON(span<uint8_t> cbor, std::vector<uint8_t>* json) { + return ConvertCBORToJSONTmpl(cbor, json); +} + +Status ConvertCBORToJSON(span<uint8_t> cbor, std::string* json) { + return ConvertCBORToJSONTmpl(cbor, json); +} + +template <typename T> +Status ConvertJSONToCBORTmpl(span<T> json, std::vector<uint8_t>* cbor) { + Status status; + std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(cbor, &status); + ParseJSON(json, encoder.get()); + return status; +} + +Status ConvertJSONToCBOR(span<uint8_t> json, std::vector<uint8_t>* cbor) { + return ConvertJSONToCBORTmpl(json, cbor); +} + +Status ConvertJSONToCBOR(span<uint16_t> json, std::vector<uint8_t>* cbor) { + return ConvertJSONToCBORTmpl(json, cbor); +} +} // namespace json +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/json.h b/deps/inspector_protocol/crdtp/json.h new file mode 100644 index 00000000000000..3e3c6b386af465 --- /dev/null +++ b/deps/inspector_protocol/crdtp/json.h @@ -0,0 +1,57 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_JSON_H_ +#define CRDTP_JSON_H_ + +#include <memory> +#include <vector> +#include "export.h" +#include "parser_handler.h" + +namespace crdtp { +namespace json { +// ============================================================================= +// json::NewJSONEncoder - for encoding streaming parser events as JSON +// ============================================================================= + +// Returns a handler object which will write ascii characters to |out|. +// |status->ok()| will be false iff the handler routine HandleError() is called. +// In that case, we'll stop emitting output. +// Except for calling the HandleError routine at any time, the client +// code must call the Handle* methods in an order in which they'd occur +// in valid JSON; otherwise we may crash (the code uses assert). +CRDTP_EXPORT std::unique_ptr<ParserHandler> NewJSONEncoder( + std::vector<uint8_t>* out, + Status* status); + +CRDTP_EXPORT std::unique_ptr<ParserHandler> NewJSONEncoder(std::string* out, + Status* status); + +// ============================================================================= +// json::ParseJSON - for receiving streaming parser events for JSON +// ============================================================================= + +CRDTP_EXPORT void ParseJSON(span<uint8_t> chars, ParserHandler* handler); + +CRDTP_EXPORT void ParseJSON(span<uint16_t> chars, ParserHandler* handler); + +// ============================================================================= +// json::ConvertCBORToJSON, json::ConvertJSONToCBOR - for transcoding +// ============================================================================= + +CRDTP_EXPORT Status ConvertCBORToJSON(span<uint8_t> cbor, std::string* json); + +CRDTP_EXPORT Status ConvertCBORToJSON(span<uint8_t> cbor, + std::vector<uint8_t>* json); + +CRDTP_EXPORT Status ConvertJSONToCBOR(span<uint8_t> json, + std::vector<uint8_t>* cbor); + +CRDTP_EXPORT Status ConvertJSONToCBOR(span<uint16_t> json, + std::vector<uint8_t>* cbor); +} // namespace json +} // namespace crdtp + +#endif // CRDTP_JSON_H_ diff --git a/deps/inspector_protocol/crdtp/json_platform.cc b/deps/inspector_protocol/crdtp/json_platform.cc new file mode 100644 index 00000000000000..d43db8683c269d --- /dev/null +++ b/deps/inspector_protocol/crdtp/json_platform.cc @@ -0,0 +1,33 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "json_platform.h" + +#include <sstream> + +// This is a reference implementation using the C++ standard library. +// Downstream projects may invoke their preferred routines instead, +// by modifying / replacing this file to call them. +// Examples of optimized string<->number conversion libraries: +// - https://github.com/google/double-conversion +// - https://github.com/abseil/abseil-cpp/blob/master/absl/strings/numbers.h +namespace crdtp { +namespace json { +namespace platform { +bool StrToD(const char* str, double* result) { + std::istringstream is(str); + is.imbue(std::locale::classic()); + is >> *result; + return !is.fail() && is.eof(); +} + +std::string DToStr(double value) { + std::stringstream ss; + ss.imbue(std::locale::classic()); + ss << value; + return ss.str(); +} +} // namespace platform +} // namespace json +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/json_platform.h b/deps/inspector_protocol/crdtp/json_platform.h new file mode 100644 index 00000000000000..2ab09bf80e44e8 --- /dev/null +++ b/deps/inspector_protocol/crdtp/json_platform.h @@ -0,0 +1,26 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_JSON_PLATFORM_H_ +#define CRDTP_JSON_PLATFORM_H_ + +#include <string> + +namespace crdtp { +namespace json { +// These routines are implemented in json_platform.cc, or in a +// platform-dependent (code-base dependent) custom replacement. +// E.g., json_platform_chromium.cc, json_platform_v8.cc. +namespace platform { +// Parses |str| into |result|. Returns false iff there are +// leftover characters or parsing errors. +bool StrToD(const char* str, double* result); + +// Prints |value| in a format suitable for JSON. +std::string DToStr(double value); +} // namespace platform +} // namespace json +} // namespace crdtp + +#endif // CRDTP_JSON_PLATFORM_H_ diff --git a/deps/inspector_protocol/crdtp/json_test.cc b/deps/inspector_protocol/crdtp/json_test.cc new file mode 100644 index 00000000000000..08f65e48a20147 --- /dev/null +++ b/deps/inspector_protocol/crdtp/json_test.cc @@ -0,0 +1,754 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "json.h" + +#include <array> +#include <clocale> +#include <cmath> +#include <cstdlib> +#include <cstring> +#include <iomanip> +#include <iostream> +#include <sstream> +#include <string> + +#include "cbor.h" +#include "parser_handler.h" +#include "span.h" +#include "status.h" +#include "status_test_support.h" +#include "test_platform.h" + +namespace crdtp { +namespace json { +// ============================================================================= +// json::NewJSONEncoder - for encoding streaming parser events as JSON +// ============================================================================= + +void WriteUTF8AsUTF16(ParserHandler* writer, const std::string& utf8) { + writer->HandleString16(SpanFrom(UTF8ToUTF16(SpanFrom(utf8)))); +} + +TEST(JsonEncoder, OverlongEncodings) { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + + // We encode 0x7f, which is the DEL ascii character, as a 4 byte UTF8 + // sequence. This is called an overlong encoding, because only 1 byte + // is needed to represent 0x7f as UTF8. + std::vector<uint8_t> chars = { + 0xf0, // Starts 4 byte utf8 sequence + 0x80, // continuation byte + 0x81, // continuation byte w/ payload bit 7 set to 1. + 0xbf, // continuation byte w/ payload bits 0-6 set to 11111. + }; + writer->HandleString8(SpanFrom(chars)); + EXPECT_EQ("\"\"", out); // Empty string means that 0x7f was rejected (good). +} + +TEST(JsonEncoder, NotAContinuationByte) { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + + // |world| encodes the globe as a 4 byte UTF8 sequence. So, naturally, it'll + // have a start byte, followed by three continuation bytes. + std::string world = "🌎"; + ASSERT_EQ(4u, world.size()); + ASSERT_EQ(world[1] & 0xc0, 0x80); // checks for continuation byte + ASSERT_EQ(world[2] & 0xc0, 0x80); + ASSERT_EQ(world[3] & 0xc0, 0x80); + + // Now create a corrupted UTF8 string, starting with the first two bytes from + // |world|, followed by an ASCII message. Upon encountering '!', our decoder + // will realize that it's not a continuation byte; it'll skip to the end of + // this UTF8 sequence and continue with the next character. In this case, the + // 'H', of "Hello". + std::vector<uint8_t> chars; + chars.push_back(world[0]); + chars.push_back(world[1]); + chars.push_back('!'); + chars.push_back('?'); + chars.push_back('H'); + chars.push_back('e'); + chars.push_back('l'); + chars.push_back('l'); + chars.push_back('o'); + writer->HandleString8(SpanFrom(chars)); + EXPECT_EQ("\"Hello\"", out); // "Hello" shows we restarted at 'H'. +} + +TEST(JsonEncoder, EscapesLoneHighSurrogates) { + // This tests that the JSON encoder escapes lone high surrogates, i.e. + // invalid code points in the range from 0xD800 to 0xDBFF. In + // unescaped form, these cannot be represented in well-formed UTF-8 or + // UTF-16. + std::vector<uint16_t> chars = {'a', 0xd800, 'b', 0xdada, 'c', 0xdbff, 'd'}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleString16(span<uint16_t>(chars.data(), chars.size())); + EXPECT_EQ("\"a\\ud800b\\udadac\\udbffd\"", out); +} + +TEST(JsonEncoder, EscapesLoneLowSurrogates) { + // This tests that the JSON encoder escapes lone low surrogates, i.e. + // invalid code points in the range from 0xDC00 to 0xDFFF. In + // unescaped form, these cannot be represented in well-formed UTF-8 or + // UTF-16. + std::vector<uint16_t> chars = {'a', 0xdc00, 'b', 0xdede, 'c', 0xdfff, 'd'}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleString16(span<uint16_t>(chars.data(), chars.size())); + EXPECT_EQ("\"a\\udc00b\\udedec\\udfffd\"", out); +} + +TEST(JsonEncoder, EscapesFFFF) { + // This tests that the JSON encoder will escape the UTF16 input 0xffff as + // \uffff; useful to check this since it's an edge case. + std::vector<uint16_t> chars = {'a', 'b', 'c', 0xffff, 'd'}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleString16(span<uint16_t>(chars.data(), chars.size())); + EXPECT_EQ("\"abc\\uffffd\"", out); +} + +TEST(JsonEncoder, Passes0x7FString8) { + std::vector<uint8_t> chars = {'a', 0x7f, 'b'}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleString8(span<uint8_t>(chars.data(), chars.size())); + EXPECT_EQ( + "\"a\x7f" + "b\"", + out); +} + +TEST(JsonEncoder, Passes0x7FString16) { + std::vector<uint16_t> chars16 = {'a', 0x7f, 'b'}; + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleString16(span<uint16_t>(chars16.data(), chars16.size())); + EXPECT_EQ( + "\"a\x7f" + "b\"", + out); +} + +TEST(JsonEncoder, IncompleteUtf8Sequence) { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + + writer->HandleArrayBegin(); // This emits [, which starts an array. + + { // 🌎 takes four bytes to encode in UTF-8. We test with the first three; + // This means we're trying to emit a string that consists solely of an + // incomplete UTF-8 sequence. So the string in the JSON output is empty. + std::string world_utf8 = "🌎"; + ASSERT_EQ(4u, world_utf8.size()); + std::vector<uint8_t> chars(world_utf8.begin(), world_utf8.begin() + 3); + writer->HandleString8(SpanFrom(chars)); + EXPECT_EQ("[\"\"", out); // Incomplete sequence rejected: empty string. + } + + { // This time, the incomplete sequence is at the end of the string. + std::string msg = "Hello, \xF0\x9F\x8C"; + std::vector<uint8_t> chars(msg.begin(), msg.end()); + writer->HandleString8(SpanFrom(chars)); + EXPECT_EQ("[\"\",\"Hello, \"", out); // Incomplete sequence dropped at end. + } +} + +TEST(JsonStdStringWriterTest, HelloWorld) { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleMapBegin(); + WriteUTF8AsUTF16(writer.get(), "msg1"); + WriteUTF8AsUTF16(writer.get(), "Hello, 🌎."); + std::string key = "msg1-as-utf8"; + std::string value = "Hello, 🌎."; + writer->HandleString8(SpanFrom(key)); + writer->HandleString8(SpanFrom(value)); + WriteUTF8AsUTF16(writer.get(), "msg2"); + WriteUTF8AsUTF16(writer.get(), "\\\b\r\n\t\f\""); + WriteUTF8AsUTF16(writer.get(), "nested"); + writer->HandleMapBegin(); + WriteUTF8AsUTF16(writer.get(), "double"); + writer->HandleDouble(3.1415); + WriteUTF8AsUTF16(writer.get(), "int"); + writer->HandleInt32(-42); + WriteUTF8AsUTF16(writer.get(), "bool"); + writer->HandleBool(false); + WriteUTF8AsUTF16(writer.get(), "null"); + writer->HandleNull(); + writer->HandleMapEnd(); + WriteUTF8AsUTF16(writer.get(), "array"); + writer->HandleArrayBegin(); + writer->HandleInt32(1); + writer->HandleInt32(2); + writer->HandleInt32(3); + writer->HandleArrayEnd(); + writer->HandleMapEnd(); + EXPECT_TRUE(status.ok()); + EXPECT_EQ( + "{\"msg1\":\"Hello, \\ud83c\\udf0e.\"," + "\"msg1-as-utf8\":\"Hello, \\ud83c\\udf0e.\"," + "\"msg2\":\"\\\\\\b\\r\\n\\t\\f\\\"\"," + "\"nested\":{\"double\":3.1415,\"int\":-42," + "\"bool\":false,\"null\":null},\"array\":[1,2,3]}", + out); +} + +TEST(JsonStdStringWriterTest, ScalarsAreRenderedAsInt) { + // Test that Number.MIN_SAFE_INTEGER / Number.MAX_SAFE_INTEGER from Javascript + // are rendered as integers (no decimal point / rounding), even when we + // encode them from double. Javascript's Number is an IEE754 double, so + // it has 53 bits to represent integers. + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleMapBegin(); + + writer->HandleString8(SpanFrom("Number.MIN_SAFE_INTEGER")); + EXPECT_EQ(-0x1fffffffffffff, -9007199254740991); // 53 bits for integers. + writer->HandleDouble(-9007199254740991); // Note HandleDouble here. + + writer->HandleString8(SpanFrom("Number.MAX_SAFE_INTEGER")); + EXPECT_EQ(0x1fffffffffffff, 9007199254740991); // 53 bits for integers. + writer->HandleDouble(9007199254740991); // Note HandleDouble here. + + writer->HandleMapEnd(); + EXPECT_TRUE(status.ok()); + EXPECT_EQ( + "{\"Number.MIN_SAFE_INTEGER\":-9007199254740991," + "\"Number.MAX_SAFE_INTEGER\":9007199254740991}", + out); +} + +TEST(JsonStdStringWriterTest, RepresentingNonFiniteValuesAsNull) { + // JSON can't represent +Infinity, -Infinity, or NaN. + // So in practice it's mapped to null. + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleMapBegin(); + writer->HandleString8(SpanFrom("Infinity")); + writer->HandleDouble(std::numeric_limits<double>::infinity()); + writer->HandleString8(SpanFrom("-Infinity")); + writer->HandleDouble(-std::numeric_limits<double>::infinity()); + writer->HandleString8(SpanFrom("NaN")); + writer->HandleDouble(std::numeric_limits<double>::quiet_NaN()); + writer->HandleMapEnd(); + EXPECT_TRUE(status.ok()); + EXPECT_EQ("{\"Infinity\":null,\"-Infinity\":null,\"NaN\":null}", out); +} + +TEST(JsonStdStringWriterTest, BinaryEncodedAsJsonString) { + // The encoder emits binary submitted to ParserHandler::HandleBinary + // as base64. The following three examples are taken from + // https://en.wikipedia.org/wiki/Base64. + { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleBinary(SpanFrom(std::vector<uint8_t>({'M', 'a', 'n'}))); + EXPECT_TRUE(status.ok()); + EXPECT_EQ("\"TWFu\"", out); + } + { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleBinary(SpanFrom(std::vector<uint8_t>({'M', 'a'}))); + EXPECT_TRUE(status.ok()); + EXPECT_EQ("\"TWE=\"", out); + } + { + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleBinary(SpanFrom(std::vector<uint8_t>({'M'}))); + EXPECT_TRUE(status.ok()); + EXPECT_EQ("\"TQ==\"", out); + } + { // "Hello, world.", verified with base64decode.org. + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleBinary(SpanFrom(std::vector<uint8_t>( + {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}))); + EXPECT_TRUE(status.ok()); + EXPECT_EQ("\"SGVsbG8sIHdvcmxkLg==\"", out); + } +} + +TEST(JsonStdStringWriterTest, HandlesErrors) { + // When an error is sent via HandleError, it saves it in the provided + // status and clears the output. + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleMapBegin(); + WriteUTF8AsUTF16(writer.get(), "msg1"); + writer->HandleError(Status{Error::JSON_PARSER_VALUE_EXPECTED, 42}); + EXPECT_THAT(status, StatusIs(Error::JSON_PARSER_VALUE_EXPECTED, 42u)); + EXPECT_EQ("", out); +} + +TEST(JsonStdStringWriterTest, DoubleToString_LeadingZero) { + // In JSON, .1 must be rendered as 0.1, and -.7 must be rendered as -0.7. + std::string out; + Status status; + std::unique_ptr<ParserHandler> writer = NewJSONEncoder(&out, &status); + writer->HandleArrayBegin(); + writer->HandleDouble(.1); + writer->HandleDouble(-.7); + writer->HandleArrayEnd(); + EXPECT_EQ("[0.1,-0.7]", out); +} + +// ============================================================================= +// json::ParseJSON - for receiving streaming parser events for JSON +// ============================================================================= + +class Log : public ParserHandler { + public: + void HandleMapBegin() override { log_ << "map begin\n"; } + + void HandleMapEnd() override { log_ << "map end\n"; } + + void HandleArrayBegin() override { log_ << "array begin\n"; } + + void HandleArrayEnd() override { log_ << "array end\n"; } + + void HandleString8(span<uint8_t> chars) override { + log_ << "string8: " << std::string(chars.begin(), chars.end()) << "\n"; + } + + void HandleString16(span<uint16_t> chars) override { + raw_log_string16_.emplace_back(chars.begin(), chars.end()); + log_ << "string16: " << UTF16ToUTF8(chars) << "\n"; + } + + void HandleBinary(span<uint8_t> bytes) override { + // JSON doesn't have native support for arbitrary bytes, so our parser will + // never call this. + CHECK(false); + } + + void HandleDouble(double value) override { + log_ << "double: " << value << "\n"; + } + + void HandleInt32(int32_t value) override { log_ << "int: " << value << "\n"; } + + void HandleBool(bool value) override { log_ << "bool: " << value << "\n"; } + + void HandleNull() override { log_ << "null\n"; } + + void HandleError(Status status) override { status_ = status; } + + std::string str() const { return status_.ok() ? log_.str() : ""; } + + std::vector<std::vector<uint16_t>> raw_log_string16() const { + return raw_log_string16_; + } + + Status status() const { return status_; } + + private: + std::ostringstream log_; + std::vector<std::vector<uint16_t>> raw_log_string16_; + Status status_; +}; + +class JsonParserTest : public ::testing::Test { + protected: + Log log_; +}; + +TEST_F(JsonParserTest, SimpleDictionary) { + std::string json = "{\"foo\": 42}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: foo\n" + "int: 42\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, UsAsciiDelCornerCase) { + // DEL (0x7f) is a 7 bit US-ASCII character, and while it is a control + // character according to Unicode, it's not considered a control + // character in https://tools.ietf.org/html/rfc7159#section-7, so + // it can be placed directly into the JSON string, without JSON escaping. + std::string json = "{\"foo\": \"a\x7f\"}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: foo\n" + "string16: a\x7f\n" + "map end\n", + log_.str()); + + // We've seen an implementation of UTF16ToUTF8 which would replace the DEL + // character with ' ', so this simple roundtrip tests the routines in + // encoding_test_helper.h, to make test failures of the above easier to + // diagnose. + std::vector<uint16_t> utf16 = UTF8ToUTF16(SpanFrom(json)); + EXPECT_EQ(json, UTF16ToUTF8(SpanFrom(utf16))); +} + +TEST_F(JsonParserTest, Whitespace) { + std::string json = "\n {\n\"msg\"\n: \v\"Hello, world.\"\t\r}\t"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: msg\n" + "string16: Hello, world.\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, NestedDictionary) { + std::string json = "{\"foo\": {\"bar\": {\"baz\": 1}, \"bar2\": 2}}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: foo\n" + "map begin\n" + "string16: bar\n" + "map begin\n" + "string16: baz\n" + "int: 1\n" + "map end\n" + "string16: bar2\n" + "int: 2\n" + "map end\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, Doubles) { + std::string json = "{\"foo\": 3.1415, \"bar\": 31415e-4}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: foo\n" + "double: 3.1415\n" + "string16: bar\n" + "double: 3.1415\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, Unicode) { + // Globe character. 0xF0 0x9F 0x8C 0x8E in utf8, 0xD83C 0xDF0E in utf16. + std::string json = "{\"msg\": \"Hello, \\uD83C\\uDF0E.\"}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: msg\n" + "string16: Hello, 🌎.\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, Unicode_ParseUtf16) { + // Globe character. utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E. + // Crescent moon character. utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19. + + // We provide the moon with json escape, but the earth as utf16 input. + // Either way they arrive as utf8 (after decoding in log_.str()). + std::vector<uint16_t> json = + UTF8ToUTF16(SpanFrom("{\"space\": \"🌎 \\uD83C\\uDF19.\"}")); + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: space\n" + "string16: 🌎 🌙.\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, Unicode_ParseUtf16_SingleEscapeUpToFFFF) { + // 0xFFFF is the max codepoint that can be represented as a single \u escape. + // One way to write this is \uffff, another way is to encode it as a 3 byte + // UTF-8 sequence (0xef 0xbf 0xbf). Both are equivalent. + + // Example with both ways of encoding code point 0xFFFF in a JSON string. + std::string json = "{\"escape\": \"\xef\xbf\xbf or \\uffff\"}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + + // Shows both inputs result in equivalent output once converted to UTF-8. + EXPECT_EQ( + "map begin\n" + "string16: escape\n" + "string16: \xEF\xBF\xBF or \xEF\xBF\xBF\n" + "map end\n", + log_.str()); + + // Make an even stronger assertion: The parser represents \xffff as a single + // UTF-16 char. + ASSERT_EQ(2u, log_.raw_log_string16().size()); + std::vector<uint16_t> expected = {0xffff, ' ', 'o', 'r', ' ', 0xffff}; + EXPECT_EQ(expected, log_.raw_log_string16()[1]); +} + +TEST_F(JsonParserTest, Unicode_ParseUtf8) { + // Used below: + // гласность - example for 2 byte utf8, Russian word "glasnost" + // 屋 - example for 3 byte utf8, Chinese word for "house" + // 🌎 - example for 4 byte utf8: 0xF0 0x9F 0x8C 0x8E; utf16: 0xD83C 0xDF0E. + // 🌙 - example for escapes: utf8: 0xF0 0x9F 0x8C 0x99; utf16: 0xD83C 0xDF19. + + // We provide the moon with json escape, but the earth as utf8 input. + // Either way they arrive as utf8 (after decoding in log_.str()). + std::string json = + "{" + "\"escapes\": \"\\uD83C\\uDF19\"," + "\"2 byte\":\"гласность\"," + "\"3 byte\":\"屋\"," + "\"4 byte\":\"🌎\"" + "}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: escapes\n" + "string16: 🌙\n" + "string16: 2 byte\n" + "string16: гласность\n" + "string16: 3 byte\n" + "string16: 屋\n" + "string16: 4 byte\n" + "string16: 🌎\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, UnprocessedInputRemainsError) { + // Trailing junk after the valid JSON. + std::string json = "{\"foo\": 3.1415} junk"; + size_t junk_idx = json.find("junk"); + EXPECT_NE(junk_idx, std::string::npos); + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS, junk_idx)); + EXPECT_EQ("", log_.str()); +} + +std::string MakeNestedJson(int depth) { + std::string json; + for (int ii = 0; ii < depth; ++ii) + json += "{\"foo\":"; + json += "42"; + for (int ii = 0; ii < depth; ++ii) + json += "}"; + return json; +} + +TEST_F(JsonParserTest, StackLimitExceededError_BelowLimit) { + // kStackLimit is 300 (see json_parser.cc). First let's + // try with a small nested example. + std::string json_3 = MakeNestedJson(3); + ParseJSON(SpanFrom(json_3), &log_); + EXPECT_TRUE(log_.status().ok()); + EXPECT_EQ( + "map begin\n" + "string16: foo\n" + "map begin\n" + "string16: foo\n" + "map begin\n" + "string16: foo\n" + "int: 42\n" + "map end\n" + "map end\n" + "map end\n", + log_.str()); +} + +TEST_F(JsonParserTest, StackLimitExceededError_AtLimit) { + // Now with kStackLimit (300). + std::string json_limit = MakeNestedJson(300); + ParseJSON(span<uint8_t>(reinterpret_cast<const uint8_t*>(json_limit.data()), + json_limit.size()), + &log_); + EXPECT_THAT(log_.status(), StatusIsOk()); +} + +TEST_F(JsonParserTest, StackLimitExceededError_AboveLimit) { + // Now with kStackLimit + 1 (301) - it exceeds in the innermost instance. + std::string exceeded = MakeNestedJson(301); + ParseJSON(SpanFrom(exceeded), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, + strlen("{\"foo\":") * 301)); +} + +TEST_F(JsonParserTest, StackLimitExceededError_WayAboveLimit) { + // Now way past the limit. Still, the point of exceeding is 301. + std::string far_out = MakeNestedJson(320); + ParseJSON(SpanFrom(far_out), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_STACK_LIMIT_EXCEEDED, + strlen("{\"foo\":") * 301)); +} + +TEST_F(JsonParserTest, NoInputError) { + std::string json = ""; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_NO_INPUT, 0u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, InvalidTokenError) { + std::string json = "|"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_INVALID_TOKEN, 0u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, InvalidNumberError) { + // Mantissa exceeds max (the constant used here is int64_t max). + std::string json = "1E9223372036854775807"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_INVALID_NUMBER, 0u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, InvalidStringError) { + // \x22 is an unsupported escape sequence + std::string json = "\"foo\\x22\""; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_INVALID_STRING, 0u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, UnexpectedArrayEndError) { + std::string json = "[1,2,]"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_UNEXPECTED_ARRAY_END, 5u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, CommaOrArrayEndExpectedError) { + std::string json = "[1,2 2"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED, 5u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, StringLiteralExpectedError) { + // There's an error because the key bar, a string, is not terminated. + std::string json = "{\"foo\": 3.1415, \"bar: 31415e-4}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_STRING_LITERAL_EXPECTED, 16u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, ColonExpectedError) { + std::string json = "{\"foo\", 42}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_COLON_EXPECTED, 6u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, UnexpectedMapEndError) { + std::string json = "{\"foo\": 42, }"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_UNEXPECTED_MAP_END, 12u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, CommaOrMapEndExpectedError) { + // The second separator should be a comma. + std::string json = "{\"foo\": 3.1415: \"bar\": 0}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), + StatusIs(Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED, 14u)); + EXPECT_EQ("", log_.str()); +} + +TEST_F(JsonParserTest, ValueExpectedError) { + std::string json = "}"; + ParseJSON(SpanFrom(json), &log_); + EXPECT_THAT(log_.status(), StatusIs(Error::JSON_PARSER_VALUE_EXPECTED, 0u)); + EXPECT_EQ("", log_.str()); +} + +template <typename T> +class ConvertJSONToCBORTest : public ::testing::Test {}; + +using ContainerTestTypes = ::testing::Types<std::vector<uint8_t>, std::string>; +TYPED_TEST_SUITE(ConvertJSONToCBORTest, ContainerTestTypes); + +TYPED_TEST(ConvertJSONToCBORTest, RoundTripValidJson) { + const std::array<std::string, 7> jsons = {{ + "{\"msg\":\"Hello, world.\",\"lst\":[1,2,3]}", + "3.1415", + "false", + "true", + "\"Hello, world.\"", + "[1,2,3]", + "[]", + }}; + for (const std::string& json_in : jsons) { + SCOPED_TRACE(json_in); + TypeParam json(json_in.begin(), json_in.end()); + std::vector<uint8_t> cbor; + { + Status status = ConvertJSONToCBOR(SpanFrom(json), &cbor); + EXPECT_THAT(status, StatusIsOk()); + } + TypeParam roundtrip_json; + { + Status status = ConvertCBORToJSON(SpanFrom(cbor), &roundtrip_json); + EXPECT_THAT(status, StatusIsOk()); + } + EXPECT_EQ(json, roundtrip_json); + } +} + +TYPED_TEST(ConvertJSONToCBORTest, RoundTripValidJson16) { + std::vector<uint16_t> json16 = { + '{', '"', 'm', 's', 'g', '"', ':', '"', 'H', 'e', 'l', 'l', + 'o', ',', ' ', 0xd83c, 0xdf0e, '.', '"', ',', '"', 'l', 's', 't', + '"', ':', '[', '1', ',', '2', ',', '3', ']', '}'}; + std::vector<uint8_t> cbor; + { + Status status = + ConvertJSONToCBOR(span<uint16_t>(json16.data(), json16.size()), &cbor); + EXPECT_THAT(status, StatusIsOk()); + } + TypeParam roundtrip_json; + { + Status status = ConvertCBORToJSON(SpanFrom(cbor), &roundtrip_json); + EXPECT_THAT(status, StatusIsOk()); + } + std::string json = "{\"msg\":\"Hello, \\ud83c\\udf0e.\",\"lst\":[1,2,3]}"; + TypeParam expected_json(json.begin(), json.end()); + EXPECT_EQ(expected_json, roundtrip_json); +} +} // namespace json +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/parser_handler.h b/deps/inspector_protocol/crdtp/parser_handler.h new file mode 100644 index 00000000000000..ed7aae14da34b1 --- /dev/null +++ b/deps/inspector_protocol/crdtp/parser_handler.h @@ -0,0 +1,39 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_PARSER_HANDLER_H_ +#define CRDTP_PARSER_HANDLER_H_ + +#include <cstdint> +#include "span.h" +#include "status.h" + +namespace crdtp { +// Handler interface for parser events emitted by a streaming parser. +// See cbor::NewCBOREncoder, cbor::ParseCBOR, json::NewJSONEncoder, +// json::ParseJSON. +class ParserHandler { + public: + virtual ~ParserHandler() = default; + virtual void HandleMapBegin() = 0; + virtual void HandleMapEnd() = 0; + virtual void HandleArrayBegin() = 0; + virtual void HandleArrayEnd() = 0; + virtual void HandleString8(span<uint8_t> chars) = 0; + virtual void HandleString16(span<uint16_t> chars) = 0; + virtual void HandleBinary(span<uint8_t> bytes) = 0; + virtual void HandleDouble(double value) = 0; + virtual void HandleInt32(int32_t value) = 0; + virtual void HandleBool(bool value) = 0; + virtual void HandleNull() = 0; + + // The parser may send one error even after other events have already + // been received. Client code is reponsible to then discard the + // already processed events. + // |error| must be an eror, as in, |error.is_ok()| can't be true. + virtual void HandleError(Status error) = 0; +}; +} // namespace crdtp + +#endif // CRDTP_PARSER_HANDLER_H_ diff --git a/deps/inspector_protocol/crdtp/protocol_core.cc b/deps/inspector_protocol/crdtp/protocol_core.cc new file mode 100644 index 00000000000000..69773593ded162 --- /dev/null +++ b/deps/inspector_protocol/crdtp/protocol_core.cc @@ -0,0 +1,289 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "protocol_core.h" + +#include <algorithm> +#include <cassert> +#include <string> + +namespace crdtp { + +DeserializerState::DeserializerState(std::vector<uint8_t> bytes) + : storage_(new std::vector<uint8_t>(std::move(bytes))), + tokenizer_(span<uint8_t>(storage_->data(), storage_->size())) {} + +DeserializerState::DeserializerState(Storage storage, span<uint8_t> span) + : storage_(std::move(storage)), tokenizer_(span) {} + +void DeserializerState::RegisterError(Error error) { + assert(Error::OK != error); + if (tokenizer_.Status().ok()) + status_ = Status{error, tokenizer_.Status().pos}; +} + +void DeserializerState::RegisterFieldPath(span<char> name) { + field_path_.push_back(name); +} + +std::string DeserializerState::ErrorMessage(span<char> message_name) const { + std::string msg = "Failed to deserialize "; + msg.append(message_name.begin(), message_name.end()); + for (int field = static_cast<int>(field_path_.size()) - 1; field >= 0; + --field) { + msg.append("."); + msg.append(field_path_[field].begin(), field_path_[field].end()); + } + Status s = status(); + if (!s.ok()) + msg += " - " + s.ToASCIIString(); + return msg; +} + +Status DeserializerState::status() const { + if (!tokenizer_.Status().ok()) + return tokenizer_.Status(); + return status_; +} + +namespace { +constexpr int32_t GetMandatoryFieldMask( + const DeserializerDescriptor::Field* fields, + size_t count) { + int32_t mask = 0; + for (size_t i = 0; i < count; ++i) { + if (!fields[i].is_optional) + mask |= (1 << i); + } + return mask; +} +} // namespace + +DeserializerDescriptor::DeserializerDescriptor(const Field* fields, + size_t field_count) + : fields_(fields), + field_count_(field_count), + mandatory_field_mask_(GetMandatoryFieldMask(fields, field_count)) {} + +bool DeserializerDescriptor::Deserialize(DeserializerState* state, + void* obj) const { + auto* tokenizer = state->tokenizer(); + + // As a special compatibility quirk, allow empty objects if + // no mandatory fields are required. + if (tokenizer->TokenTag() == cbor::CBORTokenTag::DONE && + !mandatory_field_mask_) { + return true; + } + if (tokenizer->TokenTag() == cbor::CBORTokenTag::ENVELOPE) + tokenizer->EnterEnvelope(); + if (tokenizer->TokenTag() != cbor::CBORTokenTag::MAP_START) { + state->RegisterError(Error::CBOR_MAP_START_EXPECTED); + return false; + } + tokenizer->Next(); + int32_t seen_mandatory_fields = 0; + for (; tokenizer->TokenTag() != cbor::CBORTokenTag::STOP; tokenizer->Next()) { + if (tokenizer->TokenTag() != cbor::CBORTokenTag::STRING8) { + state->RegisterError(Error::CBOR_INVALID_MAP_KEY); + return false; + } + span<uint8_t> u_key = tokenizer->GetString8(); + span<char> key(reinterpret_cast<const char*>(u_key.data()), u_key.size()); + tokenizer->Next(); + if (!DeserializeField(state, key, &seen_mandatory_fields, obj)) + return false; + } + // Only compute mandatory fields once per type. + int32_t missing_fields = seen_mandatory_fields ^ mandatory_field_mask_; + if (missing_fields) { + int32_t idx = 0; + while ((missing_fields & 1) == 0) { + missing_fields >>= 1; + ++idx; + } + state->RegisterError(Error::BINDINGS_MANDATORY_FIELD_MISSING); + state->RegisterFieldPath(fields_[idx].name); + return false; + } + return true; +} + +bool DeserializerDescriptor::DeserializeField(DeserializerState* state, + span<char> name, + int* seen_mandatory_fields, + void* obj) const { + // TODO(caseq): consider checking if the sought field is the one + // after the last deserialized. + const auto* begin = fields_; + const auto* end = fields_ + field_count_; + auto entry = std::lower_bound( + begin, end, name, [](const Field& field_desc, span<char> field_name) { + return SpanLessThan(field_desc.name, field_name); + }); + // Unknown field is not an error -- we may be working against an + // implementation of a later version of the protocol. + // TODO(caseq): support unknown arrays and maps not enclosed by an envelope. + if (entry == end || !SpanEquals(entry->name, name)) + return true; + if (!entry->deserializer(state, obj)) { + state->RegisterFieldPath(name); + return false; + } + if (!entry->is_optional) + *seen_mandatory_fields |= 1 << (entry - begin); + return true; +} + +bool ProtocolTypeTraits<bool>::Deserialize(DeserializerState* state, + bool* value) { + const auto tag = state->tokenizer()->TokenTag(); + if (tag == cbor::CBORTokenTag::TRUE_VALUE) { + *value = true; + return true; + } + if (tag == cbor::CBORTokenTag::FALSE_VALUE) { + *value = false; + return true; + } + state->RegisterError(Error::BINDINGS_BOOL_VALUE_EXPECTED); + return false; +} + +void ProtocolTypeTraits<bool>::Serialize(bool value, + std::vector<uint8_t>* bytes) { + bytes->push_back(value ? cbor::EncodeTrue() : cbor::EncodeFalse()); +} + +bool ProtocolTypeTraits<int32_t>::Deserialize(DeserializerState* state, + int32_t* value) { + if (state->tokenizer()->TokenTag() != cbor::CBORTokenTag::INT32) { + state->RegisterError(Error::BINDINGS_INT32_VALUE_EXPECTED); + return false; + } + *value = state->tokenizer()->GetInt32(); + return true; +} + +void ProtocolTypeTraits<int32_t>::Serialize(int32_t value, + std::vector<uint8_t>* bytes) { + cbor::EncodeInt32(value, bytes); +} + +ContainerSerializer::ContainerSerializer(std::vector<uint8_t>* bytes, + uint8_t tag) + : bytes_(bytes) { + envelope_.EncodeStart(bytes_); + bytes_->push_back(tag); +} + +void ContainerSerializer::EncodeStop() { + bytes_->push_back(cbor::EncodeStop()); + envelope_.EncodeStop(bytes_); +} + +ObjectSerializer::ObjectSerializer() + : serializer_(&owned_bytes_, cbor::EncodeIndefiniteLengthMapStart()) {} + +ObjectSerializer::~ObjectSerializer() = default; + +std::unique_ptr<Serializable> ObjectSerializer::Finish() { + serializer_.EncodeStop(); + return Serializable::From(std::move(owned_bytes_)); +} + +bool ProtocolTypeTraits<double>::Deserialize(DeserializerState* state, + double* value) { + // Double values that round-trip through JSON may end up getting represented + // as an int32 (SIGNED, UNSIGNED) on the wire in CBOR. Therefore, we also + // accept an INT32 here. + if (state->tokenizer()->TokenTag() == cbor::CBORTokenTag::INT32) { + *value = state->tokenizer()->GetInt32(); + return true; + } + if (state->tokenizer()->TokenTag() != cbor::CBORTokenTag::DOUBLE) { + state->RegisterError(Error::BINDINGS_DOUBLE_VALUE_EXPECTED); + return false; + } + *value = state->tokenizer()->GetDouble(); + return true; +} + +void ProtocolTypeTraits<double>::Serialize(double value, + std::vector<uint8_t>* bytes) { + cbor::EncodeDouble(value, bytes); +} + +class IncomingDeferredMessage : public DeferredMessage { + public: + // Creates the state from the part of another message. + // Note storage is opaque and is mostly to retain ownership. + // It may be null in case caller owns the memory and will dispose + // of the message synchronously. + IncomingDeferredMessage(DeserializerState::Storage storage, + span<uint8_t> span) + : storage_(storage), span_(span) {} + + private: + DeserializerState MakeDeserializer() const override { + return DeserializerState(storage_, span_); + } + void AppendSerialized(std::vector<uint8_t>* out) const override { + out->insert(out->end(), span_.begin(), span_.end()); + } + + DeserializerState::Storage storage_; + span<uint8_t> span_; +}; + +class OutgoingDeferredMessage : public DeferredMessage { + public: + OutgoingDeferredMessage() = default; + explicit OutgoingDeferredMessage(std::unique_ptr<Serializable> serializable) + : serializable_(std::move(serializable)) { + assert(!!serializable_); + } + + private: + DeserializerState MakeDeserializer() const override { + return DeserializerState(serializable_->Serialize()); + } + void AppendSerialized(std::vector<uint8_t>* out) const override { + serializable_->AppendSerialized(out); + } + + std::unique_ptr<Serializable> serializable_; +}; + +// static +std::unique_ptr<DeferredMessage> DeferredMessage::FromSerializable( + std::unique_ptr<Serializable> serializeable) { + return std::make_unique<OutgoingDeferredMessage>(std::move(serializeable)); +} + +// static +std::unique_ptr<DeferredMessage> DeferredMessage::FromSpan( + span<uint8_t> bytes) { + return std::make_unique<IncomingDeferredMessage>(nullptr, bytes); +} + +bool ProtocolTypeTraits<std::unique_ptr<DeferredMessage>>::Deserialize( + DeserializerState* state, + std::unique_ptr<DeferredMessage>* value) { + if (state->tokenizer()->TokenTag() != cbor::CBORTokenTag::ENVELOPE) { + state->RegisterError(Error::CBOR_INVALID_ENVELOPE); + return false; + } + *value = std::make_unique<IncomingDeferredMessage>( + state->storage(), state->tokenizer()->GetEnvelope()); + return true; +} + +void ProtocolTypeTraits<DeferredMessage>::Serialize( + const DeferredMessage& value, + std::vector<uint8_t>* bytes) { + value.AppendSerialized(bytes); +} + +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/protocol_core.h b/deps/inspector_protocol/crdtp/protocol_core.h new file mode 100644 index 00000000000000..f8283367773a42 --- /dev/null +++ b/deps/inspector_protocol/crdtp/protocol_core.h @@ -0,0 +1,405 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_PROTOCOL_CORE_H_ +#define CRDTP_PROTOCOL_CORE_H_ + +#include <sys/types.h> + +#include <memory> +#include <optional> +#include <string> +#include <tuple> +#include <vector> + +#include "cbor.h" +#include "serializable.h" +#include "span.h" +#include "status.h" + +namespace crdtp { + +class CRDTP_EXPORT DeserializerState { + public: + using Storage = std::shared_ptr<const std::vector<uint8_t>>; + + // Creates a state from the raw bytes received from the peer. + explicit DeserializerState(std::vector<uint8_t> bytes); + // Creates the state from the part of another message. + DeserializerState(Storage storage, span<uint8_t> span); + DeserializerState(const DeserializerState& r) = delete; + DeserializerState(DeserializerState&& r) = default; + + // Registers |error|, unless the tokenizer's status is already an error. + void RegisterError(Error error); + // Registers |name| as a segment of the field path. + void RegisterFieldPath(span<char> name); + + // Produces an error message considering |tokenizer.Status()|, + // status_, and field_path_. + std::string ErrorMessage(span<char> message_name) const; + Status status() const; + const Storage& storage() const { return storage_; } + cbor::CBORTokenizer* tokenizer() { return &tokenizer_; } + + private: + const Storage storage_; + cbor::CBORTokenizer tokenizer_; + Status status_; + std::vector<span<char>> field_path_; +}; + +template <typename T, typename = void> +struct ProtocolTypeTraits {}; + +template <> +struct CRDTP_EXPORT ProtocolTypeTraits<bool> { + static bool Deserialize(DeserializerState* state, bool* value); + static void Serialize(bool value, std::vector<uint8_t>* bytes); +}; + +template <> +struct CRDTP_EXPORT ProtocolTypeTraits<int32_t> { + static bool Deserialize(DeserializerState* state, int* value); + static void Serialize(int value, std::vector<uint8_t>* bytes); +}; + +template <> +struct CRDTP_EXPORT ProtocolTypeTraits<double> { + static bool Deserialize(DeserializerState* state, double* value); + static void Serialize(double value, std::vector<uint8_t>* bytes); +}; + +class CRDTP_EXPORT ContainerSerializer { + public: + ContainerSerializer(std::vector<uint8_t>* bytes, uint8_t tag); + + template <typename T> + void AddField(span<char> field_name, const T& value) { + cbor::EncodeString8( + span<uint8_t>(reinterpret_cast<const uint8_t*>(field_name.data()), + field_name.size()), + bytes_); + ProtocolTypeTraits<T>::Serialize(value, bytes_); + } + template <typename T> + void AddField(span<char> field_name, const std::optional<T>& value) { + if (!value.has_value()) { + return; + } + AddField(field_name, value.value()); + } + + template <typename T> + void AddField(span<char> field_name, const std::unique_ptr<T>& value) { + if (!value) { + return; + } + AddField(field_name, *value); + } + + void EncodeStop(); + + private: + std::vector<uint8_t>* const bytes_; + cbor::EnvelopeEncoder envelope_; +}; + +class CRDTP_EXPORT ObjectSerializer { + public: + ObjectSerializer(); + ~ObjectSerializer(); + + template <typename T> + void AddField(span<char> name, const T& field) { + serializer_.AddField(name, field); + } + std::unique_ptr<Serializable> Finish(); + + private: + std::vector<uint8_t> owned_bytes_; + ContainerSerializer serializer_; +}; + +class CRDTP_EXPORT DeserializerDescriptor { + public: + struct CRDTP_EXPORT Field { + span<char> name; + bool is_optional; + bool (*deserializer)(DeserializerState* state, void* obj); + }; + + DeserializerDescriptor(const Field* fields, size_t field_count); + + bool Deserialize(DeserializerState* state, void* obj) const; + + private: + bool DeserializeField(DeserializerState* state, + span<char> name, + int* seen_mandatory_fields, + void* obj) const; + + const Field* const fields_; + const size_t field_count_; + const int mandatory_field_mask_; +}; + +template <typename T> +struct ProtocolTypeTraits<std::vector<T>> { + static bool Deserialize(DeserializerState* state, std::vector<T>* value) { + auto* tokenizer = state->tokenizer(); + if (tokenizer->TokenTag() == cbor::CBORTokenTag::ENVELOPE) + tokenizer->EnterEnvelope(); + if (tokenizer->TokenTag() != cbor::CBORTokenTag::ARRAY_START) { + state->RegisterError(Error::CBOR_ARRAY_START_EXPECTED); + return false; + } + assert(value->empty()); + tokenizer->Next(); + for (; tokenizer->TokenTag() != cbor::CBORTokenTag::STOP; + tokenizer->Next()) { + value->emplace_back(); + if (!ProtocolTypeTraits<T>::Deserialize(state, &value->back())) + return false; + } + return true; + } + + static void Serialize(const std::vector<T>& value, + std::vector<uint8_t>* bytes) { + ContainerSerializer container_serializer( + bytes, cbor::EncodeIndefiniteLengthArrayStart()); + for (const auto& item : value) + ProtocolTypeTraits<T>::Serialize(item, bytes); + container_serializer.EncodeStop(); + } +}; + +template <typename T> +struct ProtocolTypeTraits<std::unique_ptr<std::vector<T>>> { + static bool Deserialize(DeserializerState* state, + std::unique_ptr<std::vector<T>>* value) { + auto res = std::make_unique<std::vector<T>>(); + if (!ProtocolTypeTraits<std::vector<T>>::Deserialize(state, res.get())) + return false; + *value = std::move(res); + return true; + } + static void Serialize(const std::unique_ptr<std::vector<T>>& value, + std::vector<uint8_t>* bytes) { + ProtocolTypeTraits<std::vector<T>>::Serialize(*value, bytes); + } +}; + +class CRDTP_EXPORT DeferredMessage : public Serializable { + public: + static std::unique_ptr<DeferredMessage> FromSerializable( + std::unique_ptr<Serializable> serializeable); + static std::unique_ptr<DeferredMessage> FromSpan(span<uint8_t> bytes); + + ~DeferredMessage() override = default; + virtual DeserializerState MakeDeserializer() const = 0; + + protected: + DeferredMessage() = default; +}; + +template <> +struct CRDTP_EXPORT ProtocolTypeTraits<std::unique_ptr<DeferredMessage>> { + static bool Deserialize(DeserializerState* state, + std::unique_ptr<DeferredMessage>* value); +}; + +template <> +struct CRDTP_EXPORT ProtocolTypeTraits<DeferredMessage> { + static void Serialize(const DeferredMessage& value, + std::vector<uint8_t>* bytes); +}; + +template <typename T> +struct ProtocolTypeTraits<std::optional<T>> { + static bool Deserialize(DeserializerState* state, + std::optional<T>* value) { + T res; + if (!ProtocolTypeTraits<T>::Deserialize(state, &res)) + return false; + *value = std::move(res); + return true; + } + + static void Serialize(const std::optional<T>& value, + std::vector<uint8_t>* bytes) { + ProtocolTypeTraits<T>::Serialize(value.value(), bytes); + } +}; + +template <typename T> +class DeserializableProtocolObject { + public: + static StatusOr<std::unique_ptr<T>> ReadFrom( + const DeferredMessage& deferred_message) { + auto state = deferred_message.MakeDeserializer(); + if (auto res = Deserialize(&state)) + return StatusOr<std::unique_ptr<T>>(std::move(res)); + return StatusOr<std::unique_ptr<T>>(state.status()); + } + + static StatusOr<std::unique_ptr<T>> ReadFrom(std::vector<uint8_t> bytes) { + auto state = DeserializerState(std::move(bytes)); + if (auto res = Deserialize(&state)) + return StatusOr<std::unique_ptr<T>>(std::move(res)); + return StatusOr<std::unique_ptr<T>>(state.status()); + } + + // Short-hand for legacy clients. This would swallow any errors, consider + // using ReadFrom. + static std::unique_ptr<T> FromBinary(const uint8_t* bytes, size_t size) { + std::unique_ptr<T> value(new T()); + auto deserializer = DeferredMessage::FromSpan(span<uint8_t>(bytes, size)) + ->MakeDeserializer(); + std::ignore = Deserialize(&deserializer, value.get()); + return value; + } + + [[nodiscard]] static bool Deserialize(DeserializerState* state, T* value) { + return T::deserializer_descriptor().Deserialize(state, value); + } + + protected: + // This is for the sake of the macros used by derived classes thay may be in + // a different namespace; + using ProtocolType = T; + using DeserializerDescriptorType = DeserializerDescriptor; + template <typename U> + using DeserializableBase = DeserializableProtocolObject<U>; + + DeserializableProtocolObject() = default; + ~DeserializableProtocolObject() = default; + + private: + friend struct ProtocolTypeTraits<std::unique_ptr<T>>; + + static std::unique_ptr<T> Deserialize(DeserializerState* state) { + std::unique_ptr<T> value(new T()); + if (Deserialize(state, value.get())) + return value; + return nullptr; + } +}; + +template <typename T> +class ProtocolObject : public Serializable, + public DeserializableProtocolObject<T> { + public: + std::unique_ptr<T> Clone() const { + std::vector<uint8_t> serialized; + AppendSerialized(&serialized); + return T::ReadFrom(std::move(serialized)).value(); + } + + protected: + using ProtocolType = T; + + ProtocolObject() = default; +}; + +template <typename T> +struct ProtocolTypeTraits< + T, + typename std::enable_if< + std::is_base_of<ProtocolObject<T>, T>::value>::type> { + static bool Deserialize(DeserializerState* state, T* value) { + return T::Deserialize(state, value); + } + + static void Serialize(const T& value, std::vector<uint8_t>* bytes) { + value.AppendSerialized(bytes); + } +}; + +template <typename T> +struct ProtocolTypeTraits< + std::unique_ptr<T>, + typename std::enable_if< + std::is_base_of<ProtocolObject<T>, T>::value>::type> { + static bool Deserialize(DeserializerState* state, std::unique_ptr<T>* value) { + std::unique_ptr<T> res = T::Deserialize(state); + if (!res) + return false; + *value = std::move(res); + return true; + } + + static void Serialize(const std::unique_ptr<T>& value, + std::vector<uint8_t>* bytes) { + ProtocolTypeTraits<T>::Serialize(*value, bytes); + } +}; + +template <typename T, typename F> +bool ConvertProtocolValue(const F& from, T* to) { + std::vector<uint8_t> bytes; + ProtocolTypeTraits<F>::Serialize(from, &bytes); + auto deserializer = + DeferredMessage::FromSpan(span<uint8_t>(bytes.data(), bytes.size())) + ->MakeDeserializer(); + return ProtocolTypeTraits<T>::Deserialize(&deserializer, to); +} + +#define DECLARE_DESERIALIZATION_SUPPORT() \ + friend DeserializableBase<ProtocolType>; \ + static const DeserializerDescriptorType& deserializer_descriptor() + +#define DECLARE_SERIALIZATION_SUPPORT() \ + public: \ + void AppendSerialized(std::vector<uint8_t>* bytes) const override; \ + \ + private: \ + friend DeserializableBase<ProtocolType>; \ + static const DeserializerDescriptorType& deserializer_descriptor() + +#define CRDTP_DESERIALIZE_FILED_IMPL(name, field, is_optional) \ + { \ + MakeSpan(name), is_optional, \ + [](DeserializerState* __state, void* __obj) -> bool { \ + return ProtocolTypeTraits<decltype(field)>::Deserialize( \ + __state, &static_cast<ProtocolType*>(__obj)->field); \ + } \ + } + +// clang-format off +#define CRDTP_BEGIN_DESERIALIZER(type) \ + const type::DeserializerDescriptorType& type::deserializer_descriptor() { \ + using namespace crdtp; \ + static const DeserializerDescriptorType::Field fields[] = { + +#define CRDTP_END_DESERIALIZER() \ + }; \ + static const DeserializerDescriptorType s_desc( \ + fields, sizeof fields / sizeof fields[0]); \ + return s_desc; \ + } + +#define CRDTP_DESERIALIZE_FIELD(name, field) \ + CRDTP_DESERIALIZE_FILED_IMPL(name, field, false) +#define CRDTP_DESERIALIZE_FIELD_OPT(name, field) \ + CRDTP_DESERIALIZE_FILED_IMPL(name, field, true) + +#define CRDTP_BEGIN_SERIALIZER(type) \ + void type::AppendSerialized(std::vector<uint8_t>* bytes) const { \ + using namespace crdtp; \ + ContainerSerializer __serializer(bytes, \ + cbor::EncodeIndefiniteLengthMapStart()); + +#define CRDTP_SERIALIZE_FIELD(name, field) \ + __serializer.AddField(MakeSpan(name), field) + +#define CRDTP_END_SERIALIZER() \ + __serializer.EncodeStop(); \ + } class __cddtp_dummy_name +// clang-format on + +} // namespace crdtp + +#endif // CRDTP_PROTOCOL_CORE_H_ diff --git a/deps/inspector_protocol/crdtp/protocol_core_test.cc b/deps/inspector_protocol/crdtp/protocol_core_test.cc new file mode 100644 index 00000000000000..dbe99be634b8f0 --- /dev/null +++ b/deps/inspector_protocol/crdtp/protocol_core_test.cc @@ -0,0 +1,474 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "protocol_core.h" + +#include <memory> + +#include "cbor.h" +#include "status_test_support.h" +#include "test_platform.h" +#include "test_string_traits.h" + +namespace crdtp { + +namespace { +using ::testing::Eq; + +template <typename TResult, typename TArg> +std::unique_ptr<TResult> RoundtripToType(const TArg& obj) { + std::vector<uint8_t> bytes; + obj.AppendSerialized(&bytes); + + StatusOr<std::unique_ptr<TResult>> result = + TResult::ReadFrom(std::move(bytes)); + return std::move(result).value(); +} + +template <typename T> +std::unique_ptr<T> Roundtrip(const T& obj) { + return RoundtripToType<T, T>(obj); +} + +// These TestTypeFOO classes below would normally be generated +// by the protocol generator. + +class TestTypeBasic : public ProtocolObject<TestTypeBasic> { + public: + TestTypeBasic() = default; + + const std::string& GetValue() const { return value_; } + void SetValue(std::string value) { value_ = std::move(value); } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + std::string value_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeBasic) + CRDTP_DESERIALIZE_FIELD("value", value_) +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeBasic) + CRDTP_SERIALIZE_FIELD("value", value_); +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST(ProtocolCoreTest, Basic) { + TestTypeBasic obj1; + obj1.SetValue("foo"); + + auto obj2 = Roundtrip(obj1); + ASSERT_THAT(obj2, Not(testing::IsNull())); + EXPECT_THAT(obj2->GetValue(), Eq("foo")); +} + +TEST(ProtocolCoreTest, FailedToDeserializeTestTypeBasic) { + std::vector<uint8_t> garbage = {'g', 'a', 'r', 'b', 'a', 'g', 'e'}; + StatusOr<std::unique_ptr<TestTypeBasic>> result = + TestTypeBasic::ReadFrom(std::move(garbage)); + EXPECT_THAT(result.status(), StatusIs(Error::CBOR_INVALID_STRING8, 0)); +} + +class TestTypeBasicDouble : public ProtocolObject<TestTypeBasicDouble> { + public: + TestTypeBasicDouble() = default; + + double GetValue() const { return value_; } + void SetValue(double value) { value_ = value; } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + double value_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeBasicDouble) + CRDTP_DESERIALIZE_FIELD("value", value_) +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeBasicDouble) + CRDTP_SERIALIZE_FIELD("value", value_); +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST(TestBasicDouble, ParserAllowsAllowsDoubleEncodedAsInt) { + // We allow double's encoded as INT32, because this is what a roundtrip via + // JSON would produce. + std::vector<uint8_t> encoded; + crdtp::cbor::EnvelopeEncoder envelope; + envelope.EncodeStart(&encoded); + encoded.push_back(crdtp::cbor::EncodeIndefiniteLengthMapStart()); + crdtp::cbor::EncodeString8(crdtp::SpanFrom("value"), &encoded); + crdtp::cbor::EncodeInt32( + 42, &encoded); // It's a double field, but we encode an int. + encoded.push_back(crdtp::cbor::EncodeStop()); + envelope.EncodeStop(&encoded); + auto obj = TestTypeBasicDouble::ReadFrom(encoded).value(); + ASSERT_THAT(obj, Not(testing::IsNull())); + EXPECT_THAT(obj->GetValue(), Eq(42)); +} + +class TestTypeComposite : public ProtocolObject<TestTypeComposite> { + public: + bool GetBoolField() const { return bool_field_; } + void SetBoolField(bool value) { bool_field_ = value; } + + int GetIntField() const { return int_field_; } + void SetIntField(int value) { int_field_ = value; } + + double GetDoubleField() const { return double_field_; } + void SetDoubleField(double value) { double_field_ = value; } + + const std::string& GetStrField() const { return str_field_; } + void SetStrField(std::string value) { str_field_ = std::move(value); } + + const TestTypeBasic* GetTestTypeBasicField() { + return test_type1_field_.get(); + } + void SetTestTypeBasicField(std::unique_ptr<TestTypeBasic> value) { + test_type1_field_ = std::move(value); + } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + bool bool_field_ = false; + int int_field_ = 0; + double double_field_ = 0.0; + std::string str_field_; + std::unique_ptr<TestTypeBasic> test_type1_field_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeComposite) + CRDTP_DESERIALIZE_FIELD("bool_field", bool_field_), + CRDTP_DESERIALIZE_FIELD("double_field", double_field_), + CRDTP_DESERIALIZE_FIELD("int_field", int_field_), + CRDTP_DESERIALIZE_FIELD("str_field", str_field_), + CRDTP_DESERIALIZE_FIELD("test_type1_field", test_type1_field_), +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeComposite) + CRDTP_SERIALIZE_FIELD("bool_field", bool_field_), + CRDTP_SERIALIZE_FIELD("double_field", double_field_), + CRDTP_SERIALIZE_FIELD("int_field", int_field_), + CRDTP_SERIALIZE_FIELD("str_field", str_field_), + CRDTP_SERIALIZE_FIELD("test_type1_field", test_type1_field_), +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST(ProtocolCoreTest, Composite) { + TestTypeComposite obj1; + obj1.SetBoolField(true); + obj1.SetIntField(42); + obj1.SetDoubleField(2.718281828); + obj1.SetStrField("bar"); + auto val1 = std::make_unique<TestTypeBasic>(); + val1->SetValue("bazzzz"); + obj1.SetTestTypeBasicField(std::move(val1)); + + auto obj2 = Roundtrip(obj1); + ASSERT_THAT(obj2, Not(testing::IsNull())); + EXPECT_THAT(obj2->GetBoolField(), Eq(true)); + EXPECT_THAT(obj2->GetIntField(), Eq(42)); + EXPECT_THAT(obj2->GetDoubleField(), Eq(2.718281828)); + EXPECT_THAT(obj2->GetStrField(), Eq("bar")); + EXPECT_THAT(obj2->GetTestTypeBasicField()->GetValue(), Eq("bazzzz")); +} + +class CompositeParsingTest : public testing::Test { + public: + CompositeParsingTest() { + TestTypeComposite top; + top.SetIntField(42); + top.SetBoolField(true); + top.SetIntField(42); + top.SetDoubleField(2.718281828); + top.SetStrField("junk"); + auto child = std::make_unique<TestTypeBasic>(); + child->SetValue("child_value"); + top.SetTestTypeBasicField(std::move(child)); + + // Let's establish that |serialized_| is a properly serialized + // representation of |top|, by checking that it deserializes ok. + top.AppendSerialized(&serialized_); + TestTypeComposite::ReadFrom(serialized_).value(); + } + + protected: + std::vector<uint8_t> serialized_; +}; + +TEST_F(CompositeParsingTest, DecodingFailure_CBORTokenizer) { + // Mutates |serialized_| so that it won't parse correctly. In this case, + // we're changing a string value so that it's invalid, making CBORTokenizer + // unhappy. + size_t position = + std::string(reinterpret_cast<const char*>(serialized_.data()), + serialized_.size()) + .find("child_value"); + EXPECT_GT(position, 0ul); + // We override the byte just before so that it's still a string + // (3 << 5), but the length is encoded in the bytes that follows. + // So, we override that with 0xff (255), which exceeds the length + // of the message and thereby makes the string8 invalid. + --position; + serialized_[position] = 3 << 5 | // major type: STRING + 25; // length in encoded in byte that follows. + serialized_[position + 1] = 0xff; // length + auto result = TestTypeComposite::ReadFrom(serialized_); + + EXPECT_THAT(result.status(), StatusIs(Error::CBOR_INVALID_STRING8, position)); +} + +TEST_F(CompositeParsingTest, DecodingFailure_MandatoryFieldMissingShallow) { + // We're changing the string key "int_field" to something else ("lnt_field"), + // so that the mandatory field value won't be found. Unknown fields are + // ignored for compatibility, so that's why this simple technique works here. + size_t position = + std::string(reinterpret_cast<const char*>(serialized_.data()), + serialized_.size()) + .find("int_field"); + serialized_[position] = 'l'; // Change 'i' to 'l'. + // serialized_.size() - 1 is the STOP character for the entire message, + size_t expected_error_pos = serialized_.size() - 1; + auto result = TestTypeComposite::ReadFrom(serialized_); + EXPECT_THAT(result.status(), StatusIs(Error::BINDINGS_MANDATORY_FIELD_MISSING, + expected_error_pos)); +} + +TEST_F(CompositeParsingTest, DecodingFailure_MandatoryFieldMissingNested) { + // We're changing the string key "value" to something else ("falue"), so that + // the mandatory field value in TestTypeBasic in the child won't be found. + size_t position = + std::string(reinterpret_cast<const char*>(serialized_.data()), + serialized_.size()) + .find("value"); + serialized_[position] = 'f'; // Change 'v' to 'f'. + // serialized_.size() - 1 is the STOP character for the enclosing message, + // and serialized_.size() - 2 is the STOP character for TestTypeBasic. + size_t expected_error_pos = serialized_.size() - 2; + auto result = TestTypeComposite::ReadFrom(serialized_); + EXPECT_THAT(result.status(), StatusIs(Error::BINDINGS_MANDATORY_FIELD_MISSING, + expected_error_pos)); +} + +TEST_F(CompositeParsingTest, DecodingFailure_BoolValueExpected) { + // We're changing the bool value (true) to null; we do this by looking + // for bool_field, and searching from there for TRUE; both TRUE and null + // are just one byte in the serialized buffer, so this swap is convenient. + std::string serialized_view(reinterpret_cast<const char*>(serialized_.data()), + serialized_.size()); + size_t position = serialized_view.find("bool_field"); + for (; position < serialized_.size(); ++position) { + if (serialized_[position] == crdtp::cbor::EncodeTrue()) { + serialized_[position] = crdtp::cbor::EncodeNull(); + break; + } + } + auto result = TestTypeComposite::ReadFrom(serialized_); + EXPECT_THAT(result.status(), + StatusIs(Error::BINDINGS_BOOL_VALUE_EXPECTED, position)); +} + +class TestTypeArrays : public ProtocolObject<TestTypeArrays> { + public: + const std::vector<int>* GetIntArray() const { return &int_array_; } + void SetIntArray(std::vector<int> value) { int_array_ = std::move(value); } + + const std::vector<double>* GetDoubleArray() const { return &double_array_; } + void SetDoubleArray(std::vector<double> value) { + double_array_ = std::move(value); + } + + const std::vector<std::string>* GetStrArray() const { return &str_array_; } + void SetStrArray(std::vector<std::string> value) { + str_array_ = std::move(value); + } + + const std::vector<std::unique_ptr<TestTypeBasic>>* GetTestTypeBasicArray() + const { + return &test_type_basic_array_; + } + + void SetTestTypeBasicArray( + std::vector<std::unique_ptr<TestTypeBasic>> value) { + test_type_basic_array_ = std::move(value); + } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + std::vector<int> int_array_; + std::vector<double> double_array_; + std::vector<std::string> str_array_; + std::vector<std::unique_ptr<TestTypeBasic>> test_type_basic_array_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeArrays) + CRDTP_DESERIALIZE_FIELD("int_array", int_array_), + CRDTP_DESERIALIZE_FIELD("str_array", str_array_), + CRDTP_DESERIALIZE_FIELD("test_type_basic_array", test_type_basic_array_), +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeArrays) + CRDTP_SERIALIZE_FIELD("int_array", int_array_), + CRDTP_SERIALIZE_FIELD("str_array", str_array_), + CRDTP_SERIALIZE_FIELD("test_type_basic_array", test_type_basic_array_), +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST_F(CompositeParsingTest, Arrays) { + TestTypeArrays obj1; + obj1.SetIntArray(std::vector<int>{1, 3, 5, 7}); + std::vector<std::string> strs; + strs.emplace_back("foo"); + strs.emplace_back(std::string("bar")); + obj1.SetStrArray(std::move(strs)); + auto val1 = std::make_unique<TestTypeBasic>(); + val1->SetValue("bazzzz"); + std::vector<std::unique_ptr<TestTypeBasic>> vec1; + vec1.emplace_back(std::move(val1)); + obj1.SetTestTypeBasicArray(std::move(vec1)); + + auto obj2 = Roundtrip(obj1); + ASSERT_THAT(obj2, Not(testing::IsNull())); + EXPECT_THAT(*obj2->GetIntArray(), testing::ElementsAre(1, 3, 5, 7)); + EXPECT_THAT(*obj2->GetStrArray(), testing::ElementsAre("foo", "bar")); + EXPECT_THAT(obj2->GetDoubleArray()->size(), Eq(0ul)); + EXPECT_THAT(obj2->GetTestTypeBasicArray()->size(), Eq(1ul)); + EXPECT_THAT(obj2->GetTestTypeBasicArray()->front()->GetValue(), Eq("bazzzz")); +} + +class TestTypeOptional : public ProtocolObject<TestTypeOptional> { + public: + TestTypeOptional() = default; + + bool HasIntField() const { return int_field_.has_value(); } + int GetIntField() const { return int_field_.value(); } + void SetIntField(int value) { int_field_ = value; } + + bool HasStrField() { return str_field_.has_value(); } + const std::string& GetStrField() const { return str_field_.value(); } + void SetStrField(std::string value) { str_field_ = std::move(value); } + + bool HasTestTypeBasicField() { return !!test_type_basic_field_; } + const TestTypeBasic* GetTestTypeBasicField() const { + return test_type_basic_field_.get(); + } + void SetTestTypeBasicField(std::unique_ptr<TestTypeBasic> value) { + test_type_basic_field_ = std::move(value); + } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + std::optional<int> int_field_; + std::optional<std::string> str_field_; + std::unique_ptr<TestTypeBasic> test_type_basic_field_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeOptional) + CRDTP_DESERIALIZE_FIELD_OPT("int_field", int_field_), + CRDTP_DESERIALIZE_FIELD_OPT("str_field", str_field_), + CRDTP_DESERIALIZE_FIELD_OPT("test_type_basic_field", test_type_basic_field_), +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeOptional) + CRDTP_SERIALIZE_FIELD("int_field", int_field_), + CRDTP_SERIALIZE_FIELD("str_field", str_field_), + CRDTP_SERIALIZE_FIELD("test_type_basic_field", test_type_basic_field_), +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST(ProtocolCoreTest, OptionalAbsent) { + TestTypeOptional obj1; + auto obj2 = Roundtrip(obj1); + ASSERT_THAT(obj2, Not(testing::IsNull())); + + EXPECT_THAT(obj2->HasIntField(), Eq(false)); + EXPECT_THAT(obj2->HasStrField(), Eq(false)); + EXPECT_THAT(obj2->HasTestTypeBasicField(), Eq(false)); +} + +TEST(ProtocolCoreTest, OptionalPresent) { + TestTypeOptional obj1; + obj1.SetIntField(42); + obj1.SetStrField("foo"); + + auto val1 = std::make_unique<TestTypeBasic>(); + val1->SetValue("bar"); + obj1.SetTestTypeBasicField(std::move(val1)); + + auto obj2 = Roundtrip(obj1); + ASSERT_THAT(obj2, Not(testing::IsNull())); + + EXPECT_THAT(obj2->HasIntField(), Eq(true)); + EXPECT_THAT(obj2->GetIntField(), Eq(42)); + EXPECT_THAT(obj2->HasStrField(), Eq(true)); + EXPECT_THAT(obj2->GetStrField(), Eq("foo")); + EXPECT_THAT(obj2->HasTestTypeBasicField(), Eq(true)); + EXPECT_THAT(obj2->GetTestTypeBasicField()->GetValue(), Eq("bar")); +} + +class TestTypeLazy : public ProtocolObject<TestTypeLazy> { + public: + TestTypeLazy() = default; + + const std::string& GetStrField() const { return str_field_; } + void SetStrField(std::string value) { str_field_ = std::move(value); } + + const DeferredMessage* deferred_test_type1_field() const { + return test_type1_field_.get(); + } + + private: + DECLARE_SERIALIZATION_SUPPORT(); + + std::string str_field_; + std::unique_ptr<DeferredMessage> test_type1_field_; +}; + +// clang-format off +CRDTP_BEGIN_DESERIALIZER(TestTypeLazy) + CRDTP_DESERIALIZE_FIELD("str_field", str_field_), + CRDTP_DESERIALIZE_FIELD_OPT("test_type1_field", test_type1_field_), +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER(TestTypeLazy) + CRDTP_SERIALIZE_FIELD("str_field", str_field_), + CRDTP_SERIALIZE_FIELD("test_type1_field", test_type1_field_), +CRDTP_END_SERIALIZER(); +// clang-format on + +TEST(ProtocolCoreTest, TestDeferredMessage) { + TestTypeComposite obj1; + obj1.SetStrField("bar"); + auto val1 = std::make_unique<TestTypeBasic>(); + val1->SetValue("bazzzz"); + obj1.SetTestTypeBasicField(std::move(val1)); + + auto obj2 = RoundtripToType<TestTypeLazy>(obj1); + EXPECT_THAT(obj2->GetStrField(), Eq("bar")); + + TestTypeBasic basic_val; + auto deserializer = obj2->deferred_test_type1_field()->MakeDeserializer(); + EXPECT_THAT(TestTypeBasic::Deserialize(&deserializer, &basic_val), Eq(true)); + EXPECT_THAT(basic_val.GetValue(), Eq("bazzzz")); + + StatusOr<std::unique_ptr<TestTypeBasic>> maybe_parsed = + TestTypeBasic::ReadFrom(*obj2->deferred_test_type1_field()); + ASSERT_THAT(maybe_parsed.status(), StatusIsOk()); + ASSERT_THAT((*maybe_parsed), Not(testing::IsNull())); + ASSERT_EQ((*maybe_parsed)->GetValue(), "bazzzz"); +} + +} // namespace +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/serializable.cc b/deps/inspector_protocol/crdtp/serializable.cc new file mode 100644 index 00000000000000..e0bc6ffb62a9c5 --- /dev/null +++ b/deps/inspector_protocol/crdtp/serializable.cc @@ -0,0 +1,39 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "serializable.h" + +#include <utility> + +namespace crdtp { +// ============================================================================= +// Serializable - An object to be emitted as a sequence of bytes. +// ============================================================================= + +std::vector<uint8_t> Serializable::Serialize() const { + std::vector<uint8_t> out; + AppendSerialized(&out); + return out; +} + +namespace { +class PreSerialized : public Serializable { + public: + explicit PreSerialized(std::vector<uint8_t> bytes) + : bytes_(std::move(bytes)) {} + + void AppendSerialized(std::vector<uint8_t>* out) const override { + out->insert(out->end(), bytes_.begin(), bytes_.end()); + } + + private: + std::vector<uint8_t> bytes_; +}; +} // namespace + +// static +std::unique_ptr<Serializable> Serializable::From(std::vector<uint8_t> bytes) { + return std::make_unique<PreSerialized>(std::move(bytes)); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/serializable.h b/deps/inspector_protocol/crdtp/serializable.h new file mode 100644 index 00000000000000..a5e2881e17ea50 --- /dev/null +++ b/deps/inspector_protocol/crdtp/serializable.h @@ -0,0 +1,32 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_SERIALIZABLE_H_ +#define CRDTP_SERIALIZABLE_H_ + +#include <cstdint> +#include <memory> +#include <vector> +#include "export.h" + +namespace crdtp { +// ============================================================================= +// Serializable - An object to be emitted as a sequence of bytes. +// ============================================================================= +class CRDTP_EXPORT Serializable { + public: + // Convenience: Invokes |AppendSerialized| on an empty vector. + std::vector<uint8_t> Serialize() const; + + virtual void AppendSerialized(std::vector<uint8_t>* out) const = 0; + + virtual ~Serializable() = default; + + // Wraps a vector of |bytes| into a Serializable for situations in which we + // eagerly serialize a structure. + static std::unique_ptr<Serializable> From(std::vector<uint8_t> bytes); +}; +} // namespace crdtp + +#endif // CRDTP_SERIALIZABLE_H_ diff --git a/deps/inspector_protocol/crdtp/serializable_test.cc b/deps/inspector_protocol/crdtp/serializable_test.cc new file mode 100644 index 00000000000000..adfd8595ad8371 --- /dev/null +++ b/deps/inspector_protocol/crdtp/serializable_test.cc @@ -0,0 +1,40 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <cstdlib> +#include <string> + +#include "serializable.h" +#include "test_platform.h" + +namespace crdtp { +// ============================================================================= +// Serializable - An object to be emitted as a sequence of bytes. +// ============================================================================= + +namespace { +// Tests ::Serialize (which invokes ::AppendSerialized). +class SimpleExample : public Serializable { + public: + explicit SimpleExample(const std::vector<uint8_t>& contents) + : contents_(contents) {} + + void AppendSerialized(std::vector<uint8_t>* out) const override { + out->insert(out->end(), contents_.begin(), contents_.end()); + } + + private: + std::vector<uint8_t> contents_; +}; +} // namespace + +TEST(SerializableTest, YieldsContents) { + std::vector<uint8_t> contents = {1, 2, 3}; + SimpleExample foo(contents); + foo.AppendSerialized(&contents); // Yields contents by appending. + EXPECT_THAT(contents, testing::ElementsAre(1, 2, 3, 1, 2, 3)); + // Yields contents by returning. + EXPECT_THAT(foo.Serialize(), testing::ElementsAre(1, 2, 3)); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/span.cc b/deps/inspector_protocol/crdtp/span.cc new file mode 100644 index 00000000000000..ae7545489c43b4 --- /dev/null +++ b/deps/inspector_protocol/crdtp/span.cc @@ -0,0 +1,39 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "span.h" + +#include <algorithm> + +namespace crdtp { + +bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept { + auto min_size = std::min(x.size(), y.size()); + const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size); + return (r < 0) || (r == 0 && x.size() < y.size()); +} + +bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept { + auto len = x.size(); + if (len != y.size()) + return false; + return x.data() == y.data() || len == 0 || + std::memcmp(x.data(), y.data(), len) == 0; +} + +bool SpanLessThan(span<char> x, span<char> y) noexcept { + auto min_size = std::min(x.size(), y.size()); + const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size); + return (r < 0) || (r == 0 && x.size() < y.size()); +} + +bool SpanEquals(span<char> x, span<char> y) noexcept { + auto len = x.size(); + if (len != y.size()) + return false; + return x.data() == y.data() || len == 0 || + std::memcmp(x.data(), y.data(), len) == 0; +} + +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/span.h b/deps/inspector_protocol/crdtp/span.h new file mode 100644 index 00000000000000..c2b5b02d9a1832 --- /dev/null +++ b/deps/inspector_protocol/crdtp/span.h @@ -0,0 +1,100 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_SPAN_H_ +#define CRDTP_SPAN_H_ + +#include <cstdint> +#include <cstring> +#include <type_traits> +#include <string> + +#include "export.h" + +namespace crdtp { +// ============================================================================= +// span - sequence of bytes +// ============================================================================= + +// This template is similar to std::span, which will be included in C++20. +template <typename T> +class span { + public: + using index_type = size_t; + + constexpr span() : data_(nullptr), size_(0) {} + constexpr span(const T* data, index_type size) : data_(data), size_(size) {} + + constexpr const T* data() const { return data_; } + + constexpr const T* begin() const { return data_; } + constexpr const T* end() const { return data_ + size_; } + + constexpr const T& operator[](index_type idx) const { return data_[idx]; } + + constexpr span<T> subspan(index_type offset, index_type count) const { + return span(data_ + offset, count); + } + + constexpr span<T> subspan(index_type offset) const { + return span(data_ + offset, size_ - offset); + } + + constexpr bool empty() const { return size_ == 0; } + + constexpr index_type size() const { return size_; } + constexpr index_type size_bytes() const { return size_ * sizeof(T); } + + private: + const T* data_; + index_type size_; +}; + +template <size_t N> +constexpr span<char> MakeSpan(const char (&str)[N]) { + return span<char>(str, N - 1); +} + +template <size_t N> +constexpr span<uint8_t> SpanFrom(const char (&str)[N]) { + return span<uint8_t>(reinterpret_cast<const uint8_t*>(str), N - 1); +} + +constexpr inline span<uint8_t> SpanFrom(const char* str) { + return str ? span<uint8_t>(reinterpret_cast<const uint8_t*>(str), strlen(str)) + : span<uint8_t>(); +} + +inline span<uint8_t> SpanFrom(const std::string& v) { + return span<uint8_t>(reinterpret_cast<const uint8_t*>(v.data()), v.size()); +} + +// This SpanFrom routine works for std::vector<uint8_t> and +// std::vector<uint16_t>, but also for base::span<const uint8_t> in Chromium. +template <typename C, + typename = std::enable_if_t< + std::is_unsigned<typename C::value_type>{} && + std::is_member_function_pointer<decltype(&C::size)>{}>> +inline span<typename C::value_type> SpanFrom(const C& v) { + return span<typename C::value_type>(v.data(), v.size()); +} + +// Less than / equality comparison functions for sorting / searching for byte +// spans. +CRDTP_EXPORT bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept; +CRDTP_EXPORT bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept; + +// Less than / equality comparison functions for sorting / searching for byte +// spans. +CRDTP_EXPORT bool SpanLessThan(span<char> x, span<char> y) noexcept; +CRDTP_EXPORT bool SpanEquals(span<char> x, span<char> y) noexcept; + +struct SpanLt { + bool operator()(span<uint8_t> l, span<uint8_t> r) const { + return SpanLessThan(l, r); + } +}; +} // namespace crdtp + +#endif // CRDTP_SPAN_H_ diff --git a/deps/inspector_protocol/crdtp/span_test.cc b/deps/inspector_protocol/crdtp/span_test.cc new file mode 100644 index 00000000000000..e562f4ea6feed9 --- /dev/null +++ b/deps/inspector_protocol/crdtp/span_test.cc @@ -0,0 +1,109 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <cstdlib> +#include <string> + +#include "span.h" +#include "test_platform.h" + +namespace crdtp { +// ============================================================================= +// span - sequence of bytes +// ============================================================================= +template <typename T> +class SpanTest : public ::testing::Test {}; + +using TestTypes = ::testing::Types<uint8_t, uint16_t>; +TYPED_TEST_SUITE(SpanTest, TestTypes); + +TYPED_TEST(SpanTest, Empty) { + span<TypeParam> empty; + EXPECT_TRUE(empty.empty()); + EXPECT_EQ(0u, empty.size()); + EXPECT_EQ(0u, empty.size_bytes()); + EXPECT_EQ(empty.begin(), empty.end()); +} + +TYPED_TEST(SpanTest, SingleItem) { + TypeParam single_item = 42; + span<TypeParam> singular(&single_item, 1); + EXPECT_FALSE(singular.empty()); + EXPECT_EQ(1u, singular.size()); + EXPECT_EQ(sizeof(TypeParam), singular.size_bytes()); + EXPECT_EQ(singular.begin() + 1, singular.end()); + EXPECT_EQ(42, singular[0]); +} + +TYPED_TEST(SpanTest, FiveItems) { + std::vector<TypeParam> test_input = {31, 32, 33, 34, 35}; + span<TypeParam> five_items(test_input.data(), 5); + EXPECT_FALSE(five_items.empty()); + EXPECT_EQ(5u, five_items.size()); + EXPECT_EQ(sizeof(TypeParam) * 5, five_items.size_bytes()); + EXPECT_EQ(five_items.begin() + 5, five_items.end()); + EXPECT_EQ(31, five_items[0]); + EXPECT_EQ(32, five_items[1]); + EXPECT_EQ(33, five_items[2]); + EXPECT_EQ(34, five_items[3]); + EXPECT_EQ(35, five_items[4]); + span<TypeParam> three_items = five_items.subspan(2); + EXPECT_EQ(3u, three_items.size()); + EXPECT_EQ(33, three_items[0]); + EXPECT_EQ(34, three_items[1]); + EXPECT_EQ(35, three_items[2]); + span<TypeParam> two_items = five_items.subspan(2, 2); + EXPECT_EQ(2u, two_items.size()); + EXPECT_EQ(33, two_items[0]); + EXPECT_EQ(34, two_items[1]); +} + +TEST(SpanFromTest, FromConstCharAndLiteral) { + // Testing this is useful because strlen(nullptr) is undefined. + EXPECT_EQ(nullptr, SpanFrom(nullptr).data()); + EXPECT_EQ(0u, SpanFrom(nullptr).size()); + + const char* kEmpty = ""; + EXPECT_EQ(kEmpty, reinterpret_cast<const char*>(SpanFrom(kEmpty).data())); + EXPECT_EQ(0u, SpanFrom(kEmpty).size()); + + const char* kFoo = "foo"; + EXPECT_EQ(kFoo, reinterpret_cast<const char*>(SpanFrom(kFoo).data())); + EXPECT_EQ(3u, SpanFrom(kFoo).size()); + + EXPECT_EQ(3u, SpanFrom("foo").size()); +} + +TEST(SpanFromTest, FromVectorUint8AndUint16) { + std::vector<uint8_t> foo = {'f', 'o', 'o'}; + span<uint8_t> foo_span = SpanFrom(foo); + EXPECT_EQ(foo.size(), foo_span.size()); + + std::vector<uint16_t> bar = {0xff, 0xef, 0xeb}; + span<uint16_t> bar_span = SpanFrom(bar); + EXPECT_EQ(bar.size(), bar_span.size()); +} + +TEST(SpanComparisons, ByteWiseLexicographicalOrder) { + // Compare the empty span. + EXPECT_FALSE(SpanLessThan(span<uint8_t>(), span<uint8_t>())); + EXPECT_TRUE(SpanEquals(span<uint8_t>(), span<uint8_t>())); + + // Compare message with itself. + std::string msg = "Hello, world"; + EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(msg))); + EXPECT_TRUE(SpanEquals(SpanFrom(msg), SpanFrom(msg))); + + // Compare message and copy. + EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(std::string(msg)))); + EXPECT_TRUE(SpanEquals(SpanFrom(msg), SpanFrom(std::string(msg)))); + + // Compare two messages. |lesser_msg| < |msg| because of the first + // byte ('A' < 'H'). + std::string lesser_msg = "A lesser message."; + EXPECT_TRUE(SpanLessThan(SpanFrom(lesser_msg), SpanFrom(msg))); + EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(lesser_msg))); + EXPECT_FALSE(SpanEquals(SpanFrom(msg), SpanFrom(lesser_msg))); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/status.cc b/deps/inspector_protocol/crdtp/status.cc new file mode 100644 index 00000000000000..41f8b5df7542cc --- /dev/null +++ b/deps/inspector_protocol/crdtp/status.cc @@ -0,0 +1,130 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "status.h" + +namespace crdtp { +// ============================================================================= +// Status and Error codes +// ============================================================================= + +std::string Status::Message() const { + switch (error) { + case Error::OK: + return "OK"; + case Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS: + return "JSON: unprocessed input remains"; + case Error::JSON_PARSER_STACK_LIMIT_EXCEEDED: + return "JSON: stack limit exceeded"; + case Error::JSON_PARSER_NO_INPUT: + return "JSON: no input"; + case Error::JSON_PARSER_INVALID_TOKEN: + return "JSON: invalid token"; + case Error::JSON_PARSER_INVALID_NUMBER: + return "JSON: invalid number"; + case Error::JSON_PARSER_INVALID_STRING: + return "JSON: invalid string"; + case Error::JSON_PARSER_UNEXPECTED_ARRAY_END: + return "JSON: unexpected array end"; + case Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED: + return "JSON: comma or array end expected"; + case Error::JSON_PARSER_STRING_LITERAL_EXPECTED: + return "JSON: string literal expected"; + case Error::JSON_PARSER_COLON_EXPECTED: + return "JSON: colon expected"; + case Error::JSON_PARSER_UNEXPECTED_MAP_END: + return "JSON: unexpected map end"; + case Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED: + return "JSON: comma or map end expected"; + case Error::JSON_PARSER_VALUE_EXPECTED: + return "JSON: value expected"; + + case Error::CBOR_INVALID_INT32: + return "CBOR: invalid int32"; + case Error::CBOR_INVALID_DOUBLE: + return "CBOR: invalid double"; + case Error::CBOR_INVALID_ENVELOPE: + return "CBOR: invalid envelope"; + case Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH: + return "CBOR: envelope contents length mismatch"; + case Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE: + return "CBOR: map or array expected in envelope"; + case Error::CBOR_INVALID_STRING8: + return "CBOR: invalid string8"; + case Error::CBOR_INVALID_STRING16: + return "CBOR: invalid string16"; + case Error::CBOR_INVALID_BINARY: + return "CBOR: invalid binary"; + case Error::CBOR_UNSUPPORTED_VALUE: + return "CBOR: unsupported value"; + case Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE: + return "CBOR: unexpected EOF reading envelope"; + case Error::CBOR_INVALID_START_BYTE: + return "CBOR: invalid start byte"; + case Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE: + return "CBOR: unexpected EOF expected value"; + case Error::CBOR_UNEXPECTED_EOF_IN_ARRAY: + return "CBOR: unexpected EOF in array"; + case Error::CBOR_UNEXPECTED_EOF_IN_MAP: + return "CBOR: unexpected EOF in map"; + case Error::CBOR_INVALID_MAP_KEY: + return "CBOR: invalid map key"; + case Error::CBOR_DUPLICATE_MAP_KEY: + return "CBOR: duplicate map key"; + case Error::CBOR_STACK_LIMIT_EXCEEDED: + return "CBOR: stack limit exceeded"; + case Error::CBOR_TRAILING_JUNK: + return "CBOR: trailing junk"; + case Error::CBOR_MAP_START_EXPECTED: + return "CBOR: map start expected"; + case Error::CBOR_MAP_STOP_EXPECTED: + return "CBOR: map stop expected"; + case Error::CBOR_ARRAY_START_EXPECTED: + return "CBOR: array start expected"; + case Error::CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED: + return "CBOR: envelope size limit exceeded"; + + case Error::MESSAGE_MUST_BE_AN_OBJECT: + return "Message must be an object"; + case Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY: + return "Message must have integer 'id' property"; + case Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY: + return "Message must have string 'method' property"; + case Error::MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY: + return "Message may have string 'sessionId' property"; + case Error::MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY: + return "Message may have object 'params' property"; + case Error::MESSAGE_HAS_UNKNOWN_PROPERTY: + return "Message has property other than " + "'id', 'method', 'sessionId', 'params'"; + + case Error::BINDINGS_MANDATORY_FIELD_MISSING: + return "BINDINGS: mandatory field missing"; + case Error::BINDINGS_BOOL_VALUE_EXPECTED: + return "BINDINGS: bool value expected"; + case Error::BINDINGS_INT32_VALUE_EXPECTED: + return "BINDINGS: int32 value expected"; + case Error::BINDINGS_DOUBLE_VALUE_EXPECTED: + return "BINDINGS: double value expected"; + case Error::BINDINGS_STRING_VALUE_EXPECTED: + return "BINDINGS: string value expected"; + case Error::BINDINGS_STRING8_VALUE_EXPECTED: + return "BINDINGS: string8 value expected"; + case Error::BINDINGS_BINARY_VALUE_EXPECTED: + return "BINDINGS: binary value expected"; + case Error::BINDINGS_DICTIONARY_VALUE_EXPECTED: + return "BINDINGS: dictionary value expected"; + case Error::BINDINGS_INVALID_BASE64_STRING: + return "BINDINGS: invalid base64 string"; + } + // Some compilers can't figure out that we can't get here. + return "INVALID ERROR CODE"; +} + +std::string Status::ToASCIIString() const { + if (ok()) + return "OK"; + return Message() + " at position " + std::to_string(pos); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/status.h b/deps/inspector_protocol/crdtp/status.h new file mode 100644 index 00000000000000..5f32c040f3ec1e --- /dev/null +++ b/deps/inspector_protocol/crdtp/status.h @@ -0,0 +1,143 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_STATUS_H_ +#define CRDTP_STATUS_H_ + +#include <cassert> +#include <cstddef> +#include <limits> +#include <string> + +#include "export.h" + +namespace crdtp { +// ============================================================================= +// Status and Error codes +// ============================================================================= + +enum class Error { + OK = 0, + + // JSON parsing errors; checked when parsing / converting from JSON. + // See json.{h,cc}. + JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01, + JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02, + JSON_PARSER_NO_INPUT = 0x03, + JSON_PARSER_INVALID_TOKEN = 0x04, + JSON_PARSER_INVALID_NUMBER = 0x05, + JSON_PARSER_INVALID_STRING = 0x06, + JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07, + JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08, + JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09, + JSON_PARSER_COLON_EXPECTED = 0x0a, + JSON_PARSER_UNEXPECTED_MAP_END = 0x0b, + JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c, + JSON_PARSER_VALUE_EXPECTED = 0x0d, + + // CBOR parsing errors; checked when parsing / converting from CBOR. + CBOR_INVALID_INT32 = 0x0e, + CBOR_INVALID_DOUBLE = 0x0f, + CBOR_INVALID_ENVELOPE = 0x10, + CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH = 0x11, + CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE = 0x12, + CBOR_INVALID_STRING8 = 0x13, + CBOR_INVALID_STRING16 = 0x14, + CBOR_INVALID_BINARY = 0x15, + CBOR_UNSUPPORTED_VALUE = 0x16, + CBOR_UNEXPECTED_EOF_IN_ENVELOPE = 0x17, + CBOR_INVALID_START_BYTE = 0x18, + CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x19, + CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x1a, + CBOR_UNEXPECTED_EOF_IN_MAP = 0x1b, + CBOR_INVALID_MAP_KEY = 0x1c, + CBOR_DUPLICATE_MAP_KEY = 0x1d, + CBOR_STACK_LIMIT_EXCEEDED = 0x1e, + CBOR_TRAILING_JUNK = 0x1f, + CBOR_MAP_START_EXPECTED = 0x20, + CBOR_MAP_STOP_EXPECTED = 0x21, + CBOR_ARRAY_START_EXPECTED = 0x22, + CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x23, + + // Message errors are constraints we place on protocol messages coming + // from a protocol client; these are checked in crdtp::Dispatchable + // (see dispatch.h) as it performs a shallow parse. + MESSAGE_MUST_BE_AN_OBJECT = 0x24, + MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY = 0x25, + MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY = 0x26, + MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY = 0x27, + MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY = 0x28, + MESSAGE_HAS_UNKNOWN_PROPERTY = 0x29, + + BINDINGS_MANDATORY_FIELD_MISSING = 0x30, + BINDINGS_BOOL_VALUE_EXPECTED = 0x31, + BINDINGS_INT32_VALUE_EXPECTED = 0x32, + BINDINGS_DOUBLE_VALUE_EXPECTED = 0x33, + BINDINGS_STRING_VALUE_EXPECTED = 0x34, + BINDINGS_STRING8_VALUE_EXPECTED = 0x35, + BINDINGS_BINARY_VALUE_EXPECTED = 0x36, + BINDINGS_DICTIONARY_VALUE_EXPECTED = 0x37, + BINDINGS_INVALID_BASE64_STRING = 0x38, +}; + +// A status value with position that can be copied. The default status +// is OK. Usually, error status values should come with a valid position. +struct CRDTP_EXPORT Status { + static constexpr size_t npos() { return std::numeric_limits<size_t>::max(); } + + bool ok() const { return error == Error::OK; } + + Error error = Error::OK; + size_t pos = npos(); + Status(Error error, size_t pos) : error(error), pos(pos) {} + Status() = default; + + bool IsMessageError() const { + return error >= Error::MESSAGE_MUST_BE_AN_OBJECT && + error <= Error::MESSAGE_HAS_UNKNOWN_PROPERTY; + } + + // Returns 7 bit US-ASCII string, either "OK" or an error message without + // position. + std::string Message() const; + + // Returns a 7 bit US-ASCII string, either "OK" or an error message that + // includes the position. + std::string ToASCIIString() const; +}; + +template <typename T> +class StatusOr { + public: + explicit StatusOr(const T& value) : value_(value) {} + explicit StatusOr(T&& value) : value_(std::move(value)) {} + explicit StatusOr(const Status& status) : status_(status) {} + + bool ok() const { return status_.ok(); } + const Status& status() const { return status_; } + T& operator*() & { return value(); } + const T& operator*() const& { return value(); } + T&& operator*() && { return value(); } + + T& value() & { + assert(ok()); + return value_; + } + T&& value() && { + assert(ok()); + return std::move(value_); + } + const T& value() const& { + assert(ok()); + return value_; + } + + private: + Status status_; + T value_; +}; + +} // namespace crdtp + +#endif // CRDTP_STATUS_H_ diff --git a/deps/inspector_protocol/crdtp/status_test.cc b/deps/inspector_protocol/crdtp/status_test.cc new file mode 100644 index 00000000000000..e25af39f0594be --- /dev/null +++ b/deps/inspector_protocol/crdtp/status_test.cc @@ -0,0 +1,29 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "status.h" +#include "status_test_support.h" +#include "test_platform.h" + +namespace crdtp { +// ============================================================================= +// Status and Error codes +// ============================================================================= + +TEST(StatusTest, StatusToASCIIString) { + Status ok_status; + EXPECT_EQ("OK", ok_status.ToASCIIString()); + Status json_error(Error::JSON_PARSER_COLON_EXPECTED, 42); + EXPECT_EQ("JSON: colon expected at position 42", json_error.ToASCIIString()); + Status cbor_error(Error::CBOR_TRAILING_JUNK, 21); + EXPECT_EQ("CBOR: trailing junk at position 21", cbor_error.ToASCIIString()); +} + +TEST(StatusTest, StatusTestSupport) { + Status ok_status; + EXPECT_THAT(ok_status, StatusIsOk()); + Status json_error(Error::JSON_PARSER_COLON_EXPECTED, 42); + EXPECT_THAT(json_error, StatusIs(Error::JSON_PARSER_COLON_EXPECTED, 42)); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/status_test_support.cc b/deps/inspector_protocol/crdtp/status_test_support.cc new file mode 100644 index 00000000000000..3bf267a037906c --- /dev/null +++ b/deps/inspector_protocol/crdtp/status_test_support.cc @@ -0,0 +1,50 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "status_test_support.h" + +namespace crdtp { +void PrintTo(const Status& status, std::ostream* os) { + *os << status.ToASCIIString() << " (error: 0x" << std::hex + << static_cast<int>(status.error) << ", " + << "pos: " << std::dec << status.pos << ")"; +} + +namespace { +class StatusIsMatcher : public testing::MatcherInterface<Status> { + public: + explicit StatusIsMatcher(Status status) : expected_(status) {} + + bool MatchAndExplain(Status status, + testing::MatchResultListener* listener) const override { + return status.error == expected_.error && status.pos == expected_.pos; + } + + void DescribeTo(std::ostream* os) const override { + *os << "equals to "; + PrintTo(expected_, os); + } + + private: + Status expected_; +}; + +class StatusIsOkMatcher : public testing::MatcherInterface<Status> { + bool MatchAndExplain(Status status, + testing::MatchResultListener* listener) const override { + return status.ok(); + } + + void DescribeTo(std::ostream* os) const override { *os << "is ok"; } +}; +} // namespace + +testing::Matcher<Status> StatusIsOk() { + return MakeMatcher(new StatusIsOkMatcher()); +} + +testing::Matcher<Status> StatusIs(Error error, size_t pos) { + return MakeMatcher(new StatusIsMatcher(Status(error, pos))); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/status_test_support.h b/deps/inspector_protocol/crdtp/status_test_support.h new file mode 100644 index 00000000000000..5e2ee601e1855a --- /dev/null +++ b/deps/inspector_protocol/crdtp/status_test_support.h @@ -0,0 +1,32 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_STATUS_TEST_SUPPORT_H_ +#define CRDTP_STATUS_TEST_SUPPORT_H_ + +#include <ostream> +#include "status.h" +#include "test_platform.h" + +namespace crdtp { +// Supports gtest, to conveniently match Status objects and +// get useful error messages when tests fail. +// Typically used with EXPECT_THAT, e.g. +// +// EXPECT_THAT(status, StatusIs(Error::JSON_PARSER_COLON_EXPECTED, 42)); +// +// EXPECT_THAT(status, StatusIsOk()); + +// Prints a |status|, including its generated error message, error code, and +// position. This is used by gtest for pretty printing actual vs. expected. +void PrintTo(const Status& status, std::ostream* os); + +// Matches any status with |status.ok()|. +testing::Matcher<Status> StatusIsOk(); + +// Matches any status with |error| and |pos|. +testing::Matcher<Status> StatusIs(Error error, size_t pos); +} // namespace crdtp + +#endif // CRDTP_STATUS_TEST_SUPPORT_H_ diff --git a/deps/inspector_protocol/crdtp/test_platform.cc b/deps/inspector_protocol/crdtp/test_platform.cc new file mode 100644 index 00000000000000..bbd8d6cd9fefd4 --- /dev/null +++ b/deps/inspector_protocol/crdtp/test_platform.cc @@ -0,0 +1,33 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is Chromium specific, to make the tests work. It will work +// in the standalone (upstream) build, as well as in Chromium. In other code +// bases (e.g. v8), a custom file with these two functions and with appropriate +// includes may need to be provided, so it isn't necessarily part of a roll. + +#include "test_platform.h" + +#include <cstdint> +#include <string> +#include <vector> +#include "base/strings/utf_string_conversions.h" + +namespace crdtp { +std::string UTF16ToUTF8(span<uint16_t> in) { + std::string out; + bool success = base::UTF16ToUTF8(reinterpret_cast<const char16_t*>(in.data()), + in.size(), &out); + CHECK(success); + return out; +} + +std::vector<uint16_t> UTF8ToUTF16(span<uint8_t> in) { + std::u16string tmp; + bool success = base::UTF8ToUTF16(reinterpret_cast<const char*>(in.data()), + in.size(), &tmp); + CHECK(success); + return std::vector<uint16_t>(tmp.begin(), tmp.end()); +} +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/test_platform.h b/deps/inspector_protocol/crdtp/test_platform.h new file mode 100644 index 00000000000000..a512464be9f38e --- /dev/null +++ b/deps/inspector_protocol/crdtp/test_platform.h @@ -0,0 +1,31 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is Chromium specific, to make the tests work. It will work +// in the standalone (upstream) build, as well as in Chromium. In other code +// bases (e.g. v8), a custom file with these two functions and with appropriate +// includes may need to be provided, so it isn't necessarily part of a roll. +// +// Put another way: The tests, e.g. json_test.cc include *only* test_platform.h, +// which provides CHECK and gunit functionality, and UTF8<->UTF16 conversion +// functions. + +#ifndef CRDTP_TEST_PLATFORM_H_ +#define CRDTP_TEST_PLATFORM_H_ + +#include <cstdint> +#include <string> +#include <vector> +#include "base/check_op.h" // Provides CHECK and CHECK_EQ, etc. +#include "span.h" +#include "testing/gmock/include/gmock/gmock.h" // Provides Gunit +#include "testing/gtest/include/gtest/gtest.h" // Provides Gmock + +// Provides UTF8<->UTF16 conversion routines (implemented in .cc file). +namespace crdtp { +std::string UTF16ToUTF8(span<uint16_t> in); +std::vector<uint16_t> UTF8ToUTF16(span<uint8_t> in); +} // namespace crdtp + +#endif // CRDTP_TEST_PLATFORM_H_ diff --git a/deps/inspector_protocol/crdtp/test_string_traits.cc b/deps/inspector_protocol/crdtp/test_string_traits.cc new file mode 100644 index 00000000000000..b328ae22805bd4 --- /dev/null +++ b/deps/inspector_protocol/crdtp/test_string_traits.cc @@ -0,0 +1,31 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "test_string_traits.h" + +namespace crdtp { + +// Test-only. Real-life bindings use UTF8/16 conversions as needed. +bool ProtocolTypeTraits<std::string>::Deserialize(DeserializerState* state, + std::string* value) { + if (state->tokenizer()->TokenTag() == cbor::CBORTokenTag::STRING8) { + auto cbor_span = state->tokenizer()->GetString8(); + value->assign(reinterpret_cast<const char*>(cbor_span.data()), + cbor_span.size()); + return true; + } + state->RegisterError(Error::BINDINGS_STRING8_VALUE_EXPECTED); + return false; +} + +// static +void ProtocolTypeTraits<std::string>::Serialize(const std::string& value, + std::vector<uint8_t>* bytes) { + cbor::EncodeString8( + span<uint8_t>(reinterpret_cast<const uint8_t*>(value.data()), + value.size()), + bytes); +} + +} // namespace crdtp diff --git a/deps/inspector_protocol/crdtp/test_string_traits.h b/deps/inspector_protocol/crdtp/test_string_traits.h new file mode 100644 index 00000000000000..be9a8418784bb5 --- /dev/null +++ b/deps/inspector_protocol/crdtp/test_string_traits.h @@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CRDTP_TEST_STRING_TRAITS_H_ + +#include "protocol_core.h" + +namespace crdtp { + +// Either real string traits or dummy string traits are going to be used +// depending on whether this is built standalone or with embedder. +template <> +struct ProtocolTypeTraits<std::string> { + static bool Deserialize(DeserializerState* state, std::string* value); + static void Serialize(const std::string& value, std::vector<uint8_t>* bytes); +}; + +} // namespace crdtp + +#endif // CRDTP_TEST_STRING_TRAITS_H_ diff --git a/deps/inspector_protocol/crdtp/transcode.cc b/deps/inspector_protocol/crdtp/transcode.cc new file mode 100644 index 00000000000000..dee576d9ee8c2c --- /dev/null +++ b/deps/inspector_protocol/crdtp/transcode.cc @@ -0,0 +1,61 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <fstream> +#include <iostream> +#include <sstream> +#include <string> + +#include "json.h" + +namespace crdtp { +namespace { +int Transcode(const std::string& cmd, + const std::string& input_file_name, + const std::string& output_file_name) { + std::ifstream input_file(input_file_name, std::ios::binary); + if (!input_file.is_open()) { + std::cerr << "failed to open " << input_file_name << "\n"; + return 1; + } + std::string in; + while (input_file) { + std::string buffer(1024, '\0'); + input_file.read(&buffer.front(), buffer.size()); + in += buffer.substr(0, input_file.gcount()); + } + Status status; + std::vector<uint8_t> out; + if (cmd == "--json-to-cbor") { + status = json::ConvertJSONToCBOR(SpanFrom(in), &out); + } else if (cmd == "--cbor-to-json") { + status = json::ConvertCBORToJSON(SpanFrom(in), &out); + } else { + std::cerr << "unknown command " << cmd << "\n"; + return 1; + } + if (!status.ok()) { + std::cerr << "transcoding error: " << status.ToASCIIString() << "\n"; + return 1; + } + std::ofstream output_file(output_file_name, std::ios::binary); + if (!output_file.is_open()) { + std::cerr << "failed to open " << output_file_name << "\n"; + return 1; + } + output_file.write(reinterpret_cast<const char*>(out.data()), out.size()); + return 0; +} +} // namespace +} // namespace crdtp + +int main(int argc, char** argv) { + if (argc == 4) + return ::crdtp::Transcode(argv[1], argv[2], argv[3]); + std::cerr << "usage: " << argv[0] + << " --json-to-cbor <input-file> <output-file>\n" + << " or " << argv[0] + << " --cbor-to-json <input-file> <output-file>\n"; + return 1; +} diff --git a/deps/inspector_protocol/inspector_protocol.gni b/deps/inspector_protocol/inspector_protocol.gni new file mode 100644 index 00000000000000..15ffbf923ce3b8 --- /dev/null +++ b/deps/inspector_protocol/inspector_protocol.gni @@ -0,0 +1,99 @@ +# Copyright 2016 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This template will generate inspector protocol source code. The code will +# not be compiled, use get_target_outputs(<name>) to compile them. +# +# Inputs +# +# config_file (required) +# Path to json file specifying inspector protocol configuration. +# +# out_dir (required) +# Path to put the generated files in. It must be inside output or +# generated file directory. +# +# outputs (required) +# Files generated. Relative to out_dir. +# +# inputs (optional) +# Extra inputs specified by the config file. +# +# jinja_dir (optional) +# Custom path to jinja (defaults to "//third_party"). +template("inspector_protocol_generate") { + assert(defined(invoker.config_file)) + assert(defined(invoker.out_dir)) + assert(defined(invoker.outputs)) + assert(defined(invoker.inspector_protocol_dir)) + inspector_protocol_dir = invoker.inspector_protocol_dir + use_embedder_types = + defined(invoker.use_embedder_types) && invoker.use_embedder_types + + if (defined(invoker.jinja_dir)) { + jinja_dir = invoker.jinja_dir + } else { + jinja_dir = "//third_party" + } + action(target_name) { + script = "$inspector_protocol_dir/code_generator.py" + + inputs = [ + invoker.config_file, + "$inspector_protocol_dir/lib/Forward_h.template", + "$inspector_protocol_dir/templates/Exported_h.template", + "$inspector_protocol_dir/templates/Imported_h.template", + "$inspector_protocol_dir/templates/TypeBuilder_cpp.template", + "$inspector_protocol_dir/templates/TypeBuilder_h.template", + ] + if (defined(invoker.inputs)) { + inputs += invoker.inputs + } + if (!use_embedder_types) { + inputs += [ + "$inspector_protocol_dir/lib/ValueConversions_cpp.template", + "$inspector_protocol_dir/lib/ValueConversions_h.template", + "$inspector_protocol_dir/lib/Values_cpp.template", + "$inspector_protocol_dir/lib/Values_h.template", + "$inspector_protocol_dir/lib/Object_cpp.template", + "$inspector_protocol_dir/lib/Object_h.template", + ] + } + + args = [ + "--jinja_dir", + rebase_path(jinja_dir, root_build_dir), + "--output_base", + rebase_path(invoker.out_dir, root_build_dir), + "--config", + rebase_path(invoker.config_file, root_build_dir), + "--inspector_protocol_dir", + "$inspector_protocol_dir", + ] + if (use_embedder_types) { + args += [ + "--config_value", + "use_embedder_types=true", + ] + } + if (defined(invoker.config_values)) { + foreach(value, invoker.config_values) { + args += [ + "--config_value", + value, + ] + } + } + + outputs = get_path_info(rebase_path(invoker.outputs, ".", invoker.out_dir), + "abspath") + + forward_variables_from(invoker, + [ + "visibility", + "deps", + "public_deps", + ]) + } +} diff --git a/deps/inspector_protocol/inspector_protocol.gyp b/deps/inspector_protocol/inspector_protocol.gyp new file mode 100644 index 00000000000000..0eb551c769f55d --- /dev/null +++ b/deps/inspector_protocol/inspector_protocol.gyp @@ -0,0 +1,43 @@ +{ + 'variables': { + 'crdtp_sources': [ + 'crdtp/cbor.cc', + 'crdtp/cbor.h', + 'crdtp/dispatch.cc', + 'crdtp/dispatch.h', + 'crdtp/error_support.cc', + 'crdtp/error_support.h', + 'crdtp/export.h', + 'crdtp/find_by_first.h', + 'crdtp/frontend_channel.h', + 'crdtp/json.cc', + 'crdtp/json.h', + 'crdtp/json_platform.cc', + 'crdtp/json_platform.h', + 'crdtp/maybe.h', + 'crdtp/parser_handler.h', + 'crdtp/protocol_core.cc', + 'crdtp/protocol_core.h', + 'crdtp/serializable.cc', + 'crdtp/serializable.h', + 'crdtp/span.cc', + 'crdtp/span.h', + 'crdtp/status.cc', + 'crdtp/status.h', + ] + }, + 'targets': [ + { + 'target_name': 'crdtp', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + # Use like `#include "crdtp/json.h"` + 'include_dirs': [ '.' ], + }, + 'sources': [ + '<@(crdtp_sources)', + ], + }, + ] +} diff --git a/deps/inspector_protocol/lib/Forward_h.template b/deps/inspector_protocol/lib/Forward_h.template new file mode 100644 index 00000000000000..247bc03c790b03 --- /dev/null +++ b/deps/inspector_protocol/lib/Forward_h.template @@ -0,0 +1,86 @@ +// This file is generated by Forward_h.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Forward_h +#define {{"_".join(config.protocol.namespace)}}_Forward_h + +{% if config.lib.export_header %} +#include {{format_include(config.lib.export_header)}} +{% endif %} + +#include <memory> +#include <vector> + +#include "{{config.crdtp.dir}}/error_support.h" +#include "{{config.crdtp.dir}}/dispatch.h" +#include "{{config.crdtp.dir}}/frontend_channel.h" +#include "{{config.crdtp.dir}}/protocol_core.h" + +{% if config.use_embedder_types %} +#include {{format_include(config.lib.protocol_traits)}} +{% else %} +#include {{format_include(config.lib.string_header)}} +{% endif %} + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +using DispatchResponse = {{config.crdtp.namespace}}::DispatchResponse; +using ErrorSupport = {{config.crdtp.namespace}}::ErrorSupport; +using Serializable = {{config.crdtp.namespace}}::Serializable; +using FrontendChannel = {{config.crdtp.namespace}}::FrontendChannel; +using DomainDispatcher = {{config.crdtp.namespace}}::DomainDispatcher; +using UberDispatcher = {{config.crdtp.namespace}}::UberDispatcher; +using Response = DispatchResponse; + +{% if config.use_embedder_types %} +using DictionaryValue = crdtp::traits::DictionaryValue; +using Object = crdtp::traits::DictionaryValue; +using ListValue = crdtp::traits::ListValue; +using Value = crdtp::traits::Value; +using String = crdtp::traits::String; +using Binary = crdtp::Binary; +{% else %} +class DictionaryValue; +class FundamentalValue; +class ListValue; +class Object; +class SerializedValue; +class StringValue; +class Value; +{% endif %} + +namespace detail { + +template <typename T> +struct ArrayTypedef { typedef std::vector<std::unique_ptr<T>> type; }; + +template <> +struct ArrayTypedef<String> { typedef std::vector<String> type; }; + +template <> +struct ArrayTypedef<int> { typedef std::vector<int> type; }; + +template <> +struct ArrayTypedef<double> { typedef std::vector<double> type; }; + +template <> +struct ArrayTypedef<bool> { typedef std::vector<bool> type; }; + +template <> +struct ArrayTypedef<Binary> { typedef std::vector<Binary> type; }; + +} // namespace detail + +template <typename T> +using Array = typename detail::ArrayTypedef<T>::type; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Forward_h) diff --git a/tools/inspector_protocol/lib/Object_cpp.template b/deps/inspector_protocol/lib/Object_cpp.template similarity index 84% rename from tools/inspector_protocol/lib/Object_cpp.template rename to deps/inspector_protocol/lib/Object_cpp.template index 1640a11127b442..2b08cee303d335 100644 --- a/tools/inspector_protocol/lib/Object_cpp.template +++ b/deps/inspector_protocol/lib/Object_cpp.template @@ -1,6 +1,6 @@ // This file is generated by Object_cpp.template. -// Copyright 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -14,13 +14,18 @@ std::unique_ptr<Object> Object::fromValue(protocol::Value* value, ErrorSupport* { protocol::DictionaryValue* dictionary = DictionaryValue::cast(value); if (!dictionary) { - errors->addError("object expected"); + errors->AddError("object expected"); return nullptr; } dictionary = static_cast<protocol::DictionaryValue*>(dictionary->clone().release()); return std::unique_ptr<Object>(new Object(std::unique_ptr<DictionaryValue>(dictionary))); } +// Implements Serializable. +void Object::AppendSerialized(std::vector<uint8_t>* out) const { + m_object->AppendSerialized(out); +} + std::unique_ptr<protocol::DictionaryValue> Object::toValue() const { return DictionaryValue::cast(m_object->clone()); diff --git a/deps/inspector_protocol/lib/Object_h.template b/deps/inspector_protocol/lib/Object_h.template new file mode 100644 index 00000000000000..fe4df6b9cc7d5e --- /dev/null +++ b/deps/inspector_protocol/lib/Object_h.template @@ -0,0 +1,43 @@ +// This file is generated by Object_h.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Object_h +#define {{"_".join(config.protocol.namespace)}}_Object_h + +//#include "ErrorSupport.h" +//#include "Forward.h" +//#include "Values.h" + +#include "{{config.crdtp.dir}}/serializable.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +class {{config.lib.export_macro}} Object : public {{config.crdtp.namespace}}::Serializable { +public: + static std::unique_ptr<Object> fromValue(protocol::Value*, ErrorSupport*); + explicit Object(std::unique_ptr<protocol::DictionaryValue>); + ~Object(); + + // Implements Serializable. + void AppendSerialized(std::vector<uint8_t>* out) const override; + + std::unique_ptr<protocol::DictionaryValue> toValue() const; + std::unique_ptr<Object> clone() const; + +private: + Object() = default; + friend struct {{config.crdtp.namespace}}::ProtocolTypeTraits<std::unique_ptr<Object>, void>; + + std::unique_ptr<protocol::DictionaryValue> m_object; +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Object_h) diff --git a/tools/inspector_protocol/lib/Protocol_cpp.template b/deps/inspector_protocol/lib/Protocol_cpp.template similarity index 83% rename from tools/inspector_protocol/lib/Protocol_cpp.template rename to deps/inspector_protocol/lib/Protocol_cpp.template index 88303a27ab9e7e..84bd6e70d6b200 100644 --- a/tools/inspector_protocol/lib/Protocol_cpp.template +++ b/deps/inspector_protocol/lib/Protocol_cpp.template @@ -1,6 +1,6 @@ // This file is generated by Protocol_cpp.template. -// Copyright 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/deps/inspector_protocol/lib/ValueConversions_cpp.template b/deps/inspector_protocol/lib/ValueConversions_cpp.template new file mode 100644 index 00000000000000..d2ab41a2dbab6a --- /dev/null +++ b/deps/inspector_protocol/lib/ValueConversions_cpp.template @@ -0,0 +1,127 @@ +// This file is generated by ValueConversions_cpp.template. + +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include {{format_include(config.protocol.package, "Protocol")}} + +#include <algorithm> +#include <climits> +#include <string> + +//#include "ValueConversions.h" +//#include "Values.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +{% for namespace in config.protocol.namespace %} +} // namespace +{% endfor %} + + +namespace {{config.crdtp.namespace}} { + +namespace { + +using {{"::".join(config.protocol.namespace)}}::Binary; +using {{"::".join(config.protocol.namespace)}}::Object; +using {{"::".join(config.protocol.namespace)}}::Value; +using {{"::".join(config.protocol.namespace)}}::String; +using {{"::".join(config.protocol.namespace)}}::DictionaryValue; +using {{"::".join(config.protocol.namespace)}}::FundamentalValue; +using {{"::".join(config.protocol.namespace)}}::StringValue; +using {{"::".join(config.protocol.namespace)}}::StringUtil; +//using {{"::".join(config.protocol.namespace)}}::EncodeString; + +std::unique_ptr<Value> ReadValue(DeserializerState* state) { + cbor::CBORTokenizer* tokenizer = state->tokenizer(); + switch (tokenizer->TokenTag()) { + case cbor::CBORTokenTag::TRUE_VALUE: + return FundamentalValue::create(true); + case cbor::CBORTokenTag::FALSE_VALUE: + return FundamentalValue::create(false); + case cbor::CBORTokenTag::NULL_VALUE: + return Value::null(); + case cbor::CBORTokenTag::INT32: + return FundamentalValue::create(tokenizer->GetInt32()); + case cbor::CBORTokenTag::DOUBLE: + return FundamentalValue::create(tokenizer->GetDouble()); + case cbor::CBORTokenTag::STRING8: { + const auto str = tokenizer->GetString8(); + return StringValue::create(StringUtil::fromUTF8(str.data(), str.size())); + } + case cbor::CBORTokenTag::STRING16: { + const auto str = tokenizer->GetString16WireRep(); + return StringValue::create(StringUtil::fromUTF16LE(reinterpret_cast<const uint16_t*>(str.data()), str.size() / 2)); + } + case cbor::CBORTokenTag::ENVELOPE: { + const auto env = tokenizer->GetEnvelope(); + return Value::parseBinary(env.data(), env.size()); + } + // Intentionally not supported. + case cbor::CBORTokenTag::BINARY: + // Should not be encountered outside of envelope. + case cbor::CBORTokenTag::MAP_START: + case cbor::CBORTokenTag::ARRAY_START: + default: + state->RegisterError(Error::CBOR_UNSUPPORTED_VALUE); + return nullptr; + } +} + +} // namespace + +// static +bool ProtocolTypeTraits<std::unique_ptr<Value>>::Deserialize( + DeserializerState* state, std::unique_ptr<Value>* value) { + auto result = ReadValue(state); + if (!result) + return false; + *value = std::move(result); + return true; +} + +// static +void ProtocolTypeTraits<std::unique_ptr<Value>>::Serialize( + const std::unique_ptr<Value>& value, std::vector<uint8_t>* bytes) { + value->AppendSerialized(bytes); +} + +// static +bool ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Deserialize( + DeserializerState* state, std::unique_ptr<DictionaryValue>* value) { + std::unique_ptr<Value> res; + if (!ProtocolTypeTraits<std::unique_ptr<Value>>::Deserialize(state, &res)) + return false; + if (res->type() != Value::TypeObject) { + state->RegisterError(Error::BINDINGS_DICTIONARY_VALUE_EXPECTED); + return false; + } + *value = DictionaryValue::cast(std::move(res)); + return true; +} + +// static +void ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Serialize( + const std::unique_ptr<DictionaryValue>& value, std::vector<uint8_t>* bytes) { + value->AppendSerialized(bytes); +} + +// static +bool ProtocolTypeTraits<std::unique_ptr<Object>>::Deserialize(DeserializerState* state, std::unique_ptr<Object>* value) { + auto res = DictionaryValue::create(); + if (ProtocolTypeTraits<std::unique_ptr<DictionaryValue>>::Deserialize(state, &res)) { + *value = std::make_unique<Object>(std::move(res)); + return true; + } + return false; +} + +void ProtocolTypeTraits<std::unique_ptr<Object>>::Serialize(const std::unique_ptr<Object>& value, std::vector<uint8_t>* bytes) { + value->AppendSerialized(bytes); +} + +} // namespace {{config.crdtp.namespace}} diff --git a/deps/inspector_protocol/lib/ValueConversions_h.template b/deps/inspector_protocol/lib/ValueConversions_h.template new file mode 100644 index 00000000000000..bf05014f10154f --- /dev/null +++ b/deps/inspector_protocol/lib/ValueConversions_h.template @@ -0,0 +1,319 @@ +// This file is generated by ValueConversions_h.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_ValueConversions_h +#define {{"_".join(config.protocol.namespace)}}_ValueConversions_h + +//#include "ErrorSupport.h" +//#include "Forward.h" +//#include "Values.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +template<typename T> +struct ValueConversions { + static std::unique_ptr<T> fromValue(protocol::Value* value, ErrorSupport* errors) + { + return T::fromValue(value, errors); + } + + static std::unique_ptr<protocol::Value> toValue(T* value) + { + return value->toValue(); + } + + static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<T>& value) + { + return value->toValue(); + } +}; + +template<> +struct ValueConversions<bool> { + static bool fromValue(protocol::Value* value, ErrorSupport* errors) + { + bool result = false; + bool success = value ? value->asBoolean(&result) : false; + if (!success) + errors->AddError("boolean value expected"); + return result; + } + + static std::unique_ptr<protocol::Value> toValue(bool value) + { + return FundamentalValue::create(value); + } +}; + +template<> +struct ValueConversions<int> { + static int fromValue(protocol::Value* value, ErrorSupport* errors) + { + int result = 0; + bool success = value ? value->asInteger(&result) : false; + if (!success) + errors->AddError("integer value expected"); + return result; + } + + static std::unique_ptr<protocol::Value> toValue(int value) + { + return FundamentalValue::create(value); + } +}; + +template<> +struct ValueConversions<double> { + static double fromValue(protocol::Value* value, ErrorSupport* errors) + { + double result = 0; + bool success = value ? value->asDouble(&result) : false; + if (!success) + errors->AddError("double value expected"); + return result; + } + + static std::unique_ptr<protocol::Value> toValue(double value) + { + return FundamentalValue::create(value); + } +}; + +template<> +struct ValueConversions<String> { + static String fromValue(protocol::Value* value, ErrorSupport* errors) + { + String result; + bool success = value ? value->asString(&result) : false; + if (!success) + errors->AddError("string value expected"); + return result; + } + + static std::unique_ptr<protocol::Value> toValue(const String& value) + { + return StringValue::create(value); + } +}; + +template<> +struct ValueConversions<Binary> { + static Binary fromValue(protocol::Value* value, ErrorSupport* errors) + { + if (!value || + (value->type() != Value::TypeBinary && value->type() != Value::TypeString)) { + errors->AddError("Either string base64 or binary value expected"); + return Binary(); + } + Binary binary; + if (value->asBinary(&binary)) + return binary; + String result; + value->asString(&result); + bool success; + Binary out = Binary::fromBase64(result, &success); + if (!success) + errors->AddError("base64 decoding error"); + return out; + } + + static std::unique_ptr<protocol::Value> toValue(const Binary& value) + { + return BinaryValue::create(value); + } +}; + +template<typename T> +struct ValueConversions<std::vector<std::unique_ptr<T>>> { + static std::unique_ptr<std::vector<std::unique_ptr<T>>> fromValue(protocol::Value* value, ErrorSupport* errors) { + protocol::ListValue* array = ListValue::cast(value); + if (!array) { + errors->AddError("array expected"); + return nullptr; + } + errors->Push(); + std::unique_ptr<std::vector<std::unique_ptr<T>>> result( + new std::vector<std::unique_ptr<T>>()); + result->reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + errors->SetIndex(i); + auto item = ValueConversions<T>::fromValue(array->at(i), errors); + result->emplace_back(std::move(item)); + } + errors->Pop(); + if (!errors->Errors().empty()) + return nullptr; + return result; + } + + static std::unique_ptr<protocol::ListValue> toValue(std::vector<std::unique_ptr<T>>* v) + { + std::unique_ptr<protocol::ListValue> result = ListValue::create(); + result->reserve(v->size()); + for (auto& item : *v) + result->pushValue(ValueConversions<T>::toValue(item.get())); + return result; + } + +}; + +template<typename T> +struct ValueConversions<std::vector<T>> { + static std::unique_ptr<std::vector<T>> fromValue(protocol::Value* value, ErrorSupport* errors) { + protocol::ListValue* array = ListValue::cast(value); + if (!array) { + errors->AddError("array expected"); + return nullptr; + } + errors->Push(); + std::unique_ptr<std::vector<T>> result(new std::vector<T>()); + result->reserve(array->size()); + for (size_t i = 0; i < array->size(); ++i) { + errors->SetIndex(i); + auto item = ValueConversions<T>::fromValue(array->at(i), errors); + result->emplace_back(std::move(item)); + } + errors->Pop(); + if (!errors->Errors().empty()) + return nullptr; + return result; + } + + static std::unique_ptr<protocol::ListValue> toValue(std::vector<T>* v) + { + std::unique_ptr<protocol::ListValue> result = ListValue::create(); + result->reserve(v->size()); + for (auto& item : *v) + result->pushValue(ValueConversions<T>::toValue(item)); + return result; + } +}; + +template<> +struct ValueConversions<Value> { + static std::unique_ptr<Value> fromValue(protocol::Value* value, ErrorSupport* errors) + { + bool success = !!value; + if (!success) { + errors->AddError("value expected"); + return nullptr; + } + return value->clone(); + } + + static std::unique_ptr<protocol::Value> toValue(Value* value) + { + return value->clone(); + } + + static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<Value>& value) + { + return value->clone(); + } +}; + +template<> +struct ValueConversions<DictionaryValue> { + static std::unique_ptr<DictionaryValue> fromValue(protocol::Value* value, ErrorSupport* errors) + { + bool success = value && value->type() == protocol::Value::TypeObject; + if (!success) + errors->AddError("object expected"); + return DictionaryValue::cast(value->clone()); + } + + static std::unique_ptr<protocol::Value> toValue(DictionaryValue* value) + { + return value->clone(); + } + + static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<DictionaryValue>& value) + { + return value->clone(); + } +}; + +template<> +struct ValueConversions<ListValue> { + static std::unique_ptr<ListValue> fromValue(protocol::Value* value, ErrorSupport* errors) + { + bool success = value && value->type() == protocol::Value::TypeArray; + if (!success) + errors->AddError("list expected"); + return ListValue::cast(value->clone()); + } + + static std::unique_ptr<protocol::Value> toValue(ListValue* value) + { + return value->clone(); + } + + static std::unique_ptr<protocol::Value> toValue(const std::unique_ptr<ListValue>& value) + { + return value->clone(); + } +}; + +template<typename T> struct ValueTypeConverter { + static std::unique_ptr<T> FromValue(const protocol::Value& value) { + std::vector<uint8_t> bytes; + value.AppendSerialized(&bytes); + return T::FromBinary(bytes.data(), bytes.size()); + } + + static std::unique_ptr<protocol::DictionaryValue> ToValue(const T& obj) { + std::vector<uint8_t> bytes; + obj.AppendSerialized(&bytes); + auto result = Value::parseBinary(bytes.data(), bytes.size()); + return DictionaryValue::cast(std::move(result)); + } +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +namespace {{config.crdtp.namespace}} { + +template<typename T> +struct ProtocolTypeTraits<T, + typename std::enable_if<std::is_base_of<{{"::".join(config.protocol.namespace)}}::Value, T>::value>::type> { + static void Serialize(const {{"::".join(config.protocol.namespace)}}::Value& value, std::vector<uint8_t>* bytes) { + value.AppendSerialized(bytes); + } +}; + +template <> +struct ProtocolTypeTraits<std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Value>> { + static bool Deserialize(DeserializerState* state, std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Value>* value); + static void Serialize(const std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Value>& value, std::vector<uint8_t>* bytes); +}; + +template <> +struct ProtocolTypeTraits<std::unique_ptr<{{"::".join(config.protocol.namespace)}}::DictionaryValue>> { + static bool Deserialize(DeserializerState* state, std::unique_ptr<{{"::".join(config.protocol.namespace)}}::DictionaryValue>* value); + static void Serialize(const std::unique_ptr<{{"::".join(config.protocol.namespace)}}::DictionaryValue>& value, std::vector<uint8_t>* bytes); +}; + +// TODO(caseq): get rid of it, it's just a DictionaryValue really. +template <> +struct ProtocolTypeTraits<std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Object>> { + static bool Deserialize(DeserializerState* state, std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Object>* value); + static void Serialize(const std::unique_ptr<{{"::".join(config.protocol.namespace)}}::Object>& value, std::vector<uint8_t>* bytes); +}; + +template<> +struct ProtocolTypeTraits<{{"::".join(config.protocol.namespace)}}::Object> { + static void Serialize(const {{"::".join(config.protocol.namespace)}}::Object& value, std::vector<uint8_t>* bytes) { + value.AppendSerialized(bytes); + } +}; + +} // namespace {{config.crdtp.namespace}} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_ValueConversions_h) diff --git a/deps/inspector_protocol/lib/Values_cpp.template b/deps/inspector_protocol/lib/Values_cpp.template new file mode 100644 index 00000000000000..0c409295d52ae3 --- /dev/null +++ b/deps/inspector_protocol/lib/Values_cpp.template @@ -0,0 +1,541 @@ +// This file is generated by Values_cpp.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +//#include "Values.h" + +#include "{{config.crdtp.dir}}/cbor.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +namespace { +using {{config.crdtp.namespace}}::Status; +using {{config.crdtp.namespace}}::ParserHandler; +using {{config.crdtp.namespace}}::span; +namespace cbor { +using {{config.crdtp.namespace}}::cbor::ParseCBOR; +using {{config.crdtp.namespace}}::cbor::EncodeBinary; +using {{config.crdtp.namespace}}::cbor::EncodeDouble; +using {{config.crdtp.namespace}}::cbor::EncodeFalse; +using {{config.crdtp.namespace}}::cbor::EncodeFromLatin1; +using {{config.crdtp.namespace}}::cbor::EncodeFromUTF16; +using {{config.crdtp.namespace}}::cbor::EncodeIndefiniteLengthArrayStart; +using {{config.crdtp.namespace}}::cbor::EncodeIndefiniteLengthMapStart; +using {{config.crdtp.namespace}}::cbor::EncodeInt32; +using {{config.crdtp.namespace}}::cbor::EncodeNull; +using {{config.crdtp.namespace}}::cbor::EncodeStop; +using {{config.crdtp.namespace}}::cbor::EncodeString8; +using {{config.crdtp.namespace}}::cbor::EncodeTrue; +using {{config.crdtp.namespace}}::cbor::EnvelopeEncoder; +} // namespace cbor + +// Uses the parsing events received from driver of |ParserHandler| +// (e.g. cbor::ParseCBOR) into a protocol::Value instance. +class ValueParserHandler : public ParserHandler { + public: + // Provides the parsed protocol::Value. + std::unique_ptr<Value> ReleaseRoot() { return std::move(root_); } + + // The first parsing error encountered; |status().ok()| is the default. + Status status() const { return status_; } + + private: + // + // Implementation of ParserHandler. + // + void HandleMapBegin() override { + if (!status_.ok()) return; + std::unique_ptr<DictionaryValue> dict = DictionaryValue::create(); + DictionaryValue* dict_ptr = dict.get(); + AddValueToParent(std::move(dict)); + stack_.emplace_back(dict_ptr); + } + + void HandleMapEnd() override { + if (!status_.ok()) return; + DCHECK(!stack_.empty()); + DCHECK(stack_.back().is_dict); + stack_.pop_back(); + } + + void HandleArrayBegin() override { + if (!status_.ok()) return; + std::unique_ptr<ListValue> list = ListValue::create(); + ListValue* list_ptr = list.get(); + AddValueToParent(std::move(list)); + stack_.emplace_back(list_ptr); + } + + void HandleArrayEnd() override { + if (!status_.ok()) return; + DCHECK(!stack_.empty()); + DCHECK(!stack_.back().is_dict); + stack_.pop_back(); + } + + void HandleString8(span<uint8_t> chars) override { + AddStringToParent(StringUtil::fromUTF8(chars.data(), chars.size())); + } + + void HandleString16(span<uint16_t> chars) override { + AddStringToParent( + StringUtil::fromUTF16LE(chars.data(), chars.size())); + } + + void HandleBinary(span<uint8_t> bytes) override { + AddValueToParent(BinaryValue::create(Binary::fromSpan(bytes))); + } + + void HandleDouble(double value) override { + AddValueToParent(FundamentalValue::create(value)); + } + + void HandleInt32(int32_t value) override { + AddValueToParent(FundamentalValue::create(value)); + } + + void HandleBool(bool value) override { + AddValueToParent(FundamentalValue::create(value)); + } + + void HandleNull() override { + AddValueToParent(Value::null()); + } + + void HandleError(Status error) override { + status_ = error; + } + + // + // Adding strings and values to the parent value. + // Strings are handled separately because they can be keys for + // dictionary values. + // + void AddStringToParent(String str) { + if (!status_.ok()) return; + if (!root_) { + DCHECK(!key_is_pending_); + root_ = StringValue::create(str); + } else if (stack_.back().is_dict) { + // If we already have a pending key, then this is the value of the + // key/value pair. Otherwise, it's the new pending key. + if (key_is_pending_) { + stack_.back().dict->setString(pending_key_, str); + key_is_pending_ = false; + } else { + pending_key_ = std::move(str); + key_is_pending_ = true; + } + } else { // Top of the stack is a list. + DCHECK(!key_is_pending_); + stack_.back().list->pushValue(StringValue::create(str)); + } + } + + void AddValueToParent(std::unique_ptr<Value> value) { + if (!status_.ok()) return; + if (!root_) { + DCHECK(!key_is_pending_); + root_ = std::move(value); + } else if (stack_.back().is_dict) { + DCHECK(key_is_pending_); + stack_.back().dict->setValue(pending_key_, std::move(value)); + key_is_pending_ = false; + } else { // Top of the stack is a list. + DCHECK(!key_is_pending_); + stack_.back().list->pushValue(std::move(value)); + } + } + + // |status_.ok()| is the default; if we receive an error event + // we keep the first one and stop modifying any other state. + Status status_; + + // The root of the parsed protocol::Value tree. + std::unique_ptr<Value> root_; + + // If root_ is a list or a dictionary, this stack keeps track of + // the container we're currently parsing as well as its ancestors. + struct ContainerState { + ContainerState(DictionaryValue* dict) : is_dict(true), dict(dict) {} + ContainerState(ListValue* list) : is_dict(false), list(list) {} + + bool is_dict; + union { + DictionaryValue* dict; + ListValue* list; + }; + }; + std::vector<ContainerState> stack_; + + // For maps, keys and values are alternating events, so we keep the + // key around and process it when the value arrives. + bool key_is_pending_ = false; + String pending_key_; +}; +} // anonymous namespace + +// static +std::unique_ptr<Value> Value::parseBinary(const uint8_t* data, size_t size) { + ValueParserHandler handler; + cbor::ParseCBOR(span<uint8_t>(data, size), &handler); + // TODO(johannes): We have decent error info in handler.status(); provide + // a richer interface that makes this available to client code. + if (handler.status().ok()) + return handler.ReleaseRoot(); + return nullptr; +} + +bool Value::asBoolean(bool*) const +{ + return false; +} + +bool Value::asDouble(double*) const +{ + return false; +} + +bool Value::asInteger(int*) const +{ + return false; +} + +bool Value::asString(String*) const +{ + return false; +} + +bool Value::asBinary(Binary*) const +{ + return false; +} + +void Value::AppendSerialized(std::vector<uint8_t>* bytes) const { + DCHECK(m_type == TypeNull); + bytes->push_back(cbor::EncodeNull()); +} + +std::unique_ptr<Value> Value::clone() const +{ + return Value::null(); +} + +bool FundamentalValue::asBoolean(bool* output) const +{ + if (type() != TypeBoolean) + return false; + *output = m_boolValue; + return true; +} + +bool FundamentalValue::asDouble(double* output) const +{ + if (type() == TypeDouble) { + *output = m_doubleValue; + return true; + } + if (type() == TypeInteger) { + *output = m_integerValue; + return true; + } + return false; +} + +bool FundamentalValue::asInteger(int* output) const +{ + if (type() != TypeInteger) + return false; + *output = m_integerValue; + return true; +} + +void FundamentalValue::AppendSerialized(std::vector<uint8_t>* bytes) const { + switch (type()) { + case TypeDouble: + cbor::EncodeDouble(m_doubleValue, bytes); + return; + case TypeInteger: + cbor::EncodeInt32(m_integerValue, bytes); + return; + case TypeBoolean: + bytes->push_back(m_boolValue ? cbor::EncodeTrue() : cbor::EncodeFalse()); + return; + default: + DCHECK(false); + } +} + +std::unique_ptr<Value> FundamentalValue::clone() const +{ + switch (type()) { + case TypeDouble: return FundamentalValue::create(m_doubleValue); + case TypeInteger: return FundamentalValue::create(m_integerValue); + case TypeBoolean: return FundamentalValue::create(m_boolValue); + default: + DCHECK(false); + } + return nullptr; +} + +bool StringValue::asString(String* output) const +{ + *output = m_stringValue; + return true; +} + +namespace { +// This routine distinguishes between the current encoding for a given +// string |s|, and calls encoding routines that will +// - Ensure that all ASCII strings end up being encoded as UTF8 in +// the wire format - e.g., EncodeFromUTF16 will detect ASCII and +// do the (trivial) transcode to STRING8 on the wire, but if it's +// not ASCII it'll do STRING16. +// - Select a format that's cheap to convert to. E.g., we don't +// have LATIN1 on the wire, so we call EncodeFromLatin1 which +// transcodes to UTF8 if needed. +void EncodeString(const String& s, std::vector<uint8_t>* out) { + if (StringUtil::CharacterCount(s) == 0) { + cbor::EncodeString8(span<uint8_t>(nullptr, 0), out); // Empty string. + } else if (StringUtil::CharactersLatin1(s)) { + cbor::EncodeFromLatin1(span<uint8_t>(StringUtil::CharactersLatin1(s), + StringUtil::CharacterCount(s)), + out); + } else if (StringUtil::CharactersUTF16(s)) { + cbor::EncodeFromUTF16(span<uint16_t>(StringUtil::CharactersUTF16(s), + StringUtil::CharacterCount(s)), + out); + } else if (StringUtil::CharactersUTF8(s)) { + cbor::EncodeString8(span<uint8_t>(StringUtil::CharactersUTF8(s), + StringUtil::CharacterCount(s)), + out); + } +} +} // namespace +void StringValue::AppendSerialized(std::vector<uint8_t>* bytes) const { + EncodeString(m_stringValue, bytes); +} + +std::unique_ptr<Value> StringValue::clone() const +{ + return StringValue::create(m_stringValue); +} + +bool BinaryValue::asBinary(Binary* output) const +{ + *output = m_binaryValue; + return true; +} + +void BinaryValue::AppendSerialized(std::vector<uint8_t>* bytes) const { + cbor::EncodeBinary(span<uint8_t>(m_binaryValue.data(), + m_binaryValue.size()), bytes); +} + +std::unique_ptr<Value> BinaryValue::clone() const +{ + return BinaryValue::create(m_binaryValue); +} + + +DictionaryValue::~DictionaryValue() +{ +} + +void DictionaryValue::setBoolean(const String& name, bool value) +{ + setValue(name, FundamentalValue::create(value)); +} + +void DictionaryValue::setInteger(const String& name, int value) +{ + setValue(name, FundamentalValue::create(value)); +} + +void DictionaryValue::setDouble(const String& name, double value) +{ + setValue(name, FundamentalValue::create(value)); +} + +void DictionaryValue::setString(const String& name, const String& value) +{ + setValue(name, StringValue::create(value)); +} + +void DictionaryValue::setValue(const String& name, std::unique_ptr<Value> value) +{ + set(name, value); +} + +void DictionaryValue::setObject(const String& name, std::unique_ptr<DictionaryValue> value) +{ + set(name, value); +} + +void DictionaryValue::setArray(const String& name, std::unique_ptr<ListValue> value) +{ + set(name, value); +} + +bool DictionaryValue::getBoolean(const String& name, bool* output) const +{ + protocol::Value* value = get(name); + if (!value) + return false; + return value->asBoolean(output); +} + +bool DictionaryValue::getInteger(const String& name, int* output) const +{ + Value* value = get(name); + if (!value) + return false; + return value->asInteger(output); +} + +bool DictionaryValue::getDouble(const String& name, double* output) const +{ + Value* value = get(name); + if (!value) + return false; + return value->asDouble(output); +} + +bool DictionaryValue::getString(const String& name, String* output) const +{ + protocol::Value* value = get(name); + if (!value) + return false; + return value->asString(output); +} + +DictionaryValue* DictionaryValue::getObject(const String& name) const +{ + return DictionaryValue::cast(get(name)); +} + +protocol::ListValue* DictionaryValue::getArray(const String& name) const +{ + return ListValue::cast(get(name)); +} + +protocol::Value* DictionaryValue::get(const String& name) const +{ + Dictionary::const_iterator it = m_data.find(name); + if (it == m_data.end()) + return nullptr; + return it->second.get(); +} + +DictionaryValue::Entry DictionaryValue::at(size_t index) const +{ + const String key = m_order[index]; + return std::make_pair(key, m_data.find(key)->second.get()); +} + +bool DictionaryValue::booleanProperty(const String& name, bool defaultValue) const +{ + bool result = defaultValue; + getBoolean(name, &result); + return result; +} + +int DictionaryValue::integerProperty(const String& name, int defaultValue) const +{ + int result = defaultValue; + getInteger(name, &result); + return result; +} + +double DictionaryValue::doubleProperty(const String& name, double defaultValue) const +{ + double result = defaultValue; + getDouble(name, &result); + return result; +} + +void DictionaryValue::remove(const String& name) +{ + m_data.erase(name); + m_order.erase(std::remove(m_order.begin(), m_order.end(), name), m_order.end()); +} + +void DictionaryValue::AppendSerialized(std::vector<uint8_t>* bytes) const { + cbor::EnvelopeEncoder encoder; + encoder.EncodeStart(bytes); + bytes->push_back(cbor::EncodeIndefiniteLengthMapStart()); + for (size_t i = 0; i < m_order.size(); ++i) { + const String& key = m_order[i]; + Dictionary::const_iterator value = m_data.find(key); + DCHECK(value != m_data.cend() && value->second); + EncodeString(key, bytes); + value->second->AppendSerialized(bytes); + } + bytes->push_back(cbor::EncodeStop()); + encoder.EncodeStop(bytes); +} + +std::unique_ptr<Value> DictionaryValue::clone() const +{ + std::unique_ptr<DictionaryValue> result = DictionaryValue::create(); + for (size_t i = 0; i < m_order.size(); ++i) { + String key = m_order[i]; + Dictionary::const_iterator value = m_data.find(key); + DCHECK(value != m_data.cend() && value->second); + result->setValue(key, value->second->clone()); + } + return result; +} + +DictionaryValue::DictionaryValue() + : Value(TypeObject) +{ +} + +ListValue::~ListValue() +{ +} + +void ListValue::AppendSerialized(std::vector<uint8_t>* bytes) const { + cbor::EnvelopeEncoder encoder; + encoder.EncodeStart(bytes); + bytes->push_back(cbor::EncodeIndefiniteLengthArrayStart()); + for (size_t i = 0; i < m_data.size(); ++i) { + m_data[i]->AppendSerialized(bytes); + } + bytes->push_back(cbor::EncodeStop()); + encoder.EncodeStop(bytes); +} + +std::unique_ptr<Value> ListValue::clone() const +{ + std::unique_ptr<ListValue> result = ListValue::create(); + for (const std::unique_ptr<protocol::Value>& value : m_data) + result->pushValue(value->clone()); + return result; +} + +ListValue::ListValue() + : Value(TypeArray) +{ +} + +void ListValue::pushValue(std::unique_ptr<protocol::Value> value) +{ + DCHECK(value); + m_data.push_back(std::move(value)); +} + +protocol::Value* ListValue::at(size_t index) +{ + DCHECK_LT(index, m_data.size()); + return m_data[index].get(); +} + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/inspector_protocol/lib/Values_h.template b/deps/inspector_protocol/lib/Values_h.template new file mode 100644 index 00000000000000..30cd0e16323517 --- /dev/null +++ b/deps/inspector_protocol/lib/Values_h.template @@ -0,0 +1,266 @@ +// This file is generated by Values_h.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Values_h +#define {{"_".join(config.protocol.namespace)}}_Values_h + +//#include "Allocator.h" +//#include "Forward.h" + +#include <memory> +#include <unordered_map> +#include <utility> +#include <vector> + +#include {{format_include(config.protocol.package, "Forward")}} + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +class ListValue; +class DictionaryValue; +class Value; + +#define PROTOCOL_DISALLOW_COPY(ClassName) \ + private: \ + ClassName(const ClassName&) = delete; \ + ClassName& operator=(const ClassName&) = delete + +class {{config.lib.export_macro}} Value : public Serializable { + PROTOCOL_DISALLOW_COPY(Value); +public: + virtual ~Value() override { } + + static std::unique_ptr<Value> null() + { + return std::unique_ptr<Value>(new Value()); + } + + static std::unique_ptr<Value> parseBinary(const uint8_t* data, size_t size); + + enum ValueType { + TypeNull = 0, + TypeBoolean, + TypeInteger, + TypeDouble, + TypeString, + TypeBinary, + TypeObject, + TypeArray, + TypeImported + }; + + ValueType type() const { return m_type; } + + bool isNull() const { return m_type == TypeNull; } + + virtual bool asBoolean(bool* output) const; + virtual bool asDouble(double* output) const; + virtual bool asInteger(int* output) const; + virtual bool asString(String* output) const; + virtual bool asBinary(Binary* output) const; + + virtual void AppendSerialized(std::vector<uint8_t>* bytes) const override; + virtual std::unique_ptr<Value> clone() const; + +protected: + Value() : m_type(TypeNull) { } + explicit Value(ValueType type) : m_type(type) { } + +private: + friend class DictionaryValue; + friend class ListValue; + + ValueType m_type; +}; + +class {{config.lib.export_macro}} FundamentalValue : public Value { +public: + static std::unique_ptr<FundamentalValue> create(bool value) + { + return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); + } + + static std::unique_ptr<FundamentalValue> create(int value) + { + return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); + } + + static std::unique_ptr<FundamentalValue> create(double value) + { + return std::unique_ptr<FundamentalValue>(new FundamentalValue(value)); + } + + bool asBoolean(bool* output) const override; + bool asDouble(double* output) const override; + bool asInteger(int* output) const override; + void AppendSerialized(std::vector<uint8_t>* bytes) const override; + std::unique_ptr<Value> clone() const override; + +private: + explicit FundamentalValue(bool value) : Value(TypeBoolean), m_boolValue(value) { } + explicit FundamentalValue(int value) : Value(TypeInteger), m_integerValue(value) { } + explicit FundamentalValue(double value) : Value(TypeDouble), m_doubleValue(value) { } + + union { + bool m_boolValue; + double m_doubleValue; + int m_integerValue; + }; +}; + +class {{config.lib.export_macro}} StringValue : public Value { +public: + static std::unique_ptr<StringValue> create(const String& value) + { + return std::unique_ptr<StringValue>(new StringValue(value)); + } + + static std::unique_ptr<StringValue> create(const char* value) + { + return std::unique_ptr<StringValue>(new StringValue(value)); + } + + bool asString(String* output) const override; + void AppendSerialized(std::vector<uint8_t>* bytes) const override; + std::unique_ptr<Value> clone() const override; + +private: + explicit StringValue(const String& value) : Value(TypeString), m_stringValue(value) { } + explicit StringValue(const char* value) : Value(TypeString), m_stringValue(value) { } + + String m_stringValue; +}; + +class {{config.lib.export_macro}} BinaryValue : public Value { +public: + static std::unique_ptr<BinaryValue> create(const Binary& value) + { + return std::unique_ptr<BinaryValue>(new BinaryValue(value)); + } + + bool asBinary(Binary* output) const override; + void AppendSerialized(std::vector<uint8_t>* bytes) const override; + std::unique_ptr<Value> clone() const override; + +private: + explicit BinaryValue(const Binary& value) : Value(TypeBinary), m_binaryValue(value) { } + + Binary m_binaryValue; +}; + +class {{config.lib.export_macro}} DictionaryValue : public Value { +public: + using Entry = std::pair<String, Value*>; + static std::unique_ptr<DictionaryValue> create() + { + return std::unique_ptr<DictionaryValue>(new DictionaryValue()); + } + + static DictionaryValue* cast(Value* value) + { + if (!value || value->type() != TypeObject) + return nullptr; + return static_cast<DictionaryValue*>(value); + } + + static std::unique_ptr<DictionaryValue> cast(std::unique_ptr<Value> value) + { + DictionaryValue* dictionaryValue = cast(value.get()); + if (dictionaryValue) value.release(); + return std::unique_ptr<DictionaryValue>(dictionaryValue); + } + + void AppendSerialized(std::vector<uint8_t>* bytes) const override; + std::unique_ptr<Value> clone() const override; + + size_t size() const { return m_data.size(); } + + void setBoolean(const String& name, bool); + void setInteger(const String& name, int); + void setDouble(const String& name, double); + void setString(const String& name, const String&); + void setValue(const String& name, std::unique_ptr<Value>); + void setObject(const String& name, std::unique_ptr<DictionaryValue>); + void setArray(const String& name, std::unique_ptr<ListValue>); + + bool getBoolean(const String& name, bool* output) const; + bool getInteger(const String& name, int* output) const; + bool getDouble(const String& name, double* output) const; + bool getString(const String& name, String* output) const; + + DictionaryValue* getObject(const String& name) const; + ListValue* getArray(const String& name) const; + Value* get(const String& name) const; + Entry at(size_t index) const; + + bool booleanProperty(const String& name, bool defaultValue) const; + int integerProperty(const String& name, int defaultValue) const; + double doubleProperty(const String& name, double defaultValue) const; + void remove(const String& name); + + ~DictionaryValue() override; + +private: + DictionaryValue(); + template<typename T> + void set(const String& key, std::unique_ptr<T>& value) + { + DCHECK(value); + bool isNew = m_data.find(key) == m_data.end(); + m_data[key] = std::move(value); + if (isNew) + m_order.push_back(key); + } + + using Dictionary = std::unordered_map<String, std::unique_ptr<Value>>; + Dictionary m_data; + std::vector<String> m_order; +}; + +class {{config.lib.export_macro}} ListValue : public Value { +public: + static std::unique_ptr<ListValue> create() + { + return std::unique_ptr<ListValue>(new ListValue()); + } + + static ListValue* cast(Value* value) + { + if (!value || value->type() != TypeArray) + return nullptr; + return static_cast<ListValue*>(value); + } + + static std::unique_ptr<ListValue> cast(std::unique_ptr<Value> value) + { + ListValue* listValue = cast(value.get()); + if (listValue) value.release(); + return std::unique_ptr<ListValue>(listValue); + } + + ~ListValue() override; + + void AppendSerialized(std::vector<uint8_t>* bytes) const override; + std::unique_ptr<Value> clone() const override; + + void pushValue(std::unique_ptr<Value>); + + Value* at(size_t index); + size_t size() const { return m_data.size(); } + void reserve(size_t capacity) { m_data.reserve(capacity); } + +private: + ListValue(); + std::vector<std::unique_ptr<Value>> m_data; +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // {{"_".join(config.protocol.namespace)}}_Values_h diff --git a/deps/inspector_protocol/pdl.py b/deps/inspector_protocol/pdl.py new file mode 100644 index 00000000000000..6b448c07443c7e --- /dev/null +++ b/deps/inspector_protocol/pdl.py @@ -0,0 +1,181 @@ +# Copyright 2018 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +from __future__ import print_function +import collections +import json +import os.path +import re +import sys + +description = '' + + +primitiveTypes = ['integer', 'number', 'boolean', 'string', 'object', + 'any', 'array', 'binary'] + + +def assignType(item, type, is_array=False, map_binary_to_string=False): + if is_array: + item['type'] = 'array' + item['items'] = collections.OrderedDict() + assignType(item['items'], type, False, map_binary_to_string) + return + + if type == 'enum': + type = 'string' + if map_binary_to_string and type == 'binary': + type = 'string' + if 'description' in item: + item['description'] = (item['description'] + + ' (Encoded as a base64 string when passed over JSON)') + if type in primitiveTypes: + item['type'] = type + else: + item['$ref'] = type + + +def createItem(d, experimental, deprecated, name=None): + result = collections.OrderedDict(d) + if name: + result['name'] = name + global description + if description: + result['description'] = description.strip() + if experimental: + result['experimental'] = True + if deprecated: + result['deprecated'] = True + return result + + +def parse(data, file_name, map_binary_to_string=False): + protocol = collections.OrderedDict() + protocol['version'] = collections.OrderedDict() + protocol['domains'] = [] + domain = None + item = None + subitems = None + nukeDescription = False + global description + lines = data.split('\n') + for i in range(0, len(lines)): + if nukeDescription: + description = '' + nukeDescription = False + line = lines[i] + trimLine = line.strip() + + if trimLine.startswith('#'): + if len(description): + description += '\n' + description += trimLine[2:] + continue + else: + nukeDescription = True + + if len(trimLine) == 0: + continue + + match = re.compile( + r'^(experimental )?(deprecated )?domain (.*)').match(line) + if match: + domain = createItem({'domain' : match.group(3)}, match.group(1), + match.group(2)) + protocol['domains'].append(domain) + continue + + match = re.compile(r'^ depends on ([^\s]+)').match(line) + if match: + if 'dependencies' not in domain: + domain['dependencies'] = [] + domain['dependencies'].append(match.group(1)) + continue + + match = re.compile(r'^ (experimental )?(deprecated )?type (.*) ' + r'extends (array of )?([^\s]+)').match(line) + if match: + if 'types' not in domain: + domain['types'] = [] + item = createItem({'id': match.group(3)}, match.group(1), match.group(2)) + assignType(item, match.group(5), match.group(4), map_binary_to_string) + domain['types'].append(item) + continue + + match = re.compile( + r'^ (experimental )?(deprecated )?(command|event) (.*)').match(line) + if match: + list = [] + if match.group(3) == 'command': + if 'commands' in domain: + list = domain['commands'] + else: + list = domain['commands'] = [] + else: + if 'events' in domain: + list = domain['events'] + else: + list = domain['events'] = [] + + item = createItem({}, match.group(1), match.group(2), match.group(4)) + list.append(item) + continue + + match = re.compile( + r'^ (experimental )?(deprecated )?(optional )?' + r'(array of )?([^\s]+) ([^\s]+)').match(line) + if match: + param = createItem({}, match.group(1), match.group(2), match.group(6)) + if match.group(3): + param['optional'] = True + assignType(param, match.group(5), match.group(4), map_binary_to_string) + if match.group(5) == 'enum': + enumliterals = param['enum'] = [] + subitems.append(param) + continue + + match = re.compile(r'^ (parameters|returns|properties)').match(line) + if match: + subitems = item[match.group(1)] = [] + continue + + match = re.compile(r'^ enum').match(line) + if match: + enumliterals = item['enum'] = [] + continue + + match = re.compile(r'^version').match(line) + if match: + continue + + match = re.compile(r'^ major (\d+)').match(line) + if match: + protocol['version']['major'] = match.group(1) + continue + + match = re.compile(r'^ minor (\d+)').match(line) + if match: + protocol['version']['minor'] = match.group(1) + continue + + match = re.compile(r'^ redirect ([^\s]+)').match(line) + if match: + item['redirect'] = match.group(1) + continue + + match = re.compile(r'^ ( )?[^\s]+$').match(line) + if match: + # enum literal + enumliterals.append(trimLine) + continue + + print('Error in %s:%s, illegal token: \t%s' % (file_name, i, line)) + sys.exit(1) + return protocol + + +def loads(data, file_name, map_binary_to_string=False): + if file_name.endswith(".pdl"): + return parse(data, file_name, map_binary_to_string) + return json.loads(data) diff --git a/tools/inspector_protocol/templates/Exported_h.template b/deps/inspector_protocol/templates/Exported_h.template similarity index 88% rename from tools/inspector_protocol/templates/Exported_h.template rename to deps/inspector_protocol/templates/Exported_h.template index 765f6c2135b9c3..f00875ac77a2a1 100644 --- a/tools/inspector_protocol/templates/Exported_h.template +++ b/deps/inspector_protocol/templates/Exported_h.template @@ -1,6 +1,6 @@ // This file is generated by Exported_h.template. -// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -20,8 +20,8 @@ namespace {{namespace}} { #define {{"_".join(config.protocol.namespace)}}_exported_api_h class {{config.exported.export_macro}} Exported { public: - virtual {{config.exported.string_out}} toJSONString() const = 0; - virtual void writeBinary(std::vector<uint8_t>* out) const = 0; + virtual void AppendSerialized(std::vector<uint8_t>* out) const = 0; + virtual ~Exported() { } }; #endif // !defined({{"_".join(config.protocol.namespace)}}_exported_api_h) @@ -61,7 +61,6 @@ namespace {{param.name | to_title_case}}Enum { class {{config.exported.export_macro}} {{type.id}} : public Exported { public: - static std::unique_ptr<protocol::{{domain.domain}}::API::{{type.id}}> fromJSONString(const {{config.exported.string_in}}& json); static std::unique_ptr<protocol::{{domain.domain}}::API::{{type.id}}> fromBinary(const uint8_t* data, size_t length); }; {% endfor %} diff --git a/deps/inspector_protocol/templates/Imported_h.template b/deps/inspector_protocol/templates/Imported_h.template new file mode 100644 index 00000000000000..5161d27351be47 --- /dev/null +++ b/deps/inspector_protocol/templates/Imported_h.template @@ -0,0 +1,126 @@ +// This file is generated by Imported_h.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h +#define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h + +#include {{format_include(config.protocol.package, "Protocol")}} +{% if config.imported.header %} +#include {{format_include(config.imported.header)}} +{% else %} +#include {{format_include(config.imported.package, domain.domain)}} +{% endif %} + +#ifndef {{"_".join(config.protocol.namespace)}}_imported_imported_h + +namespace {{config.crdtp.namespace}} { + +template <typename T> +struct ProtocolTypeTraits< + std::unique_ptr<T>, + typename std::enable_if< + std::is_base_of<{{"::".join(config.imported.namespace)}}::Exported, T>::value>::type> { + static bool Deserialize(DeserializerState* state, std::unique_ptr<T>* value) { + if (state->tokenizer()->TokenTag() != cbor::CBORTokenTag::ENVELOPE) { + state->RegisterError(Error::CBOR_INVALID_ENVELOPE); + return false; + } + span<uint8_t> env = state->tokenizer()->GetEnvelope(); + auto res = T::fromBinary(env.data(), env.size()); + if (!res) { + // TODO(caseq): properly plumb an error rather than returning a bogus code. + state->RegisterError(Error::MESSAGE_MUST_BE_AN_OBJECT); + return false; + } + *value = std::move(res); + return true; + } + static void Serialize(const std::unique_ptr<T>& value, std::vector<uint8_t>* bytes) { + // Use virtual method, so that outgoing protocol objects could be retained + // by a pointer to ProtocolObject. + value->AppendSerialized(bytes); + } +}; + +template <typename T> +struct ProtocolTypeTraits< + T, + typename std::enable_if< + std::is_base_of<{{"::".join(config.imported.namespace)}}::Exported, T>::value>::type> { + static void Serialize(const T& value, std::vector<uint8_t>* bytes) { + // Use virtual method, so that outgoing protocol objects could be retained + // by a pointer to ProtocolObject. + value.AppendSerialized(bytes); + } +}; + +} // namespace {{config.crdtp.namespace}} + +#endif // {{"_".join(config.protocol.namespace)}}_imported_imported_h + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +using Exported = {{"::".join(config.imported.namespace)}}::Exported; + +#ifndef {{"_".join(config.protocol.namespace)}}_imported_imported_h +#define {{"_".join(config.protocol.namespace)}}_imported_imported_h + +class {{config.lib.export_macro}} ImportedValue : public Value { +public: + static std::unique_ptr<ImportedValue> fromExported(const Exported* value) { + return std::unique_ptr<ImportedValue>(new ImportedValue(value)); + } + + void AppendSerialized(std::vector<uint8_t>* output) const override { + m_exported->AppendSerialized(output); + } + + std::unique_ptr<Value> clone() const override { + return std::unique_ptr<Value>(new ImportedValue(m_exported)); + } + +private: + explicit ImportedValue(const Exported* exported) : Value(TypeImported), m_exported(exported) { } + const Exported* m_exported; +}; + +#endif // !defined({{"_".join(config.protocol.namespace)}}_imported_imported_h) + + {% for type in domain.types %} + {% if not (type.type == "object") or not ("properties" in type) or not protocol.is_imported(domain.domain, type.id) %}{% continue %}{% endif %} + +template<> +struct ValueConversions<{{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}> { + static std::unique_ptr<{{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}> fromValue(protocol::Value* value, ErrorSupport* errors) + { + if (!value) { + errors->AddError("value expected"); + return nullptr; + } + + std::vector<uint8_t> binary; + value->AppendSerialized(&binary); + auto result = {{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}::fromBinary(binary.data(), binary.size()); + if (!result) + errors->AddError("cannot parse"); + return result; + } + + static std::unique_ptr<protocol::Value> toValue(const {{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}* exported) + { + return ImportedValue::fromExported(exported); + } +}; + + {% endfor %} + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h) diff --git a/deps/inspector_protocol/templates/TypeBuilder_cpp.template b/deps/inspector_protocol/templates/TypeBuilder_cpp.template new file mode 100644 index 00000000000000..a38182c311ae6e --- /dev/null +++ b/deps/inspector_protocol/templates/TypeBuilder_cpp.template @@ -0,0 +1,380 @@ +// This file is generated by TypeBuilder_cpp.template. + +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include {{format_domain_include(config.protocol.package, domain.domain)}} + +#include {{format_include(config.protocol.package, "Protocol")}} + +#include "{{config.crdtp.dir}}/cbor.h" +#include "{{config.crdtp.dir}}/find_by_first.h" +#include "{{config.crdtp.dir}}/span.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} +namespace {{domain.domain}} { + +using {{config.crdtp.namespace}}::DeserializerState; +using {{config.crdtp.namespace}}::ProtocolTypeTraits; + +// ------------- Enum values from types. + +const char Metainfo::domainName[] = "{{domain.domain}}"; +const char Metainfo::commandPrefix[] = "{{domain.domain}}."; +const char Metainfo::version[] = "{{domain.version}}"; + {% for type in domain.types %} + {% if not protocol.generate_type(domain.domain, type.id) %}{% continue %} {% endif %} + {% if "enum" in type %} + +namespace {{type.id}}Enum { + {% for literal in type.enum %} +const char {{ literal | dash_to_camelcase}}[] = "{{literal}}"; + {% endfor %} +} // namespace {{type.id}}Enum + {% if protocol.is_exported(domain.domain, type.id) %} + +namespace API { +namespace {{type.id}}Enum { + {% for literal in type.enum %} +const char* {{ literal | dash_to_camelcase}} = "{{literal}}"; + {% endfor %} +} // namespace {{type.id}}Enum +} // namespace API + {% endif %} + {% endif %} + + {% for property in type.properties %} + {% if "enum" in property %} + + {% for literal in property.enum %} +const char* {{type.id}}::{{property.name | to_title_case}}Enum::{{literal | dash_to_camelcase}} = "{{literal}}"; + {% endfor %} + {% endif %} + {% endfor %} + {% if not (type.type == "object") or not ("properties" in type) %}{% continue %}{% endif %} +CRDTP_BEGIN_DESERIALIZER({{type.id}}) + {% for property in type.properties | sort(attribute = 'name', case_sensitive=True) %} + {% if property.optional %} + CRDTP_DESERIALIZE_FIELD_OPT("{{property.name}}", m_{{property.name}}), + {% else %} + CRDTP_DESERIALIZE_FIELD("{{property.name}}", m_{{property.name}}), + {% endif %} + {% endfor %} +CRDTP_END_DESERIALIZER() + +CRDTP_BEGIN_SERIALIZER({{type.id}}) + {% for property in type.properties %} + CRDTP_SERIALIZE_FIELD("{{property.name}}", m_{{property.name}}); + {% endfor %} +CRDTP_END_SERIALIZER(); + + {% if protocol.is_exported(domain.domain, type.id) %} +// static +std::unique_ptr<API::{{type.id}}> API::{{type.id}}::fromBinary(const uint8_t* data, size_t length) +{ + return protocol::{{domain.domain}}::{{type.id}}::FromBinary(data, length); +} + {% endif %} + {% endfor %} + +// ------------- Enum values from params. + + {% for command in join_arrays(domain, ["commands", "events"]) %} + {% for param in join_arrays(command, ["parameters", "returns"]) %} + {% if "enum" in param %} + +namespace {{command.name | to_title_case}} { +namespace {{param.name | to_title_case}}Enum { + {% for literal in param.enum %} +const char* {{ literal | to_title_case}} = "{{literal}}"; + {% endfor %} +} // namespace {{param.name | to_title_case}}Enum +} // namespace {{command.name | to_title_case }} + {% if protocol.is_exported(domain.domain, command.name + "." + param.name) %} + +namespace API { +namespace {{command.name | to_title_case}} { +namespace {{param.name | to_title_case}}Enum { + {% for literal in param.enum %} +const char* {{ literal | to_title_case}} = "{{literal}}"; + {% endfor %} +} // namespace {{param.name | to_title_case}}Enum +} // namespace {{command.name | to_title_case }} +} // namespace API + {% endif %} + {% endif %} + {% endfor %} + {% endfor %} + +// ------------- Frontend notifications. + {% for event in domain.events %} + {% if not protocol.generate_event(domain.domain, event.name) %}{% continue %}{% endif %} + +void Frontend::{{event.name | to_method_case}}( + {%- for parameter in event.parameters %} + {% if "optional" in parameter -%} + {{protocol.optional_type(parameter)}} + {%- else -%} + {{protocol.resolve_type(parameter).pass_type}} + {%- endif %} {{parameter.name}}{%- if not loop.last -%}, {% endif -%} + {% endfor -%}) +{ + if (!frontend_channel_) + return; + {% if event.parameters %} + {{config.crdtp.namespace}}::ObjectSerializer serializer; + {% for parameter in event.parameters %} + serializer.AddField({{config.crdtp.namespace}}::MakeSpan("{{parameter.name}}"), {{parameter.name}}); + {% endfor %} + frontend_channel_->SendProtocolNotification({{config.crdtp.namespace}}::CreateNotification("{{domain.domain}}.{{event.name}}", serializer.Finish())); + {% else %} + frontend_channel_->SendProtocolNotification({{config.crdtp.namespace}}::CreateNotification("{{domain.domain}}.{{event.name}}")); + {% endif %} +} + {% endfor %} + +void Frontend::flush() +{ + frontend_channel_->FlushProtocolNotifications(); +} + +void Frontend::sendRawNotification(std::unique_ptr<Serializable> notification) +{ + frontend_channel_->SendProtocolNotification(std::move(notification)); +} + +// --------------------- Dispatcher. + +class DomainDispatcherImpl : public protocol::DomainDispatcher { +public: + DomainDispatcherImpl(FrontendChannel* frontendChannel, Backend* backend) + : DomainDispatcher(frontendChannel) + , m_backend(backend) {} + ~DomainDispatcherImpl() override { } + + using CallHandler = void (DomainDispatcherImpl::*)(const {{config.crdtp.namespace}}::Dispatchable& dispatchable); + + std::function<void(const {{config.crdtp.namespace}}::Dispatchable&)> Dispatch({{config.crdtp.namespace}}::span<uint8_t> command_name) override; + + {% for command in domain.commands %} + {% if "redirect" in command %}{% continue %}{% endif %} + {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} + void {{command.name}}(const {{config.crdtp.namespace}}::Dispatchable& dispatchable); + {% endfor %} + protected: + Backend* m_backend; +}; + +namespace { +// This helper method with a static map of command methods (instance methods +// of DomainDispatcherImpl declared just above) by their name is used immediately below, +// in the DomainDispatcherImpl::Dispatch method. +DomainDispatcherImpl::CallHandler CommandByName({{config.crdtp.namespace}}::span<uint8_t> command_name) { + static auto* commands = [](){ + auto* commands = new std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>, + DomainDispatcherImpl::CallHandler>>{ + {% for command in domain.commands|sort(attribute="name",case_sensitive=True) %} + {% if "redirect" in command %}{% continue %}{% endif %} + {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} + { + {{config.crdtp.namespace}}::SpanFrom("{{command.name}}"), + &DomainDispatcherImpl::{{command.name}} + }, + {% endfor %} + }; + return commands; + }(); + return {{config.crdtp.namespace}}::FindByFirst<DomainDispatcherImpl::CallHandler>(*commands, command_name, nullptr); +} +} // namespace + +std::function<void(const {{config.crdtp.namespace}}::Dispatchable&)> DomainDispatcherImpl::Dispatch({{config.crdtp.namespace}}::span<uint8_t> command_name) { + CallHandler handler = CommandByName(command_name); + if (!handler) return nullptr; + + return [this, handler](const {{config.crdtp.namespace}}::Dispatchable& dispatchable) { + (this->*handler)(dispatchable); + }; +} + + {% for command in domain.commands %} + {% set command_name_title = command.name | to_title_case %} + {% if "redirect" in command %}{% continue %}{% endif %} + {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %} + {% if protocol.is_async_command(domain.domain, command.name) %} + +class {{command_name_title}}CallbackImpl : public Backend::{{command_name_title}}Callback, public DomainDispatcher::Callback { +public: + {{command_name_title}}CallbackImpl(std::unique_ptr<DomainDispatcher::WeakPtr> backendImpl, int callId, {{config.crdtp.namespace}}::span<uint8_t> message) + : DomainDispatcher::Callback(std::move(backendImpl), callId, +{{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), message) { } + + void sendSuccess( + {%- for parameter in command.returns -%} + {%- if "optional" in parameter -%} + {{protocol.optional_type(parameter)}} {{parameter.name}} + {%- else -%} + {{protocol.resolve_type(parameter).pass_type}} {{parameter.name}} + {%- endif -%} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%}) override + { + {{config.crdtp.namespace}}::ObjectSerializer serializer; + {% for parameter in command.returns %} + serializer.AddField({{config.crdtp.namespace}}::MakeSpan("{{parameter.name}}"), {{parameter.name}}); + {% endfor %} + sendIfActive(serializer.Finish(), DispatchResponse::Success()); + } + + void fallThrough() override + { + fallThroughIfActive(); + } + + void sendFailure(const DispatchResponse& response) override + { + DCHECK(response.IsError()); + sendIfActive(nullptr, response); + } +}; + {% endif %} + +namespace { + + {% if "parameters" in command %} +struct {{command.name}}Params : public {{config.crdtp.namespace}}::DeserializableProtocolObject<{{command.name}}Params> { + {% for parameter in command.parameters %} + {% set parameter_type = protocol.resolve_type(parameter) %} + {% if parameter.optional %} + {{protocol.optional_type(parameter)}} {{parameter.name}}; + {% else %} + {{parameter_type.type}} {{parameter.name}}; + {% endif %} + {% endfor %} + DECLARE_DESERIALIZATION_SUPPORT(); +}; + +CRDTP_BEGIN_DESERIALIZER({{command.name}}Params) + {% for parameter in command.parameters | sort(attribute = 'name', case_sensitive=True) %} + {% if parameter.optional %} + CRDTP_DESERIALIZE_FIELD_OPT("{{parameter.name}}", {{parameter.name}}), + {% else %} + CRDTP_DESERIALIZE_FIELD("{{parameter.name}}", {{parameter.name}}), + {% endif %} + {% endfor %} +CRDTP_END_DESERIALIZER() + {% endif %} + +} // namespace + +void DomainDispatcherImpl::{{command.name}}(const {{config.crdtp.namespace}}::Dispatchable& dispatchable) +{ + // Prepare input parameters. + {% if "parameters" in command %} + auto deserializer = {{config.crdtp.namespace}}::DeferredMessage::FromSpan(dispatchable.Params())->MakeDeserializer(); + {{command.name}}Params params; + if (!{{command.name}}Params::Deserialize(&deserializer, ¶ms)) { + ReportInvalidParams(dispatchable, deserializer); + return; + } + {% endif -%} + + {% if "returns" in command and not protocol.is_async_command(domain.domain, command.name) %} + // Declare output parameters. + {% for parameter in command.returns %} + {% if "optional" in parameter %} + {{protocol.optional_type(parameter)}} out_{{parameter.name}}; + {% else %} + {{protocol.resolve_type(parameter).type}} out_{{parameter.name}}; + {% endif %} + {% endfor %} + {% endif %} + + {% if not protocol.is_async_command(domain.domain, command.name) %} + std::unique_ptr<DomainDispatcher::WeakPtr> weak = weakPtr(); + DispatchResponse response = m_backend->{{command.name | to_method_case}}( + {%- for parameter in command.parameters -%} + {%- if not loop.first -%}, {% endif -%} + {%- if "optional" in parameter -%} + std::move(params.{{parameter.name}}) + {%- else -%} + {{protocol.resolve_type(parameter).to_pass_type % ("params." + parameter.name)}} + {%- endif -%} + {%- endfor %} + {%- if "returns" in command %} + {%- for parameter in command.returns -%} + {%- if not loop.first or command.parameters -%}, {% endif -%} + &out_{{parameter.name}} + {%- endfor %} + {% endif %}); + if (response.IsFallThrough()) { + channel()->FallThrough(dispatchable.CallId(), {{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), dispatchable.Serialized()); + return; + } + {% if "returns" in command %} + if (weak->get()) { + std::unique_ptr<{{config.crdtp.namespace}}::Serializable> result; + if (response.IsSuccess()) { + {{config.crdtp.namespace}}::ObjectSerializer serializer; + {% for parameter in command.returns %} + serializer.AddField({{config.crdtp.namespace}}::MakeSpan("{{parameter.name}}"), out_{{parameter.name}}); + {% endfor %} + result = serializer.Finish(); + } else { + result = Serializable::From({}); + } + weak->get()->sendResponse(dispatchable.CallId(), response, std::move(result)); + } + {% else %} + if (weak->get()) + weak->get()->sendResponse(dispatchable.CallId(), response); + {% endif %} + return; + {% else %} + m_backend->{{command.name | to_method_case}}( + {%- for property in command.parameters -%} + {%- if not loop.first -%}, {% endif -%} + {%- if "optional" in property -%} + std::move(params.{{property.name}}) + {%- else -%} + {{protocol.resolve_type(property).to_pass_type % ("params." + property.name)}} + {%- endif -%} + {%- endfor -%} + {%- if command.parameters -%}, {% endif -%} + std::make_unique<{{command_name_title}}CallbackImpl>(weakPtr(), dispatchable.CallId(), dispatchable.Serialized())); + {% endif %} +} + {% endfor %} + +namespace { +// This helper method (with a static map of redirects) is used from Dispatcher::wire +// immediately below. +const std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>, {{config.crdtp.namespace}}::span<uint8_t>>>& SortedRedirects() { + static auto* redirects = [](){ + auto* redirects = new std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>, {{config.crdtp.namespace}}::span<uint8_t>>>{ + {% for command in domain.commands|sort(attribute="name",case_sensitive=True) %} + {% if "redirect" in command %} + { {{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), {{config.crdtp.namespace}}::SpanFrom("{{command.redirect}}.{{command.name}}") }, + {% endif %} + {% endfor %} + }; + return redirects; + }(); + return *redirects; +} +} // namespace + +// static +void Dispatcher::wire(UberDispatcher* uber, Backend* backend) +{ + auto dispatcher = std::make_unique<DomainDispatcherImpl>(uber->channel(), backend); + uber->WireBackend({{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}"), SortedRedirects(), std::move(dispatcher)); +} + +} // {{domain.domain}} +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/tools/inspector_protocol/templates/TypeBuilder_h.template b/deps/inspector_protocol/templates/TypeBuilder_h.template similarity index 84% rename from tools/inspector_protocol/templates/TypeBuilder_h.template rename to deps/inspector_protocol/templates/TypeBuilder_h.template index 9d86d7a4ac0a5c..7c2a696ad0cbe4 100644 --- a/tools/inspector_protocol/templates/TypeBuilder_h.template +++ b/deps/inspector_protocol/templates/TypeBuilder_h.template @@ -1,6 +1,6 @@ // This file is generated by TypeBuilder_h.template. -// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -26,8 +26,6 @@ namespace {{namespace}} { {% endfor %} namespace {{domain.domain}} { - -// ------------- Forward and enum declarations. {% for type in domain.types %} {% if not protocol.generate_type(domain.domain, type.id) %}{% continue %}{% endif %} {% if type.type == "object" %} @@ -40,6 +38,8 @@ using {{type.id}} = Object; using {{type.id}} = {{protocol.resolve_type(type).type}}; {% endif %} {% endfor %} + +// ------------- Forward and enum declarations. {% for type in domain.types %} {% if not protocol.generate_type(domain.domain, type.id) %}{% continue %}{% endif %} {% if "enum" in type %} @@ -71,11 +71,9 @@ namespace {{param.name | to_title_case}}Enum { {% if not protocol.generate_type(domain.domain, type.id) %}{% continue %}{% endif %} {% if not (type.type == "object") or not ("properties" in type) %}{% continue %}{% endif %} -class {{config.protocol.export_macro}} {{type.id}} : public Serializable{% if protocol.is_exported(domain.domain, type.id) %}, public API::{{type.id}}{% endif %}{ - PROTOCOL_DISALLOW_COPY({{type.id}}); +class {{config.protocol.export_macro}} {{type.id}} : public ::{{config.crdtp.namespace}}::ProtocolObject<{{type.id}}>{% if protocol.is_exported(domain.domain, type.id) %}, + public API::{{type.id}}{% endif %} { public: - static std::unique_ptr<{{type.id}}> fromValue(protocol::Value* value, ErrorSupport* errors); - ~{{type.id}}() override { } {% for property in type.properties %} {% set property_type = protocol.resolve_type(property) %} @@ -91,24 +89,25 @@ public: {% endif %} {% if property.optional %} - bool {{"has" | to_method_case}}{{property_name}}() { return {{property_field}}.isJust(); } - {{property_type.raw_return_type}} {{"get" | to_method_case}}{{property_name}}({{property_type.raw_pass_type}} defaultValue) { return {{property_field}}.isJust() ? {{property_field}}.fromJust() : defaultValue; } + bool {{"has" | to_method_case}}{{property_name}}() { return !!{{property_field}}; } + {% if property_type.is_primitive %} + {{property_type.raw_return_type}} {{"get" | to_method_case}}{{property_name}}({{property_type.raw_pass_type}} defaultValue) const { + return {{property_field}}.value_or(defaultValue); + } + {% else %} + {{property_type.raw_return_type}} {{"get" | to_method_case}}{{property_name}}({{property_type.raw_pass_type}} defaultValue) { + return {{property_field}} ? {{property_field}}.get() : defaultValue; + } + {% endif %} + const {{protocol.optional_type(property)}}& {{"get" | to_method_case}}{{property_name}}() const { + return {{property_field}}; + } {% else %} {{property_type.raw_return_type}} {{"get" | to_method_case}}{{property_name}}() { return {{property_type.to_raw_type % property_field}}; } {% endif %} void {{"set" | to_method_case}}{{property_name}}({{property_type.pass_type}} value) { {{property_field}} = {{property_type.to_rvalue % "value"}}; } {% endfor %} - std::unique_ptr<protocol::DictionaryValue> toValue() const; - String serializeToJSON() override { return toValue()->serializeToJSON(); } - std::vector<uint8_t> serializeToBinary() override { return toValue()->serializeToBinary(); } - String toJSON() const { return toValue()->toJSONString(); } - std::unique_ptr<{{type.id}}> clone() const; - {% if protocol.is_exported(domain.domain, type.id) %} - {{config.exported.string_out}} toJSONString() const override; - void writeBinary(std::vector<uint8_t>* out) const override; - {% endif %} - template<int STATE> class {{type.id}}Builder { public: @@ -166,6 +165,8 @@ public: } private: + DECLARE_SERIALIZATION_SUPPORT(); + {{type.id}}() { {% for property in type.properties %} @@ -177,7 +178,7 @@ private: {% for property in type.properties %} {% if property.optional %} - Maybe<{{protocol.resolve_type(property).raw_type}}> m_{{property.name}}; + {{protocol.optional_type(property)}} m_{{property.name}}; {% else %} {{protocol.resolve_type(property).type}} m_{{property.name}}; {% endif %} @@ -201,7 +202,7 @@ public: virtual void sendSuccess( {%- for parameter in command.returns -%} {%- if "optional" in parameter -%} - Maybe<{{protocol.resolve_type(parameter).raw_type}}> {{parameter.name}} + {{protocol.optional_type(parameter)}} {{parameter.name}} {%- else -%} {{protocol.resolve_type(parameter).pass_type}} {{parameter.name}} {%- endif -%} @@ -221,7 +222,7 @@ public: {%- for parameter in command.parameters -%} {%- if not loop.first -%}, {% endif -%} {%- if "optional" in parameter -%} - Maybe<{{protocol.resolve_type(parameter).raw_type}}> in_{{parameter.name}} + {{protocol.optional_type(parameter)}} in_{{parameter.name}} {%- else -%} {{protocol.resolve_type(parameter).pass_type}} in_{{parameter.name}} {%- endif -%} @@ -233,7 +234,7 @@ public: {%- for parameter in command.returns -%} {%- if (not loop.first) or command.parameters -%}, {% endif -%} {%- if "optional" in parameter -%} - Maybe<{{protocol.resolve_type(parameter).raw_type}}>* out_{{parameter.name}} + {{protocol.optional_type(parameter)}}* out_{{parameter.name}} {%- else -%} {{protocol.resolve_type(parameter).type}}* out_{{parameter.name}} {%- endif -%} @@ -245,7 +246,7 @@ public: {% if protocol.generate_disable(domain) %} virtual DispatchResponse {{"disable" | to_method_case}}() { - return DispatchResponse::OK(); + return DispatchResponse::Success(); } {% endif %} }; @@ -254,13 +255,13 @@ public: class {{config.protocol.export_macro}} Frontend { public: - explicit Frontend(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { } + explicit Frontend(FrontendChannel* frontend_channel) : frontend_channel_(frontend_channel) {} {% for event in domain.events %} {% if not protocol.generate_event(domain.domain, event.name) %}{% continue %}{% endif %} void {{event.name | to_method_case}}( {%- for parameter in event.parameters -%} {%- if "optional" in parameter -%} - Maybe<{{protocol.resolve_type(parameter).raw_type}}> {{parameter.name}} = Maybe<{{protocol.resolve_type(parameter).raw_type}}>() + {{protocol.optional_type(parameter)}} {{parameter.name}} = {} {%- else -%} {{protocol.resolve_type(parameter).pass_type}} {{parameter.name}} {%- endif -%}{%- if not loop.last -%}, {% endif -%} @@ -268,11 +269,10 @@ public: ); {% endfor %} - void flush(); - void sendRawJSONNotification(String); - void sendRawCBORNotification(std::vector<uint8_t>); -private: - FrontendChannel* m_frontendChannel; + void flush(); + void sendRawNotification(std::unique_ptr<Serializable>); + private: + FrontendChannel* frontend_channel_; }; // ------------- Dispatcher. diff --git a/deps/llhttp/CMakeLists.txt b/deps/llhttp/CMakeLists.txt index 87a66929dbe036..56f0098c2c5c49 100644 --- a/deps/llhttp/CMakeLists.txt +++ b/deps/llhttp/CMakeLists.txt @@ -1,7 +1,7 @@ -cmake_minimum_required(VERSION 3.5.1) +cmake_minimum_required(VERSION 3.25.0) cmake_policy(SET CMP0069 NEW) -project(llhttp VERSION 9.2.1) +project(llhttp VERSION 9.3.0) include(GNUInstallDirs) set(CMAKE_C_STANDARD 99) @@ -49,7 +49,7 @@ function(config_library target) target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> - $<INSTALL_INTERFACE:include> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) set_target_properties(${target} PROPERTIES @@ -61,6 +61,7 @@ function(config_library target) install(TARGETS ${target} EXPORT llhttp + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} diff --git a/deps/llhttp/LICENSE b/deps/llhttp/LICENSE new file mode 100644 index 00000000000000..6c1512dd6bcd6d --- /dev/null +++ b/deps/llhttp/LICENSE @@ -0,0 +1,22 @@ +This software is licensed under the MIT License. + +Copyright Fedor Indutny, 2018. + +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/llhttp/README.md b/deps/llhttp/README.md index 28653aa0358415..70af44ff0f5a16 100644 --- a/deps/llhttp/README.md +++ b/deps/llhttp/README.md @@ -94,7 +94,7 @@ int main() { if (err == HPE_OK) { fprintf(stdout, "Successfully parsed!\n"); } else { - fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), parser.reason); + fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), llhttp_get_error_reason(&parser)); } } ``` @@ -112,6 +112,7 @@ The following callbacks can return `0` (proceed normally), `-1` (error) or `HPE_ * `on_message_complete`: Invoked when a request/response has been completedly parsed. * `on_url_complete`: Invoked after the URL has been parsed. * `on_method_complete`: Invoked after the HTTP method has been parsed. +* `on_protocol_complete`: Invoked after the HTTP version has been parsed. * `on_version_complete`: Invoked after the HTTP version has been parsed. * `on_status_complete`: Invoked after the status code has been parsed. * `on_header_field_complete`: Invoked after a header name has been parsed. @@ -130,6 +131,7 @@ The following callbacks can return `0` (proceed normally), `-1` (error) or `HPE_ * `on_method`: Invoked when another character of the method is received. When parser is created with `HTTP_BOTH` and the input is a response, this also invoked for the sequence `HTTP/` of the first message. +* `on_protocol`: Invoked when another character of the protocol is received. * `on_version`: Invoked when another character of the version is received. * `on_header_field`: Invoked when another character of a header name is received. * `on_header_value`: Invoked when another character of a header value is received. @@ -187,7 +189,8 @@ Parse full or partial request/response, invoking user callbacks along the way. If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing interrupts, and such errno is returned from `llhttp_execute()`. If `HPE_PAUSED` was used as a errno, -the execution can be resumed with `llhttp_resume()` call. +the execution can be resumed with `llhttp_resume()` call. In that case the input should be advanced +to the last processed byte from the parser, which can be obtained via `llhttp_get_error_pos()`. In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` is returned after fully parsing the request/response. If the user wishes to continue parsing, @@ -196,6 +199,8 @@ they need to invoke `llhttp_resume_after_upgrade()`. **if this function ever returns a non-pause type error, it will continue to return the same error upon each successive call up until `llhttp_init()` is called.** +If this function returns `HPE_OK`, it means all the input has been consumed and parsed. + ### `llhttp_errno_t llhttp_finish(llhttp_t* parser)` This method should be called when the other side has no further bytes to diff --git a/deps/llhttp/include/llhttp.h b/deps/llhttp/include/llhttp.h index 37b7934d2ee7bc..60544596a9942c 100644 --- a/deps/llhttp/include/llhttp.h +++ b/deps/llhttp/include/llhttp.h @@ -3,8 +3,8 @@ #define INCLUDE_LLHTTP_H_ #define LLHTTP_VERSION_MAJOR 9 -#define LLHTTP_VERSION_MINOR 2 -#define LLHTTP_VERSION_PATCH 1 +#define LLHTTP_VERSION_MINOR 3 +#define LLHTTP_VERSION_PATCH 0 #ifndef INCLUDE_LLHTTP_ITSELF_H_ #define INCLUDE_LLHTTP_ITSELF_H_ @@ -90,7 +90,8 @@ enum llhttp_errno { HPE_CB_HEADER_VALUE_COMPLETE = 29, HPE_CB_CHUNK_EXTENSION_NAME_COMPLETE = 34, HPE_CB_CHUNK_EXTENSION_VALUE_COMPLETE = 35, - HPE_CB_RESET = 31 + HPE_CB_RESET = 31, + HPE_CB_PROTOCOL_COMPLETE = 38 }; typedef enum llhttp_errno llhttp_errno_t; @@ -326,6 +327,7 @@ typedef enum llhttp_status llhttp_status_t; XX(34, CB_CHUNK_EXTENSION_NAME_COMPLETE, CB_CHUNK_EXTENSION_NAME_COMPLETE) \ XX(35, CB_CHUNK_EXTENSION_VALUE_COMPLETE, CB_CHUNK_EXTENSION_VALUE_COMPLETE) \ XX(31, CB_RESET, CB_RESET) \ + XX(38, CB_PROTOCOL_COMPLETE, CB_PROTOCOL_COMPLETE) \ #define HTTP_METHOD_MAP(XX) \ @@ -567,6 +569,7 @@ struct llhttp_settings_s { llhttp_cb on_message_begin; /* Possible return values 0, -1, HPE_USER */ + llhttp_data_cb on_protocol; llhttp_data_cb on_url; llhttp_data_cb on_status; llhttp_data_cb on_method; @@ -592,6 +595,7 @@ struct llhttp_settings_s { /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_complete; + llhttp_cb on_protocol_complete; llhttp_cb on_url_complete; llhttp_cb on_status_complete; llhttp_cb on_method_complete; diff --git a/deps/llhttp/libllhttp.pc.in b/deps/llhttp/libllhttp.pc.in index 67d280a830dcc9..4ad300b7409739 100644 --- a/deps/llhttp/libllhttp.pc.in +++ b/deps/llhttp/libllhttp.pc.in @@ -1,10 +1,10 @@ prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ -libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@ -includedir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@ +exec_prefix=@CMAKE_INSTALL_FULL_BINDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: libllhttp Description: Node.js llhttp Library Version: @PROJECT_VERSION@ Libs: -L${libdir} -lllhttp -Cflags: -I${includedir} \ No newline at end of file +Cflags: -I${includedir} diff --git a/deps/llhttp/src/api.c b/deps/llhttp/src/api.c index 8c2ce3dc5c455b..0245254177ac8c 100644 --- a/deps/llhttp/src/api.c +++ b/deps/llhttp/src/api.c @@ -57,29 +57,14 @@ static int wasm_on_headers_complete_wrap(llhttp_t* p) { } const llhttp_settings_t wasm_settings = { - wasm_on_message_begin, - wasm_on_url, - wasm_on_status, - NULL, - NULL, - wasm_on_header_field, - wasm_on_header_value, - NULL, - NULL, - wasm_on_headers_complete_wrap, - wasm_on_body, - wasm_on_message_complete, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + .on_message_begin = wasm_on_message_begin, + .on_url = wasm_on_url, + .on_status = wasm_on_status, + .on_header_field = wasm_on_header_field, + .on_header_value = wasm_on_header_value, + .on_headers_complete = wasm_on_headers_complete_wrap, + .on_body = wasm_on_body, + .on_message_complete = wasm_on_message_complete, }; @@ -341,6 +326,20 @@ int llhttp__on_message_begin(llhttp_t* s, const char* p, const char* endp) { } +int llhttp__on_protocol(llhttp_t* s, const char* p, const char* endp) { + int err; + SPAN_CALLBACK_MAYBE(s, on_protocol, p, endp - p); + return err; +} + + +int llhttp__on_protocol_complete(llhttp_t* s, const char* p, const char* endp) { + int err; + CALLBACK_MAYBE(s, on_protocol_complete); + return err; +} + + int llhttp__on_url(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_url, p, endp - p); diff --git a/deps/llhttp/src/llhttp.c b/deps/llhttp/src/llhttp.c index 3ef3b817f3d9ce..aa4c468209700c 100644 --- a/deps/llhttp/src/llhttp.c +++ b/deps/llhttp/src/llhttp.c @@ -10,10 +10,20 @@ #endif /* _MSC_VER */ #endif /* __SSE4_2__ */ +#ifdef __ARM_NEON__ + #include <arm_neon.h> +#endif /* __ARM_NEON__ */ + +#ifdef __wasm__ + #include <wasm_simd128.h> +#endif /* __wasm__ */ + #ifdef _MSC_VER #define ALIGN(n) _declspec(align(n)) + #define UNREACHABLE __assume(0) #else /* !_MSC_VER */ #define ALIGN(n) __attribute__((aligned(n))) + #define UNREACHABLE __builtin_unreachable() #endif /* _MSC_VER */ #include "llhttp.h" @@ -72,16 +82,16 @@ static const unsigned char llparse_blob12[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob13[] = { - 'T', 'T', 'P', '/' + 'T', 'T', 'P' }; static const unsigned char llparse_blob14[] = { 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa }; static const unsigned char llparse_blob15[] = { - 'C', 'E', '/' + 'C', 'E' }; static const unsigned char llparse_blob16[] = { - 'T', 'S', 'P', '/' + 'T', 'S', 'P' }; static const unsigned char llparse_blob17[] = { 'N', 'O', 'U', 'N', 'C', 'E' @@ -207,12 +217,18 @@ static const unsigned char llparse_blob57[] = { 'U', 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob58[] = { - 'H', 'T', 'T', 'P', '/' + 'T', 'T', 'P' }; static const unsigned char llparse_blob59[] = { - 'A', 'D' + 'C', 'E' }; static const unsigned char llparse_blob60[] = { + 'T', 'S', 'P' +}; +static const unsigned char llparse_blob61[] = { + 'A', 'D' +}; +static const unsigned char llparse_blob62[] = { 'T', 'P', '/' }; @@ -425,17 +441,27 @@ enum llparse_state_e { s_n_llhttp__internal__n_req_http_complete, s_n_llhttp__internal__n_invoke_load_method_1, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete, - s_n_llhttp__internal__n_error_66, - s_n_llhttp__internal__n_error_73, - s_n_llhttp__internal__n_req_http_minor, + s_n_llhttp__internal__n_error_67, s_n_llhttp__internal__n_error_74, - s_n_llhttp__internal__n_req_http_dot, + s_n_llhttp__internal__n_req_http_minor, s_n_llhttp__internal__n_error_75, + s_n_llhttp__internal__n_req_http_dot, + s_n_llhttp__internal__n_error_76, s_n_llhttp__internal__n_req_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version, - s_n_llhttp__internal__n_req_http_start_1, - s_n_llhttp__internal__n_req_http_start_2, - s_n_llhttp__internal__n_req_http_start_3, + s_n_llhttp__internal__n_req_after_protocol, + s_n_llhttp__internal__n_invoke_load_method, + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete, + s_n_llhttp__internal__n_error_82, + s_n_llhttp__internal__n_req_after_http_start_1, + s_n_llhttp__internal__n_invoke_load_method_2, + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_1, + s_n_llhttp__internal__n_req_after_http_start_2, + s_n_llhttp__internal__n_invoke_load_method_3, + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_2, + s_n_llhttp__internal__n_req_after_http_start_3, + s_n_llhttp__internal__n_req_after_http_start, + s_n_llhttp__internal__n_span_start_llhttp__on_protocol, s_n_llhttp__internal__n_req_http_start, s_n_llhttp__internal__n_url_to_http, s_n_llhttp__internal__n_url_skip_to_http, @@ -543,15 +569,22 @@ enum llparse_state_e { s_n_llhttp__internal__n_res_status_code_digit_1, s_n_llhttp__internal__n_res_after_version, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1, - s_n_llhttp__internal__n_error_89, - s_n_llhttp__internal__n_error_103, + s_n_llhttp__internal__n_error_93, + s_n_llhttp__internal__n_error_107, s_n_llhttp__internal__n_res_http_minor, - s_n_llhttp__internal__n_error_104, + s_n_llhttp__internal__n_error_108, s_n_llhttp__internal__n_res_http_dot, - s_n_llhttp__internal__n_error_105, + s_n_llhttp__internal__n_error_109, s_n_llhttp__internal__n_res_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version_1, - s_n_llhttp__internal__n_start_res, + s_n_llhttp__internal__n_res_after_protocol, + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_3, + s_n_llhttp__internal__n_error_115, + s_n_llhttp__internal__n_res_after_start_1, + s_n_llhttp__internal__n_res_after_start_2, + s_n_llhttp__internal__n_res_after_start_3, + s_n_llhttp__internal__n_res_after_start, + s_n_llhttp__internal__n_span_start_llhttp__on_protocol_1, s_n_llhttp__internal__n_invoke_llhttp__on_method_complete, s_n_llhttp__internal__n_req_or_res_method_2, s_n_llhttp__internal__n_invoke_update_type_1, @@ -574,6 +607,10 @@ int llhttp__on_url( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); +int llhttp__on_protocol( + llhttp__internal_t* s, const unsigned char* p, + const unsigned char* endp); + int llhttp__on_version( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); @@ -1057,6 +1094,10 @@ int llhttp__internal__c_or_flags_20( return 0; } +int llhttp__on_protocol_complete( + llhttp__internal_t* s, const unsigned char* p, + const unsigned char* endp); + int llhttp__internal__c_load_method( llhttp__internal_t* state, const unsigned char* p, @@ -1192,8 +1233,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: { @@ -1203,8 +1243,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_update_finish_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_pause_1: s_n_llhttp__internal__n_pause_1: { @@ -1213,8 +1252,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_is_equal_upgrade: s_n_llhttp__internal__n_invoke_is_equal_upgrade: { @@ -1224,8 +1262,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_pause_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: { @@ -1237,8 +1274,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_38; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_data_almost_done_1: s_n_llhttp__internal__n_chunk_data_almost_done_1: { @@ -1254,8 +1290,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { @@ -1275,8 +1310,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { @@ -1293,8 +1327,7 @@ static llparse_state_t llhttp__internal__run( state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_body: s_n_llhttp__internal__n_span_start_llhttp__on_body: { @@ -1304,8 +1337,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_is_equal_content_length: s_n_llhttp__internal__n_invoke_is_equal_content_length: { @@ -1315,8 +1347,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_or_flags; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_size_almost_done: s_n_llhttp__internal__n_chunk_size_almost_done: { @@ -1332,8 +1363,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_8; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_test_lenient_flags_9: s_n_llhttp__internal__n_invoke_test_lenient_flags_9: { @@ -1343,8 +1373,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_20; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: { @@ -1356,8 +1385,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_19; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: { @@ -1369,8 +1397,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_21; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: { @@ -1382,8 +1409,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_22; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_test_lenient_flags_10: s_n_llhttp__internal__n_invoke_test_lenient_flags_10: { @@ -1393,8 +1419,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_25; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: { @@ -1406,8 +1431,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_24; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: { @@ -1419,8 +1443,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_26; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extension_quoted_value_done: s_n_llhttp__internal__n_chunk_extension_quoted_value_done: { @@ -1443,8 +1466,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_29; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: { @@ -1456,8 +1478,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_27; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_30: s_n_llhttp__internal__n_error_30: { @@ -1466,8 +1487,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: { @@ -1501,8 +1521,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_31: s_n_llhttp__internal__n_error_31: { @@ -1511,8 +1530,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extension_quoted_value: s_n_llhttp__internal__n_chunk_extension_quoted_value: { @@ -1554,8 +1572,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: { @@ -1567,8 +1584,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_32; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_33: s_n_llhttp__internal__n_error_33: { @@ -1577,8 +1593,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extension_value: s_n_llhttp__internal__n_chunk_extension_value: { @@ -1625,8 +1640,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: { @@ -1636,8 +1650,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_chunk_extension_value; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_34: s_n_llhttp__internal__n_error_34: { @@ -1646,8 +1659,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extension_name: s_n_llhttp__internal__n_chunk_extension_name: { @@ -1693,8 +1705,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: { @@ -1704,8 +1715,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_chunk_extension_name; goto s_n_llhttp__internal__n_chunk_extension_name; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_extensions: s_n_llhttp__internal__n_chunk_extensions: { @@ -1725,8 +1735,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_size_otherwise: s_n_llhttp__internal__n_chunk_size_otherwise: { @@ -1758,8 +1767,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_35; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_size: s_n_llhttp__internal__n_chunk_size: { @@ -1881,8 +1889,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_chunk_size_otherwise; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_chunk_size_digit: s_n_llhttp__internal__n_chunk_size_digit: { @@ -2004,8 +2011,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_37; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_update_content_length_1: s_n_llhttp__internal__n_invoke_update_content_length_1: { @@ -2013,8 +2019,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_chunk_size_digit; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { @@ -2031,8 +2036,7 @@ static llparse_state_t llhttp__internal__run( state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_body_1: s_n_llhttp__internal__n_span_start_llhttp__on_body_1: { @@ -2042,8 +2046,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_eof: s_n_llhttp__internal__n_eof: { @@ -2052,8 +2055,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_eof; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_body_2: s_n_llhttp__internal__n_span_start_llhttp__on_body_2: { @@ -2063,8 +2065,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_eof; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: { @@ -2082,8 +2083,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_5: s_n_llhttp__internal__n_error_5: { @@ -2092,8 +2092,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_headers_almost_done: s_n_llhttp__internal__n_headers_almost_done: { @@ -2109,8 +2108,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_12; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_colon_discard_ws: s_n_llhttp__internal__n_header_field_colon_discard_ws: { @@ -2126,8 +2124,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_field_colon; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { @@ -2139,8 +2136,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_48; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value: s_n_llhttp__internal__n_span_start_llhttp__on_header_value: { @@ -2150,8 +2146,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_discard_lws: s_n_llhttp__internal__n_header_value_discard_lws: { @@ -2171,8 +2166,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_load_header_state_1; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_discard_ws_almost_done: s_n_llhttp__internal__n_header_value_discard_ws_almost_done: { @@ -2188,8 +2182,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_16; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_lws: s_n_llhttp__internal__n_header_value_lws: { @@ -2207,8 +2200,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_load_header_state_5; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_almost_done: s_n_llhttp__internal__n_header_value_almost_done: { @@ -2224,8 +2216,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_53; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_test_lenient_flags_17: s_n_llhttp__internal__n_invoke_test_lenient_flags_17: { @@ -2235,8 +2226,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_51; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_lenient: s_n_llhttp__internal__n_header_value_lenient: { @@ -2255,8 +2245,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_lenient; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_54: s_n_llhttp__internal__n_error_54: { @@ -2265,8 +2254,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_otherwise: s_n_llhttp__internal__n_header_value_otherwise: { @@ -2284,8 +2272,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_19; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection_token: s_n_llhttp__internal__n_header_value_connection_token: { @@ -2323,8 +2310,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_otherwise; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection_ws: s_n_llhttp__internal__n_header_value_connection_ws: { @@ -2350,8 +2336,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_5; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { @@ -2374,8 +2359,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_connection_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { @@ -2398,8 +2382,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_connection_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { @@ -2422,8 +2405,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_connection_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_connection: s_n_llhttp__internal__n_header_value_connection: { @@ -2455,8 +2437,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_connection_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_56: s_n_llhttp__internal__n_error_56: { @@ -2465,8 +2446,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_57: s_n_llhttp__internal__n_error_57: { @@ -2475,8 +2455,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_content_length_ws: s_n_llhttp__internal__n_header_value_content_length_ws: { @@ -2498,8 +2477,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_content_length: s_n_llhttp__internal__n_header_value_content_length: { @@ -2561,8 +2539,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_content_length_ws; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_59: s_n_llhttp__internal__n_error_59: { @@ -2571,8 +2548,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_error_58: s_n_llhttp__internal__n_error_58: { @@ -2581,8 +2557,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_te_token_ows: s_n_llhttp__internal__n_header_value_te_token_ows: { @@ -2602,8 +2577,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_te_chunked; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value: s_n_llhttp__internal__n_header_value: { @@ -2632,7 +2606,6 @@ static llparse_state_t llhttp__internal__run( if (endp - p >= 16) { __m128i ranges; __m128i input; - int avail; int match_len; /* Load input */ @@ -2652,6 +2625,78 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_otherwise; } #endif /* __SSE4_2__ */ + #ifdef __ARM_NEON__ + while (endp - p >= 16) { + uint8x16_t input; + uint8x16_t single; + uint8x16_t mask; + uint8x8_t narrow; + uint64_t match_mask; + int match_len; + + /* Load input */ + input = vld1q_u8(p); + /* Find first character that does not match `ranges` */ + single = vceqq_u8(input, vdupq_n_u8(0x9)); + mask = single; + single = vandq_u16( + vcgeq_u8(input, vdupq_n_u8(' ')), + vcleq_u8(input, vdupq_n_u8('~')) + ); + mask = vorrq_u16(mask, single); + single = vandq_u16( + vcgeq_u8(input, vdupq_n_u8(0x80)), + vcleq_u8(input, vdupq_n_u8(0xff)) + ); + mask = vorrq_u16(mask, single); + narrow = vshrn_n_u16(mask, 4); + match_mask = ~vget_lane_u64(vreinterpret_u64_u8(narrow), 0); + match_len = __builtin_ctzll(match_mask) >> 2; + if (match_len != 16) { + p += match_len; + goto s_n_llhttp__internal__n_header_value_otherwise; + } + p += 16; + } + if (p == endp) { + return s_n_llhttp__internal__n_header_value; + } + #endif /* __ARM_NEON__ */ + #ifdef __wasm_simd128__ + while (endp - p >= 16) { + v128_t input; + v128_t mask; + v128_t single; + int match_len; + + /* Load input */ + input = wasm_v128_load(p); + /* Find first character that does not match `ranges` */ + single = wasm_i8x16_eq(input, wasm_u8x16_const_splat(0x9)); + mask = single; + single = wasm_v128_and( + wasm_i8x16_ge(input, wasm_u8x16_const_splat(' ')), + wasm_i8x16_le(input, wasm_u8x16_const_splat('~')) + ); + mask = wasm_v128_or(mask, single); + single = wasm_v128_and( + wasm_i8x16_ge(input, wasm_u8x16_const_splat(0x80)), + wasm_i8x16_le(input, wasm_u8x16_const_splat(0xff)) + ); + mask = wasm_v128_or(mask, single); + match_len = __builtin_ctz( + ~wasm_i8x16_bitmask(mask) + ); + if (match_len != 16) { + p += match_len; + goto s_n_llhttp__internal__n_header_value_otherwise; + } + p += 16; + } + if (p == endp) { + return s_n_llhttp__internal__n_header_value; + } + #endif /* __wasm_simd128__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; @@ -2661,8 +2706,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_otherwise; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_te_token: s_n_llhttp__internal__n_header_value_te_token: { @@ -2700,8 +2744,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_9; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_te_chunked_last: s_n_llhttp__internal__n_header_value_te_chunked_last: { @@ -2726,8 +2769,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_te_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { @@ -2750,8 +2792,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_te_token; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: { @@ -2761,8 +2802,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_invoke_load_header_state_3; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_value_discard_ws: s_n_llhttp__internal__n_header_value_discard_ws: { @@ -2790,8 +2830,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_load_header_state: s_n_llhttp__internal__n_invoke_load_header_state: { @@ -2803,8 +2842,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_discard_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { @@ -2816,8 +2854,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_45; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_general_otherwise: s_n_llhttp__internal__n_header_field_general_otherwise: { @@ -2832,8 +2869,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_62; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_general: s_n_llhttp__internal__n_header_field_general: { @@ -2862,7 +2898,6 @@ static llparse_state_t llhttp__internal__run( if (endp - p >= 16) { __m128i ranges; __m128i input; - int avail; int match_len; /* Load input */ @@ -2903,8 +2938,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_field_general_otherwise; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_colon: s_n_llhttp__internal__n_header_field_colon: { @@ -2922,8 +2956,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { @@ -2947,8 +2980,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { @@ -2972,8 +3004,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_2: s_n_llhttp__internal__n_header_field_2: { @@ -2993,8 +3024,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { @@ -3017,8 +3047,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { @@ -3042,8 +3071,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { @@ -3067,8 +3095,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { @@ -3092,8 +3119,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field: s_n_llhttp__internal__n_header_field: { @@ -3121,8 +3147,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_header_state_11; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_header_field: s_n_llhttp__internal__n_span_start_llhttp__on_header_field: { @@ -3132,8 +3157,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_field; goto s_n_llhttp__internal__n_header_field; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_header_field_start: s_n_llhttp__internal__n_header_field_start: { @@ -3156,8 +3180,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_headers_start: s_n_llhttp__internal__n_headers_start: { @@ -3173,8 +3196,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_field_start; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_to_http_09: s_n_llhttp__internal__n_url_to_http_09: { @@ -3194,8 +3216,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_http_major; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_skip_to_http09: s_n_llhttp__internal__n_url_skip_to_http09: { @@ -3216,8 +3237,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_to_http_09; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_skip_lf_to_http09_1: s_n_llhttp__internal__n_url_skip_lf_to_http09_1: { @@ -3233,8 +3253,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_63; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_skip_lf_to_http09: s_n_llhttp__internal__n_url_skip_lf_to_http09: { @@ -3258,8 +3277,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_63; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { @@ -3273,17 +3291,16 @@ static llparse_state_t llhttp__internal__run( switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_error_71; + goto s_n_llhttp__internal__n_error_72; } case kMatchPause: { return s_n_llhttp__internal__n_req_pri_upgrade; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_72; + goto s_n_llhttp__internal__n_error_73; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_http_complete_crlf: s_n_llhttp__internal__n_req_http_complete_crlf: { @@ -3299,8 +3316,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_26; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_http_complete: s_n_llhttp__internal__n_req_http_complete: { @@ -3317,11 +3333,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_http_complete_crlf; } default: { - goto s_n_llhttp__internal__n_error_70; + goto s_n_llhttp__internal__n_error_71; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_load_method_1: s_n_llhttp__internal__n_invoke_load_method_1: { @@ -3331,8 +3346,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_req_http_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: { @@ -3342,30 +3356,27 @@ static llparse_state_t llhttp__internal__run( case 21: goto s_n_llhttp__internal__n_pause_21; default: - goto s_n_llhttp__internal__n_error_67; + goto s_n_llhttp__internal__n_error_68; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_66: - s_n_llhttp__internal__n_error_66: { + case s_n_llhttp__internal__n_error_67: + s_n_llhttp__internal__n_error_67: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_73: - s_n_llhttp__internal__n_error_73: { + case s_n_llhttp__internal__n_error_74: + s_n_llhttp__internal__n_error_74: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_http_minor: s_n_llhttp__internal__n_req_http_minor: { @@ -3427,18 +3438,16 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_2; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_74: - s_n_llhttp__internal__n_error_74: { + case s_n_llhttp__internal__n_error_75: + s_n_llhttp__internal__n_error_75: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_http_dot: s_n_llhttp__internal__n_req_http_dot: { @@ -3454,18 +3463,16 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_75: - s_n_llhttp__internal__n_error_75: { + case s_n_llhttp__internal__n_error_76: + s_n_llhttp__internal__n_error_76: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_http_major: s_n_llhttp__internal__n_req_http_major: { @@ -3527,8 +3534,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_4; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_version: s_n_llhttp__internal__n_span_start_llhttp__on_version: { @@ -3538,109 +3544,313 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_version; goto s_n_llhttp__internal__n_req_http_major; - /* UNREACHABLE */; - abort(); + UNREACHABLE; + } + case s_n_llhttp__internal__n_req_after_protocol: + s_n_llhttp__internal__n_req_after_protocol: { + if (p == endp) { + return s_n_llhttp__internal__n_req_after_protocol; + } + switch (*p) { + case '/': { + p++; + goto s_n_llhttp__internal__n_span_start_llhttp__on_version; + } + default: { + goto s_n_llhttp__internal__n_error_77; + } + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_invoke_load_method: + s_n_llhttp__internal__n_invoke_load_method: { + switch (llhttp__internal__c_load_method(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_req_after_protocol; + case 1: + goto s_n_llhttp__internal__n_req_after_protocol; + case 2: + goto s_n_llhttp__internal__n_req_after_protocol; + case 3: + goto s_n_llhttp__internal__n_req_after_protocol; + case 4: + goto s_n_llhttp__internal__n_req_after_protocol; + case 5: + goto s_n_llhttp__internal__n_req_after_protocol; + case 6: + goto s_n_llhttp__internal__n_req_after_protocol; + case 7: + goto s_n_llhttp__internal__n_req_after_protocol; + case 8: + goto s_n_llhttp__internal__n_req_after_protocol; + case 9: + goto s_n_llhttp__internal__n_req_after_protocol; + case 10: + goto s_n_llhttp__internal__n_req_after_protocol; + case 11: + goto s_n_llhttp__internal__n_req_after_protocol; + case 12: + goto s_n_llhttp__internal__n_req_after_protocol; + case 13: + goto s_n_llhttp__internal__n_req_after_protocol; + case 14: + goto s_n_llhttp__internal__n_req_after_protocol; + case 15: + goto s_n_llhttp__internal__n_req_after_protocol; + case 16: + goto s_n_llhttp__internal__n_req_after_protocol; + case 17: + goto s_n_llhttp__internal__n_req_after_protocol; + case 18: + goto s_n_llhttp__internal__n_req_after_protocol; + case 19: + goto s_n_llhttp__internal__n_req_after_protocol; + case 20: + goto s_n_llhttp__internal__n_req_after_protocol; + case 21: + goto s_n_llhttp__internal__n_req_after_protocol; + case 22: + goto s_n_llhttp__internal__n_req_after_protocol; + case 23: + goto s_n_llhttp__internal__n_req_after_protocol; + case 24: + goto s_n_llhttp__internal__n_req_after_protocol; + case 25: + goto s_n_llhttp__internal__n_req_after_protocol; + case 26: + goto s_n_llhttp__internal__n_req_after_protocol; + case 27: + goto s_n_llhttp__internal__n_req_after_protocol; + case 28: + goto s_n_llhttp__internal__n_req_after_protocol; + case 29: + goto s_n_llhttp__internal__n_req_after_protocol; + case 30: + goto s_n_llhttp__internal__n_req_after_protocol; + case 31: + goto s_n_llhttp__internal__n_req_after_protocol; + case 32: + goto s_n_llhttp__internal__n_req_after_protocol; + case 33: + goto s_n_llhttp__internal__n_req_after_protocol; + case 34: + goto s_n_llhttp__internal__n_req_after_protocol; + case 46: + goto s_n_llhttp__internal__n_req_after_protocol; + default: + goto s_n_llhttp__internal__n_error_66; + } + UNREACHABLE; } - case s_n_llhttp__internal__n_req_http_start_1: - s_n_llhttp__internal__n_req_http_start_1: { + case s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete: + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete: { + switch (llhttp__on_protocol_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_invoke_load_method; + case 21: + goto s_n_llhttp__internal__n_pause_22; + default: + goto s_n_llhttp__internal__n_error_65; + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_error_82: + s_n_llhttp__internal__n_error_82: { + state->error = 0x8; + state->reason = "Expected HTTP/, RTSP/ or ICE/"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + case s_n_llhttp__internal__n_req_after_http_start_1: + s_n_llhttp__internal__n_req_after_http_start_1: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_1; + return s_n_llhttp__internal__n_req_after_http_start_1; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob13, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob13, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_invoke_load_method; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol; } case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_1; + return s_n_llhttp__internal__n_req_after_http_start_1; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_78; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_req_http_start_2: - s_n_llhttp__internal__n_req_http_start_2: { + case s_n_llhttp__internal__n_invoke_load_method_2: + s_n_llhttp__internal__n_invoke_load_method_2: { + switch (llhttp__internal__c_load_method(state, p, endp)) { + case 33: + goto s_n_llhttp__internal__n_req_after_protocol; + default: + goto s_n_llhttp__internal__n_error_79; + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_1: + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_1: { + switch (llhttp__on_protocol_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_invoke_load_method_2; + case 21: + goto s_n_llhttp__internal__n_pause_23; + default: + goto s_n_llhttp__internal__n_error_78; + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_req_after_http_start_2: + s_n_llhttp__internal__n_req_after_http_start_2: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_2; + return s_n_llhttp__internal__n_req_after_http_start_2; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_invoke_load_method_2; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_1; } case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_2; + return s_n_llhttp__internal__n_req_after_http_start_2; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_78; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; + } + case s_n_llhttp__internal__n_invoke_load_method_3: + s_n_llhttp__internal__n_invoke_load_method_3: { + switch (llhttp__internal__c_load_method(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_req_after_protocol; + case 3: + goto s_n_llhttp__internal__n_req_after_protocol; + case 6: + goto s_n_llhttp__internal__n_req_after_protocol; + case 35: + goto s_n_llhttp__internal__n_req_after_protocol; + case 36: + goto s_n_llhttp__internal__n_req_after_protocol; + case 37: + goto s_n_llhttp__internal__n_req_after_protocol; + case 38: + goto s_n_llhttp__internal__n_req_after_protocol; + case 39: + goto s_n_llhttp__internal__n_req_after_protocol; + case 40: + goto s_n_llhttp__internal__n_req_after_protocol; + case 41: + goto s_n_llhttp__internal__n_req_after_protocol; + case 42: + goto s_n_llhttp__internal__n_req_after_protocol; + case 43: + goto s_n_llhttp__internal__n_req_after_protocol; + case 44: + goto s_n_llhttp__internal__n_req_after_protocol; + case 45: + goto s_n_llhttp__internal__n_req_after_protocol; + default: + goto s_n_llhttp__internal__n_error_81; + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_2: + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_2: { + switch (llhttp__on_protocol_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_invoke_load_method_3; + case 21: + goto s_n_llhttp__internal__n_pause_24; + default: + goto s_n_llhttp__internal__n_error_80; + } + UNREACHABLE; } - case s_n_llhttp__internal__n_req_http_start_3: - s_n_llhttp__internal__n_req_http_start_3: { + case s_n_llhttp__internal__n_req_after_http_start_3: + s_n_llhttp__internal__n_req_after_http_start_3: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_3; + return s_n_llhttp__internal__n_req_after_http_start_3; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_invoke_load_method_3; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_2; } case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_3; + return s_n_llhttp__internal__n_req_after_http_start_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_78; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_req_http_start: - s_n_llhttp__internal__n_req_http_start: { + case s_n_llhttp__internal__n_req_after_http_start: + s_n_llhttp__internal__n_req_after_http_start: { if (p == endp) { - return s_n_llhttp__internal__n_req_http_start; + return s_n_llhttp__internal__n_req_after_http_start; } switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_req_http_start; - } case 'H': { p++; - goto s_n_llhttp__internal__n_req_http_start_1; + goto s_n_llhttp__internal__n_req_after_http_start_1; } case 'I': { p++; - goto s_n_llhttp__internal__n_req_http_start_2; + goto s_n_llhttp__internal__n_req_after_http_start_2; } case 'R': { p++; - goto s_n_llhttp__internal__n_req_http_start_3; + goto s_n_llhttp__internal__n_req_after_http_start_3; } default: { - goto s_n_llhttp__internal__n_error_78; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_3; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; + } + case s_n_llhttp__internal__n_span_start_llhttp__on_protocol: + s_n_llhttp__internal__n_span_start_llhttp__on_protocol: { + if (p == endp) { + return s_n_llhttp__internal__n_span_start_llhttp__on_protocol; + } + state->_span_pos0 = (void*) p; + state->_span_cb0 = llhttp__on_protocol; + goto s_n_llhttp__internal__n_req_after_http_start; + UNREACHABLE; + } + case s_n_llhttp__internal__n_req_http_start: + s_n_llhttp__internal__n_req_http_start: { + if (p == endp) { + return s_n_llhttp__internal__n_req_http_start; + } + switch (*p) { + case ' ': { + p++; + goto s_n_llhttp__internal__n_req_http_start; + } + default: { + goto s_n_llhttp__internal__n_span_start_llhttp__on_protocol; + } + } + UNREACHABLE; } case s_n_llhttp__internal__n_url_to_http: s_n_llhttp__internal__n_url_to_http: { @@ -3660,8 +3870,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_skip_to_http: s_n_llhttp__internal__n_url_skip_to_http: { @@ -3682,8 +3891,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_to_http; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_fragment: s_n_llhttp__internal__n_url_fragment: { @@ -3727,11 +3935,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_fragment; } default: { - goto s_n_llhttp__internal__n_error_79; + goto s_n_llhttp__internal__n_error_83; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_end_stub_query_3: s_n_llhttp__internal__n_span_end_stub_query_3: { @@ -3740,8 +3947,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_url_fragment; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_query: s_n_llhttp__internal__n_url_query: { @@ -3788,11 +3994,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_stub_query_3; } default: { - goto s_n_llhttp__internal__n_error_80; + goto s_n_llhttp__internal__n_error_84; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_query_or_fragment: s_n_llhttp__internal__n_url_query_or_fragment: { @@ -3826,11 +4031,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_query; } default: { - goto s_n_llhttp__internal__n_error_81; + goto s_n_llhttp__internal__n_error_85; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_path: s_n_llhttp__internal__n_url_path: { @@ -3868,8 +4072,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_query_or_fragment; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_stub_path_2: s_n_llhttp__internal__n_span_start_stub_path_2: { @@ -3878,8 +4081,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_stub_path: s_n_llhttp__internal__n_span_start_stub_path: { @@ -3888,8 +4090,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_stub_path_1: s_n_llhttp__internal__n_span_start_stub_path_1: { @@ -3898,8 +4099,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_server_with_at: s_n_llhttp__internal__n_url_server_with_at: { @@ -3951,14 +4151,13 @@ static llparse_state_t llhttp__internal__run( } case 8: { p++; - goto s_n_llhttp__internal__n_error_82; + goto s_n_llhttp__internal__n_error_86; } default: { - goto s_n_llhttp__internal__n_error_83; + goto s_n_llhttp__internal__n_error_87; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_server: s_n_llhttp__internal__n_url_server: { @@ -4013,11 +4212,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_server_with_at; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_88; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_schema_delim_1: s_n_llhttp__internal__n_url_schema_delim_1: { @@ -4030,11 +4228,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_server; } default: { - goto s_n_llhttp__internal__n_error_85; + goto s_n_llhttp__internal__n_error_89; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_schema_delim: s_n_llhttp__internal__n_url_schema_delim: { @@ -4067,11 +4264,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_schema_delim_1; } default: { - goto s_n_llhttp__internal__n_error_85; + goto s_n_llhttp__internal__n_error_89; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_end_stub_schema: s_n_llhttp__internal__n_span_end_stub_schema: { @@ -4080,8 +4276,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_url_schema_delim; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_schema: s_n_llhttp__internal__n_url_schema: { @@ -4119,11 +4314,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_schema; } default: { - goto s_n_llhttp__internal__n_error_86; + goto s_n_llhttp__internal__n_error_90; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_start: s_n_llhttp__internal__n_url_start: { @@ -4160,11 +4354,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_schema; } default: { - goto s_n_llhttp__internal__n_error_87; + goto s_n_llhttp__internal__n_error_91; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_url_1: s_n_llhttp__internal__n_span_start_llhttp__on_url_1: { @@ -4174,8 +4367,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_start; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_entry_normal: s_n_llhttp__internal__n_url_entry_normal: { @@ -4195,8 +4387,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_url: s_n_llhttp__internal__n_span_start_llhttp__on_url: { @@ -4206,8 +4397,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_server; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_url_entry_connect: s_n_llhttp__internal__n_url_entry_connect: { @@ -4227,8 +4417,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_url; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_spaces_before_url: s_n_llhttp__internal__n_req_spaces_before_url: { @@ -4244,8 +4433,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_is_equal_method; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_first_space_before_url: s_n_llhttp__internal__n_req_first_space_before_url: { @@ -4258,11 +4446,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { - goto s_n_llhttp__internal__n_error_88; + goto s_n_llhttp__internal__n_error_92; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: { @@ -4270,12 +4457,11 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: - goto s_n_llhttp__internal__n_pause_26; + goto s_n_llhttp__internal__n_pause_29; default: - goto s_n_llhttp__internal__n_error_107; + goto s_n_llhttp__internal__n_error_111; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_2: s_n_llhttp__internal__n_after_start_req_2: { @@ -4289,11 +4475,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_3: s_n_llhttp__internal__n_after_start_req_3: { @@ -4314,11 +4499,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_1: s_n_llhttp__internal__n_after_start_req_1: { @@ -4335,11 +4519,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_3; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_4: s_n_llhttp__internal__n_after_start_req_4: { @@ -4360,11 +4543,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_4; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_6: s_n_llhttp__internal__n_after_start_req_6: { @@ -4385,11 +4567,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_6; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_8: s_n_llhttp__internal__n_after_start_req_8: { @@ -4410,11 +4591,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_8; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_9: s_n_llhttp__internal__n_after_start_req_9: { @@ -4428,11 +4608,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_7: s_n_llhttp__internal__n_after_start_req_7: { @@ -4449,11 +4628,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_9; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_5: s_n_llhttp__internal__n_after_start_req_5: { @@ -4470,11 +4648,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_7; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_12: s_n_llhttp__internal__n_after_start_req_12: { @@ -4495,11 +4672,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_12; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_13: s_n_llhttp__internal__n_after_start_req_13: { @@ -4520,11 +4696,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_13; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_11: s_n_llhttp__internal__n_after_start_req_11: { @@ -4541,11 +4716,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_13; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_10: s_n_llhttp__internal__n_after_start_req_10: { @@ -4558,11 +4732,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_11; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_14: s_n_llhttp__internal__n_after_start_req_14: { @@ -4583,11 +4756,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_14; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_17: s_n_llhttp__internal__n_after_start_req_17: { @@ -4608,11 +4780,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_17; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_16: s_n_llhttp__internal__n_after_start_req_16: { @@ -4629,8 +4800,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_15: s_n_llhttp__internal__n_after_start_req_15: { @@ -4650,11 +4820,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_15; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_18: s_n_llhttp__internal__n_after_start_req_18: { @@ -4675,11 +4844,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_18; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_20: s_n_llhttp__internal__n_after_start_req_20: { @@ -4700,11 +4868,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_20; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_21: s_n_llhttp__internal__n_after_start_req_21: { @@ -4725,11 +4892,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_21; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_19: s_n_llhttp__internal__n_after_start_req_19: { @@ -4746,11 +4912,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_21; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_23: s_n_llhttp__internal__n_after_start_req_23: { @@ -4771,11 +4936,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_23; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_24: s_n_llhttp__internal__n_after_start_req_24: { @@ -4796,11 +4960,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_24; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_26: s_n_llhttp__internal__n_after_start_req_26: { @@ -4821,11 +4984,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_26; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_28: s_n_llhttp__internal__n_after_start_req_28: { @@ -4846,11 +5008,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_28; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_29: s_n_llhttp__internal__n_after_start_req_29: { @@ -4864,11 +5025,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_27: s_n_llhttp__internal__n_after_start_req_27: { @@ -4885,11 +5045,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_29; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_25: s_n_llhttp__internal__n_after_start_req_25: { @@ -4906,11 +5065,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_27; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_30: s_n_llhttp__internal__n_after_start_req_30: { @@ -4931,11 +5089,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_30; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_22: s_n_llhttp__internal__n_after_start_req_22: { @@ -4960,11 +5117,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_30; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_31: s_n_llhttp__internal__n_after_start_req_31: { @@ -4985,11 +5141,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_31; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_32: s_n_llhttp__internal__n_after_start_req_32: { @@ -5010,11 +5165,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_32; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_35: s_n_llhttp__internal__n_after_start_req_35: { @@ -5035,11 +5189,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_35; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_36: s_n_llhttp__internal__n_after_start_req_36: { @@ -5060,11 +5213,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_36; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_34: s_n_llhttp__internal__n_after_start_req_34: { @@ -5081,11 +5233,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_36; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_37: s_n_llhttp__internal__n_after_start_req_37: { @@ -5106,11 +5257,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_37; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_38: s_n_llhttp__internal__n_after_start_req_38: { @@ -5131,11 +5281,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_38; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_42: s_n_llhttp__internal__n_after_start_req_42: { @@ -5156,11 +5305,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_42; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_43: s_n_llhttp__internal__n_after_start_req_43: { @@ -5181,11 +5329,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_43; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_41: s_n_llhttp__internal__n_after_start_req_41: { @@ -5202,11 +5349,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_43; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_40: s_n_llhttp__internal__n_after_start_req_40: { @@ -5219,11 +5365,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_41; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_39: s_n_llhttp__internal__n_after_start_req_39: { @@ -5241,11 +5386,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_40; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_45: s_n_llhttp__internal__n_after_start_req_45: { @@ -5266,11 +5410,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_45; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_44: s_n_llhttp__internal__n_after_start_req_44: { @@ -5288,11 +5431,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_33: s_n_llhttp__internal__n_after_start_req_33: { @@ -5321,11 +5463,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_44; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_46: s_n_llhttp__internal__n_after_start_req_46: { @@ -5346,11 +5487,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_46; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_49: s_n_llhttp__internal__n_after_start_req_49: { @@ -5371,11 +5511,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_49; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_50: s_n_llhttp__internal__n_after_start_req_50: { @@ -5396,11 +5535,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_50; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_51: s_n_llhttp__internal__n_after_start_req_51: { @@ -5421,11 +5559,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_51; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_52: s_n_llhttp__internal__n_after_start_req_52: { @@ -5446,11 +5583,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_52; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_48: s_n_llhttp__internal__n_after_start_req_48: { @@ -5475,11 +5611,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_52; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_47: s_n_llhttp__internal__n_after_start_req_47: { @@ -5492,11 +5627,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_48; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_55: s_n_llhttp__internal__n_after_start_req_55: { @@ -5517,11 +5651,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_55; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_57: s_n_llhttp__internal__n_after_start_req_57: { @@ -5535,11 +5668,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_58: s_n_llhttp__internal__n_after_start_req_58: { @@ -5560,11 +5692,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_58; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_56: s_n_llhttp__internal__n_after_start_req_56: { @@ -5581,11 +5712,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_58; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_54: s_n_llhttp__internal__n_after_start_req_54: { @@ -5602,11 +5732,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_56; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_59: s_n_llhttp__internal__n_after_start_req_59: { @@ -5627,11 +5756,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_59; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_60: s_n_llhttp__internal__n_after_start_req_60: { @@ -5652,11 +5780,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_60; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_53: s_n_llhttp__internal__n_after_start_req_53: { @@ -5677,11 +5804,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_60; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_62: s_n_llhttp__internal__n_after_start_req_62: { @@ -5702,11 +5828,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_62; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_63: s_n_llhttp__internal__n_after_start_req_63: { @@ -5727,11 +5852,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_63; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_61: s_n_llhttp__internal__n_after_start_req_61: { @@ -5748,11 +5872,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_63; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_66: s_n_llhttp__internal__n_after_start_req_66: { @@ -5773,11 +5896,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_66; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_68: s_n_llhttp__internal__n_after_start_req_68: { @@ -5798,11 +5920,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_68; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_69: s_n_llhttp__internal__n_after_start_req_69: { @@ -5823,11 +5944,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_69; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_67: s_n_llhttp__internal__n_after_start_req_67: { @@ -5844,11 +5964,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_69; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_70: s_n_llhttp__internal__n_after_start_req_70: { @@ -5869,11 +5988,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_70; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_65: s_n_llhttp__internal__n_after_start_req_65: { @@ -5894,11 +6012,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_70; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req_64: s_n_llhttp__internal__n_after_start_req_64: { @@ -5911,11 +6028,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_65; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_after_start_req: s_n_llhttp__internal__n_after_start_req: { @@ -5992,11 +6108,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_64; } default: { - goto s_n_llhttp__internal__n_error_108; + goto s_n_llhttp__internal__n_error_112; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_method_1: s_n_llhttp__internal__n_span_start_llhttp__on_method_1: { @@ -6006,8 +6121,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_method; goto s_n_llhttp__internal__n_after_start_req; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_line_almost_done: s_n_llhttp__internal__n_res_line_almost_done: { @@ -6027,8 +6141,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_test_lenient_flags_29; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_test_lenient_flags_30: s_n_llhttp__internal__n_invoke_test_lenient_flags_30: { @@ -6036,10 +6149,9 @@ static llparse_state_t llhttp__internal__run( case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: - goto s_n_llhttp__internal__n_error_94; + goto s_n_llhttp__internal__n_error_98; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_status: s_n_llhttp__internal__n_res_status: { @@ -6058,8 +6170,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_res_status; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_status: s_n_llhttp__internal__n_span_start_llhttp__on_status: { @@ -6069,8 +6180,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_status; goto s_n_llhttp__internal__n_res_status; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_status_code_otherwise: s_n_llhttp__internal__n_res_status_code_otherwise: { @@ -6091,11 +6201,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_status; } default: { - goto s_n_llhttp__internal__n_error_95; + goto s_n_llhttp__internal__n_error_99; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_status_code_digit_3: s_n_llhttp__internal__n_res_status_code_digit_3: { @@ -6154,11 +6263,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } default: { - goto s_n_llhttp__internal__n_error_97; + goto s_n_llhttp__internal__n_error_101; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_status_code_digit_2: s_n_llhttp__internal__n_res_status_code_digit_2: { @@ -6217,11 +6325,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; } default: { - goto s_n_llhttp__internal__n_error_99; + goto s_n_llhttp__internal__n_error_103; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_status_code_digit_1: s_n_llhttp__internal__n_res_status_code_digit_1: { @@ -6280,11 +6387,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } default: { - goto s_n_llhttp__internal__n_error_101; + goto s_n_llhttp__internal__n_error_105; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_after_version: s_n_llhttp__internal__n_res_after_version: { @@ -6297,11 +6403,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_status_code; } default: { - goto s_n_llhttp__internal__n_error_102; + goto s_n_llhttp__internal__n_error_106; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: { @@ -6309,32 +6414,29 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_res_after_version; case 21: - goto s_n_llhttp__internal__n_pause_25; + goto s_n_llhttp__internal__n_pause_28; default: - goto s_n_llhttp__internal__n_error_90; + goto s_n_llhttp__internal__n_error_94; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_89: - s_n_llhttp__internal__n_error_89: { + case s_n_llhttp__internal__n_error_93: + s_n_llhttp__internal__n_error_93: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_103: - s_n_llhttp__internal__n_error_103: { + case s_n_llhttp__internal__n_error_107: + s_n_llhttp__internal__n_error_107: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_http_minor: s_n_llhttp__internal__n_res_http_minor: { @@ -6396,18 +6498,16 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_7; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_104: - s_n_llhttp__internal__n_error_104: { + case s_n_llhttp__internal__n_error_108: + s_n_llhttp__internal__n_error_108: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_http_dot: s_n_llhttp__internal__n_res_http_dot: { @@ -6423,18 +6523,16 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_8; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_error_105: - s_n_llhttp__internal__n_error_105: { + case s_n_llhttp__internal__n_error_109: + s_n_llhttp__internal__n_error_109: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_res_http_major: s_n_llhttp__internal__n_res_http_major: { @@ -6496,8 +6594,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_version_9; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_version_1: s_n_llhttp__internal__n_span_start_llhttp__on_version_1: { @@ -6507,32 +6604,147 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_version; goto s_n_llhttp__internal__n_res_http_major; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - case s_n_llhttp__internal__n_start_res: - s_n_llhttp__internal__n_start_res: { + case s_n_llhttp__internal__n_res_after_protocol: + s_n_llhttp__internal__n_res_after_protocol: { + if (p == endp) { + return s_n_llhttp__internal__n_res_after_protocol; + } + switch (*p) { + case '/': { + p++; + goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; + } + default: { + goto s_n_llhttp__internal__n_error_114; + } + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_3: + s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_3: { + switch (llhttp__on_protocol_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_res_after_protocol; + case 21: + goto s_n_llhttp__internal__n_pause_30; + default: + goto s_n_llhttp__internal__n_error_113; + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_error_115: + s_n_llhttp__internal__n_error_115: { + state->error = 0x8; + state->reason = "Expected HTTP/, RTSP/ or ICE/"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + case s_n_llhttp__internal__n_res_after_start_1: + s_n_llhttp__internal__n_res_after_start_1: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_start_res; + return s_n_llhttp__internal__n_res_after_start_1; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 5); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_4; + } + case kMatchPause: { + return s_n_llhttp__internal__n_res_after_start_1; + } + case kMatchMismatch: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_5; + } + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_res_after_start_2: + s_n_llhttp__internal__n_res_after_start_2: { + llparse_match_t match_seq; + + if (p == endp) { + return s_n_llhttp__internal__n_res_after_start_2; + } + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 2); + p = match_seq.current; + switch (match_seq.status) { + case kMatchComplete: { + p++; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_4; + } + case kMatchPause: { + return s_n_llhttp__internal__n_res_after_start_2; + } + case kMatchMismatch: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_5; + } + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_res_after_start_3: + s_n_llhttp__internal__n_res_after_start_3: { + llparse_match_t match_seq; + + if (p == endp) { + return s_n_llhttp__internal__n_res_after_start_3; + } + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 3); + p = match_seq.current; + switch (match_seq.status) { + case kMatchComplete: { + p++; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_4; } case kMatchPause: { - return s_n_llhttp__internal__n_start_res; + return s_n_llhttp__internal__n_res_after_start_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_109; + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_5; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; + } + case s_n_llhttp__internal__n_res_after_start: + s_n_llhttp__internal__n_res_after_start: { + if (p == endp) { + return s_n_llhttp__internal__n_res_after_start; + } + switch (*p) { + case 'H': { + p++; + goto s_n_llhttp__internal__n_res_after_start_1; + } + case 'I': { + p++; + goto s_n_llhttp__internal__n_res_after_start_2; + } + case 'R': { + p++; + goto s_n_llhttp__internal__n_res_after_start_3; + } + default: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_protocol_5; + } + } + UNREACHABLE; + } + case s_n_llhttp__internal__n_span_start_llhttp__on_protocol_1: + s_n_llhttp__internal__n_span_start_llhttp__on_protocol_1: { + if (p == endp) { + return s_n_llhttp__internal__n_span_start_llhttp__on_protocol_1; + } + state->_span_pos0 = (void*) p; + state->_span_cb0 = llhttp__on_protocol; + goto s_n_llhttp__internal__n_res_after_start; + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: { @@ -6540,12 +6752,11 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: - goto s_n_llhttp__internal__n_pause_23; + goto s_n_llhttp__internal__n_pause_26; default: goto s_n_llhttp__internal__n_error_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { @@ -6554,7 +6765,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob61, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -6566,11 +6777,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_or_res_method_2; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_106; + goto s_n_llhttp__internal__n_error_110; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_update_type_1: s_n_llhttp__internal__n_invoke_update_type_1: { @@ -6578,8 +6788,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { @@ -6588,7 +6797,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob62, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -6599,11 +6808,10 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_or_res_method_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_106; + goto s_n_llhttp__internal__n_error_110; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_or_res_method_1: s_n_llhttp__internal__n_req_or_res_method_1: { @@ -6620,11 +6828,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_or_res_method_3; } default: { - goto s_n_llhttp__internal__n_error_106; + goto s_n_llhttp__internal__n_error_110; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_req_or_res_method: s_n_llhttp__internal__n_req_or_res_method: { @@ -6637,11 +6844,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_or_res_method_1; } default: { - goto s_n_llhttp__internal__n_error_106; + goto s_n_llhttp__internal__n_error_110; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_span_start_llhttp__on_method: s_n_llhttp__internal__n_span_start_llhttp__on_method: { @@ -6651,8 +6857,7 @@ static llparse_state_t llhttp__internal__run( state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_method; goto s_n_llhttp__internal__n_req_or_res_method; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_start_req_or_res: s_n_llhttp__internal__n_start_req_or_res: { @@ -6667,8 +6872,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_type_2; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_load_type: s_n_llhttp__internal__n_invoke_load_type: { @@ -6676,12 +6880,11 @@ static llparse_state_t llhttp__internal__run( case 1: goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; case 2: - goto s_n_llhttp__internal__n_start_res; + goto s_n_llhttp__internal__n_span_start_llhttp__on_protocol_1; default: goto s_n_llhttp__internal__n_start_req_or_res; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_invoke_update_finish: s_n_llhttp__internal__n_invoke_update_finish: { @@ -6689,8 +6892,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_begin; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } case s_n_llhttp__internal__n_start: s_n_llhttp__internal__n_start: { @@ -6710,12 +6912,10 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_load_initial_message_completed; } } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } default: - /* UNREACHABLE */ - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_2: { state->error = 0x7; @@ -6723,32 +6923,28 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_finish_2: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_start; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_initial_message_completed: { switch (llhttp__internal__c_update_initial_message_completed(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_finish_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_content_length: { switch (llhttp__internal__c_update_content_length(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_8: { state->error = 0x5; @@ -6756,8 +6952,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { switch (llhttp__internal__c_test_lenient_flags_3(state, p, endp)) { @@ -6766,8 +6961,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_8; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { @@ -6776,16 +6970,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_closed; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_finish_1: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_13: { state->error = 0x15; @@ -6793,8 +6985,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_upgrade; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_38: { state->error = 0x12; @@ -6802,8 +6993,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_15: { state->error = 0x15; @@ -6811,8 +7001,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_40: { state->error = 0x14; @@ -6820,8 +7009,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1: { switch (llhttp__on_chunk_complete(state, p, endp)) { @@ -6832,8 +7020,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_40; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_2: { state->error = 0x15; @@ -6841,8 +7028,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_pause_1; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_9: { state->error = 0x12; @@ -6850,8 +7036,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1: { switch (llhttp__on_message_complete(state, p, endp)) { @@ -6862,8 +7047,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_9; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_36: { state->error = 0xc; @@ -6871,8 +7055,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_10: { state->error = 0xc; @@ -6880,8 +7063,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_4: { switch (llhttp__internal__c_test_lenient_flags_4(state, p, endp)) { @@ -6890,8 +7072,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_10; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_3: { state->error = 0x15; @@ -6899,8 +7080,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length_1; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_14: { state->error = 0x14; @@ -6908,8 +7088,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete: { switch (llhttp__on_chunk_complete(state, p, endp)) { @@ -6920,8 +7099,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_14; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_13: { state->error = 0x19; @@ -6929,8 +7107,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_6: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { @@ -6939,8 +7116,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_13; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_15: { state->error = 0x2; @@ -6948,8 +7124,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_7: { switch (llhttp__internal__c_test_lenient_flags_7(state, p, endp)) { @@ -6958,8 +7133,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_15; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; @@ -6975,16 +7149,14 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_chunk_data_almost_done; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags: { switch (llhttp__internal__c_or_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_4: { state->error = 0x15; @@ -6992,8 +7164,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_content_length; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_12: { state->error = 0x13; @@ -7001,8 +7172,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header: { switch (llhttp__on_chunk_header(state, p, endp)) { @@ -7013,8 +7183,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_12; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_16: { state->error = 0x2; @@ -7022,8 +7191,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_8: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { @@ -7032,8 +7200,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_16; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_11: { state->error = 0x19; @@ -7041,8 +7208,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_5: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { @@ -7051,8 +7217,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_11; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_17: { state->error = 0x2; @@ -7060,8 +7225,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_18: { state->error = 0x2; @@ -7069,8 +7233,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_20: { state->error = 0x19; @@ -7078,8 +7241,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_5: { state->error = 0x15; @@ -7087,8 +7249,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_9; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_19: { state->error = 0x22; @@ -7096,8 +7257,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name: { const unsigned char* start; @@ -7113,8 +7273,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_6: { state->error = 0x15; @@ -7122,8 +7281,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_21: { state->error = 0x22; @@ -7131,8 +7289,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1: { const unsigned char* start; @@ -7149,8 +7306,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_7: { state->error = 0x15; @@ -7158,8 +7314,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_22: { state->error = 0x22; @@ -7167,8 +7322,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2: { const unsigned char* start; @@ -7185,8 +7339,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_25: { state->error = 0x19; @@ -7194,8 +7347,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_8: { state->error = 0x15; @@ -7203,8 +7355,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_10; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_24: { state->error = 0x23; @@ -7212,8 +7363,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value: { const unsigned char* start; @@ -7229,8 +7379,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_9: { state->error = 0x15; @@ -7238,8 +7387,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_26: { state->error = 0x23; @@ -7247,8 +7395,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1: { const unsigned char* start; @@ -7265,8 +7412,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_28: { state->error = 0x19; @@ -7274,8 +7420,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_11: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { @@ -7284,8 +7429,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_28; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_29: { state->error = 0x2; @@ -7293,8 +7437,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_10: { state->error = 0x15; @@ -7302,8 +7445,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_quoted_value_done; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_27: { state->error = 0x23; @@ -7311,8 +7453,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2: { const unsigned char* start; @@ -7328,8 +7469,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3: { const unsigned char* start; @@ -7346,8 +7486,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_30; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4: { const unsigned char* start; @@ -7364,8 +7503,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_31; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_11: { state->error = 0x15; @@ -7373,8 +7511,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_32: { state->error = 0x23; @@ -7382,8 +7519,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_5: { const unsigned char* start; @@ -7400,8 +7536,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6: { const unsigned char* start; @@ -7418,8 +7553,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_33; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_12: { state->error = 0x15; @@ -7427,8 +7561,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_value; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_23: { state->error = 0x22; @@ -7436,8 +7569,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { @@ -7448,8 +7580,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_23; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3: { const unsigned char* start; @@ -7466,8 +7597,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4: { const unsigned char* start; @@ -7484,8 +7614,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_34; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_35: { state->error = 0xc; @@ -7493,8 +7622,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_mul_add_content_length: { switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { @@ -7503,8 +7631,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_chunk_size; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_37: { state->error = 0xc; @@ -7512,8 +7639,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; @@ -7529,16 +7655,14 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_finish_3: { switch (llhttp__internal__c_update_finish_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_39: { state->error = 0xf; @@ -7546,8 +7670,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause: { state->error = 0x15; @@ -7555,8 +7678,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_7: { state->error = 0x12; @@ -7564,8 +7686,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete: { switch (llhttp__on_message_complete(state, p, endp)) { @@ -7576,32 +7697,28 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_7; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_1: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_2: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_upgrade: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_14: { state->error = 0x15; @@ -7609,8 +7726,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_6: { state->error = 0x11; @@ -7618,8 +7734,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete: { switch (llhttp__on_headers_complete(state, p, endp)) { @@ -7634,16 +7749,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_6; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags: { switch (llhttp__internal__c_test_flags(state, p, endp)) { @@ -7652,8 +7765,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { @@ -7662,8 +7774,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_5; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_17: { state->error = 0x15; @@ -7671,8 +7782,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_42: { state->error = 0x14; @@ -7680,8 +7790,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_2: { switch (llhttp__on_chunk_complete(state, p, endp)) { @@ -7692,32 +7801,28 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_42; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_3: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_4: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_upgrade_1: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_4; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_16: { state->error = 0x15; @@ -7725,8 +7830,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_41: { state->error = 0x11; @@ -7734,8 +7838,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1: { switch (llhttp__on_headers_complete(state, p, endp)) { @@ -7750,16 +7853,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_41; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags_1: { switch (llhttp__internal__c_test_flags(state, p, endp)) { @@ -7768,8 +7869,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_43: { state->error = 0x2; @@ -7777,8 +7877,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_12: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { @@ -7787,8 +7886,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_43; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_44: { state->error = 0xa; @@ -7796,8 +7894,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; @@ -7814,8 +7911,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_5; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_13: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -7824,8 +7920,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_60: { state->error = 0xb; @@ -7833,8 +7928,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_47: { state->error = 0xa; @@ -7842,8 +7936,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_15: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -7852,8 +7945,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_47; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_49: { state->error = 0xb; @@ -7861,8 +7953,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_18: { state->error = 0x15; @@ -7870,8 +7961,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_field_start; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_48: { state->error = 0x1d; @@ -7879,8 +7969,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; @@ -7896,48 +7985,42 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_5: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_6: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_7: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_8: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_2: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -7952,8 +8035,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_1: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -7962,8 +8044,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_load_header_state_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_46: { state->error = 0xa; @@ -7971,8 +8052,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_14: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { @@ -7981,8 +8061,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_46; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_50: { state->error = 0x2; @@ -7990,8 +8069,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_16: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -8000,16 +8078,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_50; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_1: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_4: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -8018,8 +8094,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_52: { state->error = 0xa; @@ -8027,8 +8102,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_18: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -8037,48 +8111,42 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_52; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_2: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_9: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_10: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_11: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_12: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_5: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -8093,8 +8161,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_53: { state->error = 0x3; @@ -8102,8 +8169,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_51: { state->error = 0x19; @@ -8111,8 +8177,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; @@ -8128,8 +8193,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_test_lenient_flags_17; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; @@ -8146,8 +8210,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; @@ -8163,8 +8226,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; @@ -8181,8 +8243,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; @@ -8198,8 +8259,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_error_54; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_19: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -8208,48 +8268,42 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_4: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_13: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_14: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_15: { switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_16: { switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_6: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -8264,40 +8318,35 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_connection; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_5: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_token; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_3: { switch (llhttp__internal__c_update_header_state_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_6: { switch (llhttp__internal__c_update_header_state_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_7: { switch (llhttp__internal__c_update_header_state_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6: { const unsigned char* start; @@ -8313,8 +8362,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_error_56; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { @@ -8323,16 +8371,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_content_length; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_17: { switch (llhttp__internal__c_or_flags_17(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7: { const unsigned char* start; @@ -8348,8 +8394,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_error_57; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_55: { state->error = 0x4; @@ -8357,8 +8402,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags_2: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { @@ -8367,8 +8411,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_55; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_9: { const unsigned char* start; @@ -8385,16 +8428,14 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_59; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_8: { switch (llhttp__internal__c_update_header_state_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8: { const unsigned char* start; @@ -8411,8 +8452,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_error_58; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_20: { switch (llhttp__internal__c_test_lenient_flags_20(state, p, endp)) { @@ -8421,8 +8461,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_te_chunked; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_type_1: { switch (llhttp__internal__c_load_type(state, p, endp)) { @@ -8431,32 +8470,28 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_te_chunked; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_9: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_and_flags: { switch (llhttp__internal__c_and_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_te_chunked; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_19: { switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_21: { switch (llhttp__internal__c_test_lenient_flags_20(state, p, endp)) { @@ -8465,8 +8500,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_or_flags_19; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_type_2: { switch (llhttp__internal__c_load_type(state, p, endp)) { @@ -8475,16 +8509,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_or_flags_19; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_18: { switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags_3: { switch (llhttp__internal__c_test_flags_3(state, p, endp)) { @@ -8493,16 +8525,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_or_flags_18; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_or_flags_20: { switch (llhttp__internal__c_or_flags_20(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_9; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_header_state_3: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { @@ -8517,8 +8547,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_22: { switch (llhttp__internal__c_test_lenient_flags_22(state, p, endp)) { @@ -8527,8 +8556,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_discard_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags_4: { switch (llhttp__internal__c_test_flags_4(state, p, endp)) { @@ -8537,8 +8565,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_discard_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_61: { state->error = 0xf; @@ -8546,8 +8573,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_23: { switch (llhttp__internal__c_test_lenient_flags_22(state, p, endp)) { @@ -8556,8 +8582,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_discard_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_flags_5: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { @@ -8566,8 +8591,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_header_value_discard_ws; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_19: { state->error = 0x15; @@ -8575,8 +8599,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_header_state; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_45: { state->error = 0x1c; @@ -8584,8 +8607,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; @@ -8602,8 +8624,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2: { const unsigned char* start; @@ -8620,8 +8641,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_62: { state->error = 0xa; @@ -8629,32 +8649,28 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_10: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_header_state: { switch (llhttp__internal__c_store_header_state(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_header_field_colon; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_header_state_11: { switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_4: { state->error = 0x1e; @@ -8662,8 +8678,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { @@ -8672,8 +8687,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_4; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_20: { state->error = 0x15; @@ -8681,8 +8695,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_3: { state->error = 0x1a; @@ -8690,8 +8703,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete: { switch (llhttp__on_url_complete(state, p, endp)) { @@ -8702,24 +8714,21 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_error_3; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_http_minor: { switch (llhttp__internal__c_update_http_minor(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_http_major: { switch (llhttp__internal__c_update_http_major(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_http_minor; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; @@ -8735,8 +8744,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_63: { state->error = 0x7; @@ -8744,8 +8752,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; @@ -8761,73 +8768,65 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_71: { + s_n_llhttp__internal__n_error_72: { state->error = 0x17; state->reason = "Pause on PRI/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_72: { + s_n_llhttp__internal__n_error_73: { state->error = 0x9; state->reason = "Expected HTTP/2 Connection Preface"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_69: { + s_n_llhttp__internal__n_error_70: { state->error = 0x2; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_26: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_headers_start; default: - goto s_n_llhttp__internal__n_error_69; + goto s_n_llhttp__internal__n_error_70; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_68: { + s_n_llhttp__internal__n_error_69: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_25: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_req_http_complete_crlf; default: - goto s_n_llhttp__internal__n_error_68; + goto s_n_llhttp__internal__n_error_69; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_70: { + s_n_llhttp__internal__n_error_71: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_pause_21: { state->error = 0x15; @@ -8835,17 +8834,15 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method_1; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_67: { + s_n_llhttp__internal__n_error_68: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_1: { const unsigned char* start; @@ -8861,8 +8858,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version: { const unsigned char* start; @@ -8874,12 +8870,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_66; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_67; return s_error; } - goto s_n_llhttp__internal__n_error_66; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_67; + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -8888,8 +8883,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor_1: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -8900,8 +8894,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor_2: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -8910,8 +8903,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_major: { switch (llhttp__internal__c_load_http_major(state, p, endp)) { @@ -8924,8 +8916,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_24: { switch (llhttp__internal__c_test_lenient_flags_24(state, p, endp)) { @@ -8934,16 +8925,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_load_http_major; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_http_minor: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_24; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_2: { const unsigned char* start; @@ -8955,12 +8944,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_73; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_74; return s_error; } - goto s_n_llhttp__internal__n_error_73; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_74; + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_3: { const unsigned char* start; @@ -8972,20 +8960,18 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_74; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_75; return s_error; } - goto s_n_llhttp__internal__n_error_74; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_75; + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_http_major: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_http_dot; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_4: { const unsigned char* start; @@ -8997,183 +8983,163 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_75; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_76; return s_error; } - goto s_n_llhttp__internal__n_error_75; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_76; + UNREACHABLE; } - s_n_llhttp__internal__n_error_65: { + s_n_llhttp__internal__n_error_77: { + state->error = 0x8; + state->reason = "Expected HTTP/, RTSP/ or ICE/"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_error_66: { state->error = 0x8; state->reason = "Invalid method for HTTP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_invoke_load_method: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 1: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 2: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 3: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 4: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 5: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 6: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 7: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 8: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 9: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 10: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 11: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 12: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 13: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 14: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 15: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 16: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 17: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 18: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 19: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 20: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 21: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 22: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 23: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 24: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 25: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 26: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 27: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 28: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 29: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 30: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 31: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 32: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 33: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 34: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 46: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_65; - } - /* UNREACHABLE */; - abort(); + s_n_llhttp__internal__n_pause_22: { + state->error = 0x15; + state->reason = "on_protocol_complete pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method; + return s_error; + UNREACHABLE; } - s_n_llhttp__internal__n_error_78: { - state->error = 0x8; - state->reason = "Expected HTTP/"; + s_n_llhttp__internal__n_error_65: { + state->error = 0x26; + state->reason = "`on_protocol_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete; + return s_error; + } + goto s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete; + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol_3: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_82; + return s_error; + } + goto s_n_llhttp__internal__n_error_82; + UNREACHABLE; } - s_n_llhttp__internal__n_error_76: { + s_n_llhttp__internal__n_error_79: { state->error = 0x8; state->reason = "Expected SOURCE method for ICE/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_invoke_load_method_2: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 33: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_76; + s_n_llhttp__internal__n_pause_23: { + state->error = 0x15; + state->reason = "on_protocol_complete pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method_2; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_error_78: { + state->error = 0x26; + state->reason = "`on_protocol_complete` callback error"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol_1: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_1; + return s_error; } - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_1; + UNREACHABLE; } - s_n_llhttp__internal__n_error_77: { + s_n_llhttp__internal__n_error_81: { state->error = 0x8; state->reason = "Invalid method for RTSP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_invoke_load_method_3: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 3: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 6: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 35: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 36: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 37: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 38: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 39: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 40: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 41: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 42: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 43: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 44: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 45: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_77; + s_n_llhttp__internal__n_pause_24: { + state->error = 0x15; + state->reason = "on_protocol_complete pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method_3; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_error_80: { + state->error = 0x26; + state->reason = "`on_protocol_complete` callback error"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol_2: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_2; + return s_error; } - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_2; + UNREACHABLE; } - s_n_llhttp__internal__n_pause_22: { + s_n_llhttp__internal__n_pause_25: { state->error = 0x15; state->reason = "on_url_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_http_start; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_64: { state->error = 0x1a; @@ -9181,20 +9147,18 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1: { switch (llhttp__on_url_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_http_start; case 21: - goto s_n_llhttp__internal__n_pause_22; + goto s_n_llhttp__internal__n_pause_25; default: goto s_n_llhttp__internal__n_error_64; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; @@ -9210,8 +9174,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; @@ -9227,8 +9190,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; @@ -9244,8 +9206,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; @@ -9261,17 +9222,15 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_79: { + s_n_llhttp__internal__n_error_83: { state->error = 0x7; state->reason = "Invalid char in url fragment start"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; @@ -9287,8 +9246,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; @@ -9304,8 +9262,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; @@ -9321,26 +9278,23 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_80: { + s_n_llhttp__internal__n_error_84: { state->error = 0x7; state->reason = "Invalid char in url query"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_81: { + s_n_llhttp__internal__n_error_85: { state->error = 0x7; state->reason = "Invalid char in url path"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; @@ -9356,8 +9310,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; @@ -9373,8 +9326,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; @@ -9390,8 +9342,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; @@ -9407,8 +9358,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; @@ -9424,8 +9374,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; @@ -9441,62 +9390,55 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_82: { + s_n_llhttp__internal__n_error_86: { state->error = 0x7; state->reason = "Double @ in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_83: { + s_n_llhttp__internal__n_error_87: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_84: { + s_n_llhttp__internal__n_error_88: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_85: { + s_n_llhttp__internal__n_error_89: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_86: { + s_n_llhttp__internal__n_error_90: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_87: { + s_n_llhttp__internal__n_error_91: { state->error = 0x7; state->reason = "Unexpected start char in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_is_equal_method: { switch (llhttp__internal__c_is_equal_method(state, p, endp)) { @@ -9505,35 +9447,31 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_url_entry_connect; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_88: { + s_n_llhttp__internal__n_error_92: { state->error = 0x6; state->reason = "Expected space after method"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_26: { + s_n_llhttp__internal__n_pause_29: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_107: { + s_n_llhttp__internal__n_error_111: { state->error = 0x20; state->reason = "`on_method_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_method_2: { const unsigned char* start; @@ -9549,129 +9487,115 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_method_1: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_span_end_llhttp__on_method_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_108: { + s_n_llhttp__internal__n_error_112: { state->error = 0x6; state->reason = "Invalid method encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_100: { + s_n_llhttp__internal__n_error_104: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_98: { + s_n_llhttp__internal__n_error_102: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_96: { + s_n_llhttp__internal__n_error_100: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_24: { + s_n_llhttp__internal__n_pause_27: { state->error = 0x15; state->reason = "on_status_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_92: { + s_n_llhttp__internal__n_error_96: { state->error = 0x1b; state->reason = "`on_status_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { switch (llhttp__on_status_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_headers_start; case 21: - goto s_n_llhttp__internal__n_pause_24; + goto s_n_llhttp__internal__n_pause_27; default: - goto s_n_llhttp__internal__n_error_92; + goto s_n_llhttp__internal__n_error_96; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_91: { + s_n_llhttp__internal__n_error_95: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_28: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: - goto s_n_llhttp__internal__n_error_91; + goto s_n_llhttp__internal__n_error_95; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_93: { + s_n_llhttp__internal__n_error_97: { state->error = 0x2; state->reason = "Expected LF after CR"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_29: { switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; default: - goto s_n_llhttp__internal__n_error_93; + goto s_n_llhttp__internal__n_error_97; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_94: { + s_n_llhttp__internal__n_error_98: { state->error = 0x19; state->reason = "Missing expected CR after response line"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; @@ -9688,8 +9612,7 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_invoke_test_lenient_flags_30; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; @@ -9706,109 +9629,97 @@ static llparse_state_t llhttp__internal__run( } p++; goto s_n_llhttp__internal__n_res_line_almost_done; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_95: { + s_n_llhttp__internal__n_error_99: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_mul_add_status_code_2: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: - goto s_n_llhttp__internal__n_error_96; + goto s_n_llhttp__internal__n_error_100; default: goto s_n_llhttp__internal__n_res_status_code_otherwise; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_97: { + s_n_llhttp__internal__n_error_101: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_mul_add_status_code_1: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: - goto s_n_llhttp__internal__n_error_98; + goto s_n_llhttp__internal__n_error_102; default: goto s_n_llhttp__internal__n_res_status_code_digit_3; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_99: { + s_n_llhttp__internal__n_error_103: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_mul_add_status_code: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: - goto s_n_llhttp__internal__n_error_100; + goto s_n_llhttp__internal__n_error_104; default: goto s_n_llhttp__internal__n_res_status_code_digit_2; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_101: { + s_n_llhttp__internal__n_error_105: { state->error = 0xd; state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_status_code: { switch (llhttp__internal__c_update_status_code(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_status_code_digit_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_102: { + s_n_llhttp__internal__n_error_106: { state->error = 0x9; state->reason = "Expected space after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_25: { + s_n_llhttp__internal__n_pause_28: { state->error = 0x15; state->reason = "on_version_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_after_version; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_90: { + s_n_llhttp__internal__n_error_94: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_6: { const unsigned char* start; @@ -9824,8 +9735,7 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_5: { const unsigned char* start; @@ -9837,12 +9747,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_89; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_93; return s_error; } - goto s_n_llhttp__internal__n_error_89; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_93; + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor_3: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -9851,8 +9760,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor_4: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -9863,8 +9771,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_minor_5: { switch (llhttp__internal__c_load_http_minor(state, p, endp)) { @@ -9873,8 +9780,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_http_major_1: { switch (llhttp__internal__c_load_http_major(state, p, endp)) { @@ -9887,8 +9793,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_test_lenient_flags_27: { switch (llhttp__internal__c_test_lenient_flags_24(state, p, endp)) { @@ -9897,16 +9802,14 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_load_http_major_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_http_minor_1: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_27; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_7: { const unsigned char* start; @@ -9918,12 +9821,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_103; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_107; return s_error; } - goto s_n_llhttp__internal__n_error_103; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_107; + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_8: { const unsigned char* start; @@ -9935,20 +9837,18 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_104; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_108; return s_error; } - goto s_n_llhttp__internal__n_error_104; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_108; + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_http_major_1: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_dot; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_version_9: { const unsigned char* start; @@ -9960,30 +9860,75 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_105; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_109; return s_error; } - goto s_n_llhttp__internal__n_error_105; - /* UNREACHABLE */; - abort(); + goto s_n_llhttp__internal__n_error_109; + UNREACHABLE; } - s_n_llhttp__internal__n_error_109: { + s_n_llhttp__internal__n_error_114: { state->error = 0x8; - state->reason = "Expected HTTP/"; + state->reason = "Expected HTTP/, RTSP/ or ICE/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_23: { + s_n_llhttp__internal__n_pause_30: { + state->error = 0x15; + state->reason = "on_protocol_complete pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_after_protocol; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_error_113: { + state->error = 0x26; + state->reason = "`on_protocol_complete` callback error"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol_4: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_3; + return s_error; + } + goto s_n_llhttp__internal__n_invoke_llhttp__on_protocol_complete_3; + UNREACHABLE; + } + s_n_llhttp__internal__n_span_end_llhttp__on_protocol_5: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_protocol(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_115; + return s_error; + } + goto s_n_llhttp__internal__n_error_115; + UNREACHABLE; + } + s_n_llhttp__internal__n_pause_26: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error_1: { state->error = 0x20; @@ -9991,8 +9936,7 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_method: { const unsigned char* start; @@ -10008,33 +9952,29 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_type: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_end_llhttp__on_method; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_store_method: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_update_type; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_106: { + s_n_llhttp__internal__n_error_110: { state->error = 0x8; state->reason = "Invalid word encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_span_end_llhttp__on_method_1: { const unsigned char* start; @@ -10050,25 +9990,22 @@ static llparse_state_t llhttp__internal__run( return s_error; } goto s_n_llhttp__internal__n_invoke_update_type_1; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_update_type_2: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_27: { + s_n_llhttp__internal__n_pause_31: { state->error = 0x15; state->reason = "on_message_begin pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_type; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_error: { state->error = 0x10; @@ -10076,50 +10013,45 @@ static llparse_state_t llhttp__internal__run( state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_message_begin: { switch (llhttp__on_message_begin(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_type; case 21: - goto s_n_llhttp__internal__n_pause_27; + goto s_n_llhttp__internal__n_pause_31; default: goto s_n_llhttp__internal__n_error; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_pause_28: { + s_n_llhttp__internal__n_pause_32: { state->error = 0x15; state->reason = "on_reset pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_finish; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } - s_n_llhttp__internal__n_error_110: { + s_n_llhttp__internal__n_error_116: { state->error = 0x1f; state->reason = "`on_reset` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_llhttp__on_reset: { switch (llhttp__on_reset(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_update_finish; case 21: - goto s_n_llhttp__internal__n_pause_28; + goto s_n_llhttp__internal__n_pause_32; default: - goto s_n_llhttp__internal__n_error_110; + goto s_n_llhttp__internal__n_error_116; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } s_n_llhttp__internal__n_invoke_load_initial_message_completed: { switch (llhttp__internal__c_load_initial_message_completed(state, p, endp)) { @@ -10128,8 +10060,7 @@ static llparse_state_t llhttp__internal__run( default: goto s_n_llhttp__internal__n_invoke_update_finish; } - /* UNREACHABLE */; - abort(); + UNREACHABLE; } } diff --git a/deps/minimatch/LICENSE b/deps/minimatch/LICENSE deleted file mode 100644 index 1493534e60dce4..00000000000000 --- a/deps/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2011-2023 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. diff --git a/deps/minimatch/LICENSE.md b/deps/minimatch/LICENSE.md new file mode 100644 index 00000000000000..8cb5cc6e616c0d --- /dev/null +++ b/deps/minimatch/LICENSE.md @@ -0,0 +1,55 @@ +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +<https://blueoakcouncil.org/license/1.0.0>. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +**_As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim._** diff --git a/deps/minimatch/README.md b/deps/minimatch/README.md index 2241bab252ffed..b928ec96a9530f 100644 --- a/deps/minimatch/README.md +++ b/deps/minimatch/README.md @@ -7,6 +7,43 @@ This is the matching library used internally by npm. It works by converting glob expressions into JavaScript `RegExp` objects. +## Important Security Consideration! + +> [!WARNING] +> This library uses JavaScript regular expressions. Please read +> the following warning carefully, and be thoughtful about what +> you provide to this library in production systems. + +_Any_ library in JavaScript that deals with matching string +patterns using regular expressions will be subject to +[ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) +if the pattern is generated using untrusted input. + +Efforts have been made to mitigate risk as much as is feasible in +such a library, providing maximum recursion depths and so forth, +but these measures can only ultimately protect against accidents, +not malice. A dedicated attacker can _always_ find patterns that +cannot be defended against by a bash-compatible glob pattern +matching system that uses JavaScript regular expressions. + +To be extremely clear: + +> [!WARNING] +> **If you create a system where you take user input, and use +> that input as the source of a Regular Expression pattern, in +> this or any extant glob matcher in JavaScript, you will be +> pwned.** + +A future version of this library _may_ use a different matching +algorithm which does not exhibit backtracking problems. If and +when that happens, it will likely be a sweeping change, and those +improvements will **not** be backported to legacy versions. + +In the near term, it is not reasonable to continue to play +whack-a-mole with security advisories, and so any future ReDoS +reports will be considered "working as intended", and resolved +entirely by this warning. + ## Usage ```js @@ -157,13 +194,15 @@ Returns a function that tests its supplied argument, suitable for use with `Array.filter`. Example: ```javascript -var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true })) +var javascripts = fileList.filter( + minimatch.filter('*.js', { matchBase: true }), +) ``` ### minimatch.escape(pattern, options = {}) Escape all magic characters in a glob pattern, so that it will -only ever match literal strings +only ever match literal strings. If the `windowsPathsNoEscape` option is used, then characters are escaped by wrapping in `[]`, because a magic character wrapped in @@ -238,7 +277,7 @@ Perform a case-insensitive match. When used with `{nocase: true}`, create regular expressions that are case-insensitive, but leave string match portions untouched. -Has no effect when used without `{nocase: true}` +Has no effect when used without `{nocase: true}`. Useful when some other form of case-insensitive matching is used, or if the original string representation is useful in some other @@ -337,7 +376,7 @@ A number indicating the level of optimization that should be done to the pattern prior to parsing and using it for matches. Globstar parts `**` are always converted to `*` when `noglobstar` -is set, and multiple adjascent `**` parts are converted into a +is set, and multiple adjacent `**` parts are converted into a single `**` (ie, `a/**/**/b` will be treated as `a/**/b`, as this is equivalent in all cases). @@ -354,7 +393,6 @@ is equivalent in all cases). pattern are preserved. - `2` (or higher) - Much more aggressive optimizations, suitable for use with file-walking cases: - - Remove cases where a double-dot `..` follows a pattern portion that is not `**`, `.`, or empty `''`. Remove empty and `.` portions of the pattern, where safe to do so (ie, @@ -395,6 +433,42 @@ separators in file paths for comparison.) Defaults to the value of `process.platform`. +### maxGlobstarRecursion + +Max number of non-adjacent `**` patterns to recursively walk +down. + +The default of `200` is almost certainly high enough for most +purposes, and can handle absurdly excessive patterns. + +If the limit is exceeded (which would require very excessively +long patterns and paths containing lots of `**` patterns!), then +it is treated as non-matching, even if the path would normally +match the pattern provided. + +That is, this is an intentional false negative, deemed an +acceptable break in correctness for security and performance. + +### maxExtglobRecursion + +Max depth to traverse for nested extglobs like `*(a|b|c)` + +Default is 2, which is quite low, but any higher value swiftly +results in punishing performance impacts. Note that this is _not_ +relevant when the globstar types can be safely coalesced into a +single set. + +For example, `*(a|@(b|c)|d)` would be flattened into +`*(a|b|c|d)`. Thus, many common extglobs will retain good +performance and never hit this limit, even if they are +excessively deep and complicated. + +If the limit is hit, then the extglob characters are simply not +parsed, and the pattern effectively switches into `noextglob: +true` mode for the contents of that nested sub-pattern. This will +typically _not_ result in a match, but is considered a valid +trade-off for security and performance. + ## Comparisons to other fnmatch/glob implementations While strict compliance with the existing standards is a diff --git a/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts b/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts deleted file mode 100644 index 8e318b23a033e2..00000000000000 --- a/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const assertValidPattern: (pattern: any) => void; -//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts.map deleted file mode 100644 index c61c0310949955..00000000000000 --- a/deps/minimatch/dist/cjs/assert-valid-pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/assert-valid-pattern.js.map b/deps/minimatch/dist/cjs/assert-valid-pattern.js.map deleted file mode 100644 index d43215c6917374..00000000000000 --- a/deps/minimatch/dist/cjs/assert-valid-pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;KACvC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QACvC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/ast.d.ts b/deps/minimatch/dist/cjs/ast.d.ts deleted file mode 100644 index e08641b5b8c593..00000000000000 --- a/deps/minimatch/dist/cjs/ast.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MinimatchOptions, MMRegExp } from './index.js'; -export type ExtglobType = '!' | '?' | '+' | '*' | '@'; -export declare class AST { - #private; - type: ExtglobType | null; - constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); - get hasMagic(): boolean | undefined; - toString(): string; - push(...parts: (string | AST)[]): void; - toJSON(): any[]; - isStart(): boolean; - isEnd(): boolean; - copyIn(part: AST | string): void; - clone(parent: AST): AST; - static fromGlob(pattern: string, options?: MinimatchOptions): AST; - toMMPattern(): MMRegExp | string; - toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; -} -//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/ast.d.ts.map b/deps/minimatch/dist/cjs/ast.d.ts.map deleted file mode 100644 index 5486a6893dff3e..00000000000000 --- a/deps/minimatch/dist/cjs/ast.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IAgGhC,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAiMjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/ast.js b/deps/minimatch/dist/cjs/ast.js deleted file mode 100644 index a98ae79b503b1e..00000000000000 --- a/deps/minimatch/dist/cjs/ast.js +++ /dev/null @@ -1,589 +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, - }); - } - // 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/minimatch/dist/cjs/ast.js.map b/deps/minimatch/dist/cjs/ast.js.map deleted file mode 100644 index 89b84ac9fc4581..00000000000000 --- a/deps/minimatch/dist/cjs/ast.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty = this.isStart() && this.isEnd()\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n if (noEmpty && glob === '*') re += starNoEmpty\n else re += star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/brace-expressions.d.ts.map b/deps/minimatch/dist/cjs/brace-expressions.d.ts.map deleted file mode 100644 index d3949648702223..00000000000000 --- a/deps/minimatch/dist/cjs/brace-expressions.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,SACf,MAAM,YACF,MAAM,qBA8HjB,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/brace-expressions.js b/deps/minimatch/dist/cjs/brace-expressions.js deleted file mode 100644 index 0e13eefc4cfee2..00000000000000 --- a/deps/minimatch/dist/cjs/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; -// { <posix class>: [<translation>, /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<more...>] 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/minimatch/dist/cjs/brace-expressions.js.map b/deps/minimatch/dist/cjs/brace-expressions.js.map deleted file mode 100644 index 86b047561d3017..00000000000000 --- a/deps/minimatch/dist/cjs/brace-expressions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/escape.d.ts b/deps/minimatch/dist/cjs/escape.d.ts deleted file mode 100644 index dc3e3163197728..00000000000000 --- a/deps/minimatch/dist/cjs/escape.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { MinimatchOptions } from './index.js'; -/** - * 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 declare const escape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, 'windowsPathsNoEscape'>) => string; -//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/escape.d.ts.map b/deps/minimatch/dist/cjs/escape.d.ts.map deleted file mode 100644 index 0779dae7ecca6a..00000000000000 --- a/deps/minimatch/dist/cjs/escape.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,MACd,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAQlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/escape.js b/deps/minimatch/dist/cjs/escape.js deleted file mode 100644 index 02a4f8a8e0a588..00000000000000 --- a/deps/minimatch/dist/cjs/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/minimatch/dist/cjs/escape.js.map b/deps/minimatch/dist/cjs/escape.js.map deleted file mode 100644 index 264b2ea51587d8..00000000000000 --- a/deps/minimatch/dist/cjs/escape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AACA;;;;;;;;GAQG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAZY,QAAA,MAAM,UAYlB","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/index.d.ts b/deps/minimatch/dist/cjs/index.d.ts deleted file mode 100644 index 41d16a98ebe793..00000000000000 --- a/deps/minimatch/dist/cjs/index.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { AST } from './ast.js'; -type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; -export interface MinimatchOptions { - nobrace?: boolean; - nocomment?: boolean; - nonegate?: boolean; - debug?: boolean; - noglobstar?: boolean; - noext?: boolean; - nonull?: boolean; - windowsPathsNoEscape?: boolean; - allowWindowsEscape?: boolean; - partial?: boolean; - dot?: boolean; - nocase?: boolean; - nocaseMagicOnly?: boolean; - magicalBraces?: boolean; - matchBase?: boolean; - flipNegate?: boolean; - preserveMultipleSlashes?: boolean; - optimizationLevel?: number; - platform?: Platform; - windowsNoMagicRoot?: boolean; -} -export declare const minimatch: { - (p: string, pattern: string, options?: MinimatchOptions): boolean; - sep: Sep; - GLOBSTAR: typeof GLOBSTAR; - filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; - defaults: (def: MinimatchOptions) => typeof minimatch; - braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; - makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; - match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; - AST: typeof AST; - Minimatch: typeof Minimatch; - escape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, "windowsPathsNoEscape">) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, "windowsPathsNoEscape">) => string; -}; -type Sep = '\\' | '/'; -export declare const sep: Sep; -export declare const GLOBSTAR: unique symbol; -export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; -export declare const defaults: (def: MinimatchOptions) => typeof minimatch; -export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; -export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; -export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; -export type MMRegExp = RegExp & { - _src?: string; - _glob?: string; -}; -export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; -export type ParseReturn = ParseReturnFiltered | false; -export declare class Minimatch { - options: MinimatchOptions; - set: ParseReturnFiltered[][]; - pattern: string; - windowsPathsNoEscape: boolean; - nonegate: boolean; - negate: boolean; - comment: boolean; - empty: boolean; - preserveMultipleSlashes: boolean; - partial: boolean; - globSet: string[]; - globParts: string[][]; - nocase: boolean; - isWindows: boolean; - platform: Platform; - windowsNoMagicRoot: boolean; - regexp: false | null | MMRegExp; - constructor(pattern: string, options?: MinimatchOptions); - hasMagic(): boolean; - debug(..._: any[]): void; - make(): void; - preprocess(globParts: string[][]): string[][]; - adjascentGlobstarOptimize(globParts: string[][]): string[][]; - levelOneOptimize(globParts: string[][]): string[][]; - levelTwoFileOptimize(parts: string | string[]): string[]; - firstPhasePreProcess(globParts: string[][]): string[][]; - secondPhasePreProcess(globParts: string[][]): string[][]; - partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; - parseNegate(): void; - matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; - braceExpand(): string[]; - parse(pattern: string): ParseReturn; - makeRe(): false | MMRegExp; - slashSplit(p: string): string[]; - match(f: string, partial?: boolean): boolean; - static defaults(def: MinimatchOptions): typeof Minimatch; -} -export { AST } from './ast.js'; -export { escape } from './escape.js'; -export { unescape } from './unescape.js'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/index.d.ts.map b/deps/minimatch/dist/cjs/index.d.ts.map deleted file mode 100644 index 7a14a445ca5b5a..00000000000000 --- a/deps/minimatch/dist/cjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAe,MAAM,UAAU,CAAA;AAI3C,KAAK,QAAQ,GACT,KAAK,GACL,SAAS,GACT,QAAQ,GACR,SAAS,GACT,OAAO,GACP,OAAO,GACP,SAAS,GACT,OAAO,GACP,OAAO,GACP,QAAQ,GACR,QAAQ,CAAA;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,SAAS;QACjB,MAAM,WACA,MAAM,YACN,gBAAgB;;;sBAuGf,MAAM,YAAW,gBAAgB,SACvC,MAAM;oBAOkB,gBAAgB,KAAG,gBAAgB;2BA6EtD,MAAM,YACN,gBAAgB;sBA2BK,MAAM,YAAW,gBAAgB;kBAKzD,MAAM,EAAE,WACL,MAAM,YACN,gBAAgB;;;;;CArN1B,CAAA;AA+DD,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG,CAAA;AAOrB,eAAO,MAAM,GAAG,KAAgE,CAAA;AAGhF,eAAO,MAAM,QAAQ,eAAwB,CAAA;AAmB7C,eAAO,MAAM,MAAM,YACP,MAAM,YAAW,gBAAgB,SACvC,MAAM,YACsB,CAAA;AAMlC,eAAO,MAAM,QAAQ,QAAS,gBAAgB,KAAG,gBA+DhD,CAAA;AAaD,eAAO,MAAM,WAAW,YACb,MAAM,YACN,gBAAgB,aAY1B,CAAA;AAeD,eAAO,MAAM,MAAM,YAAa,MAAM,YAAW,gBAAgB,qBACvB,CAAA;AAG1C,eAAO,MAAM,KAAK,SACV,MAAM,EAAE,WACL,MAAM,YACN,gBAAgB,aAQ1B,CAAA;AAQD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,QAAQ,CAAA;AACrE,MAAM,MAAM,WAAW,GAAG,mBAAmB,GAAG,KAAK,CAAA;AAErD,qBAAa,SAAS;IACpB,OAAO,EAAE,gBAAgB,CAAA;IACzB,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IAEf,oBAAoB,EAAE,OAAO,CAAA;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,uBAAuB,EAAE,OAAO,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IAEf,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,kBAAkB,EAAE,OAAO,CAAA;IAE3B,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;gBACnB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAkC3D,QAAQ,IAAI,OAAO;IAYnB,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;IAEjB,IAAI;IA0FJ,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IA6BhC,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IAiB/C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IAoBtC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA6D7C,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;IA0F1C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE;IAgBxD,UAAU,CACR,CAAC,EAAE,MAAM,EAAE,EACX,CAAC,EAAE,MAAM,EAAE,EACX,YAAY,GAAE,OAAe,GAC5B,KAAK,GAAG,MAAM,EAAE;IA+CnB,WAAW;IAqBX,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,OAAe;IAiNzE,WAAW;IAIX,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IA6CnC,MAAM;IAsFN,UAAU,CAAC,CAAC,EAAE,MAAM;IAepB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,UAAe;IAiEvC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,gBAAgB;CAGtC;AAED,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/index.js b/deps/minimatch/dist/cjs/index.js deleted file mode 100644 index d70e681fef5d7d..00000000000000 --- a/deps/minimatch/dist/cjs/index.js +++ /dev/null @@ -1,1011 +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 <https://github.com/yetingli> 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 { - 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; - // <pre>/<e>/<rest> -> <pre>/<rest> - 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(); - } - } - // <pre>/<p>/../<rest> -> <pre>/<rest> - 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 - // <pre> is 1 or more portions - // <rest> is 1 or more portions - // <p> is any portion other than ., .., '', or ** - // <e> 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. - // - // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} - // <pre>/<e>/<rest> -> <pre>/<rest> - // <pre>/<p>/../<rest> -> <pre>/<rest> - // **/**/<rest> -> **/<rest> - // - // **/*/<rest> -> */**/<rest> <== 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; - // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - // <pre>/**/**/<rest> -> <pre>/**/<rest> - 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--; - } - // <pre>/<e>/<rest> -> <pre>/<rest> - 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(); - } - } - // <pre>/<p>/../<rest> -> <pre>/<rest> - 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 - // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest> - // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest> - // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest> - // - // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest> - // ^-- 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) - continue; - globParts[i] = matched; - globParts[j] = []; - } - } - 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 *.<ext> 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(); - return fastTest ? Object.assign(re, { test: fastTest }) : 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/minimatch/dist/cjs/index.js.map b/deps/minimatch/dist/cjs/index.js.map deleted file mode 100644 index 50574a2751f8a9..00000000000000 --- a/deps/minimatch/dist/cjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n nobrace?: boolean\n nocomment?: boolean\n nonegate?: boolean\n debug?: boolean\n noglobstar?: boolean\n noext?: boolean\n nonull?: boolean\n windowsPathsNoEscape?: boolean\n allowWindowsEscape?: boolean\n partial?: boolean\n dot?: boolean\n nocase?: boolean\n nocaseMagicOnly?: boolean\n magicalBraces?: boolean\n matchBase?: boolean\n flipNegate?: boolean\n preserveMultipleSlashes?: boolean\n optimizationLevel?: number\n platform?: Platform\n windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes\n )\n if (!matched) continue\n globParts[i] = matched\n globParts[j] = []\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n const options = this.options\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n if (pdi > fdi) {\n pattern = pattern.slice( pdi)\n } else if (fdi > pdi) {\n file = file.slice(fdi)\n }\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // dont' need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n this.debug('matchOne', this, { file, pattern })\n this.debug('matchOne', file.length, pattern.length)\n\n for (\n var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false\n }\n /* c8 ignore stop */\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (\n file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')\n )\n return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (\n swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')\n ) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) {\n return true\n }\n }\n /* c8 ignore stop */\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest\n )(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest\n )(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n return fastTest ? Object.assign(re, { test: fastTest }) : re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n return pp.filter(p => p !== GLOBSTAR).join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/unescape.d.ts b/deps/minimatch/dist/cjs/unescape.d.ts deleted file mode 100644 index 23a7b387c7ec45..00000000000000 --- a/deps/minimatch/dist/cjs/unescape.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MinimatchOptions } from './index.js'; -/** - * 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 declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, 'windowsPathsNoEscape'>) => string; -//# sourceMappingURL=unescape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/unescape.d.ts.map b/deps/minimatch/dist/cjs/unescape.d.ts.map deleted file mode 100644 index 7ace0701318040..00000000000000 --- a/deps/minimatch/dist/cjs/unescape.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/unescape.js b/deps/minimatch/dist/cjs/unescape.js deleted file mode 100644 index 47c36bcee5a02a..00000000000000 --- a/deps/minimatch/dist/cjs/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/minimatch/dist/cjs/unescape.js.map b/deps/minimatch/dist/cjs/unescape.js.map deleted file mode 100644 index 353d3aa029fa52..00000000000000 --- a/deps/minimatch/dist/cjs/unescape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AACA;;;;;;;;;;;;;GAaG;AACI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA;AATY,QAAA,QAAQ,YASpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes. For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts new file mode 100644 index 00000000000000..34d7a78a0c5144 --- /dev/null +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts @@ -0,0 +1,2 @@ +export declare const assertValidPattern: (pattern: unknown) => void; +//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map new file mode 100644 index 00000000000000..30ddcd51f6eae8 --- /dev/null +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/assert-valid-pattern.js b/deps/minimatch/dist/commonjs/assert-valid-pattern.js similarity index 100% rename from deps/minimatch/dist/cjs/assert-valid-pattern.js rename to deps/minimatch/dist/commonjs/assert-valid-pattern.js diff --git a/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map b/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map new file mode 100644 index 00000000000000..9fc27a931c7e3f --- /dev/null +++ b/deps/minimatch/dist/commonjs/assert-valid-pattern.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":";;;AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AAC7B,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA;AAVY,QAAA,kBAAkB,sBAU9B","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n pattern: unknown,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.d.ts b/deps/minimatch/dist/commonjs/ast.d.ts new file mode 100644 index 00000000000000..27845ea71fb977 --- /dev/null +++ b/deps/minimatch/dist/commonjs/ast.d.ts @@ -0,0 +1,22 @@ +import { MinimatchOptions, MMRegExp } from './index.js'; +export type ExtglobType = '!' | '?' | '+' | '*' | '@'; +export declare class AST { + #private; + type: ExtglobType | null; + id: number; + get depth(): number; + constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); + get hasMagic(): boolean | undefined; + toString(): string; + push(...parts: (string | AST)[]): void; + toJSON(): any[]; + isStart(): boolean; + isEnd(): boolean; + copyIn(part: AST | string): void; + clone(parent: AST): AST; + static fromGlob(pattern: string, options?: MinimatchOptions): AST; + toMMPattern(): MMRegExp | string; + get options(): MinimatchOptions; + toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; +} +//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.d.ts.map b/deps/minimatch/dist/commonjs/ast.d.ts.map new file mode 100644 index 00000000000000..ec7f7898870ff2 --- /dev/null +++ b/deps/minimatch/dist/commonjs/ast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AA6IrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAwQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.js b/deps/minimatch/dist/commonjs/ast.js new file mode 100644 index 00000000000000..5e657838e669ce --- /dev/null +++ b/deps/minimatch/dist/commonjs/ast.js @@ -0,0 +1,846 @@ +"use strict"; +// parse a single path portion +var _a; +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); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); +// 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') +let ID = 0; +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; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } + 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 _a && 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 _a && 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 _a(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; + 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; + } + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { + ast.push(acc); + acc = ''; + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); + 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 _a(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; + } + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; + part.push(acc); + acc = ''; + const ext = new _a(c, part); + part.push(ext); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); + continue; + } + if (c === '|') { + part.push(acc); + acc = ''; + parts.push(part); + part = new _a(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; + } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } + static fromGlob(pattern, options = {}) { + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); + 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.#flatten(); + this.#fillNegs(); + } + if (!isExtglobAST(this)) { + 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' ? + _a.#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(); + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; + return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; + } + 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, + ]; + } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } + #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; + // multiple stars that aren't globstars coalesce into one * + let inStar = 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 (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star; + hasMagic = true; + continue; + } + else { + inStar = false; + } + 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 === '?') { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; + } +} +exports.AST = AST; +_a = AST; +//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/ast.js.map b/deps/minimatch/dist/commonjs/ast.js.map new file mode 100644 index 00000000000000..6affc8b7f647a8 --- /dev/null +++ b/deps/minimatch/dist/commonjs/ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['@']],\n ['?', ['?', '@']],\n ['@', ['@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?']],\n ['@', ['?']],\n ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?', '@']],\n ['?', ['?', '@']],\n ['@', ['?', '@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<ExtglobType, Map<ExtglobType | null, ExtglobType | null>>([\n ['!', new Map([['!', '@']])],\n [\n '?',\n new Map([\n ['*', '*'],\n ['+', '*'],\n ]),\n ],\n [\n '@',\n new Map([\n ['!', '!'],\n ['?', '?'],\n ['@', '@'],\n ['*', '*'],\n ['+', '+'],\n ]),\n ],\n [\n '+',\n new Map([\n ['?', '*'],\n ['*', '*'],\n ]),\n ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n #parent?: AST\n #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n id = ++ID\n\n get depth(): number {\n return (this.#parent?.depth ?? -1) + 1\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return {\n '@@type': 'AST',\n id: this.id,\n type: this.type,\n root: this.#root.id,\n parent: this.#parent?.id,\n depth: this.depth,\n partsLength: this.#parts.length,\n parts: this.#parts,\n }\n }\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (\n typeof p !== 'string' &&\n !(p instanceof AST && p.#parent === this)\n ) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null ?\n this.#parts\n .slice()\n .map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n extDepth: number,\n ): number {\n const maxDepth = opt.maxExtglobRecursion ?? 2\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n // we don't have to check for adoption here, because that's\n // done at the other recursion point.\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n extDepth <= maxDepth\n if (doRecurse) {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n /* c8 ignore start - the maxDepth is sufficient here */\n (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n /* c8 ignore stop */\n if (doRecurse) {\n const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n #canAdoptWithSpace(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n return this.#canAdopt(child, adoptionWithSpaceMap)\n }\n\n #canAdopt(\n child?: AST | string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canAdoptType(\n gc.type,\n map,\n )\n }\n #canAdoptType(\n c: string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n ): c is ExtglobType {\n return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n }\n\n #adoptWithSpace(\n this: AST & { type: ExtglobType },\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const blank = new AST(null, gc, this.options)\n blank.#parts.push('')\n gc.push(blank)\n this.#adopt(child, index)\n }\n\n #adopt(\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n this.#parts.splice(index, 1, ...gc.#parts)\n for (const p of gc.#parts) {\n if (typeof p === 'object') p.#parent = this\n }\n this.#toString = undefined\n }\n\n #canUsurpType(c: string): boolean {\n const m = usurpMap.get(this.type as ExtglobType)\n return !!(m?.has(c as ExtglobType))\n }\n\n #canUsurp (\n child?: AST | string,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null ||\n this.#parts.length !== 1\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n }\n\n #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n const m = usurpMap.get(this.type as ExtglobType)\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const nt = m?.get(gc.type)\n /* c8 ignore start - impossible */\n if (!nt) return false\n /* c8 ignore stop */\n this.#parts = gc.#parts\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#parent = this\n }\n }\n this.type = nt\n this.#toString = undefined\n this.#emptyExt = false\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options, 0)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) {\n this.#flatten()\n this.#fillNegs()\n }\n if (!isExtglobAST(this)) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string' ?\n AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start =\n needNoTrav ? startNoTraversal\n : needNoDot ? startNoDot\n : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n const me = this as AST\n me.#parts = [s]\n me.type = null\n me.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot ?\n ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!' ?\n // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@' ? ')'\n : this.type === '?' ? ')?'\n : this.type === '+' && bodyDotAllowed ? ')'\n : this.type === '*' && bodyDotAllowed ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #flatten() {\n if (!isExtglobAST(this)) {\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#flatten()\n }\n }\n } else {\n // do up to 10 passes to flatten as much as possible\n let iterations = 0\n let done = false\n do {\n done = true\n for (let i = 0; i < this.#parts.length; i++) {\n const c = this.#parts[i]\n if (typeof c === 'object') {\n c.#flatten()\n if (this.#canAdopt(c)) {\n done = false\n this.#adopt(c, i)\n } else if (this.#canAdoptWithSpace(c)) {\n done = false\n this.#adoptWithSpace(c, i)\n } else if (this.#canUsurp(c)) {\n done = false\n this.#usurp(c)\n }\n }\n }\n } while (!done && ++iterations < 10)\n }\n this.#toString = undefined\n }\n\n #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n // multiple stars that aren't globstars coalesce into one *\n let inStar = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '*') {\n if (inStar) continue\n inStar = true\n re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n hasMagic = true\n continue\n } else {\n inStar = false\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/brace-expressions.d.ts b/deps/minimatch/dist/commonjs/brace-expressions.d.ts similarity index 100% rename from deps/minimatch/dist/cjs/brace-expressions.d.ts rename to deps/minimatch/dist/commonjs/brace-expressions.d.ts diff --git a/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map b/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map new file mode 100644 index 00000000000000..09b4c11060de78 --- /dev/null +++ b/deps/minimatch/dist/commonjs/brace-expressions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/brace-expressions.js b/deps/minimatch/dist/commonjs/brace-expressions.js new file mode 100644 index 00000000000000..2b7b03712b874e --- /dev/null +++ b/deps/minimatch/dist/commonjs/brace-expressions.js @@ -0,0 +1,150 @@ +"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; +// { <posix class>: [<translation>, /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<more...>] 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/minimatch/dist/commonjs/brace-expressions.js.map b/deps/minimatch/dist/commonjs/brace-expressions.js.map new file mode 100644 index 00000000000000..3cc3b343b530fd --- /dev/null +++ b/deps/minimatch/dist/commonjs/brace-expressions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n : ranges.length ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/escape.d.ts b/deps/minimatch/dist/commonjs/escape.d.ts new file mode 100644 index 00000000000000..92e88c8f08825b --- /dev/null +++ b/deps/minimatch/dist/commonjs/escape.d.ts @@ -0,0 +1,15 @@ +import { MinimatchOptions } from './index.js'; +/** + * Escape all magic characters in a glob pattern. + * + * 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 declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/escape.d.ts.map b/deps/minimatch/dist/commonjs/escape.d.ts.map new file mode 100644 index 00000000000000..e8d8a693fa4021 --- /dev/null +++ b/deps/minimatch/dist/commonjs/escape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/escape.js b/deps/minimatch/dist/commonjs/escape.js new file mode 100644 index 00000000000000..83a713a2550770 --- /dev/null +++ b/deps/minimatch/dist/commonjs/escape.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escape = void 0; +/** + * Escape all magic characters in a glob pattern. + * + * 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, 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, '\\$&'); +}; +exports.escape = escape; +//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/escape.js.map b/deps/minimatch/dist/commonjs/escape.js.map new file mode 100644 index 00000000000000..442faeda338922 --- /dev/null +++ b/deps/minimatch/dist/commonjs/escape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACI,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA;AAlBY,QAAA,MAAM,UAkBlB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/index.d.ts b/deps/minimatch/dist/commonjs/index.d.ts new file mode 100644 index 00000000000000..137bd803690752 --- /dev/null +++ b/deps/minimatch/dist/commonjs/index.d.ts @@ -0,0 +1,174 @@ +import { AST } from './ast.js'; +export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; +export interface MinimatchOptions { + /** do not expand `{x,y}` style braces */ + nobrace?: boolean; + /** do not treat patterns starting with `#` as a comment */ + nocomment?: boolean; + /** do not treat patterns starting with `!` as a negation */ + nonegate?: boolean; + /** print LOTS of debugging output */ + debug?: boolean; + /** treat `**` the same as `*` */ + noglobstar?: boolean; + /** do not expand extglobs like `+(a|b)` */ + noext?: boolean; + /** return the pattern if nothing matches */ + nonull?: boolean; + /** treat `\\` as a path separator, not an escape character */ + windowsPathsNoEscape?: boolean; + /** + * inverse of {@link MinimatchOptions.windowsPathsNoEscape} + * @deprecated + */ + allowWindowsEscape?: boolean; + /** + * Compare a partial path to a pattern. As long as the parts + * of the path that are present are not contradicted by the + * pattern, it will be treated as a match. This is useful in + * applications where you're walking through a folder structure, + * and don't yet have the full path, but want to ensure that you + * do not walk down paths that can never be a match. + */ + partial?: boolean; + /** allow matches that start with `.` even if the pattern does not */ + dot?: boolean; + /** ignore case */ + nocase?: boolean; + /** ignore case only in wildcard patterns */ + nocaseMagicOnly?: boolean; + /** consider braces to be "magic" for the purpose of `hasMagic` */ + magicalBraces?: boolean; + /** + * If set, then patterns without slashes will be matched + * against the basename of the path if it contains slashes. + * For example, `a?b` would match the path `/xyz/123/acb`, but + * not `/xyz/acb/123`. + */ + matchBase?: boolean; + /** invert the results of negated matches */ + flipNegate?: boolean; + /** do not collapse multiple `/` into a single `/` */ + preserveMultipleSlashes?: boolean; + /** + * A number indicating the level of optimization that should be done + * to the pattern prior to parsing and using it for matches. + */ + optimizationLevel?: number; + /** operating system platform */ + platform?: Platform; + /** + * When a pattern starts with a UNC path or drive letter, and in + * `nocase:true` mode, do not convert the root portions of the + * pattern into a case-insensitive regular expression, and instead + * leave them as strings. + * + * This is the default when the platform is `win32` and + * `nocase:true` is set. + */ + windowsNoMagicRoot?: boolean; + /** + * max number of `{...}` patterns to expand. Default 100_000. + */ + braceExpandMax?: number; + /** + * Max number of non-adjacent `**` patterns to recursively walk down. + * + * The default of 200 is almost certainly high enough for most purposes, + * and can handle absurdly excessive patterns. + */ + maxGlobstarRecursion?: number; + /** + * Max depth to traverse for nested extglobs like `*(a|b|c)` + * + * Default is 2, which is quite low, but any higher value + * swiftly results in punishing performance impacts. Note + * that this is *not* relevant when the globstar types can + * be safely coalesced into a single set. + * + * For example, `*(a|@(b|c)|d)` would be flattened into + * `*(a|b|c|d)`. Thus, many common extglobs will retain good + * performance and never hit this limit, even if they are + * excessively deep and complicated. + * + * If the limit is hit, then the extglob characters are simply + * not parsed, and the pattern effectively switches into + * `noextglob: true` mode for the contents of that nested + * sub-pattern. This will typically _not_ result in a match, + * but is considered a valid trade-off for security and + * performance. + */ + maxExtglobRecursion?: number; +} +export declare const minimatch: { + (p: string, pattern: string, options?: MinimatchOptions): boolean; + sep: Sep; + GLOBSTAR: typeof GLOBSTAR; + filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; + defaults: (def: MinimatchOptions) => typeof minimatch; + braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; + makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; + match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; + AST: typeof AST; + Minimatch: typeof Minimatch; + escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; + unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +}; +export type Sep = '\\' | '/'; +export declare const sep: Sep; +export declare const GLOBSTAR: unique symbol; +export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; +export declare const defaults: (def: MinimatchOptions) => typeof minimatch; +export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; +export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; +export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; +export type MMRegExp = RegExp & { + _src?: string; + _glob?: string; +}; +export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; +export type ParseReturn = ParseReturnFiltered | false; +export declare class Minimatch { + #private; + options: MinimatchOptions; + set: ParseReturnFiltered[][]; + pattern: string; + windowsPathsNoEscape: boolean; + nonegate: boolean; + negate: boolean; + comment: boolean; + empty: boolean; + preserveMultipleSlashes: boolean; + partial: boolean; + globSet: string[]; + globParts: string[][]; + nocase: boolean; + isWindows: boolean; + platform: Platform; + windowsNoMagicRoot: boolean; + maxGlobstarRecursion: number; + regexp: false | null | MMRegExp; + constructor(pattern: string, options?: MinimatchOptions); + hasMagic(): boolean; + debug(..._: any[]): void; + make(): void; + preprocess(globParts: string[][]): string[][]; + adjascentGlobstarOptimize(globParts: string[][]): string[][]; + levelOneOptimize(globParts: string[][]): string[][]; + levelTwoFileOptimize(parts: string | string[]): string[]; + firstPhasePreProcess(globParts: string[][]): string[][]; + secondPhasePreProcess(globParts: string[][]): string[][]; + partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; + parseNegate(): void; + matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; + braceExpand(): string[]; + parse(pattern: string): ParseReturn; + makeRe(): false | MMRegExp; + slashSplit(p: string): string[]; + match(f: string, partial?: boolean): boolean; + static defaults(def: MinimatchOptions): typeof Minimatch; +} +export { AST } from './ast.js'; +export { escape } from './escape.js'; +export { unescape } from './unescape.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/index.d.ts.map b/deps/minimatch/dist/commonjs/index.d.ts.map new file mode 100644 index 00000000000000..1c65035ac63c5a --- /dev/null +++ b/deps/minimatch/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/index.js b/deps/minimatch/dist/commonjs/index.js new file mode 100644 index 00000000000000..b28f9b455ecf8b --- /dev/null +++ b/deps/minimatch/dist/commonjs/index.js @@ -0,0 +1,1121 @@ +"use strict"; +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 = 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 <https://github.com/yetingli> 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.expand)(pattern, { max: options.braceExpandMax }); +}; +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; + maxGlobstarRecursion; + regexp; + constructor(pattern, options = {}) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + options = options || {}; + this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === 'win32'; + // avoid the annoying deprecation flag lol + const awe = ('allowWindow' + 'sEscape'); + this.windowsPathsNoEscape = + !!options.windowsPathsNoEscape || options[awe] === 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 ** 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; + // <pre>/<e>/<rest> -> <pre>/<rest> + 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(); + } + } + // <pre>/<p>/../<rest> -> <pre>/<rest> + 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 + // <pre> is 1 or more portions + // <rest> is 1 or more portions + // <p> is any portion other than ., .., '', or ** + // <e> 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. + // + // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} + // <pre>/<e>/<rest> -> <pre>/<rest> + // <pre>/<p>/../<rest> -> <pre>/<rest> + // **/**/<rest> -> **/<rest> + // + // **/*/<rest> -> */**/<rest> <== 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; + // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + // <pre>/**/**/<rest> -> <pre>/**/<rest> + 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--; + } + // <pre>/<e>/<rest> -> <pre>/<rest> + 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(); + } + } + // <pre>/<p>/../<rest> -> <pre>/<rest> + 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 + // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest> + // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest> + // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest> + // + // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest> + // ^-- 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) { + let fileStartIndex = 0; + let patternStartIndex = 0; + // 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], + ]; + // start matching at the drive letter index of each + if (fd.toLowerCase() === pd.toLowerCase()) { + pattern[pdi] = fd; + patternStartIndex = pdi; + fileStartIndex = fdi; + } + } + } + // resolve and reduce . and .. portions in the file as well. + // 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); + } + if (pattern.includes(exports.GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(exports.GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === exports.GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug('matchOne loop'); + let p = pattern[pi]; + let f = file[fi]; + this.debug(pattern, p, f); + // should be impossible. + // some invalid regexp stuff in the set. + /* c8 ignore start */ + if (p === false || p === exports.GLOBSTAR) { + return false; + } + /* c8 ignore stop */ + // 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 *.<ext> 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; + } + }); + 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 |, + // 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 + '$'; + // 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 + ').+$'; + 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/minimatch/dist/commonjs/index.js.map b/deps/minimatch/dist/commonjs/index.js.map new file mode 100644 index 00000000000000..fc4dea5d2f2ff8 --- /dev/null +++ b/deps/minimatch/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAwC;AACxC,uEAA8D;AAC9D,qCAA2C;AAC3C,2CAAoC;AACpC,+CAAwC;AAqHjC,MAAM,SAAS,GAAG,CACvB,CAAS,EACT,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;IAE3B,oCAAoC;IACpC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC,CAAA;AAbY,QAAA,SAAS,aAarB;AAED,wDAAwD;AACxD,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CACpD,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACvC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACzE,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC3E,CAAC,CAAA;AACD,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACrD,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,YAAY,CAAA;AAClC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE,CACpC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACvC,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,EAAE,CACvC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5C,MAAM,SAAS,GAAG,SAAS,CAAA;AAC3B,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAChC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,MAAM,GAAG,OAAO,CAAA;AACtB,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACpE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAChC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AAC3C,MAAM,QAAQ,GAAG,wBAAwB,CAAA;AACzC,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACzD,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC,CAAA;AACD,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AACnE,CAAC,CAAA;AAED,qBAAqB;AACrB,MAAM,eAAe,GAAa,CAChC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC;IACtC,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;QAC9B,OAAO,CAAC,GAAG;QACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAC7C,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAa,CAAA;AAIxB,MAAM,IAAI,GAAkC;IAC1C,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;IACpB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CACpB,CAAA;AACD,oBAAoB;AAEP,QAAA,GAAG,GACd,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;AAC/D,iBAAS,CAAC,GAAG,GAAG,WAAG,CAAA;AAEN,QAAA,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;AAC7C,iBAAS,CAAC,QAAQ,GAAG,gBAAQ,CAAA;AAE7B,gCAAgC;AAChC,iDAAiD;AACjD,MAAM,KAAK,GAAG,MAAM,CAAA;AAEpB,gCAAgC;AAChC,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAA;AAEzB,4DAA4D;AAC5D,+DAA+D;AAC/D,6CAA6C;AAC7C,MAAM,UAAU,GAAG,yCAAyC,CAAA;AAE5D,kCAAkC;AAClC,6CAA6C;AAC7C,MAAM,YAAY,GAAG,yBAAyB,CAAA;AAEvC,MAAM,MAAM,GACjB,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACpD,CAAC,CAAS,EAAE,EAAE,CACZ,IAAA,iBAAS,EAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAHrB,QAAA,MAAM,UAGe;AAClC,iBAAS,CAAC,MAAM,GAAG,cAAM,CAAA;AAEzB,MAAM,GAAG,GAAG,CAAC,CAAmB,EAAE,IAAsB,EAAE,EAAE,EAAE,CAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAElB,MAAM,QAAQ,GAAG,CAAC,GAAqB,EAAoB,EAAE;IAClE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,iBAAS,CAAA;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,iBAAS,CAAA;IAEtB,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACvE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;QACtB,SAAS,EAAE,MAAM,SAAU,SAAQ,IAAI,CAAC,SAAS;YAC/C,YAAY,OAAe,EAAE,UAA4B,EAAE;gBACzD,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACnC,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,OAAyB;gBACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;YACnD,CAAC;SACF;QAED,GAAG,EAAE,MAAM,GAAI,SAAQ,IAAI,CAAC,GAAG;YAC7B,qBAAqB;YACrB,YACE,IAAwB,EACxB,MAAY,EACZ,UAA4B,EAAE;gBAE9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACxC,CAAC;YACD,oBAAoB;YAEpB,MAAM,CAAC,QAAQ,CAAC,OAAe,EAAE,UAA4B,EAAE;gBAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACtD,CAAC;SACF;QAED,QAAQ,EAAE,CACR,CAAS,EACT,UAGI,EAAE,EACN,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExC,MAAM,EAAE,CACN,CAAS,EACT,UAGI,EAAE,EACN,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEtC,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,QAAQ,EAAE,CAAC,OAAyB,EAAE,EAAE,CACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAElC,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,WAAW,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,KAAK,EAAE,CACL,IAAc,EACd,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEjD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,gBAA2B;KACtC,CAAC,CAAA;AACJ,CAAC,CAAA;AAzEY,QAAA,QAAQ,YAyEpB;AACD,iBAAS,CAAC,QAAQ,GAAG,gBAAQ,CAAA;AAE7B,mBAAmB;AACnB,qBAAqB;AACrB,mBAAmB;AACnB,8BAA8B;AAC9B,mCAAmC;AACnC,2CAA2C;AAC3C,EAAE;AACF,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACV,MAAM,WAAW,GAAG,CACzB,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;IAE3B,wDAAwD;IACxD,wDAAwD;IACxD,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,+BAA+B;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAED,OAAO,IAAA,wBAAM,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;AACzD,CAAC,CAAA;AAdY,QAAA,WAAW,eAcvB;AACD,iBAAS,CAAC,WAAW,GAAG,mBAAW,CAAA;AAEnC,yCAAyC;AACzC,kDAAkD;AAClD,oEAAoE;AACpE,oEAAoE;AACpE,6DAA6D;AAC7D,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,8DAA8D;AAEvD,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACxE,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAD7B,QAAA,MAAM,UACuB;AAC1C,iBAAS,CAAC,MAAM,GAAG,cAAM,CAAA;AAElB,MAAM,KAAK,GAAG,CACnB,IAAc,EACd,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC1C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAXY,QAAA,KAAK,SAWjB;AACD,iBAAS,CAAC,KAAK,GAAG,aAAK,CAAA;AAEvB,+BAA+B;AAC/B,MAAM,SAAS,GAAG,yBAAyB,CAAA;AAC3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAA;AAU/C,MAAa,SAAS;IACpB,OAAO,CAAkB;IACzB,GAAG,CAAyB;IAC5B,OAAO,CAAQ;IAEf,oBAAoB,CAAS;IAC7B,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,uBAAuB,CAAS;IAChC,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,SAAS,CAAY;IACrB,MAAM,CAAS;IAEf,SAAS,CAAS;IAClB,QAAQ,CAAU;IAClB,kBAAkB,CAAS;IAC3B,oBAAoB,CAAQ;IAE5B,MAAM,CAAyB;IAC/B,YAAY,OAAe,EAAE,UAA4B,EAAE;QACzD,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;QAE3B,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,GAAG,CAAA;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAA;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAC1C,0CAA0C;QAC1C,MAAM,GAAG,GAAG,CAAC,aAAa,GAAG,SAAS,CAA2B,CAAA;QACjE,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAA;QAC1D,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAA;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QACnC,IAAI,CAAC,kBAAkB;YACrB,OAAO,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC;gBACxC,OAAO,CAAC,kBAAkB;gBAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAErC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QAEb,+BAA+B;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAA;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAQ,IAAG,CAAC;IAErB,IAAI;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,6CAA6C;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,OAAM;QACR,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,wBAAwB;QACxB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAEtC,+DAA+D;QAC/D,kCAAkC;QAClC,8DAA8D;QAC9D,oDAAoD;QACpD,wCAAwC;QACxC,EAAE;QACF,mEAAmE;QACnE,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAExC,mBAAmB;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;YACxC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC9C,qCAAqC;gBACrC,MAAM,KAAK,GACT,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO;wBACL,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;wBAChB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;qBACxC,CAAA;gBACH,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACnB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAE7B,sDAAsD;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACF,CAAA;QAE5B,2CAA2C;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACrB,IACE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;oBAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACxB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB,CAAC;oBACD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,yDAAyD;IACzD,0DAA0D;IAC1D,yDAAyD;IACzD,4DAA4D;IAC5D,uCAAuC;IACvC,UAAU,CAAC,SAAqB;QAC9B,qDAAqD;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC7B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAE9C,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC3B,wDAAwD;YACxD,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAChD,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QACnD,CAAC;aAAM,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAClC,mDAAmD;YACnD,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,wCAAwC;IACxC,yBAAyB,CAAC,SAAqB;QAC7C,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;YACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,EAAE,CAAA;gBACV,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC7B,CAAC,EAAE,CAAA;gBACL,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;oBACb,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,kDAAkD;IAClD,gBAAgB,CAAC,SAAqB;QACpC,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,IAAI,EAAE,EAAE;gBAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACnC,OAAO,GAAG,CAAA;gBACZ,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAC3D,GAAG,CAAC,GAAG,EAAE,CAAA;wBACT,OAAO,GAAG,CAAA;oBACZ,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACd,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,EAAE,CAAC,CAAA;YACN,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB,CAAC,KAAwB;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,YAAY,GAAY,KAAK,CAAA;QACjC,GAAG,CAAC;YACF,YAAY,GAAG,KAAK,CAAA;YACpB,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBAClB,iCAAiC;oBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;wBAAE,SAAQ;oBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBAC1B,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBAClB,CAAC,EAAE,CAAA;oBACL,CAAC;gBACH,CAAC;gBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;oBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC,CAAC;oBACD,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;gBACb,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,IAAI,EAAE,GAAW,CAAC,CAAA;YAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/C,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvB,EAAE,IAAI,CAAC,CAAA;gBACT,CAAC;YACH,CAAC;QACH,CAAC,QAAQ,YAAY,EAAC;QACtB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1C,CAAC;IAED,yCAAyC;IACzC,8BAA8B;IAC9B,+BAA+B;IAC/B,iDAAiD;IACjD,iBAAiB;IACjB,EAAE;IACF,gEAAgE;IAChE,gEAAgE;IAChE,kEAAkE;IAClE,qDAAqD;IACrD,EAAE;IACF,kFAAkF;IAClF,mCAAmC;IACnC,sCAAsC;IACtC,4BAA4B;IAC5B,EAAE;IACF,qEAAqE;IACrE,+DAA+D;IAC/D,oBAAoB,CAAC,SAAqB;QACxC,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,GAAG,CAAC;YACF,YAAY,GAAG,KAAK,CAAA;YACpB,kFAAkF;YAClF,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;gBACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,IAAI,GAAG,GAAW,EAAE,CAAA;oBACpB,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC/B,wCAAwC;wBACxC,GAAG,EAAE,CAAA;oBACP,CAAC;oBACD,uDAAuD;oBACvD,mCAAmC;oBACnC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;wBACb,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;oBAChC,CAAC;oBAED,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,IAAI,IAAI,KAAK,IAAI;wBAAE,SAAQ;oBAC3B,IACE,CAAC,CAAC;wBACF,CAAC,KAAK,GAAG;wBACT,CAAC,KAAK,IAAI;wBACV,CAAC,EAAE;wBACH,EAAE,KAAK,GAAG;wBACV,EAAE,KAAK,IAAI,EACX,CAAC;wBACD,SAAQ;oBACV,CAAC;oBACD,YAAY,GAAG,IAAI,CAAA;oBACnB,4CAA4C;oBAC5C,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;oBACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;oBAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;oBAChB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACrB,EAAE,EAAE,CAAA;gBACN,CAAC;gBAED,mCAAmC;gBACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;wBAClB,iCAAiC;wBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;4BAAE,SAAQ;wBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;4BAC1B,YAAY,GAAG,IAAI,CAAA;4BACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;4BAClB,CAAC,EAAE,CAAA;wBACL,CAAC;oBACH,CAAC;oBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;wBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;wBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC,CAAC;wBACD,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;oBACb,CAAC;gBACH,CAAC;gBAED,sCAAsC;gBACtC,IAAI,EAAE,GAAW,CAAC,CAAA;gBAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC/C,YAAY,GAAG,IAAI,CAAA;wBACnB,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;wBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;wBAClC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;wBACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBACtC,EAAE,IAAI,CAAC,CAAA;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,QAAQ,YAAY,EAAC;QAEtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,sCAAsC;IACtC,sDAAsD;IACtD,8CAA8C;IAC9C,oDAAoD;IACpD,EAAE;IACF,2DAA2D;IAC3D,mDAAmD;IACnD,qBAAqB,CAAC,SAAqB;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,EACZ,CAAC,IAAI,CAAC,uBAAuB,CAC9B,CAAA;gBACD,IAAI,OAAO,EAAE,CAAC;oBACZ,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;oBACjB,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;oBACtB,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CACR,CAAW,EACX,CAAW,EACX,eAAwB,KAAK;QAE7B,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,MAAM,GAAa,EAAE,CAAA;QACzB,IAAI,KAAK,GAAW,EAAE,CAAA;QACtB,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1C,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd,CAAC;gBACD,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd,CAAC;gBACD,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;YACN,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,8DAA8D;QAC9D,iCAAiC;QACjC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,CAAA;IACxC,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACrE,MAAM,GAAG,CAAC,MAAM,CAAA;YAChB,YAAY,EAAE,CAAA;QAChB,CAAC;QAED,IAAI,YAAY;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,+CAA+C;IAC/C,yCAAyC;IACzC,uDAAuD;IACvD,mDAAmD;IACnD,mBAAmB;IACnB,QAAQ,CACN,IAAc,EACd,OAAsB,EACtB,UAAmB,KAAK;QAExB,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,iBAAiB,GAAG,CAAC,CAAA;QAEzB,4DAA4D;QAC5D,mEAAmE;QACnE,sBAAsB;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,OAAO,GACX,CAAC,SAAS;gBACV,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBACf,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAE3B,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,UAAU,GACd,CAAC,YAAY;gBACb,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBAClB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC9B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,GAAG,GACP,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACf,CAAC,CAAC,SAAS,CAAA;YACb,MAAM,GAAG,GACP,UAAU,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC,CAAC,SAAS,CAAA;YACb,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAqB;oBACjC,IAAI,CAAC,GAAG,CAAC;oBACT,OAAO,CAAC,GAAG,CAAW;iBACvB,CAAA;gBACD,mDAAmD;gBACnD,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;oBACjB,iBAAiB,GAAG,GAAG,CAAA;oBACvB,cAAc,GAAG,GAAG,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,oEAAoE;QACpE,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC9C,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,cAAc,CACxB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,EACd,iBAAiB,CAClB,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CACnB,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,EACd,iBAAiB,CAClB,CAAA;IACH,CAAC;IAED,cAAc,CACZ,IAAc,EACd,OAAsB,EACtB,OAAgB,EAChB,SAAiB,EACjB,YAAoB;QAEpB,sEAAsE;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAQ,EAAE,YAAY,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAQ,CAAC,CAAA;QAE5C,wDAAwD;QACxD,0DAA0D;QAC1D,sCAAsC;QACtC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC1B,EAAE;SACH,CAAC,CAAC,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1B,CAAA;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAA;YACd,CAAC;YACD,SAAS,IAAI,IAAI,CAAC,MAAM,CAAA;YACxB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAA;QAC7B,CAAC;QACD,gCAAgC;QAEhC,0DAA0D;QAC1D,iBAAiB;QACjB,IAAI,aAAa,GAAW,CAAC,CAAA;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,uDAAuD;YACvD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAA;YAEvD,wBAAwB;YACxB,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtD,aAAa,GAAG,IAAI,CAAC,MAAM,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,kEAAkE;gBAClE,+BAA+B;gBAC/B,IACE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;oBAC5B,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EACvC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;gBACD,SAAS,EAAE,CAAA;gBACX,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,KAAK,CAAA;gBACd,CAAC;gBACD,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;QAED,gCAAgC;QAEhC,8DAA8D;QAC9D,+BAA+B;QAC/B,8CAA8C;QAC9C,kEAAkE;QAClE,uEAAuE;QACvE,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,CAAC,CAAC,aAAa,CAAA;YAC7B,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;gBACzB,OAAO,GAAG,IAAI,CAAA;gBACd,IACE,CAAC,KAAK,GAAG;oBACT,CAAC,KAAK,IAAI;oBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;YACD,2DAA2D;YAC3D,OAAO,OAAO,IAAI,OAAO,CAAA;QAC3B,CAAC;QAED,gEAAgE;QAChE,qEAAqE;QACrE,6CAA6C;QAC7C,qEAAqE;QACrE,+DAA+D;QAC/D,2BAA2B;QAC3B,MAAM,YAAY,GAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACzD,IAAI,WAAW,GAA4B,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,MAAM,cAAc,GAAa,CAAC,CAAC,CAAC,CAAA;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,gBAAQ,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAC/B,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAChC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACtB,UAAU,EAAE,CAAA;YACd,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa,CAAA;QAC9C,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAE,cAAc,CAAC,CAAC,EAAE,CAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACrE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,0BAA0B,CACtC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,CAAC,EACD,OAAO,EACP,CAAC,EACD,CAAC,CAAC,aAAa,CAChB,CAAA;IACH,CAAC;IAED,wCAAwC;IACxC,qDAAqD;IACrD,0BAA0B,CACxB,IAAc;IACd,iDAAiD;IACjD,YAAuC,EACvC,SAAiB,EACjB,SAAiB,EACjB,OAAgB,EAChB,aAAqB,EACrB,OAAgB;QAEhB,sEAAsE;QACtE,mBAAmB;QACnB,mEAAmE;QACnE,6CAA6C;QAC7C,kDAAkD;QAClD,+CAA+C;QAC/C,qEAAqE;QACrE,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QAClC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,0CAA0C;YAC1C,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,OAAO,GAAG,IAAI,CAAA;gBACd,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,IACE,CAAC,KAAK,GAAG;oBACT,CAAC,KAAK,IAAI;oBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;oBACD,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,2CAA2C;QAC3C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAA;QACxB,OAAO,SAAS,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CACtB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,CAAC,CACF,CAAA;YACD,2DAA2D;YAC3D,gDAAgD;YAChD,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACnD,mDAAmD;gBACnD,MAAM,GAAG,GAAG,IAAI,CAAC,0BAA0B,CACzC,IAAI,EACJ,YAAY,EACZ,SAAS,GAAG,IAAI,CAAC,MAAM,EACvB,SAAS,GAAG,CAAC,EACb,OAAO,EACP,aAAa,GAAG,CAAC,EACjB,OAAO,CACR,CAAA;gBACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;oBAClB,OAAO,GAAG,CAAA;gBACZ,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;YACzB,IACE,CAAC,KAAK,GAAG;gBACT,CAAC,KAAK,IAAI;gBACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACxC,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,SAAS,EAAE,CAAA;QACb,CAAC;QACD,kCAAkC;QAClC,OAAO,OAAO,IAAI,IAAI,CAAA;IACxB,CAAC;IAED,SAAS,CACP,IAAc,EACd,OAAsB,EACtB,OAAgB,EAChB,SAAiB,EACjB,YAAoB;QAEpB,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,IAAI,EAAU,CAAA;QACd,KACE,EAAE,GAAG,SAAS;YACZ,EAAE,GAAG,YAAY;YACjB,EAAE,GAAG,IAAI,CAAC,MAAM;YAChB,EAAE,GAAG,OAAO,CAAC,MAAM,EACrB,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAClB,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAC3B,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;YAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAEzB,wBAAwB;YACxB,wCAAwC;YACxC,qBAAqB;YACrB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,gBAAQ,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAA;YACd,CAAC;YACD,oBAAoB;YAEpB,0BAA0B;YAC1B,gDAAgD;YAChD,qDAAqD;YACrD,IAAI,GAAY,CAAA;YAChB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;gBACb,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACf,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YACxC,CAAC;YAED,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAA;QACxB,CAAC;QAED,oDAAoD;QACpD,oDAAoD;QACpD,2CAA2C;QAC3C,kDAAkD;QAClD,oDAAoD;QACpD,uDAAuD;QACvD,oDAAoD;QACpD,yDAAyD;QACzD,6BAA6B;QAC7B,yCAAyC;QAEzC,gEAAgE;QAChE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3B,oDAAoD;YACpD,gBAAgB;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,+CAA+C;YAC/C,iDAAiD;YACjD,uBAAuB;YACvB,OAAO,OAAO,CAAA;QAChB,CAAC;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,4CAA4C;YAC5C,oDAAoD;YACpD,iDAAiD;YACjD,wBAAwB;YACxB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YAEvC,qBAAqB;QACvB,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;QACzB,CAAC;QACD,oBAAoB;IACtB,CAAC;IAED,WAAW;QACT,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,YAAY;QACZ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,gBAAQ,CAAA;QACrC,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAA;QAE7B,uDAAuD;QACvD,0DAA0D;QAC1D,IAAI,CAA0B,CAAA;QAC9B,IAAI,QAAQ,GAAoC,IAAI,CAAA;QACpD,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAChC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAA;QACjD,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC7C,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,CAAC;oBACX,uBAAuB;oBACzB,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;oBACjC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3B,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,CAAC;oBACX,mBAAmB;oBACrB,CAAC,CAAC,gBAAgB;gBACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa;oBAC7B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAC9C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAA;QAC/D,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,WAAW,CAAA;QACxB,CAAC;QAED,MAAM,EAAE,GAAG,YAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,IAAI,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YACvC,2CAA2C;YAC3C,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QAE5D,mDAAmD;QACnD,4BAA4B;QAC5B,EAAE;QACF,wDAAwD;QACxD,yDAAyD;QACzD,2CAA2C;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QAEpB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,MAAM,OAAO,GACX,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;gBAC1B,CAAC,CAAC,YAAY,CAAA;QAChB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAElD,kCAAkC;QAClC,kDAAkD;QAClD,sEAAsE;QACtE,iDAAiD;QACjD,8DAA8D;QAC9D,mCAAmC;QACnC,IAAI,EAAE,GAAG,GAAG;aACT,GAAG,CAAC,OAAO,CAAC,EAAE;YACb,MAAM,EAAE,GAAiC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACvD,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACjD,CAAC;gBACD,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC,KAAK,gBAAQ,CAAC,CAAC,CAAC,gBAAQ;wBAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,CACT,CAAA;YACH,CAAC,CAAiC,CAAA;YAClC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,IAAI,CAAC,KAAK,gBAAQ,IAAI,IAAI,KAAK,gBAAQ,EAAE,CAAC;oBACxC,OAAM;gBACR,CAAC;gBACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,gBAAQ,EAAE,CAAC;wBAC5C,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAA;oBAClD,CAAC;yBAAM,CAAC;wBACN,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;oBACjB,CAAC;gBACH,CAAC;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,IAAI,CAAA;gBAClD,CAAC;qBAAM,IAAI,IAAI,KAAK,gBAAQ,EAAE,CAAC;oBAC7B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;oBACzD,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAQ,CAAA;gBACtB,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,gBAAQ,CAAC,CAAA;YAE/C,yDAAyD;YACzD,wDAAwD;YACxD,iEAAiE;YACjE,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAa,EAAE,CAAA;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBACD,OAAO,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;YACzC,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAA;QAEZ,+DAA+D;QAC/D,mEAAmE;QACnE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,4BAA4B;QAC5B,gDAAgD;QAChD,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA;QAElC,kFAAkF;QAClF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,GAAG,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAA;QACzD,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM;YAAE,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;QAE1C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YACjD,qBAAqB;QACvB,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,uBAAuB;YACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACrB,CAAC;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,UAAU,CAAC,CAAS;QAClB,mDAAmD;QACnD,6DAA6D;QAC7D,8CAA8C;QAC9C,0CAA0C;QAC1C,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,sCAAsC;YACtC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAS,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,8CAA8C;QAC9C,iBAAiB;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;QAED,6CAA6C;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAErC,0DAA0D;QAC1D,2DAA2D;QAC3D,mCAAmC;QACnC,uCAAuC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAEpC,0EAA0E;QAC1E,IAAI,QAAQ,GAAW,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrD,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;YACnB,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACjD,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAA;gBACb,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;YACrB,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,8BAA8B;QAC9B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAqB;QACnC,OAAO,iBAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IAC1C,CAAC;CACF;AAtjCD,8BAsjCC;AACD,qBAAqB;AACrB,mCAA8B;AAArB,6FAAA,GAAG,OAAA;AACZ,yCAAoC;AAA3B,mGAAA,MAAM,OAAA;AACf,6CAAwC;AAA/B,uGAAA,QAAQ,OAAA;AACjB,oBAAoB;AACpB,iBAAS,CAAC,GAAG,GAAG,YAAG,CAAA;AACnB,iBAAS,CAAC,SAAS,GAAG,SAAS,CAAA;AAC/B,iBAAS,CAAC,MAAM,GAAG,kBAAM,CAAA;AACzB,iBAAS,CAAC,QAAQ,GAAG,sBAAQ,CAAA","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n /** do not expand `{x,y}` style braces */\n nobrace?: boolean\n /** do not treat patterns starting with `#` as a comment */\n nocomment?: boolean\n /** do not treat patterns starting with `!` as a negation */\n nonegate?: boolean\n /** print LOTS of debugging output */\n debug?: boolean\n /** treat `**` the same as `*` */\n noglobstar?: boolean\n /** do not expand extglobs like `+(a|b)` */\n noext?: boolean\n /** return the pattern if nothing matches */\n nonull?: boolean\n /** treat `\\\\` as a path separator, not an escape character */\n windowsPathsNoEscape?: boolean\n /**\n * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n * @deprecated\n */\n allowWindowsEscape?: boolean\n /**\n * Compare a partial path to a pattern. As long as the parts\n * of the path that are present are not contradicted by the\n * pattern, it will be treated as a match. This is useful in\n * applications where you're walking through a folder structure,\n * and don't yet have the full path, but want to ensure that you\n * do not walk down paths that can never be a match.\n */\n partial?: boolean\n /** allow matches that start with `.` even if the pattern does not */\n dot?: boolean\n /** ignore case */\n nocase?: boolean\n /** ignore case only in wildcard patterns */\n nocaseMagicOnly?: boolean\n /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n magicalBraces?: boolean\n /**\n * If set, then patterns without slashes will be matched\n * against the basename of the path if it contains slashes.\n * For example, `a?b` would match the path `/xyz/123/acb`, but\n * not `/xyz/acb/123`.\n */\n matchBase?: boolean\n /** invert the results of negated matches */\n flipNegate?: boolean\n /** do not collapse multiple `/` into a single `/` */\n preserveMultipleSlashes?: boolean\n /**\n * A number indicating the level of optimization that should be done\n * to the pattern prior to parsing and using it for matches.\n */\n optimizationLevel?: number\n /** operating system platform */\n platform?: Platform\n /**\n * When a pattern starts with a UNC path or drive letter, and in\n * `nocase:true` mode, do not convert the root portions of the\n * pattern into a case-insensitive regular expression, and instead\n * leave them as strings.\n *\n * This is the default when the platform is `win32` and\n * `nocase:true` is set.\n */\n windowsNoMagicRoot?: boolean\n /**\n * max number of `{...}` patterns to expand. Default 100_000.\n */\n braceExpandMax?: number\n /**\n * Max number of non-adjacent `**` patterns to recursively walk down.\n *\n * The default of 200 is almost certainly high enough for most purposes,\n * and can handle absurdly excessive patterns.\n */\n maxGlobstarRecursion?: number\n\n /**\n * Max depth to traverse for nested extglobs like `*(a|b|c)`\n *\n * Default is 2, which is quite low, but any higher value\n * swiftly results in punishing performance impacts. Note\n * that this is *not* relevant when the globstar types can\n * be safely coalesced into a single set.\n *\n * For example, `*(a|@(b|c)|d)` would be flattened into\n * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n * performance and never hit this limit, even if they are\n * excessively deep and complicated.\n *\n * If the limit is hit, then the extglob characters are simply\n * not parsed, and the pattern effectively switches into\n * `noextglob: true` mode for the contents of that nested\n * sub-pattern. This will typically _not_ result in a match,\n * but is considered a valid trade-off for security and\n * performance.\n */\n maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process ?\n (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) =>\n orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n ) => orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n maxGlobstarRecursion: number\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n // avoid the annoying deprecation flag lol\n const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options[awe] === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined ?\n options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [\n ...s.slice(0, 4),\n ...s.slice(4).map(ss => this.parse(ss)),\n ]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean = false,\n ) {\n let fileStartIndex = 0\n let patternStartIndex = 0\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive =\n typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi =\n fileUNC ? 3\n : fileDrive ? 0\n : undefined\n const pdi =\n patternUNC ? 3\n : patternDrive ? 0\n : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [\n file[fdi],\n pattern[pdi] as string,\n ]\n // start matching at the drive letter index of each\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n patternStartIndex = pdi\n fileStartIndex = fdi\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n if (pattern.includes(GLOBSTAR)) {\n return this.#matchGlobstar(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n return this.#matchOne(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n #matchGlobstar(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n // split the pattern into head, tail, and middle of ** delimited parts\n const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n // split the pattern up into globstar-delimited sections\n // the tail has to be at the end, and the others just have\n // to be found in order from the head.\n const [head, body, tail] = partial ? [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1),\n [],\n ] : [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1, lastgs),\n pattern.slice(lastgs + 1),\n ]\n\n // check the head, from the current file/pattern index.\n if (head.length) {\n const fileHead = file.slice(fileIndex, fileIndex + head.length)\n if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n return false\n }\n fileIndex += head.length\n patternIndex += head.length\n }\n // now we know the head matches!\n\n // if the last portion is not empty, it MUST match the end\n // check the tail\n let fileTailMatch: number = 0\n if (tail.length) {\n // if head + tail > file, then we cannot possibly match\n if (tail.length + fileIndex > file.length) return false\n\n // try to match the tail\n let tailStart = file.length - tail.length\n if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n fileTailMatch = tail.length\n } else {\n // affordance for stuff like a/**/* matching a/b/\n // if the last file portion is '', and there's more to the pattern\n // then try without the '' bit.\n if (\n file[file.length - 1] !== '' ||\n fileIndex + tail.length === file.length\n ) {\n return false\n }\n tailStart--\n if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n return false\n }\n fileTailMatch = tail.length + 1\n }\n }\n\n // now we know the tail matches!\n\n // the middle is zero or more portions wrapped in **, possibly\n // containing more ** sections.\n // so a/**/b/**/c/**/d has become **/b/**/c/**\n // if it's empty, it means a/**/b, just verify we have no bad dots\n // if there's no tail, so it ends on /**, then we must have *something*\n // after the head, or it's not a matc\n if (!body.length) {\n let sawSome = !!fileTailMatch\n for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n const f = String(file[i])\n sawSome = true\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n // in partial mode, we just need to get past all file parts\n return partial || sawSome\n }\n\n // now we know that there's one or more body sections, which can\n // be matched anywhere from the 0 index (because the head was pruned)\n // through to the length-fileTailMatch index.\n // split the body up into sections, and note the minimum index it can\n // be found at (start with the length of all previous segments)\n // [section, before, after]\n const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n let currentBody: [ParseReturn[], number] = bodySegments[0]\n let nonGsParts = 0\n const nonGsPartsSums: number[] = [0]\n for (const b of body) {\n if (b === GLOBSTAR) {\n nonGsPartsSums.push(nonGsParts)\n currentBody = [[], 0]\n bodySegments.push(currentBody)\n } else {\n currentBody[0].push(b)\n nonGsParts++\n }\n }\n let i = bodySegments.length - 1\n const fileLength = file.length - fileTailMatch\n for (const b of bodySegments) {\n b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n }\n\n return !!this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex,\n 0,\n partial,\n 0,\n !!fileTailMatch,\n )\n }\n\n // return false for \"nope, not matching\"\n // return null for \"not matching, cannot keep trying\"\n #matchGlobStarBodySections(\n file: string[],\n // pattern section, last possible position for it\n bodySegments: [ParseReturn[], number][],\n fileIndex: number,\n bodyIndex: number,\n partial: boolean,\n globStarDepth: number,\n sawTail: boolean,\n ): boolean | null {\n // take the first body segment, and walk from fileIndex to its \"after\"\n // value at the end\n // If it doesn't match at that position, we increment, until we hit\n // that final possible position, and give up.\n // If it does match, then advance and try to rest.\n // If any of them fail we keep walking forward.\n // this is still a bit recursively painful, but it's more constrained\n // than previous implementations, because we never test something that\n // can't possibly be a valid matching condition.\n const bs = bodySegments[bodyIndex]\n if (!bs) {\n // just make sure that there's no bad dots\n for (let i = fileIndex; i < file.length; i++) {\n sawTail = true\n const f = file[i]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n return sawTail\n }\n\n // have a non-globstar body section to test\n const [body, after] = bs\n while (fileIndex <= after) {\n const m = this.#matchOne(\n file.slice(0, fileIndex + body.length),\n body,\n partial,\n fileIndex,\n 0,\n )\n // if limit exceeded, no match. intentional false negative,\n // acceptable break in correctness for security.\n if (m && globStarDepth < this.maxGlobstarRecursion) {\n // match! see if the rest match. if so, we're done!\n const sub = this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex + body.length,\n bodyIndex + 1,\n partial,\n globStarDepth + 1,\n sawTail,\n )\n if (sub !== false) {\n return sub\n }\n }\n const f = file[fileIndex]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n\n fileIndex++\n }\n // walked off. no point continuing\n return partial || null\n }\n\n #matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n let fi: number\n let pi: number\n let pl: number\n let fl: number\n for (\n fi = fileIndex,\n pi = patternIndex,\n fl = file.length,\n pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n let p = pattern[pi]\n let f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false || p === GLOBSTAR) {\n return false\n }\n /* c8 ignore stop */\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot ? starDotExtTestDot\n : starDotExtTest)(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot ? qmarksTestDot\n : qmarksTest)(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar =\n options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return (\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n )\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/cjs/package.json b/deps/minimatch/dist/commonjs/package.json similarity index 100% rename from deps/minimatch/dist/cjs/package.json rename to deps/minimatch/dist/commonjs/package.json diff --git a/deps/minimatch/dist/commonjs/unescape.d.ts b/deps/minimatch/dist/commonjs/unescape.d.ts new file mode 100644 index 00000000000000..30ec8292615b74 --- /dev/null +++ b/deps/minimatch/dist/commonjs/unescape.d.ts @@ -0,0 +1,22 @@ +import { MinimatchOptions } from './index.js'; +/** + * Un-escape a string that has been escaped with {@link escape}. + * + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket 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 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 declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +//# sourceMappingURL=unescape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/unescape.d.ts.map b/deps/minimatch/dist/commonjs/unescape.d.ts.map new file mode 100644 index 00000000000000..6b84d7538f8ce4 --- /dev/null +++ b/deps/minimatch/dist/commonjs/unescape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/unescape.js b/deps/minimatch/dist/commonjs/unescape.js new file mode 100644 index 00000000000000..db8d0c847d21b1 --- /dev/null +++ b/deps/minimatch/dist/commonjs/unescape.js @@ -0,0 +1,38 @@ +"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 MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket 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 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, 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'); +}; +exports.unescape = unescape; +//# sourceMappingURL=unescape.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/commonjs/unescape.js.map b/deps/minimatch/dist/commonjs/unescape.js.map new file mode 100644 index 00000000000000..8039823a097313 --- /dev/null +++ b/deps/minimatch/dist/commonjs/unescape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts new file mode 100644 index 00000000000000..34d7a78a0c5144 --- /dev/null +++ b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts @@ -0,0 +1,2 @@ +export declare const assertValidPattern: (pattern: unknown) => void; +//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map new file mode 100644 index 00000000000000..30ddcd51f6eae8 --- /dev/null +++ b/deps/minimatch/dist/esm/assert-valid-pattern.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAUtD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/assert-valid-pattern.js b/deps/minimatch/dist/esm/assert-valid-pattern.js similarity index 100% rename from deps/minimatch/dist/mjs/assert-valid-pattern.js rename to deps/minimatch/dist/esm/assert-valid-pattern.js diff --git a/deps/minimatch/dist/esm/assert-valid-pattern.js.map b/deps/minimatch/dist/esm/assert-valid-pattern.js.map new file mode 100644 index 00000000000000..550f61df5a845c --- /dev/null +++ b/deps/minimatch/dist/esm/assert-valid-pattern.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAC5D,OAAgB,EACW,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: unknown) => void = (\n pattern: unknown,\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.d.ts b/deps/minimatch/dist/esm/ast.d.ts new file mode 100644 index 00000000000000..27845ea71fb977 --- /dev/null +++ b/deps/minimatch/dist/esm/ast.d.ts @@ -0,0 +1,22 @@ +import { MinimatchOptions, MMRegExp } from './index.js'; +export type ExtglobType = '!' | '?' | '+' | '*' | '@'; +export declare class AST { + #private; + type: ExtglobType | null; + id: number; + get depth(): number; + constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); + get hasMagic(): boolean | undefined; + toString(): string; + push(...parts: (string | AST)[]): void; + toJSON(): any[]; + isStart(): boolean; + isEnd(): boolean; + copyIn(part: AST | string): void; + clone(parent: AST): AST; + static fromGlob(pattern: string, options?: MinimatchOptions): AST; + toMMPattern(): MMRegExp | string; + get options(): MinimatchOptions; + toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; +} +//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.d.ts.map b/deps/minimatch/dist/esm/ast.d.ts.map new file mode 100644 index 00000000000000..ec7f7898870ff2 --- /dev/null +++ b/deps/minimatch/dist/esm/ast.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AA6IrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IAexB,EAAE,SAAO;IAET,IAAI,KAAK,IAAI,MAAM,CAElB;gBAgBC,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAe/B,MAAM;IAkBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAwQjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IA2BhC,IAAI,OAAO,qBAEV;IAuED,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CA6OjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.js b/deps/minimatch/dist/esm/ast.js new file mode 100644 index 00000000000000..943a86ceb43ac1 --- /dev/null +++ b/deps/minimatch/dist/esm/ast.js @@ -0,0 +1,842 @@ +// parse a single path portion +var _a; +import { parseClass } from './brace-expressions.js'; +import { unescape } from './unescape.js'; +const types = new Set(['!', '?', '+', '*', '@']); +const isExtglobType = (c) => types.has(c); +const isExtglobAST = (c) => isExtglobType(c.type); +// Map of which extglob types can adopt the children of a nested extglob +// +// anything but ! can adopt a matching type: +// +(a|+(b|c)|d) => +(a|b|c|d) +// *(a|*(b|c)|d) => *(a|b|c|d) +// @(a|@(b|c)|d) => @(a|b|c|d) +// ?(a|?(b|c)|d) => ?(a|b|c|d) +// +// * can adopt anything, because 0 or repetition is allowed +// *(a|?(b|c)|d) => *(a|b|c|d) +// *(a|+(b|c)|d) => *(a|b|c|d) +// *(a|@(b|c)|d) => *(a|b|c|d) +// +// + can adopt @, because 1 or repetition is allowed +// +(a|@(b|c)|d) => +(a|b|c|d) +// +// + and @ CANNOT adopt *, because 0 would be allowed +// +(a|*(b|c)|d) => would match "", on *(b|c) +// @(a|*(b|c)|d) => would match "", on *(b|c) +// +// + and @ CANNOT adopt ?, because 0 would be allowed +// +(a|?(b|c)|d) => would match "", on ?(b|c) +// @(a|?(b|c)|d) => would match "", on ?(b|c) +// +// ? can adopt @, because 0 or 1 is allowed +// ?(a|@(b|c)|d) => ?(a|b|c|d) +// +// ? and @ CANNOT adopt * or +, because >1 would be allowed +// ?(a|*(b|c)|d) => would match bbb on *(b|c) +// @(a|*(b|c)|d) => would match bbb on *(b|c) +// ?(a|+(b|c)|d) => would match bbb on +(b|c) +// @(a|+(b|c)|d) => would match bbb on +(b|c) +// +// ! CANNOT adopt ! (nothing else can either) +// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c) +// +// ! can adopt @ +// !(a|@(b|c)|d) => !(a|b|c|d) +// +// ! CANNOT adopt * +// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt + +// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed +// +// ! CANNOT adopt ? +// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match "x" +const adoptionMap = new Map([ + ['!', ['@']], + ['?', ['?', '@']], + ['@', ['@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@']], +]); +// nested extglobs that can be adopted in, but with the addition of +// a blank '' element. +const adoptionWithSpaceMap = new Map([ + ['!', ['?']], + ['@', ['?']], + ['+', ['?', '*']], +]); +// union of the previous two maps +const adoptionAnyMap = new Map([ + ['!', ['?', '@']], + ['?', ['?', '@']], + ['@', ['?', '@']], + ['*', ['*', '+', '?', '@']], + ['+', ['+', '@', '?', '*']], +]); +// Extglobs that can take over their parent if they are the only child +// the key is parent, value maps child to resulting extglob parent type +// '@' is omitted because it's a special case. An `@` extglob with a single +// member can always be usurped by that subpattern. +const usurpMap = new Map([ + ['!', new Map([['!', '@']])], + [ + '?', + new Map([ + ['*', '*'], + ['+', '*'], + ]), + ], + [ + '@', + new Map([ + ['!', '!'], + ['?', '?'], + ['@', '@'], + ['*', '*'], + ['+', '+'], + ]), + ], + [ + '+', + new Map([ + ['?', '*'], + ['*', '*'], + ]), + ], +]); +// 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') +let ID = 0; +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; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [Symbol.for('nodejs.util.inspect.custom')]() { + return { + '@@type': 'AST', + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts, + }; + } + 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 _a && 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 _a && 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 _a(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; + 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; + } + // we don't have to check for adoption here, because that's + // done at the other recursion point. + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + extDepth <= maxDepth; + if (doRecurse) { + ast.push(acc); + acc = ''; + const ext = new _a(c, ast); + i = _a.#parseAST(str, ext, i, opt, extDepth + 1); + 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 _a(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; + } + const doRecurse = !opt.noext && + isExtglobType(c) && + str.charAt(i) === '(' && + /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || (ast && ast.#canAdoptType(c))); + /* c8 ignore stop */ + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; + part.push(acc); + acc = ''; + const ext = new _a(c, part); + part.push(ext); + i = _a.#parseAST(str, ext, i, opt, extDepth + depthAdd); + continue; + } + if (c === '|') { + part.push(acc); + acc = ''; + parts.push(part); + part = new _a(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; + } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(''); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === 'object') + p.#parent = this; + } + this.#toString = undefined; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!(m?.has(c)); + } + #canUsurp(child) { + if (!child || + typeof child !== 'object' || + child.type !== null || + child.#parts.length !== 1 || + this.type === null || + this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== 'object' || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + /* c8 ignore start - impossible */ + if (!nt) + return false; + /* c8 ignore stop */ + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#parent = this; + } + } + this.type = nt; + this.#toString = undefined; + this.#emptyExt = false; + } + static fromGlob(pattern, options = {}) { + const ast = new _a(null, undefined, options); + _a.#parseAST(pattern, ast, 0, options, 0); + 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.#flatten(); + this.#fillNegs(); + } + if (!isExtglobAST(this)) { + 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' ? + _a.#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(); + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = undefined; + return [s, unescape(this.toString()), false, false]; + } + 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, + ]; + } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === 'object') { + p.#flatten(); + } + } + } + else { + // do up to 10 passes to flatten as much as possible + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === 'object') { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } + else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } + else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = undefined; + } + #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; + // multiple stars that aren't globstars coalesce into one * + let inStar = 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 (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star; + hasMagic = true; + continue; + } + else { + inStar = false; + } + 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 === '?') { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, unescape(glob), !!hasMagic, uflag]; + } +} +_a = AST; +//# sourceMappingURL=ast.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/ast.js.map b/deps/minimatch/dist/esm/ast.js.map new file mode 100644 index 00000000000000..abf30629460b79 --- /dev/null +++ b/deps/minimatch/dist/esm/ast.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string | null): c is ExtglobType =>\n types.has(c as ExtglobType)\nconst isExtglobAST = (c: AST): c is AST & { type: ExtglobType } =>\n isExtglobType(c.type)\n\n// Map of which extglob types can adopt the children of a nested extglob\n//\n// anything but ! can adopt a matching type:\n// +(a|+(b|c)|d) => +(a|b|c|d)\n// *(a|*(b|c)|d) => *(a|b|c|d)\n// @(a|@(b|c)|d) => @(a|b|c|d)\n// ?(a|?(b|c)|d) => ?(a|b|c|d)\n//\n// * can adopt anything, because 0 or repetition is allowed\n// *(a|?(b|c)|d) => *(a|b|c|d)\n// *(a|+(b|c)|d) => *(a|b|c|d)\n// *(a|@(b|c)|d) => *(a|b|c|d)\n//\n// + can adopt @, because 1 or repetition is allowed\n// +(a|@(b|c)|d) => +(a|b|c|d)\n//\n// + and @ CANNOT adopt *, because 0 would be allowed\n// +(a|*(b|c)|d) => would match \"\", on *(b|c)\n// @(a|*(b|c)|d) => would match \"\", on *(b|c)\n//\n// + and @ CANNOT adopt ?, because 0 would be allowed\n// +(a|?(b|c)|d) => would match \"\", on ?(b|c)\n// @(a|?(b|c)|d) => would match \"\", on ?(b|c)\n//\n// ? can adopt @, because 0 or 1 is allowed\n// ?(a|@(b|c)|d) => ?(a|b|c|d)\n//\n// ? and @ CANNOT adopt * or +, because >1 would be allowed\n// ?(a|*(b|c)|d) => would match bbb on *(b|c)\n// @(a|*(b|c)|d) => would match bbb on *(b|c)\n// ?(a|+(b|c)|d) => would match bbb on +(b|c)\n// @(a|+(b|c)|d) => would match bbb on +(b|c)\n//\n// ! CANNOT adopt ! (nothing else can either)\n// !(a|!(b|c)|d) => !(a|b|c|d) would fail to match on b (not not b|c)\n//\n// ! can adopt @\n// !(a|@(b|c)|d) => !(a|b|c|d)\n//\n// ! CANNOT adopt *\n// !(a|*(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt +\n// !(a|+(b|c)|d) => !(a|b|c|d) would match on bbb, not allowed\n//\n// ! CANNOT adopt ?\n// x!(a|?(b|c)|d) => x!(a|b|c|d) would fail to match \"x\"\nconst adoptionMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['@']],\n ['?', ['?', '@']],\n ['@', ['@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@']],\n])\n\n// nested extglobs that can be adopted in, but with the addition of\n// a blank '' element.\nconst adoptionWithSpaceMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?']],\n ['@', ['?']],\n ['+', ['?', '*']],\n])\n\n// union of the previous two maps\nconst adoptionAnyMap = new Map<ExtglobType, ExtglobType[]>([\n ['!', ['?', '@']],\n ['?', ['?', '@']],\n ['@', ['?', '@']],\n ['*', ['*', '+', '?', '@']],\n ['+', ['+', '@', '?', '*']],\n])\n\n// Extglobs that can take over their parent if they are the only child\n// the key is parent, value maps child to resulting extglob parent type\n// '@' is omitted because it's a special case. An `@` extglob with a single\n// member can always be usurped by that subpattern.\nconst usurpMap = new Map<ExtglobType, Map<ExtglobType | null, ExtglobType | null>>([\n ['!', new Map([['!', '@']])],\n [\n '?',\n new Map([\n ['*', '*'],\n ['+', '*'],\n ]),\n ],\n [\n '@',\n new Map([\n ['!', '!'],\n ['?', '?'],\n ['@', '@'],\n ['*', '*'],\n ['+', '+'],\n ]),\n ],\n [\n '+',\n new Map([\n ['?', '*'],\n ['*', '*'],\n ]),\n ],\n])\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nlet ID = 0\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n #parent?: AST\n #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n id = ++ID\n\n get depth(): number {\n return (this.#parent?.depth ?? -1) + 1\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return {\n '@@type': 'AST',\n id: this.id,\n type: this.type,\n root: this.#root.id,\n parent: this.#parent?.id,\n depth: this.depth,\n partsLength: this.#parts.length,\n parts: this.#parts,\n }\n }\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (\n typeof p !== 'string' &&\n !(p instanceof AST && p.#parent === this)\n ) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null ?\n this.#parts\n .slice()\n .map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions,\n extDepth: number,\n ): number {\n const maxDepth = opt.maxExtglobRecursion ?? 2\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n // we don't have to check for adoption here, because that's\n // done at the other recursion point.\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n extDepth <= maxDepth\n if (doRecurse) {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt, extDepth + 1)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n const doRecurse =\n !opt.noext &&\n isExtglobType(c) &&\n str.charAt(i) === '(' &&\n /* c8 ignore start - the maxDepth is sufficient here */\n (extDepth <= maxDepth || (ast && ast.#canAdoptType(c)))\n /* c8 ignore stop */\n if (doRecurse) {\n const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt, extDepth + depthAdd)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n #canAdoptWithSpace(child?: AST | string): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n return this.#canAdopt(child, adoptionWithSpaceMap)\n }\n\n #canAdopt(\n child?: AST | string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionMap,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canAdoptType(\n gc.type,\n map,\n )\n }\n #canAdoptType(\n c: string,\n map: Map<ExtglobType, ExtglobType[]> = adoptionAnyMap,\n ): c is ExtglobType {\n return !!map.get(this.type as ExtglobType)?.includes(c as ExtglobType)\n }\n\n #adoptWithSpace(\n this: AST & { type: ExtglobType },\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const blank = new AST(null, gc, this.options)\n blank.#parts.push('')\n gc.push(blank)\n this.#adopt(child, index)\n }\n\n #adopt(\n child: AST & {\n type: null\n },\n index: number,\n ) {\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n this.#parts.splice(index, 1, ...gc.#parts)\n for (const p of gc.#parts) {\n if (typeof p === 'object') p.#parent = this\n }\n this.#toString = undefined\n }\n\n #canUsurpType(c: string): boolean {\n const m = usurpMap.get(this.type as ExtglobType)\n return !!(m?.has(c as ExtglobType))\n }\n\n #canUsurp (\n child?: AST | string,\n ): child is AST & {\n type: null\n parts: [AST & { type: ExtglobType }]\n } {\n if (\n !child ||\n typeof child !== 'object' ||\n child.type !== null ||\n child.#parts.length !== 1 ||\n this.type === null ||\n this.#parts.length !== 1\n ) {\n return false\n }\n const gc = child.#parts[0]\n if (!gc || typeof gc !== 'object' || gc.type === null) {\n return false\n }\n return (this as AST & { type: ExtglobType }).#canUsurpType(gc.type)\n }\n\n #usurp(this: AST & { type: ExtglobType }, child: AST & { type: null }) {\n const m = usurpMap.get(this.type as ExtglobType)\n const gc = child.#parts[0] as AST & { type: ExtglobType }\n const nt = m?.get(gc.type)\n /* c8 ignore start - impossible */\n if (!nt) return false\n /* c8 ignore stop */\n this.#parts = gc.#parts\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#parent = this\n }\n }\n this.type = nt\n this.#toString = undefined\n this.#emptyExt = false\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options, 0)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) {\n this.#flatten()\n this.#fillNegs()\n }\n if (!isExtglobAST(this)) {\n const noEmpty =\n this.isStart() &&\n this.isEnd() &&\n !this.#parts.some(s => typeof s !== 'string')\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string' ?\n AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start =\n needNoTrav ? startNoTraversal\n : needNoDot ? startNoDot\n : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n const me = this as AST\n me.#parts = [s]\n me.type = null\n me.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot ?\n ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!' ?\n // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@' ? ')'\n : this.type === '?' ? ')?'\n : this.type === '+' && bodyDotAllowed ? ')'\n : this.type === '*' && bodyDotAllowed ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #flatten() {\n if (!isExtglobAST(this)) {\n for (const p of this.#parts) {\n if (typeof p === 'object') {\n p.#flatten()\n }\n }\n } else {\n // do up to 10 passes to flatten as much as possible\n let iterations = 0\n let done = false\n do {\n done = true\n for (let i = 0; i < this.#parts.length; i++) {\n const c = this.#parts[i]\n if (typeof c === 'object') {\n c.#flatten()\n if (this.#canAdopt(c)) {\n done = false\n this.#adopt(c, i)\n } else if (this.#canAdoptWithSpace(c)) {\n done = false\n this.#adoptWithSpace(c, i)\n } else if (this.#canUsurp(c)) {\n done = false\n this.#usurp(c)\n }\n }\n }\n } while (!done && ++iterations < 10)\n }\n this.#toString = undefined\n }\n\n #partsToRegExp(this: AST & { type: ExtglobType }, dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false,\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n // multiple stars that aren't globstars coalesce into one *\n let inStar = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '*') {\n if (inStar) continue\n inStar = true\n re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star\n hasMagic = true\n continue\n } else {\n inStar = false\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/brace-expressions.d.ts b/deps/minimatch/dist/esm/brace-expressions.d.ts similarity index 100% rename from deps/minimatch/dist/mjs/brace-expressions.d.ts rename to deps/minimatch/dist/esm/brace-expressions.d.ts diff --git a/deps/minimatch/dist/esm/brace-expressions.d.ts.map b/deps/minimatch/dist/esm/brace-expressions.d.ts.map new file mode 100644 index 00000000000000..09b4c11060de78 --- /dev/null +++ b/deps/minimatch/dist/esm/brace-expressions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,UAAU,MAAM,KACf,gBA2HF,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/brace-expressions.js b/deps/minimatch/dist/esm/brace-expressions.js new file mode 100644 index 00000000000000..4b49d40bd74210 --- /dev/null +++ b/deps/minimatch/dist/esm/brace-expressions.js @@ -0,0 +1,146 @@ +// translate the various posix character classes into unicode properties +// this works across all unicode locales +// { <posix class>: [<translation>, /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<more...>] 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/minimatch/dist/esm/brace-expressions.js.map b/deps/minimatch/dist/esm/brace-expressions.js.map new file mode 100644 index 00000000000000..184b5a89c11f4c --- /dev/null +++ b/deps/minimatch/dist/esm/brace-expressions.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } =\n {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n }\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean,\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number,\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length ? '(' + sranges + '|' + snegs + ')'\n : ranges.length ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.d.ts b/deps/minimatch/dist/esm/escape.d.ts new file mode 100644 index 00000000000000..92e88c8f08825b --- /dev/null +++ b/deps/minimatch/dist/esm/escape.d.ts @@ -0,0 +1,15 @@ +import { MinimatchOptions } from './index.js'; +/** + * Escape all magic characters in a glob pattern. + * + * 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 declare const escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.d.ts.map b/deps/minimatch/dist/esm/escape.d.ts.map new file mode 100644 index 00000000000000..e8d8a693fa4021 --- /dev/null +++ b/deps/minimatch/dist/esm/escape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAazE,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.js b/deps/minimatch/dist/esm/escape.js new file mode 100644 index 00000000000000..46d0ec8858e5b3 --- /dev/null +++ b/deps/minimatch/dist/esm/escape.js @@ -0,0 +1,26 @@ +/** + * Escape all magic characters in a glob pattern. + * + * 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, 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, '\\$&'); +}; +//# sourceMappingURL=escape.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/escape.js.map b/deps/minimatch/dist/esm/escape.js.map new file mode 100644 index 00000000000000..f6733c65f13df2 --- /dev/null +++ b/deps/minimatch/dist/esm/escape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,KAAK,MAC+C,EAAE,EACxE,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n *\n * If the {@link MinimatchOptions.magicalBraces} option is used,\n * then braces (`{` and `}`) will be escaped.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]{}]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\{}]/g, '\\\\$&')\n }\n return windowsPathsNoEscape ?\n s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/index.d.ts b/deps/minimatch/dist/esm/index.d.ts new file mode 100644 index 00000000000000..137bd803690752 --- /dev/null +++ b/deps/minimatch/dist/esm/index.d.ts @@ -0,0 +1,174 @@ +import { AST } from './ast.js'; +export type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; +export interface MinimatchOptions { + /** do not expand `{x,y}` style braces */ + nobrace?: boolean; + /** do not treat patterns starting with `#` as a comment */ + nocomment?: boolean; + /** do not treat patterns starting with `!` as a negation */ + nonegate?: boolean; + /** print LOTS of debugging output */ + debug?: boolean; + /** treat `**` the same as `*` */ + noglobstar?: boolean; + /** do not expand extglobs like `+(a|b)` */ + noext?: boolean; + /** return the pattern if nothing matches */ + nonull?: boolean; + /** treat `\\` as a path separator, not an escape character */ + windowsPathsNoEscape?: boolean; + /** + * inverse of {@link MinimatchOptions.windowsPathsNoEscape} + * @deprecated + */ + allowWindowsEscape?: boolean; + /** + * Compare a partial path to a pattern. As long as the parts + * of the path that are present are not contradicted by the + * pattern, it will be treated as a match. This is useful in + * applications where you're walking through a folder structure, + * and don't yet have the full path, but want to ensure that you + * do not walk down paths that can never be a match. + */ + partial?: boolean; + /** allow matches that start with `.` even if the pattern does not */ + dot?: boolean; + /** ignore case */ + nocase?: boolean; + /** ignore case only in wildcard patterns */ + nocaseMagicOnly?: boolean; + /** consider braces to be "magic" for the purpose of `hasMagic` */ + magicalBraces?: boolean; + /** + * If set, then patterns without slashes will be matched + * against the basename of the path if it contains slashes. + * For example, `a?b` would match the path `/xyz/123/acb`, but + * not `/xyz/acb/123`. + */ + matchBase?: boolean; + /** invert the results of negated matches */ + flipNegate?: boolean; + /** do not collapse multiple `/` into a single `/` */ + preserveMultipleSlashes?: boolean; + /** + * A number indicating the level of optimization that should be done + * to the pattern prior to parsing and using it for matches. + */ + optimizationLevel?: number; + /** operating system platform */ + platform?: Platform; + /** + * When a pattern starts with a UNC path or drive letter, and in + * `nocase:true` mode, do not convert the root portions of the + * pattern into a case-insensitive regular expression, and instead + * leave them as strings. + * + * This is the default when the platform is `win32` and + * `nocase:true` is set. + */ + windowsNoMagicRoot?: boolean; + /** + * max number of `{...}` patterns to expand. Default 100_000. + */ + braceExpandMax?: number; + /** + * Max number of non-adjacent `**` patterns to recursively walk down. + * + * The default of 200 is almost certainly high enough for most purposes, + * and can handle absurdly excessive patterns. + */ + maxGlobstarRecursion?: number; + /** + * Max depth to traverse for nested extglobs like `*(a|b|c)` + * + * Default is 2, which is quite low, but any higher value + * swiftly results in punishing performance impacts. Note + * that this is *not* relevant when the globstar types can + * be safely coalesced into a single set. + * + * For example, `*(a|@(b|c)|d)` would be flattened into + * `*(a|b|c|d)`. Thus, many common extglobs will retain good + * performance and never hit this limit, even if they are + * excessively deep and complicated. + * + * If the limit is hit, then the extglob characters are simply + * not parsed, and the pattern effectively switches into + * `noextglob: true` mode for the contents of that nested + * sub-pattern. This will typically _not_ result in a match, + * but is considered a valid trade-off for security and + * performance. + */ + maxExtglobRecursion?: number; +} +export declare const minimatch: { + (p: string, pattern: string, options?: MinimatchOptions): boolean; + sep: Sep; + GLOBSTAR: typeof GLOBSTAR; + filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; + defaults: (def: MinimatchOptions) => typeof minimatch; + braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; + makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; + match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; + AST: typeof AST; + Minimatch: typeof Minimatch; + escape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; + unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +}; +export type Sep = '\\' | '/'; +export declare const sep: Sep; +export declare const GLOBSTAR: unique symbol; +export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; +export declare const defaults: (def: MinimatchOptions) => typeof minimatch; +export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; +export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; +export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; +export type MMRegExp = RegExp & { + _src?: string; + _glob?: string; +}; +export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; +export type ParseReturn = ParseReturnFiltered | false; +export declare class Minimatch { + #private; + options: MinimatchOptions; + set: ParseReturnFiltered[][]; + pattern: string; + windowsPathsNoEscape: boolean; + nonegate: boolean; + negate: boolean; + comment: boolean; + empty: boolean; + preserveMultipleSlashes: boolean; + partial: boolean; + globSet: string[]; + globParts: string[][]; + nocase: boolean; + isWindows: boolean; + platform: Platform; + windowsNoMagicRoot: boolean; + maxGlobstarRecursion: number; + regexp: false | null | MMRegExp; + constructor(pattern: string, options?: MinimatchOptions); + hasMagic(): boolean; + debug(..._: any[]): void; + make(): void; + preprocess(globParts: string[][]): string[][]; + adjascentGlobstarOptimize(globParts: string[][]): string[][]; + levelOneOptimize(globParts: string[][]): string[][]; + levelTwoFileOptimize(parts: string | string[]): string[]; + firstPhasePreProcess(globParts: string[][]): string[][]; + secondPhasePreProcess(globParts: string[][]): string[][]; + partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; + parseNegate(): void; + matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; + braceExpand(): string[]; + parse(pattern: string): ParseReturn; + makeRe(): false | MMRegExp; + slashSplit(p: string): string[]; + match(f: string, partial?: boolean): boolean; + static defaults(def: MinimatchOptions): typeof Minimatch; +} +export { AST } from './ast.js'; +export { escape } from './escape.js'; +export { unescape } from './unescape.js'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/index.d.ts.map b/deps/minimatch/dist/esm/index.d.ts.map new file mode 100644 index 00000000000000..1c65035ac63c5a --- /dev/null +++ b/deps/minimatch/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/index.js b/deps/minimatch/dist/esm/index.js new file mode 100644 index 00000000000000..ac45d7c48e309f --- /dev/null +++ b/deps/minimatch/dist/esm/index.js @@ -0,0 +1,1108 @@ +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 <https://github.com/yetingli> for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern]; + } + return expand(pattern, { max: options.braceExpandMax }); +}; +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; + maxGlobstarRecursion; + regexp; + constructor(pattern, options = {}) { + assertValidPattern(pattern); + options = options || {}; + this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === 'win32'; + // avoid the annoying deprecation flag lol + const awe = ('allowWindow' + 'sEscape'); + this.windowsPathsNoEscape = + !!options.windowsPathsNoEscape || options[awe] === 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 ** 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; + // <pre>/<e>/<rest> -> <pre>/<rest> + 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(); + } + } + // <pre>/<p>/../<rest> -> <pre>/<rest> + 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 + // <pre> is 1 or more portions + // <rest> is 1 or more portions + // <p> is any portion other than ., .., '', or ** + // <e> 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. + // + // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} + // <pre>/<e>/<rest> -> <pre>/<rest> + // <pre>/<p>/../<rest> -> <pre>/<rest> + // **/**/<rest> -> **/<rest> + // + // **/*/<rest> -> */**/<rest> <== 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; + // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + // <pre>/**/**/<rest> -> <pre>/**/<rest> + 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--; + } + // <pre>/<e>/<rest> -> <pre>/<rest> + 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(); + } + } + // <pre>/<p>/../<rest> -> <pre>/<rest> + 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 + // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest> + // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest> + // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest> + // + // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest> + // ^-- 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) { + let fileStartIndex = 0; + let patternStartIndex = 0; + // 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], + ]; + // start matching at the drive letter index of each + if (fd.toLowerCase() === pd.toLowerCase()) { + pattern[pdi] = fd; + patternStartIndex = pdi; + fileStartIndex = fdi; + } + } + } + // resolve and reduce . and .. portions in the file as well. + // 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); + } + if (pattern.includes(GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + // split the pattern into head, tail, and middle of ** delimited parts + const firstgs = pattern.indexOf(GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(GLOBSTAR); + // split the pattern up into globstar-delimited sections + // the tail has to be at the end, and the others just have + // to be found in order from the head. + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [], + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1), + ]; + // check the head, from the current file/pattern index. + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { + return false; + } + fileIndex += head.length; + patternIndex += head.length; + } + // now we know the head matches! + // if the last portion is not empty, it MUST match the end + // check the tail + let fileTailMatch = 0; + if (tail.length) { + // if head + tail > file, then we cannot possibly match + if (tail.length + fileIndex > file.length) + return false; + // try to match the tail + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } + else { + // affordance for stuff like a/**/* matching a/b/ + // if the last file portion is '', and there's more to the pattern + // then try without the '' bit. + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false; + } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; + } + fileTailMatch = tail.length + 1; + } + } + // now we know the tail matches! + // the middle is zero or more portions wrapped in **, possibly + // containing more ** sections. + // so a/**/b/**/c/**/d has become **/b/**/c/** + // if it's empty, it means a/**/b, just verify we have no bad dots + // if there's no tail, so it ends on /**, then we must have *something* + // after the head, or it's not a matc + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i = fileIndex; i < file.length - fileTailMatch; i++) { + const f = String(file[i]); + sawSome = true; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + // in partial mode, we just need to get past all file parts + return partial || sawSome; + } + // now we know that there's one or more body sections, which can + // be matched anywhere from the 0 index (because the head was pruned) + // through to the length-fileTailMatch index. + // split the body up into sections, and note the minimum index it can + // be found at (start with the length of all previous segments) + // [section, before, after] + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } + else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, + // pattern section, last possible position for it + bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + // take the first body segment, and walk from fileIndex to its "after" + // value at the end + // If it doesn't match at that position, we increment, until we hit + // that final possible position, and give up. + // If it does match, then advance and try to rest. + // If any of them fail we keep walking forward. + // this is still a bit recursively painful, but it's more constrained + // than previous implementations, because we never test something that + // can't possibly be a valid matching condition. + const bs = bodySegments[bodyIndex]; + if (!bs) { + // just make sure that there's no bad dots + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + } + return sawTail; + } + // have a non-globstar body section to test + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + // match! see if the rest match. if so, we're done! + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === '.' || + f === '..' || + (!this.options.dot && f.startsWith('.'))) { + return false; + } + fileIndex++; + } + // walked off. no point continuing + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, + pi = patternIndex, + fl = file.length, + pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug('matchOne loop'); + let p = pattern[pi]; + let f = file[fi]; + this.debug(pattern, p, f); + // should be impossible. + // some invalid regexp stuff in the set. + /* c8 ignore start */ + if (p === false || p === GLOBSTAR) { + return false; + } + /* c8 ignore stop */ + // 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 *.<ext> 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; + } + }); + 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 |, + // 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 + '$'; + // 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 + ').+$'; + 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/minimatch/dist/esm/index.js.map b/deps/minimatch/dist/esm/index.js.map new file mode 100644 index 00000000000000..2dc46400d4755b --- /dev/null +++ b/deps/minimatch/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { expand } from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\nexport type Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n /** do not expand `{x,y}` style braces */\n nobrace?: boolean\n /** do not treat patterns starting with `#` as a comment */\n nocomment?: boolean\n /** do not treat patterns starting with `!` as a negation */\n nonegate?: boolean\n /** print LOTS of debugging output */\n debug?: boolean\n /** treat `**` the same as `*` */\n noglobstar?: boolean\n /** do not expand extglobs like `+(a|b)` */\n noext?: boolean\n /** return the pattern if nothing matches */\n nonull?: boolean\n /** treat `\\\\` as a path separator, not an escape character */\n windowsPathsNoEscape?: boolean\n /**\n * inverse of {@link MinimatchOptions.windowsPathsNoEscape}\n * @deprecated\n */\n allowWindowsEscape?: boolean\n /**\n * Compare a partial path to a pattern. As long as the parts\n * of the path that are present are not contradicted by the\n * pattern, it will be treated as a match. This is useful in\n * applications where you're walking through a folder structure,\n * and don't yet have the full path, but want to ensure that you\n * do not walk down paths that can never be a match.\n */\n partial?: boolean\n /** allow matches that start with `.` even if the pattern does not */\n dot?: boolean\n /** ignore case */\n nocase?: boolean\n /** ignore case only in wildcard patterns */\n nocaseMagicOnly?: boolean\n /** consider braces to be \"magic\" for the purpose of `hasMagic` */\n magicalBraces?: boolean\n /**\n * If set, then patterns without slashes will be matched\n * against the basename of the path if it contains slashes.\n * For example, `a?b` would match the path `/xyz/123/acb`, but\n * not `/xyz/acb/123`.\n */\n matchBase?: boolean\n /** invert the results of negated matches */\n flipNegate?: boolean\n /** do not collapse multiple `/` into a single `/` */\n preserveMultipleSlashes?: boolean\n /**\n * A number indicating the level of optimization that should be done\n * to the pattern prior to parsing and using it for matches.\n */\n optimizationLevel?: number\n /** operating system platform */\n platform?: Platform\n /**\n * When a pattern starts with a UNC path or drive letter, and in\n * `nocase:true` mode, do not convert the root portions of the\n * pattern into a case-insensitive regular expression, and instead\n * leave them as strings.\n *\n * This is the default when the platform is `win32` and\n * `nocase:true` is set.\n */\n windowsNoMagicRoot?: boolean\n /**\n * max number of `{...}` patterns to expand. Default 100_000.\n */\n braceExpandMax?: number\n /**\n * Max number of non-adjacent `**` patterns to recursively walk down.\n *\n * The default of 200 is almost certainly high enough for most purposes,\n * and can handle absurdly excessive patterns.\n */\n maxGlobstarRecursion?: number\n\n /**\n * Max depth to traverse for nested extglobs like `*(a|b|c)`\n *\n * Default is 2, which is quite low, but any higher value\n * swiftly results in punishing performance impacts. Note\n * that this is *not* relevant when the globstar types can\n * be safely coalesced into a single set.\n *\n * For example, `*(a|@(b|c)|d)` would be flattened into\n * `*(a|b|c|d)`. Thus, many common extglobs will retain good\n * performance and never hit this limit, even if they are\n * excessively deep and complicated.\n *\n * If the limit is hit, then the extglob characters are simply\n * not parsed, and the pattern effectively switches into\n * `noextglob: true` mode for the contents of that nested\n * sub-pattern. This will typically _not_ result in a match,\n * but is considered a valid trade-off for security and\n * performance.\n */\n maxExtglobRecursion?: number\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) =>\n !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) =>\n f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) =>\n f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process ?\n (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix') as Platform\n\nexport type Sep = '\\\\' | '/'\n\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep =\n defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {},\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<\n MinimatchOptions,\n 'windowsPathsNoEscape' | 'magicalBraces'\n > = {},\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) =>\n orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n ) => orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern, { max: options.braceExpandMax })\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {},\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n maxGlobstarRecursion: number\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n // avoid the annoying deprecation flag lol\n const awe = ('allowWindow' + 'sEscape') as keyof MinimatchOptions\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options[awe] === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined ?\n options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [\n ...s.slice(0, 4),\n ...s.slice(4).map(ss => this.parse(ss)),\n ]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1,\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes,\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false,\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean = false,\n ) {\n let fileStartIndex = 0\n let patternStartIndex = 0\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive =\n typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi =\n fileUNC ? 3\n : fileDrive ? 0\n : undefined\n const pdi =\n patternUNC ? 3\n : patternDrive ? 0\n : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [\n file[fdi],\n pattern[pdi] as string,\n ]\n // start matching at the drive letter index of each\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n patternStartIndex = pdi\n fileStartIndex = fdi\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // don't need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n if (pattern.includes(GLOBSTAR)) {\n return this.#matchGlobstar(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n return this.#matchOne(\n file,\n pattern,\n partial,\n fileStartIndex,\n patternStartIndex,\n )\n }\n\n #matchGlobstar(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n // split the pattern into head, tail, and middle of ** delimited parts\n const firstgs = pattern.indexOf(GLOBSTAR, patternIndex)\n const lastgs = pattern.lastIndexOf(GLOBSTAR)\n\n // split the pattern up into globstar-delimited sections\n // the tail has to be at the end, and the others just have\n // to be found in order from the head.\n const [head, body, tail] = partial ? [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1),\n [],\n ] : [\n pattern.slice(patternIndex, firstgs),\n pattern.slice(firstgs + 1, lastgs),\n pattern.slice(lastgs + 1),\n ]\n\n // check the head, from the current file/pattern index.\n if (head.length) {\n const fileHead = file.slice(fileIndex, fileIndex + head.length)\n if (!this.#matchOne(fileHead, head, partial, 0, 0)) {\n return false\n }\n fileIndex += head.length\n patternIndex += head.length\n }\n // now we know the head matches!\n\n // if the last portion is not empty, it MUST match the end\n // check the tail\n let fileTailMatch: number = 0\n if (tail.length) {\n // if head + tail > file, then we cannot possibly match\n if (tail.length + fileIndex > file.length) return false\n\n // try to match the tail\n let tailStart = file.length - tail.length\n if (this.#matchOne(file, tail, partial, tailStart, 0)) {\n fileTailMatch = tail.length\n } else {\n // affordance for stuff like a/**/* matching a/b/\n // if the last file portion is '', and there's more to the pattern\n // then try without the '' bit.\n if (\n file[file.length - 1] !== '' ||\n fileIndex + tail.length === file.length\n ) {\n return false\n }\n tailStart--\n if (!this.#matchOne(file, tail, partial, tailStart, 0)) {\n return false\n }\n fileTailMatch = tail.length + 1\n }\n }\n\n // now we know the tail matches!\n\n // the middle is zero or more portions wrapped in **, possibly\n // containing more ** sections.\n // so a/**/b/**/c/**/d has become **/b/**/c/**\n // if it's empty, it means a/**/b, just verify we have no bad dots\n // if there's no tail, so it ends on /**, then we must have *something*\n // after the head, or it's not a matc\n if (!body.length) {\n let sawSome = !!fileTailMatch\n for (let i = fileIndex; i < file.length - fileTailMatch; i++) {\n const f = String(file[i])\n sawSome = true\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n // in partial mode, we just need to get past all file parts\n return partial || sawSome\n }\n\n // now we know that there's one or more body sections, which can\n // be matched anywhere from the 0 index (because the head was pruned)\n // through to the length-fileTailMatch index.\n // split the body up into sections, and note the minimum index it can\n // be found at (start with the length of all previous segments)\n // [section, before, after]\n const bodySegments: [ParseReturn[], number][] = [[[], 0]]\n let currentBody: [ParseReturn[], number] = bodySegments[0]\n let nonGsParts = 0\n const nonGsPartsSums: number[] = [0]\n for (const b of body) {\n if (b === GLOBSTAR) {\n nonGsPartsSums.push(nonGsParts)\n currentBody = [[], 0]\n bodySegments.push(currentBody)\n } else {\n currentBody[0].push(b)\n nonGsParts++\n }\n }\n let i = bodySegments.length - 1\n const fileLength = file.length - fileTailMatch\n for (const b of bodySegments) {\n b[1] = fileLength - ((nonGsPartsSums[i--] as number) + b[0].length)\n }\n\n return !!this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex,\n 0,\n partial,\n 0,\n !!fileTailMatch,\n )\n }\n\n // return false for \"nope, not matching\"\n // return null for \"not matching, cannot keep trying\"\n #matchGlobStarBodySections(\n file: string[],\n // pattern section, last possible position for it\n bodySegments: [ParseReturn[], number][],\n fileIndex: number,\n bodyIndex: number,\n partial: boolean,\n globStarDepth: number,\n sawTail: boolean,\n ): boolean | null {\n // take the first body segment, and walk from fileIndex to its \"after\"\n // value at the end\n // If it doesn't match at that position, we increment, until we hit\n // that final possible position, and give up.\n // If it does match, then advance and try to rest.\n // If any of them fail we keep walking forward.\n // this is still a bit recursively painful, but it's more constrained\n // than previous implementations, because we never test something that\n // can't possibly be a valid matching condition.\n const bs = bodySegments[bodyIndex]\n if (!bs) {\n // just make sure that there's no bad dots\n for (let i = fileIndex; i < file.length; i++) {\n sawTail = true\n const f = file[i]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n }\n return sawTail\n }\n\n // have a non-globstar body section to test\n const [body, after] = bs\n while (fileIndex <= after) {\n const m = this.#matchOne(\n file.slice(0, fileIndex + body.length),\n body,\n partial,\n fileIndex,\n 0,\n )\n // if limit exceeded, no match. intentional false negative,\n // acceptable break in correctness for security.\n if (m && globStarDepth < this.maxGlobstarRecursion) {\n // match! see if the rest match. if so, we're done!\n const sub = this.#matchGlobStarBodySections(\n file,\n bodySegments,\n fileIndex + body.length,\n bodyIndex + 1,\n partial,\n globStarDepth + 1,\n sawTail,\n )\n if (sub !== false) {\n return sub\n }\n }\n const f = file[fileIndex]\n if (\n f === '.' ||\n f === '..' ||\n (!this.options.dot && f.startsWith('.'))\n ) {\n return false\n }\n\n fileIndex++\n }\n // walked off. no point continuing\n return partial || null\n }\n\n #matchOne(\n file: string[],\n pattern: ParseReturn[],\n partial: boolean,\n fileIndex: number,\n patternIndex: number,\n ) {\n let fi: number\n let pi: number\n let pl: number\n let fl: number\n for (\n fi = fileIndex,\n pi = patternIndex,\n fl = file.length,\n pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n let p = pattern[pi]\n let f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false || p === GLOBSTAR) {\n return false\n }\n /* c8 ignore stop */\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot ? starDotExtTestDot\n : starDotExtTest)(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase ?\n options.dot ?\n qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot ? qmarksTestDot\n : qmarksTest)(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar =\n options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return (\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n )\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n const filtered = pp.filter(p => p !== GLOBSTAR)\n\n // For partial matches, we need to make the pattern match\n // any prefix of the full path. We do this by generating\n // alternative patterns that match progressively longer prefixes.\n if (this.partial && filtered.length >= 1) {\n const prefixes: string[] = []\n for (let i = 1; i <= filtered.length; i++) {\n prefixes.push(filtered.slice(0, i).join('/'))\n }\n return '(?:' + prefixes.join('|') + ')'\n }\n\n return filtered.join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // In partial mode, '/' should always match as it's a valid prefix for any pattern\n if (this.partial) {\n re = '^(?:\\\\/|' + open + re.slice(1, -1) + close + ')$'\n }\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/package.json b/deps/minimatch/dist/esm/package.json similarity index 100% rename from deps/minimatch/dist/mjs/package.json rename to deps/minimatch/dist/esm/package.json diff --git a/deps/minimatch/dist/esm/unescape.d.ts b/deps/minimatch/dist/esm/unescape.d.ts new file mode 100644 index 00000000000000..30ec8292615b74 --- /dev/null +++ b/deps/minimatch/dist/esm/unescape.d.ts @@ -0,0 +1,22 @@ +import { MinimatchOptions } from './index.js'; +/** + * Un-escape a string that has been escaped with {@link escape}. + * + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket 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 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 declare const unescape: (s: string, { windowsPathsNoEscape, magicalBraces, }?: Pick<MinimatchOptions, "windowsPathsNoEscape" | "magicalBraces">) => string; +//# sourceMappingURL=unescape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/unescape.d.ts.map b/deps/minimatch/dist/esm/unescape.d.ts.map new file mode 100644 index 00000000000000..6b84d7538f8ce4 --- /dev/null +++ b/deps/minimatch/dist/esm/unescape.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,GACnB,GAAG,MAAM,EACT,2CAGG,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAM,WAczE,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/esm/unescape.js b/deps/minimatch/dist/esm/unescape.js new file mode 100644 index 00000000000000..b31bd40a028407 --- /dev/null +++ b/deps/minimatch/dist/esm/unescape.js @@ -0,0 +1,34 @@ +/** + * Un-escape a string that has been escaped with {@link escape}. + * + * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then + * square-bracket 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 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, 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'); +}; +//# sourceMappingURL=unescape.js.map \ No newline at end of file diff --git a/deps/minimatch/dist/esm/unescape.js.map b/deps/minimatch/dist/esm/unescape.js.map new file mode 100644 index 00000000000000..288321b86c686d --- /dev/null +++ b/deps/minimatch/dist/esm/unescape.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,EAC5B,aAAa,GAAG,IAAI,MACgD,EAAE,EACxE,EAAE;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,oBAAoB,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;iBACE,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC;iBAC5C,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,oBAAoB,CAAC,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;aACE,OAAO,CAAC,6BAA6B,EAAE,MAAM,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link MinimatchOptions.windowsPathsNoEscape} option is used, then\n * square-bracket escapes are removed, but not backslash escapes.\n *\n * For example, it will turn the string `'[*]'` into `*`, but it will not\n * turn `'\\\\*'` into `'*'`, because `\\` is a path separator in\n * `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both square-bracket escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n *\n * When `magicalBraces` is not set, escapes of braces (`{` and `}`) will not be\n * unescaped.\n */\n\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n magicalBraces = true,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape' | 'magicalBraces'> = {},\n) => {\n if (magicalBraces) {\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2')\n .replace(/\\\\([^\\/])/g, '$1')\n }\n return windowsPathsNoEscape ?\n s.replace(/\\[([^\\/\\\\{}])\\]/g, '$1')\n : s\n .replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g, '$1$2')\n .replace(/\\\\([^\\/{}])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts b/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts deleted file mode 100644 index 8e318b23a033e2..00000000000000 --- a/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare const assertValidPattern: (pattern: any) => void; -//# sourceMappingURL=assert-valid-pattern.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts.map b/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts.map deleted file mode 100644 index c61c0310949955..00000000000000 --- a/deps/minimatch/dist/mjs/assert-valid-pattern.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/assert-valid-pattern.js.map b/deps/minimatch/dist/mjs/assert-valid-pattern.js.map deleted file mode 100644 index b1a5a0b93067b8..00000000000000 --- a/deps/minimatch/dist/mjs/assert-valid-pattern.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;KACvC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QACvC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/ast.d.ts b/deps/minimatch/dist/mjs/ast.d.ts deleted file mode 100644 index e08641b5b8c593..00000000000000 --- a/deps/minimatch/dist/mjs/ast.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MinimatchOptions, MMRegExp } from './index.js'; -export type ExtglobType = '!' | '?' | '+' | '*' | '@'; -export declare class AST { - #private; - type: ExtglobType | null; - constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions); - get hasMagic(): boolean | undefined; - toString(): string; - push(...parts: (string | AST)[]): void; - toJSON(): any[]; - isStart(): boolean; - isEnd(): boolean; - copyIn(part: AST | string): void; - clone(parent: AST): AST; - static fromGlob(pattern: string, options?: MinimatchOptions): AST; - toMMPattern(): MMRegExp | string; - toRegExpSource(allowDot?: boolean): [re: string, body: string, hasMagic: boolean, uflag: boolean]; -} -//# sourceMappingURL=ast.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/ast.d.ts.map b/deps/minimatch/dist/mjs/ast.d.ts.map deleted file mode 100644 index 5486a6893dff3e..00000000000000 --- a/deps/minimatch/dist/mjs/ast.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAwCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IAgGhC,cAAc,CACZ,QAAQ,CAAC,EAAE,OAAO,GACjB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;CAiMjE"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/ast.js b/deps/minimatch/dist/mjs/ast.js deleted file mode 100644 index 9f9835e06a7d54..00000000000000 --- a/deps/minimatch/dist/mjs/ast.js +++ /dev/null @@ -1,585 +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, - }); - } - // 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/minimatch/dist/mjs/ast.js.map b/deps/minimatch/dist/mjs/ast.js.map deleted file mode 100644 index 5ddff36db64755..00000000000000 --- a/deps/minimatch/dist/mjs/ast.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty = this.isStart() && this.isEnd()\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n if (noEmpty && glob === '*') re += starNoEmpty\n else re += star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/brace-expressions.d.ts.map b/deps/minimatch/dist/mjs/brace-expressions.d.ts.map deleted file mode 100644 index d3949648702223..00000000000000 --- a/deps/minimatch/dist/mjs/brace-expressions.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,SACf,MAAM,YACF,MAAM,qBA8HjB,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/brace-expressions.js b/deps/minimatch/dist/mjs/brace-expressions.js deleted file mode 100644 index c629d6ae816e27..00000000000000 --- a/deps/minimatch/dist/mjs/brace-expressions.js +++ /dev/null @@ -1,148 +0,0 @@ -// translate the various posix character classes into unicode properties -// this works across all unicode locales -// { <posix class>: [<translation>, /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<more...>] 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/minimatch/dist/mjs/brace-expressions.js.map b/deps/minimatch/dist/mjs/brace-expressions.js.map deleted file mode 100644 index cdba30da19638a..00000000000000 --- a/deps/minimatch/dist/mjs/brace-expressions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/escape.d.ts b/deps/minimatch/dist/mjs/escape.d.ts deleted file mode 100644 index dc3e3163197728..00000000000000 --- a/deps/minimatch/dist/mjs/escape.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { MinimatchOptions } from './index.js'; -/** - * 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 declare const escape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, 'windowsPathsNoEscape'>) => string; -//# sourceMappingURL=escape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/escape.d.ts.map b/deps/minimatch/dist/mjs/escape.d.ts.map deleted file mode 100644 index 0779dae7ecca6a..00000000000000 --- a/deps/minimatch/dist/mjs/escape.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,MACd,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAQlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/escape.js b/deps/minimatch/dist/mjs/escape.js deleted file mode 100644 index 16f7c8c7bdc646..00000000000000 --- a/deps/minimatch/dist/mjs/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/minimatch/dist/mjs/escape.js.map b/deps/minimatch/dist/mjs/escape.js.map deleted file mode 100644 index 170fd1ad52520f..00000000000000 --- a/deps/minimatch/dist/mjs/escape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/index.d.ts b/deps/minimatch/dist/mjs/index.d.ts deleted file mode 100644 index 41d16a98ebe793..00000000000000 --- a/deps/minimatch/dist/mjs/index.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { AST } from './ast.js'; -type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd'; -export interface MinimatchOptions { - nobrace?: boolean; - nocomment?: boolean; - nonegate?: boolean; - debug?: boolean; - noglobstar?: boolean; - noext?: boolean; - nonull?: boolean; - windowsPathsNoEscape?: boolean; - allowWindowsEscape?: boolean; - partial?: boolean; - dot?: boolean; - nocase?: boolean; - nocaseMagicOnly?: boolean; - magicalBraces?: boolean; - matchBase?: boolean; - flipNegate?: boolean; - preserveMultipleSlashes?: boolean; - optimizationLevel?: number; - platform?: Platform; - windowsNoMagicRoot?: boolean; -} -export declare const minimatch: { - (p: string, pattern: string, options?: MinimatchOptions): boolean; - sep: Sep; - GLOBSTAR: typeof GLOBSTAR; - filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; - defaults: (def: MinimatchOptions) => typeof minimatch; - braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; - makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; - match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; - AST: typeof AST; - Minimatch: typeof Minimatch; - escape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, "windowsPathsNoEscape">) => string; - unescape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, "windowsPathsNoEscape">) => string; -}; -type Sep = '\\' | '/'; -export declare const sep: Sep; -export declare const GLOBSTAR: unique symbol; -export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean; -export declare const defaults: (def: MinimatchOptions) => typeof minimatch; -export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[]; -export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp; -export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[]; -export type MMRegExp = RegExp & { - _src?: string; - _glob?: string; -}; -export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR; -export type ParseReturn = ParseReturnFiltered | false; -export declare class Minimatch { - options: MinimatchOptions; - set: ParseReturnFiltered[][]; - pattern: string; - windowsPathsNoEscape: boolean; - nonegate: boolean; - negate: boolean; - comment: boolean; - empty: boolean; - preserveMultipleSlashes: boolean; - partial: boolean; - globSet: string[]; - globParts: string[][]; - nocase: boolean; - isWindows: boolean; - platform: Platform; - windowsNoMagicRoot: boolean; - regexp: false | null | MMRegExp; - constructor(pattern: string, options?: MinimatchOptions); - hasMagic(): boolean; - debug(..._: any[]): void; - make(): void; - preprocess(globParts: string[][]): string[][]; - adjascentGlobstarOptimize(globParts: string[][]): string[][]; - levelOneOptimize(globParts: string[][]): string[][]; - levelTwoFileOptimize(parts: string | string[]): string[]; - firstPhasePreProcess(globParts: string[][]): string[][]; - secondPhasePreProcess(globParts: string[][]): string[][]; - partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[]; - parseNegate(): void; - matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean; - braceExpand(): string[]; - parse(pattern: string): ParseReturn; - makeRe(): false | MMRegExp; - slashSplit(p: string): string[]; - match(f: string, partial?: boolean): boolean; - static defaults(def: MinimatchOptions): typeof Minimatch; -} -export { AST } from './ast.js'; -export { escape } from './escape.js'; -export { unescape } from './unescape.js'; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/index.d.ts.map b/deps/minimatch/dist/mjs/index.d.ts.map deleted file mode 100644 index 7a14a445ca5b5a..00000000000000 --- a/deps/minimatch/dist/mjs/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/index.js b/deps/minimatch/dist/mjs/index.js deleted file mode 100644 index 831b6a67f63fb4..00000000000000 --- a/deps/minimatch/dist/mjs/index.js +++ /dev/null @@ -1,995 +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 <https://github.com/yetingli> 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 { - 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; - // <pre>/<e>/<rest> -> <pre>/<rest> - 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(); - } - } - // <pre>/<p>/../<rest> -> <pre>/<rest> - 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 - // <pre> is 1 or more portions - // <rest> is 1 or more portions - // <p> is any portion other than ., .., '', or ** - // <e> 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. - // - // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} - // <pre>/<e>/<rest> -> <pre>/<rest> - // <pre>/<p>/../<rest> -> <pre>/<rest> - // **/**/<rest> -> **/<rest> - // - // **/*/<rest> -> */**/<rest> <== 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; - // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - // <pre>/**/**/<rest> -> <pre>/**/<rest> - 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--; - } - // <pre>/<e>/<rest> -> <pre>/<rest> - 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(); - } - } - // <pre>/<p>/../<rest> -> <pre>/<rest> - 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 - // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest> - // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest> - // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest> - // - // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest> - // ^-- 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) - continue; - globParts[i] = matched; - globParts[j] = []; - } - } - 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 *.<ext> 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(); - return fastTest ? Object.assign(re, { test: fastTest }) : 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/minimatch/dist/mjs/index.js.map b/deps/minimatch/dist/mjs/index.js.map deleted file mode 100644 index 9a11ea70863d05..00000000000000 --- a/deps/minimatch/dist/mjs/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n nobrace?: boolean\n nocomment?: boolean\n nonegate?: boolean\n debug?: boolean\n noglobstar?: boolean\n noext?: boolean\n nonull?: boolean\n windowsPathsNoEscape?: boolean\n allowWindowsEscape?: boolean\n partial?: boolean\n dot?: boolean\n nocase?: boolean\n nocaseMagicOnly?: boolean\n magicalBraces?: boolean\n matchBase?: boolean\n flipNegate?: boolean\n preserveMultipleSlashes?: boolean\n optimizationLevel?: number\n platform?: Platform\n windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes\n )\n if (!matched) continue\n globParts[i] = matched\n globParts[j] = []\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n const options = this.options\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n if (pdi > fdi) {\n pattern = pattern.slice( pdi)\n } else if (fdi > pdi) {\n file = file.slice(fdi)\n }\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // dont' need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n this.debug('matchOne', this, { file, pattern })\n this.debug('matchOne', file.length, pattern.length)\n\n for (\n var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false\n }\n /* c8 ignore stop */\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (\n file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')\n )\n return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (\n swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')\n ) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) {\n return true\n }\n }\n /* c8 ignore stop */\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest\n )(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest\n )(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n return fastTest ? Object.assign(re, { test: fastTest }) : re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n return pp.filter(p => p !== GLOBSTAR).join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/unescape.d.ts b/deps/minimatch/dist/mjs/unescape.d.ts deleted file mode 100644 index 23a7b387c7ec45..00000000000000 --- a/deps/minimatch/dist/mjs/unescape.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MinimatchOptions } from './index.js'; -/** - * 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 declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick<MinimatchOptions, 'windowsPathsNoEscape'>) => string; -//# sourceMappingURL=unescape.d.ts.map \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/unescape.d.ts.map b/deps/minimatch/dist/mjs/unescape.d.ts.map deleted file mode 100644 index 7ace0701318040..00000000000000 --- a/deps/minimatch/dist/mjs/unescape.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"} \ No newline at end of file diff --git a/deps/minimatch/dist/mjs/unescape.js b/deps/minimatch/dist/mjs/unescape.js deleted file mode 100644 index 0faf9a2b7306f7..00000000000000 --- a/deps/minimatch/dist/mjs/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/minimatch/dist/mjs/unescape.js.map b/deps/minimatch/dist/mjs/unescape.js.map deleted file mode 100644 index eb146c20d1e2d6..00000000000000 --- a/deps/minimatch/dist/mjs/unescape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes. For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]} \ No newline at end of file diff --git a/deps/minimatch/index.js b/deps/minimatch/index.js index 9db4f793d03d7b..d28609b10808f9 100644 --- a/deps/minimatch/index.js +++ b/deps/minimatch/index.js @@ -4,35 +4,34 @@ var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; -// node_modules/balanced-match/index.js -var require_balanced_match = __commonJS({ - "node_modules/balanced-match/index.js"(exports2, module2) { +// node_modules/balanced-match/dist/commonjs/index.js +var require_commonjs = __commonJS({ + "node_modules/balanced-match/dist/commonjs/index.js"(exports2) { "use strict"; - module2.exports = balanced; - function balanced(a, b, str) { - if (a instanceof RegExp) - a = maybeMatch(a, str); - if (b instanceof RegExp) - b = maybeMatch(b, str); - var r = range(a, b, str); + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.range = exports2.balanced = void 0; + var balanced = (a, b, str) => { + const ma = a instanceof RegExp ? maybeMatch(a, str) : a; + const mb = b instanceof RegExp ? maybeMatch(b, str) : b; + const r = ma !== null && mb != null && (0, exports2.range)(ma, mb, str); return r && { start: r[0], end: r[1], pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) + body: str.slice(r[0] + ma.length, r[1]), + post: str.slice(r[1] + mb.length) }; - } - function maybeMatch(reg, str) { - var m = str.match(reg); + }; + exports2.balanced = balanced; + var maybeMatch = (reg, str) => { + const m = str.match(reg); return m ? m[0] : null; - } - balanced.range = range; - function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; + }; + var range = (a, b, str) => { + let begs, beg, left, right = void 0, result; + let ai = str.indexOf(a); + let bi = str.indexOf(b, ai + 1); + let i = ai; if (ai >= 0 && bi > 0) { if (a === b) { return [ai, bi]; @@ -40,14 +39,16 @@ var require_balanced_match = __commonJS({ begs = []; left = str.length; while (i >= 0 && !result) { - if (i == ai) { + if (i === ai) { begs.push(i); ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [begs.pop(), bi]; + } else if (begs.length === 1) { + const r = begs.pop(); + if (r !== void 0) + result = [r, bi]; } else { beg = begs.pop(); - if (beg < left) { + if (beg !== void 0 && beg < left) { left = beg; right = bi; } @@ -55,61 +56,79 @@ var require_balanced_match = __commonJS({ } i = ai < bi && ai >= 0 ? ai : bi; } - if (begs.length) { + if (begs.length && right !== void 0) { result = [left, right]; } } return result; - } + }; + exports2.range = range; } }); -// node_modules/brace-expansion/index.js -var require_brace_expansion = __commonJS({ - "node_modules/brace-expansion/index.js"(exports2, module2) { - var balanced = require_balanced_match(); - module2.exports = expandTop; +// node_modules/brace-expansion/dist/commonjs/index.js +var require_commonjs2 = __commonJS({ + "node_modules/brace-expansion/dist/commonjs/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.EXPANSION_MAX = void 0; + exports2.expand = expand; + var balanced_match_1 = require_commonjs(); var escSlash = "\0SLASH" + Math.random() + "\0"; var escOpen = "\0OPEN" + Math.random() + "\0"; var escClose = "\0CLOSE" + Math.random() + "\0"; var escComma = "\0COMMA" + Math.random() + "\0"; var escPeriod = "\0PERIOD" + Math.random() + "\0"; + var escSlashPattern = new RegExp(escSlash, "g"); + var escOpenPattern = new RegExp(escOpen, "g"); + var escClosePattern = new RegExp(escClose, "g"); + var escCommaPattern = new RegExp(escComma, "g"); + var escPeriodPattern = new RegExp(escPeriod, "g"); + var slashPattern = /\\\\/g; + var openPattern = /\\{/g; + var closePattern = /\\}/g; + var commaPattern = /\\,/g; + var periodPattern = /\\\./g; + exports2.EXPANSION_MAX = 1e5; function numeric(str) { - return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); } function escapeBraces(str) { - return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + return str.replace(slashPattern, escSlash).replace(openPattern, escOpen).replace(closePattern, escClose).replace(commaPattern, escComma).replace(periodPattern, escPeriod); } function unescapeBraces(str) { - return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + return str.replace(escSlashPattern, "\\").replace(escOpenPattern, "{").replace(escClosePattern, "}").replace(escCommaPattern, ",").replace(escPeriodPattern, "."); } function parseCommaParts(str) { - if (!str) + if (!str) { return [""]; - var parts = []; - var m = balanced("{", "}", str); - if (!m) + } + const parts = []; + const m = (0, balanced_match_1.balanced)("{", "}", str); + if (!m) { return str.split(","); - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(","); + } + const { pre, body, post } = m; + const p = pre.split(","); p[p.length - 1] += "{" + body + "}"; - var postParts = parseCommaParts(post); + const postParts = parseCommaParts(post); if (post.length) { + ; p[p.length - 1] += postParts.shift(); p.push.apply(p, postParts); } parts.push.apply(parts, p); return parts; } - function expandTop(str) { - if (!str) + function expand(str, options = {}) { + if (!str) { return []; - if (str.substr(0, 2) === "{}") { - str = "\\{\\}" + str.substr(2); } - return expand(escapeBraces(str), true).map(unescapeBraces); + const { max = exports2.EXPANSION_MAX } = options; + if (str.slice(0, 2) === "{}") { + str = "\\{\\}" + str.slice(2); + } + return expand_(escapeBraces(str), max, true).map(unescapeBraces); } function embrace(str) { return "{" + str + "}"; @@ -123,74 +142,74 @@ var require_brace_expansion = __commonJS({ function gte(i, y) { return i >= y; } - function expand(str, isTop) { - var expansions = []; - var m = balanced("{", "}", str); + function expand_(str, max, isTop) { + const expansions = []; + const m = (0, balanced_match_1.balanced)("{", "}", str); if (!m) return [str]; - var pre = m.pre; - var post = m.post.length ? expand(m.post, false) : [""]; + const pre = m.pre; + const post = m.post.length ? expand_(m.post, max, false) : [""]; if (/\$$/.test(m.pre)) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + "{" + m.body + "}" + post[k]; + for (let k = 0; k < post.length && k < max; k++) { + const expansion = pre + "{" + m.body + "}" + post[k]; expansions.push(expansion); } } else { - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(",") >= 0; + const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + const isSequence = isNumericSequence || isAlphaSequence; + const isOptions = m.body.indexOf(",") >= 0; if (!isSequence && !isOptions) { - if (m.post.match(/,.*\}/)) { + if (m.post.match(/,(?!,).*\}/)) { str = m.pre + "{" + m.body + escClose + m.post; - return expand(str); + return expand_(str, max, true); } return [str]; } - var n; + let n; if (isSequence) { n = m.body.split(/\.\./); } else { n = parseCommaParts(m.body); - if (n.length === 1) { - n = expand(n[0], false).map(embrace); + if (n.length === 1 && n[0] !== void 0) { + n = expand_(n[0], max, false).map(embrace); if (n.length === 1) { - return post.map(function(p) { - return m.pre + n[0] + p; - }); + return post.map((p) => m.pre + n[0] + p); } } } - var N; - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length); - var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; - var test = lte; - var reverse = y < x; + let N; + if (isSequence && n[0] !== void 0 && n[1] !== void 0) { + const x = numeric(n[0]); + const y = numeric(n[1]); + const width = Math.max(n[0].length, n[1].length); + let incr = n.length === 3 && n[2] !== void 0 ? Math.abs(numeric(n[2])) : 1; + let test = lte; + const reverse = y < x; if (reverse) { incr *= -1; test = gte; } - var pad = n.some(isPadded); + const pad = n.some(isPadded); N = []; - for (var i = x; test(i, y); i += incr) { - var c; + for (let i = x; test(i, y); i += incr) { + let c; if (isAlphaSequence) { c = String.fromCharCode(i); - if (c === "\\") + if (c === "\\") { c = ""; + } } else { c = String(i); if (pad) { - var need = width - c.length; + const need = width - c.length; if (need > 0) { - var z = new Array(need + 1).join("0"); - if (i < 0) + const z = new Array(need + 1).join("0"); + if (i < 0) { c = "-" + z + c.slice(1); - else + } else { c = z + c; + } } } } @@ -198,15 +217,16 @@ var require_brace_expansion = __commonJS({ } } else { N = []; - for (var j = 0; j < n.length; j++) { - N.push.apply(N, expand(n[j], false)); + for (let j = 0; j < n.length; j++) { + N.push.apply(N, expand_(n[j], max, false)); } } - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) + for (let j = 0; j < N.length; j++) { + for (let k = 0; k < post.length && expansions.length < max; k++) { + const expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) { expansions.push(expansion); + } } } } @@ -215,9 +235,9 @@ var require_brace_expansion = __commonJS({ } }); -// dist/cjs/assert-valid-pattern.js +// dist/commonjs/assert-valid-pattern.js var require_assert_valid_pattern = __commonJS({ - "dist/cjs/assert-valid-pattern.js"(exports2) { + "dist/commonjs/assert-valid-pattern.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.assertValidPattern = void 0; @@ -234,9 +254,9 @@ var require_assert_valid_pattern = __commonJS({ } }); -// dist/cjs/brace-expressions.js +// dist/commonjs/brace-expressions.js var require_brace_expressions = __commonJS({ - "dist/cjs/brace-expressions.js"(exports2) { + "dist/commonjs/brace-expressions.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.parseClass = void 0; @@ -273,66 +293,65 @@ var require_brace_expressions = __commonJS({ 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; + 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; } - if (c === "]" && sawStart && !escaping) { - endPos = i + 1; - break; - } - sawStart = true; - if (c === "\\") { - if (!escaping) { - escaping = true; - i++; - continue; - } - } - if (c === "[" && !escaping) { - for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { - if (glob.startsWith(cls, i)) { - 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; + } + if (c === "[" && !escaping) { + for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { + if (glob.startsWith(cls, i)) { + 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; } } - escaping = false; - if (rangeStart) { - if (c > rangeStart) { - ranges.push(braceEscape(rangeStart) + "-" + braceEscape(c)); - } else if (c === rangeStart) { - ranges.push(braceEscape(c)); - } - rangeStart = ""; - i++; - continue; - } - if (glob.startsWith("-]", i + 1)) { - ranges.push(braceEscape(c + "-")); - i += 2; - continue; - } - if (glob.startsWith("-", i + 1)) { - rangeStart = c; - i += 2; - continue; + } + escaping = false; + if (rangeStart) { + if (c > rangeStart) { + ranges.push(braceEscape(rangeStart) + "-" + braceEscape(c)); + } else if (c === rangeStart) { + ranges.push(braceEscape(c)); } - ranges.push(braceEscape(c)); + rangeStart = ""; i++; + continue; } + if (glob.startsWith("-]", i + 1)) { + ranges.push(braceEscape(c + "-")); + i += 2; + continue; + } + if (glob.startsWith("-", i + 1)) { + rangeStart = c; + i += 2; + continue; + } + ranges.push(braceEscape(c)); + i++; + } if (endPos < i) { return ["", false, 0, false]; } @@ -352,29 +371,80 @@ var require_brace_expressions = __commonJS({ } }); -// dist/cjs/unescape.js +// dist/commonjs/unescape.js var require_unescape = __commonJS({ - "dist/cjs/unescape.js"(exports2) { + "dist/commonjs/unescape.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.unescape = void 0; - var unescape = (s, { windowsPathsNoEscape = false } = {}) => { - return windowsPathsNoEscape ? s.replace(/\[([^\/\\])\]/g, "$1") : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, "$1$2").replace(/\\([^\/])/g, "$1"); + var 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"); }; exports2.unescape = unescape; } }); -// dist/cjs/ast.js +// dist/commonjs/ast.js var require_ast = __commonJS({ - "dist/cjs/ast.js"(exports2) { + "dist/commonjs/ast.js"(exports2) { "use strict"; + var _a; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.AST = void 0; var brace_expressions_js_1 = require_brace_expressions(); var unescape_js_12 = require_unescape(); var types = /* @__PURE__ */ new Set(["!", "?", "+", "*", "@"]); var isExtglobType = (c) => types.has(c); + var isExtglobAST = (c) => isExtglobType(c.type); + var adoptionMap = /* @__PURE__ */ new Map([ + ["!", ["@"]], + ["?", ["?", "@"]], + ["@", ["@"]], + ["*", ["*", "+", "?", "@"]], + ["+", ["+", "@"]] + ]); + var adoptionWithSpaceMap = /* @__PURE__ */ new Map([ + ["!", ["?"]], + ["@", ["?"]], + ["+", ["?", "*"]] + ]); + var adoptionAnyMap = /* @__PURE__ */ new Map([ + ["!", ["?", "@"]], + ["?", ["?", "@"]], + ["@", ["?", "@"]], + ["*", ["*", "+", "?", "@"]], + ["+", ["+", "@", "?", "*"]] + ]); + var usurpMap = /* @__PURE__ */ new Map([ + ["!", /* @__PURE__ */ new Map([["!", "@"]])], + [ + "?", + /* @__PURE__ */ new Map([ + ["*", "*"], + ["+", "*"] + ]) + ], + [ + "@", + /* @__PURE__ */ new Map([ + ["!", "!"], + ["?", "?"], + ["@", "@"], + ["*", "*"], + ["+", "+"] + ]) + ], + [ + "+", + /* @__PURE__ */ new Map([ + ["?", "*"], + ["*", "*"] + ]) + ] + ]); var startNoTraversal = "(?!(?:^|/)\\.\\.?(?:$|/))"; var startNoDot = "(?!\\.)"; var addPatternStart = /* @__PURE__ */ new Set(["[", "."]); @@ -384,7 +454,8 @@ var require_ast = __commonJS({ var qmark2 = "[^/]"; var star2 = qmark2 + "*?"; var starNoEmpty = qmark2 + "+?"; - var AST = class _AST { + var ID = 0; + var AST = class { type; #root; #hasMagic; @@ -399,6 +470,22 @@ var require_ast = __commonJS({ // set to true if it's an extglob with no children // (which really means one child of '') #emptyExt = false; + id = ++ID; + get depth() { + return (this.#parent?.depth ?? -1) + 1; + } + [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() { + return { + "@@type": "AST", + id: this.id, + type: this.type, + root: this.#root.id, + parent: this.#parent?.id, + depth: this.depth, + partsLength: this.#parts.length, + parts: this.#parts + }; + } constructor(type, parent, options = {}) { this.type = type; if (type) @@ -464,7 +551,7 @@ var require_ast = __commonJS({ for (const p of parts) { if (p === "") continue; - if (typeof p !== "string" && !(p instanceof _AST && p.#parent === this)) { + if (typeof p !== "string" && !(p instanceof _a && p.#parent === this)) { throw new Error("invalid part: " + p); } this.#parts.push(p); @@ -489,7 +576,7 @@ var require_ast = __commonJS({ const p = this.#parent; for (let i = 0; i < this.#parentIndex; i++) { const pp = p.#parts[i]; - if (!(pp instanceof _AST && pp.type === "!")) { + if (!(pp instanceof _a && pp.type === "!")) { return false; } } @@ -514,13 +601,14 @@ var require_ast = __commonJS({ this.push(part.clone(this)); } clone(parent) { - const c = new _AST(this.type, parent); + const c = new _a(this.type, parent); for (const p of this.#parts) { c.copyIn(p); } return c; } - static #parseAST(str, ast, pos, opt) { + static #parseAST(str, ast, pos, opt, extDepth) { + const maxDepth = opt.maxExtglobRecursion ?? 2; let escaping = false; let inBrace = false; let braceStart = -1; @@ -552,11 +640,12 @@ var require_ast = __commonJS({ acc2 += c; continue; } - if (!opt.noext && isExtglobType(c) && str.charAt(i2) === "(") { + const doRecurse = !opt.noext && isExtglobType(c) && str.charAt(i2) === "(" && extDepth <= maxDepth; + if (doRecurse) { ast.push(acc2); acc2 = ""; - const ext2 = new _AST(c, ast); - i2 = _AST.#parseAST(str, ext2, i2, opt); + const ext2 = new _a(c, ast); + i2 = _a.#parseAST(str, ext2, i2, opt, extDepth + 1); ast.push(ext2); continue; } @@ -566,7 +655,7 @@ var require_ast = __commonJS({ return i2; } let i = pos + 1; - let part = new _AST(null, ast); + let part = new _a(null, ast); const parts = []; let acc = ""; while (i < str.length) { @@ -593,19 +682,22 @@ var require_ast = __commonJS({ acc += c; continue; } - if (isExtglobType(c) && str.charAt(i) === "(") { + const doRecurse = !opt.noext && isExtglobType(c) && str.charAt(i) === "(" && /* c8 ignore start - the maxDepth is sufficient here */ + (extDepth <= maxDepth || ast && ast.#canAdoptType(c)); + if (doRecurse) { + const depthAdd = ast && ast.#canAdoptType(c) ? 0 : 1; part.push(acc); acc = ""; - const ext2 = new _AST(c, part); + const ext2 = new _a(c, part); part.push(ext2); - i = _AST.#parseAST(str, ext2, i, opt); + i = _a.#parseAST(str, ext2, i, opt, extDepth + depthAdd); continue; } if (c === "|") { part.push(acc); acc = ""; parts.push(part); - part = new _AST(null, ast); + part = new _a(null, ast); continue; } if (c === ")") { @@ -624,9 +716,71 @@ var require_ast = __commonJS({ ast.#parts = [str.substring(pos - 1)]; return i; } + #canAdoptWithSpace(child) { + return this.#canAdopt(child, adoptionWithSpaceMap); + } + #canAdopt(child, map = adoptionMap) { + if (!child || typeof child !== "object" || child.type !== null || child.#parts.length !== 1 || this.type === null) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== "object" || gc.type === null) { + return false; + } + return this.#canAdoptType(gc.type, map); + } + #canAdoptType(c, map = adoptionAnyMap) { + return !!map.get(this.type)?.includes(c); + } + #adoptWithSpace(child, index) { + const gc = child.#parts[0]; + const blank = new _a(null, gc, this.options); + blank.#parts.push(""); + gc.push(blank); + this.#adopt(child, index); + } + #adopt(child, index) { + const gc = child.#parts[0]; + this.#parts.splice(index, 1, ...gc.#parts); + for (const p of gc.#parts) { + if (typeof p === "object") + p.#parent = this; + } + this.#toString = void 0; + } + #canUsurpType(c) { + const m = usurpMap.get(this.type); + return !!m?.has(c); + } + #canUsurp(child) { + if (!child || typeof child !== "object" || child.type !== null || child.#parts.length !== 1 || this.type === null || this.#parts.length !== 1) { + return false; + } + const gc = child.#parts[0]; + if (!gc || typeof gc !== "object" || gc.type === null) { + return false; + } + return this.#canUsurpType(gc.type); + } + #usurp(child) { + const m = usurpMap.get(this.type); + const gc = child.#parts[0]; + const nt = m?.get(gc.type); + if (!nt) + return false; + this.#parts = gc.#parts; + for (const p of this.#parts) { + if (typeof p === "object") { + p.#parent = this; + } + } + this.type = nt; + this.#toString = void 0; + this.#emptyExt = false; + } static fromGlob(pattern, options = {}) { - const ast = new _AST(null, void 0, options); - _AST.#parseAST(pattern, ast, 0, options); + const ast = new _a(null, void 0, options); + _a.#parseAST(pattern, ast, 0, options, 0); return ast; } // returns the regular expression if there's magic, or the unescaped @@ -646,6 +800,9 @@ var require_ast = __commonJS({ _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) @@ -717,12 +874,14 @@ var require_ast = __commonJS({ // or start or whatever) and prepend ^ or / at the Regexp construction. toRegExpSource(allowDot) { const dot = allowDot ?? !!this.#options.dot; - if (this.#root === this) + if (this.#root === this) { + this.#flatten(); this.#fillNegs(); - if (!this.type) { - const noEmpty = this.isStart() && this.isEnd(); + } + if (!isExtglobAST(this)) { + 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" ? _AST.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); + const [re, _, hasMagic, uflag] = typeof p === "string" ? _a.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); this.#hasMagic = this.#hasMagic || hasMagic; this.#uflag = this.#uflag || uflag; return re; @@ -761,9 +920,10 @@ var require_ast = __commonJS({ let body = this.#partsToRegExp(dot); if (this.isStart() && this.isEnd() && !body && this.type !== "!") { const s = this.toString(); - this.#parts = [s]; - this.type = null; - this.#hasMagic = void 0; + const me = this; + me.#parts = [s]; + me.type = null; + me.#hasMagic = void 0; return [s, (0, unescape_js_12.unescape)(this.toString()), false, false]; } let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? "" : this.#partsToRegExp(true); @@ -790,6 +950,38 @@ var require_ast = __commonJS({ this.#uflag ]; } + #flatten() { + if (!isExtglobAST(this)) { + for (const p of this.#parts) { + if (typeof p === "object") { + p.#flatten(); + } + } + } else { + let iterations = 0; + let done = false; + do { + done = true; + for (let i = 0; i < this.#parts.length; i++) { + const c = this.#parts[i]; + if (typeof c === "object") { + c.#flatten(); + if (this.#canAdopt(c)) { + done = false; + this.#adopt(c, i); + } else if (this.#canAdoptWithSpace(c)) { + done = false; + this.#adoptWithSpace(c, i); + } else if (this.#canUsurp(c)) { + done = false; + this.#usurp(c); + } + } + } + } while (!done && ++iterations < 10); + } + this.#toString = void 0; + } #partsToRegExp(dot) { return this.#parts.map((p) => { if (typeof p === "string") { @@ -804,6 +996,7 @@ var require_ast = __commonJS({ let escaping = false; let re = ""; let uflag = false; + let inStar = false; for (let i = 0; i < glob.length; i++) { const c = glob.charAt(i); if (escaping) { @@ -811,6 +1004,16 @@ var require_ast = __commonJS({ re += (reSpecials.has(c) ? "\\" : "") + c; continue; } + if (c === "*") { + if (inStar) + continue; + inStar = true; + re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star2; + hasMagic = true; + continue; + } else { + inStar = false; + } if (c === "\\") { if (i === glob.length - 1) { re += "\\\\"; @@ -829,14 +1032,6 @@ var require_ast = __commonJS({ continue; } } - if (c === "*") { - if (noEmpty && glob === "*") - re += starNoEmpty; - else - re += star2; - hasMagic = true; - continue; - } if (c === "?") { re += qmark2; hasMagic = true; @@ -848,29 +1043,30 @@ var require_ast = __commonJS({ } }; exports2.AST = AST; + _a = AST; } }); -// dist/cjs/escape.js +// dist/commonjs/escape.js var require_escape = __commonJS({ - "dist/cjs/escape.js"(exports2) { + "dist/commonjs/escape.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.escape = void 0; - var escape = (s, { windowsPathsNoEscape = false } = {}) => { + var escape = (s, { windowsPathsNoEscape = false, magicalBraces = false } = {}) => { + if (magicalBraces) { + return windowsPathsNoEscape ? s.replace(/[?*()[\]{}]/g, "[$&]") : s.replace(/[?*()[\]\\{}]/g, "\\$&"); + } return windowsPathsNoEscape ? s.replace(/[?*()[\]]/g, "[$&]") : s.replace(/[?*()[\]\\]/g, "\\$&"); }; exports2.escape = escape; } }); -// dist/cjs/index.js -var __importDefault = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { "default": mod }; -}; +// dist/commonjs/index.js 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; -var brace_expansion_1 = __importDefault(require_brace_expansion()); +var brace_expansion_1 = require_commonjs2(); var assert_valid_pattern_js_1 = require_assert_valid_pattern(); var ast_js_1 = require_ast(); var escape_js_1 = require_escape(); @@ -940,7 +1136,7 @@ var path = { }; exports.sep = defaultPlatform === "win32" ? path.win32.sep : path.posix.sep; exports.minimatch.sep = exports.sep; -exports.GLOBSTAR = Symbol("globstar **"); +exports.GLOBSTAR = /* @__PURE__ */ Symbol("globstar **"); exports.minimatch.GLOBSTAR = exports.GLOBSTAR; var qmark = "[^/]"; var star = qmark + "*?"; @@ -993,7 +1189,7 @@ var braceExpand = (pattern, options = {}) => { if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { return [pattern]; } - return (0, brace_expansion_1.default)(pattern); + return (0, brace_expansion_1.expand)(pattern, { max: options.braceExpandMax }); }; exports.braceExpand = braceExpand; exports.minimatch.braceExpand = exports.braceExpand; @@ -1029,15 +1225,18 @@ var Minimatch = class { isWindows; platform; windowsNoMagicRoot; + maxGlobstarRecursion; regexp; constructor(pattern, options = {}) { (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); options = options || {}; this.options = options; + this.maxGlobstarRecursion = options.maxGlobstarRecursion ?? 200; this.pattern = pattern; this.platform = options.platform || defaultPlatform; this.isWindows = this.platform === "win32"; - this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + const awe = "allowWindowsEscape"; + this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options[awe] === false; if (this.windowsPathsNoEscape) { this.pattern = this.pattern.replace(/\\/g, "/"); } @@ -1094,7 +1293,10 @@ var Minimatch = class { 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))]; + 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))]; } @@ -1301,10 +1503,11 @@ var Minimatch = class { 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) - continue; - globParts[i] = matched; - globParts[j] = []; + if (matched) { + globParts[i] = []; + globParts[j] = matched; + break; + } } } return globParts.filter((gs) => gs.length); @@ -1365,7 +1568,8 @@ var Minimatch = class { // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { - const options = this.options; + let fileStartIndex = 0; + let patternStartIndex = 0; 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]); @@ -1374,14 +1578,14 @@ var Minimatch = class { const fdi = fileUNC ? 3 : fileDrive ? 0 : void 0; const pdi = patternUNC ? 3 : patternDrive ? 0 : void 0; if (typeof fdi === "number" && typeof pdi === "number") { - const [fd, pd] = [file[fdi], pattern[pdi]]; + 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); - } + patternStartIndex = pdi; + fileStartIndex = fdi; } } } @@ -1389,49 +1593,123 @@ var Minimatch = class { 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); - if (p === false) { + if (pattern.includes(exports.GLOBSTAR)) { + return this.#matchGlobstar(file, pattern, partial, fileStartIndex, patternStartIndex); + } + return this.#matchOne(file, pattern, partial, fileStartIndex, patternStartIndex); + } + #matchGlobstar(file, pattern, partial, fileIndex, patternIndex) { + const firstgs = pattern.indexOf(exports.GLOBSTAR, patternIndex); + const lastgs = pattern.lastIndexOf(exports.GLOBSTAR); + const [head, body, tail] = partial ? [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1), + [] + ] : [ + pattern.slice(patternIndex, firstgs), + pattern.slice(firstgs + 1, lastgs), + pattern.slice(lastgs + 1) + ]; + if (head.length) { + const fileHead = file.slice(fileIndex, fileIndex + head.length); + if (!this.#matchOne(fileHead, head, partial, 0, 0)) { return false; } - if (p === exports.GLOBSTAR) { - this.debug("GLOBSTAR", [pattern, p, f]); - var fr = fi; - var pr = pi + 1; - if (pr === pl) { - this.debug("** at the end"); - for (; fi < fl; fi++) { - if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") - return false; - } - return true; + fileIndex += head.length; + patternIndex += head.length; + } + let fileTailMatch = 0; + if (tail.length) { + if (tail.length + fileIndex > file.length) + return false; + let tailStart = file.length - tail.length; + if (this.#matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length; + } else { + if (file[file.length - 1] !== "" || fileIndex + tail.length === file.length) { + return false; } - while (fr < fl) { - var swallowee = file[fr]; - this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug("globstar found match!", fr, fl, swallowee); - return true; - } else { - if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { - this.debug("dot detected!", file, fr, pattern, pr); - break; - } - this.debug("globstar swallow a segment, and continue"); - fr++; - } + tailStart--; + if (!this.#matchOne(file, tail, partial, tailStart, 0)) { + return false; } - if (partial) { - this.debug("\n>>> no match, partial?", file, fr, pattern, pr); - if (fr === fl) { - return true; - } + fileTailMatch = tail.length + 1; + } + } + if (!body.length) { + let sawSome = !!fileTailMatch; + for (let i2 = fileIndex; i2 < file.length - fileTailMatch; i2++) { + const f = String(file[i2]); + sawSome = true; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; } + } + return partial || sawSome; + } + const bodySegments = [[[], 0]]; + let currentBody = bodySegments[0]; + let nonGsParts = 0; + const nonGsPartsSums = [0]; + for (const b of body) { + if (b === exports.GLOBSTAR) { + nonGsPartsSums.push(nonGsParts); + currentBody = [[], 0]; + bodySegments.push(currentBody); + } else { + currentBody[0].push(b); + nonGsParts++; + } + } + let i = bodySegments.length - 1; + const fileLength = file.length - fileTailMatch; + for (const b of bodySegments) { + b[1] = fileLength - (nonGsPartsSums[i--] + b[0].length); + } + return !!this.#matchGlobStarBodySections(file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); + } + // return false for "nope, not matching" + // return null for "not matching, cannot keep trying" + #matchGlobStarBodySections(file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { + const bs = bodySegments[bodyIndex]; + if (!bs) { + for (let i = fileIndex; i < file.length; i++) { + sawTail = true; + const f = file[i]; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; + } + } + return sawTail; + } + const [body, after] = bs; + while (fileIndex <= after) { + const m = this.#matchOne(file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); + if (m && globStarDepth < this.maxGlobstarRecursion) { + const sub = this.#matchGlobStarBodySections(file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); + if (sub !== false) { + return sub; + } + } + const f = file[fileIndex]; + if (f === "." || f === ".." || !this.options.dot && f.startsWith(".")) { + return false; + } + fileIndex++; + } + return partial || null; + } + #matchOne(file, pattern, partial, fileIndex, patternIndex) { + let fi; + let pi; + let pl; + let fl; + for (fi = fileIndex, pi = patternIndex, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + let p = pattern[pi]; + let f = file[fi]; + this.debug(pattern, p, f); + if (p === false || p === exports.GLOBSTAR) { return false; } let hit; @@ -1479,7 +1757,10 @@ var Minimatch = class { fastTest = dotStarTest; } const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern(); - return fastTest ? Object.assign(re, { test: fastTest }) : re; + if (fastTest && typeof re === "object") { + Reflect.defineProperty(re, "test", { value: fastTest }); + } + return re; } makeRe() { if (this.regexp || this.regexp === false) @@ -1513,16 +1794,27 @@ var Minimatch = class { pp[i] = twoStar; } } else if (next === void 0) { - 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); + 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("|"); const [open, close] = set.length > 1 ? ["(?:", ")"] : ["", ""]; re = "^" + open + re + close + "$"; + if (this.partial) { + re = "^(?:\\/|" + open + re.slice(1, -1) + close + ")$"; + } if (this.negate) re = "^(?!" + re + ").+$"; try { diff --git a/deps/minimatch/package-lock.json b/deps/minimatch/package-lock.json index 956b257355a305..1022f59865f99d 100644 --- a/deps/minimatch/package-lock.json +++ b/deps/minimatch/package-lock.json @@ -1,549 +1,69 @@ { "name": "minimatch", - "version": "9.0.3", + "version": "10.2.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "minimatch", - "version": "9.0.3", - "license": "ISC", + "version": "10.2.4", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "devDependencies": { - "@types/brace-expansion": "^1.1.0", - "@types/node": "^18.15.11", - "@types/tap": "^15.0.8", - "c8": "^7.12.0", - "esbuild": "^0.19.5", - "eslint-config-prettier": "^8.6.0", - "mkdirp": "1", - "prettier": "^2.8.2", - "tap": "^16.3.7", - "ts-node": "^10.9.1", - "typedoc": "^0.23.21", - "typescript": "^4.9.3" + "@types/node": "^25.3.0", + "esbuild": "^0.27.3", + "mkdirp": "^3.0.1", + "prettier": "^3.6.2", + "tap": "^21.6.2", + "tshy": "^3.0.2", + "typedoc": "^0.28.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", + "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.13.1" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "BSD-2-Clause" }, - "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -551,5075 +71,4021 @@ "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@gar/promise-retry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz", + "integrity": "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "retry": "^0.13.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@gerrit0/mini-shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "minipass": "^7.0.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009": { + "version": "10.9.7", + "resolved": "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.7.tgz", + "integrity": "sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node14": "*", + "@tsconfig/node16": "*", + "@tsconfig/node18": "*", + "@tsconfig/node20": "*", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=4.2" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.3.1" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@isaacs/which": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@isaacs/which/-/which-7.0.4.tgz", + "integrity": "sha512-qXToWZFY9CKvWsveV3R5VHNJLQkHTIJXO9J4Xa1UgNwVCRA2LEsmvWC84MIdnezFLsjn2Q+GzbL/8yVF1/ozJw==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "isexe": "^4.0.0" }, "engines": { - "node": ">=10.10.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=8" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true, - "peer": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@npmcli/agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "dev": true, + "license": "ISC", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "node_modules/@npmcli/fs": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "dev": true, + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@npmcli/git": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "dev": true, + "license": "ISC", "dependencies": { - "p-try": "^2.0.0" + "@gar/promise-retry": "^1.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": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, + "license": "ISC", "dependencies": { - "p-limit": "^2.2.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "node_modules/@npmcli/node-gyp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@npmcli/package-json": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, + "license": "ISC", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "dev": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@npmcli/run-script": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "peer": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/brace-expansion": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/brace-expansion/-/brace-expansion-1.1.2.tgz", - "integrity": "sha512-+YDjlWHMm/zoiQSKhEhL/0HdfYxCVuGlP5tQLm5hoHtxGPAMqyHjGpLqm58YDw7vG+RafAahp7HKXeNIwBP3kQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } }, - "node_modules/@types/node": { - "version": "18.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.10.tgz", - "integrity": "sha512-luANqZxPmjTll8bduz4ACs/lNTCLuWssCyjqTY9yLdsv1xnViQp3ISKwsEWOIecO13JWUqjVdig/Vjjc09o8uA==", + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "@shikijs/types": "3.23.0" } }, - "node_modules/@types/tap": { - "version": "15.0.11", - "resolved": "https://registry.npmjs.org/@types/tap/-/tap-15.0.11.tgz", - "integrity": "sha512-QzbxIsrK6yX3iWC2PXGX/Ljz5cGISDEuOGISMcckeSUKIJXzbsfJLF4LddoncZ+ELVZpO0X87KfRem4h+yBFXQ==", + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": ">=0.4.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@sigstore/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz", + "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==", "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@sigstore/sign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.0.tgz", + "integrity": "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@sigstore/tuf": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.1.tgz", + "integrity": "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@sigstore/verify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", + "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0" + }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@tapjs/after": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.4.tgz", + "integrity": "sha512-Y8DL0F9Ux6Swe7b5g4qLFgJUEFrVr5fhmVOENw4D/x7rDRyx/3c86Ya1p9iJrpkE2RnvdGq9AxR/rTM137Y7Lg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "color-convert": "^2.0.1" + "is-actual-promise": "^1.0.1" }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@tapjs/after-each": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.4.tgz", + "integrity": "sha512-TM1OWz7Ht3aimbT/MLYnoywI9SBGsTus6TQ+94n1yjr1izO3K21PP5Q9UYdqZ2Qq1WiZmGa+CZKUZANUn1ZcvQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "function-loop": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/@tapjs/asserts": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.4.tgz", + "integrity": "sha512-1kf2q0oQ7LCZKy5l4Oe7/ZVijhJ9YxbS4qmqGtj7cYwOw4Q78KNLwthh14c9EBbI2QHKUDS2LaLM8a1qMLmPiA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "default-require-extensions": "^3.0.0" + "@tapjs/stack": "4.3.0", + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, - "node_modules/async-hook-domain": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", - "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", + "node_modules/@tapjs/before": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.4.tgz", + "integrity": "sha512-53n/8/RktPkbCuZveDTYiplbrzWjFkYAnmYCrFixESsFoUrkfTCPjeCRmojBS14zuRdVe4kLsX6XWYkaUpLdZA==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "is-actual-promise": "^1.0.1" + }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@tapjs/before-each": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.4.tgz", + "integrity": "sha512-WkLsDvCjBrxrRkyhEBpfmGObUsf8Eb+tsqlxnGUG67XbPMkwkP/AoUPonc/g1Nv+pwtR+t5j6maNblrubWuG3A==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "function-loop": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/bind-obj-methods": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", - "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", + "node_modules/@tapjs/chdir": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.4.tgz", + "integrity": "sha512-B37eGrs47xseJ7dm9ikhStX7KNqflvZViT2lMqVACeNvoxSpRgy1pu7cPix4wKvBlZCtNYaOD8iDNm+5nDfvSQ==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@tapjs/config": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.2.tgz", + "integrity": "sha512-GQyKl40fGamoSvT4SsfQfZyaHT8fboNW5OhrA1hhMc34di5j/efiD15VlNVbPGE51BZSs5M3Jw7YukF2/Cg8CA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "balanced-match": "^1.0.0" + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2", + "chalk": "^5.6.2", + "jackspeak": "^4.2.3", + "polite-json": "^5.0.0", + "tap-yaml": "4.3.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2", + "@tapjs/test": "4.4.2" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@tapjs/core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.2.tgz", + "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "fill-range": "^7.0.1" + "@tapjs/processinfo": "^3.1.9", + "@tapjs/stack": "4.3.0", + "@tapjs/test": "4.4.2", + "async-hook-domain": "^4.0.1", + "diff": "^8.0.2", + "is-actual-promise": "^1.0.1", + "minipass": "^7.0.4", + "signal-exit": "4.1", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "node_modules/@tapjs/error-serdes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.0.tgz", + "integrity": "sha512-qP266uvPm2G95ClPFpqAN6n4nicLbHrZYbZWl0UO+biOdmvjSSuxeY5f7YFygTl+UuzlyxjlRgHTq8qifnqTcw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "BlueOak-1.0.0", "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" + "minipass": "^7.0.4" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "node_modules/@tapjs/filter": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.4.tgz", + "integrity": "sha512-Bpbahk/Bv30ZfGoDpZVjGhvg8Cq2yqCZcawd+4qtTTSDY+V7GEpdJGu2/2EvwXP+s4PklPx2kFry8X9m6OtAog==", "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" }, - "bin": { - "c8": "bin/c8.js" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, - "engines": { - "node": ">=10.12.0" + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "node_modules/@tapjs/fixture": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.4.tgz", + "integrity": "sha512-zRv1vD2H/2abt0S5Yr5ICV/ZaIqXmusBZ6H4Qbih9oE2jvbs6AVDz5Td0adZbWurtHrPLuOFTIz2UsbJfhCCcw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "mkdirp": "^3.0.0", + "rimraf": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/caching-transform/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/@tapjs/intercept": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.4.tgz", + "integrity": "sha512-7ifEMPmp4yKHQ7PqdPwCetipFLvCegbIyKigEDds/p03ZNFJjgF06D9T4vc/m0sA5SKkPrHVTOU0UzaSrliP7w==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "semver": "^6.0.0" + "@tapjs/after": "3.3.4", + "@tapjs/stack": "4.3.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/caching-transform/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@tapjs/mock": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.2.tgz", + "integrity": "sha512-B6SfNWjWCPvjN9CaHe45lEcl2ZFDkQIUoF5jPthwi2mYxHLfyFFEqorZJhguoTs7ToeXvIqquqE/Luk9IeuKBQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.4", + "@tapjs/stack": "4.3.0", + "resolve-import": "^2.4.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@tapjs/node-serialize": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.4.tgz", + "integrity": "sha512-SECDvjBS7NVCiCZ6vEtMwtxxSuR61NHBva+PlIQ1mU0asoTYxV9lpRNEAb9UHFKpquEDlk+bLg2iN01a2nfMuw==", "dev": true, - "peer": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/error-serdes": "4.3.0", + "@tapjs/stack": "4.3.0", + "tap-parser": "18.3.0" + }, "engines": { - "node": ">=6" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@tapjs/processinfo": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", + "integrity": "sha512-yIbYH9ROI5m5F2B5Hpk6t89OkHBrDbL3qncPO9OfPuSvJsvAIDG91I0hxGQNohdaxmqz5L4QiIYc5Y0KmtLzCQ==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "node-options-to-argv": "^1.0.0", + "pirates": "^4.0.5", + "process-on-spawn": "^1.0.0", + "signal-exit": "^4.0.2", + "uuid": "^8.3.2" + }, "engines": { - "node": ">=6" + "node": ">=16.17" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001563", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", - "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@tapjs/reporter": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.4.tgz", + "integrity": "sha512-svWmpJgMQxe4iiKOVr/Hi5kGHJNBDp2Nr8gD0aQuAQ4fp9gOh2LFQXa2Jv7LBKhMjC7UaiW/X7k1qEVk2nOfvg==", "dev": true, - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@tapjs/config": "5.5.2", + "@tapjs/stack": "4.3.0", + "chalk": "^5.6.2", + "ink": "^5.2.1", + "minipass": "^7.0.4", + "ms": "^2.1.3", + "patch-console": "^2.0.0", + "prismjs-terminal": "^1.2.3", + "react": "^18.2.0", + "string-length": "^6.0.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" + } + }, + "node_modules/@tapjs/run": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.2.tgz", + "integrity": "sha512-Oq5YZvoGxEohRWK8P1wHPIAnudEOHPd/bIWawFtRn0ZGvF7bRduZlHpf4eEIrRHKY84G/I3fmC354604cejxiQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/which": "^7.0.4", + "@tapjs/after": "3.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/config": "5.5.2", + "@tapjs/processinfo": "^3.1.9", + "@tapjs/reporter": "4.4.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", + "c8": "^10.1.3", + "chalk": "^5.6.2", + "chokidar": "^4.0.2", + "foreground-child": "^4.0.0", + "glob": "^13.0.2", + "minipass": "^7.0.4", + "mkdirp": "^3.0.1", + "node-options-to-argv": "^1.0.0", + "opener": "^1.5.2", + "pacote": "^21.0.4", + "path-scurry": "^2.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "semver": "^7.7.2", + "signal-exit": "^4.1.0", + "tap-parser": "18.3.0", + "tap-yaml": "4.3.0", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" + }, + "bin": { + "tap-run": "dist/esm/index.js" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@tapjs/snapshot": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.4.tgz", + "integrity": "sha512-2sJXaGLJUMakkdJd5iDWRucgyHX7f5eP05m4weqWq9dLzX7p1JFOrWXUwns8RCIY7VX9Vx+4jENlxJOywYjyqg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "BlueOak-1.0.0", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "is-actual-promise": "^1.0.1", + "tcompare": "9.3.0", + "trivial-deferred": "^2.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": "20 || >=22" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@tapjs/spawn": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.4.tgz", + "integrity": "sha512-qQY2SSLkXknpL1kndLS1bCPo9vYKV8Ka93UPIllvDEwaY3oUMghh++EOE4dyUxQPgMFpmoUoj8kSbm2hotevbQ==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 6" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@tapjs/stack": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.0.tgz", + "integrity": "sha512-SFASe4YaVBzMr/FXTm/QsSzbzXZOmgDNpmY3EU0JNiDCN4izHMUnoXY+Kh0EY35hx9C4JDvRjgv2MSIM7bBygg==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=6" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@tapjs/stdin": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.4.tgz", + "integrity": "sha512-0kFeaPEGwNWx8R0z9Uq93/CNhAg+9NbTPZW+GXsjuHQSG125g7VZBNBAg2IMeQmVQ9bUWa3+f5TNp/JnLVvJmg==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" + } + }, + "node_modules/@tapjs/test": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.2.tgz", + "integrity": "sha512-YuUgTffPNGzodjeHOsaF/j0/5B/bAqtfgwqUkqa3mWdwqzlmB2AcIA6lBtLaQfbjG8wgGNwYfs3McgxkGRqxfA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "glob": "^13.0.2", + "jackspeak": "^4.2.3", + "mkdirp": "^3.0.0", + "package-json-from-dist": "^1.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.0.0", + "sync-content": "^2.0.4", + "tap-parser": "18.3.0", + "tshy": "^3.3.2", + "typescript": "5.9", + "walk-up-path": "^4.0.0" + }, + "bin": { + "generate-tap-test-class": "dist/esm/build.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@tapjs/typescript": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.4.tgz", + "integrity": "sha512-z8O10CpbPYoHA876Dlg40qXtM058akP76HNQy+EdNE+AhFo7kold4YBgyjYRU7WDWNlp2B/MPgsy/OZ4PRXQWw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "color-name": "~1.1.4" + "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" }, "engines": { - "node": ">=7.0.0" + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/@tapjs/worker": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.4.tgz", + "integrity": "sha512-AvmfwMgJXB/eOwIti/rOvw1l1eHsxUex3lyrhiC6uK5iOmbHWBOFsGHwEfc7Z4eertPM6FUqnZxkxkTEVGueig==", "dev": true, - "bin": { - "color-support": "bin.js" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "@tapjs/core": "4.5.2" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "node_modules/@tsconfig/node14": { + "version": "14.1.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.8.tgz", + "integrity": "sha512-SjGT+qPvh8Uhc849yNMD0ZIPr69AyB7Z46nMqhrI3gCVocd6mhI0jP4YE4onO/ufpmengRfTxNMpdpKEp2xRIg==", + "dev": true, + "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "node_modules/@tsconfig/node16": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.8.tgz", + "integrity": "sha512-T/CfdwFry660WjZor56z0F3pxeCllt8KOxWcHFW6ZEuULKUObTDEMdgtctyuJPxwqyWDsvHRfxHaJ4FIICyoqQ==", + "dev": true, + "license": "MIT" }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "node_modules/@tsconfig/node18": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.6.tgz", + "integrity": "sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==", + "dev": true, + "license": "MIT" }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "node_modules/@tsconfig/node20": { + "version": "20.1.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz", + "integrity": "sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==", + "dev": true, + "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@tufjs/models": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.588", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", - "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@types/unist": "*" } }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } + "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/@types/node": { + "version": "25.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", + "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "undici-types": "~7.18.0" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, - "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT" }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@typescript/native-preview": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-kEUE54Shr4VfD1aVlxBkT9EVRkdSklINPxcUdFDwWQYh+uNRfgM/KmGUapbhCnoaat8ALRv30X6r6Eu3WiEhGg==", "dev": true, + "license": "Apache-2.0", "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" + "tsgo": "bin/tsgo.js" }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "optionalDependencies": { + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260228.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260228.1" + } + }, + "node_modules/@typescript/native-preview-darwin-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-WzU0dbBNrEC/qS/axWxcxSosQNg422SdEq/aPf/98RDjYQVy1ILH0UU1aOyzROujPyUBPeVho71MrFEhb9uh6g==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/@typescript/native-preview-darwin-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-6QJ3PApmZoc87exMhashVL/gjNG+1Ph5OkUT3GXblM5PucXdEuVr1d86TC0O31EBbqUWWKUbp+U/BiTko1gOHw==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/@typescript/native-preview-linux-arm": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-H2rKa7vjt/kfzlz+sdXW5VU/f8PcemCbW4JLcAi4esSUSDYDNsOHYCgLdrOrvUA9IBK86kunkTsJVvKJLpy+jQ==", + "cpu": [ + "arm" + ], "dev": true, - "peer": true + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/@typescript/native-preview-linux-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-oVJ689FnZuwm0+MEFtbWcI9kqCfU8+7/z23d2SgMl5M4NKYk5CqUsOtm6IGwZRRLJONKhmSdAzOCSbMN9UTLEg==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/@typescript/native-preview-linux-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-W4/N02tp9CSd+ZO5p6KyyKqXmqMA2vtVcvnjBLyPDZQ4KgUAeRMJFzH/7ME2BN3BxZCplX5WFXfmI6fkc+1z+w==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/@typescript/native-preview-win32-arm64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-AB6NhxIInyeIzINJLhIzNo4qQOEHp/YvATptTK6vcngBq9syb2ST6UAMIAtl2Vj1m9wjMpUyHzzcJK/1c1MemA==", + "cpu": [ + "arm64" + ], "dev": true, - "peer": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/@typescript/native-preview-win32-x64": { + "version": "7.0.0-dev.20260228.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260228.1.tgz", + "integrity": "sha512-9Wq1d0ZbrJcF6NoODw4+SRNdcZtKMmm2w32Wlo+r6ZIziBF5HFWvJcwGXNE0pbFpX6H/Gs8dhLaDKZU2dLoWOA==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", - "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", - "dev": true - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true, - "peer": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-loop": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", - "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "peer": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "peer": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", - "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", - "dev": true, - "dependencies": { - "cliui": "^7.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libtap": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.1.tgz", - "integrity": "sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw==", - "dev": true, - "dependencies": { - "async-hook-domain": "^2.0.4", - "bind-obj-methods": "^3.0.0", - "diff": "^4.0.2", - "function-loop": "^2.0.1", - "minipass": "^3.1.5", - "own-or": "^1.0.0", - "own-or-env": "^1.0.2", - "signal-exit": "^3.0.4", - "stack-utils": "^2.0.4", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "tcompare": "^5.0.6", - "trivial-deferred": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "peer": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "peer": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", - "dev": true - }, - "node_modules/own-or-env": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", - "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", - "dev": true, - "dependencies": { - "own-or": "^1.0.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, + "acorn": "^8.11.0" + }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "environment": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "Python-2.0" }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/async-hook-domain": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-4.0.1.tgz", + "integrity": "sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/shiki": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", - "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "18 || 20 || >=22" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "node_modules/c8": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", + "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", "dev": true, + "license": "ISC", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "@bcoe/v8-coverage": "^1.0.1", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } } }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/c8/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "semver": "^6.0.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/spawn-wrap/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/cacache": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", "dev": true, + "license": "ISC", "dependencies": { - "escape-string-regexp": "^2.0.0" + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "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": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap": { - "version": "16.3.9", - "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.9.tgz", - "integrity": "sha512-KKmu12hRJhb/kGvVV/UKBOJ90sNoGbcXF0E+VmNqej1DqaCmZHyOXR8R7E66qg2Wor33XhSHGrku5MPYWSRNWw==", - "bundleDependencies": [ - "ink", - "treport", - "@types/react", - "@isaacs/import-jsx", - "react" - ], + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/import-jsx": "^4.0.1", - "@types/react": "^17.0.52", - "chokidar": "^3.3.0", - "findit": "^2.0.0", - "foreground-child": "^2.0.0", - "fs-exists-cached": "^1.0.0", - "glob": "^7.2.3", - "ink": "^3.2.0", - "isexe": "^2.0.0", - "istanbul-lib-processinfo": "^2.0.3", - "jackspeak": "^1.4.2", - "libtap": "^1.4.0", - "minipass": "^3.3.4", - "mkdirp": "^1.0.4", - "nyc": "^15.1.0", - "opener": "^1.5.1", - "react": "^17.0.2", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.6", - "source-map-support": "^0.5.16", - "tap-mocha-reporter": "^5.0.3", - "tap-parser": "^11.0.2", - "tap-yaml": "^1.0.2", - "tcompare": "^5.0.7", - "treport": "^3.0.4", - "which": "^2.0.2" - }, - "bin": { - "tap": "bin/run.js" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "coveralls": "^3.1.1", - "flow-remove-types": ">=2.112.0", - "ts-node": ">=8.5.2", - "typescript": ">=3.7.2" - }, - "peerDependenciesMeta": { - "coveralls": { - "optional": true - }, - "flow-remove-types": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tap-mocha-reporter": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz", - "integrity": "sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { - "color-support": "^1.1.0", - "debug": "^4.1.1", - "diff": "^4.0.1", - "escape-string-regexp": "^2.0.0", - "glob": "^7.0.5", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "bin": { - "tap-mocha-reporter": "index.js" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/tap-parser": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", - "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - }, - "bin": { - "tap-parser": "bin/cmd.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tap-yaml": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", - "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "dependencies": { - "yaml": "^1.10.2" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@ampproject/remapping": { - "version": "2.2.1", + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/code-frame": { - "version": "7.22.5", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.5" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/compat-data": { - "version": "7.22.9", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/core": { - "version": "7.22.9", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/tap/node_modules/@babel/generator": { - "version": "7.22.9", + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "convert-to-spaces": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=7.0.0" } }, - "node_modules/tap/node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helper-function-name": { - "version": "7.22.5", + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/tap/node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/tap/node_modules/@babel/helper-module-imports": { - "version": "7.22.5", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/types": "^7.22.5" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/tap/node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "ms": "^2.1.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/tap/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=6.9.0" + "node": ">=0.3.1" } }, - "node_modules/tap/node_modules/@babel/helper-simple-access": { - "version": "7.22.5", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=6.9.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/tap/node_modules/@babel/helper-string-parser": { - "version": "7.22.5", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-toolkit": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", + "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "workspaces": [ + "docs", + "benchmarks" + ] }, - "node_modules/tap/node_modules/@babel/helper-validator-option": { - "version": "7.22.5", + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, - "inBundle": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, - "node_modules/tap/node_modules/@babel/helpers": { - "version": "7.22.6", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/tap/node_modules/@babel/highlight": { - "version": "7.22.5", + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/parser": { - "version": "7.22.7", + "node_modules/events-to-array": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", + "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, + "license": "ISC", "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", + "node_modules/foreground-child": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", + "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "signal-exit": "^4.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, - "inBundle": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "minipass": "^7.0.3" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/function-loop": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-4.0.0.tgz", + "integrity": "sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/@babel/template": { - "version": "7.22.5", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "inBundle": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "lru-cache": "^11.1.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/@babel/traverse": { - "version": "7.22.8", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" } }, - "node_modules/tap/node_modules/@babel/types": { - "version": "7.22.5", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" } }, - "node_modules/tap/node_modules/@isaacs/import-jsx": { - "version": "4.0.1", + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, - "inBundle": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/core": "^7.5.5", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "caller-path": "^3.0.1", - "find-cache-dir": "^3.2.0", - "make-dir": "^3.0.2", - "resolve-from": "^3.0.0", - "rimraf": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/tap/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "minimatch": "^10.0.3" }, "engines": { - "node": ">=6.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=0.8.19" } }, - "node_modules/tap/node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/tap/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", + "node_modules/ink": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", + "integrity": "sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@alcalzone/ansi-tokenize": "^0.1.3", + "ansi-escapes": "^7.0.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.22.0", + "indent-string": "^5.0.0", + "is-in-ci": "^1.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.29.0", + "scheduler": "^0.23.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^7.2.0", + "type-fest": "^4.27.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yoga-layout": "~3.2.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0", + "react-devtools-core": "^4.19.1" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } } }, - "node_modules/tap/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/@types/prop-types": { - "version": "15.7.5", + "node_modules/ink/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/tap/node_modules/@types/react": { - "version": "17.0.62", + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "engines": { + "node": ">= 12" } }, - "node_modules/tap/node_modules/@types/scheduler": { - "version": "0.16.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/@types/yoga-layout": { - "version": "1.9.2", + "node_modules/is-actual-promise": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz", + "integrity": "sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "BlueOak-1.0.0" }, - "node_modules/tap/node_modules/ansi-escapes": { - "version": "4.3.2", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", + "node_modules/is-in-ci": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", + "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", "dev": true, - "inBundle": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tap/node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/ansicolors": { - "version": "0.3.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/astral-regex": { - "version": "2.0.0", + "node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=20" } }, - "node_modules/tap/node_modules/auto-bind": { - "version": "4.0.0", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tap/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" } }, - "node_modules/tap/node_modules/browserslist": { - "version": "4.21.9", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10" } }, - "node_modules/tap/node_modules/caller-callsite": { - "version": "4.1.0", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "callsites": "^3.1.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/caller-path": { - "version": "3.0.1", + "node_modules/jackspeak": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "caller-callsite": "^4.1.0" + "@isaacs/cliui": "^9.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/callsites": { - "version": "3.1.0", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/caniuse-lite": { - "version": "1.0.30001517", + "node_modules/jsonc-simple-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-simple-parser/-/jsonc-simple-parser-3.0.0.tgz", + "integrity": "sha512-0qi9Kuj4JPar4/3b9wZteuPZrTeFzXsQyOZj7hksnReCZN3Vr17Doz7w/i3E9XH7vRkVTHhHES+r1h97I+hfww==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "dependencies": { + "reghex": "^3.0.2" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" ], - "inBundle": true, - "license": "CC-BY-4.0" + "license": "MIT" }, - "node_modules/tap/node_modules/cardinal": { - "version": "2.1.1", + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" + "uc.micro": "^2.0.0" } }, - "node_modules/tap/node_modules/chalk": { - "version": "2.4.2", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/tap/node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/cli-boxes": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/cli-cursor": { - "version": "3.1.0", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/tap/node_modules/cli-truncate": { - "version": "2.1.0", + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/code-excerpt": { - "version": "3.0.0", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.4.tgz", + "integrity": "sha512-vM2sG+wbVeVGYcCm16mM3d5fuem9oC28n436HjsGO3LcxoTI8LNVa4rwZDn3f76+cWyT4GGJDxjTYU1I2nr6zw==", + "dev": true, + "license": "ISC", "dependencies": { - "convert-to-spaces": "^1.0.1" + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": ">=10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/tap/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/convert-source-map": { - "version": "1.9.0", + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/convert-to-spaces": { - "version": "1.0.2", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/tap/node_modules/csstype": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/debug": { - "version": "4.3.4", + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ms": "2.1.2" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=6.0" + "node": "18 || 20 || >=22" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/electron-to-chromium": { - "version": "1.4.477", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/tap/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/tap/node_modules/escalade": { - "version": "3.1.1", + "node_modules/minipass-fetch": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" } }, - "node_modules/tap/node_modules/escape-string-regexp": { + "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, - "node_modules/tap/node_modules/esprima": { - "version": "4.0.1", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/tap/node_modules/events-to-array": { - "version": "1.1.2", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "inBundle": true, "license": "ISC" }, - "node_modules/tap/node_modules/find-cache-dir": { - "version": "3.3.2", + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "minipass": "^3.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/tap/node_modules/find-up": { - "version": "4.1.0", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "inBundle": true, "license": "ISC" }, - "node_modules/tap/node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/glob": { - "version": "7.2.3", + "node_modules/minipass-sized": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "dev": true, - "inBundle": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/tap/node_modules/globals": { - "version": "11.12.0", + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, "engines": { - "node": ">=4" + "node": ">= 18" } }, - "node_modules/tap/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "inBundle": true, "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/indent-string": { - "version": "4.0.0", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/tap/node_modules/inflight": { - "version": "1.0.6", + "node_modules/node-gyp": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", + "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/inherits": { - "version": "2.0.4", + "node_modules/node-options-to-argv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-options-to-argv/-/node-options-to-argv-1.0.0.tgz", + "integrity": "sha512-99rLlP+Cn/FsSV9kjpk2UmF2Ltmrpv/L9U7fUfws/MVXkeZWPpPDsQkMr79qCvSF/oTKVVJBTm5sHzmK2j6IIg==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0" }, - "node_modules/tap/node_modules/ink": { - "version": "3.2.0", + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "auto-bind": "4.0.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.20", - "patch-console": "^1.0.0", - "react-devtools-core": "^4.19.1", - "react-reconciler": "^0.26.2", - "scheduler": "^0.20.2", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "stack-utils": "^2.0.2", - "string-width": "^4.2.2", - "type-fest": "^0.12.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "ws": "^7.5.5", - "yoga-layout-prebuilt": "^1.9.6" - }, - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" }, - "peerDependencies": { - "@types/react": ">=16.8.0", - "react": ">=16.8.0" + "bin": { + "nopt": "bin/nopt.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/ink/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/npm-bundled": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/ink/node_modules/chalk": { - "version": "4.1.2", + "node_modules/npm-install-checks": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "semver": "^7.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/ink/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, + "license": "ISC", "engines": { - "node": ">=7.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/ink/node_modules/color-name": { - "version": "1.1.4", + "node_modules/npm-package-arg": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/tap/node_modules/ink/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/npm-packlist": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/ink/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/npm-pick-manifest": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^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" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/is-ci": { - "version": "2.0.0", + "node_modules/npm-registry-fetch": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ci-info": "^2.0.0" + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/js-tokens": { - "version": "4.0.0", + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } }, - "node_modules/tap/node_modules/jsesc": { - "version": "2.5.2", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "inBundle": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/json5": { - "version": "2.2.3", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "inBundle": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/lodash": { - "version": "4.17.21", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "BlueOak-1.0.0" }, - "node_modules/tap/node_modules/loose-envify": { - "version": "1.4.0", + "node_modules/pacote": { + "version": "21.4.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.4.0.tgz", + "integrity": "sha512-DR7mn7HUOomAX1BORnpYy678qVIidbvOojkBscqy27dRKN+s/hLeQT1MeYYrx1Cxh62jyKjiWiDV7RTTqB+ZEQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" }, "bin": { - "loose-envify": "cli.js" + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/lru-cache": { - "version": "5.1.1", + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/tap/node_modules/make-dir": { - "version": "3.1.0", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tap/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/minipass": { - "version": "3.3.6", + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tap/node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/node-releases": { - "version": "2.0.13", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/object-assign": { - "version": "4.1.1", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/tap/node_modules/once": { - "version": "1.4.0", + "node_modules/polite-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz", + "integrity": "sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/onetime": { - "version": "5.1.2", + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/tap/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/prismjs-terminal": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.4.tgz", + "integrity": "sha512-S2nsjy6s2x2jF4uTW8ulX19rvmRfe9R1wmnNwI5wmBgQEErB0vuKueVPMzN6KsFRCCJ2IQrWUS0BqhcNsrR9xg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "p-limit": "^2.2.0" + "chalk": "^5.2.0", + "prismjs": "^1.30.0", + "string-length": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/p-try": { - "version": "2.2.0", + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/patch-console": { - "version": "1.0.0", + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/tap/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/tap/node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/tap/node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/tap/node_modules/punycode": { - "version": "2.3.0", + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/react": { - "version": "17.0.2", + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, - "inBundle": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "scheduler": "^0.23.2" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/tap/node_modules/react-devtools-core": { - "version": "4.28.0", + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" } }, - "node_modules/tap/node_modules/react-reconciler": { - "version": "0.26.2", + "node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.2" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^17.0.2" + "react": "^18.3.1" } }, - "node_modules/tap/node_modules/redeyed": { - "version": "2.1.1", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/tap/node_modules/resolve-from": { - "version": "3.0.0", + "node_modules/reghex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/reghex/-/reghex-3.0.2.tgz", + "integrity": "sha512-Zb9DJ5u6GhgqRSBnxV2QSnLqEwcKxHWFA1N2yUa4ZUAO1P8jlWKYtWZ6/ooV6yylspGXJX0O/uNzEv0xrCtwaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/restore-cursor": { - "version": "3.1.0", + "node_modules/resolve-import": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", + "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/rimraf": { - "version": "3.0.2", + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "ISC" + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^7.1.3" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/scheduler": { - "version": "0.20.2", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, - "node_modules/tap/node_modules/semver": { - "version": "6.3.1", + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "inBundle": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/tap/node_modules/shell-quote": { - "version": "1.8.1", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "inBundle": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/slice-ansi": { + "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "inBundle": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", + "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.1.0", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } }, - "node_modules/tap/node_modules/stack-utils": { - "version": "2.0.6", + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=10" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/tap/node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/tap/node_modules/string-width": { - "version": "4.2.3", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/tap/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/tap/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/string-length": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", + "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/tap-parser": { - "version": "11.0.2", + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - }, - "bin": { - "tap-parser": "bin/cmd.js" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/tap-yaml": { - "version": "1.0.2", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yaml": "^1.10.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/to-fast-properties": { - "version": "2.0.0", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/tap/node_modules/treport": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/import-jsx": "^4.0.1", - "cardinal": "^2.1.1", - "chalk": "^3.0.0", - "ink": "^3.2.0", - "ms": "^2.1.2", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "peerDependencies": { - "react": "^17.0.2" + "node": ">=8" } }, - "node_modules/tap/node_modules/treport/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tap/node_modules/treport/node_modules/chalk": { - "version": "3.0.0", + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/tap/node_modules/treport/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/treport/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/treport/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/treport/node_modules/supports-color": { + "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5628,413 +4094,508 @@ "node": ">=8" } }, - "node_modules/tap/node_modules/type-fest": { - "version": "0.12.0", + "node_modules/sync-content": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.4.tgz", + "integrity": "sha512-w3ioiBmbaogob33WdLnuwFk+8tpePI58CTWKqtdAgEqc2hfGuSwP02gPETqNX/3PLS5skv5a1wQR0gbaa2W0XQ==", "dev": true, - "inBundle": true, - "license": "(MIT OR CC0-1.0)", + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.1", + "mkdirp": "^3.0.1", + "path-scurry": "^2.0.0", + "rimraf": "^6.0.0" + }, + "bin": { + "sync-content": "dist/esm/bin.mjs" + }, "engines": { - "node": ">=10" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/unicode-length": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.0.0" + "node_modules/tap": { + "version": "21.6.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.2.tgz", + "integrity": "sha512-rEuxX+EVGQ6JOEyRnLQ80fa7v5s8yutpRA11LAjP6t/B6I0/mTWkaW0NfVoX5XDX3z5x9HVEt2dojSrJLcyp9A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@tapjs/after": "3.3.4", + "@tapjs/after-each": "4.3.4", + "@tapjs/asserts": "4.3.4", + "@tapjs/before": "4.3.4", + "@tapjs/before-each": "4.3.4", + "@tapjs/chdir": "3.3.4", + "@tapjs/core": "4.5.2", + "@tapjs/filter": "4.3.4", + "@tapjs/fixture": "4.3.4", + "@tapjs/intercept": "4.3.4", + "@tapjs/mock": "4.4.2", + "@tapjs/node-serialize": "4.3.4", + "@tapjs/run": "4.5.2", + "@tapjs/snapshot": "4.3.4", + "@tapjs/spawn": "4.3.4", + "@tapjs/stdin": "4.3.4", + "@tapjs/test": "4.4.2", + "@tapjs/typescript": "3.5.4", + "@tapjs/worker": "4.3.4", + "resolve-import": "^2.4.0" + }, + "bin": { + "tap": "dist/esm/run.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/update-browserslist-db": { - "version": "1.0.11", + "node_modules/tap-parser": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.0.tgz", + "integrity": "sha512-sa0M18e6RARfO0Lrm1zbQvb+7G4G/ThkFIJFvjeH1DKenl4xwyUgpRUCb5Jq64Xe086p4auiLvRzfpRjGd3Zow==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "events-to-array": "^2.0.3", + "tap-yaml": "4.3.0" }, "bin": { - "update-browserslist-db": "cli.js" + "tap-parser": "bin/cmd.cjs" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": "20 || >=22" } }, - "node_modules/tap/node_modules/widest-line": { - "version": "3.1.0", + "node_modules/tap-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.3.0.tgz", + "integrity": "sha512-48BiwXj3cUa1Lt6BLzfawJGZVihfRCY19gyjaHftQpe8ulEmB9gZW9kChQkdb0+L4YUlGWUJMpWRAJ/9bPSgVA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "string-width": "^4.0.0" + "yaml": "^2.8.1", + "yaml-types": "^0.4.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/tap/node_modules/wrap-ansi": { - "version": "6.2.0", + "node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/tcompare": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-9.3.0.tgz", + "integrity": "sha512-6kFTU2xlXNFU88/DAAIQvjBu5znTGx8QPnFtaKiLin2OtspHXyevSu0iUTZt4UrSfuRC6fIahRCqaQIhXlsTVQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "color-convert": "^2.0.1" + "diff": "^8.0.2", + "react-element-to-jsx-string": "^15.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "20 || >=22" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", + "node_modules/test-exclude/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/tap/node_modules/wrappy": { + "node_modules/test-exclude/node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/tap/node_modules/ws": { - "version": "7.5.9", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/tap/node_modules/yallist": { - "version": "3.1.1", + "node_modules/test-exclude/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/tap/node_modules/yaml": { - "version": "1.10.2", + "node_modules/test-exclude/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "inBundle": true, "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/yoga-layout-prebuilt": { - "version": "1.10.0", + "node_modules/test-exclude/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/yoga-layout": "1.9.2" + "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" }, - "engines": { - "node": ">=8" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tcompare": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", - "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", + "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "diff": "^4.0.2" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/test-exclude/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/test-exclude/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/trivial-deferred": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz", - "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-2.0.0.tgz", + "integrity": "sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==", "dev": true, + "license": "ISC", "engines": { "node": ">= 8" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "node_modules/tshy": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.3.2.tgz", + "integrity": "sha512-vOIXkqMtBWNjKUR/c99+6N50LhWdnKG1xE3+5wf8IPdzxx2lcIFPvbGgFdBBgoTMbdNb8mz06MUm7hY+TFnJcw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@typescript/native-preview": "^7.0.0-dev.20260218.1", + "chalk": "^5.6.2", + "chokidar": "^4.0.3", + "foreground-child": "^4.0.0", + "jsonc-simple-parser": "^3.0.0", + "minimatch": "^10.0.3", + "mkdirp": "^3.0.1", + "polite-json": "^5.0.0", + "resolve-import": "^2.4.0", + "rimraf": "^6.1.2", + "sync-content": "^2.0.3", + "typescript": "^5.9.3", + "walk-up-path": "^4.0.0" }, "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "tshy": "dist/esm/bin-min.mjs" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": "20 || >=22" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tuf-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "peer": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/typedoc": { + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "is-typedarray": "^1.0.0" + "@gerrit0/mini-shiki": "^3.17.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.8.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18", + "pnpm": ">= 10" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" } }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", + "node_modules/typedoc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" + "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-length": { + "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", - "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, - "dependencies": { - "punycode": "^2.0.0" - } + "license": "MIT" }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", + "dev": true, + "license": "ISC", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" + "unique-slug": "^6.0.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/unique-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { - "punycode": "^2.1.0" + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/uuid": { @@ -6042,6 +4603,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -6050,13 +4612,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -6066,50 +4630,94 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true + "node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, + "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^4.0.0" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6122,22 +4730,97 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/y18n": { @@ -6145,59 +4828,133 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.4.0.tgz", + "integrity": "sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 16", + "npm": ">= 7" + }, + "peerDependencies": { + "yaml": "^2.3.0" } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/yocto-queue": { @@ -6205,12 +4962,20 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "dev": true, + "license": "MIT" } } } diff --git a/deps/minimatch/package.json b/deps/minimatch/package.json index fc80834f380417..d4d13530281b7e 100644 --- a/deps/minimatch/package.json +++ b/deps/minimatch/package.json @@ -2,23 +2,23 @@ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", "name": "minimatch", "description": "a glob matcher in javascript", - "version": "9.0.3", + "version": "10.2.4", "repository": { "type": "git", - "url": "git://github.com/isaacs/minimatch.git" + "url": "git@github.com:isaacs/minimatch" }, - "main": "./dist/cjs/index.js", - "module": "./dist/mjs/index.js", - "types": "./dist/cjs/index.d.ts", + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/mjs/index.d.ts", - "default": "./dist/mjs/index.js" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, @@ -29,60 +29,41 @@ "preversion": "npm test", "postversion": "npm publish", "prepublishOnly": "git push origin --follow-tags", - "preprepare": "rm -rf dist", - "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", - "postprepare": "bash fixup.sh", + "prepare": "tshy", "pretest": "npm run prepare", "presnap": "npm run prepare", - "test": "c8 tap", - "snap": "c8 tap", - "format": "prettier --write . --loglevel warn", + "test": "tap", + "snap": "tap", + "format": "prettier --write .", "benchmark": "node benchmark/index.js", - "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts", - "node-build": "esbuild ./dist/cjs/index.js --bundle --platform=node --outfile=index.js" - }, - "prettier": { - "semi": false, - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts", + "node-build": "esbuild ./dist/commonjs/index.js --bundle --platform=node --outfile=index.js" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "dependencies": { - "brace-expansion": "^2.0.1" + "node": "18 || 20 || >=22" }, "devDependencies": { - "@types/brace-expansion": "^1.1.0", - "@types/node": "^18.15.11", - "@types/tap": "^15.0.8", - "c8": "^7.12.0", - "esbuild": "^0.19.5", - "eslint-config-prettier": "^8.6.0", - "mkdirp": "1", - "prettier": "^2.8.2", - "tap": "^16.3.7", - "ts-node": "^10.9.1", - "typedoc": "^0.23.21", - "typescript": "^4.9.3" - }, - "tap": { - "coverage": false, - "node-arg": [ - "--no-warnings", - "--loader", - "ts-node/esm" - ], - "ts": false + "@types/node": "^25.3.0", + "esbuild": "^0.27.3", + "mkdirp": "^3.0.1", + "prettier": "^3.6.2", + "tap": "^21.6.2", + "tshy": "^3.0.2", + "typedoc": "^0.28.5" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, - "license": "ISC" + "license": "BlueOak-1.0.0", + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "type": "module", + "module": "./dist/esm/index.js", + "dependencies": { + "brace-expansion": "^5.0.2" + } } diff --git a/deps/nbytes/.clang-format b/deps/nbytes/.clang-format new file mode 100644 index 00000000000000..59d0684df39c9c --- /dev/null +++ b/deps/nbytes/.clang-format @@ -0,0 +1,2 @@ +BasedOnStyle: Google +SortIncludes: Never diff --git a/deps/nbytes/.gitignore b/deps/nbytes/.gitignore new file mode 100644 index 00000000000000..f1a825f2a0f689 --- /dev/null +++ b/deps/nbytes/.gitignore @@ -0,0 +1,2 @@ +cmake-build-debug +build diff --git a/deps/nbytes/.python-version b/deps/nbytes/.python-version new file mode 100644 index 00000000000000..e4fba218358722 --- /dev/null +++ b/deps/nbytes/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/deps/nbytes/BUILD.gn b/deps/nbytes/BUILD.gn new file mode 100644 index 00000000000000..c1db79d0e15cef --- /dev/null +++ b/deps/nbytes/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +nbytes_gn_build("nbytes") { +} diff --git a/deps/nbytes/CMakeLists.txt b/deps/nbytes/CMakeLists.txt new file mode 100644 index 00000000000000..f2efa3c52ba1d1 --- /dev/null +++ b/deps/nbytes/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.28) +project(nbytes) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED True) +if (NOT CMAKE_BUILD_TYPE) + message(STATUS "No build type selected, default to Release") + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) +endif() + +option(NBYTES_DEVELOPMENT_CHECKS "Enable development checks" OFF) + +include(GNUInstallDirs) +include(FetchContent) + +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +add_subdirectory(src) +enable_testing() +add_subdirectory(tests) + +install( + FILES include/nbytes.h + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + COMPONENT nbytes_development +) + +install( + TARGETS nbytes + EXPORT nbytes_targets + RUNTIME COMPONENT nbytes_runtime + LIBRARY COMPONENT nbytes_runtime + NAMELINK_COMPONENT nbytes_development + ARCHIVE COMPONENT nbytes_development + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) diff --git a/deps/nbytes/LICENSE b/deps/nbytes/LICENSE new file mode 100644 index 00000000000000..83c1fb9f1d90c4 --- /dev/null +++ b/deps/nbytes/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Node.js + +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/nbytes/README.md b/deps/nbytes/README.md new file mode 100644 index 00000000000000..9ff412adb30560 --- /dev/null +++ b/deps/nbytes/README.md @@ -0,0 +1,5 @@ +# Node.js bytes (nbytes) library + +The `nbytes` library extracts certain Node.js specific byte manipulation +functions from the core of Node.js itself and makes them available for +use in other projects that need to emulate Node.js' behavior. diff --git a/deps/nbytes/include/nbytes.h b/deps/nbytes/include/nbytes.h new file mode 100644 index 00000000000000..525a91735c954a --- /dev/null +++ b/deps/nbytes/include/nbytes.h @@ -0,0 +1,849 @@ +#ifndef NBYTES_H +#define NBYTES_H +#include <algorithm> +#include <cmath> +#include <cstddef> +#include <cstdint> +#include <cstdlib> +#include <cstring> +#include <string> + +namespace nbytes { + +#if NBYTES_DEVELOPMENT_CHECKS +#define NBYTES_STR(x) #x +#define NBYTES_REQUIRE(EXPR) \ + { \ + if (!(EXPR) { abort(); }) } + +#define NBYTES_FAIL(MESSAGE) \ + do { \ + std::cerr << "FAIL: " << (MESSAGE) << std::endl; \ + abort(); \ + } while (0); +#define NBYTES_ASSERT_EQUAL(LHS, RHS, MESSAGE) \ + do { \ + if (LHS != RHS) { \ + std::cerr << "Mismatch: '" << LHS << "' - '" << RHS << "'" << std::endl; \ + NBYTES_FAIL(MESSAGE); \ + } \ + } while (0); +#define NBYTES_ASSERT_TRUE(COND) \ + do { \ + if (!(COND)) { \ + std::cerr << "Assert at line " << __LINE__ << " of file " << __FILE__ \ + << std::endl; \ + NBYTES_FAIL(NBYTES_STR(COND)); \ + } \ + } while (0); +#else +#define NBYTES_FAIL(MESSAGE) +#define NBYTES_ASSERT_EQUAL(LHS, RHS, MESSAGE) +#define NBYTES_ASSERT_TRUE(COND) +#endif + +[[noreturn]] inline void unreachable() { +#ifdef __GNUC__ + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(false); +#else +#endif +} + +// The nbytes (short for "node bytes") is a set of utility helpers for +// working with bytes that are extracted from Node.js' internals. The +// motivation for extracting these into a separate library is to make it +// easier for other projects to implement functionality that is compatible +// with Node.js' implementation of various byte manipulation functions. + +// Round up a to the next highest multiple of b. +template <typename T> +constexpr T RoundUp(T a, T b) { + return a % b != 0 ? a + b - (a % b) : a; +} + +// Align ptr to an `alignment`-bytes boundary. +template <typename T, typename U> +constexpr T *AlignUp(T *ptr, U alignment) { + return reinterpret_cast<T *>( + RoundUp(reinterpret_cast<uintptr_t>(ptr), alignment)); +} + +template <typename T, typename U> +inline T AlignDown(T value, U alignment) { + return reinterpret_cast<T>( + (reinterpret_cast<uintptr_t>(value) & ~(alignment - 1))); +} + +template <typename T> +inline T MultiplyWithOverflowCheck(T a, T b) { + auto ret = a * b; + if (a != 0) { + NBYTES_ASSERT_TRUE(b == ret / a); + } + + return ret; +} + +void ForceAsciiSlow(const char *src, char *dst, size_t len); +void ForceAscii(const char *src, char *dst, size_t len); + +// ============================================================================ +// Byte Swapping + +// Swaps bytes in place. nbytes is the number of bytes to swap and must be a +// multiple of the word size (checked by function). +bool SwapBytes16(char *data, size_t nbytes); +bool SwapBytes32(char *data, size_t nbytes); +bool SwapBytes64(char *data, size_t nbytes); + +// ============================================================================ +// Base64 (legacy) + +#ifdef _MSC_VER +#pragma warning(push) +// MSVC C4003: not enough actual parameters for macro 'identifier' +#pragma warning(disable : 4003) +#endif + +extern const int8_t unbase64_table[256]; + +template <typename TypeName> +bool Base64DecodeGroupSlow(char *const dst, const size_t dstlen, + const TypeName *const src, const size_t srclen, + size_t *const i, size_t *const k) { + uint8_t hi; + uint8_t lo; +#define V(expr) \ + for (;;) { \ + const uint8_t c = static_cast<uint8_t>(src[*i]); \ + lo = unbase64_table[c]; \ + *i += 1; \ + if (lo < 64) break; /* Legal character. */ \ + if (c == '=' || *i >= srclen) return false; /* Stop decoding. */ \ + } \ + expr; \ + if (*i >= srclen) return false; \ + if (*k >= dstlen) return false; \ + hi = lo; + V(/* Nothing. */); + V(dst[(*k)++] = ((hi & 0x3F) << 2) | ((lo & 0x30) >> 4)); + V(dst[(*k)++] = ((hi & 0x0F) << 4) | ((lo & 0x3C) >> 2)); + V(dst[(*k)++] = ((hi & 0x03) << 6) | ((lo & 0x3F) >> 0)); +#undef V + return true; // Continue decoding. +} + +enum class Base64Mode { NORMAL, URL }; + +inline constexpr size_t Base64EncodedSize( + size_t size, Base64Mode mode = Base64Mode::NORMAL) { + return mode == Base64Mode::NORMAL ? ((size + 2) / 3 * 4) + : static_cast<size_t>(std::ceil( + static_cast<double>(size * 4) / 3)); +} + +// Doesn't check for padding at the end. Can be 1-2 bytes over. +inline constexpr size_t Base64DecodedSizeFast(size_t size) { + // 1-byte input cannot be decoded + return size > 1 ? (size / 4) * 3 + (size % 4 + 1) / 2 : 0; +} + +inline uint32_t ReadUint32BE(const unsigned char *p) { + return static_cast<uint32_t>(p[0] << 24U) | + static_cast<uint32_t>(p[1] << 16U) | + static_cast<uint32_t>(p[2] << 8U) | static_cast<uint32_t>(p[3]); +} + +template <typename TypeName> +size_t Base64DecodedSize(const TypeName *src, size_t size) { + // 1-byte input cannot be decoded + if (size < 2) return 0; + + if (src[size - 1] == '=') { + size--; + if (src[size - 1] == '=') size--; + } + return Base64DecodedSizeFast(size); +} + +template <typename TypeName> +size_t Base64DecodeFast(char *const dst, const size_t dstlen, + const TypeName *const src, const size_t srclen, + const size_t decoded_size) { + const size_t available = dstlen < decoded_size ? dstlen : decoded_size; + const size_t max_k = available / 3 * 3; + size_t max_i = srclen / 4 * 4; + size_t i = 0; + size_t k = 0; + while (i < max_i && k < max_k) { + const unsigned char txt[] = { + static_cast<unsigned char>( + unbase64_table[static_cast<uint8_t>(src[i + 0])]), + static_cast<unsigned char>( + unbase64_table[static_cast<uint8_t>(src[i + 1])]), + static_cast<unsigned char>( + unbase64_table[static_cast<uint8_t>(src[i + 2])]), + static_cast<unsigned char>( + unbase64_table[static_cast<uint8_t>(src[i + 3])]), + }; + + const uint32_t v = ReadUint32BE(txt); + // If MSB is set, input contains whitespace or is not valid base64. + if (v & 0x80808080) { + if (!Base64DecodeGroupSlow(dst, dstlen, src, srclen, &i, &k)) return k; + max_i = i + (srclen - i) / 4 * 4; // Align max_i again. + } else { + dst[k + 0] = ((v >> 22) & 0xFC) | ((v >> 20) & 0x03); + dst[k + 1] = ((v >> 12) & 0xF0) | ((v >> 10) & 0x0F); + dst[k + 2] = ((v >> 2) & 0xC0) | ((v >> 0) & 0x3F); + i += 4; + k += 3; + } + } + if (i < srclen && k < dstlen) { + Base64DecodeGroupSlow(dst, dstlen, src, srclen, &i, &k); + } + return k; +} + +template <typename TypeName> +size_t Base64Decode(char *const dst, const size_t dstlen, + const TypeName *const src, const size_t srclen) { + const size_t decoded_size = Base64DecodedSize(src, srclen); + return Base64DecodeFast(dst, dstlen, src, srclen, decoded_size); +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// ============================================================================ +// Hex (legacy) + +extern const int8_t unhex_table[256]; + +template <typename TypeName> +static size_t HexDecode(char *buf, size_t len, const TypeName *src, + const size_t srcLen) { + size_t i; + for (i = 0; i < len && i * 2 + 1 < srcLen; ++i) { + unsigned a = unhex_table[static_cast<uint8_t>(src[i * 2 + 0])]; + unsigned b = unhex_table[static_cast<uint8_t>(src[i * 2 + 1])]; + if (!~a || !~b) return i; + buf[i] = (a << 4) | b; + } + + return i; +} + +size_t HexEncode(const char *src, size_t slen, char *dst, size_t dlen); + +std::string HexEncode(const char *src, size_t slen); + +// ============================================================================ +// StringSearch + +namespace stringsearch { + +template <typename T> +class Vector { + public: + Vector(T *data, size_t length, bool isForward) + : start_(data), length_(length), is_forward_(isForward) { + CHECK(length > 0 && data != nullptr); + } + + // Returns the start of the memory range. + // For vector v this is NOT necessarily &v[0], see forward(). + const T *start() const { return start_; } + + // Returns the length of the vector, in characters. + size_t length() const { return length_; } + + // Returns true if the Vector is front-to-back, false if back-to-front. + // In the latter case, v[0] corresponds to the *end* of the memory range. + bool forward() const { return is_forward_; } + + // Access individual vector elements - checks bounds in debug mode. + T &operator[](size_t index) const { + NBYTES_ASSERT_TRUE(index < length_); + return start_[is_forward_ ? index : (length_ - index - 1)]; + } + + private: + T *start_; + size_t length_; + bool is_forward_; +}; + +//--------------------------------------------------------------------- +// String Search object. +//--------------------------------------------------------------------- + +// Class holding constants and methods that apply to all string search variants, +// independently of subject and pattern char size. +class StringSearchBase { + protected: + // Cap on the maximal shift in the Boyer-Moore implementation. By setting a + // limit, we can fix the size of tables. For a needle longer than this limit, + // search will not be optimal, since we only build tables for a suffix + // of the string, but it is a safe approximation. + static const int kBMMaxShift = 250; + + // Reduce alphabet to this size. + // One of the tables used by Boyer-Moore and Boyer-Moore-Horspool has size + // proportional to the input alphabet. We reduce the alphabet size by + // equating input characters modulo a smaller alphabet size. This gives + // a potentially less efficient searching, but is a safe approximation. + // For needles using only characters in the same Unicode 256-code point page, + // there is no search speed degradation. + static const int kLatin1AlphabetSize = 256; + static const int kUC16AlphabetSize = 256; + + // Bad-char shift table stored in the state. It's length is the alphabet size. + // For patterns below this length, the skip length of Boyer-Moore is too short + // to compensate for the algorithmic overhead compared to simple brute force. + static const int kBMMinPatternLength = 8; + + // Store for the BoyerMoore(Horspool) bad char shift table. + int bad_char_shift_table_[kUC16AlphabetSize]; + // Store for the BoyerMoore good suffix shift table. + int good_suffix_shift_table_[kBMMaxShift + 1]; + // Table used temporarily while building the BoyerMoore good suffix + // shift table. + int suffix_table_[kBMMaxShift + 1]; +}; + +template <typename Char> +class StringSearch : private StringSearchBase { + public: + typedef stringsearch::Vector<const Char> Vector; + + explicit StringSearch(Vector pattern) : pattern_(pattern), start_(0) { + if (pattern.length() >= kBMMaxShift) { + start_ = pattern.length() - kBMMaxShift; + } + + size_t pattern_length = pattern_.length(); + NBYTES_ASSERT_TRUE(pattern_length > 0); + if (pattern_length < kBMMinPatternLength) { + if (pattern_length == 1) { + strategy_ = SearchStrategy::kSingleChar; + return; + } + strategy_ = SearchStrategy::kLinear; + return; + } + strategy_ = SearchStrategy::kInitial; + } + + size_t Search(Vector subject, size_t index) { + switch (strategy_) { + case kBoyerMooreHorspool: + return BoyerMooreHorspoolSearch(subject, index); + case kBoyerMoore: + return BoyerMooreSearch(subject, index); + case kInitial: + return InitialSearch(subject, index); + case kLinear: + return LinearSearch(subject, index); + case kSingleChar: + return SingleCharSearch(subject, index); + } + unreachable(); + } + + static inline int AlphabetSize() { + if (sizeof(Char) == 1) { + // Latin1 needle. + return kLatin1AlphabetSize; + } else { + // UC16 needle. + return kUC16AlphabetSize; + } + + static_assert( + sizeof(Char) == sizeof(uint8_t) || sizeof(Char) == sizeof(uint16_t), + "sizeof(Char) == sizeof(uint16_t) || sizeof(uint8_t)"); + } + + private: + typedef size_t (StringSearch::*SearchFunction)(Vector, size_t); + size_t SingleCharSearch(Vector subject, size_t start_index); + size_t LinearSearch(Vector subject, size_t start_index); + size_t InitialSearch(Vector subject, size_t start_index); + size_t BoyerMooreHorspoolSearch(Vector subject, size_t start_index); + size_t BoyerMooreSearch(Vector subject, size_t start_index); + + void PopulateBoyerMooreHorspoolTable(); + + void PopulateBoyerMooreTable(); + + static inline int CharOccurrence(int *bad_char_occurrence, Char char_code) { + if (sizeof(Char) == 1) { + return bad_char_occurrence[static_cast<int>(char_code)]; + } + // Both pattern and subject are UC16. Reduce character to equivalence class. + int equiv_class = char_code % kUC16AlphabetSize; + return bad_char_occurrence[equiv_class]; + } + + enum SearchStrategy { + kBoyerMooreHorspool, + kBoyerMoore, + kInitial, + kLinear, + kSingleChar, + }; + + // The pattern to search for. + Vector pattern_; + SearchStrategy strategy_; + // Cache value of Max(0, pattern_length() - kBMMaxShift) + size_t start_; +}; + +inline uint8_t GetHighestValueByte(uint16_t character) { + return std::max(static_cast<uint8_t>(character & 0xFF), + static_cast<uint8_t>(character >> 8)); +} + +inline uint8_t GetHighestValueByte(uint8_t character) { return character; } + +// Searches for a byte value in a memory buffer, back to front. +// Uses memrchr(3) on systems which support it, for speed. +// Falls back to a vanilla for loop on non-GNU systems such as Windows. +inline const void *MemrchrFill(const void *haystack, uint8_t needle, + size_t haystack_len) { +#ifdef _GNU_SOURCE + return memrchr(haystack, needle, haystack_len); +#else + const uint8_t *haystack8 = static_cast<const uint8_t *>(haystack); + for (size_t i = haystack_len - 1; i != static_cast<size_t>(-1); i--) { + if (haystack8[i] == needle) { + return haystack8 + i; + } + } + return nullptr; +#endif +} + +// Finds the first occurrence of *two-byte* character pattern[0] in the string +// `subject`. Does not check that the whole pattern matches. +template <typename Char> +inline size_t FindFirstCharacter(Vector<const Char> pattern, + Vector<const Char> subject, size_t index) { + const Char pattern_first_char = pattern[0]; + const size_t max_n = (subject.length() - pattern.length() + 1); + + // For speed, search for the more `rare` of the two bytes in pattern[0] + // using memchr / memrchr (which are much faster than a simple for loop). + const uint8_t search_byte = GetHighestValueByte(pattern_first_char); + size_t pos = index; + do { + const size_t bytes_to_search = (max_n - pos) * sizeof(Char); + const void *void_pos; + if (subject.forward()) { + // Assert that bytes_to_search won't overflow + NBYTES_ASSERT_TRUE(pos <= max_n); + NBYTES_ASSERT_TRUE(max_n - pos <= SIZE_MAX / sizeof(Char)); + void_pos = memchr(subject.start() + pos, search_byte, bytes_to_search); + } else { + NBYTES_ASSERT_TRUE(pos <= subject.length()); + NBYTES_ASSERT_TRUE(subject.length() - pos <= SIZE_MAX / sizeof(Char)); + void_pos = MemrchrFill(subject.start() + pattern.length() - 1, + search_byte, bytes_to_search); + } + const Char *char_pos = static_cast<const Char *>(void_pos); + if (char_pos == nullptr) return subject.length(); + + // Then, for each match, verify that the full two bytes match pattern[0]. + char_pos = AlignDown(char_pos, sizeof(Char)); + size_t raw_pos = static_cast<size_t>(char_pos - subject.start()); + pos = subject.forward() ? raw_pos : (subject.length() - raw_pos - 1); + if (subject[pos] == pattern_first_char) { + // Match found, hooray. + return pos; + } + // Search byte matched, but the other byte of pattern[0] didn't. Keep going. + } while (++pos < max_n); + + return subject.length(); +} + +// Finds the first occurrence of the byte pattern[0] in string `subject`. +// Does not verify that the whole pattern matches. +template <> +inline size_t FindFirstCharacter(Vector<const uint8_t> pattern, + Vector<const uint8_t> subject, size_t index) { + const uint8_t pattern_first_char = pattern[0]; + const size_t subj_len = subject.length(); + const size_t max_n = (subject.length() - pattern.length() + 1); + + const void *pos; + if (subject.forward()) { + pos = memchr(subject.start() + index, pattern_first_char, max_n - index); + } else { + pos = MemrchrFill(subject.start() + pattern.length() - 1, + pattern_first_char, max_n - index); + } + const uint8_t *char_pos = static_cast<const uint8_t *>(pos); + if (char_pos == nullptr) { + return subj_len; + } + + size_t raw_pos = static_cast<size_t>(char_pos - subject.start()); + return subject.forward() ? raw_pos : (subj_len - raw_pos - 1); +} + +//--------------------------------------------------------------------- +// Single Character Pattern Search Strategy +//--------------------------------------------------------------------- + +template <typename Char> +size_t StringSearch<Char>::SingleCharSearch(Vector subject, size_t index) { + NBYTES_ASSERT_TRUE(1 == pattern_.length()); + return FindFirstCharacter(pattern_, subject, index); +} + +//--------------------------------------------------------------------- +// Linear Search Strategy +//--------------------------------------------------------------------- + +// Simple linear search for short patterns. Never bails out. +template <typename Char> +size_t StringSearch<Char>::LinearSearch(Vector subject, size_t index) { + NBYTES_ASSERT_TRUE(pattern_.length() > 1); + const size_t n = subject.length() - pattern_.length(); + for (size_t i = index; i <= n; i++) { + i = FindFirstCharacter(pattern_, subject, i); + if (i == subject.length()) return subject.length(); + NBYTES_ASSERT_TRUE(i <= n); + + bool matches = true; + for (size_t j = 1; j < pattern_.length(); j++) { + if (pattern_[j] != subject[i + j]) { + matches = false; + break; + } + } + if (matches) { + return i; + } + } + return subject.length(); +} + +//--------------------------------------------------------------------- +// Boyer-Moore string search +//--------------------------------------------------------------------- + +template <typename Char> +size_t StringSearch<Char>::BoyerMooreSearch(Vector subject, + size_t start_index) { + const size_t subject_length = subject.length(); + const size_t pattern_length = pattern_.length(); + // Only preprocess at most kBMMaxShift last characters of pattern. + size_t start = start_; + + int *bad_char_occurrence = bad_char_shift_table_; + + auto good_suffix_get = [&](size_t idx) -> int { + if (idx < start || idx - start > kBMMaxShift) return 0; + return good_suffix_shift_table_[idx - start]; + }; + + Char last_char = pattern_[pattern_length - 1]; + size_t index = start_index; + // Continue search from i. + while (index <= subject_length - pattern_length) { + size_t j = pattern_length - 1; + int c; + while (last_char != (c = subject[index + j])) { + int shift = j - CharOccurrence(bad_char_occurrence, c); + index += shift; + if (index > subject_length - pattern_length) { + return subject.length(); + } + } + while (pattern_[j] == (c = subject[index + j])) { + if (j == 0) { + return index; + } + j--; + } + if (j < start) { + // we have matched more than our tables allow us to be smart about. + // Fall back on BMH shift. + index += + pattern_length - 1 - CharOccurrence(bad_char_occurrence, last_char); + } else { + int gs_shift = good_suffix_get(j + 1); + int bc_occ = CharOccurrence(bad_char_occurrence, c); + int shift = j - bc_occ; + if (gs_shift > shift) { + shift = gs_shift; + } + index += shift; + } + } + + return subject.length(); +} + +template <typename Char> +void StringSearch<Char>::PopulateBoyerMooreTable() { + const size_t pattern_length = pattern_.length(); + const size_t start = start_; + const size_t length = pattern_length - start; + + auto shift_get = [&](size_t idx) -> int & { + if (idx < start) abort(); + return good_suffix_shift_table_[idx - start]; + }; + + auto suffix_get = [&](size_t idx) -> int & { + if (idx < start) abort(); + return suffix_table_[idx - start]; + }; + + // Initialize table. + for (size_t i = start; i < pattern_length; i++) { + shift_get(i) = length; + } + shift_get(pattern_length) = 1; + suffix_get(pattern_length) = pattern_length + 1; + + if (pattern_length <= start) { + return; + } + + // Find suffixes. + Char last_char = pattern_[pattern_length - 1]; + size_t suffix = pattern_length + 1; + { + size_t i = pattern_length; + while (i > start) { + Char c = pattern_[i - 1]; + while (suffix <= pattern_length && c != pattern_[suffix - 1]) { + if (static_cast<size_t>(shift_get(suffix)) == length) { + shift_get(suffix) = suffix - i; + } + suffix = suffix_get(suffix); + } + suffix_get(--i) = --suffix; + if (suffix == pattern_length) { + // No suffix to extend, so we check against last_char only. + while ((i > start) && (pattern_[i - 1] != last_char)) { + if (static_cast<size_t>(shift_get(pattern_length)) == length) { + shift_get(pattern_length) = pattern_length - i; + } + suffix_get(--i) = pattern_length; + } + if (i > start) { + suffix_get(--i) = --suffix; + } + } + } + } + + // Build shift table using suffixes. + if (suffix < pattern_length) { + for (size_t i = start; i <= pattern_length; i++) { + if (static_cast<size_t>(shift_get(i)) == length) { + shift_get(i) = suffix - start; + } + if (i == suffix) { + suffix = suffix_get(suffix); + } + } + } +} + +//--------------------------------------------------------------------- +// Boyer-Moore-Horspool string search. +//--------------------------------------------------------------------- + +template <typename Char> +size_t StringSearch<Char>::BoyerMooreHorspoolSearch(Vector subject, + size_t start_index) { + const size_t subject_length = subject.length(); + const size_t pattern_length = pattern_.length(); + int *char_occurrences = bad_char_shift_table_; + int64_t badness = -static_cast<int64_t>(pattern_length); + + // How bad we are doing without a good-suffix table. + Char last_char = pattern_[pattern_length - 1]; + int last_char_shift = + pattern_length - 1 - CharOccurrence(char_occurrences, last_char); + + // Perform search + size_t index = start_index; // No matches found prior to this index. + while (index <= subject_length - pattern_length) { + size_t j = pattern_length - 1; + int subject_char; + while (last_char != (subject_char = subject[index + j])) { + int bc_occ = CharOccurrence(char_occurrences, subject_char); + int shift = j - bc_occ; + index += shift; + badness += 1 - shift; // at most zero, so badness cannot increase. + if (index > subject_length - pattern_length) { + return subject_length; + } + } + j--; + while (pattern_[j] == (subject[index + j])) { + if (j == 0) { + return index; + } + j--; + } + index += last_char_shift; + // Badness increases by the number of characters we have + // checked, and decreases by the number of characters we + // can skip by shifting. It's a measure of how we are doing + // compared to reading each character exactly once. + badness += (pattern_length - j) - last_char_shift; + if (badness > 0) { + PopulateBoyerMooreTable(); + strategy_ = SearchStrategy::kBoyerMoore; + return BoyerMooreSearch(subject, index); + } + } + return subject.length(); +} + +template <typename Char> +void StringSearch<Char>::PopulateBoyerMooreHorspoolTable() { + const size_t pattern_length = pattern_.length(); + + int *bad_char_occurrence = bad_char_shift_table_; + + // Only preprocess at most kBMMaxShift last characters of pattern. + const size_t start = start_; + // Run forwards to populate bad_char_table, so that *last* instance + // of character equivalence class is the one registered. + // Notice: Doesn't include the last character. + const size_t table_size = AlphabetSize(); + if (start == 0) { + // All patterns less than kBMMaxShift in length. + memset(bad_char_occurrence, -1, table_size * sizeof(*bad_char_occurrence)); + } else { + for (size_t i = 0; i < table_size; i++) { + bad_char_occurrence[i] = start - 1; + } + } + for (size_t i = start; i < pattern_length - 1; i++) { + Char c = pattern_[i]; + int bucket = (sizeof(Char) == 1) ? c : c % AlphabetSize(); + bad_char_occurrence[bucket] = i; + } +} + +//--------------------------------------------------------------------- +// Linear string search with bailout to BMH. +//--------------------------------------------------------------------- + +// Simple linear search for short patterns, which bails out if the string +// isn't found very early in the subject. Upgrades to BoyerMooreHorspool. +template <typename Char> +size_t StringSearch<Char>::InitialSearch(Vector subject, size_t index) { + const size_t pattern_length = pattern_.length(); + // Badness is a count of how much work we have done. When we have + // done enough work we decide it's probably worth switching to a better + // algorithm. + int64_t badness = -10 - (pattern_length << 2); + + // We know our pattern is at least 2 characters, we cache the first so + // the common case of the first character not matching is faster. + for (size_t i = index, n = subject.length() - pattern_length; i <= n; i++) { + badness++; + if (badness <= 0) { + i = FindFirstCharacter(pattern_, subject, i); + if (i == subject.length()) return subject.length(); + NBYTES_ASSERT_TRUE(i <= n); + size_t j = 1; + do { + if (pattern_[j] != subject[i + j]) { + break; + } + j++; + } while (j < pattern_length); + if (j == pattern_length) { + return i; + } + badness += j; + } else { + PopulateBoyerMooreHorspoolTable(); + strategy_ = SearchStrategy::kBoyerMooreHorspool; + return BoyerMooreHorspoolSearch(subject, i); + } + } + return subject.length(); +} + +// Perform a single stand-alone search. +// If searching multiple times for the same pattern, a search +// object should be constructed once and the Search function then called +// for each search. +template <typename Char> +size_t SearchString(Vector<const Char> subject, Vector<const Char> pattern, + size_t start_index) { + StringSearch<Char> search(pattern); + return search.Search(subject, start_index); +} +} // namespace stringsearch + +template <typename Char> +size_t SearchString(const Char *haystack, size_t haystack_length, + const Char *needle, size_t needle_length, + size_t start_index, bool is_forward) { + if (haystack_length < needle_length) return haystack_length; + // To do a reverse search (lastIndexOf instead of indexOf) without redundant + // code, create two vectors that are reversed views into the input strings. + // For example, v_needle[0] would return the *last* character of the needle. + // So we're searching for the first instance of rev(needle) in rev(haystack) + stringsearch::Vector<const Char> v_needle(needle, needle_length, is_forward); + stringsearch::Vector<const Char> v_haystack(haystack, haystack_length, + is_forward); + size_t diff = haystack_length - needle_length; + size_t relative_start_index; + if (is_forward) { + relative_start_index = start_index; + } else if (diff < start_index) { + relative_start_index = 0; + } else { + relative_start_index = diff - start_index; + } + size_t pos = + stringsearch::SearchString(v_haystack, v_needle, relative_start_index); + if (pos == haystack_length) { + // not found + return pos; + } + return is_forward ? pos : (haystack_length - needle_length - pos); +} + +template <size_t N> +size_t SearchString(const char *haystack, size_t haystack_length, + const char (&needle)[N]) { + return SearchString( + reinterpret_cast<const uint8_t *>(haystack), haystack_length, + reinterpret_cast<const uint8_t *>(needle), N - 1, 0, true); +} + +// ============================================================================ +// Version metadata +#define NBYTES_VERSION "0.1.1" + +enum { + NBYTES_VERSION_MAJOR = 0, + NBYTES_VERSION_MINOR = 1, + NBYTES_VERSION_REVISION = 1, +}; + +} // namespace nbytes + +#endif // NBYTES_H diff --git a/deps/nbytes/nbytes.gyp b/deps/nbytes/nbytes.gyp new file mode 100644 index 00000000000000..2b369565a282af --- /dev/null +++ b/deps/nbytes/nbytes.gyp @@ -0,0 +1,16 @@ +{ + 'variables': { + 'nbytes_sources': [ 'src/nbytes.cpp' ], + }, + 'targets': [ + { + 'target_name': 'nbytes', + 'type': 'static_library', + 'include_dirs': ['include'], + 'direct_dependent_settings': { + 'include_dirs': ['include'], + }, + 'sources': [ '<@(nbytes_sources)' ] + }, + ] +} diff --git a/deps/nbytes/pyproject.toml b/deps/nbytes/pyproject.toml new file mode 100644 index 00000000000000..5e107c7fcd9e1a --- /dev/null +++ b/deps/nbytes/pyproject.toml @@ -0,0 +1,38 @@ +[project] +name = "nbytes" +requires-python = ">=3.12" + +[tool.ruff] +line-length = 120 +target-version = "py312" + +[tool.ruff.format] +quote-style = "single" +indent-style = "space" +docstring-code-format = true + +[tool.ruff.lint] +select = [ + "C90", # McCabe cyclomatic complexity + "E", # pycodestyle + "F", # Pyflakes + "ICN", # flake8-import-conventions + "INT", # flake8-gettext + "PLC", # Pylint conventions + "PLE", # Pylint errors + "PLR09", # Pylint refactoring: max-args, max-branches, max returns, max-statements + "PYI", # flake8-pyi + "RSE", # flake8-raise + "RUF", # Ruff-specific rules + "T10", # flake8-debugger + "TCH", # flake8-type-checking + "TID", # flake8-tidy-imports + "W", # pycodestyle + "YTT", # flake8-2020 + "ANN" # flake8-annotations +] +ignore = [ + "E722", # Do not use bare `except` + "ANN101", # Missing type annotation for self in method + "TID252", # Prefer absolute imports over relative imports from parent modules +] diff --git a/deps/nbytes/src/CMakeLists.txt b/deps/nbytes/src/CMakeLists.txt new file mode 100644 index 00000000000000..554fb4a014a6fd --- /dev/null +++ b/deps/nbytes/src/CMakeLists.txt @@ -0,0 +1,6 @@ +add_library(nbytes nbytes.cpp) +target_include_directories(nbytes + PUBLIC + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> +) diff --git a/deps/nbytes/src/nbytes.cpp b/deps/nbytes/src/nbytes.cpp new file mode 100644 index 00000000000000..a827809adbacd3 --- /dev/null +++ b/deps/nbytes/src/nbytes.cpp @@ -0,0 +1,235 @@ +#include "nbytes.h" +#include <cmath> +#include <cstddef> +#include <string.h> + +namespace nbytes { + +// ============================================================================ +// Byte Swapping + +namespace { +// These are defined by <sys/byteorder.h> or <netinet/in.h> on some systems. +// To avoid warnings, undefine them before redefining them. +#ifdef BSWAP_2 +#undef BSWAP_2 +#endif +#ifdef BSWAP_4 +#undef BSWAP_4 +#endif +#ifdef BSWAP_8 +#undef BSWAP_8 +#endif + +#if defined(_MSC_VER) +#include <intrin.h> +#define BSWAP_2(x) _byteswap_ushort(x) +#define BSWAP_4(x) _byteswap_ulong(x) +#define BSWAP_8(x) _byteswap_uint64(x) +#else +#define BSWAP_2(x) ((x) << 8) | ((x) >> 8) +#define BSWAP_4(x) \ + (((x) & 0xFF) << 24) | (((x) & 0xFF00) << 8) | (((x) >> 8) & 0xFF00) | \ + (((x) >> 24) & 0xFF) +#define BSWAP_8(x) \ + (((x) & 0xFF00000000000000ull) >> 56) | \ + (((x) & 0x00FF000000000000ull) >> 40) | \ + (((x) & 0x0000FF0000000000ull) >> 24) | \ + (((x) & 0x000000FF00000000ull) >> 8) | \ + (((x) & 0x00000000FF000000ull) << 8) | \ + (((x) & 0x0000000000FF0000ull) << 24) | \ + (((x) & 0x000000000000FF00ull) << 40) | \ + (((x) & 0x00000000000000FFull) << 56) +#endif +} // namespace + +bool SwapBytes16(char *data, size_t nbytes) { + if (nbytes % sizeof(uint16_t) != 0) return false; + +#if defined(_MSC_VER) + if (AlignUp(data, sizeof(uint16_t)) == data) { + // MSVC has no strict aliasing, and is able to highly optimize this case. + uint16_t *data16 = reinterpret_cast<uint16_t *>(data); + size_t len16 = nbytes / sizeof(uint16_t); + for (size_t i = 0; i < len16; i++) { + data16[i] = BSWAP_2(data16[i]); + } + return true; + } +#endif + + uint16_t temp; + for (size_t i = 0; i < nbytes; i += sizeof(temp)) { + memcpy(&temp, &data[i], sizeof(temp)); + temp = BSWAP_2(temp); + memcpy(&data[i], &temp, sizeof(temp)); + } + + return true; +} + +bool SwapBytes32(char *data, size_t nbytes) { + if (nbytes % sizeof(uint32_t) != 0) return false; + +#if defined(_MSC_VER) + // MSVC has no strict aliasing, and is able to highly optimize this case. + if (AlignUp(data, sizeof(uint32_t)) == data) { + uint32_t *data32 = reinterpret_cast<uint32_t *>(data); + size_t len32 = nbytes / sizeof(uint32_t); + for (size_t i = 0; i < len32; i++) { + data32[i] = BSWAP_4(data32[i]); + } + return true; + } +#endif + + uint32_t temp; + for (size_t i = 0; i < nbytes; i += sizeof(temp)) { + memcpy(&temp, &data[i], sizeof(temp)); + temp = BSWAP_4(temp); + memcpy(&data[i], &temp, sizeof(temp)); + } + + return true; +} + +bool SwapBytes64(char *data, size_t nbytes) { + if (nbytes % sizeof(uint64_t) != 0) return false; + +#if defined(_MSC_VER) + if (AlignUp(data, sizeof(uint64_t)) == data) { + // MSVC has no strict aliasing, and is able to highly optimize this case. + uint64_t *data64 = reinterpret_cast<uint64_t *>(data); + size_t len64 = nbytes / sizeof(uint64_t); + for (size_t i = 0; i < len64; i++) { + data64[i] = BSWAP_8(data64[i]); + } + return true; + } +#endif + + uint64_t temp; + for (size_t i = 0; i < nbytes; i += sizeof(temp)) { + memcpy(&temp, &data[i], sizeof(temp)); + temp = BSWAP_8(temp); + memcpy(&data[i], &temp, sizeof(temp)); + } + + return true; +} + +// ============================================================================ +// Base64 (legacy) + +// supports regular and URL-safe base64 +const int8_t unbase64_table[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -2, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, + 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1}; + +// ============================================================================ +// Hex + +const int8_t unhex_table[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1}; + +size_t HexEncode(const char *src, size_t slen, char *dst, size_t dlen) { + // We know how much we'll write, just make sure that there's space. + NBYTES_ASSERT_TRUE(dlen >= MultiplyWithOverflowCheck<size_t>(slen, 2u) && + "not enough space provided for hex encode"); + + dlen = slen * 2; + for (size_t i = 0, k = 0; k < dlen; i += 1, k += 2) { + static const char hex[] = "0123456789abcdef"; + uint8_t val = static_cast<uint8_t>(src[i]); + dst[k + 0] = hex[val >> 4]; + dst[k + 1] = hex[val & 15]; + } + + return dlen; +} + +std::string HexEncode(const char *src, size_t slen) { + size_t dlen = slen * 2; + std::string dst(dlen, '\0'); + HexEncode(src, slen, dst.data(), dlen); + return dst; +} + +// ============================================================================ + +void ForceAsciiSlow(const char *src, char *dst, size_t len) { + for (size_t i = 0; i < len; ++i) { + dst[i] = src[i] & 0x7f; + } +} + +void ForceAscii(const char *src, char *dst, size_t len) { + if (len < 16) { + ForceAsciiSlow(src, dst, len); + return; + } + + const unsigned bytes_per_word = sizeof(uintptr_t); + const unsigned align_mask = bytes_per_word - 1; + const unsigned src_unalign = reinterpret_cast<uintptr_t>(src) & align_mask; + const unsigned dst_unalign = reinterpret_cast<uintptr_t>(dst) & align_mask; + + if (src_unalign > 0) { + if (src_unalign == dst_unalign) { + const unsigned unalign = bytes_per_word - src_unalign; + ForceAsciiSlow(src, dst, unalign); + src += unalign; + dst += unalign; + len -= unalign; + } else { + ForceAsciiSlow(src, dst, len); + return; + } + } + +#if defined(_WIN64) || defined(_LP64) + const uintptr_t mask = ~0x8080808080808080ll; +#else + const uintptr_t mask = ~0x80808080l; +#endif + + const uintptr_t *srcw = reinterpret_cast<const uintptr_t *>(src); + uintptr_t *dstw = reinterpret_cast<uintptr_t *>(dst); + + for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { + dstw[i] = srcw[i] & mask; + } + + const unsigned remainder = len & align_mask; + if (remainder > 0) { + const size_t offset = len - remainder; + ForceAsciiSlow(src + offset, dst + offset, remainder); + } +} + +} // namespace nbytes diff --git a/deps/nbytes/tests/CMakeLists.txt b/deps/nbytes/tests/CMakeLists.txt new file mode 100644 index 00000000000000..00fc8cb2608302 --- /dev/null +++ b/deps/nbytes/tests/CMakeLists.txt @@ -0,0 +1,10 @@ +include(GoogleTest) +include(CTest) +add_executable(basic basic.cpp) +target_link_libraries( + basic + GTest::gtest_main +) +target_link_libraries(basic nbytes) +add_test(basic_test basic) +gtest_discover_tests(basic) diff --git a/deps/nbytes/tests/basic.cpp b/deps/nbytes/tests/basic.cpp new file mode 100644 index 00000000000000..f0ed0a9f001445 --- /dev/null +++ b/deps/nbytes/tests/basic.cpp @@ -0,0 +1,29 @@ +#include <format> +#include <nbytes.h> +#include <vector> + +#include <gtest/gtest.h> + +TEST(basic, swap_bytes16) { + std::vector<char> input = {1, 2, 3, 4, 5, 6, 7, 8}; + nbytes::SwapBytes16(input.data(), input.size()); + std::vector<char> expected = {2, 1, 4, 3, 6, 5, 8, 7}; + EXPECT_EQ(input, expected); + SUCCEED(); +} + +TEST(basic, swap_bytes32) { + std::vector<char> input = {1, 2, 3, 4, 5, 6, 7, 8}; + nbytes::SwapBytes32(input.data(), input.size()); + std::vector<char> expected = {4, 3, 2, 1, 8, 7, 6, 5}; + EXPECT_EQ(input, expected); + SUCCEED(); +} + +TEST(basic, swap_bytes64) { + std::vector<char> input = {1, 2, 3, 4, 5, 6, 7, 8}; + nbytes::SwapBytes64(input.data(), input.size()); + std::vector<char> expected = {8, 7, 6, 5, 4, 3, 2, 1}; + EXPECT_EQ(input, expected); + SUCCEED(); +} diff --git a/deps/nbytes/tools/run-clang-format.sh b/deps/nbytes/tools/run-clang-format.sh new file mode 100755 index 00000000000000..ce1a664a890af8 --- /dev/null +++ b/deps/nbytes/tools/run-clang-format.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# Copyright 2023 Yagiz Nizipli and Daniel Lemire + +# 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. + +set -e +COMMAND=$* +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" +MAINSOURCE=$SCRIPTPATH/.. +ALL_FILES=$(cd $MAINSOURCE && git ls-tree --full-tree --name-only -r HEAD | grep -e ".*\.\(c\|h\|cc\|cpp\|hh\)\$") + +if clang-format-17 --version 2>/dev/null | grep -qF 'version 17.'; then + cd $MAINSOURCE; clang-format-17 --style=file --verbose -i "$@" $ALL_FILES + exit 0 +elif clang-format --version 2>/dev/null | grep -qF 'version 17.'; then + cd $MAINSOURCE; clang-format --style=file --verbose -i "$@" $ALL_FILES + exit 0 +fi +echo "Trying to use docker" +command -v docker >/dev/null 2>&1 || { echo >&2 "Please install docker. E.g., go to https://www.docker.com/products/docker-desktop Type 'docker' to diagnose the problem."; exit 1; } +docker info >/dev/null 2>&1 || { echo >&2 "Docker server is not running? type 'docker info'."; exit 1; } + +if [ -t 0 ]; then DOCKER_ARGS=-it; fi +docker pull kszonek/clang-format-17 + +docker run --rm $DOCKER_ARGS -v "$MAINSOURCE":"$MAINSOURCE":Z -w "$MAINSOURCE" -u "$(id -u $USER):$(id -g $USER)" kszonek/clang-format-17 --style=file --verbose -i "$@" $ALL_FILES diff --git a/deps/nbytes/unofficial.gni b/deps/nbytes/unofficial.gni new file mode 100644 index 00000000000000..2acea0d5204d04 --- /dev/null +++ b/deps/nbytes/unofficial.gni @@ -0,0 +1,25 @@ +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please edit the gyp files if you are making changes to build system. + +import("../../node.gni") +import("$node_v8_path/gni/v8.gni") + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("nbytes_gn_build") { + config("nbytes_config") { + include_dirs = [ "include" ] + } + + gypi_values = exec_script("../../tools/gypi_to_gn.py", + [ rebase_path("nbytes.gyp") ], + "scope", + [ "nbytes.gyp" ]) + + source_set(target_name) { + forward_variables_from(invoker, "*") + public_configs = [ ":nbytes_config" ] + sources = gypi_values.nbytes_sources + } +} diff --git a/deps/ncrypto/BUILD.gn b/deps/ncrypto/BUILD.gn new file mode 100644 index 00000000000000..78e3702888a709 --- /dev/null +++ b/deps/ncrypto/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +ncrypto_gn_build("ncrypto") { +} diff --git a/deps/ncrypto/README.md b/deps/ncrypto/README.md new file mode 100644 index 00000000000000..8881155719a692 --- /dev/null +++ b/deps/ncrypto/README.md @@ -0,0 +1,5 @@ +# Node.js crypto (ncrypto) library + +The `ncrypto` library extracts the base internal implementation of Node.js crypto operations +that support both `node:crypto` and Web Crypto implementations and makes them available for +use in other projects that need to emulate Node.js' behavior. diff --git a/deps/ncrypto/engine.cc b/deps/ncrypto/engine.cc new file mode 100644 index 00000000000000..1eae89d6f152c4 --- /dev/null +++ b/deps/ncrypto/engine.cc @@ -0,0 +1,93 @@ +#include "ncrypto.h" + +namespace ncrypto { + +// ============================================================================ +// Engine + +#ifndef OPENSSL_NO_ENGINE +EnginePointer::EnginePointer(ENGINE* engine_, bool finish_on_exit_) + : engine(engine_), finish_on_exit(finish_on_exit_) {} + +EnginePointer::EnginePointer(EnginePointer&& other) noexcept + : engine(other.engine), finish_on_exit(other.finish_on_exit) { + other.release(); +} + +EnginePointer::~EnginePointer() { + reset(); +} + +EnginePointer& EnginePointer::operator=(EnginePointer&& other) noexcept { + if (this == &other) return *this; + this->~EnginePointer(); + return *new (this) EnginePointer(std::move(other)); +} + +void EnginePointer::reset(ENGINE* engine_, bool finish_on_exit_) { + if (engine != nullptr) { + if (finish_on_exit) { + // This also does the equivalent of ENGINE_free. + ENGINE_finish(engine); + } else { + ENGINE_free(engine); + } + } + engine = engine_; + finish_on_exit = finish_on_exit_; +} + +ENGINE* EnginePointer::release() { + ENGINE* ret = engine; + engine = nullptr; + finish_on_exit = false; + return ret; +} + +EnginePointer EnginePointer::getEngineByName(const std::string_view name, + CryptoErrorList* errors) { + MarkPopErrorOnReturn mark_pop_error_on_return(errors); + EnginePointer engine(ENGINE_by_id(name.data())); + if (!engine) { + // Engine not found, try loading dynamically. + engine = EnginePointer(ENGINE_by_id("dynamic")); + if (engine) { + if (!ENGINE_ctrl_cmd_string(engine.get(), "SO_PATH", name.data(), 0) || + !ENGINE_ctrl_cmd_string(engine.get(), "LOAD", nullptr, 0)) { + engine.reset(); + } + } + } + return engine; +} + +bool EnginePointer::setAsDefault(uint32_t flags, CryptoErrorList* errors) { + if (engine == nullptr) return false; + ClearErrorOnReturn clear_error_on_return(errors); + return ENGINE_set_default(engine, flags) != 0; +} + +bool EnginePointer::init(bool finish_on_exit) { + if (engine == nullptr) return false; + if (finish_on_exit) setFinishOnExit(); + return ENGINE_init(engine) == 1; +} + +EVPKeyPointer EnginePointer::loadPrivateKey(const std::string_view key_name) { + if (engine == nullptr) return EVPKeyPointer(); + return EVPKeyPointer( + ENGINE_load_private_key(engine, key_name.data(), nullptr, nullptr)); +} + +void EnginePointer::initEnginesOnce() { + static bool initialized = false; + if (!initialized) { + ENGINE_load_builtin_engines(); + ENGINE_register_all_complete(); + initialized = true; + } +} + +#endif // OPENSSL_NO_ENGINE + +} // namespace ncrypto diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc new file mode 100644 index 00000000000000..6f9406eecacb74 --- /dev/null +++ b/deps/ncrypto/ncrypto.cc @@ -0,0 +1,2883 @@ +#include "ncrypto.h" +#include <openssl/bn.h> +#include <openssl/dh.h> +#include <openssl/evp.h> +#include <openssl/hmac.h> +#include <openssl/pkcs12.h> +#include <openssl/rand.h> +#include <openssl/x509v3.h> +#include <algorithm> +#include <cstring> +#if OPENSSL_VERSION_MAJOR >= 3 +#include <openssl/provider.h> +#endif + +namespace ncrypto { +namespace { +static constexpr int kX509NameFlagsRFC2253WithinUtf8JSON = + XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB & ~ASN1_STRFLGS_ESC_CTRL; +} // namespace + +// ============================================================================ + +ClearErrorOnReturn::ClearErrorOnReturn(CryptoErrorList* errors) + : errors_(errors) { + ERR_clear_error(); +} + +ClearErrorOnReturn::~ClearErrorOnReturn() { + if (errors_ != nullptr) errors_->capture(); + ERR_clear_error(); +} + +int ClearErrorOnReturn::peekError() { + return ERR_peek_error(); +} + +MarkPopErrorOnReturn::MarkPopErrorOnReturn(CryptoErrorList* errors) + : errors_(errors) { + ERR_set_mark(); +} + +MarkPopErrorOnReturn::~MarkPopErrorOnReturn() { + if (errors_ != nullptr) errors_->capture(); + ERR_pop_to_mark(); +} + +int MarkPopErrorOnReturn::peekError() { + return ERR_peek_error(); +} + +CryptoErrorList::CryptoErrorList(CryptoErrorList::Option option) { + if (option == Option::CAPTURE_ON_CONSTRUCT) capture(); +} + +void CryptoErrorList::capture() { + errors_.clear(); + while (const auto err = ERR_get_error()) { + char buf[256]; + ERR_error_string_n(err, buf, sizeof(buf)); + errors_.emplace_front(buf); + } +} + +void CryptoErrorList::add(std::string error) { + errors_.push_back(error); +} + +std::optional<std::string> CryptoErrorList::pop_back() { + if (errors_.empty()) return std::nullopt; + std::string error = errors_.back(); + errors_.pop_back(); + return error; +} + +std::optional<std::string> CryptoErrorList::pop_front() { + if (errors_.empty()) return std::nullopt; + std::string error = errors_.front(); + errors_.pop_front(); + return error; +} + +// ============================================================================ +DataPointer DataPointer::Alloc(size_t len) { + return DataPointer(OPENSSL_zalloc(len), len); +} + +DataPointer::DataPointer(void* data, size_t length) + : data_(data), len_(length) {} + +DataPointer::DataPointer(const Buffer<void>& buffer) + : data_(buffer.data), len_(buffer.len) {} + +DataPointer::DataPointer(DataPointer&& other) noexcept + : data_(other.data_), len_(other.len_) { + other.data_ = nullptr; + other.len_ = 0; +} + +DataPointer& DataPointer::operator=(DataPointer&& other) noexcept { + if (this == &other) return *this; + this->~DataPointer(); + return *new (this) DataPointer(std::move(other)); +} + +DataPointer::~DataPointer() { + reset(); +} + +void DataPointer::reset(void* data, size_t length) { + if (data_ != nullptr) { + OPENSSL_clear_free(data_, len_); + } + data_ = data; + len_ = length; +} + +void DataPointer::reset(const Buffer<void>& buffer) { + reset(buffer.data, buffer.len); +} + +Buffer<void> DataPointer::release() { + Buffer<void> buf{ + .data = data_, + .len = len_, + }; + data_ = nullptr; + len_ = 0; + return buf; +} + +// ============================================================================ +bool isFipsEnabled() { +#if OPENSSL_VERSION_MAJOR >= 3 + return EVP_default_properties_is_fips_enabled(nullptr) == 1; +#else + return FIPS_mode() == 1; +#endif +} + +bool setFipsEnabled(bool enable, CryptoErrorList* errors) { + if (isFipsEnabled() == enable) return true; + ClearErrorOnReturn clearErrorOnReturn(errors); +#if OPENSSL_VERSION_MAJOR >= 3 + return EVP_default_properties_enable_fips(nullptr, enable ? 1 : 0) == 1; +#else + return FIPS_mode_set(enable ? 1 : 0) == 1; +#endif +} + +bool testFipsEnabled() { +#if OPENSSL_VERSION_MAJOR >= 3 + OSSL_PROVIDER* fips_provider = nullptr; + if (OSSL_PROVIDER_available(nullptr, "fips")) { + fips_provider = OSSL_PROVIDER_load(nullptr, "fips"); + } + const auto enabled = fips_provider == nullptr ? 0 + : OSSL_PROVIDER_self_test(fips_provider) ? 1 + : 0; +#else +#ifdef OPENSSL_FIPS + const auto enabled = FIPS_selftest() ? 1 : 0; +#else // OPENSSL_FIPS + const auto enabled = 0; +#endif // OPENSSL_FIPS +#endif + + return enabled; +} + +// ============================================================================ +// Bignum +BignumPointer::BignumPointer(BIGNUM* bignum) : bn_(bignum) {} + +BignumPointer::BignumPointer(const unsigned char* data, size_t len) + : BignumPointer(BN_bin2bn(data, len, nullptr)) {} + +BignumPointer::BignumPointer(BignumPointer&& other) noexcept + : bn_(other.release()) {} + +BignumPointer BignumPointer::New() { + return BignumPointer(BN_new()); +} + +BignumPointer BignumPointer::NewSecure() { + return BignumPointer(BN_secure_new()); +} + +BignumPointer& BignumPointer::operator=(BignumPointer&& other) noexcept { + if (this == &other) return *this; + this->~BignumPointer(); + return *new (this) BignumPointer(std::move(other)); +} + +BignumPointer::~BignumPointer() { + reset(); +} + +void BignumPointer::reset(BIGNUM* bn) { + bn_.reset(bn); +} + +void BignumPointer::reset(const unsigned char* data, size_t len) { + reset(BN_bin2bn(data, len, nullptr)); +} + +BIGNUM* BignumPointer::release() { + return bn_.release(); +} + +size_t BignumPointer::byteLength() const { + if (bn_ == nullptr) return 0; + return BN_num_bytes(bn_.get()); +} + +DataPointer BignumPointer::encode() const { + return EncodePadded(bn_.get(), byteLength()); +} + +DataPointer BignumPointer::encodePadded(size_t size) const { + return EncodePadded(bn_.get(), size); +} + +size_t BignumPointer::encodeInto(unsigned char* out) const { + if (!bn_) return 0; + return BN_bn2bin(bn_.get(), out); +} + +size_t BignumPointer::encodePaddedInto(unsigned char* out, size_t size) const { + if (!bn_) return 0; + return BN_bn2binpad(bn_.get(), out, size); +} + +DataPointer BignumPointer::Encode(const BIGNUM* bn) { + return EncodePadded(bn, bn != nullptr ? BN_num_bytes(bn) : 0); +} + +bool BignumPointer::setWord(unsigned long w) { // NOLINT(runtime/int) + if (!bn_) return false; + return BN_set_word(bn_.get(), w) == 1; +} + +unsigned long BignumPointer::GetWord(const BIGNUM* bn) { // NOLINT(runtime/int) + return BN_get_word(bn); +} + +unsigned long BignumPointer::getWord() const { // NOLINT(runtime/int) + if (!bn_) return 0; + return GetWord(bn_.get()); +} + +DataPointer BignumPointer::EncodePadded(const BIGNUM* bn, size_t s) { + if (bn == nullptr) return DataPointer(); + size_t size = std::max(s, static_cast<size_t>(GetByteCount(bn))); + auto buf = DataPointer::Alloc(size); + BN_bn2binpad(bn, reinterpret_cast<unsigned char*>(buf.get()), size); + return buf; +} +size_t BignumPointer::EncodePaddedInto(const BIGNUM* bn, + unsigned char* out, + size_t size) { + if (bn == nullptr) return 0; + return BN_bn2binpad(bn, out, size); +} + +int BignumPointer::operator<=>(const BignumPointer& other) const noexcept { + if (bn_ == nullptr && other.bn_ != nullptr) return -1; + if (bn_ != nullptr && other.bn_ == nullptr) return 1; + if (bn_ == nullptr && other.bn_ == nullptr) return 0; + return BN_cmp(bn_.get(), other.bn_.get()); +} + +int BignumPointer::operator<=>(const BIGNUM* other) const noexcept { + if (bn_ == nullptr && other != nullptr) return -1; + if (bn_ != nullptr && other == nullptr) return 1; + if (bn_ == nullptr && other == nullptr) return 0; + return BN_cmp(bn_.get(), other); +} + +DataPointer BignumPointer::toHex() const { + if (!bn_) return {}; + char* hex = BN_bn2hex(bn_.get()); + if (!hex) return {}; + return DataPointer(hex, strlen(hex)); +} + +int BignumPointer::GetBitCount(const BIGNUM* bn) { + return BN_num_bits(bn); +} + +int BignumPointer::GetByteCount(const BIGNUM* bn) { + return BN_num_bytes(bn); +} + +bool BignumPointer::isZero() const { + return bn_ && BN_is_zero(bn_.get()); +} + +bool BignumPointer::isOne() const { + return bn_ && BN_is_one(bn_.get()); +} + +const BIGNUM* BignumPointer::One() { + return BN_value_one(); +} + +BignumPointer BignumPointer::clone() { + if (!bn_) return {}; + return BignumPointer(BN_dup(bn_.get())); +} + +int BignumPointer::isPrime(int nchecks, + BignumPointer::PrimeCheckCallback innerCb) const { + BignumCtxPointer ctx(BN_CTX_new()); + BignumGenCallbackPointer cb(nullptr); + if (innerCb != nullptr) { + cb = BignumGenCallbackPointer(BN_GENCB_new()); + if (!cb) [[unlikely]] + return -1; + BN_GENCB_set( + cb.get(), + // TODO(@jasnell): This could be refactored to allow inlining. + // Not too important right now tho. + [](int a, int b, BN_GENCB* ctx) mutable -> int { + PrimeCheckCallback& ptr = + *static_cast<PrimeCheckCallback*>(BN_GENCB_get_arg(ctx)); + return ptr(a, b) ? 1 : 0; + }, + &innerCb); + } + return BN_is_prime_ex(get(), nchecks, ctx.get(), cb.get()); +} + +BignumPointer BignumPointer::NewPrime(const PrimeConfig& params, + PrimeCheckCallback cb) { + BignumPointer prime(BN_new()); + if (!prime || !prime.generate(params, std::move(cb))) { + return {}; + } + return prime; +} + +bool BignumPointer::generate(const PrimeConfig& params, + PrimeCheckCallback innerCb) const { + // BN_generate_prime_ex() calls RAND_bytes_ex() internally. + // Make sure the CSPRNG is properly seeded. + std::ignore = CSPRNG(nullptr, 0); + BignumGenCallbackPointer cb(nullptr); + if (innerCb != nullptr) { + cb = BignumGenCallbackPointer(BN_GENCB_new()); + if (!cb) [[unlikely]] + return -1; + BN_GENCB_set( + cb.get(), + [](int a, int b, BN_GENCB* ctx) mutable -> int { + PrimeCheckCallback& ptr = + *static_cast<PrimeCheckCallback*>(BN_GENCB_get_arg(ctx)); + return ptr(a, b) ? 1 : 0; + }, + &innerCb); + } + if (BN_generate_prime_ex(get(), + params.bits, + params.safe ? 1 : 0, + params.add.get(), + params.rem.get(), + cb.get()) == 0) { + return false; + } + + return true; +} + +BignumPointer BignumPointer::NewSub(const BignumPointer& a, + const BignumPointer& b) { + BignumPointer res = New(); + if (!res) return {}; + if (!BN_sub(res.get(), a.get(), b.get())) { + return {}; + } + return res; +} + +BignumPointer BignumPointer::NewLShift(size_t length) { + BignumPointer res = New(); + if (!res) return {}; + if (!BN_lshift(res.get(), One(), length)) { + return {}; + } + return res; +} + +// ============================================================================ +// Utility methods + +bool CSPRNG(void* buffer, size_t length) { + auto buf = reinterpret_cast<unsigned char*>(buffer); + do { + if (1 == RAND_status()) { +#if OPENSSL_VERSION_MAJOR >= 3 + if (1 == RAND_bytes_ex(nullptr, buf, length, 0)) { + return true; + } +#else + while (length > INT_MAX && 1 == RAND_bytes(buf, INT_MAX)) { + buf += INT_MAX; + length -= INT_MAX; + } + if (length <= INT_MAX && 1 == RAND_bytes(buf, static_cast<int>(length))) + return true; +#endif + } +#if OPENSSL_VERSION_MAJOR >= 3 + const auto code = ERR_peek_last_error(); + // A misconfigured OpenSSL 3 installation may report 1 from RAND_poll() + // and RAND_status() but fail in RAND_bytes() if it cannot look up + // a matching algorithm for the CSPRNG. + if (ERR_GET_LIB(code) == ERR_LIB_RAND) { + const auto reason = ERR_GET_REASON(code); + if (reason == RAND_R_ERROR_INSTANTIATING_DRBG || + reason == RAND_R_UNABLE_TO_FETCH_DRBG || + reason == RAND_R_UNABLE_TO_CREATE_DRBG) { + return false; + } + } +#endif + } while (1 == RAND_poll()); + + return false; +} + +int NoPasswordCallback(char* buf, int size, int rwflag, void* u) { + return 0; +} + +int PasswordCallback(char* buf, int size, int rwflag, void* u) { + auto passphrase = static_cast<const Buffer<char>*>(u); + if (passphrase != nullptr) { + size_t buflen = static_cast<size_t>(size); + size_t len = passphrase->len; + if (buflen < len) return -1; + memcpy(buf, reinterpret_cast<const char*>(passphrase->data), len); + return len; + } + + return -1; +} + +// Algorithm: http://howardhinnant.github.io/date_algorithms.html +constexpr int days_from_epoch(int y, unsigned m, unsigned d) { + y -= m <= 2; + const int era = (y >= 0 ? y : y - 399) / 400; + const unsigned yoe = static_cast<unsigned>(y - era * 400); // [0, 399] + const unsigned doy = + (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1; // [0, 365] + const unsigned doe = yoe * 365 + yoe / 4 - yoe / 100 + doy; // [0, 146096] + return era * 146097 + static_cast<int>(doe) - 719468; +} + +// tm must be in UTC +// using time_t causes problems on 32-bit systems and windows x64. +int64_t PortableTimeGM(struct tm* t) { + int year = t->tm_year + 1900; + int month = t->tm_mon; + if (month > 11) { + year += month / 12; + month %= 12; + } else if (month < 0) { + int years_diff = (11 - month) / 12; + year -= years_diff; + month += 12 * years_diff; + } + int days_since_epoch = days_from_epoch(year, month + 1, t->tm_mday); + + return 60 * (60 * (24LL * static_cast<int64_t>(days_since_epoch) + + t->tm_hour) + + t->tm_min) + + t->tm_sec; +} + +// ============================================================================ +// SPKAC + +bool VerifySpkac(const char* input, size_t length) { +#ifdef OPENSSL_IS_BORINGSSL + // OpenSSL uses EVP_DecodeBlock, which explicitly removes trailing characters, + // while BoringSSL uses EVP_DecodedLength and EVP_DecodeBase64, which do not. + // As such, we trim those characters here for compatibility. + // + // find_last_not_of can return npos, which is the maximum value of size_t. + // The + 1 will force a roll-ver to 0, which is the correct value. in that + // case. + length = std::string_view(input, length).find_last_not_of(" \n\r\t") + 1; +#endif + NetscapeSPKIPointer spki(NETSCAPE_SPKI_b64_decode(input, length)); + if (!spki) return false; + + EVPKeyPointer pkey(X509_PUBKEY_get(spki->spkac->pubkey)); + return pkey ? NETSCAPE_SPKI_verify(spki.get(), pkey.get()) > 0 : false; +} + +BIOPointer ExportPublicKey(const char* input, size_t length) { + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + +#ifdef OPENSSL_IS_BORINGSSL + // OpenSSL uses EVP_DecodeBlock, which explicitly removes trailing characters, + // while BoringSSL uses EVP_DecodedLength and EVP_DecodeBase64, which do not. + // As such, we trim those characters here for compatibility. + length = std::string_view(input, length).find_last_not_of(" \n\r\t") + 1; +#endif + NetscapeSPKIPointer spki(NETSCAPE_SPKI_b64_decode(input, length)); + if (!spki) return {}; + + EVPKeyPointer pkey(NETSCAPE_SPKI_get_pubkey(spki.get())); + if (!pkey) return {}; + + if (PEM_write_bio_PUBKEY(bio.get(), pkey.get()) <= 0) return {}; + + return bio; +} + +Buffer<char> ExportChallenge(const char* input, size_t length) { +#ifdef OPENSSL_IS_BORINGSSL + // OpenSSL uses EVP_DecodeBlock, which explicitly removes trailing characters, + // while BoringSSL uses EVP_DecodedLength and EVP_DecodeBase64, which do not. + // As such, we trim those characters here for compatibility. + length = std::string_view(input, length).find_last_not_of(" \n\r\t") + 1; +#endif + NetscapeSPKIPointer sp(NETSCAPE_SPKI_b64_decode(input, length)); + if (!sp) return {}; + + unsigned char* buf = nullptr; + int buf_size = ASN1_STRING_to_UTF8(&buf, sp->spkac->challenge); + if (buf_size >= 0) { + return { + .data = reinterpret_cast<char*>(buf), + .len = static_cast<size_t>(buf_size), + }; + } + + return {}; +} + +// ============================================================================ +namespace { +enum class AltNameOption { + NONE, + UTF8, +}; + +bool IsSafeAltName(const char* name, size_t length, AltNameOption option) { + for (size_t i = 0; i < length; i++) { + char c = name[i]; + switch (c) { + case '"': + case '\\': + // These mess with encoding rules. + // Fall through. + case ',': + // Commas make it impossible to split the list of subject alternative + // names unambiguously, which is why we have to escape. + // Fall through. + case '\'': + // Single quotes are unlikely to appear in any legitimate values, but + // they could be used to make a value look like it was escaped (i.e., + // enclosed in single/double quotes). + return false; + default: + if (option == AltNameOption::UTF8) { + // In UTF8 strings, we require escaping for any ASCII control + // character, but NOT for non-ASCII characters. Note that all bytes of + // any code point that consists of more than a single byte have their + // MSB set. + if (static_cast<unsigned char>(c) < ' ' || c == '\x7f') { + return false; + } + } else { + // Check if the char is a control character or non-ASCII character. + // Note that char may or may not be a signed type. Regardless, + // non-ASCII values will always be outside of this range. + if (c < ' ' || c > '~') { + return false; + } + } + } + } + return true; +} + +void PrintAltName(const BIOPointer& out, + const char* name, + size_t length, + AltNameOption option = AltNameOption::NONE, + const char* safe_prefix = nullptr) { + if (IsSafeAltName(name, length, option)) { + // For backward-compatibility, append "safe" names without any + // modifications. + if (safe_prefix != nullptr) { + BIO_printf(out.get(), "%s:", safe_prefix); + } + BIO_write(out.get(), name, length); + } else { + // If a name is not "safe", we cannot embed it without special + // encoding. This does not usually happen, but we don't want to hide + // it from the user either. We use JSON compatible escaping here. + BIO_write(out.get(), "\"", 1); + if (safe_prefix != nullptr) { + BIO_printf(out.get(), "%s:", safe_prefix); + } + for (size_t j = 0; j < length; j++) { + char c = static_cast<char>(name[j]); + if (c == '\\') { + BIO_write(out.get(), "\\\\", 2); + } else if (c == '"') { + BIO_write(out.get(), "\\\"", 2); + } else if ((c >= ' ' && c != ',' && c <= '~') || + (option == AltNameOption::UTF8 && (c & 0x80))) { + // Note that the above condition explicitly excludes commas, which means + // that those are encoded as Unicode escape sequences in the "else" + // block. That is not strictly necessary, and Node.js itself would parse + // it correctly either way. We only do this to account for third-party + // code that might be splitting the string at commas (as Node.js itself + // used to do). + BIO_write(out.get(), &c, 1); + } else { + // Control character or non-ASCII character. We treat everything as + // Latin-1, which corresponds to the first 255 Unicode code points. + const char hex[] = "0123456789abcdef"; + char u[] = {'\\', 'u', '0', '0', hex[(c & 0xf0) >> 4], hex[c & 0x0f]}; + BIO_write(out.get(), u, sizeof(u)); + } + } + BIO_write(out.get(), "\"", 1); + } +} + +// This function emulates the behavior of i2v_GENERAL_NAME in a safer and less +// ambiguous way. "othername:" entries use the GENERAL_NAME_print format. +bool PrintGeneralName(const BIOPointer& out, const GENERAL_NAME* gen) { + if (gen->type == GEN_DNS) { + ASN1_IA5STRING* name = gen->d.dNSName; + BIO_write(out.get(), "DNS:", 4); + // Note that the preferred name syntax (see RFCs 5280 and 1034) with + // wildcards is a subset of what we consider "safe", so spec-compliant DNS + // names will never need to be escaped. + PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + } else if (gen->type == GEN_EMAIL) { + ASN1_IA5STRING* name = gen->d.rfc822Name; + BIO_write(out.get(), "email:", 6); + PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + } else if (gen->type == GEN_URI) { + ASN1_IA5STRING* name = gen->d.uniformResourceIdentifier; + BIO_write(out.get(), "URI:", 4); + // The set of "safe" names was designed to include just about any URI, + // with a few exceptions, most notably URIs that contains commas (see + // RFC 2396). In other words, most legitimate URIs will not require + // escaping. + PrintAltName(out, reinterpret_cast<const char*>(name->data), name->length); + } else if (gen->type == GEN_DIRNAME) { + // Earlier versions of Node.js used X509_NAME_oneline to print the X509_NAME + // object. The format was non standard and should be avoided. The use of + // X509_NAME_oneline is discouraged by OpenSSL but was required for backward + // compatibility. Conveniently, X509_NAME_oneline produced ASCII and the + // output was unlikely to contains commas or other characters that would + // require escaping. However, it SHOULD NOT produce ASCII output since an + // RFC5280 AttributeValue may be a UTF8String. + // Newer versions of Node.js have since switched to X509_NAME_print_ex to + // produce a better format at the cost of backward compatibility. The new + // format may contain Unicode characters and it is likely to contain commas, + // which require escaping. Fortunately, the recently safeguarded function + // PrintAltName handles all of that safely. + BIO_printf(out.get(), "DirName:"); + BIOPointer tmp(BIO_new(BIO_s_mem())); + NCRYPTO_ASSERT_TRUE(tmp); + if (X509_NAME_print_ex( + tmp.get(), gen->d.dirn, 0, kX509NameFlagsRFC2253WithinUtf8JSON) < + 0) { + return false; + } + char* oline = nullptr; + long n_bytes = BIO_get_mem_data(tmp.get(), &oline); // NOLINT(runtime/int) + NCRYPTO_ASSERT_TRUE(n_bytes >= 0); + PrintAltName(out, + oline, + static_cast<size_t>(n_bytes), + ncrypto::AltNameOption::UTF8, + nullptr); + } else if (gen->type == GEN_IPADD) { + BIO_printf(out.get(), "IP Address:"); + const ASN1_OCTET_STRING* ip = gen->d.ip; + const unsigned char* b = ip->data; + if (ip->length == 4) { + BIO_printf(out.get(), "%d.%d.%d.%d", b[0], b[1], b[2], b[3]); + } else if (ip->length == 16) { + for (unsigned int j = 0; j < 8; j++) { + uint16_t pair = (b[2 * j] << 8) | b[2 * j + 1]; + BIO_printf(out.get(), (j == 0) ? "%X" : ":%X", pair); + } + } else { +#if OPENSSL_VERSION_MAJOR >= 3 + BIO_printf(out.get(), "<invalid length=%d>", ip->length); +#else + BIO_printf(out.get(), "<invalid>"); +#endif + } + } else if (gen->type == GEN_RID) { + // Unlike OpenSSL's default implementation, never print the OID as text and + // instead always print its numeric representation. + char oline[256]; + OBJ_obj2txt(oline, sizeof(oline), gen->d.rid, true); + BIO_printf(out.get(), "Registered ID:%s", oline); + } else if (gen->type == GEN_OTHERNAME) { + // The format that is used here is based on OpenSSL's implementation of + // GENERAL_NAME_print (as of OpenSSL 3.0.1). Earlier versions of Node.js + // instead produced the same format as i2v_GENERAL_NAME, which was somewhat + // awkward, especially when passed to translatePeerCertificate. + bool unicode = true; + const char* prefix = nullptr; + // OpenSSL 1.1.1 does not support othername in GENERAL_NAME_print and may + // not define these NIDs. +#if OPENSSL_VERSION_MAJOR >= 3 + int nid = OBJ_obj2nid(gen->d.otherName->type_id); + switch (nid) { + case NID_id_on_SmtpUTF8Mailbox: + prefix = "SmtpUTF8Mailbox"; + break; + case NID_XmppAddr: + prefix = "XmppAddr"; + break; + case NID_SRVName: + prefix = "SRVName"; + unicode = false; + break; + case NID_ms_upn: + prefix = "UPN"; + break; + case NID_NAIRealm: + prefix = "NAIRealm"; + break; + } +#endif // OPENSSL_VERSION_MAJOR >= 3 + int val_type = gen->d.otherName->value->type; + if (prefix == nullptr || (unicode && val_type != V_ASN1_UTF8STRING) || + (!unicode && val_type != V_ASN1_IA5STRING)) { + BIO_printf(out.get(), "othername:<unsupported>"); + } else { + BIO_printf(out.get(), "othername:"); + if (unicode) { + auto name = gen->d.otherName->value->value.utf8string; + PrintAltName(out, + reinterpret_cast<const char*>(name->data), + name->length, + AltNameOption::UTF8, + prefix); + } else { + auto name = gen->d.otherName->value->value.ia5string; + PrintAltName(out, + reinterpret_cast<const char*>(name->data), + name->length, + AltNameOption::NONE, + prefix); + } + } + } else if (gen->type == GEN_X400) { + // TODO(tniessen): this is what OpenSSL does, implement properly instead + BIO_printf(out.get(), "X400Name:<unsupported>"); + } else if (gen->type == GEN_EDIPARTY) { + // TODO(tniessen): this is what OpenSSL does, implement properly instead + BIO_printf(out.get(), "EdiPartyName:<unsupported>"); + } else { + // This is safe because X509V3_EXT_d2i would have returned nullptr in this + // case already. + unreachable(); + } + + return true; +} +} // namespace + +bool SafeX509SubjectAltNamePrint(const BIOPointer& out, X509_EXTENSION* ext) { + auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(ext)); + NCRYPTO_ASSERT_EQUAL(ret, NID_subject_alt_name, "unexpected extension type"); + + GENERAL_NAMES* names = static_cast<GENERAL_NAMES*>(X509V3_EXT_d2i(ext)); + if (names == nullptr) return false; + + bool ok = true; + + for (int i = 0; i < sk_GENERAL_NAME_num(names); i++) { + GENERAL_NAME* gen = sk_GENERAL_NAME_value(names, i); + + if (i != 0) BIO_write(out.get(), ", ", 2); + + if (!(ok = ncrypto::PrintGeneralName(out, gen))) { + break; + } + } + sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); + + return ok; +} + +bool SafeX509InfoAccessPrint(const BIOPointer& out, X509_EXTENSION* ext) { + auto ret = OBJ_obj2nid(X509_EXTENSION_get_object(ext)); + NCRYPTO_ASSERT_EQUAL(ret, NID_info_access, "unexpected extension type"); + + AUTHORITY_INFO_ACCESS* descs = + static_cast<AUTHORITY_INFO_ACCESS*>(X509V3_EXT_d2i(ext)); + if (descs == nullptr) return false; + + bool ok = true; + + for (int i = 0; i < sk_ACCESS_DESCRIPTION_num(descs); i++) { + ACCESS_DESCRIPTION* desc = sk_ACCESS_DESCRIPTION_value(descs, i); + + if (i != 0) BIO_write(out.get(), "\n", 1); + + char objtmp[80]; + i2t_ASN1_OBJECT(objtmp, sizeof(objtmp), desc->method); + BIO_printf(out.get(), "%s - ", objtmp); + if (!(ok = ncrypto::PrintGeneralName(out, desc->location))) { + break; + } + } + sk_ACCESS_DESCRIPTION_pop_free(descs, ACCESS_DESCRIPTION_free); + +#if OPENSSL_VERSION_MAJOR < 3 + BIO_write(out.get(), "\n", 1); +#endif + + return ok; +} + +// ============================================================================ +// X509Pointer + +X509Pointer::X509Pointer(X509* x509) : cert_(x509) {} + +X509Pointer::X509Pointer(X509Pointer&& other) noexcept + : cert_(other.release()) {} + +X509Pointer& X509Pointer::operator=(X509Pointer&& other) noexcept { + if (this == &other) return *this; + this->~X509Pointer(); + return *new (this) X509Pointer(std::move(other)); +} + +X509Pointer::~X509Pointer() { + reset(); +} + +void X509Pointer::reset(X509* x509) { + cert_.reset(x509); +} + +X509* X509Pointer::release() { + return cert_.release(); +} + +X509View X509Pointer::view() const { + return X509View(cert_.get()); +} + +BIOPointer X509View::toPEM() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + if (PEM_write_bio_X509(bio.get(), const_cast<X509*>(cert_)) <= 0) return {}; + return bio; +} + +BIOPointer X509View::toDER() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + if (i2d_X509_bio(bio.get(), const_cast<X509*>(cert_)) <= 0) return {}; + return bio; +} + +BIOPointer X509View::getSubject() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + if (X509_NAME_print_ex(bio.get(), + X509_get_subject_name(cert_), + 0, + kX509NameFlagsMultiline) <= 0) { + return {}; + } + return bio; +} + +BIOPointer X509View::getSubjectAltName() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + int index = X509_get_ext_by_NID(cert_, NID_subject_alt_name, -1); + if (index < 0 || + !SafeX509SubjectAltNamePrint(bio, X509_get_ext(cert_, index))) { + return {}; + } + return bio; +} + +BIOPointer X509View::getIssuer() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + if (X509_NAME_print_ex( + bio.get(), X509_get_issuer_name(cert_), 0, kX509NameFlagsMultiline) <= + 0) { + return {}; + } + return bio; +} + +BIOPointer X509View::getInfoAccess() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + int index = X509_get_ext_by_NID(cert_, NID_info_access, -1); + if (index < 0) return {}; + if (!SafeX509InfoAccessPrint(bio, X509_get_ext(cert_, index))) { + return {}; + } + return bio; +} + +BIOPointer X509View::getValidFrom() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + ASN1_TIME_print(bio.get(), X509_get_notBefore(cert_)); + return bio; +} + +BIOPointer X509View::getValidTo() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + BIOPointer bio(BIO_new(BIO_s_mem())); + if (!bio) return {}; + ASN1_TIME_print(bio.get(), X509_get_notAfter(cert_)); + return bio; +} + +int64_t X509View::getValidToTime() const { + struct tm tp; + ASN1_TIME_to_tm(X509_get0_notAfter(cert_), &tp); + return PortableTimeGM(&tp); +} + +int64_t X509View::getValidFromTime() const { + struct tm tp; + ASN1_TIME_to_tm(X509_get0_notBefore(cert_), &tp); + return PortableTimeGM(&tp); +} + +DataPointer X509View::getSerialNumber() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + if (ASN1_INTEGER* serial_number = + X509_get_serialNumber(const_cast<X509*>(cert_))) { + if (auto bn = BignumPointer(ASN1_INTEGER_to_BN(serial_number, nullptr))) { + return bn.toHex(); + } + } + return {}; +} + +Result<EVPKeyPointer, int> X509View::getPublicKey() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return Result<EVPKeyPointer, int>(EVPKeyPointer{}); + auto pkey = EVPKeyPointer(X509_get_pubkey(const_cast<X509*>(cert_))); + if (!pkey) return Result<EVPKeyPointer, int>(ERR_get_error()); + return pkey; +} + +StackOfASN1 X509View::getKeyUsage() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return {}; + return StackOfASN1(static_cast<STACK_OF(ASN1_OBJECT)*>( + X509_get_ext_d2i(cert_, NID_ext_key_usage, nullptr, nullptr))); +} + +bool X509View::isCA() const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return false; + return X509_check_ca(const_cast<X509*>(cert_)) == 1; +} + +bool X509View::isIssuedBy(const X509View& issuer) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr || issuer.cert_ == nullptr) return false; + return X509_check_issued(const_cast<X509*>(issuer.cert_), + const_cast<X509*>(cert_)) == X509_V_OK; +} + +bool X509View::checkPrivateKey(const EVPKeyPointer& pkey) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr || pkey == nullptr) return false; + return X509_check_private_key(const_cast<X509*>(cert_), pkey.get()) == 1; +} + +bool X509View::checkPublicKey(const EVPKeyPointer& pkey) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr || pkey == nullptr) return false; + return X509_verify(const_cast<X509*>(cert_), pkey.get()) == 1; +} + +X509View::CheckMatch X509View::checkHost(const std::string_view host, + int flags, + DataPointer* peerName) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return CheckMatch::NO_MATCH; + char* peername; + switch (X509_check_host( + const_cast<X509*>(cert_), host.data(), host.size(), flags, &peername)) { + case 0: + return CheckMatch::NO_MATCH; + case 1: { + if (peername != nullptr) { + DataPointer name(peername, strlen(peername)); + if (peerName != nullptr) *peerName = std::move(name); + } + return CheckMatch::MATCH; + } + case -2: + return CheckMatch::INVALID_NAME; + default: + return CheckMatch::OPERATION_FAILED; + } +} + +X509View::CheckMatch X509View::checkEmail(const std::string_view email, + int flags) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return CheckMatch::NO_MATCH; + switch (X509_check_email( + const_cast<X509*>(cert_), email.data(), email.size(), flags)) { + case 0: + return CheckMatch::NO_MATCH; + case 1: + return CheckMatch::MATCH; + case -2: + return CheckMatch::INVALID_NAME; + default: + return CheckMatch::OPERATION_FAILED; + } +} + +X509View::CheckMatch X509View::checkIp(const std::string_view ip, + int flags) const { + ClearErrorOnReturn clearErrorOnReturn; + if (cert_ == nullptr) return CheckMatch::NO_MATCH; + switch (X509_check_ip_asc(const_cast<X509*>(cert_), ip.data(), flags)) { + case 0: + return CheckMatch::NO_MATCH; + case 1: + return CheckMatch::MATCH; + case -2: + return CheckMatch::INVALID_NAME; + default: + return CheckMatch::OPERATION_FAILED; + } +} + +X509View X509View::From(const SSLPointer& ssl) { + ClearErrorOnReturn clear_error_on_return; + if (!ssl) return {}; + return X509View(SSL_get_certificate(ssl.get())); +} + +X509View X509View::From(const SSLCtxPointer& ctx) { + ClearErrorOnReturn clear_error_on_return; + if (!ctx) return {}; + return X509View(SSL_CTX_get0_certificate(ctx.get())); +} + +std::optional<std::string> X509View::getFingerprint( + const EVP_MD* method) const { + unsigned int md_size; + unsigned char md[EVP_MAX_MD_SIZE]; + static constexpr char hex[] = "0123456789ABCDEF"; + + if (X509_digest(get(), method, md, &md_size)) { + if (md_size == 0) return std::nullopt; + std::string fingerprint((md_size * 3) - 1, 0); + for (unsigned int i = 0; i < md_size; i++) { + auto idx = 3 * i; + fingerprint[idx] = hex[(md[i] & 0xf0) >> 4]; + fingerprint[idx + 1] = hex[(md[i] & 0x0f)]; + if (i == md_size - 1) break; + fingerprint[idx + 2] = ':'; + } + + return fingerprint; + } + + return std::nullopt; +} + +X509Pointer X509View::clone() const { + ClearErrorOnReturn clear_error_on_return; + if (!cert_) return {}; + return X509Pointer(X509_dup(const_cast<X509*>(cert_))); +} + +Result<X509Pointer, int> X509Pointer::Parse( + Buffer<const unsigned char> buffer) { + ClearErrorOnReturn clearErrorOnReturn; + BIOPointer bio(BIO_new_mem_buf(buffer.data, buffer.len)); + if (!bio) return Result<X509Pointer, int>(ERR_get_error()); + + X509Pointer pem( + PEM_read_bio_X509_AUX(bio.get(), nullptr, NoPasswordCallback, nullptr)); + if (pem) return Result<X509Pointer, int>(std::move(pem)); + BIO_reset(bio.get()); + + X509Pointer der(d2i_X509_bio(bio.get(), nullptr)); + if (der) return Result<X509Pointer, int>(std::move(der)); + + return Result<X509Pointer, int>(ERR_get_error()); +} + +X509Pointer X509Pointer::IssuerFrom(const SSLPointer& ssl, + const X509View& view) { + return IssuerFrom(SSL_get_SSL_CTX(ssl.get()), view); +} + +X509Pointer X509Pointer::IssuerFrom(const SSL_CTX* ctx, const X509View& cert) { + X509_STORE* store = SSL_CTX_get_cert_store(ctx); + DeleteFnPtr<X509_STORE_CTX, X509_STORE_CTX_free> store_ctx( + X509_STORE_CTX_new()); + X509Pointer result; + X509* issuer; + if (store_ctx.get() != nullptr && + X509_STORE_CTX_init(store_ctx.get(), store, nullptr, nullptr) == 1 && + X509_STORE_CTX_get1_issuer(&issuer, store_ctx.get(), cert.get()) == 1) { + result.reset(issuer); + } + return result; +} + +X509Pointer X509Pointer::PeerFrom(const SSLPointer& ssl) { + return X509Pointer(SSL_get_peer_certificate(ssl.get())); +} + +// When adding or removing errors below, please also update the list in the API +// documentation. See the "OpenSSL Error Codes" section of doc/api/errors.md +// Also *please* update the respective section in doc/api/tls.md as well +std::string_view X509Pointer::ErrorCode(int32_t err) { // NOLINT(runtime/int) +#define CASE(CODE) \ + case X509_V_ERR_##CODE: \ + return #CODE; + switch (err) { + CASE(UNABLE_TO_GET_ISSUER_CERT) + CASE(UNABLE_TO_GET_CRL) + CASE(UNABLE_TO_DECRYPT_CERT_SIGNATURE) + CASE(UNABLE_TO_DECRYPT_CRL_SIGNATURE) + CASE(UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY) + CASE(CERT_SIGNATURE_FAILURE) + CASE(CRL_SIGNATURE_FAILURE) + CASE(CERT_NOT_YET_VALID) + CASE(CERT_HAS_EXPIRED) + CASE(CRL_NOT_YET_VALID) + CASE(CRL_HAS_EXPIRED) + CASE(ERROR_IN_CERT_NOT_BEFORE_FIELD) + CASE(ERROR_IN_CERT_NOT_AFTER_FIELD) + CASE(ERROR_IN_CRL_LAST_UPDATE_FIELD) + CASE(ERROR_IN_CRL_NEXT_UPDATE_FIELD) + CASE(OUT_OF_MEM) + CASE(DEPTH_ZERO_SELF_SIGNED_CERT) + CASE(SELF_SIGNED_CERT_IN_CHAIN) + CASE(UNABLE_TO_GET_ISSUER_CERT_LOCALLY) + CASE(UNABLE_TO_VERIFY_LEAF_SIGNATURE) + CASE(CERT_CHAIN_TOO_LONG) + CASE(CERT_REVOKED) + CASE(INVALID_CA) + CASE(PATH_LENGTH_EXCEEDED) + CASE(INVALID_PURPOSE) + CASE(CERT_UNTRUSTED) + CASE(CERT_REJECTED) + CASE(HOSTNAME_MISMATCH) + } +#undef CASE + return "UNSPECIFIED"; +} + +std::optional<std::string_view> X509Pointer::ErrorReason(int32_t err) { + if (err == X509_V_OK) return std::nullopt; + return X509_verify_cert_error_string(err); +} + +// ============================================================================ +// BIOPointer + +BIOPointer::BIOPointer(BIO* bio) : bio_(bio) {} + +BIOPointer::BIOPointer(BIOPointer&& other) noexcept : bio_(other.release()) {} + +BIOPointer& BIOPointer::operator=(BIOPointer&& other) noexcept { + if (this == &other) return *this; + this->~BIOPointer(); + return *new (this) BIOPointer(std::move(other)); +} + +BIOPointer::~BIOPointer() { + reset(); +} + +void BIOPointer::reset(BIO* bio) { + bio_.reset(bio); +} + +BIO* BIOPointer::release() { + return bio_.release(); +} + +bool BIOPointer::resetBio() const { + if (!bio_) return 0; + return BIO_reset(bio_.get()) == 1; +} + +BIOPointer BIOPointer::NewMem() { + return BIOPointer(BIO_new(BIO_s_mem())); +} + +BIOPointer BIOPointer::NewSecMem() { + return BIOPointer(BIO_new(BIO_s_secmem())); +} + +BIOPointer BIOPointer::New(const BIO_METHOD* method) { + return BIOPointer(BIO_new(method)); +} + +BIOPointer BIOPointer::New(const void* data, size_t len) { + return BIOPointer(BIO_new_mem_buf(data, len)); +} + +BIOPointer BIOPointer::NewFile(std::string_view filename, + std::string_view mode) { + return BIOPointer(BIO_new_file(filename.data(), mode.data())); +} + +BIOPointer BIOPointer::NewFp(FILE* fd, int close_flag) { + return BIOPointer(BIO_new_fp(fd, close_flag)); +} + +BIOPointer BIOPointer::New(const BIGNUM* bn) { + auto res = NewMem(); + if (!res || !BN_print(res.get(), bn)) return {}; + return res; +} + +int BIOPointer::Write(BIOPointer* bio, std::string_view message) { + if (bio == nullptr || !*bio) return 0; + return BIO_write(bio->get(), message.data(), message.size()); +} + +// ============================================================================ +// DHPointer + +namespace { +bool EqualNoCase(const std::string_view a, const std::string_view b) { + if (a.size() != b.size()) return false; + return std::equal(a.begin(), a.end(), b.begin(), b.end(), [](char a, char b) { + return std::tolower(a) == std::tolower(b); + }); +} +} // namespace + +DHPointer::DHPointer(DH* dh) : dh_(dh) {} + +DHPointer::DHPointer(DHPointer&& other) noexcept : dh_(other.release()) {} + +DHPointer& DHPointer::operator=(DHPointer&& other) noexcept { + if (this == &other) return *this; + this->~DHPointer(); + return *new (this) DHPointer(std::move(other)); +} + +DHPointer::~DHPointer() { + reset(); +} + +void DHPointer::reset(DH* dh) { + dh_.reset(dh); +} + +DH* DHPointer::release() { + return dh_.release(); +} + +BignumPointer DHPointer::FindGroup(const std::string_view name, + FindGroupOption option) { +#define V(n, p) \ + if (EqualNoCase(name, n)) return BignumPointer(p(nullptr)); + if (option != FindGroupOption::NO_SMALL_PRIMES) { + V("modp1", BN_get_rfc2409_prime_768); + V("modp2", BN_get_rfc2409_prime_1024); + V("modp5", BN_get_rfc3526_prime_1536); + } + V("modp14", BN_get_rfc3526_prime_2048); + V("modp15", BN_get_rfc3526_prime_3072); + V("modp16", BN_get_rfc3526_prime_4096); + V("modp17", BN_get_rfc3526_prime_6144); + V("modp18", BN_get_rfc3526_prime_8192); +#undef V + return {}; +} + +BignumPointer DHPointer::GetStandardGenerator() { + auto bn = BignumPointer::New(); + if (!bn) return {}; + if (!bn.setWord(DH_GENERATOR_2)) return {}; + return bn; +} + +DHPointer DHPointer::FromGroup(const std::string_view name, + FindGroupOption option) { + auto group = FindGroup(name, option); + if (!group) return {}; // Unable to find the named group. + + auto generator = GetStandardGenerator(); + if (!generator) return {}; // Unable to create the generator. + + return New(std::move(group), std::move(generator)); +} + +DHPointer DHPointer::New(BignumPointer&& p, BignumPointer&& g) { + if (!p || !g) return {}; + + DHPointer dh(DH_new()); + if (!dh) return {}; + + if (DH_set0_pqg(dh.get(), p.get(), nullptr, g.get()) != 1) return {}; + + // If the call above is successful, the DH object takes ownership of the + // BIGNUMs, so we must release them here. Unfortunately coverity does not + // know that so we need to tell it not to complain. + // coverity[resource_leak] + p.release(); + // coverity[resource_leak] + g.release(); + + return dh; +} + +DHPointer DHPointer::New(size_t bits, unsigned int generator) { + DHPointer dh(DH_new()); + if (!dh) return {}; + + if (DH_generate_parameters_ex(dh.get(), bits, generator, nullptr) != 1) { + return {}; + } + + return dh; +} + +DHPointer::CheckResult DHPointer::check() { + ClearErrorOnReturn clearErrorOnReturn; + if (!dh_) return DHPointer::CheckResult::NONE; + int codes = 0; + if (DH_check(dh_.get(), &codes) != 1) + return DHPointer::CheckResult::CHECK_FAILED; + return static_cast<CheckResult>(codes); +} + +DHPointer::CheckPublicKeyResult DHPointer::checkPublicKey( + const BignumPointer& pub_key) { + ClearErrorOnReturn clearErrorOnReturn; + if (!pub_key || !dh_) return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + int codes = 0; + if (DH_check_pub_key(dh_.get(), pub_key.get(), &codes) != 1) + return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + if (codes & DH_CHECK_PUBKEY_TOO_SMALL) { + return DHPointer::CheckPublicKeyResult::TOO_SMALL; + } else if (codes & DH_CHECK_PUBKEY_TOO_SMALL) { + return DHPointer::CheckPublicKeyResult::TOO_LARGE; + } else if (codes != 0) { + return DHPointer::CheckPublicKeyResult::INVALID; + } + return CheckPublicKeyResult::NONE; +} + +DataPointer DHPointer::getPrime() const { + if (!dh_) return {}; + const BIGNUM* p; + DH_get0_pqg(dh_.get(), &p, nullptr, nullptr); + return BignumPointer::Encode(p); +} + +DataPointer DHPointer::getGenerator() const { + if (!dh_) return {}; + const BIGNUM* g; + DH_get0_pqg(dh_.get(), nullptr, nullptr, &g); + return BignumPointer::Encode(g); +} + +DataPointer DHPointer::getPublicKey() const { + if (!dh_) return {}; + const BIGNUM* pub_key; + DH_get0_key(dh_.get(), &pub_key, nullptr); + return BignumPointer::Encode(pub_key); +} + +DataPointer DHPointer::getPrivateKey() const { + if (!dh_) return {}; + const BIGNUM* pvt_key; + DH_get0_key(dh_.get(), nullptr, &pvt_key); + return BignumPointer::Encode(pvt_key); +} + +DataPointer DHPointer::generateKeys() const { + ClearErrorOnReturn clearErrorOnReturn; + if (!dh_) return {}; + + // Key generation failed + if (!DH_generate_key(dh_.get())) return {}; + + return getPublicKey(); +} + +size_t DHPointer::size() const { + if (!dh_) return 0; + int ret = DH_size(dh_.get()); + // DH_size can return a -1 on error but we just want to return a 0 + // in that case so we don't wrap around when returning the size_t. + return ret >= 0 ? static_cast<size_t>(ret) : 0; +} + +DataPointer DHPointer::computeSecret(const BignumPointer& peer) const { + ClearErrorOnReturn clearErrorOnReturn; + if (!dh_ || !peer) return {}; + + auto dp = DataPointer::Alloc(size()); + if (!dp) return {}; + + int size = + DH_compute_key(static_cast<uint8_t*>(dp.get()), peer.get(), dh_.get()); + if (size < 0) return {}; + + // The size of the computed key can be smaller than the size of the DH key. + // We want to make sure that the key is correctly padded. + if (static_cast<size_t>(size) < dp.size()) { + const size_t padding = dp.size() - size; + uint8_t* data = static_cast<uint8_t*>(dp.get()); + memmove(data + padding, data, size); + memset(data, 0, padding); + } + + return dp; +} + +bool DHPointer::setPublicKey(BignumPointer&& key) { + if (!dh_) return false; + if (DH_set0_key(dh_.get(), key.get(), nullptr) == 1) { + // If DH_set0_key returns successfully, then dh_ takes ownership of the + // BIGNUM, so we must release it here. Unfortunately coverity does not + // know that so we need to tell it not to complain. + // coverity[resource_leak] + key.release(); + return true; + } + return false; +} + +bool DHPointer::setPrivateKey(BignumPointer&& key) { + if (!dh_) return false; + if (DH_set0_key(dh_.get(), nullptr, key.get()) == 1) { + // If DH_set0_key returns successfully, then dh_ takes ownership of the + // BIGNUM, so we must release it here. Unfortunately coverity does not + // know that so we need to tell it not to complain. + // coverity[resource_leak] + key.release(); + return true; + } + return false; +} + +DataPointer DHPointer::stateless(const EVPKeyPointer& ourKey, + const EVPKeyPointer& theirKey) { + size_t out_size; + if (!ourKey || !theirKey) return {}; + + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(ourKey.get(), nullptr)); + if (!ctx || EVP_PKEY_derive_init(ctx.get()) <= 0 || + EVP_PKEY_derive_set_peer(ctx.get(), theirKey.get()) <= 0 || + EVP_PKEY_derive(ctx.get(), nullptr, &out_size) <= 0) { + return {}; + } + + if (out_size == 0) return {}; + + auto out = DataPointer::Alloc(out_size); + if (EVP_PKEY_derive( + ctx.get(), reinterpret_cast<uint8_t*>(out.get()), &out_size) <= 0) { + return {}; + } + + if (out_size < out.size()) { + const size_t padding = out.size() - out_size; + uint8_t* data = static_cast<uint8_t*>(out.get()); + memmove(data + padding, data, out_size); + memset(data, 0, padding); + } + + return out; +} + +// ============================================================================ +// KDF + +const EVP_MD* getDigestByName(const std::string_view name) { + return EVP_get_digestbyname(name.data()); +} + +bool checkHkdfLength(const EVP_MD* md, size_t length) { + // HKDF-Expand computes up to 255 HMAC blocks, each having as many bits as + // the output of the hash function. 255 is a hard limit because HKDF appends + // an 8-bit counter to each HMAC'd message, starting at 1. + static constexpr size_t kMaxDigestMultiplier = 255; + size_t max_length = EVP_MD_size(md) * kMaxDigestMultiplier; + if (length > max_length) return false; + return true; +} + +DataPointer hkdf(const EVP_MD* md, + const Buffer<const unsigned char>& key, + const Buffer<const unsigned char>& info, + const Buffer<const unsigned char>& salt, + size_t length) { + ClearErrorOnReturn clearErrorOnReturn; + + if (!checkHkdfLength(md, length) || info.len > INT_MAX || + salt.len > INT_MAX) { + return {}; + } + + EVPKeyCtxPointer ctx = + EVPKeyCtxPointer(EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr)); + if (!ctx || !EVP_PKEY_derive_init(ctx.get()) || + !EVP_PKEY_CTX_set_hkdf_md(ctx.get(), md) || + !EVP_PKEY_CTX_add1_hkdf_info(ctx.get(), info.data, info.len)) { + return {}; + } + + std::string_view actual_salt; + static const char default_salt[EVP_MAX_MD_SIZE] = {0}; + if (salt.len > 0) { + actual_salt = {reinterpret_cast<const char*>(salt.data), salt.len}; + } else { + actual_salt = {default_salt, static_cast<unsigned>(EVP_MD_size(md))}; + } + + // We do not use EVP_PKEY_HKDF_MODE_EXTRACT_AND_EXPAND because and instead + // implement the extraction step ourselves because EVP_PKEY_derive does not + // handle zero-length keys, which are required for Web Crypto. + // TODO(jasnell): Once OpenSSL 1.1.1 support is dropped completely, and once + // BoringSSL is confirmed to support it, wen can hopefully drop this and use + // EVP_KDF directly which does support zero length keys. + unsigned char pseudorandom_key[EVP_MAX_MD_SIZE]; + unsigned pseudorandom_key_len = sizeof(pseudorandom_key); + + if (HMAC(md, + actual_salt.data(), + actual_salt.size(), + key.data, + key.len, + pseudorandom_key, + &pseudorandom_key_len) == nullptr) { + return {}; + } + if (!EVP_PKEY_CTX_hkdf_mode(ctx.get(), EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) || + !EVP_PKEY_CTX_set1_hkdf_key( + ctx.get(), pseudorandom_key, pseudorandom_key_len)) { + return {}; + } + + auto buf = DataPointer::Alloc(length); + if (!buf) return {}; + + if (EVP_PKEY_derive( + ctx.get(), static_cast<unsigned char*>(buf.get()), &length) <= 0) { + return {}; + } + + return buf; +} + +bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem) { + return EVP_PBE_scrypt(nullptr, 0, nullptr, 0, N, r, p, maxmem, nullptr, 0) == + 1; +} + +DataPointer scrypt(const Buffer<const char>& pass, + const Buffer<const unsigned char>& salt, + uint64_t N, + uint64_t r, + uint64_t p, + uint64_t maxmem, + size_t length) { + ClearErrorOnReturn clearErrorOnReturn; + + if (pass.len > INT_MAX || salt.len > INT_MAX) { + return {}; + } + + auto dp = DataPointer::Alloc(length); + if (dp && EVP_PBE_scrypt(pass.data, + pass.len, + salt.data, + salt.len, + N, + r, + p, + maxmem, + reinterpret_cast<unsigned char*>(dp.get()), + length)) { + return dp; + } + + return {}; +} + +DataPointer pbkdf2(const EVP_MD* md, + const Buffer<const char>& pass, + const Buffer<const unsigned char>& salt, + uint32_t iterations, + size_t length) { + ClearErrorOnReturn clearErrorOnReturn; + + if (pass.len > INT_MAX || salt.len > INT_MAX || length > INT_MAX) { + return {}; + } + + auto dp = DataPointer::Alloc(length); + if (dp && PKCS5_PBKDF2_HMAC(pass.data, + pass.len, + salt.data, + salt.len, + iterations, + md, + length, + reinterpret_cast<unsigned char*>(dp.get()))) { + return dp; + } + + return {}; +} + +// ============================================================================ + +EVPKeyPointer::PrivateKeyEncodingConfig::PrivateKeyEncodingConfig( + const PrivateKeyEncodingConfig& other) + : PrivateKeyEncodingConfig( + other.output_key_object, other.format, other.type) { + cipher = other.cipher; + if (other.passphrase.has_value()) { + auto& otherPassphrase = other.passphrase.value(); + auto newPassphrase = DataPointer::Alloc(otherPassphrase.size()); + memcpy(newPassphrase.get(), otherPassphrase.get(), otherPassphrase.size()); + passphrase = std::move(newPassphrase); + } +} + +EVPKeyPointer::AsymmetricKeyEncodingConfig::AsymmetricKeyEncodingConfig( + bool output_key_object, PKFormatType format, PKEncodingType type) + : output_key_object(output_key_object), format(format), type(type) {} + +EVPKeyPointer::PrivateKeyEncodingConfig& +EVPKeyPointer::PrivateKeyEncodingConfig::operator=( + const PrivateKeyEncodingConfig& other) { + if (this == &other) return *this; + this->~PrivateKeyEncodingConfig(); + return *new (this) PrivateKeyEncodingConfig(other); +} + +EVPKeyPointer EVPKeyPointer::New() { + return EVPKeyPointer(EVP_PKEY_new()); +} + +EVPKeyPointer EVPKeyPointer::NewRawPublic( + int id, const Buffer<const unsigned char>& data) { + if (id == 0) return {}; + return EVPKeyPointer( + EVP_PKEY_new_raw_public_key(id, nullptr, data.data, data.len)); +} + +EVPKeyPointer EVPKeyPointer::NewRawPrivate( + int id, const Buffer<const unsigned char>& data) { + if (id == 0) return {}; + return EVPKeyPointer( + EVP_PKEY_new_raw_private_key(id, nullptr, data.data, data.len)); +} + +EVPKeyPointer::EVPKeyPointer(EVP_PKEY* pkey) : pkey_(pkey) {} + +EVPKeyPointer::EVPKeyPointer(EVPKeyPointer&& other) noexcept + : pkey_(other.release()) {} + +EVPKeyPointer& EVPKeyPointer::operator=(EVPKeyPointer&& other) noexcept { + if (this == &other) return *this; + this->~EVPKeyPointer(); + return *new (this) EVPKeyPointer(std::move(other)); +} + +EVPKeyPointer::~EVPKeyPointer() { + reset(); +} + +void EVPKeyPointer::reset(EVP_PKEY* pkey) { + pkey_.reset(pkey); +} + +EVP_PKEY* EVPKeyPointer::release() { + return pkey_.release(); +} + +int EVPKeyPointer::id(const EVP_PKEY* key) { + if (key == nullptr) return 0; + return EVP_PKEY_id(key); +} + +int EVPKeyPointer::base_id(const EVP_PKEY* key) { + if (key == nullptr) return 0; + return EVP_PKEY_base_id(key); +} + +int EVPKeyPointer::id() const { + return id(get()); +} + +int EVPKeyPointer::base_id() const { + return base_id(get()); +} + +int EVPKeyPointer::bits() const { + if (get() == nullptr) return 0; + return EVP_PKEY_bits(get()); +} + +size_t EVPKeyPointer::size() const { + if (get() == nullptr) return 0; + return EVP_PKEY_size(get()); +} + +EVPKeyCtxPointer EVPKeyPointer::newCtx() const { + if (!pkey_) return {}; + return EVPKeyCtxPointer(EVP_PKEY_CTX_new(get(), nullptr)); +} + +size_t EVPKeyPointer::rawPublicKeySize() const { + if (!pkey_) return 0; + size_t len = 0; + if (EVP_PKEY_get_raw_public_key(get(), nullptr, &len) == 1) return len; + return 0; +} + +size_t EVPKeyPointer::rawPrivateKeySize() const { + if (!pkey_) return 0; + size_t len = 0; + if (EVP_PKEY_get_raw_private_key(get(), nullptr, &len) == 1) return len; + return 0; +} + +DataPointer EVPKeyPointer::rawPublicKey() const { + if (!pkey_) return {}; + if (auto data = DataPointer::Alloc(rawPublicKeySize())) { + const Buffer<unsigned char> buf = data; + size_t len = data.size(); + if (EVP_PKEY_get_raw_public_key(get(), buf.data, &len) != 1) return {}; + return data; + } + return {}; +} + +DataPointer EVPKeyPointer::rawPrivateKey() const { + if (!pkey_) return {}; + if (auto data = DataPointer::Alloc(rawPrivateKeySize())) { + const Buffer<unsigned char> buf = data; + size_t len = data.size(); + if (EVP_PKEY_get_raw_private_key(get(), buf.data, &len) != 1) return {}; + return data; + } + return {}; +} + +BIOPointer EVPKeyPointer::derPublicKey() const { + if (!pkey_) return {}; + auto bio = BIOPointer::NewMem(); + if (!bio) return {}; + if (!i2d_PUBKEY_bio(bio.get(), get())) return {}; + return bio; +} + +bool EVPKeyPointer::assign(const ECKeyPointer& eckey) { + if (!pkey_ || !eckey) return {}; + return EVP_PKEY_assign_EC_KEY(pkey_.get(), eckey.get()); +} + +bool EVPKeyPointer::set(const ECKeyPointer& eckey) { + if (!pkey_ || !eckey) return false; + return EVP_PKEY_set1_EC_KEY(pkey_.get(), eckey); +} + +EVPKeyPointer::operator const EC_KEY*() const { + if (!pkey_) return nullptr; + return EVP_PKEY_get0_EC_KEY(pkey_.get()); +} + +namespace { +EVPKeyPointer::ParseKeyResult TryParsePublicKeyInner(const BIOPointer& bp, + const char* name, + auto&& parse) { + if (!bp.resetBio()) { + return EVPKeyPointer::ParseKeyResult(EVPKeyPointer::PKParseError::FAILED); + } + unsigned char* der_data; + long der_len; // NOLINT(runtime/int) + + // This skips surrounding data and decodes PEM to DER. + { + MarkPopErrorOnReturn mark_pop_error_on_return; + if (PEM_bytes_read_bio( + &der_data, &der_len, nullptr, name, bp.get(), nullptr, nullptr) != + 1) + return EVPKeyPointer::ParseKeyResult( + EVPKeyPointer::PKParseError::NOT_RECOGNIZED); + } + DataPointer data(der_data, der_len); + + // OpenSSL might modify the pointer, so we need to make a copy before parsing. + const unsigned char* p = der_data; + EVPKeyPointer pkey(parse(&p, der_len)); + if (!pkey) + return EVPKeyPointer::ParseKeyResult(EVPKeyPointer::PKParseError::FAILED); + return EVPKeyPointer::ParseKeyResult(std::move(pkey)); +} + +constexpr bool IsASN1Sequence(const unsigned char* data, + size_t size, + size_t* data_offset, + size_t* data_size) { + if (size < 2 || data[0] != 0x30) return false; + + if (data[1] & 0x80) { + // Long form. + size_t n_bytes = data[1] & ~0x80; + if (n_bytes + 2 > size || n_bytes > sizeof(size_t)) return false; + size_t length = 0; + for (size_t i = 0; i < n_bytes; i++) length = (length << 8) | data[i + 2]; + *data_offset = 2 + n_bytes; + *data_size = std::min(size - 2 - n_bytes, length); + } else { + // Short form. + *data_offset = 2; + *data_size = std::min<size_t>(size - 2, data[1]); + } + + return true; +} + +constexpr bool IsEncryptedPrivateKeyInfo( + const Buffer<const unsigned char>& buffer) { + // Both PrivateKeyInfo and EncryptedPrivateKeyInfo start with a SEQUENCE. + if (buffer.len == 0 || buffer.data == nullptr) return false; + size_t offset, len; + if (!IsASN1Sequence(buffer.data, buffer.len, &offset, &len)) return false; + + // A PrivateKeyInfo sequence always starts with an integer whereas an + // EncryptedPrivateKeyInfo starts with an AlgorithmIdentifier. + return len >= 1 && buffer.data[offset] != 2; +} + +} // namespace + +bool EVPKeyPointer::IsRSAPrivateKey(const Buffer<const unsigned char>& buffer) { + // Both RSAPrivateKey and RSAPublicKey structures start with a SEQUENCE. + size_t offset, len; + if (!IsASN1Sequence(buffer.data, buffer.len, &offset, &len)) return false; + + // An RSAPrivateKey sequence always starts with a single-byte integer whose + // value is either 0 or 1, whereas an RSAPublicKey starts with the modulus + // (which is the product of two primes and therefore at least 4), so we can + // decide the type of the structure based on the first three bytes of the + // sequence. + return len >= 3 && buffer.data[offset] == 2 && buffer.data[offset + 1] == 1 && + !(buffer.data[offset + 2] & 0xfe); +} + +EVPKeyPointer::ParseKeyResult EVPKeyPointer::TryParsePublicKeyPEM( + const Buffer<const unsigned char>& buffer) { + auto bp = BIOPointer::New(buffer.data, buffer.len); + if (!bp) return ParseKeyResult(PKParseError::FAILED); + + // Try parsing as SubjectPublicKeyInfo (SPKI) first. + if (auto ret = TryParsePublicKeyInner( + bp, + "PUBLIC KEY", + [](const unsigned char** p, long l) { // NOLINT(runtime/int) + return d2i_PUBKEY(nullptr, p, l); + })) { + return ret; + } + + // Maybe it is PKCS#1. + if (auto ret = TryParsePublicKeyInner( + bp, + "RSA PUBLIC KEY", + [](const unsigned char** p, long l) { // NOLINT(runtime/int) + return d2i_PublicKey(EVP_PKEY_RSA, nullptr, p, l); + })) { + return ret; + } + + // X.509 fallback. + if (auto ret = TryParsePublicKeyInner( + bp, + "CERTIFICATE", + [](const unsigned char** p, long l) { // NOLINT(runtime/int) + X509Pointer x509(d2i_X509(nullptr, p, l)); + return x509 ? X509_get_pubkey(x509.get()) : nullptr; + })) { + return ret; + }; + + return ParseKeyResult(PKParseError::NOT_RECOGNIZED); +} + +EVPKeyPointer::ParseKeyResult EVPKeyPointer::TryParsePublicKey( + const PublicKeyEncodingConfig& config, + const Buffer<const unsigned char>& buffer) { + if (config.format == PKFormatType::PEM) { + return TryParsePublicKeyPEM(buffer); + } + + if (config.format != PKFormatType::DER) { + return ParseKeyResult(PKParseError::FAILED); + } + + const unsigned char* start = buffer.data; + + EVP_PKEY* key = nullptr; + + if (config.type == PKEncodingType::PKCS1 && + (key = d2i_PublicKey(EVP_PKEY_RSA, nullptr, &start, buffer.len))) { + return EVPKeyPointer::ParseKeyResult(EVPKeyPointer(key)); + } + + if (config.type == PKEncodingType::SPKI && + (key = d2i_PUBKEY(nullptr, &start, buffer.len))) { + return EVPKeyPointer::ParseKeyResult(EVPKeyPointer(key)); + } + + return ParseKeyResult(PKParseError::FAILED); +} + +namespace { +Buffer<char> GetPassphrase( + const EVPKeyPointer::PrivateKeyEncodingConfig& config) { + Buffer<char> pass{ + // OpenSSL will not actually dereference this pointer, so it can be any + // non-null pointer. We cannot assert that directly, which is why we + // intentionally use a pointer that will likely cause a segmentation fault + // when dereferenced. + .data = reinterpret_cast<char*>(-1), + .len = 0, + }; + if (config.passphrase.has_value()) { + auto& passphrase = config.passphrase.value(); + // The pass.data can't be a nullptr, even if the len is zero or else + // openssl will prompt for a password and we really don't want that. + if (passphrase.get() != nullptr) { + pass.data = static_cast<char*>(passphrase.get()); + } + pass.len = passphrase.size(); + } + return pass; +} +} // namespace + +EVPKeyPointer::ParseKeyResult EVPKeyPointer::TryParsePrivateKey( + const PrivateKeyEncodingConfig& config, + const Buffer<const unsigned char>& buffer) { + static constexpr auto keyOrError = [](EVPKeyPointer pkey, + bool had_passphrase = false) { + if (int err = ERR_peek_error()) { + if (ERR_GET_LIB(err) == ERR_LIB_PEM && + ERR_GET_REASON(err) == PEM_R_BAD_PASSWORD_READ && !had_passphrase) { + return ParseKeyResult(PKParseError::NEED_PASSPHRASE); + } + return ParseKeyResult(PKParseError::FAILED, err); + } + if (!pkey) return ParseKeyResult(PKParseError::FAILED); + return ParseKeyResult(std::move(pkey)); + }; + + auto bio = BIOPointer::New(buffer); + if (!bio) return ParseKeyResult(PKParseError::FAILED); + + auto passphrase = GetPassphrase(config); + + if (config.format == PKFormatType::PEM) { + auto key = PEM_read_bio_PrivateKey( + bio.get(), + nullptr, + PasswordCallback, + config.passphrase.has_value() ? &passphrase : nullptr); + return keyOrError(EVPKeyPointer(key), config.passphrase.has_value()); + } + + if (config.format != PKFormatType::DER) { + return ParseKeyResult(PKParseError::FAILED); + } + + switch (config.type) { + case PKEncodingType::PKCS1: { + auto key = d2i_PrivateKey_bio(bio.get(), nullptr); + return keyOrError(EVPKeyPointer(key)); + } + case PKEncodingType::PKCS8: { + if (IsEncryptedPrivateKeyInfo(buffer)) { + auto key = d2i_PKCS8PrivateKey_bio( + bio.get(), + nullptr, + PasswordCallback, + config.passphrase.has_value() ? &passphrase : nullptr); + return keyOrError(EVPKeyPointer(key), config.passphrase.has_value()); + } + + PKCS8Pointer p8inf(d2i_PKCS8_PRIV_KEY_INFO_bio(bio.get(), nullptr)); + if (!p8inf) { + return ParseKeyResult(PKParseError::FAILED, ERR_peek_error()); + } + return keyOrError(EVPKeyPointer(EVP_PKCS82PKEY(p8inf.get()))); + } + case PKEncodingType::SEC1: { + auto key = d2i_PrivateKey_bio(bio.get(), nullptr); + return keyOrError(EVPKeyPointer(key)); + } + default: { + return ParseKeyResult(PKParseError::FAILED, ERR_peek_error()); + } + }; +} + +Result<BIOPointer, bool> EVPKeyPointer::writePrivateKey( + const PrivateKeyEncodingConfig& config) const { + if (config.format == PKFormatType::JWK) { + return Result<BIOPointer, bool>(false); + } + + auto bio = BIOPointer::NewMem(); + if (!bio) { + return Result<BIOPointer, bool>(false); + } + + auto passphrase = GetPassphrase(config); + MarkPopErrorOnReturn mark_pop_error_on_return; + bool err; + + switch (config.type) { + case PKEncodingType::PKCS1: { + // PKCS1 is only permitted for RSA keys. + if (id() != EVP_PKEY_RSA) return Result<BIOPointer, bool>(false); + +#if OPENSSL_VERSION_MAJOR >= 3 + const RSA* rsa = EVP_PKEY_get0_RSA(get()); +#else + RSA* rsa = EVP_PKEY_get0_RSA(get()); +#endif + switch (config.format) { + case PKFormatType::PEM: { + err = PEM_write_bio_RSAPrivateKey( + bio.get(), + rsa, + config.cipher, + reinterpret_cast<unsigned char*>(passphrase.data), + passphrase.len, + nullptr, + nullptr) != 1; + break; + } + case PKFormatType::DER: { + // Encoding PKCS1 as DER. This variation does not permit encryption. + err = i2d_RSAPrivateKey_bio(bio.get(), rsa) != 1; + break; + } + default: { + // Should never get here. + return Result<BIOPointer, bool>(false); + } + } + break; + } + case PKEncodingType::PKCS8: { + switch (config.format) { + case PKFormatType::PEM: { + // Encode PKCS#8 as PEM. + err = PEM_write_bio_PKCS8PrivateKey(bio.get(), + get(), + config.cipher, + passphrase.data, + passphrase.len, + nullptr, + nullptr) != 1; + break; + } + case PKFormatType::DER: { + err = i2d_PKCS8PrivateKey_bio(bio.get(), + get(), + config.cipher, + passphrase.data, + passphrase.len, + nullptr, + nullptr) != 1; + break; + } + default: { + // Should never get here. + return Result<BIOPointer, bool>(false); + } + } + break; + } + case PKEncodingType::SEC1: { + // SEC1 is only permitted for EC keys + if (id() != EVP_PKEY_EC) return Result<BIOPointer, bool>(false); + +#if OPENSSL_VERSION_MAJOR >= 3 + const EC_KEY* ec = EVP_PKEY_get0_EC_KEY(get()); +#else + EC_KEY* ec = EVP_PKEY_get0_EC_KEY(get()); +#endif + switch (config.format) { + case PKFormatType::PEM: { + err = PEM_write_bio_ECPrivateKey( + bio.get(), + ec, + config.cipher, + reinterpret_cast<unsigned char*>(passphrase.data), + passphrase.len, + nullptr, + nullptr) != 1; + break; + } + case PKFormatType::DER: { + // Encoding SEC1 as DER. This variation does not permit encryption. + err = i2d_ECPrivateKey_bio(bio.get(), ec) != 1; + break; + } + default: { + // Should never get here. + return Result<BIOPointer, bool>(false); + } + } + break; + } + default: { + // Not a valid private key encoding + return Result<BIOPointer, bool>(false); + } + } + + if (err) { + // Failed to encode the private key. + return Result<BIOPointer, bool>(false, + mark_pop_error_on_return.peekError()); + } + + return bio; +} + +Result<BIOPointer, bool> EVPKeyPointer::writePublicKey( + const ncrypto::EVPKeyPointer::PublicKeyEncodingConfig& config) const { + auto bio = BIOPointer::NewMem(); + if (!bio) return Result<BIOPointer, bool>(false); + + MarkPopErrorOnReturn mark_pop_error_on_return; + + if (config.type == ncrypto::EVPKeyPointer::PKEncodingType::PKCS1) { + // PKCS#1 is only valid for RSA keys. +#if OPENSSL_VERSION_MAJOR >= 3 + const RSA* rsa = EVP_PKEY_get0_RSA(get()); +#else + RSA* rsa = EVP_PKEY_get0_RSA(get()); +#endif + if (config.format == ncrypto::EVPKeyPointer::PKFormatType::PEM) { + // Encode PKCS#1 as PEM. + if (PEM_write_bio_RSAPublicKey(bio.get(), rsa) != 1) { + return Result<BIOPointer, bool>(false, + mark_pop_error_on_return.peekError()); + } + return bio; + } + + // Encode PKCS#1 as DER. + if (i2d_RSAPublicKey_bio(bio.get(), rsa) != 1) { + return Result<BIOPointer, bool>(false, + mark_pop_error_on_return.peekError()); + } + return bio; + } + + if (config.format == ncrypto::EVPKeyPointer::PKFormatType::PEM) { + // Encode SPKI as PEM. + if (PEM_write_bio_PUBKEY(bio.get(), get()) != 1) { + return Result<BIOPointer, bool>(false, + mark_pop_error_on_return.peekError()); + } + return bio; + } + + // Encode SPKI as DER. + if (i2d_PUBKEY_bio(bio.get(), get()) != 1) { + return Result<BIOPointer, bool>(false, + mark_pop_error_on_return.peekError()); + } + return bio; +} + +// ============================================================================ + +SSLPointer::SSLPointer(SSL* ssl) : ssl_(ssl) {} + +SSLPointer::SSLPointer(SSLPointer&& other) noexcept : ssl_(other.release()) {} + +SSLPointer& SSLPointer::operator=(SSLPointer&& other) noexcept { + if (this == &other) return *this; + this->~SSLPointer(); + return *new (this) SSLPointer(std::move(other)); +} + +SSLPointer::~SSLPointer() { + reset(); +} + +void SSLPointer::reset(SSL* ssl) { + ssl_.reset(ssl); +} + +SSL* SSLPointer::release() { + return ssl_.release(); +} + +SSLPointer SSLPointer::New(const SSLCtxPointer& ctx) { + if (!ctx) return {}; + return SSLPointer(SSL_new(ctx.get())); +} + +void SSLPointer::getCiphers( + std::function<void(const std::string_view)> cb) const { + if (!ssl_) return; + STACK_OF(SSL_CIPHER)* ciphers = SSL_get_ciphers(get()); + + // TLSv1.3 ciphers aren't listed by EVP. There are only 5, we could just + // document them, but since there are only 5, easier to just add them manually + // and not have to explain their absence in the API docs. They are lower-cased + // because the docs say they will be. + static constexpr const char* TLS13_CIPHERS[] = { + "tls_aes_256_gcm_sha384", + "tls_chacha20_poly1305_sha256", + "tls_aes_128_gcm_sha256", + "tls_aes_128_ccm_8_sha256", + "tls_aes_128_ccm_sha256"}; + + const int n = sk_SSL_CIPHER_num(ciphers); + + for (int i = 0; i < n; ++i) { + const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i); + cb(SSL_CIPHER_get_name(cipher)); + } + + for (unsigned i = 0; i < 5; ++i) { + cb(TLS13_CIPHERS[i]); + } +} + +bool SSLPointer::setSession(const SSLSessionPointer& session) { + if (!session || !ssl_) return false; + return SSL_set_session(get(), session.get()) == 1; +} + +bool SSLPointer::setSniContext(const SSLCtxPointer& ctx) const { + if (!ctx) return false; + auto x509 = ncrypto::X509View::From(ctx); + if (!x509) return false; + EVP_PKEY* pkey = SSL_CTX_get0_privatekey(ctx.get()); + STACK_OF(X509) * chain; + int err = SSL_CTX_get0_chain_certs(ctx.get(), &chain); + if (err == 1) err = SSL_use_certificate(get(), x509); + if (err == 1) err = SSL_use_PrivateKey(get(), pkey); + if (err == 1 && chain != nullptr) err = SSL_set1_chain(get(), chain); + return err == 1; +} + +std::optional<uint32_t> SSLPointer::verifyPeerCertificate() const { + if (!ssl_) return std::nullopt; + if (X509Pointer::PeerFrom(*this)) { + return SSL_get_verify_result(get()); + } + + const SSL_CIPHER* curr_cipher = SSL_get_current_cipher(get()); + const SSL_SESSION* sess = SSL_get_session(get()); + // Allow no-cert for PSK authentication in TLS1.2 and lower. + // In TLS1.3 check that session was reused because TLS1.3 PSK + // looks like session resumption. + if (SSL_CIPHER_get_auth_nid(curr_cipher) == NID_auth_psk || + (SSL_SESSION_get_protocol_version(sess) == TLS1_3_VERSION && + SSL_session_reused(get()))) { + return X509_V_OK; + } + + return std::nullopt; +} + +const std::string_view SSLPointer::getClientHelloAlpn() const { + if (ssl_ == nullptr) return {}; + const unsigned char* buf; + size_t len; + size_t rem; + + if (!SSL_client_hello_get0_ext( + get(), + TLSEXT_TYPE_application_layer_protocol_negotiation, + &buf, + &rem) || + rem < 2) { + return {}; + } + + len = (buf[0] << 8) | buf[1]; + if (len + 2 != rem) return {}; + return reinterpret_cast<const char*>(buf + 3); +} + +const std::string_view SSLPointer::getClientHelloServerName() const { + if (ssl_ == nullptr) return {}; + const unsigned char* buf; + size_t len; + size_t rem; + + if (!SSL_client_hello_get0_ext(get(), TLSEXT_TYPE_server_name, &buf, &rem) || + rem <= 2) { + return {}; + } + + len = (*buf << 8) | *(buf + 1); + if (len + 2 != rem) return {}; + rem = len; + + if (rem == 0 || *(buf + 2) != TLSEXT_NAMETYPE_host_name) return {}; + rem--; + if (rem <= 2) return {}; + len = (*(buf + 3) << 8) | *(buf + 4); + if (len + 2 > rem) return {}; + return reinterpret_cast<const char*>(buf + 5); +} + +std::optional<const std::string_view> SSLPointer::GetServerName( + const SSL* ssl) { + if (ssl == nullptr) return std::nullopt; + auto res = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); + if (res == nullptr) return std::nullopt; + return res; +} + +std::optional<const std::string_view> SSLPointer::getServerName() const { + if (!ssl_) return std::nullopt; + return GetServerName(get()); +} + +X509View SSLPointer::getCertificate() const { + if (!ssl_) return {}; + ClearErrorOnReturn clear_error_on_return; + return ncrypto::X509View(SSL_get_certificate(get())); +} + +const SSL_CIPHER* SSLPointer::getCipher() const { + if (!ssl_) return nullptr; + return SSL_get_current_cipher(get()); +} + +bool SSLPointer::isServer() const { + return SSL_is_server(get()) != 0; +} + +EVPKeyPointer SSLPointer::getPeerTempKey() const { + if (!ssl_) return {}; + EVP_PKEY* raw_key = nullptr; + if (!SSL_get_peer_tmp_key(get(), &raw_key)) return {}; + return EVPKeyPointer(raw_key); +} + +SSLCtxPointer::SSLCtxPointer(SSL_CTX* ctx) : ctx_(ctx) {} + +SSLCtxPointer::SSLCtxPointer(SSLCtxPointer&& other) noexcept + : ctx_(other.release()) {} + +SSLCtxPointer& SSLCtxPointer::operator=(SSLCtxPointer&& other) noexcept { + if (this == &other) return *this; + this->~SSLCtxPointer(); + return *new (this) SSLCtxPointer(std::move(other)); +} + +SSLCtxPointer::~SSLCtxPointer() { + reset(); +} + +void SSLCtxPointer::reset(SSL_CTX* ctx) { + ctx_.reset(ctx); +} + +void SSLCtxPointer::reset(const SSL_METHOD* method) { + ctx_.reset(SSL_CTX_new(method)); +} + +SSL_CTX* SSLCtxPointer::release() { + return ctx_.release(); +} + +SSLCtxPointer SSLCtxPointer::NewServer() { + return SSLCtxPointer(SSL_CTX_new(TLS_server_method())); +} + +SSLCtxPointer SSLCtxPointer::NewClient() { + return SSLCtxPointer(SSL_CTX_new(TLS_client_method())); +} + +SSLCtxPointer SSLCtxPointer::New(const SSL_METHOD* method) { + return SSLCtxPointer(SSL_CTX_new(method)); +} + +bool SSLCtxPointer::setGroups(const char* groups) { + return SSL_CTX_set1_groups_list(get(), groups) == 1; +} + +// ============================================================================ + +const Cipher Cipher::FromName(const char* name) { + return Cipher(EVP_get_cipherbyname(name)); +} + +const Cipher Cipher::FromNid(int nid) { + return Cipher(EVP_get_cipherbynid(nid)); +} + +const Cipher Cipher::FromCtx(const CipherCtxPointer& ctx) { + return Cipher(EVP_CIPHER_CTX_cipher(ctx.get())); +} + +int Cipher::getMode() const { + if (!cipher_) return 0; + return EVP_CIPHER_mode(cipher_); +} + +int Cipher::getIvLength() const { + if (!cipher_) return 0; + return EVP_CIPHER_iv_length(cipher_); +} + +int Cipher::getKeyLength() const { + if (!cipher_) return 0; + return EVP_CIPHER_key_length(cipher_); +} + +int Cipher::getBlockSize() const { + if (!cipher_) return 0; + return EVP_CIPHER_block_size(cipher_); +} + +int Cipher::getNid() const { + if (!cipher_) return 0; + return EVP_CIPHER_nid(cipher_); +} + +std::string_view Cipher::getModeLabel() const { + if (!cipher_) return {}; + switch (getMode()) { + case EVP_CIPH_CCM_MODE: + return "ccm"; + case EVP_CIPH_CFB_MODE: + return "cfb"; + case EVP_CIPH_CBC_MODE: + return "cbc"; + case EVP_CIPH_CTR_MODE: + return "ctr"; + case EVP_CIPH_ECB_MODE: + return "ecb"; + case EVP_CIPH_GCM_MODE: + return "gcm"; + case EVP_CIPH_OCB_MODE: + return "ocb"; + case EVP_CIPH_OFB_MODE: + return "ofb"; + case EVP_CIPH_WRAP_MODE: + return "wrap"; + case EVP_CIPH_XTS_MODE: + return "xts"; + case EVP_CIPH_STREAM_CIPHER: + return "stream"; + } + return "{unknown}"; +} + +std::string_view Cipher::getName() const { + if (!cipher_) return {}; + // OBJ_nid2sn(EVP_CIPHER_nid(cipher)) is used here instead of + // EVP_CIPHER_name(cipher) for compatibility with BoringSSL. + return OBJ_nid2sn(getNid()); +} + +bool Cipher::isSupportedAuthenticatedMode() const { + switch (getMode()) { + case EVP_CIPH_CCM_MODE: + case EVP_CIPH_GCM_MODE: +#ifndef OPENSSL_NO_OCB + case EVP_CIPH_OCB_MODE: +#endif + return true; + case EVP_CIPH_STREAM_CIPHER: + return getNid() == NID_chacha20_poly1305; + default: + return false; + } +} + +// ============================================================================ + +CipherCtxPointer CipherCtxPointer::New() { + auto ret = CipherCtxPointer(EVP_CIPHER_CTX_new()); + if (!ret) return {}; + EVP_CIPHER_CTX_init(ret.get()); + return ret; +} + +CipherCtxPointer::CipherCtxPointer(EVP_CIPHER_CTX* ctx) : ctx_(ctx) {} + +CipherCtxPointer::CipherCtxPointer(CipherCtxPointer&& other) noexcept + : ctx_(other.release()) {} + +CipherCtxPointer& CipherCtxPointer::operator=( + CipherCtxPointer&& other) noexcept { + if (this == &other) return *this; + this->~CipherCtxPointer(); + return *new (this) CipherCtxPointer(std::move(other)); +} + +CipherCtxPointer::~CipherCtxPointer() { + reset(); +} + +void CipherCtxPointer::reset(EVP_CIPHER_CTX* ctx) { + ctx_.reset(ctx); +} + +EVP_CIPHER_CTX* CipherCtxPointer::release() { + return ctx_.release(); +} + +void CipherCtxPointer::setFlags(int flags) { + if (!ctx_) return; + EVP_CIPHER_CTX_set_flags(ctx_.get(), flags); +} + +bool CipherCtxPointer::setKeyLength(size_t length) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_set_key_length(ctx_.get(), length); +} + +bool CipherCtxPointer::setIvLength(size_t length) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_ctrl( + ctx_.get(), EVP_CTRL_AEAD_SET_IVLEN, length, nullptr); +} + +bool CipherCtxPointer::setAeadTag(const Buffer<const char>& tag) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_ctrl( + ctx_.get(), EVP_CTRL_AEAD_SET_TAG, tag.len, const_cast<char*>(tag.data)); +} + +bool CipherCtxPointer::setAeadTagLength(size_t length) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_ctrl( + ctx_.get(), EVP_CTRL_AEAD_SET_TAG, length, nullptr); +} + +bool CipherCtxPointer::setPadding(bool padding) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_set_padding(ctx_.get(), padding); +} + +int CipherCtxPointer::getBlockSize() const { + if (!ctx_) return 0; + return EVP_CIPHER_CTX_block_size(ctx_.get()); +} + +int CipherCtxPointer::getMode() const { + if (!ctx_) return 0; + return EVP_CIPHER_CTX_mode(ctx_.get()); +} + +int CipherCtxPointer::getNid() const { + if (!ctx_) return 0; + return EVP_CIPHER_CTX_nid(ctx_.get()); +} + +bool CipherCtxPointer::init(const Cipher& cipher, + bool encrypt, + const unsigned char* key, + const unsigned char* iv) { + if (!ctx_) return false; + return EVP_CipherInit_ex( + ctx_.get(), cipher, nullptr, key, iv, encrypt ? 1 : 0) == 1; +} + +bool CipherCtxPointer::update(const Buffer<const unsigned char>& in, + unsigned char* out, + int* out_len, + bool finalize) { + if (!ctx_) return false; + if (!finalize) { + return EVP_CipherUpdate(ctx_.get(), out, out_len, in.data, in.len) == 1; + } + return EVP_CipherFinal_ex(ctx_.get(), out, out_len) == 1; +} + +bool CipherCtxPointer::getAeadTag(size_t len, unsigned char* out) { + if (!ctx_) return false; + return EVP_CIPHER_CTX_ctrl(ctx_.get(), EVP_CTRL_AEAD_GET_TAG, len, out); +} + +// ============================================================================ + +ECDSASigPointer::ECDSASigPointer() : sig_(nullptr) {} +ECDSASigPointer::ECDSASigPointer(ECDSA_SIG* sig) : sig_(sig) { + if (sig_) { + ECDSA_SIG_get0(sig_.get(), &pr_, &ps_); + } +} +ECDSASigPointer::ECDSASigPointer(ECDSASigPointer&& other) noexcept + : sig_(other.release()) { + if (sig_) { + ECDSA_SIG_get0(sig_.get(), &pr_, &ps_); + } +} + +ECDSASigPointer& ECDSASigPointer::operator=(ECDSASigPointer&& other) noexcept { + sig_.reset(other.release()); + if (sig_) { + ECDSA_SIG_get0(sig_.get(), &pr_, &ps_); + } + return *this; +} + +ECDSASigPointer::~ECDSASigPointer() { + reset(); +} + +void ECDSASigPointer::reset(ECDSA_SIG* sig) { + sig_.reset(); + pr_ = nullptr; + ps_ = nullptr; +} + +ECDSA_SIG* ECDSASigPointer::release() { + pr_ = nullptr; + ps_ = nullptr; + return sig_.release(); +} + +ECDSASigPointer ECDSASigPointer::New() { + return ECDSASigPointer(ECDSA_SIG_new()); +} + +ECDSASigPointer ECDSASigPointer::Parse(const Buffer<const unsigned char>& sig) { + const unsigned char* ptr = sig.data; + return ECDSASigPointer(d2i_ECDSA_SIG(nullptr, &ptr, sig.len)); +} + +bool ECDSASigPointer::setParams(BignumPointer&& r, BignumPointer&& s) { + if (!sig_) return false; + return ECDSA_SIG_set0(sig_.get(), r.release(), s.release()); +} + +Buffer<unsigned char> ECDSASigPointer::encode() const { + if (!sig_) + return { + .data = nullptr, + .len = 0, + }; + Buffer<unsigned char> buf; + buf.len = i2d_ECDSA_SIG(sig_.get(), &buf.data); + return buf; +} + +// ============================================================================ + +ECGroupPointer::ECGroupPointer() : group_(nullptr) {} + +ECGroupPointer::ECGroupPointer(EC_GROUP* group) : group_(group) {} + +ECGroupPointer::ECGroupPointer(ECGroupPointer&& other) noexcept + : group_(other.release()) {} + +ECGroupPointer& ECGroupPointer::operator=(ECGroupPointer&& other) noexcept { + group_.reset(other.release()); + return *this; +} + +ECGroupPointer::~ECGroupPointer() { + reset(); +} + +void ECGroupPointer::reset(EC_GROUP* group) { + group_.reset(); +} + +EC_GROUP* ECGroupPointer::release() { + return group_.release(); +} + +ECGroupPointer ECGroupPointer::NewByCurveName(int nid) { + return ECGroupPointer(EC_GROUP_new_by_curve_name(nid)); +} + +// ============================================================================ + +ECPointPointer::ECPointPointer() : point_(nullptr) {} + +ECPointPointer::ECPointPointer(EC_POINT* point) : point_(point) {} + +ECPointPointer::ECPointPointer(ECPointPointer&& other) noexcept + : point_(other.release()) {} + +ECPointPointer& ECPointPointer::operator=(ECPointPointer&& other) noexcept { + point_.reset(other.release()); + return *this; +} + +ECPointPointer::~ECPointPointer() { + reset(); +} + +void ECPointPointer::reset(EC_POINT* point) { + point_.reset(point); +} + +EC_POINT* ECPointPointer::release() { + return point_.release(); +} + +ECPointPointer ECPointPointer::New(const EC_GROUP* group) { + return ECPointPointer(EC_POINT_new(group)); +} + +bool ECPointPointer::setFromBuffer(const Buffer<const unsigned char>& buffer, + const EC_GROUP* group) { + if (!point_) return false; + return EC_POINT_oct2point( + group, point_.get(), buffer.data, buffer.len, nullptr); +} + +bool ECPointPointer::mul(const EC_GROUP* group, const BIGNUM* priv_key) { + if (!point_) return false; + return EC_POINT_mul(group, point_.get(), priv_key, nullptr, nullptr, nullptr); +} + +// ============================================================================ + +ECKeyPointer::ECKeyPointer() : key_(nullptr) {} + +ECKeyPointer::ECKeyPointer(EC_KEY* key) : key_(key) {} + +ECKeyPointer::ECKeyPointer(ECKeyPointer&& other) noexcept + : key_(other.release()) {} + +ECKeyPointer& ECKeyPointer::operator=(ECKeyPointer&& other) noexcept { + key_.reset(other.release()); + return *this; +} + +ECKeyPointer::~ECKeyPointer() { + reset(); +} + +void ECKeyPointer::reset(EC_KEY* key) { + key_.reset(key); +} + +EC_KEY* ECKeyPointer::release() { + return key_.release(); +} + +ECKeyPointer ECKeyPointer::clone() const { + if (!key_) return {}; + return ECKeyPointer(EC_KEY_dup(key_.get())); +} + +bool ECKeyPointer::generate() { + if (!key_) return false; + return EC_KEY_generate_key(key_.get()); +} + +bool ECKeyPointer::setPublicKey(const ECPointPointer& pub) { + if (!key_) return false; + return EC_KEY_set_public_key(key_.get(), pub.get()) == 1; +} + +bool ECKeyPointer::setPublicKeyRaw(const BignumPointer& x, + const BignumPointer& y) { + if (!key_) return false; + return EC_KEY_set_public_key_affine_coordinates( + key_.get(), x.get(), y.get()) == 1; +} + +bool ECKeyPointer::setPrivateKey(const BignumPointer& priv) { + if (!key_) return false; + return EC_KEY_set_private_key(key_.get(), priv.get()) == 1; +} + +const BIGNUM* ECKeyPointer::getPrivateKey() const { + if (!key_) return nullptr; + return GetPrivateKey(key_.get()); +} + +const BIGNUM* ECKeyPointer::GetPrivateKey(const EC_KEY* key) { + return EC_KEY_get0_private_key(key); +} + +const EC_POINT* ECKeyPointer::getPublicKey() const { + if (!key_) return nullptr; + return GetPublicKey(key_.get()); +} + +const EC_POINT* ECKeyPointer::GetPublicKey(const EC_KEY* key) { + return EC_KEY_get0_public_key(key); +} + +const EC_GROUP* ECKeyPointer::getGroup() const { + if (!key_) return nullptr; + return GetGroup(key_.get()); +} + +const EC_GROUP* ECKeyPointer::GetGroup(const EC_KEY* key) { + return EC_KEY_get0_group(key); +} + +int ECKeyPointer::GetGroupName(const EC_KEY* key) { + const EC_GROUP* group = GetGroup(key); + return group ? EC_GROUP_get_curve_name(group) : 0; +} + +bool ECKeyPointer::Check(const EC_KEY* key) { + return EC_KEY_check_key(key) == 1; +} + +bool ECKeyPointer::checkKey() const { + if (!key_) return false; + return Check(key_.get()); +} + +ECKeyPointer ECKeyPointer::NewByCurveName(int nid) { + return ECKeyPointer(EC_KEY_new_by_curve_name(nid)); +} + +ECKeyPointer ECKeyPointer::New(const EC_GROUP* group) { + auto ptr = ECKeyPointer(EC_KEY_new()); + if (!ptr) return {}; + if (!EC_KEY_set_group(ptr.get(), group)) return {}; + return ptr; +} + +} // namespace ncrypto diff --git a/deps/ncrypto/ncrypto.gyp b/deps/ncrypto/ncrypto.gyp new file mode 100644 index 00000000000000..90ac158d7e2171 --- /dev/null +++ b/deps/ncrypto/ncrypto.gyp @@ -0,0 +1,28 @@ +{ + 'variables': { + 'ncrypto_sources': [ + 'engine.cc', + 'dh-primes.h', + 'ncrypto.cc', + 'ncrypto.h', + ], + }, + 'targets': [ + { + 'target_name': 'ncrypto', + 'type': 'static_library', + 'include_dirs': ['.'], + 'direct_dependent_settings': { + 'include_dirs': ['.'], + }, + 'sources': [ '<@(ncrypto_sources)' ], + 'conditions': [ + ['node_shared_openssl=="false"', { + 'dependencies': [ + '../openssl/openssl.gyp:openssl' + ] + }], + ] + }, + ] +} diff --git a/deps/ncrypto/ncrypto.h b/deps/ncrypto/ncrypto.h new file mode 100644 index 00000000000000..e5bf2b529bf239 --- /dev/null +++ b/deps/ncrypto/ncrypto.h @@ -0,0 +1,1066 @@ +#pragma once + +#include <openssl/bio.h> +#include <openssl/bn.h> +#include <openssl/dh.h> +#include <openssl/dsa.h> +#include <openssl/ec.h> +#include <openssl/err.h> +#include <openssl/evp.h> +#include <openssl/hmac.h> +#include <openssl/kdf.h> +#include <openssl/rsa.h> +#include <openssl/ssl.h> +#include <openssl/x509.h> +#include <cstddef> +#include <functional> +#include <list> +#include <memory> +#include <optional> +#include <string> +#include <string_view> +#ifndef OPENSSL_NO_ENGINE +#include <openssl/engine.h> +#endif // !OPENSSL_NO_ENGINE +// The FIPS-related functions are only available +// when the OpenSSL itself was compiled with FIPS support. +#if defined(OPENSSL_FIPS) && OPENSSL_VERSION_MAJOR < 3 +#include <openssl/fips.h> +#endif // OPENSSL_FIPS + +#if OPENSSL_VERSION_MAJOR >= 3 +#define OSSL3_CONST const +#else +#define OSSL3_CONST +#endif + +#ifdef __GNUC__ +#define NCRYPTO_MUST_USE_RESULT __attribute__((warn_unused_result)) +#else +#define NCRYPTO_MUST_USE_RESULT +#endif + +namespace ncrypto { + +// ============================================================================ +// Utility macros + +#if NCRYPTO_DEVELOPMENT_CHECKS +#define NCRYPTO_STR(x) #x +#define NCRYPTO_REQUIRE(EXPR) \ + { \ + if (!(EXPR) { abort(); }) } + +#define NCRYPTO_FAIL(MESSAGE) \ + do { \ + std::cerr << "FAIL: " << (MESSAGE) << std::endl; \ + abort(); \ + } while (0); +#define NCRYPTO_ASSERT_EQUAL(LHS, RHS, MESSAGE) \ + do { \ + if (LHS != RHS) { \ + std::cerr << "Mismatch: '" << LHS << "' - '" << RHS << "'" << std::endl; \ + NCRYPTO_FAIL(MESSAGE); \ + } \ + } while (0); +#define NCRYPTO_ASSERT_TRUE(COND) \ + do { \ + if (!(COND)) { \ + std::cerr << "Assert at line " << __LINE__ << " of file " << __FILE__ \ + << std::endl; \ + NCRYPTO_FAIL(NCRYPTO_STR(COND)); \ + } \ + } while (0); +#else +#define NCRYPTO_FAIL(MESSAGE) +#define NCRYPTO_ASSERT_EQUAL(LHS, RHS, MESSAGE) +#define NCRYPTO_ASSERT_TRUE(COND) +#endif + +#define NCRYPTO_DISALLOW_COPY(Name) \ + Name(const Name&) = delete; \ + Name& operator=(const Name&) = delete; +#define NCRYPTO_DISALLOW_MOVE(Name) \ + Name(Name&&) = delete; \ + Name& operator=(Name&&) = delete; +#define NCRYPTO_DISALLOW_COPY_AND_MOVE(Name) \ + NCRYPTO_DISALLOW_COPY(Name) \ + NCRYPTO_DISALLOW_MOVE(Name) +#define NCRYPTO_DISALLOW_NEW_DELETE() \ + void* operator new(size_t) = delete; \ + void operator delete(void*) = delete; + +[[noreturn]] inline void unreachable() { +#ifdef __GNUC__ + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(false); +#else +#endif +} + +static constexpr int kX509NameFlagsMultiline = + ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_UTF8_CONVERT | + XN_FLAG_SEP_MULTILINE | XN_FLAG_FN_SN; + +// ============================================================================ +// Error handling utilities + +// Capture the current OpenSSL Error Stack. The stack will be ordered such +// that the error currently at the top of the stack is at the end of the +// list and the error at the bottom of the stack is at the beginning. +class CryptoErrorList final { + public: + enum class Option { NONE, CAPTURE_ON_CONSTRUCT }; + CryptoErrorList(Option option = Option::CAPTURE_ON_CONSTRUCT); + + void capture(); + + // Add an error message to the end of the stack. + void add(std::string message); + + inline const std::string& peek_back() const { return errors_.back(); } + inline size_t size() const { return errors_.size(); } + inline bool empty() const { return errors_.empty(); } + + inline auto begin() const noexcept { return errors_.begin(); } + inline auto end() const noexcept { return errors_.end(); } + inline auto rbegin() const noexcept { return errors_.rbegin(); } + inline auto rend() const noexcept { return errors_.rend(); } + + std::optional<std::string> pop_back(); + std::optional<std::string> pop_front(); + + private: + std::list<std::string> errors_; +}; + +// Forcibly clears the error stack on destruction. This stops stale errors +// from popping up later in the lifecycle of crypto operations where they +// would cause spurious failures. It is a rather blunt method, though, and +// ERR_clear_error() isn't necessarily cheap. +// +// If created with a pointer to a CryptoErrorList, the current OpenSSL error +// stack will be captured before clearing the error. +class ClearErrorOnReturn final { + public: + ClearErrorOnReturn(CryptoErrorList* errors = nullptr); + ~ClearErrorOnReturn(); + NCRYPTO_DISALLOW_COPY_AND_MOVE(ClearErrorOnReturn) + NCRYPTO_DISALLOW_NEW_DELETE() + + int peekError(); + + private: + CryptoErrorList* errors_; +}; + +// Pop errors from OpenSSL's error stack that were added between when this +// was constructed and destructed. +// +// If created with a pointer to a CryptoErrorList, the current OpenSSL error +// stack will be captured before resetting the error to the mark. +class MarkPopErrorOnReturn final { + public: + MarkPopErrorOnReturn(CryptoErrorList* errors = nullptr); + ~MarkPopErrorOnReturn(); + NCRYPTO_DISALLOW_COPY_AND_MOVE(MarkPopErrorOnReturn) + NCRYPTO_DISALLOW_NEW_DELETE() + + int peekError(); + + private: + CryptoErrorList* errors_; +}; + +// TODO(@jasnell): Eventually replace with std::expected when we are able to +// bump up to c++23. +template <typename T, typename E> +struct Result final { + const bool has_value; + T value; + std::optional<E> error = std::nullopt; + std::optional<int> openssl_error = std::nullopt; + Result(T&& value) : has_value(true), value(std::move(value)) {} + Result(E&& error, std::optional<int> openssl_error = std::nullopt) + : has_value(false), + error(std::move(error)), + openssl_error(std::move(openssl_error)) {} + inline operator bool() const { return has_value; } +}; + +// ============================================================================ +// Various smart pointer aliases for OpenSSL types. + +template <typename T, void (*function)(T*)> +struct FunctionDeleter { + void operator()(T* pointer) const { function(pointer); } + typedef std::unique_ptr<T, FunctionDeleter> Pointer; +}; + +template <typename T, void (*function)(T*)> +using DeleteFnPtr = typename FunctionDeleter<T, function>::Pointer; + +using BignumCtxPointer = DeleteFnPtr<BN_CTX, BN_CTX_free>; +using BignumGenCallbackPointer = DeleteFnPtr<BN_GENCB, BN_GENCB_free>; +using EVPKeyCtxPointer = DeleteFnPtr<EVP_PKEY_CTX, EVP_PKEY_CTX_free>; +using EVPMDCtxPointer = DeleteFnPtr<EVP_MD_CTX, EVP_MD_CTX_free>; +using HMACCtxPointer = DeleteFnPtr<HMAC_CTX, HMAC_CTX_free>; +using NetscapeSPKIPointer = DeleteFnPtr<NETSCAPE_SPKI, NETSCAPE_SPKI_free>; +using PKCS8Pointer = DeleteFnPtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_free>; +using RSAPointer = DeleteFnPtr<RSA, RSA_free>; +using SSLSessionPointer = DeleteFnPtr<SSL_SESSION, SSL_SESSION_free>; + +class CipherCtxPointer; +class ECKeyPointer; + +struct StackOfXASN1Deleter { + void operator()(STACK_OF(ASN1_OBJECT) * p) const { + sk_ASN1_OBJECT_pop_free(p, ASN1_OBJECT_free); + } +}; +using StackOfASN1 = std::unique_ptr<STACK_OF(ASN1_OBJECT), StackOfXASN1Deleter>; + +// An unowned, unmanaged pointer to a buffer of data. +template <typename T> +struct Buffer { + T* data = nullptr; + size_t len = 0; +}; + +class Cipher final { + public: + Cipher() = default; + Cipher(const EVP_CIPHER* cipher) : cipher_(cipher) {} + Cipher(const Cipher&) = default; + Cipher& operator=(const Cipher&) = default; + inline Cipher& operator=(const EVP_CIPHER* cipher) { + cipher_ = cipher; + return *this; + } + NCRYPTO_DISALLOW_MOVE(Cipher) + + inline const EVP_CIPHER* get() const { return cipher_; } + inline operator const EVP_CIPHER*() const { return cipher_; } + inline operator bool() const { return cipher_ != nullptr; } + + int getNid() const; + int getMode() const; + int getIvLength() const; + int getKeyLength() const; + int getBlockSize() const; + std::string_view getModeLabel() const; + std::string_view getName() const; + + bool isSupportedAuthenticatedMode() const; + + static const Cipher FromName(const char* name); + static const Cipher FromNid(int nid); + static const Cipher FromCtx(const CipherCtxPointer& ctx); + + private: + const EVP_CIPHER* cipher_ = nullptr; +}; + +// A managed pointer to a buffer of data. When destroyed the underlying +// buffer will be freed. +class DataPointer final { + public: + static DataPointer Alloc(size_t len); + + DataPointer() = default; + explicit DataPointer(void* data, size_t len); + explicit DataPointer(const Buffer<void>& buffer); + DataPointer(DataPointer&& other) noexcept; + DataPointer& operator=(DataPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(DataPointer) + ~DataPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return data_ == nullptr; } + inline operator bool() const { return data_ != nullptr; } + inline void* get() const noexcept { return data_; } + inline size_t size() const noexcept { return len_; } + void reset(void* data = nullptr, size_t len = 0); + void reset(const Buffer<void>& buffer); + + // Releases ownership of the underlying data buffer. It is the caller's + // responsibility to ensure the buffer is appropriately freed. + Buffer<void> release(); + + // Returns a Buffer struct that is a view of the underlying data. + template <typename T = void> + inline operator const Buffer<T>() const { + return { + .data = static_cast<T*>(data_), + .len = len_, + }; + } + + private: + void* data_ = nullptr; + size_t len_ = 0; +}; + +class BIOPointer final { + public: + static BIOPointer NewMem(); + static BIOPointer NewSecMem(); + static BIOPointer New(const BIO_METHOD* method); + static BIOPointer New(const void* data, size_t len); + static BIOPointer New(const BIGNUM* bn); + static BIOPointer NewFile(std::string_view filename, std::string_view mode); + static BIOPointer NewFp(FILE* fd, int flags); + + template <typename T> + static BIOPointer New(const Buffer<T>& buf) { + return New(buf.data, buf.len); + } + + BIOPointer() = default; + BIOPointer(std::nullptr_t) : bio_(nullptr) {} + explicit BIOPointer(BIO* bio); + BIOPointer(BIOPointer&& other) noexcept; + BIOPointer& operator=(BIOPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(BIOPointer) + ~BIOPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return bio_ == nullptr; } + inline operator bool() const { return bio_ != nullptr; } + inline BIO* get() const noexcept { return bio_.get(); } + + inline operator BUF_MEM*() const { + BUF_MEM* mem = nullptr; + if (!bio_) return mem; + BIO_get_mem_ptr(bio_.get(), &mem); + return mem; + } + + inline operator BIO*() const { return bio_.get(); } + + void reset(BIO* bio = nullptr); + BIO* release(); + + bool resetBio() const; + + static int Write(BIOPointer* bio, std::string_view message); + + template <typename... Args> + static void Printf(BIOPointer* bio, const char* format, Args... args) { + if (bio == nullptr || !*bio) return; + BIO_printf(bio->get(), format, std::forward<Args...>(args...)); + } + + private: + mutable DeleteFnPtr<BIO, BIO_free_all> bio_; +}; + +class BignumPointer final { + public: + BignumPointer() = default; + explicit BignumPointer(BIGNUM* bignum); + explicit BignumPointer(const unsigned char* data, size_t len); + BignumPointer(BignumPointer&& other) noexcept; + BignumPointer& operator=(BignumPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(BignumPointer) + ~BignumPointer(); + + int operator<=>(const BignumPointer& other) const noexcept; + int operator<=>(const BIGNUM* other) const noexcept; + inline operator bool() const { return bn_ != nullptr; } + inline BIGNUM* get() const noexcept { return bn_.get(); } + void reset(BIGNUM* bn = nullptr); + void reset(const unsigned char* data, size_t len); + BIGNUM* release(); + + bool isZero() const; + bool isOne() const; + + bool setWord(unsigned long w); // NOLINT(runtime/int) + unsigned long getWord() const; // NOLINT(runtime/int) + + size_t byteLength() const; + + DataPointer toHex() const; + DataPointer encode() const; + DataPointer encodePadded(size_t size) const; + size_t encodeInto(unsigned char* out) const; + size_t encodePaddedInto(unsigned char* out, size_t size) const; + + using PrimeCheckCallback = std::function<bool(int, int)>; + int isPrime(int checks, + PrimeCheckCallback cb = defaultPrimeCheckCallback) const; + struct PrimeConfig { + int bits; + bool safe = false; + const BignumPointer& add; + const BignumPointer& rem; + }; + + static BignumPointer NewPrime( + const PrimeConfig& params, + PrimeCheckCallback cb = defaultPrimeCheckCallback); + + bool generate(const PrimeConfig& params, + PrimeCheckCallback cb = defaultPrimeCheckCallback) const; + + static BignumPointer New(); + static BignumPointer NewSecure(); + static BignumPointer NewSub(const BignumPointer& a, const BignumPointer& b); + static BignumPointer NewLShift(size_t length); + + static DataPointer Encode(const BIGNUM* bn); + static DataPointer EncodePadded(const BIGNUM* bn, size_t size); + static size_t EncodePaddedInto(const BIGNUM* bn, + unsigned char* out, + size_t size); + static int GetBitCount(const BIGNUM* bn); + static int GetByteCount(const BIGNUM* bn); + static unsigned long GetWord(const BIGNUM* bn); // NOLINT(runtime/int) + static const BIGNUM* One(); + + BignumPointer clone(); + + private: + DeleteFnPtr<BIGNUM, BN_clear_free> bn_; + + static bool defaultPrimeCheckCallback(int, int) { return 1; } +}; + +class CipherCtxPointer final { + public: + static CipherCtxPointer New(); + + CipherCtxPointer() = default; + explicit CipherCtxPointer(EVP_CIPHER_CTX* ctx); + CipherCtxPointer(CipherCtxPointer&& other) noexcept; + CipherCtxPointer& operator=(CipherCtxPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(CipherCtxPointer) + ~CipherCtxPointer(); + + inline bool operator==(std::nullptr_t) const noexcept { + return ctx_ == nullptr; + } + inline operator bool() const { return ctx_ != nullptr; } + inline EVP_CIPHER_CTX* get() const { return ctx_.get(); } + inline operator EVP_CIPHER_CTX*() const { return ctx_.get(); } + void reset(EVP_CIPHER_CTX* ctx = nullptr); + EVP_CIPHER_CTX* release(); + + void setFlags(int flags); + bool setKeyLength(size_t length); + bool setIvLength(size_t length); + bool setAeadTag(const Buffer<const char>& tag); + bool setAeadTagLength(size_t length); + bool setPadding(bool padding); + bool init(const Cipher& cipher, + bool encrypt, + const unsigned char* key = nullptr, + const unsigned char* iv = nullptr); + + int getBlockSize() const; + int getMode() const; + int getNid() const; + + bool update(const Buffer<const unsigned char>& in, + unsigned char* out, + int* out_len, + bool finalize = false); + bool getAeadTag(size_t len, unsigned char* out); + + private: + DeleteFnPtr<EVP_CIPHER_CTX, EVP_CIPHER_CTX_free> ctx_; +}; + +class EVPKeyPointer final { + public: + static EVPKeyPointer New(); + static EVPKeyPointer NewRawPublic(int id, + const Buffer<const unsigned char>& data); + static EVPKeyPointer NewRawPrivate(int id, + const Buffer<const unsigned char>& data); + + enum class PKEncodingType { + // RSAPublicKey / RSAPrivateKey according to PKCS#1. + PKCS1, + // PrivateKeyInfo or EncryptedPrivateKeyInfo according to PKCS#8. + PKCS8, + // SubjectPublicKeyInfo according to X.509. + SPKI, + // ECPrivateKey according to SEC1. + SEC1, + }; + + enum class PKFormatType { + DER, + PEM, + JWK, + }; + + enum class PKParseError { NOT_RECOGNIZED, NEED_PASSPHRASE, FAILED }; + using ParseKeyResult = Result<EVPKeyPointer, PKParseError>; + + struct AsymmetricKeyEncodingConfig { + bool output_key_object = false; + PKFormatType format = PKFormatType::DER; + PKEncodingType type = PKEncodingType::PKCS8; + AsymmetricKeyEncodingConfig() = default; + AsymmetricKeyEncodingConfig(bool output_key_object, + PKFormatType format, + PKEncodingType type); + AsymmetricKeyEncodingConfig(const AsymmetricKeyEncodingConfig&) = default; + AsymmetricKeyEncodingConfig& operator=(const AsymmetricKeyEncodingConfig&) = + default; + }; + using PublicKeyEncodingConfig = AsymmetricKeyEncodingConfig; + + struct PrivateKeyEncodingConfig : public AsymmetricKeyEncodingConfig { + const EVP_CIPHER* cipher = nullptr; + std::optional<DataPointer> passphrase = std::nullopt; + PrivateKeyEncodingConfig() = default; + PrivateKeyEncodingConfig(bool output_key_object, + PKFormatType format, + PKEncodingType type) + : AsymmetricKeyEncodingConfig(output_key_object, format, type) {} + PrivateKeyEncodingConfig(const PrivateKeyEncodingConfig&); + PrivateKeyEncodingConfig& operator=(const PrivateKeyEncodingConfig&); + }; + + static ParseKeyResult TryParsePublicKey( + const PublicKeyEncodingConfig& config, + const Buffer<const unsigned char>& buffer); + + static ParseKeyResult TryParsePublicKeyPEM( + const Buffer<const unsigned char>& buffer); + + static ParseKeyResult TryParsePrivateKey( + const PrivateKeyEncodingConfig& config, + const Buffer<const unsigned char>& buffer); + + EVPKeyPointer() = default; + explicit EVPKeyPointer(EVP_PKEY* pkey); + EVPKeyPointer(EVPKeyPointer&& other) noexcept; + EVPKeyPointer& operator=(EVPKeyPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(EVPKeyPointer) + ~EVPKeyPointer(); + + bool assign(const ECKeyPointer& eckey); + bool set(const ECKeyPointer& eckey); + operator const EC_KEY*() const; + + inline bool operator==(std::nullptr_t) const noexcept { + return pkey_ == nullptr; + } + inline operator bool() const { return pkey_ != nullptr; } + inline EVP_PKEY* get() const { return pkey_.get(); } + void reset(EVP_PKEY* pkey = nullptr); + EVP_PKEY* release(); + + static int id(const EVP_PKEY* key); + static int base_id(const EVP_PKEY* key); + + int id() const; + int base_id() const; + int bits() const; + size_t size() const; + + size_t rawPublicKeySize() const; + size_t rawPrivateKeySize() const; + DataPointer rawPublicKey() const; + DataPointer rawPrivateKey() const; + BIOPointer derPublicKey() const; + + Result<BIOPointer, bool> writePrivateKey( + const PrivateKeyEncodingConfig& config) const; + Result<BIOPointer, bool> writePublicKey( + const PublicKeyEncodingConfig& config) const; + + EVPKeyCtxPointer newCtx() const; + + static bool IsRSAPrivateKey(const Buffer<const unsigned char>& buffer); + + private: + DeleteFnPtr<EVP_PKEY, EVP_PKEY_free> pkey_; +}; + +class DHPointer final { + public: + enum class FindGroupOption { + NONE, + // There are known and documented security issues with prime groups smaller + // than 2048 bits. When the NO_SMALL_PRIMES option is set, these small prime + // groups will not be supported. + NO_SMALL_PRIMES, + }; + + static BignumPointer GetStandardGenerator(); + + static BignumPointer FindGroup( + const std::string_view name, + FindGroupOption option = FindGroupOption::NONE); + static DHPointer FromGroup(const std::string_view name, + FindGroupOption option = FindGroupOption::NONE); + + static DHPointer New(BignumPointer&& p, BignumPointer&& g); + static DHPointer New(size_t bits, unsigned int generator); + + DHPointer() = default; + explicit DHPointer(DH* dh); + DHPointer(DHPointer&& other) noexcept; + DHPointer& operator=(DHPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(DHPointer) + ~DHPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return dh_ == nullptr; } + inline operator bool() const { return dh_ != nullptr; } + inline DH* get() const { return dh_.get(); } + void reset(DH* dh = nullptr); + DH* release(); + + enum class CheckResult { + NONE, + P_NOT_PRIME = DH_CHECK_P_NOT_PRIME, + P_NOT_SAFE_PRIME = DH_CHECK_P_NOT_SAFE_PRIME, + UNABLE_TO_CHECK_GENERATOR = DH_UNABLE_TO_CHECK_GENERATOR, + NOT_SUITABLE_GENERATOR = DH_NOT_SUITABLE_GENERATOR, + Q_NOT_PRIME = DH_CHECK_Q_NOT_PRIME, + INVALID_Q = DH_CHECK_INVALID_Q_VALUE, + INVALID_J = DH_CHECK_INVALID_J_VALUE, + CHECK_FAILED = 512, + }; + CheckResult check(); + + enum class CheckPublicKeyResult { + NONE, + TOO_SMALL = DH_R_CHECK_PUBKEY_TOO_SMALL, + TOO_LARGE = DH_R_CHECK_PUBKEY_TOO_LARGE, + INVALID = DH_R_CHECK_PUBKEY_INVALID, + CHECK_FAILED = 512, + }; + // Check to see if the given public key is suitable for this DH instance. + CheckPublicKeyResult checkPublicKey(const BignumPointer& pub_key); + + DataPointer getPrime() const; + DataPointer getGenerator() const; + DataPointer getPublicKey() const; + DataPointer getPrivateKey() const; + DataPointer generateKeys() const; + DataPointer computeSecret(const BignumPointer& peer) const; + + bool setPublicKey(BignumPointer&& key); + bool setPrivateKey(BignumPointer&& key); + + size_t size() const; + + static DataPointer stateless(const EVPKeyPointer& ourKey, + const EVPKeyPointer& theirKey); + + private: + DeleteFnPtr<DH, DH_free> dh_; +}; + +struct StackOfX509Deleter { + void operator()(STACK_OF(X509) * p) const { sk_X509_pop_free(p, X509_free); } +}; +using StackOfX509 = std::unique_ptr<STACK_OF(X509), StackOfX509Deleter>; + +class X509Pointer; +class X509View; + +class SSLCtxPointer final { + public: + SSLCtxPointer() = default; + explicit SSLCtxPointer(SSL_CTX* ctx); + SSLCtxPointer(SSLCtxPointer&& other) noexcept; + SSLCtxPointer& operator=(SSLCtxPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(SSLCtxPointer) + ~SSLCtxPointer(); + + inline bool operator==(std::nullptr_t) const noexcept { + return ctx_ == nullptr; + } + inline operator bool() const { return ctx_ != nullptr; } + inline SSL_CTX* get() const { return ctx_.get(); } + void reset(SSL_CTX* ctx = nullptr); + void reset(const SSL_METHOD* method); + SSL_CTX* release(); + + bool setGroups(const char* groups); + void setStatusCallback(auto callback) { + if (!ctx_) return; + SSL_CTX_set_tlsext_status_cb(get(), callback); + SSL_CTX_set_tlsext_status_arg(get(), nullptr); + } + + static SSLCtxPointer NewServer(); + static SSLCtxPointer NewClient(); + static SSLCtxPointer New(const SSL_METHOD* method = TLS_method()); + + private: + DeleteFnPtr<SSL_CTX, SSL_CTX_free> ctx_; +}; + +class SSLPointer final { + public: + SSLPointer() = default; + explicit SSLPointer(SSL* ssl); + SSLPointer(SSLPointer&& other) noexcept; + SSLPointer& operator=(SSLPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(SSLPointer) + ~SSLPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return ssl_ == nullptr; } + inline operator bool() const { return ssl_ != nullptr; } + inline SSL* get() const { return ssl_.get(); } + inline operator SSL*() const { return ssl_.get(); } + void reset(SSL* ssl = nullptr); + SSL* release(); + + bool setSession(const SSLSessionPointer& session); + bool setSniContext(const SSLCtxPointer& ctx) const; + + const std::string_view getClientHelloAlpn() const; + const std::string_view getClientHelloServerName() const; + + std::optional<const std::string_view> getServerName() const; + X509View getCertificate() const; + EVPKeyPointer getPeerTempKey() const; + const SSL_CIPHER* getCipher() const; + bool isServer() const; + + std::optional<uint32_t> verifyPeerCertificate() const; + + void getCiphers(std::function<void(const std::string_view)> cb) const; + + static SSLPointer New(const SSLCtxPointer& ctx); + static std::optional<const std::string_view> GetServerName(const SSL* ssl); + + private: + DeleteFnPtr<SSL, SSL_free> ssl_; +}; + +class X509View final { + public: + static X509View From(const SSLPointer& ssl); + static X509View From(const SSLCtxPointer& ctx); + + X509View() = default; + inline explicit X509View(const X509* cert) : cert_(cert) {} + X509View(const X509View& other) = default; + X509View& operator=(const X509View& other) = default; + NCRYPTO_DISALLOW_MOVE(X509View) + + inline X509* get() const { return const_cast<X509*>(cert_); } + inline operator X509*() const { return const_cast<X509*>(cert_); } + inline operator const X509*() const { return cert_; } + + inline bool operator==(std::nullptr_t) noexcept { return cert_ == nullptr; } + inline operator bool() const { return cert_ != nullptr; } + + BIOPointer toPEM() const; + BIOPointer toDER() const; + + BIOPointer getSubject() const; + BIOPointer getSubjectAltName() const; + BIOPointer getIssuer() const; + BIOPointer getInfoAccess() const; + BIOPointer getValidFrom() const; + BIOPointer getValidTo() const; + int64_t getValidFromTime() const; + int64_t getValidToTime() const; + DataPointer getSerialNumber() const; + Result<EVPKeyPointer, int> getPublicKey() const; + StackOfASN1 getKeyUsage() const; + + bool isCA() const; + bool isIssuedBy(const X509View& other) const; + bool checkPrivateKey(const EVPKeyPointer& pkey) const; + bool checkPublicKey(const EVPKeyPointer& pkey) const; + + std::optional<std::string> getFingerprint(const EVP_MD* method) const; + + X509Pointer clone() const; + + enum class CheckMatch { + NO_MATCH, + MATCH, + INVALID_NAME, + OPERATION_FAILED, + }; + CheckMatch checkHost(const std::string_view host, + int flags, + DataPointer* peerName = nullptr) const; + CheckMatch checkEmail(const std::string_view email, int flags) const; + CheckMatch checkIp(const std::string_view ip, int flags) const; + + private: + const X509* cert_ = nullptr; +}; + +class X509Pointer final { + public: + static Result<X509Pointer, int> Parse(Buffer<const unsigned char> buffer); + static X509Pointer IssuerFrom(const SSLPointer& ssl, const X509View& view); + static X509Pointer IssuerFrom(const SSL_CTX* ctx, const X509View& view); + static X509Pointer PeerFrom(const SSLPointer& ssl); + + X509Pointer() = default; + explicit X509Pointer(X509* cert); + X509Pointer(X509Pointer&& other) noexcept; + X509Pointer& operator=(X509Pointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(X509Pointer) + ~X509Pointer(); + + inline bool operator==(std::nullptr_t) noexcept { return cert_ == nullptr; } + inline operator bool() const { return cert_ != nullptr; } + inline X509* get() const { return cert_.get(); } + inline operator X509*() const { return cert_.get(); } + inline operator const X509*() const { return cert_.get(); } + void reset(X509* cert = nullptr); + X509* release(); + + X509View view() const; + operator X509View() const { return view(); } + + static std::string_view ErrorCode(int32_t err); + static std::optional<std::string_view> ErrorReason(int32_t err); + + private: + DeleteFnPtr<X509, X509_free> cert_; +}; + +class ECDSASigPointer final { + public: + explicit ECDSASigPointer(); + explicit ECDSASigPointer(ECDSA_SIG* sig); + ECDSASigPointer(ECDSASigPointer&& other) noexcept; + ECDSASigPointer& operator=(ECDSASigPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(ECDSASigPointer) + ~ECDSASigPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return sig_ == nullptr; } + inline operator bool() const { return sig_ != nullptr; } + inline ECDSA_SIG* get() const { return sig_.get(); } + inline operator ECDSA_SIG*() const { return sig_.get(); } + void reset(ECDSA_SIG* sig = nullptr); + ECDSA_SIG* release(); + + static ECDSASigPointer New(); + static ECDSASigPointer Parse(const Buffer<const unsigned char>& buffer); + + inline const BIGNUM* r() const { return pr_; } + inline const BIGNUM* s() const { return ps_; } + + bool setParams(BignumPointer&& r, BignumPointer&& s); + + Buffer<unsigned char> encode() const; + + private: + DeleteFnPtr<ECDSA_SIG, ECDSA_SIG_free> sig_; + const BIGNUM* pr_ = nullptr; + const BIGNUM* ps_ = nullptr; +}; + +class ECGroupPointer final { + public: + explicit ECGroupPointer(); + explicit ECGroupPointer(EC_GROUP* group); + ECGroupPointer(ECGroupPointer&& other) noexcept; + ECGroupPointer& operator=(ECGroupPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(ECGroupPointer) + ~ECGroupPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return group_ == nullptr; } + inline operator bool() const { return group_ != nullptr; } + inline EC_GROUP* get() const { return group_.get(); } + inline operator EC_GROUP*() const { return group_.get(); } + void reset(EC_GROUP* group = nullptr); + EC_GROUP* release(); + + static ECGroupPointer NewByCurveName(int nid); + + private: + DeleteFnPtr<EC_GROUP, EC_GROUP_free> group_; +}; + +class ECPointPointer final { + public: + ECPointPointer(); + explicit ECPointPointer(EC_POINT* point); + ECPointPointer(ECPointPointer&& other) noexcept; + ECPointPointer& operator=(ECPointPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(ECPointPointer) + ~ECPointPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return point_ == nullptr; } + inline operator bool() const { return point_ != nullptr; } + inline EC_POINT* get() const { return point_.get(); } + inline operator EC_POINT*() const { return point_.get(); } + void reset(EC_POINT* point = nullptr); + EC_POINT* release(); + + bool setFromBuffer(const Buffer<const unsigned char>& buffer, + const EC_GROUP* group); + bool mul(const EC_GROUP* group, const BIGNUM* priv_key); + + static ECPointPointer New(const EC_GROUP* group); + + private: + DeleteFnPtr<EC_POINT, EC_POINT_free> point_; +}; + +class ECKeyPointer final { + public: + ECKeyPointer(); + explicit ECKeyPointer(EC_KEY* key); + ECKeyPointer(ECKeyPointer&& other) noexcept; + ECKeyPointer& operator=(ECKeyPointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(ECKeyPointer) + ~ECKeyPointer(); + + inline bool operator==(std::nullptr_t) noexcept { return key_ == nullptr; } + inline operator bool() const { return key_ != nullptr; } + inline EC_KEY* get() const { return key_.get(); } + inline operator EC_KEY*() const { return key_.get(); } + void reset(EC_KEY* key = nullptr); + EC_KEY* release(); + + ECKeyPointer clone() const; + bool setPrivateKey(const BignumPointer& priv); + bool setPublicKey(const ECPointPointer& pub); + bool setPublicKeyRaw(const BignumPointer& x, const BignumPointer& y); + bool generate(); + bool checkKey() const; + + const EC_GROUP* getGroup() const; + const BIGNUM* getPrivateKey() const; + const EC_POINT* getPublicKey() const; + + static ECKeyPointer New(const EC_GROUP* group); + static ECKeyPointer NewByCurveName(int nid); + + static const EC_POINT* GetPublicKey(const EC_KEY* key); + static const BIGNUM* GetPrivateKey(const EC_KEY* key); + static const EC_GROUP* GetGroup(const EC_KEY* key); + static int GetGroupName(const EC_KEY* key); + static bool Check(const EC_KEY* key); + + private: + DeleteFnPtr<EC_KEY, EC_KEY_free> key_; +}; + +#ifndef OPENSSL_NO_ENGINE +class EnginePointer final { + public: + EnginePointer() = default; + + explicit EnginePointer(ENGINE* engine_, bool finish_on_exit = false); + EnginePointer(EnginePointer&& other) noexcept; + EnginePointer& operator=(EnginePointer&& other) noexcept; + NCRYPTO_DISALLOW_COPY(EnginePointer) + ~EnginePointer(); + + inline operator bool() const { return engine != nullptr; } + inline ENGINE* get() { return engine; } + inline void setFinishOnExit() { finish_on_exit = true; } + + void reset(ENGINE* engine_ = nullptr, bool finish_on_exit_ = false); + + bool setAsDefault(uint32_t flags, CryptoErrorList* errors = nullptr); + bool init(bool finish_on_exit = false); + EVPKeyPointer loadPrivateKey(const std::string_view key_name); + + // Release ownership of the ENGINE* pointer. + ENGINE* release(); + + // Retrieve an OpenSSL Engine instance by name. If the name does not + // identify a valid named engine, the returned EnginePointer will be + // empty. + static EnginePointer getEngineByName(const std::string_view name, + CryptoErrorList* errors = nullptr); + + // Call once when initializing OpenSSL at startup for the process. + static void initEnginesOnce(); + + private: + ENGINE* engine = nullptr; + bool finish_on_exit = false; +}; +#endif // !OPENSSL_NO_ENGINE + +// ============================================================================ +// FIPS +bool isFipsEnabled(); + +bool setFipsEnabled(bool enabled, CryptoErrorList* errors); + +bool testFipsEnabled(); + +// ============================================================================ +// Various utilities + +bool CSPRNG(void* buffer, size_t length) NCRYPTO_MUST_USE_RESULT; + +// This callback is used to avoid the default passphrase callback in OpenSSL +// which will typically prompt for the passphrase. The prompting is designed +// for the OpenSSL CLI, but works poorly for some environments like Node.js +// because it involves synchronous interaction with the controlling terminal, +// something we never want, and use this function to avoid it. +int NoPasswordCallback(char* buf, int size, int rwflag, void* u); + +int PasswordCallback(char* buf, int size, int rwflag, void* u); + +bool SafeX509SubjectAltNamePrint(const BIOPointer& out, X509_EXTENSION* ext); +bool SafeX509InfoAccessPrint(const BIOPointer& out, X509_EXTENSION* ext); + +// ============================================================================ +// SPKAC + +bool VerifySpkac(const char* input, size_t length); +BIOPointer ExportPublicKey(const char* input, size_t length); + +// The caller takes ownership of the returned Buffer<char> +Buffer<char> ExportChallenge(const char* input, size_t length); + +// ============================================================================ +// KDF + +const EVP_MD* getDigestByName(const std::string_view name); + +// Verify that the specified HKDF output length is valid for the given digest. +// The maximum length for HKDF output for a given digest is 255 times the +// hash size for the given digest algorithm. +bool checkHkdfLength(const EVP_MD* md, size_t length); + +DataPointer hkdf(const EVP_MD* md, + const Buffer<const unsigned char>& key, + const Buffer<const unsigned char>& info, + const Buffer<const unsigned char>& salt, + size_t length); + +bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem); + +DataPointer scrypt(const Buffer<const char>& pass, + const Buffer<const unsigned char>& salt, + uint64_t N, + uint64_t r, + uint64_t p, + uint64_t maxmem, + size_t length); + +DataPointer pbkdf2(const EVP_MD* md, + const Buffer<const char>& pass, + const Buffer<const unsigned char>& salt, + uint32_t iterations, + size_t length); + +// ============================================================================ +// Version metadata +#define NCRYPTO_VERSION "0.0.1" + +enum { + NCRYPTO_VERSION_MAJOR = 0, + NCRYPTO_VERSION_MINOR = 0, + NCRYPTO_VERSION_REVISION = 1, +}; + +} // namespace ncrypto diff --git a/deps/ncrypto/unofficial.gni b/deps/ncrypto/unofficial.gni new file mode 100644 index 00000000000000..7cb27d22b9b8e0 --- /dev/null +++ b/deps/ncrypto/unofficial.gni @@ -0,0 +1,32 @@ +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please edit the gyp files if you are making changes to build system. + +import("../../node.gni") +import("$node_v8_path/gni/v8.gni") + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("ncrypto_gn_build") { + config("ncrypto_config") { + include_dirs = [ "." ] + cflags = [ + "-Wno-deprecated-declarations", + "-Wno-pessimizing-move", + "-Wno-shadow", + "-Wno-unused-variable", + ] + } + + gypi_values = exec_script("../../tools/gypi_to_gn.py", + [ rebase_path("ncrypto.gyp") ], + "scope", + [ "ncrypto.gyp" ]) + + source_set(target_name) { + forward_variables_from(invoker, "*") + public_configs = [ ":ncrypto_config" ] + sources = gypi_values.ncrypto_sources + deps = [ "$node_openssl_path" ] + } +} diff --git a/deps/nghttp2/lib/CMakeLists.txt b/deps/nghttp2/lib/CMakeLists.txt index 211c8e4340da12..fda8dcb7fc7f2a 100644 --- a/deps/nghttp2/lib/CMakeLists.txt +++ b/deps/nghttp2/lib/CMakeLists.txt @@ -34,6 +34,10 @@ set(NGHTTP2_RES "") set(STATIC_LIB "nghttp2_static") set(SHARED_LIB "nghttp2") +if(BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS AND MSVC AND NOT STATIC_LIB_SUFFIX) + set(STATIC_LIB_SUFFIX "_static") +endif() + if(WIN32) configure_file( version.rc.in @@ -66,23 +70,23 @@ if(BUILD_SHARED_LIBS) endif() # Static library (for unittests because of symbol visibility) -add_library(${STATIC_LIB} STATIC ${NGHTTP2_SOURCES}) +if(BUILD_STATIC_LIBS) + add_library(${STATIC_LIB} STATIC ${NGHTTP2_SOURCES}) -set_target_properties(${STATIC_LIB} PROPERTIES - COMPILE_FLAGS "${WARNCFLAGS}" - VERSION ${LT_VERSION} SOVERSION ${LT_SOVERSION} - ARCHIVE_OUTPUT_NAME nghttp2${STATIC_LIB_SUFFIX} -) + set_target_properties(${STATIC_LIB} PROPERTIES + COMPILE_FLAGS "${WARNCFLAGS}" + VERSION ${LT_VERSION} SOVERSION ${LT_SOVERSION} + ARCHIVE_OUTPUT_NAME nghttp2${STATIC_LIB_SUFFIX} + ) -target_include_directories(${STATIC_LIB} INTERFACE - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes> - $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/includes> - $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> -) + target_include_directories(${STATIC_LIB} INTERFACE + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes> + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/includes> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> + ) -target_compile_definitions(${STATIC_LIB} PUBLIC "-DNGHTTP2_STATICLIB") + target_compile_definitions(${STATIC_LIB} PUBLIC "-DNGHTTP2_STATICLIB") -if(BUILD_STATIC_LIBS) install(TARGETS ${STATIC_LIB} EXPORT ${EXPORT_SET}) list(APPEND nghttp2_exports ${STATIC_LIB}) endif() diff --git a/deps/nghttp2/lib/Makefile.in b/deps/nghttp2/lib/Makefile.in index 53ca2403de3552..14686ef14b1a4f 100644 --- a/deps/nghttp2/lib/Makefile.in +++ b/deps/nghttp2/lib/Makefile.in @@ -329,7 +329,7 @@ EXTRA_DEFS = @EXTRA_DEFS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ -HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX20 = @HAVE_CXX20@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -362,6 +362,8 @@ LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS = @LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_LIBS = @LIBNGTCP2_CRYPTO_BORINGSSL_LIBS@ LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS = @LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS@ LIBNGTCP2_CRYPTO_QUICTLS_LIBS = @LIBNGTCP2_CRYPTO_QUICTLS_LIBS@ +LIBNGTCP2_CRYPTO_WOLFSSL_CFLAGS = @LIBNGTCP2_CRYPTO_WOLFSSL_CFLAGS@ +LIBNGTCP2_CRYPTO_WOLFSSL_LIBS = @LIBNGTCP2_CRYPTO_WOLFSSL_LIBS@ LIBNGTCP2_LIBS = @LIBNGTCP2_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ @@ -415,6 +417,8 @@ TESTLDADD = @TESTLDADD@ VERSION = @VERSION@ WARNCFLAGS = @WARNCFLAGS@ WARNCXXFLAGS = @WARNCXXFLAGS@ +WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ +WOLFSSL_LIBS = @WOLFSSL_LIBS@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ diff --git a/deps/nghttp2/lib/includes/Makefile.in b/deps/nghttp2/lib/includes/Makefile.in index eaab6b209030c5..778dcb874c926b 100644 --- a/deps/nghttp2/lib/includes/Makefile.in +++ b/deps/nghttp2/lib/includes/Makefile.in @@ -234,7 +234,7 @@ EXTRA_DEFS = @EXTRA_DEFS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ -HAVE_CXX14 = @HAVE_CXX14@ +HAVE_CXX20 = @HAVE_CXX20@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -267,6 +267,8 @@ LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS = @LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_LIBS = @LIBNGTCP2_CRYPTO_BORINGSSL_LIBS@ LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS = @LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS@ LIBNGTCP2_CRYPTO_QUICTLS_LIBS = @LIBNGTCP2_CRYPTO_QUICTLS_LIBS@ +LIBNGTCP2_CRYPTO_WOLFSSL_CFLAGS = @LIBNGTCP2_CRYPTO_WOLFSSL_CFLAGS@ +LIBNGTCP2_CRYPTO_WOLFSSL_LIBS = @LIBNGTCP2_CRYPTO_WOLFSSL_LIBS@ LIBNGTCP2_LIBS = @LIBNGTCP2_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ @@ -320,6 +322,8 @@ TESTLDADD = @TESTLDADD@ VERSION = @VERSION@ WARNCFLAGS = @WARNCFLAGS@ WARNCXXFLAGS = @WARNCXXFLAGS@ +WOLFSSL_CFLAGS = @WOLFSSL_CFLAGS@ +WOLFSSL_LIBS = @WOLFSSL_LIBS@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h index 889176097dd31d..2ef49b8d68f4ed 100644 --- a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h +++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h @@ -57,8 +57,8 @@ extern "C" { #ifdef NGHTTP2_STATICLIB # define NGHTTP2_EXTERN -#elif defined(WIN32) || (__has_declspec_attribute(dllexport) && \ - __has_declspec_attribute(dllimport)) +#elif defined(WIN32) || \ + (__has_declspec_attribute(dllexport) && __has_declspec_attribute(dllimport)) # ifdef BUILDING_NGHTTP2 # define NGHTTP2_EXTERN __declspec(dllexport) # else /* !BUILDING_NGHTTP2 */ @@ -72,6 +72,10 @@ extern "C" { # endif /* !BUILDING_NGHTTP2 */ #endif /* !defined(WIN32) */ +#ifdef BUILDING_NGHTTP2 +# undef NGHTTP2_NO_SSIZE_T +#endif /* BUILDING_NGHTTP2 */ + /** * @typedef * @@ -466,7 +470,12 @@ typedef enum { * exhaustion on server side to send these frames forever and does * not read network. */ - NGHTTP2_ERR_FLOODED = -904 + NGHTTP2_ERR_FLOODED = -904, + /** + * When a local endpoint receives too many CONTINUATION frames + * following a HEADER frame. + */ + NGHTTP2_ERR_TOO_MANY_CONTINUATIONS = -905, } nghttp2_error; /** @@ -968,8 +977,8 @@ typedef enum { * signal the entire session failure. */ typedef ssize_t (*nghttp2_data_source_read_callback)( - nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, - uint32_t *data_flags, nghttp2_data_source *source, void *user_data); + nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, + uint32_t *data_flags, nghttp2_data_source *source, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -1037,8 +1046,8 @@ typedef ssize_t (*nghttp2_data_source_read_callback)( * signal the entire session failure. */ typedef nghttp2_ssize (*nghttp2_data_source_read_callback2)( - nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, - uint32_t *data_flags, nghttp2_data_source *source, void *user_data); + nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, + uint32_t *data_flags, nghttp2_data_source *source, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -1699,8 +1708,8 @@ typedef int (*nghttp2_on_frame_recv_callback)(nghttp2_session *session, * `nghttp2_session_callbacks_set_on_invalid_frame_recv_callback()`. */ typedef int (*nghttp2_on_invalid_frame_recv_callback)( - nghttp2_session *session, const nghttp2_frame *frame, int lib_error_code, - void *user_data); + nghttp2_session *session, const nghttp2_frame *frame, int lib_error_code, + void *user_data); /** * @functypedef @@ -2060,9 +2069,9 @@ typedef int (*nghttp2_on_header_callback2)(nghttp2_session *session, * not reset. */ typedef int (*nghttp2_on_invalid_header_callback)( - nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name, - size_t namelen, const uint8_t *value, size_t valuelen, uint8_t flags, - void *user_data); + nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name, + size_t namelen, const uint8_t *value, size_t valuelen, uint8_t flags, + void *user_data); /** * @functypedef @@ -2093,8 +2102,8 @@ typedef int (*nghttp2_on_invalid_header_callback)( * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. */ typedef int (*nghttp2_on_invalid_header_callback2)( - nghttp2_session *session, const nghttp2_frame *frame, nghttp2_rcbuf *name, - nghttp2_rcbuf *value, uint8_t flags, void *user_data); + nghttp2_session *session, const nghttp2_frame *frame, nghttp2_rcbuf *name, + nghttp2_rcbuf *value, uint8_t flags, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2146,8 +2155,8 @@ typedef ssize_t (*nghttp2_select_padding_callback)(nghttp2_session *session, * `nghttp2_session_callbacks_set_select_padding_callback2()`. */ typedef nghttp2_ssize (*nghttp2_select_padding_callback2)( - nghttp2_session *session, const nghttp2_frame *frame, size_t max_payloadlen, - void *user_data); + nghttp2_session *session, const nghttp2_frame *frame, size_t max_payloadlen, + void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2181,9 +2190,9 @@ typedef nghttp2_ssize (*nghttp2_select_padding_callback2)( * `nghttp2_session_callbacks_set_data_source_read_length_callback()`. */ typedef ssize_t (*nghttp2_data_source_read_length_callback)( - nghttp2_session *session, uint8_t frame_type, int32_t stream_id, - int32_t session_remote_window_size, int32_t stream_remote_window_size, - uint32_t remote_max_frame_size, void *user_data); + nghttp2_session *session, uint8_t frame_type, int32_t stream_id, + int32_t session_remote_window_size, int32_t stream_remote_window_size, + uint32_t remote_max_frame_size, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2213,9 +2222,9 @@ typedef ssize_t (*nghttp2_data_source_read_length_callback)( * `nghttp2_session_callbacks_set_data_source_read_length_callback2()`. */ typedef nghttp2_ssize (*nghttp2_data_source_read_length_callback2)( - nghttp2_session *session, uint8_t frame_type, int32_t stream_id, - int32_t session_remote_window_size, int32_t stream_remote_window_size, - uint32_t remote_max_frame_size, void *user_data); + nghttp2_session *session, uint8_t frame_type, int32_t stream_id, + int32_t session_remote_window_size, int32_t stream_remote_window_size, + uint32_t remote_max_frame_size, void *user_data); /** * @functypedef @@ -2265,8 +2274,8 @@ typedef int (*nghttp2_on_begin_frame_callback)(nghttp2_session *session, * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef int (*nghttp2_on_extension_chunk_recv_callback)( - nghttp2_session *session, const nghttp2_frame_hd *hd, const uint8_t *data, - size_t len, void *user_data); + nghttp2_session *session, const nghttp2_frame_hd *hd, const uint8_t *data, + size_t len, void *user_data); /** * @functypedef @@ -2377,8 +2386,8 @@ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session, * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef nghttp2_ssize (*nghttp2_pack_extension_callback2)( - nghttp2_session *session, uint8_t *buf, size_t len, - const nghttp2_frame *frame, void *user_data); + nghttp2_session *session, uint8_t *buf, size_t len, + const nghttp2_frame *frame, void *user_data); /** * @functypedef @@ -2490,7 +2499,7 @@ nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks); * transmit. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback( - nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback); + nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2503,7 +2512,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback( * transmit. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback2( - nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback); + nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2520,7 +2529,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback2( * received data. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback( - nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback); + nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2533,7 +2542,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback( * received data. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback2( - nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback); + nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback); /** * @function @@ -2542,8 +2551,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback2( * `nghttp2_session_mem_recv2()` when a frame is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_recv_callback on_frame_recv_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_recv_callback on_frame_recv_callback); /** * @function @@ -2554,8 +2563,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_recv_callback( */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_frame_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback); /** * @function @@ -2564,8 +2573,8 @@ nghttp2_session_callbacks_set_on_invalid_frame_recv_callback( * is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_data_chunk_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback); /** * @function @@ -2573,8 +2582,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_data_chunk_recv_callback( * Sets callback function invoked before a non-DATA frame is sent. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_before_frame_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_before_frame_send_callback before_frame_send_callback); + nghttp2_session_callbacks *cbs, + nghttp2_before_frame_send_callback before_frame_send_callback); /** * @function @@ -2582,8 +2591,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_before_frame_send_callback( * Sets callback function invoked after a frame is sent. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_send_callback on_frame_send_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_send_callback on_frame_send_callback); /** * @function @@ -2592,8 +2601,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_send_callback( * because of an error. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_not_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_not_send_callback on_frame_not_send_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_not_send_callback on_frame_not_send_callback); /** * @function @@ -2601,8 +2610,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_not_send_callback( * Sets callback function invoked when the stream is closed. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_stream_close_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_stream_close_callback on_stream_close_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_stream_close_callback on_stream_close_callback); /** * @function @@ -2611,8 +2620,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_stream_close_callback( * in HEADERS or PUSH_PROMISE is started. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_headers_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_begin_headers_callback on_begin_headers_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_begin_headers_callback on_begin_headers_callback); /** * @function @@ -2624,8 +2633,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_headers_callback( * set callbacks, the latter has the precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_header_callback on_header_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_header_callback on_header_callback); /** * @function @@ -2634,8 +2643,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback( * received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_on_header_callback2 on_header_callback2); + nghttp2_session_callbacks *cbs, + nghttp2_on_header_callback2 on_header_callback2); /** * @function @@ -2647,8 +2656,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback2( * used to set callbacks, the latter takes the precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_header_callback on_invalid_header_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_header_callback on_invalid_header_callback); /** * @function @@ -2657,8 +2666,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback( * pair is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_header_callback2 on_invalid_header_callback2); + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_header_callback2 on_invalid_header_callback2); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2675,8 +2684,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback2( * given frame. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback( - nghttp2_session_callbacks *cbs, - nghttp2_select_padding_callback select_padding_callback); + nghttp2_session_callbacks *cbs, + nghttp2_select_padding_callback select_padding_callback); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2688,8 +2697,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback( * given frame. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_select_padding_callback2 select_padding_callback); + nghttp2_session_callbacks *cbs, + nghttp2_select_padding_callback2 select_padding_callback); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2706,8 +2715,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback2( */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_data_source_read_length_callback( - nghttp2_session_callbacks *cbs, - nghttp2_data_source_read_length_callback data_source_read_length_callback); + nghttp2_session_callbacks *cbs, + nghttp2_data_source_read_length_callback data_source_read_length_callback); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2719,8 +2728,8 @@ nghttp2_session_callbacks_set_data_source_read_length_callback( */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_data_source_read_length_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_data_source_read_length_callback2 data_source_read_length_callback); + nghttp2_session_callbacks *cbs, + nghttp2_data_source_read_length_callback2 data_source_read_length_callback); /** * @function @@ -2728,8 +2737,8 @@ nghttp2_session_callbacks_set_data_source_read_length_callback2( * Sets callback function invoked when a frame header is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_frame_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_begin_frame_callback on_begin_frame_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_begin_frame_callback on_begin_frame_callback); /** * @function @@ -2739,8 +2748,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_frame_callback( * :type:`nghttp2_data_source_read_callback2` to avoid data copy. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_data_callback( - nghttp2_session_callbacks *cbs, - nghttp2_send_data_callback send_data_callback); + nghttp2_session_callbacks *cbs, + nghttp2_send_data_callback send_data_callback); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -2756,8 +2765,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_data_callback( * application to pack extension frame payload in wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback( - nghttp2_session_callbacks *cbs, - nghttp2_pack_extension_callback pack_extension_callback); + nghttp2_session_callbacks *cbs, + nghttp2_pack_extension_callback pack_extension_callback); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -2768,8 +2777,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback( * application to pack extension frame payload in wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_pack_extension_callback2 pack_extension_callback); + nghttp2_session_callbacks *cbs, + nghttp2_pack_extension_callback2 pack_extension_callback); /** * @function @@ -2778,8 +2787,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback2( * application to unpack extension frame payload from wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_unpack_extension_callback( - nghttp2_session_callbacks *cbs, - nghttp2_unpack_extension_callback unpack_extension_callback); + nghttp2_session_callbacks *cbs, + nghttp2_unpack_extension_callback unpack_extension_callback); /** * @function @@ -2789,8 +2798,8 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_unpack_extension_callback( */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_extension_chunk_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback); + nghttp2_session_callbacks *cbs, + nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback); /** * @function @@ -2809,7 +2818,7 @@ nghttp2_session_callbacks_set_on_extension_chunk_recv_callback( * precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback( - nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback); + nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback); /** * @function @@ -2822,7 +2831,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback( * precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback2( - nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2); + nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2); /** * @functypedef @@ -3186,7 +3195,7 @@ nghttp2_option_set_server_fallback_rfc7540_priorities(nghttp2_option *option, */ NGHTTP2_EXTERN void nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation( - nghttp2_option *option, int val); + nghttp2_option *option, int val); /** * @function @@ -3205,6 +3214,17 @@ NGHTTP2_EXTERN void nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option, uint64_t burst, uint64_t rate); +/** + * @function + * + * This function sets the maximum number of CONTINUATION frames + * following an incoming HEADER frame. If more than those frames are + * received, the remote endpoint is considered to be misbehaving and + * session will be closed. The default value is 8. + */ +NGHTTP2_EXTERN void nghttp2_option_set_max_continuations(nghttp2_option *option, + size_t val); + /** * @function * @@ -3331,8 +3351,8 @@ nghttp2_session_server_new2(nghttp2_session **session_ptr, * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_client_new3( - nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, - void *user_data, const nghttp2_option *option, nghttp2_mem *mem); + nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, + void *user_data, const nghttp2_option *option, nghttp2_mem *mem); /** * @function @@ -3356,8 +3376,8 @@ NGHTTP2_EXTERN int nghttp2_session_client_new3( * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_server_new3( - nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, - void *user_data, const nghttp2_option *option, nghttp2_mem *mem); + nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, + void *user_data, const nghttp2_option *option, nghttp2_mem *mem); /** * @function @@ -3787,7 +3807,7 @@ nghttp2_session_get_outbound_queue_size(nghttp2_session *session); * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_recv_data_length( - nghttp2_session *session, int32_t stream_id); + nghttp2_session *session, int32_t stream_id); /** * @function @@ -3807,7 +3827,7 @@ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_recv_data_length( * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_local_window_size( - nghttp2_session *session, int32_t stream_id); + nghttp2_session *session, int32_t stream_id); /** * @function @@ -3822,7 +3842,7 @@ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_local_window_size( * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_local_window_size( - nghttp2_session *session, int32_t stream_id); + nghttp2_session *session, int32_t stream_id); /** * @function @@ -3890,7 +3910,7 @@ nghttp2_session_get_local_window_size(nghttp2_session *session); * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_remote_window_size( - nghttp2_session *session, int32_t stream_id); + nghttp2_session *session, int32_t stream_id); /** * @function @@ -4044,7 +4064,7 @@ NGHTTP2_EXTERN int nghttp2_submit_shutdown_notice(nghttp2_session *session); * :enum:`nghttp2_settings_id`. */ NGHTTP2_EXTERN uint32_t nghttp2_session_get_remote_settings( - nghttp2_session *session, nghttp2_settings_id id); + nghttp2_session *session, nghttp2_settings_id id); /** * @function @@ -4054,7 +4074,7 @@ NGHTTP2_EXTERN uint32_t nghttp2_session_get_remote_settings( * in :enum:`nghttp2_settings_id`. */ NGHTTP2_EXTERN uint32_t nghttp2_session_get_local_settings( - nghttp2_session *session, nghttp2_settings_id id); + nghttp2_session *session, nghttp2_settings_id id); /** * @function @@ -4379,7 +4399,7 @@ NGHTTP2_EXTERN int nghttp2_session_upgrade2(nghttp2_session *session, * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN ssize_t nghttp2_pack_settings_payload( - uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); + uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -4405,7 +4425,7 @@ NGHTTP2_EXTERN ssize_t nghttp2_pack_settings_payload( * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_pack_settings_payload2( - uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); + uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); /** * @function @@ -4563,9 +4583,9 @@ nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec); * */ NGHTTP2_EXTERN int32_t nghttp2_submit_request( - nghttp2_session *session, const nghttp2_priority_spec *pri_spec, - const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd, - void *stream_user_data); + nghttp2_session *session, const nghttp2_priority_spec *pri_spec, + const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd, + void *stream_user_data); #endif /* NGHTTP2_NO_SSIZE_T */ @@ -4654,9 +4674,9 @@ NGHTTP2_EXTERN int32_t nghttp2_submit_request( * */ NGHTTP2_EXTERN int32_t nghttp2_submit_request2( - nghttp2_session *session, const nghttp2_priority_spec *pri_spec, - const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider2 *data_prd, - void *stream_user_data); + nghttp2_session *session, const nghttp2_priority_spec *pri_spec, + const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider2 *data_prd, + void *stream_user_data); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -4955,9 +4975,9 @@ NGHTTP2_EXTERN int nghttp2_submit_trailer(nghttp2_session *session, * */ NGHTTP2_EXTERN int32_t nghttp2_submit_headers( - nghttp2_session *session, uint8_t flags, int32_t stream_id, - const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, - void *stream_user_data); + nghttp2_session *session, uint8_t flags, int32_t stream_id, + const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, + void *stream_user_data); #ifndef NGHTTP2_NO_SSIZE_T /** @@ -5288,8 +5308,8 @@ NGHTTP2_EXTERN int nghttp2_submit_settings(nghttp2_session *session, * */ NGHTTP2_EXTERN int32_t nghttp2_submit_push_promise( - nghttp2_session *session, uint8_t flags, int32_t stream_id, - const nghttp2_nv *nva, size_t nvlen, void *promised_stream_user_data); + nghttp2_session *session, uint8_t flags, int32_t stream_id, + const nghttp2_nv *nva, size_t nvlen, void *promised_stream_user_data); /** * @function @@ -5782,8 +5802,8 @@ NGHTTP2_EXTERN int nghttp2_submit_priority_update(nghttp2_session *session, * found. */ NGHTTP2_EXTERN int nghttp2_session_change_extpri_stream_priority( - nghttp2_session *session, int32_t stream_id, const nghttp2_extpri *extpri, - int ignore_client_signal); + nghttp2_session *session, int32_t stream_id, const nghttp2_extpri *extpri, + int ignore_client_signal); /** * @function @@ -5811,7 +5831,7 @@ NGHTTP2_EXTERN int nghttp2_session_change_extpri_stream_priority( * found. */ NGHTTP2_EXTERN int nghttp2_session_get_extpri_stream_priority( - nghttp2_session *session, nghttp2_extpri *extpri, int32_t stream_id); + nghttp2_session *session, nghttp2_extpri *extpri, int32_t stream_id); /** * @function @@ -6053,6 +6073,12 @@ NGHTTP2_EXTERN int nghttp2_check_path(const uint8_t *value, size_t len); * :authority or host header field is valid according to * https://tools.ietf.org/html/rfc3986#section-3.2 * + * Note that :authority and host field values are not authority. They + * do not include userinfo in RFC 3986, see + * https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2, that + * is, it does not include '@'. This function treats '@' as a valid + * character. + * * |value| is valid if it merely consists of the allowed characters. * In particular, it does not check whether |value| follows the syntax * of authority. @@ -6284,8 +6310,8 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd_vec(nghttp2_hd_deflater *deflater, * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_deflate_hd_vec2( - nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, size_t veclen, - const nghttp2_nv *nva, size_t nvlen); + nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, size_t veclen, + const nghttp2_nv *nva, size_t nvlen); /** * @function @@ -6708,8 +6734,8 @@ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater, * */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_inflate_hd3( - nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, - const uint8_t *in, size_t inlen, int in_final); + nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, + const uint8_t *in, size_t inlen, int in_final); /** * @function @@ -6982,7 +7008,7 @@ typedef void (*nghttp2_debug_vprintf_callback)(const char *format, * this is important. */ NGHTTP2_EXTERN void nghttp2_set_debug_vprintf_callback( - nghttp2_debug_vprintf_callback debug_vprintf_callback); + nghttp2_debug_vprintf_callback debug_vprintf_callback); #ifdef __cplusplus } diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h index d38b89adc6268a..827c99896846e3 100644 --- a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h +++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h @@ -29,7 +29,7 @@ * @macro * Version number of the nghttp2 library release */ -#define NGHTTP2_VERSION "1.60.0" +#define NGHTTP2_VERSION "1.64.0" /** * @macro @@ -37,6 +37,6 @@ * release. This is a 24 bit number with 8 bits for major number, 8 bits * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203. */ -#define NGHTTP2_VERSION_NUM 0x013c00 +#define NGHTTP2_VERSION_NUM 0x014000 #endif /* NGHTTP2VER_H */ diff --git a/deps/nghttp2/lib/nghttp2_buf.c b/deps/nghttp2/lib/nghttp2_buf.c index 101035f923ec64..15cd674a650fc0 100644 --- a/deps/nghttp2/lib/nghttp2_buf.c +++ b/deps/nghttp2/lib/nghttp2_buf.c @@ -61,7 +61,7 @@ int nghttp2_buf_reserve(nghttp2_buf *buf, size_t new_cap, nghttp2_mem *mem) { return 0; } - new_cap = nghttp2_max(new_cap, cap * 2); + new_cap = nghttp2_max_size(new_cap, cap * 2); ptr = nghttp2_mem_realloc(mem, buf->begin, new_cap); if (ptr == NULL) { @@ -343,7 +343,7 @@ int nghttp2_bufs_add(nghttp2_bufs *bufs, const void *data, size_t len) { while (len) { buf = &bufs->cur->buf; - nwrite = nghttp2_min(nghttp2_buf_avail(buf), len); + nwrite = nghttp2_min_size(nghttp2_buf_avail(buf), len); if (nwrite == 0) { rv = bufs_alloc_chain(bufs); if (rv != 0) { diff --git a/deps/nghttp2/lib/nghttp2_callbacks.c b/deps/nghttp2/lib/nghttp2_callbacks.c index 1776f7d276b79f..32fedd52d85a3f 100644 --- a/deps/nghttp2/lib/nghttp2_callbacks.c +++ b/deps/nghttp2/lib/nghttp2_callbacks.c @@ -41,163 +41,163 @@ void nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks) { } void nghttp2_session_callbacks_set_send_callback( - nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback) { + nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback) { cbs->send_callback = send_callback; } void nghttp2_session_callbacks_set_send_callback2( - nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback) { + nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback) { cbs->send_callback2 = send_callback; } void nghttp2_session_callbacks_set_recv_callback( - nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback) { + nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback) { cbs->recv_callback = recv_callback; } void nghttp2_session_callbacks_set_recv_callback2( - nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback) { + nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback) { cbs->recv_callback2 = recv_callback; } void nghttp2_session_callbacks_set_on_frame_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_recv_callback on_frame_recv_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_recv_callback on_frame_recv_callback) { cbs->on_frame_recv_callback = on_frame_recv_callback; } void nghttp2_session_callbacks_set_on_invalid_frame_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback) { cbs->on_invalid_frame_recv_callback = on_invalid_frame_recv_callback; } void nghttp2_session_callbacks_set_on_data_chunk_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback) { cbs->on_data_chunk_recv_callback = on_data_chunk_recv_callback; } void nghttp2_session_callbacks_set_before_frame_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_before_frame_send_callback before_frame_send_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_before_frame_send_callback before_frame_send_callback) { cbs->before_frame_send_callback = before_frame_send_callback; } void nghttp2_session_callbacks_set_on_frame_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_send_callback on_frame_send_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_send_callback on_frame_send_callback) { cbs->on_frame_send_callback = on_frame_send_callback; } void nghttp2_session_callbacks_set_on_frame_not_send_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_frame_not_send_callback on_frame_not_send_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_frame_not_send_callback on_frame_not_send_callback) { cbs->on_frame_not_send_callback = on_frame_not_send_callback; } void nghttp2_session_callbacks_set_on_stream_close_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_stream_close_callback on_stream_close_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_stream_close_callback on_stream_close_callback) { cbs->on_stream_close_callback = on_stream_close_callback; } void nghttp2_session_callbacks_set_on_begin_headers_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_begin_headers_callback on_begin_headers_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_begin_headers_callback on_begin_headers_callback) { cbs->on_begin_headers_callback = on_begin_headers_callback; } void nghttp2_session_callbacks_set_on_header_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_header_callback on_header_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_header_callback on_header_callback) { cbs->on_header_callback = on_header_callback; } void nghttp2_session_callbacks_set_on_header_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_on_header_callback2 on_header_callback2) { + nghttp2_session_callbacks *cbs, + nghttp2_on_header_callback2 on_header_callback2) { cbs->on_header_callback2 = on_header_callback2; } void nghttp2_session_callbacks_set_on_invalid_header_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_header_callback on_invalid_header_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_header_callback on_invalid_header_callback) { cbs->on_invalid_header_callback = on_invalid_header_callback; } void nghttp2_session_callbacks_set_on_invalid_header_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_on_invalid_header_callback2 on_invalid_header_callback2) { + nghttp2_session_callbacks *cbs, + nghttp2_on_invalid_header_callback2 on_invalid_header_callback2) { cbs->on_invalid_header_callback2 = on_invalid_header_callback2; } void nghttp2_session_callbacks_set_select_padding_callback( - nghttp2_session_callbacks *cbs, - nghttp2_select_padding_callback select_padding_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_select_padding_callback select_padding_callback) { cbs->select_padding_callback = select_padding_callback; } void nghttp2_session_callbacks_set_select_padding_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_select_padding_callback2 select_padding_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_select_padding_callback2 select_padding_callback) { cbs->select_padding_callback2 = select_padding_callback; } void nghttp2_session_callbacks_set_data_source_read_length_callback( - nghttp2_session_callbacks *cbs, - nghttp2_data_source_read_length_callback data_source_read_length_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_data_source_read_length_callback data_source_read_length_callback) { cbs->read_length_callback = data_source_read_length_callback; } void nghttp2_session_callbacks_set_data_source_read_length_callback2( - nghttp2_session_callbacks *cbs, nghttp2_data_source_read_length_callback2 - data_source_read_length_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_data_source_read_length_callback2 data_source_read_length_callback) { cbs->read_length_callback2 = data_source_read_length_callback; } void nghttp2_session_callbacks_set_on_begin_frame_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_begin_frame_callback on_begin_frame_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_begin_frame_callback on_begin_frame_callback) { cbs->on_begin_frame_callback = on_begin_frame_callback; } void nghttp2_session_callbacks_set_send_data_callback( - nghttp2_session_callbacks *cbs, - nghttp2_send_data_callback send_data_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_send_data_callback send_data_callback) { cbs->send_data_callback = send_data_callback; } void nghttp2_session_callbacks_set_pack_extension_callback( - nghttp2_session_callbacks *cbs, - nghttp2_pack_extension_callback pack_extension_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_pack_extension_callback pack_extension_callback) { cbs->pack_extension_callback = pack_extension_callback; } void nghttp2_session_callbacks_set_pack_extension_callback2( - nghttp2_session_callbacks *cbs, - nghttp2_pack_extension_callback2 pack_extension_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_pack_extension_callback2 pack_extension_callback) { cbs->pack_extension_callback2 = pack_extension_callback; } void nghttp2_session_callbacks_set_unpack_extension_callback( - nghttp2_session_callbacks *cbs, - nghttp2_unpack_extension_callback unpack_extension_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_unpack_extension_callback unpack_extension_callback) { cbs->unpack_extension_callback = unpack_extension_callback; } void nghttp2_session_callbacks_set_on_extension_chunk_recv_callback( - nghttp2_session_callbacks *cbs, - nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback) { + nghttp2_session_callbacks *cbs, + nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback) { cbs->on_extension_chunk_recv_callback = on_extension_chunk_recv_callback; } void nghttp2_session_callbacks_set_error_callback( - nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) { + nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) { cbs->error_callback = error_callback; } void nghttp2_session_callbacks_set_error_callback2( - nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) { + nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) { cbs->error_callback2 = error_callback2; } diff --git a/deps/nghttp2/lib/nghttp2_debug.c b/deps/nghttp2/lib/nghttp2_debug.c index cb2779700bd38b..09dd2b28587af5 100644 --- a/deps/nghttp2/lib/nghttp2_debug.c +++ b/deps/nghttp2/lib/nghttp2_debug.c @@ -34,7 +34,7 @@ static void nghttp2_default_debug_vfprintf_callback(const char *fmt, } static nghttp2_debug_vprintf_callback static_debug_vprintf_callback = - nghttp2_default_debug_vfprintf_callback; + nghttp2_default_debug_vfprintf_callback; void nghttp2_debug_vprintf(const char *format, ...) { if (static_debug_vprintf_callback) { @@ -46,14 +46,14 @@ void nghttp2_debug_vprintf(const char *format, ...) { } void nghttp2_set_debug_vprintf_callback( - nghttp2_debug_vprintf_callback debug_vprintf_callback) { + nghttp2_debug_vprintf_callback debug_vprintf_callback) { static_debug_vprintf_callback = debug_vprintf_callback; } #else /* !DEBUGBUILD */ void nghttp2_set_debug_vprintf_callback( - nghttp2_debug_vprintf_callback debug_vprintf_callback) { + nghttp2_debug_vprintf_callback debug_vprintf_callback) { (void)debug_vprintf_callback; } diff --git a/deps/nghttp2/lib/nghttp2_extpri.h b/deps/nghttp2/lib/nghttp2_extpri.h index 23c6ddc0c0539d..db911972084c72 100644 --- a/deps/nghttp2/lib/nghttp2_extpri.h +++ b/deps/nghttp2/lib/nghttp2_extpri.h @@ -60,6 +60,6 @@ void nghttp2_extpri_from_uint8(nghttp2_extpri *extpri, uint8_t u8extpri); * nghttp2_extpri_uint8_inc extracts inc from |PRI| which is supposed to * be constructed by nghttp2_extpri_to_uint8. */ -#define nghttp2_extpri_uint8_inc(PRI) (((PRI)&NGHTTP2_EXTPRI_INC_MASK) != 0) +#define nghttp2_extpri_uint8_inc(PRI) (((PRI) & NGHTTP2_EXTPRI_INC_MASK) != 0) #endif /* NGHTTP2_EXTPRI_H */ diff --git a/deps/nghttp2/lib/nghttp2_frame.c b/deps/nghttp2/lib/nghttp2_frame.c index 77cb463df5441f..edc2aaaae9ed75 100644 --- a/deps/nghttp2/lib/nghttp2_frame.c +++ b/deps/nghttp2/lib/nghttp2_frame.c @@ -492,7 +492,7 @@ int nghttp2_frame_pack_settings(nghttp2_bufs *bufs, nghttp2_settings *frame) { nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd); buf->last += - nghttp2_frame_pack_settings_payload(buf->last, frame->iv, frame->niv); + nghttp2_frame_pack_settings_payload(buf->last, frame->iv, frame->niv); return 0; } @@ -537,7 +537,7 @@ int nghttp2_frame_unpack_settings_payload2(nghttp2_settings_entry **iv_ptr, } *iv_ptr = - nghttp2_mem_malloc(mem, (*niv_ptr) * sizeof(nghttp2_settings_entry)); + nghttp2_mem_malloc(mem, (*niv_ptr) * sizeof(nghttp2_settings_entry)); if (*iv_ptr == NULL) { return NGHTTP2_ERR_NOMEM; @@ -589,7 +589,7 @@ int nghttp2_frame_pack_push_promise(nghttp2_bufs *bufs, void nghttp2_frame_unpack_push_promise_payload(nghttp2_push_promise *frame, const uint8_t *payload) { frame->promised_stream_id = - nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK; + nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK; frame->nva = NULL; frame->nvlen = 0; } @@ -608,7 +608,7 @@ void nghttp2_frame_pack_ping(nghttp2_bufs *bufs, nghttp2_ping *frame) { nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd); buf->last = - nghttp2_cpymem(buf->last, frame->opaque_data, sizeof(frame->opaque_data)); + nghttp2_cpymem(buf->last, frame->opaque_data, sizeof(frame->opaque_data)); } void nghttp2_frame_unpack_ping_payload(nghttp2_ping *frame, @@ -709,7 +709,7 @@ void nghttp2_frame_pack_window_update(nghttp2_bufs *bufs, void nghttp2_frame_unpack_window_update_payload(nghttp2_window_update *frame, const uint8_t *payload) { frame->window_size_increment = - nghttp2_get_uint32(payload) & NGHTTP2_WINDOW_SIZE_INCREMENT_MASK; + nghttp2_get_uint32(payload) & NGHTTP2_WINDOW_SIZE_INCREMENT_MASK; } void nghttp2_frame_pack_altsvc(nghttp2_bufs *bufs, nghttp2_extension *frame) { @@ -926,7 +926,7 @@ void nghttp2_frame_unpack_priority_update_payload(nghttp2_extension *frame, priority_update = frame->payload; priority_update->stream_id = - nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK; + nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK; if (payloadlen > 4) { priority_update->field_value = payload + 4; diff --git a/deps/nghttp2/lib/nghttp2_hd.c b/deps/nghttp2/lib/nghttp2_hd.c index 1b0c71331ae61f..55fc2cc6bfea3d 100644 --- a/deps/nghttp2/lib/nghttp2_hd.c +++ b/deps/nghttp2/lib/nghttp2_hd.c @@ -36,9 +36,10 @@ #define MAKE_STATIC_ENT(N, V, T, H) \ { \ {NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \ - {NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \ - {(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \ - T, H \ + {NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \ + {(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \ + T, \ + H, \ } /* Generated by mkstatictbl.py */ @@ -46,67 +47,67 @@ first enum value if same header names are repeated (e.g., :status). */ static const nghttp2_hd_static_entry static_table[] = { - MAKE_STATIC_ENT(":authority", "", 0, 3153725150u), - MAKE_STATIC_ENT(":method", "GET", 1, 695666056u), - MAKE_STATIC_ENT(":method", "POST", 1, 695666056u), - MAKE_STATIC_ENT(":path", "/", 3, 3292848686u), - MAKE_STATIC_ENT(":path", "/index.html", 3, 3292848686u), - MAKE_STATIC_ENT(":scheme", "http", 5, 2510477674u), - MAKE_STATIC_ENT(":scheme", "https", 5, 2510477674u), - MAKE_STATIC_ENT(":status", "200", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "204", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "206", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "304", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "400", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "404", 7, 4000288983u), - MAKE_STATIC_ENT(":status", "500", 7, 4000288983u), - MAKE_STATIC_ENT("accept-charset", "", 14, 3664010344u), - MAKE_STATIC_ENT("accept-encoding", "gzip, deflate", 15, 3379649177u), - MAKE_STATIC_ENT("accept-language", "", 16, 1979086614u), - MAKE_STATIC_ENT("accept-ranges", "", 17, 1713753958u), - MAKE_STATIC_ENT("accept", "", 18, 136609321u), - MAKE_STATIC_ENT("access-control-allow-origin", "", 19, 2710797292u), - MAKE_STATIC_ENT("age", "", 20, 742476188u), - MAKE_STATIC_ENT("allow", "", 21, 2930878514u), - MAKE_STATIC_ENT("authorization", "", 22, 2436257726u), - MAKE_STATIC_ENT("cache-control", "", 23, 1355326669u), - MAKE_STATIC_ENT("content-disposition", "", 24, 3889184348u), - MAKE_STATIC_ENT("content-encoding", "", 25, 65203592u), - MAKE_STATIC_ENT("content-language", "", 26, 24973587u), - MAKE_STATIC_ENT("content-length", "", 27, 1308181789u), - MAKE_STATIC_ENT("content-location", "", 28, 2302364718u), - MAKE_STATIC_ENT("content-range", "", 29, 3555523146u), - MAKE_STATIC_ENT("content-type", "", 30, 4244048277u), - MAKE_STATIC_ENT("cookie", "", 31, 2007449791u), - MAKE_STATIC_ENT("date", "", 32, 3564297305u), - MAKE_STATIC_ENT("etag", "", 33, 113792960u), - MAKE_STATIC_ENT("expect", "", 34, 2530896728u), - MAKE_STATIC_ENT("expires", "", 35, 1049544579u), - MAKE_STATIC_ENT("from", "", 36, 2513272949u), - MAKE_STATIC_ENT("host", "", 37, 2952701295u), - MAKE_STATIC_ENT("if-match", "", 38, 3597694698u), - MAKE_STATIC_ENT("if-modified-since", "", 39, 2213050793u), - MAKE_STATIC_ENT("if-none-match", "", 40, 2536202615u), - MAKE_STATIC_ENT("if-range", "", 41, 2340978238u), - MAKE_STATIC_ENT("if-unmodified-since", "", 42, 3794814858u), - MAKE_STATIC_ENT("last-modified", "", 43, 3226950251u), - MAKE_STATIC_ENT("link", "", 44, 232457833u), - MAKE_STATIC_ENT("location", "", 45, 200649126u), - MAKE_STATIC_ENT("max-forwards", "", 46, 1826162134u), - MAKE_STATIC_ENT("proxy-authenticate", "", 47, 2709445359u), - MAKE_STATIC_ENT("proxy-authorization", "", 48, 2686392507u), - MAKE_STATIC_ENT("range", "", 49, 4208725202u), - MAKE_STATIC_ENT("referer", "", 50, 3969579366u), - MAKE_STATIC_ENT("refresh", "", 51, 3572655668u), - MAKE_STATIC_ENT("retry-after", "", 52, 3336180598u), - MAKE_STATIC_ENT("server", "", 53, 1085029842u), - MAKE_STATIC_ENT("set-cookie", "", 54, 1848371000u), - MAKE_STATIC_ENT("strict-transport-security", "", 55, 4138147361u), - MAKE_STATIC_ENT("transfer-encoding", "", 56, 3719590988u), - MAKE_STATIC_ENT("user-agent", "", 57, 606444526u), - MAKE_STATIC_ENT("vary", "", 58, 1085005381u), - MAKE_STATIC_ENT("via", "", 59, 1762798611u), - MAKE_STATIC_ENT("www-authenticate", "", 60, 779865858u), + MAKE_STATIC_ENT(":authority", "", 0, 3153725150u), + MAKE_STATIC_ENT(":method", "GET", 1, 695666056u), + MAKE_STATIC_ENT(":method", "POST", 1, 695666056u), + MAKE_STATIC_ENT(":path", "/", 3, 3292848686u), + MAKE_STATIC_ENT(":path", "/index.html", 3, 3292848686u), + MAKE_STATIC_ENT(":scheme", "http", 5, 2510477674u), + MAKE_STATIC_ENT(":scheme", "https", 5, 2510477674u), + MAKE_STATIC_ENT(":status", "200", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "204", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "206", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "304", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "400", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "404", 7, 4000288983u), + MAKE_STATIC_ENT(":status", "500", 7, 4000288983u), + MAKE_STATIC_ENT("accept-charset", "", 14, 3664010344u), + MAKE_STATIC_ENT("accept-encoding", "gzip, deflate", 15, 3379649177u), + MAKE_STATIC_ENT("accept-language", "", 16, 1979086614u), + MAKE_STATIC_ENT("accept-ranges", "", 17, 1713753958u), + MAKE_STATIC_ENT("accept", "", 18, 136609321u), + MAKE_STATIC_ENT("access-control-allow-origin", "", 19, 2710797292u), + MAKE_STATIC_ENT("age", "", 20, 742476188u), + MAKE_STATIC_ENT("allow", "", 21, 2930878514u), + MAKE_STATIC_ENT("authorization", "", 22, 2436257726u), + MAKE_STATIC_ENT("cache-control", "", 23, 1355326669u), + MAKE_STATIC_ENT("content-disposition", "", 24, 3889184348u), + MAKE_STATIC_ENT("content-encoding", "", 25, 65203592u), + MAKE_STATIC_ENT("content-language", "", 26, 24973587u), + MAKE_STATIC_ENT("content-length", "", 27, 1308181789u), + MAKE_STATIC_ENT("content-location", "", 28, 2302364718u), + MAKE_STATIC_ENT("content-range", "", 29, 3555523146u), + MAKE_STATIC_ENT("content-type", "", 30, 4244048277u), + MAKE_STATIC_ENT("cookie", "", 31, 2007449791u), + MAKE_STATIC_ENT("date", "", 32, 3564297305u), + MAKE_STATIC_ENT("etag", "", 33, 113792960u), + MAKE_STATIC_ENT("expect", "", 34, 2530896728u), + MAKE_STATIC_ENT("expires", "", 35, 1049544579u), + MAKE_STATIC_ENT("from", "", 36, 2513272949u), + MAKE_STATIC_ENT("host", "", 37, 2952701295u), + MAKE_STATIC_ENT("if-match", "", 38, 3597694698u), + MAKE_STATIC_ENT("if-modified-since", "", 39, 2213050793u), + MAKE_STATIC_ENT("if-none-match", "", 40, 2536202615u), + MAKE_STATIC_ENT("if-range", "", 41, 2340978238u), + MAKE_STATIC_ENT("if-unmodified-since", "", 42, 3794814858u), + MAKE_STATIC_ENT("last-modified", "", 43, 3226950251u), + MAKE_STATIC_ENT("link", "", 44, 232457833u), + MAKE_STATIC_ENT("location", "", 45, 200649126u), + MAKE_STATIC_ENT("max-forwards", "", 46, 1826162134u), + MAKE_STATIC_ENT("proxy-authenticate", "", 47, 2709445359u), + MAKE_STATIC_ENT("proxy-authorization", "", 48, 2686392507u), + MAKE_STATIC_ENT("range", "", 49, 4208725202u), + MAKE_STATIC_ENT("referer", "", 50, 3969579366u), + MAKE_STATIC_ENT("refresh", "", 51, 3572655668u), + MAKE_STATIC_ENT("retry-after", "", 52, 3336180598u), + MAKE_STATIC_ENT("server", "", 53, 1085029842u), + MAKE_STATIC_ENT("set-cookie", "", 54, 1848371000u), + MAKE_STATIC_ENT("strict-transport-security", "", 55, 4138147361u), + MAKE_STATIC_ENT("transfer-encoding", "", 56, 3719590988u), + MAKE_STATIC_ENT("user-agent", "", 57, 606444526u), + MAKE_STATIC_ENT("vary", "", 58, 1085005381u), + MAKE_STATIC_ENT("via", "", 59, 1762798611u), + MAKE_STATIC_ENT("www-authenticate", "", 60, 779865858u), }; static int memeq(const void *s1, const void *s2, size_t n) { @@ -677,8 +678,8 @@ static int hd_context_init(nghttp2_hd_context *context, nghttp2_mem *mem) { context->bad = 0; context->hd_table_bufsize_max = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE; rv = hd_ringbuf_init( - &context->hd_table, - context->hd_table_bufsize_max / NGHTTP2_HD_ENTRY_OVERHEAD, mem); + &context->hd_table, + context->hd_table_bufsize_max / NGHTTP2_HD_ENTRY_OVERHEAD, mem); if (rv != 0) { return rv; } @@ -695,7 +696,7 @@ static void hd_context_free(nghttp2_hd_context *context) { int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater, nghttp2_mem *mem) { return nghttp2_hd_deflate_init2( - deflater, NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, mem); + deflater, NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, mem); } int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater, @@ -1077,8 +1078,8 @@ static int emit_newname_block(nghttp2_bufs *bufs, const nghttp2_nv *nv, int rv; DEBUGF( - "deflatehd: emit newname namelen=%zu, valuelen=%zu, indexing_mode=%d\n", - nv->namelen, nv->valuelen, indexing_mode); + "deflatehd: emit newname namelen=%zu, valuelen=%zu, indexing_mode=%d\n", + nv->namelen, nv->valuelen, indexing_mode); rv = nghttp2_bufs_addb(bufs, pack_first_byte(indexing_mode)); if (rv != 0) { @@ -1111,12 +1112,11 @@ static int add_hd_table_incremental(nghttp2_hd_context *context, while (context->hd_table_bufsize + room > context->hd_table_bufsize_max && context->hd_table.len > 0) { - size_t idx = context->hd_table.len - 1; nghttp2_hd_entry *ent = hd_ringbuf_get(&context->hd_table, idx); context->hd_table_bufsize -= - entry_room(ent->nv.name->len, ent->nv.value->len); + entry_room(ent->nv.name->len, ent->nv.value->len); DEBUGF("hpack: remove item from header table: %s: %s\n", (char *)ent->nv.name->base, (char *)ent->nv.value->base); @@ -1232,7 +1232,7 @@ static void hd_context_shrink_table_size(nghttp2_hd_context *context, size_t idx = context->hd_table.len - 1; nghttp2_hd_entry *ent = hd_ringbuf_get(&context->hd_table, idx); context->hd_table_bufsize -= - entry_room(ent->nv.name->len, ent->nv.value->len); + entry_room(ent->nv.name->len, ent->nv.value->len); hd_ringbuf_pop_back(&context->hd_table); if (map) { hd_map_remove(map, ent); @@ -1244,14 +1244,14 @@ static void hd_context_shrink_table_size(nghttp2_hd_context *context, } int nghttp2_hd_deflate_change_table_size( - nghttp2_hd_deflater *deflater, size_t settings_max_dynamic_table_size) { - size_t next_bufsize = nghttp2_min(settings_max_dynamic_table_size, - deflater->deflate_hd_table_bufsize_max); + nghttp2_hd_deflater *deflater, size_t settings_max_dynamic_table_size) { + size_t next_bufsize = nghttp2_min_size( + settings_max_dynamic_table_size, deflater->deflate_hd_table_bufsize_max); deflater->ctx.hd_table_bufsize_max = next_bufsize; deflater->min_hd_table_bufsize_max = - nghttp2_min(deflater->min_hd_table_bufsize_max, next_bufsize); + nghttp2_min_size(deflater->min_hd_table_bufsize_max, next_bufsize); deflater->notify_table_size_change = 1; @@ -1260,7 +1260,7 @@ int nghttp2_hd_deflate_change_table_size( } int nghttp2_hd_inflate_change_table_size( - nghttp2_hd_inflater *inflater, size_t settings_max_dynamic_table_size) { + nghttp2_hd_inflater *inflater, size_t settings_max_dynamic_table_size) { switch (inflater->state) { case NGHTTP2_HD_STATE_EXPECT_TABLE_SIZE: case NGHTTP2_HD_STATE_INFLATE_START: @@ -1303,7 +1303,7 @@ nghttp2_hd_nv nghttp2_hd_table_get(nghttp2_hd_context *context, size_t idx) { assert(INDEX_RANGE_VALID(context, idx)); if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) { return hd_ringbuf_get(&context->hd_table, idx - NGHTTP2_STATIC_TABLE_LENGTH) - ->nv; + ->nv; } else { const nghttp2_hd_static_entry *ent = &static_table[idx]; nghttp2_hd_nv nv = {(nghttp2_rcbuf *)&ent->name, @@ -1319,7 +1319,7 @@ static const nghttp2_nv *nghttp2_hd_table_get2(nghttp2_hd_context *context, if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) { return &hd_ringbuf_get(&context->hd_table, idx - NGHTTP2_STATIC_TABLE_LENGTH) - ->cnv; + ->cnv; } return &static_table[idx].cnv; @@ -1333,7 +1333,7 @@ static int hd_deflate_decide_indexing(nghttp2_hd_deflater *deflater, token == NGHTTP2_TOKEN_IF_NONE_MATCH || token == NGHTTP2_TOKEN_LOCATION || token == NGHTTP2_TOKEN_SET_COOKIE || entry_room(nv->namelen, nv->valuelen) > - deflater->ctx.hd_table_bufsize_max * 3 / 4) { + deflater->ctx.hd_table_bufsize_max * 3 / 4) { return NGHTTP2_HD_WITHOUT_INDEXING; } @@ -1366,12 +1366,11 @@ static int deflate_nv(nghttp2_hd_deflater *deflater, nghttp2_bufs *bufs, entropy secret data (e.g., id/password). Also cookie header field with less than 20 bytes value is also never indexed. This is the same criteria used in Firefox codebase. */ - indexing_mode = - token == NGHTTP2_TOKEN_AUTHORIZATION || - (token == NGHTTP2_TOKEN_COOKIE && nv->valuelen < 20) || - (nv->flags & NGHTTP2_NV_FLAG_NO_INDEX) - ? NGHTTP2_HD_NEVER_INDEXING - : hd_deflate_decide_indexing(deflater, nv, token); + indexing_mode = token == NGHTTP2_TOKEN_AUTHORIZATION || + (token == NGHTTP2_TOKEN_COOKIE && nv->valuelen < 20) || + (nv->flags & NGHTTP2_NV_FLAG_NO_INDEX) + ? NGHTTP2_HD_NEVER_INDEXING + : hd_deflate_decide_indexing(deflater, nv, token); res = search_hd_table(&deflater->ctx, nv, token, indexing_mode, &deflater->map, hash); @@ -1379,7 +1378,6 @@ static int deflate_nv(nghttp2_hd_deflater *deflater, nghttp2_bufs *bufs, idx = res.index; if (res.name_value_match) { - DEBUGF("deflatehd: name/value match index=%td\n", idx); rv = emit_indexed_block(bufs, (size_t)idx); @@ -1457,7 +1455,6 @@ int nghttp2_hd_deflate_hd_bufs(nghttp2_hd_deflater *deflater, deflater->min_hd_table_bufsize_max = UINT32_MAX; if (deflater->ctx.hd_table_bufsize_max > min_hd_table_bufsize_max) { - rv = emit_table_size(bufs, min_hd_table_bufsize_max); if (rv != 0) { @@ -1738,7 +1735,7 @@ static nghttp2_ssize hd_inflate_read_huff(nghttp2_hd_inflater *inflater, static nghttp2_ssize hd_inflate_read(nghttp2_hd_inflater *inflater, nghttp2_buf *buf, const uint8_t *in, const uint8_t *last) { - size_t len = nghttp2_min((size_t)(last - in), inflater->left); + size_t len = nghttp2_min_size((size_t)(last - in), inflater->left); buf->last = nghttp2_cpymem(buf->last, in, len); @@ -1961,9 +1958,9 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, case NGHTTP2_HD_STATE_READ_TABLE_SIZE: rfin = 0; rv = hd_inflate_read_len( - inflater, &rfin, in, last, 5, - nghttp2_min(inflater->min_hd_table_bufsize_max, - inflater->settings_hd_table_bufsize_max)); + inflater, &rfin, in, last, 5, + nghttp2_min_size(inflater->min_hd_table_bufsize_max, + inflater->settings_hd_table_bufsize_max)); if (rv < 0) { goto fail; } @@ -2050,8 +2047,8 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAMEHUFF; - rv = nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left * 2 + 1, - mem); + rv = + nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left * 2 + 1, mem); } else { inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAME; rv = nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left + 1, mem); @@ -2135,8 +2132,8 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, inflater->state = NGHTTP2_HD_STATE_READ_VALUEHUFF; - rv = nghttp2_rcbuf_new(&inflater->valuercbuf, inflater->left * 2 + 1, - mem); + rv = + nghttp2_rcbuf_new(&inflater->valuercbuf, inflater->left * 2 + 1, mem); } else { inflater->state = NGHTTP2_HD_STATE_READ_VALUE; @@ -2307,7 +2304,6 @@ void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater) { int nghttp2_hd_emit_indname_block(nghttp2_bufs *bufs, size_t idx, nghttp2_nv *nv, int indexing_mode) { - return emit_indname_block(bufs, idx, nv, indexing_mode); } diff --git a/deps/nghttp2/lib/nghttp2_hd_huffman.c b/deps/nghttp2/lib/nghttp2_hd_huffman.c index 959053f774eda3..de2620076a6e0d 100644 --- a/deps/nghttp2/lib/nghttp2_hd_huffman.c +++ b/deps/nghttp2/lib/nghttp2_hd_huffman.c @@ -94,7 +94,7 @@ int nghttp2_hd_huff_encode(nghttp2_bufs *bufs, const uint8_t *src, if (nbits) { rv = nghttp2_bufs_addb( - bufs, (uint8_t)((uint8_t)(code >> 56) | ((1 << (8 - nbits)) - 1))); + bufs, (uint8_t)((uint8_t)(code >> 56) | ((1 << (8 - nbits)) - 1))); if (rv != 0) { return rv; } @@ -116,7 +116,9 @@ nghttp2_ssize nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx, uint8_t c; /* We use the decoding algorithm described in - http://graphics.ics.uci.edu/pub/Prefix.pdf */ + - http://graphics.ics.uci.edu/pub/Prefix.pdf [!!! NO LONGER VALID !!!] + - https://ics.uci.edu/~dan/pubs/Prefix.pdf + - https://github.com/nghttp2/nghttp2/files/15141264/Prefix.pdf */ for (; src != end;) { c = *src++; t = &huff_decode_table[t->fstate & 0x1ff][c >> 4]; diff --git a/deps/nghttp2/lib/nghttp2_hd_huffman_data.c b/deps/nghttp2/lib/nghttp2_hd_huffman_data.c index 2e2e13f7bee0ff..c8f4a6fa266708 100644 --- a/deps/nghttp2/lib/nghttp2_hd_huffman_data.c +++ b/deps/nghttp2/lib/nghttp2_hd_huffman_data.c @@ -27,4954 +27,4954 @@ /* Generated by mkhufftbl.py */ const nghttp2_huff_sym huff_sym_table[] = { - {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, - {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, - {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, - {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, - {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, - {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, - {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, - {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, - {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, - {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, - {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, - {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, - {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, - {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, - {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, - {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, - {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, - {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, - {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, - {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, - {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, - {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, - {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, - {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, - {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, - {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, - {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, - {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, - {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, - {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, - {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, - {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, - {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, - {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, - {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, - {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, - {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, - {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, - {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, - {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, - {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, - {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, - {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, - {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, - {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, - {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, - {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, - {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, - {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, - {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, - {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, - {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, - {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, - {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, - {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, - {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, - {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, - {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, - {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, - {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, - {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, - {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, - {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, - {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, - {30, 0xfffffffcu}}; + {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, + {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, + {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, + {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, + {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, + {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, + {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, + {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, + {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, + {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, + {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, + {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, + {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, + {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, + {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, + {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, + {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, + {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, + {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, + {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, + {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, + {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, + {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, + {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, + {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, + {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, + {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, + {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, + {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, + {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, + {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, + {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, + {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, + {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, + {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, + {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, + {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, + {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, + {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, + {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, + {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, + {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, + {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, + {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, + {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, + {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, + {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, + {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, + {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, + {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, + {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, + {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, + {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, + {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, + {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, + {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, + {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, + {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, + {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, + {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, + {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, + {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, + {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, + {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, + {30, 0xfffffffcu}}; const nghttp2_huff_decode huff_decode_table[][16] = { - /* 0 */ - { - {0x04, 0}, - {0x05, 0}, - {0x07, 0}, - {0x08, 0}, - {0x0b, 0}, - {0x0c, 0}, - {0x10, 0}, - {0x13, 0}, - {0x19, 0}, - {0x1c, 0}, - {0x20, 0}, - {0x23, 0}, - {0x2a, 0}, - {0x31, 0}, - {0x39, 0}, - {0x4040, 0}, - }, - /* 1 */ - { - {0xc000, 48}, - {0xc000, 49}, - {0xc000, 50}, - {0xc000, 97}, - {0xc000, 99}, - {0xc000, 101}, - {0xc000, 105}, - {0xc000, 111}, - {0xc000, 115}, - {0xc000, 116}, - {0x0d, 0}, - {0x0e, 0}, - {0x11, 0}, - {0x12, 0}, - {0x14, 0}, - {0x15, 0}, - }, - /* 2 */ - { - {0x8001, 48}, - {0xc016, 48}, - {0x8001, 49}, - {0xc016, 49}, - {0x8001, 50}, - {0xc016, 50}, - {0x8001, 97}, - {0xc016, 97}, - {0x8001, 99}, - {0xc016, 99}, - {0x8001, 101}, - {0xc016, 101}, - {0x8001, 105}, - {0xc016, 105}, - {0x8001, 111}, - {0xc016, 111}, - }, - /* 3 */ - { - {0x8002, 48}, - {0x8009, 48}, - {0x8017, 48}, - {0xc028, 48}, - {0x8002, 49}, - {0x8009, 49}, - {0x8017, 49}, - {0xc028, 49}, - {0x8002, 50}, - {0x8009, 50}, - {0x8017, 50}, - {0xc028, 50}, - {0x8002, 97}, - {0x8009, 97}, - {0x8017, 97}, - {0xc028, 97}, - }, - /* 4 */ - { - {0x8003, 48}, - {0x8006, 48}, - {0x800a, 48}, - {0x800f, 48}, - {0x8018, 48}, - {0x801f, 48}, - {0x8029, 48}, - {0xc038, 48}, - {0x8003, 49}, - {0x8006, 49}, - {0x800a, 49}, - {0x800f, 49}, - {0x8018, 49}, - {0x801f, 49}, - {0x8029, 49}, - {0xc038, 49}, - }, - /* 5 */ - { - {0x8003, 50}, - {0x8006, 50}, - {0x800a, 50}, - {0x800f, 50}, - {0x8018, 50}, - {0x801f, 50}, - {0x8029, 50}, - {0xc038, 50}, - {0x8003, 97}, - {0x8006, 97}, - {0x800a, 97}, - {0x800f, 97}, - {0x8018, 97}, - {0x801f, 97}, - {0x8029, 97}, - {0xc038, 97}, - }, - /* 6 */ - { - {0x8002, 99}, - {0x8009, 99}, - {0x8017, 99}, - {0xc028, 99}, - {0x8002, 101}, - {0x8009, 101}, - {0x8017, 101}, - {0xc028, 101}, - {0x8002, 105}, - {0x8009, 105}, - {0x8017, 105}, - {0xc028, 105}, - {0x8002, 111}, - {0x8009, 111}, - {0x8017, 111}, - {0xc028, 111}, - }, - /* 7 */ - { - {0x8003, 99}, - {0x8006, 99}, - {0x800a, 99}, - {0x800f, 99}, - {0x8018, 99}, - {0x801f, 99}, - {0x8029, 99}, - {0xc038, 99}, - {0x8003, 101}, - {0x8006, 101}, - {0x800a, 101}, - {0x800f, 101}, - {0x8018, 101}, - {0x801f, 101}, - {0x8029, 101}, - {0xc038, 101}, - }, - /* 8 */ - { - {0x8003, 105}, - {0x8006, 105}, - {0x800a, 105}, - {0x800f, 105}, - {0x8018, 105}, - {0x801f, 105}, - {0x8029, 105}, - {0xc038, 105}, - {0x8003, 111}, - {0x8006, 111}, - {0x800a, 111}, - {0x800f, 111}, - {0x8018, 111}, - {0x801f, 111}, - {0x8029, 111}, - {0xc038, 111}, - }, - /* 9 */ - { - {0x8001, 115}, - {0xc016, 115}, - {0x8001, 116}, - {0xc016, 116}, - {0xc000, 32}, - {0xc000, 37}, - {0xc000, 45}, - {0xc000, 46}, - {0xc000, 47}, - {0xc000, 51}, - {0xc000, 52}, - {0xc000, 53}, - {0xc000, 54}, - {0xc000, 55}, - {0xc000, 56}, - {0xc000, 57}, - }, - /* 10 */ - { - {0x8002, 115}, - {0x8009, 115}, - {0x8017, 115}, - {0xc028, 115}, - {0x8002, 116}, - {0x8009, 116}, - {0x8017, 116}, - {0xc028, 116}, - {0x8001, 32}, - {0xc016, 32}, - {0x8001, 37}, - {0xc016, 37}, - {0x8001, 45}, - {0xc016, 45}, - {0x8001, 46}, - {0xc016, 46}, - }, - /* 11 */ - { - {0x8003, 115}, - {0x8006, 115}, - {0x800a, 115}, - {0x800f, 115}, - {0x8018, 115}, - {0x801f, 115}, - {0x8029, 115}, - {0xc038, 115}, - {0x8003, 116}, - {0x8006, 116}, - {0x800a, 116}, - {0x800f, 116}, - {0x8018, 116}, - {0x801f, 116}, - {0x8029, 116}, - {0xc038, 116}, - }, - /* 12 */ - { - {0x8002, 32}, - {0x8009, 32}, - {0x8017, 32}, - {0xc028, 32}, - {0x8002, 37}, - {0x8009, 37}, - {0x8017, 37}, - {0xc028, 37}, - {0x8002, 45}, - {0x8009, 45}, - {0x8017, 45}, - {0xc028, 45}, - {0x8002, 46}, - {0x8009, 46}, - {0x8017, 46}, - {0xc028, 46}, - }, - /* 13 */ - { - {0x8003, 32}, - {0x8006, 32}, - {0x800a, 32}, - {0x800f, 32}, - {0x8018, 32}, - {0x801f, 32}, - {0x8029, 32}, - {0xc038, 32}, - {0x8003, 37}, - {0x8006, 37}, - {0x800a, 37}, - {0x800f, 37}, - {0x8018, 37}, - {0x801f, 37}, - {0x8029, 37}, - {0xc038, 37}, - }, - /* 14 */ - { - {0x8003, 45}, - {0x8006, 45}, - {0x800a, 45}, - {0x800f, 45}, - {0x8018, 45}, - {0x801f, 45}, - {0x8029, 45}, - {0xc038, 45}, - {0x8003, 46}, - {0x8006, 46}, - {0x800a, 46}, - {0x800f, 46}, - {0x8018, 46}, - {0x801f, 46}, - {0x8029, 46}, - {0xc038, 46}, - }, - /* 15 */ - { - {0x8001, 47}, - {0xc016, 47}, - {0x8001, 51}, - {0xc016, 51}, - {0x8001, 52}, - {0xc016, 52}, - {0x8001, 53}, - {0xc016, 53}, - {0x8001, 54}, - {0xc016, 54}, - {0x8001, 55}, - {0xc016, 55}, - {0x8001, 56}, - {0xc016, 56}, - {0x8001, 57}, - {0xc016, 57}, - }, - /* 16 */ - { - {0x8002, 47}, - {0x8009, 47}, - {0x8017, 47}, - {0xc028, 47}, - {0x8002, 51}, - {0x8009, 51}, - {0x8017, 51}, - {0xc028, 51}, - {0x8002, 52}, - {0x8009, 52}, - {0x8017, 52}, - {0xc028, 52}, - {0x8002, 53}, - {0x8009, 53}, - {0x8017, 53}, - {0xc028, 53}, - }, - /* 17 */ - { - {0x8003, 47}, - {0x8006, 47}, - {0x800a, 47}, - {0x800f, 47}, - {0x8018, 47}, - {0x801f, 47}, - {0x8029, 47}, - {0xc038, 47}, - {0x8003, 51}, - {0x8006, 51}, - {0x800a, 51}, - {0x800f, 51}, - {0x8018, 51}, - {0x801f, 51}, - {0x8029, 51}, - {0xc038, 51}, - }, - /* 18 */ - { - {0x8003, 52}, - {0x8006, 52}, - {0x800a, 52}, - {0x800f, 52}, - {0x8018, 52}, - {0x801f, 52}, - {0x8029, 52}, - {0xc038, 52}, - {0x8003, 53}, - {0x8006, 53}, - {0x800a, 53}, - {0x800f, 53}, - {0x8018, 53}, - {0x801f, 53}, - {0x8029, 53}, - {0xc038, 53}, - }, - /* 19 */ - { - {0x8002, 54}, - {0x8009, 54}, - {0x8017, 54}, - {0xc028, 54}, - {0x8002, 55}, - {0x8009, 55}, - {0x8017, 55}, - {0xc028, 55}, - {0x8002, 56}, - {0x8009, 56}, - {0x8017, 56}, - {0xc028, 56}, - {0x8002, 57}, - {0x8009, 57}, - {0x8017, 57}, - {0xc028, 57}, - }, - /* 20 */ - { - {0x8003, 54}, - {0x8006, 54}, - {0x800a, 54}, - {0x800f, 54}, - {0x8018, 54}, - {0x801f, 54}, - {0x8029, 54}, - {0xc038, 54}, - {0x8003, 55}, - {0x8006, 55}, - {0x800a, 55}, - {0x800f, 55}, - {0x8018, 55}, - {0x801f, 55}, - {0x8029, 55}, - {0xc038, 55}, - }, - /* 21 */ - { - {0x8003, 56}, - {0x8006, 56}, - {0x800a, 56}, - {0x800f, 56}, - {0x8018, 56}, - {0x801f, 56}, - {0x8029, 56}, - {0xc038, 56}, - {0x8003, 57}, - {0x8006, 57}, - {0x800a, 57}, - {0x800f, 57}, - {0x8018, 57}, - {0x801f, 57}, - {0x8029, 57}, - {0xc038, 57}, - }, - /* 22 */ - { - {0x1a, 0}, - {0x1b, 0}, - {0x1d, 0}, - {0x1e, 0}, - {0x21, 0}, - {0x22, 0}, - {0x24, 0}, - {0x25, 0}, - {0x2b, 0}, - {0x2e, 0}, - {0x32, 0}, - {0x35, 0}, - {0x3a, 0}, - {0x3d, 0}, - {0x41, 0}, - {0x4044, 0}, - }, - /* 23 */ - { - {0xc000, 61}, - {0xc000, 65}, - {0xc000, 95}, - {0xc000, 98}, - {0xc000, 100}, - {0xc000, 102}, - {0xc000, 103}, - {0xc000, 104}, - {0xc000, 108}, - {0xc000, 109}, - {0xc000, 110}, - {0xc000, 112}, - {0xc000, 114}, - {0xc000, 117}, - {0x26, 0}, - {0x27, 0}, - }, - /* 24 */ - { - {0x8001, 61}, - {0xc016, 61}, - {0x8001, 65}, - {0xc016, 65}, - {0x8001, 95}, - {0xc016, 95}, - {0x8001, 98}, - {0xc016, 98}, - {0x8001, 100}, - {0xc016, 100}, - {0x8001, 102}, - {0xc016, 102}, - {0x8001, 103}, - {0xc016, 103}, - {0x8001, 104}, - {0xc016, 104}, - }, - /* 25 */ - { - {0x8002, 61}, - {0x8009, 61}, - {0x8017, 61}, - {0xc028, 61}, - {0x8002, 65}, - {0x8009, 65}, - {0x8017, 65}, - {0xc028, 65}, - {0x8002, 95}, - {0x8009, 95}, - {0x8017, 95}, - {0xc028, 95}, - {0x8002, 98}, - {0x8009, 98}, - {0x8017, 98}, - {0xc028, 98}, - }, - /* 26 */ - { - {0x8003, 61}, - {0x8006, 61}, - {0x800a, 61}, - {0x800f, 61}, - {0x8018, 61}, - {0x801f, 61}, - {0x8029, 61}, - {0xc038, 61}, - {0x8003, 65}, - {0x8006, 65}, - {0x800a, 65}, - {0x800f, 65}, - {0x8018, 65}, - {0x801f, 65}, - {0x8029, 65}, - {0xc038, 65}, - }, - /* 27 */ - { - {0x8003, 95}, - {0x8006, 95}, - {0x800a, 95}, - {0x800f, 95}, - {0x8018, 95}, - {0x801f, 95}, - {0x8029, 95}, - {0xc038, 95}, - {0x8003, 98}, - {0x8006, 98}, - {0x800a, 98}, - {0x800f, 98}, - {0x8018, 98}, - {0x801f, 98}, - {0x8029, 98}, - {0xc038, 98}, - }, - /* 28 */ - { - {0x8002, 100}, - {0x8009, 100}, - {0x8017, 100}, - {0xc028, 100}, - {0x8002, 102}, - {0x8009, 102}, - {0x8017, 102}, - {0xc028, 102}, - {0x8002, 103}, - {0x8009, 103}, - {0x8017, 103}, - {0xc028, 103}, - {0x8002, 104}, - {0x8009, 104}, - {0x8017, 104}, - {0xc028, 104}, - }, - /* 29 */ - { - {0x8003, 100}, - {0x8006, 100}, - {0x800a, 100}, - {0x800f, 100}, - {0x8018, 100}, - {0x801f, 100}, - {0x8029, 100}, - {0xc038, 100}, - {0x8003, 102}, - {0x8006, 102}, - {0x800a, 102}, - {0x800f, 102}, - {0x8018, 102}, - {0x801f, 102}, - {0x8029, 102}, - {0xc038, 102}, - }, - /* 30 */ - { - {0x8003, 103}, - {0x8006, 103}, - {0x800a, 103}, - {0x800f, 103}, - {0x8018, 103}, - {0x801f, 103}, - {0x8029, 103}, - {0xc038, 103}, - {0x8003, 104}, - {0x8006, 104}, - {0x800a, 104}, - {0x800f, 104}, - {0x8018, 104}, - {0x801f, 104}, - {0x8029, 104}, - {0xc038, 104}, - }, - /* 31 */ - { - {0x8001, 108}, - {0xc016, 108}, - {0x8001, 109}, - {0xc016, 109}, - {0x8001, 110}, - {0xc016, 110}, - {0x8001, 112}, - {0xc016, 112}, - {0x8001, 114}, - {0xc016, 114}, - {0x8001, 117}, - {0xc016, 117}, - {0xc000, 58}, - {0xc000, 66}, - {0xc000, 67}, - {0xc000, 68}, - }, - /* 32 */ - { - {0x8002, 108}, - {0x8009, 108}, - {0x8017, 108}, - {0xc028, 108}, - {0x8002, 109}, - {0x8009, 109}, - {0x8017, 109}, - {0xc028, 109}, - {0x8002, 110}, - {0x8009, 110}, - {0x8017, 110}, - {0xc028, 110}, - {0x8002, 112}, - {0x8009, 112}, - {0x8017, 112}, - {0xc028, 112}, - }, - /* 33 */ - { - {0x8003, 108}, - {0x8006, 108}, - {0x800a, 108}, - {0x800f, 108}, - {0x8018, 108}, - {0x801f, 108}, - {0x8029, 108}, - {0xc038, 108}, - {0x8003, 109}, - {0x8006, 109}, - {0x800a, 109}, - {0x800f, 109}, - {0x8018, 109}, - {0x801f, 109}, - {0x8029, 109}, - {0xc038, 109}, - }, - /* 34 */ - { - {0x8003, 110}, - {0x8006, 110}, - {0x800a, 110}, - {0x800f, 110}, - {0x8018, 110}, - {0x801f, 110}, - {0x8029, 110}, - {0xc038, 110}, - {0x8003, 112}, - {0x8006, 112}, - {0x800a, 112}, - {0x800f, 112}, - {0x8018, 112}, - {0x801f, 112}, - {0x8029, 112}, - {0xc038, 112}, - }, - /* 35 */ - { - {0x8002, 114}, - {0x8009, 114}, - {0x8017, 114}, - {0xc028, 114}, - {0x8002, 117}, - {0x8009, 117}, - {0x8017, 117}, - {0xc028, 117}, - {0x8001, 58}, - {0xc016, 58}, - {0x8001, 66}, - {0xc016, 66}, - {0x8001, 67}, - {0xc016, 67}, - {0x8001, 68}, - {0xc016, 68}, - }, - /* 36 */ - { - {0x8003, 114}, - {0x8006, 114}, - {0x800a, 114}, - {0x800f, 114}, - {0x8018, 114}, - {0x801f, 114}, - {0x8029, 114}, - {0xc038, 114}, - {0x8003, 117}, - {0x8006, 117}, - {0x800a, 117}, - {0x800f, 117}, - {0x8018, 117}, - {0x801f, 117}, - {0x8029, 117}, - {0xc038, 117}, - }, - /* 37 */ - { - {0x8002, 58}, - {0x8009, 58}, - {0x8017, 58}, - {0xc028, 58}, - {0x8002, 66}, - {0x8009, 66}, - {0x8017, 66}, - {0xc028, 66}, - {0x8002, 67}, - {0x8009, 67}, - {0x8017, 67}, - {0xc028, 67}, - {0x8002, 68}, - {0x8009, 68}, - {0x8017, 68}, - {0xc028, 68}, - }, - /* 38 */ - { - {0x8003, 58}, - {0x8006, 58}, - {0x800a, 58}, - {0x800f, 58}, - {0x8018, 58}, - {0x801f, 58}, - {0x8029, 58}, - {0xc038, 58}, - {0x8003, 66}, - {0x8006, 66}, - {0x800a, 66}, - {0x800f, 66}, - {0x8018, 66}, - {0x801f, 66}, - {0x8029, 66}, - {0xc038, 66}, - }, - /* 39 */ - { - {0x8003, 67}, - {0x8006, 67}, - {0x800a, 67}, - {0x800f, 67}, - {0x8018, 67}, - {0x801f, 67}, - {0x8029, 67}, - {0xc038, 67}, - {0x8003, 68}, - {0x8006, 68}, - {0x800a, 68}, - {0x800f, 68}, - {0x8018, 68}, - {0x801f, 68}, - {0x8029, 68}, - {0xc038, 68}, - }, - /* 40 */ - { - {0x2c, 0}, - {0x2d, 0}, - {0x2f, 0}, - {0x30, 0}, - {0x33, 0}, - {0x34, 0}, - {0x36, 0}, - {0x37, 0}, - {0x3b, 0}, - {0x3c, 0}, - {0x3e, 0}, - {0x3f, 0}, - {0x42, 0}, - {0x43, 0}, - {0x45, 0}, - {0x4048, 0}, - }, - /* 41 */ - { - {0xc000, 69}, - {0xc000, 70}, - {0xc000, 71}, - {0xc000, 72}, - {0xc000, 73}, - {0xc000, 74}, - {0xc000, 75}, - {0xc000, 76}, - {0xc000, 77}, - {0xc000, 78}, - {0xc000, 79}, - {0xc000, 80}, - {0xc000, 81}, - {0xc000, 82}, - {0xc000, 83}, - {0xc000, 84}, - }, - /* 42 */ - { - {0x8001, 69}, - {0xc016, 69}, - {0x8001, 70}, - {0xc016, 70}, - {0x8001, 71}, - {0xc016, 71}, - {0x8001, 72}, - {0xc016, 72}, - {0x8001, 73}, - {0xc016, 73}, - {0x8001, 74}, - {0xc016, 74}, - {0x8001, 75}, - {0xc016, 75}, - {0x8001, 76}, - {0xc016, 76}, - }, - /* 43 */ - { - {0x8002, 69}, - {0x8009, 69}, - {0x8017, 69}, - {0xc028, 69}, - {0x8002, 70}, - {0x8009, 70}, - {0x8017, 70}, - {0xc028, 70}, - {0x8002, 71}, - {0x8009, 71}, - {0x8017, 71}, - {0xc028, 71}, - {0x8002, 72}, - {0x8009, 72}, - {0x8017, 72}, - {0xc028, 72}, - }, - /* 44 */ - { - {0x8003, 69}, - {0x8006, 69}, - {0x800a, 69}, - {0x800f, 69}, - {0x8018, 69}, - {0x801f, 69}, - {0x8029, 69}, - {0xc038, 69}, - {0x8003, 70}, - {0x8006, 70}, - {0x800a, 70}, - {0x800f, 70}, - {0x8018, 70}, - {0x801f, 70}, - {0x8029, 70}, - {0xc038, 70}, - }, - /* 45 */ - { - {0x8003, 71}, - {0x8006, 71}, - {0x800a, 71}, - {0x800f, 71}, - {0x8018, 71}, - {0x801f, 71}, - {0x8029, 71}, - {0xc038, 71}, - {0x8003, 72}, - {0x8006, 72}, - {0x800a, 72}, - {0x800f, 72}, - {0x8018, 72}, - {0x801f, 72}, - {0x8029, 72}, - {0xc038, 72}, - }, - /* 46 */ - { - {0x8002, 73}, - {0x8009, 73}, - {0x8017, 73}, - {0xc028, 73}, - {0x8002, 74}, - {0x8009, 74}, - {0x8017, 74}, - {0xc028, 74}, - {0x8002, 75}, - {0x8009, 75}, - {0x8017, 75}, - {0xc028, 75}, - {0x8002, 76}, - {0x8009, 76}, - {0x8017, 76}, - {0xc028, 76}, - }, - /* 47 */ - { - {0x8003, 73}, - {0x8006, 73}, - {0x800a, 73}, - {0x800f, 73}, - {0x8018, 73}, - {0x801f, 73}, - {0x8029, 73}, - {0xc038, 73}, - {0x8003, 74}, - {0x8006, 74}, - {0x800a, 74}, - {0x800f, 74}, - {0x8018, 74}, - {0x801f, 74}, - {0x8029, 74}, - {0xc038, 74}, - }, - /* 48 */ - { - {0x8003, 75}, - {0x8006, 75}, - {0x800a, 75}, - {0x800f, 75}, - {0x8018, 75}, - {0x801f, 75}, - {0x8029, 75}, - {0xc038, 75}, - {0x8003, 76}, - {0x8006, 76}, - {0x800a, 76}, - {0x800f, 76}, - {0x8018, 76}, - {0x801f, 76}, - {0x8029, 76}, - {0xc038, 76}, - }, - /* 49 */ - { - {0x8001, 77}, - {0xc016, 77}, - {0x8001, 78}, - {0xc016, 78}, - {0x8001, 79}, - {0xc016, 79}, - {0x8001, 80}, - {0xc016, 80}, - {0x8001, 81}, - {0xc016, 81}, - {0x8001, 82}, - {0xc016, 82}, - {0x8001, 83}, - {0xc016, 83}, - {0x8001, 84}, - {0xc016, 84}, - }, - /* 50 */ - { - {0x8002, 77}, - {0x8009, 77}, - {0x8017, 77}, - {0xc028, 77}, - {0x8002, 78}, - {0x8009, 78}, - {0x8017, 78}, - {0xc028, 78}, - {0x8002, 79}, - {0x8009, 79}, - {0x8017, 79}, - {0xc028, 79}, - {0x8002, 80}, - {0x8009, 80}, - {0x8017, 80}, - {0xc028, 80}, - }, - /* 51 */ - { - {0x8003, 77}, - {0x8006, 77}, - {0x800a, 77}, - {0x800f, 77}, - {0x8018, 77}, - {0x801f, 77}, - {0x8029, 77}, - {0xc038, 77}, - {0x8003, 78}, - {0x8006, 78}, - {0x800a, 78}, - {0x800f, 78}, - {0x8018, 78}, - {0x801f, 78}, - {0x8029, 78}, - {0xc038, 78}, - }, - /* 52 */ - { - {0x8003, 79}, - {0x8006, 79}, - {0x800a, 79}, - {0x800f, 79}, - {0x8018, 79}, - {0x801f, 79}, - {0x8029, 79}, - {0xc038, 79}, - {0x8003, 80}, - {0x8006, 80}, - {0x800a, 80}, - {0x800f, 80}, - {0x8018, 80}, - {0x801f, 80}, - {0x8029, 80}, - {0xc038, 80}, - }, - /* 53 */ - { - {0x8002, 81}, - {0x8009, 81}, - {0x8017, 81}, - {0xc028, 81}, - {0x8002, 82}, - {0x8009, 82}, - {0x8017, 82}, - {0xc028, 82}, - {0x8002, 83}, - {0x8009, 83}, - {0x8017, 83}, - {0xc028, 83}, - {0x8002, 84}, - {0x8009, 84}, - {0x8017, 84}, - {0xc028, 84}, - }, - /* 54 */ - { - {0x8003, 81}, - {0x8006, 81}, - {0x800a, 81}, - {0x800f, 81}, - {0x8018, 81}, - {0x801f, 81}, - {0x8029, 81}, - {0xc038, 81}, - {0x8003, 82}, - {0x8006, 82}, - {0x800a, 82}, - {0x800f, 82}, - {0x8018, 82}, - {0x801f, 82}, - {0x8029, 82}, - {0xc038, 82}, - }, - /* 55 */ - { - {0x8003, 83}, - {0x8006, 83}, - {0x800a, 83}, - {0x800f, 83}, - {0x8018, 83}, - {0x801f, 83}, - {0x8029, 83}, - {0xc038, 83}, - {0x8003, 84}, - {0x8006, 84}, - {0x800a, 84}, - {0x800f, 84}, - {0x8018, 84}, - {0x801f, 84}, - {0x8029, 84}, - {0xc038, 84}, - }, - /* 56 */ - { - {0xc000, 85}, - {0xc000, 86}, - {0xc000, 87}, - {0xc000, 89}, - {0xc000, 106}, - {0xc000, 107}, - {0xc000, 113}, - {0xc000, 118}, - {0xc000, 119}, - {0xc000, 120}, - {0xc000, 121}, - {0xc000, 122}, - {0x46, 0}, - {0x47, 0}, - {0x49, 0}, - {0x404a, 0}, - }, - /* 57 */ - { - {0x8001, 85}, - {0xc016, 85}, - {0x8001, 86}, - {0xc016, 86}, - {0x8001, 87}, - {0xc016, 87}, - {0x8001, 89}, - {0xc016, 89}, - {0x8001, 106}, - {0xc016, 106}, - {0x8001, 107}, - {0xc016, 107}, - {0x8001, 113}, - {0xc016, 113}, - {0x8001, 118}, - {0xc016, 118}, - }, - /* 58 */ - { - {0x8002, 85}, - {0x8009, 85}, - {0x8017, 85}, - {0xc028, 85}, - {0x8002, 86}, - {0x8009, 86}, - {0x8017, 86}, - {0xc028, 86}, - {0x8002, 87}, - {0x8009, 87}, - {0x8017, 87}, - {0xc028, 87}, - {0x8002, 89}, - {0x8009, 89}, - {0x8017, 89}, - {0xc028, 89}, - }, - /* 59 */ - { - {0x8003, 85}, - {0x8006, 85}, - {0x800a, 85}, - {0x800f, 85}, - {0x8018, 85}, - {0x801f, 85}, - {0x8029, 85}, - {0xc038, 85}, - {0x8003, 86}, - {0x8006, 86}, - {0x800a, 86}, - {0x800f, 86}, - {0x8018, 86}, - {0x801f, 86}, - {0x8029, 86}, - {0xc038, 86}, - }, - /* 60 */ - { - {0x8003, 87}, - {0x8006, 87}, - {0x800a, 87}, - {0x800f, 87}, - {0x8018, 87}, - {0x801f, 87}, - {0x8029, 87}, - {0xc038, 87}, - {0x8003, 89}, - {0x8006, 89}, - {0x800a, 89}, - {0x800f, 89}, - {0x8018, 89}, - {0x801f, 89}, - {0x8029, 89}, - {0xc038, 89}, - }, - /* 61 */ - { - {0x8002, 106}, - {0x8009, 106}, - {0x8017, 106}, - {0xc028, 106}, - {0x8002, 107}, - {0x8009, 107}, - {0x8017, 107}, - {0xc028, 107}, - {0x8002, 113}, - {0x8009, 113}, - {0x8017, 113}, - {0xc028, 113}, - {0x8002, 118}, - {0x8009, 118}, - {0x8017, 118}, - {0xc028, 118}, - }, - /* 62 */ - { - {0x8003, 106}, - {0x8006, 106}, - {0x800a, 106}, - {0x800f, 106}, - {0x8018, 106}, - {0x801f, 106}, - {0x8029, 106}, - {0xc038, 106}, - {0x8003, 107}, - {0x8006, 107}, - {0x800a, 107}, - {0x800f, 107}, - {0x8018, 107}, - {0x801f, 107}, - {0x8029, 107}, - {0xc038, 107}, - }, - /* 63 */ - { - {0x8003, 113}, - {0x8006, 113}, - {0x800a, 113}, - {0x800f, 113}, - {0x8018, 113}, - {0x801f, 113}, - {0x8029, 113}, - {0xc038, 113}, - {0x8003, 118}, - {0x8006, 118}, - {0x800a, 118}, - {0x800f, 118}, - {0x8018, 118}, - {0x801f, 118}, - {0x8029, 118}, - {0xc038, 118}, - }, - /* 64 */ - { - {0x8001, 119}, - {0xc016, 119}, - {0x8001, 120}, - {0xc016, 120}, - {0x8001, 121}, - {0xc016, 121}, - {0x8001, 122}, - {0xc016, 122}, - {0xc000, 38}, - {0xc000, 42}, - {0xc000, 44}, - {0xc000, 59}, - {0xc000, 88}, - {0xc000, 90}, - {0x4b, 0}, - {0x4e, 0}, - }, - /* 65 */ - { - {0x8002, 119}, - {0x8009, 119}, - {0x8017, 119}, - {0xc028, 119}, - {0x8002, 120}, - {0x8009, 120}, - {0x8017, 120}, - {0xc028, 120}, - {0x8002, 121}, - {0x8009, 121}, - {0x8017, 121}, - {0xc028, 121}, - {0x8002, 122}, - {0x8009, 122}, - {0x8017, 122}, - {0xc028, 122}, - }, - /* 66 */ - { - {0x8003, 119}, - {0x8006, 119}, - {0x800a, 119}, - {0x800f, 119}, - {0x8018, 119}, - {0x801f, 119}, - {0x8029, 119}, - {0xc038, 119}, - {0x8003, 120}, - {0x8006, 120}, - {0x800a, 120}, - {0x800f, 120}, - {0x8018, 120}, - {0x801f, 120}, - {0x8029, 120}, - {0xc038, 120}, - }, - /* 67 */ - { - {0x8003, 121}, - {0x8006, 121}, - {0x800a, 121}, - {0x800f, 121}, - {0x8018, 121}, - {0x801f, 121}, - {0x8029, 121}, - {0xc038, 121}, - {0x8003, 122}, - {0x8006, 122}, - {0x800a, 122}, - {0x800f, 122}, - {0x8018, 122}, - {0x801f, 122}, - {0x8029, 122}, - {0xc038, 122}, - }, - /* 68 */ - { - {0x8001, 38}, - {0xc016, 38}, - {0x8001, 42}, - {0xc016, 42}, - {0x8001, 44}, - {0xc016, 44}, - {0x8001, 59}, - {0xc016, 59}, - {0x8001, 88}, - {0xc016, 88}, - {0x8001, 90}, - {0xc016, 90}, - {0x4c, 0}, - {0x4d, 0}, - {0x4f, 0}, - {0x51, 0}, - }, - /* 69 */ - { - {0x8002, 38}, - {0x8009, 38}, - {0x8017, 38}, - {0xc028, 38}, - {0x8002, 42}, - {0x8009, 42}, - {0x8017, 42}, - {0xc028, 42}, - {0x8002, 44}, - {0x8009, 44}, - {0x8017, 44}, - {0xc028, 44}, - {0x8002, 59}, - {0x8009, 59}, - {0x8017, 59}, - {0xc028, 59}, - }, - /* 70 */ - { - {0x8003, 38}, - {0x8006, 38}, - {0x800a, 38}, - {0x800f, 38}, - {0x8018, 38}, - {0x801f, 38}, - {0x8029, 38}, - {0xc038, 38}, - {0x8003, 42}, - {0x8006, 42}, - {0x800a, 42}, - {0x800f, 42}, - {0x8018, 42}, - {0x801f, 42}, - {0x8029, 42}, - {0xc038, 42}, - }, - /* 71 */ - { - {0x8003, 44}, - {0x8006, 44}, - {0x800a, 44}, - {0x800f, 44}, - {0x8018, 44}, - {0x801f, 44}, - {0x8029, 44}, - {0xc038, 44}, - {0x8003, 59}, - {0x8006, 59}, - {0x800a, 59}, - {0x800f, 59}, - {0x8018, 59}, - {0x801f, 59}, - {0x8029, 59}, - {0xc038, 59}, - }, - /* 72 */ - { - {0x8002, 88}, - {0x8009, 88}, - {0x8017, 88}, - {0xc028, 88}, - {0x8002, 90}, - {0x8009, 90}, - {0x8017, 90}, - {0xc028, 90}, - {0xc000, 33}, - {0xc000, 34}, - {0xc000, 40}, - {0xc000, 41}, - {0xc000, 63}, - {0x50, 0}, - {0x52, 0}, - {0x54, 0}, - }, - /* 73 */ - { - {0x8003, 88}, - {0x8006, 88}, - {0x800a, 88}, - {0x800f, 88}, - {0x8018, 88}, - {0x801f, 88}, - {0x8029, 88}, - {0xc038, 88}, - {0x8003, 90}, - {0x8006, 90}, - {0x800a, 90}, - {0x800f, 90}, - {0x8018, 90}, - {0x801f, 90}, - {0x8029, 90}, - {0xc038, 90}, - }, - /* 74 */ - { - {0x8001, 33}, - {0xc016, 33}, - {0x8001, 34}, - {0xc016, 34}, - {0x8001, 40}, - {0xc016, 40}, - {0x8001, 41}, - {0xc016, 41}, - {0x8001, 63}, - {0xc016, 63}, - {0xc000, 39}, - {0xc000, 43}, - {0xc000, 124}, - {0x53, 0}, - {0x55, 0}, - {0x58, 0}, - }, - /* 75 */ - { - {0x8002, 33}, - {0x8009, 33}, - {0x8017, 33}, - {0xc028, 33}, - {0x8002, 34}, - {0x8009, 34}, - {0x8017, 34}, - {0xc028, 34}, - {0x8002, 40}, - {0x8009, 40}, - {0x8017, 40}, - {0xc028, 40}, - {0x8002, 41}, - {0x8009, 41}, - {0x8017, 41}, - {0xc028, 41}, - }, - /* 76 */ - { - {0x8003, 33}, - {0x8006, 33}, - {0x800a, 33}, - {0x800f, 33}, - {0x8018, 33}, - {0x801f, 33}, - {0x8029, 33}, - {0xc038, 33}, - {0x8003, 34}, - {0x8006, 34}, - {0x800a, 34}, - {0x800f, 34}, - {0x8018, 34}, - {0x801f, 34}, - {0x8029, 34}, - {0xc038, 34}, - }, - /* 77 */ - { - {0x8003, 40}, - {0x8006, 40}, - {0x800a, 40}, - {0x800f, 40}, - {0x8018, 40}, - {0x801f, 40}, - {0x8029, 40}, - {0xc038, 40}, - {0x8003, 41}, - {0x8006, 41}, - {0x800a, 41}, - {0x800f, 41}, - {0x8018, 41}, - {0x801f, 41}, - {0x8029, 41}, - {0xc038, 41}, - }, - /* 78 */ - { - {0x8002, 63}, - {0x8009, 63}, - {0x8017, 63}, - {0xc028, 63}, - {0x8001, 39}, - {0xc016, 39}, - {0x8001, 43}, - {0xc016, 43}, - {0x8001, 124}, - {0xc016, 124}, - {0xc000, 35}, - {0xc000, 62}, - {0x56, 0}, - {0x57, 0}, - {0x59, 0}, - {0x5a, 0}, - }, - /* 79 */ - { - {0x8003, 63}, - {0x8006, 63}, - {0x800a, 63}, - {0x800f, 63}, - {0x8018, 63}, - {0x801f, 63}, - {0x8029, 63}, - {0xc038, 63}, - {0x8002, 39}, - {0x8009, 39}, - {0x8017, 39}, - {0xc028, 39}, - {0x8002, 43}, - {0x8009, 43}, - {0x8017, 43}, - {0xc028, 43}, - }, - /* 80 */ - { - {0x8003, 39}, - {0x8006, 39}, - {0x800a, 39}, - {0x800f, 39}, - {0x8018, 39}, - {0x801f, 39}, - {0x8029, 39}, - {0xc038, 39}, - {0x8003, 43}, - {0x8006, 43}, - {0x800a, 43}, - {0x800f, 43}, - {0x8018, 43}, - {0x801f, 43}, - {0x8029, 43}, - {0xc038, 43}, - }, - /* 81 */ - { - {0x8002, 124}, - {0x8009, 124}, - {0x8017, 124}, - {0xc028, 124}, - {0x8001, 35}, - {0xc016, 35}, - {0x8001, 62}, - {0xc016, 62}, - {0xc000, 0}, - {0xc000, 36}, - {0xc000, 64}, - {0xc000, 91}, - {0xc000, 93}, - {0xc000, 126}, - {0x5b, 0}, - {0x5c, 0}, - }, - /* 82 */ - { - {0x8003, 124}, - {0x8006, 124}, - {0x800a, 124}, - {0x800f, 124}, - {0x8018, 124}, - {0x801f, 124}, - {0x8029, 124}, - {0xc038, 124}, - {0x8002, 35}, - {0x8009, 35}, - {0x8017, 35}, - {0xc028, 35}, - {0x8002, 62}, - {0x8009, 62}, - {0x8017, 62}, - {0xc028, 62}, - }, - /* 83 */ - { - {0x8003, 35}, - {0x8006, 35}, - {0x800a, 35}, - {0x800f, 35}, - {0x8018, 35}, - {0x801f, 35}, - {0x8029, 35}, - {0xc038, 35}, - {0x8003, 62}, - {0x8006, 62}, - {0x800a, 62}, - {0x800f, 62}, - {0x8018, 62}, - {0x801f, 62}, - {0x8029, 62}, - {0xc038, 62}, - }, - /* 84 */ - { - {0x8001, 0}, - {0xc016, 0}, - {0x8001, 36}, - {0xc016, 36}, - {0x8001, 64}, - {0xc016, 64}, - {0x8001, 91}, - {0xc016, 91}, - {0x8001, 93}, - {0xc016, 93}, - {0x8001, 126}, - {0xc016, 126}, - {0xc000, 94}, - {0xc000, 125}, - {0x5d, 0}, - {0x5e, 0}, - }, - /* 85 */ - { - {0x8002, 0}, - {0x8009, 0}, - {0x8017, 0}, - {0xc028, 0}, - {0x8002, 36}, - {0x8009, 36}, - {0x8017, 36}, - {0xc028, 36}, - {0x8002, 64}, - {0x8009, 64}, - {0x8017, 64}, - {0xc028, 64}, - {0x8002, 91}, - {0x8009, 91}, - {0x8017, 91}, - {0xc028, 91}, - }, - /* 86 */ - { - {0x8003, 0}, - {0x8006, 0}, - {0x800a, 0}, - {0x800f, 0}, - {0x8018, 0}, - {0x801f, 0}, - {0x8029, 0}, - {0xc038, 0}, - {0x8003, 36}, - {0x8006, 36}, - {0x800a, 36}, - {0x800f, 36}, - {0x8018, 36}, - {0x801f, 36}, - {0x8029, 36}, - {0xc038, 36}, - }, - /* 87 */ - { - {0x8003, 64}, - {0x8006, 64}, - {0x800a, 64}, - {0x800f, 64}, - {0x8018, 64}, - {0x801f, 64}, - {0x8029, 64}, - {0xc038, 64}, - {0x8003, 91}, - {0x8006, 91}, - {0x800a, 91}, - {0x800f, 91}, - {0x8018, 91}, - {0x801f, 91}, - {0x8029, 91}, - {0xc038, 91}, - }, - /* 88 */ - { - {0x8002, 93}, - {0x8009, 93}, - {0x8017, 93}, - {0xc028, 93}, - {0x8002, 126}, - {0x8009, 126}, - {0x8017, 126}, - {0xc028, 126}, - {0x8001, 94}, - {0xc016, 94}, - {0x8001, 125}, - {0xc016, 125}, - {0xc000, 60}, - {0xc000, 96}, - {0xc000, 123}, - {0x5f, 0}, - }, - /* 89 */ - { - {0x8003, 93}, - {0x8006, 93}, - {0x800a, 93}, - {0x800f, 93}, - {0x8018, 93}, - {0x801f, 93}, - {0x8029, 93}, - {0xc038, 93}, - {0x8003, 126}, - {0x8006, 126}, - {0x800a, 126}, - {0x800f, 126}, - {0x8018, 126}, - {0x801f, 126}, - {0x8029, 126}, - {0xc038, 126}, - }, - /* 90 */ - { - {0x8002, 94}, - {0x8009, 94}, - {0x8017, 94}, - {0xc028, 94}, - {0x8002, 125}, - {0x8009, 125}, - {0x8017, 125}, - {0xc028, 125}, - {0x8001, 60}, - {0xc016, 60}, - {0x8001, 96}, - {0xc016, 96}, - {0x8001, 123}, - {0xc016, 123}, - {0x60, 0}, - {0x6e, 0}, - }, - /* 91 */ - { - {0x8003, 94}, - {0x8006, 94}, - {0x800a, 94}, - {0x800f, 94}, - {0x8018, 94}, - {0x801f, 94}, - {0x8029, 94}, - {0xc038, 94}, - {0x8003, 125}, - {0x8006, 125}, - {0x800a, 125}, - {0x800f, 125}, - {0x8018, 125}, - {0x801f, 125}, - {0x8029, 125}, - {0xc038, 125}, - }, - /* 92 */ - { - {0x8002, 60}, - {0x8009, 60}, - {0x8017, 60}, - {0xc028, 60}, - {0x8002, 96}, - {0x8009, 96}, - {0x8017, 96}, - {0xc028, 96}, - {0x8002, 123}, - {0x8009, 123}, - {0x8017, 123}, - {0xc028, 123}, - {0x61, 0}, - {0x65, 0}, - {0x6f, 0}, - {0x85, 0}, - }, - /* 93 */ - { - {0x8003, 60}, - {0x8006, 60}, - {0x800a, 60}, - {0x800f, 60}, - {0x8018, 60}, - {0x801f, 60}, - {0x8029, 60}, - {0xc038, 60}, - {0x8003, 96}, - {0x8006, 96}, - {0x800a, 96}, - {0x800f, 96}, - {0x8018, 96}, - {0x801f, 96}, - {0x8029, 96}, - {0xc038, 96}, - }, - /* 94 */ - { - {0x8003, 123}, - {0x8006, 123}, - {0x800a, 123}, - {0x800f, 123}, - {0x8018, 123}, - {0x801f, 123}, - {0x8029, 123}, - {0xc038, 123}, - {0x62, 0}, - {0x63, 0}, - {0x66, 0}, - {0x69, 0}, - {0x70, 0}, - {0x77, 0}, - {0x86, 0}, - {0x99, 0}, - }, - /* 95 */ - { - {0xc000, 92}, - {0xc000, 195}, - {0xc000, 208}, - {0x64, 0}, - {0x67, 0}, - {0x68, 0}, - {0x6a, 0}, - {0x6b, 0}, - {0x71, 0}, - {0x74, 0}, - {0x78, 0}, - {0x7e, 0}, - {0x87, 0}, - {0x8e, 0}, - {0x9a, 0}, - {0xa9, 0}, - }, - /* 96 */ - { - {0x8001, 92}, - {0xc016, 92}, - {0x8001, 195}, - {0xc016, 195}, - {0x8001, 208}, - {0xc016, 208}, - {0xc000, 128}, - {0xc000, 130}, - {0xc000, 131}, - {0xc000, 162}, - {0xc000, 184}, - {0xc000, 194}, - {0xc000, 224}, - {0xc000, 226}, - {0x6c, 0}, - {0x6d, 0}, - }, - /* 97 */ - { - {0x8002, 92}, - {0x8009, 92}, - {0x8017, 92}, - {0xc028, 92}, - {0x8002, 195}, - {0x8009, 195}, - {0x8017, 195}, - {0xc028, 195}, - {0x8002, 208}, - {0x8009, 208}, - {0x8017, 208}, - {0xc028, 208}, - {0x8001, 128}, - {0xc016, 128}, - {0x8001, 130}, - {0xc016, 130}, - }, - /* 98 */ - { - {0x8003, 92}, - {0x8006, 92}, - {0x800a, 92}, - {0x800f, 92}, - {0x8018, 92}, - {0x801f, 92}, - {0x8029, 92}, - {0xc038, 92}, - {0x8003, 195}, - {0x8006, 195}, - {0x800a, 195}, - {0x800f, 195}, - {0x8018, 195}, - {0x801f, 195}, - {0x8029, 195}, - {0xc038, 195}, - }, - /* 99 */ - { - {0x8003, 208}, - {0x8006, 208}, - {0x800a, 208}, - {0x800f, 208}, - {0x8018, 208}, - {0x801f, 208}, - {0x8029, 208}, - {0xc038, 208}, - {0x8002, 128}, - {0x8009, 128}, - {0x8017, 128}, - {0xc028, 128}, - {0x8002, 130}, - {0x8009, 130}, - {0x8017, 130}, - {0xc028, 130}, - }, - /* 100 */ - { - {0x8003, 128}, - {0x8006, 128}, - {0x800a, 128}, - {0x800f, 128}, - {0x8018, 128}, - {0x801f, 128}, - {0x8029, 128}, - {0xc038, 128}, - {0x8003, 130}, - {0x8006, 130}, - {0x800a, 130}, - {0x800f, 130}, - {0x8018, 130}, - {0x801f, 130}, - {0x8029, 130}, - {0xc038, 130}, - }, - /* 101 */ - { - {0x8001, 131}, - {0xc016, 131}, - {0x8001, 162}, - {0xc016, 162}, - {0x8001, 184}, - {0xc016, 184}, - {0x8001, 194}, - {0xc016, 194}, - {0x8001, 224}, - {0xc016, 224}, - {0x8001, 226}, - {0xc016, 226}, - {0xc000, 153}, - {0xc000, 161}, - {0xc000, 167}, - {0xc000, 172}, - }, - /* 102 */ - { - {0x8002, 131}, - {0x8009, 131}, - {0x8017, 131}, - {0xc028, 131}, - {0x8002, 162}, - {0x8009, 162}, - {0x8017, 162}, - {0xc028, 162}, - {0x8002, 184}, - {0x8009, 184}, - {0x8017, 184}, - {0xc028, 184}, - {0x8002, 194}, - {0x8009, 194}, - {0x8017, 194}, - {0xc028, 194}, - }, - /* 103 */ - { - {0x8003, 131}, - {0x8006, 131}, - {0x800a, 131}, - {0x800f, 131}, - {0x8018, 131}, - {0x801f, 131}, - {0x8029, 131}, - {0xc038, 131}, - {0x8003, 162}, - {0x8006, 162}, - {0x800a, 162}, - {0x800f, 162}, - {0x8018, 162}, - {0x801f, 162}, - {0x8029, 162}, - {0xc038, 162}, - }, - /* 104 */ - { - {0x8003, 184}, - {0x8006, 184}, - {0x800a, 184}, - {0x800f, 184}, - {0x8018, 184}, - {0x801f, 184}, - {0x8029, 184}, - {0xc038, 184}, - {0x8003, 194}, - {0x8006, 194}, - {0x800a, 194}, - {0x800f, 194}, - {0x8018, 194}, - {0x801f, 194}, - {0x8029, 194}, - {0xc038, 194}, - }, - /* 105 */ - { - {0x8002, 224}, - {0x8009, 224}, - {0x8017, 224}, - {0xc028, 224}, - {0x8002, 226}, - {0x8009, 226}, - {0x8017, 226}, - {0xc028, 226}, - {0x8001, 153}, - {0xc016, 153}, - {0x8001, 161}, - {0xc016, 161}, - {0x8001, 167}, - {0xc016, 167}, - {0x8001, 172}, - {0xc016, 172}, - }, - /* 106 */ - { - {0x8003, 224}, - {0x8006, 224}, - {0x800a, 224}, - {0x800f, 224}, - {0x8018, 224}, - {0x801f, 224}, - {0x8029, 224}, - {0xc038, 224}, - {0x8003, 226}, - {0x8006, 226}, - {0x800a, 226}, - {0x800f, 226}, - {0x8018, 226}, - {0x801f, 226}, - {0x8029, 226}, - {0xc038, 226}, - }, - /* 107 */ - { - {0x8002, 153}, - {0x8009, 153}, - {0x8017, 153}, - {0xc028, 153}, - {0x8002, 161}, - {0x8009, 161}, - {0x8017, 161}, - {0xc028, 161}, - {0x8002, 167}, - {0x8009, 167}, - {0x8017, 167}, - {0xc028, 167}, - {0x8002, 172}, - {0x8009, 172}, - {0x8017, 172}, - {0xc028, 172}, - }, - /* 108 */ - { - {0x8003, 153}, - {0x8006, 153}, - {0x800a, 153}, - {0x800f, 153}, - {0x8018, 153}, - {0x801f, 153}, - {0x8029, 153}, - {0xc038, 153}, - {0x8003, 161}, - {0x8006, 161}, - {0x800a, 161}, - {0x800f, 161}, - {0x8018, 161}, - {0x801f, 161}, - {0x8029, 161}, - {0xc038, 161}, - }, - /* 109 */ - { - {0x8003, 167}, - {0x8006, 167}, - {0x800a, 167}, - {0x800f, 167}, - {0x8018, 167}, - {0x801f, 167}, - {0x8029, 167}, - {0xc038, 167}, - {0x8003, 172}, - {0x8006, 172}, - {0x800a, 172}, - {0x800f, 172}, - {0x8018, 172}, - {0x801f, 172}, - {0x8029, 172}, - {0xc038, 172}, - }, - /* 110 */ - { - {0x72, 0}, - {0x73, 0}, - {0x75, 0}, - {0x76, 0}, - {0x79, 0}, - {0x7b, 0}, - {0x7f, 0}, - {0x82, 0}, - {0x88, 0}, - {0x8b, 0}, - {0x8f, 0}, - {0x92, 0}, - {0x9b, 0}, - {0xa2, 0}, - {0xaa, 0}, - {0xb4, 0}, - }, - /* 111 */ - { - {0xc000, 176}, - {0xc000, 177}, - {0xc000, 179}, - {0xc000, 209}, - {0xc000, 216}, - {0xc000, 217}, - {0xc000, 227}, - {0xc000, 229}, - {0xc000, 230}, - {0x7a, 0}, - {0x7c, 0}, - {0x7d, 0}, - {0x80, 0}, - {0x81, 0}, - {0x83, 0}, - {0x84, 0}, - }, - /* 112 */ - { - {0x8001, 176}, - {0xc016, 176}, - {0x8001, 177}, - {0xc016, 177}, - {0x8001, 179}, - {0xc016, 179}, - {0x8001, 209}, - {0xc016, 209}, - {0x8001, 216}, - {0xc016, 216}, - {0x8001, 217}, - {0xc016, 217}, - {0x8001, 227}, - {0xc016, 227}, - {0x8001, 229}, - {0xc016, 229}, - }, - /* 113 */ - { - {0x8002, 176}, - {0x8009, 176}, - {0x8017, 176}, - {0xc028, 176}, - {0x8002, 177}, - {0x8009, 177}, - {0x8017, 177}, - {0xc028, 177}, - {0x8002, 179}, - {0x8009, 179}, - {0x8017, 179}, - {0xc028, 179}, - {0x8002, 209}, - {0x8009, 209}, - {0x8017, 209}, - {0xc028, 209}, - }, - /* 114 */ - { - {0x8003, 176}, - {0x8006, 176}, - {0x800a, 176}, - {0x800f, 176}, - {0x8018, 176}, - {0x801f, 176}, - {0x8029, 176}, - {0xc038, 176}, - {0x8003, 177}, - {0x8006, 177}, - {0x800a, 177}, - {0x800f, 177}, - {0x8018, 177}, - {0x801f, 177}, - {0x8029, 177}, - {0xc038, 177}, - }, - /* 115 */ - { - {0x8003, 179}, - {0x8006, 179}, - {0x800a, 179}, - {0x800f, 179}, - {0x8018, 179}, - {0x801f, 179}, - {0x8029, 179}, - {0xc038, 179}, - {0x8003, 209}, - {0x8006, 209}, - {0x800a, 209}, - {0x800f, 209}, - {0x8018, 209}, - {0x801f, 209}, - {0x8029, 209}, - {0xc038, 209}, - }, - /* 116 */ - { - {0x8002, 216}, - {0x8009, 216}, - {0x8017, 216}, - {0xc028, 216}, - {0x8002, 217}, - {0x8009, 217}, - {0x8017, 217}, - {0xc028, 217}, - {0x8002, 227}, - {0x8009, 227}, - {0x8017, 227}, - {0xc028, 227}, - {0x8002, 229}, - {0x8009, 229}, - {0x8017, 229}, - {0xc028, 229}, - }, - /* 117 */ - { - {0x8003, 216}, - {0x8006, 216}, - {0x800a, 216}, - {0x800f, 216}, - {0x8018, 216}, - {0x801f, 216}, - {0x8029, 216}, - {0xc038, 216}, - {0x8003, 217}, - {0x8006, 217}, - {0x800a, 217}, - {0x800f, 217}, - {0x8018, 217}, - {0x801f, 217}, - {0x8029, 217}, - {0xc038, 217}, - }, - /* 118 */ - { - {0x8003, 227}, - {0x8006, 227}, - {0x800a, 227}, - {0x800f, 227}, - {0x8018, 227}, - {0x801f, 227}, - {0x8029, 227}, - {0xc038, 227}, - {0x8003, 229}, - {0x8006, 229}, - {0x800a, 229}, - {0x800f, 229}, - {0x8018, 229}, - {0x801f, 229}, - {0x8029, 229}, - {0xc038, 229}, - }, - /* 119 */ - { - {0x8001, 230}, - {0xc016, 230}, - {0xc000, 129}, - {0xc000, 132}, - {0xc000, 133}, - {0xc000, 134}, - {0xc000, 136}, - {0xc000, 146}, - {0xc000, 154}, - {0xc000, 156}, - {0xc000, 160}, - {0xc000, 163}, - {0xc000, 164}, - {0xc000, 169}, - {0xc000, 170}, - {0xc000, 173}, - }, - /* 120 */ - { - {0x8002, 230}, - {0x8009, 230}, - {0x8017, 230}, - {0xc028, 230}, - {0x8001, 129}, - {0xc016, 129}, - {0x8001, 132}, - {0xc016, 132}, - {0x8001, 133}, - {0xc016, 133}, - {0x8001, 134}, - {0xc016, 134}, - {0x8001, 136}, - {0xc016, 136}, - {0x8001, 146}, - {0xc016, 146}, - }, - /* 121 */ - { - {0x8003, 230}, - {0x8006, 230}, - {0x800a, 230}, - {0x800f, 230}, - {0x8018, 230}, - {0x801f, 230}, - {0x8029, 230}, - {0xc038, 230}, - {0x8002, 129}, - {0x8009, 129}, - {0x8017, 129}, - {0xc028, 129}, - {0x8002, 132}, - {0x8009, 132}, - {0x8017, 132}, - {0xc028, 132}, - }, - /* 122 */ - { - {0x8003, 129}, - {0x8006, 129}, - {0x800a, 129}, - {0x800f, 129}, - {0x8018, 129}, - {0x801f, 129}, - {0x8029, 129}, - {0xc038, 129}, - {0x8003, 132}, - {0x8006, 132}, - {0x800a, 132}, - {0x800f, 132}, - {0x8018, 132}, - {0x801f, 132}, - {0x8029, 132}, - {0xc038, 132}, - }, - /* 123 */ - { - {0x8002, 133}, - {0x8009, 133}, - {0x8017, 133}, - {0xc028, 133}, - {0x8002, 134}, - {0x8009, 134}, - {0x8017, 134}, - {0xc028, 134}, - {0x8002, 136}, - {0x8009, 136}, - {0x8017, 136}, - {0xc028, 136}, - {0x8002, 146}, - {0x8009, 146}, - {0x8017, 146}, - {0xc028, 146}, - }, - /* 124 */ - { - {0x8003, 133}, - {0x8006, 133}, - {0x800a, 133}, - {0x800f, 133}, - {0x8018, 133}, - {0x801f, 133}, - {0x8029, 133}, - {0xc038, 133}, - {0x8003, 134}, - {0x8006, 134}, - {0x800a, 134}, - {0x800f, 134}, - {0x8018, 134}, - {0x801f, 134}, - {0x8029, 134}, - {0xc038, 134}, - }, - /* 125 */ - { - {0x8003, 136}, - {0x8006, 136}, - {0x800a, 136}, - {0x800f, 136}, - {0x8018, 136}, - {0x801f, 136}, - {0x8029, 136}, - {0xc038, 136}, - {0x8003, 146}, - {0x8006, 146}, - {0x800a, 146}, - {0x800f, 146}, - {0x8018, 146}, - {0x801f, 146}, - {0x8029, 146}, - {0xc038, 146}, - }, - /* 126 */ - { - {0x8001, 154}, - {0xc016, 154}, - {0x8001, 156}, - {0xc016, 156}, - {0x8001, 160}, - {0xc016, 160}, - {0x8001, 163}, - {0xc016, 163}, - {0x8001, 164}, - {0xc016, 164}, - {0x8001, 169}, - {0xc016, 169}, - {0x8001, 170}, - {0xc016, 170}, - {0x8001, 173}, - {0xc016, 173}, - }, - /* 127 */ - { - {0x8002, 154}, - {0x8009, 154}, - {0x8017, 154}, - {0xc028, 154}, - {0x8002, 156}, - {0x8009, 156}, - {0x8017, 156}, - {0xc028, 156}, - {0x8002, 160}, - {0x8009, 160}, - {0x8017, 160}, - {0xc028, 160}, - {0x8002, 163}, - {0x8009, 163}, - {0x8017, 163}, - {0xc028, 163}, - }, - /* 128 */ - { - {0x8003, 154}, - {0x8006, 154}, - {0x800a, 154}, - {0x800f, 154}, - {0x8018, 154}, - {0x801f, 154}, - {0x8029, 154}, - {0xc038, 154}, - {0x8003, 156}, - {0x8006, 156}, - {0x800a, 156}, - {0x800f, 156}, - {0x8018, 156}, - {0x801f, 156}, - {0x8029, 156}, - {0xc038, 156}, - }, - /* 129 */ - { - {0x8003, 160}, - {0x8006, 160}, - {0x800a, 160}, - {0x800f, 160}, - {0x8018, 160}, - {0x801f, 160}, - {0x8029, 160}, - {0xc038, 160}, - {0x8003, 163}, - {0x8006, 163}, - {0x800a, 163}, - {0x800f, 163}, - {0x8018, 163}, - {0x801f, 163}, - {0x8029, 163}, - {0xc038, 163}, - }, - /* 130 */ - { - {0x8002, 164}, - {0x8009, 164}, - {0x8017, 164}, - {0xc028, 164}, - {0x8002, 169}, - {0x8009, 169}, - {0x8017, 169}, - {0xc028, 169}, - {0x8002, 170}, - {0x8009, 170}, - {0x8017, 170}, - {0xc028, 170}, - {0x8002, 173}, - {0x8009, 173}, - {0x8017, 173}, - {0xc028, 173}, - }, - /* 131 */ - { - {0x8003, 164}, - {0x8006, 164}, - {0x800a, 164}, - {0x800f, 164}, - {0x8018, 164}, - {0x801f, 164}, - {0x8029, 164}, - {0xc038, 164}, - {0x8003, 169}, - {0x8006, 169}, - {0x800a, 169}, - {0x800f, 169}, - {0x8018, 169}, - {0x801f, 169}, - {0x8029, 169}, - {0xc038, 169}, - }, - /* 132 */ - { - {0x8003, 170}, - {0x8006, 170}, - {0x800a, 170}, - {0x800f, 170}, - {0x8018, 170}, - {0x801f, 170}, - {0x8029, 170}, - {0xc038, 170}, - {0x8003, 173}, - {0x8006, 173}, - {0x800a, 173}, - {0x800f, 173}, - {0x8018, 173}, - {0x801f, 173}, - {0x8029, 173}, - {0xc038, 173}, - }, - /* 133 */ - { - {0x89, 0}, - {0x8a, 0}, - {0x8c, 0}, - {0x8d, 0}, - {0x90, 0}, - {0x91, 0}, - {0x93, 0}, - {0x96, 0}, - {0x9c, 0}, - {0x9f, 0}, - {0xa3, 0}, - {0xa6, 0}, - {0xab, 0}, - {0xae, 0}, - {0xb5, 0}, - {0xbe, 0}, - }, - /* 134 */ - { - {0xc000, 178}, - {0xc000, 181}, - {0xc000, 185}, - {0xc000, 186}, - {0xc000, 187}, - {0xc000, 189}, - {0xc000, 190}, - {0xc000, 196}, - {0xc000, 198}, - {0xc000, 228}, - {0xc000, 232}, - {0xc000, 233}, - {0x94, 0}, - {0x95, 0}, - {0x97, 0}, - {0x98, 0}, - }, - /* 135 */ - { - {0x8001, 178}, - {0xc016, 178}, - {0x8001, 181}, - {0xc016, 181}, - {0x8001, 185}, - {0xc016, 185}, - {0x8001, 186}, - {0xc016, 186}, - {0x8001, 187}, - {0xc016, 187}, - {0x8001, 189}, - {0xc016, 189}, - {0x8001, 190}, - {0xc016, 190}, - {0x8001, 196}, - {0xc016, 196}, - }, - /* 136 */ - { - {0x8002, 178}, - {0x8009, 178}, - {0x8017, 178}, - {0xc028, 178}, - {0x8002, 181}, - {0x8009, 181}, - {0x8017, 181}, - {0xc028, 181}, - {0x8002, 185}, - {0x8009, 185}, - {0x8017, 185}, - {0xc028, 185}, - {0x8002, 186}, - {0x8009, 186}, - {0x8017, 186}, - {0xc028, 186}, - }, - /* 137 */ - { - {0x8003, 178}, - {0x8006, 178}, - {0x800a, 178}, - {0x800f, 178}, - {0x8018, 178}, - {0x801f, 178}, - {0x8029, 178}, - {0xc038, 178}, - {0x8003, 181}, - {0x8006, 181}, - {0x800a, 181}, - {0x800f, 181}, - {0x8018, 181}, - {0x801f, 181}, - {0x8029, 181}, - {0xc038, 181}, - }, - /* 138 */ - { - {0x8003, 185}, - {0x8006, 185}, - {0x800a, 185}, - {0x800f, 185}, - {0x8018, 185}, - {0x801f, 185}, - {0x8029, 185}, - {0xc038, 185}, - {0x8003, 186}, - {0x8006, 186}, - {0x800a, 186}, - {0x800f, 186}, - {0x8018, 186}, - {0x801f, 186}, - {0x8029, 186}, - {0xc038, 186}, - }, - /* 139 */ - { - {0x8002, 187}, - {0x8009, 187}, - {0x8017, 187}, - {0xc028, 187}, - {0x8002, 189}, - {0x8009, 189}, - {0x8017, 189}, - {0xc028, 189}, - {0x8002, 190}, - {0x8009, 190}, - {0x8017, 190}, - {0xc028, 190}, - {0x8002, 196}, - {0x8009, 196}, - {0x8017, 196}, - {0xc028, 196}, - }, - /* 140 */ - { - {0x8003, 187}, - {0x8006, 187}, - {0x800a, 187}, - {0x800f, 187}, - {0x8018, 187}, - {0x801f, 187}, - {0x8029, 187}, - {0xc038, 187}, - {0x8003, 189}, - {0x8006, 189}, - {0x800a, 189}, - {0x800f, 189}, - {0x8018, 189}, - {0x801f, 189}, - {0x8029, 189}, - {0xc038, 189}, - }, - /* 141 */ - { - {0x8003, 190}, - {0x8006, 190}, - {0x800a, 190}, - {0x800f, 190}, - {0x8018, 190}, - {0x801f, 190}, - {0x8029, 190}, - {0xc038, 190}, - {0x8003, 196}, - {0x8006, 196}, - {0x800a, 196}, - {0x800f, 196}, - {0x8018, 196}, - {0x801f, 196}, - {0x8029, 196}, - {0xc038, 196}, - }, - /* 142 */ - { - {0x8001, 198}, - {0xc016, 198}, - {0x8001, 228}, - {0xc016, 228}, - {0x8001, 232}, - {0xc016, 232}, - {0x8001, 233}, - {0xc016, 233}, - {0xc000, 1}, - {0xc000, 135}, - {0xc000, 137}, - {0xc000, 138}, - {0xc000, 139}, - {0xc000, 140}, - {0xc000, 141}, - {0xc000, 143}, - }, - /* 143 */ - { - {0x8002, 198}, - {0x8009, 198}, - {0x8017, 198}, - {0xc028, 198}, - {0x8002, 228}, - {0x8009, 228}, - {0x8017, 228}, - {0xc028, 228}, - {0x8002, 232}, - {0x8009, 232}, - {0x8017, 232}, - {0xc028, 232}, - {0x8002, 233}, - {0x8009, 233}, - {0x8017, 233}, - {0xc028, 233}, - }, - /* 144 */ - { - {0x8003, 198}, - {0x8006, 198}, - {0x800a, 198}, - {0x800f, 198}, - {0x8018, 198}, - {0x801f, 198}, - {0x8029, 198}, - {0xc038, 198}, - {0x8003, 228}, - {0x8006, 228}, - {0x800a, 228}, - {0x800f, 228}, - {0x8018, 228}, - {0x801f, 228}, - {0x8029, 228}, - {0xc038, 228}, - }, - /* 145 */ - { - {0x8003, 232}, - {0x8006, 232}, - {0x800a, 232}, - {0x800f, 232}, - {0x8018, 232}, - {0x801f, 232}, - {0x8029, 232}, - {0xc038, 232}, - {0x8003, 233}, - {0x8006, 233}, - {0x800a, 233}, - {0x800f, 233}, - {0x8018, 233}, - {0x801f, 233}, - {0x8029, 233}, - {0xc038, 233}, - }, - /* 146 */ - { - {0x8001, 1}, - {0xc016, 1}, - {0x8001, 135}, - {0xc016, 135}, - {0x8001, 137}, - {0xc016, 137}, - {0x8001, 138}, - {0xc016, 138}, - {0x8001, 139}, - {0xc016, 139}, - {0x8001, 140}, - {0xc016, 140}, - {0x8001, 141}, - {0xc016, 141}, - {0x8001, 143}, - {0xc016, 143}, - }, - /* 147 */ - { - {0x8002, 1}, - {0x8009, 1}, - {0x8017, 1}, - {0xc028, 1}, - {0x8002, 135}, - {0x8009, 135}, - {0x8017, 135}, - {0xc028, 135}, - {0x8002, 137}, - {0x8009, 137}, - {0x8017, 137}, - {0xc028, 137}, - {0x8002, 138}, - {0x8009, 138}, - {0x8017, 138}, - {0xc028, 138}, - }, - /* 148 */ - { - {0x8003, 1}, - {0x8006, 1}, - {0x800a, 1}, - {0x800f, 1}, - {0x8018, 1}, - {0x801f, 1}, - {0x8029, 1}, - {0xc038, 1}, - {0x8003, 135}, - {0x8006, 135}, - {0x800a, 135}, - {0x800f, 135}, - {0x8018, 135}, - {0x801f, 135}, - {0x8029, 135}, - {0xc038, 135}, - }, - /* 149 */ - { - {0x8003, 137}, - {0x8006, 137}, - {0x800a, 137}, - {0x800f, 137}, - {0x8018, 137}, - {0x801f, 137}, - {0x8029, 137}, - {0xc038, 137}, - {0x8003, 138}, - {0x8006, 138}, - {0x800a, 138}, - {0x800f, 138}, - {0x8018, 138}, - {0x801f, 138}, - {0x8029, 138}, - {0xc038, 138}, - }, - /* 150 */ - { - {0x8002, 139}, - {0x8009, 139}, - {0x8017, 139}, - {0xc028, 139}, - {0x8002, 140}, - {0x8009, 140}, - {0x8017, 140}, - {0xc028, 140}, - {0x8002, 141}, - {0x8009, 141}, - {0x8017, 141}, - {0xc028, 141}, - {0x8002, 143}, - {0x8009, 143}, - {0x8017, 143}, - {0xc028, 143}, - }, - /* 151 */ - { - {0x8003, 139}, - {0x8006, 139}, - {0x800a, 139}, - {0x800f, 139}, - {0x8018, 139}, - {0x801f, 139}, - {0x8029, 139}, - {0xc038, 139}, - {0x8003, 140}, - {0x8006, 140}, - {0x800a, 140}, - {0x800f, 140}, - {0x8018, 140}, - {0x801f, 140}, - {0x8029, 140}, - {0xc038, 140}, - }, - /* 152 */ - { - {0x8003, 141}, - {0x8006, 141}, - {0x800a, 141}, - {0x800f, 141}, - {0x8018, 141}, - {0x801f, 141}, - {0x8029, 141}, - {0xc038, 141}, - {0x8003, 143}, - {0x8006, 143}, - {0x800a, 143}, - {0x800f, 143}, - {0x8018, 143}, - {0x801f, 143}, - {0x8029, 143}, - {0xc038, 143}, - }, - /* 153 */ - { - {0x9d, 0}, - {0x9e, 0}, - {0xa0, 0}, - {0xa1, 0}, - {0xa4, 0}, - {0xa5, 0}, - {0xa7, 0}, - {0xa8, 0}, - {0xac, 0}, - {0xad, 0}, - {0xaf, 0}, - {0xb1, 0}, - {0xb6, 0}, - {0xb9, 0}, - {0xbf, 0}, - {0xcf, 0}, - }, - /* 154 */ - { - {0xc000, 147}, - {0xc000, 149}, - {0xc000, 150}, - {0xc000, 151}, - {0xc000, 152}, - {0xc000, 155}, - {0xc000, 157}, - {0xc000, 158}, - {0xc000, 165}, - {0xc000, 166}, - {0xc000, 168}, - {0xc000, 174}, - {0xc000, 175}, - {0xc000, 180}, - {0xc000, 182}, - {0xc000, 183}, - }, - /* 155 */ - { - {0x8001, 147}, - {0xc016, 147}, - {0x8001, 149}, - {0xc016, 149}, - {0x8001, 150}, - {0xc016, 150}, - {0x8001, 151}, - {0xc016, 151}, - {0x8001, 152}, - {0xc016, 152}, - {0x8001, 155}, - {0xc016, 155}, - {0x8001, 157}, - {0xc016, 157}, - {0x8001, 158}, - {0xc016, 158}, - }, - /* 156 */ - { - {0x8002, 147}, - {0x8009, 147}, - {0x8017, 147}, - {0xc028, 147}, - {0x8002, 149}, - {0x8009, 149}, - {0x8017, 149}, - {0xc028, 149}, - {0x8002, 150}, - {0x8009, 150}, - {0x8017, 150}, - {0xc028, 150}, - {0x8002, 151}, - {0x8009, 151}, - {0x8017, 151}, - {0xc028, 151}, - }, - /* 157 */ - { - {0x8003, 147}, - {0x8006, 147}, - {0x800a, 147}, - {0x800f, 147}, - {0x8018, 147}, - {0x801f, 147}, - {0x8029, 147}, - {0xc038, 147}, - {0x8003, 149}, - {0x8006, 149}, - {0x800a, 149}, - {0x800f, 149}, - {0x8018, 149}, - {0x801f, 149}, - {0x8029, 149}, - {0xc038, 149}, - }, - /* 158 */ - { - {0x8003, 150}, - {0x8006, 150}, - {0x800a, 150}, - {0x800f, 150}, - {0x8018, 150}, - {0x801f, 150}, - {0x8029, 150}, - {0xc038, 150}, - {0x8003, 151}, - {0x8006, 151}, - {0x800a, 151}, - {0x800f, 151}, - {0x8018, 151}, - {0x801f, 151}, - {0x8029, 151}, - {0xc038, 151}, - }, - /* 159 */ - { - {0x8002, 152}, - {0x8009, 152}, - {0x8017, 152}, - {0xc028, 152}, - {0x8002, 155}, - {0x8009, 155}, - {0x8017, 155}, - {0xc028, 155}, - {0x8002, 157}, - {0x8009, 157}, - {0x8017, 157}, - {0xc028, 157}, - {0x8002, 158}, - {0x8009, 158}, - {0x8017, 158}, - {0xc028, 158}, - }, - /* 160 */ - { - {0x8003, 152}, - {0x8006, 152}, - {0x800a, 152}, - {0x800f, 152}, - {0x8018, 152}, - {0x801f, 152}, - {0x8029, 152}, - {0xc038, 152}, - {0x8003, 155}, - {0x8006, 155}, - {0x800a, 155}, - {0x800f, 155}, - {0x8018, 155}, - {0x801f, 155}, - {0x8029, 155}, - {0xc038, 155}, - }, - /* 161 */ - { - {0x8003, 157}, - {0x8006, 157}, - {0x800a, 157}, - {0x800f, 157}, - {0x8018, 157}, - {0x801f, 157}, - {0x8029, 157}, - {0xc038, 157}, - {0x8003, 158}, - {0x8006, 158}, - {0x800a, 158}, - {0x800f, 158}, - {0x8018, 158}, - {0x801f, 158}, - {0x8029, 158}, - {0xc038, 158}, - }, - /* 162 */ - { - {0x8001, 165}, - {0xc016, 165}, - {0x8001, 166}, - {0xc016, 166}, - {0x8001, 168}, - {0xc016, 168}, - {0x8001, 174}, - {0xc016, 174}, - {0x8001, 175}, - {0xc016, 175}, - {0x8001, 180}, - {0xc016, 180}, - {0x8001, 182}, - {0xc016, 182}, - {0x8001, 183}, - {0xc016, 183}, - }, - /* 163 */ - { - {0x8002, 165}, - {0x8009, 165}, - {0x8017, 165}, - {0xc028, 165}, - {0x8002, 166}, - {0x8009, 166}, - {0x8017, 166}, - {0xc028, 166}, - {0x8002, 168}, - {0x8009, 168}, - {0x8017, 168}, - {0xc028, 168}, - {0x8002, 174}, - {0x8009, 174}, - {0x8017, 174}, - {0xc028, 174}, - }, - /* 164 */ - { - {0x8003, 165}, - {0x8006, 165}, - {0x800a, 165}, - {0x800f, 165}, - {0x8018, 165}, - {0x801f, 165}, - {0x8029, 165}, - {0xc038, 165}, - {0x8003, 166}, - {0x8006, 166}, - {0x800a, 166}, - {0x800f, 166}, - {0x8018, 166}, - {0x801f, 166}, - {0x8029, 166}, - {0xc038, 166}, - }, - /* 165 */ - { - {0x8003, 168}, - {0x8006, 168}, - {0x800a, 168}, - {0x800f, 168}, - {0x8018, 168}, - {0x801f, 168}, - {0x8029, 168}, - {0xc038, 168}, - {0x8003, 174}, - {0x8006, 174}, - {0x800a, 174}, - {0x800f, 174}, - {0x8018, 174}, - {0x801f, 174}, - {0x8029, 174}, - {0xc038, 174}, - }, - /* 166 */ - { - {0x8002, 175}, - {0x8009, 175}, - {0x8017, 175}, - {0xc028, 175}, - {0x8002, 180}, - {0x8009, 180}, - {0x8017, 180}, - {0xc028, 180}, - {0x8002, 182}, - {0x8009, 182}, - {0x8017, 182}, - {0xc028, 182}, - {0x8002, 183}, - {0x8009, 183}, - {0x8017, 183}, - {0xc028, 183}, - }, - /* 167 */ - { - {0x8003, 175}, - {0x8006, 175}, - {0x800a, 175}, - {0x800f, 175}, - {0x8018, 175}, - {0x801f, 175}, - {0x8029, 175}, - {0xc038, 175}, - {0x8003, 180}, - {0x8006, 180}, - {0x800a, 180}, - {0x800f, 180}, - {0x8018, 180}, - {0x801f, 180}, - {0x8029, 180}, - {0xc038, 180}, - }, - /* 168 */ - { - {0x8003, 182}, - {0x8006, 182}, - {0x800a, 182}, - {0x800f, 182}, - {0x8018, 182}, - {0x801f, 182}, - {0x8029, 182}, - {0xc038, 182}, - {0x8003, 183}, - {0x8006, 183}, - {0x800a, 183}, - {0x800f, 183}, - {0x8018, 183}, - {0x801f, 183}, - {0x8029, 183}, - {0xc038, 183}, - }, - /* 169 */ - { - {0xc000, 188}, - {0xc000, 191}, - {0xc000, 197}, - {0xc000, 231}, - {0xc000, 239}, - {0xb0, 0}, - {0xb2, 0}, - {0xb3, 0}, - {0xb7, 0}, - {0xb8, 0}, - {0xba, 0}, - {0xbb, 0}, - {0xc0, 0}, - {0xc7, 0}, - {0xd0, 0}, - {0xdf, 0}, - }, - /* 170 */ - { - {0x8001, 188}, - {0xc016, 188}, - {0x8001, 191}, - {0xc016, 191}, - {0x8001, 197}, - {0xc016, 197}, - {0x8001, 231}, - {0xc016, 231}, - {0x8001, 239}, - {0xc016, 239}, - {0xc000, 9}, - {0xc000, 142}, - {0xc000, 144}, - {0xc000, 145}, - {0xc000, 148}, - {0xc000, 159}, - }, - /* 171 */ - { - {0x8002, 188}, - {0x8009, 188}, - {0x8017, 188}, - {0xc028, 188}, - {0x8002, 191}, - {0x8009, 191}, - {0x8017, 191}, - {0xc028, 191}, - {0x8002, 197}, - {0x8009, 197}, - {0x8017, 197}, - {0xc028, 197}, - {0x8002, 231}, - {0x8009, 231}, - {0x8017, 231}, - {0xc028, 231}, - }, - /* 172 */ - { - {0x8003, 188}, - {0x8006, 188}, - {0x800a, 188}, - {0x800f, 188}, - {0x8018, 188}, - {0x801f, 188}, - {0x8029, 188}, - {0xc038, 188}, - {0x8003, 191}, - {0x8006, 191}, - {0x800a, 191}, - {0x800f, 191}, - {0x8018, 191}, - {0x801f, 191}, - {0x8029, 191}, - {0xc038, 191}, - }, - /* 173 */ - { - {0x8003, 197}, - {0x8006, 197}, - {0x800a, 197}, - {0x800f, 197}, - {0x8018, 197}, - {0x801f, 197}, - {0x8029, 197}, - {0xc038, 197}, - {0x8003, 231}, - {0x8006, 231}, - {0x800a, 231}, - {0x800f, 231}, - {0x8018, 231}, - {0x801f, 231}, - {0x8029, 231}, - {0xc038, 231}, - }, - /* 174 */ - { - {0x8002, 239}, - {0x8009, 239}, - {0x8017, 239}, - {0xc028, 239}, - {0x8001, 9}, - {0xc016, 9}, - {0x8001, 142}, - {0xc016, 142}, - {0x8001, 144}, - {0xc016, 144}, - {0x8001, 145}, - {0xc016, 145}, - {0x8001, 148}, - {0xc016, 148}, - {0x8001, 159}, - {0xc016, 159}, - }, - /* 175 */ - { - {0x8003, 239}, - {0x8006, 239}, - {0x800a, 239}, - {0x800f, 239}, - {0x8018, 239}, - {0x801f, 239}, - {0x8029, 239}, - {0xc038, 239}, - {0x8002, 9}, - {0x8009, 9}, - {0x8017, 9}, - {0xc028, 9}, - {0x8002, 142}, - {0x8009, 142}, - {0x8017, 142}, - {0xc028, 142}, - }, - /* 176 */ - { - {0x8003, 9}, - {0x8006, 9}, - {0x800a, 9}, - {0x800f, 9}, - {0x8018, 9}, - {0x801f, 9}, - {0x8029, 9}, - {0xc038, 9}, - {0x8003, 142}, - {0x8006, 142}, - {0x800a, 142}, - {0x800f, 142}, - {0x8018, 142}, - {0x801f, 142}, - {0x8029, 142}, - {0xc038, 142}, - }, - /* 177 */ - { - {0x8002, 144}, - {0x8009, 144}, - {0x8017, 144}, - {0xc028, 144}, - {0x8002, 145}, - {0x8009, 145}, - {0x8017, 145}, - {0xc028, 145}, - {0x8002, 148}, - {0x8009, 148}, - {0x8017, 148}, - {0xc028, 148}, - {0x8002, 159}, - {0x8009, 159}, - {0x8017, 159}, - {0xc028, 159}, - }, - /* 178 */ - { - {0x8003, 144}, - {0x8006, 144}, - {0x800a, 144}, - {0x800f, 144}, - {0x8018, 144}, - {0x801f, 144}, - {0x8029, 144}, - {0xc038, 144}, - {0x8003, 145}, - {0x8006, 145}, - {0x800a, 145}, - {0x800f, 145}, - {0x8018, 145}, - {0x801f, 145}, - {0x8029, 145}, - {0xc038, 145}, - }, - /* 179 */ - { - {0x8003, 148}, - {0x8006, 148}, - {0x800a, 148}, - {0x800f, 148}, - {0x8018, 148}, - {0x801f, 148}, - {0x8029, 148}, - {0xc038, 148}, - {0x8003, 159}, - {0x8006, 159}, - {0x800a, 159}, - {0x800f, 159}, - {0x8018, 159}, - {0x801f, 159}, - {0x8029, 159}, - {0xc038, 159}, - }, - /* 180 */ - { - {0xc000, 171}, - {0xc000, 206}, - {0xc000, 215}, - {0xc000, 225}, - {0xc000, 236}, - {0xc000, 237}, - {0xbc, 0}, - {0xbd, 0}, - {0xc1, 0}, - {0xc4, 0}, - {0xc8, 0}, - {0xcb, 0}, - {0xd1, 0}, - {0xd8, 0}, - {0xe0, 0}, - {0xee, 0}, - }, - /* 181 */ - { - {0x8001, 171}, - {0xc016, 171}, - {0x8001, 206}, - {0xc016, 206}, - {0x8001, 215}, - {0xc016, 215}, - {0x8001, 225}, - {0xc016, 225}, - {0x8001, 236}, - {0xc016, 236}, - {0x8001, 237}, - {0xc016, 237}, - {0xc000, 199}, - {0xc000, 207}, - {0xc000, 234}, - {0xc000, 235}, - }, - /* 182 */ - { - {0x8002, 171}, - {0x8009, 171}, - {0x8017, 171}, - {0xc028, 171}, - {0x8002, 206}, - {0x8009, 206}, - {0x8017, 206}, - {0xc028, 206}, - {0x8002, 215}, - {0x8009, 215}, - {0x8017, 215}, - {0xc028, 215}, - {0x8002, 225}, - {0x8009, 225}, - {0x8017, 225}, - {0xc028, 225}, - }, - /* 183 */ - { - {0x8003, 171}, - {0x8006, 171}, - {0x800a, 171}, - {0x800f, 171}, - {0x8018, 171}, - {0x801f, 171}, - {0x8029, 171}, - {0xc038, 171}, - {0x8003, 206}, - {0x8006, 206}, - {0x800a, 206}, - {0x800f, 206}, - {0x8018, 206}, - {0x801f, 206}, - {0x8029, 206}, - {0xc038, 206}, - }, - /* 184 */ - { - {0x8003, 215}, - {0x8006, 215}, - {0x800a, 215}, - {0x800f, 215}, - {0x8018, 215}, - {0x801f, 215}, - {0x8029, 215}, - {0xc038, 215}, - {0x8003, 225}, - {0x8006, 225}, - {0x800a, 225}, - {0x800f, 225}, - {0x8018, 225}, - {0x801f, 225}, - {0x8029, 225}, - {0xc038, 225}, - }, - /* 185 */ - { - {0x8002, 236}, - {0x8009, 236}, - {0x8017, 236}, - {0xc028, 236}, - {0x8002, 237}, - {0x8009, 237}, - {0x8017, 237}, - {0xc028, 237}, - {0x8001, 199}, - {0xc016, 199}, - {0x8001, 207}, - {0xc016, 207}, - {0x8001, 234}, - {0xc016, 234}, - {0x8001, 235}, - {0xc016, 235}, - }, - /* 186 */ - { - {0x8003, 236}, - {0x8006, 236}, - {0x800a, 236}, - {0x800f, 236}, - {0x8018, 236}, - {0x801f, 236}, - {0x8029, 236}, - {0xc038, 236}, - {0x8003, 237}, - {0x8006, 237}, - {0x800a, 237}, - {0x800f, 237}, - {0x8018, 237}, - {0x801f, 237}, - {0x8029, 237}, - {0xc038, 237}, - }, - /* 187 */ - { - {0x8002, 199}, - {0x8009, 199}, - {0x8017, 199}, - {0xc028, 199}, - {0x8002, 207}, - {0x8009, 207}, - {0x8017, 207}, - {0xc028, 207}, - {0x8002, 234}, - {0x8009, 234}, - {0x8017, 234}, - {0xc028, 234}, - {0x8002, 235}, - {0x8009, 235}, - {0x8017, 235}, - {0xc028, 235}, - }, - /* 188 */ - { - {0x8003, 199}, - {0x8006, 199}, - {0x800a, 199}, - {0x800f, 199}, - {0x8018, 199}, - {0x801f, 199}, - {0x8029, 199}, - {0xc038, 199}, - {0x8003, 207}, - {0x8006, 207}, - {0x800a, 207}, - {0x800f, 207}, - {0x8018, 207}, - {0x801f, 207}, - {0x8029, 207}, - {0xc038, 207}, - }, - /* 189 */ - { - {0x8003, 234}, - {0x8006, 234}, - {0x800a, 234}, - {0x800f, 234}, - {0x8018, 234}, - {0x801f, 234}, - {0x8029, 234}, - {0xc038, 234}, - {0x8003, 235}, - {0x8006, 235}, - {0x800a, 235}, - {0x800f, 235}, - {0x8018, 235}, - {0x801f, 235}, - {0x8029, 235}, - {0xc038, 235}, - }, - /* 190 */ - { - {0xc2, 0}, - {0xc3, 0}, - {0xc5, 0}, - {0xc6, 0}, - {0xc9, 0}, - {0xca, 0}, - {0xcc, 0}, - {0xcd, 0}, - {0xd2, 0}, - {0xd5, 0}, - {0xd9, 0}, - {0xdc, 0}, - {0xe1, 0}, - {0xe7, 0}, - {0xef, 0}, - {0xf6, 0}, - }, - /* 191 */ - { - {0xc000, 192}, - {0xc000, 193}, - {0xc000, 200}, - {0xc000, 201}, - {0xc000, 202}, - {0xc000, 205}, - {0xc000, 210}, - {0xc000, 213}, - {0xc000, 218}, - {0xc000, 219}, - {0xc000, 238}, - {0xc000, 240}, - {0xc000, 242}, - {0xc000, 243}, - {0xc000, 255}, - {0xce, 0}, - }, - /* 192 */ - { - {0x8001, 192}, - {0xc016, 192}, - {0x8001, 193}, - {0xc016, 193}, - {0x8001, 200}, - {0xc016, 200}, - {0x8001, 201}, - {0xc016, 201}, - {0x8001, 202}, - {0xc016, 202}, - {0x8001, 205}, - {0xc016, 205}, - {0x8001, 210}, - {0xc016, 210}, - {0x8001, 213}, - {0xc016, 213}, - }, - /* 193 */ - { - {0x8002, 192}, - {0x8009, 192}, - {0x8017, 192}, - {0xc028, 192}, - {0x8002, 193}, - {0x8009, 193}, - {0x8017, 193}, - {0xc028, 193}, - {0x8002, 200}, - {0x8009, 200}, - {0x8017, 200}, - {0xc028, 200}, - {0x8002, 201}, - {0x8009, 201}, - {0x8017, 201}, - {0xc028, 201}, - }, - /* 194 */ - { - {0x8003, 192}, - {0x8006, 192}, - {0x800a, 192}, - {0x800f, 192}, - {0x8018, 192}, - {0x801f, 192}, - {0x8029, 192}, - {0xc038, 192}, - {0x8003, 193}, - {0x8006, 193}, - {0x800a, 193}, - {0x800f, 193}, - {0x8018, 193}, - {0x801f, 193}, - {0x8029, 193}, - {0xc038, 193}, - }, - /* 195 */ - { - {0x8003, 200}, - {0x8006, 200}, - {0x800a, 200}, - {0x800f, 200}, - {0x8018, 200}, - {0x801f, 200}, - {0x8029, 200}, - {0xc038, 200}, - {0x8003, 201}, - {0x8006, 201}, - {0x800a, 201}, - {0x800f, 201}, - {0x8018, 201}, - {0x801f, 201}, - {0x8029, 201}, - {0xc038, 201}, - }, - /* 196 */ - { - {0x8002, 202}, - {0x8009, 202}, - {0x8017, 202}, - {0xc028, 202}, - {0x8002, 205}, - {0x8009, 205}, - {0x8017, 205}, - {0xc028, 205}, - {0x8002, 210}, - {0x8009, 210}, - {0x8017, 210}, - {0xc028, 210}, - {0x8002, 213}, - {0x8009, 213}, - {0x8017, 213}, - {0xc028, 213}, - }, - /* 197 */ - { - {0x8003, 202}, - {0x8006, 202}, - {0x800a, 202}, - {0x800f, 202}, - {0x8018, 202}, - {0x801f, 202}, - {0x8029, 202}, - {0xc038, 202}, - {0x8003, 205}, - {0x8006, 205}, - {0x800a, 205}, - {0x800f, 205}, - {0x8018, 205}, - {0x801f, 205}, - {0x8029, 205}, - {0xc038, 205}, - }, - /* 198 */ - { - {0x8003, 210}, - {0x8006, 210}, - {0x800a, 210}, - {0x800f, 210}, - {0x8018, 210}, - {0x801f, 210}, - {0x8029, 210}, - {0xc038, 210}, - {0x8003, 213}, - {0x8006, 213}, - {0x800a, 213}, - {0x800f, 213}, - {0x8018, 213}, - {0x801f, 213}, - {0x8029, 213}, - {0xc038, 213}, - }, - /* 199 */ - { - {0x8001, 218}, - {0xc016, 218}, - {0x8001, 219}, - {0xc016, 219}, - {0x8001, 238}, - {0xc016, 238}, - {0x8001, 240}, - {0xc016, 240}, - {0x8001, 242}, - {0xc016, 242}, - {0x8001, 243}, - {0xc016, 243}, - {0x8001, 255}, - {0xc016, 255}, - {0xc000, 203}, - {0xc000, 204}, - }, - /* 200 */ - { - {0x8002, 218}, - {0x8009, 218}, - {0x8017, 218}, - {0xc028, 218}, - {0x8002, 219}, - {0x8009, 219}, - {0x8017, 219}, - {0xc028, 219}, - {0x8002, 238}, - {0x8009, 238}, - {0x8017, 238}, - {0xc028, 238}, - {0x8002, 240}, - {0x8009, 240}, - {0x8017, 240}, - {0xc028, 240}, - }, - /* 201 */ - { - {0x8003, 218}, - {0x8006, 218}, - {0x800a, 218}, - {0x800f, 218}, - {0x8018, 218}, - {0x801f, 218}, - {0x8029, 218}, - {0xc038, 218}, - {0x8003, 219}, - {0x8006, 219}, - {0x800a, 219}, - {0x800f, 219}, - {0x8018, 219}, - {0x801f, 219}, - {0x8029, 219}, - {0xc038, 219}, - }, - /* 202 */ - { - {0x8003, 238}, - {0x8006, 238}, - {0x800a, 238}, - {0x800f, 238}, - {0x8018, 238}, - {0x801f, 238}, - {0x8029, 238}, - {0xc038, 238}, - {0x8003, 240}, - {0x8006, 240}, - {0x800a, 240}, - {0x800f, 240}, - {0x8018, 240}, - {0x801f, 240}, - {0x8029, 240}, - {0xc038, 240}, - }, - /* 203 */ - { - {0x8002, 242}, - {0x8009, 242}, - {0x8017, 242}, - {0xc028, 242}, - {0x8002, 243}, - {0x8009, 243}, - {0x8017, 243}, - {0xc028, 243}, - {0x8002, 255}, - {0x8009, 255}, - {0x8017, 255}, - {0xc028, 255}, - {0x8001, 203}, - {0xc016, 203}, - {0x8001, 204}, - {0xc016, 204}, - }, - /* 204 */ - { - {0x8003, 242}, - {0x8006, 242}, - {0x800a, 242}, - {0x800f, 242}, - {0x8018, 242}, - {0x801f, 242}, - {0x8029, 242}, - {0xc038, 242}, - {0x8003, 243}, - {0x8006, 243}, - {0x800a, 243}, - {0x800f, 243}, - {0x8018, 243}, - {0x801f, 243}, - {0x8029, 243}, - {0xc038, 243}, - }, - /* 205 */ - { - {0x8003, 255}, - {0x8006, 255}, - {0x800a, 255}, - {0x800f, 255}, - {0x8018, 255}, - {0x801f, 255}, - {0x8029, 255}, - {0xc038, 255}, - {0x8002, 203}, - {0x8009, 203}, - {0x8017, 203}, - {0xc028, 203}, - {0x8002, 204}, - {0x8009, 204}, - {0x8017, 204}, - {0xc028, 204}, - }, - /* 206 */ - { - {0x8003, 203}, - {0x8006, 203}, - {0x800a, 203}, - {0x800f, 203}, - {0x8018, 203}, - {0x801f, 203}, - {0x8029, 203}, - {0xc038, 203}, - {0x8003, 204}, - {0x8006, 204}, - {0x800a, 204}, - {0x800f, 204}, - {0x8018, 204}, - {0x801f, 204}, - {0x8029, 204}, - {0xc038, 204}, - }, - /* 207 */ - { - {0xd3, 0}, - {0xd4, 0}, - {0xd6, 0}, - {0xd7, 0}, - {0xda, 0}, - {0xdb, 0}, - {0xdd, 0}, - {0xde, 0}, - {0xe2, 0}, - {0xe4, 0}, - {0xe8, 0}, - {0xeb, 0}, - {0xf0, 0}, - {0xf3, 0}, - {0xf7, 0}, - {0xfa, 0}, - }, - /* 208 */ - { - {0xc000, 211}, - {0xc000, 212}, - {0xc000, 214}, - {0xc000, 221}, - {0xc000, 222}, - {0xc000, 223}, - {0xc000, 241}, - {0xc000, 244}, - {0xc000, 245}, - {0xc000, 246}, - {0xc000, 247}, - {0xc000, 248}, - {0xc000, 250}, - {0xc000, 251}, - {0xc000, 252}, - {0xc000, 253}, - }, - /* 209 */ - { - {0x8001, 211}, - {0xc016, 211}, - {0x8001, 212}, - {0xc016, 212}, - {0x8001, 214}, - {0xc016, 214}, - {0x8001, 221}, - {0xc016, 221}, - {0x8001, 222}, - {0xc016, 222}, - {0x8001, 223}, - {0xc016, 223}, - {0x8001, 241}, - {0xc016, 241}, - {0x8001, 244}, - {0xc016, 244}, - }, - /* 210 */ - { - {0x8002, 211}, - {0x8009, 211}, - {0x8017, 211}, - {0xc028, 211}, - {0x8002, 212}, - {0x8009, 212}, - {0x8017, 212}, - {0xc028, 212}, - {0x8002, 214}, - {0x8009, 214}, - {0x8017, 214}, - {0xc028, 214}, - {0x8002, 221}, - {0x8009, 221}, - {0x8017, 221}, - {0xc028, 221}, - }, - /* 211 */ - { - {0x8003, 211}, - {0x8006, 211}, - {0x800a, 211}, - {0x800f, 211}, - {0x8018, 211}, - {0x801f, 211}, - {0x8029, 211}, - {0xc038, 211}, - {0x8003, 212}, - {0x8006, 212}, - {0x800a, 212}, - {0x800f, 212}, - {0x8018, 212}, - {0x801f, 212}, - {0x8029, 212}, - {0xc038, 212}, - }, - /* 212 */ - { - {0x8003, 214}, - {0x8006, 214}, - {0x800a, 214}, - {0x800f, 214}, - {0x8018, 214}, - {0x801f, 214}, - {0x8029, 214}, - {0xc038, 214}, - {0x8003, 221}, - {0x8006, 221}, - {0x800a, 221}, - {0x800f, 221}, - {0x8018, 221}, - {0x801f, 221}, - {0x8029, 221}, - {0xc038, 221}, - }, - /* 213 */ - { - {0x8002, 222}, - {0x8009, 222}, - {0x8017, 222}, - {0xc028, 222}, - {0x8002, 223}, - {0x8009, 223}, - {0x8017, 223}, - {0xc028, 223}, - {0x8002, 241}, - {0x8009, 241}, - {0x8017, 241}, - {0xc028, 241}, - {0x8002, 244}, - {0x8009, 244}, - {0x8017, 244}, - {0xc028, 244}, - }, - /* 214 */ - { - {0x8003, 222}, - {0x8006, 222}, - {0x800a, 222}, - {0x800f, 222}, - {0x8018, 222}, - {0x801f, 222}, - {0x8029, 222}, - {0xc038, 222}, - {0x8003, 223}, - {0x8006, 223}, - {0x800a, 223}, - {0x800f, 223}, - {0x8018, 223}, - {0x801f, 223}, - {0x8029, 223}, - {0xc038, 223}, - }, - /* 215 */ - { - {0x8003, 241}, - {0x8006, 241}, - {0x800a, 241}, - {0x800f, 241}, - {0x8018, 241}, - {0x801f, 241}, - {0x8029, 241}, - {0xc038, 241}, - {0x8003, 244}, - {0x8006, 244}, - {0x800a, 244}, - {0x800f, 244}, - {0x8018, 244}, - {0x801f, 244}, - {0x8029, 244}, - {0xc038, 244}, - }, - /* 216 */ - { - {0x8001, 245}, - {0xc016, 245}, - {0x8001, 246}, - {0xc016, 246}, - {0x8001, 247}, - {0xc016, 247}, - {0x8001, 248}, - {0xc016, 248}, - {0x8001, 250}, - {0xc016, 250}, - {0x8001, 251}, - {0xc016, 251}, - {0x8001, 252}, - {0xc016, 252}, - {0x8001, 253}, - {0xc016, 253}, - }, - /* 217 */ - { - {0x8002, 245}, - {0x8009, 245}, - {0x8017, 245}, - {0xc028, 245}, - {0x8002, 246}, - {0x8009, 246}, - {0x8017, 246}, - {0xc028, 246}, - {0x8002, 247}, - {0x8009, 247}, - {0x8017, 247}, - {0xc028, 247}, - {0x8002, 248}, - {0x8009, 248}, - {0x8017, 248}, - {0xc028, 248}, - }, - /* 218 */ - { - {0x8003, 245}, - {0x8006, 245}, - {0x800a, 245}, - {0x800f, 245}, - {0x8018, 245}, - {0x801f, 245}, - {0x8029, 245}, - {0xc038, 245}, - {0x8003, 246}, - {0x8006, 246}, - {0x800a, 246}, - {0x800f, 246}, - {0x8018, 246}, - {0x801f, 246}, - {0x8029, 246}, - {0xc038, 246}, - }, - /* 219 */ - { - {0x8003, 247}, - {0x8006, 247}, - {0x800a, 247}, - {0x800f, 247}, - {0x8018, 247}, - {0x801f, 247}, - {0x8029, 247}, - {0xc038, 247}, - {0x8003, 248}, - {0x8006, 248}, - {0x800a, 248}, - {0x800f, 248}, - {0x8018, 248}, - {0x801f, 248}, - {0x8029, 248}, - {0xc038, 248}, - }, - /* 220 */ - { - {0x8002, 250}, - {0x8009, 250}, - {0x8017, 250}, - {0xc028, 250}, - {0x8002, 251}, - {0x8009, 251}, - {0x8017, 251}, - {0xc028, 251}, - {0x8002, 252}, - {0x8009, 252}, - {0x8017, 252}, - {0xc028, 252}, - {0x8002, 253}, - {0x8009, 253}, - {0x8017, 253}, - {0xc028, 253}, - }, - /* 221 */ - { - {0x8003, 250}, - {0x8006, 250}, - {0x800a, 250}, - {0x800f, 250}, - {0x8018, 250}, - {0x801f, 250}, - {0x8029, 250}, - {0xc038, 250}, - {0x8003, 251}, - {0x8006, 251}, - {0x800a, 251}, - {0x800f, 251}, - {0x8018, 251}, - {0x801f, 251}, - {0x8029, 251}, - {0xc038, 251}, - }, - /* 222 */ - { - {0x8003, 252}, - {0x8006, 252}, - {0x800a, 252}, - {0x800f, 252}, - {0x8018, 252}, - {0x801f, 252}, - {0x8029, 252}, - {0xc038, 252}, - {0x8003, 253}, - {0x8006, 253}, - {0x800a, 253}, - {0x800f, 253}, - {0x8018, 253}, - {0x801f, 253}, - {0x8029, 253}, - {0xc038, 253}, - }, - /* 223 */ - { - {0xc000, 254}, - {0xe3, 0}, - {0xe5, 0}, - {0xe6, 0}, - {0xe9, 0}, - {0xea, 0}, - {0xec, 0}, - {0xed, 0}, - {0xf1, 0}, - {0xf2, 0}, - {0xf4, 0}, - {0xf5, 0}, - {0xf8, 0}, - {0xf9, 0}, - {0xfb, 0}, - {0xfc, 0}, - }, - /* 224 */ - { - {0x8001, 254}, - {0xc016, 254}, - {0xc000, 2}, - {0xc000, 3}, - {0xc000, 4}, - {0xc000, 5}, - {0xc000, 6}, - {0xc000, 7}, - {0xc000, 8}, - {0xc000, 11}, - {0xc000, 12}, - {0xc000, 14}, - {0xc000, 15}, - {0xc000, 16}, - {0xc000, 17}, - {0xc000, 18}, - }, - /* 225 */ - { - {0x8002, 254}, - {0x8009, 254}, - {0x8017, 254}, - {0xc028, 254}, - {0x8001, 2}, - {0xc016, 2}, - {0x8001, 3}, - {0xc016, 3}, - {0x8001, 4}, - {0xc016, 4}, - {0x8001, 5}, - {0xc016, 5}, - {0x8001, 6}, - {0xc016, 6}, - {0x8001, 7}, - {0xc016, 7}, - }, - /* 226 */ - { - {0x8003, 254}, - {0x8006, 254}, - {0x800a, 254}, - {0x800f, 254}, - {0x8018, 254}, - {0x801f, 254}, - {0x8029, 254}, - {0xc038, 254}, - {0x8002, 2}, - {0x8009, 2}, - {0x8017, 2}, - {0xc028, 2}, - {0x8002, 3}, - {0x8009, 3}, - {0x8017, 3}, - {0xc028, 3}, - }, - /* 227 */ - { - {0x8003, 2}, - {0x8006, 2}, - {0x800a, 2}, - {0x800f, 2}, - {0x8018, 2}, - {0x801f, 2}, - {0x8029, 2}, - {0xc038, 2}, - {0x8003, 3}, - {0x8006, 3}, - {0x800a, 3}, - {0x800f, 3}, - {0x8018, 3}, - {0x801f, 3}, - {0x8029, 3}, - {0xc038, 3}, - }, - /* 228 */ - { - {0x8002, 4}, - {0x8009, 4}, - {0x8017, 4}, - {0xc028, 4}, - {0x8002, 5}, - {0x8009, 5}, - {0x8017, 5}, - {0xc028, 5}, - {0x8002, 6}, - {0x8009, 6}, - {0x8017, 6}, - {0xc028, 6}, - {0x8002, 7}, - {0x8009, 7}, - {0x8017, 7}, - {0xc028, 7}, - }, - /* 229 */ - { - {0x8003, 4}, - {0x8006, 4}, - {0x800a, 4}, - {0x800f, 4}, - {0x8018, 4}, - {0x801f, 4}, - {0x8029, 4}, - {0xc038, 4}, - {0x8003, 5}, - {0x8006, 5}, - {0x800a, 5}, - {0x800f, 5}, - {0x8018, 5}, - {0x801f, 5}, - {0x8029, 5}, - {0xc038, 5}, - }, - /* 230 */ - { - {0x8003, 6}, - {0x8006, 6}, - {0x800a, 6}, - {0x800f, 6}, - {0x8018, 6}, - {0x801f, 6}, - {0x8029, 6}, - {0xc038, 6}, - {0x8003, 7}, - {0x8006, 7}, - {0x800a, 7}, - {0x800f, 7}, - {0x8018, 7}, - {0x801f, 7}, - {0x8029, 7}, - {0xc038, 7}, - }, - /* 231 */ - { - {0x8001, 8}, - {0xc016, 8}, - {0x8001, 11}, - {0xc016, 11}, - {0x8001, 12}, - {0xc016, 12}, - {0x8001, 14}, - {0xc016, 14}, - {0x8001, 15}, - {0xc016, 15}, - {0x8001, 16}, - {0xc016, 16}, - {0x8001, 17}, - {0xc016, 17}, - {0x8001, 18}, - {0xc016, 18}, - }, - /* 232 */ - { - {0x8002, 8}, - {0x8009, 8}, - {0x8017, 8}, - {0xc028, 8}, - {0x8002, 11}, - {0x8009, 11}, - {0x8017, 11}, - {0xc028, 11}, - {0x8002, 12}, - {0x8009, 12}, - {0x8017, 12}, - {0xc028, 12}, - {0x8002, 14}, - {0x8009, 14}, - {0x8017, 14}, - {0xc028, 14}, - }, - /* 233 */ - { - {0x8003, 8}, - {0x8006, 8}, - {0x800a, 8}, - {0x800f, 8}, - {0x8018, 8}, - {0x801f, 8}, - {0x8029, 8}, - {0xc038, 8}, - {0x8003, 11}, - {0x8006, 11}, - {0x800a, 11}, - {0x800f, 11}, - {0x8018, 11}, - {0x801f, 11}, - {0x8029, 11}, - {0xc038, 11}, - }, - /* 234 */ - { - {0x8003, 12}, - {0x8006, 12}, - {0x800a, 12}, - {0x800f, 12}, - {0x8018, 12}, - {0x801f, 12}, - {0x8029, 12}, - {0xc038, 12}, - {0x8003, 14}, - {0x8006, 14}, - {0x800a, 14}, - {0x800f, 14}, - {0x8018, 14}, - {0x801f, 14}, - {0x8029, 14}, - {0xc038, 14}, - }, - /* 235 */ - { - {0x8002, 15}, - {0x8009, 15}, - {0x8017, 15}, - {0xc028, 15}, - {0x8002, 16}, - {0x8009, 16}, - {0x8017, 16}, - {0xc028, 16}, - {0x8002, 17}, - {0x8009, 17}, - {0x8017, 17}, - {0xc028, 17}, - {0x8002, 18}, - {0x8009, 18}, - {0x8017, 18}, - {0xc028, 18}, - }, - /* 236 */ - { - {0x8003, 15}, - {0x8006, 15}, - {0x800a, 15}, - {0x800f, 15}, - {0x8018, 15}, - {0x801f, 15}, - {0x8029, 15}, - {0xc038, 15}, - {0x8003, 16}, - {0x8006, 16}, - {0x800a, 16}, - {0x800f, 16}, - {0x8018, 16}, - {0x801f, 16}, - {0x8029, 16}, - {0xc038, 16}, - }, - /* 237 */ - { - {0x8003, 17}, - {0x8006, 17}, - {0x800a, 17}, - {0x800f, 17}, - {0x8018, 17}, - {0x801f, 17}, - {0x8029, 17}, - {0xc038, 17}, - {0x8003, 18}, - {0x8006, 18}, - {0x800a, 18}, - {0x800f, 18}, - {0x8018, 18}, - {0x801f, 18}, - {0x8029, 18}, - {0xc038, 18}, - }, - /* 238 */ - { - {0xc000, 19}, - {0xc000, 20}, - {0xc000, 21}, - {0xc000, 23}, - {0xc000, 24}, - {0xc000, 25}, - {0xc000, 26}, - {0xc000, 27}, - {0xc000, 28}, - {0xc000, 29}, - {0xc000, 30}, - {0xc000, 31}, - {0xc000, 127}, - {0xc000, 220}, - {0xc000, 249}, - {0xfd, 0}, - }, - /* 239 */ - { - {0x8001, 19}, - {0xc016, 19}, - {0x8001, 20}, - {0xc016, 20}, - {0x8001, 21}, - {0xc016, 21}, - {0x8001, 23}, - {0xc016, 23}, - {0x8001, 24}, - {0xc016, 24}, - {0x8001, 25}, - {0xc016, 25}, - {0x8001, 26}, - {0xc016, 26}, - {0x8001, 27}, - {0xc016, 27}, - }, - /* 240 */ - { - {0x8002, 19}, - {0x8009, 19}, - {0x8017, 19}, - {0xc028, 19}, - {0x8002, 20}, - {0x8009, 20}, - {0x8017, 20}, - {0xc028, 20}, - {0x8002, 21}, - {0x8009, 21}, - {0x8017, 21}, - {0xc028, 21}, - {0x8002, 23}, - {0x8009, 23}, - {0x8017, 23}, - {0xc028, 23}, - }, - /* 241 */ - { - {0x8003, 19}, - {0x8006, 19}, - {0x800a, 19}, - {0x800f, 19}, - {0x8018, 19}, - {0x801f, 19}, - {0x8029, 19}, - {0xc038, 19}, - {0x8003, 20}, - {0x8006, 20}, - {0x800a, 20}, - {0x800f, 20}, - {0x8018, 20}, - {0x801f, 20}, - {0x8029, 20}, - {0xc038, 20}, - }, - /* 242 */ - { - {0x8003, 21}, - {0x8006, 21}, - {0x800a, 21}, - {0x800f, 21}, - {0x8018, 21}, - {0x801f, 21}, - {0x8029, 21}, - {0xc038, 21}, - {0x8003, 23}, - {0x8006, 23}, - {0x800a, 23}, - {0x800f, 23}, - {0x8018, 23}, - {0x801f, 23}, - {0x8029, 23}, - {0xc038, 23}, - }, - /* 243 */ - { - {0x8002, 24}, - {0x8009, 24}, - {0x8017, 24}, - {0xc028, 24}, - {0x8002, 25}, - {0x8009, 25}, - {0x8017, 25}, - {0xc028, 25}, - {0x8002, 26}, - {0x8009, 26}, - {0x8017, 26}, - {0xc028, 26}, - {0x8002, 27}, - {0x8009, 27}, - {0x8017, 27}, - {0xc028, 27}, - }, - /* 244 */ - { - {0x8003, 24}, - {0x8006, 24}, - {0x800a, 24}, - {0x800f, 24}, - {0x8018, 24}, - {0x801f, 24}, - {0x8029, 24}, - {0xc038, 24}, - {0x8003, 25}, - {0x8006, 25}, - {0x800a, 25}, - {0x800f, 25}, - {0x8018, 25}, - {0x801f, 25}, - {0x8029, 25}, - {0xc038, 25}, - }, - /* 245 */ - { - {0x8003, 26}, - {0x8006, 26}, - {0x800a, 26}, - {0x800f, 26}, - {0x8018, 26}, - {0x801f, 26}, - {0x8029, 26}, - {0xc038, 26}, - {0x8003, 27}, - {0x8006, 27}, - {0x800a, 27}, - {0x800f, 27}, - {0x8018, 27}, - {0x801f, 27}, - {0x8029, 27}, - {0xc038, 27}, - }, - /* 246 */ - { - {0x8001, 28}, - {0xc016, 28}, - {0x8001, 29}, - {0xc016, 29}, - {0x8001, 30}, - {0xc016, 30}, - {0x8001, 31}, - {0xc016, 31}, - {0x8001, 127}, - {0xc016, 127}, - {0x8001, 220}, - {0xc016, 220}, - {0x8001, 249}, - {0xc016, 249}, - {0xfe, 0}, - {0xff, 0}, - }, - /* 247 */ - { - {0x8002, 28}, - {0x8009, 28}, - {0x8017, 28}, - {0xc028, 28}, - {0x8002, 29}, - {0x8009, 29}, - {0x8017, 29}, - {0xc028, 29}, - {0x8002, 30}, - {0x8009, 30}, - {0x8017, 30}, - {0xc028, 30}, - {0x8002, 31}, - {0x8009, 31}, - {0x8017, 31}, - {0xc028, 31}, - }, - /* 248 */ - { - {0x8003, 28}, - {0x8006, 28}, - {0x800a, 28}, - {0x800f, 28}, - {0x8018, 28}, - {0x801f, 28}, - {0x8029, 28}, - {0xc038, 28}, - {0x8003, 29}, - {0x8006, 29}, - {0x800a, 29}, - {0x800f, 29}, - {0x8018, 29}, - {0x801f, 29}, - {0x8029, 29}, - {0xc038, 29}, - }, - /* 249 */ - { - {0x8003, 30}, - {0x8006, 30}, - {0x800a, 30}, - {0x800f, 30}, - {0x8018, 30}, - {0x801f, 30}, - {0x8029, 30}, - {0xc038, 30}, - {0x8003, 31}, - {0x8006, 31}, - {0x800a, 31}, - {0x800f, 31}, - {0x8018, 31}, - {0x801f, 31}, - {0x8029, 31}, - {0xc038, 31}, - }, - /* 250 */ - { - {0x8002, 127}, - {0x8009, 127}, - {0x8017, 127}, - {0xc028, 127}, - {0x8002, 220}, - {0x8009, 220}, - {0x8017, 220}, - {0xc028, 220}, - {0x8002, 249}, - {0x8009, 249}, - {0x8017, 249}, - {0xc028, 249}, - {0xc000, 10}, - {0xc000, 13}, - {0xc000, 22}, - {0x100, 0}, - }, - /* 251 */ - { - {0x8003, 127}, - {0x8006, 127}, - {0x800a, 127}, - {0x800f, 127}, - {0x8018, 127}, - {0x801f, 127}, - {0x8029, 127}, - {0xc038, 127}, - {0x8003, 220}, - {0x8006, 220}, - {0x800a, 220}, - {0x800f, 220}, - {0x8018, 220}, - {0x801f, 220}, - {0x8029, 220}, - {0xc038, 220}, - }, - /* 252 */ - { - {0x8003, 249}, - {0x8006, 249}, - {0x800a, 249}, - {0x800f, 249}, - {0x8018, 249}, - {0x801f, 249}, - {0x8029, 249}, - {0xc038, 249}, - {0x8001, 10}, - {0xc016, 10}, - {0x8001, 13}, - {0xc016, 13}, - {0x8001, 22}, - {0xc016, 22}, - {0x100, 0}, - {0x100, 0}, - }, - /* 253 */ - { - {0x8002, 10}, - {0x8009, 10}, - {0x8017, 10}, - {0xc028, 10}, - {0x8002, 13}, - {0x8009, 13}, - {0x8017, 13}, - {0xc028, 13}, - {0x8002, 22}, - {0x8009, 22}, - {0x8017, 22}, - {0xc028, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 254 */ - { - {0x8003, 10}, - {0x8006, 10}, - {0x800a, 10}, - {0x800f, 10}, - {0x8018, 10}, - {0x801f, 10}, - {0x8029, 10}, - {0xc038, 10}, - {0x8003, 13}, - {0x8006, 13}, - {0x800a, 13}, - {0x800f, 13}, - {0x8018, 13}, - {0x801f, 13}, - {0x8029, 13}, - {0xc038, 13}, - }, - /* 255 */ - { - {0x8003, 22}, - {0x8006, 22}, - {0x800a, 22}, - {0x800f, 22}, - {0x8018, 22}, - {0x801f, 22}, - {0x8029, 22}, - {0xc038, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 256 */ - { - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, + /* 0 */ + { + {0x04, 0}, + {0x05, 0}, + {0x07, 0}, + {0x08, 0}, + {0x0b, 0}, + {0x0c, 0}, + {0x10, 0}, + {0x13, 0}, + {0x19, 0}, + {0x1c, 0}, + {0x20, 0}, + {0x23, 0}, + {0x2a, 0}, + {0x31, 0}, + {0x39, 0}, + {0x4040, 0}, + }, + /* 1 */ + { + {0xc000, 48}, + {0xc000, 49}, + {0xc000, 50}, + {0xc000, 97}, + {0xc000, 99}, + {0xc000, 101}, + {0xc000, 105}, + {0xc000, 111}, + {0xc000, 115}, + {0xc000, 116}, + {0x0d, 0}, + {0x0e, 0}, + {0x11, 0}, + {0x12, 0}, + {0x14, 0}, + {0x15, 0}, + }, + /* 2 */ + { + {0x8001, 48}, + {0xc016, 48}, + {0x8001, 49}, + {0xc016, 49}, + {0x8001, 50}, + {0xc016, 50}, + {0x8001, 97}, + {0xc016, 97}, + {0x8001, 99}, + {0xc016, 99}, + {0x8001, 101}, + {0xc016, 101}, + {0x8001, 105}, + {0xc016, 105}, + {0x8001, 111}, + {0xc016, 111}, + }, + /* 3 */ + { + {0x8002, 48}, + {0x8009, 48}, + {0x8017, 48}, + {0xc028, 48}, + {0x8002, 49}, + {0x8009, 49}, + {0x8017, 49}, + {0xc028, 49}, + {0x8002, 50}, + {0x8009, 50}, + {0x8017, 50}, + {0xc028, 50}, + {0x8002, 97}, + {0x8009, 97}, + {0x8017, 97}, + {0xc028, 97}, + }, + /* 4 */ + { + {0x8003, 48}, + {0x8006, 48}, + {0x800a, 48}, + {0x800f, 48}, + {0x8018, 48}, + {0x801f, 48}, + {0x8029, 48}, + {0xc038, 48}, + {0x8003, 49}, + {0x8006, 49}, + {0x800a, 49}, + {0x800f, 49}, + {0x8018, 49}, + {0x801f, 49}, + {0x8029, 49}, + {0xc038, 49}, + }, + /* 5 */ + { + {0x8003, 50}, + {0x8006, 50}, + {0x800a, 50}, + {0x800f, 50}, + {0x8018, 50}, + {0x801f, 50}, + {0x8029, 50}, + {0xc038, 50}, + {0x8003, 97}, + {0x8006, 97}, + {0x800a, 97}, + {0x800f, 97}, + {0x8018, 97}, + {0x801f, 97}, + {0x8029, 97}, + {0xc038, 97}, + }, + /* 6 */ + { + {0x8002, 99}, + {0x8009, 99}, + {0x8017, 99}, + {0xc028, 99}, + {0x8002, 101}, + {0x8009, 101}, + {0x8017, 101}, + {0xc028, 101}, + {0x8002, 105}, + {0x8009, 105}, + {0x8017, 105}, + {0xc028, 105}, + {0x8002, 111}, + {0x8009, 111}, + {0x8017, 111}, + {0xc028, 111}, + }, + /* 7 */ + { + {0x8003, 99}, + {0x8006, 99}, + {0x800a, 99}, + {0x800f, 99}, + {0x8018, 99}, + {0x801f, 99}, + {0x8029, 99}, + {0xc038, 99}, + {0x8003, 101}, + {0x8006, 101}, + {0x800a, 101}, + {0x800f, 101}, + {0x8018, 101}, + {0x801f, 101}, + {0x8029, 101}, + {0xc038, 101}, + }, + /* 8 */ + { + {0x8003, 105}, + {0x8006, 105}, + {0x800a, 105}, + {0x800f, 105}, + {0x8018, 105}, + {0x801f, 105}, + {0x8029, 105}, + {0xc038, 105}, + {0x8003, 111}, + {0x8006, 111}, + {0x800a, 111}, + {0x800f, 111}, + {0x8018, 111}, + {0x801f, 111}, + {0x8029, 111}, + {0xc038, 111}, + }, + /* 9 */ + { + {0x8001, 115}, + {0xc016, 115}, + {0x8001, 116}, + {0xc016, 116}, + {0xc000, 32}, + {0xc000, 37}, + {0xc000, 45}, + {0xc000, 46}, + {0xc000, 47}, + {0xc000, 51}, + {0xc000, 52}, + {0xc000, 53}, + {0xc000, 54}, + {0xc000, 55}, + {0xc000, 56}, + {0xc000, 57}, + }, + /* 10 */ + { + {0x8002, 115}, + {0x8009, 115}, + {0x8017, 115}, + {0xc028, 115}, + {0x8002, 116}, + {0x8009, 116}, + {0x8017, 116}, + {0xc028, 116}, + {0x8001, 32}, + {0xc016, 32}, + {0x8001, 37}, + {0xc016, 37}, + {0x8001, 45}, + {0xc016, 45}, + {0x8001, 46}, + {0xc016, 46}, + }, + /* 11 */ + { + {0x8003, 115}, + {0x8006, 115}, + {0x800a, 115}, + {0x800f, 115}, + {0x8018, 115}, + {0x801f, 115}, + {0x8029, 115}, + {0xc038, 115}, + {0x8003, 116}, + {0x8006, 116}, + {0x800a, 116}, + {0x800f, 116}, + {0x8018, 116}, + {0x801f, 116}, + {0x8029, 116}, + {0xc038, 116}, + }, + /* 12 */ + { + {0x8002, 32}, + {0x8009, 32}, + {0x8017, 32}, + {0xc028, 32}, + {0x8002, 37}, + {0x8009, 37}, + {0x8017, 37}, + {0xc028, 37}, + {0x8002, 45}, + {0x8009, 45}, + {0x8017, 45}, + {0xc028, 45}, + {0x8002, 46}, + {0x8009, 46}, + {0x8017, 46}, + {0xc028, 46}, + }, + /* 13 */ + { + {0x8003, 32}, + {0x8006, 32}, + {0x800a, 32}, + {0x800f, 32}, + {0x8018, 32}, + {0x801f, 32}, + {0x8029, 32}, + {0xc038, 32}, + {0x8003, 37}, + {0x8006, 37}, + {0x800a, 37}, + {0x800f, 37}, + {0x8018, 37}, + {0x801f, 37}, + {0x8029, 37}, + {0xc038, 37}, + }, + /* 14 */ + { + {0x8003, 45}, + {0x8006, 45}, + {0x800a, 45}, + {0x800f, 45}, + {0x8018, 45}, + {0x801f, 45}, + {0x8029, 45}, + {0xc038, 45}, + {0x8003, 46}, + {0x8006, 46}, + {0x800a, 46}, + {0x800f, 46}, + {0x8018, 46}, + {0x801f, 46}, + {0x8029, 46}, + {0xc038, 46}, + }, + /* 15 */ + { + {0x8001, 47}, + {0xc016, 47}, + {0x8001, 51}, + {0xc016, 51}, + {0x8001, 52}, + {0xc016, 52}, + {0x8001, 53}, + {0xc016, 53}, + {0x8001, 54}, + {0xc016, 54}, + {0x8001, 55}, + {0xc016, 55}, + {0x8001, 56}, + {0xc016, 56}, + {0x8001, 57}, + {0xc016, 57}, + }, + /* 16 */ + { + {0x8002, 47}, + {0x8009, 47}, + {0x8017, 47}, + {0xc028, 47}, + {0x8002, 51}, + {0x8009, 51}, + {0x8017, 51}, + {0xc028, 51}, + {0x8002, 52}, + {0x8009, 52}, + {0x8017, 52}, + {0xc028, 52}, + {0x8002, 53}, + {0x8009, 53}, + {0x8017, 53}, + {0xc028, 53}, + }, + /* 17 */ + { + {0x8003, 47}, + {0x8006, 47}, + {0x800a, 47}, + {0x800f, 47}, + {0x8018, 47}, + {0x801f, 47}, + {0x8029, 47}, + {0xc038, 47}, + {0x8003, 51}, + {0x8006, 51}, + {0x800a, 51}, + {0x800f, 51}, + {0x8018, 51}, + {0x801f, 51}, + {0x8029, 51}, + {0xc038, 51}, + }, + /* 18 */ + { + {0x8003, 52}, + {0x8006, 52}, + {0x800a, 52}, + {0x800f, 52}, + {0x8018, 52}, + {0x801f, 52}, + {0x8029, 52}, + {0xc038, 52}, + {0x8003, 53}, + {0x8006, 53}, + {0x800a, 53}, + {0x800f, 53}, + {0x8018, 53}, + {0x801f, 53}, + {0x8029, 53}, + {0xc038, 53}, + }, + /* 19 */ + { + {0x8002, 54}, + {0x8009, 54}, + {0x8017, 54}, + {0xc028, 54}, + {0x8002, 55}, + {0x8009, 55}, + {0x8017, 55}, + {0xc028, 55}, + {0x8002, 56}, + {0x8009, 56}, + {0x8017, 56}, + {0xc028, 56}, + {0x8002, 57}, + {0x8009, 57}, + {0x8017, 57}, + {0xc028, 57}, + }, + /* 20 */ + { + {0x8003, 54}, + {0x8006, 54}, + {0x800a, 54}, + {0x800f, 54}, + {0x8018, 54}, + {0x801f, 54}, + {0x8029, 54}, + {0xc038, 54}, + {0x8003, 55}, + {0x8006, 55}, + {0x800a, 55}, + {0x800f, 55}, + {0x8018, 55}, + {0x801f, 55}, + {0x8029, 55}, + {0xc038, 55}, + }, + /* 21 */ + { + {0x8003, 56}, + {0x8006, 56}, + {0x800a, 56}, + {0x800f, 56}, + {0x8018, 56}, + {0x801f, 56}, + {0x8029, 56}, + {0xc038, 56}, + {0x8003, 57}, + {0x8006, 57}, + {0x800a, 57}, + {0x800f, 57}, + {0x8018, 57}, + {0x801f, 57}, + {0x8029, 57}, + {0xc038, 57}, + }, + /* 22 */ + { + {0x1a, 0}, + {0x1b, 0}, + {0x1d, 0}, + {0x1e, 0}, + {0x21, 0}, + {0x22, 0}, + {0x24, 0}, + {0x25, 0}, + {0x2b, 0}, + {0x2e, 0}, + {0x32, 0}, + {0x35, 0}, + {0x3a, 0}, + {0x3d, 0}, + {0x41, 0}, + {0x4044, 0}, + }, + /* 23 */ + { + {0xc000, 61}, + {0xc000, 65}, + {0xc000, 95}, + {0xc000, 98}, + {0xc000, 100}, + {0xc000, 102}, + {0xc000, 103}, + {0xc000, 104}, + {0xc000, 108}, + {0xc000, 109}, + {0xc000, 110}, + {0xc000, 112}, + {0xc000, 114}, + {0xc000, 117}, + {0x26, 0}, + {0x27, 0}, + }, + /* 24 */ + { + {0x8001, 61}, + {0xc016, 61}, + {0x8001, 65}, + {0xc016, 65}, + {0x8001, 95}, + {0xc016, 95}, + {0x8001, 98}, + {0xc016, 98}, + {0x8001, 100}, + {0xc016, 100}, + {0x8001, 102}, + {0xc016, 102}, + {0x8001, 103}, + {0xc016, 103}, + {0x8001, 104}, + {0xc016, 104}, + }, + /* 25 */ + { + {0x8002, 61}, + {0x8009, 61}, + {0x8017, 61}, + {0xc028, 61}, + {0x8002, 65}, + {0x8009, 65}, + {0x8017, 65}, + {0xc028, 65}, + {0x8002, 95}, + {0x8009, 95}, + {0x8017, 95}, + {0xc028, 95}, + {0x8002, 98}, + {0x8009, 98}, + {0x8017, 98}, + {0xc028, 98}, + }, + /* 26 */ + { + {0x8003, 61}, + {0x8006, 61}, + {0x800a, 61}, + {0x800f, 61}, + {0x8018, 61}, + {0x801f, 61}, + {0x8029, 61}, + {0xc038, 61}, + {0x8003, 65}, + {0x8006, 65}, + {0x800a, 65}, + {0x800f, 65}, + {0x8018, 65}, + {0x801f, 65}, + {0x8029, 65}, + {0xc038, 65}, + }, + /* 27 */ + { + {0x8003, 95}, + {0x8006, 95}, + {0x800a, 95}, + {0x800f, 95}, + {0x8018, 95}, + {0x801f, 95}, + {0x8029, 95}, + {0xc038, 95}, + {0x8003, 98}, + {0x8006, 98}, + {0x800a, 98}, + {0x800f, 98}, + {0x8018, 98}, + {0x801f, 98}, + {0x8029, 98}, + {0xc038, 98}, + }, + /* 28 */ + { + {0x8002, 100}, + {0x8009, 100}, + {0x8017, 100}, + {0xc028, 100}, + {0x8002, 102}, + {0x8009, 102}, + {0x8017, 102}, + {0xc028, 102}, + {0x8002, 103}, + {0x8009, 103}, + {0x8017, 103}, + {0xc028, 103}, + {0x8002, 104}, + {0x8009, 104}, + {0x8017, 104}, + {0xc028, 104}, + }, + /* 29 */ + { + {0x8003, 100}, + {0x8006, 100}, + {0x800a, 100}, + {0x800f, 100}, + {0x8018, 100}, + {0x801f, 100}, + {0x8029, 100}, + {0xc038, 100}, + {0x8003, 102}, + {0x8006, 102}, + {0x800a, 102}, + {0x800f, 102}, + {0x8018, 102}, + {0x801f, 102}, + {0x8029, 102}, + {0xc038, 102}, + }, + /* 30 */ + { + {0x8003, 103}, + {0x8006, 103}, + {0x800a, 103}, + {0x800f, 103}, + {0x8018, 103}, + {0x801f, 103}, + {0x8029, 103}, + {0xc038, 103}, + {0x8003, 104}, + {0x8006, 104}, + {0x800a, 104}, + {0x800f, 104}, + {0x8018, 104}, + {0x801f, 104}, + {0x8029, 104}, + {0xc038, 104}, + }, + /* 31 */ + { + {0x8001, 108}, + {0xc016, 108}, + {0x8001, 109}, + {0xc016, 109}, + {0x8001, 110}, + {0xc016, 110}, + {0x8001, 112}, + {0xc016, 112}, + {0x8001, 114}, + {0xc016, 114}, + {0x8001, 117}, + {0xc016, 117}, + {0xc000, 58}, + {0xc000, 66}, + {0xc000, 67}, + {0xc000, 68}, + }, + /* 32 */ + { + {0x8002, 108}, + {0x8009, 108}, + {0x8017, 108}, + {0xc028, 108}, + {0x8002, 109}, + {0x8009, 109}, + {0x8017, 109}, + {0xc028, 109}, + {0x8002, 110}, + {0x8009, 110}, + {0x8017, 110}, + {0xc028, 110}, + {0x8002, 112}, + {0x8009, 112}, + {0x8017, 112}, + {0xc028, 112}, + }, + /* 33 */ + { + {0x8003, 108}, + {0x8006, 108}, + {0x800a, 108}, + {0x800f, 108}, + {0x8018, 108}, + {0x801f, 108}, + {0x8029, 108}, + {0xc038, 108}, + {0x8003, 109}, + {0x8006, 109}, + {0x800a, 109}, + {0x800f, 109}, + {0x8018, 109}, + {0x801f, 109}, + {0x8029, 109}, + {0xc038, 109}, + }, + /* 34 */ + { + {0x8003, 110}, + {0x8006, 110}, + {0x800a, 110}, + {0x800f, 110}, + {0x8018, 110}, + {0x801f, 110}, + {0x8029, 110}, + {0xc038, 110}, + {0x8003, 112}, + {0x8006, 112}, + {0x800a, 112}, + {0x800f, 112}, + {0x8018, 112}, + {0x801f, 112}, + {0x8029, 112}, + {0xc038, 112}, + }, + /* 35 */ + { + {0x8002, 114}, + {0x8009, 114}, + {0x8017, 114}, + {0xc028, 114}, + {0x8002, 117}, + {0x8009, 117}, + {0x8017, 117}, + {0xc028, 117}, + {0x8001, 58}, + {0xc016, 58}, + {0x8001, 66}, + {0xc016, 66}, + {0x8001, 67}, + {0xc016, 67}, + {0x8001, 68}, + {0xc016, 68}, + }, + /* 36 */ + { + {0x8003, 114}, + {0x8006, 114}, + {0x800a, 114}, + {0x800f, 114}, + {0x8018, 114}, + {0x801f, 114}, + {0x8029, 114}, + {0xc038, 114}, + {0x8003, 117}, + {0x8006, 117}, + {0x800a, 117}, + {0x800f, 117}, + {0x8018, 117}, + {0x801f, 117}, + {0x8029, 117}, + {0xc038, 117}, + }, + /* 37 */ + { + {0x8002, 58}, + {0x8009, 58}, + {0x8017, 58}, + {0xc028, 58}, + {0x8002, 66}, + {0x8009, 66}, + {0x8017, 66}, + {0xc028, 66}, + {0x8002, 67}, + {0x8009, 67}, + {0x8017, 67}, + {0xc028, 67}, + {0x8002, 68}, + {0x8009, 68}, + {0x8017, 68}, + {0xc028, 68}, + }, + /* 38 */ + { + {0x8003, 58}, + {0x8006, 58}, + {0x800a, 58}, + {0x800f, 58}, + {0x8018, 58}, + {0x801f, 58}, + {0x8029, 58}, + {0xc038, 58}, + {0x8003, 66}, + {0x8006, 66}, + {0x800a, 66}, + {0x800f, 66}, + {0x8018, 66}, + {0x801f, 66}, + {0x8029, 66}, + {0xc038, 66}, + }, + /* 39 */ + { + {0x8003, 67}, + {0x8006, 67}, + {0x800a, 67}, + {0x800f, 67}, + {0x8018, 67}, + {0x801f, 67}, + {0x8029, 67}, + {0xc038, 67}, + {0x8003, 68}, + {0x8006, 68}, + {0x800a, 68}, + {0x800f, 68}, + {0x8018, 68}, + {0x801f, 68}, + {0x8029, 68}, + {0xc038, 68}, + }, + /* 40 */ + { + {0x2c, 0}, + {0x2d, 0}, + {0x2f, 0}, + {0x30, 0}, + {0x33, 0}, + {0x34, 0}, + {0x36, 0}, + {0x37, 0}, + {0x3b, 0}, + {0x3c, 0}, + {0x3e, 0}, + {0x3f, 0}, + {0x42, 0}, + {0x43, 0}, + {0x45, 0}, + {0x4048, 0}, + }, + /* 41 */ + { + {0xc000, 69}, + {0xc000, 70}, + {0xc000, 71}, + {0xc000, 72}, + {0xc000, 73}, + {0xc000, 74}, + {0xc000, 75}, + {0xc000, 76}, + {0xc000, 77}, + {0xc000, 78}, + {0xc000, 79}, + {0xc000, 80}, + {0xc000, 81}, + {0xc000, 82}, + {0xc000, 83}, + {0xc000, 84}, + }, + /* 42 */ + { + {0x8001, 69}, + {0xc016, 69}, + {0x8001, 70}, + {0xc016, 70}, + {0x8001, 71}, + {0xc016, 71}, + {0x8001, 72}, + {0xc016, 72}, + {0x8001, 73}, + {0xc016, 73}, + {0x8001, 74}, + {0xc016, 74}, + {0x8001, 75}, + {0xc016, 75}, + {0x8001, 76}, + {0xc016, 76}, + }, + /* 43 */ + { + {0x8002, 69}, + {0x8009, 69}, + {0x8017, 69}, + {0xc028, 69}, + {0x8002, 70}, + {0x8009, 70}, + {0x8017, 70}, + {0xc028, 70}, + {0x8002, 71}, + {0x8009, 71}, + {0x8017, 71}, + {0xc028, 71}, + {0x8002, 72}, + {0x8009, 72}, + {0x8017, 72}, + {0xc028, 72}, + }, + /* 44 */ + { + {0x8003, 69}, + {0x8006, 69}, + {0x800a, 69}, + {0x800f, 69}, + {0x8018, 69}, + {0x801f, 69}, + {0x8029, 69}, + {0xc038, 69}, + {0x8003, 70}, + {0x8006, 70}, + {0x800a, 70}, + {0x800f, 70}, + {0x8018, 70}, + {0x801f, 70}, + {0x8029, 70}, + {0xc038, 70}, + }, + /* 45 */ + { + {0x8003, 71}, + {0x8006, 71}, + {0x800a, 71}, + {0x800f, 71}, + {0x8018, 71}, + {0x801f, 71}, + {0x8029, 71}, + {0xc038, 71}, + {0x8003, 72}, + {0x8006, 72}, + {0x800a, 72}, + {0x800f, 72}, + {0x8018, 72}, + {0x801f, 72}, + {0x8029, 72}, + {0xc038, 72}, + }, + /* 46 */ + { + {0x8002, 73}, + {0x8009, 73}, + {0x8017, 73}, + {0xc028, 73}, + {0x8002, 74}, + {0x8009, 74}, + {0x8017, 74}, + {0xc028, 74}, + {0x8002, 75}, + {0x8009, 75}, + {0x8017, 75}, + {0xc028, 75}, + {0x8002, 76}, + {0x8009, 76}, + {0x8017, 76}, + {0xc028, 76}, + }, + /* 47 */ + { + {0x8003, 73}, + {0x8006, 73}, + {0x800a, 73}, + {0x800f, 73}, + {0x8018, 73}, + {0x801f, 73}, + {0x8029, 73}, + {0xc038, 73}, + {0x8003, 74}, + {0x8006, 74}, + {0x800a, 74}, + {0x800f, 74}, + {0x8018, 74}, + {0x801f, 74}, + {0x8029, 74}, + {0xc038, 74}, + }, + /* 48 */ + { + {0x8003, 75}, + {0x8006, 75}, + {0x800a, 75}, + {0x800f, 75}, + {0x8018, 75}, + {0x801f, 75}, + {0x8029, 75}, + {0xc038, 75}, + {0x8003, 76}, + {0x8006, 76}, + {0x800a, 76}, + {0x800f, 76}, + {0x8018, 76}, + {0x801f, 76}, + {0x8029, 76}, + {0xc038, 76}, + }, + /* 49 */ + { + {0x8001, 77}, + {0xc016, 77}, + {0x8001, 78}, + {0xc016, 78}, + {0x8001, 79}, + {0xc016, 79}, + {0x8001, 80}, + {0xc016, 80}, + {0x8001, 81}, + {0xc016, 81}, + {0x8001, 82}, + {0xc016, 82}, + {0x8001, 83}, + {0xc016, 83}, + {0x8001, 84}, + {0xc016, 84}, + }, + /* 50 */ + { + {0x8002, 77}, + {0x8009, 77}, + {0x8017, 77}, + {0xc028, 77}, + {0x8002, 78}, + {0x8009, 78}, + {0x8017, 78}, + {0xc028, 78}, + {0x8002, 79}, + {0x8009, 79}, + {0x8017, 79}, + {0xc028, 79}, + {0x8002, 80}, + {0x8009, 80}, + {0x8017, 80}, + {0xc028, 80}, + }, + /* 51 */ + { + {0x8003, 77}, + {0x8006, 77}, + {0x800a, 77}, + {0x800f, 77}, + {0x8018, 77}, + {0x801f, 77}, + {0x8029, 77}, + {0xc038, 77}, + {0x8003, 78}, + {0x8006, 78}, + {0x800a, 78}, + {0x800f, 78}, + {0x8018, 78}, + {0x801f, 78}, + {0x8029, 78}, + {0xc038, 78}, + }, + /* 52 */ + { + {0x8003, 79}, + {0x8006, 79}, + {0x800a, 79}, + {0x800f, 79}, + {0x8018, 79}, + {0x801f, 79}, + {0x8029, 79}, + {0xc038, 79}, + {0x8003, 80}, + {0x8006, 80}, + {0x800a, 80}, + {0x800f, 80}, + {0x8018, 80}, + {0x801f, 80}, + {0x8029, 80}, + {0xc038, 80}, + }, + /* 53 */ + { + {0x8002, 81}, + {0x8009, 81}, + {0x8017, 81}, + {0xc028, 81}, + {0x8002, 82}, + {0x8009, 82}, + {0x8017, 82}, + {0xc028, 82}, + {0x8002, 83}, + {0x8009, 83}, + {0x8017, 83}, + {0xc028, 83}, + {0x8002, 84}, + {0x8009, 84}, + {0x8017, 84}, + {0xc028, 84}, + }, + /* 54 */ + { + {0x8003, 81}, + {0x8006, 81}, + {0x800a, 81}, + {0x800f, 81}, + {0x8018, 81}, + {0x801f, 81}, + {0x8029, 81}, + {0xc038, 81}, + {0x8003, 82}, + {0x8006, 82}, + {0x800a, 82}, + {0x800f, 82}, + {0x8018, 82}, + {0x801f, 82}, + {0x8029, 82}, + {0xc038, 82}, + }, + /* 55 */ + { + {0x8003, 83}, + {0x8006, 83}, + {0x800a, 83}, + {0x800f, 83}, + {0x8018, 83}, + {0x801f, 83}, + {0x8029, 83}, + {0xc038, 83}, + {0x8003, 84}, + {0x8006, 84}, + {0x800a, 84}, + {0x800f, 84}, + {0x8018, 84}, + {0x801f, 84}, + {0x8029, 84}, + {0xc038, 84}, + }, + /* 56 */ + { + {0xc000, 85}, + {0xc000, 86}, + {0xc000, 87}, + {0xc000, 89}, + {0xc000, 106}, + {0xc000, 107}, + {0xc000, 113}, + {0xc000, 118}, + {0xc000, 119}, + {0xc000, 120}, + {0xc000, 121}, + {0xc000, 122}, + {0x46, 0}, + {0x47, 0}, + {0x49, 0}, + {0x404a, 0}, + }, + /* 57 */ + { + {0x8001, 85}, + {0xc016, 85}, + {0x8001, 86}, + {0xc016, 86}, + {0x8001, 87}, + {0xc016, 87}, + {0x8001, 89}, + {0xc016, 89}, + {0x8001, 106}, + {0xc016, 106}, + {0x8001, 107}, + {0xc016, 107}, + {0x8001, 113}, + {0xc016, 113}, + {0x8001, 118}, + {0xc016, 118}, + }, + /* 58 */ + { + {0x8002, 85}, + {0x8009, 85}, + {0x8017, 85}, + {0xc028, 85}, + {0x8002, 86}, + {0x8009, 86}, + {0x8017, 86}, + {0xc028, 86}, + {0x8002, 87}, + {0x8009, 87}, + {0x8017, 87}, + {0xc028, 87}, + {0x8002, 89}, + {0x8009, 89}, + {0x8017, 89}, + {0xc028, 89}, + }, + /* 59 */ + { + {0x8003, 85}, + {0x8006, 85}, + {0x800a, 85}, + {0x800f, 85}, + {0x8018, 85}, + {0x801f, 85}, + {0x8029, 85}, + {0xc038, 85}, + {0x8003, 86}, + {0x8006, 86}, + {0x800a, 86}, + {0x800f, 86}, + {0x8018, 86}, + {0x801f, 86}, + {0x8029, 86}, + {0xc038, 86}, + }, + /* 60 */ + { + {0x8003, 87}, + {0x8006, 87}, + {0x800a, 87}, + {0x800f, 87}, + {0x8018, 87}, + {0x801f, 87}, + {0x8029, 87}, + {0xc038, 87}, + {0x8003, 89}, + {0x8006, 89}, + {0x800a, 89}, + {0x800f, 89}, + {0x8018, 89}, + {0x801f, 89}, + {0x8029, 89}, + {0xc038, 89}, + }, + /* 61 */ + { + {0x8002, 106}, + {0x8009, 106}, + {0x8017, 106}, + {0xc028, 106}, + {0x8002, 107}, + {0x8009, 107}, + {0x8017, 107}, + {0xc028, 107}, + {0x8002, 113}, + {0x8009, 113}, + {0x8017, 113}, + {0xc028, 113}, + {0x8002, 118}, + {0x8009, 118}, + {0x8017, 118}, + {0xc028, 118}, + }, + /* 62 */ + { + {0x8003, 106}, + {0x8006, 106}, + {0x800a, 106}, + {0x800f, 106}, + {0x8018, 106}, + {0x801f, 106}, + {0x8029, 106}, + {0xc038, 106}, + {0x8003, 107}, + {0x8006, 107}, + {0x800a, 107}, + {0x800f, 107}, + {0x8018, 107}, + {0x801f, 107}, + {0x8029, 107}, + {0xc038, 107}, + }, + /* 63 */ + { + {0x8003, 113}, + {0x8006, 113}, + {0x800a, 113}, + {0x800f, 113}, + {0x8018, 113}, + {0x801f, 113}, + {0x8029, 113}, + {0xc038, 113}, + {0x8003, 118}, + {0x8006, 118}, + {0x800a, 118}, + {0x800f, 118}, + {0x8018, 118}, + {0x801f, 118}, + {0x8029, 118}, + {0xc038, 118}, + }, + /* 64 */ + { + {0x8001, 119}, + {0xc016, 119}, + {0x8001, 120}, + {0xc016, 120}, + {0x8001, 121}, + {0xc016, 121}, + {0x8001, 122}, + {0xc016, 122}, + {0xc000, 38}, + {0xc000, 42}, + {0xc000, 44}, + {0xc000, 59}, + {0xc000, 88}, + {0xc000, 90}, + {0x4b, 0}, + {0x4e, 0}, + }, + /* 65 */ + { + {0x8002, 119}, + {0x8009, 119}, + {0x8017, 119}, + {0xc028, 119}, + {0x8002, 120}, + {0x8009, 120}, + {0x8017, 120}, + {0xc028, 120}, + {0x8002, 121}, + {0x8009, 121}, + {0x8017, 121}, + {0xc028, 121}, + {0x8002, 122}, + {0x8009, 122}, + {0x8017, 122}, + {0xc028, 122}, + }, + /* 66 */ + { + {0x8003, 119}, + {0x8006, 119}, + {0x800a, 119}, + {0x800f, 119}, + {0x8018, 119}, + {0x801f, 119}, + {0x8029, 119}, + {0xc038, 119}, + {0x8003, 120}, + {0x8006, 120}, + {0x800a, 120}, + {0x800f, 120}, + {0x8018, 120}, + {0x801f, 120}, + {0x8029, 120}, + {0xc038, 120}, + }, + /* 67 */ + { + {0x8003, 121}, + {0x8006, 121}, + {0x800a, 121}, + {0x800f, 121}, + {0x8018, 121}, + {0x801f, 121}, + {0x8029, 121}, + {0xc038, 121}, + {0x8003, 122}, + {0x8006, 122}, + {0x800a, 122}, + {0x800f, 122}, + {0x8018, 122}, + {0x801f, 122}, + {0x8029, 122}, + {0xc038, 122}, + }, + /* 68 */ + { + {0x8001, 38}, + {0xc016, 38}, + {0x8001, 42}, + {0xc016, 42}, + {0x8001, 44}, + {0xc016, 44}, + {0x8001, 59}, + {0xc016, 59}, + {0x8001, 88}, + {0xc016, 88}, + {0x8001, 90}, + {0xc016, 90}, + {0x4c, 0}, + {0x4d, 0}, + {0x4f, 0}, + {0x51, 0}, + }, + /* 69 */ + { + {0x8002, 38}, + {0x8009, 38}, + {0x8017, 38}, + {0xc028, 38}, + {0x8002, 42}, + {0x8009, 42}, + {0x8017, 42}, + {0xc028, 42}, + {0x8002, 44}, + {0x8009, 44}, + {0x8017, 44}, + {0xc028, 44}, + {0x8002, 59}, + {0x8009, 59}, + {0x8017, 59}, + {0xc028, 59}, + }, + /* 70 */ + { + {0x8003, 38}, + {0x8006, 38}, + {0x800a, 38}, + {0x800f, 38}, + {0x8018, 38}, + {0x801f, 38}, + {0x8029, 38}, + {0xc038, 38}, + {0x8003, 42}, + {0x8006, 42}, + {0x800a, 42}, + {0x800f, 42}, + {0x8018, 42}, + {0x801f, 42}, + {0x8029, 42}, + {0xc038, 42}, + }, + /* 71 */ + { + {0x8003, 44}, + {0x8006, 44}, + {0x800a, 44}, + {0x800f, 44}, + {0x8018, 44}, + {0x801f, 44}, + {0x8029, 44}, + {0xc038, 44}, + {0x8003, 59}, + {0x8006, 59}, + {0x800a, 59}, + {0x800f, 59}, + {0x8018, 59}, + {0x801f, 59}, + {0x8029, 59}, + {0xc038, 59}, + }, + /* 72 */ + { + {0x8002, 88}, + {0x8009, 88}, + {0x8017, 88}, + {0xc028, 88}, + {0x8002, 90}, + {0x8009, 90}, + {0x8017, 90}, + {0xc028, 90}, + {0xc000, 33}, + {0xc000, 34}, + {0xc000, 40}, + {0xc000, 41}, + {0xc000, 63}, + {0x50, 0}, + {0x52, 0}, + {0x54, 0}, + }, + /* 73 */ + { + {0x8003, 88}, + {0x8006, 88}, + {0x800a, 88}, + {0x800f, 88}, + {0x8018, 88}, + {0x801f, 88}, + {0x8029, 88}, + {0xc038, 88}, + {0x8003, 90}, + {0x8006, 90}, + {0x800a, 90}, + {0x800f, 90}, + {0x8018, 90}, + {0x801f, 90}, + {0x8029, 90}, + {0xc038, 90}, + }, + /* 74 */ + { + {0x8001, 33}, + {0xc016, 33}, + {0x8001, 34}, + {0xc016, 34}, + {0x8001, 40}, + {0xc016, 40}, + {0x8001, 41}, + {0xc016, 41}, + {0x8001, 63}, + {0xc016, 63}, + {0xc000, 39}, + {0xc000, 43}, + {0xc000, 124}, + {0x53, 0}, + {0x55, 0}, + {0x58, 0}, + }, + /* 75 */ + { + {0x8002, 33}, + {0x8009, 33}, + {0x8017, 33}, + {0xc028, 33}, + {0x8002, 34}, + {0x8009, 34}, + {0x8017, 34}, + {0xc028, 34}, + {0x8002, 40}, + {0x8009, 40}, + {0x8017, 40}, + {0xc028, 40}, + {0x8002, 41}, + {0x8009, 41}, + {0x8017, 41}, + {0xc028, 41}, + }, + /* 76 */ + { + {0x8003, 33}, + {0x8006, 33}, + {0x800a, 33}, + {0x800f, 33}, + {0x8018, 33}, + {0x801f, 33}, + {0x8029, 33}, + {0xc038, 33}, + {0x8003, 34}, + {0x8006, 34}, + {0x800a, 34}, + {0x800f, 34}, + {0x8018, 34}, + {0x801f, 34}, + {0x8029, 34}, + {0xc038, 34}, + }, + /* 77 */ + { + {0x8003, 40}, + {0x8006, 40}, + {0x800a, 40}, + {0x800f, 40}, + {0x8018, 40}, + {0x801f, 40}, + {0x8029, 40}, + {0xc038, 40}, + {0x8003, 41}, + {0x8006, 41}, + {0x800a, 41}, + {0x800f, 41}, + {0x8018, 41}, + {0x801f, 41}, + {0x8029, 41}, + {0xc038, 41}, + }, + /* 78 */ + { + {0x8002, 63}, + {0x8009, 63}, + {0x8017, 63}, + {0xc028, 63}, + {0x8001, 39}, + {0xc016, 39}, + {0x8001, 43}, + {0xc016, 43}, + {0x8001, 124}, + {0xc016, 124}, + {0xc000, 35}, + {0xc000, 62}, + {0x56, 0}, + {0x57, 0}, + {0x59, 0}, + {0x5a, 0}, + }, + /* 79 */ + { + {0x8003, 63}, + {0x8006, 63}, + {0x800a, 63}, + {0x800f, 63}, + {0x8018, 63}, + {0x801f, 63}, + {0x8029, 63}, + {0xc038, 63}, + {0x8002, 39}, + {0x8009, 39}, + {0x8017, 39}, + {0xc028, 39}, + {0x8002, 43}, + {0x8009, 43}, + {0x8017, 43}, + {0xc028, 43}, + }, + /* 80 */ + { + {0x8003, 39}, + {0x8006, 39}, + {0x800a, 39}, + {0x800f, 39}, + {0x8018, 39}, + {0x801f, 39}, + {0x8029, 39}, + {0xc038, 39}, + {0x8003, 43}, + {0x8006, 43}, + {0x800a, 43}, + {0x800f, 43}, + {0x8018, 43}, + {0x801f, 43}, + {0x8029, 43}, + {0xc038, 43}, + }, + /* 81 */ + { + {0x8002, 124}, + {0x8009, 124}, + {0x8017, 124}, + {0xc028, 124}, + {0x8001, 35}, + {0xc016, 35}, + {0x8001, 62}, + {0xc016, 62}, + {0xc000, 0}, + {0xc000, 36}, + {0xc000, 64}, + {0xc000, 91}, + {0xc000, 93}, + {0xc000, 126}, + {0x5b, 0}, + {0x5c, 0}, + }, + /* 82 */ + { + {0x8003, 124}, + {0x8006, 124}, + {0x800a, 124}, + {0x800f, 124}, + {0x8018, 124}, + {0x801f, 124}, + {0x8029, 124}, + {0xc038, 124}, + {0x8002, 35}, + {0x8009, 35}, + {0x8017, 35}, + {0xc028, 35}, + {0x8002, 62}, + {0x8009, 62}, + {0x8017, 62}, + {0xc028, 62}, + }, + /* 83 */ + { + {0x8003, 35}, + {0x8006, 35}, + {0x800a, 35}, + {0x800f, 35}, + {0x8018, 35}, + {0x801f, 35}, + {0x8029, 35}, + {0xc038, 35}, + {0x8003, 62}, + {0x8006, 62}, + {0x800a, 62}, + {0x800f, 62}, + {0x8018, 62}, + {0x801f, 62}, + {0x8029, 62}, + {0xc038, 62}, + }, + /* 84 */ + { + {0x8001, 0}, + {0xc016, 0}, + {0x8001, 36}, + {0xc016, 36}, + {0x8001, 64}, + {0xc016, 64}, + {0x8001, 91}, + {0xc016, 91}, + {0x8001, 93}, + {0xc016, 93}, + {0x8001, 126}, + {0xc016, 126}, + {0xc000, 94}, + {0xc000, 125}, + {0x5d, 0}, + {0x5e, 0}, + }, + /* 85 */ + { + {0x8002, 0}, + {0x8009, 0}, + {0x8017, 0}, + {0xc028, 0}, + {0x8002, 36}, + {0x8009, 36}, + {0x8017, 36}, + {0xc028, 36}, + {0x8002, 64}, + {0x8009, 64}, + {0x8017, 64}, + {0xc028, 64}, + {0x8002, 91}, + {0x8009, 91}, + {0x8017, 91}, + {0xc028, 91}, + }, + /* 86 */ + { + {0x8003, 0}, + {0x8006, 0}, + {0x800a, 0}, + {0x800f, 0}, + {0x8018, 0}, + {0x801f, 0}, + {0x8029, 0}, + {0xc038, 0}, + {0x8003, 36}, + {0x8006, 36}, + {0x800a, 36}, + {0x800f, 36}, + {0x8018, 36}, + {0x801f, 36}, + {0x8029, 36}, + {0xc038, 36}, + }, + /* 87 */ + { + {0x8003, 64}, + {0x8006, 64}, + {0x800a, 64}, + {0x800f, 64}, + {0x8018, 64}, + {0x801f, 64}, + {0x8029, 64}, + {0xc038, 64}, + {0x8003, 91}, + {0x8006, 91}, + {0x800a, 91}, + {0x800f, 91}, + {0x8018, 91}, + {0x801f, 91}, + {0x8029, 91}, + {0xc038, 91}, + }, + /* 88 */ + { + {0x8002, 93}, + {0x8009, 93}, + {0x8017, 93}, + {0xc028, 93}, + {0x8002, 126}, + {0x8009, 126}, + {0x8017, 126}, + {0xc028, 126}, + {0x8001, 94}, + {0xc016, 94}, + {0x8001, 125}, + {0xc016, 125}, + {0xc000, 60}, + {0xc000, 96}, + {0xc000, 123}, + {0x5f, 0}, + }, + /* 89 */ + { + {0x8003, 93}, + {0x8006, 93}, + {0x800a, 93}, + {0x800f, 93}, + {0x8018, 93}, + {0x801f, 93}, + {0x8029, 93}, + {0xc038, 93}, + {0x8003, 126}, + {0x8006, 126}, + {0x800a, 126}, + {0x800f, 126}, + {0x8018, 126}, + {0x801f, 126}, + {0x8029, 126}, + {0xc038, 126}, + }, + /* 90 */ + { + {0x8002, 94}, + {0x8009, 94}, + {0x8017, 94}, + {0xc028, 94}, + {0x8002, 125}, + {0x8009, 125}, + {0x8017, 125}, + {0xc028, 125}, + {0x8001, 60}, + {0xc016, 60}, + {0x8001, 96}, + {0xc016, 96}, + {0x8001, 123}, + {0xc016, 123}, + {0x60, 0}, + {0x6e, 0}, + }, + /* 91 */ + { + {0x8003, 94}, + {0x8006, 94}, + {0x800a, 94}, + {0x800f, 94}, + {0x8018, 94}, + {0x801f, 94}, + {0x8029, 94}, + {0xc038, 94}, + {0x8003, 125}, + {0x8006, 125}, + {0x800a, 125}, + {0x800f, 125}, + {0x8018, 125}, + {0x801f, 125}, + {0x8029, 125}, + {0xc038, 125}, + }, + /* 92 */ + { + {0x8002, 60}, + {0x8009, 60}, + {0x8017, 60}, + {0xc028, 60}, + {0x8002, 96}, + {0x8009, 96}, + {0x8017, 96}, + {0xc028, 96}, + {0x8002, 123}, + {0x8009, 123}, + {0x8017, 123}, + {0xc028, 123}, + {0x61, 0}, + {0x65, 0}, + {0x6f, 0}, + {0x85, 0}, + }, + /* 93 */ + { + {0x8003, 60}, + {0x8006, 60}, + {0x800a, 60}, + {0x800f, 60}, + {0x8018, 60}, + {0x801f, 60}, + {0x8029, 60}, + {0xc038, 60}, + {0x8003, 96}, + {0x8006, 96}, + {0x800a, 96}, + {0x800f, 96}, + {0x8018, 96}, + {0x801f, 96}, + {0x8029, 96}, + {0xc038, 96}, + }, + /* 94 */ + { + {0x8003, 123}, + {0x8006, 123}, + {0x800a, 123}, + {0x800f, 123}, + {0x8018, 123}, + {0x801f, 123}, + {0x8029, 123}, + {0xc038, 123}, + {0x62, 0}, + {0x63, 0}, + {0x66, 0}, + {0x69, 0}, + {0x70, 0}, + {0x77, 0}, + {0x86, 0}, + {0x99, 0}, + }, + /* 95 */ + { + {0xc000, 92}, + {0xc000, 195}, + {0xc000, 208}, + {0x64, 0}, + {0x67, 0}, + {0x68, 0}, + {0x6a, 0}, + {0x6b, 0}, + {0x71, 0}, + {0x74, 0}, + {0x78, 0}, + {0x7e, 0}, + {0x87, 0}, + {0x8e, 0}, + {0x9a, 0}, + {0xa9, 0}, + }, + /* 96 */ + { + {0x8001, 92}, + {0xc016, 92}, + {0x8001, 195}, + {0xc016, 195}, + {0x8001, 208}, + {0xc016, 208}, + {0xc000, 128}, + {0xc000, 130}, + {0xc000, 131}, + {0xc000, 162}, + {0xc000, 184}, + {0xc000, 194}, + {0xc000, 224}, + {0xc000, 226}, + {0x6c, 0}, + {0x6d, 0}, + }, + /* 97 */ + { + {0x8002, 92}, + {0x8009, 92}, + {0x8017, 92}, + {0xc028, 92}, + {0x8002, 195}, + {0x8009, 195}, + {0x8017, 195}, + {0xc028, 195}, + {0x8002, 208}, + {0x8009, 208}, + {0x8017, 208}, + {0xc028, 208}, + {0x8001, 128}, + {0xc016, 128}, + {0x8001, 130}, + {0xc016, 130}, + }, + /* 98 */ + { + {0x8003, 92}, + {0x8006, 92}, + {0x800a, 92}, + {0x800f, 92}, + {0x8018, 92}, + {0x801f, 92}, + {0x8029, 92}, + {0xc038, 92}, + {0x8003, 195}, + {0x8006, 195}, + {0x800a, 195}, + {0x800f, 195}, + {0x8018, 195}, + {0x801f, 195}, + {0x8029, 195}, + {0xc038, 195}, + }, + /* 99 */ + { + {0x8003, 208}, + {0x8006, 208}, + {0x800a, 208}, + {0x800f, 208}, + {0x8018, 208}, + {0x801f, 208}, + {0x8029, 208}, + {0xc038, 208}, + {0x8002, 128}, + {0x8009, 128}, + {0x8017, 128}, + {0xc028, 128}, + {0x8002, 130}, + {0x8009, 130}, + {0x8017, 130}, + {0xc028, 130}, + }, + /* 100 */ + { + {0x8003, 128}, + {0x8006, 128}, + {0x800a, 128}, + {0x800f, 128}, + {0x8018, 128}, + {0x801f, 128}, + {0x8029, 128}, + {0xc038, 128}, + {0x8003, 130}, + {0x8006, 130}, + {0x800a, 130}, + {0x800f, 130}, + {0x8018, 130}, + {0x801f, 130}, + {0x8029, 130}, + {0xc038, 130}, + }, + /* 101 */ + { + {0x8001, 131}, + {0xc016, 131}, + {0x8001, 162}, + {0xc016, 162}, + {0x8001, 184}, + {0xc016, 184}, + {0x8001, 194}, + {0xc016, 194}, + {0x8001, 224}, + {0xc016, 224}, + {0x8001, 226}, + {0xc016, 226}, + {0xc000, 153}, + {0xc000, 161}, + {0xc000, 167}, + {0xc000, 172}, + }, + /* 102 */ + { + {0x8002, 131}, + {0x8009, 131}, + {0x8017, 131}, + {0xc028, 131}, + {0x8002, 162}, + {0x8009, 162}, + {0x8017, 162}, + {0xc028, 162}, + {0x8002, 184}, + {0x8009, 184}, + {0x8017, 184}, + {0xc028, 184}, + {0x8002, 194}, + {0x8009, 194}, + {0x8017, 194}, + {0xc028, 194}, + }, + /* 103 */ + { + {0x8003, 131}, + {0x8006, 131}, + {0x800a, 131}, + {0x800f, 131}, + {0x8018, 131}, + {0x801f, 131}, + {0x8029, 131}, + {0xc038, 131}, + {0x8003, 162}, + {0x8006, 162}, + {0x800a, 162}, + {0x800f, 162}, + {0x8018, 162}, + {0x801f, 162}, + {0x8029, 162}, + {0xc038, 162}, + }, + /* 104 */ + { + {0x8003, 184}, + {0x8006, 184}, + {0x800a, 184}, + {0x800f, 184}, + {0x8018, 184}, + {0x801f, 184}, + {0x8029, 184}, + {0xc038, 184}, + {0x8003, 194}, + {0x8006, 194}, + {0x800a, 194}, + {0x800f, 194}, + {0x8018, 194}, + {0x801f, 194}, + {0x8029, 194}, + {0xc038, 194}, + }, + /* 105 */ + { + {0x8002, 224}, + {0x8009, 224}, + {0x8017, 224}, + {0xc028, 224}, + {0x8002, 226}, + {0x8009, 226}, + {0x8017, 226}, + {0xc028, 226}, + {0x8001, 153}, + {0xc016, 153}, + {0x8001, 161}, + {0xc016, 161}, + {0x8001, 167}, + {0xc016, 167}, + {0x8001, 172}, + {0xc016, 172}, + }, + /* 106 */ + { + {0x8003, 224}, + {0x8006, 224}, + {0x800a, 224}, + {0x800f, 224}, + {0x8018, 224}, + {0x801f, 224}, + {0x8029, 224}, + {0xc038, 224}, + {0x8003, 226}, + {0x8006, 226}, + {0x800a, 226}, + {0x800f, 226}, + {0x8018, 226}, + {0x801f, 226}, + {0x8029, 226}, + {0xc038, 226}, + }, + /* 107 */ + { + {0x8002, 153}, + {0x8009, 153}, + {0x8017, 153}, + {0xc028, 153}, + {0x8002, 161}, + {0x8009, 161}, + {0x8017, 161}, + {0xc028, 161}, + {0x8002, 167}, + {0x8009, 167}, + {0x8017, 167}, + {0xc028, 167}, + {0x8002, 172}, + {0x8009, 172}, + {0x8017, 172}, + {0xc028, 172}, + }, + /* 108 */ + { + {0x8003, 153}, + {0x8006, 153}, + {0x800a, 153}, + {0x800f, 153}, + {0x8018, 153}, + {0x801f, 153}, + {0x8029, 153}, + {0xc038, 153}, + {0x8003, 161}, + {0x8006, 161}, + {0x800a, 161}, + {0x800f, 161}, + {0x8018, 161}, + {0x801f, 161}, + {0x8029, 161}, + {0xc038, 161}, + }, + /* 109 */ + { + {0x8003, 167}, + {0x8006, 167}, + {0x800a, 167}, + {0x800f, 167}, + {0x8018, 167}, + {0x801f, 167}, + {0x8029, 167}, + {0xc038, 167}, + {0x8003, 172}, + {0x8006, 172}, + {0x800a, 172}, + {0x800f, 172}, + {0x8018, 172}, + {0x801f, 172}, + {0x8029, 172}, + {0xc038, 172}, + }, + /* 110 */ + { + {0x72, 0}, + {0x73, 0}, + {0x75, 0}, + {0x76, 0}, + {0x79, 0}, + {0x7b, 0}, + {0x7f, 0}, + {0x82, 0}, + {0x88, 0}, + {0x8b, 0}, + {0x8f, 0}, + {0x92, 0}, + {0x9b, 0}, + {0xa2, 0}, + {0xaa, 0}, + {0xb4, 0}, + }, + /* 111 */ + { + {0xc000, 176}, + {0xc000, 177}, + {0xc000, 179}, + {0xc000, 209}, + {0xc000, 216}, + {0xc000, 217}, + {0xc000, 227}, + {0xc000, 229}, + {0xc000, 230}, + {0x7a, 0}, + {0x7c, 0}, + {0x7d, 0}, + {0x80, 0}, + {0x81, 0}, + {0x83, 0}, + {0x84, 0}, + }, + /* 112 */ + { + {0x8001, 176}, + {0xc016, 176}, + {0x8001, 177}, + {0xc016, 177}, + {0x8001, 179}, + {0xc016, 179}, + {0x8001, 209}, + {0xc016, 209}, + {0x8001, 216}, + {0xc016, 216}, + {0x8001, 217}, + {0xc016, 217}, + {0x8001, 227}, + {0xc016, 227}, + {0x8001, 229}, + {0xc016, 229}, + }, + /* 113 */ + { + {0x8002, 176}, + {0x8009, 176}, + {0x8017, 176}, + {0xc028, 176}, + {0x8002, 177}, + {0x8009, 177}, + {0x8017, 177}, + {0xc028, 177}, + {0x8002, 179}, + {0x8009, 179}, + {0x8017, 179}, + {0xc028, 179}, + {0x8002, 209}, + {0x8009, 209}, + {0x8017, 209}, + {0xc028, 209}, + }, + /* 114 */ + { + {0x8003, 176}, + {0x8006, 176}, + {0x800a, 176}, + {0x800f, 176}, + {0x8018, 176}, + {0x801f, 176}, + {0x8029, 176}, + {0xc038, 176}, + {0x8003, 177}, + {0x8006, 177}, + {0x800a, 177}, + {0x800f, 177}, + {0x8018, 177}, + {0x801f, 177}, + {0x8029, 177}, + {0xc038, 177}, + }, + /* 115 */ + { + {0x8003, 179}, + {0x8006, 179}, + {0x800a, 179}, + {0x800f, 179}, + {0x8018, 179}, + {0x801f, 179}, + {0x8029, 179}, + {0xc038, 179}, + {0x8003, 209}, + {0x8006, 209}, + {0x800a, 209}, + {0x800f, 209}, + {0x8018, 209}, + {0x801f, 209}, + {0x8029, 209}, + {0xc038, 209}, + }, + /* 116 */ + { + {0x8002, 216}, + {0x8009, 216}, + {0x8017, 216}, + {0xc028, 216}, + {0x8002, 217}, + {0x8009, 217}, + {0x8017, 217}, + {0xc028, 217}, + {0x8002, 227}, + {0x8009, 227}, + {0x8017, 227}, + {0xc028, 227}, + {0x8002, 229}, + {0x8009, 229}, + {0x8017, 229}, + {0xc028, 229}, + }, + /* 117 */ + { + {0x8003, 216}, + {0x8006, 216}, + {0x800a, 216}, + {0x800f, 216}, + {0x8018, 216}, + {0x801f, 216}, + {0x8029, 216}, + {0xc038, 216}, + {0x8003, 217}, + {0x8006, 217}, + {0x800a, 217}, + {0x800f, 217}, + {0x8018, 217}, + {0x801f, 217}, + {0x8029, 217}, + {0xc038, 217}, + }, + /* 118 */ + { + {0x8003, 227}, + {0x8006, 227}, + {0x800a, 227}, + {0x800f, 227}, + {0x8018, 227}, + {0x801f, 227}, + {0x8029, 227}, + {0xc038, 227}, + {0x8003, 229}, + {0x8006, 229}, + {0x800a, 229}, + {0x800f, 229}, + {0x8018, 229}, + {0x801f, 229}, + {0x8029, 229}, + {0xc038, 229}, + }, + /* 119 */ + { + {0x8001, 230}, + {0xc016, 230}, + {0xc000, 129}, + {0xc000, 132}, + {0xc000, 133}, + {0xc000, 134}, + {0xc000, 136}, + {0xc000, 146}, + {0xc000, 154}, + {0xc000, 156}, + {0xc000, 160}, + {0xc000, 163}, + {0xc000, 164}, + {0xc000, 169}, + {0xc000, 170}, + {0xc000, 173}, + }, + /* 120 */ + { + {0x8002, 230}, + {0x8009, 230}, + {0x8017, 230}, + {0xc028, 230}, + {0x8001, 129}, + {0xc016, 129}, + {0x8001, 132}, + {0xc016, 132}, + {0x8001, 133}, + {0xc016, 133}, + {0x8001, 134}, + {0xc016, 134}, + {0x8001, 136}, + {0xc016, 136}, + {0x8001, 146}, + {0xc016, 146}, + }, + /* 121 */ + { + {0x8003, 230}, + {0x8006, 230}, + {0x800a, 230}, + {0x800f, 230}, + {0x8018, 230}, + {0x801f, 230}, + {0x8029, 230}, + {0xc038, 230}, + {0x8002, 129}, + {0x8009, 129}, + {0x8017, 129}, + {0xc028, 129}, + {0x8002, 132}, + {0x8009, 132}, + {0x8017, 132}, + {0xc028, 132}, + }, + /* 122 */ + { + {0x8003, 129}, + {0x8006, 129}, + {0x800a, 129}, + {0x800f, 129}, + {0x8018, 129}, + {0x801f, 129}, + {0x8029, 129}, + {0xc038, 129}, + {0x8003, 132}, + {0x8006, 132}, + {0x800a, 132}, + {0x800f, 132}, + {0x8018, 132}, + {0x801f, 132}, + {0x8029, 132}, + {0xc038, 132}, + }, + /* 123 */ + { + {0x8002, 133}, + {0x8009, 133}, + {0x8017, 133}, + {0xc028, 133}, + {0x8002, 134}, + {0x8009, 134}, + {0x8017, 134}, + {0xc028, 134}, + {0x8002, 136}, + {0x8009, 136}, + {0x8017, 136}, + {0xc028, 136}, + {0x8002, 146}, + {0x8009, 146}, + {0x8017, 146}, + {0xc028, 146}, + }, + /* 124 */ + { + {0x8003, 133}, + {0x8006, 133}, + {0x800a, 133}, + {0x800f, 133}, + {0x8018, 133}, + {0x801f, 133}, + {0x8029, 133}, + {0xc038, 133}, + {0x8003, 134}, + {0x8006, 134}, + {0x800a, 134}, + {0x800f, 134}, + {0x8018, 134}, + {0x801f, 134}, + {0x8029, 134}, + {0xc038, 134}, + }, + /* 125 */ + { + {0x8003, 136}, + {0x8006, 136}, + {0x800a, 136}, + {0x800f, 136}, + {0x8018, 136}, + {0x801f, 136}, + {0x8029, 136}, + {0xc038, 136}, + {0x8003, 146}, + {0x8006, 146}, + {0x800a, 146}, + {0x800f, 146}, + {0x8018, 146}, + {0x801f, 146}, + {0x8029, 146}, + {0xc038, 146}, + }, + /* 126 */ + { + {0x8001, 154}, + {0xc016, 154}, + {0x8001, 156}, + {0xc016, 156}, + {0x8001, 160}, + {0xc016, 160}, + {0x8001, 163}, + {0xc016, 163}, + {0x8001, 164}, + {0xc016, 164}, + {0x8001, 169}, + {0xc016, 169}, + {0x8001, 170}, + {0xc016, 170}, + {0x8001, 173}, + {0xc016, 173}, + }, + /* 127 */ + { + {0x8002, 154}, + {0x8009, 154}, + {0x8017, 154}, + {0xc028, 154}, + {0x8002, 156}, + {0x8009, 156}, + {0x8017, 156}, + {0xc028, 156}, + {0x8002, 160}, + {0x8009, 160}, + {0x8017, 160}, + {0xc028, 160}, + {0x8002, 163}, + {0x8009, 163}, + {0x8017, 163}, + {0xc028, 163}, + }, + /* 128 */ + { + {0x8003, 154}, + {0x8006, 154}, + {0x800a, 154}, + {0x800f, 154}, + {0x8018, 154}, + {0x801f, 154}, + {0x8029, 154}, + {0xc038, 154}, + {0x8003, 156}, + {0x8006, 156}, + {0x800a, 156}, + {0x800f, 156}, + {0x8018, 156}, + {0x801f, 156}, + {0x8029, 156}, + {0xc038, 156}, + }, + /* 129 */ + { + {0x8003, 160}, + {0x8006, 160}, + {0x800a, 160}, + {0x800f, 160}, + {0x8018, 160}, + {0x801f, 160}, + {0x8029, 160}, + {0xc038, 160}, + {0x8003, 163}, + {0x8006, 163}, + {0x800a, 163}, + {0x800f, 163}, + {0x8018, 163}, + {0x801f, 163}, + {0x8029, 163}, + {0xc038, 163}, + }, + /* 130 */ + { + {0x8002, 164}, + {0x8009, 164}, + {0x8017, 164}, + {0xc028, 164}, + {0x8002, 169}, + {0x8009, 169}, + {0x8017, 169}, + {0xc028, 169}, + {0x8002, 170}, + {0x8009, 170}, + {0x8017, 170}, + {0xc028, 170}, + {0x8002, 173}, + {0x8009, 173}, + {0x8017, 173}, + {0xc028, 173}, + }, + /* 131 */ + { + {0x8003, 164}, + {0x8006, 164}, + {0x800a, 164}, + {0x800f, 164}, + {0x8018, 164}, + {0x801f, 164}, + {0x8029, 164}, + {0xc038, 164}, + {0x8003, 169}, + {0x8006, 169}, + {0x800a, 169}, + {0x800f, 169}, + {0x8018, 169}, + {0x801f, 169}, + {0x8029, 169}, + {0xc038, 169}, + }, + /* 132 */ + { + {0x8003, 170}, + {0x8006, 170}, + {0x800a, 170}, + {0x800f, 170}, + {0x8018, 170}, + {0x801f, 170}, + {0x8029, 170}, + {0xc038, 170}, + {0x8003, 173}, + {0x8006, 173}, + {0x800a, 173}, + {0x800f, 173}, + {0x8018, 173}, + {0x801f, 173}, + {0x8029, 173}, + {0xc038, 173}, + }, + /* 133 */ + { + {0x89, 0}, + {0x8a, 0}, + {0x8c, 0}, + {0x8d, 0}, + {0x90, 0}, + {0x91, 0}, + {0x93, 0}, + {0x96, 0}, + {0x9c, 0}, + {0x9f, 0}, + {0xa3, 0}, + {0xa6, 0}, + {0xab, 0}, + {0xae, 0}, + {0xb5, 0}, + {0xbe, 0}, + }, + /* 134 */ + { + {0xc000, 178}, + {0xc000, 181}, + {0xc000, 185}, + {0xc000, 186}, + {0xc000, 187}, + {0xc000, 189}, + {0xc000, 190}, + {0xc000, 196}, + {0xc000, 198}, + {0xc000, 228}, + {0xc000, 232}, + {0xc000, 233}, + {0x94, 0}, + {0x95, 0}, + {0x97, 0}, + {0x98, 0}, + }, + /* 135 */ + { + {0x8001, 178}, + {0xc016, 178}, + {0x8001, 181}, + {0xc016, 181}, + {0x8001, 185}, + {0xc016, 185}, + {0x8001, 186}, + {0xc016, 186}, + {0x8001, 187}, + {0xc016, 187}, + {0x8001, 189}, + {0xc016, 189}, + {0x8001, 190}, + {0xc016, 190}, + {0x8001, 196}, + {0xc016, 196}, + }, + /* 136 */ + { + {0x8002, 178}, + {0x8009, 178}, + {0x8017, 178}, + {0xc028, 178}, + {0x8002, 181}, + {0x8009, 181}, + {0x8017, 181}, + {0xc028, 181}, + {0x8002, 185}, + {0x8009, 185}, + {0x8017, 185}, + {0xc028, 185}, + {0x8002, 186}, + {0x8009, 186}, + {0x8017, 186}, + {0xc028, 186}, + }, + /* 137 */ + { + {0x8003, 178}, + {0x8006, 178}, + {0x800a, 178}, + {0x800f, 178}, + {0x8018, 178}, + {0x801f, 178}, + {0x8029, 178}, + {0xc038, 178}, + {0x8003, 181}, + {0x8006, 181}, + {0x800a, 181}, + {0x800f, 181}, + {0x8018, 181}, + {0x801f, 181}, + {0x8029, 181}, + {0xc038, 181}, + }, + /* 138 */ + { + {0x8003, 185}, + {0x8006, 185}, + {0x800a, 185}, + {0x800f, 185}, + {0x8018, 185}, + {0x801f, 185}, + {0x8029, 185}, + {0xc038, 185}, + {0x8003, 186}, + {0x8006, 186}, + {0x800a, 186}, + {0x800f, 186}, + {0x8018, 186}, + {0x801f, 186}, + {0x8029, 186}, + {0xc038, 186}, + }, + /* 139 */ + { + {0x8002, 187}, + {0x8009, 187}, + {0x8017, 187}, + {0xc028, 187}, + {0x8002, 189}, + {0x8009, 189}, + {0x8017, 189}, + {0xc028, 189}, + {0x8002, 190}, + {0x8009, 190}, + {0x8017, 190}, + {0xc028, 190}, + {0x8002, 196}, + {0x8009, 196}, + {0x8017, 196}, + {0xc028, 196}, + }, + /* 140 */ + { + {0x8003, 187}, + {0x8006, 187}, + {0x800a, 187}, + {0x800f, 187}, + {0x8018, 187}, + {0x801f, 187}, + {0x8029, 187}, + {0xc038, 187}, + {0x8003, 189}, + {0x8006, 189}, + {0x800a, 189}, + {0x800f, 189}, + {0x8018, 189}, + {0x801f, 189}, + {0x8029, 189}, + {0xc038, 189}, + }, + /* 141 */ + { + {0x8003, 190}, + {0x8006, 190}, + {0x800a, 190}, + {0x800f, 190}, + {0x8018, 190}, + {0x801f, 190}, + {0x8029, 190}, + {0xc038, 190}, + {0x8003, 196}, + {0x8006, 196}, + {0x800a, 196}, + {0x800f, 196}, + {0x8018, 196}, + {0x801f, 196}, + {0x8029, 196}, + {0xc038, 196}, + }, + /* 142 */ + { + {0x8001, 198}, + {0xc016, 198}, + {0x8001, 228}, + {0xc016, 228}, + {0x8001, 232}, + {0xc016, 232}, + {0x8001, 233}, + {0xc016, 233}, + {0xc000, 1}, + {0xc000, 135}, + {0xc000, 137}, + {0xc000, 138}, + {0xc000, 139}, + {0xc000, 140}, + {0xc000, 141}, + {0xc000, 143}, + }, + /* 143 */ + { + {0x8002, 198}, + {0x8009, 198}, + {0x8017, 198}, + {0xc028, 198}, + {0x8002, 228}, + {0x8009, 228}, + {0x8017, 228}, + {0xc028, 228}, + {0x8002, 232}, + {0x8009, 232}, + {0x8017, 232}, + {0xc028, 232}, + {0x8002, 233}, + {0x8009, 233}, + {0x8017, 233}, + {0xc028, 233}, + }, + /* 144 */ + { + {0x8003, 198}, + {0x8006, 198}, + {0x800a, 198}, + {0x800f, 198}, + {0x8018, 198}, + {0x801f, 198}, + {0x8029, 198}, + {0xc038, 198}, + {0x8003, 228}, + {0x8006, 228}, + {0x800a, 228}, + {0x800f, 228}, + {0x8018, 228}, + {0x801f, 228}, + {0x8029, 228}, + {0xc038, 228}, + }, + /* 145 */ + { + {0x8003, 232}, + {0x8006, 232}, + {0x800a, 232}, + {0x800f, 232}, + {0x8018, 232}, + {0x801f, 232}, + {0x8029, 232}, + {0xc038, 232}, + {0x8003, 233}, + {0x8006, 233}, + {0x800a, 233}, + {0x800f, 233}, + {0x8018, 233}, + {0x801f, 233}, + {0x8029, 233}, + {0xc038, 233}, + }, + /* 146 */ + { + {0x8001, 1}, + {0xc016, 1}, + {0x8001, 135}, + {0xc016, 135}, + {0x8001, 137}, + {0xc016, 137}, + {0x8001, 138}, + {0xc016, 138}, + {0x8001, 139}, + {0xc016, 139}, + {0x8001, 140}, + {0xc016, 140}, + {0x8001, 141}, + {0xc016, 141}, + {0x8001, 143}, + {0xc016, 143}, + }, + /* 147 */ + { + {0x8002, 1}, + {0x8009, 1}, + {0x8017, 1}, + {0xc028, 1}, + {0x8002, 135}, + {0x8009, 135}, + {0x8017, 135}, + {0xc028, 135}, + {0x8002, 137}, + {0x8009, 137}, + {0x8017, 137}, + {0xc028, 137}, + {0x8002, 138}, + {0x8009, 138}, + {0x8017, 138}, + {0xc028, 138}, + }, + /* 148 */ + { + {0x8003, 1}, + {0x8006, 1}, + {0x800a, 1}, + {0x800f, 1}, + {0x8018, 1}, + {0x801f, 1}, + {0x8029, 1}, + {0xc038, 1}, + {0x8003, 135}, + {0x8006, 135}, + {0x800a, 135}, + {0x800f, 135}, + {0x8018, 135}, + {0x801f, 135}, + {0x8029, 135}, + {0xc038, 135}, + }, + /* 149 */ + { + {0x8003, 137}, + {0x8006, 137}, + {0x800a, 137}, + {0x800f, 137}, + {0x8018, 137}, + {0x801f, 137}, + {0x8029, 137}, + {0xc038, 137}, + {0x8003, 138}, + {0x8006, 138}, + {0x800a, 138}, + {0x800f, 138}, + {0x8018, 138}, + {0x801f, 138}, + {0x8029, 138}, + {0xc038, 138}, + }, + /* 150 */ + { + {0x8002, 139}, + {0x8009, 139}, + {0x8017, 139}, + {0xc028, 139}, + {0x8002, 140}, + {0x8009, 140}, + {0x8017, 140}, + {0xc028, 140}, + {0x8002, 141}, + {0x8009, 141}, + {0x8017, 141}, + {0xc028, 141}, + {0x8002, 143}, + {0x8009, 143}, + {0x8017, 143}, + {0xc028, 143}, + }, + /* 151 */ + { + {0x8003, 139}, + {0x8006, 139}, + {0x800a, 139}, + {0x800f, 139}, + {0x8018, 139}, + {0x801f, 139}, + {0x8029, 139}, + {0xc038, 139}, + {0x8003, 140}, + {0x8006, 140}, + {0x800a, 140}, + {0x800f, 140}, + {0x8018, 140}, + {0x801f, 140}, + {0x8029, 140}, + {0xc038, 140}, + }, + /* 152 */ + { + {0x8003, 141}, + {0x8006, 141}, + {0x800a, 141}, + {0x800f, 141}, + {0x8018, 141}, + {0x801f, 141}, + {0x8029, 141}, + {0xc038, 141}, + {0x8003, 143}, + {0x8006, 143}, + {0x800a, 143}, + {0x800f, 143}, + {0x8018, 143}, + {0x801f, 143}, + {0x8029, 143}, + {0xc038, 143}, + }, + /* 153 */ + { + {0x9d, 0}, + {0x9e, 0}, + {0xa0, 0}, + {0xa1, 0}, + {0xa4, 0}, + {0xa5, 0}, + {0xa7, 0}, + {0xa8, 0}, + {0xac, 0}, + {0xad, 0}, + {0xaf, 0}, + {0xb1, 0}, + {0xb6, 0}, + {0xb9, 0}, + {0xbf, 0}, + {0xcf, 0}, + }, + /* 154 */ + { + {0xc000, 147}, + {0xc000, 149}, + {0xc000, 150}, + {0xc000, 151}, + {0xc000, 152}, + {0xc000, 155}, + {0xc000, 157}, + {0xc000, 158}, + {0xc000, 165}, + {0xc000, 166}, + {0xc000, 168}, + {0xc000, 174}, + {0xc000, 175}, + {0xc000, 180}, + {0xc000, 182}, + {0xc000, 183}, + }, + /* 155 */ + { + {0x8001, 147}, + {0xc016, 147}, + {0x8001, 149}, + {0xc016, 149}, + {0x8001, 150}, + {0xc016, 150}, + {0x8001, 151}, + {0xc016, 151}, + {0x8001, 152}, + {0xc016, 152}, + {0x8001, 155}, + {0xc016, 155}, + {0x8001, 157}, + {0xc016, 157}, + {0x8001, 158}, + {0xc016, 158}, + }, + /* 156 */ + { + {0x8002, 147}, + {0x8009, 147}, + {0x8017, 147}, + {0xc028, 147}, + {0x8002, 149}, + {0x8009, 149}, + {0x8017, 149}, + {0xc028, 149}, + {0x8002, 150}, + {0x8009, 150}, + {0x8017, 150}, + {0xc028, 150}, + {0x8002, 151}, + {0x8009, 151}, + {0x8017, 151}, + {0xc028, 151}, + }, + /* 157 */ + { + {0x8003, 147}, + {0x8006, 147}, + {0x800a, 147}, + {0x800f, 147}, + {0x8018, 147}, + {0x801f, 147}, + {0x8029, 147}, + {0xc038, 147}, + {0x8003, 149}, + {0x8006, 149}, + {0x800a, 149}, + {0x800f, 149}, + {0x8018, 149}, + {0x801f, 149}, + {0x8029, 149}, + {0xc038, 149}, + }, + /* 158 */ + { + {0x8003, 150}, + {0x8006, 150}, + {0x800a, 150}, + {0x800f, 150}, + {0x8018, 150}, + {0x801f, 150}, + {0x8029, 150}, + {0xc038, 150}, + {0x8003, 151}, + {0x8006, 151}, + {0x800a, 151}, + {0x800f, 151}, + {0x8018, 151}, + {0x801f, 151}, + {0x8029, 151}, + {0xc038, 151}, + }, + /* 159 */ + { + {0x8002, 152}, + {0x8009, 152}, + {0x8017, 152}, + {0xc028, 152}, + {0x8002, 155}, + {0x8009, 155}, + {0x8017, 155}, + {0xc028, 155}, + {0x8002, 157}, + {0x8009, 157}, + {0x8017, 157}, + {0xc028, 157}, + {0x8002, 158}, + {0x8009, 158}, + {0x8017, 158}, + {0xc028, 158}, + }, + /* 160 */ + { + {0x8003, 152}, + {0x8006, 152}, + {0x800a, 152}, + {0x800f, 152}, + {0x8018, 152}, + {0x801f, 152}, + {0x8029, 152}, + {0xc038, 152}, + {0x8003, 155}, + {0x8006, 155}, + {0x800a, 155}, + {0x800f, 155}, + {0x8018, 155}, + {0x801f, 155}, + {0x8029, 155}, + {0xc038, 155}, + }, + /* 161 */ + { + {0x8003, 157}, + {0x8006, 157}, + {0x800a, 157}, + {0x800f, 157}, + {0x8018, 157}, + {0x801f, 157}, + {0x8029, 157}, + {0xc038, 157}, + {0x8003, 158}, + {0x8006, 158}, + {0x800a, 158}, + {0x800f, 158}, + {0x8018, 158}, + {0x801f, 158}, + {0x8029, 158}, + {0xc038, 158}, + }, + /* 162 */ + { + {0x8001, 165}, + {0xc016, 165}, + {0x8001, 166}, + {0xc016, 166}, + {0x8001, 168}, + {0xc016, 168}, + {0x8001, 174}, + {0xc016, 174}, + {0x8001, 175}, + {0xc016, 175}, + {0x8001, 180}, + {0xc016, 180}, + {0x8001, 182}, + {0xc016, 182}, + {0x8001, 183}, + {0xc016, 183}, + }, + /* 163 */ + { + {0x8002, 165}, + {0x8009, 165}, + {0x8017, 165}, + {0xc028, 165}, + {0x8002, 166}, + {0x8009, 166}, + {0x8017, 166}, + {0xc028, 166}, + {0x8002, 168}, + {0x8009, 168}, + {0x8017, 168}, + {0xc028, 168}, + {0x8002, 174}, + {0x8009, 174}, + {0x8017, 174}, + {0xc028, 174}, + }, + /* 164 */ + { + {0x8003, 165}, + {0x8006, 165}, + {0x800a, 165}, + {0x800f, 165}, + {0x8018, 165}, + {0x801f, 165}, + {0x8029, 165}, + {0xc038, 165}, + {0x8003, 166}, + {0x8006, 166}, + {0x800a, 166}, + {0x800f, 166}, + {0x8018, 166}, + {0x801f, 166}, + {0x8029, 166}, + {0xc038, 166}, + }, + /* 165 */ + { + {0x8003, 168}, + {0x8006, 168}, + {0x800a, 168}, + {0x800f, 168}, + {0x8018, 168}, + {0x801f, 168}, + {0x8029, 168}, + {0xc038, 168}, + {0x8003, 174}, + {0x8006, 174}, + {0x800a, 174}, + {0x800f, 174}, + {0x8018, 174}, + {0x801f, 174}, + {0x8029, 174}, + {0xc038, 174}, + }, + /* 166 */ + { + {0x8002, 175}, + {0x8009, 175}, + {0x8017, 175}, + {0xc028, 175}, + {0x8002, 180}, + {0x8009, 180}, + {0x8017, 180}, + {0xc028, 180}, + {0x8002, 182}, + {0x8009, 182}, + {0x8017, 182}, + {0xc028, 182}, + {0x8002, 183}, + {0x8009, 183}, + {0x8017, 183}, + {0xc028, 183}, + }, + /* 167 */ + { + {0x8003, 175}, + {0x8006, 175}, + {0x800a, 175}, + {0x800f, 175}, + {0x8018, 175}, + {0x801f, 175}, + {0x8029, 175}, + {0xc038, 175}, + {0x8003, 180}, + {0x8006, 180}, + {0x800a, 180}, + {0x800f, 180}, + {0x8018, 180}, + {0x801f, 180}, + {0x8029, 180}, + {0xc038, 180}, + }, + /* 168 */ + { + {0x8003, 182}, + {0x8006, 182}, + {0x800a, 182}, + {0x800f, 182}, + {0x8018, 182}, + {0x801f, 182}, + {0x8029, 182}, + {0xc038, 182}, + {0x8003, 183}, + {0x8006, 183}, + {0x800a, 183}, + {0x800f, 183}, + {0x8018, 183}, + {0x801f, 183}, + {0x8029, 183}, + {0xc038, 183}, + }, + /* 169 */ + { + {0xc000, 188}, + {0xc000, 191}, + {0xc000, 197}, + {0xc000, 231}, + {0xc000, 239}, + {0xb0, 0}, + {0xb2, 0}, + {0xb3, 0}, + {0xb7, 0}, + {0xb8, 0}, + {0xba, 0}, + {0xbb, 0}, + {0xc0, 0}, + {0xc7, 0}, + {0xd0, 0}, + {0xdf, 0}, + }, + /* 170 */ + { + {0x8001, 188}, + {0xc016, 188}, + {0x8001, 191}, + {0xc016, 191}, + {0x8001, 197}, + {0xc016, 197}, + {0x8001, 231}, + {0xc016, 231}, + {0x8001, 239}, + {0xc016, 239}, + {0xc000, 9}, + {0xc000, 142}, + {0xc000, 144}, + {0xc000, 145}, + {0xc000, 148}, + {0xc000, 159}, + }, + /* 171 */ + { + {0x8002, 188}, + {0x8009, 188}, + {0x8017, 188}, + {0xc028, 188}, + {0x8002, 191}, + {0x8009, 191}, + {0x8017, 191}, + {0xc028, 191}, + {0x8002, 197}, + {0x8009, 197}, + {0x8017, 197}, + {0xc028, 197}, + {0x8002, 231}, + {0x8009, 231}, + {0x8017, 231}, + {0xc028, 231}, + }, + /* 172 */ + { + {0x8003, 188}, + {0x8006, 188}, + {0x800a, 188}, + {0x800f, 188}, + {0x8018, 188}, + {0x801f, 188}, + {0x8029, 188}, + {0xc038, 188}, + {0x8003, 191}, + {0x8006, 191}, + {0x800a, 191}, + {0x800f, 191}, + {0x8018, 191}, + {0x801f, 191}, + {0x8029, 191}, + {0xc038, 191}, + }, + /* 173 */ + { + {0x8003, 197}, + {0x8006, 197}, + {0x800a, 197}, + {0x800f, 197}, + {0x8018, 197}, + {0x801f, 197}, + {0x8029, 197}, + {0xc038, 197}, + {0x8003, 231}, + {0x8006, 231}, + {0x800a, 231}, + {0x800f, 231}, + {0x8018, 231}, + {0x801f, 231}, + {0x8029, 231}, + {0xc038, 231}, + }, + /* 174 */ + { + {0x8002, 239}, + {0x8009, 239}, + {0x8017, 239}, + {0xc028, 239}, + {0x8001, 9}, + {0xc016, 9}, + {0x8001, 142}, + {0xc016, 142}, + {0x8001, 144}, + {0xc016, 144}, + {0x8001, 145}, + {0xc016, 145}, + {0x8001, 148}, + {0xc016, 148}, + {0x8001, 159}, + {0xc016, 159}, + }, + /* 175 */ + { + {0x8003, 239}, + {0x8006, 239}, + {0x800a, 239}, + {0x800f, 239}, + {0x8018, 239}, + {0x801f, 239}, + {0x8029, 239}, + {0xc038, 239}, + {0x8002, 9}, + {0x8009, 9}, + {0x8017, 9}, + {0xc028, 9}, + {0x8002, 142}, + {0x8009, 142}, + {0x8017, 142}, + {0xc028, 142}, + }, + /* 176 */ + { + {0x8003, 9}, + {0x8006, 9}, + {0x800a, 9}, + {0x800f, 9}, + {0x8018, 9}, + {0x801f, 9}, + {0x8029, 9}, + {0xc038, 9}, + {0x8003, 142}, + {0x8006, 142}, + {0x800a, 142}, + {0x800f, 142}, + {0x8018, 142}, + {0x801f, 142}, + {0x8029, 142}, + {0xc038, 142}, + }, + /* 177 */ + { + {0x8002, 144}, + {0x8009, 144}, + {0x8017, 144}, + {0xc028, 144}, + {0x8002, 145}, + {0x8009, 145}, + {0x8017, 145}, + {0xc028, 145}, + {0x8002, 148}, + {0x8009, 148}, + {0x8017, 148}, + {0xc028, 148}, + {0x8002, 159}, + {0x8009, 159}, + {0x8017, 159}, + {0xc028, 159}, + }, + /* 178 */ + { + {0x8003, 144}, + {0x8006, 144}, + {0x800a, 144}, + {0x800f, 144}, + {0x8018, 144}, + {0x801f, 144}, + {0x8029, 144}, + {0xc038, 144}, + {0x8003, 145}, + {0x8006, 145}, + {0x800a, 145}, + {0x800f, 145}, + {0x8018, 145}, + {0x801f, 145}, + {0x8029, 145}, + {0xc038, 145}, + }, + /* 179 */ + { + {0x8003, 148}, + {0x8006, 148}, + {0x800a, 148}, + {0x800f, 148}, + {0x8018, 148}, + {0x801f, 148}, + {0x8029, 148}, + {0xc038, 148}, + {0x8003, 159}, + {0x8006, 159}, + {0x800a, 159}, + {0x800f, 159}, + {0x8018, 159}, + {0x801f, 159}, + {0x8029, 159}, + {0xc038, 159}, + }, + /* 180 */ + { + {0xc000, 171}, + {0xc000, 206}, + {0xc000, 215}, + {0xc000, 225}, + {0xc000, 236}, + {0xc000, 237}, + {0xbc, 0}, + {0xbd, 0}, + {0xc1, 0}, + {0xc4, 0}, + {0xc8, 0}, + {0xcb, 0}, + {0xd1, 0}, + {0xd8, 0}, + {0xe0, 0}, + {0xee, 0}, + }, + /* 181 */ + { + {0x8001, 171}, + {0xc016, 171}, + {0x8001, 206}, + {0xc016, 206}, + {0x8001, 215}, + {0xc016, 215}, + {0x8001, 225}, + {0xc016, 225}, + {0x8001, 236}, + {0xc016, 236}, + {0x8001, 237}, + {0xc016, 237}, + {0xc000, 199}, + {0xc000, 207}, + {0xc000, 234}, + {0xc000, 235}, + }, + /* 182 */ + { + {0x8002, 171}, + {0x8009, 171}, + {0x8017, 171}, + {0xc028, 171}, + {0x8002, 206}, + {0x8009, 206}, + {0x8017, 206}, + {0xc028, 206}, + {0x8002, 215}, + {0x8009, 215}, + {0x8017, 215}, + {0xc028, 215}, + {0x8002, 225}, + {0x8009, 225}, + {0x8017, 225}, + {0xc028, 225}, + }, + /* 183 */ + { + {0x8003, 171}, + {0x8006, 171}, + {0x800a, 171}, + {0x800f, 171}, + {0x8018, 171}, + {0x801f, 171}, + {0x8029, 171}, + {0xc038, 171}, + {0x8003, 206}, + {0x8006, 206}, + {0x800a, 206}, + {0x800f, 206}, + {0x8018, 206}, + {0x801f, 206}, + {0x8029, 206}, + {0xc038, 206}, + }, + /* 184 */ + { + {0x8003, 215}, + {0x8006, 215}, + {0x800a, 215}, + {0x800f, 215}, + {0x8018, 215}, + {0x801f, 215}, + {0x8029, 215}, + {0xc038, 215}, + {0x8003, 225}, + {0x8006, 225}, + {0x800a, 225}, + {0x800f, 225}, + {0x8018, 225}, + {0x801f, 225}, + {0x8029, 225}, + {0xc038, 225}, + }, + /* 185 */ + { + {0x8002, 236}, + {0x8009, 236}, + {0x8017, 236}, + {0xc028, 236}, + {0x8002, 237}, + {0x8009, 237}, + {0x8017, 237}, + {0xc028, 237}, + {0x8001, 199}, + {0xc016, 199}, + {0x8001, 207}, + {0xc016, 207}, + {0x8001, 234}, + {0xc016, 234}, + {0x8001, 235}, + {0xc016, 235}, + }, + /* 186 */ + { + {0x8003, 236}, + {0x8006, 236}, + {0x800a, 236}, + {0x800f, 236}, + {0x8018, 236}, + {0x801f, 236}, + {0x8029, 236}, + {0xc038, 236}, + {0x8003, 237}, + {0x8006, 237}, + {0x800a, 237}, + {0x800f, 237}, + {0x8018, 237}, + {0x801f, 237}, + {0x8029, 237}, + {0xc038, 237}, + }, + /* 187 */ + { + {0x8002, 199}, + {0x8009, 199}, + {0x8017, 199}, + {0xc028, 199}, + {0x8002, 207}, + {0x8009, 207}, + {0x8017, 207}, + {0xc028, 207}, + {0x8002, 234}, + {0x8009, 234}, + {0x8017, 234}, + {0xc028, 234}, + {0x8002, 235}, + {0x8009, 235}, + {0x8017, 235}, + {0xc028, 235}, + }, + /* 188 */ + { + {0x8003, 199}, + {0x8006, 199}, + {0x800a, 199}, + {0x800f, 199}, + {0x8018, 199}, + {0x801f, 199}, + {0x8029, 199}, + {0xc038, 199}, + {0x8003, 207}, + {0x8006, 207}, + {0x800a, 207}, + {0x800f, 207}, + {0x8018, 207}, + {0x801f, 207}, + {0x8029, 207}, + {0xc038, 207}, + }, + /* 189 */ + { + {0x8003, 234}, + {0x8006, 234}, + {0x800a, 234}, + {0x800f, 234}, + {0x8018, 234}, + {0x801f, 234}, + {0x8029, 234}, + {0xc038, 234}, + {0x8003, 235}, + {0x8006, 235}, + {0x800a, 235}, + {0x800f, 235}, + {0x8018, 235}, + {0x801f, 235}, + {0x8029, 235}, + {0xc038, 235}, + }, + /* 190 */ + { + {0xc2, 0}, + {0xc3, 0}, + {0xc5, 0}, + {0xc6, 0}, + {0xc9, 0}, + {0xca, 0}, + {0xcc, 0}, + {0xcd, 0}, + {0xd2, 0}, + {0xd5, 0}, + {0xd9, 0}, + {0xdc, 0}, + {0xe1, 0}, + {0xe7, 0}, + {0xef, 0}, + {0xf6, 0}, + }, + /* 191 */ + { + {0xc000, 192}, + {0xc000, 193}, + {0xc000, 200}, + {0xc000, 201}, + {0xc000, 202}, + {0xc000, 205}, + {0xc000, 210}, + {0xc000, 213}, + {0xc000, 218}, + {0xc000, 219}, + {0xc000, 238}, + {0xc000, 240}, + {0xc000, 242}, + {0xc000, 243}, + {0xc000, 255}, + {0xce, 0}, + }, + /* 192 */ + { + {0x8001, 192}, + {0xc016, 192}, + {0x8001, 193}, + {0xc016, 193}, + {0x8001, 200}, + {0xc016, 200}, + {0x8001, 201}, + {0xc016, 201}, + {0x8001, 202}, + {0xc016, 202}, + {0x8001, 205}, + {0xc016, 205}, + {0x8001, 210}, + {0xc016, 210}, + {0x8001, 213}, + {0xc016, 213}, + }, + /* 193 */ + { + {0x8002, 192}, + {0x8009, 192}, + {0x8017, 192}, + {0xc028, 192}, + {0x8002, 193}, + {0x8009, 193}, + {0x8017, 193}, + {0xc028, 193}, + {0x8002, 200}, + {0x8009, 200}, + {0x8017, 200}, + {0xc028, 200}, + {0x8002, 201}, + {0x8009, 201}, + {0x8017, 201}, + {0xc028, 201}, + }, + /* 194 */ + { + {0x8003, 192}, + {0x8006, 192}, + {0x800a, 192}, + {0x800f, 192}, + {0x8018, 192}, + {0x801f, 192}, + {0x8029, 192}, + {0xc038, 192}, + {0x8003, 193}, + {0x8006, 193}, + {0x800a, 193}, + {0x800f, 193}, + {0x8018, 193}, + {0x801f, 193}, + {0x8029, 193}, + {0xc038, 193}, + }, + /* 195 */ + { + {0x8003, 200}, + {0x8006, 200}, + {0x800a, 200}, + {0x800f, 200}, + {0x8018, 200}, + {0x801f, 200}, + {0x8029, 200}, + {0xc038, 200}, + {0x8003, 201}, + {0x8006, 201}, + {0x800a, 201}, + {0x800f, 201}, + {0x8018, 201}, + {0x801f, 201}, + {0x8029, 201}, + {0xc038, 201}, + }, + /* 196 */ + { + {0x8002, 202}, + {0x8009, 202}, + {0x8017, 202}, + {0xc028, 202}, + {0x8002, 205}, + {0x8009, 205}, + {0x8017, 205}, + {0xc028, 205}, + {0x8002, 210}, + {0x8009, 210}, + {0x8017, 210}, + {0xc028, 210}, + {0x8002, 213}, + {0x8009, 213}, + {0x8017, 213}, + {0xc028, 213}, + }, + /* 197 */ + { + {0x8003, 202}, + {0x8006, 202}, + {0x800a, 202}, + {0x800f, 202}, + {0x8018, 202}, + {0x801f, 202}, + {0x8029, 202}, + {0xc038, 202}, + {0x8003, 205}, + {0x8006, 205}, + {0x800a, 205}, + {0x800f, 205}, + {0x8018, 205}, + {0x801f, 205}, + {0x8029, 205}, + {0xc038, 205}, + }, + /* 198 */ + { + {0x8003, 210}, + {0x8006, 210}, + {0x800a, 210}, + {0x800f, 210}, + {0x8018, 210}, + {0x801f, 210}, + {0x8029, 210}, + {0xc038, 210}, + {0x8003, 213}, + {0x8006, 213}, + {0x800a, 213}, + {0x800f, 213}, + {0x8018, 213}, + {0x801f, 213}, + {0x8029, 213}, + {0xc038, 213}, + }, + /* 199 */ + { + {0x8001, 218}, + {0xc016, 218}, + {0x8001, 219}, + {0xc016, 219}, + {0x8001, 238}, + {0xc016, 238}, + {0x8001, 240}, + {0xc016, 240}, + {0x8001, 242}, + {0xc016, 242}, + {0x8001, 243}, + {0xc016, 243}, + {0x8001, 255}, + {0xc016, 255}, + {0xc000, 203}, + {0xc000, 204}, + }, + /* 200 */ + { + {0x8002, 218}, + {0x8009, 218}, + {0x8017, 218}, + {0xc028, 218}, + {0x8002, 219}, + {0x8009, 219}, + {0x8017, 219}, + {0xc028, 219}, + {0x8002, 238}, + {0x8009, 238}, + {0x8017, 238}, + {0xc028, 238}, + {0x8002, 240}, + {0x8009, 240}, + {0x8017, 240}, + {0xc028, 240}, + }, + /* 201 */ + { + {0x8003, 218}, + {0x8006, 218}, + {0x800a, 218}, + {0x800f, 218}, + {0x8018, 218}, + {0x801f, 218}, + {0x8029, 218}, + {0xc038, 218}, + {0x8003, 219}, + {0x8006, 219}, + {0x800a, 219}, + {0x800f, 219}, + {0x8018, 219}, + {0x801f, 219}, + {0x8029, 219}, + {0xc038, 219}, + }, + /* 202 */ + { + {0x8003, 238}, + {0x8006, 238}, + {0x800a, 238}, + {0x800f, 238}, + {0x8018, 238}, + {0x801f, 238}, + {0x8029, 238}, + {0xc038, 238}, + {0x8003, 240}, + {0x8006, 240}, + {0x800a, 240}, + {0x800f, 240}, + {0x8018, 240}, + {0x801f, 240}, + {0x8029, 240}, + {0xc038, 240}, + }, + /* 203 */ + { + {0x8002, 242}, + {0x8009, 242}, + {0x8017, 242}, + {0xc028, 242}, + {0x8002, 243}, + {0x8009, 243}, + {0x8017, 243}, + {0xc028, 243}, + {0x8002, 255}, + {0x8009, 255}, + {0x8017, 255}, + {0xc028, 255}, + {0x8001, 203}, + {0xc016, 203}, + {0x8001, 204}, + {0xc016, 204}, + }, + /* 204 */ + { + {0x8003, 242}, + {0x8006, 242}, + {0x800a, 242}, + {0x800f, 242}, + {0x8018, 242}, + {0x801f, 242}, + {0x8029, 242}, + {0xc038, 242}, + {0x8003, 243}, + {0x8006, 243}, + {0x800a, 243}, + {0x800f, 243}, + {0x8018, 243}, + {0x801f, 243}, + {0x8029, 243}, + {0xc038, 243}, + }, + /* 205 */ + { + {0x8003, 255}, + {0x8006, 255}, + {0x800a, 255}, + {0x800f, 255}, + {0x8018, 255}, + {0x801f, 255}, + {0x8029, 255}, + {0xc038, 255}, + {0x8002, 203}, + {0x8009, 203}, + {0x8017, 203}, + {0xc028, 203}, + {0x8002, 204}, + {0x8009, 204}, + {0x8017, 204}, + {0xc028, 204}, + }, + /* 206 */ + { + {0x8003, 203}, + {0x8006, 203}, + {0x800a, 203}, + {0x800f, 203}, + {0x8018, 203}, + {0x801f, 203}, + {0x8029, 203}, + {0xc038, 203}, + {0x8003, 204}, + {0x8006, 204}, + {0x800a, 204}, + {0x800f, 204}, + {0x8018, 204}, + {0x801f, 204}, + {0x8029, 204}, + {0xc038, 204}, + }, + /* 207 */ + { + {0xd3, 0}, + {0xd4, 0}, + {0xd6, 0}, + {0xd7, 0}, + {0xda, 0}, + {0xdb, 0}, + {0xdd, 0}, + {0xde, 0}, + {0xe2, 0}, + {0xe4, 0}, + {0xe8, 0}, + {0xeb, 0}, + {0xf0, 0}, + {0xf3, 0}, + {0xf7, 0}, + {0xfa, 0}, + }, + /* 208 */ + { + {0xc000, 211}, + {0xc000, 212}, + {0xc000, 214}, + {0xc000, 221}, + {0xc000, 222}, + {0xc000, 223}, + {0xc000, 241}, + {0xc000, 244}, + {0xc000, 245}, + {0xc000, 246}, + {0xc000, 247}, + {0xc000, 248}, + {0xc000, 250}, + {0xc000, 251}, + {0xc000, 252}, + {0xc000, 253}, + }, + /* 209 */ + { + {0x8001, 211}, + {0xc016, 211}, + {0x8001, 212}, + {0xc016, 212}, + {0x8001, 214}, + {0xc016, 214}, + {0x8001, 221}, + {0xc016, 221}, + {0x8001, 222}, + {0xc016, 222}, + {0x8001, 223}, + {0xc016, 223}, + {0x8001, 241}, + {0xc016, 241}, + {0x8001, 244}, + {0xc016, 244}, + }, + /* 210 */ + { + {0x8002, 211}, + {0x8009, 211}, + {0x8017, 211}, + {0xc028, 211}, + {0x8002, 212}, + {0x8009, 212}, + {0x8017, 212}, + {0xc028, 212}, + {0x8002, 214}, + {0x8009, 214}, + {0x8017, 214}, + {0xc028, 214}, + {0x8002, 221}, + {0x8009, 221}, + {0x8017, 221}, + {0xc028, 221}, + }, + /* 211 */ + { + {0x8003, 211}, + {0x8006, 211}, + {0x800a, 211}, + {0x800f, 211}, + {0x8018, 211}, + {0x801f, 211}, + {0x8029, 211}, + {0xc038, 211}, + {0x8003, 212}, + {0x8006, 212}, + {0x800a, 212}, + {0x800f, 212}, + {0x8018, 212}, + {0x801f, 212}, + {0x8029, 212}, + {0xc038, 212}, + }, + /* 212 */ + { + {0x8003, 214}, + {0x8006, 214}, + {0x800a, 214}, + {0x800f, 214}, + {0x8018, 214}, + {0x801f, 214}, + {0x8029, 214}, + {0xc038, 214}, + {0x8003, 221}, + {0x8006, 221}, + {0x800a, 221}, + {0x800f, 221}, + {0x8018, 221}, + {0x801f, 221}, + {0x8029, 221}, + {0xc038, 221}, + }, + /* 213 */ + { + {0x8002, 222}, + {0x8009, 222}, + {0x8017, 222}, + {0xc028, 222}, + {0x8002, 223}, + {0x8009, 223}, + {0x8017, 223}, + {0xc028, 223}, + {0x8002, 241}, + {0x8009, 241}, + {0x8017, 241}, + {0xc028, 241}, + {0x8002, 244}, + {0x8009, 244}, + {0x8017, 244}, + {0xc028, 244}, + }, + /* 214 */ + { + {0x8003, 222}, + {0x8006, 222}, + {0x800a, 222}, + {0x800f, 222}, + {0x8018, 222}, + {0x801f, 222}, + {0x8029, 222}, + {0xc038, 222}, + {0x8003, 223}, + {0x8006, 223}, + {0x800a, 223}, + {0x800f, 223}, + {0x8018, 223}, + {0x801f, 223}, + {0x8029, 223}, + {0xc038, 223}, + }, + /* 215 */ + { + {0x8003, 241}, + {0x8006, 241}, + {0x800a, 241}, + {0x800f, 241}, + {0x8018, 241}, + {0x801f, 241}, + {0x8029, 241}, + {0xc038, 241}, + {0x8003, 244}, + {0x8006, 244}, + {0x800a, 244}, + {0x800f, 244}, + {0x8018, 244}, + {0x801f, 244}, + {0x8029, 244}, + {0xc038, 244}, + }, + /* 216 */ + { + {0x8001, 245}, + {0xc016, 245}, + {0x8001, 246}, + {0xc016, 246}, + {0x8001, 247}, + {0xc016, 247}, + {0x8001, 248}, + {0xc016, 248}, + {0x8001, 250}, + {0xc016, 250}, + {0x8001, 251}, + {0xc016, 251}, + {0x8001, 252}, + {0xc016, 252}, + {0x8001, 253}, + {0xc016, 253}, + }, + /* 217 */ + { + {0x8002, 245}, + {0x8009, 245}, + {0x8017, 245}, + {0xc028, 245}, + {0x8002, 246}, + {0x8009, 246}, + {0x8017, 246}, + {0xc028, 246}, + {0x8002, 247}, + {0x8009, 247}, + {0x8017, 247}, + {0xc028, 247}, + {0x8002, 248}, + {0x8009, 248}, + {0x8017, 248}, + {0xc028, 248}, + }, + /* 218 */ + { + {0x8003, 245}, + {0x8006, 245}, + {0x800a, 245}, + {0x800f, 245}, + {0x8018, 245}, + {0x801f, 245}, + {0x8029, 245}, + {0xc038, 245}, + {0x8003, 246}, + {0x8006, 246}, + {0x800a, 246}, + {0x800f, 246}, + {0x8018, 246}, + {0x801f, 246}, + {0x8029, 246}, + {0xc038, 246}, + }, + /* 219 */ + { + {0x8003, 247}, + {0x8006, 247}, + {0x800a, 247}, + {0x800f, 247}, + {0x8018, 247}, + {0x801f, 247}, + {0x8029, 247}, + {0xc038, 247}, + {0x8003, 248}, + {0x8006, 248}, + {0x800a, 248}, + {0x800f, 248}, + {0x8018, 248}, + {0x801f, 248}, + {0x8029, 248}, + {0xc038, 248}, + }, + /* 220 */ + { + {0x8002, 250}, + {0x8009, 250}, + {0x8017, 250}, + {0xc028, 250}, + {0x8002, 251}, + {0x8009, 251}, + {0x8017, 251}, + {0xc028, 251}, + {0x8002, 252}, + {0x8009, 252}, + {0x8017, 252}, + {0xc028, 252}, + {0x8002, 253}, + {0x8009, 253}, + {0x8017, 253}, + {0xc028, 253}, + }, + /* 221 */ + { + {0x8003, 250}, + {0x8006, 250}, + {0x800a, 250}, + {0x800f, 250}, + {0x8018, 250}, + {0x801f, 250}, + {0x8029, 250}, + {0xc038, 250}, + {0x8003, 251}, + {0x8006, 251}, + {0x800a, 251}, + {0x800f, 251}, + {0x8018, 251}, + {0x801f, 251}, + {0x8029, 251}, + {0xc038, 251}, + }, + /* 222 */ + { + {0x8003, 252}, + {0x8006, 252}, + {0x800a, 252}, + {0x800f, 252}, + {0x8018, 252}, + {0x801f, 252}, + {0x8029, 252}, + {0xc038, 252}, + {0x8003, 253}, + {0x8006, 253}, + {0x800a, 253}, + {0x800f, 253}, + {0x8018, 253}, + {0x801f, 253}, + {0x8029, 253}, + {0xc038, 253}, + }, + /* 223 */ + { + {0xc000, 254}, + {0xe3, 0}, + {0xe5, 0}, + {0xe6, 0}, + {0xe9, 0}, + {0xea, 0}, + {0xec, 0}, + {0xed, 0}, + {0xf1, 0}, + {0xf2, 0}, + {0xf4, 0}, + {0xf5, 0}, + {0xf8, 0}, + {0xf9, 0}, + {0xfb, 0}, + {0xfc, 0}, + }, + /* 224 */ + { + {0x8001, 254}, + {0xc016, 254}, + {0xc000, 2}, + {0xc000, 3}, + {0xc000, 4}, + {0xc000, 5}, + {0xc000, 6}, + {0xc000, 7}, + {0xc000, 8}, + {0xc000, 11}, + {0xc000, 12}, + {0xc000, 14}, + {0xc000, 15}, + {0xc000, 16}, + {0xc000, 17}, + {0xc000, 18}, + }, + /* 225 */ + { + {0x8002, 254}, + {0x8009, 254}, + {0x8017, 254}, + {0xc028, 254}, + {0x8001, 2}, + {0xc016, 2}, + {0x8001, 3}, + {0xc016, 3}, + {0x8001, 4}, + {0xc016, 4}, + {0x8001, 5}, + {0xc016, 5}, + {0x8001, 6}, + {0xc016, 6}, + {0x8001, 7}, + {0xc016, 7}, + }, + /* 226 */ + { + {0x8003, 254}, + {0x8006, 254}, + {0x800a, 254}, + {0x800f, 254}, + {0x8018, 254}, + {0x801f, 254}, + {0x8029, 254}, + {0xc038, 254}, + {0x8002, 2}, + {0x8009, 2}, + {0x8017, 2}, + {0xc028, 2}, + {0x8002, 3}, + {0x8009, 3}, + {0x8017, 3}, + {0xc028, 3}, + }, + /* 227 */ + { + {0x8003, 2}, + {0x8006, 2}, + {0x800a, 2}, + {0x800f, 2}, + {0x8018, 2}, + {0x801f, 2}, + {0x8029, 2}, + {0xc038, 2}, + {0x8003, 3}, + {0x8006, 3}, + {0x800a, 3}, + {0x800f, 3}, + {0x8018, 3}, + {0x801f, 3}, + {0x8029, 3}, + {0xc038, 3}, + }, + /* 228 */ + { + {0x8002, 4}, + {0x8009, 4}, + {0x8017, 4}, + {0xc028, 4}, + {0x8002, 5}, + {0x8009, 5}, + {0x8017, 5}, + {0xc028, 5}, + {0x8002, 6}, + {0x8009, 6}, + {0x8017, 6}, + {0xc028, 6}, + {0x8002, 7}, + {0x8009, 7}, + {0x8017, 7}, + {0xc028, 7}, + }, + /* 229 */ + { + {0x8003, 4}, + {0x8006, 4}, + {0x800a, 4}, + {0x800f, 4}, + {0x8018, 4}, + {0x801f, 4}, + {0x8029, 4}, + {0xc038, 4}, + {0x8003, 5}, + {0x8006, 5}, + {0x800a, 5}, + {0x800f, 5}, + {0x8018, 5}, + {0x801f, 5}, + {0x8029, 5}, + {0xc038, 5}, + }, + /* 230 */ + { + {0x8003, 6}, + {0x8006, 6}, + {0x800a, 6}, + {0x800f, 6}, + {0x8018, 6}, + {0x801f, 6}, + {0x8029, 6}, + {0xc038, 6}, + {0x8003, 7}, + {0x8006, 7}, + {0x800a, 7}, + {0x800f, 7}, + {0x8018, 7}, + {0x801f, 7}, + {0x8029, 7}, + {0xc038, 7}, + }, + /* 231 */ + { + {0x8001, 8}, + {0xc016, 8}, + {0x8001, 11}, + {0xc016, 11}, + {0x8001, 12}, + {0xc016, 12}, + {0x8001, 14}, + {0xc016, 14}, + {0x8001, 15}, + {0xc016, 15}, + {0x8001, 16}, + {0xc016, 16}, + {0x8001, 17}, + {0xc016, 17}, + {0x8001, 18}, + {0xc016, 18}, + }, + /* 232 */ + { + {0x8002, 8}, + {0x8009, 8}, + {0x8017, 8}, + {0xc028, 8}, + {0x8002, 11}, + {0x8009, 11}, + {0x8017, 11}, + {0xc028, 11}, + {0x8002, 12}, + {0x8009, 12}, + {0x8017, 12}, + {0xc028, 12}, + {0x8002, 14}, + {0x8009, 14}, + {0x8017, 14}, + {0xc028, 14}, + }, + /* 233 */ + { + {0x8003, 8}, + {0x8006, 8}, + {0x800a, 8}, + {0x800f, 8}, + {0x8018, 8}, + {0x801f, 8}, + {0x8029, 8}, + {0xc038, 8}, + {0x8003, 11}, + {0x8006, 11}, + {0x800a, 11}, + {0x800f, 11}, + {0x8018, 11}, + {0x801f, 11}, + {0x8029, 11}, + {0xc038, 11}, + }, + /* 234 */ + { + {0x8003, 12}, + {0x8006, 12}, + {0x800a, 12}, + {0x800f, 12}, + {0x8018, 12}, + {0x801f, 12}, + {0x8029, 12}, + {0xc038, 12}, + {0x8003, 14}, + {0x8006, 14}, + {0x800a, 14}, + {0x800f, 14}, + {0x8018, 14}, + {0x801f, 14}, + {0x8029, 14}, + {0xc038, 14}, + }, + /* 235 */ + { + {0x8002, 15}, + {0x8009, 15}, + {0x8017, 15}, + {0xc028, 15}, + {0x8002, 16}, + {0x8009, 16}, + {0x8017, 16}, + {0xc028, 16}, + {0x8002, 17}, + {0x8009, 17}, + {0x8017, 17}, + {0xc028, 17}, + {0x8002, 18}, + {0x8009, 18}, + {0x8017, 18}, + {0xc028, 18}, + }, + /* 236 */ + { + {0x8003, 15}, + {0x8006, 15}, + {0x800a, 15}, + {0x800f, 15}, + {0x8018, 15}, + {0x801f, 15}, + {0x8029, 15}, + {0xc038, 15}, + {0x8003, 16}, + {0x8006, 16}, + {0x800a, 16}, + {0x800f, 16}, + {0x8018, 16}, + {0x801f, 16}, + {0x8029, 16}, + {0xc038, 16}, + }, + /* 237 */ + { + {0x8003, 17}, + {0x8006, 17}, + {0x800a, 17}, + {0x800f, 17}, + {0x8018, 17}, + {0x801f, 17}, + {0x8029, 17}, + {0xc038, 17}, + {0x8003, 18}, + {0x8006, 18}, + {0x800a, 18}, + {0x800f, 18}, + {0x8018, 18}, + {0x801f, 18}, + {0x8029, 18}, + {0xc038, 18}, + }, + /* 238 */ + { + {0xc000, 19}, + {0xc000, 20}, + {0xc000, 21}, + {0xc000, 23}, + {0xc000, 24}, + {0xc000, 25}, + {0xc000, 26}, + {0xc000, 27}, + {0xc000, 28}, + {0xc000, 29}, + {0xc000, 30}, + {0xc000, 31}, + {0xc000, 127}, + {0xc000, 220}, + {0xc000, 249}, + {0xfd, 0}, + }, + /* 239 */ + { + {0x8001, 19}, + {0xc016, 19}, + {0x8001, 20}, + {0xc016, 20}, + {0x8001, 21}, + {0xc016, 21}, + {0x8001, 23}, + {0xc016, 23}, + {0x8001, 24}, + {0xc016, 24}, + {0x8001, 25}, + {0xc016, 25}, + {0x8001, 26}, + {0xc016, 26}, + {0x8001, 27}, + {0xc016, 27}, + }, + /* 240 */ + { + {0x8002, 19}, + {0x8009, 19}, + {0x8017, 19}, + {0xc028, 19}, + {0x8002, 20}, + {0x8009, 20}, + {0x8017, 20}, + {0xc028, 20}, + {0x8002, 21}, + {0x8009, 21}, + {0x8017, 21}, + {0xc028, 21}, + {0x8002, 23}, + {0x8009, 23}, + {0x8017, 23}, + {0xc028, 23}, + }, + /* 241 */ + { + {0x8003, 19}, + {0x8006, 19}, + {0x800a, 19}, + {0x800f, 19}, + {0x8018, 19}, + {0x801f, 19}, + {0x8029, 19}, + {0xc038, 19}, + {0x8003, 20}, + {0x8006, 20}, + {0x800a, 20}, + {0x800f, 20}, + {0x8018, 20}, + {0x801f, 20}, + {0x8029, 20}, + {0xc038, 20}, + }, + /* 242 */ + { + {0x8003, 21}, + {0x8006, 21}, + {0x800a, 21}, + {0x800f, 21}, + {0x8018, 21}, + {0x801f, 21}, + {0x8029, 21}, + {0xc038, 21}, + {0x8003, 23}, + {0x8006, 23}, + {0x800a, 23}, + {0x800f, 23}, + {0x8018, 23}, + {0x801f, 23}, + {0x8029, 23}, + {0xc038, 23}, + }, + /* 243 */ + { + {0x8002, 24}, + {0x8009, 24}, + {0x8017, 24}, + {0xc028, 24}, + {0x8002, 25}, + {0x8009, 25}, + {0x8017, 25}, + {0xc028, 25}, + {0x8002, 26}, + {0x8009, 26}, + {0x8017, 26}, + {0xc028, 26}, + {0x8002, 27}, + {0x8009, 27}, + {0x8017, 27}, + {0xc028, 27}, + }, + /* 244 */ + { + {0x8003, 24}, + {0x8006, 24}, + {0x800a, 24}, + {0x800f, 24}, + {0x8018, 24}, + {0x801f, 24}, + {0x8029, 24}, + {0xc038, 24}, + {0x8003, 25}, + {0x8006, 25}, + {0x800a, 25}, + {0x800f, 25}, + {0x8018, 25}, + {0x801f, 25}, + {0x8029, 25}, + {0xc038, 25}, + }, + /* 245 */ + { + {0x8003, 26}, + {0x8006, 26}, + {0x800a, 26}, + {0x800f, 26}, + {0x8018, 26}, + {0x801f, 26}, + {0x8029, 26}, + {0xc038, 26}, + {0x8003, 27}, + {0x8006, 27}, + {0x800a, 27}, + {0x800f, 27}, + {0x8018, 27}, + {0x801f, 27}, + {0x8029, 27}, + {0xc038, 27}, + }, + /* 246 */ + { + {0x8001, 28}, + {0xc016, 28}, + {0x8001, 29}, + {0xc016, 29}, + {0x8001, 30}, + {0xc016, 30}, + {0x8001, 31}, + {0xc016, 31}, + {0x8001, 127}, + {0xc016, 127}, + {0x8001, 220}, + {0xc016, 220}, + {0x8001, 249}, + {0xc016, 249}, + {0xfe, 0}, + {0xff, 0}, + }, + /* 247 */ + { + {0x8002, 28}, + {0x8009, 28}, + {0x8017, 28}, + {0xc028, 28}, + {0x8002, 29}, + {0x8009, 29}, + {0x8017, 29}, + {0xc028, 29}, + {0x8002, 30}, + {0x8009, 30}, + {0x8017, 30}, + {0xc028, 30}, + {0x8002, 31}, + {0x8009, 31}, + {0x8017, 31}, + {0xc028, 31}, + }, + /* 248 */ + { + {0x8003, 28}, + {0x8006, 28}, + {0x800a, 28}, + {0x800f, 28}, + {0x8018, 28}, + {0x801f, 28}, + {0x8029, 28}, + {0xc038, 28}, + {0x8003, 29}, + {0x8006, 29}, + {0x800a, 29}, + {0x800f, 29}, + {0x8018, 29}, + {0x801f, 29}, + {0x8029, 29}, + {0xc038, 29}, + }, + /* 249 */ + { + {0x8003, 30}, + {0x8006, 30}, + {0x800a, 30}, + {0x800f, 30}, + {0x8018, 30}, + {0x801f, 30}, + {0x8029, 30}, + {0xc038, 30}, + {0x8003, 31}, + {0x8006, 31}, + {0x800a, 31}, + {0x800f, 31}, + {0x8018, 31}, + {0x801f, 31}, + {0x8029, 31}, + {0xc038, 31}, + }, + /* 250 */ + { + {0x8002, 127}, + {0x8009, 127}, + {0x8017, 127}, + {0xc028, 127}, + {0x8002, 220}, + {0x8009, 220}, + {0x8017, 220}, + {0xc028, 220}, + {0x8002, 249}, + {0x8009, 249}, + {0x8017, 249}, + {0xc028, 249}, + {0xc000, 10}, + {0xc000, 13}, + {0xc000, 22}, + {0x100, 0}, + }, + /* 251 */ + { + {0x8003, 127}, + {0x8006, 127}, + {0x800a, 127}, + {0x800f, 127}, + {0x8018, 127}, + {0x801f, 127}, + {0x8029, 127}, + {0xc038, 127}, + {0x8003, 220}, + {0x8006, 220}, + {0x800a, 220}, + {0x800f, 220}, + {0x8018, 220}, + {0x801f, 220}, + {0x8029, 220}, + {0xc038, 220}, + }, + /* 252 */ + { + {0x8003, 249}, + {0x8006, 249}, + {0x800a, 249}, + {0x800f, 249}, + {0x8018, 249}, + {0x801f, 249}, + {0x8029, 249}, + {0xc038, 249}, + {0x8001, 10}, + {0xc016, 10}, + {0x8001, 13}, + {0xc016, 13}, + {0x8001, 22}, + {0xc016, 22}, + {0x100, 0}, + {0x100, 0}, + }, + /* 253 */ + { + {0x8002, 10}, + {0x8009, 10}, + {0x8017, 10}, + {0xc028, 10}, + {0x8002, 13}, + {0x8009, 13}, + {0x8017, 13}, + {0xc028, 13}, + {0x8002, 22}, + {0x8009, 22}, + {0x8017, 22}, + {0xc028, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 254 */ + { + {0x8003, 10}, + {0x8006, 10}, + {0x800a, 10}, + {0x800f, 10}, + {0x8018, 10}, + {0x801f, 10}, + {0x8029, 10}, + {0xc038, 10}, + {0x8003, 13}, + {0x8006, 13}, + {0x800a, 13}, + {0x800f, 13}, + {0x8018, 13}, + {0x801f, 13}, + {0x8029, 13}, + {0xc038, 13}, + }, + /* 255 */ + { + {0x8003, 22}, + {0x8006, 22}, + {0x800a, 22}, + {0x800f, 22}, + {0x8018, 22}, + {0x801f, 22}, + {0x8029, 22}, + {0xc038, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 256 */ + { + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, }; diff --git a/deps/nghttp2/lib/nghttp2_helper.c b/deps/nghttp2/lib/nghttp2_helper.c index 93dd4754b7f304..f54f37c13e2716 100644 --- a/deps/nghttp2/lib/nghttp2_helper.c +++ b/deps/nghttp2/lib/nghttp2_helper.c @@ -53,70 +53,70 @@ uint32_t nghttp2_get_uint32(const uint8_t *data) { /* Generated by gendowncasetbl.py */ static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, - 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, - 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, - 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, - 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, - 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, - 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, - 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, - 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, - 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, - 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, - 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, - 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, - 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, - 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, - 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, - 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, - 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, - 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, - 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, - 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, - 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, - 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, - 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, - 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, - 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, - 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, + 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, + 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, + 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, + 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, + 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, + 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, + 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, + 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, + 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, + 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, + 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, + 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, + 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, + 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, + 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, + 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, + 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, + 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, + 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, + 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, + 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, + 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, + 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, + 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, + 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, + 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, + 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, + 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, + 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, + 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, + 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, + 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, + 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, + 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, + 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, + 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, + 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, + 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, + 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, + 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, + 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, + 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, + 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, + 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, + 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, + 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, + 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, + 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, + 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, + 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, + 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, + 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, + 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, + 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, + 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, + 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, + 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, + 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, + 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, + 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, + 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, + 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, + 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, + 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, }; void nghttp2_downcase(uint8_t *s, size_t len) { @@ -160,7 +160,7 @@ int nghttp2_adjust_local_window_size(int32_t *local_window_size_ptr, int32_t recv_reduction_delta; int32_t delta; int32_t new_recv_window_size = - nghttp2_max(0, *recv_window_size_ptr) - *delta_ptr; + nghttp2_max_int32(0, *recv_window_size_ptr) - *delta_ptr; if (new_recv_window_size >= 0) { *recv_window_size_ptr = new_recv_window_size; @@ -177,7 +177,7 @@ int nghttp2_adjust_local_window_size(int32_t *local_window_size_ptr, *local_window_size_ptr += delta; /* If there is recv_reduction due to earlier window_size reduction, we have to adjust it too. */ - recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta); + recv_reduction_delta = nghttp2_min_int32(*recv_reduction_ptr, delta); *recv_reduction_ptr -= recv_reduction_delta; if (*recv_window_size_ptr < 0) { *recv_window_size_ptr += recv_reduction_delta; @@ -233,7 +233,7 @@ int nghttp2_increase_local_window_size(int32_t *local_window_size_ptr, *local_window_size_ptr += delta; /* If there is recv_reduction due to earlier window_size reduction, we have to adjust it too. */ - recv_reduction_delta = nghttp2_min(*recv_reduction_ptr, delta); + recv_reduction_delta = nghttp2_min_int32(*recv_reduction_ptr, delta); *recv_reduction_ptr -= recv_reduction_delta; *recv_window_size_ptr += recv_reduction_delta; @@ -336,6 +336,8 @@ const char *nghttp2_strerror(int error_code) { "closed"; case NGHTTP2_ERR_TOO_MANY_SETTINGS: return "SETTINGS frame contained more than the maximum allowed entries"; + case NGHTTP2_ERR_TOO_MANY_CONTINUATIONS: + return "Too many CONTINUATION frames following a HEADER frame"; default: return "Unknown error code"; } @@ -343,70 +345,70 @@ const char *nghttp2_strerror(int error_code) { /* Generated by gennmchartbl.py */ static const int VALID_HD_NAME_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */, - 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */, - 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */, - 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, - 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, - 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */, - 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, + 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, + 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */, + 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */, + 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */, + 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, + 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, + 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */, + 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */, + 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ }; int nghttp2_check_header_name(const uint8_t *name, size_t len) { @@ -431,70 +433,70 @@ int nghttp2_check_header_name(const uint8_t *name, size_t len) { /* Generated by genvchartbl.py */ static const int VALID_HD_VALUE_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ }; int nghttp2_check_header_value(const uint8_t *value, size_t len) { @@ -522,70 +524,70 @@ int nghttp2_check_header_value_rfc9113(const uint8_t *value, size_t len) { /* Generated by genmethodchartbl.py */ static char VALID_METHOD_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, + 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, + 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, + 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ }; int nghttp2_check_method(const uint8_t *value, size_t len) { @@ -603,70 +605,70 @@ int nghttp2_check_method(const uint8_t *value, size_t len) { /* Generated by genpathchartbl.py */ static char VALID_PATH_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ }; int nghttp2_check_path(const uint8_t *value, size_t len) { @@ -681,70 +683,70 @@ int nghttp2_check_path(const uint8_t *value, size_t len) { /* Generated by genauthoritychartbl.py */ static char VALID_AUTHORITY_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, - 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, + 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ }; int nghttp2_check_authority(const uint8_t *value, size_t len) { diff --git a/deps/nghttp2/lib/nghttp2_helper.h b/deps/nghttp2/lib/nghttp2_helper.h index b1f18ce541ac36..f5de6290dab0e1 100644 --- a/deps/nghttp2/lib/nghttp2_helper.h +++ b/deps/nghttp2/lib/nghttp2_helper.h @@ -35,13 +35,36 @@ #include <nghttp2/nghttp2.h> #include "nghttp2_mem.h" -#define nghttp2_min(A, B) ((A) < (B) ? (A) : (B)) -#define nghttp2_max(A, B) ((A) > (B) ? (A) : (B)) +#define nghttp2_max_def(SUFFIX, T) \ + static inline T nghttp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; } + +nghttp2_max_def(int8, int8_t) +nghttp2_max_def(int16, int16_t) +nghttp2_max_def(int32, int32_t) +nghttp2_max_def(int64, int64_t) +nghttp2_max_def(uint8, uint8_t) +nghttp2_max_def(uint16, uint16_t) +nghttp2_max_def(uint32, uint32_t) +nghttp2_max_def(uint64, uint64_t) +nghttp2_max_def(size, size_t) + +#define nghttp2_min_def(SUFFIX, T) \ + static inline T nghttp2_min_##SUFFIX(T a, T b) { return a < b ? a : b; } + +nghttp2_min_def(int8, int8_t) +nghttp2_min_def(int16, int16_t) +nghttp2_min_def(int32, int32_t) +nghttp2_min_def(int64, int64_t) +nghttp2_min_def(uint8, uint8_t) +nghttp2_min_def(uint16, uint16_t) +nghttp2_min_def(uint32, uint32_t) +nghttp2_min_def(uint64, uint64_t) +nghttp2_min_def(size, size_t) #define lstreq(A, B, N) ((sizeof((A)) - 1) == (N) && memcmp((A), (B), (N)) == 0) #define nghttp2_struct_of(ptr, type, member) \ - ((type *)(void *)((char *)(ptr)-offsetof(type, member))) + ((type *)(void *)((char *)(ptr) - offsetof(type, member))) /* * Copies 2 byte unsigned integer |n| in host byte order to |buf| in diff --git a/deps/nghttp2/lib/nghttp2_http.c b/deps/nghttp2/lib/nghttp2_http.c index ecdeb21ddb694c..f222fe5e3fbe3c 100644 --- a/deps/nghttp2/lib/nghttp2_http.c +++ b/deps/nghttp2/lib/nghttp2_http.c @@ -347,6 +347,84 @@ static int lws(const uint8_t *s, size_t n) { return 1; } +/* Generated by genauthoritychartbl.py, but '@' is not allowed */ +static char VALID_AUTHORITY_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, + 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, + 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +}; + +static int check_authority(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_AUTHORITY_CHARS[*value]) { + return 0; + } + } + return 1; +} + int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, nghttp2_frame *frame, nghttp2_hd_nv *nv, int trailer) { @@ -388,10 +466,10 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, case NGHTTP2_TOKEN__AUTHORITY: case NGHTTP2_TOKEN_HOST: if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) { - rv = nghttp2_check_authority(nv->value->base, nv->value->len); + rv = check_authority(nv->value->base, nv->value->len); } else if ( - stream->flags & - NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { + stream->flags & + NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { rv = nghttp2_check_header_value(nv->value->base, nv->value->len); } else { rv = nghttp2_check_header_value_rfc9113(nv->value->base, nv->value->len); @@ -435,7 +513,7 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) { return http_request_on_header(stream, nv, trailer, session->server && - session->pending_enable_connect_protocol); + session->pending_enable_connect_protocol); } return http_response_on_header(stream, nv, trailer); @@ -453,7 +531,7 @@ int nghttp2_http_on_request_headers(nghttp2_stream *stream, stream->content_length = -1; } else { if ((stream->http_flags & NGHTTP2_HTTP_FLAG_REQ_HEADERS) != - NGHTTP2_HTTP_FLAG_REQ_HEADERS || + NGHTTP2_HTTP_FLAG_REQ_HEADERS || (stream->http_flags & (NGHTTP2_HTTP_FLAG__AUTHORITY | NGHTTP2_HTTP_FLAG_HOST)) == 0) { return -1; @@ -493,7 +571,7 @@ int nghttp2_http_on_response_headers(nghttp2_stream *stream) { } stream->http_flags = - stream->http_flags & (uint32_t)~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE; + stream->http_flags & (uint32_t)~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE; if (!expect_response_body(stream)) { stream->content_length = 0; diff --git a/deps/nghttp2/lib/nghttp2_map.c b/deps/nghttp2/lib/nghttp2_map.c index 0aaaf29155cd02..ee6bb1967ec6da 100644 --- a/deps/nghttp2/lib/nghttp2_map.c +++ b/deps/nghttp2/lib/nghttp2_map.c @@ -35,8 +35,7 @@ void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem) { map->mem = mem; - map->tablelen = 0; - map->tablelenbits = 0; + map->hashbits = 0; map->table = NULL; map->size = 0; } @@ -49,33 +48,20 @@ void nghttp2_map_free(nghttp2_map *map) { nghttp2_mem_free(map->mem, map->table); } -void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr), - void *ptr) { - uint32_t i; - nghttp2_map_bucket *bkt; - - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { - continue; - } - - func(bkt->data, ptr); - } -} - -int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr), +int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; - uint32_t i; + size_t i; nghttp2_map_bucket *bkt; + size_t tablelen; if (map->size == 0) { return 0; } - for (i = 0; i < map->tablelen; ++i) { + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { @@ -91,82 +77,61 @@ int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr), return 0; } -static uint32_t hash(nghttp2_map_key_type key) { - return (uint32_t)key * 2654435769u; -} - -static size_t h2idx(uint32_t hash, uint32_t bits) { - return hash >> (32 - bits); -} - -static size_t distance(uint32_t tablelen, uint32_t tablelenbits, - nghttp2_map_bucket *bkt, size_t idx) { - return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1); +static size_t hash(nghttp2_map_key_type key, size_t bits) { + return (size_t)(((uint32_t)key * 2654435769u) >> (32 - bits)); } -static void map_bucket_swap(nghttp2_map_bucket *bkt, uint32_t *phash, - nghttp2_map_key_type *pkey, void **pdata) { - uint32_t h = bkt->hash; - nghttp2_map_key_type key = bkt->key; - void *data = bkt->data; - - bkt->hash = *phash; - bkt->key = *pkey; - bkt->data = *pdata; +static void map_bucket_swap(nghttp2_map_bucket *a, nghttp2_map_bucket *b) { + nghttp2_map_bucket c = *a; - *phash = h; - *pkey = key; - *pdata = data; -} - -static void map_bucket_set_data(nghttp2_map_bucket *bkt, uint32_t hash, - nghttp2_map_key_type key, void *data) { - bkt->hash = hash; - bkt->key = key; - bkt->data = data; + *a = *b; + *b = c; } #ifndef WIN32 -void nghttp2_map_print_distance(nghttp2_map *map) { - uint32_t i; +void nghttp2_map_print_distance(const nghttp2_map *map) { + size_t i; size_t idx; nghttp2_map_bucket *bkt; + size_t tablelen; - for (i = 0; i < map->tablelen; ++i) { + if (map->size == 0) { + return; + } + + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { - fprintf(stderr, "@%u <EMPTY>\n", i); + fprintf(stderr, "@%zu <EMPTY>\n", i); continue; } - idx = h2idx(bkt->hash, map->tablelenbits); - fprintf(stderr, "@%u hash=%08x key=%d base=%zu distance=%zu\n", i, - bkt->hash, bkt->key, idx, - distance(map->tablelen, map->tablelenbits, bkt, idx)); + idx = hash(bkt->key, map->hashbits); + fprintf(stderr, "@%zu hash=%zu key=%d base=%zu distance=%u\n", i, + hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); } } #endif /* !WIN32 */ -static int insert(nghttp2_map_bucket *table, uint32_t tablelen, - uint32_t tablelenbits, uint32_t hash, +static int insert(nghttp2_map_bucket *table, size_t hashbits, nghttp2_map_key_type key, void *data) { - size_t idx = h2idx(hash, tablelenbits); - size_t d = 0, dd; - nghttp2_map_bucket *bkt; + size_t idx = hash(key, hashbits); + nghttp2_map_bucket b = {0, key, data}, *bkt; + size_t mask = (1u << hashbits) - 1; for (;;) { bkt = &table[idx]; if (bkt->data == NULL) { - map_bucket_set_data(bkt, hash, key, data); + *bkt = b; return 0; } - dd = distance(tablelen, tablelenbits, bkt, idx); - if (d > dd) { - map_bucket_swap(bkt, &hash, &key, &data); - d = dd; + if (b.psl > bkt->psl) { + map_bucket_swap(bkt, &b); } else if (bkt->key == key) { /* TODO This check is just a waste after first swap or if this function is called from map_resize. That said, there is no @@ -175,41 +140,42 @@ static int insert(nghttp2_map_bucket *table, uint32_t tablelen, return NGHTTP2_ERR_INVALID_ARGUMENT; } - ++d; - idx = (idx + 1) & (tablelen - 1); + ++b.psl; + idx = (idx + 1) & mask; } } -/* new_tablelen must be power of 2 and new_tablelen == (1 << - new_tablelenbits) must hold. */ -static int map_resize(nghttp2_map *map, uint32_t new_tablelen, - uint32_t new_tablelenbits) { - uint32_t i; +static int map_resize(nghttp2_map *map, size_t new_hashbits) { + size_t i; nghttp2_map_bucket *new_table; nghttp2_map_bucket *bkt; + size_t tablelen; int rv; (void)rv; - new_table = - nghttp2_mem_calloc(map->mem, new_tablelen, sizeof(nghttp2_map_bucket)); + new_table = nghttp2_mem_calloc(map->mem, 1u << new_hashbits, + sizeof(nghttp2_map_bucket)); if (new_table == NULL) { return NGHTTP2_ERR_NOMEM; } - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { - continue; - } - rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key, - bkt->data); + if (map->size) { + tablelen = 1u << map->hashbits; - assert(0 == rv); + for (i = 0; i < tablelen; ++i) { + bkt = &map->table[i]; + if (bkt->data == NULL) { + continue; + } + + rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + + assert(0 == rv); + } } nghttp2_mem_free(map->mem, map->table); - map->tablelen = new_tablelen; - map->tablelenbits = new_tablelenbits; + map->hashbits = new_hashbits; map->table = new_table; return 0; @@ -221,48 +187,49 @@ int nghttp2_map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data) { assert(data); /* Load factor is 0.75 */ - if ((map->size + 1) * 4 > map->tablelen * 3) { - if (map->tablelen) { - rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1); + /* Under the very initial condition, that is map->size == 0 and + map->hashbits == 0, 4 > 3 still holds nicely. */ + if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + if (map->hashbits) { + rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, 1 << NGHTTP2_INITIAL_TABLE_LENBITS, - NGHTTP2_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGHTTP2_INITIAL_TABLE_LENBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key, - data); + rv = insert(map->table, map->hashbits, key, data); if (rv != 0) { return rv; } + ++map->size; + return 0; } -void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key) { - uint32_t h; +void *nghttp2_map_find(const nghttp2_map *map, nghttp2_map_key_type key) { size_t idx; nghttp2_map_bucket *bkt; - size_t d = 0; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NULL; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NULL; } @@ -270,50 +237,47 @@ void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key) { return bkt->data; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key) { - uint32_t h; - size_t idx, didx; - nghttp2_map_bucket *bkt; - size_t d = 0; + size_t idx; + nghttp2_map_bucket *b, *bkt; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NGHTTP2_ERR_INVALID_ARGUMENT; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NGHTTP2_ERR_INVALID_ARGUMENT; } if (bkt->key == key) { - map_bucket_set_data(bkt, 0, 0, NULL); - - didx = idx; - idx = (idx + 1) & (map->tablelen - 1); + b = bkt; + idx = (idx + 1) & mask; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) { + if (bkt->data == NULL || bkt->psl == 0) { + b->data = NULL; break; } - map->table[didx] = *bkt; - map_bucket_set_data(bkt, 0, 0, NULL); - didx = idx; + --bkt->psl; + *b = *bkt; + b = bkt; - idx = (idx + 1) & (map->tablelen - 1); + idx = (idx + 1) & mask; } --map->size; @@ -321,18 +285,18 @@ int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key) { return 0; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } void nghttp2_map_clear(nghttp2_map *map) { - if (map->tablelen == 0) { + if (map->size == 0) { return; } - memset(map->table, 0, sizeof(*map->table) * map->tablelen); + memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); map->size = 0; } -size_t nghttp2_map_size(nghttp2_map *map) { return map->size; } +size_t nghttp2_map_size(const nghttp2_map *map) { return map->size; } diff --git a/deps/nghttp2/lib/nghttp2_map.h b/deps/nghttp2/lib/nghttp2_map.h index 236d28296e31da..5adfb78d027679 100644 --- a/deps/nghttp2/lib/nghttp2_map.h +++ b/deps/nghttp2/lib/nghttp2_map.h @@ -39,7 +39,7 @@ typedef int32_t nghttp2_map_key_type; typedef struct nghttp2_map_bucket { - uint32_t hash; + uint32_t psl; nghttp2_map_key_type key; void *data; } nghttp2_map_bucket; @@ -48,33 +48,24 @@ typedef struct nghttp2_map { nghttp2_map_bucket *table; nghttp2_mem *mem; size_t size; - uint32_t tablelen; - uint32_t tablelenbits; + size_t hashbits; } nghttp2_map; /* - * Initializes the map |map|. + * nghttp2_map_init initializes the map |map|. */ void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem); /* - * Deallocates any resources allocated for |map|. The stored entries - * are not freed by this function. Use nghttp2_map_each_free() to free - * each entries. + * nghttp2_map_free deallocates any resources allocated for |map|. + * The stored entries are not freed by this function. Use + * nghttp2_map_each() to free each entry. */ void nghttp2_map_free(nghttp2_map *map); /* - * Deallocates each entries using |func| function and any resources - * allocated for |map|. The |func| function is responsible for freeing - * given the |data| object. The |ptr| will be passed to the |func| as - * send argument. The return value of the |func| will be ignored. - */ -void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr), - void *ptr); - -/* - * Inserts the new |data| with the |key| to the map |map|. + * nghttp2_map_insert inserts the new |data| with the |key| to the map + * |map|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -82,57 +73,56 @@ void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr), * NGHTTP2_ERR_INVALID_ARGUMENT * The item associated by |key| already exists. * NGHTTP2_ERR_NOMEM - * Out of memory + * Out of memory */ int nghttp2_map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data); /* - * Returns the data associated by the key |key|. If there is no such - * data, this function returns NULL. + * nghttp2_map_find returns the entry associated by the key |key|. If + * there is no such entry, this function returns NULL. */ -void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key); +void *nghttp2_map_find(const nghttp2_map *map, nghttp2_map_key_type key); /* - * Removes the data associated by the key |key| from the |map|. The - * removed data is not freed by this function. + * nghttp2_map_remove removes the entry associated by the key |key| + * from the |map|. The removed entry is not freed by this function. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP2_ERR_INVALID_ARGUMENT - * The data associated by |key| does not exist. + * The entry associated by |key| does not exist. */ int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key); /* - * Removes all entries from |map|. + * nghttp2_map_clear removes all entries from |map|. The removed + * entry is not freed by this function. */ void nghttp2_map_clear(nghttp2_map *map); /* - * Returns the number of items stored in the map |map|. + * nghttp2_map_size returns the number of items stored in the map + * |map|. */ -size_t nghttp2_map_size(nghttp2_map *map); +size_t nghttp2_map_size(const nghttp2_map *map); /* - * Applies the function |func| to each data in the |map| with the - * optional user supplied pointer |ptr|. + * nghttp2_map_each applies the function |func| to each entry in the + * |map| with the optional user supplied pointer |ptr|. * * If the |func| returns 0, this function calls the |func| with the - * next data. If the |func| returns nonzero, it will not call the + * next entry. If the |func| returns nonzero, it will not call the * |func| for further entries and return the return value of the * |func| immediately. Thus, this function returns 0 if all the * invocations of the |func| return 0, or nonzero value which the last * invocation of |func| returns. - * - * Don't use this function to free each data. Use - * nghttp2_map_each_free() instead. */ -int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr), +int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr), void *ptr); #ifndef WIN32 -void nghttp2_map_print_distance(nghttp2_map *map); +void nghttp2_map_print_distance(const nghttp2_map *map); #endif /* !WIN32 */ #endif /* NGHTTP2_MAP_H */ diff --git a/deps/nghttp2/lib/nghttp2_option.c b/deps/nghttp2/lib/nghttp2_option.c index 43d4e952291ba4..02a24eee6b2605 100644 --- a/deps/nghttp2/lib/nghttp2_option.c +++ b/deps/nghttp2/lib/nghttp2_option.c @@ -132,15 +132,15 @@ void nghttp2_option_set_max_settings(nghttp2_option *option, size_t val) { } void nghttp2_option_set_server_fallback_rfc7540_priorities( - nghttp2_option *option, int val) { + nghttp2_option *option, int val) { option->opt_set_mask |= NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES; option->server_fallback_rfc7540_priorities = val; } void nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation( - nghttp2_option *option, int val) { + nghttp2_option *option, int val) { option->opt_set_mask |= - NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION; + NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION; option->no_rfc9113_leading_and_trailing_ws_validation = val; } @@ -150,3 +150,8 @@ void nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option, option->stream_reset_burst = burst; option->stream_reset_rate = rate; } + +void nghttp2_option_set_max_continuations(nghttp2_option *option, size_t val) { + option->opt_set_mask |= NGHTTP2_OPT_MAX_CONTINUATIONS; + option->max_continuations = val; +} diff --git a/deps/nghttp2/lib/nghttp2_option.h b/deps/nghttp2/lib/nghttp2_option.h index 2259e1849d810f..c89cb97f8bb685 100644 --- a/deps/nghttp2/lib/nghttp2_option.h +++ b/deps/nghttp2/lib/nghttp2_option.h @@ -71,6 +71,7 @@ typedef enum { NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES = 1 << 13, NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 14, NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT = 1 << 15, + NGHTTP2_OPT_MAX_CONTINUATIONS = 1 << 16, } nghttp2_option_flag; /** @@ -98,6 +99,10 @@ struct nghttp2_option { * NGHTTP2_OPT_MAX_SETTINGS */ size_t max_settings; + /** + * NGHTTP2_OPT_MAX_CONTINUATIONS + */ + size_t max_continuations; /** * Bitwise OR of nghttp2_option_flag to determine that which fields * are specified. diff --git a/deps/nghttp2/lib/nghttp2_pq.c b/deps/nghttp2/lib/nghttp2_pq.c index 64353acc961dc3..e79ba8365e82e2 100644 --- a/deps/nghttp2/lib/nghttp2_pq.c +++ b/deps/nghttp2/lib/nghttp2_pq.c @@ -69,7 +69,7 @@ int nghttp2_pq_push(nghttp2_pq *pq, nghttp2_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = nghttp2_max(4, (pq->capacity * 2)); + ncapacity = nghttp2_max_size(4, (pq->capacity * 2)); nq = nghttp2_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(nghttp2_pq_entry *)); diff --git a/deps/nghttp2/lib/nghttp2_queue.c b/deps/nghttp2/lib/nghttp2_queue.c index 055eb69c7e5535..3b63158524593b 100644 --- a/deps/nghttp2/lib/nghttp2_queue.c +++ b/deps/nghttp2/lib/nghttp2_queue.c @@ -46,7 +46,7 @@ void nghttp2_queue_free(nghttp2_queue *queue) { int nghttp2_queue_push(nghttp2_queue *queue, void *data) { nghttp2_queue_cell *new_cell = - (nghttp2_queue_cell *)malloc(sizeof(nghttp2_queue_cell)); + (nghttp2_queue_cell *)malloc(sizeof(nghttp2_queue_cell)); if (!new_cell) { return NGHTTP2_ERR_NOMEM; } diff --git a/deps/nghttp2/lib/nghttp2_ratelim.c b/deps/nghttp2/lib/nghttp2_ratelim.c index 7011655b006f7c..604ac0801a7acc 100644 --- a/deps/nghttp2/lib/nghttp2_ratelim.c +++ b/deps/nghttp2/lib/nghttp2_ratelim.c @@ -61,7 +61,7 @@ void nghttp2_ratelim_update(nghttp2_ratelim *rl, uint64_t tstamp) { } rl->val += gain; - rl->val = nghttp2_min(rl->val, rl->burst); + rl->val = nghttp2_min_uint64(rl->val, rl->burst); } int nghttp2_ratelim_drain(nghttp2_ratelim *rl, uint64_t n) { diff --git a/deps/nghttp2/lib/nghttp2_session.c b/deps/nghttp2/lib/nghttp2_session.c index 226cdd59e8e98e..df33a89efdc1d3 100644 --- a/deps/nghttp2/lib/nghttp2_session.c +++ b/deps/nghttp2/lib/nghttp2_session.c @@ -239,9 +239,9 @@ static int session_terminate_session(nghttp2_session *session, debug_datalen = strlen(reason); } - rv = nghttp2_session_add_goaway(session, last_stream_id, error_code, - debug_data, debug_datalen, - NGHTTP2_GOAWAY_AUX_TERM_ON_SEND); + rv = + nghttp2_session_add_goaway(session, last_stream_id, error_code, debug_data, + debug_datalen, NGHTTP2_GOAWAY_AUX_TERM_ON_SEND); if (rv != 0) { return rv; @@ -439,7 +439,7 @@ static int session_new(nghttp2_session **session_ptr, int rv; size_t nbuffer; size_t max_deflate_dynamic_table_size = - NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE; + NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE; size_t i; if (mem == NULL) { @@ -473,7 +473,7 @@ static int session_new(nghttp2_session **session_ptr, (*session_ptr)->remote_last_stream_id = (1u << 31) - 1; (*session_ptr)->pending_local_max_concurrent_stream = - NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS; + NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS; (*session_ptr)->pending_enable_push = 1; (*session_ptr)->pending_no_rfc7540_priorities = UINT8_MAX; @@ -489,7 +489,7 @@ static int session_new(nghttp2_session **session_ptr, init_settings(&(*session_ptr)->local_settings); (*session_ptr)->max_incoming_reserved_streams = - NGHTTP2_MAX_INCOMING_RESERVED_STREAMS; + NGHTTP2_MAX_INCOMING_RESERVED_STREAMS; /* Limit max outgoing concurrent streams to sensible value */ (*session_ptr)->remote_settings.max_concurrent_streams = 100; @@ -497,35 +497,31 @@ static int session_new(nghttp2_session **session_ptr, (*session_ptr)->max_send_header_block_length = NGHTTP2_MAX_HEADERSLEN; (*session_ptr)->max_outbound_ack = NGHTTP2_DEFAULT_MAX_OBQ_FLOOD_ITEM; (*session_ptr)->max_settings = NGHTTP2_DEFAULT_MAX_SETTINGS; + (*session_ptr)->max_continuations = NGHTTP2_DEFAULT_MAX_CONTINUATIONS; if (option) { if ((option->opt_set_mask & NGHTTP2_OPT_NO_AUTO_WINDOW_UPDATE) && option->no_auto_window_update) { - (*session_ptr)->opt_flags |= NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE; } if (option->opt_set_mask & NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS) { - (*session_ptr)->remote_settings.max_concurrent_streams = - option->peer_max_concurrent_streams; + option->peer_max_concurrent_streams; } if (option->opt_set_mask & NGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMS) { - (*session_ptr)->max_incoming_reserved_streams = - option->max_reserved_remote_streams; + option->max_reserved_remote_streams; } if ((option->opt_set_mask & NGHTTP2_OPT_NO_RECV_CLIENT_MAGIC) && option->no_recv_client_magic) { - (*session_ptr)->opt_flags |= NGHTTP2_OPTMASK_NO_RECV_CLIENT_MAGIC; } if ((option->opt_set_mask & NGHTTP2_OPT_NO_HTTP_MESSAGING) && option->no_http_messaging) { - (*session_ptr)->opt_flags |= NGHTTP2_OPTMASK_NO_HTTP_MESSAGING; } @@ -545,7 +541,7 @@ static int session_new(nghttp2_session **session_ptr, if (option->opt_set_mask & NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH) { (*session_ptr)->max_send_header_block_length = - option->max_send_header_block_length; + option->max_send_header_block_length; } if (option->opt_set_mask & NGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZE) { @@ -570,14 +566,14 @@ static int session_new(nghttp2_session **session_ptr, NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES) && option->server_fallback_rfc7540_priorities) { (*session_ptr)->opt_flags |= - NGHTTP2_OPTMASK_SERVER_FALLBACK_RFC7540_PRIORITIES; + NGHTTP2_OPTMASK_SERVER_FALLBACK_RFC7540_PRIORITIES; } if ((option->opt_set_mask & NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) && option->no_rfc9113_leading_and_trailing_ws_validation) { (*session_ptr)->opt_flags |= - NGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION; + NGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION; } if (option->opt_set_mask & NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT) { @@ -585,6 +581,10 @@ static int session_new(nghttp2_session **session_ptr, option->stream_reset_burst, option->stream_reset_rate); } + + if (option->opt_set_mask & NGHTTP2_OPT_MAX_CONTINUATIONS) { + (*session_ptr)->max_continuations = option->max_continuations; + } } rv = nghttp2_hd_deflate_init2(&(*session_ptr)->hd_deflater, @@ -814,7 +814,7 @@ void nghttp2_session_del(nghttp2_session *session) { /* Have to free streams first, so that we can check stream->item->queued */ - nghttp2_map_each_free(&session->streams, free_streams, session); + nghttp2_map_each(&session->streams, free_streams, session); nghttp2_map_free(&session->streams); ob_q_free(&session->ob_urgent, mem); @@ -830,8 +830,8 @@ void nghttp2_session_del(nghttp2_session *session) { } int nghttp2_session_reprioritize_stream( - nghttp2_session *session, nghttp2_stream *stream, - const nghttp2_priority_spec *pri_spec_in) { + nghttp2_session *session, nghttp2_stream *stream, + const nghttp2_priority_spec *pri_spec_in) { int rv; nghttp2_stream *dep_stream = NULL; nghttp2_priority_spec pri_spec_default; @@ -850,12 +850,11 @@ int nghttp2_session_reprioritize_stream( if (!dep_stream && session_detect_idle_stream(session, pri_spec->stream_id)) { - nghttp2_priority_spec_default_init(&pri_spec_default); dep_stream = nghttp2_session_open_stream( - session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, - NGHTTP2_STREAM_IDLE, NULL); + session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, + NGHTTP2_STREAM_IDLE, NULL); if (dep_stream == NULL) { return NGHTTP2_ERR_NOMEM; @@ -979,7 +978,14 @@ static int session_attach_stream_item(nghttp2_session *session, return 0; } - return session_ob_data_push(session, stream); + rv = session_ob_data_push(session, stream); + if (rv != 0) { + nghttp2_stream_detach_item(stream); + + return rv; + } + + return 0; } static void session_detach_stream_item(nghttp2_session *session, @@ -1174,9 +1180,9 @@ int nghttp2_session_add_item(nghttp2_session *session, NGHTTP2_DEFAULT_WEIGHT, 0); if (!nghttp2_session_open_stream( - session, frame->push_promise.promised_stream_id, - NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_RESERVED, - aux_data->stream_user_data)) { + session, frame->push_promise.promised_stream_id, + NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_RESERVED, + aux_data->stream_user_data)) { return NGHTTP2_ERR_NOMEM; } @@ -1242,7 +1248,6 @@ int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id, assert(headers_frame->hd.type == NGHTTP2_HEADERS); if (headers_frame->hd.stream_id <= stream_id) { - for (item = session->ob_syn.head; item; item = item->qnext) { aux_data = &item->aux_data.headers; @@ -1309,9 +1314,11 @@ nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session, assert((stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) || nghttp2_stream_in_dep_tree(stream)); + nghttp2_session_detach_idle_stream(session, stream); + if (nghttp2_stream_in_dep_tree(stream)) { assert(!(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES)); - nghttp2_session_detach_idle_stream(session, stream); + rv = nghttp2_stream_dep_remove(stream); if (rv != 0) { return NULL; @@ -1354,8 +1361,8 @@ nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session, nghttp2_priority_spec_default_init(&pri_spec_default); dep_stream = nghttp2_session_open_stream( - session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, - NGHTTP2_STREAM_IDLE, NULL); + session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, + NGHTTP2_STREAM_IDLE, NULL); if (dep_stream == NULL) { if (stream_alloc) { @@ -1471,6 +1478,20 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id, DEBUGF("stream: stream(%p)=%d close\n", stream, stream->stream_id); + /* We call on_stream_close_callback even if stream->state is + NGHTTP2_STREAM_INITIAL. This will happen while sending request + HEADERS, a local endpoint receives RST_STREAM for that stream. It + may be PROTOCOL_ERROR, but without notifying stream closure will + hang the stream in a local endpoint. + */ + + if (session->callbacks.on_stream_close_callback) { + if (session->callbacks.on_stream_close_callback( + session, stream_id, error_code, session->user_data) != 0) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } + if (stream->item) { nghttp2_outbound_item *item; @@ -1488,21 +1509,6 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id, } } - /* We call on_stream_close_callback even if stream->state is - NGHTTP2_STREAM_INITIAL. This will happen while sending request - HEADERS, a local endpoint receives RST_STREAM for that stream. It - may be PROTOCOL_ERROR, but without notifying stream closure will - hang the stream in a local endpoint. - */ - - if (session->callbacks.on_stream_close_callback) { - if (session->callbacks.on_stream_close_callback( - session, stream_id, error_code, session->user_data) != 0) { - - return NGHTTP2_ERR_CALLBACK_FAILURE; - } - } - is_my_stream_id = nghttp2_session_is_my_stream_id(session, stream_id); /* pushed streams which is not opened yet is not counted toward max @@ -1559,6 +1565,11 @@ int nghttp2_session_destroy_stream(nghttp2_session *session, } } + if (stream->queued && + (stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES)) { + session_ob_data_remove(session, stream); + } + nghttp2_map_remove(&session->streams, stream->stream_id); nghttp2_stream_free(stream); nghttp2_mem_free(mem, stream); @@ -1644,7 +1655,7 @@ int nghttp2_session_adjust_closed_stream(nghttp2_session *session) { while (session->num_closed_streams > 0 && session->num_closed_streams + session->num_incoming_streams > - num_stream_max) { + num_stream_max) { nghttp2_stream *head_stream; nghttp2_stream *next; @@ -1681,10 +1692,11 @@ int nghttp2_session_adjust_idle_stream(nghttp2_session *session) { /* Make minimum number of idle streams 16, and maximum 100, which are arbitrary chosen numbers. */ - max = nghttp2_min( - 100, nghttp2_max( - 16, nghttp2_min(session->local_settings.max_concurrent_streams, - session->pending_local_max_concurrent_stream))); + max = nghttp2_min_uint32( + 100, + nghttp2_max_uint32( + 16, nghttp2_min_uint32(session->local_settings.max_concurrent_streams, + session->pending_local_max_concurrent_stream))); DEBUGF("stream: adjusting kept idle streams num_idle_streams=%zu, max=%zu\n", session->num_idle_streams, max); @@ -2105,17 +2117,18 @@ static int session_predicate_priority_update_send(nghttp2_session *session, /* Take into account settings max frame size and both connection-level flow control here */ static nghttp2_ssize nghttp2_session_enforce_flow_control_limits( - nghttp2_session *session, nghttp2_stream *stream, - nghttp2_ssize requested_window_size) { + nghttp2_session *session, nghttp2_stream *stream, + nghttp2_ssize requested_window_size) { DEBUGF("send: remote windowsize connection=%d, remote maxframsize=%u, " "stream(id %d)=%d\n", session->remote_window_size, session->remote_settings.max_frame_size, stream->stream_id, stream->remote_window_size); - return nghttp2_min(nghttp2_min(nghttp2_min(requested_window_size, - stream->remote_window_size), - session->remote_window_size), - (int32_t)session->remote_settings.max_frame_size); + return nghttp2_min_int32( + nghttp2_min_int32(nghttp2_min_int32((int32_t)requested_window_size, + stream->remote_window_size), + session->remote_window_size), + (int32_t)session->remote_settings.max_frame_size); } /* @@ -2129,7 +2142,7 @@ static size_t nghttp2_session_next_data_read(nghttp2_session *session, nghttp2_ssize window_size; window_size = nghttp2_session_enforce_flow_control_limits( - session, stream, NGHTTP2_DATA_PAYLOADLEN); + session, stream, NGHTTP2_DATA_PAYLOADLEN); DEBUGF("send: available window=%td\n", window_size); @@ -2199,14 +2212,14 @@ static nghttp2_ssize session_call_select_padding(nghttp2_session *session, } max_paddedlen = - nghttp2_min(frame->hd.length + NGHTTP2_MAX_PADLEN, max_payloadlen); + nghttp2_min_size(frame->hd.length + NGHTTP2_MAX_PADLEN, max_payloadlen); if (session->callbacks.select_padding_callback2) { rv = session->callbacks.select_padding_callback2( - session, frame, max_paddedlen, session->user_data); + session, frame, max_paddedlen, session->user_data); } else { rv = (nghttp2_ssize)session->callbacks.select_padding_callback( - session, frame, max_paddedlen, session->user_data); + session, frame, max_paddedlen, session->user_data); } if (rv < (nghttp2_ssize)frame->hd.length || rv > (nghttp2_ssize)max_paddedlen) { @@ -2229,11 +2242,11 @@ static int session_headers_add_pad(nghttp2_session *session, aob = &session->aob; framebufs = &aob->framebufs; - max_payloadlen = nghttp2_min(NGHTTP2_MAX_PAYLOADLEN, - frame->hd.length + NGHTTP2_MAX_PADLEN); + max_payloadlen = nghttp2_min_size(NGHTTP2_MAX_PAYLOADLEN, + frame->hd.length + NGHTTP2_MAX_PADLEN); padded_payloadlen = - session_call_select_padding(session, frame, max_payloadlen); + session_call_select_padding(session, frame, max_payloadlen); if (nghttp2_is_fatal((int)padded_payloadlen)) { return (int)padded_payloadlen; @@ -2270,14 +2283,14 @@ static int session_pack_extension(nghttp2_session *session, nghttp2_bufs *bufs, session->callbacks.pack_extension_callback); buf = &bufs->head->buf; - buflen = nghttp2_min(nghttp2_buf_avail(buf), NGHTTP2_MAX_PAYLOADLEN); + buflen = nghttp2_min_size(nghttp2_buf_avail(buf), NGHTTP2_MAX_PAYLOADLEN); if (session->callbacks.pack_extension_callback2) { rv = session->callbacks.pack_extension_callback2(session, buf->last, buflen, frame, session->user_data); } else { rv = (nghttp2_ssize)session->callbacks.pack_extension_callback( - session, buf->last, buflen, frame, session->user_data); + session, buf->last, buflen, frame, session->user_data); } if (rv == NGHTTP2_ERR_CANCEL) { return (int)rv; @@ -2343,7 +2356,6 @@ static int session_prep_frame(nghttp2_session *session, next_readmax = nghttp2_session_next_data_read(session, stream); if (next_readmax == 0) { - /* This must be true since we only pop DATA frame item from queue when session->remote_window_size > 0 */ assert(session->remote_window_size > 0); @@ -2356,9 +2368,9 @@ static int session_prep_frame(nghttp2_session *session, return NGHTTP2_ERR_DEFERRED; } - rv = nghttp2_session_pack_data(session, &session->aob.framebufs, - next_readmax, frame, &item->aux_data.data, - stream); + rv = + nghttp2_session_pack_data(session, &session->aob.framebufs, next_readmax, + frame, &item->aux_data.data, stream); if (rv == NGHTTP2_ERR_PAUSE) { return rv; } @@ -2398,9 +2410,9 @@ static int session_prep_frame(nghttp2_session *session, nghttp2_stream *stream; stream = nghttp2_session_open_stream( - session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, - &frame->headers.pri_spec, NGHTTP2_STREAM_INITIAL, - aux_data->stream_user_data); + session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, + &frame->headers.pri_spec, NGHTTP2_STREAM_INITIAL, + aux_data->stream_user_data); if (stream == NULL) { return NGHTTP2_ERR_NOMEM; @@ -2447,8 +2459,8 @@ static int session_prep_frame(nghttp2_session *session, } estimated_payloadlen = session_estimate_headers_payload( - session, frame->headers.nva, frame->headers.nvlen, - NGHTTP2_PRIORITY_SPECLEN); + session, frame->headers.nva, frame->headers.nvlen, + NGHTTP2_PRIORITY_SPECLEN); if (estimated_payloadlen > session->max_send_header_block_length) { return NGHTTP2_ERR_FRAME_SIZE_ERROR; @@ -2536,14 +2548,14 @@ static int session_prep_frame(nghttp2_session *session, assert(stream); estimated_payloadlen = session_estimate_headers_payload( - session, frame->push_promise.nva, frame->push_promise.nvlen, 0); + session, frame->push_promise.nva, frame->push_promise.nvlen, 0); if (estimated_payloadlen > session->max_send_header_block_length) { return NGHTTP2_ERR_FRAME_SIZE_ERROR; } rv = nghttp2_frame_pack_push_promise( - &session->aob.framebufs, &frame->push_promise, &session->hd_deflater); + &session->aob.framebufs, &frame->push_promise, &session->hd_deflater); if (rv != 0) { return rv; } @@ -2899,7 +2911,7 @@ static int session_after_frame_sent1(nghttp2_session *session) { int stream_closed; stream_closed = - (stream->shut_flags & NGHTTP2_SHUT_RDWR) == NGHTTP2_SHUT_RDWR; + (stream->shut_flags & NGHTTP2_SHUT_RDWR) == NGHTTP2_SHUT_RDWR; nghttp2_stream_shutdown(stream, NGHTTP2_SHUT_WR); @@ -3020,8 +3032,8 @@ static int session_after_frame_sent1(nghttp2_session *session) { } stream = nghttp2_session_open_stream( - session, frame->hd.stream_id, NGHTTP2_FLAG_NONE, - &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL); + session, frame->hd.stream_id, NGHTTP2_FLAG_NONE, + &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL); if (!stream) { return NGHTTP2_ERR_NOMEM; } @@ -3053,7 +3065,6 @@ static int session_after_frame_sent1(nghttp2_session *session) { aux_data = &item->aux_data.goaway; if ((aux_data->flags & NGHTTP2_GOAWAY_AUX_SHUTDOWN_NOTICE) == 0) { - if (aux_data->flags & NGHTTP2_GOAWAY_AUX_TERM_ON_SEND) { session->goaway_flags |= NGHTTP2_GOAWAY_TERM_SENT; } @@ -3103,7 +3114,7 @@ static int session_after_frame_sent1(nghttp2_session *session) { rv = session_update_stream_consumed_size(session, stream, 0); } else { rv = - nghttp2_session_update_recv_stream_window_size(session, stream, 0, 1); + nghttp2_session_update_recv_stream_window_size(session, stream, 0, 1); } if (nghttp2_is_fatal(rv)) { @@ -3133,10 +3144,8 @@ static void session_after_frame_sent2(nghttp2_session *session) { frame = &item->frame; if (frame->hd.type != NGHTTP2_DATA) { - if (frame->hd.type == NGHTTP2_HEADERS || frame->hd.type == NGHTTP2_PUSH_PROMISE) { - if (nghttp2_bufs_next_present(framebufs)) { framebufs->cur = framebufs->cur->next; @@ -3273,8 +3282,7 @@ static nghttp2_ssize nghttp2_session_mem_send_internal(nghttp2_session *session, it. */ if (frame->hd.type != NGHTTP2_WINDOW_UPDATE && session->callbacks.on_frame_not_send_callback( - session, frame, rv, session->user_data) != 0) { - + session, frame, rv, session->user_data) != 0) { nghttp2_outbound_item_free(item, mem); nghttp2_mem_free(mem, item); @@ -3302,8 +3310,8 @@ static nghttp2_ssize nghttp2_session_mem_send_internal(nghttp2_session *session, } if (opened_stream_id) { /* careful not to override rv */ - rv2 = nghttp2_session_close_stream(session, opened_stream_id, - error_code); + rv2 = + nghttp2_session_close_stream(session, opened_stream_id, error_code); } nghttp2_outbound_item_free(item, mem); @@ -3317,8 +3325,8 @@ static nghttp2_ssize nghttp2_session_mem_send_internal(nghttp2_session *session, if (rv == NGHTTP2_ERR_HEADER_COMP) { /* If header compression error occurred, should terminate connection. */ - rv = nghttp2_session_terminate_session(session, - NGHTTP2_INTERNAL_ERROR); + rv = + nghttp2_session_terminate_session(session, NGHTTP2_INTERNAL_ERROR); } if (nghttp2_is_fatal(rv)) { return rv; @@ -3351,7 +3359,7 @@ static nghttp2_ssize nghttp2_session_mem_send_internal(nghttp2_session *session, if (session->callbacks.on_frame_not_send_callback) { if (session->callbacks.on_frame_not_send_callback( - session, frame, rv, session->user_data) != 0) { + session, frame, rv, session->user_data) != 0) { return NGHTTP2_ERR_CALLBACK_FAILURE; } } @@ -3568,10 +3576,10 @@ int nghttp2_session_send(nghttp2_session *session) { } if (session->callbacks.send_callback2) { sentlen = session->callbacks.send_callback2( - session, data, (size_t)datalen, 0, session->user_data); + session, data, (size_t)datalen, 0, session->user_data); } else { sentlen = (nghttp2_ssize)session->callbacks.send_callback( - session, data, (size_t)datalen, 0, session->user_data); + session, data, (size_t)datalen, 0, session->user_data); } if (sentlen < 0) { if (sentlen == NGHTTP2_ERR_WOULDBLOCK) { @@ -3613,7 +3621,6 @@ static int session_call_on_begin_frame(nghttp2_session *session, int rv; if (session->callbacks.on_begin_frame_callback) { - rv = session->callbacks.on_begin_frame_callback(session, hd, session->user_data); @@ -3662,11 +3669,11 @@ static int session_call_on_header(nghttp2_session *session, int rv = 0; if (session->callbacks.on_header_callback2) { rv = session->callbacks.on_header_callback2( - session, frame, nv->name, nv->value, nv->flags, session->user_data); + session, frame, nv->name, nv->value, nv->flags, session->user_data); } else if (session->callbacks.on_header_callback) { rv = session->callbacks.on_header_callback( - session, frame, nv->name->base, nv->name->len, nv->value->base, - nv->value->len, nv->flags, session->user_data); + session, frame, nv->name->base, nv->name->len, nv->value->base, + nv->value->len, nv->flags, session->user_data); } if (rv == NGHTTP2_ERR_PAUSE || rv == NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE) { @@ -3685,11 +3692,11 @@ static int session_call_on_invalid_header(nghttp2_session *session, int rv; if (session->callbacks.on_invalid_header_callback2) { rv = session->callbacks.on_invalid_header_callback2( - session, frame, nv->name, nv->value, nv->flags, session->user_data); + session, frame, nv->name, nv->value, nv->flags, session->user_data); } else if (session->callbacks.on_invalid_header_callback) { rv = session->callbacks.on_invalid_header_callback( - session, frame, nv->name->base, nv->name->len, nv->value->base, - nv->value->len, nv->flags, session->user_data); + session, frame, nv->name->base, nv->name->len, nv->value->base, + nv->value->len, nv->flags, session->user_data); } else { return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; } @@ -3713,7 +3720,7 @@ session_call_on_extension_chunk_recv_callback(nghttp2_session *session, if (session->callbacks.on_extension_chunk_recv_callback) { rv = session->callbacks.on_extension_chunk_recv_callback( - session, &frame->hd, data, len, session->user_data); + session, &frame->hd, data, len, session->user_data); if (rv == NGHTTP2_ERR_CANCEL) { return rv; } @@ -3732,7 +3739,7 @@ static int session_call_unpack_extension_callback(nghttp2_session *session) { void *payload = NULL; rv = session->callbacks.unpack_extension_callback( - session, &payload, &frame->hd, session->user_data); + session, &payload, &frame->hd, session->user_data); if (rv == NGHTTP2_ERR_CANCEL) { return rv; } @@ -3795,7 +3802,7 @@ static int session_call_on_invalid_frame_recv_callback(nghttp2_session *session, int lib_error_code) { if (session->callbacks.on_invalid_frame_recv_callback) { if (session->callbacks.on_invalid_frame_recv_callback( - session, frame, lib_error_code, session->user_data) != 0) { + session, frame, lib_error_code, session->user_data) != 0) { return NGHTTP2_ERR_CALLBACK_FAILURE; } } @@ -3808,13 +3815,13 @@ static int session_handle_invalid_stream2(nghttp2_session *session, int lib_error_code) { int rv; rv = nghttp2_session_add_rst_stream( - session, stream_id, get_error_code_from_lib_error_code(lib_error_code)); + session, stream_id, get_error_code_from_lib_error_code(lib_error_code)); if (rv != 0) { return rv; } if (session->callbacks.on_invalid_frame_recv_callback) { if (session->callbacks.on_invalid_frame_recv_callback( - session, frame, lib_error_code, session->user_data) != 0) { + session, frame, lib_error_code, session->user_data) != 0) { return NGHTTP2_ERR_CALLBACK_FAILURE; } } @@ -3848,12 +3855,12 @@ static int session_handle_invalid_connection(nghttp2_session *session, const char *reason) { if (session->callbacks.on_invalid_frame_recv_callback) { if (session->callbacks.on_invalid_frame_recv_callback( - session, frame, lib_error_code, session->user_data) != 0) { + session, frame, lib_error_code, session->user_data) != 0) { return NGHTTP2_ERR_CALLBACK_FAILURE; } } return nghttp2_session_terminate_session_with_reason( - session, get_error_code_from_lib_error_code(lib_error_code), reason); + session, get_error_code_from_lib_error_code(lib_error_code), reason); } static int session_inflate_handle_invalid_connection(nghttp2_session *session, @@ -3862,7 +3869,7 @@ static int session_inflate_handle_invalid_connection(nghttp2_session *session, const char *reason) { int rv; rv = - session_handle_invalid_connection(session, frame, lib_error_code, reason); + session_handle_invalid_connection(session, frame, lib_error_code, reason); if (nghttp2_is_fatal(rv)) { return rv; } @@ -3912,7 +3919,7 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, if (frame->hd.type == NGHTTP2_PUSH_PROMISE) { subject_stream = nghttp2_session_get_stream( - session, frame->push_promise.promised_stream_id); + session, frame->push_promise.promised_stream_id); } else { subject_stream = stream; trailer = session_trailer_headers(session, stream, frame); @@ -3933,7 +3940,7 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, from invoking subsequent callbacks for the same stream ID. */ rv = nghttp2_session_add_rst_stream( - session, subject_stream->stream_id, NGHTTP2_COMPRESSION_ERROR); + session, subject_stream->stream_id, NGHTTP2_COMPRESSION_ERROR); if (nghttp2_is_fatal(rv)) { return rv; @@ -3941,7 +3948,7 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, } } rv = - nghttp2_session_terminate_session(session, NGHTTP2_COMPRESSION_ERROR); + nghttp2_session_terminate_session(session, NGHTTP2_COMPRESSION_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -3979,11 +3986,11 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, nv.name->base, (int)nv.value->len, nv.value->base); rv2 = session_call_error_callback( - session, NGHTTP2_ERR_HTTP_HEADER, - "Ignoring received invalid HTTP header field: frame type: " - "%u, stream: %d, name: [%.*s], value: [%.*s]", - frame->hd.type, frame->hd.stream_id, (int)nv.name->len, - nv.name->base, (int)nv.value->len, nv.value->base); + session, NGHTTP2_ERR_HTTP_HEADER, + "Ignoring received invalid HTTP header field: frame type: " + "%u, stream: %d, name: [%.*s], value: [%.*s]", + frame->hd.type, frame->hd.stream_id, (int)nv.name->len, + nv.name->base, (int)nv.value->len, nv.value->base); if (nghttp2_is_fatal(rv2)) { return rv2; @@ -3997,19 +4004,19 @@ static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, nv.name->base, (int)nv.value->len, nv.value->base); rv = session_call_error_callback( - session, NGHTTP2_ERR_HTTP_HEADER, - "Invalid HTTP header field was received: frame type: " - "%u, stream: %d, name: [%.*s], value: [%.*s]", - frame->hd.type, frame->hd.stream_id, (int)nv.name->len, - nv.name->base, (int)nv.value->len, nv.value->base); + session, NGHTTP2_ERR_HTTP_HEADER, + "Invalid HTTP header field was received: frame type: " + "%u, stream: %d, name: [%.*s], value: [%.*s]", + frame->hd.type, frame->hd.stream_id, (int)nv.name->len, + nv.name->base, (int)nv.value->len, nv.value->base); if (nghttp2_is_fatal(rv)) { return rv; } - rv = session_handle_invalid_stream2(session, - subject_stream->stream_id, - frame, NGHTTP2_ERR_HTTP_HEADER); + rv = + session_handle_invalid_stream2(session, subject_stream->stream_id, + frame, NGHTTP2_ERR_HTTP_HEADER); if (nghttp2_is_fatal(rv)) { return rv; } @@ -4097,7 +4104,7 @@ static int session_after_header_block_received(nghttp2_session *session) { nghttp2_stream *subject_stream; subject_stream = nghttp2_session_get_stream( - session, frame->push_promise.promised_stream_id); + session, frame->push_promise.promised_stream_id); if (subject_stream) { rv = nghttp2_http_on_request_headers(subject_stream, frame); } @@ -4169,7 +4176,7 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, nghttp2_stream *stream; if (frame->hd.stream_id == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0"); + session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0"); } /* If client receives idle stream from server, it is invalid @@ -4178,8 +4185,8 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, if (!session->server) { if (session_detect_idle_stream(session, frame->hd.stream_id)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "request HEADERS: client received request"); + session, frame, NGHTTP2_ERR_PROTO, + "request HEADERS: client received request"); } return NGHTTP2_ERR_IGN_HEADER_BLOCK; @@ -4191,8 +4198,8 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, if (frame->hd.stream_id == 0 || nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "request HEADERS: invalid stream_id"); + session, frame, NGHTTP2_ERR_PROTO, + "request HEADERS: invalid stream_id"); } /* RFC 7540 says if an endpoint receives a HEADERS with invalid @@ -4218,7 +4225,7 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); if (stream && (stream->shut_flags & NGHTTP2_SHUT_RD)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); + session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); } return NGHTTP2_ERR_IGN_HEADER_BLOCK; @@ -4227,8 +4234,8 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, if (session_is_incoming_concurrent_streams_max(session)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "request HEADERS: max concurrent streams exceeded"); + session, frame, NGHTTP2_ERR_PROTO, + "request HEADERS: max concurrent streams exceeded"); } if (!session_allow_incoming_new_stream(session)) { @@ -4238,7 +4245,7 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, if (frame->headers.pri_spec.stream_id == frame->hd.stream_id) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself"); + session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself"); } if (session_is_incoming_concurrent_streams_pending_max(session)) { @@ -4247,8 +4254,8 @@ int nghttp2_session_on_request_headers_received(nghttp2_session *session, } stream = nghttp2_session_open_stream( - session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, - &frame->headers.pri_spec, NGHTTP2_STREAM_OPENING, NULL); + session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, + &frame->headers.pri_spec, NGHTTP2_STREAM_OPENING, NULL); if (!stream) { return NGHTTP2_ERR_NOMEM; } @@ -4277,7 +4284,7 @@ int nghttp2_session_on_response_headers_received(nghttp2_session *session, nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)); if (frame->hd.stream_id == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0"); + session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0"); } if (stream->shut_flags & NGHTTP2_SHUT_RD) { /* half closed (remote): from the spec: @@ -4289,7 +4296,7 @@ int nghttp2_session_on_response_headers_received(nghttp2_session *session, We go further, and make it connection error. */ return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); + session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); } stream->state = NGHTTP2_STREAM_OPENED; rv = session_call_on_begin_headers(session, frame); @@ -4306,20 +4313,20 @@ int nghttp2_session_on_push_response_headers_received(nghttp2_session *session, assert(stream->state == NGHTTP2_STREAM_RESERVED); if (frame->hd.stream_id == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "push response HEADERS: stream_id == 0"); + session, frame, NGHTTP2_ERR_PROTO, + "push response HEADERS: stream_id == 0"); } if (session->server) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "HEADERS: no HEADERS allowed from client in reserved state"); + session, frame, NGHTTP2_ERR_PROTO, + "HEADERS: no HEADERS allowed from client in reserved state"); } if (session_is_incoming_concurrent_streams_max(session)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "push response HEADERS: max concurrent streams exceeded"); + session, frame, NGHTTP2_ERR_PROTO, + "push response HEADERS: max concurrent streams exceeded"); } if (!session_allow_incoming_new_stream(session)) { @@ -4350,7 +4357,7 @@ int nghttp2_session_on_headers_received(nghttp2_session *session, int rv = 0; if (frame->hd.stream_id == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0"); + session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0"); } if ((stream->shut_flags & NGHTTP2_SHUT_RD)) { /* half closed (remote): from the spec: @@ -4362,7 +4369,7 @@ int nghttp2_session_on_headers_received(nghttp2_session *session, we go further, and make it connection error. */ return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); + session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); } if (nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { if (stream->state == NGHTTP2_STREAM_OPENED) { @@ -4432,7 +4439,7 @@ int nghttp2_session_on_priority_received(nghttp2_session *session, if (frame->priority.pri_spec.stream_id == frame->hd.stream_id) { return nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, "depend on itself"); + session, NGHTTP2_PROTOCOL_ERROR, "depend on itself"); } if (!session->server) { @@ -4450,8 +4457,8 @@ int nghttp2_session_on_priority_received(nghttp2_session *session, } stream = nghttp2_session_open_stream( - session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, - &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL); + session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, + &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL); if (stream == NULL) { return NGHTTP2_ERR_NOMEM; @@ -4557,7 +4564,7 @@ static int update_remote_initial_window_size_func(void *entry, void *ptr) { stream = (nghttp2_stream *)entry; rv = nghttp2_stream_update_remote_initial_window_size( - stream, arg->new_window_size, arg->old_window_size); + stream, arg->new_window_size, arg->old_window_size); if (rv != 0) { return nghttp2_session_add_rst_stream(arg->session, stream->stream_id, NGHTTP2_FLOW_CONTROL_ERROR); @@ -4567,9 +4574,8 @@ static int update_remote_initial_window_size_func(void *entry, void *ptr) { outbound queue. */ if (stream->remote_window_size > 0 && nghttp2_stream_check_deferred_by_flow_control(stream)) { - rv = session_resume_deferred_stream_item( - arg->session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL); + arg->session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL); if (nghttp2_is_fatal(rv)) { return rv; @@ -4608,7 +4614,7 @@ static int update_local_initial_window_size_func(void *entry, void *ptr) { arg = (nghttp2_update_window_size_arg *)ptr; stream = (nghttp2_stream *)entry; rv = nghttp2_stream_update_local_initial_window_size( - stream, arg->new_window_size, arg->old_window_size); + stream, arg->new_window_size, arg->old_window_size); if (rv != 0) { return nghttp2_session_add_rst_stream(arg->session, stream->stream_id, NGHTTP2_FLOW_CONTROL_ERROR); @@ -4624,7 +4630,6 @@ static int update_local_initial_window_size_func(void *entry, void *ptr) { if (nghttp2_should_send_window_update(stream->local_window_size, stream->recv_window_size)) { - rv = nghttp2_session_add_window_update(arg->session, NGHTTP2_FLAG_NONE, stream->stream_id, stream->recv_window_size); @@ -4689,7 +4694,8 @@ int nghttp2_session_update_local_settings(nghttp2_session *session, case NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: header_table_size_seen = 1; header_table_size = iv[i].value; - min_header_table_size = nghttp2_min(min_header_table_size, iv[i].value); + min_header_table_size = + nghttp2_min_uint32(min_header_table_size, iv[i].value); break; case NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: new_initial_window_size = (int32_t)iv[i].value; @@ -4713,8 +4719,8 @@ int nghttp2_session_update_local_settings(nghttp2_session *session, } if (new_initial_window_size != -1) { rv = session_update_local_initial_window_size( - session, new_initial_window_size, - (int32_t)session->local_settings.initial_window_size); + session, new_initial_window_size, + (int32_t)session->local_settings.initial_window_size); if (rv != 0) { return rv; } @@ -4768,15 +4774,15 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (frame->hd.flags & NGHTTP2_FLAG_ACK) { if (frame->settings.niv != 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR, - "SETTINGS: ACK and payload != 0"); + session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR, + "SETTINGS: ACK and payload != 0"); } settings = session->inflight_settings_head; if (!settings) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK"); + session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK"); } rv = nghttp2_session_update_local_settings(session, settings->iv, @@ -4797,7 +4803,7 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (!session->remote_settings_received) { session->remote_settings.max_concurrent_streams = - NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS; + NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS; session->remote_settings_received = 1; } @@ -4814,7 +4820,7 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, return rv; } else { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_HEADER_COMP, NULL); + session, frame, NGHTTP2_ERR_HEADER_COMP, NULL); } } @@ -4825,14 +4831,14 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (entry->value != 0 && entry->value != 1) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: invalid SETTINGS_ENBLE_PUSH"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: invalid SETTINGS_ENBLE_PUSH"); } if (!session->server && entry->value != 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: server attempted to enable push"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: server attempted to enable push"); } session->remote_settings.enable_push = entry->value; @@ -4849,8 +4855,8 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, /* Check that initial_window_size < (1u << 31) */ if (entry->value > NGHTTP2_MAX_WINDOW_SIZE) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_FLOW_CONTROL, - "SETTINGS: too large SETTINGS_INITIAL_WINDOW_SIZE"); + session, frame, NGHTTP2_ERR_FLOW_CONTROL, + "SETTINGS: too large SETTINGS_INITIAL_WINDOW_SIZE"); } rv = session_update_remote_initial_window_size(session, @@ -4862,7 +4868,7 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (rv != 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL); + session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL); } session->remote_settings.initial_window_size = entry->value; @@ -4873,8 +4879,8 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (entry->value < NGHTTP2_MAX_FRAME_SIZE_MIN || entry->value > NGHTTP2_MAX_FRAME_SIZE_MAX) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: invalid SETTINGS_MAX_FRAME_SIZE"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: invalid SETTINGS_MAX_FRAME_SIZE"); } session->remote_settings.max_frame_size = entry->value; @@ -4889,17 +4895,17 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (entry->value != 0 && entry->value != 1) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: invalid SETTINGS_ENABLE_CONNECT_PROTOCOL"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: invalid SETTINGS_ENABLE_CONNECT_PROTOCOL"); } if (!session->server && session->remote_settings.enable_connect_protocol && entry->value == 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: server attempted to disable " - "SETTINGS_ENABLE_CONNECT_PROTOCOL"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: server attempted to disable " + "SETTINGS_ENABLE_CONNECT_PROTOCOL"); } session->remote_settings.enable_connect_protocol = entry->value; @@ -4909,15 +4915,15 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, if (entry->value != 0 && entry->value != 1) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: invalid SETTINGS_NO_RFC7540_PRIORITIES"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: invalid SETTINGS_NO_RFC7540_PRIORITIES"); } if (session->remote_settings.no_rfc7540_priorities != UINT32_MAX && session->remote_settings.no_rfc7540_priorities != entry->value) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "SETTINGS: SETTINGS_NO_RFC7540_PRIORITIES cannot be changed"); + session, frame, NGHTTP2_ERR_PROTO, + "SETTINGS: SETTINGS_NO_RFC7540_PRIORITIES cannot be changed"); } session->remote_settings.no_rfc7540_priorities = entry->value; @@ -4998,16 +5004,16 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session, if (frame->hd.stream_id == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0"); + session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0"); } if (session->server || session->local_settings.enable_push == 0) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled"); + session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled"); } if (!nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id"); + session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id"); } if (!session_allow_incoming_new_stream(session)) { @@ -5021,13 +5027,13 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session, illegal stream ID is subject to a connection error of type PROTOCOL_ERROR. */ return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "PUSH_PROMISE: invalid promised_stream_id"); + session, frame, NGHTTP2_ERR_PROTO, + "PUSH_PROMISE: invalid promised_stream_id"); } if (session_detect_idle_stream(session, frame->hd.stream_id)) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle"); + session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle"); } session->last_recv_stream_id = frame->push_promise.promised_stream_id; @@ -5035,12 +5041,12 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session, if (!stream || stream->state == NGHTTP2_STREAM_CLOSING || !session->pending_enable_push || session->num_incoming_reserved_streams >= - session->max_incoming_reserved_streams) { + session->max_incoming_reserved_streams) { /* Currently, client does not retain closed stream, so we don't check NGHTTP2_SHUT_RD condition here. */ rv = nghttp2_session_add_rst_stream( - session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL); + session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL); if (rv != 0) { return rv; } @@ -5049,16 +5055,15 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session, if (stream->shut_flags & NGHTTP2_SHUT_RD) { return session_inflate_handle_invalid_connection( - session, frame, NGHTTP2_ERR_STREAM_CLOSED, - "PUSH_PROMISE: stream closed"); + session, frame, NGHTTP2_ERR_STREAM_CLOSED, "PUSH_PROMISE: stream closed"); } nghttp2_priority_spec_init(&pri_spec, stream->stream_id, NGHTTP2_DEFAULT_WEIGHT, 0); promised_stream = nghttp2_session_open_stream( - session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE, - &pri_spec, NGHTTP2_STREAM_RESERVED, NULL); + session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE, + &pri_spec, NGHTTP2_STREAM_RESERVED, NULL); if (!promised_stream) { return NGHTTP2_ERR_NOMEM; @@ -5165,8 +5170,8 @@ session_on_connection_window_update_received(nghttp2_session *session, /* Handle connection-level flow control */ if (frame->window_update.window_size_increment == 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "WINDOW_UPDATE: window_size_increment == 0"); + session, frame, NGHTTP2_ERR_PROTO, + "WINDOW_UPDATE: window_size_increment == 0"); } if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment < @@ -5195,12 +5200,12 @@ static int session_on_stream_window_update_received(nghttp2_session *session, } if (state_reserved_remote(session, stream)) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream"); + session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream"); } if (frame->window_update.window_size_increment == 0) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "WINDOW_UPDATE: window_size_increment == 0"); + session, frame, NGHTTP2_ERR_PROTO, + "WINDOW_UPDATE: window_size_increment == 0"); } if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment < stream->remote_window_size) { @@ -5211,9 +5216,8 @@ static int session_on_stream_window_update_received(nghttp2_session *session, if (stream->remote_window_size > 0 && nghttp2_stream_check_deferred_by_flow_control(stream)) { - rv = session_resume_deferred_stream_item( - session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL); + session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL); if (nghttp2_is_fatal(rv)) { return rv; @@ -5304,8 +5308,8 @@ int nghttp2_session_on_priority_update_received(nghttp2_session *session, if (nghttp2_session_is_my_stream_id(session, priority_update->stream_id)) { if (session_detect_idle_stream(session, priority_update->stream_id)) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "PRIORITY_UPDATE: prioritizing idle push is not allowed"); + session, frame, NGHTTP2_ERR_PROTO, + "PRIORITY_UPDATE: prioritizing idle push is not allowed"); } /* TODO Ignore priority signal to a push stream for now */ @@ -5322,8 +5326,8 @@ int nghttp2_session_on_priority_update_received(nghttp2_session *session, if (session->num_idle_streams + session->num_incoming_streams >= session->local_settings.max_concurrent_streams) { return session_handle_invalid_connection( - session, frame, NGHTTP2_ERR_PROTO, - "PRIORITY_UPDATE: max concurrent streams exceeded"); + session, frame, NGHTTP2_ERR_PROTO, + "PRIORITY_UPDATE: max concurrent streams exceeded"); } nghttp2_priority_spec_default_init(&pri_spec); @@ -5363,8 +5367,8 @@ static int session_process_altsvc_frame(nghttp2_session *session) { nghttp2_frame *frame = &iframe->frame; nghttp2_frame_unpack_altsvc_payload( - &frame->ext, nghttp2_get_uint16(iframe->sbuf.pos), iframe->lbuf.pos, - nghttp2_buf_len(&iframe->lbuf)); + &frame->ext, nghttp2_get_uint16(iframe->sbuf.pos), iframe->lbuf.pos, + nghttp2_buf_len(&iframe->lbuf)); /* nghttp2_frame_unpack_altsvc_payload steals buffer from iframe->lbuf */ @@ -5517,9 +5521,8 @@ int nghttp2_session_update_recv_stream_window_size(nghttp2_session *session, stream->window_update_queued == 0 && nghttp2_should_send_window_update(stream->local_window_size, stream->recv_window_size)) { - rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, - stream->stream_id, - stream->recv_window_size); + rv = nghttp2_session_add_window_update( + session, NGHTTP2_FLAG_NONE, stream->stream_id, stream->recv_window_size); if (rv != 0) { return rv; } @@ -5575,7 +5578,7 @@ static int session_update_consumed_size(nghttp2_session *session, /* recv_window_size may be smaller than consumed_size, because it may be decreased by negative value with nghttp2_submit_window_update(). */ - recv_size = nghttp2_min(*consumed_size_ptr, *recv_window_size_ptr); + recv_size = nghttp2_min_int32(*consumed_size_ptr, *recv_window_size_ptr); if (nghttp2_should_send_window_update(local_window_size, recv_size)) { rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, @@ -5597,16 +5600,16 @@ static int session_update_stream_consumed_size(nghttp2_session *session, nghttp2_stream *stream, size_t delta_size) { return session_update_consumed_size( - session, &stream->consumed_size, &stream->recv_window_size, - stream->window_update_queued, stream->stream_id, delta_size, - stream->local_window_size); + session, &stream->consumed_size, &stream->recv_window_size, + stream->window_update_queued, stream->stream_id, delta_size, + stream->local_window_size); } static int session_update_connection_consumed_size(nghttp2_session *session, size_t delta_size) { return session_update_consumed_size( - session, &session->consumed_size, &session->recv_window_size, - session->window_update_queued, 0, delta_size, session->local_window_size); + session, &session->consumed_size, &session->recv_window_size, + session->window_update_queued, 0, delta_size, session->local_window_size); } /* @@ -5698,7 +5701,7 @@ static int session_on_data_received_fail_fast(nghttp2_session *session) { static size_t inbound_frame_payload_readlen(nghttp2_inbound_frame *iframe, const uint8_t *in, const uint8_t *last) { - return nghttp2_min((size_t)(last - in), iframe->payloadleft); + return nghttp2_min_size((size_t)(last - in), iframe->payloadleft); } /* @@ -5713,8 +5716,8 @@ static size_t inbound_frame_buf_read(nghttp2_inbound_frame *iframe, const uint8_t *in, const uint8_t *last) { size_t readlen; - readlen = - nghttp2_min((size_t)(last - in), nghttp2_buf_mark_avail(&iframe->sbuf)); + readlen = nghttp2_min_size((size_t)(last - in), + nghttp2_buf_mark_avail(&iframe->sbuf)); iframe->sbuf.last = nghttp2_cpymem(iframe->sbuf.last, in, readlen); @@ -5820,7 +5823,7 @@ static nghttp2_ssize inbound_frame_effective_readlen(nghttp2_inbound_frame *iframe, size_t payloadleft, size_t readlen) { size_t trail_padlen = - nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen); + nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen); if (trail_padlen > payloadleft) { size_t padlen; @@ -5881,7 +5884,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, for (;;) { switch (iframe->state) { case NGHTTP2_IB_READ_CLIENT_MAGIC: - readlen = nghttp2_min(inlen, iframe->payloadleft); + readlen = nghttp2_min_size(inlen, iframe->payloadleft); if (memcmp(&NGHTTP2_CLIENT_MAGIC[NGHTTP2_CLIENT_MAGIC_LEN - iframe->payloadleft], @@ -5911,17 +5914,17 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (iframe->sbuf.pos[3] != NGHTTP2_SETTINGS || (iframe->sbuf.pos[4] & NGHTTP2_FLAG_ACK)) { rv = session_call_error_callback( - session, NGHTTP2_ERR_SETTINGS_EXPECTED, - "Remote peer returned unexpected data while we expected " - "SETTINGS frame. Perhaps, peer does not support HTTP/2 " - "properly."); + session, NGHTTP2_ERR_SETTINGS_EXPECTED, + "Remote peer returned unexpected data while we expected " + "SETTINGS frame. Perhaps, peer does not support HTTP/2 " + "properly."); if (nghttp2_is_fatal(rv)) { return rv; } rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, "SETTINGS expected"); + session, NGHTTP2_PROTOCOL_ERROR, "SETTINGS expected"); if (nghttp2_is_fatal(rv)) { return rv; @@ -5957,7 +5960,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, session->local_settings.max_frame_size); rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size"); + session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size"); if (nghttp2_is_fatal(rv)) { return rv; @@ -5971,7 +5974,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, DEBUGF("recv: DATA\n"); iframe->frame.hd.flags &= - (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PADDED); + (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PADDED); /* Check stream is open. If it is not open or closing, ignore payload. */ busy = 1; @@ -5994,8 +5997,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd); if (rv < 0) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "DATA: insufficient padding space"); + session, NGHTTP2_PROTOCOL_ERROR, + "DATA: insufficient padding space"); if (nghttp2_is_fatal(rv)) { return rv; @@ -6016,14 +6019,14 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, DEBUGF("recv: HEADERS\n"); iframe->frame.hd.flags &= - (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS | - NGHTTP2_FLAG_PADDED | NGHTTP2_FLAG_PRIORITY); + (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS | + NGHTTP2_FLAG_PADDED | NGHTTP2_FLAG_PRIORITY); rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd); if (rv < 0) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "HEADERS: insufficient padding space"); + session, NGHTTP2_PROTOCOL_ERROR, + "HEADERS: insufficient padding space"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6075,7 +6078,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (rv == NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE) { rv = nghttp2_session_add_rst_stream( - session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); + session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6162,12 +6165,12 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, /* We allocate iv with additional one entry, to store the minimum header table size. */ iframe->max_niv = - iframe->frame.hd.length / NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH + 1; + iframe->frame.hd.length / NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH + 1; if (iframe->max_niv - 1 > session->max_settings) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_ENHANCE_YOUR_CALM, - "SETTINGS: too many setting entries"); + session, NGHTTP2_ENHANCE_YOUR_CALM, + "SETTINGS: too many setting entries"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6175,7 +6178,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } iframe->iv = nghttp2_mem_malloc(mem, sizeof(nghttp2_settings_entry) * - iframe->max_niv); + iframe->max_niv); if (!iframe->iv) { return NGHTTP2_ERR_NOMEM; @@ -6183,7 +6186,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, min_header_table_size_entry = &iframe->iv[iframe->max_niv - 1]; min_header_table_size_entry->settings_id = - NGHTTP2_SETTINGS_HEADER_TABLE_SIZE; + NGHTTP2_SETTINGS_HEADER_TABLE_SIZE; min_header_table_size_entry->value = UINT32_MAX; inbound_frame_set_mark(iframe, NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH); @@ -6199,13 +6202,13 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, DEBUGF("recv: PUSH_PROMISE\n"); iframe->frame.hd.flags &= - (NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_PADDED); + (NGHTTP2_FLAG_END_HEADERS | NGHTTP2_FLAG_PADDED); rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd); if (rv < 0) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "PUSH_PROMISE: insufficient padding space"); + session, NGHTTP2_PROTOCOL_ERROR, + "PUSH_PROMISE: insufficient padding space"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6264,7 +6267,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, /* Receiving CONTINUATION in this state are subject to connection error of type PROTOCOL_ERROR */ rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, "CONTINUATION: unexpected"); + session, NGHTTP2_PROTOCOL_ERROR, "CONTINUATION: unexpected"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6371,12 +6374,12 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, iframe->frame.hd.flags = NGHTTP2_FLAG_NONE; iframe->frame.ext.payload = - &iframe->ext_frame_payload.priority_update; + &iframe->ext_frame_payload.priority_update; if (!session->server) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "PRIORITY_UPDATE is received from server"); + session, NGHTTP2_PROTOCOL_ERROR, + "PRIORITY_UPDATE is received from server"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6454,7 +6457,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (padlen < 0 || (size_t)padlen + pri_fieldlen > 1 + iframe->payloadleft) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: invalid padding"); + session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: invalid padding"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6490,7 +6493,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (rv == NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE) { rv = nghttp2_session_add_rst_stream( - session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); + session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6540,10 +6543,9 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, (iframe->frame.hd.flags & NGHTTP2_FLAG_PADDED)) { padlen = inbound_frame_compute_pad(iframe); if (padlen < 0 || (size_t)padlen + 4 /* promised stream id */ - > 1 + iframe->payloadleft) { + > 1 + iframe->payloadleft) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "PUSH_PROMISE: invalid padding"); + session, NGHTTP2_PROTOCOL_ERROR, "PUSH_PROMISE: invalid padding"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6578,8 +6580,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (rv == NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE) { rv = nghttp2_session_add_rst_stream( - session, iframe->frame.push_promise.promised_stream_id, - NGHTTP2_INTERNAL_ERROR); + session, iframe->frame.push_promise.promised_stream_id, + NGHTTP2_INTERNAL_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6658,7 +6660,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (iframe->frame.hd.length > 2) { iframe->raw_lbuf = - nghttp2_mem_malloc(mem, iframe->frame.hd.length - 2); + nghttp2_mem_malloc(mem, iframe->frame.hd.length - 2); if (iframe->raw_lbuf == NULL) { return NGHTTP2_ERR_NOMEM; @@ -6712,7 +6714,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, iframe->payloadleft - readlen); data_readlen = inbound_frame_effective_readlen( - iframe, iframe->payloadleft - readlen, readlen); + iframe, iframe->payloadleft - readlen, readlen); if (data_readlen == -1) { /* everything is padding */ @@ -6730,9 +6732,9 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, DEBUGF("recv: block final=%d\n", final); rv = - inflate_header_block(session, &iframe->frame, &hd_proclen, - (uint8_t *)in, (size_t)data_readlen, final, - iframe->state == NGHTTP2_IB_READ_HEADER_BLOCK); + inflate_header_block(session, &iframe->frame, &hd_proclen, + (uint8_t *)in, (size_t)data_readlen, final, + iframe->state == NGHTTP2_IB_READ_HEADER_BLOCK); if (nghttp2_is_fatal(rv)) { return rv; @@ -6758,11 +6760,11 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, /* Use promised stream ID for PUSH_PROMISE */ rv = nghttp2_session_add_rst_stream( - session, - iframe->frame.hd.type == NGHTTP2_PUSH_PROMISE - ? iframe->frame.push_promise.promised_stream_id - : iframe->frame.hd.stream_id, - NGHTTP2_INTERNAL_ERROR); + session, + iframe->frame.hd.type == NGHTTP2_PUSH_PROMISE + ? iframe->frame.push_promise.promised_stream_id + : iframe->frame.hd.stream_id, + NGHTTP2_INTERNAL_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6794,7 +6796,6 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } if ((iframe->frame.hd.flags & NGHTTP2_FLAG_END_HEADERS) == 0) { - inbound_frame_set_mark(iframe, NGHTTP2_FRAME_HDLEN); iframe->padlen = 0; @@ -6812,6 +6813,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } } session_inbound_frame_reset(session); + + session->num_continuations = 0; } break; } @@ -6933,6 +6936,10 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } #endif /* DEBUGBUILD */ + if (++session->num_continuations > session->max_continuations) { + return NGHTTP2_ERR_TOO_MANY_CONTINUATIONS; + } + readlen = inbound_frame_buf_read(iframe, in, last); in += readlen; @@ -6953,8 +6960,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, iframe->frame.hd.stream_id, NGHTTP2_CONTINUATION, cont_hd.stream_id, cont_hd.type); rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, - "unexpected non-CONTINUATION frame or stream_id is invalid"); + session, NGHTTP2_PROTOCOL_ERROR, + "unexpected non-CONTINUATION frame or stream_id is invalid"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -6965,8 +6972,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, /* CONTINUATION won't bear NGHTTP2_PADDED flag */ iframe->frame.hd.flags = - (uint8_t)(iframe->frame.hd.flags | - (cont_hd.flags & NGHTTP2_FLAG_END_HEADERS)); + (uint8_t)(iframe->frame.hd.flags | + (cont_hd.flags & NGHTTP2_FLAG_END_HEADERS)); iframe->frame.hd.length += cont_hd.length; busy = 1; @@ -7010,7 +7017,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, /* Pad Length field is consumed immediately */ rv = - nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen); + nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen); if (nghttp2_is_fatal(rv)) { return rv; @@ -7023,9 +7030,9 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id); if (stream) { rv = nghttp2_session_update_recv_stream_window_size( - session, stream, readlen, - iframe->payloadleft || - (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0); + session, stream, readlen, + iframe->payloadleft || + (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7036,7 +7043,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, padlen = inbound_frame_compute_pad(iframe); if (padlen < 0) { rv = nghttp2_session_terminate_session_with_reason( - session, NGHTTP2_PROTOCOL_ERROR, "DATA: invalid padding"); + session, NGHTTP2_PROTOCOL_ERROR, "DATA: invalid padding"); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7069,8 +7076,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (readlen > 0) { nghttp2_ssize data_readlen; - rv = nghttp2_session_update_recv_connection_window_size(session, - readlen); + rv = + nghttp2_session_update_recv_connection_window_size(session, readlen); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7080,15 +7087,15 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } rv = nghttp2_session_update_recv_stream_window_size( - session, stream, readlen, - iframe->payloadleft || - (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0); + session, stream, readlen, + iframe->payloadleft || + (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0); if (nghttp2_is_fatal(rv)) { return rv; } - data_readlen = inbound_frame_effective_readlen( - iframe, iframe->payloadleft, readlen); + data_readlen = + inbound_frame_effective_readlen(iframe, iframe->payloadleft, readlen); if (data_readlen == -1) { /* everything is padding */ @@ -7119,7 +7126,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { /* Consume all data for connection immediately here */ rv = session_update_connection_consumed_size( - session, (size_t)data_readlen); + session, (size_t)data_readlen); if (nghttp2_is_fatal(rv)) { return rv; @@ -7131,7 +7138,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } rv = nghttp2_session_add_rst_stream( - session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR); + session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7142,8 +7149,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } if (session->callbacks.on_data_chunk_recv_callback) { rv = session->callbacks.on_data_chunk_recv_callback( - session, iframe->frame.hd.flags, iframe->frame.hd.stream_id, - in - readlen, (size_t)data_readlen, session->user_data); + session, iframe->frame.hd.flags, iframe->frame.hd.stream_id, + in - readlen, (size_t)data_readlen, session->user_data); if (rv == NGHTTP2_ERR_PAUSE) { return (nghttp2_ssize)(in - first); } @@ -7180,8 +7187,8 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (readlen > 0) { /* Update connection-level flow control window for ignored DATA frame too */ - rv = nghttp2_session_update_recv_connection_window_size(session, - readlen); + rv = + nghttp2_session_update_recv_connection_window_size(session, readlen); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7191,7 +7198,6 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { - /* Ignored DATA is considered as "consumed" immediately. */ rv = session_update_connection_consumed_size(session, readlen); @@ -7226,7 +7232,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (readlen > 0) { rv = session_call_on_extension_chunk_recv_callback( - session, in - readlen, readlen); + session, in - readlen, readlen); if (nghttp2_is_fatal(rv)) { return rv; } @@ -7335,7 +7341,7 @@ int nghttp2_session_recv(nghttp2_session *session) { readlen = session_recv(session, buf, sizeof(buf)); if (readlen > 0) { nghttp2_ssize proclen = - nghttp2_session_mem_recv2(session, buf, (size_t)readlen); + nghttp2_session_mem_recv2(session, buf, (size_t)readlen); if (proclen < 0) { return (int)proclen; } @@ -7484,7 +7490,8 @@ int nghttp2_session_add_goaway(nghttp2_session *session, int32_t last_stream_id, /* last_stream_id must not be increased from the value previously sent */ - last_stream_id = nghttp2_min(last_stream_id, session->local_last_stream_id); + last_stream_id = + nghttp2_min_int32(last_stream_id, session->local_last_stream_id); nghttp2_frame_goaway_init(&frame->goaway, last_stream_id, error_code, opaque_data_copy, opaque_data_len); @@ -7690,20 +7697,20 @@ int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs, session->callbacks.read_length_callback) { if (session->callbacks.read_length_callback2) { payloadlen = session->callbacks.read_length_callback2( - session, frame->hd.type, stream->stream_id, - session->remote_window_size, stream->remote_window_size, - session->remote_settings.max_frame_size, session->user_data); + session, frame->hd.type, stream->stream_id, session->remote_window_size, + stream->remote_window_size, session->remote_settings.max_frame_size, + session->user_data); } else { payloadlen = (nghttp2_ssize)session->callbacks.read_length_callback( - session, frame->hd.type, stream->stream_id, - session->remote_window_size, stream->remote_window_size, - session->remote_settings.max_frame_size, session->user_data); + session, frame->hd.type, stream->stream_id, session->remote_window_size, + stream->remote_window_size, session->remote_settings.max_frame_size, + session->user_data); } DEBUGF("send: read_length_callback=%td\n", payloadlen); - payloadlen = nghttp2_session_enforce_flow_control_limits(session, stream, - payloadlen); + payloadlen = + nghttp2_session_enforce_flow_control_limits(session, stream, payloadlen); DEBUGF("send: read_length_callback after flow control=%td\n", payloadlen); @@ -7740,14 +7747,14 @@ int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs, switch (aux_data->dpw.version) { case NGHTTP2_DATA_PROVIDER_V1: payloadlen = (nghttp2_ssize)aux_data->dpw.data_prd.v1.read_callback( - session, frame->hd.stream_id, buf->pos, datamax, &data_flags, - &aux_data->dpw.data_prd.source, session->user_data); + session, frame->hd.stream_id, buf->pos, datamax, &data_flags, + &aux_data->dpw.data_prd.source, session->user_data); break; case NGHTTP2_DATA_PROVIDER_V2: payloadlen = aux_data->dpw.data_prd.v2.read_callback( - session, frame->hd.stream_id, buf->pos, datamax, &data_flags, - &aux_data->dpw.data_prd.source, session->user_data); + session, frame->hd.stream_id, buf->pos, datamax, &data_flags, + &aux_data->dpw.data_prd.source, session->user_data); break; default: @@ -7798,10 +7805,11 @@ int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs, frame->hd.length = (size_t)payloadlen; frame->data.padlen = 0; - max_payloadlen = nghttp2_min(datamax, frame->hd.length + NGHTTP2_MAX_PADLEN); + max_payloadlen = + nghttp2_min_size(datamax, frame->hd.length + NGHTTP2_MAX_PADLEN); padded_payloadlen = - session_call_select_padding(session, frame, max_payloadlen); + session_call_select_padding(session, frame, max_payloadlen); if (nghttp2_is_fatal((int)padded_payloadlen)) { return (int)padded_payloadlen; @@ -7972,7 +7980,7 @@ int32_t nghttp2_session_get_stream_remote_window_size(nghttp2_session *session, /* stream->remote_window_size can be negative when SETTINGS_INITIAL_WINDOW_SIZE is changed. */ - return nghttp2_max(0, stream->remote_window_size); + return nghttp2_max_int32(0, stream->remote_window_size); } int32_t nghttp2_session_get_remote_window_size(nghttp2_session *session) { @@ -8078,8 +8086,8 @@ static int nghttp2_session_upgrade_internal(nghttp2_session *session, nghttp2_priority_spec_default_init(&pri_spec); stream = nghttp2_session_open_stream( - session, 1, NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_OPENING, - session->server ? NULL : stream_user_data); + session, 1, NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_OPENING, + session->server ? NULL : stream_user_data); if (stream == NULL) { return NGHTTP2_ERR_NOMEM; } @@ -8300,8 +8308,8 @@ int nghttp2_session_check_server_session(nghttp2_session *session) { } int nghttp2_session_change_stream_priority( - nghttp2_session *session, int32_t stream_id, - const nghttp2_priority_spec *pri_spec) { + nghttp2_session *session, int32_t stream_id, + const nghttp2_priority_spec *pri_spec) { int rv; nghttp2_stream *stream; nghttp2_priority_spec pri_spec_copy; @@ -8360,8 +8368,8 @@ int nghttp2_session_create_idle_stream(nghttp2_session *session, nghttp2_priority_spec_normalize_weight(&pri_spec_copy); stream = - nghttp2_session_open_stream(session, stream_id, NGHTTP2_STREAM_FLAG_NONE, - &pri_spec_copy, NGHTTP2_STREAM_IDLE, NULL); + nghttp2_session_open_stream(session, stream_id, NGHTTP2_STREAM_FLAG_NONE, + &pri_spec_copy, NGHTTP2_STREAM_IDLE, NULL); if (!stream) { return NGHTTP2_ERR_NOMEM; } @@ -8389,8 +8397,8 @@ void nghttp2_session_set_user_data(nghttp2_session *session, void *user_data) { } int nghttp2_session_change_extpri_stream_priority( - nghttp2_session *session, int32_t stream_id, - const nghttp2_extpri *extpri_in, int ignore_client_signal) { + nghttp2_session *session, int32_t stream_id, const nghttp2_extpri *extpri_in, + int ignore_client_signal) { nghttp2_stream *stream; nghttp2_extpri extpri = *extpri_in; diff --git a/deps/nghttp2/lib/nghttp2_session.h b/deps/nghttp2/lib/nghttp2_session.h index b119329a04da45..ef8f7b27d67261 100644 --- a/deps/nghttp2/lib/nghttp2_session.h +++ b/deps/nghttp2/lib/nghttp2_session.h @@ -110,6 +110,10 @@ typedef struct { #define NGHTTP2_DEFAULT_STREAM_RESET_BURST 1000 #define NGHTTP2_DEFAULT_STREAM_RESET_RATE 33 +/* The default max number of CONTINUATION frames following an incoming + HEADER frame. */ +#define NGHTTP2_DEFAULT_MAX_CONTINUATIONS 8 + /* Internal state when receiving incoming frame */ typedef enum { /* Receiving frame header */ @@ -290,6 +294,12 @@ struct nghttp2_session { size_t max_send_header_block_length; /* The maximum number of settings accepted per SETTINGS frame. */ size_t max_settings; + /* The maximum number of CONTINUATION frames following an incoming + HEADER frame. */ + size_t max_continuations; + /* The number of CONTINUATION frames following an incoming HEADER + frame. This variable is reset when END_HEADERS flag is seen. */ + size_t num_continuations; /* Next Stream ID. Made unsigned int to detect >= (1 << 31). */ uint32_t next_stream_id; /* The last stream ID this session initiated. For client session, diff --git a/deps/nghttp2/lib/nghttp2_stream.c b/deps/nghttp2/lib/nghttp2_stream.c index f1951f879d7927..f2362447903755 100644 --- a/deps/nghttp2/lib/nghttp2_stream.c +++ b/deps/nghttp2/lib/nghttp2_stream.c @@ -277,9 +277,9 @@ void nghttp2_stream_change_weight(nghttp2_stream *stream, int32_t weight) { /* Compute old stream->pending_penalty we used to calculate stream->cycle */ stream->pending_penalty = - (uint32_t)((stream->pending_penalty + (uint32_t)old_weight - - (wlen_penalty % (uint32_t)old_weight)) % - (uint32_t)old_weight); + (uint32_t)((stream->pending_penalty + (uint32_t)old_weight - + (wlen_penalty % (uint32_t)old_weight)) % + (uint32_t)old_weight); last_cycle = stream->cycle - (wlen_penalty + stream->pending_penalty) / (uint32_t)old_weight; @@ -312,7 +312,7 @@ int32_t nghttp2_stream_dep_distributed_weight(nghttp2_stream *stream, int32_t weight) { weight = stream->weight * weight / stream->sum_dep_weight; - return nghttp2_max(1, weight); + return nghttp2_max_int32(1, weight); } #ifdef STREAM_DEP_DEBUG @@ -571,16 +571,16 @@ static int update_initial_window_size(int32_t *window_size_ptr, } int nghttp2_stream_update_remote_initial_window_size( - nghttp2_stream *stream, int32_t new_initial_window_size, - int32_t old_initial_window_size) { + nghttp2_stream *stream, int32_t new_initial_window_size, + int32_t old_initial_window_size) { return update_initial_window_size(&stream->remote_window_size, new_initial_window_size, old_initial_window_size); } int nghttp2_stream_update_local_initial_window_size( - nghttp2_stream *stream, int32_t new_initial_window_size, - int32_t old_initial_window_size) { + nghttp2_stream *stream, int32_t new_initial_window_size, + int32_t old_initial_window_size) { return update_initial_window_size(&stream->local_window_size, new_initial_window_size, old_initial_window_size); diff --git a/deps/nghttp2/lib/nghttp2_stream.h b/deps/nghttp2/lib/nghttp2_stream.h index 71b9fb1140c932..28add165469d94 100644 --- a/deps/nghttp2/lib/nghttp2_stream.h +++ b/deps/nghttp2/lib/nghttp2_stream.h @@ -124,10 +124,9 @@ typedef enum { NGHTTP2_HTTP_FLAG_METH_HEAD = 1 << 8, NGHTTP2_HTTP_FLAG_METH_OPTIONS = 1 << 9, NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND = 1 << 10, - NGHTTP2_HTTP_FLAG_METH_ALL = NGHTTP2_HTTP_FLAG_METH_CONNECT | - NGHTTP2_HTTP_FLAG_METH_HEAD | - NGHTTP2_HTTP_FLAG_METH_OPTIONS | - NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND, + NGHTTP2_HTTP_FLAG_METH_ALL = + NGHTTP2_HTTP_FLAG_METH_CONNECT | NGHTTP2_HTTP_FLAG_METH_HEAD | + NGHTTP2_HTTP_FLAG_METH_OPTIONS | NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND, /* :path category */ /* path starts with "/" */ NGHTTP2_HTTP_FLAG_PATH_REGULAR = 1 << 11, @@ -296,8 +295,8 @@ int nghttp2_stream_check_deferred_by_flow_control(nghttp2_stream *stream); * overflow. */ int nghttp2_stream_update_remote_initial_window_size( - nghttp2_stream *stream, int32_t new_initial_window_size, - int32_t old_initial_window_size); + nghttp2_stream *stream, int32_t new_initial_window_size, + int32_t old_initial_window_size); /* * Updates the local window size with the new value @@ -308,8 +307,8 @@ int nghttp2_stream_update_remote_initial_window_size( * overflow. */ int nghttp2_stream_update_local_initial_window_size( - nghttp2_stream *stream, int32_t new_initial_window_size, - int32_t old_initial_window_size); + nghttp2_stream *stream, int32_t new_initial_window_size, + int32_t old_initial_window_size); /* * Call this function if promised stream |stream| is replied with diff --git a/deps/nghttp2/lib/nghttp2_submit.c b/deps/nghttp2/lib/nghttp2_submit.c index f947969cd99c1f..81c1ab7046bc33 100644 --- a/deps/nghttp2/lib/nghttp2_submit.c +++ b/deps/nghttp2/lib/nghttp2_submit.c @@ -94,8 +94,8 @@ static int32_t submit_headers_shared(nghttp2_session *session, uint8_t flags, item->aux_data.headers.stream_user_data = stream_user_data; flags_copy = - (uint8_t)((flags & (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PRIORITY)) | - NGHTTP2_FLAG_END_HEADERS); + (uint8_t)((flags & (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PRIORITY)) | + NGHTTP2_FLAG_END_HEADERS); if (stream_id == -1) { if (session->next_stream_id > INT32_MAX) { @@ -174,9 +174,8 @@ int nghttp2_submit_trailer(nghttp2_session *session, int32_t stream_id, return NGHTTP2_ERR_INVALID_ARGUMENT; } - return (int)submit_headers_shared_nva(session, NGHTTP2_FLAG_END_STREAM, - stream_id, NULL, nva, nvlen, NULL, - NULL); + return (int)submit_headers_shared_nva( + session, NGHTTP2_FLAG_END_STREAM, stream_id, NULL, nva, nvlen, NULL, NULL); } int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags, @@ -389,8 +388,8 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags, } if (stream_id == 0) { rv = nghttp2_adjust_local_window_size( - &session->local_window_size, &session->recv_window_size, - &session->recv_reduction, &window_size_increment); + &session->local_window_size, &session->recv_window_size, + &session->recv_reduction, &window_size_increment); if (rv != 0) { return rv; } @@ -401,8 +400,8 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags, } rv = nghttp2_adjust_local_window_size( - &stream->local_window_size, &stream->recv_window_size, - &stream->recv_reduction, &window_size_increment); + &stream->local_window_size, &stream->recv_window_size, + &stream->recv_reduction, &window_size_increment); if (rv != 0) { return rv; } @@ -411,10 +410,10 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags, if (window_size_increment > 0) { if (stream_id == 0) { session->consumed_size = - nghttp2_max(0, session->consumed_size - window_size_increment); + nghttp2_max_int32(0, session->consumed_size - window_size_increment); } else { stream->consumed_size = - nghttp2_max(0, stream->consumed_size - window_size_increment); + nghttp2_max_int32(0, stream->consumed_size - window_size_increment); } return nghttp2_session_add_window_update(session, 0, stream_id, @@ -444,13 +443,13 @@ int nghttp2_session_set_local_window_size(nghttp2_session *session, if (window_size_increment < 0) { return nghttp2_adjust_local_window_size( - &session->local_window_size, &session->recv_window_size, - &session->recv_reduction, &window_size_increment); + &session->local_window_size, &session->recv_window_size, + &session->recv_reduction, &window_size_increment); } rv = nghttp2_increase_local_window_size( - &session->local_window_size, &session->recv_window_size, - &session->recv_reduction, &window_size_increment); + &session->local_window_size, &session->recv_window_size, + &session->recv_reduction, &window_size_increment); if (rv != 0) { return rv; @@ -477,13 +476,13 @@ int nghttp2_session_set_local_window_size(nghttp2_session *session, if (window_size_increment < 0) { return nghttp2_adjust_local_window_size( - &stream->local_window_size, &stream->recv_window_size, - &stream->recv_reduction, &window_size_increment); + &stream->local_window_size, &stream->recv_window_size, + &stream->recv_reduction, &window_size_increment); } rv = nghttp2_increase_local_window_size( - &stream->local_window_size, &stream->recv_window_size, - &stream->recv_reduction, &window_size_increment); + &stream->local_window_size, &stream->recv_window_size, + &stream->recv_reduction, &window_size_increment); if (rv != 0) { return rv; @@ -614,7 +613,7 @@ int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags, /* The last nov is added for terminal NULL character. */ ov_copy = - nghttp2_mem_malloc(mem, nov * sizeof(nghttp2_origin_entry) + len + nov); + nghttp2_mem_malloc(mem, nov * sizeof(nghttp2_origin_entry) + len + nov); if (ov_copy == NULL) { return NGHTTP2_ERR_NOMEM; } @@ -898,7 +897,7 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags, assert(data_prd); return nghttp2_submit_data_shared( - session, flags, stream_id, nghttp2_data_provider_wrap_v1(&dpw, data_prd)); + session, flags, stream_id, nghttp2_data_provider_wrap_v1(&dpw, data_prd)); } int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags, @@ -909,7 +908,7 @@ int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags, assert(data_prd); return nghttp2_submit_data_shared( - session, flags, stream_id, nghttp2_data_provider_wrap_v2(&dpw, data_prd)); + session, flags, stream_id, nghttp2_data_provider_wrap_v2(&dpw, data_prd)); } ssize_t nghttp2_pack_settings_payload(uint8_t *buf, size_t buflen, diff --git a/deps/nghttp2/lib/nghttp2_submit.h b/deps/nghttp2/lib/nghttp2_submit.h index 96781d2a274515..350ee02275902a 100644 --- a/deps/nghttp2/lib/nghttp2_submit.h +++ b/deps/nghttp2/lib/nghttp2_submit.h @@ -31,7 +31,7 @@ #include <nghttp2/nghttp2.h> -typedef struct nghttp2_data_provider_wrap nghttp2_data_provider_wrap; +#include "nghttp2_outbound_item.h" int nghttp2_submit_data_shared(nghttp2_session *session, uint8_t flags, int32_t stream_id, diff --git a/deps/nghttp2/lib/nghttp2_time.c b/deps/nghttp2/lib/nghttp2_time.c index 947b5449e5ac6d..148ccfdce81c12 100644 --- a/deps/nghttp2/lib/nghttp2_time.c +++ b/deps/nghttp2/lib/nghttp2_time.c @@ -45,7 +45,7 @@ static uint64_t time_now_sec(void) { #if defined(HAVE_GETTICKCOUNT64) && !defined(__CYGWIN__) uint64_t nghttp2_time_now_sec(void) { return GetTickCount64() / 1000; } #elif defined(HAVE_CLOCK_GETTIME) && defined(HAVE_DECL_CLOCK_MONOTONIC) && \ - HAVE_DECL_CLOCK_MONOTONIC + HAVE_DECL_CLOCK_MONOTONIC uint64_t nghttp2_time_now_sec(void) { struct timespec tp; int rv = clock_gettime(CLOCK_MONOTONIC, &tp); diff --git a/deps/nghttp2/lib/sfparse.c b/deps/nghttp2/lib/sfparse.c index efa2850c9d661d..b5e94cc281533b 100644 --- a/deps/nghttp2/lib/sfparse.c +++ b/deps/nghttp2/lib/sfparse.c @@ -1075,21 +1075,20 @@ void sf_unescape(sf_vec *dest, const sf_vec *src) { void sf_base64decode(sf_vec *dest, const sf_vec *src) { static const int index_tbl[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1}; + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, + -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1}; uint8_t *o; const uint8_t *p, *end; uint32_t n; diff --git a/deps/nghttp2/unofficial.gni b/deps/nghttp2/unofficial.gni index 6b3f23a7b0b662..4558fbbf5e5f82 100644 --- a/deps/nghttp2/unofficial.gni +++ b/deps/nghttp2/unofficial.gni @@ -34,6 +34,9 @@ template("nghttp2_gn_build") { if (is_clang || !is_win) { cflags_c = [ "-Wno-implicit-fallthrough", + # Ref https://github.com/nghttp2/nghttp2/pull/2258 + # This can be removed when the above PR is ingested. + "-Wno-extra-semi", ] } } diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h index 77eb1fbf263815..6cf947487bf899 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h @@ -31,11 +31,11 @@ libcurl) */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 -#endif +#endif /* (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) */ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ #include <stdlib.h> #if defined(_MSC_VER) && (_MSC_VER < 1800) @@ -43,9 +43,9 @@ extern "C" { compliant. See compiler macros and version number in https://sourceforge.net/p/predef/wiki/Compilers/ */ # include <stdint.h> -#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#else /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ # include <inttypes.h> -#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#endif /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ #include <sys/types.h> #include <stdarg.h> #include <stddef.h> @@ -57,22 +57,22 @@ extern "C" { #elif defined(WIN32) # ifdef BUILDING_NGHTTP3 # define NGHTTP3_EXTERN __declspec(dllexport) -# else /* !BUILDING_NGHTTP3 */ +# else /* !defined(BUILDING_NGHTTP3) */ # define NGHTTP3_EXTERN __declspec(dllimport) -# endif /* !BUILDING_NGHTTP3 */ -#else /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGHTTP3) */ +#else /* !(defined(NGHTTP3_STATICLIB) || defined(WIN32)) */ # ifdef BUILDING_NGHTTP3 # define NGHTTP3_EXTERN __attribute__((visibility("default"))) -# else /* !BUILDING_NGHTTP3 */ +# else /* !defined(BUILDING_NGHTTP3) */ # define NGHTTP3_EXTERN -# endif /* !BUILDING_NGHTTP3 */ -#endif /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGHTTP3) */ +#endif /* !(defined(NGHTTP3_STATICLIB) || defined(WIN32)) */ #ifdef _MSC_VER # define NGHTTP3_ALIGN(N) __declspec(align(N)) -#else /* !_MSC_VER */ +#else /* !defined(_MSC_VER) */ # define NGHTTP3_ALIGN(N) __attribute__((aligned(N))) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ /** * @typedef @@ -624,7 +624,7 @@ typedef struct nghttp3_buf { */ uint8_t *end; /** - * :member:`pos` pointers to the start of data. Typically, this + * :member:`pos` points to the start of data. Typically, this * points to the address that next data should be read. Initially, * it points to :member:`begin`. */ @@ -1161,8 +1161,8 @@ NGHTTP3_EXTERN void nghttp3_qpack_encoder_del(nghttp3_qpack_encoder *encoder); * anymore. */ NGHTTP3_EXTERN int nghttp3_qpack_encoder_encode( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, nghttp3_buf *rbuf, - nghttp3_buf *ebuf, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen); + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, nghttp3_buf *rbuf, + nghttp3_buf *ebuf, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen); /** * @function @@ -1182,7 +1182,7 @@ NGHTTP3_EXTERN int nghttp3_qpack_encoder_encode( * |encoder| is unable to process input because it is malformed. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_encoder_read_decoder( - nghttp3_qpack_encoder *encoder, const uint8_t *src, size_t srclen); + nghttp3_qpack_encoder *encoder, const uint8_t *src, size_t srclen); /** * @function @@ -1343,7 +1343,7 @@ NGHTTP3_EXTERN void nghttp3_qpack_decoder_del(nghttp3_qpack_decoder *decoder); * Could not interpret encoder stream instruction. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_decoder_read_encoder( - nghttp3_qpack_decoder *decoder, const uint8_t *src, size_t srclen); + nghttp3_qpack_decoder *decoder, const uint8_t *src, size_t srclen); /** * @function @@ -1436,9 +1436,9 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * HTTP field is too large. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_decoder_read_request( - nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, - nghttp3_qpack_nv *nv, uint8_t *pflags, const uint8_t *src, size_t srclen, - int fin); + nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, + nghttp3_qpack_nv *nv, uint8_t *pflags, const uint8_t *src, size_t srclen, + int fin); /** * @function @@ -1568,7 +1568,7 @@ typedef void (*nghttp3_debug_vprintf_callback)(const char *format, * times because this is important. */ NGHTTP3_EXTERN void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback); + nghttp3_debug_vprintf_callback debug_vprintf_callback); /** * @macrosection @@ -2118,9 +2118,10 @@ NGHTTP3_EXTERN int nghttp3_conn_bind_qpack_streams(nghttp3_conn *conn, * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` * User callback failed. * - * It may return the other error codes. In general, the negative - * error code means that |conn| encountered a connection error, and - * the connection should be closed. + * It may return the other error codes. The negative error code means + * that |conn| encountered a connection error, and the connection must + * be closed. Calling nghttp3 API other than `nghttp3_conn_del` + * causes undefined behavior. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, int64_t stream_id, @@ -2152,9 +2153,10 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` * User callback failed. * - * It may return the other error codes. In general, the negative - * error code means that |conn| encountered a connection error, and - * the connection should be closed. + * It may return the other error codes. The negative error code means + * that |conn| encountered a connection error, and the connection must + * be closed. Calling nghttp3 API other than `nghttp3_conn_del` + * causes undefined behavior. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, int64_t *pstream_id, @@ -2198,6 +2200,9 @@ NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, * If a stream denoted by |stream_id| is not found, this function * returns 0. * + * Alternatively, `nghttp3_conn_update_ack_offset` can be used to + * accomplish the same thing. + * * This function returns 0 if it succeeds, or one of the following * negative error codes: * @@ -2207,6 +2212,31 @@ NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, NGHTTP3_EXTERN int nghttp3_conn_add_ack_offset(nghttp3_conn *conn, int64_t stream_id, uint64_t n); +/** + * @function + * + * `nghttp3_conn_update_ack_offset` tells |conn| that QUIC stack has + * acknowledged the stream data up to |offset| for a stream denoted by + * |stream_id|. + * + * If a stream denoted by |stream_id| is not found, this function + * returns 0. + * + * Alternatively, `nghttp3_conn_add_ack_offset` can be used to + * accomplish the same thing. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT` + * |offset| is less than the number of bytes acknowledged so far. + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` + * User callback failed. + */ +NGHTTP3_EXTERN int nghttp3_conn_update_ack_offset(nghttp3_conn *conn, + int64_t stream_id, + uint64_t offset); + /** * @function * @@ -2314,9 +2344,9 @@ NGHTTP3_EXTERN int nghttp3_conn_resume_stream(nghttp3_conn *conn, /** * @function * - * `nghttp3_conn_close_stream` closes stream identified by - * |stream_id|. QUIC application error code |app_error_code| is the - * reason of the closure. + * `nghttp3_conn_close_stream` tells the library that a stream + * identified by |stream_id| has been closed. QUIC application error + * code |app_error_code| is the reason of the closure. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -2419,8 +2449,8 @@ nghttp3_conn_set_max_concurrent_streams(nghttp3_conn *conn, * stream. */ typedef nghttp3_ssize (*nghttp3_read_data_callback)( - nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, size_t veccnt, - uint32_t *pflags, void *conn_user_data, void *stream_user_data); + nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, size_t veccnt, + uint32_t *pflags, void *conn_user_data, void *stream_user_data); /** * @struct @@ -2460,8 +2490,8 @@ typedef struct nghttp3_data_reader { * Out of memory. */ NGHTTP3_EXTERN int nghttp3_conn_submit_request( - nghttp3_conn *conn, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen, - const nghttp3_data_reader *dr, void *stream_user_data); + nghttp3_conn *conn, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen, + const nghttp3_data_reader *dr, void *stream_user_data); /** * @function @@ -2667,7 +2697,7 @@ typedef struct NGHTTP3_ALIGN(8) nghttp3_pri { * Stream not found. */ NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority_versioned( - nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id); + nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id); /** * @function @@ -2720,8 +2750,8 @@ NGHTTP3_EXTERN int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn, * Out of memory. */ NGHTTP3_EXTERN int nghttp3_conn_set_server_stream_priority_versioned( - nghttp3_conn *conn, int64_t stream_id, int pri_version, - const nghttp3_pri *pri); + nghttp3_conn *conn, int64_t stream_id, int pri_version, + const nghttp3_pri *pri); /** * @function @@ -2884,7 +2914,7 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); */ #define nghttp3_conn_set_server_stream_priority(CONN, STREAM_ID, PRI) \ nghttp3_conn_set_server_stream_priority_versioned( \ - (CONN), (STREAM_ID), NGHTTP3_PRI_VERSION, (PRI)) + (CONN), (STREAM_ID), NGHTTP3_PRI_VERSION, (PRI)) /* * `nghttp3_conn_get_stream_priority` is a wrapper around @@ -2906,6 +2936,6 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGHTTP3_H */ +#endif /* !defined(NGHTTP3_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h index bc57eb2cfcf2d6..7f6cb8acffe672 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h @@ -31,7 +31,7 @@ * * Version number of the nghttp3 library release. */ -#define NGHTTP3_VERSION "0.7.0" +#define NGHTTP3_VERSION "1.6.0" /** * @macro @@ -41,6 +41,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGHTTP3_VERSION_NUM 0x000700 +#define NGHTTP3_VERSION_NUM 0x010600 -#endif /* NGHTTP3_VERSION_H */ +#endif /* !defined(NGHTTP3_VERSION_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c index e134d0f4dceb75..544e4fb1306a5f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c @@ -66,8 +66,8 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { assert(n <= balloc->blklen); if (nghttp3_buf_left(&balloc->buf) < n) { - p = nghttp3_mem_malloc(balloc->mem, sizeof(nghttp3_memblock_hd) + 0x10u + - balloc->blklen); + p = nghttp3_mem_malloc(balloc->mem, + sizeof(nghttp3_memblock_hd) + 0x8u + balloc->blklen); if (p == NULL) { return NGHTTP3_ERR_NOMEM; } @@ -76,10 +76,10 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { hd->next = balloc->head; balloc->head = hd; nghttp3_buf_wrap_init( - &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), - balloc->blklen); + &balloc->buf, + (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & + ~(uintptr_t)0xfu), + balloc->blklen); } assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h index e02f61d16b5763..c95f0426a924bf 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -40,7 +40,10 @@ typedef struct nghttp3_memblock_hd nghttp3_memblock_hd; * nghttp3_memblock_hd is the header of memory block. */ struct nghttp3_memblock_hd { - nghttp3_memblock_hd *next; + union { + nghttp3_memblock_hd *next; + uint64_t pad; + }; }; /* @@ -89,4 +92,4 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n); */ void nghttp3_balloc_clear(nghttp3_balloc *balloc); -#endif /* NGHTTP3_BALLOC_H */ +#endif /* !defined(NGHTTP3_BALLOC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h index 472a4b7b14a80e..9fa067de91b949 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -71,4 +71,4 @@ void nghttp3_typed_buf_init(nghttp3_typed_buf *tbuf, const nghttp3_buf *buf, void nghttp3_typed_buf_free(nghttp3_typed_buf *tbuf); -#endif /* NGHTTP3_BUF_H */ +#endif /* !defined(NGHTTP3_BUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c index 25aaf685734cb1..f70b4f5472de64 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c @@ -210,9 +210,9 @@ static int conn_call_recv_settings(nghttp3_conn *conn) { static int ricnt_less(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { nghttp3_stream *lhs = - nghttp3_struct_of(lhsx, nghttp3_stream, qpack_blocked_pe); + nghttp3_struct_of(lhsx, nghttp3_stream, qpack_blocked_pe); nghttp3_stream *rhs = - nghttp3_struct_of(rhsx, nghttp3_stream, qpack_blocked_pe); + nghttp3_struct_of(rhsx, nghttp3_stream, qpack_blocked_pe); return lhs->qpack_sctx.ricnt < rhs->qpack_sctx.ricnt; } @@ -250,19 +250,19 @@ static int conn_new(nghttp3_conn **pconn, int server, int callbacks_version, nghttp3_objalloc_init(&conn->out_chunk_objalloc, NGHTTP3_STREAM_MIN_CHUNK_SIZE * 16, mem); - nghttp3_objalloc_stream_init(&conn->stream_objalloc, 64, mem); + nghttp3_objalloc_stream_init(&conn->stream_objalloc, 8, mem); nghttp3_map_init(&conn->streams, mem); - rv = nghttp3_qpack_decoder_init(&conn->qdec, - settings->qpack_max_dtable_capacity, - settings->qpack_blocked_streams, mem); + rv = + nghttp3_qpack_decoder_init(&conn->qdec, settings->qpack_max_dtable_capacity, + settings->qpack_blocked_streams, mem); if (rv != 0) { goto qdec_init_fail; } rv = nghttp3_qpack_encoder_init( - &conn->qenc, settings->qpack_encoder_max_dtable_capacity, mem); + &conn->qenc, settings->qpack_encoder_max_dtable_capacity, mem); if (rv != 0) { goto qenc_init_fail; } @@ -273,7 +273,7 @@ static int conn_new(nghttp3_conn **pconn, int server, int callbacks_version, nghttp3_pq_init(&conn->sched[i].spq, cycle_less, mem); } - nghttp3_idtr_init(&conn->remote.bidi.idtr, server, mem); + nghttp3_idtr_init(&conn->remote.bidi.idtr, mem); conn->callbacks = *callbacks; conn->local.settings = *settings; @@ -368,7 +368,7 @@ void nghttp3_conn_del(nghttp3_conn *conn) { nghttp3_qpack_encoder_free(&conn->qenc); nghttp3_qpack_decoder_free(&conn->qdec); - nghttp3_map_each_free(&conn->streams, free_stream, NULL); + nghttp3_map_each(&conn->streams, free_stream, NULL); nghttp3_map_free(&conn->streams); nghttp3_objalloc_free(&conn->stream_objalloc); @@ -419,7 +419,7 @@ nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, int64_t stream_id, } conn->rx.max_stream_id_bidi = - nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -498,7 +498,7 @@ static nghttp3_ssize conn_read_type(nghttp3_conn *conn, nghttp3_stream *stream, assert(srclen); - nread = nghttp3_read_varint(rvint, src, srclen, fin); + nread = nghttp3_read_varint(rvint, src, src + srclen, fin); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -650,7 +650,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, switch (rstate->state) { case NGHTTP3_CTRL_STREAM_STATE_FRAME_TYPE: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), /* fin = */ 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -670,7 +670,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, /* Fall through */ case NGHTTP3_CTRL_STREAM_STATE_FRAME_LENGTH: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), /* fin = */ 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -767,9 +767,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Read Identifier */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -795,7 +795,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; } - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -811,16 +811,16 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_varint_read_state_reset(rvint); rv = - nghttp3_conn_on_settings_entry_received(conn, &rstate->fr.settings); + nghttp3_conn_on_settings_entry_received(conn, &rstate->fr.settings); if (rv != 0) { return rv; } } break; case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_ID: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -845,9 +845,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Fall through */ case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_VALUE: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -879,9 +879,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_GOAWAY: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -906,7 +906,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, if (conn->callbacks.shutdown) { rv = - conn->callbacks.shutdown(conn, conn->rx.goaway_id, conn->user_data); + conn->callbacks.shutdown(conn, conn->rx.goaway_id, conn->user_data); if (rv != 0) { return NGHTTP3_ERR_CALLBACK_FAILURE; } @@ -916,9 +916,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_MAX_PUSH_ID: /* server side only */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -941,9 +941,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE_PRI_ELEM_ID: /* server side only */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -977,7 +977,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE: /* We need to buffer Priority Field Value because it might be fragmented. */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); if (conn->rx.pri_fieldbuflen == 0 && rstate->left == (int64_t)len) { /* Everything is in the input buffer. Apply same length @@ -1032,7 +1032,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); p += len; nconsumed += len; rstate->left -= (int64_t)len; @@ -1076,7 +1076,7 @@ static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { } rv = - nghttp3_map_remove(&conn->streams, (nghttp3_map_key_type)stream->node.id); + nghttp3_map_remove(&conn->streams, (nghttp3_map_key_type)stream->node.id); assert(0 == rv); @@ -1104,8 +1104,8 @@ static int conn_process_blocked_stream_data(nghttp3_conn *conn, buf = nghttp3_ringbuf_get(&stream->inq, 0); nconsumed = nghttp3_conn_read_bidi( - conn, &nproc, stream, buf->pos, nghttp3_buf_len(buf), - len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF)); + conn, &nproc, stream, buf->pos, nghttp3_buf_len(buf), + len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF)); if (nconsumed < 0) { return (int)nconsumed; } @@ -1144,7 +1144,7 @@ nghttp3_ssize nghttp3_conn_read_qpack_encoder(nghttp3_conn *conn, const uint8_t *src, size_t srclen) { nghttp3_ssize nconsumed = - nghttp3_qpack_decoder_read_encoder(&conn->qdec, src, srclen); + nghttp3_qpack_decoder_read_encoder(&conn->qdec, src, srclen); nghttp3_stream *stream; int rv; @@ -1240,7 +1240,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, switch (rstate->state) { case NGHTTP3_REQ_STREAM_STATE_FRAME_TYPE: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), fin); + nread = nghttp3_read_varint(rvint, p, end, fin); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -1260,7 +1260,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, /* Fall through */ case NGHTTP3_REQ_STREAM_STATE_FRAME_LENGTH: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), fin); + nread = nghttp3_read_varint(rvint, p, end, fin); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -1277,14 +1277,14 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, switch (rstate->fr.hd.type) { case NGHTTP3_FRAME_DATA: rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_DATA_BEGIN); + stream, NGHTTP3_HTTP_EVENT_DATA_BEGIN); if (rv != 0) { return rv; } /* DATA frame might be empty. */ if (rstate->left == 0) { rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_DATA_END); + stream, NGHTTP3_HTTP_EVENT_DATA_END); assert(0 == rv); nghttp3_stream_read_state_reset(rstate); @@ -1294,7 +1294,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_FRAME_HEADERS: rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_HEADERS_BEGIN); + stream, NGHTTP3_HTTP_EVENT_HEADERS_BEGIN); if (rv != 0) { return rv; } @@ -1305,7 +1305,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_HEADERS_END); + stream, NGHTTP3_HTTP_EVENT_HEADERS_END); assert(0 == rv); nghttp3_stream_read_state_reset(rstate); @@ -1351,7 +1351,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } break; case NGHTTP3_REQ_STREAM_STATE_DATA: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); rv = nghttp3_conn_on_data(conn, stream, p, len); if (rv != 0) { return rv; @@ -1370,7 +1370,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_REQ_STREAM_STATE_HEADERS: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); nread = nghttp3_conn_on_headers(conn, stream, p, len, (int64_t)len == rstate->left); if (nread < 0) { @@ -1478,7 +1478,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_REQ_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); p += len; nconsumed += len; rstate->left -= (int64_t)len; @@ -1590,9 +1590,9 @@ static nghttp3_ssize conn_decode_headers(nghttp3_conn *conn, buf.last = buf.end; for (;;) { - nread = nghttp3_qpack_decoder_read_request(qdec, &stream->qpack_sctx, &nv, - &flags, buf.pos, - nghttp3_buf_len(&buf), fin); + nread = + nghttp3_qpack_decoder_read_request(qdec, &stream->qpack_sctx, &nv, &flags, + buf.pos, nghttp3_buf_len(&buf), fin); if (nread < 0) { return (int)nread; @@ -1625,8 +1625,8 @@ static nghttp3_ssize conn_decode_headers(nghttp3_conn *conn, if (flags & NGHTTP3_QPACK_DECODE_FLAG_EMIT) { rv = nghttp3_http_on_header( - http, &nv, request, trailers, - conn->server && conn->local.settings.enable_connect_protocol); + http, &nv, request, trailers, + conn->server && conn->local.settings.enable_connect_protocol); switch (rv) { case NGHTTP3_ERR_MALFORMED_HTTP_HEADER: break; @@ -1705,7 +1705,7 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, dest->qpack_blocked_streams = (size_t)ent->value; nghttp3_qpack_encoder_set_max_blocked_streams( - &conn->qenc, (size_t)nghttp3_min(100, ent->value)); + &conn->qenc, (size_t)nghttp3_min_uint64(100, ent->value)); break; case NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL: if (!conn->server) { @@ -1784,7 +1784,7 @@ conn_on_priority_update_stream(nghttp3_conn *conn, } conn->rx.max_stream_id_bidi = - nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -1836,7 +1836,7 @@ int nghttp3_conn_create_stream(nghttp3_conn *conn, nghttp3_stream **pstream, nghttp3_stream *stream; int rv; nghttp3_stream_callbacks callbacks = { - conn_stream_acked_data, + conn_stream_acked_data, }; rv = nghttp3_stream_new(&stream, stream_id, &callbacks, @@ -1995,7 +1995,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, if (conn->tx.ctrl && !nghttp3_stream_is_blocked(conn->tx.ctrl)) { ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.ctrl); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.ctrl); if (ncnt) { return ncnt; } @@ -2008,7 +2008,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, } ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qdec); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qdec); if (ncnt) { return ncnt; } @@ -2016,7 +2016,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, if (conn->tx.qenc && !nghttp3_stream_is_blocked(conn->tx.qenc)) { ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qenc); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qenc); if (ncnt) { return ncnt; } @@ -2095,7 +2095,22 @@ int nghttp3_conn_add_ack_offset(nghttp3_conn *conn, int64_t stream_id, return 0; } - return nghttp3_stream_add_ack_offset(stream, n); + return nghttp3_stream_update_ack_offset(stream, stream->ack_offset + n); +} + +int nghttp3_conn_update_ack_offset(nghttp3_conn *conn, int64_t stream_id, + uint64_t offset) { + nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + + if (stream == NULL) { + return 0; + } + + if (stream->ack_offset > offset) { + return NGHTTP3_ERR_INVALID_ARGUMENT; + } + + return nghttp3_stream_update_ack_offset(stream, offset); } static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream, @@ -2304,7 +2319,7 @@ int nghttp3_conn_shutdown(nghttp3_conn *conn) { frent.fr.hd.type = NGHTTP3_FRAME_GOAWAY; if (conn->server) { frent.fr.goaway.id = - nghttp3_min((1ll << 62) - 4, conn->rx.max_stream_id_bidi + 4); + nghttp3_min_int64((1ll << 62) - 4, conn->rx.max_stream_id_bidi + 4); } else { frent.fr.goaway.id = 0; } @@ -2318,7 +2333,7 @@ int nghttp3_conn_shutdown(nghttp3_conn *conn) { conn->tx.goaway_id = frent.fr.goaway.id; conn->flags |= - NGHTTP3_CONN_FLAG_GOAWAY_QUEUED | NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED; + NGHTTP3_CONN_FLAG_GOAWAY_QUEUED | NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED; return 0; } @@ -2619,5 +2634,5 @@ void nghttp3_settings_default_versioned(int settings_version, memset(settings, 0, sizeof(nghttp3_settings)); settings->max_field_section_size = NGHTTP3_VARINT_MAX; settings->qpack_encoder_max_dtable_capacity = - NGHTTP3_QPACK_ENCODER_MAX_DTABLE_CAPACITY; + NGHTTP3_QPACK_ENCODER_MAX_DTABLE_CAPACITY; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h index 74f47583ce825c..1218ba508ba46a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -204,4 +204,4 @@ int nghttp3_conn_reject_stream(nghttp3_conn *conn, nghttp3_stream *stream); */ nghttp3_stream *nghttp3_conn_get_next_tx_stream(nghttp3_conn *conn); -#endif /* NGHTTP3_CONN_H */ +#endif /* !defined(NGHTTP3_CONN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c index edd0adc4d0ff0a..6439a6d782960c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c @@ -31,34 +31,39 @@ #include "nghttp3_str.h" #include "nghttp3_unreachable.h" -int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p) { +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { union { - char b[8]; + uint8_t n8; uint16_t n16; uint32_t n32; uint64_t n64; } n; - *plen = (size_t)(1u << (*p >> 6)); - - switch (*plen) { + switch (*p >> 6) { + case 0: + *dest = *p++; + return p; case 1: - return (int64_t)*p; - case 2: memcpy(&n, p, 2); - n.b[0] &= 0x3f; - return (int64_t)ntohs(n.n16); - case 4: + n.n8 &= 0x3f; + *dest = ntohs(n.n16); + + return p + 2; + case 2: memcpy(&n, p, 4); - n.b[0] &= 0x3f; - return (int64_t)ntohl(n.n32); - case 8: + n.n8 &= 0x3f; + *dest = ntohl(n.n32); + + return p + 4; + case 3: memcpy(&n, p, 8); - n.b[0] &= 0x3f; - return (int64_t)nghttp3_ntohl64(n.n64); - } + n.n8 &= 0x3f; + *dest = (int64_t)nghttp3_ntohl64(n.n64); - nghttp3_unreachable(); + return p + 8; + default: + nghttp3_unreachable(); + } } int64_t nghttp3_get_varint_fb(const uint8_t *p) { return *p & 0x3f; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h index 5522bc735bfd37..40f5d4de782883 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h @@ -28,69 +28,67 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #ifdef HAVE_ARPA_INET_H # include <arpa/inet.h> -#endif /* HAVE_ARPA_INET_H */ +#endif /* defined(HAVE_ARPA_INET_H) */ #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> -#endif /* HAVE_NETINET_IN_H */ +#endif /* defined(HAVE_NETINET_IN_H) */ #ifdef HAVE_BYTESWAP_H # include <byteswap.h> -#endif /* HAVE_BYTESWAP_H */ +#endif /* defined(HAVE_BYTESWAP_H) */ #ifdef HAVE_ENDIAN_H # include <endian.h> -#endif /* HAVE_ENDIAN_H */ +#endif /* defined(HAVE_ENDIAN_H) */ #ifdef HAVE_SYS_ENDIAN_H # include <sys/endian.h> -#endif /* HAVE_SYS_ENDIAN_H */ +#endif /* defined(HAVE_SYS_ENDIAN_H) */ -#if defined(__APPLE__) +#ifdef __APPLE__ # include <libkern/OSByteOrder.h> -#endif // __APPLE__ +#endif /* defined(__APPLE__) */ #include <nghttp3/nghttp3.h> -#if defined(HAVE_BE64TOH) || \ - (defined(HAVE_DECL_BE64TOH) && HAVE_DECL_BE64TOH > 0) +#if HAVE_DECL_BE64TOH # define nghttp3_ntohl64(N) be64toh(N) # define nghttp3_htonl64(N) htobe64(N) -#else /* !HAVE_BE64TOH */ -# if defined(WORDS_BIGENDIAN) +#else /* !HAVE_DECL_BE64TOH */ +# ifdef WORDS_BIGENDIAN # define nghttp3_ntohl64(N) (N) # define nghttp3_htonl64(N) (N) -# else /* !WORDS_BIGENDIAN */ -# if defined(HAVE_BSWAP_64) || \ - (defined(HAVE_DECL_BSWAP_64) && HAVE_DECL_BSWAP_64 > 0) +# else /* !defined(WORDS_BIGENDIAN) */ +# if HAVE_DECL_BSWAP_64 # define nghttp3_bswap64 bswap_64 # elif defined(WIN32) # define nghttp3_bswap64 _byteswap_uint64 # elif defined(__APPLE__) # define nghttp3_bswap64 OSSwapInt64 -# else /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define nghttp3_bswap64(N) \ ((uint64_t)(ntohl((uint32_t)(N))) << 32 | ntohl((uint32_t)((N) >> 32))) -# endif /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# endif /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define nghttp3_ntohl64(N) nghttp3_bswap64(N) # define nghttp3_htonl64(N) nghttp3_bswap64(N) -# endif /* !WORDS_BIGENDIAN */ -#endif /* !HAVE_BE64TOH */ +# endif /* !defined(WORDS_BIGENDIAN) */ +#endif /* !HAVE_DECL_BE64TOH */ -#if defined(WIN32) +#ifdef WIN32 /* Windows requires ws2_32 library for ntonl family of functions. We define inline functions for those functions so that we don't have dependency on that lib. */ # ifdef _MSC_VER # define STIN static __inline -# else +# else /* !defined(_MSC_VER) */ # define STIN static inline -# endif +# endif /* !defined(_MSC_VER) */ STIN uint32_t htonl(uint32_t hostlong) { uint32_t res; @@ -128,14 +126,14 @@ STIN uint16_t ntohs(uint16_t netshort) { return res; } -#endif /* WIN32 */ +#endif /* defined(WIN32) */ /* - * nghttp3_get_varint reads variable-length integer from |p|, and - * returns it in host byte order. The number of bytes read is stored - * in |*plen|. + * nghttp3_get_varint reads variable-length unsigned integer from |p|, + * and stores it in the buffer pointed by |dest| in host byte order. + * It returns |p| plus the number of bytes read from |p|. */ -int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p); +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p); /* * nghttp3_get_varint_fb reads first byte of encoded variable-length @@ -193,4 +191,4 @@ uint64_t nghttp3_ord_stream_id(int64_t stream_id); */ #define NGHTTP3_PRI_INC_MASK (1 << 7) -#endif /* NGHTTP3_CONV_H */ +#endif /* !defined(NGHTTP3_CONV_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c index 4021b0dc469b66..0235217e9627ce 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c @@ -35,7 +35,7 @@ static void nghttp3_default_debug_vfprintf_callback(const char *fmt, } static nghttp3_debug_vprintf_callback static_debug_vprintf_callback = - nghttp3_default_debug_vfprintf_callback; + nghttp3_default_debug_vfprintf_callback; void nghttp3_debug_vprintf(const char *format, ...) { if (static_debug_vprintf_callback) { @@ -47,15 +47,15 @@ void nghttp3_debug_vprintf(const char *format, ...) { } void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback) { + nghttp3_debug_vprintf_callback debug_vprintf_callback) { static_debug_vprintf_callback = debug_vprintf_callback; } -#else /* !DEBUGBUILD */ +#else /* !defined(DEBUGBUILD) */ void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback) { + nghttp3_debug_vprintf_callback debug_vprintf_callback) { (void)debug_vprintf_callback; } -#endif /* !DEBUGBUILD */ +#endif /* !defined(DEBUGBUILD) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h index 01ed918414cfe5..d73bf8ecf312cd 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h @@ -28,17 +28,17 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> #ifdef DEBUGBUILD # define DEBUGF(...) nghttp3_debug_vprintf(__VA_ARGS__) void nghttp3_debug_vprintf(const char *format, ...); -#else +#else /* !defined(DEBUGBUILD) */ # define DEBUGF(...) \ do { \ } while (0) -#endif +#endif /* !defined(DEBUGBUILD) */ -#endif /* NGHTTP3_DEBUG_H */ +#endif /* !defined(NGHTTP3_DEBUG_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_err.h b/deps/ngtcp2/nghttp3/lib/nghttp3_err.h index 2fa914f86b189e..6f8205cc17ce7c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_err.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_err.h @@ -27,8 +27,8 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> -#endif /* NGHTTP3_ERR_H */ +#endif /* !defined(NGHTTP3_ERR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c index 923a78f90f826f..1d87e448d887cf 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c @@ -102,7 +102,7 @@ nghttp3_frame_write_priority_update(uint8_t *p, } size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { + int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { size_t payloadlen = nghttp3_put_varintlen(fr->pri_elem_id) + fr->datalen; *ppayloadlen = (int64_t)payloadlen; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h index 1079673d150ce3..e216967d740b86 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -188,7 +188,7 @@ nghttp3_frame_write_priority_update(uint8_t *dest, * stores payload length in |*ppayloadlen|. */ size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); + int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); /* * nghttp3_nva_copy copies name/value pairs from |nva|, which contains @@ -227,4 +227,4 @@ void nghttp3_frame_headers_free(nghttp3_frame_headers *fr, void nghttp3_frame_priority_update_free(nghttp3_frame_priority_update *fr, const nghttp3_mem *mem); -#endif /* NGHTTP3_FRAME_H */ +#endif /* !defined(NGHTTP3_FRAME_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c index 88cb49a02f892f..20eed5faa2bcba 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c @@ -37,14 +37,8 @@ void nghttp3_gaptr_init(nghttp3_gaptr *gaptr, const nghttp3_mem *mem) { static int gaptr_gap_init(nghttp3_gaptr *gaptr) { nghttp3_range range = {0, UINT64_MAX}; - int rv; - - rv = nghttp3_ksl_insert(&gaptr->gap, NULL, &range, NULL); - if (rv != 0) { - return rv; - } - return 0; + return nghttp3_ksl_insert(&gaptr->gap, NULL, &range, NULL); } void nghttp3_gaptr_free(nghttp3_gaptr *gaptr) { @@ -82,7 +76,9 @@ int nghttp3_gaptr_push(nghttp3_gaptr *gaptr, uint64_t offset, nghttp3_ksl_remove_hint(&gaptr->gap, &it, &it, &k); continue; } + nghttp3_range_cut(&l, &r, &k, &m); + if (nghttp3_range_len(&l)) { nghttp3_ksl_update_key(&gaptr->gap, &k, &l); @@ -95,23 +91,23 @@ int nghttp3_gaptr_push(nghttp3_gaptr *gaptr, uint64_t offset, } else if (nghttp3_range_len(&r)) { nghttp3_ksl_update_key(&gaptr->gap, &k, &r); } + nghttp3_ksl_it_next(&it); } + return 0; } uint64_t nghttp3_gaptr_first_gap_offset(nghttp3_gaptr *gaptr) { nghttp3_ksl_it it; - nghttp3_range r; if (nghttp3_ksl_len(&gaptr->gap) == 0) { return 0; } it = nghttp3_ksl_begin(&gaptr->gap); - r = *(nghttp3_range *)nghttp3_ksl_it_key(&it); - return r.begin; + return ((nghttp3_range *)nghttp3_ksl_it_key(&it))->begin; } nghttp3_range nghttp3_gaptr_get_first_gap_after(nghttp3_gaptr *gaptr, @@ -136,7 +132,6 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, uint64_t datalen) { nghttp3_range q = {offset, offset + datalen}; nghttp3_ksl_it it; - nghttp3_range k; nghttp3_range m; if (nghttp3_ksl_len(&gaptr->gap) == 0) { @@ -145,8 +140,7 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, it = nghttp3_ksl_lower_bound_compar(&gaptr->gap, &q, nghttp3_ksl_range_exclusive_compar); - k = *(nghttp3_range *)nghttp3_ksl_it_key(&it); - m = nghttp3_range_intersect(&q, &k); + m = nghttp3_range_intersect(&q, (nghttp3_range *)nghttp3_ksl_it_key(&it)); return nghttp3_range_len(&m) == 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h index 7c83c847c9fe29..7578fdc14f6010 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -40,8 +40,9 @@ * nghttp3_gaptr maintains the gap in the range [0, UINT64_MAX). */ typedef struct nghttp3_gaptr { - /* gap maintains the range of offset which is not received - yet. Initially, its range is [0, UINT64_MAX). */ + /* gap maintains the range of offset which is not pushed + yet. Initially, its range is [0, UINT64_MAX). "gap" is the range + that is not pushed yet. */ nghttp3_ksl gap; /* mem is custom memory allocator */ const nghttp3_mem *mem; @@ -58,8 +59,7 @@ void nghttp3_gaptr_init(nghttp3_gaptr *gaptr, const nghttp3_mem *mem); void nghttp3_gaptr_free(nghttp3_gaptr *gaptr); /* - * nghttp3_gaptr_push adds new data of length |datalen| at the stream - * offset |offset|. + * nghttp3_gaptr_push pushes the range [offset, offset + datalen). * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -77,7 +77,7 @@ uint64_t nghttp3_gaptr_first_gap_offset(nghttp3_gaptr *gaptr); /* * nghttp3_gaptr_get_first_gap_after returns the first gap which - * overlaps or comes after |offset|. + * includes or comes after |offset|. */ nghttp3_range nghttp3_gaptr_get_first_gap_after(nghttp3_gaptr *gaptr, uint64_t offset); @@ -96,4 +96,4 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, */ void nghttp3_gaptr_drop_first_gap(nghttp3_gaptr *gaptr); -#endif /* NGHTTP3_GAPTR_H */ +#endif /* !defined(NGHTTP3_GAPTR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c index 963134f13df946..38092cfb7c322c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c @@ -28,11 +28,15 @@ #include <string.h> #include <assert.h> +#ifdef __AVX2__ +# include <immintrin.h> +#endif /* __AVX2__ */ + #include "nghttp3_stream.h" #include "nghttp3_macro.h" #include "nghttp3_conv.h" #include "nghttp3_unreachable.h" -#include "sfparse.h" +#include "sfparse/sfparse.h" static uint8_t downcase(uint8_t c) { return 'A' <= c && c <= 'Z' ? (uint8_t)(c - 'A' + 'a') : c; @@ -175,26 +179,282 @@ int nghttp3_pri_parse_priority_versioned(int pri_version, nghttp3_pri *dest, return nghttp3_http_parse_priority(dest, value, valuelen); } +/* Generated by genauthroitychartbl.py */ +static char VALID_AUTHORITY_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, + 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +}; + +static int check_authority(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_AUTHORITY_CHARS[*value]) { + return 0; + } + } + return 1; +} + +static int check_scheme(const uint8_t *value, size_t len) { + const uint8_t *last; + if (len == 0) { + return 0; + } + + if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { + return 0; + } + + last = value + len; + ++value; + + for (; value != last; ++value) { + if (!(('A' <= *value && *value <= 'Z') || + ('a' <= *value && *value <= 'z') || + ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || + *value == '.')) { + return 0; + } + } + return 1; +} + +/* Generated by genmethodchartbl.py */ +static char VALID_METHOD_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, + 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, + 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, + 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +}; + +static int check_method(const uint8_t *value, size_t len) { + const uint8_t *last; + if (len == 0) { + return 0; + } + for (last = value + len; value != last; ++value) { + if (!VALID_METHOD_CHARS[*value]) { + return 0; + } + } + return 1; +} + +/* Generated by genpathchartbl.py */ +static char VALID_PATH_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ +}; + +static int check_path(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_PATH_CHARS[*value]) { + return 0; + } + } + return 1; +} + static int http_request_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int trailers, int connect_protocol) { nghttp3_pri pri; - if (nv->name->base[0] == ':') { - if (trailers || - (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - switch (nv->token) { case NGHTTP3_QPACK_TOKEN__AUTHORITY: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__AUTHORITY)) { + if (!check_authority(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__AUTHORITY)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } break; case NGHTTP3_QPACK_TOKEN__METHOD: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__METHOD)) { + if (!check_method(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__METHOD)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } switch (nv->value->len) { @@ -220,7 +480,8 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__PATH: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PATH)) { + if (!check_path(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PATH)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } if (nv->value->base[0] == '/') { @@ -230,7 +491,8 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__SCHEME: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__SCHEME)) { + if (!check_scheme(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__SCHEME)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } /* scheme is case-insensitive: @@ -241,15 +503,16 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__PROTOCOL: - if (!connect_protocol) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PROTOCOL)) { + if (!connect_protocol || + !nghttp3_check_header_value(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PROTOCOL)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } break; case NGHTTP3_QPACK_TOKEN_HOST: + if (!check_authority(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + } if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG_HOST)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } @@ -284,22 +547,35 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN_PRIORITY: - if (!trailers && !(http->flags & NGHTTP3_HTTP_FLAG_BAD_PRIORITY)) { - pri = http->pri; - if (nghttp3_http_parse_priority(&pri, nv->value->base, nv->value->len) == - 0) { - http->pri = pri; - http->flags |= NGHTTP3_HTTP_FLAG_PRIORITY; - } else { - http->flags &= ~NGHTTP3_HTTP_FLAG_PRIORITY; - http->flags |= NGHTTP3_HTTP_FLAG_BAD_PRIORITY; - } + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } + + if (trailers || (http->flags & NGHTTP3_HTTP_FLAG_BAD_PRIORITY)) { + break; + } + + pri = http->pri; + + if (nghttp3_http_parse_priority(&pri, nv->value->base, nv->value->len) == + 0) { + http->pri = pri; + http->flags |= NGHTTP3_HTTP_FLAG_PRIORITY; + break; + } + + http->flags &= ~NGHTTP3_HTTP_FLAG_PRIORITY; + http->flags |= NGHTTP3_HTTP_FLAG_BAD_PRIORITY; + break; default: if (nv->name->base[0] == ':') { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } + + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + } } return 0; @@ -307,19 +583,10 @@ static int http_request_on_header(nghttp3_http_state *http, static int http_response_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int trailers) { - if (nv->name->base[0] == ':') { - if (trailers || - (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - switch (nv->token) { case NGHTTP3_QPACK_TOKEN__STATUS: { - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - if (nv->value->len != 3) { + if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS) || + nv->value->len != 3) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } http->status_code = (int16_t)parse_uint(nv->value->base, nv->value->len); @@ -340,22 +607,18 @@ static int http_response_on_header(nghttp3_http_state *http, /* content-length header field in 204 response is prohibited by RFC 7230. But some widely used servers send content-length: 0. Until they get fixed, we ignore it. */ - if (http->content_length != -1) { - /* Found multiple content-length field */ - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - if (!lstrieq("0", nv->value->base, nv->value->len)) { + if (/* Found multiple content-length field */ + http->content_length != -1 || + !lstrieq("0", nv->value->base, nv->value->len)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } http->content_length = 0; return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - if (http->status_code / 100 == 1) { - return NGHTTP3_ERR_REMOVE_HTTP_HEADER; - } - /* https://tools.ietf.org/html/rfc7230#section-3.3.3 */ - if (http->status_code / 100 == 2 && - (http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT)) { + if (http->status_code / 100 == 1 || + /* https://tools.ietf.org/html/rfc7230#section-3.3.3 */ + (http->status_code / 100 == 2 && + (http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT))) { return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } if (http->content_length != -1) { @@ -383,349 +646,50 @@ static int http_response_on_header(nghttp3_http_state *http, if (nv->name->base[0] == ':') { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - } - - return 0; -} - -/* Generated by genauthroitychartbl.py */ -static char VALID_AUTHORITY_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, - 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ -}; - -static int check_authority(const uint8_t *value, size_t len) { - const uint8_t *last; - for (last = value + len; value != last; ++value) { - if (!VALID_AUTHORITY_CHARS[*value]) { - return 0; - } - } - return 1; -} - -static int check_scheme(const uint8_t *value, size_t len) { - const uint8_t *last; - if (len == 0) { - return 0; - } - - if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { - return 0; - } - last = value + len; - ++value; - - for (; value != last; ++value) { - if (!(('A' <= *value && *value <= 'Z') || - ('a' <= *value && *value <= 'z') || - ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || - *value == '.')) { - return 0; + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } } - return 1; -} -/* Generated by genmethodchartbl.py */ -static char VALID_METHOD_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ -}; - -static int check_method(const uint8_t *value, size_t len) { - const uint8_t *last; - if (len == 0) { - return 0; - } - for (last = value + len; value != last; ++value) { - if (!VALID_METHOD_CHARS[*value]) { - return 0; - } - } - return 1; + return 0; } -/* Generated by genpathchartbl.py */ -static char VALID_PATH_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ -}; - -static int check_path(const uint8_t *value, size_t len) { - const uint8_t *last; - for (last = value + len; value != last; ++value) { - if (!VALID_PATH_CHARS[*value]) { - return 0; - } - } - return 1; -} +static int http_check_nonempty_header_name(const uint8_t *name, size_t len); int nghttp3_http_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int request, int trailers, int connect_protocol) { - int rv; - size_t i; - uint8_t c; - - if (!nghttp3_check_header_name(nv->name->base, nv->name->len)) { - if (nv->name->len > 0 && nv->name->base[0] == ':') { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - /* header field name must be lower-cased without exception */ - for (i = 0; i < nv->name->len; ++i) { - c = nv->name->base[i]; - if ('A' <= c && c <= 'Z') { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - /* When ignoring regular header fields, we set this flag so that - we still enforce header field ordering rule for pseudo header - fields. */ + if (nv->name->len == 0) { http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - assert(nv->name->len > 0); - - switch (nv->token) { - case NGHTTP3_QPACK_TOKEN__METHOD: - rv = check_method(nv->value->base, nv->value->len); - break; - case NGHTTP3_QPACK_TOKEN__SCHEME: - rv = check_scheme(nv->value->base, nv->value->len); - break; - case NGHTTP3_QPACK_TOKEN__AUTHORITY: - case NGHTTP3_QPACK_TOKEN_HOST: - if (request) { - rv = check_authority(nv->value->base, nv->value->len); - } else { - /* The use of host field in response field section is - undefined. */ - rv = nghttp3_check_header_value(nv->value->base, nv->value->len); + if (nv->name->base[0] == ':') { + /* pseudo header must have a valid token. */ + if (nv->token == -1 || trailers || + (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { + return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - break; - case NGHTTP3_QPACK_TOKEN__PATH: - rv = check_path(nv->value->base, nv->value->len); - break; - default: - rv = nghttp3_check_header_value(nv->value->base, nv->value->len); - } + } else { + http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - if (rv == 0) { - if (nv->name->base[0] == ':') { + switch (http_check_nonempty_header_name(nv->name->base, nv->name->len)) { + case 0: + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + case -1: + /* header field name must be lower-cased without exception */ return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - /* When ignoring regular header fields, we set this flag so that - we still enforce header field ordering rule for pseudo header - fields. */ - http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - if (request) { - rv = http_request_on_header(http, nv, trailers, connect_protocol); - } else { - rv = http_response_on_header(http, nv, trailers); - } + assert(nv->name->len > 0); - if (nv->name->base[0] != ':') { - switch (rv) { - case 0: - case NGHTTP3_ERR_REMOVE_HTTP_HEADER: - http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - break; - } + if (request) { + return http_request_on_header(http, nv, trailers, connect_protocol); } - return rv; + return http_response_on_header(http, nv, trailers); } int nghttp3_http_on_request_headers(nghttp3_http_state *http) { @@ -738,7 +702,7 @@ int nghttp3_http_on_request_headers(nghttp3_http_state *http) { http->content_length = -1; } else { if ((http->flags & NGHTTP3_HTTP_FLAG_REQ_HEADERS) != - NGHTTP3_HTTP_FLAG_REQ_HEADERS || + NGHTTP3_HTTP_FLAG_REQ_HEADERS || (http->flags & (NGHTTP3_HTTP_FLAG__AUTHORITY | NGHTTP3_HTTP_FLAG_HOST)) == 0) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; @@ -829,70 +793,58 @@ void nghttp3_http_record_request_method(nghttp3_stream *stream, /* Generated by gennmchartbl.py */ static const int VALID_HD_NAME_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */, - 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */, - 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */, - 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, - 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, - 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */, - 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, 0 /* EOT */, + 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, 0 /* BS */, 0 /* HT */, + 0 /* LF */, 0 /* VT */, 0 /* FF */, 0 /* CR */, 0 /* SO */, + 0 /* SI */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, 0 /* CAN */, + 0 /* EM */, 0 /* SUB */, 0 /* ESC */, 0 /* FS */, 0 /* GS */, + 0 /* RS */, 0 /* US */, 0 /* SPC */, 1 /* ! */, 0 /* " */, + 1 /* # */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, 0 /* , */, + 1 /* - */, 1 /* . */, 0 /* / */, 1 /* 0 */, 1 /* 1 */, + 1 /* 2 */, 1 /* 3 */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, + 1 /* 7 */, 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, 0 /* @ */, + -1 /* A */, -1 /* B */, -1 /* C */, -1 /* D */, -1 /* E */, + -1 /* F */, -1 /* G */, -1 /* H */, -1 /* I */, -1 /* J */, + -1 /* K */, -1 /* L */, -1 /* M */, -1 /* N */, -1 /* O */, + -1 /* P */, -1 /* Q */, -1 /* R */, -1 /* S */, -1 /* T */, + -1 /* U */, -1 /* V */, -1 /* W */, -1 /* X */, -1 /* Y */, + -1 /* Z */, 0 /* [ */, 0 /* \ */, 0 /* ] */, 1 /* ^ */, + 1 /* _ */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, 1 /* h */, + 1 /* i */, 1 /* j */, 1 /* k */, 1 /* l */, 1 /* m */, + 1 /* n */, 1 /* o */, 1 /* p */, 1 /* q */, 1 /* r */, + 1 /* s */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, 1 /* | */, + 0 /* } */, 1 /* ~ */, 0 /* DEL */, 0 /* 0x80 */, 0 /* 0x81 */, + 0 /* 0x82 */, 0 /* 0x83 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, + 0 /* 0x87 */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, 0 /* 0x90 */, + 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, 0 /* 0x94 */, 0 /* 0x95 */, + 0 /* 0x96 */, 0 /* 0x97 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, + 0 /* 0x9b */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, 0 /* 0xa4 */, + 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, 0 /* 0xa8 */, 0 /* 0xa9 */, + 0 /* 0xaa */, 0 /* 0xab */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, + 0 /* 0xaf */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, 0 /* 0xb8 */, + 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, 0 /* 0xbc */, 0 /* 0xbd */, + 0 /* 0xbe */, 0 /* 0xbf */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, + 0 /* 0xc3 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, 0 /* 0xcc */, + 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, 0 /* 0xd0 */, 0 /* 0xd1 */, + 0 /* 0xd2 */, 0 /* 0xd3 */, 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, + 0 /* 0xd7 */, 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, 0 /* 0xe0 */, + 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, 0 /* 0xe4 */, 0 /* 0xe5 */, + 0 /* 0xe6 */, 0 /* 0xe7 */, 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, + 0 /* 0xeb */, 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, 0 /* 0xf4 */, + 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, 0 /* 0xf8 */, 0 /* 0xf9 */, + 0 /* 0xfa */, 0 /* 0xfb */, 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, + 0 /* 0xff */, }; int nghttp3_check_header_name(const uint8_t *name, size_t len) { @@ -915,76 +867,125 @@ int nghttp3_check_header_name(const uint8_t *name, size_t len) { return 1; } +/* http_check_nonempty_header_name validates regular header name + pointed by |name| of length |len|. |len| must be greater than + zero. This function returns 1 if it succeeds, or -1 if the name + contains a character in [A-Z], otherwise 0. */ +static int http_check_nonempty_header_name(const uint8_t *name, size_t len) { + const uint8_t *last; + int rv; + + for (last = name + len; name != last; ++name) { + rv = VALID_HD_NAME_CHARS[*name]; + if (rv != 1) { + return rv; + } + } + + return 1; +} + /* Generated by genvchartbl.py */ static const int VALID_HD_VALUE_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ }; +#ifdef __AVX2__ +static int contains_bad_header_value_char_avx2(const uint8_t *first, + const uint8_t *last) { + const __m256i ctll = _mm256_set1_epi8(0x00 - 1); + const __m256i ctlr = _mm256_set1_epi8(0x1f + 1); + const __m256i ht = _mm256_set1_epi8('\t'); + const __m256i del = _mm256_set1_epi8(0x7f); + __m256i s, x; + uint32_t m; + + for (; first != last; first += 32) { + s = _mm256_loadu_si256((void *)first); + + x = _mm256_andnot_si256( + _mm256_cmpeq_epi8(s, ht), + _mm256_and_si256(_mm256_cmpgt_epi8(s, ctll), _mm256_cmpgt_epi8(ctlr, s))); + x = _mm256_or_si256(_mm256_cmpeq_epi8(s, del), x); + + m = (uint32_t)_mm256_movemask_epi8(x); + if (m) { + return 1; + } + } + + return 0; +} +#endif /* __AVX2__ */ + int nghttp3_check_header_value(const uint8_t *value, size_t len) { const uint8_t *last; +#ifdef __AVX2__ + const uint8_t *last32; +#endif /* __AVX2__ */ switch (len) { case 0: @@ -997,7 +998,20 @@ int nghttp3_check_header_value(const uint8_t *value, size_t len) { } } - for (last = value + len; value != last; ++value) { + last = value + len; + +#ifdef __AVX2__ + if (len >= 32) { + last32 = value + (len & ~0x1fu); + if (contains_bad_header_value_char_avx2(value, last32)) { + return 0; + } + + value = last32; + } +#endif /* __AVX2__ */ + + for (; value != last; ++value) { if (!VALID_HD_VALUE_CHARS[*value]) { return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h index 575d9c267e1b68..f0bfc69fbade75 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -170,4 +170,4 @@ int nghttp3_http_parse_priority(nghttp3_pri *dest, const uint8_t *value, int nghttp3_pri_eq(const nghttp3_pri *a, const nghttp3_pri *b); -#endif /* NGHTTP3_HTTP_H */ +#endif /* !defined(NGHTTP3_HTTP_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c index dc34841fe0f8ef..ffed3064d2b791 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c @@ -27,10 +27,8 @@ #include <assert.h> -void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem) { +void nghttp3_idtr_init(nghttp3_idtr *idtr, const nghttp3_mem *mem) { nghttp3_gaptr_init(&idtr->gap, mem); - - idtr->server = server; } void nghttp3_idtr_free(nghttp3_idtr *idtr) { @@ -42,8 +40,7 @@ void nghttp3_idtr_free(nghttp3_idtr *idtr) { } /* - * id_from_stream_id translates |stream_id| to id space used by - * nghttp3_idtr. + * id_from_stream_id translates |stream_id| to an internal ID. */ static uint64_t id_from_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2); @@ -52,9 +49,6 @@ static uint64_t id_from_stream_id(int64_t stream_id) { int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); if (nghttp3_gaptr_is_pushed(&idtr->gap, q, 1)) { @@ -67,14 +61,7 @@ int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id) { int nghttp3_idtr_is_open(nghttp3_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); return nghttp3_gaptr_is_pushed(&idtr->gap, q, 1); } - -uint64_t nghttp3_idtr_first_gap(nghttp3_idtr *idtr) { - return nghttp3_gaptr_first_gap_offset(&idtr->gap); -} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h index ea3346c9a964c4..8ba15fc810cdcb 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -39,21 +39,17 @@ * nghttp3_idtr tracks the usage of stream ID. */ typedef struct nghttp3_idtr { - /* gap maintains the range of ID which is not used yet. Initially, - its range is [0, UINT64_MAX). */ + /* gap maintains the range of an internal ID which is not used yet. + Initially, its range is [0, UINT64_MAX). The internal ID and + stream ID are in the different number spaces. See + id_from_stream_id to convert a stream ID to an internal ID. */ nghttp3_gaptr gap; - /* server is nonzero if this object records server initiated stream - ID. */ - int server; } nghttp3_idtr; /* * nghttp3_idtr_init initializes |idtr|. - * - * If this object records server initiated ID (even number), set - * |server| to nonzero. */ -void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem); +void nghttp3_idtr_init(nghttp3_idtr *idtr, const nghttp3_mem *mem); /* * nghttp3_idtr_free frees resources allocated for |idtr|. @@ -61,30 +57,21 @@ void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem); void nghttp3_idtr_free(nghttp3_idtr *idtr); /* - * nghttp3_idtr_open claims that |stream_id| is in used. + * nghttp3_idtr_open claims that |stream_id| is in use. * * It returns 0 if it succeeds, or one of the following negative error * codes: * * NGHTTP3_ERR_STREAM_IN_USE - * ID has already been used. + * |stream_id| has already been used. * NGHTTP3_ERR_NOMEM * Out of memory. */ int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id); /* - * nghttp3_idtr_open tells whether ID |stream_id| is in used or not. - * - * It returns nonzero if |stream_id| is used. + * nghttp3_idtr_open returns nonzero if |stream_id| is in use. */ int nghttp3_idtr_is_open(nghttp3_idtr *idtr, int64_t stream_id); -/* - * nghttp3_idtr_first_gap returns the first id of first gap. If there - * is no gap, it returns UINT64_MAX. The returned id is an id space - * used in this object internally, and not stream ID. - */ -uint64_t nghttp3_idtr_first_gap(nghttp3_idtr *idtr); - -#endif /* NGHTTP3_IDTR_H */ +#endif /* !defined(NGHTTP3_IDTR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c index d7420a5d8a1e5d..a3b5fbcb05f4f3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c @@ -39,8 +39,10 @@ static nghttp3_ksl_blk null_blk = {{{NULL, NULL, 0, 0, {0}}}}; nghttp3_objalloc_def(ksl_blk, nghttp3_ksl_blk, oplent); static size_t ksl_nodelen(size_t keylen) { - return (sizeof(nghttp3_ksl_node) + keylen - sizeof(uint64_t) + 0xfu) & - ~(uintptr_t)0xfu; + assert(keylen >= sizeof(uint64_t)); + + return (sizeof(nghttp3_ksl_node) + keylen - sizeof(uint64_t) + 0x7u) & + ~(uintptr_t)0x7u; } static size_t ksl_blklen(size_t nodelen) { @@ -61,15 +63,14 @@ void nghttp3_ksl_init(nghttp3_ksl *ksl, nghttp3_ksl_compar compar, size_t nodelen = ksl_nodelen(keylen); nghttp3_objalloc_init(&ksl->blkalloc, - ((ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu) * 8, - mem); + (ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu, mem); ksl->head = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; + ksl->n = 0; ksl->keylen = keylen; ksl->nodelen = nodelen; - ksl->n = 0; } static nghttp3_ksl_blk *ksl_blk_objalloc_new(nghttp3_ksl *ksl) { @@ -83,6 +84,7 @@ static void ksl_blk_objalloc_del(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { static int ksl_head_init(nghttp3_ksl *ksl) { nghttp3_ksl_blk *head = ksl_blk_objalloc_new(ksl); + if (!head) { return NGHTTP3_ERR_NOMEM; } @@ -112,7 +114,7 @@ static void ksl_free_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { ksl_blk_objalloc_del(ksl, blk); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ void nghttp3_ksl_free(nghttp3_ksl *ksl) { if (!ksl || !ksl->head) { @@ -121,7 +123,7 @@ void nghttp3_ksl_free(nghttp3_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ nghttp3_objalloc_free(&ksl->blkalloc); } @@ -144,21 +146,22 @@ static nghttp3_ksl_blk *ksl_split_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { rblk->next = blk->next; blk->next = rblk; + if (rblk->next) { rblk->next->prev = rblk; } else if (ksl->back == blk) { ksl->back = rblk; } + rblk->prev = blk; rblk->leaf = blk->leaf; rblk->n = blk->n / 2; + blk->n -= rblk->n; - memcpy(rblk->nodes, blk->nodes + ksl->nodelen * (blk->n - rblk->n), + memcpy(rblk->nodes, blk->nodes + ksl->nodelen * blk->n, ksl->nodelen * rblk->n); - blk->n -= rblk->n; - assert(blk->n >= NGHTTP3_KSL_MIN_NBLK); assert(rblk->n >= NGHTTP3_KSL_MIN_NBLK); @@ -174,7 +177,7 @@ static nghttp3_ksl_blk *ksl_split_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { * codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *node; @@ -210,7 +213,7 @@ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_head(nghttp3_ksl *ksl) { nghttp3_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; @@ -224,10 +227,12 @@ static int ksl_split_head(nghttp3_ksl *ksl) { lblk = ksl->head; nhead = ksl_blk_objalloc_new(ksl); + if (nhead == NULL) { ksl_blk_objalloc_del(ksl, rblk); return NGHTTP3_ERR_NOMEM; } + nhead->next = nhead->prev = NULL; nhead->n = 2; nhead->leaf = 0; @@ -248,9 +253,9 @@ static int ksl_split_head(nghttp3_ksl *ksl) { } /* - * insert_node inserts a node whose key is |key| with the associated - * |data| at the index of |i|. This function assumes that the number - * of nodes contained by |blk| is strictly less than + * ksl_insert_node inserts a node whose key is |key| with the + * associated |data| at the index of |i|. This function assumes that + * the number of nodes contained by |blk| is strictly less than * NGHTTP3_KSL_MAX_NBLK. */ static void ksl_insert_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i, @@ -269,9 +274,9 @@ static void ksl_insert_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i, ++blk->n; } -static size_t ksl_bsearch(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, - const nghttp3_ksl_key *key, - nghttp3_ksl_compar compar) { +static size_t ksl_search(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, + const nghttp3_ksl_key *key, + nghttp3_ksl_compar compar) { size_t i; nghttp3_ksl_node *node; @@ -297,18 +302,17 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, } } - blk = ksl->head; - - if (blk->n == NGHTTP3_KSL_MAX_NBLK) { + if (ksl->head->n == NGHTTP3_KSL_MAX_NBLK) { rv = ksl_split_head(ksl); if (rv != 0) { return rv; } - blk = ksl->head; } + blk = ksl->head; + for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl_search(ksl, blk, key, ksl->compar); if (blk->leaf) { if (i < blk->n && @@ -316,13 +320,17 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } + ksl_insert_node(ksl, blk, i, key, data); ++ksl->n; + if (it) { nghttp3_ksl_it_init(it, ksl, blk, i); } + return 0; } @@ -335,16 +343,21 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (rv != 0) { return rv; } + node = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1); } + ksl_node_set_key(ksl, node, key); blk = node->blk; } + ksl_insert_node(ksl, blk, blk->n, key, data); ++ksl->n; + if (it) { nghttp3_ksl_it_init(it, ksl, blk, blk->n - 1); } + return 0; } @@ -355,8 +368,10 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (rv != 0) { return rv; } + if (ksl->compar((nghttp3_ksl_key *)node->key, key)) { node = nghttp3_ksl_nth_node(ksl, blk, i + 1); + if (ksl->compar((nghttp3_ksl_key *)node->key, key)) { ksl_node_set_key(ksl, node, key); } @@ -382,19 +397,22 @@ static void ksl_remove_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the direct descendant of head (root) block and the head - * block contains just 2 nodes, the merged block becomes head block, - * which decreases the height of |ksl| by 1. + * If |blk| is the head (root) block and it contains just 2 nodes + * before merging nodes, the merged block becomes head block, which + * decreases the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { + nghttp3_ksl_node *lnode; nghttp3_ksl_blk *lblk, *rblk; assert(i + 1 < blk->n); - lblk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; + lnode = nghttp3_ksl_nth_node(ksl, blk, i); + + lblk = lnode->blk; rblk = nghttp3_ksl_nth_node(ksl, blk, i + 1)->blk; assert(lblk->n + rblk->n < NGHTTP3_KSL_MAX_NBLK); @@ -404,6 +422,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, lblk->n += rblk->n; lblk->next = rblk->next; + if (lblk->next) { lblk->next->prev = lblk; } else if (ksl->back == rblk) { @@ -417,7 +436,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, ksl->head = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_node_set_key(ksl, nghttp3_ksl_nth_node(ksl, blk, i), + ksl_node_set_key(ksl, lnode, nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } @@ -431,6 +450,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, */ static void ksl_shift_left(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *lnode, *rnode; + nghttp3_ksl_blk *lblk, *rblk; size_t n; assert(i > 0); @@ -438,36 +458,37 @@ static void ksl_shift_left(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { lnode = nghttp3_ksl_nth_node(ksl, blk, i - 1); rnode = nghttp3_ksl_nth_node(ksl, blk, i); - assert(lnode->blk->n < NGHTTP3_KSL_MAX_NBLK); - assert(rnode->blk->n > NGHTTP3_KSL_MIN_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; + + assert(lblk->n < NGHTTP3_KSL_MAX_NBLK); + assert(rblk->n > NGHTTP3_KSL_MIN_NBLK); - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - lnode->blk->n; + n = (lblk->n + rblk->n + 1) / 2 - lblk->n; assert(n > 0); - assert(lnode->blk->n <= NGHTTP3_KSL_MAX_NBLK - n); - assert(rnode->blk->n >= NGHTTP3_KSL_MIN_NBLK + n); + assert(lblk->n <= NGHTTP3_KSL_MAX_NBLK - n); + assert(rblk->n >= NGHTTP3_KSL_MIN_NBLK + n); - memcpy(lnode->blk->nodes + ksl->nodelen * lnode->blk->n, rnode->blk->nodes, - ksl->nodelen * n); + memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, ksl->nodelen * n); - lnode->blk->n += (uint32_t)n; - rnode->blk->n -= (uint32_t)n; + lblk->n += (uint32_t)n; + rblk->n -= (uint32_t)n; - ksl_node_set_key( - ksl, lnode, - nghttp3_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); - memmove(rnode->blk->nodes, rnode->blk->nodes + ksl->nodelen * n, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes, rblk->nodes + ksl->nodelen * n, ksl->nodelen * rblk->n); } /* * ksl_shift_right moves the last nodes in blk->nodes[i]->blk->nodes * to blk->nodes[i + 1]->blk->nodes in a manner that they have the - * same amount of nodes as much as possible.. + * same amount of nodes as much as possible. */ static void ksl_shift_right(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *lnode, *rnode; + nghttp3_ksl_blk *lblk, *rblk; size_t n; assert(i < blk->n - 1); @@ -475,27 +496,27 @@ static void ksl_shift_right(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { lnode = nghttp3_ksl_nth_node(ksl, blk, i); rnode = nghttp3_ksl_nth_node(ksl, blk, i + 1); - assert(lnode->blk->n > NGHTTP3_KSL_MIN_NBLK); - assert(rnode->blk->n < NGHTTP3_KSL_MAX_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - rnode->blk->n; + assert(lblk->n > NGHTTP3_KSL_MIN_NBLK); + assert(rblk->n < NGHTTP3_KSL_MAX_NBLK); + + n = (lblk->n + rblk->n + 1) / 2 - rblk->n; assert(n > 0); - assert(lnode->blk->n >= NGHTTP3_KSL_MIN_NBLK + n); - assert(rnode->blk->n <= NGHTTP3_KSL_MAX_NBLK - n); + assert(lblk->n >= NGHTTP3_KSL_MIN_NBLK + n); + assert(rblk->n <= NGHTTP3_KSL_MAX_NBLK - n); - memmove(rnode->blk->nodes + ksl->nodelen * n, rnode->blk->nodes, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes + ksl->nodelen * n, rblk->nodes, ksl->nodelen * rblk->n); - rnode->blk->n += (uint32_t)n; - lnode->blk->n -= (uint32_t)n; + rblk->n += (uint32_t)n; + lblk->n -= (uint32_t)n; - memcpy(rnode->blk->nodes, lnode->blk->nodes + ksl->nodelen * lnode->blk->n, - ksl->nodelen * n); + memcpy(rblk->nodes, lblk->nodes + ksl->nodelen * lblk->n, ksl->nodelen * n); - ksl_node_set_key( - ksl, lnode, - nghttp3_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } /* @@ -539,23 +560,24 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_node *node; size_t i; - if (!ksl->head) { + if (!blk) { return NGHTTP3_ERR_INVALID_ARGUMENT; } if (!blk->leaf && blk->n == 2 && nghttp3_ksl_nth_node(ksl, blk, 0)->blk->n == NGHTTP3_KSL_MIN_NBLK && nghttp3_ksl_nth_node(ksl, blk, 1)->blk->n == NGHTTP3_KSL_MIN_NBLK) { - blk = ksl_merge_node(ksl, ksl->head, 0); + blk = ksl_merge_node(ksl, blk, 0); } for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl_search(ksl, blk, key, ksl->compar); if (i == blk->n) { if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } @@ -564,10 +586,13 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } + ksl_remove_node(ksl, blk, i); --ksl->n; + if (it) { if (blk->n == i && blk->next) { nghttp3_ksl_it_init(it, ksl, blk->next, 0); @@ -575,6 +600,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_it_init(it, ksl, blk, i); } } + return 0; } @@ -591,6 +617,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGHTTP3_KSL_MIN_NBLK) { ksl_shift_left(ksl, blk, i + 1); blk = node->blk; + continue; } @@ -598,6 +625,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGHTTP3_KSL_MIN_NBLK) { ksl_shift_right(ksl, blk, i - 1); blk = node->blk; + continue; } @@ -612,48 +640,12 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, } } -nghttp3_ksl_it nghttp3_ksl_lower_bound(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key) { - nghttp3_ksl_blk *blk = ksl->head; - nghttp3_ksl_it it; - size_t i; - - if (!blk) { - nghttp3_ksl_it_init(&it, ksl, &null_blk, 0); - return it; - } - - for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); - - if (blk->leaf) { - if (i == blk->n && blk->next) { - blk = blk->next; - i = 0; - } - nghttp3_ksl_it_init(&it, ksl, blk, i); - return it; - } - - if (i == blk->n) { - /* This happens if descendant has smaller key. Fast forward to - find last node in this subtree. */ - for (; !blk->leaf; blk = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1)->blk) - ; - if (blk->next) { - blk = blk->next; - i = 0; - } else { - i = blk->n; - } - nghttp3_ksl_it_init(&it, ksl, blk, i); - return it; - } - blk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; - } + return nghttp3_ksl_lower_bound_compar(ksl, key, ksl->compar); } -nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key, nghttp3_ksl_compar compar) { nghttp3_ksl_blk *blk = ksl->head; @@ -666,14 +658,16 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, } for (;;) { - i = ksl_bsearch(ksl, blk, key, compar); + i = ksl_search(ksl, blk, key, compar); if (blk->leaf) { if (i == blk->n && blk->next) { blk = blk->next; i = 0; } + nghttp3_ksl_it_init(&it, ksl, blk, i); + return it; } @@ -682,15 +676,19 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, find last node in this subtree. */ for (; !blk->leaf; blk = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1)->blk) ; + if (blk->next) { blk = blk->next; i = 0; } else { i = blk->n; } + nghttp3_ksl_it_init(&it, ksl, blk, i); + return it; } + blk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; } } @@ -704,7 +702,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, assert(ksl->head); for (;;) { - i = ksl_bsearch(ksl, blk, old_key, ksl->compar); + i = ksl_search(ksl, blk, old_key, ksl->compar); assert(i < blk->n); node = nghttp3_ksl_nth_node(ksl, blk, i); @@ -712,6 +710,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, if (blk->leaf) { assert(key_equal(ksl->compar, (nghttp3_ksl_key *)node->key, old_key)); ksl_node_set_key(ksl, node, new_key); + return; } @@ -724,7 +723,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, } } -size_t nghttp3_ksl_len(nghttp3_ksl *ksl) { return ksl->n; } +size_t nghttp3_ksl_len(const nghttp3_ksl *ksl) { return ksl->n; } void nghttp3_ksl_clear(nghttp3_ksl *ksl) { if (!ksl->head) { @@ -733,7 +732,7 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ksl->front = ksl->back = ksl->head = NULL; ksl->n = 0; @@ -742,7 +741,8 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl) { } #ifndef WIN32 -static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { +static void ksl_print(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, + size_t level) { size_t i; nghttp3_ksl_node *node; @@ -753,7 +753,9 @@ static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { node = nghttp3_ksl_nth_node(ksl, blk, i); fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key); } + fprintf(stderr, "\n"); + return; } @@ -762,14 +764,14 @@ static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { } } -void nghttp3_ksl_print(nghttp3_ksl *ksl) { +void nghttp3_ksl_print(const nghttp3_ksl *ksl) { if (!ksl->head) { return; } ksl_print(ksl, ksl->head, 0); } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl) { nghttp3_ksl_it it; @@ -826,6 +828,6 @@ int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, const nghttp3_ksl_key *rhs) { const nghttp3_range *a = lhs, *b = rhs; - return a->begin < b->begin && - !(nghttp3_max(a->begin, b->begin) < nghttp3_min(a->end, b->end)); + return a->begin < b->begin && !(nghttp3_max_uint64(a->begin, b->begin) < + nghttp3_min_uint64(a->end, b->end)); } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h index d513bdd672c750..e15e227ce50fb0 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <stdlib.h> @@ -36,16 +36,12 @@ #include "nghttp3_objalloc.h" -/* - * Skip List using single key instead of range. - */ - #define NGHTTP3_KSL_DEGR 16 /* NGHTTP3_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ #define NGHTTP3_KSL_MAX_NBLK (2 * NGHTTP3_KSL_DEGR - 1) /* NGHTTP3_KSL_MIN_NBLK is the minimum number of nodes which a single - block other than root must contains. */ + block other than root must contain. */ #define NGHTTP3_KSL_MIN_NBLK (NGHTTP3_KSL_DEGR - 1) /* @@ -122,7 +118,7 @@ typedef struct nghttp3_ksl nghttp3_ksl; typedef struct nghttp3_ksl_it nghttp3_ksl_it; /* - * nghttp3_ksl_it is a forward iterator to iterate nodes. + * nghttp3_ksl_it is a bidirectional iterator to iterate nodes. */ struct nghttp3_ksl_it { const nghttp3_ksl *ksl; @@ -142,6 +138,7 @@ struct nghttp3_ksl { /* back points to the last leaf block. */ nghttp3_ksl_blk *back; nghttp3_ksl_compar compar; + /* n is the number of elements stored. */ size_t n; /* keylen is the size of key */ size_t keylen; @@ -152,7 +149,8 @@ struct nghttp3_ksl { /* * nghttp3_ksl_init initializes |ksl|. |compar| specifies compare - * function. |keylen| is the length of key. + * function. |keylen| is the length of key and must be at least + * sizeof(uint64_t). */ void nghttp3_ksl_init(nghttp3_ksl *ksl, nghttp3_ksl_compar compar, size_t keylen, const nghttp3_mem *mem); @@ -167,15 +165,15 @@ void nghttp3_ksl_free(nghttp3_ksl *ksl); /* * nghttp3_ksl_insert inserts |key| with its associated |data|. On * successful insertion, the iterator points to the inserted node is - * stored in |*it|. + * stored in |*it| if |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. * NGHTTP3_ERR_INVALID_ARGUMENT - * |key| already exists. + * |key| already exists. */ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key, void *data); @@ -186,13 +184,14 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, * This function assigns the iterator to |*it|, which points to the * node which is located at the right next of the removed node if |it| * is not NULL. If |key| is not found, no deletion takes place and - * the return value of nghttp3_ksl_end(ksl) is assigned to |*it|. + * the return value of nghttp3_ksl_end(ksl) is assigned to |*it| if + * |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_INVALID_ARGUMENT - * |key| does not exist. + * |key| does not exist. */ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key); @@ -212,24 +211,24 @@ int nghttp3_ksl_remove_hint(nghttp3_ksl *ksl, nghttp3_ksl_it *it, * nghttp3_ksl_lower_bound returns the iterator which points to the * first node which has the key which is equal to |key| or the last * node which satisfies !compar(&node->key, key). If there is no such - * node, it returns the iterator which satisfies nghttp3_ksl_it_end(it) - * != 0. + * node, it returns the iterator which satisfies + * nghttp3_ksl_it_end(it) != 0. */ -nghttp3_ksl_it nghttp3_ksl_lower_bound(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key); /* * nghttp3_ksl_lower_bound_compar works like nghttp3_ksl_lower_bound, * but it takes custom function |compar| to do lower bound search. */ -nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key, nghttp3_ksl_compar compar); /* - * nghttp3_ksl_update_key replaces the key of nodes which has |old_key| - * with |new_key|. |new_key| must be strictly greater than the - * previous node and strictly smaller than the next node. + * nghttp3_ksl_update_key replaces the key of nodes which has + * |old_key| with |new_key|. |new_key| must be strictly greater than + * the previous node and strictly smaller than the next node. */ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, const nghttp3_ksl_key *new_key); @@ -237,7 +236,8 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, /* * nghttp3_ksl_begin returns the iterator which points to the first * node. If there is no node in |ksl|, it returns the iterator which - * satisfies nghttp3_ksl_it_end(it) != 0. + * satisfies both nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0. */ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl); @@ -245,14 +245,15 @@ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl); * nghttp3_ksl_end returns the iterator which points to the node * following the last node. The returned object satisfies * nghttp3_ksl_it_end(). If there is no node in |ksl|, it returns the - * iterator which satisfies nghttp3_ksl_it_begin(it) != 0. + * iterator which satisfies nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0. */ nghttp3_ksl_it nghttp3_ksl_end(const nghttp3_ksl *ksl); /* * nghttp3_ksl_len returns the number of elements stored in |ksl|. */ -size_t nghttp3_ksl_len(nghttp3_ksl *ksl); +size_t nghttp3_ksl_len(const nghttp3_ksl *ksl); /* * nghttp3_ksl_clear removes all elements stored in |ksl|. @@ -271,8 +272,8 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl); * that the key is of type int64_t. This function should be used for * the debugging purpose only. */ -void nghttp3_ksl_print(nghttp3_ksl *ksl); -#endif /* !WIN32 */ +void nghttp3_ksl_print(const nghttp3_ksl *ksl); +#endif /* !defined(WIN32) */ /* * nghttp3_ksl_it_init initializes |it|. @@ -295,8 +296,8 @@ void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, */ #define nghttp3_ksl_it_next(IT) \ (++(IT)->i == (IT)->blk->n && (IT)->blk->next \ - ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ - : 0) + ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ + : 0) /* * nghttp3_ksl_it_prev moves backward the iterator by one. It is @@ -306,16 +307,16 @@ void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, void nghttp3_ksl_it_prev(nghttp3_ksl_it *it); /* - * nghttp3_ksl_it_end returns nonzero if |it| points to the beyond the - * last node. + * nghttp3_ksl_it_end returns nonzero if |it| points to the one beyond + * the last node. */ #define nghttp3_ksl_it_end(IT) \ ((IT)->blk->n == (IT)->i && (IT)->blk->next == NULL) /* * nghttp3_ksl_it_begin returns nonzero if |it| points to the first - * node. |it| might satisfy both nghttp3_ksl_it_begin(&it) and - * nghttp3_ksl_it_end(&it) if the skip list has no node. + * node. |it| might satisfy both nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0 if the skip list has no node. */ int nghttp3_ksl_it_begin(const nghttp3_ksl_it *it); @@ -347,4 +348,4 @@ int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, const nghttp3_ksl_key *rhs); -#endif /* NGHTTP3_KSL_H */ +#endif /* !defined(NGHTTP3_KSL_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h index a44e907661abbf..a4e1dfea3cda00 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h @@ -28,17 +28,14 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <stddef.h> #include <nghttp3/nghttp3.h> -#define nghttp3_min(A, B) ((A) < (B) ? (A) : (B)) -#define nghttp3_max(A, B) ((A) > (B) ? (A) : (B)) - #define nghttp3_struct_of(ptr, type, member) \ - ((type *)(void *)((char *)(ptr)-offsetof(type, member))) + ((type *)(void *)((char *)(ptr) - offsetof(type, member))) #define nghttp3_arraylen(A) (sizeof(A) / sizeof(*(A))) @@ -48,4 +45,30 @@ variable-length integer encoding. */ #define NGHTTP3_MAX_VARINT ((1ULL << 62) - 1) -#endif /* NGHTTP3_MACRO_H */ +#define nghttp3_max_def(SUFFIX, T) \ + static inline T nghttp3_max_##SUFFIX(T a, T b) { return a < b ? b : a; } + +nghttp3_max_def(int8, int8_t); +nghttp3_max_def(int16, int16_t); +nghttp3_max_def(int32, int32_t); +nghttp3_max_def(int64, int64_t); +nghttp3_max_def(uint8, uint8_t); +nghttp3_max_def(uint16, uint16_t); +nghttp3_max_def(uint32, uint32_t); +nghttp3_max_def(uint64, uint64_t); +nghttp3_max_def(size, size_t); + +#define nghttp3_min_def(SUFFIX, T) \ + static inline T nghttp3_min_##SUFFIX(T a, T b) { return a < b ? a : b; } + +nghttp3_min_def(int8, int8_t); +nghttp3_min_def(int16, int16_t); +nghttp3_min_def(int32, int32_t); +nghttp3_min_def(int64, int64_t); +nghttp3_min_def(uint8, uint8_t); +nghttp3_min_def(uint16, uint16_t); +nghttp3_min_def(uint32, uint32_t); +nghttp3_min_def(uint64, uint64_t); +nghttp3_min_def(size, size_t); + +#endif /* !defined(NGHTTP3_MACRO_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c index b93fdfd3d488f5..cc5e42a2caf63f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c @@ -36,8 +36,7 @@ void nghttp3_map_init(nghttp3_map *map, const nghttp3_mem *mem) { map->mem = mem; - map->tablelen = 0; - map->tablelenbits = 0; + map->hashbits = 0; map->table = NULL; map->size = 0; } @@ -50,33 +49,20 @@ void nghttp3_map_free(nghttp3_map *map) { nghttp3_mem_free(map->mem, map->table); } -void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), - void *ptr) { - uint32_t i; - nghttp3_map_bucket *bkt; - - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { - continue; - } - - func(bkt->data, ptr); - } -} - -int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), +int nghttp3_map_each(const nghttp3_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; - uint32_t i; + size_t i; nghttp3_map_bucket *bkt; + size_t tablelen; if (map->size == 0) { return 0; } - for (i = 0; i < map->tablelen; ++i) { + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { @@ -92,82 +78,61 @@ int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), return 0; } -static uint32_t hash(nghttp3_map_key_type key) { - return (uint32_t)((key * 11400714819323198485llu) >> 32); -} - -static size_t h2idx(uint32_t hash, uint32_t bits) { - return hash >> (32 - bits); -} - -static size_t distance(uint32_t tablelen, uint32_t tablelenbits, - nghttp3_map_bucket *bkt, size_t idx) { - return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1); +static size_t hash(nghttp3_map_key_type key, size_t bits) { + return (size_t)((key * 11400714819323198485llu) >> (64 - bits)); } -static void map_bucket_swap(nghttp3_map_bucket *bkt, uint32_t *phash, - nghttp3_map_key_type *pkey, void **pdata) { - uint32_t h = bkt->hash; - nghttp3_map_key_type key = bkt->key; - void *data = bkt->data; - - bkt->hash = *phash; - bkt->key = *pkey; - bkt->data = *pdata; +static void map_bucket_swap(nghttp3_map_bucket *a, nghttp3_map_bucket *b) { + nghttp3_map_bucket c = *a; - *phash = h; - *pkey = key; - *pdata = data; -} - -static void map_bucket_set_data(nghttp3_map_bucket *bkt, uint32_t hash, - nghttp3_map_key_type key, void *data) { - bkt->hash = hash; - bkt->key = key; - bkt->data = data; + *a = *b; + *b = c; } #ifndef WIN32 -void nghttp3_map_print_distance(nghttp3_map *map) { - uint32_t i; +void nghttp3_map_print_distance(const nghttp3_map *map) { + size_t i; size_t idx; nghttp3_map_bucket *bkt; + size_t tablelen; - for (i = 0; i < map->tablelen; ++i) { + if (map->size == 0) { + return; + } + + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { - fprintf(stderr, "@%u <EMPTY>\n", i); + fprintf(stderr, "@%zu <EMPTY>\n", i); continue; } - idx = h2idx(bkt->hash, map->tablelenbits); - fprintf(stderr, "@%u hash=%08x key=%" PRIu64 " base=%zu distance=%zu\n", i, - bkt->hash, bkt->key, idx, - distance(map->tablelen, map->tablelenbits, bkt, idx)); + idx = hash(bkt->key, map->hashbits); + fprintf(stderr, "@%zu hash=%zu key=%" PRIu64 " base=%zu distance=%u\n", i, + hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); } } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -static int insert(nghttp3_map_bucket *table, uint32_t tablelen, - uint32_t tablelenbits, uint32_t hash, +static int insert(nghttp3_map_bucket *table, size_t hashbits, nghttp3_map_key_type key, void *data) { - size_t idx = h2idx(hash, tablelenbits); - size_t d = 0, dd; - nghttp3_map_bucket *bkt; + size_t idx = hash(key, hashbits); + nghttp3_map_bucket b = {0, key, data}, *bkt; + size_t mask = (1u << hashbits) - 1; for (;;) { bkt = &table[idx]; if (bkt->data == NULL) { - map_bucket_set_data(bkt, hash, key, data); + *bkt = b; return 0; } - dd = distance(tablelen, tablelenbits, bkt, idx); - if (d > dd) { - map_bucket_swap(bkt, &hash, &key, &data); - d = dd; + if (b.psl > bkt->psl) { + map_bucket_swap(bkt, &b); } else if (bkt->key == key) { /* TODO This check is just a waste after first swap or if this function is called from map_resize. That said, there is no @@ -176,41 +141,42 @@ static int insert(nghttp3_map_bucket *table, uint32_t tablelen, return NGHTTP3_ERR_INVALID_ARGUMENT; } - ++d; - idx = (idx + 1) & (tablelen - 1); + ++b.psl; + idx = (idx + 1) & mask; } } -/* new_tablelen must be power of 2 and new_tablelen == (1 << - new_tablelenbits) must hold. */ -static int map_resize(nghttp3_map *map, uint32_t new_tablelen, - uint32_t new_tablelenbits) { - uint32_t i; +static int map_resize(nghttp3_map *map, size_t new_hashbits) { + size_t i; nghttp3_map_bucket *new_table; nghttp3_map_bucket *bkt; + size_t tablelen; int rv; (void)rv; - new_table = - nghttp3_mem_calloc(map->mem, new_tablelen, sizeof(nghttp3_map_bucket)); + new_table = nghttp3_mem_calloc(map->mem, 1u << new_hashbits, + sizeof(nghttp3_map_bucket)); if (new_table == NULL) { return NGHTTP3_ERR_NOMEM; } - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { - continue; - } - rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key, - bkt->data); + if (map->size) { + tablelen = 1u << map->hashbits; - assert(0 == rv); + for (i = 0; i < tablelen; ++i) { + bkt = &map->table[i]; + if (bkt->data == NULL) { + continue; + } + + rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + + assert(0 == rv); + } } nghttp3_mem_free(map->mem, map->table); - map->tablelen = new_tablelen; - map->tablelenbits = new_tablelenbits; + map->hashbits = new_hashbits; map->table = new_table; return 0; @@ -222,48 +188,49 @@ int nghttp3_map_insert(nghttp3_map *map, nghttp3_map_key_type key, void *data) { assert(data); /* Load factor is 0.75 */ - if ((map->size + 1) * 4 > map->tablelen * 3) { - if (map->tablelen) { - rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1); + /* Under the very initial condition, that is map->size == 0 and + map->hashbits == 0, 4 > 3 still holds nicely. */ + if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + if (map->hashbits) { + rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, 1 << NGHTTP3_INITIAL_TABLE_LENBITS, - NGHTTP3_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGHTTP3_INITIAL_TABLE_LENBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key, - data); + rv = insert(map->table, map->hashbits, key, data); if (rv != 0) { return rv; } + ++map->size; + return 0; } -void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key) { - uint32_t h; +void *nghttp3_map_find(const nghttp3_map *map, nghttp3_map_key_type key) { size_t idx; nghttp3_map_bucket *bkt; - size_t d = 0; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NULL; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NULL; } @@ -271,50 +238,47 @@ void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key) { return bkt->data; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key) { - uint32_t h; - size_t idx, didx; - nghttp3_map_bucket *bkt; - size_t d = 0; + size_t idx; + nghttp3_map_bucket *b, *bkt; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NGHTTP3_ERR_INVALID_ARGUMENT; } if (bkt->key == key) { - map_bucket_set_data(bkt, 0, 0, NULL); - - didx = idx; - idx = (idx + 1) & (map->tablelen - 1); + b = bkt; + idx = (idx + 1) & mask; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) { + if (bkt->data == NULL || bkt->psl == 0) { + b->data = NULL; break; } - map->table[didx] = *bkt; - map_bucket_set_data(bkt, 0, 0, NULL); - didx = idx; + --bkt->psl; + *b = *bkt; + b = bkt; - idx = (idx + 1) & (map->tablelen - 1); + idx = (idx + 1) & mask; } --map->size; @@ -322,18 +286,18 @@ int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key) { return 0; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } void nghttp3_map_clear(nghttp3_map *map) { - if (map->tablelen == 0) { + if (map->size == 0) { return; } - memset(map->table, 0, sizeof(*map->table) * map->tablelen); + memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); map->size = 0; } -size_t nghttp3_map_size(nghttp3_map *map) { return map->size; } +size_t nghttp3_map_size(const nghttp3_map *map) { return map->size; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_map.h b/deps/ngtcp2/nghttp3/lib/nghttp3_map.h index 7683cfeef3f33e..2b1a6ecab5cf4c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_map.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_map.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -40,7 +40,7 @@ typedef uint64_t nghttp3_map_key_type; typedef struct nghttp3_map_bucket { - uint32_t hash; + uint32_t psl; nghttp3_map_key_type key; void *data; } nghttp3_map_bucket; @@ -49,33 +49,24 @@ typedef struct nghttp3_map { nghttp3_map_bucket *table; const nghttp3_mem *mem; size_t size; - uint32_t tablelen; - uint32_t tablelenbits; + size_t hashbits; } nghttp3_map; /* - * Initializes the map |map|. + * nghttp3_map_init initializes the map |map|. */ void nghttp3_map_init(nghttp3_map *map, const nghttp3_mem *mem); /* - * Deallocates any resources allocated for |map|. The stored entries - * are not freed by this function. Use nghttp3_map_each_free() to free - * each entries. + * nghttp3_map_free deallocates any resources allocated for |map|. + * The stored entries are not freed by this function. Use + * nghttp3_map_each() to free each entry. */ void nghttp3_map_free(nghttp3_map *map); /* - * Deallocates each entries using |func| function and any resources - * allocated for |map|. The |func| function is responsible for freeing - * given the |data| object. The |ptr| will be passed to the |func| as - * send argument. The return value of the |func| will be ignored. - */ -void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), - void *ptr); - -/* - * Inserts the new |data| with the |key| to the map |map|. + * nghttp3_map_insert inserts the new |data| with the |key| to the map + * |map|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -83,57 +74,56 @@ void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), * NGHTTP3_ERR_INVALID_ARGUMENT * The item associated by |key| already exists. * NGHTTP3_ERR_NOMEM - * Out of memory + * Out of memory */ int nghttp3_map_insert(nghttp3_map *map, nghttp3_map_key_type key, void *data); /* - * Returns the data associated by the key |key|. If there is no such - * data, this function returns NULL. + * nghttp3_map_find returns the entry associated by the key |key|. If + * there is no such entry, this function returns NULL. */ -void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key); +void *nghttp3_map_find(const nghttp3_map *map, nghttp3_map_key_type key); /* - * Removes the data associated by the key |key| from the |map|. The - * removed data is not freed by this function. + * nghttp3_map_remove removes the entry associated by the key |key| + * from the |map|. The removed entry is not freed by this function. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_INVALID_ARGUMENT - * The data associated by |key| does not exist. + * The entry associated by |key| does not exist. */ int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key); /* - * Removes all entries from |map|. + * nghttp3_map_clear removes all entries from |map|. The removed + * entry is not freed by this function. */ void nghttp3_map_clear(nghttp3_map *map); /* - * Returns the number of items stored in the map |map|. + * nghttp3_map_size returns the number of items stored in the map + * |map|. */ -size_t nghttp3_map_size(nghttp3_map *map); +size_t nghttp3_map_size(const nghttp3_map *map); /* - * Applies the function |func| to each data in the |map| with the - * optional user supplied pointer |ptr|. + * nghttp3_map_each applies the function |func| to each entry in the + * |map| with the optional user supplied pointer |ptr|. * * If the |func| returns 0, this function calls the |func| with the - * next data. If the |func| returns nonzero, it will not call the + * next entry. If the |func| returns nonzero, it will not call the * |func| for further entries and return the return value of the * |func| immediately. Thus, this function returns 0 if all the * invocations of the |func| return 0, or nonzero value which the last * invocation of |func| returns. - * - * Don't use this function to free each data. Use - * nghttp3_map_each_free() instead. */ -int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), +int nghttp3_map_each(const nghttp3_map *map, int (*func)(void *data, void *ptr), void *ptr); #ifndef WIN32 -void nghttp3_map_print_distance(nghttp3_map *map); -#endif /* !WIN32 */ +void nghttp3_map_print_distance(const nghttp3_map *map); +#endif /* !defined(WIN32) */ -#endif /* NGHTTP3_MAP_H */ +#endif /* !defined(NGHTTP3_MAP_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c index 0379e99b59cb74..687872f9020e78 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c @@ -73,7 +73,7 @@ void *nghttp3_mem_calloc(const nghttp3_mem *mem, size_t nmemb, size_t size) { void *nghttp3_mem_realloc(const nghttp3_mem *mem, void *ptr, size_t size) { return mem->realloc(ptr, size, mem->user_data); } -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *nghttp3_mem_malloc_debug(const nghttp3_mem *mem, size_t size, const char *func, const char *file, size_t line) { @@ -121,4 +121,4 @@ void *nghttp3_mem_realloc_debug(const nghttp3_mem *mem, void *ptr, size_t size, return nptr; } -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h index d6c3ada6f7e894..1ae53c91575f9f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -40,7 +40,7 @@ void *nghttp3_mem_malloc(const nghttp3_mem *mem, size_t size); void nghttp3_mem_free(const nghttp3_mem *mem, void *ptr); void *nghttp3_mem_calloc(const nghttp3_mem *mem, size_t nmemb, size_t size); void *nghttp3_mem_realloc(const nghttp3_mem *mem, void *ptr, size_t size); -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *nghttp3_mem_malloc_debug(const nghttp3_mem *mem, size_t size, const char *func, const char *file, size_t line); @@ -75,6 +75,6 @@ void *nghttp3_mem_realloc_debug(const nghttp3_mem *mem, void *ptr, size_t size, # define nghttp3_mem_realloc(MEM, PTR, SIZE) \ nghttp3_mem_realloc_debug((MEM), (PTR), (SIZE), __func__, __FILE__, \ __LINE__) -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ -#endif /* NGHTTP3_MEM_H */ +#endif /* !defined(NGHTTP3_MEM_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h index 02dff285f24060..4f8ffa093751a7 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -68,9 +68,9 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); #ifndef NOMEMPOOL # define nghttp3_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void nghttp3_objalloc_##NAME##_init( \ - nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ + nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ TYPE *nghttp3_objalloc_##NAME##_get(nghttp3_objalloc *objalloc); \ @@ -79,7 +79,7 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); size_t len); \ \ inline static void nghttp3_objalloc_##NAME##_release( \ - nghttp3_objalloc *objalloc, TYPE *obj) { \ + nghttp3_objalloc *objalloc, TYPE *obj) { \ nghttp3_opl_push(&objalloc->opl, &obj->OPLENTFIELD); \ } @@ -90,8 +90,8 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); int rv; \ \ if (!oplent) { \ - rv = nghttp3_balloc_get(&objalloc->balloc, (void **)&obj, \ - sizeof(TYPE)); \ + rv = \ + nghttp3_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ if (rv != 0) { \ return NULL; \ } \ @@ -119,30 +119,30 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); \ return nghttp3_struct_of(oplent, TYPE, OPLENTFIELD); \ } -#else /* NOMEMPOOL */ +#else /* defined(NOMEMPOOL) */ # define nghttp3_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void nghttp3_objalloc_##NAME##_init( \ - nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ + nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ inline static TYPE *nghttp3_objalloc_##NAME##_get( \ - nghttp3_objalloc *objalloc) { \ + nghttp3_objalloc *objalloc) { \ return nghttp3_mem_malloc(objalloc->balloc.mem, sizeof(TYPE)); \ } \ \ inline static TYPE *nghttp3_objalloc_##NAME##_len_get( \ - nghttp3_objalloc *objalloc, size_t len) { \ + nghttp3_objalloc *objalloc, size_t len) { \ return nghttp3_mem_malloc(objalloc->balloc.mem, len); \ } \ \ inline static void nghttp3_objalloc_##NAME##_release( \ - nghttp3_objalloc *objalloc, TYPE *obj) { \ + nghttp3_objalloc *objalloc, TYPE *obj) { \ nghttp3_mem_free(objalloc->balloc.mem, obj); \ } # define nghttp3_objalloc_def(NAME, TYPE, OPLENTFIELD) -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ -#endif /* NGHTTP3_OBJALLOC_H */ +#endif /* !defined(NGHTTP3_OBJALLOC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h b/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h index 8c8a4f2051b25a..6609371dbfb89f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -63,4 +63,4 @@ nghttp3_opl_entry *nghttp3_opl_pop(nghttp3_opl *opl); void nghttp3_opl_clear(nghttp3_opl *opl); -#endif /* NGHTTP3_OPL_H */ +#endif /* !defined(NGHTTP3_OPL_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c index 5d09050ae63798..feefcd6fc717c3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c @@ -30,18 +30,21 @@ #include "nghttp3_macro.h" -void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_less less, +void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_pq_less less, const nghttp3_mem *mem) { - pq->mem = mem; - pq->capacity = 0; pq->q = NULL; + pq->mem = mem; pq->length = 0; + pq->capacity = 0; pq->less = less; } void nghttp3_pq_free(nghttp3_pq *pq) { + if (!pq) { + return; + } + nghttp3_mem_free(pq->mem, pq->q); - pq->q = NULL; } static void swap(nghttp3_pq *pq, size_t i, size_t j) { @@ -56,11 +59,13 @@ static void swap(nghttp3_pq *pq, size_t i, size_t j) { static void bubble_up(nghttp3_pq *pq, size_t index) { size_t parent; - while (index != 0) { + + while (index) { parent = (index - 1) / 2; if (!pq->less(pq->q[index], pq->q[parent])) { return; } + swap(pq, parent, index); index = parent; } @@ -71,20 +76,23 @@ int nghttp3_pq_push(nghttp3_pq *pq, nghttp3_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = nghttp3_max(4, (pq->capacity * 2)); + ncapacity = nghttp3_max_size(4, pq->capacity * 2); nq = nghttp3_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(nghttp3_pq_entry *)); if (nq == NULL) { return NGHTTP3_ERR_NOMEM; } + pq->capacity = ncapacity; pq->q = nq; } + pq->q[pq->length] = item; item->index = pq->length; ++pq->length; - bubble_up(pq, pq->length - 1); + bubble_up(pq, item->index); + return 0; } @@ -95,32 +103,37 @@ nghttp3_pq_entry *nghttp3_pq_top(const nghttp3_pq *pq) { static void bubble_down(nghttp3_pq *pq, size_t index) { size_t i, j, minindex; + for (;;) { j = index * 2 + 1; minindex = index; + for (i = 0; i < 2; ++i, ++j) { if (j >= pq->length) { break; } + if (pq->less(pq->q[j], pq->q[minindex])) { minindex = j; } } + if (minindex == index) { return; } + swap(pq, index, minindex); index = minindex; } } void nghttp3_pq_pop(nghttp3_pq *pq) { - if (pq->length > 0) { - pq->q[0] = pq->q[pq->length - 1]; - pq->q[0]->index = 0; - --pq->length; - bubble_down(pq, 0); - } + assert(pq->length); + + pq->q[0] = pq->q[pq->length - 1]; + pq->q[0]->index = 0; + --pq->length; + bubble_down(pq, 0); } void nghttp3_pq_remove(nghttp3_pq *pq, nghttp3_pq_entry *item) { @@ -157,11 +170,13 @@ int nghttp3_pq_each(const nghttp3_pq *pq, nghttp3_pq_item_cb fun, void *arg) { if (pq->length == 0) { return 0; } + for (i = 0; i < pq->length; ++i) { if ((*fun)(pq->q[i], arg)) { return 1; } } + return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h index c1a54f505bbd03..3813b529473075 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -39,44 +39,48 @@ /* NGHTTP3_PQ_BAD_INDEX is the priority queue index which indicates that an entry is not queued. Assigning this value to - nghttp3_pq_entry.index can check that the entry is queued or not. */ + nghttp3_pq_entry.index can check that the entry is queued or + not. */ #define NGHTTP3_PQ_BAD_INDEX SIZE_MAX typedef struct nghttp3_pq_entry { size_t index; } nghttp3_pq_entry; -/* "less" function, return nonzero if |lhs| is less than |rhs|. */ -typedef int (*nghttp3_less)(const nghttp3_pq_entry *lhs, - const nghttp3_pq_entry *rhs); +/* nghttp3_pq_less is a "less" function, that returns nonzero if |lhs| + is considered to be less than |rhs|. */ +typedef int (*nghttp3_pq_less)(const nghttp3_pq_entry *lhs, + const nghttp3_pq_entry *rhs); typedef struct nghttp3_pq { - /* The pointer to the pointer to the item stored */ + /* q is a pointer to an array that stores the items. */ nghttp3_pq_entry **q; - /* Memory allocator */ + /* mem is a memory allocator. */ const nghttp3_mem *mem; - /* The number of items stored */ + /* length is the number of items stored. */ size_t length; - /* The maximum number of items this pq can store. This is - automatically extended when length is reached to this value. */ + /* capacity is the maximum number of items this queue can store. + This is automatically extended when length is reached to this + limit. */ size_t capacity; - /* The less function between items */ - nghttp3_less less; + /* less is the less function to compare items. */ + nghttp3_pq_less less; } nghttp3_pq; /* - * Initializes priority queue |pq| with compare function |cmp|. + * nghttp3_pq_init initializes |pq| with compare function |cmp|. */ -void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_less less, const nghttp3_mem *mem); +void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_pq_less less, + const nghttp3_mem *mem); /* - * Deallocates any resources allocated for |pq|. The stored items are - * not freed by this function. + * nghttp3_pq_free deallocates any resources allocated for |pq|. The + * stored items are not freed by this function. */ void nghttp3_pq_free(nghttp3_pq *pq); /* - * Adds |item| to the priority queue |pq|. + * nghttp3_pq_push adds |item| to |pq|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -87,43 +91,47 @@ void nghttp3_pq_free(nghttp3_pq *pq); int nghttp3_pq_push(nghttp3_pq *pq, nghttp3_pq_entry *item); /* - * Returns item at the top of the queue |pq|. It is undefined if the - * queue is empty. + * nghttp3_pq_top returns item at the top of |pq|. It is undefined if + * |pq| is empty. */ nghttp3_pq_entry *nghttp3_pq_top(const nghttp3_pq *pq); /* - * Pops item at the top of the queue |pq|. The popped item is not - * freed by this function. + * nghttp3_pq_pop pops item at the top of |pq|. The popped item is + * not freed by this function. It is undefined if |pq| is empty. */ void nghttp3_pq_pop(nghttp3_pq *pq); /* - * Returns nonzero if the queue |pq| is empty. + * nghttp3_pq_empty returns nonzero if |pq| is empty. */ int nghttp3_pq_empty(const nghttp3_pq *pq); /* - * Returns the number of items in the queue |pq|. + * nghttp3_pq_size returns the number of items |pq| contains. */ size_t nghttp3_pq_size(const nghttp3_pq *pq); typedef int (*nghttp3_pq_item_cb)(nghttp3_pq_entry *item, void *arg); /* - * Applies |fun| to each item in |pq|. The |arg| is passed as arg - * parameter to callback function. This function must not change the - * ordering key. If the return value from callback is nonzero, this - * function returns 1 immediately without iterating remaining items. - * Otherwise this function returns 0. + * nghttp3_pq_each applies |fun| to each item in |pq|. The |arg| is + * passed as arg parameter to callback function. This function must + * not change the ordering key. If the return value from callback is + * nonzero, this function returns 1 immediately without iterating + * remaining items. Otherwise this function returns 0. */ int nghttp3_pq_each(const nghttp3_pq *pq, nghttp3_pq_item_cb fun, void *arg); /* - * Removes |item| from priority queue. + * nghttp3_pq_remove removes |item| from |pq|. |pq| must contain + * |item| otherwise the behavior is undefined. */ void nghttp3_pq_remove(nghttp3_pq *pq, nghttp3_pq_entry *item); +/* + * nghttp3_pq_clear removes all items from |pq|. + */ void nghttp3_pq_clear(nghttp3_pq *pq); -#endif /* NGHTTP3_PQ_H */ +#endif /* !defined(NGHTTP3_PQ_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c index 428c06a82c6bfb..a1c7e7487c1a34 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c @@ -41,287 +41,282 @@ #define NGHTTP3_QPACK_MAX_QPACK_STREAMS 2000 /* Make scalar initialization form of nghttp3_qpack_static_entry */ -#define MAKE_STATIC_ENT(I, T, H) \ - { I, T, H } +#define MAKE_STATIC_ENT(I, T, H) {I, T, H} /* Generated by mkstatichdtbl.py */ static nghttp3_qpack_static_entry token_stable[] = { - MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150u), - MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686u), - MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177u), - MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614u), - MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958u), - MAKE_STATIC_ENT(73, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), - MAKE_STATIC_ENT(74, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), - MAKE_STATIC_ENT(33, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(34, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(75, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(76, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(77, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(78, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(35, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN, - 2710797292u), - MAKE_STATIC_ENT(79, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS, - 2449824425u), - MAKE_STATIC_ENT(80, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS, - 3599549072u), - MAKE_STATIC_ENT(81, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), - MAKE_STATIC_ENT(82, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), - MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188u), - MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059u), - MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726u), - MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348u), - MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789u), - MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, - 1569039836u), - MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791u), - MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305u), - MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051u), - MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960u), - MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960u), - MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027u), - MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793u), - MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615u), - MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238u), - MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251u), - MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833u), - MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126u), - MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447u), - MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681u), - MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202u), - MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366u), - MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842u), - MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000u), - MAKE_STATIC_ENT(56, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(57, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(58, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564u), - MAKE_STATIC_ENT(94, NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS, - 2479169413u), - MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526u), - MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, - 3644557769u), - MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656u), - MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888u), + MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150u), + MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686u), + MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), + MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), + MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), + MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), + MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177u), + MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614u), + MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958u), + MAKE_STATIC_ENT(73, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, + 901040780u), + MAKE_STATIC_ENT(74, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, + 901040780u), + MAKE_STATIC_ENT(33, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(34, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(75, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(76, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(77, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(78, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(35, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN, + 2710797292u), + MAKE_STATIC_ENT(79, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS, + 2449824425u), + MAKE_STATIC_ENT(80, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS, + 3599549072u), + MAKE_STATIC_ENT(81, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, + 2417078055u), + MAKE_STATIC_ENT(82, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, + 2417078055u), + MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188u), + MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059u), + MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726u), + MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348u), + MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), + MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), + MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789u), + MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, 1569039836u), + MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791u), + MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305u), + MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051u), + MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960u), + MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960u), + MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027u), + MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793u), + MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615u), + MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238u), + MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251u), + MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833u), + MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126u), + MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447u), + MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681u), + MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202u), + MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366u), + MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842u), + MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000u), + MAKE_STATIC_ENT(56, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(57, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(58, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564u), + MAKE_STATIC_ENT(94, NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS, + 2479169413u), + MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526u), + MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), + MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), + MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, 3644557769u), + MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656u), + MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), + MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), + MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888u), }; /* Make scalar initialization form of nghttp3_qpack_static_entry */ #define MAKE_STATIC_HD(N, V, T) \ { \ {NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \ - {NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, T \ + {NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \ + T, \ } static nghttp3_qpack_static_header stable[] = { - MAKE_STATIC_HD(":authority", "", NGHTTP3_QPACK_TOKEN__AUTHORITY), - MAKE_STATIC_HD(":path", "/", NGHTTP3_QPACK_TOKEN__PATH), - MAKE_STATIC_HD("age", "0", NGHTTP3_QPACK_TOKEN_AGE), - MAKE_STATIC_HD("content-disposition", "", - NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION), - MAKE_STATIC_HD("content-length", "0", NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH), - MAKE_STATIC_HD("cookie", "", NGHTTP3_QPACK_TOKEN_COOKIE), - MAKE_STATIC_HD("date", "", NGHTTP3_QPACK_TOKEN_DATE), - MAKE_STATIC_HD("etag", "", NGHTTP3_QPACK_TOKEN_ETAG), - MAKE_STATIC_HD("if-modified-since", "", - NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE), - MAKE_STATIC_HD("if-none-match", "", NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH), - MAKE_STATIC_HD("last-modified", "", NGHTTP3_QPACK_TOKEN_LAST_MODIFIED), - MAKE_STATIC_HD("link", "", NGHTTP3_QPACK_TOKEN_LINK), - MAKE_STATIC_HD("location", "", NGHTTP3_QPACK_TOKEN_LOCATION), - MAKE_STATIC_HD("referer", "", NGHTTP3_QPACK_TOKEN_REFERER), - MAKE_STATIC_HD("set-cookie", "", NGHTTP3_QPACK_TOKEN_SET_COOKIE), - MAKE_STATIC_HD(":method", "CONNECT", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "DELETE", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "GET", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "HEAD", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "OPTIONS", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "POST", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "PUT", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":scheme", "http", NGHTTP3_QPACK_TOKEN__SCHEME), - MAKE_STATIC_HD(":scheme", "https", NGHTTP3_QPACK_TOKEN__SCHEME), - MAKE_STATIC_HD(":status", "103", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "200", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "304", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "404", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "503", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD("accept", "*/*", NGHTTP3_QPACK_TOKEN_ACCEPT), - MAKE_STATIC_HD("accept", "application/dns-message", - NGHTTP3_QPACK_TOKEN_ACCEPT), - MAKE_STATIC_HD("accept-encoding", "gzip, deflate, br", - NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING), - MAKE_STATIC_HD("accept-ranges", "bytes", NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES), - MAKE_STATIC_HD("access-control-allow-headers", "cache-control", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-headers", "content-type", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-origin", "*", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN), - MAKE_STATIC_HD("cache-control", "max-age=0", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "max-age=2592000", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "max-age=604800", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "no-cache", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "no-store", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "public, max-age=31536000", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("content-encoding", "br", - NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), - MAKE_STATIC_HD("content-encoding", "gzip", - NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), - MAKE_STATIC_HD("content-type", "application/dns-message", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/javascript", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/json", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/x-www-form-urlencoded", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/gif", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/jpeg", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/png", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/css", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/html; charset=utf-8", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/plain", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/plain;charset=utf-8", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("range", "bytes=0-", NGHTTP3_QPACK_TOKEN_RANGE), - MAKE_STATIC_HD("strict-transport-security", "max-age=31536000", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("strict-transport-security", - "max-age=31536000; includesubdomains", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("strict-transport-security", - "max-age=31536000; includesubdomains; preload", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("vary", "accept-encoding", NGHTTP3_QPACK_TOKEN_VARY), - MAKE_STATIC_HD("vary", "origin", NGHTTP3_QPACK_TOKEN_VARY), - MAKE_STATIC_HD("x-content-type-options", "nosniff", - NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS), - MAKE_STATIC_HD("x-xss-protection", "1; mode=block", - NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION), - MAKE_STATIC_HD(":status", "100", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "204", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "206", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "302", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "400", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "403", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "421", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "425", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "500", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD("accept-language", "", NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE), - MAKE_STATIC_HD("access-control-allow-credentials", "FALSE", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), - MAKE_STATIC_HD("access-control-allow-credentials", "TRUE", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), - MAKE_STATIC_HD("access-control-allow-headers", "*", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-methods", "get", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-allow-methods", "get, post, options", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-allow-methods", "options", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-expose-headers", "content-length", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS), - MAKE_STATIC_HD("access-control-request-headers", "content-type", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS), - MAKE_STATIC_HD("access-control-request-method", "get", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), - MAKE_STATIC_HD("access-control-request-method", "post", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), - MAKE_STATIC_HD("alt-svc", "clear", NGHTTP3_QPACK_TOKEN_ALT_SVC), - MAKE_STATIC_HD("authorization", "", NGHTTP3_QPACK_TOKEN_AUTHORIZATION), - MAKE_STATIC_HD("content-security-policy", - "script-src 'none'; object-src 'none'; base-uri 'none'", - NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY), - MAKE_STATIC_HD("early-data", "1", NGHTTP3_QPACK_TOKEN_EARLY_DATA), - MAKE_STATIC_HD("expect-ct", "", NGHTTP3_QPACK_TOKEN_EXPECT_CT), - MAKE_STATIC_HD("forwarded", "", NGHTTP3_QPACK_TOKEN_FORWARDED), - MAKE_STATIC_HD("if-range", "", NGHTTP3_QPACK_TOKEN_IF_RANGE), - MAKE_STATIC_HD("origin", "", NGHTTP3_QPACK_TOKEN_ORIGIN), - MAKE_STATIC_HD("purpose", "prefetch", NGHTTP3_QPACK_TOKEN_PURPOSE), - MAKE_STATIC_HD("server", "", NGHTTP3_QPACK_TOKEN_SERVER), - MAKE_STATIC_HD("timing-allow-origin", "*", - NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN), - MAKE_STATIC_HD("upgrade-insecure-requests", "1", - NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS), - MAKE_STATIC_HD("user-agent", "", NGHTTP3_QPACK_TOKEN_USER_AGENT), - MAKE_STATIC_HD("x-forwarded-for", "", NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR), - MAKE_STATIC_HD("x-frame-options", "deny", - NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), - MAKE_STATIC_HD("x-frame-options", "sameorigin", - NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), + MAKE_STATIC_HD(":authority", "", NGHTTP3_QPACK_TOKEN__AUTHORITY), + MAKE_STATIC_HD(":path", "/", NGHTTP3_QPACK_TOKEN__PATH), + MAKE_STATIC_HD("age", "0", NGHTTP3_QPACK_TOKEN_AGE), + MAKE_STATIC_HD("content-disposition", "", + NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION), + MAKE_STATIC_HD("content-length", "0", NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH), + MAKE_STATIC_HD("cookie", "", NGHTTP3_QPACK_TOKEN_COOKIE), + MAKE_STATIC_HD("date", "", NGHTTP3_QPACK_TOKEN_DATE), + MAKE_STATIC_HD("etag", "", NGHTTP3_QPACK_TOKEN_ETAG), + MAKE_STATIC_HD("if-modified-since", "", + NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE), + MAKE_STATIC_HD("if-none-match", "", NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH), + MAKE_STATIC_HD("last-modified", "", NGHTTP3_QPACK_TOKEN_LAST_MODIFIED), + MAKE_STATIC_HD("link", "", NGHTTP3_QPACK_TOKEN_LINK), + MAKE_STATIC_HD("location", "", NGHTTP3_QPACK_TOKEN_LOCATION), + MAKE_STATIC_HD("referer", "", NGHTTP3_QPACK_TOKEN_REFERER), + MAKE_STATIC_HD("set-cookie", "", NGHTTP3_QPACK_TOKEN_SET_COOKIE), + MAKE_STATIC_HD(":method", "CONNECT", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "DELETE", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "GET", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "HEAD", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "OPTIONS", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "POST", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "PUT", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":scheme", "http", NGHTTP3_QPACK_TOKEN__SCHEME), + MAKE_STATIC_HD(":scheme", "https", NGHTTP3_QPACK_TOKEN__SCHEME), + MAKE_STATIC_HD(":status", "103", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "200", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "304", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "404", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "503", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD("accept", "*/*", NGHTTP3_QPACK_TOKEN_ACCEPT), + MAKE_STATIC_HD("accept", "application/dns-message", + NGHTTP3_QPACK_TOKEN_ACCEPT), + MAKE_STATIC_HD("accept-encoding", "gzip, deflate, br", + NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING), + MAKE_STATIC_HD("accept-ranges", "bytes", NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES), + MAKE_STATIC_HD("access-control-allow-headers", "cache-control", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-headers", "content-type", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-origin", "*", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN), + MAKE_STATIC_HD("cache-control", "max-age=0", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "max-age=2592000", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "max-age=604800", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "no-cache", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "no-store", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "public, max-age=31536000", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("content-encoding", "br", + NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), + MAKE_STATIC_HD("content-encoding", "gzip", + NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), + MAKE_STATIC_HD("content-type", "application/dns-message", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/javascript", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/json", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/x-www-form-urlencoded", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/gif", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/jpeg", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/png", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/css", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/html; charset=utf-8", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/plain", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/plain;charset=utf-8", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("range", "bytes=0-", NGHTTP3_QPACK_TOKEN_RANGE), + MAKE_STATIC_HD("strict-transport-security", "max-age=31536000", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("strict-transport-security", + "max-age=31536000; includesubdomains", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("strict-transport-security", + "max-age=31536000; includesubdomains; preload", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("vary", "accept-encoding", NGHTTP3_QPACK_TOKEN_VARY), + MAKE_STATIC_HD("vary", "origin", NGHTTP3_QPACK_TOKEN_VARY), + MAKE_STATIC_HD("x-content-type-options", "nosniff", + NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS), + MAKE_STATIC_HD("x-xss-protection", "1; mode=block", + NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION), + MAKE_STATIC_HD(":status", "100", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "204", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "206", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "302", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "400", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "403", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "421", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "425", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "500", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD("accept-language", "", NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE), + MAKE_STATIC_HD("access-control-allow-credentials", "FALSE", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), + MAKE_STATIC_HD("access-control-allow-credentials", "TRUE", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), + MAKE_STATIC_HD("access-control-allow-headers", "*", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-methods", "get", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-allow-methods", "get, post, options", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-allow-methods", "options", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-expose-headers", "content-length", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS), + MAKE_STATIC_HD("access-control-request-headers", "content-type", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS), + MAKE_STATIC_HD("access-control-request-method", "get", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), + MAKE_STATIC_HD("access-control-request-method", "post", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), + MAKE_STATIC_HD("alt-svc", "clear", NGHTTP3_QPACK_TOKEN_ALT_SVC), + MAKE_STATIC_HD("authorization", "", NGHTTP3_QPACK_TOKEN_AUTHORIZATION), + MAKE_STATIC_HD("content-security-policy", + "script-src 'none'; object-src 'none'; base-uri 'none'", + NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY), + MAKE_STATIC_HD("early-data", "1", NGHTTP3_QPACK_TOKEN_EARLY_DATA), + MAKE_STATIC_HD("expect-ct", "", NGHTTP3_QPACK_TOKEN_EXPECT_CT), + MAKE_STATIC_HD("forwarded", "", NGHTTP3_QPACK_TOKEN_FORWARDED), + MAKE_STATIC_HD("if-range", "", NGHTTP3_QPACK_TOKEN_IF_RANGE), + MAKE_STATIC_HD("origin", "", NGHTTP3_QPACK_TOKEN_ORIGIN), + MAKE_STATIC_HD("purpose", "prefetch", NGHTTP3_QPACK_TOKEN_PURPOSE), + MAKE_STATIC_HD("server", "", NGHTTP3_QPACK_TOKEN_SERVER), + MAKE_STATIC_HD("timing-allow-origin", "*", + NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN), + MAKE_STATIC_HD("upgrade-insecure-requests", "1", + NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS), + MAKE_STATIC_HD("user-agent", "", NGHTTP3_QPACK_TOKEN_USER_AGENT), + MAKE_STATIC_HD("x-forwarded-for", "", NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR), + MAKE_STATIC_HD("x-frame-options", "deny", + NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), + MAKE_STATIC_HD("x-frame-options", "sameorigin", + NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), }; static int memeq(const void *s1, const void *s2, size_t n) { @@ -884,9 +879,9 @@ static void qpack_context_free(nghttp3_qpack_context *ctx) { static int ref_min_cnt_less(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { nghttp3_qpack_header_block_ref *lhs = - nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); + nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); nghttp3_qpack_header_block_ref *rhs = - nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); + nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); return lhs->min_cnt < rhs->min_cnt; } @@ -926,6 +921,7 @@ int nghttp3_qpack_encoder_init(nghttp3_qpack_encoder *encoder, encoder->opcode = 0; encoder->min_dtable_update = SIZE_MAX; encoder->last_max_dtable_update = 0; + encoder->uninterrupted_decoderlen = 0; encoder->flags = NGHTTP3_QPACK_ENCODER_FLAG_NONE; nghttp3_qpack_read_state_reset(&encoder->rstate); @@ -943,16 +939,16 @@ static int map_stream_free(void *data, void *ptr) { void nghttp3_qpack_encoder_free(nghttp3_qpack_encoder *encoder) { nghttp3_pq_free(&encoder->min_cnts); nghttp3_ksl_free(&encoder->blocked_streams); - nghttp3_map_each_free(&encoder->streams, map_stream_free, - (void *)encoder->ctx.mem); + nghttp3_map_each(&encoder->streams, map_stream_free, + (void *)encoder->ctx.mem); nghttp3_map_free(&encoder->streams); qpack_context_free(&encoder->ctx); } void nghttp3_qpack_encoder_set_max_dtable_capacity( - nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) { - max_dtable_capacity = - nghttp3_min(max_dtable_capacity, encoder->ctx.hard_max_dtable_capacity); + nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) { + max_dtable_capacity = nghttp3_min_size(max_dtable_capacity, + encoder->ctx.hard_max_dtable_capacity); if (encoder->ctx.max_dtable_capacity == max_dtable_capacity) { return; @@ -968,7 +964,7 @@ void nghttp3_qpack_encoder_set_max_dtable_capacity( } void nghttp3_qpack_encoder_set_max_blocked_streams( - nghttp3_qpack_encoder *encoder, size_t max_blocked_streams) { + nghttp3_qpack_encoder *encoder, size_t max_blocked_streams) { encoder->ctx.max_blocked_streams = max_blocked_streams; } @@ -977,7 +973,7 @@ uint64_t nghttp3_qpack_encoder_get_min_cnt(nghttp3_qpack_encoder *encoder) { return nghttp3_struct_of(nghttp3_pq_top(&encoder->min_cnts), nghttp3_qpack_header_block_ref, min_cnts_pe) - ->min_cnt; + ->min_cnt; } void nghttp3_qpack_encoder_shrink_dtable(nghttp3_qpack_encoder *encoder) { @@ -1003,7 +999,7 @@ void nghttp3_qpack_encoder_shrink_dtable(nghttp3_qpack_encoder *encoder) { } encoder->ctx.dtable_size -= - table_space(ent->nv.name->len, ent->nv.value->len); + table_space(ent->nv.name->len, ent->nv.value->len); nghttp3_ringbuf_pop_back(dtable); qpack_map_remove(&encoder->dtable_map, ent); @@ -1088,8 +1084,8 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, len = nghttp3_ringbuf_len(&stream->refs); for (i = 0; i < len; ++i) { - ref = *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, - i); + ref = + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, i); assert(ref->min_cnts_pe.index != NGHTTP3_PQ_BAD_INDEX); @@ -1098,11 +1094,9 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, } /* - * reserve_buf_internal ensures that |buf| contains at least - * |extra_size| of free space. In other words, if this function - * succeeds, nghttp3_buf_left(buf) >= extra_size holds. |min_size| is - * the minimum size of buffer. The allocated buffer has at least - * |min_size| bytes. + * reserve_buf ensures that |buf| contains at least |extra_size| of + * free space. In other words, if this function succeeds, + * nghttp3_buf_left(buf) >= extra_size holds. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1110,31 +1104,37 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -static int reserve_buf_internal(nghttp3_buf *buf, size_t extra_size, - size_t min_size, const nghttp3_mem *mem) { +static int reserve_buf(nghttp3_buf *buf, size_t extra_size, + const nghttp3_mem *mem) { size_t left = nghttp3_buf_left(buf); - size_t n = min_size, need; + size_t n = 32; if (left >= extra_size) { return 0; } - need = nghttp3_buf_cap(buf) + extra_size - left; - - for (; n < need; n *= 2) - ; + n = nghttp3_max_size(n, nghttp3_buf_cap(buf) + extra_size - left); - return nghttp3_buf_reserve(buf, n, mem); -} + /* Check whether we are requesting too much memory */ + if (n > (1u << 31)) { + return NGHTTP3_ERR_NOMEM; + } -static int reserve_buf_small(nghttp3_buf *buf, size_t extra_size, - const nghttp3_mem *mem) { - return reserve_buf_internal(buf, extra_size, 32, mem); -} +#ifndef WIN32 + n = 1u << (32 - __builtin_clz((uint32_t)n - 1)); +#else /* defined(WIN32) */ + /* Round up to the next highest power of 2 from Bit Twiddling + Hacks */ + --n; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + ++n; +#endif /* defined(WIN32) */ -static int reserve_buf(nghttp3_buf *buf, size_t extra_size, - const nghttp3_mem *mem) { - return reserve_buf_internal(buf, extra_size, 32, mem); + return nghttp3_buf_reserve(buf, n, mem); } int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, @@ -1162,10 +1162,10 @@ int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, stream = nghttp3_qpack_encoder_find_stream(encoder, stream_id); blocked_stream = - stream && nghttp3_qpack_encoder_stream_is_blocked(encoder, stream); + stream && nghttp3_qpack_encoder_stream_is_blocked(encoder, stream); allow_blocking = - blocked_stream || encoder->ctx.max_blocked_streams > - nghttp3_ksl_len(&encoder->blocked_streams); + blocked_stream || encoder->ctx.max_blocked_streams > + nghttp3_ksl_len(&encoder->blocked_streams); DEBUGF("qpack::encode: stream %ld blocked=%d allow_blocking=%d\n", stream_id, blocked_stream, allow_blocking); @@ -1181,13 +1181,15 @@ int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, nghttp3_qpack_encoder_write_field_section_prefix(encoder, pbuf, max_cnt, base); + encoder->uninterrupted_decoderlen = 0; + /* TODO If max_cnt == 0, no reference is made to dtable. */ if (!max_cnt) { return 0; } - rv = qpack_encoder_add_stream_ref(encoder, stream_id, stream, max_cnt, - min_cnt); + rv = + qpack_encoder_add_stream_ref(encoder, stream_id, stream, max_cnt, min_cnt); if (rv != 0) { goto fail; } @@ -1253,7 +1255,7 @@ int nghttp3_qpack_encoder_process_dtable_update(nghttp3_qpack_encoder *encoder, } rv = nghttp3_qpack_encoder_write_set_dtable_cap( - encoder, ebuf, encoder->last_max_dtable_update); + encoder, ebuf, encoder->last_max_dtable_update); if (rv != 0) { return rv; } @@ -1374,7 +1376,7 @@ static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need, if (!nghttp3_pq_empty(&encoder->min_cnts)) { gmin_cnt = nghttp3_qpack_encoder_get_min_cnt(encoder); - min_cnt = nghttp3_min(min_cnt, gmin_cnt); + min_cnt = nghttp3_min_uint64(min_cnt, gmin_cnt); } if (min_cnt == UINT64_MAX) { @@ -1402,7 +1404,7 @@ static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need, static int qpack_encoder_can_index_nv(nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, uint64_t min_cnt) { return qpack_encoder_can_index( - encoder, table_space(nv->namelen, nv->valuelen), min_cnt); + encoder, table_space(nv->namelen, nv->valuelen), min_cnt); } /* @@ -1415,10 +1417,10 @@ static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder, uint64_t absidx, uint64_t min_cnt) { nghttp3_qpack_entry *ent = - nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx); + nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx); return qpack_encoder_can_index( - encoder, table_space(ent->nv.name->len, ent->nv.value->len), min_cnt); + encoder, table_space(ent->nv.name->len, ent->nv.value->len), min_cnt); } /* @@ -1428,7 +1430,7 @@ static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder, static int qpack_context_check_draining(nghttp3_qpack_context *ctx, uint64_t absidx) { const size_t safe = ctx->max_dtable_capacity - - nghttp3_min(512, ctx->max_dtable_capacity * 1 / 8); + nghttp3_min_size(512, ctx->max_dtable_capacity * 1 / 8); nghttp3_qpack_entry *ent = nghttp3_qpack_context_dtable_get(ctx, absidx); return ctx->dtable_sum - ent->sum > safe; @@ -1483,11 +1485,10 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (nghttp3_map_size(&encoder->streams) < NGHTTP3_QPACK_MAX_QPACK_STREAMS) { - dres = nghttp3_qpack_encoder_lookup_dtable(encoder, nv, token, hash, - indexing_mode, encoder->krcnt, - allow_blocking); - just_index = indexing_mode == NGHTTP3_QPACK_INDEXING_MODE_STORE && - dres.pb_index == -1; + dres = nghttp3_qpack_encoder_lookup_dtable( + encoder, nv, token, hash, indexing_mode, encoder->krcnt, allow_blocking); + just_index = + indexing_mode == NGHTTP3_QPACK_INDEXING_MODE_STORE && dres.pb_index == -1; } if (dres.index != -1 && dres.name_value_match) { @@ -1500,8 +1501,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (rv != 0) { return rv; } - rv = nghttp3_qpack_encoder_dtable_duplicate_add(encoder, - (size_t)dres.index); + rv = + nghttp3_qpack_encoder_dtable_duplicate_add(encoder, (size_t)dres.index); if (rv != 0) { return rv; } @@ -1509,11 +1510,11 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); dres.index = (nghttp3_ssize)new_ent->absidx; } - *pmax_cnt = nghttp3_max(*pmax_cnt, (size_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, (size_t)dres.index, base); + encoder, rbuf, (size_t)dres.index, base); } if (sres.index != -1) { @@ -1530,24 +1531,25 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, new_ent->absidx, base); + encoder, rbuf, new_ent->absidx, base); } } return nghttp3_qpack_encoder_write_static_indexed_name( - encoder, rbuf, (size_t)sres.index, nv); + encoder, rbuf, (size_t)sres.index, nv); } if (dres.index != -1) { if (just_index && qpack_encoder_can_index_nv( - encoder, nv, - allow_blocking ? *pmin_cnt - : nghttp3_min((size_t)dres.index + 1, *pmin_cnt))) { + encoder, nv, + allow_blocking + ? *pmin_cnt + : nghttp3_min_uint64((uint64_t)dres.index + 1, *pmin_cnt))) { rv = nghttp3_qpack_encoder_write_dynamic_insert(encoder, ebuf, (size_t)dres.index, nv); if (rv != 0) { @@ -1555,7 +1557,7 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (!allow_blocking) { - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)dres.index + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)dres.index + 1); } rv = nghttp3_qpack_encoder_dtable_dynamic_add(encoder, (size_t)dres.index, @@ -1566,19 +1568,19 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, new_ent->absidx, base); + encoder, rbuf, new_ent->absidx, base); } } - *pmax_cnt = nghttp3_max(*pmax_cnt, (size_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed_name( - encoder, rbuf, (size_t)dres.index, base, nv); + encoder, rbuf, (size_t)dres.index, base, nv); } if (just_index && qpack_encoder_can_index_nv(encoder, nv, *pmin_cnt)) { @@ -1592,8 +1594,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed(encoder, rbuf, new_ent->absidx, base); @@ -1634,9 +1636,9 @@ nghttp3_qpack_lookup_stable(const nghttp3_nv *nv, int32_t token, } nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( - nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, - uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, - int allow_blocking) { + nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, + uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, + int allow_blocking) { nghttp3_qpack_lookup_result res = {-1, 0, -1}; int exact_match = 0; nghttp3_qpack_entry *match, *pb_match; @@ -1659,7 +1661,7 @@ int nghttp3_qpack_header_block_ref_new(nghttp3_qpack_header_block_ref **pref, uint64_t max_cnt, uint64_t min_cnt, const nghttp3_mem *mem) { nghttp3_qpack_header_block_ref *ref = - nghttp3_mem_malloc(mem, sizeof(nghttp3_qpack_header_block_ref)); + nghttp3_mem_malloc(mem, sizeof(nghttp3_qpack_header_block_ref)); if (ref == NULL) { return NGHTTP3_ERR_NOMEM; @@ -1683,9 +1685,9 @@ void nghttp3_qpack_header_block_ref_del(nghttp3_qpack_header_block_ref *ref, static int ref_max_cnt_greater(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { const nghttp3_qpack_header_block_ref *lhs = - nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); + nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); const nghttp3_qpack_header_block_ref *rhs = - nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); + nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); return lhs->max_cnt > rhs->max_cnt; } @@ -1729,8 +1731,8 @@ void nghttp3_qpack_stream_del(nghttp3_qpack_stream *stream, len = nghttp3_ringbuf_len(&stream->refs); for (i = 0; i < len; ++i) { - ref = *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, - i); + ref = + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, i); nghttp3_qpack_header_block_ref_del(ref, mem); } @@ -1776,7 +1778,7 @@ void nghttp3_qpack_stream_pop_ref(nghttp3_qpack_stream *stream) { assert(nghttp3_ringbuf_len(&stream->refs)); ref = - *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); assert(ref->max_cnts_pe.index != NGHTTP3_PQ_BAD_INDEX); @@ -1832,7 +1834,7 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, int h = 0; hlen = nghttp3_qpack_huffman_encode_count(nv->value, nv->valuelen); - if (hlen < nv->valuelen) { + if (hlen * 4 < nv->valuelen * 3) { h = 1; len += nghttp3_qpack_put_varint_len(hlen, 7) + hlen; } else { @@ -1869,10 +1871,10 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, } int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - const nghttp3_nv *nv) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x50 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + (uint8_t)(0x50 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); DEBUGF("qpack::encode: Literal Field Line With Name Reference (static) " "absidx=%" PRIu64 " never=%d\n", @@ -1881,8 +1883,8 @@ int nghttp3_qpack_encoder_write_static_indexed_name( } int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - uint64_t base, const nghttp3_nv *nv) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base, const nghttp3_nv *nv) { uint8_t fb; DEBUGF("qpack::encode: Literal Field Line With Name Reference (dynamic) " @@ -1890,8 +1892,8 @@ int nghttp3_qpack_encoder_write_dynamic_indexed_name( absidx, base, (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) != 0); if (absidx < base) { - fb = (uint8_t)(0x40 | - ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + fb = + (uint8_t)(0x40 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); return qpack_encoder_write_indexed_name(encoder, rbuf, fb, base - absidx - 1, 4, nv); } @@ -1923,7 +1925,7 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, int nh = 0, vh = 0; nhlen = nghttp3_qpack_huffman_encode_count(nv->name, nv->namelen); - if (nhlen < nv->namelen) { + if (nhlen * 4 < nv->namelen * 3) { nh = 1; len = nghttp3_qpack_put_varint_len(nhlen, prefix) + nhlen; } else { @@ -1931,7 +1933,7 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, } vhlen = nghttp3_qpack_huffman_encode_count(nv->value, nv->valuelen); - if (vhlen < nv->valuelen) { + if (vhlen * 4 < nv->valuelen * 3) { vh = 1; len += nghttp3_qpack_put_varint_len(vhlen, 7) + vhlen; } else { @@ -1981,7 +1983,7 @@ int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x20 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10 : 0)); + (uint8_t)(0x20 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10 : 0)); DEBUGF("qpack::encode: Literal Field Line With Literal Name\n"); return qpack_encoder_write_literal(encoder, rbuf, fb, 3, nv); @@ -2005,7 +2007,7 @@ int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder, "\n", absidx); return qpack_encoder_write_indexed_name( - encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv); + encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv); } int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, @@ -2257,10 +2259,10 @@ void nghttp3_qpack_entry_free(nghttp3_qpack_entry *ent) { int nghttp3_qpack_encoder_block_stream(nghttp3_qpack_encoder *encoder, nghttp3_qpack_stream *stream) { nghttp3_blocked_streams_key bsk = { - nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), - nghttp3_qpack_header_block_ref, max_cnts_pe) - ->max_cnt, - (uint64_t)stream->stream_id}; + nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), + nghttp3_qpack_header_block_ref, max_cnts_pe) + ->max_cnt, + (uint64_t)stream->stream_id}; return nghttp3_ksl_insert(&encoder->blocked_streams, NULL, &bsk, stream); } @@ -2268,10 +2270,10 @@ int nghttp3_qpack_encoder_block_stream(nghttp3_qpack_encoder *encoder, void nghttp3_qpack_encoder_unblock_stream(nghttp3_qpack_encoder *encoder, nghttp3_qpack_stream *stream) { nghttp3_blocked_streams_key bsk = { - nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), - nghttp3_qpack_header_block_ref, max_cnts_pe) - ->max_cnt, - (uint64_t)stream->stream_id}; + nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), + nghttp3_qpack_header_block_ref, max_cnts_pe) + ->max_cnt, + (uint64_t)stream->stream_id}; nghttp3_ksl_it it; /* This is purely debugging purpose only */ @@ -2299,7 +2301,7 @@ void nghttp3_qpack_encoder_unblock(nghttp3_qpack_encoder *encoder, int nghttp3_qpack_encoder_ack_header(nghttp3_qpack_encoder *encoder, int64_t stream_id) { nghttp3_qpack_stream *stream = - nghttp3_qpack_encoder_find_stream(encoder, stream_id); + nghttp3_qpack_encoder_find_stream(encoder, stream_id); const nghttp3_mem *mem = encoder->ctx.mem; nghttp3_qpack_header_block_ref *ref; @@ -2310,7 +2312,7 @@ int nghttp3_qpack_encoder_ack_header(nghttp3_qpack_encoder *encoder, assert(nghttp3_ringbuf_len(&stream->refs)); ref = - *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); DEBUGF("qpack::encoder: Header acknowledgement stream=%ld ricnt=%" PRIu64 " krcnt=%" PRIu64 "\n", @@ -2357,15 +2359,15 @@ void nghttp3_qpack_encoder_ack_everything(nghttp3_qpack_encoder *encoder) { nghttp3_ksl_clear(&encoder->blocked_streams); nghttp3_pq_clear(&encoder->min_cnts); - nghttp3_map_each_free(&encoder->streams, map_stream_free, - (void *)encoder->ctx.mem); + nghttp3_map_each(&encoder->streams, map_stream_free, + (void *)encoder->ctx.mem); nghttp3_map_clear(&encoder->streams); } void nghttp3_qpack_encoder_cancel_stream(nghttp3_qpack_encoder *encoder, int64_t stream_id) { nghttp3_qpack_stream *stream = - nghttp3_qpack_encoder_find_stream(encoder, stream_id); + nghttp3_qpack_encoder_find_stream(encoder, stream_id); const nghttp3_mem *mem = encoder->ctx.mem; if (stream == NULL) { @@ -2387,10 +2389,10 @@ nghttp3_qpack_encoder_get_num_blocked_streams(nghttp3_qpack_encoder *encoder) { } int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, - uint64_t base) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + uint64_t base) { size_t max_ents = - encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; + encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; uint64_t encricnt = ricnt == 0 ? 0 : (ricnt % (2 * max_ents)) + 1; int sign = base < ricnt; uint64_t delta_base = sign ? ricnt - base - 1 : base - ricnt; @@ -2523,20 +2525,31 @@ nghttp3_ssize nghttp3_qpack_encoder_read_decoder(nghttp3_qpack_encoder *encoder, return 0; } + encoder->uninterrupted_decoderlen += srclen; + if (encoder->uninterrupted_decoderlen > NGHTTP3_QPACK_MAX_DECODERLEN) { + return NGHTTP3_ERR_QPACK_DECODER_STREAM_ERROR; + } + end = src + srclen; for (; p != end;) { switch (encoder->state) { case NGHTTP3_QPACK_DS_STATE_OPCODE: - if ((*p) & 0x80) { + switch ((*p) & 0xc0) { + case 0x80: + case 0xc0: DEBUGF("qpack::encode: OPCODE_SECTION_ACK\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_SECTION_ACK; encoder->rstate.prefix = 7; - } else if ((*p) & 0x40) { + + break; + case 0x40: DEBUGF("qpack::encode: OPCODE_STREAM_CANCEL\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_STREAM_CANCEL; encoder->rstate.prefix = 6; - } else { + + break; + default: DEBUGF("qpack::encode: OPCODE_ICNT_INCREMENT\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_ICNT_INCREMENT; encoder->rstate.prefix = 6; @@ -2670,6 +2683,7 @@ int nghttp3_qpack_decoder_init(nghttp3_qpack_decoder *decoder, decoder->opcode = 0; decoder->written_icnt = 0; decoder->max_concurrent_streams = 0; + decoder->uninterrupted_encoderlen = 0; nghttp3_qpack_read_state_reset(&decoder->rstate); nghttp3_buf_init(&decoder->dbuf); @@ -2726,7 +2740,7 @@ static nghttp3_ssize qpack_read_string(nghttp3_qpack_read_state *rstate, nghttp3_buf *dest, const uint8_t *begin, const uint8_t *end) { size_t len = (size_t)(end - begin); - size_t n = (size_t)nghttp3_min((uint64_t)len, rstate->left); + size_t n = (size_t)nghttp3_min_uint64((uint64_t)len, rstate->left); dest->last = nghttp3_cpymem(dest->last, begin, n); @@ -2747,10 +2761,10 @@ static int qpack_decoder_validate_index(nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state *rstate) { if (rstate->dynamic) { return rstate->absidx < decoder->ctx.next_absidx && - decoder->ctx.next_absidx - rstate->absidx - 1 < - nghttp3_ringbuf_len(&decoder->ctx.dtable) - ? 0 - : NGHTTP3_ERR_QPACK_FATAL; + decoder->ctx.next_absidx - rstate->absidx - 1 < + nghttp3_ringbuf_len(&decoder->ctx.dtable) + ? 0 + : NGHTTP3_ERR_QPACK_FATAL; } return rstate->absidx < nghttp3_arraylen(stable) ? 0 : NGHTTP3_ERR_QPACK_FATAL; @@ -2789,39 +2803,51 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, return 0; } + decoder->uninterrupted_encoderlen += srclen; + if (decoder->uninterrupted_encoderlen > NGHTTP3_QPACK_MAX_ENCODERLEN) { + return NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; + } + end = src + srclen; for (; p != end || busy;) { busy = 0; switch (decoder->state) { case NGHTTP3_QPACK_ES_STATE_OPCODE: - if ((*p) & 0x80) { + switch ((*p) & 0xe0) { + case 0x80: + case 0xa0: + case 0xc0: + case 0xe0: DEBUGF("qpack::decode: OPCODE_INSERT_INDEXED\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT_INDEXED; decoder->rstate.dynamic = !((*p) & 0x40); decoder->rstate.prefix = 6; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else if ((*p) & 0x40) { + + break; + case 0x40: + case 0x60: DEBUGF("qpack::decode: OPCODE_INSERT\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT; decoder->rstate.dynamic = 0; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_NAME_HUFFMAN; - } else if ((*p) & 0x20) { + + break; + case 0x20: DEBUGF("qpack::decode: OPCODE_SET_DTABLE_TABLE_CAP\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_SET_DTABLE_CAP; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else if (!((*p) & 0x20)) { + + break; + default: DEBUGF("qpack::decode: OPCODE_DUPLICATE\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_DUPLICATE; decoder->rstate.dynamic = 1; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else { - DEBUGF("qpack::decode: unknown opcode %02x\n", *p); - rv = NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; - goto fail; } break; case NGHTTP3_QPACK_ES_STATE_READ_INDEX: @@ -2842,7 +2868,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, DEBUGF("qpack::decode: Set dtable capacity to %" PRIu64 "\n", decoder->rstate.left); rv = nghttp3_qpack_decoder_set_max_dtable_capacity( - decoder, (size_t)decoder->rstate.left); + decoder, (size_t)decoder->rstate.left); if (rv != 0) { rv = NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; goto fail; @@ -2944,7 +2970,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, break; case NGHTTP3_QPACK_ES_STATE_READ_NAME: nread = - qpack_read_string(&decoder->rstate, &decoder->rstate.namebuf, p, end); + qpack_read_string(&decoder->rstate, &decoder->rstate.namebuf, p, end); if (nread < 0) { rv = (int)nread; goto fail; @@ -3042,8 +3068,8 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state_reset(&decoder->rstate); break; case NGHTTP3_QPACK_ES_STATE_READ_VALUE: - nread = qpack_read_string(&decoder->rstate, &decoder->rstate.valuebuf, p, - end); + nread = + qpack_read_string(&decoder->rstate, &decoder->rstate.valuebuf, p, end); if (nread < 0) { rv = (int)nread; goto fail; @@ -3085,7 +3111,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, } int nghttp3_qpack_decoder_set_max_dtable_capacity( - nghttp3_qpack_decoder *decoder, size_t max_dtable_capacity) { + nghttp3_qpack_decoder *decoder, size_t max_dtable_capacity) { nghttp3_qpack_entry *ent; size_t i; nghttp3_qpack_context *ctx = &decoder->ctx; @@ -3230,9 +3256,9 @@ int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder) { } void nghttp3_qpack_decoder_set_max_concurrent_streams( - nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) { + nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) { decoder->max_concurrent_streams = - nghttp3_max(decoder->max_concurrent_streams, max_concurrent_streams); + nghttp3_max_size(decoder->max_concurrent_streams, max_concurrent_streams); } void nghttp3_qpack_stream_context_init(nghttp3_qpack_stream_context *sctx, @@ -3357,33 +3383,53 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, case NGHTTP3_QPACK_RS_STATE_OPCODE: assert(sctx->rstate.left == 0); assert(sctx->rstate.shift == 0); - if ((*p) & 0x80) { + switch ((*p) & 0xf0) { + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + case 0xf0: DEBUGF("qpack::decode: OPCODE_INDEXED\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED; sctx->rstate.dynamic = !((*p) & 0x40); sctx->rstate.prefix = 6; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else if ((*p) & 0x40) { + + break; + case 0x40: + case 0x50: + case 0x60: + case 0x70: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME; sctx->rstate.never = (*p) & 0x20; sctx->rstate.dynamic = !((*p) & 0x10); sctx->rstate.prefix = 4; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else if ((*p) & 0x20) { + + break; + case 0x20: + case 0x30: DEBUGF("qpack::decode: OPCODE_LITERAL\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_LITERAL; sctx->rstate.never = (*p) & 0x10; sctx->rstate.dynamic = 0; sctx->rstate.prefix = 3; sctx->state = NGHTTP3_QPACK_RS_STATE_CHECK_NAME_HUFFMAN; - } else if ((*p) & 0x10) { + + break; + case 0x10: DEBUGF("qpack::decode: OPCODE_INDEXED_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_PB; sctx->rstate.dynamic = 1; sctx->rstate.prefix = 4; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else { + + break; + default: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME_PB; sctx->rstate.never = (*p) & 0x08; @@ -3494,8 +3540,8 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, sctx->rstate.name->len); break; case NGHTTP3_QPACK_RS_STATE_READ_NAME_HUFFMAN: - nread = qpack_read_huffman_string(&sctx->rstate, &sctx->rstate.namebuf, p, - end); + nread = + qpack_read_huffman_string(&sctx->rstate, &sctx->rstate.namebuf, p, end); if (nread < 0) { assert(NGHTTP3_ERR_QPACK_FATAL == nread); rv = NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED; @@ -3679,6 +3725,8 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, goto fail; } } + + decoder->uninterrupted_encoderlen = 0; } return p - src; @@ -3689,13 +3737,13 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, } static int qpack_decoder_dbuf_overflow(nghttp3_qpack_decoder *decoder) { - size_t limit = nghttp3_max(decoder->max_concurrent_streams, 100); + size_t limit = nghttp3_max_size(decoder->max_concurrent_streams, 100); /* 10 = nghttp3_qpack_put_varint_len((1ULL << 62) - 1, 2)) */ return nghttp3_buf_len(&decoder->dbuf) > limit * 2 * 10; } int nghttp3_qpack_decoder_write_section_ack( - nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx) { + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx) { nghttp3_buf *dbuf = &decoder->dbuf; uint8_t *p; int rv; @@ -3704,9 +3752,9 @@ int nghttp3_qpack_decoder_write_section_ack( return NGHTTP3_ERR_QPACK_FATAL; } - rv = reserve_buf_small( - dbuf, nghttp3_qpack_put_varint_len((uint64_t)sctx->stream_id, 7), - decoder->ctx.mem); + rv = reserve_buf(dbuf, + nghttp3_qpack_put_varint_len((uint64_t)sctx->stream_id, 7), + decoder->ctx.mem); if (rv != 0) { return rv; } @@ -3798,7 +3846,7 @@ int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, } max_ents = - decoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; + decoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; full = 2 * max_ents; if (encricnt > full) { @@ -3910,7 +3958,7 @@ qpack_decoder_emit_dynamic_indexed(nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { nghttp3_qpack_entry *ent = - nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx); + nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx); *nv = ent->nv; @@ -3942,7 +3990,7 @@ qpack_decoder_emit_static_indexed_name(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = shd->token; nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; sctx->rstate.value = NULL; } @@ -3965,7 +4013,7 @@ qpack_decoder_emit_dynamic_indexed_name(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = ent->nv.token; nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; nghttp3_rcbuf_incref(nv->name); @@ -4005,7 +4053,7 @@ void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = qpack_lookup_token(nv->name->base, nv->name->len); nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; sctx->rstate.name = NULL; sctx->rstate.value = NULL; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h index 804969e14d6091..d2bb8a3581135b 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -48,6 +48,14 @@ /* NGHTTP3_QPACK_MAX_VALUELEN is the maximum (compressed) length of header value this library can decode. */ #define NGHTTP3_QPACK_MAX_VALUELEN 65536 +/* NGHTTP3_QPACK_MAX_ENCODERLEN is the maximum encoder stream length + that a decoder accepts without completely processing a single field + section. */ +#define NGHTTP3_QPACK_MAX_ENCODERLEN (128 * 1024) +/* NGHTTP3_QPACK_MAX_DECODERLEN is the maximum decoder stream length + that an encoder accepts without completely encoding a single field + section. */ +#define NGHTTP3_QPACK_MAX_DECODERLEN (4 * 1024) /* nghttp3_qpack_indexing_mode is a indexing strategy. */ typedef enum nghttp3_qpack_indexing_mode { @@ -250,6 +258,9 @@ struct nghttp3_qpack_encoder { /* last_max_dtable_update is the dynamic table size last requested. */ size_t last_max_dtable_update; + /* uninterrupted_decoderlen is the number of bytes read from decoder + stream without encoding a single field section. */ + size_t uninterrupted_decoderlen; /* flags is bitwise OR of zero or more of NGHTTP3_QPACK_ENCODER_FLAG_*. */ uint8_t flags; @@ -325,9 +336,9 @@ nghttp3_qpack_lookup_stable(const nghttp3_nv *nv, int32_t token, * blocked (or it has been blocked already). */ nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( - nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, - uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, - int allow_blocking); + nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, + uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, + int allow_blocking); /* * nghttp3_qpack_encoder_write_field_section_prefix writes Encoded @@ -341,8 +352,8 @@ nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( * Out of memory. */ int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, - uint64_t base); + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + uint64_t base); /* * nghttp3_qpack_encoder_write_static_indexed writes Indexed Header @@ -386,8 +397,8 @@ int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, * Out of memory. */ int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - const nghttp3_nv *nv); + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_dynamic_indexed writes Literal Header @@ -402,8 +413,8 @@ int nghttp3_qpack_encoder_write_static_indexed_name( * Out of memory. */ int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - uint64_t base, const nghttp3_nv *nv); + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base, const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_literal writes Literal Header Field @@ -779,6 +790,9 @@ struct nghttp3_qpack_decoder { unidirectional streams which potentially receives QPACK encoded HEADER frame. */ size_t max_concurrent_streams; + /* uninterrupted_encoderlen is the number of bytes read from encoder + stream without completing a single field section. */ + size_t uninterrupted_encoderlen; }; /* @@ -880,19 +894,19 @@ int nghttp3_qpack_decoder_dtable_duplicate_add(nghttp3_qpack_decoder *decoder); int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder); struct nghttp3_qpack_stream_context { - /* state is a current state of reading request stream. */ - nghttp3_qpack_request_stream_state state; /* rstate is a set of intermediate state which are used to process request stream. */ nghttp3_qpack_read_state rstate; const nghttp3_mem *mem; - /* opcode is a request stream opcode being processed. */ - nghttp3_qpack_request_stream_opcode opcode; int64_t stream_id; /* ricnt is Required Insert Count to decode this header block. */ uint64_t ricnt; /* base is Base in Header Block Prefix. */ uint64_t base; + /* state is a current state of reading request stream. */ + nghttp3_qpack_request_stream_state state; + /* opcode is a request stream opcode being processed. */ + nghttp3_qpack_request_stream_opcode opcode; /* dbase_sign is the delta base sign in Header Block Prefix. */ int dbase_sign; }; @@ -991,6 +1005,6 @@ void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, * Decoder stream overflow. */ int nghttp3_qpack_decoder_write_section_ack( - nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx); + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx); -#endif /* NGHTTP3_QPACK_H */ +#endif /* !defined(NGHTTP3_QPACK_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c index c36a68ededd1af..3398f3f5080e60 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c @@ -78,7 +78,7 @@ uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, } void nghttp3_qpack_huffman_decode_context_init( - nghttp3_qpack_huffman_decode_context *ctx) { + nghttp3_qpack_huffman_decode_context *ctx) { ctx->fstate = NGHTTP3_QPACK_HUFFMAN_ACCEPTED; } @@ -93,7 +93,9 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, uint8_t c; /* We use the decoding algorithm described in - http://graphics.ics.uci.edu/pub/Prefix.pdf */ + - http://graphics.ics.uci.edu/pub/Prefix.pdf [!!! NO LONGER VALID !!!] + - https://ics.uci.edu/~dan/pubs/Prefix.pdf + - https://github.com/nghttp2/nghttp2/files/15141264/Prefix.pdf */ for (; src != end;) { c = *src++; t = &qpack_huffman_decode_table[t->fstate & 0x1ff][c >> 4]; @@ -117,6 +119,6 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, } int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx) { + nghttp3_qpack_huffman_decode_context *ctx) { return ctx->fstate == 0x100; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h index fc3bc7b264a900..ab6d82a16a9134 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -75,7 +75,7 @@ typedef struct nghttp3_qpack_huffman_decode_context { extern const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16]; void nghttp3_qpack_huffman_decode_context_init( - nghttp3_qpack_huffman_decode_context *ctx); + nghttp3_qpack_huffman_decode_context *ctx); /* * nghttp3_qpack_huffman_decode decodes huffman encoded byte string @@ -103,6 +103,6 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, * indicates that huffman decoding context is in failure state. */ int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx); + nghttp3_qpack_huffman_decode_context *ctx); -#endif /* NGHTTP3_QPACK_HUFFMAN_H */ +#endif /* !defined(NGHTTP3_QPACK_HUFFMAN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c index 0c104dbc0a0bd8..7c3c230f041211 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c @@ -28,4954 +28,4954 @@ /* Generated by mkhufftbl.py */ const nghttp3_qpack_huffman_sym huffman_sym_table[] = { - {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, - {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, - {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, - {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, - {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, - {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, - {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, - {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, - {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, - {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, - {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, - {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, - {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, - {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, - {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, - {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, - {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, - {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, - {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, - {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, - {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, - {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, - {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, - {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, - {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, - {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, - {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, - {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, - {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, - {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, - {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, - {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, - {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, - {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, - {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, - {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, - {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, - {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, - {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, - {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, - {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, - {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, - {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, - {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, - {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, - {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, - {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, - {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, - {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, - {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, - {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, - {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, - {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, - {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, - {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, - {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, - {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, - {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, - {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, - {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, - {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, - {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, - {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, - {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, - {30, 0xfffffffcu}}; + {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, + {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, + {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, + {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, + {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, + {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, + {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, + {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, + {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, + {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, + {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, + {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, + {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, + {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, + {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, + {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, + {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, + {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, + {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, + {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, + {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, + {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, + {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, + {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, + {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, + {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, + {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, + {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, + {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, + {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, + {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, + {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, + {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, + {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, + {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, + {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, + {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, + {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, + {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, + {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, + {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, + {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, + {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, + {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, + {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, + {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, + {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, + {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, + {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, + {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, + {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, + {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, + {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, + {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, + {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, + {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, + {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, + {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, + {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, + {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, + {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, + {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, + {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, + {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, + {30, 0xfffffffcu}}; const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16] = { - /* 0 */ - { - {0x04, 0}, - {0x05, 0}, - {0x07, 0}, - {0x08, 0}, - {0x0b, 0}, - {0x0c, 0}, - {0x10, 0}, - {0x13, 0}, - {0x19, 0}, - {0x1c, 0}, - {0x20, 0}, - {0x23, 0}, - {0x2a, 0}, - {0x31, 0}, - {0x39, 0}, - {0x4040, 0}, - }, - /* 1 */ - { - {0xc000, 48}, - {0xc000, 49}, - {0xc000, 50}, - {0xc000, 97}, - {0xc000, 99}, - {0xc000, 101}, - {0xc000, 105}, - {0xc000, 111}, - {0xc000, 115}, - {0xc000, 116}, - {0x0d, 0}, - {0x0e, 0}, - {0x11, 0}, - {0x12, 0}, - {0x14, 0}, - {0x15, 0}, - }, - /* 2 */ - { - {0x8001, 48}, - {0xc016, 48}, - {0x8001, 49}, - {0xc016, 49}, - {0x8001, 50}, - {0xc016, 50}, - {0x8001, 97}, - {0xc016, 97}, - {0x8001, 99}, - {0xc016, 99}, - {0x8001, 101}, - {0xc016, 101}, - {0x8001, 105}, - {0xc016, 105}, - {0x8001, 111}, - {0xc016, 111}, - }, - /* 3 */ - { - {0x8002, 48}, - {0x8009, 48}, - {0x8017, 48}, - {0xc028, 48}, - {0x8002, 49}, - {0x8009, 49}, - {0x8017, 49}, - {0xc028, 49}, - {0x8002, 50}, - {0x8009, 50}, - {0x8017, 50}, - {0xc028, 50}, - {0x8002, 97}, - {0x8009, 97}, - {0x8017, 97}, - {0xc028, 97}, - }, - /* 4 */ - { - {0x8003, 48}, - {0x8006, 48}, - {0x800a, 48}, - {0x800f, 48}, - {0x8018, 48}, - {0x801f, 48}, - {0x8029, 48}, - {0xc038, 48}, - {0x8003, 49}, - {0x8006, 49}, - {0x800a, 49}, - {0x800f, 49}, - {0x8018, 49}, - {0x801f, 49}, - {0x8029, 49}, - {0xc038, 49}, - }, - /* 5 */ - { - {0x8003, 50}, - {0x8006, 50}, - {0x800a, 50}, - {0x800f, 50}, - {0x8018, 50}, - {0x801f, 50}, - {0x8029, 50}, - {0xc038, 50}, - {0x8003, 97}, - {0x8006, 97}, - {0x800a, 97}, - {0x800f, 97}, - {0x8018, 97}, - {0x801f, 97}, - {0x8029, 97}, - {0xc038, 97}, - }, - /* 6 */ - { - {0x8002, 99}, - {0x8009, 99}, - {0x8017, 99}, - {0xc028, 99}, - {0x8002, 101}, - {0x8009, 101}, - {0x8017, 101}, - {0xc028, 101}, - {0x8002, 105}, - {0x8009, 105}, - {0x8017, 105}, - {0xc028, 105}, - {0x8002, 111}, - {0x8009, 111}, - {0x8017, 111}, - {0xc028, 111}, - }, - /* 7 */ - { - {0x8003, 99}, - {0x8006, 99}, - {0x800a, 99}, - {0x800f, 99}, - {0x8018, 99}, - {0x801f, 99}, - {0x8029, 99}, - {0xc038, 99}, - {0x8003, 101}, - {0x8006, 101}, - {0x800a, 101}, - {0x800f, 101}, - {0x8018, 101}, - {0x801f, 101}, - {0x8029, 101}, - {0xc038, 101}, - }, - /* 8 */ - { - {0x8003, 105}, - {0x8006, 105}, - {0x800a, 105}, - {0x800f, 105}, - {0x8018, 105}, - {0x801f, 105}, - {0x8029, 105}, - {0xc038, 105}, - {0x8003, 111}, - {0x8006, 111}, - {0x800a, 111}, - {0x800f, 111}, - {0x8018, 111}, - {0x801f, 111}, - {0x8029, 111}, - {0xc038, 111}, - }, - /* 9 */ - { - {0x8001, 115}, - {0xc016, 115}, - {0x8001, 116}, - {0xc016, 116}, - {0xc000, 32}, - {0xc000, 37}, - {0xc000, 45}, - {0xc000, 46}, - {0xc000, 47}, - {0xc000, 51}, - {0xc000, 52}, - {0xc000, 53}, - {0xc000, 54}, - {0xc000, 55}, - {0xc000, 56}, - {0xc000, 57}, - }, - /* 10 */ - { - {0x8002, 115}, - {0x8009, 115}, - {0x8017, 115}, - {0xc028, 115}, - {0x8002, 116}, - {0x8009, 116}, - {0x8017, 116}, - {0xc028, 116}, - {0x8001, 32}, - {0xc016, 32}, - {0x8001, 37}, - {0xc016, 37}, - {0x8001, 45}, - {0xc016, 45}, - {0x8001, 46}, - {0xc016, 46}, - }, - /* 11 */ - { - {0x8003, 115}, - {0x8006, 115}, - {0x800a, 115}, - {0x800f, 115}, - {0x8018, 115}, - {0x801f, 115}, - {0x8029, 115}, - {0xc038, 115}, - {0x8003, 116}, - {0x8006, 116}, - {0x800a, 116}, - {0x800f, 116}, - {0x8018, 116}, - {0x801f, 116}, - {0x8029, 116}, - {0xc038, 116}, - }, - /* 12 */ - { - {0x8002, 32}, - {0x8009, 32}, - {0x8017, 32}, - {0xc028, 32}, - {0x8002, 37}, - {0x8009, 37}, - {0x8017, 37}, - {0xc028, 37}, - {0x8002, 45}, - {0x8009, 45}, - {0x8017, 45}, - {0xc028, 45}, - {0x8002, 46}, - {0x8009, 46}, - {0x8017, 46}, - {0xc028, 46}, - }, - /* 13 */ - { - {0x8003, 32}, - {0x8006, 32}, - {0x800a, 32}, - {0x800f, 32}, - {0x8018, 32}, - {0x801f, 32}, - {0x8029, 32}, - {0xc038, 32}, - {0x8003, 37}, - {0x8006, 37}, - {0x800a, 37}, - {0x800f, 37}, - {0x8018, 37}, - {0x801f, 37}, - {0x8029, 37}, - {0xc038, 37}, - }, - /* 14 */ - { - {0x8003, 45}, - {0x8006, 45}, - {0x800a, 45}, - {0x800f, 45}, - {0x8018, 45}, - {0x801f, 45}, - {0x8029, 45}, - {0xc038, 45}, - {0x8003, 46}, - {0x8006, 46}, - {0x800a, 46}, - {0x800f, 46}, - {0x8018, 46}, - {0x801f, 46}, - {0x8029, 46}, - {0xc038, 46}, - }, - /* 15 */ - { - {0x8001, 47}, - {0xc016, 47}, - {0x8001, 51}, - {0xc016, 51}, - {0x8001, 52}, - {0xc016, 52}, - {0x8001, 53}, - {0xc016, 53}, - {0x8001, 54}, - {0xc016, 54}, - {0x8001, 55}, - {0xc016, 55}, - {0x8001, 56}, - {0xc016, 56}, - {0x8001, 57}, - {0xc016, 57}, - }, - /* 16 */ - { - {0x8002, 47}, - {0x8009, 47}, - {0x8017, 47}, - {0xc028, 47}, - {0x8002, 51}, - {0x8009, 51}, - {0x8017, 51}, - {0xc028, 51}, - {0x8002, 52}, - {0x8009, 52}, - {0x8017, 52}, - {0xc028, 52}, - {0x8002, 53}, - {0x8009, 53}, - {0x8017, 53}, - {0xc028, 53}, - }, - /* 17 */ - { - {0x8003, 47}, - {0x8006, 47}, - {0x800a, 47}, - {0x800f, 47}, - {0x8018, 47}, - {0x801f, 47}, - {0x8029, 47}, - {0xc038, 47}, - {0x8003, 51}, - {0x8006, 51}, - {0x800a, 51}, - {0x800f, 51}, - {0x8018, 51}, - {0x801f, 51}, - {0x8029, 51}, - {0xc038, 51}, - }, - /* 18 */ - { - {0x8003, 52}, - {0x8006, 52}, - {0x800a, 52}, - {0x800f, 52}, - {0x8018, 52}, - {0x801f, 52}, - {0x8029, 52}, - {0xc038, 52}, - {0x8003, 53}, - {0x8006, 53}, - {0x800a, 53}, - {0x800f, 53}, - {0x8018, 53}, - {0x801f, 53}, - {0x8029, 53}, - {0xc038, 53}, - }, - /* 19 */ - { - {0x8002, 54}, - {0x8009, 54}, - {0x8017, 54}, - {0xc028, 54}, - {0x8002, 55}, - {0x8009, 55}, - {0x8017, 55}, - {0xc028, 55}, - {0x8002, 56}, - {0x8009, 56}, - {0x8017, 56}, - {0xc028, 56}, - {0x8002, 57}, - {0x8009, 57}, - {0x8017, 57}, - {0xc028, 57}, - }, - /* 20 */ - { - {0x8003, 54}, - {0x8006, 54}, - {0x800a, 54}, - {0x800f, 54}, - {0x8018, 54}, - {0x801f, 54}, - {0x8029, 54}, - {0xc038, 54}, - {0x8003, 55}, - {0x8006, 55}, - {0x800a, 55}, - {0x800f, 55}, - {0x8018, 55}, - {0x801f, 55}, - {0x8029, 55}, - {0xc038, 55}, - }, - /* 21 */ - { - {0x8003, 56}, - {0x8006, 56}, - {0x800a, 56}, - {0x800f, 56}, - {0x8018, 56}, - {0x801f, 56}, - {0x8029, 56}, - {0xc038, 56}, - {0x8003, 57}, - {0x8006, 57}, - {0x800a, 57}, - {0x800f, 57}, - {0x8018, 57}, - {0x801f, 57}, - {0x8029, 57}, - {0xc038, 57}, - }, - /* 22 */ - { - {0x1a, 0}, - {0x1b, 0}, - {0x1d, 0}, - {0x1e, 0}, - {0x21, 0}, - {0x22, 0}, - {0x24, 0}, - {0x25, 0}, - {0x2b, 0}, - {0x2e, 0}, - {0x32, 0}, - {0x35, 0}, - {0x3a, 0}, - {0x3d, 0}, - {0x41, 0}, - {0x4044, 0}, - }, - /* 23 */ - { - {0xc000, 61}, - {0xc000, 65}, - {0xc000, 95}, - {0xc000, 98}, - {0xc000, 100}, - {0xc000, 102}, - {0xc000, 103}, - {0xc000, 104}, - {0xc000, 108}, - {0xc000, 109}, - {0xc000, 110}, - {0xc000, 112}, - {0xc000, 114}, - {0xc000, 117}, - {0x26, 0}, - {0x27, 0}, - }, - /* 24 */ - { - {0x8001, 61}, - {0xc016, 61}, - {0x8001, 65}, - {0xc016, 65}, - {0x8001, 95}, - {0xc016, 95}, - {0x8001, 98}, - {0xc016, 98}, - {0x8001, 100}, - {0xc016, 100}, - {0x8001, 102}, - {0xc016, 102}, - {0x8001, 103}, - {0xc016, 103}, - {0x8001, 104}, - {0xc016, 104}, - }, - /* 25 */ - { - {0x8002, 61}, - {0x8009, 61}, - {0x8017, 61}, - {0xc028, 61}, - {0x8002, 65}, - {0x8009, 65}, - {0x8017, 65}, - {0xc028, 65}, - {0x8002, 95}, - {0x8009, 95}, - {0x8017, 95}, - {0xc028, 95}, - {0x8002, 98}, - {0x8009, 98}, - {0x8017, 98}, - {0xc028, 98}, - }, - /* 26 */ - { - {0x8003, 61}, - {0x8006, 61}, - {0x800a, 61}, - {0x800f, 61}, - {0x8018, 61}, - {0x801f, 61}, - {0x8029, 61}, - {0xc038, 61}, - {0x8003, 65}, - {0x8006, 65}, - {0x800a, 65}, - {0x800f, 65}, - {0x8018, 65}, - {0x801f, 65}, - {0x8029, 65}, - {0xc038, 65}, - }, - /* 27 */ - { - {0x8003, 95}, - {0x8006, 95}, - {0x800a, 95}, - {0x800f, 95}, - {0x8018, 95}, - {0x801f, 95}, - {0x8029, 95}, - {0xc038, 95}, - {0x8003, 98}, - {0x8006, 98}, - {0x800a, 98}, - {0x800f, 98}, - {0x8018, 98}, - {0x801f, 98}, - {0x8029, 98}, - {0xc038, 98}, - }, - /* 28 */ - { - {0x8002, 100}, - {0x8009, 100}, - {0x8017, 100}, - {0xc028, 100}, - {0x8002, 102}, - {0x8009, 102}, - {0x8017, 102}, - {0xc028, 102}, - {0x8002, 103}, - {0x8009, 103}, - {0x8017, 103}, - {0xc028, 103}, - {0x8002, 104}, - {0x8009, 104}, - {0x8017, 104}, - {0xc028, 104}, - }, - /* 29 */ - { - {0x8003, 100}, - {0x8006, 100}, - {0x800a, 100}, - {0x800f, 100}, - {0x8018, 100}, - {0x801f, 100}, - {0x8029, 100}, - {0xc038, 100}, - {0x8003, 102}, - {0x8006, 102}, - {0x800a, 102}, - {0x800f, 102}, - {0x8018, 102}, - {0x801f, 102}, - {0x8029, 102}, - {0xc038, 102}, - }, - /* 30 */ - { - {0x8003, 103}, - {0x8006, 103}, - {0x800a, 103}, - {0x800f, 103}, - {0x8018, 103}, - {0x801f, 103}, - {0x8029, 103}, - {0xc038, 103}, - {0x8003, 104}, - {0x8006, 104}, - {0x800a, 104}, - {0x800f, 104}, - {0x8018, 104}, - {0x801f, 104}, - {0x8029, 104}, - {0xc038, 104}, - }, - /* 31 */ - { - {0x8001, 108}, - {0xc016, 108}, - {0x8001, 109}, - {0xc016, 109}, - {0x8001, 110}, - {0xc016, 110}, - {0x8001, 112}, - {0xc016, 112}, - {0x8001, 114}, - {0xc016, 114}, - {0x8001, 117}, - {0xc016, 117}, - {0xc000, 58}, - {0xc000, 66}, - {0xc000, 67}, - {0xc000, 68}, - }, - /* 32 */ - { - {0x8002, 108}, - {0x8009, 108}, - {0x8017, 108}, - {0xc028, 108}, - {0x8002, 109}, - {0x8009, 109}, - {0x8017, 109}, - {0xc028, 109}, - {0x8002, 110}, - {0x8009, 110}, - {0x8017, 110}, - {0xc028, 110}, - {0x8002, 112}, - {0x8009, 112}, - {0x8017, 112}, - {0xc028, 112}, - }, - /* 33 */ - { - {0x8003, 108}, - {0x8006, 108}, - {0x800a, 108}, - {0x800f, 108}, - {0x8018, 108}, - {0x801f, 108}, - {0x8029, 108}, - {0xc038, 108}, - {0x8003, 109}, - {0x8006, 109}, - {0x800a, 109}, - {0x800f, 109}, - {0x8018, 109}, - {0x801f, 109}, - {0x8029, 109}, - {0xc038, 109}, - }, - /* 34 */ - { - {0x8003, 110}, - {0x8006, 110}, - {0x800a, 110}, - {0x800f, 110}, - {0x8018, 110}, - {0x801f, 110}, - {0x8029, 110}, - {0xc038, 110}, - {0x8003, 112}, - {0x8006, 112}, - {0x800a, 112}, - {0x800f, 112}, - {0x8018, 112}, - {0x801f, 112}, - {0x8029, 112}, - {0xc038, 112}, - }, - /* 35 */ - { - {0x8002, 114}, - {0x8009, 114}, - {0x8017, 114}, - {0xc028, 114}, - {0x8002, 117}, - {0x8009, 117}, - {0x8017, 117}, - {0xc028, 117}, - {0x8001, 58}, - {0xc016, 58}, - {0x8001, 66}, - {0xc016, 66}, - {0x8001, 67}, - {0xc016, 67}, - {0x8001, 68}, - {0xc016, 68}, - }, - /* 36 */ - { - {0x8003, 114}, - {0x8006, 114}, - {0x800a, 114}, - {0x800f, 114}, - {0x8018, 114}, - {0x801f, 114}, - {0x8029, 114}, - {0xc038, 114}, - {0x8003, 117}, - {0x8006, 117}, - {0x800a, 117}, - {0x800f, 117}, - {0x8018, 117}, - {0x801f, 117}, - {0x8029, 117}, - {0xc038, 117}, - }, - /* 37 */ - { - {0x8002, 58}, - {0x8009, 58}, - {0x8017, 58}, - {0xc028, 58}, - {0x8002, 66}, - {0x8009, 66}, - {0x8017, 66}, - {0xc028, 66}, - {0x8002, 67}, - {0x8009, 67}, - {0x8017, 67}, - {0xc028, 67}, - {0x8002, 68}, - {0x8009, 68}, - {0x8017, 68}, - {0xc028, 68}, - }, - /* 38 */ - { - {0x8003, 58}, - {0x8006, 58}, - {0x800a, 58}, - {0x800f, 58}, - {0x8018, 58}, - {0x801f, 58}, - {0x8029, 58}, - {0xc038, 58}, - {0x8003, 66}, - {0x8006, 66}, - {0x800a, 66}, - {0x800f, 66}, - {0x8018, 66}, - {0x801f, 66}, - {0x8029, 66}, - {0xc038, 66}, - }, - /* 39 */ - { - {0x8003, 67}, - {0x8006, 67}, - {0x800a, 67}, - {0x800f, 67}, - {0x8018, 67}, - {0x801f, 67}, - {0x8029, 67}, - {0xc038, 67}, - {0x8003, 68}, - {0x8006, 68}, - {0x800a, 68}, - {0x800f, 68}, - {0x8018, 68}, - {0x801f, 68}, - {0x8029, 68}, - {0xc038, 68}, - }, - /* 40 */ - { - {0x2c, 0}, - {0x2d, 0}, - {0x2f, 0}, - {0x30, 0}, - {0x33, 0}, - {0x34, 0}, - {0x36, 0}, - {0x37, 0}, - {0x3b, 0}, - {0x3c, 0}, - {0x3e, 0}, - {0x3f, 0}, - {0x42, 0}, - {0x43, 0}, - {0x45, 0}, - {0x4048, 0}, - }, - /* 41 */ - { - {0xc000, 69}, - {0xc000, 70}, - {0xc000, 71}, - {0xc000, 72}, - {0xc000, 73}, - {0xc000, 74}, - {0xc000, 75}, - {0xc000, 76}, - {0xc000, 77}, - {0xc000, 78}, - {0xc000, 79}, - {0xc000, 80}, - {0xc000, 81}, - {0xc000, 82}, - {0xc000, 83}, - {0xc000, 84}, - }, - /* 42 */ - { - {0x8001, 69}, - {0xc016, 69}, - {0x8001, 70}, - {0xc016, 70}, - {0x8001, 71}, - {0xc016, 71}, - {0x8001, 72}, - {0xc016, 72}, - {0x8001, 73}, - {0xc016, 73}, - {0x8001, 74}, - {0xc016, 74}, - {0x8001, 75}, - {0xc016, 75}, - {0x8001, 76}, - {0xc016, 76}, - }, - /* 43 */ - { - {0x8002, 69}, - {0x8009, 69}, - {0x8017, 69}, - {0xc028, 69}, - {0x8002, 70}, - {0x8009, 70}, - {0x8017, 70}, - {0xc028, 70}, - {0x8002, 71}, - {0x8009, 71}, - {0x8017, 71}, - {0xc028, 71}, - {0x8002, 72}, - {0x8009, 72}, - {0x8017, 72}, - {0xc028, 72}, - }, - /* 44 */ - { - {0x8003, 69}, - {0x8006, 69}, - {0x800a, 69}, - {0x800f, 69}, - {0x8018, 69}, - {0x801f, 69}, - {0x8029, 69}, - {0xc038, 69}, - {0x8003, 70}, - {0x8006, 70}, - {0x800a, 70}, - {0x800f, 70}, - {0x8018, 70}, - {0x801f, 70}, - {0x8029, 70}, - {0xc038, 70}, - }, - /* 45 */ - { - {0x8003, 71}, - {0x8006, 71}, - {0x800a, 71}, - {0x800f, 71}, - {0x8018, 71}, - {0x801f, 71}, - {0x8029, 71}, - {0xc038, 71}, - {0x8003, 72}, - {0x8006, 72}, - {0x800a, 72}, - {0x800f, 72}, - {0x8018, 72}, - {0x801f, 72}, - {0x8029, 72}, - {0xc038, 72}, - }, - /* 46 */ - { - {0x8002, 73}, - {0x8009, 73}, - {0x8017, 73}, - {0xc028, 73}, - {0x8002, 74}, - {0x8009, 74}, - {0x8017, 74}, - {0xc028, 74}, - {0x8002, 75}, - {0x8009, 75}, - {0x8017, 75}, - {0xc028, 75}, - {0x8002, 76}, - {0x8009, 76}, - {0x8017, 76}, - {0xc028, 76}, - }, - /* 47 */ - { - {0x8003, 73}, - {0x8006, 73}, - {0x800a, 73}, - {0x800f, 73}, - {0x8018, 73}, - {0x801f, 73}, - {0x8029, 73}, - {0xc038, 73}, - {0x8003, 74}, - {0x8006, 74}, - {0x800a, 74}, - {0x800f, 74}, - {0x8018, 74}, - {0x801f, 74}, - {0x8029, 74}, - {0xc038, 74}, - }, - /* 48 */ - { - {0x8003, 75}, - {0x8006, 75}, - {0x800a, 75}, - {0x800f, 75}, - {0x8018, 75}, - {0x801f, 75}, - {0x8029, 75}, - {0xc038, 75}, - {0x8003, 76}, - {0x8006, 76}, - {0x800a, 76}, - {0x800f, 76}, - {0x8018, 76}, - {0x801f, 76}, - {0x8029, 76}, - {0xc038, 76}, - }, - /* 49 */ - { - {0x8001, 77}, - {0xc016, 77}, - {0x8001, 78}, - {0xc016, 78}, - {0x8001, 79}, - {0xc016, 79}, - {0x8001, 80}, - {0xc016, 80}, - {0x8001, 81}, - {0xc016, 81}, - {0x8001, 82}, - {0xc016, 82}, - {0x8001, 83}, - {0xc016, 83}, - {0x8001, 84}, - {0xc016, 84}, - }, - /* 50 */ - { - {0x8002, 77}, - {0x8009, 77}, - {0x8017, 77}, - {0xc028, 77}, - {0x8002, 78}, - {0x8009, 78}, - {0x8017, 78}, - {0xc028, 78}, - {0x8002, 79}, - {0x8009, 79}, - {0x8017, 79}, - {0xc028, 79}, - {0x8002, 80}, - {0x8009, 80}, - {0x8017, 80}, - {0xc028, 80}, - }, - /* 51 */ - { - {0x8003, 77}, - {0x8006, 77}, - {0x800a, 77}, - {0x800f, 77}, - {0x8018, 77}, - {0x801f, 77}, - {0x8029, 77}, - {0xc038, 77}, - {0x8003, 78}, - {0x8006, 78}, - {0x800a, 78}, - {0x800f, 78}, - {0x8018, 78}, - {0x801f, 78}, - {0x8029, 78}, - {0xc038, 78}, - }, - /* 52 */ - { - {0x8003, 79}, - {0x8006, 79}, - {0x800a, 79}, - {0x800f, 79}, - {0x8018, 79}, - {0x801f, 79}, - {0x8029, 79}, - {0xc038, 79}, - {0x8003, 80}, - {0x8006, 80}, - {0x800a, 80}, - {0x800f, 80}, - {0x8018, 80}, - {0x801f, 80}, - {0x8029, 80}, - {0xc038, 80}, - }, - /* 53 */ - { - {0x8002, 81}, - {0x8009, 81}, - {0x8017, 81}, - {0xc028, 81}, - {0x8002, 82}, - {0x8009, 82}, - {0x8017, 82}, - {0xc028, 82}, - {0x8002, 83}, - {0x8009, 83}, - {0x8017, 83}, - {0xc028, 83}, - {0x8002, 84}, - {0x8009, 84}, - {0x8017, 84}, - {0xc028, 84}, - }, - /* 54 */ - { - {0x8003, 81}, - {0x8006, 81}, - {0x800a, 81}, - {0x800f, 81}, - {0x8018, 81}, - {0x801f, 81}, - {0x8029, 81}, - {0xc038, 81}, - {0x8003, 82}, - {0x8006, 82}, - {0x800a, 82}, - {0x800f, 82}, - {0x8018, 82}, - {0x801f, 82}, - {0x8029, 82}, - {0xc038, 82}, - }, - /* 55 */ - { - {0x8003, 83}, - {0x8006, 83}, - {0x800a, 83}, - {0x800f, 83}, - {0x8018, 83}, - {0x801f, 83}, - {0x8029, 83}, - {0xc038, 83}, - {0x8003, 84}, - {0x8006, 84}, - {0x800a, 84}, - {0x800f, 84}, - {0x8018, 84}, - {0x801f, 84}, - {0x8029, 84}, - {0xc038, 84}, - }, - /* 56 */ - { - {0xc000, 85}, - {0xc000, 86}, - {0xc000, 87}, - {0xc000, 89}, - {0xc000, 106}, - {0xc000, 107}, - {0xc000, 113}, - {0xc000, 118}, - {0xc000, 119}, - {0xc000, 120}, - {0xc000, 121}, - {0xc000, 122}, - {0x46, 0}, - {0x47, 0}, - {0x49, 0}, - {0x404a, 0}, - }, - /* 57 */ - { - {0x8001, 85}, - {0xc016, 85}, - {0x8001, 86}, - {0xc016, 86}, - {0x8001, 87}, - {0xc016, 87}, - {0x8001, 89}, - {0xc016, 89}, - {0x8001, 106}, - {0xc016, 106}, - {0x8001, 107}, - {0xc016, 107}, - {0x8001, 113}, - {0xc016, 113}, - {0x8001, 118}, - {0xc016, 118}, - }, - /* 58 */ - { - {0x8002, 85}, - {0x8009, 85}, - {0x8017, 85}, - {0xc028, 85}, - {0x8002, 86}, - {0x8009, 86}, - {0x8017, 86}, - {0xc028, 86}, - {0x8002, 87}, - {0x8009, 87}, - {0x8017, 87}, - {0xc028, 87}, - {0x8002, 89}, - {0x8009, 89}, - {0x8017, 89}, - {0xc028, 89}, - }, - /* 59 */ - { - {0x8003, 85}, - {0x8006, 85}, - {0x800a, 85}, - {0x800f, 85}, - {0x8018, 85}, - {0x801f, 85}, - {0x8029, 85}, - {0xc038, 85}, - {0x8003, 86}, - {0x8006, 86}, - {0x800a, 86}, - {0x800f, 86}, - {0x8018, 86}, - {0x801f, 86}, - {0x8029, 86}, - {0xc038, 86}, - }, - /* 60 */ - { - {0x8003, 87}, - {0x8006, 87}, - {0x800a, 87}, - {0x800f, 87}, - {0x8018, 87}, - {0x801f, 87}, - {0x8029, 87}, - {0xc038, 87}, - {0x8003, 89}, - {0x8006, 89}, - {0x800a, 89}, - {0x800f, 89}, - {0x8018, 89}, - {0x801f, 89}, - {0x8029, 89}, - {0xc038, 89}, - }, - /* 61 */ - { - {0x8002, 106}, - {0x8009, 106}, - {0x8017, 106}, - {0xc028, 106}, - {0x8002, 107}, - {0x8009, 107}, - {0x8017, 107}, - {0xc028, 107}, - {0x8002, 113}, - {0x8009, 113}, - {0x8017, 113}, - {0xc028, 113}, - {0x8002, 118}, - {0x8009, 118}, - {0x8017, 118}, - {0xc028, 118}, - }, - /* 62 */ - { - {0x8003, 106}, - {0x8006, 106}, - {0x800a, 106}, - {0x800f, 106}, - {0x8018, 106}, - {0x801f, 106}, - {0x8029, 106}, - {0xc038, 106}, - {0x8003, 107}, - {0x8006, 107}, - {0x800a, 107}, - {0x800f, 107}, - {0x8018, 107}, - {0x801f, 107}, - {0x8029, 107}, - {0xc038, 107}, - }, - /* 63 */ - { - {0x8003, 113}, - {0x8006, 113}, - {0x800a, 113}, - {0x800f, 113}, - {0x8018, 113}, - {0x801f, 113}, - {0x8029, 113}, - {0xc038, 113}, - {0x8003, 118}, - {0x8006, 118}, - {0x800a, 118}, - {0x800f, 118}, - {0x8018, 118}, - {0x801f, 118}, - {0x8029, 118}, - {0xc038, 118}, - }, - /* 64 */ - { - {0x8001, 119}, - {0xc016, 119}, - {0x8001, 120}, - {0xc016, 120}, - {0x8001, 121}, - {0xc016, 121}, - {0x8001, 122}, - {0xc016, 122}, - {0xc000, 38}, - {0xc000, 42}, - {0xc000, 44}, - {0xc000, 59}, - {0xc000, 88}, - {0xc000, 90}, - {0x4b, 0}, - {0x4e, 0}, - }, - /* 65 */ - { - {0x8002, 119}, - {0x8009, 119}, - {0x8017, 119}, - {0xc028, 119}, - {0x8002, 120}, - {0x8009, 120}, - {0x8017, 120}, - {0xc028, 120}, - {0x8002, 121}, - {0x8009, 121}, - {0x8017, 121}, - {0xc028, 121}, - {0x8002, 122}, - {0x8009, 122}, - {0x8017, 122}, - {0xc028, 122}, - }, - /* 66 */ - { - {0x8003, 119}, - {0x8006, 119}, - {0x800a, 119}, - {0x800f, 119}, - {0x8018, 119}, - {0x801f, 119}, - {0x8029, 119}, - {0xc038, 119}, - {0x8003, 120}, - {0x8006, 120}, - {0x800a, 120}, - {0x800f, 120}, - {0x8018, 120}, - {0x801f, 120}, - {0x8029, 120}, - {0xc038, 120}, - }, - /* 67 */ - { - {0x8003, 121}, - {0x8006, 121}, - {0x800a, 121}, - {0x800f, 121}, - {0x8018, 121}, - {0x801f, 121}, - {0x8029, 121}, - {0xc038, 121}, - {0x8003, 122}, - {0x8006, 122}, - {0x800a, 122}, - {0x800f, 122}, - {0x8018, 122}, - {0x801f, 122}, - {0x8029, 122}, - {0xc038, 122}, - }, - /* 68 */ - { - {0x8001, 38}, - {0xc016, 38}, - {0x8001, 42}, - {0xc016, 42}, - {0x8001, 44}, - {0xc016, 44}, - {0x8001, 59}, - {0xc016, 59}, - {0x8001, 88}, - {0xc016, 88}, - {0x8001, 90}, - {0xc016, 90}, - {0x4c, 0}, - {0x4d, 0}, - {0x4f, 0}, - {0x51, 0}, - }, - /* 69 */ - { - {0x8002, 38}, - {0x8009, 38}, - {0x8017, 38}, - {0xc028, 38}, - {0x8002, 42}, - {0x8009, 42}, - {0x8017, 42}, - {0xc028, 42}, - {0x8002, 44}, - {0x8009, 44}, - {0x8017, 44}, - {0xc028, 44}, - {0x8002, 59}, - {0x8009, 59}, - {0x8017, 59}, - {0xc028, 59}, - }, - /* 70 */ - { - {0x8003, 38}, - {0x8006, 38}, - {0x800a, 38}, - {0x800f, 38}, - {0x8018, 38}, - {0x801f, 38}, - {0x8029, 38}, - {0xc038, 38}, - {0x8003, 42}, - {0x8006, 42}, - {0x800a, 42}, - {0x800f, 42}, - {0x8018, 42}, - {0x801f, 42}, - {0x8029, 42}, - {0xc038, 42}, - }, - /* 71 */ - { - {0x8003, 44}, - {0x8006, 44}, - {0x800a, 44}, - {0x800f, 44}, - {0x8018, 44}, - {0x801f, 44}, - {0x8029, 44}, - {0xc038, 44}, - {0x8003, 59}, - {0x8006, 59}, - {0x800a, 59}, - {0x800f, 59}, - {0x8018, 59}, - {0x801f, 59}, - {0x8029, 59}, - {0xc038, 59}, - }, - /* 72 */ - { - {0x8002, 88}, - {0x8009, 88}, - {0x8017, 88}, - {0xc028, 88}, - {0x8002, 90}, - {0x8009, 90}, - {0x8017, 90}, - {0xc028, 90}, - {0xc000, 33}, - {0xc000, 34}, - {0xc000, 40}, - {0xc000, 41}, - {0xc000, 63}, - {0x50, 0}, - {0x52, 0}, - {0x54, 0}, - }, - /* 73 */ - { - {0x8003, 88}, - {0x8006, 88}, - {0x800a, 88}, - {0x800f, 88}, - {0x8018, 88}, - {0x801f, 88}, - {0x8029, 88}, - {0xc038, 88}, - {0x8003, 90}, - {0x8006, 90}, - {0x800a, 90}, - {0x800f, 90}, - {0x8018, 90}, - {0x801f, 90}, - {0x8029, 90}, - {0xc038, 90}, - }, - /* 74 */ - { - {0x8001, 33}, - {0xc016, 33}, - {0x8001, 34}, - {0xc016, 34}, - {0x8001, 40}, - {0xc016, 40}, - {0x8001, 41}, - {0xc016, 41}, - {0x8001, 63}, - {0xc016, 63}, - {0xc000, 39}, - {0xc000, 43}, - {0xc000, 124}, - {0x53, 0}, - {0x55, 0}, - {0x58, 0}, - }, - /* 75 */ - { - {0x8002, 33}, - {0x8009, 33}, - {0x8017, 33}, - {0xc028, 33}, - {0x8002, 34}, - {0x8009, 34}, - {0x8017, 34}, - {0xc028, 34}, - {0x8002, 40}, - {0x8009, 40}, - {0x8017, 40}, - {0xc028, 40}, - {0x8002, 41}, - {0x8009, 41}, - {0x8017, 41}, - {0xc028, 41}, - }, - /* 76 */ - { - {0x8003, 33}, - {0x8006, 33}, - {0x800a, 33}, - {0x800f, 33}, - {0x8018, 33}, - {0x801f, 33}, - {0x8029, 33}, - {0xc038, 33}, - {0x8003, 34}, - {0x8006, 34}, - {0x800a, 34}, - {0x800f, 34}, - {0x8018, 34}, - {0x801f, 34}, - {0x8029, 34}, - {0xc038, 34}, - }, - /* 77 */ - { - {0x8003, 40}, - {0x8006, 40}, - {0x800a, 40}, - {0x800f, 40}, - {0x8018, 40}, - {0x801f, 40}, - {0x8029, 40}, - {0xc038, 40}, - {0x8003, 41}, - {0x8006, 41}, - {0x800a, 41}, - {0x800f, 41}, - {0x8018, 41}, - {0x801f, 41}, - {0x8029, 41}, - {0xc038, 41}, - }, - /* 78 */ - { - {0x8002, 63}, - {0x8009, 63}, - {0x8017, 63}, - {0xc028, 63}, - {0x8001, 39}, - {0xc016, 39}, - {0x8001, 43}, - {0xc016, 43}, - {0x8001, 124}, - {0xc016, 124}, - {0xc000, 35}, - {0xc000, 62}, - {0x56, 0}, - {0x57, 0}, - {0x59, 0}, - {0x5a, 0}, - }, - /* 79 */ - { - {0x8003, 63}, - {0x8006, 63}, - {0x800a, 63}, - {0x800f, 63}, - {0x8018, 63}, - {0x801f, 63}, - {0x8029, 63}, - {0xc038, 63}, - {0x8002, 39}, - {0x8009, 39}, - {0x8017, 39}, - {0xc028, 39}, - {0x8002, 43}, - {0x8009, 43}, - {0x8017, 43}, - {0xc028, 43}, - }, - /* 80 */ - { - {0x8003, 39}, - {0x8006, 39}, - {0x800a, 39}, - {0x800f, 39}, - {0x8018, 39}, - {0x801f, 39}, - {0x8029, 39}, - {0xc038, 39}, - {0x8003, 43}, - {0x8006, 43}, - {0x800a, 43}, - {0x800f, 43}, - {0x8018, 43}, - {0x801f, 43}, - {0x8029, 43}, - {0xc038, 43}, - }, - /* 81 */ - { - {0x8002, 124}, - {0x8009, 124}, - {0x8017, 124}, - {0xc028, 124}, - {0x8001, 35}, - {0xc016, 35}, - {0x8001, 62}, - {0xc016, 62}, - {0xc000, 0}, - {0xc000, 36}, - {0xc000, 64}, - {0xc000, 91}, - {0xc000, 93}, - {0xc000, 126}, - {0x5b, 0}, - {0x5c, 0}, - }, - /* 82 */ - { - {0x8003, 124}, - {0x8006, 124}, - {0x800a, 124}, - {0x800f, 124}, - {0x8018, 124}, - {0x801f, 124}, - {0x8029, 124}, - {0xc038, 124}, - {0x8002, 35}, - {0x8009, 35}, - {0x8017, 35}, - {0xc028, 35}, - {0x8002, 62}, - {0x8009, 62}, - {0x8017, 62}, - {0xc028, 62}, - }, - /* 83 */ - { - {0x8003, 35}, - {0x8006, 35}, - {0x800a, 35}, - {0x800f, 35}, - {0x8018, 35}, - {0x801f, 35}, - {0x8029, 35}, - {0xc038, 35}, - {0x8003, 62}, - {0x8006, 62}, - {0x800a, 62}, - {0x800f, 62}, - {0x8018, 62}, - {0x801f, 62}, - {0x8029, 62}, - {0xc038, 62}, - }, - /* 84 */ - { - {0x8001, 0}, - {0xc016, 0}, - {0x8001, 36}, - {0xc016, 36}, - {0x8001, 64}, - {0xc016, 64}, - {0x8001, 91}, - {0xc016, 91}, - {0x8001, 93}, - {0xc016, 93}, - {0x8001, 126}, - {0xc016, 126}, - {0xc000, 94}, - {0xc000, 125}, - {0x5d, 0}, - {0x5e, 0}, - }, - /* 85 */ - { - {0x8002, 0}, - {0x8009, 0}, - {0x8017, 0}, - {0xc028, 0}, - {0x8002, 36}, - {0x8009, 36}, - {0x8017, 36}, - {0xc028, 36}, - {0x8002, 64}, - {0x8009, 64}, - {0x8017, 64}, - {0xc028, 64}, - {0x8002, 91}, - {0x8009, 91}, - {0x8017, 91}, - {0xc028, 91}, - }, - /* 86 */ - { - {0x8003, 0}, - {0x8006, 0}, - {0x800a, 0}, - {0x800f, 0}, - {0x8018, 0}, - {0x801f, 0}, - {0x8029, 0}, - {0xc038, 0}, - {0x8003, 36}, - {0x8006, 36}, - {0x800a, 36}, - {0x800f, 36}, - {0x8018, 36}, - {0x801f, 36}, - {0x8029, 36}, - {0xc038, 36}, - }, - /* 87 */ - { - {0x8003, 64}, - {0x8006, 64}, - {0x800a, 64}, - {0x800f, 64}, - {0x8018, 64}, - {0x801f, 64}, - {0x8029, 64}, - {0xc038, 64}, - {0x8003, 91}, - {0x8006, 91}, - {0x800a, 91}, - {0x800f, 91}, - {0x8018, 91}, - {0x801f, 91}, - {0x8029, 91}, - {0xc038, 91}, - }, - /* 88 */ - { - {0x8002, 93}, - {0x8009, 93}, - {0x8017, 93}, - {0xc028, 93}, - {0x8002, 126}, - {0x8009, 126}, - {0x8017, 126}, - {0xc028, 126}, - {0x8001, 94}, - {0xc016, 94}, - {0x8001, 125}, - {0xc016, 125}, - {0xc000, 60}, - {0xc000, 96}, - {0xc000, 123}, - {0x5f, 0}, - }, - /* 89 */ - { - {0x8003, 93}, - {0x8006, 93}, - {0x800a, 93}, - {0x800f, 93}, - {0x8018, 93}, - {0x801f, 93}, - {0x8029, 93}, - {0xc038, 93}, - {0x8003, 126}, - {0x8006, 126}, - {0x800a, 126}, - {0x800f, 126}, - {0x8018, 126}, - {0x801f, 126}, - {0x8029, 126}, - {0xc038, 126}, - }, - /* 90 */ - { - {0x8002, 94}, - {0x8009, 94}, - {0x8017, 94}, - {0xc028, 94}, - {0x8002, 125}, - {0x8009, 125}, - {0x8017, 125}, - {0xc028, 125}, - {0x8001, 60}, - {0xc016, 60}, - {0x8001, 96}, - {0xc016, 96}, - {0x8001, 123}, - {0xc016, 123}, - {0x60, 0}, - {0x6e, 0}, - }, - /* 91 */ - { - {0x8003, 94}, - {0x8006, 94}, - {0x800a, 94}, - {0x800f, 94}, - {0x8018, 94}, - {0x801f, 94}, - {0x8029, 94}, - {0xc038, 94}, - {0x8003, 125}, - {0x8006, 125}, - {0x800a, 125}, - {0x800f, 125}, - {0x8018, 125}, - {0x801f, 125}, - {0x8029, 125}, - {0xc038, 125}, - }, - /* 92 */ - { - {0x8002, 60}, - {0x8009, 60}, - {0x8017, 60}, - {0xc028, 60}, - {0x8002, 96}, - {0x8009, 96}, - {0x8017, 96}, - {0xc028, 96}, - {0x8002, 123}, - {0x8009, 123}, - {0x8017, 123}, - {0xc028, 123}, - {0x61, 0}, - {0x65, 0}, - {0x6f, 0}, - {0x85, 0}, - }, - /* 93 */ - { - {0x8003, 60}, - {0x8006, 60}, - {0x800a, 60}, - {0x800f, 60}, - {0x8018, 60}, - {0x801f, 60}, - {0x8029, 60}, - {0xc038, 60}, - {0x8003, 96}, - {0x8006, 96}, - {0x800a, 96}, - {0x800f, 96}, - {0x8018, 96}, - {0x801f, 96}, - {0x8029, 96}, - {0xc038, 96}, - }, - /* 94 */ - { - {0x8003, 123}, - {0x8006, 123}, - {0x800a, 123}, - {0x800f, 123}, - {0x8018, 123}, - {0x801f, 123}, - {0x8029, 123}, - {0xc038, 123}, - {0x62, 0}, - {0x63, 0}, - {0x66, 0}, - {0x69, 0}, - {0x70, 0}, - {0x77, 0}, - {0x86, 0}, - {0x99, 0}, - }, - /* 95 */ - { - {0xc000, 92}, - {0xc000, 195}, - {0xc000, 208}, - {0x64, 0}, - {0x67, 0}, - {0x68, 0}, - {0x6a, 0}, - {0x6b, 0}, - {0x71, 0}, - {0x74, 0}, - {0x78, 0}, - {0x7e, 0}, - {0x87, 0}, - {0x8e, 0}, - {0x9a, 0}, - {0xa9, 0}, - }, - /* 96 */ - { - {0x8001, 92}, - {0xc016, 92}, - {0x8001, 195}, - {0xc016, 195}, - {0x8001, 208}, - {0xc016, 208}, - {0xc000, 128}, - {0xc000, 130}, - {0xc000, 131}, - {0xc000, 162}, - {0xc000, 184}, - {0xc000, 194}, - {0xc000, 224}, - {0xc000, 226}, - {0x6c, 0}, - {0x6d, 0}, - }, - /* 97 */ - { - {0x8002, 92}, - {0x8009, 92}, - {0x8017, 92}, - {0xc028, 92}, - {0x8002, 195}, - {0x8009, 195}, - {0x8017, 195}, - {0xc028, 195}, - {0x8002, 208}, - {0x8009, 208}, - {0x8017, 208}, - {0xc028, 208}, - {0x8001, 128}, - {0xc016, 128}, - {0x8001, 130}, - {0xc016, 130}, - }, - /* 98 */ - { - {0x8003, 92}, - {0x8006, 92}, - {0x800a, 92}, - {0x800f, 92}, - {0x8018, 92}, - {0x801f, 92}, - {0x8029, 92}, - {0xc038, 92}, - {0x8003, 195}, - {0x8006, 195}, - {0x800a, 195}, - {0x800f, 195}, - {0x8018, 195}, - {0x801f, 195}, - {0x8029, 195}, - {0xc038, 195}, - }, - /* 99 */ - { - {0x8003, 208}, - {0x8006, 208}, - {0x800a, 208}, - {0x800f, 208}, - {0x8018, 208}, - {0x801f, 208}, - {0x8029, 208}, - {0xc038, 208}, - {0x8002, 128}, - {0x8009, 128}, - {0x8017, 128}, - {0xc028, 128}, - {0x8002, 130}, - {0x8009, 130}, - {0x8017, 130}, - {0xc028, 130}, - }, - /* 100 */ - { - {0x8003, 128}, - {0x8006, 128}, - {0x800a, 128}, - {0x800f, 128}, - {0x8018, 128}, - {0x801f, 128}, - {0x8029, 128}, - {0xc038, 128}, - {0x8003, 130}, - {0x8006, 130}, - {0x800a, 130}, - {0x800f, 130}, - {0x8018, 130}, - {0x801f, 130}, - {0x8029, 130}, - {0xc038, 130}, - }, - /* 101 */ - { - {0x8001, 131}, - {0xc016, 131}, - {0x8001, 162}, - {0xc016, 162}, - {0x8001, 184}, - {0xc016, 184}, - {0x8001, 194}, - {0xc016, 194}, - {0x8001, 224}, - {0xc016, 224}, - {0x8001, 226}, - {0xc016, 226}, - {0xc000, 153}, - {0xc000, 161}, - {0xc000, 167}, - {0xc000, 172}, - }, - /* 102 */ - { - {0x8002, 131}, - {0x8009, 131}, - {0x8017, 131}, - {0xc028, 131}, - {0x8002, 162}, - {0x8009, 162}, - {0x8017, 162}, - {0xc028, 162}, - {0x8002, 184}, - {0x8009, 184}, - {0x8017, 184}, - {0xc028, 184}, - {0x8002, 194}, - {0x8009, 194}, - {0x8017, 194}, - {0xc028, 194}, - }, - /* 103 */ - { - {0x8003, 131}, - {0x8006, 131}, - {0x800a, 131}, - {0x800f, 131}, - {0x8018, 131}, - {0x801f, 131}, - {0x8029, 131}, - {0xc038, 131}, - {0x8003, 162}, - {0x8006, 162}, - {0x800a, 162}, - {0x800f, 162}, - {0x8018, 162}, - {0x801f, 162}, - {0x8029, 162}, - {0xc038, 162}, - }, - /* 104 */ - { - {0x8003, 184}, - {0x8006, 184}, - {0x800a, 184}, - {0x800f, 184}, - {0x8018, 184}, - {0x801f, 184}, - {0x8029, 184}, - {0xc038, 184}, - {0x8003, 194}, - {0x8006, 194}, - {0x800a, 194}, - {0x800f, 194}, - {0x8018, 194}, - {0x801f, 194}, - {0x8029, 194}, - {0xc038, 194}, - }, - /* 105 */ - { - {0x8002, 224}, - {0x8009, 224}, - {0x8017, 224}, - {0xc028, 224}, - {0x8002, 226}, - {0x8009, 226}, - {0x8017, 226}, - {0xc028, 226}, - {0x8001, 153}, - {0xc016, 153}, - {0x8001, 161}, - {0xc016, 161}, - {0x8001, 167}, - {0xc016, 167}, - {0x8001, 172}, - {0xc016, 172}, - }, - /* 106 */ - { - {0x8003, 224}, - {0x8006, 224}, - {0x800a, 224}, - {0x800f, 224}, - {0x8018, 224}, - {0x801f, 224}, - {0x8029, 224}, - {0xc038, 224}, - {0x8003, 226}, - {0x8006, 226}, - {0x800a, 226}, - {0x800f, 226}, - {0x8018, 226}, - {0x801f, 226}, - {0x8029, 226}, - {0xc038, 226}, - }, - /* 107 */ - { - {0x8002, 153}, - {0x8009, 153}, - {0x8017, 153}, - {0xc028, 153}, - {0x8002, 161}, - {0x8009, 161}, - {0x8017, 161}, - {0xc028, 161}, - {0x8002, 167}, - {0x8009, 167}, - {0x8017, 167}, - {0xc028, 167}, - {0x8002, 172}, - {0x8009, 172}, - {0x8017, 172}, - {0xc028, 172}, - }, - /* 108 */ - { - {0x8003, 153}, - {0x8006, 153}, - {0x800a, 153}, - {0x800f, 153}, - {0x8018, 153}, - {0x801f, 153}, - {0x8029, 153}, - {0xc038, 153}, - {0x8003, 161}, - {0x8006, 161}, - {0x800a, 161}, - {0x800f, 161}, - {0x8018, 161}, - {0x801f, 161}, - {0x8029, 161}, - {0xc038, 161}, - }, - /* 109 */ - { - {0x8003, 167}, - {0x8006, 167}, - {0x800a, 167}, - {0x800f, 167}, - {0x8018, 167}, - {0x801f, 167}, - {0x8029, 167}, - {0xc038, 167}, - {0x8003, 172}, - {0x8006, 172}, - {0x800a, 172}, - {0x800f, 172}, - {0x8018, 172}, - {0x801f, 172}, - {0x8029, 172}, - {0xc038, 172}, - }, - /* 110 */ - { - {0x72, 0}, - {0x73, 0}, - {0x75, 0}, - {0x76, 0}, - {0x79, 0}, - {0x7b, 0}, - {0x7f, 0}, - {0x82, 0}, - {0x88, 0}, - {0x8b, 0}, - {0x8f, 0}, - {0x92, 0}, - {0x9b, 0}, - {0xa2, 0}, - {0xaa, 0}, - {0xb4, 0}, - }, - /* 111 */ - { - {0xc000, 176}, - {0xc000, 177}, - {0xc000, 179}, - {0xc000, 209}, - {0xc000, 216}, - {0xc000, 217}, - {0xc000, 227}, - {0xc000, 229}, - {0xc000, 230}, - {0x7a, 0}, - {0x7c, 0}, - {0x7d, 0}, - {0x80, 0}, - {0x81, 0}, - {0x83, 0}, - {0x84, 0}, - }, - /* 112 */ - { - {0x8001, 176}, - {0xc016, 176}, - {0x8001, 177}, - {0xc016, 177}, - {0x8001, 179}, - {0xc016, 179}, - {0x8001, 209}, - {0xc016, 209}, - {0x8001, 216}, - {0xc016, 216}, - {0x8001, 217}, - {0xc016, 217}, - {0x8001, 227}, - {0xc016, 227}, - {0x8001, 229}, - {0xc016, 229}, - }, - /* 113 */ - { - {0x8002, 176}, - {0x8009, 176}, - {0x8017, 176}, - {0xc028, 176}, - {0x8002, 177}, - {0x8009, 177}, - {0x8017, 177}, - {0xc028, 177}, - {0x8002, 179}, - {0x8009, 179}, - {0x8017, 179}, - {0xc028, 179}, - {0x8002, 209}, - {0x8009, 209}, - {0x8017, 209}, - {0xc028, 209}, - }, - /* 114 */ - { - {0x8003, 176}, - {0x8006, 176}, - {0x800a, 176}, - {0x800f, 176}, - {0x8018, 176}, - {0x801f, 176}, - {0x8029, 176}, - {0xc038, 176}, - {0x8003, 177}, - {0x8006, 177}, - {0x800a, 177}, - {0x800f, 177}, - {0x8018, 177}, - {0x801f, 177}, - {0x8029, 177}, - {0xc038, 177}, - }, - /* 115 */ - { - {0x8003, 179}, - {0x8006, 179}, - {0x800a, 179}, - {0x800f, 179}, - {0x8018, 179}, - {0x801f, 179}, - {0x8029, 179}, - {0xc038, 179}, - {0x8003, 209}, - {0x8006, 209}, - {0x800a, 209}, - {0x800f, 209}, - {0x8018, 209}, - {0x801f, 209}, - {0x8029, 209}, - {0xc038, 209}, - }, - /* 116 */ - { - {0x8002, 216}, - {0x8009, 216}, - {0x8017, 216}, - {0xc028, 216}, - {0x8002, 217}, - {0x8009, 217}, - {0x8017, 217}, - {0xc028, 217}, - {0x8002, 227}, - {0x8009, 227}, - {0x8017, 227}, - {0xc028, 227}, - {0x8002, 229}, - {0x8009, 229}, - {0x8017, 229}, - {0xc028, 229}, - }, - /* 117 */ - { - {0x8003, 216}, - {0x8006, 216}, - {0x800a, 216}, - {0x800f, 216}, - {0x8018, 216}, - {0x801f, 216}, - {0x8029, 216}, - {0xc038, 216}, - {0x8003, 217}, - {0x8006, 217}, - {0x800a, 217}, - {0x800f, 217}, - {0x8018, 217}, - {0x801f, 217}, - {0x8029, 217}, - {0xc038, 217}, - }, - /* 118 */ - { - {0x8003, 227}, - {0x8006, 227}, - {0x800a, 227}, - {0x800f, 227}, - {0x8018, 227}, - {0x801f, 227}, - {0x8029, 227}, - {0xc038, 227}, - {0x8003, 229}, - {0x8006, 229}, - {0x800a, 229}, - {0x800f, 229}, - {0x8018, 229}, - {0x801f, 229}, - {0x8029, 229}, - {0xc038, 229}, - }, - /* 119 */ - { - {0x8001, 230}, - {0xc016, 230}, - {0xc000, 129}, - {0xc000, 132}, - {0xc000, 133}, - {0xc000, 134}, - {0xc000, 136}, - {0xc000, 146}, - {0xc000, 154}, - {0xc000, 156}, - {0xc000, 160}, - {0xc000, 163}, - {0xc000, 164}, - {0xc000, 169}, - {0xc000, 170}, - {0xc000, 173}, - }, - /* 120 */ - { - {0x8002, 230}, - {0x8009, 230}, - {0x8017, 230}, - {0xc028, 230}, - {0x8001, 129}, - {0xc016, 129}, - {0x8001, 132}, - {0xc016, 132}, - {0x8001, 133}, - {0xc016, 133}, - {0x8001, 134}, - {0xc016, 134}, - {0x8001, 136}, - {0xc016, 136}, - {0x8001, 146}, - {0xc016, 146}, - }, - /* 121 */ - { - {0x8003, 230}, - {0x8006, 230}, - {0x800a, 230}, - {0x800f, 230}, - {0x8018, 230}, - {0x801f, 230}, - {0x8029, 230}, - {0xc038, 230}, - {0x8002, 129}, - {0x8009, 129}, - {0x8017, 129}, - {0xc028, 129}, - {0x8002, 132}, - {0x8009, 132}, - {0x8017, 132}, - {0xc028, 132}, - }, - /* 122 */ - { - {0x8003, 129}, - {0x8006, 129}, - {0x800a, 129}, - {0x800f, 129}, - {0x8018, 129}, - {0x801f, 129}, - {0x8029, 129}, - {0xc038, 129}, - {0x8003, 132}, - {0x8006, 132}, - {0x800a, 132}, - {0x800f, 132}, - {0x8018, 132}, - {0x801f, 132}, - {0x8029, 132}, - {0xc038, 132}, - }, - /* 123 */ - { - {0x8002, 133}, - {0x8009, 133}, - {0x8017, 133}, - {0xc028, 133}, - {0x8002, 134}, - {0x8009, 134}, - {0x8017, 134}, - {0xc028, 134}, - {0x8002, 136}, - {0x8009, 136}, - {0x8017, 136}, - {0xc028, 136}, - {0x8002, 146}, - {0x8009, 146}, - {0x8017, 146}, - {0xc028, 146}, - }, - /* 124 */ - { - {0x8003, 133}, - {0x8006, 133}, - {0x800a, 133}, - {0x800f, 133}, - {0x8018, 133}, - {0x801f, 133}, - {0x8029, 133}, - {0xc038, 133}, - {0x8003, 134}, - {0x8006, 134}, - {0x800a, 134}, - {0x800f, 134}, - {0x8018, 134}, - {0x801f, 134}, - {0x8029, 134}, - {0xc038, 134}, - }, - /* 125 */ - { - {0x8003, 136}, - {0x8006, 136}, - {0x800a, 136}, - {0x800f, 136}, - {0x8018, 136}, - {0x801f, 136}, - {0x8029, 136}, - {0xc038, 136}, - {0x8003, 146}, - {0x8006, 146}, - {0x800a, 146}, - {0x800f, 146}, - {0x8018, 146}, - {0x801f, 146}, - {0x8029, 146}, - {0xc038, 146}, - }, - /* 126 */ - { - {0x8001, 154}, - {0xc016, 154}, - {0x8001, 156}, - {0xc016, 156}, - {0x8001, 160}, - {0xc016, 160}, - {0x8001, 163}, - {0xc016, 163}, - {0x8001, 164}, - {0xc016, 164}, - {0x8001, 169}, - {0xc016, 169}, - {0x8001, 170}, - {0xc016, 170}, - {0x8001, 173}, - {0xc016, 173}, - }, - /* 127 */ - { - {0x8002, 154}, - {0x8009, 154}, - {0x8017, 154}, - {0xc028, 154}, - {0x8002, 156}, - {0x8009, 156}, - {0x8017, 156}, - {0xc028, 156}, - {0x8002, 160}, - {0x8009, 160}, - {0x8017, 160}, - {0xc028, 160}, - {0x8002, 163}, - {0x8009, 163}, - {0x8017, 163}, - {0xc028, 163}, - }, - /* 128 */ - { - {0x8003, 154}, - {0x8006, 154}, - {0x800a, 154}, - {0x800f, 154}, - {0x8018, 154}, - {0x801f, 154}, - {0x8029, 154}, - {0xc038, 154}, - {0x8003, 156}, - {0x8006, 156}, - {0x800a, 156}, - {0x800f, 156}, - {0x8018, 156}, - {0x801f, 156}, - {0x8029, 156}, - {0xc038, 156}, - }, - /* 129 */ - { - {0x8003, 160}, - {0x8006, 160}, - {0x800a, 160}, - {0x800f, 160}, - {0x8018, 160}, - {0x801f, 160}, - {0x8029, 160}, - {0xc038, 160}, - {0x8003, 163}, - {0x8006, 163}, - {0x800a, 163}, - {0x800f, 163}, - {0x8018, 163}, - {0x801f, 163}, - {0x8029, 163}, - {0xc038, 163}, - }, - /* 130 */ - { - {0x8002, 164}, - {0x8009, 164}, - {0x8017, 164}, - {0xc028, 164}, - {0x8002, 169}, - {0x8009, 169}, - {0x8017, 169}, - {0xc028, 169}, - {0x8002, 170}, - {0x8009, 170}, - {0x8017, 170}, - {0xc028, 170}, - {0x8002, 173}, - {0x8009, 173}, - {0x8017, 173}, - {0xc028, 173}, - }, - /* 131 */ - { - {0x8003, 164}, - {0x8006, 164}, - {0x800a, 164}, - {0x800f, 164}, - {0x8018, 164}, - {0x801f, 164}, - {0x8029, 164}, - {0xc038, 164}, - {0x8003, 169}, - {0x8006, 169}, - {0x800a, 169}, - {0x800f, 169}, - {0x8018, 169}, - {0x801f, 169}, - {0x8029, 169}, - {0xc038, 169}, - }, - /* 132 */ - { - {0x8003, 170}, - {0x8006, 170}, - {0x800a, 170}, - {0x800f, 170}, - {0x8018, 170}, - {0x801f, 170}, - {0x8029, 170}, - {0xc038, 170}, - {0x8003, 173}, - {0x8006, 173}, - {0x800a, 173}, - {0x800f, 173}, - {0x8018, 173}, - {0x801f, 173}, - {0x8029, 173}, - {0xc038, 173}, - }, - /* 133 */ - { - {0x89, 0}, - {0x8a, 0}, - {0x8c, 0}, - {0x8d, 0}, - {0x90, 0}, - {0x91, 0}, - {0x93, 0}, - {0x96, 0}, - {0x9c, 0}, - {0x9f, 0}, - {0xa3, 0}, - {0xa6, 0}, - {0xab, 0}, - {0xae, 0}, - {0xb5, 0}, - {0xbe, 0}, - }, - /* 134 */ - { - {0xc000, 178}, - {0xc000, 181}, - {0xc000, 185}, - {0xc000, 186}, - {0xc000, 187}, - {0xc000, 189}, - {0xc000, 190}, - {0xc000, 196}, - {0xc000, 198}, - {0xc000, 228}, - {0xc000, 232}, - {0xc000, 233}, - {0x94, 0}, - {0x95, 0}, - {0x97, 0}, - {0x98, 0}, - }, - /* 135 */ - { - {0x8001, 178}, - {0xc016, 178}, - {0x8001, 181}, - {0xc016, 181}, - {0x8001, 185}, - {0xc016, 185}, - {0x8001, 186}, - {0xc016, 186}, - {0x8001, 187}, - {0xc016, 187}, - {0x8001, 189}, - {0xc016, 189}, - {0x8001, 190}, - {0xc016, 190}, - {0x8001, 196}, - {0xc016, 196}, - }, - /* 136 */ - { - {0x8002, 178}, - {0x8009, 178}, - {0x8017, 178}, - {0xc028, 178}, - {0x8002, 181}, - {0x8009, 181}, - {0x8017, 181}, - {0xc028, 181}, - {0x8002, 185}, - {0x8009, 185}, - {0x8017, 185}, - {0xc028, 185}, - {0x8002, 186}, - {0x8009, 186}, - {0x8017, 186}, - {0xc028, 186}, - }, - /* 137 */ - { - {0x8003, 178}, - {0x8006, 178}, - {0x800a, 178}, - {0x800f, 178}, - {0x8018, 178}, - {0x801f, 178}, - {0x8029, 178}, - {0xc038, 178}, - {0x8003, 181}, - {0x8006, 181}, - {0x800a, 181}, - {0x800f, 181}, - {0x8018, 181}, - {0x801f, 181}, - {0x8029, 181}, - {0xc038, 181}, - }, - /* 138 */ - { - {0x8003, 185}, - {0x8006, 185}, - {0x800a, 185}, - {0x800f, 185}, - {0x8018, 185}, - {0x801f, 185}, - {0x8029, 185}, - {0xc038, 185}, - {0x8003, 186}, - {0x8006, 186}, - {0x800a, 186}, - {0x800f, 186}, - {0x8018, 186}, - {0x801f, 186}, - {0x8029, 186}, - {0xc038, 186}, - }, - /* 139 */ - { - {0x8002, 187}, - {0x8009, 187}, - {0x8017, 187}, - {0xc028, 187}, - {0x8002, 189}, - {0x8009, 189}, - {0x8017, 189}, - {0xc028, 189}, - {0x8002, 190}, - {0x8009, 190}, - {0x8017, 190}, - {0xc028, 190}, - {0x8002, 196}, - {0x8009, 196}, - {0x8017, 196}, - {0xc028, 196}, - }, - /* 140 */ - { - {0x8003, 187}, - {0x8006, 187}, - {0x800a, 187}, - {0x800f, 187}, - {0x8018, 187}, - {0x801f, 187}, - {0x8029, 187}, - {0xc038, 187}, - {0x8003, 189}, - {0x8006, 189}, - {0x800a, 189}, - {0x800f, 189}, - {0x8018, 189}, - {0x801f, 189}, - {0x8029, 189}, - {0xc038, 189}, - }, - /* 141 */ - { - {0x8003, 190}, - {0x8006, 190}, - {0x800a, 190}, - {0x800f, 190}, - {0x8018, 190}, - {0x801f, 190}, - {0x8029, 190}, - {0xc038, 190}, - {0x8003, 196}, - {0x8006, 196}, - {0x800a, 196}, - {0x800f, 196}, - {0x8018, 196}, - {0x801f, 196}, - {0x8029, 196}, - {0xc038, 196}, - }, - /* 142 */ - { - {0x8001, 198}, - {0xc016, 198}, - {0x8001, 228}, - {0xc016, 228}, - {0x8001, 232}, - {0xc016, 232}, - {0x8001, 233}, - {0xc016, 233}, - {0xc000, 1}, - {0xc000, 135}, - {0xc000, 137}, - {0xc000, 138}, - {0xc000, 139}, - {0xc000, 140}, - {0xc000, 141}, - {0xc000, 143}, - }, - /* 143 */ - { - {0x8002, 198}, - {0x8009, 198}, - {0x8017, 198}, - {0xc028, 198}, - {0x8002, 228}, - {0x8009, 228}, - {0x8017, 228}, - {0xc028, 228}, - {0x8002, 232}, - {0x8009, 232}, - {0x8017, 232}, - {0xc028, 232}, - {0x8002, 233}, - {0x8009, 233}, - {0x8017, 233}, - {0xc028, 233}, - }, - /* 144 */ - { - {0x8003, 198}, - {0x8006, 198}, - {0x800a, 198}, - {0x800f, 198}, - {0x8018, 198}, - {0x801f, 198}, - {0x8029, 198}, - {0xc038, 198}, - {0x8003, 228}, - {0x8006, 228}, - {0x800a, 228}, - {0x800f, 228}, - {0x8018, 228}, - {0x801f, 228}, - {0x8029, 228}, - {0xc038, 228}, - }, - /* 145 */ - { - {0x8003, 232}, - {0x8006, 232}, - {0x800a, 232}, - {0x800f, 232}, - {0x8018, 232}, - {0x801f, 232}, - {0x8029, 232}, - {0xc038, 232}, - {0x8003, 233}, - {0x8006, 233}, - {0x800a, 233}, - {0x800f, 233}, - {0x8018, 233}, - {0x801f, 233}, - {0x8029, 233}, - {0xc038, 233}, - }, - /* 146 */ - { - {0x8001, 1}, - {0xc016, 1}, - {0x8001, 135}, - {0xc016, 135}, - {0x8001, 137}, - {0xc016, 137}, - {0x8001, 138}, - {0xc016, 138}, - {0x8001, 139}, - {0xc016, 139}, - {0x8001, 140}, - {0xc016, 140}, - {0x8001, 141}, - {0xc016, 141}, - {0x8001, 143}, - {0xc016, 143}, - }, - /* 147 */ - { - {0x8002, 1}, - {0x8009, 1}, - {0x8017, 1}, - {0xc028, 1}, - {0x8002, 135}, - {0x8009, 135}, - {0x8017, 135}, - {0xc028, 135}, - {0x8002, 137}, - {0x8009, 137}, - {0x8017, 137}, - {0xc028, 137}, - {0x8002, 138}, - {0x8009, 138}, - {0x8017, 138}, - {0xc028, 138}, - }, - /* 148 */ - { - {0x8003, 1}, - {0x8006, 1}, - {0x800a, 1}, - {0x800f, 1}, - {0x8018, 1}, - {0x801f, 1}, - {0x8029, 1}, - {0xc038, 1}, - {0x8003, 135}, - {0x8006, 135}, - {0x800a, 135}, - {0x800f, 135}, - {0x8018, 135}, - {0x801f, 135}, - {0x8029, 135}, - {0xc038, 135}, - }, - /* 149 */ - { - {0x8003, 137}, - {0x8006, 137}, - {0x800a, 137}, - {0x800f, 137}, - {0x8018, 137}, - {0x801f, 137}, - {0x8029, 137}, - {0xc038, 137}, - {0x8003, 138}, - {0x8006, 138}, - {0x800a, 138}, - {0x800f, 138}, - {0x8018, 138}, - {0x801f, 138}, - {0x8029, 138}, - {0xc038, 138}, - }, - /* 150 */ - { - {0x8002, 139}, - {0x8009, 139}, - {0x8017, 139}, - {0xc028, 139}, - {0x8002, 140}, - {0x8009, 140}, - {0x8017, 140}, - {0xc028, 140}, - {0x8002, 141}, - {0x8009, 141}, - {0x8017, 141}, - {0xc028, 141}, - {0x8002, 143}, - {0x8009, 143}, - {0x8017, 143}, - {0xc028, 143}, - }, - /* 151 */ - { - {0x8003, 139}, - {0x8006, 139}, - {0x800a, 139}, - {0x800f, 139}, - {0x8018, 139}, - {0x801f, 139}, - {0x8029, 139}, - {0xc038, 139}, - {0x8003, 140}, - {0x8006, 140}, - {0x800a, 140}, - {0x800f, 140}, - {0x8018, 140}, - {0x801f, 140}, - {0x8029, 140}, - {0xc038, 140}, - }, - /* 152 */ - { - {0x8003, 141}, - {0x8006, 141}, - {0x800a, 141}, - {0x800f, 141}, - {0x8018, 141}, - {0x801f, 141}, - {0x8029, 141}, - {0xc038, 141}, - {0x8003, 143}, - {0x8006, 143}, - {0x800a, 143}, - {0x800f, 143}, - {0x8018, 143}, - {0x801f, 143}, - {0x8029, 143}, - {0xc038, 143}, - }, - /* 153 */ - { - {0x9d, 0}, - {0x9e, 0}, - {0xa0, 0}, - {0xa1, 0}, - {0xa4, 0}, - {0xa5, 0}, - {0xa7, 0}, - {0xa8, 0}, - {0xac, 0}, - {0xad, 0}, - {0xaf, 0}, - {0xb1, 0}, - {0xb6, 0}, - {0xb9, 0}, - {0xbf, 0}, - {0xcf, 0}, - }, - /* 154 */ - { - {0xc000, 147}, - {0xc000, 149}, - {0xc000, 150}, - {0xc000, 151}, - {0xc000, 152}, - {0xc000, 155}, - {0xc000, 157}, - {0xc000, 158}, - {0xc000, 165}, - {0xc000, 166}, - {0xc000, 168}, - {0xc000, 174}, - {0xc000, 175}, - {0xc000, 180}, - {0xc000, 182}, - {0xc000, 183}, - }, - /* 155 */ - { - {0x8001, 147}, - {0xc016, 147}, - {0x8001, 149}, - {0xc016, 149}, - {0x8001, 150}, - {0xc016, 150}, - {0x8001, 151}, - {0xc016, 151}, - {0x8001, 152}, - {0xc016, 152}, - {0x8001, 155}, - {0xc016, 155}, - {0x8001, 157}, - {0xc016, 157}, - {0x8001, 158}, - {0xc016, 158}, - }, - /* 156 */ - { - {0x8002, 147}, - {0x8009, 147}, - {0x8017, 147}, - {0xc028, 147}, - {0x8002, 149}, - {0x8009, 149}, - {0x8017, 149}, - {0xc028, 149}, - {0x8002, 150}, - {0x8009, 150}, - {0x8017, 150}, - {0xc028, 150}, - {0x8002, 151}, - {0x8009, 151}, - {0x8017, 151}, - {0xc028, 151}, - }, - /* 157 */ - { - {0x8003, 147}, - {0x8006, 147}, - {0x800a, 147}, - {0x800f, 147}, - {0x8018, 147}, - {0x801f, 147}, - {0x8029, 147}, - {0xc038, 147}, - {0x8003, 149}, - {0x8006, 149}, - {0x800a, 149}, - {0x800f, 149}, - {0x8018, 149}, - {0x801f, 149}, - {0x8029, 149}, - {0xc038, 149}, - }, - /* 158 */ - { - {0x8003, 150}, - {0x8006, 150}, - {0x800a, 150}, - {0x800f, 150}, - {0x8018, 150}, - {0x801f, 150}, - {0x8029, 150}, - {0xc038, 150}, - {0x8003, 151}, - {0x8006, 151}, - {0x800a, 151}, - {0x800f, 151}, - {0x8018, 151}, - {0x801f, 151}, - {0x8029, 151}, - {0xc038, 151}, - }, - /* 159 */ - { - {0x8002, 152}, - {0x8009, 152}, - {0x8017, 152}, - {0xc028, 152}, - {0x8002, 155}, - {0x8009, 155}, - {0x8017, 155}, - {0xc028, 155}, - {0x8002, 157}, - {0x8009, 157}, - {0x8017, 157}, - {0xc028, 157}, - {0x8002, 158}, - {0x8009, 158}, - {0x8017, 158}, - {0xc028, 158}, - }, - /* 160 */ - { - {0x8003, 152}, - {0x8006, 152}, - {0x800a, 152}, - {0x800f, 152}, - {0x8018, 152}, - {0x801f, 152}, - {0x8029, 152}, - {0xc038, 152}, - {0x8003, 155}, - {0x8006, 155}, - {0x800a, 155}, - {0x800f, 155}, - {0x8018, 155}, - {0x801f, 155}, - {0x8029, 155}, - {0xc038, 155}, - }, - /* 161 */ - { - {0x8003, 157}, - {0x8006, 157}, - {0x800a, 157}, - {0x800f, 157}, - {0x8018, 157}, - {0x801f, 157}, - {0x8029, 157}, - {0xc038, 157}, - {0x8003, 158}, - {0x8006, 158}, - {0x800a, 158}, - {0x800f, 158}, - {0x8018, 158}, - {0x801f, 158}, - {0x8029, 158}, - {0xc038, 158}, - }, - /* 162 */ - { - {0x8001, 165}, - {0xc016, 165}, - {0x8001, 166}, - {0xc016, 166}, - {0x8001, 168}, - {0xc016, 168}, - {0x8001, 174}, - {0xc016, 174}, - {0x8001, 175}, - {0xc016, 175}, - {0x8001, 180}, - {0xc016, 180}, - {0x8001, 182}, - {0xc016, 182}, - {0x8001, 183}, - {0xc016, 183}, - }, - /* 163 */ - { - {0x8002, 165}, - {0x8009, 165}, - {0x8017, 165}, - {0xc028, 165}, - {0x8002, 166}, - {0x8009, 166}, - {0x8017, 166}, - {0xc028, 166}, - {0x8002, 168}, - {0x8009, 168}, - {0x8017, 168}, - {0xc028, 168}, - {0x8002, 174}, - {0x8009, 174}, - {0x8017, 174}, - {0xc028, 174}, - }, - /* 164 */ - { - {0x8003, 165}, - {0x8006, 165}, - {0x800a, 165}, - {0x800f, 165}, - {0x8018, 165}, - {0x801f, 165}, - {0x8029, 165}, - {0xc038, 165}, - {0x8003, 166}, - {0x8006, 166}, - {0x800a, 166}, - {0x800f, 166}, - {0x8018, 166}, - {0x801f, 166}, - {0x8029, 166}, - {0xc038, 166}, - }, - /* 165 */ - { - {0x8003, 168}, - {0x8006, 168}, - {0x800a, 168}, - {0x800f, 168}, - {0x8018, 168}, - {0x801f, 168}, - {0x8029, 168}, - {0xc038, 168}, - {0x8003, 174}, - {0x8006, 174}, - {0x800a, 174}, - {0x800f, 174}, - {0x8018, 174}, - {0x801f, 174}, - {0x8029, 174}, - {0xc038, 174}, - }, - /* 166 */ - { - {0x8002, 175}, - {0x8009, 175}, - {0x8017, 175}, - {0xc028, 175}, - {0x8002, 180}, - {0x8009, 180}, - {0x8017, 180}, - {0xc028, 180}, - {0x8002, 182}, - {0x8009, 182}, - {0x8017, 182}, - {0xc028, 182}, - {0x8002, 183}, - {0x8009, 183}, - {0x8017, 183}, - {0xc028, 183}, - }, - /* 167 */ - { - {0x8003, 175}, - {0x8006, 175}, - {0x800a, 175}, - {0x800f, 175}, - {0x8018, 175}, - {0x801f, 175}, - {0x8029, 175}, - {0xc038, 175}, - {0x8003, 180}, - {0x8006, 180}, - {0x800a, 180}, - {0x800f, 180}, - {0x8018, 180}, - {0x801f, 180}, - {0x8029, 180}, - {0xc038, 180}, - }, - /* 168 */ - { - {0x8003, 182}, - {0x8006, 182}, - {0x800a, 182}, - {0x800f, 182}, - {0x8018, 182}, - {0x801f, 182}, - {0x8029, 182}, - {0xc038, 182}, - {0x8003, 183}, - {0x8006, 183}, - {0x800a, 183}, - {0x800f, 183}, - {0x8018, 183}, - {0x801f, 183}, - {0x8029, 183}, - {0xc038, 183}, - }, - /* 169 */ - { - {0xc000, 188}, - {0xc000, 191}, - {0xc000, 197}, - {0xc000, 231}, - {0xc000, 239}, - {0xb0, 0}, - {0xb2, 0}, - {0xb3, 0}, - {0xb7, 0}, - {0xb8, 0}, - {0xba, 0}, - {0xbb, 0}, - {0xc0, 0}, - {0xc7, 0}, - {0xd0, 0}, - {0xdf, 0}, - }, - /* 170 */ - { - {0x8001, 188}, - {0xc016, 188}, - {0x8001, 191}, - {0xc016, 191}, - {0x8001, 197}, - {0xc016, 197}, - {0x8001, 231}, - {0xc016, 231}, - {0x8001, 239}, - {0xc016, 239}, - {0xc000, 9}, - {0xc000, 142}, - {0xc000, 144}, - {0xc000, 145}, - {0xc000, 148}, - {0xc000, 159}, - }, - /* 171 */ - { - {0x8002, 188}, - {0x8009, 188}, - {0x8017, 188}, - {0xc028, 188}, - {0x8002, 191}, - {0x8009, 191}, - {0x8017, 191}, - {0xc028, 191}, - {0x8002, 197}, - {0x8009, 197}, - {0x8017, 197}, - {0xc028, 197}, - {0x8002, 231}, - {0x8009, 231}, - {0x8017, 231}, - {0xc028, 231}, - }, - /* 172 */ - { - {0x8003, 188}, - {0x8006, 188}, - {0x800a, 188}, - {0x800f, 188}, - {0x8018, 188}, - {0x801f, 188}, - {0x8029, 188}, - {0xc038, 188}, - {0x8003, 191}, - {0x8006, 191}, - {0x800a, 191}, - {0x800f, 191}, - {0x8018, 191}, - {0x801f, 191}, - {0x8029, 191}, - {0xc038, 191}, - }, - /* 173 */ - { - {0x8003, 197}, - {0x8006, 197}, - {0x800a, 197}, - {0x800f, 197}, - {0x8018, 197}, - {0x801f, 197}, - {0x8029, 197}, - {0xc038, 197}, - {0x8003, 231}, - {0x8006, 231}, - {0x800a, 231}, - {0x800f, 231}, - {0x8018, 231}, - {0x801f, 231}, - {0x8029, 231}, - {0xc038, 231}, - }, - /* 174 */ - { - {0x8002, 239}, - {0x8009, 239}, - {0x8017, 239}, - {0xc028, 239}, - {0x8001, 9}, - {0xc016, 9}, - {0x8001, 142}, - {0xc016, 142}, - {0x8001, 144}, - {0xc016, 144}, - {0x8001, 145}, - {0xc016, 145}, - {0x8001, 148}, - {0xc016, 148}, - {0x8001, 159}, - {0xc016, 159}, - }, - /* 175 */ - { - {0x8003, 239}, - {0x8006, 239}, - {0x800a, 239}, - {0x800f, 239}, - {0x8018, 239}, - {0x801f, 239}, - {0x8029, 239}, - {0xc038, 239}, - {0x8002, 9}, - {0x8009, 9}, - {0x8017, 9}, - {0xc028, 9}, - {0x8002, 142}, - {0x8009, 142}, - {0x8017, 142}, - {0xc028, 142}, - }, - /* 176 */ - { - {0x8003, 9}, - {0x8006, 9}, - {0x800a, 9}, - {0x800f, 9}, - {0x8018, 9}, - {0x801f, 9}, - {0x8029, 9}, - {0xc038, 9}, - {0x8003, 142}, - {0x8006, 142}, - {0x800a, 142}, - {0x800f, 142}, - {0x8018, 142}, - {0x801f, 142}, - {0x8029, 142}, - {0xc038, 142}, - }, - /* 177 */ - { - {0x8002, 144}, - {0x8009, 144}, - {0x8017, 144}, - {0xc028, 144}, - {0x8002, 145}, - {0x8009, 145}, - {0x8017, 145}, - {0xc028, 145}, - {0x8002, 148}, - {0x8009, 148}, - {0x8017, 148}, - {0xc028, 148}, - {0x8002, 159}, - {0x8009, 159}, - {0x8017, 159}, - {0xc028, 159}, - }, - /* 178 */ - { - {0x8003, 144}, - {0x8006, 144}, - {0x800a, 144}, - {0x800f, 144}, - {0x8018, 144}, - {0x801f, 144}, - {0x8029, 144}, - {0xc038, 144}, - {0x8003, 145}, - {0x8006, 145}, - {0x800a, 145}, - {0x800f, 145}, - {0x8018, 145}, - {0x801f, 145}, - {0x8029, 145}, - {0xc038, 145}, - }, - /* 179 */ - { - {0x8003, 148}, - {0x8006, 148}, - {0x800a, 148}, - {0x800f, 148}, - {0x8018, 148}, - {0x801f, 148}, - {0x8029, 148}, - {0xc038, 148}, - {0x8003, 159}, - {0x8006, 159}, - {0x800a, 159}, - {0x800f, 159}, - {0x8018, 159}, - {0x801f, 159}, - {0x8029, 159}, - {0xc038, 159}, - }, - /* 180 */ - { - {0xc000, 171}, - {0xc000, 206}, - {0xc000, 215}, - {0xc000, 225}, - {0xc000, 236}, - {0xc000, 237}, - {0xbc, 0}, - {0xbd, 0}, - {0xc1, 0}, - {0xc4, 0}, - {0xc8, 0}, - {0xcb, 0}, - {0xd1, 0}, - {0xd8, 0}, - {0xe0, 0}, - {0xee, 0}, - }, - /* 181 */ - { - {0x8001, 171}, - {0xc016, 171}, - {0x8001, 206}, - {0xc016, 206}, - {0x8001, 215}, - {0xc016, 215}, - {0x8001, 225}, - {0xc016, 225}, - {0x8001, 236}, - {0xc016, 236}, - {0x8001, 237}, - {0xc016, 237}, - {0xc000, 199}, - {0xc000, 207}, - {0xc000, 234}, - {0xc000, 235}, - }, - /* 182 */ - { - {0x8002, 171}, - {0x8009, 171}, - {0x8017, 171}, - {0xc028, 171}, - {0x8002, 206}, - {0x8009, 206}, - {0x8017, 206}, - {0xc028, 206}, - {0x8002, 215}, - {0x8009, 215}, - {0x8017, 215}, - {0xc028, 215}, - {0x8002, 225}, - {0x8009, 225}, - {0x8017, 225}, - {0xc028, 225}, - }, - /* 183 */ - { - {0x8003, 171}, - {0x8006, 171}, - {0x800a, 171}, - {0x800f, 171}, - {0x8018, 171}, - {0x801f, 171}, - {0x8029, 171}, - {0xc038, 171}, - {0x8003, 206}, - {0x8006, 206}, - {0x800a, 206}, - {0x800f, 206}, - {0x8018, 206}, - {0x801f, 206}, - {0x8029, 206}, - {0xc038, 206}, - }, - /* 184 */ - { - {0x8003, 215}, - {0x8006, 215}, - {0x800a, 215}, - {0x800f, 215}, - {0x8018, 215}, - {0x801f, 215}, - {0x8029, 215}, - {0xc038, 215}, - {0x8003, 225}, - {0x8006, 225}, - {0x800a, 225}, - {0x800f, 225}, - {0x8018, 225}, - {0x801f, 225}, - {0x8029, 225}, - {0xc038, 225}, - }, - /* 185 */ - { - {0x8002, 236}, - {0x8009, 236}, - {0x8017, 236}, - {0xc028, 236}, - {0x8002, 237}, - {0x8009, 237}, - {0x8017, 237}, - {0xc028, 237}, - {0x8001, 199}, - {0xc016, 199}, - {0x8001, 207}, - {0xc016, 207}, - {0x8001, 234}, - {0xc016, 234}, - {0x8001, 235}, - {0xc016, 235}, - }, - /* 186 */ - { - {0x8003, 236}, - {0x8006, 236}, - {0x800a, 236}, - {0x800f, 236}, - {0x8018, 236}, - {0x801f, 236}, - {0x8029, 236}, - {0xc038, 236}, - {0x8003, 237}, - {0x8006, 237}, - {0x800a, 237}, - {0x800f, 237}, - {0x8018, 237}, - {0x801f, 237}, - {0x8029, 237}, - {0xc038, 237}, - }, - /* 187 */ - { - {0x8002, 199}, - {0x8009, 199}, - {0x8017, 199}, - {0xc028, 199}, - {0x8002, 207}, - {0x8009, 207}, - {0x8017, 207}, - {0xc028, 207}, - {0x8002, 234}, - {0x8009, 234}, - {0x8017, 234}, - {0xc028, 234}, - {0x8002, 235}, - {0x8009, 235}, - {0x8017, 235}, - {0xc028, 235}, - }, - /* 188 */ - { - {0x8003, 199}, - {0x8006, 199}, - {0x800a, 199}, - {0x800f, 199}, - {0x8018, 199}, - {0x801f, 199}, - {0x8029, 199}, - {0xc038, 199}, - {0x8003, 207}, - {0x8006, 207}, - {0x800a, 207}, - {0x800f, 207}, - {0x8018, 207}, - {0x801f, 207}, - {0x8029, 207}, - {0xc038, 207}, - }, - /* 189 */ - { - {0x8003, 234}, - {0x8006, 234}, - {0x800a, 234}, - {0x800f, 234}, - {0x8018, 234}, - {0x801f, 234}, - {0x8029, 234}, - {0xc038, 234}, - {0x8003, 235}, - {0x8006, 235}, - {0x800a, 235}, - {0x800f, 235}, - {0x8018, 235}, - {0x801f, 235}, - {0x8029, 235}, - {0xc038, 235}, - }, - /* 190 */ - { - {0xc2, 0}, - {0xc3, 0}, - {0xc5, 0}, - {0xc6, 0}, - {0xc9, 0}, - {0xca, 0}, - {0xcc, 0}, - {0xcd, 0}, - {0xd2, 0}, - {0xd5, 0}, - {0xd9, 0}, - {0xdc, 0}, - {0xe1, 0}, - {0xe7, 0}, - {0xef, 0}, - {0xf6, 0}, - }, - /* 191 */ - { - {0xc000, 192}, - {0xc000, 193}, - {0xc000, 200}, - {0xc000, 201}, - {0xc000, 202}, - {0xc000, 205}, - {0xc000, 210}, - {0xc000, 213}, - {0xc000, 218}, - {0xc000, 219}, - {0xc000, 238}, - {0xc000, 240}, - {0xc000, 242}, - {0xc000, 243}, - {0xc000, 255}, - {0xce, 0}, - }, - /* 192 */ - { - {0x8001, 192}, - {0xc016, 192}, - {0x8001, 193}, - {0xc016, 193}, - {0x8001, 200}, - {0xc016, 200}, - {0x8001, 201}, - {0xc016, 201}, - {0x8001, 202}, - {0xc016, 202}, - {0x8001, 205}, - {0xc016, 205}, - {0x8001, 210}, - {0xc016, 210}, - {0x8001, 213}, - {0xc016, 213}, - }, - /* 193 */ - { - {0x8002, 192}, - {0x8009, 192}, - {0x8017, 192}, - {0xc028, 192}, - {0x8002, 193}, - {0x8009, 193}, - {0x8017, 193}, - {0xc028, 193}, - {0x8002, 200}, - {0x8009, 200}, - {0x8017, 200}, - {0xc028, 200}, - {0x8002, 201}, - {0x8009, 201}, - {0x8017, 201}, - {0xc028, 201}, - }, - /* 194 */ - { - {0x8003, 192}, - {0x8006, 192}, - {0x800a, 192}, - {0x800f, 192}, - {0x8018, 192}, - {0x801f, 192}, - {0x8029, 192}, - {0xc038, 192}, - {0x8003, 193}, - {0x8006, 193}, - {0x800a, 193}, - {0x800f, 193}, - {0x8018, 193}, - {0x801f, 193}, - {0x8029, 193}, - {0xc038, 193}, - }, - /* 195 */ - { - {0x8003, 200}, - {0x8006, 200}, - {0x800a, 200}, - {0x800f, 200}, - {0x8018, 200}, - {0x801f, 200}, - {0x8029, 200}, - {0xc038, 200}, - {0x8003, 201}, - {0x8006, 201}, - {0x800a, 201}, - {0x800f, 201}, - {0x8018, 201}, - {0x801f, 201}, - {0x8029, 201}, - {0xc038, 201}, - }, - /* 196 */ - { - {0x8002, 202}, - {0x8009, 202}, - {0x8017, 202}, - {0xc028, 202}, - {0x8002, 205}, - {0x8009, 205}, - {0x8017, 205}, - {0xc028, 205}, - {0x8002, 210}, - {0x8009, 210}, - {0x8017, 210}, - {0xc028, 210}, - {0x8002, 213}, - {0x8009, 213}, - {0x8017, 213}, - {0xc028, 213}, - }, - /* 197 */ - { - {0x8003, 202}, - {0x8006, 202}, - {0x800a, 202}, - {0x800f, 202}, - {0x8018, 202}, - {0x801f, 202}, - {0x8029, 202}, - {0xc038, 202}, - {0x8003, 205}, - {0x8006, 205}, - {0x800a, 205}, - {0x800f, 205}, - {0x8018, 205}, - {0x801f, 205}, - {0x8029, 205}, - {0xc038, 205}, - }, - /* 198 */ - { - {0x8003, 210}, - {0x8006, 210}, - {0x800a, 210}, - {0x800f, 210}, - {0x8018, 210}, - {0x801f, 210}, - {0x8029, 210}, - {0xc038, 210}, - {0x8003, 213}, - {0x8006, 213}, - {0x800a, 213}, - {0x800f, 213}, - {0x8018, 213}, - {0x801f, 213}, - {0x8029, 213}, - {0xc038, 213}, - }, - /* 199 */ - { - {0x8001, 218}, - {0xc016, 218}, - {0x8001, 219}, - {0xc016, 219}, - {0x8001, 238}, - {0xc016, 238}, - {0x8001, 240}, - {0xc016, 240}, - {0x8001, 242}, - {0xc016, 242}, - {0x8001, 243}, - {0xc016, 243}, - {0x8001, 255}, - {0xc016, 255}, - {0xc000, 203}, - {0xc000, 204}, - }, - /* 200 */ - { - {0x8002, 218}, - {0x8009, 218}, - {0x8017, 218}, - {0xc028, 218}, - {0x8002, 219}, - {0x8009, 219}, - {0x8017, 219}, - {0xc028, 219}, - {0x8002, 238}, - {0x8009, 238}, - {0x8017, 238}, - {0xc028, 238}, - {0x8002, 240}, - {0x8009, 240}, - {0x8017, 240}, - {0xc028, 240}, - }, - /* 201 */ - { - {0x8003, 218}, - {0x8006, 218}, - {0x800a, 218}, - {0x800f, 218}, - {0x8018, 218}, - {0x801f, 218}, - {0x8029, 218}, - {0xc038, 218}, - {0x8003, 219}, - {0x8006, 219}, - {0x800a, 219}, - {0x800f, 219}, - {0x8018, 219}, - {0x801f, 219}, - {0x8029, 219}, - {0xc038, 219}, - }, - /* 202 */ - { - {0x8003, 238}, - {0x8006, 238}, - {0x800a, 238}, - {0x800f, 238}, - {0x8018, 238}, - {0x801f, 238}, - {0x8029, 238}, - {0xc038, 238}, - {0x8003, 240}, - {0x8006, 240}, - {0x800a, 240}, - {0x800f, 240}, - {0x8018, 240}, - {0x801f, 240}, - {0x8029, 240}, - {0xc038, 240}, - }, - /* 203 */ - { - {0x8002, 242}, - {0x8009, 242}, - {0x8017, 242}, - {0xc028, 242}, - {0x8002, 243}, - {0x8009, 243}, - {0x8017, 243}, - {0xc028, 243}, - {0x8002, 255}, - {0x8009, 255}, - {0x8017, 255}, - {0xc028, 255}, - {0x8001, 203}, - {0xc016, 203}, - {0x8001, 204}, - {0xc016, 204}, - }, - /* 204 */ - { - {0x8003, 242}, - {0x8006, 242}, - {0x800a, 242}, - {0x800f, 242}, - {0x8018, 242}, - {0x801f, 242}, - {0x8029, 242}, - {0xc038, 242}, - {0x8003, 243}, - {0x8006, 243}, - {0x800a, 243}, - {0x800f, 243}, - {0x8018, 243}, - {0x801f, 243}, - {0x8029, 243}, - {0xc038, 243}, - }, - /* 205 */ - { - {0x8003, 255}, - {0x8006, 255}, - {0x800a, 255}, - {0x800f, 255}, - {0x8018, 255}, - {0x801f, 255}, - {0x8029, 255}, - {0xc038, 255}, - {0x8002, 203}, - {0x8009, 203}, - {0x8017, 203}, - {0xc028, 203}, - {0x8002, 204}, - {0x8009, 204}, - {0x8017, 204}, - {0xc028, 204}, - }, - /* 206 */ - { - {0x8003, 203}, - {0x8006, 203}, - {0x800a, 203}, - {0x800f, 203}, - {0x8018, 203}, - {0x801f, 203}, - {0x8029, 203}, - {0xc038, 203}, - {0x8003, 204}, - {0x8006, 204}, - {0x800a, 204}, - {0x800f, 204}, - {0x8018, 204}, - {0x801f, 204}, - {0x8029, 204}, - {0xc038, 204}, - }, - /* 207 */ - { - {0xd3, 0}, - {0xd4, 0}, - {0xd6, 0}, - {0xd7, 0}, - {0xda, 0}, - {0xdb, 0}, - {0xdd, 0}, - {0xde, 0}, - {0xe2, 0}, - {0xe4, 0}, - {0xe8, 0}, - {0xeb, 0}, - {0xf0, 0}, - {0xf3, 0}, - {0xf7, 0}, - {0xfa, 0}, - }, - /* 208 */ - { - {0xc000, 211}, - {0xc000, 212}, - {0xc000, 214}, - {0xc000, 221}, - {0xc000, 222}, - {0xc000, 223}, - {0xc000, 241}, - {0xc000, 244}, - {0xc000, 245}, - {0xc000, 246}, - {0xc000, 247}, - {0xc000, 248}, - {0xc000, 250}, - {0xc000, 251}, - {0xc000, 252}, - {0xc000, 253}, - }, - /* 209 */ - { - {0x8001, 211}, - {0xc016, 211}, - {0x8001, 212}, - {0xc016, 212}, - {0x8001, 214}, - {0xc016, 214}, - {0x8001, 221}, - {0xc016, 221}, - {0x8001, 222}, - {0xc016, 222}, - {0x8001, 223}, - {0xc016, 223}, - {0x8001, 241}, - {0xc016, 241}, - {0x8001, 244}, - {0xc016, 244}, - }, - /* 210 */ - { - {0x8002, 211}, - {0x8009, 211}, - {0x8017, 211}, - {0xc028, 211}, - {0x8002, 212}, - {0x8009, 212}, - {0x8017, 212}, - {0xc028, 212}, - {0x8002, 214}, - {0x8009, 214}, - {0x8017, 214}, - {0xc028, 214}, - {0x8002, 221}, - {0x8009, 221}, - {0x8017, 221}, - {0xc028, 221}, - }, - /* 211 */ - { - {0x8003, 211}, - {0x8006, 211}, - {0x800a, 211}, - {0x800f, 211}, - {0x8018, 211}, - {0x801f, 211}, - {0x8029, 211}, - {0xc038, 211}, - {0x8003, 212}, - {0x8006, 212}, - {0x800a, 212}, - {0x800f, 212}, - {0x8018, 212}, - {0x801f, 212}, - {0x8029, 212}, - {0xc038, 212}, - }, - /* 212 */ - { - {0x8003, 214}, - {0x8006, 214}, - {0x800a, 214}, - {0x800f, 214}, - {0x8018, 214}, - {0x801f, 214}, - {0x8029, 214}, - {0xc038, 214}, - {0x8003, 221}, - {0x8006, 221}, - {0x800a, 221}, - {0x800f, 221}, - {0x8018, 221}, - {0x801f, 221}, - {0x8029, 221}, - {0xc038, 221}, - }, - /* 213 */ - { - {0x8002, 222}, - {0x8009, 222}, - {0x8017, 222}, - {0xc028, 222}, - {0x8002, 223}, - {0x8009, 223}, - {0x8017, 223}, - {0xc028, 223}, - {0x8002, 241}, - {0x8009, 241}, - {0x8017, 241}, - {0xc028, 241}, - {0x8002, 244}, - {0x8009, 244}, - {0x8017, 244}, - {0xc028, 244}, - }, - /* 214 */ - { - {0x8003, 222}, - {0x8006, 222}, - {0x800a, 222}, - {0x800f, 222}, - {0x8018, 222}, - {0x801f, 222}, - {0x8029, 222}, - {0xc038, 222}, - {0x8003, 223}, - {0x8006, 223}, - {0x800a, 223}, - {0x800f, 223}, - {0x8018, 223}, - {0x801f, 223}, - {0x8029, 223}, - {0xc038, 223}, - }, - /* 215 */ - { - {0x8003, 241}, - {0x8006, 241}, - {0x800a, 241}, - {0x800f, 241}, - {0x8018, 241}, - {0x801f, 241}, - {0x8029, 241}, - {0xc038, 241}, - {0x8003, 244}, - {0x8006, 244}, - {0x800a, 244}, - {0x800f, 244}, - {0x8018, 244}, - {0x801f, 244}, - {0x8029, 244}, - {0xc038, 244}, - }, - /* 216 */ - { - {0x8001, 245}, - {0xc016, 245}, - {0x8001, 246}, - {0xc016, 246}, - {0x8001, 247}, - {0xc016, 247}, - {0x8001, 248}, - {0xc016, 248}, - {0x8001, 250}, - {0xc016, 250}, - {0x8001, 251}, - {0xc016, 251}, - {0x8001, 252}, - {0xc016, 252}, - {0x8001, 253}, - {0xc016, 253}, - }, - /* 217 */ - { - {0x8002, 245}, - {0x8009, 245}, - {0x8017, 245}, - {0xc028, 245}, - {0x8002, 246}, - {0x8009, 246}, - {0x8017, 246}, - {0xc028, 246}, - {0x8002, 247}, - {0x8009, 247}, - {0x8017, 247}, - {0xc028, 247}, - {0x8002, 248}, - {0x8009, 248}, - {0x8017, 248}, - {0xc028, 248}, - }, - /* 218 */ - { - {0x8003, 245}, - {0x8006, 245}, - {0x800a, 245}, - {0x800f, 245}, - {0x8018, 245}, - {0x801f, 245}, - {0x8029, 245}, - {0xc038, 245}, - {0x8003, 246}, - {0x8006, 246}, - {0x800a, 246}, - {0x800f, 246}, - {0x8018, 246}, - {0x801f, 246}, - {0x8029, 246}, - {0xc038, 246}, - }, - /* 219 */ - { - {0x8003, 247}, - {0x8006, 247}, - {0x800a, 247}, - {0x800f, 247}, - {0x8018, 247}, - {0x801f, 247}, - {0x8029, 247}, - {0xc038, 247}, - {0x8003, 248}, - {0x8006, 248}, - {0x800a, 248}, - {0x800f, 248}, - {0x8018, 248}, - {0x801f, 248}, - {0x8029, 248}, - {0xc038, 248}, - }, - /* 220 */ - { - {0x8002, 250}, - {0x8009, 250}, - {0x8017, 250}, - {0xc028, 250}, - {0x8002, 251}, - {0x8009, 251}, - {0x8017, 251}, - {0xc028, 251}, - {0x8002, 252}, - {0x8009, 252}, - {0x8017, 252}, - {0xc028, 252}, - {0x8002, 253}, - {0x8009, 253}, - {0x8017, 253}, - {0xc028, 253}, - }, - /* 221 */ - { - {0x8003, 250}, - {0x8006, 250}, - {0x800a, 250}, - {0x800f, 250}, - {0x8018, 250}, - {0x801f, 250}, - {0x8029, 250}, - {0xc038, 250}, - {0x8003, 251}, - {0x8006, 251}, - {0x800a, 251}, - {0x800f, 251}, - {0x8018, 251}, - {0x801f, 251}, - {0x8029, 251}, - {0xc038, 251}, - }, - /* 222 */ - { - {0x8003, 252}, - {0x8006, 252}, - {0x800a, 252}, - {0x800f, 252}, - {0x8018, 252}, - {0x801f, 252}, - {0x8029, 252}, - {0xc038, 252}, - {0x8003, 253}, - {0x8006, 253}, - {0x800a, 253}, - {0x800f, 253}, - {0x8018, 253}, - {0x801f, 253}, - {0x8029, 253}, - {0xc038, 253}, - }, - /* 223 */ - { - {0xc000, 254}, - {0xe3, 0}, - {0xe5, 0}, - {0xe6, 0}, - {0xe9, 0}, - {0xea, 0}, - {0xec, 0}, - {0xed, 0}, - {0xf1, 0}, - {0xf2, 0}, - {0xf4, 0}, - {0xf5, 0}, - {0xf8, 0}, - {0xf9, 0}, - {0xfb, 0}, - {0xfc, 0}, - }, - /* 224 */ - { - {0x8001, 254}, - {0xc016, 254}, - {0xc000, 2}, - {0xc000, 3}, - {0xc000, 4}, - {0xc000, 5}, - {0xc000, 6}, - {0xc000, 7}, - {0xc000, 8}, - {0xc000, 11}, - {0xc000, 12}, - {0xc000, 14}, - {0xc000, 15}, - {0xc000, 16}, - {0xc000, 17}, - {0xc000, 18}, - }, - /* 225 */ - { - {0x8002, 254}, - {0x8009, 254}, - {0x8017, 254}, - {0xc028, 254}, - {0x8001, 2}, - {0xc016, 2}, - {0x8001, 3}, - {0xc016, 3}, - {0x8001, 4}, - {0xc016, 4}, - {0x8001, 5}, - {0xc016, 5}, - {0x8001, 6}, - {0xc016, 6}, - {0x8001, 7}, - {0xc016, 7}, - }, - /* 226 */ - { - {0x8003, 254}, - {0x8006, 254}, - {0x800a, 254}, - {0x800f, 254}, - {0x8018, 254}, - {0x801f, 254}, - {0x8029, 254}, - {0xc038, 254}, - {0x8002, 2}, - {0x8009, 2}, - {0x8017, 2}, - {0xc028, 2}, - {0x8002, 3}, - {0x8009, 3}, - {0x8017, 3}, - {0xc028, 3}, - }, - /* 227 */ - { - {0x8003, 2}, - {0x8006, 2}, - {0x800a, 2}, - {0x800f, 2}, - {0x8018, 2}, - {0x801f, 2}, - {0x8029, 2}, - {0xc038, 2}, - {0x8003, 3}, - {0x8006, 3}, - {0x800a, 3}, - {0x800f, 3}, - {0x8018, 3}, - {0x801f, 3}, - {0x8029, 3}, - {0xc038, 3}, - }, - /* 228 */ - { - {0x8002, 4}, - {0x8009, 4}, - {0x8017, 4}, - {0xc028, 4}, - {0x8002, 5}, - {0x8009, 5}, - {0x8017, 5}, - {0xc028, 5}, - {0x8002, 6}, - {0x8009, 6}, - {0x8017, 6}, - {0xc028, 6}, - {0x8002, 7}, - {0x8009, 7}, - {0x8017, 7}, - {0xc028, 7}, - }, - /* 229 */ - { - {0x8003, 4}, - {0x8006, 4}, - {0x800a, 4}, - {0x800f, 4}, - {0x8018, 4}, - {0x801f, 4}, - {0x8029, 4}, - {0xc038, 4}, - {0x8003, 5}, - {0x8006, 5}, - {0x800a, 5}, - {0x800f, 5}, - {0x8018, 5}, - {0x801f, 5}, - {0x8029, 5}, - {0xc038, 5}, - }, - /* 230 */ - { - {0x8003, 6}, - {0x8006, 6}, - {0x800a, 6}, - {0x800f, 6}, - {0x8018, 6}, - {0x801f, 6}, - {0x8029, 6}, - {0xc038, 6}, - {0x8003, 7}, - {0x8006, 7}, - {0x800a, 7}, - {0x800f, 7}, - {0x8018, 7}, - {0x801f, 7}, - {0x8029, 7}, - {0xc038, 7}, - }, - /* 231 */ - { - {0x8001, 8}, - {0xc016, 8}, - {0x8001, 11}, - {0xc016, 11}, - {0x8001, 12}, - {0xc016, 12}, - {0x8001, 14}, - {0xc016, 14}, - {0x8001, 15}, - {0xc016, 15}, - {0x8001, 16}, - {0xc016, 16}, - {0x8001, 17}, - {0xc016, 17}, - {0x8001, 18}, - {0xc016, 18}, - }, - /* 232 */ - { - {0x8002, 8}, - {0x8009, 8}, - {0x8017, 8}, - {0xc028, 8}, - {0x8002, 11}, - {0x8009, 11}, - {0x8017, 11}, - {0xc028, 11}, - {0x8002, 12}, - {0x8009, 12}, - {0x8017, 12}, - {0xc028, 12}, - {0x8002, 14}, - {0x8009, 14}, - {0x8017, 14}, - {0xc028, 14}, - }, - /* 233 */ - { - {0x8003, 8}, - {0x8006, 8}, - {0x800a, 8}, - {0x800f, 8}, - {0x8018, 8}, - {0x801f, 8}, - {0x8029, 8}, - {0xc038, 8}, - {0x8003, 11}, - {0x8006, 11}, - {0x800a, 11}, - {0x800f, 11}, - {0x8018, 11}, - {0x801f, 11}, - {0x8029, 11}, - {0xc038, 11}, - }, - /* 234 */ - { - {0x8003, 12}, - {0x8006, 12}, - {0x800a, 12}, - {0x800f, 12}, - {0x8018, 12}, - {0x801f, 12}, - {0x8029, 12}, - {0xc038, 12}, - {0x8003, 14}, - {0x8006, 14}, - {0x800a, 14}, - {0x800f, 14}, - {0x8018, 14}, - {0x801f, 14}, - {0x8029, 14}, - {0xc038, 14}, - }, - /* 235 */ - { - {0x8002, 15}, - {0x8009, 15}, - {0x8017, 15}, - {0xc028, 15}, - {0x8002, 16}, - {0x8009, 16}, - {0x8017, 16}, - {0xc028, 16}, - {0x8002, 17}, - {0x8009, 17}, - {0x8017, 17}, - {0xc028, 17}, - {0x8002, 18}, - {0x8009, 18}, - {0x8017, 18}, - {0xc028, 18}, - }, - /* 236 */ - { - {0x8003, 15}, - {0x8006, 15}, - {0x800a, 15}, - {0x800f, 15}, - {0x8018, 15}, - {0x801f, 15}, - {0x8029, 15}, - {0xc038, 15}, - {0x8003, 16}, - {0x8006, 16}, - {0x800a, 16}, - {0x800f, 16}, - {0x8018, 16}, - {0x801f, 16}, - {0x8029, 16}, - {0xc038, 16}, - }, - /* 237 */ - { - {0x8003, 17}, - {0x8006, 17}, - {0x800a, 17}, - {0x800f, 17}, - {0x8018, 17}, - {0x801f, 17}, - {0x8029, 17}, - {0xc038, 17}, - {0x8003, 18}, - {0x8006, 18}, - {0x800a, 18}, - {0x800f, 18}, - {0x8018, 18}, - {0x801f, 18}, - {0x8029, 18}, - {0xc038, 18}, - }, - /* 238 */ - { - {0xc000, 19}, - {0xc000, 20}, - {0xc000, 21}, - {0xc000, 23}, - {0xc000, 24}, - {0xc000, 25}, - {0xc000, 26}, - {0xc000, 27}, - {0xc000, 28}, - {0xc000, 29}, - {0xc000, 30}, - {0xc000, 31}, - {0xc000, 127}, - {0xc000, 220}, - {0xc000, 249}, - {0xfd, 0}, - }, - /* 239 */ - { - {0x8001, 19}, - {0xc016, 19}, - {0x8001, 20}, - {0xc016, 20}, - {0x8001, 21}, - {0xc016, 21}, - {0x8001, 23}, - {0xc016, 23}, - {0x8001, 24}, - {0xc016, 24}, - {0x8001, 25}, - {0xc016, 25}, - {0x8001, 26}, - {0xc016, 26}, - {0x8001, 27}, - {0xc016, 27}, - }, - /* 240 */ - { - {0x8002, 19}, - {0x8009, 19}, - {0x8017, 19}, - {0xc028, 19}, - {0x8002, 20}, - {0x8009, 20}, - {0x8017, 20}, - {0xc028, 20}, - {0x8002, 21}, - {0x8009, 21}, - {0x8017, 21}, - {0xc028, 21}, - {0x8002, 23}, - {0x8009, 23}, - {0x8017, 23}, - {0xc028, 23}, - }, - /* 241 */ - { - {0x8003, 19}, - {0x8006, 19}, - {0x800a, 19}, - {0x800f, 19}, - {0x8018, 19}, - {0x801f, 19}, - {0x8029, 19}, - {0xc038, 19}, - {0x8003, 20}, - {0x8006, 20}, - {0x800a, 20}, - {0x800f, 20}, - {0x8018, 20}, - {0x801f, 20}, - {0x8029, 20}, - {0xc038, 20}, - }, - /* 242 */ - { - {0x8003, 21}, - {0x8006, 21}, - {0x800a, 21}, - {0x800f, 21}, - {0x8018, 21}, - {0x801f, 21}, - {0x8029, 21}, - {0xc038, 21}, - {0x8003, 23}, - {0x8006, 23}, - {0x800a, 23}, - {0x800f, 23}, - {0x8018, 23}, - {0x801f, 23}, - {0x8029, 23}, - {0xc038, 23}, - }, - /* 243 */ - { - {0x8002, 24}, - {0x8009, 24}, - {0x8017, 24}, - {0xc028, 24}, - {0x8002, 25}, - {0x8009, 25}, - {0x8017, 25}, - {0xc028, 25}, - {0x8002, 26}, - {0x8009, 26}, - {0x8017, 26}, - {0xc028, 26}, - {0x8002, 27}, - {0x8009, 27}, - {0x8017, 27}, - {0xc028, 27}, - }, - /* 244 */ - { - {0x8003, 24}, - {0x8006, 24}, - {0x800a, 24}, - {0x800f, 24}, - {0x8018, 24}, - {0x801f, 24}, - {0x8029, 24}, - {0xc038, 24}, - {0x8003, 25}, - {0x8006, 25}, - {0x800a, 25}, - {0x800f, 25}, - {0x8018, 25}, - {0x801f, 25}, - {0x8029, 25}, - {0xc038, 25}, - }, - /* 245 */ - { - {0x8003, 26}, - {0x8006, 26}, - {0x800a, 26}, - {0x800f, 26}, - {0x8018, 26}, - {0x801f, 26}, - {0x8029, 26}, - {0xc038, 26}, - {0x8003, 27}, - {0x8006, 27}, - {0x800a, 27}, - {0x800f, 27}, - {0x8018, 27}, - {0x801f, 27}, - {0x8029, 27}, - {0xc038, 27}, - }, - /* 246 */ - { - {0x8001, 28}, - {0xc016, 28}, - {0x8001, 29}, - {0xc016, 29}, - {0x8001, 30}, - {0xc016, 30}, - {0x8001, 31}, - {0xc016, 31}, - {0x8001, 127}, - {0xc016, 127}, - {0x8001, 220}, - {0xc016, 220}, - {0x8001, 249}, - {0xc016, 249}, - {0xfe, 0}, - {0xff, 0}, - }, - /* 247 */ - { - {0x8002, 28}, - {0x8009, 28}, - {0x8017, 28}, - {0xc028, 28}, - {0x8002, 29}, - {0x8009, 29}, - {0x8017, 29}, - {0xc028, 29}, - {0x8002, 30}, - {0x8009, 30}, - {0x8017, 30}, - {0xc028, 30}, - {0x8002, 31}, - {0x8009, 31}, - {0x8017, 31}, - {0xc028, 31}, - }, - /* 248 */ - { - {0x8003, 28}, - {0x8006, 28}, - {0x800a, 28}, - {0x800f, 28}, - {0x8018, 28}, - {0x801f, 28}, - {0x8029, 28}, - {0xc038, 28}, - {0x8003, 29}, - {0x8006, 29}, - {0x800a, 29}, - {0x800f, 29}, - {0x8018, 29}, - {0x801f, 29}, - {0x8029, 29}, - {0xc038, 29}, - }, - /* 249 */ - { - {0x8003, 30}, - {0x8006, 30}, - {0x800a, 30}, - {0x800f, 30}, - {0x8018, 30}, - {0x801f, 30}, - {0x8029, 30}, - {0xc038, 30}, - {0x8003, 31}, - {0x8006, 31}, - {0x800a, 31}, - {0x800f, 31}, - {0x8018, 31}, - {0x801f, 31}, - {0x8029, 31}, - {0xc038, 31}, - }, - /* 250 */ - { - {0x8002, 127}, - {0x8009, 127}, - {0x8017, 127}, - {0xc028, 127}, - {0x8002, 220}, - {0x8009, 220}, - {0x8017, 220}, - {0xc028, 220}, - {0x8002, 249}, - {0x8009, 249}, - {0x8017, 249}, - {0xc028, 249}, - {0xc000, 10}, - {0xc000, 13}, - {0xc000, 22}, - {0x100, 0}, - }, - /* 251 */ - { - {0x8003, 127}, - {0x8006, 127}, - {0x800a, 127}, - {0x800f, 127}, - {0x8018, 127}, - {0x801f, 127}, - {0x8029, 127}, - {0xc038, 127}, - {0x8003, 220}, - {0x8006, 220}, - {0x800a, 220}, - {0x800f, 220}, - {0x8018, 220}, - {0x801f, 220}, - {0x8029, 220}, - {0xc038, 220}, - }, - /* 252 */ - { - {0x8003, 249}, - {0x8006, 249}, - {0x800a, 249}, - {0x800f, 249}, - {0x8018, 249}, - {0x801f, 249}, - {0x8029, 249}, - {0xc038, 249}, - {0x8001, 10}, - {0xc016, 10}, - {0x8001, 13}, - {0xc016, 13}, - {0x8001, 22}, - {0xc016, 22}, - {0x100, 0}, - {0x100, 0}, - }, - /* 253 */ - { - {0x8002, 10}, - {0x8009, 10}, - {0x8017, 10}, - {0xc028, 10}, - {0x8002, 13}, - {0x8009, 13}, - {0x8017, 13}, - {0xc028, 13}, - {0x8002, 22}, - {0x8009, 22}, - {0x8017, 22}, - {0xc028, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 254 */ - { - {0x8003, 10}, - {0x8006, 10}, - {0x800a, 10}, - {0x800f, 10}, - {0x8018, 10}, - {0x801f, 10}, - {0x8029, 10}, - {0xc038, 10}, - {0x8003, 13}, - {0x8006, 13}, - {0x800a, 13}, - {0x800f, 13}, - {0x8018, 13}, - {0x801f, 13}, - {0x8029, 13}, - {0xc038, 13}, - }, - /* 255 */ - { - {0x8003, 22}, - {0x8006, 22}, - {0x800a, 22}, - {0x800f, 22}, - {0x8018, 22}, - {0x801f, 22}, - {0x8029, 22}, - {0xc038, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 256 */ - { - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, + /* 0 */ + { + {0x04, 0}, + {0x05, 0}, + {0x07, 0}, + {0x08, 0}, + {0x0b, 0}, + {0x0c, 0}, + {0x10, 0}, + {0x13, 0}, + {0x19, 0}, + {0x1c, 0}, + {0x20, 0}, + {0x23, 0}, + {0x2a, 0}, + {0x31, 0}, + {0x39, 0}, + {0x4040, 0}, + }, + /* 1 */ + { + {0xc000, 48}, + {0xc000, 49}, + {0xc000, 50}, + {0xc000, 97}, + {0xc000, 99}, + {0xc000, 101}, + {0xc000, 105}, + {0xc000, 111}, + {0xc000, 115}, + {0xc000, 116}, + {0x0d, 0}, + {0x0e, 0}, + {0x11, 0}, + {0x12, 0}, + {0x14, 0}, + {0x15, 0}, + }, + /* 2 */ + { + {0x8001, 48}, + {0xc016, 48}, + {0x8001, 49}, + {0xc016, 49}, + {0x8001, 50}, + {0xc016, 50}, + {0x8001, 97}, + {0xc016, 97}, + {0x8001, 99}, + {0xc016, 99}, + {0x8001, 101}, + {0xc016, 101}, + {0x8001, 105}, + {0xc016, 105}, + {0x8001, 111}, + {0xc016, 111}, + }, + /* 3 */ + { + {0x8002, 48}, + {0x8009, 48}, + {0x8017, 48}, + {0xc028, 48}, + {0x8002, 49}, + {0x8009, 49}, + {0x8017, 49}, + {0xc028, 49}, + {0x8002, 50}, + {0x8009, 50}, + {0x8017, 50}, + {0xc028, 50}, + {0x8002, 97}, + {0x8009, 97}, + {0x8017, 97}, + {0xc028, 97}, + }, + /* 4 */ + { + {0x8003, 48}, + {0x8006, 48}, + {0x800a, 48}, + {0x800f, 48}, + {0x8018, 48}, + {0x801f, 48}, + {0x8029, 48}, + {0xc038, 48}, + {0x8003, 49}, + {0x8006, 49}, + {0x800a, 49}, + {0x800f, 49}, + {0x8018, 49}, + {0x801f, 49}, + {0x8029, 49}, + {0xc038, 49}, + }, + /* 5 */ + { + {0x8003, 50}, + {0x8006, 50}, + {0x800a, 50}, + {0x800f, 50}, + {0x8018, 50}, + {0x801f, 50}, + {0x8029, 50}, + {0xc038, 50}, + {0x8003, 97}, + {0x8006, 97}, + {0x800a, 97}, + {0x800f, 97}, + {0x8018, 97}, + {0x801f, 97}, + {0x8029, 97}, + {0xc038, 97}, + }, + /* 6 */ + { + {0x8002, 99}, + {0x8009, 99}, + {0x8017, 99}, + {0xc028, 99}, + {0x8002, 101}, + {0x8009, 101}, + {0x8017, 101}, + {0xc028, 101}, + {0x8002, 105}, + {0x8009, 105}, + {0x8017, 105}, + {0xc028, 105}, + {0x8002, 111}, + {0x8009, 111}, + {0x8017, 111}, + {0xc028, 111}, + }, + /* 7 */ + { + {0x8003, 99}, + {0x8006, 99}, + {0x800a, 99}, + {0x800f, 99}, + {0x8018, 99}, + {0x801f, 99}, + {0x8029, 99}, + {0xc038, 99}, + {0x8003, 101}, + {0x8006, 101}, + {0x800a, 101}, + {0x800f, 101}, + {0x8018, 101}, + {0x801f, 101}, + {0x8029, 101}, + {0xc038, 101}, + }, + /* 8 */ + { + {0x8003, 105}, + {0x8006, 105}, + {0x800a, 105}, + {0x800f, 105}, + {0x8018, 105}, + {0x801f, 105}, + {0x8029, 105}, + {0xc038, 105}, + {0x8003, 111}, + {0x8006, 111}, + {0x800a, 111}, + {0x800f, 111}, + {0x8018, 111}, + {0x801f, 111}, + {0x8029, 111}, + {0xc038, 111}, + }, + /* 9 */ + { + {0x8001, 115}, + {0xc016, 115}, + {0x8001, 116}, + {0xc016, 116}, + {0xc000, 32}, + {0xc000, 37}, + {0xc000, 45}, + {0xc000, 46}, + {0xc000, 47}, + {0xc000, 51}, + {0xc000, 52}, + {0xc000, 53}, + {0xc000, 54}, + {0xc000, 55}, + {0xc000, 56}, + {0xc000, 57}, + }, + /* 10 */ + { + {0x8002, 115}, + {0x8009, 115}, + {0x8017, 115}, + {0xc028, 115}, + {0x8002, 116}, + {0x8009, 116}, + {0x8017, 116}, + {0xc028, 116}, + {0x8001, 32}, + {0xc016, 32}, + {0x8001, 37}, + {0xc016, 37}, + {0x8001, 45}, + {0xc016, 45}, + {0x8001, 46}, + {0xc016, 46}, + }, + /* 11 */ + { + {0x8003, 115}, + {0x8006, 115}, + {0x800a, 115}, + {0x800f, 115}, + {0x8018, 115}, + {0x801f, 115}, + {0x8029, 115}, + {0xc038, 115}, + {0x8003, 116}, + {0x8006, 116}, + {0x800a, 116}, + {0x800f, 116}, + {0x8018, 116}, + {0x801f, 116}, + {0x8029, 116}, + {0xc038, 116}, + }, + /* 12 */ + { + {0x8002, 32}, + {0x8009, 32}, + {0x8017, 32}, + {0xc028, 32}, + {0x8002, 37}, + {0x8009, 37}, + {0x8017, 37}, + {0xc028, 37}, + {0x8002, 45}, + {0x8009, 45}, + {0x8017, 45}, + {0xc028, 45}, + {0x8002, 46}, + {0x8009, 46}, + {0x8017, 46}, + {0xc028, 46}, + }, + /* 13 */ + { + {0x8003, 32}, + {0x8006, 32}, + {0x800a, 32}, + {0x800f, 32}, + {0x8018, 32}, + {0x801f, 32}, + {0x8029, 32}, + {0xc038, 32}, + {0x8003, 37}, + {0x8006, 37}, + {0x800a, 37}, + {0x800f, 37}, + {0x8018, 37}, + {0x801f, 37}, + {0x8029, 37}, + {0xc038, 37}, + }, + /* 14 */ + { + {0x8003, 45}, + {0x8006, 45}, + {0x800a, 45}, + {0x800f, 45}, + {0x8018, 45}, + {0x801f, 45}, + {0x8029, 45}, + {0xc038, 45}, + {0x8003, 46}, + {0x8006, 46}, + {0x800a, 46}, + {0x800f, 46}, + {0x8018, 46}, + {0x801f, 46}, + {0x8029, 46}, + {0xc038, 46}, + }, + /* 15 */ + { + {0x8001, 47}, + {0xc016, 47}, + {0x8001, 51}, + {0xc016, 51}, + {0x8001, 52}, + {0xc016, 52}, + {0x8001, 53}, + {0xc016, 53}, + {0x8001, 54}, + {0xc016, 54}, + {0x8001, 55}, + {0xc016, 55}, + {0x8001, 56}, + {0xc016, 56}, + {0x8001, 57}, + {0xc016, 57}, + }, + /* 16 */ + { + {0x8002, 47}, + {0x8009, 47}, + {0x8017, 47}, + {0xc028, 47}, + {0x8002, 51}, + {0x8009, 51}, + {0x8017, 51}, + {0xc028, 51}, + {0x8002, 52}, + {0x8009, 52}, + {0x8017, 52}, + {0xc028, 52}, + {0x8002, 53}, + {0x8009, 53}, + {0x8017, 53}, + {0xc028, 53}, + }, + /* 17 */ + { + {0x8003, 47}, + {0x8006, 47}, + {0x800a, 47}, + {0x800f, 47}, + {0x8018, 47}, + {0x801f, 47}, + {0x8029, 47}, + {0xc038, 47}, + {0x8003, 51}, + {0x8006, 51}, + {0x800a, 51}, + {0x800f, 51}, + {0x8018, 51}, + {0x801f, 51}, + {0x8029, 51}, + {0xc038, 51}, + }, + /* 18 */ + { + {0x8003, 52}, + {0x8006, 52}, + {0x800a, 52}, + {0x800f, 52}, + {0x8018, 52}, + {0x801f, 52}, + {0x8029, 52}, + {0xc038, 52}, + {0x8003, 53}, + {0x8006, 53}, + {0x800a, 53}, + {0x800f, 53}, + {0x8018, 53}, + {0x801f, 53}, + {0x8029, 53}, + {0xc038, 53}, + }, + /* 19 */ + { + {0x8002, 54}, + {0x8009, 54}, + {0x8017, 54}, + {0xc028, 54}, + {0x8002, 55}, + {0x8009, 55}, + {0x8017, 55}, + {0xc028, 55}, + {0x8002, 56}, + {0x8009, 56}, + {0x8017, 56}, + {0xc028, 56}, + {0x8002, 57}, + {0x8009, 57}, + {0x8017, 57}, + {0xc028, 57}, + }, + /* 20 */ + { + {0x8003, 54}, + {0x8006, 54}, + {0x800a, 54}, + {0x800f, 54}, + {0x8018, 54}, + {0x801f, 54}, + {0x8029, 54}, + {0xc038, 54}, + {0x8003, 55}, + {0x8006, 55}, + {0x800a, 55}, + {0x800f, 55}, + {0x8018, 55}, + {0x801f, 55}, + {0x8029, 55}, + {0xc038, 55}, + }, + /* 21 */ + { + {0x8003, 56}, + {0x8006, 56}, + {0x800a, 56}, + {0x800f, 56}, + {0x8018, 56}, + {0x801f, 56}, + {0x8029, 56}, + {0xc038, 56}, + {0x8003, 57}, + {0x8006, 57}, + {0x800a, 57}, + {0x800f, 57}, + {0x8018, 57}, + {0x801f, 57}, + {0x8029, 57}, + {0xc038, 57}, + }, + /* 22 */ + { + {0x1a, 0}, + {0x1b, 0}, + {0x1d, 0}, + {0x1e, 0}, + {0x21, 0}, + {0x22, 0}, + {0x24, 0}, + {0x25, 0}, + {0x2b, 0}, + {0x2e, 0}, + {0x32, 0}, + {0x35, 0}, + {0x3a, 0}, + {0x3d, 0}, + {0x41, 0}, + {0x4044, 0}, + }, + /* 23 */ + { + {0xc000, 61}, + {0xc000, 65}, + {0xc000, 95}, + {0xc000, 98}, + {0xc000, 100}, + {0xc000, 102}, + {0xc000, 103}, + {0xc000, 104}, + {0xc000, 108}, + {0xc000, 109}, + {0xc000, 110}, + {0xc000, 112}, + {0xc000, 114}, + {0xc000, 117}, + {0x26, 0}, + {0x27, 0}, + }, + /* 24 */ + { + {0x8001, 61}, + {0xc016, 61}, + {0x8001, 65}, + {0xc016, 65}, + {0x8001, 95}, + {0xc016, 95}, + {0x8001, 98}, + {0xc016, 98}, + {0x8001, 100}, + {0xc016, 100}, + {0x8001, 102}, + {0xc016, 102}, + {0x8001, 103}, + {0xc016, 103}, + {0x8001, 104}, + {0xc016, 104}, + }, + /* 25 */ + { + {0x8002, 61}, + {0x8009, 61}, + {0x8017, 61}, + {0xc028, 61}, + {0x8002, 65}, + {0x8009, 65}, + {0x8017, 65}, + {0xc028, 65}, + {0x8002, 95}, + {0x8009, 95}, + {0x8017, 95}, + {0xc028, 95}, + {0x8002, 98}, + {0x8009, 98}, + {0x8017, 98}, + {0xc028, 98}, + }, + /* 26 */ + { + {0x8003, 61}, + {0x8006, 61}, + {0x800a, 61}, + {0x800f, 61}, + {0x8018, 61}, + {0x801f, 61}, + {0x8029, 61}, + {0xc038, 61}, + {0x8003, 65}, + {0x8006, 65}, + {0x800a, 65}, + {0x800f, 65}, + {0x8018, 65}, + {0x801f, 65}, + {0x8029, 65}, + {0xc038, 65}, + }, + /* 27 */ + { + {0x8003, 95}, + {0x8006, 95}, + {0x800a, 95}, + {0x800f, 95}, + {0x8018, 95}, + {0x801f, 95}, + {0x8029, 95}, + {0xc038, 95}, + {0x8003, 98}, + {0x8006, 98}, + {0x800a, 98}, + {0x800f, 98}, + {0x8018, 98}, + {0x801f, 98}, + {0x8029, 98}, + {0xc038, 98}, + }, + /* 28 */ + { + {0x8002, 100}, + {0x8009, 100}, + {0x8017, 100}, + {0xc028, 100}, + {0x8002, 102}, + {0x8009, 102}, + {0x8017, 102}, + {0xc028, 102}, + {0x8002, 103}, + {0x8009, 103}, + {0x8017, 103}, + {0xc028, 103}, + {0x8002, 104}, + {0x8009, 104}, + {0x8017, 104}, + {0xc028, 104}, + }, + /* 29 */ + { + {0x8003, 100}, + {0x8006, 100}, + {0x800a, 100}, + {0x800f, 100}, + {0x8018, 100}, + {0x801f, 100}, + {0x8029, 100}, + {0xc038, 100}, + {0x8003, 102}, + {0x8006, 102}, + {0x800a, 102}, + {0x800f, 102}, + {0x8018, 102}, + {0x801f, 102}, + {0x8029, 102}, + {0xc038, 102}, + }, + /* 30 */ + { + {0x8003, 103}, + {0x8006, 103}, + {0x800a, 103}, + {0x800f, 103}, + {0x8018, 103}, + {0x801f, 103}, + {0x8029, 103}, + {0xc038, 103}, + {0x8003, 104}, + {0x8006, 104}, + {0x800a, 104}, + {0x800f, 104}, + {0x8018, 104}, + {0x801f, 104}, + {0x8029, 104}, + {0xc038, 104}, + }, + /* 31 */ + { + {0x8001, 108}, + {0xc016, 108}, + {0x8001, 109}, + {0xc016, 109}, + {0x8001, 110}, + {0xc016, 110}, + {0x8001, 112}, + {0xc016, 112}, + {0x8001, 114}, + {0xc016, 114}, + {0x8001, 117}, + {0xc016, 117}, + {0xc000, 58}, + {0xc000, 66}, + {0xc000, 67}, + {0xc000, 68}, + }, + /* 32 */ + { + {0x8002, 108}, + {0x8009, 108}, + {0x8017, 108}, + {0xc028, 108}, + {0x8002, 109}, + {0x8009, 109}, + {0x8017, 109}, + {0xc028, 109}, + {0x8002, 110}, + {0x8009, 110}, + {0x8017, 110}, + {0xc028, 110}, + {0x8002, 112}, + {0x8009, 112}, + {0x8017, 112}, + {0xc028, 112}, + }, + /* 33 */ + { + {0x8003, 108}, + {0x8006, 108}, + {0x800a, 108}, + {0x800f, 108}, + {0x8018, 108}, + {0x801f, 108}, + {0x8029, 108}, + {0xc038, 108}, + {0x8003, 109}, + {0x8006, 109}, + {0x800a, 109}, + {0x800f, 109}, + {0x8018, 109}, + {0x801f, 109}, + {0x8029, 109}, + {0xc038, 109}, + }, + /* 34 */ + { + {0x8003, 110}, + {0x8006, 110}, + {0x800a, 110}, + {0x800f, 110}, + {0x8018, 110}, + {0x801f, 110}, + {0x8029, 110}, + {0xc038, 110}, + {0x8003, 112}, + {0x8006, 112}, + {0x800a, 112}, + {0x800f, 112}, + {0x8018, 112}, + {0x801f, 112}, + {0x8029, 112}, + {0xc038, 112}, + }, + /* 35 */ + { + {0x8002, 114}, + {0x8009, 114}, + {0x8017, 114}, + {0xc028, 114}, + {0x8002, 117}, + {0x8009, 117}, + {0x8017, 117}, + {0xc028, 117}, + {0x8001, 58}, + {0xc016, 58}, + {0x8001, 66}, + {0xc016, 66}, + {0x8001, 67}, + {0xc016, 67}, + {0x8001, 68}, + {0xc016, 68}, + }, + /* 36 */ + { + {0x8003, 114}, + {0x8006, 114}, + {0x800a, 114}, + {0x800f, 114}, + {0x8018, 114}, + {0x801f, 114}, + {0x8029, 114}, + {0xc038, 114}, + {0x8003, 117}, + {0x8006, 117}, + {0x800a, 117}, + {0x800f, 117}, + {0x8018, 117}, + {0x801f, 117}, + {0x8029, 117}, + {0xc038, 117}, + }, + /* 37 */ + { + {0x8002, 58}, + {0x8009, 58}, + {0x8017, 58}, + {0xc028, 58}, + {0x8002, 66}, + {0x8009, 66}, + {0x8017, 66}, + {0xc028, 66}, + {0x8002, 67}, + {0x8009, 67}, + {0x8017, 67}, + {0xc028, 67}, + {0x8002, 68}, + {0x8009, 68}, + {0x8017, 68}, + {0xc028, 68}, + }, + /* 38 */ + { + {0x8003, 58}, + {0x8006, 58}, + {0x800a, 58}, + {0x800f, 58}, + {0x8018, 58}, + {0x801f, 58}, + {0x8029, 58}, + {0xc038, 58}, + {0x8003, 66}, + {0x8006, 66}, + {0x800a, 66}, + {0x800f, 66}, + {0x8018, 66}, + {0x801f, 66}, + {0x8029, 66}, + {0xc038, 66}, + }, + /* 39 */ + { + {0x8003, 67}, + {0x8006, 67}, + {0x800a, 67}, + {0x800f, 67}, + {0x8018, 67}, + {0x801f, 67}, + {0x8029, 67}, + {0xc038, 67}, + {0x8003, 68}, + {0x8006, 68}, + {0x800a, 68}, + {0x800f, 68}, + {0x8018, 68}, + {0x801f, 68}, + {0x8029, 68}, + {0xc038, 68}, + }, + /* 40 */ + { + {0x2c, 0}, + {0x2d, 0}, + {0x2f, 0}, + {0x30, 0}, + {0x33, 0}, + {0x34, 0}, + {0x36, 0}, + {0x37, 0}, + {0x3b, 0}, + {0x3c, 0}, + {0x3e, 0}, + {0x3f, 0}, + {0x42, 0}, + {0x43, 0}, + {0x45, 0}, + {0x4048, 0}, + }, + /* 41 */ + { + {0xc000, 69}, + {0xc000, 70}, + {0xc000, 71}, + {0xc000, 72}, + {0xc000, 73}, + {0xc000, 74}, + {0xc000, 75}, + {0xc000, 76}, + {0xc000, 77}, + {0xc000, 78}, + {0xc000, 79}, + {0xc000, 80}, + {0xc000, 81}, + {0xc000, 82}, + {0xc000, 83}, + {0xc000, 84}, + }, + /* 42 */ + { + {0x8001, 69}, + {0xc016, 69}, + {0x8001, 70}, + {0xc016, 70}, + {0x8001, 71}, + {0xc016, 71}, + {0x8001, 72}, + {0xc016, 72}, + {0x8001, 73}, + {0xc016, 73}, + {0x8001, 74}, + {0xc016, 74}, + {0x8001, 75}, + {0xc016, 75}, + {0x8001, 76}, + {0xc016, 76}, + }, + /* 43 */ + { + {0x8002, 69}, + {0x8009, 69}, + {0x8017, 69}, + {0xc028, 69}, + {0x8002, 70}, + {0x8009, 70}, + {0x8017, 70}, + {0xc028, 70}, + {0x8002, 71}, + {0x8009, 71}, + {0x8017, 71}, + {0xc028, 71}, + {0x8002, 72}, + {0x8009, 72}, + {0x8017, 72}, + {0xc028, 72}, + }, + /* 44 */ + { + {0x8003, 69}, + {0x8006, 69}, + {0x800a, 69}, + {0x800f, 69}, + {0x8018, 69}, + {0x801f, 69}, + {0x8029, 69}, + {0xc038, 69}, + {0x8003, 70}, + {0x8006, 70}, + {0x800a, 70}, + {0x800f, 70}, + {0x8018, 70}, + {0x801f, 70}, + {0x8029, 70}, + {0xc038, 70}, + }, + /* 45 */ + { + {0x8003, 71}, + {0x8006, 71}, + {0x800a, 71}, + {0x800f, 71}, + {0x8018, 71}, + {0x801f, 71}, + {0x8029, 71}, + {0xc038, 71}, + {0x8003, 72}, + {0x8006, 72}, + {0x800a, 72}, + {0x800f, 72}, + {0x8018, 72}, + {0x801f, 72}, + {0x8029, 72}, + {0xc038, 72}, + }, + /* 46 */ + { + {0x8002, 73}, + {0x8009, 73}, + {0x8017, 73}, + {0xc028, 73}, + {0x8002, 74}, + {0x8009, 74}, + {0x8017, 74}, + {0xc028, 74}, + {0x8002, 75}, + {0x8009, 75}, + {0x8017, 75}, + {0xc028, 75}, + {0x8002, 76}, + {0x8009, 76}, + {0x8017, 76}, + {0xc028, 76}, + }, + /* 47 */ + { + {0x8003, 73}, + {0x8006, 73}, + {0x800a, 73}, + {0x800f, 73}, + {0x8018, 73}, + {0x801f, 73}, + {0x8029, 73}, + {0xc038, 73}, + {0x8003, 74}, + {0x8006, 74}, + {0x800a, 74}, + {0x800f, 74}, + {0x8018, 74}, + {0x801f, 74}, + {0x8029, 74}, + {0xc038, 74}, + }, + /* 48 */ + { + {0x8003, 75}, + {0x8006, 75}, + {0x800a, 75}, + {0x800f, 75}, + {0x8018, 75}, + {0x801f, 75}, + {0x8029, 75}, + {0xc038, 75}, + {0x8003, 76}, + {0x8006, 76}, + {0x800a, 76}, + {0x800f, 76}, + {0x8018, 76}, + {0x801f, 76}, + {0x8029, 76}, + {0xc038, 76}, + }, + /* 49 */ + { + {0x8001, 77}, + {0xc016, 77}, + {0x8001, 78}, + {0xc016, 78}, + {0x8001, 79}, + {0xc016, 79}, + {0x8001, 80}, + {0xc016, 80}, + {0x8001, 81}, + {0xc016, 81}, + {0x8001, 82}, + {0xc016, 82}, + {0x8001, 83}, + {0xc016, 83}, + {0x8001, 84}, + {0xc016, 84}, + }, + /* 50 */ + { + {0x8002, 77}, + {0x8009, 77}, + {0x8017, 77}, + {0xc028, 77}, + {0x8002, 78}, + {0x8009, 78}, + {0x8017, 78}, + {0xc028, 78}, + {0x8002, 79}, + {0x8009, 79}, + {0x8017, 79}, + {0xc028, 79}, + {0x8002, 80}, + {0x8009, 80}, + {0x8017, 80}, + {0xc028, 80}, + }, + /* 51 */ + { + {0x8003, 77}, + {0x8006, 77}, + {0x800a, 77}, + {0x800f, 77}, + {0x8018, 77}, + {0x801f, 77}, + {0x8029, 77}, + {0xc038, 77}, + {0x8003, 78}, + {0x8006, 78}, + {0x800a, 78}, + {0x800f, 78}, + {0x8018, 78}, + {0x801f, 78}, + {0x8029, 78}, + {0xc038, 78}, + }, + /* 52 */ + { + {0x8003, 79}, + {0x8006, 79}, + {0x800a, 79}, + {0x800f, 79}, + {0x8018, 79}, + {0x801f, 79}, + {0x8029, 79}, + {0xc038, 79}, + {0x8003, 80}, + {0x8006, 80}, + {0x800a, 80}, + {0x800f, 80}, + {0x8018, 80}, + {0x801f, 80}, + {0x8029, 80}, + {0xc038, 80}, + }, + /* 53 */ + { + {0x8002, 81}, + {0x8009, 81}, + {0x8017, 81}, + {0xc028, 81}, + {0x8002, 82}, + {0x8009, 82}, + {0x8017, 82}, + {0xc028, 82}, + {0x8002, 83}, + {0x8009, 83}, + {0x8017, 83}, + {0xc028, 83}, + {0x8002, 84}, + {0x8009, 84}, + {0x8017, 84}, + {0xc028, 84}, + }, + /* 54 */ + { + {0x8003, 81}, + {0x8006, 81}, + {0x800a, 81}, + {0x800f, 81}, + {0x8018, 81}, + {0x801f, 81}, + {0x8029, 81}, + {0xc038, 81}, + {0x8003, 82}, + {0x8006, 82}, + {0x800a, 82}, + {0x800f, 82}, + {0x8018, 82}, + {0x801f, 82}, + {0x8029, 82}, + {0xc038, 82}, + }, + /* 55 */ + { + {0x8003, 83}, + {0x8006, 83}, + {0x800a, 83}, + {0x800f, 83}, + {0x8018, 83}, + {0x801f, 83}, + {0x8029, 83}, + {0xc038, 83}, + {0x8003, 84}, + {0x8006, 84}, + {0x800a, 84}, + {0x800f, 84}, + {0x8018, 84}, + {0x801f, 84}, + {0x8029, 84}, + {0xc038, 84}, + }, + /* 56 */ + { + {0xc000, 85}, + {0xc000, 86}, + {0xc000, 87}, + {0xc000, 89}, + {0xc000, 106}, + {0xc000, 107}, + {0xc000, 113}, + {0xc000, 118}, + {0xc000, 119}, + {0xc000, 120}, + {0xc000, 121}, + {0xc000, 122}, + {0x46, 0}, + {0x47, 0}, + {0x49, 0}, + {0x404a, 0}, + }, + /* 57 */ + { + {0x8001, 85}, + {0xc016, 85}, + {0x8001, 86}, + {0xc016, 86}, + {0x8001, 87}, + {0xc016, 87}, + {0x8001, 89}, + {0xc016, 89}, + {0x8001, 106}, + {0xc016, 106}, + {0x8001, 107}, + {0xc016, 107}, + {0x8001, 113}, + {0xc016, 113}, + {0x8001, 118}, + {0xc016, 118}, + }, + /* 58 */ + { + {0x8002, 85}, + {0x8009, 85}, + {0x8017, 85}, + {0xc028, 85}, + {0x8002, 86}, + {0x8009, 86}, + {0x8017, 86}, + {0xc028, 86}, + {0x8002, 87}, + {0x8009, 87}, + {0x8017, 87}, + {0xc028, 87}, + {0x8002, 89}, + {0x8009, 89}, + {0x8017, 89}, + {0xc028, 89}, + }, + /* 59 */ + { + {0x8003, 85}, + {0x8006, 85}, + {0x800a, 85}, + {0x800f, 85}, + {0x8018, 85}, + {0x801f, 85}, + {0x8029, 85}, + {0xc038, 85}, + {0x8003, 86}, + {0x8006, 86}, + {0x800a, 86}, + {0x800f, 86}, + {0x8018, 86}, + {0x801f, 86}, + {0x8029, 86}, + {0xc038, 86}, + }, + /* 60 */ + { + {0x8003, 87}, + {0x8006, 87}, + {0x800a, 87}, + {0x800f, 87}, + {0x8018, 87}, + {0x801f, 87}, + {0x8029, 87}, + {0xc038, 87}, + {0x8003, 89}, + {0x8006, 89}, + {0x800a, 89}, + {0x800f, 89}, + {0x8018, 89}, + {0x801f, 89}, + {0x8029, 89}, + {0xc038, 89}, + }, + /* 61 */ + { + {0x8002, 106}, + {0x8009, 106}, + {0x8017, 106}, + {0xc028, 106}, + {0x8002, 107}, + {0x8009, 107}, + {0x8017, 107}, + {0xc028, 107}, + {0x8002, 113}, + {0x8009, 113}, + {0x8017, 113}, + {0xc028, 113}, + {0x8002, 118}, + {0x8009, 118}, + {0x8017, 118}, + {0xc028, 118}, + }, + /* 62 */ + { + {0x8003, 106}, + {0x8006, 106}, + {0x800a, 106}, + {0x800f, 106}, + {0x8018, 106}, + {0x801f, 106}, + {0x8029, 106}, + {0xc038, 106}, + {0x8003, 107}, + {0x8006, 107}, + {0x800a, 107}, + {0x800f, 107}, + {0x8018, 107}, + {0x801f, 107}, + {0x8029, 107}, + {0xc038, 107}, + }, + /* 63 */ + { + {0x8003, 113}, + {0x8006, 113}, + {0x800a, 113}, + {0x800f, 113}, + {0x8018, 113}, + {0x801f, 113}, + {0x8029, 113}, + {0xc038, 113}, + {0x8003, 118}, + {0x8006, 118}, + {0x800a, 118}, + {0x800f, 118}, + {0x8018, 118}, + {0x801f, 118}, + {0x8029, 118}, + {0xc038, 118}, + }, + /* 64 */ + { + {0x8001, 119}, + {0xc016, 119}, + {0x8001, 120}, + {0xc016, 120}, + {0x8001, 121}, + {0xc016, 121}, + {0x8001, 122}, + {0xc016, 122}, + {0xc000, 38}, + {0xc000, 42}, + {0xc000, 44}, + {0xc000, 59}, + {0xc000, 88}, + {0xc000, 90}, + {0x4b, 0}, + {0x4e, 0}, + }, + /* 65 */ + { + {0x8002, 119}, + {0x8009, 119}, + {0x8017, 119}, + {0xc028, 119}, + {0x8002, 120}, + {0x8009, 120}, + {0x8017, 120}, + {0xc028, 120}, + {0x8002, 121}, + {0x8009, 121}, + {0x8017, 121}, + {0xc028, 121}, + {0x8002, 122}, + {0x8009, 122}, + {0x8017, 122}, + {0xc028, 122}, + }, + /* 66 */ + { + {0x8003, 119}, + {0x8006, 119}, + {0x800a, 119}, + {0x800f, 119}, + {0x8018, 119}, + {0x801f, 119}, + {0x8029, 119}, + {0xc038, 119}, + {0x8003, 120}, + {0x8006, 120}, + {0x800a, 120}, + {0x800f, 120}, + {0x8018, 120}, + {0x801f, 120}, + {0x8029, 120}, + {0xc038, 120}, + }, + /* 67 */ + { + {0x8003, 121}, + {0x8006, 121}, + {0x800a, 121}, + {0x800f, 121}, + {0x8018, 121}, + {0x801f, 121}, + {0x8029, 121}, + {0xc038, 121}, + {0x8003, 122}, + {0x8006, 122}, + {0x800a, 122}, + {0x800f, 122}, + {0x8018, 122}, + {0x801f, 122}, + {0x8029, 122}, + {0xc038, 122}, + }, + /* 68 */ + { + {0x8001, 38}, + {0xc016, 38}, + {0x8001, 42}, + {0xc016, 42}, + {0x8001, 44}, + {0xc016, 44}, + {0x8001, 59}, + {0xc016, 59}, + {0x8001, 88}, + {0xc016, 88}, + {0x8001, 90}, + {0xc016, 90}, + {0x4c, 0}, + {0x4d, 0}, + {0x4f, 0}, + {0x51, 0}, + }, + /* 69 */ + { + {0x8002, 38}, + {0x8009, 38}, + {0x8017, 38}, + {0xc028, 38}, + {0x8002, 42}, + {0x8009, 42}, + {0x8017, 42}, + {0xc028, 42}, + {0x8002, 44}, + {0x8009, 44}, + {0x8017, 44}, + {0xc028, 44}, + {0x8002, 59}, + {0x8009, 59}, + {0x8017, 59}, + {0xc028, 59}, + }, + /* 70 */ + { + {0x8003, 38}, + {0x8006, 38}, + {0x800a, 38}, + {0x800f, 38}, + {0x8018, 38}, + {0x801f, 38}, + {0x8029, 38}, + {0xc038, 38}, + {0x8003, 42}, + {0x8006, 42}, + {0x800a, 42}, + {0x800f, 42}, + {0x8018, 42}, + {0x801f, 42}, + {0x8029, 42}, + {0xc038, 42}, + }, + /* 71 */ + { + {0x8003, 44}, + {0x8006, 44}, + {0x800a, 44}, + {0x800f, 44}, + {0x8018, 44}, + {0x801f, 44}, + {0x8029, 44}, + {0xc038, 44}, + {0x8003, 59}, + {0x8006, 59}, + {0x800a, 59}, + {0x800f, 59}, + {0x8018, 59}, + {0x801f, 59}, + {0x8029, 59}, + {0xc038, 59}, + }, + /* 72 */ + { + {0x8002, 88}, + {0x8009, 88}, + {0x8017, 88}, + {0xc028, 88}, + {0x8002, 90}, + {0x8009, 90}, + {0x8017, 90}, + {0xc028, 90}, + {0xc000, 33}, + {0xc000, 34}, + {0xc000, 40}, + {0xc000, 41}, + {0xc000, 63}, + {0x50, 0}, + {0x52, 0}, + {0x54, 0}, + }, + /* 73 */ + { + {0x8003, 88}, + {0x8006, 88}, + {0x800a, 88}, + {0x800f, 88}, + {0x8018, 88}, + {0x801f, 88}, + {0x8029, 88}, + {0xc038, 88}, + {0x8003, 90}, + {0x8006, 90}, + {0x800a, 90}, + {0x800f, 90}, + {0x8018, 90}, + {0x801f, 90}, + {0x8029, 90}, + {0xc038, 90}, + }, + /* 74 */ + { + {0x8001, 33}, + {0xc016, 33}, + {0x8001, 34}, + {0xc016, 34}, + {0x8001, 40}, + {0xc016, 40}, + {0x8001, 41}, + {0xc016, 41}, + {0x8001, 63}, + {0xc016, 63}, + {0xc000, 39}, + {0xc000, 43}, + {0xc000, 124}, + {0x53, 0}, + {0x55, 0}, + {0x58, 0}, + }, + /* 75 */ + { + {0x8002, 33}, + {0x8009, 33}, + {0x8017, 33}, + {0xc028, 33}, + {0x8002, 34}, + {0x8009, 34}, + {0x8017, 34}, + {0xc028, 34}, + {0x8002, 40}, + {0x8009, 40}, + {0x8017, 40}, + {0xc028, 40}, + {0x8002, 41}, + {0x8009, 41}, + {0x8017, 41}, + {0xc028, 41}, + }, + /* 76 */ + { + {0x8003, 33}, + {0x8006, 33}, + {0x800a, 33}, + {0x800f, 33}, + {0x8018, 33}, + {0x801f, 33}, + {0x8029, 33}, + {0xc038, 33}, + {0x8003, 34}, + {0x8006, 34}, + {0x800a, 34}, + {0x800f, 34}, + {0x8018, 34}, + {0x801f, 34}, + {0x8029, 34}, + {0xc038, 34}, + }, + /* 77 */ + { + {0x8003, 40}, + {0x8006, 40}, + {0x800a, 40}, + {0x800f, 40}, + {0x8018, 40}, + {0x801f, 40}, + {0x8029, 40}, + {0xc038, 40}, + {0x8003, 41}, + {0x8006, 41}, + {0x800a, 41}, + {0x800f, 41}, + {0x8018, 41}, + {0x801f, 41}, + {0x8029, 41}, + {0xc038, 41}, + }, + /* 78 */ + { + {0x8002, 63}, + {0x8009, 63}, + {0x8017, 63}, + {0xc028, 63}, + {0x8001, 39}, + {0xc016, 39}, + {0x8001, 43}, + {0xc016, 43}, + {0x8001, 124}, + {0xc016, 124}, + {0xc000, 35}, + {0xc000, 62}, + {0x56, 0}, + {0x57, 0}, + {0x59, 0}, + {0x5a, 0}, + }, + /* 79 */ + { + {0x8003, 63}, + {0x8006, 63}, + {0x800a, 63}, + {0x800f, 63}, + {0x8018, 63}, + {0x801f, 63}, + {0x8029, 63}, + {0xc038, 63}, + {0x8002, 39}, + {0x8009, 39}, + {0x8017, 39}, + {0xc028, 39}, + {0x8002, 43}, + {0x8009, 43}, + {0x8017, 43}, + {0xc028, 43}, + }, + /* 80 */ + { + {0x8003, 39}, + {0x8006, 39}, + {0x800a, 39}, + {0x800f, 39}, + {0x8018, 39}, + {0x801f, 39}, + {0x8029, 39}, + {0xc038, 39}, + {0x8003, 43}, + {0x8006, 43}, + {0x800a, 43}, + {0x800f, 43}, + {0x8018, 43}, + {0x801f, 43}, + {0x8029, 43}, + {0xc038, 43}, + }, + /* 81 */ + { + {0x8002, 124}, + {0x8009, 124}, + {0x8017, 124}, + {0xc028, 124}, + {0x8001, 35}, + {0xc016, 35}, + {0x8001, 62}, + {0xc016, 62}, + {0xc000, 0}, + {0xc000, 36}, + {0xc000, 64}, + {0xc000, 91}, + {0xc000, 93}, + {0xc000, 126}, + {0x5b, 0}, + {0x5c, 0}, + }, + /* 82 */ + { + {0x8003, 124}, + {0x8006, 124}, + {0x800a, 124}, + {0x800f, 124}, + {0x8018, 124}, + {0x801f, 124}, + {0x8029, 124}, + {0xc038, 124}, + {0x8002, 35}, + {0x8009, 35}, + {0x8017, 35}, + {0xc028, 35}, + {0x8002, 62}, + {0x8009, 62}, + {0x8017, 62}, + {0xc028, 62}, + }, + /* 83 */ + { + {0x8003, 35}, + {0x8006, 35}, + {0x800a, 35}, + {0x800f, 35}, + {0x8018, 35}, + {0x801f, 35}, + {0x8029, 35}, + {0xc038, 35}, + {0x8003, 62}, + {0x8006, 62}, + {0x800a, 62}, + {0x800f, 62}, + {0x8018, 62}, + {0x801f, 62}, + {0x8029, 62}, + {0xc038, 62}, + }, + /* 84 */ + { + {0x8001, 0}, + {0xc016, 0}, + {0x8001, 36}, + {0xc016, 36}, + {0x8001, 64}, + {0xc016, 64}, + {0x8001, 91}, + {0xc016, 91}, + {0x8001, 93}, + {0xc016, 93}, + {0x8001, 126}, + {0xc016, 126}, + {0xc000, 94}, + {0xc000, 125}, + {0x5d, 0}, + {0x5e, 0}, + }, + /* 85 */ + { + {0x8002, 0}, + {0x8009, 0}, + {0x8017, 0}, + {0xc028, 0}, + {0x8002, 36}, + {0x8009, 36}, + {0x8017, 36}, + {0xc028, 36}, + {0x8002, 64}, + {0x8009, 64}, + {0x8017, 64}, + {0xc028, 64}, + {0x8002, 91}, + {0x8009, 91}, + {0x8017, 91}, + {0xc028, 91}, + }, + /* 86 */ + { + {0x8003, 0}, + {0x8006, 0}, + {0x800a, 0}, + {0x800f, 0}, + {0x8018, 0}, + {0x801f, 0}, + {0x8029, 0}, + {0xc038, 0}, + {0x8003, 36}, + {0x8006, 36}, + {0x800a, 36}, + {0x800f, 36}, + {0x8018, 36}, + {0x801f, 36}, + {0x8029, 36}, + {0xc038, 36}, + }, + /* 87 */ + { + {0x8003, 64}, + {0x8006, 64}, + {0x800a, 64}, + {0x800f, 64}, + {0x8018, 64}, + {0x801f, 64}, + {0x8029, 64}, + {0xc038, 64}, + {0x8003, 91}, + {0x8006, 91}, + {0x800a, 91}, + {0x800f, 91}, + {0x8018, 91}, + {0x801f, 91}, + {0x8029, 91}, + {0xc038, 91}, + }, + /* 88 */ + { + {0x8002, 93}, + {0x8009, 93}, + {0x8017, 93}, + {0xc028, 93}, + {0x8002, 126}, + {0x8009, 126}, + {0x8017, 126}, + {0xc028, 126}, + {0x8001, 94}, + {0xc016, 94}, + {0x8001, 125}, + {0xc016, 125}, + {0xc000, 60}, + {0xc000, 96}, + {0xc000, 123}, + {0x5f, 0}, + }, + /* 89 */ + { + {0x8003, 93}, + {0x8006, 93}, + {0x800a, 93}, + {0x800f, 93}, + {0x8018, 93}, + {0x801f, 93}, + {0x8029, 93}, + {0xc038, 93}, + {0x8003, 126}, + {0x8006, 126}, + {0x800a, 126}, + {0x800f, 126}, + {0x8018, 126}, + {0x801f, 126}, + {0x8029, 126}, + {0xc038, 126}, + }, + /* 90 */ + { + {0x8002, 94}, + {0x8009, 94}, + {0x8017, 94}, + {0xc028, 94}, + {0x8002, 125}, + {0x8009, 125}, + {0x8017, 125}, + {0xc028, 125}, + {0x8001, 60}, + {0xc016, 60}, + {0x8001, 96}, + {0xc016, 96}, + {0x8001, 123}, + {0xc016, 123}, + {0x60, 0}, + {0x6e, 0}, + }, + /* 91 */ + { + {0x8003, 94}, + {0x8006, 94}, + {0x800a, 94}, + {0x800f, 94}, + {0x8018, 94}, + {0x801f, 94}, + {0x8029, 94}, + {0xc038, 94}, + {0x8003, 125}, + {0x8006, 125}, + {0x800a, 125}, + {0x800f, 125}, + {0x8018, 125}, + {0x801f, 125}, + {0x8029, 125}, + {0xc038, 125}, + }, + /* 92 */ + { + {0x8002, 60}, + {0x8009, 60}, + {0x8017, 60}, + {0xc028, 60}, + {0x8002, 96}, + {0x8009, 96}, + {0x8017, 96}, + {0xc028, 96}, + {0x8002, 123}, + {0x8009, 123}, + {0x8017, 123}, + {0xc028, 123}, + {0x61, 0}, + {0x65, 0}, + {0x6f, 0}, + {0x85, 0}, + }, + /* 93 */ + { + {0x8003, 60}, + {0x8006, 60}, + {0x800a, 60}, + {0x800f, 60}, + {0x8018, 60}, + {0x801f, 60}, + {0x8029, 60}, + {0xc038, 60}, + {0x8003, 96}, + {0x8006, 96}, + {0x800a, 96}, + {0x800f, 96}, + {0x8018, 96}, + {0x801f, 96}, + {0x8029, 96}, + {0xc038, 96}, + }, + /* 94 */ + { + {0x8003, 123}, + {0x8006, 123}, + {0x800a, 123}, + {0x800f, 123}, + {0x8018, 123}, + {0x801f, 123}, + {0x8029, 123}, + {0xc038, 123}, + {0x62, 0}, + {0x63, 0}, + {0x66, 0}, + {0x69, 0}, + {0x70, 0}, + {0x77, 0}, + {0x86, 0}, + {0x99, 0}, + }, + /* 95 */ + { + {0xc000, 92}, + {0xc000, 195}, + {0xc000, 208}, + {0x64, 0}, + {0x67, 0}, + {0x68, 0}, + {0x6a, 0}, + {0x6b, 0}, + {0x71, 0}, + {0x74, 0}, + {0x78, 0}, + {0x7e, 0}, + {0x87, 0}, + {0x8e, 0}, + {0x9a, 0}, + {0xa9, 0}, + }, + /* 96 */ + { + {0x8001, 92}, + {0xc016, 92}, + {0x8001, 195}, + {0xc016, 195}, + {0x8001, 208}, + {0xc016, 208}, + {0xc000, 128}, + {0xc000, 130}, + {0xc000, 131}, + {0xc000, 162}, + {0xc000, 184}, + {0xc000, 194}, + {0xc000, 224}, + {0xc000, 226}, + {0x6c, 0}, + {0x6d, 0}, + }, + /* 97 */ + { + {0x8002, 92}, + {0x8009, 92}, + {0x8017, 92}, + {0xc028, 92}, + {0x8002, 195}, + {0x8009, 195}, + {0x8017, 195}, + {0xc028, 195}, + {0x8002, 208}, + {0x8009, 208}, + {0x8017, 208}, + {0xc028, 208}, + {0x8001, 128}, + {0xc016, 128}, + {0x8001, 130}, + {0xc016, 130}, + }, + /* 98 */ + { + {0x8003, 92}, + {0x8006, 92}, + {0x800a, 92}, + {0x800f, 92}, + {0x8018, 92}, + {0x801f, 92}, + {0x8029, 92}, + {0xc038, 92}, + {0x8003, 195}, + {0x8006, 195}, + {0x800a, 195}, + {0x800f, 195}, + {0x8018, 195}, + {0x801f, 195}, + {0x8029, 195}, + {0xc038, 195}, + }, + /* 99 */ + { + {0x8003, 208}, + {0x8006, 208}, + {0x800a, 208}, + {0x800f, 208}, + {0x8018, 208}, + {0x801f, 208}, + {0x8029, 208}, + {0xc038, 208}, + {0x8002, 128}, + {0x8009, 128}, + {0x8017, 128}, + {0xc028, 128}, + {0x8002, 130}, + {0x8009, 130}, + {0x8017, 130}, + {0xc028, 130}, + }, + /* 100 */ + { + {0x8003, 128}, + {0x8006, 128}, + {0x800a, 128}, + {0x800f, 128}, + {0x8018, 128}, + {0x801f, 128}, + {0x8029, 128}, + {0xc038, 128}, + {0x8003, 130}, + {0x8006, 130}, + {0x800a, 130}, + {0x800f, 130}, + {0x8018, 130}, + {0x801f, 130}, + {0x8029, 130}, + {0xc038, 130}, + }, + /* 101 */ + { + {0x8001, 131}, + {0xc016, 131}, + {0x8001, 162}, + {0xc016, 162}, + {0x8001, 184}, + {0xc016, 184}, + {0x8001, 194}, + {0xc016, 194}, + {0x8001, 224}, + {0xc016, 224}, + {0x8001, 226}, + {0xc016, 226}, + {0xc000, 153}, + {0xc000, 161}, + {0xc000, 167}, + {0xc000, 172}, + }, + /* 102 */ + { + {0x8002, 131}, + {0x8009, 131}, + {0x8017, 131}, + {0xc028, 131}, + {0x8002, 162}, + {0x8009, 162}, + {0x8017, 162}, + {0xc028, 162}, + {0x8002, 184}, + {0x8009, 184}, + {0x8017, 184}, + {0xc028, 184}, + {0x8002, 194}, + {0x8009, 194}, + {0x8017, 194}, + {0xc028, 194}, + }, + /* 103 */ + { + {0x8003, 131}, + {0x8006, 131}, + {0x800a, 131}, + {0x800f, 131}, + {0x8018, 131}, + {0x801f, 131}, + {0x8029, 131}, + {0xc038, 131}, + {0x8003, 162}, + {0x8006, 162}, + {0x800a, 162}, + {0x800f, 162}, + {0x8018, 162}, + {0x801f, 162}, + {0x8029, 162}, + {0xc038, 162}, + }, + /* 104 */ + { + {0x8003, 184}, + {0x8006, 184}, + {0x800a, 184}, + {0x800f, 184}, + {0x8018, 184}, + {0x801f, 184}, + {0x8029, 184}, + {0xc038, 184}, + {0x8003, 194}, + {0x8006, 194}, + {0x800a, 194}, + {0x800f, 194}, + {0x8018, 194}, + {0x801f, 194}, + {0x8029, 194}, + {0xc038, 194}, + }, + /* 105 */ + { + {0x8002, 224}, + {0x8009, 224}, + {0x8017, 224}, + {0xc028, 224}, + {0x8002, 226}, + {0x8009, 226}, + {0x8017, 226}, + {0xc028, 226}, + {0x8001, 153}, + {0xc016, 153}, + {0x8001, 161}, + {0xc016, 161}, + {0x8001, 167}, + {0xc016, 167}, + {0x8001, 172}, + {0xc016, 172}, + }, + /* 106 */ + { + {0x8003, 224}, + {0x8006, 224}, + {0x800a, 224}, + {0x800f, 224}, + {0x8018, 224}, + {0x801f, 224}, + {0x8029, 224}, + {0xc038, 224}, + {0x8003, 226}, + {0x8006, 226}, + {0x800a, 226}, + {0x800f, 226}, + {0x8018, 226}, + {0x801f, 226}, + {0x8029, 226}, + {0xc038, 226}, + }, + /* 107 */ + { + {0x8002, 153}, + {0x8009, 153}, + {0x8017, 153}, + {0xc028, 153}, + {0x8002, 161}, + {0x8009, 161}, + {0x8017, 161}, + {0xc028, 161}, + {0x8002, 167}, + {0x8009, 167}, + {0x8017, 167}, + {0xc028, 167}, + {0x8002, 172}, + {0x8009, 172}, + {0x8017, 172}, + {0xc028, 172}, + }, + /* 108 */ + { + {0x8003, 153}, + {0x8006, 153}, + {0x800a, 153}, + {0x800f, 153}, + {0x8018, 153}, + {0x801f, 153}, + {0x8029, 153}, + {0xc038, 153}, + {0x8003, 161}, + {0x8006, 161}, + {0x800a, 161}, + {0x800f, 161}, + {0x8018, 161}, + {0x801f, 161}, + {0x8029, 161}, + {0xc038, 161}, + }, + /* 109 */ + { + {0x8003, 167}, + {0x8006, 167}, + {0x800a, 167}, + {0x800f, 167}, + {0x8018, 167}, + {0x801f, 167}, + {0x8029, 167}, + {0xc038, 167}, + {0x8003, 172}, + {0x8006, 172}, + {0x800a, 172}, + {0x800f, 172}, + {0x8018, 172}, + {0x801f, 172}, + {0x8029, 172}, + {0xc038, 172}, + }, + /* 110 */ + { + {0x72, 0}, + {0x73, 0}, + {0x75, 0}, + {0x76, 0}, + {0x79, 0}, + {0x7b, 0}, + {0x7f, 0}, + {0x82, 0}, + {0x88, 0}, + {0x8b, 0}, + {0x8f, 0}, + {0x92, 0}, + {0x9b, 0}, + {0xa2, 0}, + {0xaa, 0}, + {0xb4, 0}, + }, + /* 111 */ + { + {0xc000, 176}, + {0xc000, 177}, + {0xc000, 179}, + {0xc000, 209}, + {0xc000, 216}, + {0xc000, 217}, + {0xc000, 227}, + {0xc000, 229}, + {0xc000, 230}, + {0x7a, 0}, + {0x7c, 0}, + {0x7d, 0}, + {0x80, 0}, + {0x81, 0}, + {0x83, 0}, + {0x84, 0}, + }, + /* 112 */ + { + {0x8001, 176}, + {0xc016, 176}, + {0x8001, 177}, + {0xc016, 177}, + {0x8001, 179}, + {0xc016, 179}, + {0x8001, 209}, + {0xc016, 209}, + {0x8001, 216}, + {0xc016, 216}, + {0x8001, 217}, + {0xc016, 217}, + {0x8001, 227}, + {0xc016, 227}, + {0x8001, 229}, + {0xc016, 229}, + }, + /* 113 */ + { + {0x8002, 176}, + {0x8009, 176}, + {0x8017, 176}, + {0xc028, 176}, + {0x8002, 177}, + {0x8009, 177}, + {0x8017, 177}, + {0xc028, 177}, + {0x8002, 179}, + {0x8009, 179}, + {0x8017, 179}, + {0xc028, 179}, + {0x8002, 209}, + {0x8009, 209}, + {0x8017, 209}, + {0xc028, 209}, + }, + /* 114 */ + { + {0x8003, 176}, + {0x8006, 176}, + {0x800a, 176}, + {0x800f, 176}, + {0x8018, 176}, + {0x801f, 176}, + {0x8029, 176}, + {0xc038, 176}, + {0x8003, 177}, + {0x8006, 177}, + {0x800a, 177}, + {0x800f, 177}, + {0x8018, 177}, + {0x801f, 177}, + {0x8029, 177}, + {0xc038, 177}, + }, + /* 115 */ + { + {0x8003, 179}, + {0x8006, 179}, + {0x800a, 179}, + {0x800f, 179}, + {0x8018, 179}, + {0x801f, 179}, + {0x8029, 179}, + {0xc038, 179}, + {0x8003, 209}, + {0x8006, 209}, + {0x800a, 209}, + {0x800f, 209}, + {0x8018, 209}, + {0x801f, 209}, + {0x8029, 209}, + {0xc038, 209}, + }, + /* 116 */ + { + {0x8002, 216}, + {0x8009, 216}, + {0x8017, 216}, + {0xc028, 216}, + {0x8002, 217}, + {0x8009, 217}, + {0x8017, 217}, + {0xc028, 217}, + {0x8002, 227}, + {0x8009, 227}, + {0x8017, 227}, + {0xc028, 227}, + {0x8002, 229}, + {0x8009, 229}, + {0x8017, 229}, + {0xc028, 229}, + }, + /* 117 */ + { + {0x8003, 216}, + {0x8006, 216}, + {0x800a, 216}, + {0x800f, 216}, + {0x8018, 216}, + {0x801f, 216}, + {0x8029, 216}, + {0xc038, 216}, + {0x8003, 217}, + {0x8006, 217}, + {0x800a, 217}, + {0x800f, 217}, + {0x8018, 217}, + {0x801f, 217}, + {0x8029, 217}, + {0xc038, 217}, + }, + /* 118 */ + { + {0x8003, 227}, + {0x8006, 227}, + {0x800a, 227}, + {0x800f, 227}, + {0x8018, 227}, + {0x801f, 227}, + {0x8029, 227}, + {0xc038, 227}, + {0x8003, 229}, + {0x8006, 229}, + {0x800a, 229}, + {0x800f, 229}, + {0x8018, 229}, + {0x801f, 229}, + {0x8029, 229}, + {0xc038, 229}, + }, + /* 119 */ + { + {0x8001, 230}, + {0xc016, 230}, + {0xc000, 129}, + {0xc000, 132}, + {0xc000, 133}, + {0xc000, 134}, + {0xc000, 136}, + {0xc000, 146}, + {0xc000, 154}, + {0xc000, 156}, + {0xc000, 160}, + {0xc000, 163}, + {0xc000, 164}, + {0xc000, 169}, + {0xc000, 170}, + {0xc000, 173}, + }, + /* 120 */ + { + {0x8002, 230}, + {0x8009, 230}, + {0x8017, 230}, + {0xc028, 230}, + {0x8001, 129}, + {0xc016, 129}, + {0x8001, 132}, + {0xc016, 132}, + {0x8001, 133}, + {0xc016, 133}, + {0x8001, 134}, + {0xc016, 134}, + {0x8001, 136}, + {0xc016, 136}, + {0x8001, 146}, + {0xc016, 146}, + }, + /* 121 */ + { + {0x8003, 230}, + {0x8006, 230}, + {0x800a, 230}, + {0x800f, 230}, + {0x8018, 230}, + {0x801f, 230}, + {0x8029, 230}, + {0xc038, 230}, + {0x8002, 129}, + {0x8009, 129}, + {0x8017, 129}, + {0xc028, 129}, + {0x8002, 132}, + {0x8009, 132}, + {0x8017, 132}, + {0xc028, 132}, + }, + /* 122 */ + { + {0x8003, 129}, + {0x8006, 129}, + {0x800a, 129}, + {0x800f, 129}, + {0x8018, 129}, + {0x801f, 129}, + {0x8029, 129}, + {0xc038, 129}, + {0x8003, 132}, + {0x8006, 132}, + {0x800a, 132}, + {0x800f, 132}, + {0x8018, 132}, + {0x801f, 132}, + {0x8029, 132}, + {0xc038, 132}, + }, + /* 123 */ + { + {0x8002, 133}, + {0x8009, 133}, + {0x8017, 133}, + {0xc028, 133}, + {0x8002, 134}, + {0x8009, 134}, + {0x8017, 134}, + {0xc028, 134}, + {0x8002, 136}, + {0x8009, 136}, + {0x8017, 136}, + {0xc028, 136}, + {0x8002, 146}, + {0x8009, 146}, + {0x8017, 146}, + {0xc028, 146}, + }, + /* 124 */ + { + {0x8003, 133}, + {0x8006, 133}, + {0x800a, 133}, + {0x800f, 133}, + {0x8018, 133}, + {0x801f, 133}, + {0x8029, 133}, + {0xc038, 133}, + {0x8003, 134}, + {0x8006, 134}, + {0x800a, 134}, + {0x800f, 134}, + {0x8018, 134}, + {0x801f, 134}, + {0x8029, 134}, + {0xc038, 134}, + }, + /* 125 */ + { + {0x8003, 136}, + {0x8006, 136}, + {0x800a, 136}, + {0x800f, 136}, + {0x8018, 136}, + {0x801f, 136}, + {0x8029, 136}, + {0xc038, 136}, + {0x8003, 146}, + {0x8006, 146}, + {0x800a, 146}, + {0x800f, 146}, + {0x8018, 146}, + {0x801f, 146}, + {0x8029, 146}, + {0xc038, 146}, + }, + /* 126 */ + { + {0x8001, 154}, + {0xc016, 154}, + {0x8001, 156}, + {0xc016, 156}, + {0x8001, 160}, + {0xc016, 160}, + {0x8001, 163}, + {0xc016, 163}, + {0x8001, 164}, + {0xc016, 164}, + {0x8001, 169}, + {0xc016, 169}, + {0x8001, 170}, + {0xc016, 170}, + {0x8001, 173}, + {0xc016, 173}, + }, + /* 127 */ + { + {0x8002, 154}, + {0x8009, 154}, + {0x8017, 154}, + {0xc028, 154}, + {0x8002, 156}, + {0x8009, 156}, + {0x8017, 156}, + {0xc028, 156}, + {0x8002, 160}, + {0x8009, 160}, + {0x8017, 160}, + {0xc028, 160}, + {0x8002, 163}, + {0x8009, 163}, + {0x8017, 163}, + {0xc028, 163}, + }, + /* 128 */ + { + {0x8003, 154}, + {0x8006, 154}, + {0x800a, 154}, + {0x800f, 154}, + {0x8018, 154}, + {0x801f, 154}, + {0x8029, 154}, + {0xc038, 154}, + {0x8003, 156}, + {0x8006, 156}, + {0x800a, 156}, + {0x800f, 156}, + {0x8018, 156}, + {0x801f, 156}, + {0x8029, 156}, + {0xc038, 156}, + }, + /* 129 */ + { + {0x8003, 160}, + {0x8006, 160}, + {0x800a, 160}, + {0x800f, 160}, + {0x8018, 160}, + {0x801f, 160}, + {0x8029, 160}, + {0xc038, 160}, + {0x8003, 163}, + {0x8006, 163}, + {0x800a, 163}, + {0x800f, 163}, + {0x8018, 163}, + {0x801f, 163}, + {0x8029, 163}, + {0xc038, 163}, + }, + /* 130 */ + { + {0x8002, 164}, + {0x8009, 164}, + {0x8017, 164}, + {0xc028, 164}, + {0x8002, 169}, + {0x8009, 169}, + {0x8017, 169}, + {0xc028, 169}, + {0x8002, 170}, + {0x8009, 170}, + {0x8017, 170}, + {0xc028, 170}, + {0x8002, 173}, + {0x8009, 173}, + {0x8017, 173}, + {0xc028, 173}, + }, + /* 131 */ + { + {0x8003, 164}, + {0x8006, 164}, + {0x800a, 164}, + {0x800f, 164}, + {0x8018, 164}, + {0x801f, 164}, + {0x8029, 164}, + {0xc038, 164}, + {0x8003, 169}, + {0x8006, 169}, + {0x800a, 169}, + {0x800f, 169}, + {0x8018, 169}, + {0x801f, 169}, + {0x8029, 169}, + {0xc038, 169}, + }, + /* 132 */ + { + {0x8003, 170}, + {0x8006, 170}, + {0x800a, 170}, + {0x800f, 170}, + {0x8018, 170}, + {0x801f, 170}, + {0x8029, 170}, + {0xc038, 170}, + {0x8003, 173}, + {0x8006, 173}, + {0x800a, 173}, + {0x800f, 173}, + {0x8018, 173}, + {0x801f, 173}, + {0x8029, 173}, + {0xc038, 173}, + }, + /* 133 */ + { + {0x89, 0}, + {0x8a, 0}, + {0x8c, 0}, + {0x8d, 0}, + {0x90, 0}, + {0x91, 0}, + {0x93, 0}, + {0x96, 0}, + {0x9c, 0}, + {0x9f, 0}, + {0xa3, 0}, + {0xa6, 0}, + {0xab, 0}, + {0xae, 0}, + {0xb5, 0}, + {0xbe, 0}, + }, + /* 134 */ + { + {0xc000, 178}, + {0xc000, 181}, + {0xc000, 185}, + {0xc000, 186}, + {0xc000, 187}, + {0xc000, 189}, + {0xc000, 190}, + {0xc000, 196}, + {0xc000, 198}, + {0xc000, 228}, + {0xc000, 232}, + {0xc000, 233}, + {0x94, 0}, + {0x95, 0}, + {0x97, 0}, + {0x98, 0}, + }, + /* 135 */ + { + {0x8001, 178}, + {0xc016, 178}, + {0x8001, 181}, + {0xc016, 181}, + {0x8001, 185}, + {0xc016, 185}, + {0x8001, 186}, + {0xc016, 186}, + {0x8001, 187}, + {0xc016, 187}, + {0x8001, 189}, + {0xc016, 189}, + {0x8001, 190}, + {0xc016, 190}, + {0x8001, 196}, + {0xc016, 196}, + }, + /* 136 */ + { + {0x8002, 178}, + {0x8009, 178}, + {0x8017, 178}, + {0xc028, 178}, + {0x8002, 181}, + {0x8009, 181}, + {0x8017, 181}, + {0xc028, 181}, + {0x8002, 185}, + {0x8009, 185}, + {0x8017, 185}, + {0xc028, 185}, + {0x8002, 186}, + {0x8009, 186}, + {0x8017, 186}, + {0xc028, 186}, + }, + /* 137 */ + { + {0x8003, 178}, + {0x8006, 178}, + {0x800a, 178}, + {0x800f, 178}, + {0x8018, 178}, + {0x801f, 178}, + {0x8029, 178}, + {0xc038, 178}, + {0x8003, 181}, + {0x8006, 181}, + {0x800a, 181}, + {0x800f, 181}, + {0x8018, 181}, + {0x801f, 181}, + {0x8029, 181}, + {0xc038, 181}, + }, + /* 138 */ + { + {0x8003, 185}, + {0x8006, 185}, + {0x800a, 185}, + {0x800f, 185}, + {0x8018, 185}, + {0x801f, 185}, + {0x8029, 185}, + {0xc038, 185}, + {0x8003, 186}, + {0x8006, 186}, + {0x800a, 186}, + {0x800f, 186}, + {0x8018, 186}, + {0x801f, 186}, + {0x8029, 186}, + {0xc038, 186}, + }, + /* 139 */ + { + {0x8002, 187}, + {0x8009, 187}, + {0x8017, 187}, + {0xc028, 187}, + {0x8002, 189}, + {0x8009, 189}, + {0x8017, 189}, + {0xc028, 189}, + {0x8002, 190}, + {0x8009, 190}, + {0x8017, 190}, + {0xc028, 190}, + {0x8002, 196}, + {0x8009, 196}, + {0x8017, 196}, + {0xc028, 196}, + }, + /* 140 */ + { + {0x8003, 187}, + {0x8006, 187}, + {0x800a, 187}, + {0x800f, 187}, + {0x8018, 187}, + {0x801f, 187}, + {0x8029, 187}, + {0xc038, 187}, + {0x8003, 189}, + {0x8006, 189}, + {0x800a, 189}, + {0x800f, 189}, + {0x8018, 189}, + {0x801f, 189}, + {0x8029, 189}, + {0xc038, 189}, + }, + /* 141 */ + { + {0x8003, 190}, + {0x8006, 190}, + {0x800a, 190}, + {0x800f, 190}, + {0x8018, 190}, + {0x801f, 190}, + {0x8029, 190}, + {0xc038, 190}, + {0x8003, 196}, + {0x8006, 196}, + {0x800a, 196}, + {0x800f, 196}, + {0x8018, 196}, + {0x801f, 196}, + {0x8029, 196}, + {0xc038, 196}, + }, + /* 142 */ + { + {0x8001, 198}, + {0xc016, 198}, + {0x8001, 228}, + {0xc016, 228}, + {0x8001, 232}, + {0xc016, 232}, + {0x8001, 233}, + {0xc016, 233}, + {0xc000, 1}, + {0xc000, 135}, + {0xc000, 137}, + {0xc000, 138}, + {0xc000, 139}, + {0xc000, 140}, + {0xc000, 141}, + {0xc000, 143}, + }, + /* 143 */ + { + {0x8002, 198}, + {0x8009, 198}, + {0x8017, 198}, + {0xc028, 198}, + {0x8002, 228}, + {0x8009, 228}, + {0x8017, 228}, + {0xc028, 228}, + {0x8002, 232}, + {0x8009, 232}, + {0x8017, 232}, + {0xc028, 232}, + {0x8002, 233}, + {0x8009, 233}, + {0x8017, 233}, + {0xc028, 233}, + }, + /* 144 */ + { + {0x8003, 198}, + {0x8006, 198}, + {0x800a, 198}, + {0x800f, 198}, + {0x8018, 198}, + {0x801f, 198}, + {0x8029, 198}, + {0xc038, 198}, + {0x8003, 228}, + {0x8006, 228}, + {0x800a, 228}, + {0x800f, 228}, + {0x8018, 228}, + {0x801f, 228}, + {0x8029, 228}, + {0xc038, 228}, + }, + /* 145 */ + { + {0x8003, 232}, + {0x8006, 232}, + {0x800a, 232}, + {0x800f, 232}, + {0x8018, 232}, + {0x801f, 232}, + {0x8029, 232}, + {0xc038, 232}, + {0x8003, 233}, + {0x8006, 233}, + {0x800a, 233}, + {0x800f, 233}, + {0x8018, 233}, + {0x801f, 233}, + {0x8029, 233}, + {0xc038, 233}, + }, + /* 146 */ + { + {0x8001, 1}, + {0xc016, 1}, + {0x8001, 135}, + {0xc016, 135}, + {0x8001, 137}, + {0xc016, 137}, + {0x8001, 138}, + {0xc016, 138}, + {0x8001, 139}, + {0xc016, 139}, + {0x8001, 140}, + {0xc016, 140}, + {0x8001, 141}, + {0xc016, 141}, + {0x8001, 143}, + {0xc016, 143}, + }, + /* 147 */ + { + {0x8002, 1}, + {0x8009, 1}, + {0x8017, 1}, + {0xc028, 1}, + {0x8002, 135}, + {0x8009, 135}, + {0x8017, 135}, + {0xc028, 135}, + {0x8002, 137}, + {0x8009, 137}, + {0x8017, 137}, + {0xc028, 137}, + {0x8002, 138}, + {0x8009, 138}, + {0x8017, 138}, + {0xc028, 138}, + }, + /* 148 */ + { + {0x8003, 1}, + {0x8006, 1}, + {0x800a, 1}, + {0x800f, 1}, + {0x8018, 1}, + {0x801f, 1}, + {0x8029, 1}, + {0xc038, 1}, + {0x8003, 135}, + {0x8006, 135}, + {0x800a, 135}, + {0x800f, 135}, + {0x8018, 135}, + {0x801f, 135}, + {0x8029, 135}, + {0xc038, 135}, + }, + /* 149 */ + { + {0x8003, 137}, + {0x8006, 137}, + {0x800a, 137}, + {0x800f, 137}, + {0x8018, 137}, + {0x801f, 137}, + {0x8029, 137}, + {0xc038, 137}, + {0x8003, 138}, + {0x8006, 138}, + {0x800a, 138}, + {0x800f, 138}, + {0x8018, 138}, + {0x801f, 138}, + {0x8029, 138}, + {0xc038, 138}, + }, + /* 150 */ + { + {0x8002, 139}, + {0x8009, 139}, + {0x8017, 139}, + {0xc028, 139}, + {0x8002, 140}, + {0x8009, 140}, + {0x8017, 140}, + {0xc028, 140}, + {0x8002, 141}, + {0x8009, 141}, + {0x8017, 141}, + {0xc028, 141}, + {0x8002, 143}, + {0x8009, 143}, + {0x8017, 143}, + {0xc028, 143}, + }, + /* 151 */ + { + {0x8003, 139}, + {0x8006, 139}, + {0x800a, 139}, + {0x800f, 139}, + {0x8018, 139}, + {0x801f, 139}, + {0x8029, 139}, + {0xc038, 139}, + {0x8003, 140}, + {0x8006, 140}, + {0x800a, 140}, + {0x800f, 140}, + {0x8018, 140}, + {0x801f, 140}, + {0x8029, 140}, + {0xc038, 140}, + }, + /* 152 */ + { + {0x8003, 141}, + {0x8006, 141}, + {0x800a, 141}, + {0x800f, 141}, + {0x8018, 141}, + {0x801f, 141}, + {0x8029, 141}, + {0xc038, 141}, + {0x8003, 143}, + {0x8006, 143}, + {0x800a, 143}, + {0x800f, 143}, + {0x8018, 143}, + {0x801f, 143}, + {0x8029, 143}, + {0xc038, 143}, + }, + /* 153 */ + { + {0x9d, 0}, + {0x9e, 0}, + {0xa0, 0}, + {0xa1, 0}, + {0xa4, 0}, + {0xa5, 0}, + {0xa7, 0}, + {0xa8, 0}, + {0xac, 0}, + {0xad, 0}, + {0xaf, 0}, + {0xb1, 0}, + {0xb6, 0}, + {0xb9, 0}, + {0xbf, 0}, + {0xcf, 0}, + }, + /* 154 */ + { + {0xc000, 147}, + {0xc000, 149}, + {0xc000, 150}, + {0xc000, 151}, + {0xc000, 152}, + {0xc000, 155}, + {0xc000, 157}, + {0xc000, 158}, + {0xc000, 165}, + {0xc000, 166}, + {0xc000, 168}, + {0xc000, 174}, + {0xc000, 175}, + {0xc000, 180}, + {0xc000, 182}, + {0xc000, 183}, + }, + /* 155 */ + { + {0x8001, 147}, + {0xc016, 147}, + {0x8001, 149}, + {0xc016, 149}, + {0x8001, 150}, + {0xc016, 150}, + {0x8001, 151}, + {0xc016, 151}, + {0x8001, 152}, + {0xc016, 152}, + {0x8001, 155}, + {0xc016, 155}, + {0x8001, 157}, + {0xc016, 157}, + {0x8001, 158}, + {0xc016, 158}, + }, + /* 156 */ + { + {0x8002, 147}, + {0x8009, 147}, + {0x8017, 147}, + {0xc028, 147}, + {0x8002, 149}, + {0x8009, 149}, + {0x8017, 149}, + {0xc028, 149}, + {0x8002, 150}, + {0x8009, 150}, + {0x8017, 150}, + {0xc028, 150}, + {0x8002, 151}, + {0x8009, 151}, + {0x8017, 151}, + {0xc028, 151}, + }, + /* 157 */ + { + {0x8003, 147}, + {0x8006, 147}, + {0x800a, 147}, + {0x800f, 147}, + {0x8018, 147}, + {0x801f, 147}, + {0x8029, 147}, + {0xc038, 147}, + {0x8003, 149}, + {0x8006, 149}, + {0x800a, 149}, + {0x800f, 149}, + {0x8018, 149}, + {0x801f, 149}, + {0x8029, 149}, + {0xc038, 149}, + }, + /* 158 */ + { + {0x8003, 150}, + {0x8006, 150}, + {0x800a, 150}, + {0x800f, 150}, + {0x8018, 150}, + {0x801f, 150}, + {0x8029, 150}, + {0xc038, 150}, + {0x8003, 151}, + {0x8006, 151}, + {0x800a, 151}, + {0x800f, 151}, + {0x8018, 151}, + {0x801f, 151}, + {0x8029, 151}, + {0xc038, 151}, + }, + /* 159 */ + { + {0x8002, 152}, + {0x8009, 152}, + {0x8017, 152}, + {0xc028, 152}, + {0x8002, 155}, + {0x8009, 155}, + {0x8017, 155}, + {0xc028, 155}, + {0x8002, 157}, + {0x8009, 157}, + {0x8017, 157}, + {0xc028, 157}, + {0x8002, 158}, + {0x8009, 158}, + {0x8017, 158}, + {0xc028, 158}, + }, + /* 160 */ + { + {0x8003, 152}, + {0x8006, 152}, + {0x800a, 152}, + {0x800f, 152}, + {0x8018, 152}, + {0x801f, 152}, + {0x8029, 152}, + {0xc038, 152}, + {0x8003, 155}, + {0x8006, 155}, + {0x800a, 155}, + {0x800f, 155}, + {0x8018, 155}, + {0x801f, 155}, + {0x8029, 155}, + {0xc038, 155}, + }, + /* 161 */ + { + {0x8003, 157}, + {0x8006, 157}, + {0x800a, 157}, + {0x800f, 157}, + {0x8018, 157}, + {0x801f, 157}, + {0x8029, 157}, + {0xc038, 157}, + {0x8003, 158}, + {0x8006, 158}, + {0x800a, 158}, + {0x800f, 158}, + {0x8018, 158}, + {0x801f, 158}, + {0x8029, 158}, + {0xc038, 158}, + }, + /* 162 */ + { + {0x8001, 165}, + {0xc016, 165}, + {0x8001, 166}, + {0xc016, 166}, + {0x8001, 168}, + {0xc016, 168}, + {0x8001, 174}, + {0xc016, 174}, + {0x8001, 175}, + {0xc016, 175}, + {0x8001, 180}, + {0xc016, 180}, + {0x8001, 182}, + {0xc016, 182}, + {0x8001, 183}, + {0xc016, 183}, + }, + /* 163 */ + { + {0x8002, 165}, + {0x8009, 165}, + {0x8017, 165}, + {0xc028, 165}, + {0x8002, 166}, + {0x8009, 166}, + {0x8017, 166}, + {0xc028, 166}, + {0x8002, 168}, + {0x8009, 168}, + {0x8017, 168}, + {0xc028, 168}, + {0x8002, 174}, + {0x8009, 174}, + {0x8017, 174}, + {0xc028, 174}, + }, + /* 164 */ + { + {0x8003, 165}, + {0x8006, 165}, + {0x800a, 165}, + {0x800f, 165}, + {0x8018, 165}, + {0x801f, 165}, + {0x8029, 165}, + {0xc038, 165}, + {0x8003, 166}, + {0x8006, 166}, + {0x800a, 166}, + {0x800f, 166}, + {0x8018, 166}, + {0x801f, 166}, + {0x8029, 166}, + {0xc038, 166}, + }, + /* 165 */ + { + {0x8003, 168}, + {0x8006, 168}, + {0x800a, 168}, + {0x800f, 168}, + {0x8018, 168}, + {0x801f, 168}, + {0x8029, 168}, + {0xc038, 168}, + {0x8003, 174}, + {0x8006, 174}, + {0x800a, 174}, + {0x800f, 174}, + {0x8018, 174}, + {0x801f, 174}, + {0x8029, 174}, + {0xc038, 174}, + }, + /* 166 */ + { + {0x8002, 175}, + {0x8009, 175}, + {0x8017, 175}, + {0xc028, 175}, + {0x8002, 180}, + {0x8009, 180}, + {0x8017, 180}, + {0xc028, 180}, + {0x8002, 182}, + {0x8009, 182}, + {0x8017, 182}, + {0xc028, 182}, + {0x8002, 183}, + {0x8009, 183}, + {0x8017, 183}, + {0xc028, 183}, + }, + /* 167 */ + { + {0x8003, 175}, + {0x8006, 175}, + {0x800a, 175}, + {0x800f, 175}, + {0x8018, 175}, + {0x801f, 175}, + {0x8029, 175}, + {0xc038, 175}, + {0x8003, 180}, + {0x8006, 180}, + {0x800a, 180}, + {0x800f, 180}, + {0x8018, 180}, + {0x801f, 180}, + {0x8029, 180}, + {0xc038, 180}, + }, + /* 168 */ + { + {0x8003, 182}, + {0x8006, 182}, + {0x800a, 182}, + {0x800f, 182}, + {0x8018, 182}, + {0x801f, 182}, + {0x8029, 182}, + {0xc038, 182}, + {0x8003, 183}, + {0x8006, 183}, + {0x800a, 183}, + {0x800f, 183}, + {0x8018, 183}, + {0x801f, 183}, + {0x8029, 183}, + {0xc038, 183}, + }, + /* 169 */ + { + {0xc000, 188}, + {0xc000, 191}, + {0xc000, 197}, + {0xc000, 231}, + {0xc000, 239}, + {0xb0, 0}, + {0xb2, 0}, + {0xb3, 0}, + {0xb7, 0}, + {0xb8, 0}, + {0xba, 0}, + {0xbb, 0}, + {0xc0, 0}, + {0xc7, 0}, + {0xd0, 0}, + {0xdf, 0}, + }, + /* 170 */ + { + {0x8001, 188}, + {0xc016, 188}, + {0x8001, 191}, + {0xc016, 191}, + {0x8001, 197}, + {0xc016, 197}, + {0x8001, 231}, + {0xc016, 231}, + {0x8001, 239}, + {0xc016, 239}, + {0xc000, 9}, + {0xc000, 142}, + {0xc000, 144}, + {0xc000, 145}, + {0xc000, 148}, + {0xc000, 159}, + }, + /* 171 */ + { + {0x8002, 188}, + {0x8009, 188}, + {0x8017, 188}, + {0xc028, 188}, + {0x8002, 191}, + {0x8009, 191}, + {0x8017, 191}, + {0xc028, 191}, + {0x8002, 197}, + {0x8009, 197}, + {0x8017, 197}, + {0xc028, 197}, + {0x8002, 231}, + {0x8009, 231}, + {0x8017, 231}, + {0xc028, 231}, + }, + /* 172 */ + { + {0x8003, 188}, + {0x8006, 188}, + {0x800a, 188}, + {0x800f, 188}, + {0x8018, 188}, + {0x801f, 188}, + {0x8029, 188}, + {0xc038, 188}, + {0x8003, 191}, + {0x8006, 191}, + {0x800a, 191}, + {0x800f, 191}, + {0x8018, 191}, + {0x801f, 191}, + {0x8029, 191}, + {0xc038, 191}, + }, + /* 173 */ + { + {0x8003, 197}, + {0x8006, 197}, + {0x800a, 197}, + {0x800f, 197}, + {0x8018, 197}, + {0x801f, 197}, + {0x8029, 197}, + {0xc038, 197}, + {0x8003, 231}, + {0x8006, 231}, + {0x800a, 231}, + {0x800f, 231}, + {0x8018, 231}, + {0x801f, 231}, + {0x8029, 231}, + {0xc038, 231}, + }, + /* 174 */ + { + {0x8002, 239}, + {0x8009, 239}, + {0x8017, 239}, + {0xc028, 239}, + {0x8001, 9}, + {0xc016, 9}, + {0x8001, 142}, + {0xc016, 142}, + {0x8001, 144}, + {0xc016, 144}, + {0x8001, 145}, + {0xc016, 145}, + {0x8001, 148}, + {0xc016, 148}, + {0x8001, 159}, + {0xc016, 159}, + }, + /* 175 */ + { + {0x8003, 239}, + {0x8006, 239}, + {0x800a, 239}, + {0x800f, 239}, + {0x8018, 239}, + {0x801f, 239}, + {0x8029, 239}, + {0xc038, 239}, + {0x8002, 9}, + {0x8009, 9}, + {0x8017, 9}, + {0xc028, 9}, + {0x8002, 142}, + {0x8009, 142}, + {0x8017, 142}, + {0xc028, 142}, + }, + /* 176 */ + { + {0x8003, 9}, + {0x8006, 9}, + {0x800a, 9}, + {0x800f, 9}, + {0x8018, 9}, + {0x801f, 9}, + {0x8029, 9}, + {0xc038, 9}, + {0x8003, 142}, + {0x8006, 142}, + {0x800a, 142}, + {0x800f, 142}, + {0x8018, 142}, + {0x801f, 142}, + {0x8029, 142}, + {0xc038, 142}, + }, + /* 177 */ + { + {0x8002, 144}, + {0x8009, 144}, + {0x8017, 144}, + {0xc028, 144}, + {0x8002, 145}, + {0x8009, 145}, + {0x8017, 145}, + {0xc028, 145}, + {0x8002, 148}, + {0x8009, 148}, + {0x8017, 148}, + {0xc028, 148}, + {0x8002, 159}, + {0x8009, 159}, + {0x8017, 159}, + {0xc028, 159}, + }, + /* 178 */ + { + {0x8003, 144}, + {0x8006, 144}, + {0x800a, 144}, + {0x800f, 144}, + {0x8018, 144}, + {0x801f, 144}, + {0x8029, 144}, + {0xc038, 144}, + {0x8003, 145}, + {0x8006, 145}, + {0x800a, 145}, + {0x800f, 145}, + {0x8018, 145}, + {0x801f, 145}, + {0x8029, 145}, + {0xc038, 145}, + }, + /* 179 */ + { + {0x8003, 148}, + {0x8006, 148}, + {0x800a, 148}, + {0x800f, 148}, + {0x8018, 148}, + {0x801f, 148}, + {0x8029, 148}, + {0xc038, 148}, + {0x8003, 159}, + {0x8006, 159}, + {0x800a, 159}, + {0x800f, 159}, + {0x8018, 159}, + {0x801f, 159}, + {0x8029, 159}, + {0xc038, 159}, + }, + /* 180 */ + { + {0xc000, 171}, + {0xc000, 206}, + {0xc000, 215}, + {0xc000, 225}, + {0xc000, 236}, + {0xc000, 237}, + {0xbc, 0}, + {0xbd, 0}, + {0xc1, 0}, + {0xc4, 0}, + {0xc8, 0}, + {0xcb, 0}, + {0xd1, 0}, + {0xd8, 0}, + {0xe0, 0}, + {0xee, 0}, + }, + /* 181 */ + { + {0x8001, 171}, + {0xc016, 171}, + {0x8001, 206}, + {0xc016, 206}, + {0x8001, 215}, + {0xc016, 215}, + {0x8001, 225}, + {0xc016, 225}, + {0x8001, 236}, + {0xc016, 236}, + {0x8001, 237}, + {0xc016, 237}, + {0xc000, 199}, + {0xc000, 207}, + {0xc000, 234}, + {0xc000, 235}, + }, + /* 182 */ + { + {0x8002, 171}, + {0x8009, 171}, + {0x8017, 171}, + {0xc028, 171}, + {0x8002, 206}, + {0x8009, 206}, + {0x8017, 206}, + {0xc028, 206}, + {0x8002, 215}, + {0x8009, 215}, + {0x8017, 215}, + {0xc028, 215}, + {0x8002, 225}, + {0x8009, 225}, + {0x8017, 225}, + {0xc028, 225}, + }, + /* 183 */ + { + {0x8003, 171}, + {0x8006, 171}, + {0x800a, 171}, + {0x800f, 171}, + {0x8018, 171}, + {0x801f, 171}, + {0x8029, 171}, + {0xc038, 171}, + {0x8003, 206}, + {0x8006, 206}, + {0x800a, 206}, + {0x800f, 206}, + {0x8018, 206}, + {0x801f, 206}, + {0x8029, 206}, + {0xc038, 206}, + }, + /* 184 */ + { + {0x8003, 215}, + {0x8006, 215}, + {0x800a, 215}, + {0x800f, 215}, + {0x8018, 215}, + {0x801f, 215}, + {0x8029, 215}, + {0xc038, 215}, + {0x8003, 225}, + {0x8006, 225}, + {0x800a, 225}, + {0x800f, 225}, + {0x8018, 225}, + {0x801f, 225}, + {0x8029, 225}, + {0xc038, 225}, + }, + /* 185 */ + { + {0x8002, 236}, + {0x8009, 236}, + {0x8017, 236}, + {0xc028, 236}, + {0x8002, 237}, + {0x8009, 237}, + {0x8017, 237}, + {0xc028, 237}, + {0x8001, 199}, + {0xc016, 199}, + {0x8001, 207}, + {0xc016, 207}, + {0x8001, 234}, + {0xc016, 234}, + {0x8001, 235}, + {0xc016, 235}, + }, + /* 186 */ + { + {0x8003, 236}, + {0x8006, 236}, + {0x800a, 236}, + {0x800f, 236}, + {0x8018, 236}, + {0x801f, 236}, + {0x8029, 236}, + {0xc038, 236}, + {0x8003, 237}, + {0x8006, 237}, + {0x800a, 237}, + {0x800f, 237}, + {0x8018, 237}, + {0x801f, 237}, + {0x8029, 237}, + {0xc038, 237}, + }, + /* 187 */ + { + {0x8002, 199}, + {0x8009, 199}, + {0x8017, 199}, + {0xc028, 199}, + {0x8002, 207}, + {0x8009, 207}, + {0x8017, 207}, + {0xc028, 207}, + {0x8002, 234}, + {0x8009, 234}, + {0x8017, 234}, + {0xc028, 234}, + {0x8002, 235}, + {0x8009, 235}, + {0x8017, 235}, + {0xc028, 235}, + }, + /* 188 */ + { + {0x8003, 199}, + {0x8006, 199}, + {0x800a, 199}, + {0x800f, 199}, + {0x8018, 199}, + {0x801f, 199}, + {0x8029, 199}, + {0xc038, 199}, + {0x8003, 207}, + {0x8006, 207}, + {0x800a, 207}, + {0x800f, 207}, + {0x8018, 207}, + {0x801f, 207}, + {0x8029, 207}, + {0xc038, 207}, + }, + /* 189 */ + { + {0x8003, 234}, + {0x8006, 234}, + {0x800a, 234}, + {0x800f, 234}, + {0x8018, 234}, + {0x801f, 234}, + {0x8029, 234}, + {0xc038, 234}, + {0x8003, 235}, + {0x8006, 235}, + {0x800a, 235}, + {0x800f, 235}, + {0x8018, 235}, + {0x801f, 235}, + {0x8029, 235}, + {0xc038, 235}, + }, + /* 190 */ + { + {0xc2, 0}, + {0xc3, 0}, + {0xc5, 0}, + {0xc6, 0}, + {0xc9, 0}, + {0xca, 0}, + {0xcc, 0}, + {0xcd, 0}, + {0xd2, 0}, + {0xd5, 0}, + {0xd9, 0}, + {0xdc, 0}, + {0xe1, 0}, + {0xe7, 0}, + {0xef, 0}, + {0xf6, 0}, + }, + /* 191 */ + { + {0xc000, 192}, + {0xc000, 193}, + {0xc000, 200}, + {0xc000, 201}, + {0xc000, 202}, + {0xc000, 205}, + {0xc000, 210}, + {0xc000, 213}, + {0xc000, 218}, + {0xc000, 219}, + {0xc000, 238}, + {0xc000, 240}, + {0xc000, 242}, + {0xc000, 243}, + {0xc000, 255}, + {0xce, 0}, + }, + /* 192 */ + { + {0x8001, 192}, + {0xc016, 192}, + {0x8001, 193}, + {0xc016, 193}, + {0x8001, 200}, + {0xc016, 200}, + {0x8001, 201}, + {0xc016, 201}, + {0x8001, 202}, + {0xc016, 202}, + {0x8001, 205}, + {0xc016, 205}, + {0x8001, 210}, + {0xc016, 210}, + {0x8001, 213}, + {0xc016, 213}, + }, + /* 193 */ + { + {0x8002, 192}, + {0x8009, 192}, + {0x8017, 192}, + {0xc028, 192}, + {0x8002, 193}, + {0x8009, 193}, + {0x8017, 193}, + {0xc028, 193}, + {0x8002, 200}, + {0x8009, 200}, + {0x8017, 200}, + {0xc028, 200}, + {0x8002, 201}, + {0x8009, 201}, + {0x8017, 201}, + {0xc028, 201}, + }, + /* 194 */ + { + {0x8003, 192}, + {0x8006, 192}, + {0x800a, 192}, + {0x800f, 192}, + {0x8018, 192}, + {0x801f, 192}, + {0x8029, 192}, + {0xc038, 192}, + {0x8003, 193}, + {0x8006, 193}, + {0x800a, 193}, + {0x800f, 193}, + {0x8018, 193}, + {0x801f, 193}, + {0x8029, 193}, + {0xc038, 193}, + }, + /* 195 */ + { + {0x8003, 200}, + {0x8006, 200}, + {0x800a, 200}, + {0x800f, 200}, + {0x8018, 200}, + {0x801f, 200}, + {0x8029, 200}, + {0xc038, 200}, + {0x8003, 201}, + {0x8006, 201}, + {0x800a, 201}, + {0x800f, 201}, + {0x8018, 201}, + {0x801f, 201}, + {0x8029, 201}, + {0xc038, 201}, + }, + /* 196 */ + { + {0x8002, 202}, + {0x8009, 202}, + {0x8017, 202}, + {0xc028, 202}, + {0x8002, 205}, + {0x8009, 205}, + {0x8017, 205}, + {0xc028, 205}, + {0x8002, 210}, + {0x8009, 210}, + {0x8017, 210}, + {0xc028, 210}, + {0x8002, 213}, + {0x8009, 213}, + {0x8017, 213}, + {0xc028, 213}, + }, + /* 197 */ + { + {0x8003, 202}, + {0x8006, 202}, + {0x800a, 202}, + {0x800f, 202}, + {0x8018, 202}, + {0x801f, 202}, + {0x8029, 202}, + {0xc038, 202}, + {0x8003, 205}, + {0x8006, 205}, + {0x800a, 205}, + {0x800f, 205}, + {0x8018, 205}, + {0x801f, 205}, + {0x8029, 205}, + {0xc038, 205}, + }, + /* 198 */ + { + {0x8003, 210}, + {0x8006, 210}, + {0x800a, 210}, + {0x800f, 210}, + {0x8018, 210}, + {0x801f, 210}, + {0x8029, 210}, + {0xc038, 210}, + {0x8003, 213}, + {0x8006, 213}, + {0x800a, 213}, + {0x800f, 213}, + {0x8018, 213}, + {0x801f, 213}, + {0x8029, 213}, + {0xc038, 213}, + }, + /* 199 */ + { + {0x8001, 218}, + {0xc016, 218}, + {0x8001, 219}, + {0xc016, 219}, + {0x8001, 238}, + {0xc016, 238}, + {0x8001, 240}, + {0xc016, 240}, + {0x8001, 242}, + {0xc016, 242}, + {0x8001, 243}, + {0xc016, 243}, + {0x8001, 255}, + {0xc016, 255}, + {0xc000, 203}, + {0xc000, 204}, + }, + /* 200 */ + { + {0x8002, 218}, + {0x8009, 218}, + {0x8017, 218}, + {0xc028, 218}, + {0x8002, 219}, + {0x8009, 219}, + {0x8017, 219}, + {0xc028, 219}, + {0x8002, 238}, + {0x8009, 238}, + {0x8017, 238}, + {0xc028, 238}, + {0x8002, 240}, + {0x8009, 240}, + {0x8017, 240}, + {0xc028, 240}, + }, + /* 201 */ + { + {0x8003, 218}, + {0x8006, 218}, + {0x800a, 218}, + {0x800f, 218}, + {0x8018, 218}, + {0x801f, 218}, + {0x8029, 218}, + {0xc038, 218}, + {0x8003, 219}, + {0x8006, 219}, + {0x800a, 219}, + {0x800f, 219}, + {0x8018, 219}, + {0x801f, 219}, + {0x8029, 219}, + {0xc038, 219}, + }, + /* 202 */ + { + {0x8003, 238}, + {0x8006, 238}, + {0x800a, 238}, + {0x800f, 238}, + {0x8018, 238}, + {0x801f, 238}, + {0x8029, 238}, + {0xc038, 238}, + {0x8003, 240}, + {0x8006, 240}, + {0x800a, 240}, + {0x800f, 240}, + {0x8018, 240}, + {0x801f, 240}, + {0x8029, 240}, + {0xc038, 240}, + }, + /* 203 */ + { + {0x8002, 242}, + {0x8009, 242}, + {0x8017, 242}, + {0xc028, 242}, + {0x8002, 243}, + {0x8009, 243}, + {0x8017, 243}, + {0xc028, 243}, + {0x8002, 255}, + {0x8009, 255}, + {0x8017, 255}, + {0xc028, 255}, + {0x8001, 203}, + {0xc016, 203}, + {0x8001, 204}, + {0xc016, 204}, + }, + /* 204 */ + { + {0x8003, 242}, + {0x8006, 242}, + {0x800a, 242}, + {0x800f, 242}, + {0x8018, 242}, + {0x801f, 242}, + {0x8029, 242}, + {0xc038, 242}, + {0x8003, 243}, + {0x8006, 243}, + {0x800a, 243}, + {0x800f, 243}, + {0x8018, 243}, + {0x801f, 243}, + {0x8029, 243}, + {0xc038, 243}, + }, + /* 205 */ + { + {0x8003, 255}, + {0x8006, 255}, + {0x800a, 255}, + {0x800f, 255}, + {0x8018, 255}, + {0x801f, 255}, + {0x8029, 255}, + {0xc038, 255}, + {0x8002, 203}, + {0x8009, 203}, + {0x8017, 203}, + {0xc028, 203}, + {0x8002, 204}, + {0x8009, 204}, + {0x8017, 204}, + {0xc028, 204}, + }, + /* 206 */ + { + {0x8003, 203}, + {0x8006, 203}, + {0x800a, 203}, + {0x800f, 203}, + {0x8018, 203}, + {0x801f, 203}, + {0x8029, 203}, + {0xc038, 203}, + {0x8003, 204}, + {0x8006, 204}, + {0x800a, 204}, + {0x800f, 204}, + {0x8018, 204}, + {0x801f, 204}, + {0x8029, 204}, + {0xc038, 204}, + }, + /* 207 */ + { + {0xd3, 0}, + {0xd4, 0}, + {0xd6, 0}, + {0xd7, 0}, + {0xda, 0}, + {0xdb, 0}, + {0xdd, 0}, + {0xde, 0}, + {0xe2, 0}, + {0xe4, 0}, + {0xe8, 0}, + {0xeb, 0}, + {0xf0, 0}, + {0xf3, 0}, + {0xf7, 0}, + {0xfa, 0}, + }, + /* 208 */ + { + {0xc000, 211}, + {0xc000, 212}, + {0xc000, 214}, + {0xc000, 221}, + {0xc000, 222}, + {0xc000, 223}, + {0xc000, 241}, + {0xc000, 244}, + {0xc000, 245}, + {0xc000, 246}, + {0xc000, 247}, + {0xc000, 248}, + {0xc000, 250}, + {0xc000, 251}, + {0xc000, 252}, + {0xc000, 253}, + }, + /* 209 */ + { + {0x8001, 211}, + {0xc016, 211}, + {0x8001, 212}, + {0xc016, 212}, + {0x8001, 214}, + {0xc016, 214}, + {0x8001, 221}, + {0xc016, 221}, + {0x8001, 222}, + {0xc016, 222}, + {0x8001, 223}, + {0xc016, 223}, + {0x8001, 241}, + {0xc016, 241}, + {0x8001, 244}, + {0xc016, 244}, + }, + /* 210 */ + { + {0x8002, 211}, + {0x8009, 211}, + {0x8017, 211}, + {0xc028, 211}, + {0x8002, 212}, + {0x8009, 212}, + {0x8017, 212}, + {0xc028, 212}, + {0x8002, 214}, + {0x8009, 214}, + {0x8017, 214}, + {0xc028, 214}, + {0x8002, 221}, + {0x8009, 221}, + {0x8017, 221}, + {0xc028, 221}, + }, + /* 211 */ + { + {0x8003, 211}, + {0x8006, 211}, + {0x800a, 211}, + {0x800f, 211}, + {0x8018, 211}, + {0x801f, 211}, + {0x8029, 211}, + {0xc038, 211}, + {0x8003, 212}, + {0x8006, 212}, + {0x800a, 212}, + {0x800f, 212}, + {0x8018, 212}, + {0x801f, 212}, + {0x8029, 212}, + {0xc038, 212}, + }, + /* 212 */ + { + {0x8003, 214}, + {0x8006, 214}, + {0x800a, 214}, + {0x800f, 214}, + {0x8018, 214}, + {0x801f, 214}, + {0x8029, 214}, + {0xc038, 214}, + {0x8003, 221}, + {0x8006, 221}, + {0x800a, 221}, + {0x800f, 221}, + {0x8018, 221}, + {0x801f, 221}, + {0x8029, 221}, + {0xc038, 221}, + }, + /* 213 */ + { + {0x8002, 222}, + {0x8009, 222}, + {0x8017, 222}, + {0xc028, 222}, + {0x8002, 223}, + {0x8009, 223}, + {0x8017, 223}, + {0xc028, 223}, + {0x8002, 241}, + {0x8009, 241}, + {0x8017, 241}, + {0xc028, 241}, + {0x8002, 244}, + {0x8009, 244}, + {0x8017, 244}, + {0xc028, 244}, + }, + /* 214 */ + { + {0x8003, 222}, + {0x8006, 222}, + {0x800a, 222}, + {0x800f, 222}, + {0x8018, 222}, + {0x801f, 222}, + {0x8029, 222}, + {0xc038, 222}, + {0x8003, 223}, + {0x8006, 223}, + {0x800a, 223}, + {0x800f, 223}, + {0x8018, 223}, + {0x801f, 223}, + {0x8029, 223}, + {0xc038, 223}, + }, + /* 215 */ + { + {0x8003, 241}, + {0x8006, 241}, + {0x800a, 241}, + {0x800f, 241}, + {0x8018, 241}, + {0x801f, 241}, + {0x8029, 241}, + {0xc038, 241}, + {0x8003, 244}, + {0x8006, 244}, + {0x800a, 244}, + {0x800f, 244}, + {0x8018, 244}, + {0x801f, 244}, + {0x8029, 244}, + {0xc038, 244}, + }, + /* 216 */ + { + {0x8001, 245}, + {0xc016, 245}, + {0x8001, 246}, + {0xc016, 246}, + {0x8001, 247}, + {0xc016, 247}, + {0x8001, 248}, + {0xc016, 248}, + {0x8001, 250}, + {0xc016, 250}, + {0x8001, 251}, + {0xc016, 251}, + {0x8001, 252}, + {0xc016, 252}, + {0x8001, 253}, + {0xc016, 253}, + }, + /* 217 */ + { + {0x8002, 245}, + {0x8009, 245}, + {0x8017, 245}, + {0xc028, 245}, + {0x8002, 246}, + {0x8009, 246}, + {0x8017, 246}, + {0xc028, 246}, + {0x8002, 247}, + {0x8009, 247}, + {0x8017, 247}, + {0xc028, 247}, + {0x8002, 248}, + {0x8009, 248}, + {0x8017, 248}, + {0xc028, 248}, + }, + /* 218 */ + { + {0x8003, 245}, + {0x8006, 245}, + {0x800a, 245}, + {0x800f, 245}, + {0x8018, 245}, + {0x801f, 245}, + {0x8029, 245}, + {0xc038, 245}, + {0x8003, 246}, + {0x8006, 246}, + {0x800a, 246}, + {0x800f, 246}, + {0x8018, 246}, + {0x801f, 246}, + {0x8029, 246}, + {0xc038, 246}, + }, + /* 219 */ + { + {0x8003, 247}, + {0x8006, 247}, + {0x800a, 247}, + {0x800f, 247}, + {0x8018, 247}, + {0x801f, 247}, + {0x8029, 247}, + {0xc038, 247}, + {0x8003, 248}, + {0x8006, 248}, + {0x800a, 248}, + {0x800f, 248}, + {0x8018, 248}, + {0x801f, 248}, + {0x8029, 248}, + {0xc038, 248}, + }, + /* 220 */ + { + {0x8002, 250}, + {0x8009, 250}, + {0x8017, 250}, + {0xc028, 250}, + {0x8002, 251}, + {0x8009, 251}, + {0x8017, 251}, + {0xc028, 251}, + {0x8002, 252}, + {0x8009, 252}, + {0x8017, 252}, + {0xc028, 252}, + {0x8002, 253}, + {0x8009, 253}, + {0x8017, 253}, + {0xc028, 253}, + }, + /* 221 */ + { + {0x8003, 250}, + {0x8006, 250}, + {0x800a, 250}, + {0x800f, 250}, + {0x8018, 250}, + {0x801f, 250}, + {0x8029, 250}, + {0xc038, 250}, + {0x8003, 251}, + {0x8006, 251}, + {0x800a, 251}, + {0x800f, 251}, + {0x8018, 251}, + {0x801f, 251}, + {0x8029, 251}, + {0xc038, 251}, + }, + /* 222 */ + { + {0x8003, 252}, + {0x8006, 252}, + {0x800a, 252}, + {0x800f, 252}, + {0x8018, 252}, + {0x801f, 252}, + {0x8029, 252}, + {0xc038, 252}, + {0x8003, 253}, + {0x8006, 253}, + {0x800a, 253}, + {0x800f, 253}, + {0x8018, 253}, + {0x801f, 253}, + {0x8029, 253}, + {0xc038, 253}, + }, + /* 223 */ + { + {0xc000, 254}, + {0xe3, 0}, + {0xe5, 0}, + {0xe6, 0}, + {0xe9, 0}, + {0xea, 0}, + {0xec, 0}, + {0xed, 0}, + {0xf1, 0}, + {0xf2, 0}, + {0xf4, 0}, + {0xf5, 0}, + {0xf8, 0}, + {0xf9, 0}, + {0xfb, 0}, + {0xfc, 0}, + }, + /* 224 */ + { + {0x8001, 254}, + {0xc016, 254}, + {0xc000, 2}, + {0xc000, 3}, + {0xc000, 4}, + {0xc000, 5}, + {0xc000, 6}, + {0xc000, 7}, + {0xc000, 8}, + {0xc000, 11}, + {0xc000, 12}, + {0xc000, 14}, + {0xc000, 15}, + {0xc000, 16}, + {0xc000, 17}, + {0xc000, 18}, + }, + /* 225 */ + { + {0x8002, 254}, + {0x8009, 254}, + {0x8017, 254}, + {0xc028, 254}, + {0x8001, 2}, + {0xc016, 2}, + {0x8001, 3}, + {0xc016, 3}, + {0x8001, 4}, + {0xc016, 4}, + {0x8001, 5}, + {0xc016, 5}, + {0x8001, 6}, + {0xc016, 6}, + {0x8001, 7}, + {0xc016, 7}, + }, + /* 226 */ + { + {0x8003, 254}, + {0x8006, 254}, + {0x800a, 254}, + {0x800f, 254}, + {0x8018, 254}, + {0x801f, 254}, + {0x8029, 254}, + {0xc038, 254}, + {0x8002, 2}, + {0x8009, 2}, + {0x8017, 2}, + {0xc028, 2}, + {0x8002, 3}, + {0x8009, 3}, + {0x8017, 3}, + {0xc028, 3}, + }, + /* 227 */ + { + {0x8003, 2}, + {0x8006, 2}, + {0x800a, 2}, + {0x800f, 2}, + {0x8018, 2}, + {0x801f, 2}, + {0x8029, 2}, + {0xc038, 2}, + {0x8003, 3}, + {0x8006, 3}, + {0x800a, 3}, + {0x800f, 3}, + {0x8018, 3}, + {0x801f, 3}, + {0x8029, 3}, + {0xc038, 3}, + }, + /* 228 */ + { + {0x8002, 4}, + {0x8009, 4}, + {0x8017, 4}, + {0xc028, 4}, + {0x8002, 5}, + {0x8009, 5}, + {0x8017, 5}, + {0xc028, 5}, + {0x8002, 6}, + {0x8009, 6}, + {0x8017, 6}, + {0xc028, 6}, + {0x8002, 7}, + {0x8009, 7}, + {0x8017, 7}, + {0xc028, 7}, + }, + /* 229 */ + { + {0x8003, 4}, + {0x8006, 4}, + {0x800a, 4}, + {0x800f, 4}, + {0x8018, 4}, + {0x801f, 4}, + {0x8029, 4}, + {0xc038, 4}, + {0x8003, 5}, + {0x8006, 5}, + {0x800a, 5}, + {0x800f, 5}, + {0x8018, 5}, + {0x801f, 5}, + {0x8029, 5}, + {0xc038, 5}, + }, + /* 230 */ + { + {0x8003, 6}, + {0x8006, 6}, + {0x800a, 6}, + {0x800f, 6}, + {0x8018, 6}, + {0x801f, 6}, + {0x8029, 6}, + {0xc038, 6}, + {0x8003, 7}, + {0x8006, 7}, + {0x800a, 7}, + {0x800f, 7}, + {0x8018, 7}, + {0x801f, 7}, + {0x8029, 7}, + {0xc038, 7}, + }, + /* 231 */ + { + {0x8001, 8}, + {0xc016, 8}, + {0x8001, 11}, + {0xc016, 11}, + {0x8001, 12}, + {0xc016, 12}, + {0x8001, 14}, + {0xc016, 14}, + {0x8001, 15}, + {0xc016, 15}, + {0x8001, 16}, + {0xc016, 16}, + {0x8001, 17}, + {0xc016, 17}, + {0x8001, 18}, + {0xc016, 18}, + }, + /* 232 */ + { + {0x8002, 8}, + {0x8009, 8}, + {0x8017, 8}, + {0xc028, 8}, + {0x8002, 11}, + {0x8009, 11}, + {0x8017, 11}, + {0xc028, 11}, + {0x8002, 12}, + {0x8009, 12}, + {0x8017, 12}, + {0xc028, 12}, + {0x8002, 14}, + {0x8009, 14}, + {0x8017, 14}, + {0xc028, 14}, + }, + /* 233 */ + { + {0x8003, 8}, + {0x8006, 8}, + {0x800a, 8}, + {0x800f, 8}, + {0x8018, 8}, + {0x801f, 8}, + {0x8029, 8}, + {0xc038, 8}, + {0x8003, 11}, + {0x8006, 11}, + {0x800a, 11}, + {0x800f, 11}, + {0x8018, 11}, + {0x801f, 11}, + {0x8029, 11}, + {0xc038, 11}, + }, + /* 234 */ + { + {0x8003, 12}, + {0x8006, 12}, + {0x800a, 12}, + {0x800f, 12}, + {0x8018, 12}, + {0x801f, 12}, + {0x8029, 12}, + {0xc038, 12}, + {0x8003, 14}, + {0x8006, 14}, + {0x800a, 14}, + {0x800f, 14}, + {0x8018, 14}, + {0x801f, 14}, + {0x8029, 14}, + {0xc038, 14}, + }, + /* 235 */ + { + {0x8002, 15}, + {0x8009, 15}, + {0x8017, 15}, + {0xc028, 15}, + {0x8002, 16}, + {0x8009, 16}, + {0x8017, 16}, + {0xc028, 16}, + {0x8002, 17}, + {0x8009, 17}, + {0x8017, 17}, + {0xc028, 17}, + {0x8002, 18}, + {0x8009, 18}, + {0x8017, 18}, + {0xc028, 18}, + }, + /* 236 */ + { + {0x8003, 15}, + {0x8006, 15}, + {0x800a, 15}, + {0x800f, 15}, + {0x8018, 15}, + {0x801f, 15}, + {0x8029, 15}, + {0xc038, 15}, + {0x8003, 16}, + {0x8006, 16}, + {0x800a, 16}, + {0x800f, 16}, + {0x8018, 16}, + {0x801f, 16}, + {0x8029, 16}, + {0xc038, 16}, + }, + /* 237 */ + { + {0x8003, 17}, + {0x8006, 17}, + {0x800a, 17}, + {0x800f, 17}, + {0x8018, 17}, + {0x801f, 17}, + {0x8029, 17}, + {0xc038, 17}, + {0x8003, 18}, + {0x8006, 18}, + {0x800a, 18}, + {0x800f, 18}, + {0x8018, 18}, + {0x801f, 18}, + {0x8029, 18}, + {0xc038, 18}, + }, + /* 238 */ + { + {0xc000, 19}, + {0xc000, 20}, + {0xc000, 21}, + {0xc000, 23}, + {0xc000, 24}, + {0xc000, 25}, + {0xc000, 26}, + {0xc000, 27}, + {0xc000, 28}, + {0xc000, 29}, + {0xc000, 30}, + {0xc000, 31}, + {0xc000, 127}, + {0xc000, 220}, + {0xc000, 249}, + {0xfd, 0}, + }, + /* 239 */ + { + {0x8001, 19}, + {0xc016, 19}, + {0x8001, 20}, + {0xc016, 20}, + {0x8001, 21}, + {0xc016, 21}, + {0x8001, 23}, + {0xc016, 23}, + {0x8001, 24}, + {0xc016, 24}, + {0x8001, 25}, + {0xc016, 25}, + {0x8001, 26}, + {0xc016, 26}, + {0x8001, 27}, + {0xc016, 27}, + }, + /* 240 */ + { + {0x8002, 19}, + {0x8009, 19}, + {0x8017, 19}, + {0xc028, 19}, + {0x8002, 20}, + {0x8009, 20}, + {0x8017, 20}, + {0xc028, 20}, + {0x8002, 21}, + {0x8009, 21}, + {0x8017, 21}, + {0xc028, 21}, + {0x8002, 23}, + {0x8009, 23}, + {0x8017, 23}, + {0xc028, 23}, + }, + /* 241 */ + { + {0x8003, 19}, + {0x8006, 19}, + {0x800a, 19}, + {0x800f, 19}, + {0x8018, 19}, + {0x801f, 19}, + {0x8029, 19}, + {0xc038, 19}, + {0x8003, 20}, + {0x8006, 20}, + {0x800a, 20}, + {0x800f, 20}, + {0x8018, 20}, + {0x801f, 20}, + {0x8029, 20}, + {0xc038, 20}, + }, + /* 242 */ + { + {0x8003, 21}, + {0x8006, 21}, + {0x800a, 21}, + {0x800f, 21}, + {0x8018, 21}, + {0x801f, 21}, + {0x8029, 21}, + {0xc038, 21}, + {0x8003, 23}, + {0x8006, 23}, + {0x800a, 23}, + {0x800f, 23}, + {0x8018, 23}, + {0x801f, 23}, + {0x8029, 23}, + {0xc038, 23}, + }, + /* 243 */ + { + {0x8002, 24}, + {0x8009, 24}, + {0x8017, 24}, + {0xc028, 24}, + {0x8002, 25}, + {0x8009, 25}, + {0x8017, 25}, + {0xc028, 25}, + {0x8002, 26}, + {0x8009, 26}, + {0x8017, 26}, + {0xc028, 26}, + {0x8002, 27}, + {0x8009, 27}, + {0x8017, 27}, + {0xc028, 27}, + }, + /* 244 */ + { + {0x8003, 24}, + {0x8006, 24}, + {0x800a, 24}, + {0x800f, 24}, + {0x8018, 24}, + {0x801f, 24}, + {0x8029, 24}, + {0xc038, 24}, + {0x8003, 25}, + {0x8006, 25}, + {0x800a, 25}, + {0x800f, 25}, + {0x8018, 25}, + {0x801f, 25}, + {0x8029, 25}, + {0xc038, 25}, + }, + /* 245 */ + { + {0x8003, 26}, + {0x8006, 26}, + {0x800a, 26}, + {0x800f, 26}, + {0x8018, 26}, + {0x801f, 26}, + {0x8029, 26}, + {0xc038, 26}, + {0x8003, 27}, + {0x8006, 27}, + {0x800a, 27}, + {0x800f, 27}, + {0x8018, 27}, + {0x801f, 27}, + {0x8029, 27}, + {0xc038, 27}, + }, + /* 246 */ + { + {0x8001, 28}, + {0xc016, 28}, + {0x8001, 29}, + {0xc016, 29}, + {0x8001, 30}, + {0xc016, 30}, + {0x8001, 31}, + {0xc016, 31}, + {0x8001, 127}, + {0xc016, 127}, + {0x8001, 220}, + {0xc016, 220}, + {0x8001, 249}, + {0xc016, 249}, + {0xfe, 0}, + {0xff, 0}, + }, + /* 247 */ + { + {0x8002, 28}, + {0x8009, 28}, + {0x8017, 28}, + {0xc028, 28}, + {0x8002, 29}, + {0x8009, 29}, + {0x8017, 29}, + {0xc028, 29}, + {0x8002, 30}, + {0x8009, 30}, + {0x8017, 30}, + {0xc028, 30}, + {0x8002, 31}, + {0x8009, 31}, + {0x8017, 31}, + {0xc028, 31}, + }, + /* 248 */ + { + {0x8003, 28}, + {0x8006, 28}, + {0x800a, 28}, + {0x800f, 28}, + {0x8018, 28}, + {0x801f, 28}, + {0x8029, 28}, + {0xc038, 28}, + {0x8003, 29}, + {0x8006, 29}, + {0x800a, 29}, + {0x800f, 29}, + {0x8018, 29}, + {0x801f, 29}, + {0x8029, 29}, + {0xc038, 29}, + }, + /* 249 */ + { + {0x8003, 30}, + {0x8006, 30}, + {0x800a, 30}, + {0x800f, 30}, + {0x8018, 30}, + {0x801f, 30}, + {0x8029, 30}, + {0xc038, 30}, + {0x8003, 31}, + {0x8006, 31}, + {0x800a, 31}, + {0x800f, 31}, + {0x8018, 31}, + {0x801f, 31}, + {0x8029, 31}, + {0xc038, 31}, + }, + /* 250 */ + { + {0x8002, 127}, + {0x8009, 127}, + {0x8017, 127}, + {0xc028, 127}, + {0x8002, 220}, + {0x8009, 220}, + {0x8017, 220}, + {0xc028, 220}, + {0x8002, 249}, + {0x8009, 249}, + {0x8017, 249}, + {0xc028, 249}, + {0xc000, 10}, + {0xc000, 13}, + {0xc000, 22}, + {0x100, 0}, + }, + /* 251 */ + { + {0x8003, 127}, + {0x8006, 127}, + {0x800a, 127}, + {0x800f, 127}, + {0x8018, 127}, + {0x801f, 127}, + {0x8029, 127}, + {0xc038, 127}, + {0x8003, 220}, + {0x8006, 220}, + {0x800a, 220}, + {0x800f, 220}, + {0x8018, 220}, + {0x801f, 220}, + {0x8029, 220}, + {0xc038, 220}, + }, + /* 252 */ + { + {0x8003, 249}, + {0x8006, 249}, + {0x800a, 249}, + {0x800f, 249}, + {0x8018, 249}, + {0x801f, 249}, + {0x8029, 249}, + {0xc038, 249}, + {0x8001, 10}, + {0xc016, 10}, + {0x8001, 13}, + {0xc016, 13}, + {0x8001, 22}, + {0xc016, 22}, + {0x100, 0}, + {0x100, 0}, + }, + /* 253 */ + { + {0x8002, 10}, + {0x8009, 10}, + {0x8017, 10}, + {0xc028, 10}, + {0x8002, 13}, + {0x8009, 13}, + {0x8017, 13}, + {0xc028, 13}, + {0x8002, 22}, + {0x8009, 22}, + {0x8017, 22}, + {0xc028, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 254 */ + { + {0x8003, 10}, + {0x8006, 10}, + {0x800a, 10}, + {0x800f, 10}, + {0x8018, 10}, + {0x801f, 10}, + {0x8029, 10}, + {0xc038, 10}, + {0x8003, 13}, + {0x8006, 13}, + {0x800a, 13}, + {0x800f, 13}, + {0x8018, 13}, + {0x801f, 13}, + {0x8029, 13}, + {0xc038, 13}, + }, + /* 255 */ + { + {0x8003, 22}, + {0x8006, 22}, + {0x800a, 22}, + {0x800f, 22}, + {0x8018, 22}, + {0x801f, 22}, + {0x8029, 22}, + {0xc038, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 256 */ + { + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, }; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c index 0ce71480d72fec..af810a2c5929db 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c @@ -34,11 +34,13 @@ void nghttp3_range_init(nghttp3_range *r, uint64_t begin, uint64_t end) { nghttp3_range nghttp3_range_intersect(const nghttp3_range *a, const nghttp3_range *b) { nghttp3_range r = {0, 0}; - uint64_t begin = nghttp3_max(a->begin, b->begin); - uint64_t end = nghttp3_min(a->end, b->end); + uint64_t begin = nghttp3_max_uint64(a->begin, b->begin); + uint64_t end = nghttp3_min_uint64(a->end, b->end); + if (begin < end) { nghttp3_range_init(&r, begin, end); } + return r; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_range.h b/deps/ngtcp2/nghttp3/lib/nghttp3_range.h index 20dab69aa62db5..e52e1966b870ec 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_range.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_range.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -59,7 +59,7 @@ uint64_t nghttp3_range_len(const nghttp3_range *r); /* * nghttp3_range_eq returns nonzero if |a| equals |b|, such that - * a->begin == b->begin, and a->end == b->end hold. + * a->begin == b->begin and a->end == b->end hold. */ int nghttp3_range_eq(const nghttp3_range *a, const nghttp3_range *b); @@ -78,4 +78,4 @@ void nghttp3_range_cut(nghttp3_range *left, nghttp3_range *right, */ int nghttp3_range_not_after(const nghttp3_range *a, const nghttp3_range *b); -#endif /* NGHTTP3_RANGE_H */ +#endif /* !defined(NGHTTP3_RANGE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h index f589c377bf6ea7..97f83234ab5a8e 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -78,4 +78,4 @@ int nghttp3_rcbuf_new2(nghttp3_rcbuf **rcbuf_ptr, const uint8_t *src, */ void nghttp3_rcbuf_del(nghttp3_rcbuf *rcbuf); -#endif /* NGHTTP3_RCBUF_H */ +#endif /* !defined(NGHTTP3_RCBUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c index 61a7d06cad306f..7d3ab39bf82a7f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c @@ -29,29 +29,27 @@ #include <string.h> #ifdef WIN32 # include <intrin.h> -#endif +#endif /* defined(WIN32) */ #include "nghttp3_macro.h" +static int ispow2(size_t n) { #if defined(_MSC_VER) && !defined(__clang__) && \ - (defined(_M_ARM) || defined(_M_ARM64)) -unsigned int __popcnt(unsigned int x) { - unsigned int c = 0; - for (; x; ++c) { - x &= x - 1; - } - return c; + (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941)) + return n && !(n & (n - 1)); +#elif defined(WIN32) + return 1 == __popcnt((unsigned int)n); +#else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ + return 1 == __builtin_popcount((unsigned int)n); +#endif /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ } -#endif int nghttp3_ringbuf_init(nghttp3_ringbuf *rb, size_t nmemb, size_t size, const nghttp3_mem *mem) { if (nmemb) { -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); rb->buf = nghttp3_mem_malloc(mem, nmemb * size); if (rb->buf == NULL) { @@ -80,7 +78,7 @@ void nghttp3_ringbuf_free(nghttp3_ringbuf *rb) { void *nghttp3_ringbuf_push_front(nghttp3_ringbuf *rb) { rb->first = (rb->first - 1) & (rb->nmemb - 1); - rb->len = nghttp3_min(rb->nmemb, rb->len + 1); + rb->len = nghttp3_min_size(rb->nmemb, rb->len + 1); return (void *)&rb->buf[rb->first * rb->size]; } @@ -127,11 +125,7 @@ int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb) { return 0; } -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); buf = nghttp3_mem_malloc(rb->mem, nmemb * rb->size); if (buf == NULL) { diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h index 8e05ec55b24724..b154290a51d5a5 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -110,4 +110,4 @@ int nghttp3_ringbuf_full(nghttp3_ringbuf *rb); int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb); -#endif /* NGHTTP3_RINGBUF_H */ +#endif /* !defined(NGHTTP3_RINGBUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c index 3782aa72cd6e81..fc131404d13754 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c @@ -36,70 +36,70 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n) { /* Generated by gendowncasetbl.py */ static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, - 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, - 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, - 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, - 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, - 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, - 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, - 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, - 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, - 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, - 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, - 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, - 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, - 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, - 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, - 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, - 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, - 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, - 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, - 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, - 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, - 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, - 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, - 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, - 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, - 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, - 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, + 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, + 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, + 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, + 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, + 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, + 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, + 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, + 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, + 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, + 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, + 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, + 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, + 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, + 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, + 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, + 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, + 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, + 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, + 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, + 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, + 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, + 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, + 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, + 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, + 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, + 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, + 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, + 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, + 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, + 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, + 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, + 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, + 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, + 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, + 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, + 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, + 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, + 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, + 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, + 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, + 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, + 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, + 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, + 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, + 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, + 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, + 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, + 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, + 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, + 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, + 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, + 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, + 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, + 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, + 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, + 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, + 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, + 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, + 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, + 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, + 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, + 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, + 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, + 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, }; void nghttp3_downcase(uint8_t *s, size_t len) { diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h index 19c1d2c71b559b..280749a3a9a3d9 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -37,4 +37,4 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n); void nghttp3_downcase(uint8_t *s, size_t len); -#endif /* NGHTTP3_STR_H */ +#endif /* !defined(NGHTTP3_STR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c index 6188a141dd123b..328cddd488fd6f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c @@ -73,7 +73,6 @@ int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id, stream->qpack_blocked_pe.index = NGHTTP3_PQ_BAD_INDEX; stream->mem = mem; - stream->tx.offset = 0; stream->rx.http.status_code = -1; stream->rx.http.content_length = -1; stream->rx.http.pri.urgency = NGHTTP3_DEFAULT_URGENCY; @@ -180,48 +179,44 @@ void nghttp3_stream_read_state_reset(nghttp3_stream_read_state *rstate) { } nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, - const uint8_t *src, size_t srclen, int fin) { - size_t nread = 0; - size_t n; - size_t i; + const uint8_t *begin, const uint8_t *end, + int fin) { + const uint8_t *orig_begin = begin; + size_t len; - assert(srclen > 0); + assert(begin != end); if (rvint->left == 0) { assert(rvint->acc == 0); - rvint->left = nghttp3_get_varintlen(src); - if (rvint->left <= srclen) { - rvint->acc = nghttp3_get_varint(&nread, src); - rvint->left = 0; - return (nghttp3_ssize)nread; + len = nghttp3_get_varintlen(begin); + if (len <= (size_t)(end - begin)) { + nghttp3_get_varint(&rvint->acc, begin); + return (nghttp3_ssize)len; } if (fin) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - rvint->acc = nghttp3_get_varint_fb(src); - nread = 1; - ++src; - --srclen; - --rvint->left; + rvint->acc = nghttp3_get_varint_fb(begin++); + rvint->left = len - 1; } - n = nghttp3_min(rvint->left, srclen); + len = nghttp3_min_size(rvint->left, (size_t)(end - begin)); + end = begin + len; - for (i = 0; i < n; ++i) { - rvint->acc = (rvint->acc << 8) + src[i]; + for (; begin != end;) { + rvint->acc = (rvint->acc << 8) + *begin++; } - rvint->left -= n; - nread += n; + rvint->left -= len; if (fin && rvint->left) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - return (nghttp3_ssize)nread; + return (nghttp3_ssize)(begin - orig_begin); } int nghttp3_stream_frq_add(nghttp3_stream *stream, @@ -231,7 +226,8 @@ int nghttp3_stream_frq_add(nghttp3_stream *stream, int rv; if (nghttp3_ringbuf_full(frq)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); + size_t nlen = + nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); rv = nghttp3_ringbuf_reserve(frq, nlen); if (rv != 0) { return rv; @@ -444,8 +440,8 @@ int nghttp3_stream_write_headers(nghttp3_stream *stream, assert(conn); return nghttp3_stream_write_header_block( - stream, &conn->qenc, conn->tx.qenc, &conn->tx.qpack.rbuf, - &conn->tx.qpack.ebuf, NGHTTP3_FRAME_HEADERS, fr->nva, fr->nvlen); + stream, &conn->qenc, conn->tx.qenc, &conn->tx.qpack.rbuf, + &conn->tx.qpack.ebuf, NGHTTP3_FRAME_HEADERS, fr->nva, fr->nvlen); } int nghttp3_stream_write_header_block(nghttp3_stream *stream, @@ -738,7 +734,7 @@ int nghttp3_stream_outq_add(nghttp3_stream *stream, } if (nghttp3_ringbuf_full(outq)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(outq, nlen); if (rv != 0) { return rv; @@ -770,8 +766,8 @@ int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) { ; if (n == NGHTTP3_STREAM_MIN_CHUNK_SIZE) { - p = (uint8_t *)nghttp3_objalloc_chunk_len_get(stream->out_chunk_objalloc, - n); + p = + (uint8_t *)nghttp3_objalloc_chunk_len_get(stream->out_chunk_objalloc, n); } else { p = nghttp3_mem_malloc(stream->mem, n); } @@ -780,7 +776,7 @@ int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) { } if (nghttp3_ringbuf_full(chunks)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(chunks, nlen); if (rv != 0) { return rv; @@ -928,9 +924,8 @@ static void stream_pop_outq_entry(nghttp3_stream *stream, nghttp3_ringbuf_pop_front(&stream->outq); } -int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n) { +int nghttp3_stream_update_ack_offset(nghttp3_stream *stream, uint64_t offset) { nghttp3_ringbuf *outq = &stream->outq; - uint64_t offset = stream->ack_offset + n; size_t buflen; size_t npopped = 0; uint64_t nack; @@ -941,24 +936,25 @@ int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n) { tbuf = nghttp3_ringbuf_get(outq, 0); buflen = nghttp3_buf_len(&tbuf->buf); - if (tbuf->type == NGHTTP3_BUF_TYPE_ALIEN) { - nack = nghttp3_min(offset, (uint64_t)buflen) - stream->ack_done; - if (stream->callbacks.acked_data) { - rv = stream->callbacks.acked_data(stream, stream->node.id, nack, - stream->user_data); - if (rv != 0) { - return NGHTTP3_ERR_CALLBACK_FAILURE; - } + /* For NGHTTP3_BUF_TYPE_ALIEN, we never add 0 length buffer. */ + if (tbuf->type == NGHTTP3_BUF_TYPE_ALIEN && stream->ack_offset < offset && + stream->callbacks.acked_data) { + nack = nghttp3_min_uint64(offset, stream->ack_base + buflen) - + stream->ack_offset; + + rv = stream->callbacks.acked_data(stream, stream->node.id, nack, + stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; } - stream->ack_done += nack; } - if (offset >= buflen) { + if (offset >= stream->ack_base + buflen) { stream_pop_outq_entry(stream, tbuf); - offset -= buflen; + stream->ack_base += buflen; + stream->ack_offset = stream->ack_base; ++npopped; - stream->ack_done = 0; if (stream->outq_idx + 1 == npopped) { stream->outq_offset = 0; @@ -996,7 +992,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, if (len) { buf = nghttp3_ringbuf_get(inq, len - 1); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min(datalen, bufleft); + nwrite = nghttp3_min_size(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; @@ -1005,7 +1001,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, for (; datalen;) { if (nghttp3_ringbuf_full(inq)) { size_t nlen = - nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); + nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); rv = nghttp3_ringbuf_reserve(inq, nlen); if (rv != 0) { return rv; @@ -1020,7 +1016,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, buf = nghttp3_ringbuf_push_back(inq); nghttp3_buf_wrap_init(buf, rawbuf, 16384); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min(datalen, bufleft); + nwrite = nghttp3_min_size(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h index 03a57697b232b3..7d296febf9135f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -88,8 +88,8 @@ typedef struct nghttp3_varint_read_state { typedef struct nghttp3_stream_read_state { nghttp3_varint_read_state rvint; nghttp3_frame fr; - int state; int64_t left; + int state; } nghttp3_stream_read_state; /* NGHTTP3_STREAM_FLAG_NONE indicates that no flag is set. */ @@ -186,9 +186,6 @@ typedef struct nghttp3_stream_callbacks { } nghttp3_stream_callbacks; typedef struct nghttp3_http_state { - /* status_code is HTTP status code received. This field is used - if connection is initialized as client. */ - int32_t status_code; /* content_length is the value of received content-length header field. */ int64_t content_length; @@ -196,6 +193,9 @@ typedef struct nghttp3_http_state { far. */ int64_t recv_content_length; nghttp3_pri pri; + /* status_code is HTTP status code received. This field is used + if connection is initialized as client. */ + int32_t status_code; uint32_t flags; } nghttp3_http_state; @@ -226,13 +226,12 @@ struct nghttp3_stream { /* outq_offset is write offset relative to the element at outq_idx in outq. */ uint64_t outq_offset; - /* ack_offset is offset acknowledged by peer relative to the first - element in outq. */ + /* ack_base is the number of bytes acknowledged by a remote + endpoint where the first element in outq is positioned at. */ + uint64_t ack_base; + /* ack_offset is the number of bytes acknowledged by a remote + endpoint so far. */ uint64_t ack_offset; - /* ack_done is the number of bytes notified to an application that - they are acknowledged inside the first outq element if it is of - type NGHTTP3_BUF_TYPE_ALIEN. */ - uint64_t ack_done; uint64_t unscheduled_nwrite; nghttp3_stream_type type; nghttp3_stream_read_state rstate; @@ -283,7 +282,8 @@ void nghttp3_varint_read_state_reset(nghttp3_varint_read_state *rvint); void nghttp3_stream_read_state_reset(nghttp3_stream_read_state *rstate); nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, - const uint8_t *src, size_t srclen, int fin); + const uint8_t *begin, const uint8_t *end, + int fin); int nghttp3_stream_frq_add(nghttp3_stream *stream, const nghttp3_frame_entry *frent); @@ -336,7 +336,11 @@ void nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n); */ int nghttp3_stream_outq_write_done(nghttp3_stream *stream); -int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n); +/* + * nghttp2_stream_update_ack_offset updates the last acknowledged + * offset to |offset|. + */ +int nghttp3_stream_update_ack_offset(nghttp3_stream *stream, uint64_t offset); /* * nghttp3_stream_is_active returns nonzero if |stream| is active. In @@ -390,4 +394,4 @@ int nghttp3_client_stream_uni(int64_t stream_id); */ int nghttp3_server_stream_uni(int64_t stream_id); -#endif /* NGHTTP3_STREAM_H */ +#endif /* !defined(NGHTTP3_STREAM_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c index d9c5e598699512..eae847e7a9236a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c @@ -73,8 +73,8 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, if (tnode->pe.index == NGHTTP3_PQ_BAD_INDEX) { tnode->cycle = - pq_get_first_cycle(pq) + - ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max(1, penalty)); + pq_get_first_cycle(pq) + + ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max_uint64(1, penalty)); } else if (nwrite > 0) { if (!tnode->pri.inc || nghttp3_pq_size(pq) == 1) { return 0; @@ -82,7 +82,7 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, nghttp3_pq_remove(pq, &tnode->pe); tnode->pe.index = NGHTTP3_PQ_BAD_INDEX; - tnode->cycle += nghttp3_max(1, penalty); + tnode->cycle += nghttp3_max_uint64(1, penalty); } else { return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h index 1abc1e62519381..c13af52fdc6bc7 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -63,4 +63,4 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, */ int nghttp3_tnode_is_scheduled(nghttp3_tnode *tnode); -#endif /* NGHTTP3_TNODE_H */ +#endif /* !defined(NGHTTP3_TNODE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c index 6fea89b802b12d..8adeeb4931dc57 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c @@ -29,11 +29,11 @@ #include <errno.h> #ifdef HAVE_UNISTD_H # include <unistd.h> -#endif /* HAVE_UNISTD_H */ +#endif /* defined(HAVE_UNISTD_H) */ #include <stdlib.h> #ifdef WIN32 # include <io.h> -#endif /* WIN32 */ +#endif /* defined(WIN32) */ void nghttp3_unreachable_fail(const char *file, int line, const char *func) { char *buf; @@ -62,9 +62,9 @@ void nghttp3_unreachable_fail(const char *file, int line, const char *func) { #ifndef WIN32 while (write(STDERR_FILENO, buf, (size_t)rv) == -1 && errno == EINTR) ; -#else /* WIN32 */ +#else /* defined(WIN32) */ _write(_fileno(stderr), buf, (unsigned int)rv); -#endif /* WIN32 */ +#endif /* defined(WIN32) */ free(buf); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h index 6360f52d3aa857..c609d7ed72f3cb 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h @@ -28,26 +28,26 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> #ifdef __FILE_NAME__ # define NGHTTP3_FILE_NAME __FILE_NAME__ -#else /* !__FILE_NAME__ */ +#else /* !defined(__FILE_NAME__) */ # define NGHTTP3_FILE_NAME "(file)" -#endif /* !__FILE_NAME__ */ +#endif /* !defined(__FILE_NAME__) */ #define nghttp3_unreachable() \ nghttp3_unreachable_fail(NGHTTP3_FILE_NAME, __LINE__, __func__) #ifdef _MSC_VER __declspec(noreturn) -#endif /* _MSC_VER */ +#endif /* defined(_MSC_VER) */ void nghttp3_unreachable_fail(const char *file, int line, const char *func) #ifndef _MSC_VER __attribute__((noreturn)) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ ; -#endif /* NGHTTP3_UNREACHABLE_H */ +#endif /* !defined(NGHTTP3_UNREACHABLE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h index 473d1467310062..f36eabc1052621 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> @@ -38,4 +38,4 @@ */ int64_t nghttp3_vec_len_varint(const nghttp3_vec *vec, size_t n); -#endif /* NGHTTP3_VEC_H */ +#endif /* !defined(NGHTTP3_VEC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_version.c b/deps/ngtcp2/nghttp3/lib/nghttp3_version.c index c460cc72835b1d..939821d84eac3d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_version.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_version.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <nghttp3/nghttp3.h> diff --git a/deps/ngtcp2/nghttp3/lib/sfparse.c b/deps/ngtcp2/nghttp3/lib/sfparse.c deleted file mode 100644 index efa2850c9d661d..00000000000000 --- a/deps/ngtcp2/nghttp3/lib/sfparse.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* - * sfparse - * - * Copyright (c) 2023 sfparse contributors - * Copyright (c) 2019 nghttp3 contributors - * Copyright (c) 2015 nghttp2 contributors - * - * 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. - */ -#include "sfparse.h" - -#include <string.h> -#include <assert.h> -#include <stdlib.h> - -#define SF_STATE_DICT 0x08u -#define SF_STATE_LIST 0x10u -#define SF_STATE_ITEM 0x18u - -#define SF_STATE_INNER_LIST 0x04u - -#define SF_STATE_BEFORE 0x00u -#define SF_STATE_BEFORE_PARAMS 0x01u -#define SF_STATE_PARAMS 0x02u -#define SF_STATE_AFTER 0x03u - -#define SF_STATE_OP_MASK 0x03u - -#define SF_SET_STATE_AFTER(NAME) (SF_STATE_##NAME | SF_STATE_AFTER) -#define SF_SET_STATE_BEFORE_PARAMS(NAME) \ - (SF_STATE_##NAME | SF_STATE_BEFORE_PARAMS) -#define SF_SET_STATE_INNER_LIST_BEFORE(NAME) \ - (SF_STATE_##NAME | SF_STATE_INNER_LIST | SF_STATE_BEFORE) - -#define SF_STATE_DICT_AFTER SF_SET_STATE_AFTER(DICT) -#define SF_STATE_DICT_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(DICT) -#define SF_STATE_DICT_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(DICT) - -#define SF_STATE_LIST_AFTER SF_SET_STATE_AFTER(LIST) -#define SF_STATE_LIST_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(LIST) -#define SF_STATE_LIST_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(LIST) - -#define SF_STATE_ITEM_AFTER SF_SET_STATE_AFTER(ITEM) -#define SF_STATE_ITEM_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(ITEM) -#define SF_STATE_ITEM_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(ITEM) - -#define SF_STATE_INITIAL 0x00u - -#define DIGIT_CASES \ - case '0': \ - case '1': \ - case '2': \ - case '3': \ - case '4': \ - case '5': \ - case '6': \ - case '7': \ - case '8': \ - case '9' - -#define LCALPHA_CASES \ - case 'a': \ - case 'b': \ - case 'c': \ - case 'd': \ - case 'e': \ - case 'f': \ - case 'g': \ - case 'h': \ - case 'i': \ - case 'j': \ - case 'k': \ - case 'l': \ - case 'm': \ - case 'n': \ - case 'o': \ - case 'p': \ - case 'q': \ - case 'r': \ - case 's': \ - case 't': \ - case 'u': \ - case 'v': \ - case 'w': \ - case 'x': \ - case 'y': \ - case 'z' - -#define UCALPHA_CASES \ - case 'A': \ - case 'B': \ - case 'C': \ - case 'D': \ - case 'E': \ - case 'F': \ - case 'G': \ - case 'H': \ - case 'I': \ - case 'J': \ - case 'K': \ - case 'L': \ - case 'M': \ - case 'N': \ - case 'O': \ - case 'P': \ - case 'Q': \ - case 'R': \ - case 'S': \ - case 'T': \ - case 'U': \ - case 'V': \ - case 'W': \ - case 'X': \ - case 'Y': \ - case 'Z' - -#define ALPHA_CASES \ - UCALPHA_CASES: \ - LCALPHA_CASES - -#define X20_21_CASES \ - case ' ': \ - case '!' - -#define X23_5B_CASES \ - case '#': \ - case '$': \ - case '%': \ - case '&': \ - case '\'': \ - case '(': \ - case ')': \ - case '*': \ - case '+': \ - case ',': \ - case '-': \ - case '.': \ - case '/': \ - DIGIT_CASES: \ - case ':': \ - case ';': \ - case '<': \ - case '=': \ - case '>': \ - case '?': \ - case '@': \ - UCALPHA_CASES: \ - case '[' - -#define X5D_7E_CASES \ - case ']': \ - case '^': \ - case '_': \ - case '`': \ - LCALPHA_CASES: \ - case '{': \ - case '|': \ - case '}': \ - case '~' - -static int is_ws(uint8_t c) { - switch (c) { - case ' ': - case '\t': - return 1; - default: - return 0; - } -} - -static int parser_eof(sf_parser *sfp) { return sfp->pos == sfp->end; } - -static void parser_discard_ows(sf_parser *sfp) { - for (; !parser_eof(sfp) && is_ws(*sfp->pos); ++sfp->pos) - ; -} - -static void parser_discard_sp(sf_parser *sfp) { - for (; !parser_eof(sfp) && *sfp->pos == ' '; ++sfp->pos) - ; -} - -static void parser_set_op_state(sf_parser *sfp, uint32_t op) { - sfp->state &= ~SF_STATE_OP_MASK; - sfp->state |= op; -} - -static void parser_unset_inner_list_state(sf_parser *sfp) { - sfp->state &= ~SF_STATE_INNER_LIST; -} - -static int parser_key(sf_parser *sfp, sf_vec *dest) { - const uint8_t *base; - - switch (*sfp->pos) { - case '*': - LCALPHA_CASES: - break; - default: - return SF_ERR_PARSE_ERROR; - } - - base = sfp->pos++; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '_': - case '-': - case '.': - case '*': - DIGIT_CASES: - LCALPHA_CASES: - continue; - } - - break; - } - - if (dest) { - dest->base = (uint8_t *)base; - dest->len = (size_t)(sfp->pos - dest->base); - } - - return 0; -} - -static int parser_number(sf_parser *sfp, sf_value *dest) { - int sign = 1; - int64_t value = 0; - size_t len = 0; - size_t fpos = 0; - - if (*sfp->pos == '-') { - ++sfp->pos; - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - sign = -1; - } - - assert(!parser_eof(sfp)); - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SF_ERR_PARSE_ERROR; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; - } - - break; - } - - if (len == 0) { - return SF_ERR_PARSE_ERROR; - } - - if (parser_eof(sfp) || *sfp->pos != '.') { - if (dest) { - dest->type = SF_TYPE_INTEGER; - dest->flags = SF_VALUE_FLAG_NONE; - dest->integer = value * sign; - } - - return 0; - } - - /* decimal */ - - if (len > 12) { - return SF_ERR_PARSE_ERROR; - } - - fpos = len; - - ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SF_ERR_PARSE_ERROR; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; - } - - break; - } - - if (fpos == len || len - fpos > 3) { - return SF_ERR_PARSE_ERROR; - } - - if (dest) { - dest->type = SF_TYPE_DECIMAL; - dest->flags = SF_VALUE_FLAG_NONE; - dest->decimal.numer = value * sign; - - switch (len - fpos) { - case 1: - dest->decimal.denom = 10; - - break; - case 2: - dest->decimal.denom = 100; - - break; - case 3: - dest->decimal.denom = 1000; - - break; - } - } - - return 0; -} - -static int parser_date(sf_parser *sfp, sf_value *dest) { - int rv; - sf_value val; - - /* The first byte has already been validated by the caller. */ - assert('@' == *sfp->pos); - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - rv = parser_number(sfp, &val); - if (rv != 0) { - return rv; - } - - if (val.type != SF_TYPE_INTEGER) { - return SF_ERR_PARSE_ERROR; - } - - if (dest) { - *dest = val; - dest->type = SF_TYPE_DATE; - } - - return 0; -} - -static int parser_string(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - uint32_t flags = SF_VALUE_FLAG_NONE; - - /* The first byte has already been validated by the caller. */ - assert('"' == *sfp->pos); - - base = ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - X20_21_CASES: - X23_5B_CASES: - X5D_7E_CASES: - break; - case '\\': - ++sfp->pos; - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case '"': - case '\\': - flags = SF_VALUE_FLAG_ESCAPED_STRING; - - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - case '"': - if (dest) { - dest->type = SF_TYPE_STRING; - dest->flags = flags; - dest->vec.len = (size_t)(sfp->pos - base); - dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; - } - - ++sfp->pos; - - return 0; - default: - return SF_ERR_PARSE_ERROR; - } - } - - return SF_ERR_PARSE_ERROR; -} - -static int parser_token(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - - /* The first byte has already been validated by the caller. */ - base = sfp->pos++; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '!': - case '#': - case '$': - case '%': - case '&': - case '\'': - case '*': - case '+': - case '-': - case '.': - case '^': - case '_': - case '`': - case '|': - case '~': - case ':': - case '/': - DIGIT_CASES: - ALPHA_CASES: - continue; - } - - break; - } - - if (dest) { - dest->type = SF_TYPE_TOKEN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->vec.base = (uint8_t *)base; - dest->vec.len = (size_t)(sfp->pos - base); - } - - return 0; -} - -static int parser_byteseq(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - - /* The first byte has already been validated by the caller. */ - assert(':' == *sfp->pos); - - base = ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '+': - case '/': - DIGIT_CASES: - ALPHA_CASES: - continue; - case '=': - switch ((sfp->pos - base) & 0x3) { - case 0: - case 1: - return SF_ERR_PARSE_ERROR; - case 2: - switch (*(sfp->pos - 1)) { - case 'A': - case 'Q': - case 'g': - case 'w': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - if (parser_eof(sfp) || *sfp->pos != '=') { - return SF_ERR_PARSE_ERROR; - } - - break; - case 3: - switch (*(sfp->pos - 1)) { - case 'A': - case 'E': - case 'I': - case 'M': - case 'Q': - case 'U': - case 'Y': - case 'c': - case 'g': - case 'k': - case 'o': - case 's': - case 'w': - case '0': - case '4': - case '8': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - } - - ++sfp->pos; - - if (parser_eof(sfp) || *sfp->pos != ':') { - return SF_ERR_PARSE_ERROR; - } - - goto fin; - case ':': - if ((sfp->pos - base) & 0x3) { - return SF_ERR_PARSE_ERROR; - } - - goto fin; - default: - return SF_ERR_PARSE_ERROR; - } - } - - return SF_ERR_PARSE_ERROR; - -fin: - if (dest) { - dest->type = SF_TYPE_BYTESEQ; - dest->flags = SF_VALUE_FLAG_NONE; - dest->vec.len = (size_t)(sfp->pos - base); - dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; - } - - ++sfp->pos; - - return 0; -} - -static int parser_boolean(sf_parser *sfp, sf_value *dest) { - int b; - - /* The first byte has already been validated by the caller. */ - assert('?' == *sfp->pos); - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case '0': - b = 0; - - break; - case '1': - b = 1; - - break; - default: - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - if (dest) { - dest->type = SF_TYPE_BOOLEAN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->boolean = b; - } - - return 0; -} - -static int parser_bare_item(sf_parser *sfp, sf_value *dest) { - switch (*sfp->pos) { - case '"': - return parser_string(sfp, dest); - case '-': - DIGIT_CASES: - return parser_number(sfp, dest); - case '@': - return parser_date(sfp, dest); - case ':': - return parser_byteseq(sfp, dest); - case '?': - return parser_boolean(sfp, dest); - case '*': - ALPHA_CASES: - return parser_token(sfp, dest); - default: - return SF_ERR_PARSE_ERROR; - } -} - -static int parser_skip_inner_list(sf_parser *sfp); - -int sf_parser_param(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { - int rv; - - switch (sfp->state & SF_STATE_OP_MASK) { - case SF_STATE_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_BEFORE_PARAMS: - parser_set_op_state(sfp, SF_STATE_PARAMS); - - break; - case SF_STATE_PARAMS: - break; - default: - assert(0); - abort(); - } - - if (parser_eof(sfp) || *sfp->pos != ';') { - parser_set_op_state(sfp, SF_STATE_AFTER); - - return SF_ERR_EOF; - } - - ++sfp->pos; - - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - rv = parser_key(sfp, dest_key); - if (rv != 0) { - return rv; - } - - if (parser_eof(sfp) || *sfp->pos != '=') { - if (dest_value) { - dest_value->type = SF_TYPE_BOOLEAN; - dest_value->flags = SF_VALUE_FLAG_NONE; - dest_value->boolean = 1; - } - - return 0; - } - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return parser_bare_item(sfp, dest_value); -} - -static int parser_skip_params(sf_parser *sfp) { - int rv; - - for (;;) { - rv = sf_parser_param(sfp, NULL, NULL); - switch (rv) { - case 0: - break; - case SF_ERR_EOF: - return 0; - case SF_ERR_PARSE_ERROR: - return rv; - default: - assert(0); - abort(); - } - } -} - -int sf_parser_inner_list(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state & SF_STATE_OP_MASK) { - case SF_STATE_BEFORE: - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case SF_STATE_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* Technically, we are entering SF_STATE_AFTER, but we will set - another state without reading the state. */ - /* parser_set_op_state(sfp, SF_STATE_AFTER); */ - - /* fall through */ - case SF_STATE_AFTER: - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case ' ': - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case ')': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - default: - assert(0); - abort(); - } - - if (*sfp->pos == ')') { - ++sfp->pos; - - parser_unset_inner_list_state(sfp); - parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); - - return SF_ERR_EOF; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); - - return 0; -} - -static int parser_skip_inner_list(sf_parser *sfp) { - int rv; - - for (;;) { - rv = sf_parser_inner_list(sfp, NULL); - switch (rv) { - case 0: - break; - case SF_ERR_EOF: - return 0; - case SF_ERR_PARSE_ERROR: - return rv; - default: - assert(0); - abort(); - } - } -} - -static int parser_next_key_or_item(sf_parser *sfp) { - parser_discard_ows(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - if (*sfp->pos != ',') { - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - parser_discard_ows(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return 0; -} - -static int parser_dict_value(sf_parser *sfp, sf_value *dest) { - int rv; - - if (parser_eof(sfp) || *(sfp->pos) != '=') { - /* Boolean true */ - if (dest) { - dest->type = SF_TYPE_BOOLEAN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->boolean = 1; - } - - sfp->state = SF_STATE_DICT_BEFORE_PARAMS; - - return 0; - } - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_DICT_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_DICT_BEFORE_PARAMS; - - return 0; -} - -int sf_parser_dict(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { - int rv; - - switch (sfp->state) { - case SF_STATE_DICT_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_DICT_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_DICT_AFTER: - rv = parser_next_key_or_item(sfp); - if (rv != 0) { - return rv; - } - - break; - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - break; - default: - assert(0); - abort(); - } - - rv = parser_key(sfp, dest_key); - if (rv != 0) { - return rv; - } - - return parser_dict_value(sfp, dest_value); -} - -int sf_parser_list(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state) { - case SF_STATE_LIST_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_LIST_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_LIST_AFTER: - rv = parser_next_key_or_item(sfp); - if (rv != 0) { - return rv; - } - - break; - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - break; - default: - assert(0); - abort(); - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_LIST_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_LIST_BEFORE_PARAMS; - - return 0; -} - -int sf_parser_item(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state) { - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case SF_STATE_ITEM_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_ITEM_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_ITEM_AFTER: - parser_discard_sp(sfp); - - if (!parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return SF_ERR_EOF; - default: - assert(0); - abort(); - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_ITEM_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_ITEM_BEFORE_PARAMS; - - return 0; -} - -void sf_parser_init(sf_parser *sfp, const uint8_t *data, size_t datalen) { - if (datalen == 0) { - sfp->pos = sfp->end = NULL; - } else { - sfp->pos = data; - sfp->end = data + datalen; - } - - sfp->state = SF_STATE_INITIAL; -} - -void sf_unescape(sf_vec *dest, const sf_vec *src) { - const uint8_t *p, *q; - uint8_t *o; - size_t len, slen; - - if (src->len == 0) { - *dest = *src; - - return; - } - - o = dest->base; - p = src->base; - len = src->len; - - for (;;) { - q = memchr(p, '\\', len); - if (q == NULL) { - if (len == src->len) { - *dest = *src; - - return; - } - - memcpy(o, p, len); - o += len; - - break; - } - - slen = (size_t)(q - p); - memcpy(o, p, slen); - o += slen; - - p = q + 1; - *o++ = *p++; - len -= slen + 2; - } - - dest->len = (size_t)(o - dest->base); -} - -void sf_base64decode(sf_vec *dest, const sf_vec *src) { - static const int index_tbl[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1}; - uint8_t *o; - const uint8_t *p, *end; - uint32_t n; - size_t i; - int idx; - - assert((src->len & 0x3) == 0); - - if (src->len == 0) { - *dest = *src; - - return; - } - - o = dest->base; - p = src->base; - end = src->base + src->len; - - for (; p != end;) { - n = 0; - - for (i = 1; i <= 4; ++i, ++p) { - idx = index_tbl[*p]; - - if (idx == -1) { - assert(i > 2); - - if (i == 3) { - assert(*p == '=' && *(p + 1) == '=' && p + 2 == end); - - *o++ = (uint8_t)(n >> 16); - - goto fin; - } - - assert(*p == '=' && p + 1 == end); - - *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - - goto fin; - } - - n += (uint32_t)(idx << (24 - i * 6)); - } - - *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; - } - -fin: - dest->len = (size_t)(o - dest->base); -} diff --git a/deps/ngtcp2/nghttp3/lib/sfparse/COPYING b/deps/ngtcp2/nghttp3/lib/sfparse/COPYING new file mode 100644 index 00000000000000..8212d82d83ab74 --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/sfparse/COPYING @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2023 sfparse contributors + +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/ngtcp2/nghttp3/lib/sfparse/sfparse.c b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c new file mode 100644 index 00000000000000..d0328cf40c21ea --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c @@ -0,0 +1,1517 @@ +/* + * sfparse + * + * Copyright (c) 2023 sfparse contributors + * Copyright (c) 2019 nghttp3 contributors + * Copyright (c) 2015 nghttp2 contributors + * + * 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. + */ +#include "sfparse.h" + +#include <string.h> +#include <assert.h> +#include <stdlib.h> + +#define SF_STATE_DICT 0x08u +#define SF_STATE_LIST 0x10u +#define SF_STATE_ITEM 0x18u + +#define SF_STATE_INNER_LIST 0x04u + +#define SF_STATE_BEFORE 0x00u +#define SF_STATE_BEFORE_PARAMS 0x01u +#define SF_STATE_PARAMS 0x02u +#define SF_STATE_AFTER 0x03u + +#define SF_STATE_OP_MASK 0x03u + +#define SF_SET_STATE_AFTER(NAME) (SF_STATE_##NAME | SF_STATE_AFTER) +#define SF_SET_STATE_BEFORE_PARAMS(NAME) \ + (SF_STATE_##NAME | SF_STATE_BEFORE_PARAMS) +#define SF_SET_STATE_INNER_LIST_BEFORE(NAME) \ + (SF_STATE_##NAME | SF_STATE_INNER_LIST | SF_STATE_BEFORE) + +#define SF_STATE_DICT_AFTER SF_SET_STATE_AFTER(DICT) +#define SF_STATE_DICT_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(DICT) +#define SF_STATE_DICT_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(DICT) + +#define SF_STATE_LIST_AFTER SF_SET_STATE_AFTER(LIST) +#define SF_STATE_LIST_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(LIST) +#define SF_STATE_LIST_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(LIST) + +#define SF_STATE_ITEM_AFTER SF_SET_STATE_AFTER(ITEM) +#define SF_STATE_ITEM_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(ITEM) +#define SF_STATE_ITEM_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(ITEM) + +#define SF_STATE_INITIAL 0x00u + +#define DIGIT_CASES \ + case '0': \ + case '1': \ + case '2': \ + case '3': \ + case '4': \ + case '5': \ + case '6': \ + case '7': \ + case '8': \ + case '9' + +#define LCALPHA_CASES \ + case 'a': \ + case 'b': \ + case 'c': \ + case 'd': \ + case 'e': \ + case 'f': \ + case 'g': \ + case 'h': \ + case 'i': \ + case 'j': \ + case 'k': \ + case 'l': \ + case 'm': \ + case 'n': \ + case 'o': \ + case 'p': \ + case 'q': \ + case 'r': \ + case 's': \ + case 't': \ + case 'u': \ + case 'v': \ + case 'w': \ + case 'x': \ + case 'y': \ + case 'z' + +#define UCALPHA_CASES \ + case 'A': \ + case 'B': \ + case 'C': \ + case 'D': \ + case 'E': \ + case 'F': \ + case 'G': \ + case 'H': \ + case 'I': \ + case 'J': \ + case 'K': \ + case 'L': \ + case 'M': \ + case 'N': \ + case 'O': \ + case 'P': \ + case 'Q': \ + case 'R': \ + case 'S': \ + case 'T': \ + case 'U': \ + case 'V': \ + case 'W': \ + case 'X': \ + case 'Y': \ + case 'Z' + +#define ALPHA_CASES \ + UCALPHA_CASES: \ + LCALPHA_CASES + +#define TOKEN_CASES \ + case '!': \ + case '#': \ + case '$': \ + case '%': \ + case '&': \ + case '\'': \ + case '*': \ + case '+': \ + case '-': \ + case '.': \ + case '/': \ + DIGIT_CASES: \ + case ':': \ + UCALPHA_CASES: \ + case '^': \ + case '_': \ + case '`': \ + LCALPHA_CASES: \ + case '|': \ + case '~' + +#define LCHEXALPHA_CASES \ + case 'a': \ + case 'b': \ + case 'c': \ + case 'd': \ + case 'e': \ + case 'f' + +#define X00_1F_CASES \ + case 0x00: \ + case 0x01: \ + case 0x02: \ + case 0x03: \ + case 0x04: \ + case 0x05: \ + case 0x06: \ + case 0x07: \ + case 0x08: \ + case 0x09: \ + case 0x0a: \ + case 0x0b: \ + case 0x0c: \ + case 0x0d: \ + case 0x0e: \ + case 0x0f: \ + case 0x10: \ + case 0x11: \ + case 0x12: \ + case 0x13: \ + case 0x14: \ + case 0x15: \ + case 0x16: \ + case 0x17: \ + case 0x18: \ + case 0x19: \ + case 0x1a: \ + case 0x1b: \ + case 0x1c: \ + case 0x1d: \ + case 0x1e: \ + case 0x1f + +#define X20_21_CASES \ + case ' ': \ + case '!' + +#define X23_5B_CASES \ + case '#': \ + case '$': \ + case '%': \ + case '&': \ + case '\'': \ + case '(': \ + case ')': \ + case '*': \ + case '+': \ + case ',': \ + case '-': \ + case '.': \ + case '/': \ + DIGIT_CASES: \ + case ':': \ + case ';': \ + case '<': \ + case '=': \ + case '>': \ + case '?': \ + case '@': \ + UCALPHA_CASES: \ + case '[' + +#define X5D_7E_CASES \ + case ']': \ + case '^': \ + case '_': \ + case '`': \ + LCALPHA_CASES: \ + case '{': \ + case '|': \ + case '}': \ + case '~' + +#define X7F_FF_CASES \ + case 0x7f: \ + case 0x80: \ + case 0x81: \ + case 0x82: \ + case 0x83: \ + case 0x84: \ + case 0x85: \ + case 0x86: \ + case 0x87: \ + case 0x88: \ + case 0x89: \ + case 0x8a: \ + case 0x8b: \ + case 0x8c: \ + case 0x8d: \ + case 0x8e: \ + case 0x8f: \ + case 0x90: \ + case 0x91: \ + case 0x92: \ + case 0x93: \ + case 0x94: \ + case 0x95: \ + case 0x96: \ + case 0x97: \ + case 0x98: \ + case 0x99: \ + case 0x9a: \ + case 0x9b: \ + case 0x9c: \ + case 0x9d: \ + case 0x9e: \ + case 0x9f: \ + case 0xa0: \ + case 0xa1: \ + case 0xa2: \ + case 0xa3: \ + case 0xa4: \ + case 0xa5: \ + case 0xa6: \ + case 0xa7: \ + case 0xa8: \ + case 0xa9: \ + case 0xaa: \ + case 0xab: \ + case 0xac: \ + case 0xad: \ + case 0xae: \ + case 0xaf: \ + case 0xb0: \ + case 0xb1: \ + case 0xb2: \ + case 0xb3: \ + case 0xb4: \ + case 0xb5: \ + case 0xb6: \ + case 0xb7: \ + case 0xb8: \ + case 0xb9: \ + case 0xba: \ + case 0xbb: \ + case 0xbc: \ + case 0xbd: \ + case 0xbe: \ + case 0xbf: \ + case 0xc0: \ + case 0xc1: \ + case 0xc2: \ + case 0xc3: \ + case 0xc4: \ + case 0xc5: \ + case 0xc6: \ + case 0xc7: \ + case 0xc8: \ + case 0xc9: \ + case 0xca: \ + case 0xcb: \ + case 0xcc: \ + case 0xcd: \ + case 0xce: \ + case 0xcf: \ + case 0xd0: \ + case 0xd1: \ + case 0xd2: \ + case 0xd3: \ + case 0xd4: \ + case 0xd5: \ + case 0xd6: \ + case 0xd7: \ + case 0xd8: \ + case 0xd9: \ + case 0xda: \ + case 0xdb: \ + case 0xdc: \ + case 0xdd: \ + case 0xde: \ + case 0xdf: \ + case 0xe0: \ + case 0xe1: \ + case 0xe2: \ + case 0xe3: \ + case 0xe4: \ + case 0xe5: \ + case 0xe6: \ + case 0xe7: \ + case 0xe8: \ + case 0xe9: \ + case 0xea: \ + case 0xeb: \ + case 0xec: \ + case 0xed: \ + case 0xee: \ + case 0xef: \ + case 0xf0: \ + case 0xf1: \ + case 0xf2: \ + case 0xf3: \ + case 0xf4: \ + case 0xf5: \ + case 0xf6: \ + case 0xf7: \ + case 0xf8: \ + case 0xf9: \ + case 0xfa: \ + case 0xfb: \ + case 0xfc: \ + case 0xfd: \ + case 0xfe: \ + case 0xff + +static int is_ws(uint8_t c) { + switch (c) { + case ' ': + case '\t': + return 1; + default: + return 0; + } +} + +static int parser_eof(sf_parser *sfp) { return sfp->pos == sfp->end; } + +static void parser_discard_ows(sf_parser *sfp) { + for (; !parser_eof(sfp) && is_ws(*sfp->pos); ++sfp->pos) + ; +} + +static void parser_discard_sp(sf_parser *sfp) { + for (; !parser_eof(sfp) && *sfp->pos == ' '; ++sfp->pos) + ; +} + +static void parser_set_op_state(sf_parser *sfp, uint32_t op) { + sfp->state &= ~SF_STATE_OP_MASK; + sfp->state |= op; +} + +static void parser_unset_inner_list_state(sf_parser *sfp) { + sfp->state &= ~SF_STATE_INNER_LIST; +} + +static int parser_key(sf_parser *sfp, sf_vec *dest) { + const uint8_t *base; + + switch (*sfp->pos) { + case '*': + LCALPHA_CASES: + break; + default: + return SF_ERR_PARSE_ERROR; + } + + base = sfp->pos++; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + case '_': + case '-': + case '.': + case '*': + DIGIT_CASES: + LCALPHA_CASES: + continue; + } + + break; + } + + if (dest) { + dest->base = (uint8_t *)base; + dest->len = (size_t)(sfp->pos - dest->base); + } + + return 0; +} + +static int parser_number(sf_parser *sfp, sf_value *dest) { + int sign = 1; + int64_t value = 0; + size_t len = 0; + size_t fpos = 0; + + if (*sfp->pos == '-') { + ++sfp->pos; + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + sign = -1; + } + + assert(!parser_eof(sfp)); + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + DIGIT_CASES: + if (++len > 15) { + return SF_ERR_PARSE_ERROR; + } + + value *= 10; + value += *sfp->pos - '0'; + + continue; + } + + break; + } + + if (len == 0) { + return SF_ERR_PARSE_ERROR; + } + + if (parser_eof(sfp) || *sfp->pos != '.') { + if (dest) { + dest->type = SF_TYPE_INTEGER; + dest->flags = SF_VALUE_FLAG_NONE; + dest->integer = value * sign; + } + + return 0; + } + + /* decimal */ + + if (len > 12) { + return SF_ERR_PARSE_ERROR; + } + + fpos = len; + + ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + DIGIT_CASES: + if (++len > 15) { + return SF_ERR_PARSE_ERROR; + } + + value *= 10; + value += *sfp->pos - '0'; + + continue; + } + + break; + } + + if (fpos == len || len - fpos > 3) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + dest->type = SF_TYPE_DECIMAL; + dest->flags = SF_VALUE_FLAG_NONE; + dest->decimal.numer = value * sign; + + switch (len - fpos) { + case 1: + dest->decimal.denom = 10; + + break; + case 2: + dest->decimal.denom = 100; + + break; + case 3: + dest->decimal.denom = 1000; + + break; + } + } + + return 0; +} + +static int parser_date(sf_parser *sfp, sf_value *dest) { + int rv; + sf_value val; + + /* The first byte has already been validated by the caller. */ + assert('@' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + rv = parser_number(sfp, &val); + if (rv != 0) { + return rv; + } + + if (val.type != SF_TYPE_INTEGER) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + *dest = val; + dest->type = SF_TYPE_DATE; + } + + return 0; +} + +static int parser_string(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + uint32_t flags = SF_VALUE_FLAG_NONE; + + /* The first byte has already been validated by the caller. */ + assert('"' == *sfp->pos); + + base = ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + X20_21_CASES: + X23_5B_CASES: + X5D_7E_CASES: + break; + case '\\': + ++sfp->pos; + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case '"': + case '\\': + flags = SF_VALUE_FLAG_ESCAPED_STRING; + + break; + default: + return SF_ERR_PARSE_ERROR; + } + + break; + case '"': + if (dest) { + dest->type = SF_TYPE_STRING; + dest->flags = flags; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; + default: + return SF_ERR_PARSE_ERROR; + } + } + + return SF_ERR_PARSE_ERROR; +} + +static int parser_token(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + + /* The first byte has already been validated by the caller. */ + base = sfp->pos++; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + TOKEN_CASES: + continue; + } + + break; + } + + if (dest) { + dest->type = SF_TYPE_TOKEN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.base = (uint8_t *)base; + dest->vec.len = (size_t)(sfp->pos - base); + } + + return 0; +} + +static int parser_byteseq(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + + /* The first byte has already been validated by the caller. */ + assert(':' == *sfp->pos); + + base = ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + case '+': + case '/': + DIGIT_CASES: + ALPHA_CASES: + continue; + case '=': + switch ((sfp->pos - base) & 0x3) { + case 0: + case 1: + return SF_ERR_PARSE_ERROR; + case 2: + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + if (*sfp->pos == '=') { + ++sfp->pos; + } + + break; + case 3: + ++sfp->pos; + + break; + } + + if (parser_eof(sfp) || *sfp->pos != ':') { + return SF_ERR_PARSE_ERROR; + } + + goto fin; + case ':': + if (((sfp->pos - base) & 0x3) == 1) { + return SF_ERR_PARSE_ERROR; + } + + goto fin; + default: + return SF_ERR_PARSE_ERROR; + } + } + + return SF_ERR_PARSE_ERROR; + +fin: + if (dest) { + dest->type = SF_TYPE_BYTESEQ; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; +} + +static int parser_boolean(sf_parser *sfp, sf_value *dest) { + int b; + + /* The first byte has already been validated by the caller. */ + assert('?' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case '0': + b = 0; + + break; + case '1': + b = 1; + + break; + default: + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + + if (dest) { + dest->type = SF_TYPE_BOOLEAN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->boolean = b; + } + + return 0; +} + +static int pctdecode(uint8_t *pc, const uint8_t **ppos) { + uint8_t c, b = **ppos; + + switch (b) { + DIGIT_CASES: + c = (uint8_t)((b - '0') << 4); + + break; + LCHEXALPHA_CASES: + c = (uint8_t)((b - 'a' + 10) << 4); + + break; + default: + return -1; + } + + b = *++*ppos; + + switch (b) { + DIGIT_CASES: + c |= (uint8_t)(b - '0'); + + break; + LCHEXALPHA_CASES: + c |= (uint8_t)(b - 'a' + 10); + + break; + default: + return -1; + } + + *pc = c; + ++*ppos; + + return 0; +} + +/* Start of utf8 dfa */ +/* Copyright (c) 2008-2010 Bjoern Hoehrmann <bjoern@hoehrmann.de> + * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. + * + * Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de> + * + * 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. + */ +#define UTF8_ACCEPT 0 +#define UTF8_REJECT 12 + +/* clang-format off */ +static const uint8_t utf8d[] = { + /* + * The first part of the table maps bytes to character classes that + * to reduce the size of the transition table and create bitmasks. + */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + + /* + * The second part is a transition table that maps a combination + * of a state of the automaton and a character class to a state. + */ + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, +}; +/* clang-format on */ + +static void utf8_decode(uint32_t *state, uint8_t byte) { + *state = utf8d[256 + *state + utf8d[byte]]; +} + +/* End of utf8 dfa */ + +static int parser_dispstring(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + uint8_t c; + uint32_t utf8state = UTF8_ACCEPT; + + assert('%' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp) || *sfp->pos != '"') { + return SF_ERR_PARSE_ERROR; + } + + base = ++sfp->pos; + + for (; !parser_eof(sfp);) { + switch (*sfp->pos) { + X00_1F_CASES: + X7F_FF_CASES: + return SF_ERR_PARSE_ERROR; + case '%': + ++sfp->pos; + + if (sfp->pos + 2 > sfp->end) { + return SF_ERR_PARSE_ERROR; + } + + if (pctdecode(&c, &sfp->pos) != 0) { + return SF_ERR_PARSE_ERROR; + } + + utf8_decode(&utf8state, c); + if (utf8state == UTF8_REJECT) { + return SF_ERR_PARSE_ERROR; + } + + break; + case '"': + if (utf8state != UTF8_ACCEPT) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + dest->type = SF_TYPE_DISPSTRING; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; + default: + if (utf8state != UTF8_ACCEPT) { + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + } + } + + return SF_ERR_PARSE_ERROR; +} + +static int parser_bare_item(sf_parser *sfp, sf_value *dest) { + switch (*sfp->pos) { + case '"': + return parser_string(sfp, dest); + case '-': + DIGIT_CASES: + return parser_number(sfp, dest); + case '@': + return parser_date(sfp, dest); + case ':': + return parser_byteseq(sfp, dest); + case '?': + return parser_boolean(sfp, dest); + case '*': + ALPHA_CASES: + return parser_token(sfp, dest); + case '%': + return parser_dispstring(sfp, dest); + default: + return SF_ERR_PARSE_ERROR; + } +} + +static int parser_skip_inner_list(sf_parser *sfp); + +int sf_parser_param(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { + int rv; + + switch (sfp->state & SF_STATE_OP_MASK) { + case SF_STATE_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_BEFORE_PARAMS: + parser_set_op_state(sfp, SF_STATE_PARAMS); + + break; + case SF_STATE_PARAMS: + break; + default: + assert(0); + abort(); + } + + if (parser_eof(sfp) || *sfp->pos != ';') { + parser_set_op_state(sfp, SF_STATE_AFTER); + + return SF_ERR_EOF; + } + + ++sfp->pos; + + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + rv = parser_key(sfp, dest_key); + if (rv != 0) { + return rv; + } + + if (parser_eof(sfp) || *sfp->pos != '=') { + if (dest_value) { + dest_value->type = SF_TYPE_BOOLEAN; + dest_value->flags = SF_VALUE_FLAG_NONE; + dest_value->boolean = 1; + } + + return 0; + } + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return parser_bare_item(sfp, dest_value); +} + +static int parser_skip_params(sf_parser *sfp) { + int rv; + + for (;;) { + rv = sf_parser_param(sfp, NULL, NULL); + switch (rv) { + case 0: + break; + case SF_ERR_EOF: + return 0; + case SF_ERR_PARSE_ERROR: + return rv; + default: + assert(0); + abort(); + } + } +} + +int sf_parser_inner_list(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state & SF_STATE_OP_MASK) { + case SF_STATE_BEFORE: + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case SF_STATE_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* Technically, we are entering SF_STATE_AFTER, but we will set + another state without reading the state. */ + /* parser_set_op_state(sfp, SF_STATE_AFTER); */ + + /* fall through */ + case SF_STATE_AFTER: + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case ' ': + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case ')': + break; + default: + return SF_ERR_PARSE_ERROR; + } + + break; + default: + assert(0); + abort(); + } + + if (*sfp->pos == ')') { + ++sfp->pos; + + parser_unset_inner_list_state(sfp); + parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); + + return SF_ERR_EOF; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); + + return 0; +} + +static int parser_skip_inner_list(sf_parser *sfp) { + int rv; + + for (;;) { + rv = sf_parser_inner_list(sfp, NULL); + switch (rv) { + case 0: + break; + case SF_ERR_EOF: + return 0; + case SF_ERR_PARSE_ERROR: + return rv; + default: + assert(0); + abort(); + } + } +} + +static int parser_next_key_or_item(sf_parser *sfp) { + parser_discard_ows(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + if (*sfp->pos != ',') { + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + + parser_discard_ows(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return 0; +} + +static int parser_dict_value(sf_parser *sfp, sf_value *dest) { + int rv; + + if (parser_eof(sfp) || *(sfp->pos) != '=') { + /* Boolean true */ + if (dest) { + dest->type = SF_TYPE_BOOLEAN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->boolean = 1; + } + + sfp->state = SF_STATE_DICT_BEFORE_PARAMS; + + return 0; + } + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_DICT_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_DICT_BEFORE_PARAMS; + + return 0; +} + +int sf_parser_dict(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { + int rv; + + switch (sfp->state) { + case SF_STATE_DICT_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_DICT_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_DICT_AFTER: + rv = parser_next_key_or_item(sfp); + if (rv != 0) { + return rv; + } + + break; + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + break; + default: + assert(0); + abort(); + } + + rv = parser_key(sfp, dest_key); + if (rv != 0) { + return rv; + } + + return parser_dict_value(sfp, dest_value); +} + +int sf_parser_list(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state) { + case SF_STATE_LIST_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_LIST_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_LIST_AFTER: + rv = parser_next_key_or_item(sfp); + if (rv != 0) { + return rv; + } + + break; + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + break; + default: + assert(0); + abort(); + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_LIST_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_LIST_BEFORE_PARAMS; + + return 0; +} + +int sf_parser_item(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state) { + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case SF_STATE_ITEM_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_ITEM_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_ITEM_AFTER: + parser_discard_sp(sfp); + + if (!parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return SF_ERR_EOF; + default: + assert(0); + abort(); + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_ITEM_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_ITEM_BEFORE_PARAMS; + + return 0; +} + +void sf_parser_init(sf_parser *sfp, const uint8_t *data, size_t datalen) { + if (datalen == 0) { + sfp->pos = sfp->end = NULL; + } else { + sfp->pos = data; + sfp->end = data + datalen; + } + + sfp->state = SF_STATE_INITIAL; +} + +void sf_unescape(sf_vec *dest, const sf_vec *src) { + const uint8_t *p, *q; + uint8_t *o; + size_t len, slen; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + len = src->len; + + for (;;) { + q = memchr(p, '\\', len); + if (q == NULL) { + memcpy(o, p, len); + o += len; + + dest->len = (size_t)(o - dest->base); + + return; + } + + slen = (size_t)(q - p); + memcpy(o, p, slen); + o += slen; + + p = q + 1; + *o++ = *p++; + len -= slen + 2; + } +} + +void sf_base64decode(sf_vec *dest, const sf_vec *src) { + static const int index_tbl[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1}; + uint8_t *o; + const uint8_t *p, *end; + uint32_t n; + size_t i, left; + int idx; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + left = src->len & 0x3; + if (left == 0 && src->base[src->len - 1] == '=') { + left = 4; + } + end = src->base + src->len - left; + + for (; p != end;) { + n = 0; + + for (i = 1; i <= 4; ++i, ++p) { + idx = index_tbl[*p]; + + assert(idx != -1); + + n += (uint32_t)(idx << (24 - i * 6)); + } + + *o++ = (uint8_t)(n >> 16); + *o++ = (n >> 8) & 0xffu; + *o++ = n & 0xffu; + } + + switch (left) { + case 0: + goto fin; + case 1: + assert(0); + abort(); + case 3: + if (src->base[src->len - 1] == '=') { + left = 2; + } + + break; + case 4: + assert('=' == src->base[src->len - 1]); + + if (src->base[src->len - 2] == '=') { + left = 2; + } else { + left = 3; + } + + break; + } + + switch (left) { + case 2: + *o = (uint8_t)(index_tbl[*p++] << 2); + *o++ |= (uint8_t)(index_tbl[*p++] >> 4); + + break; + case 3: + n = (uint32_t)(index_tbl[*p++] << 10); + n += (uint32_t)(index_tbl[*p++] << 4); + n += (uint32_t)(index_tbl[*p++] >> 2); + *o++ = (n >> 8) & 0xffu; + *o++ = n & 0xffu; + + break; + } + +fin: + dest->len = (size_t)(o - dest->base); +} + +void sf_pctdecode(sf_vec *dest, const sf_vec *src) { + const uint8_t *p, *q; + uint8_t *o; + size_t len, slen; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + len = src->len; + + for (;;) { + q = memchr(p, '%', len); + if (q == NULL) { + memcpy(o, p, len); + o += len; + + dest->len = (size_t)(o - dest->base); + + return; + } + + slen = (size_t)(q - p); + memcpy(o, p, slen); + o += slen; + + p = q + 1; + + pctdecode(o++, &p); + + len -= slen + 3; + } +} diff --git a/deps/ngtcp2/nghttp3/lib/sfparse.h b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h similarity index 91% rename from deps/ngtcp2/nghttp3/lib/sfparse.h rename to deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h index 1474db1429acea..01cc947d4d61bc 100644 --- a/deps/ngtcp2/nghttp3/lib/sfparse.h +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h @@ -85,7 +85,11 @@ typedef enum sf_type { /** * :enum:`SF_TYPE_DATE` indicates date type. */ - SF_TYPE_DATE + SF_TYPE_DATE, + /** + * :enum:`SF_TYPE_DISPSTRING` indicates display string type. + */ + SF_TYPE_DISPSTRING } sf_type; /** @@ -197,8 +201,8 @@ typedef struct sf_value { /** * :member:`vec` contains sequence of bytes if :member:`type` is * either :enum:`sf_type.SF_TYPE_STRING`, - * :enum:`sf_type.SF_TYPE_TOKEN`, or - * :enum:`sf_type.SF_TYPE_BYTESEQ`. + * :enum:`sf_type.SF_TYPE_TOKEN`, :enum:`sf_type.SF_TYPE_BYTESEQ`, + * or :enum:`sf_type.SF_TYPE_DISPSTRING`. * * For :enum:`sf_type.SF_TYPE_STRING`, this field contains one or * more escaped characters if :member:`flags` has @@ -209,6 +213,10 @@ typedef struct sf_value { * encoded string. To decode this byte string, use * `sf_base64decode`. * + * For :enum:`sf_type.SF_TYPE_DISPSTRING`, this field may contain + * percent-encoded UTF-8 byte sequences. To decode it, use + * `sf_pctdecode`. + * * If :member:`vec.len <sf_vec.len>` == 0, :member:`vec.base * <sf_vec.base>` is guaranteed to be NULL. */ @@ -372,10 +380,6 @@ int sf_parser_inner_list(sf_parser *sfp, sf_value *dest); * :member:`dest->base <sf_vec.base>` must point to the buffer that * has sufficient space to store the unescaped string. * - * If there is no escape character in |src|, |*src| is assigned to - * |*dest|. This includes the case that :member:`src->len - * <sf_vec.len>` == 0. - * * This function sets the length of unescaped string to * :member:`dest->len <sf_vec.len>`. */ @@ -394,14 +398,29 @@ void sf_unescape(sf_vec *dest, const sf_vec *src); * :member:`dest->base <sf_vec.base>` must point to the buffer that * has sufficient space to store the decoded byte string. * - * If :member:`src->len <sf_vec.len>` == 0, |*src| is assigned to - * |*dest|. - * * This function sets the length of decoded byte string to * :member:`dest->len <sf_vec.len>`. */ void sf_base64decode(sf_vec *dest, const sf_vec *src); +/** + * @function + * + * `sf_pctdecode` decodes percent-encoded string |src| and writes the + * result into |dest|. |src| should be the pointer to + * :member:`sf_value.vec` of type :enum:`sf_type.SF_TYPE_DISPSTRING` + * produced by either `sf_parser_dict`, `sf_parser_list`, + * `sf_parser_inner_list`, `sf_parser_item`, or `sf_parser_param`, + * otherwise the behavior is undefined. + * + * :member:`dest->base <sf_vec.base>` must point to the buffer that + * has sufficient space to store the decoded byte string. + * + * This function sets the length of decoded byte string to + * :member:`dest->len <sf_vec.len>`. + */ +void sf_pctdecode(sf_vec *dest, const sf_vec *src); + #ifdef __cplusplus } #endif diff --git a/deps/ngtcp2/ngtcp2.gyp b/deps/ngtcp2/ngtcp2.gyp index 0f2929b75478f1..bef81462e4bea5 100644 --- a/deps/ngtcp2/ngtcp2.gyp +++ b/deps/ngtcp2/ngtcp2.gyp @@ -13,7 +13,7 @@ 'ngtcp2/lib/ngtcp2_cid.c', 'ngtcp2/lib/ngtcp2_conn.c', 'ngtcp2/lib/ngtcp2_conv.c', - 'ngtcp2/lib/ngtcp2_conversion.c', + 'ngtcp2/lib/ngtcp2_dcidtr.c', 'ngtcp2/lib/ngtcp2_crypto.c', 'ngtcp2/lib/ngtcp2_err.c', 'ngtcp2/lib/ngtcp2_frame_chain.c', @@ -37,8 +37,10 @@ 'ngtcp2/lib/ngtcp2_rob.c', 'ngtcp2/lib/ngtcp2_rst.c', 'ngtcp2/lib/ngtcp2_rtb.c', + 'ngtcp2/lib/ngtcp2_settings.c', 'ngtcp2/lib/ngtcp2_str.c', 'ngtcp2/lib/ngtcp2_strm.c', + 'ngtcp2/lib/ngtcp2_transport_params.c', 'ngtcp2/lib/ngtcp2_unreachable.c', 'ngtcp2/lib/ngtcp2_vec.c', 'ngtcp2/lib/ngtcp2_version.c', @@ -120,7 +122,7 @@ }, }, }], - ['OS=="linux" or OS=="android"', { + ['OS=="linux" or OS=="android" or OS=="openharmony"', { 'defines': [ 'HAVE_ARPA_INET_H', 'HAVE_NETINET_IN_H', @@ -173,7 +175,7 @@ ['OS!="win"', { 'defines': ['HAVE_UNISTD_H'] }], - ['OS=="linux" or OS=="android"', { + ['OS=="linux" or OS=="android" or OS=="openharmony"', { 'defines': [ 'HAVE_ARPA_INET_H', 'HAVE_NETINET_IN_H', diff --git a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c index 50b89110e36ff7..283063f738e2af 100644 --- a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <assert.h> #include <string.h> @@ -52,15 +52,15 @@ typedef struct ngtcp2_crypto_boringssl_cipher { } ngtcp2_crypto_boringssl_cipher; static ngtcp2_crypto_boringssl_cipher crypto_cipher_aes_128 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_128, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_128, }; static ngtcp2_crypto_boringssl_cipher crypto_cipher_aes_256 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_256, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_256, }; static ngtcp2_crypto_boringssl_cipher crypto_cipher_chacha20 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20, }; ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { @@ -175,7 +175,7 @@ static ngtcp2_crypto_ctx *crypto_ctx_cipher_id(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)crypto_cipher_id_get_hp(cipher_id); ctx->max_encryption = crypto_cipher_id_get_aead_max_encryption(cipher_id); ctx->max_decryption_failure = - crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); + crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); return ctx; } @@ -413,12 +413,12 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, AES_ecb_encrypt(sample, dest, &ctx->aes_key, 1); return 0; case NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20: -#if defined(WORDS_BIGENDIAN) +#ifdef WORDS_BIGENDIAN counter = (uint32_t)sample[0] + (uint32_t)(sample[1] << 8) + (uint32_t)(sample[2] << 16) + (uint32_t)(sample[3] << 24); -#else /* !WORDS_BIGENDIAN */ +#else /* !defined(WORDS_BIGENDIAN) */ memcpy(&counter, sample, sizeof(counter)); -#endif /* !WORDS_BIGENDIAN */ +#endif /* !defined(WORDS_BIGENDIAN) */ CRYPTO_chacha_20(dest, PLAINTEXT, sizeof(PLAINTEXT) - 1, ctx->key, sample + sizeof(counter), counter); return 0; @@ -429,17 +429,16 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); int rv; int err; if (SSL_provide_quic_data( - ssl, - ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - encryption_level), - data, datalen) != 1) { + ssl, + ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level(encryption_level), + data, datalen) != 1) { return -1; } @@ -522,7 +521,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( - enum ssl_encryption_level_t ssl_level) { + enum ssl_encryption_level_t ssl_level) { switch (ssl_level) { case ssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -540,7 +539,7 @@ ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( enum ssl_encryption_level_t ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return ssl_encryption_initial; @@ -582,7 +581,7 @@ static int set_read_secret(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); (void)cipher; if (ngtcp2_crypto_derive_and_install_rx_key(conn, NULL, NULL, NULL, level, @@ -599,7 +598,7 @@ static int set_write_secret(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); (void)cipher; if (ngtcp2_crypto_derive_and_install_tx_key(conn, NULL, NULL, NULL, level, @@ -615,7 +614,7 @@ static int add_handshake_data(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); int rv; rv = ngtcp2_conn_submit_crypto_data(conn, level, data, datalen); @@ -644,8 +643,8 @@ static int send_alert(SSL *ssl, enum ssl_encryption_level_t bssl_level, } static SSL_QUIC_METHOD quic_method = { - set_read_secret, set_write_secret, add_handshake_data, - flush_flight, send_alert, + set_read_secret, set_write_secret, add_handshake_data, + flush_flight, send_alert, }; static void crypto_boringssl_configure_context(SSL_CTX *ssl_ctx) { diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h index 06427d7a7cac70..4eaf615bd309f3 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h @@ -29,14 +29,45 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ #ifdef WIN32 # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN -# endif +# endif /* !defined(WIN32_LEAN_AND_MEAN) */ # include <ws2tcpip.h> -#endif /* WIN32 */ +#endif /* defined(WIN32) */ + +/** + * @macrosection + * + * ngtcp2 crypto library error codes + */ + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` indicates an internal error. + */ +#define NGTCP2_CRYPTO_ERR_INTERNAL -201 + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` indicates that a token + * is unreadable because it is not correctly formatted; or verifying + * the integrity protection failed. + */ +#define NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN -202 + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` indicates that a token does + * not probe the client address; or the token validity has expired; or + * it contains invalid Connection ID. + */ +#define NGTCP2_CRYPTO_ERR_VERIFY_TOKEN -203 /** * @function @@ -135,12 +166,9 @@ ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, * * This function returns 0 if it succeeds, or -1. */ -NGTCP2_EXTERN int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, - const ngtcp2_crypto_md *md, - const uint8_t *secret, - size_t secretlen, - const uint8_t *info, - size_t infolen); +NGTCP2_EXTERN int ngtcp2_crypto_hkdf_expand( + uint8_t *dest, size_t destlen, const ngtcp2_crypto_md *md, + const uint8_t *secret, size_t secretlen, const uint8_t *info, size_t infolen); /** * @function @@ -303,7 +331,7 @@ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * set negotiated AEAD and message digest algorithm. After the * successful call of this function, application can use - * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_early_crypto_ctx` + * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx` * if |level| == * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * get :type:`ngtcp2_crypto_ctx`. @@ -318,8 +346,8 @@ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( - ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, - ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); + ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, + ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); /** * @function @@ -350,7 +378,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * set negotiated AEAD and message digest algorithm. After the * successful call of this function, application can use - * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_early_crypto_ctx` + * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx` * if |level| == * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * get :type:`ngtcp2_crypto_ctx`. @@ -365,8 +393,8 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_tx_key( - ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, - ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); + ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, + ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); /** * @function @@ -405,11 +433,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_tx_key( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_update_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen); /** * @function @@ -422,11 +450,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_update_key( * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`. */ NGTCP2_EXTERN int ngtcp2_crypto_update_key_cb( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data); /** * @function @@ -514,8 +542,8 @@ ngtcp2_crypto_read_write_crypto_data(ngtcp2_conn *conn, * codes. */ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - uint64_t offset, const uint8_t *data, size_t datalen, void *user_data); + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, uint64_t offset, + const uint8_t *data, size_t datalen, void *user_data); /** * @function @@ -529,8 +557,8 @@ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_cid *cid); + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_cid *cid); /** * @macro @@ -540,7 +568,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * `ngtcp2_crypto_generate_retry_token` or * `ngtcp2_crypto_generate_regular_token`. */ -#define NGTCP2_CRYPTO_TOKEN_RAND_DATALEN 32 +#define NGTCP2_CRYPTO_TOKEN_RAND_DATALEN 16 /** * @macro @@ -550,6 +578,14 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( */ #define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY 0xb6 +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2` is the magic byte for + * Retry token generated by `ngtcp2_crypto_generate_retry_token2`. + */ +#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 0xb7 + /** * @macro * @@ -569,6 +605,17 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \ NGTCP2_CRYPTO_TOKEN_RAND_DATALEN) +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` is the maximum length of + * a token generated by `ngtcp2_crypto_generate_retry_token2`. + */ +#define NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2 \ + (/* magic = */ 1 + sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + \ + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \ + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN) + /** * @macro * @@ -595,13 +642,15 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * is a Destination Connection ID in Initial packet sent by client. * |ts| is the timestamp when the token is generated. * + * See also `ngtcp2_crypto_generate_retry_token2`. + * * This function returns the length of generated token if it succeeds, * or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); /** * @function @@ -622,10 +671,76 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token( - ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, - const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_crypto_generate_retry_token2` generates a token in the + * buffer pointed by |token| that is sent with Retry packet. The + * buffer pointed by |token| must have at least + * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` bytes long. The + * successfully generated token starts with + * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2`. |secret| of length + * |secretlen| is a keying material to generate keys to encrypt the + * token. |version| is QUIC version. |remote_addr| of length + * |remote_addrlen| is an address of client. |retry_scid| is a Source + * Connection ID chosen by server, and set in Retry packet. |odcid| + * is a Destination Connection ID in Initial packet sent by client. + * |ts| is the timestamp when the token is generated. + * + * Use this function instead of `ngtcp2_crypto_generate_retry_token` + * if more detailed error handling is required when verifying the + * token. `ngtcp2_crypto_verify_retry_token2` must be used to verify + * the token. + * + * This function returns the length of generated token if it succeeds, + * or -1. + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_crypto_verify_retry_token2` verifies Retry token stored in + * the buffer pointed by |token| of length |tokenlen|. |secret| of + * length |secretlen| is a keying material to generate keys to decrypt + * the token. |version| is QUIC version of the Initial packet that + * contains this token. |remote_addr| of length |remote_addrlen| is + * an address of client. |dcid| is a Destination Connection ID in + * Initial packet sent by client. |timeout| is the period during + * which the token is valid. |ts| is the current timestamp. When + * validation succeeds, the extracted Destination Connection ID (which + * is the Destination Connection ID in Initial packet sent by client + * that triggered Retry packet) is stored in the buffer pointed by + * |odcid|. + * + * The token must be generated by + * `ngtcp2_crypto_generate_retry_token2`. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` + * A token is badly formatted; or verifying the integrity + * protection failed. + * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` + * A token does not probe the client address; or the token + * validity has expired; or it contains invalid Connection ID. + * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` + * Internal error occurred. + */ +NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token2( + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); /** * @function @@ -644,9 +759,9 @@ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token( * or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - ngtcp2_tstamp ts); + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + ngtcp2_tstamp ts); /** * @function @@ -661,9 +776,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token( - const uint8_t *token, size_t tokenlen, const uint8_t *secret, - size_t secretlen, const ngtcp2_sockaddr *remote_addr, - ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); + const uint8_t *token, size_t tokenlen, const uint8_t *secret, + size_t secretlen, const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); /** * @function @@ -685,9 +800,9 @@ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen); /** * @function @@ -705,9 +820,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_connection_close( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen); /** * @function @@ -759,7 +874,7 @@ ngtcp2_crypto_aead_ctx_free(ngtcp2_crypto_aead_ctx *aead_ctx); * :member:`ngtcp2_callbacks.delete_crypto_aead_ctx` field. */ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_aead_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_aead_ctx *aead_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_aead_ctx *aead_ctx, void *user_data); /** * @function @@ -771,7 +886,7 @@ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_aead_ctx_cb( * :member:`ngtcp2_callbacks.delete_crypto_cipher_ctx` field. */ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_cipher_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); /** * @function @@ -813,7 +928,7 @@ typedef struct ngtcp2_crypto_conn_ref ngtcp2_crypto_conn_ref; * must return non-NULL :type:`ngtcp2_conn` object. */ typedef ngtcp2_conn *(*ngtcp2_crypto_get_conn)( - ngtcp2_crypto_conn_ref *conn_ref); + ngtcp2_crypto_conn_ref *conn_ref); /** * @struct @@ -836,6 +951,6 @@ typedef struct ngtcp2_crypto_conn_ref { #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_H */ +#endif /* !defined(NGTCP2_CRYPTO_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h index 43a3c36f03a382..89b26f0bc0e346 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @function @@ -42,7 +42,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( - enum ssl_encryption_level_t ssl_level); + enum ssl_encryption_level_t ssl_level); /** * @function @@ -53,7 +53,7 @@ ngtcp2_crypto_boringssl_from_ssl_encryption_level( */ NGTCP2_EXTERN enum ssl_encryption_level_t ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -99,6 +99,6 @@ ngtcp2_crypto_boringssl_configure_client_context(SSL_CTX *ssl_ctx); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_BORINGSSL_H */ +#endif /* !defined(NGTCP2_CRYPTO_BORINGSSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h index 61020bb3a8f376..d3f2f978e79923 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @struct @@ -79,7 +79,7 @@ ngtcp2_crypto_picotls_from_epoch(size_t epoch); * Picotls backend. */ NGTCP2_EXTERN size_t ngtcp2_crypto_picotls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -160,7 +160,7 @@ ngtcp2_crypto_picotls_configure_client_context(ptls_context_t *ctx); * It returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_configure_server_session( - ngtcp2_crypto_picotls_ctx *cptls); + ngtcp2_crypto_picotls_ctx *cptls); /** * @function @@ -224,8 +224,8 @@ ngtcp2_crypto_picotls_deconfigure_session(ngtcp2_crypto_picotls_ctx *cptls); * :macro:`NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1`. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collect_extension( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - uint16_t type); + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + uint16_t type); /** * @function @@ -236,11 +236,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collect_extension( * extensions are ignored. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collected_extensions( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - ptls_raw_extension_t *extensions); + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + ptls_raw_extension_t *extensions); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_PICOTLS_H */ +#endif /* !defined(NGTCP2_CRYPTO_PICOTLS_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h index b25c13b81c8b18..22e3eda0c4160a 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @macrosection @@ -70,7 +70,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( - OSSL_ENCRYPTION_LEVEL ossl_level); + OSSL_ENCRYPTION_LEVEL ossl_level); /** * @function @@ -81,7 +81,7 @@ ngtcp2_crypto_quictls_from_ossl_encryption_level( */ NGTCP2_EXTERN OSSL_ENCRYPTION_LEVEL ngtcp2_crypto_quictls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -142,6 +142,6 @@ NGTCP2_EXTERN int ngtcp2_crypto_quictls_init(void); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_QUICTLS_H */ +#endif /* !defined(NGTCP2_CRYPTO_QUICTLS_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h index e1d621adce94d8..e95056de5926a9 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h @@ -33,7 +33,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @function @@ -44,7 +44,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( - WOLFSSL_ENCRYPTION_LEVEL wolfssl_level); + WOLFSSL_ENCRYPTION_LEVEL wolfssl_level); /** * @function @@ -55,7 +55,7 @@ ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( */ NGTCP2_EXTERN WOLFSSL_ENCRYPTION_LEVEL ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -101,6 +101,6 @@ ngtcp2_crypto_wolfssl_configure_client_context(WOLFSSL_CTX *ssl_ctx); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_WOLFSSL_H */ +#endif /* !defined(NGTCP2_CRYPTO_WOLFSSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c index 35bfb7b2f8fa19..98ebf9e876c053 100644 --- a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c +++ b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <assert.h> #include <string.h> @@ -79,7 +79,7 @@ crypto_cipher_suite_get_aead_max_encryption(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return NGTCP2_CRYPTO_MAX_ENCRYPTION_CHACHA20_POLY1305; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return 0; } @@ -95,7 +95,7 @@ crypto_cipher_suite_get_aead_max_decryption_failure(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return NGTCP2_CRYPTO_MAX_DECRYPTION_FAILURE_CHACHA20_POLY1305; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return 0; } @@ -114,7 +114,7 @@ crypto_cipher_suite_get_hp(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return &ptls_openssl_chacha20; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return NULL; } @@ -124,8 +124,8 @@ static int supported_cipher_suite(ptls_cipher_suite_t *cs) { cs->aead == &ptls_openssl_aes256gcm #ifdef PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 || cs->aead == &ptls_openssl_chacha20poly1305 -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ - ; +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ + ; } ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, @@ -146,7 +146,7 @@ ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)crypto_cipher_suite_get_hp(cs); ctx->max_encryption = crypto_cipher_suite_get_aead_max_encryption(cs); ctx->max_decryption_failure = - crypto_cipher_suite_get_aead_max_decryption_failure(cs); + crypto_cipher_suite_get_aead_max_decryption_failure(cs); return ctx; } @@ -329,19 +329,22 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, const uint8_t *nonce, size_t noncelen, const uint8_t *aad, size_t aadlen) { ptls_aead_context_t *actx = aead_ctx->native_handle; + size_t nwrite; (void)aead; ptls_aead_xor_iv(actx, nonce, noncelen); - if (ptls_aead_decrypt(actx, dest, ciphertext, ciphertextlen, 0, aad, - aadlen) == SIZE_MAX) { - return -1; - } + nwrite = + ptls_aead_decrypt(actx, dest, ciphertext, ciphertextlen, 0, aad, aadlen); /* zero-out static iv once again */ ptls_aead_xor_iv(actx, nonce, noncelen); + if (nwrite == SIZE_MAX) { + return -1; + } + return 0; } @@ -360,13 +363,13 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { ngtcp2_crypto_picotls_ctx *cptls = ngtcp2_conn_get_tls_native_handle(conn); ptls_buffer_t sendbuf; size_t epoch_offsets[5] = {0}; size_t epoch = - ngtcp2_crypto_picotls_from_ngtcp2_encryption_level(encryption_level); + ngtcp2_crypto_picotls_from_ngtcp2_encryption_level(encryption_level); size_t epoch_datalen; size_t i; int rv; @@ -388,7 +391,7 @@ int ngtcp2_crypto_read_write_crypto_data( if (!ngtcp2_conn_is_server(conn) && cptls->handshake_properties.client.early_data_acceptance == - PTLS_EARLY_DATA_REJECTED) { + PTLS_EARLY_DATA_REJECTED) { rv = ngtcp2_conn_tls_early_data_rejected(conn); if (rv != 0) { rv = -1; @@ -405,8 +408,8 @@ int ngtcp2_crypto_read_write_crypto_data( assert(i != 1); if (ngtcp2_conn_submit_crypto_data( - conn, ngtcp2_crypto_picotls_from_epoch(i), - sendbuf.base + epoch_offsets[i], epoch_datalen) != 0) { + conn, ngtcp2_crypto_picotls_from_epoch(i), + sendbuf.base + epoch_offsets[i], epoch_datalen) != 0) { rv = -1; goto fin; } @@ -463,7 +466,7 @@ ngtcp2_encryption_level ngtcp2_crypto_picotls_from_epoch(size_t epoch) { } size_t ngtcp2_crypto_picotls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return 0; @@ -532,8 +535,8 @@ static int set_additional_extensions(ptls_handshake_properties_t *hsprops, } int ngtcp2_crypto_picotls_collect_extension( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - uint16_t type) { + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + uint16_t type) { (void)ptls; (void)properties; @@ -541,8 +544,8 @@ int ngtcp2_crypto_picotls_collect_extension( } int ngtcp2_crypto_picotls_collected_extensions( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - ptls_raw_extension_t *extensions) { + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + ptls_raw_extension_t *extensions) { ngtcp2_crypto_conn_ref *conn_ref; ngtcp2_conn *conn; int rv; @@ -558,7 +561,7 @@ int ngtcp2_crypto_picotls_collected_extensions( conn = conn_ref->get_conn(conn_ref); rv = ngtcp2_conn_decode_and_set_remote_transport_params( - conn, extensions->data.base, extensions->data.len); + conn, extensions->data.base, extensions->data.len); if (rv != 0) { ngtcp2_conn_set_tls_error(conn, rv); return -1; @@ -613,7 +616,7 @@ static int update_traffic_key_server_cb(ptls_update_traffic_key_t *self, } static ptls_update_traffic_key_t update_traffic_key_server = { - update_traffic_key_server_cb, + update_traffic_key_server_cb, }; static int update_traffic_key_cb(ptls_update_traffic_key_t *self, ptls_t *ptls, @@ -661,7 +664,7 @@ int ngtcp2_crypto_picotls_configure_client_context(ptls_context_t *ctx) { } int ngtcp2_crypto_picotls_configure_server_session( - ngtcp2_crypto_picotls_ctx *cptls) { + ngtcp2_crypto_picotls_ctx *cptls) { ptls_handshake_properties_t *hsprops = &cptls->handshake_properties; hsprops->collect_extension = ngtcp2_crypto_picotls_collect_extension; @@ -671,7 +674,7 @@ int ngtcp2_crypto_picotls_configure_server_session( } int ngtcp2_crypto_picotls_configure_client_session( - ngtcp2_crypto_picotls_ctx *cptls, ngtcp2_conn *conn) { + ngtcp2_crypto_picotls_ctx *cptls, ngtcp2_conn *conn) { ptls_handshake_properties_t *hsprops = &cptls->handshake_properties; hsprops->client.max_early_data_size = calloc(1, sizeof(size_t)); @@ -692,7 +695,7 @@ int ngtcp2_crypto_picotls_configure_client_session( } void ngtcp2_crypto_picotls_deconfigure_session( - ngtcp2_crypto_picotls_ctx *cptls) { + ngtcp2_crypto_picotls_ctx *cptls) { ptls_handshake_properties_t *hsprops; ptls_raw_extension_t *exts; diff --git a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c index 330ca687b44666..592e5a86535356 100644 --- a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c +++ b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <assert.h> @@ -339,7 +339,7 @@ static ngtcp2_crypto_ctx *crypto_ctx_cipher_id(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)crypto_cipher_id_get_hp(cipher_id); ctx->max_encryption = crypto_cipher_id_get_aead_max_encryption(cipher_id); ctx->max_decryption_failure = - crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); + crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); return ctx; } @@ -527,14 +527,14 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); int mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY; OSSL_PARAM params[] = { - OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, - saltlen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, + saltlen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -584,14 +584,14 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); int mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY; OSSL_PARAM params[] = { - OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, - infolen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, + infolen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -639,15 +639,15 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, EVP_KDF *kdf = crypto_kdf_hkdf(); EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); OSSL_PARAM params[] = { - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, - saltlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, - infolen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, + saltlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, + infolen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -672,7 +672,7 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, if (EVP_PKEY_derive_init(pctx) != 1 || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) != - 1 || + 1 || EVP_PKEY_CTX_set_hkdf_md(pctx, prf) != 1 || EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt, (int)saltlen) != 1 || EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, (int)secretlen) != 1 || @@ -699,9 +699,9 @@ int ngtcp2_crypto_encrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int len; #if OPENSSL_VERSION_NUMBER >= 0x30000000L OSSL_PARAM params[] = { - OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, - dest + plaintextlen, taglen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, + dest + plaintextlen, taglen), + OSSL_PARAM_construct_end(), }; #endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */ @@ -794,16 +794,16 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); int rv; int err; if (SSL_provide_quic_data( - ssl, - ngtcp2_crypto_quictls_from_ngtcp2_encryption_level(encryption_level), - data, datalen) != 1) { + ssl, + ngtcp2_crypto_quictls_from_ngtcp2_encryption_level(encryption_level), + data, datalen) != 1) { return -1; } @@ -874,7 +874,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( - OSSL_ENCRYPTION_LEVEL ossl_level) { + OSSL_ENCRYPTION_LEVEL ossl_level) { switch (ossl_level) { case ssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -892,7 +892,7 @@ ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( OSSL_ENCRYPTION_LEVEL ngtcp2_crypto_quictls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return ssl_encryption_initial; @@ -934,7 +934,7 @@ static int set_encryption_secrets(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); + ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); if (rx_secret && ngtcp2_crypto_derive_and_install_rx_key(conn, NULL, NULL, NULL, level, @@ -956,7 +956,7 @@ static int add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); + ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); int rv; rv = ngtcp2_conn_submit_crypto_data(conn, level, data, datalen); @@ -973,8 +973,7 @@ static int flush_flight(SSL *ssl) { return 1; } -static int send_alert(SSL *ssl, enum ssl_encryption_level_t level, - uint8_t alert) { +static int send_alert(SSL *ssl, OSSL_ENCRYPTION_LEVEL level, uint8_t alert) { ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); (void)level; @@ -985,14 +984,14 @@ static int send_alert(SSL *ssl, enum ssl_encryption_level_t level, } static SSL_QUIC_METHOD quic_method = { - set_encryption_secrets, - add_handshake_data, - flush_flight, - send_alert, + set_encryption_secrets, + add_handshake_data, + flush_flight, + send_alert, #ifdef LIBRESSL_VERSION_NUMBER - NULL, - NULL, -#endif /* LIBRESSL_VERSION_NUMBER */ + NULL, + NULL, +#endif /* defined(LIBRESSL_VERSION_NUMBER) */ }; static void crypto_quictls_configure_context(SSL_CTX *ssl_ctx) { diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.c b/deps/ngtcp2/ngtcp2/crypto/shared.c index 162094a375cb8b..98cd4de7e8097d 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.c +++ b/deps/ngtcp2/ngtcp2/crypto/shared.c @@ -27,9 +27,9 @@ #ifdef WIN32 # include <winsock2.h> # include <ws2tcpip.h> -#else +#elif defined(HAVE_NETINET_IN_H) # include <netinet/in.h> -#endif +#endif /* defined(HAVE_NETINET_IN_H) */ #include <string.h> #include <assert.h> @@ -110,13 +110,11 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, } if (ngtcp2_crypto_hkdf_expand_label( - client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, - initial_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, - sizeof(CLABEL) - 1) != 0 || + client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, sizeof(CLABEL) - 1) != 0 || ngtcp2_crypto_hkdf_expand_label( - server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, - initial_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, - sizeof(SLABEL) - 1) != 0) { + server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, sizeof(SLABEL) - 1) != 0) { return -1; } @@ -125,13 +123,13 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, size_t ngtcp2_crypto_packet_protection_ivlen(const ngtcp2_crypto_aead *aead) { size_t noncelen = ngtcp2_crypto_aead_noncelen(aead); - return ngtcp2_max(8, noncelen); + return ngtcp2_max_size(8, noncelen); } int ngtcp2_crypto_derive_packet_protection_key( - uint8_t *key, uint8_t *iv, uint8_t *hp_key, uint32_t version, - const ngtcp2_crypto_aead *aead, const ngtcp2_crypto_md *md, - const uint8_t *secret, size_t secretlen) { + uint8_t *key, uint8_t *iv, uint8_t *hp_key, uint32_t version, + const ngtcp2_crypto_aead *aead, const ngtcp2_crypto_md *md, + const uint8_t *secret, size_t secretlen) { static const uint8_t KEY_LABEL_V1[] = "quic key"; static const uint8_t IV_LABEL_V1[] = "quic iv"; static const uint8_t HP_KEY_LABEL_V1[] = "quic hp"; @@ -305,8 +303,8 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - rv = ngtcp2_conn_install_rx_handshake_key(conn, &aead_ctx, iv, ivlen, - &hp_ctx); + rv = + ngtcp2_conn_install_rx_handshake_key(conn, &aead_ctx, iv, ivlen, &hp_ctx); if (rv != 0) { goto fail; } @@ -455,8 +453,8 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - rv = ngtcp2_conn_install_tx_handshake_key(conn, &aead_ctx, iv, ivlen, - &hp_ctx); + rv = + ngtcp2_conn_install_tx_handshake_key(conn, &aead_ctx, iv, ivlen, &hp_ctx); if (rv != 0) { goto fail; } @@ -489,10 +487,10 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } int ngtcp2_crypto_derive_and_install_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, - uint8_t *rx_hp_key, uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, - uint32_t version, const ngtcp2_cid *client_dcid) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp_key, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, uint32_t version, + const ngtcp2_cid *client_dcid) { uint8_t rx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -548,21 +546,20 @@ int ngtcp2_crypto_derive_and_install_initial_key( ngtcp2_conn_set_initial_crypto_ctx(conn, &ctx); if (ngtcp2_crypto_derive_initial_secrets( - rx_secret, tx_secret, initial_secret, version, client_dcid, - server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != - 0) { + rx_secret, tx_secret, initial_secret, version, client_dcid, + server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, rx_hp_key, version, &ctx.aead, &ctx.md, rx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + rx_key, rx_iv, rx_hp_key, version, &ctx.aead, &ctx.md, rx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -631,10 +628,10 @@ int ngtcp2_crypto_derive_and_install_initial_key( } int ngtcp2_crypto_derive_and_install_vneg_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, - uint8_t *rx_hp_key, uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, - uint32_t version, const ngtcp2_cid *client_dcid) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp_key, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, uint32_t version, + const ngtcp2_cid *client_dcid) { uint8_t rx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -682,21 +679,20 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } if (ngtcp2_crypto_derive_initial_secrets( - rx_secret, tx_secret, initial_secret, version, client_dcid, - server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != - 0) { + rx_secret, tx_secret, initial_secret, version, client_dcid, + server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, rx_hp_key, version, &ctx->aead, &ctx->md, rx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + rx_key, rx_iv, rx_hp_key, version, &ctx->aead, &ctx->md, rx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx->aead, &ctx->md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx->aead, &ctx->md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -721,8 +717,8 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } rv = ngtcp2_conn_install_vneg_initial_key( - conn, version, &rx_aead_ctx, rx_iv, &rx_hp_ctx, &tx_aead_ctx, tx_iv, - &tx_hp_ctx, NGTCP2_CRYPTO_INITIAL_IVLEN); + conn, version, &rx_aead_ctx, rx_iv, &rx_hp_ctx, &tx_aead_ctx, tx_iv, + &tx_hp_ctx, NGTCP2_CRYPTO_INITIAL_IVLEN); if (rv != 0) { goto fail; } @@ -739,11 +735,11 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } int ngtcp2_crypto_update_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen) { const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_crypto_ctx(conn); const ngtcp2_crypto_aead *aead = &ctx->aead; const ngtcp2_crypto_md *md = &ctx->md; @@ -756,7 +752,7 @@ int ngtcp2_crypto_update_key( } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, NULL, version, aead, md, rx_secret, secretlen) != 0) { + rx_key, rx_iv, NULL, version, aead, md, rx_secret, secretlen) != 0) { return -1; } @@ -766,7 +762,7 @@ int ngtcp2_crypto_update_key( } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, NULL, version, aead, md, tx_secret, secretlen) != 0) { + tx_key, tx_iv, NULL, version, aead, md, tx_secret, secretlen) != 0) { return -1; } @@ -819,20 +815,19 @@ int ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_update_key_cb( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data) { uint8_t rx_key[64]; uint8_t tx_key[64]; (void)conn; (void)user_data; - if (ngtcp2_crypto_update_key(conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, - rx_iv, tx_aead_ctx, tx_key, tx_iv, - current_rx_secret, current_tx_secret, - secretlen) != 0) { + if (ngtcp2_crypto_update_key( + conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, rx_iv, tx_aead_ctx, + tx_key, tx_iv, current_rx_secret, current_tx_secret, secretlen) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } return 0; @@ -920,13 +915,14 @@ static size_t crypto_generate_retry_token_aad(uint8_t *dest, uint32_t version, static const uint8_t retry_token_info_prefix[] = "retry_token"; ngtcp2_ssize ngtcp2_crypto_generate_retry_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { - uint8_t plaintext[NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN]; + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { + uint8_t + plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead aead; @@ -934,7 +930,7 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( ngtcp2_crypto_aead_ctx aead_ctx; size_t plaintextlen; uint8_t - aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; + aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; size_t aadlen; uint8_t *p = plaintext; ngtcp2_tstamp ts_be = ngtcp2_htonl64(ts); @@ -962,8 +958,8 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); - assert(sizeof(key) >= keylen); - assert(sizeof(iv) >= ivlen); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, sizeof(rand_data), @@ -999,21 +995,21 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( } int ngtcp2_crypto_verify_retry_token( - ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, - const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { uint8_t - plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; - uint8_t key[32]; - uint8_t iv[32]; + plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead_ctx aead_ctx; ngtcp2_crypto_aead aead; ngtcp2_crypto_md md; uint8_t - aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; + aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; size_t aadlen; const uint8_t *rand_data; const uint8_t *ciphertext; @@ -1039,6 +1035,9 @@ int ngtcp2_crypto_verify_retry_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix, @@ -1081,6 +1080,206 @@ int ngtcp2_crypto_verify_retry_token( return 0; } +static size_t crypto_generate_retry_token_aad2(uint8_t *dest, uint32_t version, + const ngtcp2_cid *retry_scid) { + uint8_t *p = dest; + + version = ngtcp2_htonl(version); + memcpy(p, &version, sizeof(version)); + p += sizeof(version); + memcpy(p, retry_scid->data, retry_scid->datalen); + p += retry_scid->datalen; + + return (size_t)(p - dest); +} + +static const uint8_t retry_token_info_prefix2[] = "retry_token2"; + +ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { + uint8_t plaintext[sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; + uint8_t key[16]; + uint8_t iv[12]; + size_t keylen; + size_t ivlen; + ngtcp2_crypto_aead aead; + ngtcp2_crypto_md md; + ngtcp2_crypto_aead_ctx aead_ctx; + uint8_t aad[sizeof(version) + NGTCP2_MAX_CIDLEN]; + size_t aadlen; + uint8_t *p = plaintext; + ngtcp2_tstamp ts_be = ngtcp2_htonl64(ts); + int rv; + + assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); + + memset(plaintext, 0, sizeof(plaintext)); + + memcpy(p, remote_addr, (size_t)remote_addrlen); + p += sizeof(ngtcp2_sockaddr_union); + *p++ = (uint8_t)odcid->datalen; + memcpy(p, odcid->data, odcid->datalen); + p += NGTCP2_MAX_CIDLEN; + memcpy(p, &ts_be, sizeof(ts_be)); + + assert((size_t)(p + sizeof(ts_be) - plaintext) == sizeof(plaintext)); + + if (ngtcp2_crypto_random(rand_data, sizeof(rand_data)) != 0) { + return -1; + } + + ngtcp2_crypto_aead_aes_128_gcm(&aead); + ngtcp2_crypto_md_sha256(&md); + + keylen = ngtcp2_crypto_aead_keylen(&aead); + ivlen = ngtcp2_crypto_aead_noncelen(&aead); + + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, + rand_data, sizeof(rand_data), + retry_token_info_prefix2, + sizeof(retry_token_info_prefix2) - 1) != 0) { + return -1; + } + + aadlen = crypto_generate_retry_token_aad2(aad, version, retry_scid); + + p = token; + *p++ = NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2; + + if (ngtcp2_crypto_aead_ctx_encrypt_init(&aead_ctx, &aead, key, ivlen) != 0) { + return -1; + } + + rv = ngtcp2_crypto_encrypt(p, &aead, &aead_ctx, plaintext, sizeof(plaintext), + iv, ivlen, aad, aadlen); + + ngtcp2_crypto_aead_ctx_free(&aead_ctx); + + if (rv != 0) { + return -1; + } + + p += sizeof(plaintext) + aead.max_overhead; + memcpy(p, rand_data, sizeof(rand_data)); + p += sizeof(rand_data); + + return p - token; +} + +int ngtcp2_crypto_verify_retry_token2( + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + uint8_t plaintext[sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t key[16]; + uint8_t iv[12]; + size_t keylen; + size_t ivlen; + ngtcp2_crypto_aead_ctx aead_ctx; + ngtcp2_crypto_aead aead; + ngtcp2_crypto_md md; + uint8_t aad[sizeof(version) + NGTCP2_MAX_CIDLEN]; + size_t aadlen; + const uint8_t *rand_data; + const uint8_t *ciphertext; + size_t ciphertextlen; + size_t cil; + int rv; + ngtcp2_tstamp gen_ts; + ngtcp2_sockaddr_union addr; + size_t addrlen; + uint8_t *p; + + assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); + + if (tokenlen != NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2 || + token[0] != NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2) { + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; + } + + rand_data = token + tokenlen - NGTCP2_CRYPTO_TOKEN_RAND_DATALEN; + ciphertext = token + 1; + ciphertextlen = (size_t)(rand_data - ciphertext); + + ngtcp2_crypto_aead_aes_128_gcm(&aead); + ngtcp2_crypto_md_sha256(&md); + + keylen = ngtcp2_crypto_aead_keylen(&aead); + ivlen = ngtcp2_crypto_aead_noncelen(&aead); + + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, + rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, + retry_token_info_prefix2, + sizeof(retry_token_info_prefix2) - 1) != 0) { + return NGTCP2_CRYPTO_ERR_INTERNAL; + } + + aadlen = crypto_generate_retry_token_aad2(aad, version, dcid); + + if (ngtcp2_crypto_aead_ctx_decrypt_init(&aead_ctx, &aead, key, ivlen) != 0) { + return NGTCP2_CRYPTO_ERR_INTERNAL; + } + + rv = ngtcp2_crypto_decrypt(plaintext, &aead, &aead_ctx, ciphertext, + ciphertextlen, iv, ivlen, aad, aadlen); + + ngtcp2_crypto_aead_ctx_free(&aead_ctx); + + if (rv != 0) { + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; + } + + p = plaintext; + + memcpy(&addr, p, sizeof(addr)); + + switch (addr.sa.sa_family) { + case NGTCP2_AF_INET: + addrlen = sizeof(ngtcp2_sockaddr_in); + break; + case NGTCP2_AF_INET6: + addrlen = sizeof(ngtcp2_sockaddr_in6); + break; + default: + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + if (addrlen != (size_t)remote_addrlen || + memcmp(&addr, remote_addr, addrlen) != 0) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + p += sizeof(addr); + cil = *p++; + + if (cil != 0 && (cil < NGTCP2_MIN_CIDLEN || cil > NGTCP2_MAX_CIDLEN)) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + memcpy(&gen_ts, p + NGTCP2_MAX_CIDLEN, sizeof(gen_ts)); + + gen_ts = ngtcp2_ntohl64(gen_ts); + if (gen_ts + timeout <= ts) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + ngtcp2_cid_init(odcid, p, cil); + + return 0; +} + static size_t crypto_generate_regular_token_aad(uint8_t *dest, const ngtcp2_sockaddr *sa) { const uint8_t *addr; @@ -1093,7 +1292,7 @@ static size_t crypto_generate_regular_token_aad(uint8_t *dest, break; case NGTCP2_AF_INET6: addr = - (const uint8_t *)&((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr; + (const uint8_t *)&((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr; addrlen = sizeof(((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr); break; default: @@ -1109,13 +1308,13 @@ static size_t crypto_generate_regular_token_aad(uint8_t *dest, static const uint8_t regular_token_info_prefix[] = "regular_token"; ngtcp2_ssize ngtcp2_crypto_generate_regular_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - ngtcp2_tstamp ts) { + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + ngtcp2_tstamp ts) { uint8_t plaintext[sizeof(ngtcp2_tstamp)]; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead aead; @@ -1144,8 +1343,8 @@ ngtcp2_ssize ngtcp2_crypto_generate_regular_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); - assert(sizeof(key) >= keylen); - assert(sizeof(iv) >= ivlen); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, sizeof(rand_data), @@ -1186,8 +1385,8 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, ngtcp2_duration timeout, ngtcp2_tstamp ts) { uint8_t plaintext[sizeof(ngtcp2_tstamp)]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead_ctx aead_ctx; @@ -1217,6 +1416,9 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, regular_token_info_prefix, @@ -1250,9 +1452,9 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, } ngtcp2_ssize ngtcp2_crypto_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen) { uint8_t rx_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -1273,8 +1475,8 @@ ngtcp2_ssize ngtcp2_crypto_write_connection_close( } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -1290,9 +1492,9 @@ ngtcp2_ssize ngtcp2_crypto_write_connection_close( } spktlen = ngtcp2_pkt_write_connection_close( - dest, destlen, version, dcid, scid, error_code, reason, reasonlen, - ngtcp2_crypto_encrypt_cb, &ctx.aead, &aead_ctx, tx_iv, - ngtcp2_crypto_hp_mask_cb, &ctx.hp, &hp_ctx); + dest, destlen, version, dcid, scid, error_code, reason, reasonlen, + ngtcp2_crypto_encrypt_cb, &ctx.aead, &aead_ctx, tx_iv, + ngtcp2_crypto_hp_mask_cb, &ctx.hp, &hp_ctx); if (spktlen < 0) { spktlen = -1; } @@ -1352,8 +1554,8 @@ int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn, void *user_data) { (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1362,7 +1564,7 @@ int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn, void *user_data) { } if (ngtcp2_crypto_read_write_crypto_data( - conn, NGTCP2_ENCRYPTION_LEVEL_INITIAL, NULL, 0) != 0) { + conn, NGTCP2_ENCRYPTION_LEVEL_INITIAL, NULL, 0) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1374,8 +1576,8 @@ int ngtcp2_crypto_recv_retry_cb(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), &hd->scid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), &hd->scid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1388,8 +1590,8 @@ int ngtcp2_crypto_recv_client_initial_cb(ngtcp2_conn *conn, (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1402,8 +1604,8 @@ int ngtcp2_crypto_version_negotiation_cb(ngtcp2_conn *conn, uint32_t version, (void)user_data; if (ngtcp2_crypto_derive_and_install_vneg_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, version, - client_dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, version, + client_dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1420,7 +1622,7 @@ void ngtcp2_crypto_delete_crypto_aead_ctx_cb(ngtcp2_conn *conn, } void ngtcp2_crypto_delete_crypto_cipher_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data) { + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data) { (void)conn; (void)user_data; diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.h b/deps/ngtcp2/ngtcp2/crypto/shared.h index d69fd21212d7d2..34158d3d02dbc0 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.h +++ b/deps/ngtcp2/ngtcp2/crypto/shared.h @@ -22,12 +22,12 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef NGTCP2_SHARED_H -#define NGTCP2_SHARED_H +#ifndef SHARED_H +#define SHARED_H #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2_crypto.h> @@ -286,10 +286,10 @@ int ngtcp2_crypto_set_remote_transport_params(ngtcp2_conn *conn, void *tls); * This function returns 0 if it succeeds, or -1. */ int ngtcp2_crypto_derive_and_install_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, - uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, - const ngtcp2_cid *client_dcid); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, + const ngtcp2_cid *client_dcid); /** * @function @@ -337,10 +337,10 @@ int ngtcp2_crypto_derive_and_install_initial_key( * This function returns 0 if it succeeds, or -1. */ int ngtcp2_crypto_derive_and_install_vneg_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, - uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, - const ngtcp2_cid *client_dcid); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, + const ngtcp2_cid *client_dcid); /** * @function @@ -394,4 +394,4 @@ int ngtcp2_crypto_hkdf_expand_label(uint8_t *dest, size_t destlen, const uint8_t *secret, size_t secretlen, const uint8_t *label, size_t labellen); -#endif /* NGTCP2_SHARED_H */ +#endif /* !defined(SHARED_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c index 2b7b5321863915..bc9d9d84a862c5 100644 --- a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <assert.h> @@ -39,9 +39,9 @@ #define PRINTF_DEBUG 0 #if PRINTF_DEBUG # define DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__) -#else +#else /* !PRINTF_DEBUG */ # define DEBUG_MSG(...) (void)0 -#endif +#endif /* !PRINTF_DEBUG */ ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { return ngtcp2_crypto_aead_init(aead, (void *)wolfSSL_EVP_aes_128_gcm()); @@ -65,7 +65,7 @@ ngtcp2_crypto_aead *ngtcp2_crypto_aead_init(ngtcp2_crypto_aead *aead, void *aead_native_handle) { aead->native_handle = aead_native_handle; aead->max_overhead = wolfSSL_quic_get_aead_tag_len( - (const WOLFSSL_EVP_CIPHER *)(aead_native_handle)); + (const WOLFSSL_EVP_CIPHER *)(aead_native_handle)); return aead; } @@ -124,7 +124,7 @@ ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)wolfSSL_quic_get_hp(ssl); ctx->max_encryption = crypto_aead_get_aead_max_encryption(aead); ctx->max_decryption_failure = - crypto_aead_get_aead_max_decryption_failure(aead); + crypto_aead_get_aead_max_decryption_failure(aead); return ctx; } @@ -203,7 +203,7 @@ int ngtcp2_crypto_cipher_ctx_encrypt_init(ngtcp2_crypto_cipher_ctx *cipher_ctx, WOLFSSL_EVP_CIPHER_CTX *actx; actx = - wolfSSL_quic_crypt_new(cipher->native_handle, key, NULL, /* encrypt */ 1); + wolfSSL_quic_crypt_new(cipher->native_handle, key, NULL, /* encrypt */ 1); if (actx == NULL) { return -1; } @@ -279,7 +279,6 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, if (wolfSSL_quic_aead_decrypt(dest, aead_ctx->native_handle, ciphertext, ciphertextlen, nonce, aad, aadlen) != WOLFSSL_SUCCESS) { - DEBUG_MSG("WOLFSSL: decrypt FAILED\n"); return -1; } @@ -296,11 +295,11 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, (void)hp; if (wolfSSL_EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) != - WOLFSSL_SUCCESS || + WOLFSSL_SUCCESS || wolfSSL_EVP_CipherUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) != WOLFSSL_SUCCESS || wolfSSL_EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len) != - WOLFSSL_SUCCESS) { + WOLFSSL_SUCCESS) { DEBUG_MSG("WOLFSSL: hp_mask FAILED\n"); return -1; } @@ -309,11 +308,11 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { WOLFSSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); WOLFSSL_ENCRYPTION_LEVEL level = - ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level(encryption_level); + ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level(encryption_level); int rv; int err; @@ -397,7 +396,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( - WOLFSSL_ENCRYPTION_LEVEL wolfssl_level) { + WOLFSSL_ENCRYPTION_LEVEL wolfssl_level) { switch (wolfssl_level) { case wolfssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -415,7 +414,7 @@ ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( WOLFSSL_ENCRYPTION_LEVEL ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return wolfssl_encryption_initial; @@ -458,7 +457,7 @@ static int set_encryption_secrets(WOLFSSL *ssl, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); + ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); DEBUG_MSG("WOLFSSL: set encryption secrets, level=%d, rxlen=%lu, txlen=%lu\n", wolfssl_level, rx_secret ? secretlen : 0, @@ -484,7 +483,7 @@ static int add_handshake_data(WOLFSSL *ssl, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); + ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); int rv; DEBUG_MSG("WOLFSSL: add handshake data, level=%d len=%lu\n", wolfssl_level, @@ -516,10 +515,10 @@ static int send_alert(WOLFSSL *ssl, enum wolfssl_encryption_level_t level, } static WOLFSSL_QUIC_METHOD quic_method = { - set_encryption_secrets, - add_handshake_data, - flush_flight, - send_alert, + set_encryption_secrets, + add_handshake_data, + flush_flight, + send_alert, }; static void crypto_wolfssl_configure_context(WOLFSSL_CTX *ssl_ctx) { @@ -532,7 +531,7 @@ int ngtcp2_crypto_wolfssl_configure_server_context(WOLFSSL_CTX *ssl_ctx) { crypto_wolfssl_configure_context(ssl_ctx); #if PRINTF_DEBUG wolfSSL_Debugging_ON(); -#endif +#endif /* PRINTF_DEBUG */ return 0; } @@ -541,6 +540,6 @@ int ngtcp2_crypto_wolfssl_configure_client_context(WOLFSSL_CTX *ssl_ctx) { wolfSSL_CTX_UseSessionTicket(ssl_ctx); #if PRINTF_DEBUG wolfSSL_Debugging_ON(); -#endif +#endif /* PRINTF_DEBUG */ return 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h index 72c8142a5a5aa7..d2a2fe1fe1be0d 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h @@ -30,12 +30,12 @@ libcurl) */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 -#endif +#endif /* (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) */ #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4324) -#endif +#endif /* defined(_MSC_VER) */ #include <stdlib.h> #if defined(_MSC_VER) && (_MSC_VER < 1800) @@ -43,9 +43,9 @@ compliant. See compiler macros and version number in https://sourceforge.net/p/predef/wiki/Compilers/ */ # include <stdint.h> -#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#else /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ # include <inttypes.h> -#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#endif /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ #include <sys/types.h> #include <stdarg.h> #include <stddef.h> @@ -54,13 +54,13 @@ # ifdef WIN32 # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN -# endif /* WIN32_LEAN_AND_MEAN */ +# endif /* !defined(WIN32_LEAN_AND_MEAN) */ # include <ws2tcpip.h> -# else /* !WIN32 */ +# else /* !defined(WIN32) */ # include <sys/socket.h> # include <netinet/in.h> -# endif /* !WIN32 */ -#endif /* NGTCP2_USE_GENERIC_SOCKADDR */ +# endif /* !defined(WIN32) */ +#endif /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ #include <ngtcp2/version.h> @@ -69,26 +69,26 @@ #elif defined(WIN32) # ifdef BUILDING_NGTCP2 # define NGTCP2_EXTERN __declspec(dllexport) -# else /* !BUILDING_NGTCP2 */ +# else /* !defined(BUILDING_NGTCP2) */ # define NGTCP2_EXTERN __declspec(dllimport) -# endif /* !BUILDING_NGTCP2 */ -#else /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGTCP2) */ +#else /* !(defined(NGTCP2_STATICLIB) || defined(WIN32)) */ # ifdef BUILDING_NGTCP2 # define NGTCP2_EXTERN __attribute__((visibility("default"))) -# else /* !BUILDING_NGTCP2 */ +# else /* !defined(BUILDING_NGTCP2) */ # define NGTCP2_EXTERN -# endif /* !BUILDING_NGTCP2 */ -#endif /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGTCP2) */ +#endif /* !(defined(NGTCP2_STATICLIB) || defined(WIN32)) */ #ifdef _MSC_VER # define NGTCP2_ALIGN(N) __declspec(align(N)) -#else /* !_MSC_VER */ +#else /* !defined(_MSC_VER) */ # define NGTCP2_ALIGN(N) __attribute__((aligned(N))) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @typedef @@ -167,8 +167,12 @@ typedef void *(*ngtcp2_realloc)(void *ptr, size_t size, void *user_data); * } * * void conn_new() { - * ngtcp2_mem mem = {NULL, my_malloc_cb, my_free_cb, my_calloc_cb, - * my_realloc_cb}; + * ngtcp2_mem mem = { + * .malloc = my_malloc_cb, + * .free = my_free_cb, + * .calloc = my_calloc_cb, + * .realloc = my_realloc_cb, + * }; * * ... * } @@ -1229,11 +1233,11 @@ typedef struct ngtcp2_pkt_stateless_reset { #ifdef NGTCP2_USE_GENERIC_SOCKADDR # ifndef NGTCP2_AF_INET # error NGTCP2_AF_INET must be defined -# endif /* !NGTCP2_AF_INET */ +# endif /* !defined(NGTCP2_AF_INET) */ # ifndef NGTCP2_AF_INET6 # error NGTCP2_AF_INET6 must be defined -# endif /* !NGTCP2_AF_INET6 */ +# endif /* !defined(NGTCP2_AF_INET6) */ typedef unsigned short int ngtcp2_sa_family; typedef uint16_t ngtcp2_in_port; @@ -1267,7 +1271,7 @@ typedef struct ngtcp2_sockaddr_in6 { } ngtcp2_sockaddr_in6; typedef uint32_t ngtcp2_socklen; -#else /* !NGTCP2_USE_GENERIC_SOCKADDR */ +#else /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ # define NGTCP2_AF_INET AF_INET # define NGTCP2_AF_INET6 AF_INET6 @@ -1303,7 +1307,7 @@ typedef struct sockaddr_in6 ngtcp2_sockaddr_in6; * uint32_t. */ typedef socklen_t ngtcp2_socklen; -#endif /* !NGTCP2_USE_GENERIC_SOCKADDR */ +#endif /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ /** * @struct @@ -1471,7 +1475,9 @@ typedef struct ngtcp2_transport_params { uint64_t max_udp_payload_size; /** * :member:`active_connection_id_limit` is the maximum number of - * Connection ID that sender can store. + * Connection ID that sender can store. If specified, it must be in + * the range of [:macro:`NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT`, + * 8], inclusive. */ uint64_t active_connection_id_limit; /** @@ -1689,7 +1695,8 @@ typedef enum ngtcp2_token_type { } ngtcp2_token_type; #define NGTCP2_SETTINGS_V1 1 -#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V1 +#define NGTCP2_SETTINGS_V2 2 +#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V2 /** * @struct @@ -1723,8 +1730,7 @@ typedef struct ngtcp2_settings { ngtcp2_printf log_printf; /** * :member:`max_tx_udp_payload_size` is the maximum size of UDP - * datagram payload that the local endpoint transmits. It is used - * by congestion controller to compute congestion window. + * datagram payload that the local endpoint transmits. */ size_t max_tx_udp_payload_size; /** @@ -1777,6 +1783,13 @@ typedef struct ngtcp2_settings { * or :member:`ngtcp2_transport_params.initial_max_stream_data_uni`, * depending on the type of stream. The window size is scaled up to * the value specified in this field. + * + * Please note that the auto-tuning is done per stream. Even if the + * previous stream gets larger window as a result of auto-tuning, + * the new stream still starts with the initial value set in + * transport parameters. This might become a bottleneck if + * congestion window of a remote server is wide open. If this + * causes an issue, do not enable auto-tuning. */ uint64_t max_stream_window; /** @@ -1873,10 +1886,29 @@ typedef struct ngtcp2_settings { */ uint8_t no_pmtud; /** - * :member:`pkt_num` is the initial packet number for each packet - * number space. It must be in range [0, INT32_MAX], inclusive. + * :member:`initial_pkt_num` is the initial packet number for each + * packet number space. It must be in range [0, INT32_MAX], + * inclusive. */ uint32_t initial_pkt_num; + /* The following fields have been added since NGTCP2_SETTINGS_V2. */ + /** + * :member:`pmtud_probes` is the array of UDP datagram payload size + * to probe during Path MTU Discovery. The discovery is done in the + * order appeared in this array. The size must be strictly larger + * than 1200, otherwise the behavior is undefined. The maximum + * value in this array should be set to + * :member:`max_tx_udp_payload_size`. If this field is not set, the + * predefined PMTUD probes are made. This field has been available + * since v1.4.0. + */ + const uint16_t *pmtud_probes; + /** + * :member:`pmtud_probeslen` is the number of elements that are + * contained in the array pointed by :member:`pmtud_probes`. This + * field has been available since v1.4.0. + */ + size_t pmtud_probeslen; } ngtcp2_settings; /** @@ -2080,8 +2112,8 @@ typedef struct ngtcp2_crypto_ctx { * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_transport_params_encode_versioned( - uint8_t *dest, size_t destlen, int transport_params_version, - const ngtcp2_transport_params *params); + uint8_t *dest, size_t destlen, int transport_params_version, + const ngtcp2_transport_params *params); /** * @function @@ -2324,8 +2356,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_decode_hd_short(ngtcp2_pkt_hd *dest, * :macro:`NGTCP2_MIN_STATELESS_RESET_RANDLEN`. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset( - uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, - const uint8_t *rand, size_t randlen); + uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, + const uint8_t *rand, size_t randlen); /** * @function @@ -2347,9 +2379,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset( * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( - uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, - size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, - size_t nsv); + uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, + size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, + size_t nsv); /** * @struct @@ -2770,8 +2802,8 @@ typedef int (*ngtcp2_stream_reset)(ngtcp2_conn *conn, int64_t stream_id, * call return immediately. */ typedef int (*ngtcp2_acked_stream_data_offset)( - ngtcp2_conn *conn, int64_t stream_id, uint64_t offset, uint64_t datalen, - void *user_data, void *stream_user_data); + ngtcp2_conn *conn, int64_t stream_id, uint64_t offset, uint64_t datalen, + void *user_data, void *stream_user_data); /** * @functypedef @@ -2893,11 +2925,11 @@ typedef int (*ngtcp2_remove_connection_id)(ngtcp2_conn *conn, * immediately. */ typedef int (*ngtcp2_update_key)( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data); /** * @macrosection @@ -3024,8 +3056,8 @@ typedef enum ngtcp2_connection_id_status_type { * immediately. */ typedef int (*ngtcp2_connection_id_status)( - ngtcp2_conn *conn, ngtcp2_connection_id_status_type type, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token, void *user_data); + ngtcp2_conn *conn, ngtcp2_connection_id_status_type type, uint64_t seq, + const ngtcp2_cid *cid, const uint8_t *token, void *user_data); /** * @functypedef @@ -3064,7 +3096,7 @@ typedef void (*ngtcp2_delete_crypto_aead_ctx)(ngtcp2_conn *conn, * <ngtcp2_crypto_cipher_ctx.native_handle>`. */ typedef void (*ngtcp2_delete_crypto_cipher_ctx)( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); /** * @macrosection @@ -3510,12 +3542,12 @@ typedef struct ngtcp2_callbacks { * Callback function failed. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, - ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3542,10 +3574,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_connection_close( * :macro:`NGTCP2_MIN_INITIAL_DCIDLEN`. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx); /** * @function @@ -3594,12 +3626,12 @@ NGTCP2_EXTERN int ngtcp2_accept(ngtcp2_pkt_hd *dest, const uint8_t *pkt, * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_client_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data); + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data); /** * @function @@ -3629,12 +3661,12 @@ NGTCP2_EXTERN int ngtcp2_conn_client_new_versioned( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_server_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data); + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data); /** * @function @@ -3698,8 +3730,8 @@ ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, * and :macro:`NGTCP2_WRITE_STREAM_FLAG_NONE` as flags. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_pkt_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts); /** * @function @@ -3755,10 +3787,10 @@ NGTCP2_EXTERN int ngtcp2_conn_get_handshake_completed(ngtcp2_conn *conn); * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_initial_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, - const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, + const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); /** * @function @@ -3790,11 +3822,11 @@ NGTCP2_EXTERN int ngtcp2_conn_install_initial_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_vneg_initial_key( - ngtcp2_conn *conn, uint32_t version, - const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, - const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); + ngtcp2_conn *conn, uint32_t version, + const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, + const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); /** * @function @@ -3821,8 +3853,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_vneg_initial_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_rx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3849,8 +3881,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_rx_handshake_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_tx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3876,8 +3908,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_tx_handshake_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_0rtt_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3906,9 +3938,9 @@ NGTCP2_EXTERN int ngtcp2_conn_install_0rtt_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_rx_key( - ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3937,9 +3969,9 @@ NGTCP2_EXTERN int ngtcp2_conn_install_rx_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_tx_key( - ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -4063,7 +4095,7 @@ NGTCP2_EXTERN ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn); * User callback failed */ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_remote_transport_params( - ngtcp2_conn *conn, const uint8_t *data, size_t datalen); + ngtcp2_conn *conn, const uint8_t *data, size_t datalen); /** * @function @@ -4148,7 +4180,7 @@ ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, * The input is malformed. */ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_0rtt_transport_params( - ngtcp2_conn *conn, const uint8_t *data, size_t datalen); + ngtcp2_conn *conn, const uint8_t *data, size_t datalen); /** * @function @@ -4168,8 +4200,8 @@ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_0rtt_transport_params( * `ngtcp2_conn_install_tx_handshake_key` has been called. */ NGTCP2_EXTERN int ngtcp2_conn_set_local_transport_params_versioned( - ngtcp2_conn *conn, int transport_params_version, - const ngtcp2_transport_params *params); + ngtcp2_conn *conn, int transport_params_version, + const ngtcp2_transport_params *params); /** * @function @@ -4193,7 +4225,7 @@ ngtcp2_conn_get_local_transport_params(ngtcp2_conn *conn); * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_encode_local_transport_params( - ngtcp2_conn *conn, uint8_t *dest, size_t destlen); + ngtcp2_conn *conn, uint8_t *dest, size_t destlen); /** * @function @@ -4374,10 +4406,10 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * conveniently accepts a single buffer. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts); /** * @function @@ -4388,7 +4420,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * handshake as well. * * |destlen| should be at least - * :member:`ngtcp2_settings.max_tx_udp_payload_size`. + * :member:`ngtcp2_settings.max_tx_udp_payload_size`. It must be at + * least :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`. * * Specifying -1 to |stream_id| means no new stream data to send. * @@ -4418,8 +4451,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * In that case, |*pdatalen| would be -1 if |pdatalen| is not * ``NULL``. * - * If |flags| & :macro:`NGTCP2_WRITE_STREAM_FLAG_FIN` is nonzero, and - * 0 length STREAM frame is successfully serialized, |*pdatalen| would + * Empty data is treated specially, and it is only accepted if no + * data, including the empty data, is submitted to a stream or + * :macro:`NGTCP2_WRITE_STREAM_FLAG_FIN` is set in |flags|. If 0 + * length STREAM frame is successfully serialized, |*pdatalen| would * be 0. * * The number of data encoded in STREAM frame is stored in |*pdatalen| @@ -4525,10 +4560,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * sending it makes QUIC connection enter the closing state. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts); /** * @macrosection @@ -4559,10 +4594,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( * conveniently accepts a single buffer. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts); /** * @function @@ -4573,7 +4608,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( * as well. * * |destlen| should be at least - * :member:`ngtcp2_settings.max_tx_udp_payload_size`. + * :member:`ngtcp2_settings.max_tx_udp_payload_size`. It must be at + * least :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`. * * For |path| and |pi| parameters, refer to * `ngtcp2_conn_writev_stream`. @@ -4655,10 +4691,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( * sending it makes QUIC connection enter the closing state. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts); /** * @function @@ -4992,7 +5028,7 @@ ngtcp2_conn_get_path_max_tx_udp_payload_size(ngtcp2_conn *conn); * Out of memory */ NGTCP2_EXTERN int ngtcp2_conn_initiate_immediate_migration( - ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts); + ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts); /** * @function @@ -5193,7 +5229,19 @@ typedef enum ngtcp2_ccerr_type { * transport error, and it indicates that connection is closed * because of idle timeout. */ - NGTCP2_CCERR_TYPE_IDLE_CLOSE + NGTCP2_CCERR_TYPE_IDLE_CLOSE, + /** + * :enum:`NGTCP2_CCERR_TYPE_DROP_CONN` is a special case of QUIC + * transport error, and it indicates that connection should be + * dropped without sending a CONNECTION_CLOSE frame. + */ + NGTCP2_CCERR_TYPE_DROP_CONN, + /** + * :enum:`NGTCP2_CCERR_TYPE_RETRY` is a special case of QUIC + * transport error, and it indicates that RETRY packet should be + * sent to a client. + */ + NGTCP2_CCERR_TYPE_RETRY } ngtcp2_ccerr_type; /** @@ -5284,6 +5332,18 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_transport_error(ngtcp2_ccerr *ccerr, * :member:`ccerr->error_code <ngtcp2_ccerr.error_code>` to * :macro:`NGTCP2_NO_ERROR`. * + * If |liberr| is :macro:`NGTCP2_ERR_DROP_CONN`, :member:`ccerr->type + * <ngtcp2_ccerr.type>` is set to + * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_DROP_CONN`, and + * :member:`ccerr->error_code <ngtcp2_ccerr.error_code>` to + * :macro:`NGTCP2_NO_ERROR`. + * + * If |liberr| is :macro:`NGTCP2_ERR_RETRY`, :member:`ccerr->type + * <ngtcp2_ccerr.type>` is set to + * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_RETRY`, and + * :member:`ccerr->error_type <ngtcp2_ccerr.error_code>` to + * :macro:`NGTCP2_NO_ERROR`. + * * Otherwise, :member:`ccerr->type <ngtcp2_ccerr.type>` is set to * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_TRANSPORT`, and * :member:`ccerr->error_code <ngtcp2_ccerr.error_code>` is set to an @@ -5380,9 +5440,9 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, * User callback failed */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - const ngtcp2_ccerr *ccerr, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, const ngtcp2_ccerr *ccerr, + ngtcp2_tstamp ts); /** * @function @@ -5734,8 +5794,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_stream(CONN, PATH, PI, DEST, DESTLEN, PDATALEN, \ FLAGS, STREAM_ID, DATA, DATALEN, TS) \ ngtcp2_conn_write_stream_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PDATALEN), (FLAGS), (STREAM_ID), (DATA), (DATALEN), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PDATALEN), (FLAGS), (STREAM_ID), (DATA), (DATALEN), (TS)) /* * `ngtcp2_conn_writev_stream` is a wrapper around @@ -5745,8 +5805,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_writev_stream(CONN, PATH, PI, DEST, DESTLEN, PDATALEN, \ FLAGS, STREAM_ID, DATAV, DATAVCNT, TS) \ ngtcp2_conn_writev_stream_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PDATALEN), (FLAGS), (STREAM_ID), (DATAV), (DATAVCNT), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PDATALEN), (FLAGS), (STREAM_ID), (DATAV), (DATAVCNT), (TS)) /* * `ngtcp2_conn_write_datagram` is a wrapper around @@ -5756,8 +5816,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_datagram(CONN, PATH, PI, DEST, DESTLEN, PACCEPTED, \ FLAGS, DGRAM_ID, DATA, DATALEN, TS) \ ngtcp2_conn_write_datagram_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PACCEPTED), (FLAGS), (DGRAM_ID), (DATA), (DATALEN), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PACCEPTED), (FLAGS), (DGRAM_ID), (DATA), (DATALEN), (TS)) /* * `ngtcp2_conn_writev_datagram` is a wrapper around @@ -5767,8 +5827,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_writev_datagram(CONN, PATH, PI, DEST, DESTLEN, PACCEPTED, \ FLAGS, DGRAM_ID, DATAV, DATAVCNT, TS) \ ngtcp2_conn_writev_datagram_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PACCEPTED), (FLAGS), (DGRAM_ID), (DATAV), (DATAVCNT), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PACCEPTED), (FLAGS), (DGRAM_ID), (DATAV), (DATAVCNT), (TS)) /* * `ngtcp2_conn_write_connection_close` is a wrapper around @@ -5778,8 +5838,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_connection_close(CONN, PATH, PI, DEST, DESTLEN, \ CCERR, TS) \ ngtcp2_conn_write_connection_close_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (CCERR), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), (CCERR), \ + (TS)) /* * `ngtcp2_transport_params_encode` is a wrapper around @@ -5788,7 +5848,7 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, */ #define ngtcp2_transport_params_encode(DEST, DESTLEN, PARAMS) \ ngtcp2_transport_params_encode_versioned( \ - (DEST), (DESTLEN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) + (DEST), (DESTLEN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) /* * `ngtcp2_transport_params_decode` is a wrapper around @@ -5807,9 +5867,9 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_client_new(PCONN, DCID, SCID, PATH, VERSION, CALLBACKS, \ SETTINGS, PARAMS, MEM, USER_DATA) \ ngtcp2_conn_client_new_versioned( \ - (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ - (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ - NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) + (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ + (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ + NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) /* * `ngtcp2_conn_server_new` is a wrapper around @@ -5819,9 +5879,9 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_server_new(PCONN, DCID, SCID, PATH, VERSION, CALLBACKS, \ SETTINGS, PARAMS, MEM, USER_DATA) \ ngtcp2_conn_server_new_versioned( \ - (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ - (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ - NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) + (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ + (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ + NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) /* * `ngtcp2_conn_set_local_transport_params` is a wrapper around @@ -5830,7 +5890,7 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, */ #define ngtcp2_conn_set_local_transport_params(CONN, PARAMS) \ ngtcp2_conn_set_local_transport_params_versioned( \ - (CONN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) + (CONN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) /* * `ngtcp2_transport_params_default` is a wrapper around @@ -5859,10 +5919,10 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #ifdef _MSC_VER # pragma warning(pop) -#endif +#endif /* defined(_MSC_VER) */ #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_H */ +#endif /* !defined(NGTCP2_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h index 801c6cb2681386..bb983f5cf44be3 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h @@ -22,8 +22,8 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef VERSION_H -#define VERSION_H +#ifndef NGTCP2_VERSION_H +#define NGTCP2_VERSION_H /** * @macrosection @@ -36,7 +36,7 @@ * * Version number of the ngtcp2 library release. */ -#define NGTCP2_VERSION "1.3.0" +#define NGTCP2_VERSION "1.11.0" /** * @macro @@ -46,6 +46,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGTCP2_VERSION_NUM 0x010300 +#define NGTCP2_VERSION_NUM 0x010b00 -#endif /* VERSION_H */ +#endif /* !defined(NGTCP2_VERSION_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c index d4778d66accf31..776dc0c2c3ef1a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c @@ -25,11 +25,12 @@ #include "ngtcp2_acktr.h" #include <assert.h> +#include <string.h> #include "ngtcp2_macro.h" #include "ngtcp2_tstamp.h" -ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent); +ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent) static void acktr_entry_init(ngtcp2_acktr_entry *ent, int64_t pkt_num, ngtcp2_tstamp tstamp) { @@ -56,41 +57,29 @@ void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent, ngtcp2_objalloc_acktr_entry_release(objalloc, ent); } -static int greater(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - -int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, - const ngtcp2_mem *mem) { - int rv; +void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, + const ngtcp2_mem *mem) { + ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, NGTCP2_ACKTR_MAX_ENT + 1, + mem); - ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, 32, mem); - - rv = ngtcp2_ringbuf_init(&acktr->acks, 32, sizeof(ngtcp2_acktr_ack_entry), - mem); - if (rv != 0) { - goto fail_acks_init; - } + ngtcp2_static_ringbuf_acks_init(&acktr->acks); - ngtcp2_ksl_init(&acktr->ents, greater, sizeof(int64_t), mem); + ngtcp2_ksl_init(&acktr->ents, ngtcp2_ksl_int64_greater, + ngtcp2_ksl_int64_greater_search, sizeof(int64_t), mem); acktr->log = log; - acktr->mem = mem; acktr->flags = NGTCP2_ACKTR_FLAG_NONE; acktr->first_unacked_ts = UINT64_MAX; acktr->rx_npkt = 0; - - return 0; - -fail_acks_init: - ngtcp2_objalloc_free(&acktr->objalloc); - return rv; + acktr->max_pkt_num = -1; + acktr->max_pkt_ts = UINT64_MAX; + memset(&acktr->ecn, 0, sizeof(acktr->ecn)); } void ngtcp2_acktr_free(ngtcp2_acktr *acktr) { #ifdef NOMEMPOOL ngtcp2_ksl_it it; -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ if (acktr == NULL) { return; @@ -101,12 +90,10 @@ void ngtcp2_acktr_free(ngtcp2_acktr *acktr) { ngtcp2_ksl_it_next(&it)) { ngtcp2_acktr_entry_objalloc_del(ngtcp2_ksl_it_get(&it), &acktr->objalloc); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ngtcp2_ksl_free(&acktr->ents); - ngtcp2_ringbuf_free(&acktr->acks); - ngtcp2_objalloc_free(&acktr->objalloc); } @@ -197,6 +184,11 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, ngtcp2_acktr_entry_objalloc_del(delent, &acktr->objalloc); } + if (acktr->max_pkt_num < pkt_num) { + acktr->max_pkt_num = pkt_num; + acktr->max_pkt_ts = ts; + } + return 0; } @@ -213,11 +205,11 @@ void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent) { } } -ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr) { +ngtcp2_ksl_it ngtcp2_acktr_get(const ngtcp2_acktr *acktr) { return ngtcp2_ksl_begin(&acktr->ents); } -int ngtcp2_acktr_empty(ngtcp2_acktr *acktr) { +int ngtcp2_acktr_empty(const ngtcp2_acktr *acktr) { ngtcp2_ksl_it it = ngtcp2_ksl_begin(&acktr->ents); return ngtcp2_ksl_it_end(&it); } @@ -225,7 +217,7 @@ int ngtcp2_acktr_empty(ngtcp2_acktr *acktr) { ngtcp2_acktr_ack_entry *ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr, int64_t pkt_num, int64_t largest_ack) { - ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks); + ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks.rb); ent->largest_ack = largest_ack; ent->pkt_num = pkt_num; @@ -266,8 +258,10 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, ngtcp2_ringbuf *rb, ngtcp2_ksl_it_prev(&it); ent = ngtcp2_ksl_it_get(&it); - if (ent->pkt_num > ack_ent->largest_ack && - ack_ent->largest_ack >= ent->pkt_num - (int64_t)(ent->len - 1)) { + + assert(ent->pkt_num > ack_ent->largest_ack); + + if (ack_ent->largest_ack + (int64_t)ent->len > ent->pkt_num) { ent->len = (size_t)(ent->pkt_num - ack_ent->largest_ack); } } @@ -279,7 +273,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { ngtcp2_acktr_ack_entry *ent; int64_t largest_ack = fr->largest_ack, min_ack; size_t i, j; - ngtcp2_ringbuf *rb = &acktr->acks; + ngtcp2_ringbuf *rb = &acktr->acks.rb; size_t nacks = ngtcp2_ringbuf_len(rb); /* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */ @@ -295,7 +289,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { min_ack = largest_ack - (int64_t)fr->first_ack_range; - if (min_ack <= ent->pkt_num && ent->pkt_num <= largest_ack) { + if (min_ack <= ent->pkt_num) { acktr_on_ack(acktr, rb, j); return; } @@ -306,8 +300,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { for (;;) { if (ent->pkt_num > largest_ack) { - ++j; - if (j == nacks) { + if (++j == nacks) { return; } ent = ngtcp2_ringbuf_get(rb, j); @@ -330,7 +323,7 @@ void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr) { acktr->rx_npkt = 0; } -int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, +int ngtcp2_acktr_require_active_ack(const ngtcp2_acktr *acktr, ngtcp2_duration max_ack_delay, ngtcp2_tstamp ts) { return ngtcp2_tstamp_elapsed(acktr->first_unacked_ts, max_ack_delay, ts); @@ -339,3 +332,108 @@ int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr) { acktr->flags |= NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK; } + +ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, + ngtcp2_frame *fr, uint8_t type, + ngtcp2_tstamp ts, + ngtcp2_duration ack_delay, + uint64_t ack_delay_exponent) { + int64_t last_pkt_num; + ngtcp2_ack_range *range; + ngtcp2_ksl_it it; + ngtcp2_acktr_entry *rpkt; + ngtcp2_ack *ack = &fr->ack; + ngtcp2_tstamp largest_ack_ts; + size_t num_acks; + + if (acktr->flags & NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK) { + ack_delay = 0; + } + + if (!ngtcp2_acktr_require_active_ack(acktr, ack_delay, ts)) { + return NULL; + } + + it = ngtcp2_acktr_get(acktr); + if (ngtcp2_ksl_it_end(&it)) { + ngtcp2_acktr_commit_ack(acktr); + return NULL; + } + + num_acks = ngtcp2_ksl_len(&acktr->ents); + + if (acktr->ecn.ect0 || acktr->ecn.ect1 || acktr->ecn.ce) { + ack->type = NGTCP2_FRAME_ACK_ECN; + ack->ecn.ect0 = acktr->ecn.ect0; + ack->ecn.ect1 = acktr->ecn.ect1; + ack->ecn.ce = acktr->ecn.ce; + } else { + ack->type = NGTCP2_FRAME_ACK; + } + ack->rangecnt = 0; + + rpkt = ngtcp2_ksl_it_get(&it); + + if (rpkt->pkt_num == acktr->max_pkt_num) { + last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); + largest_ack_ts = rpkt->tstamp; + ack->largest_ack = rpkt->pkt_num; + ack->first_ack_range = rpkt->len - 1; + + ngtcp2_ksl_it_next(&it); + --num_acks; + } else if (rpkt->pkt_num + 1 == acktr->max_pkt_num) { + last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); + largest_ack_ts = acktr->max_pkt_ts; + ack->largest_ack = acktr->max_pkt_num; + ack->first_ack_range = rpkt->len; + + ngtcp2_ksl_it_next(&it); + --num_acks; + } else { + assert(rpkt->pkt_num < acktr->max_pkt_num); + + last_pkt_num = acktr->max_pkt_num; + largest_ack_ts = acktr->max_pkt_ts; + ack->largest_ack = acktr->max_pkt_num; + ack->first_ack_range = 0; + } + + if (type == NGTCP2_PKT_1RTT) { + ack->ack_delay_unscaled = ts - largest_ack_ts; + ack->ack_delay = ack->ack_delay_unscaled / NGTCP2_MICROSECONDS / + (1ULL << ack_delay_exponent); + } else { + ack->ack_delay_unscaled = 0; + ack->ack_delay = 0; + } + + num_acks = ngtcp2_min_size(num_acks, NGTCP2_MAX_ACK_RANGES); + + for (; ack->rangecnt < num_acks; ngtcp2_ksl_it_next(&it)) { + rpkt = ngtcp2_ksl_it_get(&it); + + range = &ack->ranges[ack->rangecnt++]; + range->gap = (uint64_t)(last_pkt_num - rpkt->pkt_num - 2); + range->len = rpkt->len - 1; + + last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); + } + + return fr; +} + +void ngtcp2_acktr_increase_ecn_counts(ngtcp2_acktr *acktr, + const ngtcp2_pkt_info *pi) { + switch (pi->ecn & NGTCP2_ECN_MASK) { + case NGTCP2_ECN_ECT_0: + ++acktr->ecn.ect0; + break; + case NGTCP2_ECN_ECT_1: + ++acktr->ecn.ect1; + break; + case NGTCP2_ECN_CE: + ++acktr->ecn.ce; + break; + } +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h index 809fb692adc3c8..cf75a774db3e82 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -39,7 +39,7 @@ /* NGTCP2_ACKTR_MAX_ENT is the maximum number of ngtcp2_acktr_entry which ngtcp2_acktr stores. */ -#define NGTCP2_ACKTR_MAX_ENT 1024 +#define NGTCP2_ACKTR_MAX_ENT (NGTCP2_MAX_ACK_RANGES + 1) typedef struct ngtcp2_log ngtcp2_log; @@ -65,7 +65,7 @@ typedef struct ngtcp2_acktr_entry { }; } ngtcp2_acktr_entry; -ngtcp2_objalloc_decl(acktr_entry, ngtcp2_acktr_entry, oplent); +ngtcp2_objalloc_decl(acktr_entry, ngtcp2_acktr_entry, oplent) /* * ngtcp2_acktr_entry_objalloc_new allocates memory for ent, and @@ -108,17 +108,18 @@ typedef struct ngtcp2_acktr_ack_entry { expired and canceled. */ #define NGTCP2_ACKTR_FLAG_CANCEL_TIMER 0x0100u +ngtcp2_static_ringbuf_def(acks, 32, sizeof(ngtcp2_acktr_ack_entry)) + /* * ngtcp2_acktr tracks received packets which we have to send ack. */ typedef struct ngtcp2_acktr { ngtcp2_objalloc objalloc; - ngtcp2_ringbuf acks; + ngtcp2_static_ringbuf_acks acks; /* ents includes ngtcp2_acktr_entry sorted by decreasing order of packet number. */ ngtcp2_ksl ents; ngtcp2_log *log; - const ngtcp2_mem *mem; /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ uint16_t flags; /* first_unacked_ts is timestamp when ngtcp2_acktr_entry is added @@ -127,19 +128,33 @@ typedef struct ngtcp2_acktr { /* rx_npkt is the number of ACK eliciting packets received without sending ACK. */ size_t rx_npkt; + /* max_pkt_num is the largest packet number received so far. */ + int64_t max_pkt_num; + /* max_pkt_ts is the timestamp when max_pkt_num packet is + received. */ + ngtcp2_tstamp max_pkt_ts; + + struct { + /* ect0, ect1, and ce are the number of QUIC packets received + with those markings. */ + size_t ect0; + size_t ect1; + size_t ce; + struct { + /* ect0, ect1, ce are the ECN counts received in the latest + ACK frame. */ + uint64_t ect0; + uint64_t ect1; + uint64_t ce; + } ack; + } ecn; } ngtcp2_acktr; /* * ngtcp2_acktr_init initializes |acktr|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. */ -int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, - const ngtcp2_mem *mem); +void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, + const ngtcp2_mem *mem); /* * ngtcp2_acktr_free frees resources allocated for |acktr|. It frees @@ -170,17 +185,17 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent); /* - * ngtcp2_acktr_get returns the pointer to pointer to the entry which + * ngtcp2_acktr_get returns the iterator to pointer to the entry which * has the largest packet number to be acked. If there is no entry, * returned value satisfies ngtcp2_ksl_it_end(&it) != 0. */ -ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr); +ngtcp2_ksl_it ngtcp2_acktr_get(const ngtcp2_acktr *acktr); /* * ngtcp2_acktr_empty returns nonzero if it has no packet to * acknowledge. */ -int ngtcp2_acktr_empty(ngtcp2_acktr *acktr); +int ngtcp2_acktr_empty(const ngtcp2_acktr *acktr); /* * ngtcp2_acktr_add_ack records outgoing ACK frame whose largest @@ -208,7 +223,7 @@ void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr); * ngtcp2_acktr_require_active_ack returns nonzero if ACK frame should * be generated actively. */ -int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, +int ngtcp2_acktr_require_active_ack(const ngtcp2_acktr *acktr, ngtcp2_duration max_ack_delay, ngtcp2_tstamp ts); @@ -218,4 +233,26 @@ int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, */ void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr); -#endif /* NGTCP2_ACKTR_H */ +/* + * ngtcp2_acktr_create_ack_frame creates ACK frame in the object + * pointed by |fr|, and returns |fr| if there are any received packets + * to acknowledge. If there are no packets to acknowledge, this + * function returns NULL. fr->ack.ranges must be able to contain at + * least NGTCP2_MAX_ACK_RANGES elements. + * + * Call ngtcp2_acktr_commit_ack after a created ACK frame is + * successfully serialized into a packet. + */ +ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, + ngtcp2_frame *fr, uint8_t type, + ngtcp2_tstamp ts, + ngtcp2_duration ack_delay, + uint64_t ack_delay_exponent); + +/* + * ngtcp2_acktr_increase_ecn_counts increases ECN counts from |pi|. + */ +void ngtcp2_acktr_increase_ecn_counts(ngtcp2_acktr *acktr, + const ngtcp2_pkt_info *pi); + +#endif /* !defined(NGTCP2_ACKTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c index f389abe76d71c8..1fb273d494e8e2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c @@ -51,8 +51,10 @@ void ngtcp2_addr_copy_byte(ngtcp2_addr *dest, const ngtcp2_sockaddr *addr, } } -static int sockaddr_eq(const ngtcp2_sockaddr *a, const ngtcp2_sockaddr *b) { - assert(a->sa_family == b->sa_family); +int ngtcp2_sockaddr_eq(const ngtcp2_sockaddr *a, const ngtcp2_sockaddr *b) { + if (a->sa_family != b->sa_family) { + return 0; + } switch (a->sa_family) { case NGTCP2_AF_INET: { @@ -73,17 +75,16 @@ static int sockaddr_eq(const ngtcp2_sockaddr *a, const ngtcp2_sockaddr *b) { } int ngtcp2_addr_eq(const ngtcp2_addr *a, const ngtcp2_addr *b) { - return a->addr->sa_family == b->addr->sa_family && - sockaddr_eq(a->addr, b->addr); + return ngtcp2_sockaddr_eq(a->addr, b->addr); } -uint32_t ngtcp2_addr_compare(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { - uint32_t flags = NGTCP2_ADDR_COMPARE_FLAG_NONE; +uint32_t ngtcp2_addr_cmp(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { + uint32_t flags = NGTCP2_ADDR_CMP_FLAG_NONE; const ngtcp2_sockaddr *a = aa->addr; const ngtcp2_sockaddr *b = bb->addr; if (a->sa_family != b->sa_family) { - return NGTCP2_ADDR_COMPARE_FLAG_FAMILY; + return NGTCP2_ADDR_CMP_FLAG_FAMILY; } switch (a->sa_family) { @@ -91,10 +92,10 @@ uint32_t ngtcp2_addr_compare(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { const ngtcp2_sockaddr_in *ai = (const ngtcp2_sockaddr_in *)(void *)a, *bi = (const ngtcp2_sockaddr_in *)(void *)b; if (memcmp(&ai->sin_addr, &bi->sin_addr, sizeof(ai->sin_addr))) { - flags |= NGTCP2_ADDR_COMPARE_FLAG_ADDR; + flags |= NGTCP2_ADDR_CMP_FLAG_ADDR; } if (ai->sin_port != bi->sin_port) { - flags |= NGTCP2_ADDR_COMPARE_FLAG_PORT; + flags |= NGTCP2_ADDR_CMP_FLAG_PORT; } return flags; } @@ -102,10 +103,10 @@ uint32_t ngtcp2_addr_compare(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { const ngtcp2_sockaddr_in6 *ai = (const ngtcp2_sockaddr_in6 *)(void *)a, *bi = (const ngtcp2_sockaddr_in6 *)(void *)b; if (memcmp(&ai->sin6_addr, &bi->sin6_addr, sizeof(ai->sin6_addr))) { - flags |= NGTCP2_ADDR_COMPARE_FLAG_ADDR; + flags |= NGTCP2_ADDR_CMP_FLAG_ADDR; } if (ai->sin6_port != bi->sin6_port) { - flags |= NGTCP2_ADDR_COMPARE_FLAG_PORT; + flags |= NGTCP2_ADDR_CMP_FLAG_PORT; } return flags; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h index 8e3a9f591d9977..c2224f85cd9c11 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -45,22 +45,21 @@ void ngtcp2_addr_copy(ngtcp2_addr *dest, const ngtcp2_addr *src); */ int ngtcp2_addr_eq(const ngtcp2_addr *a, const ngtcp2_addr *b); -/* NGTCP2_ADDR_COMPARE_FLAG_NONE indicates that no flag set. */ -#define NGTCP2_ADDR_COMPARE_FLAG_NONE 0x0u -/* NGTCP2_ADDR_COMPARE_FLAG_ADDR indicates IP addresses do not +/* NGTCP2_ADDR_CMP_FLAG_NONE indicates that no flag set. */ +#define NGTCP2_ADDR_CMP_FLAG_NONE 0x0u +/* NGTCP2_ADDR_CMP_FLAG_ADDR indicates IP addresses do not match. */ +#define NGTCP2_ADDR_CMP_FLAG_ADDR 0x1u +/* NGTCP2_ADDR_CMP_FLAG_PORT indicates ports do not match. */ +#define NGTCP2_ADDR_CMP_FLAG_PORT 0x2u +/* NGTCP2_ADDR_CMP_FLAG_FAMILY indicates address families do not match. */ -#define NGTCP2_ADDR_COMPARE_FLAG_ADDR 0x1u -/* NGTCP2_ADDR_COMPARE_FLAG_PORT indicates ports do not match. */ -#define NGTCP2_ADDR_COMPARE_FLAG_PORT 0x2u -/* NGTCP2_ADDR_COMPARE_FLAG_FAMILY indicates address families do not - match. */ -#define NGTCP2_ADDR_COMPARE_FLAG_FAMILY 0x4u +#define NGTCP2_ADDR_CMP_FLAG_FAMILY 0x4u /* - * ngtcp2_addr_compare compares address and port between |a| and |b|, - * and returns zero or more of NGTCP2_ADDR_COMPARE_FLAG_*. + * ngtcp2_addr_cmp compares address and port between |a| and |b|, and + * returns zero or more of NGTCP2_ADDR_CMP_FLAG_*. */ -uint32_t ngtcp2_addr_compare(const ngtcp2_addr *a, const ngtcp2_addr *b); +uint32_t ngtcp2_addr_cmp(const ngtcp2_addr *a, const ngtcp2_addr *b); /* * ngtcp2_addr_empty returns nonzero if |addr| has zero length @@ -68,4 +67,11 @@ uint32_t ngtcp2_addr_compare(const ngtcp2_addr *a, const ngtcp2_addr *b); */ int ngtcp2_addr_empty(const ngtcp2_addr *addr); -#endif /* NGTCP2_ADDR_H */ +/** + * @function + * + * `ngtcp2_sockaddr_eq` returns nonzero if |a| equals |b|. + */ +int ngtcp2_sockaddr_eq(const ngtcp2_sockaddr *a, const ngtcp2_sockaddr *b); + +#endif /* !defined(NGTCP2_ADDR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c index 5cc39ee3b03da4..4a6797689fcc01 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c @@ -66,7 +66,7 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n) { if (ngtcp2_buf_left(&balloc->buf) < n) { p = ngtcp2_mem_malloc(balloc->mem, - sizeof(ngtcp2_memblock_hd) + 0x10u + balloc->blklen); + sizeof(ngtcp2_memblock_hd) + 0x8u + balloc->blklen); if (p == NULL) { return NGTCP2_ERR_NOMEM; } @@ -75,10 +75,10 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n) { hd->next = balloc->head; balloc->head = hd; ngtcp2_buf_init( - &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), - balloc->blklen); + &balloc->buf, + (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xfu) & + ~(uintptr_t)0xfu), + balloc->blklen); } assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h index 1fb16325d9953d..c0e2a3f7562968 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -39,7 +39,10 @@ typedef struct ngtcp2_memblock_hd ngtcp2_memblock_hd; * ngtcp2_memblock_hd is the header of memory block. */ struct ngtcp2_memblock_hd { - ngtcp2_memblock_hd *next; + union { + ngtcp2_memblock_hd *next; + uint64_t pad; + }; }; /* @@ -60,7 +63,7 @@ typedef struct ngtcp2_balloc { /* * ngtcp2_balloc_init initializes |balloc| with |blklen| which is the - * size of memory block. + * size of memory block. |blklen| must be divisible by 16. */ void ngtcp2_balloc_init(ngtcp2_balloc *balloc, size_t blklen, const ngtcp2_mem *mem); @@ -88,4 +91,4 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n); */ void ngtcp2_balloc_clear(ngtcp2_balloc *balloc); -#endif /* NGTCP2_BALLOC_H */ +#endif /* !defined(NGTCP2_BALLOC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c index 27c4667c03924a..a20f04521e36ca 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c @@ -39,8 +39,9 @@ #define NGTCP2_BBR_EXTRA_ACKED_FILTERLEN 10 #define NGTCP2_BBR_STARTUP_PACING_GAIN_H 277 +#define NGTCP2_BBR_DRAIN_PACING_GAIN_H 50 -#define NGTCP2_BBR_STARTUP_CWND_GAIN_H 200 +#define NGTCP2_BBR_DEFAULT_CWND_GAIN_H 200 #define NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H 50 @@ -72,7 +73,7 @@ static void bbr_reset_lower_bounds(ngtcp2_cc_bbr *bbr); static void bbr_init_round_counting(ngtcp2_cc_bbr *bbr); -static void bbr_init_full_pipe(ngtcp2_cc_bbr *bbr); +static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr); static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -84,8 +85,7 @@ static void bbr_set_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_enter_startup(ngtcp2_cc_bbr *bbr); -static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack); +static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr); static void bbr_update_on_ack(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); @@ -130,6 +130,8 @@ static void bbr_start_round(ngtcp2_cc_bbr *bbr); static int bbr_is_in_probe_bw_state(ngtcp2_cc_bbr *bbr); +static int bbr_is_probing_bw(ngtcp2_cc_bbr *bbr); + static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, @@ -137,8 +139,8 @@ static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, static void bbr_enter_drain(ngtcp2_cc_bbr *bbr); -static void bbr_check_drain(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts); static void bbr_enter_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts); @@ -148,16 +150,17 @@ static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr); static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr); -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); -static int bbr_check_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts); + +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static int bbr_has_elapsed_in_phase(ngtcp2_cc_bbr *bbr, ngtcp2_duration interval, ngtcp2_tstamp ts); @@ -175,9 +178,8 @@ static void bbr_probe_inflight_hi_upward(ngtcp2_cc_bbr *bbr, static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); -static int bbr_check_time_to_probe_bw(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts); static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr); @@ -197,6 +199,8 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_rs *rs, ngtcp2_tstamp ts); +static void bbr_note_loss(ngtcp2_cc_bbr *bbr); + static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts); @@ -227,15 +231,14 @@ static void bbr_handle_restart_from_idle(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t bw, - uint64_t gain_h); +static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h); static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t inflight); static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - uint64_t bw, uint64_t gain_h); + uint64_t gain_h); static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -247,10 +250,6 @@ static uint64_t min_pipe_cwnd(size_t max_udp_payload_size); static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr); -static void bbr_modulate_cwnd_for_recovery(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack); - static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -272,7 +271,7 @@ static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_time); static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); + const ngtcp2_cc_ack *ack); static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp initial_ts) { @@ -280,7 +279,8 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_window_filter_init(&bbr->extra_acked_filter, NGTCP2_BBR_EXTRA_ACKED_FILTERLEN); - bbr->min_rtt = UINT64_MAX; + bbr->min_rtt = + cstat->first_rtt_sample_ts == UINT64_MAX ? UINT64_MAX : cstat->smoothed_rtt; bbr->min_rtt_stamp = initial_ts; /* remark: Use UINT64_MAX instead of 0 for consistency. */ bbr->probe_rtt_done_stamp = UINT64_MAX; @@ -289,11 +289,12 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->idle_restart = 0; bbr->extra_acked_interval_start = initial_ts; bbr->extra_acked_delivered = 0; + bbr->full_bw_reached = 0; bbr_reset_congestion_signals(bbr); bbr_reset_lower_bounds(bbr); bbr_init_round_counting(bbr); - bbr_init_full_pipe(bbr); + bbr_reset_full_bw(bbr); bbr_init_pacing_rate(bbr, cstat); bbr_enter_startup(bbr); @@ -326,23 +327,19 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->bw_probe_up_acks = 0; bbr->inflight_hi = UINT64_MAX; - bbr->bw_hi = UINT64_MAX; bbr->probe_rtt_expired = 0; bbr->probe_rtt_min_delay = UINT64_MAX; bbr->probe_rtt_min_stamp = initial_ts; bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr->max_inflight = 0; bbr->congestion_recovery_start_ts = UINT64_MAX; - bbr->congestion_recovery_next_round_delivered = 0; - bbr->prior_inflight_lo = 0; - bbr->prior_inflight_hi = 0; - bbr->prior_bw_lo = 0; + bbr->bdp = 0; } static void bbr_reset_congestion_signals(ngtcp2_cc_bbr *bbr) { @@ -362,53 +359,60 @@ static void bbr_init_round_counting(ngtcp2_cc_bbr *bbr) { bbr->round_count = 0; } -static void bbr_init_full_pipe(ngtcp2_cc_bbr *bbr) { - bbr->filled_pipe = 0; +static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr) { bbr->full_bw = 0; bbr->full_bw_count = 0; + bbr->full_bw_now = 0; } -static void bbr_check_startup_full_bandwidth(ngtcp2_cc_bbr *bbr) { - if (bbr->filled_pipe || !bbr->round_start || bbr->rst->rs.is_app_limited) { +static void bbr_check_full_bw_reached(ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { + if (bbr->full_bw_now || bbr->rst->rs.is_app_limited) { return; } - if (bbr->max_bw * 100 >= bbr->full_bw * 125) { - bbr->full_bw = bbr->max_bw; - bbr->full_bw_count = 0; - } - - ++bbr->full_bw_count; - - if (bbr->full_bw_count >= 3) { - bbr->filled_pipe = 1; + if (cstat->delivery_rate_sec * 100 >= bbr->full_bw * 125) { + bbr_reset_full_bw(bbr); + bbr->full_bw = cstat->delivery_rate_sec; - ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, - "bbr filled pipe, full_bw=%" PRIu64, bbr->full_bw); + return; } -} -static void bbr_check_startup_high_loss(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack) { - if (bbr->filled_pipe || !bbr->round_start || bbr->rst->rs.is_app_limited) { + if (!bbr->round_start) { return; } - if (bbr->loss_events_in_round <= 3) { + ++bbr->full_bw_count; + + bbr->full_bw_now = bbr->full_bw_count >= 3; + if (!bbr->full_bw_now) { return; } - /* loss_thresh = 2% */ - if (bbr->bytes_lost_in_round * 100 <= ack->prior_bytes_in_flight * 2) { + bbr->full_bw_reached = 1; + + ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, + "bbr reached full bandwidth, full_bw=%" PRIu64, bbr->full_bw); +} + +static void bbr_check_startup_high_loss(ngtcp2_cc_bbr *bbr) { + if (bbr->full_bw_reached || bbr->loss_events_in_round <= 6 || + (bbr->in_loss_recovery && + bbr->round_count <= bbr->round_count_at_recovery) || + !is_inflight_too_high(&bbr->rst->rs)) { return; } - bbr->filled_pipe = 1; + bbr->full_bw_reached = 1; + bbr->inflight_hi = ngtcp2_max_uint64(bbr_bdp_multiple(bbr, bbr->cwnd_gain_h), + bbr->inflight_latest); } static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - cstat->pacing_interval = NGTCP2_MILLISECONDS * 100 / - NGTCP2_BBR_STARTUP_PACING_GAIN_H / bbr->initial_cwnd; + cstat->pacing_interval = + (cstat->first_rtt_sample_ts == UINT64_MAX ? NGTCP2_MILLISECONDS + : cstat->smoothed_rtt) * + 100 / NGTCP2_BBR_STARTUP_PACING_GAIN_H / bbr->initial_cwnd; } static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, @@ -423,7 +427,7 @@ static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, interval = NGTCP2_SECONDS * 100 * 100 / pacing_gain_h / bbr->bw / (100 - NGTCP2_BBR_PACING_MARGIN_PERCENT); - if (bbr->filled_pipe || interval < cstat->pacing_interval) { + if (bbr->full_bw_reached || interval < cstat->pacing_interval) { cstat->pacing_interval = interval; } } @@ -437,15 +441,13 @@ static void bbr_enter_startup(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_STARTUP; bbr->pacing_gain_h = NGTCP2_BBR_STARTUP_PACING_GAIN_H; - bbr->cwnd_gain_h = NGTCP2_BBR_STARTUP_CWND_GAIN_H; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack) { - bbr_check_startup_full_bandwidth(bbr); - bbr_check_startup_high_loss(bbr, ack); +static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr) { + bbr_check_startup_high_loss(bbr); - if (bbr->state == NGTCP2_BBR_STATE_STARTUP && bbr->filled_pipe) { + if (bbr->state == NGTCP2_BBR_STATE_STARTUP && bbr->full_bw_reached) { bbr_enter_drain(bbr); } } @@ -468,8 +470,9 @@ static void bbr_update_model_and_state(ngtcp2_cc_bbr *bbr, bbr_update_latest_delivery_signals(bbr, cstat); bbr_update_congestion_signals(bbr, cstat, ack); bbr_update_ack_aggregation(bbr, cstat, ack, ts); - bbr_check_startup_done(bbr, ack); - bbr_check_drain(bbr, cstat, ts); + bbr_check_full_bw_reached(bbr, cstat); + bbr_check_startup_done(bbr); + bbr_check_drain_done(bbr, cstat, ts); bbr_update_probe_bw_cycle_phase(bbr, cstat, ack, ts); bbr_update_min_rtt(bbr, ack, ts); bbr_check_probe_rtt(bbr, cstat, ts); @@ -493,9 +496,9 @@ static void bbr_update_on_loss(ngtcp2_cc_bbr *cc, ngtcp2_conn_stat *cstat, static void bbr_update_latest_delivery_signals(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { bbr->loss_round_start = 0; - bbr->bw_latest = ngtcp2_max(bbr->bw_latest, cstat->delivery_rate_sec); + bbr->bw_latest = ngtcp2_max_uint64(bbr->bw_latest, cstat->delivery_rate_sec); bbr->inflight_latest = - ngtcp2_max(bbr->inflight_latest, bbr->rst->rs.delivered); + ngtcp2_max_uint64(bbr->inflight_latest, bbr->rst->rs.delivered); if (bbr->rst->rs.prior_delivered >= bbr->loss_round_delivered) { bbr->loss_round_delivered = bbr->rst->delivered; @@ -519,11 +522,6 @@ static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, if (ack->bytes_lost) { bbr->bytes_lost_in_round += ack->bytes_lost; ++bbr->loss_events_in_round; - - if (!bbr->loss_in_round) { - bbr->loss_in_round = 1; - bbr->loss_round_delivered = bbr->rst->delivered; - } } if (!bbr->loss_round_start) { @@ -537,7 +535,7 @@ static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, static void bbr_adapt_lower_bounds_from_congestion(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - if (bbr_is_in_probe_bw_state(bbr)) { + if (bbr_is_probing_bw(bbr)) { return; } @@ -558,16 +556,15 @@ static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { } static void bbr_loss_lower_bounds(ngtcp2_cc_bbr *bbr) { - bbr->bw_lo = ngtcp2_max(bbr->bw_latest, bbr->bw_lo * NGTCP2_BBR_BETA_NUMER / - NGTCP2_BBR_BETA_DENOM); - bbr->inflight_lo = ngtcp2_max(bbr->inflight_latest, - bbr->inflight_lo * NGTCP2_BBR_BETA_NUMER / - NGTCP2_BBR_BETA_DENOM); + bbr->bw_lo = ngtcp2_max_uint64( + bbr->bw_latest, bbr->bw_lo * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); + bbr->inflight_lo = ngtcp2_max_uint64( + bbr->inflight_latest, + bbr->inflight_lo * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } static void bbr_bound_bw_for_model(ngtcp2_cc_bbr *bbr) { - bbr->bw = ngtcp2_min(bbr->max_bw, bbr->bw_lo); - bbr->bw = ngtcp2_min(bbr->bw, bbr->bw_hi); + bbr->bw = ngtcp2_min_uint64(bbr->max_bw, bbr->bw_lo); } static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, @@ -617,6 +614,17 @@ static int bbr_is_in_probe_bw_state(ngtcp2_cc_bbr *bbr) { } } +static int bbr_is_probing_bw(ngtcp2_cc_bbr *bbr) { + switch (bbr->state) { + case NGTCP2_BBR_STATE_STARTUP: + case NGTCP2_BBR_STATE_PROBE_BW_REFILL: + case NGTCP2_BBR_STATE_PROBE_BW_UP: + return 1; + default: + return 0; + } +} + static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, @@ -632,8 +640,19 @@ static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, } bbr->extra_acked_delivered += ack->bytes_delivered; - extra = bbr->extra_acked_delivered - expected_delivered; - extra = ngtcp2_min(extra, cstat->cwnd); + + if (bbr->extra_acked_delivered <= expected_delivered) { + extra = 0; + } else { + extra = bbr->extra_acked_delivered - expected_delivered; + extra = ngtcp2_min_uint64(extra, cstat->cwnd); + } + + if (bbr->full_bw_reached) { + bbr->extra_acked_filter.window_length = NGTCP2_BBR_EXTRA_ACKED_FILTERLEN; + } else { + bbr->extra_acked_filter.window_length = 1; + } ngtcp2_window_filter_update(&bbr->extra_acked_filter, extra, bbr->round_count); @@ -645,14 +664,14 @@ static void bbr_enter_drain(ngtcp2_cc_bbr *bbr) { ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, "bbr enter Drain"); bbr->state = NGTCP2_BBR_STATE_DRAIN; - bbr->pacing_gain_h = 100 * 100 / NGTCP2_BBR_STARTUP_CWND_GAIN_H; - bbr->cwnd_gain_h = NGTCP2_BBR_STARTUP_CWND_GAIN_H; + bbr->pacing_gain_h = NGTCP2_BBR_DRAIN_PACING_GAIN_H; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_check_drain(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { if (bbr->state == NGTCP2_BBR_STATE_DRAIN && - cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, bbr->bw, 100)) { + cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100)) { bbr_enter_probe_bw(bbr, ts); } } @@ -677,7 +696,7 @@ static void bbr_start_probe_bw_down(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_DOWN; bbr->pacing_gain_h = 90; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr) { @@ -686,7 +705,7 @@ static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_CRUISE; bbr->pacing_gain_h = 100; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { @@ -703,18 +722,18 @@ static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_REFILL; bbr->pacing_gain_h = 100; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, "bbr start ProbeBW_UP"); bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STARTING; bbr_start_round(bbr); + bbr_reset_full_bw(bbr); - bbr->cycle_stamp = ts; + bbr->full_bw = cstat->delivery_rate_sec; bbr->state = NGTCP2_BBR_STATE_PROBE_BW_UP; bbr->pacing_gain_h = 125; bbr->cwnd_gain_h = 225; @@ -726,7 +745,7 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { - if (!bbr->filled_pipe) { + if (!bbr->full_bw_reached) { return; } @@ -738,17 +757,17 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, switch (bbr->state) { case NGTCP2_BBR_STATE_PROBE_BW_DOWN: - if (bbr_check_time_to_probe_bw(bbr, cstat, ts)) { + if (bbr_is_time_to_probe_bw(bbr, cstat, ts)) { return; } - if (bbr_check_time_to_cruise(bbr, cstat, ts)) { + if (bbr_is_time_to_cruise(bbr, cstat, ts)) { bbr_start_probe_bw_cruise(bbr); } break; case NGTCP2_BBR_STATE_PROBE_BW_CRUISE: - if (bbr_check_time_to_probe_bw(bbr, cstat, ts)) { + if (bbr_is_time_to_probe_bw(bbr, cstat, ts)) { return; } @@ -756,13 +775,12 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, case NGTCP2_BBR_STATE_PROBE_BW_REFILL: if (bbr->round_start) { bbr->bw_probe_samples = 1; - bbr_start_probe_bw_up(bbr, cstat, ts); + bbr_start_probe_bw_up(bbr, cstat); } break; case NGTCP2_BBR_STATE_PROBE_BW_UP: - if (bbr_has_elapsed_in_phase(bbr, bbr->min_rtt, ts) && - cstat->bytes_in_flight > bbr_inflight(bbr, cstat, bbr->max_bw, 125)) { + if (bbr_is_time_to_go_down(bbr, cstat)) { bbr_start_probe_bw_down(bbr, ts); } @@ -772,15 +790,26 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, } } -static int bbr_check_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { (void)ts; if (cstat->bytes_in_flight > bbr_inflight_with_headroom(bbr, cstat)) { return 0; } - if (cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, bbr->max_bw, 100)) { + if (cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100)) { + return 1; + } + + return 0; +} + +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { + if (bbr->rst->is_cwnd_limited && cstat->cwnd >= bbr->inflight_hi) { + bbr_reset_full_bw(bbr); + bbr->full_bw = cstat->delivery_rate_sec; + } else if (bbr->full_bw_now) { return 1; } @@ -801,13 +830,13 @@ static uint64_t bbr_inflight_with_headroom(ngtcp2_cc_bbr *bbr, return UINT64_MAX; } - headroom = ngtcp2_max(cstat->max_tx_udp_payload_size, - bbr->inflight_hi * NGTCP2_BBR_HEADROOM_NUMER / - NGTCP2_BBR_HEADROOM_DENOM); + headroom = ngtcp2_max_uint64(cstat->max_tx_udp_payload_size, + bbr->inflight_hi * NGTCP2_BBR_HEADROOM_NUMER / + NGTCP2_BBR_HEADROOM_DENOM); mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); if (bbr->inflight_hi > headroom) { - return ngtcp2_max(bbr->inflight_hi - headroom, mpcwnd); + return ngtcp2_max_uint64(bbr->inflight_hi - headroom, mpcwnd); } return mpcwnd; @@ -818,9 +847,8 @@ static void bbr_raise_inflight_hi_slope(ngtcp2_cc_bbr *bbr, uint64_t growth_this_round = cstat->max_tx_udp_payload_size << bbr->bw_probe_up_rounds; - bbr->bw_probe_up_rounds = ngtcp2_min(bbr->bw_probe_up_rounds + 1, 30); - bbr->probe_up_cnt = ngtcp2_max(cstat->cwnd / growth_this_round, 1) * - cstat->max_tx_udp_payload_size; + bbr->bw_probe_up_rounds = ngtcp2_min_size(bbr->bw_probe_up_rounds + 1, 30); + bbr->probe_up_cnt = ngtcp2_max_uint64(cstat->cwnd / growth_this_round, 1); } static void bbr_probe_inflight_hi_upward(ngtcp2_cc_bbr *bbr, @@ -834,10 +862,12 @@ static void bbr_probe_inflight_hi_upward(ngtcp2_cc_bbr *bbr, bbr->bw_probe_up_acks += ack->bytes_delivered; - if (bbr->bw_probe_up_acks >= bbr->probe_up_cnt) { + if (bbr->probe_up_cnt != UINT64_MAX && + bbr->bw_probe_up_acks >= + bbr->probe_up_cnt * cstat->max_tx_udp_payload_size) { delta = bbr->bw_probe_up_acks / bbr->probe_up_cnt; bbr->bw_probe_up_acks -= delta * bbr->probe_up_cnt; - bbr->inflight_hi += delta * cstat->max_tx_udp_payload_size; + bbr->inflight_hi += delta; } if (bbr->round_start) { @@ -860,8 +890,7 @@ static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, } if (!bbr_check_inflight_too_high(bbr, cstat, ts)) { - /* bbr->bw_hi never be updated */ - if (bbr->inflight_hi == UINT64_MAX /* || bbr->bw_hi == UINT64_MAX */) { + if (bbr->inflight_hi == UINT64_MAX) { return; } @@ -869,19 +898,14 @@ static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->inflight_hi = bbr->rst->rs.tx_in_flight; } - if (cstat->delivery_rate_sec > bbr->bw_hi) { - bbr->bw_hi = cstat->delivery_rate_sec; - } - if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { bbr_probe_inflight_hi_upward(bbr, cstat, ack); } } } -static int bbr_check_time_to_probe_bw(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { if (bbr_has_elapsed_in_phase(bbr, bbr->bw_probe_wait, ts) || bbr_is_reno_coexistence_probe_time(bbr, cstat)) { bbr_start_probe_bw_refill(bbr); @@ -901,23 +925,20 @@ static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr) { bbr->rand(&rand, 1, &bbr->rand_ctx); - bbr->bw_probe_wait = - 2 * NGTCP2_SECONDS + (ngtcp2_tstamp)(NGTCP2_SECONDS * rand / 255); + bbr->bw_probe_wait = 2 * NGTCP2_SECONDS + NGTCP2_SECONDS * rand / 255; } static int bbr_is_reno_coexistence_probe_time(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { uint64_t reno_rounds = - bbr_target_inflight(bbr, cstat) / cstat->max_tx_udp_payload_size; + bbr_target_inflight(bbr, cstat) / cstat->max_tx_udp_payload_size; - return bbr->rounds_since_bw_probe >= ngtcp2_min(reno_rounds, 63); + return bbr->rounds_since_bw_probe >= ngtcp2_min_uint64(reno_rounds, 63); } static uint64_t bbr_target_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - uint64_t bdp = bbr_inflight(bbr, cstat, bbr->bw, 100); - - return ngtcp2_min(bdp, cstat->cwnd); + return ngtcp2_min_uint64(bbr->bdp, cstat->cwnd); } static int bbr_check_inflight_too_high(ngtcp2_cc_bbr *bbr, @@ -946,9 +967,9 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, bbr->bw_probe_samples = 0; if (!rs->is_app_limited) { - bbr->inflight_hi = ngtcp2_max( - rs->tx_in_flight, bbr_target_inflight(bbr, cstat) * - NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); + bbr->inflight_hi = ngtcp2_max_uint64( + rs->tx_in_flight, bbr_target_inflight(bbr, cstat) * + NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { @@ -956,16 +977,27 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, } } +static void bbr_note_loss(ngtcp2_cc_bbr *bbr) { + if (!bbr->loss_in_round) { + bbr->loss_round_delivered = bbr->rst->delivered; + } + + bbr->loss_in_round = 1; +} + static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { ngtcp2_rs rs = {0}; + bbr_note_loss(bbr); + if (!bbr->bw_probe_samples) { return; } rs.tx_in_flight = pkt->tx_in_flight; /* bbr->rst->lost is not incremented for pkt yet */ + assert(bbr->rst->lost + pkt->pktlen >= pkt->lost); rs.lost = bbr->rst->lost + pkt->pktlen - pkt->lost; rs.is_app_limited = pkt->is_app_limited; @@ -1007,7 +1039,7 @@ static void bbr_update_min_rtt(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack, int min_rtt_expired; bbr->probe_rtt_expired = - ts > bbr->probe_rtt_min_stamp + NGTCP2_BBR_PROBE_RTT_INTERVAL; + ts > bbr->probe_rtt_min_stamp + NGTCP2_BBR_PROBE_RTT_INTERVAL; if (ack->rtt != UINT64_MAX && (ack->rtt < bbr->probe_rtt_min_delay || bbr->probe_rtt_expired)) { @@ -1106,7 +1138,7 @@ static void bbr_mark_connection_app_limited(ngtcp2_cc_bbr *bbr, static void bbr_exit_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { bbr_reset_lower_bounds(bbr); - if (bbr->filled_pipe) { + if (bbr->full_bw_reached) { bbr_start_probe_bw_down(bbr, ts); bbr_start_probe_bw_cruise(bbr); } else { @@ -1131,17 +1163,14 @@ static void bbr_handle_restart_from_idle(ngtcp2_cc_bbr *bbr, } } -static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t bw, - uint64_t gain_h) { - uint64_t bdp; - +static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h) { if (bbr->min_rtt == UINT64_MAX) { return bbr->initial_cwnd; } - bdp = bw * bbr->min_rtt / NGTCP2_SECONDS; + bbr->bdp = ngtcp2_max_uint64(bbr->bw * bbr->min_rtt / NGTCP2_SECONDS, 1); - return (uint64_t)(bdp * gain_h / 100); + return (uint64_t)(bbr->bdp * gain_h / 100); } static uint64_t min_pipe_cwnd(size_t max_udp_payload_size) { @@ -1153,9 +1182,9 @@ static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, uint64_t inflight) { bbr_update_offload_budget(bbr, cstat); - inflight = ngtcp2_max(inflight, bbr->offload_budget); + inflight = ngtcp2_max_uint64(inflight, bbr->offload_budget); inflight = - ngtcp2_max(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + ngtcp2_max_uint64(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { inflight += 2 * cstat->max_tx_udp_payload_size; @@ -1165,8 +1194,8 @@ static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, } static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - uint64_t bw, uint64_t gain_h) { - uint64_t inflight = bbr_bdp_multiple(bbr, bw, gain_h); + uint64_t gain_h) { + uint64_t inflight = bbr_bdp_multiple(bbr, gain_h); return bbr_quantization_budget(bbr, cstat, inflight); } @@ -1178,8 +1207,7 @@ static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, /* Not documented */ /* bbr_update_aggregation_budget(bbr); */ - inflight = - bbr_bdp_multiple(bbr, bbr->bw, bbr->cwnd_gain_h) + bbr->extra_acked; + inflight = bbr_bdp_multiple(bbr, bbr->cwnd_gain_h) + bbr->extra_acked; bbr->max_inflight = bbr_quantization_budget(bbr, cstat, inflight); } @@ -1192,44 +1220,26 @@ static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr) { ++bbr->cycle_count; } -static void bbr_modulate_cwnd_for_recovery(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack) { - if (ack->bytes_lost > 0) { - if (cstat->cwnd > ack->bytes_lost) { - cstat->cwnd -= ack->bytes_lost; - cstat->cwnd = ngtcp2_max(cstat->cwnd, 2 * cstat->max_tx_udp_payload_size); - } else { - cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; - } - } - - if (bbr->packet_conservation) { - cstat->cwnd = - ngtcp2_max(cstat->cwnd, cstat->bytes_in_flight + ack->bytes_delivered); - } -} - static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { if (!bbr->in_loss_recovery && bbr->state != NGTCP2_BBR_STATE_PROBE_RTT) { bbr->prior_cwnd = cstat->cwnd; return; } - bbr->prior_cwnd = ngtcp2_max(bbr->prior_cwnd, cstat->cwnd); + bbr->prior_cwnd = ngtcp2_max_uint64(bbr->prior_cwnd, cstat->cwnd); } static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - cstat->cwnd = ngtcp2_max(cstat->cwnd, bbr->prior_cwnd); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, bbr->prior_cwnd); } static uint64_t bbr_probe_rtt_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { uint64_t probe_rtt_cwnd = - bbr_bdp_multiple(bbr, bbr->bw, NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H); + bbr_bdp_multiple(bbr, NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H); uint64_t mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - return ngtcp2_max(probe_rtt_cwnd, mpcwnd); + return ngtcp2_max_uint64(probe_rtt_cwnd, mpcwnd); } static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, @@ -1239,7 +1249,7 @@ static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, if (bbr->state == NGTCP2_BBR_STATE_PROBE_RTT) { probe_rtt_cwnd = bbr_probe_rtt_cwnd(bbr, cstat); - cstat->cwnd = ngtcp2_min(cstat->cwnd, probe_rtt_cwnd); + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, probe_rtt_cwnd); } } @@ -1248,21 +1258,18 @@ static void bbr_set_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t mpcwnd; bbr_update_max_inflight(bbr, cstat); - bbr_modulate_cwnd_for_recovery(bbr, cstat, ack); - - if (!bbr->packet_conservation) { - if (bbr->filled_pipe) { - cstat->cwnd += ack->bytes_delivered; - cstat->cwnd = ngtcp2_min(cstat->cwnd, bbr->max_inflight); - } else if (cstat->cwnd < bbr->max_inflight || - bbr->rst->delivered < bbr->initial_cwnd) { - cstat->cwnd += ack->bytes_delivered; - } - mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - cstat->cwnd = ngtcp2_max(cstat->cwnd, mpcwnd); + if (bbr->full_bw_reached) { + cstat->cwnd += ack->bytes_delivered; + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, bbr->max_inflight); + } else if (cstat->cwnd < bbr->max_inflight || + bbr->rst->delivered < bbr->initial_cwnd) { + cstat->cwnd += ack->bytes_delivered; } + mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, mpcwnd); + bbr_bound_cwnd_for_probe_rtt(bbr, cstat); bbr_bound_cwnd_for_model(bbr, cstat); } @@ -1280,30 +1287,23 @@ static void bbr_bound_cwnd_for_model(ngtcp2_cc_bbr *bbr, cap = bbr_inflight_with_headroom(bbr, cstat); } - cap = ngtcp2_min(cap, bbr->inflight_lo); - cap = ngtcp2_max(cap, mpcwnd); + cap = ngtcp2_min_uint64(cap, bbr->inflight_lo); + cap = ngtcp2_max_uint64(cap, mpcwnd); - cstat->cwnd = ngtcp2_min(cstat->cwnd, cap); + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, cap); } static void bbr_set_send_quantum(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - size_t floor, send_quantum; + size_t send_quantum = 64 * 1024; (void)bbr; - if (cstat->pacing_interval > (NGTCP2_SECONDS * 8 * 10 / 12) >> 20) { - floor = cstat->max_tx_udp_payload_size; - } else { - floor = 2 * cstat->max_tx_udp_payload_size; - } - if (cstat->pacing_interval) { - send_quantum = (size_t)(NGTCP2_MILLISECONDS / cstat->pacing_interval); - send_quantum = ngtcp2_min(send_quantum, 64 * 1024); - } else { - send_quantum = 64 * 1024; + send_quantum = ngtcp2_min_size( + send_quantum, (size_t)(NGTCP2_MILLISECONDS / cstat->pacing_interval)); } - cstat->send_quantum = ngtcp2_max(send_quantum, floor); + cstat->send_quantum = + ngtcp2_max_size(send_quantum, 2 * cstat->max_tx_udp_payload_size); } static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, @@ -1313,16 +1313,12 @@ static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, } static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { + const ngtcp2_cc_ack *ack) { if (bbr->in_loss_recovery) { - if (ts - cstat->congestion_recovery_start_ts >= cstat->smoothed_rtt) { - bbr->packet_conservation = 0; - } - if (ack->largest_pkt_sent_ts != UINT64_MAX && !in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_restore_cwnd(bbr, cstat); } @@ -1331,18 +1327,15 @@ static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, if (bbr->congestion_recovery_start_ts != UINT64_MAX) { bbr->in_loss_recovery = 1; + bbr->round_count_at_recovery = + bbr->round_start ? bbr->round_count : bbr->round_count + 1; bbr_save_cwnd(bbr, cstat); cstat->cwnd = - cstat->bytes_in_flight + - ngtcp2_max(ack->bytes_delivered, cstat->max_tx_udp_payload_size); + cstat->bytes_in_flight + + ngtcp2_max_uint64(ack->bytes_delivered, cstat->max_tx_udp_payload_size); cstat->congestion_recovery_start_ts = bbr->congestion_recovery_start_ts; bbr->congestion_recovery_start_ts = UINT64_MAX; - bbr->packet_conservation = 1; - bbr->congestion_recovery_next_round_delivered = bbr->rst->delivered; - bbr->prior_inflight_hi = bbr->inflight_hi; - bbr->prior_inflight_lo = bbr->inflight_lo; - bbr->prior_bw_lo = bbr->bw_lo; } } @@ -1354,8 +1347,10 @@ static void bbr_cc_on_pkt_lost(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, } static void bbr_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp sent_ts, ngtcp2_tstamp ts) { + ngtcp2_tstamp sent_ts, uint64_t bytes_lost, + ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); + (void)bytes_lost; if (bbr->in_loss_recovery || bbr->congestion_recovery_start_ts != UINT64_MAX || @@ -1377,13 +1372,8 @@ static void bbr_cc_on_spurious_congestion(ngtcp2_cc *cc, if (bbr->in_loss_recovery) { bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_restore_cwnd(bbr, cstat); - bbr->full_bw_count = 0; - bbr->loss_in_round = 0; - bbr->inflight_lo = ngtcp2_max(bbr->inflight_lo, bbr->prior_inflight_lo); - bbr->inflight_hi = ngtcp2_max(bbr->inflight_hi, bbr->prior_inflight_hi); - bbr->bw_lo = ngtcp2_max(bbr->bw_lo, bbr->prior_bw_lo); } } @@ -1396,19 +1386,19 @@ static void bbr_cc_on_persistent_congestion(ngtcp2_cc *cc, cstat->congestion_recovery_start_ts = UINT64_MAX; bbr->congestion_recovery_start_ts = UINT64_MAX; bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_save_cwnd(bbr, cstat); cstat->cwnd = cstat->bytes_in_flight + cstat->max_tx_udp_payload_size; - cstat->cwnd = - ngtcp2_max(cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + cstat->cwnd = ngtcp2_max_uint64( + cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); } static void bbr_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); - bbr_handle_recovery(bbr, cstat, ack, ts); + bbr_handle_recovery(bbr, cstat, ack); bbr_update_on_ack(bbr, cstat, ack, ts); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h index 0017be35010e66..74eb2d640bd3f2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -95,9 +95,10 @@ typedef struct ngtcp2_cc_bbr { uint64_t round_count; /* Full pipe */ - int filled_pipe; uint64_t full_bw; size_t full_bw_count; + int full_bw_reached; + int full_bw_now; /* Pacing rate */ uint64_t pacing_gain_h; @@ -123,19 +124,14 @@ typedef struct ngtcp2_cc_bbr { size_t bw_probe_up_rounds; uint64_t bw_probe_up_acks; uint64_t inflight_hi; - uint64_t bw_hi; int probe_rtt_expired; ngtcp2_duration probe_rtt_min_delay; ngtcp2_tstamp probe_rtt_min_stamp; int in_loss_recovery; - int packet_conservation; + uint64_t round_count_at_recovery; uint64_t max_inflight; ngtcp2_tstamp congestion_recovery_start_ts; - uint64_t congestion_recovery_next_round_delivered; - - uint64_t prior_inflight_lo; - uint64_t prior_inflight_hi; - uint64_t prior_bw_lo; + uint64_t bdp; } ngtcp2_cc_bbr; void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, @@ -143,4 +139,4 @@ void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, ngtcp2_tstamp initial_ts, ngtcp2_rand rand, const ngtcp2_rand_ctx *rand_ctx); -#endif /* NGTCP2_BBR_H */ +#endif /* !defined(NGTCP2_BBR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h index 85b5f4ddf0464a..e87adb119916ca 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -105,4 +105,4 @@ int ngtcp2_buf_chain_new(ngtcp2_buf_chain **pbufchain, size_t len, */ void ngtcp2_buf_chain_del(ngtcp2_buf_chain *bufchain, const ngtcp2_mem *mem); -#endif /* NGTCP2_BUF_H */ +#endif /* !defined(NGTCP2_BUF_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c index 9ad37fbdb6395a..508a5d9ec1d8a7 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c @@ -32,16 +32,13 @@ #include "ngtcp2_mem.h" #include "ngtcp2_rcvry.h" #include "ngtcp2_conn_stat.h" +#include "ngtcp2_rst.h" #include "ngtcp2_unreachable.h" -/* NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN is the window length of - delivery rate filter driven by ACK clocking. */ -#define NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN 10 - uint64_t ngtcp2_cc_compute_initcwnd(size_t max_udp_payload_size) { uint64_t n = 2 * max_udp_payload_size; - n = ngtcp2_max(n, 14720); - return ngtcp2_min(10 * max_udp_payload_size, n); + n = ngtcp2_max_uint64(n, 14720); + return ngtcp2_min_uint64(10 * max_udp_payload_size, n); } ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, @@ -59,13 +56,7 @@ ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, return pkt; } -static void reno_cc_reset(ngtcp2_cc_reno *reno) { - ngtcp2_window_filter_init(&reno->delivery_rate_sec_filter, - NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN); - reno->ack_count = 0; - reno->target_cwnd = 0; - reno->pending_add = 0; -} +static void reno_cc_reset(ngtcp2_cc_reno *reno) { reno->pending_add = 0; } void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { memset(reno, 0, sizeof(*reno)); @@ -74,8 +65,7 @@ void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { reno->cc.on_pkt_acked = ngtcp2_cc_reno_cc_on_pkt_acked; reno->cc.congestion_event = ngtcp2_cc_reno_cc_congestion_event; reno->cc.on_persistent_congestion = - ngtcp2_cc_reno_cc_on_persistent_congestion; - reno->cc.on_ack_recv = ngtcp2_cc_reno_cc_on_ack_recv; + ngtcp2_cc_reno_cc_on_persistent_congestion; reno->cc.reset = ngtcp2_cc_reno_cc_reset; reno_cc_reset(reno); @@ -94,11 +84,7 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, uint64_t m; (void)ts; - if (in_congestion_recovery(cstat, pkt->sent_ts)) { - return; - } - - if (reno->target_cwnd && reno->target_cwnd < cstat->cwnd) { + if (in_congestion_recovery(cstat, pkt->sent_ts) || pkt->is_app_limited) { return; } @@ -118,9 +104,10 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts) { + uint64_t bytes_lost, ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); uint64_t min_cwnd; + (void)bytes_lost; if (in_congestion_recovery(cstat, sent_ts)) { return; @@ -129,7 +116,7 @@ void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cstat->congestion_recovery_start_ts = ts; cstat->cwnd >>= NGTCP2_LOSS_REDUCTION_FACTOR_BITS; min_cwnd = 2 * cstat->max_tx_udp_payload_size; - cstat->cwnd = ngtcp2_max(cstat->cwnd, min_cwnd); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, min_cwnd); cstat->ssthresh = cstat->cwnd; reno->pending_add = 0; @@ -149,35 +136,6 @@ void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, cstat->congestion_recovery_start_ts = UINT64_MAX; } -void ngtcp2_cc_reno_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { - ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); - uint64_t target_cwnd, initcwnd; - uint64_t max_delivery_rate_sec; - (void)ack; - (void)ts; - - ++reno->ack_count; - - ngtcp2_window_filter_update(&reno->delivery_rate_sec_filter, - cstat->delivery_rate_sec, reno->ack_count); - - max_delivery_rate_sec = - ngtcp2_window_filter_get_best(&reno->delivery_rate_sec_filter); - - if (cstat->min_rtt != UINT64_MAX && max_delivery_rate_sec) { - target_cwnd = max_delivery_rate_sec * cstat->smoothed_rtt / NGTCP2_SECONDS; - initcwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); - reno->target_cwnd = ngtcp2_max(initcwnd, target_cwnd) * 289 / 100; - - ngtcp2_log_info(reno->cc.log, NGTCP2_LOG_EVENT_CCA, - "target_cwnd=%" PRIu64 " max_delivery_rate_sec=%" PRIu64 - " smoothed_rtt=%" PRIu64, - reno->target_cwnd, max_delivery_rate_sec, - cstat->smoothed_rtt); - } -} - void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); @@ -187,45 +145,49 @@ void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, reno_cc_reset(reno); } +static void cubic_vars_reset(ngtcp2_cubic_vars *v) { + v->cwnd_prior = 0; + v->w_max = 0; + v->k = 0; + v->epoch_start = UINT64_MAX; + v->w_est = 0; + + v->state = NGTCP2_CUBIC_STATE_INITIAL; + v->app_limited_start_ts = UINT64_MAX; + v->app_limited_duration = 0; + v->pending_bytes_delivered = 0; + v->pending_est_bytes_delivered = 0; +} + static void cubic_cc_reset(ngtcp2_cc_cubic *cubic) { - ngtcp2_window_filter_init(&cubic->delivery_rate_sec_filter, - NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN); - cubic->ack_count = 0; - cubic->target_cwnd = 0; - cubic->w_last_max = 0; - cubic->w_tcp = 0; - cubic->origin_point = 0; - cubic->epoch_start = UINT64_MAX; - cubic->k = 0; - - cubic->prior.cwnd = 0; - cubic->prior.ssthresh = 0; - cubic->prior.w_last_max = 0; - cubic->prior.w_tcp = 0; - cubic->prior.origin_point = 0; - cubic->prior.epoch_start = UINT64_MAX; - cubic->prior.k = 0; - - cubic->rtt_sample_count = 0; - cubic->current_round_min_rtt = UINT64_MAX; - cubic->last_round_min_rtt = UINT64_MAX; - cubic->window_end = -1; + cubic_vars_reset(&cubic->current); + cubic_vars_reset(&cubic->undo.v); + cubic->undo.cwnd = 0; + cubic->undo.ssthresh = 0; + + cubic->hs.current_round_min_rtt = UINT64_MAX; + cubic->hs.last_round_min_rtt = UINT64_MAX; + cubic->hs.curr_rtt = UINT64_MAX; + cubic->hs.rtt_sample_count = 0; + cubic->hs.css_baseline_min_rtt = UINT64_MAX; + cubic->hs.css_round = 0; + + cubic->next_round_delivered = 0; } -void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log) { +void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log, + ngtcp2_rst *rst) { memset(cubic, 0, sizeof(*cubic)); cubic->cc.log = log; - cubic->cc.on_pkt_acked = ngtcp2_cc_cubic_cc_on_pkt_acked; + cubic->cc.on_ack_recv = ngtcp2_cc_cubic_cc_on_ack_recv; cubic->cc.congestion_event = ngtcp2_cc_cubic_cc_congestion_event; cubic->cc.on_spurious_congestion = ngtcp2_cc_cubic_cc_on_spurious_congestion; cubic->cc.on_persistent_congestion = - ngtcp2_cc_cubic_cc_on_persistent_congestion; - cubic->cc.on_ack_recv = ngtcp2_cc_cubic_cc_on_ack_recv; - cubic->cc.on_pkt_sent = ngtcp2_cc_cubic_cc_on_pkt_sent; - cubic->cc.new_rtt_sample = ngtcp2_cc_cubic_cc_new_rtt_sample; + ngtcp2_cc_cubic_cc_on_persistent_congestion; cubic->cc.reset = ngtcp2_cc_cubic_cc_reset; - cubic->cc.event = ngtcp2_cc_cubic_cc_event; + + cubic->rst = rst; cubic_cc_reset(cubic); } @@ -254,191 +216,252 @@ uint64_t ngtcp2_cbrt(uint64_t n) { return y; } -/* HyStart++ constants */ -#define NGTCP2_HS_MIN_SSTHRESH 16 +/* RFC 9406 HyStart++ constants */ +#define NGTCP2_HS_MIN_RTT_THRESH (4 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_MAX_RTT_THRESH (16 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_MIN_RTT_DIVISOR 8 #define NGTCP2_HS_N_RTT_SAMPLE 8 -#define NGTCP2_HS_MIN_ETA (4 * NGTCP2_MILLISECONDS) -#define NGTCP2_HS_MAX_ETA (16 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_CSS_GROWTH_DIVISOR 4 +#define NGTCP2_HS_CSS_ROUNDS 5 + +static uint64_t cubic_cc_compute_w_cubic(ngtcp2_cc_cubic *cubic, + const ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { + ngtcp2_duration t = ts - cubic->current.epoch_start; + uint64_t delta; + uint64_t tx = (t << 10) / NGTCP2_SECONDS; + uint64_t kx = (cubic->current.k << 10) / NGTCP2_SECONDS; + uint64_t time_delta; + + if (tx < kx) { + return UINT64_MAX; + } + + time_delta = tx - kx; + + delta = cstat->max_tx_udp_payload_size * + ((((time_delta * time_delta) >> 10) * time_delta) >> 10) * 4 / 10; -void ngtcp2_cc_cubic_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, - ngtcp2_tstamp ts) { + return cubic->current.w_max + (delta >> 10); +} + +void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack, + ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - ngtcp2_duration t, eta; - uint64_t target, cwnd_thres; - uint64_t tx, kx, time_delta, delta; - uint64_t add, tcp_add; - uint64_t m; + uint64_t w_cubic, w_cubic_next, target, m; + ngtcp2_duration rtt_thresh; + int round_start; + int is_app_limited = + cubic->rst->rs.is_app_limited && !cubic->rst->is_cwnd_limited; - if (pkt->pktns_id == NGTCP2_PKTNS_ID_APPLICATION && cubic->window_end != -1 && - cubic->window_end <= pkt->pkt_num) { - cubic->window_end = -1; + if (in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { + return; } - if (in_congestion_recovery(cstat, pkt->sent_ts)) { + if (cubic->current.state == NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE) { + if (is_app_limited) { + if (cubic->current.app_limited_start_ts == UINT64_MAX) { + cubic->current.app_limited_start_ts = ts; + } + + return; + } + + if (cubic->current.app_limited_start_ts != UINT64_MAX) { + cubic->current.app_limited_duration += + ts - cubic->current.app_limited_start_ts; + cubic->current.app_limited_start_ts = UINT64_MAX; + } + } else if (is_app_limited) { return; } + round_start = ack->pkt_delivered >= cubic->next_round_delivered; + if (round_start) { + cubic->next_round_delivered = cubic->rst->delivered; + + cubic->rst->is_cwnd_limited = 0; + } + if (cstat->cwnd < cstat->ssthresh) { /* slow-start */ - if (cubic->target_cwnd == 0 || cubic->target_cwnd > cstat->cwnd) { - cstat->cwnd += pkt->pktlen; + if (cubic->hs.css_round) { + cstat->cwnd += ack->bytes_delivered / NGTCP2_HS_CSS_GROWTH_DIVISOR; + } else { + cstat->cwnd += ack->bytes_delivered; } ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "pkn=%" PRId64 " acked, slow start cwnd=%" PRIu64, - pkt->pkt_num, cstat->cwnd); + "%" PRIu64 " bytes acked, slow start cwnd=%" PRIu64, + ack->bytes_delivered, cstat->cwnd); + + if (round_start) { + cubic->hs.last_round_min_rtt = cubic->hs.current_round_min_rtt; + cubic->hs.current_round_min_rtt = UINT64_MAX; + cubic->hs.rtt_sample_count = 0; - if (cubic->last_round_min_rtt != UINT64_MAX && - cubic->current_round_min_rtt != UINT64_MAX && - cstat->cwnd >= - NGTCP2_HS_MIN_SSTHRESH * cstat->max_tx_udp_payload_size && - cubic->rtt_sample_count >= NGTCP2_HS_N_RTT_SAMPLE) { - eta = cubic->last_round_min_rtt / 8; - - if (eta < NGTCP2_HS_MIN_ETA) { - eta = NGTCP2_HS_MIN_ETA; - } else if (eta > NGTCP2_HS_MAX_ETA) { - eta = NGTCP2_HS_MAX_ETA; + if (cubic->hs.css_round) { + ++cubic->hs.css_round; } + } + + cubic->hs.current_round_min_rtt = + ngtcp2_min_uint64(cubic->hs.current_round_min_rtt, ack->rtt); + ++cubic->hs.rtt_sample_count; - if (cubic->current_round_min_rtt >= cubic->last_round_min_rtt + eta) { + if (cubic->hs.css_round) { + if (cubic->hs.current_round_min_rtt < cubic->hs.css_baseline_min_rtt) { + cubic->hs.css_baseline_min_rtt = UINT64_MAX; + cubic->hs.css_round = 0; + return; + } + + if (cubic->hs.css_round >= NGTCP2_HS_CSS_ROUNDS) { ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, "HyStart++ exit slow start"); - cubic->w_last_max = cstat->cwnd; cstat->ssthresh = cstat->cwnd; } - } - - return; - } - /* congestion avoidance */ - - if (cubic->epoch_start == UINT64_MAX) { - cubic->epoch_start = ts; - if (cstat->cwnd < cubic->w_last_max) { - cubic->k = ngtcp2_cbrt((cubic->w_last_max - cstat->cwnd) * 10 / 4 / - cstat->max_tx_udp_payload_size); - cubic->origin_point = cubic->w_last_max; - } else { - cubic->k = 0; - cubic->origin_point = cstat->cwnd; + return; } - cubic->w_tcp = cstat->cwnd; - - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "cubic-ca epoch_start=%" PRIu64 " k=%" PRIu64 - " origin_point=%" PRIu64, - cubic->epoch_start, cubic->k, cubic->origin_point); + if (cubic->hs.rtt_sample_count >= NGTCP2_HS_N_RTT_SAMPLE && + cubic->hs.current_round_min_rtt != UINT64_MAX && + cubic->hs.last_round_min_rtt != UINT64_MAX) { + rtt_thresh = + ngtcp2_max_uint64(NGTCP2_HS_MIN_RTT_THRESH, + ngtcp2_min_uint64(cubic->hs.last_round_min_rtt / + NGTCP2_HS_MIN_RTT_DIVISOR, + NGTCP2_HS_MAX_RTT_THRESH)); + + if (cubic->hs.current_round_min_rtt >= + cubic->hs.last_round_min_rtt + rtt_thresh) { + cubic->hs.css_baseline_min_rtt = cubic->hs.current_round_min_rtt; + cubic->hs.css_round = 1; + } + } - cubic->pending_add = 0; - cubic->pending_w_add = 0; + return; } - t = ts - cubic->epoch_start; - - tx = (t << 10) / NGTCP2_SECONDS; - kx = (cubic->k << 10); + /* congestion avoidance */ - if (tx > kx) { - time_delta = tx - kx; - } else { - time_delta = kx - tx; + switch (cubic->current.state) { + case NGTCP2_CUBIC_STATE_INITIAL: + m = cstat->max_tx_udp_payload_size * ack->bytes_delivered + + cubic->current.pending_bytes_delivered; + cstat->cwnd += m / cstat->cwnd; + cubic->current.pending_bytes_delivered = m % cstat->cwnd; + return; + case NGTCP2_CUBIC_STATE_RECOVERY: + cubic->current.state = NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE; + cubic->current.epoch_start = ts; + break; + default: + break; } - delta = cstat->max_tx_udp_payload_size * - ((((time_delta * time_delta) >> 10) * time_delta) >> 10) * 4 / 10; - delta >>= 10; - - if (tx > kx) { - target = cubic->origin_point + delta; - } else { - target = cubic->origin_point - delta; - } + w_cubic = cubic_cc_compute_w_cubic(cubic, cstat, + ts - cubic->current.app_limited_duration); + w_cubic_next = cubic_cc_compute_w_cubic( + cubic, cstat, + ts - cubic->current.app_limited_duration + cstat->smoothed_rtt); - cwnd_thres = - (target * (((t + cstat->smoothed_rtt) << 10) / NGTCP2_SECONDS)) >> 10; - if (cwnd_thres < cstat->cwnd) { + if (w_cubic_next == UINT64_MAX || w_cubic_next < cstat->cwnd) { target = cstat->cwnd; - } else if (2 * cwnd_thres > 3 * cstat->cwnd) { + } else if (2 * w_cubic_next > 3 * cstat->cwnd) { target = cstat->cwnd * 3 / 2; } else { - target = cwnd_thres; + target = w_cubic_next; } - if (target > cstat->cwnd) { - m = cubic->pending_add + - cstat->max_tx_udp_payload_size * (target - cstat->cwnd); - add = m / cstat->cwnd; - cubic->pending_add = m % cstat->cwnd; - } else { - m = cubic->pending_add + cstat->max_tx_udp_payload_size; - add = m / (100 * cstat->cwnd); - cubic->pending_add = m % (100 * cstat->cwnd); - } - - m = cubic->pending_w_add + cstat->max_tx_udp_payload_size * pkt->pktlen; - - cubic->w_tcp += m / cstat->cwnd; - cubic->pending_w_add = m % cstat->cwnd; + m = ack->bytes_delivered * cstat->max_tx_udp_payload_size + + cubic->current.pending_est_bytes_delivered; + cubic->current.pending_est_bytes_delivered = m % cstat->cwnd; - if (cubic->w_tcp > cstat->cwnd) { - tcp_add = cstat->max_tx_udp_payload_size * (cubic->w_tcp - cstat->cwnd) / - cstat->cwnd; - if (tcp_add > add) { - add = tcp_add; - } + if (cubic->current.w_est < cubic->current.cwnd_prior) { + cubic->current.w_est += m * 9 / 17 / cstat->cwnd; + } else { + cubic->current.w_est += m / cstat->cwnd; } - if (cubic->target_cwnd == 0 || cubic->target_cwnd > cstat->cwnd) { - cstat->cwnd += add; + if (w_cubic == UINT64_MAX || cubic->current.w_est > w_cubic) { + cstat->cwnd = cubic->current.w_est; + } else { + m = (target - cstat->cwnd) * cstat->max_tx_udp_payload_size + + cubic->current.pending_bytes_delivered; + cstat->cwnd += m / cstat->cwnd; + cubic->current.pending_bytes_delivered = m % cstat->cwnd; } ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "pkn=%" PRId64 " acked, cubic-ca cwnd=%" PRIu64 " t=%" PRIu64 - " k=%" PRIi64 " time_delta=%" PRIu64 " delta=%" PRIu64 - " target=%" PRIu64 " w_tcp=%" PRIu64, - pkt->pkt_num, cstat->cwnd, t, cubic->k, time_delta >> 4, - delta, target, cubic->w_tcp); + "%" PRIu64 " bytes acked, cubic-ca cwnd=%" PRIu64 + " k=%" PRIi64 " target=%" PRIu64 " w_est=%" PRIu64, + ack->bytes_delivered, cstat->cwnd, cubic->current.k, target, + cubic->current.w_est); } void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, + uint64_t bytes_lost, ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - uint64_t min_cwnd; + uint64_t flight_size; if (in_congestion_recovery(cstat, sent_ts)) { return; } - if (cubic->prior.cwnd < cstat->cwnd) { - cubic->prior.cwnd = cstat->cwnd; - cubic->prior.ssthresh = cstat->ssthresh; - cubic->prior.w_last_max = cubic->w_last_max; - cubic->prior.w_tcp = cubic->w_tcp; - cubic->prior.origin_point = cubic->origin_point; - cubic->prior.epoch_start = cubic->epoch_start; - cubic->prior.k = cubic->k; + if (cubic->undo.cwnd < cstat->cwnd) { + cubic->undo.v = cubic->current; + cubic->undo.cwnd = cstat->cwnd; + cubic->undo.ssthresh = cstat->ssthresh; } cstat->congestion_recovery_start_ts = ts; - cubic->epoch_start = UINT64_MAX; - if (cstat->cwnd < cubic->w_last_max) { - cubic->w_last_max = cstat->cwnd * 17 / 10 / 2; + cubic->current.state = NGTCP2_CUBIC_STATE_RECOVERY; + cubic->current.epoch_start = UINT64_MAX; + cubic->current.app_limited_start_ts = UINT64_MAX; + cubic->current.app_limited_duration = 0; + cubic->current.pending_bytes_delivered = 0; + cubic->current.pending_est_bytes_delivered = 0; + + if (cstat->cwnd < cubic->current.w_max) { + cubic->current.w_max = cstat->cwnd * 17 / 20; } else { - cubic->w_last_max = cstat->cwnd; + cubic->current.w_max = cstat->cwnd; } - min_cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->ssthresh = cstat->cwnd * 7 / 10; - cstat->ssthresh = ngtcp2_max(cstat->ssthresh, min_cwnd); + + if (cubic->rst->rs.delivered * 2 < cstat->cwnd) { + flight_size = cstat->bytes_in_flight + bytes_lost; + cstat->ssthresh = ngtcp2_min_uint64( + cstat->ssthresh, + ngtcp2_max_uint64(cubic->rst->rs.delivered, flight_size) * 7 / 10); + } + + cstat->ssthresh = + ngtcp2_max_uint64(cstat->ssthresh, 2 * cstat->max_tx_udp_payload_size); + + cubic->current.cwnd_prior = cstat->cwnd; cstat->cwnd = cstat->ssthresh; + cubic->current.w_est = cstat->cwnd; + + if (cstat->cwnd < cubic->current.w_max) { + cubic->current.k = + ngtcp2_cbrt(((cubic->current.w_max - cstat->cwnd) << 10) * 10 / 4 / + cstat->max_tx_udp_payload_size) * + NGTCP2_SECONDS; + cubic->current.k >>= 10; + } else { + cubic->current.k = 0; + } + ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, "reduce cwnd because of packet loss cwnd=%" PRIu64, cstat->cwnd); @@ -450,101 +473,34 @@ void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *cc, ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); (void)ts; - if (cstat->cwnd >= cubic->prior.cwnd) { - return; - } - - cstat->congestion_recovery_start_ts = UINT64_MAX; - - cstat->cwnd = cubic->prior.cwnd; - cstat->ssthresh = cubic->prior.ssthresh; - cubic->w_last_max = cubic->prior.w_last_max; - cubic->w_tcp = cubic->prior.w_tcp; - cubic->origin_point = cubic->prior.origin_point; - cubic->epoch_start = cubic->prior.epoch_start; - cubic->k = cubic->prior.k; - - cubic->prior.cwnd = 0; - cubic->prior.ssthresh = 0; - cubic->prior.w_last_max = 0; - cubic->prior.w_tcp = 0; - cubic->prior.origin_point = 0; - cubic->prior.epoch_start = UINT64_MAX; - cubic->prior.k = 0; - - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "spurious congestion is detected and congestion state is " - "restored cwnd=%" PRIu64, - cstat->cwnd); -} - -void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { - (void)cc; - (void)ts; - - cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->congestion_recovery_start_ts = UINT64_MAX; -} - -void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, - ngtcp2_tstamp ts) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - uint64_t target_cwnd, initcwnd; - uint64_t max_delivery_rate_sec; - (void)ack; - (void)ts; - - ++cubic->ack_count; - - ngtcp2_window_filter_update(&cubic->delivery_rate_sec_filter, - cstat->delivery_rate_sec, cubic->ack_count); - max_delivery_rate_sec = - ngtcp2_window_filter_get_best(&cubic->delivery_rate_sec_filter); - - if (cstat->min_rtt != UINT64_MAX && max_delivery_rate_sec) { - target_cwnd = max_delivery_rate_sec * cstat->smoothed_rtt / NGTCP2_SECONDS; - initcwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); - cubic->target_cwnd = ngtcp2_max(initcwnd, target_cwnd) * 289 / 100; + if (cstat->cwnd < cubic->undo.cwnd) { + cubic->current = cubic->undo.v; + cstat->cwnd = cubic->undo.cwnd; + cstat->ssthresh = cubic->undo.ssthresh; ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "target_cwnd=%" PRIu64 " max_delivery_rate_sec=%" PRIu64 - " smoothed_rtt=%" PRIu64, - cubic->target_cwnd, max_delivery_rate_sec, - cstat->smoothed_rtt); + "spurious congestion is detected and congestion state is " + "restored cwnd=%" PRIu64, + cstat->cwnd); } -} - -void ngtcp2_cc_cubic_cc_on_pkt_sent(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - (void)cstat; - if (pkt->pktns_id != NGTCP2_PKTNS_ID_APPLICATION || cubic->window_end != -1) { - return; - } - - cubic->window_end = pkt->pkt_num; - cubic->last_round_min_rtt = cubic->current_round_min_rtt; - cubic->current_round_min_rtt = UINT64_MAX; - cubic->rtt_sample_count = 0; + cubic_vars_reset(&cubic->undo.v); + cubic->undo.cwnd = 0; + cubic->undo.ssthresh = 0; } -void ngtcp2_cc_cubic_cc_new_rtt_sample(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, + ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); (void)ts; - if (cubic->window_end == -1) { - return; - } + cubic_cc_reset(cubic); - cubic->current_round_min_rtt = - ngtcp2_min(cubic->current_round_min_rtt, cstat->latest_rtt); - ++cubic->rtt_sample_count; + cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; + cstat->congestion_recovery_start_ts = UINT64_MAX; } void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, @@ -555,23 +511,3 @@ void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cubic_cc_reset(cubic); } - -void ngtcp2_cc_cubic_cc_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_cc_event_type event, ngtcp2_tstamp ts) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - ngtcp2_tstamp last_ts; - - if (event != NGTCP2_CC_EVENT_TYPE_TX_START || - cubic->epoch_start == UINT64_MAX) { - return; - } - - last_ts = cstat->last_tx_pkt_ts[NGTCP2_PKTNS_ID_APPLICATION]; - if (last_ts == UINT64_MAX || last_ts <= cubic->epoch_start) { - return; - } - - assert(ts >= last_ts); - - cubic->epoch_start += ts - last_ts; -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h index 524bcdb7e4bf86..e3c363a51bb85a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h @@ -27,18 +27,18 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> #include "ngtcp2_pktns_id.h" -#include "ngtcp2_window_filter.h" #define NGTCP2_LOSS_REDUCTION_FACTOR_BITS 1 #define NGTCP2_PERSISTENT_CONGESTION_THRESHOLD 3 typedef struct ngtcp2_log ngtcp2_log; typedef struct ngtcp2_conn_stat ngtcp2_conn_stat; +typedef struct ngtcp2_rst ngtcp2_rst; /** * @struct @@ -144,10 +144,12 @@ typedef void (*ngtcp2_cc_on_pkt_lost)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, * * :type:`ngtcp2_cc_congestion_event` is a callback function which is * called when congestion event happens (e.g., when packet is lost). + * |bytes_lost| is the number of bytes lost in this congestion event. */ typedef void (*ngtcp2_cc_congestion_event)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, + uint64_t bytes_lost, ngtcp2_tstamp ts); /** @@ -305,9 +307,6 @@ ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, /* ngtcp2_cc_reno is the RENO congestion controller. */ typedef struct ngtcp2_cc_reno { ngtcp2_cc cc; - ngtcp2_window_filter delivery_rate_sec_filter; - uint64_t ack_count; - uint64_t target_cwnd; uint64_t pending_add; } ngtcp2_cc_reno; @@ -318,59 +317,81 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts); + uint64_t bytes_lost, ngtcp2_tstamp ts); void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_reno_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); - void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); +typedef enum ngtcp2_cubic_state { + /* NGTCP2_CUBIC_STATE_INITIAL is the state where CUBIC is in slow + start phase, or congestion avoidance phase before congestion + events occur. */ + NGTCP2_CUBIC_STATE_INITIAL, + /* NGTCP2_CUBIC_STATE_RECOVERY is the state that a connection is in + recovery period. */ + NGTCP2_CUBIC_STATE_RECOVERY, + /* NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE is the state where CUBIC + is in congestion avoidance phase after recovery period ends. */ + NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE, +} ngtcp2_cubic_state; + +typedef struct ngtcp2_cubic_vars { + uint64_t cwnd_prior; + uint64_t w_max; + ngtcp2_duration k; + ngtcp2_tstamp epoch_start; + uint64_t w_est; + + ngtcp2_cubic_state state; + /* app_limited_start_ts is the timestamp where app limited period + started. */ + ngtcp2_tstamp app_limited_start_ts; + /* app_limited_duration is the cumulative duration where a + connection is under app limited when ACK is received. */ + ngtcp2_duration app_limited_duration; + uint64_t pending_bytes_delivered; + uint64_t pending_est_bytes_delivered; +} ngtcp2_cubic_vars; + /* ngtcp2_cc_cubic is CUBIC congestion controller. */ typedef struct ngtcp2_cc_cubic { ngtcp2_cc cc; - ngtcp2_window_filter delivery_rate_sec_filter; - uint64_t ack_count; - uint64_t target_cwnd; - uint64_t w_last_max; - uint64_t w_tcp; - uint64_t origin_point; - ngtcp2_tstamp epoch_start; - uint64_t k; - /* prior stores the congestion state when a congestion event occurs + ngtcp2_rst *rst; + /* current is a set of variables that are currently in effect. */ + ngtcp2_cubic_vars current; + /* undo stores the congestion state when a congestion event occurs in order to restore the state when it turns out that the event is spurious. */ struct { + ngtcp2_cubic_vars v; uint64_t cwnd; uint64_t ssthresh; - uint64_t w_last_max; - uint64_t w_tcp; - uint64_t origin_point; - ngtcp2_tstamp epoch_start; - uint64_t k; - } prior; + } undo; /* HyStart++ variables */ - size_t rtt_sample_count; - uint64_t current_round_min_rtt; - uint64_t last_round_min_rtt; - int64_t window_end; - uint64_t pending_add; - uint64_t pending_w_add; + struct { + ngtcp2_duration current_round_min_rtt; + ngtcp2_duration last_round_min_rtt; + ngtcp2_duration curr_rtt; + size_t rtt_sample_count; + ngtcp2_duration css_baseline_min_rtt; + size_t css_round; + } hs; + uint64_t next_round_delivered; } ngtcp2_cc_cubic; -void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cc, ngtcp2_log *log); +void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cc, ngtcp2_log *log, + ngtcp2_rst *rst); -void ngtcp2_cc_cubic_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, - ngtcp2_tstamp ts); +void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts); + uint64_t bytes_lost, ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, @@ -380,21 +401,9 @@ void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); - -void ngtcp2_cc_cubic_cc_on_pkt_sent(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt); - -void ngtcp2_cc_cubic_cc_new_rtt_sample(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); - void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_cubic_cc_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_cc_event_type event, ngtcp2_tstamp ts); - uint64_t ngtcp2_cbrt(uint64_t n); -#endif /* NGTCP2_CC_H */ +#endif /* !defined(NGTCP2_CC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c index f3b92b569ec928..8bff06c0c1f2da 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c @@ -36,6 +36,7 @@ void ngtcp2_cid_init(ngtcp2_cid *cid, const uint8_t *data, size_t datalen) { assert(datalen <= NGTCP2_MAX_CIDLEN); cid->datalen = datalen; + if (datalen) { ngtcp2_cpymem(cid->data, data, datalen); } @@ -74,12 +75,14 @@ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token) { dcid->seq = seq; dcid->cid = *cid; + if (token) { memcpy(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN); dcid->flags = NGTCP2_DCID_FLAG_TOKEN_PRESENT; } else { dcid->flags = NGTCP2_DCID_FLAG_NONE; } + ngtcp2_path_storage_zero(&dcid->ps); dcid->retired_ts = UINT64_MAX; dcid->bound_ts = UINT64_MAX; @@ -115,6 +118,7 @@ void ngtcp2_dcid_copy(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { dest->seq = src->seq; dest->cid = src->cid; + if (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) { dest->flags |= NGTCP2_DCID_FLAG_TOKEN_PRESENT; memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); @@ -123,25 +127,25 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { } } -int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, +int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token) { if (dcid->seq == seq) { return ngtcp2_cid_eq(&dcid->cid, cid) && - (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - memcmp(dcid->token, token, - NGTCP2_STATELESS_RESET_TOKENLEN) == 0 - ? 0 - : NGTCP2_ERR_PROTO; + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && + memcmp(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) == 0 + ? 0 + : NGTCP2_ERR_PROTO; } return !ngtcp2_cid_eq(&dcid->cid, cid) ? 0 : NGTCP2_ERR_PROTO; } int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, + const ngtcp2_path *path, const uint8_t *token) { - return (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - ngtcp2_cmemeq(dcid->token, token, - NGTCP2_STATELESS_RESET_TOKENLEN) - ? 0 - : NGTCP2_ERR_INVALID_ARGUMENT; + return ngtcp2_path_eq(&dcid->ps.path, path) && + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && + ngtcp2_cmemeq(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) + ? 0 + : NGTCP2_ERR_INVALID_ARGUMENT; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h index 0b37441178c72a..c6ab16831a38c4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -37,20 +37,20 @@ /* NGTCP2_SCID_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_SCID_FLAG_NONE 0x00u /* NGTCP2_SCID_FLAG_USED indicates that a local endpoint observed that - a remote endpoint uses a particular Connection ID. */ + a remote endpoint uses this particular Connection ID. */ #define NGTCP2_SCID_FLAG_USED 0x01u -/* NGTCP2_SCID_FLAG_RETIRED indicates that a particular Connection ID - is retired. */ +/* NGTCP2_SCID_FLAG_RETIRED indicates that this particular Connection + ID is retired. */ #define NGTCP2_SCID_FLAG_RETIRED 0x02u typedef struct ngtcp2_scid { ngtcp2_pq_entry pe; - /* seq is the sequence number associated to the CID. */ + /* seq is the sequence number associated to the Connection ID. */ uint64_t seq; /* cid is a connection ID */ ngtcp2_cid cid; - /* retired_ts is the timestamp when peer tells that this CID is - retired. */ + /* retired_ts is the timestamp when a remote endpoint tells that + this Connection ID is retired. */ ngtcp2_tstamp retired_ts; /* flags is the bitwise OR of zero or more of NGTCP2_SCID_FLAG_*. */ uint8_t flags; @@ -66,33 +66,33 @@ typedef struct ngtcp2_scid { #define NGTCP2_DCID_FLAG_TOKEN_PRESENT 0x02u typedef struct ngtcp2_dcid { - /* seq is the sequence number associated to the CID. */ + /* seq is the sequence number associated to the Connection ID. */ uint64_t seq; - /* cid is a connection ID */ + /* cid is a Connection ID */ ngtcp2_cid cid; /* path is a path which cid is bound to. The addresses are zero length if cid has not been bound to a particular path yet. */ ngtcp2_path_storage ps; - /* retired_ts is the timestamp when peer tells that this CID is + /* retired_ts is the timestamp when this Connection ID is retired. */ ngtcp2_tstamp retired_ts; - /* bound_ts is the timestamp when this connection ID is bound to a - particular path. It is only assigned when a connection ID is - used just for sending PATH_RESPONSE and is not zero-length. */ + /* bound_ts is the timestamp when this Connection ID is bound to a + particular path. It is only assigned when a Connection ID is + used just for sending PATH_RESPONSE, and is not zero-length. */ ngtcp2_tstamp bound_ts; /* bytes_sent is the number of bytes sent to an associated path. */ uint64_t bytes_sent; /* bytes_recv is the number of bytes received from an associated path. */ uint64_t bytes_recv; - /* max_udp_payload_size is the maximum size of UDP payload that is - allowed to send to this path. */ + /* max_udp_payload_size is the maximum size of UDP datagram payload + that is allowed to be sent to this path. */ size_t max_udp_payload_size; /* flags is bitwise OR of zero or more of NGTCP2_DCID_FLAG_*. */ uint8_t flags; - /* token is a stateless reset token associated to this CID. - Actually, the stateless reset token is tied to the connection, - not to the particular connection ID. */ + /* token is a stateless reset token received along with this + Connection ID. The stateless reset token is tied to the + connection, not to the particular Connection ID. */ uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN]; } ngtcp2_dcid; @@ -106,7 +106,7 @@ void ngtcp2_cid_zero(ngtcp2_cid *cid); int ngtcp2_cid_less(const ngtcp2_cid *lhs, const ngtcp2_cid *rhs); /* - * ngtcp2_cid_empty returns nonzero if |cid| includes empty connection + * ngtcp2_cid_empty returns nonzero if |cid| includes empty Connection * ID. */ int ngtcp2_cid_empty(const ngtcp2_cid *cid); @@ -123,7 +123,7 @@ void ngtcp2_scid_copy(ngtcp2_scid *dest, const ngtcp2_scid *src); /* * ngtcp2_dcid_init initializes |dcid| with the given parameters. If - * |token| is NULL, the function fills dcid->token it with 0. |token| + * |token| is NULL, the function fills dcid->token with 0. |token| * must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. */ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, @@ -131,14 +131,14 @@ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, /* * ngtcp2_dcid_set_token sets |token| to |dcid|. |token| must not be - * NULL and must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. + * NULL, and must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. */ void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, const uint8_t *token); /* * ngtcp2_dcid_set_path sets |path| to |dcid|. It sets - * max_udp_payload_size to the minimum UDP payload size supported - * by the IP protocol version. + * max_udp_payload_size to the minimum UDP datagram payload size + * supported by the IP protocol version. */ void ngtcp2_dcid_set_path(ngtcp2_dcid *dcid, const ngtcp2_path *path); @@ -149,7 +149,9 @@ void ngtcp2_dcid_copy(ngtcp2_dcid *dest, const ngtcp2_dcid *src); /* * ngtcp2_dcid_copy_cid_token behaves like ngtcp2_dcid_copy, but it - * only copies cid, seq, and path. + * only copies cid, seq, and token. dest->flags should be initialized + * before this call because NGTCP2_DCID_FLAG_TOKEN_PRESENT is set or + * unset. */ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src); @@ -157,12 +159,13 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src); * ngtcp2_dcid_verify_uniqueness verifies uniqueness of (|seq|, |cid|, * |token|) tuple against |dcid|. */ -int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, +int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token); /* * ngtcp2_dcid_verify_stateless_reset_token verifies stateless reset - * token |token| against the one included in |dcid|. This function + * token |token| received on |path| against the one included in + * |dcid|. Tokens are compared in constant time. This function * returns 0 if the verification succeeds, or one of the following * negative error codes: * @@ -170,6 +173,7 @@ int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, * Tokens do not match; or |dcid| does not contain a token. */ int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, + const ngtcp2_path *path, const uint8_t *token); -#endif /* NGTCP2_CID_H */ +#endif /* !defined(NGTCP2_CID_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c index c8caf47ea76232..59eb90f6ea1afa 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c @@ -37,7 +37,8 @@ #include "ngtcp2_rcvry.h" #include "ngtcp2_unreachable.h" #include "ngtcp2_net.h" -#include "ngtcp2_conversion.h" +#include "ngtcp2_transport_params.h" +#include "ngtcp2_settings.h" #include "ngtcp2_tstamp.h" #include "ngtcp2_frame_chain.h" @@ -50,8 +51,12 @@ /* NGTCP2_MIN_COALESCED_PAYLOADLEN is the minimum length of QUIC packet payload that should be coalesced to a long packet. */ #define NGTCP2_MIN_COALESCED_PAYLOADLEN 128 +/* NGTCP2_MAX_ACK_PER_PKT is the maximum number of ACK frame per an + incoming QUIC packet to process. ACK frames that exceed this limit + are not processed. */ +#define NGTCP2_MAX_ACK_PER_PKT 1 -ngtcp2_objalloc_def(strm, ngtcp2_strm, oplent); +ngtcp2_objalloc_def(strm, ngtcp2_strm, oplent) /* * conn_local_stream returns nonzero if |stream_id| indicates that it @@ -292,13 +297,13 @@ static int conn_call_path_validation(ngtcp2_conn *conn, const ngtcp2_pv *pv, flags |= NGTCP2_PATH_VALIDATION_FLAG_PREFERRED_ADDR; } - if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) { + if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) { old_path = &pv->fallback_dcid.ps.path; } if (conn->server && old_path && - (ngtcp2_addr_compare(&pv->dcid.ps.path.remote, &old_path->remote) & - (NGTCP2_ADDR_COMPARE_FLAG_ADDR | NGTCP2_ADDR_COMPARE_FLAG_FAMILY))) { + (ngtcp2_addr_cmp(&pv->dcid.ps.path.remote, &old_path->remote) & + (NGTCP2_ADDR_CMP_FLAG_ADDR | NGTCP2_ADDR_CMP_FLAG_FAMILY))) { flags |= NGTCP2_PATH_VALIDATION_FLAG_NEW_TOKEN; } @@ -323,8 +328,8 @@ static int conn_call_select_preferred_addr(ngtcp2_conn *conn, assert(conn->remote.transport_params->preferred_addr_present); rv = conn->callbacks.select_preferred_addr( - conn, dest, &conn->remote.transport_params->preferred_addr, - conn->user_data); + conn, dest, &conn->remote.transport_params->preferred_addr, + conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -377,7 +382,7 @@ static int conn_call_extend_max_stream_data(ngtcp2_conn *conn, } rv = conn->callbacks.extend_max_stream_data( - conn, stream_id, datalen, conn->user_data, strm->stream_user_data); + conn, stream_id, datalen, conn->user_data, strm->stream_user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -395,9 +400,9 @@ static int conn_call_dcid_status(ngtcp2_conn *conn, } rv = conn->callbacks.dcid_status( - conn, type, dcid->seq, &dcid->cid, - (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token : NULL, - conn->user_data); + conn, type, dcid->seq, &dcid->cid, + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token : NULL, + conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -413,7 +418,7 @@ static int conn_call_activate_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid) { static int conn_call_deactivate_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid) { return conn_call_dcid_status( - conn, NGTCP2_CONNECTION_ID_STATUS_TYPE_DEACTIVATE, dcid); + conn, NGTCP2_CONNECTION_ID_STATUS_TYPE_DEACTIVATE, dcid); } static int conn_call_stream_stop_sending(ngtcp2_conn *conn, int64_t stream_id, @@ -587,8 +592,8 @@ static int conn_call_recv_datagram(ngtcp2_conn *conn, flags |= NGTCP2_DATAGRAM_FLAG_0RTT; } - rv = conn->callbacks.recv_datagram(conn, flags, data, datalen, - conn->user_data); + rv = + conn->callbacks.recv_datagram(conn, flags, data, datalen, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -607,8 +612,8 @@ conn_call_update_key(ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, assert(conn->callbacks.update_key); rv = conn->callbacks.update_key( - conn, rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, tx_iv, - current_rx_secret, current_tx_secret, secretlen, conn->user_data); + conn, rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, tx_iv, + current_rx_secret, current_tx_secret, secretlen, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -623,7 +628,7 @@ static int conn_call_version_negotiation(ngtcp2_conn *conn, uint32_t version, assert(conn->callbacks.version_negotiation); rv = - conn->callbacks.version_negotiation(conn, version, dcid, conn->user_data); + conn->callbacks.version_negotiation(conn, version, dcid, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -663,40 +668,27 @@ static int conn_call_recv_tx_key(ngtcp2_conn *conn, return 0; } -static int pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, - ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t initial_pkt_num, - ngtcp2_log *log, ngtcp2_qlog *qlog, - ngtcp2_objalloc *rtb_entry_objalloc, - ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - int rv; - +static void pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, + ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t initial_pkt_num, + ngtcp2_log *log, ngtcp2_qlog *qlog, + ngtcp2_objalloc *rtb_entry_objalloc, + ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { memset(pktns, 0, sizeof(*pktns)); ngtcp2_gaptr_init(&pktns->rx.pngap, mem); pktns->tx.last_pkt_num = initial_pkt_num - 1; pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; - pktns->rx.max_pkt_num = -1; pktns->rx.max_ack_eliciting_pkt_num = -1; + pktns->id = pktns_id; - rv = ngtcp2_acktr_init(&pktns->acktr, log, mem); - if (rv != 0) { - goto fail_acktr_init; - } + ngtcp2_acktr_init(&pktns->acktr, log, mem); ngtcp2_strm_init(&pktns->crypto.strm, 0, NGTCP2_STRM_FLAG_NONE, 0, 0, NULL, frc_objalloc, mem); - ngtcp2_rtb_init(&pktns->rtb, pktns_id, &pktns->crypto.strm, rst, cc, - initial_pkt_num, log, qlog, rtb_entry_objalloc, frc_objalloc, - mem); - - return 0; - -fail_acktr_init: - ngtcp2_gaptr_free(&pktns->rx.pngap); - - return rv; + ngtcp2_rtb_init(&pktns->rtb, rst, cc, initial_pkt_num, log, qlog, + rtb_entry_objalloc, frc_objalloc, mem); } static int pktns_new(ngtcp2_pktns **ppktns, ngtcp2_pktns_id pktns_id, @@ -704,20 +696,15 @@ static int pktns_new(ngtcp2_pktns **ppktns, ngtcp2_pktns_id pktns_id, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - int rv; - *ppktns = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_pktns)); if (*ppktns == NULL) { return NGTCP2_ERR_NOMEM; } - rv = pktns_init(*ppktns, pktns_id, rst, cc, initial_pkt_num, log, qlog, - rtb_entry_objalloc, frc_objalloc, mem); - if (rv != 0) { - ngtcp2_mem_free(mem, *ppktns); - } + pktns_init(*ppktns, pktns_id, rst, cc, initial_pkt_num, log, qlog, + rtb_entry_objalloc, frc_objalloc, mem); - return rv; + return 0; } static int cycle_less(const ngtcp2_pq_entry *lhs, const ngtcp2_pq_entry *rhs) { @@ -783,6 +770,8 @@ static int cid_less(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { return ngtcp2_cid_less(lhs, rhs); } +ngtcp2_ksl_search_def(cid_less, cid_less) + static int retired_ts_less(const ngtcp2_pq_entry *lhs, const ngtcp2_pq_entry *rhs) { const ngtcp2_scid *a = ngtcp2_struct_of(lhs, ngtcp2_scid, pe); @@ -803,8 +792,9 @@ static void conn_reset_conn_stat_cc(ngtcp2_conn *conn, cstat->first_rtt_sample_ts = UINT64_MAX; cstat->pto_count = 0; cstat->loss_detection_timer = UINT64_MAX; - cstat->cwnd = - ngtcp2_cc_compute_initcwnd(conn->local.settings.max_tx_udp_payload_size); + cstat->max_tx_udp_payload_size = + ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + cstat->cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); cstat->ssthresh = UINT64_MAX; cstat->congestion_recovery_start_ts = UINT64_MAX; cstat->bytes_in_flight = 0; @@ -847,7 +837,7 @@ static void delete_scid(ngtcp2_ksl *scids, const ngtcp2_mem *mem) { static ngtcp2_duration compute_pto(ngtcp2_duration smoothed_rtt, ngtcp2_duration rttvar, ngtcp2_duration max_ack_delay) { - ngtcp2_duration var = ngtcp2_max(4 * rttvar, NGTCP2_GRANULARITY); + ngtcp2_duration var = ngtcp2_max_uint64(4 * rttvar, NGTCP2_GRANULARITY); return smoothed_rtt + var + max_ack_delay; } @@ -859,7 +849,7 @@ static ngtcp2_duration conn_compute_initial_pto(ngtcp2_conn *conn, ngtcp2_duration initial_rtt = conn->local.settings.initial_rtt; ngtcp2_duration max_ack_delay; - if (pktns->rtb.pktns_id == NGTCP2_PKTNS_ID_APPLICATION && + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && conn->remote.transport_params) { max_ack_delay = conn->remote.transport_params->max_ack_delay; } else { @@ -876,7 +866,7 @@ static ngtcp2_duration conn_compute_pto(ngtcp2_conn *conn, ngtcp2_conn_stat *cstat = &conn->cstat; ngtcp2_duration max_ack_delay; - if (pktns->rtb.pktns_id == NGTCP2_PKTNS_ID_APPLICATION && + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && conn->remote.transport_params) { max_ack_delay = conn->remote.transport_params->max_ack_delay; } else { @@ -898,7 +888,7 @@ static ngtcp2_duration conn_compute_pv_timeout_pto(ngtcp2_conn *conn, ngtcp2_duration pto) { ngtcp2_duration initial_pto = conn_compute_initial_pto(conn, &conn->pktns); - return 3 * ngtcp2_max(pto, initial_pto); + return 3 * ngtcp2_max_uint64(pto, initial_pto); } /* @@ -1007,28 +997,15 @@ static void conn_reset_ecn_validation_state(ngtcp2_conn *conn) { static uint8_t server_default_available_versions[] = {0, 0, 0, 1}; /* - * available_versions_new allocates new buffer, and writes |versions| - * of length |versionslen| in network byte order, suitable for sending - * in available_versions field of version_information QUIC transport - * parameter. The pointer to the allocated buffer is assigned to - * |*pbuf|. - * - * This function returns 0 if it succeeds, or one of the negative - * error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. + * available_versions_init writes |versions| of length |versionslen| + * in network byte order to the buffer pointed by |buf|, suitable for + * sending in available_versions field of version_information QUIC + * transport parameter. This function returns the pointer to the one + * beyond the last byte written. */ -static int available_versions_new(uint8_t **pbuf, const uint32_t *versions, - size_t versionslen, const ngtcp2_mem *mem) { +static void *available_versions_init(void *buf, const uint32_t *versions, + size_t versionslen) { size_t i; - uint8_t *buf = ngtcp2_mem_malloc(mem, sizeof(uint32_t) * versionslen); - - if (buf == NULL) { - return NGTCP2_ERR_NOMEM; - } - - *pbuf = buf; for (i = 0; i < versionslen; ++i) { buf = ngtcp2_put_uint32be(buf, versions[i]); @@ -1055,6 +1032,16 @@ conn_set_local_transport_params(ngtcp2_conn *conn, p->version_info_present = 1; } +static size_t buflen_align(size_t buflen) { + return (buflen + 0x7) & (size_t)~0x7; +} + +static void *buf_align(void *buf) { + return (void *)((uintptr_t)((uint8_t *)buf + 0x7) & (uintptr_t)~0x7); +} + +static void *buf_advance(void *buf, size_t n) { return (uint8_t *)buf + n; } + static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, const ngtcp2_path *path, uint32_t client_chosen_version, int callbacks_version, @@ -1065,25 +1052,31 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_mem *mem, void *user_data, int server) { int rv; ngtcp2_scid *scident; - uint8_t *buf; + void *buf, *tokenbuf; + size_t buflen; uint8_t fixed_bit_byte; size_t i; uint32_t *preferred_versions; + ngtcp2_settings settingsbuf; ngtcp2_transport_params paramsbuf; (void)callbacks_version; (void)settings_version; + settings = + ngtcp2_settings_convert_to_latest(&settingsbuf, settings_version, settings); params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); + ¶msbuf, transport_params_version, params); assert(settings->max_window <= NGTCP2_MAX_VARINT); assert(settings->max_stream_window <= NGTCP2_MAX_VARINT); assert(settings->max_tx_udp_payload_size); assert(settings->max_tx_udp_payload_size <= NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE); assert(settings->initial_pkt_num <= INT32_MAX); + assert(settings->initial_rtt); assert(params->active_connection_id_limit >= NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT); - assert(params->active_connection_id_limit <= NGTCP2_MAX_DCID_POOL_SIZE); + assert(params->active_connection_id_limit <= + NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE); assert(params->initial_max_data <= NGTCP2_MAX_VARINT); assert(params->initial_max_stream_data_bidi_local <= NGTCP2_MAX_VARINT); assert(params->initial_max_stream_data_bidi_remote <= NGTCP2_MAX_VARINT); @@ -1111,31 +1104,66 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(callbacks->get_path_challenge_data); assert(!server || !ngtcp2_is_reserved_version(client_chosen_version)); + for (i = 0; i < settings->pmtud_probeslen; ++i) { + assert(settings->pmtud_probes[i] > NGTCP2_MAX_UDP_PAYLOAD_SIZE); + } + if (mem == NULL) { mem = ngtcp2_mem_default(); } - *pconn = ngtcp2_mem_calloc(mem, 1, sizeof(ngtcp2_conn)); - if (*pconn == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_conn; + buflen = sizeof(ngtcp2_conn); + if (settings->qlog_write) { + buflen = buflen_align(buflen); + buflen += NGTCP2_QLOG_BUFLEN; } - (*pconn)->server = server; + if (settings->pmtud_probeslen) { + buflen = buflen_align(buflen); + buflen += sizeof(settings->pmtud_probes[0]) * settings->pmtud_probeslen; + } + + if (settings->preferred_versionslen) { + buflen = buflen_align(buflen); + buflen += + sizeof(settings->preferred_versions[0]) * settings->preferred_versionslen; + } + + if (settings->available_versionslen) { + buflen = buflen_align(buflen); + buflen += + sizeof(settings->available_versions[0]) * settings->available_versionslen; + } else if (server) { + if (settings->preferred_versionslen) { + buflen = buflen_align(buflen); + buflen += sizeof(settings->preferred_versions[0]) * + settings->preferred_versionslen; + } + } else if (!ngtcp2_is_reserved_version(client_chosen_version)) { + buflen = buflen_align(buflen); + buflen += sizeof(client_chosen_version); + } - ngtcp2_objalloc_frame_chain_init(&(*pconn)->frc_objalloc, 64, mem); - ngtcp2_objalloc_rtb_entry_init(&(*pconn)->rtb_entry_objalloc, 64, mem); - ngtcp2_objalloc_strm_init(&(*pconn)->strm_objalloc, 64, mem); + buf = ngtcp2_mem_calloc(mem, 1, buflen); + if (buf == NULL) { + return NGTCP2_ERR_NOMEM; + } - ngtcp2_static_ringbuf_dcid_bound_init(&(*pconn)->dcid.bound); + *pconn = buf; + buf = buf_advance(buf, sizeof(ngtcp2_conn)); + + (*pconn)->server = server; - ngtcp2_static_ringbuf_dcid_unused_init(&(*pconn)->dcid.unused); + ngtcp2_objalloc_frame_chain_init(&(*pconn)->frc_objalloc, 16, mem); + ngtcp2_objalloc_rtb_entry_init(&(*pconn)->rtb_entry_objalloc, 16, mem); + ngtcp2_objalloc_strm_init(&(*pconn)->strm_objalloc, 16, mem); - ngtcp2_static_ringbuf_dcid_retired_init(&(*pconn)->dcid.retired); + ngtcp2_dcidtr_init(&(*pconn)->dcid.dtr); ngtcp2_gaptr_init(&(*pconn)->dcid.seqgap, mem); - ngtcp2_ksl_init(&(*pconn)->scid.set, cid_less, sizeof(ngtcp2_cid), mem); + ngtcp2_ksl_init(&(*pconn)->scid.set, cid_less, ksl_cid_less_search, + sizeof(ngtcp2_cid), mem); ngtcp2_pq_init(&(*pconn)->scid.used, retired_ts_less, mem); @@ -1143,9 +1171,9 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_pq_init(&(*pconn)->tx.strmq, cycle_less, mem); - ngtcp2_idtr_init(&(*pconn)->remote.bidi.idtr, !server, mem); + ngtcp2_idtr_init(&(*pconn)->remote.bidi.idtr, mem); - ngtcp2_idtr_init(&(*pconn)->remote.uni.idtr, !server, mem); + ngtcp2_idtr_init(&(*pconn)->remote.uni.idtr, mem); ngtcp2_static_ringbuf_path_challenge_init(&(*pconn)->rx.path_challenge); @@ -1154,36 +1182,51 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_qlog_init(&(*pconn)->qlog, settings->qlog_write, settings->initial_ts, user_data); if ((*pconn)->qlog.write) { - buf = ngtcp2_mem_malloc(mem, NGTCP2_QLOG_BUFLEN); - if (buf == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_qlog_buf; - } + buf = buf_align(buf); ngtcp2_buf_init(&(*pconn)->qlog.buf, buf, NGTCP2_QLOG_BUFLEN); + buf = buf_advance(buf, NGTCP2_QLOG_BUFLEN); } (*pconn)->local.settings = *settings; if (settings->tokenlen) { - buf = ngtcp2_mem_malloc(mem, settings->tokenlen); - if (buf == NULL) { + tokenbuf = ngtcp2_mem_malloc(mem, settings->tokenlen); + if (tokenbuf == NULL) { rv = NGTCP2_ERR_NOMEM; goto fail_token; } - memcpy(buf, settings->token, settings->tokenlen); - (*pconn)->local.settings.token = buf; + memcpy(tokenbuf, settings->token, settings->tokenlen); + (*pconn)->local.settings.token = tokenbuf; } else { (*pconn)->local.settings.token = NULL; } + if (settings->pmtud_probeslen) { + (*pconn)->local.settings.pmtud_probes = buf_align(buf); + buf = ngtcp2_cpymem( + (uint16_t *)(*pconn)->local.settings.pmtud_probes, settings->pmtud_probes, + sizeof(settings->pmtud_probes[0]) * settings->pmtud_probeslen); + } + if (!(*pconn)->local.settings.original_version) { (*pconn)->local.settings.original_version = client_chosen_version; } + ngtcp2_dcid_init(&(*pconn)->dcid.current, 0, dcid, NULL); + ngtcp2_dcid_set_path(&(*pconn)->dcid.current, path); + + assert((size_t)path->local.addrlen <= sizeof((*pconn)->hs_local_addr)); + + memcpy(&(*pconn)->hs_local_addr, path->local.addr, + (size_t)path->local.addrlen); + + rv = ngtcp2_gaptr_push(&(*pconn)->dcid.seqgap, 0, 1); + if (rv != 0) { + goto fail_seqgap_push; + } + conn_reset_conn_stat(*pconn, &(*pconn)->cstat); (*pconn)->cstat.initial_rtt = settings->initial_rtt; - (*pconn)->cstat.max_tx_udp_payload_size = - (*pconn)->local.settings.max_tx_udp_payload_size; ngtcp2_rst_init(&(*pconn)->rst); @@ -1195,7 +1238,7 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, break; case NGTCP2_CC_ALGO_CUBIC: - ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log); + ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log, &(*pconn)->rst); break; case NGTCP2_CC_ALGO_BBR: @@ -1224,13 +1267,10 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, goto fail_hs_pktns_init; } - rv = pktns_init(&(*pconn)->pktns, NGTCP2_PKTNS_ID_APPLICATION, &(*pconn)->rst, - &(*pconn)->cc, settings->initial_pkt_num, &(*pconn)->log, - &(*pconn)->qlog, &(*pconn)->rtb_entry_objalloc, - &(*pconn)->frc_objalloc, mem); - if (rv != 0) { - goto fail_pktns_init; - } + pktns_init(&(*pconn)->pktns, NGTCP2_PKTNS_ID_APPLICATION, &(*pconn)->rst, + &(*pconn)->cc, settings->initial_pkt_num, &(*pconn)->log, + &(*pconn)->qlog, &(*pconn)->rtb_entry_objalloc, + &(*pconn)->frc_objalloc, mem); scident = ngtcp2_mem_malloc(mem, sizeof(*scident)); if (scident == NULL) { @@ -1249,14 +1289,6 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, scident = NULL; - ngtcp2_dcid_init(&(*pconn)->dcid.current, 0, dcid, NULL); - ngtcp2_dcid_set_path(&(*pconn)->dcid.current, path); - - rv = ngtcp2_gaptr_push(&(*pconn)->dcid.seqgap, 0, 1); - if (rv != 0) { - goto fail_seqgap_push; - } - if (settings->preferred_versionslen) { if (!server && !ngtcp2_is_reserved_version(client_chosen_version)) { for (i = 0; i < settings->preferred_versionslen; ++i) { @@ -1268,12 +1300,9 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(i < settings->preferred_versionslen); } - preferred_versions = ngtcp2_mem_malloc( - mem, sizeof(uint32_t) * settings->preferred_versionslen); - if (preferred_versions == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_preferred_versions; - } + preferred_versions = buf_align(buf); + buf = buf_advance(preferred_versions, sizeof(preferred_versions[0]) * + settings->preferred_versionslen); for (i = 0; i < settings->preferred_versionslen; ++i) { assert(ngtcp2_is_supported_version(settings->preferred_versions[i])); @@ -1304,39 +1333,33 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_is_supported_version(settings->available_versions[i])); } - rv = available_versions_new(&buf, settings->available_versions, - settings->available_versionslen, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = - sizeof(uint32_t) * settings->available_versionslen; + sizeof(uint32_t) * settings->available_versionslen; + + buf = available_versions_init((*pconn)->vneg.available_versions, + settings->available_versions, + settings->available_versionslen); } else if (server) { if (settings->preferred_versionslen) { - rv = available_versions_new(&buf, settings->preferred_versions, - settings->preferred_versionslen, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = - sizeof(uint32_t) * settings->preferred_versionslen; + sizeof(uint32_t) * settings->preferred_versionslen; + + buf = available_versions_init((*pconn)->vneg.available_versions, + settings->preferred_versions, + settings->preferred_versionslen); } else { (*pconn)->vneg.available_versions = server_default_available_versions; (*pconn)->vneg.available_versionslen = - sizeof(server_default_available_versions); + sizeof(server_default_available_versions); } - } else if (!server && !ngtcp2_is_reserved_version(client_chosen_version)) { - rv = available_versions_new(&buf, &client_chosen_version, 1, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + } else if (!ngtcp2_is_reserved_version(client_chosen_version)) { + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = sizeof(uint32_t); + + buf = available_versions_init((*pconn)->vneg.available_versions, + &client_chosen_version, 1); } (*pconn)->local.settings.available_versions = NULL; @@ -1359,62 +1382,49 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, (*pconn)->mem = mem; (*pconn)->user_data = user_data; (*pconn)->idle_ts = settings->initial_ts; + (*pconn)->handshake_confirmed_ts = UINT64_MAX; (*pconn)->crypto.key_update.confirmed_ts = UINT64_MAX; (*pconn)->tx.last_max_data_ts = UINT64_MAX; (*pconn)->tx.pacing.next_ts = UINT64_MAX; (*pconn)->tx.last_blocked_offset = UINT64_MAX; + (*pconn)->rx.preferred_addr.pkt_num = -1; (*pconn)->early.discard_started_ts = UINT64_MAX; conn_reset_ecn_validation_state(*pconn); - ngtcp2_qlog_start( - &(*pconn)->qlog, - server ? ((*pconn)->local.transport_params.retry_scid_present - ? &(*pconn)->local.transport_params.retry_scid - : &(*pconn)->local.transport_params.original_dcid) - : dcid, - server); + ngtcp2_qlog_start(&(*pconn)->qlog, + server + ? ((*pconn)->local.transport_params.retry_scid_present + ? &(*pconn)->local.transport_params.retry_scid + : &(*pconn)->local.transport_params.original_dcid) + : dcid, + server); return 0; -fail_available_versions: - ngtcp2_mem_free(mem, (*pconn)->vneg.preferred_versions); -fail_preferred_versions: -fail_seqgap_push: fail_scid_set_insert: ngtcp2_mem_free(mem, scident); fail_scident: - pktns_free(&(*pconn)->pktns, mem); -fail_pktns_init: pktns_del((*pconn)->hs_pktns, mem); fail_hs_pktns_init: pktns_del((*pconn)->in_pktns, mem); fail_in_pktns_init: + ngtcp2_gaptr_free(&(*pconn)->dcid.seqgap); +fail_seqgap_push: ngtcp2_mem_free(mem, (uint8_t *)(*pconn)->local.settings.token); fail_token: - ngtcp2_mem_free(mem, (*pconn)->qlog.buf.begin); -fail_qlog_buf: - ngtcp2_idtr_free(&(*pconn)->remote.uni.idtr); - ngtcp2_idtr_free(&(*pconn)->remote.bidi.idtr); - ngtcp2_map_free(&(*pconn)->strms); - delete_scid(&(*pconn)->scid.set, mem); - ngtcp2_ksl_free(&(*pconn)->scid.set); - ngtcp2_gaptr_free(&(*pconn)->dcid.seqgap); - ngtcp2_objalloc_free(&(*pconn)->strm_objalloc); - ngtcp2_objalloc_free(&(*pconn)->rtb_entry_objalloc); - ngtcp2_objalloc_free(&(*pconn)->frc_objalloc); ngtcp2_mem_free(mem, *pconn); -fail_conn: + return rv; } int ngtcp2_conn_client_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data) { + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data) { int rv; rv = conn_new(pconn, dcid, scid, path, client_chosen_version, @@ -1438,12 +1448,12 @@ int ngtcp2_conn_client_new_versioned( } int ngtcp2_conn_server_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data) { + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data) { int rv; rv = conn_new(pconn, dcid, scid, path, client_chosen_version, @@ -1471,8 +1481,8 @@ int ngtcp2_conn_server_new_versioned( * credits are considered. */ static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { - return ngtcp2_min(strm->tx.max_offset - strm->tx.offset, - conn->tx.max_offset - conn->tx.offset); + return ngtcp2_min_uint64(strm->tx.max_offset - strm->tx.offset, + conn->tx.max_offset - conn->tx.offset); } /* @@ -1483,7 +1493,7 @@ static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { static uint64_t conn_enforce_flow_control(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t len) { uint64_t fc_credits = conn_fc_credits(conn, strm); - return ngtcp2_min(len, fc_credits); + return ngtcp2_min_uint64(len, fc_credits); } static int delete_strms_each(void *data, void *ptr) { @@ -1525,15 +1535,15 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { if (conn->crypto.key_update.old_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); } if (conn->crypto.key_update.new_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.new_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.new_rx_ckm->aead_ctx); } if (conn->crypto.key_update.new_tx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.new_tx_ckm->aead_ctx); + conn, &conn->crypto.key_update.new_tx_ckm->aead_ctx); } if (conn->pktns.crypto.rx.ckm) { @@ -1551,26 +1561,26 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { if (conn->hs_pktns) { if (conn->hs_pktns->crypto.rx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->hs_pktns->crypto.rx.ckm->aead_ctx); + conn, &conn->hs_pktns->crypto.rx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->hs_pktns->crypto.rx.hp_ctx); if (conn->hs_pktns->crypto.tx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->hs_pktns->crypto.tx.ckm->aead_ctx); + conn, &conn->hs_pktns->crypto.tx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->hs_pktns->crypto.tx.hp_ctx); } if (conn->in_pktns) { if (conn->in_pktns->crypto.rx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->in_pktns->crypto.rx.ckm->aead_ctx); + conn, &conn->in_pktns->crypto.rx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->in_pktns->crypto.rx.hp_ctx); if (conn->in_pktns->crypto.tx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->in_pktns->crypto.tx.ckm->aead_ctx); + conn, &conn->in_pktns->crypto.tx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->in_pktns->crypto.tx.hp_ctx); } @@ -1582,11 +1592,6 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { conn_vneg_crypto_free(conn); - ngtcp2_mem_free(conn->mem, conn->vneg.preferred_versions); - if (conn->vneg.available_versions != server_default_available_versions) { - ngtcp2_mem_free(conn->mem, conn->vneg.available_versions); - } - ngtcp2_mem_free(conn->mem, conn->crypto.decrypt_buf.base); ngtcp2_mem_free(conn->mem, conn->crypto.decrypt_hp_buf.base); ngtcp2_mem_free(conn->mem, (uint8_t *)conn->local.settings.token); @@ -1600,8 +1605,6 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { pktns_del(conn->hs_pktns, conn->mem); pktns_del(conn->in_pktns, conn->mem); - ngtcp2_mem_free(conn->mem, conn->qlog.buf.begin); - ngtcp2_pmtud_del(conn->pmtud); ngtcp2_pv_del(conn->pv); @@ -1609,9 +1612,8 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { ngtcp2_idtr_free(&conn->remote.uni.idtr); ngtcp2_idtr_free(&conn->remote.bidi.idtr); - ngtcp2_mem_free(conn->mem, conn->tx.ack); ngtcp2_pq_free(&conn->tx.strmq); - ngtcp2_map_each_free(&conn->strms, delete_strms_each, (void *)conn); + ngtcp2_map_each(&conn->strms, delete_strms_each, (void *)conn); ngtcp2_map_free(&conn->strms); ngtcp2_pq_free(&conn->scid.used); @@ -1626,165 +1628,14 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { ngtcp2_mem_free(conn->mem, conn); } -/* - * conn_ensure_ack_ranges makes sure that conn->tx.ack->ack.ranges can - * contain at least |n| additional ngtcp2_ack_range. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -static int conn_ensure_ack_ranges(ngtcp2_conn *conn, size_t n) { - ngtcp2_frame *fr; - size_t max = conn->tx.max_ack_ranges; - - if (n <= max) { - return 0; - } - - max *= 2; - - assert(max >= n); - - fr = ngtcp2_mem_realloc(conn->mem, conn->tx.ack, - sizeof(ngtcp2_ack) + sizeof(ngtcp2_ack_range) * max); - if (fr == NULL) { - return NGTCP2_ERR_NOMEM; - } - - conn->tx.ack = fr; - conn->tx.max_ack_ranges = max; - - return 0; -} - /* * conn_compute_ack_delay computes ACK delay for outgoing protected * ACK. */ static ngtcp2_duration conn_compute_ack_delay(ngtcp2_conn *conn) { - return ngtcp2_min(conn->local.transport_params.max_ack_delay, - conn->cstat.smoothed_rtt / 8); -} - -int ngtcp2_conn_create_ack_frame(ngtcp2_conn *conn, ngtcp2_frame **pfr, - ngtcp2_pktns *pktns, uint8_t type, - ngtcp2_tstamp ts, ngtcp2_duration ack_delay, - uint64_t ack_delay_exponent) { - /* TODO Measure an actual size of ACK blocks to find the best - default value. */ - const size_t initial_max_ack_ranges = 8; - int64_t last_pkt_num; - ngtcp2_acktr *acktr = &pktns->acktr; - ngtcp2_ack_range *range; - ngtcp2_ksl_it it; - ngtcp2_acktr_entry *rpkt; - ngtcp2_ack *ack; - size_t range_idx; - ngtcp2_tstamp largest_ack_ts; - int rv; - - if (acktr->flags & NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK) { - ack_delay = 0; - } - - if (!ngtcp2_acktr_require_active_ack(acktr, ack_delay, ts)) { - return 0; - } - - it = ngtcp2_acktr_get(acktr); - if (ngtcp2_ksl_it_end(&it)) { - ngtcp2_acktr_commit_ack(acktr); - return 0; - } - - if (conn->tx.ack == NULL) { - conn->tx.ack = ngtcp2_mem_malloc( - conn->mem, - sizeof(ngtcp2_ack) + sizeof(ngtcp2_ack_range) * initial_max_ack_ranges); - if (conn->tx.ack == NULL) { - return NGTCP2_ERR_NOMEM; - } - conn->tx.max_ack_ranges = initial_max_ack_ranges; - } - - ack = &conn->tx.ack->ack; - - if (pktns->rx.ecn.ect0 || pktns->rx.ecn.ect1 || pktns->rx.ecn.ce) { - ack->type = NGTCP2_FRAME_ACK_ECN; - ack->ecn.ect0 = pktns->rx.ecn.ect0; - ack->ecn.ect1 = pktns->rx.ecn.ect1; - ack->ecn.ce = pktns->rx.ecn.ce; - } else { - ack->type = NGTCP2_FRAME_ACK; - } - ack->rangecnt = 0; - - rpkt = ngtcp2_ksl_it_get(&it); - - if (rpkt->pkt_num == pktns->rx.max_pkt_num) { - last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); - largest_ack_ts = rpkt->tstamp; - ack->largest_ack = rpkt->pkt_num; - ack->first_ack_range = rpkt->len - 1; - - ngtcp2_ksl_it_next(&it); - } else if (rpkt->pkt_num + 1 == pktns->rx.max_pkt_num) { - last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); - largest_ack_ts = pktns->rx.max_pkt_ts; - ack->largest_ack = pktns->rx.max_pkt_num; - ack->first_ack_range = rpkt->len; - - ngtcp2_ksl_it_next(&it); - } else { - assert(rpkt->pkt_num < pktns->rx.max_pkt_num); - - last_pkt_num = pktns->rx.max_pkt_num; - largest_ack_ts = pktns->rx.max_pkt_ts; - ack->largest_ack = pktns->rx.max_pkt_num; - ack->first_ack_range = 0; - } - - if (type == NGTCP2_PKT_1RTT) { - ack->ack_delay_unscaled = ts - largest_ack_ts; - ack->ack_delay = ack->ack_delay_unscaled / NGTCP2_MICROSECONDS / - (1ULL << ack_delay_exponent); - } else { - ack->ack_delay_unscaled = 0; - ack->ack_delay = 0; - } - - for (; !ngtcp2_ksl_it_end(&it); ngtcp2_ksl_it_next(&it)) { - if (ack->rangecnt == NGTCP2_MAX_ACK_RANGES) { - break; - } - - rpkt = ngtcp2_ksl_it_get(&it); - - range_idx = ack->rangecnt++; - rv = conn_ensure_ack_ranges(conn, ack->rangecnt); - if (rv != 0) { - return rv; - } - ack = &conn->tx.ack->ack; - range = &ack->ranges[range_idx]; - range->gap = (uint64_t)(last_pkt_num - rpkt->pkt_num - 2); - range->len = rpkt->len - 1; - - last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); - } - - /* TODO Just remove entries which cannot fit into a single ACK frame - for now. */ - if (!ngtcp2_ksl_it_end(&it)) { - ngtcp2_acktr_forget(acktr, ngtcp2_ksl_it_get(&it)); - } - - *pfr = conn->tx.ack; - - return 0; + return ngtcp2_min_uint64( + conn->local.transport_params.max_ack_delay, + ngtcp2_max_uint64(conn->cstat.smoothed_rtt / 8, NGTCP2_NANOSECONDS)); } /* @@ -1844,8 +1695,9 @@ static int conn_ppe_write_frame(ngtcp2_conn *conn, ngtcp2_ppe *ppe, * NGTCP2_ERR_NOMEM * Out of memory */ -static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_rtb *rtb, +static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_rtb_entry *ent) { + ngtcp2_rtb *rtb = &pktns->rtb; int rv; /* This function implements OnPacketSent, but it handles only @@ -1856,7 +1708,7 @@ static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_rtb *rtb, } if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { - conn->cstat.last_tx_pkt_ts[rtb->pktns_id] = ent->ts; + conn->cstat.last_tx_pkt_ts[pktns->id] = ent->ts; } ngtcp2_conn_set_loss_detection_timer(conn, ent->ts); @@ -1893,22 +1745,13 @@ static size_t pktns_select_pkt_numlen(ngtcp2_pktns *pktns) { return 1; } -/* - * conn_get_cwnd returns cwnd for the current path. - */ -static uint64_t conn_get_cwnd(ngtcp2_conn *conn) { - return conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) - ? ngtcp2_cc_compute_initcwnd(conn->cstat.max_tx_udp_payload_size) - : conn->cstat.cwnd; -} - /* * conn_cwnd_is_zero returns nonzero if the number of bytes the local * endpoint can sent at this time is zero. */ static int conn_cwnd_is_zero(ngtcp2_conn *conn) { uint64_t bytes_in_flight = conn->cstat.bytes_in_flight; - uint64_t cwnd = conn_get_cwnd(conn); + uint64_t cwnd = conn->cstat.cwnd; if (bytes_in_flight >= cwnd) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, @@ -1947,7 +1790,7 @@ static uint64_t conn_retry_early_payloadlen(ngtcp2_conn *conn) { /* Take the min because in conn_should_pad_pkt we take max in order to deal with unbreakable DATAGRAM. */ - return ngtcp2_min(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); + return ngtcp2_min_uint64(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); } return 0; @@ -2021,12 +1864,13 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, return 0; } - if (conn->hs_pktns->crypto.tx.ckm && - (conn->hs_pktns->rtb.probe_pkt_left || - !ngtcp2_strm_streamfrq_empty(&conn->hs_pktns->crypto.strm) || - !ngtcp2_acktr_empty(&conn->hs_pktns->acktr))) { - /* If we have something to send in Handshake packet, then add - PADDING in Handshake packet. */ + if ((conn->hs_pktns->crypto.tx.ckm && + (conn->hs_pktns->rtb.probe_pkt_left || + !ngtcp2_strm_streamfrq_empty(&conn->hs_pktns->crypto.strm) || + !ngtcp2_acktr_empty(&conn->hs_pktns->acktr))) || + conn->pktns.crypto.tx.ckm) { + /* If we have something to send in Handshake or 1RTT packet, + then add PADDING in that packet. */ min_payloadlen = NGTCP2_MIN_COALESCED_PAYLOADLEN; } else { return 1; @@ -2044,7 +1888,7 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, PADDING in that packet. Take maximum in case that write_datalen includes DATAGRAM which cannot be split. */ min_payloadlen = - ngtcp2_max(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); + ngtcp2_max_uint64(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); } else { return 1; } @@ -2067,8 +1911,8 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, return left < /* TODO Assuming that pkt_num is encoded in 1 byte. */ NGTCP2_MIN_LONG_HEADERLEN + conn->dcid.current.cid.datalen + - conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + - NGTCP2_MAX_AEAD_OVERHEAD; + conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + + NGTCP2_MAX_AEAD_OVERHEAD; } static void conn_restart_timer_on_write(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -2143,33 +1987,36 @@ void ngtcp2_conn_set_keep_alive_timeout(ngtcp2_conn *conn, conn->keep_alive.timeout = timeout; } -/* - * NGTCP2_PKT_PACING_OVERHEAD defines overhead of userspace event - * loop. Packet pacing might require sub milliseconds packet spacing, - * but userspace event loop might not offer such precision. - * Typically, if delay is 0.5 microseconds, the actual delay after - * which we can send packet is well over 1 millisecond when event loop - * is involved (which includes other stuff, like reading packets etc - * in a typical single threaded use case). - */ -#define NGTCP2_PKT_PACING_OVERHEAD NGTCP2_MILLISECONDS - static void conn_cancel_expired_pkt_tx_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (conn->tx.pacing.next_ts == UINT64_MAX) { return; } - if (conn->tx.pacing.next_ts > ts + NGTCP2_PKT_PACING_OVERHEAD) { + if (conn->tx.pacing.next_ts > ts) { return; } + if (ts > conn->tx.pacing.next_ts) { + conn->tx.pacing.compensation += ts - conn->tx.pacing.next_ts; + } + conn->tx.pacing.next_ts = UINT64_MAX; } static int conn_pacing_pkt_tx_allowed(ngtcp2_conn *conn, ngtcp2_tstamp ts) { - return conn->tx.pacing.next_ts == UINT64_MAX || - conn->tx.pacing.next_ts <= ts + NGTCP2_PKT_PACING_OVERHEAD; + if (conn->tx.pacing.next_ts == UINT64_MAX) { + return 1; + } + + if (conn->tx.pacing.next_ts > ts) { + return 0; + } + + conn->tx.pacing.compensation += ts - conn->tx.pacing.next_ts; + conn->tx.pacing.next_ts = UINT64_MAX; + + return 1; } static uint8_t conn_pkt_flags(ngtcp2_conn *conn) { @@ -2189,15 +2036,18 @@ static uint8_t conn_pkt_flags_long(ngtcp2_conn *conn) { static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { return (uint8_t)(conn_pkt_flags(conn) | ((conn->pktns.crypto.tx.ckm->flags & NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE) - ? NGTCP2_PKT_FLAG_KEY_PHASE - : NGTCP2_PKT_FLAG_NONE)); + ? NGTCP2_PKT_FLAG_KEY_PHASE + : NGTCP2_PKT_FLAG_NONE)); } +static size_t conn_min_pktlen(ngtcp2_conn *conn); + /* * conn_write_handshake_pkt writes handshake packet in the buffer - * pointed by |dest| whose length is |destlen|. |type| specifies long - * packet type. It should be either NGTCP2_PKT_INITIAL or - * NGTCP2_PKT_HANDSHAKE_PKT. + * pointed by |dest| whose length is |destlen|. |dgram_offset| is the + * offset in UDP datagram payload where this QUIC packet is positioned + * at. |type| specifies long packet type. It should be either + * NGTCP2_PKT_INITIAL or NGTCP2_PKT_HANDSHAKE_PKT. * * |write_datalen| is the minimum length of application data ready to * send in subsequent 0RTT packet. @@ -2212,13 +2062,15 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { */ static ngtcp2_ssize conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint8_t type, uint8_t flags, - uint64_t write_datalen, ngtcp2_tstamp ts) { + size_t destlen, size_t dgram_offset, uint8_t type, + uint8_t flags, uint64_t write_datalen, + ngtcp2_tstamp ts) { int rv; ngtcp2_ppe ppe; ngtcp2_pkt_hd hd; ngtcp2_frame_chain *frq = NULL, **pfrc = &frq; ngtcp2_frame_chain *nfrc; + ngtcp2_max_frame mfr; ngtcp2_frame *ackfr = NULL, lfr; ngtcp2_ssize spktlen; ngtcp2_crypto_cc cc; @@ -2228,6 +2080,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, uint16_t rtb_entry_flags = NGTCP2_RTB_ENTRY_FLAG_NONE; int require_padding = (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) != 0; int pkt_empty = 1; + int min_padded = 0; int padded = 0; int hd_logged = 0; uint64_t crypto_offset; @@ -2271,10 +2124,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, cc.encrypt = conn->callbacks.encrypt; cc.hp_mask = conn->callbacks.hp_mask; - ngtcp2_pkt_hd_init(&hd, conn_pkt_flags_long(conn), type, - &conn->dcid.current.cid, &conn->oscid, - pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), - version, 0); + ngtcp2_pkt_hd_init( + &hd, conn_pkt_flags_long(conn), type, &conn->dcid.current.cid, &conn->oscid, + pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), version); if (!conn->server && type == NGTCP2_PKT_INITIAL && conn->local.settings.tokenlen) { @@ -2282,7 +2134,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, hd.tokenlen = conn->local.settings.tokenlen; } - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, dgram_offset, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { @@ -2294,14 +2146,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, return 0; } - rv = ngtcp2_conn_create_ack_frame(conn, &ackfr, pktns, type, ts, - /* ack_delay = */ 0, - NGTCP2_DEFAULT_ACK_DELAY_EXPONENT); - if (rv != 0) { - ngtcp2_frame_chain_list_objalloc_del(frq, &conn->frc_objalloc, conn->mem); - return rv; - } - + ackfr = ngtcp2_acktr_create_ack_frame(&pktns->acktr, &mfr.fr, type, ts, + /* ack_delay = */ 0, + NGTCP2_DEFAULT_ACK_DELAY_EXPONENT); if (ackfr) { rv = conn_ppe_write_frame_hd_log(conn, &ppe, &hd_logged, &hd, ackfr); if (rv != 0) { @@ -2395,7 +2242,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, assert(rv == NGTCP2_ERR_NOBUF); } else { rtb_entry_flags |= - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PROBE; + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PROBE; pkt_empty = 0; } } @@ -2412,6 +2259,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, } else { rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING; pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; + pkt_empty = 0; } } else if (pktns->tx.non_ack_pkt_start_ts == UINT64_MAX) { pktns->tx.non_ack_pkt_start_ts = ts; @@ -2429,20 +2277,24 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, /* If we cannot write another packet, then we need to add padding to Initial here. */ if (conn_should_pad_pkt( - conn, type, ngtcp2_ppe_left(&ppe), write_datalen, - (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) != 0, - require_padding)) { + conn, type, ngtcp2_ppe_left(&ppe), write_datalen, + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) != 0, + require_padding)) { lfr.type = NGTCP2_FRAME_PADDING; - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else if (pkt_empty) { return 0; } else { lfr.type = NGTCP2_FRAME_PADDING; - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(&ppe); + lfr.padding.len = ngtcp2_ppe_padding_size(&ppe, conn_min_pktlen(conn)); + min_padded = 1; } if (lfr.padding.len) { - padded = 1; + if (!min_padded || + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { + padded = 1; + } ngtcp2_log_tx_fr(&conn->log, &hd, &lfr); ngtcp2_qlog_write_frame(&conn->qlog, &lfr); } @@ -2461,16 +2313,16 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, &hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, frq, ts, (size_t)spktlen, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, frq, ts, (size_t)spktlen, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_list_objalloc_del(frq, &conn->frc_objalloc, conn->mem); return rv; } - rv = conn_on_pkt_sent(conn, &pktns->rtb, rtbent); + rv = conn_on_pkt_sent(conn, pktns, rtbent); if (rv != 0) { ngtcp2_rtb_entry_objalloc_del(rtbent, &conn->rtb_entry_objalloc, &conn->frc_objalloc, conn->mem); @@ -2519,12 +2371,12 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, static ngtcp2_ssize conn_write_ack_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, uint8_t type, ngtcp2_tstamp ts) { - int rv; ngtcp2_frame *ackfr; ngtcp2_pktns *pktns; ngtcp2_duration ack_delay; uint64_t ack_delay_exponent; ngtcp2_ssize spktlen; + ngtcp2_max_frame mfr; assert(!(conn->flags & NGTCP2_CONN_FLAG_PPE_PENDING)); @@ -2553,20 +2405,15 @@ static ngtcp2_ssize conn_write_ack_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return 0; } - ackfr = NULL; - rv = ngtcp2_conn_create_ack_frame(conn, &ackfr, pktns, type, ts, ack_delay, - ack_delay_exponent); - if (rv != 0) { - return rv; - } - + ackfr = ngtcp2_acktr_create_ack_frame(&pktns->acktr, &mfr.fr, type, ts, + ack_delay, ack_delay_exponent); if (!ackfr) { return 0; } spktlen = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, type, NGTCP2_WRITE_PKT_FLAG_NONE, - &conn->dcid.current.cid, ackfr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, type, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, ackfr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (spktlen <= 0) { return spktlen; @@ -2588,8 +2435,8 @@ static void conn_discard_pktns(ngtcp2_conn *conn, ngtcp2_pktns **ppktns, conn->cstat.bytes_in_flight -= bytes_in_flight; conn->cstat.pto_count = 0; - conn->cstat.last_tx_pkt_ts[pktns->rtb.pktns_id] = UINT64_MAX; - conn->cstat.loss_time[pktns->rtb.pktns_id] = UINT64_MAX; + conn->cstat.last_tx_pkt_ts[pktns->id] = UINT64_MAX; + conn->cstat.loss_time[pktns->id] = UINT64_MAX; conn_call_delete_crypto_aead_ctx(conn, &pktns->crypto.rx.ckm->aead_ctx); conn_call_delete_crypto_cipher_ctx(conn, &pktns->crypto.rx.hp_ctx); @@ -2602,11 +2449,7 @@ static void conn_discard_pktns(ngtcp2_conn *conn, ngtcp2_pktns **ppktns, ngtcp2_conn_set_loss_detection_timer(conn, ts); } -/* - * conn_discard_initial_state discards state for Initial packet number - * space. - */ -static void conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { +void ngtcp2_conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (!conn->in_pktns) { return; } @@ -2622,11 +2465,7 @@ static void conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { memset(&conn->vneg.tx, 0, sizeof(conn->vneg.tx)); } -/* - * conn_discard_handshake_state discards state for Handshake packet - * number space. - */ -static void conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { +void ngtcp2_conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (!conn->hs_pktns) { return; } @@ -2672,7 +2511,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, to send ACK is give server RTT measurement early. */ if (conn->server && conn->in_pktns) { nwrite = - conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, ts); + conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2685,7 +2524,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, if (conn->hs_pktns->crypto.tx.ckm) { nwrite = - conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, ts); + conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2694,7 +2533,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, res += nwrite; if (!conn->server && nwrite) { - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } } @@ -2725,9 +2564,9 @@ static ngtcp2_ssize conn_write_client_initial(ngtcp2_conn *conn, return rv; } - return conn_write_handshake_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, early_datalen, - ts); + return conn_write_handshake_pkt( + conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, NGTCP2_WRITE_PKT_FLAG_NONE, + early_datalen, ts); } /* @@ -2807,11 +2646,11 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, conn->hs_pktns->rtb.probe_pkt_left)) { /* Discard Initial state here so that Handshake packet is not padded. */ - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } else if (conn->in_pktns) { nwrite = - conn_write_handshake_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); + conn_write_handshake_pkt(conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, + NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2823,11 +2662,11 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, !ngtcp2_strm_streamfrq_empty(&conn->in_pktns->crypto.strm))) { if (cstat->loss_detection_timer != UINT64_MAX && conn_server_tx_left(conn, &conn->dcid.current) < - NGTCP2_MAX_UDP_PAYLOAD_SIZE) { + NGTCP2_MAX_UDP_PAYLOAD_SIZE) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - cstat->loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } return 0; @@ -2837,10 +2676,10 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, dest += nwrite; destlen -= (size_t)nwrite; - if (destlen) { - /* We might have already added padding to Initial, but in that - case, we should have destlen == 0 and no Handshake packet - will be written. */ + /* If initial packet size is at least + NGTCP2_MAX_UDP_PAYLOAD_SIZE, no extra padding is needed in a + subsequent packet. */ + if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { if (conn->server) { it = ngtcp2_rtb_head(&conn->in_pktns->rtb); if (!ngtcp2_ksl_it_end(&it)) { @@ -2856,8 +2695,9 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, } } - nwrite = conn_write_handshake_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, wflags, write_datalen, ts); + nwrite = + conn_write_handshake_pkt(conn, pi, dest, destlen, (size_t)res, + NGTCP2_PKT_HANDSHAKE, wflags, write_datalen, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2869,7 +2709,7 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, /* We don't need to send further Initial packet if we have Handshake key and sent something with it. So discard initial state here. */ - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } return res; @@ -2905,7 +2745,7 @@ static int conn_should_send_max_stream_data(ngtcp2_conn *conn, uint64_t inc = strm->rx.unsent_max_offset - strm->rx.max_offset; (void)conn; - return strm->rx.window < 2 * inc; + return strm->rx.window < 4 * inc; } /* @@ -2915,7 +2755,7 @@ static int conn_should_send_max_stream_data(ngtcp2_conn *conn, static int conn_should_send_max_data(ngtcp2_conn *conn) { uint64_t inc = conn->rx.unsent_max_offset - conn->rx.max_offset; - return conn->rx.window < 2 * inc; + return conn->rx.window < 4 * inc; } /* @@ -2948,9 +2788,9 @@ static size_t conn_required_num_new_connection_id(ngtcp2_conn *conn) { n = conn->remote.transport_params->active_connection_id_limit + conn->scid.num_retired; - n = ngtcp2_min(NGTCP2_MAX_SCID_POOL_SIZE, n) - len; + n = ngtcp2_min_uint64(NGTCP2_MAX_SCID_POOL_SIZE, n) - len; - return (size_t)ngtcp2_min(lim, n); + return (size_t)ngtcp2_min_uint64(lim, n); } /* @@ -3031,6 +2871,10 @@ static int conn_enqueue_new_connection_id(ngtcp2_conn *conn) { return 0; } +static int dcidtr_on_deactivate(const ngtcp2_dcid *dcid, void *user_data) { + return conn_call_deactivate_dcid(user_data, dcid); +} + /* * conn_remove_retired_connection_id removes the already retired * connection ID. It waits PTO before actually removing a connection @@ -3050,7 +2894,6 @@ static int conn_remove_retired_connection_id(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_duration timeout = pto; ngtcp2_scid *scid; - ngtcp2_dcid *dcid; int rv; for (; !ngtcp2_pq_empty(&conn->scid.used);) { @@ -3075,29 +2918,22 @@ static int conn_remove_retired_connection_id(ngtcp2_conn *conn, --conn->scid.num_retired; } - for (; ngtcp2_ringbuf_len(&conn->dcid.retired.rb);) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, 0); - if (dcid->retired_ts + timeout >= ts) { - break; - } - - rv = conn_call_deactivate_dcid(conn, dcid); - if (rv != 0) { - return rv; - } - - ngtcp2_ringbuf_pop_front(&conn->dcid.retired.rb); + rv = ngtcp2_dcidtr_remove_stale_retired_dcid(&conn->dcid.dtr, timeout, ts, + dcidtr_on_deactivate, conn); + if (rv != 0) { + return rv; } return 0; } /* - * conn_min_short_pktlen returns the minimum length of Short packet - * this endpoint sends. + * conn_min_pktlen returns the minimum length of packet this endpoint + * sends. It may underestimate the length because this does not take + * into account header protection sample. */ -static size_t conn_min_short_pktlen(ngtcp2_conn *conn) { - return conn->dcid.current.cid.datalen + NGTCP2_MIN_PKT_EXPANDLEN; +static size_t conn_min_pktlen(ngtcp2_conn *conn) { + return conn->oscid.datalen + NGTCP2_MIN_PKT_EXPANDLEN; } /* @@ -3155,8 +2991,10 @@ static void conn_reset_ppe_pending(ngtcp2_conn *conn) { /* * conn_write_pkt writes a protected packet in the buffer pointed by - * |dest| whose length if |destlen|. |type| specifies the type of - * packet. It can be NGTCP2_PKT_1RTT or NGTCP2_PKT_0RTT. + * |dest| whose length if |destlen|. |dgram_offset| is the offset in + * UDP datagram payload where this QUIC packet is positioned at. + * |type| specifies the type of packet. It can be NGTCP2_PKT_1RTT or + * NGTCP2_PKT_0RTT. * * This function can send new stream data. In order to send stream * data, specify the underlying stream and parameters to @@ -3183,12 +3021,14 @@ static void conn_reset_ppe_pending(ngtcp2_conn *conn) { */ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - ngtcp2_vmsg *vmsg, uint8_t type, - uint8_t flags, ngtcp2_tstamp ts) { + size_t dgram_offset, ngtcp2_vmsg *vmsg, + uint8_t type, uint8_t flags, + ngtcp2_tstamp ts) { int rv = 0; ngtcp2_crypto_cc *cc = &conn->pkt.cc; ngtcp2_ppe *ppe = &conn->pkt.ppe; ngtcp2_pkt_hd *hd = &conn->pkt.hd; + ngtcp2_max_frame mfr; ngtcp2_frame *ackfr = NULL, lfr; ngtcp2_ssize nwrite; ngtcp2_frame_chain **pfrc, *nfrc, *frc; @@ -3211,7 +3051,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, int require_padding = (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) != 0; int write_more = (flags & NGTCP2_WRITE_PKT_FLAG_MORE) != 0; int ppe_pending = (conn->flags & NGTCP2_CONN_FLAG_PPE_PENDING) != 0; - size_t min_pktlen = conn_min_short_pktlen(conn); + size_t min_pktlen = conn_min_pktlen(conn); + int min_padded = 0; int padded = 0; ngtcp2_cc_pkt cc_pkt; uint64_t crypto_offset; @@ -3311,7 +3152,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (conn->local.settings.max_window && conn->tx.last_max_data_ts != UINT64_MAX && ts - conn->tx.last_max_data_ts < - NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && + NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && conn->local.settings.max_window > conn->rx.window) { target_max_data = NGTCP2_FLOW_WINDOW_SCALING_FACTOR * conn->rx.window; if (target_max_data > conn->local.settings.max_window) { @@ -3336,40 +3177,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, pktns->tx.frq = nfrc; conn->rx.max_offset = conn->rx.unsent_max_offset = - nfrc->fr.max_data.max_data; - } - - if (stream_blocked && conn_should_send_max_data(conn)) { - rv = ngtcp2_frame_chain_objalloc_new(&nfrc, &conn->frc_objalloc); - if (rv != 0) { - return rv; - } - - nfrc->fr.type = NGTCP2_FRAME_DATA_BLOCKED; - nfrc->fr.data_blocked.offset = conn->tx.max_offset; - nfrc->next = pktns->tx.frq; - pktns->tx.frq = nfrc; - - conn->tx.last_blocked_offset = conn->tx.max_offset; - } - - if (stream_blocked && !ngtcp2_strm_is_tx_queued(vmsg->stream.strm) && - strm_should_send_stream_data_blocked(vmsg->stream.strm)) { - assert(vmsg); - assert(vmsg->type == NGTCP2_VMSG_TYPE_STREAM); - - vmsg->stream.strm->cycle = conn_tx_strmq_first_cycle(conn); - rv = ngtcp2_conn_tx_strmq_push(conn, vmsg->stream.strm); - if (rv != 0) { - return rv; - } + nfrc->fr.max_data.max_data; } ngtcp2_pkt_hd_init(hd, hd_flags, type, &conn->dcid.current.cid, scid, pktns->tx.last_pkt_num + 1, - pktns_select_pkt_numlen(pktns), version, 0); + pktns_select_pkt_numlen(pktns), version); - ngtcp2_ppe_init(ppe, dest, destlen, cc); + ngtcp2_ppe_init(ppe, dest, destlen, dgram_offset, cc); rv = ngtcp2_ppe_encode_hd(ppe, hd); if (rv != 0) { @@ -3406,14 +3221,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } } - rv = ngtcp2_conn_create_ack_frame( - conn, &ackfr, pktns, type, ts, conn_compute_ack_delay(conn), - conn->local.transport_params.ack_delay_exponent); - if (rv != 0) { - assert(ngtcp2_err_is_fatal(rv)); - return rv; - } - + ackfr = ngtcp2_acktr_create_ack_frame( + &pktns->acktr, &mfr.fr, type, ts, conn_compute_ack_delay(conn), + conn->local.transport_params.ack_delay_exponent); if (ackfr) { rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, ackfr); if (rv != 0) { @@ -3422,10 +3232,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_acktr_commit_ack(&pktns->acktr); ngtcp2_acktr_add_ack(&pktns->acktr, hd->pkt_num, ackfr->ack.largest_ack); - if (type == NGTCP2_PKT_1RTT) { - conn_handle_unconfirmed_key_update_from_remote( - conn, ackfr->ack.largest_ack, ts); - } + assert(NGTCP2_PKT_1RTT == type); + conn_handle_unconfirmed_key_update_from_remote( + conn, ackfr->ack.largest_ack, ts); pkt_empty = 0; } } @@ -3443,7 +3252,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, switch ((*pfrc)->fr.type) { case NGTCP2_FRAME_RESET_STREAM: strm = - ngtcp2_conn_find_stream(conn, (*pfrc)->fr.reset_stream.stream_id); + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.reset_stream.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_reset_stream(strm)) { frc = *pfrc; @@ -3454,7 +3263,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, break; case NGTCP2_FRAME_STOP_SENDING: strm = - ngtcp2_conn_find_stream(conn, (*pfrc)->fr.stop_sending.stream_id); + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.stop_sending.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stop_sending(strm)) { frc = *pfrc; @@ -3484,10 +3293,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } break; case NGTCP2_FRAME_MAX_STREAM_DATA: - strm = ngtcp2_conn_find_stream(conn, - (*pfrc)->fr.max_stream_data.stream_id); + strm = + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.max_stream_data.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_max_stream_data( - strm, &(*pfrc)->fr.max_stream_data)) { + strm, &(*pfrc)->fr.max_stream_data)) { frc = *pfrc; *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, &conn->frc_objalloc, conn->mem); @@ -3504,9 +3313,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, break; case NGTCP2_FRAME_STREAM_DATA_BLOCKED: strm = ngtcp2_conn_find_stream( - conn, (*pfrc)->fr.stream_data_blocked.stream_id); + conn, (*pfrc)->fr.stream_data_blocked.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stream_data_blocked( - strm, &(*pfrc)->fr.stream_data_blocked)) { + strm, &(*pfrc)->fr.stream_data_blocked)) { frc = *pfrc; *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, &conn->frc_objalloc, conn->mem); @@ -3543,7 +3352,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, left = ngtcp2_ppe_left(ppe); crypto_offset = - ngtcp2_strm_streamfrq_unacked_offset(&pktns->crypto.strm); + ngtcp2_strm_streamfrq_unacked_offset(&pktns->crypto.strm); if (crypto_offset == (uint64_t)-1) { ngtcp2_strm_streamfrq_clear(&pktns->crypto.strm); break; @@ -3593,14 +3402,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_RESET_STREAM; nfrc->fr.reset_stream.stream_id = strm->stream_id; nfrc->fr.reset_stream.app_error_code = - strm->tx.reset_stream_app_error_code; + strm->tx.reset_stream_app_error_code; nfrc->fr.reset_stream.final_size = strm->tx.offset; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_RESET_STREAM; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3620,8 +3429,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, strm->flags &= ~NGTCP2_STRM_FLAG_SEND_STOP_SENDING; } else { rv = conn_call_stream_stop_sending( - conn, strm->stream_id, strm->tx.stop_sending_app_error_code, - strm->stream_user_data); + conn, strm->stream_id, strm->tx.stop_sending_app_error_code, + strm->stream_user_data); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); @@ -3636,13 +3445,13 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_STOP_SENDING; nfrc->fr.stop_sending.stream_id = strm->stream_id; nfrc->fr.stop_sending.app_error_code = - strm->tx.stop_sending_app_error_code; + strm->tx.stop_sending_app_error_code; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_STOP_SENDING; - rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, - &nfrc->fr); + rv = + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3672,7 +3481,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, strm->tx.last_blocked_offset = strm->tx.max_offset; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3698,10 +3507,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (conn->local.settings.max_stream_window && strm->tx.last_max_stream_data_ts != UINT64_MAX && ts - strm->tx.last_max_stream_data_ts < - NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && + NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && conn->local.settings.max_stream_window > strm->rx.window) { target_max_data = - NGTCP2_FLOW_WINDOW_SCALING_FACTOR * strm->rx.window; + NGTCP2_FLOW_WINDOW_SCALING_FACTOR * strm->rx.window; if (target_max_data > conn->local.settings.max_stream_window) { target_max_data = conn->local.settings.max_stream_window; } @@ -3721,14 +3530,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_MAX_STREAM_DATA; nfrc->fr.max_stream_data.stream_id = strm->stream_id; nfrc->fr.max_stream_data.max_stream_data = - strm->rx.unsent_max_offset + delta; + strm->rx.unsent_max_offset + delta; *pfrc = nfrc; strm->rx.max_offset = strm->rx.unsent_max_offset = - nfrc->fr.max_stream_data.max_stream_data; + nfrc->fr.max_stream_data.max_stream_data; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); break; @@ -3806,7 +3615,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (*pfrc == NULL && conn->remote.bidi.unsent_max_streams > conn->remote.bidi.max_streams) { rv = conn_call_extend_max_remote_streams_bidi( - conn, conn->remote.bidi.unsent_max_streams); + conn, conn->remote.bidi.unsent_max_streams); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3838,7 +3647,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (*pfrc == NULL && conn->remote.uni.unsent_max_streams > conn->remote.uni.max_streams) { rv = conn_call_extend_max_remote_streams_uni( - conn, conn->remote.uni.unsent_max_streams); + conn, conn->remote.uni.unsent_max_streams); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3899,10 +3708,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, left = ngtcp2_ppe_left(ppe); - if (*pfrc == NULL && send_stream && + if (*pfrc == NULL && send_stream && ngtcp2_pq_empty(&conn->tx.strmq) && (ndatalen = ngtcp2_pkt_stream_max_datalen( - vmsg->stream.strm->stream_id, vmsg->stream.strm->tx.offset, ndatalen, - left)) != (size_t)-1 && + vmsg->stream.strm->stream_id, vmsg->stream.strm->tx.offset, ndatalen, + left)) != (size_t)-1 && (ndatalen || datalen == 0)) { datacnt = ngtcp2_vec_copy_at_most(data, NGTCP2_MAX_STREAM_DATACNT, vmsg->stream.data, vmsg->stream.datacnt, @@ -3912,7 +3721,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert((datacnt == 0 && datalen == 0) || (datacnt && datalen)); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, datacnt, &conn->frc_objalloc, conn->mem); + &nfrc, datacnt, &conn->frc_objalloc, conn->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3944,6 +3753,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, vmsg->stream.strm->tx.offset += ndatalen; conn->tx.offset += ndatalen; + vmsg->stream.strm->flags |= NGTCP2_STRM_FLAG_ANY_SENT; if (fin) { ngtcp2_strm_shutdown(vmsg->stream.strm, NGTCP2_STRM_FLAG_SHUT_WR); @@ -4095,7 +3905,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } keep_alive_expired = - type == NGTCP2_PKT_1RTT && conn_keep_alive_expired(conn, ts); + type == NGTCP2_PKT_1RTT && conn_keep_alive_expired(conn, ts); if (conn->pktns.rtb.probe_pkt_left == 0 && !keep_alive_expired && !require_padding) { @@ -4154,8 +3964,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING; if (conn->pktns.rtb.probe_pkt_left) { rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_PROBE; + } else { + rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING; } pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; + pkt_empty = 0; } } else if (pktns->tx.non_ack_pkt_start_ts == UINT64_MAX) { pktns->tx.non_ack_pkt_start_ts = ts; @@ -4166,19 +3979,19 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, /* TODO Push STREAM frame back to ngtcp2_strm if there is an error before ngtcp2_rtb_entry is safely created and added. */ - if (require_padding || - /* Making full sized packet will help GSO a bit */ - ngtcp2_ppe_left(ppe) < 10) { - lfr.padding.len = ngtcp2_ppe_padding(ppe); - } else if (type == NGTCP2_PKT_1RTT) { - lfr.padding.len = ngtcp2_ppe_padding_size(ppe, min_pktlen); + if (require_padding) { + lfr.padding.len = ngtcp2_ppe_dgram_padding(ppe); } else { - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(ppe); + lfr.padding.len = ngtcp2_ppe_padding_size(ppe, min_pktlen); + min_padded = 1; } if (lfr.padding.len) { + if (!min_padded || + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { + padded = 1; + } lfr.type = NGTCP2_FRAME_PADDING; - padded = 1; ngtcp2_log_tx_fr(&conn->log, hd, &lfr); ngtcp2_qlog_write_frame(&conn->qlog, &lfr); } @@ -4200,11 +4013,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&ent, hd, NULL, ts, (size_t)nwrite, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&ent, hd, NULL, ts, (size_t)nwrite, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { - assert(ngtcp2_err_is_fatal((int)nwrite)); + assert(ngtcp2_err_is_fatal(rv)); return rv; } @@ -4220,7 +4033,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ts); } - rv = conn_on_pkt_sent(conn, &pktns->rtb, ent); + rv = conn_on_pkt_sent(conn, pktns, ent); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_rtb_entry_objalloc_del(ent, &conn->rtb_entry_objalloc, @@ -4231,10 +4044,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { if (conn->cc.on_pkt_sent) { conn->cc.on_pkt_sent( - &conn->cc, &conn->cstat, - ngtcp2_cc_pkt_init(&cc_pkt, hd->pkt_num, (size_t)nwrite, - NGTCP2_PKTNS_ID_APPLICATION, ts, ent->rst.lost, - ent->rst.tx_in_flight, ent->rst.is_app_limited)); + &conn->cc, &conn->cstat, + ngtcp2_cc_pkt_init(&cc_pkt, hd->pkt_num, (size_t)nwrite, + NGTCP2_PKTNS_ID_APPLICATION, ts, ent->rst.lost, + ent->rst.tx_in_flight, ent->rst.is_app_limited)); } if (conn->flags & NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE) { @@ -4269,9 +4082,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( - ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, - uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, + uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts) { int rv; ngtcp2_ppe ppe; ngtcp2_pkt_hd hd; @@ -4330,9 +4143,9 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( ngtcp2_pkt_hd_init(&hd, hd_flags, type, dcid, scid, pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), - version, 0); + version); - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, 0, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { @@ -4354,25 +4167,22 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( } lfr.type = NGTCP2_FRAME_PADDING; - if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) { - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL) { + lfr.padding.len = ngtcp2_ppe_dgram_padding_size(&ppe, destlen); + } else if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) { + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else { switch (fr->type) { case NGTCP2_FRAME_PATH_CHALLENGE: case NGTCP2_FRAME_PATH_RESPONSE: if (!conn->server || destlen >= NGTCP2_MAX_UDP_PAYLOAD_SIZE) { - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else { lfr.padding.len = 0; } break; default: - if (type == NGTCP2_PKT_1RTT) { - lfr.padding.len = - ngtcp2_ppe_padding_size(&ppe, conn_min_short_pktlen(conn)); - } else { - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(&ppe); - } + lfr.padding.len = ngtcp2_ppe_padding_size(&ppe, conn_min_pktlen(conn)); } } if (lfr.padding.len) { @@ -4402,6 +4212,12 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( conn_handle_unconfirmed_key_update_from_remote(conn, fr->ack.largest_ack, ts); } + + if (!(flags & (NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL | + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING))) { + padded = 0; + } + break; } @@ -4412,14 +4228,14 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, &hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, NULL, ts, (size_t)nwrite, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, NULL, ts, (size_t)nwrite, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { return rv; } - rv = conn_on_pkt_sent(conn, &pktns->rtb, rtbent); + rv = conn_on_pkt_sent(conn, pktns, rtbent); if (rv != 0) { ngtcp2_rtb_entry_objalloc_del(rtbent, &conn->rtb_entry_objalloc, &conn->frc_objalloc, conn->mem); @@ -4506,26 +4322,19 @@ static int conn_handshake_remnants_left(ngtcp2_conn *conn) { } /* - * conn_retire_dcid_seq retires destination connection ID denoted by - * |seq|. + * conn_enqueue_retire_connection_id enqueues RETIRE_CONNECTION_ID + * frame with |seq|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_NOMEM * Out of memory. - * NGTCP2_ERR_CONNECTION_ID_LIMIT - * The number of unacknowledged retirement exceeds the limit. */ -static int conn_retire_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { +static int conn_enqueue_retire_connection_id(ngtcp2_conn *conn, uint64_t seq) { ngtcp2_pktns *pktns = &conn->pktns; ngtcp2_frame_chain *nfrc; - int rv; - - rv = ngtcp2_conn_track_retired_dcid_seq(conn, seq); - if (rv != 0) { - return rv; - } + int rv; rv = ngtcp2_frame_chain_objalloc_new(&nfrc, &conn->frc_objalloc); if (rv != 0) { @@ -4540,8 +4349,12 @@ static int conn_retire_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { return 0; } +static int dcidtr_on_retire(const ngtcp2_dcid *dcid, void *user_data) { + return conn_enqueue_retire_connection_id(user_data, dcid->seq); +} + /* - * conn_retire_dcid retires |dcid|. + * conn_retire_active_dcid retires the activated |dcid|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -4549,29 +4362,19 @@ static int conn_retire_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { * NGTCP2_ERR_NOMEM * Out of memory */ -static int conn_retire_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, - ngtcp2_tstamp ts) { - ngtcp2_ringbuf *rb = &conn->dcid.retired.rb; - ngtcp2_dcid *dest, *stale_dcid; +static int conn_retire_active_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, + ngtcp2_tstamp ts) { int rv; assert(dcid->cid.datalen); - if (ngtcp2_ringbuf_full(rb)) { - stale_dcid = ngtcp2_ringbuf_get(rb, 0); - rv = conn_call_deactivate_dcid(conn, stale_dcid); - if (rv != 0) { - return rv; - } - - ngtcp2_ringbuf_pop_front(rb); + rv = ngtcp2_dcidtr_retire_active_dcid(&conn->dcid.dtr, dcid, ts, + dcidtr_on_deactivate, conn); + if (rv != 0) { + return rv; } - dest = ngtcp2_ringbuf_push_back(rb); - ngtcp2_dcid_copy(dest, dcid); - dest->retired_ts = ts; - - return conn_retire_dcid_seq(conn, dcid->seq); + return conn_enqueue_retire_connection_id(conn, dcid->seq); } /* @@ -4590,61 +4393,28 @@ static int conn_retire_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, */ static int conn_bind_dcid(ngtcp2_conn *conn, ngtcp2_dcid **pdcid, const ngtcp2_path *path, ngtcp2_tstamp ts) { - ngtcp2_dcid *dcid, *ndcid; - ngtcp2_cid cid; - size_t i, len; - int rv; - assert(!ngtcp2_path_eq(&conn->dcid.current.ps.path, path)); assert(!conn->pv || !ngtcp2_path_eq(&conn->pv->dcid.ps.path, path)); - assert(!conn->pv || !(conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) || + assert(!conn->pv || !(conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) || !ngtcp2_path_eq(&conn->pv->fallback_dcid.ps.path, path)); - len = ngtcp2_ringbuf_len(&conn->dcid.bound.rb); - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - - if (ngtcp2_path_eq(&dcid->ps.path, path)) { - *pdcid = dcid; - return 0; - } + *pdcid = ngtcp2_dcidtr_find_bound_dcid(&conn->dcid.dtr, path); + if (*pdcid) { + return 0; } if (conn->dcid.current.cid.datalen == 0) { - ndcid = ngtcp2_ringbuf_push_back(&conn->dcid.bound.rb); - ngtcp2_cid_zero(&cid); - ngtcp2_dcid_init(ndcid, ++conn->dcid.zerolen_seq, &cid, NULL); - ngtcp2_dcid_set_path(ndcid, path); - - *pdcid = ndcid; + *pdcid = ngtcp2_dcidtr_bind_zerolen_dcid(&conn->dcid.dtr, path); return 0; } - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb) == 0) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return NGTCP2_ERR_CONN_ID_BLOCKED; } - if (ngtcp2_ringbuf_full(&conn->dcid.bound.rb)) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, 0); - rv = conn_retire_dcid(conn, dcid, ts); - if (rv != 0) { - return rv; - } - } - - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - ndcid = ngtcp2_ringbuf_push_back(&conn->dcid.bound.rb); - - ngtcp2_dcid_copy(ndcid, dcid); - ndcid->bound_ts = ts; - ngtcp2_dcid_set_path(ndcid, path); - - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); - - *pdcid = ndcid; - - return 0; + return ngtcp2_dcidtr_bind_dcid(&conn->dcid.dtr, pdcid, path, ts, + dcidtr_on_retire, conn); } static int conn_start_pmtud(ngtcp2_conn *conn) { @@ -4658,13 +4428,15 @@ static int conn_start_pmtud(ngtcp2_conn *conn) { assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - hard_max_udp_payload_size = (size_t)ngtcp2_min( - conn->remote.transport_params->max_udp_payload_size, - (uint64_t)conn->local.settings.max_tx_udp_payload_size); + hard_max_udp_payload_size = (size_t)ngtcp2_min_uint64( + conn->remote.transport_params->max_udp_payload_size, + (uint64_t)conn->local.settings.max_tx_udp_payload_size); - rv = ngtcp2_pmtud_new(&conn->pmtud, conn->dcid.current.max_udp_payload_size, - hard_max_udp_payload_size, - conn->pktns.tx.last_pkt_num + 1, conn->mem); + rv = + ngtcp2_pmtud_new(&conn->pmtud, conn->dcid.current.max_udp_payload_size, + hard_max_udp_payload_size, conn->pktns.tx.last_pkt_num + 1, + conn->local.settings.pmtud_probes, + conn->local.settings.pmtud_probeslen, conn->mem); if (rv != 0) { return rv; } @@ -4715,12 +4487,11 @@ static ngtcp2_ssize conn_write_pmtud_probe(ngtcp2_conn *conn, lfr.type = NGTCP2_FRAME_PING; nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, probelen, NGTCP2_PKT_1RTT, - NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING, &conn->dcid.current.cid, &lfr, - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | - NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | - NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE, - NULL, ts); + conn, pi, dest, probelen, NGTCP2_PKT_1RTT, + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL, &conn->dcid.current.cid, &lfr, + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | + NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE, + NULL, ts); if (nwrite < 0) { return nwrite; } @@ -4753,17 +4524,17 @@ static int conn_stop_pv(ngtcp2_conn *conn, ngtcp2_tstamp ts) { } if (pv->dcid.cid.datalen && pv->dcid.seq != conn->dcid.current.seq) { - rv = conn_retire_dcid(conn, &pv->dcid, ts); + rv = conn_retire_active_dcid(conn, &pv->dcid, ts); if (rv != 0) { goto fin; } } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && pv->fallback_dcid.cid.datalen && pv->fallback_dcid.seq != conn->dcid.current.seq && pv->fallback_dcid.seq != pv->dcid.seq) { - rv = conn_retire_dcid(conn, &pv->fallback_dcid, ts); + rv = conn_retire_active_dcid(conn, &pv->fallback_dcid, ts); if (rv != 0) { goto fin; } @@ -4813,19 +4584,19 @@ static size_t conn_shape_udp_payload(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - payloadlen = - (size_t)ngtcp2_min((uint64_t)payloadlen, - conn->remote.transport_params->max_udp_payload_size); + payloadlen = (size_t)ngtcp2_min_uint64( + (uint64_t)payloadlen, + conn->remote.transport_params->max_udp_payload_size); } payloadlen = - ngtcp2_min(payloadlen, conn->local.settings.max_tx_udp_payload_size); + ngtcp2_min_size(payloadlen, conn->local.settings.max_tx_udp_payload_size); if (conn->local.settings.no_tx_udp_payload_size_shaping) { return payloadlen; } - return ngtcp2_min(payloadlen, dcid->max_udp_payload_size); + return ngtcp2_min_size(payloadlen, dcid->max_udp_payload_size); } static void conn_reset_congestion_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); @@ -4854,7 +4625,7 @@ static int conn_on_path_validation_failed(ngtcp2_conn *conn, ngtcp2_pv *pv, } } - if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) { + if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) { ngtcp2_dcid_copy(&conn->dcid.current, &pv->fallback_dcid); conn_reset_congestion_state(conn, ts); } @@ -4920,15 +4691,15 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, initial_pto = conn_compute_initial_pto(conn, &conn->pktns); timeout = conn_compute_pto(conn, &conn->pktns); - timeout = ngtcp2_max(timeout, initial_pto); + timeout = ngtcp2_max_uint64(timeout, initial_pto); expiry = ts + timeout * (1ULL << pv->round); - destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server) { if (!(pv->dcid.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, &pv->dcid); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } @@ -4946,10 +4717,10 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, ngtcp2_pv_add_entry(pv, lfr.path_challenge.data, expiry, flags, ts); nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &pv->dcid.cid, &lfr, - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING, - &pv->dcid.ps.path, ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &pv->dcid.cid, &lfr, + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING, + &pv->dcid.ps.path, ts); if (nwrite <= 0) { return nwrite; } @@ -5004,7 +4775,7 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, dcid = &pv->dcid; break; } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && ngtcp2_path_eq(&pv->fallback_dcid.ps.path, &pcent->ps.path)) { dcid = &pv->fallback_dcid; break; @@ -5039,11 +4810,11 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, } } - destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server && !(dcid->flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, dcid); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } @@ -5053,9 +4824,8 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, memcpy(lfr.path_response.data, pcent->data, sizeof(lfr.path_response.data)); nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &dcid->cid, &lfr, NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING, &pcent->ps.path, - ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &dcid->cid, &lfr, NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING, &pcent->ps.path, ts); if (nwrite <= 0) { return nwrite; } @@ -5077,10 +4847,10 @@ ngtcp2_ssize ngtcp2_conn_write_pkt_versioned(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts) { return ngtcp2_conn_writev_stream_versioned( - conn, path, pkt_info_version, pi, dest, destlen, - /* pdatalen = */ NULL, NGTCP2_WRITE_STREAM_FLAG_NONE, - /* stream_id = */ -1, - /* datav = */ NULL, /* datavcnt = */ 0, ts); + conn, path, pkt_info_version, pi, dest, destlen, + /* pdatalen = */ NULL, NGTCP2_WRITE_STREAM_FLAG_NONE, + /* stream_id = */ -1, + /* datav = */ NULL, /* datavcnt = */ 0, ts); } /* @@ -5225,8 +4995,8 @@ static int conn_on_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, retry.odcid = conn->dcid.current.cid; rv = ngtcp2_pkt_verify_retry_tag( - conn->client_chosen_version, &retry, pkt, pktlen, conn->callbacks.encrypt, - &conn->crypto.retry_aead, &conn->crypto.retry_aead_ctx); + conn->client_chosen_version, &retry, pkt, pktlen, conn->callbacks.encrypt, + &conn->crypto.retry_aead, &conn->crypto.retry_aead_ctx); if (rv != 0) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, "unable to verify Retry packet integrity"); @@ -5303,15 +5073,14 @@ int ngtcp2_conn_detect_lost_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, * conn_recv_ack processes received ACK frame |fr|. |pkt_ts| is the * timestamp when packet is received. |ts| should be the current * time. Usually they are the same, but for buffered packets, - * |pkt_ts| would be earlier than |ts|. + * |pkt_ts| would be earlier than |ts|. This function needs to be + * called after |fr| is validated by ngtcp2_pkt_validate_ack. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_NOMEM * Out of memory - * NGTCP2_ERR_ACK_FRAME - * ACK frame is malformed. * NGTCP2_ERR_PROTO * |fr| acknowledges a packet this endpoint has not sent. * NGTCP2_ERR_CALLBACK_FAILURE @@ -5319,7 +5088,6 @@ int ngtcp2_conn_detect_lost_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, */ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, ngtcp2_tstamp pkt_ts, ngtcp2_tstamp ts) { - int rv; ngtcp2_ssize num_acked; ngtcp2_conn_stat *cstat = &conn->cstat; @@ -5327,15 +5095,10 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, return NGTCP2_ERR_PROTO; } - rv = ngtcp2_pkt_validate_ack(fr, conn->local.settings.initial_pkt_num); - if (rv != 0) { - return rv; - } - ngtcp2_acktr_recv_ack(&pktns->acktr, fr); - num_acked = ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, - pkt_ts, ts); + num_acked = + ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, pkt_ts, ts); if (num_acked < 0) { assert(ngtcp2_err_is_fatal((int)num_acked)); return (int)num_acked; @@ -5351,7 +5114,7 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, (conn->server || (conn->flags & NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED))) { /* Reset PTO count but no less than 2 to avoid frequent probe packet transmission. */ - cstat->pto_count = ngtcp2_min(cstat->pto_count, 2); + cstat->pto_count = ngtcp2_min_size(cstat->pto_count, 2); } ngtcp2_conn_set_loss_detection_timer(conn, ts); @@ -5365,8 +5128,15 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, */ static void assign_recved_ack_delay_unscaled(ngtcp2_ack *fr, uint64_t ack_delay_exponent) { - fr->ack_delay_unscaled = - fr->ack_delay * (1ULL << ack_delay_exponent) * NGTCP2_MICROSECONDS; + const ngtcp2_tstamp max_ack_delay = ((1 << 14) - 1) * NGTCP2_MILLISECONDS; + uint64_t exp = (1ULL << ack_delay_exponent) * NGTCP2_MICROSECONDS; + + if (fr->ack_delay > max_ack_delay / exp) { + fr->ack_delay_unscaled = max_ack_delay; + return; + } + + fr->ack_delay_unscaled = fr->ack_delay * exp; } /* @@ -5467,7 +5237,18 @@ static int conn_recv_max_stream_data(ngtcp2_conn *conn, * conn_recv_max_data processes received MAX_DATA frame |fr|. */ static void conn_recv_max_data(ngtcp2_conn *conn, const ngtcp2_max_data *fr) { - conn->tx.max_offset = ngtcp2_max(conn->tx.max_offset, fr->max_data); + conn->tx.max_offset = ngtcp2_max_uint64(conn->tx.max_offset, fr->max_data); +} + +/* + * should_buffer_1rtt_pkt returns nonzero if 1RTT packet |pkt| of + * length |pktlen| should be buffered. + */ +static int should_buffer_1rtt_pkt(const uint8_t *pkt, size_t pktlen) { + /* A packet starting with 21 bytes zeros are most likely padding + bytes. */ + return pktlen >= NGTCP2_MIN_QUIC_PKTLEN && + (pkt[0] != 0 || memcmp(pkt, pkt + 1, NGTCP2_MIN_QUIC_PKTLEN - 1) != 0); } /* @@ -5496,7 +5277,7 @@ static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, } rv = - ngtcp2_pkt_chain_new(&pc, path, pi, pkt, pktlen, dgramlen, ts, conn->mem); + ngtcp2_pkt_chain_new(&pc, path, pi, pkt, pktlen, dgramlen, ts, conn->mem); if (rv != 0) { return rv; } @@ -5695,8 +5476,8 @@ conn_emit_pending_crypto_data(ngtcp2_conn *conn, offset = rx_offset; rx_offset += datalen; - rv = conn_call_recv_crypto_data(conn, encryption_level, offset, data, - datalen); + rv = + conn_call_recv_crypto_data(conn, encryption_level, offset, data, datalen); if (rv != 0) { return rv; } @@ -5735,7 +5516,7 @@ static int conn_recv_connection_close(ngtcp2_conn *conn, } } - ccerr->reasonlen = ngtcp2_min(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); + ccerr->reasonlen = ngtcp2_min_size(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); ngtcp2_cpymem((uint8_t *)ccerr->reason, fr->reason, ccerr->reasonlen); return 0; @@ -5774,15 +5555,52 @@ static void conn_reset_congestion_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { conn->hs_pktns->tx.last_pkt_num + 1); } ngtcp2_rtb_reset_cc_state(&conn->pktns.rtb, conn->pktns.tx.last_pkt_num + 1); - ngtcp2_rst_init(&conn->rst); + ngtcp2_rst_reset(&conn->rst); conn->tx.pacing.next_ts = UINT64_MAX; + conn->tx.pacing.compensation = 0; } -static int conn_recv_path_response(ngtcp2_conn *conn, ngtcp2_path_response *fr, - ngtcp2_tstamp ts) { +/* + * conn_server_preferred_addr_migration returns nonzero if + * |local_addr| equals to one of the preferred addresses. + */ +static int conn_server_preferred_addr_migration(const ngtcp2_conn *conn, + const ngtcp2_addr *local_addr) { + const ngtcp2_preferred_addr *paddr; + + assert(conn->server); + + if (!conn->local.transport_params.preferred_addr_present) { + return 0; + } + + paddr = &conn->local.transport_params.preferred_addr; + + switch (local_addr->addr->sa_family) { + case NGTCP2_AF_INET: + if (!paddr->ipv4_present) { + return 0; + } + + return ngtcp2_sockaddr_eq((const ngtcp2_sockaddr *)&paddr->ipv4, + local_addr->addr); + case NGTCP2_AF_INET6: + if (!paddr->ipv6_present) { + return 0; + } + + return ngtcp2_sockaddr_eq((const ngtcp2_sockaddr *)&paddr->ipv6, + local_addr->addr); + } + + return 0; +} + +static int conn_recv_path_response(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, + ngtcp2_path_response *fr, ngtcp2_tstamp ts) { int rv; - ngtcp2_pv *pv = conn->pv, *npv; + ngtcp2_pv *pv = conn->pv, *npv = NULL; uint8_t ent_flags; if (!pv) { @@ -5797,18 +5615,26 @@ static int conn_recv_path_response(ngtcp2_conn *conn, ngtcp2_path_response *fr, } if (!(pv->flags & NGTCP2_PV_FLAG_DONT_CARE)) { - if (pv->dcid.seq != conn->dcid.current.seq) { - assert(!conn->server); - assert(conn->dcid.current.cid.datalen); - - rv = conn_retire_dcid(conn, &conn->dcid.current, ts); - if (rv != 0) { - return rv; + if (pv->dcid.seq != conn->dcid.current.seq || + !ngtcp2_path_eq(&pv->dcid.ps.path, &conn->dcid.current.ps.path)) { + if (conn->dcid.current.cid.datalen && + pv->dcid.seq != conn->dcid.current.seq) { + rv = conn_retire_active_dcid(conn, &conn->dcid.current, ts); + if (rv != 0) { + return rv; + } } + ngtcp2_dcid_copy(&conn->dcid.current, &pv->dcid); conn_reset_congestion_state(conn, ts); conn_reset_ecn_validation_state(conn); + + if (conn->server && conn->rx.preferred_addr.pkt_num == -1 && + conn_server_preferred_addr_migration( + conn, &conn->dcid.current.ps.path.local)) { + conn->rx.preferred_addr.pkt_num = hd->pkt_num; + } } assert(ngtcp2_path_eq(&pv->dcid.ps.path, &conn->dcid.current.ps.path)); @@ -5835,46 +5661,45 @@ static int conn_recv_path_response(ngtcp2_conn *conn, ngtcp2_path_response *fr, } } - if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) { - if (ent_flags & NGTCP2_PV_ENTRY_FLAG_UNDERSIZED) { - assert(conn->server); - - /* Validate path again */ - rv = ngtcp2_pv_new(&npv, &pv->dcid, conn_compute_pv_timeout(conn), - NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE, &conn->log, - conn->mem); - if (rv != 0) { - return rv; - } + if (ent_flags & NGTCP2_PV_ENTRY_FLAG_UNDERSIZED) { + assert(conn->server); - npv->dcid.flags |= NGTCP2_DCID_FLAG_PATH_VALIDATED; - ngtcp2_dcid_copy(&npv->fallback_dcid, &pv->fallback_dcid); - npv->fallback_pto = pv->fallback_pto; - } else { - rv = ngtcp2_pv_new(&npv, &pv->fallback_dcid, - conn_compute_pv_timeout_pto(conn, pv->fallback_pto), - NGTCP2_PV_FLAG_DONT_CARE, &conn->log, conn->mem); - if (rv != 0) { - return rv; - } + /* Validate path again */ + rv = ngtcp2_pv_new(&npv, &pv->dcid, conn_compute_pv_timeout(conn), + NGTCP2_PV_FLAG_NONE, &conn->log, conn->mem); + if (rv != 0) { + return rv; } - /* Unset the flag bit so that conn_stop_pv does not retire - DCID. */ - pv->flags &= (uint8_t)~NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE; + npv->dcid.flags |= NGTCP2_DCID_FLAG_PATH_VALIDATED; - rv = conn_stop_pv(conn, ts); + if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) { + ngtcp2_pv_set_fallback(npv, &pv->fallback_dcid, pv->fallback_pto); + } + } else if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) { + rv = ngtcp2_pv_new(&npv, &pv->fallback_dcid, + conn_compute_pv_timeout_pto(conn, pv->fallback_pto), + NGTCP2_PV_FLAG_DONT_CARE, &conn->log, conn->mem); if (rv != 0) { - ngtcp2_pv_del(npv); return rv; } + } - conn->pv = npv; + if (pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) { + /* Unset the flag bit so that conn_stop_pv does not retire + DCID. */ + pv->flags &= (uint8_t)~NGTCP2_PV_FLAG_FALLBACK_PRESENT; + } - return 0; + rv = conn_stop_pv(conn, ts); + if (rv != 0) { + ngtcp2_pv_del(npv); + return rv; } - return conn_stop_pv(conn, ts); + conn->pv = npv; + + return 0; } /* @@ -5887,12 +5712,24 @@ static int pktns_pkt_num_is_duplicate(ngtcp2_pktns *pktns, int64_t pkt_num) { /* * pktns_commit_recv_pkt_num marks packet number |pkt_num| as - * received. + * received. It stores |pkt_num| and its reception timestamp |ts| in + * order to send its ACK. It also increase ECN counts from |pi|. + * |require_ack| is nonzero if the received packet is ack-eliciting. + * + * It returns 0 if it succeeds, or one of the following negative error + * codes: + * + * NGTCP2_ERR_NOMEM + * Out of memory + * NGTCP2_ERR_PROTO + * Same packet number has already been added. */ static int pktns_commit_recv_pkt_num(ngtcp2_pktns *pktns, int64_t pkt_num, - int ack_eliciting, ngtcp2_tstamp ts) { - int rv; + const ngtcp2_pkt_info *pi, int require_ack, + ngtcp2_tstamp ts) { + ngtcp2_acktr *acktr = &pktns->acktr; ngtcp2_range r; + int rv; rv = ngtcp2_gaptr_push(&pktns->rx.pngap, (uint64_t)pkt_num, 1); if (rv != 0) { @@ -5903,13 +5740,13 @@ static int pktns_commit_recv_pkt_num(ngtcp2_pktns *pktns, int64_t pkt_num, ngtcp2_gaptr_drop_first_gap(&pktns->rx.pngap); } - if (ack_eliciting) { + if (require_ack) { if (pktns->rx.max_ack_eliciting_pkt_num != -1) { if (pkt_num < pktns->rx.max_ack_eliciting_pkt_num) { ngtcp2_acktr_immediate_ack(&pktns->acktr); - } else if (pkt_num > pktns->rx.max_ack_eliciting_pkt_num) { + } else if (pkt_num != pktns->rx.max_ack_eliciting_pkt_num + 1) { r = ngtcp2_gaptr_get_first_gap_after( - &pktns->rx.pngap, (uint64_t)pktns->rx.max_ack_eliciting_pkt_num); + &pktns->rx.pngap, (uint64_t)pktns->rx.max_ack_eliciting_pkt_num); if (r.begin < (uint64_t)pkt_num) { ngtcp2_acktr_immediate_ack(&pktns->acktr); @@ -5922,9 +5759,12 @@ static int pktns_commit_recv_pkt_num(ngtcp2_pktns *pktns, int64_t pkt_num, } } - if (pktns->rx.max_pkt_num < pkt_num) { - pktns->rx.max_pkt_num = pkt_num; - pktns->rx.max_pkt_ts = ts; + ngtcp2_acktr_increase_ecn_counts(acktr, pi); + + rv = ngtcp2_acktr_add(acktr, pkt_num, require_ack, ts); + if (rv != 0) { + assert(rv != NGTCP2_ERR_INVALID_ARGUMENT); + return rv; } return 0; @@ -5942,21 +5782,6 @@ static int verify_token(const uint8_t *token, size_t tokenlen, return NGTCP2_ERR_PROTO; } -static void pktns_increase_ecn_counts(ngtcp2_pktns *pktns, - const ngtcp2_pkt_info *pi) { - switch (pi->ecn & NGTCP2_ECN_MASK) { - case NGTCP2_ECN_ECT_0: - ++pktns->rx.ecn.ect0; - break; - case NGTCP2_ECN_ECT_1: - ++pktns->rx.ecn.ect1; - break; - case NGTCP2_ECN_CE: - ++pktns->rx.ecn.ce; - break; - } -} - /* * vneg_available_versions_includes returns nonzero if * |available_versions| of length |available_versionslen| includes @@ -5977,7 +5802,7 @@ static int vneg_available_versions_includes(const uint8_t *available_versions, } for (i = 0; i < available_versionslen; i += sizeof(uint32_t)) { - available_versions = ngtcp2_get_uint32(&v, available_versions); + available_versions = ngtcp2_get_uint32be(&v, available_versions); if (version == v) { return 1; @@ -6097,15 +5922,13 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_strm *crypto; ngtcp2_encryption_level encryption_level; int invalid_reserved_bits = 0; - - if (pktlen == 0) { - return 0; - } + size_t num_ack_processed = 0; if (!(pkt[0] & NGTCP2_HEADER_FORM_BIT)) { - if (conn->state == NGTCP2_CS_SERVER_INITIAL) { - /* Ignore 1RTT packet unless server's first Handshake packet has - been transmitted. */ + /* Ignore 1RTT packet unless server's first Handshake packet has + been transmitted. */ + if (conn->state == NGTCP2_CS_SERVER_INITIAL || + !should_buffer_1rtt_pkt(pkt, pktlen)) { return (ngtcp2_ssize)pktlen; } @@ -6116,8 +5939,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "buffering 1RTT packet len=%zu", pktlen); - rv = conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt, pktlen, dgramlen, - ts); + rv = + conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt, pktlen, dgramlen, ts); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -6158,8 +5981,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, "packet was ignored because of mismatched SCID"); return NGTCP2_ERR_DISCARD_PKT; } - rv = conn_on_version_negotiation(conn, &hd, pkt + hdpktlen, - pktlen - hdpktlen); + rv = + conn_on_version_negotiation(conn, &hd, pkt + hdpktlen, pktlen - hdpktlen); if (rv != 0) { if (ngtcp2_err_is_fatal(rv)) { return rv; @@ -6250,7 +6073,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_ssize nread2; /* TODO Avoid to parse header twice. */ nread2 = - conn_recv_pkt(conn, path, pi, pkt, pktlen, dgramlen, pkt_ts, ts); + conn_recv_pkt(conn, path, pi, pkt, pktlen, dgramlen, pkt_ts, ts); if (nread2 < 0) { return nread2; } @@ -6275,8 +6098,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, case NGTCP2_PKT_INITIAL: if (!conn->in_pktns) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Initial packet is discarded because keys have been discarded"); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Initial packet is discarded because keys have been discarded"); return (ngtcp2_ssize)pktlen; } @@ -6285,10 +6108,10 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (conn->server) { if (dgramlen < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Initial packet was ignored because it is included in UDP datagram " - "less than %zu bytes: %zu bytes", - NGTCP2_MAX_UDP_PAYLOAD_SIZE, dgramlen); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Initial packet was ignored because it is included in UDP datagram " + "less than %zu bytes: %zu bytes", + NGTCP2_MAX_UDP_PAYLOAD_SIZE, dgramlen); return NGTCP2_ERR_DISCARD_PKT; } if (conn->local.settings.tokenlen) { @@ -6329,10 +6152,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, /* Install new Initial keys using QUIC version = hd.version */ rv = conn_call_version_negotiation( - conn, hd.version, - (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) - ? &conn->dcid.current.cid - : &conn->rcid); + conn, hd.version, + (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) ? &conn->dcid.current.cid + : &conn->rcid); if (rv != 0) { return rv; } @@ -6364,8 +6186,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (!conn->hs_pktns->crypto.rx.ckm) { if (conn->server) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Handshake packet at this point is unexpected and discarded"); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Handshake packet at this point is unexpected and discarded"); return (ngtcp2_ssize)pktlen; } ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, @@ -6420,7 +6242,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload = pkt + hdpktlen; payloadlen = hd.len - hd.pkt_numlen; - hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, + hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->acktr.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, @@ -6542,6 +6364,13 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, case NGTCP2_FRAME_ACK_ECN: fr->ack.ack_delay = 0; fr->ack.ack_delay_unscaled = 0; + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -6550,6 +6379,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server && hd.type == NGTCP2_PKT_HANDSHAKE) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -6557,6 +6389,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (rv != 0) { return rv; } + ++num_ack_processed; break; case NGTCP2_FRAME_PADDING: break; @@ -6600,20 +6433,13 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_qlog_pkt_received_end(&conn->qlog, &hd, pktlen); - rv = pktns_commit_recv_pkt_num(pktns, hd.pkt_num, require_ack, pkt_ts); + rv = pktns_commit_recv_pkt_num(pktns, hd.pkt_num, pi, require_ack, pkt_ts); if (rv != 0) { return rv; } - pktns_increase_ecn_counts(pktns, pi); - /* Initial and Handshake are always acknowledged without delay. No need to call ngtcp2_acktr_immediate_ack(). */ - rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, - pkt_ts); - if (rv != 0) { - return rv; - } conn_restart_timer_on_read(conn, ts); @@ -6661,7 +6487,7 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, while (pktlen) { nread = - conn_recv_handshake_pkt(conn, path, pi, pkt, pktlen, dgramlen, ts, ts); + conn_recv_handshake_pkt(conn, path, pi, pkt, pktlen, dgramlen, ts, ts); if (nread < 0) { if (ngtcp2_err_is_fatal((int)nread)) { return nread; @@ -6673,7 +6499,7 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, if ((pkt[0] & NGTCP2_HEADER_FORM_BIT) && pktlen > 4) { /* Not a Version Negotiation packet */ - ngtcp2_get_uint32(&version, &pkt[1]); + ngtcp2_get_uint32be(&version, &pkt[1]); if (ngtcp2_pkt_get_type_long(version, pkt[0]) == NGTCP2_PKT_INITIAL) { if (conn->server) { if (is_unrecoverable_error((int)nread)) { @@ -6687,7 +6513,7 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, and the current connection state might wrongly discard valid packet and prevent the handshake from completing. */ - if (conn->in_pktns && conn->in_pktns->rx.max_pkt_num == -1) { + if (conn->in_pktns && conn->in_pktns->acktr.max_pkt_num == -1) { return NGTCP2_ERR_DROP_CONN; } @@ -6738,14 +6564,14 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, if (bidi_stream(stream_id)) { if (local_stream) { max_rx_offset = - conn->local.transport_params.initial_max_stream_data_bidi_local; + conn->local.transport_params.initial_max_stream_data_bidi_local; max_tx_offset = - conn->remote.transport_params->initial_max_stream_data_bidi_remote; + conn->remote.transport_params->initial_max_stream_data_bidi_remote; } else { max_rx_offset = - conn->local.transport_params.initial_max_stream_data_bidi_remote; + conn->local.transport_params.initial_max_stream_data_bidi_remote; max_tx_offset = - conn->remote.transport_params->initial_max_stream_data_bidi_local; + conn->remote.transport_params->initial_max_stream_data_bidi_local; } } else if (local_stream) { max_rx_offset = 0; @@ -6759,8 +6585,8 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, max_tx_offset, stream_user_data, &conn->frc_objalloc, conn->mem); - rv = ngtcp2_map_insert(&conn->strms, (ngtcp2_map_key_type)strm->stream_id, - strm); + rv = + ngtcp2_map_insert(&conn->strms, (ngtcp2_map_key_type)strm->stream_id, strm); if (rv != 0) { assert(rv != NGTCP2_ERR_INVALID_ARGUMENT); goto fail; @@ -6833,6 +6659,12 @@ static int conn_emit_pending_stream_data(ngtcp2_conn *conn, ngtcp2_strm *strm, return rv; } + /* ngtcp2_conn_shutdown_stream_read from a callback will free + strm->rx.rob. */ + if (!strm->rx.rob) { + return 0; + } + ngtcp2_rob_pop(strm->rx.rob, rx_offset - datalen, datalen); } } @@ -6901,7 +6733,8 @@ static int conn_recv_crypto(ngtcp2_conn *conn, return 0; } - crypto->rx.last_offset = ngtcp2_max(crypto->rx.last_offset, fr_end_offset); + crypto->rx.last_offset = + ngtcp2_max_uint64(crypto->rx.last_offset, fr_end_offset); /* TODO Before dispatching incoming data to TLS stack, make sure that previous data in previous encryption level has been @@ -6917,14 +6750,14 @@ static int conn_recv_crypto(ngtcp2_conn *conn, rx_offset += datalen; ngtcp2_strm_update_rx_offset(crypto, rx_offset); - rv = conn_call_recv_crypto_data(conn, encryption_level, offset, data, - datalen); + rv = + conn_call_recv_crypto_data(conn, encryption_level, offset, data, datalen); if (rv != 0) { return rv; } - rv = conn_emit_pending_crypto_data(conn, encryption_level, crypto, - rx_offset); + rv = + conn_emit_pending_crypto_data(conn, encryption_level, crypto, rx_offset); if (rv != 0) { return rv; } @@ -7100,7 +6933,8 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr) { return NGTCP2_ERR_FINAL_SIZE; } - strm->rx.last_offset = ngtcp2_max(strm->rx.last_offset, fr_end_offset); + strm->rx.last_offset = + ngtcp2_max_uint64(strm->rx.last_offset, fr_end_offset); if (fr_end_offset <= rx_offset) { return 0; @@ -7220,9 +7054,9 @@ handle_max_remote_streams_extension(uint64_t *punsent_max_remote_streams, size_t n) { if ( #if SIZE_MAX > UINT32_MAX - NGTCP2_MAX_STREAMS < n || + NGTCP2_MAX_STREAMS < n || #endif /* SIZE_MAX > UINT32_MAX */ - *punsent_max_remote_streams > (uint64_t)(NGTCP2_MAX_STREAMS - n)) { + *punsent_max_remote_streams > (uint64_t)(NGTCP2_MAX_STREAMS - n)) { *punsent_max_remote_streams = NGTCP2_MAX_STREAMS; } else { *punsent_max_remote_streams += n; @@ -7360,7 +7194,7 @@ static int conn_recv_reset_stream(ngtcp2_conn *conn, which are not passed to application. */ if (!(strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING)) { ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); + ngtcp2_strm_rx_offset(strm)); } conn->rx.offset += datalen; @@ -7368,7 +7202,7 @@ static int conn_recv_reset_stream(ngtcp2_conn *conn, strm->rx.last_offset = fr->final_size; strm->flags |= - NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED; + NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED; ngtcp2_strm_set_app_error_code(strm, fr->app_error_code); @@ -7471,7 +7305,7 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn, } strm->flags |= - NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_STOP_SENDING_RECVED; + NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_STOP_SENDING_RECVED; ngtcp2_strm_streamfrq_clear(strm); @@ -7485,9 +7319,8 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn, static int check_stateless_reset(const ngtcp2_dcid *dcid, const ngtcp2_path *path, const ngtcp2_pkt_stateless_reset *sr) { - return ngtcp2_path_eq(&dcid->ps.path, path) && - ngtcp2_dcid_verify_stateless_reset_token( - dcid, sr->stateless_reset_token) == 0; + return ngtcp2_dcid_verify_stateless_reset_token( + dcid, path, sr->stateless_reset_token) == 0; } /* @@ -7509,11 +7342,9 @@ static int check_stateless_reset(const ngtcp2_dcid *dcid, */ static int conn_on_stateless_reset(ngtcp2_conn *conn, const ngtcp2_path *path, const uint8_t *payload, size_t payloadlen) { - int rv = 1; + int rv; ngtcp2_pv *pv = conn->pv; - ngtcp2_dcid *dcid; ngtcp2_pkt_stateless_reset sr; - size_t len, i; rv = ngtcp2_pkt_decode_stateless_reset(&sr, payload, payloadlen); if (rv != 0) { @@ -7522,28 +7353,12 @@ static int conn_on_stateless_reset(ngtcp2_conn *conn, const ngtcp2_path *path, if (!check_stateless_reset(&conn->dcid.current, path, &sr) && (!pv || (!check_stateless_reset(&pv->dcid, path, &sr) && - (!(pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) || + (!(pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) || !check_stateless_reset(&pv->fallback_dcid, path, &sr))))) { - len = ngtcp2_ringbuf_len(&conn->dcid.retired.rb); - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, i); - if (check_stateless_reset(dcid, path, &sr)) { - break; - } - } - - if (i == len) { - len = ngtcp2_ringbuf_len(&conn->dcid.bound.rb); - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - if (check_stateless_reset(dcid, path, &sr)) { - break; - } - } - - if (i == len) { - return NGTCP2_ERR_INVALID_ARGUMENT; - } + rv = ngtcp2_dcidtr_verify_stateless_reset(&conn->dcid.dtr, path, + sr.stateless_reset_token); + if (rv != 0) { + return rv; } } @@ -7576,7 +7391,7 @@ static int conn_recv_max_streams(ngtcp2_conn *conn, return NGTCP2_ERR_FRAME_ENCODING; } - n = ngtcp2_min(fr->max_streams, NGTCP2_MAX_STREAMS); + n = ngtcp2_min_uint64(fr->max_streams, NGTCP2_MAX_STREAMS); if (fr->type == NGTCP2_FRAME_MAX_STREAMS_BIDI) { if (conn->local.bidi.max_streams < n) { @@ -7593,42 +7408,6 @@ static int conn_recv_max_streams(ngtcp2_conn *conn, return 0; } -static int conn_retire_dcid_prior_to(ngtcp2_conn *conn, ngtcp2_ringbuf *rb, - uint64_t retire_prior_to) { - size_t i; - ngtcp2_dcid *dcid, *last; - int rv; - - for (i = 0; i < ngtcp2_ringbuf_len(rb);) { - dcid = ngtcp2_ringbuf_get(rb, i); - if (dcid->seq >= retire_prior_to) { - ++i; - continue; - } - - rv = conn_retire_dcid_seq(conn, dcid->seq); - if (rv != 0) { - return rv; - } - - if (i == 0) { - ngtcp2_ringbuf_pop_front(rb); - continue; - } - - if (i == ngtcp2_ringbuf_len(rb) - 1) { - ngtcp2_ringbuf_pop_back(rb); - break; - } - - last = ngtcp2_ringbuf_get(rb, ngtcp2_ringbuf_len(rb) - 1); - ngtcp2_dcid_copy(dcid, last); - ngtcp2_ringbuf_pop_back(rb); - } - - return 0; -} - /* * conn_recv_new_connection_id processes the incoming * NEW_CONNECTION_ID frame |fr|. @@ -7642,8 +7421,7 @@ static int conn_retire_dcid_prior_to(ngtcp2_conn *conn, ngtcp2_ringbuf *rb, */ static int conn_recv_new_connection_id(ngtcp2_conn *conn, const ngtcp2_new_connection_id *fr) { - size_t i, len; - ngtcp2_dcid *dcid; + size_t len; ngtcp2_pv *pv = conn->pv; int rv; int found = 0; @@ -7677,45 +7455,17 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, } } - len = ngtcp2_ringbuf_len(&conn->dcid.bound.rb); - - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - rv = ngtcp2_dcid_verify_uniqueness(dcid, fr->seq, &fr->cid, - fr->stateless_reset_token); - if (rv != 0) { - return NGTCP2_ERR_PROTO; - } - if (ngtcp2_cid_eq(&dcid->cid, &fr->cid)) { - found = 1; - } - } - - len = ngtcp2_ringbuf_len(&conn->dcid.unused.rb); - - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, i); - rv = ngtcp2_dcid_verify_uniqueness(dcid, fr->seq, &fr->cid, - fr->stateless_reset_token); - if (rv != 0) { - return NGTCP2_ERR_PROTO; - } - if (ngtcp2_cid_eq(&dcid->cid, &fr->cid)) { - found = 1; - } + rv = ngtcp2_dcidtr_verify_token_uniqueness( + &conn->dcid.dtr, &found, fr->seq, &fr->cid, fr->stateless_reset_token); + if (rv != 0) { + return rv; } if (conn->dcid.retire_prior_to < fr->retire_prior_to) { conn->dcid.retire_prior_to = fr->retire_prior_to; - rv = conn_retire_dcid_prior_to(conn, &conn->dcid.bound.rb, - fr->retire_prior_to); - if (rv != 0) { - return rv; - } - - rv = conn_retire_dcid_prior_to(conn, &conn->dcid.unused.rb, - conn->dcid.retire_prior_to); + rv = ngtcp2_dcidtr_retire_inactive_dcid_prior_to( + &conn->dcid.dtr, fr->retire_prior_to, dcidtr_on_retire, conn); if (rv != 0) { return rv; } @@ -7728,7 +7478,16 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, For example, a peer might send seq = 50000 and retire_prior_to = 50000. Then send NEW_CONNECTION_ID frames with seq < 50000. */ - return conn_retire_dcid_seq(conn, fr->seq); + if (ngtcp2_dcidtr_check_retired_seq_tracked(&conn->dcid.dtr, fr->seq)) { + return 0; + } + + rv = ngtcp2_dcidtr_track_retired_seq(&conn->dcid.dtr, fr->seq); + if (rv != 0) { + return rv; + } + + return conn_enqueue_retire_connection_id(conn, fr->seq); } if (found) { @@ -7748,7 +7507,7 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, ngtcp2_gaptr_drop_first_gap(&conn->dcid.seqgap); } - len = ngtcp2_ringbuf_len(&conn->dcid.unused.rb); + len = ngtcp2_dcidtr_inactive_len(&conn->dcid.dtr); if (conn->dcid.current.seq >= conn->dcid.retire_prior_to) { ++extra_dcid; @@ -7758,7 +7517,7 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, pv->dcid.seq >= conn->dcid.retire_prior_to) { ++extra_dcid; } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && pv->fallback_dcid.seq != conn->dcid.current.seq && pv->fallback_dcid.seq >= conn->dcid.retire_prior_to) { ++extra_dcid; @@ -7770,13 +7529,13 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, return NGTCP2_ERR_CONNECTION_ID_LIMIT; } - if (len >= NGTCP2_MAX_DCID_POOL_SIZE) { + if (len >= NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "too many connection ID"); return 0; } - dcid = ngtcp2_ringbuf_push_back(&conn->dcid.unused.rb); - ngtcp2_dcid_init(dcid, fr->seq, &fr->cid, fr->stateless_reset_token); + ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, fr->seq, &fr->cid, + fr->stateless_reset_token); return 0; } @@ -7796,32 +7555,32 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, static int conn_post_process_recv_new_connection_id(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_pv *pv = conn->pv; - ngtcp2_dcid *dcid; + ngtcp2_dcid dcid; int rv; if (conn->dcid.current.seq < conn->dcid.retire_prior_to) { - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb) == 0) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return 0; } - rv = conn_retire_dcid(conn, &conn->dcid.current, ts); + rv = conn_retire_active_dcid(conn, &conn->dcid.current, ts); if (rv != 0) { return rv; } - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); + ngtcp2_dcidtr_pop_unused_cid_token(&conn->dcid.dtr, &dcid); + if (pv) { if (conn->dcid.current.seq == pv->dcid.seq) { - ngtcp2_dcid_copy_cid_token(&pv->dcid, dcid); + ngtcp2_dcid_copy_cid_token(&pv->dcid, &dcid); } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && conn->dcid.current.seq == pv->fallback_dcid.seq) { - ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, dcid); + ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, &dcid); } } - ngtcp2_dcid_copy_cid_token(&conn->dcid.current, dcid); - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); + ngtcp2_dcid_copy_cid_token(&conn->dcid.current, &dcid); rv = conn_call_activate_dcid(conn, &conn->dcid.current); if (rv != 0) { @@ -7831,54 +7590,52 @@ static int conn_post_process_recv_new_connection_id(ngtcp2_conn *conn, if (pv) { if (pv->dcid.seq < conn->dcid.retire_prior_to) { - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb)) { - rv = conn_retire_dcid(conn, &pv->dcid, ts); - if (rv != 0) { - return rv; - } - - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && - pv->dcid.seq == pv->fallback_dcid.seq) { - ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, dcid); - } - - ngtcp2_dcid_copy_cid_token(&pv->dcid, dcid); - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); - - rv = conn_call_activate_dcid(conn, &pv->dcid); - if (rv != 0) { - return rv; - } - } else { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PTV, "path migration is aborted because connection ID is" "retired and no unused connection ID is available"); return conn_abort_pv(conn, ts); } - } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && - pv->fallback_dcid.seq < conn->dcid.retire_prior_to) { - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb)) { - rv = conn_retire_dcid(conn, &pv->fallback_dcid, ts); - if (rv != 0) { - return rv; - } - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, dcid); - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); + rv = conn_retire_active_dcid(conn, &pv->dcid, ts); + if (rv != 0) { + return rv; + } - rv = conn_call_activate_dcid(conn, &pv->fallback_dcid); - if (rv != 0) { - return rv; - } - } else { + ngtcp2_dcidtr_pop_unused_cid_token(&conn->dcid.dtr, &dcid); + + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && + pv->dcid.seq == pv->fallback_dcid.seq) { + ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, &dcid); + } + + ngtcp2_dcid_copy_cid_token(&pv->dcid, &dcid); + + rv = conn_call_activate_dcid(conn, &pv->dcid); + if (rv != 0) { + return rv; + } + } + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && + pv->fallback_dcid.seq < conn->dcid.retire_prior_to) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { /* Now we have no fallback dcid. */ return conn_abort_pv(conn, ts); } + + rv = conn_retire_active_dcid(conn, &pv->fallback_dcid, ts); + if (rv != 0) { + return rv; + } + + ngtcp2_dcidtr_pop_unused_cid_token(&conn->dcid.dtr, &dcid); + ngtcp2_dcid_copy_cid_token(&pv->fallback_dcid, &dcid); + + rv = conn_call_activate_dcid(conn, &pv->fallback_dcid); + if (rv != 0) { + return rv; + } } } @@ -8154,9 +7911,9 @@ static int conn_select_preferred_addr(ngtcp2_conn *conn) { ngtcp2_path_storage ps; int rv; ngtcp2_pv *pv; - ngtcp2_dcid *dcid; + ngtcp2_dcid dcid; - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb) == 0) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return 0; } @@ -8168,24 +7925,22 @@ static int conn_select_preferred_addr(ngtcp2_conn *conn) { return rv; } - if (ps.path.remote.addrlen == 0 || + if (ngtcp2_addr_empty(&ps.path.remote) || ngtcp2_addr_eq(&conn->dcid.current.ps.path.remote, &ps.path.remote)) { return 0; } assert(conn->pv == NULL); - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - ngtcp2_dcid_set_path(dcid, &ps.path); + ngtcp2_dcidtr_pop_unused(&conn->dcid.dtr, &dcid); + ngtcp2_dcid_set_path(&dcid, &ps.path); - rv = ngtcp2_pv_new(&pv, dcid, conn_compute_pv_timeout(conn), + rv = ngtcp2_pv_new(&pv, &dcid, conn_compute_pv_timeout(conn), NGTCP2_PV_FLAG_PREFERRED_ADDR, &conn->log, conn->mem); if (rv != 0) { - /* TODO Call ngtcp2_dcid_free here if it is introduced */ return rv; } - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); conn->pv = pv; return conn_call_activate_dcid(conn, &pv->dcid); @@ -8219,9 +7974,9 @@ static int conn_recv_handshake_done(ngtcp2_conn *conn, ngtcp2_tstamp ts) { conn->flags |= NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED | NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; - conn->pktns.rtb.persistent_congestion_start_ts = ts; + conn->handshake_confirmed_ts = ts; - conn_discard_handshake_state(conn, ts); + ngtcp2_conn_discard_handshake_state(conn, ts); assert(conn->remote.transport_params); @@ -8323,9 +8078,9 @@ static int conn_prepare_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { new_tx_ckm = conn->crypto.key_update.new_tx_ckm; rv = conn_call_update_key( - conn, new_rx_ckm->secret.base, new_tx_ckm->secret.base, &rx_aead_ctx, - new_rx_ckm->iv.base, &tx_aead_ctx, new_tx_ckm->iv.base, - rx_ckm->secret.base, tx_ckm->secret.base, secretlen); + conn, new_rx_ckm->secret.base, new_tx_ckm->secret.base, &rx_aead_ctx, + new_rx_ckm->iv.base, &tx_aead_ctx, new_tx_ckm->iv.base, rx_ckm->secret.base, + tx_ckm->secret.base, secretlen); if (rv != 0) { return rv; } @@ -8340,7 +8095,7 @@ static int conn_prepare_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (conn->crypto.key_update.old_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); ngtcp2_crypto_km_del(conn->crypto.key_update.old_rx_ckm, conn->mem); conn->crypto.key_update.old_rx_ckm = NULL; } @@ -8412,19 +8167,18 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, size_t dgramlen, int new_cid_used, ngtcp2_tstamp ts) { - - ngtcp2_dcid dcid, *bound_dcid, *last; + ngtcp2_dcid dcid; ngtcp2_pv *pv; int rv; ngtcp2_duration pto; int require_new_cid; int local_addr_eq; + int pref_addr_migration; uint32_t remote_addr_cmp; - size_t len, i; assert(conn->server); - if (conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if (conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && ngtcp2_path_eq(&conn->pv->fallback_dcid.ps.path, path)) { /* If new path equals fallback path, that means connection migrated back to the original path. Fallback path is @@ -8448,9 +8202,11 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, } remote_addr_cmp = - ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); + ngtcp2_addr_cmp(&conn->dcid.current.ps.path.remote, &path->remote); local_addr_eq = - ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local); + ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local); + pref_addr_migration = + !local_addr_eq && conn_server_preferred_addr_migration(conn, &path->local); /* * When to change DCID? RFC 9002 section 9.5 says: @@ -8474,44 +8230,25 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "non-probing packet was received from new remote address"); - len = ngtcp2_ringbuf_len(&conn->dcid.bound.rb); + if (ngtcp2_dcidtr_pop_bound_dcid(&conn->dcid.dtr, &dcid, path) == 0) { + ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, + "Found DCID which has already been bound to the new path"); - for (i = 0; i < len; ++i) { - bound_dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - if (ngtcp2_path_eq(&bound_dcid->ps.path, path)) { - ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_CON, - "Found DCID which has already been bound to the new path"); - - ngtcp2_dcid_copy(&dcid, bound_dcid); - if (i == 0) { - ngtcp2_ringbuf_pop_front(&conn->dcid.bound.rb); - } else if (i == ngtcp2_ringbuf_len(&conn->dcid.bound.rb) - 1) { - ngtcp2_ringbuf_pop_back(&conn->dcid.bound.rb); - } else { - last = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, len - 1); - ngtcp2_dcid_copy(bound_dcid, last); - ngtcp2_ringbuf_pop_back(&conn->dcid.bound.rb); - } - require_new_cid = 0; + require_new_cid = 0; - if (dcid.cid.datalen) { - rv = conn_call_activate_dcid(conn, &dcid); - if (rv != 0) { - return rv; - } + if (dcid.cid.datalen) { + rv = conn_call_activate_dcid(conn, &dcid); + if (rv != 0) { + return rv; } - break; } - } - - if (i == len) { + } else { if (require_new_cid) { - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb) == 0) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return NGTCP2_ERR_CONN_ID_BLOCKED; } - ngtcp2_dcid_copy(&dcid, ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0)); - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); + + ngtcp2_dcidtr_pop_unused(&conn->dcid.dtr, &dcid); rv = conn_call_activate_dcid(conn, &dcid); if (rv != 0) { @@ -8534,37 +8271,38 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, pto = conn_compute_pto(conn, &conn->pktns); rv = ngtcp2_pv_new(&pv, &dcid, conn_compute_pv_timeout_pto(conn, pto), - NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE, &conn->log, conn->mem); + NGTCP2_PV_FLAG_NONE, &conn->log, conn->mem); if (rv != 0) { return rv; } - if (conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE)) { - ngtcp2_dcid_copy(&pv->fallback_dcid, &conn->pv->fallback_dcid); - pv->fallback_pto = conn->pv->fallback_pto; + if (conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT)) { + ngtcp2_pv_set_fallback(pv, &conn->pv->fallback_dcid, + conn->pv->fallback_pto); /* Unset the flag bit so that conn_stop_pv does not retire DCID. */ - conn->pv->flags &= (uint8_t)~NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE; - } else { - ngtcp2_dcid_copy(&pv->fallback_dcid, &conn->dcid.current); - pv->fallback_pto = pto; + conn->pv->flags &= (uint8_t)~NGTCP2_PV_FLAG_FALLBACK_PRESENT; + } else if (!pref_addr_migration) { + ngtcp2_pv_set_fallback(pv, &conn->dcid.current, pto); } - if (!local_addr_eq || (remote_addr_cmp & (NGTCP2_ADDR_COMPARE_FLAG_ADDR | - NGTCP2_ADDR_COMPARE_FLAG_FAMILY))) { - conn_reset_congestion_state(conn, ts); - } + if (!pref_addr_migration) { + ngtcp2_dcid_copy(&conn->dcid.current, &dcid); - ngtcp2_dcid_copy(&conn->dcid.current, &dcid); + if (!local_addr_eq || (remote_addr_cmp & (NGTCP2_ADDR_CMP_FLAG_ADDR | + NGTCP2_ADDR_CMP_FLAG_FAMILY))) { + conn_reset_congestion_state(conn, ts); + } - conn_reset_ecn_validation_state(conn); + conn_reset_ecn_validation_state(conn); - ngtcp2_conn_stop_pmtud(conn); + ngtcp2_conn_stop_pmtud(conn); + } if (conn->pv) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PTV, - "path migration is aborted because new migration has started"); + &conn->log, NGTCP2_LOG_EVENT_PTV, + "path migration is aborted because new migration has started"); rv = conn_abort_pv(conn, ts); if (rv != 0) { return rv; @@ -8604,7 +8342,7 @@ static int conn_recv_pkt_from_new_path(ngtcp2_conn *conn, return 0; } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && ngtcp2_path_eq(&pv->fallback_dcid.ps.path, path)) { pv->fallback_dcid.bytes_recv += dgramlen; return 0; @@ -8620,7 +8358,6 @@ static int conn_recv_pkt_from_new_path(ngtcp2_conn *conn, return rv; } - ngtcp2_dcid_set_path(bound_dcid, path); bound_dcid->bytes_recv += dgramlen; return 0; @@ -8658,6 +8395,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, int rv; int require_ack = 0; ngtcp2_pktns *pktns; + size_t num_ack_processed = 0; assert(hd->type == NGTCP2_PKT_HANDSHAKE); @@ -8684,6 +8422,13 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, case NGTCP2_FRAME_ACK_ECN: fr->ack.ack_delay = 0; fr->ack.ack_delay_unscaled = 0; + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -8692,6 +8437,9 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -8699,6 +8447,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, if (rv != 0) { return rv; } + ++num_ack_processed; break; case NGTCP2_FRAME_PADDING: break; @@ -8721,20 +8470,13 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, ngtcp2_qlog_pkt_received_end(&conn->qlog, hd, pktlen); - rv = pktns_commit_recv_pkt_num(pktns, hd->pkt_num, require_ack, pkt_ts); + rv = pktns_commit_recv_pkt_num(pktns, hd->pkt_num, pi, require_ack, pkt_ts); if (rv != 0) { return rv; } - pktns_increase_ecn_counts(pktns, pi); - /* Initial and Handshake are always acknowledged without delay. No need to call ngtcp2_acktr_immediate_ack(). */ - rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd->pkt_num, require_ack, - pkt_ts); - if (rv != 0) { - return rv; - } conn_restart_timer_on_read(conn, ts); @@ -8752,8 +8494,6 @@ static int conn_allow_path_change_under_disable_active_migration(ngtcp2_conn *conn, const ngtcp2_path *path) { uint32_t remote_addr_cmp; - const ngtcp2_preferred_addr *paddr; - ngtcp2_addr addr; assert(conn->server); assert(conn->local.transport_params.disable_active_migration); @@ -8762,40 +8502,15 @@ conn_allow_path_change_under_disable_active_migration(ngtcp2_conn *conn, (NAT rebinding). */ if (ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local)) { remote_addr_cmp = - ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); + ngtcp2_addr_cmp(&conn->dcid.current.ps.path.remote, &path->remote); - return (remote_addr_cmp | NGTCP2_ADDR_COMPARE_FLAG_PORT) == - NGTCP2_ADDR_COMPARE_FLAG_PORT; + return (remote_addr_cmp | NGTCP2_ADDR_CMP_FLAG_PORT) == + NGTCP2_ADDR_CMP_FLAG_PORT; } /* If local address changes, it must be one of the preferred addresses. */ - - if (!conn->local.transport_params.preferred_addr_present) { - return 0; - } - - paddr = &conn->local.transport_params.preferred_addr; - - if (paddr->ipv4_present) { - ngtcp2_addr_init(&addr, (const ngtcp2_sockaddr *)&paddr->ipv4, - sizeof(paddr->ipv4)); - - if (ngtcp2_addr_eq(&addr, &path->local)) { - return 1; - } - } - - if (paddr->ipv6_present) { - ngtcp2_addr_init(&addr, (const ngtcp2_sockaddr *)&paddr->ipv6, - sizeof(paddr->ipv6)); - - if (ngtcp2_addr_eq(&addr, &path->local)) { - return 1; - } - } - - return 0; + return conn_server_preferred_addr_migration(conn, &path->local); } /* @@ -8860,14 +8575,30 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, int recv_ncid = 0; int new_cid_used = 0; int path_challenge_recved = 0; + size_t num_ack_processed = 0; - if (conn->server && conn->local.transport_params.disable_active_migration && - !ngtcp2_path_eq(&conn->dcid.current.ps.path, path) && - !conn_allow_path_change_under_disable_active_migration(conn, path)) { - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "packet is discarded because active migration is disabled"); + if (conn->server) { + if (conn->local.transport_params.disable_active_migration && + !ngtcp2_path_eq(&conn->dcid.current.ps.path, path) && + !conn_allow_path_change_under_disable_active_migration(conn, path)) { + ngtcp2_log_info( + &conn->log, NGTCP2_LOG_EVENT_PKT, + "packet is discarded because local active migration is disabled"); - return NGTCP2_ERR_DISCARD_PKT; + return NGTCP2_ERR_DISCARD_PKT; + } + + assert(conn->remote.transport_params); + + if (conn->remote.transport_params->disable_active_migration && + !ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local) && + !conn_server_preferred_addr_migration(conn, &path->local)) { + ngtcp2_log_info( + &conn->log, NGTCP2_LOG_EVENT_PKT, + "packet is discarded because remote active migration is disabled"); + + return NGTCP2_ERR_DISCARD_PKT; + } } if (pkt[0] & NGTCP2_HEADER_FORM_BIT) { @@ -8992,7 +8723,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload = pkt + hdpktlen; payloadlen = pktlen - hdpktlen; - hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, + hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->acktr.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, @@ -9003,6 +8734,19 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_log_rx_pkt_hd(&conn->log, &hd); if (hd.type == NGTCP2_PKT_1RTT) { + if (conn->server && conn->rx.preferred_addr.pkt_num != -1 && + conn->rx.preferred_addr.pkt_num < hd.pkt_num && + ngtcp2_sockaddr_eq((const ngtcp2_sockaddr *)&conn->hs_local_addr, + path->local.addr)) { + ngtcp2_log_info( + &conn->log, NGTCP2_LOG_EVENT_PKT, + "pkt=%" PRId64 + " is discarded because it was received on handshake local " + "address after preferred address migration", + hd.pkt_num); + return NGTCP2_ERR_DISCARD_PKT; + } + key_phase_bit_changed = conn_key_phase_changed(conn, &hd); } @@ -9024,7 +8768,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } else { force_decrypt_failure = 1; } - } else if (pktns->rx.max_pkt_num < hd.pkt_num) { + } else if (pktns->acktr.max_pkt_num < hd.pkt_num) { assert(ckm->pkt_num < hd.pkt_num); if (!conn->crypto.key_update.new_rx_ckm) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, @@ -9057,7 +8801,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (hd.type == NGTCP2_PKT_1RTT && ++conn->crypto.decryption_failure_count >= - pktns->crypto.ctx.max_decryption_failure) { + pktns->crypto.ctx.max_decryption_failure) { return NGTCP2_ERR_AEAD_LIMIT_REACHED; } @@ -9163,7 +8907,14 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } assert(conn->remote.transport_params); assign_recved_ack_delay_unscaled( - &fr->ack, conn->remote.transport_params->ack_delay_exponent); + &fr->ack, conn->remote.transport_params->ack_delay_exponent); + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -9210,6 +8961,9 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -9218,6 +8972,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, return rv; } non_probing_pkt = 1; + ++num_ack_processed; break; case NGTCP2_FRAME_STREAM: rv = conn_recv_stream(conn, &fr->stream); @@ -9282,7 +9037,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, path_challenge_recved = 1; break; case NGTCP2_FRAME_PATH_RESPONSE: - rv = conn_recv_path_response(conn, &fr->path_response, ts); + rv = conn_recv_path_response(conn, &hd, &fr->path_response, ts); if (rv != 0) { return rv; } @@ -9372,7 +9127,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (conn->server && hd.type == NGTCP2_PKT_1RTT && !ngtcp2_path_eq(&conn->dcid.current.ps.path, path)) { - if (non_probing_pkt && pktns->rx.max_pkt_num < hd.pkt_num && + if (non_probing_pkt && pktns->acktr.max_pkt_num < hd.pkt_num && !conn_path_validation_in_progress(conn, path)) { rv = conn_recv_non_probing_pkt_on_new_path(conn, path, dgramlen, new_cid_used, ts); @@ -9416,25 +9171,17 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } } - rv = pktns_commit_recv_pkt_num(pktns, hd.pkt_num, require_ack, pkt_ts); + rv = pktns_commit_recv_pkt_num(pktns, hd.pkt_num, pi, require_ack, pkt_ts); if (rv != 0) { return rv; } - pktns_increase_ecn_counts(pktns, pi); - if (require_ack && (++pktns->acktr.rx_npkt >= conn->local.settings.ack_thresh || (pi->ecn & NGTCP2_ECN_MASK) == NGTCP2_ECN_CE)) { ngtcp2_acktr_immediate_ack(&pktns->acktr); } - rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, - pkt_ts); - if (rv != 0) { - return rv; - } - conn_restart_timer_on_read(conn, ts); ngtcp2_qlog_metrics_updated(&conn->qlog, &conn->cstat); @@ -9602,8 +9349,8 @@ static int conn_handshake_completed(ngtcp2_conn *conn) { } } if (conn->local.uni.max_streams > 0) { - rv = conn_call_extend_max_local_streams_uni(conn, - conn->local.uni.max_streams); + rv = + conn_call_extend_max_local_streams_uni(conn, conn->local.uni.max_streams); if (rv != 0) { return rv; } @@ -9667,24 +9414,6 @@ static int conn_recv_cpkt(ngtcp2_conn *conn, const ngtcp2_path *path, return 0; } -/* - * conn_is_retired_path returns nonzero if |path| is included in - * retired path list. - */ -static int conn_is_retired_path(ngtcp2_conn *conn, const ngtcp2_path *path) { - size_t i, len = ngtcp2_ringbuf_len(&conn->dcid.retired.rb); - ngtcp2_dcid *dcid; - - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, i); - if (ngtcp2_path_eq(&dcid->ps.path, path)) { - return 1; - } - } - - return 0; -} - /* * conn_enqueue_handshake_done enqueues HANDSHAKE_DONE frame for * transmission. @@ -9821,8 +9550,8 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, } } - if (conn->hs_pktns->rx.max_pkt_num != -1) { - conn_discard_initial_state(conn, ts); + if (conn->hs_pktns->acktr.max_pkt_num != -1) { + ngtcp2_conn_discard_initial_state(conn, ts); } if (!conn_is_tls_handshake_completed(conn)) { @@ -9888,7 +9617,7 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, return rv; } - conn_discard_handshake_state(conn, ts); + ngtcp2_conn_discard_handshake_state(conn, ts); rv = conn_enqueue_handshake_done(conn); if (rv != 0) { @@ -9902,7 +9631,7 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, } } - conn->pktns.rtb.persistent_congestion_start_ts = ts; + conn->handshake_confirmed_ts = ts; /* Re-arm loss detection timer here after handshake has been confirmed. */ @@ -9936,13 +9665,13 @@ int ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, pktlen); if (pktlen == 0) { - return NGTCP2_ERR_INVALID_ARGUMENT; + return 0; } /* client does not expect a packet from unknown path. */ if (!conn->server && !ngtcp2_path_eq(&conn->dcid.current.ps.path, path) && (!conn->pv || !ngtcp2_path_eq(&conn->pv->dcid.ps.path, path)) && - !conn_is_retired_path(conn, path)) { + !ngtcp2_dcidtr_check_path_retired(&conn->dcid.dtr, path)) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "ignore packet from unknown path"); return 0; @@ -10035,13 +9764,12 @@ static int conn_check_pkt_num_exhausted(ngtcp2_conn *conn) { * conn_retransmit_retry_early retransmits 0RTT packet after Retry is * received from server. */ -static ngtcp2_ssize conn_retransmit_retry_early(ngtcp2_conn *conn, - ngtcp2_pkt_info *pi, - uint8_t *dest, size_t destlen, - uint8_t flags, - ngtcp2_tstamp ts) { - return conn_write_pkt(conn, pi, dest, destlen, NULL, NGTCP2_PKT_0RTT, flags, - ts); +static ngtcp2_ssize +conn_retransmit_retry_early(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, size_t dgram_offset, + uint8_t flags, ngtcp2_tstamp ts) { + return conn_write_pkt(conn, pi, dest, destlen, dgram_offset, NULL, + NGTCP2_PKT_0RTT, flags, ts); } /* @@ -10067,21 +9795,21 @@ static int conn_validate_early_transport_params_limits(ngtcp2_conn *conn) { assert(params); if (conn->early.transport_params.active_connection_id_limit > - params->active_connection_id_limit || + params->active_connection_id_limit || conn->early.transport_params.initial_max_data > - params->initial_max_data || + params->initial_max_data || conn->early.transport_params.initial_max_stream_data_bidi_local > - params->initial_max_stream_data_bidi_local || + params->initial_max_stream_data_bidi_local || conn->early.transport_params.initial_max_stream_data_bidi_remote > - params->initial_max_stream_data_bidi_remote || + params->initial_max_stream_data_bidi_remote || conn->early.transport_params.initial_max_stream_data_uni > - params->initial_max_stream_data_uni || + params->initial_max_stream_data_uni || conn->early.transport_params.initial_max_streams_bidi > - params->initial_max_streams_bidi || + params->initial_max_streams_bidi || conn->early.transport_params.initial_max_streams_uni > - params->initial_max_streams_uni || + params->initial_max_streams_uni || conn->early.transport_params.max_datagram_frame_size > - params->max_datagram_frame_size) { + params->max_datagram_frame_size) { return NGTCP2_ERR_PROTO; } @@ -10119,7 +9847,6 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_ssize res = 0, nwrite = 0, early_spktlen = 0; size_t origlen = destlen; uint64_t pending_early_datalen; - ngtcp2_dcid *dcid; ngtcp2_preferred_addr *paddr; switch (conn->state) { @@ -10131,14 +9858,14 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (!(conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY)) { nwrite = - conn_write_client_initial(conn, pi, dest, destlen, write_datalen, ts); + conn_write_client_initial(conn, pi, dest, destlen, write_datalen, ts); if (nwrite <= 0) { return nwrite; } } else { - nwrite = conn_write_handshake_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); + nwrite = + conn_write_handshake_pkt(conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, + NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10146,10 +9873,10 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (pending_early_datalen) { early_spktlen = conn_retransmit_retry_early( - conn, pi, dest + nwrite, destlen - (size_t)nwrite, - nwrite ? NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING - : NGTCP2_WRITE_PKT_FLAG_NONE, - ts); + conn, pi, dest + nwrite, destlen - (size_t)nwrite, (size_t)nwrite, + nwrite ? NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING + : NGTCP2_WRITE_PKT_FLAG_NONE, + ts); if (early_spktlen < 0) { assert(ngtcp2_err_is_fatal((int)early_spktlen)); @@ -10163,6 +9890,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return res; case NGTCP2_CS_CLIENT_WAIT_HANDSHAKE: + pending_early_datalen = 0; + if (!conn_handshake_probe_left(conn) && conn_cwnd_is_zero(conn)) { destlen = 0; } else { @@ -10174,7 +9903,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10185,9 +9914,10 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } if (!conn_is_tls_handshake_completed(conn)) { - if (!(conn->flags & NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED)) { - nwrite = conn_retransmit_retry_early(conn, pi, dest, destlen, - NGTCP2_WRITE_PKT_FLAG_NONE, ts); + if (pending_early_datalen && + !(conn->flags & NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED)) { + nwrite = conn_retransmit_retry_early( + conn, pi, dest, destlen, (size_t)res, NGTCP2_WRITE_PKT_FLAG_NONE, ts); if (nwrite < 0) { return nwrite; } @@ -10234,11 +9964,11 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(conn->remote.transport_params); if (conn->remote.transport_params->preferred_addr_present) { - assert(!ngtcp2_ringbuf_full(&conn->dcid.unused.rb)); + assert(!ngtcp2_dcidtr_unused_full(&conn->dcid.dtr)); paddr = &conn->remote.transport_params->preferred_addr; - dcid = ngtcp2_ringbuf_push_back(&conn->dcid.unused.rb); - ngtcp2_dcid_init(dcid, 1, &paddr->cid, paddr->stateless_reset_token); + ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, 1, &paddr->cid, + paddr->stateless_reset_token); rv = ngtcp2_gaptr_push(&conn->dcid.seqgap, 1, 1); if (rv != 0) { @@ -10250,8 +9980,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(conn->dcid.current.seq == 0); assert(!(conn->dcid.current.flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT)); ngtcp2_dcid_set_token( - &conn->dcid.current, - conn->remote.transport_params->stateless_reset_token); + &conn->dcid.current, + conn->remote.transport_params->stateless_reset_token); } rv = conn_call_activate_dcid(conn, &conn->dcid.current); @@ -10271,7 +10001,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return res; case NGTCP2_CS_SERVER_INITIAL: nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10284,7 +10014,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, case NGTCP2_CS_SERVER_WAIT_HANDSHAKE: if (conn_handshake_probe_left(conn) || !conn_cwnd_is_zero(conn)) { nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10363,8 +10093,8 @@ static ngtcp2_ssize conn_client_write_handshake(ngtcp2_conn *conn, datalen = ngtcp2_vec_len(vmsg->stream.data, vmsg->stream.datacnt); send_stream = conn_retry_early_payloadlen(conn) == 0; if (send_stream) { - write_datalen = ngtcp2_min(datalen + NGTCP2_STREAM_OVERHEAD, - NGTCP2_MIN_COALESCED_PAYLOADLEN); + write_datalen = ngtcp2_min_uint64(datalen + NGTCP2_STREAM_OVERHEAD, + NGTCP2_MIN_COALESCED_PAYLOADLEN); if (vmsg->stream.flags & NGTCP2_WRITE_STREAM_FLAG_MORE) { wflags |= NGTCP2_WRITE_PKT_FLAG_MORE; @@ -10428,8 +10158,8 @@ static ngtcp2_ssize conn_client_write_handshake(ngtcp2_conn *conn, return spktlen; } - early_spktlen = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_0RTT, - wflags, ts); + early_spktlen = conn_write_pkt(conn, pi, dest, destlen, (size_t)spktlen, vmsg, + NGTCP2_PKT_0RTT, wflags, ts); if (early_spktlen < 0) { switch (early_spktlen) { case NGTCP2_ERR_STREAM_DATA_BLOCKED: @@ -10463,20 +10193,6 @@ int ngtcp2_conn_get_handshake_completed(ngtcp2_conn *conn) { (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED); } -int ngtcp2_conn_sched_ack(ngtcp2_conn *conn, ngtcp2_acktr *acktr, - int64_t pkt_num, int active_ack, ngtcp2_tstamp ts) { - int rv; - (void)conn; - - rv = ngtcp2_acktr_add(acktr, pkt_num, active_ack, ts); - if (rv != 0) { - assert(rv != NGTCP2_ERR_INVALID_ARGUMENT); - return rv; - } - - return 0; -} - int ngtcp2_accept(ngtcp2_pkt_hd *dest, const uint8_t *pkt, size_t pktlen) { ngtcp2_ssize nread; ngtcp2_pkt_hd hd, *p; @@ -10520,10 +10236,10 @@ int ngtcp2_accept(ngtcp2_pkt_hd *dest, const uint8_t *pkt, size_t pktlen) { } int ngtcp2_conn_install_initial_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, - const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, + const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { ngtcp2_pktns *pktns = conn->in_pktns; int rv; @@ -10571,11 +10287,11 @@ int ngtcp2_conn_install_initial_key( } int ngtcp2_conn_install_vneg_initial_key( - ngtcp2_conn *conn, uint32_t version, - const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, - const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { + ngtcp2_conn *conn, uint32_t version, + const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, + const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { int rv; assert(ivlen >= 8); @@ -10622,8 +10338,8 @@ int ngtcp2_conn_install_vneg_initial_key( } int ngtcp2_conn_install_rx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pktns *pktns = conn->hs_pktns; int rv; @@ -10654,8 +10370,8 @@ int ngtcp2_conn_install_rx_handshake_key( } int ngtcp2_conn_install_tx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pktns *pktns = conn->hs_pktns; int rv; @@ -10848,108 +10564,45 @@ int ngtcp2_conn_initiate_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { return conn_initiate_key_update(conn, ts); } -/* - * conn_retire_stale_bound_dcid retires stale destination connection - * ID in conn->dcid.bound to keep some unused destination connection - * IDs available. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -static int conn_retire_stale_bound_dcid(ngtcp2_conn *conn, - ngtcp2_duration timeout, - ngtcp2_tstamp ts) { - size_t i; - ngtcp2_dcid *dcid, *last; - int rv; - - for (i = 0; i < ngtcp2_ringbuf_len(&conn->dcid.bound.rb);) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - - assert(dcid->cid.datalen); - - if (ngtcp2_tstamp_not_elapsed(dcid->bound_ts, timeout, ts)) { - ++i; - continue; - } - - rv = conn_retire_dcid_seq(conn, dcid->seq); - if (rv != 0) { - return rv; - } - - if (i == 0) { - ngtcp2_ringbuf_pop_front(&conn->dcid.bound.rb); - continue; - } - - if (i == ngtcp2_ringbuf_len(&conn->dcid.bound.rb) - 1) { - ngtcp2_ringbuf_pop_back(&conn->dcid.bound.rb); - break; - } - - last = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, - ngtcp2_ringbuf_len(&conn->dcid.bound.rb) - 1); - ngtcp2_dcid_copy(dcid, last); - ngtcp2_ringbuf_pop_back(&conn->dcid.bound.rb); - } - - return 0; -} - ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(ngtcp2_conn *conn) { return conn->cstat.loss_detection_timer; } ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { - ngtcp2_tstamp res = UINT64_MAX, t; + ngtcp2_tstamp res = UINT64_MAX, ts; ngtcp2_duration pto = conn_compute_pto(conn, &conn->pktns); ngtcp2_scid *scid; - ngtcp2_dcid *dcid; - size_t i, len; if (conn->pv) { res = ngtcp2_pv_next_expiry(conn->pv); } if (conn->pmtud) { - res = ngtcp2_min(res, conn->pmtud->expiry); + res = ngtcp2_min_uint64(res, conn->pmtud->expiry); } if (!ngtcp2_pq_empty(&conn->scid.used)) { scid = ngtcp2_struct_of(ngtcp2_pq_top(&conn->scid.used), ngtcp2_scid, pe); if (scid->retired_ts != UINT64_MAX) { - t = scid->retired_ts + pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, scid->retired_ts + pto); } } - if (ngtcp2_ringbuf_len(&conn->dcid.retired.rb)) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, 0); - t = dcid->retired_ts + pto; - res = ngtcp2_min(res, t); + ts = ngtcp2_dcidtr_earliest_retired_ts(&conn->dcid.dtr); + if (ts != UINT64_MAX) { + res = ngtcp2_min_uint64(res, ts + pto); } if (conn->dcid.current.cid.datalen) { - len = ngtcp2_ringbuf_len(&conn->dcid.bound.rb); - for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); - - assert(dcid->cid.datalen); - assert(dcid->bound_ts != UINT64_MAX); - - t = dcid->bound_ts + 3 * pto; - res = ngtcp2_min(res, t); + ts = ngtcp2_dcidtr_earliest_bound_ts(&conn->dcid.dtr); + if (ts != UINT64_MAX) { + res = ngtcp2_min_uint64(res, ts + 3 * pto); } } if (conn->server && conn->early.ckm && conn->early.discard_started_ts != UINT64_MAX) { - t = conn->early.discard_started_ts + 3 * pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, conn->early.discard_started_ts + 3 * pto); } return res; @@ -10969,7 +10622,7 @@ static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { if (conn_is_tls_handshake_completed(conn) || conn->local.settings.handshake_timeout == UINT64_MAX || conn->local.settings.initial_ts >= - UINT64_MAX - conn->local.settings.handshake_timeout) { + UINT64_MAX - conn->local.settings.handshake_timeout) { return UINT64_MAX; } @@ -10978,20 +10631,14 @@ static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { } ngtcp2_tstamp ngtcp2_conn_get_expiry(ngtcp2_conn *conn) { - ngtcp2_tstamp t1 = ngtcp2_conn_loss_detection_expiry(conn); - ngtcp2_tstamp t2 = ngtcp2_conn_ack_delay_expiry(conn); - ngtcp2_tstamp t3 = ngtcp2_conn_internal_expiry(conn); - ngtcp2_tstamp t4 = ngtcp2_conn_lost_pkt_expiry(conn); - ngtcp2_tstamp t5 = conn_keep_alive_expiry(conn); - ngtcp2_tstamp t6 = conn_handshake_expiry(conn); - ngtcp2_tstamp t7 = ngtcp2_conn_get_idle_expiry(conn); - ngtcp2_tstamp res = ngtcp2_min(t1, t2); - res = ngtcp2_min(res, t3); - res = ngtcp2_min(res, t4); - res = ngtcp2_min(res, t5); - res = ngtcp2_min(res, t6); - res = ngtcp2_min(res, t7); - return ngtcp2_min(res, conn->tx.pacing.next_ts); + ngtcp2_tstamp res = ngtcp2_min_uint64(ngtcp2_conn_loss_detection_expiry(conn), + ngtcp2_conn_ack_delay_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_internal_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_lost_pkt_expiry(conn)); + res = ngtcp2_min_uint64(res, conn_keep_alive_expiry(conn)); + res = ngtcp2_min_uint64(res, conn_handshake_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_get_idle_expiry(conn)); + return ngtcp2_min_uint64(res, conn->tx.pacing.next_ts); } int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -11035,7 +10682,8 @@ int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { } if (conn->dcid.current.cid.datalen) { - rv = conn_retire_stale_bound_dcid(conn, 3 * pto, ts); + rv = ngtcp2_dcidtr_retire_stale_bound_dcid(&conn->dcid.dtr, 3 * pto, ts, + dcidtr_on_retire, conn); if (rv != 0) { return rv; } @@ -11089,7 +10737,7 @@ ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->in_pktns->rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, conn->in_pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } } @@ -11097,14 +10745,14 @@ ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->hs_pktns->rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, conn->hs_pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } } ts = ngtcp2_rtb_lost_pkt_ts(&conn->pktns.rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, &conn->pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } return res; @@ -11153,7 +10801,7 @@ static uint32_t select_preferred_version(const uint32_t *preferred_versions, } for (j = 0, p = available_versions; j < available_versionslen; j += sizeof(uint32_t)) { - p = ngtcp2_get_uint32(&v, p); + p = ngtcp2_get_uint32be(&v, p); if (preferred_versions[i] == v) { return v; @@ -11266,13 +10914,13 @@ ngtcp2_conn_server_negotiate_version(ngtcp2_conn *conn, assert(conn->client_chosen_version == version_info->chosen_version); return select_preferred_version( - conn->vneg.preferred_versions, conn->vneg.preferred_versionslen, - version_info->chosen_version, version_info->available_versions, - version_info->available_versionslen, version_info->chosen_version); + conn->vneg.preferred_versions, conn->vneg.preferred_versionslen, + version_info->chosen_version, version_info->available_versions, + version_info->available_versionslen, version_info->chosen_version); } int ngtcp2_conn_set_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, const ngtcp2_transport_params *params) { int rv; /* We expect this function is called once per QUIC connection, but @@ -11315,9 +10963,9 @@ int ngtcp2_conn_set_remote_transport_params( if (params->version_info_present) { if (!vneg_available_versions_includes( - params->version_info.available_versions, - params->version_info.available_versionslen, - params->version_info.chosen_version)) { + params->version_info.available_versions, + params->version_info.available_versionslen, + params->version_info.chosen_version)) { return NGTCP2_ERR_TRANSPORT_PARAM; } @@ -11326,7 +10974,7 @@ int ngtcp2_conn_set_remote_transport_params( } conn->negotiated_version = - ngtcp2_conn_server_negotiate_version(conn, ¶ms->version_info); + ngtcp2_conn_server_negotiate_version(conn, ¶ms->version_info); if (conn->negotiated_version != conn->client_chosen_version) { rv = conn_call_version_negotiation(conn, conn->negotiated_version, &conn->rcid); @@ -11339,7 +10987,7 @@ int ngtcp2_conn_set_remote_transport_params( } conn->local.transport_params.version_info.chosen_version = - conn->negotiated_version; + conn->negotiated_version; ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "the negotiated version is 0x%08x", @@ -11372,7 +11020,7 @@ int ngtcp2_conn_set_remote_transport_params( assert(!conn->remote.pending_transport_params); rv = ngtcp2_transport_params_copy_new( - &conn->remote.pending_transport_params, params, conn->mem); + &conn->remote.pending_transport_params, params, conn->mem); if (rv != 0) { return rv; } @@ -11424,9 +11072,9 @@ ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, params.initial_max_streams_bidi = src->initial_max_streams_bidi; params.initial_max_streams_uni = src->initial_max_streams_uni; params.initial_max_stream_data_bidi_local = - src->initial_max_stream_data_bidi_local; + src->initial_max_stream_data_bidi_local; params.initial_max_stream_data_bidi_remote = - src->initial_max_stream_data_bidi_remote; + src->initial_max_stream_data_bidi_remote; params.initial_max_stream_data_uni = src->initial_max_stream_data_uni; params.initial_max_data = src->initial_max_data; params.active_connection_id_limit = src->active_connection_id_limit; @@ -11456,7 +11104,7 @@ int ngtcp2_conn_decode_and_set_0rtt_transport_params(ngtcp2_conn *conn, } int ngtcp2_conn_set_0rtt_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, const ngtcp2_transport_params *params) { ngtcp2_transport_params *p; assert(!conn->server); @@ -11475,41 +11123,41 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( p->initial_max_streams_bidi = params->initial_max_streams_bidi; p->initial_max_streams_uni = params->initial_max_streams_uni; p->initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; + params->initial_max_stream_data_bidi_local; p->initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; + params->initial_max_stream_data_bidi_remote; p->initial_max_stream_data_uni = params->initial_max_stream_data_uni; p->initial_max_data = params->initial_max_data; /* we might hit garbage, then set the sane default. */ p->active_connection_id_limit = - ngtcp2_max(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); + ngtcp2_max_uint64(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); p->max_datagram_frame_size = params->max_datagram_frame_size; /* we might hit garbage, then set the sane default. */ if (params->max_udp_payload_size) { - p->max_udp_payload_size = - ngtcp2_max(NGTCP2_MAX_UDP_PAYLOAD_SIZE, params->max_udp_payload_size); + p->max_udp_payload_size = ngtcp2_max_uint64(NGTCP2_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); } /* These parameters are treated specially. If server accepts early data, it must not set values for these parameters that are smaller than these remembered values. */ conn->early.transport_params.initial_max_streams_bidi = - params->initial_max_streams_bidi; + params->initial_max_streams_bidi; conn->early.transport_params.initial_max_streams_uni = - params->initial_max_streams_uni; + params->initial_max_streams_uni; conn->early.transport_params.initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; + params->initial_max_stream_data_bidi_local; conn->early.transport_params.initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; + params->initial_max_stream_data_bidi_remote; conn->early.transport_params.initial_max_stream_data_uni = - params->initial_max_stream_data_uni; + params->initial_max_stream_data_uni; conn->early.transport_params.initial_max_data = params->initial_max_data; conn->early.transport_params.active_connection_id_limit = - params->active_connection_id_limit; + params->active_connection_id_limit; conn->early.transport_params.max_datagram_frame_size = - params->max_datagram_frame_size; + params->max_datagram_frame_size; conn_sync_stream_id_limit(conn); @@ -11522,17 +11170,18 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( } int ngtcp2_conn_set_local_transport_params_versioned( - ngtcp2_conn *conn, int transport_params_version, - const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, int transport_params_version, + const ngtcp2_transport_params *params) { ngtcp2_transport_params paramsbuf; params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); + ¶msbuf, transport_params_version, params); assert(conn->server); assert(params->active_connection_id_limit >= NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT); - assert(params->active_connection_id_limit <= NGTCP2_MAX_DCID_POOL_SIZE); + assert(params->active_connection_id_limit <= + NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE); if (conn->hs_pktns == NULL || conn->hs_pktns->crypto.tx.ckm) { return NGTCP2_ERR_INVALID_STATE; @@ -11576,7 +11225,7 @@ int ngtcp2_conn_commit_local_transport_params(ngtcp2_conn *conn) { } conn->rx.window = conn->rx.unsent_max_offset = conn->rx.max_offset = - params->initial_max_data; + params->initial_max_data; conn->remote.bidi.unsent_max_streams = params->initial_max_streams_bidi; conn->remote.bidi.max_streams = params->initial_max_streams_bidi; conn->remote.uni.unsent_max_streams = params->initial_max_streams_uni; @@ -11662,10 +11311,10 @@ ngtcp2_strm *ngtcp2_conn_find_stream(ngtcp2_conn *conn, int64_t stream_id) { } ngtcp2_ssize ngtcp2_conn_write_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts) { ngtcp2_vec datav; datav.len = datalen; @@ -11693,9 +11342,10 @@ static ngtcp2_ssize conn_write_vmsg_wrapper(ngtcp2_conn *conn, if (cstat->bytes_in_flight >= cstat->cwnd) { conn->rst.is_cwnd_limited = 1; - } - - if (nwrite == 0 && cstat->bytes_in_flight < cstat->cwnd) { + } else if ((cstat->cwnd >= cstat->ssthresh || + cstat->bytes_in_flight * 2 < cstat->cwnd) && + nwrite == 0 && conn_pacing_pkt_tx_allowed(conn, ts) && + (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED)) { conn->rst.app_limited = conn->rst.delivered + cstat->bytes_in_flight; if (conn->rst.app_limited == 0) { @@ -11707,10 +11357,10 @@ static ngtcp2_ssize conn_write_vmsg_wrapper(ngtcp2_conn *conn, } ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts) { ngtcp2_vmsg vmsg, *pvmsg; ngtcp2_strm *strm; int64_t datalen; @@ -11734,19 +11384,24 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - if ((uint64_t)datalen > NGTCP2_MAX_VARINT - strm->tx.offset || - (uint64_t)datalen > NGTCP2_MAX_VARINT - conn->tx.offset) { - return NGTCP2_ERR_INVALID_ARGUMENT; - } + if (datalen == 0 && !(flags & NGTCP2_WRITE_STREAM_FLAG_FIN) && + (strm->flags & NGTCP2_STRM_FLAG_ANY_SENT)) { + pvmsg = NULL; + } else { + if ((uint64_t)datalen > NGTCP2_MAX_VARINT - strm->tx.offset || + (uint64_t)datalen > NGTCP2_MAX_VARINT - conn->tx.offset) { + return NGTCP2_ERR_INVALID_ARGUMENT; + } - vmsg.type = NGTCP2_VMSG_TYPE_STREAM; - vmsg.stream.strm = strm; - vmsg.stream.flags = flags; - vmsg.stream.data = datav; - vmsg.stream.datacnt = datavcnt; - vmsg.stream.pdatalen = pdatalen; + vmsg.type = NGTCP2_VMSG_TYPE_STREAM; + vmsg.stream.strm = strm; + vmsg.stream.flags = flags; + vmsg.stream.data = datav; + vmsg.stream.datacnt = datavcnt; + vmsg.stream.pdatalen = pdatalen; - pvmsg = &vmsg; + pvmsg = &vmsg; + } } else { pvmsg = NULL; } @@ -11756,10 +11411,10 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( } ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts) { ngtcp2_vec datav; datav.len = datalen; @@ -11771,10 +11426,10 @@ ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( } ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts) { ngtcp2_vmsg vmsg; int64_t datalen; @@ -11837,7 +11492,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } origlen = destlen = - conn_shape_udp_payload(conn, &conn->dcid.current, destlen); + conn_shape_udp_payload(conn, &conn->dcid.current, destlen); if (!ppe_pending && pi) { pi->ecn = NGTCP2_ECN_NOT_ECT; @@ -11867,10 +11522,9 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, assert(dest[0] & NGTCP2_HEADER_FORM_BIT); assert(conn->negotiated_version); - if (ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == - NGTCP2_PKT_INITIAL) { - /* We have added padding already, but in that case, there is no - space left to write 1RTT packet. */ + if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE && + ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == + NGTCP2_PKT_INITIAL) { wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } @@ -11890,7 +11544,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); } return conn_write_handshake_ack_pkts(conn, pi, dest, origlen, ts); @@ -11902,15 +11556,15 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, if (server_tx_left == 0) { if (cstat->loss_detection_timer != UINT64_MAX) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - cstat->loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } return 0; } - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (conn->in_pktns) { @@ -11931,14 +11585,12 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, dest += nwrite; destlen -= (size_t)nwrite; - if (conn->in_pktns && nwrite > 0) { + if (res < NGTCP2_MAX_UDP_PAYLOAD_SIZE && conn->in_pktns && nwrite > 0) { it = ngtcp2_rtb_head(&conn->in_pktns->rtb); if (!ngtcp2_ksl_it_end(&it)) { rtbent = ngtcp2_ksl_it_get(&it); if (rtbent->hd.pkt_num != prev_in_pkt_num && (rtbent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { - /* We have added padding already, but in that case, there - is no space left to write 1RTT packet. */ wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } } @@ -11959,7 +11611,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); } return conn_write_ack_pkt(conn, pi, dest, origlen, NGTCP2_PKT_1RTT, ts); @@ -12004,12 +11656,12 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } /* dest and destlen have already been adjusted in ppe in the first run. They are adjusted for probe packet later. */ - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); goto fin; } else { conn->pkt.require_padding = - (wflags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING); + (wflags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING); if (conn->state == NGTCP2_CS_POST_HANDSHAKE) { rv = conn_prepare_key_update(conn, ts); @@ -12023,14 +11675,14 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } else { if (res == 0) { nwrite = - conn_write_path_response(conn, path, pi, dest, origdestlen, ts); + conn_write_path_response(conn, path, pi, dest, origdestlen, ts); if (nwrite) { goto fin; } if (conn->pv) { nwrite = - conn_write_path_challenge(conn, path, pi, dest, origdestlen, ts); + conn_write_path_challenge(conn, path, pi, dest, origdestlen, ts); if (nwrite) { goto fin; } @@ -12051,15 +11703,15 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, if (conn->server && !(conn->dcid.current.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); if (server_tx_left == 0 && conn->cstat.loss_detection_timer != UINT64_MAX) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - conn->cstat.loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } } } @@ -12100,14 +11752,14 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, "transmit probe pkt left=%zu", conn->pktns.rtb.probe_pkt_left); - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); goto fin; } - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); if (nwrite) { assert(nwrite != NGTCP2_ERR_NOBUF); goto fin; @@ -12162,9 +11814,8 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, pkt_type != NGTCP2_PKT_INITIAL) { if (in_pktns && conn->server) { nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; } @@ -12177,9 +11828,9 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (pkt_type != NGTCP2_PKT_HANDSHAKE && hs_pktns && hs_pktns->crypto.tx.ckm) { nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, - NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, + NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, + NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; } @@ -12195,8 +11846,8 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, pkt_type, flags, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, pkt_type, flags, &conn->dcid.current.cid, &fr, + NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; @@ -12212,9 +11863,9 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t error_code, const uint8_t *reason, size_t reasonlen, + ngtcp2_tstamp ts) { ngtcp2_pktns *in_pktns = conn->in_pktns; ngtcp2_pktns *hs_pktns = conn->hs_pktns; uint8_t pkt_type; @@ -12247,7 +11898,7 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (conn->state == NGTCP2_CS_POST_HANDSHAKE || @@ -12275,9 +11926,9 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( } ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t app_error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t app_error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_tstamp ts) { ngtcp2_ssize nwrite; ngtcp2_ssize res = 0; ngtcp2_frame fr; @@ -12309,15 +11960,14 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (!(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED)) { - nwrite = conn_write_connection_close(conn, pi, dest, destlen, - conn->hs_pktns->crypto.tx.ckm - ? NGTCP2_PKT_HANDSHAKE - : NGTCP2_PKT_INITIAL, - NGTCP2_APPLICATION_ERROR, NULL, 0, ts); + nwrite = conn_write_connection_close( + conn, pi, dest, destlen, + conn->hs_pktns->crypto.tx.ckm ? NGTCP2_PKT_HANDSHAKE : NGTCP2_PKT_INITIAL, + NGTCP2_APPLICATION_ERROR, NULL, 0, ts); if (nwrite < 0) { return nwrite; } @@ -12326,12 +11976,9 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( destlen -= (size_t)nwrite; } - if (conn->state != NGTCP2_CS_POST_HANDSHAKE) { - assert(res); - - if (!conn->server || !conn->pktns.crypto.tx.ckm) { - return res; - } + if (conn->state != NGTCP2_CS_POST_HANDSHAKE && + (!conn->server || !conn->pktns.crypto.tx.ckm)) { + return res; } assert(conn->pktns.crypto.tx.ckm); @@ -12343,8 +11990,8 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( fr.connection_close.reason = (uint8_t *)reason; nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; @@ -12392,12 +12039,22 @@ void ngtcp2_ccerr_set_liberr(ngtcp2_ccerr *ccerr, int liberr, ccerr_init(ccerr, NGTCP2_CCERR_TYPE_IDLE_CLOSE, NGTCP2_NO_ERROR, reason, reasonlen); + return; + case NGTCP2_ERR_DROP_CONN: + ccerr_init(ccerr, NGTCP2_CCERR_TYPE_DROP_CONN, NGTCP2_NO_ERROR, reason, + reasonlen); + + return; + case NGTCP2_ERR_RETRY: + ccerr_init(ccerr, NGTCP2_CCERR_TYPE_RETRY, NGTCP2_NO_ERROR, reason, + reasonlen); + return; }; ngtcp2_ccerr_set_transport_error( - ccerr, ngtcp2_err_infer_quic_transport_error_code(liberr), reason, - reasonlen); + ccerr, ngtcp2_err_infer_quic_transport_error_code(liberr), reason, + reasonlen); } void ngtcp2_ccerr_set_tls_alert(ngtcp2_ccerr *ccerr, uint8_t tls_alert, @@ -12415,9 +12072,9 @@ void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, } ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - const ngtcp2_ccerr *ccerr, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, const ngtcp2_ccerr *ccerr, + ngtcp2_tstamp ts) { (void)pkt_info_version; conn_update_timestamp(conn, ts); @@ -12425,12 +12082,12 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( switch (ccerr->type) { case NGTCP2_CCERR_TYPE_TRANSPORT: return ngtcp2_conn_write_connection_close_pkt( - conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, - ccerr->reasonlen, ts); + conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, + ccerr->reasonlen, ts); case NGTCP2_CCERR_TYPE_APPLICATION: return ngtcp2_conn_write_application_close_pkt( - conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, - ccerr->reasonlen, ts); + conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, + ccerr->reasonlen, ts); default: return 0; } @@ -12471,7 +12128,7 @@ int ngtcp2_conn_close_stream(ngtcp2_conn *conn, ngtcp2_strm *strm) { int ngtcp2_conn_close_stream_if_shut_rdwr(ngtcp2_conn *conn, ngtcp2_strm *strm) { if ((strm->flags & NGTCP2_STRM_FLAG_SHUT_RDWR) == - NGTCP2_STRM_FLAG_SHUT_RDWR && + NGTCP2_STRM_FLAG_SHUT_RDWR && ((strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED) || ngtcp2_strm_rx_offset(strm) == strm->rx.last_offset) && (((strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM) && @@ -12537,7 +12194,7 @@ static int conn_shutdown_stream_read(ngtcp2_conn *conn, ngtcp2_strm *strm, which are not passed to application. */ if (!(strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED)) { ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); + ngtcp2_strm_rx_offset(strm)); } strm->flags |= NGTCP2_STRM_FLAG_STOP_SENDING; @@ -12720,20 +12377,20 @@ static void conn_discard_early_data_state(ngtcp2_conn *conn) { ngtcp2_rtb_remove_early_data(&conn->pktns.rtb, &conn->cstat); - ngtcp2_map_each_free(&conn->strms, delete_strms_pq_each, conn); + ngtcp2_map_each(&conn->strms, delete_strms_pq_each, conn); ngtcp2_map_clear(&conn->strms); conn->tx.offset = 0; conn->tx.last_blocked_offset = UINT64_MAX; conn->rx.unsent_max_offset = conn->rx.max_offset = - conn->local.transport_params.initial_max_data; + conn->local.transport_params.initial_max_data; conn->remote.bidi.unsent_max_streams = conn->remote.bidi.max_streams = - conn->local.transport_params.initial_max_streams_bidi; + conn->local.transport_params.initial_max_streams_bidi; conn->remote.uni.unsent_max_streams = conn->remote.uni.max_streams = - conn->local.transport_params.initial_max_streams_uni; + conn->local.transport_params.initial_max_streams_uni; if (conn->server) { conn->local.bidi.next_stream_id = 1; @@ -12778,6 +12435,8 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, ngtcp2_duration ack_delay, ngtcp2_tstamp ts) { ngtcp2_conn_stat *cstat = &conn->cstat; + assert(rtt > 0); + if (cstat->min_rtt == UINT64_MAX) { cstat->latest_rtt = rtt; cstat->min_rtt = rtt; @@ -12788,43 +12447,43 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, if (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED) { assert(conn->remote.transport_params); - ack_delay = - ngtcp2_min(ack_delay, conn->remote.transport_params->max_ack_delay); + ack_delay = ngtcp2_min_uint64( + ack_delay, conn->remote.transport_params->max_ack_delay); } else if (ack_delay > 0 && rtt >= cstat->min_rtt && rtt < cstat->min_rtt + ack_delay) { /* Ignore RTT sample if adjusting ack_delay causes the sample less than min_rtt before handshake confirmation. */ ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "ignore rtt sample because ack_delay is too large latest_rtt=%" PRIu64 - " min_rtt=%" PRIu64 " ack_delay=%" PRIu64, - rtt / NGTCP2_MILLISECONDS, cstat->min_rtt / NGTCP2_MILLISECONDS, - ack_delay / NGTCP2_MILLISECONDS); + &conn->log, NGTCP2_LOG_EVENT_LDC, + "ignore rtt sample because ack_delay is too large latest_rtt=%" PRIu64 + " min_rtt=%" PRIu64 " ack_delay=%" PRIu64, + rtt / NGTCP2_MILLISECONDS, cstat->min_rtt / NGTCP2_MILLISECONDS, + ack_delay / NGTCP2_MILLISECONDS); return NGTCP2_ERR_INVALID_ARGUMENT; } cstat->latest_rtt = rtt; - cstat->min_rtt = ngtcp2_min(cstat->min_rtt, rtt); + cstat->min_rtt = ngtcp2_min_uint64(cstat->min_rtt, rtt); if (rtt >= cstat->min_rtt + ack_delay) { rtt -= ack_delay; } cstat->rttvar = (cstat->rttvar * 3 + (cstat->smoothed_rtt < rtt - ? rtt - cstat->smoothed_rtt - : cstat->smoothed_rtt - rtt)) / + ? rtt - cstat->smoothed_rtt + : cstat->smoothed_rtt - rtt)) / 4; cstat->smoothed_rtt = (cstat->smoothed_rtt * 7 + rtt) / 8; } ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "latest_rtt=%" PRIu64 " min_rtt=%" PRIu64 " smoothed_rtt=%" PRIu64 - " rttvar=%" PRIu64 " ack_delay=%" PRIu64, - cstat->latest_rtt / NGTCP2_MILLISECONDS, - cstat->min_rtt / NGTCP2_MILLISECONDS, - cstat->smoothed_rtt / NGTCP2_MILLISECONDS, - cstat->rttvar / NGTCP2_MILLISECONDS, ack_delay / NGTCP2_MILLISECONDS); + &conn->log, NGTCP2_LOG_EVENT_LDC, + "latest_rtt=%" PRIu64 " min_rtt=%" PRIu64 " smoothed_rtt=%" PRIu64 + " rttvar=%" PRIu64 " ack_delay=%" PRIu64, + cstat->latest_rtt / NGTCP2_MILLISECONDS, + cstat->min_rtt / NGTCP2_MILLISECONDS, + cstat->smoothed_rtt / NGTCP2_MILLISECONDS, + cstat->rttvar / NGTCP2_MILLISECONDS, ack_delay / NGTCP2_MILLISECONDS); return 0; } @@ -12873,14 +12532,14 @@ static void conn_get_loss_time_and_pktns(ngtcp2_conn *conn, static ngtcp2_tstamp conn_get_earliest_pto_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { - ngtcp2_pktns *ns[] = {conn->in_pktns, conn->hs_pktns, &conn->pktns}; + ngtcp2_pktns *const ns[] = {conn->in_pktns, conn->hs_pktns, &conn->pktns}; size_t i; ngtcp2_tstamp earliest_ts = UINT64_MAX, t; ngtcp2_conn_stat *cstat = &conn->cstat; ngtcp2_tstamp *times = cstat->last_tx_pkt_ts; ngtcp2_duration duration = - compute_pto(cstat->smoothed_rtt, cstat->rttvar, /* max_ack_delay = */ 0) * - (1ULL << cstat->pto_count); + compute_pto(cstat->smoothed_rtt, cstat->rttvar, /* max_ack_delay = */ 0) * + (1ULL << cstat->pto_count); for (i = NGTCP2_PKTNS_ID_INITIAL; i < NGTCP2_PKTNS_ID_MAX; ++i) { if (ns[i] == NULL || ns[i]->rtb.num_pto_eliciting == 0 || @@ -12939,8 +12598,7 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (cstat->loss_detection_timer != UINT64_MAX) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, "loss detection timer canceled"); - cstat->loss_detection_timer = UINT64_MAX; - cstat->pto_count = 0; + ngtcp2_conn_cancel_loss_detection_timer(conn); } return; } @@ -12948,13 +12606,20 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { cstat->loss_detection_timer = conn_get_earliest_pto_expiry(conn, ts); timeout = - cstat->loss_detection_timer > ts ? cstat->loss_detection_timer - ts : 0; + cstat->loss_detection_timer > ts ? cstat->loss_detection_timer - ts : 0; ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, "loss_detection_timer=%" PRIu64 " timeout=%" PRIu64, cstat->loss_detection_timer, timeout / NGTCP2_MILLISECONDS); } +void ngtcp2_conn_cancel_loss_detection_timer(ngtcp2_conn *conn) { + ngtcp2_conn_stat *cstat = &conn->cstat; + + cstat->loss_detection_timer = UINT64_MAX; + cstat->pto_count = 0; +} + int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_conn_stat *cstat = &conn->cstat; int rv; @@ -12966,8 +12631,7 @@ int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { switch (conn->state) { case NGTCP2_CS_CLOSING: case NGTCP2_CS_DRAINING: - cstat->loss_detection_timer = UINT64_MAX; - cstat->pto_count = 0; + ngtcp2_conn_cancel_loss_detection_timer(conn); return 0; default: break; @@ -13042,7 +12706,8 @@ static int conn_buffer_crypto_data(ngtcp2_conn *conn, const uint8_t **pdata, } if (!*pbufchain) { - rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max(1024, datalen), conn->mem); + rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max_size(1024, datalen), + conn->mem); if (rv != 0) { return rv; } @@ -13125,7 +12790,7 @@ int ngtcp2_conn_submit_new_token(ngtcp2_conn *conn, const uint8_t *token, assert(tokenlen); rv = ngtcp2_frame_chain_new_token_objalloc_new( - &nfrc, token, tokenlen, &conn->frc_objalloc, conn->mem); + &nfrc, token, tokenlen, &conn->frc_objalloc, conn->mem); if (rv != 0) { return rv; } @@ -13186,18 +12851,22 @@ static size_t conn_get_num_active_dcid(ngtcp2_conn *conn) { size_t n = 1; /* for conn->dcid.current */ ngtcp2_pv *pv = conn->pv; + if (conn->dcid.current.cid.datalen == 0) { + return n; + } + if (pv) { if (pv->dcid.seq != conn->dcid.current.seq) { ++n; } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && pv->fallback_dcid.seq != conn->dcid.current.seq && pv->fallback_dcid.seq != pv->dcid.seq) { ++n; } } - n += ngtcp2_ringbuf_len(&conn->dcid.retired.rb); + n += ngtcp2_dcidtr_retired_len(&conn->dcid.dtr); return n; } @@ -13208,7 +12877,7 @@ static void copy_dcid_to_cid_token(ngtcp2_cid_token *dest, dest->cid = src->cid; ngtcp2_path_storage_init2(&dest->ps, &src->ps.path); if ((dest->token_present = - (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) != 0)) { + (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) != 0)) { memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); } } @@ -13230,12 +12899,16 @@ size_t ngtcp2_conn_get_active_dcid(ngtcp2_conn *conn, ngtcp2_cid_token *dest) { copy_dcid_to_cid_token(dest, &conn->dcid.current); ++dest; + if (conn->dcid.current.cid.datalen == 0) { + return 1; + } + if (pv) { if (pv->dcid.seq != conn->dcid.current.seq) { copy_dcid_to_cid_token(dest, &pv->dcid); ++dest; } - if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) && + if ((pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) && pv->fallback_dcid.seq != conn->dcid.current.seq && pv->fallback_dcid.seq != pv->dcid.seq) { copy_dcid_to_cid_token(dest, &pv->fallback_dcid); @@ -13243,9 +12916,9 @@ size_t ngtcp2_conn_get_active_dcid(ngtcp2_conn *conn, ngtcp2_cid_token *dest) { } } - len = ngtcp2_ringbuf_len(&conn->dcid.retired.rb); + len = ngtcp2_ringbuf_len(&conn->dcid.dtr.retired.rb); for (i = 0; i < len; ++i) { - dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, i); + dcid = ngtcp2_ringbuf_get(&conn->dcid.dtr.retired.rb, i); copy_dcid_to_cid_token(dest, dcid); ++dest; } @@ -13290,7 +12963,7 @@ static int conn_initiate_migration_precheck(ngtcp2_conn *conn, return NGTCP2_ERR_INVALID_STATE; } - if (ngtcp2_ringbuf_len(&conn->dcid.unused.rb) == 0) { + if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return NGTCP2_ERR_CONN_ID_BLOCKED; } @@ -13305,7 +12978,7 @@ int ngtcp2_conn_initiate_immediate_migration(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts) { int rv; - ngtcp2_dcid *dcid; + ngtcp2_dcid dcid; ngtcp2_pv *pv; assert(!conn->server); @@ -13326,16 +12999,15 @@ int ngtcp2_conn_initiate_immediate_migration(ngtcp2_conn *conn, } } - rv = conn_retire_dcid(conn, &conn->dcid.current, ts); + rv = conn_retire_active_dcid(conn, &conn->dcid.current, ts); if (rv != 0) { return rv; } - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - ngtcp2_dcid_set_path(dcid, path); + ngtcp2_dcidtr_pop_unused(&conn->dcid.dtr, &dcid); + ngtcp2_dcid_set_path(&dcid, path); - ngtcp2_dcid_copy(&conn->dcid.current, dcid); - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); + ngtcp2_dcid_copy(&conn->dcid.current, &dcid); conn_reset_congestion_state(conn, ts); conn_reset_ecn_validation_state(conn); @@ -13344,7 +13016,7 @@ int ngtcp2_conn_initiate_immediate_migration(ngtcp2_conn *conn, connection should be closed if this path validation failed. The current design allows an application to continue, by migrating into yet another path. */ - rv = ngtcp2_pv_new(&pv, dcid, conn_compute_pv_timeout(conn), + rv = ngtcp2_pv_new(&pv, &dcid, conn_compute_pv_timeout(conn), NGTCP2_PV_FLAG_NONE, &conn->log, conn->mem); if (rv != 0) { return rv; @@ -13358,7 +13030,7 @@ int ngtcp2_conn_initiate_immediate_migration(ngtcp2_conn *conn, int ngtcp2_conn_initiate_migration(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts) { int rv; - ngtcp2_dcid *dcid; + ngtcp2_dcid dcid; ngtcp2_pv *pv; assert(!conn->server); @@ -13377,16 +13049,15 @@ int ngtcp2_conn_initiate_migration(ngtcp2_conn *conn, const ngtcp2_path *path, } } - dcid = ngtcp2_ringbuf_get(&conn->dcid.unused.rb, 0); - ngtcp2_dcid_set_path(dcid, path); + ngtcp2_dcidtr_pop_unused(&conn->dcid.dtr, &dcid); + ngtcp2_dcid_set_path(&dcid, path); - rv = ngtcp2_pv_new(&pv, dcid, conn_compute_pv_timeout(conn), + rv = ngtcp2_pv_new(&pv, &dcid, conn_compute_pv_timeout(conn), NGTCP2_PV_FLAG_NONE, &conn->log, conn->mem); if (rv != 0) { return rv; } - ngtcp2_ringbuf_pop_front(&conn->dcid.unused.rb); conn->pv = pv; return conn_call_activate_dcid(conn, &pv->dcid); @@ -13411,8 +13082,8 @@ uint64_t ngtcp2_conn_get_streams_bidi_left(ngtcp2_conn *conn) { uint64_t n = ngtcp2_ord_stream_id(conn->local.bidi.next_stream_id); return n > conn->local.bidi.max_streams - ? 0 - : conn->local.bidi.max_streams - n + 1; + ? 0 + : conn->local.bidi.max_streams - n + 1; } uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn) { @@ -13424,7 +13095,7 @@ uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn) { uint64_t ngtcp2_conn_get_cwnd_left(ngtcp2_conn *conn) { uint64_t bytes_in_flight = conn->cstat.bytes_in_flight; - uint64_t cwnd = conn_get_cwnd(conn); + uint64_t cwnd = conn->cstat.cwnd; if (cwnd > bytes_in_flight) { return cwnd - bytes_in_flight; @@ -13444,7 +13115,7 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { conn->remote.transport_params->max_idle_timeout == 0 || (conn->local.transport_params.max_idle_timeout && conn->local.transport_params.max_idle_timeout < - conn->remote.transport_params->max_idle_timeout)) { + conn->remote.transport_params->max_idle_timeout)) { idle_timeout = conn->local.transport_params.max_idle_timeout; } else { idle_timeout = conn->remote.transport_params->max_idle_timeout; @@ -13455,10 +13126,10 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { } trpto = 3 * conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + ? &conn->pktns + : conn->hs_pktns); - idle_timeout = ngtcp2_max(idle_timeout, trpto); + idle_timeout = ngtcp2_max_uint64(idle_timeout, trpto); if (conn->idle_ts >= UINT64_MAX - idle_timeout) { return UINT64_MAX; @@ -13469,8 +13140,8 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn) { return conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + ? &conn->pktns + : conn->hs_pktns); } void ngtcp2_conn_set_initial_crypto_ctx(ngtcp2_conn *conn, @@ -13567,7 +13238,7 @@ int ngtcp2_conn_set_stream_user_data(ngtcp2_conn *conn, int64_t stream_id, void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_duration pacing_interval; - ngtcp2_duration wait; + ngtcp2_duration wait, d; conn_update_timestamp(conn, ts); @@ -13581,13 +13252,19 @@ void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { /* 1.25 is the under-utilization avoidance factor described in https://datatracker.ietf.org/doc/html/rfc9002#section-7.7 */ pacing_interval = (conn->cstat.first_rtt_sample_ts == UINT64_MAX - ? NGTCP2_MILLISECONDS - : conn->cstat.smoothed_rtt) * + ? NGTCP2_MILLISECONDS + : conn->cstat.smoothed_rtt) * 100 / 125 / conn->cstat.cwnd; } wait = (ngtcp2_duration)(conn->tx.pacing.pktlen * pacing_interval); + if (conn->tx.pacing.compensation >= NGTCP2_MILLISECONDS) { + d = ngtcp2_min_uint64(wait, conn->tx.pacing.compensation); + wait -= d; + conn->tx.pacing.compensation -= d; + } + conn->tx.pacing.next_ts = ts + wait; conn->tx.pacing.pktlen = 0; } @@ -13596,45 +13273,6 @@ size_t ngtcp2_conn_get_send_quantum(ngtcp2_conn *conn) { return conn->cstat.send_quantum; } -int ngtcp2_conn_track_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { - size_t i; - - if (conn->dcid.retire_unacked.len >= - ngtcp2_arraylen(conn->dcid.retire_unacked.seqs)) { - return NGTCP2_ERR_CONNECTION_ID_LIMIT; - } - - /* Make sure that we do not have a duplicate */ - for (i = 0; i < conn->dcid.retire_unacked.len; ++i) { - if (conn->dcid.retire_unacked.seqs[i] == seq) { - ngtcp2_unreachable(); - } - } - - conn->dcid.retire_unacked.seqs[conn->dcid.retire_unacked.len++] = seq; - - return 0; -} - -void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { - size_t i; - - for (i = 0; i < conn->dcid.retire_unacked.len; ++i) { - if (conn->dcid.retire_unacked.seqs[i] != seq) { - continue; - } - - if (i != conn->dcid.retire_unacked.len - 1) { - conn->dcid.retire_unacked.seqs[i] = - conn->dcid.retire_unacked.seqs[conn->dcid.retire_unacked.len - 1]; - } - - --conn->dcid.retire_unacked.len; - - return; - } -} - size_t ngtcp2_conn_get_stream_loss_count(ngtcp2_conn *conn, int64_t stream_id) { ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); @@ -13652,56 +13290,17 @@ void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, memcpy(pcent->data, data, sizeof(pcent->data)); } -void ngtcp2_settings_default_versioned(int settings_version, - ngtcp2_settings *settings) { - (void)settings_version; - - memset(settings, 0, sizeof(*settings)); - settings->cc_algo = NGTCP2_CC_ALGO_CUBIC; - settings->initial_rtt = NGTCP2_DEFAULT_INITIAL_RTT; - settings->ack_thresh = 2; - settings->max_tx_udp_payload_size = 1500 - 48; - settings->handshake_timeout = UINT64_MAX; -} - -void ngtcp2_transport_params_default_versioned( - int transport_params_version, ngtcp2_transport_params *params) { - size_t len; - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_VERSION: - len = sizeof(*params); - - break; - default: - ngtcp2_unreachable(); - } - - memset(params, 0, len); - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_VERSION: - params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; - params->active_connection_id_limit = - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; - params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; - params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; - - break; - } -} - /* The functions prefixed with ngtcp2_pkt_ are usually put inside ngtcp2_pkt.c. This function uses encryption construct and uses test data defined only in ngtcp2_conn_test.c, so it is written here. */ ngtcp2_ssize ngtcp2_pkt_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, - ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, - const ngtcp2_crypto_cipher_ctx *hp_ctx) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pkt_hd hd; ngtcp2_crypto_km ckm; ngtcp2_crypto_cc cc; @@ -13710,8 +13309,7 @@ ngtcp2_ssize ngtcp2_pkt_write_connection_close( int rv; ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_LONG_FORM, NGTCP2_PKT_INITIAL, dcid, - scid, /* pkt_num = */ 0, /* pkt_numlen = */ 1, version, - /* len = */ 0); + scid, /* pkt_num = */ 0, /* pkt_numlen = */ 1, version); ngtcp2_vec_init(&ckm.secret, NULL, 0); ngtcp2_vec_init(&ckm.iv, iv, 12); @@ -13726,7 +13324,7 @@ ngtcp2_ssize ngtcp2_pkt_write_connection_close( cc.encrypt = encrypt; cc.hp_mask = hp_mask; - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, 0, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { @@ -13740,6 +13338,7 @@ ngtcp2_ssize ngtcp2_pkt_write_connection_close( fr.type = NGTCP2_FRAME_CONNECTION_CLOSE; fr.connection_close.error_code = error_code; + fr.connection_close.frame_type = 0; fr.connection_close.reasonlen = reasonlen; fr.connection_close.reason = (uint8_t *)reason; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h index 4ed67876bc3749..0ba8d6efcc6ac1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -51,6 +51,7 @@ #include "ngtcp2_qlog.h" #include "ngtcp2_rst.h" #include "ngtcp2_conn_stat.h" +#include "ngtcp2_dcidtr.h" typedef enum { /* Client specific handshake states */ @@ -65,9 +66,6 @@ typedef enum { NGTCP2_CS_DRAINING, } ngtcp2_conn_state; -/* NGTCP2_MAX_STREAMS is the maximum number of streams. */ -#define NGTCP2_MAX_STREAMS (1LL << 60) - /* NGTCP2_MAX_NUM_BUFFED_RX_PKTS is the maximum number of buffered reordered packets. */ #define NGTCP2_MAX_NUM_BUFFED_RX_PKTS 4 @@ -77,31 +75,10 @@ typedef enum { unreceived data. */ #define NGTCP2_MAX_REORDERED_CRYPTO_DATA 65536 -/* NGTCP2_MAX_RX_INITIAL_CRYPTO_DATA is the maximum offset of received - crypto stream in Initial packet. We set this hard limit here - because crypto stream is unbounded. */ -#define NGTCP2_MAX_RX_INITIAL_CRYPTO_DATA 65536 -/* NGTCP2_MAX_RX_HANDSHAKE_CRYPTO_DATA is the maximum offset of - received crypto stream in Handshake packet. We set this hard limit - here because crypto stream is unbounded. */ -#define NGTCP2_MAX_RX_HANDSHAKE_CRYPTO_DATA 65536 - /* NGTCP2_MAX_RETRIES is the number of Retry packet which client can accept. */ #define NGTCP2_MAX_RETRIES 3 -/* NGTCP2_MAX_BOUND_DCID_POOL_SIZE is the maximum number of - destination connection ID which have been bound to a particular - path, but not yet used as primary path and path validation is not - performed from the local endpoint. */ -#define NGTCP2_MAX_BOUND_DCID_POOL_SIZE 4 -/* NGTCP2_MAX_DCID_POOL_SIZE is the maximum number of destination - connection ID the remote endpoint provides to store. It must be - the power of 2. */ -#define NGTCP2_MAX_DCID_POOL_SIZE 8 -/* NGTCP2_MAX_DCID_RETIRED_SIZE is the maximum number of retired DCID - kept to catch in-flight packet on retired path. */ -#define NGTCP2_MAX_DCID_RETIRED_SIZE 2 /* NGTCP2_MAX_SCID_POOL_SIZE is the maximum number of source connection ID the local endpoint provides to the remote endpoint. The chosen value was described in old draft. Now a remote endpoint @@ -121,12 +98,18 @@ typedef enum { /* NGTCP2_WRITE_PKT_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_WRITE_PKT_FLAG_NONE 0x00u /* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING indicates that packet other - than Initial packet should be padded. Initial packet might be - padded based on QUIC requirement regardless of this flag. */ + than Initial packet should be padded so that UDP datagram payload + is at least NGTCP2_MAX_UDP_PAYLOAD_SIZE bytes. Initial packet + might be padded based on QUIC requirement regardless of this + flag. */ #define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING 0x01u /* NGTCP2_WRITE_PKT_FLAG_MORE indicates that more frames might come and it should be encoded into the current packet. */ #define NGTCP2_WRITE_PKT_FLAG_MORE 0x02u +/* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL is just like + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING, but it requests to add + padding to the full UDP datagram payload size. */ +#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL 0x04u /* * ngtcp2_max_frame is defined so that it covers the largest ACK @@ -245,11 +228,6 @@ typedef struct ngtcp2_pktns { /* pngap tracks received packet number in order to suppress duplicated packet number. */ ngtcp2_gaptr pngap; - /* max_pkt_num is the largest packet number received so far. */ - int64_t max_pkt_num; - /* max_pkt_ts is the timestamp when max_pkt_num packet is - received. */ - ngtcp2_tstamp max_pkt_ts; /* max_ack_eliciting_pkt_num is the largest ack-eliciting packet number received so far. */ int64_t max_ack_eliciting_pkt_num; @@ -274,21 +252,6 @@ typedef struct ngtcp2_pktns { * ngtcp2_pktns. */ ngtcp2_pkt_chain *buffed_pkts; - - struct { - /* ect0, ect1, and ce are the number of QUIC packets received - with those markings. */ - size_t ect0; - size_t ect1; - size_t ce; - struct { - /* ect0, ect1, ce are the ECN counts received in the latest - ACK frame. */ - uint64_t ect0; - uint64_t ect1; - uint64_t ce; - } ack; - } ecn; } rx; struct { @@ -319,6 +282,7 @@ typedef struct ngtcp2_pktns { ngtcp2_acktr acktr; ngtcp2_rtb rtb; + ngtcp2_pktns_id id; } ngtcp2_pktns; typedef enum ngtcp2_ecn_state { @@ -341,16 +305,10 @@ typedef struct ngtcp2_early_transport_params { uint64_t max_datagram_frame_size; } ngtcp2_early_transport_params; -ngtcp2_static_ringbuf_def(dcid_bound, NGTCP2_MAX_BOUND_DCID_POOL_SIZE, - sizeof(ngtcp2_dcid)); -ngtcp2_static_ringbuf_def(dcid_unused, NGTCP2_MAX_DCID_POOL_SIZE, - sizeof(ngtcp2_dcid)); -ngtcp2_static_ringbuf_def(dcid_retired, NGTCP2_MAX_DCID_RETIRED_SIZE, - sizeof(ngtcp2_dcid)); ngtcp2_static_ringbuf_def(path_challenge, 4, - sizeof(ngtcp2_path_challenge_entry)); + sizeof(ngtcp2_path_challenge_entry)) -ngtcp2_objalloc_decl(strm, ngtcp2_strm, oplent); +ngtcp2_objalloc_decl(strm, ngtcp2_strm, oplent) struct ngtcp2_conn { ngtcp2_objalloc frc_objalloc; @@ -371,6 +329,8 @@ struct ngtcp2_conn { records it in order to verify retry_source_connection_id transport parameter. Server does not use this field. */ ngtcp2_cid retry_scid; + /* hs_local_addr is a local address used during handshake. */ + ngtcp2_sockaddr_union hs_local_addr; ngtcp2_pktns *in_pktns; ngtcp2_pktns *hs_pktns; ngtcp2_pktns pktns; @@ -378,31 +338,13 @@ struct ngtcp2_conn { struct { /* current is the current destination connection ID. */ ngtcp2_dcid current; - /* bound is a set of destination connection IDs which are bound to - particular paths. These paths are not validated yet. */ - ngtcp2_static_ringbuf_dcid_bound bound; - /* unused is a set of unused CID received from peer. */ - ngtcp2_static_ringbuf_dcid_unused unused; - /* retired is a set of CID retired by local endpoint. Keep them - in 3*PTO to catch packets in flight along the old path. */ - ngtcp2_static_ringbuf_dcid_retired retired; + ngtcp2_dcidtr dtr; /* seqgap tracks received sequence numbers in order to ignore retransmitted duplicated NEW_CONNECTION_ID frame. */ ngtcp2_gaptr seqgap; /* retire_prior_to is the largest retire_prior_to received so far. */ uint64_t retire_prior_to; - struct { - /* seqs contains sequence number of Connection ID whose - retirement is not acknowledged by the remote endpoint yet. */ - uint64_t seqs[NGTCP2_MAX_DCID_POOL_SIZE * 2]; - /* len is the number of sequence numbers that seq contains. */ - size_t len; - } retire_unacked; - /* zerolen_seq is a pseudo sequence number of zero-length - Destination Connection ID in order to distinguish between - them. */ - uint64_t zerolen_seq; } dcid; struct { @@ -426,11 +368,6 @@ struct ngtcp2_conn { struct { /* strmq contains ngtcp2_strm which has frames to send. */ ngtcp2_pq strmq; - /* ack is ACK frame. The underlying buffer is reused. */ - ngtcp2_frame *ack; - /* max_ack_ranges is the number of additional ngtcp2_ack_range - which ack can contain. */ - size_t max_ack_ranges; /* offset is the offset the local endpoint has sent to the remote endpoint. */ uint64_t offset; @@ -463,6 +400,15 @@ struct ngtcp2_conn { /* next_ts is the time to send next packet. It is UINT64_MAX if packet pacing is disabled or expired.*/ ngtcp2_tstamp next_ts; + /* compensation is the amount of time that a local endpoint + waits too long for pacing. This happens because there is an + overhead before start writing packets after pacing timer + expires. If multiple QUIC connections are handled by a + single thread, which is typical use case for event loop based + servers, each processing of QUIC connection adds overhead, + for example, TLS handshake, and packet encryption/decryption, + etc. */ + ngtcp2_duration compensation; } pacing; } tx; @@ -483,6 +429,12 @@ struct ngtcp2_conn { ngtcp2_static_ringbuf_path_challenge path_challenge; /* ccerr is the received connection close error. */ ngtcp2_ccerr ccerr; + + struct { + /* pkt_num is the lowest incoming packet number of the packet + that server verified preferred address usage of client. */ + int64_t pkt_num; + } preferred_addr; } rx; struct { @@ -676,6 +628,9 @@ struct ngtcp2_conn { const ngtcp2_mem *mem; /* idle_ts is the time instant when idle timer started. */ ngtcp2_tstamp idle_ts; + /* handshake_confirmed_ts is the time instant when handshake is + confirmed. For server, it is confirmed when completed. */ + ngtcp2_tstamp handshake_confirmed_ts; void *user_data; uint32_t client_chosen_version; uint32_t negotiated_version; @@ -729,21 +684,6 @@ typedef struct ngtcp2_vmsg { }; } ngtcp2_vmsg; -/* - * ngtcp2_conn_sched_ack stores packet number |pkt_num| and its - * reception timestamp |ts| in order to send its ACK. - * - * It returns 0 if it succeeds, or one of the following negative error - * codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory - * NGTCP2_ERR_PROTO - * Same packet number has already been added. - */ -int ngtcp2_conn_sched_ack(ngtcp2_conn *conn, ngtcp2_acktr *acktr, - int64_t pkt_num, int active_ack, ngtcp2_tstamp ts); - /* * ngtcp2_conn_find_stream returns a stream whose stream ID is * |stream_id|. If no such stream is found, it returns NULL. @@ -813,6 +753,8 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts); +void ngtcp2_conn_cancel_loss_detection_timer(ngtcp2_conn *conn); + int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts); /* @@ -878,9 +820,9 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, * User-defined callback function failed. */ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( - ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, - uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, + uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts); /* * ngtcp2_conn_commit_local_transport_params commits the local @@ -973,6 +915,12 @@ int ngtcp2_conn_track_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); */ void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); +/* + * ngtcp2_conn_check_retired_dcid_tracked returns nonzero if |seq| has + * already been tracked. + */ +int ngtcp2_conn_check_retired_dcid_tracked(ngtcp2_conn *conn, uint64_t seq); + /* * ngtcp2_conn_server_negotiate_version negotiates QUIC version. It * is compatible version negotiation. It returns the negotiated QUIC @@ -1020,9 +968,9 @@ ngtcp2_conn_server_negotiate_version(ngtcp2_conn *conn, * User callback failed */ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t error_code, const uint8_t *reason, size_t reasonlen, + ngtcp2_tstamp ts); /** * @function @@ -1066,9 +1014,9 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( * User callback failed */ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t app_error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t app_error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_tstamp ts); int ngtcp2_conn_start_pmtud(ngtcp2_conn *conn); @@ -1093,7 +1041,7 @@ void ngtcp2_conn_stop_pmtud(ngtcp2_conn *conn); * Out of memory. */ int ngtcp2_conn_set_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params); + ngtcp2_conn *conn, const ngtcp2_transport_params *params); /** * @function @@ -1132,28 +1080,18 @@ int ngtcp2_conn_set_remote_transport_params( * Out of memory. */ int ngtcp2_conn_set_0rtt_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params); + ngtcp2_conn *conn, const ngtcp2_transport_params *params); /* - * ngtcp2_conn_create_ack_frame creates ACK frame, and assigns its - * pointer to |*pfr| if there are any received packets to acknowledge. - * If there are no packets to acknowledge, this function returns 0, - * and |*pfr| is untouched. The caller is advised to set |*pfr| to - * NULL before calling this function, and check it after this function - * returns. - * - * Call ngtcp2_acktr_commit_ack after a created ACK frame is - * successfully serialized into a packet. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. + * ngtcp2_conn_discard_initial_state discards state for Initial packet + * number space. + */ +void ngtcp2_conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); + +/* + * ngtcp2_conn_discard_handshake_state discards state for Handshake + * packet number space. */ -int ngtcp2_conn_create_ack_frame(ngtcp2_conn *conn, ngtcp2_frame **pfr, - ngtcp2_pktns *pktns, uint8_t type, - ngtcp2_tstamp ts, ngtcp2_duration ack_delay, - uint64_t ack_delay_exponent); +void ngtcp2_conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); -#endif /* NGTCP2_CONN_H */ +#endif /* !defined(NGTCP2_CONN_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h index 1a93867aab3cae..ad2b7329f48df2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -105,8 +105,9 @@ typedef struct ngtcp2_conn_stat { uint64_t bytes_in_flight; /** * :member:`max_tx_udp_payload_size` is the maximum size of UDP - * datagram payload that this endpoint transmits. It is used by - * congestion controller to compute congestion window. + * datagram payload that this endpoint transmits to the current + * path. It is used by congestion controller to compute congestion + * window. */ size_t max_tx_udp_payload_size; /** @@ -129,4 +130,4 @@ typedef struct ngtcp2_conn_stat { size_t send_quantum; } ngtcp2_conn_stat; -#endif /* NGTCP2_CONN_STAT_H */ +#endif /* !defined(NGTCP2_CONN_STAT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c index 336721772b4e4c..6528011cc0edf4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c @@ -32,47 +32,37 @@ #include "ngtcp2_net.h" #include "ngtcp2_unreachable.h" -const uint8_t *ngtcp2_get_uint64(uint64_t *dest, const uint8_t *p) { - uint64_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohl64(n); - return p + sizeof(n); -} - -const uint8_t *ngtcp2_get_uint48(uint64_t *dest, const uint8_t *p) { - uint64_t n = 0; - memcpy(((uint8_t *)&n) + 2, p, 6); - *dest = ngtcp2_ntohl64(n); - return p + 6; +const uint8_t *ngtcp2_get_uint64be(uint64_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohl64(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint32(uint32_t *dest, const uint8_t *p) { - uint32_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohl(n); - return p + sizeof(n); +const uint8_t *ngtcp2_get_uint32be(uint32_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohl(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint24(uint32_t *dest, const uint8_t *p) { - uint32_t n = 0; - memcpy(((uint8_t *)&n) + 1, p, 3); - *dest = ngtcp2_ntohl(n); +const uint8_t *ngtcp2_get_uint24be(uint32_t *dest, const uint8_t *p) { + *dest = 0; + memcpy(((uint8_t *)dest) + 1, p, 3); + *dest = ngtcp2_ntohl(*dest); return p + 3; } -const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p) { - uint16_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohs(n); - return p + sizeof(n); +const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohs(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p) { +const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p) { memcpy(dest, p, sizeof(*dest)); return p + sizeof(*dest); } -static uint64_t get_uvarint(size_t *plen, const uint8_t *p) { +static const uint8_t *get_uvarint(uint64_t *dest, const uint8_t *p) { union { uint8_t n8; uint16_t n16; @@ -80,42 +70,39 @@ static uint64_t get_uvarint(size_t *plen, const uint8_t *p) { uint64_t n64; } n; - *plen = (size_t)(1u << (*p >> 6)); - - switch (*plen) { + switch (*p >> 6) { + case 0: + *dest = *p++; + return p; case 1: - return *p; - case 2: memcpy(&n, p, 2); n.n8 &= 0x3f; - return ngtcp2_ntohs(n.n16); - case 4: + *dest = ngtcp2_ntohs(n.n16); + + return p + 2; + case 2: memcpy(&n, p, 4); n.n8 &= 0x3f; - return ngtcp2_ntohl(n.n32); - case 8: + *dest = ngtcp2_ntohl(n.n32); + + return p + 4; + case 3: memcpy(&n, p, 8); n.n8 &= 0x3f; - return ngtcp2_ntohl64(n.n64); + *dest = ngtcp2_ntohl64(n.n64); + + return p + 8; default: ngtcp2_unreachable(); } } const uint8_t *ngtcp2_get_uvarint(uint64_t *dest, const uint8_t *p) { - size_t len; - - *dest = get_uvarint(&len, p); - - return p + len; + return get_uvarint(dest, p); } const uint8_t *ngtcp2_get_varint(int64_t *dest, const uint8_t *p) { - size_t len; - - *dest = (int64_t)get_uvarint(&len, p); - - return p + len; + return get_uvarint((uint64_t *)dest, p); } int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen) { @@ -126,13 +113,13 @@ int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen) { case 1: return *p; case 2: - ngtcp2_get_uint16(&s, p); + ngtcp2_get_uint16be(&s, p); return (int64_t)s; case 3: - ngtcp2_get_uint24(&l, p); + ngtcp2_get_uint24be(&l, p); return (int64_t)l; case 4: - ngtcp2_get_uint32(&l, p); + ngtcp2_get_uint32be(&l, p); return (int64_t)l; default: ngtcp2_unreachable(); @@ -144,11 +131,6 @@ uint8_t *ngtcp2_put_uint64be(uint8_t *p, uint64_t n) { return ngtcp2_cpymem(p, (const uint8_t *)&n, sizeof(n)); } -uint8_t *ngtcp2_put_uint48be(uint8_t *p, uint64_t n) { - n = ngtcp2_htonl64(n); - return ngtcp2_cpymem(p, ((const uint8_t *)&n) + 2, 6); -} - uint8_t *ngtcp2_put_uint32be(uint8_t *p, uint32_t n) { n = ngtcp2_htonl(n); return ngtcp2_cpymem(p, (const uint8_t *)&n, sizeof(n)); @@ -207,14 +189,11 @@ uint8_t *ngtcp2_put_pkt_num(uint8_t *p, int64_t pkt_num, size_t len) { *p++ = (uint8_t)pkt_num; return p; case 2: - ngtcp2_put_uint16be(p, (uint16_t)pkt_num); - return p + 2; + return ngtcp2_put_uint16be(p, (uint16_t)pkt_num); case 3: - ngtcp2_put_uint24be(p, (uint32_t)pkt_num); - return p + 3; + return ngtcp2_put_uint24be(p, (uint32_t)pkt_num); case 4: - ngtcp2_put_uint32be(p, (uint32_t)pkt_num); - return p + 4; + return ngtcp2_put_uint32be(p, (uint32_t)pkt_num); default: ngtcp2_unreachable(); } @@ -238,54 +217,6 @@ size_t ngtcp2_put_uvarintlen(uint64_t n) { return 8; } -int64_t ngtcp2_nth_server_bidi_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_SERVER_STREAM_ID_BIDI; - } - - return (int64_t)(((n - 1) << 2) | 0x01); -} - -int64_t ngtcp2_nth_client_bidi_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_CLIENT_STREAM_ID_BIDI; - } - - return (int64_t)((n - 1) << 2); -} - -int64_t ngtcp2_nth_server_uni_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_SERVER_STREAM_ID_UNI; - } - - return (int64_t)(((n - 1) << 2) | 0x03); -} - -int64_t ngtcp2_nth_client_uni_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_CLIENT_STREAM_ID_UNI; - } - - return (int64_t)(((n - 1) << 2) | 0x02); -} - uint64_t ngtcp2_ord_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2) + 1; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h index ef089a971a37f1..ad924683b8dc10 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h @@ -27,51 +27,44 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> /* - * ngtcp2_get_uint64 reads 8 bytes from |p| as 64 bits unsigned + * ngtcp2_get_uint64be reads 8 bytes from |p| as 64 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 8. */ -const uint8_t *ngtcp2_get_uint64(uint64_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint64be(uint64_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint48 reads 6 bytes from |p| as 48 bits unsigned - * integer encoded as network byte order, and stores it in the buffer - * pointed by |dest| in host byte order. It returns |p| + 6. - */ -const uint8_t *ngtcp2_get_uint48(uint64_t *dest, const uint8_t *p); - -/* - * ngtcp2_get_uint32 reads 4 bytes from |p| as 32 bits unsigned + * ngtcp2_get_uint32be reads 4 bytes from |p| as 32 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 4. */ -const uint8_t *ngtcp2_get_uint32(uint32_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint32be(uint32_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint24 reads 3 bytes from |p| as 24 bits unsigned + * ngtcp2_get_uint24be reads 3 bytes from |p| as 24 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 3. */ -const uint8_t *ngtcp2_get_uint24(uint32_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint24be(uint32_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint16 reads 2 bytes from |p| as 16 bits unsigned + * ngtcp2_get_uint16be reads 2 bytes from |p| as 16 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 2. */ -const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint16be reads 2 bytes from |p| as 16 bits unsigned + * ngtcp2_get_uint16 reads 2 bytes from |p| as 16 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| as is. It returns |p| + 2. */ -const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p); /* * ngtcp2_get_uvarint reads variable-length unsigned integer from |p|, @@ -102,13 +95,6 @@ int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen); */ uint8_t *ngtcp2_put_uint64be(uint8_t *p, uint64_t n); -/* - * ngtcp2_put_uint48be writes |n| in host byte order in |p| in network - * byte order. It writes only least significant 48 bits. It returns - * the one beyond of the last written position. - */ -uint8_t *ngtcp2_put_uint48be(uint8_t *p, uint64_t n); - /* * ngtcp2_put_uint32be writes |n| in host byte order in |p| in network * byte order. It returns the one beyond of the last written @@ -168,41 +154,9 @@ size_t ngtcp2_get_uvarintlen(const uint8_t *p); */ size_t ngtcp2_put_uvarintlen(uint64_t n); -/* - * ngtcp2_nth_server_bidi_id returns |n|-th server bidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_SERVER_STREAM_ID_BIDI, this function returns - * NGTCP2_MAX_SERVER_STREAM_ID_BIDI. - */ -int64_t ngtcp2_nth_server_bidi_id(uint64_t n); - -/* - * ngtcp2_nth_client_bidi_id returns |n|-th client bidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_CLIENT_STREAM_ID_BIDI, this function returns - * NGTCP2_MAX_CLIENT_STREAM_ID_BIDI. - */ -int64_t ngtcp2_nth_client_bidi_id(uint64_t n); - -/* - * ngtcp2_nth_server_uni_id returns |n|-th server unidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_SERVER_STREAM_ID_UNI, this function returns - * NGTCP2_MAX_SERVER_STREAM_ID_UNI. - */ -int64_t ngtcp2_nth_server_uni_id(uint64_t n); - -/* - * ngtcp2_nth_client_uni_id returns |n|-th client unidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_CLIENT_STREAM_ID_UNI, this function returns - * NGTCP2_MAX_CLIENT_STREAM_ID_UNI. - */ -int64_t ngtcp2_nth_client_uni_id(uint64_t n); - /* * ngtcp2_ord_stream_id returns the ordinal number of |stream_id|. */ uint64_t ngtcp2_ord_stream_id(int64_t stream_id); -#endif /* NGTCP2_CONV_H */ +#endif /* !defined(NGTCP2_CONV_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c deleted file mode 100644 index eb85687a068449..00000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2023 ngtcp2 contributors - * - * 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. - */ -#include "ngtcp2_conversion.h" - -#include <string.h> -#include <assert.h> - -static void transport_params_copy(int transport_params_version, - ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src) { - assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_V1: - memcpy(dest, src, - offsetof(ngtcp2_transport_params, version_info_present) + - sizeof(src->version_info_present)); - - break; - } -} - -const ngtcp2_transport_params * -ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, - int transport_params_version, - const ngtcp2_transport_params *src) { - if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { - return src; - } - - ngtcp2_transport_params_default(dest); - - transport_params_copy(transport_params_version, dest, src); - - return dest; -} - -void ngtcp2_transport_params_convert_to_old( - int transport_params_version, ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src) { - assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); - - transport_params_copy(transport_params_version, dest, src); -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h deleted file mode 100644 index 3457a8f2053aba..00000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2023 ngtcp2 contributors - * - * 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. - */ -#ifndef NGTCP2_CONVERSION_H -#define NGTCP2_CONVERSION_H - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif /* HAVE_CONFIG_H */ - -#include <ngtcp2/ngtcp2.h> - -/* - * ngtcp2_transport_params_convert_to_latest converts |src| of version - * |transport_params_version| to the latest version - * NGTCP2_TRANSPORT_PARAMS_VERSION. - * - * |dest| must point to the latest version. |src| may be the older - * version, and if so, it may have fewer fields. Accessing those - * fields causes undefined behavior. - * - * If |transport_params_version| == NGTCP2_TRANSPORT_PARAMS_VERSION, - * no conversion is made, and |src| is returned. Otherwise, first - * |dest| is initialized via ngtcp2_transport_params_default, and then - * all valid fields in |src| are copied into |dest|. Finally, |dest| - * is returned. - */ -const ngtcp2_transport_params * -ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, - int transport_params_version, - const ngtcp2_transport_params *src); - -/* - * ngtcp2_transport_params_convert_to_old converts |src| of the latest - * version to |dest| of version |transport_params_version|. - * - * |transport_params_version| must not be the latest version - * NGTCP2_TRANSPORT_PARAMS_VERSION. - * - * |dest| points to the older version, and it may have fewer fields. - * Accessing those fields causes undefined behavior. - * - * This function copies all valid fields in version - * |transport_params_version| from |src| to |dest|. - */ -void ngtcp2_transport_params_convert_to_old(int transport_params_version, - ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src); - -#endif /* NGTCP2_CONVERSION_H */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c index 0a3ecf6a2440cb..1f74e8c58397b1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c @@ -27,11 +27,7 @@ #include <string.h> #include <assert.h> -#include "ngtcp2_str.h" -#include "ngtcp2_conv.h" -#include "ngtcp2_conn.h" #include "ngtcp2_net.h" -#include "ngtcp2_conversion.h" int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, size_t secretlen, @@ -46,9 +42,11 @@ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, if (secretlen) { memcpy((*pckm)->secret.base, secret, secretlen); } + if (aead_ctx) { (*pckm)->aead_ctx = *aead_ctx; } + memcpy((*pckm)->iv.base, iv, ivlen); return 0; @@ -85,825 +83,30 @@ void ngtcp2_crypto_km_del(ngtcp2_crypto_km *ckm, const ngtcp2_mem *mem) { return; } + if (ckm->secret.len) { +#ifdef WIN32 + SecureZeroMemory(ckm->secret.base, ckm->secret.len); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(ckm->secret.base, ckm->secret.len); +#elif defined(HAVE_MEMSET_S) + memset_s(ckm->secret.base, ckm->secret.len, 0, ckm->secret.len); +#endif /* defined(HAVE_MEMSET_S) */ + } + ngtcp2_mem_free(mem, ckm); } void ngtcp2_crypto_create_nonce(uint8_t *dest, const uint8_t *iv, size_t ivlen, int64_t pkt_num) { - size_t i; uint64_t n; - assert(ivlen >= 8); + assert(ivlen >= sizeof(n)); memcpy(dest, iv, ivlen); - n = ngtcp2_htonl64((uint64_t)pkt_num); - - for (i = 0; i < 8; ++i) { - dest[ivlen - 8 + i] ^= ((uint8_t *)&n)[i]; - } -} - -/* - * varint_paramlen returns the length of a single transport parameter - * which has variable integer in its parameter. - */ -static size_t varint_paramlen(ngtcp2_transport_param_id id, uint64_t param) { - size_t valuelen = ngtcp2_put_uvarintlen(param); - return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(valuelen) + valuelen; -} - -/* - * write_varint_param writes parameter |id| of the given |value| in - * varint encoding. It returns p + the number of bytes written. - */ -static uint8_t *write_varint_param(uint8_t *p, ngtcp2_transport_param_id id, - uint64_t value) { - p = ngtcp2_put_uvarint(p, id); - p = ngtcp2_put_uvarint(p, ngtcp2_put_uvarintlen(value)); - return ngtcp2_put_uvarint(p, value); -} - -/* - * zero_paramlen returns the length of a single transport parameter - * which has zero length value in its parameter. - */ -static size_t zero_paramlen(ngtcp2_transport_param_id id) { - return ngtcp2_put_uvarintlen(id) + 1; -} - -/* - * write_zero_param writes parameter |id| that has zero length value. - * It returns p + the number of bytes written. - */ -static uint8_t *write_zero_param(uint8_t *p, ngtcp2_transport_param_id id) { - p = ngtcp2_put_uvarint(p, id); - *p++ = 0; - - return p; -} - -/* - * cid_paramlen returns the length of a single transport parameter - * which has |cid| as value. - */ -static size_t cid_paramlen(ngtcp2_transport_param_id id, - const ngtcp2_cid *cid) { - return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(cid->datalen) + - cid->datalen; -} - -/* - * write_cid_param writes parameter |id| of the given |cid|. It - * returns p + the number of bytes written. - */ -static uint8_t *write_cid_param(uint8_t *p, ngtcp2_transport_param_id id, - const ngtcp2_cid *cid) { - assert(cid->datalen == 0 || cid->datalen >= NGTCP2_MIN_CIDLEN); - assert(cid->datalen <= NGTCP2_MAX_CIDLEN); - - p = ngtcp2_put_uvarint(p, id); - p = ngtcp2_put_uvarint(p, cid->datalen); - if (cid->datalen) { - p = ngtcp2_cpymem(p, cid->data, cid->datalen); - } - return p; -} - -static const uint8_t empty_address[16]; - -ngtcp2_ssize ngtcp2_transport_params_encode_versioned( - uint8_t *dest, size_t destlen, int transport_params_version, - const ngtcp2_transport_params *params) { - uint8_t *p; - size_t len = 0; - /* For some reason, gcc 7.3.0 requires this initialization. */ - size_t preferred_addrlen = 0; - size_t version_infolen = 0; - const ngtcp2_sockaddr_in *sa_in; - const ngtcp2_sockaddr_in6 *sa_in6; - ngtcp2_transport_params paramsbuf; - - params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); - - if (params->original_dcid_present) { - len += - cid_paramlen(NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, - ¶ms->original_dcid); - } - - if (params->stateless_reset_token_present) { - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN) + - ngtcp2_put_uvarintlen(NGTCP2_STATELESS_RESET_TOKENLEN) + - NGTCP2_STATELESS_RESET_TOKENLEN; - } - - if (params->preferred_addr_present) { - assert(params->preferred_addr.cid.datalen >= NGTCP2_MIN_CIDLEN); - assert(params->preferred_addr.cid.datalen <= NGTCP2_MAX_CIDLEN); - preferred_addrlen = 4 /* ipv4Address */ + 2 /* ipv4Port */ + - 16 /* ipv6Address */ + 2 /* ipv6Port */ - + 1 + params->preferred_addr.cid.datalen /* CID */ + - NGTCP2_STATELESS_RESET_TOKENLEN; - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS) + - ngtcp2_put_uvarintlen(preferred_addrlen) + preferred_addrlen; - } - if (params->retry_scid_present) { - len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, - ¶ms->retry_scid); - } - - if (params->initial_scid_present) { - len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, - ¶ms->initial_scid); - } - - if (params->initial_max_stream_data_bidi_local) { - len += varint_paramlen( - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - params->initial_max_stream_data_bidi_local); - } - if (params->initial_max_stream_data_bidi_remote) { - len += varint_paramlen( - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - params->initial_max_stream_data_bidi_remote); - } - if (params->initial_max_stream_data_uni) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, - params->initial_max_stream_data_uni); - } - if (params->initial_max_data) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, - params->initial_max_data); - } - if (params->initial_max_streams_bidi) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, - params->initial_max_streams_bidi); - } - if (params->initial_max_streams_uni) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, - params->initial_max_streams_uni); - } - if (params->max_udp_payload_size != - NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, - params->max_udp_payload_size); - } - if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, - params->ack_delay_exponent); - } - if (params->disable_active_migration) { - len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); - } - if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, - params->max_ack_delay / NGTCP2_MILLISECONDS); - } - if (params->max_idle_timeout) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, - params->max_idle_timeout / NGTCP2_MILLISECONDS); - } - if (params->active_connection_id_limit && - params->active_connection_id_limit != - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); - } - if (params->max_datagram_frame_size) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, - params->max_datagram_frame_size); - } - if (params->grease_quic_bit) { - len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); - } - if (params->version_info_present) { - version_infolen = - sizeof(uint32_t) + params->version_info.available_versionslen; - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION) + - ngtcp2_put_uvarintlen(version_infolen) + version_infolen; - } - - if (dest == NULL && destlen == 0) { - return (ngtcp2_ssize)len; - } - - if (destlen < len) { - return NGTCP2_ERR_NOBUF; - } - - p = dest; - - if (params->original_dcid_present) { - p = write_cid_param( - p, NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, - ¶ms->original_dcid); - } - - if (params->stateless_reset_token_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN); - p = ngtcp2_put_uvarint(p, sizeof(params->stateless_reset_token)); - p = ngtcp2_cpymem(p, params->stateless_reset_token, - sizeof(params->stateless_reset_token)); - } - - if (params->preferred_addr_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS); - p = ngtcp2_put_uvarint(p, preferred_addrlen); - - if (params->preferred_addr.ipv4_present) { - sa_in = ¶ms->preferred_addr.ipv4; - p = ngtcp2_cpymem(p, &sa_in->sin_addr, sizeof(sa_in->sin_addr)); - p = ngtcp2_put_uint16(p, sa_in->sin_port); - } else { - p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in->sin_addr)); - p = ngtcp2_put_uint16(p, 0); - } - - if (params->preferred_addr.ipv6_present) { - sa_in6 = ¶ms->preferred_addr.ipv6; - p = ngtcp2_cpymem(p, &sa_in6->sin6_addr, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_put_uint16(p, sa_in6->sin6_port); - } else { - p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_put_uint16(p, 0); - } - - *p++ = (uint8_t)params->preferred_addr.cid.datalen; - if (params->preferred_addr.cid.datalen) { - p = ngtcp2_cpymem(p, params->preferred_addr.cid.data, - params->preferred_addr.cid.datalen); - } - p = ngtcp2_cpymem(p, params->preferred_addr.stateless_reset_token, - sizeof(params->preferred_addr.stateless_reset_token)); - } - - if (params->retry_scid_present) { - p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, - ¶ms->retry_scid); - } - - if (params->initial_scid_present) { - p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, - ¶ms->initial_scid); - } - - if (params->initial_max_stream_data_bidi_local) { - p = write_varint_param( - p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - params->initial_max_stream_data_bidi_local); - } - - if (params->initial_max_stream_data_bidi_remote) { - p = write_varint_param( - p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - params->initial_max_stream_data_bidi_remote); - } - - if (params->initial_max_stream_data_uni) { - p = write_varint_param(p, - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, - params->initial_max_stream_data_uni); - } - - if (params->initial_max_data) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, - params->initial_max_data); - } - - if (params->initial_max_streams_bidi) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, - params->initial_max_streams_bidi); - } - - if (params->initial_max_streams_uni) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, - params->initial_max_streams_uni); - } - - if (params->max_udp_payload_size != - NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, - params->max_udp_payload_size); - } - - if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, - params->ack_delay_exponent); - } - - if (params->disable_active_migration) { - p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); - } - - if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, - params->max_ack_delay / NGTCP2_MILLISECONDS); - } - - if (params->max_idle_timeout) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, - params->max_idle_timeout / NGTCP2_MILLISECONDS); - } - - if (params->active_connection_id_limit && - params->active_connection_id_limit != - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); - } - - if (params->max_datagram_frame_size) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, - params->max_datagram_frame_size); - } - - if (params->grease_quic_bit) { - p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); - } - - if (params->version_info_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION); - p = ngtcp2_put_uvarint(p, version_infolen); - p = ngtcp2_put_uint32be(p, params->version_info.chosen_version); - if (params->version_info.available_versionslen) { - p = ngtcp2_cpymem(p, params->version_info.available_versions, - params->version_info.available_versionslen); - } - } - - assert((size_t)(p - dest) == len); - - return (ngtcp2_ssize)len; -} - -/* - * decode_varint decodes a single varint from the buffer pointed by - * |*pp| of length |end - *pp|. If it decodes an integer - * successfully, it stores the integer in |*pdest|, increment |*pp| by - * the number of bytes read from |*pp|, and returns 0. Otherwise it - * returns -1. - */ -static int decode_varint(uint64_t *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - size_t len; - - if (p == end) { - return -1; - } - - len = ngtcp2_get_uvarintlen(p); - if ((uint64_t)(end - p) < len) { - return -1; - } - - *pp = ngtcp2_get_uvarint(pdest, p); - - return 0; -} - -/* - * decode_varint_param decodes length prefixed value from the buffer - * pointed by |*pp| of length |end - *pp|. The length and value are - * encoded in varint form. If it decodes a value successfully, it - * stores the value in |*pdest|, increment |*pp| by the number of - * bytes read from |*pp|, and returns 0. Otherwise it returns -1. - */ -static int decode_varint_param(uint64_t *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - uint64_t valuelen; - - if (decode_varint(&valuelen, &p, end) != 0) { - return -1; - } - - if (p == end) { - return -1; - } - - if ((uint64_t)(end - p) < valuelen) { - return -1; - } - - if (ngtcp2_get_uvarintlen(p) != valuelen) { - return -1; - } - - *pp = ngtcp2_get_uvarint(pdest, p); - - return 0; -} - -/* - * decode_zero_param decodes zero length value from the buffer pointed - * by |*pp| of length |end - *pp|. The length is encoded in varint - * form. If it decodes zero length value successfully, it increments - * |*pp| by 1, and returns 0. Otherwise it returns -1. - */ -static int decode_zero_param(const uint8_t **pp, const uint8_t *end) { - if (*pp == end || **pp != 0) { - return -1; - } - - ++*pp; - - return 0; -} - -/* - * decode_cid_param decodes length prefixed ngtcp2_cid from the buffer - * pointed by |*pp| of length |end - *pp|. The length is encoded in - * varint form. If it decodes a value successfully, it stores the - * value in |*pdest|, increment |*pp| by the number of read from - * |*pp|, and returns the number of bytes read. Otherwise it returns - * the one of the negative error code: - * - * NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM - * Could not decode Connection ID. - */ -static int decode_cid_param(ngtcp2_cid *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - uint64_t valuelen; - - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - if ((valuelen != 0 && valuelen < NGTCP2_MIN_CIDLEN) || - valuelen > NGTCP2_MAX_CIDLEN || (size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - ngtcp2_cid_init(pdest, p, (size_t)valuelen); - - p += valuelen; - - *pp = p; - - return 0; -} - -int ngtcp2_transport_params_decode_versioned(int transport_params_version, - ngtcp2_transport_params *dest, - const uint8_t *data, - size_t datalen) { - const uint8_t *p, *end, *lend; - size_t len; - uint64_t param_type; - uint64_t valuelen; - int rv; - ngtcp2_sockaddr_in *sa_in; - ngtcp2_sockaddr_in6 *sa_in6; - uint32_t version; - ngtcp2_transport_params *params, paramsbuf; - if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { - params = dest; - } else { - params = ¶msbuf; - } - - /* Set default values */ - memset(params, 0, sizeof(*params)); - params->original_dcid_present = 0; - params->initial_scid_present = 0; - params->initial_max_streams_bidi = 0; - params->initial_max_streams_uni = 0; - params->initial_max_stream_data_bidi_local = 0; - params->initial_max_stream_data_bidi_remote = 0; - params->initial_max_stream_data_uni = 0; - params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; - params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; - params->stateless_reset_token_present = 0; - params->preferred_addr_present = 0; - params->disable_active_migration = 0; - params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; - params->max_idle_timeout = 0; - params->active_connection_id_limit = - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; - params->retry_scid_present = 0; - params->max_datagram_frame_size = 0; - memset(¶ms->retry_scid, 0, sizeof(params->retry_scid)); - memset(¶ms->initial_scid, 0, sizeof(params->initial_scid)); - memset(¶ms->original_dcid, 0, sizeof(params->original_dcid)); - params->version_info_present = 0; - - p = data; - end = data + datalen; - - for (; (size_t)(end - p) >= 2;) { - if (decode_varint(¶m_type, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - switch (param_type) { - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: - if (decode_varint_param(¶ms->initial_max_stream_data_bidi_local, &p, - end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: - if (decode_varint_param(¶ms->initial_max_stream_data_bidi_remote, &p, - end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI: - if (decode_varint_param(¶ms->initial_max_stream_data_uni, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA: - if (decode_varint_param(¶ms->initial_max_data, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI: - if (decode_varint_param(¶ms->initial_max_streams_bidi, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->initial_max_streams_bidi > NGTCP2_MAX_STREAMS) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI: - if (decode_varint_param(¶ms->initial_max_streams_uni, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->initial_max_streams_uni > NGTCP2_MAX_STREAMS) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT: - if (decode_varint_param(¶ms->max_idle_timeout, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->max_idle_timeout *= NGTCP2_MILLISECONDS; - break; - case NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE: - if (decode_varint_param(¶ms->max_udp_payload_size, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)valuelen != sizeof(params->stateless_reset_token)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < sizeof(params->stateless_reset_token)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - p = ngtcp2_get_bytes(params->stateless_reset_token, p, - sizeof(params->stateless_reset_token)); - params->stateless_reset_token_present = 1; - - break; - case NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT: - if (decode_varint_param(¶ms->ack_delay_exponent, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->ack_delay_exponent > 20) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - len = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + - 2 /* ipv6Port */ - + 1 /* cid length */ + NGTCP2_STATELESS_RESET_TOKENLEN; - if (valuelen < len) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - sa_in = ¶ms->preferred_addr.ipv4; - - p = ngtcp2_get_bytes(&sa_in->sin_addr, p, sizeof(sa_in->sin_addr)); - p = ngtcp2_get_uint16be(&sa_in->sin_port, p); - - if (sa_in->sin_port || memcmp(empty_address, &sa_in->sin_addr, - sizeof(sa_in->sin_addr)) != 0) { - sa_in->sin_family = NGTCP2_AF_INET; - params->preferred_addr.ipv4_present = 1; - } - - sa_in6 = ¶ms->preferred_addr.ipv6; - - p = ngtcp2_get_bytes(&sa_in6->sin6_addr, p, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_get_uint16be(&sa_in6->sin6_port, p); - - if (sa_in6->sin6_port || memcmp(empty_address, &sa_in6->sin6_addr, - sizeof(sa_in6->sin6_addr)) != 0) { - sa_in6->sin6_family = NGTCP2_AF_INET6; - params->preferred_addr.ipv6_present = 1; - } - - /* cid */ - params->preferred_addr.cid.datalen = *p++; - len += params->preferred_addr.cid.datalen; - if (valuelen != len || - params->preferred_addr.cid.datalen > NGTCP2_MAX_CIDLEN || - params->preferred_addr.cid.datalen < NGTCP2_MIN_CIDLEN) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->preferred_addr.cid.datalen) { - p = ngtcp2_get_bytes(params->preferred_addr.cid.data, p, - params->preferred_addr.cid.datalen); - } - - /* stateless reset token */ - p = ngtcp2_get_bytes( - params->preferred_addr.stateless_reset_token, p, - sizeof(params->preferred_addr.stateless_reset_token)); - params->preferred_addr_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION: - if (decode_zero_param(&p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->disable_active_migration = 1; - break; - case NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID: - rv = decode_cid_param(¶ms->original_dcid, &p, end); - if (rv != 0) { - return rv; - } - params->original_dcid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID: - rv = decode_cid_param(¶ms->retry_scid, &p, end); - if (rv != 0) { - return rv; - } - params->retry_scid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID: - rv = decode_cid_param(¶ms->initial_scid, &p, end); - if (rv != 0) { - return rv; - } - params->initial_scid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY: - if (decode_varint_param(¶ms->max_ack_delay, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->max_ack_delay >= 16384) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->max_ack_delay *= NGTCP2_MILLISECONDS; - break; - case NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT: - if (decode_varint_param(¶ms->active_connection_id_limit, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE: - if (decode_varint_param(¶ms->max_datagram_frame_size, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT: - if (decode_zero_param(&p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->grease_quic_bit = 1; - break; - case NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (valuelen < sizeof(uint32_t) || (valuelen & 0x3)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - p = ngtcp2_get_uint32(¶ms->version_info.chosen_version, p); - if (params->version_info.chosen_version == 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (valuelen > sizeof(uint32_t)) { - params->version_info.available_versions = (uint8_t *)p; - params->version_info.available_versionslen = - (size_t)valuelen - sizeof(uint32_t); - - for (lend = p + (valuelen - sizeof(uint32_t)); p != lend;) { - p = ngtcp2_get_uint32(&version, p); - if (version == 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - } - } - params->version_info_present = 1; - break; - default: - /* Ignore unknown parameter */ - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - p += valuelen; - break; - } - } - - if (end - p != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - if (transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION) { - ngtcp2_transport_params_convert_to_old(transport_params_version, dest, - params); - } - - return 0; -} - -static int transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem) { - size_t len = sizeof(**pdest); - ngtcp2_transport_params *dest; - uint8_t *p; - - if (src->version_info_present) { - len += src->version_info.available_versionslen; - } - - dest = ngtcp2_mem_malloc(mem, len); - if (dest == NULL) { - return NGTCP2_ERR_NOMEM; - } - - *dest = *src; - - if (src->version_info_present && src->version_info.available_versionslen) { - p = (uint8_t *)dest + sizeof(*dest); - memcpy(p, src->version_info.available_versions, - src->version_info.available_versionslen); - dest->version_info.available_versions = p; - } - - *pdest = dest; - - return 0; -} - -int ngtcp2_transport_params_decode_new(ngtcp2_transport_params **pparams, - const uint8_t *data, size_t datalen, - const ngtcp2_mem *mem) { - int rv; - ngtcp2_transport_params params; - - rv = ngtcp2_transport_params_decode(¶ms, data, datalen); - if (rv < 0) { - return rv; - } - - if (mem == NULL) { - mem = ngtcp2_mem_default(); - } - - return transport_params_copy_new(pparams, ¶ms, mem); -} - -void ngtcp2_transport_params_del(ngtcp2_transport_params *params, - const ngtcp2_mem *mem) { - if (params == NULL) { - return; - } - - if (mem == NULL) { - mem = ngtcp2_mem_default(); - } - - ngtcp2_mem_free(mem, params); -} - -int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem) { - if (src == NULL) { - *pdest = NULL; - return 0; - } + dest += ivlen - sizeof(n); - return transport_params_copy_new(pdest, src, mem); + memcpy(&n, dest, sizeof(n)); + n ^= ngtcp2_htonl64((uint64_t)pkt_num); + memcpy(dest, &n, sizeof(n)); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h index b78429bb38f582..ca6d494846f324 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -38,36 +38,9 @@ bytes. */ #define NGTCP2_INITIAL_AEAD_OVERHEAD 16 -/* NGTCP2_MAX_AEAD_OVERHEAD is expected maximum AEAD overhead. */ +/* NGTCP2_MAX_AEAD_OVERHEAD is the maximum AEAD overhead. */ #define NGTCP2_MAX_AEAD_OVERHEAD 16 -/* ngtcp2_transport_param_id is the registry of QUIC transport - parameter ID. */ -typedef uint64_t ngtcp2_transport_param_id; - -#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00 -#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01 -#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02 -#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09 -#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0a -#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0b -#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0c -#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0d -#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0e -#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0f -#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10 -/* https://datatracker.ietf.org/doc/html/rfc9221 */ -#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20 -#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2ab2 -/* https://datatracker.ietf.org/doc/html/rfc9368 */ -#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11 - /* NGTCP2_CRYPTO_KM_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_CRYPTO_KM_FLAG_NONE 0x00u /* NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE is set if key phase bit is @@ -83,8 +56,7 @@ typedef struct ngtcp2_crypto_km { a packet. For decryption key, it is the lowest packet number of a packet which can be decrypted with this keying material. */ int64_t pkt_num; - /* use_count is the number of encryption applied with this key. - This field is only used for tx key. */ + /* use_count is the number of encryption applied with this key. */ uint64_t use_count; /* flags is the bitwise OR of zero or more of NGTCP2_CRYPTO_KM_FLAG_*. */ @@ -92,12 +64,12 @@ typedef struct ngtcp2_crypto_km { } ngtcp2_crypto_km; /* - * ngtcp2_crypto_km_new creates new ngtcp2_crypto_km object and + * ngtcp2_crypto_km_new creates new ngtcp2_crypto_km object, and * assigns its pointer to |*pckm|. The |secret| of length - * |secretlen|, the |key| of length |keylen| and the |iv| of length - * |ivlen| are copied to |*pckm|. If |secretlen| == 0, the function - * assumes no secret is given which is acceptable. The sole reason to - * store secret is update keys. Only 1RTT key can be updated. + * |secretlen|, |aead_ctx|, and the |iv| of length |ivlen| are copied + * to |*pckm|. If |secretlen| == 0, the function assumes no secret is + * given which is acceptable. The sole reason to store secret is + * update keys. Only 1RTT key can be updated. */ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, size_t secretlen, @@ -107,7 +79,7 @@ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, /* * ngtcp2_crypto_km_nocopy_new is similar to ngtcp2_crypto_km_new, but - * it does not copy secret, key and IV. + * it does not copy secret, aead context, and IV. */ int ngtcp2_crypto_km_nocopy_new(ngtcp2_crypto_km **pckm, size_t secretlen, size_t ivlen, const ngtcp2_mem *mem); @@ -127,21 +99,4 @@ typedef struct ngtcp2_crypto_cc { void ngtcp2_crypto_create_nonce(uint8_t *dest, const uint8_t *iv, size_t ivlen, int64_t pkt_num); -/* - * ngtcp2_transport_params_copy_new makes a copy of |src|, and assigns - * it to |*pdest|. If |src| is NULL, NULL is assigned to |*pdest|. - * - * Caller is responsible to call ngtcp2_transport_params_del to free - * the memory assigned to |*pdest|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem); - -#endif /* NGTCP2_CRYPTO_H */ +#endif /* !defined(NGTCP2_CRYPTO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c new file mode 100644 index 00000000000000..8a8d7733797176 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c @@ -0,0 +1,497 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * 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. + */ +#include "ngtcp2_dcidtr.h" + +#include <assert.h> + +#include "ngtcp2_tstamp.h" +#include "ngtcp2_macro.h" + +void ngtcp2_dcidtr_init(ngtcp2_dcidtr *dtr) { + ngtcp2_static_ringbuf_dcid_unused_init(&dtr->unused); + ngtcp2_static_ringbuf_dcid_bound_init(&dtr->bound); + ngtcp2_static_ringbuf_dcid_retired_init(&dtr->retired); + + dtr->retire_unacked.len = 0; +} + +int ngtcp2_dcidtr_track_retired_seq(ngtcp2_dcidtr *dtr, uint64_t seq) { + if (dtr->retire_unacked.len >= ngtcp2_arraylen(dtr->retire_unacked.seqs)) { + return NGTCP2_ERR_CONNECTION_ID_LIMIT; + } + + dtr->retire_unacked.seqs[dtr->retire_unacked.len++] = seq; + + return 0; +} + +void ngtcp2_dcidtr_untrack_retired_seq(ngtcp2_dcidtr *dtr, uint64_t seq) { + size_t i; + + for (i = 0; i < dtr->retire_unacked.len; ++i) { + if (dtr->retire_unacked.seqs[i] != seq) { + continue; + } + + if (i != dtr->retire_unacked.len - 1) { + dtr->retire_unacked.seqs[i] = + dtr->retire_unacked.seqs[dtr->retire_unacked.len - 1]; + } + + --dtr->retire_unacked.len; + + return; + } +} + +int ngtcp2_dcidtr_check_retired_seq_tracked(const ngtcp2_dcidtr *dtr, + uint64_t seq) { + size_t i; + + for (i = 0; i < dtr->retire_unacked.len; ++i) { + if (dtr->retire_unacked.seqs[i] == seq) { + return 1; + } + } + + return 0; +} + +static int dcidtr_on_retire(ngtcp2_dcidtr *dtr, const ngtcp2_dcid *dcid, + ngtcp2_dcidtr_cb on_retire, void *user_data) { + int rv; + + if (ngtcp2_dcidtr_check_retired_seq_tracked(dtr, dcid->seq)) { + return 0; + } + + rv = ngtcp2_dcidtr_track_retired_seq(dtr, dcid->seq); + if (rv != 0) { + return rv; + } + + if (!on_retire) { + return 0; + } + + return on_retire(dcid, user_data); +} + +ngtcp2_dcid *ngtcp2_dcidtr_find_bound_dcid(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path) { + ngtcp2_dcid *dcid; + const ngtcp2_ringbuf *rb = &dtr->bound.rb; + size_t i, len = ngtcp2_ringbuf_len(rb); + + for (i = 0; i < len; ++i) { + dcid = ngtcp2_ringbuf_get(rb, i); + + if (ngtcp2_path_eq(&dcid->ps.path, path)) { + return dcid; + } + } + + return NULL; +} + +ngtcp2_dcid *ngtcp2_dcidtr_bind_zerolen_dcid(ngtcp2_dcidtr *dtr, + const ngtcp2_path *path) { + ngtcp2_dcid *dcid = ngtcp2_ringbuf_push_back(&dtr->bound.rb); + ngtcp2_cid cid; + + ngtcp2_cid_zero(&cid); + ngtcp2_dcid_init(dcid, 0, &cid, NULL); + ngtcp2_dcid_set_path(dcid, path); + + return dcid; +} + +int ngtcp2_dcidtr_bind_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid **pdest, + const ngtcp2_path *path, ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_retire, void *user_data) { + const ngtcp2_dcid *src; + ngtcp2_dcid *dest; + int rv; + + if (ngtcp2_ringbuf_full(&dtr->bound.rb)) { + rv = dcidtr_on_retire(dtr, ngtcp2_ringbuf_get(&dtr->bound.rb, 0), on_retire, + user_data); + if (rv != 0) { + return rv; + } + } + + src = ngtcp2_ringbuf_get(&dtr->unused.rb, 0); + dest = ngtcp2_ringbuf_push_back(&dtr->bound.rb); + + ngtcp2_dcid_copy(dest, src); + dest->bound_ts = ts; + ngtcp2_dcid_set_path(dest, path); + + ngtcp2_ringbuf_pop_front(&dtr->unused.rb); + + *pdest = dest; + + return 0; +} + +static int verify_stateless_reset(const ngtcp2_ringbuf *rb, + const ngtcp2_path *path, + const uint8_t *token) { + const ngtcp2_dcid *dcid; + size_t i, len = ngtcp2_ringbuf_len(rb); + + for (i = 0; i < len; ++i) { + dcid = ngtcp2_ringbuf_get(rb, i); + if (ngtcp2_dcid_verify_stateless_reset_token(dcid, path, token) == 0) { + return 0; + } + } + + return NGTCP2_ERR_INVALID_ARGUMENT; +} + +int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path, + const uint8_t *token) { + int rv; + + rv = verify_stateless_reset(&dtr->retired.rb, path, token); + if (rv == 0) { + return 0; + } + + return verify_stateless_reset(&dtr->bound.rb, path, token); +} + +static int verify_token_uniqueness(const ngtcp2_ringbuf *rb, int *pfound, + uint64_t seq, const ngtcp2_cid *cid, + const uint8_t *token) { + const ngtcp2_dcid *dcid; + size_t i, len = ngtcp2_ringbuf_len(rb); + int rv; + + for (i = 0; i < len; ++i) { + dcid = ngtcp2_ringbuf_get(rb, i); + rv = ngtcp2_dcid_verify_uniqueness(dcid, seq, cid, token); + if (rv != 0) { + return NGTCP2_ERR_PROTO; + } + + if (ngtcp2_cid_eq(&dcid->cid, cid)) { + *pfound = 1; + } + } + + return 0; +} + +int ngtcp2_dcidtr_verify_token_uniqueness(const ngtcp2_dcidtr *dtr, int *pfound, + uint64_t seq, const ngtcp2_cid *cid, + const uint8_t *token) { + int rv; + + rv = verify_token_uniqueness(&dtr->bound.rb, pfound, seq, cid, token); + if (rv != 0) { + return rv; + } + + return verify_token_uniqueness(&dtr->unused.rb, pfound, seq, cid, token); +} + +static void remove_dcid_at(ngtcp2_ringbuf *rb, size_t at) { + const ngtcp2_dcid *src; + ngtcp2_dcid *dest; + + if (at == 0) { + ngtcp2_ringbuf_pop_front(rb); + return; + } + + if (at == ngtcp2_ringbuf_len(rb) - 1) { + ngtcp2_ringbuf_pop_back(rb); + return; + } + + src = ngtcp2_ringbuf_get(rb, ngtcp2_ringbuf_len(rb) - 1); + dest = ngtcp2_ringbuf_get(rb, at); + + ngtcp2_dcid_copy(dest, src); + ngtcp2_ringbuf_pop_back(rb); +} + +static int dcidtr_retire_dcid_prior_to(ngtcp2_dcidtr *dtr, ngtcp2_ringbuf *rb, + uint64_t seq, ngtcp2_dcidtr_cb on_retire, + void *user_data) { + size_t i; + const ngtcp2_dcid *dcid; + int rv; + + for (i = 0; i < ngtcp2_ringbuf_len(rb);) { + dcid = ngtcp2_ringbuf_get(rb, i); + if (dcid->seq >= seq) { + ++i; + continue; + } + + rv = dcidtr_on_retire(dtr, dcid, on_retire, user_data); + if (rv != 0) { + return rv; + } + + remove_dcid_at(rb, i); + } + + return 0; +} + +int ngtcp2_dcidtr_retire_inactive_dcid_prior_to(ngtcp2_dcidtr *dtr, + uint64_t seq, + ngtcp2_dcidtr_cb on_retire, + void *user_data) { + int rv; + + rv = + dcidtr_retire_dcid_prior_to(dtr, &dtr->bound.rb, seq, on_retire, user_data); + if (rv != 0) { + return rv; + } + + return dcidtr_retire_dcid_prior_to(dtr, &dtr->unused.rb, seq, on_retire, + user_data); +} + +int ngtcp2_dcidtr_retire_active_dcid(ngtcp2_dcidtr *dtr, + const ngtcp2_dcid *dcid, ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_deactivate, + void *user_data) { + ngtcp2_ringbuf *rb = &dtr->retired.rb; + const ngtcp2_dcid *stale_dcid; + ngtcp2_dcid *dest; + int rv; + + assert(dcid->cid.datalen); + + if (ngtcp2_ringbuf_full(rb)) { + stale_dcid = ngtcp2_ringbuf_get(rb, 0); + rv = on_deactivate(stale_dcid, user_data); + if (rv != 0) { + return rv; + } + } + + dest = ngtcp2_ringbuf_push_back(rb); + ngtcp2_dcid_copy(dest, dcid); + dest->retired_ts = ts; + + return dcidtr_on_retire(dtr, dest, NULL, NULL); +} + +int ngtcp2_dcidtr_remove_stale_retired_dcid(ngtcp2_dcidtr *dtr, + ngtcp2_duration timeout, + ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_deactivate, + void *user_data) { + ngtcp2_ringbuf *rb = &dtr->retired.rb; + const ngtcp2_dcid *dcid; + int rv; + + for (; ngtcp2_ringbuf_len(rb);) { + dcid = ngtcp2_ringbuf_get(rb, 0); + if (ngtcp2_tstamp_not_elapsed(dcid->retired_ts, timeout, ts)) { + break; + } + + rv = on_deactivate(dcid, user_data); + if (rv != 0) { + return rv; + } + + ngtcp2_ringbuf_pop_front(rb); + } + + return 0; +} + +int ngtcp2_dcidtr_pop_bound_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dest, + const ngtcp2_path *path) { + const ngtcp2_dcid *src; + ngtcp2_ringbuf *rb = &dtr->bound.rb; + size_t len = ngtcp2_ringbuf_len(rb); + size_t i; + + for (i = 0; i < len; ++i) { + src = ngtcp2_ringbuf_get(rb, i); + if (ngtcp2_path_eq(&src->ps.path, path)) { + ngtcp2_dcid_copy(dest, src); + remove_dcid_at(rb, i); + + return 0; + } + } + + return NGTCP2_ERR_INVALID_ARGUMENT; +} + +int ngtcp2_dcidtr_retire_stale_bound_dcid(ngtcp2_dcidtr *dtr, + ngtcp2_duration timeout, + ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_retire, + void *user_data) { + ngtcp2_ringbuf *rb = &dtr->bound.rb; + size_t i; + const ngtcp2_dcid *dcid; + int rv; + + for (i = 0; i < ngtcp2_ringbuf_len(rb);) { + dcid = ngtcp2_ringbuf_get(rb, i); + + assert(dcid->cid.datalen); + + if (ngtcp2_tstamp_not_elapsed(dcid->bound_ts, timeout, ts)) { + ++i; + continue; + } + + rv = dcidtr_on_retire(dtr, dcid, on_retire, user_data); + if (rv != 0) { + return rv; + } + + remove_dcid_at(rb, i); + } + + return 0; +} + +ngtcp2_tstamp ngtcp2_dcidtr_earliest_bound_ts(const ngtcp2_dcidtr *dtr) { + const ngtcp2_ringbuf *rb = &dtr->bound.rb; + size_t i, len = ngtcp2_ringbuf_len(rb); + ngtcp2_tstamp res = UINT64_MAX; + const ngtcp2_dcid *dcid; + + for (i = 0; i < len; ++i) { + dcid = ngtcp2_ringbuf_get(rb, i); + + assert(dcid->cid.datalen); + assert(dcid->bound_ts != UINT64_MAX); + + res = ngtcp2_min_uint64(res, dcid->bound_ts); + } + + return res; +} + +ngtcp2_tstamp ngtcp2_dcidtr_earliest_retired_ts(const ngtcp2_dcidtr *dtr) { + const ngtcp2_ringbuf *rb = &dtr->retired.rb; + const ngtcp2_dcid *dcid; + + if (ngtcp2_ringbuf_len(rb) == 0) { + return UINT64_MAX; + } + + dcid = ngtcp2_ringbuf_get(rb, 0); + + return dcid->retired_ts; +} + +void ngtcp2_dcidtr_push_unused(ngtcp2_dcidtr *dtr, uint64_t seq, + const ngtcp2_cid *cid, const uint8_t *token) { + ngtcp2_dcid *dcid = ngtcp2_ringbuf_push_back(&dtr->unused.rb); + + ngtcp2_dcid_init(dcid, seq, cid, token); +} + +void ngtcp2_dcidtr_pop_unused_cid_token(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dest) { + ngtcp2_ringbuf *rb = &dtr->unused.rb; + const ngtcp2_dcid *src; + + assert(ngtcp2_ringbuf_len(rb)); + + src = ngtcp2_ringbuf_get(rb, 0); + + dest->flags = NGTCP2_DCID_FLAG_NONE; + ngtcp2_dcid_copy_cid_token(dest, src); + + ngtcp2_ringbuf_pop_front(rb); +} + +void ngtcp2_dcidtr_pop_unused(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dest) { + ngtcp2_ringbuf *rb = &dtr->unused.rb; + const ngtcp2_dcid *src; + + assert(ngtcp2_ringbuf_len(rb)); + + src = ngtcp2_ringbuf_get(rb, 0); + + ngtcp2_dcid_copy(dest, src); + + ngtcp2_ringbuf_pop_front(rb); +} + +int ngtcp2_dcidtr_check_path_retired(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path) { + const ngtcp2_ringbuf *rb = &dtr->retired.rb; + size_t i, len = ngtcp2_ringbuf_len(rb); + const ngtcp2_dcid *dcid; + + for (i = 0; i < len; ++i) { + dcid = ngtcp2_ringbuf_get(rb, i); + if (ngtcp2_path_eq(&dcid->ps.path, path)) { + return 1; + } + } + + return 0; +} + +size_t ngtcp2_dcidtr_unused_len(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_len(&dtr->unused.rb); +} + +size_t ngtcp2_dcidtr_bound_len(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_len(&dtr->bound.rb); +} + +size_t ngtcp2_dcidtr_retired_len(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_len(&dtr->retired.rb); +} + +size_t ngtcp2_dcidtr_inactive_len(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_len(&dtr->unused.rb) + + ngtcp2_ringbuf_len(&dtr->bound.rb); +} + +int ngtcp2_dcidtr_unused_full(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_full(&dtr->unused.rb); +} + +int ngtcp2_dcidtr_unused_empty(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_len(&dtr->unused.rb) == 0; +} + +int ngtcp2_dcidtr_bound_full(const ngtcp2_dcidtr *dtr) { + return ngtcp2_ringbuf_full(&dtr->bound.rb); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h new file mode 100644 index 00000000000000..17942389b814d1 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h @@ -0,0 +1,343 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * 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. + */ +#ifndef NGTCP2_DCIDTR_H +#define NGTCP2_DCIDTR_H + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif /* defined(HAVE_CONFIG_H) */ + +#include <ngtcp2/ngtcp2.h> + +#include "ngtcp2_cid.h" +#include "ngtcp2_ringbuf.h" + +/* NGTCP2_DCIDTR_MAX_BOUND_DCID_SIZE is the maximum number of + Destination Connection ID which has been bound to a particular + path, but not yet used as primary path, and path validation is not + performed from the local endpoint. It must be the power of 2. */ +#define NGTCP2_DCIDTR_MAX_BOUND_DCID_SIZE 4 +/* NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE is the maximum number of + Destination Connection ID the remote endpoint provides to store. + It must be the power of 2. */ +#define NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE 8 +/* NGTCP2_DCIDTR_MAX_RETIRED_DCID_SIZE is the maximum number of + retired Destination Connection ID kept to catch in-flight packet on + a retired path. It must be the power of 2. */ +#define NGTCP2_DCIDTR_MAX_RETIRED_DCID_SIZE 2 + +ngtcp2_static_ringbuf_def(dcid_bound, NGTCP2_DCIDTR_MAX_BOUND_DCID_SIZE, + sizeof(ngtcp2_dcid)) +ngtcp2_static_ringbuf_def(dcid_unused, NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE, + sizeof(ngtcp2_dcid)) +ngtcp2_static_ringbuf_def(dcid_retired, NGTCP2_DCIDTR_MAX_RETIRED_DCID_SIZE, + sizeof(ngtcp2_dcid)) + +/* + * ngtcp2_dcidtr stores unused, bound, and retired Destination + * Connection IDs. + */ +typedef struct ngtcp2_dcidtr { + /* unused is a set of unused Destination Connection ID received from + a remote endpoint. They are considered inactive. */ + ngtcp2_static_ringbuf_dcid_unused unused; + /* bound is a set of Destination Connection IDs which are bound to + particular paths. These paths are not validated yet. They are + considered inactive. */ + ngtcp2_static_ringbuf_dcid_bound bound; + /* retired is a set of Destination Connection ID retired by local + endpoint. Keep them in 3*PTO to catch packets in flight along + the old path. They are considered active. */ + ngtcp2_static_ringbuf_dcid_retired retired; + struct { + /* seqs contains sequence number of Destination Connection ID + whose retirement is not acknowledged by the remote endpoint + yet. */ + uint64_t seqs[NGTCP2_DCIDTR_MAX_UNUSED_DCID_SIZE * 2]; + /* len is the number of sequence numbers that seq contains. */ + size_t len; + } retire_unacked; +} ngtcp2_dcidtr; + +typedef int (*ngtcp2_dcidtr_cb)(const ngtcp2_dcid *dcid, void *user_data); + +/* + * ngtcp2_dcidtr_init initializes |dtr|. + */ +void ngtcp2_dcidtr_init(ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_track_retired_seq tracks the sequence number |seq| of + * unacknowledged retiring Destination Connection ID. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGTCP2_ERR_CONNECTION_ID_LIMIT + * The number of unacknowledged retirement exceeds the limit. + */ +int ngtcp2_dcidtr_track_retired_seq(ngtcp2_dcidtr *dtr, uint64_t seq); + +/* + * ngtcp2_dcidtr_untrack_retired_seq deletes the sequence number |seq| + * of unacknowledged retiring Destination Connection ID. It is fine + * if such sequence number is not found. + */ +void ngtcp2_dcidtr_untrack_retired_seq(ngtcp2_dcidtr *dtr, uint64_t seq); + +/* + * ngtcp2_dcidtr_check_retired_seq_tracked returns nonzero if |seq| + * has already been tracked. + */ +int ngtcp2_dcidtr_check_retired_seq_tracked(const ngtcp2_dcidtr *dtr, + uint64_t seq); + +/* + * ngtcp2_dcidtr_find_bound_dcid returns the pointer to ngtcp2_dcid + * that bound to |path|. It returns NULL if there is no such + * ngtcp2_dcid. + */ +ngtcp2_dcid *ngtcp2_dcidtr_find_bound_dcid(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path); + +/* + * ngtcp2_dcidtr_bind_zerolen_dcid binds zero-length Destination + * Connection ID to |path|, and returns the pointer to the bound + * ngtcp2_dcid. + */ +ngtcp2_dcid *ngtcp2_dcidtr_bind_zerolen_dcid(ngtcp2_dcidtr *dtr, + const ngtcp2_path *path); + +/* + * ngtcp2_dcidtr_bind_dcid binds non-zero Destination Connection ID to + * |path|. |ts| is the current timestamp. The buffer space of bound + * Destination Connection ID is limited. If it is full, the earliest + * one is removed. |on_retire|, if specified, is called for the + * removed ngtcp2_dcid with |user_data|. This function assigns the + * pointer to bound ngtcp2_dcid to |*pdest|. + * + * This function returns 0 if it succeeds, or negative error code that + * |on_retire| returns. + */ +int ngtcp2_dcidtr_bind_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid **pdest, + const ngtcp2_path *path, ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_retire, void *user_data); + +/* + * ngtcp2_dcidtr_verify_stateless_reset verifies the stateless reset + * token |token| received from |path|. It returns 0 if it succeeds, + * or one of the following negative error codes: + * + * NGTCP2_ERR_INVALID_ARGUMENT + * There is no Destination Connection ID that matches the given + * |path| and |token|. + */ +int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path, + const uint8_t *token); + +/* + * ngtcp2_dcidtr_verify_token_uniqueness verifies that the uniqueness + * of the combination of |seq|, |cid|, and |token| against the exiting + * Destination Connection IDs. That is: + * + * - If they do not share the same seq, then their Connection IDs must + * be different. + * + * - If they share the same seq, then their Connection IDs and tokens + * must be the same. + * + * If this function succeeds, and there is Destination Connection ID + * which shares |seq|, |cid|, and |token|, |*pfound| is set to + * nonzero. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGTCP2_ERR_PROTO + * The given combination of values does not satisfy the above + * conditions. + */ +int ngtcp2_dcidtr_verify_token_uniqueness(const ngtcp2_dcidtr *dtr, int *pfound, + uint64_t seq, const ngtcp2_cid *cid, + const uint8_t *token); + +/* + * ngtcp2_dcidtr_retire_inactive_dcid_prior_to retires inactive + * Destination Connection IDs (unused or bound) whose seq is less than + * |seq|. For each retired ngtcp2_dcid, |on_retire|, if specified, is + * called with |user_data|. + * + * This function returns 0 if it succeeds, or negative error code that + * |on_retire| returns. + */ +int ngtcp2_dcidtr_retire_inactive_dcid_prior_to(ngtcp2_dcidtr *dtr, + uint64_t seq, + ngtcp2_dcidtr_cb on_retire, + void *user_data); + +/* + * ngtcp2_dcidtr_retire_active_dcid adds an active |dcid| to the + * retired Destination Connection ID buffer. The buffer space of + * retired Destination Connection ID is limited. If it is full, the + * earliest one is removed. |on_deactivate| is called for the removed + * ngtcp2_dcid with |user_data|. + * + * This function returns 0 if it succeeds, or negative error code that + * |on_deactivate| returns. + */ +int ngtcp2_dcidtr_retire_active_dcid(ngtcp2_dcidtr *dtr, + const ngtcp2_dcid *dcid, ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_deactivate, + void *user_data); + +/* + * ngtcp2_dcidtr_retire_stale_bound_dcid retires stale bound + * Destination Connection ID. For each retired ngtcp2_dcid, + * |on_retire|, if specified, is called with |user_data|. + */ +int ngtcp2_dcidtr_retire_stale_bound_dcid(ngtcp2_dcidtr *dtr, + ngtcp2_duration timeout, + ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_retire, + void *user_data); + +/* + * ngtcp2_dcidtr_remove_stale_retired_dcid removes stale retired + * Destination Connection ID. For each removed ngtcp2_dcid, + * |on_deactivate| is called with |user_data|. + * + * This function returns 0 if it succeeds, or negative error code that + * |on_deactivate| returns. + */ +int ngtcp2_dcidtr_remove_stale_retired_dcid(ngtcp2_dcidtr *dtr, + ngtcp2_duration timeout, + ngtcp2_tstamp ts, + ngtcp2_dcidtr_cb on_deactivate, + void *user_data); + +/* + * ngtcp2_dcidtr_pop_bound_dcid removes Destination Connection ID that + * is bound to |path|, and copies it into the object pointed by + * |dest|. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGTCP2_ERR_INVALID_ARGUMENT + * No ngtcp2_dcid bound to |path| found. + */ +int ngtcp2_dcidtr_pop_bound_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dest, + const ngtcp2_path *path); + +/* + * ngtcp2_dcidtr_earliest_bound_ts returns earliest timestamp when a + * Destination Connection ID is bound. If there is no bound + * Destination Connection ID, this function returns UINT64_MAX. + */ +ngtcp2_tstamp ngtcp2_dcidtr_earliest_bound_ts(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_earliest_retired_ts returns earliest timestamp when a + * Destination Connection ID is retired. If there is no retired + * Destination Connection ID, this function returns UINT64_MAX. + */ +ngtcp2_tstamp ngtcp2_dcidtr_earliest_retired_ts(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_push_unused adds new Destination Connection ID to the + * unused buffer. |seq| is its sequence number, |cid| is its + * Connection ID, and |token| is its stateless reset token. If the + * buffer space is full, the earliest ngtcp2_dcid is removed. + */ +void ngtcp2_dcidtr_push_unused(ngtcp2_dcidtr *dtr, uint64_t seq, + const ngtcp2_cid *cid, const uint8_t *token); + +/* + * ngtcp2_dcidtr_pop_unused_cid_token removes an unused Destination + * Connection ID, and copies it into the object pointed by |dcid| with + * ngtcp2_dcid_copy_cid_token. This function assumes that there is at + * least one unused Destination Connection ID. + */ +void ngtcp2_dcidtr_pop_unused_cid_token(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dcid); + +/* + * ngtcp2_dcidtr_pop_unused removes an unused Destination Connection + * ID, and copies it into the object pointed by |dcid| with + * ngtcp2_dcid_copy. This function assumes that there is at least one + * unused Destination Connection ID. + */ +void ngtcp2_dcidtr_pop_unused(ngtcp2_dcidtr *dtr, ngtcp2_dcid *dcid); + +/* + * ngtcp2_dcidtr_check_path_retired returns nonzero if |path| is + * included in retired Destination Connection IDs. + */ +int ngtcp2_dcidtr_check_path_retired(const ngtcp2_dcidtr *dtr, + const ngtcp2_path *path); + +/* + * ngtcp2_dcidtr_unused_len returns the number of unused Destination + * Connection ID. + */ +size_t ngtcp2_dcidtr_unused_len(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_bound_len returns the number of bound Destination + * Connection ID. + */ +size_t ngtcp2_dcidtr_bound_len(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_retired_len returns the number of retired Destination + * Connection ID. + */ +size_t ngtcp2_dcidtr_retired_len(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_inactive_len returns the number of unused and bound + * Destination Connection ID. + */ +size_t ngtcp2_dcidtr_inactive_len(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_unused_full returns nonzero if the buffer of unused + * Destination Connection ID is full. + */ +int ngtcp2_dcidtr_unused_full(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_unused_empty returns nonzero if the buffer of unused + * Destination Connection ID is empty. + */ +int ngtcp2_dcidtr_unused_empty(const ngtcp2_dcidtr *dtr); + +/* + * ngtcp2_dcidtr_bound_full returns nonzero if the buffer of bound + * Destination Connection ID is full. + */ +int ngtcp2_dcidtr_bound_full(const ngtcp2_dcidtr *dtr); + +#endif /* NGTCP2_DCIDTR_H */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h index 9229f5425a63cf..44527b11bdec47 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h @@ -27,8 +27,8 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> -#endif /* NGTCP2_ERR_H */ +#endif /* !defined(NGTCP2_ERR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c index 41c2a6a755cc8a..0f6b06a788d174 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c @@ -27,18 +27,7 @@ #include <string.h> #include <assert.h> -ngtcp2_objalloc_def(frame_chain, ngtcp2_frame_chain, oplent); - -int ngtcp2_frame_chain_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem) { - *pfrc = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_frame_chain)); - if (*pfrc == NULL) { - return NGTCP2_ERR_NOMEM; - } - - ngtcp2_frame_chain_init(*pfrc); - - return 0; -} +ngtcp2_objalloc_def(frame_chain, ngtcp2_frame_chain, oplent) int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, ngtcp2_objalloc *objalloc) { @@ -68,14 +57,11 @@ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { - size_t need, avail = sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream); - - if (datacnt > 1) { - need = sizeof(ngtcp2_vec) * (datacnt - 1); - - if (need > avail) { - return ngtcp2_frame_chain_extralen_new(pfrc, need - avail, mem); - } + if (datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { + return ngtcp2_frame_chain_extralen_new(pfrc, + sizeof(ngtcp2_vec) * (datacnt - 1) - + NGTCP2_FRAME_CHAIN_STREAM_AVAIL, + mem); } return ngtcp2_frame_chain_objalloc_new(pfrc, objalloc); @@ -86,13 +72,13 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, size_t tokenlen, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { - size_t avail = sizeof(ngtcp2_frame) - sizeof(ngtcp2_new_token); int rv; uint8_t *p; ngtcp2_frame *fr; - if (tokenlen > avail) { - rv = ngtcp2_frame_chain_extralen_new(pfrc, tokenlen - avail, mem); + if (tokenlen > NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES) { + rv = ngtcp2_frame_chain_extralen_new( + pfrc, tokenlen - NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES, mem); } else { rv = ngtcp2_frame_chain_objalloc_new(pfrc, objalloc); } @@ -139,9 +125,7 @@ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, switch (frc->fr.type) { case NGTCP2_FRAME_CRYPTO: case NGTCP2_FRAME_STREAM: - if (frc->fr.stream.datacnt && - sizeof(ngtcp2_vec) * (frc->fr.stream.datacnt - 1) > - sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream)) { + if (frc->fr.stream.datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { ngtcp2_frame_chain_del(frc, mem); return; @@ -149,8 +133,7 @@ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, break; case NGTCP2_FRAME_NEW_TOKEN: - if (frc->fr.new_token.tokenlen > - sizeof(ngtcp2_frame) - sizeof(ngtcp2_new_token)) { + if (frc->fr.new_token.tokenlen > NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES) { ngtcp2_frame_chain_del(frc, mem); return; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h index 656fa5b799450e..e7b33632529cd4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -74,7 +74,7 @@ struct ngtcp2_frame_chain { }; }; -ngtcp2_objalloc_decl(frame_chain, ngtcp2_frame_chain, oplent); +ngtcp2_objalloc_decl(frame_chain, ngtcp2_frame_chain, oplent) /* * ngtcp2_bind_frame_chains binds two frame chains |a| and |b| using @@ -95,44 +95,61 @@ int ngtcp2_bind_frame_chains(ngtcp2_frame_chain *a, ngtcp2_frame_chain *b, #define NGTCP2_MAX_STREAM_DATACNT 256 /* - * ngtcp2_frame_chain_new allocates ngtcp2_frame_chain object and - * assigns its pointer to |*pfrc|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_frame_chain_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem); - -/* - * ngtcp2_frame_chain_objalloc_new behaves like - * ngtcp2_frame_chain_new, but it uses |objalloc| to allocate the object. + * ngtcp2_frame_chain_objalloc_new allocates ngtcp2_frame_chain using + * |objalloc|. */ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, ngtcp2_objalloc *objalloc); /* - * ngtcp2_frame_chain_extralen_new works like ngtcp2_frame_chain_new, - * but it allocates extra memory |extralen| in order to extend - * ngtcp2_frame. + * ngtcp2_frame_chain_extralen_new allocates ngtcp2_frame_chain + * followed by |extralen| bytes. */ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, const ngtcp2_mem *mem); +/* NGTCP2_FRAME_CHAIN_STREAM_AVAIL is the number of additional bytes + available after ngtcp2_stream when it is embedded in + ngtcp2_frame. */ +#define NGTCP2_FRAME_CHAIN_STREAM_AVAIL \ + (sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream)) + +/* NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES is the number of datacnt + that changes allocation method. If datacnt is more than this + value, ngtcp2_frame_chain is allocated without ngtcp2_objalloc. + Otherwise, it is allocated using ngtcp2_objalloc. */ +#define NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES \ + (NGTCP2_FRAME_CHAIN_STREAM_AVAIL / sizeof(ngtcp2_vec) + 1) + +/* NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES is the length of a token that + changes allocation method. If the length is more than this value, + ngtcp2_frame_chain is allocated without ngtcp2_objalloc. + Otherwise, it is allocated using ngtcp2_objalloc. */ +#define NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES \ + (sizeof(ngtcp2_frame) - sizeof(ngtcp2_new_token)) + /* - * ngtcp2_frame_chain_stream_datacnt_objalloc_new works like - * ngtcp2_frame_chain_new, but it allocates enough data to store - * additional |datacnt| - 1 ngtcp2_vec object after ngtcp2_stream - * object. If no additional space is required, - * ngtcp2_frame_chain_objalloc_new is called internally. + * ngtcp2_frame_chain_stream_datacnt_objalloc_new allocates enough + * data to store additional |datacnt| - 1 ngtcp2_vec object after + * ngtcp2_stream object. If no additional space is required, in other + * words, |datacnt| <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES, + * ngtcp2_frame_chain_objalloc_new is called internally. Otherwise, + * ngtcp2_frame_chain_extralen_new is used and objalloc is not used. + * Therefore, it is important to call ngtcp2_frame_chain_objalloc_del + * without changing datacnt field. */ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem); +/* + * ngtcp2_frame_chain_new_token_objalloc_new allocates enough space to + * store the given token. If |tokenlen| <= + * NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES, ngtcp2_frame_chain_objalloc_new + * is called internally. Otherwise, ngtcp2_frame_chain_extralen_new + * is used, and objalloc is not used. + */ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, const uint8_t *token, size_t tokenlen, @@ -168,4 +185,4 @@ void ngtcp2_frame_chain_list_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem); -#endif /* NGTCP2_FRAME_CHAIN_H */ +#endif /* !defined(NGTCP2_FRAME_CHAIN_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c index 87c23898e8207d..d04b9634c20528 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c @@ -28,22 +28,18 @@ #include <assert.h> void ngtcp2_gaptr_init(ngtcp2_gaptr *gaptr, const ngtcp2_mem *mem) { - ngtcp2_ksl_init(&gaptr->gap, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&gaptr->gap, ngtcp2_ksl_range_compar, ngtcp2_ksl_range_search, + sizeof(ngtcp2_range), mem); gaptr->mem = mem; } static int gaptr_gap_init(ngtcp2_gaptr *gaptr) { - ngtcp2_range range = {0, UINT64_MAX}; - int rv; - - rv = ngtcp2_ksl_insert(&gaptr->gap, NULL, &range, NULL); - if (rv != 0) { - return rv; - } + ngtcp2_range range = { + .end = UINT64_MAX, + }; - return 0; + return ngtcp2_ksl_insert(&gaptr->gap, NULL, &range, NULL); } void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr) { @@ -56,7 +52,11 @@ void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr) { int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { int rv; - ngtcp2_range k, m, l, r, q = {offset, offset + datalen}; + ngtcp2_range k, m, l, r; + ngtcp2_range q = { + .begin = offset, + .end = offset + datalen, + }; ngtcp2_ksl_it it; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { @@ -66,8 +66,8 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { } } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); for (; !ngtcp2_ksl_it_end(&it);) { k = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); @@ -80,7 +80,9 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { ngtcp2_ksl_remove_hint(&gaptr->gap, &it, &it, &k); continue; } + ngtcp2_range_cut(&l, &r, &k, &m); + if (ngtcp2_range_len(&l)) { ngtcp2_ksl_update_key(&gaptr->gap, &k, &l); @@ -93,58 +95,67 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { } else if (ngtcp2_range_len(&r)) { ngtcp2_ksl_update_key(&gaptr->gap, &k, &r); } + ngtcp2_ksl_it_next(&it); } + return 0; } -uint64_t ngtcp2_gaptr_first_gap_offset(ngtcp2_gaptr *gaptr) { +uint64_t ngtcp2_gaptr_first_gap_offset(const ngtcp2_gaptr *gaptr) { ngtcp2_ksl_it it; - ngtcp2_range r; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { return 0; } it = ngtcp2_ksl_begin(&gaptr->gap); - r = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); - return r.begin; + return ((ngtcp2_range *)ngtcp2_ksl_it_key(&it))->begin; } -ngtcp2_range ngtcp2_gaptr_get_first_gap_after(ngtcp2_gaptr *gaptr, +ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, uint64_t offset) { - ngtcp2_range q = {offset, offset + 1}; + ngtcp2_range q = { + .begin = offset, + .end = offset + 1, + }; ngtcp2_ksl_it it; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { - ngtcp2_range r = {0, UINT64_MAX}; + ngtcp2_range r = { + .end = UINT64_MAX, + }; return r; } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); assert(!ngtcp2_ksl_it_end(&it)); return *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); } -int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, +int ngtcp2_gaptr_is_pushed(const ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { - ngtcp2_range q = {offset, offset + datalen}; + ngtcp2_range q = { + .begin = offset, + .end = offset + datalen, + }; ngtcp2_ksl_it it; - ngtcp2_range k; ngtcp2_range m; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { return 0; } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); - k = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); - m = ngtcp2_range_intersect(&q, &k); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); + + assert(!ngtcp2_ksl_it_end(&it)); + + m = ngtcp2_range_intersect(&q, (ngtcp2_range *)ngtcp2_ksl_it_key(&it)); return ngtcp2_range_len(&m) == 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h index 0f100a81c4286c..3120676cf849d4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -39,8 +39,9 @@ * ngtcp2_gaptr maintains the gap in the range [0, UINT64_MAX). */ typedef struct ngtcp2_gaptr { - /* gap maintains the range of offset which is not received - yet. Initially, its range is [0, UINT64_MAX). */ + /* gap maintains the range of offset which is not pushed + yet. Initially, its range is [0, UINT64_MAX). "gap" is the range + that is not pushed yet. */ ngtcp2_ksl gap; /* mem is custom memory allocator */ const ngtcp2_mem *mem; @@ -57,8 +58,7 @@ void ngtcp2_gaptr_init(ngtcp2_gaptr *gaptr, const ngtcp2_mem *mem); void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr); /* - * ngtcp2_gaptr_push adds new data of length |datalen| at the stream - * offset |offset|. + * ngtcp2_gaptr_push pushes the range [offset, offset + datalen). * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -72,20 +72,20 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen); * ngtcp2_gaptr_first_gap_offset returns the offset to the first gap. * If there is no gap, it returns UINT64_MAX. */ -uint64_t ngtcp2_gaptr_first_gap_offset(ngtcp2_gaptr *gaptr); +uint64_t ngtcp2_gaptr_first_gap_offset(const ngtcp2_gaptr *gaptr); /* * ngtcp2_gaptr_get_first_gap_after returns the first gap which - * overlaps or comes after |offset|. + * includes or comes after |offset|. */ -ngtcp2_range ngtcp2_gaptr_get_first_gap_after(ngtcp2_gaptr *gaptr, +ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, uint64_t offset); /* * ngtcp2_gaptr_is_pushed returns nonzero if range [offset, offset + * datalen) is completely pushed into this object. */ -int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, +int ngtcp2_gaptr_is_pushed(const ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen); /* @@ -95,4 +95,4 @@ int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, */ void ngtcp2_gaptr_drop_first_gap(ngtcp2_gaptr *gaptr); -#endif /* NGTCP2_GAPTR_H */ +#endif /* !defined(NGTCP2_GAPTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c index d9880227690faf..2cf9d3cbfd1393 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c @@ -26,10 +26,8 @@ #include <assert.h> -void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem) { +void ngtcp2_idtr_init(ngtcp2_idtr *idtr, const ngtcp2_mem *mem) { ngtcp2_gaptr_init(&idtr->gap, mem); - - idtr->server = server; } void ngtcp2_idtr_free(ngtcp2_idtr *idtr) { @@ -41,8 +39,7 @@ void ngtcp2_idtr_free(ngtcp2_idtr *idtr) { } /* - * id_from_stream_id translates |stream_id| to id space used by - * ngtcp2_idtr. + * id_from_stream_id translates |stream_id| to an internal ID. */ static uint64_t id_from_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2); @@ -51,9 +48,6 @@ static uint64_t id_from_stream_id(int64_t stream_id) { int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); if (ngtcp2_gaptr_is_pushed(&idtr->gap, q, 1)) { @@ -63,17 +57,10 @@ int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id) { return ngtcp2_gaptr_push(&idtr->gap, q, 1); } -int ngtcp2_idtr_is_open(ngtcp2_idtr *idtr, int64_t stream_id) { +int ngtcp2_idtr_is_open(const ngtcp2_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); return ngtcp2_gaptr_is_pushed(&idtr->gap, q, 1); } - -uint64_t ngtcp2_idtr_first_gap(ngtcp2_idtr *idtr) { - return ngtcp2_gaptr_first_gap_offset(&idtr->gap); -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h index edb8c68c8db9b5..0671f5ed91a5cd 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -38,21 +38,17 @@ * ngtcp2_idtr tracks the usage of stream ID. */ typedef struct ngtcp2_idtr { - /* gap maintains the range of ID which is not used yet. Initially, - its range is [0, UINT64_MAX). */ + /* gap maintains the range of an internal ID which is not used yet. + Initially, its range is [0, UINT64_MAX). The internal ID and + stream ID are in the different number spaces. See + id_from_stream_id to convert a stream ID to an internal ID. */ ngtcp2_gaptr gap; - /* server is nonzero if this object records server initiated stream - ID. */ - int server; } ngtcp2_idtr; /* * ngtcp2_idtr_init initializes |idtr|. - * - * If this object records server initiated ID (even number), set - * |server| to nonzero. */ -void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem); +void ngtcp2_idtr_init(ngtcp2_idtr *idtr, const ngtcp2_mem *mem); /* * ngtcp2_idtr_free frees resources allocated for |idtr|. @@ -60,30 +56,21 @@ void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem); void ngtcp2_idtr_free(ngtcp2_idtr *idtr); /* - * ngtcp2_idtr_open claims that |stream_id| is in used. + * ngtcp2_idtr_open claims that |stream_id| is in use. * * It returns 0 if it succeeds, or one of the following negative error * codes: * * NGTCP2_ERR_STREAM_IN_USE - * ID has already been used. + * |stream_id| has already been used. * NGTCP2_ERR_NOMEM * Out of memory. */ int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id); /* - * ngtcp2_idtr_open tells whether ID |stream_id| is in used or not. - * - * It returns nonzero if |stream_id| is used. - */ -int ngtcp2_idtr_is_open(ngtcp2_idtr *idtr, int64_t stream_id); - -/* - * ngtcp2_idtr_first_gap returns the first id of first gap. If there - * is no gap, it returns UINT64_MAX. The returned id is an id space - * used in this object internally, and not stream ID. + * ngtcp2_idtr_open returns nonzero if |stream_id| is in use. */ -uint64_t ngtcp2_idtr_first_gap(ngtcp2_idtr *idtr); +int ngtcp2_idtr_is_open(const ngtcp2_idtr *idtr, int64_t stream_id); -#endif /* NGTCP2_IDTR_H */ +#endif /* !defined(NGTCP2_IDTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c index 0ccc048b5b16b1..22c131a1ac677c 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c @@ -33,13 +33,15 @@ #include "ngtcp2_mem.h" #include "ngtcp2_range.h" -static ngtcp2_ksl_blk null_blk = {{{NULL, NULL, 0, 0, {0}}}}; +static ngtcp2_ksl_blk null_blk; -ngtcp2_objalloc_def(ksl_blk, ngtcp2_ksl_blk, oplent); +ngtcp2_objalloc_def(ksl_blk, ngtcp2_ksl_blk, oplent) static size_t ksl_nodelen(size_t keylen) { - return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0xfu) & - ~(uintptr_t)0xfu; + assert(keylen >= sizeof(uint64_t)); + + return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0x7u) & + ~(uintptr_t)0x7u; } static size_t ksl_blklen(size_t nodelen) { @@ -55,20 +57,21 @@ static void ksl_node_set_key(ngtcp2_ksl *ksl, ngtcp2_ksl_node *node, memcpy(node->key, key, ksl->keylen); } -void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, size_t keylen, +void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, + ngtcp2_ksl_search search, size_t keylen, const ngtcp2_mem *mem) { size_t nodelen = ksl_nodelen(keylen); ngtcp2_objalloc_init(&ksl->blkalloc, - ((ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu) * 8, - mem); + (ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu, mem); ksl->head = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; + ksl->search = search; + ksl->n = 0; ksl->keylen = keylen; ksl->nodelen = nodelen; - ksl->n = 0; } static ngtcp2_ksl_blk *ksl_blk_objalloc_new(ngtcp2_ksl *ksl) { @@ -82,6 +85,7 @@ static void ksl_blk_objalloc_del(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { static int ksl_head_init(ngtcp2_ksl *ksl) { ngtcp2_ksl_blk *head = ksl_blk_objalloc_new(ksl); + if (!head) { return NGTCP2_ERR_NOMEM; } @@ -111,7 +115,7 @@ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { ksl_blk_objalloc_del(ksl, blk); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { if (!ksl || !ksl->head) { @@ -120,7 +124,7 @@ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ngtcp2_objalloc_free(&ksl->blkalloc); } @@ -143,21 +147,22 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { rblk->next = blk->next; blk->next = rblk; + if (rblk->next) { rblk->next->prev = rblk; } else if (ksl->back == blk) { ksl->back = rblk; } + rblk->prev = blk; rblk->leaf = blk->leaf; rblk->n = blk->n / 2; + blk->n -= rblk->n; - memcpy(rblk->nodes, blk->nodes + ksl->nodelen * (blk->n - rblk->n), + memcpy(rblk->nodes, blk->nodes + ksl->nodelen * blk->n, ksl->nodelen * rblk->n); - blk->n -= rblk->n; - assert(blk->n >= NGTCP2_KSL_MIN_NBLK); assert(rblk->n >= NGTCP2_KSL_MIN_NBLK); @@ -173,7 +178,7 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { * codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *node; @@ -207,7 +212,7 @@ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_head(ngtcp2_ksl *ksl) { ngtcp2_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; @@ -221,10 +226,12 @@ static int ksl_split_head(ngtcp2_ksl *ksl) { lblk = ksl->head; nhead = ksl_blk_objalloc_new(ksl); + if (nhead == NULL) { ksl_blk_objalloc_del(ksl, rblk); return NGTCP2_ERR_NOMEM; } + nhead->next = nhead->prev = NULL; nhead->n = 2; nhead->leaf = 0; @@ -243,9 +250,9 @@ static int ksl_split_head(ngtcp2_ksl *ksl) { } /* - * insert_node inserts a node whose key is |key| with the associated - * |data| at the index of |i|. This function assumes that the number - * of nodes contained by |blk| is strictly less than + * ksl_insert_node inserts a node whose key is |key| with the + * associated |data| at the index of |i|. This function assumes that + * the number of nodes contained by |blk| is strictly less than * NGTCP2_KSL_MAX_NBLK. */ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i, @@ -264,19 +271,6 @@ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i, ++blk->n; } -static size_t ksl_bsearch(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, - const ngtcp2_ksl_key *key, ngtcp2_ksl_compar compar) { - size_t i; - ngtcp2_ksl_node *node; - - for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes; - i < blk->n && compar((ngtcp2_ksl_key *)node->key, key); - ++i, node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen)) - ; - - return i; -} - int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key, void *data) { ngtcp2_ksl_blk *blk; @@ -291,18 +285,17 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } } - blk = ksl->head; - - if (blk->n == NGTCP2_KSL_MAX_NBLK) { + if (ksl->head->n == NGTCP2_KSL_MAX_NBLK) { rv = ksl_split_head(ksl); if (rv != 0) { return rv; } - blk = ksl->head; } + blk = ksl->head; + for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl->search(ksl, blk, key); if (blk->leaf) { if (i < blk->n && @@ -310,13 +303,17 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } + ksl_insert_node(ksl, blk, i, key, data); ++ksl->n; + if (it) { ngtcp2_ksl_it_init(it, ksl, blk, i); } + return 0; } @@ -329,16 +326,21 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (rv != 0) { return rv; } + node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1); } + ksl_node_set_key(ksl, node, key); blk = node->blk; } + ksl_insert_node(ksl, blk, blk->n, key, data); ++ksl->n; + if (it) { ngtcp2_ksl_it_init(it, ksl, blk, blk->n - 1); } + return 0; } @@ -349,8 +351,10 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (rv != 0) { return rv; } + if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { node = ngtcp2_ksl_nth_node(ksl, blk, i + 1); + if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { ksl_node_set_key(ksl, node, key); } @@ -376,19 +380,22 @@ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the direct descendant of head (root) block and the head - * block contains just 2 nodes, the merged block becomes head block, - * which decreases the height of |ksl| by 1. + * If |blk| is the head (root) block and it contains just 2 nodes + * before merging nodes, the merged block becomes head block, which + * decreases the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { + ngtcp2_ksl_node *lnode; ngtcp2_ksl_blk *lblk, *rblk; assert(i + 1 < blk->n); - lblk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; + lnode = ngtcp2_ksl_nth_node(ksl, blk, i); + + lblk = lnode->blk; rblk = ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk; assert(lblk->n + rblk->n < NGTCP2_KSL_MAX_NBLK); @@ -398,6 +405,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, lblk->n += rblk->n; lblk->next = rblk->next; + if (lblk->next) { lblk->next->prev = lblk; } else if (ksl->back == rblk) { @@ -411,7 +419,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, ksl->head = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_node_set_key(ksl, ngtcp2_ksl_nth_node(ksl, blk, i), + ksl_node_set_key(ksl, lnode, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } @@ -425,6 +433,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, */ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *lnode, *rnode; + ngtcp2_ksl_blk *lblk, *rblk; size_t n; assert(i > 0); @@ -432,35 +441,37 @@ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { lnode = ngtcp2_ksl_nth_node(ksl, blk, i - 1); rnode = ngtcp2_ksl_nth_node(ksl, blk, i); - assert(lnode->blk->n < NGTCP2_KSL_MAX_NBLK); - assert(rnode->blk->n > NGTCP2_KSL_MIN_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; + + assert(lblk->n < NGTCP2_KSL_MAX_NBLK); + assert(rblk->n > NGTCP2_KSL_MIN_NBLK); - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - lnode->blk->n; + n = (lblk->n + rblk->n + 1) / 2 - lblk->n; assert(n > 0); - assert(lnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n); - assert(rnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n); + assert(lblk->n <= NGTCP2_KSL_MAX_NBLK - n); + assert(rblk->n >= NGTCP2_KSL_MIN_NBLK + n); - memcpy(lnode->blk->nodes + ksl->nodelen * lnode->blk->n, rnode->blk->nodes, - ksl->nodelen * n); + memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, ksl->nodelen * n); - lnode->blk->n += (uint32_t)n; - rnode->blk->n -= (uint32_t)n; + lblk->n += (uint32_t)n; + rblk->n -= (uint32_t)n; - ksl_node_set_key( - ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); - memmove(rnode->blk->nodes, rnode->blk->nodes + ksl->nodelen * n, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes, rblk->nodes + ksl->nodelen * n, ksl->nodelen * rblk->n); } /* * ksl_shift_right moves the last nodes in blk->nodes[i]->blk->nodes * to blk->nodes[i + 1]->blk->nodes in a manner that they have the - * same amount of nodes as much as possible.. + * same amount of nodes as much as possible. */ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *lnode, *rnode; + ngtcp2_ksl_blk *lblk, *rblk; size_t n; assert(i < blk->n - 1); @@ -468,26 +479,27 @@ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { lnode = ngtcp2_ksl_nth_node(ksl, blk, i); rnode = ngtcp2_ksl_nth_node(ksl, blk, i + 1); - assert(lnode->blk->n > NGTCP2_KSL_MIN_NBLK); - assert(rnode->blk->n < NGTCP2_KSL_MAX_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - rnode->blk->n; + assert(lblk->n > NGTCP2_KSL_MIN_NBLK); + assert(rblk->n < NGTCP2_KSL_MAX_NBLK); + + n = (lblk->n + rblk->n + 1) / 2 - rblk->n; assert(n > 0); - assert(lnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n); - assert(rnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n); + assert(lblk->n >= NGTCP2_KSL_MIN_NBLK + n); + assert(rblk->n <= NGTCP2_KSL_MAX_NBLK - n); - memmove(rnode->blk->nodes + ksl->nodelen * n, rnode->blk->nodes, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes + ksl->nodelen * n, rblk->nodes, ksl->nodelen * rblk->n); - rnode->blk->n += (uint32_t)n; - lnode->blk->n -= (uint32_t)n; + rblk->n += (uint32_t)n; + lblk->n -= (uint32_t)n; - memcpy(rnode->blk->nodes, lnode->blk->nodes + ksl->nodelen * lnode->blk->n, - ksl->nodelen * n); + memcpy(rblk->nodes, lblk->nodes + ksl->nodelen * lblk->n, ksl->nodelen * n); - ksl_node_set_key( - ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } /* @@ -531,23 +543,24 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_node *node; size_t i; - if (!ksl->head) { + if (!blk) { return NGTCP2_ERR_INVALID_ARGUMENT; } if (!blk->leaf && blk->n == 2 && ngtcp2_ksl_nth_node(ksl, blk, 0)->blk->n == NGTCP2_KSL_MIN_NBLK && ngtcp2_ksl_nth_node(ksl, blk, 1)->blk->n == NGTCP2_KSL_MIN_NBLK) { - blk = ksl_merge_node(ksl, ksl->head, 0); + blk = ksl_merge_node(ksl, blk, 0); } for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl->search(ksl, blk, key); if (i == blk->n) { if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } @@ -556,10 +569,13 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } + ksl_remove_node(ksl, blk, i); --ksl->n; + if (it) { if (blk->n == i && blk->next) { ngtcp2_ksl_it_init(it, ksl, blk->next, 0); @@ -567,6 +583,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_it_init(it, ksl, blk, i); } } + return 0; } @@ -583,6 +600,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_left(ksl, blk, i + 1); blk = node->blk; + continue; } @@ -590,6 +608,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_right(ksl, blk, i - 1); blk = node->blk; + continue; } @@ -604,50 +623,14 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } } -ngtcp2_ksl_it ngtcp2_ksl_lower_bound(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key) { - ngtcp2_ksl_blk *blk = ksl->head; - ngtcp2_ksl_it it; - size_t i; - - if (!blk) { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); - return it; - } - - for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); - - if (blk->leaf) { - if (i == blk->n && blk->next) { - blk = blk->next; - i = 0; - } - ngtcp2_ksl_it_init(&it, ksl, blk, i); - return it; - } - - if (i == blk->n) { - /* This happens if descendant has smaller key. Fast forward to - find last node in this subtree. */ - for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk) - ; - if (blk->next) { - blk = blk->next; - i = 0; - } else { - i = blk->n; - } - ngtcp2_ksl_it_init(&it, ksl, blk, i); - return it; - } - blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; - } + return ngtcp2_ksl_lower_bound_search(ksl, key, ksl->search); } -ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, - ngtcp2_ksl_compar compar) { + ngtcp2_ksl_search search) { ngtcp2_ksl_blk *blk = ksl->head; ngtcp2_ksl_it it; size_t i; @@ -658,14 +641,16 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, } for (;;) { - i = ksl_bsearch(ksl, blk, key, compar); + i = search(ksl, blk, key); if (blk->leaf) { if (i == blk->n && blk->next) { blk = blk->next; i = 0; } + ngtcp2_ksl_it_init(&it, ksl, blk, i); + return it; } @@ -674,15 +659,19 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, find last node in this subtree. */ for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk) ; + if (blk->next) { blk = blk->next; i = 0; } else { i = blk->n; } + ngtcp2_ksl_it_init(&it, ksl, blk, i); + return it; } + blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; } } @@ -696,7 +685,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, assert(ksl->head); for (;;) { - i = ksl_bsearch(ksl, blk, old_key, ksl->compar); + i = ksl->search(ksl, blk, old_key); assert(i < blk->n); node = ngtcp2_ksl_nth_node(ksl, blk, i); @@ -704,6 +693,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, if (blk->leaf) { assert(key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key)); ksl_node_set_key(ksl, node, new_key); + return; } @@ -716,7 +706,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, } } -size_t ngtcp2_ksl_len(ngtcp2_ksl *ksl) { return ksl->n; } +size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl) { return ksl->n; } void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { if (!ksl->head) { @@ -725,7 +715,7 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ksl->front = ksl->back = ksl->head = NULL; ksl->n = 0; @@ -734,7 +724,8 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { } #ifndef WIN32 -static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { +static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + size_t level) { size_t i; ngtcp2_ksl_node *node; @@ -745,7 +736,9 @@ static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { node = ngtcp2_ksl_nth_node(ksl, blk, i); fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key); } + fprintf(stderr, "\n"); + return; } @@ -754,14 +747,14 @@ static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { } } -void ngtcp2_ksl_print(ngtcp2_ksl *ksl) { +void ngtcp2_ksl_print(const ngtcp2_ksl *ksl) { if (!ksl->head) { return; } ksl_print(ksl, ksl->head, 0); } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; @@ -815,9 +808,49 @@ int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, return a->begin < b->begin; } +ngtcp2_ksl_search_def(range, ngtcp2_ksl_range_compar) + +size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_range_search(ksl, blk, key); +} + int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { const ngtcp2_range *a = lhs, *b = rhs; - return a->begin < b->begin && - !(ngtcp2_max(a->begin, b->begin) < ngtcp2_min(a->end, b->end)); + return a->begin < b->begin && !(ngtcp2_max_uint64(a->begin, b->begin) < + ngtcp2_min_uint64(a->end, b->end)); +} + +ngtcp2_ksl_search_def(range_exclusive, ngtcp2_ksl_range_exclusive_compar) + +size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_range_exclusive_search(ksl, blk, key); +} + +int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(uint64_t *)lhs < *(uint64_t *)rhs; +} + +ngtcp2_ksl_search_def(uint64_less, ngtcp2_ksl_uint64_less) + +size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_uint64_less_search(ksl, blk, key); +} + +int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(int64_t *)lhs > *(int64_t *)rhs; +} + +ngtcp2_ksl_search_def(int64_greater, ngtcp2_ksl_int64_greater) + +size_t ngtcp2_ksl_int64_greater_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_int64_greater_search(ksl, blk, key); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h index 7e08f15cdae6e8..de78bcb8070f53 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <stdlib.h> @@ -35,16 +35,12 @@ #include "ngtcp2_objalloc.h" -/* - * Skip List using single key instead of range. - */ - #define NGTCP2_KSL_DEGR 16 /* NGTCP2_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ #define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR - 1) /* NGTCP2_KSL_MIN_NBLK is the minimum number of nodes which a single - block other than root must contains. */ + block other than root must contain. */ #define NGTCP2_KSL_MIN_NBLK (NGTCP2_KSL_DEGR - 1) /* @@ -85,7 +81,8 @@ struct ngtcp2_ksl_blk { struct { /* next points to the next block if leaf field is nonzero. */ ngtcp2_ksl_blk *next; - /* prev points to the previous block if leaf field is nonzero. */ + /* prev points to the previous block if leaf field is + nonzero. */ ngtcp2_ksl_blk *prev; /* n is the number of nodes this object contains in nodes. */ uint32_t n; @@ -106,7 +103,7 @@ struct ngtcp2_ksl_blk { }; }; -ngtcp2_objalloc_decl(ksl_blk, ngtcp2_ksl_blk, oplent); +ngtcp2_objalloc_decl(ksl_blk, ngtcp2_ksl_blk, oplent) /* * ngtcp2_ksl_compar is a function type which returns nonzero if key @@ -117,10 +114,37 @@ typedef int (*ngtcp2_ksl_compar)(const ngtcp2_ksl_key *lhs, typedef struct ngtcp2_ksl ngtcp2_ksl; +/* + * ngtcp2_ksl_search is a function to search for the first element in + * |blk|->nodes which is not ordered before |key|. It returns the + * index of such element. It returns |blk|->n if there is no such + * element. + */ +typedef size_t (*ngtcp2_ksl_search)(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_search_def is a macro to implement ngtcp2_ksl_search + * with COMPAR which is supposed to be ngtcp2_ksl_compar. + */ +#define ngtcp2_ksl_search_def(NAME, COMPAR) \ + static size_t ksl_##NAME##_search( \ + const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, const ngtcp2_ksl_key *key) { \ + size_t i; \ + ngtcp2_ksl_node *node; \ + \ + for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes; \ + i < blk->n && COMPAR((ngtcp2_ksl_key *)node->key, key); ++i, \ + node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen)) \ + ; \ + \ + return i; \ + } + typedef struct ngtcp2_ksl_it ngtcp2_ksl_it; /* - * ngtcp2_ksl_it is a forward iterator to iterate nodes. + * ngtcp2_ksl_it is a bidirectional iterator to iterate nodes. */ struct ngtcp2_ksl_it { const ngtcp2_ksl *ksl; @@ -140,6 +164,8 @@ struct ngtcp2_ksl { /* back points to the last leaf block. */ ngtcp2_ksl_blk *back; ngtcp2_ksl_compar compar; + ngtcp2_ksl_search search; + /* n is the number of elements stored. */ size_t n; /* keylen is the size of key */ size_t keylen; @@ -150,9 +176,12 @@ struct ngtcp2_ksl { /* * ngtcp2_ksl_init initializes |ksl|. |compar| specifies compare - * function. |keylen| is the length of key. + * function. |search| is a search function which must use |compar|. + * |keylen| is the length of key and must be at least + * sizeof(uint64_t). */ -void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, size_t keylen, +void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, + ngtcp2_ksl_search search, size_t keylen, const ngtcp2_mem *mem); /* @@ -165,15 +194,15 @@ void ngtcp2_ksl_free(ngtcp2_ksl *ksl); /* * ngtcp2_ksl_insert inserts |key| with its associated |data|. On * successful insertion, the iterator points to the inserted node is - * stored in |*it|. + * stored in |*it| if |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. * NGTCP2_ERR_INVALID_ARGUMENT - * |key| already exists. + * |key| already exists. */ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key, void *data); @@ -184,13 +213,14 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, * This function assigns the iterator to |*it|, which points to the * node which is located at the right next of the removed node if |it| * is not NULL. If |key| is not found, no deletion takes place and - * the return value of ngtcp2_ksl_end(ksl) is assigned to |*it|. + * the return value of ngtcp2_ksl_end(ksl) is assigned to |*it| if + * |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_INVALID_ARGUMENT - * |key| does not exist. + * |key| does not exist. */ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key); @@ -213,16 +243,16 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, * node, it returns the iterator which satisfies ngtcp2_ksl_it_end(it) * != 0. */ -ngtcp2_ksl_it ngtcp2_ksl_lower_bound(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key); /* - * ngtcp2_ksl_lower_bound_compar works like ngtcp2_ksl_lower_bound, - * but it takes custom function |compar| to do lower bound search. + * ngtcp2_ksl_lower_bound_search works like ngtcp2_ksl_lower_bound, + * but it takes custom function |search| to do lower bound search. */ -ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, - ngtcp2_ksl_compar compar); + ngtcp2_ksl_search search); /* * ngtcp2_ksl_update_key replaces the key of nodes which has |old_key| @@ -235,7 +265,8 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, /* * ngtcp2_ksl_begin returns the iterator which points to the first * node. If there is no node in |ksl|, it returns the iterator which - * satisfies ngtcp2_ksl_it_end(it) != 0. + * satisfies both ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0. */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl); @@ -243,14 +274,15 @@ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl); * ngtcp2_ksl_end returns the iterator which points to the node * following the last node. The returned object satisfies * ngtcp2_ksl_it_end(). If there is no node in |ksl|, it returns the - * iterator which satisfies ngtcp2_ksl_it_begin(it) != 0. + * iterator which satisfies ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0. */ ngtcp2_ksl_it ngtcp2_ksl_end(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_len returns the number of elements stored in |ksl|. */ -size_t ngtcp2_ksl_len(ngtcp2_ksl *ksl); +size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_clear removes all elements stored in |ksl|. @@ -269,8 +301,8 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl); * that the key is of type int64_t. This function should be used for * the debugging purpose only. */ -void ngtcp2_ksl_print(ngtcp2_ksl *ksl); -#endif /* !WIN32 */ +void ngtcp2_ksl_print(const ngtcp2_ksl *ksl); +#endif /* !defined(WIN32) */ /* * ngtcp2_ksl_it_init initializes |it|. @@ -293,8 +325,8 @@ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, */ #define ngtcp2_ksl_it_next(IT) \ (++(IT)->i == (IT)->blk->n && (IT)->blk->next \ - ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ - : 0) + ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ + : 0) /* * ngtcp2_ksl_it_prev moves backward the iterator by one. It is @@ -304,16 +336,16 @@ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, void ngtcp2_ksl_it_prev(ngtcp2_ksl_it *it); /* - * ngtcp2_ksl_it_end returns nonzero if |it| points to the beyond the - * last node. + * ngtcp2_ksl_it_end returns nonzero if |it| points to the one beyond + * the last node. */ #define ngtcp2_ksl_it_end(IT) \ ((IT)->blk->n == (IT)->i && (IT)->blk->next == NULL) /* * ngtcp2_ksl_it_begin returns nonzero if |it| points to the first - * node. |it| might satisfy both ngtcp2_ksl_it_begin(&it) and - * ngtcp2_ksl_it_end(&it) if the skip list has no node. + * node. |it| might satisfy both ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0 if the skip list has no node. */ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); @@ -327,21 +359,67 @@ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); /* * ngtcp2_ksl_range_compar is an implementation of ngtcp2_ksl_compar. - * lhs->ptr and rhs->ptr must point to ngtcp2_range object and the - * function returns nonzero if (const ngtcp2_range *)(lhs->ptr)->begin - * < (const ngtcp2_range *)(rhs->ptr)->begin. + * |lhs| and |rhs| must point to ngtcp2_range object, and the function + * returns nonzero if ((const ngtcp2_range *)lhs)->begin < ((const + * ngtcp2_range *)rhs)->begin. */ int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs); +/* + * ngtcp2_ksl_range_search is an implementation of ngtcp2_ksl_search + * that uses ngtcp2_ksl_range_compar. + */ +size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + /* * ngtcp2_ksl_range_exclusive_compar is an implementation of - * ngtcp2_ksl_compar. lhs->ptr and rhs->ptr must point to - * ngtcp2_range object and the function returns nonzero if (const - * ngtcp2_range *)(lhs->ptr)->begin < (const ngtcp2_range - * *)(rhs->ptr)->begin and the 2 ranges do not intersect. + * ngtcp2_ksl_compar. |lhs| and |rhs| must point to ngtcp2_range + * object, and the function returns nonzero if ((const ngtcp2_range + * *)lhs)->begin < ((const ngtcp2_range *)rhs)->begin, and the 2 + * ranges do not intersect. */ int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs); -#endif /* NGTCP2_KSL_H */ +/* + * ngtcp2_ksl_range_exclusive_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_range_exclusive_compar. + */ +size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_uint64_less is an implementation of ngtcp2_ksl_compar. + * |lhs| and |rhs| must point to uint64_t objects, and the function + * returns nonzero if *(uint64_t *)|lhs| < *(uint64_t *)|rhs|. + */ +int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs); + +/* + * ngtcp2_ksl_uint64_less_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_uint64_less. + */ +size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_int64_greater is an implementation of ngtcp2_ksl_compar. + * |lhs| and |rhs| must point to int64_t objects, and the function + * returns nonzero if *(int64_t *)|lhs| > *(int64_t *)|rhs|. + */ +int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs); + +/* + * ngtcp2_ksl_int64_greater_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_int64_greater. + */ +size_t ngtcp2_ksl_int64_greater_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +#endif /* !defined(NGTCP2_KSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c index 93922a29c319f4..fc4eb443517d40 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c @@ -27,7 +27,7 @@ #include <stdio.h> #ifdef HAVE_UNISTD_H # include <unistd.h> -#endif +#endif /* defined(HAVE_UNISTD_H) */ #include <assert.h> #include <string.h> @@ -99,11 +99,11 @@ void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid, #define NGTCP2_LOG_FRM_HD_FIELDS(DIR) \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "frm", \ - (DIR), hd->pkt_num, strpkttype(hd) + (DIR), hd->pkt_num, strpkttype(hd) #define NGTCP2_LOG_PKT_HD_FIELDS(DIR) \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "pkt", \ - (DIR), hd->pkt_num, strpkttype(hd) + (DIR), hd->pkt_num, strpkttype(hd) #define NGTCP2_LOG_TP_HD_FIELDS \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "cry" @@ -223,12 +223,12 @@ static uint64_t timestamp_cast(uint64_t ns) { return ns / NGTCP2_MILLISECONDS; } static void log_fr_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " fin=%d offset=%" PRIu64 " len=%" PRIu64 " uni=%d"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type | fr->flags, fr->stream_id, - fr->fin, fr->offset, ngtcp2_vec_len(fr->data, fr->datacnt), - (fr->stream_id & 0x2) != 0); + log->user_data, + (NGTCP2_LOG_PKT " STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 + " fin=%d offset=%" PRIu64 " len=%" PRIu64 " uni=%d"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type | fr->flags, fr->stream_id, fr->fin, + fr->offset, ngtcp2_vec_len(fr->data, fr->datacnt), + (fr->stream_id & 0x2) != 0); } static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -236,13 +236,12 @@ static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, int64_t largest_ack, min_ack; size_t i; - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") largest_ack=%" PRId64 - " ack_delay=%" PRIu64 "(%" PRIu64 - ") ack_range_count=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->largest_ack, - fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, fr->ack_delay, - fr->rangecnt); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") largest_ack=%" PRId64 + " ack_delay=%" PRIu64 "(%" PRIu64 ") ack_range_count=%zu"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->largest_ack, + fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, fr->ack_delay, fr->rangecnt); largest_ack = fr->largest_ack; min_ack = fr->largest_ack - (int64_t)fr->first_ack_range; @@ -285,38 +284,37 @@ static void log_fr_reset_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_reset_stream *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RESET_STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " app_error_code=%s(0x%" PRIx64 ") final_size=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - strapperrorcode(fr->app_error_code), fr->app_error_code, fr->final_size); + log->user_data, + (NGTCP2_LOG_PKT " RESET_STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 + " app_error_code=%s(0x%" PRIx64 ") final_size=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, + strapperrorcode(fr->app_error_code), fr->app_error_code, fr->final_size); } static void log_fr_connection_close(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_connection_close *fr, const char *dir) { char reason[256]; - size_t reasonlen = ngtcp2_min(sizeof(reason) - 1, fr->reasonlen); + size_t reasonlen = ngtcp2_min_size(sizeof(reason) - 1, fr->reasonlen); - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " CONNECTION_CLOSE(0x%02" PRIx64 - ") error_code=%s(0x%" PRIx64 ") " - "frame_type=%" PRIx64 - " reason_len=%zu reason=[%s]"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - fr->type == NGTCP2_FRAME_CONNECTION_CLOSE - ? strerrorcode(fr->error_code) - : strapperrorcode(fr->error_code), - fr->error_code, fr->frame_type, fr->reasonlen, - ngtcp2_encode_printable_ascii(reason, fr->reason, reasonlen)); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " CONNECTION_CLOSE(0x%02" PRIx64 + ") error_code=%s(0x%" PRIx64 ") " + "frame_type=%" PRIx64 " reason_len=%zu reason=[%s]"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + fr->type == NGTCP2_FRAME_CONNECTION_CLOSE ? strerrorcode(fr->error_code) + : strapperrorcode(fr->error_code), + fr->error_code, fr->frame_type, fr->reasonlen, + ngtcp2_encode_printable_ascii(reason, fr->reason, reasonlen)); } static void log_fr_max_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_data *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_DATA(0x%02" PRIx64 ") max_data=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_data); + log->user_data, + (NGTCP2_LOG_PKT " MAX_DATA(0x%02" PRIx64 ") max_data=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_data); } static void log_fr_max_stream_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -333,9 +331,9 @@ static void log_fr_max_stream_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, static void log_fr_max_streams(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_streams *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_STREAMS(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + log->user_data, + (NGTCP2_LOG_PKT " MAX_STREAMS(0x%02" PRIx64 ") max_streams=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); } static void log_fr_ping(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -348,9 +346,9 @@ static void log_fr_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_data_blocked *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " DATA_BLOCKED(0x%02" PRIx64 ") offset=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset); + log->user_data, + (NGTCP2_LOG_PKT " DATA_BLOCKED(0x%02" PRIx64 ") offset=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset); } static void log_fr_stream_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -367,9 +365,9 @@ static void log_fr_streams_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_streams_blocked *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAMS_BLOCKED(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + log->user_data, + (NGTCP2_LOG_PKT " STREAMS_BLOCKED(0x%02" PRIx64 ") max_streams=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); } static void log_fr_new_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -379,15 +377,15 @@ static void log_fr_new_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t cid[sizeof(fr->cid.data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64 - " cid=0x%s retire_prior_to=%" PRIu64 - " stateless_reset_token=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq, - (const char *)ngtcp2_encode_hex(cid, fr->cid.data, fr->cid.datalen), - fr->retire_prior_to, - (const char *)ngtcp2_encode_hex(buf, fr->stateless_reset_token, - sizeof(fr->stateless_reset_token))); + log->user_data, + (NGTCP2_LOG_PKT " NEW_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64 + " cid=0x%s retire_prior_to=%" PRIu64 + " stateless_reset_token=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq, + (const char *)ngtcp2_encode_hex(cid, fr->cid.data, fr->cid.datalen), + fr->retire_prior_to, + (const char *)ngtcp2_encode_hex(buf, fr->stateless_reset_token, + sizeof(fr->stateless_reset_token))); } static void log_fr_stop_sending(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -406,10 +404,10 @@ static void log_fr_path_challenge(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t buf[sizeof(fr->data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_CHALLENGE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + log->user_data, + (NGTCP2_LOG_PKT " PATH_CHALLENGE(0x%02" PRIx64 ") data=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); } static void log_fr_path_response(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -418,19 +416,19 @@ static void log_fr_path_response(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t buf[sizeof(fr->data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_RESPONSE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + log->user_data, + (NGTCP2_LOG_PKT " PATH_RESPONSE(0x%02" PRIx64 ") data=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); } static void log_fr_crypto(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " CRYPTO(0x%02" PRIx64 ") offset=%" PRIu64 - " len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset, - ngtcp2_vec_len(fr->data, fr->datacnt)); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " CRYPTO(0x%02" PRIx64 ") offset=%" PRIu64 " len=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset, + ngtcp2_vec_len(fr->data, fr->datacnt)); } static void log_fr_new_token(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -448,9 +446,9 @@ static void log_fr_new_token(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, p = ngtcp2_encode_hex(buf, fr->token, fr->tokenlen); } log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_TOKEN(0x%02" PRIx64 ") token=0x%s len=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, (const char *)p, fr->tokenlen); + log->user_data, + (NGTCP2_LOG_PKT " NEW_TOKEN(0x%02" PRIx64 ") token=0x%s len=%zu"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, (const char *)p, fr->tokenlen); } static void log_fr_retire_connection_id(ngtcp2_log *log, @@ -458,9 +456,9 @@ static void log_fr_retire_connection_id(ngtcp2_log *log, const ngtcp2_retire_connection_id *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RETIRE_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq); + log->user_data, + (NGTCP2_LOG_PKT " RETIRE_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq); } static void log_fr_handshake_done(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -601,11 +599,11 @@ void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset *sr) { shd.type = NGTCP2_PKT_STATELESS_RESET; log->log_printf( - log->user_data, (NGTCP2_LOG_PKT " token=0x%s randlen=%zu"), - NGTCP2_LOG_PKT_HD_FIELDS("rx"), - (const char *)ngtcp2_encode_hex(buf, sr->stateless_reset_token, - sizeof(sr->stateless_reset_token)), - sr->randlen); + log->user_data, (NGTCP2_LOG_PKT " token=0x%s randlen=%zu"), + NGTCP2_LOG_PKT_HD_FIELDS("rx"), + (const char *)ngtcp2_encode_hex(buf, sr->stateless_reset_token, + sizeof(sr->stateless_reset_token)), + sr->randlen); } void ngtcp2_log_remote_tp(ngtcp2_log *log, @@ -625,10 +623,10 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, if (params->stateless_reset_token_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(token, params->stateless_reset_token, - sizeof(params->stateless_reset_token))); + log->user_data, (NGTCP2_LOG_TP " stateless_reset_token=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(token, params->stateless_reset_token, + sizeof(params->stateless_reset_token))); } if (params->preferred_addr_present) { @@ -639,7 +637,7 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, (NGTCP2_LOG_TP " preferred_address.ipv4_addr=%s"), NGTCP2_LOG_TP_HD_FIELDS, (const char *)ngtcp2_encode_ipv4( - addr, (const uint8_t *)&sa_in->sin_addr)); + addr, (const uint8_t *)&sa_in->sin_addr)); log->log_printf(log->user_data, (NGTCP2_LOG_TP " preferred_address.ipv4_port=%u"), NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in->sin_port)); @@ -652,59 +650,59 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, (NGTCP2_LOG_TP " preferred_address.ipv6_addr=%s"), NGTCP2_LOG_TP_HD_FIELDS, (const char *)ngtcp2_encode_ipv6( - addr, (const uint8_t *)&sa_in6->sin6_addr)); + addr, (const uint8_t *)&sa_in6->sin6_addr)); log->log_printf(log->user_data, (NGTCP2_LOG_TP " preferred_address.ipv6_port=%u"), NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in6->sin6_port)); } log->log_printf( - log->user_data, (NGTCP2_LOG_TP " preferred_address.cid=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->preferred_addr.cid.data, - params->preferred_addr.cid.datalen)); + log->user_data, (NGTCP2_LOG_TP " preferred_address.cid=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->preferred_addr.cid.data, + params->preferred_addr.cid.datalen)); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " preferred_address.stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex( - token, params->preferred_addr.stateless_reset_token, - sizeof(params->preferred_addr.stateless_reset_token))); + log->user_data, + (NGTCP2_LOG_TP " preferred_address.stateless_reset_token=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex( + token, params->preferred_addr.stateless_reset_token, + sizeof(params->preferred_addr.stateless_reset_token))); } if (params->original_dcid_present) { log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " original_destination_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->original_dcid.data, - params->original_dcid.datalen)); + log->user_data, + (NGTCP2_LOG_TP " original_destination_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->original_dcid.data, + params->original_dcid.datalen)); } if (params->retry_scid_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " retry_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->retry_scid.data, - params->retry_scid.datalen)); + log->user_data, (NGTCP2_LOG_TP " retry_source_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->retry_scid.data, + params->retry_scid.datalen)); } if (params->initial_scid_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " initial_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->initial_scid.data, - params->initial_scid.datalen)); + log->user_data, (NGTCP2_LOG_TP " initial_source_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->initial_scid.data, + params->initial_scid.datalen)); } log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_local); + log->user_data, + (NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=%" PRIu64), + NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_local); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_remote); + log->user_data, + (NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=%" PRIu64), + NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_remote); log->log_printf(log->user_data, (NGTCP2_LOG_TP " initial_max_stream_data_uni=%" PRIu64), NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_uni); @@ -742,21 +740,21 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, if (params->version_info_present) { log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.chosen_version=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, params->version_info.chosen_version); + log->user_data, + (NGTCP2_LOG_TP " version_information.chosen_version=0x%08x"), + NGTCP2_LOG_TP_HD_FIELDS, params->version_info.chosen_version); assert(!(params->version_info.available_versionslen & 0x3)); for (i = 0, p = params->version_info.available_versions; i < params->version_info.available_versionslen; i += sizeof(uint32_t)) { - p = ngtcp2_get_uint32(&version, p); + p = ngtcp2_get_uint32be(&version, p); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.available_versions[%zu]=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, i >> 2, version); + log->user_data, + (NGTCP2_LOG_TP " version_information.available_versions[%zu]=0x%08x"), + NGTCP2_LOG_TP_HD_FIELDS, i >> 2, version); } } } @@ -783,18 +781,18 @@ static void log_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, if (hd->type == NGTCP2_PKT_1RTT) { ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, "%s pkn=%" PRId64 " dcid=0x%s type=%s k=%d", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - strpkttype(hd), (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); + log, NGTCP2_LOG_EVENT_PKT, "%s pkn=%" PRId64 " dcid=0x%s type=%s k=%d", + dir, hd->pkt_num, + (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), + strpkttype(hd), (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); } else { ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, - "%s pkn=%" PRId64 " dcid=0x%s scid=0x%s version=0x%08x type=%s len=%zu", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - (const char *)ngtcp2_encode_hex(scid, hd->scid.data, hd->scid.datalen), - hd->version, strpkttype(hd), hd->len); + log, NGTCP2_LOG_EVENT_PKT, + "%s pkn=%" PRId64 " dcid=0x%s scid=0x%s version=0x%08x type=%s len=%zu", + dir, hd->pkt_num, + (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), + (const char *)ngtcp2_encode_hex(scid, hd->scid.data, hd->scid.datalen), + hd->version, strpkttype(hd), hd->len); } } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h index 1280ce04d6385a..13fb81a72e1d51 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -129,4 +129,4 @@ void ngtcp2_log_tx_cancel(ngtcp2_log *log, const ngtcp2_pkt_hd *hd); void ngtcp2_log_info(ngtcp2_log *log, ngtcp2_log_event ev, const char *fmt, ...); -#endif /* NGTCP2_LOG_H */ +#endif /* !defined(NGTCP2_LOG_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h index 28d3461bef9238..dfe5e0aed220f8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h @@ -27,17 +27,14 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <stddef.h> #include <ngtcp2/ngtcp2.h> -#define ngtcp2_min(A, B) ((A) < (B) ? (A) : (B)) -#define ngtcp2_max(A, B) ((A) > (B) ? (A) : (B)) - #define ngtcp2_struct_of(ptr, type, member) \ - ((type *)(void *)((char *)(ptr)-offsetof(type, member))) + ((type *)(void *)((char *)(ptr) - offsetof(type, member))) /* ngtcp2_list_insert inserts |T| before |*PD|. The contract is that this is singly linked list, and the next element is pointed by next @@ -55,4 +52,30 @@ */ #define ngtcp2_arraylen(A) (sizeof(A) / sizeof(A[0])) -#endif /* NGTCP2_MACRO_H */ +#define ngtcp2_max_def(SUFFIX, T) \ + static inline T ngtcp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; } + +ngtcp2_max_def(int8, int8_t) +ngtcp2_max_def(int16, int16_t) +ngtcp2_max_def(int32, int32_t) +ngtcp2_max_def(int64, int64_t) +ngtcp2_max_def(uint8, uint8_t) +ngtcp2_max_def(uint16, uint16_t) +ngtcp2_max_def(uint32, uint32_t) +ngtcp2_max_def(uint64, uint64_t) +ngtcp2_max_def(size, size_t) + +#define ngtcp2_min_def(SUFFIX, T) \ + static inline T ngtcp2_min_##SUFFIX(T a, T b) { return a < b ? a : b; } + +ngtcp2_min_def(int8, int8_t) +ngtcp2_min_def(int16, int16_t) +ngtcp2_min_def(int32, int32_t) +ngtcp2_min_def(int64, int64_t) +ngtcp2_min_def(uint8, uint8_t) +ngtcp2_min_def(uint16, uint16_t) +ngtcp2_min_def(uint32, uint32_t) +ngtcp2_min_def(uint64, uint64_t) +ngtcp2_min_def(size, size_t) + +#endif /* !defined(NGTCP2_MACRO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c index 33e9fcc018b5db..5e4726e63ff7ef 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c @@ -31,12 +31,11 @@ #include "ngtcp2_conv.h" -#define NGTCP2_INITIAL_TABLE_LENBITS 4 +#define NGTCP2_INITIAL_HASHBITS 4 void ngtcp2_map_init(ngtcp2_map *map, const ngtcp2_mem *mem) { map->mem = mem; - map->tablelen = 0; - map->tablelenbits = 0; + map->hashbits = 0; map->table = NULL; map->size = 0; } @@ -49,33 +48,20 @@ void ngtcp2_map_free(ngtcp2_map *map) { ngtcp2_mem_free(map->mem, map->table); } -void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), - void *ptr) { - uint32_t i; - ngtcp2_map_bucket *bkt; - - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { - continue; - } - - func(bkt->data, ptr); - } -} - -int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), +int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; - uint32_t i; + size_t i; ngtcp2_map_bucket *bkt; + size_t tablelen; if (map->size == 0) { return 0; } - for (i = 0; i < map->tablelen; ++i) { + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { @@ -91,82 +77,65 @@ int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), return 0; } -static uint32_t hash(ngtcp2_map_key_type key) { - return (uint32_t)((key * 11400714819323198485llu) >> 32); -} - -static size_t h2idx(uint32_t hash, uint32_t bits) { - return hash >> (32 - bits); -} - -static size_t distance(uint32_t tablelen, uint32_t tablelenbits, - ngtcp2_map_bucket *bkt, size_t idx) { - return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1); +static size_t hash(ngtcp2_map_key_type key, size_t bits) { + return (size_t)((key * 11400714819323198485llu) >> (64 - bits)); } -static void map_bucket_swap(ngtcp2_map_bucket *bkt, uint32_t *phash, - ngtcp2_map_key_type *pkey, void **pdata) { - uint32_t h = bkt->hash; - ngtcp2_map_key_type key = bkt->key; - void *data = bkt->data; - - bkt->hash = *phash; - bkt->key = *pkey; - bkt->data = *pdata; +static void map_bucket_swap(ngtcp2_map_bucket *a, ngtcp2_map_bucket *b) { + ngtcp2_map_bucket c = *a; - *phash = h; - *pkey = key; - *pdata = data; -} - -static void map_bucket_set_data(ngtcp2_map_bucket *bkt, uint32_t hash, - ngtcp2_map_key_type key, void *data) { - bkt->hash = hash; - bkt->key = key; - bkt->data = data; + *a = *b; + *b = c; } #ifndef WIN32 -void ngtcp2_map_print_distance(ngtcp2_map *map) { - uint32_t i; +void ngtcp2_map_print_distance(const ngtcp2_map *map) { + size_t i; size_t idx; ngtcp2_map_bucket *bkt; + size_t tablelen; - for (i = 0; i < map->tablelen; ++i) { + if (map->size == 0) { + return; + } + + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { - fprintf(stderr, "@%u <EMPTY>\n", i); + fprintf(stderr, "@%zu <EMPTY>\n", i); continue; } - idx = h2idx(bkt->hash, map->tablelenbits); - fprintf(stderr, "@%u hash=%08x key=%" PRIu64 " base=%zu distance=%zu\n", i, - bkt->hash, bkt->key, idx, - distance(map->tablelen, map->tablelenbits, bkt, idx)); + idx = hash(bkt->key, map->hashbits); + fprintf(stderr, "@%zu hash=%zu key=%" PRIu64 " base=%zu distance=%u\n", i, + hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); } } -#endif /* !WIN32 */ - -static int insert(ngtcp2_map_bucket *table, uint32_t tablelen, - uint32_t tablelenbits, uint32_t hash, ngtcp2_map_key_type key, - void *data) { - size_t idx = h2idx(hash, tablelenbits); - size_t d = 0, dd; +#endif /* !defined(WIN32) */ + +static int insert(ngtcp2_map_bucket *table, size_t hashbits, + ngtcp2_map_key_type key, void *data) { + size_t idx = hash(key, hashbits); + ngtcp2_map_bucket b = { + .key = key, + .data = data, + }; ngtcp2_map_bucket *bkt; + size_t mask = (1u << hashbits) - 1; for (;;) { bkt = &table[idx]; if (bkt->data == NULL) { - map_bucket_set_data(bkt, hash, key, data); + *bkt = b; return 0; } - dd = distance(tablelen, tablelenbits, bkt, idx); - if (d > dd) { - map_bucket_swap(bkt, &hash, &key, &data); - d = dd; + if (b.psl > bkt->psl) { + map_bucket_swap(bkt, &b); } else if (bkt->key == key) { /* TODO This check is just a waste after first swap or if this function is called from map_resize. That said, there is no @@ -175,41 +144,42 @@ static int insert(ngtcp2_map_bucket *table, uint32_t tablelen, return NGTCP2_ERR_INVALID_ARGUMENT; } - ++d; - idx = (idx + 1) & (tablelen - 1); + ++b.psl; + idx = (idx + 1) & mask; } } -/* new_tablelen must be power of 2 and new_tablelen == (1 << - new_tablelenbits) must hold. */ -static int map_resize(ngtcp2_map *map, uint32_t new_tablelen, - uint32_t new_tablelenbits) { - uint32_t i; +static int map_resize(ngtcp2_map *map, size_t new_hashbits) { + size_t i; ngtcp2_map_bucket *new_table; ngtcp2_map_bucket *bkt; + size_t tablelen; int rv; (void)rv; new_table = - ngtcp2_mem_calloc(map->mem, new_tablelen, sizeof(ngtcp2_map_bucket)); + ngtcp2_mem_calloc(map->mem, 1u << new_hashbits, sizeof(ngtcp2_map_bucket)); if (new_table == NULL) { return NGTCP2_ERR_NOMEM; } - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { - continue; - } - rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key, - bkt->data); + if (map->size) { + tablelen = 1u << map->hashbits; - assert(0 == rv); + for (i = 0; i < tablelen; ++i) { + bkt = &map->table[i]; + if (bkt->data == NULL) { + continue; + } + + rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + + assert(0 == rv); + } } ngtcp2_mem_free(map->mem, map->table); - map->tablelen = new_tablelen; - map->tablelenbits = new_tablelenbits; + map->hashbits = new_hashbits; map->table = new_table; return 0; @@ -221,48 +191,49 @@ int ngtcp2_map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data) { assert(data); /* Load factor is 0.75 */ - if ((map->size + 1) * 4 > map->tablelen * 3) { - if (map->tablelen) { - rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1); + /* Under the very initial condition, that is map->size == 0 and + map->hashbits == 0, 4 > 3 still holds nicely. */ + if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + if (map->hashbits) { + rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, 1 << NGTCP2_INITIAL_TABLE_LENBITS, - NGTCP2_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGTCP2_INITIAL_HASHBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key, - data); + rv = insert(map->table, map->hashbits, key, data); if (rv != 0) { return rv; } + ++map->size; + return 0; } -void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key) { - uint32_t h; +void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key) { size_t idx; ngtcp2_map_bucket *bkt; - size_t d = 0; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NULL; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NULL; } @@ -270,50 +241,47 @@ void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key) { return bkt->data; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key) { - uint32_t h; - size_t idx, didx; - ngtcp2_map_bucket *bkt; - size_t d = 0; + size_t idx; + ngtcp2_map_bucket *b, *bkt; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NGTCP2_ERR_INVALID_ARGUMENT; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NGTCP2_ERR_INVALID_ARGUMENT; } if (bkt->key == key) { - map_bucket_set_data(bkt, 0, 0, NULL); - - didx = idx; - idx = (idx + 1) & (map->tablelen - 1); + b = bkt; + idx = (idx + 1) & mask; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) { + if (bkt->data == NULL || bkt->psl == 0) { + b->data = NULL; break; } - map->table[didx] = *bkt; - map_bucket_set_data(bkt, 0, 0, NULL); - didx = idx; + --bkt->psl; + *b = *bkt; + b = bkt; - idx = (idx + 1) & (map->tablelen - 1); + idx = (idx + 1) & mask; } --map->size; @@ -321,18 +289,18 @@ int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key) { return 0; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } void ngtcp2_map_clear(ngtcp2_map *map) { - if (map->tablelen == 0) { + if (map->size == 0) { return; } - memset(map->table, 0, sizeof(*map->table) * map->tablelen); + memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); map->size = 0; } -size_t ngtcp2_map_size(ngtcp2_map *map) { return map->size; } +size_t ngtcp2_map_size(const ngtcp2_map *map) { return map->size; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h index d05b1657489e45..9d882fb20088d8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -39,7 +39,7 @@ typedef uint64_t ngtcp2_map_key_type; typedef struct ngtcp2_map_bucket { - uint32_t hash; + uint32_t psl; ngtcp2_map_key_type key; void *data; } ngtcp2_map_bucket; @@ -48,33 +48,24 @@ typedef struct ngtcp2_map { ngtcp2_map_bucket *table; const ngtcp2_mem *mem; size_t size; - uint32_t tablelen; - uint32_t tablelenbits; + size_t hashbits; } ngtcp2_map; /* - * Initializes the map |map|. + * ngtcp2_map_init initializes the map |map|. */ void ngtcp2_map_init(ngtcp2_map *map, const ngtcp2_mem *mem); /* - * Deallocates any resources allocated for |map|. The stored entries - * are not freed by this function. Use ngtcp2_map_each_free() to free - * each entries. + * ngtcp2_map_free deallocates any resources allocated for |map|. The + * stored entries are not freed by this function. Use + * ngtcp2_map_each() to free each entry. */ void ngtcp2_map_free(ngtcp2_map *map); /* - * Deallocates each entries using |func| function and any resources - * allocated for |map|. The |func| function is responsible for freeing - * given the |data| object. The |ptr| will be passed to the |func| as - * send argument. The return value of the |func| will be ignored. - */ -void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), - void *ptr); - -/* - * Inserts the new |data| with the |key| to the map |map|. + * ngtcp2_map_insert inserts the new |data| with the |key| to the map + * |map|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -82,57 +73,56 @@ void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), * NGTCP2_ERR_INVALID_ARGUMENT * The item associated by |key| already exists. * NGTCP2_ERR_NOMEM - * Out of memory + * Out of memory */ int ngtcp2_map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data); /* - * Returns the data associated by the key |key|. If there is no such - * data, this function returns NULL. + * ngtcp2_map_find returns the entry associated by the key |key|. If + * there is no such entry, this function returns NULL. */ -void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key); +void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key); /* - * Removes the data associated by the key |key| from the |map|. The - * removed data is not freed by this function. + * ngtcp2_map_remove removes the entry associated by the key |key| + * from the |map|. The removed entry is not freed by this function. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_INVALID_ARGUMENT - * The data associated by |key| does not exist. + * The entry associated by |key| does not exist. */ int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key); /* - * Removes all entries from |map|. + * ngtcp2_map_clear removes all entries from |map|. The removed entry + * is not freed by this function. */ void ngtcp2_map_clear(ngtcp2_map *map); /* - * Returns the number of items stored in the map |map|. + * ngtcp2_map_size returns the number of items stored in the map + * |map|. */ -size_t ngtcp2_map_size(ngtcp2_map *map); +size_t ngtcp2_map_size(const ngtcp2_map *map); /* - * Applies the function |func| to each data in the |map| with the - * optional user supplied pointer |ptr|. + * ngtcp2_map_each applies the function |func| to each entry in the + * |map| with the optional user supplied pointer |ptr|. * * If the |func| returns 0, this function calls the |func| with the - * next data. If the |func| returns nonzero, it will not call the + * next entry. If the |func| returns nonzero, it will not call the * |func| for further entries and return the return value of the * |func| immediately. Thus, this function returns 0 if all the * invocations of the |func| return 0, or nonzero value which the last * invocation of |func| returns. - * - * Don't use this function to free each data. Use - * ngtcp2_map_each_free() instead. */ -int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), +int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), void *ptr); #ifndef WIN32 -void ngtcp2_map_print_distance(ngtcp2_map *map); -#endif /* !WIN32 */ +void ngtcp2_map_print_distance(const ngtcp2_map *map); +#endif /* !defined(WIN32) */ -#endif /* NGTCP2_MAP_H */ +#endif /* !defined(NGTCP2_MAP_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c index bcce0b5cdfcf02..48f430f474f126 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c @@ -51,8 +51,12 @@ static void *default_realloc(void *ptr, size_t size, void *user_data) { return realloc(ptr, size); } -static const ngtcp2_mem mem_default = {NULL, default_malloc, default_free, - default_calloc, default_realloc}; +static const ngtcp2_mem mem_default = { + .malloc = default_malloc, + .free = default_free, + .calloc = default_calloc, + .realloc = default_realloc, +}; const ngtcp2_mem *ngtcp2_mem_default(void) { return &mem_default; } @@ -72,7 +76,7 @@ void *ngtcp2_mem_calloc(const ngtcp2_mem *mem, size_t nmemb, size_t size) { void *ngtcp2_mem_realloc(const ngtcp2_mem *mem, void *ptr, size_t size) { return mem->realloc(ptr, size, mem->user_data); } -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *ngtcp2_mem_malloc_debug(const ngtcp2_mem *mem, size_t size, const char *func, const char *file, size_t line) { void *nptr = mem->malloc(size, mem->user_data); @@ -110,4 +114,4 @@ void *ngtcp2_mem_realloc_debug(const ngtcp2_mem *mem, void *ptr, size_t size, return nptr; } -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h index c99b6c59726891..9f818752125523 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -42,7 +42,7 @@ void ngtcp2_mem_free(const ngtcp2_mem *mem, void *ptr); void *ngtcp2_mem_calloc(const ngtcp2_mem *mem, size_t nmemb, size_t size); void *ngtcp2_mem_realloc(const ngtcp2_mem *mem, void *ptr, size_t size); -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *ngtcp2_mem_malloc_debug(const ngtcp2_mem *mem, size_t size, const char *func, const char *file, size_t line); @@ -67,6 +67,6 @@ void *ngtcp2_mem_realloc_debug(const ngtcp2_mem *mem, void *ptr, size_t size, # define ngtcp2_mem_realloc(MEM, PTR, SIZE) \ ngtcp2_mem_realloc_debug((MEM), (PTR), (SIZE), __func__, __FILE__, __LINE__) -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ -#endif /* NGTCP2_MEM_H */ +#endif /* !defined(NGTCP2_MEM_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h index 4a2c4041d4d170..103a2fb2d80714 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h @@ -30,70 +30,68 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #ifdef HAVE_ARPA_INET_H # include <arpa/inet.h> -#endif /* HAVE_ARPA_INET_H */ +#endif /* defined(HAVE_ARPA_INET_H) */ #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> -#endif /* HAVE_NETINET_IN_H */ +#endif /* defined(HAVE_NETINET_IN_H) */ #ifdef HAVE_BYTESWAP_H # include <byteswap.h> -#endif /* HAVE_BYTESWAP_H */ +#endif /* defined(HAVE_BYTESWAP_H) */ #ifdef HAVE_ENDIAN_H # include <endian.h> -#endif /* HAVE_ENDIAN_H */ +#endif /* defined(HAVE_ENDIAN_H) */ #ifdef HAVE_SYS_ENDIAN_H # include <sys/endian.h> -#endif /* HAVE_SYS_ENDIAN_H */ +#endif /* defined(HAVE_SYS_ENDIAN_H) */ -#if defined(__APPLE__) +#ifdef __APPLE__ # include <libkern/OSByteOrder.h> -#endif // __APPLE__ +#endif /* defined(__APPLE__) */ #include <ngtcp2/ngtcp2.h> -#if defined(HAVE_BE64TOH) || \ - (defined(HAVE_DECL_BE64TOH) && HAVE_DECL_BE64TOH > 0) +#if HAVE_DECL_BE64TOH # define ngtcp2_ntohl64(N) be64toh(N) # define ngtcp2_htonl64(N) htobe64(N) -#else /* !HAVE_BE64TOH */ -# if defined(WORDS_BIGENDIAN) +#else /* !HAVE_DECL_BE64TOH */ +# ifdef WORDS_BIGENDIAN # define ngtcp2_ntohl64(N) (N) # define ngtcp2_htonl64(N) (N) -# else /* !WORDS_BIGENDIAN */ -# if defined(HAVE_BSWAP_64) || \ - (defined(HAVE_DECL_BSWAP_64) && HAVE_DECL_BSWAP_64 > 0) +# else /* !defined(WORDS_BIGENDIAN) */ +# if HAVE_DECL_BSWAP_64 # define ngtcp2_bswap64 bswap_64 # elif defined(WIN32) # define ngtcp2_bswap64 _byteswap_uint64 # elif defined(__APPLE__) # define ngtcp2_bswap64 OSSwapInt64 -# else /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define ngtcp2_bswap64(N) \ ((uint64_t)(ngtcp2_ntohl((uint32_t)(N))) << 32 | \ ngtcp2_ntohl((uint32_t)((N) >> 32))) -# endif /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# endif /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define ngtcp2_ntohl64(N) ngtcp2_bswap64(N) # define ngtcp2_htonl64(N) ngtcp2_bswap64(N) -# endif /* !WORDS_BIGENDIAN */ -#endif /* !HAVE_BE64TOH */ +# endif /* !defined(WORDS_BIGENDIAN) */ +#endif /* !HAVE_DECL_BE64TOH */ -#if defined(WIN32) +#ifdef WIN32 /* Windows requires ws2_32 library for ntonl family functions. We define inline functions for those function so that we don't have dependency on that lib. */ # ifdef _MSC_VER # define STIN static __inline -# else +# else /* !defined(_MSC_VER) */ # define STIN static inline -# endif +# endif /* !defined(_MSC_VER) */ STIN uint32_t ngtcp2_htonl(uint32_t hostlong) { uint32_t res; @@ -131,13 +129,13 @@ STIN uint16_t ngtcp2_ntohs(uint16_t netshort) { return res; } -#else /* !WIN32 */ +#else /* !defined(WIN32) */ # define ngtcp2_htonl htonl # define ngtcp2_htons htons # define ngtcp2_ntohl ntohl # define ngtcp2_ntohs ntohs -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -#endif /* NGTCP2_NET_H */ +#endif /* !defined(NGTCP2_NET_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h index ea73e788317681..cf23de7b2b7f20 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -67,9 +67,9 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); #ifndef NOMEMPOOL # define ngtcp2_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void ngtcp2_objalloc_##NAME##_init( \ - ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ + ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ TYPE *ngtcp2_objalloc_##NAME##_get(ngtcp2_objalloc *objalloc); \ @@ -78,7 +78,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); size_t len); \ \ inline static void ngtcp2_objalloc_##NAME##_release( \ - ngtcp2_objalloc *objalloc, TYPE *obj) { \ + ngtcp2_objalloc *objalloc, TYPE *obj) { \ ngtcp2_opl_push(&objalloc->opl, &obj->OPLENTFIELD); \ } @@ -90,7 +90,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); \ if (!oplent) { \ rv = \ - ngtcp2_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ + ngtcp2_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ if (rv != 0) { \ return NULL; \ } \ @@ -118,30 +118,30 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); \ return ngtcp2_struct_of(oplent, TYPE, OPLENTFIELD); \ } -#else /* NOMEMPOOL */ +#else /* defined(NOMEMPOOL) */ # define ngtcp2_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void ngtcp2_objalloc_##NAME##_init( \ - ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ + ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ inline static TYPE *ngtcp2_objalloc_##NAME##_get( \ - ngtcp2_objalloc *objalloc) { \ + ngtcp2_objalloc *objalloc) { \ return ngtcp2_mem_malloc(objalloc->balloc.mem, sizeof(TYPE)); \ } \ \ inline static TYPE *ngtcp2_objalloc_##NAME##_len_get( \ - ngtcp2_objalloc *objalloc, size_t len) { \ + ngtcp2_objalloc *objalloc, size_t len) { \ return ngtcp2_mem_malloc(objalloc->balloc.mem, len); \ } \ \ inline static void ngtcp2_objalloc_##NAME##_release( \ - ngtcp2_objalloc *objalloc, TYPE *obj) { \ + ngtcp2_objalloc *objalloc, TYPE *obj) { \ ngtcp2_mem_free(objalloc->balloc.mem, obj); \ } # define ngtcp2_objalloc_def(NAME, TYPE, OPLENTFIELD) -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ -#endif /* NGTCP2_OBJALLOC_H */ +#endif /* !defined(NGTCP2_OBJALLOC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h index 714aa366304f0d..f2df3f6dccd45e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -62,4 +62,4 @@ ngtcp2_opl_entry *ngtcp2_opl_pop(ngtcp2_opl *opl); void ngtcp2_opl_clear(ngtcp2_opl *opl); -#endif /* NGTCP2_OPL_H */ +#endif /* !defined(NGTCP2_OPL_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h index 0c360e936231c8..a708378db32fbb 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -46,4 +46,4 @@ void ngtcp2_path_init(ngtcp2_path *path, const ngtcp2_addr *local, void ngtcp2_path_storage_init2(ngtcp2_path_storage *ps, const ngtcp2_path *path); -#endif /* NGTCP2_PATH_H */ +#endif /* !defined(NGTCP2_PATH_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c index 1687ff254d94c7..d78978492ca8e7 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c @@ -83,16 +83,19 @@ int ngtcp2_pkt_decode_version_cid(ngtcp2_version_cid *dest, const uint8_t *data, dcidlen = data[5]; len += dcidlen; + if (datalen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } + scidlen = data[5 + 1 + dcidlen]; len += scidlen; + if (datalen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } - ngtcp2_get_uint32(&version, &data[1]); + ngtcp2_get_uint32be(&version, &data[1]); supported_version = ngtcp2_is_supported_version(version); @@ -120,6 +123,7 @@ int ngtcp2_pkt_decode_version_cid(ngtcp2_version_cid *dest, const uint8_t *data, if (!supported_version) { return NGTCP2_ERR_VERSION_NEGOTIATION; } + return 0; } @@ -141,26 +145,28 @@ int ngtcp2_pkt_decode_version_cid(ngtcp2_version_cid *dest, const uint8_t *data, void ngtcp2_pkt_hd_init(ngtcp2_pkt_hd *hd, uint8_t flags, uint8_t type, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - int64_t pkt_num, size_t pkt_numlen, uint32_t version, - size_t len) { + int64_t pkt_num, size_t pkt_numlen, uint32_t version) { hd->flags = flags; hd->type = type; + if (dcid) { hd->dcid = *dcid; } else { ngtcp2_cid_zero(&hd->dcid); } + if (scid) { hd->scid = *scid; } else { ngtcp2_cid_zero(&hd->scid); } + hd->pkt_num = pkt_num; hd->token = NULL; hd->tokenlen = 0; hd->pkt_numlen = pkt_numlen; hd->version = version; - hd->len = len; + hd->len = 0; } ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, @@ -170,10 +176,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, size_t dcil, scil; const uint8_t *p; size_t len = 0; - size_t n; size_t ntokenlen = 0; const uint8_t *token = NULL; size_t tokenlen = 0; + size_t nlonglen = 0; + size_t longlen = 0; uint64_t vi; uint8_t flags = NGTCP2_PKT_FLAG_LONG_FORM; @@ -185,7 +192,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, return NGTCP2_ERR_INVALID_ARGUMENT; } - ngtcp2_get_uint32(&version, &pkt[1]); + ngtcp2_get_uint32be(&version, &pkt[1]); if (version == 0) { type = NGTCP2_PKT_VERSION_NEGOTIATION; @@ -227,6 +234,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, p = &pkt[5]; dcil = *p; + if (dcil > NGTCP2_MAX_CIDLEN) { /* QUIC v1 implementation never expect to receive CID length more than NGTCP2_MAX_CIDLEN. */ @@ -240,9 +248,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, p += 1 + dcil; scil = *p; + if (scil > NGTCP2_MAX_CIDLEN) { return NGTCP2_ERR_INVALID_ARGUMENT; } + len += scil; if (pktlen < len) { @@ -264,6 +274,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, if (pktlen - len < vi) { return NGTCP2_ERR_INVALID_ARGUMENT; } + tokenlen = (size_t)vi; len += tokenlen; @@ -285,12 +296,21 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, } /* Length */ - n = ngtcp2_get_uvarintlen(p); - len += n - 1; + nlonglen = ngtcp2_get_uvarintlen(p); + len += nlonglen - 1; if (pktlen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } + + ngtcp2_get_uvarint(&vi, p); +#if SIZE_MAX > UINT32_MAX + if (vi > SIZE_MAX) { + return NGTCP2_ERR_INVALID_ARGUMENT; + } +#endif /* SIZE_MAX > UINT32_MAX */ + + longlen = (size_t)vi; } dest->flags = flags; @@ -309,24 +329,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, dest->tokenlen = tokenlen; p += ntokenlen + tokenlen; - switch (type) { - case NGTCP2_PKT_RETRY: - dest->len = 0; - break; - default: - if (!(flags & NGTCP2_PKT_FLAG_LONG_FORM)) { - assert(type == NGTCP2_PKT_VERSION_NEGOTIATION); - /* Version Negotiation is not a long header packet. */ - dest->len = 0; - break; - } + dest->len = longlen; - p = ngtcp2_get_uvarint(&vi, p); - if (vi > SIZE_MAX) { - return NGTCP2_ERR_INVALID_ARGUMENT; - } - dest->len = (size_t)vi; - } +#ifndef NDEBUG + p += nlonglen; +#endif /* !defined(NDEBUG) */ assert((size_t)(p - pkt) == len); @@ -401,6 +408,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, *p = (uint8_t)(NGTCP2_HEADER_FORM_BIT | (ngtcp2_pkt_versioned_type(hd->version, hd->type) << 4) | (uint8_t)(hd->pkt_numlen - 1)); + if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { *p |= NGTCP2_FIXED_BIT_MASK; } @@ -409,16 +417,20 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, p = ngtcp2_put_uint32be(p, hd->version); *p++ = (uint8_t)hd->dcid.datalen; + if (hd->dcid.datalen) { p = ngtcp2_cpymem(p, hd->dcid.data, hd->dcid.datalen); } + *p++ = (uint8_t)hd->scid.datalen; + if (hd->scid.datalen) { p = ngtcp2_cpymem(p, hd->scid.data, hd->scid.datalen); } if (hd->type == NGTCP2_PKT_INITIAL) { p = ngtcp2_put_uvarint(p, hd->tokenlen); + if (hd->tokenlen) { p = ngtcp2_cpymem(p, hd->token, hd->tokenlen); } @@ -446,9 +458,11 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_short(uint8_t *out, size_t outlen, p = out; *p = (uint8_t)(hd->pkt_numlen - 1); + if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { *p |= NGTCP2_FIXED_BIT_MASK; } + if (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) { *p |= NGTCP2_SHORT_KEY_PHASE_BIT; } @@ -503,7 +517,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payloadlen); case NGTCP2_FRAME_STREAM_DATA_BLOCKED: return ngtcp2_pkt_decode_stream_data_blocked_frame( - &dest->stream_data_blocked, payload, payloadlen); + &dest->stream_data_blocked, payload, payloadlen); case NGTCP2_FRAME_STREAMS_BLOCKED_BIDI: case NGTCP2_FRAME_STREAMS_BLOCKED_UNI: return ngtcp2_pkt_decode_streams_blocked_frame(&dest->streams_blocked, @@ -530,7 +544,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payloadlen); case NGTCP2_FRAME_RETIRE_CONNECTION_ID: return ngtcp2_pkt_decode_retire_connection_id_frame( - &dest->retire_connection_id, payload, payloadlen); + &dest->retire_connection_id, payload, payloadlen); case NGTCP2_FRAME_HANDSHAKE_DONE: return ngtcp2_pkt_decode_handshake_done_frame(&dest->handshake_done, payload, payloadlen); @@ -613,6 +627,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_stream_frame(ngtcp2_stream *dest, if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + datalen = (size_t)vi; len += datalen; } else { @@ -752,7 +767,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, } /* TODO We might not decode all ranges. It could be very large. */ - max_rangecnt = ngtcp2_min(NGTCP2_MAX_ACK_RANGES, rangecnt); + max_rangecnt = ngtcp2_min_size(NGTCP2_MAX_ACK_RANGES, rangecnt); p = payload + 1; @@ -770,7 +785,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, p = ngtcp2_get_uvarint(&range->gap, p); p = ngtcp2_get_uvarint(&range->len, p); } - for (i = max_rangecnt; i < rangecnt; ++i) { + + for (; i < rangecnt; ++i) { p += ngtcp2_get_uvarintlen(p); p += ngtcp2_get_uvarintlen(p); } @@ -820,18 +836,23 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -849,7 +870,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, } ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( - ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t reasonlen; @@ -868,6 +889,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -879,6 +901,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -888,6 +911,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( nreasonlen = ngtcp2_get_uvarintlen(p); len += nreasonlen - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -896,6 +920,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + reasonlen = (size_t)vi; len += reasonlen; @@ -903,13 +928,16 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( dest->type = type; p = ngtcp2_get_uvarint(&dest->error_code, p); + if (type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = ngtcp2_get_uvarint(&dest->frame_type, p); } else { dest->frame_type = 0; } + dest->reasonlen = reasonlen; p += nreasonlen; + if (reasonlen == 0) { dest->reason = NULL; } else { @@ -951,7 +979,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_max_data_frame(ngtcp2_max_data *dest, } ngtcp2_ssize ngtcp2_pkt_decode_max_stream_data_frame( - ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t n; @@ -1055,10 +1083,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_data_blocked_frame(ngtcp2_data_blocked *dest, return (ngtcp2_ssize)len; } -ngtcp2_ssize -ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, - const uint8_t *payload, - size_t payloadlen) { +ngtcp2_ssize ngtcp2_pkt_decode_stream_data_blocked_frame( + ngtcp2_stream_data_blocked *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t n; @@ -1097,7 +1123,7 @@ ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, } ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( - ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1; const uint8_t *p; size_t n; @@ -1124,7 +1150,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( } ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( - ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1 + 1 + 16; const uint8_t *p; size_t n; @@ -1138,6 +1164,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1146,6 +1173,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1197,6 +1225,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_stop_sending_frame(ngtcp2_stop_sending *dest, if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; @@ -1307,6 +1336,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_crypto_frame(ngtcp2_stream *dest, p = ngtcp2_get_uvarint(&dest->offset, p); dest->data[0].len = datalen; p += ndatalen; + if (dest->data[0].len) { dest->data[0].base = (uint8_t *)p; p += dest->data[0].len; @@ -1347,6 +1377,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_token_frame(ngtcp2_new_token *dest, if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + datalen = (size_t)vi; len += datalen; @@ -1442,6 +1473,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_datagram_frame(ngtcp2_datagram *dest, datalen = (size_t)vi; len += datalen; + break; default: ngtcp2_unreachable(); @@ -1496,7 +1528,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_frame(uint8_t *out, size_t outlen, return ngtcp2_pkt_encode_data_blocked_frame(out, outlen, &fr->data_blocked); case NGTCP2_FRAME_STREAM_DATA_BLOCKED: return ngtcp2_pkt_encode_stream_data_blocked_frame( - out, outlen, &fr->stream_data_blocked); + out, outlen, &fr->stream_data_blocked); case NGTCP2_FRAME_STREAMS_BLOCKED_BIDI: case NGTCP2_FRAME_STREAMS_BLOCKED_UNI: return ngtcp2_pkt_encode_streams_blocked_frame(out, outlen, @@ -1518,7 +1550,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_frame(uint8_t *out, size_t outlen, return ngtcp2_pkt_encode_new_token_frame(out, outlen, &fr->new_token); case NGTCP2_FRAME_RETIRE_CONNECTION_ID: return ngtcp2_pkt_encode_retire_connection_id_frame( - out, outlen, &fr->retire_connection_id); + out, outlen, &fr->retire_connection_id); case NGTCP2_FRAME_HANDSHAKE_DONE: return ngtcp2_pkt_encode_handshake_done_frame(out, outlen, &fr->handshake_done); @@ -1586,7 +1618,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_ack_frame(uint8_t *out, size_t outlen, - ngtcp2_ack *fr) { + const ngtcp2_ack *fr) { size_t len = 1 + ngtcp2_put_uvarintlen((uint64_t)fr->largest_ack) + ngtcp2_put_uvarintlen(fr->ack_delay) + ngtcp2_put_uvarintlen(fr->rangecnt) + @@ -1676,8 +1708,8 @@ ngtcp2_pkt_encode_connection_close_frame(uint8_t *out, size_t outlen, const ngtcp2_connection_close *fr) { size_t len = 1 + ngtcp2_put_uvarintlen(fr->error_code) + (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE - ? ngtcp2_put_uvarintlen(fr->frame_type) - : 0) + + ? ngtcp2_put_uvarintlen(fr->frame_type) + : 0) + ngtcp2_put_uvarintlen(fr->reasonlen) + fr->reasonlen; uint8_t *p; @@ -1689,10 +1721,13 @@ ngtcp2_pkt_encode_connection_close_frame(uint8_t *out, size_t outlen, *p++ = (uint8_t)fr->type; p = ngtcp2_put_uvarint(p, fr->error_code); + if (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = ngtcp2_put_uvarint(p, fr->frame_type); } + p = ngtcp2_put_uvarint(p, fr->reasonlen); + if (fr->reasonlen) { p = ngtcp2_cpymem(p, fr->reason, fr->reasonlen); } @@ -1796,7 +1831,7 @@ ngtcp2_pkt_encode_data_blocked_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_stream_data_blocked_frame( - uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr) { + uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr) { size_t len = 1 + ngtcp2_put_uvarintlen((uint64_t)fr->stream_id) + ngtcp2_put_uvarintlen(fr->offset); uint8_t *p; @@ -1986,7 +2021,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_retire_connection_id_frame( - uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr) { + uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr) { size_t len = 1 + ngtcp2_put_uvarintlen(fr->seq); uint8_t *p; @@ -2023,9 +2058,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, const ngtcp2_datagram *fr) { uint64_t datalen = ngtcp2_vec_len(fr->data, fr->datacnt); uint64_t len = - 1 + - (fr->type == NGTCP2_FRAME_DATAGRAM ? 0 : ngtcp2_put_uvarintlen(datalen)) + - datalen; + 1 + + (fr->type == NGTCP2_FRAME_DATAGRAM ? 0 : ngtcp2_put_uvarintlen(datalen)) + + datalen; uint8_t *p; size_t i; @@ -2039,6 +2074,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, p = out; *p++ = (uint8_t)fr->type; + if (fr->type == NGTCP2_FRAME_DATAGRAM_LEN) { p = ngtcp2_put_uvarint(p, datalen); } @@ -2055,9 +2091,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( - uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, - size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, - size_t nsv) { + uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, + size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, + size_t nsv) { size_t len = 1 + 4 + 1 + dcidlen + 1 + scidlen + nsv * 4; uint8_t *p; size_t i; @@ -2074,10 +2110,13 @@ ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( *p++ = 0xc0 | unused_random; p = ngtcp2_put_uint32be(p, 0); *p++ = (uint8_t)dcidlen; + if (dcidlen) { p = ngtcp2_cpymem(p, dcid, dcidlen); } + *p++ = (uint8_t)scidlen; + if (scidlen) { p = ngtcp2_cpymem(p, scid, scidlen); } @@ -2099,7 +2138,7 @@ size_t ngtcp2_pkt_decode_version_negotiation(uint32_t *dest, assert((payloadlen % sizeof(uint32_t)) == 0); for (; payload != end;) { - payload = ngtcp2_get_uint32(dest++, payload); + payload = ngtcp2_get_uint32be(dest++, payload); } return payloadlen / sizeof(uint32_t); @@ -2150,13 +2189,15 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, assert(cand <= (int64_t)NGTCP2_MAX_VARINT - win); return cand + win; } + if (cand > expected + hwin && cand >= win) { return cand - win; } + return cand; } -int ngtcp2_pkt_validate_ack(ngtcp2_ack *fr, int64_t min_pkt_num) { +int ngtcp2_pkt_validate_ack(const ngtcp2_ack *fr, int64_t min_pkt_num) { int64_t largest_ack = fr->largest_ack; size_t i; @@ -2208,7 +2249,7 @@ ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, p = dest; - randlen = ngtcp2_min(destlen - NGTCP2_STATELESS_RESET_TOKENLEN, randlen); + randlen = ngtcp2_min_size(destlen - NGTCP2_STATELESS_RESET_TOKENLEN, randlen); p = ngtcp2_cpymem(p, rand, randlen); p = ngtcp2_cpymem(p, stateless_reset_token, NGTCP2_STATELESS_RESET_TOKENLEN); @@ -2218,10 +2259,10 @@ ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, } ngtcp2_ssize ngtcp2_pkt_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx) { ngtcp2_pkt_hd hd; uint8_t pseudo_retry[1500]; ngtcp2_ssize pseudo_retrylen; @@ -2243,12 +2284,11 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( } ngtcp2_pkt_hd_init(&hd, NGTCP2_PKT_FLAG_LONG_FORM, NGTCP2_PKT_RETRY, dcid, - scid, /* pkt_num = */ 0, /* pkt_numlen = */ 1, version, - /* len = */ 0); + scid, /* pkt_num = */ 0, /* pkt_numlen = */ 1, version); pseudo_retrylen = - ngtcp2_pkt_encode_pseudo_retry(pseudo_retry, sizeof(pseudo_retry), &hd, - /* unused = */ 0, odcid, token, tokenlen); + ngtcp2_pkt_encode_pseudo_retry(pseudo_retry, sizeof(pseudo_retry), &hd, + /* unused = */ 0, odcid, token, tokenlen); if (pseudo_retrylen < 0) { return pseudo_retrylen; } @@ -2285,8 +2325,8 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( } ngtcp2_ssize ngtcp2_pkt_encode_pseudo_retry( - uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, - const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen) { + uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, + const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen) { uint8_t *p = dest; ngtcp2_ssize nwrite; @@ -2382,23 +2422,23 @@ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, if (left > 8 + 1073741823 && len > 1073741823) { #if SIZE_MAX > UINT32_MAX - len = ngtcp2_min(len, 4611686018427387903lu); + len = ngtcp2_min_uint64(len, 4611686018427387903lu); #endif /* SIZE_MAX > UINT32_MAX */ - return (size_t)ngtcp2_min(len, (uint64_t)(left - 8)); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 8)); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min(len, 1073741823); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 4)); + len = ngtcp2_min_uint64(len, 1073741823); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 4)); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min(len, 16383); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 2)); + len = ngtcp2_min_uint64(len, 16383); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 2)); } - len = ngtcp2_min(len, 63); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 1)); + len = ngtcp2_min_uint64(len, 63); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 1)); } size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { @@ -2414,23 +2454,23 @@ size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { if (left > 8 + 1073741823 && len > 1073741823) { #if SIZE_MAX > UINT32_MAX - len = ngtcp2_min(len, 4611686018427387903lu); + len = ngtcp2_min_size(len, 4611686018427387903lu); #endif /* SIZE_MAX > UINT32_MAX */ - return ngtcp2_min(len, left - 8); + return ngtcp2_min_size(len, left - 8); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min(len, 1073741823); - return ngtcp2_min(len, left - 4); + len = ngtcp2_min_size(len, 1073741823); + return ngtcp2_min_size(len, left - 4); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min(len, 16383); - return ngtcp2_min(len, left - 2); + len = ngtcp2_min_size(len, 16383); + return ngtcp2_min_size(len, left - 2); } - len = ngtcp2_min(len, 63); - return ngtcp2_min(len, left - 1); + len = ngtcp2_min_size(len, 63); + return ngtcp2_min_size(len, left - 1); } size_t ngtcp2_pkt_datagram_framelen(size_t len) { @@ -2528,5 +2568,6 @@ int ngtcp2_pkt_verify_reserved_bits(uint8_t c) { if (c & NGTCP2_HEADER_FORM_BIT) { return (c & NGTCP2_LONG_RESERVED_BIT_MASK) == 0 ? 0 : NGTCP2_ERR_PROTO; } + return (c & NGTCP2_SHORT_RESERVED_BIT_MASK) == 0 ? 0 : NGTCP2_ERR_PROTO; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h index feec4d32c97bdd..756076e7a7f258 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -41,7 +41,6 @@ #define NGTCP2_LONG_RESERVED_BIT_MASK 0x0c /* Short header specific macros */ -#define NGTCP2_SHORT_SPIN_BIT_MASK 0x20 #define NGTCP2_SHORT_RESERVED_BIT_MASK 0x18 #define NGTCP2_SHORT_KEY_PHASE_BIT 0x04 @@ -53,10 +52,15 @@ LENGTH<1> + PKN<1> */ #define NGTCP2_MIN_LONG_HEADERLEN (1 + 4 + 1 + 1 + 1 + 1) +/* STREAM frame specific macros */ #define NGTCP2_STREAM_FIN_BIT 0x01 #define NGTCP2_STREAM_LEN_BIT 0x02 #define NGTCP2_STREAM_OFF_BIT 0x04 +/* NGTCP2_MIN_QUIC_PKTLEN is the minimum length of a valid QUIC + packet. */ +#define NGTCP2_MIN_QUIC_PKTLEN 21 + /* NGTCP2_STREAM_OVERHEAD is the maximum number of bytes required other than payload for STREAM frame. That is from type field to the beginning of the payload. */ @@ -72,9 +76,6 @@ the beginning of the payload. */ #define NGTCP2_DATAGRAM_OVERHEAD (1 + 8) -/* NGTCP2_MIN_FRAME_PAYLOADLEN is the minimum frame payload length. */ -#define NGTCP2_MIN_FRAME_PAYLOADLEN 16 - /* NGTCP2_MAX_SERVER_STREAM_ID_BIDI is the maximum bidirectional server stream ID. */ #define NGTCP2_MAX_SERVER_STREAM_ID_BIDI ((int64_t)0x3ffffffffffffffdll) @@ -95,16 +96,15 @@ /* NGTCP2_MAX_PKT_NUM is the maximum packet number. */ #define NGTCP2_MAX_PKT_NUM ((int64_t)((1ll << 62) - 1)) -/* NGTCP2_MIN_PKT_EXPANDLEN is the minimum packet size expansion in - addition to the minimum DCID length to hide/trigger Stateless - Reset. */ +/* NGTCP2_MIN_PKT_EXPANDLEN is the minimum packet size expansion to + hide/trigger Stateless Reset. */ #define NGTCP2_MIN_PKT_EXPANDLEN 22 /* NGTCP2_RETRY_TAGLEN is the length of Retry packet integrity tag. */ #define NGTCP2_RETRY_TAGLEN 16 -/* NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE is the maximum UDP payload size - that this library can write. */ +/* NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE is the maximum UDP datagram + payload size that this library can write. */ #define NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE ((1 << 24) - 1) /* NGTCP2_PKT_LENGTHLEN is the number of bytes that is occupied by @@ -357,6 +357,11 @@ typedef union ngtcp2_frame { ngtcp2_retire_connection_id retire_connection_id; ngtcp2_handshake_done handshake_done; ngtcp2_datagram datagram; + /* Extend ngtcp2_frame so that ngtcp2_stream has at least additional + 3 ngtcp2_vec, totaling 4 slots, which can store HEADERS header, + HEADERS payload, DATA header, and DATA payload in the standard + sized ngtcp2_frame_chain. */ + uint8_t pad[sizeof(ngtcp2_stream) + sizeof(ngtcp2_vec) * 3]; } ngtcp2_frame; typedef struct ngtcp2_pkt_chain ngtcp2_pkt_chain; @@ -371,7 +376,7 @@ struct ngtcp2_pkt_chain { uint8_t *pkt; /* pktlen is length of a QUIC packet. */ size_t pktlen; - /* dgramlen is length of UDP datagram that a QUIC packet is + /* dgramlen is length of UDP datagram payload that a QUIC packet is included. */ size_t dgramlen; ngtcp2_tstamp ts; @@ -403,22 +408,20 @@ void ngtcp2_pkt_chain_del(ngtcp2_pkt_chain *pc, const ngtcp2_mem *mem); /* * ngtcp2_pkt_hd_init initializes |hd| with the given values. If - * |dcid| and/or |scid| is NULL, DCID and SCID of |hd| is empty - * respectively. |pkt_numlen| is the number of bytes used to encode - * |pkt_num| and either 1, 2, or 4. |version| is QUIC version for - * long header. |len| is the length field of Initial, 0RTT, and - * Handshake packets. + * |dcid| and/or |scid| is NULL, Destination Connection ID and/or + * Source Connection ID of |hd| is empty respectively. |pkt_numlen| + * is the number of bytes used to encode |pkt_num| and either 1, 2, or + * 4. |version| is QUIC version for long header. */ void ngtcp2_pkt_hd_init(ngtcp2_pkt_hd *hd, uint8_t flags, uint8_t type, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - int64_t pkt_num, size_t pkt_numlen, uint32_t version, - size_t len); + int64_t pkt_num, size_t pkt_numlen, uint32_t version); /* * ngtcp2_pkt_encode_hd_long encodes |hd| as QUIC long header into * |out| which has length |outlen|. It returns the number of bytes - * written into |outlen| if it succeeds, or one of the following - * negative error codes: + * written into |out| if it succeeds, or one of the following negative + * error codes: * * NGTCP2_ERR_NOBUF * Buffer is too short @@ -429,8 +432,8 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, /* * ngtcp2_pkt_encode_hd_short encodes |hd| as QUIC short header into * |out| which has length |outlen|. It returns the number of bytes - * written into |outlen| if it succeeds, or one of the following - * negative error codes: + * written into |out| if it succeeds, or one of the following negative + * error codes: * * NGTCP2_ERR_NOBUF * Buffer is too short @@ -457,7 +460,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, /** * @function * - * `ngtcp2_pkt_encode_frame` encodes a frame |fm| into the buffer + * `ngtcp2_pkt_encode_frame` encodes a frame |fr| into the buffer * pointed by |out| of length |outlen|. * * This function returns the number of bytes written to the buffer, or @@ -543,7 +546,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, /* * ngtcp2_pkt_decode_padding_frame decodes contiguous PADDING frames * from |payload| of length |payloadlen|. It continues to parse - * frames as long as the frame type is PADDING. This finishes when it + * frames as long as the frame type is PADDING. It finishes when it * encounters the frame type which is not PADDING, or all input data * is read. The first byte (payload[0]) must be NGTCP2_FRAME_PADDING. * This function returns the exact number of bytes read to decode @@ -573,7 +576,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, * ngtcp2_pkt_decode_connection_close_frame decodes CONNECTION_CLOSE * frame from |payload| of length |payloadlen|. The result is stored * in the object pointed by |dest|. CONNECTION_CLOSE frame must start - * at payload[0]. This function finishes it decodes one + * at payload[0]. This function finishes when it decodes one * CONNECTION_CLOSE frame, and returns the exact number of bytes read * to decode a frame if it succeeds, or one of the following negative * error codes: @@ -582,7 +585,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, * Payload is too short to include CONNECTION_CLOSE frame. */ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( - ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_max_data_frame decodes MAX_DATA frame from @@ -612,7 +615,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_max_data_frame(ngtcp2_max_data *dest, * Payload is too short to include MAX_STREAM_DATA frame. */ ngtcp2_ssize ngtcp2_pkt_decode_max_stream_data_frame( - ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_max_streams_frame decodes MAX_STREAMS frame from @@ -668,10 +671,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_data_blocked_frame(ngtcp2_data_blocked *dest, * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include STREAM_DATA_BLOCKED frame. */ -ngtcp2_ssize -ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, - const uint8_t *payload, - size_t payloadlen); +ngtcp2_ssize ngtcp2_pkt_decode_stream_data_blocked_frame( + ngtcp2_stream_data_blocked *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_streams_blocked_frame decodes STREAMS_BLOCKED @@ -686,7 +687,7 @@ ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, * Payload is too short to include STREAMS_BLOCKED frame. */ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( - ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_new_connection_id_frame decodes NEW_CONNECTION_ID @@ -699,11 +700,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( * * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include NEW_CONNECTION_ID frame; or the - * length of CID is strictly less than NGTCP2_MIN_CIDLEN or - * greater than NGTCP2_MAX_CIDLEN. + * length of Connection ID is strictly less than NGTCP2_MIN_CIDLEN + * or greater than NGTCP2_MAX_CIDLEN. */ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( - ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_stop_sending_frame decodes STOP_SENDING frame @@ -784,20 +785,19 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_token_frame(ngtcp2_new_token *dest, size_t payloadlen); /* - * ngtcp2_pkt_decode_retire_connection_id_frame decodes RETIRE_CONNECTION_ID - * frame from |payload| of length |payloadlen|. The result is stored in the - * object pointed by |dest|. RETIRE_CONNECTION_ID frame must start at - * payload[0]. This function finishes when it decodes one RETIRE_CONNECTION_ID - * frame, and returns the exact number of bytes read to decode a frame - * if it succeeds, or one of the following negative error codes: + * ngtcp2_pkt_decode_retire_connection_id_frame decodes + * RETIRE_CONNECTION_ID frame from |payload| of length |payloadlen|. + * The result is stored in the object pointed by |dest|. + * RETIRE_CONNECTION_ID frame must start at payload[0]. This function + * finishes when it decodes one RETIRE_CONNECTION_ID frame, and + * returns the exact number of bytes read to decode a frame if it + * succeeds, or one of the following negative error codes: * * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include RETIRE_CONNECTION_ID frame. */ -ngtcp2_ssize -ngtcp2_pkt_decode_retire_connection_id_frame(ngtcp2_retire_connection_id *dest, - const uint8_t *payload, - size_t payloadlen); +ngtcp2_ssize ngtcp2_pkt_decode_retire_connection_id_frame( + ngtcp2_retire_connection_id *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_handshake_done_frame decodes HANDSHAKE_DONE frame @@ -846,9 +846,6 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, * ngtcp2_pkt_encode_ack_frame encodes ACK frame |fr| into the buffer * pointed by |out| of length |outlen|. * - * This function assigns <the serialized frame type> & - * ~NGTCP2_FRAME_ACK to fr->flags. - * * This function returns the number of bytes written if it succeeds, * or one of the following negative error codes: * @@ -856,7 +853,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_ack_frame(uint8_t *out, size_t outlen, - ngtcp2_ack *fr); + const ngtcp2_ack *fr); /* * ngtcp2_pkt_encode_padding_frame encodes PADDING frame |fr| into the @@ -980,7 +977,7 @@ ngtcp2_pkt_encode_data_blocked_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_stream_data_blocked_frame( - uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr); + uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr); /* * ngtcp2_pkt_encode_streams_blocked_frame encodes STREAMS_BLOCKED @@ -1079,8 +1076,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, const ngtcp2_new_token *fr); /* - * ngtcp2_pkt_encode_retire_connection_id_frame encodes RETIRE_CONNECTION_ID - * frame |fr| into the buffer pointed by |out| of length |outlen|. + * ngtcp2_pkt_encode_retire_connection_id_frame encodes + * RETIRE_CONNECTION_ID frame |fr| into the buffer pointed by |out| of + * length |outlen|. * * This function returns the number of bytes written if it succeeds, * or one of the following negative error codes: @@ -1089,7 +1087,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_retire_connection_id_frame( - uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr); + uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr); /* * ngtcp2_pkt_encode_handshake_done_frame encodes HANDSHAKE_DONE frame @@ -1119,7 +1117,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, const ngtcp2_datagram *fr); /* - * ngtcp2_pkt_adjust_pkt_num find the full 64 bits packet number for + * ngtcp2_pkt_adjust_pkt_num finds the full 62 bits packet number for * |pkt_num|, which is encoded in |pkt_numlen| bytes. The * |max_pkt_num| is the highest successfully authenticated packet * number. @@ -1128,10 +1126,10 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, size_t pkt_numlen); /* - * ngtcp2_pkt_validate_ack checks that ack is malformed or not. - * |min_pkt_num| is the minimum packet number that an endpoint sends. - * It is an error to receive acknowledgements for a packet less than - * |min_pkt_num|. + * ngtcp2_pkt_validate_ack verifies whether |fr| is malformed or not. + * |min_pkt_num| is the minimum packet number that a local endpoint + * sends. It is an error to receive acknowledgements for a packet + * less than |min_pkt_num|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1141,13 +1139,13 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, * NGTCP2_ERR_PROTO * |fr| contains a packet number less than |min_pkt_num|. */ -int ngtcp2_pkt_validate_ack(ngtcp2_ack *fr, int64_t min_pkt_num); +int ngtcp2_pkt_validate_ack(const ngtcp2_ack *fr, int64_t min_pkt_num); /* * ngtcp2_pkt_stream_max_datalen returns the maximum number of bytes * which can be sent for stream denoted by |stream_id|. |offset| is - * an offset of within the stream. |len| is the estimated number of - * bytes to be sent. |left| is the size of buffer. If |left| is too + * an offset within the stream. |len| is the estimated number of + * bytes to send. |left| is the size of buffer. If |left| is too * small to write STREAM frame, this function returns (size_t)-1. */ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, @@ -1155,10 +1153,10 @@ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, /* * ngtcp2_pkt_crypto_max_datalen returns the maximum number of bytes - * which can be sent for crypto stream. |offset| is an offset of - * within the crypto stream. |len| is the estimated number of bytes - * to be sent. |left| is the size of buffer. If |left| is too small - * to write CRYPTO frame, this function returns (size_t)-1. + * which can be sent for crypto stream. |offset| is an offset within + * the crypto stream. |len| is the estimated number of bytes to send. + * |left| is the size of buffer. If |left| is too small to write + * CRYPTO frame, this function returns (size_t)-1. */ size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left); @@ -1191,8 +1189,8 @@ int ngtcp2_pkt_verify_reserved_bits(uint8_t c); * Buffer is too short. */ ngtcp2_ssize ngtcp2_pkt_encode_pseudo_retry( - uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, - const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen); + uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, + const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen); /* * ngtcp2_pkt_verify_retry_tag verifies Retry packet. The buffer @@ -1229,4 +1227,4 @@ uint8_t ngtcp2_pkt_versioned_type(uint32_t version, uint32_t pkt_type); */ uint8_t ngtcp2_pkt_get_type_long(uint32_t version, uint8_t c); -#endif /* NGTCP2_PKT_H */ +#endif /* !defined(NGTCP2_PKT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h index 66b0ee9e6c13cf..9cf8444d32d7eb 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -59,4 +59,4 @@ typedef enum ngtcp2_pktns_id { NGTCP2_PKTNS_ID_MAX } ngtcp2_pktns_id; -#endif /* NGTCP2_PKTNS_ID_H */ +#endif /* !defined(NGTCP2_PKTNS_ID_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c index 771ef5e026d12d..ebd113f6746217 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c @@ -33,18 +33,17 @@ for each probe. */ #define NGTCP2_PMTUD_PROBE_NUM_MAX 3 -static size_t mtu_probes[] = { - 1454 - 48, /* The well known MTU used by a domestic optic fiber - service in Japan. */ - 1390 - 48, /* Typical Tunneled MTU */ - 1280 - 48, /* IPv6 minimum MTU */ - 1492 - 48, /* PPPoE */ +static uint16_t pmtud_default_probes[] = { + 1454 - 48, /* The well known MTU used by a domestic optic fiber + service in Japan. */ + 1390 - 48, /* Typical Tunneled MTU */ + 1280 - 48, /* IPv6 minimum MTU */ + 1492 - 48, /* PPPoE */ }; -#define NGTCP2_MTU_PROBESLEN ngtcp2_arraylen(mtu_probes) - int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, size_t hard_max_udp_payload_size, int64_t tx_pkt_num, + const uint16_t *probes, size_t probeslen, const ngtcp2_mem *mem) { ngtcp2_pmtud *pmtud = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_pmtud)); @@ -61,11 +60,19 @@ int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, pmtud->hard_max_udp_payload_size = hard_max_udp_payload_size; pmtud->min_fail_udp_payload_size = SIZE_MAX; - for (; pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN; ++pmtud->mtu_idx) { - if (mtu_probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { + if (probeslen) { + pmtud->probes = probes; + pmtud->probeslen = probeslen; + } else { + pmtud->probes = pmtud_default_probes; + pmtud->probeslen = ngtcp2_arraylen(pmtud_default_probes); + } + + for (; pmtud->mtu_idx < pmtud->probeslen; ++pmtud->mtu_idx) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { continue; } - if (mtu_probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { break; } } @@ -84,9 +91,9 @@ void ngtcp2_pmtud_del(ngtcp2_pmtud *pmtud) { } size_t ngtcp2_pmtud_probelen(ngtcp2_pmtud *pmtud) { - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); - return mtu_probes[pmtud->mtu_idx]; + return pmtud->probes[pmtud->mtu_idx]; } void ngtcp2_pmtud_probe_sent(ngtcp2_pmtud *pmtud, ngtcp2_duration pto, @@ -107,19 +114,19 @@ int ngtcp2_pmtud_require_probe(ngtcp2_pmtud *pmtud) { } static void pmtud_next_probe(ngtcp2_pmtud *pmtud) { - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); ++pmtud->mtu_idx; pmtud->num_pkts_sent = 0; pmtud->expiry = UINT64_MAX; - for (; pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN; ++pmtud->mtu_idx) { - if (mtu_probes[pmtud->mtu_idx] <= pmtud->max_udp_payload_size || - mtu_probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { + for (; pmtud->mtu_idx < pmtud->probeslen; ++pmtud->mtu_idx) { + if (pmtud->probes[pmtud->mtu_idx] <= pmtud->max_udp_payload_size || + pmtud->probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { continue; } - if (mtu_probes[pmtud->mtu_idx] < pmtud->min_fail_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] < pmtud->min_fail_udp_payload_size) { break; } } @@ -127,11 +134,11 @@ static void pmtud_next_probe(ngtcp2_pmtud *pmtud) { void ngtcp2_pmtud_probe_success(ngtcp2_pmtud *pmtud, size_t payloadlen) { pmtud->max_udp_payload_size = - ngtcp2_max(pmtud->max_udp_payload_size, payloadlen); + ngtcp2_max_size(pmtud->max_udp_payload_size, payloadlen); - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); - if (mtu_probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { return; } @@ -149,12 +156,12 @@ void ngtcp2_pmtud_handle_expiry(ngtcp2_pmtud *pmtud, ngtcp2_tstamp ts) { return; } - pmtud->min_fail_udp_payload_size = - ngtcp2_min(pmtud->min_fail_udp_payload_size, mtu_probes[pmtud->mtu_idx]); + pmtud->min_fail_udp_payload_size = ngtcp2_min_size( + pmtud->min_fail_udp_payload_size, pmtud->probes[pmtud->mtu_idx]); pmtud_next_probe(pmtud); } int ngtcp2_pmtud_finished(ngtcp2_pmtud *pmtud) { - return pmtud->mtu_idx >= NGTCP2_MTU_PROBESLEN; + return pmtud->mtu_idx >= pmtud->probeslen; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h index 6b2e691cfc793a..53fc6a538292e0 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -58,6 +58,10 @@ typedef struct ngtcp2_pmtud { /* min_fail_udp_payload_size is the minimum UDP payload size that is known to fail. */ size_t min_fail_udp_payload_size; + /* probes is the array of UDP datagram payload size to probe. */ + const uint16_t *probes; + /* probeslen is the number of probes pointed by probes. */ + size_t probeslen; } ngtcp2_pmtud; /* @@ -70,6 +74,10 @@ typedef struct ngtcp2_pmtud { * larger than or equal to all UDP payload probe candidates. * Therefore, call ngtcp2_pmtud_finished to check this situation. * + * The array pointed by |pmtud_probes| of length |pmtud_probeslen| + * specifies UDP datagram payload size to probe. If |pmtud_probeslen| + * is zero, the default probes are used. + * * This function returns 0 if it succeeds, or one of the following * negative error codes: * @@ -78,6 +86,7 @@ typedef struct ngtcp2_pmtud { */ int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, size_t hard_max_udp_payload_size, int64_t tx_pkt_num, + const uint16_t *pmtud_probes, size_t pmtud_probeslen, const ngtcp2_mem *mem); /* @@ -120,4 +129,4 @@ void ngtcp2_pmtud_handle_expiry(ngtcp2_pmtud *pmtud, ngtcp2_tstamp ts); */ int ngtcp2_pmtud_finished(ngtcp2_pmtud *pmtud); -#endif /* NGTCP2_PMTUD_H */ +#endif /* !defined(NGTCP2_PMTUD_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c index f7c122b1ab406b..13ef2b24908905 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c @@ -29,11 +29,13 @@ #include "ngtcp2_str.h" #include "ngtcp2_conv.h" +#include "ngtcp2_macro.h" void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen, - ngtcp2_crypto_cc *cc) { + size_t dgram_offset, ngtcp2_crypto_cc *cc) { ngtcp2_buf_init(&ppe->buf, out, outlen); + ppe->dgram_offset = dgram_offset; ppe->hdlen = 0; ppe->len_offset = 0; ppe->pkt_num_offset = 0; @@ -53,17 +55,22 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { if (hd->flags & NGTCP2_PKT_FLAG_LONG_FORM) { ppe->len_offset = 1 + 4 + 1 + hd->dcid.datalen + 1 + hd->scid.datalen; + if (hd->type == NGTCP2_PKT_INITIAL) { ppe->len_offset += ngtcp2_put_uvarintlen(hd->tokenlen) + hd->tokenlen; } + ppe->pkt_num_offset = ppe->len_offset + NGTCP2_PKT_LENGTHLEN; + rv = ngtcp2_pkt_encode_hd_long( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); } else { ppe->pkt_num_offset = 1 + hd->dcid.datalen; + rv = ngtcp2_pkt_encode_hd_short( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); } + if (rv < 0) { return (int)rv; } @@ -72,7 +79,6 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { ppe->pkt_numlen = hd->pkt_numlen; ppe->hdlen = (size_t)rv; - ppe->pkt_num = hd->pkt_num; return 0; @@ -88,7 +94,7 @@ int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr) { } rv = ngtcp2_pkt_encode_frame( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, fr); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, fr); if (rv < 0) { return (int)rv; } @@ -121,8 +127,8 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { if (ppe->len_offset) { ngtcp2_put_uvarint30( - buf->begin + ppe->len_offset, - (uint16_t)(payloadlen + ppe->pkt_numlen + cc->aead.max_overhead)); + buf->begin + ppe->len_offset, + (uint16_t)(payloadlen + ppe->pkt_numlen + cc->aead.max_overhead)); } ngtcp2_crypto_create_nonce(ppe->nonce, cc->ckm->iv.base, cc->ckm->iv.len, @@ -136,7 +142,7 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { buf->last = payload + payloadlen + cc->aead.max_overhead; - /* TODO Check that we have enough space to get sample */ + /* Make sure that we have enough space to get sample */ assert(ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN <= ngtcp2_buf_len(buf)); rv = cc->hp_mask(mask, &cc->hp, &cc->hp_ctx, @@ -164,7 +170,7 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { return (ngtcp2_ssize)ngtcp2_buf_len(buf); } -size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_left(const ngtcp2_ppe *ppe) { ngtcp2_crypto_cc *cc = ppe->cc; if (ngtcp2_buf_left(&ppe->buf) < cc->aead.max_overhead) { @@ -174,57 +180,57 @@ size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe) { return ngtcp2_buf_left(&ppe->buf) - cc->aead.max_overhead; } -size_t ngtcp2_ppe_pktlen(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_pktlen(const ngtcp2_ppe *ppe) { ngtcp2_crypto_cc *cc = ppe->cc; return ngtcp2_buf_len(&ppe->buf) + cc->aead.max_overhead; } -size_t ngtcp2_ppe_padding(ngtcp2_ppe *ppe) { - ngtcp2_crypto_cc *cc = ppe->cc; - ngtcp2_buf *buf = &ppe->buf; - size_t len; - - assert(ngtcp2_buf_left(buf) >= cc->aead.max_overhead); - - len = ngtcp2_buf_left(buf) - cc->aead.max_overhead; - memset(buf->last, 0, len); - buf->last += len; - - return len; -} - -size_t ngtcp2_ppe_padding_hp_sample(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_crypto_cc *cc = ppe->cc; ngtcp2_buf *buf = &ppe->buf; - size_t max_samplelen; + size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; size_t len = 0; + size_t max_samplelen; - assert(cc->aead.max_overhead); + n = ngtcp2_min_size(n, ngtcp2_buf_cap(buf)); + if (pktlen < n) { + len = n - pktlen; + } + /* Ensure header protection sample */ max_samplelen = - ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe); + ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe); + if (max_samplelen < NGTCP2_HP_SAMPLELEN) { - len = NGTCP2_HP_SAMPLELEN - max_samplelen; - assert(ngtcp2_ppe_left(ppe) >= len); - memset(buf->last, 0, len); - buf->last += len; + len = ngtcp2_max_size(len, NGTCP2_HP_SAMPLELEN - max_samplelen); } + assert(ngtcp2_buf_left(buf) >= len + cc->aead.max_overhead); + + buf->last = ngtcp2_setmem(buf->last, 0, len); + return len; } -size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { +size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe) { + return ngtcp2_ppe_dgram_padding_size(ppe, NGTCP2_MAX_UDP_PAYLOAD_SIZE); +} + +size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_crypto_cc *cc = ppe->cc; ngtcp2_buf *buf = &ppe->buf; - size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; + size_t dgramlen = + ppe->dgram_offset + ngtcp2_buf_len(buf) + cc->aead.max_overhead; size_t len; - if (pktlen >= n) { + n = ngtcp2_min_size(n, ppe->dgram_offset + ngtcp2_buf_cap(buf)); + + if (dgramlen >= n) { return 0; } - len = n - pktlen; + len = n - dgramlen; buf->last = ngtcp2_setmem(buf->last, 0, len); return len; @@ -232,5 +238,6 @@ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe) { ngtcp2_buf *buf = &ppe->buf; + return ngtcp2_buf_left(buf) >= (4 - ppe->pkt_numlen) + NGTCP2_HP_SAMPLELEN; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h index 2a069ef33451ab..660b1482b56671 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -36,11 +36,17 @@ #include "ngtcp2_crypto.h" /* - * ngtcp2_ppe is the Protected Packet Encoder. + * ngtcp2_ppe is the QUIC Packet Encoder. */ typedef struct ngtcp2_ppe { + /* buf is the buffer where a QUIC packet is written. */ ngtcp2_buf buf; + /* cc is the encryption context that includes callback functions to + encrypt a QUIC packet, and AEAD cipher, etc. */ ngtcp2_crypto_cc *cc; + /* dgram_offset is the offset in UDP datagram payload that this QUIC + packet is positioned at. */ + size_t dgram_offset; /* hdlen is the number of bytes for packet header written in buf. */ size_t hdlen; /* len_offset is the offset to Length field. */ @@ -53,7 +59,7 @@ typedef struct ngtcp2_ppe { /* pkt_num is the packet number written in buf. */ int64_t pkt_num; /* nonce is the buffer to store nonce. It should be equal or longer - than then length of IV. */ + than the length of IV. */ uint8_t nonce[32]; } ngtcp2_ppe; @@ -61,7 +67,7 @@ typedef struct ngtcp2_ppe { * ngtcp2_ppe_init initializes |ppe| with the given buffer. */ void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen, - ngtcp2_crypto_cc *cc); + size_t dgram_offset, ngtcp2_crypto_cc *cc); /* * ngtcp2_ppe_encode_hd encodes |hd|. @@ -86,7 +92,7 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd); int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr); /* - * ngtcp2_ppe_final encrypts QUIC packet payload. If |**ppkt| is not + * ngtcp2_ppe_final encrypts QUIC packet payload. If |ppkt| is not * NULL, the pointer to the packet is assigned to it. * * This function returns the length of QUIC packet, including header, @@ -102,39 +108,46 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt); * ngtcp2_ppe_left returns the number of bytes left to write * additional frames. This does not count AEAD overhead. */ -size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_left(const ngtcp2_ppe *ppe); /* * ngtcp2_ppe_pktlen returns the provisional packet length. It * includes AEAD overhead. */ -size_t ngtcp2_ppe_pktlen(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_pktlen(const ngtcp2_ppe *ppe); -/** - * @function +/* + * ngtcp2_ppe_dgram_padding is equivalent to call + * ngtcp2_ppe_dgram_padding_size(ppe, NGTCP2_MAX_UDP_PAYLOAD_SIZE). + * This function should be called just before calling + * ngtcp2_ppe_final(). * - * `ngtcp2_ppe_padding` encodes PADDING frames to the end of the - * buffer. This function returns the number of bytes padded. + * This function returns the number of bytes padded. */ -size_t ngtcp2_ppe_padding(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe); /* - * ngtcp2_ppe_padding_hp_sample adds PADDING frame if the current - * payload does not have enough space for header protection sample. - * This function should be called just before calling - * ngtcp2_ppe_final(). + * ngtcp2_ppe_dgram_padding_size adds PADDING frame so that the size + * of a UDP datagram payload is at least |n| bytes long. If it is + * unable to add PADDING in that way, this function still adds PADDING + * frame as much as possible. This function should be called just + * before calling ngtcp2_ppe_final(). * * This function returns the number of bytes added as padding. */ -size_t ngtcp2_ppe_padding_hp_sample(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n); /* * ngtcp2_ppe_padding_size adds PADDING frame so that the size of QUIC - * packet is at least |n| bytes long. If it is unable to add PADDING - * in that way, this function still adds PADDING frame as much as - * possible. This function should be called just before calling - * ngtcp2_ppe_final(). For Short packet, this function should be - * called instead of ngtcp2_ppe_padding_hp_sample. + * packet is at least |n| bytes long and the current payload has + * enough space for header protection sample. If it is unable to add + * PADDING at least |n| bytes, this function still adds PADDING frames + * as much as possible. This function also adds PADDING frames so + * that the minimum padding requirement of header protection is met. + * Those padding may be larger than |n| bytes. It is recommended to + * make sure that ngtcp2_ppe_ensure_hp_sample succeeds after writing + * QUIC packet header. This function should be called just before + * calling ngtcp2_ppe_final(). * * This function returns the number of bytes added as padding. */ @@ -147,4 +160,4 @@ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n); */ int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe); -#endif /* NGTCP2_PPE_H */ +#endif /* !defined(NGTCP2_PPE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c index 5e1003d7942e53..162bed00156755 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c @@ -29,17 +29,20 @@ #include "ngtcp2_macro.h" -void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_less less, const ngtcp2_mem *mem) { - pq->mem = mem; - pq->capacity = 0; +void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_pq_less less, const ngtcp2_mem *mem) { pq->q = NULL; + pq->mem = mem; pq->length = 0; + pq->capacity = 0; pq->less = less; } void ngtcp2_pq_free(ngtcp2_pq *pq) { + if (!pq) { + return; + } + ngtcp2_mem_free(pq->mem, pq->q); - pq->q = NULL; } static void swap(ngtcp2_pq *pq, size_t i, size_t j) { @@ -54,11 +57,13 @@ static void swap(ngtcp2_pq *pq, size_t i, size_t j) { static void bubble_up(ngtcp2_pq *pq, size_t index) { size_t parent; - while (index != 0) { + + while (index) { parent = (index - 1) / 2; if (!pq->less(pq->q[index], pq->q[parent])) { return; } + swap(pq, parent, index); index = parent; } @@ -69,56 +74,64 @@ int ngtcp2_pq_push(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = ngtcp2_max(4, (pq->capacity * 2)); + ncapacity = ngtcp2_max_size(4, pq->capacity * 2); - nq = ngtcp2_mem_realloc(pq->mem, pq->q, - ncapacity * sizeof(ngtcp2_pq_entry *)); + nq = + ngtcp2_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(ngtcp2_pq_entry *)); if (nq == NULL) { return NGTCP2_ERR_NOMEM; } + pq->capacity = ncapacity; pq->q = nq; } + pq->q[pq->length] = item; item->index = pq->length; ++pq->length; - bubble_up(pq, pq->length - 1); + bubble_up(pq, item->index); + return 0; } -ngtcp2_pq_entry *ngtcp2_pq_top(ngtcp2_pq *pq) { +ngtcp2_pq_entry *ngtcp2_pq_top(const ngtcp2_pq *pq) { assert(pq->length); return pq->q[0]; } static void bubble_down(ngtcp2_pq *pq, size_t index) { size_t i, j, minindex; + for (;;) { j = index * 2 + 1; minindex = index; + for (i = 0; i < 2; ++i, ++j) { if (j >= pq->length) { break; } + if (pq->less(pq->q[j], pq->q[minindex])) { minindex = j; } } + if (minindex == index) { return; } + swap(pq, index, minindex); index = minindex; } } void ngtcp2_pq_pop(ngtcp2_pq *pq) { - if (pq->length > 0) { - pq->q[0] = pq->q[pq->length - 1]; - pq->q[0]->index = 0; - --pq->length; - bubble_down(pq, 0); - } + assert(pq->length); + + pq->q[0] = pq->q[pq->length - 1]; + pq->q[0]->index = 0; + --pq->length; + bubble_down(pq, 0); } void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { @@ -145,20 +158,6 @@ void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { } } -int ngtcp2_pq_empty(ngtcp2_pq *pq) { return pq->length == 0; } +int ngtcp2_pq_empty(const ngtcp2_pq *pq) { return pq->length == 0; } -size_t ngtcp2_pq_size(ngtcp2_pq *pq) { return pq->length; } - -int ngtcp2_pq_each(ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg) { - size_t i; - - if (pq->length == 0) { - return 0; - } - for (i = 0; i < pq->length; ++i) { - if ((*fun)(pq->q[i], arg)) { - return 1; - } - } - return 0; -} +size_t ngtcp2_pq_size(const ngtcp2_pq *pq) { return pq->length; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h index 484c8f21f75de2..aa195a9f7baee3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -45,37 +45,39 @@ typedef struct ngtcp2_pq_entry { size_t index; } ngtcp2_pq_entry; -/* "less" function, return nonzero if |lhs| is less than |rhs|. */ -typedef int (*ngtcp2_less)(const ngtcp2_pq_entry *lhs, - const ngtcp2_pq_entry *rhs); +/* ngtcp2_pq_less is a "less" function, that returns nonzero if |lhs| + is considered to be less than |rhs|. */ +typedef int (*ngtcp2_pq_less)(const ngtcp2_pq_entry *lhs, + const ngtcp2_pq_entry *rhs); typedef struct ngtcp2_pq { - /* The pointer to the pointer to the item stored */ + /* q is a pointer to an array that stores the items. */ ngtcp2_pq_entry **q; - /* Memory allocator */ + /* mem is a memory allocator. */ const ngtcp2_mem *mem; - /* The number of items stored */ + /* length is the number of items stored. */ size_t length; - /* The maximum number of items this pq can store. This is - automatically extended when length is reached to this value. */ + /* capacity is the maximum number of items this queue can store. + This is automatically extended when length is reached to this + limit. */ size_t capacity; - /* The less function between items */ - ngtcp2_less less; + /* less is the less function to compare items. */ + ngtcp2_pq_less less; } ngtcp2_pq; /* - * Initializes priority queue |pq| with compare function |cmp|. + * ngtcp2_pq_init initializes |pq| with compare function |cmp|. */ -void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_less less, const ngtcp2_mem *mem); +void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_pq_less less, const ngtcp2_mem *mem); /* - * Deallocates any resources allocated for |pq|. The stored items are - * not freed by this function. + * ngtcp2_pq_free deallocates any resources allocated for |pq|. The + * stored items are not freed by this function. */ void ngtcp2_pq_free(ngtcp2_pq *pq); /* - * Adds |item| to the priority queue |pq|. + * ngtcp2_pq_push adds |item| to |pq|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -86,41 +88,31 @@ void ngtcp2_pq_free(ngtcp2_pq *pq); int ngtcp2_pq_push(ngtcp2_pq *pq, ngtcp2_pq_entry *item); /* - * Returns item at the top of the queue |pq|. It is undefined if the - * queue is empty. + * ngtcp2_pq_top returns item at the top of |pq|. It is undefined if + * |pq| is empty. */ -ngtcp2_pq_entry *ngtcp2_pq_top(ngtcp2_pq *pq); +ngtcp2_pq_entry *ngtcp2_pq_top(const ngtcp2_pq *pq); /* - * Pops item at the top of the queue |pq|. The popped item is not - * freed by this function. + * ngtcp2_pq_pop pops item at the top of |pq|. The popped item is not + * freed by this function. It is undefined if |pq| is empty. */ void ngtcp2_pq_pop(ngtcp2_pq *pq); /* - * Returns nonzero if the queue |pq| is empty. + * ngtcp2_pq_empty returns nonzero if |pq| is empty. */ -int ngtcp2_pq_empty(ngtcp2_pq *pq); +int ngtcp2_pq_empty(const ngtcp2_pq *pq); /* - * Returns the number of items in the queue |pq|. + * ngtcp2_pq_size returns the number of items |pq| contains. */ -size_t ngtcp2_pq_size(ngtcp2_pq *pq); - -typedef int (*ngtcp2_pq_item_cb)(ngtcp2_pq_entry *item, void *arg); - -/* - * Applies |fun| to each item in |pq|. The |arg| is passed as arg - * parameter to callback function. This function must not change the - * ordering key. If the return value from callback is nonzero, this - * function returns 1 immediately without iterating remaining items. - * Otherwise this function returns 0. - */ -int ngtcp2_pq_each(ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg); +size_t ngtcp2_pq_size(const ngtcp2_pq *pq); /* - * Removes |item| from priority queue. + * ngtcp2_pq_remove removes |item| from |pq|. |pq| must contain + * |item| otherwise the behavior is undefined. */ void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item); -#endif /* NGTCP2_PQ_H */ +#endif /* !defined(NGTCP2_PQ_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c index 314e005293c279..471f84c76440fe 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c @@ -143,7 +143,7 @@ int ngtcp2_pv_validation_timed_out(ngtcp2_pv *pv, ngtcp2_tstamp ts) { ent = ngtcp2_ringbuf_get(&pv->ents.rb, ngtcp2_ringbuf_len(&pv->ents.rb) - 1); t = pv->started_ts + pv->timeout; - t = ngtcp2_max(t, ent->expiry); + t = ngtcp2_max_uint64(t, ent->expiry); return t <= ts; } @@ -170,3 +170,10 @@ void ngtcp2_pv_cancel_expired_timer(ngtcp2_pv *pv, ngtcp2_tstamp ts) { pv->flags |= NGTCP2_PV_FLAG_CANCEL_TIMER; } + +void ngtcp2_pv_set_fallback(ngtcp2_pv *pv, const ngtcp2_dcid *dcid, + ngtcp2_duration pto) { + pv->flags |= NGTCP2_PV_FLAG_FALLBACK_PRESENT; + ngtcp2_dcid_copy(&pv->fallback_dcid, dcid); + pv->fallback_pto = pto; +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h index c9da15248a3e2b..2d07e41648db2e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -71,11 +71,13 @@ void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, /* NGTCP2_PV_FLAG_CANCEL_TIMER indicates that the expiry timer is cancelled. */ #define NGTCP2_PV_FLAG_CANCEL_TIMER 0x02u -/* NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE indicates that fallback DCID is - available in ngtcp2_pv. If path validation fails, fallback to the - fallback DCID. If path validation succeeds, fallback DCID is - retired if it does not equal to the current DCID. */ -#define NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE 0x04u +/* NGTCP2_PV_FLAG_FALLBACK_PRESENT indicates that a fallback + Destination Connection ID and PTO are available in ngtcp2_pv. If + path validation fails, then fallback to them. If path validation + succeeds, the fallback Destination Connection ID is retired if it + is not zero length, and does not equal to the current Destination + Connection ID. */ +#define NGTCP2_PV_FLAG_FALLBACK_PRESENT 0x04u /* NGTCP2_PV_FLAG_PREFERRED_ADDR indicates that client is migrating to server's preferred address. This flag is only used by client. */ #define NGTCP2_PV_FLAG_PREFERRED_ADDR 0x10u @@ -83,7 +85,7 @@ void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, typedef struct ngtcp2_pv ngtcp2_pv; ngtcp2_static_ringbuf_def(pv_ents, NGTCP2_PV_MAX_ENTRIES, - sizeof(ngtcp2_pv_entry)); + sizeof(ngtcp2_pv_entry)) /* * ngtcp2_pv is the context of a single path validation. */ @@ -191,4 +193,10 @@ ngtcp2_tstamp ngtcp2_pv_next_expiry(ngtcp2_pv *pv); */ void ngtcp2_pv_cancel_expired_timer(ngtcp2_pv *pv, ngtcp2_tstamp ts); -#endif /* NGTCP2_PV_H */ +/* + * ngtcp2_pv_set_fallback sets |dcid| and |pto| as fallback. + */ +void ngtcp2_pv_set_fallback(ngtcp2_pv *pv, const ngtcp2_dcid *dcid, + ngtcp2_duration pto); + +#endif /* !defined(NGTCP2_PV_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c index 27675347794b2a..c0f920746a4dff 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c @@ -184,13 +184,12 @@ static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, write_pair_cid_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ (VALUE)) -#define ngtcp2_make_vec_lit(S) \ - { (uint8_t *)(S), sizeof((S)) - 1 } +#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), sizeof((S)) - 1} static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { p = write_verbatim( - p, "\"common_fields\":{\"protocol_type\":[\"QUIC\"],\"time_format\":" - "\"relative\",\"reference_time\":0,\"group_id\":"); + p, "\"common_fields\":{\"protocol_type\":[\"QUIC\"],\"time_format\":" + "\"relative\",\"reference_time\":0,\"group_id\":"); p = write_cid(p, odcid); *p++ = '}'; return p; @@ -198,7 +197,7 @@ static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { static uint8_t *write_trace(uint8_t *p, int server, const ngtcp2_cid *odcid) { p = write_verbatim( - p, "\"trace\":{\"vantage_point\":{\"name\":\"ngtcp2\",\"type\":"); + p, "\"trace\":{\"vantage_point\":{\"name\":\"ngtcp2\",\"type\":"); if (server) { p = write_string(p, "server"); } else { @@ -219,7 +218,7 @@ void ngtcp2_qlog_start(ngtcp2_qlog *qlog, const ngtcp2_cid *odcid, int server) { } p = write_verbatim( - p, "\x1e{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); + p, "\x1e{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); p = write_trace(p, server, odcid); p = write_verbatim(p, "}\n"); @@ -243,9 +242,9 @@ static ngtcp2_vec vec_pkt_type_0rtt = ngtcp2_make_vec_lit("0RTT"); static ngtcp2_vec vec_pkt_type_1rtt = ngtcp2_make_vec_lit("1RTT"); static ngtcp2_vec vec_pkt_type_retry = ngtcp2_make_vec_lit("retry"); static ngtcp2_vec vec_pkt_type_version_negotiation = - ngtcp2_make_vec_lit("version_negotiation"); + ngtcp2_make_vec_lit("version_negotiation"); static ngtcp2_vec vec_pkt_type_stateless_reset = - ngtcp2_make_vec_lit("stateless_reset"); + ngtcp2_make_vec_lit("stateless_reset"); static ngtcp2_vec vec_pkt_type_unknown = ngtcp2_make_vec_lit("unknown"); static const ngtcp2_vec *qlog_pkt_type(const ngtcp2_pkt_hd *hd) { @@ -638,8 +637,8 @@ write_connection_close_frame(uint8_t *p, const ngtcp2_connection_close *fr) { */ #define NGTCP2_QLOG_CONNECTION_CLOSE_FRAME_OVERHEAD 131 - p = write_verbatim(p, - "{\"frame_type\":\"connection_close\",\"error_space\":"); + p = + write_verbatim(p, "{\"frame_type\":\"connection_close\",\"error_space\":"); if (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = write_string(p, "transport"); } else { @@ -772,10 +771,10 @@ void ngtcp2_qlog_write_frame(ngtcp2_qlog *qlog, const ngtcp2_frame *fr) { case NGTCP2_FRAME_ACK_ECN: if (ngtcp2_buf_left(&qlog->buf) < NGTCP2_QLOG_ACK_FRAME_BASE_OVERHEAD + - (size_t)(fr->type == NGTCP2_FRAME_ACK_ECN - ? NGTCP2_QLOG_ACK_FRAME_ECN_OVERHEAD - : 0) + - NGTCP2_QLOG_ACK_FRAME_RANGE_OVERHEAD * (1 + fr->ack.rangecnt) + 1) { + (size_t)(fr->type == NGTCP2_FRAME_ACK_ECN + ? NGTCP2_QLOG_ACK_FRAME_ECN_OVERHEAD + : 0) + + NGTCP2_QLOG_ACK_FRAME_RANGE_OVERHEAD * (1 + fr->ack.rangecnt) + 1) { return; } p = write_ack_frame(p, &fr->ack); @@ -934,8 +933,8 @@ void ngtcp2_qlog_pkt_sent_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, } void ngtcp2_qlog_parameters_set_transport_params( - ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, - ngtcp2_qlog_side side) { + ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, + ngtcp2_qlog_side side) { uint8_t buf[1024]; uint8_t *p = buf; const ngtcp2_preferred_addr *paddr; @@ -950,7 +949,7 @@ void ngtcp2_qlog_parameters_set_transport_params( *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"transport:parameters_set\",\"data\":{\"owner\":"); + p, ",\"name\":\"transport:parameters_set\",\"data\":{\"owner\":"); if (side == NGTCP2_QLOG_SIDE_LOCAL) { p = write_string(p, "local"); @@ -982,8 +981,8 @@ void ngtcp2_qlog_parameters_set_transport_params( *p++ = ','; p = write_pair_duration(p, "max_idle_timeout", params->max_idle_timeout); *p++ = ','; - p = write_pair_number(p, "max_udp_payload_size", - params->max_udp_payload_size); + p = + write_pair_number(p, "max_udp_payload_size", params->max_udp_payload_size); *p++ = ','; p = write_pair_number(p, "ack_delay_exponent", params->ack_delay_exponent); *p++ = ','; @@ -1106,7 +1105,7 @@ void ngtcp2_qlog_pkt_lost(ngtcp2_qlog *qlog, ngtcp2_rtb_entry *ent) { *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"recovery:packet_lost\",\"data\":{\"header\":"); + p, ",\"name\":\"recovery:packet_lost\",\"data\":{\"header\":"); hd.type = ent->hd.type; hd.flags = ent->hd.flags; @@ -1134,13 +1133,11 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( - buf.last, - ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + buf.last, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); - if (ngtcp2_buf_left(&buf) < - NGTCP2_QLOG_PKT_HD_OVERHEAD + hd->tokenlen * 2 + - sizeof(",\"retry_token\":{\"data\":\"\"}}}\n") - 1 + - retry->tokenlen * 2) { + if (ngtcp2_buf_left(&buf) < NGTCP2_QLOG_PKT_HD_OVERHEAD + hd->tokenlen * 2 + + sizeof(",\"retry_token\":{\"data\":\"\"}}}\n") - + 1 + retry->tokenlen * 2) { return; } @@ -1154,7 +1151,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, } void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr) { + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr) { uint8_t buf[256]; uint8_t *p = buf; ngtcp2_pkt_hd hd = {0}; @@ -1169,7 +1166,7 @@ void ngtcp2_qlog_stateless_reset_pkt_received( *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + p, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); p = write_pkt_hd(p, &hd); *p++ = ','; p = write_pair_hex(p, "stateless_reset_token", sr->stateless_reset_token, @@ -1199,8 +1196,7 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( - buf.last, - ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + buf.last, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); buf.last = write_pkt_hd(buf.last, hd); buf.last = write_verbatim(buf.last, ",\"supported_versions\":["); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h index b9107c0e5c031a..d2a5f1038c0f42 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -120,8 +120,8 @@ void ngtcp2_qlog_pkt_sent_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, * "local", otherwise "remote". */ void ngtcp2_qlog_parameters_set_transport_params( - ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, - ngtcp2_qlog_side side); + ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, + ngtcp2_qlog_side side); /* * ngtcp2_qlog_metrics_updated writes metrics_updated event of @@ -147,7 +147,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, * event for a received Stateless Reset packet. */ void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr); + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr); /* * ngtcp2_qlog_version_negotiation_pkt_received writes packet_received @@ -158,4 +158,4 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, const uint32_t *sv, size_t nsv); -#endif /* NGTCP2_QLOG_H */ +#endif /* !defined(NGTCP2_QLOG_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c index 9379496b7d4b53..e89891532936e8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c @@ -32,12 +32,14 @@ void ngtcp2_range_init(ngtcp2_range *r, uint64_t begin, uint64_t end) { ngtcp2_range ngtcp2_range_intersect(const ngtcp2_range *a, const ngtcp2_range *b) { - ngtcp2_range r = {0, 0}; - uint64_t begin = ngtcp2_max(a->begin, b->begin); - uint64_t end = ngtcp2_min(a->end, b->end); + ngtcp2_range r = {0}; + uint64_t begin = ngtcp2_max_uint64(a->begin, b->begin); + uint64_t end = ngtcp2_min_uint64(a->end, b->end); + if (begin < end) { ngtcp2_range_init(&r, begin, end); } + return r; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h index a776c4ec4768ce..22cd2951859ef1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -58,7 +58,7 @@ uint64_t ngtcp2_range_len(const ngtcp2_range *r); /* * ngtcp2_range_eq returns nonzero if |a| equals |b|, such that - * a->begin == b->begin, and a->end == b->end hold. + * a->begin == b->begin and a->end == b->end hold. */ int ngtcp2_range_eq(const ngtcp2_range *a, const ngtcp2_range *b); @@ -77,4 +77,4 @@ void ngtcp2_range_cut(ngtcp2_range *left, ngtcp2_range *right, */ int ngtcp2_range_not_after(const ngtcp2_range *a, const ngtcp2_range *b); -#endif /* NGTCP2_RANGE_H */ +#endif /* !defined(NGTCP2_RANGE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h index 4cb40882192a77..e6321061b59cd1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -37,4 +37,4 @@ /* NGTCP2_GRANULARITY is kGranularity described in RFC 9002. */ #define NGTCP2_GRANULARITY NGTCP2_MILLISECONDS -#endif /* NGTCP2_RCVRY_H */ +#endif /* !defined(NGTCP2_RCVRY_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c index c381c231276d34..353afca4d48fb5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c @@ -27,24 +27,29 @@ #include <assert.h> #ifdef WIN32 # include <intrin.h> -#endif +#endif /* defined(WIN32) */ #include "ngtcp2_macro.h" -#if defined(_MSC_VER) && !defined(__clang__) && \ - (defined(_M_ARM) || defined(_M_ARM64)) -static unsigned int __popcnt(unsigned int x) { - unsigned int c = 0; - for (; x; ++c) { - x &= x - 1; - } - return c; +#ifndef NDEBUG +static int ispow2(size_t n) { +# if defined(_MSC_VER) && !defined(__clang__) && \ + (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941)) + return n && !(n & (n - 1)); +# elif defined(WIN32) + return 1 == __popcnt((unsigned int)n); +# else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ + return 1 == __builtin_popcount((unsigned int)n); +# endif /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ } -#endif +#endif /* !defined(NDEBUG) */ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, const ngtcp2_mem *mem) { uint8_t *buf = ngtcp2_mem_malloc(mem, nmemb * size); + if (buf == NULL) { return NGTCP2_ERR_NOMEM; } @@ -56,11 +61,7 @@ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, void ngtcp2_ringbuf_buf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, uint8_t *buf, const ngtcp2_mem *mem) { -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); rb->buf = buf; rb->mem = mem; @@ -114,10 +115,13 @@ void ngtcp2_ringbuf_resize(ngtcp2_ringbuf *rb, size_t len) { rb->len = len; } -void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset) { +void *ngtcp2_ringbuf_get(const ngtcp2_ringbuf *rb, size_t offset) { assert(offset < rb->len); offset = (rb->first + offset) & rb->mask; + return &rb->buf[offset * rb->size]; } -int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb) { return rb->len == rb->mask + 1; } +int ngtcp2_ringbuf_full(const ngtcp2_ringbuf *rb) { + return rb->len == rb->mask + 1; +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h index b28a882c4bae84..d490524805b1e9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -51,7 +51,7 @@ typedef struct ngtcp2_ringbuf { /* * ngtcp2_ringbuf_init initializes |rb|. |nmemb| is the number of * elements that can be stored in this buffer. |size| is the size of - * each element. |size| must be power of 2. + * each element. |nmemb| must be power of 2. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -64,7 +64,7 @@ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, /* * ngtcp2_ringbuf_buf_init initializes |rb| with given buffer and - * size. + * size. Same restrictions are applied as ngtcp2_ringbuf_init. */ void ngtcp2_ringbuf_buf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, uint8_t *buf, const ngtcp2_mem *mem); @@ -79,15 +79,16 @@ void ngtcp2_ringbuf_free(ngtcp2_ringbuf *rb); the buffer backward, and returns the pointer to the element. Caller can store data to the buffer pointed by the returned pointer. If this action exceeds the capacity of the ring buffer, - the last element is silently overwritten, and rb->len remains - unchanged. */ + this function returns the pointer to the last element, and rb->len + remains unchanged. */ void *ngtcp2_ringbuf_push_front(ngtcp2_ringbuf *rb); /* ngtcp2_ringbuf_push_back moves the offset to the last element in the buffer forward, and returns the pointer to the element. Caller can store data to the buffer pointed by the returned pointer. If - this action exceeds the capacity of the ring buffer, the first - element is silently overwritten, and rb->len remains unchanged. */ + this action exceeds the capacity of the ring buffer, this function + returns the pointer to the first element, and rb->len remains + unchanged. */ void *ngtcp2_ringbuf_push_back(ngtcp2_ringbuf *rb); /* @@ -106,18 +107,17 @@ void ngtcp2_ringbuf_resize(ngtcp2_ringbuf *rb, size_t len); /* ngtcp2_ringbuf_get returns the pointer to the element at |offset|. */ -void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset); +void *ngtcp2_ringbuf_get(const ngtcp2_ringbuf *rb, size_t offset); /* ngtcp2_ringbuf_len returns the number of elements stored. */ #define ngtcp2_ringbuf_len(RB) ((RB)->len) /* ngtcp2_ringbuf_full returns nonzero if |rb| is full. */ -int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb); +int ngtcp2_ringbuf_full(const ngtcp2_ringbuf *rb); /* ngtcp2_static_ringbuf_def defines ngtcp2_ringbuf struct wrapper - which uses a statically allocated buffer that is suitable for a - usage that does not change buffer size with ngtcp2_ringbuf_resize. - ngtcp2_ringbuf_free should never be called for rb field. */ + which uses a statically allocated buffer. ngtcp2_ringbuf_free + should never be called for rb field. */ #define ngtcp2_static_ringbuf_def(NAME, NMEMB, SIZE) \ typedef struct ngtcp2_static_ringbuf_##NAME { \ ngtcp2_ringbuf rb; \ @@ -125,8 +125,8 @@ int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb); } ngtcp2_static_ringbuf_##NAME; \ \ static inline void ngtcp2_static_ringbuf_##NAME##_init( \ - ngtcp2_static_ringbuf_##NAME *srb) { \ + ngtcp2_static_ringbuf_##NAME *srb) { \ ngtcp2_ringbuf_buf_init(&srb->rb, (NMEMB), (SIZE), srb->buf, NULL); \ } -#endif /* NGTCP2_RINGBUF_H */ +#endif /* !defined(NGTCP2_RINGBUF_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c index 5cac383f7bb166..853f1d650eaf54 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c @@ -56,7 +56,6 @@ int ngtcp2_rob_data_new(ngtcp2_rob_data **pd, uint64_t offset, size_t chunk, (*pd)->range.begin = offset; (*pd)->range.end = offset + chunk; (*pd)->begin = (uint8_t *)(*pd) + sizeof(ngtcp2_rob_data); - (*pd)->end = (*pd)->begin + chunk; return 0; } @@ -69,8 +68,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { int rv; ngtcp2_rob_gap *g; - ngtcp2_ksl_init(&rob->gapksl, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&rob->gapksl, ngtcp2_ksl_range_compar, + ngtcp2_ksl_range_search, sizeof(ngtcp2_range), mem); rv = ngtcp2_rob_gap_new(&g, 0, UINT64_MAX, mem); if (rv != 0) { @@ -82,8 +81,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { goto fail_gapksl_ksl_insert; } - ngtcp2_ksl_init(&rob->dataksl, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&rob->dataksl, ngtcp2_ksl_range_compar, + ngtcp2_ksl_range_search, sizeof(ngtcp2_range), mem); rob->chunk = chunk; rob->mem = mem; @@ -123,11 +122,14 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, size_t n; int rv; ngtcp2_rob_data *d; - ngtcp2_range range = {offset, offset + len}; + ngtcp2_range range = { + .begin = offset, + .end = offset + len, + }; ngtcp2_ksl_it it; - for (it = ngtcp2_ksl_lower_bound_compar(&rob->dataksl, &range, - ngtcp2_ksl_range_exclusive_compar); + for (it = ngtcp2_ksl_lower_bound_search(&rob->dataksl, &range, + ngtcp2_ksl_range_exclusive_search); len; ngtcp2_ksl_it_next(&it)) { if (ngtcp2_ksl_it_end(&it)) { d = NULL; @@ -149,7 +151,8 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, } } - n = (size_t)ngtcp2_min((uint64_t)len, d->range.begin + rob->chunk - offset); + n = (size_t)ngtcp2_min_uint64((uint64_t)len, + d->range.begin + rob->chunk - offset); memcpy(d->begin + (offset - d->range.begin), data, n); offset += n; data += n; @@ -163,11 +166,15 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, size_t datalen) { int rv; ngtcp2_rob_gap *g; - ngtcp2_range m, l, r, q = {offset, offset + datalen}; + ngtcp2_range m, l, r; + ngtcp2_range q = { + .begin = offset, + .end = offset + datalen, + }; ngtcp2_ksl_it it; - it = ngtcp2_ksl_lower_bound_compar(&rob->gapksl, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&rob->gapksl, &q, + ngtcp2_ksl_range_exclusive_search); for (; !ngtcp2_ksl_it_end(&it);) { g = ngtcp2_ksl_it_get(&it); @@ -176,9 +183,11 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, if (!ngtcp2_range_len(&m)) { break; } + if (ngtcp2_range_eq(&g->range, &m)) { ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); ngtcp2_rob_gap_del(g, rob->mem); + rv = rob_write_data(rob, m.begin, data + (m.begin - offset), (size_t)ngtcp2_range_len(&m)); if (rv != 0) { @@ -187,17 +196,21 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, continue; } + ngtcp2_range_cut(&l, &r, &g->range, &m); + if (ngtcp2_range_len(&l)) { ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &l); g->range = l; if (ngtcp2_range_len(&r)) { ngtcp2_rob_gap *ng; + rv = ngtcp2_rob_gap_new(&ng, r.begin, r.end, rob->mem); if (rv != 0) { return rv; } + rv = ngtcp2_ksl_insert(&rob->gapksl, &it, &ng->range, ng); if (rv != 0) { ngtcp2_rob_gap_del(ng, rob->mem); @@ -208,13 +221,16 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); g->range = r; } + rv = rob_write_data(rob, m.begin, data + (m.begin - offset), (size_t)ngtcp2_range_len(&m)); if (rv != 0) { return rv; } + ngtcp2_ksl_it_next(&it); } + return 0; } @@ -230,12 +246,16 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset) { if (offset <= g->range.begin) { break; } + if (offset < g->range.end) { ngtcp2_range r = {offset, g->range.end}; + ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); g->range.begin = offset; + break; } + ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); ngtcp2_rob_gap_del(g, rob->mem); } @@ -247,12 +267,13 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset) { if (offset < d->range.begin + rob->chunk) { return; } + ngtcp2_ksl_remove_hint(&rob->dataksl, &it, &it, &d->range); ngtcp2_rob_data_del(d, rob->mem); } } -size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, +size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, uint64_t offset) { ngtcp2_rob_gap *g; ngtcp2_rob_data *d; @@ -278,8 +299,9 @@ size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, *pdest = d->begin + (offset - d->range.begin); - return (size_t)(ngtcp2_min(g->range.begin, d->range.begin + rob->chunk) - - offset); + return ( + size_t)(ngtcp2_min_uint64(g->range.begin, d->range.begin + rob->chunk) - + offset); } void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len) { @@ -299,7 +321,7 @@ void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len) { ngtcp2_rob_data_del(d, rob->mem); } -uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob) { +uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob) { ngtcp2_ksl_it it = ngtcp2_ksl_begin(&rob->gapksl); ngtcp2_rob_gap *g; @@ -312,6 +334,6 @@ uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob) { return g->range.begin; } -int ngtcp2_rob_data_buffered(ngtcp2_rob *rob) { +int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob) { return ngtcp2_ksl_len(&rob->dataksl) != 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h index 6518d56c539185..d53b5160b10230 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -70,12 +70,10 @@ void ngtcp2_rob_gap_del(ngtcp2_rob_gap *g, const ngtcp2_mem *mem); * ngtcp2_rob_data holds the buffered stream data. */ typedef struct ngtcp2_rob_data { - /* range is the range of this gap. */ + /* range is the range of this data. */ ngtcp2_range range; /* begin points to the buffer. */ uint8_t *begin; - /* end points to the one beyond of the last byte of the buffer */ - uint8_t *end; } ngtcp2_rob_data; /* @@ -110,8 +108,8 @@ typedef struct ngtcp2_rob { /* gapksl maintains the range of offset which is not received yet. Initially, its range is [0, UINT64_MAX). */ ngtcp2_ksl gapksl; - /* dataksl maintains the list of buffers which store received data - ordered by stream offset. */ + /* dataksl maintains the buffers which store received out-of-order + data ordered by stream offset. */ ngtcp2_ksl dataksl; /* mem is custom memory allocator */ const ngtcp2_mem *mem; @@ -137,8 +135,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem); void ngtcp2_rob_free(ngtcp2_rob *rob); /* - * ngtcp2_rob_push adds new data of length |datalen| at the stream - * offset |offset|. + * ngtcp2_rob_push adds new data pointed by |data| of length |datalen| + * at the stream offset |offset|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -151,7 +149,8 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, /* * ngtcp2_rob_remove_prefix removes gap up to |offset|, exclusive. It - * also removes data buffer if it is completely included in |offset|. + * also removes buffered data if it is completely included in + * |offset|. */ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset); @@ -159,9 +158,10 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset); * ngtcp2_rob_data_at stores the pointer to the buffer of stream * offset |offset| to |*pdest| if it is available, and returns the * valid length of available data. If no data is available, it - * returns 0. + * returns 0. This function only returns the data before the first + * gap. It returns 0 even if data is available after the first gap. */ -size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, +size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, uint64_t offset); /* @@ -181,11 +181,11 @@ void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len); * ngtcp2_rob_first_gap_offset returns the offset to the first gap. * If there is no gap, it returns UINT64_MAX. */ -uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob); +uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob); /* * ngtcp2_rob_data_buffered returns nonzero if any data is buffered. */ -int ngtcp2_rob_data_buffered(ngtcp2_rob *rob); +int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob); -#endif /* NGTCP2_ROB_H */ +#endif /* !defined(NGTCP2_ROB_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c index b8587e3e9dbac8..181691f3e69401 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c @@ -35,26 +35,30 @@ void ngtcp2_rs_init(ngtcp2_rs *rs) { rs->interval = UINT64_MAX; rs->delivered = 0; rs->prior_delivered = 0; - rs->prior_ts = 0; + rs->prior_ts = UINT64_MAX; rs->tx_in_flight = 0; rs->lost = 0; rs->prior_lost = 0; rs->send_elapsed = 0; rs->ack_elapsed = 0; + rs->last_end_seq = -1; rs->is_app_limited = 0; } void ngtcp2_rst_init(ngtcp2_rst *rst) { + rst->last_seq = -1; + ngtcp2_rst_reset(rst); +} + +void ngtcp2_rst_reset(ngtcp2_rst *rst) { ngtcp2_rs_init(&rst->rs); - ngtcp2_window_filter_init(&rst->wf, 12); rst->delivered = 0; rst->delivered_ts = 0; rst->first_sent_ts = 0; rst->app_limited = 0; - rst->next_round_delivered = 0; - rst->round_count = 0; rst->is_cwnd_limited = 0; rst->lost = 0; + rst->valid_after_seq = rst->last_seq; } void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, @@ -68,27 +72,21 @@ void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, ent->rst.is_app_limited = rst->app_limited != 0; ent->rst.tx_in_flight = cstat->bytes_in_flight + ent->pktlen; ent->rst.lost = rst->lost; + ent->rst.end_seq = ++rst->last_seq; } -void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, - uint64_t pkt_delivered) { +void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { ngtcp2_rs *rs = &rst->rs; - uint64_t rate; if (rst->app_limited && rst->delivered > rst->app_limited) { rst->app_limited = 0; } - if (pkt_delivered >= rst->next_round_delivered) { - rst->next_round_delivered = pkt_delivered; - ++rst->round_count; - } - - if (rs->prior_ts == 0) { + if (rs->prior_ts == UINT64_MAX) { return; } - rs->interval = ngtcp2_max(rs->send_elapsed, rs->ack_elapsed); + rs->interval = ngtcp2_max_uint64(rs->send_elapsed, rs->ack_elapsed); rs->delivered = rst->delivered - rs->prior_delivered; rs->lost = rst->lost - rs->prior_lost; @@ -102,22 +100,27 @@ void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, return; } - rate = rs->delivered * NGTCP2_SECONDS / rs->interval; + cstat->delivery_rate_sec = rs->delivered * NGTCP2_SECONDS / rs->interval; +} - if (rate > ngtcp2_window_filter_get_best(&rst->wf) || !rst->app_limited) { - ngtcp2_window_filter_update(&rst->wf, rate, rst->round_count); - cstat->delivery_rate_sec = ngtcp2_window_filter_get_best(&rst->wf); - } +static int rst_is_newest_pkt(const ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, + const ngtcp2_rs *rs) { + return ent->ts > rst->first_sent_ts || + (ent->ts == rst->first_sent_ts && ent->rst.end_seq > rs->last_end_seq); } void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, ngtcp2_tstamp ts) { ngtcp2_rs *rs = &rst->rs; + if (ent->rst.end_seq <= rst->valid_after_seq) { + return; + } + rst->delivered += ent->pktlen; rst->delivered_ts = ts; - if (ent->rst.delivered > rs->prior_delivered) { + if (rs->prior_ts == UINT64_MAX || rst_is_newest_pkt(rst, ent, rs)) { rs->prior_delivered = ent->rst.delivered; rs->prior_ts = ent->rst.delivered_ts; rs->is_app_limited = ent->rst.is_app_limited; @@ -125,6 +128,7 @@ void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, rs->ack_elapsed = rst->delivered_ts - ent->rst.delivered_ts; rs->tx_in_flight = ent->rst.tx_in_flight; rs->prior_lost = ent->rst.lost; + rs->last_end_seq = ent->rst.end_seq; rst->first_sent_ts = ent->ts; } } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h index c9e1e161b7766f..c2580306cc59fe 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -51,6 +51,7 @@ typedef struct ngtcp2_rs { uint64_t prior_lost; ngtcp2_duration send_elapsed; ngtcp2_duration ack_elapsed; + int64_t last_end_seq; int is_app_limited; } ngtcp2_rs; @@ -58,29 +59,36 @@ void ngtcp2_rs_init(ngtcp2_rs *rs); /* * ngtcp2_rst implements delivery rate estimation described in - * https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00 + * https://ietf-wg-ccwg.github.io/draft-cardwell-ccwg-bbr/draft-cardwell-ccwg-bbr.html */ typedef struct ngtcp2_rst { ngtcp2_rs rs; - ngtcp2_window_filter wf; uint64_t delivered; ngtcp2_tstamp delivered_ts; ngtcp2_tstamp first_sent_ts; uint64_t app_limited; - uint64_t next_round_delivered; - uint64_t round_count; uint64_t lost; + /* last_seq is the sequence number of packets across all packet + number spaces. If we would adopt single packet number sequence + across all packet number spaces, we can replace this with a + packet number. */ + int64_t last_seq; + /* valid_after_seq is the sequence number, and ignore a packet if + the sequence number of the packet is less than or equal to this + number. */ + int64_t valid_after_seq; int is_cwnd_limited; } ngtcp2_rst; void ngtcp2_rst_init(ngtcp2_rst *rst); +void ngtcp2_rst_reset(ngtcp2_rst *rst); + void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, const ngtcp2_conn_stat *cstat); -void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, - uint64_t pkt_delivered); +void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, ngtcp2_tstamp ts); void ngtcp2_rst_update_app_limited(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); -#endif /* NGTCP2_RST_H */ +#endif /* !defined(NGTCP2_RST_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c index 5ebdce7d0e2715..f7a7f5724b7ac3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c @@ -38,7 +38,7 @@ #include "ngtcp2_tstamp.h" #include "ngtcp2_frame_chain.h" -ngtcp2_objalloc_def(rtb_entry, ngtcp2_rtb_entry, oplent); +ngtcp2_objalloc_def(rtb_entry, ngtcp2_rtb_entry, oplent) static void rtb_entry_init(ngtcp2_rtb_entry *ent, const ngtcp2_pkt_hd *hd, ngtcp2_frame_chain *frc, ngtcp2_tstamp ts, @@ -53,7 +53,6 @@ static void rtb_entry_init(ngtcp2_rtb_entry *ent, const ngtcp2_pkt_hd *hd, ent->lost_ts = UINT64_MAX; ent->pktlen = pktlen; ent->flags = flags; - ent->next = NULL; } int ngtcp2_rtb_entry_objalloc_new(ngtcp2_rtb_entry **pent, @@ -82,19 +81,14 @@ void ngtcp2_rtb_entry_objalloc_del(ngtcp2_rtb_entry *ent, ngtcp2_objalloc_rtb_entry_release(objalloc, ent); } -static int greater(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - -void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, - ngtcp2_strm *crypto, ngtcp2_rst *rst, ngtcp2_cc *cc, +void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t cc_pkt_num, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { rtb->rtb_entry_objalloc = rtb_entry_objalloc; rtb->frc_objalloc = frc_objalloc; - ngtcp2_ksl_init(&rtb->ents, greater, sizeof(int64_t), mem); - rtb->crypto = crypto; + ngtcp2_ksl_init(&rtb->ents, ngtcp2_ksl_int64_greater, + ngtcp2_ksl_int64_greater_search, sizeof(int64_t), mem); rtb->rst = rst; rtb->cc = cc; rtb->log = log; @@ -105,10 +99,8 @@ void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, rtb->num_retransmittable = 0; rtb->num_pto_eliciting = 0; rtb->probe_pkt_left = 0; - rtb->pktns_id = pktns_id; rtb->cc_pkt_num = cc_pkt_num; rtb->cc_bytes_in_flight = 0; - rtb->persistent_congestion_start_ts = UINT64_MAX; rtb->num_lost_pkts = 0; rtb->num_lost_pmtud_pkts = 0; } @@ -145,9 +137,11 @@ static void rtb_on_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { ++rtb->num_ack_eliciting; } + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { ++rtb->num_retransmittable; } + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING) { ++rtb->num_pto_eliciting; } @@ -209,10 +203,10 @@ static size_t rtb_on_remove(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, #define NGTCP2_RECLAIM_FLAG_ON_LOSS 0x01u /* - * rtb_reclaim_frame queues unacknowledged frames included in |ent| - * for retransmission. The re-queued frames are not deleted from - * |ent|. It returns the number of frames queued. |flags| is bitwise - * OR of 0 or more of NGTCP2_RECLAIM_FLAG_*. + * rtb_reclaim_frame copies and queues frames included in |ent| for + * retransmission. The frames are not deleted from |ent|. It returns + * the number of frames queued. |flags| is bitwise OR of 0 or more of + * NGTCP2_RECLAIM_FLAG_*. */ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, ngtcp2_conn *conn, ngtcp2_pktns *pktns, @@ -229,11 +223,13 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, /* TODO Reconsider the order of pfrc */ for (frc = ent->frc; frc; frc = frc->next) { fr = &frc->fr; + /* Check that a late ACK acknowledged this frame. */ if (frc->binder && (frc->binder->flags & NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK)) { continue; } + switch (frc->fr.type) { case NGTCP2_FRAME_STREAM: strm = ngtcp2_conn_find_stream(conn, fr->stream.stream_id); @@ -244,16 +240,20 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, gap = ngtcp2_strm_get_unacked_range_after(strm, fr->stream.offset); range.begin = fr->stream.offset; - range.end = fr->stream.offset + - ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); + range.end = + fr->stream.offset + ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); range = ngtcp2_range_intersect(&range, &gap); + if (ngtcp2_range_len(&range) == 0) { if (!fr->stream.fin) { /* 0 length STREAM frame with offset == 0 must be - retransmitted if no non-empty data is sent to this stream - and no data in this stream is acknowledged. */ + retransmitted if no non-empty data are sent to this + stream, fin flag is not set, and no data in this stream + are acknowledged. */ if (fr->stream.offset != 0 || fr->stream.datacnt != 0 || - strm->tx.offset || (strm->flags & NGTCP2_STRM_FLAG_ANY_ACKED)) { + strm->tx.offset || + (strm->flags & + (NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_ANY_ACKED))) { continue; } } else if (strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED) { @@ -268,7 +268,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); + &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); if (rv != 0) { return rv; } @@ -282,8 +282,10 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, ngtcp2_frame_chain_objalloc_del(nfrc, rtb->frc_objalloc, rtb->mem); return rv; } + if (!ngtcp2_strm_is_tx_queued(strm)) { strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); + rv = ngtcp2_conn_tx_strmq_push(conn, strm); if (rv != 0) { return rv; @@ -294,20 +296,22 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, continue; case NGTCP2_FRAME_CRYPTO: - /* Don't resend CRYPTO frame if the whole region it contains has - been acknowledged */ - gap = ngtcp2_strm_get_unacked_range_after(rtb->crypto, fr->stream.offset); + /* Do not resend CRYPTO frame if the whole region it contains + has been acknowledged */ + gap = ngtcp2_strm_get_unacked_range_after(&pktns->crypto.strm, + fr->stream.offset); range.begin = fr->stream.offset; - range.end = fr->stream.offset + - ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); + range.end = + fr->stream.offset + ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); range = ngtcp2_range_intersect(&range, &gap); + if (ngtcp2_range_len(&range) == 0) { continue; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); + &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); if (rv != 0) { return rv; } @@ -328,8 +332,8 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, continue; case NGTCP2_FRAME_NEW_TOKEN: rv = ngtcp2_frame_chain_new_token_objalloc_new( - &nfrc, fr->new_token.token, fr->new_token.tokenlen, rtb->frc_objalloc, - rtb->mem); + &nfrc, fr->new_token.token, fr->new_token.tokenlen, rtb->frc_objalloc, + rtb->mem); if (rv != 0) { return rv; } @@ -366,7 +370,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, case NGTCP2_FRAME_MAX_STREAM_DATA: strm = ngtcp2_conn_find_stream(conn, fr->max_stream_data.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_max_stream_data( - strm, &fr->max_stream_data)) { + strm, &fr->max_stream_data)) { continue; } @@ -374,7 +378,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, case NGTCP2_FRAME_STREAM_DATA_BLOCKED: strm = ngtcp2_conn_find_stream(conn, fr->stream_data_blocked.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stream_data_blocked( - strm, &fr->stream_data_blocked)) { + strm, &fr->stream_data_blocked)) { continue; } @@ -423,6 +427,7 @@ static int conn_process_lost_datagram(ngtcp2_conn *conn, if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } + break; } } @@ -430,10 +435,9 @@ static int conn_process_lost_datagram(ngtcp2_conn *conn, return 0; } -static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, - ngtcp2_rtb_entry *ent, ngtcp2_conn_stat *cstat, - ngtcp2_conn *conn, ngtcp2_pktns *pktns, - ngtcp2_tstamp ts) { +static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, + ngtcp2_conn_stat *cstat, ngtcp2_conn *conn, + ngtcp2_pktns *pktns, ngtcp2_tstamp ts) { int rv; ngtcp2_ssize reclaimed; ngtcp2_cc *cc = rtb->cc; @@ -451,7 +455,7 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, } else if (rtb->cc->on_pkt_lost) { cc->on_pkt_lost(cc, cstat, ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, - rtb->pktns_id, ent->ts, ent->rst.lost, + pktns->id, ent->ts, ent->rst.lost, ent->rst.tx_in_flight, ent->rst.is_app_limited), ts); @@ -463,34 +467,25 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, ent->hd.pkt_num); assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); assert(UINT64_MAX == ent->lost_ts); - - ent->flags |= NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED; - ent->lost_ts = ts; - - ++rtb->num_lost_pkts; - - ngtcp2_ksl_it_next(it); - - return 0; - } - - if (conn->callbacks.lost_datagram && - (ent->flags & NGTCP2_RTB_ENTRY_FLAG_DATAGRAM)) { - rv = conn_process_lost_datagram(conn, ent); - if (rv != 0) { - return rv; + } else { + if (conn->callbacks.lost_datagram && + (ent->flags & NGTCP2_RTB_ENTRY_FLAG_DATAGRAM)) { + rv = conn_process_lost_datagram(conn, ent); + if (rv != 0) { + return rv; + } } - } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { - assert(ent->frc); - assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); - assert(UINT64_MAX == ent->lost_ts); + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { + assert(ent->frc); + assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); + assert(UINT64_MAX == ent->lost_ts); - reclaimed = + reclaimed = rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_ON_LOSS, conn, pktns, ent); - if (reclaimed < 0) { - return (int)reclaimed; + if (reclaimed < 0) { + return (int)reclaimed; + } } } @@ -499,8 +494,6 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, ++rtb->num_lost_pkts; - ngtcp2_ksl_it_next(it); - return 0; } @@ -518,7 +511,7 @@ int ngtcp2_rtb_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, return 0; } -ngtcp2_ksl_it ngtcp2_rtb_head(ngtcp2_rtb *rtb) { +ngtcp2_ksl_it ngtcp2_rtb_head(const ngtcp2_rtb *rtb) { return ngtcp2_ksl_begin(&rtb->ents); } @@ -566,22 +559,24 @@ static void conn_ack_crypto_data(ngtcp2_conn *conn, ngtcp2_pktns *pktns, return; } -static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, - ngtcp2_conn *conn) { +static int process_acked_pkt(ngtcp2_rtb_entry *ent, ngtcp2_conn *conn, + ngtcp2_pktns *pktns) { ngtcp2_frame_chain *frc; uint64_t prev_stream_offset, stream_offset; ngtcp2_strm *strm; int rv; uint64_t datalen; - ngtcp2_strm *crypto = rtb->crypto; - ngtcp2_pktns *pktns = NULL; + ngtcp2_strm *crypto = &pktns->crypto.strm; if ((ent->flags & NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE) && conn->pmtud && conn->pmtud->tx_pkt_num <= ent->hd.pkt_num) { ngtcp2_pmtud_probe_success(conn->pmtud, ent->pktlen); - conn->dcid.current.max_udp_payload_size = - ngtcp2_max(conn->dcid.current.max_udp_payload_size, ent->pktlen); + if (conn->dcid.current.max_udp_payload_size < ent->pktlen) { + conn->dcid.current.max_udp_payload_size = ent->pktlen; + conn->cstat.max_tx_udp_payload_size = + ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + } if (ngtcp2_pmtud_finished(conn->pmtud)) { ngtcp2_conn_stop_pmtud(conn); @@ -611,23 +606,25 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, } prev_stream_offset = ngtcp2_strm_get_acked_offset(strm); + rv = ngtcp2_strm_ack_data( - strm, frc->fr.stream.offset, - ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); + strm, frc->fr.stream.offset, + ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); if (rv != 0) { return rv; } if (conn->callbacks.acked_stream_data_offset) { stream_offset = ngtcp2_strm_get_acked_offset(strm); + datalen = stream_offset - prev_stream_offset; if (datalen == 0 && !frc->fr.stream.fin) { break; } rv = conn->callbacks.acked_stream_data_offset( - conn, strm->stream_id, prev_stream_offset, datalen, conn->user_data, - strm->stream_user_data); + conn, strm->stream_id, prev_stream_offset, datalen, conn->user_data, + strm->stream_user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -637,36 +634,25 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (rv != 0) { return rv; } + break; case NGTCP2_FRAME_CRYPTO: prev_stream_offset = ngtcp2_strm_get_acked_offset(crypto); + rv = ngtcp2_strm_ack_data( - crypto, frc->fr.stream.offset, - ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); + crypto, frc->fr.stream.offset, + ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); if (rv != 0) { return rv; } stream_offset = ngtcp2_strm_get_acked_offset(crypto); + datalen = stream_offset - prev_stream_offset; if (datalen == 0) { break; } - switch (rtb->pktns_id) { - case NGTCP2_PKTNS_ID_INITIAL: - pktns = conn->in_pktns; - break; - case NGTCP2_PKTNS_ID_HANDSHAKE: - pktns = conn->hs_pktns; - break; - case NGTCP2_PKTNS_ID_APPLICATION: - pktns = &conn->pktns; - break; - default: - ngtcp2_unreachable(); - } - conn_ack_crypto_data(conn, pktns, datalen); break; @@ -675,15 +661,18 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (strm == NULL) { break; } + strm->flags |= NGTCP2_STRM_FLAG_RESET_STREAM_ACKED; + rv = ngtcp2_conn_close_stream_if_shut_rdwr(conn, strm); if (rv != 0) { return rv; } + break; case NGTCP2_FRAME_RETIRE_CONNECTION_ID: - ngtcp2_conn_untrack_retired_dcid_seq(conn, - frc->fr.retire_connection_id.seq); + ngtcp2_dcidtr_untrack_retired_seq(&conn->dcid.dtr, + frc->fr.retire_connection_id.seq); break; case NGTCP2_FRAME_NEW_CONNECTION_ID: assert(conn->scid.num_in_flight); @@ -702,14 +691,17 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } + break; } } + return 0; } static void rtb_on_pkt_acked(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, - ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { + ngtcp2_conn_stat *cstat, const ngtcp2_pktns *pktns, + ngtcp2_tstamp ts) { ngtcp2_cc *cc = rtb->cc; ngtcp2_cc_pkt pkt; @@ -718,7 +710,7 @@ static void rtb_on_pkt_acked(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (cc->on_pkt_acked) { cc->on_pkt_acked(cc, cstat, ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, - rtb->pktns_id, ent->ts, ent->rst.lost, + pktns->id, ent->ts, ent->rst.lost, ent->rst.tx_in_flight, ent->rst.is_app_limited), ts); @@ -741,16 +733,17 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, if ((ecn_acked && fr->type == NGTCP2_FRAME_ACK) || (fr->type == NGTCP2_FRAME_ACK_ECN && - (pktns->rx.ecn.ack.ect0 > fr->ecn.ect0 || - pktns->rx.ecn.ack.ect1 > fr->ecn.ect1 || - pktns->rx.ecn.ack.ce > fr->ecn.ce || - (fr->ecn.ect0 - pktns->rx.ecn.ack.ect0) + - (fr->ecn.ce - pktns->rx.ecn.ack.ce) < - ecn_acked || + (pktns->acktr.ecn.ack.ect0 > fr->ecn.ect0 || + pktns->acktr.ecn.ack.ect1 > fr->ecn.ect1 || + pktns->acktr.ecn.ack.ce > fr->ecn.ce || + (fr->ecn.ect0 - pktns->acktr.ecn.ack.ect0) + + (fr->ecn.ce - pktns->acktr.ecn.ack.ce) < + ecn_acked || fr->ecn.ect0 > pktns->tx.ecn.ect0 || fr->ecn.ect1))) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "path is not ECN capable"); conn->tx.ecn.state = NGTCP2_ECN_STATE_FAILED; + return; } @@ -761,13 +754,13 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, if (fr->type == NGTCP2_FRAME_ACK_ECN) { if (cc->congestion_event && largest_pkt_sent_ts != UINT64_MAX && - fr->ecn.ce > pktns->rx.ecn.ack.ce) { - cc->congestion_event(cc, cstat, largest_pkt_sent_ts, ts); + fr->ecn.ce > pktns->acktr.ecn.ack.ce) { + cc->congestion_event(cc, cstat, largest_pkt_sent_ts, 0, ts); } - pktns->rx.ecn.ack.ect0 = fr->ecn.ect0; - pktns->rx.ecn.ack.ect1 = fr->ecn.ect1; - pktns->rx.ecn.ack.ce = fr->ecn.ce; + pktns->acktr.ecn.ack.ect0 = fr->ecn.ect0; + pktns->acktr.ecn.ack.ect1 = fr->ecn.ect1; + pktns->acktr.ecn.ack.ce = fr->ecn.ce; } } @@ -784,7 +777,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, size_t i; int rv; ngtcp2_ksl_it it; - ngtcp2_ssize num_acked = 0; + size_t num_acked = 0; ngtcp2_tstamp largest_pkt_sent_ts = UINT64_MAX; int64_t pkt_num; ngtcp2_cc *cc = rtb->cc; @@ -820,6 +813,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, largest_pkt_sent_ts, ts); } + return 0; } @@ -848,7 +842,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ++num_acked; } - for (i = 0; i < fr->rangecnt;) { + for (i = 0; i < fr->rangecnt; ++i) { largest_ack = min_ack - (int64_t)fr->ranges[i].gap - 2; min_ack = largest_ack - (int64_t)fr->ranges[i].len; @@ -862,6 +856,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, if (pkt_num < min_ack) { break; } + ent = ngtcp2_ksl_it_get(&it); if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { @@ -871,12 +866,11 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, rtb_remove(rtb, &it, &acked_ent, ent, cstat); ++num_acked; } - - ++i; } if (largest_pkt_sent_ts != UINT64_MAX && ack_eliciting_pkt_acked) { - cc_ack.rtt = pkt_ts - largest_pkt_sent_ts; + cc_ack.rtt = + ngtcp2_max_uint64(pkt_ts - largest_pkt_sent_ts, NGTCP2_NANOSECONDS); rv = ngtcp2_conn_update_rtt(conn, cc_ack.rtt, fr->ack_delay_unscaled, ts); if (rv == 0 && cc->new_rtt_sample) { @@ -891,7 +885,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ++ecn_acked; } - rv = rtb_process_acked_pkt(rtb, ent, conn); + rv = process_acked_pkt(ent, conn, pktns); if (rv != 0) { goto fail; } @@ -903,7 +897,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, cc_ack.pkt_delivered = ent->rst.delivered; } - rtb_on_pkt_acked(rtb, ent, cstat, ts); + rtb_on_pkt_acked(rtb, ent, cstat, pktns, ts); acked_ent = ent->next; ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); @@ -916,7 +910,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, } else { /* For unit tests */ for (ent = acked_ent; ent; ent = acked_ent) { - rtb_on_pkt_acked(rtb, ent, cstat, ts); + rtb_on_pkt_acked(rtb, ent, cstat, pktns, ts); acked_ent = ent->next; ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); @@ -924,27 +918,29 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, } if (rtb->cc->on_spurious_congestion && num_lost_pkts && - rtb->num_lost_pkts - rtb->num_lost_pmtud_pkts == 0) { + rtb->num_lost_pkts == rtb->num_lost_pmtud_pkts) { rtb->cc->on_spurious_congestion(cc, cstat, ts); } - ngtcp2_rst_on_ack_recv(rtb->rst, cstat, cc_ack.pkt_delivered); + if (num_acked) { + ngtcp2_rst_on_ack_recv(rtb->rst, cstat); - if (conn && num_acked > 0) { - rv = rtb_detect_lost_pkt(rtb, &cc_ack.bytes_lost, conn, pktns, cstat, ts); - if (rv != 0) { - return rv; + if (conn) { + rv = rtb_detect_lost_pkt(rtb, &cc_ack.bytes_lost, conn, pktns, cstat, ts); + if (rv != 0) { + return rv; + } } } rtb->rst->lost += cc_ack.bytes_lost; cc_ack.largest_pkt_sent_ts = largest_pkt_sent_ts; - if (cc->on_ack_recv) { + if (num_acked && cc->on_ack_recv) { cc->on_ack_recv(cc, cstat, &cc_ack, ts); } - return num_acked; + return (ngtcp2_ssize)num_acked; fail: for (ent = acked_ent; ent; ent = acked_ent) { @@ -958,7 +954,8 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, const ngtcp2_rtb_entry *ent, ngtcp2_duration loss_delay, - size_t pkt_thres, ngtcp2_tstamp ts) { + size_t pkt_thres, const ngtcp2_pktns *pktns, + ngtcp2_tstamp ts) { ngtcp2_tstamp loss_time; if (ngtcp2_tstamp_elapsed(ent->ts, loss_delay, ts) || @@ -966,27 +963,27 @@ static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, return 1; } - loss_time = cstat->loss_time[rtb->pktns_id]; + loss_time = cstat->loss_time[pktns->id]; if (loss_time == UINT64_MAX) { loss_time = ent->ts + loss_delay; } else { - loss_time = ngtcp2_min(loss_time, ent->ts + loss_delay); + loss_time = ngtcp2_min_uint64(loss_time, ent->ts + loss_delay); } - cstat->loss_time[rtb->pktns_id] = loss_time; + cstat->loss_time[pktns->id] = loss_time; return 0; } /* - * rtb_compute_pkt_loss_delay computes loss delay. + * compute_pkt_loss_delay computes loss delay. */ static ngtcp2_duration compute_pkt_loss_delay(const ngtcp2_conn_stat *cstat) { /* 9/8 is kTimeThreshold */ ngtcp2_duration loss_delay = - ngtcp2_max(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; - return ngtcp2_max(loss_delay, NGTCP2_GRANULARITY); + ngtcp2_max_uint64(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; + return ngtcp2_max_uint64(loss_delay, NGTCP2_GRANULARITY); } /* @@ -999,9 +996,9 @@ static int conn_all_ecn_pkt_lost(ngtcp2_conn *conn) { ngtcp2_pktns *pktns = &conn->pktns; return (!in_pktns || in_pktns->tx.ecn.validation_pkt_sent == - in_pktns->tx.ecn.validation_pkt_lost) && + in_pktns->tx.ecn.validation_pkt_lost) && (!hs_pktns || hs_pktns->tx.ecn.validation_pkt_sent == - hs_pktns->tx.ecn.validation_pkt_lost) && + hs_pktns->tx.ecn.validation_pkt_lost) && pktns->tx.ecn.validation_pkt_sent == pktns->tx.ecn.validation_pkt_lost; } @@ -1017,16 +1014,16 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, ngtcp2_cc *cc = rtb->cc; int rv; uint64_t pkt_thres = - rtb->cc_bytes_in_flight / cstat->max_tx_udp_payload_size / 2; + rtb->cc_bytes_in_flight / cstat->max_tx_udp_payload_size / 2; size_t ecn_pkt_lost = 0; ngtcp2_tstamp start_ts; ngtcp2_duration pto = ngtcp2_conn_compute_pto(conn, pktns); uint64_t bytes_lost = 0; ngtcp2_duration max_ack_delay; - pkt_thres = ngtcp2_max(pkt_thres, NGTCP2_PKT_THRESHOLD); - pkt_thres = ngtcp2_min(pkt_thres, 256); - cstat->loss_time[rtb->pktns_id] = UINT64_MAX; + pkt_thres = ngtcp2_max_uint64(pkt_thres, NGTCP2_PKT_THRESHOLD); + pkt_thres = ngtcp2_min_uint64(pkt_thres, 256); + cstat->loss_time[pktns->id] = UINT64_MAX; loss_delay = compute_pkt_loss_delay(cstat); it = ngtcp2_ksl_lower_bound(&rtb->ents, &rtb->largest_acked_tx_pkt_num); @@ -1037,25 +1034,27 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, break; } - if (rtb_pkt_lost(rtb, cstat, ent, loss_delay, (size_t)pkt_thres, ts)) { + if (rtb_pkt_lost(rtb, cstat, ent, loss_delay, (size_t)pkt_thres, pktns, + ts)) { /* All entries from ent are considered to be lost. */ latest_ts = oldest_ts = ent->ts; /* +1 to pick this packet for persistent congestion in the following loop. */ last_lost_pkt_num = ent->hd.pkt_num + 1; max_ack_delay = conn->remote.transport_params - ? conn->remote.transport_params->max_ack_delay - : 0; + ? conn->remote.transport_params->max_ack_delay + : 0; congestion_period = - (cstat->smoothed_rtt + - ngtcp2_max(4 * cstat->rttvar, NGTCP2_GRANULARITY) + max_ack_delay) * - NGTCP2_PERSISTENT_CONGESTION_THRESHOLD; + (cstat->smoothed_rtt + + ngtcp2_max_uint64(4 * cstat->rttvar, NGTCP2_GRANULARITY) + + max_ack_delay) * + NGTCP2_PERSISTENT_CONGESTION_THRESHOLD; - start_ts = ngtcp2_max(rtb->persistent_congestion_start_ts, - cstat->first_rtt_sample_ts); + start_ts = ngtcp2_max_uint64(conn->handshake_confirmed_ts, + cstat->first_rtt_sample_ts); - for (; !ngtcp2_ksl_it_end(&it);) { + for (; !ngtcp2_ksl_it_end(&it); ngtcp2_ksl_it_next(&it)) { ent = ngtcp2_ksl_it_get(&it); if (last_lost_pkt_num == ent->hd.pkt_num + 1 && ent->ts >= start_ts) { @@ -1066,12 +1065,12 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } if ((ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)) { - if (rtb->pktns_id != NGTCP2_PKTNS_ID_APPLICATION || + if (pktns->id != NGTCP2_PKTNS_ID_APPLICATION || last_lost_pkt_num == -1 || latest_ts - oldest_ts >= congestion_period) { break; } - ngtcp2_ksl_it_next(&it); + continue; } @@ -1081,7 +1080,7 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } bytes_lost += rtb_on_remove(rtb, ent, cstat); - rv = rtb_on_pkt_lost(rtb, &it, ent, cstat, conn, pktns, ts); + rv = rtb_on_pkt_lost(rtb, ent, cstat, conn, pktns, ts); if (rv != 0) { return rv; } @@ -1098,13 +1097,16 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, if (conn->tx.ecn.validation_start_ts == UINT64_MAX) { break; } + if (ts - conn->tx.ecn.validation_start_ts < 3 * pto) { pktns->tx.ecn.validation_pkt_lost += ecn_pkt_lost; assert(pktns->tx.ecn.validation_pkt_sent >= pktns->tx.ecn.validation_pkt_lost); break; } + conn->tx.ecn.state = NGTCP2_ECN_STATE_UNKNOWN; + /* fall through */ case NGTCP2_ECN_STATE_UNKNOWN: pktns->tx.ecn.validation_pkt_lost += ecn_pkt_lost; @@ -1119,7 +1121,7 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } if (cc->congestion_event) { - cc->congestion_event(cc, cstat, latest_ts, ts); + cc->congestion_event(cc, cstat, latest_ts, bytes_lost, ts); } loss_window = latest_ts - oldest_ts; @@ -1130,23 +1132,22 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, * persistent congestion there, then it is a lot easier to just * not enable it during handshake. */ - if (rtb->pktns_id == NGTCP2_PKTNS_ID_APPLICATION && loss_window > 0) { - if (loss_window >= congestion_period) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "persistent congestion loss_window=%" PRIu64 - " congestion_period=%" PRIu64, - loss_window, congestion_period); - - /* Reset min_rtt, srtt, and rttvar here. Next new RTT - sample will be used to recalculate these values. */ - cstat->min_rtt = UINT64_MAX; - cstat->smoothed_rtt = conn->local.settings.initial_rtt; - cstat->rttvar = conn->local.settings.initial_rtt / 2; - cstat->first_rtt_sample_ts = UINT64_MAX; - - if (cc->on_persistent_congestion) { - cc->on_persistent_congestion(cc, cstat, ts); - } + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && loss_window && + loss_window >= congestion_period) { + ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, + "persistent congestion loss_window=%" PRIu64 + " congestion_period=%" PRIu64, + loss_window, congestion_period); + + /* Reset min_rtt, srtt, and rttvar here. Next new RTT + sample will be used to recalculate these values. */ + cstat->min_rtt = UINT64_MAX; + cstat->smoothed_rtt = conn->local.settings.initial_rtt; + cstat->rttvar = conn->local.settings.initial_rtt / 2; + cstat->first_rtt_sample_ts = UINT64_MAX; + + if (cc->on_persistent_congestion) { + cc->on_persistent_congestion(cc, cstat, ts); } } @@ -1243,7 +1244,7 @@ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_duration pto, } } -ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(ngtcp2_rtb *rtb) { +ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(const ngtcp2_rtb *rtb) { ngtcp2_ksl_it it; ngtcp2_rtb_entry *ent; @@ -1285,14 +1286,6 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, return 0; } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "pkn=%" PRId64 - " is a PMTUD probe packet, no retransmission is necessary", - ent->hd.pkt_num); - return 0; - } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED) { --rtb->num_lost_pkts; @@ -1338,11 +1331,13 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); break; } + rv = ngtcp2_strm_streamfrq_push(strm, frc); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); return rv; } + if (!ngtcp2_strm_is_tx_queued(strm)) { strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); rv = ngtcp2_conn_tx_strmq_push(conn, strm); @@ -1350,6 +1345,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, return rv; } } + break; case NGTCP2_FRAME_CRYPTO: frc = *pfrc; @@ -1363,6 +1359,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); return rv; } + break; case NGTCP2_FRAME_DATAGRAM: case NGTCP2_FRAME_DATAGRAM_LEN: @@ -1379,6 +1376,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); + break; default: pfrc = &(*pfrc)->next; @@ -1408,8 +1406,10 @@ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, assert(0 == rv); rv = rtb_on_pkt_lost_resched_move(rtb, conn, pktns, ent); + ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); + if (rv != 0) { return rv; } @@ -1443,7 +1443,7 @@ void ngtcp2_rtb_remove_early_data(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat) { } } -int ngtcp2_rtb_empty(ngtcp2_rtb *rtb) { +int ngtcp2_rtb_empty(const ngtcp2_rtb *rtb) { return ngtcp2_ksl_len(&rtb->ents) == 0; } @@ -1460,7 +1460,7 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, size_t atmost = num_pkts; it = ngtcp2_ksl_end(&rtb->ents); - for (; !ngtcp2_ksl_it_begin(&it) && num_pkts >= 1;) { + for (; !ngtcp2_ksl_it_begin(&it) && num_pkts;) { ngtcp2_ksl_it_prev(&it); ent = ngtcp2_ksl_it_get(&it); @@ -1473,13 +1473,13 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, assert(ent->frc); reclaimed = - rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_NONE, conn, pktns, ent); + rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_NONE, conn, pktns, ent); if (reclaimed < 0) { return reclaimed; } - /* Mark reclaimed even if reclaimed == 0 so that we can skip it in - the next run. */ + /* Mark ent reclaimed even if reclaimed == 0 so that we can skip + it in the next run. */ ent->flags |= NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED; assert(rtb->num_retransmittable); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h index a1ff208b19eac7..3a9397eac5bb6f 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -85,7 +85,7 @@ typedef struct ngtcp2_rtb_entry ngtcp2_rtb_entry; /* * ngtcp2_rtb_entry is an object stored in ngtcp2_rtb. It corresponds - * to the one packet which is waiting for its ACK. + * to the one packet which is waiting for its acknowledgement. */ struct ngtcp2_rtb_entry { union { @@ -98,10 +98,11 @@ struct ngtcp2_rtb_entry { uint8_t flags; } hd; ngtcp2_frame_chain *frc; - /* ts is the time point when a packet included in this entry is sent - to a peer. */ + /* ts is the time point when a packet included in this entry is + sent to a remote endpoint. */ ngtcp2_tstamp ts; - /* lost_ts is the time when this entry is marked lost. */ + /* lost_ts is the time when this entry is declared to be + lost. */ ngtcp2_tstamp lost_ts; /* pktlen is the length of QUIC packet */ size_t pktlen; @@ -111,6 +112,7 @@ struct ngtcp2_rtb_entry { ngtcp2_tstamp first_sent_ts; uint64_t tx_in_flight; uint64_t lost; + int64_t end_seq; int is_app_limited; } rst; /* flags is bitwise-OR of zero or more of @@ -122,11 +124,11 @@ struct ngtcp2_rtb_entry { }; }; -ngtcp2_objalloc_decl(rtb_entry, ngtcp2_rtb_entry, oplent); +ngtcp2_objalloc_decl(rtb_entry, ngtcp2_rtb_entry, oplent) /* - * ngtcp2_rtb_entry_new allocates ngtcp2_rtb_entry object, and assigns - * its pointer to |*pent|. + * ngtcp2_rtb_entry_objalloc_new allocates ngtcp2_rtb_entry object via + * |objalloc|, and assigns its pointer to |*pent|. */ int ngtcp2_rtb_entry_objalloc_new(ngtcp2_rtb_entry **pent, const ngtcp2_pkt_hd *hd, @@ -145,7 +147,7 @@ void ngtcp2_rtb_entry_objalloc_del(ngtcp2_rtb_entry *ent, const ngtcp2_mem *mem); /* - * ngtcp2_rtb tracks sent packets, and its ACK timeout for + * ngtcp2_rtb tracks sent packets, and its acknowledgement timeout for * retransmission. */ typedef struct ngtcp2_rtb { @@ -154,39 +156,34 @@ typedef struct ngtcp2_rtb { /* ents includes ngtcp2_rtb_entry sorted by decreasing order of packet number. */ ngtcp2_ksl ents; - /* crypto is CRYPTO stream. */ - ngtcp2_strm *crypto; ngtcp2_rst *rst; ngtcp2_cc *cc; ngtcp2_log *log; ngtcp2_qlog *qlog; const ngtcp2_mem *mem; /* largest_acked_tx_pkt_num is the largest packet number - acknowledged by the peer. */ + acknowledged by a remote endpoint. */ int64_t largest_acked_tx_pkt_num; - /* num_ack_eliciting is the number of ACK eliciting entries. */ + /* num_ack_eliciting is the number of ACK eliciting entries in + ents. */ size_t num_ack_eliciting; /* num_retransmittable is the number of packets which contain frames - that must be retransmitted on loss. */ + that must be retransmitted on loss in ents. */ size_t num_retransmittable; /* num_pto_eliciting is the number of packets that elicit PTO probe - packets. */ + packets in ents. */ size_t num_pto_eliciting; /* probe_pkt_left is the number of probe packet to send */ size_t probe_pkt_left; - /* pktns_id is the identifier of packet number space. */ - ngtcp2_pktns_id pktns_id; /* cc_pkt_num is the smallest packet number that is contributed to ngtcp2_conn_stat.bytes_in_flight. */ int64_t cc_pkt_num; /* cc_bytes_in_flight is the number of in-flight bytes that is contributed to ngtcp2_conn_stat.bytes_in_flight. It only - includes the bytes after congestion state is reset. */ + includes the bytes after congestion state is reset, that is only + count a packet whose packet number is greater than or equals to + cc_pkt_num. */ uint64_t cc_bytes_in_flight; - /* persistent_congestion_start_ts is the time when persistent - congestion evaluation is started. It happens roughly after - handshake is confirmed. */ - ngtcp2_tstamp persistent_congestion_start_ts; /* num_lost_pkts is the number entries in ents which has NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED flag set. */ size_t num_lost_pkts; @@ -199,8 +196,7 @@ typedef struct ngtcp2_rtb { /* * ngtcp2_rtb_init initializes |rtb|. */ -void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, - ngtcp2_strm *crypto, ngtcp2_rst *rst, ngtcp2_cc *cc, +void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t cc_pkt_num, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem); @@ -227,13 +223,13 @@ int ngtcp2_rtb_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, * which has the largest packet number. If there is no entry, * returned value satisfies ngtcp2_ksl_it_end(&it) != 0. */ -ngtcp2_ksl_it ngtcp2_rtb_head(ngtcp2_rtb *rtb); +ngtcp2_ksl_it ngtcp2_rtb_head(const ngtcp2_rtb *rtb); /* - * ngtcp2_rtb_recv_ack removes acked ngtcp2_rtb_entry from |rtb|. - * |pkt_num| is a packet number which includes |fr|. |pkt_ts| is the - * timestamp when packet is received. |ts| should be the current - * time. Usually they are the same, but for buffered packets, + * ngtcp2_rtb_recv_ack removes an acknowledged ngtcp2_rtb_entry from + * |rtb|. |pkt_num| is a packet number which includes |fr|. |pkt_ts| + * is the timestamp when packet is received. |ts| should be the + * current time. Usually they are the same, but for buffered packets, * |pkt_ts| would be earlier than |ts|. * * This function returns the number of newly acknowledged packets if @@ -252,7 +248,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, /* * ngtcp2_rtb_detect_lost_pkt detects lost packets and prepends the * frames contained them to |*pfrc|. Even when this function fails, - * some frames might be prepended to |*pfrc| and the caller should + * some frames might be prepended to |*pfrc|, and the caller should * handle them. */ int ngtcp2_rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_conn *conn, @@ -266,16 +262,16 @@ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_duration pto, ngtcp2_tstamp ts); /* - * ngtcp2_rtb_lost_pkt_ts returns the earliest time when the still - * retained packet was lost. It returns UINT64_MAX if no such packet - * exists. + * ngtcp2_rtb_lost_pkt_ts returns the timestamp when an oldest lost + * packet tracked by |rtb| was declared lost. It returns UINT64_MAX + * if no such packet exists. */ -ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(ngtcp2_rtb *rtb); +ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(const ngtcp2_rtb *rtb); /* - * ngtcp2_rtb_remove_all removes all packets from |rtb| and prepends + * ngtcp2_rtb_remove_all removes all packets from |rtb|, and prepends * all frames to |*pfrc|. Even when this function fails, some frames - * might be prepended to |*pfrc| and the caller should handle them. + * might be prepended to |*pfrc|, and the caller should handle them. */ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat); @@ -286,9 +282,9 @@ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, void ngtcp2_rtb_remove_early_data(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat); /* - * ngtcp2_rtb_empty returns nonzero if |rtb| have no entry. + * ngtcp2_rtb_empty returns nonzero if |rtb| has no entry. */ -int ngtcp2_rtb_empty(ngtcp2_rtb *rtb); +int ngtcp2_rtb_empty(const ngtcp2_rtb *rtb); /* * ngtcp2_rtb_reset_cc_state resets congestion state in |rtb|. @@ -298,15 +294,15 @@ int ngtcp2_rtb_empty(ngtcp2_rtb *rtb); void ngtcp2_rtb_reset_cc_state(ngtcp2_rtb *rtb, int64_t cc_pkt_num); /* - * ngtcp2_rtb_remove_expired_lost_pkt ensures that the number of lost - * packets at most |n|. + * ngtcp2_rtb_remove_excessive_lost_pkt ensures that the number of + * lost packets is at most |n|. */ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n); /* * ngtcp2_rtb_reclaim_on_pto reclaims up to |num_pkts| packets which - * are in-flight and not marked lost to send them in PTO probe. The - * reclaimed frames are chained to |*pfrc|. + * are in-flight and not marked lost. The reclaimed frames may be + * sent in a PTO probe packet. * * This function returns the number of packets reclaimed if it * succeeds, or one of the following negative error codes: @@ -317,4 +313,4 @@ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n); ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_pktns *pktns, size_t num_pkts); -#endif /* NGTCP2_RTB_H */ +#endif /* !defined(NGTCP2_RTB_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c new file mode 100644 index 00000000000000..77a68bd112e3b2 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c @@ -0,0 +1,91 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * 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. + */ +#include "ngtcp2_settings.h" + +#include <string.h> +#include <assert.h> + +#include "ngtcp2_unreachable.h" + +void ngtcp2_settings_default_versioned(int settings_version, + ngtcp2_settings *settings) { + size_t len = ngtcp2_settingslen_version(settings_version); + + memset(settings, 0, len); + + switch (settings_version) { + case NGTCP2_SETTINGS_VERSION: + case NGTCP2_SETTINGS_V1: + settings->cc_algo = NGTCP2_CC_ALGO_CUBIC; + settings->initial_rtt = NGTCP2_DEFAULT_INITIAL_RTT; + settings->ack_thresh = 2; + settings->max_tx_udp_payload_size = 1500 - 48; + settings->handshake_timeout = UINT64_MAX; + + break; + } +} + +static void settings_copy(ngtcp2_settings *dest, const ngtcp2_settings *src, + int settings_version) { + assert(settings_version != NGTCP2_SETTINGS_VERSION); + + memcpy(dest, src, ngtcp2_settingslen_version(settings_version)); +} + +const ngtcp2_settings * +ngtcp2_settings_convert_to_latest(ngtcp2_settings *dest, int settings_version, + const ngtcp2_settings *src) { + if (settings_version == NGTCP2_SETTINGS_VERSION) { + return src; + } + + ngtcp2_settings_default(dest); + + settings_copy(dest, src, settings_version); + + return dest; +} + +void ngtcp2_settings_convert_to_old(int settings_version, ngtcp2_settings *dest, + const ngtcp2_settings *src) { + assert(settings_version != NGTCP2_SETTINGS_VERSION); + + settings_copy(dest, src, settings_version); +} + +size_t ngtcp2_settingslen_version(int settings_version) { + ngtcp2_settings settings; + + switch (settings_version) { + case NGTCP2_SETTINGS_VERSION: + return sizeof(settings); + case NGTCP2_SETTINGS_V1: + return offsetof(ngtcp2_settings, initial_pkt_num) + + sizeof(settings.initial_pkt_num); + default: + ngtcp2_unreachable(); + } +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h new file mode 100644 index 00000000000000..80466d43e47a7a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h @@ -0,0 +1,73 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * 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. + */ +#ifndef NGTCP2_SETTINGS_H +#define NGTCP2_SETTINGS_H + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif /* defined(HAVE_CONFIG_H) */ + +#include <ngtcp2/ngtcp2.h> + +/* + * ngtcp2_settings_convert_to_latest converts |src| of version + * |settings_version| to the latest version NGTCP2_SETTINGS_VERSION. + * + * |dest| must point to the latest version. |src| may be the older + * version, and if so, it may have fewer fields. Accessing those + * fields causes undefined behavior. + * + * If |settings_version| == NGTCP2_SETTINGS_VERSION, no conversion is + * made, and |src| is returned. Otherwise, first |dest| is + * initialized via ngtcp2_settings_default, and then all valid fields + * in |src| are copied into |dest|. Finally, |dest| is returned. + */ +const ngtcp2_settings * +ngtcp2_settings_convert_to_latest(ngtcp2_settings *dest, int settings_version, + const ngtcp2_settings *src); + +/* + * ngtcp2_settings_convert_to_old converts |src| of the latest version + * to |dest| of version |settings_version|. + * + * |settings_version| must not be the latest version + * NGTCP2_SETTINGS_VERSION. + * + * |dest| points to the older version, and it may have fewer fields. + * Accessing those fields causes undefined behavior. + * + * This function copies all valid fields in version |settings_version| + * from |src| to |dest|. + */ +void ngtcp2_settings_convert_to_old(int settings_version, ngtcp2_settings *dest, + const ngtcp2_settings *src); + +/* + * ngtcp2_settingslen_version returns the effective length of + * ngtcp2_settings at the version |settings_version|. + */ +size_t ngtcp2_settingslen_version(int settings_version); + +#endif /* !defined(NGTCP2_SETTINGS_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h index deb75e356d70d4..f970c153e805a8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -91,4 +91,4 @@ char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data, */ int ngtcp2_cmemeq(const uint8_t *a, const uint8_t *b, size_t n); -#endif /* NGTCP2_STR_H */ +#endif /* !defined(NGTCP2_STR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c index c00e86fa8c1afa..8ea969c4addbdc 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c @@ -32,16 +32,13 @@ #include "ngtcp2_vec.h" #include "ngtcp2_frame_chain.h" -static int offset_less(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs < *(int64_t *)rhs; -} - void ngtcp2_strm_init(ngtcp2_strm *strm, int64_t stream_id, uint32_t flags, uint64_t max_rx_offset, uint64_t max_tx_offset, void *stream_user_data, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - strm->frc_objalloc = frc_objalloc; + strm->pe.index = NGTCP2_PQ_BAD_INDEX; strm->cycle = 0; + strm->frc_objalloc = frc_objalloc; strm->tx.acked_offset = NULL; strm->tx.cont_acked_offset = 0; strm->tx.streamfrq = NULL; @@ -56,13 +53,12 @@ void ngtcp2_strm_init(ngtcp2_strm *strm, int64_t stream_id, uint32_t flags, strm->rx.rob = NULL; strm->rx.cont_offset = 0; strm->rx.last_offset = 0; + strm->rx.max_offset = strm->rx.unsent_max_offset = strm->rx.window = + max_rx_offset; + strm->mem = mem; strm->stream_id = stream_id; - strm->flags = flags; strm->stream_user_data = stream_user_data; - strm->rx.window = strm->rx.max_offset = strm->rx.unsent_max_offset = - max_rx_offset; - strm->pe.index = NGTCP2_PQ_BAD_INDEX; - strm->mem = mem; + strm->flags = flags; strm->app_error_code = 0; } @@ -114,7 +110,7 @@ static int strm_rob_init(ngtcp2_strm *strm) { return 0; } -uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm) { if (strm->rx.rob == NULL) { return strm->rx.cont_offset; } @@ -123,7 +119,7 @@ uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm) { /* strm_rob_heavily_fragmented returns nonzero if the number of gaps in |rob| exceeds the limit. */ -static int strm_rob_heavily_fragmented(ngtcp2_rob *rob) { +static int strm_rob_heavily_fragmented(const ngtcp2_rob *rob) { return ngtcp2_ksl_len(&rob->gapksl) >= 5000; } @@ -180,7 +176,8 @@ static int strm_streamfrq_init(ngtcp2_strm *strm) { return NGTCP2_ERR_NOMEM; } - ngtcp2_ksl_init(streamfrq, offset_less, sizeof(uint64_t), strm->mem); + ngtcp2_ksl_init(streamfrq, ngtcp2_ksl_uint64_less, + ngtcp2_ksl_uint64_less_search, sizeof(uint64_t), strm->mem); strm->tx.streamfrq = streamfrq; @@ -271,6 +268,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, } ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + continue; } @@ -306,11 +304,12 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->data[0].len -= (size_t)base_offset; *pfrc = frc; + return 0; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->datacnt - end_idx, strm->frc_objalloc, strm->mem); + &nfrc, fr->datacnt - end_idx, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; @@ -336,6 +335,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } @@ -350,14 +350,17 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->fin = 0; fr->offset = offset + base_offset; fr->datacnt = end_idx - idx; + if (end_base_offset) { assert(fr->data[fr->datacnt - 1].len > end_base_offset); fr->data[fr->datacnt - 1].len = (size_t)end_base_offset; } + fr->data[0].base += base_offset; fr->data[0].len -= (size_t)base_offset; *pfrc = frc; + return 0; } @@ -367,7 +370,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, size_t left) { ngtcp2_stream *fr, *nfr; - ngtcp2_frame_chain *frc, *nfrc; + ngtcp2_frame_chain *frc, *nfrc, *sfrc; int rv; size_t nmerged; uint64_t datalen; @@ -385,6 +388,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, if (rv != 0) { return rv; } + if (frc == NULL) { *pfrc = NULL; return 0; @@ -401,7 +405,9 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; } + *pfrc = NULL; + return 0; } @@ -410,13 +416,13 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, acnt = fr->datacnt; bcnt = 0; - ngtcp2_vec_split(a, &acnt, b, &bcnt, left, NGTCP2_MAX_STREAM_DATACNT); + ngtcp2_vec_split(b, &bcnt, a, &acnt, left, NGTCP2_MAX_STREAM_DATACNT); assert(acnt > 0); assert(bcnt > 0); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, bcnt, strm->frc_objalloc, strm->mem); + &nfrc, bcnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -437,11 +443,12 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, acnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -491,7 +498,9 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, break; } - nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &nfr->datacnt, left, + bcnt = nfr->datacnt; + + nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &bcnt, left, NGTCP2_MAX_STREAM_DATACNT); if (nmerged == 0) { rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); @@ -499,27 +508,56 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } + break; } datalen += nmerged; left -= nmerged; - if (nfr->datacnt == 0) { + if (bcnt == 0) { fr->fin = nfr->fin; ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); continue; } - nfr->offset += nmerged; + if (nfr->datacnt <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES || + bcnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { + nfr->offset += nmerged; + nfr->datacnt = bcnt; + + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } + } else { + rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( + &sfrc, bcnt, strm->frc_objalloc, strm->mem); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } + + sfrc->fr.stream = nfrc->fr.stream; + sfrc->fr.stream.offset += nmerged; + sfrc->fr.stream.datacnt = bcnt; + ngtcp2_vec_copy(sfrc->fr.stream.data, nfrc->fr.stream.data, bcnt); - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); - if (rv != 0) { ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; + + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &sfrc->fr.stream.offset, + sfrc); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(sfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } } break; @@ -531,13 +569,14 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, } *pfrc = frc; + return 0; } assert(acnt > fr->datacnt); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, acnt, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; @@ -555,7 +594,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return 0; } -uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_streamfrq_unacked_offset(const ngtcp2_strm *strm) { ngtcp2_frame_chain *frc; ngtcp2_stream *fr; ngtcp2_range gap; @@ -577,9 +616,11 @@ uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { if (gap.begin <= fr->offset) { return fr->offset; } + if (gap.begin < fr->offset + datalen) { return gap.begin; } + if (fr->offset + datalen == gap.begin && fr->fin && !(strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED)) { return fr->offset + datalen; @@ -589,17 +630,18 @@ uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { return (uint64_t)-1; } -ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(ngtcp2_strm *strm) { +ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(const ngtcp2_strm *strm) { ngtcp2_ksl_it it; assert(strm->tx.streamfrq); assert(ngtcp2_ksl_len(strm->tx.streamfrq)); it = ngtcp2_ksl_begin(strm->tx.streamfrq); + return ngtcp2_ksl_it_get(&it); } -int ngtcp2_strm_streamfrq_empty(ngtcp2_strm *strm) { +int ngtcp2_strm_streamfrq_empty(const ngtcp2_strm *strm) { return strm->tx.streamfrq == NULL || ngtcp2_ksl_len(strm->tx.streamfrq) == 0; } @@ -616,14 +658,15 @@ void ngtcp2_strm_streamfrq_clear(ngtcp2_strm *strm) { frc = ngtcp2_ksl_it_get(&it); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); } + ngtcp2_ksl_clear(strm->tx.streamfrq); } -int ngtcp2_strm_is_tx_queued(ngtcp2_strm *strm) { +int ngtcp2_strm_is_tx_queued(const ngtcp2_strm *strm) { return strm->pe.index != NGTCP2_PQ_BAD_INDEX; } -int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm) { +int ngtcp2_strm_is_all_tx_data_acked(const ngtcp2_strm *strm) { if (strm->tx.acked_offset == NULL) { return strm->tx.cont_acked_offset == strm->tx.offset; } @@ -632,12 +675,12 @@ int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm) { strm->tx.offset; } -int ngtcp2_strm_is_all_tx_data_fin_acked(ngtcp2_strm *strm) { +int ngtcp2_strm_is_all_tx_data_fin_acked(const ngtcp2_strm *strm) { return (strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED) && ngtcp2_strm_is_all_tx_data_acked(strm); } -ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, +ngtcp2_range ngtcp2_strm_get_unacked_range_after(const ngtcp2_strm *strm, uint64_t offset) { ngtcp2_range gap; @@ -650,7 +693,7 @@ ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, return ngtcp2_gaptr_get_first_gap_after(strm->tx.acked_offset, offset); } -uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_get_acked_offset(const ngtcp2_strm *strm) { if (strm->tx.acked_offset == NULL) { return strm->tx.cont_acked_offset; } @@ -660,7 +703,7 @@ uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm) { static int strm_acked_offset_init(ngtcp2_strm *strm) { ngtcp2_gaptr *acked_offset = - ngtcp2_mem_malloc(strm->mem, sizeof(*acked_offset)); + ngtcp2_mem_malloc(strm->mem, sizeof(*acked_offset)); if (acked_offset == NULL) { return NGTCP2_ERR_NOMEM; @@ -688,7 +731,7 @@ int ngtcp2_strm_ack_data(ngtcp2_strm *strm, uint64_t offset, uint64_t len) { } rv = - ngtcp2_gaptr_push(strm->tx.acked_offset, 0, strm->tx.cont_acked_offset); + ngtcp2_gaptr_push(strm->tx.acked_offset, 0, strm->tx.cont_acked_offset); if (rv != 0) { return rv; } @@ -709,24 +752,24 @@ void ngtcp2_strm_set_app_error_code(ngtcp2_strm *strm, strm->app_error_code = app_error_code; } -int ngtcp2_strm_require_retransmit_reset_stream(ngtcp2_strm *strm) { +int ngtcp2_strm_require_retransmit_reset_stream(const ngtcp2_strm *strm) { return !ngtcp2_strm_is_all_tx_data_fin_acked(strm); } -int ngtcp2_strm_require_retransmit_stop_sending(ngtcp2_strm *strm) { +int ngtcp2_strm_require_retransmit_stop_sending(const ngtcp2_strm *strm) { return !(strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) || ngtcp2_strm_rx_offset(strm) != strm->rx.last_offset; } -int ngtcp2_strm_require_retransmit_max_stream_data(ngtcp2_strm *strm, - ngtcp2_max_stream_data *fr) { +int ngtcp2_strm_require_retransmit_max_stream_data( + const ngtcp2_strm *strm, const ngtcp2_max_stream_data *fr) { return fr->max_stream_data == strm->rx.max_offset && !(strm->flags & (NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_STOP_SENDING)); } int ngtcp2_strm_require_retransmit_stream_data_blocked( - ngtcp2_strm *strm, ngtcp2_stream_data_blocked *fr) { + const ngtcp2_strm *strm, const ngtcp2_stream_data_blocked *fr) { return fr->offset == strm->tx.max_offset && !(strm->flags & NGTCP2_STRM_FLAG_SHUT_WR); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h index 385302a5eafa9f..c72f8b9dc89aca 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -86,6 +86,9 @@ typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; received from the remote endpoint. In this case, NGTCP2_STRM_FLAG_SHUT_WR is also set. */ #define NGTCP2_STRM_FLAG_STOP_SENDING_RECVED 0x800u +/* NGTCP2_STRM_FLAG_ANY_SENT indicates that any STREAM frame, + including empty one, has been sent. */ +#define NGTCP2_STRM_FLAG_ANY_SENT 0x1000u typedef struct ngtcp2_strm ngtcp2_strm; @@ -105,13 +108,13 @@ struct ngtcp2_strm { acked_offset is used instead. */ uint64_t cont_acked_offset; /* streamfrq contains STREAM or CRYPTO frame for - retransmission. The flow control credits have been paid - when they are transmitted first time. There are no + retransmission. The flow control credits have already been + paid when they are transmitted first time. There are no restriction regarding flow control for retransmission. */ ngtcp2_ksl *streamfrq; - /* offset is the next offset of outgoing data. In other words, it - is the number of bytes sent in this stream without - duplication. */ + /* offset is the next offset of new outgoing data. In other + words, it is the number of bytes sent in this stream + without duplication. */ uint64_t offset; /* max_tx_offset is the maximum offset that local endpoint can send for this stream. */ @@ -200,7 +203,7 @@ void ngtcp2_strm_free(ngtcp2_strm *strm); * ngtcp2_strm_rx_offset returns the minimum offset of stream data * which is not received yet. */ -uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm); /* * ngtcp2_strm_recv_reordering handles reordered data. @@ -215,8 +218,8 @@ int ngtcp2_strm_recv_reordering(ngtcp2_strm *strm, const uint8_t *data, size_t datalen, uint64_t offset); /* - * ngtcp2_strm_update_rx_offset tells that data up to offset bytes are - * received in order. + * ngtcp2_strm_update_rx_offset tells that data up to |offset| bytes + * are received in order. */ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset); @@ -227,13 +230,14 @@ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset); void ngtcp2_strm_discard_reordered_data(ngtcp2_strm *strm); /* - * ngtcp2_strm_shutdown shutdowns |strm|. |flags| should be - * NGTCP2_STRM_FLAG_SHUT_RD, and/or NGTCP2_STRM_FLAG_SHUT_WR. + * ngtcp2_strm_shutdown shutdowns |strm|. |flags| should be one of + * NGTCP2_STRM_FLAG_SHUT_RD, NGTCP2_STRM_FLAG_SHUT_WR, and + * NGTCP2_STRM_FLAG_SHUT_RDWR. */ void ngtcp2_strm_shutdown(ngtcp2_strm *strm, uint32_t flags); /* - * ngtcp2_strm_streamfrq_push pushes |frc| to streamfrq for + * ngtcp2_strm_streamfrq_push pushes |frc| to strm->tx.streamfrq for * retransmission. * * This function returns 0 if it succeeds, or one of the following @@ -245,11 +249,12 @@ void ngtcp2_strm_shutdown(ngtcp2_strm *strm, uint32_t flags); int ngtcp2_strm_streamfrq_push(ngtcp2_strm *strm, ngtcp2_frame_chain *frc); /* - * ngtcp2_strm_streamfrq_pop pops the first ngtcp2_frame_chain and - * assigns it to |*pfrc|. This function splits into or merges several - * ngtcp2_frame_chain objects so that the returned ngtcp2_frame_chain - * has at most |left| data length. If there is no frames to send, - * this function returns 0 and |*pfrc| is NULL. + * ngtcp2_strm_streamfrq_pop assigns a ngtcp2_frame_chain that only + * contains unacknowledged stream data with smallest offset to |*pfrc| + * for retransmission. The assigned ngtcp2_frame_chain has stream + * data at most |left| bytes. strm->tx.streamfrq is adjusted to + * exclude the portion of data included in it. If there is no stream + * data to send, this function returns 0 and |*pfrc| is NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -264,18 +269,18 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, * ngtcp2_strm_streamfrq_unacked_offset returns the smallest offset of * unacknowledged stream data held in strm->tx.streamfrq. */ -uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_streamfrq_unacked_offset(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_top returns the first ngtcp2_frame_chain. * The queue must not be empty. */ -ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(ngtcp2_strm *strm); +ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_empty returns nonzero if streamfrq is empty. */ -int ngtcp2_strm_streamfrq_empty(ngtcp2_strm *strm); +int ngtcp2_strm_streamfrq_empty(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_clear removes all frames from streamfrq. @@ -285,26 +290,26 @@ void ngtcp2_strm_streamfrq_clear(ngtcp2_strm *strm); /* * ngtcp2_strm_is_tx_queued returns nonzero if |strm| is queued. */ -int ngtcp2_strm_is_tx_queued(ngtcp2_strm *strm); +int ngtcp2_strm_is_tx_queued(const ngtcp2_strm *strm); /* * ngtcp2_strm_is_all_tx_data_acked returns nonzero if all outgoing * data for |strm| which have sent so far have been acknowledged. */ -int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm); +int ngtcp2_strm_is_all_tx_data_acked(const ngtcp2_strm *strm); /* * ngtcp2_strm_is_all_tx_data_fin_acked behaves like * ngtcp2_strm_is_all_tx_data_acked, but it also requires that STREAM * frame with fin bit set is acknowledged. */ -int ngtcp2_strm_is_all_tx_data_fin_acked(ngtcp2_strm *strm); +int ngtcp2_strm_is_all_tx_data_fin_acked(const ngtcp2_strm *strm); /* * ngtcp2_strm_get_unacked_range_after returns the range that is not - * acknowledged yet and intersects or comes after |offset|. + * acknowledged yet and includes or comes after |offset|. */ -ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, +ngtcp2_range ngtcp2_strm_get_unacked_range_after(const ngtcp2_strm *strm, uint64_t offset); /* @@ -312,11 +317,11 @@ ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, * this offset have been acknowledged by a remote endpoint. It * returns 0 if no data is acknowledged. */ -uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_get_acked_offset(const ngtcp2_strm *strm); /* - * ngtcp2_strm_ack_data tells |strm| that the data [offset, - * offset+len) is acknowledged by a remote endpoint. + * ngtcp2_strm_ack_data tells |strm| that the data [|offset|, |offset| + * + |len|) is acknowledged by a remote endpoint. */ int ngtcp2_strm_ack_data(ngtcp2_strm *strm, uint64_t offset, uint64_t len); @@ -331,26 +336,26 @@ void ngtcp2_strm_set_app_error_code(ngtcp2_strm *strm, uint64_t app_error_code); * ngtcp2_strm_require_retransmit_reset_stream returns nonzero if * RESET_STREAM frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_reset_stream(ngtcp2_strm *strm); +int ngtcp2_strm_require_retransmit_reset_stream(const ngtcp2_strm *strm); /* * ngtcp2_strm_require_retransmit_stop_sending returns nonzero if * STOP_SENDING frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_stop_sending(ngtcp2_strm *strm); +int ngtcp2_strm_require_retransmit_stop_sending(const ngtcp2_strm *strm); /* * ngtcp2_strm_require_retransmit_max_stream_data returns nonzero if * MAX_STREAM_DATA frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_max_stream_data(ngtcp2_strm *strm, - ngtcp2_max_stream_data *fr); +int ngtcp2_strm_require_retransmit_max_stream_data( + const ngtcp2_strm *strm, const ngtcp2_max_stream_data *fr); /* * ngtcp2_strm_require_retransmit_stream_data_blocked returns nonzero * if STREAM_DATA_BLOCKED frame frame should be retransmitted. */ int ngtcp2_strm_require_retransmit_stream_data_blocked( - ngtcp2_strm *strm, ngtcp2_stream_data_blocked *fr); + const ngtcp2_strm *strm, const ngtcp2_stream_data_blocked *fr); -#endif /* NGTCP2_STRM_H */ +#endif /* !defined(NGTCP2_STRM_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c new file mode 100644 index 00000000000000..ca517532e3a695 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c @@ -0,0 +1,889 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * 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. + */ +#include "ngtcp2_transport_params.h" + +#include <string.h> +#include <assert.h> + +#include "ngtcp2_conv.h" +#include "ngtcp2_str.h" +#include "ngtcp2_mem.h" +#include "ngtcp2_unreachable.h" + +void ngtcp2_transport_params_default_versioned( + int transport_params_version, ngtcp2_transport_params *params) { + size_t len; + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_VERSION: + len = sizeof(*params); + + break; + default: + ngtcp2_unreachable(); + } + + memset(params, 0, len); + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_VERSION: + params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; + params->active_connection_id_limit = + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; + params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; + params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; + + break; + } +} + +/* + * varint_paramlen returns the length of a single transport parameter + * which has variable integer in its parameter. + */ +static size_t varint_paramlen(ngtcp2_transport_param_id id, uint64_t param) { + size_t valuelen = ngtcp2_put_uvarintlen(param); + return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(valuelen) + valuelen; +} + +/* + * write_varint_param writes parameter |id| of the given |value| in + * varint encoding. It returns p + the number of bytes written. + */ +static uint8_t *write_varint_param(uint8_t *p, ngtcp2_transport_param_id id, + uint64_t value) { + p = ngtcp2_put_uvarint(p, id); + p = ngtcp2_put_uvarint(p, ngtcp2_put_uvarintlen(value)); + return ngtcp2_put_uvarint(p, value); +} + +/* + * zero_paramlen returns the length of a single transport parameter + * which has zero length value in its parameter. + */ +static size_t zero_paramlen(ngtcp2_transport_param_id id) { + return ngtcp2_put_uvarintlen(id) + 1; +} + +/* + * write_zero_param writes parameter |id| that has zero length value. + * It returns p + the number of bytes written. + */ +static uint8_t *write_zero_param(uint8_t *p, ngtcp2_transport_param_id id) { + p = ngtcp2_put_uvarint(p, id); + *p++ = 0; + + return p; +} + +/* + * cid_paramlen returns the length of a single transport parameter + * which has |cid| as value. + */ +static size_t cid_paramlen(ngtcp2_transport_param_id id, + const ngtcp2_cid *cid) { + return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(cid->datalen) + + cid->datalen; +} + +/* + * write_cid_param writes parameter |id| of the given |cid|. It + * returns p + the number of bytes written. + */ +static uint8_t *write_cid_param(uint8_t *p, ngtcp2_transport_param_id id, + const ngtcp2_cid *cid) { + assert(cid->datalen == 0 || cid->datalen >= NGTCP2_MIN_CIDLEN); + assert(cid->datalen <= NGTCP2_MAX_CIDLEN); + + p = ngtcp2_put_uvarint(p, id); + p = ngtcp2_put_uvarint(p, cid->datalen); + if (cid->datalen) { + p = ngtcp2_cpymem(p, cid->data, cid->datalen); + } + return p; +} + +static const uint8_t empty_address[16]; + +ngtcp2_ssize ngtcp2_transport_params_encode_versioned( + uint8_t *dest, size_t destlen, int transport_params_version, + const ngtcp2_transport_params *params) { + uint8_t *p; + size_t len = 0; + /* For some reason, gcc 7.3.0 requires this initialization. */ + size_t preferred_addrlen = 0; + size_t version_infolen = 0; + const ngtcp2_sockaddr_in *sa_in; + const ngtcp2_sockaddr_in6 *sa_in6; + ngtcp2_transport_params paramsbuf; + + params = ngtcp2_transport_params_convert_to_latest( + ¶msbuf, transport_params_version, params); + + if (params->original_dcid_present) { + len += + cid_paramlen(NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, + ¶ms->original_dcid); + } + + if (params->stateless_reset_token_present) { + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN) + + ngtcp2_put_uvarintlen(NGTCP2_STATELESS_RESET_TOKENLEN) + + NGTCP2_STATELESS_RESET_TOKENLEN; + } + + if (params->preferred_addr_present) { + assert(params->preferred_addr.cid.datalen >= NGTCP2_MIN_CIDLEN); + assert(params->preferred_addr.cid.datalen <= NGTCP2_MAX_CIDLEN); + preferred_addrlen = 4 /* ipv4Address */ + 2 /* ipv4Port */ + + 16 /* ipv6Address */ + 2 /* ipv6Port */ + + 1 + params->preferred_addr.cid.datalen /* CID */ + + NGTCP2_STATELESS_RESET_TOKENLEN; + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS) + + ngtcp2_put_uvarintlen(preferred_addrlen) + preferred_addrlen; + } + if (params->retry_scid_present) { + len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, + ¶ms->retry_scid); + } + + if (params->initial_scid_present) { + len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, + ¶ms->initial_scid); + } + + if (params->initial_max_stream_data_bidi_local) { + len += + varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, + params->initial_max_stream_data_bidi_local); + } + if (params->initial_max_stream_data_bidi_remote) { + len += varint_paramlen( + NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, + params->initial_max_stream_data_bidi_remote); + } + if (params->initial_max_stream_data_uni) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, + params->initial_max_stream_data_uni); + } + if (params->initial_max_data) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, + params->initial_max_data); + } + if (params->initial_max_streams_bidi) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, + params->initial_max_streams_bidi); + } + if (params->initial_max_streams_uni) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, + params->initial_max_streams_uni); + } + if (params->max_udp_payload_size != + NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); + } + if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, + params->ack_delay_exponent); + } + if (params->disable_active_migration) { + len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); + } + if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, + params->max_ack_delay / NGTCP2_MILLISECONDS); + } + if (params->max_idle_timeout) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, + params->max_idle_timeout / NGTCP2_MILLISECONDS); + } + if (params->active_connection_id_limit && + params->active_connection_id_limit != + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); + } + if (params->max_datagram_frame_size) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, + params->max_datagram_frame_size); + } + if (params->grease_quic_bit) { + len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); + } + if (params->version_info_present) { + version_infolen = + sizeof(uint32_t) + params->version_info.available_versionslen; + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION) + + ngtcp2_put_uvarintlen(version_infolen) + version_infolen; + } + + if (dest == NULL && destlen == 0) { + return (ngtcp2_ssize)len; + } + + if (destlen < len) { + return NGTCP2_ERR_NOBUF; + } + + p = dest; + + if (params->original_dcid_present) { + p = write_cid_param( + p, NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, + ¶ms->original_dcid); + } + + if (params->stateless_reset_token_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN); + p = ngtcp2_put_uvarint(p, sizeof(params->stateless_reset_token)); + p = ngtcp2_cpymem(p, params->stateless_reset_token, + sizeof(params->stateless_reset_token)); + } + + if (params->preferred_addr_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS); + p = ngtcp2_put_uvarint(p, preferred_addrlen); + + if (params->preferred_addr.ipv4_present) { + sa_in = ¶ms->preferred_addr.ipv4; + p = ngtcp2_cpymem(p, &sa_in->sin_addr, sizeof(sa_in->sin_addr)); + p = ngtcp2_put_uint16(p, sa_in->sin_port); + } else { + p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in->sin_addr)); + p = ngtcp2_put_uint16(p, 0); + } + + if (params->preferred_addr.ipv6_present) { + sa_in6 = ¶ms->preferred_addr.ipv6; + p = ngtcp2_cpymem(p, &sa_in6->sin6_addr, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_put_uint16(p, sa_in6->sin6_port); + } else { + p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_put_uint16(p, 0); + } + + *p++ = (uint8_t)params->preferred_addr.cid.datalen; + if (params->preferred_addr.cid.datalen) { + p = ngtcp2_cpymem(p, params->preferred_addr.cid.data, + params->preferred_addr.cid.datalen); + } + p = ngtcp2_cpymem(p, params->preferred_addr.stateless_reset_token, + sizeof(params->preferred_addr.stateless_reset_token)); + } + + if (params->retry_scid_present) { + p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, + ¶ms->retry_scid); + } + + if (params->initial_scid_present) { + p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, + ¶ms->initial_scid); + } + + if (params->initial_max_stream_data_bidi_local) { + p = write_varint_param( + p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, + params->initial_max_stream_data_bidi_local); + } + + if (params->initial_max_stream_data_bidi_remote) { + p = write_varint_param( + p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, + params->initial_max_stream_data_bidi_remote); + } + + if (params->initial_max_stream_data_uni) { + p = + write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, + params->initial_max_stream_data_uni); + } + + if (params->initial_max_data) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, + params->initial_max_data); + } + + if (params->initial_max_streams_bidi) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, + params->initial_max_streams_bidi); + } + + if (params->initial_max_streams_uni) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, + params->initial_max_streams_uni); + } + + if (params->max_udp_payload_size != + NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); + } + + if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, + params->ack_delay_exponent); + } + + if (params->disable_active_migration) { + p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); + } + + if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, + params->max_ack_delay / NGTCP2_MILLISECONDS); + } + + if (params->max_idle_timeout) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, + params->max_idle_timeout / NGTCP2_MILLISECONDS); + } + + if (params->active_connection_id_limit && + params->active_connection_id_limit != + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); + } + + if (params->max_datagram_frame_size) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, + params->max_datagram_frame_size); + } + + if (params->grease_quic_bit) { + p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); + } + + if (params->version_info_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION); + p = ngtcp2_put_uvarint(p, version_infolen); + p = ngtcp2_put_uint32be(p, params->version_info.chosen_version); + if (params->version_info.available_versionslen) { + p = ngtcp2_cpymem(p, params->version_info.available_versions, + params->version_info.available_versionslen); + } + } + + assert((size_t)(p - dest) == len); + + return (ngtcp2_ssize)len; +} + +/* + * decode_varint decodes a single varint from the buffer pointed by + * |*pp| of length |end - *pp|. If it decodes an integer + * successfully, it stores the integer in |*pdest|, increment |*pp| by + * the number of bytes read from |*pp|, and returns 0. Otherwise it + * returns -1. + */ +static int decode_varint(uint64_t *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + size_t len; + + if (p == end) { + return -1; + } + + len = ngtcp2_get_uvarintlen(p); + if ((size_t)(end - p) < len) { + return -1; + } + + *pp = ngtcp2_get_uvarint(pdest, p); + + return 0; +} + +/* + * decode_varint_param decodes length prefixed value from the buffer + * pointed by |*pp| of length |end - *pp|. The length and value are + * encoded in varint form. If it decodes a value successfully, it + * stores the value in |*pdest|, increment |*pp| by the number of + * bytes read from |*pp|, and returns 0. Otherwise it returns -1. + */ +static int decode_varint_param(uint64_t *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + uint64_t valuelen; + + if (decode_varint(&valuelen, &p, end) != 0) { + return -1; + } + + if (p == end) { + return -1; + } + + if ((uint64_t)(end - p) < valuelen) { + return -1; + } + + if (ngtcp2_get_uvarintlen(p) != valuelen) { + return -1; + } + + *pp = ngtcp2_get_uvarint(pdest, p); + + return 0; +} + +/* + * decode_zero_param decodes zero length value from the buffer pointed + * by |*pp| of length |end - *pp|. The length is encoded in varint + * form. If it decodes zero length value successfully, it increments + * |*pp| by 1, and returns 0. Otherwise it returns -1. + */ +static int decode_zero_param(const uint8_t **pp, const uint8_t *end) { + if (*pp == end || **pp != 0) { + return -1; + } + + ++*pp; + + return 0; +} + +/* + * decode_cid_param decodes length prefixed ngtcp2_cid from the buffer + * pointed by |*pp| of length |end - *pp|. The length is encoded in + * varint form. If it decodes a value successfully, it stores the + * value in |*pdest|, increment |*pp| by the number of read from + * |*pp|, and returns the number of bytes read. Otherwise it returns + * the one of the negative error code: + * + * NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM + * Could not decode Connection ID. + */ +static int decode_cid_param(ngtcp2_cid *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + uint64_t valuelen; + + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + if ((valuelen != 0 && valuelen < NGTCP2_MIN_CIDLEN) || + valuelen > NGTCP2_MAX_CIDLEN || (size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + ngtcp2_cid_init(pdest, p, (size_t)valuelen); + + p += valuelen; + + *pp = p; + + return 0; +} + +int ngtcp2_transport_params_decode_versioned(int transport_params_version, + ngtcp2_transport_params *dest, + const uint8_t *data, + size_t datalen) { + const uint8_t *p, *end, *lend; + size_t len; + uint64_t param_type; + uint64_t valuelen; + int rv; + ngtcp2_sockaddr_in *sa_in; + ngtcp2_sockaddr_in6 *sa_in6; + uint32_t version; + ngtcp2_transport_params *params, paramsbuf; + + if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { + params = dest; + } else { + params = ¶msbuf; + } + + /* Set default values */ + memset(params, 0, sizeof(*params)); + params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; + params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; + params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; + params->active_connection_id_limit = + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; + + p = end = data; + + if (datalen) { + end += datalen; + } + + for (; (size_t)(end - p) >= 2;) { + if (decode_varint(¶m_type, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + switch (param_type) { + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: + if (decode_varint_param(¶ms->initial_max_stream_data_bidi_local, &p, + end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: + if (decode_varint_param(¶ms->initial_max_stream_data_bidi_remote, &p, + end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI: + if (decode_varint_param(¶ms->initial_max_stream_data_uni, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA: + if (decode_varint_param(¶ms->initial_max_data, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI: + if (decode_varint_param(¶ms->initial_max_streams_bidi, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->initial_max_streams_bidi > NGTCP2_MAX_STREAMS) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI: + if (decode_varint_param(¶ms->initial_max_streams_uni, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->initial_max_streams_uni > NGTCP2_MAX_STREAMS) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT: + if (decode_varint_param(¶ms->max_idle_timeout, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->max_idle_timeout *= NGTCP2_MILLISECONDS; + break; + case NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE: + if (decode_varint_param(¶ms->max_udp_payload_size, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)valuelen != sizeof(params->stateless_reset_token)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < sizeof(params->stateless_reset_token)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + p = ngtcp2_get_bytes(params->stateless_reset_token, p, + sizeof(params->stateless_reset_token)); + params->stateless_reset_token_present = 1; + + break; + case NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT: + if (decode_varint_param(¶ms->ack_delay_exponent, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->ack_delay_exponent > 20) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + len = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + + 2 /* ipv6Port */ + + 1 /* cid length */ + NGTCP2_STATELESS_RESET_TOKENLEN; + if (valuelen < len) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + sa_in = ¶ms->preferred_addr.ipv4; + + p = ngtcp2_get_bytes(&sa_in->sin_addr, p, sizeof(sa_in->sin_addr)); + p = ngtcp2_get_uint16(&sa_in->sin_port, p); + + if (sa_in->sin_port || memcmp(empty_address, &sa_in->sin_addr, + sizeof(sa_in->sin_addr)) != 0) { + sa_in->sin_family = NGTCP2_AF_INET; + params->preferred_addr.ipv4_present = 1; + } + + sa_in6 = ¶ms->preferred_addr.ipv6; + + p = ngtcp2_get_bytes(&sa_in6->sin6_addr, p, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_get_uint16(&sa_in6->sin6_port, p); + + if (sa_in6->sin6_port || memcmp(empty_address, &sa_in6->sin6_addr, + sizeof(sa_in6->sin6_addr)) != 0) { + sa_in6->sin6_family = NGTCP2_AF_INET6; + params->preferred_addr.ipv6_present = 1; + } + + /* cid */ + params->preferred_addr.cid.datalen = *p++; + len += params->preferred_addr.cid.datalen; + if (valuelen != len || + params->preferred_addr.cid.datalen > NGTCP2_MAX_CIDLEN || + params->preferred_addr.cid.datalen < NGTCP2_MIN_CIDLEN) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->preferred_addr.cid.datalen) { + p = ngtcp2_get_bytes(params->preferred_addr.cid.data, p, + params->preferred_addr.cid.datalen); + } + + /* stateless reset token */ + p = + ngtcp2_get_bytes(params->preferred_addr.stateless_reset_token, p, + sizeof(params->preferred_addr.stateless_reset_token)); + params->preferred_addr_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION: + if (decode_zero_param(&p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->disable_active_migration = 1; + break; + case NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID: + rv = decode_cid_param(¶ms->original_dcid, &p, end); + if (rv != 0) { + return rv; + } + params->original_dcid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID: + rv = decode_cid_param(¶ms->retry_scid, &p, end); + if (rv != 0) { + return rv; + } + params->retry_scid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID: + rv = decode_cid_param(¶ms->initial_scid, &p, end); + if (rv != 0) { + return rv; + } + params->initial_scid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY: + if (decode_varint_param(¶ms->max_ack_delay, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->max_ack_delay >= 16384) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->max_ack_delay *= NGTCP2_MILLISECONDS; + break; + case NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT: + if (decode_varint_param(¶ms->active_connection_id_limit, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE: + if (decode_varint_param(¶ms->max_datagram_frame_size, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT: + if (decode_zero_param(&p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->grease_quic_bit = 1; + break; + case NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (valuelen < sizeof(uint32_t) || (valuelen & 0x3)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + p = ngtcp2_get_uint32be(¶ms->version_info.chosen_version, p); + if (params->version_info.chosen_version == 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (valuelen > sizeof(uint32_t)) { + params->version_info.available_versions = (uint8_t *)p; + params->version_info.available_versionslen = + (size_t)valuelen - sizeof(uint32_t); + + for (lend = p + (valuelen - sizeof(uint32_t)); p != lend;) { + p = ngtcp2_get_uint32be(&version, p); + if (version == 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + } + } + params->version_info_present = 1; + break; + default: + /* Ignore unknown parameter */ + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + p += valuelen; + break; + } + } + + if (end - p != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + if (transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION) { + ngtcp2_transport_params_convert_to_old(transport_params_version, dest, + params); + } + + return 0; +} + +static int transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem) { + size_t len = sizeof(**pdest); + ngtcp2_transport_params *dest; + uint8_t *p; + + if (src->version_info_present) { + len += src->version_info.available_versionslen; + } + + dest = ngtcp2_mem_malloc(mem, len); + if (dest == NULL) { + return NGTCP2_ERR_NOMEM; + } + + *dest = *src; + + if (src->version_info_present && src->version_info.available_versionslen) { + p = (uint8_t *)dest + sizeof(*dest); + memcpy(p, src->version_info.available_versions, + src->version_info.available_versionslen); + dest->version_info.available_versions = p; + } + + *pdest = dest; + + return 0; +} + +int ngtcp2_transport_params_decode_new(ngtcp2_transport_params **pparams, + const uint8_t *data, size_t datalen, + const ngtcp2_mem *mem) { + int rv; + ngtcp2_transport_params params; + + rv = ngtcp2_transport_params_decode(¶ms, data, datalen); + if (rv < 0) { + return rv; + } + + if (mem == NULL) { + mem = ngtcp2_mem_default(); + } + + return transport_params_copy_new(pparams, ¶ms, mem); +} + +void ngtcp2_transport_params_del(ngtcp2_transport_params *params, + const ngtcp2_mem *mem) { + if (params == NULL) { + return; + } + + if (mem == NULL) { + mem = ngtcp2_mem_default(); + } + + ngtcp2_mem_free(mem, params); +} + +int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem) { + if (src == NULL) { + *pdest = NULL; + return 0; + } + + return transport_params_copy_new(pdest, src, mem); +} + +static void transport_params_copy(ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src, + int transport_params_version) { + assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_V1: + memcpy(dest, src, + offsetof(ngtcp2_transport_params, version_info_present) + + sizeof(src->version_info_present)); + + break; + } +} + +const ngtcp2_transport_params * +ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, + int transport_params_version, + const ngtcp2_transport_params *src) { + if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { + return src; + } + + ngtcp2_transport_params_default(dest); + + transport_params_copy(dest, src, transport_params_version); + + return dest; +} + +void ngtcp2_transport_params_convert_to_old( + int transport_params_version, ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src) { + assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); + + transport_params_copy(dest, src, transport_params_version); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h new file mode 100644 index 00000000000000..c077f06a9dd717 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h @@ -0,0 +1,118 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * 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. + */ +#ifndef NGTCP2_TRANSPORT_PARAMS_H +#define NGTCP2_TRANSPORT_PARAMS_H + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif /* defined(HAVE_CONFIG_H) */ + +#include <ngtcp2/ngtcp2.h> + +/* ngtcp2_transport_param_id is the registry of QUIC transport + parameter ID. */ +typedef uint64_t ngtcp2_transport_param_id; + +#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00 +#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01 +#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02 +#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09 +#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0a +#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0b +#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0c +#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0d +#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0e +#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0f +#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10 +/* https://datatracker.ietf.org/doc/html/rfc9221 */ +#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20 +#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2ab2 +/* https://datatracker.ietf.org/doc/html/rfc9368 */ +#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11 + +/* NGTCP2_MAX_STREAMS is the maximum number of streams. */ +#define NGTCP2_MAX_STREAMS (1LL << 60) + +/* + * ngtcp2_transport_params_copy_new makes a copy of |src|, and assigns + * it to |*pdest|. If |src| is NULL, NULL is assigned to |*pdest|. + * + * Caller is responsible to call ngtcp2_transport_params_del to free + * the memory assigned to |*pdest|. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGTCP2_ERR_NOMEM + * Out of memory. + */ +int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem); + +/* + * ngtcp2_transport_params_convert_to_latest converts |src| of version + * |transport_params_version| to the latest version + * NGTCP2_TRANSPORT_PARAMS_VERSION. + * + * |dest| must point to the latest version. |src| may be the older + * version, and if so, it may have fewer fields. Accessing those + * fields causes undefined behavior. + * + * If |transport_params_version| == NGTCP2_TRANSPORT_PARAMS_VERSION, + * no conversion is made, and |src| is returned. Otherwise, first + * |dest| is initialized via ngtcp2_transport_params_default, and then + * all valid fields in |src| are copied into |dest|. Finally, |dest| + * is returned. + */ +const ngtcp2_transport_params * +ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, + int transport_params_version, + const ngtcp2_transport_params *src); + +/* + * ngtcp2_transport_params_convert_to_old converts |src| of the latest + * version to |dest| of version |transport_params_version|. + * + * |transport_params_version| must not be the latest version + * NGTCP2_TRANSPORT_PARAMS_VERSION. + * + * |dest| points to the older version, and it may have fewer fields. + * Accessing those fields causes undefined behavior. + * + * This function copies all valid fields in version + * |transport_params_version| from |src| to |dest|. + */ +void ngtcp2_transport_params_convert_to_old(int transport_params_version, + ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src); + +#endif /* !defined(NGTCP2_TRANSPORT_PARAMS_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h index 9a210a320dc1ca..2b1bb51d87edc6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -65,4 +65,4 @@ static inline int ngtcp2_tstamp_not_elapsed(ngtcp2_tstamp base, return base != UINT64_MAX && (base >= UINT64_MAX - d || base + d > ts); } -#endif /* NGTCP2_TSTAMP_H */ +#endif /* !defined(NGTCP2_TSTAMP_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c index 7c7d9ae78e914d..5ab1db72cc5384 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c @@ -26,20 +26,22 @@ #include <stdio.h> #include <errno.h> +#include <stdlib.h> #ifdef HAVE_UNISTD_H +# define NGTCP2_UNREACHABLE_LOG # include <unistd.h> -#endif /* HAVE_UNISTD_H */ -#include <stdlib.h> -#ifdef WIN32 +#elif defined(WIN32) +# define NGTCP2_UNREACHABLE_LOG # include <io.h> -#endif /* WIN32 */ +#endif /* defined(WIN32) */ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) { +#ifdef NGTCP2_UNREACHABLE_LOG char *buf; size_t buflen; int rv; -#define NGTCP2_UNREACHABLE_TEMPLATE "%s:%d %s: Unreachable.\n" +# define NGTCP2_UNREACHABLE_TEMPLATE "%s:%d %s: Unreachable.\n" rv = snprintf(NULL, 0, NGTCP2_UNREACHABLE_TEMPLATE, file, line, func); if (rv < 0) { @@ -58,14 +60,15 @@ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) { abort(); } -#ifndef WIN32 +# ifndef WIN32 while (write(STDERR_FILENO, buf, (size_t)rv) == -1 && errno == EINTR) ; -#else /* WIN32 */ +# else /* defined(WIN32) */ _write(_fileno(stderr), buf, (unsigned int)rv); -#endif /* WIN32 */ +# endif /* defined(WIN32) */ free(buf); +#endif /* defined(NGTCP2_UNREACHABLE_LOG) */ abort(); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h index a5276fd505463f..ca7123865279f9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h @@ -27,26 +27,26 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> #ifdef __FILE_NAME__ # define NGTCP2_FILE_NAME __FILE_NAME__ -#else /* !__FILE_NAME__ */ +#else /* !defined(__FILE_NAME__) */ # define NGTCP2_FILE_NAME "(file)" -#endif /* !__FILE_NAME__ */ +#endif /* !defined(__FILE_NAME__) */ #define ngtcp2_unreachable() \ ngtcp2_unreachable_fail(NGTCP2_FILE_NAME, __LINE__, __func__) #ifdef _MSC_VER __declspec(noreturn) -#endif /* _MSC_VER */ +#endif /* defined(_MSC_VER) */ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) #ifndef _MSC_VER __attribute__((noreturn)) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ ; -#endif /* NGTCP2_UNREACHABLE_H */ +#endif /* !defined(NGTCP2_UNREACHABLE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c index dbc7b668042695..dbca8691d64888 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c @@ -35,32 +35,6 @@ ngtcp2_vec *ngtcp2_vec_init(ngtcp2_vec *vec, const uint8_t *base, size_t len) { return vec; } -int ngtcp2_vec_new(ngtcp2_vec **pvec, const uint8_t *data, size_t datalen, - const ngtcp2_mem *mem) { - size_t len; - uint8_t *p; - - len = sizeof(ngtcp2_vec) + datalen; - - *pvec = ngtcp2_mem_malloc(mem, len); - if (*pvec == NULL) { - return NGTCP2_ERR_NOMEM; - } - - p = (uint8_t *)(*pvec) + sizeof(ngtcp2_vec); - (*pvec)->base = p; - (*pvec)->len = datalen; - if (datalen) { - /* p = */ ngtcp2_cpymem(p, data, datalen); - } - - return 0; -} - -void ngtcp2_vec_del(ngtcp2_vec *vec, const ngtcp2_mem *mem) { - ngtcp2_mem_free(mem, vec); -} - uint64_t ngtcp2_vec_len(const ngtcp2_vec *vec, size_t n) { size_t i; size_t res = 0; @@ -89,8 +63,8 @@ int64_t ngtcp2_vec_len_varint(const ngtcp2_vec *vec, size_t n) { return (int64_t)res; } -ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *src, size_t *psrccnt, ngtcp2_vec *dst, - size_t *pdstcnt, size_t left, size_t maxcnt) { +ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, + size_t *psrccnt, size_t left, size_t maxcnt) { size_t i; size_t srccnt = *psrccnt; size_t nmove; @@ -203,6 +177,7 @@ size_t ngtcp2_vec_merge(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, } else { dst[(*pdstcnt)++] = *b; } + left -= b->len; } @@ -222,11 +197,15 @@ size_t ngtcp2_vec_copy_at_most(ngtcp2_vec *dst, size_t dstcnt, ++i; continue; } - dst[j] = src[i]; - if (dst[j].len > left) { + + if (src[i].len > left) { + dst[j].base = src[i].base; dst[j].len = left; + return j + 1; } + + dst[j] = src[i]; left -= dst[j].len; ++i; ++j; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h index a39c4392fd2627..55e735d164edcb 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -46,22 +46,6 @@ */ ngtcp2_vec *ngtcp2_vec_init(ngtcp2_vec *vec, const uint8_t *base, size_t len); -/* - * ngtcp2_vec_new allocates and initializes |*pvec| with given |data| - * of length |datalen|. This function allocates memory for |*pvec| - * and the given data with a single allocation, and the contents - * pointed by |data| is copied into the allocated memory space. To - * free the allocated memory, call ngtcp2_vec_del. - */ -int ngtcp2_vec_new(ngtcp2_vec **pvec, const uint8_t *data, size_t datalen, - const ngtcp2_mem *mem); - -/* - * ngtcp2_vec_del frees the memory allocated by |vec| which is - * allocated and initialized by ngtcp2_vec_new. - */ -void ngtcp2_vec_del(ngtcp2_vec *vec, const ngtcp2_mem *mem); - /* * ngtcp2_vec_len returns the sum of length in |vec| of |n| elements. */ @@ -74,19 +58,21 @@ uint64_t ngtcp2_vec_len(const ngtcp2_vec *vec, size_t n); int64_t ngtcp2_vec_len_varint(const ngtcp2_vec *vec, size_t n); /* - * ngtcp2_vec_split splits |src| to |dst| so that the sum of the - * length in |src| does not exceed |left| bytes. The |maxcnt| is the - * maximum number of elements which |dst| array can contain. The - * caller must set |*psrccnt| to the number of elements of |src|. - * Similarly, the caller must set |*pdstcnt| to the number of elements - * of |dst|. The split does not necessarily occur at the boundary of - * ngtcp2_vec object. After split has done, this function updates - * |*psrccnt| and |*pdstcnt|. This function returns the number of - * bytes moved from |src| to |dst|. If split cannot be made because - * doing so exceeds |maxcnt|, this function returns -1. + * ngtcp2_vec_split splits |src| at the data position where + * ngtcp2_vec_len(|src|) does not exceed |left| bytes. The removed + * vectors are moved to |dst|. The existing elements in |dst| are + * moved forward to make up a space. The |maxcnt| is the maximum + * number of elements which |dst| array can contain. The caller must + * set |*psrccnt| to the number of elements of |src|. Similarly, the + * caller must set |*pdstcnt| to the number of elements of |dst|. The + * split does not necessarily occur at the boundary of ngtcp2_vec + * object. After split has done, this function updates |*psrccnt| and + * |*pdstcnt|. This function returns the number of bytes moved from + * |src| to |dst|. If split cannot be made because doing so exceeds + * |maxcnt|, this function returns -1. */ -ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *src, size_t *psrccnt, ngtcp2_vec *dst, - size_t *pdstcnt, size_t left, size_t maxcnt); +ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, + size_t *psrccnt, size_t left, size_t maxcnt); /* * ngtcp2_vec_merge merges |src| into |dst| by moving at most |left| @@ -117,4 +103,4 @@ size_t ngtcp2_vec_copy_at_most(ngtcp2_vec *dst, size_t dstcnt, */ void ngtcp2_vec_copy(ngtcp2_vec *dst, const ngtcp2_vec *src, size_t cnt); -#endif /* NGTCP2_VEC_H */ +#endif /* !defined(NGTCP2_VEC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c index b31162c3ebe0d7..d2557e9ef8a580 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h index 50415f10b8c37b..c90a9fdb9078da 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h @@ -37,7 +37,7 @@ #ifdef HAVE_CONFIG_H # include <config.h> -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include <ngtcp2/ngtcp2.h> @@ -62,4 +62,4 @@ void ngtcp2_window_filter_reset(ngtcp2_window_filter *wf, uint64_t new_sample, uint64_t ngtcp2_window_filter_get_best(ngtcp2_window_filter *wf); -#endif /* NGTCP2_WINDOW_FILTER_H */ +#endif /* !defined(NGTCP2_WINDOW_FILTER_H) */ diff --git a/deps/ngtcp2/unofficial.gni b/deps/ngtcp2/unofficial.gni index 26b8070c5a9c7f..cf9ba5363907e0 100644 --- a/deps/ngtcp2/unofficial.gni +++ b/deps/ngtcp2/unofficial.gni @@ -68,8 +68,7 @@ template("ngtcp2_gn_build") { cflags_c = [ "-Wno-extra-semi", "-Wno-implicit-fallthrough", - # Remove after https://github.com/ngtcp2/ngtcp2/issues/1050 is fixed. - "-Wno-sometimes-uninitialized", + "-Wno-unused-function", ] } } diff --git a/deps/npm/README.md b/deps/npm/README.md index cffee2429dddca..3dc35a3842554a 100644 --- a/deps/npm/README.md +++ b/deps/npm/README.md @@ -40,7 +40,7 @@ npm <command> * Note: you can also search docs locally with `npm help-search <query>` * [**Bug Tracker**](https://github.com/npm/cli/issues) - Search or submit bugs against the CLI * [**Roadmap**](https://github.com/orgs/github/projects/4247/views/1?filterQuery=npm) - Track & follow along with our public roadmap -* [**Feedback**](https://github.com/npm/feedback) - Contribute ideas & discussion around the npm registry, website & CLI +* [**Community Feedback and Discussions**](https://github.com/orgs/community/discussions/categories/npm) - Contribute ideas & discussion around the npm registry, website & CLI * [**RFCs**](https://github.com/npm/rfcs) - Contribute ideas & specifications for the API/design of the npm CLI * [**Service Status**](https://status.npmjs.org/) - Monitor the current status & see incident reports for the website & registry * [**Project Status**](https://npm.github.io/statusboard/) - See the health of all our maintained OSS projects in one view diff --git a/deps/npm/bin/npm-prefix.js b/deps/npm/bin/npm-prefix.js index 3ff43de0dd84de..b0b0ace6a92ab9 100755 --- a/deps/npm/bin/npm-prefix.js +++ b/deps/npm/bin/npm-prefix.js @@ -3,7 +3,7 @@ // without having to load all of npm first // It does not accept argv params -const path = require('path') +const path = require('node:path') const Config = require('@npmcli/config') const { definitions, flatten, shorthands } = require('@npmcli/config/lib/definitions') const config = new Config({ diff --git a/deps/npm/bin/npm.ps1 b/deps/npm/bin/npm.ps1 index 399e33360e853c..efed03fe5655ec 100644 --- a/deps/npm/bin/npm.ps1 +++ b/deps/npm/bin/npm.ps1 @@ -1,35 +1,50 @@ #!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 +Set-StrictMode -Version 'Latest' -$nodeexe = "node$exe" -$nodebin = $(Get-Command $nodeexe -ErrorAction SilentlyContinue -ErrorVariable F).Source -if ($nodebin -eq $null) { - Write-Host "$nodeexe not found." - exit 1 +$NODE_EXE="$PSScriptRoot/node.exe" +if (-not (Test-Path $NODE_EXE)) { + $NODE_EXE="$PSScriptRoot/node" +} +if (-not (Test-Path $NODE_EXE)) { + $NODE_EXE="node" } -$nodedir = $(New-Object -ComObject Scripting.FileSystemObject).GetFile("$nodebin").ParentFolder.Path -$npmprefixjs="$nodedir/node_modules/npm/bin/npm-prefix.js" -$npmprefix=(& $nodeexe $npmprefixjs) +$NPM_PREFIX_JS="$PSScriptRoot/node_modules/npm/bin/npm-prefix.js" +$NPM_CLI_JS="$PSScriptRoot/node_modules/npm/bin/npm-cli.js" +$NPM_PREFIX=(& $NODE_EXE $NPM_PREFIX_JS) + if ($LASTEXITCODE -ne 0) { Write-Host "Could not determine Node.js install directory" exit 1 } -$npmprefixclijs="$npmprefix/node_modules/npm/bin/npm-cli.js" -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & $nodeexe $npmprefixclijs $args -} else { - & $nodeexe $npmprefixclijs $args +$NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js" +if (Test-Path $NPM_PREFIX_NPM_CLI_JS) { + $NPM_CLI_JS=$NPM_PREFIX_NPM_CLI_JS +} + +if ($MyInvocation.ExpectingInput) { # takes pipeline input + $input | & $NODE_EXE $NPM_CLI_JS $args +} elseif (-not $MyInvocation.Line) { # used "-File" argument + & $NODE_EXE $NPM_CLI_JS $args +} else { # used "-Command" argument + if (($MyInvocation | Get-Member -Name 'Statement') -and $MyInvocation.Statement) { + $NPM_ORIGINAL_COMMAND = $MyInvocation.Statement + } else { + $NPM_ORIGINAL_COMMAND = ( + [Management.Automation.InvocationInfo].GetProperty('ScriptPosition', [Reflection.BindingFlags] 'Instance, NonPublic') + ).GetValue($MyInvocation).Text + } + + $NODE_EXE = $NODE_EXE.Replace("``", "````") + $NPM_CLI_JS = $NPM_CLI_JS.Replace("``", "````") + + $NPM_COMMAND_ARRAY = [Management.Automation.Language.Parser]::ParseInput($NPM_ORIGINAL_COMMAND, [ref] $null, [ref] $null). + EndBlock.Statements.PipelineElements.CommandElements.Extent.Text + $NPM_ARGS = ($NPM_COMMAND_ARRAY | Select-Object -Skip 1) -join ' ' + + Invoke-Expression "& `"$NODE_EXE`" `"$NPM_CLI_JS`" $NPM_ARGS" } -$ret=$LASTEXITCODE -exit $ret + +exit $LASTEXITCODE diff --git a/deps/npm/bin/npx-cli.js b/deps/npm/bin/npx-cli.js index 17d96fb26267c7..e2e1b87906abe0 100755 --- a/deps/npm/bin/npx-cli.js +++ b/deps/npm/bin/npx-cli.js @@ -26,7 +26,7 @@ const removed = new Set([ const { definitions, shorthands } = require('@npmcli/config/lib/definitions') const npmSwitches = Object.entries(definitions) - .filter(([key, { type }]) => type === Boolean || + .filter(([, { type }]) => type === Boolean || (Array.isArray(type) && type.includes(Boolean))) .map(([key]) => key) diff --git a/deps/npm/bin/npx.ps1 b/deps/npm/bin/npx.ps1 index 1d59fc52083d70..3fe7b5435763a0 100644 --- a/deps/npm/bin/npx.ps1 +++ b/deps/npm/bin/npx.ps1 @@ -1,35 +1,50 @@ #!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 +Set-StrictMode -Version 'Latest' -$nodeexe = "node$exe" -$nodebin = $(Get-Command $nodeexe -ErrorAction SilentlyContinue -ErrorVariable F).Source -if ($nodebin -eq $null) { - Write-Host "$nodeexe not found." - exit 1 +$NODE_EXE="$PSScriptRoot/node.exe" +if (-not (Test-Path $NODE_EXE)) { + $NODE_EXE="$PSScriptRoot/node" +} +if (-not (Test-Path $NODE_EXE)) { + $NODE_EXE="node" } -$nodedir = $(New-Object -ComObject Scripting.FileSystemObject).GetFile("$nodebin").ParentFolder.Path -$npmprefixjs="$nodedir/node_modules/npm/bin/npm-prefix.js" -$npmprefix=(& $nodeexe $npmprefixjs) +$NPM_PREFIX_JS="$PSScriptRoot/node_modules/npm/bin/npm-prefix.js" +$NPX_CLI_JS="$PSScriptRoot/node_modules/npm/bin/npx-cli.js" +$NPM_PREFIX=(& $NODE_EXE $NPM_PREFIX_JS) + if ($LASTEXITCODE -ne 0) { Write-Host "Could not determine Node.js install directory" exit 1 } -$npmprefixclijs="$npmprefix/node_modules/npm/bin/npx-cli.js" -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & $nodeexe $npmprefixclijs $args -} else { - & $nodeexe $npmprefixclijs $args +$NPM_PREFIX_NPX_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npx-cli.js" +if (Test-Path $NPM_PREFIX_NPX_CLI_JS) { + $NPX_CLI_JS=$NPM_PREFIX_NPX_CLI_JS +} + +if ($MyInvocation.ExpectingInput) { # takes pipeline input + $input | & $NODE_EXE $NPX_CLI_JS $args +} elseif (-not $MyInvocation.Line) { # used "-File" argument + & $NODE_EXE $NPX_CLI_JS $args +} else { # used "-Command" argument + if (($MyInvocation | Get-Member -Name 'Statement') -and $MyInvocation.Statement) { + $NPX_ORIGINAL_COMMAND = $MyInvocation.Statement + } else { + $NPX_ORIGINAL_COMMAND = ( + [Management.Automation.InvocationInfo].GetProperty('ScriptPosition', [Reflection.BindingFlags] 'Instance, NonPublic') + ).GetValue($MyInvocation).Text + } + + $NODE_EXE = $NODE_EXE.Replace("``", "````") + $NPX_CLI_JS = $NPX_CLI_JS.Replace("``", "````") + + $NPX_COMMAND_ARRAY = [Management.Automation.Language.Parser]::ParseInput($NPX_ORIGINAL_COMMAND, [ref] $null, [ref] $null). + EndBlock.Statements.PipelineElements.CommandElements.Extent.Text + $NPX_ARGS = ($NPX_COMMAND_ARRAY | Select-Object -Skip 1) -join ' ' + + Invoke-Expression "& `"$NODE_EXE`" `"$NPX_CLI_JS`" $NPX_ARGS" } -$ret=$LASTEXITCODE -exit $ret + +exit $LASTEXITCODE diff --git a/deps/npm/docs/content/commands/npm-access.md b/deps/npm/docs/content/commands/npm-access.md index 9e9f385fe386de..e08030deba076d 100644 --- a/deps/npm/docs/content/commands/npm-access.md +++ b/deps/npm/docs/content/commands/npm-access.md @@ -7,7 +7,7 @@ description: Set access level on published packages ### Synopsis ```bash -npm access list packages [<user>|<scope>|<scope:team> [<package>] +npm access list packages [<user>|<scope>|<scope:team>] [<package>] npm access list collaborators [<package> [<user>]] npm access get status [<package>] npm access set status=public|private [<package>] diff --git a/deps/npm/docs/content/commands/npm-audit.md b/deps/npm/docs/content/commands/npm-audit.md index 7ab0c182d2db96..a7e0db7474315a 100644 --- a/deps/npm/docs/content/commands/npm-audit.md +++ b/deps/npm/docs/content/commands/npm-audit.md @@ -90,7 +90,7 @@ The `sig` is generated using the following template: `${package.name}@${package. Keys response: -- `expires`: null or a simplified extended [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601"): `YYYY-MM-DDTHH:mm:ss.sssZ` +- `expires`: null or a simplified extended [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601): `YYYY-MM-DDTHH:mm:ss.sssZ` - `keydid`: sha256 fingerprint of the public key - `keytype`: only `ecdsa-sha2-nistp256` is currently supported by the npm CLI - `scheme`: only `ecdsa-sha2-nistp256` is currently supported by the npm CLI diff --git a/deps/npm/docs/content/commands/npm-diff.md b/deps/npm/docs/content/commands/npm-diff.md index e93aef383c3f27..5248410972785d 100644 --- a/deps/npm/docs/content/commands/npm-diff.md +++ b/deps/npm/docs/content/commands/npm-diff.md @@ -248,12 +248,15 @@ folder instead of the current working directory. See If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. -Also the tag that is added to the package@version specified by the `npm tag` -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. +If used in the `npm publish` command, this is the tag that will be added to +the package submitted to the registry. + #### `workspace` diff --git a/deps/npm/docs/content/commands/npm-doctor.md b/deps/npm/docs/content/commands/npm-doctor.md index b36ec3883be03a..a96036a773b2a1 100644 --- a/deps/npm/docs/content/commands/npm-doctor.md +++ b/deps/npm/docs/content/commands/npm-doctor.md @@ -7,7 +7,7 @@ description: Check the health of your npm environment ### Synopsis ```bash -npm doctor [ping] [registry] [versions] [environment] [permissions] [cache] +npm doctor [connection] [registry] [versions] [environment] [permissions] [cache] ``` Note: This command is unaware of workspaces. @@ -38,20 +38,21 @@ there are any recommended changes, it will display them. By default npm runs all of these checks. You can limit what checks are ran by specifying them as extra arguments. -#### `npm ping` +#### `Connecting to the registry` By default, npm installs from the primary npm registry, -`registry.npmjs.org`. `npm doctor` hits a special ping endpoint within the -registry. This can also be checked with `npm ping`. If this check fails, -you may be using a proxy that needs to be configured, or may need to talk -to your IT staff to get access over HTTPS to `registry.npmjs.org`. +`registry.npmjs.org`. `npm doctor` hits a special connection testing +endpoint within the registry. This can also be checked with `npm ping`. +If this check fails, you may be using a proxy that needs to be +configured, or may need to talk to your IT staff to get access over +HTTPS to `registry.npmjs.org`. This check is done against whichever registry you've configured (you can see what that is by running `npm config get registry`), and if you're using a private registry that doesn't support the `/whoami` endpoint supported by the primary registry, this check may fail. -#### `npm -v` +#### `Checking npm version` While Node.js may come bundled with a particular version of npm, it's the policy of the CLI team that we recommend all users run `npm@latest` if they @@ -61,7 +62,7 @@ support releases typically only receive critical security and regression fixes. The team believes that the latest tested version of npm is almost always likely to be the most functional and defect-free version of npm. -#### `node -v` +#### `Checking node version` For most users, in most circumstances, the best version of Node will be the latest long-term support (LTS) release. Those of you who want access to new @@ -70,7 +71,7 @@ be running a newer version, and some may be required to run an older version of Node because of enterprise change control policies. That's OK! But in general, the npm team recommends that most users run Node.js LTS. -#### `npm config get registry` +#### `Checking configured npm registry` You may be installing from private package registries for your project or company. That's great! Others may be following tutorials or StackOverflow @@ -79,7 +80,7 @@ Sometimes, this may entail changing the registry you're pointing at. This part of `npm doctor` just lets you, and maybe whoever's helping you with support, know that you're not using the default registry. -#### `which git` +#### `Checking for git executable in PATH` While it's documented in the README, it may not be obvious that npm needs Git installed to do many of the things that it does. Also, in some cases diff --git a/deps/npm/docs/content/commands/npm-init.md b/deps/npm/docs/content/commands/npm-init.md index c4b39e6397019c..870f846761e4e3 100644 --- a/deps/npm/docs/content/commands/npm-init.md +++ b/deps/npm/docs/content/commands/npm-init.md @@ -7,7 +7,7 @@ description: Create a package.json file ### Synopsis ```bash -npm init <package-spec> (same as `npx <package-spec>`) +npm init <package-spec> (same as `npx create-<package-spec>`) npm init <@scope> (same as `npx <@scope>/create`) aliases: create, innit diff --git a/deps/npm/docs/content/commands/npm-install.md b/deps/npm/docs/content/commands/npm-install.md index 56a4c86fbdb3d3..ec933394b1a726 100644 --- a/deps/npm/docs/content/commands/npm-install.md +++ b/deps/npm/docs/content/commands/npm-install.md @@ -138,6 +138,8 @@ into a tarball (b). * `-D, --save-dev`: Package will appear in your `devDependencies`. + * `--save-peer`: Package will appear in your `peerDependencies`. + * `-O, --save-optional`: Package will appear in your `optionalDependencies`. @@ -176,10 +178,6 @@ into a tarball (b). npm install ansi-regex --save-bundle ``` - **Note**: If there is a file or folder named `<name>` in the current - working directory, then it will try to install that, and only try to - fetch the package by name if it is not valid. - * `npm install <alias>@npm:<name>`: Install a package under a custom alias. Allows multiple versions of diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index 0c6bfe1bf8ac26..5225e7f708ae8e 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -27,7 +27,7 @@ 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@10.5.1 /path/to/npm +npm@10.9.4 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` diff --git a/deps/npm/docs/content/commands/npm-profile.md b/deps/npm/docs/content/commands/npm-profile.md index d048532c98d452..2468d6c87faf60 100644 --- a/deps/npm/docs/content/commands/npm-profile.md +++ b/deps/npm/docs/content/commands/npm-profile.md @@ -24,28 +24,17 @@ support this interface. * `npm profile get [<property>]`: Display all of the properties of your profile, or one or more specific properties. It looks like: -```bash -+-----------------+---------------------------+ -| name | example | -+-----------------+---------------------------+ -| email | me@example.com (verified) | -+-----------------+---------------------------+ -| two factor auth | auth-and-writes | -+-----------------+---------------------------+ -| fullname | Example User | -+-----------------+---------------------------+ -| homepage | | -+-----------------+---------------------------+ -| freenode | | -+-----------------+---------------------------+ -| twitter | | -+-----------------+---------------------------+ -| github | | -+-----------------+---------------------------+ -| created | 2015-02-26T01:38:35.892Z | -+-----------------+---------------------------+ -| updated | 2017-10-02T21:29:45.922Z | -+-----------------+---------------------------+ +``` +name: example +email: e@example.com (verified) +two-factor auth: auth-and-writes +fullname: Example User +homepage: +freenode: +twitter: +github: +created: 2015-02-26T01:38:35.892Z +updated: 2017-10-02T21:29:45.922Z ``` * `npm profile set <property> <value>`: Set the value of a profile diff --git a/deps/npm/docs/content/commands/npm-publish.md b/deps/npm/docs/content/commands/npm-publish.md index a9c368e218543f..6bff5ff1c30201 100644 --- a/deps/npm/docs/content/commands/npm-publish.md +++ b/deps/npm/docs/content/commands/npm-publish.md @@ -95,12 +95,15 @@ built. If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. -Also the tag that is added to the package@version specified by the `npm tag` -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. +If used in the `npm publish` command, this is the tag that will be added to +the package submitted to the registry. + #### `access` diff --git a/deps/npm/docs/content/commands/npm-search.md b/deps/npm/docs/content/commands/npm-search.md index 047102af61766e..4e4bbf58aec39e 100644 --- a/deps/npm/docs/content/commands/npm-search.md +++ b/deps/npm/docs/content/commands/npm-search.md @@ -7,7 +7,7 @@ description: Search for packages ### Synopsis ```bash -npm search [search terms ...] +npm search <search term> [<search term> ...] aliases: find, s, se ``` @@ -39,15 +39,6 @@ expression characters in most shells.) ### Configuration -#### `long` - -* Default: false -* Type: Boolean - -Show extended information in `ls`, `search`, and `help-search`. - - - #### `json` * Default: false diff --git a/deps/npm/docs/content/commands/npm-token.md b/deps/npm/docs/content/commands/npm-token.md index a17193d5fe8d05..771da7d9857534 100644 --- a/deps/npm/docs/content/commands/npm-token.md +++ b/deps/npm/docs/content/commands/npm-token.md @@ -22,24 +22,14 @@ This lets you list, create and revoke authentication tokens. Shows a table of all active authentication tokens. You can request this as JSON with `--json` or tab-separated values with `--parseable`. -```bash -+--------+---------+------------+----------+----------------+ -| id | token | created | read-only | CIDR whitelist | -+--------+---------+------------+----------+----------------+ -| 7f3134 | 1fa9ba… | 2017-10-02 | yes | | -+--------+---------+------------+----------+----------------+ -| c03241 | af7aef… | 2017-10-02 | no | 192.168.0.1/24 | -+--------+---------+------------+----------+----------------+ -| e0cf92 | 3a436a… | 2017-10-02 | no | | -+--------+---------+------------+----------+----------------+ -| 63eb9d | 74ef35… | 2017-09-28 | no | | -+--------+---------+------------+----------+----------------+ -| 2daaa8 | cbad5f… | 2017-09-26 | no | | -+--------+---------+------------+----------+----------------+ -| 68c2fe | 127e51… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ -| 6334e1 | 1dadd1… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ +``` +Read only token npm_1f… with id 7f3134 created 2017-10-21 + +Publish token npm_af… with id c03241 created 2017-10-02 +with IP Whitelist: 192.168.0.1/24 + +Publish token npm_… with id e0cf92 created 2017-10-02 + ``` * `npm token create [--read-only] [--cidr=<cidr-ranges>]`: @@ -55,16 +45,8 @@ This lets you list, create and revoke authentication tokens. website](https://docs.npmjs.com/creating-and-viewing-access-tokens) for more information on generating automation tokens. -```bash -+----------------+--------------------------------------+ -| token | a73c9572-f1b9-8983-983d-ba3ac3cc913d | -+----------------+--------------------------------------+ -| cidr_whitelist | | -+----------------+--------------------------------------+ -| readonly | false | -+----------------+--------------------------------------+ -| created | 2017-10-02T07:52:24.838Z | -+----------------+--------------------------------------+ +``` +Created publish token a73c9572-f1b9-8983-983d-ba3ac3cc913d ``` * `npm token revoke <token|id>`: diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index d69d753e245b27..948a3590a547a4 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 -10.5.1 +10.9.4 ### Description @@ -158,7 +158,7 @@ Please be sure to follow the template and bug reporting guidelines. Discuss new feature ideas on our discussion forum: -* <https://github.com/npm/feedback> +* <https://github.com/orgs/community/discussions/categories/npm> Or suggest formal RFC proposals: diff --git a/deps/npm/docs/content/configuring-npm/npmrc.md b/deps/npm/docs/content/configuring-npm/npmrc.md index 0aa99fc271013b..fb335b2d43da70 100644 --- a/deps/npm/docs/content/configuring-npm/npmrc.md +++ b/deps/npm/docs/content/configuring-npm/npmrc.md @@ -29,7 +29,7 @@ Environment variables can be replaced using `${VARIABLE_NAME}`. For example: ```bash -prefix = ${HOME}/.npm-packages +cache = ${HOME}/.npm-packages ``` Each of these files is loaded, and config options are resolved in priority @@ -120,10 +120,13 @@ _authToken=MYTOKEN @myorg:registry=https://somewhere-else.com/myorg @another:registry=https://somewhere-else.com/another //registry.npmjs.org/:_authToken=MYTOKEN + ; would apply to both @myorg and @another -; //somewhere-else.com/:_authToken=MYTOKEN +//somewhere-else.com/:_authToken=MYTOKEN + ; would apply only to @myorg //somewhere-else.com/myorg/:_authToken=MYTOKEN1 + ; would apply only to @another //somewhere-else.com/another/:_authToken=MYTOKEN2 ``` diff --git a/deps/npm/docs/content/configuring-npm/package-json.md b/deps/npm/docs/content/configuring-npm/package-json.md index ec5cfcab1bb49e..4663aa2b78244e 100644 --- a/deps/npm/docs/content/configuring-npm/package-json.md +++ b/deps/npm/docs/content/configuring-npm/package-json.md @@ -225,23 +225,35 @@ npm also sets a top-level "maintainers" field with your npm user info. ### funding You can specify an object containing a URL that provides up-to-date -information about ways to help fund development of your package, or a -string URL, or an array of these: +information about ways to help fund development of your package, a +string URL, or an array of objects and string URLs: ```json { "funding": { "type" : "individual", "url" : "http://example.com/donate" - }, + } +} +``` +```json +{ "funding": { "type" : "patreon", "url" : "https://www.patreon.com/my-account" - }, + } +} +``` - "funding": "http://example.com/donate", +```json +{ + "funding": "http://example.com/donate" +} +``` +```json +{ "funding": [ { "type" : "individual", @@ -258,7 +270,7 @@ string URL, or an array of these: Users can use the `npm fund` subcommand to list the `funding` URLs of all dependencies of their project, direct and indirect. A shortcut to visit -each funding url is also available when providing the project name such as: +each funding URL is also available when providing the project name such as: `npm fund <projectname>` (when there are multiple URLs, the first one will be visited) @@ -325,6 +337,10 @@ the `files` globs. Exceptions to this are: These can not be included. +### exports + +The "exports" provides a modern alternative to "main" allowing multiple entry points to be defined, conditional entry resolution support between environments, and preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to clearly define the public interface for their package. For more details see the [node.js documentation on package entry points](https://nodejs.org/api/packages.html#package-entry-points) + ### main The main field is a module ID that is the primary entry point to your @@ -368,7 +384,7 @@ For example, myapp could have this: ```json { "bin": { - "myapp": "./cli.js" + "myapp": "bin/cli.js" } } ``` @@ -385,7 +401,7 @@ package, then you can just supply it as a string. For example: { "name": "my-program", "version": "1.2.5", - "bin": "./path/to/program" + "bin": "path/to/program" } ``` @@ -396,7 +412,7 @@ would be the same as this: "name": "my-program", "version": "1.2.5", "bin": { - "my-program": "./path/to/program" + "my-program": "path/to/program" } } ``` @@ -497,7 +513,7 @@ walking the folder. ### repository Specify the place where your code lives. This is helpful for people who -want to contribute. If the git repo is on GitHub, then the `npm docs` +want to contribute. If the git repo is on GitHub, then the `npm repo` command will be able to find you. Do it like this: @@ -506,7 +522,7 @@ Do it like this: { "repository": { "type": "git", - "url": "https://github.com/npm/cli.git" + "url": "git+https://github.com/npm/cli.git" } } ``` @@ -541,8 +557,8 @@ which it lives: { "repository": { "type": "git", - "url": "https://github.com/facebook/react.git", - "directory": "packages/react-dom" + "url": "git+https://github.com/npm/cli.git", + "directory": "workspaces/libnpmpublish" } } ``` @@ -605,6 +621,7 @@ See [semver](https://github.com/npm/node-semver#versions) for more details about * `tag` A specific version tagged and published as `tag` See [`npm dist-tag`](/commands/npm-dist-tag) * `path/path/path` See [Local Paths](#local-paths) below +* `npm:@scope/pkg@version` Custom alias for a package See [`package-spec`](/using-npm/package-spec#aliases) For example, these are all valid: @@ -622,7 +639,8 @@ For example, these are all valid: "two": "2.x", "thr": "3.3.x", "lat": "latest", - "dyl": "file:../dyl" + "dyl": "file:../dyl", + "kpg": "npm:pkg@1.0.0" } } ``` @@ -818,11 +836,12 @@ to express this. If you depend on features introduced in 1.5.2, use ### peerDependenciesMeta -When a user installs your package, npm will emit warnings if packages -specified in `peerDependencies` are not already installed. The -`peerDependenciesMeta` field serves to provide npm more information on how +The `peerDependenciesMeta` field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer -dependencies to be marked as optional. +dependencies to be marked as optional. Npm will not automatically install +optional peer dependencies. This allows you to +integrate and interact with a variety of host packages without requiring +all of them to be installed. For example: @@ -842,11 +861,6 @@ For example: } ``` -Marking a peer dependency as optional ensures npm will not emit a warning -if the `soy-milk` package is not installed on the host. This allows you to -integrate and interact with a variety of host packages without requiring -all of them to be installed. - ### bundleDependencies This defines an array of package names that will be bundled when publishing @@ -928,6 +942,13 @@ Overrides provide a way to replace a package in your dependency tree with another version, or another package entirely. These changes can be scoped as specific or as vague as desired. +Overrides are only considered in the root `package.json` file for a project. +Overrides in installed dependencies (including +[workspaces](/using-npm/workspaces)) are not considered in dependency tree +resolution. Published packages may dictate their resolutions by pinning +dependencies or using an +[`npm-shrinkwrap.json`](/configuring-npm/npm-shrinkwrap-json) file. + To make sure the package `foo` is always installed as version `1.0.0` no matter what version your dependencies rely on: @@ -1108,6 +1129,32 @@ Like the `os` option, you can also block architectures: The host architecture is determined by `process.arch` +### devEngines + +The `devEngines` field aids engineers working on a codebase to all be using the same tooling. + +You can specify a `devEngines` property in your `package.json` which will run before `install`, `ci`, and `run` commands. + +> Note: `engines` and `devEngines` differ in object shape. They also function very differently. `engines` is designed to alert the user when a dependency uses a differening npm or node version that the project it's being used in, whereas `devEngines` is used to alert people interacting with the source code of a project. + +The supported keys under the `devEngines` property are `cpu`, `os`, `libc`, `runtime`, and `packageManager`. Each property can be an object or an array of objects. Objects must contain `name`, and optionally can specify `version`, and `onFail`. `onFail` can be `warn`, `error`, or `ignore`, and if left undefined is of the same value as `error`. `npm` will assume that you're running with `node`. +Here's an example of a project that will fail if the environment is not `node` and `npm`. If you set `runtime.name` or `packageManager.name` to any other string, it will fail within the npm CLI. + +```json +{ + "devEngines": { + "runtime": { + "name": "node", + "onFail": "error" + }, + "packageManager": { + "name": "npm", + "onFail": "error" + } + } +} +``` + ### private If you set `"private": true` in your package.json, then npm will refuse to diff --git a/deps/npm/docs/content/configuring-npm/package-lock-json.md b/deps/npm/docs/content/configuring-npm/package-lock-json.md index d540dd0e7228b8..f3b012175fa0ec 100644 --- a/deps/npm/docs/content/configuring-npm/package-lock-json.md +++ b/deps/npm/docs/content/configuring-npm/package-lock-json.md @@ -31,6 +31,8 @@ various purposes: picture of the package tree, reducing the need to read `package.json` files, and allowing for significant performance improvements. +When `npm` creates or updates `package-lock.json`, it will infer line endings and indentation from `package.json` so that the formatting of both files matches. + ### `package-lock.json` vs `npm-shrinkwrap.json` Both of these files have the same format, and perform similar functions in diff --git a/deps/npm/docs/content/using-npm/config.md b/deps/npm/docs/content/using-npm/config.md index 7158ee304ba46c..6143e59d46a040 100644 --- a/deps/npm/docs/content/using-npm/config.md +++ b/deps/npm/docs/content/using-npm/config.md @@ -1217,7 +1217,7 @@ a semver. Like the `rc` in `1.2.0-rc.8`. * Type: Boolean When set to `true`, npm will display a progress bar during time intensive -operations, if `process.stderr` is a TTY. +operations, if `process.stderr` and `process.stdout` are a TTY. Set to `false` to suppress the progress bar. @@ -1567,12 +1567,15 @@ See also the `ca` config. If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. -Also the tag that is added to the package@version specified by the `npm tag` -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. +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` diff --git a/deps/npm/docs/content/using-npm/removal.md b/deps/npm/docs/content/using-npm/removal.md index 25dbb80baa7a95..3b94a7d18f9d7c 100644 --- a/deps/npm/docs/content/using-npm/removal.md +++ b/deps/npm/docs/content/using-npm/removal.md @@ -12,11 +12,7 @@ So sad to see you go. sudo npm uninstall npm -g ``` -Or, if that fails, get the npm source code, and do: - -```bash -sudo make uninstall -``` +Or, if that fails, please proceed to more severe uninstalling methods. ### More Severe Uninstalling diff --git a/deps/npm/docs/lib/index.js b/deps/npm/docs/lib/index.js index 5d4ae7af3457bb..b88d20cca35585 100644 --- a/deps/npm/docs/lib/index.js +++ b/deps/npm/docs/lib/index.js @@ -119,7 +119,7 @@ const replaceConfig = (src, { path }) => { } const allConfig = Object.entries(definitions).sort(sort) - .map(([_, def]) => def.describe()) + .map(([, def]) => def.describe()) .join('\n\n') return src.replace(replacer, allConfig) @@ -157,7 +157,7 @@ const replaceHelpLinks = (src) => { const transformMan = (src, { data, unified, remarkParse, remarkMan }) => unified() .use(remarkParse) - .use(remarkMan) + .use(remarkMan, { version: `NPM@${version}` }) .processSync(`# ${data.title}(${data.section}) - ${data.description}\n\n${src}`) .toString() diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index aa89c3e0068fcf..edc5be8426ca66 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-access">npm-access</h1> +<h1 id="----npm-access----1094"> + <span>npm-access</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Set access level on published packages</span> </header> @@ -146,7 +154,7 @@ <h2 id="table-of-contents">Table of contents</h2> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> -<pre><code class="language-bash">npm access list packages [<user>|<scope>|<scope:team> [<package>] +<pre><code class="language-bash">npm access list packages [<user>|<scope>|<scope:team>] [<package>] npm access list collaborators [<package> [<user>]] npm access get status [<package>] npm access set status=public|private [<package>] diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index e515eaa5adabda..0d664b740107e2 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-adduser">npm-adduser</h1> +<h1 id="----npm-adduser----1094"> + <span>npm-adduser</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Add a registry user account</span> </header> diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html index ab20ea72c65208..00df654800cef8 100644 --- a/deps/npm/docs/output/commands/npm-audit.html +++ b/deps/npm/docs/output/commands/npm-audit.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-audit">npm-audit</h1> +<h1 id="----npm-audit----1094"> + <span>npm-audit</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Run a security audit</span> </header> @@ -209,7 +217,7 @@ <h3 id="audit-signatures">Audit Signatures</h3> </code></pre> <p>Keys response:</p> <ul> -<li><code>expires</code>: null or a simplified extended <a href="https://en.wikipedia.org/wiki/ISO_8601%22">ISO 8601 format</a>: <code>YYYY-MM-DDTHH:mm:ss.sssZ</code></li> +<li><code>expires</code>: null or a simplified extended <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601 format</a>: <code>YYYY-MM-DDTHH:mm:ss.sssZ</code></li> <li><code>keydid</code>: sha256 fingerprint of the public key</li> <li><code>keytype</code>: only <code>ecdsa-sha2-nistp256</code> is currently supported by the npm CLI</li> <li><code>scheme</code>: only <code>ecdsa-sha2-nistp256</code> is currently supported by the npm CLI</li> diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index b3f7987e53a092..48b15e7ba99d94 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-bugs">npm-bugs</h1> +<h1 id="----npm-bugs----1094"> + <span>npm-bugs</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Report bugs for a package in a web browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index b5ddd5a5ad5c43..5f221564f4bd40 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-cache">npm-cache</h1> +<h1 id="----npm-cache----1094"> + <span>npm-cache</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manipulates packages cache</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index 4dffceba0d4d5c..f698a75aaaa164 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-ci">npm-ci</h1> +<h1 id="----npm-ci----1094"> + <span>npm-ci</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Clean install a project</span> </header> diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index d43bbf99fcdea5..9c253e1656f1a2 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-completion">npm-completion</h1> +<h1 id="----npm-completion----1094"> + <span>npm-completion</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Tab Completion for npm</span> </header> diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index 70a60390e0f90d..970e64cd3e44da 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-config">npm-config</h1> +<h1 id="----npm-config----1094"> + <span>npm-config</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage the npm configuration files</span> </header> diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index 625fe39bbd36c7..3633b9cc8a915b 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-dedupe">npm-dedupe</h1> +<h1 id="----npm-dedupe----1094"> + <span>npm-dedupe</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Reduce duplication in the package tree</span> </header> diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index f332437e1035c3..ba26bc133003e1 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-deprecate">npm-deprecate</h1> +<h1 id="----npm-deprecate----1094"> + <span>npm-deprecate</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Deprecate a version of a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index 13569c85f1837f..b0418125a3bd12 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-diff">npm-diff</h1> +<h1 id="----npm-diff----1094"> + <span>npm-diff</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">The registry diff command</span> </header> @@ -326,10 +334,11 @@ <h4 id="tag"><code>tag</code></h4> </ul> <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> -<p>Also the tag that is added to the package@version specified by the <code>npm tag</code> -command, if no explicit tag is given.</p> +<p>It is the tag added to the package@version specified in the <code>npm dist-tag add</code> command, if no explicit tag is given.</p> <p>When used by the <code>npm diff</code> command, this is the tag used to fetch the tarball that will be compared with the local files by default.</p> +<p>If used in the <code>npm publish</code> command, this is the tag that will be added to +the package submitted to the registry.</p> <h4 id="workspace"><code>workspace</code></h4> <ul> <li>Default:</li> diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index 1e75f62f1fcb49..e2f6a11aad031a 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-dist-tag">npm-dist-tag</h1> +<h1 id="----npm-dist-tag----1094"> + <span>npm-dist-tag</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Modify package distribution tags</span> </header> diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 53885437ec9a19..9760fb5e59137c 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-docs">npm-docs</h1> +<h1 id="----npm-docs----1094"> + <span>npm-docs</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Open documentation for a package in a web browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index d63f33389af97e..ee6a127abc144e 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,17 +141,20 @@ <section id="content"> <header class="title"> -<h1 id="npm-doctor">npm-doctor</h1> +<h1 id="----npm-doctor----1094"> + <span>npm-doctor</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Check the health of your npm environment</span> </header> <section id="table_of_contents"> <h2 id="table-of-contents">Table of contents</h2> -<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><ul><li><a href="#npm-ping"><code>npm ping</code></a></li><li><a href="#npm--v"><code>npm -v</code></a></li><li><a href="#node--v"><code>node -v</code></a></li><li><a href="#npm-config-get-registry"><code>npm config get registry</code></a></li><li><a href="#which-git"><code>which git</code></a></li><li><a href="#permissions-checks">Permissions checks</a></li><li><a href="#validate-the-checksums-of-cached-packages">Validate the checksums of cached packages</a></li></ul><li><a href="#configuration">Configuration</a></li><ul><li><a href="#registry"><code>registry</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> +<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><ul><li><a href="#connecting-to-the-registry"><code>Connecting to the registry</code></a></li><li><a href="#checking-npm-version"><code>Checking npm version</code></a></li><li><a href="#checking-node-version"><code>Checking node version</code></a></li><li><a href="#checking-configured-npm-registry"><code>Checking configured npm registry</code></a></li><li><a href="#checking-for-git-executable-in-path"><code>Checking for git executable in PATH</code></a></li><li><a href="#permissions-checks">Permissions checks</a></li><li><a href="#validate-the-checksums-of-cached-packages">Validate the checksums of cached packages</a></li></ul><li><a href="#configuration">Configuration</a></li><ul><li><a href="#registry"><code>registry</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> -<pre><code class="language-bash">npm doctor [ping] [registry] [versions] [environment] [permissions] [cache] +<pre><code class="language-bash">npm doctor [connection] [registry] [versions] [environment] [permissions] [cache] </code></pre> <p>Note: This command is unaware of workspaces.</p> <h3 id="description">Description</h3> @@ -171,17 +179,18 @@ <h3 id="description">Description</h3> there are any recommended changes, it will display them. By default npm runs all of these checks. You can limit what checks are ran by specifying them as extra arguments.</p> -<h4 id="npm-ping"><code>npm ping</code></h4> +<h4 id="connecting-to-the-registry"><code>Connecting to the registry</code></h4> <p>By default, npm installs from the primary npm registry, -<code>registry.npmjs.org</code>. <code>npm doctor</code> hits a special ping endpoint within the -registry. This can also be checked with <code>npm ping</code>. If this check fails, -you may be using a proxy that needs to be configured, or may need to talk -to your IT staff to get access over HTTPS to <code>registry.npmjs.org</code>.</p> +<code>registry.npmjs.org</code>. <code>npm doctor</code> hits a special connection testing +endpoint within the registry. This can also be checked with <code>npm ping</code>. +If this check fails, you may be using a proxy that needs to be +configured, or may need to talk to your IT staff to get access over +HTTPS to <code>registry.npmjs.org</code>.</p> <p>This check is done against whichever registry you've configured (you can see what that is by running <code>npm config get registry</code>), and if you're using a private registry that doesn't support the <code>/whoami</code> endpoint supported by the primary registry, this check may fail.</p> -<h4 id="npm--v"><code>npm -v</code></h4> +<h4 id="checking-npm-version"><code>Checking npm version</code></h4> <p>While Node.js may come bundled with a particular version of npm, it's the policy of the CLI team that we recommend all users run <code>npm@latest</code> if they can. As the CLI is maintained by a small team of contributors, there are @@ -189,21 +198,21 @@ <h4 id="npm--v"><code>npm -v</code></h4> support releases typically only receive critical security and regression fixes. The team believes that the latest tested version of npm is almost always likely to be the most functional and defect-free version of npm.</p> -<h4 id="node--v"><code>node -v</code></h4> +<h4 id="checking-node-version"><code>Checking node version</code></h4> <p>For most users, in most circumstances, the best version of Node will be the latest long-term support (LTS) release. Those of you who want access to new ECMAscript features or bleeding-edge changes to Node's standard library may be running a newer version, and some may be required to run an older version of Node because of enterprise change control policies. That's OK! But in general, the npm team recommends that most users run Node.js LTS.</p> -<h4 id="npm-config-get-registry"><code>npm config get registry</code></h4> +<h4 id="checking-configured-npm-registry"><code>Checking configured npm registry</code></h4> <p>You may be installing from private package registries for your project or company. That's great! Others may be following tutorials or StackOverflow questions in an effort to troubleshoot problems you may be having. Sometimes, this may entail changing the registry you're pointing at. This part of <code>npm doctor</code> just lets you, and maybe whoever's helping you with support, know that you're not using the default registry.</p> -<h4 id="which-git"><code>which git</code></h4> +<h4 id="checking-for-git-executable-in-path"><code>Checking for git executable in PATH</code></h4> <p>While it's documented in the README, it may not be obvious that npm needs Git installed to do many of the things that it does. Also, in some cases – especially on Windows – you may have Git set up in such a way that it's diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index 52c8e573836abc..9cde69dc3a278a 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-edit">npm-edit</h1> +<h1 id="----npm-edit----1094"> + <span>npm-edit</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Edit an installed package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index 51f6c2b75e4566..e1ed227f4e3644 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-exec">npm-exec</h1> +<h1 id="----npm-exec----1094"> + <span>npm-exec</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Run a command from a local or remote npm package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index 74305d399bc6d4..040928716ff8e4 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-explain">npm-explain</h1> +<h1 id="----npm-explain----1094"> + <span>npm-explain</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Explain installed packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index 2e52c73f3f7c26..956fcdea77cf6f 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-explore">npm-explore</h1> +<h1 id="----npm-explore----1094"> + <span>npm-explore</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Browse an installed package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index 86546d345d46cc..8c64c331e88960 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-find-dupes">npm-find-dupes</h1> +<h1 id="----npm-find-dupes----1094"> + <span>npm-find-dupes</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Find duplication in the package tree</span> </header> diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index 7193d179f23a33..500cc335794c6a 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-fund">npm-fund</h1> +<h1 id="----npm-fund----1094"> + <span>npm-fund</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Retrieve funding information</span> </header> diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index c8ae1b63192108..1aebfc354bfd2c 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-help-search">npm-help-search</h1> +<h1 id="----npm-help-search----1094"> + <span>npm-help-search</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Search npm help documentation</span> </header> diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index 3cf78e35bf1f62..795230b845fb97 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-help">npm-help</h1> +<h1 id="----npm-help----1094"> + <span>npm-help</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Get help on npm</span> </header> diff --git a/deps/npm/docs/output/commands/npm-hook.html b/deps/npm/docs/output/commands/npm-hook.html index 46077516384cc5..42101dc55b1d49 100644 --- a/deps/npm/docs/output/commands/npm-hook.html +++ b/deps/npm/docs/output/commands/npm-hook.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-hook">npm-hook</h1> +<h1 id="----npm-hook----1094"> + <span>npm-hook</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage registry hooks</span> </header> diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index 9094984dd20efa..5e027004eb75e7 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-init">npm-init</h1> +<h1 id="----npm-init----1094"> + <span>npm-init</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Create a package.json file</span> </header> @@ -146,7 +154,7 @@ <h2 id="table-of-contents">Table of contents</h2> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> -<pre><code class="language-bash">npm init <package-spec> (same as `npx <package-spec>`) +<pre><code class="language-bash">npm init <package-spec> (same as `npx create-<package-spec>`) npm init <@scope> (same as `npx <@scope>/create`) aliases: create, innit 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 407dbf9a2dd6bd..be4a272d48c5de 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-install-ci-test">npm-install-ci-test</h1> +<h1 id="----npm-install-ci-test----1094"> + <span>npm-install-ci-test</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Install a project with a clean slate and run tests</span> </header> diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index bdbe82f5d3442a..6a68c794ad71ff 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-install-test">npm-install-test</h1> +<h1 id="----npm-install-test----1094"> + <span>npm-install-test</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Install package(s) and run tests</span> </header> diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index 774da9fc37b106..86008c0430e866 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-install">npm-install</h1> +<h1 id="----npm-install----1094"> + <span>npm-install</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Install a package</span> </header> @@ -261,6 +269,9 @@ <h3 id="description">Description</h3> <p><code>-D, --save-dev</code>: Package will appear in your <code>devDependencies</code>.</p> </li> <li> +<p><code>--save-peer</code>: Package will appear in your <code>peerDependencies</code>.</p> +</li> +<li> <p><code>-O, --save-optional</code>: Package will appear in your <code>optionalDependencies</code>.</p> </li> @@ -298,9 +309,6 @@ <h3 id="description">Description</h3> npm install readable-stream --save-exact npm install ansi-regex --save-bundle </code></pre> -<p><strong>Note</strong>: If there is a file or folder named <code><name></code> in the current -working directory, then it will try to install that, and only try to -fetch the package by name if it is not valid.</p> </li> <li> <p><code>npm install <alias>@npm:<name></code>:</p> diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index 93ec04390fc5b2..1e13ce0edb42c4 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-link">npm-link</h1> +<h1 id="----npm-link----1094"> + <span>npm-link</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Symlink a package folder</span> </header> diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index 5ffff8aa627168..d29cfa8290479a 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-login">npm-login</h1> +<h1 id="----npm-login----1094"> + <span>npm-login</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Login to a registry user account</span> </header> diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 5767772b68c4f0..4569b2f5fea203 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-logout">npm-logout</h1> +<h1 id="----npm-logout----1094"> + <span>npm-logout</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Log out of the registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 0f4beb45d09397..a2b0ceccf1c2fb 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-ls">npm-ls</h1> +<h1 id="----npm-ls----1094"> + <span>npm-ls</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">List installed packages</span> </header> @@ -160,7 +168,7 @@ <h3 id="description">Description</h3> the results to only the paths to the packages named. Note that nested packages will <em>also</em> show the paths to the specified packages. For example, running <code>npm ls promzard</code> in npm's source tree will show:</p> -<pre><code class="language-bash">npm@10.5.1 /path/to/npm +<pre><code class="language-bash">npm@10.9.4 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 </code></pre> diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index 601abc6369724e..4e2941a69a51a8 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-org">npm-org</h1> +<h1 id="----npm-org----1094"> + <span>npm-org</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage orgs</span> </header> diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 96689fb906c263..a2ce5becdbca84 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-outdated">npm-outdated</h1> +<h1 id="----npm-outdated----1094"> + <span>npm-outdated</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Check for outdated packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index dab34abe97c14a..8ba1ca1e3d4720 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-owner">npm-owner</h1> +<h1 id="----npm-owner----1094"> + <span>npm-owner</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage package owners</span> </header> diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index f8f5d784224d73..29a1e44466912b 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-pack">npm-pack</h1> +<h1 id="----npm-pack----1094"> + <span>npm-pack</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Create a tarball from a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index 708238b04497f8..268338afb7295d 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-ping">npm-ping</h1> +<h1 id="----npm-ping----1094"> + <span>npm-ping</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Ping npm registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index d60ca0b0f4aac7..8c28a651244cee 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-pkg">npm-pkg</h1> +<h1 id="----npm-pkg----1094"> + <span>npm-pkg</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manages your package.json</span> </header> diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index 41789e3e315088..b4f99129dd9d68 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-prefix">npm-prefix</h1> +<h1 id="----npm-prefix----1094"> + <span>npm-prefix</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Display prefix</span> </header> diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index a6283aeb1884f8..ef77ee038da0cf 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-profile">npm-profile</h1> +<h1 id="----npm-profile----1094"> + <span>npm-profile</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Change settings on your registry profile</span> </header> @@ -160,27 +168,16 @@ <h3 id="description">Description</h3> <li><code>npm profile get [<property>]</code>: Display all of the properties of your profile, or one or more specific properties. It looks like:</li> </ul> -<pre><code class="language-bash">+-----------------+---------------------------+ -| name | example | -+-----------------+---------------------------+ -| email | me@example.com (verified) | -+-----------------+---------------------------+ -| two factor auth | auth-and-writes | -+-----------------+---------------------------+ -| fullname | Example User | -+-----------------+---------------------------+ -| homepage | | -+-----------------+---------------------------+ -| freenode | | -+-----------------+---------------------------+ -| twitter | | -+-----------------+---------------------------+ -| github | | -+-----------------+---------------------------+ -| created | 2015-02-26T01:38:35.892Z | -+-----------------+---------------------------+ -| updated | 2017-10-02T21:29:45.922Z | -+-----------------+---------------------------+ +<pre><code>name: example +email: e@example.com (verified) +two-factor auth: auth-and-writes +fullname: Example User +homepage: +freenode: +twitter: +github: +created: 2015-02-26T01:38:35.892Z +updated: 2017-10-02T21:29:45.922Z </code></pre> <ul> <li> diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 94d016027e8363..a2e829cf938811 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-prune">npm-prune</h1> +<h1 id="----npm-prune----1094"> + <span>npm-prune</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Remove extraneous packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-publish.html b/deps/npm/docs/output/commands/npm-publish.html index b5b18b4ddca610..c7b82c49410a7c 100644 --- a/deps/npm/docs/output/commands/npm-publish.html +++ b/deps/npm/docs/output/commands/npm-publish.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-publish">npm-publish</h1> +<h1 id="----npm-publish----1094"> + <span>npm-publish</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Publish a package</span> </header> @@ -225,10 +233,11 @@ <h4 id="tag"><code>tag</code></h4> </ul> <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> -<p>Also the tag that is added to the package@version specified by the <code>npm tag</code> -command, if no explicit tag is given.</p> +<p>It is the tag added to the package@version specified in the <code>npm dist-tag add</code> command, if no explicit tag is given.</p> <p>When used by the <code>npm diff</code> command, this is the tag used to fetch the tarball that will be compared with the local files by default.</p> +<p>If used in the <code>npm publish</code> command, this is the tag that will be added to +the package submitted to the registry.</p> <h4 id="access"><code>access</code></h4> <ul> <li>Default: 'public' for new packages, existing packages it will not change the diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index 228de6787fd408..4f33f5523dd486 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-query">npm-query</h1> +<h1 id="----npm-query----1094"> + <span>npm-query</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Dependency selector query</span> </header> diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index ee3ba1e8163502..08dd01f8fe3fba 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-rebuild">npm-rebuild</h1> +<h1 id="----npm-rebuild----1094"> + <span>npm-rebuild</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Rebuild a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index 4278ffae934975..6bcb661c79bf8f 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-repo">npm-repo</h1> +<h1 id="----npm-repo----1094"> + <span>npm-repo</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Open package repository page in the browser</span> </header> diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index 368252f58ea5b3..ed906693ad6fd3 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-restart">npm-restart</h1> +<h1 id="----npm-restart----1094"> + <span>npm-restart</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Restart a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index d300a0caaf8fb6..c11ea8c087848d 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-root">npm-root</h1> +<h1 id="----npm-root----1094"> + <span>npm-root</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Display npm root</span> </header> diff --git a/deps/npm/docs/output/commands/npm-run-script.html b/deps/npm/docs/output/commands/npm-run-script.html index 9f0c03940e83d3..5753f201319119 100644 --- a/deps/npm/docs/output/commands/npm-run-script.html +++ b/deps/npm/docs/output/commands/npm-run-script.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-run-script">npm-run-script</h1> +<h1 id="----npm-run-script----1094"> + <span>npm-run-script</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Run arbitrary package scripts</span> </header> diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index 01302780a2ab77..101467ddeefe1f 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-sbom">npm-sbom</h1> +<h1 id="----npm-sbom----1094"> + <span>npm-sbom</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Generate a Software Bill of Materials (SBOM)</span> </header> diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index fb35290351bf63..5a3202a4ff01cf 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,17 +141,20 @@ <section id="content"> <header class="title"> -<h1 id="npm-search">npm-search</h1> +<h1 id="----npm-search----1094"> + <span>npm-search</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Search for packages</span> </header> <section id="table_of_contents"> <h2 id="table-of-contents">Table of contents</h2> -<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><li><a href="#configuration">Configuration</a></li><ul><li><a href="#long"><code>long</code></a></li><li><a href="#json"><code>json</code></a></li><li><a href="#color"><code>color</code></a></li><li><a href="#parseable"><code>parseable</code></a></li><li><a href="#description2"><code>description</code></a></li><li><a href="#searchlimit"><code>searchlimit</code></a></li><li><a href="#searchopts"><code>searchopts</code></a></li><li><a href="#searchexclude"><code>searchexclude</code></a></li><li><a href="#registry"><code>registry</code></a></li><li><a href="#prefer-online"><code>prefer-online</code></a></li><li><a href="#prefer-offline"><code>prefer-offline</code></a></li><li><a href="#offline"><code>offline</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> +<div id="_table_of_contents"><ul><li><a href="#synopsis">Synopsis</a></li><li><a href="#description">Description</a></li><li><a href="#configuration">Configuration</a></li><ul><li><a href="#json"><code>json</code></a></li><li><a href="#color"><code>color</code></a></li><li><a href="#parseable"><code>parseable</code></a></li><li><a href="#description2"><code>description</code></a></li><li><a href="#searchlimit"><code>searchlimit</code></a></li><li><a href="#searchopts"><code>searchopts</code></a></li><li><a href="#searchexclude"><code>searchexclude</code></a></li><li><a href="#registry"><code>registry</code></a></li><li><a href="#prefer-online"><code>prefer-online</code></a></li><li><a href="#prefer-offline"><code>prefer-offline</code></a></li><li><a href="#offline"><code>offline</code></a></li></ul><li><a href="#see-also">See Also</a></li></ul></div> </section> <div id="_content"><h3 id="synopsis">Synopsis</h3> -<pre><code class="language-bash">npm search [search terms ...] +<pre><code class="language-bash">npm search <search term> [<search term> ...] aliases: find, s, se </code></pre> @@ -170,12 +178,6 @@ <h3 id="description">Description</h3> ignore a trailing <code>/</code> . (Note you must escape or quote many regular expression characters in most shells.)</p> <h3 id="configuration">Configuration</h3> -<h4 id="long"><code>long</code></h4> -<ul> -<li>Default: false</li> -<li>Type: Boolean</li> -</ul> -<p>Show extended information in <code>ls</code>, <code>search</code>, and <code>help-search</code>.</p> <h4 id="json"><code>json</code></h4> <ul> <li>Default: false</li> diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index fd219fe06a4ce8..2be387a1e73640 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-shrinkwrap">npm-shrinkwrap</h1> +<h1 id="----npm-shrinkwrap----1094"> + <span>npm-shrinkwrap</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Lock down dependency versions for publication</span> </header> diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index 58f8c0946bfb5e..c8abb8a2d8366a 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-star">npm-star</h1> +<h1 id="----npm-star----1094"> + <span>npm-star</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Mark your favorite packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index 18ffb8529d31a8..8c670722f80564 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-stars">npm-stars</h1> +<h1 id="----npm-stars----1094"> + <span>npm-stars</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">View packages marked as favorites</span> </header> diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index 79647edf37980d..0f77764fe40b77 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-start">npm-start</h1> +<h1 id="----npm-start----1094"> + <span>npm-start</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Start a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index a744a635d665cc..b6d6d883516bea 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-stop">npm-stop</h1> +<h1 id="----npm-stop----1094"> + <span>npm-stop</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Stop a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 6752bb38102d7a..9f5d0e63104a64 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-team">npm-team</h1> +<h1 id="----npm-team----1094"> + <span>npm-team</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage organization teams and team memberships</span> </header> diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index 6e1732ade6b13a..b09b88dd139345 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-test">npm-test</h1> +<h1 id="----npm-test----1094"> + <span>npm-test</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Test a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-token.html b/deps/npm/docs/output/commands/npm-token.html index 44f94ec71ff14e..fc29f1d31f0dfe 100644 --- a/deps/npm/docs/output/commands/npm-token.html +++ b/deps/npm/docs/output/commands/npm-token.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-token">npm-token</h1> +<h1 id="----npm-token----1094"> + <span>npm-token</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Manage your authentication tokens</span> </header> @@ -158,23 +166,13 @@ <h3 id="description">Description</h3> Shows a table of all active authentication tokens. You can request this as JSON with <code>--json</code> or tab-separated values with <code>--parseable</code>.</li> </ul> -<pre><code class="language-bash">+--------+---------+------------+----------+----------------+ -| id | token | created | read-only | CIDR whitelist | -+--------+---------+------------+----------+----------------+ -| 7f3134 | 1fa9ba… | 2017-10-02 | yes | | -+--------+---------+------------+----------+----------------+ -| c03241 | af7aef… | 2017-10-02 | no | 192.168.0.1/24 | -+--------+---------+------------+----------+----------------+ -| e0cf92 | 3a436a… | 2017-10-02 | no | | -+--------+---------+------------+----------+----------------+ -| 63eb9d | 74ef35… | 2017-09-28 | no | | -+--------+---------+------------+----------+----------------+ -| 2daaa8 | cbad5f… | 2017-09-26 | no | | -+--------+---------+------------+----------+----------------+ -| 68c2fe | 127e51… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ -| 6334e1 | 1dadd1… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ +<pre><code>Read only token npm_1f… with id 7f3134 created 2017-10-21 + +Publish token npm_af… with id c03241 created 2017-10-02 +with IP Whitelist: 192.168.0.1/24 + +Publish token npm_… with id e0cf92 created 2017-10-02 + </code></pre> <ul> <li> @@ -191,15 +189,7 @@ <h3 id="description">Description</h3> for more information on generating automation tokens.</p> </li> </ul> -<pre><code class="language-bash">+----------------+--------------------------------------+ -| token | a73c9572-f1b9-8983-983d-ba3ac3cc913d | -+----------------+--------------------------------------+ -| cidr_whitelist | | -+----------------+--------------------------------------+ -| readonly | false | -+----------------+--------------------------------------+ -| created | 2017-10-02T07:52:24.838Z | -+----------------+--------------------------------------+ +<pre><code>Created publish token a73c9572-f1b9-8983-983d-ba3ac3cc913d </code></pre> <ul> <li><code>npm token revoke <token|id></code>: diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index 4a4e6c274a09e7..8cfbdf38b5b0eb 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-uninstall">npm-uninstall</h1> +<h1 id="----npm-uninstall----1094"> + <span>npm-uninstall</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Remove a package</span> </header> diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index cf952c56f4cfdf..e1b8405035546f 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-unpublish">npm-unpublish</h1> +<h1 id="----npm-unpublish----1094"> + <span>npm-unpublish</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Remove a package from the registry</span> </header> diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index 602e555e760e14..d946d81cbd8afd 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-unstar">npm-unstar</h1> +<h1 id="----npm-unstar----1094"> + <span>npm-unstar</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Remove an item from your favorite packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index 462bca7b771628..9eb29fb4481a3c 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-update">npm-update</h1> +<h1 id="----npm-update----1094"> + <span>npm-update</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Update packages</span> </header> diff --git a/deps/npm/docs/output/commands/npm-version.html b/deps/npm/docs/output/commands/npm-version.html index 4977af5173cf55..186bafe9463d02 100644 --- a/deps/npm/docs/output/commands/npm-version.html +++ b/deps/npm/docs/output/commands/npm-version.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-version">npm-version</h1> +<h1 id="----npm-version----1094"> + <span>npm-version</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Bump a package version</span> </header> diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index af43193dd0869b..fceb0df0cd5636 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-view">npm-view</h1> +<h1 id="----npm-view----1094"> + <span>npm-view</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">View registry info</span> </header> diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index 9e5050b06ee9e4..2933c61ce5fa91 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm-whoami">npm-whoami</h1> +<h1 id="----npm-whoami----1094"> + <span>npm-whoami</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Display npm username</span> </header> diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 4be373a7159e9f..dbaba93ed54f93 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npm">npm</h1> +<h1 id="----npm----1094"> + <span>npm</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">javascript package manager</span> </header> @@ -150,7 +158,7 @@ <h2 id="table-of-contents">Table of contents</h2> </code></pre> <p>Note: This command is unaware of workspaces.</p> <h3 id="version">Version</h3> -<p>10.5.1</p> +<p>10.9.4</p> <h3 id="description">Description</h3> <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 @@ -264,7 +272,7 @@ <h3 id="bugs">Bugs</h3> <h3 id="feature-requests">Feature Requests</h3> <p>Discuss new feature ideas on our discussion forum:</p> <ul> -<li><a href="https://github.com/npm/feedback">https://github.com/npm/feedback</a></li> +<li><a href="https://github.com/orgs/community/discussions/categories/npm">https://github.com/orgs/community/discussions/categories/npm</a></li> </ul> <p>Or suggest formal RFC proposals:</p> <ul> diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index d2bebc34c0c484..493e6cb1d33cb2 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="npx">npx</h1> +<h1 id="----npx----1094"> + <span>npx</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Run a command from a local or remote npm package</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index cb97ac6ad25326..bece14d8722854 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="folders">folders</h1> +<h1 id="----folders----1094"> + <span>folders</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Folder Structures Used by npm</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index 996082d018ea30..c1d66ea00bd301 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@ <section id="content"> <header class="title"> -<h1 id="install">install</h1> +<h1 id="----install----1094"> + <span>install</span> + <span class="version">@10.9.4</span> +</h1> <span class="description">Download and install node and npm</span> </header> diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html new file mode 100644 index 00000000000000..bece14d8722854 --- /dev/null +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -0,0 +1,330 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<title>folders + + + + + +
+
+

+ folders + @10.9.4 +

+Folder Structures Used by npm +
+ +
+

Table of contents

+ +
+ +

Description

+

npm puts various things on your computer. That's its job.

+

This document will tell you what it puts where.

+

tl;dr

+
    +
  • Local install (default): puts stuff in ./node_modules of the current +package root.
  • +
  • Global install (with -g): puts stuff in /usr/local or wherever node +is installed.
  • +
  • Install it locally if you're going to require() it.
  • +
  • Install it globally if you're going to run it on the command line.
  • +
  • If you need both, then install it in both places, or use npm link.
  • +
+

prefix Configuration

+

The prefix config defaults to the location where +node is installed. On most systems, this is /usr/local. On Windows, it's +%AppData%\npm. On Unix systems, it's one level up, since node is typically +installed at {prefix}/bin/node rather than {prefix}/node.exe.

+

When the global flag is set, npm installs things into this prefix. +When it is not set, it uses the root of the current package, or the +current working directory if not in a package already.

+

Node Modules

+

Packages are dropped into the node_modules folder under the prefix. +When installing locally, this means that you can +require("packagename") to load its main module, or +require("packagename/lib/path/to/sub/module") to load other modules.

+

Global installs on Unix systems go to {prefix}/lib/node_modules. +Global installs on Windows go to {prefix}/node_modules (that is, no +lib folder.)

+

Scoped packages are installed the same way, except they are grouped together +in a sub-folder of the relevant node_modules folder with the name of that +scope prefix by the @ symbol, e.g. npm install @myorg/package would place +the package in {prefix}/node_modules/@myorg/package. See +scope for more details.

+

If you wish to require() a package, then install it locally.

+

Executables

+

When in global mode, executables are linked into {prefix}/bin on Unix, +or directly into {prefix} on Windows. Ensure that path is in your +terminal's PATH environment to run them.

+

When in local mode, executables are linked into +./node_modules/.bin so that they can be made available to scripts run +through npm. (For example, so that a test runner will be in the path +when you run npm test.)

+

Man Pages

+

When in global mode, man pages are linked into {prefix}/share/man.

+

When in local mode, man pages are not installed.

+

Man pages are not installed on Windows systems.

+

Cache

+

See npm cache. Cache files are stored in ~/.npm on Posix, or +%LocalAppData%/npm-cache on Windows.

+

This is controlled by the cache config param.

+

Temp Files

+

Temporary files are stored by default in the folder specified by the +tmp config, which defaults to the TMPDIR, TMP, or +TEMP environment variables, or /tmp on Unix and c:\windows\temp on Windows.

+

Temp files are given a unique folder under this root for each run of the +program, and are deleted upon successful exit.

+

More Information

+

When installing locally, npm first tries to find an appropriate +prefix folder. This is so that npm install foo@1.2.3 will install +to the sensible root of your package, even if you happen to have cded +into some other folder.

+

Starting at the $PWD, npm will walk up the folder tree checking for a +folder that contains either a package.json file, or a node_modules +folder. If such a thing is found, then that is treated as the effective +"current directory" for the purpose of running npm commands. (This +behavior is inspired by and similar to git's .git-folder seeking +logic when running git commands in a working dir.)

+

If no package root is found, then the current folder is used.

+

When you run npm install foo@1.2.3, then the package is loaded into +the cache, and then unpacked into ./node_modules/foo. Then, any of +foo's dependencies are similarly unpacked into +./node_modules/foo/node_modules/....

+

Any bin files are symlinked to ./node_modules/.bin/, so that they may +be found by npm scripts when necessary.

+

Global Installation

+

If the global config is set to true, then npm will +install packages "globally".

+

For global installation, packages are installed roughly the same way, +but using the folders described above.

+

Cycles, Conflicts, and Folder Parsimony

+

Cycles are handled using the property of node's module system that it +walks up the directories looking for node_modules folders. So, at every +stage, if a package is already installed in an ancestor node_modules +folder, then it is not installed at the current location.

+

Consider the case above, where foo -> bar -> baz. Imagine if, in +addition to that, baz depended on bar, so you'd have: +foo -> bar -> baz -> bar -> baz .... However, since the folder +structure is: foo/node_modules/bar/node_modules/baz, there's no need to +put another copy of bar into .../baz/node_modules, since when baz calls +require("bar"), it will get the copy that is installed in +foo/node_modules/bar.

+

This shortcut is only used if the exact same +version would be installed in multiple nested node_modules folders. It +is still possible to have a/node_modules/b/node_modules/a if the two +"a" packages are different versions. However, without repeating the +exact same package multiple times, an infinite regress will always be +prevented.

+

Another optimization can be made by installing dependencies at the +highest level possible, below the localized "target" folder (hoisting). +Since version 3, npm hoists dependencies by default.

+

Example

+

Consider this dependency graph:

+
foo
++-- blerg@1.2.5
++-- bar@1.2.3
+|   +-- blerg@1.x (latest=1.3.7)
+|   +-- baz@2.x
+|   |   `-- quux@3.x
+|   |       `-- bar@1.2.3 (cycle)
+|   `-- asdf@*
+`-- baz@1.2.3
+    `-- quux@3.x
+        `-- bar
+
+

In this case, we might expect a folder structure like this +(with all dependencies hoisted to the highest level possible):

+
foo
++-- node_modules
+    +-- blerg (1.2.5) <---[A]
+    +-- bar (1.2.3) <---[B]
+    |   +-- node_modules
+    |       +-- baz (2.0.2) <---[C]
+    +-- asdf (2.3.4)
+    +-- baz (1.2.3) <---[D]
+    +-- quux (3.2.0) <---[E]
+
+

Since foo depends directly on bar@1.2.3 and baz@1.2.3, those are +installed in foo's node_modules folder.

+

Even though the latest copy of blerg is 1.3.7, foo has a specific +dependency on version 1.2.5. So, that gets installed at [A]. Since the +parent installation of blerg satisfies bar's dependency on blerg@1.x, +it does not install another copy under [B].

+

Bar [B] also has dependencies on baz and asdf. Because it depends on baz@2.x, it cannot +re-use the baz@1.2.3 installed in the parent node_modules folder [D], +and must install its own copy [C]. In order to minimize duplication, npm hoists +dependencies to the top level by default, so asdf is installed under [A].

+

Underneath bar, the baz -> quux -> bar dependency creates a cycle. +However, because bar is already in quux's ancestry [B], it does not +unpack another copy of bar into that folder. Likewise, quux's [E] +folder tree is empty, because its dependency on bar is satisfied +by the parent folder copy installed at [B].

+

For a graphical breakdown of what is installed where, use npm ls.

+

Publishing

+

Upon publishing, npm will look in the node_modules folder. If any of +the items there are not in the bundleDependencies array, then they will +not be included in the package tarball.

+

This allows a package maintainer to install all of their dependencies +(and dev dependencies) locally, but only re-publish those items that +cannot be found elsewhere. See package.json for more information.

+

See also

+
+ + +
+ + + + \ No newline at end of file diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html new file mode 100644 index 00000000000000..8f19faa98668d9 --- /dev/null +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -0,0 +1,1111 @@ + + +package.json + + + + + +
+
+

+ package.json + @10.9.4 +

+Specifics of npm's package.json handling +
+ +
+

Table of contents

+ +
+ +

Description

+

This document is all you need to know about what's required in your +package.json file. It must be actual JSON, not just a JavaScript object +literal.

+

A lot of the behavior described in this document is affected by the config +settings described in config.

+

name

+

If you plan to publish your package, the most important things in your +package.json are the name and version fields as they will be required. The +name and version together form an identifier that is assumed to be +completely unique. Changes to the package should come along with changes +to the version. If you don't plan to publish your package, the name and +version fields are optional.

+

The name is what your thing is called.

+

Some rules:

+
    +
  • The name must be less than or equal to 214 characters. This includes the +scope for scoped packages.
  • +
  • The names of scoped packages can begin with a dot or an underscore. This +is not permitted without a scope.
  • +
  • New packages must not have uppercase letters in the name.
  • +
  • The name ends up being part of a URL, an argument on the command line, +and a folder name. Therefore, the name can't contain any non-URL-safe +characters.
  • +
+

Some tips:

+
    +
  • Don't use the same name as a core Node module.
  • +
  • Don't put "js" or "node" in the name. It's assumed that it's js, since +you're writing a package.json file, and you can specify the engine using +the "engines" field. (See below.)
  • +
  • The name will probably be passed as an argument to require(), so it +should be something short, but also reasonably descriptive.
  • +
  • You may want to check the npm registry to see if there's something by +that name already, before you get too attached to it. +https://www.npmjs.com/
  • +
+

A name can be optionally prefixed by a scope, e.g. @myorg/mypackage. See +scope for more detail.

+

version

+

If you plan to publish your package, the most important things in your +package.json are the name and version fields as they will be required. The +name and version together form an identifier that is assumed to be +completely unique. Changes to the package should come along with changes +to the version. If you don't plan to publish your package, the name and +version fields are optional.

+

Version must be parseable by +node-semver, which is bundled with +npm as a dependency. (npm install semver to use it yourself.)

+

description

+

Put a description in it. It's a string. This helps people discover your +package, as it's listed in npm search.

+

keywords

+

Put keywords in it. It's an array of strings. This helps people discover +your package as it's listed in npm search.

+

homepage

+

The URL to the project homepage.

+

Example:

+
"homepage": "https://github.com/owner/project#readme"
+
+

bugs

+

The URL to your project's issue tracker and / or the email address to which +issues should be reported. These are helpful for people who encounter +issues with your package.

+

It should look like this:

+
{
+  "bugs": {
+    "url": "https://github.com/owner/project/issues",
+    "email": "project@hostname.com"
+  }
+}
+
+

You can specify either one or both values. If you want to provide only a +URL, you can specify the value for "bugs" as a simple string instead of an +object.

+

If a URL is provided, it will be used by the npm bugs command.

+

license

+

You should specify a license for your package so that people know how they +are permitted to use it, and any restrictions you're placing on it.

+

If you're using a common license such as BSD-2-Clause or MIT, add a current +SPDX license identifier for the license you're using, like this:

+
{
+  "license" : "BSD-3-Clause"
+}
+
+

You can check the full list of SPDX license +IDs. Ideally you should pick one that is +OSI approved.

+

If your package is licensed under multiple common licenses, use an SPDX +license expression syntax version 2.0 +string, like this:

+
{
+  "license" : "(ISC OR GPL-3.0)"
+}
+
+

If you are using a license that hasn't been assigned an SPDX identifier, or if +you are using a custom license, use a string value like this one:

+
{
+  "license" : "SEE LICENSE IN <filename>"
+}
+
+

Then include a file named <filename> at the top level of the package.

+

Some old packages used license objects or a "licenses" property containing +an array of license objects:

+
// Not valid metadata
+{
+  "license" : {
+    "type" : "ISC",
+    "url" : "https://opensource.org/licenses/ISC"
+  }
+}
+
+// Not valid metadata
+{
+  "licenses" : [
+    {
+      "type": "MIT",
+      "url": "https://www.opensource.org/licenses/mit-license.php"
+    },
+    {
+      "type": "Apache-2.0",
+      "url": "https://opensource.org/licenses/apache2.0.php"
+    }
+  ]
+}
+
+

Those styles are now deprecated. Instead, use SPDX expressions, like this:

+
{
+  "license": "ISC"
+}
+
+
{
+  "license": "(MIT OR Apache-2.0)"
+}
+
+

Finally, if you do not wish to grant others the right to use a private or +unpublished package under any terms:

+
{
+  "license": "UNLICENSED"
+}
+
+

Consider also setting "private": true to prevent accidental publication.

+

people fields: author, contributors

+

The "author" is one person. "contributors" is an array of people. A +"person" is an object with a "name" field and optionally "url" and "email", +like this:

+
{
+  "name" : "Barney Rubble",
+  "email" : "b@rubble.com",
+  "url" : "http://barnyrubble.tumblr.com/"
+}
+
+

Or you can shorten that all into a single string, and npm will parse it for +you:

+
{
+  "author": "Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)"
+}
+
+

Both email and url are optional either way.

+

npm also sets a top-level "maintainers" field with your npm user info.

+

funding

+

You can specify an object containing a URL that provides up-to-date +information about ways to help fund development of your package, a +string URL, or an array of objects and string URLs:

+
{
+  "funding": {
+    "type" : "individual",
+    "url" : "http://example.com/donate"
+  }
+}
+
+
{
+  "funding": {
+    "type" : "patreon",
+    "url" : "https://www.patreon.com/my-account"
+  }
+}
+
+
{
+  "funding": "http://example.com/donate"
+}
+
+
{
+  "funding": [
+    {
+      "type" : "individual",
+      "url" : "http://example.com/donate"
+    },
+    "http://example.com/donateAlso",
+    {
+      "type" : "patreon",
+      "url" : "https://www.patreon.com/my-account"
+    }
+  ]
+}
+
+

Users can use the npm fund subcommand to list the funding URLs of all +dependencies of their project, direct and indirect. A shortcut to visit +each funding URL is also available when providing the project name such as: +npm fund <projectname> (when there are multiple URLs, the first one will +be visited)

+

files

+

The optional files field is an array of file patterns that describes the +entries to be included when your package is installed as a dependency. File +patterns follow a similar syntax to .gitignore, but reversed: including a +file, directory, or glob pattern (*, **/*, and such) will make it so +that file is included in the tarball when it's packed. Omitting the field +will make it default to ["*"], which means it will include all files.

+

Some special files and directories are also included or excluded regardless +of whether they exist in the files array (see below).

+

You can also provide a .npmignore file in the root of your package or in +subdirectories, which will keep files from being included. At the root of +your package it will not override the "files" field, but in subdirectories +it will. The .npmignore file works just like a .gitignore. If there is +a .gitignore file, and .npmignore is missing, .gitignore's contents +will be used instead.

+

Certain files are always included, regardless of settings:

+
    +
  • package.json
  • +
  • README
  • +
  • LICENSE / LICENCE
  • +
  • The file in the "main" field
  • +
  • The file(s) in the "bin" field
  • +
+

README & LICENSE can have any case and extension.

+

Some files are always ignored by default:

+
    +
  • *.orig
  • +
  • .*.swp
  • +
  • .DS_Store
  • +
  • ._*
  • +
  • .git
  • +
  • .hg
  • +
  • .lock-wscript
  • +
  • .npmrc
  • +
  • .svn
  • +
  • .wafpickle-N
  • +
  • CVS
  • +
  • config.gypi
  • +
  • node_modules
  • +
  • npm-debug.log
  • +
  • package-lock.json (use +npm-shrinkwrap.json +if you wish it to be published)
  • +
  • pnpm-lock.yaml
  • +
  • yarn.lock
  • +
+

Most of these ignored files can be included specifically if included in +the files globs. Exceptions to this are:

+
    +
  • .git
  • +
  • .npmrc
  • +
  • node_modules
  • +
  • package-lock.json
  • +
  • pnpm-lock.yaml
  • +
  • yarn.lock
  • +
+

These can not be included.

+

exports

+

The "exports" provides a modern alternative to "main" allowing multiple entry points to be defined, conditional entry resolution support between environments, and preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to clearly define the public interface for their package. For more details see the node.js documentation on package entry points

+

main

+

The main field is a module ID that is the primary entry point to your +program. That is, if your package is named foo, and a user installs it, +and then does require("foo"), then your main module's exports object will +be returned.

+

This should be a module relative to the root of your package folder.

+

For most modules, it makes the most sense to have a main script and often +not much else.

+

If main is not set, it defaults to index.js in the package's root folder.

+

browser

+

If your module is meant to be used client-side the browser field should be +used instead of the main field. This is helpful to hint users that it might +rely on primitives that aren't available in Node.js modules. (e.g. +window)

+

bin

+

A lot of packages have one or more executable files that they'd like to +install into the PATH. npm makes this pretty easy (in fact, it uses this +feature to install the "npm" executable.)

+

To use this, supply a bin field in your package.json which is a map of +command name to local file name. When this package is installed globally, +that file will be either linked inside the global bins directory or +a cmd (Windows Command File) will be created which executes the specified +file in the bin field, so it is available to run by name or name.cmd (on +Windows PowerShell). When this package is installed as a dependency in another +package, the file will be linked where it will be available to that package +either directly by npm exec or by name in other scripts when invoking them +via npm run-script.

+

For example, myapp could have this:

+
{
+  "bin": {
+    "myapp": "bin/cli.js"
+  }
+}
+
+

So, when you install myapp, in case of unix-like OS it'll create a symlink +from the cli.js script to /usr/local/bin/myapp and in case of windows it +will create a cmd file usually at C:\Users\{Username}\AppData\Roaming\npm\myapp.cmd +which runs the cli.js script.

+

If you have a single executable, and its name should be the name of the +package, then you can just supply it as a string. For example:

+
{
+  "name": "my-program",
+  "version": "1.2.5",
+  "bin": "path/to/program"
+}
+
+

would be the same as this:

+
{
+  "name": "my-program",
+  "version": "1.2.5",
+  "bin": {
+    "my-program": "path/to/program"
+  }
+}
+
+

Please make sure that your file(s) referenced in bin starts with +#!/usr/bin/env node, otherwise the scripts are started without the node +executable!

+

Note that you can also set the executable files using directories.bin.

+

See folders for more info on +executables.

+

man

+

Specify either a single file or an array of filenames to put in place for +the man program to find.

+

If only a single file is provided, then it's installed such that it is the +result from man <pkgname>, regardless of its actual filename. For +example:

+
{
+  "name": "foo",
+  "version": "1.2.3",
+  "description": "A packaged foo fooer for fooing foos",
+  "main": "foo.js",
+  "man": "./man/doc.1"
+}
+
+

would link the ./man/doc.1 file in such that it is the target for man foo

+

If the filename doesn't start with the package name, then it's prefixed. +So, this:

+
{
+  "name": "foo",
+  "version": "1.2.3",
+  "description": "A packaged foo fooer for fooing foos",
+  "main": "foo.js",
+  "man": [
+    "./man/foo.1",
+    "./man/bar.1"
+  ]
+}
+
+

will create files to do man foo and man foo-bar.

+

Man files must end with a number, and optionally a .gz suffix if they are +compressed. The number dictates which man section the file is installed +into.

+
{
+  "name": "foo",
+  "version": "1.2.3",
+  "description": "A packaged foo fooer for fooing foos",
+  "main": "foo.js",
+  "man": [
+    "./man/foo.1",
+    "./man/foo.2"
+  ]
+}
+
+

will create entries for man foo and man 2 foo

+

directories

+

The CommonJS Packages spec +details a few ways that you can indicate the structure of your package +using a directories object. If you look at npm's +package.json, you'll see that it +has directories for doc, lib, and man.

+

In the future, this information may be used in other creative ways.

+

directories.bin

+

If you specify a bin directory in directories.bin, all the files in +that folder will be added.

+

Because of the way the bin directive works, specifying both a bin path +and setting directories.bin is an error. If you want to specify +individual files, use bin, and for all the files in an existing bin +directory, use directories.bin.

+

directories.man

+

A folder that is full of man pages. Sugar to generate a "man" array by +walking the folder.

+

repository

+

Specify the place where your code lives. This is helpful for people who +want to contribute. If the git repo is on GitHub, then the npm repo +command will be able to find you.

+

Do it like this:

+
{
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/npm/cli.git"
+  }
+}
+
+

The URL should be a publicly available (perhaps read-only) URL that can be +handed directly to a VCS program without any modification. It should not +be a URL to an html project page that you put in your browser. It's for +computers.

+

For GitHub, GitHub gist, Bitbucket, or GitLab repositories you can use the +same shortcut syntax you use for npm install:

+
{
+  "repository": "npm/npm",
+
+  "repository": "github:user/repo",
+
+  "repository": "gist:11081aaa281",
+
+  "repository": "bitbucket:user/repo",
+
+  "repository": "gitlab:user/repo"
+}
+
+

If the package.json for your package is not in the root directory (for +example if it is part of a monorepo), you can specify the directory in +which it lives:

+
{
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/npm/cli.git",
+    "directory": "workspaces/libnpmpublish"
+  }
+}
+
+

scripts

+

The "scripts" property is a dictionary containing script commands that are +run at various times in the lifecycle of your package. The key is the +lifecycle event, and the value is the command to run at that point.

+

See scripts to find out more about writing package +scripts.

+

config

+

A "config" object can be used to set configuration parameters used in +package scripts that persist across upgrades. For instance, if a package +had the following:

+
{
+  "name": "foo",
+  "config": {
+    "port": "8080"
+  }
+}
+
+

It could also have a "start" command that referenced the +npm_package_config_port environment variable.

+

dependencies

+

Dependencies are specified in a simple object that maps a package name to a +version range. The version range is a string which has one or more +space-separated descriptors. Dependencies can also be identified with a +tarball or git URL.

+

Please do not put test harnesses or transpilers or other "development" +time tools in your dependencies object. See devDependencies, below.

+

See semver for more details about specifying version ranges.

+
    +
  • version Must match version exactly
  • +
  • >version Must be greater than version
  • +
  • >=version etc
  • +
  • <version
  • +
  • <=version
  • +
  • ~version "Approximately equivalent to version" See +semver
  • +
  • ^version "Compatible with version" See semver
  • +
  • 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
  • +
  • http://... See 'URLs as Dependencies' below
  • +
  • * Matches any version
  • +
  • "" (just an empty string) Same as *
  • +
  • version1 - version2 Same as >=version1 <=version2.
  • +
  • range1 || range2 Passes if either range1 or range2 are satisfied.
  • +
  • git... See 'Git URLs as Dependencies' below
  • +
  • user/repo See 'GitHub URLs' below
  • +
  • tag A specific version tagged and published as tag See npm dist-tag
  • +
  • path/path/path See Local Paths below
  • +
  • npm:@scope/pkg@version Custom alias for a package See package-spec
  • +
+

For example, these are all valid:

+
{
+  "dependencies": {
+    "foo": "1.0.0 - 2.9999.9999",
+    "bar": ">=1.0.2 <2.1.2",
+    "baz": ">1.0.2 <=2.3.4",
+    "boo": "2.0.1",
+    "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
+    "asd": "http://asdf.com/asdf.tar.gz",
+    "til": "~1.2",
+    "elf": "~1.2.3",
+    "two": "2.x",
+    "thr": "3.3.x",
+    "lat": "latest",
+    "dyl": "file:../dyl",
+    "kpg": "npm:pkg@1.0.0"
+  }
+}
+
+

URLs as Dependencies

+

You may specify a tarball URL in place of a version range.

+

This tarball will be downloaded and installed locally to your package at +install time.

+

Git URLs as Dependencies

+

Git URLs are of the form:

+
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
+
+

<protocol> is one of git, git+ssh, git+http, git+https, or +git+file.

+

If #<commit-ish> is provided, it will be used to clone exactly that +commit. If the commit-ish has the format #semver:<semver>, <semver> can +be any valid semver range or exact version, and npm will look for any tags +or refs matching that range in the remote repository, much as it would for +a registry dependency. If neither #<commit-ish> or #semver:<semver> is +specified, then the default branch is used.

+

Examples:

+
git+ssh://git@github.com:npm/cli.git#v1.0.27
+git+ssh://git@github.com:npm/cli#semver:^5.0
+git+https://isaacs@github.com/npm/cli.git
+git://github.com/npm/cli.git#v1.0.27
+
+

When installing from a git repository, the presence of certain fields in the +package.json will cause npm to believe it needs to perform a build. To do so +your repository will be cloned into a temporary directory, all of its deps +installed, relevant scripts run, and the resulting directory packed and +installed.

+

This flow will occur if your git dependency uses workspaces, or if any of the +following scripts are present:

+
    +
  • build
  • +
  • prepare
  • +
  • prepack
  • +
  • preinstall
  • +
  • install
  • +
  • postinstall
  • +
+

If your git repository includes pre-built artifacts, you will likely want to +make sure that none of the above scripts are defined, or your dependency +will be rebuilt for every installation.

+

GitHub URLs

+

As of version 1.1.65, you can refer to GitHub URLs as just "foo": +"user/foo-project". Just as with git URLs, a commit-ish suffix can be +included. For example:

+
{
+  "name": "foo",
+  "version": "0.0.0",
+  "dependencies": {
+    "express": "expressjs/express",
+    "mocha": "mochajs/mocha#4727d357ea",
+    "module": "user/repo#feature\/branch"
+  }
+}
+
+

Local Paths

+

As of version 2.0.0 you can provide a path to a local directory that +contains a package. Local paths can be saved using npm install -S or npm install --save, using any of these forms:

+
../foo/bar
+~/foo/bar
+./foo/bar
+/foo/bar
+
+

in which case they will be normalized to a relative path and added to your +package.json. For example:

+
{
+  "name": "baz",
+  "dependencies": {
+    "bar": "file:../foo/bar"
+  }
+}
+
+

This feature is helpful for local offline development and creating tests +that require npm installing where you don't want to hit an external server, +but should not be used when publishing your package to the public registry.

+

note: Packages linked by local path will not have their own +dependencies installed when npm install is ran in this case. You must +run npm install from inside the local path itself.

+

devDependencies

+

If someone is planning on downloading and using your module in their +program, then they probably don't want or need to download and build the +external test or documentation framework that you use.

+

In this case, it's best to map these additional items in a +devDependencies object.

+

These things will be installed when doing npm link or npm install from +the root of a package, and can be managed like any other npm configuration +param. See config for more on the topic.

+

For build steps that are not platform-specific, such as compiling +CoffeeScript or other languages to JavaScript, use the prepare script to +do this, and make the required package a devDependency.

+

For example:

+
{
+  "name": "ethopia-waza",
+  "description": "a delightfully fruity coffee varietal",
+  "version": "1.2.3",
+  "devDependencies": {
+    "coffee-script": "~1.6.3"
+  },
+  "scripts": {
+    "prepare": "coffee -o lib/ -c src/waza.coffee"
+  },
+  "main": "lib/waza.js"
+}
+
+

The prepare script will be run before publishing, so that users can +consume the functionality without requiring them to compile it themselves. +In dev mode (ie, locally running npm install), it'll run this script as +well, so that you can test it easily.

+

peerDependencies

+

In some cases, you want to express the compatibility of your package with a +host tool or library, while not necessarily doing a require of this host. +This is usually referred to as a plugin. Notably, your module may be +exposing a specific interface, expected and specified by the host +documentation.

+

For example:

+
{
+  "name": "tea-latte",
+  "version": "1.3.5",
+  "peerDependencies": {
+    "tea": "2.x"
+  }
+}
+
+

This ensures your package tea-latte can be installed along with the +second major version of the host package tea only. npm install tea-latte could possibly yield the following dependency graph:

+
├── tea-latte@1.3.5
+└── tea@2.2.0
+
+

In npm versions 3 through 6, peerDependencies were not automatically +installed, and would raise a warning if an invalid version of the peer +dependency was found in the tree. As of npm v7, peerDependencies are +installed by default.

+

Trying to install another plugin with a conflicting requirement may cause +an error if the tree cannot be resolved correctly. For this reason, make +sure your plugin requirement is as broad as possible, and not to lock it +down to specific patch versions.

+

Assuming the host complies with semver, only changes +in the host package's major version will break your plugin. Thus, if you've +worked with every 1.x version of the host package, use "^1.0" or "1.x" +to express this. If you depend on features introduced in 1.5.2, use +"^1.5.2".

+

peerDependenciesMeta

+

The peerDependenciesMeta field serves to provide npm more information on how +your peer dependencies are to be used. Specifically, it allows peer +dependencies to be marked as optional. Npm will not automatically install +optional peer dependencies. This allows you to +integrate and interact with a variety of host packages without requiring +all of them to be installed.

+

For example:

+
{
+  "name": "tea-latte",
+  "version": "1.3.5",
+  "peerDependencies": {
+    "tea": "2.x",
+    "soy-milk": "1.2"
+  },
+  "peerDependenciesMeta": {
+    "soy-milk": {
+      "optional": true
+    }
+  }
+}
+
+

bundleDependencies

+

This defines an array of package names that will be bundled when publishing +the package.

+

In cases where you need to preserve npm packages locally or have them +available through a single file download, you can bundle the packages in a +tarball file by specifying the package names in the bundleDependencies +array and executing npm pack.

+

For example:

+

If we define a package.json like this:

+
{
+  "name": "awesome-web-framework",
+  "version": "1.0.0",
+  "bundleDependencies": [
+    "renderized",
+    "super-streams"
+  ]
+}
+
+

we can obtain awesome-web-framework-1.0.0.tgz file by running npm pack. +This file contains the dependencies renderized and super-streams which +can be installed in a new project by executing npm install awesome-web-framework-1.0.0.tgz. Note that the package names do not +include any versions, as that information is specified in dependencies.

+

If this is spelled "bundledDependencies", then that is also honored.

+

Alternatively, "bundleDependencies" can be defined as a boolean value. A +value of true will bundle all dependencies, a value of false will bundle +none.

+

optionalDependencies

+

If a dependency can be used, but you would like npm to proceed if it cannot +be found or fails to install, then you may put it in the +optionalDependencies object. This is a map of package name to version or +URL, just like the dependencies object. The difference is that build +failures do not cause installation to fail. Running npm install --omit=optional will prevent these dependencies from being installed.

+

It is still your program's responsibility to handle the lack of the +dependency. For example, something like this:

+
try {
+  var foo = require('foo')
+  var fooVersion = require('foo/package.json').version
+} catch (er) {
+  foo = null
+}
+if ( notGoodFooVersion(fooVersion) ) {
+  foo = null
+}
+
+// .. then later in your program ..
+
+if (foo) {
+  foo.doFooThings()
+}
+
+

Entries in optionalDependencies will override entries of the same name in +dependencies, so it's usually best to only put in one place.

+

overrides

+

If you need to make specific changes to dependencies of your dependencies, for +example replacing the version of a dependency with a known security issue, +replacing an existing dependency with a fork, or making sure that the same +version of a package is used everywhere, then you may add an override.

+

Overrides provide a way to replace a package in your dependency tree with +another version, or another package entirely. These changes can be scoped as +specific or as vague as desired.

+

Overrides are only considered in the root package.json file for a project. +Overrides in installed dependencies (including +workspaces) are not considered in dependency tree +resolution. Published packages may dictate their resolutions by pinning +dependencies or using an +npm-shrinkwrap.json file.

+

To make sure the package foo is always installed as version 1.0.0 no matter +what version your dependencies rely on:

+
{
+  "overrides": {
+    "foo": "1.0.0"
+  }
+}
+
+

The above is a short hand notation, the full object form can be used to allow +overriding a package itself as well as a child of the package. This will cause +foo to always be 1.0.0 while also making bar at any depth beyond foo +also 1.0.0:

+
{
+  "overrides": {
+    "foo": {
+      ".": "1.0.0",
+      "bar": "1.0.0"
+    }
+  }
+}
+
+

To only override foo to be 1.0.0 when it's a child (or grandchild, or great +grandchild, etc) of the package bar:

+
{
+  "overrides": {
+    "bar": {
+      "foo": "1.0.0"
+    }
+  }
+}
+
+

Keys can be nested to any arbitrary length. To override foo only when it's a +child of bar and only when bar is a child of baz:

+
{
+  "overrides": {
+    "baz": {
+      "bar": {
+        "foo": "1.0.0"
+      }
+    }
+  }
+}
+
+

The key of an override can also include a version, or range of versions. +To override foo to 1.0.0, but only when it's a child of bar@2.0.0:

+
{
+  "overrides": {
+    "bar@2.0.0": {
+      "foo": "1.0.0"
+    }
+  }
+}
+
+

You may not set an override for a package that you directly depend on unless +both the dependency and the override itself share the exact same spec. To make +this limitation easier to deal with, overrides may also be defined as a +reference to a spec for a direct dependency by prefixing the name of the +package you wish the version to match with a $.

+
{
+  "dependencies": {
+    "foo": "^1.0.0"
+  },
+  "overrides": {
+    // BAD, will throw an EOVERRIDE error
+    // "foo": "^2.0.0"
+    // GOOD, specs match so override is allowed
+    // "foo": "^1.0.0"
+    // BEST, the override is defined as a reference to the dependency
+    "foo": "$foo",
+    // the referenced package does not need to match the overridden one
+    "bar": "$foo"
+  }
+}
+
+

engines

+

You can specify the version of node that your stuff works on:

+
{
+  "engines": {
+    "node": ">=0.10.3 <15"
+  }
+}
+
+

And, like with dependencies, if you don't specify the version (or if you +specify "*" as the version), then any version of node will do.

+

You can also use the "engines" field to specify which versions of npm are +capable of properly installing your program. For example:

+
{
+  "engines": {
+    "npm": "~1.0.20"
+  }
+}
+
+

Unless the user has set the +engine-strict config flag, this field is +advisory only and will only produce warnings when your package is installed as a +dependency.

+

os

+

You can specify which operating systems your +module will run on:

+
{
+  "os": [
+    "darwin",
+    "linux"
+  ]
+}
+
+

You can also block instead of allowing operating systems, just prepend the +blocked os with a '!':

+
{
+  "os": [
+    "!win32"
+  ]
+}
+
+

The host operating system is determined by process.platform

+

It is allowed to both block and allow an item, although there isn't any +good reason to do this.

+

cpu

+

If your code only runs on certain cpu architectures, +you can specify which ones.

+
{
+  "cpu": [
+    "x64",
+    "ia32"
+  ]
+}
+
+

Like the os option, you can also block architectures:

+
{
+  "cpu": [
+    "!arm",
+    "!mips"
+  ]
+}
+
+

The host architecture is determined by process.arch

+

devEngines

+

The devEngines field aids engineers working on a codebase to all be using the same tooling.

+

You can specify a devEngines property in your package.json which will run before install, ci, and run commands.

+
+

Note: engines and devEngines differ in object shape. They also function very differently. engines is designed to alert the user when a dependency uses a differening npm or node version that the project it's being used in, whereas devEngines is used to alert people interacting with the source code of a project.

+
+

The supported keys under the devEngines property are cpu, os, libc, runtime, and packageManager. Each property can be an object or an array of objects. Objects must contain name, and optionally can specify version, and onFail. onFail can be warn, error, or ignore, and if left undefined is of the same value as error. npm will assume that you're running with node. +Here's an example of a project that will fail if the environment is not node and npm. If you set runtime.name or packageManager.name to any other string, it will fail within the npm CLI.

+
{
+  "devEngines": {
+    "runtime": {
+      "name": "node",
+      "onFail": "error"
+    },
+    "packageManager": {
+      "name": "npm",
+      "onFail": "error"
+    }
+  }
+}
+
+

private

+

If you set "private": true in your package.json, then npm will refuse to +publish it.

+

This is a way to prevent accidental publication of private repositories. +If you would like to ensure that a given package is only ever published to +a specific registry (for example, an internal registry), then use the +publishConfig dictionary described below to override the registry +config param at publish-time.

+

publishConfig

+

This is a set of config values that will be used at publish-time. It's +especially handy if you want to set the tag, registry or access, so that +you can ensure that a given package is not tagged with "latest", published +to the global public registry or that a scoped module is private by +default.

+

See config to see the list of config options that +can be overridden.

+

workspaces

+

The optional workspaces field is an array of file patterns that describes +locations within the local file system that the install client should look +up to find each workspace that needs to be +symlinked to the top level node_modules folder.

+

It can describe either the direct paths of the folders to be used as +workspaces or it can define globs that will resolve to these same folders.

+

In the following example, all folders located inside the folder +./packages will be treated as workspaces as long as they have valid +package.json files inside them:

+
{
+  "name": "workspace-example",
+  "workspaces": [
+    "./packages/*"
+  ]
+}
+
+

See workspaces for more examples.

+

DEFAULT VALUES

+

npm will default some values based on package contents.

+
    +
  • +

    "scripts": {"start": "node server.js"}

    +

    If there is a server.js file in the root of your package, then npm will +default the start command to node server.js.

    +
  • +
  • +

    "scripts":{"install": "node-gyp rebuild"}

    +

    If there is a binding.gyp file in the root of your package and you have +not defined an install or preinstall script, npm will default the +install command to compile using node-gyp.

    +
  • +
  • +

    "contributors": [...]

    +

    If there is an AUTHORS file in the root of your package, npm will treat +each line as a Name <email> (url) format, where email and url are +optional. Lines which start with a # or are blank, will be ignored.

    +
  • +
+

SEE ALSO

+
+ + +
+ + + + \ No newline at end of file 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 f03832d0f9fd60..d05b2f70f74732 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
-

npm-shrinkwrap.json

+

+ npm-shrinkwrap.json + @10.9.4 +

A publishable lockfile
diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index c33c803690c56e..5817f933f072bb 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
-

npmrc

+

+ npmrc + @10.9.4 +

The npm config files
@@ -163,7 +171,7 @@

Files

All npm config files are an ini-formatted list of key = value parameters. Environment variables can be replaced using ${VARIABLE_NAME}. For example:

-
prefix = ${HOME}/.npm-packages
+
cache = ${HOME}/.npm-packages
 

Each of these files is loaded, and config options are resolved in priority order. For example, a setting in the userconfig file would override the @@ -230,10 +238,13 @@

@myorg:registry=https://somewhere-else.com/myorg @another:registry=https://somewhere-else.com/another //registry.npmjs.org/:_authToken=MYTOKEN + ; would apply to both @myorg and @another -; //somewhere-else.com/:_authToken=MYTOKEN +//somewhere-else.com/:_authToken=MYTOKEN + ; would apply only to @myorg //somewhere-else.com/myorg/:_authToken=MYTOKEN1 + ; would apply only to @another //somewhere-else.com/another/:_authToken=MYTOKEN2
diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index becaa89251f049..8f19faa98668d9 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,13 +141,16 @@
-

package.json

+

+ package.json + @10.9.4 +

Specifics of npm's package.json handling

Table of contents

- +

Description

@@ -307,21 +315,27 @@

people fields: author, contributorsnpm also sets a top-level "maintainers" field with your npm user info.

funding

You can specify an object containing a URL that provides up-to-date -information about ways to help fund development of your package, or a -string URL, or an array of these:

+information about ways to help fund development of your package, a +string URL, or an array of objects and string URLs:

{
   "funding": {
     "type" : "individual",
     "url" : "http://example.com/donate"
-  },
-
+  }
+}
+
+
{
   "funding": {
     "type" : "patreon",
     "url" : "https://www.patreon.com/my-account"
-  },
-
-  "funding": "http://example.com/donate",
-
+  }
+}
+
+
{
+  "funding": "http://example.com/donate"
+}
+
+
{
   "funding": [
     {
       "type" : "individual",
@@ -337,7 +351,7 @@ 

funding

Users can use the npm fund subcommand to list the funding URLs of all dependencies of their project, direct and indirect. A shortcut to visit -each funding url is also available when providing the project name such as: +each funding URL is also available when providing the project name such as: npm fund <projectname> (when there are multiple URLs, the first one will be visited)

files

@@ -397,6 +411,8 @@

files

  • yarn.lock
  • These can not be included.

    +

    exports

    +

    The "exports" provides a modern alternative to "main" allowing multiple entry points to be defined, conditional entry resolution support between environments, and preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to clearly define the public interface for their package. For more details see the node.js documentation on package entry points

    main

    The main field is a module ID that is the primary entry point to your program. That is, if your package is named foo, and a user installs it, @@ -427,7 +443,7 @@

    bin

    For example, myapp could have this:

    {
       "bin": {
    -    "myapp": "./cli.js"
    +    "myapp": "bin/cli.js"
       }
     }
     
    @@ -440,7 +456,7 @@

    bin

    {
       "name": "my-program",
       "version": "1.2.5",
    -  "bin": "./path/to/program"
    +  "bin": "path/to/program"
     }
     

    would be the same as this:

    @@ -448,7 +464,7 @@

    bin

    "name": "my-program", "version": "1.2.5", "bin": { - "my-program": "./path/to/program" + "my-program": "path/to/program" } } @@ -521,13 +537,13 @@

    directories.man

    walking the folder.

    repository

    Specify the place where your code lives. This is helpful for people who -want to contribute. If the git repo is on GitHub, then the npm docs +want to contribute. If the git repo is on GitHub, then the npm repo command will be able to find you.

    Do it like this:

    {
       "repository": {
         "type": "git",
    -    "url": "https://github.com/npm/cli.git"
    +    "url": "git+https://github.com/npm/cli.git"
       }
     }
     
    @@ -555,8 +571,8 @@

    repository

    {
       "repository": {
         "type": "git",
    -    "url": "https://github.com/facebook/react.git",
    -    "directory": "packages/react-dom"
    +    "url": "git+https://github.com/npm/cli.git",
    +    "directory": "workspaces/libnpmpublish"
       }
     }
     
    @@ -606,6 +622,7 @@

    dependencies

  • user/repo See 'GitHub URLs' below
  • tag A specific version tagged and published as tag See npm dist-tag
  • path/path/path See Local Paths below
  • +
  • npm:@scope/pkg@version Custom alias for a package See package-spec
  • For example, these are all valid:

    {
    @@ -621,7 +638,8 @@ 

    dependencies

    "two": "2.x", "thr": "3.3.x", "lat": "latest", - "dyl": "file:../dyl" + "dyl": "file:../dyl", + "kpg": "npm:pkg@1.0.0" } }
    @@ -766,11 +784,12 @@

    peerDependencies

    to express this. If you depend on features introduced in 1.5.2, use "^1.5.2".

    peerDependenciesMeta

    -

    When a user installs your package, npm will emit warnings if packages -specified in peerDependencies are not already installed. The -peerDependenciesMeta field serves to provide npm more information on how +

    The peerDependenciesMeta field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer -dependencies to be marked as optional.

    +dependencies to be marked as optional. Npm will not automatically install +optional peer dependencies. This allows you to +integrate and interact with a variety of host packages without requiring +all of them to be installed.

    For example:

    {
       "name": "tea-latte",
    @@ -786,10 +805,6 @@ 

    peerDependenciesMeta

    } }
    -

    Marking a peer dependency as optional ensures npm will not emit a warning -if the soy-milk package is not installed on the host. This allows you to -integrate and interact with a variety of host packages without requiring -all of them to be installed.

    bundleDependencies

    This defines an array of package names that will be bundled when publishing the package.

    @@ -850,6 +865,12 @@

    overrides

    Overrides provide a way to replace a package in your dependency tree with another version, or another package entirely. These changes can be scoped as specific or as vague as desired.

    +

    Overrides are only considered in the root package.json file for a project. +Overrides in installed dependencies (including +workspaces) are not considered in dependency tree +resolution. Published packages may dictate their resolutions by pinning +dependencies or using an +npm-shrinkwrap.json file.

    To make sure the package foo is always installed as version 1.0.0 no matter what version your dependencies rely on:

    {
    @@ -986,6 +1007,27 @@ 

    cpu

    }

    The host architecture is determined by process.arch

    +

    devEngines

    +

    The devEngines field aids engineers working on a codebase to all be using the same tooling.

    +

    You can specify a devEngines property in your package.json which will run before install, ci, and run commands.

    +
    +

    Note: engines and devEngines differ in object shape. They also function very differently. engines is designed to alert the user when a dependency uses a differening npm or node version that the project it's being used in, whereas devEngines is used to alert people interacting with the source code of a project.

    +
    +

    The supported keys under the devEngines property are cpu, os, libc, runtime, and packageManager. Each property can be an object or an array of objects. Objects must contain name, and optionally can specify version, and onFail. onFail can be warn, error, or ignore, and if left undefined is of the same value as error. npm will assume that you're running with node. +Here's an example of a project that will fail if the environment is not node and npm. If you set runtime.name or packageManager.name to any other string, it will fail within the npm CLI.

    +
    {
    +  "devEngines": {
    +    "runtime": {
    +      "name": "node",
    +      "onFail": "error"
    +    },
    +    "packageManager": {
    +      "name": "npm",
    +      "onFail": "error"
    +    }
    +  }
    +}
    +

    private

    If you set "private": true in your package.json, then npm will refuse to publish it.

    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 11e4ab79900e5a..1d9a3522fdb618 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
    -

    package-lock.json

    +

    + package-lock.json + @10.9.4 +

    A manifestation of the manifest
    @@ -176,6 +184,7 @@

    Table of contents

    files, and allowing for significant performance improvements.

    +

    When npm creates or updates package-lock.json, it will infer line endings and indentation from package.json so that the formatting of both files matches.

    package-lock.json vs npm-shrinkwrap.json

    Both of these files have the same format, and perform similar functions in the root of a project.

    diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 2a3ead1b706956..5dc62e5b9b15c9 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
    -

    config

    +

    + config + @10.9.4 +

    More than you probably want to know about npm configuration
    @@ -1023,7 +1031,7 @@

    progress

  • Type: Boolean
  • When set to true, npm will display a progress bar during time intensive -operations, if process.stderr is a TTY.

    +operations, if process.stderr and process.stdout are a TTY.

    Set to false to suppress the progress bar.

    provenance

      @@ -1265,10 +1273,11 @@

      tag

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

    -

    Also the tag that is added to the package@version specified by the npm tag -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.

    +

    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"
    • diff --git a/deps/npm/docs/output/using-npm/dependency-selectors.html b/deps/npm/docs/output/using-npm/dependency-selectors.html index 27bba15c1a2135..4ff77e2bfc5077 100644 --- a/deps/npm/docs/output/using-npm/dependency-selectors.html +++ b/deps/npm/docs/output/using-npm/dependency-selectors.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      Dependency Selector Syntax & Querying

      +

      + Dependency Selector Syntax & Querying + @10.9.4 +

      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 cde04b8fb38969..3093e46992df47 100644 --- a/deps/npm/docs/output/using-npm/developers.html +++ b/deps/npm/docs/output/using-npm/developers.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      developers

      +

      + developers + @10.9.4 +

      Developer Guide
      diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index 0a874fd8e18939..39e1f084e01fe6 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      Logging

      +

      + Logging + @10.9.4 +

      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 0c2b69eb598711..556f0dfbd72f3c 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      orgs

      +

      + orgs + @10.9.4 +

      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 ee4f6ff55e7d85..e650ba236489bb 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      package-spec

      +

      + package-spec + @10.9.4 +

      Package name specifier
      diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 8ff40109fe0a64..4ca762b771f953 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      registry

      +

      + registry + @10.9.4 +

      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 e54187122e1f71..eb3b91543ba832 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      removal

      +

      + removal + @10.9.4 +

      Cleaning the Slate
      @@ -149,9 +157,7 @@

      Table of contents

      So sad to see you go.

      sudo npm uninstall npm -g
       
      -

      Or, if that fails, get the npm source code, and do:

      -
      sudo make uninstall
      -
      +

      Or, if that fails, please proceed to more severe uninstalling methods.

      More Severe Uninstalling

      Usually, the above instructions are sufficient. That will remove npm, but leave behind anything you've installed.

      diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index d91612e40a1e45..9e5d95121fc803 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      scope

      +

      + scope + @10.9.4 +

      Scoped packages
      diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index 91d558e1163b5c..34679682f668e3 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      scripts

      +

      + scripts + @10.9.4 +

      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 39a77dfeb583fe..2b69dbef11476d 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -113,6 +113,11 @@ line-height: 1; } +header.title .version { + font-size: 0.8em; + color: #666666; +} + footer#edit { border-top: solid 1px #e1e4e8; margin: 3em 0 4em 0; @@ -136,7 +141,10 @@
      -

      workspaces

      +

      + workspaces + @10.9.4 +

      Working with workspaces
      diff --git a/deps/npm/lib/arborist-cmd.js b/deps/npm/lib/arborist-cmd.js index 42699ece364ad1..f0167887b06996 100644 --- a/deps/npm/lib/arborist-cmd.js +++ b/deps/npm/lib/arborist-cmd.js @@ -1,10 +1,9 @@ -const log = require('./utils/log-shim.js') +const { log } = require('proc-log') +const BaseCommand = require('./base-cmd.js') // This is the base for all commands whose execWorkspaces just gets // a list of workspace names and passes it on to new Arborist() to // be able to run a filtered Arborist.reify() at some point. - -const BaseCommand = require('./base-command.js') class ArboristCmd extends BaseCommand { get isArboristCmd () { return true @@ -19,6 +18,7 @@ class ArboristCmd extends BaseCommand { static workspaces = true static ignoreImplicitWorkspace = false + static checkDevEngines = true constructor (npm) { super(npm) diff --git a/deps/npm/lib/base-cmd.js b/deps/npm/lib/base-cmd.js new file mode 100644 index 00000000000000..941ffefad2ef4e --- /dev/null +++ b/deps/npm/lib/base-cmd.js @@ -0,0 +1,215 @@ +const { log } = require('proc-log') + +class BaseCommand { + // these defaults can be overridden by individual commands + static workspaces = false + static ignoreImplicitWorkspace = true + static checkDevEngines = false + + // these should always be overridden by individual commands + static name = null + static description = null + static params = null + + // this is a static so that we can read from it without instantiating a command + // which would require loading the config + static get describeUsage () { + const { definitions } = require('@npmcli/config/lib/definitions') + const { aliases: cmdAliases } = require('./utils/cmd-list') + const seenExclusive = new Set() + const wrapWidth = 80 + const { description, usage = [''], name, params } = this + + const fullUsage = [ + `${description}`, + '', + 'Usage:', + ...usage.map(u => `npm ${name} ${u}`.trim()), + ] + + if (params) { + let results = '' + let line = '' + for (const param of params) { + /* istanbul ignore next */ + if (seenExclusive.has(param)) { + continue + } + const { exclusive } = definitions[param] + let paramUsage = `${definitions[param].usage}` + if (exclusive) { + const exclusiveParams = [paramUsage] + seenExclusive.add(param) + for (const e of exclusive) { + seenExclusive.add(e) + exclusiveParams.push(definitions[e].usage) + } + paramUsage = `${exclusiveParams.join('|')}` + } + paramUsage = `[${paramUsage}]` + if (line.length + paramUsage.length > wrapWidth) { + results = [results, line].filter(Boolean).join('\n') + line = '' + } + line = [line, paramUsage].filter(Boolean).join(' ') + } + fullUsage.push('') + fullUsage.push('Options:') + fullUsage.push([results, line].filter(Boolean).join('\n')) + } + + const aliases = Object.entries(cmdAliases).reduce((p, [k, v]) => { + return p.concat(v === name ? k : []) + }, []) + + if (aliases.length) { + const plural = aliases.length === 1 ? '' : 'es' + fullUsage.push('') + fullUsage.push(`alias${plural}: ${aliases.join(', ')}`) + } + + fullUsage.push('') + fullUsage.push(`Run "npm help ${name}" for more info`) + + return fullUsage.join('\n') + } + + constructor (npm) { + this.npm = npm + + const { config } = this.npm + + if (!this.constructor.skipConfigValidation) { + config.validate() + } + + if (config.get('workspaces') === false && config.get('workspace').length) { + throw new Error('Can not use --no-workspaces and --workspace at the same time') + } + } + + get name () { + return this.constructor.name + } + + get description () { + return this.constructor.description + } + + get params () { + return this.constructor.params + } + + get usage () { + return this.constructor.describeUsage + } + + usageError (prefix = '') { + if (prefix) { + prefix += '\n\n' + } + return Object.assign(new Error(`\n${prefix}${this.usage}`), { + code: 'EUSAGE', + }) + } + + // Compare the number of entries with what was expected + checkExpected (entries) { + if (!this.npm.config.isDefault('expect-results')) { + const expected = this.npm.config.get('expect-results') + if (!!entries !== !!expected) { + log.warn(this.name, `Expected ${expected ? '' : 'no '}results, got ${entries}`) + process.exitCode = 1 + } + } else if (!this.npm.config.isDefault('expect-result-count')) { + const expected = this.npm.config.get('expect-result-count') + if (expected !== entries) { + /* eslint-disable-next-line max-len */ + log.warn(this.name, `Expected ${expected} result${expected === 1 ? '' : 's'}, got ${entries}`) + process.exitCode = 1 + } + } + } + + // Checks the devEngines entry in the package.json at this.localPrefix + async checkDevEngines () { + const force = this.npm.flatOptions.force + + const { devEngines } = await require('@npmcli/package-json') + .normalize(this.npm.config.localPrefix) + .then(p => p.content) + .catch(() => ({})) + + if (typeof devEngines === 'undefined') { + return + } + + const { checkDevEngines, currentEnv } = require('npm-install-checks') + const current = currentEnv.devEngines({ + nodeVersion: this.npm.nodeVersion, + npmVersion: this.npm.version, + }) + + const failures = checkDevEngines(devEngines, current) + const warnings = failures.filter(f => f.isWarn) + const errors = failures.filter(f => f.isError) + + const genMsg = (failure, i = 0) => { + return [...new Set([ + // eslint-disable-next-line + i === 0 ? 'The developer of this package has specified the following through devEngines' : '', + `${failure.message}`, + `${failure.errors.map(e => e.message).join('\n')}`, + ])].filter(v => v).join('\n') + } + + [...warnings, ...(force ? errors : [])].forEach((failure, i) => { + const message = genMsg(failure, i) + log.warn('EBADDEVENGINES', message) + log.warn('EBADDEVENGINES', { + current: failure.current, + required: failure.required, + }) + }) + + if (force) { + return + } + + if (errors.length) { + const failure = errors[0] + const message = genMsg(failure) + throw Object.assign(new Error(message), { + engine: failure.engine, + code: 'EBADDEVENGINES', + current: failure.current, + required: failure.required, + }) + } + } + + async setWorkspaces () { + const { relative } = require('node:path') + + const includeWorkspaceRoot = this.isArboristCmd + ? false + : this.npm.config.get('include-workspace-root') + + const prefixInsideCwd = relative(this.npm.localPrefix, process.cwd()).startsWith('..') + const relativeFrom = prefixInsideCwd ? this.npm.localPrefix : process.cwd() + + const filters = this.npm.config.get('workspace') + const getWorkspaces = require('./utils/get-workspaces.js') + const ws = await getWorkspaces(filters, { + path: this.npm.localPrefix, + includeWorkspaceRoot, + relativeFrom, + }) + + this.workspaces = ws + this.workspaceNames = [...ws.keys()] + this.workspacePaths = [...ws.values()] + } +} + +module.exports = BaseCommand diff --git a/deps/npm/lib/base-command.js b/deps/npm/lib/base-command.js deleted file mode 100644 index e4a7bbbec724a6..00000000000000 --- a/deps/npm/lib/base-command.js +++ /dev/null @@ -1,184 +0,0 @@ -// Base class for npm commands - -const { relative } = require('path') - -const { definitions } = require('@npmcli/config/lib/definitions') -const getWorkspaces = require('./workspaces/get-workspaces.js') -const { aliases: cmdAliases } = require('./utils/cmd-list') -const log = require('./utils/log-shim.js') - -class BaseCommand { - static workspaces = false - static ignoreImplicitWorkspace = true - - // these are all overridden by individual commands - static name = null - static description = null - static params = null - - // this is a static so that we can read from it without instantiating a command - // which would require loading the config - static get describeUsage () { - const seenExclusive = new Set() - const wrapWidth = 80 - const { description, usage = [''], name, params } = this - - const fullUsage = [ - `${description}`, - '', - 'Usage:', - ...usage.map(u => `npm ${name} ${u}`.trim()), - ] - - if (params) { - let results = '' - let line = '' - for (const param of params) { - /* istanbul ignore next */ - if (seenExclusive.has(param)) { - continue - } - const { exclusive } = definitions[param] - let paramUsage = `${definitions[param].usage}` - if (exclusive) { - const exclusiveParams = [paramUsage] - seenExclusive.add(param) - for (const e of exclusive) { - seenExclusive.add(e) - exclusiveParams.push(definitions[e].usage) - } - paramUsage = `${exclusiveParams.join('|')}` - } - paramUsage = `[${paramUsage}]` - if (line.length + paramUsage.length > wrapWidth) { - results = [results, line].filter(Boolean).join('\n') - line = '' - } - line = [line, paramUsage].filter(Boolean).join(' ') - } - fullUsage.push('') - fullUsage.push('Options:') - fullUsage.push([results, line].filter(Boolean).join('\n')) - } - - const aliases = Object.entries(cmdAliases).reduce((p, [k, v]) => { - return p.concat(v === name ? k : []) - }, []) - - if (aliases.length) { - const plural = aliases.length === 1 ? '' : 'es' - fullUsage.push('') - fullUsage.push(`alias${plural}: ${aliases.join(', ')}`) - } - - fullUsage.push('') - fullUsage.push(`Run "npm help ${name}" for more info`) - - return fullUsage.join('\n') - } - - constructor (npm) { - this.npm = npm - - const { config } = this.npm - - if (!this.constructor.skipConfigValidation) { - config.validate() - } - - if (config.get('workspaces') === false && config.get('workspace').length) { - throw new Error('Can not use --no-workspaces and --workspace at the same time') - } - } - - get name () { - return this.constructor.name - } - - get description () { - return this.constructor.description - } - - get params () { - return this.constructor.params - } - - get usage () { - return this.constructor.describeUsage - } - - usageError (prefix = '') { - if (prefix) { - prefix += '\n\n' - } - return Object.assign(new Error(`\n${prefix}${this.usage}`), { - code: 'EUSAGE', - }) - } - - async cmdExec (args) { - const { config } = this.npm - - if (config.get('usage')) { - return this.npm.output(this.usage) - } - - const hasWsConfig = config.get('workspaces') || config.get('workspace').length - // if cwd is a workspace, the default is set to [that workspace] - const implicitWs = config.get('workspace', 'default').length - - // (-ws || -w foo) && (cwd is not a workspace || command is not ignoring implicit workspaces) - if (hasWsConfig && (!implicitWs || !this.constructor.ignoreImplicitWorkspace)) { - if (this.npm.global) { - throw new Error('Workspaces not supported for global packages') - } - if (!this.constructor.workspaces) { - throw Object.assign(new Error('This command does not support workspaces.'), { - code: 'ENOWORKSPACES', - }) - } - return this.execWorkspaces(args) - } - - return this.exec(args) - } - - // Compare the number of entries with what was expected - checkExpected (entries) { - if (!this.npm.config.isDefault('expect-results')) { - const expected = this.npm.config.get('expect-results') - if (!!entries !== !!expected) { - log.warn(this.name, `Expected ${expected ? '' : 'no '}results, got ${entries}`) - process.exitCode = 1 - } - } else if (!this.npm.config.isDefault('expect-result-count')) { - const expected = this.npm.config.get('expect-result-count') - if (expected !== entries) { - /* eslint-disable-next-line max-len */ - log.warn(this.name, `Expected ${expected} result${expected === 1 ? '' : 's'}, got ${entries}`) - process.exitCode = 1 - } - } - } - - async setWorkspaces () { - const includeWorkspaceRoot = this.isArboristCmd - ? false - : this.npm.config.get('include-workspace-root') - - const prefixInsideCwd = relative(this.npm.localPrefix, process.cwd()).startsWith('..') - const relativeFrom = prefixInsideCwd ? this.npm.localPrefix : process.cwd() - - const filters = this.npm.config.get('workspace') - const ws = await getWorkspaces(filters, { - path: this.npm.localPrefix, - includeWorkspaceRoot, - relativeFrom, - }) - - this.workspaces = ws - this.workspaceNames = [...ws.keys()] - this.workspacePaths = [...ws.values()] - } -} -module.exports = BaseCommand diff --git a/deps/npm/lib/cli-entry.js b/deps/npm/lib/cli-entry.js deleted file mode 100644 index aad06e06903856..00000000000000 --- a/deps/npm/lib/cli-entry.js +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable max-len */ - -// Separated out for easier unit testing -module.exports = async (process, validateEngines) => { - // set it here so that regardless of what happens later, we don't - // leak any private CLI configs to other programs - process.title = 'npm' - - // if npm is called as "npmg" or "npm_g", then run in global mode. - if (process.argv[1][process.argv[1].length - 1] === 'g') { - process.argv.splice(1, 1, 'npm', '-g') - } - - const satisfies = require('semver/functions/satisfies') - const exitHandler = require('./utils/exit-handler.js') - const Npm = require('./npm.js') - const npm = new Npm() - exitHandler.setNpm(npm) - - // only log node and npm paths in argv initially since argv can contain sensitive info. a cleaned version will be logged later - const log = require('./utils/log-shim.js') - log.verbose('cli', process.argv.slice(0, 2).join(' ')) - log.info('using', 'npm@%s', npm.version) - log.info('using', 'node@%s', process.version) - - // At this point we've required a few files and can be pretty sure we dont contain invalid syntax for this version of node. It's possible a lazy require would, but that's unlikely enough that it's not worth catching anymore and we attach the more important exit handlers. - validateEngines.off() - process.on('uncaughtException', exitHandler) - process.on('unhandledRejection', exitHandler) - - // It is now safe to log a warning if they are using a version of node that is not going to fail on syntax errors but is still unsupported and untested and might not work reliably. This is safe to use the logger now which we want since this will show up in the error log too. - if (!satisfies(validateEngines.node, validateEngines.engines)) { - log.warn('cli', validateEngines.unsupportedMessage) - } - - let cmd - // Now actually fire up npm and run the command. - // This is how to use npm programmatically: - try { - await npm.load() - - // npm -v - if (npm.config.get('version', 'cli')) { - npm.output(npm.version) - return exitHandler() - } - - // npm --versions - if (npm.config.get('versions', 'cli')) { - npm.argv = ['version'] - npm.config.set('usage', false, 'cli') - } - - cmd = npm.argv.shift() - if (!cmd) { - npm.output(npm.usage) - process.exitCode = 1 - return exitHandler() - } - - await npm.exec(cmd) - return exitHandler() - } catch (err) { - if (err.code === 'EUNKNOWNCOMMAND') { - const didYouMean = require('./utils/did-you-mean.js') - const suggestions = await didYouMean(npm.localPrefix, cmd) - npm.output(`Unknown command: "${cmd}"${suggestions}\n`) - npm.output('To see a list of supported npm commands, run:\n npm help') - process.exitCode = 1 - return exitHandler() - } - return exitHandler(err) - } -} diff --git a/deps/npm/lib/cli.js b/deps/npm/lib/cli.js index c85ecb65a7005a..00b4fc0bd7fb72 100644 --- a/deps/npm/lib/cli.js +++ b/deps/npm/lib/cli.js @@ -1,4 +1,12 @@ -const validateEngines = require('./es6/validate-engines.js') -const cliEntry = require('path').resolve(__dirname, 'cli-entry.js') +try { + const { enableCompileCache } = require('node:module') + /* istanbul ignore next */ + if (enableCompileCache) { + enableCompileCache() + } +} catch (e) { /* istanbul ignore next */ } + +const validateEngines = require('./cli/validate-engines.js') +const cliEntry = require('node:path').resolve(__dirname, 'cli/entry.js') module.exports = (process) => validateEngines(process, () => require(cliEntry)) diff --git a/deps/npm/lib/cli/entry.js b/deps/npm/lib/cli/entry.js new file mode 100644 index 00000000000000..ed73eb89e2d360 --- /dev/null +++ b/deps/npm/lib/cli/entry.js @@ -0,0 +1,79 @@ +/* eslint-disable max-len */ + +// Separated out for easier unit testing +module.exports = async (process, validateEngines) => { + // set it here so that regardless of what happens later, we don't + // leak any private CLI configs to other programs + process.title = 'npm' + + // if npm is called as "npmg" or "npm_g", then run in global mode. + if (process.argv[1][process.argv[1].length - 1] === 'g') { + process.argv.splice(1, 1, 'npm', '-g') + } + + // Patch the global fs module here at the app level + require('graceful-fs').gracefulify(require('node:fs')) + + const satisfies = require('semver/functions/satisfies') + const ExitHandler = require('./exit-handler.js') + const exitHandler = new ExitHandler({ process }) + const Npm = require('../npm.js') + const npm = new Npm() + exitHandler.setNpm(npm) + + // only log node and npm paths in argv initially since argv can contain sensitive info. a cleaned version will be logged later + const { log, output } = require('proc-log') + log.verbose('cli', process.argv.slice(0, 2).join(' ')) + log.info('using', 'npm@%s', npm.version) + log.info('using', 'node@%s', process.version) + + // At this point we've required a few files and can be pretty sure we dont contain invalid syntax for this version of node. It's possible a lazy require would, but that's unlikely enough that it's not worth catching anymore and we attach the more important exit handlers. + validateEngines.off() + exitHandler.registerUncaughtHandlers() + + // It is now safe to log a warning if they are using a version of node that is not going to fail on syntax errors but is still unsupported and untested and might not work reliably. This is safe to use the logger now which we want since this will show up in the error log too. + if (!satisfies(validateEngines.node, validateEngines.engines)) { + log.warn('cli', validateEngines.unsupportedMessage) + } + + // Now actually fire up npm and run the command. + // This is how to use npm programmatically: + try { + const { exec, command, args } = await npm.load() + + if (!exec) { + return exitHandler.exit() + } + + if (!command) { + output.standard(npm.usage) + process.exitCode = 1 + return exitHandler.exit() + } + + // Options are prefixed by a hyphen-minus (-, \u2d). + // Other dash-type chars look similar but are invalid. + const nonDashArgs = npm.argv.filter(a => /^[\u2010-\u2015\u2212\uFE58\uFE63\uFF0D]/.test(a)) + if (nonDashArgs.length) { + log.error( + 'arg', + 'Argument starts with non-ascii dash, this is probably invalid:', + require('@npmcli/redact').redactLog(nonDashArgs.join(', ')) + ) + } + + const execPromise = npm.exec(command, args) + + // this is async but we dont await it, since its ok if it doesnt + // finish before the command finishes running. it uses command and argv + // so it must be initiated here, after the command name is set + const updateNotifier = require('./update-notifier.js') + // eslint-disable-next-line promise/catch-or-return + updateNotifier(npm).then((msg) => (npm.updateNotification = msg)) + + await execPromise + return exitHandler.exit() + } catch (err) { + return exitHandler.exit(err) + } +} diff --git a/deps/npm/lib/cli/exit-handler.js b/deps/npm/lib/cli/exit-handler.js new file mode 100644 index 00000000000000..e76b08c80a635b --- /dev/null +++ b/deps/npm/lib/cli/exit-handler.js @@ -0,0 +1,174 @@ +const { log, output, META } = require('proc-log') +const { errorMessage, getExitCodeFromError } = require('../utils/error-message.js') + +class ExitHandler { + #npm = null + #process = null + #exited = false + #exitErrorMessage = false + + #noNpmError = false + + get #hasNpm () { + return !!this.#npm + } + + get #loaded () { + return !!this.#npm?.loaded + } + + get #showExitErrorMessage () { + if (!this.#loaded) { + return false + } + if (!this.#exited) { + return true + } + return this.#exitErrorMessage + } + + get #notLoadedOrExited () { + return !this.#loaded && !this.#exited + } + + setNpm (npm) { + this.#npm = npm + } + + constructor ({ process }) { + this.#process = process + this.#process.on('exit', this.#handleProcesExitAndReset) + } + + registerUncaughtHandlers () { + this.#process.on('uncaughtException', this.#handleExit) + this.#process.on('unhandledRejection', this.#handleExit) + } + + exit (err) { + this.#handleExit(err) + } + + #handleProcesExitAndReset = (code) => { + this.#handleProcessExit(code) + + // Reset all the state. This is only relevant for tests since + // in reality the process fully exits here. + this.#process.off('exit', this.#handleProcesExitAndReset) + this.#process.off('uncaughtException', this.#handleExit) + this.#process.off('unhandledRejection', this.#handleExit) + if (this.#loaded) { + this.#npm.unload() + } + this.#npm = null + this.#exited = false + this.#exitErrorMessage = false + } + + #handleProcessExit (code) { + const numCode = Number(code) || 0 + // Always exit w/ a non-zero code if exit handler was not called + const exitCode = this.#exited ? numCode : (numCode || 1) + this.#process.exitCode = exitCode + + if (this.#notLoadedOrExited) { + // Exit handler was not called and npm was not loaded so we have to log something + this.#logConsoleError(new Error(`Process exited unexpectedly with code: ${exitCode}`)) + return + } + + if (this.#logNoNpmError()) { + return + } + + const os = require('node:os') + log.verbose('cwd', this.#process.cwd()) + log.verbose('os', `${os.type()} ${os.release()}`) + log.verbose('node', this.#process.version) + log.verbose('npm ', `v${this.#npm.version}`) + + // only show the notification if it finished + if (typeof this.#npm.updateNotification === 'string') { + log.notice('', this.#npm.updateNotification, { [META]: true, force: true }) + } + + if (!this.#exited) { + log.error('', 'Exit handler never called!') + log.error('', 'This is an error with npm itself. Please report this error at:') + log.error('', ' ') + if (this.#npm.silent) { + output.error('') + } + } + + log.verbose('exit', exitCode) + + if (exitCode) { + log.verbose('code', exitCode) + } else { + log.info('ok') + } + + if (this.#showExitErrorMessage) { + log.error('', this.#npm.exitErrorMessage()) + } + } + + #logConsoleError (err) { + // Run our error message formatters on all errors even if we + // have no npm or an unloaded npm. This will clean the error + // and possible return a formatted message about EACCESS or something. + const { summary, detail } = errorMessage(err, this.#npm) + const formatted = [...new Set([...summary, ...detail].flat().filter(Boolean))].join('\n') + // If we didn't get anything from the formatted message then just display the full stack + // eslint-disable-next-line no-console + console.error(formatted === err.message ? err.stack : formatted) + } + + #logNoNpmError (err) { + if (this.#hasNpm) { + return false + } + // Make sure we only log this error once + if (!this.#noNpmError) { + this.#noNpmError = true + this.#logConsoleError( + new Error(`Exit prior to setting npm in exit handler`, err ? { cause: err } : {}) + ) + } + return true + } + + #handleExit = (err) => { + this.#exited = true + + // No npm at all + if (this.#logNoNpmError(err)) { + return this.#process.exit(this.#process.exitCode || getExitCodeFromError(err) || 1) + } + + // npm was never loaded but we still might have a config loading error or + // something similar that we can run through the error message formatter + // to give the user a clue as to what happened.s + if (!this.#loaded) { + this.#logConsoleError(new Error('Exit prior to config file resolving', { cause: err })) + return this.#process.exit(this.#process.exitCode || getExitCodeFromError(err) || 1) + } + + this.#exitErrorMessage = err?.suppressError === true ? false : !!err + + // Prefer the exit code of the error, then the current process exit code, + // then set it to 1 if we still have an error. Otherwise we call process.exit + // with undefined so that it can determine the final exit code + const exitCode = err?.exitCode ?? this.#process.exitCode ?? (err ? 1 : undefined) + + // explicitly call process.exit now so we don't hang on things like the + // update notifier, also flush stdout/err beforehand because process.exit doesn't + // wait for that to happen. + this.#process.stderr.write('', () => this.#process.stdout.write('', () => { + this.#process.exit(exitCode) + })) + } +} + +module.exports = ExitHandler diff --git a/deps/npm/lib/cli/update-notifier.js b/deps/npm/lib/cli/update-notifier.js new file mode 100644 index 00000000000000..32cac18350be9f --- /dev/null +++ b/deps/npm/lib/cli/update-notifier.js @@ -0,0 +1,121 @@ +// print a banner telling the user to upgrade npm to latest +// but not in CI, and not if we're doing that already. +// Check daily for betas, and weekly otherwise. + +const ciInfo = require('ci-info') +const gt = require('semver/functions/gt') +const gte = require('semver/functions/gte') +const parse = require('semver/functions/parse') +const { stat, writeFile } = require('node:fs/promises') +const { resolve } = require('node:path') + +// update check frequency +const DAILY = 1000 * 60 * 60 * 24 +const WEEKLY = DAILY * 7 + +// don't put it in the _cacache folder, just in npm's cache +const lastCheckedFile = npm => + resolve(npm.flatOptions.cache, '../_update-notifier-last-checked') + +// Actual check for updates. This is a separate function so that we only load +// this if we are doing the actual update +const updateCheck = async (npm, spec, version, current) => { + const pacote = require('pacote') + + const mani = await pacote.manifest(`npm@${spec}`, { + // always prefer latest, even if doing --tag=whatever on the cmd + defaultTag: 'latest', + ...npm.flatOptions, + cache: false, + }).catch(() => null) + + // if pacote failed, give up + if (!mani) { + return null + } + + const latest = mani.version + + // if the current version is *greater* than latest, we're on a 'next' + // and should get the updates from that release train. + // Note that this isn't another http request over the network, because + // the packument will be cached by pacote from previous request. + if (gt(version, latest) && spec === 'latest') { + return updateNotifier(npm, `^${version}`) + } + + // if we already have something >= the desired spec, then we're done + if (gte(version, latest)) { + return null + } + + const chalk = npm.logChalk + + // ok! notify the user about this update they should get. + // The message is saved for printing at process exit so it will not get + // lost in any other messages being printed as part of the command. + const update = parse(mani.version) + const type = update.major !== current.major ? 'major' + : update.minor !== current.minor ? 'minor' + : update.patch !== current.patch ? 'patch' + : 'prerelease' + const typec = type === 'major' ? 'red' + : type === 'minor' ? 'yellow' + : 'cyan' + const cmd = `npm install -g npm@${latest}` + const message = `\nNew ${chalk[typec](type)} version of npm available! ` + + `${chalk[typec](current)} -> ${chalk.blue(latest)}\n` + + `Changelog: ${chalk.blue(`https://github.com/npm/cli/releases/tag/v${latest}`)}\n` + + `To update run: ${chalk.underline(cmd)}\n` + + return message +} + +const updateNotifier = async (npm, spec = 'latest') => { + // if we're on a prerelease train, then updates are coming fast + // check for a new one daily. otherwise, weekly. + const { version } = npm + const current = parse(version) + + // if we're on a beta train, always get the next beta + if (current.prerelease.length) { + spec = `^${version}` + } + + // while on a beta train, get updates daily + const duration = spec !== 'latest' ? DAILY : WEEKLY + + const t = new Date(Date.now() - duration) + // if we don't have a file, then definitely check it. + const st = await stat(lastCheckedFile(npm)).catch(() => ({ mtime: t - 1 })) + + // if we've already checked within the specified duration, don't check again + if (!(t > st.mtime)) { + return null + } + + // intentional. do not await this. it's a best-effort update. if this + // fails, it's ok. might be using /dev/null as the cache or something weird + // like that. + writeFile(lastCheckedFile(npm), '').catch(() => {}) + + return updateCheck(npm, spec, version, current) +} + +// only update the notification timeout if we actually finished checking +module.exports = npm => { + if ( + // opted out + !npm.config.get('update-notifier') + // global npm update + || (npm.flatOptions.global && + ['install', 'update'].includes(npm.command) && + npm.argv.some(arg => /^npm(@|$)/.test(arg))) + // CI + || ciInfo.isCI + ) { + return Promise.resolve(null) + } + + return updateNotifier(npm) +} diff --git a/deps/npm/lib/es6/validate-engines.js b/deps/npm/lib/cli/validate-engines.js similarity index 100% rename from deps/npm/lib/es6/validate-engines.js rename to deps/npm/lib/cli/validate-engines.js diff --git a/deps/npm/lib/commands/access.js b/deps/npm/lib/commands/access.js index 99c1264a84eda3..547fa7af01577c 100644 --- a/deps/npm/lib/commands/access.js +++ b/deps/npm/lib/commands/access.js @@ -1,11 +1,11 @@ const libnpmaccess = require('libnpmaccess') const npa = require('npm-package-arg') +const { output } = require('proc-log') const pkgJson = require('@npmcli/package-json') const localeCompare = require('@isaacs/string-locale-compare')('en') - -const otplease = require('../utils/otplease.js') +const { otplease } = require('../utils/auth.js') const getIdentity = require('../utils/get-identity.js') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') const commands = [ 'get', @@ -36,7 +36,7 @@ class Access extends BaseCommand { ] static usage = [ - 'list packages [|| []', + 'list packages [||] []', 'list collaborators [ []]', 'get status []', 'set status=public|private []', @@ -197,7 +197,7 @@ class Access extends BaseCommand { } #output (items, limiter) { - const output = {} + const outputs = {} const lookup = { __proto__: null, read: 'read-only', @@ -205,14 +205,14 @@ class Access extends BaseCommand { } for (const item in items) { const val = items[item] - output[item] = lookup[val] || val + outputs[item] = lookup[val] || val } if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify(output, null, 2)) + output.buffer(outputs) } else { - for (const item of Object.keys(output).sort(localeCompare)) { + for (const item of Object.keys(outputs).sort(localeCompare)) { if (!limiter || limiter === item) { - this.npm.output(`${item}: ${output[item]}`) + output.standard(`${item}: ${outputs[item]}`) } } } diff --git a/deps/npm/lib/commands/adduser.js b/deps/npm/lib/commands/adduser.js index a69ef366fbf32c..cf64e7a7e74389 100644 --- a/deps/npm/lib/commands/adduser.js +++ b/deps/npm/lib/commands/adduser.js @@ -1,8 +1,7 @@ -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') const { redactLog: replaceInfo } = require('@npmcli/redact') const auth = require('../utils/auth.js') - -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class AddUser extends BaseCommand { static description = 'Add a registry user account' @@ -13,7 +12,7 @@ class AddUser extends BaseCommand { 'auth-type', ] - async exec (args) { + async exec () { const scope = this.npm.config.get('scope') let registry = this.npm.config.get('registry') @@ -27,7 +26,6 @@ class AddUser extends BaseCommand { const creds = this.npm.config.getCredentialsByURI(registry) - log.disableProgress() log.notice('', `Log in on ${replaceInfo(registry)}`) const { message, newCreds } = await auth.adduser(this.npm, { @@ -45,7 +43,8 @@ class AddUser extends BaseCommand { await this.npm.config.save('user') - this.npm.output(message) + output.standard(message) } } + module.exports = AddUser diff --git a/deps/npm/lib/commands/audit.js b/deps/npm/lib/commands/audit.js index 8c10a36cfee3cf..486bef1bb5dc11 100644 --- a/deps/npm/lib/commands/audit.js +++ b/deps/npm/lib/commands/audit.js @@ -1,399 +1,9 @@ const npmAuditReport = require('npm-audit-report') -const fetch = require('npm-registry-fetch') -const localeCompare = require('@isaacs/string-locale-compare')('en') -const npa = require('npm-package-arg') -const pacote = require('pacote') -const pMap = require('p-map') -const tufClient = require('@sigstore/tuf') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') const auditError = require('../utils/audit-error.js') -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') const reifyFinish = require('../utils/reify-finish.js') - -const sortAlphabetically = (a, b) => localeCompare(a.name, b.name) - -class VerifySignatures { - constructor (tree, filterSet, npm, opts) { - this.tree = tree - this.filterSet = filterSet - this.npm = npm - this.opts = opts - this.keys = new Map() - this.invalid = [] - this.missing = [] - this.checkedPackages = new Set() - this.auditedWithKeysCount = 0 - this.verifiedSignatureCount = 0 - this.verifiedAttestationCount = 0 - this.exitCode = 0 - } - - async run () { - const start = process.hrtime.bigint() - - // Find all deps in tree - const { edges, registries } = this.getEdgesOut(this.tree.inventory.values(), this.filterSet) - if (edges.size === 0) { - throw new Error('found no installed dependencies to audit') - } - - const tuf = await tufClient.initTUF({ - cachePath: this.opts.tufCache, - retry: this.opts.retry, - timeout: this.opts.timeout, - }) - await Promise.all([...registries].map(registry => this.setKeys({ registry, tuf }))) - - const progress = log.newItem('verifying registry signatures', edges.size) - const mapper = async (edge) => { - progress.completeWork(1) - await this.getVerifiedInfo(edge) - } - await pMap(edges, mapper, { concurrency: 20, stopOnError: true }) - - // Didn't find any dependencies that could be verified, e.g. only local - // deps, missing version, not on a registry etc. - if (!this.auditedWithKeysCount) { - throw new Error('found no dependencies to audit that were installed from ' + - 'a supported registry') - } - - const invalid = this.invalid.sort(sortAlphabetically) - const missing = this.missing.sort(sortAlphabetically) - - const hasNoInvalidOrMissing = invalid.length === 0 && missing.length === 0 - - if (!hasNoInvalidOrMissing) { - process.exitCode = 1 - } - - if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify({ - invalid, - missing, - }, null, 2)) - return - } - const end = process.hrtime.bigint() - const elapsed = end - start - - const auditedPlural = this.auditedWithKeysCount > 1 ? 's' : '' - const timing = `audited ${this.auditedWithKeysCount} package${auditedPlural} in ` + - `${Math.floor(Number(elapsed) / 1e9)}s` - this.npm.output(timing) - this.npm.output('') - - const verifiedBold = this.npm.chalk.bold('verified') - if (this.verifiedSignatureCount) { - if (this.verifiedSignatureCount === 1) { - /* eslint-disable-next-line max-len */ - this.npm.output(`${this.verifiedSignatureCount} package has a ${verifiedBold} registry signature`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`${this.verifiedSignatureCount} packages have ${verifiedBold} registry signatures`) - } - this.npm.output('') - } - - if (this.verifiedAttestationCount) { - if (this.verifiedAttestationCount === 1) { - /* eslint-disable-next-line max-len */ - this.npm.output(`${this.verifiedAttestationCount} package has a ${verifiedBold} attestation`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`${this.verifiedAttestationCount} packages have ${verifiedBold} attestations`) - } - this.npm.output('') - } - - if (missing.length) { - const missingClr = this.npm.chalk.bold(this.npm.chalk.red('missing')) - if (missing.length === 1) { - /* eslint-disable-next-line max-len */ - this.npm.output(`1 package has a ${missingClr} registry signature but the registry is providing signing keys:`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`${missing.length} packages have ${missingClr} registry signatures but the registry is providing signing keys:`) - } - this.npm.output('') - missing.map(m => - this.npm.output(`${this.npm.chalk.red(`${m.name}@${m.version}`)} (${m.registry})`) - ) - } - - if (invalid.length) { - if (missing.length) { - this.npm.output('') - } - const invalidClr = this.npm.chalk.bold(this.npm.chalk.red('invalid')) - // We can have either invalid signatures or invalid provenance - const invalidSignatures = this.invalid.filter(i => i.code === 'EINTEGRITYSIGNATURE') - if (invalidSignatures.length) { - if (invalidSignatures.length === 1) { - this.npm.output(`1 package has an ${invalidClr} registry signature:`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`${invalidSignatures.length} packages have ${invalidClr} registry signatures:`) - } - this.npm.output('') - invalidSignatures.map(i => - this.npm.output(`${this.npm.chalk.red(`${i.name}@${i.version}`)} (${i.registry})`) - ) - this.npm.output('') - } - - const invalidAttestations = this.invalid.filter(i => i.code === 'EATTESTATIONVERIFY') - if (invalidAttestations.length) { - if (invalidAttestations.length === 1) { - this.npm.output(`1 package has an ${invalidClr} attestation:`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`${invalidAttestations.length} packages have ${invalidClr} attestations:`) - } - this.npm.output('') - invalidAttestations.map(i => - this.npm.output(`${this.npm.chalk.red(`${i.name}@${i.version}`)} (${i.registry})`) - ) - this.npm.output('') - } - - if (invalid.length === 1) { - /* eslint-disable-next-line max-len */ - this.npm.output(`Someone might have tampered with this package since it was published on the registry!`) - } else { - /* eslint-disable-next-line max-len */ - this.npm.output(`Someone might have tampered with these packages since they were published on the registry!`) - } - this.npm.output('') - } - } - - getEdgesOut (nodes, filterSet) { - const edges = new Set() - const registries = new Set() - for (const node of nodes) { - for (const edge of node.edgesOut.values()) { - const filteredOut = - edge.from - && filterSet - && filterSet.size > 0 - && !filterSet.has(edge.from.target) - - if (!filteredOut) { - const spec = this.getEdgeSpec(edge) - if (spec) { - // Prefetch and cache public keys from used registries - registries.add(this.getSpecRegistry(spec)) - } - edges.add(edge) - } - } - } - return { edges, registries } - } - - async setKeys ({ registry, tuf }) { - const { host, pathname } = new URL(registry) - // Strip any trailing slashes from pathname - const regKey = `${host}${pathname.replace(/\/$/, '')}/keys.json` - let keys = await tuf.getTarget(regKey) - .then((target) => JSON.parse(target)) - .then(({ keys: ks }) => ks.map((key) => ({ - ...key, - keyid: key.keyId, - pemkey: `-----BEGIN PUBLIC KEY-----\n${key.publicKey.rawBytes}\n-----END PUBLIC KEY-----`, - expires: key.publicKey.validFor.end || null, - }))).catch(err => { - if (err.code === 'TUF_FIND_TARGET_ERROR') { - return null - } else { - throw err - } - }) - - // If keys not found in Sigstore TUF repo, fallback to registry keys API - if (!keys) { - keys = await fetch.json('/-/npm/v1/keys', { - ...this.npm.flatOptions, - registry, - }).then(({ keys: ks }) => ks.map((key) => ({ - ...key, - pemkey: `-----BEGIN PUBLIC KEY-----\n${key.key}\n-----END PUBLIC KEY-----`, - }))).catch(err => { - if (err.code === 'E404' || err.code === 'E400') { - return null - } else { - throw err - } - }) - } - - if (keys) { - this.keys.set(registry, keys) - } - } - - getEdgeType (edge) { - return edge.optional ? 'optionalDependencies' - : edge.peer ? 'peerDependencies' - : edge.dev ? 'devDependencies' - : 'dependencies' - } - - getEdgeSpec (edge) { - let name = edge.name - try { - name = npa(edge.spec).subSpec.name - } catch { - // leave it as edge.name - } - try { - return npa(`${name}@${edge.spec}`) - } catch { - // Skip packages with invalid spec - } - } - - buildRegistryConfig (registry) { - const keys = this.keys.get(registry) || [] - const parsedRegistry = new URL(registry) - const regKey = `//${parsedRegistry.host}${parsedRegistry.pathname}` - return { - [`${regKey}:_keys`]: keys, - } - } - - getSpecRegistry (spec) { - return fetch.pickRegistry(spec, this.npm.flatOptions) - } - - getValidPackageInfo (edge) { - const type = this.getEdgeType(edge) - // Skip potentially optional packages that are not on disk, as these could - // be omitted during install - if (edge.error === 'MISSING' && type !== 'dependencies') { - return - } - - const spec = this.getEdgeSpec(edge) - // Skip invalid version requirements - if (!spec) { - return - } - const node = edge.to || edge - const { version } = node.package || {} - - if (node.isWorkspace || // Skip local workspaces packages - !version || // Skip packages that don't have a installed version, e.g. optonal dependencies - !spec.registry) { // Skip if not from registry, e.g. git package - return - } - - for (const omitType of this.npm.config.get('omit')) { - if (node[omitType]) { - return - } - } - - return { - name: spec.name, - version, - type, - location: node.location, - registry: this.getSpecRegistry(spec), - } - } - - async verifySignatures (name, version, registry) { - const { - _integrity: integrity, - _signatures, - _attestations, - _resolved: resolved, - } = await pacote.manifest(`${name}@${version}`, { - verifySignatures: true, - verifyAttestations: true, - ...this.buildRegistryConfig(registry), - ...this.npm.flatOptions, - }) - const signatures = _signatures || [] - const result = { - integrity, - signatures, - attestations: _attestations, - resolved, - } - return result - } - - async getVerifiedInfo (edge) { - const info = this.getValidPackageInfo(edge) - if (!info) { - return - } - const { name, version, location, registry, type } = info - if (this.checkedPackages.has(location)) { - // we already did or are doing this one - return - } - this.checkedPackages.add(location) - - // We only "audit" or verify the signature, or the presence of it, on - // packages whose registry returns signing keys - const keys = this.keys.get(registry) || [] - if (keys.length) { - this.auditedWithKeysCount += 1 - } - - try { - const { integrity, signatures, attestations, resolved } = await this.verifySignatures( - name, version, registry - ) - - // Currently we only care about missing signatures on registries that provide a public key - // We could make this configurable in the future with a strict/paranoid mode - if (signatures.length) { - this.verifiedSignatureCount += 1 - } else if (keys.length) { - this.missing.push({ - integrity, - location, - name, - registry, - resolved, - version, - }) - } - - // Track verified attestations separately to registry signatures, as all - // packages on registries with signing keys are expected to have registry - // signatures, but not all packages have provenance and publish attestations. - if (attestations) { - this.verifiedAttestationCount += 1 - } - } catch (e) { - if (e.code === 'EINTEGRITYSIGNATURE' || e.code === 'EATTESTATIONVERIFY') { - this.invalid.push({ - code: e.code, - message: e.message, - integrity: e.integrity, - keyid: e.keyid, - location, - name, - registry, - resolved: e.resolved, - signature: e.signature, - predicateType: e.predicateType, - type, - version, - }) - } else { - throw e - } - } - } -} +const VerifySignatures = require('../utils/verify-signatures.js') class Audit extends ArboristWorkspaceCmd { static description = 'Run a security audit' @@ -467,7 +77,7 @@ class Audit extends ArboristWorkspaceCmd { chalk: this.npm.chalk, }) process.exitCode = process.exitCode || result.exitCode - this.npm.output(result.report) + output.standard(result.report) } } @@ -480,7 +90,7 @@ class Audit extends ArboristWorkspaceCmd { ) } - log.verbose('loading installed dependencies') + log.verbose('audit', 'loading installed dependencies') const Arborist = require('@npmcli/arborist') const opts = { ...this.npm.flatOptions, diff --git a/deps/npm/lib/commands/cache.js b/deps/npm/lib/commands/cache.js index 50bb35e3544dfe..87c70a57dc0edf 100644 --- a/deps/npm/lib/commands/cache.js +++ b/deps/npm/lib/commands/cache.js @@ -1,13 +1,13 @@ const cacache = require('cacache') const pacote = require('pacote') -const fs = require('fs/promises') -const { join } = require('path') +const fs = require('node:fs/promises') +const { join } = require('node:path') const semver = require('semver') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') const npa = require('npm-package-arg') const jsonParse = require('json-parse-even-better-errors') const localeCompare = require('@isaacs/string-locale-compare')('en') -const log = require('../utils/log-shim') +const { log, output } = require('proc-log') const searchCachePackage = async (path, parsed, cacheKeys) => { /* eslint-disable-next-line max-len */ @@ -132,10 +132,10 @@ class Cache extends BaseCommand { try { entry = await cacache.get(cachePath, key) } catch (err) { - log.warn(`Not Found: ${key}`) + log.warn('cache', `Not Found: ${key}`) break } - this.npm.output(`Deleted: ${key}`) + output.standard(`Deleted: ${key}`) await cacache.rm.entry(cachePath, key) // XXX this could leave other entries without content! await cacache.rm.content(cachePath, entry.integrity) @@ -152,15 +152,20 @@ class Cache extends BaseCommand { throw this.usageError('First argument to `add` is required') } - return Promise.all(args.map(spec => { + await Promise.all(args.map(async spec => { log.silly('cache add', 'spec', spec) // we ask pacote for the thing, and then just throw the data // away so that it tee-pipes it into the cache like it does // for a normal request. - return pacote.tarball.stream(spec, stream => { + await pacote.tarball.stream(spec, stream => { stream.resume() return stream.promise() }, { ...this.npm.flatOptions }) + + await pacote.manifest(spec, { + ...this.npm.flatOptions, + fullMetadata: true, + }) })) } @@ -170,20 +175,20 @@ class Cache extends BaseCommand { ? `~${cache.slice(process.env.HOME.length)}` : cache const stats = await cacache.verify(cache) - this.npm.output(`Cache verified and compressed (${prefix})`) - this.npm.output(`Content verified: ${stats.verifiedContent} (${stats.keptSize} bytes)`) + output.standard(`Cache verified and compressed (${prefix})`) + output.standard(`Content verified: ${stats.verifiedContent} (${stats.keptSize} bytes)`) if (stats.badContentCount) { - this.npm.output(`Corrupted content removed: ${stats.badContentCount}`) + output.standard(`Corrupted content removed: ${stats.badContentCount}`) } if (stats.reclaimedCount) { /* eslint-disable-next-line max-len */ - this.npm.output(`Content garbage-collected: ${stats.reclaimedCount} (${stats.reclaimedSize} bytes)`) + output.standard(`Content garbage-collected: ${stats.reclaimedCount} (${stats.reclaimedSize} bytes)`) } if (stats.missingContent) { - this.npm.output(`Missing content: ${stats.missingContent}`) + output.standard(`Missing content: ${stats.missingContent}`) } - this.npm.output(`Index entries: ${stats.totalEntries}`) - this.npm.output(`Finished in ${stats.runTime.total / 1000}s`) + output.standard(`Index entries: ${stats.totalEntries}`) + output.standard(`Finished in ${stats.runTime.total / 1000}s`) } // npm cache ls [--package ...] @@ -203,10 +208,10 @@ class Cache extends BaseCommand { results.add(key) } } - [...results].sort(localeCompare).forEach(key => this.npm.output(key)) + [...results].sort(localeCompare).forEach(key => output.standard(key)) return } - cacheKeys.sort(localeCompare).forEach(key => this.npm.output(key)) + cacheKeys.sort(localeCompare).forEach(key => output.standard(key)) } } diff --git a/deps/npm/lib/commands/ci.js b/deps/npm/lib/commands/ci.js index 428c43e6c30edc..c190de7e3ea7f8 100644 --- a/deps/npm/lib/commands/ci.js +++ b/deps/npm/lib/commands/ci.js @@ -1,10 +1,11 @@ const reifyFinish = require('../utils/reify-finish.js') const runScript = require('@npmcli/run-script') -const fs = require('fs/promises') -const log = require('../utils/log-shim.js') +const fs = require('node:fs/promises') +const path = require('node:path') +const { log, time } = require('proc-log') const validateLockfile = require('../utils/validate-lockfile.js') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') +const getWorkspaces = require('../utils/get-workspaces.js') class CI extends ArboristWorkspaceCmd { static description = 'Clean install a project' @@ -77,14 +78,22 @@ class CI extends ArboristWorkspaceCmd { const dryRun = this.npm.config.get('dry-run') if (!dryRun) { + const workspacePaths = await getWorkspaces([], { + path: this.npm.localPrefix, + includeWorkspaceRoot: true, + }) + // Only remove node_modules after we've successfully loaded the virtual // tree and validated the lockfile - await this.npm.time('npm-ci:rm', async () => { - const path = `${where}/node_modules` - // get the list of entries so we can skip the glob for performance - const entries = await fs.readdir(path, null).catch(er => []) - return Promise.all(entries.map(f => fs.rm(`${path}/${f}`, - { force: true, recursive: true }))) + await time.start('npm-ci:rm', async () => { + return await Promise.all([...workspacePaths.values()].map(async modulePath => { + const fullPath = path.join(modulePath, 'node_modules') + // get the list of entries so we can skip the glob for performance + const entries = await fs.readdir(fullPath, null).catch(() => []) + return Promise.all(entries.map(folder => { + return fs.rm(path.join(fullPath, folder), { force: true, recursive: true }) + })) + })) }) } @@ -109,7 +118,6 @@ class CI extends ArboristWorkspaceCmd { args: [], scriptShell, stdio: 'inherit', - banner: !this.npm.silent, event, }) } diff --git a/deps/npm/lib/commands/completion.js b/deps/npm/lib/commands/completion.js index 59113c50560bca..f8c2e00c6baee7 100644 --- a/deps/npm/lib/commands/completion.js +++ b/deps/npm/lib/commands/completion.js @@ -27,22 +27,22 @@ // Matches are wrapped with ' to escape them, if necessary, and then printed // one per line for the shell completion method to consume in IFS=$'\n' mode // as an array. -// -const fs = require('fs/promises') +const fs = require('node:fs/promises') const nopt = require('nopt') -const { resolve } = require('path') - +const { resolve } = require('node:path') +const { output } = require('proc-log') const Npm = require('../npm.js') const { definitions, shorthands } = require('@npmcli/config/lib/definitions') const { commands, aliases, deref } = require('../utils/cmd-list.js') -const configNames = Object.keys(definitions) -const shorthandNames = Object.keys(shorthands) -const allConfs = configNames.concat(shorthandNames) const { isWindowsShell } = require('../utils/is-windows.js') +const BaseCommand = require('../base-cmd.js') + const fileExists = (file) => fs.stat(file).then(s => s.isFile()).catch(() => false) -const BaseCommand = require('../base-command.js') +const configNames = Object.keys(definitions) +const shorthandNames = Object.keys(shorthands) +const allConfs = configNames.concat(shorthandNames) class Completion extends BaseCommand { static description = 'Tab Completion for npm' @@ -185,7 +185,7 @@ class Completion extends BaseCommand { } if (compls.length > 0) { - this.npm.output(compls.join('\n')) + output.standard(compls.join('\n')) } } } @@ -248,7 +248,7 @@ const configCompl = opts => { // expand with the valid values of various config values. // not yet implemented. -const configValueCompl = opts => [] +const configValueCompl = () => [] // check if the thing is a flag or not. const isFlag = word => { @@ -265,7 +265,7 @@ const isFlag = word => { // complete against the npm commands // if they all resolve to the same thing, just return the thing it already is -const cmdCompl = (opts, npm) => { +const cmdCompl = (opts) => { const allCommands = commands.concat(Object.keys(aliases)) const matches = allCommands.filter(c => c.startsWith(opts.partialWord)) if (!matches.length) { diff --git a/deps/npm/lib/commands/config.js b/deps/npm/lib/commands/config.js index 8e8358fc50b7be..6b1447d7e84268 100644 --- a/deps/npm/lib/commands/config.js +++ b/deps/npm/lib/commands/config.js @@ -1,23 +1,42 @@ -const { mkdir, readFile, writeFile } = require('fs/promises') -const { dirname, resolve } = require('path') -const { spawn } = require('child_process') -const { EOL } = require('os') -const ini = require('ini') +const { mkdir, readFile, writeFile } = require('node:fs/promises') +const { dirname, resolve } = require('node:path') +const { spawn } = require('node:child_process') +const { EOL } = require('node:os') const localeCompare = require('@isaacs/string-locale-compare')('en') const pkgJson = require('@npmcli/package-json') const { defaults, definitions } = require('@npmcli/config/lib/definitions') -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') +const { redact } = require('@npmcli/redact') // These are the configs that we can nerf-dart. Not all of them currently even -// *have* config definitions so we have to explicitly validate them here +// *have* config definitions so we have to explicitly validate them here. +// This is used to validate during "npm config set" const nerfDarts = [ '_auth', '_authToken', - 'username', '_password', + 'certfile', 'email', + 'keyfile', + 'username', +] +// These are the config values to swap with "protected". It does not catch +// every single sensitive thing a user may put in the npmrc file but it gets +// the common ones. This is distinct from nerfDarts because that is used to +// validate valid configs during "npm config set", and folks may have old +// invalid entries lying around in a config file that we still want to protect +// when running "npm config list" +// This is a more general list of values to consider protected. You can not +// "npm config get" them, and they will not display during "npm config list" +const protected = [ + 'auth', + 'authToken', 'certfile', + 'email', 'keyfile', + 'password', + 'username', ] // take an array of `[key, value, k2=v2, k3, v3, ...]` and turn into @@ -35,19 +54,35 @@ const keyValues = args => { return kv } -const publicVar = k => { +const isProtected = (k) => { // _password if (k.startsWith('_')) { - return false + return true + } + if (protected.includes(k)) { + return true } // //localhost:8080/:_password - if (k.startsWith('//') && k.includes(':_')) { - return false + if (k.startsWith('//')) { + if (k.includes(':_')) { + return true + } + // //registry:_authToken or //registry:authToken + for (const p of protected) { + if (k.endsWith(`:${p}`) || k.endsWith(`:_${p}`)) { + return true + } + } } - return true + return false } -const BaseCommand = require('../base-command.js') +// Private fields are either protected or they can redacted info +const isPrivate = (k, v) => isProtected(k) || redact(v) !== v + +const displayVar = (k, v) => + `${k} = ${isProtected(k, v) ? '(protected)' : JSON.stringify(redact(v))}` + class Config extends BaseCommand { static description = 'Manage the npm configuration files' static name = 'config' @@ -111,35 +146,30 @@ class Config extends BaseCommand { } async exec ([action, ...args]) { - log.disableProgress() - try { - switch (action) { - case 'set': - await this.set(args) - break - case 'get': - await this.get(args) - break - case 'delete': - case 'rm': - case 'del': - await this.del(args) - break - case 'list': - case 'ls': - await (this.npm.flatOptions.json ? this.listJson() : this.list()) - break - case 'edit': - await this.edit() - break - case 'fix': - await this.fix() - break - default: - throw this.usageError() - } - } finally { - log.enableProgress() + switch (action) { + case 'set': + await this.set(args) + break + case 'get': + await this.get(args) + break + case 'delete': + case 'rm': + case 'del': + await this.del(args) + break + case 'list': + case 'ls': + await (this.npm.flatOptions.json ? this.listJson() : this.list()) + break + case 'edit': + await this.edit() + break + case 'fix': + await this.fix() + break + default: + throw this.usageError() } } @@ -183,14 +213,15 @@ class Config extends BaseCommand { const out = [] for (const key of keys) { - if (!publicVar(key)) { + const val = this.npm.config.get(key) + if (isPrivate(key, val)) { throw new Error(`The ${key} option is protected, and can not be retrieved in this way`) } const pref = keys.length > 1 ? `${key}=` : '' - out.push(pref + this.npm.config.get(key)) + out.push(pref + val) } - this.npm.output(out.join('\n')) + output.standard(out.join('\n')) } async del (keys) { @@ -206,6 +237,7 @@ class Config extends BaseCommand { } async edit () { + const ini = require('ini') const e = this.npm.flatOptions.editor const where = this.npm.flatOptions.location const file = this.npm.config.data.get(where).source @@ -287,7 +319,7 @@ ${defData} this.npm.config.repair(problems) const locations = [] - this.npm.output('The following configuration problems have been repaired:\n') + output.standard('The following configuration problems have been repaired:\n') const summary = problems.map(({ action, from, to, key, where }) => { // coverage disabled for else branch because it is intentionally omitted // istanbul ignore else @@ -300,7 +332,7 @@ ${defData} return `- \`${key}\` deleted from ${where} config` } }).join('\n') - this.npm.output(summary) + output.standard(summary) return await Promise.all(locations.map((location) => this.npm.config.save(location))) } @@ -314,18 +346,17 @@ ${defData} continue } - const keys = Object.keys(data).sort(localeCompare) - if (!keys.length) { + const entries = Object.entries(data).sort(([a], [b]) => localeCompare(a, b)) + if (!entries.length) { continue } msg.push(`; "${where}" config from ${source}`, '') - for (const k of keys) { - const v = publicVar(k) ? JSON.stringify(data[k]) : '(protected)' + for (const [k, v] of entries) { + const display = displayVar(k, v) const src = this.npm.config.find(k) - const overridden = src !== where - msg.push((overridden ? '; ' : '') + - `${k} = ${v} ${overridden ? `; overridden by ${src}` : ''}`) + msg.push(src === where ? display : `; ${display} ; overridden by ${src}`) + msg.push() } msg.push('') } @@ -350,28 +381,29 @@ ${defData} const pkgPath = resolve(this.npm.prefix, 'package.json') msg.push(`; "publishConfig" from ${pkgPath}`) msg.push('; This set of config values will be used at publish-time.', '') - const pkgKeys = Object.keys(content.publishConfig).sort(localeCompare) - for (const k of pkgKeys) { - const v = publicVar(k) ? JSON.stringify(content.publishConfig[k]) : '(protected)' - msg.push(`${k} = ${v}`) + const entries = Object.entries(content.publishConfig) + .sort(([a], [b]) => localeCompare(a, b)) + for (const [k, value] of entries) { + msg.push(displayVar(k, value)) } msg.push('') } } - this.npm.output(msg.join('\n').trim()) + output.standard(msg.join('\n').trim()) } async listJson () { const publicConf = {} for (const key in this.npm.config.list[0]) { - if (!publicVar(key)) { + const value = this.npm.config.get(key) + if (isPrivate(key, value)) { continue } - publicConf[key] = this.npm.config.get(key) + publicConf[key] = value } - this.npm.output(JSON.stringify(publicConf, null, 2)) + output.buffer(publicConf) } } diff --git a/deps/npm/lib/commands/dedupe.js b/deps/npm/lib/commands/dedupe.js index 0d0e26621b2275..e07bcd31e894b9 100644 --- a/deps/npm/lib/commands/dedupe.js +++ b/deps/npm/lib/commands/dedupe.js @@ -1,8 +1,7 @@ -// dedupe duplicated packages, or find them in the tree const reifyFinish = require('../utils/reify-finish.js') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') +// dedupe duplicated packages, or find them in the tree class Dedupe extends ArboristWorkspaceCmd { static description = 'Reduce duplication in the package tree' static name = 'dedupe' @@ -22,7 +21,7 @@ class Dedupe extends ArboristWorkspaceCmd { ...super.params, ] - async exec (args) { + async exec () { if (this.npm.global) { const er = new Error('`npm dedupe` does not work in global mode.') er.code = 'EDEDUPEGLOBAL' diff --git a/deps/npm/lib/commands/deprecate.js b/deps/npm/lib/commands/deprecate.js index bdce313923cff8..977fd9fce11dac 100644 --- a/deps/npm/lib/commands/deprecate.js +++ b/deps/npm/lib/commands/deprecate.js @@ -1,10 +1,11 @@ const fetch = require('npm-registry-fetch') -const otplease = require('../utils/otplease.js') +const { otplease } = require('../utils/auth.js') const npa = require('npm-package-arg') +const { log } = require('proc-log') const semver = require('semver') const getIdentity = require('../utils/get-identity.js') const libaccess = require('libnpmaccess') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Deprecate extends BaseCommand { static description = 'Deprecate a version of a package' @@ -66,6 +67,8 @@ class Deprecate extends BaseCommand { body: packument, ignoreBody: true, })) + } else { + log.warn('deprecate', 'No version found for', p.rawSpec) } } } diff --git a/deps/npm/lib/commands/diff.js b/deps/npm/lib/commands/diff.js index 64d81d525d79d2..6e9160cf623cd2 100644 --- a/deps/npm/lib/commands/diff.js +++ b/deps/npm/lib/commands/diff.js @@ -1,12 +1,12 @@ -const { resolve } = require('path') +const { resolve } = require('node:path') const semver = require('semver') const libnpmdiff = require('libnpmdiff') const npa = require('npm-package-arg') const pacote = require('pacote') const pickManifest = require('npm-pick-manifest') -const log = require('../utils/log-shim') +const { log, output } = require('proc-log') const pkgJson = require('@npmcli/package-json') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Diff extends BaseCommand { static description = 'The registry diff command' @@ -64,7 +64,7 @@ class Diff extends BaseCommand { diffFiles: args, where: this.top, }) - return this.npm.output(res) + return output.standard(res) } async execWorkspaces (args) { @@ -78,7 +78,7 @@ class Diff extends BaseCommand { // get the package name from the packument at `path` // throws if no packument is present OR if it does not have `name` attribute - async packageName (path) { + async packageName () { let name try { const { content: pkg } = await pkgJson.normalize(this.prefix) @@ -103,10 +103,10 @@ class Diff extends BaseCommand { // no arguments, defaults to comparing cwd // to its latest published registry version if (!a) { - const pkgName = await this.packageName(this.prefix) + const pkgName = await this.packageName() return [ `${pkgName}@${this.npm.config.get('tag')}`, - `file:${this.prefix.replace(/#/g, '%23')}`, + `file:${this.prefix}`, ] } @@ -134,7 +134,7 @@ class Diff extends BaseCommand { } return [ `${pkgName}@${a}`, - `file:${this.prefix.replace(/#/g, '%23')}`, + `file:${this.prefix}`, ] } @@ -166,7 +166,7 @@ class Diff extends BaseCommand { } return [ `${spec.name}@${spec.fetchSpec}`, - `file:${this.prefix.replace(/#/g, '%23')}`, + `file:${this.prefix}`, ] } @@ -179,7 +179,7 @@ class Diff extends BaseCommand { } } - const aSpec = `file:${node.realpath.replace(/#/g, '%23')}` + const aSpec = `file:${node.realpath}` // finds what version of the package to compare against, if a exact // version or tag was passed than it should use that, otherwise @@ -212,8 +212,8 @@ class Diff extends BaseCommand { ] } else if (spec.type === 'directory') { return [ - `file:${spec.fetchSpec.replace(/#/g, '%23')}`, - `file:${this.prefix.replace(/#/g, '%23')}`, + `file:${spec.fetchSpec}`, + `file:${this.prefix}`, ] } else { throw this.usageError(`Spec type ${spec.type} not supported.`) @@ -281,7 +281,7 @@ class Diff extends BaseCommand { const res = !node || !node.package || !node.package.version ? spec.fetchSpec - : `file:${node.realpath.replace(/#/g, '%23')}` + : `file:${node.realpath}` return `${spec.name}@${res}` }) diff --git a/deps/npm/lib/commands/dist-tag.js b/deps/npm/lib/commands/dist-tag.js index ff49bc8e307cb6..663f0eb44a26ad 100644 --- a/deps/npm/lib/commands/dist-tag.js +++ b/deps/npm/lib/commands/dist-tag.js @@ -1,10 +1,10 @@ const npa = require('npm-package-arg') const regFetch = require('npm-registry-fetch') const semver = require('semver') -const log = require('../utils/log-shim') -const otplease = require('../utils/otplease.js') +const { log, output } = require('proc-log') +const { otplease } = require('../utils/auth.js') const pkgJson = require('@npmcli/package-json') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class DistTag extends BaseCommand { static description = 'Modify package distribution tags' @@ -120,7 +120,7 @@ class DistTag extends BaseCommand { spec, } await otplease(this.npm, reqOpts, o => regFetch(url, o)) - this.npm.output(`+${t}: ${spec.name}@${version}`) + output.standard(`+${t}: ${spec.name}@${version}`) } async remove (spec, tag, opts) { @@ -146,7 +146,7 @@ class DistTag extends BaseCommand { spec, } await otplease(this.npm, reqOpts, o => regFetch(url, o)) - this.npm.output(`-${tag}: ${spec.name}@${version}`) + output.standard(`-${tag}: ${spec.name}@${version}`) } async list (spec, opts) { @@ -167,7 +167,7 @@ class DistTag extends BaseCommand { const tags = await this.fetchTags(spec, opts) const msg = Object.keys(tags).map(k => `${k}: ${tags[k]}`).sort().join('\n') - this.npm.output(msg) + output.standard(msg) return tags } catch (err) { log.error('dist-tag ls', "Couldn't get dist-tag data for", spec) @@ -180,7 +180,7 @@ class DistTag extends BaseCommand { for (const name of this.workspaceNames) { try { - this.npm.output(`${name}:`) + output.standard(`${name}:`) await this.list(npa(name), this.npm.flatOptions) } catch (err) { // set the exitCode directly, but ignore the error @@ -205,4 +205,5 @@ class DistTag extends BaseCommand { return data } } + module.exports = DistTag diff --git a/deps/npm/lib/commands/docs.js b/deps/npm/lib/commands/docs.js index 5d20215b56a07f..2259b49f79617f 100644 --- a/deps/npm/lib/commands/docs.js +++ b/deps/npm/lib/commands/docs.js @@ -1,4 +1,5 @@ const PackageUrlCmd = require('../package-url-cmd.js') + class Docs extends PackageUrlCmd { static description = 'Open documentation for a package in a web browser' static name = 'docs' @@ -16,4 +17,5 @@ class Docs extends PackageUrlCmd { return `https://www.npmjs.com/package/${mani.name}` } } + module.exports = Docs diff --git a/deps/npm/lib/commands/doctor.js b/deps/npm/lib/commands/doctor.js index 2a528d46ddb8dc..8fbd49b7ca8bfb 100644 --- a/deps/npm/lib/commands/doctor.js +++ b/deps/npm/lib/commands/doctor.js @@ -1,19 +1,14 @@ const cacache = require('cacache') -const fs = require('fs') +const { access, lstat, readdir, constants: { R_OK, W_OK, X_OK } } = require('node:fs/promises') const fetch = require('make-fetch-happen') -const Table = require('cli-table3') const which = require('which') const pacote = require('pacote') -const { resolve } = require('path') +const { resolve } = require('node:path') const semver = require('semver') -const { promisify } = require('util') -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') const ping = require('../utils/ping.js') const { defaults } = require('@npmcli/config/lib/definitions') -const lstat = promisify(fs.lstat) -const readdir = promisify(fs.readdir) -const access = promisify(fs.access) -const { R_OK, W_OK, X_OK } = fs.constants +const BaseCommand = require('../base-cmd.js') const maskLabel = mask => { const label = [] @@ -34,57 +29,59 @@ const maskLabel = mask => { const subcommands = [ { - groups: ['ping', 'registry'], - title: 'npm ping', + // Ping is left in as a legacy command but is listed as "connection" to + // make more sense to more people + groups: ['connection', 'ping', 'registry'], + title: 'Connecting to the registry', cmd: 'checkPing', }, { groups: ['versions'], - title: 'npm -v', + title: 'Checking npm version', cmd: 'getLatestNpmVersion', }, { groups: ['versions'], - title: 'node -v', + title: 'Checking node version', cmd: 'getLatestNodejsVersion', }, { groups: ['registry'], - title: 'npm config get registry', + title: 'Checking configured npm registry', cmd: 'checkNpmRegistry', }, { groups: ['environment'], - title: 'git executable in PATH', + title: 'Checking for git executable in PATH', cmd: 'getGitPath', }, { groups: ['environment'], - title: 'global bin folder in PATH', + title: 'Checking for global bin folder in PATH', cmd: 'getBinPath', }, { groups: ['permissions', 'cache'], - title: 'Perms check on cached files', + title: 'Checking permissions on cached files (this may take awhile)', cmd: 'checkCachePermission', windows: false, }, { groups: ['permissions'], - title: 'Perms check on local node_modules', + title: 'Checking permissions on local node_modules (this may take awhile)', cmd: 'checkLocalModulesPermission', windows: false, }, { groups: ['permissions'], - title: 'Perms check on global node_modules', + title: 'Checking permissions on global node_modules (this may take awhile)', cmd: 'checkGlobalModulesPermission', windows: false, }, { groups: ['permissions'], - title: 'Perms check on local bin folder', + title: 'Checking permissions on local bin folder', cmd: 'checkLocalBinPermission', windows: false, }, { groups: ['permissions'], - title: 'Perms check on global bin folder', + title: 'Checking permissions on global bin folder', cmd: 'checkGlobalBinPermission', windows: false, }, { groups: ['cache'], - title: 'Verify cache contents', + title: 'Verifying cache contents (this may take awhile)', cmd: 'verifyCachedFiles', windows: false, }, @@ -97,50 +94,35 @@ const subcommands = [ // - verify all local packages have bins linked // What is the fix for these? ] -const BaseCommand = require('../base-command.js') + class Doctor extends BaseCommand { static description = 'Check the health of your npm environment' static name = 'doctor' static params = ['registry'] static ignoreImplicitWorkspace = false static usage = [`[${subcommands.flatMap(s => s.groups) - .filter((value, index, self) => self.indexOf(value) === index) + .filter((value, index, self) => self.indexOf(value) === index && value !== 'ping') .join('] [')}]`] static subcommands = subcommands - // minimum width of check column, enough for the word `Check` - #checkWidth = 5 - async exec (args) { - log.info('Running checkup') + log.info('doctor', 'Running checkup') let allOk = true const actions = this.actions(args) - this.#checkWidth = actions.reduce((length, item) => - Math.max(item.title.length, length), this.#checkWidth) - if (!this.npm.silent) { - this.output(['Check', 'Value', 'Recommendation/Notes'].map(h => this.npm.chalk.underline(h))) - } - // Do the actual work + const chalk = this.npm.chalk for (const { title, cmd } of actions) { - const item = [title] + this.output(title) + // TODO when we have an in progress indicator that could go here + let result try { - item.push(true, await this[cmd]()) + result = await this[cmd]() + this.output(`${chalk.green('Ok')}${result ? `\n${result}` : ''}\n`) } catch (err) { - item.push(false, err) - } - if (!item[1]) { allOk = false - item[0] = this.npm.chalk.red(item[0]) - item[1] = this.npm.chalk.red('not ok') - item[2] = this.npm.chalk.magenta(String(item[2])) - } else { - item[1] = this.npm.chalk.green('ok') - } - if (!this.npm.silent) { - this.output(item) + this.output(`${chalk.red('Not ok')}\n${chalk.cyan(err)}\n`) } } @@ -155,8 +137,7 @@ class Doctor extends BaseCommand { } async checkPing () { - const tracker = log.newItem('checkPing', 1) - tracker.info('checkPing', 'Pinging registry') + log.info('doctor', 'Pinging registry') try { await ping({ ...this.npm.flatOptions, retry: false }) return '' @@ -166,23 +147,16 @@ class Doctor extends BaseCommand { } else { throw er.message } - } finally { - tracker.finish() } } async getLatestNpmVersion () { - const tracker = log.newItem('getLatestNpmVersion', 1) - tracker.info('getLatestNpmVersion', 'Getting npm package information') - try { - const latest = (await pacote.manifest('npm@latest', this.npm.flatOptions)).version - if (semver.gte(this.npm.version, latest)) { - return `current: v${this.npm.version}, latest: v${latest}` - } else { - throw `Use npm v${latest}` - } - } finally { - tracker.finish() + log.info('doctor', 'Getting npm package information') + const latest = (await pacote.manifest('npm@latest', this.npm.flatOptions)).version + if (semver.gte(this.npm.version, latest)) { + return `current: v${this.npm.version}, latest: v${latest}` + } else { + throw `Use npm v${latest}` } } @@ -191,36 +165,30 @@ class Doctor extends BaseCommand { const current = process.version const currentRange = `^${current}` const url = 'https://nodejs.org/dist/index.json' - const tracker = log.newItem('getLatestNodejsVersion', 1) - tracker.info('getLatestNodejsVersion', 'Getting Node.js release information') - try { - const res = await fetch(url, { method: 'GET', ...this.npm.flatOptions }) - const data = await res.json() - let maxCurrent = '0.0.0' - let maxLTS = '0.0.0' - for (const { lts, version } of data) { - if (lts && semver.gt(version, maxLTS)) { - maxLTS = version - } - - if (semver.satisfies(version, currentRange) && semver.gt(version, maxCurrent)) { - maxCurrent = version - } + log.info('doctor', 'Getting Node.js release information') + const res = await fetch(url, { method: 'GET', ...this.npm.flatOptions }) + const data = await res.json() + let maxCurrent = '0.0.0' + let maxLTS = '0.0.0' + for (const { lts, version } of data) { + if (lts && semver.gt(version, maxLTS)) { + maxLTS = version } - const recommended = semver.gt(maxCurrent, maxLTS) ? maxCurrent : maxLTS - if (semver.gte(process.version, recommended)) { - return `current: ${current}, recommended: ${recommended}` - } else { - throw `Use node ${recommended} (current: ${current})` + + if (semver.satisfies(version, currentRange) && semver.gt(version, maxCurrent)) { + maxCurrent = version } - } finally { - tracker.finish() + } + const recommended = semver.gt(maxCurrent, maxLTS) ? maxCurrent : maxLTS + if (semver.gte(process.version, recommended)) { + return `current: ${current}, recommended: ${recommended}` + } else { + throw `Use node ${recommended} (current: ${current})` } } - async getBinPath (dir) { - const tracker = log.newItem('getBinPath', 1) - tracker.info('getBinPath', 'Finding npm global bin in your PATH') + async getBinPath () { + log.info('doctor', 'getBinPath', 'Finding npm global bin in your PATH') if (!process.env.PATH.includes(this.npm.globalBin)) { throw new Error(`Add ${this.npm.globalBin} to your $PATH`) } @@ -250,30 +218,25 @@ class Doctor extends BaseCommand { async checkFilesPermission (root, shouldOwn, mask, missingOk) { let ok = true - const tracker = log.newItem(root, 1) - try { const uid = process.getuid() const gid = process.getgid() const files = new Set([root]) for (const f of files) { - tracker.silly('checkFilesPermission', f.slice(root.length + 1)) const st = await lstat(f).catch(er => { // if it can't be missing, or if it can and the error wasn't that it was missing if (!missingOk || er.code !== 'ENOENT') { ok = false - tracker.warn('checkFilesPermission', 'error getting info for ' + f) + log.warn('doctor', 'checkFilesPermission', 'error getting info for ' + f) } }) - tracker.completeWork(1) - if (!st) { continue } if (shouldOwn && (uid !== st.uid || gid !== st.gid)) { - tracker.warn('checkFilesPermission', 'should be owner of ' + f) + log.warn('doctor', 'checkFilesPermission', 'should be owner of ' + f) ok = false } @@ -286,14 +249,14 @@ class Doctor extends BaseCommand { } catch (er) { ok = false const msg = `Missing permissions on ${f} (expect: ${maskLabel(mask)})` - tracker.error('checkFilesPermission', msg) + log.error('doctor', 'checkFilesPermission', msg) continue } if (st.isDirectory()) { - const entries = await readdir(f).catch(er => { + const entries = await readdir(f).catch(() => { ok = false - tracker.warn('checkFilesPermission', 'error reading directory ' + f) + log.warn('doctor', 'checkFilesPermission', 'error reading directory ' + f) return [] }) for (const entry of entries) { @@ -302,7 +265,6 @@ class Doctor extends BaseCommand { } } } finally { - tracker.finish() if (!ok) { throw ( `Check the permissions of files in ${root}` + @@ -315,50 +277,43 @@ class Doctor extends BaseCommand { } async getGitPath () { - const tracker = log.newItem('getGitPath', 1) - tracker.info('getGitPath', 'Finding git in your PATH') - try { - return await which('git').catch(er => { - tracker.warn(er) - throw new Error("Install git and ensure it's in your PATH.") - }) - } finally { - tracker.finish() - } + log.info('doctor', 'Finding git in your PATH') + return await which('git').catch(er => { + log.warn('doctor', 'getGitPath', er) + throw new Error("Install git and ensure it's in your PATH.") + }) } async verifyCachedFiles () { - const tracker = log.newItem('verifyCachedFiles', 1) - tracker.info('verifyCachedFiles', 'Verifying the npm cache') - try { - const stats = await cacache.verify(this.npm.flatOptions.cache) - const { badContentCount, reclaimedCount, missingContent, reclaimedSize } = stats - if (badContentCount || reclaimedCount || missingContent) { - if (badContentCount) { - tracker.warn('verifyCachedFiles', `Corrupted content removed: ${badContentCount}`) - } + log.info('doctor', 'verifyCachedFiles', 'Verifying the npm cache') - if (reclaimedCount) { - tracker.warn( - 'verifyCachedFiles', - `Content garbage-collected: ${reclaimedCount} (${reclaimedSize} bytes)` - ) - } + const stats = await cacache.verify(this.npm.flatOptions.cache) + const { badContentCount, reclaimedCount, missingContent, reclaimedSize } = stats + if (badContentCount || reclaimedCount || missingContent) { + if (badContentCount) { + log.warn('doctor', 'verifyCachedFiles', `Corrupted content removed: ${badContentCount}`) + } - if (missingContent) { - tracker.warn('verifyCachedFiles', `Missing content: ${missingContent}`) - } + if (reclaimedCount) { + log.warn( + 'doctor', + 'verifyCachedFiles', + `Content garbage-collected: ${reclaimedCount} (${reclaimedSize} bytes)` + ) + } - tracker.warn('verifyCachedFiles', 'Cache issues have been fixed') + if (missingContent) { + log.warn('doctor', 'verifyCachedFiles', `Missing content: ${missingContent}`) } - tracker.info( - 'verifyCachedFiles', - `Verification complete. Stats: ${JSON.stringify(stats, null, 2)}` - ) - return `verified ${stats.verifiedContent} tarballs` - } finally { - tracker.finish() + + log.warn('doctor', 'verifyCachedFiles', 'Cache issues have been fixed') } + log.info( + 'doctor', + 'verifyCachedFiles', + `Verification complete. Stats: ${JSON.stringify(stats, null, 2)}` + ) + return `verified ${stats.verifiedContent} tarballs` } async checkNpmRegistry () { @@ -369,38 +324,11 @@ class Doctor extends BaseCommand { } } - output (row) { - const t = new Table({ - chars: { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ' ', - }, - style: { - 'padding-left': 0, - 'padding-right': 0, - // setting border here is not necessary visually since we've already - // zeroed out all the chars above, but without it cli-table3 will wrap - // some of the separator spaces with ansi codes which show up in - // snapshots. - border: 0, - }, - colWidths: [this.#checkWidth, 6], - }) - t.push(row) - this.npm.output(t.toString()) + output (...args) { + // TODO display layer should do this + if (!this.npm.silent) { + output.standard(...args) + } } actions (params) { diff --git a/deps/npm/lib/commands/edit.js b/deps/npm/lib/commands/edit.js index fbc7840a39876f..b2c2ec8d2a39a0 100644 --- a/deps/npm/lib/commands/edit.js +++ b/deps/npm/lib/commands/edit.js @@ -1,34 +1,31 @@ -// npm edit -// open the package folder in the $EDITOR +const { resolve } = require('node:path') +const { lstat } = require('node:fs/promises') +const cp = require('node:child_process') +const completion = require('../utils/installed-shallow.js') +const BaseCommand = require('../base-cmd.js') -const { resolve } = require('path') -const fs = require('graceful-fs') -const cp = require('child_process') -const completion = require('../utils/completion/installed-shallow.js') -const BaseCommand = require('../base-command.js') +const splitPackageNames = (path) => path.split('/') +// combine scoped parts + .reduce((parts, part) => { + if (parts.length === 0) { + return [part] + } -const splitPackageNames = (path) => { - return path.split('/') - // combine scoped parts - .reduce((parts, part) => { - if (parts.length === 0) { - return [part] - } + const lastPart = parts[parts.length - 1] + // check if previous part is the first part of a scoped package + if (lastPart[0] === '@' && !lastPart.includes('/')) { + parts[parts.length - 1] += '/' + part + } else { + parts.push(part) + } - const lastPart = parts[parts.length - 1] - // check if previous part is the first part of a scoped package - if (lastPart[0] === '@' && !lastPart.includes('/')) { - parts[parts.length - 1] += '/' + part - } else { - parts.push(part) - } - - return parts - }, []) - .join('/node_modules/') - .replace(/(\/node_modules)+/, '/node_modules') -} + return parts + }, []) + .join('/node_modules/') + .replace(/(\/node_modules)+/, '/node_modules') +// npm edit +// open the package folder in the $EDITOR class Edit extends BaseCommand { static description = 'Edit an installed package' static name = 'edit' @@ -50,27 +47,18 @@ class Edit extends BaseCommand { const path = splitPackageNames(args[0]) const dir = resolve(this.npm.dir, path) - // graceful-fs does not promisify + await lstat(dir) await new Promise((res, rej) => { - fs.lstat(dir, (err) => { - if (err) { - return rej(err) + const [bin, ...spawnArgs] = this.npm.config.get('editor').split(/\s+/) + const editor = cp.spawn(bin, [...spawnArgs, dir], { stdio: 'inherit' }) + editor.on('exit', async (code) => { + if (code) { + return rej(new Error(`editor process exited with code: ${code}`)) } - const [bin, ...spawnArgs] = this.npm.config.get('editor').split(/\s+/) - const editor = cp.spawn(bin, [...spawnArgs, dir], { stdio: 'inherit' }) - editor.on('exit', async (code) => { - if (code) { - return rej(new Error(`editor process exited with code: ${code}`)) - } - try { - await this.npm.exec('rebuild', [dir]) - } catch (execErr) { - rej(execErr) - } - res() - }) + await this.npm.exec('rebuild', [dir]).then(res).catch(rej) }) }) } } + module.exports = Edit diff --git a/deps/npm/lib/commands/exec.js b/deps/npm/lib/commands/exec.js index d532eca107c6c1..57ee8efe2c98fe 100644 --- a/deps/npm/lib/commands/exec.js +++ b/deps/npm/lib/commands/exec.js @@ -1,6 +1,6 @@ -const { resolve } = require('path') +const { resolve } = require('node:path') const libexec = require('libnpmexec') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Exec extends BaseCommand { static description = 'Run a command from a local or remote npm package' @@ -39,11 +39,8 @@ class Exec extends BaseCommand { } async callExec (args, { name, locationMsg, runPath } = {}) { - // This is where libnpmexec will look for locally installed packages at the project level - const localPrefix = this.npm.localPrefix - // This is where libnpmexec will look for locally installed packages at the workspace level let localBin = this.npm.localBin - let path = localPrefix + let pkgPath = this.npm.localPrefix // This is where libnpmexec will actually run the scripts from if (!runPath) { @@ -54,7 +51,7 @@ class Exec extends BaseCommand { localBin = resolve(this.npm.localDir, name, 'node_modules', '.bin') // We also need to look for `bin` entries in the workspace package.json // libnpmexec will NOT look in the project root for the bin entry - path = runPath + pkgPath = runPath } const call = this.npm.config.get('call') @@ -65,7 +62,6 @@ class Exec extends BaseCommand { globalDir, chalk, } = this.npm - const output = this.npm.output.bind(this.npm) const scriptShell = this.npm.config.get('script-shell') || undefined const packages = this.npm.config.get('package') const yes = this.npm.config.get('yes') @@ -85,17 +81,25 @@ class Exec extends BaseCommand { // we explicitly set packageLockOnly to false because if it's true // when we try to install a missing package, we won't actually install it packageLockOnly: false, - // copy args so they dont get mutated - args: [...args], + // what the user asked to run args[0] is run by default + args: [...args], // copy args so they dont get mutated + // specify a custom command to be run instead of args[0] call, chalk, + // where to look for bins globally, if a file matches call or args[0] it is called globalBin, + // where to look for packages globally, if a package matches call or args[0] it is called globalPath, + // where to look for bins locally, if a file matches call or args[0] it is called localBin, locationMsg, - output, + // packages that need to be installed packages, - path, + // path where node_modules is + path: this.npm.localPrefix, + // where to look for package.json#bin entries first + pkgPath, + // cwd to run from runPath, scriptShell, yes, diff --git a/deps/npm/lib/commands/explain.js b/deps/npm/lib/commands/explain.js index 403274db68dfaf..cb0644304d2b55 100644 --- a/deps/npm/lib/commands/explain.js +++ b/deps/npm/lib/commands/explain.js @@ -1,8 +1,9 @@ const { explainNode } = require('../utils/explain-dep.js') const npa = require('npm-package-arg') const semver = require('semver') -const { relative, resolve } = require('path') +const { relative, resolve } = require('node:path') const validName = require('validate-npm-package-name') +const { output } = require('proc-log') const ArboristWorkspaceCmd = require('../arborist-cmd.js') class Explain extends ArboristWorkspaceCmd { @@ -19,7 +20,7 @@ class Explain extends ArboristWorkspaceCmd { // TODO /* istanbul ignore next */ static async completion (opts, npm) { - const completion = require('../utils/completion/installed-deep.js') + const completion = require('../utils/installed-deep.js') return completion(npm, opts) } @@ -75,9 +76,9 @@ class Explain extends ArboristWorkspaceCmd { } if (this.npm.flatOptions.json) { - this.npm.output(JSON.stringify(expls, null, 2)) + output.buffer(expls) } else { - this.npm.output(expls.map(expl => { + output.standard(expls.map(expl => { return explainNode(expl, Infinity, this.npm.chalk) }).join('\n\n')) } @@ -125,4 +126,5 @@ class Explain extends ArboristWorkspaceCmd { }) } } + module.exports = Explain diff --git a/deps/npm/lib/commands/explore.js b/deps/npm/lib/commands/explore.js index 7a03ea4eabd7f6..184af2bdc5a161 100644 --- a/deps/npm/lib/commands/explore.js +++ b/deps/npm/lib/commands/explore.js @@ -1,13 +1,12 @@ -// npm explore [@] -// open a subshell to the package folder. - const pkgJson = require('@npmcli/package-json') const runScript = require('@npmcli/run-script') -const { join, relative } = require('path') -const log = require('../utils/log-shim.js') -const completion = require('../utils/completion/installed-shallow.js') -const BaseCommand = require('../base-command.js') +const { join, relative } = require('node:path') +const { log, output } = require('proc-log') +const completion = require('../utils/installed-shallow.js') +const BaseCommand = require('../base-cmd.js') +// npm explore [@] +// open a subshell to the package folder. class Explore extends BaseCommand { static description = 'Browse an installed package' static name = 'explore' @@ -50,30 +49,26 @@ class Explore extends BaseCommand { } if (!args.length) { - this.npm.output(`\nExploring ${path}\nType 'exit' or ^D when finished\n`) + output.standard(`\nExploring ${path}\nType 'exit' or ^D when finished\n`) } - log.disableProgress() - try { - return await runScript({ - ...this.npm.flatOptions, - pkg, - banner: false, - path, - event: '_explore', - stdio: 'inherit', - }).catch(er => { - process.exitCode = typeof er.code === 'number' && er.code !== 0 ? er.code - : 1 + + return runScript({ + ...this.npm.flatOptions, + pkg, + path, + event: '_explore', + stdio: 'inherit', + }).catch(er => { + process.exitCode = typeof er.code === 'number' && er.code !== 0 ? er.code + : 1 // if it's not an exit error, or non-interactive, throw it - const isProcExit = er.message === 'command failed' && + const isProcExit = er.message === 'command failed' && (typeof er.code === 'number' || /^SIG/.test(er.signal || '')) - if (args.length || !isProcExit) { - throw er - } - }) - } finally { - log.enableProgress() - } + if (args.length || !isProcExit) { + throw er + } + }) } } + module.exports = Explore diff --git a/deps/npm/lib/commands/find-dupes.js b/deps/npm/lib/commands/find-dupes.js index 2e06e8b6bd93f4..735ac7c4a7ed09 100644 --- a/deps/npm/lib/commands/find-dupes.js +++ b/deps/npm/lib/commands/find-dupes.js @@ -1,6 +1,6 @@ -// dedupe duplicated packages, or find them in the tree const ArboristWorkspaceCmd = require('../arborist-cmd.js') +// dedupe duplicated packages, or find them in the tree class FindDupes extends ArboristWorkspaceCmd { static description = 'Find duplication in the package tree' static name = 'find-dupes' @@ -19,9 +19,10 @@ class FindDupes extends ArboristWorkspaceCmd { ...super.params, ] - async exec (args) { + async exec () { this.npm.config.set('dry-run', true) return this.npm.exec('dedupe', []) } } + module.exports = FindDupes diff --git a/deps/npm/lib/commands/fund.js b/deps/npm/lib/commands/fund.js index 2804d36cd56034..8c194dac80b49b 100644 --- a/deps/npm/lib/commands/fund.js +++ b/deps/npm/lib/commands/fund.js @@ -1,11 +1,11 @@ const archy = require('archy') const pacote = require('pacote') const semver = require('semver') +const { output } = require('proc-log') const npa = require('npm-package-arg') const { depth } = require('treeverse') const { readTree: getFundingInfo, normalizeFunding, isValidFunding } = require('libnpmfund') - -const openUrl = require('../utils/open-url.js') +const { openUrl } = require('../utils/open-url.js') const ArboristWorkspaceCmd = require('../arborist-cmd.js') const getPrintableName = ({ name, version }) => { @@ -37,7 +37,7 @@ class Fund extends ArboristWorkspaceCmd { // TODO /* istanbul ignore next */ static async completion (opts, npm) { - const completion = require('../utils/completion/installed-deep.js') + const completion = require('../utils/installed-deep.js') return completion(npm, opts) } @@ -85,16 +85,12 @@ class Fund extends ArboristWorkspaceCmd { }) if (this.npm.config.get('json')) { - this.npm.output(this.printJSON(fundingInfo)) + output.buffer(fundingInfo) } else { - this.npm.output(this.printHuman(fundingInfo)) + output.standard(this.printHuman(fundingInfo)) } } - printJSON (fundingInfo) { - return JSON.stringify(fundingInfo, null, 2) - } - printHuman (fundingInfo) { const unicode = this.npm.config.get('unicode') const seenUrls = new Map() @@ -110,26 +106,25 @@ class Fund extends ArboristWorkspaceCmd { const [fundingSource] = [].concat(normalizeFunding(funding)).filter(isValidFunding) const { url } = fundingSource || {} const pkgRef = getPrintableName({ name, version }) - let item = { - label: pkgRef, - } - if (url) { - item.label = tree({ - label: this.npm.chalk.bgBlack.white(url), + if (!url) { + return { label: pkgRef } + } + let item + if (seenUrls.has(url)) { + item = seenUrls.get(url) + item.label += `${this.npm.chalk.dim(',')} ${pkgRef}` + return null + } + item = { + label: tree({ + label: this.npm.chalk.blue(url), nodes: [pkgRef], - }).trim() - - // stacks all packages together under the same item - if (seenUrls.has(url)) { - item = seenUrls.get(url) - item.label += `, ${pkgRef}` - return null - } else { - seenUrls.set(url, item) - } + }).trim(), } + // stacks all packages together under the same item + seenUrls.set(url, item) return item }, @@ -153,7 +148,7 @@ class Fund extends ArboristWorkspaceCmd { }) const res = tree(result) - return this.npm.chalk.reset(res) + return res } async openFundingUrl ({ path, tree, spec, fundingSourceNumber }) { @@ -212,7 +207,7 @@ class Fund extends ArboristWorkspaceCmd { if (fundingSourceNumber) { ambiguousUrlMsg.unshift(`--which=${fundingSourceNumber} is not a valid index`) } - this.npm.output(ambiguousUrlMsg.join('\n')) + output.standard(ambiguousUrlMsg.join('\n')) } urlMessage (source) { @@ -222,4 +217,5 @@ class Fund extends ArboristWorkspaceCmd { return [url, message] } } + module.exports = Fund diff --git a/deps/npm/lib/commands/get.js b/deps/npm/lib/commands/get.js index 4bf5d2caf82645..4191f2c973e7d3 100644 --- a/deps/npm/lib/commands/get.js +++ b/deps/npm/lib/commands/get.js @@ -1,5 +1,5 @@ const Npm = require('../npm.js') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Get extends BaseCommand { static description = 'Get a value from the npm configuration' @@ -19,4 +19,5 @@ class Get extends BaseCommand { return this.npm.exec('config', ['get'].concat(args)) } } + module.exports = Get diff --git a/deps/npm/lib/commands/help-search.js b/deps/npm/lib/commands/help-search.js index 273807c7469af0..72dd03ac7406ec 100644 --- a/deps/npm/lib/commands/help-search.js +++ b/deps/npm/lib/commands/help-search.js @@ -1,7 +1,8 @@ -const { readFile } = require('fs/promises') -const path = require('path') +const { readFile } = require('node:fs/promises') +const path = require('node:path') const { glob } = require('glob') -const BaseCommand = require('../base-command.js') +const { output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') const globify = pattern => pattern.split('\\').join('/') @@ -21,12 +22,12 @@ class HelpSearch extends BaseCommand { // preserve glob@8 behavior files = files.sort((a, b) => a.localeCompare(b, 'en')) const data = await this.readFiles(files) - const results = await this.searchFiles(args, data, files) + const results = await this.searchFiles(args, data) const formatted = this.formatResults(args, results) if (!formatted.trim()) { - this.npm.output(`No matches in help for: ${args.join(' ')}\n`) + output.standard(`No matches in help for: ${args.join(' ')}\n`) } else { - this.npm.output(formatted) + output.standard(formatted) } } @@ -39,7 +40,7 @@ class HelpSearch extends BaseCommand { return res } - async searchFiles (args, data, files) { + async searchFiles (args, data) { const results = [] for (const [file, content] of Object.entries(data)) { const lowerCase = content.toLowerCase() @@ -140,7 +141,7 @@ class HelpSearch extends BaseCommand { formatResults (args, results) { const cols = Math.min(process.stdout.columns || Infinity, 80) + 1 - const output = results.map(res => { + const formattedOutput = results.map(res => { const out = [res.cmd] const r = Object.keys(res.hits) .map(k => `${k}:${res.hits[k]}`) @@ -169,8 +170,7 @@ class HelpSearch extends BaseCommand { for (const f of finder) { hilitLine.push(line.slice(p, p + f.length)) const word = line.slice(p + f.length, p + f.length + arg.length) - const hilit = this.npm.chalk.bgBlack.red(word) - hilitLine.push(hilit) + hilitLine.push(this.npm.chalk.blue(word)) p += f.length + arg.length } } @@ -183,12 +183,13 @@ class HelpSearch extends BaseCommand { const finalOut = results.length && !this.npm.config.get('long') ? 'Top hits for ' + (args.map(JSON.stringify).join(' ')) + '\n' + '—'.repeat(cols - 1) + '\n' + - output + '\n' + + formattedOutput + '\n' + '—'.repeat(cols - 1) + '\n' + '(run with -l or --long to see more context)' - : output + : formattedOutput return finalOut.trim() } } + module.exports = HelpSearch diff --git a/deps/npm/lib/commands/help.js b/deps/npm/lib/commands/help.js index 39c580f9a68715..057090da0036c5 100644 --- a/deps/npm/lib/commands/help.js +++ b/deps/npm/lib/commands/help.js @@ -1,12 +1,13 @@ const spawn = require('@npmcli/promise-spawn') -const path = require('path') -const openUrl = require('../utils/open-url.js') +const path = require('node:path') +const { openUrl } = require('../utils/open-url.js') const { glob } = require('glob') +const { output, input } = require('proc-log') const localeCompare = require('@isaacs/string-locale-compare')('en') const { deref } = require('../utils/cmd-list.js') +const BaseCommand = require('../base-cmd.js') const globify = pattern => pattern.split('\\').join('/') -const BaseCommand = require('../base-command.js') // Strips out the number from foo.7 or foo.7. or foo.7.tgz // We don't currently compress our man pages but if we ever did this would @@ -50,7 +51,7 @@ class Help extends BaseCommand { const manSearch = /^\d+$/.test(args[0]) ? `man${args.shift()}` : 'man*' if (!args.length) { - return this.npm.output(this.npm.usage) + return output.standard(this.npm.usage) } // npm help foo bar baz: search topics @@ -94,13 +95,15 @@ class Help extends BaseCommand { args = ['emacsclient', ['-e', `(woman-find-file '${man}')`]] } - return spawn(...args, { stdio: 'inherit' }).catch(err => { + try { + await input.start(() => spawn(...args, { stdio: 'inherit' })) + } catch (err) { if (err.code) { throw new Error(`help process exited with code: ${err.code}`) } else { throw err } - }) + } } // Returns the path to the html version of the man page @@ -110,4 +113,5 @@ class Help extends BaseCommand { return 'file:///' + path.resolve(this.npm.npmRoot, `docs/output/${sect}/${f}.html`) } } + module.exports = Help diff --git a/deps/npm/lib/commands/hook.js b/deps/npm/lib/commands/hook.js index b0f52a801f5717..5793b974197c8d 100644 --- a/deps/npm/lib/commands/hook.js +++ b/deps/npm/lib/commands/hook.js @@ -1,9 +1,9 @@ const hookApi = require('libnpmhook') -const otplease = require('../utils/otplease.js') +const { otplease } = require('../utils/auth.js') const relativeDate = require('tiny-relative-date') -const Table = require('cli-table3') +const { output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Hook extends BaseCommand { static description = 'Manage registry hooks' static name = 'hook' @@ -40,86 +40,70 @@ class Hook extends BaseCommand { async add (pkg, uri, secret, opts) { const hook = await hookApi.add(pkg, uri, secret, opts) if (opts.json) { - this.npm.output(JSON.stringify(hook, null, 2)) + output.buffer(hook) } else if (opts.parseable) { - this.npm.output(Object.keys(hook).join('\t')) - this.npm.output(Object.keys(hook).map(k => hook[k]).join('\t')) + output.standard(Object.keys(hook).join('\t')) + output.standard(Object.keys(hook).map(k => hook[k]).join('\t')) } else if (!this.npm.silent) { - this.npm.output(`+ ${this.hookName(hook)} ${opts.unicode ? ' ➜ ' : ' -> '} ${hook.endpoint}`) + output.standard(`+ ${this.hookName(hook)} ${opts.unicode ? ' ➜ ' : ' -> '} ${hook.endpoint}`) } } async ls (pkg, opts) { const hooks = await hookApi.ls({ ...opts, package: pkg }) + if (opts.json) { - this.npm.output(JSON.stringify(hooks, null, 2)) + output.buffer(hooks) } else if (opts.parseable) { - this.npm.output(Object.keys(hooks[0]).join('\t')) + output.standard(Object.keys(hooks[0]).join('\t')) hooks.forEach(hook => { - this.npm.output(Object.keys(hook).map(k => hook[k]).join('\t')) + output.standard(Object.keys(hook).map(k => hook[k]).join('\t')) }) } else if (!hooks.length) { - this.npm.output("You don't have any hooks configured yet.") + output.standard("You don't have any hooks configured yet.") } else if (!this.npm.silent) { - if (hooks.length === 1) { - this.npm.output('You have one hook configured.') - } else { - this.npm.output(`You have ${hooks.length} hooks configured.`) - } + output.standard(`You have ${hooks.length} hook${hooks.length !== 1 ? 's' : ''} configured.`) - const table = new Table({ head: ['id', 'target', 'endpoint'] }) - hooks.forEach((hook) => { - table.push([ - { rowSpan: 2, content: hook.id }, - this.hookName(hook), - hook.endpoint, - ]) + for (const hook of hooks) { + output.standard(`Hook ${hook.id}: ${this.hookName(hook)}`) + output.standard(`Endpoint: ${hook.endpoint}`) if (hook.last_delivery) { - table.push([ - { - colSpan: 1, - content: `triggered ${relativeDate(hook.last_delivery)}`, - }, - hook.response_code, - ]) + /* eslint-disable-next-line max-len */ + output.standard(`Triggered ${relativeDate(hook.last_delivery)}, response code was "${hook.response_code}"\n`) } else { - table.push([{ colSpan: 2, content: 'never triggered' }]) + output.standard('Never triggered\n') } - }) - this.npm.output(table.toString()) + } } } async rm (id, opts) { const hook = await hookApi.rm(id, opts) if (opts.json) { - this.npm.output(JSON.stringify(hook, null, 2)) + output.buffer(hook) } else if (opts.parseable) { - this.npm.output(Object.keys(hook).join('\t')) - this.npm.output(Object.keys(hook).map(k => hook[k]).join('\t')) + output.standard(Object.keys(hook).join('\t')) + output.standard(Object.keys(hook).map(k => hook[k]).join('\t')) } else if (!this.npm.silent) { - this.npm.output(`- ${this.hookName(hook)} ${opts.unicode ? ' ✘ ' : ' X '} ${hook.endpoint}`) + output.standard(`- ${this.hookName(hook)} ${opts.unicode ? ' ✘ ' : ' X '} ${hook.endpoint}`) } } async update (id, uri, secret, opts) { const hook = await hookApi.update(id, uri, secret, opts) if (opts.json) { - this.npm.output(JSON.stringify(hook, null, 2)) + output.buffer(hook) } else if (opts.parseable) { - this.npm.output(Object.keys(hook).join('\t')) - this.npm.output(Object.keys(hook).map(k => hook[k]).join('\t')) + output.standard(Object.keys(hook).join('\t')) + output.standard(Object.keys(hook).map(k => hook[k]).join('\t')) } else if (!this.npm.silent) { - this.npm.output(`+ ${this.hookName(hook)} ${opts.unicode ? ' ➜ ' : ' -> '} ${hook.endpoint}`) + output.standard(`+ ${this.hookName(hook)} ${opts.unicode ? ' ➜ ' : ' -> '} ${hook.endpoint}`) } } hookName (hook) { - let target = hook.name - if (hook.type === 'owner') { - target = '~' + target - } - return target + return `${hook.type === 'owner' ? '~' : ''}${hook.name}` } } + module.exports = Hook diff --git a/deps/npm/lib/commands/init.js b/deps/npm/lib/commands/init.js index 030c97356edb83..09e8d8522f7f31 100644 --- a/deps/npm/lib/commands/init.js +++ b/deps/npm/lib/commands/init.js @@ -1,18 +1,17 @@ -const fs = require('fs') -const { relative, resolve } = require('path') -const { mkdir } = require('fs/promises') +const { statSync } = require('node:fs') +const { relative, resolve } = require('node:path') +const { mkdir } = require('node:fs/promises') const initJson = require('init-package-json') const npa = require('npm-package-arg') const libexec = require('libnpmexec') const mapWorkspaces = require('@npmcli/map-workspaces') const PackageJson = require('@npmcli/package-json') -const log = require('../utils/log-shim.js') -const updateWorkspaces = require('../workspaces/update-workspaces.js') +const { log, output, input } = require('proc-log') +const updateWorkspaces = require('../utils/update-workspaces.js') +const BaseCommand = require('../base-cmd.js') const posixPath = p => p.split('\\').join('/') -const BaseCommand = require('../base-command.js') - class Init extends BaseCommand { static description = 'Create a package.json file' static params = [ @@ -32,7 +31,7 @@ class Init extends BaseCommand { static name = 'init' static usage = [ - ' (same as `npx `)', + ' (same as `npx create-`)', '<@scope> (same as `npx <@scope>/create`)', ] @@ -60,7 +59,7 @@ class Init extends BaseCommand { // to create a workspace package.json file or its folders const { content: pkg } = await PackageJson.normalize(this.npm.localPrefix).catch(err => { if (err.code === 'ENOENT') { - log.warn('Missing package.json. Try with `--include-workspace-root`.') + log.warn('init', 'Missing package.json. Try with `--include-workspace-root`.') } throw err }) @@ -96,7 +95,7 @@ class Init extends BaseCommand { await this.update(workspacesPaths) } - async execCreate (args, path = process.cwd()) { + async execCreate (args, runPath = process.cwd()) { const [initerName, ...otherArgs] = args let packageName = initerName @@ -130,8 +129,6 @@ class Init extends BaseCommand { globalBin, chalk, } = this.npm - const output = this.npm.output.bind(this.npm) - const runPath = path const scriptShell = this.npm.config.get('script-shell') || undefined const yes = this.npm.config.get('yes') @@ -142,7 +139,7 @@ class Init extends BaseCommand { globalBin, output, chalk, - path, + path: this.npm.localPrefix, runPath, scriptShell, yes, @@ -150,12 +147,9 @@ class Init extends BaseCommand { } async template (path = process.cwd()) { - log.pause() - log.disableProgress() - const initFile = this.npm.config.get('init-module') if (!this.npm.config.get('yes') && !this.npm.config.get('force')) { - this.npm.output([ + output.standard([ 'This utility will walk you through creating a package.json file.', 'It only covers the most common items, and tries to guess sensible defaults.', '', @@ -170,7 +164,7 @@ class Init extends BaseCommand { } try { - const data = await initJson(path, initFile, this.npm.config) + const data = await input.read(() => initJson(path, initFile, this.npm.config)) log.silly('package data', data) return data } catch (er) { @@ -179,9 +173,6 @@ class Init extends BaseCommand { } else { throw er } - } finally { - log.resume() - log.enableProgress() } } @@ -200,7 +191,7 @@ class Init extends BaseCommand { // mapWorkspaces, so we're just going to avoid touching the // top-level package.json try { - fs.statSync(resolve(workspacePath, 'package.json')) + statSync(resolve(workspacePath, 'package.json')) } catch (err) { return } diff --git a/deps/npm/lib/commands/install-ci-test.js b/deps/npm/lib/commands/install-ci-test.js index f7a357ba6e1246..4b9dd269f8c748 100644 --- a/deps/npm/lib/commands/install-ci-test.js +++ b/deps/npm/lib/commands/install-ci-test.js @@ -1,8 +1,7 @@ -// npm install-ci-test -// Runs `npm ci` and then runs `npm test` - const CI = require('./ci.js') +// npm install-ci-test +// Runs `npm ci` and then runs `npm test` class InstallCITest extends CI { static description = 'Install a project with a clean slate and run tests' static name = 'install-ci-test' @@ -12,4 +11,5 @@ class InstallCITest extends CI { return this.npm.exec('test', []) } } + module.exports = InstallCITest diff --git a/deps/npm/lib/commands/install-test.js b/deps/npm/lib/commands/install-test.js index 11f22e535403cc..e21ca7c929c55e 100644 --- a/deps/npm/lib/commands/install-test.js +++ b/deps/npm/lib/commands/install-test.js @@ -1,8 +1,7 @@ -// npm install-test -// Runs `npm install` and then runs `npm test` - const Install = require('./install.js') +// npm install-test +// Runs `npm install` and then runs `npm test` class InstallTest extends Install { static description = 'Install package(s) and run tests' static name = 'install-test' @@ -12,4 +11,5 @@ class InstallTest extends Install { return this.npm.exec('test', []) } } + module.exports = InstallTest diff --git a/deps/npm/lib/commands/install.js b/deps/npm/lib/commands/install.js index d04a35fbec2a76..24e5f6819b3141 100644 --- a/deps/npm/lib/commands/install.js +++ b/deps/npm/lib/commands/install.js @@ -1,15 +1,12 @@ -/* eslint-disable camelcase */ -const fs = require('fs') -const util = require('util') -const readdir = util.promisify(fs.readdir) -const reifyFinish = require('../utils/reify-finish.js') -const log = require('../utils/log-shim.js') -const { resolve, join } = require('path') +const { readdir } = require('node:fs/promises') +const { resolve, join } = require('node:path') +const { log } = require('proc-log') const runScript = require('@npmcli/run-script') const pacote = require('pacote') const checks = require('npm-install-checks') - +const reifyFinish = require('../utils/reify-finish.js') const ArboristWorkspaceCmd = require('../arborist-cmd.js') + class Install extends ArboristWorkspaceCmd { static description = 'Install a package' static name = 'install' @@ -168,7 +165,6 @@ class Install extends ArboristWorkspaceCmd { args: [], scriptShell, stdio: 'inherit', - banner: !this.npm.silent, event, }) } @@ -176,4 +172,5 @@ class Install extends ArboristWorkspaceCmd { await reifyFinish(this.npm, arb) } } + module.exports = Install diff --git a/deps/npm/lib/commands/link.js b/deps/npm/lib/commands/link.js index cdc248569849c3..4955a5b77d338b 100644 --- a/deps/npm/lib/commands/link.js +++ b/deps/npm/lib/commands/link.js @@ -1,15 +1,11 @@ -const fs = require('fs') -const util = require('util') -const readdir = util.promisify(fs.readdir) -const { resolve } = require('path') - +const { readdir } = require('node:fs/promises') +const { resolve } = require('node:path') const npa = require('npm-package-arg') const pkgJson = require('@npmcli/package-json') const semver = require('semver') - const reifyFinish = require('../utils/reify-finish.js') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') + class Link extends ArboristWorkspaceCmd { static description = 'Symlink a package folder' static name = 'link' @@ -128,7 +124,7 @@ class Link extends ArboristWorkspaceCmd { ...this.npm.flatOptions, prune: false, path: this.npm.prefix, - add: names.map(l => `file:${resolve(globalTop, 'node_modules', l).replace(/#/g, '%23')}`), + add: names.map(l => `file:${resolve(globalTop, 'node_modules', l)}`), save, workspaces: this.workspaceNames, }) @@ -139,7 +135,7 @@ class Link extends ArboristWorkspaceCmd { async linkPkg () { const wsp = this.workspacePaths const paths = wsp && wsp.length ? wsp : [this.npm.prefix] - const add = paths.map(path => `file:${path.replace(/#/g, '%23')}`) + const add = paths.map(path => `file:${path}`) const globalTop = resolve(this.npm.globalDir, '..') const Arborist = require('@npmcli/arborist') const arb = new Arborist({ @@ -189,4 +185,5 @@ class Link extends ArboristWorkspaceCmd { return missing } } + module.exports = Link diff --git a/deps/npm/lib/commands/login.js b/deps/npm/lib/commands/login.js index b498a3bf2ecd8b..630abf9ac8e045 100644 --- a/deps/npm/lib/commands/login.js +++ b/deps/npm/lib/commands/login.js @@ -1,8 +1,7 @@ -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') const { redactLog: replaceInfo } = require('@npmcli/redact') const auth = require('../utils/auth.js') - -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Login extends BaseCommand { static description = 'Login to a registry user account' @@ -13,7 +12,7 @@ class Login extends BaseCommand { 'auth-type', ] - async exec (args) { + async exec () { const scope = this.npm.config.get('scope') let registry = this.npm.config.get('registry') @@ -27,7 +26,6 @@ class Login extends BaseCommand { const creds = this.npm.config.getCredentialsByURI(registry) - log.disableProgress() log.notice('', `Log in on ${replaceInfo(registry)}`) const { message, newCreds } = await auth.login(this.npm, { @@ -45,7 +43,8 @@ class Login extends BaseCommand { await this.npm.config.save('user') - this.npm.output(message) + output.standard(message) } } + module.exports = Login diff --git a/deps/npm/lib/commands/logout.js b/deps/npm/lib/commands/logout.js index 665580930639cf..dc5a0dfda0e98e 100644 --- a/deps/npm/lib/commands/logout.js +++ b/deps/npm/lib/commands/logout.js @@ -1,7 +1,7 @@ const npmFetch = require('npm-registry-fetch') const { getAuth } = npmFetch -const log = require('../utils/log-shim') -const BaseCommand = require('../base-command.js') +const { log } = require('proc-log') +const BaseCommand = require('../base-cmd.js') class Logout extends BaseCommand { static description = 'Log out of the registry' @@ -11,7 +11,7 @@ class Logout extends BaseCommand { 'scope', ] - async exec (args) { + async exec () { const registry = this.npm.config.get('registry') const scope = this.npm.config.get('scope') const regRef = scope ? `${scope}:registry` : 'registry' @@ -46,4 +46,5 @@ class Logout extends BaseCommand { await this.npm.config.save(level) } } + module.exports = Logout diff --git a/deps/npm/lib/commands/ls.js b/deps/npm/lib/commands/ls.js index 3f9775cf125040..417cb1b40d8c25 100644 --- a/deps/npm/lib/commands/ls.js +++ b/deps/npm/lib/commands/ls.js @@ -1,10 +1,12 @@ -const { resolve, relative, sep } = require('path') -const relativePrefix = `.${sep}` -const { EOL } = require('os') - +const { resolve, relative, sep } = require('node:path') const archy = require('archy') const { breadth } = require('treeverse') const npa = require('npm-package-arg') +const { output } = require('proc-log') +const ArboristWorkspaceCmd = require('../arborist-cmd.js') +const localeCompare = require('@isaacs/string-locale-compare')('en') + +const relativePrefix = `.${sep}` const _depth = Symbol('depth') const _dedupe = Symbol('dedupe') @@ -17,8 +19,6 @@ const _parent = Symbol('parent') const _problems = Symbol('problems') const _required = Symbol('required') const _type = Symbol('type') -const ArboristWorkspaceCmd = require('../arborist-cmd.js') -const localeCompare = require('@isaacs/string-locale-compare')('en') class LS extends ArboristWorkspaceCmd { static description = 'List installed packages' @@ -42,7 +42,7 @@ class LS extends ArboristWorkspaceCmd { // TODO /* istanbul ignore next */ static async completion (opts, npm) { - const completion = require('../utils/completion/installed-deep.js') + const completion = require('../utils/installed-deep.js') return completion(npm, opts) } @@ -177,11 +177,14 @@ class LS extends ArboristWorkspaceCmd { const [rootError] = tree.errors.filter(e => e.code === 'EJSONPARSE' && e.path === resolve(path, 'package.json')) - this.npm.outputBuffer( - json ? jsonOutput({ path, problems, result, rootError, seenItems }) : - parseable ? parseableOutput({ seenNodes, global, long }) : - humanOutput({ chalk, result, seenItems, unicode }) - ) + if (json) { + output.buffer(jsonOutput({ path, problems, result, rootError, seenItems })) + } else { + output.standard(parseable + ? parseableOutput({ seenNodes, global, long }) + : humanOutput({ chalk, result, seenItems, unicode }) + ) + } // if filtering items, should exit with error code on no results if (result && !result[_include] && args.length) { @@ -200,7 +203,7 @@ class LS extends ArboristWorkspaceCmd { if (shouldThrow) { throw Object.assign( - new Error([...problems].join(EOL)), + new Error([...problems].join('\n')), { code: 'ELSPROBLEMS' } ) } @@ -219,6 +222,7 @@ class LS extends ArboristWorkspaceCmd { return tree } } + module.exports = LS const isGitNode = (node) => { @@ -280,7 +284,7 @@ const augmentItemWithIncludeMetadata = (node, item) => { const getHumanOutputItem = (node, { args, chalk, global, long }) => { const { pkgid, path } = node - const workspacePkgId = chalk.green(pkgid) + const workspacePkgId = chalk.blueBright(pkgid) let printable = node.isWorkspace ? workspacePkgId : pkgid // special formatting for top-level package name @@ -289,14 +293,16 @@ const getHumanOutputItem = (node, { args, chalk, global, long }) => { if (hasNoPackageJson || global) { printable = path } else { - printable += `${long ? EOL : ' '}${path}` + printable += `${long ? '\n' : ' '}${path}` } } + // TODO there is a LOT of overlap with lib/utils/explain-dep.js here + const highlightDepName = args.length && node[_filteredBy] const missingColor = isOptional(node) - ? chalk.yellow.bgBlack - : chalk.red.bgBlack + ? chalk.yellow + : chalk.red const missingMsg = `UNMET ${isOptional(node) ? 'OPTIONAL ' : ''}DEPENDENCY` const targetLocation = node.root ? relative(node.root.realpath, node.realpath) @@ -310,30 +316,30 @@ const getHumanOutputItem = (node, { args, chalk, global, long }) => { ? missingColor(missingMsg) + ' ' : '' ) + - `${highlightDepName ? chalk.yellow.bgBlack(printable) : printable}` + + `${highlightDepName ? chalk.yellow(printable) : printable}` + ( node[_dedupe] - ? ' ' + chalk.gray('deduped') + ? ' ' + chalk.dim('deduped') : '' ) + ( invalid - ? ' ' + chalk.red.bgBlack(invalid) + ? ' ' + chalk.red(invalid) : '' ) + ( isExtraneous(node, { global }) - ? ' ' + chalk.green.bgBlack('extraneous') + ? ' ' + chalk.red('extraneous') : '' ) + ( node.overridden - ? ' ' + chalk.gray('overridden') + ? ' ' + chalk.dim('overridden') : '' ) + (isGitNode(node) ? ` (${node.resolved})` : '') + (node.isLink ? ` -> ${relativePrefix}${targetLocation}` : '') + - (long ? `${EOL}${node.package.description || ''}` : '') + (long ? `\n${node.package.description || ''}` : '') return augmentItemWithIncludeMetadata(node, { label, nodes: [] }) } @@ -551,7 +557,7 @@ const jsonOutput = ({ path, problems, result, rootError, seenItems }) => { } } - return JSON.stringify(result, null, 2) + return result } const parseableOutput = ({ global, long, seenNodes }) => { @@ -566,7 +572,7 @@ const parseableOutput = ({ global, long, seenNodes }) => { out += node[_invalid] ? ':INVALID' : '' out += node.overridden ? ':OVERRIDDEN' : '' } - out += EOL + out += '\n' } } return out.trim() diff --git a/deps/npm/lib/commands/org.js b/deps/npm/lib/commands/org.js index 1f32d41ff73068..613498056f556a 100644 --- a/deps/npm/lib/commands/org.js +++ b/deps/npm/lib/commands/org.js @@ -1,7 +1,7 @@ const liborg = require('libnpmorg') -const otplease = require('../utils/otplease.js') -const Table = require('cli-table3') -const BaseCommand = require('../base-command.js') +const { otplease } = require('../utils/auth.js') +const BaseCommand = require('../base-cmd.js') +const { output } = require('proc-log') class Org extends BaseCommand { static description = 'Manage orgs' @@ -68,14 +68,14 @@ class Org extends BaseCommand { const memDeets = await liborg.set(org, user, role, opts) if (opts.json) { - this.npm.output(JSON.stringify(memDeets, null, 2)) + output.standard(JSON.stringify(memDeets, null, 2)) } else if (opts.parseable) { - this.npm.output(['org', 'orgsize', 'user', 'role'].join('\t')) - this.npm.output( + output.standard(['org', 'orgsize', 'user', 'role'].join('\t')) + output.standard( [memDeets.org.name, memDeets.org.size, memDeets.user, memDeets.role].join('\t') ) } else if (!this.npm.silent) { - this.npm.output( + output.standard( `Added ${memDeets.user} as ${memDeets.role} to ${memDeets.org.name}. You now have ${ memDeets.org.size } member${memDeets.org.size === 1 ? '' : 's'} in this org.` @@ -100,19 +100,17 @@ class Org extends BaseCommand { org = org.replace(/^[~@]?/, '') const userCount = Object.keys(roster).length if (opts.json) { - this.npm.output( - JSON.stringify({ - user, - org, - userCount, - deleted: true, - }) - ) + output.buffer({ + user, + org, + userCount, + deleted: true, + }) } else if (opts.parseable) { - this.npm.output(['user', 'org', 'userCount', 'deleted'].join('\t')) - this.npm.output([user, org, userCount, true].join('\t')) + output.standard(['user', 'org', 'userCount', 'deleted'].join('\t')) + output.standard([user, org, userCount, true].join('\t')) } else if (!this.npm.silent) { - this.npm.output( + output.standard( `Successfully removed ${user} from ${org}. You now have ${userCount} member${ userCount === 1 ? '' : 's' } in this org.` @@ -135,21 +133,19 @@ class Org extends BaseCommand { roster = newRoster } if (opts.json) { - this.npm.output(JSON.stringify(roster, null, 2)) + output.buffer(roster) } else if (opts.parseable) { - this.npm.output(['user', 'role'].join('\t')) + output.standard(['user', 'role'].join('\t')) Object.keys(roster).forEach(u => { - this.npm.output([u, roster[u]].join('\t')) + output.standard([u, roster[u]].join('\t')) }) } else if (!this.npm.silent) { - const table = new Table({ head: ['user', 'role'] }) - Object.keys(roster) - .sort() - .forEach(u => { - table.push([u, roster[u]]) - }) - this.npm.output(table.toString()) + const chalk = this.npm.chalk + for (const u of Object.keys(roster).sort()) { + output.standard(`${u} - ${chalk.cyan(roster[u])}`) + } } } } + module.exports = Org diff --git a/deps/npm/lib/commands/outdated.js b/deps/npm/lib/commands/outdated.js index 4216f1cdb1437f..c401c0d50a5cd9 100644 --- a/deps/npm/lib/commands/outdated.js +++ b/deps/npm/lib/commands/outdated.js @@ -1,14 +1,24 @@ -const os = require('node:os') const { resolve } = require('node:path') const { stripVTControlCharacters } = require('node:util') const pacote = require('pacote') const table = require('text-table') const npa = require('npm-package-arg') const pickManifest = require('npm-pick-manifest') +const { output } = require('proc-log') const localeCompare = require('@isaacs/string-locale-compare')('en') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') +const safeNpa = (spec) => { + try { + return npa(spec) + } catch { + return null + } +} + +// This string is load bearing and is shared with Arborist +const MISSING = 'MISSING' + class Outdated extends ArboristWorkspaceCmd { static description = 'Check for outdated packages' static name = 'outdated' @@ -22,182 +32,131 @@ class Outdated extends ArboristWorkspaceCmd { 'workspace', ] - async exec (args) { - const global = resolve(this.npm.globalDir, '..') - const where = this.npm.global - ? global - : this.npm.prefix + #tree + #list = [] + #edges = new Set() + #filterSet + async exec (args) { const Arborist = require('@npmcli/arborist') const arb = new Arborist({ ...this.npm.flatOptions, - path: where, + path: this.npm.global ? resolve(this.npm.globalDir, '..') : this.npm.prefix, }) - - this.edges = new Set() - this.list = [] - this.tree = await arb.loadActual() - - if (this.workspaceNames && this.workspaceNames.length) { - this.filterSet = - arb.workspaceDependencySet( - this.tree, - this.workspaceNames, - this.npm.flatOptions.includeWorkspaceRoot - ) + this.#tree = await arb.loadActual() + + if (this.workspaceNames?.length) { + this.#filterSet = arb.workspaceDependencySet( + this.#tree, + this.workspaceNames, + this.npm.flatOptions.includeWorkspaceRoot + ) } else if (!this.npm.flatOptions.workspacesEnabled) { - this.filterSet = - arb.excludeWorkspacesDependencySet(this.tree) + this.#filterSet = arb.excludeWorkspacesDependencySet(this.#tree) } - if (args.length !== 0) { - // specific deps - for (let i = 0; i < args.length; i++) { - const nodes = this.tree.inventory.query('name', args[i]) - this.getEdges(nodes, 'edgesIn') + if (args.length) { + for (const arg of args) { + // specific deps + this.#getEdges(this.#tree.inventory.query('name', arg), 'edgesIn') } } else { if (this.npm.config.get('all')) { // all deps in tree - const nodes = this.tree.inventory.values() - this.getEdges(nodes, 'edgesOut') + this.#getEdges(this.#tree.inventory.values(), 'edgesOut') } // top-level deps - this.getEdges() + this.#getEdges() } - await Promise.all(Array.from(this.edges).map((edge) => { - return this.getOutdatedInfo(edge) - })) + await Promise.all([...this.#edges].map((e) => this.#getOutdatedInfo(e))) - // sorts list alphabetically - const outdated = this.list.sort((a, b) => localeCompare(a.name, b.name)) + // sorts list alphabetically by name and then dependent + const outdated = this.#list + .sort((a, b) => localeCompare(a.name, b.name) || localeCompare(a.dependent, b.dependent)) - if (outdated.length > 0) { + if (outdated.length) { process.exitCode = 1 } - // return if no outdated packages - if (outdated.length === 0 && !this.npm.config.get('json')) { + if (this.npm.config.get('json')) { + output.buffer(this.#json(outdated)) return } - // display results - if (this.npm.config.get('json')) { - this.npm.output(this.makeJSON(outdated)) - } else if (this.npm.config.get('parseable')) { - this.npm.output(this.makeParseable(outdated)) - } else { - const outList = outdated.map(x => this.makePretty(x)) - const outHead = ['Package', - 'Current', - 'Wanted', - 'Latest', - 'Location', - 'Depended by', - ] - - if (this.npm.config.get('long')) { - outHead.push('Package Type', 'Homepage') - } - const outTable = [outHead].concat(outList) + const res = this.npm.config.get('parseable') + ? this.#parseable(outdated) + : this.#pretty(outdated) - outTable[0] = outTable[0].map(heading => this.npm.chalk.underline(heading)) - - const tableOpts = { - align: ['l', 'r', 'r', 'r', 'l'], - stringLength: s => stripVTControlCharacters(s).length, - } - this.npm.output(table(outTable, tableOpts)) + if (res) { + output.standard(res) } } - getEdges (nodes, type) { + #getEdges (nodes, type) { // when no nodes are provided then it should only read direct deps // from the root node and its workspaces direct dependencies if (!nodes) { - this.getEdgesOut(this.tree) - this.getWorkspacesEdges() + this.#getEdgesOut(this.#tree) + this.#getWorkspacesEdges() return } for (const node of nodes) { - type === 'edgesOut' - ? this.getEdgesOut(node) - : this.getEdgesIn(node) + if (type === 'edgesOut') { + this.#getEdgesOut(node) + } else { + this.#getEdgesIn(node) + } } } - getEdgesIn (node) { + #getEdgesIn (node) { for (const edge of node.edgesIn) { - this.trackEdge(edge) + this.#trackEdge(edge) } } - getEdgesOut (node) { + #getEdgesOut (node) { // TODO: normalize usage of edges and avoid looping through nodes here - if (this.npm.global) { - for (const child of node.children.values()) { - this.trackEdge(child) - } - } else { - for (const edge of node.edgesOut.values()) { - this.trackEdge(edge) - } + const edges = this.npm.global ? node.children.values() : node.edgesOut.values() + for (const edge of edges) { + this.#trackEdge(edge) } } - trackEdge (edge) { - const filteredOut = - edge.from - && this.filterSet - && this.filterSet.size > 0 - && !this.filterSet.has(edge.from.target) - - if (filteredOut) { + #trackEdge (edge) { + if (edge.from && this.#filterSet?.size > 0 && !this.#filterSet.has(edge.from.target)) { return } - - this.edges.add(edge) + this.#edges.add(edge) } - getWorkspacesEdges (node) { + #getWorkspacesEdges () { if (this.npm.global) { return } - for (const edge of this.tree.edgesOut.values()) { - const workspace = edge - && edge.to - && edge.to.target - && edge.to.target.isWorkspace - - if (workspace) { - this.getEdgesOut(edge.to.target) + for (const edge of this.#tree.edgesOut.values()) { + if (edge?.to?.target?.isWorkspace) { + this.#getEdgesOut(edge.to.target) } } } - async getPackument (spec) { - const packument = await pacote.packument(spec, { + async #getPackument (spec) { + return pacote.packument(spec, { ...this.npm.flatOptions, fullMetadata: this.npm.config.get('long'), preferOnline: true, }) - return packument } - async getOutdatedInfo (edge) { - let alias = false - try { - alias = npa(edge.spec).subSpec - } catch (err) { - // ignore errors, no alias - } + async #getOutdatedInfo (edge) { + const alias = safeNpa(edge.spec)?.subSpec const spec = npa(alias ? alias.name : edge.name) const node = edge.to || edge - const { path, location } = node - const { version: current } = node.package || {} + const { path, location, package: { version: current } = {} } = node const type = edge.optional ? 'optionalDependencies' : edge.peer ? 'peerDependencies' @@ -212,34 +171,22 @@ class Outdated extends ArboristWorkspaceCmd { // deps different from prod not currently // on disk are not included in the output - if (edge.error === 'MISSING' && type !== 'dependencies') { + if (edge.error === MISSING && type !== 'dependencies') { return } + // if it's not a range, version, or tag, skip it + if (!safeNpa(`${edge.name}@${edge.spec}`)?.registry) { + return null + } + try { - const packument = await this.getPackument(spec) + const packument = await this.#getPackument(spec) const expected = alias ? alias.fetchSpec : edge.spec - // if it's not a range, version, or tag, skip it - try { - if (!npa(`${edge.name}@${edge.spec}`).registry) { - return null - } - } catch (err) { - return null - } const wanted = pickManifest(packument, expected, this.npm.flatOptions) const latest = pickManifest(packument, '*', this.npm.flatOptions) - - if ( - !current || - current !== wanted.version || - wanted.version !== latest.version - ) { - const dependent = edge.from ? - this.maybeWorkspaceName(edge.from) - : 'global' - - this.list.push({ + if (!current || current !== wanted.version || wanted.version !== latest.version) { + this.#list.push({ name: alias ? edge.spec.replace('npm', edge.name) : edge.name, path, type, @@ -247,123 +194,89 @@ class Outdated extends ArboristWorkspaceCmd { location, wanted: wanted.version, latest: latest.version, - dependent, + workspaceDependent: edge.from?.isWorkspace ? edge.from.pkgid : null, + dependent: edge.from?.name ?? 'global', homepage: packument.homepage, }) } } catch (err) { // silently catch and ignore ETARGET, E403 & // E404 errors, deps are just skipped - if (!( - err.code === 'ETARGET' || - err.code === 'E403' || - err.code === 'E404') - ) { + if (!['ETARGET', 'E404', 'E404'].includes(err.code)) { throw err } } } - maybeWorkspaceName (node) { - if (!node.isWorkspace) { - return node.name - } - - const humanOutput = - !this.npm.config.get('json') && !this.npm.config.get('parseable') - - const workspaceName = - humanOutput - ? node.pkgid - : node.name - - return humanOutput - ? this.npm.chalk.green(workspaceName) - : workspaceName - } - // formatting functions - makePretty (dep) { - const { - current = 'MISSING', - location = '-', - homepage = '', - name, - wanted, - latest, - type, - dependent, - } = dep - - const columns = [name, current, wanted, latest, location, dependent] - - if (this.npm.config.get('long')) { - columns[6] = type - columns[7] = homepage + + #pretty (list) { + if (!list.length) { + return } - columns[0] = this.npm.chalk[current === wanted ? 'yellow' : 'red'](columns[0]) // current - columns[2] = this.npm.chalk.green(columns[2]) // wanted - columns[3] = this.npm.chalk.magenta(columns[3]) // latest + const long = this.npm.config.get('long') + const { bold, yellow, red, cyan, blue } = this.npm.chalk - return columns + return table([ + [ + 'Package', + 'Current', + 'Wanted', + 'Latest', + 'Location', + 'Depended by', + ...long ? ['Package Type', 'Homepage'] : [], + ].map(h => bold.underline(h)), + ...list.map((d) => [ + d.current === d.wanted ? yellow(d.name) : red(d.name), + d.current ?? 'MISSING', + cyan(d.wanted), + blue(d.latest), + d.location ?? '-', + d.workspaceDependent ? blue(d.workspaceDependent) : d.dependent, + ...long ? [d.type, blue(d.homepage ?? '')] : [], + ]), + ], { + align: ['l', 'r', 'r', 'r', 'l'], + stringLength: s => stripVTControlCharacters(s).length, + }) } // --parseable creates output like this: // :::: - makeParseable (list) { - return list.map(dep => { - const { - name, - current, - wanted, - latest, - path, - dependent, - type, - homepage, - } = dep - const out = [ - path, - name + '@' + wanted, - current ? (name + '@' + current) : 'MISSING', - name + '@' + latest, - dependent, - ] - if (this.npm.config.get('long')) { - out.push(type, homepage) - } - - return out.join(':') - }).join(os.EOL) + #parseable (list) { + return list.map(d => [ + d.path, + `${d.name}@${d.wanted}`, + d.current ? `${d.name}@${d.current}` : 'MISSING', + `${d.name}@${d.latest}`, + d.dependent, + ...this.npm.config.get('long') ? [d.type, d.homepage] : [], + ].join(':')).join('\n') } - makeJSON (list) { - const out = {} - list.forEach(dep => { - const { - name, - current, - wanted, - latest, - path, - type, - dependent, - homepage, - } = dep - out[name] = { - current, - wanted, - latest, - dependent, - location: path, + #json (list) { + // TODO(BREAKING_CHANGE): this should just return an array. It's a list and + // turing it into an object with keys is lossy since multiple items in the + // list could have the same key. For now we hack that by only changing + // top level values into arrays if they have multiple outdated items + return list.reduce((acc, d) => { + const dep = { + current: d.current, + wanted: d.wanted, + latest: d.latest, + dependent: d.dependent, + location: d.path, + ...this.npm.config.get('long') ? { type: d.type, homepage: d.homepage } : {}, } - if (this.npm.config.get('long')) { - out[name].type = type - out[name].homepage = homepage - } - }) - return JSON.stringify(out, null, 2) + acc[d.name] = acc[d.name] + // If this item alread has an outdated dep then we turn it into an array + ? (Array.isArray(acc[d.name]) ? acc[d.name] : [acc[d.name]]).concat(dep) + : dep + return acc + }, {}) } } + module.exports = Outdated diff --git a/deps/npm/lib/commands/owner.js b/deps/npm/lib/commands/owner.js index 5b54dd41f3d607..0f12cf9293c30c 100644 --- a/deps/npm/lib/commands/owner.js +++ b/deps/npm/lib/commands/owner.js @@ -1,10 +1,11 @@ const npa = require('npm-package-arg') const npmFetch = require('npm-registry-fetch') const pacote = require('pacote') -const log = require('../utils/log-shim') -const otplease = require('../utils/otplease.js') +const { log, output } = require('proc-log') +const { otplease } = require('../utils/auth.js') const pkgJson = require('@npmcli/package-json') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') +const { redact } = require('@npmcli/redact') const readJson = async (path) => { try { @@ -114,12 +115,12 @@ class Owner extends BaseCommand { const packumentOpts = { ...this.npm.flatOptions, fullMetadata: true, preferOnline: true } const { maintainers } = await pacote.packument(spec, packumentOpts) if (!maintainers || !maintainers.length) { - this.npm.output('no admin found') + output.standard('no admin found') } else { - this.npm.output(maintainers.map(m => `${m.name} <${m.email}>`).join('\n')) + output.standard(maintainers.map(m => `${m.name} <${m.email}>`).join('\n')) } } catch (err) { - log.error('owner ls', "Couldn't get owner data", npmFetch.cleanUrl(pkg)) + log.error('owner ls', "Couldn't get owner data", redact(pkg)) throw err } } @@ -215,9 +216,9 @@ class Owner extends BaseCommand { }) }) if (addOrRm === 'add') { - this.npm.output(`+ ${user} (${spec.name})`) + output.standard(`+ ${user} (${spec.name})`) } else { - this.npm.output(`- ${user} (${spec.name})`) + output.standard(`- ${user} (${spec.name})`) } return res } catch (err) { diff --git a/deps/npm/lib/commands/pack.js b/deps/npm/lib/commands/pack.js index 6d5f00df55e3fc..79e7f49f819ecc 100644 --- a/deps/npm/lib/commands/pack.js +++ b/deps/npm/lib/commands/pack.js @@ -1,9 +1,9 @@ const pacote = require('pacote') const libpack = require('libnpmpack') const npa = require('npm-package-arg') -const log = require('../utils/log-shim') +const { log, output } = require('proc-log') const { getContents, logTar } = require('../utils/tar.js') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Pack extends BaseCommand { static description = 'Create a tarball from a package' @@ -53,18 +53,16 @@ class Pack extends BaseCommand { prefix: this.npm.localPrefix, workspaces: this.workspacePaths, }) - const pkgContents = await getContents(manifest, tarballData) - tarballs.push(pkgContents) + tarballs.push(await getContents(manifest, tarballData)) } - if (json) { - this.npm.output(JSON.stringify(tarballs, null, 2)) - return - } - - for (const tar of tarballs) { - logTar(tar, { unicode }) - this.npm.output(tar.filename.replace(/^@/, '').replace(/\//, '-')) + for (const [index, tar] of Object.entries(tarballs)) { + // XXX(BREAKING_CHANGE): publish outputs a json object with package + // names as keys. Pack should do the same here instead of an array + logTar(tar, { unicode, json, key: index }) + if (!json) { + output.standard(tar.filename.replace(/^@/, '').replace(/\//, '-')) + } } } @@ -83,4 +81,5 @@ class Pack extends BaseCommand { return this.exec([...this.workspacePaths, ...args.filter(a => a !== '.')]) } } + module.exports = Pack diff --git a/deps/npm/lib/commands/ping.js b/deps/npm/lib/commands/ping.js index c79e6a96cee405..3388ba1aa378e0 100644 --- a/deps/npm/lib/commands/ping.js +++ b/deps/npm/lib/commands/ping.js @@ -1,29 +1,30 @@ -const { cleanUrl } = require('npm-registry-fetch') -const log = require('../utils/log-shim') +const { redact } = require('@npmcli/redact') +const { log, output } = require('proc-log') const pingUtil = require('../utils/ping.js') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Ping extends BaseCommand { static description = 'Ping npm registry' static params = ['registry'] static name = 'ping' - async exec (args) { - const cleanRegistry = cleanUrl(this.npm.config.get('registry')) + async exec () { + const cleanRegistry = redact(this.npm.config.get('registry')) log.notice('PING', cleanRegistry) const start = Date.now() const details = await pingUtil({ ...this.npm.flatOptions }) const time = Date.now() - start log.notice('PONG', `${time}ms`) if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify({ + output.buffer({ registry: cleanRegistry, time, details, - }, null, 2)) + }) } else if (Object.keys(details).length) { - log.notice('PONG', `${JSON.stringify(details, null, 2)}`) + log.notice('PONG', JSON.stringify(details, null, 2)) } } } + module.exports = Ping diff --git a/deps/npm/lib/commands/pkg.js b/deps/npm/lib/commands/pkg.js index 49a66823cca996..a011fc10be1070 100644 --- a/deps/npm/lib/commands/pkg.js +++ b/deps/npm/lib/commands/pkg.js @@ -1,5 +1,6 @@ +const { output } = require('proc-log') const PackageJson = require('@npmcli/package-json') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') const Queryable = require('../utils/queryable.js') class Pkg extends BaseCommand { @@ -24,13 +25,7 @@ class Pkg extends BaseCommand { static workspaces = true static ignoreImplicitWorkspace = false - async exec (args, { prefix } = {}) { - if (!prefix) { - this.prefix = this.npm.localPrefix - } else { - this.prefix = prefix - } - + async exec (args, { path = this.npm.localPrefix, workspace } = {}) { if (this.npm.global) { throw Object.assign( new Error(`There's no package.json file to manage on global mode`), @@ -41,13 +36,13 @@ class Pkg extends BaseCommand { const [cmd, ..._args] = args switch (cmd) { case 'get': - return this.get(_args) + return this.get(_args, { path, workspace }) case 'set': - return this.set(_args) + return this.set(_args, { path, workspace }).then(p => p.save()) case 'delete': - return this.delete(_args) + return this.delete(_args, { path, workspace }).then(p => p.save()) case 'fix': - return this.fix(_args) + return PackageJson.fix(path).then(p => p.save()) default: throw this.usageError() } @@ -55,43 +50,36 @@ class Pkg extends BaseCommand { async execWorkspaces (args) { await this.setWorkspaces() - const result = {} - for (const [workspaceName, workspacePath] of this.workspaces.entries()) { - this.prefix = workspacePath - result[workspaceName] = await this.exec(args, { prefix: workspacePath }) + for (const [workspace, path] of this.workspaces.entries()) { + await this.exec(args, { path, workspace }) } - // when running in workspaces names, make sure to key by workspace - // name the results of each value retrieved in each ws - this.npm.output(JSON.stringify(result, null, 2)) } - async get (args) { - const pkgJson = await PackageJson.load(this.prefix) + async get (args, { path, workspace }) { + this.npm.config.set('json', true) + const pkgJson = await PackageJson.load(path) - const { content } = pkgJson - let result = !args.length && content - - if (!result) { - const q = new Queryable(content) - result = q.query(args) + let result = pkgJson.content + if (args.length) { + result = new Queryable(result).query(args) // in case there's only a single result from the query // just prints that one element to stdout + // TODO(BREAKING_CHANGE): much like other places where we unwrap single + // item arrays this should go away. it makes the behavior unknown for users + // who don't already know the shape of the data. if (Object.keys(result).length === 1) { result = result[args] } } - // only outputs if not running with workspaces config - // execWorkspaces will handle the output otherwise - if (!this.workspaces) { - this.npm.output(JSON.stringify(result, null, 2)) - } - - return result + // The display layer is responsible for calling JSON.stringify on the result + // TODO: https://github.com/npm/cli/issues/5508 a raw mode has been requested similar + // to jq -r. If that was added then this method should no longer set `json:true` all the time + output.buffer(workspace ? { [workspace]: result } : result) } - async set (args) { + async set (args, { path }) { const setError = () => this.usageError('npm pkg set expects a key=value pair of args.') @@ -101,7 +89,7 @@ class Pkg extends BaseCommand { const force = this.npm.config.get('force') const json = this.npm.config.get('json') - const pkgJson = await PackageJson.load(this.prefix) + const pkgJson = await PackageJson.load(path) const q = new Queryable(pkgJson.content) for (const arg of args) { const [key, ...rest] = arg.split('=') @@ -113,11 +101,10 @@ class Pkg extends BaseCommand { q.set(key, json ? JSON.parse(value) : value, { force }) } - pkgJson.update(q.toJSON()) - await pkgJson.save() + return pkgJson.update(q.toJSON()) } - async delete (args) { + async delete (args, { path }) { const setError = () => this.usageError('npm pkg delete expects key args.') @@ -125,7 +112,7 @@ class Pkg extends BaseCommand { throw setError() } - const pkgJson = await PackageJson.load(this.prefix) + const pkgJson = await PackageJson.load(path) const q = new Queryable(pkgJson.content) for (const key of args) { if (!key) { @@ -135,13 +122,7 @@ class Pkg extends BaseCommand { q.delete(key) } - pkgJson.update(q.toJSON()) - await pkgJson.save() - } - - async fix () { - const pkgJson = await PackageJson.fix(this.prefix) - await pkgJson.save() + return pkgJson.update(q.toJSON()) } } diff --git a/deps/npm/lib/commands/prefix.js b/deps/npm/lib/commands/prefix.js index 264b819fc7692a..da8702cf91caaf 100644 --- a/deps/npm/lib/commands/prefix.js +++ b/deps/npm/lib/commands/prefix.js @@ -1,4 +1,5 @@ -const BaseCommand = require('../base-command.js') +const { output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') class Prefix extends BaseCommand { static description = 'Display prefix' @@ -6,8 +7,9 @@ class Prefix extends BaseCommand { static params = ['global'] static usage = ['[-g]'] - async exec (args) { - return this.npm.output(this.npm.prefix) + async exec () { + return output.standard(this.npm.prefix) } } + module.exports = Prefix diff --git a/deps/npm/lib/commands/profile.js b/deps/npm/lib/commands/profile.js index a7d4ac2f29fbe7..965fcbcb8ce29b 100644 --- a/deps/npm/lib/commands/profile.js +++ b/deps/npm/lib/commands/profile.js @@ -1,13 +1,11 @@ -const inspect = require('util').inspect -const { URL } = require('url') -const log = require('../utils/log-shim.js') -const npmProfile = require('npm-profile') +const { inspect } = require('node:util') +const { URL } = require('node:url') +const { log, output } = require('proc-log') +const { get, set, createToken } = require('npm-profile') const qrcodeTerminal = require('qrcode-terminal') -const Table = require('cli-table3') - -const otplease = require('../utils/otplease.js') -const pulseTillDone = require('../utils/pulse-till-done.js') +const { otplease } = require('../utils/auth.js') const readUserInfo = require('../utils/read-user-info.js') +const BaseCommand = require('../base-cmd.js') const qrcode = url => new Promise((resolve) => qrcodeTerminal.generate(url, resolve)) @@ -35,7 +33,6 @@ const writableProfileKeys = [ 'github', ] -const BaseCommand = require('../base-command.js') class Profile extends BaseCommand { static description = 'Change settings on your registry profile' static name = 'profile' @@ -80,8 +77,6 @@ class Profile extends BaseCommand { throw this.usageError() } - log.gauge.show('profile') - const [subcmd, ...opts] = args switch (subcmd) { @@ -106,16 +101,14 @@ class Profile extends BaseCommand { async get (args) { const tfa = 'two-factor auth' - const info = await pulseTillDone.withPromise( - npmProfile.get({ ...this.npm.flatOptions }) - ) + const info = await get({ ...this.npm.flatOptions }) if (!info.cidr_whitelist) { delete info.cidr_whitelist } if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify(info, null, 2)) + output.buffer(info) return } @@ -147,23 +140,20 @@ class Profile extends BaseCommand { .filter((arg) => arg.trim() !== '') .map((arg) => cleaned[arg]) .join('\t') - this.npm.output(values) + output.standard(values) } else { if (this.npm.config.get('parseable')) { for (const key of Object.keys(info)) { if (key === 'tfa') { - this.npm.output(`${key}\t${cleaned[tfa]}`) + output.standard(`${key}\t${cleaned[tfa]}`) } else { - this.npm.output(`${key}\t${info[key]}`) + output.standard(`${key}\t${info[key]}`) } } } else { - const table = new Table() - for (const key of Object.keys(cleaned)) { - table.push({ [this.npm.chalk.bold(key)]: cleaned[key] }) + for (const [key, value] of Object.entries(cleaned)) { + output.standard(`${key}: ${value}`) } - - this.npm.output(table.toString()) } } } @@ -209,7 +199,7 @@ class Profile extends BaseCommand { } // FIXME: Work around to not clear everything other than what we're setting - const user = await pulseTillDone.withPromise(npmProfile.get(conf)) + const user = await get(conf) const newUser = {} for (const key of writableProfileKeys) { @@ -218,16 +208,16 @@ class Profile extends BaseCommand { newUser[prop] = value - const result = await otplease(this.npm, conf, c => npmProfile.set(newUser, c)) + const result = await otplease(this.npm, conf, c => set(newUser, c)) if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify({ [prop]: result[prop] }, null, 2)) + output.buffer({ [prop]: result[prop] }) } else if (this.npm.config.get('parseable')) { - this.npm.output(prop + '\t' + result[prop]) + output.standard(prop + '\t' + result[prop]) } else if (result[prop] != null) { - this.npm.output('Set', prop, 'to', result[prop]) + output.standard('Set', prop, 'to', result[prop]) } else { - this.npm.output('Set', prop) + output.standard('Set', prop) } } @@ -283,7 +273,7 @@ class Profile extends BaseCommand { if (auth.basic) { log.info('profile', 'Updating authentication to bearer token') - const result = await npmProfile.createToken( + const result = await createToken( auth.basic.password, false, [], { ...this.npm.flatOptions } ) @@ -307,16 +297,12 @@ class Profile extends BaseCommand { info.tfa.password = password log.info('profile', 'Determine if tfa is pending') - const userInfo = await pulseTillDone.withPromise( - npmProfile.get({ ...this.npm.flatOptions }) - ) + const userInfo = await get({ ...this.npm.flatOptions }) const conf = { ...this.npm.flatOptions } if (userInfo && userInfo.tfa && userInfo.tfa.pending) { log.info('profile', 'Resetting two-factor authentication') - await pulseTillDone.withPromise( - npmProfile.set({ tfa: { password, mode: 'disable' } }, conf) - ) + await set({ tfa: { password, mode: 'disable' } }, conf) } else if (userInfo && userInfo.tfa) { if (!conf.otp) { conf.otp = await readUserInfo.otp( @@ -326,12 +312,10 @@ class Profile extends BaseCommand { } log.info('profile', 'Setting two-factor authentication to ' + mode) - const challenge = await pulseTillDone.withPromise( - npmProfile.set(info, conf) - ) + const challenge = await set(info, conf) if (challenge.tfa === null) { - this.npm.output('Two factor authentication mode changed to: ' + mode) + output.standard('Two factor authentication mode changed to: ' + mode) return } @@ -348,7 +332,7 @@ class Profile extends BaseCommand { const secret = otpauth.searchParams.get('secret') const code = await qrcode(challenge.tfa) - this.npm.output( + output.standard( 'Scan into your authenticator app:\n' + code + '\n Or enter code:', secret ) @@ -357,28 +341,28 @@ class Profile extends BaseCommand { log.info('profile', 'Finalizing two-factor authentication') - const result = await npmProfile.set({ tfa: [interactiveOTP] }, conf) + const result = await set({ tfa: [interactiveOTP] }, conf) - this.npm.output( + output.standard( '2FA successfully enabled. Below are your recovery codes, ' + 'please print these out.' ) - this.npm.output( + output.standard( 'You will need these to recover access to your account ' + 'if you lose your authentication device.' ) for (const tfaCode of result.tfa) { - this.npm.output('\t' + tfaCode) + output.standard('\t' + tfaCode) } } - async disable2fa (args) { + async disable2fa () { const conf = { ...this.npm.flatOptions } - const info = await pulseTillDone.withPromise(npmProfile.get(conf)) + const info = await get(conf) if (!info.tfa || info.tfa.pending) { - this.npm.output('Two factor authentication not enabled.') + output.standard('Two factor authentication not enabled.') return } @@ -391,17 +375,16 @@ class Profile extends BaseCommand { log.info('profile', 'disabling tfa') - await pulseTillDone.withPromise(npmProfile.set({ - tfa: { password: password, mode: 'disable' }, - }, conf)) + await set({ tfa: { password: password, mode: 'disable' } }, conf) if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify({ tfa: false }, null, 2)) + output.buffer({ tfa: false }) } else if (this.npm.config.get('parseable')) { - this.npm.output('tfa\tfalse') + output.standard('tfa\tfalse') } else { - this.npm.output('Two factor authentication disabled.') + output.standard('Two factor authentication disabled.') } } } + module.exports = Profile diff --git a/deps/npm/lib/commands/prune.js b/deps/npm/lib/commands/prune.js index 189fc29cb8bc35..1bcf8a9576316c 100644 --- a/deps/npm/lib/commands/prune.js +++ b/deps/npm/lib/commands/prune.js @@ -1,7 +1,7 @@ -// prune extraneous packages const reifyFinish = require('../utils/reify-finish.js') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') + +// prune extraneous packages class Prune extends ArboristWorkspaceCmd { static description = 'Remove extraneous packages' static name = 'prune' @@ -30,4 +30,5 @@ class Prune extends ArboristWorkspaceCmd { await reifyFinish(this.npm, arb) } } + module.exports = Prune diff --git a/deps/npm/lib/commands/publish.js b/deps/npm/lib/commands/publish.js index 0456fd7e8320e6..c2cd3cf9c927b6 100644 --- a/deps/npm/lib/commands/publish.js +++ b/deps/npm/lib/commands/publish.js @@ -1,4 +1,4 @@ -const log = require('../utils/log-shim.js') +const { log, output } = require('proc-log') const semver = require('semver') const pack = require('libnpmpack') const libpub = require('libnpmpublish').publish @@ -7,18 +7,16 @@ const pacote = require('pacote') const npa = require('npm-package-arg') const npmFetch = require('npm-registry-fetch') const { redactLog: replaceInfo } = require('@npmcli/redact') - -const otplease = require('../utils/otplease.js') +const { otplease } = require('../utils/auth.js') const { getContents, logTar } = require('../utils/tar.js') - // for historical reasons, publishConfig in package.json can contain ANY config // keys that npm supports in .npmrc files and elsewhere. We *may* want to // revisit this at some point, and have a minimal set that's a SemVer-major // change that ought to get a RFC written on it. const { flatten } = require('@npmcli/config/lib/definitions') const pkgJson = require('@npmcli/package-json') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Publish extends BaseCommand { static description = 'Publish a package' static name = 'publish' @@ -45,6 +43,31 @@ class Publish extends BaseCommand { throw this.usageError() } + await this.#publish(args) + } + + async execWorkspaces (args) { + const useWorkspaces = args.length === 0 || args.includes('.') + if (!useWorkspaces) { + log.warn('Ignoring workspaces for specified package(s)') + return this.exec(args) + } + await this.setWorkspaces() + + for (const [name, workspace] of this.workspaces.entries()) { + try { + await this.#publish([workspace], { workspace: name }) + } catch (err) { + if (err.code !== 'EPRIVATE') { + throw err + } + // eslint-disable-next-line max-len + log.warn('publish', `Skipping workspace ${this.npm.chalk.cyan(name)}, marked as ${this.npm.chalk.bold('private')}`) + } + } + } + + async #publish (args, { workspace } = {}) { log.verbose('publish', replaceInfo(args)) const unicode = this.npm.config.get('unicode') @@ -59,12 +82,11 @@ class Publish extends BaseCommand { } const opts = { ...this.npm.flatOptions, progress: false } - log.disableProgress() // you can publish name@version, ./foo.tgz, etc. // even though the default is the 'file:.' cwd. const spec = npa(args[0]) - let manifest = await this.getManifest(spec, opts) + let manifest = await this.#getManifest(spec, opts) // only run scripts for directory type publishes if (spec.type === 'directory' && !ignoreScripts) { @@ -73,7 +95,6 @@ class Publish extends BaseCommand { path: spec.fetchSpec, stdio: 'inherit', pkg: manifest, - banner: !silent, }) } @@ -88,23 +109,38 @@ class Publish extends BaseCommand { workspaces: this.workspacePaths, }) const pkgContents = await getContents(manifest, tarballData) + const logPkg = () => logTar(pkgContents, { unicode, json, key: workspace }) // The purpose of re-reading the manifest is in case it changed, // so that we send the latest and greatest thing to the registry // note that publishConfig might have changed as well! - manifest = await this.getManifest(spec, opts, true) + manifest = await this.#getManifest(spec, opts, true) - // JSON already has the package contents + // If we are not in JSON mode then we show the user the contents of the tarball + // before it is published so they can see it while their otp is pending if (!json) { - logTar(pkgContents, { unicode }) + logPkg() } const resolved = npa.resolve(manifest.name, manifest.version) + + // make sure tag is valid, this will throw if invalid + npa(`${manifest.name}@${defaultTag}`) + const registry = npmFetch.pickRegistry(resolved, opts) const creds = this.npm.config.getCredentialsByURI(registry) const noCreds = !(creds.token || creds.username || creds.certfile && creds.keyfile) const outputRegistry = replaceInfo(registry) + // if a workspace package is marked private then we skip it + if (workspace && manifest.private) { + throw Object.assign( + new Error(`This package has been marked as private + Remove the 'private' field from the package.json to publish it.`), + { code: 'EPRIVATE' } + ) + } + if (noCreds) { const msg = `This command requires you to be logged in to ${outputRegistry}` if (dryRun) { @@ -126,13 +162,18 @@ class Publish extends BaseCommand { await otplease(this.npm, opts, o => libpub(manifest, tarballData, o)) } + // In json mode we dont log until the publish has completed as this will + // add it to the output only if completes successfully + if (json) { + logPkg() + } + if (spec.type === 'directory' && !ignoreScripts) { await runScript({ event: 'publish', path: spec.fetchSpec, stdio: 'inherit', pkg: manifest, - banner: !silent, }) await runScript({ @@ -140,66 +181,18 @@ class Publish extends BaseCommand { path: spec.fetchSpec, stdio: 'inherit', pkg: manifest, - banner: !silent, }) } - if (!this.suppressOutput) { - if (!silent && json) { - this.npm.output(JSON.stringify(pkgContents, null, 2)) - } else if (!silent) { - this.npm.output(`+ ${pkgContents.id}`) - } - } - - return pkgContents - } - - async execWorkspaces (args) { - // Suppresses JSON output in publish() so we can handle it here - this.suppressOutput = true - - const results = {} - const json = this.npm.config.get('json') - const { silent } = this.npm - await this.setWorkspaces() - - for (const [name, workspace] of this.workspaces.entries()) { - let pkgContents - try { - pkgContents = await this.exec([workspace]) - } catch (err) { - if (err.code === 'EPRIVATE') { - log.warn( - 'publish', - `Skipping workspace ${ - this.npm.chalk.green(name) - }, marked as ${ - this.npm.chalk.bold('private') - }` - ) - continue - } - throw err - } - // This needs to be in-line w/ the rest of the output that non-JSON - // publish generates - if (!silent && !json) { - this.npm.output(`+ ${pkgContents.id}`) - } else { - results[name] = pkgContents - } - } - - if (!silent && json) { - this.npm.output(JSON.stringify(results, null, 2)) + if (!json && !silent) { + output.standard(`+ ${pkgContents.id}`) } } // if it's a directory, read it from the file system // otherwise, get the full metadata from whatever it is // XXX can't pacote read the manifest from a directory? - async getManifest (spec, opts, logWarnings = false) { + async #getManifest (spec, opts, logWarnings = false) { let manifest if (spec.type === 'directory') { const changes = [] @@ -220,9 +213,15 @@ class Publish extends BaseCommand { }) } if (manifest.publishConfig) { - flatten(manifest.publishConfig, opts) + const cliFlags = this.npm.config.data.get('cli').raw + // Filter out properties set in CLI flags to prioritize them over + // corresponding `publishConfig` settings + const filteredPublishConfig = Object.fromEntries( + Object.entries(manifest.publishConfig).filter(([key]) => !(key in cliFlags))) + flatten(filteredPublishConfig, opts) } return manifest } } + module.exports = Publish diff --git a/deps/npm/lib/commands/query.js b/deps/npm/lib/commands/query.js index dfa1356ebf436d..74a50fc581d43e 100644 --- a/deps/npm/lib/commands/query.js +++ b/deps/npm/lib/commands/query.js @@ -1,8 +1,6 @@ -'use strict' - -const { resolve } = require('path') -const BaseCommand = require('../base-command.js') -const log = require('../utils/log-shim.js') +const { resolve } = require('node:path') +const BaseCommand = require('../base-cmd.js') +const { log, output } = require('proc-log') class QuerySelectorItem { constructor (node) { @@ -53,70 +51,71 @@ class Query extends BaseCommand { 'expect-results', ] - get parsedResponse () { - return JSON.stringify(this.#response, null, 2) + constructor (...args) { + super(...args) + this.npm.config.set('json', true) } async exec (args) { - // one dir up from wherever node_modules lives - const where = resolve(this.npm.dir, '..') + const packageLock = this.npm.config.get('package-lock-only') const Arborist = require('@npmcli/arborist') - const opts = { + const arb = new Arborist({ ...this.npm.flatOptions, - path: where, - forceActual: true, - } - const arb = new Arborist(opts) + // one dir up from wherever node_modules lives + path: resolve(this.npm.dir, '..'), + forceActual: !packageLock, + }) let tree - if (this.npm.config.get('package-lock-only')) { + if (packageLock) { try { tree = await arb.loadVirtual() } catch (err) { log.verbose('loadVirtual', err.stack) - /* eslint-disable-next-line max-len */ - throw this.usageError('A package lock or shrinkwrap file is required in package-lock-only mode') + throw this.usageError( + 'A package lock or shrinkwrap file is required in package-lock-only mode' + ) } } else { - tree = await arb.loadActual(opts) + tree = await arb.loadActual() } - const items = await tree.querySelectorAll(args[0], this.npm.flatOptions) - this.buildResponse(items) - - this.checkExpected(this.#response.length) - this.npm.output(this.parsedResponse) + await this.#queryTree(tree, args[0]) + this.#output() } async execWorkspaces (args) { await this.setWorkspaces() const Arborist = require('@npmcli/arborist') - const opts = { + const arb = new Arborist({ ...this.npm.flatOptions, path: this.npm.prefix, + }) + // FIXME: Workspace support in query does not work as expected so this does not + // do the same package-lock-only check as this.exec(). + // https://github.com/npm/cli/pull/6732#issuecomment-1708804921 + const tree = await arb.loadActual() + for (const path of this.workspacePaths) { + const wsTree = path === tree.root.path + ? tree // --includes-workspace-root + : await tree.querySelectorAll(`.workspace:path(${path})`).then(r => r[0].target) + await this.#queryTree(wsTree, args[0]) } - const arb = new Arborist(opts) - const tree = await arb.loadActual(opts) - for (const workspacePath of this.workspacePaths) { - let items - if (workspacePath === tree.root.path) { - // include-workspace-root - items = await tree.querySelectorAll(args[0]) - } else { - const [workspace] = await tree.querySelectorAll(`.workspace:path(${workspacePath})`) - items = await workspace.target.querySelectorAll(args[0], this.npm.flatOptions) - } - this.buildResponse(items) - } + this.#output() + } + + #output () { this.checkExpected(this.#response.length) - this.npm.output(this.parsedResponse) + output.buffer(this.#response) } // builds a normalized inventory - buildResponse (items) { + async #queryTree (tree, arg) { + const items = await tree.querySelectorAll(arg, this.npm.flatOptions) for (const node of items) { - if (!node.target.location || !this.#seen.has(node.target.location)) { + const { location } = node.target + if (!location || !this.#seen.has(location)) { const item = new QuerySelectorItem(node) this.#response.push(item) - if (node.target.location) { + if (location) { this.#seen.add(item.location) } } diff --git a/deps/npm/lib/commands/rebuild.js b/deps/npm/lib/commands/rebuild.js index 8af96f725555cb..1c19836106e063 100644 --- a/deps/npm/lib/commands/rebuild.js +++ b/deps/npm/lib/commands/rebuild.js @@ -1,8 +1,9 @@ -const { resolve } = require('path') +const { resolve } = require('node:path') +const { output } = require('proc-log') const npa = require('npm-package-arg') const semver = require('semver') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') + class Rebuild extends ArboristWorkspaceCmd { static description = 'Rebuild a package' static name = 'rebuild' @@ -19,7 +20,7 @@ class Rebuild extends ArboristWorkspaceCmd { // TODO /* istanbul ignore next */ static async completion (opts, npm) { - const completion = require('../utils/completion/installed-deep.js') + const completion = require('../utils/installed-deep.js') return completion(npm, opts) } @@ -56,7 +57,7 @@ class Rebuild extends ArboristWorkspaceCmd { await arb.rebuild() } - this.npm.output('rebuilt dependencies successfully') + output.standard('rebuilt dependencies successfully') } isNode (specs, node) { @@ -79,4 +80,5 @@ class Rebuild extends ArboristWorkspaceCmd { }) } } + module.exports = Rebuild diff --git a/deps/npm/lib/commands/repo.js b/deps/npm/lib/commands/repo.js index b89b74c0bf1baa..3f120c0a3f59f5 100644 --- a/deps/npm/lib/commands/repo.js +++ b/deps/npm/lib/commands/repo.js @@ -1,6 +1,6 @@ -const { URL } = require('url') - +const { URL } = require('node:url') const PackageUrlCmd = require('../package-url-cmd.js') + class Repo extends PackageUrlCmd { static description = 'Open package repository page in the browser' static name = 'repo' @@ -30,6 +30,7 @@ class Repo extends PackageUrlCmd { return url } } + module.exports = Repo const unknownHostedUrl = url => { diff --git a/deps/npm/lib/commands/root.js b/deps/npm/lib/commands/root.js index 7749c602456b77..180f4c4ed0720a 100644 --- a/deps/npm/lib/commands/root.js +++ b/deps/npm/lib/commands/root.js @@ -1,11 +1,14 @@ -const BaseCommand = require('../base-command.js') +const { output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') + class Root extends BaseCommand { static description = 'Display npm root' static name = 'root' static params = ['global'] async exec () { - this.npm.output(this.npm.dir) + output.standard(this.npm.dir) } } + module.exports = Root diff --git a/deps/npm/lib/commands/run-script.js b/deps/npm/lib/commands/run-script.js index 75f00a46b84e9f..50c745d6d9c078 100644 --- a/deps/npm/lib/commands/run-script.js +++ b/deps/npm/lib/commands/run-script.js @@ -1,22 +1,9 @@ -const runScript = require('@npmcli/run-script') -const { isServerPackage } = runScript +const { output } = require('proc-log') const pkgJson = require('@npmcli/package-json') -const log = require('../utils/log-shim.js') -const didYouMean = require('../utils/did-you-mean.js') -const { isWindowsShell } = require('../utils/is-windows.js') - -const cmdList = [ - 'publish', - 'install', - 'uninstall', - 'test', - 'stop', - 'start', - 'restart', - 'version', -].reduce((l, p) => l.concat(['pre' + p, p, 'post' + p]), []) - -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') +const { getError } = require('../utils/error-message.js') +const { outputError } = require('../utils/output-error.js') + class RunScript extends BaseCommand { static description = 'Run arbitrary package scripts' static params = [ @@ -34,12 +21,13 @@ class RunScript extends BaseCommand { static workspaces = true static ignoreImplicitWorkspace = false static isShellout = true + static checkDevEngines = true static async completion (opts, npm) { const argv = opts.conf.argv.remain if (argv.length === 2) { const { content: { scripts = {} } } = await pkgJson.normalize(npm.localPrefix) - .catch(er => ({ content: {} })) + .catch(() => ({ content: {} })) if (opts.isFish) { return Object.keys(scripts).map(s => `${s}\t${scripts[s].slice(0, 30)}`) } @@ -49,34 +37,60 @@ class RunScript extends BaseCommand { async exec (args) { if (args.length) { - return this.run(args) + await this.#run(args, { path: this.npm.localPrefix }) } else { - return this.list(args) + await this.#list(this.npm.localPrefix) } } async execWorkspaces (args) { - if (args.length) { - return this.runWorkspaces(args) - } else { - return this.listWorkspaces(args) + await this.setWorkspaces() + + const ws = [...this.workspaces.entries()] + for (const [workspace, path] of ws) { + const last = path === ws.at(-1)[1] + + if (!args.length) { + const newline = await this.#list(path, { workspace }) + if (newline && !last) { + output.standard('') + } + continue + } + + const pkg = await pkgJson.normalize(path).then(p => p.content) + try { + await this.#run(args, { path, pkg, workspace }) + } catch (e) { + const err = getError(e, { npm: this.npm, command: null }) + outputError({ + ...err, + error: [ + ['', `Lifecycle script \`${args[0]}\` failed with error:`], + ...err.error, + ['workspace', pkg._id || pkg.name], + ['location', path], + ], + }) + process.exitCode = err.exitCode + if (!last) { + output.error('') + } + } } } - async run ([event, ...args], { path = this.npm.localPrefix, pkg } = {}) { - // this || undefined is because runScript will be unhappy with the default - // null value - const scriptShell = this.npm.config.get('script-shell') || undefined + async #run ([event, ...args], { path, pkg, workspace }) { + const runScript = require('@npmcli/run-script') + + pkg ??= await pkgJson.normalize(path).then(p => p.content) - if (!pkg) { - const { content } = await pkgJson.normalize(path) - pkg = content - } const { scripts = {} } = pkg if (event === 'restart' && !scripts.restart) { scripts.restart = 'npm stop --if-present && npm start' } else if (event === 'env' && !scripts.env) { + const { isWindowsShell } = require('../utils/is-windows.js') scripts.env = isWindowsShell ? 'SET' : 'env' } @@ -84,16 +98,21 @@ class RunScript extends BaseCommand { if ( !Object.prototype.hasOwnProperty.call(scripts, event) && - !(event === 'start' && (await isServerPackage(path))) + !(event === 'start' && (await runScript.isServerPackage(path))) ) { if (this.npm.config.get('if-present')) { return } - const suggestions = await didYouMean(path, event) - throw new Error( - `Missing script: "${event}"${suggestions}\n\nTo see a list of scripts, run:\n npm run` - ) + const suggestions = require('../utils/did-you-mean.js')(pkg, event) + const wsArg = workspace && path !== this.npm.localPrefix + ? ` --workspace=${pkg._id || pkg.name}` + : '' + throw new Error([ + `Missing script: "${event}"${suggestions}\n`, + 'To see a list of scripts, run:', + ` npm run${wsArg}`, + ].join('\n')) } // positional args only added to the main event, not pre/post @@ -108,141 +127,91 @@ class RunScript extends BaseCommand { } } - const opts = { - path, - args, - scriptShell, - stdio: 'inherit', - pkg, - banner: !this.npm.silent, - } - for (const [ev, evArgs] of events) { await runScript({ - ...opts, + path, + // this || undefined is because runScript will be unhappy with the + // default null value + scriptShell: this.npm.config.get('script-shell') || undefined, + stdio: 'inherit', + pkg, event: ev, args: evArgs, }) } } - async list (args, path) { - /* eslint-disable-next-line max-len */ - const { content: { scripts, name, _id } } = await pkgJson.normalize(path || this.npm.localPrefix) - const pkgid = _id || name - - if (!scripts) { - return [] - } + async #list (path, { workspace } = {}) { + const { scripts = {}, name, _id } = await pkgJson.normalize(path).then(p => p.content) + const scriptEntries = Object.entries(scripts) - const allScripts = Object.keys(scripts) if (this.npm.silent) { - return allScripts + return } if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify(scripts, null, 2)) - return allScripts - } - - if (this.npm.config.get('parseable')) { - for (const [script, cmd] of Object.entries(scripts)) { - this.npm.output(`${script}:${cmd}`) - } - - return allScripts - } - - const indent = '\n ' - const prefix = ' ' - const cmds = [] - const runScripts = [] - for (const script of allScripts) { - const list = cmdList.includes(script) ? cmds : runScripts - list.push(script) - } - const colorize = this.npm.chalk - - if (cmds.length) { - this.npm.output( - `${colorize.reset(colorize.bold('Lifecycle scripts'))} included in ${colorize.green( - pkgid - )}:` - ) - } - - for (const script of cmds) { - this.npm.output(prefix + script + indent + colorize.dim(scripts[script])) - } - - if (!cmds.length && runScripts.length) { - this.npm.output( - `${colorize.bold('Scripts')} available in ${colorize.green(pkgid)} via \`${colorize.blue( - 'npm run-script' - )}\`:` - ) - } else if (runScripts.length) { - this.npm.output(`\navailable via \`${colorize.blue('npm run-script')}\`:`) - } - - for (const script of runScripts) { - this.npm.output(prefix + script + indent + colorize.dim(scripts[script])) + output.buffer(workspace ? { [workspace]: scripts } : scripts) + return } - this.npm.output('') - return allScripts - } - - async runWorkspaces (args, filters) { - const res = [] - await this.setWorkspaces() - - for (const workspacePath of this.workspacePaths) { - const { content: pkg } = await pkgJson.normalize(workspacePath) - const runResult = await this.run(args, { - path: workspacePath, - pkg, - }).catch(err => { - log.error(`Lifecycle script \`${args[0]}\` failed with error:`) - log.error(err) - log.error(` in workspace: ${pkg._id || pkg.name}`) - log.error(` at location: ${workspacePath}`) - process.exitCode = 1 - }) - res.push(runResult) + if (!scriptEntries.length) { + return } - } - - async listWorkspaces (args, filters) { - await this.setWorkspaces() - if (this.npm.silent) { + if (this.npm.config.get('parseable')) { + output.standard(scriptEntries + .map((s) => (workspace ? [workspace, ...s] : s).join(':')) + .join('\n') + .trim()) return } - if (this.npm.config.get('json')) { - const res = {} - for (const workspacePath of this.workspacePaths) { - const { content: { scripts, name } } = await pkgJson.normalize(workspacePath) - res[name] = { ...scripts } + const cmdList = [ + 'prepare', 'prepublishOnly', + 'prepack', 'postpack', + 'dependencies', + 'preinstall', 'install', 'postinstall', + 'prepublish', 'publish', 'postpublish', + 'prerestart', 'restart', 'postrestart', + 'prestart', 'start', 'poststart', + 'prestop', 'stop', 'poststop', + 'pretest', 'test', 'posttest', + 'preuninstall', 'uninstall', 'postuninstall', + 'preversion', 'version', 'postversion', + ] + const [cmds, runScripts] = scriptEntries.reduce((acc, s) => { + acc[cmdList.includes(s[0]) ? 0 : 1].push(s) + return acc + }, [[], []]) + + const { reset, bold, cyan, dim, blue } = this.npm.chalk + const pkgId = `in ${cyan(_id || name)}` + const title = (t) => reset(bold(t)) + + if (cmds.length) { + output.standard(`${title('Lifecycle scripts')} included ${pkgId}:`) + for (const [k, v] of cmds) { + output.standard(` ${k}`) + output.standard(` ${dim(v)}`) } - this.npm.output(JSON.stringify(res, null, 2)) - return } - if (this.npm.config.get('parseable')) { - for (const workspacePath of this.workspacePaths) { - const { content: { scripts, name } } = await pkgJson.normalize(workspacePath) - for (const [script, cmd] of Object.entries(scripts || {})) { - this.npm.output(`${name}:${script}:${cmd}`) - } + if (runScripts.length) { + const via = `via \`${blue('npm run-script')}\`:` + if (!cmds.length) { + output.standard(`${title('Scripts')} available ${pkgId} ${via}`) + } else { + output.standard(`available ${via}`) + } + for (const [k, v] of runScripts) { + output.standard(` ${k}`) + output.standard(` ${dim(v)}`) } - return } - for (const workspacePath of this.workspacePaths) { - await this.list(args, workspacePath) - } + // Return true to indicate that something was output for this path + // that should be separated from others + return true } } diff --git a/deps/npm/lib/commands/sbom.js b/deps/npm/lib/commands/sbom.js index 311dfbc852406d..278c6d506b42af 100644 --- a/deps/npm/lib/commands/sbom.js +++ b/deps/npm/lib/commands/sbom.js @@ -1,9 +1,6 @@ -'use strict' - -const { EOL } = require('os') const localeCompare = require('@isaacs/string-locale-compare')('en') -const BaseCommand = require('../base-command.js') -const log = require('../utils/log-shim.js') +const BaseCommand = require('../base-cmd.js') +const { log, output } = require('proc-log') const { cyclonedxOutput } = require('../utils/sbom-cyclonedx.js') const { spdxOutput } = require('../utils/sbom-spdx.js') @@ -25,10 +22,6 @@ class SBOM extends BaseCommand { 'workspaces', ] - get #parsedResponse () { - return JSON.stringify(this.#response, null, 2) - } - async exec () { const sbomFormat = this.npm.config.get('sbom-format') const packageLockOnly = this.npm.config.get('package-lock-only') @@ -38,56 +31,43 @@ class SBOM extends BaseCommand { throw this.usageError(`Must specify --sbom-format flag with one of: ${SBOM_FORMATS.join(', ')}.`) } - const Arborist = require('@npmcli/arborist') - const opts = { ...this.npm.flatOptions, path: this.npm.prefix, forceActual: true, } + const Arborist = require('@npmcli/arborist') const arb = new Arborist(opts) - let tree - if (packageLockOnly) { - try { - tree = await arb.loadVirtual(opts) - } catch (err) { - /* eslint-disable-next-line max-len */ - throw this.usageError('A package lock or shrinkwrap file is required in package-lock-only mode') - } - } else { - tree = await arb.loadActual(opts) - } + const tree = packageLockOnly ? await arb.loadVirtual(opts).catch(() => { + /* eslint-disable-next-line max-len */ + throw this.usageError('A package lock or shrinkwrap file is required in package-lock-only mode') + }) : await arb.loadActual(opts) // Collect the list of selected workspaces in the project - let wsNodes - if (this.workspaceNames && this.workspaceNames.length) { - wsNodes = arb.workspaceNodes(tree, this.workspaceNames) - } + const wsNodes = this.workspaceNames?.length + ? arb.workspaceNodes(tree, this.workspaceNames) + : null // Build the selector and query the tree for the list of nodes const selector = this.#buildSelector({ wsNodes }) log.info('sbom', `Using dependency selector: ${selector}`) const items = await tree.querySelectorAll(selector) - const errors = new Set() - for (const node of items) { - detectErrors(node).forEach(error => errors.add(error)) - } - - if (errors.size > 0) { - throw Object.assign( - new Error([...errors].join(EOL)), - { code: 'ESBOMPROBLEMS' } - ) + const errors = items.flatMap(node => detectErrors(node)) + if (errors.length) { + throw Object.assign(new Error([...new Set(errors)].join('\n')), { + code: 'ESBOMPROBLEMS', + }) } // Populate the response with the list of unique nodes (sorted by location) - this.#buildResponse( - items - .sort((a, b) => localeCompare(a.location, b.location)) - ) - this.npm.output(this.#parsedResponse) + this.#buildResponse(items.sort((a, b) => localeCompare(a.location, b.location))) + + // TODO(BREAKING_CHANGE): all sbom output is in json mode but setting it before + // any of the errors will cause those to be thrown in json mode. + this.npm.config.set('json', true) + output.buffer(this.#response) } async execWorkspaces (args) { @@ -125,10 +105,9 @@ class SBOM extends BaseCommand { const packageType = this.npm.config.get('sbom-type') const packageLockOnly = this.npm.config.get('package-lock-only') - this.#response = - sbomFormat === 'cyclonedx' - ? cyclonedxOutput({ npm: this.npm, nodes: items, packageType, packageLockOnly }) - : spdxOutput({ npm: this.npm, nodes: items, packageType }) + this.#response = sbomFormat === 'cyclonedx' + ? cyclonedxOutput({ npm: this.npm, nodes: items, packageType, packageLockOnly }) + : spdxOutput({ npm: this.npm, nodes: items, packageType }) } } diff --git a/deps/npm/lib/commands/search.js b/deps/npm/lib/commands/search.js index bb94d6da20f1c1..8b6c01e3930d81 100644 --- a/deps/npm/lib/commands/search.js +++ b/deps/npm/lib/commands/search.js @@ -1,43 +1,13 @@ -const { Minipass } = require('minipass') const Pipeline = require('minipass-pipeline') const libSearch = require('libnpmsearch') -const log = require('../utils/log-shim.js') - +const { log, output } = require('proc-log') const formatSearchStream = require('../utils/format-search-stream.js') +const BaseCommand = require('../base-cmd.js') -function filter (data, include, exclude) { - const words = [data.name] - .concat(data.maintainers.map(m => `=${m.username}`)) - .concat(data.keywords || []) - .map(f => f && f.trim && f.trim()) - .filter(f => f) - .join(' ') - .toLowerCase() - - if (exclude.find(e => match(words, e))) { - return false - } - - return true -} - -function match (words, pattern) { - if (pattern.startsWith('/')) { - if (pattern.endsWith('/')) { - pattern = pattern.slice(0, -1) - } - pattern = new RegExp(pattern.slice(1)) - return words.match(pattern) - } - return words.indexOf(pattern) !== -1 -} - -const BaseCommand = require('../base-command.js') class Search extends BaseCommand { static description = 'Search for packages' static name = 'search' static params = [ - 'long', 'json', 'color', 'parseable', @@ -51,13 +21,13 @@ class Search extends BaseCommand { 'offline', ] - static usage = ['[search terms ...]'] + static usage = [' [ ...]'] async exec (args) { const opts = { ...this.npm.flatOptions, ...this.npm.flatOptions.search, - include: args.map(s => s.toLowerCase()).filter(s => s), + include: args.map(s => s.toLowerCase()).filter(Boolean), exclude: this.npm.flatOptions.search.exclude.split(/\s+/), } @@ -68,30 +38,16 @@ class Search extends BaseCommand { // Used later to figure out whether we had any packages go out let anyOutput = false - class FilterStream extends Minipass { - constructor () { - super({ objectMode: true }) - } - - write (pkg) { - if (filter(pkg, opts.include, opts.exclude)) { - super.write(pkg) - } - } - } - - const filterStream = new FilterStream() - // Grab a configured output stream that will spit out packages in the desired format. - const outputStream = await formatSearchStream({ + const outputStream = formatSearchStream({ args, // --searchinclude options are not highlighted ...opts, + npm: this.npm, }) log.silly('search', 'searching packages') const p = new Pipeline( libSearch.stream(opts.include, opts), - filterStream, outputStream ) @@ -99,16 +55,16 @@ class Search extends BaseCommand { if (!anyOutput) { anyOutput = true } - this.npm.output(chunk.toString('utf8')) + output.standard(chunk.toString('utf8')) }) await p.promise() if (!anyOutput && !this.npm.config.get('json') && !this.npm.config.get('parseable')) { - this.npm.output('No matches found for ' + (args.map(JSON.stringify).join(' '))) + output.standard('No matches found for ' + (args.map(JSON.stringify).join(' '))) } log.silly('search', 'search completed') - log.clearProgress() } } + module.exports = Search diff --git a/deps/npm/lib/commands/set.js b/deps/npm/lib/commands/set.js index f315d183845c5e..2e61762ba9dcd4 100644 --- a/deps/npm/lib/commands/set.js +++ b/deps/npm/lib/commands/set.js @@ -1,5 +1,5 @@ const Npm = require('../npm.js') -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Set extends BaseCommand { static description = 'Set a value in the npm configuration' @@ -22,4 +22,5 @@ class Set extends BaseCommand { return this.npm.exec('config', ['set'].concat(args)) } } + module.exports = Set diff --git a/deps/npm/lib/commands/shrinkwrap.js b/deps/npm/lib/commands/shrinkwrap.js index c6d817d4801423..86215c18e62dd8 100644 --- a/deps/npm/lib/commands/shrinkwrap.js +++ b/deps/npm/lib/commands/shrinkwrap.js @@ -1,7 +1,8 @@ -const { resolve, basename } = require('path') -const { unlink } = require('fs').promises -const log = require('../utils/log-shim') -const BaseCommand = require('../base-command.js') +const { resolve, basename } = require('node:path') +const { unlink } = require('node:fs/promises') +const { log } = require('proc-log') +const BaseCommand = require('../base-cmd.js') + class Shrinkwrap extends BaseCommand { static description = 'Lock down dependency versions for publication' static name = 'shrinkwrap' @@ -68,4 +69,5 @@ class Shrinkwrap extends BaseCommand { } } } + module.exports = Shrinkwrap diff --git a/deps/npm/lib/commands/star.js b/deps/npm/lib/commands/star.js index 20039bf8938116..1b76955810c726 100644 --- a/deps/npm/lib/commands/star.js +++ b/deps/npm/lib/commands/star.js @@ -1,9 +1,9 @@ const fetch = require('npm-registry-fetch') const npa = require('npm-package-arg') -const log = require('../utils/log-shim') +const { log, output } = require('proc-log') const getIdentity = require('../utils/get-identity') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Star extends BaseCommand { static description = 'Mark your favorite packages' static name = 'star' @@ -62,10 +62,11 @@ class Star extends BaseCommand { body, }) - this.npm.output(show + ' ' + pkg.name) + output.standard(show + ' ' + pkg.name) log.verbose('star', data) return data } } } + module.exports = Star diff --git a/deps/npm/lib/commands/stars.js b/deps/npm/lib/commands/stars.js index 4214134eb5871a..1059569979dafe 100644 --- a/deps/npm/lib/commands/stars.js +++ b/deps/npm/lib/commands/stars.js @@ -1,8 +1,8 @@ const fetch = require('npm-registry-fetch') -const log = require('../utils/log-shim') +const { log, output } = require('proc-log') const getIdentity = require('../utils/get-identity.js') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Stars extends BaseCommand { static description = 'View packages marked as favorites' static name = 'stars' @@ -25,7 +25,7 @@ class Stars extends BaseCommand { } for (const row of rows) { - this.npm.output(row.value) + output.standard(row.value) } } catch (err) { if (err.code === 'ENEEDAUTH') { @@ -35,4 +35,5 @@ class Stars extends BaseCommand { } } } + module.exports = Stars diff --git a/deps/npm/lib/commands/team.js b/deps/npm/lib/commands/team.js index 3c6cf305a6e5f9..089e917909d10a 100644 --- a/deps/npm/lib/commands/team.js +++ b/deps/npm/lib/commands/team.js @@ -1,9 +1,9 @@ const columns = require('cli-columns') const libteam = require('libnpmteam') +const { output } = require('proc-log') +const { otplease } = require('../utils/auth.js') -const otplease = require('../utils/otplease.js') - -const BaseCommand = require('../base-command.js') +const BaseCommand = require('../base-cmd.js') class Team extends BaseCommand { static description = 'Manage organization teams and team memberships' static name = 'team' @@ -68,87 +68,88 @@ class Team extends BaseCommand { async create (entity, opts) { await libteam.create(entity, opts) if (opts.json) { - this.npm.output(JSON.stringify({ + output.buffer({ created: true, team: entity, - })) + }) } else if (opts.parseable) { - this.npm.output(`${entity}\tcreated`) + output.standard(`${entity}\tcreated`) } else if (!this.npm.silent) { - this.npm.output(`+@${entity}`) + output.standard(`+@${entity}`) } } async destroy (entity, opts) { await libteam.destroy(entity, opts) if (opts.json) { - this.npm.output(JSON.stringify({ + output.buffer({ deleted: true, team: entity, - })) + }) } else if (opts.parseable) { - this.npm.output(`${entity}\tdeleted`) + output.standard(`${entity}\tdeleted`) } else if (!this.npm.silent) { - this.npm.output(`-@${entity}`) + output.standard(`-@${entity}`) } } async add (entity, user, opts) { await libteam.add(user, entity, opts) if (opts.json) { - this.npm.output(JSON.stringify({ + output.buffer({ added: true, team: entity, user, - })) + }) } else if (opts.parseable) { - this.npm.output(`${user}\t${entity}\tadded`) + output.standard(`${user}\t${entity}\tadded`) } else if (!this.npm.silent) { - this.npm.output(`${user} added to @${entity}`) + output.standard(`${user} added to @${entity}`) } } async rm (entity, user, opts) { await libteam.rm(user, entity, opts) if (opts.json) { - this.npm.output(JSON.stringify({ + output.buffer({ removed: true, team: entity, user, - })) + }) } else if (opts.parseable) { - this.npm.output(`${user}\t${entity}\tremoved`) + output.standard(`${user}\t${entity}\tremoved`) } else if (!this.npm.silent) { - this.npm.output(`${user} removed from @${entity}`) + output.standard(`${user} removed from @${entity}`) } } async listUsers (entity, opts) { const users = (await libteam.lsUsers(entity, opts)).sort() if (opts.json) { - this.npm.output(JSON.stringify(users, null, 2)) + output.buffer(users) } else if (opts.parseable) { - this.npm.output(users.join('\n')) + output.standard(users.join('\n')) } else if (!this.npm.silent) { const plural = users.length === 1 ? '' : 's' const more = users.length === 0 ? '' : ':\n' - this.npm.output(`\n@${entity} has ${users.length} user${plural}${more}`) - this.npm.output(columns(users, { padding: 1 })) + output.standard(`\n@${entity} has ${users.length} user${plural}${more}`) + output.standard(columns(users, { padding: 1 })) } } async listTeams (entity, opts) { const teams = (await libteam.lsTeams(entity, opts)).sort() if (opts.json) { - this.npm.output(JSON.stringify(teams, null, 2)) + output.buffer(teams) } else if (opts.parseable) { - this.npm.output(teams.join('\n')) + output.standard(teams.join('\n')) } else if (!this.npm.silent) { const plural = teams.length === 1 ? '' : 's' const more = teams.length === 0 ? '' : ':\n' - this.npm.output(`\n@${entity} has ${teams.length} team${plural}${more}`) - this.npm.output(columns(teams.map(t => `@${t}`), { padding: 1 })) + output.standard(`\n@${entity} has ${teams.length} team${plural}${more}`) + output.standard(columns(teams.map(t => `@${t}`), { padding: 1 })) } } } + module.exports = Team diff --git a/deps/npm/lib/commands/token.js b/deps/npm/lib/commands/token.js index dc1df6e0fcb25b..d2e85ffe5a549d 100644 --- a/deps/npm/lib/commands/token.js +++ b/deps/npm/lib/commands/token.js @@ -1,12 +1,9 @@ -const Table = require('cli-table3') -const log = require('../utils/log-shim.js') -const profile = require('npm-profile') - -const otplease = require('../utils/otplease.js') -const pulseTillDone = require('../utils/pulse-till-done.js') +const { log, output } = require('proc-log') +const { listTokens, createToken, removeToken } = require('npm-profile') +const { otplease } = require('../utils/auth.js') const readUserInfo = require('../utils/read-user-info.js') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Token extends BaseCommand { static description = 'Manage your authentication tokens' static name = 'token' @@ -28,7 +25,6 @@ class Token extends BaseCommand { } async exec (args) { - log.gauge.show('token') if (args.length === 0) { return this.list() } @@ -36,10 +32,10 @@ class Token extends BaseCommand { case 'list': case 'ls': return this.list() + case 'rm': case 'delete': case 'revoke': case 'remove': - case 'rm': return this.rm(args.slice(1)) case 'create': return this.create(args.slice(1)) @@ -49,16 +45,18 @@ class Token extends BaseCommand { } async list () { - const conf = this.config() + const json = this.npm.config.get('json') + const parseable = this.npm.config.get('parseable') log.info('token', 'getting list') - const tokens = await pulseTillDone.withPromise(profile.listTokens(conf)) - if (conf.json) { - this.npm.output(JSON.stringify(tokens, null, 2)) + const tokens = await listTokens(this.npm.flatOptions) + if (json) { + output.buffer(tokens) return - } else if (conf.parseable) { - this.npm.output(['key', 'token', 'created', 'readonly', 'CIDR whitelist'].join('\t')) + } + if (parseable) { + output.standard(['key', 'token', 'created', 'readonly', 'CIDR whitelist'].join('\t')) tokens.forEach(token => { - this.npm.output( + output.standard( [ token.key, token.token, @@ -71,21 +69,17 @@ class Token extends BaseCommand { return } this.generateTokenIds(tokens, 6) - const idWidth = tokens.reduce((acc, token) => Math.max(acc, token.id.length), 0) - const table = new Table({ - head: ['id', 'token', 'created', 'readonly', 'CIDR whitelist'], - colWidths: [Math.max(idWidth, 2) + 2, 9, 12, 10], - }) - tokens.forEach(token => { - table.push([ - token.id, - token.token + '…', - String(token.created).slice(0, 10), - token.readonly ? 'yes' : 'no', - token.cidr_whitelist ? token.cidr_whitelist.join(', ') : '', - ]) - }) - this.npm.output(table.toString()) + const chalk = this.npm.chalk + for (const token of tokens) { + const level = token.readonly ? 'Read only token' : 'Publish token' + const created = String(token.created).slice(0, 10) + /* eslint-disable-next-line max-len */ + output.standard(`${chalk.blue(level)} ${token.token}… with id ${chalk.cyan(token.id)} created ${created}`) + if (token.cidr_whitelist) { + output.standard(`with IP whitelist: ${chalk.green(token.cidr_whitelist.join(','))}`) + } + output.standard() + } } async rm (args) { @@ -93,11 +87,12 @@ class Token extends BaseCommand { throw this.usageError('`` argument is required.') } - const conf = this.config() + const json = this.npm.config.get('json') + const parseable = this.npm.config.get('parseable') const toRemove = [] - const progress = log.newItem('removing tokens', toRemove.length) - progress.info('token', 'getting existing list') - const tokens = await pulseTillDone.withPromise(profile.listTokens(conf)) + const opts = { ...this.npm.flatOptions } + log.info('token', `removing ${toRemove.length} tokens`) + const tokens = await listTokens(opts) args.forEach(id => { const matches = tokens.filter(token => token.key.indexOf(id) === 0) if (matches.length === 1) { @@ -118,72 +113,47 @@ class Token extends BaseCommand { }) await Promise.all( toRemove.map(key => { - return otplease(this.npm, conf, c => profile.removeToken(key, c)) + return otplease(this.npm, opts, c => removeToken(key, c)) }) ) - if (conf.json) { - this.npm.output(JSON.stringify(toRemove)) - } else if (conf.parseable) { - this.npm.output(toRemove.join('\t')) + if (json) { + output.buffer(toRemove) + } else if (parseable) { + output.standard(toRemove.join('\t')) } else { - this.npm.output('Removed ' + toRemove.length + ' token' + (toRemove.length !== 1 ? 's' : '')) + output.standard('Removed ' + toRemove.length + ' token' + (toRemove.length !== 1 ? 's' : '')) } } - async create (args) { - const conf = this.config() - const cidr = conf.cidr - const readonly = conf.readOnly + async create () { + 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 password = await readUserInfo.password() const validCIDR = await this.validateCIDRList(cidr) + const password = await readUserInfo.password() log.info('token', 'creating') - const result = await pulseTillDone.withPromise( - otplease(this.npm, conf, c => profile.createToken(password, readonly, validCIDR, c)) + const result = await otplease( + this.npm, + { ...this.npm.flatOptions }, + c => createToken(password, readonly, validCIDR, c) ) delete result.key delete result.updated - if (conf.json) { - this.npm.output(JSON.stringify(result)) - } else if (conf.parseable) { - Object.keys(result).forEach(k => this.npm.output(k + '\t' + result[k])) + if (json) { + output.buffer(result) + } else if (parseable) { + Object.keys(result).forEach(k => output.standard(k + '\t' + result[k])) } else { - const table = new Table() - for (const k of Object.keys(result)) { - table.push({ [this.npm.chalk.bold(k)]: String(result[k]) }) - } - this.npm.output(table.toString()) - } - } - - config () { - const conf = { ...this.npm.flatOptions } - const creds = this.npm.config.getCredentialsByURI(conf.registry) - if (creds.token) { - conf.auth = { token: creds.token } - } else if (creds.username) { - conf.auth = { - basic: { - username: creds.username, - password: creds.password, - }, + const chalk = this.npm.chalk + // Identical to list + const level = result.readonly ? 'read only' : 'publish' + output.standard(`Created ${chalk.blue(level)} token ${result.token}`) + if (result.cidr_whitelist?.length) { + output.standard(`with IP whitelist: ${chalk.green(result.cidr_whitelist.join(','))}`) } - } else if (creds.auth) { - const auth = Buffer.from(creds.auth, 'base64').toString().split(':', 2) - conf.auth = { - basic: { - username: auth[0], - password: auth[1], - }, - } - } else { - conf.auth = {} } - - if (conf.otp) { - conf.auth.otp = conf.otp - } - return conf } invalidCIDRError (msg) { @@ -191,7 +161,6 @@ class Token extends BaseCommand { } generateTokenIds (tokens, minLength) { - const byId = {} for (const token of tokens) { token.id = token.key for (let ii = minLength; ii < token.key.length; ++ii) { @@ -203,9 +172,7 @@ class Token extends BaseCommand { break } } - byId[token.id] = token } - return byId } async validateCIDRList (cidrs) { @@ -215,15 +182,16 @@ 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` ) } if (!isCidrV4(cidr)) { - throw this.invalidCIDRError('CIDR whitelist contains invalid CIDR entry: ' + cidr) + throw this.invalidCIDRError(`CIDR whitelist contains invalid CIDR entry: ${cidr}`) } } return list } } + module.exports = Token diff --git a/deps/npm/lib/commands/uninstall.js b/deps/npm/lib/commands/uninstall.js index 07775efb9cf2f1..f9baebe3bc2e28 100644 --- a/deps/npm/lib/commands/uninstall.js +++ b/deps/npm/lib/commands/uninstall.js @@ -1,10 +1,9 @@ -const { resolve } = require('path') +const { resolve } = require('node:path') const pkgJson = require('@npmcli/package-json') - const reifyFinish = require('../utils/reify-finish.js') -const completion = require('../utils/completion/installed-shallow.js') - +const completion = require('../utils/installed-shallow.js') const ArboristWorkspaceCmd = require('../arborist-cmd.js') + class Uninstall extends ArboristWorkspaceCmd { static description = 'Remove a package' static name = 'uninstall' @@ -53,4 +52,5 @@ class Uninstall extends ArboristWorkspaceCmd { await reifyFinish(this.npm, arb) } } + module.exports = Uninstall diff --git a/deps/npm/lib/commands/unpublish.js b/deps/npm/lib/commands/unpublish.js index a9c20900534c3a..4944888fe5aca5 100644 --- a/deps/npm/lib/commands/unpublish.js +++ b/deps/npm/lib/commands/unpublish.js @@ -2,18 +2,17 @@ const libaccess = require('libnpmaccess') const libunpub = require('libnpmpublish').unpublish const npa = require('npm-package-arg') const pacote = require('pacote') +const { output, log } = require('proc-log') const pkgJson = require('@npmcli/package-json') - const { flatten } = require('@npmcli/config/lib/definitions') const getIdentity = require('../utils/get-identity.js') -const log = require('../utils/log-shim') -const otplease = require('../utils/otplease.js') +const { otplease } = require('../utils/auth.js') +const BaseCommand = require('../base-cmd.js') const LAST_REMAINING_VERSION_ERROR = 'Refusing to delete the last version of the package. ' + 'It will block from republishing a new version for 24 hours.\n' + 'Run with --force to do this.' -const BaseCommand = require('../base-command.js') class Unpublish extends BaseCommand { static description = 'Remove a package from the registry' static name = 'unpublish' @@ -141,7 +140,12 @@ class Unpublish extends BaseCommand { // If localPrefix has a package.json with a name that matches the package // being unpublished, load up the publishConfig if (manifest?.name === spec.name && manifest.publishConfig) { - flatten(manifest.publishConfig, opts) + const cliFlags = this.npm.config.data.get('cli').raw + // Filter out properties set in CLI flags to prioritize them over + // corresponding `publishConfig` settings + const filteredPublishConfig = Object.fromEntries( + Object.entries(manifest.publishConfig).filter(([key]) => !(key in cliFlags))) + flatten(filteredPublishConfig, opts) } const versions = await Unpublish.getKeysOfVersions(spec.name, opts) @@ -156,7 +160,7 @@ class Unpublish extends BaseCommand { await otplease(this.npm, opts, o => libunpub(spec, o)) } if (!silent) { - this.npm.output(`- ${spec.name}${pkgVersion}`) + output.standard(`- ${spec.name}${pkgVersion}`) } } @@ -168,4 +172,5 @@ class Unpublish extends BaseCommand { } } } + module.exports = Unpublish diff --git a/deps/npm/lib/commands/unstar.js b/deps/npm/lib/commands/unstar.js index cbcb73636c6384..c72966866669a9 100644 --- a/deps/npm/lib/commands/unstar.js +++ b/deps/npm/lib/commands/unstar.js @@ -4,4 +4,5 @@ class Unstar extends Star { static description = 'Remove an item from your favorite packages' static name = 'unstar' } + module.exports = Unstar diff --git a/deps/npm/lib/commands/update.js b/deps/npm/lib/commands/update.js index 43d031c7ada3f3..235a9a41177df3 100644 --- a/deps/npm/lib/commands/update.js +++ b/deps/npm/lib/commands/update.js @@ -1,10 +1,8 @@ -const path = require('path') - -const log = require('../utils/log-shim.js') - +const path = require('node:path') +const { log } = require('proc-log') const reifyFinish = require('../utils/reify-finish.js') - const ArboristWorkspaceCmd = require('../arborist-cmd.js') + class Update extends ArboristWorkspaceCmd { static description = 'Update packages' static name = 'update' @@ -33,7 +31,7 @@ class Update extends ArboristWorkspaceCmd { // TODO /* istanbul ignore next */ static async completion (opts, npm) { - const completion = require('../utils/completion/installed-deep.js') + const completion = require('../utils/installed-deep.js') return completion(npm, opts) } @@ -66,4 +64,5 @@ class Update extends ArboristWorkspaceCmd { await reifyFinish(this.npm, arb) } } + module.exports = Update diff --git a/deps/npm/lib/commands/version.js b/deps/npm/lib/commands/version.js index 029a6fdd3101e4..d6c2dd4caed750 100644 --- a/deps/npm/lib/commands/version.js +++ b/deps/npm/lib/commands/version.js @@ -1,10 +1,7 @@ -const libnpmversion = require('libnpmversion') -const { resolve } = require('path') -const { promisify } = require('util') -const readFile = promisify(require('fs').readFile) - -const updateWorkspaces = require('../workspaces/update-workspaces.js') -const BaseCommand = require('../base-command.js') +const { resolve } = require('node:path') +const { readFile } = require('node:fs/promises') +const { output } = require('proc-log') +const BaseCommand = require('../base-cmd.js') class Version extends BaseCommand { static description = 'Bump a package version' @@ -73,29 +70,43 @@ class Version extends BaseCommand { } async change (args) { + const libnpmversion = require('libnpmversion') const prefix = this.npm.config.get('tag-version-prefix') const version = await libnpmversion(args[0], { ...this.npm.flatOptions, path: this.npm.prefix, }) - return this.npm.output(`${prefix}${version}`) + return output.standard(`${prefix}${version}`) } async changeWorkspaces (args) { + const updateWorkspaces = require('../utils/update-workspaces.js') + const libnpmversion = require('libnpmversion') const prefix = this.npm.config.get('tag-version-prefix') + const { + config, + flatOptions, + localPrefix, + } = this.npm await this.setWorkspaces() const updatedWorkspaces = [] for (const [name, path] of this.workspaces) { - this.npm.output(name) + output.standard(name) const version = await libnpmversion(args[0], { - ...this.npm.flatOptions, + ...flatOptions, 'git-tag-version': false, path, }) updatedWorkspaces.push(name) - this.npm.output(`${prefix}${version}`) + output.standard(`${prefix}${version}`) } - return this.update(updatedWorkspaces) + return updateWorkspaces({ + config, + flatOptions, + localPrefix, + npm: this.npm, + workspaces: updatedWorkspaces, + }) } async list (results = {}) { @@ -115,9 +126,9 @@ class Version extends BaseCommand { } if (this.npm.config.get('json')) { - this.npm.output(JSON.stringify(results, null, 2)) + output.buffer(results) } else { - this.npm.output(results) + output.standard(results) } } @@ -135,22 +146,6 @@ class Version extends BaseCommand { } return this.list(results) } - - async update (workspaces) { - const { - config, - flatOptions, - localPrefix, - } = this.npm - - await updateWorkspaces({ - config, - flatOptions, - localPrefix, - npm: this.npm, - workspaces, - }) - } } module.exports = Version diff --git a/deps/npm/lib/commands/view.js b/deps/npm/lib/commands/view.js index b19604f8c2ed35..cf7292a2f3b814 100644 --- a/deps/npm/lib/commands/view.js +++ b/deps/npm/lib/commands/view.js @@ -1,20 +1,21 @@ const columns = require('cli-columns') -const fs = require('fs') +const { readFile } = require('node:fs/promises') const jsonParse = require('json-parse-even-better-errors') -const log = require('../utils/log-shim.js') +const { log, output, META } = require('proc-log') const npa = require('npm-package-arg') -const { resolve } = require('path') +const { resolve } = require('node:path') const formatBytes = require('../utils/format-bytes.js') const relativeDate = require('tiny-relative-date') const semver = require('semver') -const { inspect, promisify } = require('util') +const { inspect } = require('node:util') const { packument } = require('pacote') +const Queryable = require('../utils/queryable.js') +const BaseCommand = require('../base-cmd.js') +const { getError } = require('../utils/error-message.js') +const { jsonError, outputError } = require('../utils/output-error.js') -const readFile = promisify(fs.readFile) -const readJson = async file => jsonParse(await readFile(file, 'utf8')) +const readJson = file => readFile(file, 'utf8').then(jsonParse) -const Queryable = require('../utils/queryable.js') -const BaseCommand = require('../base-command.js') class View extends BaseCommand { static description = 'View registry info' static name = 'view' @@ -47,42 +48,11 @@ class View extends BaseCommand { const dv = pckmnt.versions[pckmnt['dist-tags'][defaultTag]] pckmnt.versions = Object.keys(pckmnt.versions).sort(semver.compareLoose) - return getFields(pckmnt).concat(getFields(dv)) - - function getFields (d, f, pref) { - f = f || [] - pref = pref || [] - Object.keys(d).forEach((k) => { - if (k.charAt(0) === '_' || k.indexOf('.') !== -1) { - return - } - const p = pref.concat(k).join('.') - f.push(p) - if (Array.isArray(d[k])) { - d[k].forEach((val, i) => { - const pi = p + '[' + i + ']' - if (val && typeof val === 'object') { - getFields(val, f, [p]) - } else { - f.push(pi) - } - }) - return - } - if (typeof d[k] === 'object') { - getFields(d[k], f, [p]) - } - }) - return f - } + return getCompletionFields(pckmnt).concat(getCompletionFields(dv)) } async exec (args) { - if (!args.length) { - args = ['.'] - } - let pkg = args.shift() - const local = /^\.@/.test(pkg) || pkg === '.' + let { pkg, local, rest } = parseArgs(args) if (local) { if (this.npm.global) { @@ -97,95 +67,76 @@ class View extends BaseCommand { pkg = `${manifest.name}${pkg.slice(1)}` } - let wholePackument = false - if (!args.length) { - args = [''] - wholePackument = true + await this.#viewPackage(pkg, rest) + } + + async execWorkspaces (args) { + const { pkg, local, rest } = parseArgs(args) + + if (!local) { + log.warn('Ignoring workspaces for specified package(s)') + return this.exec([pkg, ...rest]) } - const [pckmnt, data] = await this.getData(pkg, args) - if (!this.npm.config.get('json') && wholePackument) { - // pretty view (entire packument) - data.map((v) => this.prettyView(pckmnt, v[Object.keys(v)[0]][''])) - } else { - // JSON formatted output (JSON or specific attributes from packument) - let reducedData = data.reduce(reducer, {}) - if (wholePackument) { - // No attributes - reducedData = cleanBlanks(reducedData) - log.silly('view', reducedData) - } - // disable the progress bar entirely, as we can't meaningfully update it - // if we may have partial lines printed. - log.disableProgress() + const json = this.npm.config.get('json') + await this.setWorkspaces() - const msg = await this.jsonData(reducedData, pckmnt._id) - if (msg !== '') { - this.npm.output(msg) + for (const name of this.workspaceNames) { + try { + await this.#viewPackage(`${name}${pkg.slice(1)}`, rest, { workspace: true }) + } catch (e) { + const err = getError(e, { npm: this.npm, command: this }) + if (err.code !== 'E404') { + throw e + } + if (json) { + output.buffer({ [META]: true, jsonError: { [name]: jsonError(err, this.npm) } }) + } else { + outputError(err) + } + process.exitCode = err.exitCode } } } - async execWorkspaces (args) { - if (!args.length) { - args = ['.'] + async #viewPackage (name, args, { workspace } = {}) { + const wholePackument = !args.length + const json = this.npm.config.get('json') + + // If we are viewing many packages and outputting individual fields then + // output the name before doing any async activity + if (!json && !wholePackument && workspace) { + output.standard(`${name}:`) } - const pkg = args.shift() + const [pckmnt, data] = await this.#getData(name, args, wholePackument) - const local = /^\.@/.test(pkg) || pkg === '.' - if (!local) { - log.warn('Ignoring workspaces for specified package(s)') - return this.exec([pkg, ...args]) - } - let wholePackument = false - if (!args.length) { - wholePackument = true - args = [''] // getData relies on this - } - const results = {} - await this.setWorkspaces() - for (const name of this.workspaceNames) { - const wsPkg = `${name}${pkg.slice(1)}` - const [pckmnt, data] = await this.getData(wsPkg, args) - - let reducedData = data.reduce(reducer, {}) - if (wholePackument) { - // No attributes - reducedData = cleanBlanks(reducedData) - log.silly('view', reducedData) + if (!json && wholePackument) { + // pretty view (entire packument) + for (const v of data) { + output.standard(this.#prettyView(pckmnt, Object.values(v)[0][Queryable.ALL])) } + return + } - if (!this.npm.config.get('json')) { - if (wholePackument) { - data.map((v) => this.prettyView(pckmnt, v[Object.keys(v)[0]][''])) - } else { - this.npm.output(`${name}:`) - const msg = await this.jsonData(reducedData, pckmnt._id) - if (msg !== '') { - this.npm.output(msg) - } - } + const res = this.#packageOutput(cleanData(data, wholePackument), pckmnt._id) + if (res) { + if (json) { + output.buffer(workspace ? { [name]: res } : res) } else { - const msg = await this.jsonData(reducedData, pckmnt._id) - if (msg !== '') { - results[name] = JSON.parse(msg) - } + output.standard(res) } } - if (Object.keys(results).length > 0) { - this.npm.output(JSON.stringify(results, null, 2)) - } } - async getData (pkg, args) { - const opts = { + async #getData (pkg, args) { + const spec = npa(pkg) + + const pckmnt = await packument(spec, { ...this.npm.flatOptions, preferOnline: true, fullMetadata: true, - } - - const spec = npa(pkg) + }) // get the data about this package let version = this.npm.config.get('tag') @@ -194,22 +145,19 @@ class View extends BaseCommand { version = spec.rawSpec } - const pckmnt = await packument(spec, opts) - if (pckmnt['dist-tags']?.[version]) { version = pckmnt['dist-tags'][version] } - if (pckmnt.time && pckmnt.time.unpublished) { + if (pckmnt.time?.unpublished) { const u = pckmnt.time.unpublished - const er = new Error(`Unpublished on ${u.time}`) - er.statusCode = 404 - er.code = 'E404' - er.pkgid = pckmnt._id - throw er + throw Object.assign(new Error(`Unpublished on ${u.time}`), { + statusCode: 404, + code: 'E404', + pkgid: pckmnt._id, + }) } - const data = [] const versions = pckmnt.versions || {} pckmnt.versions = Object.keys(versions).filter(v => { if (semver.valid(v)) { @@ -224,268 +172,254 @@ class View extends BaseCommand { delete pckmnt.readme } - Object.keys(versions).forEach((v) => { - if (semver.satisfies(v, version, true)) { - args.forEach(arg => { - // remove readme unless we asked for it - if (args.indexOf('readme') !== -1) { - delete versions[v].readme - } - - data.push(showFields(pckmnt, versions[v], arg)) + const data = Object.entries(versions) + .filter(([v]) => semver.satisfies(v, version, true)) + .flatMap(([, v]) => { + // remove readme unless we asked for it + if (args.indexOf('readme') !== -1) { + delete v.readme + } + return showFields({ + data: pckmnt, + version: v, + fields: args, + json: this.npm.config.get('json'), }) - } - }) + }) // No data has been pushed because no data is matching the specified version - if (data.length === 0 && version !== 'latest') { - const er = new Error(`No match found for version ${version}`) - er.statusCode = 404 - er.code = 'E404' - er.pkgid = `${pckmnt._id}@${version}` - throw er - } - - if ( - !this.npm.config.get('json') && - args.length === 1 && - args[0] === '' - ) { - pckmnt.version = version + if (!data.length && version !== 'latest') { + throw Object.assign(new Error(`No match found for version ${version}`), { + statusCode: 404, + code: 'E404', + pkgid: `${pckmnt._id}@${version}`, + }) } return [pckmnt, data] } - async jsonData (data, name) { + #packageOutput (data, name) { + const json = this.npm.config.get('json') const versions = Object.keys(data) - let msg = '' - let msgJson = [] const includeVersions = versions.length > 1 + let includeFields - const json = this.npm.config.get('json') + const res = versions.flatMap((v) => { + const fields = Object.entries(data[v]) - versions.forEach((v) => { - const fields = Object.keys(data[v]) - includeFields = includeFields || (fields.length > 1) - if (json) { - msgJson.push({}) - } - fields.forEach((f) => { - let d = cleanup(data[v][f]) - if (fields.length === 1 && json) { - msgJson[msgJson.length - 1][f] = d + includeFields ||= (fields.length > 1) + + const msg = json ? {} : [] + + for (let [f, d] of fields) { + d = cleanup(d) + + if (json) { + msg[f] = d + continue } if (includeVersions || includeFields || typeof d !== 'string') { - if (json) { - msgJson[msgJson.length - 1][f] = d - } else { - d = inspect(d, { - showHidden: false, - depth: 5, - colors: this.npm.color, - maxArrayLength: null, - }) - } - } else if (typeof d === 'string' && json) { - d = JSON.stringify(d) + d = inspect(d, { + showHidden: false, + depth: 5, + colors: this.npm.color, + maxArrayLength: null, + }) } - if (!json) { - if (f && includeFields) { - f += ' = ' - } - msg += (includeVersions ? name + '@' + v + ' ' : '') + - (includeFields ? f : '') + d + '\n' + if (f && includeFields) { + f += ' = ' } - }) + + msg.push(`${includeVersions ? `${name}@${v} ` : ''}${includeFields ? f : ''}${d}`) + } + + return msg }) if (json) { - if (msgJson.length && Object.keys(msgJson[0]).length === 1) { - const k = Object.keys(msgJson[0])[0] - msgJson = msgJson.map(m => m[k]) + // TODO(BREAKING_CHANGE): all unwrapping should be removed. Users should know + // based on their arguments if they can expect an array or an object. And this + // unwrapping can break that assumption. Eg `npm view abbrev@^2` should always + // return an array, but currently since there is only one version matching `^2` + // this will return a single object instead. + const first = Object.keys(res[0] || {}) + const jsonRes = first.length === 1 ? res.map(m => m[first[0]]) : res + if (jsonRes.length === 0) { + return } - if (msgJson.length === 1) { - msg = JSON.stringify(msgJson[0], null, 2) + '\n' - } else if (msgJson.length > 1) { - msg = JSON.stringify(msgJson, null, 2) + '\n' + if (jsonRes.length === 1) { + return jsonRes[0] } + return jsonRes } - return msg.trim() + return res.join('\n').trim() } - prettyView (packu, manifest) { + #prettyView (packu, manifest) { // More modern, pretty printing of default view const unicode = this.npm.config.get('unicode') const chalk = this.npm.chalk - const tags = [] - - Object.keys(packu['dist-tags']).forEach((t) => { - const version = packu['dist-tags'][t] - tags.push(`${chalk.bold.green(t)}: ${version}`) - }) - const unpackedSize = manifest.dist.unpackedSize && - formatBytes(manifest.dist.unpackedSize, true) + const deps = Object.entries(manifest.dependencies || {}).map(([k, dep]) => + `${chalk.blue(k)}: ${dep}` + ) + const site = manifest.homepage?.url || manifest.homepage + const bins = Object.keys(manifest.bin || {}) const licenseField = manifest.license || 'Proprietary' - const info = { - name: chalk.green(manifest.name), - version: chalk.green(manifest.version), - bins: Object.keys(manifest.bin || {}), - versions: chalk.yellow(packu.versions.length + ''), - description: manifest.description, - deprecated: manifest.deprecated, - keywords: packu.keywords || [], - license: typeof licenseField === 'string' - ? licenseField - : (licenseField.type || 'Proprietary'), - deps: Object.keys(manifest.dependencies || {}).map((dep) => { - return `${chalk.yellow(dep)}: ${manifest.dependencies[dep]}` - }), - publisher: manifest._npmUser && unparsePerson({ - name: chalk.yellow(manifest._npmUser.name), - email: chalk.cyan(manifest._npmUser.email), - }), - modified: !packu.time ? undefined - : chalk.yellow(relativeDate(packu.time[manifest.version])), - maintainers: (packu.maintainers || []).map((u) => unparsePerson({ - name: chalk.yellow(u.name), - email: chalk.cyan(u.email), - })), - repo: ( - manifest.bugs && (manifest.bugs.url || manifest.bugs) - ) || ( - manifest.repository && (manifest.repository.url || manifest.repository) - ), - site: ( - manifest.homepage && (manifest.homepage.url || manifest.homepage) - ), - tags, - tarball: chalk.cyan(manifest.dist.tarball), - shasum: chalk.yellow(manifest.dist.shasum), - integrity: - manifest.dist.integrity && chalk.yellow(manifest.dist.integrity), - fileCount: - manifest.dist.fileCount && chalk.yellow(manifest.dist.fileCount), - unpackedSize: unpackedSize && chalk.yellow(unpackedSize), - } - if (info.license.toLowerCase().trim() === 'proprietary') { - info.license = chalk.bold.red(info.license) - } else { - info.license = chalk.green(info.license) + const license = typeof licenseField === 'string' + ? licenseField + : (licenseField.type || 'Proprietary') + + const res = [] + + res.push('') + res.push([ + chalk.underline.cyan(`${manifest.name}@${manifest.version}`), + license.toLowerCase().trim() === 'proprietary' + ? chalk.red(license) + : chalk.green(license), + `deps: ${deps.length ? chalk.cyan(deps.length) : chalk.cyan('none')}`, + `versions: ${chalk.cyan(packu.versions.length + '')}`, + ].join(' | ')) + + manifest.description && res.push(manifest.description) + if (site) { + res.push(chalk.blue(site)) } - this.npm.output('') - this.npm.output( - chalk.underline.bold(`${info.name}@${info.version}`) + - ' | ' + info.license + - ' | deps: ' + (info.deps.length ? chalk.cyan(info.deps.length) : chalk.green('none')) + - ' | versions: ' + info.versions + manifest.deprecated && res.push( + `\n${chalk.redBright('DEPRECATED')}${unicode ? ' ⚠️ ' : '!!'} - ${manifest.deprecated}` ) - info.description && this.npm.output(info.description) - if (info.repo || info.site) { - info.site && this.npm.output(chalk.cyan(info.site)) - } - const warningSign = unicode ? ' ⚠️ ' : '!!' - info.deprecated && this.npm.output( - `\n${chalk.bold.red('DEPRECATED')}${ - warningSign - } - ${info.deprecated}` - ) + if (packu.keywords?.length) { + res.push(`\nkeywords: ${ + packu.keywords.map(k => chalk.cyan(k)).join(', ') + }`) + } - if (info.keywords.length) { - this.npm.output('') - this.npm.output(`keywords: ${chalk.yellow(info.keywords.join(', '))}`) + if (bins.length) { + res.push(`\nbin: ${chalk.cyan(bins.join(', '))}`) } - if (info.bins.length) { - this.npm.output('') - this.npm.output(`bin: ${chalk.yellow(info.bins.join(', '))}`) + res.push('\ndist') + res.push(`.tarball: ${chalk.blue(manifest.dist.tarball)}`) + res.push(`.shasum: ${chalk.green(manifest.dist.shasum)}`) + if (manifest.dist.integrity) { + res.push(`.integrity: ${chalk.green(manifest.dist.integrity)}`) + } + if (manifest.dist.unpackedSize) { + res.push(`.unpackedSize: ${chalk.blue(formatBytes(manifest.dist.unpackedSize, true))}`) } - this.npm.output('') - this.npm.output('dist') - this.npm.output(`.tarball: ${info.tarball}`) - this.npm.output(`.shasum: ${info.shasum}`) - info.integrity && this.npm.output(`.integrity: ${info.integrity}`) - info.unpackedSize && this.npm.output(`.unpackedSize: ${info.unpackedSize}`) - - const maxDeps = 24 - if (info.deps.length) { - this.npm.output('') - this.npm.output('dependencies:') - this.npm.output(columns(info.deps.slice(0, maxDeps), { padding: 1 })) - if (info.deps.length > maxDeps) { - this.npm.output(`(...and ${info.deps.length - maxDeps} more.)`) + if (deps.length) { + const maxDeps = 24 + res.push('\ndependencies:') + res.push(columns(deps.slice(0, maxDeps), { padding: 1 })) + if (deps.length > maxDeps) { + res.push(chalk.dim(`(...and ${deps.length - maxDeps} more.)`)) } } - if (info.maintainers && info.maintainers.length) { - this.npm.output('') - this.npm.output('maintainers:') - info.maintainers.forEach((u) => this.npm.output(`- ${u}`)) + if (packu.maintainers?.length) { + res.push('\nmaintainers:') + packu.maintainers.forEach(u => + res.push(`- ${unparsePerson({ + name: chalk.blue(u.name), + email: chalk.dim(u.email) })}`) + ) } - this.npm.output('') - this.npm.output('dist-tags:') - this.npm.output(columns(info.tags)) + res.push('\ndist-tags:') + res.push(columns(Object.entries(packu['dist-tags']).map(([k, t]) => + `${chalk.blue(k)}: ${t}` + ))) - if (info.publisher || info.modified) { + const publisher = manifest._npmUser && unparsePerson({ + name: chalk.blue(manifest._npmUser.name), + email: chalk.dim(manifest._npmUser.email), + }) + if (publisher || packu.time) { let publishInfo = 'published' - if (info.modified) { - publishInfo += ` ${info.modified}` + if (packu.time) { + publishInfo += ` ${chalk.cyan(relativeDate(packu.time[manifest.version]))}` } - if (info.publisher) { - publishInfo += ` by ${info.publisher}` + if (publisher) { + publishInfo += ` by ${publisher}` } - this.npm.output('') - this.npm.output(publishInfo) + res.push('') + res.push(publishInfo) } + + return res.join('\n') } } + module.exports = View -function cleanBlanks (obj) { - const clean = {} - Object.keys(obj).forEach((version) => { - clean[version] = obj[version][''] - }) - return clean +function parseArgs (args) { + if (!args.length) { + args = ['.'] + } + + const pkg = args.shift() + + return { + pkg, + local: /^\.@/.test(pkg) || pkg === '.', + rest: args, + } } -// takes an array of objects and merges them into one object -function reducer (acc, cur) { - if (cur) { - Object.keys(cur).forEach((v) => { - acc[v] = acc[v] || {} - Object.keys(cur[v]).forEach((t) => { - acc[v][t] = cur[v][t] +function cleanData (obj, wholePackument) { + // JSON formatted output (JSON or specific attributes from packument) + const data = obj.reduce((acc, cur) => { + if (cur) { + Object.entries(cur).forEach(([k, v]) => { + acc[k] ||= {} + Object.keys(v).forEach((t) => { + acc[k][t] = cur[k][t] + }) }) - }) + } + return acc + }, {}) + + if (wholePackument) { + const cleaned = Object.entries(data).reduce((acc, [k, v]) => { + acc[k] = v[Queryable.ALL] + return acc + }, {}) + log.silly('view', cleaned) + return cleaned } - return acc + return data } // return whatever was printed -function showFields (data, version, fields) { - const o = {} - ;[data, version].forEach((s) => { - Object.keys(s).forEach((k) => { - o[k] = s[k] +function showFields ({ data, version, fields, json }) { + const o = [data, version].reduce((acc, s) => { + Object.entries(s).forEach(([k, v]) => { + acc[k] = v }) - }) + return acc + }, {}) const queryable = new Queryable(o) - const s = queryable.query(fields) - const res = { [version.version]: s } - if (s) { - return res + if (!fields.length) { + return { [version.version]: queryable.query(Queryable.ALL) } } + + return fields.map((field) => { + const s = queryable.query(field, { unwrapSingleItemArrays: !json }) + if (s) { + return { [version.version]: s } + } + }) } function cleanup (data) { @@ -498,19 +432,41 @@ function cleanup (data) { } const keys = Object.keys(data) - if (keys.length <= 3 && - data.name && - (keys.length === 1 || - (keys.length === 3 && data.email && data.url) || - (keys.length === 2 && (data.email || data.url)))) { + if (keys.length <= 3 && data.name && ( + (keys.length === 1) || + (keys.length === 3 && data.email && data.url) || + (keys.length === 2 && (data.email || data.url)) + )) { data = unparsePerson(data) } return data } -function unparsePerson (d) { - return d.name + - (d.email ? ' <' + d.email + '>' : '') + - (d.url ? ' (' + d.url + ')' : '') +const unparsePerson = (d) => + `${d.name}${d.email ? ` <${d.email}>` : ''}${d.url ? ` (${d.url})` : ''}` + +function getCompletionFields (d, f = [], pref = []) { + Object.entries(d).forEach(([k, v]) => { + if (k.charAt(0) === '_' || k.indexOf('.') !== -1) { + return + } + const p = pref.concat(k).join('.') + f.push(p) + if (Array.isArray(v)) { + v.forEach((val, i) => { + const pi = p + '[' + i + ']' + if (val && typeof val === 'object') { + getCompletionFields(val, f, [p]) + } else { + f.push(pi) + } + }) + return + } + if (typeof v === 'object') { + getCompletionFields(v, f, [p]) + } + }) + return f } diff --git a/deps/npm/lib/commands/whoami.js b/deps/npm/lib/commands/whoami.js index 154cc870391ba1..6b6e93ce7f885f 100644 --- a/deps/npm/lib/commands/whoami.js +++ b/deps/npm/lib/commands/whoami.js @@ -1,16 +1,20 @@ +const { output } = require('proc-log') const getIdentity = require('../utils/get-identity.js') +const BaseCommand = require('../base-cmd.js') -const BaseCommand = require('../base-command.js') class Whoami extends BaseCommand { static description = 'Display npm username' static name = 'whoami' static params = ['registry'] - async exec (args) { + async exec () { const username = await getIdentity(this.npm, { ...this.npm.flatOptions }) - this.npm.output( - this.npm.config.get('json') ? JSON.stringify(username) : username - ) + if (this.npm.config.get('json')) { + output.buffer(username) + } else { + output.standard(username) + } } } + module.exports = Whoami diff --git a/deps/npm/lib/lifecycle-cmd.js b/deps/npm/lib/lifecycle-cmd.js index 848771a38355e5..a509a9380f668c 100644 --- a/deps/npm/lib/lifecycle-cmd.js +++ b/deps/npm/lib/lifecycle-cmd.js @@ -1,7 +1,7 @@ +const BaseCommand = require('./base-cmd.js') + // The implementation of commands that are just "run a script" // restart, start, stop, test - -const BaseCommand = require('./base-command.js') class LifecycleCmd extends BaseCommand { static usage = ['[-- ]'] static isShellout = true @@ -16,4 +16,5 @@ class LifecycleCmd extends BaseCommand { return this.npm.exec('run-script', [this.constructor.name, ...args]) } } + module.exports = LifecycleCmd diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js index d05b74ac74b833..893e032f1ecedd 100644 --- a/deps/npm/lib/npm.js +++ b/deps/npm/lib/npm.js @@ -1,21 +1,17 @@ -const { resolve, dirname, join } = require('path') +const { resolve, dirname, join } = require('node:path') const Config = require('@npmcli/config') const which = require('which') -const fs = require('fs/promises') - -// Patch the global fs module here at the app level -require('graceful-fs').gracefulify(require('fs')) - +const fs = require('node:fs/promises') const { definitions, flatten, shorthands } = require('@npmcli/config/lib/definitions') const usage = require('./utils/npm-usage.js') const LogFile = require('./utils/log-file.js') const Timers = require('./utils/timers.js') const Display = require('./utils/display.js') -const log = require('./utils/log-shim') +const { log, time, output, META } = require('proc-log') const { redactLog: replaceInfo } = require('@npmcli/redact') -const updateNotifier = require('./utils/update-notifier.js') const pkg = require('../package.json') const { deref } = require('./utils/cmd-list.js') +const { jsonError, outputError } = require('./utils/output-error.js') class Npm { static get version () { @@ -27,38 +23,25 @@ class Npm { if (!command) { throw Object.assign(new Error(`Unknown command ${c}`), { code: 'EUNKNOWNCOMMAND', + command: c, }) } return require(`./commands/${command}.js`) } + unrefPromises = [] updateNotification = null - loadErr = null argv = [] #command = null #runId = new Date().toISOString().replace(/[.:]/g, '_') - #loadPromise = null #title = 'npm' #argvClean = [] #npmRoot = null - #warnedNonDashArg = false - - #chalk = null - #logChalk = null - #noColorChalk = null - #outputBuffer = [] + #display = null #logFile = new LogFile() - #display = new Display() - #timers = new Timers({ - start: 'npm', - listener: (name, ms) => { - const args = ['timing', name, `Completed in ${ms}ms`] - this.#logFile.log(...args) - this.#display.log(...args) - }, - }) + #timers = new Timers() // all these options are only used by tests in order to make testing more // closely resemble real world usage. for now, npm has no programmatic API so @@ -72,7 +55,14 @@ class Npm { // allows tests created by tap inside this repo to not set the local // prefix to `npmRoot` since that is the first dir it would encounter when // doing implicit detection - constructor ({ npmRoot = dirname(__dirname), argv = [], excludeNpmCwd = false } = {}) { + constructor ({ + stdout = process.stdout, + stderr = process.stderr, + npmRoot = dirname(__dirname), + argv = [], + excludeNpmCwd = false, + } = {}) { + this.#display = new Display({ stdout, stderr }) this.#npmRoot = npmRoot this.config = new Config({ npmPath: this.#npmRoot, @@ -84,105 +74,18 @@ class Npm { }) } - get version () { - return this.constructor.version - } - - setCmd (cmd) { - const Command = Npm.cmd(cmd) - const command = new Command(this) - - // since 'test', 'start', 'stop', etc. commands re-enter this function - // to call the run-script command, we need to only set it one time. - if (!this.#command) { - this.#command = command - process.env.npm_command = this.command - } - - return command - } - - // Call an npm command - // TODO: tests are currently the only time the second - // parameter of args is used. When called via `lib/cli.js` the config is - // loaded and this.argv is set to the remaining command line args. We should - // consider testing the CLI the same way it is used and not allow args to be - // passed in directly. - async exec (cmd, args = this.argv) { - const command = this.setCmd(cmd) - - const timeEnd = this.time(`command:${cmd}`) - - // this is async but we dont await it, since its ok if it doesnt - // finish before the command finishes running. it uses command and argv - // so it must be initiated here, after the command name is set - // eslint-disable-next-line promise/catch-or-return - updateNotifier(this).then((msg) => (this.updateNotification = msg)) - - // Options are prefixed by a hyphen-minus (-, \u2d). - // Other dash-type chars look similar but are invalid. - if (!this.#warnedNonDashArg) { - const nonDashArgs = args.filter(a => /^[\u2010-\u2015\u2212\uFE58\uFE63\uFF0D]/.test(a)) - if (nonDashArgs.length) { - this.#warnedNonDashArg = true - log.error( - 'arg', - 'Argument starts with non-ascii dash, this is probably invalid:', - nonDashArgs.join(', ') - ) - } - } - - return command.cmdExec(args).finally(timeEnd) - } - async load () { - if (!this.#loadPromise) { - this.#loadPromise = this.time('npm:load', () => this.#load().catch((er) => { - this.loadErr = er - throw er - })) + let err + try { + return await time.start('npm:load', () => this.#load()) + } catch (e) { + err = e } - return this.#loadPromise - } - - get loaded () { - return this.config.loaded - } - - // This gets called at the end of the exit handler and - // during any tests to cleanup all of our listeners - // Everything in here should be synchronous - unload () { - this.#timers.off() - this.#display.off() - this.#logFile.off() - } - - time (name, fn) { - return this.#timers.time(name, fn) - } - - writeTimingFile () { - this.#timers.writeFile({ - id: this.#runId, - command: this.#argvClean, - logfiles: this.logFiles, - version: this.version, - }) - } - - get title () { - return this.#title - } - - set title (t) { - process.title = t - this.#title = t + return this.#handleError(err) } async #load () { - await this.time('npm:load:whichnode', async () => { + await time.start('npm:load:whichnode', async () => { // TODO should we throw here? const node = await which(process.argv[0]).catch(() => {}) if (node && node.toUpperCase() !== process.execPath.toUpperCase()) { @@ -192,46 +95,72 @@ class Npm { } }) - await this.time('npm:load:configload', () => this.config.load()) - - // get createSupportsColor from chalk directly if this lands - // https://github.com/chalk/chalk/pull/600 - const [{ Chalk }, { createSupportsColor }] = await Promise.all([ - import('chalk'), - import('supports-color'), - ]) - this.#noColorChalk = new Chalk({ level: 0 }) - // we get the chalk level based on a null stream meaning chalk will only use - // what it knows about the environment to get color support since we already - // determined in our definitions that we want to show colors. - const level = Math.max(createSupportsColor(null).level, 1) - this.#chalk = this.color ? new Chalk({ level }) : this.#noColorChalk - this.#logChalk = this.logColor ? new Chalk({ level }) : this.#noColorChalk + await time.start('npm:load:configload', () => this.config.load()) + + // npm --versions + if (this.config.get('versions', 'cli')) { + this.argv = ['version'] + this.config.set('usage', false, 'cli') + } else { + this.argv = [...this.config.parsedArgv.remain] + } + + // Remove first argv since that is our command as typed + // Note that this might not be the actual name of the command + // due to aliases, etc. But we use the raw form of it later + // in user output so it must be preserved as is. + const commandArg = this.argv.shift() + + // This is the actual name of the command that will be run or + // undefined if deref could not find a match + const command = deref(commandArg) + + await this.#display.load({ + command, + loglevel: this.config.get('loglevel'), + stdoutColor: this.color, + stderrColor: this.logColor, + timing: this.config.get('timing'), + unicode: this.config.get('unicode'), + progress: this.flatOptions.progress, + json: this.config.get('json'), + heading: this.config.get('heading'), + }) + process.env.COLOR = this.color ? '1' : '0' + + // npm -v + // return from here early so we dont create any caches/logfiles/timers etc + if (this.config.get('version', 'cli')) { + output.standard(this.version) + return { exec: false } + } // mkdir this separately since the logs dir can be set to // a different location. if this fails, then we don't have // a cache dir, but we don't want to fail immediately since // the command might not need a cache dir (like `npm --version`) - await this.time('npm:load:mkdirpcache', () => + await time.start('npm:load:mkdirpcache', () => fs.mkdir(this.cache, { recursive: true }) .catch((e) => log.verbose('cache', `could not create cache: ${e}`))) // it's ok if this fails. user might have specified an invalid dir // which we will tell them about at the end if (this.config.get('logs-max') > 0) { - await this.time('npm:load:mkdirplogs', () => - fs.mkdir(this.logsDir, { recursive: true }) + await time.start('npm:load:mkdirplogs', () => + fs.mkdir(this.#logsDir, { recursive: true }) .catch((e) => log.verbose('logfile', `could not create logs-dir: ${e}`))) } // note: this MUST be shorter than the actual argv length, because it // uses the same memory, so node will truncate it if it's too long. - this.time('npm:load:setTitle', () => { + // We time this because setting process.title is slow sometimes but we + // have to do it for security reasons. But still helpful to know how slow it is. + time.start('npm:load:setTitle', () => { const { parsedArgv: { cooked, remain } } = this.config - this.argv = remain // Secrets are mostly in configs, so title is set using only the positional args - // to keep those from being leaked. - this.title = ['npm'].concat(replaceInfo(remain)).join(' ').trim() + // to keep those from being leaked. We still do a best effort replaceInfo. + this.#title = ['npm'].concat(replaceInfo(remain)).join(' ').trim() + process.title = this.#title // The cooked argv is also logged separately for debugging purposes. It is // cleaned as a best effort by replacing known secrets like basic auth // password and strings that look like npm tokens. XXX: for this to be @@ -242,49 +171,184 @@ class Npm { log.verbose('argv', this.#argvClean.map(JSON.stringify).join(' ')) }) - this.time('npm:load:display', () => { - this.#display.load({ - // Use logColor since that is based on stderr - color: this.logColor, - chalk: this.logChalk, - progress: this.flatOptions.progress, - silent: this.silent, - timing: this.config.get('timing'), - loglevel: this.config.get('loglevel'), - unicode: this.config.get('unicode'), - heading: this.config.get('heading'), - }) - process.env.COLOR = this.color ? '1' : '0' + // logFile.load returns a promise that resolves when old logs are done being cleaned. + // We save this promise to an array so that we can await it in tests to ensure more + // deterministic logging behavior. The process will also hang open if this were to + // take a long time to resolve, but that is why process.exit is called explicitly + // in the exit-handler. + this.unrefPromises.push(this.#logFile.load({ + command, + path: this.logPath, + logsMax: this.config.get('logs-max'), + timing: this.config.get('timing'), + })) + + this.#timers.load({ + path: this.logPath, + timing: this.config.get('timing'), }) - this.time('npm:load:logFile', () => { - this.#logFile.load({ - path: this.logPath, - logsMax: this.config.get('logs-max'), - }) - log.verbose('logfile', this.#logFile.files[0] || 'no logfile created') - }) + const configScope = this.config.get('scope') + if (configScope && !/^@/.test(configScope)) { + this.config.set('scope', `@${configScope}`, this.config.find('scope')) + } - this.time('npm:load:timers', () => - this.#timers.load({ - path: this.config.get('timing') ? this.logPath : null, - }) - ) + if (this.config.get('force')) { + log.warn('using --force', 'Recommended protections disabled.') + } + + return { exec: true, command: commandArg, args: this.argv } + } + + async exec (cmd, args = this.argv) { + if (!this.#command) { + let err + try { + await this.#exec(cmd, args) + } catch (e) { + err = e + } + return this.#handleError(err) + } else { + return this.#exec(cmd, args) + } + } + + // Call an npm command + async #exec (cmd, args) { + const Command = this.constructor.cmd(cmd) + const command = new Command(this) + + // since 'test', 'start', 'stop', etc. commands re-enter this function + // to call the run-script command, we need to only set it one time. + if (!this.#command) { + this.#command = command + process.env.npm_command = this.command + } + + if (this.config.get('usage')) { + return output.standard(command.usage) + } - this.time('npm:load:configScope', () => { - const configScope = this.config.get('scope') - if (configScope && !/^@/.test(configScope)) { - this.config.set('scope', `@${configScope}`, this.config.find('scope')) + let execWorkspaces = false + const hasWsConfig = this.config.get('workspaces') || this.config.get('workspace').length + // if cwd is a workspace, the default is set to [that workspace] + const implicitWs = this.config.get('workspace', 'default').length + // (-ws || -w foo) && (cwd is not a workspace || command is not ignoring implicit workspaces) + if (hasWsConfig && (!implicitWs || !Command.ignoreImplicitWorkspace)) { + if (this.global) { + throw new Error('Workspaces not supported for global packages') + } + if (!Command.workspaces) { + throw Object.assign(new Error('This command does not support workspaces.'), { + code: 'ENOWORKSPACES', + }) } + execWorkspaces = true + } + + if (command.checkDevEngines && !this.global) { + await command.checkDevEngines() + } + + return time.start(`command:${cmd}`, () => + execWorkspaces ? command.execWorkspaces(args) : command.exec(args)) + } + + // This gets called at the end of the exit handler and + // during any tests to cleanup all of our listeners + // Everything in here should be synchronous + unload () { + this.#timers.off() + this.#display.off() + this.#logFile.off() + } + + finish (err) { + // Finish all our timer work, this will write the file if requested, end timers, etc + this.#timers.finish({ + id: this.#runId, + command: this.#argvClean, + logfiles: this.logFiles, + version: this.version, }) - if (this.config.get('force')) { - log.warn('using --force', 'Recommended protections disabled.') + output.flush({ + [META]: true, + // json can be set during a command so we send the + // final value of it to the display layer here + json: this.loaded && this.config.get('json'), + jsonError: jsonError(err, this), + }) + } + + exitErrorMessage () { + if (this.logFiles.length) { + return `A complete log of this run can be found in: ${this.logFiles}` + } + + const logsMax = this.config.get('logs-max') + if (logsMax <= 0) { + // user specified no log file + return `Log files were not written due to the config logs-max=${logsMax}` } + + // could be an error writing to the directory + return `Log files were not written due to an error writing to the directory: ${this.#logsDir}` + + '\nYou can rerun the command with `--loglevel=verbose` to see the logs in your terminal' } - get isShellout () { - return this.#command?.constructor?.isShellout + async #handleError (err) { + if (err) { + // Get the local package if it exists for a more helpful error message + const localPkg = await require('@npmcli/package-json') + .normalize(this.localPrefix) + .then(p => p.content) + .catch(() => null) + Object.assign(err, this.#getError(err, { pkg: localPkg })) + } + + this.finish(err) + + if (err) { + throw err + } + } + + #getError (rawErr, opts) { + const { files = [], ...error } = require('./utils/error-message.js').getError(rawErr, { + npm: this, + command: this.#command, + ...opts, + }) + + const { writeFileSync } = require('node:fs') + for (const [file, content] of files) { + const filePath = `${this.logPath}${file}` + const fileContent = `'Log files:\n${this.logFiles.join('\n')}\n\n${content.trim()}\n` + try { + writeFileSync(filePath, fileContent) + error.detail.push(['', `\n\nFor a full report see:\n${filePath}`]) + } catch (fileErr) { + log.warn('', `Could not write error message to ${file} due to ${fileErr}`) + } + } + + outputError(error) + + return error + } + + get title () { + return this.#title + } + + get loaded () { + return this.config.loaded + } + + get version () { + return this.constructor.version } get command () { @@ -313,15 +377,15 @@ class Npm { } get noColorChalk () { - return this.#noColorChalk + return this.#display.chalk.noColor } get chalk () { - return this.#chalk + return this.#display.chalk.stdout } get logChalk () { - return this.#logChalk + return this.#display.chalk.stderr } get global () { @@ -336,14 +400,6 @@ class Npm { return 2 } - get unfinishedTimers () { - return this.#timers.unfinished - } - - get finishedTimers () { - return this.#timers.finished - } - get started () { return this.#timers.started } @@ -352,16 +408,12 @@ class Npm { return this.#logFile.files } - get logsDir () { + get #logsDir () { return this.config.get('logs-dir') || join(this.cache, '_logs') } get logPath () { - return resolve(this.logsDir, `${this.#runId}-`) - } - - get timingFile () { - return this.#timers.file + return resolve(this.#logsDir, `${this.#runId}-`) } get npmRoot () { @@ -372,26 +424,14 @@ class Npm { return this.config.get('cache') } - set cache (r) { - this.config.set('cache', r) - } - get globalPrefix () { return this.config.globalPrefix } - set globalPrefix (r) { - this.config.globalPrefix = r - } - get localPrefix () { return this.config.localPrefix } - set localPrefix (r) { - this.config.localPrefix = r - } - get localPackage () { return this.config.localPackage } @@ -427,59 +467,9 @@ class Npm { return this.global ? this.globalPrefix : this.localPrefix } - set prefix (r) { - const k = this.global ? 'globalPrefix' : 'localPrefix' - this[k] = r - } - get usage () { return usage(this) } - - // output to stdout in a progress bar compatible way - output (...msg) { - log.clearProgress() - // eslint-disable-next-line no-console - console.log(...msg.map(Display.clean)) - log.showProgress() - } - - outputBuffer (item) { - this.#outputBuffer.push(item) - } - - flushOutput (jsonError) { - if (!jsonError && !this.#outputBuffer.length) { - return - } - - if (this.config.get('json')) { - const jsonOutput = this.#outputBuffer.reduce((acc, item) => { - if (typeof item === 'string') { - // try to parse it as json in case its a string - try { - item = JSON.parse(item) - } catch { - return acc - } - } - return { ...acc, ...item } - }, {}) - this.output(JSON.stringify({ ...jsonOutput, ...jsonError }, null, 2)) - } else { - for (const item of this.#outputBuffer) { - this.output(item) - } - } - - this.#outputBuffer.length = 0 - } - - outputError (...msg) { - log.clearProgress() - // eslint-disable-next-line no-console - console.error(...msg.map(Display.clean)) - log.showProgress() - } } + module.exports = Npm diff --git a/deps/npm/lib/package-url-cmd.js b/deps/npm/lib/package-url-cmd.js index 250b46eeeddbe5..c7ae32174fcb68 100644 --- a/deps/npm/lib/package-url-cmd.js +++ b/deps/npm/lib/package-url-cmd.js @@ -1,12 +1,9 @@ -// Base command for opening urls from a package manifest (bugs, docs, repo) - const pacote = require('pacote') -const hostedGitInfo = require('hosted-git-info') - -const openUrl = require('./utils/open-url.js') -const log = require('./utils/log-shim') +const { openUrl } = require('./utils/open-url.js') +const { log } = require('proc-log') +const BaseCommand = require('./base-cmd.js') -const BaseCommand = require('./base-command.js') +// Base command for opening urls from a package manifest (bugs, docs, repo) class PackageUrlCommand extends BaseCommand { static params = [ 'browser', @@ -52,6 +49,7 @@ class PackageUrlCommand extends BaseCommand { // repository (if a string) or repository.url (if an object) returns null // if it's not a valid repo, or not a known hosted repo hostedFromMani (mani) { + const hostedGitInfo = require('hosted-git-info') const r = mani.repository const rurl = !r ? null : typeof r === 'string' ? r @@ -62,4 +60,5 @@ class PackageUrlCommand extends BaseCommand { return (rurl && hostedGitInfo.fromUrl(rurl.replace(/^git\+/, ''))) || null } } + module.exports = PackageUrlCommand diff --git a/deps/npm/lib/utils/audit-error.js b/deps/npm/lib/utils/audit-error.js index f9850d718b198e..c56ec9ba86f185 100644 --- a/deps/npm/lib/utils/audit-error.js +++ b/deps/npm/lib/utils/audit-error.js @@ -1,4 +1,4 @@ -const log = require('./log-shim') +const { log, output } = require('proc-log') const { redactLog: replaceInfo } = require('@npmcli/redact') // print an error or just nothing if the audit report has an error @@ -22,16 +22,16 @@ const auditError = (npm, report) => { const { body: errBody } = error const body = Buffer.isBuffer(errBody) ? errBody.toString() : errBody if (npm.flatOptions.json) { - npm.output(JSON.stringify({ + output.buffer({ message: error.message, method: error.method, uri: replaceInfo(error.uri), headers: error.headers, statusCode: error.statusCode, body, - }, null, 2)) + }) } else { - npm.output(body) + output.standard(body) } throw 'audit endpoint returned an error' diff --git a/deps/npm/lib/utils/auth.js b/deps/npm/lib/utils/auth.js index 729ce32c2a7a8f..747271169124b3 100644 --- a/deps/npm/lib/utils/auth.js +++ b/deps/npm/lib/utils/auth.js @@ -1,23 +1,43 @@ -const profile = require('npm-profile') -const log = require('../utils/log-shim') -const openUrlPrompt = require('../utils/open-url-prompt.js') +const { webAuthOpener, adduserWeb, loginWeb, loginCouch, adduserCouch } = require('npm-profile') +const { log } = require('proc-log') +const { createOpener } = require('../utils/open-url.js') const read = require('../utils/read-user-info.js') -const otplease = require('../utils/otplease.js') + +const otplease = async (npm, opts, fn) => { + try { + return await fn(opts) + } catch (err) { + if (!process.stdin.isTTY || !process.stdout.isTTY) { + throw err + } + + // web otp + if (err.code === 'EOTP' && err.body?.authUrl && err.body?.doneUrl) { + const { token: otp } = await webAuthOpener( + createOpener(npm, 'Authenticate your account at'), + err.body.authUrl, + err.body.doneUrl, + opts + ) + return await fn({ ...opts, otp }) + } + + // classic otp + if (err.code === 'EOTP' || (err.code === 'E401' && /one-time pass/.test(err.body))) { + const otp = await read.otp('This operation requires a one-time password.\nEnter OTP:') + return await fn({ ...opts, otp }) + } + + throw err + } +} const adduser = async (npm, { creds, ...opts }) => { const authType = npm.config.get('auth-type') let res if (authType === 'web') { try { - res = await profile.adduserWeb((url, emitter) => { - openUrlPrompt( - npm, - url, - 'Create your account at', - 'Press ENTER to open in the browser...', - emitter - ) - }, opts) + res = await adduserWeb(createOpener(npm, 'Create your account at'), opts) } catch (err) { if (err.code === 'ENYI') { log.verbose('web add user not supported, trying couch') @@ -35,9 +55,7 @@ const adduser = async (npm, { creds, ...opts }) => { // npm registry quirk: If you "add" an existing user with their current // password, it's effectively a login, and if that account has otp you'll // be prompted for it. - res = await otplease(npm, opts, (reqOpts) => - profile.adduserCouch(username, email, password, opts) - ) + res = await otplease(npm, opts, (reqOpts) => adduserCouch(username, email, password, reqOpts)) } // We don't know the username if it was a web login, all we can reliably log is scope and registry @@ -56,15 +74,7 @@ const login = async (npm, { creds, ...opts }) => { let res if (authType === 'web') { try { - res = await profile.loginWeb((url, emitter) => { - openUrlPrompt( - npm, - url, - 'Login at', - 'Press ENTER to open in the browser...', - emitter - ) - }, opts) + res = await loginWeb(createOpener(npm, 'Login at'), opts) } catch (err) { if (err.code === 'ENYI') { log.verbose('web login not supported, trying couch') @@ -78,9 +88,7 @@ const login = async (npm, { creds, ...opts }) => { if (!res) { const username = await read.username('Username:', creds.username) const password = await read.password('Password:', creds.password) - res = await otplease(npm, opts, (reqOpts) => - profile.loginCouch(username, password, reqOpts) - ) + res = await otplease(npm, opts, (reqOpts) => loginCouch(username, password, reqOpts)) } // We don't know the username if it was a web login, all we can reliably log is scope and registry @@ -97,4 +105,5 @@ const login = async (npm, { creds, ...opts }) => { module.exports = { adduser, login, + otplease, } diff --git a/deps/npm/lib/utils/completion/installed-deep.js b/deps/npm/lib/utils/completion/installed-deep.js deleted file mode 100644 index 045708f74bd2a7..00000000000000 --- a/deps/npm/lib/utils/completion/installed-deep.js +++ /dev/null @@ -1,45 +0,0 @@ -const { resolve } = require('path') -const localeCompare = require('@isaacs/string-locale-compare')('en') - -const installedDeep = async (npm) => { - const Arborist = require('@npmcli/arborist') - const { - depth, - global, - prefix, - workspacesEnabled, - } = npm.flatOptions - - const getValues = (tree) => - [...tree.inventory.values()] - .filter(i => i.location !== '' && !i.isRoot) - .map(i => { - return i - }) - .filter(i => (i.depth - 1) <= depth) - .sort((a, b) => (a.depth - b.depth) || localeCompare(a.name, b.name)) - - const res = new Set() - const gArb = new Arborist({ - global: true, - path: resolve(npm.globalDir, '..'), - workspacesEnabled, - }) - const gTree = await gArb.loadActual({ global: true }) - - for (const node of getValues(gTree)) { - res.add(global ? node.name : [node.name, '-g']) - } - - if (!global) { - const arb = new Arborist({ global: false, path: prefix, workspacesEnabled }) - const tree = await arb.loadActual() - for (const node of getValues(tree)) { - res.add(node.name) - } - } - - return [...res] -} - -module.exports = installedDeep diff --git a/deps/npm/lib/utils/did-you-mean.js b/deps/npm/lib/utils/did-you-mean.js index ff3c812b46c3c7..7428ed5df85e9c 100644 --- a/deps/npm/lib/utils/did-you-mean.js +++ b/deps/npm/lib/utils/did-you-mean.js @@ -1,40 +1,34 @@ const Npm = require('../npm') const { distance } = require('fastest-levenshtein') -const pkgJson = require('@npmcli/package-json') const { commands } = require('./cmd-list.js') -const didYouMean = async (path, scmd) => { - const close = commands.filter(cmd => distance(scmd, cmd) < scmd.length * 0.4 && scmd !== cmd) - let best = [] - for (const str of close) { - const cmd = Npm.cmd(str) - best.push(` npm ${str} # ${cmd.description}`) - } - // We would already be suggesting this in `npm x` so omit them here - const runScripts = ['stop', 'start', 'test', 'restart'] - try { - const { content: { scripts, bin } } = await pkgJson.normalize(path) - best = best.concat( - Object.keys(scripts || {}) - .filter(cmd => distance(scmd, cmd) < scmd.length * 0.4 && !runScripts.includes(cmd)) - .map(str => ` npm run ${str} # run the "${str}" package script`), - Object.keys(bin || {}) - .filter(cmd => distance(scmd, cmd) < scmd.length * 0.4) - /* eslint-disable-next-line max-len */ - .map(str => ` npm exec ${str} # run the "${str}" command from either this or a remote npm package`) - ) - } catch (_) { - // gracefully ignore not being in a folder w/ a package.json - } +const runScripts = ['stop', 'start', 'test', 'restart'] + +const isClose = (scmd, cmd) => distance(scmd, cmd) < scmd.length * 0.4 + +const didYouMean = (pkg, scmd) => { + const { scripts = {}, bin = {} } = pkg || {} + + const best = [ + ...commands + .filter(cmd => isClose(scmd, cmd) && scmd !== cmd) + .map(str => [str, Npm.cmd(str).description]), + ...Object.keys(scripts) + // We would already be suggesting this in `npm x` so omit them here + .filter(cmd => isClose(scmd, cmd) && !runScripts.includes(cmd)) + .map(str => [`run ${str}`, `run the "${str}" package script`]), + ...Object.keys(bin) + .filter(cmd => isClose(scmd, cmd)) + /* eslint-disable-next-line max-len */ + .map(str => [`exec ${str}`, `run the "${str}" command from either this or a remote npm package`]), + ] if (best.length === 0) { return '' } - const suggestion = - best.length === 1 - ? `\n\nDid you mean this?\n${best[0]}` - : `\n\nDid you mean one of these?\n${best.slice(0, 3).join('\n')}` - return suggestion + return `\n\nDid you mean ${best.length === 1 ? 'this' : 'one of these'}?\n` + + best.slice(0, 3).map(([msg, comment]) => ` npm ${msg} # ${comment}`).join('\n') } + module.exports = didYouMean diff --git a/deps/npm/lib/utils/display.js b/deps/npm/lib/utils/display.js index c5e5ca2b5b874a..67a3b98c0417a0 100644 --- a/deps/npm/lib/utils/display.js +++ b/deps/npm/lib/utils/display.js @@ -1,214 +1,538 @@ -const { inspect } = require('util') -const npmlog = require('npmlog') -const log = require('./log-shim.js') +const { log, output, input, META } = require('proc-log') const { explain } = require('./explain-eresolve.js') +const { formatWithOptions } = require('./format') -const originalCustomInspect = Symbol('npm.display.original.util.inspect.custom') - -// These are most assuredly not a mistake -// https://eslint.org/docs/latest/rules/no-control-regex -/* eslint-disable no-control-regex */ -// \x00 through \x1f, \x7f through \x9f, not including \x09 \x0a \x0b \x0d -const hasC01 = /[\x00-\x08\x0c\x0e-\x1f\x7f-\x9f]/ -// Allows everything up to '[38;5;255m' in 8 bit notation -const allowedSGR = /^\[[0-9;]{0,8}m/ -// '[38;5;255m'.length -const sgrMaxLen = 10 - -// Strips all ANSI C0 and C1 control characters (except for SGR up to 8 bit) -function stripC01 (str) { - if (!hasC01.test(str)) { - return str - } - let result = '' - for (let i = 0; i < str.length; i++) { - const char = str[i] - const code = char.charCodeAt(0) - if (!hasC01.test(char)) { - // Most characters are in this set so continue early if we can - result = `${result}${char}` - } else if (code === 27 && allowedSGR.test(str.slice(i + 1, i + sgrMaxLen + 1))) { - // \x1b with allowed SGR - result = `${result}\x1b` - } else if (code <= 31) { - // escape all other C0 control characters besides \x7f - result = `${result}^${String.fromCharCode(code + 64)}` - } else { - // hasC01 ensures this is now a C1 control character or \x7f - result = `${result}^${String.fromCharCode(code - 64)}` +// This is the general approach to color: +// Eventually this will be exposed somewhere we can refer to these by name. +// Foreground colors only. Never set the background color. +/* + * Black # (Don't use) + * Red # Danger + * Green # Success + * Yellow # Warning + * Blue # Accent + * Magenta # Done + * Cyan # Emphasis + * White # (Don't use) + */ + +// Translates log levels to chalk colors +const COLOR_PALETTE = ({ chalk: c }) => ({ + heading: c.bold, + title: c.blueBright, + timing: c.magentaBright, + // loglevels + error: c.red, + warn: c.yellow, + notice: c.cyanBright, + http: c.green, + info: c.cyan, + verbose: c.blue, + silly: c.blue.dim, +}) + +const LEVEL_OPTIONS = { + silent: { + index: 0, + }, + error: { + index: 1, + }, + warn: { + index: 2, + }, + notice: { + index: 3, + }, + http: { + index: 4, + }, + info: { + index: 5, + }, + verbose: { + index: 6, + }, + silly: { + index: 7, + }, +} + +const LEVEL_METHODS = { + ...LEVEL_OPTIONS, + [log.KEYS.timing]: { + show: ({ timing, index }) => !!timing && index !== 0, + }, +} + +const setBlocking = (stream) => { + // Copied from https://github.com/yargs/set-blocking + // https://raw.githubusercontent.com/yargs/set-blocking/master/LICENSE.txt + /* istanbul ignore next - we trust that this works */ + if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') { + stream._handle.setBlocking(true) + } + return stream +} + +// These are important +// This is the key that is returned to the user for errors +const ERROR_KEY = 'error' +// This is the key producers use to indicate that there +// is a json error that should be merged into the finished output +const JSON_ERROR_KEY = 'jsonError' + +const isPlainObject = (v) => v && typeof v === 'object' && !Array.isArray(v) + +const getArrayOrObject = (items) => { + if (items.length) { + const foundNonObject = items.find(o => !isPlainObject(o)) + // Non-objects and arrays cant be merged, so just return the first item + if (foundNonObject) { + return foundNonObject + } + // We use objects with 0,1,2,etc keys to merge array + if (items.every((o, i) => Object.hasOwn(o, i))) { + return Object.assign([], ...items) } } - return result + // Otherwise its an object with all object items merged together + return Object.assign({}, ...items.filter(o => isPlainObject(o))) +} + +const getJsonBuffer = ({ [JSON_ERROR_KEY]: metaError }, buffer) => { + const items = [] + // meta also contains the meta object passed to flush + const errors = metaError ? [metaError] : [] + // index 1 is the meta, 2 is the logged argument + for (const [, { [JSON_ERROR_KEY]: error }, obj] of buffer) { + if (obj) { + items.push(obj) + } + if (error) { + errors.push(error) + } + } + + if (!items.length && !errors.length) { + return null + } + + const res = getArrayOrObject(items) + + // This skips any error checking since we can only set an error property + // on an object that can be stringified + // XXX(BREAKING_CHANGE): remove this in favor of always returning an object with result and error keys + if (isPlainObject(res) && errors.length) { + // This is not ideal. JSON output has always been keyed at the root with an `error` + // key, so we cant change that without it being a breaking change. At the same time + // some commands output arbitrary keys at the top level of the output, such as package + // names. So the output could already have the same key. The choice here is to overwrite + // it with our error since that is (probably?) more important. + // XXX(BREAKING_CHANGE): all json output should be keyed under well known keys, eg `result` and `error` + if (res[ERROR_KEY]) { + log.warn('', `overwriting existing ${ERROR_KEY} on json output`) + } + res[ERROR_KEY] = getArrayOrObject(errors) + } + + return res +} + +const withMeta = (handler) => (level, ...args) => { + let meta = {} + const last = args.at(-1) + if (last && typeof last === 'object' && Object.hasOwn(last, META)) { + meta = args.pop() + } + return handler(level, meta, ...args) } class Display { - #chalk = null - - constructor () { - // pause by default until config is loaded - this.on() - log.pause() - } - - static clean (output) { - if (typeof output === 'string') { - // Strings are cleaned inline - return stripC01(output) - } - if (!output || typeof output !== 'object') { - // Numbers, booleans, null all end up here and don't need cleaning - return output - } - // output && typeof output === 'object' - // We can't use hasOwn et al for detecting the original but we can use it - // for detecting the properties we set via defineProperty - if ( - output[inspect.custom] && - (!Object.hasOwn(output, originalCustomInspect)) - ) { - // Save the old one if we didn't already do it. - Object.defineProperty(output, originalCustomInspect, { - value: output[inspect.custom], - writable: true, - }) - } - if (!Object.hasOwn(output, originalCustomInspect)) { - // Put a dummy one in for when we run multiple times on the same object - Object.defineProperty(output, originalCustomInspect, { - value: function () { - return this - }, - writable: true, - }) - } - // Set the custom inspect to our own function - Object.defineProperty(output, inspect.custom, { - value: function () { - const toClean = this[originalCustomInspect]() - // Custom inspect can return things other than objects, check type again - if (typeof toClean === 'string') { - // Strings are cleaned inline - return stripC01(toClean) - } - if (!toClean || typeof toClean !== 'object') { - // Numbers, booleans, null all end up here and don't need cleaning - return toClean - } - return stripC01(inspect(toClean, { customInspect: false })) - }, - writable: true, - }) - return output + #logState = { + buffering: true, + buffer: [], } - on () { + #outputState = { + buffering: true, + buffer: [], + } + + // colors + #noColorChalk + #stdoutChalk + #stdoutColor + #stderrChalk + #stderrColor + #logColors + + // progress + #progress + + // options + #command + #levelIndex + #timing + #json + #heading + #silent + + // display streams + #stdout + #stderr + + constructor ({ stdout, stderr }) { + this.#stdout = setBlocking(stdout) + this.#stderr = setBlocking(stderr) + + // Handlers are set immediately so they can buffer all events process.on('log', this.#logHandler) + process.on('output', this.#outputHandler) + process.on('input', this.#inputHandler) + this.#progress = new Progress({ stream: stderr }) } off () { process.off('log', this.#logHandler) - // Unbalanced calls to enable/disable progress - // will leave change listeners on the tracker - // This pretty much only happens in tests but - // this removes the event emitter listener warnings - log.tracker.removeAllListeners() - } - - load (config) { - const { - color, - chalk, - timing, - loglevel, + this.#logState.buffer.length = 0 + process.off('output', this.#outputHandler) + this.#outputState.buffer.length = 0 + process.off('input', this.#inputHandler) + this.#progress.off() + } + + get chalk () { + return { + noColor: this.#noColorChalk, + stdout: this.#stdoutChalk, + stderr: this.#stderrChalk, + } + } + + async load ({ + command, + heading, + json, + loglevel, + progress, + stderrColor, + stdoutColor, + timing, + unicode, + }) { + // get createSupportsColor from chalk directly if this lands + // https://github.com/chalk/chalk/pull/600 + const [{ Chalk }, { createSupportsColor }] = await Promise.all([ + import('chalk'), + import('supports-color'), + ]) + // we get the chalk level based on a null stream meaning chalk will only use + // what it knows about the environment to get color support since we already + // determined in our definitions that we want to show colors. + const level = Math.max(createSupportsColor(null).level, 1) + this.#noColorChalk = new Chalk({ level: 0 }) + this.#stdoutColor = stdoutColor + this.#stdoutChalk = stdoutColor ? new Chalk({ level }) : this.#noColorChalk + this.#stderrColor = stderrColor + this.#stderrChalk = stderrColor ? new Chalk({ level }) : this.#noColorChalk + this.#logColors = COLOR_PALETTE({ chalk: this.#stderrChalk }) + + this.#command = command + this.#levelIndex = LEVEL_OPTIONS[loglevel].index + this.#timing = timing + this.#json = json + this.#heading = heading + this.#silent = this.#levelIndex <= 0 + + // Emit resume event on the logs which will flush output + log.resume() + output.flush() + this.#progress.load({ unicode, - progress, - silent, - heading = 'npm', - } = config - - this.#chalk = chalk - - // npmlog is still going away someday, so this is a hack to dynamically - // set the loglevel of timing based on the timing flag, instead of making - // a breaking change to npmlog. The result is that timing logs are never - // shown except when the --timing flag is set. We also need to change - // the index of the silly level since otherwise it is set to -Infinity - // and we can't go any lower than that. silent is still set to Infinify - // because we DO want silent to hide timing levels. This allows for the - // special case of getting timing information while hiding all CLI output - // in order to get perf information that might be affected by writing to - // a terminal. XXX(npmlog): this will be removed along with npmlog - log.levels.silly = -10000 - log.levels.timing = log.levels[loglevel] + (timing ? 1 : -1) - - log.level = loglevel - log.heading = heading - - if (color) { - log.enableColor() - } else { - log.disableColor() + enabled: !!progress && !this.#silent, + }) + } + + // STREAM WRITES + + // Write formatted and (non-)colorized output to streams + #write (stream, options, ...args) { + const colors = stream === this.#stdout ? this.#stdoutColor : this.#stderrColor + const value = formatWithOptions({ colors, ...options }, ...args) + this.#progress.write(() => stream.write(value)) + } + + // HANDLERS + + // Arrow function assigned to a private class field so it can be passed + // directly as a listener and still reference "this" + #logHandler = withMeta((level, meta, ...args) => { + switch (level) { + case log.KEYS.resume: + this.#logState.buffering = false + this.#logState.buffer.forEach((item) => this.#tryWriteLog(...item)) + this.#logState.buffer.length = 0 + break + + case log.KEYS.pause: + this.#logState.buffering = true + break + + default: + if (this.#logState.buffering) { + this.#logState.buffer.push([level, meta, ...args]) + } else { + this.#tryWriteLog(level, meta, ...args) + } + break } + }) - if (unicode) { - log.enableUnicode() - } else { - log.disableUnicode() + // Arrow function assigned to a private class field so it can be passed + // directly as a listener and still reference "this" + #outputHandler = withMeta((level, meta, ...args) => { + this.#json = typeof meta.json === 'boolean' ? meta.json : this.#json + switch (level) { + case output.KEYS.flush: { + this.#outputState.buffering = false + if (this.#json) { + const json = getJsonBuffer(meta, this.#outputState.buffer) + if (json) { + this.#writeOutput(output.KEYS.standard, meta, JSON.stringify(json, null, 2)) + } + } else { + this.#outputState.buffer.forEach((item) => this.#writeOutput(...item)) + } + this.#outputState.buffer.length = 0 + break + } + + case output.KEYS.buffer: + this.#outputState.buffer.push([output.KEYS.standard, meta, ...args]) + break + + default: + if (this.#outputState.buffering) { + this.#outputState.buffer.push([level, meta, ...args]) + } else { + // HACK: Check if the argument looks like a run-script banner. This can be + // replaced with proc-log.META in @npmcli/run-script + if (typeof args[0] === 'string' && args[0].startsWith('\n> ') && args[0].endsWith('\n')) { + if (this.#silent || ['exec', 'explore'].includes(this.#command)) { + // Silent mode and some specific commands always hide run script banners + break + } else if (this.#json) { + // In json mode, change output to stderr since we dont want to break json + // parsing on stdout if the user is piping to jq or something. + // XXX: in a future (breaking?) change it might make sense for run-script to + // always output these banners with proc-log.output.error if we think they + // align closer with "logging" instead of "output" + level = output.KEYS.error + } + } + this.#writeOutput(level, meta, ...args) + } + break } + }) - // if it's silent, don't show progress - if (progress && !silent) { - log.enableProgress() - } else { - log.disableProgress() + #inputHandler = withMeta((level, meta, ...args) => { + switch (level) { + case input.KEYS.start: + log.pause() + this.#outputState.buffering = true + this.#progress.off() + break + + case input.KEYS.end: + log.resume() + output.flush() + this.#progress.resume() + break + + case input.KEYS.read: { + // The convention when calling input.read is to pass in a single fn that returns + // the promise to await. resolve and reject are provided by proc-log + const [res, rej, p] = args + return input.start(() => p() + .then(res) + .catch(rej) + // Any call to procLog.input.read will render a prompt to the user, so we always + // add a single newline of output to stdout to move the cursor to the next line + .finally(() => output.standard(''))) + } } + }) - // Resume displaying logs now that we have config - log.resume() - } + // OUTPUT + + #writeOutput (level, meta, ...args) { + switch (level) { + case output.KEYS.standard: + this.#write(this.#stdout, {}, ...args) + break - log (...args) { - this.#logHandler(...args) + case output.KEYS.error: + this.#write(this.#stderr, {}, ...args) + break + } } - #logHandler = (level, ...args) => { + // LOGS + + #tryWriteLog (level, meta, ...args) { try { - this.#log(level, ...args) + // Also (and this is a really inexcusable kludge), we patch the + // log.warn() method so that when we see a peerDep override + // explanation from Arborist, we can replace the object with a + // highly abbreviated explanation of what's being overridden. + // TODO: this could probably be moved to arborist now that display is refactored + const [heading, message, expl] = args + if (level === log.KEYS.warn && heading === 'ERESOLVE' && expl && typeof expl === 'object') { + this.#writeLog(level, meta, heading, message) + this.#writeLog(level, meta, '', explain(expl, this.#stderrChalk, 2)) + return + } + this.#writeLog(level, meta, ...args) } catch (ex) { try { // if it crashed once, it might again! - this.#npmlog('verbose', `attempt to log ${inspect(args)} crashed`, ex) + this.#writeLog(log.KEYS.verbose, meta, '', `attempt to log crashed`, ...args, ex) } catch (ex2) { + // This happens if the object has an inspect method that crashes so just console.error + // with the errors but don't do anything else that might error again. // eslint-disable-next-line no-console - console.error(`attempt to log ${inspect(args)} crashed`, ex, ex2) + console.error(`attempt to log crashed`, ex, ex2) } } } - #log (...args) { - return this.#eresolveWarn(...args) || this.#npmlog(...args) + #writeLog (level, meta, ...args) { + const levelOpts = LEVEL_METHODS[level] + const show = levelOpts.show ?? (({ index }) => levelOpts.index <= index) + const force = meta.force && !this.#silent + + if (force || show({ index: this.#levelIndex, timing: this.#timing })) { + // this mutates the array so we can pass args directly to format later + const title = args.shift() + const prefix = [ + this.#logColors.heading(this.#heading), + this.#logColors[level](level), + title ? this.#logColors.title(title) : null, + ] + this.#write(this.#stderr, { prefix }, ...args) + } + } +} + +class Progress { + // Taken from https://github.com/sindresorhus/cli-spinners + // MIT License + // Copyright (c) Sindre Sorhus (https://sindresorhus.com) + static dots = { duration: 80, frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] } + static lines = { duration: 130, frames: ['-', '\\', '|', '/'] } + + #stream + #spinner + #enabled = false + + #frameIndex = 0 + #lastUpdate = 0 + #interval + #timeout + + // We are rendering is enabled option is set and we are not waiting for the render timeout + get #rendering () { + return this.#enabled && !this.#timeout + } + + // We are spinning if enabled option is set and the render interval has been set + get #spinning () { + return this.#enabled && this.#interval + } + + constructor ({ stream }) { + this.#stream = stream + } + + load ({ enabled, unicode }) { + this.#enabled = enabled + this.#spinner = unicode ? Progress.dots : Progress.lines + // Dont render the spinner for short durations + this.#render(200) + } + + off () { + if (!this.#enabled) { + return + } + clearTimeout(this.#timeout) + this.#timeout = null + clearInterval(this.#interval) + this.#interval = null + this.#frameIndex = 0 + this.#lastUpdate = 0 + this.#clearSpinner() + } + + resume () { + this.#render() } - // Explicitly call these on npmlog and not log shim - // This is the final place we should call npmlog before removing it. - #npmlog (level, ...args) { - npmlog[level](...args.map(Display.clean)) + // If we are currenting rendering the spinner we clear it + // before writing our line and then re-render the spinner after. + // If not then all we need to do is write the line + write (write) { + if (this.#spinning) { + this.#clearSpinner() + } + write() + if (this.#spinning) { + this.#render() + } + } + + #render (ms) { + if (ms) { + this.#timeout = setTimeout(() => { + this.#timeout = null + this.#renderSpinner() + }, ms) + // Make sure this timeout does not keep the process open + this.#timeout.unref() + } else { + this.#renderSpinner() + } } - // Also (and this is a really inexcusable kludge), we patch the - // log.warn() method so that when we see a peerDep override - // explanation from Arborist, we can replace the object with a - // highly abbreviated explanation of what's being overridden. - #eresolveWarn (level, heading, message, expl) { - if (level === 'warn' && - heading === 'ERESOLVE' && - expl && typeof expl === 'object' - ) { - this.#npmlog(level, heading, message) - this.#npmlog(level, '', explain(expl, this.#chalk, 2)) - // Return true to short circuit other log in chain - return true + #renderSpinner () { + if (!this.#rendering) { + return } + // We always attempt to render immediately but we only request to move to the next + // frame if it has been longer than our spinner frame duration since our last update + this.#renderFrame(Date.now() - this.#lastUpdate >= this.#spinner.duration) + clearInterval(this.#interval) + this.#interval = setInterval(() => this.#renderFrame(true), this.#spinner.duration) + } + + #renderFrame (next) { + if (next) { + this.#lastUpdate = Date.now() + this.#frameIndex++ + if (this.#frameIndex >= this.#spinner.frames.length) { + this.#frameIndex = 0 + } + } + this.#clearSpinner() + this.#stream.write(this.#spinner.frames[this.#frameIndex]) + } + + #clearSpinner () { + // Move to the start of the line and clear the rest of the line + this.#stream.cursorTo(0) + this.#stream.clearLine(1) } } diff --git a/deps/npm/lib/utils/error-message.js b/deps/npm/lib/utils/error-message.js index fc7be8301662e1..4b5582ac8e1816 100644 --- a/deps/npm/lib/utils/error-message.js +++ b/deps/npm/lib/utils/error-message.js @@ -1,39 +1,20 @@ -const { format } = require('util') -const { resolve } = require('path') -const nameValidator = require('validate-npm-package-name') +const { format } = require('node:util') +const { resolve } = require('node:path') const { redactLog: replaceInfo } = require('@npmcli/redact') -const { report } = require('./explain-eresolve.js') -const log = require('./log-shim') - -const messageText = msg => msg.map(line => line.slice(1).join(' ')).join('\n') - -const jsonError = (er, npm, { summary, detail }) => { - if (npm?.config.loaded && npm.config.get('json')) { - return { - error: { - code: er.code, - summary: messageText(summary), - detail: messageText(detail), - }, - } - } -} +const { log } = require('proc-log') const errorMessage = (er, npm) => { - const short = [] + const summary = [] const detail = [] const files = [] - if (er.message) { - er.message = replaceInfo(er.message) - } - if (er.stack) { - er.stack = replaceInfo(er.stack) - } + er.message &&= replaceInfo(er.message) + er.stack &&= replaceInfo(er.stack) switch (er.code) { case 'ERESOLVE': { - short.push(['ERESOLVE', er.message]) + const { report } = require('./explain-eresolve.js') + summary.push(['ERESOLVE', er.message]) detail.push(['', '']) // XXX(display): error messages are logged so we use the logColor since that is based // on stderr. This should be handled solely by the display layer so it could also be @@ -46,175 +27,147 @@ const errorMessage = (er, npm) => { case 'ENOLOCK': { const cmd = npm.command || '' - short.push([cmd, 'This command requires an existing lockfile.']) + summary.push([cmd, 'This command requires an existing lockfile.']) detail.push([cmd, 'Try creating one first with: npm i --package-lock-only']) detail.push([cmd, `Original error: ${er.message}`]) break } case 'ENOAUDIT': - short.push(['audit', er.message]) + summary.push(['audit', er.message]) break case 'ECONNREFUSED': - short.push(['', er]) - detail.push([ + summary.push(['', er]) + detail.push(['', [ '', - [ - '\nIf you are behind a proxy, please make sure that the', - "'proxy' config is set properly. See: 'npm help config'", - ].join('\n'), - ]) + 'If you are behind a proxy, please make sure that the', + "'proxy' config is set properly. See: 'npm help config'", + ].join('\n')]) break case 'EACCES': case 'EPERM': { const isCachePath = - typeof er.path === 'string' && - npm.config.loaded && - er.path.startsWith(npm.config.get('cache')) + typeof er.path === 'string' && npm.loaded && er.path.startsWith(npm.config.get('cache')) const isCacheDest = - typeof er.dest === 'string' && - npm.config.loaded && - er.dest.startsWith(npm.config.get('cache')) - - const { isWindows } = require('./is-windows.js') + typeof er.dest === 'string' && npm.loaded && er.dest.startsWith(npm.config.get('cache')) - if (!isWindows && (isCachePath || isCacheDest)) { + if (process.platform !== 'win32' && (isCachePath || isCacheDest)) { // user probably doesn't need this, but still add it to the debug log log.verbose(er.stack) - short.push([ + summary.push(['', [ '', - [ - '', - 'Your cache folder contains root-owned files, due to a bug in', - 'previous versions of npm which has since been addressed.', - '', - 'To permanently fix this problem, please run:', - ` sudo chown -R ${process.getuid()}:${process.getgid()} ${JSON.stringify( - npm.config.get('cache') - )}`, - ].join('\n'), - ]) + 'Your cache folder contains root-owned files, due to a bug in', + 'previous versions of npm which has since been addressed.', + '', + 'To permanently fix this problem, please run:', + ` sudo chown -R ${process.getuid()}:${process.getgid()} "${npm.config.get('cache')}"`, + ].join('\n')]) } else { - short.push(['', er]) - detail.push([ + summary.push(['', er]) + detail.push(['', [ + '', + 'The operation was rejected by your operating system.', + ...process.platform === 'win32' ? [ + "It's possible that the file was already in use (by a text editor or antivirus),", + 'or that you lack permissions to access it.', + ] : [ + 'It is likely you do not have the permissions to access this file as the current user', + ], '', - [ - '\nThe operation was rejected by your operating system.', - isWindows - /* eslint-disable-next-line max-len */ - ? "It's possible that the file was already in use (by a text editor or antivirus),\n" + - 'or that you lack permissions to access it.' - /* eslint-disable-next-line max-len */ - : 'It is likely you do not have the permissions to access this file as the current user', - '\nIf you believe this might be a permissions issue, please double-check the', - 'permissions of the file and its containing directories, or try running', - 'the command again as root/Administrator.', - ].join('\n'), - ]) + 'If you believe this might be a permissions issue, please double-check the', + 'permissions of the file and its containing directories, or try running', + 'the command again as root/Administrator.', + ].join('\n')]) } break } case 'ENOGIT': - short.push(['', er.message]) - detail.push([ + summary.push(['', er.message]) + detail.push(['', [ '', - ['', 'Failed using git.', 'Please check if you have git installed and in your PATH.'].join( - '\n' - ), - ]) + 'Failed using git.', + 'Please check if you have git installed and in your PATH.', + ].join('\n')]) break case 'EJSONPARSE': // Check whether we ran into a conflict in our own package.json if (er.path === resolve(npm.prefix, 'package.json')) { const { isDiff } = require('parse-conflict-json') - const txt = require('fs').readFileSync(er.path, 'utf8').replace(/\r\n/g, '\n') + const txt = require('node:fs').readFileSync(er.path, 'utf8').replace(/\r\n/g, '\n') if (isDiff(txt)) { - detail.push([ + detail.push(['', [ + 'Merge conflict detected in your package.json.', '', - [ - 'Merge conflict detected in your package.json.', - '', - 'Please resolve the package.json conflict and retry.', - ].join('\n'), - ]) + 'Please resolve the package.json conflict and retry.', + ].join('\n')]) break } } - short.push(['JSON.parse', er.message]) - detail.push([ - 'JSON.parse', - [ - 'Failed to parse JSON data.', - 'Note: package.json must be actual JSON, not just JavaScript.', - ].join('\n'), - ]) + summary.push(['JSON.parse', er.message]) + detail.push(['JSON.parse', [ + 'Failed to parse JSON data.', + 'Note: package.json must be actual JSON, not just JavaScript.', + ].join('\n')]) break case 'EOTP': case 'E401': // E401 is for places where we accidentally neglect OTP stuff if (er.code === 'EOTP' || /one-time pass/.test(er.message)) { - short.push(['', 'This operation requires a one-time password from your authenticator.']) - detail.push([ - '', - [ - 'You can provide a one-time password by passing --otp= to the command you ran.', - 'If you already provided a one-time password then it is likely that you either typoed', - 'it, or it timed out. Please try again.', - ].join('\n'), - ]) + summary.push(['', 'This operation requires a one-time password from your authenticator.']) + detail.push(['', [ + 'You can provide a one-time password by passing --otp= to the command you ran.', + 'If you already provided a one-time password then it is likely that you either typoed', + 'it, or it timed out. Please try again.', + ].join('\n')]) } else { // npm ERR! code E401 // npm ERR! Unable to authenticate, need: Basic - const auth = - !er.headers || !er.headers['www-authenticate'] - ? [] - : er.headers['www-authenticate'].map(au => au.split(/[,\s]+/))[0] + const auth = !er.headers || !er.headers['www-authenticate'] + ? [] + : er.headers['www-authenticate'].map(au => au.split(/[,\s]+/))[0] if (auth.includes('Bearer')) { - short.push([ - '', + summary.push(['', 'Unable to authenticate, your authentication token seems to be invalid.', ]) - detail.push([ - '', - ['To correct this please try logging in again with:', ' npm login'].join('\n'), - ]) + detail.push(['', [ + 'To correct this please try logging in again with:', + ' npm login', + ].join('\n')]) } else if (auth.includes('Basic')) { - short.push(['', 'Incorrect or missing password.']) - detail.push([ + summary.push(['', 'Incorrect or missing password.']) + detail.push(['', [ + 'If you were trying to login, change your password, create an', + 'authentication token or enable two-factor authentication then', + 'that means you likely typed your password in incorrectly.', + 'Please try again, or recover your password at:', + ' https://www.npmjs.com/forgot', '', - [ - 'If you were trying to login, change your password, create an', - 'authentication token or enable two-factor authentication then', - 'that means you likely typed your password in incorrectly.', - 'Please try again, or recover your password at:', - ' https://www.npmjs.com/forgot', - '', - 'If you were doing some other operation then your saved credentials are', - 'probably out of date. To correct this please try logging in again with:', - ' npm login', - ].join('\n'), - ]) + 'If you were doing some other operation then your saved credentials are', + 'probably out of date. To correct this please try logging in again with:', + ' npm login', + ].join('\n')]) } else { - short.push(['', er.message || er]) + summary.push(['', er.message || er]) } } break case 'E404': // There's no need to have 404 in the message as well. - short.push(['404', er.message.replace(/^404\s+/, '')]) + summary.push(['404', er.message.replace(/^404\s+/, '')]) if (er.pkgid && er.pkgid !== '-') { const pkg = er.pkgid.replace(/(?!^)@.*$/, '') detail.push(['404', '']) detail.push(['404', '', `'${replaceInfo(er.pkgid)}' is not in this registry.`]) + const nameValidator = require('validate-npm-package-name') const valResult = nameValidator(pkg) if (!valResult.validForNewPackages) { @@ -224,28 +177,36 @@ const errorMessage = (er, npm) => { errorsArray.forEach((item, idx) => detail.push(['404', ' ' + (idx + 1) + '. ' + item])) } - detail.push(['404', '\nNote that you can also install from a']) + detail.push(['404', '']) + detail.push(['404', 'Note that you can also install from a']) detail.push(['404', 'tarball, folder, http url, or git url.']) } break case 'EPUBLISHCONFLICT': - short.push(['publish fail', 'Cannot publish over existing version.']) + summary.push(['publish fail', 'Cannot publish over existing version.']) detail.push(['publish fail', "Update the 'version' field in package.json and try again."]) detail.push(['publish fail', '']) detail.push(['publish fail', 'To automatically increment version numbers, see:']) - detail.push(['publish fail', ' npm help version']) + detail.push(['publish fail', ' npm help version']) break case 'EISGIT': - short.push(['git', er.message]) - short.push(['git', ' ' + er.path]) - detail.push([ - 'git', - ['Refusing to remove it. Update manually,', 'or move it out of the way first.'].join('\n'), - ]) + summary.push(['git', er.message]) + summary.push(['git', ` ${er.path}`]) + detail.push(['git', [ + 'Refusing to remove it. Update manually,', + 'or move it out of the way first.', + ].join('\n')]) break + case 'EBADDEVENGINES': { + const { current, required } = er + summary.push(['EBADDEVENGINES', er.message]) + detail.push(['EBADDEVENGINES', { current, required }]) + break + } + case 'EBADPLATFORM': { const actual = er.current const expected = { ...er.required } @@ -275,33 +236,25 @@ const errorMessage = (er, npm) => { detailEntry.push(`Actual ${key}:${' '.repeat(padding)}${actual[key]}`) } - short.push([ - 'notsup', - [ - format( - 'Unsupported platform for %s: wanted %j (current: %j)', - er.pkgid, - expected, - actual - ), - ].join('\n'), - ]) - detail.push([ - 'notsup', - detailEntry.join('\n'), - ]) + summary.push(['notsup', format( + 'Unsupported platform for %s: wanted %j (current: %j)', + er.pkgid, + expected, + actual + )]) + detail.push(['notsup', detailEntry.join('\n')]) break } case 'EEXIST': - short.push(['', er.message]) - short.push(['', 'File exists: ' + (er.dest || er.path)]) + summary.push(['', er.message]) + summary.push(['', 'File exists: ' + (er.dest || er.path)]) detail.push(['', 'Remove the existing file and try again, or run npm']) detail.push(['', 'with --force to overwrite files recklessly.']) break case 'ENEEDAUTH': - short.push(['need auth', er.message]) + summary.push(['need auth', er.message]) detail.push(['need auth', 'You need to authorize this machine using `npm adduser`']) break @@ -310,126 +263,185 @@ const errorMessage = (er, npm) => { case 'ETIMEDOUT': case 'ERR_SOCKET_TIMEOUT': case 'EAI_FAIL': - short.push(['network', er.message]) - detail.push([ - 'network', - [ - 'This is a problem related to network connectivity.', - 'In most cases you are behind a proxy or have bad network settings.', - '\nIf you are behind a proxy, please make sure that the', - "'proxy' config is set properly. See: 'npm help config'", - ].join('\n'), - ]) + summary.push(['network', er.message]) + detail.push(['network', [ + 'This is a problem related to network connectivity.', + 'In most cases you are behind a proxy or have bad network settings.', + '', + 'If you are behind a proxy, please make sure that the', + "'proxy' config is set properly. See: 'npm help config'", + ].join('\n')]) break case 'ETARGET': - short.push(['notarget', er.message]) - detail.push([ - 'notarget', - [ - 'In most cases you or one of your dependencies are requesting', - "a package version that doesn't exist.", - ].join('\n'), - ]) + summary.push(['notarget', er.message]) + detail.push(['notarget', [ + 'In most cases you or one of your dependencies are requesting', + "a package version that doesn't exist.", + ].join('\n')]) break case 'E403': - short.push(['403', er.message]) - detail.push([ - '403', - [ - 'In most cases, you or one of your dependencies are requesting', - 'a package version that is forbidden by your security policy, or', - 'on a server you do not have access to.', - ].join('\n'), - ]) + summary.push(['403', er.message]) + detail.push(['403', [ + 'In most cases, you or one of your dependencies are requesting', + 'a package version that is forbidden by your security policy, or', + 'on a server you do not have access to.', + ].join('\n')]) break case 'EBADENGINE': - short.push(['engine', er.message]) - short.push(['engine', 'Not compatible with your version of node/npm: ' + er.pkgid]) - detail.push([ - 'notsup', - [ - 'Not compatible with your version of node/npm: ' + er.pkgid, - 'Required: ' + JSON.stringify(er.required), - 'Actual: ' + - JSON.stringify({ - npm: npm.version, - node: process.version, - }), - ].join('\n'), - ]) + summary.push(['engine', er.message]) + summary.push(['engine', 'Not compatible with your version of node/npm: ' + er.pkgid]) + detail.push(['notsup', [ + 'Not compatible with your version of node/npm: ' + er.pkgid, + 'Required: ' + JSON.stringify(er.required), + 'Actual: ' + + JSON.stringify({ npm: npm.version, node: process.version }), + ].join('\n')]) break case 'ENOSPC': - short.push(['nospc', er.message]) - detail.push([ - 'nospc', - [ - 'There appears to be insufficient space on your system to finish.', - 'Clear up some disk space and try again.', - ].join('\n'), - ]) + summary.push(['nospc', er.message]) + detail.push(['nospc', [ + 'There appears to be insufficient space on your system to finish.', + 'Clear up some disk space and try again.', + ].join('\n')]) break case 'EROFS': - short.push(['rofs', er.message]) - detail.push([ - 'rofs', - [ - 'Often virtualized file systems, or other file systems', - "that don't support symlinks, give this error.", - ].join('\n'), - ]) + summary.push(['rofs', er.message]) + detail.push(['rofs', [ + 'Often virtualized file systems, or other file systems', + "that don't support symlinks, give this error.", + ].join('\n')]) break case 'ENOENT': - short.push(['enoent', er.message]) - detail.push([ - 'enoent', - [ - 'This is related to npm not being able to find a file.', - er.file ? "\nCheck if the file '" + er.file + "' is present." : '', - ].join('\n'), - ]) + summary.push(['enoent', er.message]) + detail.push(['enoent', [ + 'This is related to npm not being able to find a file.', + er.file ? `\nCheck if the file '${er.file}' is present.` : '', + ].join('\n')]) break case 'EMISSINGARG': case 'EUNKNOWNTYPE': case 'EINVALIDTYPE': case 'ETOOMANYARGS': - short.push(['typeerror', er.stack]) - detail.push([ - 'typeerror', - [ - 'This is an error with npm itself. Please report this error at:', - ' https://github.com/npm/cli/issues', - ].join('\n'), - ]) + summary.push(['typeerror', er.stack]) + detail.push(['typeerror', [ + 'This is an error with npm itself. Please report this error at:', + ' https://github.com/npm/cli/issues', + ].join('\n')]) break default: - short.push(['', er.message || er]) + summary.push(['', er.message || er]) + if (er.cause) { + detail.push(['cause', er.cause.message]) + } if (er.signal) { detail.push(['signal', er.signal]) } - if (er.cmd && Array.isArray(er.args)) { detail.push(['command', ...[er.cmd, ...er.args.map(replaceInfo)]]) } - if (er.stdout) { detail.push(['', er.stdout.trim()]) } - if (er.stderr) { detail.push(['', er.stderr.trim()]) } - break } - return { summary: short, detail, files, json: jsonError(er, npm, { summary: short, detail }) } + + return { + summary, + detail, + files, + } +} + +const getExitCodeFromError = (err) => { + if (typeof err?.errno === 'number') { + return err.errno + } else if (typeof err?.code === 'number') { + return err.code + } } -module.exports = errorMessage +const getError = (err, { npm, command, pkg }) => { + // if we got a command that just shells out to something else, then it + // will presumably print its own errors and exit with a proper status + // code if there's a problem. If we got an error with a code=0, then... + // something else went wrong along the way, so maybe an npm problem? + if (command?.constructor?.isShellout && typeof err.code === 'number' && err.code) { + return { + exitCode: err.code, + suppressError: true, + } + } + + // XXX: we should stop throwing strings + if (typeof err === 'string') { + return { + exitCode: 1, + suppressError: true, + summary: [['', err]], + } + } + + // XXX: we should stop throwing other non-errors + if (!(err instanceof Error)) { + return { + exitCode: 1, + suppressError: true, + summary: [['weird error', err]], + } + } + + if (err.code === 'EUNKNOWNCOMMAND') { + const suggestions = require('./did-you-mean.js')(pkg, err.command) + return { + exitCode: 1, + suppressError: true, + standard: [ + `Unknown command: "${err.command}"`, + suggestions, + 'To see a list of supported npm commands, run:', + ' npm help', + ], + } + } + + // Anything after this is not suppressed and get more logged information + + // add a code to the error if it doesnt have one and mutate some properties + // so they have redacted information + err.code ??= err.message.match(/^(?:Error: )?(E[A-Z]+)/)?.[1] + // this mutates the error and redacts stack/message + const { summary, detail, files } = errorMessage(err, npm) + + return { + err, + code: err.code, + exitCode: getExitCodeFromError(err) || 1, + suppressError: false, + summary, + detail, + files, + verbose: ['type', 'stack', 'statusCode', 'pkgid'] + .filter(k => err[k]) + .map(k => [k, replaceInfo(err[k])]), + error: ['code', 'syscall', 'file', 'path', 'dest', 'errno'] + .filter(k => err[k]) + .map(k => [k, err[k]]), + } +} + +module.exports = { + getExitCodeFromError, + errorMessage, + getError, +} diff --git a/deps/npm/lib/utils/exit-handler.js b/deps/npm/lib/utils/exit-handler.js deleted file mode 100644 index 8b4ab45c4d4745..00000000000000 --- a/deps/npm/lib/utils/exit-handler.js +++ /dev/null @@ -1,227 +0,0 @@ -const os = require('os') -const fs = require('fs') - -const log = require('./log-shim.js') -const errorMessage = require('./error-message.js') -const { redactLog: replaceInfo } = require('@npmcli/redact') - -let npm = null // set by the cli -let exitHandlerCalled = false -let showLogFileError = false - -process.on('exit', code => { - log.disableProgress() - - // process.emit is synchronous, so the timeEnd handler will run before the - // unfinished timer check below - process.emit('timeEnd', 'npm') - - const hasLoadedNpm = npm?.config.loaded - - // Unfinished timers can be read before config load - if (npm) { - for (const [name, timer] of npm.unfinishedTimers) { - log.verbose('unfinished npm timer', name, timer) - } - } - - if (!code) { - log.info('ok') - } else { - log.verbose('code', code) - } - - if (!exitHandlerCalled) { - process.exitCode = code || 1 - log.error('', 'Exit handler never called!') - // eslint-disable-next-line no-console - console.error('') - log.error('', 'This is an error with npm itself. Please report this error at:') - log.error('', ' ') - showLogFileError = true - } - - // npm must be loaded to know where the log file was written - if (hasLoadedNpm) { - // write the timing file now, this might do nothing based on the configs set. - // we need to call it here in case it errors so we dont tell the user - // about a timing file that doesn't exist - npm.writeTimingFile() - - const logsDir = npm.logsDir - const logFiles = npm.logFiles - - const timingDir = npm.timingDir - const timingFile = npm.timingFile - - const timing = npm.config.get('timing') - const logsMax = npm.config.get('logs-max') - - // Determine whether to show log file message and why it is - // being shown since in timing mode we always show the log file message - const logMethod = showLogFileError ? 'error' : timing ? 'info' : null - - if (logMethod) { - if (!npm.silent) { - // just a line break if not in silent mode - // eslint-disable-next-line no-console - console.error('') - } - - const message = [] - - if (timingFile) { - message.push(`Timing info written to: ${timingFile}`) - } else if (timing) { - message.push( - `The timing file was not written due to an error writing to the directory: ${timingDir}` - ) - } - - if (logFiles.length) { - message.push(`A complete log of this run can be found in: ${logFiles}`) - } else if (logsMax <= 0) { - // user specified no log file - message.push(`Log files were not written due to the config logs-max=${logsMax}`) - } else { - // could be an error writing to the directory - message.push( - `Log files were not written due to an error writing to the directory: ${logsDir}`, - 'You can rerun the command with `--loglevel=verbose` to see the logs in your terminal' - ) - } - - log[logMethod]('', message.join('\n')) - } - - // This removes any listeners npm setup, mostly for tests to avoid max listener warnings - npm.unload() - } - - // these are needed for the tests to have a clean slate in each test case - exitHandlerCalled = false - showLogFileError = false -}) - -const exitHandler = err => { - exitHandlerCalled = true - - log.disableProgress() - - const hasLoadedNpm = npm?.config.loaded - - if (!npm) { - err = err || new Error('Exit prior to setting npm in exit handler') - // eslint-disable-next-line no-console - console.error(err.stack || err.message) - return process.exit(1) - } - - if (!hasLoadedNpm) { - err = err || new Error('Exit prior to config file resolving.') - // eslint-disable-next-line no-console - console.error(err.stack || err.message) - } - - // only show the notification if it finished. - if (typeof npm.updateNotification === 'string') { - const { level } = log - log.level = 'notice' - log.notice('', npm.updateNotification) - log.level = level - } - - let exitCode = process.exitCode || 0 - let noLogMessage = exitCode !== 0 - let jsonError - - if (err) { - exitCode = 1 - // if we got a command that just shells out to something else, then it - // will presumably print its own errors and exit with a proper status - // code if there's a problem. If we got an error with a code=0, then... - // something else went wrong along the way, so maybe an npm problem? - const isShellout = npm.isShellout - const quietShellout = isShellout && typeof err.code === 'number' && err.code - if (quietShellout) { - exitCode = err.code - noLogMessage = true - } else if (typeof err === 'string') { - // XXX: we should stop throwing strings - log.error('', err) - noLogMessage = true - } else if (!(err instanceof Error)) { - log.error('weird error', err) - noLogMessage = true - } else { - if (!err.code) { - const matchErrorCode = err.message.match(/^(?:Error: )?(E[A-Z]+)/) - err.code = matchErrorCode && matchErrorCode[1] - } - - for (const k of ['type', 'stack', 'statusCode', 'pkgid']) { - const v = err[k] - if (v) { - log.verbose(k, replaceInfo(v)) - } - } - - log.verbose('cwd', process.cwd()) - log.verbose('', os.type() + ' ' + os.release()) - log.verbose('node', process.version) - log.verbose('npm ', 'v' + npm.version) - - for (const k of ['code', 'syscall', 'file', 'path', 'dest', 'errno']) { - const v = err[k] - if (v) { - log.error(k, v) - } - } - - const { summary, detail, json, files = [] } = errorMessage(err, npm) - jsonError = json - - for (let [file, content] of files) { - file = `${npm.logPath}${file}` - content = `'Log files:\n${npm.logFiles.join('\n')}\n\n${content.trim()}\n` - try { - fs.writeFileSync(file, content) - detail.push(['', `\n\nFor a full report see:\n${file}`]) - } catch (logFileErr) { - log.warn('', `Could not write error message to ${file} due to ${logFileErr}`) - } - } - - for (const errline of [...summary, ...detail]) { - log.error(...errline) - } - - if (typeof err.errno === 'number') { - exitCode = err.errno - } else if (typeof err.code === 'number') { - exitCode = err.code - } - } - } - - if (hasLoadedNpm) { - npm.flushOutput(jsonError) - } - - log.verbose('exit', exitCode || 0) - - showLogFileError = (hasLoadedNpm && npm.silent) || noLogMessage - ? false - : !!exitCode - - // explicitly call process.exit now so we don't hang on things like the - // update notifier, also flush stdout/err beforehand because process.exit doesn't - // wait for that to happen. - let flushed = 0 - const flush = [process.stderr, process.stdout] - const exit = () => ++flushed === flush.length && process.exit(exitCode) - flush.forEach((f) => f.write('', exit)) -} - -module.exports = exitHandler -module.exports.setNpm = n => (npm = n) diff --git a/deps/npm/lib/utils/explain-dep.js b/deps/npm/lib/utils/explain-dep.js index 86660d5d3ad4b0..4e9e93454e8a28 100644 --- a/deps/npm/lib/utils/explain-dep.js +++ b/deps/npm/lib/utils/explain-dep.js @@ -1,4 +1,4 @@ -const { relative } = require('path') +const { relative } = require('node:path') const explainNode = (node, depth, chalk) => printNode(node, chalk) + @@ -6,63 +6,32 @@ const explainNode = (node, depth, chalk) => explainLinksIn(node, depth, chalk) const colorType = (type, chalk) => { - const { red, yellow, cyan, magenta, blue, green, gray } = chalk - const style = type === 'extraneous' ? red - : type === 'dev' ? yellow - : type === 'optional' ? cyan - : type === 'peer' ? magenta - : type === 'bundled' ? blue - : type === 'workspace' ? green - : type === 'overridden' ? gray + const style = type === 'extraneous' ? chalk.red + : type === 'dev' ? chalk.blue + : type === 'optional' ? chalk.magenta + : type === 'peer' ? chalk.magentaBright + : type === 'bundled' ? chalk.underline.cyan + : type === 'workspace' ? chalk.blueBright + : type === 'overridden' ? chalk.dim : /* istanbul ignore next */ s => s return style(type) } const printNode = (node, chalk) => { - const { - name, - version, - location, - extraneous, - dev, - optional, - peer, - bundled, - isWorkspace, - overridden, - } = node - const { bold, dim, green } = chalk const extra = [] - if (extraneous) { - extra.push(' ' + bold(colorType('extraneous', chalk))) - } - - if (dev) { - extra.push(' ' + bold(colorType('dev', chalk))) - } - if (optional) { - extra.push(' ' + bold(colorType('optional', chalk))) - } - - if (peer) { - extra.push(' ' + bold(colorType('peer', chalk))) - } - - if (bundled) { - extra.push(' ' + bold(colorType('bundled', chalk))) - } - - if (overridden) { - extra.push(' ' + bold(colorType('overridden', chalk))) + for (const meta of ['extraneous', 'dev', 'optional', 'peer', 'bundled', 'overridden']) { + if (node[meta]) { + extra.push(` ${colorType(meta, chalk)}`) + } } - const pkgid = isWorkspace - ? green(`${name}@${version}`) - : `${bold(name)}@${bold(version)}` + const pkgid = node.isWorkspace + ? chalk.blueBright(`${node.name}@${node.version}`) + : `${node.name}@${node.version}` return `${pkgid}${extra.join('')}` + - (location ? dim(`\n${location}`) : '') + (node.location ? chalk.dim(`\n${node.location}`) : '') } const explainLinksIn = ({ linksIn }, depth, chalk) => { @@ -75,7 +44,7 @@ const explainLinksIn = ({ linksIn }, depth, chalk) => { return str.split('\n').join('\n ') } -const explainDependents = ({ name, dependents }, depth, chalk) => { +const explainDependents = ({ dependents }, depth, chalk) => { if (!dependents || !dependents.length || depth <= 0) { return '' } @@ -107,10 +76,9 @@ const explainDependents = ({ name, dependents }, depth, chalk) => { } const explainEdge = ({ name, type, bundled, from, spec, rawSpec, overridden }, depth, chalk) => { - const { bold } = chalk let dep = type === 'workspace' - ? bold(relative(from.location, spec.slice('file:'.length))) - : `${bold(name)}@"${bold(spec)}"` + ? chalk.bold(relative(from.location, spec.slice('file:'.length))) + : `${name}@"${spec}"` if (overridden) { dep = `${colorType('overridden', chalk)} ${dep} (was "${rawSpec}")` } diff --git a/deps/npm/lib/utils/format-search-stream.js b/deps/npm/lib/utils/format-search-stream.js index 046a4b1e20587b..b70bd915123da4 100644 --- a/deps/npm/lib/utils/format-search-stream.js +++ b/deps/npm/lib/utils/format-search-stream.js @@ -1,6 +1,6 @@ -const { stripVTControlCharacters } = require('node:util') +/* eslint-disable max-len */ +const { stripVTControlCharacters: strip } = require('node:util') const { Minipass } = require('minipass') -const columnify = require('columnify') // This module consumes package data in the following format: // @@ -16,14 +16,48 @@ const columnify = require('columnify') // The returned stream will format this package data // into a byte stream of formatted, displayable output. -module.exports = async (opts) => { - return opts.json ? new JSONOutputStream() : new TextOutputStream(opts) +function filter (data, exclude) { + const words = [data.name] + .concat(data.maintainers.map(m => m.username)) + .concat(data.keywords || []) + .map(f => f?.trim?.()) + .filter(Boolean) + .join(' ') + .toLowerCase() + + if (exclude.find(pattern => { + // Treats both /foo and /foo/ as regex searches + if (pattern.startsWith('/')) { + if (pattern.endsWith('/')) { + pattern = pattern.slice(0, -1) + } + return words.match(new RegExp(pattern.slice(1))) + } + return words.includes(pattern) + })) { + return false + } + + return true +} + +module.exports = (opts) => { + return opts.json ? new JSONOutputStream(opts) : new TextOutputStream(opts) } class JSONOutputStream extends Minipass { #didFirst = false + #exclude + + constructor (opts) { + super() + this.#exclude = opts.exclude + } write (obj) { + if (!filter(obj, this.#exclude)) { + return + } if (!this.#didFirst) { super.write('[\n') this.#didFirst = true @@ -41,94 +75,100 @@ class JSONOutputStream extends Minipass { } class TextOutputStream extends Minipass { - #opts - #line = 0 + #args + #chalk + #exclude + #parseable constructor (opts) { super() - this.#opts = opts + this.#args = opts.args.map(s => s.toLowerCase()).filter(Boolean) + this.#chalk = opts.npm.chalk + this.#exclude = opts.exclude + this.#parseable = opts.parseable } - write (pkg) { - return super.write(this.#prettify(pkg)) - } - - #prettify (data) { + write (data) { + if (!filter(data, this.#exclude)) { + return + } + // Normalize const pkg = { - author: data.maintainers.map((m) => `=${stripVTControlCharacters(m.username)}`).join(' '), - date: 'prehistoric', - description: stripVTControlCharacters(data.description ?? ''), - keywords: '', - name: stripVTControlCharacters(data.name), + authors: data.maintainers.map((m) => `${strip(m.username)}`).join(' '), + publisher: strip(data.publisher?.username || ''), + date: data.date ? data.date.toISOString().slice(0, 10) : 'prehistoric', + description: strip(data.description ?? ''), + keywords: [], + name: strip(data.name), version: data.version, } if (Array.isArray(data.keywords)) { - pkg.keywords = data.keywords.map((k) => stripVTControlCharacters(k)).join(' ') + pkg.keywords = data.keywords.map(strip) } else if (typeof data.keywords === 'string') { - pkg.keywords = stripVTControlCharacters(data.keywords.replace(/[,\s]+/, ' ')) - } - if (data.date) { - pkg.date = data.date.toISOString().split('T')[0] // remove time + pkg.keywords = strip(data.keywords.replace(/[,\s]+/, ' ')).split(' ') } - const columns = ['name', 'description', 'author', 'date', 'version', 'keywords'] - if (this.#opts.parseable) { - return columns.map((col) => pkg[col] && ('' + pkg[col]).replace(/\t/g, ' ')).join('\t') + let output + if (this.#parseable) { + output = [pkg.name, pkg.description, pkg.author, pkg.date, pkg.version, pkg.keywords] + .filter(Boolean) + .map(col => ('' + col).replace(/\t/g, ' ')).join('\t') + return super.write(output) } - // stdout in tap is never a tty - /* istanbul ignore next */ - const maxWidth = process.stdout.isTTY ? process.stdout.getWindowSize()[0] : Infinity - let output = columnify( - [pkg], - { - include: columns, - showHeaders: ++this.#line <= 1, - columnSplitter: ' | ', - truncate: !this.#opts.long, - config: { - name: { minWidth: 25, maxWidth: 25, truncate: false, truncateMarker: '' }, - description: { minWidth: 20, maxWidth: 20 }, - author: { minWidth: 15, maxWidth: 15 }, - date: { maxWidth: 11 }, - version: { minWidth: 8, maxWidth: 8 }, - keywords: { maxWidth: Infinity }, - }, + const keywords = pkg.keywords.map(k => { + if (this.#args.includes(k)) { + return this.#chalk.cyan(k) + } else { + return k + } + }).join(' ') + + let description = [] + for (const arg of this.#args) { + const finder = pkg.description.toLowerCase().split(arg.toLowerCase()) + let p = 0 + for (const f of finder) { + description.push(pkg.description.slice(p, p + f.length)) + const word = pkg.description.slice(p + f.length, p + f.length + arg.length) + description.push(this.#chalk.cyan(word)) + p += f.length + arg.length } - ).split('\n').map(line => line.slice(0, maxWidth)).join('\n') - - if (!this.#opts.color) { - return output } - - const colors = ['31m', '33m', '32m', '36m', '34m', '35m'] - - this.#opts.args.forEach((arg, i) => { - const markStart = String.fromCharCode(i % colors.length + 1) - const markEnd = String.fromCharCode(0) - - if (arg.charAt(0) === '/') { - output = output.replace( - new RegExp(arg.slice(1, -1), 'gi'), - bit => `${markStart}${bit}${markEnd}` - ) - } else { - // just a normal string, do the split/map thing + description = description.filter(Boolean) + let name = pkg.name + if (this.#args.includes(pkg.name)) { + name = this.#chalk.cyan(pkg.name) + } else { + name = [] + for (const arg of this.#args) { + const finder = pkg.name.toLowerCase().split(arg.toLowerCase()) let p = 0 - - output = output.toLowerCase().split(arg.toLowerCase()).map(piece => { - piece = output.slice(p, p + piece.length) - p += piece.length - const mark = `${markStart}${output.slice(p, p + arg.length)}${markEnd}` - p += arg.length - return `${piece}${mark}` - }).join('') + for (const f of finder) { + name.push(pkg.name.slice(p, p + f.length)) + const word = pkg.name.slice(p + f.length, p + f.length + arg.length) + name.push(this.#chalk.cyan(word)) + p += f.length + arg.length + } } - }) + name = this.#chalk.blue(name.join('')) + } - for (let i = 1; i <= colors.length; i++) { - output = output.split(String.fromCharCode(i)).join(`\u001B[${colors[i - 1]}`) + if (description.length) { + output = `${name}\n${description.join('')}\n` + } else { + output = `${name}\n` + } + if (pkg.publisher) { + output += `Version ${this.#chalk.blue(pkg.version)} published ${this.#chalk.blue(pkg.date)} by ${this.#chalk.blue(pkg.publisher)}\n` + } else { + output += `Version ${this.#chalk.blue(pkg.version)} published ${this.#chalk.blue(pkg.date)} by ${this.#chalk.yellow('???')}\n` + } + output += `Maintainers: ${pkg.authors}\n` + if (keywords) { + output += `Keywords: ${keywords}\n` } - return output.split('\u0000').join('\u001B[0m').trim() + output += `${this.#chalk.blue(`https://npm.im/${pkg.name}`)}\n` + return super.write(output) } } diff --git a/deps/npm/lib/utils/format.js b/deps/npm/lib/utils/format.js new file mode 100644 index 00000000000000..aaecfe1ba0e7a7 --- /dev/null +++ b/deps/npm/lib/utils/format.js @@ -0,0 +1,50 @@ +const { formatWithOptions: baseFormatWithOptions } = require('node:util') + +// These are most assuredly not a mistake +// https://eslint.org/docs/latest/rules/no-control-regex +// \x00 through \x1f, \x7f through \x9f, not including \x09 \x0a \x0b \x0d +/* eslint-disable-next-line no-control-regex */ +const HAS_C01 = /[\x00-\x08\x0c\x0e-\x1f\x7f-\x9f]/ + +// Allows everything up to '[38;5;255m' in 8 bit notation +const ALLOWED_SGR = /^\[[0-9;]{0,8}m/ + +// '[38;5;255m'.length +const SGR_MAX_LEN = 10 + +// Strips all ANSI C0 and C1 control characters (except for SGR up to 8 bit) +function STRIP_C01 (str) { + if (!HAS_C01.test(str)) { + return str + } + let result = '' + for (let i = 0; i < str.length; i++) { + const char = str[i] + const code = char.charCodeAt(0) + if (!HAS_C01.test(char)) { + // Most characters are in this set so continue early if we can + result = `${result}${char}` + } else if (code === 27 && ALLOWED_SGR.test(str.slice(i + 1, i + SGR_MAX_LEN + 1))) { + // \x1b with allowed SGR + result = `${result}\x1b` + } else if (code <= 31) { + // escape all other C0 control characters besides \x7f + result = `${result}^${String.fromCharCode(code + 64)}` + } else { + // hasC01 ensures this is now a C1 control character or \x7f + result = `${result}^${String.fromCharCode(code - 64)}` + } + } + return result +} + +const formatWithOptions = ({ prefix: prefixes = [], eol = '\n', ...options }, ...args) => { + const prefix = prefixes.filter(p => p != null).join(' ') + const formatted = STRIP_C01(baseFormatWithOptions(options, ...args)) + // Splitting could be changed to only `\n` once we are sure we only emit unix newlines. + // The eol param to this function will put the correct newlines in place for the returned string. + const lines = formatted.split(/\r?\n/) + return lines.reduce((acc, l) => `${acc}${prefix}${prefix && l ? ' ' : ''}${l}${eol}`, '') +} + +module.exports = { formatWithOptions } diff --git a/deps/npm/lib/utils/get-workspaces.js b/deps/npm/lib/utils/get-workspaces.js new file mode 100644 index 00000000000000..48c26779bb1373 --- /dev/null +++ b/deps/npm/lib/utils/get-workspaces.js @@ -0,0 +1,54 @@ +const { resolve, relative } = require('node:path') +const mapWorkspaces = require('@npmcli/map-workspaces') +const { minimatch } = require('minimatch') +const pkgJson = require('@npmcli/package-json') + +// minimatch wants forward slashes only for glob patterns +const globify = pattern => pattern.split('\\').join('/') + +// Returns an Map of paths to workspaces indexed by workspace name +// { foo => '/path/to/foo' } +const getWorkspaces = async (filters, { path, includeWorkspaceRoot, relativeFrom }) => { + // TODO we need a better error to be bubbled up here if this call fails + const { content: pkg } = await pkgJson.normalize(path) + const workspaces = await mapWorkspaces({ cwd: path, pkg }) + let res = new Map() + if (includeWorkspaceRoot) { + res.set(pkg.name, path) + } + + if (!filters.length) { + res = new Map([...res, ...workspaces]) + } + + for (const filterArg of filters) { + for (const [workspaceName, workspacePath] of workspaces.entries()) { + let relativePath = relative(relativeFrom, workspacePath) + if (filterArg.startsWith('./')) { + relativePath = `./${relativePath}` + } + const relativeFilter = relative(path, filterArg) + if (filterArg === workspaceName + || resolve(relativeFrom, filterArg) === workspacePath + || minimatch(relativePath, `${globify(relativeFilter)}/*`) + || minimatch(relativePath, `${globify(filterArg)}/*`) + ) { + res.set(workspaceName, workspacePath) + } + } + } + + if (!res.size) { + let msg = '!' + if (filters.length) { + msg = `:\n ${filters.reduce( + (acc, filterArg) => `${acc} --workspace=${filterArg}`, '')}` + } + + throw new Error(`No workspaces found${msg}`) + } + + return res +} + +module.exports = getWorkspaces diff --git a/deps/npm/lib/utils/installed-deep.js b/deps/npm/lib/utils/installed-deep.js new file mode 100644 index 00000000000000..3c56c5d036f256 --- /dev/null +++ b/deps/npm/lib/utils/installed-deep.js @@ -0,0 +1,45 @@ +const { resolve } = require('node:path') +const localeCompare = require('@isaacs/string-locale-compare')('en') + +const installedDeep = async (npm) => { + const Arborist = require('@npmcli/arborist') + const { + depth, + global, + prefix, + workspacesEnabled, + } = npm.flatOptions + + const getValues = (tree) => + [...tree.inventory.values()] + .filter(i => i.location !== '' && !i.isRoot) + .map(i => { + return i + }) + .filter(i => (i.depth - 1) <= depth) + .sort((a, b) => (a.depth - b.depth) || localeCompare(a.name, b.name)) + + const res = new Set() + const gArb = new Arborist({ + global: true, + path: resolve(npm.globalDir, '..'), + workspacesEnabled, + }) + const gTree = await gArb.loadActual({ global: true }) + + for (const node of getValues(gTree)) { + res.add(global ? node.name : [node.name, '-g']) + } + + if (!global) { + const arb = new Arborist({ global: false, path: prefix, workspacesEnabled }) + const tree = await arb.loadActual() + for (const node of getValues(tree)) { + res.add(node.name) + } + } + + return [...res] +} + +module.exports = installedDeep diff --git a/deps/npm/lib/utils/completion/installed-shallow.js b/deps/npm/lib/utils/installed-shallow.js similarity index 100% rename from deps/npm/lib/utils/completion/installed-shallow.js rename to deps/npm/lib/utils/installed-shallow.js diff --git a/deps/npm/lib/utils/is-windows.js b/deps/npm/lib/utils/is-windows.js index 57f6599b6ae192..63c5671d8400ee 100644 --- a/deps/npm/lib/utils/is-windows.js +++ b/deps/npm/lib/utils/is-windows.js @@ -1,6 +1,4 @@ -const isWindows = process.platform === 'win32' -const isWindowsShell = isWindows && +const isWindowsShell = (process.platform === 'win32') && !/^MINGW(32|64)$/.test(process.env.MSYSTEM) && process.env.TERM !== 'cygwin' -exports.isWindows = isWindows exports.isWindowsShell = isWindowsShell diff --git a/deps/npm/lib/utils/log-file.js b/deps/npm/lib/utils/log-file.js index 8c06f5647e761e..6c9bcd7ff8d86b 100644 --- a/deps/npm/lib/utils/log-file.js +++ b/deps/npm/lib/utils/log-file.js @@ -1,20 +1,16 @@ -const os = require('os') -const { join, dirname, basename } = require('path') -const { format } = require('util') -const { glob } = require('glob') -const { Minipass } = require('minipass') +const os = require('node:os') +const { join, dirname, basename } = require('node:path') const fsMiniPass = require('fs-minipass') -const fs = require('fs/promises') -const log = require('./log-shim') -const Display = require('./display') +const fs = require('node:fs/promises') +const { log } = require('proc-log') +const { formatWithOptions } = require('./format') const padZero = (n, length) => n.toString().padStart(length.toString().length, '0') -const globify = pattern => pattern.split('\\').join('/') class LogFiles { - // Default to a plain minipass stream so we can buffer + // Default to an array so we can buffer // initial writes before we know the cache location - #logStream = null + #logStream = [] // We cap log files at a certain number of log events per file. // Note that each log event can write more than one line to the @@ -32,6 +28,7 @@ class LogFiles { #path = null #logsMax = null #files = [] + #timing = false constructor ({ maxLogsPerFile = 50_000, @@ -42,23 +39,7 @@ class LogFiles { this.on() } - static format (count, level, title, ...args) { - let prefix = `${count} ${level}` - if (title) { - prefix += ` ${title}` - } - - return format(...args) - .split(/\r?\n/) - .map(Display.clean) - .reduce((lines, line) => - lines += prefix + (line ? ' ' : '') + line + os.EOL, - '' - ) - } - on () { - this.#logStream = new Minipass() process.on('log', this.#logHandler) } @@ -67,11 +48,16 @@ class LogFiles { this.#endStream() } - load ({ path, logsMax = Infinity } = {}) { + load ({ command, path, logsMax = Infinity, timing } = {}) { + if (['completion'].includes(command)) { + return + } + // dir is user configurable and is required to exist so // this can error if the dir is missing or not configured correctly this.#path = path this.#logsMax = logsMax + this.#timing = timing // Log stream has already ended if (!this.#logStream) { @@ -80,36 +66,40 @@ class LogFiles { log.verbose('logfile', `logs-max:${logsMax} dir:${this.#path}`) - // Pipe our initial stream to our new file stream and + // Write the contents of our array buffer to our new file stream and // set that as the new log logstream for future writes // if logs max is 0 then the user does not want a log file if (this.#logsMax > 0) { const initialFile = this.#openLogFile() if (initialFile) { - this.#logStream = this.#logStream.pipe(initialFile) + for (const item of this.#logStream) { + const formatted = this.#formatLogItem(...item) + if (formatted !== null) { + initialFile.write(formatted) + } + } + this.#logStream = initialFile } } + log.verbose('logfile', this.files[0] || 'no logfile created') + // Kickoff cleaning process, even if we aren't writing a logfile. // This is async but it will always ignore the current logfile // Return the result so it can be awaited in tests return this.#cleanLogs() } - log (...args) { - this.#logHandler(...args) - } - get files () { return this.#files } get #isBuffered () { - return this.#logStream instanceof Minipass + return Array.isArray(this.#logStream) } #endStream (output) { - if (this.#logStream) { + if (this.#logStream && !this.#isBuffered) { this.#logStream.end(output) this.#logStream = null } @@ -127,12 +117,15 @@ class LogFiles { return } - const logOutput = this.#formatLogItem(level, ...args) - if (this.#isBuffered) { // Cant do anything but buffer the output if we dont // have a file stream yet - this.#logStream.write(logOutput) + this.#logStream.push([level, ...args]) + return + } + + const logOutput = this.#formatLogItem(level, ...args) + if (logOutput === null) { return } @@ -152,9 +145,15 @@ class LogFiles { } } - #formatLogItem (...args) { + #formatLogItem (level, title, ...args) { + // Only right timing logs to logfile if explicitly requests + if (level === log.KEYS.timing && !this.#timing) { + return null + } + this.#fileLogCount += 1 - return LogFiles.format(this.#totalLogCount++, ...args) + const prefix = [this.#totalLogCount++, level, title || null] + return formatWithOptions({ prefix, eol: os.EOL, colors: false }, ...args) } #getLogFilePath (count = '') { @@ -199,17 +198,41 @@ class LogFiles { try { const logPath = this.#getLogFilePath() - const logGlob = join(dirname(logPath), basename(logPath) + const patternFileName = basename(logPath) // tell glob to only match digits - .replace(/\d/g, '[0123456789]') + .replace(/\d/g, 'd') // Handle the old (prior to 8.2.0) log file names which did not have a // counter suffix - .replace(/-\.log$/, '*.log') - ) + .replace('-.log', '') + + let files = await fs.readdir( + dirname(logPath), { + withFileTypes: true, + encoding: 'utf-8', + }) + files = files.sort((a, b) => basename(a.name).localeCompare(basename(b.name), 'en')) + + const logFiles = [] + + for (const file of files) { + if (!file.isFile()) { + continue + } + + const genericFileName = file.name.replace(/\d/g, 'd') + const filePath = join(dirname(logPath), basename(file.name)) + + // Always ignore the currently written files + if ( + genericFileName.includes(patternFileName) + && genericFileName.endsWith('.log') + && !this.#files.includes(filePath) + ) { + logFiles.push(filePath) + } + } - // Always ignore the currently written files - const files = await glob(globify(logGlob), { ignore: this.#files.map(globify), silent: true }) - const toDelete = files.length - this.#logsMax + const toDelete = logFiles.length - this.#logsMax if (toDelete <= 0) { return @@ -217,7 +240,7 @@ class LogFiles { log.silly('logfile', `start cleaning logs, removing ${toDelete} files`) - for (const file of files.slice(0, toDelete)) { + for (const file of logFiles.slice(0, toDelete)) { try { await fs.rm(file, { force: true }) } catch (e) { @@ -227,7 +250,7 @@ class LogFiles { } catch (e) { // Disable cleanup failure warnings when log writing is disabled if (this.#logsMax > 0) { - log.warn('logfile', 'error cleaning log files', e) + log.verbose('logfile', 'error cleaning log files', e) } } finally { log.silly('logfile', 'done cleaning log files') diff --git a/deps/npm/lib/utils/log-shim.js b/deps/npm/lib/utils/log-shim.js deleted file mode 100644 index 9d5a36d967413f..00000000000000 --- a/deps/npm/lib/utils/log-shim.js +++ /dev/null @@ -1,59 +0,0 @@ -const NPMLOG = require('npmlog') -const PROCLOG = require('proc-log') - -// Sets getter and optionally a setter -// otherwise setting should throw -const accessors = (obj, set) => (k) => ({ - get: () => obj[k], - set: set ? (v) => (obj[k] = v) : () => { - throw new Error(`Cant set ${k}`) - }, -}) - -// Set the value to a bound function on the object -const value = (obj) => (k) => ({ - value: (...args) => obj[k].apply(obj, args), -}) - -const properties = { - // npmlog getters/setters - level: accessors(NPMLOG, true), - heading: accessors(NPMLOG, true), - levels: accessors(NPMLOG), - gauge: accessors(NPMLOG), - stream: accessors(NPMLOG), - tracker: accessors(NPMLOG), - progressEnabled: accessors(NPMLOG), - // npmlog methods - useColor: value(NPMLOG), - enableColor: value(NPMLOG), - disableColor: value(NPMLOG), - enableUnicode: value(NPMLOG), - disableUnicode: value(NPMLOG), - enableProgress: value(NPMLOG), - disableProgress: value(NPMLOG), - clearProgress: value(NPMLOG), - showProgress: value(NPMLOG), - newItem: value(NPMLOG), - newGroup: value(NPMLOG), - // proclog methods - notice: value(PROCLOG), - error: value(PROCLOG), - warn: value(PROCLOG), - info: value(PROCLOG), - verbose: value(PROCLOG), - http: value(PROCLOG), - silly: value(PROCLOG), - pause: value(PROCLOG), - resume: value(PROCLOG), -} - -const descriptors = Object.entries(properties).reduce((acc, [k, v]) => { - acc[k] = { enumerable: true, ...v(k) } - return acc -}, {}) - -// Create an object with the allowed properties rom npm log and all -// the logging methods from proc log -// XXX: this should go away and requires of this should be replaced with proc-log + new display -module.exports = Object.freeze(Object.defineProperties({}, descriptors)) diff --git a/deps/npm/lib/utils/open-url-prompt.js b/deps/npm/lib/utils/open-url-prompt.js deleted file mode 100644 index 71a68c253c0505..00000000000000 --- a/deps/npm/lib/utils/open-url-prompt.js +++ /dev/null @@ -1,69 +0,0 @@ -const readline = require('readline') -const open = require('./open-url.js') - -function print (npm, title, url) { - const json = npm.config.get('json') - - const message = json ? JSON.stringify({ title, url }) : `${title}:\n${url}` - - npm.output(message) -} - -// Prompt to open URL in browser if possible -const promptOpen = async (npm, url, title, prompt, emitter) => { - const browser = npm.config.get('browser') - const isInteractive = process.stdin.isTTY === true && process.stdout.isTTY === true - - try { - if (!/^https?:$/.test(new URL(url).protocol)) { - throw new Error() - } - } catch (_) { - throw new Error('Invalid URL: ' + url) - } - - print(npm, title, url) - - if (browser === false || !isInteractive) { - return - } - - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }) - - const tryOpen = await new Promise(resolve => { - rl.on('SIGINT', () => { - rl.close() - resolve('SIGINT') - }) - - rl.question(prompt, () => { - resolve(true) - }) - - if (emitter && emitter.addListener) { - emitter.addListener('abort', () => { - rl.close() - - // clear the prompt line - npm.output('') - - resolve(false) - }) - } - }) - - if (tryOpen === 'SIGINT') { - throw new Error('canceled') - } - - if (!tryOpen) { - return - } - - await open(npm, url, 'Browser unavailable. Please open the URL manually') -} - -module.exports = promptOpen diff --git a/deps/npm/lib/utils/open-url.js b/deps/npm/lib/utils/open-url.js index 77bb1d03d8e165..632dcc79949d66 100644 --- a/deps/npm/lib/utils/open-url.js +++ b/deps/npm/lib/utils/open-url.js @@ -1,50 +1,98 @@ -const promiseSpawn = require('@npmcli/promise-spawn') +const { open } = require('@npmcli/promise-spawn') +const { output, input } = require('proc-log') +const { URL } = require('node:url') +const readline = require('node:readline/promises') +const { once } = require('node:events') -const { URL } = require('url') +const assertValidUrl = (url) => { + try { + if (!/^https?:$/.test(new URL(url).protocol)) { + throw new Error() + } + } catch { + throw new Error('Invalid URL: ' + url) + } +} + +const outputMsg = (json, title, url) => { + if (json) { + output.buffer({ title, url }) + } else { + output.standard(`${title}:\n${url}`) + } +} // attempt to open URL in web-browser, print address otherwise: -const open = async (npm, url, errMsg, isFile) => { +const openUrl = async (npm, url, title, isFile) => { url = encodeURI(url) const browser = npm.config.get('browser') - - function printAlternateMsg () { - const json = npm.config.get('json') - const alternateMsg = json - ? JSON.stringify({ - title: errMsg, - url, - }, null, 2) - : `${errMsg}:\n ${url}\n` - - npm.output(alternateMsg) - } + const json = npm.config.get('json') if (browser === false) { - printAlternateMsg() + outputMsg(json, title, url) return } // We pass this in as true from the help command so we know we don't have to // check the protocol if (!isFile) { - try { - if (!/^https?:$/.test(new URL(url).protocol)) { - throw new Error() - } - } catch { - throw new Error('Invalid URL: ' + url) + assertValidUrl(url) + } + + try { + await input.start(() => open(url, { + command: browser === true ? null : browser, + })) + } catch (err) { + if (err.code !== 127) { + throw err } + outputMsg(json, title, url) } +} + +// Prompt to open URL in browser if possible +const openUrlPrompt = async (npm, url, title, prompt, { signal }) => { + const browser = npm.config.get('browser') + const json = npm.config.get('json') - const command = browser === true ? null : browser - await promiseSpawn.open(url, { command }) - .catch((err) => { - if (err.code !== 127) { - throw err - } + assertValidUrl(url) + outputMsg(json, title, url) + + if (browser === false || !process.stdin.isTTY || !process.stdout.isTTY) { + return + } - printAlternateMsg() - }) + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }) + + try { + await input.read(() => Promise.race([ + rl.question(prompt, { signal }), + once(rl, 'error'), + once(rl, 'SIGINT').then(() => { + throw new Error('canceled') + }), + ])) + rl.close() + await openUrl(npm, url, 'Browser unavailable. Please open the URL manually') + } catch (err) { + rl.close() + if (err.name !== 'AbortError') { + throw err + } + } } -module.exports = open +// Rearrange arguments and return a function that takes the two arguments +// returned from the npm-profile methods that take an opener +const createOpener = (npm, title, prompt = 'Press ENTER to open in the browser...') => + (url, opts) => openUrlPrompt(npm, url, title, prompt, opts) + +module.exports = { + openUrl, + openUrlPrompt, + createOpener, +} diff --git a/deps/npm/lib/utils/otplease.js b/deps/npm/lib/utils/otplease.js deleted file mode 100644 index b4aa1674692551..00000000000000 --- a/deps/npm/lib/utils/otplease.js +++ /dev/null @@ -1,48 +0,0 @@ -const log = require('./log-shim') -async function otplease (npm, opts, fn) { - try { - return await fn(opts) - } catch (err) { - if (!process.stdin.isTTY || !process.stdout.isTTY) { - throw err - } - - if (isWebOTP(err)) { - log.disableProgress() - const webAuth = require('./web-auth') - const openUrlPrompt = require('./open-url-prompt') - - const openerPromise = (url, emitter) => - openUrlPrompt( - npm, - url, - 'Authenticate your account at', - 'Press ENTER to open in the browser...', - emitter - ) - const otp = await webAuth(openerPromise, err.body.authUrl, err.body.doneUrl, opts) - return await fn({ ...opts, otp }) - } - - if (isClassicOTP(err)) { - const readUserInfo = require('./read-user-info.js') - const otp = await readUserInfo.otp('This operation requires a one-time password.\nEnter OTP:') - return await fn({ ...opts, otp }) - } - - throw err - } -} - -function isWebOTP (err) { - if (err.code === 'EOTP' && err.body) { - return err.body.authUrl && err.body.doneUrl - } - return false -} - -function isClassicOTP (err) { - return err.code === 'EOTP' || (err.code === 'E401' && /one-time pass/.test(err.body)) -} - -module.exports = otplease diff --git a/deps/npm/lib/utils/output-error.js b/deps/npm/lib/utils/output-error.js new file mode 100644 index 00000000000000..27128e9f03a8c3 --- /dev/null +++ b/deps/npm/lib/utils/output-error.js @@ -0,0 +1,29 @@ +const { log, output } = require('proc-log') + +const outputError = ({ standard = [], verbose = [], error = [], summary = [], detail = [] }) => { + for (const line of standard) { + // Each output line is just a single string + output.standard(line) + } + for (const line of verbose) { + log.verbose(...line) + } + for (const line of [...error, ...summary, ...detail]) { + log.error(...line) + } +} + +const jsonError = (error, npm) => { + if (error && npm?.loaded && npm?.config.get('json')) { + return { + code: error.code, + summary: (error.summary || []).map(l => l.slice(1).join(' ')).join('\n').trim(), + detail: (error.detail || []).map(l => l.slice(1).join(' ')).join('\n').trim(), + } + } +} + +module.exports = { + outputError, + jsonError, +} diff --git a/deps/npm/lib/utils/ping.js b/deps/npm/lib/utils/ping.js index 00956d0c1630ce..1c8c9e827a4eaa 100644 --- a/deps/npm/lib/utils/ping.js +++ b/deps/npm/lib/utils/ping.js @@ -2,6 +2,6 @@ // used by the ping and doctor commands const fetch = require('npm-registry-fetch') module.exports = async (flatOptions) => { - const res = await fetch('/-/ping?write=true', flatOptions) + const res = await fetch('/-/ping', { ...flatOptions, cache: false }) return res.json().catch(() => ({})) } diff --git a/deps/npm/lib/utils/pulse-till-done.js b/deps/npm/lib/utils/pulse-till-done.js deleted file mode 100644 index 22294141474839..00000000000000 --- a/deps/npm/lib/utils/pulse-till-done.js +++ /dev/null @@ -1,26 +0,0 @@ -const log = require('./log-shim.js') - -let pulseTimer = null -const withPromise = async (promise) => { - pulseStart() - try { - return await promise - } finally { - pulseStop() - } -} - -const pulseStart = () => { - pulseTimer = pulseTimer || setInterval(() => { - log.gauge.pulse('') - }, 150) -} - -const pulseStop = () => { - clearInterval(pulseTimer) - pulseTimer = null -} - -module.exports = { - withPromise, -} diff --git a/deps/npm/lib/utils/queryable.js b/deps/npm/lib/utils/queryable.js index 69621d928e8ddc..a5fb25a845eafc 100644 --- a/deps/npm/lib/utils/queryable.js +++ b/deps/npm/lib/utils/queryable.js @@ -1,4 +1,4 @@ -const util = require('util') +const util = require('node:util') const _delete = Symbol('delete') const _append = Symbol('append') @@ -83,7 +83,7 @@ const parseKeys = key => { return res } -const getter = ({ data, key }) => { +const getter = ({ data, key }, { unwrapSingleItemArrays = true } = {}) => { // keys are a list in which each entry represents the name of // a property that should be walked through the object in order to // return the final found value @@ -122,7 +122,7 @@ const getter = ({ data, key }) => { // these are some legacy expectations from // the old API consumed by lib/view.js - if (Array.isArray(_data) && _data.length <= 1) { + if (unwrapSingleItemArrays && Array.isArray(_data) && _data.length <= 1) { _data = _data[0] } @@ -231,6 +231,8 @@ const setter = ({ data, key, value, force }) => { } class Queryable { + static ALL = '' + #data = null constructor (obj) { @@ -243,19 +245,19 @@ class Queryable { this.#data = obj } - query (queries) { + query (queries, opts) { // this ugly interface here is meant to be a compatibility layer // with the legacy API lib/view.js is consuming, if at some point // we refactor that command then we can revisit making this nicer - if (queries === '') { - return { '': this.#data } + if (queries === Queryable.ALL) { + return { [Queryable.ALL]: this.#data } } const q = query => getter({ data: this.#data, key: query, - }) + }, opts) if (Array.isArray(queries)) { let res = {} diff --git a/deps/npm/lib/utils/read-user-info.js b/deps/npm/lib/utils/read-user-info.js index fa1cea158e8974..a9a50f8263ff63 100644 --- a/deps/npm/lib/utils/read-user-info.js +++ b/deps/npm/lib/utils/read-user-info.js @@ -1,11 +1,6 @@ -const { read } = require('read') +const { read: _read } = require('read') const userValidate = require('npm-user-validate') -const log = require('./log-shim.js') - -exports.otp = readOTP -exports.password = readPassword -exports.username = readUsername -exports.email = readEmail +const { log, input } = require('proc-log') const otpPrompt = `This command requires a one-time password (OTP) from your authenticator app. Enter one below. You can also pass one on the command line by appending --otp=123456. @@ -16,17 +11,14 @@ const passwordPrompt = 'npm password: ' const usernamePrompt = 'npm username: ' const emailPrompt = 'email (this IS public): ' -function readWithProgress (opts) { - log.clearProgress() - return read(opts).finally(() => log.showProgress()) -} +const read = (...args) => input.read(() => _read(...args)) function readOTP (msg = otpPrompt, otp, isRetry) { if (isRetry && otp && /^[\d ]+$|^[A-Fa-f0-9]{64,64}$/.test(otp)) { return otp.replace(/\s+/g, '') } - return readWithProgress({ prompt: msg, default: otp || '' }) + return read({ prompt: msg, default: otp || '' }) .then((rOtp) => readOTP(msg, rOtp, true)) } @@ -35,7 +27,7 @@ function readPassword (msg = passwordPrompt, password, isRetry) { return password } - return readWithProgress({ prompt: msg, silent: true, default: password || '' }) + return read({ prompt: msg, silent: true, default: password || '' }) .then((rPassword) => readPassword(msg, rPassword, true)) } @@ -49,7 +41,7 @@ function readUsername (msg = usernamePrompt, username, isRetry) { } } - return readWithProgress({ prompt: msg, default: username || '' }) + return read({ prompt: msg, default: username || '' }) .then((rUsername) => readUsername(msg, rUsername, true)) } @@ -63,6 +55,13 @@ function readEmail (msg = emailPrompt, email, isRetry) { } } - return readWithProgress({ prompt: msg, default: email || '' }) + return read({ prompt: msg, default: email || '' }) .then((username) => readEmail(msg, username, true)) } + +module.exports = { + otp: readOTP, + password: readPassword, + username: readUsername, + email: readEmail, +} diff --git a/deps/npm/lib/utils/reify-finish.js b/deps/npm/lib/utils/reify-finish.js index 9b43abcb7610a1..410c19730cdf4c 100644 --- a/deps/npm/lib/utils/reify-finish.js +++ b/deps/npm/lib/utils/reify-finish.js @@ -1,7 +1,7 @@ const reifyOutput = require('./reify-output.js') const ini = require('ini') -const { writeFile } = require('fs').promises -const { resolve } = require('path') +const { writeFile } = require('node:fs/promises') +const { resolve } = require('node:path') const reifyFinish = async (npm, arb) => { await saveBuiltinConfig(npm, arb) diff --git a/deps/npm/lib/utils/reify-output.js b/deps/npm/lib/utils/reify-output.js index 44c913812a8efe..025479f0c8e600 100644 --- a/deps/npm/lib/utils/reify-output.js +++ b/deps/npm/lib/utils/reify-output.js @@ -9,13 +9,12 @@ // found 37 vulnerabilities (5 low, 7 moderate, 25 high) // run `npm audit fix` to fix them, or `npm audit` for details -const log = require('./log-shim.js') +const { log, output } = require('proc-log') const { depth } = require('treeverse') const ms = require('ms') const npmAuditReport = require('npm-audit-report') const { readTree: getFundingInfo } = require('libnpmfund') const auditError = require('./audit-error.js') -const Table = require('cli-table3') // TODO: output JSON if flatOptions.json is true const reifyOutput = (npm, arb) => { @@ -42,51 +41,31 @@ const reifyOutput = (npm, arb) => { } if (diff) { - let diffTable - if (npm.config.get('dry-run') || npm.config.get('long')) { - diffTable = new Table({ - chars: { - top: '', - 'top-mid': '', - 'top-left': '', - 'top-right': '', - bottom: '', - 'bottom-mid': '', - 'bottom-left': '', - 'bottom-right': '', - left: '', - 'left-mid': '', - mid: '', - 'mid-mid': '', - right: '', - 'right-mid': '', - middle: ' ', - }, - style: { - 'padding-left': 0, - 'padding-right': 0, - border: 0, - }, - }) - } + const showDiff = npm.config.get('dry-run') || npm.config.get('long') + const chalk = npm.chalk depth({ tree: diff, visit: d => { switch (d.action) { case 'REMOVE': - diffTable?.push(['remove', d.actual.name, d.actual.package.version]) + if (showDiff) { + /* eslint-disable-next-line max-len */ + output.standard(`${chalk.blue('remove')} ${d.actual.name} ${d.actual.package.version}`) + } summary.removed++ break case 'ADD': - diffTable?.push(['add', d.ideal.name, d.ideal.package.version]) + if (showDiff) { + output.standard(`${chalk.green('add')} ${d.ideal.name} ${d.ideal.package.version}`) + } actualTree.inventory.has(d.ideal) && summary.added++ break case 'CHANGE': - diffTable?.push(['change', - d.actual.name, - d.actual.package.version + ' -> ' + d.ideal.package.version, - ]) + if (showDiff) { + /* eslint-disable-next-line max-len */ + output.standard(`${chalk.cyan('change')} ${d.actual.name} ${d.actual.package.version} => ${d.ideal.package.version}`) + } summary.changed++ break default: @@ -97,10 +76,6 @@ const reifyOutput = (npm, arb) => { }, getChildren: d => d.children, }) - - if (diffTable) { - npm.output('\n' + diffTable.toString()) - } } if (npm.flatOptions.fund) { @@ -115,7 +90,7 @@ const reifyOutput = (npm, arb) => { summary.audit = npm.command === 'audit' ? auditReport : auditReport.toJSON().metadata } - npm.output(JSON.stringify(summary, null, 2)) + output.buffer(summary) } else { packagesChangedMessage(npm, summary) packagesFundingMessage(npm, summary) @@ -134,7 +109,7 @@ const printAuditReport = (npm, report) => { if (!res || !res.report) { return } - npm.output(`\n${res.report}`) + output.standard(`\n${res.report}`) } const getAuditReport = (npm, report) => { @@ -206,7 +181,7 @@ const packagesChangedMessage = (npm, { added, removed, changed, audited }) => { } msg.push(` in ${ms(Date.now() - npm.started)}`) - npm.output(msg.join('')) + output.standard(msg.join('')) } const packagesFundingMessage = (npm, { funding }) => { @@ -214,11 +189,11 @@ const packagesFundingMessage = (npm, { funding }) => { return } - npm.output('') + output.standard('') const pkg = funding === 1 ? 'package' : 'packages' const is = funding === 1 ? 'is' : 'are' - npm.output(`${funding} ${pkg} ${is} looking for funding`) - npm.output(' run `npm fund` for details') + output.standard(`${funding} ${pkg} ${is} looking for funding`) + output.standard(' run `npm fund` for details') } module.exports = reifyOutput diff --git a/deps/npm/lib/utils/sbom-cyclonedx.js b/deps/npm/lib/utils/sbom-cyclonedx.js index 0a340895bb3f49..989abea58dae83 100644 --- a/deps/npm/lib/utils/sbom-cyclonedx.js +++ b/deps/npm/lib/utils/sbom-cyclonedx.js @@ -1,4 +1,4 @@ -const crypto = require('crypto') +const crypto = require('node:crypto') const normalizeData = require('normalize-package-data') const parseLicense = require('spdx-expression-parse') const npa = require('npm-package-arg') diff --git a/deps/npm/lib/utils/sbom-spdx.js b/deps/npm/lib/utils/sbom-spdx.js index fdddd8944f32d1..e3af77e10c7513 100644 --- a/deps/npm/lib/utils/sbom-spdx.js +++ b/deps/npm/lib/utils/sbom-spdx.js @@ -1,5 +1,5 @@ -const crypto = require('crypto') +const crypto = require('node:crypto') const normalizeData = require('normalize-package-data') const npa = require('npm-package-arg') const ssri = require('ssri') diff --git a/deps/npm/lib/utils/tar.js b/deps/npm/lib/utils/tar.js index c25fe71614a60b..63ef6067acb903 100644 --- a/deps/npm/lib/utils/tar.js +++ b/deps/npm/lib/utils/tar.js @@ -1,71 +1,49 @@ const tar = require('tar') const ssri = require('ssri') -const log = require('./log-shim') +const { log, output } = require('proc-log') const formatBytes = require('./format-bytes.js') -const columnify = require('columnify') const localeCompare = require('@isaacs/string-locale-compare')('en', { sensitivity: 'case', numeric: true, }) -const logTar = (tarball, opts = {}) => { - const { unicode = false } = opts +const logTar = (tarball, { unicode = false, json, key } = {}) => { + if (json) { + output.buffer(key == null ? tarball : { [key]: tarball }) + return + } log.notice('') log.notice('', `${unicode ? '📦 ' : 'package:'} ${tarball.name}@${tarball.version}`) - log.notice('=== Tarball Contents ===') + log.notice('Tarball Contents') if (tarball.files.length) { log.notice( '', - columnify( - tarball.files - .map(f => { - const bytes = formatBytes(f.size, false) - return /^node_modules\//.test(f.path) ? null : { path: f.path, size: `${bytes}` } - }) - .filter(f => f), - { - include: ['size', 'path'], - showHeaders: false, - } - ) + tarball.files.map(f => + /^node_modules\//.test(f.path) ? null : `${formatBytes(f.size, false)} ${f.path}` + ).filter(f => f).join('\n') ) } if (tarball.bundled.length) { - log.notice('=== Bundled Dependencies ===') + log.notice('Bundled Dependencies') tarball.bundled.forEach(name => log.notice('', name)) } - log.notice('=== Tarball Details ===') - log.notice( - '', - columnify( - [ - { name: 'name:', value: tarball.name }, - { name: 'version:', value: tarball.version }, - tarball.filename && { name: 'filename:', value: tarball.filename }, - { name: 'package size:', value: formatBytes(tarball.size) }, - { name: 'unpacked size:', value: formatBytes(tarball.unpackedSize) }, - { name: 'shasum:', value: tarball.shasum }, - { - name: 'integrity:', - value: - tarball.integrity.toString().slice(0, 20) + - '[...]' + - tarball.integrity.toString().slice(80), - }, - tarball.bundled.length && { name: 'bundled deps:', value: tarball.bundled.length }, - tarball.bundled.length && { - name: 'bundled files:', - value: tarball.entryCount - tarball.files.length, - }, - tarball.bundled.length && { name: 'own files:', value: tarball.files.length }, - { name: 'total files:', value: tarball.entryCount }, - ].filter(x => x), - { - include: ['name', 'value'], - showHeaders: false, - } - ) - ) + log.notice('Tarball Details') + log.notice('', `name: ${tarball.name}`) + log.notice('', `version: ${tarball.version}`) + if (tarball.filename) { + log.notice('', `filename: ${tarball.filename}`) + } + log.notice('', `package size: ${formatBytes(tarball.size)}`) + log.notice('', `unpacked size: ${formatBytes(tarball.unpackedSize)}`) + log.notice('', `shasum: ${tarball.shasum}`) + /* eslint-disable-next-line max-len */ + log.notice('', `integrity: ${tarball.integrity.toString().slice(0, 20)}[...]${tarball.integrity.toString().slice(80)}`) + if (tarball.bundled.length) { + log.notice('', `bundled deps: ${tarball.bundled.length}`) + log.notice('', `bundled files: ${tarball.entryCount - tarball.files.length}`) + log.notice('', `own files: ${tarball.files.length}`) + } + log.notice('', `total files: ${tarball.entryCount}`) log.notice('', '') } @@ -81,7 +59,7 @@ const getContents = async (manifest, tarball) => { totalEntries++ totalEntrySize += entry.size const p = entry.path - if (p.startsWith('package/node_modules/')) { + if (p.startsWith('package/node_modules/') && p !== 'package/node_modules/') { const name = p.match(/^package\/node_modules\/((?:@[^/]+\/)?[^/]+)/)[1] bundled.add(name) } @@ -94,7 +72,7 @@ const getContents = async (manifest, tarball) => { }) stream.end(tarball) - const integrity = await ssri.fromData(tarball, { + const integrity = ssri.fromData(tarball, { algorithms: ['sha1', 'sha512'], }) diff --git a/deps/npm/lib/utils/timers.js b/deps/npm/lib/utils/timers.js index c215fe926afb59..16a255961fee3b 100644 --- a/deps/npm/lib/utils/timers.js +++ b/deps/npm/lib/utils/timers.js @@ -1,114 +1,87 @@ -const EE = require('events') -const fs = require('fs') -const log = require('./log-shim') +const EE = require('node:events') +const fs = require('node:fs') +const { log, time } = require('proc-log') + +const INITIAL_TIMER = 'npm' -// This is an event emiiter but on/off -// only listen on a single internal event that gets -// emitted whenever a timer ends class Timers extends EE { - file = null + #file + #timing #unfinished = new Map() #finished = {} - #onTimeEnd = Symbol('onTimeEnd') - #initialListener = null - #initialTimer = null - constructor ({ listener = null, start = 'npm' } = {}) { + constructor () { super() - this.#initialListener = listener - this.#initialTimer = start - this.#init() - } - - get unfinished () { - return this.#unfinished - } - - get finished () { - return this.#finished - } - - #init () { this.on() - if (this.#initialListener) { - this.on(this.#initialListener) - } - process.emit('time', this.#initialTimer) - this.started = this.#unfinished.get(this.#initialTimer) + time.start(INITIAL_TIMER) + this.started = this.#unfinished.get(INITIAL_TIMER) } - on (listener) { - if (listener) { - super.on(this.#onTimeEnd, listener) - } else { - process.on('time', this.#timeListener) - process.on('timeEnd', this.#timeEndListener) - } + on () { + process.on('time', this.#timeHandler) } - off (listener) { - if (listener) { - super.off(this.#onTimeEnd, listener) - } else { - this.removeAllListeners(this.#onTimeEnd) - process.off('time', this.#timeListener) - process.off('timeEnd', this.#timeEndListener) - } + off () { + process.off('time', this.#timeHandler) } - time (name, fn) { - process.emit('time', name) - const end = () => process.emit('timeEnd', name) - if (typeof fn === 'function') { - const res = fn() - return res && res.finally ? res.finally(end) : (end(), res) - } - return end + load ({ path, timing } = {}) { + this.#timing = timing + this.#file = `${path}timing.json` } - load ({ path } = {}) { - if (path) { - this.file = `${path}timing.json` + finish (metadata) { + time.end(INITIAL_TIMER) + + for (const [name, timer] of this.#unfinished) { + log.silly('unfinished npm timer', name, timer) } - } - writeFile (metadata) { - if (!this.file) { + if (!this.#timing) { + // Not in timing mode, nothing else to do here return } try { - const globalStart = this.started - const globalEnd = this.#finished.npm || Date.now() - const content = { - metadata, - timers: this.#finished, - // add any unfinished timers with their relative start/end - unfinishedTimers: [...this.#unfinished.entries()].reduce((acc, [name, start]) => { - acc[name] = [start - globalStart, globalEnd - globalStart] - return acc - }, {}), - } - fs.writeFileSync(this.file, JSON.stringify(content) + '\n') + this.#writeFile(metadata) + log.info('timing', `Timing info written to: ${this.#file}`) } catch (e) { - this.file = null log.warn('timing', `could not write timing file: ${e}`) } } - #timeListener = (name) => { - this.#unfinished.set(name, Date.now()) + #writeFile (metadata) { + const globalStart = this.started + const globalEnd = this.#finished[INITIAL_TIMER] + const content = { + metadata, + timers: this.#finished, + // add any unfinished timers with their relative start/end + unfinishedTimers: [...this.#unfinished.entries()].reduce((acc, [name, start]) => { + acc[name] = [start - globalStart, globalEnd - globalStart] + return acc + }, {}), + } + fs.writeFileSync(this.#file, JSON.stringify(content) + '\n') } - #timeEndListener = (name) => { - if (this.#unfinished.has(name)) { - const ms = Date.now() - this.#unfinished.get(name) - this.#finished[name] = ms - this.#unfinished.delete(name) - this.emit(this.#onTimeEnd, name, ms) - } else { - log.silly('timing', "Tried to end timer that doesn't exist:", name) + #timeHandler = (level, name) => { + const now = Date.now() + switch (level) { + case time.KEYS.start: + this.#unfinished.set(name, now) + break + case time.KEYS.end: { + if (this.#unfinished.has(name)) { + const ms = now - this.#unfinished.get(name) + this.#finished[name] = ms + this.#unfinished.delete(name) + log.timing(name, `Completed in ${ms}ms`) + } else { + log.silly('timing', `Tried to end timer that doesn't exist: ${name}`) + } + } } } } diff --git a/deps/npm/lib/utils/update-notifier.js b/deps/npm/lib/utils/update-notifier.js deleted file mode 100644 index 7c9611e4773f97..00000000000000 --- a/deps/npm/lib/utils/update-notifier.js +++ /dev/null @@ -1,125 +0,0 @@ -// print a banner telling the user to upgrade npm to latest -// but not in CI, and not if we're doing that already. -// Check daily for betas, and weekly otherwise. - -const ciInfo = require('ci-info') -const semver = require('semver') -const { stat, writeFile } = require('fs/promises') -const { resolve } = require('path') - -// update check frequency -const DAILY = 1000 * 60 * 60 * 24 -const WEEKLY = DAILY * 7 - -// don't put it in the _cacache folder, just in npm's cache -const lastCheckedFile = npm => - resolve(npm.flatOptions.cache, '../_update-notifier-last-checked') - -// Actual check for updates. This is a separate function so that we only load -// this if we are doing the actual update -const updateCheck = async (npm, spec, version, current) => { - const pacote = require('pacote') - - const mani = await pacote.manifest(`npm@${spec}`, { - // always prefer latest, even if doing --tag=whatever on the cmd - defaultTag: 'latest', - ...npm.flatOptions, - cache: false, - }).catch(() => null) - - // if pacote failed, give up - if (!mani) { - return null - } - - const latest = mani.version - - // if the current version is *greater* than latest, we're on a 'next' - // and should get the updates from that release train. - // Note that this isn't another http request over the network, because - // the packument will be cached by pacote from previous request. - if (semver.gt(version, latest) && spec === 'latest') { - return updateNotifier(npm, `^${version}`) - } - - // if we already have something >= the desired spec, then we're done - if (semver.gte(version, latest)) { - return null - } - - const useColor = npm.logColor - const chalk = npm.logChalk - - // ok! notify the user about this update they should get. - // The message is saved for printing at process exit so it will not get - // lost in any other messages being printed as part of the command. - const update = semver.parse(mani.version) - const type = update.major !== current.major ? 'major' - : update.minor !== current.minor ? 'minor' - : update.patch !== current.patch ? 'patch' - : 'prerelease' - const typec = type === 'major' ? chalk.red(type) - : type === 'minor' ? chalk.yellow(type) - : chalk.green(type) - const oldc = chalk.red(current) - const latestc = chalk.green(latest) - const changelog = `https://github.com/npm/cli/releases/tag/v${latest}` - const changelogc = !useColor ? `<${changelog}>` : chalk.cyan(changelog) - const cmd = `npm install -g npm@${latest}` - const cmdc = !useColor ? `\`${cmd}\`` : chalk.green(cmd) - const message = `\nNew ${typec} version of npm available! ` + - `${oldc} -> ${latestc}\n` + - `Changelog: ${changelogc}\n` + - `Run ${cmdc} to update!\n` - - return message -} - -const updateNotifier = async (npm, spec = 'latest') => { - // if we're on a prerelease train, then updates are coming fast - // check for a new one daily. otherwise, weekly. - const { version } = npm - const current = semver.parse(version) - - // if we're on a beta train, always get the next beta - if (current.prerelease.length) { - spec = `^${version}` - } - - // while on a beta train, get updates daily - const duration = spec !== 'latest' ? DAILY : WEEKLY - - const t = new Date(Date.now() - duration) - // if we don't have a file, then definitely check it. - const st = await stat(lastCheckedFile(npm)).catch(() => ({ mtime: t - 1 })) - - // if we've already checked within the specified duration, don't check again - if (!(t > st.mtime)) { - return null - } - - // intentional. do not await this. it's a best-effort update. if this - // fails, it's ok. might be using /dev/null as the cache or something weird - // like that. - writeFile(lastCheckedFile(npm), '').catch(() => {}) - - return updateCheck(npm, spec, version, current) -} - -// only update the notification timeout if we actually finished checking -module.exports = npm => { - if ( - // opted out - !npm.config.get('update-notifier') - // global npm update - || (npm.flatOptions.global && - ['install', 'update'].includes(npm.command) && - npm.argv.some(arg => /^npm(@|$)/.test(arg))) - // CI - || ciInfo.isCI - ) { - return Promise.resolve(null) - } - - return updateNotifier(npm) -} diff --git a/deps/npm/lib/workspaces/update-workspaces.js b/deps/npm/lib/utils/update-workspaces.js similarity index 100% rename from deps/npm/lib/workspaces/update-workspaces.js rename to deps/npm/lib/utils/update-workspaces.js diff --git a/deps/npm/lib/utils/verify-signatures.js b/deps/npm/lib/utils/verify-signatures.js new file mode 100644 index 00000000000000..604f3741ce6dcc --- /dev/null +++ b/deps/npm/lib/utils/verify-signatures.js @@ -0,0 +1,386 @@ +const fetch = require('npm-registry-fetch') +const localeCompare = require('@isaacs/string-locale-compare')('en') +const npa = require('npm-package-arg') +const pacote = require('pacote') +const tufClient = require('@sigstore/tuf') +const { log, output } = require('proc-log') + +const sortAlphabetically = (a, b) => localeCompare(a.name, b.name) + +class VerifySignatures { + constructor (tree, filterSet, npm, opts) { + this.tree = tree + this.filterSet = filterSet + this.npm = npm + this.opts = opts + this.keys = new Map() + this.invalid = [] + this.missing = [] + this.checkedPackages = new Set() + this.auditedWithKeysCount = 0 + this.verifiedSignatureCount = 0 + this.verifiedAttestationCount = 0 + this.exitCode = 0 + } + + async run () { + const { default: pMap } = await import('p-map') + const start = process.hrtime.bigint() + + // Find all deps in tree + const { edges, registries } = this.getEdgesOut(this.tree.inventory.values(), this.filterSet) + if (edges.size === 0) { + throw new Error('found no installed dependencies to audit') + } + + const tuf = await tufClient.initTUF({ + cachePath: this.opts.tufCache, + retry: this.opts.retry, + timeout: this.opts.timeout, + }) + await Promise.all([...registries].map(registry => this.setKeys({ registry, tuf }))) + + log.verbose('verifying registry signatures') + await pMap(edges, (e) => this.getVerifiedInfo(e), { concurrency: 20, stopOnError: true }) + + // Didn't find any dependencies that could be verified, e.g. only local + // deps, missing version, not on a registry etc. + if (!this.auditedWithKeysCount) { + throw new Error('found no dependencies to audit that were installed from ' + + 'a supported registry') + } + + const invalid = this.invalid.sort(sortAlphabetically) + const missing = this.missing.sort(sortAlphabetically) + + const hasNoInvalidOrMissing = invalid.length === 0 && missing.length === 0 + + if (!hasNoInvalidOrMissing) { + process.exitCode = 1 + } + + if (this.npm.config.get('json')) { + output.buffer({ invalid, missing }) + return + } + const end = process.hrtime.bigint() + const elapsed = end - start + + const auditedPlural = this.auditedWithKeysCount > 1 ? 's' : '' + const timing = `audited ${this.auditedWithKeysCount} package${auditedPlural} in ` + + `${Math.floor(Number(elapsed) / 1e9)}s` + output.standard(timing) + output.standard('') + + const verifiedBold = this.npm.chalk.bold('verified') + if (this.verifiedSignatureCount) { + if (this.verifiedSignatureCount === 1) { + /* eslint-disable-next-line max-len */ + output.standard(`${this.verifiedSignatureCount} package has a ${verifiedBold} registry signature`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`${this.verifiedSignatureCount} packages have ${verifiedBold} registry signatures`) + } + output.standard('') + } + + if (this.verifiedAttestationCount) { + if (this.verifiedAttestationCount === 1) { + /* eslint-disable-next-line max-len */ + output.standard(`${this.verifiedAttestationCount} package has a ${verifiedBold} attestation`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`${this.verifiedAttestationCount} packages have ${verifiedBold} attestations`) + } + output.standard('') + } + + if (missing.length) { + const missingClr = this.npm.chalk.redBright('missing') + if (missing.length === 1) { + /* eslint-disable-next-line max-len */ + output.standard(`1 package has a ${missingClr} registry signature but the registry is providing signing keys:`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`${missing.length} packages have ${missingClr} registry signatures but the registry is providing signing keys:`) + } + output.standard('') + missing.map(m => + output.standard(`${this.npm.chalk.red(`${m.name}@${m.version}`)} (${m.registry})`) + ) + } + + if (invalid.length) { + if (missing.length) { + output.standard('') + } + const invalidClr = this.npm.chalk.redBright('invalid') + // We can have either invalid signatures or invalid provenance + const invalidSignatures = this.invalid.filter(i => i.code === 'EINTEGRITYSIGNATURE') + if (invalidSignatures.length) { + if (invalidSignatures.length === 1) { + output.standard(`1 package has an ${invalidClr} registry signature:`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`${invalidSignatures.length} packages have ${invalidClr} registry signatures:`) + } + output.standard('') + invalidSignatures.map(i => + output.standard(`${this.npm.chalk.red(`${i.name}@${i.version}`)} (${i.registry})`) + ) + output.standard('') + } + + const invalidAttestations = this.invalid.filter(i => i.code === 'EATTESTATIONVERIFY') + if (invalidAttestations.length) { + if (invalidAttestations.length === 1) { + output.standard(`1 package has an ${invalidClr} attestation:`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`${invalidAttestations.length} packages have ${invalidClr} attestations:`) + } + output.standard('') + invalidAttestations.map(i => + output.standard(`${this.npm.chalk.red(`${i.name}@${i.version}`)} (${i.registry})`) + ) + output.standard('') + } + + if (invalid.length === 1) { + /* eslint-disable-next-line max-len */ + output.standard(`Someone might have tampered with this package since it was published on the registry!`) + } else { + /* eslint-disable-next-line max-len */ + output.standard(`Someone might have tampered with these packages since they were published on the registry!`) + } + output.standard('') + } + } + + getEdgesOut (nodes, filterSet) { + const edges = new Set() + const registries = new Set() + for (const node of nodes) { + for (const edge of node.edgesOut.values()) { + const filteredOut = + edge.from + && filterSet + && filterSet.size > 0 + && !filterSet.has(edge.from.target) + + if (!filteredOut) { + const spec = this.getEdgeSpec(edge) + if (spec) { + // Prefetch and cache public keys from used registries + registries.add(this.getSpecRegistry(spec)) + } + edges.add(edge) + } + } + } + return { edges, registries } + } + + async setKeys ({ registry, tuf }) { + const { host, pathname } = new URL(registry) + // Strip any trailing slashes from pathname + const regKey = `${host}${pathname.replace(/\/$/, '')}/keys.json` + let keys = await tuf.getTarget(regKey) + .then((target) => JSON.parse(target)) + .then(({ keys: ks }) => ks.map((key) => ({ + ...key, + keyid: key.keyId, + pemkey: `-----BEGIN PUBLIC KEY-----\n${key.publicKey.rawBytes}\n-----END PUBLIC KEY-----`, + expires: key.publicKey.validFor.end || null, + }))).catch(err => { + if (err.code === 'TUF_FIND_TARGET_ERROR') { + return null + } else { + throw err + } + }) + + // If keys not found in Sigstore TUF repo, fallback to registry keys API + if (!keys) { + keys = await fetch.json('/-/npm/v1/keys', { + ...this.npm.flatOptions, + registry, + }).then(({ keys: ks }) => ks.map((key) => ({ + ...key, + pemkey: `-----BEGIN PUBLIC KEY-----\n${key.key}\n-----END PUBLIC KEY-----`, + }))).catch(err => { + if (err.code === 'E404' || err.code === 'E400') { + return null + } else { + throw err + } + }) + } + + if (keys) { + this.keys.set(registry, keys) + } + } + + getEdgeType (edge) { + return edge.optional ? 'optionalDependencies' + : edge.peer ? 'peerDependencies' + : edge.dev ? 'devDependencies' + : 'dependencies' + } + + getEdgeSpec (edge) { + let name = edge.name + try { + name = npa(edge.spec).subSpec.name + } catch { + // leave it as edge.name + } + try { + return npa(`${name}@${edge.spec}`) + } catch { + // Skip packages with invalid spec + } + } + + buildRegistryConfig (registry) { + const keys = this.keys.get(registry) || [] + const parsedRegistry = new URL(registry) + const regKey = `//${parsedRegistry.host}${parsedRegistry.pathname}` + return { + [`${regKey}:_keys`]: keys, + } + } + + getSpecRegistry (spec) { + return fetch.pickRegistry(spec, this.npm.flatOptions) + } + + getValidPackageInfo (edge) { + const type = this.getEdgeType(edge) + // Skip potentially optional packages that are not on disk, as these could + // be omitted during install + if (edge.error === 'MISSING' && type !== 'dependencies') { + return + } + + const spec = this.getEdgeSpec(edge) + // Skip invalid version requirements + if (!spec) { + return + } + const node = edge.to || edge + const { version } = node.package || {} + + if (node.isWorkspace || // Skip local workspaces packages + !version || // Skip packages that don't have a installed version, e.g. optonal dependencies + !spec.registry) { // Skip if not from registry, e.g. git package + return + } + + for (const omitType of this.npm.config.get('omit')) { + if (node[omitType]) { + return + } + } + + return { + name: spec.name, + version, + type, + location: node.location, + registry: this.getSpecRegistry(spec), + } + } + + async verifySignatures (name, version, registry) { + const { + _integrity: integrity, + _signatures, + _attestations, + _resolved: resolved, + } = await pacote.manifest(`${name}@${version}`, { + verifySignatures: true, + verifyAttestations: true, + ...this.buildRegistryConfig(registry), + ...this.npm.flatOptions, + }) + const signatures = _signatures || [] + const result = { + integrity, + signatures, + attestations: _attestations, + resolved, + } + return result + } + + async getVerifiedInfo (edge) { + const info = this.getValidPackageInfo(edge) + if (!info) { + return + } + const { name, version, location, registry, type } = info + if (this.checkedPackages.has(location)) { + // we already did or are doing this one + return + } + this.checkedPackages.add(location) + + // We only "audit" or verify the signature, or the presence of it, on + // packages whose registry returns signing keys + const keys = this.keys.get(registry) || [] + if (keys.length) { + this.auditedWithKeysCount += 1 + } + + try { + const { integrity, signatures, attestations, resolved } = await this.verifySignatures( + name, version, registry + ) + + // Currently we only care about missing signatures on registries that provide a public key + // We could make this configurable in the future with a strict/paranoid mode + if (signatures.length) { + this.verifiedSignatureCount += 1 + } else if (keys.length) { + this.missing.push({ + integrity, + location, + name, + registry, + resolved, + version, + }) + } + + // Track verified attestations separately to registry signatures, as all + // packages on registries with signing keys are expected to have registry + // signatures, but not all packages have provenance and publish attestations. + if (attestations) { + this.verifiedAttestationCount += 1 + } + } catch (e) { + if (e.code === 'EINTEGRITYSIGNATURE' || e.code === 'EATTESTATIONVERIFY') { + this.invalid.push({ + code: e.code, + message: e.message, + integrity: e.integrity, + keyid: e.keyid, + location, + name, + registry, + resolved: e.resolved, + signature: e.signature, + predicateType: e.predicateType, + type, + version, + }) + } else { + throw e + } + } + } +} + +module.exports = VerifySignatures diff --git a/deps/npm/lib/utils/web-auth.js b/deps/npm/lib/utils/web-auth.js deleted file mode 100644 index ce551687098fc8..00000000000000 --- a/deps/npm/lib/utils/web-auth.js +++ /dev/null @@ -1,20 +0,0 @@ -const EventEmitter = require('events') -const { webAuthCheckLogin } = require('npm-profile') - -async function webAuth (opener, initialUrl, doneUrl, opts) { - const doneEmitter = new EventEmitter() - - const openPromise = opener(initialUrl, doneEmitter) - const webAuthCheckPromise = webAuthCheckLogin(doneUrl, { ...opts, cache: false }) - .then(authResult => { - // cancel open prompt if it's present - doneEmitter.emit('abort') - - return authResult.token - }) - - await openPromise - return await webAuthCheckPromise -} - -module.exports = webAuth diff --git a/deps/npm/lib/workspaces/get-workspaces.js b/deps/npm/lib/workspaces/get-workspaces.js deleted file mode 100644 index 59efb0e9f01bef..00000000000000 --- a/deps/npm/lib/workspaces/get-workspaces.js +++ /dev/null @@ -1,54 +0,0 @@ -const { resolve, relative } = require('path') -const mapWorkspaces = require('@npmcli/map-workspaces') -const { minimatch } = require('minimatch') -const pkgJson = require('@npmcli/package-json') - -// minimatch wants forward slashes only for glob patterns -const globify = pattern => pattern.split('\\').join('/') - -// Returns an Map of paths to workspaces indexed by workspace name -// { foo => '/path/to/foo' } -const getWorkspaces = async (filters, { path, includeWorkspaceRoot, relativeFrom }) => { - // TODO we need a better error to be bubbled up here if this call fails - const { content: pkg } = await pkgJson.normalize(path) - const workspaces = await mapWorkspaces({ cwd: path, pkg }) - let res = new Map() - if (includeWorkspaceRoot) { - res.set(pkg.name, path) - } - - if (!filters.length) { - res = new Map([...res, ...workspaces]) - } - - for (const filterArg of filters) { - for (const [workspaceName, workspacePath] of workspaces.entries()) { - let relativePath = relative(relativeFrom, workspacePath) - if (filterArg.startsWith('./')) { - relativePath = `./${relativePath}` - } - const relativeFilter = relative(path, filterArg) - if (filterArg === workspaceName - || resolve(relativeFrom, filterArg) === workspacePath - || minimatch(relativePath, `${globify(relativeFilter)}/*`) - || minimatch(relativePath, `${globify(filterArg)}/*`) - ) { - res.set(workspaceName, workspacePath) - } - } - } - - if (!res.size) { - let msg = '!' - if (filters.length) { - msg = `:\n ${filters.reduce( - (acc, filterArg) => `${acc} --workspace=${filterArg}`, '')}` - } - - throw new Error(`No workspaces found${msg}`) - } - - return res -} - -module.exports = getWorkspaces diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index f11a6a5ba98230..bbf94f8c6d6f0c 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,11 +1,11 @@ -.TH "NPM-ACCESS" "1" "April 2024" "" "" +.TH "NPM-ACCESS" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-access\fR - Set access level on published packages .SS "Synopsis" .P .RS 2 .nf -npm access list packages \[lB]|| \[lB]\[rB] +npm access list packages \[lB]||\[rB] \[lB]\[rB] npm access list collaborators \[lB] \[lB]\[rB]\[rB] npm access get status \[lB]\[rB] npm access set status=public|private \[lB]\[rB] diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index e867396ccfc4bf..c7b49300ec7fc6 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" "April 2024" "" "" +.TH "NPM-ADDUSER" "1" "September 2025" "NPM@10.9.4" "" .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 e8d71147400c45..c10ca607c807da 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" "April 2024" "" "" +.TH "NPM-AUDIT" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" @@ -80,7 +80,7 @@ Public signing keys are provided at \fBregistry-host.tld/-/npm/v1/keys\fR in the Keys response: .RS 0 .IP \(bu 4 -\fBexpires\fR: null or a simplified extended \fBISO 8601 format\fR \fI\(lahttps://en.wikipedia.org/wiki/ISO_8601"\(ra\fR: \fBYYYY-MM-DDTHH:mm:ss.sssZ\fR +\fBexpires\fR: null or a simplified extended \fBISO 8601 format\fR \fI\(lahttps://en.wikipedia.org/wiki/ISO_8601\(ra\fR: \fBYYYY-MM-DDTHH:mm:ss.sssZ\fR .IP \(bu 4 \fBkeydid\fR: sha256 fingerprint of the public key .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index ea6371ffbe4fc1..8f31d4901328ec 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" "April 2024" "" "" +.TH "NPM-BUGS" "1" "September 2025" "NPM@10.9.4" "" .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 c741829317d2e1..770043489d442c 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" "April 2024" "" "" +.TH "NPM-CACHE" "1" "September 2025" "NPM@10.9.4" "" .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 793f02006ab229..5ab4e57aa14387 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" "April 2024" "" "" +.TH "NPM-CI" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 28bfb2906d1922..c416987cf96536 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" "April 2024" "" "" +.TH "NPM-COMPLETION" "1" "September 2025" "NPM@10.9.4" "" .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 bd572dea7c4ab8..d54914f51b5c28 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" "April 2024" "" "" +.TH "NPM-CONFIG" "1" "September 2025" "NPM@10.9.4" "" .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 529e14b0efb722..e79fb3baeffaf0 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" "April 2024" "" "" +.TH "NPM-DEDUPE" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index 2a3891596da0c6..682597d475dbe2 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" "April 2024" "" "" +.TH "NPM-DEPRECATE" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-deprecate\fR - Deprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1 index f8f0b5e7f40aac..d145f9fd7786f4 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" "April 2024" "" "" +.TH "NPM-DIFF" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-diff\fR - The registry diff command .SS "Synopsis" @@ -233,9 +233,12 @@ 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 -Also the tag that is added to the package@version specified by the \fBnpm tag\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 +If used in the \fBnpm publish\fR command, this is the tag that will be added to the package submitted to the registry. .SS "\fBworkspace\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index c0b6e8d70df6dc..f0c938b487b913 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" "April 2024" "" "" +.TH "NPM-DIST-TAG" "1" "September 2025" "NPM@10.9.4" "" .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 be22f95c00df95..1fdc4b141a6385 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" "April 2024" "" "" +.TH "NPM-DOCS" "1" "September 2025" "NPM@10.9.4" "" .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 1aa4af1e485b08..a70b7b9a2ef3de 100644 --- a/deps/npm/man/man1/npm-doctor.1 +++ b/deps/npm/man/man1/npm-doctor.1 @@ -1,11 +1,11 @@ -.TH "NPM-DOCTOR" "1" "April 2024" "" "" +.TH "NPM-DOCTOR" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" .P .RS 2 .nf -npm doctor \[lB]ping\[rB] \[lB]registry\[rB] \[lB]versions\[rB] \[lB]environment\[rB] \[lB]permissions\[rB] \[lB]cache\[rB] +npm doctor \[lB]connection\[rB] \[lB]registry\[rB] \[lB]versions\[rB] \[lB]environment\[rB] \[lB]permissions\[rB] \[lB]cache\[rB] .fi .RE .P @@ -30,21 +30,21 @@ Without all of these working properly, npm may not work properly. Many issues ar Also, in addition to this, there are also very many issue reports due to using old versions of npm. Since npm is constantly improving, running \fBnpm@latest\fR is better than an old version. .P \fBnpm doctor\fR verifies the following items in your environment, and if there are any recommended changes, it will display them. By default npm runs all of these checks. You can limit what checks are ran by specifying them as extra arguments. -.SS "\fBnpm ping\fR" +.SS "\fBConnecting to the registry\fR" .P -By default, npm installs from the primary npm registry, \fBregistry.npmjs.org\fR. \fBnpm doctor\fR hits a special ping endpoint within the registry. This can also be checked with \fBnpm ping\fR. If this check fails, you may be using a proxy that needs to be configured, or may need to talk to your IT staff to get access over HTTPS to \fBregistry.npmjs.org\fR. +By default, npm installs from the primary npm registry, \fBregistry.npmjs.org\fR. \fBnpm doctor\fR hits a special connection testing endpoint within the registry. This can also be checked with \fBnpm ping\fR. If this check fails, you may be using a proxy that needs to be configured, or may need to talk to your IT staff to get access over HTTPS to \fBregistry.npmjs.org\fR. .P This check is done against whichever registry you've configured (you can see what that is by running \fBnpm config get registry\fR), and if you're using a private registry that doesn't support the \fB/whoami\fR endpoint supported by the primary registry, this check may fail. -.SS "\fBnpm -v\fR" +.SS "\fBChecking npm version\fR" .P While Node.js may come bundled with a particular version of npm, it's the policy of the CLI team that we recommend all users run \fBnpm@latest\fR if they can. As the CLI is maintained by a small team of contributors, there are only resources for a single line of development, so npm's own long-term support releases typically only receive critical security and regression fixes. The team believes that the latest tested version of npm is almost always likely to be the most functional and defect-free version of npm. -.SS "\fBnode -v\fR" +.SS "\fBChecking node version\fR" .P For most users, in most circumstances, the best version of Node will be the latest long-term support (LTS) release. Those of you who want access to new ECMAscript features or bleeding-edge changes to Node's standard library may be running a newer version, and some may be required to run an older version of Node because of enterprise change control policies. That's OK! But in general, the npm team recommends that most users run Node.js LTS. -.SS "\fBnpm config get registry\fR" +.SS "\fBChecking configured npm registry\fR" .P You may be installing from private package registries for your project or company. That's great! Others may be following tutorials or StackOverflow questions in an effort to troubleshoot problems you may be having. Sometimes, this may entail changing the registry you're pointing at. This part of \fBnpm doctor\fR just lets you, and maybe whoever's helping you with support, know that you're not using the default registry. -.SS "\fBwhich git\fR" +.SS "\fBChecking for git executable in PATH\fR" .P While it's documented in the README, it may not be obvious that npm needs Git installed to do many of the things that it does. Also, in some cases \[en] especially on Windows \[en] you may have Git set up in such a way that it's not accessible via your \fBPATH\fR so that npm can find it. This check ensures that Git is available. .SS "Permissions checks" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 0f91c98e4b6cd9..f83860de83a6ee 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" "April 2024" "" "" +.TH "NPM-EDIT" "1" "September 2025" "NPM@10.9.4" "" .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 0040f141315cd3..8b6f66dcd10ce0 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" "April 2024" "" "" +.TH "NPM-EXEC" "1" "September 2025" "NPM@10.9.4" "" .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 ea53b43add250b..6edbc0f85a5f23 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" "April 2024" "" "" +.TH "NPM-EXPLAIN" "1" "September 2025" "NPM@10.9.4" "" .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 7127aff53ee73f..0a05d36bd08eb1 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" "April 2024" "" "" +.TH "NPM-EXPLORE" "1" "September 2025" "NPM@10.9.4" "" .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 fc625fb8ebd10b..93b1918dd013ea 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" "April 2024" "" "" +.TH "NPM-FIND-DUPES" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-find-dupes\fR - Find duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1 index c8fb9354beb570..a78b52c47efe7e 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" "April 2024" "" "" +.TH "NPM-FUND" "1" "September 2025" "NPM@10.9.4" "" .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 892777ce4e6b4a..a3f4be5e782914 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" "April 2024" "" "" +.TH "NPM-HELP-SEARCH" "1" "September 2025" "NPM@10.9.4" "" .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 bb08ed91cccb79..d2b1fc4f87ce55 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" "April 2024" "" "" +.TH "NPM-HELP" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-hook.1 b/deps/npm/man/man1/npm-hook.1 index ece059dfbb5257..21d5427b9c9ed1 100644 --- a/deps/npm/man/man1/npm-hook.1 +++ b/deps/npm/man/man1/npm-hook.1 @@ -1,4 +1,4 @@ -.TH "NPM-HOOK" "1" "April 2024" "" "" +.TH "NPM-HOOK" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-hook\fR - Manage registry hooks .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index cc2c543925e464..acc8f2d92c333a 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,11 +1,11 @@ -.TH "NPM-INIT" "1" "April 2024" "" "" +.TH "NPM-INIT" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-init\fR - Create a package.json file .SS "Synopsis" .P .RS 2 .nf -npm init (same as `npx `) +npm init (same as `npx create-`) npm init <@scope> (same as `npx <@scope>/create`) aliases: create, innit diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1 index bd7f5b84a13016..c6a4bab4d8f894 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" "April 2024" "" "" +.TH "NPM-INSTALL-CI-TEST" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-install-ci-test\fR - Install a project with a clean slate and run tests .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 index 331fe854774f58..734081750bf5cb 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" "April 2024" "" "" +.TH "NPM-INSTALL-TEST" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-install-test\fR - Install package(s) and run tests .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index 6d98e0e40923c0..9552895bc22683 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" "April 2024" "" "" +.TH "NPM-INSTALL" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" @@ -137,6 +137,8 @@ npm install sax .IP \(bu 4 \fB-D, --save-dev\fR: Package will appear in your \fBdevDependencies\fR. .IP \(bu 4 +\fB--save-peer\fR: Package will appear in your \fBpeerDependencies\fR. +.IP \(bu 4 \fB-O, --save-optional\fR: Package will appear in your \fBoptionalDependencies\fR. .IP \(bu 4 \fB--no-save\fR: Prevents saving to \fBdependencies\fR. @@ -171,8 +173,6 @@ npm install readable-stream --save-exact npm install ansi-regex --save-bundle .fi .RE -.P -\fBNote\fR: If there is a file or folder named \fB\fR in the current working directory, then it will try to install that, and only try to fetch the package by name if it is not valid. .IP \(bu 4 \fBnpm install @npm:\fR: .P diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 174f9d1bd1baf8..37ff1b8737eb61 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" "April 2024" "" "" +.TH "NPM-LINK" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index 1b7aea8819d6ec..166735565c2761 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" "April 2024" "" "" +.TH "NPM-LOGIN" "1" "September 2025" "NPM@10.9.4" "" .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 113d6c5fab0995..898f6d610d706a 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" "April 2024" "" "" +.TH "NPM-LOGOUT" "1" "September 2025" "NPM@10.9.4" "" .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 a9f7e4af68b87b..3ad67413a2cd72 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" "April 2024" "" "" +.TH "NPM-LS" "1" "September 2025" "NPM@10.9.4" "" .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@10.5.1 /path/to/npm +npm@10.9.4 /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 002259ab5578a8..cce948fc162dda 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" "April 2024" "" "" +.TH "NPM-ORG" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-org\fR - Manage orgs .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 528bc0d0e24d54..f455b6c30ed69b 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" "April 2024" "" "" +.TH "NPM-OUTDATED" "1" "September 2025" "NPM@10.9.4" "" .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 114cd78939c6a8..b14ab552ac9286 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" "April 2024" "" "" +.TH "NPM-OWNER" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-owner\fR - Manage package owners .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 6c0046bce58252..682939fc09d198 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" "April 2024" "" "" +.TH "NPM-PACK" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index c6d509c56a4be4..1f04c2f6c1d136 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" "April 2024" "" "" +.TH "NPM-PING" "1" "September 2025" "NPM@10.9.4" "" .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 170639b8d9af70..08e269a26bdfef 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" "April 2024" "" "" +.TH "NPM-PKG" "1" "September 2025" "NPM@10.9.4" "" .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 0af03494691d7f..c830ceba237ed2 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" "April 2024" "" "" +.TH "NPM-PREFIX" "1" "September 2025" "NPM@10.9.4" "" .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 401c26f05b2d5c..2e93ce1f632a03 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" "April 2024" "" "" +.TH "NPM-PROFILE" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-profile\fR - Change settings on your registry profile .SS "Synopsis" @@ -24,27 +24,16 @@ Change your profile information on the registry. Note that this command depends .P .RS 2 .nf -+-----------------+---------------------------+ -| name | example | -+-----------------+---------------------------+ -| email | me@example.com (verified) | -+-----------------+---------------------------+ -| two factor auth | auth-and-writes | -+-----------------+---------------------------+ -| fullname | Example User | -+-----------------+---------------------------+ -| homepage | | -+-----------------+---------------------------+ -| freenode | | -+-----------------+---------------------------+ -| twitter | | -+-----------------+---------------------------+ -| github | | -+-----------------+---------------------------+ -| created | 2015-02-26T01:38:35.892Z | -+-----------------+---------------------------+ -| updated | 2017-10-02T21:29:45.922Z | -+-----------------+---------------------------+ +name: example +email: e@example.com (verified) +two-factor auth: auth-and-writes +fullname: Example User +homepage: +freenode: +twitter: +github: +created: 2015-02-26T01:38:35.892Z +updated: 2017-10-02T21:29:45.922Z .fi .RE .RS 0 diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index a7162e053616dd..a8adbbda2377e0 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" "April 2024" "" "" +.TH "NPM-PRUNE" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-prune\fR - Remove extraneous packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1 index 9ebfbaa761bb12..dce43f3c7e8c77 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" "April 2024" "" "" +.TH "NPM-PUBLISH" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" @@ -72,9 +72,12 @@ 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 -Also the tag that is added to the package@version specified by the \fBnpm tag\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 +If used in the \fBnpm publish\fR command, this is the tag that will be added to the package submitted to the registry. .SS "\fBaccess\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index d2271722e13711..6515f1696a798e 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" "April 2024" "" "" +.TH "NPM-QUERY" "1" "September 2025" "NPM@10.9.4" "" .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 9fe38d79998a7c..a7cebf8874cd3f 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" "April 2024" "" "" +.TH "NPM-REBUILD" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-rebuild\fR - Rebuild a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 197d333c10a919..97067bb89b9e36 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" "April 2024" "" "" +.TH "NPM-REPO" "1" "September 2025" "NPM@10.9.4" "" .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 59acbf2c09f56c..f199cb3d640ad2 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" "April 2024" "" "" +.TH "NPM-RESTART" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-restart\fR - Restart a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index e56b2f3d3afb13..85b085c9b650e1 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" "April 2024" "" "" +.TH "NPM-ROOT" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1 index d6e98845b4c411..2cb84fb4a0ef7a 100644 --- a/deps/npm/man/man1/npm-run-script.1 +++ b/deps/npm/man/man1/npm-run-script.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN-SCRIPT" "1" "April 2024" "" "" +.TH "NPM-RUN-SCRIPT" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-run-script\fR - Run arbitrary package scripts .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index b984044896eaed..83274456496c15 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" "April 2024" "" "" +.TH "NPM-SBOM" "1" "September 2025" "NPM@10.9.4" "" .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 7927e562bf9e59..75f3be8531a6d0 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,11 +1,11 @@ -.TH "NPM-SEARCH" "1" "April 2024" "" "" +.TH "NPM-SEARCH" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" .P .RS 2 .nf -npm search \[lB]search terms ...\[rB] +npm search \[lB] ...\[rB] aliases: find, s, se .fi @@ -22,16 +22,6 @@ Search also allows targeting of maintainers in search results, by prefixing thei .P If a term starts with \fB/\fR, then it's interpreted as a regular expression and supports standard JavaScript RegExp syntax. In this case search will ignore a trailing \fB/\fR . (Note you must escape or quote many regular expression characters in most shells.) .SS "Configuration" -.SS "\fBlong\fR" -.RS 0 -.IP \(bu 4 -Default: false -.IP \(bu 4 -Type: Boolean -.RE 0 - -.P -Show extended information in \fBls\fR, \fBsearch\fR, and \fBhelp-search\fR. .SS "\fBjson\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index cb74dfd382f0a1..af68b9b24ea56f 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" "April 2024" "" "" +.TH "NPM-SHRINKWRAP" "1" "September 2025" "NPM@10.9.4" "" .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 951ab5bdeb7eb3..610338bd8bd4a3 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" "April 2024" "" "" +.TH "NPM-STAR" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-star\fR - Mark your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index 7848df08500154..02cc66b0150dd1 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" "April 2024" "" "" +.TH "NPM-STARS" "1" "September 2025" "NPM@10.9.4" "" .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 c46b8dabed2e89..cd710c428ddf17 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" "April 2024" "" "" +.TH "NPM-START" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-start\fR - Start a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index 48ef025074040e..f464319bb0d854 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" "April 2024" "" "" +.TH "NPM-STOP" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-stop\fR - Stop a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1 index 4bbed65d580c39..cd9a7c26ac97b0 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" "April 2024" "" "" +.TH "NPM-TEAM" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-team\fR - Manage organization teams and team memberships .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index 233c6db054a77c..66519c550186ac 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" "April 2024" "" "" +.TH "NPM-TEST" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-test\fR - Test a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1 index 431302c44a7757..8fa563cae83a09 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" "April 2024" "" "" +.TH "NPM-TOKEN" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" @@ -23,23 +23,13 @@ This lets you list, create and revoke authentication tokens. .P .RS 2 .nf -+--------+---------+------------+----------+----------------+ -| id | token | created | read-only | CIDR whitelist | -+--------+---------+------------+----------+----------------+ -| 7f3134 | 1fa9ba… | 2017-10-02 | yes | | -+--------+---------+------------+----------+----------------+ -| c03241 | af7aef… | 2017-10-02 | no | 192.168.0.1/24 | -+--------+---------+------------+----------+----------------+ -| e0cf92 | 3a436a… | 2017-10-02 | no | | -+--------+---------+------------+----------+----------------+ -| 63eb9d | 74ef35… | 2017-09-28 | no | | -+--------+---------+------------+----------+----------------+ -| 2daaa8 | cbad5f… | 2017-09-26 | no | | -+--------+---------+------------+----------+----------------+ -| 68c2fe | 127e51… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ -| 6334e1 | 1dadd1… | 2017-09-23 | no | | -+--------+---------+------------+----------+----------------+ +Read only token npm_1f… with id 7f3134 created 2017-10-21 + +Publish token npm_af… with id c03241 created 2017-10-02 +with IP Whitelist: 192.168.0.1/24 + +Publish token npm_… with id e0cf92 created 2017-10-02 + .fi .RE .RS 0 @@ -52,15 +42,7 @@ Currently, the cli can not generate automation tokens. Please refer to the \fBdo .P .RS 2 .nf -+----------------+--------------------------------------+ -| token | a73c9572-f1b9-8983-983d-ba3ac3cc913d | -+----------------+--------------------------------------+ -| cidr_whitelist | | -+----------------+--------------------------------------+ -| readonly | false | -+----------------+--------------------------------------+ -| created | 2017-10-02T07:52:24.838Z | -+----------------+--------------------------------------+ +Created publish token a73c9572-f1b9-8983-983d-ba3ac3cc913d .fi .RE .RS 0 diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 700037a7e1cbf8..29b3262891bfb6 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" "April 2024" "" "" +.TH "NPM-UNINSTALL" "1" "September 2025" "NPM@10.9.4" "" .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 01697803cdfaf6..44d5facd930b02 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" "April 2024" "" "" +.TH "NPM-UNPUBLISH" "1" "September 2025" "NPM@10.9.4" "" .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 98a6980bd021d5..376cabeb8a36aa 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" "April 2024" "" "" +.TH "NPM-UNSTAR" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-unstar\fR - Remove an item from your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index af80d1b0e398b7..c851b7a555380a 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" "April 2024" "" "" +.TH "NPM-UPDATE" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-update\fR - Update packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index 3ec27ac0569159..a8f1f08ae120ad 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" "April 2024" "" "" +.TH "NPM-VERSION" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm-version\fR - Bump a package version .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index 39bf6ae8c9cc2e..505563e99aad90 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" "April 2024" "" "" +.TH "NPM-VIEW" "1" "September 2025" "NPM@10.9.4" "" .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 7e38f165585c9a..af860ad121a0a6 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" "April 2024" "" "" +.TH "NPM-WHOAMI" "1" "September 2025" "NPM@10.9.4" "" .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 6ac1a88baf121d..17d7de9e16e429 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "April 2024" "" "" +.TH "NPM" "1" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -10.5.1 +10.9.4 .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. @@ -102,7 +102,7 @@ Please be sure to follow the template and bug reporting guidelines. Discuss new feature ideas on our discussion forum: .RS 0 .IP \(bu 4 -\fI\(lahttps://github.com/npm/feedback\(ra\fR +\fI\(lahttps://github.com/orgs/community/discussions/categories/npm\(ra\fR .RE 0 .P diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index 0a4ff19f4bc901..a02bc9eece79bc 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "April 2024" "" "" +.TH "NPX" "1" "September 2025" "NPM@10.9.4" "" .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 12bda4e2881711..642c26ba345279 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "April 2024" "" "" +.TH "FOLDERS" "5" "September 2025" "NPM@10.9.4" "" .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 42e18760236ea4..b9c9f105a1c1fa 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "April 2024" "" "" +.TH "INSTALL" "5" "September 2025" "NPM@10.9.4" "" .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 12bda4e2881711..642c26ba345279 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "April 2024" "" "" +.TH "FOLDERS" "5" "September 2025" "NPM@10.9.4" "" .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 69dcb58aa1b1ef..6958d47974a24c 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" "April 2024" "" "" +.TH "PACKAGE.JSON" "5" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" @@ -205,7 +205,7 @@ Both email and url are optional either way. npm also sets a top-level "maintainers" field with your npm user info. .SS "funding" .P -You can specify an object containing a URL that provides up-to-date information about ways to help fund development of your package, or a string URL, or an array of these: +You can specify an object containing a URL that provides up-to-date information about ways to help fund development of your package, a string URL, or an array of objects and string URLs: .P .RS 2 .nf @@ -213,15 +213,33 @@ You can specify an object containing a URL that provides up-to-date information "funding": { "type" : "individual", "url" : "http://example.com/donate" - }, - + } +} +.fi +.RE +.P +.RS 2 +.nf +{ "funding": { "type" : "patreon", "url" : "https://www.patreon.com/my-account" - }, - - "funding": "http://example.com/donate", - + } +} +.fi +.RE +.P +.RS 2 +.nf +{ + "funding": "http://example.com/donate" +} +.fi +.RE +.P +.RS 2 +.nf +{ "funding": \[lB] { "type" : "individual", @@ -237,7 +255,7 @@ You can specify an object containing a URL that provides up-to-date information .fi .RE .P -Users can use the \fBnpm fund\fR subcommand to list the \fBfunding\fR URLs of all dependencies of their project, direct and indirect. A shortcut to visit each funding url is also available when providing the project name such as: \fBnpm fund \fR (when there are multiple URLs, the first one will be visited) +Users can use the \fBnpm fund\fR subcommand to list the \fBfunding\fR URLs of all dependencies of their project, direct and indirect. A shortcut to visit each funding URL is also available when providing the project name such as: \fBnpm fund \fR (when there are multiple URLs, the first one will be visited) .SS "files" .P The optional \fBfiles\fR field is an array of file patterns that describes the entries to be included when your package is installed as a dependency. File patterns follow a similar syntax to \fB.gitignore\fR, but reversed: including a file, directory, or glob pattern (\fB*\fR, \fB**/*\fR, and such) will make it so that file is included in the tarball when it's packed. Omitting the field will make it default to \fB\[lB]"*"\[rB]\fR, which means it will include all files. @@ -320,6 +338,9 @@ Most of these ignored files can be included specifically if included in the \fBf .P These can not be included. +.SS "exports" +.P +The "exports" provides a modern alternative to "main" allowing multiple entry points to be defined, conditional entry resolution support between environments, and preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to clearly define the public interface for their package. For more details see the \fBnode.js documentation on package entry points\fR \fI\(lahttps://nodejs.org/api/packages.html#package-entry-points\(ra\fR .SS "main" .P The main field is a module ID that is the primary entry point to your program. That is, if your package is named \fBfoo\fR, and a user installs it, and then does \fBrequire("foo")\fR, then your main module's exports object will be returned. @@ -344,7 +365,7 @@ For example, myapp could have this: .nf { "bin": { - "myapp": "./cli.js" + "myapp": "bin/cli.js" } } .fi @@ -359,7 +380,7 @@ If you have a single executable, and its name should be the name of the package, { "name": "my-program", "version": "1.2.5", - "bin": "./path/to/program" + "bin": "path/to/program" } .fi .RE @@ -372,7 +393,7 @@ would be the same as this: "name": "my-program", "version": "1.2.5", "bin": { - "my-program": "./path/to/program" + "my-program": "path/to/program" } } .fi @@ -456,7 +477,7 @@ Because of the way the \fBbin\fR directive works, specifying both a \fBbin\fR pa A folder that is full of man pages. Sugar to generate a "man" array by walking the folder. .SS "repository" .P -Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the \fBnpm docs\fR command will be able to find you. +Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the \fBnpm repo\fR command will be able to find you. .P Do it like this: .P @@ -465,7 +486,7 @@ Do it like this: { "repository": { "type": "git", - "url": "https://github.com/npm/cli.git" + "url": "git+https://github.com/npm/cli.git" } } .fi @@ -498,8 +519,8 @@ If the \fBpackage.json\fR for your package is not in the root directory (for exa { "repository": { "type": "git", - "url": "https://github.com/facebook/react.git", - "directory": "packages/react-dom" + "url": "git+https://github.com/npm/cli.git", + "directory": "workspaces/libnpmpublish" } } .fi @@ -567,6 +588,8 @@ See \fBsemver\fR \fI\(lahttps://github.com/npm/node-semver#versions\(ra\fR for m \fBtag\fR A specific version tagged and published as \fBtag\fR See npm help dist-tag .IP \(bu 4 \fBpath/path/path\fR See \fBLocal Paths\fR \fI(Local Paths)\fR below +.IP \(bu 4 +\fBnpm:@scope/pkg@version\fR Custom alias for a package See \fB\fBpackage-spec\fR\fR \fI\(la/using-npm/package-spec#aliases\(ra\fR .RE 0 .P @@ -587,7 +610,8 @@ For example, these are all valid: "two": "2.x", "thr": "3.3.x", "lat": "latest", - "dyl": "file:../dyl" + "dyl": "file:../dyl", + "kpg": "npm:pkg@1.0.0" } } .fi @@ -754,7 +778,7 @@ Trying to install another plugin with a conflicting requirement may cause an err Assuming the host complies with \fBsemver\fR \fI\(lahttps://semver.org/\(ra\fR, only changes in the host package's major version will break your plugin. Thus, if you've worked with every 1.x version of the host package, use \fB"^1.0"\fR or \fB"1.x"\fR to express this. If you depend on features introduced in 1.5.2, use \fB"^1.5.2"\fR. .SS "peerDependenciesMeta" .P -When a user installs your package, npm will emit warnings if packages specified in \fBpeerDependencies\fR are not already installed. The \fBpeerDependenciesMeta\fR field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer dependencies to be marked as optional. +The \fBpeerDependenciesMeta\fR field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer dependencies to be marked as optional. Npm will not automatically install optional peer dependencies. This allows you to integrate and interact with a variety of host packages without requiring all of them to be installed. .P For example: .P @@ -775,8 +799,6 @@ For example: } .fi .RE -.P -Marking a peer dependency as optional ensures npm will not emit a warning if the \fBsoy-milk\fR package is not installed on the host. This allows you to integrate and interact with a variety of host packages without requiring all of them to be installed. .SS "bundleDependencies" .P This defines an array of package names that will be bundled when publishing the package. @@ -840,6 +862,8 @@ If you need to make specific changes to dependencies of your dependencies, for e .P Overrides provide a way to replace a package in your dependency tree with another version, or another package entirely. These changes can be scoped as specific or as vague as desired. .P +Overrides are only considered in the root \fBpackage.json\fR file for a project. Overrides in installed dependencies (including npm help workspaces) are not considered in dependency tree resolution. Published packages may dictate their resolutions by pinning dependencies or using an \fB\fBnpm-shrinkwrap.json\fR\fR \fI\(la/configuring-npm/npm-shrinkwrap-json\(ra\fR file. +.P To make sure the package \fBfoo\fR is always installed as version \fB1.0.0\fR no matter what version your dependencies rely on: .P .RS 2 @@ -1020,6 +1044,35 @@ Like the \fBos\fR option, you can also block architectures: .RE .P The host architecture is determined by \fBprocess.arch\fR +.SS "devEngines" +.P +The \fBdevEngines\fR field aids engineers working on a codebase to all be using the same tooling. +.P +You can specify a \fBdevEngines\fR property in your \fBpackage.json\fR which will run before \fBinstall\fR, \fBci\fR, and \fBrun\fR commands. +.RS 0 +.P +Note: \fBengines\fR and \fBdevEngines\fR differ in object shape. They also function very differently. \fBengines\fR is designed to alert the user when a dependency uses a differening npm or node version that the project it's being used in, whereas \fBdevEngines\fR is used to alert people interacting with the source code of a project. +.RE 0 + +.P +The supported keys under the \fBdevEngines\fR property are \fBcpu\fR, \fBos\fR, \fBlibc\fR, \fBruntime\fR, and \fBpackageManager\fR. Each property can be an object or an array of objects. Objects must contain \fBname\fR, and optionally can specify \fBversion\fR, and \fBonFail\fR. \fBonFail\fR can be \fBwarn\fR, \fBerror\fR, or \fBignore\fR, and if left undefined is of the same value as \fBerror\fR. \fBnpm\fR will assume that you're running with \fBnode\fR. Here's an example of a project that will fail if the environment is not \fBnode\fR and \fBnpm\fR. If you set \fBruntime.name\fR or \fBpackageManager.name\fR to any other string, it will fail within the npm CLI. +.P +.RS 2 +.nf +{ + "devEngines": { + "runtime": { + "name": "node", + "onFail": "error" + }, + "packageManager": { + "name": "npm", + "onFail": "error" + } + } +} +.fi +.RE .SS "private" .P If you set \fB"private": true\fR in your package.json, then npm will refuse to publish it. diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index 36a4073b92ac02..99a49edc84bd2f 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" "April 2024" "" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "September 2025" "NPM@10.9.4" "" .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 16543b3bc98520..dc14f02c396dd7 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH "NPMRC" "5" "April 2024" "" "" +.TH "NPMRC" "5" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBnpmrc\fR - The npm config files .SS "Description" @@ -27,7 +27,7 @@ All npm config files are an ini-formatted list of \fBkey = value\fR parameters. .P .RS 2 .nf -prefix = ${HOME}/.npm-packages +cache = ${HOME}/.npm-packages .fi .RE .P @@ -106,10 +106,13 @@ _authToken=MYTOKEN @myorg:registry=https://somewhere-else.com/myorg @another:registry=https://somewhere-else.com/another //registry.npmjs.org/:_authToken=MYTOKEN + ; would apply to both @myorg and @another -; //somewhere-else.com/:_authToken=MYTOKEN +//somewhere-else.com/:_authToken=MYTOKEN + ; would apply only to @myorg //somewhere-else.com/myorg/:_authToken=MYTOKEN1 + ; would apply only to @another //somewhere-else.com/another/:_authToken=MYTOKEN2 .fi diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5 index 69dcb58aa1b1ef..6958d47974a24c 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" "April 2024" "" "" +.TH "PACKAGE.JSON" "5" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" @@ -205,7 +205,7 @@ Both email and url are optional either way. npm also sets a top-level "maintainers" field with your npm user info. .SS "funding" .P -You can specify an object containing a URL that provides up-to-date information about ways to help fund development of your package, or a string URL, or an array of these: +You can specify an object containing a URL that provides up-to-date information about ways to help fund development of your package, a string URL, or an array of objects and string URLs: .P .RS 2 .nf @@ -213,15 +213,33 @@ You can specify an object containing a URL that provides up-to-date information "funding": { "type" : "individual", "url" : "http://example.com/donate" - }, - + } +} +.fi +.RE +.P +.RS 2 +.nf +{ "funding": { "type" : "patreon", "url" : "https://www.patreon.com/my-account" - }, - - "funding": "http://example.com/donate", - + } +} +.fi +.RE +.P +.RS 2 +.nf +{ + "funding": "http://example.com/donate" +} +.fi +.RE +.P +.RS 2 +.nf +{ "funding": \[lB] { "type" : "individual", @@ -237,7 +255,7 @@ You can specify an object containing a URL that provides up-to-date information .fi .RE .P -Users can use the \fBnpm fund\fR subcommand to list the \fBfunding\fR URLs of all dependencies of their project, direct and indirect. A shortcut to visit each funding url is also available when providing the project name such as: \fBnpm fund \fR (when there are multiple URLs, the first one will be visited) +Users can use the \fBnpm fund\fR subcommand to list the \fBfunding\fR URLs of all dependencies of their project, direct and indirect. A shortcut to visit each funding URL is also available when providing the project name such as: \fBnpm fund \fR (when there are multiple URLs, the first one will be visited) .SS "files" .P The optional \fBfiles\fR field is an array of file patterns that describes the entries to be included when your package is installed as a dependency. File patterns follow a similar syntax to \fB.gitignore\fR, but reversed: including a file, directory, or glob pattern (\fB*\fR, \fB**/*\fR, and such) will make it so that file is included in the tarball when it's packed. Omitting the field will make it default to \fB\[lB]"*"\[rB]\fR, which means it will include all files. @@ -320,6 +338,9 @@ Most of these ignored files can be included specifically if included in the \fBf .P These can not be included. +.SS "exports" +.P +The "exports" provides a modern alternative to "main" allowing multiple entry points to be defined, conditional entry resolution support between environments, and preventing any other entry points besides those defined in "exports". This encapsulation allows module authors to clearly define the public interface for their package. For more details see the \fBnode.js documentation on package entry points\fR \fI\(lahttps://nodejs.org/api/packages.html#package-entry-points\(ra\fR .SS "main" .P The main field is a module ID that is the primary entry point to your program. That is, if your package is named \fBfoo\fR, and a user installs it, and then does \fBrequire("foo")\fR, then your main module's exports object will be returned. @@ -344,7 +365,7 @@ For example, myapp could have this: .nf { "bin": { - "myapp": "./cli.js" + "myapp": "bin/cli.js" } } .fi @@ -359,7 +380,7 @@ If you have a single executable, and its name should be the name of the package, { "name": "my-program", "version": "1.2.5", - "bin": "./path/to/program" + "bin": "path/to/program" } .fi .RE @@ -372,7 +393,7 @@ would be the same as this: "name": "my-program", "version": "1.2.5", "bin": { - "my-program": "./path/to/program" + "my-program": "path/to/program" } } .fi @@ -456,7 +477,7 @@ Because of the way the \fBbin\fR directive works, specifying both a \fBbin\fR pa A folder that is full of man pages. Sugar to generate a "man" array by walking the folder. .SS "repository" .P -Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the \fBnpm docs\fR command will be able to find you. +Specify the place where your code lives. This is helpful for people who want to contribute. If the git repo is on GitHub, then the \fBnpm repo\fR command will be able to find you. .P Do it like this: .P @@ -465,7 +486,7 @@ Do it like this: { "repository": { "type": "git", - "url": "https://github.com/npm/cli.git" + "url": "git+https://github.com/npm/cli.git" } } .fi @@ -498,8 +519,8 @@ If the \fBpackage.json\fR for your package is not in the root directory (for exa { "repository": { "type": "git", - "url": "https://github.com/facebook/react.git", - "directory": "packages/react-dom" + "url": "git+https://github.com/npm/cli.git", + "directory": "workspaces/libnpmpublish" } } .fi @@ -567,6 +588,8 @@ See \fBsemver\fR \fI\(lahttps://github.com/npm/node-semver#versions\(ra\fR for m \fBtag\fR A specific version tagged and published as \fBtag\fR See npm help dist-tag .IP \(bu 4 \fBpath/path/path\fR See \fBLocal Paths\fR \fI(Local Paths)\fR below +.IP \(bu 4 +\fBnpm:@scope/pkg@version\fR Custom alias for a package See \fB\fBpackage-spec\fR\fR \fI\(la/using-npm/package-spec#aliases\(ra\fR .RE 0 .P @@ -587,7 +610,8 @@ For example, these are all valid: "two": "2.x", "thr": "3.3.x", "lat": "latest", - "dyl": "file:../dyl" + "dyl": "file:../dyl", + "kpg": "npm:pkg@1.0.0" } } .fi @@ -754,7 +778,7 @@ Trying to install another plugin with a conflicting requirement may cause an err Assuming the host complies with \fBsemver\fR \fI\(lahttps://semver.org/\(ra\fR, only changes in the host package's major version will break your plugin. Thus, if you've worked with every 1.x version of the host package, use \fB"^1.0"\fR or \fB"1.x"\fR to express this. If you depend on features introduced in 1.5.2, use \fB"^1.5.2"\fR. .SS "peerDependenciesMeta" .P -When a user installs your package, npm will emit warnings if packages specified in \fBpeerDependencies\fR are not already installed. The \fBpeerDependenciesMeta\fR field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer dependencies to be marked as optional. +The \fBpeerDependenciesMeta\fR field serves to provide npm more information on how your peer dependencies are to be used. Specifically, it allows peer dependencies to be marked as optional. Npm will not automatically install optional peer dependencies. This allows you to integrate and interact with a variety of host packages without requiring all of them to be installed. .P For example: .P @@ -775,8 +799,6 @@ For example: } .fi .RE -.P -Marking a peer dependency as optional ensures npm will not emit a warning if the \fBsoy-milk\fR package is not installed on the host. This allows you to integrate and interact with a variety of host packages without requiring all of them to be installed. .SS "bundleDependencies" .P This defines an array of package names that will be bundled when publishing the package. @@ -840,6 +862,8 @@ If you need to make specific changes to dependencies of your dependencies, for e .P Overrides provide a way to replace a package in your dependency tree with another version, or another package entirely. These changes can be scoped as specific or as vague as desired. .P +Overrides are only considered in the root \fBpackage.json\fR file for a project. Overrides in installed dependencies (including npm help workspaces) are not considered in dependency tree resolution. Published packages may dictate their resolutions by pinning dependencies or using an \fB\fBnpm-shrinkwrap.json\fR\fR \fI\(la/configuring-npm/npm-shrinkwrap-json\(ra\fR file. +.P To make sure the package \fBfoo\fR is always installed as version \fB1.0.0\fR no matter what version your dependencies rely on: .P .RS 2 @@ -1020,6 +1044,35 @@ Like the \fBos\fR option, you can also block architectures: .RE .P The host architecture is determined by \fBprocess.arch\fR +.SS "devEngines" +.P +The \fBdevEngines\fR field aids engineers working on a codebase to all be using the same tooling. +.P +You can specify a \fBdevEngines\fR property in your \fBpackage.json\fR which will run before \fBinstall\fR, \fBci\fR, and \fBrun\fR commands. +.RS 0 +.P +Note: \fBengines\fR and \fBdevEngines\fR differ in object shape. They also function very differently. \fBengines\fR is designed to alert the user when a dependency uses a differening npm or node version that the project it's being used in, whereas \fBdevEngines\fR is used to alert people interacting with the source code of a project. +.RE 0 + +.P +The supported keys under the \fBdevEngines\fR property are \fBcpu\fR, \fBos\fR, \fBlibc\fR, \fBruntime\fR, and \fBpackageManager\fR. Each property can be an object or an array of objects. Objects must contain \fBname\fR, and optionally can specify \fBversion\fR, and \fBonFail\fR. \fBonFail\fR can be \fBwarn\fR, \fBerror\fR, or \fBignore\fR, and if left undefined is of the same value as \fBerror\fR. \fBnpm\fR will assume that you're running with \fBnode\fR. Here's an example of a project that will fail if the environment is not \fBnode\fR and \fBnpm\fR. If you set \fBruntime.name\fR or \fBpackageManager.name\fR to any other string, it will fail within the npm CLI. +.P +.RS 2 +.nf +{ + "devEngines": { + "runtime": { + "name": "node", + "onFail": "error" + }, + "packageManager": { + "name": "npm", + "onFail": "error" + } + } +} +.fi +.RE .SS "private" .P If you set \fB"private": true\fR in your package.json, then npm will refuse to publish it. diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5 index 426901d95437d9..b198dea22a6a3e 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" "April 2024" "" "" +.TH "PACKAGE-LOCK.JSON" "5" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" @@ -19,6 +19,8 @@ Optimize the installation process by allowing npm to skip repeated metadata reso As of npm v7, lockfiles include enough information to gain a complete picture of the package tree, reducing the need to read \fBpackage.json\fR files, and allowing for significant performance improvements. .RE 0 +.P +When \fBnpm\fR creates or updates \fBpackage-lock.json\fR, it will infer line endings and indentation from \fBpackage.json\fR so that the formatting of both files matches. .SS "\fBpackage-lock.json\fR vs \fBnpm-shrinkwrap.json\fR" .P Both of these files have the same format, and perform similar functions in the root of a project. diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index ffbf3e50537e37..c0526d9b2940ba 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "April 2024" "" "" +.TH "CONFIG" "7" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBconfig\fR - More than you probably want to know about npm configuration .SS "Description" @@ -1219,7 +1219,7 @@ Type: Boolean .RE 0 .P -When set to \fBtrue\fR, npm will display a progress bar during time intensive operations, if \fBprocess.stderr\fR is a TTY. +When set to \fBtrue\fR, npm will display a progress bar during time intensive operations, if \fBprocess.stderr\fR and \fBprocess.stdout\fR are a TTY. .P Set to \fBfalse\fR to suppress the progress bar. .SS "\fBprovenance\fR" @@ -1567,9 +1567,12 @@ 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 -Also the tag that is added to the package@version specified by the \fBnpm tag\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 +If used in the \fBnpm publish\fR command, this is the tag that will be added to the package submitted to the registry. .SS "\fBtag-version-prefix\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 588989321c6ad1..dc20fcab2b9339 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "QUERYING" "7" "April 2024" "" "" +.TH "QUERYING" "7" "September 2025" "NPM@10.9.4" "" .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 a69fcc052a6da0..6af18270ffdfbb 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "April 2024" "" "" +.TH "DEVELOPERS" "7" "September 2025" "NPM@10.9.4" "" .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 dfbed85ffbb07f..8941fd3c51878e 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "April 2024" "" "" +.TH "LOGGING" "7" "September 2025" "NPM@10.9.4" "" .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 181693d04032d7..a3b22bde63c6b0 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGS" "7" "April 2024" "" "" +.TH "ORGS" "7" "September 2025" "NPM@10.9.4" "" .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 167a6915218b94..8b8cc8f8badbaa 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" "April 2024" "" "" +.TH "PACKAGE-SPEC" "7" "September 2025" "NPM@10.9.4" "" .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 73f17929c427aa..e416f4f99d60d8 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "April 2024" "" "" +.TH "REGISTRY" "7" "September 2025" "NPM@10.9.4" "" .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 9b091566aaf453..7499745f8019d0 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "April 2024" "" "" +.TH "REMOVAL" "7" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBremoval\fR - Cleaning the Slate .SS "Synopsis" @@ -11,13 +11,7 @@ sudo npm uninstall npm -g .fi .RE .P -Or, if that fails, get the npm source code, and do: -.P -.RS 2 -.nf -sudo make uninstall -.fi -.RE +Or, if that fails, please proceed to more severe uninstalling methods. .SS "More Severe Uninstalling" .P Usually, the above instructions are sufficient. That will remove npm, but leave behind anything you've installed. diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7 index 437a4df173394e..bc0f23df01f23d 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "April 2024" "" "" +.TH "SCOPE" "7" "September 2025" "NPM@10.9.4" "" .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 b051216d26213e..aeddbfe88fa5df 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "April 2024" "" "" +.TH "SCRIPTS" "7" "September 2025" "NPM@10.9.4" "" .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 78242b33b18c7b..5a3753ddf1ea1d 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "April 2024" "" "" +.TH "WORKSPACES" "7" "September 2025" "NPM@10.9.4" "" .SH "NAME" \fBworkspaces\fR - Working with workspaces .SS "Description" diff --git a/deps/npm/node_modules/@colors/colors/LICENSE b/deps/npm/node_modules/@colors/colors/LICENSE deleted file mode 100644 index 6b86056199d2ac..00000000000000 --- a/deps/npm/node_modules/@colors/colors/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -MIT License - -Original Library - - Copyright (c) Marak Squires - -Additional Functionality - - Copyright (c) Sindre Sorhus (sindresorhus.com) - - Copyright (c) DABH (https://github.com/DABH) - -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/node_modules/@colors/colors/examples/normal-usage.js b/deps/npm/node_modules/@colors/colors/examples/normal-usage.js deleted file mode 100644 index c4515653e288d7..00000000000000 --- a/deps/npm/node_modules/@colors/colors/examples/normal-usage.js +++ /dev/null @@ -1,82 +0,0 @@ -var colors = require('../lib/index'); - -console.log('First some yellow text'.yellow); - -console.log('Underline that text'.yellow.underline); - -console.log('Make it bold and red'.red.bold); - -console.log(('Double Raindows All Day Long').rainbow); - -console.log('Drop the bass'.trap); - -console.log('DROP THE RAINBOW BASS'.trap.rainbow); - -// styles not widely supported -console.log('Chains are also cool.'.bold.italic.underline.red); - -// styles not widely supported -console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse - + ' styles! '.yellow.bold); -console.log('Zebras are so fun!'.zebra); - -// -// Remark: .strikethrough may not work with Mac OS Terminal App -// -console.log('This is ' + 'not'.strikethrough + ' fun.'); - -console.log('Background color attack!'.black.bgWhite); -console.log('Use random styles on everything!'.random); -console.log('America, Heck Yeah!'.america); - -// eslint-disable-next-line max-len -console.log('Blindingly '.brightCyan + 'bright? '.brightRed + 'Why '.brightYellow + 'not?!'.brightGreen); - -console.log('Setting themes is useful'); - -// -// Custom themes -// -console.log('Generic logging theme as JSON'.green.bold.underline); -// Load theme with JSON literal -colors.setTheme({ - silly: 'rainbow', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - debug: 'blue', - error: 'red', -}); - -// outputs red text -console.log('this is an error'.error); - -// outputs yellow text -console.log('this is a warning'.warn); - -// outputs grey text -console.log('this is an input'.input); - -console.log('Generic logging theme as file'.green.bold.underline); - -// Load a theme from file -try { - colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); -} catch (err) { - console.log(err); -} - -// outputs red text -console.log('this is an error'.error); - -// outputs yellow text -console.log('this is a warning'.warn); - -// outputs grey text -console.log('this is an input'.input); - -// console.log("Don't summon".zalgo) diff --git a/deps/npm/node_modules/@colors/colors/examples/safe-string.js b/deps/npm/node_modules/@colors/colors/examples/safe-string.js deleted file mode 100644 index ed5f4ca468e10f..00000000000000 --- a/deps/npm/node_modules/@colors/colors/examples/safe-string.js +++ /dev/null @@ -1,78 +0,0 @@ -var colors = require('../safe'); - -console.log(colors.yellow('First some yellow text')); - -console.log(colors.yellow.underline('Underline that text')); - -console.log(colors.red.bold('Make it bold and red')); - -console.log(colors.rainbow('Double Raindows All Day Long')); - -console.log(colors.trap('Drop the bass')); - -console.log(colors.rainbow(colors.trap('DROP THE RAINBOW BASS'))); - -// styles not widely supported -console.log(colors.bold.italic.underline.red('Chains are also cool.')); - -// styles not widely supported -console.log(colors.green('So ') + colors.underline('are') + ' ' - + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); - -console.log(colors.zebra('Zebras are so fun!')); - -console.log('This is ' + colors.strikethrough('not') + ' fun.'); - - -console.log(colors.black.bgWhite('Background color attack!')); -console.log(colors.random('Use random styles on everything!')); -console.log(colors.america('America, Heck Yeah!')); - -// eslint-disable-next-line max-len -console.log(colors.brightCyan('Blindingly ') + colors.brightRed('bright? ') + colors.brightYellow('Why ') + colors.brightGreen('not?!')); - -console.log('Setting themes is useful'); - -// -// Custom themes -// -// console.log('Generic logging theme as JSON'.green.bold.underline); -// Load theme with JSON literal -colors.setTheme({ - silly: 'rainbow', - input: 'blue', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - debug: 'blue', - error: 'red', -}); - -// outputs red text -console.log(colors.error('this is an error')); - -// outputs yellow text -console.log(colors.warn('this is a warning')); - -// outputs blue text -console.log(colors.input('this is an input')); - - -// console.log('Generic logging theme as file'.green.bold.underline); - -// Load a theme from file -colors.setTheme(require(__dirname + '/../themes/generic-logging.js')); - -// outputs red text -console.log(colors.error('this is an error')); - -// outputs yellow text -console.log(colors.warn('this is a warning')); - -// outputs grey text -console.log(colors.input('this is an input')); - -// console.log(colors.zalgo("Don't summon him")) diff --git a/deps/npm/node_modules/@colors/colors/lib/colors.js b/deps/npm/node_modules/@colors/colors/lib/colors.js deleted file mode 100644 index d9fb08762fde51..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/colors.js +++ /dev/null @@ -1,211 +0,0 @@ -/* - -The MIT License (MIT) - -Original Library - - Copyright (c) Marak Squires - -Additional functionality - - Copyright (c) Sindre Sorhus (sindresorhus.com) - -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. - -*/ - -var colors = {}; -module['exports'] = colors; - -colors.themes = {}; - -var util = require('util'); -var ansiStyles = colors.styles = require('./styles'); -var defineProps = Object.defineProperties; -var newLineRegex = new RegExp(/[\r\n]+/g); - -colors.supportsColor = require('./system/supports-colors').supportsColor; - -if (typeof colors.enabled === 'undefined') { - colors.enabled = colors.supportsColor() !== false; -} - -colors.enable = function() { - colors.enabled = true; -}; - -colors.disable = function() { - colors.enabled = false; -}; - -colors.stripColors = colors.strip = function(str) { - return ('' + str).replace(/\x1B\[\d+m/g, ''); -}; - -// eslint-disable-next-line no-unused-vars -var stylize = colors.stylize = function stylize(str, style) { - if (!colors.enabled) { - return str+''; - } - - var styleMap = ansiStyles[style]; - - // Stylize should work for non-ANSI styles, too - if (!styleMap && style in colors) { - // Style maps like trap operate as functions on strings; - // they don't have properties like open or close. - return colors[style](str); - } - - return styleMap.open + str + styleMap.close; -}; - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; -var escapeStringRegexp = function(str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - return str.replace(matchOperatorsRe, '\\$&'); -}; - -function build(_styles) { - var builder = function builder() { - return applyStyle.apply(builder, arguments); - }; - builder._styles = _styles; - // __proto__ is used because we must return a function, but there is - // no way to create a function with a different prototype. - builder.__proto__ = proto; - return builder; -} - -var styles = (function() { - var ret = {}; - ansiStyles.grey = ansiStyles.gray; - Object.keys(ansiStyles).forEach(function(key) { - ansiStyles[key].closeRe = - new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - ret[key] = { - get: function() { - return build(this._styles.concat(key)); - }, - }; - }); - return ret; -})(); - -var proto = defineProps(function colors() {}, styles); - -function applyStyle() { - var args = Array.prototype.slice.call(arguments); - - var str = args.map(function(arg) { - // Use weak equality check so we can colorize null/undefined in safe mode - if (arg != null && arg.constructor === String) { - return arg; - } else { - return util.inspect(arg); - } - }).join(' '); - - if (!colors.enabled || !str) { - return str; - } - - var newLinesPresent = str.indexOf('\n') != -1; - - var nestedStyles = this._styles; - - var i = nestedStyles.length; - while (i--) { - var code = ansiStyles[nestedStyles[i]]; - str = code.open + str.replace(code.closeRe, code.open) + code.close; - if (newLinesPresent) { - str = str.replace(newLineRegex, function(match) { - return code.close + match + code.open; - }); - } - } - - return str; -} - -colors.setTheme = function(theme) { - if (typeof theme === 'string') { - console.log('colors.setTheme now only accepts an object, not a string. ' + - 'If you are trying to set a theme from a file, it is now your (the ' + - 'caller\'s) responsibility to require the file. The old syntax ' + - 'looked like colors.setTheme(__dirname + ' + - '\'/../themes/generic-logging.js\'); The new syntax looks like '+ - 'colors.setTheme(require(__dirname + ' + - '\'/../themes/generic-logging.js\'));'); - return; - } - for (var style in theme) { - (function(style) { - colors[style] = function(str) { - if (typeof theme[style] === 'object') { - var out = str; - for (var i in theme[style]) { - out = colors[theme[style][i]](out); - } - return out; - } - return colors[theme[style]](str); - }; - })(style); - } -}; - -function init() { - var ret = {}; - Object.keys(styles).forEach(function(name) { - ret[name] = { - get: function() { - return build([name]); - }, - }; - }); - return ret; -} - -var sequencer = function sequencer(map, str) { - var exploded = str.split(''); - exploded = exploded.map(map); - return exploded.join(''); -}; - -// custom formatter methods -colors.trap = require('./custom/trap'); -colors.zalgo = require('./custom/zalgo'); - -// maps -colors.maps = {}; -colors.maps.america = require('./maps/america')(colors); -colors.maps.zebra = require('./maps/zebra')(colors); -colors.maps.rainbow = require('./maps/rainbow')(colors); -colors.maps.random = require('./maps/random')(colors); - -for (var map in colors.maps) { - (function(map) { - colors[map] = function(str) { - return sequencer(colors.maps[map], str); - }; - })(map); -} - -defineProps(colors, init()); diff --git a/deps/npm/node_modules/@colors/colors/lib/custom/trap.js b/deps/npm/node_modules/@colors/colors/lib/custom/trap.js deleted file mode 100644 index fbccf88dede0b8..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/custom/trap.js +++ /dev/null @@ -1,46 +0,0 @@ -module['exports'] = function runTheTrap(text, options) { - var result = ''; - text = text || 'Run the trap, drop the bass'; - text = text.split(''); - var trap = { - a: ['\u0040', '\u0104', '\u023a', '\u0245', '\u0394', '\u039b', '\u0414'], - b: ['\u00df', '\u0181', '\u0243', '\u026e', '\u03b2', '\u0e3f'], - c: ['\u00a9', '\u023b', '\u03fe'], - d: ['\u00d0', '\u018a', '\u0500', '\u0501', '\u0502', '\u0503'], - e: ['\u00cb', '\u0115', '\u018e', '\u0258', '\u03a3', '\u03be', '\u04bc', - '\u0a6c'], - f: ['\u04fa'], - g: ['\u0262'], - h: ['\u0126', '\u0195', '\u04a2', '\u04ba', '\u04c7', '\u050a'], - i: ['\u0f0f'], - j: ['\u0134'], - k: ['\u0138', '\u04a0', '\u04c3', '\u051e'], - l: ['\u0139'], - m: ['\u028d', '\u04cd', '\u04ce', '\u0520', '\u0521', '\u0d69'], - n: ['\u00d1', '\u014b', '\u019d', '\u0376', '\u03a0', '\u048a'], - o: ['\u00d8', '\u00f5', '\u00f8', '\u01fe', '\u0298', '\u047a', '\u05dd', - '\u06dd', '\u0e4f'], - p: ['\u01f7', '\u048e'], - q: ['\u09cd'], - r: ['\u00ae', '\u01a6', '\u0210', '\u024c', '\u0280', '\u042f'], - s: ['\u00a7', '\u03de', '\u03df', '\u03e8'], - t: ['\u0141', '\u0166', '\u0373'], - u: ['\u01b1', '\u054d'], - v: ['\u05d8'], - w: ['\u0428', '\u0460', '\u047c', '\u0d70'], - x: ['\u04b2', '\u04fe', '\u04fc', '\u04fd'], - y: ['\u00a5', '\u04b0', '\u04cb'], - z: ['\u01b5', '\u0240'], - }; - text.forEach(function(c) { - c = c.toLowerCase(); - var chars = trap[c] || [' ']; - var rand = Math.floor(Math.random() * chars.length); - if (typeof trap[c] !== 'undefined') { - result += trap[c][rand]; - } else { - result += c; - } - }); - return result; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/custom/zalgo.js b/deps/npm/node_modules/@colors/colors/lib/custom/zalgo.js deleted file mode 100644 index 01bdd2b802f626..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/custom/zalgo.js +++ /dev/null @@ -1,109 +0,0 @@ -// please no -module['exports'] = function zalgo(text, options) { - text = text || ' he is here '; - var soul = { - 'up': [ - '̍', '̎', '̄', '̅', - '̿', '̑', '̆', '̐', - '͒', '͗', '͑', '̇', - '̈', '̊', '͂', '̓', - '̈', '͊', '͋', '͌', - '̃', '̂', '̌', '͐', - '̀', '́', '̋', '̏', - '̒', '̓', '̔', '̽', - '̉', 'ͣ', 'ͤ', 'ͥ', - 'ͦ', 'ͧ', 'ͨ', 'ͩ', - 'ͪ', 'ͫ', 'ͬ', 'ͭ', - 'ͮ', 'ͯ', '̾', '͛', - '͆', '̚', - ], - 'down': [ - '̖', '̗', '̘', '̙', - '̜', '̝', '̞', '̟', - '̠', '̤', '̥', '̦', - '̩', '̪', '̫', '̬', - '̭', '̮', '̯', '̰', - '̱', '̲', '̳', '̹', - '̺', '̻', '̼', 'ͅ', - '͇', '͈', '͉', '͍', - '͎', '͓', '͔', '͕', - '͖', '͙', '͚', '̣', - ], - 'mid': [ - '̕', '̛', '̀', '́', - '͘', '̡', '̢', '̧', - '̨', '̴', '̵', '̶', - '͜', '͝', '͞', - '͟', '͠', '͢', '̸', - '̷', '͡', ' ҉', - ], - }; - var all = [].concat(soul.up, soul.down, soul.mid); - - function randomNumber(range) { - var r = Math.floor(Math.random() * range); - return r; - } - - function isChar(character) { - var bool = false; - all.filter(function(i) { - bool = (i === character); - }); - return bool; - } - - - function heComes(text, options) { - var result = ''; - var counts; - var l; - options = options || {}; - options['up'] = - typeof options['up'] !== 'undefined' ? options['up'] : true; - options['mid'] = - typeof options['mid'] !== 'undefined' ? options['mid'] : true; - options['down'] = - typeof options['down'] !== 'undefined' ? options['down'] : true; - options['size'] = - typeof options['size'] !== 'undefined' ? options['size'] : 'maxi'; - text = text.split(''); - for (l in text) { - if (isChar(l)) { - continue; - } - result = result + text[l]; - counts = {'up': 0, 'down': 0, 'mid': 0}; - switch (options.size) { - case 'mini': - counts.up = randomNumber(8); - counts.mid = randomNumber(2); - counts.down = randomNumber(8); - break; - case 'maxi': - counts.up = randomNumber(16) + 3; - counts.mid = randomNumber(4) + 1; - counts.down = randomNumber(64) + 3; - break; - default: - counts.up = randomNumber(8) + 1; - counts.mid = randomNumber(6) / 2; - counts.down = randomNumber(8) + 1; - break; - } - - var arr = ['up', 'mid', 'down']; - for (var d in arr) { - var index = arr[d]; - for (var i = 0; i <= counts[index]; i++) { - if (options[index]) { - result = result + soul[index][randomNumber(soul[index].length)]; - } - } - } - } - return result; - } - // don't summon him - return heComes(text, options); -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/extendStringPrototype.js b/deps/npm/node_modules/@colors/colors/lib/extendStringPrototype.js deleted file mode 100644 index 46fd386a915a67..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/extendStringPrototype.js +++ /dev/null @@ -1,110 +0,0 @@ -var colors = require('./colors'); - -module['exports'] = function() { - // - // Extends prototype of native string object to allow for "foo".red syntax - // - var addProperty = function(color, func) { - String.prototype.__defineGetter__(color, func); - }; - - addProperty('strip', function() { - return colors.strip(this); - }); - - addProperty('stripColors', function() { - return colors.strip(this); - }); - - addProperty('trap', function() { - return colors.trap(this); - }); - - addProperty('zalgo', function() { - return colors.zalgo(this); - }); - - addProperty('zebra', function() { - return colors.zebra(this); - }); - - addProperty('rainbow', function() { - return colors.rainbow(this); - }); - - addProperty('random', function() { - return colors.random(this); - }); - - addProperty('america', function() { - return colors.america(this); - }); - - // - // Iterate through all default styles and colors - // - var x = Object.keys(colors.styles); - x.forEach(function(style) { - addProperty(style, function() { - return colors.stylize(this, style); - }); - }); - - function applyTheme(theme) { - // - // Remark: This is a list of methods that exist - // on String that you should not overwrite. - // - var stringPrototypeBlacklist = [ - '__defineGetter__', '__defineSetter__', '__lookupGetter__', - '__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty', - 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', - 'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length', - 'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice', - 'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase', - 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight', - ]; - - Object.keys(theme).forEach(function(prop) { - if (stringPrototypeBlacklist.indexOf(prop) !== -1) { - console.log('warn: '.red + ('String.prototype' + prop).magenta + - ' is probably something you don\'t want to override. ' + - 'Ignoring style name'); - } else { - if (typeof(theme[prop]) === 'string') { - colors[prop] = colors[theme[prop]]; - addProperty(prop, function() { - return colors[prop](this); - }); - } else { - var themePropApplicator = function(str) { - var ret = str || this; - for (var t = 0; t < theme[prop].length; t++) { - ret = colors[theme[prop][t]](ret); - } - return ret; - }; - addProperty(prop, themePropApplicator); - colors[prop] = function(str) { - return themePropApplicator(str); - }; - } - } - }); - } - - colors.setTheme = function(theme) { - if (typeof theme === 'string') { - console.log('colors.setTheme now only accepts an object, not a string. ' + - 'If you are trying to set a theme from a file, it is now your (the ' + - 'caller\'s) responsibility to require the file. The old syntax ' + - 'looked like colors.setTheme(__dirname + ' + - '\'/../themes/generic-logging.js\'); The new syntax looks like '+ - 'colors.setTheme(require(__dirname + ' + - '\'/../themes/generic-logging.js\'));'); - return; - } else { - applyTheme(theme); - } - }; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/index.js b/deps/npm/node_modules/@colors/colors/lib/index.js deleted file mode 100644 index 9df5ab7df30770..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/index.js +++ /dev/null @@ -1,13 +0,0 @@ -var colors = require('./colors'); -module['exports'] = colors; - -// Remark: By default, colors will add style properties to String.prototype. -// -// If you don't wish to extend String.prototype, you can do this instead and -// native String will not be touched: -// -// var colors = require('colors/safe); -// colors.red("foo") -// -// -require('./extendStringPrototype')(); diff --git a/deps/npm/node_modules/@colors/colors/lib/maps/america.js b/deps/npm/node_modules/@colors/colors/lib/maps/america.js deleted file mode 100644 index dc96903328989f..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/maps/america.js +++ /dev/null @@ -1,10 +0,0 @@ -module['exports'] = function(colors) { - return function(letter, i, exploded) { - if (letter === ' ') return letter; - switch (i%3) { - case 0: return colors.red(letter); - case 1: return colors.white(letter); - case 2: return colors.blue(letter); - } - }; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/maps/rainbow.js b/deps/npm/node_modules/@colors/colors/lib/maps/rainbow.js deleted file mode 100644 index 874508da8ed17e..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/maps/rainbow.js +++ /dev/null @@ -1,11 +0,0 @@ -module['exports'] = function(colors) { - // RoY G BiV - var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; - return function(letter, i, exploded) { - if (letter === ' ') { - return letter; - } else { - return colors[rainbowColors[i++ % rainbowColors.length]](letter); - } - }; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/maps/random.js b/deps/npm/node_modules/@colors/colors/lib/maps/random.js deleted file mode 100644 index 3d82a39ec0fab4..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/maps/random.js +++ /dev/null @@ -1,11 +0,0 @@ -module['exports'] = function(colors) { - var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', - 'blue', 'white', 'cyan', 'magenta', 'brightYellow', 'brightRed', - 'brightGreen', 'brightBlue', 'brightWhite', 'brightCyan', 'brightMagenta']; - return function(letter, i, exploded) { - return letter === ' ' ? letter : - colors[ - available[Math.round(Math.random() * (available.length - 2))] - ](letter); - }; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/maps/zebra.js b/deps/npm/node_modules/@colors/colors/lib/maps/zebra.js deleted file mode 100644 index fa73623544a82c..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/maps/zebra.js +++ /dev/null @@ -1,5 +0,0 @@ -module['exports'] = function(colors) { - return function(letter, i, exploded) { - return i % 2 === 0 ? letter : colors.inverse(letter); - }; -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/styles.js b/deps/npm/node_modules/@colors/colors/lib/styles.js deleted file mode 100644 index 011dafd8c28f70..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/styles.js +++ /dev/null @@ -1,95 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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. - -*/ - -var styles = {}; -module['exports'] = styles; - -var codes = { - reset: [0, 0], - - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29], - - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], - grey: [90, 39], - - brightRed: [91, 39], - brightGreen: [92, 39], - brightYellow: [93, 39], - brightBlue: [94, 39], - brightMagenta: [95, 39], - brightCyan: [96, 39], - brightWhite: [97, 39], - - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - bgGray: [100, 49], - bgGrey: [100, 49], - - bgBrightRed: [101, 49], - bgBrightGreen: [102, 49], - bgBrightYellow: [103, 49], - bgBrightBlue: [104, 49], - bgBrightMagenta: [105, 49], - bgBrightCyan: [106, 49], - bgBrightWhite: [107, 49], - - // legacy styles for colors pre v1.0.0 - blackBG: [40, 49], - redBG: [41, 49], - greenBG: [42, 49], - yellowBG: [43, 49], - blueBG: [44, 49], - magentaBG: [45, 49], - cyanBG: [46, 49], - whiteBG: [47, 49], - -}; - -Object.keys(codes).forEach(function(key) { - var val = codes[key]; - var style = styles[key] = []; - style.open = '\u001b[' + val[0] + 'm'; - style.close = '\u001b[' + val[1] + 'm'; -}); diff --git a/deps/npm/node_modules/@colors/colors/lib/system/has-flag.js b/deps/npm/node_modules/@colors/colors/lib/system/has-flag.js deleted file mode 100644 index a347dd4d7a697e..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/system/has-flag.js +++ /dev/null @@ -1,35 +0,0 @@ -/* -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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'; - -module.exports = function(flag, argv) { - argv = argv || process.argv; - - var terminatorPos = argv.indexOf('--'); - var prefix = /^-{1,2}/.test(flag) ? '' : '--'; - var pos = argv.indexOf(prefix + flag); - - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); -}; diff --git a/deps/npm/node_modules/@colors/colors/lib/system/supports-colors.js b/deps/npm/node_modules/@colors/colors/lib/system/supports-colors.js deleted file mode 100644 index f1f9c8ff3da284..00000000000000 --- a/deps/npm/node_modules/@colors/colors/lib/system/supports-colors.js +++ /dev/null @@ -1,151 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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'; - -var os = require('os'); -var hasFlag = require('./has-flag.js'); - -var env = process.env; - -var forceColor = void 0; -if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') - || hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 - || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level: level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3, - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || hasFlag('color=full') - || hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } - - var min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first - // Windows release that supports 256 colors. Windows 10 build 14931 is the - // first release that supports 16m/TrueColor. - var osRelease = os.release().split('.'); - if (Number(process.versions.node.split('.')[0]) >= 8 - && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) { - return sign in env; - }) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return (/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0 - ); - } - - if ('TERM_PROGRAM' in env) { - var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Hyper': - return 3; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - if (env.TERM === 'dumb') { - return min; - } - - return min; -} - -function getSupportLevel(stream) { - var level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr), -}; diff --git a/deps/npm/node_modules/@colors/colors/package.json b/deps/npm/node_modules/@colors/colors/package.json deleted file mode 100644 index cb87f20953886a..00000000000000 --- a/deps/npm/node_modules/@colors/colors/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "@colors/colors", - "description": "get colors in your node.js console", - "version": "1.5.0", - "author": "DABH", - "contributors": [ - { - "name": "DABH", - "url": "https://github.com/DABH" - } - ], - "homepage": "https://github.com/DABH/colors.js", - "bugs": "https://github.com/DABH/colors.js/issues", - "keywords": [ - "ansi", - "terminal", - "colors" - ], - "repository": { - "type": "git", - "url": "http://github.com/DABH/colors.js.git" - }, - "license": "MIT", - "scripts": { - "lint": "eslint . --fix", - "test": "export FORCE_COLOR=1 && node tests/basic-test.js && node tests/safe-test.js" - }, - "engines": { - "node": ">=0.1.90" - }, - "main": "lib/index.js", - "files": [ - "examples", - "lib", - "LICENSE", - "safe.js", - "themes", - "index.d.ts", - "safe.d.ts" - ], - "devDependencies": { - "eslint": "^5.2.0", - "eslint-config-google": "^0.11.0" - } -} diff --git a/deps/npm/node_modules/@colors/colors/safe.js b/deps/npm/node_modules/@colors/colors/safe.js deleted file mode 100644 index a013d542464854..00000000000000 --- a/deps/npm/node_modules/@colors/colors/safe.js +++ /dev/null @@ -1,10 +0,0 @@ -// -// Remark: Requiring this file will use the "safe" colors API, -// which will not touch String.prototype. -// -// var colors = require('colors/safe'); -// colors.red("foo") -// -// -var colors = require('./lib/colors'); -module['exports'] = colors; diff --git a/deps/npm/node_modules/@colors/colors/themes/generic-logging.js b/deps/npm/node_modules/@colors/colors/themes/generic-logging.js deleted file mode 100644 index 63adfe4ac31f9a..00000000000000 --- a/deps/npm/node_modules/@colors/colors/themes/generic-logging.js +++ /dev/null @@ -1,12 +0,0 @@ -module['exports'] = { - silly: 'rainbow', - input: 'grey', - verbose: 'cyan', - prompt: 'grey', - info: 'green', - data: 'grey', - help: 'cyan', - warn: 'yellow', - debug: 'blue', - error: 'red', -}; diff --git a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js index 130a0929b8ce8c..ddfdba39a783a4 100644 --- a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js +++ b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js @@ -1,7 +1,9 @@ export default function ansiRegex({onlyFirst = false} = {}) { + // Valid string terminator sequences are BEL, ESC\, and 0x9c + const ST = '(?:\\u0007|\\u001B\\u005C|\\u009C)'; const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + `[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?${ST})`, + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))', ].join('|'); return new RegExp(pattern, onlyFirst ? undefined : 'g'); diff --git a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json index 7bbb563bf2a70a..49f3f61021512b 100644 --- a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json +++ b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json @@ -1,6 +1,6 @@ { "name": "ansi-regex", - "version": "6.0.1", + "version": "6.1.0", "description": "Regular expression for matching ANSI escape codes", "license": "MIT", "repository": "chalk/ansi-regex", @@ -12,6 +12,8 @@ }, "type": "module", "exports": "./index.js", + "types": "./index.d.ts", + "sideEffects": false, "engines": { "node": ">=12" }, @@ -51,8 +53,9 @@ "pattern" ], "devDependencies": { + "ansi-escapes": "^5.0.0", "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" + "tsd": "^0.21.0", + "xo": "^0.54.2" } } diff --git a/deps/npm/node_modules/color-support/LICENSE b/deps/npm/node_modules/@isaacs/fs-minipass/LICENSE similarity index 100% rename from deps/npm/node_modules/color-support/LICENSE rename to deps/npm/node_modules/@isaacs/fs-minipass/LICENSE diff --git a/deps/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js b/deps/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js new file mode 100644 index 00000000000000..2b3178c5263b4c --- /dev/null +++ b/deps/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js @@ -0,0 +1,430 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WriteStreamSync = exports.WriteStream = exports.ReadStreamSync = exports.ReadStream = void 0; +const events_1 = __importDefault(require("events")); +const fs_1 = __importDefault(require("fs")); +const minipass_1 = require("minipass"); +const writev = fs_1.default.writev; +const _autoClose = Symbol('_autoClose'); +const _close = Symbol('_close'); +const _ended = Symbol('_ended'); +const _fd = Symbol('_fd'); +const _finished = Symbol('_finished'); +const _flags = Symbol('_flags'); +const _flush = Symbol('_flush'); +const _handleChunk = Symbol('_handleChunk'); +const _makeBuf = Symbol('_makeBuf'); +const _mode = Symbol('_mode'); +const _needDrain = Symbol('_needDrain'); +const _onerror = Symbol('_onerror'); +const _onopen = Symbol('_onopen'); +const _onread = Symbol('_onread'); +const _onwrite = Symbol('_onwrite'); +const _open = Symbol('_open'); +const _path = Symbol('_path'); +const _pos = Symbol('_pos'); +const _queue = Symbol('_queue'); +const _read = Symbol('_read'); +const _readSize = Symbol('_readSize'); +const _reading = Symbol('_reading'); +const _remain = Symbol('_remain'); +const _size = Symbol('_size'); +const _write = Symbol('_write'); +const _writing = Symbol('_writing'); +const _defaultFlag = Symbol('_defaultFlag'); +const _errored = Symbol('_errored'); +class ReadStream extends minipass_1.Minipass { + [_errored] = false; + [_fd]; + [_path]; + [_readSize]; + [_reading] = false; + [_size]; + [_remain]; + [_autoClose]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this.readable = true; + this.writable = false; + if (typeof path !== 'string') { + throw new TypeError('path must be a string'); + } + this[_errored] = false; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_path] = path; + this[_readSize] = opt.readSize || 16 * 1024 * 1024; + this[_reading] = false; + this[_size] = typeof opt.size === 'number' ? opt.size : Infinity; + this[_remain] = this[_size]; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + if (typeof this[_fd] === 'number') { + this[_read](); + } + else { + this[_open](); + } + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + //@ts-ignore + write() { + throw new TypeError('this is a readable stream'); + } + //@ts-ignore + end() { + throw new TypeError('this is a readable stream'); + } + [_open]() { + fs_1.default.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + this[_read](); + } + } + [_makeBuf]() { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])); + } + [_read]() { + if (!this[_reading]) { + this[_reading] = true; + const buf = this[_makeBuf](); + /* c8 ignore start */ + if (buf.length === 0) { + return process.nextTick(() => this[_onread](null, 0, buf)); + } + /* c8 ignore stop */ + fs_1.default.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b)); + } + } + [_onread](er, br, buf) { + this[_reading] = false; + if (er) { + this[_onerror](er); + } + else if (this[_handleChunk](br, buf)) { + this[_read](); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } + [_onerror](er) { + this[_reading] = true; + this[_close](); + this.emit('error', er); + } + [_handleChunk](br, buf) { + let ret = false; + // no effect if infinite + this[_remain] -= br; + if (br > 0) { + ret = super.write(br < buf.length ? buf.subarray(0, br) : buf); + } + if (br === 0 || this[_remain] <= 0) { + ret = false; + this[_close](); + super.end(); + } + return ret; + } + emit(ev, ...args) { + switch (ev) { + case 'prefinish': + case 'finish': + return false; + case 'drain': + if (typeof this[_fd] === 'number') { + this[_read](); + } + return false; + case 'error': + if (this[_errored]) { + return false; + } + this[_errored] = true; + return super.emit(ev, ...args); + default: + return super.emit(ev, ...args); + } + } +} +exports.ReadStream = ReadStream; +class ReadStreamSync extends ReadStream { + [_open]() { + let threw = true; + try { + this[_onopen](null, fs_1.default.openSync(this[_path], 'r')); + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_read]() { + let threw = true; + try { + if (!this[_reading]) { + this[_reading] = true; + do { + const buf = this[_makeBuf](); + /* c8 ignore start */ + const br = buf.length === 0 + ? 0 + : fs_1.default.readSync(this[_fd], buf, 0, buf.length, null); + /* c8 ignore stop */ + if (!this[_handleChunk](br, buf)) { + break; + } + } while (true); + this[_reading] = false; + } + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.closeSync(fd); + this.emit('close'); + } + } +} +exports.ReadStreamSync = ReadStreamSync; +class WriteStream extends events_1.default { + readable = false; + writable = true; + [_errored] = false; + [_writing] = false; + [_ended] = false; + [_queue] = []; + [_needDrain] = false; + [_path]; + [_mode]; + [_autoClose]; + [_fd]; + [_defaultFlag]; + [_flags]; + [_finished] = false; + [_pos]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this[_path] = path; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_mode] = opt.mode === undefined ? 0o666 : opt.mode; + this[_pos] = typeof opt.start === 'number' ? opt.start : undefined; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + // truncating makes no sense when writing into the middle + const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'; + this[_defaultFlag] = opt.flags === undefined; + this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags; + if (this[_fd] === undefined) { + this[_open](); + } + } + emit(ev, ...args) { + if (ev === 'error') { + if (this[_errored]) { + return false; + } + this[_errored] = true; + } + return super.emit(ev, ...args); + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + [_onerror](er) { + this[_close](); + this[_writing] = true; + this.emit('error', er); + } + [_open]() { + fs_1.default.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && + er.code === 'ENOENT') { + this[_flags] = 'w'; + this[_open](); + } + else if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + if (!this[_writing]) { + this[_flush](); + } + } + } + end(buf, enc) { + if (buf) { + //@ts-ignore + this.write(buf, enc); + } + this[_ended] = true; + // synthetic after-write logic, where drain/finish live + if (!this[_writing] && + !this[_queue].length && + typeof this[_fd] === 'number') { + this[_onwrite](null, 0); + } + return this; + } + write(buf, enc) { + if (typeof buf === 'string') { + buf = Buffer.from(buf, enc); + } + if (this[_ended]) { + this.emit('error', new Error('write() after end()')); + return false; + } + if (this[_fd] === undefined || this[_writing] || this[_queue].length) { + this[_queue].push(buf); + this[_needDrain] = true; + return false; + } + this[_writing] = true; + this[_write](buf); + return true; + } + [_write](buf) { + fs_1.default.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + [_onwrite](er, bw) { + if (er) { + this[_onerror](er); + } + else { + if (this[_pos] !== undefined && typeof bw === 'number') { + this[_pos] += bw; + } + if (this[_queue].length) { + this[_flush](); + } + else { + this[_writing] = false; + if (this[_ended] && !this[_finished]) { + this[_finished] = true; + this[_close](); + this.emit('finish'); + } + else if (this[_needDrain]) { + this[_needDrain] = false; + this.emit('drain'); + } + } + } + } + [_flush]() { + if (this[_queue].length === 0) { + if (this[_ended]) { + this[_onwrite](null, 0); + } + } + else if (this[_queue].length === 1) { + this[_write](this[_queue].pop()); + } + else { + const iovec = this[_queue]; + this[_queue] = []; + writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } +} +exports.WriteStream = WriteStream; +class WriteStreamSync extends WriteStream { + [_open]() { + let fd; + // only wrap in a try{} block if we know we'll retry, to avoid + // the rethrow obscuring the error's source frame in most cases. + if (this[_defaultFlag] && this[_flags] === 'r+') { + try { + fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]); + } + catch (er) { + if (er?.code === 'ENOENT') { + this[_flags] = 'w'; + return this[_open](); + } + else { + throw er; + } + } + } + else { + fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]); + } + this[_onopen](null, fd); + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.closeSync(fd); + this.emit('close'); + } + } + [_write](buf) { + // throw the original, but try to close if it fails + let threw = true; + try { + this[_onwrite](null, fs_1.default.writeSync(this[_fd], buf, 0, buf.length, this[_pos])); + threw = false; + } + finally { + if (threw) { + try { + this[_close](); + } + catch { + // ok error + } + } + } + } +} +exports.WriteStreamSync = WriteStreamSync; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/foreground-child/dist/cjs/package.json b/deps/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json similarity index 100% rename from deps/npm/node_modules/foreground-child/dist/cjs/package.json rename to deps/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json diff --git a/deps/npm/node_modules/@isaacs/fs-minipass/dist/esm/index.js b/deps/npm/node_modules/@isaacs/fs-minipass/dist/esm/index.js new file mode 100644 index 00000000000000..287a0f614dcc65 --- /dev/null +++ b/deps/npm/node_modules/@isaacs/fs-minipass/dist/esm/index.js @@ -0,0 +1,420 @@ +import EE from 'events'; +import fs from 'fs'; +import { Minipass } from 'minipass'; +const writev = fs.writev; +const _autoClose = Symbol('_autoClose'); +const _close = Symbol('_close'); +const _ended = Symbol('_ended'); +const _fd = Symbol('_fd'); +const _finished = Symbol('_finished'); +const _flags = Symbol('_flags'); +const _flush = Symbol('_flush'); +const _handleChunk = Symbol('_handleChunk'); +const _makeBuf = Symbol('_makeBuf'); +const _mode = Symbol('_mode'); +const _needDrain = Symbol('_needDrain'); +const _onerror = Symbol('_onerror'); +const _onopen = Symbol('_onopen'); +const _onread = Symbol('_onread'); +const _onwrite = Symbol('_onwrite'); +const _open = Symbol('_open'); +const _path = Symbol('_path'); +const _pos = Symbol('_pos'); +const _queue = Symbol('_queue'); +const _read = Symbol('_read'); +const _readSize = Symbol('_readSize'); +const _reading = Symbol('_reading'); +const _remain = Symbol('_remain'); +const _size = Symbol('_size'); +const _write = Symbol('_write'); +const _writing = Symbol('_writing'); +const _defaultFlag = Symbol('_defaultFlag'); +const _errored = Symbol('_errored'); +export class ReadStream extends Minipass { + [_errored] = false; + [_fd]; + [_path]; + [_readSize]; + [_reading] = false; + [_size]; + [_remain]; + [_autoClose]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this.readable = true; + this.writable = false; + if (typeof path !== 'string') { + throw new TypeError('path must be a string'); + } + this[_errored] = false; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_path] = path; + this[_readSize] = opt.readSize || 16 * 1024 * 1024; + this[_reading] = false; + this[_size] = typeof opt.size === 'number' ? opt.size : Infinity; + this[_remain] = this[_size]; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + if (typeof this[_fd] === 'number') { + this[_read](); + } + else { + this[_open](); + } + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + //@ts-ignore + write() { + throw new TypeError('this is a readable stream'); + } + //@ts-ignore + end() { + throw new TypeError('this is a readable stream'); + } + [_open]() { + fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + this[_read](); + } + } + [_makeBuf]() { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])); + } + [_read]() { + if (!this[_reading]) { + this[_reading] = true; + const buf = this[_makeBuf](); + /* c8 ignore start */ + if (buf.length === 0) { + return process.nextTick(() => this[_onread](null, 0, buf)); + } + /* c8 ignore stop */ + fs.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b)); + } + } + [_onread](er, br, buf) { + this[_reading] = false; + if (er) { + this[_onerror](er); + } + else if (this[_handleChunk](br, buf)) { + this[_read](); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } + [_onerror](er) { + this[_reading] = true; + this[_close](); + this.emit('error', er); + } + [_handleChunk](br, buf) { + let ret = false; + // no effect if infinite + this[_remain] -= br; + if (br > 0) { + ret = super.write(br < buf.length ? buf.subarray(0, br) : buf); + } + if (br === 0 || this[_remain] <= 0) { + ret = false; + this[_close](); + super.end(); + } + return ret; + } + emit(ev, ...args) { + switch (ev) { + case 'prefinish': + case 'finish': + return false; + case 'drain': + if (typeof this[_fd] === 'number') { + this[_read](); + } + return false; + case 'error': + if (this[_errored]) { + return false; + } + this[_errored] = true; + return super.emit(ev, ...args); + default: + return super.emit(ev, ...args); + } + } +} +export class ReadStreamSync extends ReadStream { + [_open]() { + let threw = true; + try { + this[_onopen](null, fs.openSync(this[_path], 'r')); + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_read]() { + let threw = true; + try { + if (!this[_reading]) { + this[_reading] = true; + do { + const buf = this[_makeBuf](); + /* c8 ignore start */ + const br = buf.length === 0 + ? 0 + : fs.readSync(this[_fd], buf, 0, buf.length, null); + /* c8 ignore stop */ + if (!this[_handleChunk](br, buf)) { + break; + } + } while (true); + this[_reading] = false; + } + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs.closeSync(fd); + this.emit('close'); + } + } +} +export class WriteStream extends EE { + readable = false; + writable = true; + [_errored] = false; + [_writing] = false; + [_ended] = false; + [_queue] = []; + [_needDrain] = false; + [_path]; + [_mode]; + [_autoClose]; + [_fd]; + [_defaultFlag]; + [_flags]; + [_finished] = false; + [_pos]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this[_path] = path; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_mode] = opt.mode === undefined ? 0o666 : opt.mode; + this[_pos] = typeof opt.start === 'number' ? opt.start : undefined; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + // truncating makes no sense when writing into the middle + const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'; + this[_defaultFlag] = opt.flags === undefined; + this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags; + if (this[_fd] === undefined) { + this[_open](); + } + } + emit(ev, ...args) { + if (ev === 'error') { + if (this[_errored]) { + return false; + } + this[_errored] = true; + } + return super.emit(ev, ...args); + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + [_onerror](er) { + this[_close](); + this[_writing] = true; + this.emit('error', er); + } + [_open]() { + fs.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && + er.code === 'ENOENT') { + this[_flags] = 'w'; + this[_open](); + } + else if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + if (!this[_writing]) { + this[_flush](); + } + } + } + end(buf, enc) { + if (buf) { + //@ts-ignore + this.write(buf, enc); + } + this[_ended] = true; + // synthetic after-write logic, where drain/finish live + if (!this[_writing] && + !this[_queue].length && + typeof this[_fd] === 'number') { + this[_onwrite](null, 0); + } + return this; + } + write(buf, enc) { + if (typeof buf === 'string') { + buf = Buffer.from(buf, enc); + } + if (this[_ended]) { + this.emit('error', new Error('write() after end()')); + return false; + } + if (this[_fd] === undefined || this[_writing] || this[_queue].length) { + this[_queue].push(buf); + this[_needDrain] = true; + return false; + } + this[_writing] = true; + this[_write](buf); + return true; + } + [_write](buf) { + fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + [_onwrite](er, bw) { + if (er) { + this[_onerror](er); + } + else { + if (this[_pos] !== undefined && typeof bw === 'number') { + this[_pos] += bw; + } + if (this[_queue].length) { + this[_flush](); + } + else { + this[_writing] = false; + if (this[_ended] && !this[_finished]) { + this[_finished] = true; + this[_close](); + this.emit('finish'); + } + else if (this[_needDrain]) { + this[_needDrain] = false; + this.emit('drain'); + } + } + } + } + [_flush]() { + if (this[_queue].length === 0) { + if (this[_ended]) { + this[_onwrite](null, 0); + } + } + else if (this[_queue].length === 1) { + this[_write](this[_queue].pop()); + } + else { + const iovec = this[_queue]; + this[_queue] = []; + writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } +} +export class WriteStreamSync extends WriteStream { + [_open]() { + let fd; + // only wrap in a try{} block if we know we'll retry, to avoid + // the rethrow obscuring the error's source frame in most cases. + if (this[_defaultFlag] && this[_flags] === 'r+') { + try { + fd = fs.openSync(this[_path], this[_flags], this[_mode]); + } + catch (er) { + if (er?.code === 'ENOENT') { + this[_flags] = 'w'; + return this[_open](); + } + else { + throw er; + } + } + } + else { + fd = fs.openSync(this[_path], this[_flags], this[_mode]); + } + this[_onopen](null, fd); + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs.closeSync(fd); + this.emit('close'); + } + } + [_write](buf) { + // throw the original, but try to close if it fails + let threw = true; + try { + this[_onwrite](null, fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos])); + threw = false; + } + finally { + if (threw) { + try { + this[_close](); + } + catch { + // ok error + } + } + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/foreground-child/dist/mjs/package.json b/deps/npm/node_modules/@isaacs/fs-minipass/dist/esm/package.json similarity index 100% rename from deps/npm/node_modules/foreground-child/dist/mjs/package.json rename to deps/npm/node_modules/@isaacs/fs-minipass/dist/esm/package.json diff --git a/deps/npm/node_modules/@isaacs/fs-minipass/package.json b/deps/npm/node_modules/@isaacs/fs-minipass/package.json new file mode 100644 index 00000000000000..cc4576c4afe776 --- /dev/null +++ b/deps/npm/node_modules/@isaacs/fs-minipass/package.json @@ -0,0 +1,72 @@ +{ + "name": "@isaacs/fs-minipass", + "version": "4.0.1", + "main": "./dist/commonjs/index.js", + "scripts": { + "prepare": "tshy", + "pretest": "npm run prepare", + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --loglevel warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "keywords": [], + "author": "Isaac Z. Schlueter", + "license": "ISC", + "repository": { + "type": "git", + "url": "https://github.com/npm/fs-minipass.git" + }, + "description": "fs read and write streams based on minipass", + "dependencies": { + "minipass": "^7.0.4" + }, + "devDependencies": { + "@types/node": "^20.11.30", + "mutate-fs": "^2.1.1", + "prettier": "^3.2.5", + "tap": "^18.7.1", + "tshy": "^1.12.0", + "typedoc": "^0.25.12" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">=18.0.0" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.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" + } + } + }, + "types": "./dist/commonjs/index.d.ts", + "type": "module", + "prettier": { + "semi": false, + "printWidth": 75, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + } +} diff --git a/deps/npm/node_modules/@npmcli/agent/lib/agents.js b/deps/npm/node_modules/@npmcli/agent/lib/agents.js index ffd299f3d2ba69..c541b93001517e 100644 --- a/deps/npm/node_modules/@npmcli/agent/lib/agents.js +++ b/deps/npm/node_modules/@npmcli/agent/lib/agents.js @@ -65,7 +65,10 @@ module.exports = class Agent extends AgentBase { ProxyAgent = this.isSecureEndpoint(options) ? ProxyAgent[1] : ProxyAgent[0] } - const proxyAgent = new ProxyAgent(proxy, this.#options) + const proxyAgent = new ProxyAgent(proxy, { + ...this.#options, + socketOptions: { family: this.#options.family }, + }) proxyCache.set(cacheKey, proxyAgent) return proxyAgent diff --git a/deps/npm/node_modules/@npmcli/agent/package.json b/deps/npm/node_modules/@npmcli/agent/package.json index ce240b283a42c9..4d648fb5dfe052 100644 --- a/deps/npm/node_modules/@npmcli/agent/package.json +++ b/deps/npm/node_modules/@npmcli/agent/package.json @@ -1,17 +1,18 @@ { "name": "@npmcli/agent", - "version": "2.2.1", + "version": "3.0.0", "description": "the http/https agent used by the npm cli", "main": "lib/index.js", "scripts": { "gencerts": "bash scripts/create-cert.sh", "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "snap": "tap", - "posttest": "npm run lint" + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "author": "GitHub Inc.", "license": "ISC", @@ -24,11 +25,11 @@ "lib/" ], "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.23.1", "publish": "true" }, "dependencies": { @@ -36,20 +37,19 @@ "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.1", "minipass-fetch": "^3.0.3", "nock": "^13.2.7", - "semver": "^7.5.4", - "simple-socks": "^3.1.0", + "socksv5": "^0.0.6", "tap": "^16.3.0" }, "repository": { "type": "git", - "url": "https://github.com/npm/agent.git" + "url": "git+https://github.com/npm/agent.git" }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/arborist/bin/index.js b/deps/npm/node_modules/@npmcli/arborist/bin/index.js index ff356fafab7c34..7c5d45f1f1fc94 100755 --- a/deps/npm/node_modules/@npmcli/arborist/bin/index.js +++ b/deps/npm/node_modules/@npmcli/arborist/bin/index.js @@ -1,7 +1,8 @@ #!/usr/bin/env node -const fs = require('fs') -const path = require('path') +const fs = require('node:fs') +const path = require('node:path') +const { time } = require('proc-log') const { bin, arb: options } = require('./lib/options') const version = require('../package.json').version @@ -72,11 +73,11 @@ for (const file of commandFiles) { log.info(name, options) - process.emit('time', totalTime) - process.emit('time', scriptTime) + const timeEnd = time.start(totalTime) + const scriptEnd = time.start(scriptTime) return command(options, (result) => { - process.emit('timeEnd', scriptTime) + scriptEnd() return { result, timing: { @@ -95,7 +96,7 @@ for (const file of commandFiles) { return err }) .then((r) => { - process.emit('timeEnd', totalTime) + timeEnd() if (bin.loglevel !== 'silent') { console[process.exitCode ? 'error' : 'log'](r) } diff --git a/deps/npm/node_modules/@npmcli/arborist/bin/lib/logging.js b/deps/npm/node_modules/@npmcli/arborist/bin/lib/logging.js index ffb5544b21463e..431eea3ec404aa 100644 --- a/deps/npm/node_modules/@npmcli/arborist/bin/lib/logging.js +++ b/deps/npm/node_modules/@npmcli/arborist/bin/lib/logging.js @@ -1,8 +1,8 @@ -const log = require('proc-log') -const fs = require('fs') -const { dirname } = require('path') -const os = require('os') -const { inspect, format } = require('util') +const { log } = require('proc-log') +const fs = require('node:fs') +const { dirname } = require('node:path') +const os = require('node:os') +const { inspect, format } = require('node:util') const { bin: options } = require('./options.js') diff --git a/deps/npm/node_modules/@npmcli/arborist/bin/lib/options.js b/deps/npm/node_modules/@npmcli/arborist/bin/lib/options.js index 8dbaf13dac03a8..419c81850071be 100644 --- a/deps/npm/node_modules/@npmcli/arborist/bin/lib/options.js +++ b/deps/npm/node_modules/@npmcli/arborist/bin/lib/options.js @@ -1,5 +1,5 @@ const nopt = require('nopt') -const path = require('path') +const path = require('node:path') const has = (o, k) => Object.prototype.hasOwnProperty.call(o, k) diff --git a/deps/npm/node_modules/@npmcli/arborist/bin/lib/print-tree.js b/deps/npm/node_modules/@npmcli/arborist/bin/lib/print-tree.js index 55398190b99cb4..a110e6bcb8f030 100644 --- a/deps/npm/node_modules/@npmcli/arborist/bin/lib/print-tree.js +++ b/deps/npm/node_modules/@npmcli/arborist/bin/lib/print-tree.js @@ -1,4 +1,4 @@ -const { inspect } = require('util') +const { inspect } = require('node:util') const log = require('./logging.js') module.exports = tree => log.info(inspect(tree.toJSON(), { depth: Infinity })) diff --git a/deps/npm/node_modules/@npmcli/arborist/bin/lib/timers.js b/deps/npm/node_modules/@npmcli/arborist/bin/lib/timers.js index 586dee7806dd0e..a7ec534f5c5a79 100644 --- a/deps/npm/node_modules/@npmcli/arborist/bin/lib/timers.js +++ b/deps/npm/node_modules/@npmcli/arborist/bin/lib/timers.js @@ -4,22 +4,22 @@ const log = require('./logging.js') const timers = new Map() const finished = new Map() -process.on('time', name => { - if (timers.has(name)) { - throw new Error('conflicting timer! ' + name) - } - timers.set(name, process.hrtime.bigint()) -}) - -process.on('timeEnd', name => { - if (!timers.has(name)) { - throw new Error('timer not started! ' + name) - } - const elapsed = Number(process.hrtime.bigint() - timers.get(name)) - timers.delete(name) - finished.set(name, elapsed) - if (options.timing) { - log.info('timeEnd', `${name} ${elapsed / 1e9}s`, log.meta({ force: options.timing === 'always' })) +process.on('time', (level, name) => { + if (level === 'start') { + if (timers.has(name)) { + throw new Error('conflicting timer! ' + name) + } + timers.set(name, process.hrtime.bigint()) + } else if (level === 'end') { + if (!timers.has(name)) { + throw new Error('timer not started! ' + name) + } + const elapsed = Number(process.hrtime.bigint() - timers.get(name)) + timers.delete(name) + finished.set(name, elapsed) + if (options.timing) { + log.info('timeEnd', `${name} ${elapsed / 1e9}s`, log.meta({ force: options.timing === 'always' })) + } } }) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/add-rm-pkg-deps.js b/deps/npm/node_modules/@npmcli/arborist/lib/add-rm-pkg-deps.js index c5cdc097a9fab7..2e30eb1de76264 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/add-rm-pkg-deps.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/add-rm-pkg-deps.js @@ -1,6 +1,6 @@ // add and remove dependency specs to/from pkg manifest -const log = require('proc-log') +const { log } = require('proc-log') const localeCompare = require('@isaacs/string-locale-compare')('en') const add = ({ pkg, add, saveBundle, saveType }) => { 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 8ceb6b72123f68..54f86dea0f65c0 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 @@ -6,13 +6,13 @@ const pacote = require('pacote') const cacache = require('cacache') const { callLimit: promiseCallLimit } = require('promise-call-limit') const realpath = require('../../lib/realpath.js') -const { resolve, dirname } = require('path') +const { resolve, dirname } = require('node:path') const treeCheck = require('../tree-check.js') const { readdirScoped } = require('@npmcli/fs') -const { lstat, readlink } = require('fs/promises') +const { lstat, readlink } = require('node:fs/promises') const { depth } = require('treeverse') -const log = require('proc-log') -const { cleanUrl } = require('npm-registry-fetch') +const { log, time } = require('proc-log') +const { redact } = require('@npmcli/redact') const { OK, @@ -53,48 +53,26 @@ const _addNodeToTrashList = Symbol.for('addNodeToTrashList') // they'll affect things deeper in, then alphabetical for consistency between // installs class DepsQueue { - // [{ sorted, items }] indexed by depth #deps = [] #sorted = true - #minDepth = 0 - #length = 0 get length () { - return this.#length + return this.#deps.length } push (item) { - if (!this.#deps[item.depth]) { - this.#length++ - this.#deps[item.depth] = { sorted: true, items: [item] } - // no minDepth check needed, this branch is only reached when we are in - // the middle of a shallower depth and creating a new one - return - } - if (!this.#deps[item.depth].items.includes(item)) { - this.#length++ - this.#deps[item.depth].sorted = false - this.#deps[item.depth].items.push(item) - if (item.depth < this.#minDepth) { - this.#minDepth = item.depth - } + if (!this.#deps.includes(item)) { + this.#sorted = false + this.#deps.push(item) } } pop () { - let depth - while (!depth?.items.length) { - depth = this.#deps[this.#minDepth] - if (!depth?.items.length) { - this.#minDepth++ - } - } - if (!depth.sorted) { - depth.items.sort((a, b) => localeCompare(a.path, b.path)) - depth.sorted = true + if (!this.#sorted) { + this.#deps.sort((a, b) => (a.depth - b.depth) || localeCompare(a.path, b.path)) + this.#sorted = true } - this.#length-- - return depth.items.shift() + return this.#deps.shift() } } @@ -179,7 +157,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { options.rm = null } - process.emit('time', 'idealTree') + const timeEnd = time.start('idealTree') if (!options.add && !options.rm && !options.update && this.options.global) { throw new Error('global requires add, rm, or update option') @@ -205,7 +183,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { await this.#pruneFailedOptional() await this.#checkEngineAndPlatform() } finally { - process.emit('timeEnd', 'idealTree') + timeEnd() this.finishTracker('idealTree') } @@ -217,7 +195,10 @@ module.exports = cls => class IdealTreeBuilder extends cls { for (const node of this.idealTree.inventory.values()) { if (!node.optional) { try { - checkEngine(node.package, npmVersion, nodeVersion, this.options.force) + // if devEngines is present in the root node we ignore the engines check + if (!(node.isRoot && node.package.devEngines)) { + checkEngine(node.package, npmVersion, nodeVersion, this.options.force) + } } catch (err) { if (engineStrict) { throw err @@ -278,7 +259,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { // load the initial tree, either the virtualTree from a shrinkwrap, // or just the root node from a package.json async #initTree () { - process.emit('time', 'idealTree:init') + const timeEnd = time.start('idealTree:init') let root if (this.options.global) { root = await this.#globalRootNode() @@ -356,7 +337,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { // if you want another one, load another copy. this.idealTree = tree this.virtualTree = null - process.emit('timeEnd', 'idealTree:init') + timeEnd() return tree }) } @@ -420,7 +401,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { // process the add/rm requests by modifying the root node, and the // update.names request by queueing nodes dependent on those named. async #applyUserRequests (options) { - process.emit('time', 'idealTree:userRequests') + const timeEnd = time.start('idealTree:userRequests') const tree = this.idealTree.target if (!this.options.workspaces.length) { @@ -436,7 +417,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { await Promise.all(appliedRequests) } - process.emit('timeEnd', 'idealTree:userRequests') + timeEnd() } async #applyUserRequestsToNode (tree, options) { @@ -463,10 +444,10 @@ module.exports = cls => class IdealTreeBuilder extends cls { } const dir = resolve(nm, name) const st = await lstat(dir) - .catch(/* istanbul ignore next */ er => null) + .catch(/* istanbul ignore next */ () => null) if (st && st.isSymbolicLink()) { const target = await readlink(dir) - const real = resolve(dirname(dir), target).replace(/#/g, '%23') + const real = resolve(dirname(dir), target) tree.package.dependencies[name] = `file:${real}` } else { tree.package.dependencies[name] = '*' @@ -541,12 +522,12 @@ module.exports = cls => class IdealTreeBuilder extends cls { const { name } = spec if (spec.type === 'file') { - spec = npa(`file:${relpath(path, spec.fetchSpec).replace(/#/g, '%23')}`, path) + spec = npa(`file:${relpath(path, spec.fetchSpec)}`, path) spec.name = name } else if (spec.type === 'directory') { try { const real = await realpath(spec.fetchSpec, this[_rpcache], this[_stcache]) - spec = npa(`file:${relpath(path, real).replace(/#/g, '%23')}`, path) + spec = npa(`file:${relpath(path, real)}`, path) spec.name = name } catch { // TODO: create synthetic test case to simulate realpath failure @@ -691,7 +672,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { // if the lockfile is from node v5 or earlier, then we'll have to reload // all the manifests of everything we encounter. this is costly, but at // least it's just a one-time hit. - process.emit('time', 'idealTree:inflate') + const timeEnd = time.start('idealTree:inflate') // don't warn if we're not gonna actually write it back anyway. const heading = ancient ? 'ancient lockfile' : 'old lockfile' @@ -758,14 +739,14 @@ This is a one-time fix-up, please be patient... meta.originalLockfileVersion = defaultLockfileVersion } this.finishTracker('idealTree:inflate') - process.emit('timeEnd', 'idealTree:inflate') + timeEnd() } // at this point we have a virtual tree with the actual root node's // package deps, which may be partly or entirely incomplete, invalid // or extraneous. #buildDeps () { - process.emit('time', 'idealTree:buildDeps') + const timeEnd = time.start('idealTree:buildDeps') const tree = this.idealTree.target tree.assertRootOverrides() this.#depsQueue.push(tree) @@ -773,15 +754,14 @@ This is a one-time fix-up, please be patient... // in the override list log.silly('idealTree', 'buildDeps') this.addTracker('idealTree', tree.name, '') - return this.#buildDepStep() - .then(() => process.emit('timeEnd', 'idealTree:buildDeps')) + return this.#buildDepStep().then(timeEnd) } async #buildDepStep () { // removes tracker of previous dependency in the queue if (this.#currentDep) { const { location, name } = this.#currentDep - process.emit('timeEnd', `idealTree:${location || '#root'}`) + time.end(`idealTree:${location || '#root'}`) this.finishTracker('idealTree', name, location) this.#currentDep = null } @@ -807,7 +787,7 @@ This is a one-time fix-up, please be patient... this.#depsSeen.add(node) this.#currentDep = node - process.emit('time', `idealTree:${node.location || '#root'}`) + time.start(`idealTree:${node.location || '#root'}`) // if we're loading a _complete_ ideal tree, for a --package-lock-only // installation for example, we have to crack open the tarball and @@ -1023,9 +1003,13 @@ This is a one-time fix-up, please be patient... // may well be an optional dep that has gone missing. it'll // fail later anyway. for (const e of this.#problemEdges(placed)) { + // XXX This is somehow load bearing. This makes tests that print + // the ideal tree of a tree with tarball dependencies fail. This + // can't be changed or removed till we figure out why + // The test is named "tarball deps with transitive tarball deps" promises.push(() => this.#fetchManifest(npa.resolve(e.name, e.spec, fromPath(placed, e))) - .catch(er => null) + .catch(() => null) ) } }, @@ -1205,6 +1189,7 @@ This is a one-time fix-up, please be patient... const options = { ...this.options, avoid: this.#avoidRange(spec.name), + fullMetadata: true, } // get the intended spec and stored metadata from yarn.lock file, // if available and valid. @@ -1213,19 +1198,10 @@ This is a one-time fix-up, please be patient... if (this.#manifests.has(spec.raw)) { return this.#manifests.get(spec.raw) } else { - const cleanRawSpec = cleanUrl(spec.rawSpec) - log.silly('fetch manifest', spec.raw.replace(spec.rawSpec, cleanRawSpec)) - const o = { - ...options, - fullMetadata: true, - } - const p = pacote.manifest(spec, o) - .then(({ license, ...mani }) => { - this.#manifests.set(spec.raw, mani) - return mani - }) - this.#manifests.set(spec.raw, p) - return p + log.silly('fetch manifest', spec.raw.replace(spec.rawSpec, redact(spec.rawSpec))) + const mani = await pacote.manifest(spec, options) + this.#manifests.set(spec.raw, mani) + return mani } } @@ -1274,7 +1250,7 @@ This is a one-time fix-up, please be patient... }) } - #linkFromSpec (name, spec, parent, edge) { + #linkFromSpec (name, spec, parent) { const realpath = spec.fetchSpec const { installLinks, legacyPeerDeps } = this return rpj(realpath + '/package.json').catch(() => ({})).then(pkg => { @@ -1449,7 +1425,7 @@ This is a one-time fix-up, please be patient... } #fixDepFlags () { - process.emit('time', 'idealTree:fixDepFlags') + const timeEnd = time.start('idealTree:fixDepFlags') const metaFromDisk = this.idealTree.meta.loadedFromDisk const flagsSuspect = this[_flagsSuspect] const mutateTree = this.#mutateTree @@ -1496,7 +1472,7 @@ This is a one-time fix-up, please be patient... } } - process.emit('timeEnd', 'idealTree:fixDepFlags') + timeEnd() } #idealTreePrune () { 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 358f3e1b1a7598..3622f957b7acde 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/index.js @@ -26,15 +26,15 @@ // the base class, so that the overall voltron class is easier to test and // cover, and separation of concerns can be maintained. -const { resolve } = require('path') -const { homedir } = require('os') +const { resolve } = require('node:path') +const { homedir } = require('node:os') const { depth } = require('treeverse') const mapWorkspaces = require('@npmcli/map-workspaces') -const log = require('proc-log') - +const { log, time } = require('proc-log') const { saveTypeMap } = require('../add-rm-pkg-deps.js') const AuditReport = require('../audit-report.js') const relpath = require('../relpath.js') +const PackumentCache = require('../packument-cache.js') const mixins = [ require('../tracker.js'), @@ -47,7 +47,7 @@ const mixins = [ ] const _setWorkspaces = Symbol.for('setWorkspaces') -const Base = mixins.reduce((a, b) => b(a), require('events')) +const Base = mixins.reduce((a, b) => b(a), require('node:events')) // if it's 1, 2, or 3, set it explicitly that. // if undefined or null, set it null @@ -66,7 +66,7 @@ const lockfileVersion = lfv => { class Arborist extends Base { constructor (options = {}) { - process.emit('time', 'arborist:ctor') + const timeEnd = time.start('arborist:ctor') super(options) this.options = { nodeVersion: process.version, @@ -74,20 +74,26 @@ class Arborist extends Base { Arborist: this.constructor, binLinks: 'binLinks' in options ? !!options.binLinks : true, cache: options.cache || `${homedir()}/.npm/_cacache`, + dryRun: !!options.dryRun, + formatPackageLock: 'formatPackageLock' in options ? !!options.formatPackageLock : true, force: !!options.force, global: !!options.global, ignoreScripts: !!options.ignoreScripts, installStrategy: options.global ? 'shallow' : (options.installStrategy ? options.installStrategy : 'hoisted'), lockfileVersion: lockfileVersion(options.lockfileVersion), - packumentCache: options.packumentCache || new Map(), + packageLockOnly: !!options.packageLockOnly, + packumentCache: options.packumentCache || new PackumentCache(), path: options.path || '.', rebuildBundle: 'rebuildBundle' in options ? !!options.rebuildBundle : true, replaceRegistryHost: options.replaceRegistryHost, + savePrefix: 'savePrefix' in options ? options.savePrefix : '^', scriptShell: options.scriptShell, workspaces: options.workspaces || [], workspacesEnabled: options.workspacesEnabled !== false, } - // TODO is this even used? If not is that a bug? + // TODO we only ever look at this.options.replaceRegistryHost, not + // this.replaceRegistryHost. Defaulting needs to be written back to + // this.options to work properly this.replaceRegistryHost = this.options.replaceRegistryHost = (!this.options.replaceRegistryHost || this.options.replaceRegistryHost === 'npmjs') ? 'registry.npmjs.org' : this.options.replaceRegistryHost @@ -96,8 +102,9 @@ class Arborist extends Base { throw new Error(`Invalid saveType ${options.saveType}`) } this.cache = resolve(this.options.cache) + this.diff = null this.path = resolve(this.options.path) - process.emit('timeEnd', 'arborist:ctor') + timeEnd() } // TODO: We should change these to static functions instead @@ -223,7 +230,7 @@ class Arborist extends Base { // XXX: deprecate separate method options objects. options = { ...this.options, ...options } - process.emit('time', 'audit') + const timeEnd = time.start('audit') let tree if (options.packageLock === false) { // build ideal tree @@ -246,10 +253,28 @@ class Arborist extends Base { } this.auditReport = await AuditReport.load(tree, options) const ret = options.fix ? this.reify(options) : this.auditReport - process.emit('timeEnd', 'audit') + timeEnd() this.finishTracker('audit') return ret } + + async dedupe (options = {}) { + // allow the user to set options on the ctor as well. + // XXX: deprecate separate method options objects. + options = { ...this.options, ...options } + const tree = await this.loadVirtual().catch(() => this.loadActual()) + const names = [] + for (const name of tree.inventory.query('name')) { + if (tree.inventory.query('name', name).size > 1) { + names.push(name) + } + } + return this.reify({ + ...options, + preferDedupe: true, + update: { names }, + }) + } } module.exports = Arborist diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js index f4f1bb8e443624..4fbcd801fdf639 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js @@ -1,11 +1,11 @@ const _makeIdealGraph = Symbol('makeIdealGraph') const _createIsolatedTree = Symbol.for('createIsolatedTree') const _createBundledTree = Symbol('createBundledTree') -const fs = require('fs') +const { mkdirSync } = require('node:fs') const pacote = require('pacote') -const { join } = require('path') +const { join } = require('node:path') const { depth } = require('treeverse') -const crypto = require('crypto') +const crypto = require('node:crypto') // cache complicated function results const memoize = (fn) => { @@ -108,7 +108,7 @@ module.exports = cls => class IsolatedReifier extends cls { '.store', `${node.name}@${node.version}` ) - fs.mkdirSync(dir, { recursive: true }) + mkdirSync(dir, { recursive: true }) // TODO this approach feels wrong // and shouldn't be necessary for shrinkwraps await pacote.extract(node.resolved, dir, { @@ -212,7 +212,7 @@ module.exports = cls => class IsolatedReifier extends cls { return { edges, nodes } } - async [_createIsolatedTree] (idealTree) { + async [_createIsolatedTree] () { await this[_makeIdealGraph](this.options) const proxiedIdealTree = this.idealGraph 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 3ab5f5983768df..2add9553688a42 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 @@ -1,6 +1,6 @@ // mix-in implementing the loadActual method -const { relative, dirname, resolve, join, normalize } = require('path') +const { relative, dirname, resolve, join, normalize } = require('node:path') const rpj = require('read-package-json-fast') const { readdirScoped } = require('@npmcli/fs') @@ -216,7 +216,7 @@ module.exports = cls => class ActualLoader extends cls { const actualRoot = tree.isLink ? tree.target : tree const { dependencies = {} } = actualRoot.package for (const [name, kid] of actualRoot.children.entries()) { - const def = kid.isLink ? `file:${kid.realpath.replace(/#/g, '%23')}` : '*' + const def = kid.isLink ? `file:${kid.realpath}` : '*' dependencies[name] = dependencies[name] || def } actualRoot.package = { ...actualRoot.package, dependencies } @@ -336,8 +336,8 @@ module.exports = cls => class ActualLoader extends cls { await this.#loadFSChildren(node.target) return Promise.all( [...node.target.children.entries()] - .filter(([name, kid]) => !did.has(kid.realpath)) - .map(([name, kid]) => this.#loadFSTree(kid)) + .filter(([, kid]) => !did.has(kid.realpath)) + .map(([, kid]) => this.#loadFSTree(kid)) ) } } 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 9b681a47a83587..07c986853913ee 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 @@ -1,7 +1,7 @@ // mixin providing the loadVirtual method const mapWorkspaces = require('@npmcli/map-workspaces') -const { resolve } = require('path') +const { resolve } = require('node:path') const nameFromFolder = require('@npmcli/name-from-folder') const consistentResolve = require('../consistent-resolve.js') @@ -149,7 +149,7 @@ module.exports = cls => class VirtualLoader extends cls { }) for (const [name, path] of workspaces.entries()) { - lockWS[name] = `file:${path.replace(/#/g, '%23')}` + lockWS[name] = `file:${path}` } // Should rootNames exclude optional? @@ -283,7 +283,7 @@ module.exports = cls => class VirtualLoader extends cls { return node } - #loadLink (location, targetLoc, target, meta) { + #loadLink (location, targetLoc, target) { const path = resolve(this.path, location) const link = new Link({ installLinks: this.installLinks, 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 422819b2104b7e..82f84772f9a856 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js @@ -8,12 +8,9 @@ const rpj = require('read-package-json-fast') const binLinks = require('bin-links') const runScript = require('@npmcli/run-script') const { callLimit: promiseCallLimit } = require('promise-call-limit') -const { resolve } = require('path') -const { - isNodeGypPackage, - defaultGypInstallScript, -} = require('@npmcli/node-gyp') -const log = require('proc-log') +const { resolve } = require('node:path') +const { isNodeGypPackage, defaultGypInstallScript } = require('@npmcli/node-gyp') +const { log, time } = require('proc-log') const boolEnv = b => b ? '1' : '' const sortNodes = (a, b) => @@ -54,7 +51,7 @@ module.exports = cls => class Builder extends cls { // separates links nodes so that it can run // prepare scripts and link bins in the expected order - process.emit('time', 'build') + const timeEnd = time.start('build') const { depNodes, @@ -70,7 +67,7 @@ module.exports = cls => class Builder extends cls { await this.#build(linkNodes, { type: 'links' }) } - process.emit('timeEnd', 'build') + timeEnd() } // if we don't have a set of nodes, then just rebuild @@ -147,7 +144,7 @@ module.exports = cls => class Builder extends cls { } async #build (nodes, { type = 'deps' }) { - process.emit('time', `build:${type}`) + const timeEnd = time.start(`build:${type}`) await this.#buildQueues(nodes) @@ -168,11 +165,11 @@ module.exports = cls => class Builder extends cls { await this.#runScripts('postinstall') } - process.emit('timeEnd', `build:${type}`) + timeEnd() } async #buildQueues (nodes) { - process.emit('time', 'build:queue') + const timeEnd = time.start('build:queue') const set = new Set() const promises = [] @@ -210,7 +207,7 @@ module.exports = cls => class Builder extends cls { } } } - process.emit('timeEnd', 'build:queue') + timeEnd() } async [_checkBins] (node) { @@ -286,7 +283,7 @@ module.exports = cls => class Builder extends cls { return } - process.emit('time', `build:run:${event}`) + const timeEnd = time.start(`build:run:${event}`) const stdio = this.options.foregroundScripts ? 'inherit' : 'pipe' const limit = this.options.foregroundScripts ? 1 : undefined await promiseCallLimit(queue.map(node => async () => { @@ -309,8 +306,7 @@ module.exports = cls => class Builder extends cls { return } - const timer = `build:run:${event}:${location}` - process.emit('time', timer) + const timeEndLocation = time.start(`build:run:${event}:${location}`) log.info('run', pkg._id, event, location, pkg.scripts[event]) const env = { npm_package_resolved: resolved, @@ -356,9 +352,9 @@ module.exports = cls => class Builder extends cls { ? this[_handleOptionalFailure](node, p) : p) - process.emit('timeEnd', timer) + timeEndLocation() }), { limit }) - process.emit('timeEnd', `build:run:${event}`) + timeEnd() } async #linkAllBins () { @@ -367,7 +363,7 @@ module.exports = cls => class Builder extends cls { return } - process.emit('time', 'build:link') + const timeEnd = time.start('build:link') const promises = [] // sort the queue by node path, so that the module-local collision // detector in bin-links will always resolve the same way. @@ -377,7 +373,7 @@ module.exports = cls => class Builder extends cls { } await promiseAllRejectLate(promises) - process.emit('timeEnd', 'build:link') + timeEnd() } async #createBinLinks (node) { @@ -385,7 +381,7 @@ module.exports = cls => class Builder extends cls { return } - process.emit('time', `build:link:${node.location}`) + const timeEnd = time.start(`build:link:${node.location}`) const p = binLinks({ pkg: node.package, @@ -399,6 +395,6 @@ module.exports = cls => class Builder extends cls { ? this[_handleOptionalFailure](node, p) : p) - process.emit('timeEnd', `build:link:${node.location}`) + timeEnd() } } 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 a70e21821ecb86..4083d79f4fa255 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js @@ -7,18 +7,18 @@ const npa = require('npm-package-arg') const semver = require('semver') const debug = require('../debug.js') const { walkUp } = require('walk-up-path') -const log = require('proc-log') +const { log, time } = require('proc-log') const hgi = require('hosted-git-info') const rpj = require('read-package-json-fast') -const { dirname, resolve, relative, join } = require('path') +const { dirname, resolve, relative, join } = require('node:path') const { depth: dfwalk } = require('treeverse') const { lstat, mkdir, rm, symlink, -} = require('fs/promises') +} = require('node:fs/promises') const { moveFile } = require('@npmcli/fs') const PackageJson = require('@npmcli/package-json') const packageContents = require('@npmcli/installed-package-contents') @@ -38,119 +38,96 @@ const { saveTypeMap, hasSubKey } = require('../add-rm-pkg-deps.js') const Shrinkwrap = require('../shrinkwrap.js') const { defaultLockfileVersion } = Shrinkwrap -const _retiredPaths = Symbol('retiredPaths') -const _retiredUnchanged = Symbol('retiredUnchanged') -const _sparseTreeDirs = Symbol('sparseTreeDirs') -const _sparseTreeRoots = Symbol('sparseTreeRoots') -const _savePrefix = Symbol('savePrefix') +// Part of steps (steps need refactoring before we can do anything about these) const _retireShallowNodes = Symbol.for('retireShallowNodes') -const _getBundlesByDepth = Symbol('getBundlesByDepth') -const _registryResolved = Symbol('registryResolved') -const _addNodeToTrashList = Symbol.for('addNodeToTrashList') +const _loadBundlesAndUpdateTrees = Symbol.for('loadBundlesAndUpdateTrees') +const _submitQuickAudit = Symbol('submitQuickAudit') +const _addOmitsToTrashList = Symbol('addOmitsToTrashList') +const _unpackNewModules = Symbol.for('unpackNewModules') +const _build = Symbol.for('build') // shared by rebuild mixin const _trashList = Symbol.for('trashList') const _handleOptionalFailure = Symbol.for('handleOptionalFailure') const _loadTrees = Symbol.for('loadTrees') +// defined by rebuild mixin +const _checkBins = Symbol.for('checkBins') // shared symbols for swapping out when testing +// TODO tests should not be this deep into internals const _diffTrees = Symbol.for('diffTrees') const _createSparseTree = Symbol.for('createSparseTree') const _loadShrinkwrapsAndUpdateTrees = Symbol.for('loadShrinkwrapsAndUpdateTrees') -const _shrinkwrapInflated = Symbol('shrinkwrapInflated') -const _bundleUnpacked = Symbol('bundleUnpacked') -const _bundleMissing = Symbol('bundleMissing') const _reifyNode = Symbol.for('reifyNode') -const _extractOrLink = Symbol('extractOrLink') const _updateAll = Symbol.for('updateAll') const _updateNames = Symbol.for('updateNames') -// defined by rebuild mixin -const _checkBins = Symbol.for('checkBins') -const _symlink = Symbol('symlink') -const _warnDeprecated = Symbol('warnDeprecated') -const _loadBundlesAndUpdateTrees = Symbol.for('loadBundlesAndUpdateTrees') -const _submitQuickAudit = Symbol('submitQuickAudit') -const _unpackNewModules = Symbol.for('unpackNewModules') const _moveContents = Symbol.for('moveContents') const _moveBackRetiredUnchanged = Symbol.for('moveBackRetiredUnchanged') -const _build = Symbol.for('build') const _removeTrash = Symbol.for('removeTrash') const _renamePath = Symbol.for('renamePath') const _rollbackRetireShallowNodes = Symbol.for('rollbackRetireShallowNodes') const _rollbackCreateSparseTree = Symbol.for('rollbackCreateSparseTree') const _rollbackMoveBackRetiredUnchanged = Symbol.for('rollbackMoveBackRetiredUnchanged') const _saveIdealTree = Symbol.for('saveIdealTree') -const _copyIdealToActual = Symbol('copyIdealToActual') -const _addOmitsToTrashList = Symbol('addOmitsToTrashList') -const _packageLockOnly = Symbol('packageLockOnly') -const _dryRun = Symbol('dryRun') -const _validateNodeModules = Symbol('validateNodeModules') -const _nmValidated = Symbol('nmValidated') -const _validatePath = Symbol('validatePath') const _reifyPackages = Symbol.for('reifyPackages') -const _omitDev = Symbol('omitDev') -const _omitOptional = Symbol('omitOptional') -const _omitPeer = Symbol('omitPeer') - -const _pruneBundledMetadeps = Symbol('pruneBundledMetadeps') - -// defined by Ideal mixin +// defined by build-ideal-tree mixin const _resolvedAdd = Symbol.for('resolvedAdd') const _usePackageLock = Symbol.for('usePackageLock') -const _formatPackageLock = Symbol.for('formatPackageLock') +// used by build-ideal-tree mixin +const _addNodeToTrashList = Symbol.for('addNodeToTrashList') 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() + #omitDev + #omitPeer + #omitOptional + #retiredPaths = {} + #retiredUnchanged = {} + #savePrefix + #shrinkwrapInflated = new Set() + #sparseTreeDirs = new Set() + #sparseTreeRoots = new Set() + constructor (options) { super(options) - const { - savePrefix = '^', - packageLockOnly = false, - dryRun = false, - formatPackageLock = true, - } = options - - this[_dryRun] = !!dryRun - this[_packageLockOnly] = !!packageLockOnly - this[_savePrefix] = savePrefix - this[_formatPackageLock] = !!formatPackageLock - - this.diff = null - this[_retiredPaths] = {} - this[_shrinkwrapInflated] = new Set() - this[_retiredUnchanged] = {} - this[_sparseTreeDirs] = new Set() - this[_sparseTreeRoots] = new Set() this[_trashList] = new Set() - // the nodes we unpack to read their bundles - this[_bundleUnpacked] = new Set() - // child nodes we'd EXPECT to be included in a bundle, but aren't - this[_bundleMissing] = new Set() - this[_nmValidated] = new Set() } // public method async reify (options = {}) { const linked = (options.installStrategy || this.options.installStrategy) === 'linked' - if (this[_packageLockOnly] && this.options.global) { + if (this.options.packageLockOnly && this.options.global) { const er = new Error('cannot generate lockfile for global packages') er.code = 'ESHRINKWRAPGLOBAL' throw er } const omit = new Set(options.omit || []) - this[_omitDev] = omit.has('dev') - this[_omitOptional] = omit.has('optional') - this[_omitPeer] = omit.has('peer') + this.#omitDev = omit.has('dev') + this.#omitOptional = omit.has('optional') + this.#omitPeer = omit.has('peer') // start tracker block this.addTracker('reify') - process.emit('time', 'reify') - await this[_validatePath]() + const timeEnd = time.start('reify') + // don't create missing dirs on dry runs + if (!this.options.packageLockOnly && !this.options.dryRun) { + // we do NOT want to set ownership on this folder, especially + // recursively, because it can have other side effects to do that + // in a project directory. We just want to make it if it's missing. + await mkdir(resolve(this.path), { recursive: true }) + + // do not allow the top-level node_modules to be a symlink + await this.#validateNodeModules(resolve(this.path, 'node_modules')) + } await this[_loadTrees](options) const oldTree = this.idealTree @@ -159,7 +136,7 @@ module.exports = cls => class Reifier extends cls { // this is currently technical debt which will be resolved in a refactor // of Node/Link trees log.warn('reify', 'The "linked" install strategy is EXPERIMENTAL and may contain bugs.') - this.idealTree = await this[_createIsolatedTree](this.idealTree) + this.idealTree = await this[_createIsolatedTree]() } await this[_diffTrees]() await this[_reifyPackages]() @@ -169,37 +146,139 @@ module.exports = cls => class Reifier extends cls { this.idealTree = oldTree } await this[_saveIdealTree](options) - await this[_copyIdealToActual]() - // This is a very bad pattern and I can't wait to stop doing it - this.auditReport = await this.auditReport + // clean up any trash that is still in the tree + for (const path of this[_trashList]) { + const loc = relpath(this.idealTree.realpath, path) + const node = this.idealTree.inventory.get(loc) + if (node && node.root === this.idealTree) { + node.parent = null + } + } - this.finishTracker('reify') - process.emit('timeEnd', 'reify') - return treeCheck(this.actualTree) - } + // if we filtered to only certain nodes, then anything ELSE needs + // to be untouched in the resulting actual tree, even if it differs + // in the idealTree. Copy over anything that was in the actual and + // was not changed, delete anything in the ideal and not actual. + // Then we move the entire idealTree over to this.actualTree, and + // save the hidden lockfile. + if (this.diff && this.diff.filterSet.size) { + const reroot = new Set() - async [_validatePath] () { - // don't create missing dirs on dry runs - if (this[_packageLockOnly] || this[_dryRun]) { - return + const { filterSet } = this.diff + const seen = new Set() + for (const [loc, ideal] of this.idealTree.inventory.entries()) { + seen.add(loc) + + // if it's an ideal node from the filter set, then skip it + // because we already made whatever changes were necessary + if (filterSet.has(ideal)) { + continue + } + + // otherwise, if it's not in the actualTree, then it's not a thing + // that we actually added. And if it IS in the actualTree, then + // it's something that we left untouched, so we need to record + // that. + const actual = this.actualTree.inventory.get(loc) + if (!actual) { + ideal.root = null + } else { + if ([...actual.linksIn].some(link => filterSet.has(link))) { + seen.add(actual.location) + continue + } + const { realpath, isLink } = actual + if (isLink && ideal.isLink && ideal.realpath === realpath) { + continue + } else { + reroot.add(actual) + } + } + } + + // now find any actual nodes that may not be present in the ideal + // tree, but were left behind by virtue of not being in the filter + for (const [loc, actual] of this.actualTree.inventory.entries()) { + if (seen.has(loc)) { + continue + } + seen.add(loc) + + // we know that this is something that ISN'T in the idealTree, + // or else we will have addressed it in the previous loop. + // If it's in the filterSet, that means we intentionally removed + // it, so nothing to do here. + if (filterSet.has(actual)) { + continue + } + + reroot.add(actual) + } + + // go through the rerooted actual nodes, and move them over. + for (const actual of reroot) { + actual.root = this.idealTree + } + + // prune out any tops that lack a linkIn, they are no longer relevant. + for (const top of this.idealTree.tops) { + if (top.linksIn.size === 0) { + top.root = null + } + } + + // need to calculate dep flags, since nodes may have been marked + // as extraneous or otherwise incorrect during transit. + calcDepFlags(this.idealTree) } - // we do NOT want to set ownership on this folder, especially - // recursively, because it can have other side effects to do that - // in a project directory. We just want to make it if it's missing. - await mkdir(resolve(this.path), { recursive: true }) + // save the ideal's meta as a hidden lockfile after we actualize it + this.idealTree.meta.filename = + this.idealTree.realpath + '/node_modules/.package-lock.json' + this.idealTree.meta.hiddenLockfile = true + this.idealTree.meta.lockfileVersion = defaultLockfileVersion + + this.actualTree = this.idealTree + this.idealTree = null + + if (!this.options.global) { + await this.actualTree.meta.save() + const ignoreScripts = !!this.options.ignoreScripts + // if we aren't doing a dry run or ignoring scripts and we actually made changes to the dep + // tree, then run the dependencies scripts + if (!this.options.dryRun && !ignoreScripts && this.diff && this.diff.children.length) { + const { path, package: pkg } = this.actualTree.target + const stdio = this.options.foregroundScripts ? 'inherit' : 'pipe' + const { scripts = {} } = pkg + for (const event of ['predependencies', 'dependencies', 'postdependencies']) { + if (Object.prototype.hasOwnProperty.call(scripts, event)) { + log.info('run', pkg._id, event, scripts[event]) + await time.start(`reify:run:${event}`, () => runScript({ + event, + path, + pkg, + stdio, + scriptShell: this.options.scriptShell, + })) + } + } + } + } + // This is a very bad pattern and I can't wait to stop doing it + this.auditReport = await this.auditReport - // do not allow the top-level node_modules to be a symlink - await this[_validateNodeModules](resolve(this.path, 'node_modules')) + this.finishTracker('reify') + timeEnd() + return treeCheck(this.actualTree) } async [_reifyPackages] () { // we don't submit the audit report or write to disk on dry runs - if (this[_dryRun]) { + if (this.options.dryRun) { return } - if (this[_packageLockOnly]) { + if (this.options.packageLockOnly) { // we already have the complete tree, so just audit it now, // and that's all we have to do here. return this[_submitQuickAudit]() @@ -248,6 +327,7 @@ module.exports = cls => class Reifier extends cls { throw reifyTerminated } } catch (er) { + // TODO rollbacks shouldn't be relied on to throw err await this[rollback](er) /* istanbul ignore next - rollback throws, should never hit this */ throw er @@ -269,16 +349,15 @@ module.exports = cls => class Reifier extends cls { // when doing a local install, we load everything and figure it all out. // when doing a global install, we *only* care about the explicit requests. [_loadTrees] (options) { - process.emit('time', 'reify:loadTrees') + const timeEnd = time.start('reify:loadTrees') const bitOpt = { ...options, - complete: this[_packageLockOnly] || this[_dryRun], + complete: this.options.packageLockOnly || this.options.dryRun, } // if we're only writing a package lock, then it doesn't matter what's here - if (this[_packageLockOnly]) { - return this.buildIdealTree(bitOpt) - .then(() => process.emit('timeEnd', 'reify:loadTrees')) + if (this.options.packageLockOnly) { + return this.buildIdealTree(bitOpt).then(timeEnd) } const actualOpt = this.options.global ? { @@ -312,7 +391,7 @@ module.exports = cls => class Reifier extends cls { return Promise.all([ this.loadActual(actualOpt), this.buildIdealTree(bitOpt), - ]).then(() => process.emit('timeEnd', 'reify:loadTrees')) + ]).then(timeEnd) } // the global install space tends to have a lot of stuff in it. don't @@ -322,15 +401,15 @@ module.exports = cls => class Reifier extends cls { // explicitRequests which is set during buildIdealTree return this.buildIdealTree(bitOpt) .then(() => this.loadActual(actualOpt)) - .then(() => process.emit('timeEnd', 'reify:loadTrees')) + .then(timeEnd) } [_diffTrees] () { - if (this[_packageLockOnly]) { + if (this.options.packageLockOnly) { return } - process.emit('time', 'reify:diffTrees') + const timeEnd = time.start('reify:diffTrees') // XXX if we have an existing diff already, there should be a way // to just invalidate the parts that changed, but avoid walking the // whole tree again. @@ -384,7 +463,7 @@ module.exports = cls => class Reifier extends cls { // find all the nodes that need to change between the actual // and ideal trees. this.diff = Diff.calculate({ - shrinkwrapInflated: this[_shrinkwrapInflated], + shrinkwrapInflated: this.#shrinkwrapInflated, filterNodes, actual: this.actualTree, ideal: this.idealTree, @@ -397,7 +476,7 @@ module.exports = cls => class Reifier extends cls { // because if we remove node_modules/FOO on case-insensitive systems, // it will remove the dep that we *want* at node_modules/foo. - process.emit('timeEnd', 'reify:diffTrees') + timeEnd() } // add the node and all its bins to the list of things to be @@ -406,7 +485,7 @@ module.exports = cls => class Reifier extends cls { // replace them when rolling back on failure. [_addNodeToTrashList] (node, retire = false) { const paths = [node.path, ...node.binPaths] - const moves = this[_retiredPaths] + const moves = this.#retiredPaths log.silly('reify', 'mark', retire ? 'retired' : 'deleted', paths) for (const path of paths) { if (retire) { @@ -422,8 +501,8 @@ module.exports = cls => class Reifier extends cls { // move aside the shallowest nodes in the tree that have to be // changed or removed, so that we can rollback if necessary. [_retireShallowNodes] () { - process.emit('time', 'reify:retireShallow') - const moves = this[_retiredPaths] = {} + const timeEnd = time.start('reify:retireShallow') + const moves = this.#retiredPaths = {} for (const diff of this.diff.children) { if (diff.action === 'CHANGE' || diff.action === 'REMOVE') { // we'll have to clean these up at the end, so add them to the list @@ -433,8 +512,7 @@ module.exports = cls => class Reifier extends cls { log.silly('reify', 'moves', moves) const movePromises = Object.entries(moves) .map(([from, to]) => this[_renamePath](from, to)) - return promiseAllRejectLate(movePromises) - .then(() => process.emit('timeEnd', 'reify:retireShallow')) + return promiseAllRejectLate(movePromises).then(timeEnd) } [_renamePath] (from, to, didMkdirp = false) { @@ -456,14 +534,14 @@ module.exports = cls => class Reifier extends cls { } [_rollbackRetireShallowNodes] (er) { - process.emit('time', 'reify:rollback:retireShallow') - const moves = this[_retiredPaths] + const timeEnd = time.start('reify:rollback:retireShallow') + const moves = this.#retiredPaths const movePromises = Object.entries(moves) .map(([from, to]) => this[_renamePath](to, from)) return promiseAllRejectLate(movePromises) // ignore subsequent rollback errors - .catch(er => {}) - .then(() => process.emit('timeEnd', 'reify:rollback:retireShallow')) + .catch(() => {}) + .then(timeEnd) .then(() => { throw er }) @@ -472,11 +550,11 @@ module.exports = cls => class Reifier extends cls { // adding to the trash list will skip reifying, and delete them // if they are currently in the tree and otherwise untouched. [_addOmitsToTrashList] () { - if (!this[_omitDev] && !this[_omitOptional] && !this[_omitPeer]) { + if (!this.#omitDev && !this.#omitOptional && !this.#omitPeer) { return } - process.emit('time', 'reify:trashOmits') + const timeEnd = time.start('reify:trashOmits') for (const node of this.idealTree.inventory.values()) { const { top } = node @@ -494,26 +572,26 @@ module.exports = cls => class Reifier extends cls { // omit node if the dep type matches any omit flags that were set if ( - node.peer && this[_omitPeer] || - node.dev && this[_omitDev] || - node.optional && this[_omitOptional] || - node.devOptional && this[_omitOptional] && this[_omitDev] + node.peer && this.#omitPeer || + node.dev && this.#omitDev || + node.optional && this.#omitOptional || + node.devOptional && this.#omitOptional && this.#omitDev ) { this[_addNodeToTrashList](node) } } - process.emit('timeEnd', 'reify:trashOmits') + timeEnd() } [_createSparseTree] () { - process.emit('time', 'reify:createSparse') + const timeEnd = time.start('reify:createSparse') // if we call this fn again, we look for the previous list // so that we can avoid making the same directory multiple times const leaves = this.diff.leaves .filter(diff => { return (diff.action === 'ADD' || diff.action === 'CHANGE') && - !this[_sparseTreeDirs].has(diff.ideal.path) && + !this.#sparseTreeDirs.has(diff.ideal.path) && !diff.ideal.isLink }) .map(diff => diff.ideal) @@ -530,37 +608,36 @@ module.exports = cls => class Reifier extends cls { continue } dirsChecked.add(d) - const st = await lstat(d).catch(er => null) + const st = await lstat(d).catch(() => null) // this can happen if we have a link to a package with a name // that the filesystem treats as if it is the same thing. // would be nice to have conditional istanbul ignores here... /* istanbul ignore next - defense in depth */ if (st && !st.isDirectory()) { const retired = retirePath(d) - this[_retiredPaths][d] = retired + this.#retiredPaths[d] = retired this[_trashList].add(retired) await this[_renamePath](d, retired) } } - this[_sparseTreeDirs].add(node.path) + this.#sparseTreeDirs.add(node.path) const made = await mkdir(node.path, { recursive: true }) // if the directory already exists, made will be undefined. if that's the case // we don't want to remove it because we aren't the ones who created it so we - // omit it from the _sparseTreeRoots + // omit it from the #sparseTreeRoots if (made) { - this[_sparseTreeRoots].add(made) + this.#sparseTreeRoots.add(made) } - })) - .then(() => process.emit('timeEnd', 'reify:createSparse')) + })).then(timeEnd) } [_rollbackCreateSparseTree] (er) { - process.emit('time', 'reify:rollback:createSparse') + const timeEnd = time.start('reify:rollback:createSparse') // cut the roots of the sparse tree that were created, not the leaves - const roots = this[_sparseTreeRoots] + const roots = this.#sparseTreeRoots // also delete the moves that we retired, so that we can move them back const failures = [] - const targets = [...roots, ...Object.keys(this[_retiredPaths])] + const targets = [...roots, ...Object.keys(this.#retiredPaths)] const unlinks = targets .map(path => rm(path, { recursive: true, force: true }).catch(er => failures.push([path, er]))) return promiseAllRejectLate(unlinks).then(() => { @@ -569,7 +646,7 @@ module.exports = cls => class Reifier extends cls { log.warn('cleanup', 'Failed to remove some directories', failures) } }) - .then(() => process.emit('timeEnd', 'reify:rollback:createSparse')) + .then(timeEnd) .then(() => this[_rollbackRetireShallowNodes](er)) } @@ -577,7 +654,7 @@ module.exports = cls => class Reifier extends cls { // we need to unpack them, read that shrinkwrap file, and then update // the tree by calling loadVirtual with the node as the root. [_loadShrinkwrapsAndUpdateTrees] () { - const seen = this[_shrinkwrapInflated] + const seen = this.#shrinkwrapInflated const shrinkwraps = this.diff.leaves .filter(d => (d.action === 'CHANGE' || d.action === 'ADD' || !d.action) && d.ideal.hasShrinkwrap && !seen.has(d.ideal) && @@ -587,7 +664,7 @@ module.exports = cls => class Reifier extends cls { return } - process.emit('time', 'reify:loadShrinkwraps') + const timeEnd = time.start('reify:loadShrinkwraps') const Arborist = this.constructor return promiseAllRejectLate(shrinkwraps.map(diff => { @@ -604,7 +681,7 @@ module.exports = cls => class Reifier extends cls { .then(() => this[_createSparseTree]()) .then(() => this[_addOmitsToTrashList]()) .then(() => this[_loadShrinkwrapsAndUpdateTrees]()) - .then(() => process.emit('timeEnd', 'reify:loadShrinkwraps')) + .then(timeEnd) } // create a symlink for Links, extract for Nodes @@ -619,8 +696,7 @@ module.exports = cls => class Reifier extends cls { return node } - const timer = `reifyNode:${node.location}` - process.emit('time', timer) + const timeEnd = time.start(`reifyNode:${node.location}`) this.addTracker('reify', node.name, node.location) const { npmVersion, nodeVersion, cpu, os, libc } = this.options @@ -636,35 +712,40 @@ module.exports = cls => class Reifier extends cls { checkPlatform(node.package, false, { cpu, os, libc }) } await this[_checkBins](node) - await this[_extractOrLink](node) - await this[_warnDeprecated](node) + await this.#extractOrLink(node) + const { _id, deprecated } = node.package + // The .catch is in _handleOptionalFailure. Not ideal, this should be cleaned up. + // eslint-disable-next-line promise/always-return + if (deprecated) { + log.warn('deprecated', `${_id}: ${deprecated}`) + } }) return this[_handleOptionalFailure](node, p) .then(() => { this.finishTracker('reify', node.name, node.location) - process.emit('timeEnd', timer) + timeEnd() return node }) } // do not allow node_modules to be a symlink - async [_validateNodeModules] (nm) { - if (this.options.force || this[_nmValidated].has(nm)) { + async #validateNodeModules (nm) { + if (this.options.force || this.#nmValidated.has(nm)) { return } const st = await lstat(nm).catch(() => null) if (!st || st.isDirectory()) { - this[_nmValidated].add(nm) + this.#nmValidated.add(nm) return } log.warn('reify', 'Removing non-directory', nm) await rm(nm, { recursive: true, force: true }) } - async [_extractOrLink] (node) { + async #extractOrLink (node) { const nm = resolve(node.parent.path, 'node_modules') - await this[_validateNodeModules](nm) + await this.#validateNodeModules(nm) if (!node.isLink) { // in normal cases, node.resolved should *always* be set by now. @@ -676,7 +757,7 @@ module.exports = cls => class Reifier extends cls { // entirely, since we can't possibly reify it. let res = null if (node.resolved) { - const registryResolved = this[_registryResolved](node.resolved) + const registryResolved = this.#registryResolved(node.resolved) if (registryResolved) { res = `${node.name}@${registryResolved}` } @@ -698,7 +779,7 @@ module.exports = cls => class Reifier extends cls { return } await debug(async () => { - const st = await lstat(node.path).catch(e => null) + const st = await lstat(node.path).catch(() => null) if (st && !st.isDirectory()) { debug.log('unpacking into a non-directory', node) throw Object.assign(new Error('ENOTDIR: not a directory'), { @@ -722,10 +803,8 @@ module.exports = cls => class Reifier extends cls { // node.isLink await rm(node.path, { recursive: true, force: true }) - await this[_symlink](node) - } - async [_symlink] (node) { + // symlink const dir = dirname(node.path) const target = node.realpath const rel = relative(dir, target) @@ -733,17 +812,10 @@ module.exports = cls => class Reifier extends cls { return symlink(rel, node.path, 'junction') } - [_warnDeprecated] (node) { - const { _id, deprecated } = node.package - if (deprecated) { - log.warn('deprecated', `${_id}: ${deprecated}`) - } - } - // if the node is optional, then the failure of the promise is nonfatal // just add it and its optional set to the trash list. [_handleOptionalFailure] (node, p) { - return (node.optional ? p.catch(er => { + return (node.optional ? p.catch(() => { const set = optionalSet(node) for (node of set) { log.verbose('reify', 'failed optional dependency', node.path) @@ -752,7 +824,7 @@ module.exports = cls => class Reifier extends cls { }) : p).then(() => node) } - [_registryResolved] (resolved) { + #registryResolved (resolved) { // the default registry url is a magic value meaning "the currently // configured registry". // `resolved` must never be falsey. @@ -782,21 +854,51 @@ module.exports = cls => class Reifier extends cls { // by the contents of the package. however, in their case, rather than // shipping a virtual tree that must be reified, they ship an entire // reified actual tree that must be unpacked and not modified. - [_loadBundlesAndUpdateTrees] ( - depth = 0, bundlesByDepth = this[_getBundlesByDepth]() - ) { + [_loadBundlesAndUpdateTrees] (depth = 0, bundlesByDepth) { + let maxBundleDepth + if (!bundlesByDepth) { + bundlesByDepth = new Map() + maxBundleDepth = -1 + dfwalk({ + tree: this.diff, + visit: diff => { + const node = diff.ideal + if (!node) { + return + } + if (node.isProjectRoot) { + return + } + + const { bundleDependencies } = node.package + if (bundleDependencies && bundleDependencies.length) { + maxBundleDepth = Math.max(maxBundleDepth, node.depth) + if (!bundlesByDepth.has(node.depth)) { + bundlesByDepth.set(node.depth, [node]) + } else { + bundlesByDepth.get(node.depth).push(node) + } + } + }, + getChildren: diff => diff.children, + }) + + bundlesByDepth.set('maxBundleDepth', maxBundleDepth) + } else { + maxBundleDepth = bundlesByDepth.get('maxBundleDepth') + } + if (depth === 0) { - process.emit('time', 'reify:loadBundles') + time.start('reify:loadBundles') } - const maxBundleDepth = bundlesByDepth.get('maxBundleDepth') if (depth > maxBundleDepth) { // if we did something, then prune the tree and update the diffs if (maxBundleDepth !== -1) { - this[_pruneBundledMetadeps](bundlesByDepth) + this.#pruneBundledMetadeps(bundlesByDepth) this[_diffTrees]() } - process.emit('timeEnd', 'reify:loadBundles') + time.end('reify:loadBundles') return } @@ -814,7 +916,7 @@ module.exports = cls => class Reifier extends cls { // extract all the nodes with bundles return promiseCallLimit(set.map(node => { return () => { - this[_bundleUnpacked].add(node) + this.#bundleUnpacked.add(node) return this[_reifyNode](node) } }), { rejectLate: true }) @@ -843,46 +945,15 @@ module.exports = cls => class Reifier extends cls { }, }) for (const name of notTransplanted) { - this[_bundleMissing].add(node.children.get(name)) + this.#bundleMissing.add(node.children.get(name)) } }))) // move onto the next level of bundled items .then(() => this[_loadBundlesAndUpdateTrees](depth + 1, bundlesByDepth)) } - [_getBundlesByDepth] () { - const bundlesByDepth = new Map() - let maxBundleDepth = -1 - dfwalk({ - tree: this.diff, - visit: diff => { - const node = diff.ideal - if (!node) { - return - } - if (node.isProjectRoot) { - return - } - - const { bundleDependencies } = node.package - if (bundleDependencies && bundleDependencies.length) { - maxBundleDepth = Math.max(maxBundleDepth, node.depth) - if (!bundlesByDepth.has(node.depth)) { - bundlesByDepth.set(node.depth, [node]) - } else { - bundlesByDepth.get(node.depth).push(node) - } - } - }, - getChildren: diff => diff.children, - }) - - bundlesByDepth.set('maxBundleDepth', maxBundleDepth) - return bundlesByDepth - } - // https://github.com/npm/cli/issues/1597#issuecomment-667639545 - [_pruneBundledMetadeps] (bundlesByDepth) { + #pruneBundledMetadeps (bundlesByDepth) { const bundleShadowed = new Set() // Example dep graph: @@ -981,7 +1052,7 @@ module.exports = cls => class Reifier extends cls { // before finishing the reify() and returning the tree. Thus, we do // NOT return the promise, as the intent is for this to run in parallel // with the reification, and be resolved at a later time. - process.emit('time', 'reify:audit') + const timeEnd = time.start('reify:audit') const options = { ...this.options } const tree = this.idealTree @@ -995,7 +1066,7 @@ module.exports = cls => class Reifier extends cls { } this.auditReport = AuditReport.load(tree, options).then(res => { - process.emit('timeEnd', 'reify:audit') + timeEnd() return res }) } @@ -1005,7 +1076,7 @@ module.exports = cls => class Reifier extends cls { // kicking off each unpack job. If any fail, we rm the sparse // tree entirely and try to put everything back where it was. [_unpackNewModules] () { - process.emit('time', 'reify:unpack') + const timeEnd = time.start('reify:unpack') const unpacks = [] dfwalk({ tree: this.diff, @@ -1016,9 +1087,9 @@ module.exports = cls => class Reifier extends cls { } const node = diff.ideal - const bd = this[_bundleUnpacked].has(node) - const sw = this[_shrinkwrapInflated].has(node) - const bundleMissing = this[_bundleMissing].has(node) + const bd = this.#bundleUnpacked.has(node) + const sw = this.#shrinkwrapInflated.has(node) + const bundleMissing = this.#bundleMissing.has(node) // check whether we still need to unpack this one. // test the inDepBundle last, since that's potentially a tree walk. @@ -1038,8 +1109,7 @@ module.exports = cls => class Reifier extends cls { }, getChildren: diff => diff.children, }) - return promiseAllRejectLate(unpacks) - .then(() => process.emit('timeEnd', 'reify:unpack')) + return promiseAllRejectLate(unpacks).then(timeEnd) } // This is the part where we move back the unchanging nodes that were @@ -1054,9 +1124,9 @@ module.exports = cls => class Reifier extends cls { // This is sort of an inverse diff tree, of all the nodes where // the actualTree and idealTree _don't_ differ, starting from the // shallowest nodes that we moved aside in the first place. - process.emit('time', 'reify:unretire') - const moves = this[_retiredPaths] - this[_retiredUnchanged] = {} + const timeEnd = time.start('reify:unretire') + const moves = this.#retiredPaths + this.#retiredUnchanged = {} return promiseAllRejectLate(this.diff.children.map(diff => { // skip if nothing was retired if (diff.action !== 'CHANGE' && diff.action !== 'REMOVE') { @@ -1079,7 +1149,7 @@ module.exports = cls => class Reifier extends cls { } }) - this[_retiredUnchanged][retireFolder] = [] + this.#retiredUnchanged[retireFolder] = [] return promiseAllRejectLate(diff.unchanged.map(node => { // no need to roll back links, since we'll just delete them anyway if (node.isLink) { @@ -1088,11 +1158,11 @@ module.exports = cls => class Reifier extends cls { } // will have been moved/unpacked along with bundler - if (node.inDepBundle && !this[_bundleMissing].has(node)) { + if (node.inDepBundle && !this.#bundleMissing.has(node)) { return } - this[_retiredUnchanged][retireFolder].push(node) + this.#retiredUnchanged[retireFolder].push(node) const rel = relative(realFolder, node.path) const fromPath = resolve(retireFolder, rel) @@ -1102,8 +1172,7 @@ module.exports = cls => class Reifier extends cls { const dir = bd && bd.length ? node.path + '/node_modules' : node.path return mkdir(dir, { recursive: true }).then(() => this[_moveContents](node, fromPath)) })) - })) - .then(() => process.emit('timeEnd', 'reify:unretire')) + })).then(timeEnd) } // move the contents from the fromPath to the node.path @@ -1120,10 +1189,10 @@ module.exports = cls => class Reifier extends cls { } [_rollbackMoveBackRetiredUnchanged] (er) { - const moves = this[_retiredPaths] + const moves = this.#retiredPaths // flip the mapping around to go back const realFolders = new Map(Object.entries(moves).map(([k, v]) => [v, k])) - const promises = Object.entries(this[_retiredUnchanged]) + const promises = Object.entries(this.#retiredUnchanged) .map(([retireFolder, nodes]) => promiseAllRejectLate(nodes.map(node => { const realFolder = realFolders.get(retireFolder) const rel = relative(realFolder, node.path) @@ -1135,7 +1204,7 @@ module.exports = cls => class Reifier extends cls { } [_build] () { - process.emit('time', 'reify:build') + const timeEnd = time.start('reify:build') // for all the things being installed, run their appropriate scripts // run in tip->root order, so as to be more likely to build a node's @@ -1167,8 +1236,7 @@ module.exports = cls => class Reifier extends cls { } } - return this.rebuild({ nodes, handleOptionalFailure: true }) - .then(() => process.emit('timeEnd', 'reify:build')) + return this.rebuild({ nodes, handleOptionalFailure: true }).then(timeEnd) } // the tree is pretty much built now, so it's cleanup time. @@ -1176,7 +1244,7 @@ module.exports = cls => class Reifier extends cls { // If this fails, there isn't much we can do but tell the user about it. // Thankfully, it's pretty unlikely that it'll fail, since rm is a node builtin. async [_removeTrash] () { - process.emit('time', 'reify:trash') + const timeEnd = time.start('reify:trash') const promises = [] const failures = [] const _rm = path => rm(path, { recursive: true, force: true }).catch(er => failures.push([path, er])) @@ -1189,7 +1257,8 @@ module.exports = cls => class Reifier extends cls { if (failures.length) { log.warn('cleanup', 'Failed to remove some directories', failures) } - process.emit('timeEnd', 'reify:trash') + + timeEnd() } // last but not least, we save the ideal tree metadata to the package-lock @@ -1215,14 +1284,14 @@ module.exports = cls => class Reifier extends cls { const saveIdealTree = !( (!save && !hasUpdates) || this.options.global - || this[_dryRun] + || this.options.dryRun ) if (!saveIdealTree) { return false } - process.emit('time', 'reify:save') + const timeEnd = time.start('reify:save') const updatedTrees = new Set() const updateNodes = nodes => { @@ -1251,7 +1320,7 @@ module.exports = cls => class Reifier extends cls { const isLocalDep = req.type === 'directory' || req.type === 'file' if (req.registry) { const version = child.version - const prefixRange = version ? this[_savePrefix] + version : '*' + const prefixRange = version ? this.options.savePrefix + version : '*' // if we installed a range, then we save the range specified // if it is not a subset of the ^x.y.z. eg, installing a range // of `1.x <1.2.3` will not be saved as `^1.2.0`, because that @@ -1286,7 +1355,7 @@ module.exports = cls => class Reifier extends cls { // using their relative path if (edge.type === 'workspace') { const { version } = edge.to.target - const prefixRange = version ? this[_savePrefix] + version : '*' + const prefixRange = version ? this.options.savePrefix + version : '*' newSpec = prefixRange } else { // save the relative path in package.json @@ -1295,7 +1364,7 @@ module.exports = cls => class Reifier extends cls { // path initially, in which case we can end up with the wrong // thing, so just get the ultimate fetchSpec and relativize it. const p = req.fetchSpec.replace(/^file:/, '') - const rel = relpath(addTree.realpath, p).replace(/#/g, '%23') + const rel = relpath(addTree.realpath, p) newSpec = `file:${rel}` } } else { @@ -1455,154 +1524,12 @@ module.exports = cls => class Reifier extends cls { // TODO this ignores options.save await this.idealTree.meta.save({ - format: (this[_formatPackageLock] && format) ? format - : this[_formatPackageLock], + format: (this.options.formatPackageLock && format) ? format + : this.options.formatPackageLock, }) } - process.emit('timeEnd', 'reify:save') + timeEnd() return true } - - async [_copyIdealToActual] () { - // clean up any trash that is still in the tree - for (const path of this[_trashList]) { - const loc = relpath(this.idealTree.realpath, path) - const node = this.idealTree.inventory.get(loc) - if (node && node.root === this.idealTree) { - node.parent = null - } - } - - // if we filtered to only certain nodes, then anything ELSE needs - // to be untouched in the resulting actual tree, even if it differs - // in the idealTree. Copy over anything that was in the actual and - // was not changed, delete anything in the ideal and not actual. - // Then we move the entire idealTree over to this.actualTree, and - // save the hidden lockfile. - if (this.diff && this.diff.filterSet.size) { - const reroot = new Set() - - const { filterSet } = this.diff - const seen = new Set() - for (const [loc, ideal] of this.idealTree.inventory.entries()) { - seen.add(loc) - - // if it's an ideal node from the filter set, then skip it - // because we already made whatever changes were necessary - if (filterSet.has(ideal)) { - continue - } - - // otherwise, if it's not in the actualTree, then it's not a thing - // that we actually added. And if it IS in the actualTree, then - // it's something that we left untouched, so we need to record - // that. - const actual = this.actualTree.inventory.get(loc) - if (!actual) { - ideal.root = null - } else { - if ([...actual.linksIn].some(link => filterSet.has(link))) { - seen.add(actual.location) - continue - } - const { realpath, isLink } = actual - if (isLink && ideal.isLink && ideal.realpath === realpath) { - continue - } else { - reroot.add(actual) - } - } - } - - // now find any actual nodes that may not be present in the ideal - // tree, but were left behind by virtue of not being in the filter - for (const [loc, actual] of this.actualTree.inventory.entries()) { - if (seen.has(loc)) { - continue - } - seen.add(loc) - - // we know that this is something that ISN'T in the idealTree, - // or else we will have addressed it in the previous loop. - // If it's in the filterSet, that means we intentionally removed - // it, so nothing to do here. - if (filterSet.has(actual)) { - continue - } - - reroot.add(actual) - } - - // go through the rerooted actual nodes, and move them over. - for (const actual of reroot) { - actual.root = this.idealTree - } - - // prune out any tops that lack a linkIn, they are no longer relevant. - for (const top of this.idealTree.tops) { - if (top.linksIn.size === 0) { - top.root = null - } - } - - // need to calculate dep flags, since nodes may have been marked - // as extraneous or otherwise incorrect during transit. - calcDepFlags(this.idealTree) - } - - // save the ideal's meta as a hidden lockfile after we actualize it - this.idealTree.meta.filename = - this.idealTree.realpath + '/node_modules/.package-lock.json' - this.idealTree.meta.hiddenLockfile = true - this.idealTree.meta.lockfileVersion = defaultLockfileVersion - - this.actualTree = this.idealTree - this.idealTree = null - - if (!this.options.global) { - await this.actualTree.meta.save() - const ignoreScripts = !!this.options.ignoreScripts - // if we aren't doing a dry run or ignoring scripts and we actually made changes to the dep - // tree, then run the dependencies scripts - if (!this[_dryRun] && !ignoreScripts && this.diff && this.diff.children.length) { - const { path, package: pkg } = this.actualTree.target - const stdio = this.options.foregroundScripts ? 'inherit' : 'pipe' - const { scripts = {} } = pkg - for (const event of ['predependencies', 'dependencies', 'postdependencies']) { - if (Object.prototype.hasOwnProperty.call(scripts, event)) { - const timer = `reify:run:${event}` - process.emit('time', timer) - log.info('run', pkg._id, event, scripts[event]) - await runScript({ - event, - path, - pkg, - stdio, - scriptShell: this.options.scriptShell, - }) - process.emit('timeEnd', timer) - } - } - } - } - } - - async dedupe (options = {}) { - // allow the user to set options on the ctor as well. - // XXX: deprecate separate method options objects. - options = { ...this.options, ...options } - const tree = await this.loadVirtual().catch(() => this.loadActual()) - const names = [] - for (const name of tree.inventory.query('name')) { - if (tree.inventory.query('name', name).size > 1) { - names.push(name) - } - } - return this.reify({ - ...options, - preferDedupe: true, - update: { names }, - }) - } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js index 387919f610829e..f7700ce9119de3 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js @@ -13,7 +13,7 @@ const _fixAvailable = Symbol('fixAvailable') const _checkTopNode = Symbol('checkTopNode') const _init = Symbol('init') const _omit = Symbol('omit') -const log = require('proc-log') +const { log, time } = require('proc-log') const fetch = require('npm-registry-fetch') @@ -117,7 +117,7 @@ class AuditReport extends Map { } async [_init] () { - process.emit('time', 'auditReport:init') + const timeEnd = time.start('auditReport:init') const promises = [] for (const [name, advisories] of Object.entries(this.report)) { @@ -210,7 +210,8 @@ class AuditReport extends Map { } } } - process.emit('timeEnd', 'auditReport:init') + + timeEnd() } [_checkTopNode] (topNode, vuln, spec) { @@ -306,7 +307,7 @@ class AuditReport extends Map { return null } - process.emit('time', 'auditReport:getReport') + const timeEnd = time.start('auditReport:getReport') try { try { // first try the super fast bulk advisory listing @@ -347,7 +348,7 @@ class AuditReport extends Map { this.error = er return null } finally { - process.emit('timeEnd', 'auditReport:getReport') + timeEnd() } } } 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 45ed9562479af2..bcd30d0f493c7e 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 @@ -31,6 +31,10 @@ const calcDepFlagsStep = (node) => { // 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 @@ -97,15 +101,18 @@ const unsetFlag = (node, flag) => { tree: node, visit: node => { node.extraneous = node[flag] = false - if (node.isLink) { + if (node.isLink && node.target) { node.target.extraneous = node.target[flag] = false } }, getChildren: node => { const children = [] - for (const edge of node.target.edgesOut.values()) { - if (edge.to && edge.to[flag] && - (flag !== 'peer' && edge.type === 'peer' || edge.type === 'prod') + const targetNode = node.isLink && node.target ? node.target : node + for (const edge of targetNode.edgesOut.values()) { + if ( + edge.to && + edge.to[flag] && + ((flag !== 'peer' && edge.type === 'peer') || edge.type === 'prod') ) { children.push(edge.to) } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/consistent-resolve.js b/deps/npm/node_modules/@npmcli/arborist/lib/consistent-resolve.js index 7c988048057c74..cbd3392a9300c7 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/consistent-resolve.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/consistent-resolve.js @@ -20,7 +20,7 @@ const consistentResolve = (resolved, fromPath, toPath, relPaths = false) => { raw, } = npa(resolved, fromPath) if (type === 'file' || type === 'directory') { - const cleanFetchSpec = fetchSpec.replace(/#/g, '%23') + const cleanFetchSpec = fetchSpec if (relPaths && toPath) { return `file:${relpath(toPath, cleanFetchSpec)}` } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/debug.js b/deps/npm/node_modules/@npmcli/arborist/lib/debug.js index aeda7229d5e8cb..d5197b46ef09a9 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/debug.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/debug.js @@ -18,14 +18,15 @@ const debug = process.env.ARBORIST_DEBUG !== '0' && ( /\barborist\b/.test(process.env.NODE_DEBUG || '') || process.env.npm_package_name === '@npmcli/arborist' && ['test', 'snap'].includes(process.env.npm_lifecycle_event) || - process.cwd() === require('path').resolve(__dirname, '..') + process.cwd() === require('node:path').resolve(__dirname, '..') ) module.exports = debug ? fn => fn() : () => {} const red = process.stderr.isTTY ? msg => `\x1B[31m${msg}\x1B[39m` : m => m module.exports.log = (...msg) => module.exports(() => { - const { format } = require('util') + const { format } = require('node:util') const prefix = `\n${process.pid} ${red(format(msg.shift()))} ` msg = (prefix + format(...msg).trim().split('\n').join(prefix)).trim() + /* eslint-disable-next-line no-console */ console.error(msg) }) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/dep-valid.js b/deps/npm/node_modules/@npmcli/arborist/lib/dep-valid.js index 4afb5e47cf111f..e80310d9663a95 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/dep-valid.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/dep-valid.js @@ -6,7 +6,7 @@ const semver = require('semver') const npa = require('npm-package-arg') -const { relative } = require('path') +const { relative } = require('node:path') const fromPath = require('./from-path.js') const depValid = (child, requested, requestor) => { @@ -124,7 +124,7 @@ const linkValid = (child, requested, requestor) => { return isLink && relative(child.realpath, requested.fetchSpec) === '' } -const tarballValid = (child, requested, requestor) => { +const tarballValid = (child, requested) => { if (child.isLink) { return false } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js index 0387773c297549..fb94407bb01660 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/diff.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/diff.js @@ -6,7 +6,7 @@ // for a given branch of the tree being mutated. const { depth } = require('treeverse') -const { existsSync } = require('fs') +const { existsSync } = require('node:fs') const ssri = require('ssri') diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/edge.js b/deps/npm/node_modules/@npmcli/arborist/lib/edge.js index cc9698ad6cae71..77ba196e68eeb5 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/edge.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/edge.js @@ -1,7 +1,7 @@ // An edge in the dependency graph // Represents a dependency relationship of some kind -const util = require('util') +const util = require('node:util') const npa = require('npm-package-arg') const depValid = require('./dep-valid.js') diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/from-path.js b/deps/npm/node_modules/@npmcli/arborist/lib/from-path.js index 761f15125b3432..f7e447495d1446 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/from-path.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/from-path.js @@ -3,7 +3,7 @@ // installed. directory (ie, symlink) deps also need to be resolved based on // their targets, but that's what realpath is -const { dirname } = require('path') +const { dirname } = require('node:path') const npa = require('npm-package-arg') const fromPath = (node, edge) => { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js b/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js index 0885034666b50a..7b3f294fdab2c3 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/inventory.js @@ -130,7 +130,7 @@ class Inventory extends Map { return super.get(node.location) === node } - set (k, v) { + set () { throw new Error('direct set() not supported, use inventory.add(node)') } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/link.js b/deps/npm/node_modules/@npmcli/arborist/lib/link.js index 197f96c5c2ddb9..42bc1faf488609 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/link.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/link.js @@ -2,7 +2,7 @@ const relpath = require('./relpath.js') const Node = require('./node.js') const _loadDeps = Symbol.for('Arborist.Node._loadDeps') const _target = Symbol.for('_target') -const { dirname } = require('path') +const { dirname } = require('node:path') // defined by Node class const _delistFromMeta = Symbol.for('_delistFromMeta') const _refreshLocation = Symbol.for('_refreshLocation') @@ -99,7 +99,7 @@ class Link extends Node { // the path/realpath guard is there for the benefit of setting // these things in the "wrong" order return this.path && this.realpath - ? `file:${relpath(dirname(this.path), this.realpath).replace(/#/g, '%23')}` + ? `file:${relpath(dirname(this.path), this.realpath)}` : null } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/node.js b/deps/npm/node_modules/@npmcli/arborist/lib/node.js index bdc021b7c12a99..dccbf99bf60804 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/node.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/node.js @@ -41,8 +41,8 @@ const gatherDepSet = require('./gather-dep-set.js') const treeCheck = require('./tree-check.js') const { walkUp } = require('walk-up-path') -const { resolve, relative, dirname, basename } = require('path') -const util = require('util') +const { resolve, relative, dirname, basename } = require('node:path') +const util = require('node:util') const _package = Symbol('_package') const _parent = Symbol('_parent') const _target = Symbol.for('_target') @@ -119,6 +119,8 @@ class Node { // package's dependencies in a virtual root. this.sourceReference = sourceReference + // TODO if this came from pacote.manifest we don't have to do this, + // we can be told to skip this step const pkg = sourceReference ? sourceReference.package : normalize(options.pkg || {}) @@ -840,7 +842,7 @@ class Node { } for (const [name, path] of this.#workspaces.entries()) { - new Edge({ from: this, name, spec: `file:${path.replace(/#/g, '%23')}`, type: 'workspace' }) + new Edge({ from: this, name, spec: `file:${path}`, type: 'workspace' }) } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/packument-cache.js b/deps/npm/node_modules/@npmcli/arborist/lib/packument-cache.js new file mode 100644 index 00000000000000..26e463eb9d334d --- /dev/null +++ b/deps/npm/node_modules/@npmcli/arborist/lib/packument-cache.js @@ -0,0 +1,77 @@ +const { LRUCache } = require('lru-cache') +const { getHeapStatistics } = require('node:v8') +const { log } = require('proc-log') + +// This is an in-memory cache that Pacote uses for packuments. +// Packuments are usually cached on disk. This allows for rapid re-requests +// of the same packument to bypass disk reads. The tradeoff here is memory +// usage for disk reads. +class PackumentCache extends LRUCache { + static #heapLimit = Math.floor(getHeapStatistics().heap_size_limit) + + #sizeKey + #disposed = new Set() + + #log (...args) { + log.silly('packumentCache', ...args) + } + + constructor ({ + // How much of this.#heapLimit to take up + heapFactor = 0.25, + // How much of this.#maxSize we allow any one packument to take up + // Anything over this is not cached + maxEntryFactor = 0.5, + sizeKey = '_contentLength', + } = {}) { + const maxSize = Math.floor(PackumentCache.#heapLimit * heapFactor) + const maxEntrySize = Math.floor(maxSize * maxEntryFactor) + super({ + maxSize, + maxEntrySize, + sizeCalculation: (p) => { + // Don't cache if we dont know the size + // Some versions of pacote set this to `0`, newer versions set it to `null` + if (!p[sizeKey]) { + return maxEntrySize + 1 + } + if (p[sizeKey] < 10_000) { + return p[sizeKey] * 2 + } + if (p[sizeKey] < 1_000_000) { + return Math.floor(p[sizeKey] * 1.5) + } + // It is less beneficial to store a small amount of super large things + // at the cost of all other packuments. + return maxEntrySize + 1 + }, + dispose: (v, k) => { + this.#disposed.add(k) + this.#log(k, 'dispose') + }, + }) + this.#sizeKey = sizeKey + this.#log(`heap:${PackumentCache.#heapLimit} maxSize:${maxSize} maxEntrySize:${maxEntrySize}`) + } + + set (k, v, ...args) { + // we use disposed only for a logging signal if we are setting packuments that + // have already been evicted from the cache previously. logging here could help + // us tune this in the future. + const disposed = this.#disposed.has(k) + /* istanbul ignore next - this doesnt happen consistently so hard to test without resorting to unit tests */ + if (disposed) { + this.#disposed.delete(k) + } + this.#log(k, 'set', `size:${v[this.#sizeKey]} disposed:${disposed}`) + return super.set(k, v, ...args) + } + + has (k, ...args) { + const has = super.has(k, ...args) + this.#log(k, `cache-${has ? 'hit' : 'miss'}`) + return has + } +} + +module.exports = PackumentCache diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js b/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js index e757d0c38a6d70..fca36eb6856137 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js @@ -8,8 +8,8 @@ // a result. const localeCompare = require('@isaacs/string-locale-compare')('en') -const log = require('proc-log') -const { cleanUrl } = require('npm-registry-fetch') +const { log } = require('proc-log') +const { redact } = require('@npmcli/redact') const deepestNestingTarget = require('./deepest-nesting-target.js') const CanPlaceDep = require('./can-place-dep.js') const { @@ -188,7 +188,7 @@ class PlaceDep { `${this.dep.name}@${this.dep.version}`, this.canPlace.description, `for: ${this.edge.from.package._id || this.edge.from.location}`, - `want: ${cleanUrl(this.edge.spec || '*')}` + `want: ${redact(this.edge.spec || '*')}` ) const placementType = this.canPlace.canPlace === CONFLICT diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/printable.js b/deps/npm/node_modules/@npmcli/arborist/lib/printable.js index 7c8d52a4207aaf..53c3f7a5756dfc 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/printable.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/printable.js @@ -1,7 +1,7 @@ // helper function to output a clearer visualization // of the current node and its descendents const localeCompare = require('@isaacs/string-locale-compare')('en') -const util = require('util') +const util = require('node:util') const relpath = require('./relpath.js') class ArboristNode { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js index c8ec866f0f9691..fa48d5f84b5562 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js @@ -1,9 +1,9 @@ 'use strict' -const { resolve } = require('path') +const { resolve } = require('node:path') const { parser, arrayDelimiter } = require('@npmcli/query') const localeCompare = require('@isaacs/string-locale-compare')('en') -const log = require('proc-log') +const { log } = require('proc-log') const { minimatch } = require('minimatch') const npa = require('npm-package-arg') const pacote = require('pacote') @@ -650,27 +650,27 @@ class Results { // operators for attribute selectors const attributeOperators = { // attribute value is equivalent - '=' ({ attr, value, insensitive }) { + '=' ({ attr, value }) { return attr === value }, // attribute value contains word - '~=' ({ attr, value, insensitive }) { + '~=' ({ attr, value }) { return (attr.match(/\w+/g) || []).includes(value) }, // attribute value contains string - '*=' ({ attr, value, insensitive }) { + '*=' ({ attr, value }) { return attr.includes(value) }, // attribute value is equal or starts with - '|=' ({ attr, value, insensitive }) { + '|=' ({ attr, value }) { return attr.startsWith(`${value}-`) }, // attribute value starts with - '^=' ({ attr, value, insensitive }) { + '^=' ({ attr, value }) { return attr.startsWith(value) }, // attribute value ends with - '$=' ({ attr, value, insensitive }) { + '$=' ({ attr, value }) { return attr.endsWith(value) }, } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/realpath.js b/deps/npm/node_modules/@npmcli/arborist/lib/realpath.js index 8dc20ab63d8365..6e5ad9b77ba5a5 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/realpath.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/realpath.js @@ -5,8 +5,8 @@ // built-in fs.realpath, because we only care about symbolic links, // so we can handle many fewer edge cases. -const { lstat, readlink } = require('fs/promises') -const { resolve, basename, dirname } = require('path') +const { lstat, readlink } = require('node:fs/promises') +const { resolve, basename, dirname } = require('node:path') const realpathCached = (path, rpcache, stcache, depth) => { // just a safety against extremely deep eloops diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/relpath.js b/deps/npm/node_modules/@npmcli/arborist/lib/relpath.js index e1960cfec02c75..a4187b5f6095fb 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/relpath.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/relpath.js @@ -1,3 +1,3 @@ -const { relative } = require('path') +const { relative } = require('node:path') const relpath = (from, to) => relative(from, to).replace(/\\/g, '/') module.exports = relpath diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/retire-path.js b/deps/npm/node_modules/@npmcli/arborist/lib/retire-path.js index 0c7a4a319e2798..5bff79a15a1654 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/retire-path.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/retire-path.js @@ -1,5 +1,5 @@ -const crypto = require('crypto') -const { dirname, basename, resolve } = require('path') +const crypto = require('node:crypto') +const { dirname, basename, resolve } = require('node:path') // use sha1 because it's faster, and collisions extremely unlikely anyway const pathSafeHash = s => diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js index e6525ffe67b65d..11703fad4b9254 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js @@ -33,7 +33,7 @@ const mismatch = (a, b) => a && b && a !== b // After calling this.commit(), any nodes not present in the tree will have // been removed from the shrinkwrap data as well. -const log = require('proc-log') +const { log } = require('proc-log') const YarnLock = require('./yarn-lock.js') const { readFile, @@ -42,14 +42,15 @@ const { rm, stat, writeFile, -} = require('fs/promises') +} = require('node:fs/promises') -const { resolve, basename, relative } = require('path') +const { resolve, basename, relative } = require('node:path') const specFromLock = require('./spec-from-lock.js') const versionFromTgz = require('./version-from-tgz.js') const npa = require('npm-package-arg') const pkgJson = require('@npmcli/package-json') const parseJSON = require('parse-conflict-json') +const nameFromFolder = require('@npmcli/name-from-folder') const stringify = require('json-stringify-nice') const swKeyOrder = [ @@ -233,7 +234,8 @@ class Shrinkwrap { // root to help prevent churn based on the name of the directory the // project is in const pname = node.packageName - if (pname && (node === node.root || pname !== node.name)) { + // when Target package name and Target node share the same name, we include the name, target node should have name as per realpath. + if (pname && (node === node.root || pname !== node.name || nameFromFolder(node.realpath) !== pname)) { meta.name = pname } @@ -815,7 +817,7 @@ class Shrinkwrap { if (!/^file:/.test(resolved)) { pathFixed = resolved } else { - pathFixed = `file:${resolve(this.path, resolved.slice(5)).replace(/#/g, '%23')}` + pathFixed = `file:${resolve(this.path, resolved.slice(5))}` } } @@ -1009,7 +1011,7 @@ class Shrinkwrap { } if (node.isLink) { - lock.version = `file:${relpath(this.path, node.realpath).replace(/#/g, '%23')}` + lock.version = `file:${relpath(this.path, node.realpath)}` } else if (spec && (spec.type === 'file' || spec.type === 'remote')) { lock.version = spec.saveSpec } else if (spec && spec.type === 'git' || rSpec.type === 'git') { @@ -1087,7 +1089,7 @@ class Shrinkwrap { // this especially shows up with workspace edges when the root // node is also a workspace in the set. const p = resolve(node.realpath, spec.slice('file:'.length)) - set[k] = `file:${relpath(node.realpath, p).replace(/#/g, '%23')}` + set[k] = `file:${relpath(node.realpath, p)}` } else { set[k] = spec } @@ -1145,6 +1147,7 @@ class Shrinkwrap { throw new Error('run load() before saving data') } + // This must be called before the lockfile conversion check below since it sets properties as part of `commit()` const json = this.toString(options) if ( !this.hiddenLockfile @@ -1152,9 +1155,11 @@ class Shrinkwrap { && this.originalLockfileVersion !== this.lockfileVersion ) { log.warn( - `Converting lock file (${relative(process.cwd(), this.filename)}) from v${this.originalLockfileVersion} -> v${this.lockfileVersion}` + 'shrinkwrap', + `Converting lock file (${relative(process.cwd(), this.filename)}) from v${this.originalLockfileVersion} -> v${this.lockfileVersion}` ) } + return Promise.all([ writeFile(this.filename, json).catch(er => { if (this.hiddenLockfile) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/tracker.js b/deps/npm/node_modules/@npmcli/arborist/lib/tracker.js index 5acb32a5a7cfd9..4a754d995dfcd2 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/tracker.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/tracker.js @@ -1,12 +1,12 @@ -const npmlog = require('npmlog') +const proggy = require('proggy') module.exports = cls => class Tracker extends cls { #progress = new Map() - #setProgress - constructor (options = {}) { - super(options) - this.#setProgress = !!options.progress + #createTracker (key, name) { + const tracker = new proggy.Tracker(name ?? key) + tracker.on('done', () => this.#progress.delete(key)) + this.#progress.set(key, tracker) } addTracker (section, subsection = null, key = null) { @@ -26,22 +26,17 @@ module.exports = cls => class Tracker extends cls { this.#onError(`Tracker "${section}" already exists`) } else if (!hasTracker && subsection === null) { // 1. no existing tracker, no subsection - // Create a new tracker from npmlog - // starts progress bar - if (this.#setProgress && this.#progress.size === 0) { - npmlog.enableProgress() - } - - this.#progress.set(section, npmlog.newGroup(section)) + // Create a new progress tracker + this.#createTracker(section) } else if (!hasTracker && subsection !== null) { // 2. no parent tracker and subsection this.#onError(`Parent tracker "${section}" does not exist`) } else if (!hasTracker || !hasSubtracker) { // 3. existing parent tracker, no subsection tracker - // Create a new subtracker in this.#progress from parent tracker - this.#progress.set(`${section}:${key}`, - this.#progress.get(section).newGroup(`${section}:${subsection}`) - ) + // Create a new subtracker and update parents + const parentTracker = this.#progress.get(section) + parentTracker.update(parentTracker.value, parentTracker.total + 1) + this.#createTracker(`${section}:${key}`, `${section}:${subsection}`) } // 4. existing parent tracker, existing subsection tracker // skip it @@ -70,32 +65,22 @@ module.exports = cls => class Tracker extends cls { this.finishTracker(section, key) } } - // remove parent tracker this.#progress.get(section).finish() - this.#progress.delete(section) - - // remove progress bar if all - // trackers are finished - if (this.#setProgress && this.#progress.size === 0) { - npmlog.disableProgress() - } } else if (!hasTracker && subsection === null) { // 1. no existing parent tracker, no subsection this.#onError(`Tracker "${section}" does not exist`) } else if (!hasTracker || hasSubtracker) { // 2. subtracker exists // Finish subtracker and remove from this.#progress + const parentTracker = this.#progress.get(section) + parentTracker.update(parentTracker.value + 1) this.#progress.get(`${section}:${key}`).finish() - this.#progress.delete(`${section}:${key}`) } // 3. existing parent tracker, no subsection } #onError (msg) { - if (this.#setProgress) { - npmlog.disableProgress() - } throw new Error(msg) } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/version-from-tgz.js b/deps/npm/node_modules/@npmcli/arborist/lib/version-from-tgz.js index 092cdbcbaf1326..77e3956c1c1713 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/version-from-tgz.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/version-from-tgz.js @@ -1,6 +1,6 @@ const semver = require('semver') -const { basename } = require('path') -const { URL } = require('url') +const { basename } = require('node:path') +const { URL } = require('node:url') module.exports = (name, tgz) => { const base = basename(tgz) if (!base.endsWith('.tgz')) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/yarn-lock.js b/deps/npm/node_modules/@npmcli/arborist/lib/yarn-lock.js index d5693a3eff943a..fc62806506acdc 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/yarn-lock.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/yarn-lock.js @@ -29,7 +29,7 @@ const localeCompare = require('@isaacs/string-locale-compare')('en') const consistentResolve = require('./consistent-resolve.js') -const { dirname } = require('path') +const { dirname } = require('node:path') const { breadth } = require('treeverse') // Sort Yarn entries respecting the yarn.lock sort order diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json index d7c393d99dfa57..9153139d2a8a87 100644 --- a/deps/npm/node_modules/@npmcli/arborist/package.json +++ b/deps/npm/node_modules/@npmcli/arborist/package.json @@ -1,47 +1,49 @@ { "name": "@npmcli/arborist", - "version": "7.4.1", + "version": "8.0.1", "description": "Manage node_modules trees", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.1.0", - "@npmcli/run-script": "^7.0.2", - "bin-links": "^4.0.1", - "cacache": "^18.0.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.1", - "json-parse-even-better-errors": "^3.0.0", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", "minimatch": "^9.0.4", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.2.0", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^10.0.5", + "ssri": "^12.0.0", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.1", + "@npmcli/template-oss": "4.24.4", "benchmark": "^2.1.4", - "minify-registry-metadata": "^3.0.0", + "minify-registry-metadata": "^4.0.0", "nock": "^13.3.3", "tap": "^16.3.8", "tar-stream": "^3.0.0", @@ -52,16 +54,17 @@ "posttest": "npm run lint", "snap": "tap", "test-proxy": "ARBORIST_TEST_PROXY=1 tap --snapshot", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "benchmark": "node scripts/benchmark.js", "benchclean": "rm -rf scripts/benchmark/*/", "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "repository": { "type": "git", - "url": "https://github.com/npm/cli.git", + "url": "git+https://github.com/npm/cli.git", "directory": "workspaces/arborist" }, "author": "GitHub Inc.", @@ -86,11 +89,11 @@ ] }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.24.4", "content": "../../scripts/template-oss/index.js" } } 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 09b0eceeea6b21..627d624be4a024 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js +++ b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js @@ -1,19 +1,16 @@ -const definitions = {} -module.exports = definitions - const Definition = require('./definition.js') const ciInfo = require('ci-info') -const querystring = require('querystring') -const { join } = require('path') +const querystring = require('node:querystring') +const { join } = require('node:path') const isWindows = process.platform === 'win32' // used by cafile flattening to flatOptions.ca -const fs = require('fs') +const { readFileSync } = require('node:fs') const maybeReadFile = file => { try { - return fs.readFileSync(file, 'utf8') + return readFileSync(file, 'utf8') } catch (er) { if (er.code !== 'ENOENT') { throw er @@ -64,7 +61,7 @@ const editor = process.env.EDITOR || const shell = isWindows ? process.env.ComSpec || 'cmd' : process.env.SHELL || 'sh' -const { networkInterfaces } = require('os') +const { networkInterfaces } = require('node:os') const getLocalAddresses = () => { try { return Object.values(networkInterfaces()).map( @@ -91,20 +88,12 @@ const cache = `${cacheRoot}/${cacheExtra}` // weird to pull out of the config module. // TODO: use better type definition/validation API, nopt's is so weird. const { - semver: { type: semver }, + semver: { type: Semver }, Umask: { type: Umask }, url: { type: url }, path: { type: path }, } = require('../type-defs.js') -const define = (key, def) => { - /* istanbul ignore if - this should never happen, prevents mistakes below */ - if (definitions[key]) { - throw new Error(`defining key more than once: ${key}`) - } - definitions[key] = new Definition(key, def) -} - // basic flattening function, just copy it over camelCase const flatten = (key, obj, flatOptions) => { const camel = key.replace(/-([a-z])/g, (_0, _1) => _1.toUpperCase()) @@ -135,12 +124,20 @@ const flatten = (key, obj, flatOptions) => { // while fixing some Arborist bug, we won't have to hunt through too // many places. -// Define all config keys we know about +// XXX: We should really deprecate all these `--save-blah` switches +// in favor of a single `--save-type` option. The unfortunate shortcut +// we took for `--save-peer --save-optional` being `--save-type=peerOptional` +// makes this tricky, and likely a breaking change. + +// Define all config keys we know about. They are indexed by their own key for +// ease of lookup later. This duplication is an optimization so that we don't +// have to do an extra function call just to "reuse" the key in both places. -define('_auth', { - default: null, - type: [null, String], - description: ` +const definitions = { + _auth: new Definition('_auth', { + default: null, + type: [null, String], + description: ` 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" @@ -149,16 +146,15 @@ define('_auth', { is safer to use a registry-provided authentication bearer token stored in the ~/.npmrc file by running \`npm login\`. `, - flatten, -}) - -define('access', { - default: null, - defaultDescription: ` + flatten, + }), + access: new Definition('access', { + default: null, + defaultDescription: ` 'public' for new packages, existing packages it will not change the current level `, - type: [null, 'restricted', 'public'], - description: ` + type: [null, 'restricted', 'public'], + description: ` If you do not want your scoped package to be publicly viewable (and installable) set \`--access=restricted\`. @@ -169,131 +165,121 @@ define('access', { publish will change the access for an existing package the same way that \`npm access set status\` would. `, - flatten, -}) - -define('all', { - default: false, - type: Boolean, - short: 'a', - description: ` + flatten, + }), + all: new Definition('all', { + default: false, + type: Boolean, + short: 'a', + description: ` 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. `, - flatten, -}) - -define('allow-same-version', { - default: false, - type: Boolean, - description: ` + flatten, + }), + 'allow-same-version': new Definition('allow-same-version', { + default: false, + type: Boolean, + description: ` Prevents throwing an error when \`npm version\` is used to set the new version to the same value as the current version. `, - flatten, -}) - -define('also', { - default: null, - type: [null, 'dev', 'development'], - description: ` - When set to \`dev\` or \`development\`, this is an alias for - \`--include=dev\`. - `, - deprecated: 'Please use --include=dev instead.', - flatten (key, obj, flatOptions) { - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('audit', { - default: true, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('audit-level', { - default: null, - type: [null, 'info', 'low', 'moderate', 'high', 'critical', 'none'], - description: ` + flatten, + }), + also: new Definition('also', { + default: null, + type: [null, 'dev', 'development'], + description: ` + When set to \`dev\` or \`development\`, this is an alias for + \`--include=dev\`. + `, + deprecated: 'Please use --include=dev instead.', + flatten (key, obj, flatOptions) { + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + audit: new Definition('audit', { + default: true, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'audit-level': new Definition('audit-level', { + default: null, + type: [null, 'info', 'low', 'moderate', 'high', 'critical', 'none'], + description: ` The minimum level of vulnerability for \`npm audit\` to exit with a non-zero exit code. - `, - flatten, -}) - -define('auth-type', { - default: 'web', - type: ['legacy', 'web'], - description: ` - What authentication strategy to use with \`login\`. - Note that if an \`otp\` config is given, this value will always be set to \`legacy\`. - `, - flatten, -}) - -define('before', { - default: null, - type: [null, Date], - description: ` - If passed to \`npm install\`, will rebuild the npm tree such that only - versions that were available **on or before** the \`--before\` time get - installed. If there's no versions available for the current set of - direct 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\`. - `, - flatten, -}) - -define('bin-links', { - default: true, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('browser', { - default: null, - defaultDescription: ` + `, + flatten, + }), + 'auth-type': new Definition('auth-type', { + default: 'web', + type: ['legacy', 'web'], + description: ` + What authentication strategy to use with \`login\`. + Note that if an \`otp\` config is given, this value will always be set to \`legacy\`. + `, + flatten, + }), + before: new Definition('before', { + default: null, + type: [null, Date], + description: ` + If passed to \`npm install\`, will rebuild the npm tree such that only + versions that were available **on or before** the \`--before\` time get + installed. If there's no versions available for the current set of + direct 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\`. + `, + flatten, + }), + 'bin-links': new Definition('bin-links', { + default: true, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + browser: new Definition('browser', { + default: null, + defaultDescription: ` OS X: \`"open"\`, Windows: \`"start"\`, Others: \`"xdg-open"\` - `, - type: [null, Boolean, String], - description: ` + `, + type: [null, Boolean, String], + description: ` The browser that is called by npm commands to open websites. Set to \`false\` to suppress browser behavior and instead print urls to terminal. Set to \`true\` to use default system URL opener. - `, - flatten, -}) - -define('ca', { - default: null, - type: [null, String, Array], - description: ` + `, + flatten, + }), + ca: new Definition('ca', { + default: null, + type: [null, String, Array], + description: ` 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 + calls it "Base-64 encoded X.509 (.CER)") with newlines replaced by the string "\\n". For example: \`\`\`ini @@ -312,2124 +298,1985 @@ define('ca', { See also the \`strict-ssl\` config. `, - flatten, -}) - -define('cache', { - default: cache, - defaultDescription: ` - Windows: \`%LocalAppData%\\npm-cache\`, Posix: \`~/.npm\` - `, - type: path, - description: ` - The location of npm's cache directory. - `, - flatten (key, obj, flatOptions) { - flatOptions.cache = join(obj.cache, '_cacache') - flatOptions.npxCache = join(obj.cache, '_npx') - flatOptions.tufCache = join(obj.cache, '_tuf') - }, -}) - -define('cache-max', { - default: Infinity, - type: Number, - description: ` - \`--cache-max=0\` is an alias for \`--prefer-online\` - `, - deprecated: ` - This option has been deprecated in favor of \`--prefer-online\` - `, - flatten (key, obj, flatOptions) { - if (obj[key] <= 0) { - flatOptions.preferOnline = true - } - }, -}) - -define('cache-min', { - default: 0, - type: Number, - description: ` - \`--cache-min=9999 (or bigger)\` is an alias for \`--prefer-offline\`. - `, - deprecated: ` - This option has been deprecated in favor of \`--prefer-offline\`. - `, - flatten (key, obj, flatOptions) { - if (obj[key] >= 9999) { - flatOptions.preferOffline = true - } - }, -}) - -define('cafile', { - default: null, - type: path, - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - // always set to null in defaults - if (!obj.cafile) { - return - } - - const raw = maybeReadFile(obj.cafile) - if (!raw) { - return - } - - const delim = '-----END CERTIFICATE-----' - flatOptions.ca = raw.replace(/\r\n/g, '\n').split(delim) - .filter(section => section.trim()) - .map(section => section.trimLeft() + delim) - }, -}) - -define('call', { - default: '', - type: String, - short: 'c', - description: ` - 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" - \`\`\` - `, - flatten, -}) - -define('cert', { - default: null, - type: [null, String], - description: ` - 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-----" - \`\`\` - - It is _not_ the path to a certificate file, though you can set a registry-scoped - "certfile" path like "//other-registry.tld/:certfile=/path/to/cert.pem". - `, - 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 - //other-registry.tld/:certfile=/path/to/cert.crt - `, - flatten, -}) - -define('cidr', { - default: null, - type: [null, String, Array], - description: ` - This is a list of CIDR address to be used when configuring limited access - tokens with the \`npm token create\` command. - `, - flatten, -}) - -// This should never be directly used, the flattened value is the derived value -// and is sent to other modules, and is also exposed as `npm.color` for use -// inside npm itself. -define('color', { - default: !process.env.NO_COLOR || process.env.NO_COLOR === '0', - usage: '--color|--no-color|--color always', - defaultDescription: ` - true unless the NO_COLOR environ is set to something other than '0' - `, - type: ['always', Boolean], - description: ` - If false, never shows colors. If \`"always"\` then always shows colors. - If true, then only prints color codes for tty file descriptors. - `, - flatten (key, obj, flatOptions) { - flatOptions.color = !obj.color ? false - : obj.color === 'always' ? true - : !!process.stdout.isTTY - flatOptions.logColor = !obj.color ? false - : obj.color === 'always' ? true - : !!process.stderr.isTTY - }, -}) - -define('commit-hooks', { - default: true, - type: Boolean, - description: ` - Run git commit hooks when using the \`npm version\` command. - `, - flatten, -}) - -define('cpu', { - default: null, - type: [null, String], - description: ` - Override CPU architecture of native modules to install. - Acceptable values are same as \`cpu\` field of package.json, - which comes from \`process.arch\`. - `, - flatten, -}) - -define('os', { - default: null, - type: [null, String], - description: ` - Override OS of native modules to install. - Acceptable values are same as \`os\` field of package.json, - which comes from \`process.platform\`. - `, - flatten, -}) - -define('libc', { - default: null, - type: [null, String], - description: ` - Override libc of native modules to install. - Acceptable values are same as \`libc\` field of package.json - `, - flatten, -}) - -define('depth', { - default: null, - defaultDescription: ` - \`Infinity\` if \`--all\` is set, otherwise \`1\` - `, - type: [null, Number], - description: ` - 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. - `, - flatten, -}) - -define('description', { - default: true, - type: Boolean, - usage: '--no-description', - description: ` - Show the description in \`npm search\` - `, - flatten (key, obj, flatOptions) { - flatOptions.search = flatOptions.search || { limit: 20 } - flatOptions.search[key] = obj[key] - }, -}) - -define('dev', { - default: false, - type: Boolean, - description: ` - Alias for \`--include=dev\`. - `, - deprecated: 'Please use --include=dev instead.', - flatten (key, obj, flatOptions) { - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('diff', { - default: [], - hint: '', - type: [String, Array], - description: ` - Define arguments to compare in \`npm diff\`. - `, - flatten, -}) - -define('diff-ignore-all-space', { - default: false, - type: Boolean, - description: ` - Ignore whitespace when comparing lines in \`npm diff\`. - `, - flatten, -}) - -define('diff-name-only', { - default: false, - type: Boolean, - description: ` - Prints only filenames when using \`npm diff\`. - `, - flatten, -}) - -define('diff-no-prefix', { - default: false, - type: Boolean, - description: ` - Do not show any source or destination prefix in \`npm diff\` output. - - Note: this causes \`npm diff\` to ignore the \`--diff-src-prefix\` and - \`--diff-dst-prefix\` configs. - `, - flatten, -}) - -define('diff-dst-prefix', { - default: 'b/', - hint: '', - type: String, - description: ` - Destination prefix to be used in \`npm diff\` output. - `, - flatten, -}) - -define('diff-src-prefix', { - default: 'a/', - hint: '', - type: String, - description: ` - Source prefix to be used in \`npm diff\` output. - `, - flatten, -}) - -define('diff-text', { - default: false, - type: Boolean, - description: ` - Treat all files as text in \`npm diff\`. - `, - flatten, -}) - -define('diff-unified', { - default: 3, - type: Number, - description: ` - The number of lines of context to print in \`npm diff\`. - `, - flatten, -}) - -define('dry-run', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('editor', { - default: editor, - defaultDescription: ` - The EDITOR or VISUAL environment variables, or '%SYSTEMROOT%\\notepad.exe' on Windows, - or 'vi' on Unix systems - `, - type: String, - description: ` - The command to run for \`npm edit\` and \`npm config edit\`. - `, - flatten, -}) - -define('engine-strict', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('expect-results', { - default: null, - type: [null, Boolean], - exclusive: ['expect-result-count'], - description: ` - Tells npm whether or not to expect results from the command. - Can be either true (expect some results) or false (expect no results). - `, -}) - -define('expect-result-count', { - default: null, - type: [null, Number], - hint: '', - exclusive: ['expect-results'], - description: ` - Tells to expect a specific number of results from the command. - `, -}) - -define('fetch-retries', { - default: 2, - type: Number, - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - flatOptions.retry = flatOptions.retry || {} - flatOptions.retry.retries = obj[key] - }, -}) - -define('fetch-retry-factor', { - default: 10, - type: Number, - description: ` - The "factor" config for the \`retry\` module to use when fetching - packages. - `, - flatten (key, obj, flatOptions) { - flatOptions.retry = flatOptions.retry || {} - flatOptions.retry.factor = obj[key] - }, -}) - -define('fetch-retry-maxtimeout', { - default: 60000, - defaultDescription: '60000 (1 minute)', - type: Number, - description: ` - The "maxTimeout" config for the \`retry\` module to use when fetching - packages. - `, - flatten (key, obj, flatOptions) { - flatOptions.retry = flatOptions.retry || {} - flatOptions.retry.maxTimeout = obj[key] - }, -}) - -define('fetch-retry-mintimeout', { - default: 10000, - defaultDescription: '10000 (10 seconds)', - type: Number, - description: ` - The "minTimeout" config for the \`retry\` module to use when fetching - packages. - `, - flatten (key, obj, flatOptions) { - flatOptions.retry = flatOptions.retry || {} - flatOptions.retry.minTimeout = obj[key] - }, -}) - -define('fetch-timeout', { - default: 5 * 60 * 1000, - defaultDescription: `${5 * 60 * 1000} (5 minutes)`, - type: Number, - description: ` - The maximum amount of time to wait for HTTP requests to complete. - `, - flatten (key, obj, flatOptions) { - flatOptions.timeout = obj[key] - }, -}) - -define('force', { - default: false, - type: Boolean, - short: 'f', - description: ` - Removes various protections against unfortunate side effects, common - 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 unpublishing all versions of a published package. - * 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). - - If you don't have a clear idea of what you want to do, it is strongly - recommended that you do not use this option! - `, - flatten, -}) - -define('foreground-scripts', { - default: false, - defaultDescription: `\`false\` unless when using \`npm pack\` or \`npm publish\` where it - defaults to \`true\``, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('format-package-lock', { - default: true, - type: Boolean, - description: ` - Format \`package-lock.json\` or \`npm-shrinkwrap.json\` as a human - readable file. - `, - flatten, -}) - -define('fund', { - default: true, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('git', { - default: 'git', - type: String, - description: ` - 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. - `, - flatten, -}) - -define('git-tag-version', { - default: true, - type: Boolean, - description: ` - Tag the commit when using the \`npm version\` command. Setting this to - false results in no commit being made at all. - `, - flatten, -}) - -define('global', { - default: false, - type: Boolean, - short: 'g', - description: ` - 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. - * bin files are linked to \`{prefix}/bin\` - * man pages are linked to \`{prefix}/share/man\` - `, - flatten: (key, obj, flatOptions) => { - flatten(key, obj, flatOptions) - if (flatOptions.global) { - flatOptions.location = 'global' - } - }, -}) - -// the globalconfig has its default defined outside of this module -define('globalconfig', { - type: path, - default: '', - defaultDescription: ` - The global --prefix setting plus 'etc/npmrc'. For example, - '/usr/local/etc/npmrc' - `, - description: ` - The config file to read for global config options. - `, - flatten, -}) - -define('global-style', { - default: false, - type: Boolean, - description: ` - Only install direct dependencies in the top level \`node_modules\`, - but hoist on deeper dependencies. - Sets \`--install-strategy=shallow\`. - `, - deprecated: ` - This option has been deprecated in favor of \`--install-strategy=shallow\` - `, - flatten (key, obj, flatOptions) { - if (obj[key]) { - obj['install-strategy'] = 'shallow' - flatOptions.installStrategy = 'shallow' - } - }, -}) - -define('heading', { - default: 'npm', - type: String, - description: ` - The string that starts all the debugging log output. - `, - flatten, -}) - -define('https-proxy', { - default: null, - type: [null, url], - description: ` - 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. - `, - flatten, -}) - -define('if-present', { - default: false, - type: Boolean, - envExport: false, - description: ` - If true, npm will not exit with an error code when \`run-script\` 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. - `, - flatten, -}) - -define('ignore-scripts', { - default: false, - type: Boolean, - description: ` - 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-script\` will still run their intended script if \`ignore-scripts\` is - set, but they will *not* run any pre- or post-scripts. - `, - flatten, -}) - -define('include', { - default: [], - type: [Array, 'prod', 'dev', 'optional', 'peer'], - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - // just call the omit flattener, it reads from obj.include - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('include-staged', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('include-workspace-root', { - default: false, - type: Boolean, - envExport: false, - description: ` - 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. - `, - flatten, -}) - -define('init-author-email', { - default: '', - hint: '', - type: String, - description: ` - The value \`npm init\` should use by default for the package author's - email. - `, -}) - -define('init-author-name', { - default: '', - hint: '', - type: String, - description: ` - The value \`npm init\` should use by default for the package author's name. - `, -}) - -define('init-author-url', { - default: '', - type: ['', url], - hint: '', - description: ` - The value \`npm init\` should use by default for the package author's homepage. - `, -}) - -define('init-license', { - default: 'ISC', - hint: '', - type: String, - description: ` - The value \`npm init\` should use by default for the package license. - `, -}) - -define('init-module', { - default: '~/.npm-init.js', - type: path, - hint: '', - description: ` - 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). - `, -}) - -define('init-version', { - default: '1.0.0', - type: semver, - hint: '', - description: ` - The value that \`npm init\` should use by default for the package - version number, if not already set in package.json. - `, -}) - -// these "aliases" are historically supported in .npmrc files, unfortunately -// They should be removed in a future npm version. -define('init.author.email', { - default: '', - type: String, - deprecated: ` - Use \`--init-author-email\` instead.`, - description: ` - Alias for \`--init-author-email\` - `, -}) - -define('init.author.name', { - default: '', - type: String, - deprecated: ` - Use \`--init-author-name\` instead. - `, - description: ` - Alias for \`--init-author-name\` - `, -}) - -define('init.author.url', { - default: '', - type: ['', url], - deprecated: ` - Use \`--init-author-url\` instead. - `, - description: ` - Alias for \`--init-author-url\` - `, -}) - -define('init.license', { - default: 'ISC', - type: String, - deprecated: ` - Use \`--init-license\` instead. - `, - description: ` - Alias for \`--init-license\` - `, -}) - -define('init.module', { - default: '~/.npm-init.js', - type: path, - deprecated: ` - Use \`--init-module\` instead. - `, - description: ` - Alias for \`--init-module\` - `, -}) - -define('init.version', { - default: '1.0.0', - type: semver, - deprecated: ` - Use \`--init-version\` instead. - `, - description: ` - Alias for \`--init-version\` - `, -}) - -define('install-links', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('install-strategy', { - default: 'hoisted', - type: ['hoisted', 'nested', 'shallow', 'linked'], - description: ` - 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. - `, - flatten, -}) - -define('json', { - default: false, - type: Boolean, - description: ` - 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\`. - - Not supported by all npm commands. - `, - flatten, -}) - -define('key', { - default: null, - type: [null, String], - description: ` - 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". - `, - 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 - //other-registry.tld/:certfile=/path/to/cert.crt - `, - flatten, -}) - -define('legacy-bundling', { - default: false, - type: Boolean, - description: ` - 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\`. - `, - deprecated: ` - This option has been deprecated in favor of \`--install-strategy=nested\` - `, - flatten (key, obj, flatOptions) { - if (obj[key]) { - obj['install-strategy'] = 'nested' - flatOptions.installStrategy = 'nested' - } - }, -}) - -define('legacy-peer-deps', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('link', { - default: false, - type: Boolean, - description: ` - Used with \`npm ls\`, limiting output to only those packages that are - linked. - `, -}) - -define('local-address', { - default: null, - type: getLocalAddresses(), - typeDescription: 'IP Address', - description: ` - 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. - `, - flatten, -}) - -define('sbom-format', { - default: null, - type: [ - 'cyclonedx', - 'spdx', - ], - description: ` - SBOM format to use when generating SBOMs. - `, - flatten, -}) - -define('sbom-type', { - default: 'library', - type: [ - 'library', - 'application', - 'framework', - ], - description: ` - 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. - `, - flatten, -}) - -define('location', { - default: 'user', - short: 'L', - type: [ - 'global', - 'user', - 'project', - ], - defaultDescription: ` - "user" unless \`--global\` is passed, which will also set this value to "global" - `, - description: ` - 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. - - * 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\` - `, - flatten: (key, obj, flatOptions) => { - flatten(key, obj, flatOptions) - if (flatOptions.global) { - flatOptions.location = 'global' - } - if (obj.location === 'global') { - flatOptions.global = true - } - }, -}) - -define('lockfile-version', { - default: null, - type: [null, 1, 2, 3, '1', '2', '3'], - defaultDescription: ` - Version 3 if no lockfile, auto-converting v1 lockfiles to v3, otherwise - maintain current lockfile version.`, - description: ` - 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. - `, - flatten: (key, obj, flatOptions) => { - flatOptions.lockfileVersion = obj[key] && parseInt(obj[key], 10) - }, -}) - -define('loglevel', { - default: 'notice', - type: [ - 'silent', - 'error', - 'warn', - 'notice', - 'http', - 'info', - 'verbose', - 'silly', - ], - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - flatOptions.silent = obj[key] === 'silent' - }, -}) - -define('logs-dir', { - default: null, - type: [null, path], - defaultDescription: ` - A directory named \`_logs\` inside the cache -`, - description: ` - The location of npm's log directory. See [\`npm - logging\`](/using-npm/logging) for more information. - `, -}) - -define('logs-max', { - default: 10, - type: Number, - description: ` - The maximum number of log files to store. - - If set to 0, no log files will be written for the current run. - `, -}) - -define('long', { - default: false, - type: Boolean, - short: 'l', - description: ` - Show extended information in \`ls\`, \`search\`, and \`help-search\`. - `, -}) - -define('maxsockets', { - default: 15, - type: Number, - description: ` - The maximum number of connections to use per origin (protocol/host/port - combination). - `, - flatten (key, obj, flatOptions) { - flatOptions.maxSockets = obj[key] - }, -}) - -define('message', { - default: '%s', - type: String, - short: 'm', - description: ` - Commit message which is used by \`npm version\` when creating version commit. - - Any "%s" in the message will be replaced with the version number. - `, - flatten, -}) - -define('node-options', { - default: null, - type: [null, String], - description: ` - 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. - `, -}) - -define('noproxy', { - default: '', - defaultDescription: ` - The value of the NO_PROXY environment variable - `, - type: [String, Array], - description: ` - Domain extensions that should bypass any proxies. - - Also accepts a comma-delimited string. - `, - flatten (key, obj, flatOptions) { - if (Array.isArray(obj[key])) { - flatOptions.noProxy = obj[key].join(',') - } else { - flatOptions.noProxy = obj[key] - } - }, -}) - -define('offline', { - default: false, - type: Boolean, - description: ` - Force offline mode: no network requests will be done during install. To allow - the CLI to fill in missing cache data, see \`--prefer-offline\`. - `, - flatten, -}) - -define('omit', { - default: process.env.NODE_ENV === 'production' ? ['dev'] : [], - defaultDescription: ` - 'dev' if the \`NODE_ENV\` environment variable is set to 'production', - otherwise empty. - `, - type: [Array, 'dev', 'optional', 'peer'], - description: ` - Dependency types to omit from the installation tree on disk. - - 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. - `, - flatten (key, obj, flatOptions) { - flatOptions.omit = buildOmitList(obj) - }, -}) - -define('omit-lockfile-registry-resolved', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('only', { - default: null, - type: [null, 'prod', 'production'], - deprecated: ` - Use \`--omit=dev\` to omit dev dependencies from the install. - `, - description: ` - When set to \`prod\` or \`production\`, this is an alias for - \`--omit=dev\`. - `, - flatten (key, obj, flatOptions) { - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('optional', { - default: null, - type: [null, Boolean], - deprecated: ` - Use \`--omit=optional\` to exclude optional dependencies, or - \`--include=optional\` to include them. - - Default value does install optional deps unless otherwise omitted. - `, - description: ` - Alias for --include=optional or --omit=optional - `, - flatten (key, obj, flatOptions) { - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('otp', { - default: null, - type: [null, String], - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - flatten(key, obj, flatOptions) - if (obj.otp) { - obj['auth-type'] = 'legacy' - flatten('auth-type', obj, flatOptions) - } - }, -}) - -define('package', { - default: [], - hint: '', - type: [String, Array], - description: ` - The package or packages to install for [\`npm exec\`](/commands/npm-exec) - `, - flatten, -}) - -define('package-lock', { - default: true, - type: Boolean, - description: ` - If set to false, then ignore \`package-lock.json\` files when installing. - This will also prevent _writing_ \`package-lock.json\` if \`save\` is - true. - `, - flatten: (key, obj, flatOptions) => { - flatten(key, obj, flatOptions) - if (flatOptions.packageLockOnly) { - flatOptions.packageLock = true - } - }, -}) - -define('package-lock-only', { - default: false, - type: Boolean, - description: ` - 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\`. - `, - flatten: (key, obj, flatOptions) => { - flatten(key, obj, flatOptions) - if (flatOptions.packageLockOnly) { - flatOptions.packageLock = true - } - }, -}) - -define('pack-destination', { - default: '.', - type: String, - description: ` - Directory in which \`npm pack\` will save tarballs. - `, - flatten, -}) - -define('parseable', { - default: false, - type: Boolean, - short: 'p', - description: ` - Output parseable results from commands that write to standard output. For - \`npm search\`, this will be tab-separated table format. - `, - flatten, -}) - -define('prefer-dedupe', { - default: false, - type: Boolean, - description: ` - Prefer to deduplicate packages if possible, rather than - choosing a newer version of a dependency. - `, - flatten, -}) - -define('prefer-offline', { - default: false, - type: Boolean, - description: ` - 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\`. - `, - flatten, -}) - -define('prefer-online', { - default: false, - type: Boolean, - description: ` - If true, staleness checks for cached data will be forced, making the CLI - look for updates immediately even for fresh package data. - `, - flatten, -}) - -// `prefix` has its default defined outside of this module -define('prefix', { - type: path, - short: 'C', - default: '', - defaultDescription: ` - 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. - `, - description: ` - The location to install global items. If set on the command line, then - it forces non-global commands to run in the specified folder. - `, -}) - -define('preid', { - default: '', - hint: 'prerelease-id', - type: String, - description: ` - The "prerelease identifier" to use as a prefix for the "prerelease" part - of a semver. Like the \`rc\` in \`1.2.0-rc.8\`. - `, - flatten, -}) - -define('production', { - default: null, - type: [null, Boolean], - deprecated: 'Use `--omit=dev` instead.', - description: 'Alias for `--omit=dev`', - flatten (key, obj, flatOptions) { - definitions.omit.flatten('omit', obj, flatOptions) - }, -}) - -define('progress', { - default: !ciInfo.isCI, - defaultDescription: ` - \`true\` unless running in a known CI system - `, - type: Boolean, - description: ` - When set to \`true\`, npm will display a progress bar during time - intensive operations, if \`process.stderr\` is a TTY. - - Set to \`false\` to suppress the progress bar. - `, - flatten (key, obj, flatOptions) { - flatOptions.progress = !obj.progress ? false - : !!process.stderr.isTTY && process.env.TERM !== 'dumb' - }, -}) - -define('provenance', { - default: false, - type: Boolean, - exclusive: ['provenance-file'], - description: ` - When publishing from a supported cloud CI/CD system, the package will be - publicly linked to where it was built and published from. - `, - flatten, -}) - -define('provenance-file', { - default: null, - type: path, - hint: '', - exclusive: ['provenance'], - description: ` - When publishing, the provenance bundle at the given path will be used. - `, - flatten, -}) - -define('proxy', { - default: null, - type: [null, false, url], // allow proxy to be disabled explicitly - description: ` - 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. - `, - flatten, -}) - -define('read-only', { - default: false, - type: Boolean, - description: ` - This is used to mark a token as unable to publish when configuring - limited access tokens with the \`npm token create\` command. - `, - flatten, -}) - -define('rebuild-bundle', { - default: true, - type: Boolean, - description: ` - Rebuild bundled dependencies after installation. - `, - flatten, -}) - -define('registry', { - default: 'https://registry.npmjs.org/', - type: url, - description: ` - The base URL of the npm registry. - `, - flatten, -}) - -define('replace-registry-host', { - default: 'npmjs', - hint: ' | hostname', - type: ['npmjs', 'never', 'always', String], - description: ` - 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. - - You may also specify a bare hostname (e.g., "registry.npmjs.org"). - `, - flatten, -}) - -define('save', { - default: true, - defaultDescription: `\`true\` unless when using \`npm update\` where it - defaults to \`false\``, - usage: '-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle', - type: Boolean, - short: 'S', - description: ` - 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\`. - `, - flatten, -}) - -define('save-bundle', { - default: false, - type: Boolean, - short: 'B', - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - // XXX update arborist to just ignore it if resulting saveType is peer - // otherwise this won't have the expected effect: - // - // npm config set save-peer true - // npm i foo --save-bundle --save-prod <-- should bundle - flatOptions.saveBundle = obj['save-bundle'] && !obj['save-peer'] - }, -}) + flatten, + }), + cache: new Definition('cache', { + default: cache, + defaultDescription: ` + Windows: \`%LocalAppData%\\npm-cache\`, Posix: \`~/.npm\` + `, + type: path, + description: ` + The location of npm's cache directory. + `, + flatten (key, obj, flatOptions) { + flatOptions.cache = join(obj.cache, '_cacache') + flatOptions.npxCache = join(obj.cache, '_npx') + flatOptions.tufCache = join(obj.cache, '_tuf') + }, + }), + 'cache-max': new Definition('cache-max', { + default: Infinity, + type: Number, + description: ` + \`--cache-max=0\` is an alias for \`--prefer-online\` + `, + deprecated: ` + This option has been deprecated in favor of \`--prefer-online\` + `, + flatten (key, obj, flatOptions) { + if (obj[key] <= 0) { + flatOptions.preferOnline = true + } + }, + }), + 'cache-min': new Definition('cache-min', { + default: 0, + type: Number, + description: ` + \`--cache-min=9999 (or bigger)\` is an alias for \`--prefer-offline\`. + `, + deprecated: ` + This option has been deprecated in favor of \`--prefer-offline\`. + `, + flatten (key, obj, flatOptions) { + if (obj[key] >= 9999) { + flatOptions.preferOffline = true + } + }, + }), + cafile: new Definition('cafile', { + default: null, + type: path, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + // always set to null in defaults + if (!obj.cafile) { + return + } -// XXX: We should really deprecate all these `--save-blah` switches -// in favor of a single `--save-type` option. The unfortunate shortcut -// we took for `--save-peer --save-optional` being `--save-type=peerOptional` -// makes this tricky, and likely a breaking change. + const raw = maybeReadFile(obj.cafile) + if (!raw) { + return + } -define('save-dev', { - default: false, - type: Boolean, - short: 'D', - description: ` - Save installed packages to a package.json file as \`devDependencies\`. - `, - flatten (key, obj, flatOptions) { - if (!obj[key]) { - if (flatOptions.saveType === 'dev') { - delete flatOptions.saveType + const delim = '-----END CERTIFICATE-----' + flatOptions.ca = raw.replace(/\r\n/g, '\n').split(delim) + .filter(section => section.trim()) + .map(section => section.trimLeft() + delim) + }, + }), + call: new Definition('call', { + default: '', + type: String, + short: 'c', + description: ` + 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" + \`\`\` + `, + flatten, + }), + cert: new Definition('cert', { + default: null, + type: [null, String], + description: ` + 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-----" + \`\`\` + + It is _not_ the path to a certificate file, though you can set a registry-scoped + "certfile" path like "//other-registry.tld/:certfile=/path/to/cert.pem". + `, + 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 + //other-registry.tld/:certfile=/path/to/cert.crt + `, + flatten, + }), + cidr: new Definition('cidr', { + default: null, + type: [null, String, Array], + description: ` + This is a list of CIDR address to be used when configuring limited access + tokens with the \`npm token create\` command. + `, + flatten, + }), + // This should never be directly used, the flattened value is the derived value + // and is sent to other modules, and is also exposed as `npm.color` for use + // inside npm itself. + color: new Definition('color', { + default: !process.env.NO_COLOR || process.env.NO_COLOR === '0', + usage: '--color|--no-color|--color always', + defaultDescription: ` + true unless the NO_COLOR environ is set to something other than '0' + `, + type: ['always', Boolean], + description: ` + If false, never shows colors. If \`"always"\` then always shows colors. + If true, then only prints color codes for tty file descriptors. + `, + flatten (key, obj, flatOptions) { + flatOptions.color = !obj.color ? false + : obj.color === 'always' ? true + : !!process.stdout.isTTY + flatOptions.logColor = !obj.color ? false + : obj.color === 'always' ? true + : !!process.stderr.isTTY + }, + }), + 'commit-hooks': new Definition('commit-hooks', { + default: true, + type: Boolean, + description: ` + Run git commit hooks when using the \`npm version\` command. + `, + flatten, + }), + cpu: new Definition('cpu', { + default: null, + type: [null, String], + description: ` + Override CPU architecture of native modules to install. + Acceptable values are same as \`cpu\` field of package.json, + which comes from \`process.arch\`. + `, + flatten, + }), + depth: new Definition('depth', { + default: null, + defaultDescription: ` + \`Infinity\` if \`--all\` is set, otherwise \`1\` + `, + type: [null, Number], + description: ` + 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. + `, + flatten, + }), + description: new Definition('description', { + default: true, + type: Boolean, + usage: '--no-description', + description: ` + Show the description in \`npm search\` + `, + flatten (key, obj, flatOptions) { + flatOptions.search = flatOptions.search || { limit: 20 } + flatOptions.search[key] = obj[key] + }, + }), + dev: new Definition('dev', { + default: false, + type: Boolean, + description: ` + Alias for \`--include=dev\`. + `, + deprecated: 'Please use --include=dev instead.', + flatten (key, obj, flatOptions) { + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + diff: new Definition('diff', { + default: [], + hint: '', + type: [String, Array], + description: ` + Define arguments to compare in \`npm diff\`. + `, + flatten, + }), + 'diff-ignore-all-space': new Definition('diff-ignore-all-space', { + default: false, + type: Boolean, + description: ` + Ignore whitespace when comparing lines in \`npm diff\`. + `, + flatten, + }), + 'diff-name-only': new Definition('diff-name-only', { + default: false, + type: Boolean, + description: ` + Prints only filenames when using \`npm diff\`. + `, + flatten, + }), + 'diff-no-prefix': new Definition('diff-no-prefix', { + default: false, + type: Boolean, + description: ` + Do not show any source or destination prefix in \`npm diff\` output. + + Note: this causes \`npm diff\` to ignore the \`--diff-src-prefix\` and + \`--diff-dst-prefix\` configs. + `, + flatten, + }), + 'diff-dst-prefix': new Definition('diff-dst-prefix', { + default: 'b/', + hint: '', + type: String, + description: ` + Destination prefix to be used in \`npm diff\` output. + `, + flatten, + }), + 'diff-src-prefix': new Definition('diff-src-prefix', { + default: 'a/', + hint: '', + type: String, + description: ` + Source prefix to be used in \`npm diff\` output. + `, + flatten, + }), + 'diff-text': new Definition('diff-text', { + default: false, + type: Boolean, + description: ` + Treat all files as text in \`npm diff\`. + `, + flatten, + }), + 'diff-unified': new Definition('diff-unified', { + default: 3, + type: Number, + description: ` + The number of lines of context to print in \`npm diff\`. + `, + flatten, + }), + 'dry-run': new Definition('dry-run', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + editor: new Definition('editor', { + default: editor, + defaultDescription: ` + The EDITOR or VISUAL environment variables, or '%SYSTEMROOT%\\notepad.exe' on Windows, + or 'vi' on Unix systems + `, + type: String, + description: ` + The command to run for \`npm edit\` and \`npm config edit\`. + `, + flatten, + }), + 'engine-strict': new Definition('engine-strict', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'expect-result-count': new Definition('expect-result-count', { + default: null, + type: [null, Number], + hint: '', + exclusive: ['expect-results'], + description: ` + Tells to expect a specific number of results from the command. + `, + }), + 'expect-results': new Definition('expect-results', { + default: null, + type: [null, Boolean], + exclusive: ['expect-result-count'], + description: ` + Tells npm whether or not to expect results from the command. + Can be either true (expect some results) or false (expect no results). + `, + }), + 'fetch-retries': new Definition('fetch-retries', { + default: 2, + type: Number, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.retry = flatOptions.retry || {} + flatOptions.retry.retries = obj[key] + }, + }), + 'fetch-retry-factor': new Definition('fetch-retry-factor', { + default: 10, + type: Number, + description: ` + The "factor" config for the \`retry\` module to use when fetching + packages. + `, + flatten (key, obj, flatOptions) { + flatOptions.retry = flatOptions.retry || {} + flatOptions.retry.factor = obj[key] + }, + }), + 'fetch-retry-maxtimeout': new Definition('fetch-retry-maxtimeout', { + default: 60000, + defaultDescription: '60000 (1 minute)', + type: Number, + description: ` + The "maxTimeout" config for the \`retry\` module to use when fetching + packages. + `, + flatten (key, obj, flatOptions) { + flatOptions.retry = flatOptions.retry || {} + flatOptions.retry.maxTimeout = obj[key] + }, + }), + 'fetch-retry-mintimeout': new Definition('fetch-retry-mintimeout', { + default: 10000, + defaultDescription: '10000 (10 seconds)', + type: Number, + description: ` + The "minTimeout" config for the \`retry\` module to use when fetching + packages. + `, + flatten (key, obj, flatOptions) { + flatOptions.retry = flatOptions.retry || {} + flatOptions.retry.minTimeout = obj[key] + }, + }), + 'fetch-timeout': new Definition('fetch-timeout', { + default: 5 * 60 * 1000, + defaultDescription: `${5 * 60 * 1000} (5 minutes)`, + type: Number, + description: ` + The maximum amount of time to wait for HTTP requests to complete. + `, + flatten (key, obj, flatOptions) { + flatOptions.timeout = obj[key] + }, + }), + force: new Definition('force', { + default: false, + type: Boolean, + short: 'f', + description: ` + Removes various protections against unfortunate side effects, common + 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 unpublishing all versions of a published package. + * 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). + + If you don't have a clear idea of what you want to do, it is strongly + recommended that you do not use this option! + `, + flatten, + }), + 'foreground-scripts': new Definition('foreground-scripts', { + default: false, + defaultDescription: `\`false\` unless when using \`npm pack\` or \`npm publish\` where it + defaults to \`true\``, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'format-package-lock': new Definition('format-package-lock', { + default: true, + type: Boolean, + description: ` + Format \`package-lock.json\` or \`npm-shrinkwrap.json\` as a human + readable file. + `, + flatten, + }), + fund: new Definition('fund', { + default: true, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + git: new Definition('git', { + default: 'git', + type: String, + description: ` + 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. + `, + flatten, + }), + 'git-tag-version': new Definition('git-tag-version', { + default: true, + type: Boolean, + description: ` + Tag the commit when using the \`npm version\` command. Setting this to + false results in no commit being made at all. + `, + flatten, + }), + global: new Definition('global', { + default: false, + type: Boolean, + short: 'g', + description: ` + 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. + * bin files are linked to \`{prefix}/bin\` + * man pages are linked to \`{prefix}/share/man\` + `, + flatten: (key, obj, flatOptions) => { + flatten(key, obj, flatOptions) + if (flatOptions.global) { + flatOptions.location = 'global' + } + }, + }), + // the globalconfig has its default defined outside of this module + globalconfig: new Definition('globalconfig', { + type: path, + default: '', + defaultDescription: ` + The global --prefix setting plus 'etc/npmrc'. For example, + '/usr/local/etc/npmrc' + `, + description: ` + The config file to read for global config options. + `, + flatten, + }), + 'global-style': new Definition('global-style', { + default: false, + type: Boolean, + description: ` + Only install direct dependencies in the top level \`node_modules\`, + but hoist on deeper dependencies. + Sets \`--install-strategy=shallow\`. + `, + deprecated: ` + This option has been deprecated in favor of \`--install-strategy=shallow\` + `, + flatten (key, obj, flatOptions) { + if (obj[key]) { + obj['install-strategy'] = 'shallow' + flatOptions.installStrategy = 'shallow' + } + }, + }), + heading: new Definition('heading', { + default: 'npm', + type: String, + description: ` + The string that starts all the debugging log output. + `, + flatten, + }), + 'https-proxy': new Definition('https-proxy', { + default: null, + type: [null, url], + description: ` + 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. + `, + flatten, + }), + 'if-present': new Definition('if-present', { + default: false, + type: Boolean, + envExport: false, + description: ` + If true, npm will not exit with an error code when \`run-script\` 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. + `, + flatten, + }), + 'ignore-scripts': new Definition('ignore-scripts', { + default: false, + type: Boolean, + description: ` + 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-script\` will still run their intended script if \`ignore-scripts\` is + set, but they will *not* run any pre- or post-scripts. + `, + flatten, + }), + include: new Definition('include', { + default: [], + type: [Array, 'prod', 'dev', 'optional', 'peer'], + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + // just call the omit flattener, it reads from obj.include + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + 'include-staged': new Definition('include-staged', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'include-workspace-root': new Definition('include-workspace-root', { + default: false, + type: Boolean, + envExport: false, + description: ` + 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. + `, + flatten, + }), + 'init-author-email': new Definition('init-author-email', { + default: '', + hint: '', + type: String, + description: ` + The value \`npm init\` should use by default for the package author's + email. + `, + }), + 'init-author-name': new Definition('init-author-name', { + default: '', + hint: '', + type: String, + description: ` + The value \`npm init\` should use by default for the package author's name. + `, + }), + 'init-author-url': new Definition('init-author-url', { + default: '', + type: ['', url], + hint: '', + description: ` + The value \`npm init\` should use by default for the package author's homepage. + `, + }), + 'init-license': new Definition('init-license', { + default: 'ISC', + hint: '', + type: String, + description: ` + The value \`npm init\` should use by default for the package license. + `, + }), + 'init-module': new Definition('init-module', { + default: '~/.npm-init.js', + type: path, + hint: '', + description: ` + 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-version': new Definition('init-version', { + default: '1.0.0', + type: Semver, + hint: '', + description: ` + The value that \`npm init\` should use by default for the package + version number, if not already set in package.json. + `, + }), + // these "aliases" are historically supported in .npmrc files, unfortunately + // They should be removed in a future npm version. + 'init.author.email': new Definition('init.author.email', { + default: '', + type: String, + deprecated: ` + Use \`--init-author-email\` instead.`, + description: ` + Alias for \`--init-author-email\` + `, + }), + 'init.author.name': new Definition('init.author.name', { + default: '', + type: String, + deprecated: ` + Use \`--init-author-name\` instead. + `, + description: ` + Alias for \`--init-author-name\` + `, + }), + 'init.author.url': new Definition('init.author.url', { + default: '', + type: ['', url], + deprecated: ` + Use \`--init-author-url\` instead. + `, + description: ` + Alias for \`--init-author-url\` + `, + }), + 'init.license': new Definition('init.license', { + default: 'ISC', + type: String, + deprecated: ` + Use \`--init-license\` instead. + `, + description: ` + Alias for \`--init-license\` + `, + }), + 'init.module': new Definition('init.module', { + default: '~/.npm-init.js', + type: path, + deprecated: ` + Use \`--init-module\` instead. + `, + description: ` + Alias for \`--init-module\` + `, + }), + 'init.version': new Definition('init.version', { + default: '1.0.0', + type: Semver, + deprecated: ` + Use \`--init-version\` instead. + `, + description: ` + Alias for \`--init-version\` + `, + }), + 'install-links': new Definition('install-links', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'install-strategy': new Definition('install-strategy', { + default: 'hoisted', + type: ['hoisted', 'nested', 'shallow', 'linked'], + description: ` + 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. + `, + flatten, + }), + json: new Definition('json', { + default: false, + type: Boolean, + description: ` + 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\`. + + Not supported by all npm commands. + `, + flatten, + }), + key: new Definition('key', { + default: null, + type: [null, String], + description: ` + 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". + `, + 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 + //other-registry.tld/:certfile=/path/to/cert.crt + `, + flatten, + }), + 'legacy-bundling': new Definition('legacy-bundling', { + default: false, + type: Boolean, + description: ` + 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\`. + `, + deprecated: ` + This option has been deprecated in favor of \`--install-strategy=nested\` + `, + flatten (key, obj, flatOptions) { + if (obj[key]) { + obj['install-strategy'] = 'nested' + flatOptions.installStrategy = 'nested' + } + }, + }), + 'legacy-peer-deps': new Definition('legacy-peer-deps', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + libc: new Definition('libc', { + default: null, + type: [null, String], + description: ` + Override libc of native modules to install. + Acceptable values are same as \`libc\` field of package.json + `, + flatten, + }), + link: new Definition('link', { + default: false, + type: Boolean, + description: ` + Used with \`npm ls\`, limiting output to only those packages that are + linked. + `, + }), + 'local-address': new Definition('local-address', { + default: null, + type: getLocalAddresses(), + typeDescription: 'IP Address', + description: ` + 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. + `, + flatten, + }), + location: new Definition('location', { + default: 'user', + short: 'L', + type: [ + 'global', + 'user', + 'project', + ], + defaultDescription: ` + "user" unless \`--global\` is passed, which will also set this value to "global" + `, + description: ` + 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. + + * 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\` + `, + flatten: (key, obj, flatOptions) => { + flatten(key, obj, flatOptions) + if (flatOptions.global) { + flatOptions.location = 'global' + } + if (obj.location === 'global') { + flatOptions.global = true + } + }, + }), + 'lockfile-version': new Definition('lockfile-version', { + default: null, + type: [null, 1, 2, 3, '1', '2', '3'], + defaultDescription: ` + Version 3 if no lockfile, auto-converting v1 lockfiles to v3, otherwise + maintain current lockfile version.`, + description: ` + 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. + `, + flatten: (key, obj, flatOptions) => { + flatOptions.lockfileVersion = obj[key] && parseInt(obj[key], 10) + }, + }), + loglevel: new Definition('loglevel', { + default: 'notice', + type: [ + 'silent', + 'error', + 'warn', + 'notice', + 'http', + 'info', + 'verbose', + 'silly', + ], + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.silent = obj[key] === 'silent' + }, + }), + 'logs-dir': new Definition('logs-dir', { + default: null, + type: [null, path], + defaultDescription: ` + A directory named \`_logs\` inside the cache + `, + description: ` + The location of npm's log directory. See [\`npm + logging\`](/using-npm/logging) for more information. + `, + }), + 'logs-max': new Definition('logs-max', { + default: 10, + type: Number, + description: ` + The maximum number of log files to store. + + If set to 0, no log files will be written for the current run. + `, + }), + long: new Definition('long', { + default: false, + type: Boolean, + short: 'l', + description: ` + Show extended information in \`ls\`, \`search\`, and \`help-search\`. + `, + }), + maxsockets: new Definition('maxsockets', { + default: 15, + type: Number, + description: ` + The maximum number of connections to use per origin (protocol/host/port + combination). + `, + flatten (key, obj, flatOptions) { + flatOptions.maxSockets = obj[key] + }, + }), + message: new Definition('message', { + default: '%s', + type: String, + short: 'm', + description: ` + Commit message which is used by \`npm version\` when creating version commit. + + Any "%s" in the message will be replaced with the version number. + `, + flatten, + }), + 'node-options': new Definition('node-options', { + default: null, + type: [null, String], + description: ` + 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. + `, + }), + noproxy: new Definition('noproxy', { + default: '', + defaultDescription: ` + The value of the NO_PROXY environment variable + `, + type: [String, Array], + description: ` + Domain extensions that should bypass any proxies. + + Also accepts a comma-delimited string. + `, + flatten (key, obj, flatOptions) { + if (Array.isArray(obj[key])) { + flatOptions.noProxy = obj[key].join(',') + } else { + flatOptions.noProxy = obj[key] + } + }, + }), + offline: new Definition('offline', { + default: false, + type: Boolean, + description: ` + Force offline mode: no network requests will be done during install. To allow + the CLI to fill in missing cache data, see \`--prefer-offline\`. + `, + flatten, + }), + omit: new Definition('omit', { + default: process.env.NODE_ENV === 'production' ? ['dev'] : [], + defaultDescription: ` + 'dev' if the \`NODE_ENV\` environment variable is set to 'production', + otherwise empty. + `, + type: [Array, 'dev', 'optional', 'peer'], + description: ` + Dependency types to omit from the installation tree on disk. + + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.omit = buildOmitList(obj) + }, + }), + 'omit-lockfile-registry-resolved': new Definition('omit-lockfile-registry-resolved', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + only: new Definition('only', { + default: null, + type: [null, 'prod', 'production'], + deprecated: ` + Use \`--omit=dev\` to omit dev dependencies from the install. + `, + description: ` + When set to \`prod\` or \`production\`, this is an alias for + \`--omit=dev\`. + `, + flatten (key, obj, flatOptions) { + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + optional: new Definition('optional', { + default: null, + type: [null, Boolean], + deprecated: ` + Use \`--omit=optional\` to exclude optional dependencies, or + \`--include=optional\` to include them. + + Default value does install optional deps unless otherwise omitted. + `, + description: ` + Alias for --include=optional or --omit=optional + `, + flatten (key, obj, flatOptions) { + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + os: new Definition('os', { + default: null, + type: [null, String], + description: ` + Override OS of native modules to install. + Acceptable values are same as \`os\` field of package.json, + which comes from \`process.platform\`. + `, + flatten, + }), + otp: new Definition('otp', { + default: null, + type: [null, String], + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatten(key, obj, flatOptions) + if (obj.otp) { + obj['auth-type'] = 'legacy' + flatten('auth-type', obj, flatOptions) + } + }, + }), + package: new Definition('package', { + default: [], + hint: '', + type: [String, Array], + description: ` + The package or packages to install for [\`npm exec\`](/commands/npm-exec) + `, + flatten, + }), + 'package-lock': new Definition('package-lock', { + default: true, + type: Boolean, + description: ` + If set to false, then ignore \`package-lock.json\` files when installing. + This will also prevent _writing_ \`package-lock.json\` if \`save\` is + true. + `, + flatten: (key, obj, flatOptions) => { + flatten(key, obj, flatOptions) + if (flatOptions.packageLockOnly) { + flatOptions.packageLock = true + } + }, + }), + 'package-lock-only': new Definition('package-lock-only', { + default: false, + type: Boolean, + description: ` + 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\`. + `, + flatten: (key, obj, flatOptions) => { + flatten(key, obj, flatOptions) + if (flatOptions.packageLockOnly) { + flatOptions.packageLock = true + } + }, + }), + 'pack-destination': new Definition('pack-destination', { + default: '.', + type: String, + description: ` + Directory in which \`npm pack\` will save tarballs. + `, + flatten, + }), + parseable: new Definition('parseable', { + default: false, + type: Boolean, + short: 'p', + description: ` + Output parseable results from commands that write to standard output. For + \`npm search\`, this will be tab-separated table format. + `, + flatten, + }), + 'prefer-dedupe': new Definition('prefer-dedupe', { + default: false, + type: Boolean, + description: ` + Prefer to deduplicate packages if possible, rather than + choosing a newer version of a dependency. + `, + flatten, + }), + 'prefer-offline': new Definition('prefer-offline', { + default: false, + type: Boolean, + description: ` + 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\`. + `, + flatten, + }), + 'prefer-online': new Definition('prefer-online', { + default: false, + type: Boolean, + description: ` + If true, staleness checks for cached data will be forced, making the CLI + look for updates immediately even for fresh package data. + `, + flatten, + }), + // `prefix` has its default defined outside of this module + prefix: new Definition('prefix', { + type: path, + short: 'C', + default: '', + defaultDescription: ` + 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. + `, + description: ` + 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: new Definition('preid', { + default: '', + hint: 'prerelease-id', + type: String, + description: ` + The "prerelease identifier" to use as a prefix for the "prerelease" part + of a semver. Like the \`rc\` in \`1.2.0-rc.8\`. + `, + flatten, + }), + production: new Definition('production', { + default: null, + type: [null, Boolean], + deprecated: 'Use `--omit=dev` instead.', + description: 'Alias for `--omit=dev`', + flatten (key, obj, flatOptions) { + definitions.omit.flatten('omit', obj, flatOptions) + }, + }), + progress: new Definition('progress', { + default: !ciInfo.isCI, + defaultDescription: ` + \`true\` unless running in a known CI system + `, + type: Boolean, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.progress = !obj.progress ? false + // progress is only written to stderr but we disable it unless stdout is a tty + // also. This prevents the progress from appearing when piping output to another + // command which doesn't break anything, but does look very odd to users. + : !!process.stderr.isTTY && !!process.stdout.isTTY && process.env.TERM !== 'dumb' + }, + }), + provenance: new Definition('provenance', { + default: false, + type: Boolean, + exclusive: ['provenance-file'], + description: ` + When publishing from a supported cloud CI/CD system, the package will be + publicly linked to where it was built and published from. + `, + flatten, + }), + 'provenance-file': new Definition('provenance-file', { + default: null, + type: path, + hint: '', + exclusive: ['provenance'], + description: ` + When publishing, the provenance bundle at the given path will be used. + `, + flatten, + }), + proxy: new Definition('proxy', { + default: null, + type: [null, false, url], // allow proxy to be disabled explicitly + description: ` + 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. + `, + flatten, + }), + 'read-only': new Definition('read-only', { + default: false, + type: Boolean, + description: ` + This is used to mark a token as unable to publish when configuring + limited access tokens with the \`npm token create\` command. + `, + flatten, + }), + 'rebuild-bundle': new Definition('rebuild-bundle', { + default: true, + type: Boolean, + description: ` + Rebuild bundled dependencies after installation. + `, + flatten, + }), + registry: new Definition('registry', { + default: 'https://registry.npmjs.org/', + type: url, + description: ` + The base URL of the npm registry. + `, + flatten, + }), + 'replace-registry-host': new Definition('replace-registry-host', { + default: 'npmjs', + hint: ' | hostname', + type: ['npmjs', 'never', 'always', String], + description: ` + 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. + + You may also specify a bare hostname (e.g., "registry.npmjs.org"). + `, + flatten, + }), + save: new Definition('save', { + default: true, + defaultDescription: `\`true\` unless when using \`npm update\` where it + defaults to \`false\``, + usage: '-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle', + type: Boolean, + short: 'S', + description: ` + 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\`. + `, + flatten, + }), + 'save-bundle': new Definition('save-bundle', { + default: false, + type: Boolean, + short: 'B', + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + // XXX update arborist to just ignore it if resulting saveType is peer + // otherwise this won't have the expected effect: + // + // npm config set save-peer true + // npm i foo --save-bundle --save-prod <-- should bundle + flatOptions.saveBundle = obj['save-bundle'] && !obj['save-peer'] + }, + }), + 'save-dev': new Definition('save-dev', { + default: false, + type: Boolean, + short: 'D', + description: ` + Save installed packages to a package.json file as \`devDependencies\`. + `, + flatten (key, obj, flatOptions) { + if (!obj[key]) { + if (flatOptions.saveType === 'dev') { + delete flatOptions.saveType + } + return } - return - } - flatOptions.saveType = 'dev' - }, -}) - -define('save-exact', { - default: false, - type: Boolean, - short: 'E', - description: ` - Dependencies saved to package.json will be configured with an exact - version rather than using npm's default semver range operator. - `, - flatten (key, obj, flatOptions) { - // just call the save-prefix flattener, it reads from obj['save-exact'] - definitions['save-prefix'].flatten('save-prefix', obj, flatOptions) - }, -}) - -define('save-optional', { - default: false, - type: Boolean, - short: 'O', - description: ` - Save installed packages to a package.json file as - \`optionalDependencies\`. - `, - flatten (key, obj, flatOptions) { - if (!obj[key]) { - if (flatOptions.saveType === 'optional') { - delete flatOptions.saveType - } else if (flatOptions.saveType === 'peerOptional') { - flatOptions.saveType = 'peer' + flatOptions.saveType = 'dev' + }, + }), + 'save-exact': new Definition('save-exact', { + default: false, + type: Boolean, + short: 'E', + description: ` + Dependencies saved to package.json will be configured with an exact + version rather than using npm's default semver range operator. + `, + flatten (key, obj, flatOptions) { + // just call the save-prefix flattener, it reads from obj['save-exact'] + definitions['save-prefix'].flatten('save-prefix', obj, flatOptions) + }, + }), + 'save-optional': new Definition('save-optional', { + default: false, + type: Boolean, + short: 'O', + description: ` + Save installed packages to a package.json file as + \`optionalDependencies\`. + `, + flatten (key, obj, flatOptions) { + if (!obj[key]) { + if (flatOptions.saveType === 'optional') { + delete flatOptions.saveType + } else if (flatOptions.saveType === 'peerOptional') { + flatOptions.saveType = 'peer' + } + return } - return - } - if (flatOptions.saveType === 'peerOptional') { - return - } + if (flatOptions.saveType === 'peerOptional') { + return + } - if (flatOptions.saveType === 'peer') { - flatOptions.saveType = 'peerOptional' - } else { - flatOptions.saveType = 'optional' - } - }, -}) - -define('save-peer', { - default: false, - type: Boolean, - description: ` - Save installed packages to a package.json file as \`peerDependencies\` - `, - flatten (key, obj, flatOptions) { - if (!obj[key]) { if (flatOptions.saveType === 'peer') { - delete flatOptions.saveType - } else if (flatOptions.saveType === 'peerOptional') { + flatOptions.saveType = 'peerOptional' + } else { flatOptions.saveType = 'optional' } - return - } - - if (flatOptions.saveType === 'peerOptional') { - return - } - - if (flatOptions.saveType === 'optional') { - flatOptions.saveType = 'peerOptional' - } else { - flatOptions.saveType = 'peer' - } - }, -}) - -define('save-prefix', { - default: '^', - type: String, - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - flatOptions.savePrefix = obj['save-exact'] ? '' : obj['save-prefix'] - obj['save-prefix'] = flatOptions.savePrefix - }, -}) - -define('save-prod', { - default: false, - type: Boolean, - short: 'P', - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - if (!obj[key]) { - if (flatOptions.saveType === 'prod') { - delete flatOptions.saveType + }, + }), + 'save-peer': new Definition('save-peer', { + default: false, + type: Boolean, + description: ` + Save installed packages to a package.json file as \`peerDependencies\` + `, + flatten (key, obj, flatOptions) { + if (!obj[key]) { + if (flatOptions.saveType === 'peer') { + delete flatOptions.saveType + } else if (flatOptions.saveType === 'peerOptional') { + flatOptions.saveType = 'optional' + } + return } - return - } - - flatOptions.saveType = 'prod' - }, -}) - -define('scope', { - default: '', - defaultDescription: ` - the scope of the current project, if any, or "" - `, - type: String, - hint: '<@scope>', - description: ` - Associate an operation with a scope for a scoped registry. - - Useful when logging in to or out of a private registry: - - \`\`\` - # log in, linking the scope to the custom registry - npm login --scope=@mycorp --registry=https://registry.mycorp.com - # log out, removing the link and the auth token - npm logout --scope=@mycorp - \`\`\` - - This will cause \`@mycorp\` to be mapped to the registry for future - installation of packages specified according to the pattern - \`@mycorp/package\`. - - This will also cause \`npm init\` to create a scoped package. - - \`\`\` - # accept all defaults, and create a package named "@foo/whatever", - # instead of just named "whatever" - npm init --scope=@foo --yes - \`\`\` - `, - flatten (key, obj, flatOptions) { - const value = obj[key] - const scope = value && !/^@/.test(value) ? `@${value}` : value - flatOptions.scope = scope - // projectScope is kept for compatibility with npm-registry-fetch - flatOptions.projectScope = scope - }, -}) - -define('script-shell', { - default: null, - defaultDescription: ` - '/bin/sh' on POSIX systems, 'cmd.exe' on Windows - `, - type: [null, String], - description: ` - The shell to use for scripts run with the \`npm exec\`, - \`npm run\` and \`npm init \` commands. - `, - flatten (key, obj, flatOptions) { - flatOptions.scriptShell = obj[key] || undefined - }, -}) - -define('searchexclude', { - default: '', - type: String, - description: ` - Space-separated options that limit the results from search. - `, - flatten (key, obj, flatOptions) { - flatOptions.search = flatOptions.search || { limit: 20 } - flatOptions.search.exclude = obj[key].toLowerCase() - }, -}) - -define('searchlimit', { - default: 20, - type: Number, - description: ` - Number of items to limit search results to. Will not apply at all to - legacy searches. - `, - flatten (key, obj, flatOptions) { - flatOptions.search = flatOptions.search || {} - flatOptions.search.limit = obj[key] - }, -}) - -define('searchopts', { - default: '', - type: String, - description: ` - Space-separated options that are always passed to search. - `, - flatten (key, obj, flatOptions) { - flatOptions.search = flatOptions.search || { limit: 20 } - flatOptions.search.opts = querystring.parse(obj[key]) - }, -}) - -define('searchstaleness', { - default: 15 * 60, - type: Number, - description: ` - The age of the cache, in seconds, before another registry request is made - if using legacy search endpoint. - `, - flatten (key, obj, flatOptions) { - flatOptions.search = flatOptions.search || { limit: 20 } - flatOptions.search.staleness = obj[key] - }, -}) - -define('shell', { - default: shell, - defaultDescription: ` - SHELL environment variable, or "bash" on Posix, or "cmd.exe" on Windows - `, - type: String, - description: ` - The shell to run for the \`npm explore\` command. - `, - flatten, -}) - -define('shrinkwrap', { - default: true, - type: Boolean, - deprecated: ` - Use the --package-lock setting instead. - `, - description: ` - Alias for --package-lock - `, - flatten (key, obj, flatOptions) { - obj['package-lock'] = obj.shrinkwrap - definitions['package-lock'].flatten('package-lock', obj, flatOptions) - }, -}) - -define('sign-git-commit', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('sign-git-tag', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('strict-peer-deps', { - default: false, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('strict-ssl', { - default: true, - type: Boolean, - description: ` - Whether or not to do SSL key validation when making requests to the - registry via https. - - See also the \`ca\` config. - `, - flatten (key, obj, flatOptions) { - flatOptions.strictSSL = obj[key] - }, -}) - -define('tag', { - default: 'latest', - type: String, - description: ` - If you ask npm to install a package and don't tell it a specific version, - then it will install the specified tag. - - Also the tag that is added to the package@version specified by the \`npm - tag\` 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. - `, - flatten (key, obj, flatOptions) { - flatOptions.defaultTag = obj[key] - }, -}) - -define('tag-version-prefix', { - default: 'v', - type: String, - description: ` - 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. - `, - flatten, -}) - -define('timing', { - default: false, - type: Boolean, - description: ` - 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\`. - `, -}) - -define('umask', { - default: 0, - type: Umask, - description: ` - 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. - `, - flatten, -}) - -define('unicode', { - default: unicode, - defaultDescription: ` - 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, - description: ` - When set to true, npm uses unicode characters in the tree output. When - false, it uses ascii characters instead of unicode glyphs. - `, - flatten, -}) - -define('update-notifier', { - default: true, - type: Boolean, - description: ` - Set to false to suppress the update notification when using an older - version of npm than the latest. - `, -}) - -define('usage', { - default: false, - type: Boolean, - short: ['?', 'H', 'h'], - description: ` - Show short usage output about the command specified. - `, -}) - -define('user-agent', { - default: 'npm/{npm-version} ' + - 'node/{node-version} ' + - '{platform} ' + - '{arch} ' + - 'workspaces/{workspaces} ' + - '{ci}', - type: String, - description: ` - 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. - `, - flatten (key, obj, flatOptions) { - const value = obj[key] - const ciName = ciInfo.name?.toLowerCase().split(' ').join('-') || null - let inWorkspaces = false - if (obj.workspaces || obj.workspace && obj.workspace.length) { - inWorkspaces = true - } - flatOptions.userAgent = - value.replace(/\{node-version\}/gi, process.version) - .replace(/\{npm-version\}/gi, obj['npm-version']) - .replace(/\{platform\}/gi, process.platform) - .replace(/\{arch\}/gi, process.arch) - .replace(/\{workspaces\}/gi, inWorkspaces) - .replace(/\{ci\}/gi, ciName ? `ci/${ciName}` : '') - .trim() - - // We can't clobber the original or else subsequent flattening will fail - // (i.e. when we change the underlying config values) - // obj[key] = flatOptions.userAgent - - // user-agent is a unique kind of config item that gets set from a template - // and ends up translated. Because of this, the normal "should we set this - // to process.env also doesn't work - process.env.npm_config_user_agent = flatOptions.userAgent - }, -}) - -define('userconfig', { - default: '~/.npmrc', - type: path, - description: ` - 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. - `, -}) - -define('version', { - default: false, - type: Boolean, - short: 'v', - description: ` - If true, output the npm version and exit successfully. - - Only relevant when specified explicitly on the command line. - `, -}) - -define('versions', { - default: false, - type: Boolean, - description: ` - 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 (flatOptions.saveType === 'peerOptional') { + return + } - Only relevant when specified explicitly on the command line. - `, -}) + if (flatOptions.saveType === 'optional') { + flatOptions.saveType = 'peerOptional' + } else { + flatOptions.saveType = 'peer' + } + }, + }), + 'save-prefix': new Definition('save-prefix', { + default: '^', + type: String, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.savePrefix = obj['save-exact'] ? '' : obj['save-prefix'] + obj['save-prefix'] = flatOptions.savePrefix + }, + }), + 'save-prod': new Definition('save-prod', { + default: false, + type: Boolean, + short: 'P', + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + if (!obj[key]) { + if (flatOptions.saveType === 'prod') { + delete flatOptions.saveType + } + return + } -define('viewer', { - default: isWindows ? 'browser' : 'man', - defaultDescription: ` - "man" on Posix, "browser" on Windows - `, - type: String, - description: ` - The program to use to view help content. + flatOptions.saveType = 'prod' + }, + }), + 'sbom-format': new Definition('sbom-format', { + default: null, + type: [ + 'cyclonedx', + 'spdx', + ], + description: ` + SBOM format to use when generating SBOMs. + `, + flatten, + }), + 'sbom-type': new Definition('sbom-type', { + default: 'library', + type: [ + 'library', + 'application', + 'framework', + ], + description: ` + 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. + `, + flatten, + }), + scope: new Definition('scope', { + default: '', + defaultDescription: ` + the scope of the current project, if any, or "" + `, + type: String, + hint: '<@scope>', + description: ` + Associate an operation with a scope for a scoped registry. + + Useful when logging in to or out of a private registry: + + \`\`\` + # log in, linking the scope to the custom registry + npm login --scope=@mycorp --registry=https://registry.mycorp.com + + # log out, removing the link and the auth token + npm logout --scope=@mycorp + \`\`\` + + This will cause \`@mycorp\` to be mapped to the registry for future + installation of packages specified according to the pattern + \`@mycorp/package\`. + + This will also cause \`npm init\` to create a scoped package. + + \`\`\` + # accept all defaults, and create a package named "@foo/whatever", + # instead of just named "whatever" + npm init --scope=@foo --yes + \`\`\` + `, + flatten (key, obj, flatOptions) { + const value = obj[key] + const scope = value && !/^@/.test(value) ? `@${value}` : value + flatOptions.scope = scope + // projectScope is kept for compatibility with npm-registry-fetch + flatOptions.projectScope = scope + }, + }), + 'script-shell': new Definition('script-shell', { + default: null, + defaultDescription: ` + '/bin/sh' on POSIX systems, 'cmd.exe' on Windows + `, + type: [null, String], + description: ` + The shell to use for scripts run with the \`npm exec\`, + \`npm run\` and \`npm init \` commands. + `, + flatten (key, obj, flatOptions) { + flatOptions.scriptShell = obj[key] || undefined + }, + }), + searchexclude: new Definition('searchexclude', { + default: '', + type: String, + description: ` + Space-separated options that limit the results from search. + `, + flatten (key, obj, flatOptions) { + flatOptions.search = flatOptions.search || { limit: 20 } + flatOptions.search.exclude = obj[key].toLowerCase() + }, + }), + searchlimit: new Definition('searchlimit', { + default: 20, + type: Number, + description: ` + Number of items to limit search results to. Will not apply at all to + legacy searches. + `, + flatten (key, obj, flatOptions) { + flatOptions.search = flatOptions.search || {} + flatOptions.search.limit = obj[key] + }, + }), + searchopts: new Definition('searchopts', { + default: '', + type: String, + description: ` + Space-separated options that are always passed to search. + `, + flatten (key, obj, flatOptions) { + flatOptions.search = flatOptions.search || { limit: 20 } + flatOptions.search.opts = querystring.parse(obj[key]) + }, + }), + searchstaleness: new Definition('searchstaleness', { + default: 15 * 60, + type: Number, + description: ` + The age of the cache, in seconds, before another registry request is made + if using legacy search endpoint. + `, + flatten (key, obj, flatOptions) { + flatOptions.search = flatOptions.search || { limit: 20 } + flatOptions.search.staleness = obj[key] + }, + }), + shell: new Definition('shell', { + default: shell, + defaultDescription: ` + SHELL environment variable, or "bash" on Posix, or "cmd.exe" on Windows + `, + type: String, + description: ` + The shell to run for the \`npm explore\` command. + `, + flatten, + }), + shrinkwrap: new Definition('shrinkwrap', { + default: true, + type: Boolean, + deprecated: ` + Use the --package-lock setting instead. + `, + description: ` + Alias for --package-lock + `, + flatten (key, obj, flatOptions) { + obj['package-lock'] = obj.shrinkwrap + definitions['package-lock'].flatten('package-lock', obj, flatOptions) + }, + }), + 'sign-git-commit': new Definition('sign-git-commit', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'sign-git-tag': new Definition('sign-git-tag', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'strict-peer-deps': new Definition('strict-peer-deps', { + default: false, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + 'strict-ssl': new Definition('strict-ssl', { + default: true, + type: Boolean, + description: ` + Whether or not to do SSL key validation when making requests to the + registry via https. + + See also the \`ca\` config. + `, + flatten (key, obj, flatOptions) { + flatOptions.strictSSL = obj[key] + }, + }), + tag: new Definition('tag', { + default: 'latest', + type: String, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + flatOptions.defaultTag = obj[key] + }, + }), + 'tag-version-prefix': new Definition('tag-version-prefix', { + default: 'v', + type: String, + description: ` + 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. + `, + flatten, + }), + timing: new Definition('timing', { + default: false, + type: Boolean, + description: ` + 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\`. + `, + }), + umask: new Definition('umask', { + default: 0, + type: Umask, + description: ` + 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. + `, + flatten, + }), + unicode: new Definition('unicode', { + default: unicode, + defaultDescription: ` + 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, + description: ` + When set to true, npm uses unicode characters in the tree output. When + false, it uses ascii characters instead of unicode glyphs. + `, + flatten, + }), + 'update-notifier': new Definition('update-notifier', { + default: true, + type: Boolean, + description: ` + Set to false to suppress the update notification when using an older + version of npm than the latest. + `, + }), + usage: new Definition('usage', { + default: false, + type: Boolean, + short: ['?', 'H', 'h'], + description: ` + Show short usage output about the command specified. + `, + }), + 'user-agent': new Definition('user-agent', { + default: 'npm/{npm-version} ' + + 'node/{node-version} ' + + '{platform} ' + + '{arch} ' + + 'workspaces/{workspaces} ' + + '{ci}', + type: String, + description: ` + 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. + `, + flatten (key, obj, flatOptions) { + const value = obj[key] + const ciName = ciInfo.name?.toLowerCase().split(' ').join('-') || null + let inWorkspaces = false + if (obj.workspaces || obj.workspace && obj.workspace.length) { + inWorkspaces = true + } + flatOptions.userAgent = + value.replace(/\{node-version\}/gi, process.version) + .replace(/\{npm-version\}/gi, obj['npm-version']) + .replace(/\{platform\}/gi, process.platform) + .replace(/\{arch\}/gi, process.arch) + .replace(/\{workspaces\}/gi, inWorkspaces) + .replace(/\{ci\}/gi, ciName ? `ci/${ciName}` : '') + .trim() + + // We can't clobber the original or else subsequent flattening will fail + // (i.e. when we change the underlying config values) + // obj[key] = flatOptions.userAgent + + // user-agent is a unique kind of config item that gets set from a template + // and ends up translated. Because of this, the normal "should we set this + // to process.env also doesn't work + process.env.npm_config_user_agent = flatOptions.userAgent + }, + }), + userconfig: new Definition('userconfig', { + default: '~/.npmrc', + type: path, + description: ` + 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. + `, + }), + version: new Definition('version', { + default: false, + type: Boolean, + short: 'v', + description: ` + If true, output the npm version and exit successfully. + + Only relevant when specified explicitly on the command line. + `, + }), + versions: new Definition('versions', { + default: false, + type: Boolean, + description: ` + 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: new Definition('viewer', { + default: isWindows ? 'browser' : 'man', + defaultDescription: ` + "man" on Posix, "browser" on Windows + `, + type: String, + description: ` + The program to use to view help content. + + Set to \`"browser"\` to view html help content in the default web browser. + `, + }), + which: new Definition('which', { + default: null, + hint: '', + type: [null, Number], + description: ` + If there are multiple funding sources, which 1-indexed source URL to open. + `, + }), + workspace: new Definition('workspace', { + default: [], + type: [String, Array], + hint: '', + short: 'w', + envExport: false, + description: ` + 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 + * Path to a workspace directory + * 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. + `, + flatten: (key, obj, flatOptions) => { + definitions['user-agent'].flatten('user-agent', obj, flatOptions) + }, + }), + workspaces: new Definition('workspaces', { + default: null, + type: [null, Boolean], + short: 'ws', + envExport: false, + description: ` + 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: + + - 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. + `, + flatten: (key, obj, flatOptions) => { + definitions['user-agent'].flatten('user-agent', obj, flatOptions) + + // TODO: this is a derived value, and should be reworked when we have a + // pattern for derived value + + // workspacesEnabled is true whether workspaces is null or true + // commands contextually work with workspaces or not regardless of + // configuration, so we need an option specifically to disable workspaces + flatOptions.workspacesEnabled = obj[key] !== false + }, + }), + 'workspaces-update': new Definition('workspaces-update', { + default: true, + type: Boolean, + description: ` + 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. + `, + flatten, + }), + yes: new Definition('yes', { + default: null, + type: [null, Boolean], + short: 'y', + description: ` + Automatically answer "yes" to any prompts that npm might print on + the command line. + `, + }), +} - Set to \`"browser"\` to view html help content in the default web browser. - `, -}) - -define('which', { - default: null, - hint: '', - type: [null, Number], - description: ` - If there are multiple funding sources, which 1-indexed source URL to open. - `, -}) - -define('workspace', { - default: [], - type: [String, Array], - hint: '', - short: 'w', - envExport: false, - description: ` - 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 - * Path to a workspace directory - * 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. - `, - flatten: (key, obj, flatOptions) => { - definitions['user-agent'].flatten('user-agent', obj, flatOptions) - }, -}) - -define('workspaces', { - default: null, - type: [null, Boolean], - short: 'ws', - envExport: false, - description: ` - 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: - - - 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. - `, - flatten: (key, obj, flatOptions) => { - definitions['user-agent'].flatten('user-agent', obj, flatOptions) - - // TODO: this is a derived value, and should be reworked when we have a - // pattern for derived value - - // workspacesEnabled is true whether workspaces is null or true - // commands contextually work with workspaces or not regardless of - // configuration, so we need an option specifically to disable workspaces - flatOptions.workspacesEnabled = obj[key] !== false - }, -}) - -define('workspaces-update', { - default: true, - type: Boolean, - description: ` - 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. - `, - flatten, -}) - -define('yes', { - default: null, - type: [null, Boolean], - short: 'y', - description: ` - Automatically answer "yes" to any prompts that npm might print on - the command line. - `, -}) +module.exports = definitions diff --git a/deps/npm/node_modules/@npmcli/config/lib/index.js b/deps/npm/node_modules/@npmcli/config/lib/index.js index b09ecc478f64fd..4aa76d8e2d9a29 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/index.js +++ b/deps/npm/node_modules/@npmcli/config/lib/index.js @@ -2,12 +2,10 @@ const { walkUp } = require('walk-up-path') const ini = require('ini') const nopt = require('nopt') -const mapWorkspaces = require('@npmcli/map-workspaces') -const rpj = require('read-package-json-fast') -const log = require('proc-log') +const { log, time } = require('proc-log') -const { resolve, dirname, join } = require('path') -const { homedir } = require('os') +const { resolve, dirname, join } = require('node:path') +const { homedir } = require('node:os') const { readFile, writeFile, @@ -15,7 +13,7 @@ const { unlink, stat, mkdir, -} = require('fs/promises') +} = require('node:fs/promises') const fileExists = (...p) => stat(resolve(...p)) .then((st) => st.isFile()) @@ -28,35 +26,12 @@ const dirExists = (...p) => stat(resolve(...p)) const hasOwnProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key) -// define a custom getter, but turn into a normal prop -// if we set it. otherwise it can't be set on child objects -const settableGetter = (obj, key, get) => { - Object.defineProperty(obj, key, { - get, - set (value) { - Object.defineProperty(obj, key, { - value, - configurable: true, - writable: true, - enumerable: true, - }) - }, - configurable: true, - enumerable: true, - }) -} - const typeDefs = require('./type-defs.js') const nerfDart = require('./nerf-dart.js') const envReplace = require('./env-replace.js') const parseField = require('./parse-field.js') -const typeDescription = require('./type-description.js') const setEnvs = require('./set-envs.js') -const { - ErrInvalidAuth, -} = require('./errors.js') - // types that can be saved back to const confFileTypes = new Set([ 'global', @@ -226,7 +201,7 @@ class Config { } // create the object for flat options passed to deps - process.emit('time', 'config:load:flatten') + const timeEnd = time.start('config:load:flatten') this.#flatOptions = {} // walk from least priority to highest for (const { data } of this.data.values()) { @@ -234,7 +209,7 @@ class Config { } this.#flatOptions.nodeBin = this.execPath this.#flatOptions.npmBin = this.npmBin - process.emit('timeEnd', 'config:load:flatten') + timeEnd() return this.#flatOptions } @@ -258,37 +233,24 @@ class Config { throw new Error('attempting to load npm config multiple times') } - process.emit('time', 'config:load') // first load the defaults, which sets the global prefix - process.emit('time', 'config:load:defaults') this.loadDefaults() - process.emit('timeEnd', 'config:load:defaults') // next load the builtin config, as this sets new effective defaults - process.emit('time', 'config:load:builtin') await this.loadBuiltinConfig() - process.emit('timeEnd', 'config:load:builtin') // cli and env are not async, and can set the prefix, relevant to project - process.emit('time', 'config:load:cli') this.loadCLI() - process.emit('timeEnd', 'config:load:cli') - process.emit('time', 'config:load:env') this.loadEnv() - process.emit('timeEnd', 'config:load:env') // next project config, which can affect userconfig location - process.emit('time', 'config:load:project') await this.loadProjectConfig() - process.emit('timeEnd', 'config:load:project') + // then user config, which can affect globalconfig location - process.emit('time', 'config:load:user') await this.loadUserConfig() - process.emit('timeEnd', 'config:load:user') + // last but not least, global config file - process.emit('time', 'config:load:global') await this.loadGlobalConfig() - process.emit('timeEnd', 'config:load:global') // set this before calling setEnvs, so that we don't have to share // private attributes, as that module also does a bunch of get operations @@ -297,11 +259,7 @@ class Config { // set proper globalPrefix now that everything is loaded this.globalPrefix = this.get('prefix') - process.emit('time', 'config:load:setEnvs') this.setEnvs() - process.emit('timeEnd', 'config:load:setEnvs') - - process.emit('timeEnd', 'config:load') } loadDefaults () { @@ -329,7 +287,21 @@ class Config { // default the globalconfig file to that location, instead of the default // global prefix. It's weird that `npm get globalconfig --prefix=/foo` // returns `/foo/etc/npmrc`, but better to not change it at this point. - settableGetter(data, 'globalconfig', () => resolve(this.#get('prefix'), 'etc/npmrc')) + // define a custom getter, but turn into a normal prop + // if we set it. otherwise it can't be set on child objects + Object.defineProperty(data, 'globalconfig', { + get: () => resolve(this.#get('prefix'), 'etc/npmrc'), + set (value) { + Object.defineProperty(data, 'globalconfig', { + value, + configurable: true, + writable: true, + enumerable: true, + }) + }, + configurable: true, + enumerable: true, + }) } loadHome () { @@ -444,6 +416,7 @@ class Config { } if (authProblems.length) { + const { ErrInvalidAuth } = require('./errors.js') throw new ErrInvalidAuth(authProblems) } @@ -512,6 +485,7 @@ class Config { } invalidHandler (k, val, type, source, where) { + const typeDescription = require('./type-description.js') log.warn( 'invalid config', k + '=' + JSON.stringify(val), @@ -583,7 +557,7 @@ class Config { const k = envReplace(key, this.env) const v = this.parseField(value, k) if (where !== 'default') { - this.#checkDeprecated(k, where, obj, [key, value]) + this.#checkDeprecated(k) if (this.definitions[key]?.exclusive) { for (const exclusive of this.definitions[key].exclusive) { if (!this.isDefault(exclusive)) { @@ -597,7 +571,7 @@ class Config { } } - #checkDeprecated (key, where, obj, kv) { + #checkDeprecated (key) { // XXX(npm9+) make this throw an error if (this.deprecated[key]) { log.warn('config', key, this.deprecated[key]) @@ -610,8 +584,8 @@ class Config { } async #loadFile (file, type) { - process.emit('time', 'config:load:file:' + file) // only catch the error from readFile, not from the loadObject call + log.silly('config', `load:file:${file}`) await readFile(file, 'utf8').then( data => { const parsedConfig = ini.parse(data) @@ -624,7 +598,6 @@ class Config { }, er => this.#loadObject(null, type, file, er) ) - process.emit('timeEnd', 'config:load:file:' + file) } loadBuiltinConfig () { @@ -696,20 +669,22 @@ class Config { } if (this.localPrefix && hasPackageJson) { + const pkgJson = require('@npmcli/package-json') // if we already set localPrefix but this dir has a package.json // then we need to see if `p` is a workspace root by reading its package.json // however, if reading it fails then we should just move on - const pkg = await rpj(resolve(p, 'package.json')).catch(() => false) - if (!pkg) { + const { content: pkg } = await pkgJson.normalize(p).catch(() => ({ content: {} })) + if (!pkg?.workspaces) { continue } + const mapWorkspaces = require('@npmcli/map-workspaces') const workspaces = await mapWorkspaces({ cwd: p, pkg }) for (const w of workspaces.values()) { if (w === this.localPrefix) { // see if there's a .npmrc file in the workspace, if so log a warning if (await fileExists(this.localPrefix, '.npmrc')) { - log.warn(`ignoring workspace config at ${this.localPrefix}/.npmrc`) + log.warn('config', `ignoring workspace config at ${this.localPrefix}/.npmrc`) } // set the workspace in the default layer, which allows it to be overridden easily @@ -717,7 +692,7 @@ class Config { data.workspace = [this.localPrefix] this.localPrefix = p this.localPackage = hasPackageJson - log.info(`found workspace root at ${this.localPrefix}`) + log.info('config', `found workspace root at ${this.localPrefix}`) // we found a root, so we return now return } @@ -764,7 +739,7 @@ class Config { const iniData = ini.stringify(conf.raw).trim() + '\n' if (!iniData.trim()) { // ignore the unlink error (eg, if file doesn't exist) - await unlink(conf.source).catch(er => {}) + await unlink(conf.source).catch(() => {}) return } const dir = dirname(conf.source) @@ -799,12 +774,9 @@ class Config { this.delete(`${nerfed}:keyfile`, level) } - setCredentialsByURI (uri, { token, username, password, email, certfile, keyfile }) { + setCredentialsByURI (uri, { token, username, password, certfile, keyfile }) { const nerfed = nerfDart(uri) - // email is either provided, a top level key, or nothing - email = email || this.get('email', 'user') - // field that hasn't been used as documented for a LONG time, // and as of npm 7.10.0, isn't used at all. We just always // send auth if we have it, only to the URIs under the nerf dart. diff --git a/deps/npm/node_modules/@npmcli/config/lib/nerf-dart.js b/deps/npm/node_modules/@npmcli/config/lib/nerf-dart.js index d6ae4aa2aa7e2a..030d92a82270d2 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/nerf-dart.js +++ b/deps/npm/node_modules/@npmcli/config/lib/nerf-dart.js @@ -1,4 +1,4 @@ -const { URL } = require('url') +const { URL } = require('node:url') /** * Maps a URL to an identifier. diff --git a/deps/npm/node_modules/@npmcli/config/lib/parse-field.js b/deps/npm/node_modules/@npmcli/config/lib/parse-field.js index 099b0b4eaf1a83..9ac3d21cae8b71 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/parse-field.js +++ b/deps/npm/node_modules/@npmcli/config/lib/parse-field.js @@ -1,7 +1,7 @@ // Parse a field, coercing it to the best type available. const typeDefs = require('./type-defs.js') const envReplace = require('./env-replace.js') -const { resolve } = require('path') +const { resolve } = require('node:path') const { parse: umaskParse } = require('./umask.js') diff --git a/deps/npm/node_modules/@npmcli/config/lib/type-defs.js b/deps/npm/node_modules/@npmcli/config/lib/type-defs.js index 20a827c3d164e9..3c9dfe19ded113 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/type-defs.js +++ b/deps/npm/node_modules/@npmcli/config/lib/type-defs.js @@ -1,10 +1,12 @@ const nopt = require('nopt') -const { Umask, validate: validateUmask } = require('./umask.js') +const { validate: validateUmask } = require('./umask.js') -const semver = require('semver') +class Umask {} +class Semver {} +const semverValid = require('semver/functions/valid') const validateSemver = (data, k, val) => { - const valid = semver.valid(val) + const valid = semverValid(val) if (!valid) { return false } @@ -23,7 +25,7 @@ const validatePath = (data, k, val) => { module.exports = { ...nopt.typeDefs, semver: { - type: semver, + type: Semver, validate: validateSemver, description: 'full valid SemVer string', }, diff --git a/deps/npm/node_modules/@npmcli/config/lib/umask.js b/deps/npm/node_modules/@npmcli/config/lib/umask.js index 4d9ebbdc965451..2ddc5ca7822326 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/umask.js +++ b/deps/npm/node_modules/@npmcli/config/lib/umask.js @@ -1,4 +1,3 @@ -class Umask {} const parse = val => { // this is run via nopt and parse field where everything is // converted to a string first, ignoring coverage for now @@ -33,4 +32,4 @@ const validate = (data, k, val) => { } } -module.exports = { Umask, parse, validate } +module.exports = { parse, validate } diff --git a/deps/npm/node_modules/@npmcli/config/package.json b/deps/npm/node_modules/@npmcli/config/package.json index b5c73e1b13a9b1..9e30f3cde6bca0 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": "8.2.1", + "version": "9.0.0", "files": [ "bin/", "lib/" @@ -9,7 +9,7 @@ "description": "Configuration management for the npm cli", "repository": { "type": "git", - "url": "https://github.com/npm/cli.git", + "url": "git+https://github.com/npm/cli.git", "directory": "workspaces/config" }, "author": "GitHub Inc.", @@ -17,11 +17,12 @@ "scripts": { "test": "tap", "snap": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "tap": { "nyc-arg": [ @@ -30,27 +31,27 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", + "@npmcli/eslint-config": "^5.0.1", "@npmcli/mock-globals": "^1.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/template-oss": "4.24.4", "tap": "^16.3.8" }, "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", + "ini": "^5.0.0", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.24.4", "content": "../../scripts/template-oss/index.js" } } diff --git a/deps/npm/node_modules/@npmcli/disparity-colors/LICENSE b/deps/npm/node_modules/@npmcli/disparity-colors/LICENSE deleted file mode 100644 index dedcd7d2f9daec..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -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/node_modules/@npmcli/disparity-colors/lib/index.js b/deps/npm/node_modules/@npmcli/disparity-colors/lib/index.js deleted file mode 100644 index 3d2aa56be92536..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/lib/index.js +++ /dev/null @@ -1,34 +0,0 @@ -const ansi = require('ansi-styles') - -const colors = { - removed: ansi.red, - added: ansi.green, - header: ansi.yellow, - section: ansi.magenta, -} - -function colorize (str, opts) { - let headerLength = (opts || {}).headerLength - if (typeof headerLength !== 'number' || Number.isNaN(headerLength)) { - headerLength = 2 - } - - const color = (colorStr, colorId) => { - const { open, close } = colors[colorId] - // avoid highlighting the "\n" (would highlight till the end of the line) - return colorStr.replace(/[^\n\r]+/g, open + '$&' + close) - } - - // this RegExp will include all the `\n` chars into the lines, easier to join - const lines = ((typeof str === 'string' && str) || '').split(/^/m) - - const start = color(lines.slice(0, headerLength).join(''), 'header') - const end = lines.slice(headerLength).join('') - .replace(/^-.*/gm, color('$&', 'removed')) - .replace(/^\+.*/gm, color('$&', 'added')) - .replace(/^@@.+@@/gm, color('$&', 'section')) - - return start + end -} - -module.exports = colorize diff --git a/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/index.js b/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/index.js deleted file mode 100644 index 5d82581a13f990..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/index.js +++ /dev/null @@ -1,163 +0,0 @@ -'use strict'; - -const wrapAnsi16 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${code + offset}m`; -}; - -const wrapAnsi256 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${38 + offset};5;${code}m`; -}; - -const wrapAnsi16m = (fn, offset) => (...args) => { - const rgb = fn(...args); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; - -const ansi2ansi = n => n; -const rgb2rgb = (r, g, b) => [r, g, b]; - -const setLazyProperty = (object, property, get) => { - Object.defineProperty(object, property, { - get: () => { - const value = get(); - - Object.defineProperty(object, property, { - value, - enumerable: true, - configurable: true - }); - - return value; - }, - enumerable: true, - configurable: true - }); -}; - -/** @type {typeof import('color-convert')} */ -let colorConvert; -const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { - if (colorConvert === undefined) { - colorConvert = require('color-convert'); - } - - const offset = isBackground ? 10 : 0; - const styles = {}; - - for (const [sourceSpace, suite] of Object.entries(colorConvert)) { - const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; - if (sourceSpace === targetSpace) { - styles[name] = wrap(identity, offset); - } else if (typeof suite === 'object') { - styles[name] = wrap(suite[targetSpace], offset); - } - } - - return styles; -}; - -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - - // Bright color - blackBright: [90, 39], - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; - - // Alias bright black as gray (and grey) - styles.color.gray = styles.color.blackBright; - styles.bgColor.bgGray = styles.bgColor.bgBlackBright; - styles.color.grey = styles.color.blackBright; - styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; - - for (const [groupName, group] of Object.entries(styles)) { - for (const [styleName, style] of Object.entries(group)) { - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - } - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); - setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); - - return styles; -} - -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); diff --git a/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/license b/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/license deleted file mode 100644 index e7af2f77107d73..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/package.json b/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/package.json deleted file mode 100644 index 75393284d7e474..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "ansi-styles", - "version": "4.3.0", - "description": "ANSI escape codes for styling strings in the terminal", - "license": "MIT", - "repository": "chalk/ansi-styles", - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd", - "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "color-convert": "^2.0.1" - }, - "devDependencies": { - "@types/color-convert": "^1.9.0", - "ava": "^2.3.0", - "svg-term-cli": "^2.1.1", - "tsd": "^0.11.0", - "xo": "^0.25.3" - } -} diff --git a/deps/npm/node_modules/@npmcli/disparity-colors/package.json b/deps/npm/node_modules/@npmcli/disparity-colors/package.json deleted file mode 100644 index 17eb4846c353c4..00000000000000 --- a/deps/npm/node_modules/@npmcli/disparity-colors/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "@npmcli/disparity-colors", - "version": "3.0.0", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "description": "Colorizes unified diff output", - "repository": { - "type": "git", - "url": "https://github.com/npm/disparity-colors.git" - }, - "keywords": [ - "disparity", - "npm", - "npmcli", - "diff", - "char", - "unified", - "multiline", - "string", - "color", - "ansi", - "terminal", - "cli", - "tty" - ], - "author": "GitHub Inc.", - "contributors": [ - { - "name": "Ruy Adorno", - "url": "https://ruyadorno.com", - "twitter": "ruyadorno" - } - ], - "license": "ISC", - "scripts": { - "lint": "eslint \"**/*.js\"", - "pretest": "npm run lint", - "test": "tap", - "snap": "tap", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint" - }, - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "devDependencies": { - "@npmcli/eslint-config": "^3.0.1", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.0.1" - }, - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - } -} diff --git a/deps/npm/node_modules/@npmcli/fs/package.json b/deps/npm/node_modules/@npmcli/fs/package.json index 28eb6133884189..e4063ec8752437 100644 --- a/deps/npm/node_modules/@npmcli/fs/package.json +++ b/deps/npm/node_modules/@npmcli/fs/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/fs", - "version": "3.1.0", + "version": "4.0.0", "description": "filesystem utilities for the npm cli", "main": "lib/index.js", "files": [ @@ -11,16 +11,17 @@ "snap": "tap", "test": "tap", "npmclilint": "npmcli-lint", - "lint": "eslint \"**/*.js\"", - "lintfix": "npm run lint -- --fix", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", "postsnap": "npm run lintfix --", "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "repository": { "type": "git", - "url": "https://github.com/npm/fs.git" + "url": "git+https://github.com/npm/fs.git" }, "keywords": [ "npm", @@ -29,19 +30,20 @@ "author": "GitHub Inc.", "license": "ISC", "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "tap": "^16.0.1" }, "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.8.0" + "version": "4.23.3", + "publish": true }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/git/lib/errors.js b/deps/npm/node_modules/@npmcli/git/lib/errors.js index 7aeac4762866f3..3ceaa458116690 100644 --- a/deps/npm/node_modules/@npmcli/git/lib/errors.js +++ b/deps/npm/node_modules/@npmcli/git/lib/errors.js @@ -8,7 +8,7 @@ class GitError extends Error { } class GitConnectionError extends GitError { - constructor (message) { + constructor () { super('A git connection error occurred') } @@ -18,13 +18,13 @@ class GitConnectionError extends GitError { } class GitPathspecError extends GitError { - constructor (message) { + constructor () { super('The git reference could not be found') } } class GitUnknownError extends GitError { - constructor (message) { + constructor () { super('An unknown git error occurred') } } diff --git a/deps/npm/node_modules/@npmcli/git/lib/is.js b/deps/npm/node_modules/@npmcli/git/lib/is.js index e2542f21577272..f5a0e8754f10dc 100644 --- a/deps/npm/node_modules/@npmcli/git/lib/is.js +++ b/deps/npm/node_modules/@npmcli/git/lib/is.js @@ -1,6 +1,4 @@ // not an airtight indicator, but a good gut-check to even bother trying -const { promisify } = require('util') -const fs = require('fs') -const stat = promisify(fs.stat) +const { stat } = require('fs/promises') module.exports = ({ cwd = process.cwd() } = {}) => stat(cwd + '/.git').then(() => true, () => false) diff --git a/deps/npm/node_modules/@npmcli/git/lib/opts.js b/deps/npm/node_modules/@npmcli/git/lib/opts.js index 3119af16e0cf18..1e80e9efe4989c 100644 --- a/deps/npm/node_modules/@npmcli/git/lib/opts.js +++ b/deps/npm/node_modules/@npmcli/git/lib/opts.js @@ -1,12 +1,57 @@ +const fs = require('node:fs') +const os = require('node:os') +const path = require('node:path') +const ini = require('ini') + +const gitConfigPath = path.join(os.homedir(), '.gitconfig') + +let cachedConfig = null + +// Function to load and cache the git config +const loadGitConfig = () => { + if (cachedConfig === null) { + try { + cachedConfig = {} + if (fs.existsSync(gitConfigPath)) { + const configContent = fs.readFileSync(gitConfigPath, 'utf-8') + cachedConfig = ini.parse(configContent) + } + } catch (error) { + cachedConfig = {} + } + } + return cachedConfig +} + +const checkGitConfigs = () => { + const config = loadGitConfig() + return { + sshCommandSetInConfig: config?.core?.sshCommand !== undefined, + askPassSetInConfig: config?.core?.askpass !== undefined, + } +} + +const sshCommandSetInEnv = process.env.GIT_SSH_COMMAND !== undefined +const askPassSetInEnv = process.env.GIT_ASKPASS !== undefined +const { sshCommandSetInConfig, askPassSetInConfig } = checkGitConfigs() + // Values we want to set if they're not already defined by the end user // This defaults to accepting new ssh host key fingerprints -const gitEnv = { - GIT_ASKPASS: 'echo', - GIT_SSH_COMMAND: 'ssh -oStrictHostKeyChecking=accept-new', +const finalGitEnv = { + ...(askPassSetInEnv || askPassSetInConfig ? {} : { + GIT_ASKPASS: 'echo', + }), + ...(sshCommandSetInEnv || sshCommandSetInConfig ? {} : { + GIT_SSH_COMMAND: 'ssh -oStrictHostKeyChecking=accept-new', + }), } + module.exports = (opts = {}) => ({ stdioString: true, ...opts, shell: false, - env: opts.env || { ...gitEnv, ...process.env }, + env: opts.env || { ...finalGitEnv, ...process.env }, }) + +// Export the loadGitConfig function for testing +module.exports.loadGitConfig = loadGitConfig diff --git a/deps/npm/node_modules/@npmcli/git/lib/revs.js b/deps/npm/node_modules/@npmcli/git/lib/revs.js index ca14837de1b876..ebcc848fa34584 100644 --- a/deps/npm/node_modules/@npmcli/git/lib/revs.js +++ b/deps/npm/node_modules/@npmcli/git/lib/revs.js @@ -1,14 +1,12 @@ -const pinflight = require('promise-inflight') const spawn = require('./spawn.js') const { LRUCache } = require('lru-cache') +const linesToRevs = require('./lines-to-revs.js') const revsCache = new LRUCache({ max: 100, ttl: 5 * 60 * 1000, }) -const linesToRevs = require('./lines-to-revs.js') - module.exports = async (repo, opts = {}) => { if (!opts.noGitRevCache) { const cached = revsCache.get(repo) @@ -17,12 +15,8 @@ module.exports = async (repo, opts = {}) => { } } - return pinflight(`ls-remote:${repo}`, () => - spawn(['ls-remote', repo], opts) - .then(({ stdout }) => linesToRevs(stdout.trim().split('\n'))) - .then(revs => { - revsCache.set(repo, revs) - return revs - }) - ) + const { stdout } = await spawn(['ls-remote', repo], opts) + const revs = linesToRevs(stdout.trim().split('\n')) + revsCache.set(repo, revs) + return revs } diff --git a/deps/npm/node_modules/@npmcli/git/lib/spawn.js b/deps/npm/node_modules/@npmcli/git/lib/spawn.js index 5e96eb5542b5a6..03c1cbde215477 100644 --- a/deps/npm/node_modules/@npmcli/git/lib/spawn.js +++ b/deps/npm/node_modules/@npmcli/git/lib/spawn.js @@ -1,6 +1,6 @@ const spawn = require('@npmcli/promise-spawn') const promiseRetry = require('promise-retry') -const log = require('proc-log') +const { log } = require('proc-log') const makeError = require('./make-error.js') const makeOpts = require('./opts.js') diff --git a/deps/npm/node_modules/@npmcli/git/package.json b/deps/npm/node_modules/@npmcli/git/package.json index 485c1f43dddb90..0880b2443d9fde 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": "5.0.4", + "version": "6.0.3", "main": "lib/index.js", "files": [ "bin/", @@ -9,18 +9,19 @@ "description": "a util for spawning git from npm CLI contexts", "repository": { "type": "git", - "url": "https://github.com/npm/git.git" + "url": "git+https://github.com/npm/git.git" }, "author": "GitHub Inc.", "license": "ISC", "scripts": { - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", "snap": "tap", "test": "tap", "posttest": "npm run lint", "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "template-oss-apply": "template-oss-apply --force" + "lintfix": "npm run eslint -- --fix", + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "tap": { "timeout": 600, @@ -30,28 +31,28 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "npm-package-arg": "^11.0.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.24.1", + "npm-package-arg": "^12.0.1", "slash": "^3.0.0", "tap": "^16.0.1" }, "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.24.1", "publish": true } } diff --git a/deps/npm/node_modules/@npmcli/installed-package-contents/bin/index.js b/deps/npm/node_modules/@npmcli/installed-package-contents/bin/index.js new file mode 100755 index 00000000000000..7b83b23bf168c0 --- /dev/null +++ b/deps/npm/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/node_modules/@npmcli/installed-package-contents/lib/index.js b/deps/npm/node_modules/@npmcli/installed-package-contents/lib/index.js old mode 100755 new mode 100644 index 20b25c4bc8437d..ab1486cd01d003 --- a/deps/npm/node_modules/@npmcli/installed-package-contents/lib/index.js +++ b/deps/npm/node_modules/@npmcli/installed-package-contents/lib/index.js @@ -1,5 +1,3 @@ -#! /usr/bin/env node - // 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 @@ -19,53 +17,46 @@ // - add GET CONTENTS of bundled deps, PACKAGE=true, depth + 1 const bundled = require('npm-bundled') -const { promisify } = require('util') -const fs = require('fs') -const readFile = promisify(fs.readFile) -const readdir = promisify(fs.readdir) -const stat = promisify(fs.stat) -const lstat = promisify(fs.lstat) -const { relative, resolve, basename, dirname } = require('path') +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)) +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(er => null) + }).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 +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, + depth = 1, currentDepth = 0, pkg = null, result = null, @@ -105,7 +96,7 @@ const pkgContents = async ({ }) const bins = await Promise.all( - binFiles.map(b => stat(b).then(() => b).catch((er) => null)) + binFiles.map(b => stat(b).then(() => b).catch(() => null)) ) bins.filter(b => b).forEach(b => result.add(b)) } @@ -136,18 +127,6 @@ const pkgContents = async ({ const recursePromises = [] - // if we didn't get withFileTypes support, tack that on - if (typeof dirEntries[0] === 'string') { - // use a map so we can return a promise, but we mutate dirEntries in place - // this is much slower than getting the entries from the readdir call, - // but polyfills support for node versions before 10.10 - await Promise.all(dirEntries.map(async (name, index) => { - const p = resolve(path, name) - const st = await lstat(p) - dirEntries[index] = Object.assign(st, { name }) - })) - } - for (const entry of dirEntries) { const p = resolve(path, entry.name) if (entry.isDirectory() === false) { @@ -195,48 +174,8 @@ const pkgContents = async ({ return result } -module.exports = ({ path, depth = 1, packageJsonCache }) => pkgContents({ +module.exports = ({ path, ...opts }) => pkgContents({ path: resolve(path), - depth, + ...opts, pkg: true, - packageJsonCache, }).then(results => [...results]) - -if (require.main === module) { - const options = { path: null, depth: 1 } - 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` - - process.argv.slice(2).forEach(arg => { - let match - if ((match = arg.match(/^--depth=([0-9]+|Infinity)/)) || - (match = arg.match(/^-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() - module.exports(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/node_modules/@npmcli/installed-package-contents/package.json b/deps/npm/node_modules/@npmcli/installed-package-contents/package.json index 3554754123e618..d5b68a737daf49 100644 --- a/deps/npm/node_modules/@npmcli/installed-package-contents/package.json +++ b/deps/npm/node_modules/@npmcli/installed-package-contents/package.json @@ -1,46 +1,47 @@ { "name": "@npmcli/installed-package-contents", - "version": "2.0.2", + "version": "3.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", "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "license": "ISC", "scripts": { "test": "tap", "snap": "tap", - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint" + "lintfix": "npm run eslint -- --fix", + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.11.4", - "require-inject": "^1.4.4", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "tap": "^16.3.0" }, "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "repository": { "type": "git", - "url": "https://github.com/npm/installed-package-contents.git" + "url": "git+https://github.com/npm/installed-package-contents.git" }, "files": [ "bin/", "lib/" ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.11.4" + "version": "4.23.3", + "publish": true }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js b/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js index 501dad870a2b75..f38b8cd33b74f7 100644 --- a/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js +++ b/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js @@ -2,26 +2,52 @@ const path = require('path') const getName = require('@npmcli/name-from-folder') const { minimatch } = require('minimatch') -const rpj = require('read-package-json-fast') +const pkgJson = require('@npmcli/package-json') const { glob } = require('glob') -function appendNegatedPatterns (patterns) { - const results = [] - for (let pattern of patterns) { +function appendNegatedPatterns (allPatterns) { + const patterns = [] + const negatedPatterns = [] + for (let pattern of allPatterns) { const excl = pattern.match(/^!+/) if (excl) { pattern = pattern.slice(excl[0].length) } - // strip off any / from the start of the pattern. /foo => foo - pattern = pattern.replace(/^\/+/, '') + // strip off any / or ./ from the start of the pattern. /foo => foo + pattern = pattern.replace(/^\.?\/+/, '') // an odd number of ! means a negated pattern. !!foo ==> foo const negate = excl && excl[0].length % 2 === 1 - results.push({ pattern, negate }) + if (negate) { + negatedPatterns.push(pattern) + } else { + // remove negated patterns that appeared before this pattern to avoid + // ignoring paths that were matched afterwards + // e.g: ['packages/**', '!packages/b/**', 'packages/b/a'] + // in the above list, the last pattern overrides the negated pattern + // right before it. In effect, the above list would become: + // ['packages/**', 'packages/b/a'] + // The order matters here which is why we must do it inside the loop + // as opposed to doing it all together at the end. + for (let i = 0; i < negatedPatterns.length; ++i) { + const negatedPattern = negatedPatterns[i] + if (minimatch(pattern, negatedPattern)) { + negatedPatterns.splice(i, 1) + } + } + patterns.push(pattern) + } } - return results + // use the negated patterns to eagerly remove all the patterns that + // can be removed to avoid unnecessary crawling + for (const negated of negatedPatterns) { + for (const pattern of minimatch.match(patterns, negated)) { + patterns.splice(patterns.indexOf(pattern), 1) + } + } + return { patterns, negatedPatterns } } function getPatterns (workspaces) { @@ -41,15 +67,7 @@ function getPatterns (workspaces) { } function getPackageName (pkg, pathname) { - const { name } = pkg - return name || getName(pathname) -} - -function pkgPathmame (opts) { - return (...args) => { - const cwd = opts.cwd ? opts.cwd : process.cwd() - return path.join.apply(null, [cwd, ...args]) - } + return pkg.name || getName(pathname) } // make sure glob pattern only matches folders @@ -75,66 +93,66 @@ async function mapWorkspaces (opts = {}) { code: 'EMAPWORKSPACESPKG', }) } + if (!opts.cwd) { + opts.cwd = process.cwd() + } const { workspaces = [] } = opts.pkg - const patterns = getPatterns(workspaces) + const { patterns, negatedPatterns } = getPatterns(workspaces) const results = new Map() - const seen = new Map() - if (!patterns.length) { + if (!patterns.length && !negatedPatterns.length) { return results } + const seen = new Map() const getGlobOpts = () => ({ ...opts, ignore: [ ...opts.ignore || [], - ...['**/node_modules/**'], + '**/node_modules/**', + // just ignore the negated patterns to avoid unnecessary crawling + ...negatedPatterns, ], }) - const getPackagePathname = pkgPathmame(opts) - - for (const item of patterns) { - let matches = await glob(getGlobPattern(item.pattern), getGlobOpts()) - // preserves glob@8 behavior - matches = matches.sort((a, b) => a.localeCompare(b, 'en')) - - for (const match of matches) { - let pkg - const packageJsonPathname = getPackagePathname(match, 'package.json') - const packagePathname = path.dirname(packageJsonPathname) - - try { - pkg = await rpj(packageJsonPathname) - } catch (err) { - if (err.code === 'ENOENT') { - continue - } else { - throw err - } - } - - const name = getPackageName(pkg, packagePathname) + let matches = await glob(patterns.map((p) => getGlobPattern(p)), getGlobOpts()) + // preserves glob@8 behavior + matches = matches.sort((a, b) => a.localeCompare(b, 'en')) + + // we must preserve the order of results according to the given list of + // workspace patterns + const orderedMatches = [] + for (const pattern of patterns) { + orderedMatches.push(...matches.filter((m) => { + return minimatch(m, pattern, { partial: true, windowsPathsNoEscape: true }) + })) + } - let seenPackagePathnames = seen.get(name) - if (!seenPackagePathnames) { - seenPackagePathnames = new Set() - seen.set(name, seenPackagePathnames) - } - if (item.negate) { - seenPackagePathnames.delete(packagePathname) + for (const match of orderedMatches) { + let pkg + try { + pkg = await pkgJson.normalize(path.join(opts.cwd, match)) + } catch (err) { + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { + continue } else { - seenPackagePathnames.add(packagePathname) + throw err } } + + const name = getPackageName(pkg.content, pkg.path) + + let seenPackagePathnames = seen.get(name) + if (!seenPackagePathnames) { + seenPackagePathnames = new Set() + seen.set(name, seenPackagePathnames) + } + seenPackagePathnames.add(pkg.path) } const errorMessageArray = ['must not have multiple workspaces with the same name'] for (const [packageName, seenPackagePathnames] of seen) { - if (seenPackagePathnames.size === 0) { - continue - } if (seenPackagePathnames.size > 1) { addDuplicateErrorMessages(errorMessageArray, packageName, seenPackagePathnames) } else { @@ -172,35 +190,32 @@ mapWorkspaces.virtual = function (opts = {}) { code: 'EMAPWORKSPACESLOCKFILE', }) } + if (!opts.cwd) { + opts.cwd = process.cwd() + } const { packages = {} } = opts.lockfile const { workspaces = [] } = packages[''] || {} // uses a pathname-keyed map in order to negate the exact items const results = new Map() - const patterns = getPatterns(workspaces) - if (!patterns.length) { + const { patterns, negatedPatterns } = getPatterns(workspaces) + if (!patterns.length && !negatedPatterns.length) { return results } - patterns.push({ pattern: '**/node_modules/**', negate: true }) + negatedPatterns.push('**/node_modules/**') - const getPackagePathname = pkgPathmame(opts) - - for (const packageKey of Object.keys(packages)) { - if (packageKey === '') { - continue + const packageKeys = Object.keys(packages) + for (const pattern of negatedPatterns) { + for (const packageKey of minimatch.match(packageKeys, pattern)) { + packageKeys.splice(packageKeys.indexOf(packageKey), 1) } + } - for (const item of patterns) { - if (minimatch(packageKey, item.pattern)) { - const packagePathname = getPackagePathname(packageKey) - const name = getPackageName(packages[packageKey], packagePathname) - - if (item.negate) { - results.delete(packagePathname) - } else { - results.set(packagePathname, name) - } - } + for (const pattern of patterns) { + for (const packageKey of minimatch.match(packageKeys, pattern)) { + const packagePathname = path.join(opts.cwd, packageKey) + const name = getPackageName(packages[packageKey], packagePathname) + results.set(packagePathname, name) } } diff --git a/deps/npm/node_modules/@npmcli/map-workspaces/package.json b/deps/npm/node_modules/@npmcli/map-workspaces/package.json index 64cb7f9d3f1177..78a515e027b011 100644 --- a/deps/npm/node_modules/@npmcli/map-workspaces/package.json +++ b/deps/npm/node_modules/@npmcli/map-workspaces/package.json @@ -1,18 +1,18 @@ { "name": "@npmcli/map-workspaces", - "version": "3.0.4", + "version": "4.0.2", "main": "lib/index.js", "files": [ "bin/", "lib/" ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "description": "Retrieves a name:pathname Map for a given workspaces config", "repository": { "type": "git", - "url": "https://github.com/npm/map-workspaces.git" + "url": "git+https://github.com/npm/map-workspaces.git" }, "keywords": [ "npm", @@ -25,14 +25,15 @@ "author": "GitHub Inc.", "license": "ISC", "scripts": { - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "pretest": "npm run lint", "test": "tap", "snap": "tap", "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "tap": { "check-coverage": true, @@ -42,19 +43,19 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.14.1", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.4", "tap": "^16.0.1" }, "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "minimatch": "^9.0.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.14.1", + "version": "4.23.4", "publish": "true" } } diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/lib/index.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/lib/index.js index 668f55942c5065..971409b5bad44e 100644 --- a/deps/npm/node_modules/@npmcli/metavuln-calculator/lib/index.js +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/lib/index.js @@ -3,6 +3,7 @@ // class handles all the IO with the registry and cache. const pacote = require('pacote') const cacache = require('cacache') +const { time } = require('proc-log') const Advisory = require('./advisory.js') const { homedir } = require('os') const jsonParse = require('json-parse-even-better-errors') @@ -48,34 +49,33 @@ class Calculator { async [_calculate] (name, source) { const k = `security-advisory:${name}:${source.id}` - const t = `metavuln:calculate:${k}` - process.emit('time', t) + const timeEnd = time.start(`metavuln:calculate:${k}`) const advisory = new Advisory(name, source, this[_options]) // load packument and cached advisory const [cached, packument] = await Promise.all([ this[_cacheGet](advisory), this[_packument](name), ]) - process.emit('time', `metavuln:load:${k}`) + const timeEndLoad = time.start(`metavuln:load:${k}`) advisory.load(cached, packument) - process.emit('timeEnd', `metavuln:load:${k}`) + timeEndLoad() if (advisory.updated) { await this[_cachePut](advisory) } this[_advisories].set(k, advisory) - process.emit('timeEnd', t) + timeEnd() return advisory } async [_cachePut] (advisory) { const { name, id } = advisory const key = `security-advisory:${name}:${id}` - process.emit('time', `metavuln:cache:put:${key}`) + const timeEnd = time.start(`metavuln:cache:put:${key}`) const data = JSON.stringify(advisory) const options = { ...this[_options] } this[_cacheData].set(key, jsonParse(data)) await cacache.put(this[_cache], key, data, options).catch(() => {}) - process.emit('timeEnd', `metavuln:cache:put:${key}`) + timeEnd() } async [_cacheGet] (advisory) { @@ -87,12 +87,12 @@ class Calculator { return this[_cacheData].get(key) } - process.emit('time', `metavuln:cache:get:${key}`) + const timeEnd = time.start(`metavuln:cache:get:${key}`) const p = cacache.get(this[_cache], key, { ...this[_options] }) .catch(() => ({ data: '{}' })) .then(({ data }) => { data = jsonParse(data) - process.emit('timeEnd', `metavuln:cache:get:${key}`) + timeEnd() this[_cacheData].set(key, data) return data }) @@ -105,9 +105,9 @@ class Calculator { return this[_packuments].get(name) } - process.emit('time', `metavuln:packument:${name}`) + const timeEnd = time.start(`metavuln:packument:${name}`) const p = pacote.packument(name, { ...this[_options] }) - .catch((er) => { + .catch(() => { // presumably not something from the registry. // an empty packument will have an effective range of * return { @@ -116,7 +116,7 @@ class Calculator { } }) .then(paku => { - process.emit('timeEnd', `metavuln:packument:${name}`) + timeEnd() this[_packuments].set(name, paku) return paku }) diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE new file mode 100644 index 00000000000000..a03cd0ed0b338b --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter, Kat Marchán, 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 +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/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md new file mode 100644 index 00000000000000..dbb0051de23a4d --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md @@ -0,0 +1,283 @@ +# pacote + +Fetches package manifests and tarballs from the npm registry. + +## USAGE + +```js +const pacote = require('pacote') + +// get a package manifest +pacote.manifest('foo@1.x').then(manifest => console.log('got it', manifest)) + +// extract a package into a folder +pacote.extract('github:npm/cli', 'some/path', options) + .then(({from, resolved, integrity}) => { + console.log('extracted!', from, resolved, integrity) + }) + +pacote.tarball('https://server.com/package.tgz').then(data => { + console.log('got ' + data.length + ' bytes of tarball data') +}) +``` + +`pacote` works with any kind of package specifier that npm can install. If +you can pass it to the npm CLI, you can pass it to pacote. (In fact, that's +exactly what the npm CLI does.) + +Anything that you can do with one kind of package, you can do with another. + +Data that isn't relevant (like a packument for a tarball) will be +simulated. + +`prepare` scripts will be run when generating tarballs from `git` and +`directory` locations, to simulate what _would_ be published to the +registry, so that you get a working package instead of just raw source +code that might need to be transpiled. + +## CLI + +This module exports a command line interface that can do most of what is +described below. Run `pacote -h` to learn more. + +``` +Pacote - The JavaScript Package Handler, v10.1.1 + +Usage: + + pacote resolve + Resolve a specifier and output the fully resolved target + Returns integrity and from if '--long' flag is set. + + pacote manifest + Fetch a manifest and print to stdout + + pacote packument + Fetch a full packument and print to stdout + + pacote tarball [] + Fetch a package tarball and save to + If is missing or '-', the tarball will be streamed to stdout. + + pacote extract + Extract a package to the destination folder. + +Configuration values all match the names of configs passed to npm, or +options passed to Pacote. Additional flags for this executable: + + --long Print an object from 'resolve', including integrity and spec. + --json Print result objects as JSON rather than node's default. + (This is the default if stdout is not a TTY.) + --help -h Print this helpful text. + +For example '--cache=/path/to/folder' will use that folder as the cache. +``` + +## API + +The `spec` refers to any kind of package specifier that npm can install. +If you can pass it to the npm CLI, you can pass it to pacote. (In fact, +that's exactly what the npm CLI does.) + +See below for valid `opts` values. + +* `pacote.resolve(spec, opts)` Resolve a specifier like `foo@latest` or + `github:user/project` all the way to a tarball url, tarball file, or git + repo with commit hash. + +* `pacote.extract(spec, dest, opts)` Extract a package's tarball into a + destination folder. Returns a promise that resolves to the + `{from,resolved,integrity}` of the extracted package. + +* `pacote.manifest(spec, opts)` Fetch (or simulate) a package's manifest + (basically, the `package.json` file, plus a bit of metadata). + See below for more on manifests and packuments. Returns a Promise that + resolves to the manifest object. + +* `pacote.packument(spec, opts)` Fetch (or simulate) a package's packument + (basically, the top-level package document listing all the manifests that + the registry returns). See below for more on manifests and packuments. + Returns a Promise that resolves to the packument object. + +* `pacote.tarball(spec, opts)` Get a package tarball data as a buffer in + memory. Returns a Promise that resolves to the tarball data Buffer, with + `from`, `resolved`, and `integrity` fields attached. + +* `pacote.tarball.file(spec, dest, opts)` Save a package tarball data to + a file on disk. Returns a Promise that resolves to + `{from,integrity,resolved}` of the fetched tarball. + +* `pacote.tarball.stream(spec, streamHandler, opts)` Fetch a tarball and + make the stream available to the `streamHandler` function. + + This is mostly an internal function, but it is exposed because it does + provide some functionality that may be difficult to achieve otherwise. + + The `streamHandler` function MUST return a Promise that resolves when + the stream (and all associated work) is ended, or rejects if the stream + has an error. + + The `streamHandler` function MAY be called multiple times, as Pacote + retries requests in some scenarios, such as cache corruption or + retriable network failures. + +### Options + +Options are passed to +[`npm-registry-fetch`](http://npm.im/npm-registry-fetch) and +[`cacache`](http://npm.im/cacache), so in addition to these, anything for +those modules can be given to pacote as well. + +Options object is cloned, and mutated along the way to add integrity, +resolved, and other properties, as they are determined. + +* `cache` Where to store cache entries and temp files. Passed to + [`cacache`](http://npm.im/cacache). Defaults to the same cache directory + that npm will use by default, based on platform and environment. +* `where` Base folder for resolving relative `file:` dependencies. +* `resolved` Shortcut for looking up resolved values. Should be specified + if known. +* `integrity` Expected integrity of fetched package tarball. If specified, + tarballs with mismatched integrity values will raise an `EINTEGRITY` + error. +* `umask` Permission mode mask for extracted files and directories. + Defaults to `0o22`. See "Extracted File Modes" below. +* `fmode` Minimum permission mode for extracted files. Defaults to + `0o666`. See "Extracted File Modes" below. +* `dmode` Minimum permission mode for extracted directories. Defaults to + `0o777`. See "Extracted File Modes" below. +* `preferOnline` Prefer to revalidate cache entries, even when it would not + be strictly necessary. Default `false`. +* `before` When picking a manifest from a packument, only consider + packages published before the specified date. Default `null`. +* `defaultTag` The default `dist-tag` to use when choosing a manifest from a + packument. Defaults to `latest`. +* `registry` The npm registry to use by default. Defaults to + `https://registry.npmjs.org/`. +* `fullMetadata` Fetch the full metadata from the registry for packuments, + including information not strictly required for installation (author, + description, etc.) Defaults to `true` when `before` is set, since the + version publish time is part of the extended packument metadata. +* `fullReadJson` Use the slower `read-package-json` package insted of + `read-package-json-fast` in order to include extra fields like "readme" in + the manifest. Defaults to `false`. +* `packumentCache` For registry packuments only, you may provide a `Map` + object which will be used to cache packument requests between pacote + calls. This allows you to easily avoid hitting the registry multiple + times (even just to validate the cache) for a given packument, since it + is unlikely to change in the span of a single command. +* `verifySignatures` A boolean that will make pacote verify the + integrity signature of a manifest, if present. There must be a + configured `_keys` entry in the config that is scoped to the + registry the manifest is being fetched from. +* `verifyAttestations` A boolean that will make pacote verify Sigstore + attestations, if present. There must be a configured `_keys` entry in the + config that is scoped to the registry the manifest is being fetched from. +* `tufCache` Where to store metadata/target files when retrieving the package + attestation key material via TUF. Defaults to the same cache directory that + npm will use by default, based on platform and environment. + +### Advanced API + +Each different type of fetcher is exposed for more advanced usage such as +using helper methods from this classes: + +* `DirFetcher` +* `FileFetcher` +* `GitFetcher` +* `RegistryFetcher` +* `RemoteFetcher` + +## Extracted File Modes + +Files are extracted with a mode matching the following formula: + +``` +( (tarball entry mode value) | (minimum mode option) ) ~ (umask) +``` + +This is in order to prevent unreadable files or unlistable directories from +cluttering a project's `node_modules` folder, even if the package tarball +specifies that the file should be inaccessible. + +It also prevents files from being group- or world-writable without explicit +opt-in by the user, because all file and directory modes are masked against +the `umask` value. + +So, a file which is `0o771` in the tarball, using the default `fmode` of +`0o666` and `umask` of `0o22`, will result in a file mode of `0o755`: + +``` +(0o771 | 0o666) => 0o777 +(0o777 ~ 0o22) => 0o755 +``` + +In almost every case, the defaults are appropriate. To respect exactly +what is in the package tarball (even if this makes an unusable system), set +both `dmode` and `fmode` options to `0`. Otherwise, the `umask` config +should be used in most cases where file mode modifications are required, +and this functions more or less the same as the `umask` value in most Unix +systems. + +## Extracted File Ownership + +When running as `root` on Unix systems, all extracted files and folders +will have their owning `uid` and `gid` values set to match the ownership +of the containing folder. + +This prevents `root`-owned files showing up in a project's `node_modules` +folder when a user runs `sudo npm install`. + +## Manifests + +A `manifest` is similar to a `package.json` file. However, it has a few +pieces of extra metadata, and sometimes lacks metadata that is inessential +to package installation. + +In addition to the common `package.json` fields, manifests include: + +* `manifest._resolved` The tarball url or file path where the package + artifact can be found. +* `manifest._from` A normalized form of the spec passed in as an argument. +* `manifest._integrity` The integrity value for the package artifact. +* `manifest._id` The canonical spec of this package version: name@version. +* `manifest.dist` Registry manifests (those included in a packument) have a + `dist` object. Only `tarball` is required, though at least one of + `shasum` or `integrity` is almost always present. + + * `tarball` The url to the associated package artifact. (Copied by + Pacote to `manifest._resolved`.) + * `integrity` The integrity SRI string for the artifact. This may not + be present for older packages on the npm registry. (Copied by Pacote + to `manifest._integrity`.) + * `shasum` Legacy integrity value. Hexadecimal-encoded sha1 hash. + (Converted to an SRI string and copied by Pacote to + `manifest._integrity` when `dist.integrity` is not present.) + * `fileCount` Number of files in the tarball. + * `unpackedSize` Size on disk of the package when unpacked. + * `signatures` Signatures of the shasum. Includes the keyid that + correlates to a [`key from the npm + registry`](https://registry.npmjs.org/-/npm/v1/keys) + +## Packuments + +A packument is the top-level package document that lists the set of +manifests for available versions for a package. + +When a packument is fetched with `accept: +application/vnd.npm.install-v1+json` in the HTTP headers, only the most +minimum necessary metadata is returned. Additional metadata is returned +when fetched with only `accept: application/json`. + +For Pacote's purposes, the following fields are relevant: + +* `versions` An object where each key is a version, and each value is the + manifest for that version. +* `dist-tags` An object mapping dist-tags to version numbers. This is how + `foo@latest` gets turned into `foo@1.2.3`. +* `time` In the full packument, an object mapping version numbers to + publication times, for the `opts.before` functionality. + +Pacote adds the following field, regardless of the accept header: + +* `_contentLength` The size of the packument. diff --git a/deps/npm/node_modules/pacote/lib/bin.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js similarity index 100% rename from deps/npm/node_modules/pacote/lib/bin.js rename to deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js new file mode 100644 index 00000000000000..04846eb8a6e221 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js @@ -0,0 +1,105 @@ +const { resolve } = require('node:path') +const packlist = require('npm-packlist') +const runScript = require('@npmcli/run-script') +const tar = require('tar') +const { Minipass } = require('minipass') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const _ = require('./util/protected.js') +const tarCreateOptions = require('./util/tar-create-options.js') + +class DirFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + // just the fully resolved filename + this.resolved = this.spec.fetchSpec + + this.tree = opts.tree || null + this.Arborist = opts.Arborist || null + } + + // exposes tarCreateOptions as public API + static tarCreateOptions (manifest) { + return tarCreateOptions(manifest) + } + + get types () { + return ['directory'] + } + + #prepareDir () { + return this.manifest().then(mani => { + if (!mani.scripts || !mani.scripts.prepare) { + return + } + if (this.opts.ignoreScripts) { + return + } + + // we *only* run prepare. + // pre/post-pack is run by the npm CLI for publish and pack, + // but this function is *also* run when installing git deps + const stdio = this.opts.foregroundScripts ? 'inherit' : 'pipe' + + return runScript({ + // this || undefined is because runScript will be unhappy with the default null value + scriptShell: this.opts.scriptShell || undefined, + pkg: mani, + event: 'prepare', + path: this.resolved, + stdio, + env: { + npm_package_resolved: this.resolved, + npm_package_integrity: this.integrity, + npm_package_json: resolve(this.resolved, 'package.json'), + }, + }) + }) + } + + [_.tarballFromResolved] () { + if (!this.tree && !this.Arborist) { + throw new Error('DirFetcher requires either a tree or an Arborist constructor to pack') + } + + const stream = new Minipass() + stream.resolved = this.resolved + stream.integrity = this.integrity + + const { prefix, workspaces } = this.opts + + // run the prepare script, get the list of files, and tar it up + // pipe to the stream, and proxy errors the chain. + this.#prepareDir() + .then(async () => { + if (!this.tree) { + const arb = new this.Arborist({ path: this.resolved }) + this.tree = await arb.loadActual() + } + return packlist(this.tree, { path: this.resolved, prefix, workspaces }) + }) + .then(files => tar.c(tarCreateOptions(this.package), files) + .on('error', er => stream.emit('error', er)).pipe(stream)) + .catch(er => stream.emit('error', er)) + return stream + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + return this[_.readPackageJson](this.resolved) + .then(mani => this.package = { + ...mani, + _integrity: this.integrity && String(this.integrity), + _resolved: this.resolved, + _from: this.from, + }) + } + + packument () { + return FileFetcher.prototype.packument.apply(this) + } +} +module.exports = DirFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js new file mode 100644 index 00000000000000..f2ac97619d3af1 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js @@ -0,0 +1,497 @@ +// This is the base class that the other fetcher types in lib +// all descend from. +// It handles the unpacking and retry logic that is shared among +// all of the other Fetcher types. + +const { basename, dirname } = require('node:path') +const { rm, mkdir } = require('node:fs/promises') +const PackageJson = require('@npmcli/package-json') +const cacache = require('cacache') +const fsm = require('fs-minipass') +const getContents = require('@npmcli/installed-package-contents') +const npa = require('npm-package-arg') +const retry = require('promise-retry') +const ssri = require('ssri') +const tar = require('tar') +const { Minipass } = require('minipass') +const { log } = require('proc-log') +const _ = require('./util/protected.js') +const cacheDir = require('./util/cache-dir.js') +const isPackageBin = require('./util/is-package-bin.js') +const removeTrailingSlashes = require('./util/trailing-slashes.js') + +// Pacote is only concerned with the package.json contents +const packageJsonPrepare = (p) => PackageJson.prepare(p).then(pkg => pkg.content) +const packageJsonNormalize = (p) => PackageJson.normalize(p).then(pkg => pkg.content) + +class FetcherBase { + constructor (spec, opts) { + if (!opts || typeof opts !== 'object') { + throw new TypeError('options object is required') + } + this.spec = npa(spec, opts.where) + + this.allowGitIgnore = !!opts.allowGitIgnore + + // a bit redundant because presumably the caller already knows this, + // but it makes it easier to not have to keep track of the requested + // spec when we're dispatching thousands of these at once, and normalizing + // is nice. saveSpec is preferred if set, because it turns stuff like + // x/y#committish into github:x/y#committish. use name@rawSpec for + // registry deps so that we turn xyz and xyz@ -> xyz@ + this.from = this.spec.registry + ? `${this.spec.name}@${this.spec.rawSpec}` : this.spec.saveSpec + + this.#assertType() + // clone the opts object so that others aren't upset when we mutate it + // by adding/modifying the integrity value. + this.opts = { ...opts } + + this.cache = opts.cache || cacheDir().cacache + this.tufCache = opts.tufCache || cacheDir().tufcache + this.resolved = opts.resolved || null + + // default to caching/verifying with sha512, that's what we usually have + // need to change this default, or start overriding it, when sha512 + // is no longer strong enough. + this.defaultIntegrityAlgorithm = opts.defaultIntegrityAlgorithm || 'sha512' + + if (typeof opts.integrity === 'string') { + this.opts.integrity = ssri.parse(opts.integrity) + } + + this.package = null + this.type = this.constructor.name + this.fmode = opts.fmode || 0o666 + this.dmode = opts.dmode || 0o777 + // we don't need a default umask, because we don't chmod files coming + // out of package tarballs. they're forced to have a mode that is + // valid, regardless of what's in the tarball entry, and then we let + // the process's umask setting do its job. but if configured, we do + // respect it. + this.umask = opts.umask || 0 + + this.preferOnline = !!opts.preferOnline + this.preferOffline = !!opts.preferOffline + this.offline = !!opts.offline + + this.before = opts.before + this.fullMetadata = this.before ? true : !!opts.fullMetadata + this.fullReadJson = !!opts.fullReadJson + this[_.readPackageJson] = this.fullReadJson + ? packageJsonPrepare + : packageJsonNormalize + + // rrh is a registry hostname or 'never' or 'always' + // defaults to registry.npmjs.org + this.replaceRegistryHost = (!opts.replaceRegistryHost || opts.replaceRegistryHost === 'npmjs') ? + 'registry.npmjs.org' : opts.replaceRegistryHost + + this.defaultTag = opts.defaultTag || 'latest' + this.registry = removeTrailingSlashes(opts.registry || 'https://registry.npmjs.org') + + // command to run 'prepare' scripts on directories and git dirs + // To use pacote with yarn, for example, set npmBin to 'yarn' + // and npmCliConfig with yarn's equivalents. + this.npmBin = opts.npmBin || 'npm' + + // command to install deps for preparing + this.npmInstallCmd = opts.npmInstallCmd || ['install', '--force'] + + // XXX fill more of this in based on what we know from this.opts + // we explicitly DO NOT fill in --tag, though, since we are often + // going to be packing in the context of a publish, which may set + // a dist-tag, but certainly wants to keep defaulting to latest. + this.npmCliConfig = opts.npmCliConfig || [ + `--cache=${dirname(this.cache)}`, + `--prefer-offline=${!!this.preferOffline}`, + `--prefer-online=${!!this.preferOnline}`, + `--offline=${!!this.offline}`, + ...(this.before ? [`--before=${this.before.toISOString()}`] : []), + '--no-progress', + '--no-save', + '--no-audit', + // override any omit settings from the environment + '--include=dev', + '--include=peer', + '--include=optional', + // we need the actual things, not just the lockfile + '--no-package-lock-only', + '--no-dry-run', + ] + } + + get integrity () { + return this.opts.integrity || null + } + + set integrity (i) { + if (!i) { + return + } + + i = ssri.parse(i) + const current = this.opts.integrity + + // do not ever update an existing hash value, but do + // merge in NEW algos and hashes that we don't already have. + if (current) { + current.merge(i) + } else { + this.opts.integrity = i + } + } + + get notImplementedError () { + return new Error('not implemented in this fetcher type: ' + this.type) + } + + // override in child classes + // Returns a Promise that resolves to this.resolved string value + resolve () { + return this.resolved ? Promise.resolve(this.resolved) + : Promise.reject(this.notImplementedError) + } + + packument () { + return Promise.reject(this.notImplementedError) + } + + // override in child class + // returns a manifest containing: + // - name + // - version + // - _resolved + // - _integrity + // - plus whatever else was in there (corgi, full metadata, or pj file) + manifest () { + return Promise.reject(this.notImplementedError) + } + + // private, should be overridden. + // Note that they should *not* calculate or check integrity or cache, + // but *just* return the raw tarball data stream. + [_.tarballFromResolved] () { + throw this.notImplementedError + } + + // public, should not be overridden + tarball () { + return this.tarballStream(stream => stream.concat().then(data => { + data.integrity = this.integrity && String(this.integrity) + data.resolved = this.resolved + data.from = this.from + return data + })) + } + + // private + // Note: cacache will raise a EINTEGRITY error if the integrity doesn't match + #tarballFromCache () { + const startTime = Date.now() + const stream = cacache.get.stream.byDigest(this.cache, this.integrity, this.opts) + const elapsedTime = Date.now() - startTime + // cache is good, so log it as a hit in particular since there was no fetch logged + log.http( + 'cache', + `${this.spec} ${elapsedTime}ms (cache hit)` + ) + return stream + } + + get [_.cacheFetches] () { + return true + } + + #istream (stream) { + // if not caching this, just return it + if (!this.opts.cache || !this[_.cacheFetches]) { + // instead of creating a new integrity stream, we only piggyback on the + // provided stream's events + if (stream.hasIntegrityEmitter) { + stream.on('integrity', i => this.integrity = i) + return stream + } + + const istream = ssri.integrityStream(this.opts) + istream.on('integrity', i => this.integrity = i) + stream.on('error', err => istream.emit('error', err)) + return stream.pipe(istream) + } + + // we have to return a stream that gets ALL the data, and proxies errors, + // but then pipe from the original tarball stream into the cache as well. + // To do this without losing any data, and since the cacache put stream + // is not a passthrough, we have to pipe from the original stream into + // the cache AFTER we pipe into the middleStream. Since the cache stream + // has an asynchronous flush to write its contents to disk, we need to + // defer the middleStream end until the cache stream ends. + const middleStream = new Minipass() + stream.on('error', err => middleStream.emit('error', err)) + stream.pipe(middleStream, { end: false }) + const cstream = cacache.put.stream( + this.opts.cache, + `pacote:tarball:${this.from}`, + this.opts + ) + cstream.on('integrity', i => this.integrity = i) + cstream.on('error', err => stream.emit('error', err)) + stream.pipe(cstream) + + // eslint-disable-next-line promise/catch-or-return + cstream.promise().catch(() => {}).then(() => middleStream.end()) + return middleStream + } + + pickIntegrityAlgorithm () { + return this.integrity ? this.integrity.pickAlgorithm(this.opts) + : this.defaultIntegrityAlgorithm + } + + // TODO: check error class, once those are rolled out to our deps + isDataCorruptionError (er) { + return er.code === 'EINTEGRITY' || er.code === 'Z_DATA_ERROR' + } + + // override the types getter + get types () { + return false + } + + #assertType () { + if (this.types && !this.types.includes(this.spec.type)) { + throw new TypeError(`Wrong spec type (${ + this.spec.type + }) for ${ + this.constructor.name + }. Supported types: ${this.types.join(', ')}`) + } + } + + // We allow ENOENTs from cacache, but not anywhere else. + // An ENOENT trying to read a tgz file, for example, is Right Out. + isRetriableError (er) { + // TODO: check error class, once those are rolled out to our deps + return this.isDataCorruptionError(er) || + er.code === 'ENOENT' || + er.code === 'EISDIR' + } + + // Mostly internal, but has some uses + // Pass in a function which returns a promise + // Function will be called 1 or more times with streams that may fail. + // Retries: + // Function MUST handle errors on the stream by rejecting the promise, + // so that retry logic can pick it up and either retry or fail whatever + // promise it was making (ie, failing extraction, etc.) + // + // The return value of this method is a Promise that resolves the same + // as whatever the streamHandler resolves to. + // + // This should never be overridden by child classes, but it is public. + tarballStream (streamHandler) { + // Only short-circuit via cache if we have everything else we'll need, + // and the user has not expressed a preference for checking online. + + const fromCache = ( + !this.preferOnline && + this.integrity && + this.resolved + ) ? streamHandler(this.#tarballFromCache()).catch(er => { + if (this.isDataCorruptionError(er)) { + log.warn('tarball', `cached data for ${ + this.spec + } (${this.integrity}) seems to be corrupted. Refreshing cache.`) + return this.cleanupCached().then(() => { + throw er + }) + } else { + throw er + } + }) : null + + const fromResolved = er => { + if (er) { + if (!this.isRetriableError(er)) { + throw er + } + log.silly('tarball', `no local data for ${ + this.spec + }. Extracting by manifest.`) + } + return this.resolve().then(() => retry(tryAgain => + streamHandler(this.#istream(this[_.tarballFromResolved]())) + .catch(streamErr => { + // Most likely data integrity. A cache ENOENT error is unlikely + // here, since we're definitely not reading from the cache, but it + // IS possible that the fetch subsystem accessed the cache, and the + // entry got blown away or something. Try one more time to be sure. + if (this.isRetriableError(streamErr)) { + log.warn('tarball', `tarball data for ${ + this.spec + } (${this.integrity}) seems to be corrupted. Trying again.`) + return this.cleanupCached().then(() => tryAgain(streamErr)) + } + throw streamErr + }), { retries: 1, minTimeout: 0, maxTimeout: 0 })) + } + + return fromCache ? fromCache.catch(fromResolved) : fromResolved() + } + + cleanupCached () { + return cacache.rm.content(this.cache, this.integrity, this.opts) + } + + #empty (path) { + return getContents({ path, depth: 1 }).then(contents => Promise.all( + contents.map(entry => rm(entry, { recursive: true, force: true })))) + } + + async #mkdir (dest) { + await this.#empty(dest) + return await mkdir(dest, { recursive: true }) + } + + // extraction is always the same. the only difference is where + // the tarball comes from. + async extract (dest) { + await this.#mkdir(dest) + return this.tarballStream((tarball) => this.#extract(dest, tarball)) + } + + #toFile (dest) { + return this.tarballStream(str => new Promise((res, rej) => { + const writer = new fsm.WriteStream(dest) + str.on('error', er => writer.emit('error', er)) + writer.on('error', er => rej(er)) + writer.on('close', () => res({ + integrity: this.integrity && String(this.integrity), + resolved: this.resolved, + from: this.from, + })) + str.pipe(writer) + })) + } + + // don't use this.#mkdir because we don't want to rimraf anything + async tarballFile (dest) { + const dir = dirname(dest) + await mkdir(dir, { recursive: true }) + return this.#toFile(dest) + } + + #extract (dest, tarball) { + const extractor = tar.x(this.#tarxOptions({ cwd: dest })) + const p = new Promise((resolve, reject) => { + extractor.on('end', () => { + resolve({ + resolved: this.resolved, + integrity: this.integrity && String(this.integrity), + from: this.from, + }) + }) + + extractor.on('error', er => { + log.warn('tar', er.message) + log.silly('tar', er) + reject(er) + }) + + tarball.on('error', er => reject(er)) + }) + + tarball.pipe(extractor) + return p + } + + // always ensure that entries are at least as permissive as our configured + // dmode/fmode, but never more permissive than the umask allows. + #entryMode (path, mode, type) { + const m = /Directory|GNUDumpDir/.test(type) ? this.dmode + : /File$/.test(type) ? this.fmode + : /* istanbul ignore next - should never happen in a pkg */ 0 + + // make sure package bins are executable + const exe = isPackageBin(this.package, path) ? 0o111 : 0 + // always ensure that files are read/writable by the owner + return ((mode | m) & ~this.umask) | exe | 0o600 + } + + #tarxOptions ({ cwd }) { + const sawIgnores = new Set() + return { + cwd, + noChmod: true, + noMtime: true, + filter: (name, entry) => { + if (/Link$/.test(entry.type)) { + return false + } + entry.mode = this.#entryMode(entry.path, entry.mode, entry.type) + // this replicates the npm pack behavior where .gitignore files + // are treated like .npmignore files, but only if a .npmignore + // file is not present. + if (/File$/.test(entry.type)) { + const base = basename(entry.path) + if (base === '.npmignore') { + sawIgnores.add(entry.path) + } else if (base === '.gitignore' && !this.allowGitIgnore) { + // rename, but only if there's not already a .npmignore + const ni = entry.path.replace(/\.gitignore$/, '.npmignore') + if (sawIgnores.has(ni)) { + return false + } + entry.path = ni + } + return true + } + }, + strip: 1, + onwarn: /* istanbul ignore next - we can trust that tar logs */ + (code, msg, data) => { + log.warn('tar', code, msg) + log.silly('tar', code, msg, data) + }, + umask: this.umask, + // always ignore ownership info from tarball metadata + preserveOwner: false, + } + } +} + +module.exports = FetcherBase + +// Child classes +const GitFetcher = require('./git.js') +const RegistryFetcher = require('./registry.js') +const FileFetcher = require('./file.js') +const DirFetcher = require('./dir.js') +const RemoteFetcher = require('./remote.js') + +// Get an appropriate fetcher object from a spec and options +FetcherBase.get = (rawSpec, opts = {}) => { + const spec = npa(rawSpec, opts.where) + switch (spec.type) { + case 'git': + return new GitFetcher(spec, opts) + + case 'remote': + return new RemoteFetcher(spec, opts) + + case 'version': + case 'range': + case 'tag': + case 'alias': + return new RegistryFetcher(spec.subSpec || spec, opts) + + case 'file': + return new FileFetcher(spec, opts) + + case 'directory': + return new DirFetcher(spec, opts) + + default: + throw new TypeError('Unknown spec type: ' + spec.type) + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js new file mode 100644 index 00000000000000..2021325085e4f0 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js @@ -0,0 +1,94 @@ +const { resolve } = require('node:path') +const { stat, chmod } = require('node:fs/promises') +const cacache = require('cacache') +const fsm = require('fs-minipass') +const Fetcher = require('./fetcher.js') +const _ = require('./util/protected.js') + +class FileFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + // just the fully resolved filename + this.resolved = this.spec.fetchSpec + } + + get types () { + return ['file'] + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + // have to unpack the tarball for this. + return cacache.tmp.withTmp(this.cache, this.opts, dir => + this.extract(dir) + .then(() => this[_.readPackageJson](dir)) + .then(mani => this.package = { + ...mani, + _integrity: this.integrity && String(this.integrity), + _resolved: this.resolved, + _from: this.from, + })) + } + + #exeBins (pkg, dest) { + if (!pkg.bin) { + return Promise.resolve() + } + + return Promise.all(Object.keys(pkg.bin).map(async k => { + const script = resolve(dest, pkg.bin[k]) + // Best effort. Ignore errors here, the only result is that + // a bin script is not executable. But if it's missing or + // something, we just leave it for a later stage to trip over + // when we can provide a more useful contextual error. + try { + const st = await stat(script) + const mode = st.mode | 0o111 + if (mode === st.mode) { + return + } + await chmod(script, mode) + } catch { + // Ignore errors here + } + })) + } + + extract (dest) { + // if we've already loaded the manifest, then the super got it. + // but if not, read the unpacked manifest and chmod properly. + return super.extract(dest) + .then(result => this.package ? result + : this[_.readPackageJson](dest).then(pkg => + this.#exeBins(pkg, dest)).then(() => result)) + } + + [_.tarballFromResolved] () { + // create a read stream and return it + return new fsm.ReadStream(this.resolved) + } + + packument () { + // simulate based on manifest + return this.manifest().then(mani => ({ + name: mani.name, + 'dist-tags': { + [this.defaultTag]: mani.version, + }, + versions: { + [mani.version]: { + ...mani, + dist: { + tarball: `file:${this.resolved}`, + integrity: this.integrity && String(this.integrity), + }, + }, + }, + })) + } +} + +module.exports = FileFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js new file mode 100644 index 00000000000000..077193a86f026f --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js @@ -0,0 +1,317 @@ +const cacache = require('cacache') +const git = require('@npmcli/git') +const npa = require('npm-package-arg') +const pickManifest = require('npm-pick-manifest') +const { Minipass } = require('minipass') +const { log } = require('proc-log') +const DirFetcher = require('./dir.js') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const RemoteFetcher = require('./remote.js') +const _ = require('./util/protected.js') +const addGitSha = require('./util/add-git-sha.js') +const npm = require('./util/npm.js') + +const hashre = /^[a-f0-9]{40}$/ + +// get the repository url. +// prefer https if there's auth, since ssh will drop that. +// otherwise, prefer ssh if available (more secure). +// We have to add the git+ back because npa suppresses it. +const repoUrl = (h, opts) => + h.sshurl && !(h.https && h.auth) && addGitPlus(h.sshurl(opts)) || + h.https && addGitPlus(h.https(opts)) + +// add git+ to the url, but only one time. +const addGitPlus = url => url && `git+${url}`.replace(/^(git\+)+/, 'git+') + +class GitFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + + // we never want to compare integrity for git dependencies: npm/rfcs#525 + if (this.opts.integrity) { + delete this.opts.integrity + log.warn(`skipping integrity check for git dependency ${this.spec.fetchSpec}`) + } + + this.resolvedRef = null + if (this.spec.hosted) { + this.from = this.spec.hosted.shortcut({ noCommittish: false }) + } + + // shortcut: avoid full clone when we can go straight to the tgz + // if we have the full sha and it's a hosted git platform + if (this.spec.gitCommittish && hashre.test(this.spec.gitCommittish)) { + this.resolvedSha = this.spec.gitCommittish + // use hosted.tarball() when we shell to RemoteFetcher later + this.resolved = this.spec.hosted + ? repoUrl(this.spec.hosted, { noCommittish: false }) + : this.spec.rawSpec + } else { + this.resolvedSha = '' + } + + this.Arborist = opts.Arborist || null + } + + // just exposed to make it easier to test all the combinations + static repoUrl (hosted, opts) { + return repoUrl(hosted, opts) + } + + get types () { + return ['git'] + } + + resolve () { + // likely a hosted git repo with a sha, so get the tarball url + // but in general, no reason to resolve() more than necessary! + if (this.resolved) { + return super.resolve() + } + + // fetch the git repo and then look at the current hash + const h = this.spec.hosted + // try to use ssh, fall back to git. + return h + ? this.#resolvedFromHosted(h) + : this.#resolvedFromRepo(this.spec.fetchSpec) + } + + // first try https, since that's faster and passphrase-less for + // public repos, and supports private repos when auth is provided. + // Fall back to SSH to support private repos + // NB: we always store the https url in resolved field if auth + // is present, otherwise ssh if the hosted type provides it + #resolvedFromHosted (hosted) { + return this.#resolvedFromRepo(hosted.https && hosted.https()).catch(er => { + // Throw early since we know pathspec errors will fail again if retried + if (er instanceof git.errors.GitPathspecError) { + throw er + } + const ssh = hosted.sshurl && hosted.sshurl() + // no fallthrough if we can't fall through or have https auth + if (!ssh || hosted.auth) { + throw er + } + return this.#resolvedFromRepo(ssh) + }) + } + + #resolvedFromRepo (gitRemote) { + // XXX make this a custom error class + if (!gitRemote) { + return Promise.reject(new Error(`No git url for ${this.spec}`)) + } + const gitRange = this.spec.gitRange + const name = this.spec.name + return git.revs(gitRemote, this.opts).then(remoteRefs => { + return gitRange ? pickManifest({ + versions: remoteRefs.versions, + 'dist-tags': remoteRefs['dist-tags'], + name, + }, gitRange, this.opts) + : this.spec.gitCommittish ? + remoteRefs.refs[this.spec.gitCommittish] || + remoteRefs.refs[remoteRefs.shas[this.spec.gitCommittish]] + : remoteRefs.refs.HEAD // no git committish, get default head + }).then(revDoc => { + // the committish provided isn't in the rev list + // things like HEAD~3 or @yesterday can land here. + if (!revDoc || !revDoc.sha) { + return this.#resolvedFromClone() + } + + this.resolvedRef = revDoc + this.resolvedSha = revDoc.sha + this.#addGitSha(revDoc.sha) + return this.resolved + }) + } + + #setResolvedWithSha (withSha) { + // we haven't cloned, so a tgz download is still faster + // of course, if it's not a known host, we can't do that. + this.resolved = !this.spec.hosted ? withSha + : repoUrl(npa(withSha).hosted, { noCommittish: false }) + } + + // when we get the git sha, we affix it to our spec to build up + // either a git url with a hash, or a tarball download URL + #addGitSha (sha) { + this.#setResolvedWithSha(addGitSha(this.spec, sha)) + } + + #resolvedFromClone () { + // do a full or shallow clone, then look at the HEAD + // kind of wasteful, but no other option, really + return this.#clone(() => this.resolved) + } + + #prepareDir (dir) { + return this[_.readPackageJson](dir).then(mani => { + // no need if we aren't going to do any preparation. + const scripts = mani.scripts + if (!mani.workspaces && (!scripts || !( + scripts.postinstall || + scripts.build || + scripts.preinstall || + scripts.install || + scripts.prepack || + scripts.prepare))) { + return + } + + // to avoid cases where we have an cycle of git deps that depend + // on one another, we only ever do preparation for one instance + // of a given git dep along the chain of installations. + // Note that this does mean that a dependency MAY in theory end up + // trying to run its prepare script using a dependency that has not + // been properly prepared itself, but that edge case is smaller + // and less hazardous than a fork bomb of npm and git commands. + const noPrepare = !process.env._PACOTE_NO_PREPARE_ ? [] + : process.env._PACOTE_NO_PREPARE_.split('\n') + if (noPrepare.includes(this.resolved)) { + log.info('prepare', 'skip prepare, already seen', this.resolved) + return + } + noPrepare.push(this.resolved) + + // the DirFetcher will do its own preparation to run the prepare scripts + // All we have to do is put the deps in place so that it can succeed. + return npm( + this.npmBin, + [].concat(this.npmInstallCmd).concat(this.npmCliConfig), + dir, + { ...process.env, _PACOTE_NO_PREPARE_: noPrepare.join('\n') }, + { message: 'git dep preparation failed' } + ) + }) + } + + [_.tarballFromResolved] () { + const stream = new Minipass() + stream.resolved = this.resolved + stream.from = this.from + + // check it out and then shell out to the DirFetcher tarball packer + this.#clone(dir => this.#prepareDir(dir) + .then(() => new Promise((res, rej) => { + if (!this.Arborist) { + throw new Error('GitFetcher requires an Arborist constructor to pack a tarball') + } + const df = new DirFetcher(`file:${dir}`, { + ...this.opts, + Arborist: this.Arborist, + resolved: null, + integrity: null, + }) + const dirStream = df[_.tarballFromResolved]() + dirStream.on('error', rej) + dirStream.on('end', res) + dirStream.pipe(stream) + }))).catch( + /* istanbul ignore next: very unlikely and hard to test */ + er => stream.emit('error', er) + ) + return stream + } + + // clone a git repo into a temp folder (or fetch and unpack if possible) + // handler accepts a directory, and returns a promise that resolves + // when we're done with it, at which point, cacache deletes it + // + // TODO: after cloning, create a tarball of the folder, and add to the cache + // with cacache.put.stream(), using a key that's deterministic based on the + // spec and repo, so that we don't ever clone the same thing multiple times. + #clone (handler, tarballOk = true) { + const o = { tmpPrefix: 'git-clone' } + const ref = this.resolvedSha || this.spec.gitCommittish + const h = this.spec.hosted + const resolved = this.resolved + + // can be set manually to false to fall back to actual git clone + tarballOk = tarballOk && + h && resolved === repoUrl(h, { noCommittish: false }) && h.tarball + + return cacache.tmp.withTmp(this.cache, o, async tmp => { + // if we're resolved, and have a tarball url, shell out to RemoteFetcher + if (tarballOk) { + const nameat = this.spec.name ? `${this.spec.name}@` : '' + return new RemoteFetcher(h.tarball({ noCommittish: false }), { + ...this.opts, + allowGitIgnore: true, + pkgid: `git:${nameat}${this.resolved}`, + resolved: this.resolved, + integrity: null, // it'll always be different, if we have one + }).extract(tmp).then(() => handler(tmp), er => { + // fall back to ssh download if tarball fails + if (er.constructor.name.match(/^Http/)) { + return this.#clone(handler, false) + } else { + throw er + } + }) + } + + const sha = await ( + h ? this.#cloneHosted(ref, tmp) + : this.#cloneRepo(this.spec.fetchSpec, ref, tmp) + ) + this.resolvedSha = sha + if (!this.resolved) { + await this.#addGitSha(sha) + } + return handler(tmp) + }) + } + + // first try https, since that's faster and passphrase-less for + // public repos, and supports private repos when auth is provided. + // Fall back to SSH to support private repos + // NB: we always store the https url in resolved field if auth + // is present, otherwise ssh if the hosted type provides it + #cloneHosted (ref, tmp) { + const hosted = this.spec.hosted + return this.#cloneRepo(hosted.https({ noCommittish: true }), ref, tmp) + .catch(er => { + // Throw early since we know pathspec errors will fail again if retried + if (er instanceof git.errors.GitPathspecError) { + throw er + } + const ssh = hosted.sshurl && hosted.sshurl({ noCommittish: true }) + // no fallthrough if we can't fall through or have https auth + if (!ssh || hosted.auth) { + throw er + } + return this.#cloneRepo(ssh, ref, tmp) + }) + } + + #cloneRepo (repo, ref, tmp) { + const { opts, spec } = this + return git.clone(repo, ref, tmp, { ...opts, spec }) + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + return this.spec.hosted && this.resolved + ? FileFetcher.prototype.manifest.apply(this) + : this.#clone(dir => + this[_.readPackageJson](dir) + .then(mani => this.package = { + ...mani, + _resolved: this.resolved, + _from: this.from, + })) + } + + packument () { + return FileFetcher.prototype.packument.apply(this) + } +} +module.exports = GitFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js new file mode 100644 index 00000000000000..f35314d275d5fd --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js @@ -0,0 +1,23 @@ +const { get } = require('./fetcher.js') +const GitFetcher = require('./git.js') +const RegistryFetcher = require('./registry.js') +const FileFetcher = require('./file.js') +const DirFetcher = require('./dir.js') +const RemoteFetcher = require('./remote.js') + +const tarball = (spec, opts) => get(spec, opts).tarball() +tarball.stream = (spec, handler, opts) => get(spec, opts).tarballStream(handler) +tarball.file = (spec, dest, opts) => get(spec, opts).tarballFile(dest) + +module.exports = { + GitFetcher, + RegistryFetcher, + FileFetcher, + DirFetcher, + RemoteFetcher, + resolve: (spec, opts) => get(spec, opts).resolve(), + extract: (spec, dest, opts) => get(spec, opts).extract(dest), + manifest: (spec, opts) => get(spec, opts).manifest(), + packument: (spec, opts) => get(spec, opts).packument(), + tarball, +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js new file mode 100644 index 00000000000000..1ecf4ee1773499 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js @@ -0,0 +1,369 @@ +const crypto = require('node:crypto') +const PackageJson = require('@npmcli/package-json') +const pickManifest = require('npm-pick-manifest') +const ssri = require('ssri') +const npa = require('npm-package-arg') +const sigstore = require('sigstore') +const fetch = require('npm-registry-fetch') +const Fetcher = require('./fetcher.js') +const RemoteFetcher = require('./remote.js') +const pacoteVersion = require('../package.json').version +const removeTrailingSlashes = require('./util/trailing-slashes.js') +const _ = require('./util/protected.js') + +// Corgis are cute. 🐕🐶 +const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' +const fullDoc = 'application/json' + +// Some really old packages have no time field in their packument so we need a +// cutoff date. +const MISSING_TIME_CUTOFF = '2015-01-01T00:00:00.000Z' + +class RegistryFetcher extends Fetcher { + #cacheKey + constructor (spec, opts) { + super(spec, opts) + + // you usually don't want to fetch the same packument multiple times in + // the span of a given script or command, no matter how many pacote calls + // are made, so this lets us avoid doing that. It's only relevant for + // registry fetchers, because other types simulate their packument from + // the manifest, which they memoize on this.package, so it's very cheap + // already. + this.packumentCache = this.opts.packumentCache || null + + this.registry = fetch.pickRegistry(spec, opts) + this.packumentUrl = `${removeTrailingSlashes(this.registry)}/${this.spec.escapedName}` + this.#cacheKey = `${this.fullMetadata ? 'full' : 'corgi'}:${this.packumentUrl}` + + const parsed = new URL(this.registry) + const regKey = `//${parsed.host}${parsed.pathname}` + // unlike the nerf-darted auth keys, this one does *not* allow a mismatch + // of trailing slashes. It must match exactly. + if (this.opts[`${regKey}:_keys`]) { + this.registryKeys = this.opts[`${regKey}:_keys`] + } + + // XXX pacote <=9 has some logic to ignore opts.resolved if + // the resolved URL doesn't go to the same registry. + // Consider reproducing that here, to throw away this.resolved + // in that case. + } + + async resolve () { + // fetching the manifest sets resolved and (if present) integrity + await this.manifest() + if (!this.resolved) { + throw Object.assign( + new Error('Invalid package manifest: no `dist.tarball` field'), + { package: this.spec.toString() } + ) + } + return this.resolved + } + + #headers () { + return { + // npm will override UA, but ensure that we always send *something* + 'user-agent': this.opts.userAgent || + `pacote/${pacoteVersion} node/${process.version}`, + ...(this.opts.headers || {}), + 'pacote-version': pacoteVersion, + 'pacote-req-type': 'packument', + 'pacote-pkg-id': `registry:${this.spec.name}`, + accept: this.fullMetadata ? fullDoc : corgiDoc, + } + } + + async packument () { + // note this might be either an in-flight promise for a request, + // or the actual packument, but we never want to make more than + // one request at a time for the same thing regardless. + if (this.packumentCache?.has(this.#cacheKey)) { + return this.packumentCache.get(this.#cacheKey) + } + + // npm-registry-fetch the packument + // set the appropriate header for corgis if fullMetadata isn't set + // return the res.json() promise + try { + const res = await fetch(this.packumentUrl, { + ...this.opts, + headers: this.#headers(), + spec: this.spec, + + // never check integrity for packuments themselves + integrity: null, + }) + const packument = await res.json() + const contentLength = res.headers.get('content-length') + if (contentLength) { + packument._contentLength = Number(contentLength) + } + this.packumentCache?.set(this.#cacheKey, packument) + return packument + } catch (err) { + this.packumentCache?.delete(this.#cacheKey) + if (err.code !== 'E404' || this.fullMetadata) { + throw err + } + // possible that corgis are not supported by this registry + this.fullMetadata = true + return this.packument() + } + } + + async manifest () { + if (this.package) { + return this.package + } + + // When verifying signatures, we need to fetch the full/uncompressed + // packument to get publish time as this is not included in the + // corgi/compressed packument. + if (this.opts.verifySignatures) { + this.fullMetadata = true + } + + const packument = await this.packument() + const steps = PackageJson.normalizeSteps.filter(s => s !== '_attributes') + const mani = await new PackageJson().fromContent(pickManifest(packument, this.spec.fetchSpec, { + ...this.opts, + defaultTag: this.defaultTag, + before: this.before, + })).normalize({ steps }).then(p => p.content) + + /* XXX add ETARGET and E403 revalidation of cached packuments here */ + + // add _time from packument if fetched with fullMetadata + const time = packument.time?.[mani.version] + if (time) { + mani._time = time + } + + // add _resolved and _integrity from dist object + const { dist } = mani + if (dist) { + this.resolved = mani._resolved = dist.tarball + mani._from = this.from + const distIntegrity = dist.integrity ? ssri.parse(dist.integrity) + : dist.shasum ? ssri.fromHex(dist.shasum, 'sha1', { ...this.opts }) + : null + if (distIntegrity) { + if (this.integrity && !this.integrity.match(distIntegrity)) { + // only bork if they have algos in common. + // otherwise we end up breaking if we have saved a sha512 + // previously for the tarball, but the manifest only + // provides a sha1, which is possible for older publishes. + // Otherwise, this is almost certainly a case of holding it + // wrong, and will result in weird or insecure behavior + // later on when building package tree. + for (const algo of Object.keys(this.integrity)) { + if (distIntegrity[algo]) { + throw Object.assign(new Error( + `Integrity checksum failed when using ${algo}: ` + + `wanted ${this.integrity} but got ${distIntegrity}.` + ), { code: 'EINTEGRITY' }) + } + } + } + // made it this far, the integrity is worthwhile. accept it. + // the setter here will take care of merging it into what we already + // had. + this.integrity = distIntegrity + } + } + if (this.integrity) { + mani._integrity = String(this.integrity) + if (dist.signatures) { + if (this.opts.verifySignatures) { + // validate and throw on error, then set _signatures + const message = `${mani._id}:${mani._integrity}` + for (const signature of dist.signatures) { + const publicKey = this.registryKeys && + this.registryKeys.filter(key => (key.keyid === signature.keyid))[0] + if (!publicKey) { + throw Object.assign(new Error( + `${mani._id} has a registry signature with keyid: ${signature.keyid} ` + + 'but no corresponding public key can be found' + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + const publishedTime = Date.parse(mani._time || MISSING_TIME_CUTOFF) + const validPublicKey = !publicKey.expires || + publishedTime < Date.parse(publicKey.expires) + if (!validPublicKey) { + throw Object.assign(new Error( + `${mani._id} has a registry signature with keyid: ${signature.keyid} ` + + `but the corresponding public key has expired ${publicKey.expires}` + ), { code: 'EEXPIREDSIGNATUREKEY' }) + } + const verifier = crypto.createVerify('SHA256') + verifier.write(message) + verifier.end() + const valid = verifier.verify( + publicKey.pemkey, + signature.sig, + 'base64' + ) + if (!valid) { + throw Object.assign(new Error( + `${mani._id} has an invalid registry signature with ` + + `keyid: ${publicKey.keyid} and signature: ${signature.sig}` + ), { + code: 'EINTEGRITYSIGNATURE', + keyid: publicKey.keyid, + signature: signature.sig, + resolved: mani._resolved, + integrity: mani._integrity, + }) + } + } + mani._signatures = dist.signatures + } else { + mani._signatures = dist.signatures + } + } + + if (dist.attestations) { + if (this.opts.verifyAttestations) { + // Always fetch attestations from the current registry host + const attestationsPath = new URL(dist.attestations.url).pathname + const attestationsUrl = removeTrailingSlashes(this.registry) + attestationsPath + const res = await fetch(attestationsUrl, { + ...this.opts, + // disable integrity check for attestations json payload, we check the + // integrity in the verification steps below + integrity: null, + }) + const { attestations } = await res.json() + const bundles = attestations.map(({ predicateType, bundle }) => { + const statement = JSON.parse( + Buffer.from(bundle.dsseEnvelope.payload, 'base64').toString('utf8') + ) + const keyid = bundle.dsseEnvelope.signatures[0].keyid + const signature = bundle.dsseEnvelope.signatures[0].sig + + return { + predicateType, + bundle, + statement, + keyid, + signature, + } + }) + + const attestationKeyIds = bundles.map((b) => b.keyid).filter((k) => !!k) + const attestationRegistryKeys = (this.registryKeys || []) + .filter(key => attestationKeyIds.includes(key.keyid)) + if (!attestationRegistryKeys.length) { + throw Object.assign(new Error( + `${mani._id} has attestations but no corresponding public key(s) can be found` + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + for (const { predicateType, bundle, keyid, signature, statement } of bundles) { + const publicKey = attestationRegistryKeys.find(key => key.keyid === keyid) + // Publish attestations have a keyid set and a valid public key must be found + if (keyid) { + if (!publicKey) { + throw Object.assign(new Error( + `${mani._id} has attestations with keyid: ${keyid} ` + + 'but no corresponding public key can be found' + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + const integratedTime = new Date( + Number( + bundle.verificationMaterial.tlogEntries[0].integratedTime + ) * 1000 + ) + const validPublicKey = !publicKey.expires || + (integratedTime < Date.parse(publicKey.expires)) + if (!validPublicKey) { + throw Object.assign(new Error( + `${mani._id} has attestations with keyid: ${keyid} ` + + `but the corresponding public key has expired ${publicKey.expires}` + ), { code: 'EEXPIREDSIGNATUREKEY' }) + } + } + + const subject = { + name: statement.subject[0].name, + sha512: statement.subject[0].digest.sha512, + } + + // Only type 'version' can be turned into a PURL + const purl = this.spec.type === 'version' ? npa.toPurl(this.spec) : this.spec + // Verify the statement subject matches the package, version + if (subject.name !== purl) { + throw Object.assign(new Error( + `${mani._id} package name and version (PURL): ${purl} ` + + `doesn't match what was signed: ${subject.name}` + ), { code: 'EATTESTATIONSUBJECT' }) + } + + // Verify the statement subject matches the tarball integrity + const integrityHexDigest = ssri.parse(this.integrity).hexDigest() + if (subject.sha512 !== integrityHexDigest) { + throw Object.assign(new Error( + `${mani._id} package integrity (hex digest): ` + + `${integrityHexDigest} ` + + `doesn't match what was signed: ${subject.sha512}` + ), { code: 'EATTESTATIONSUBJECT' }) + } + + try { + // Provenance attestations are signed with a signing certificate + // (including the key) so we don't need to return a public key. + // + // Publish attestations are signed with a keyid so we need to + // specify a public key from the keys endpoint: `registry-host.tld/-/npm/v1/keys` + const options = { + tufCachePath: this.tufCache, + tufForceCache: true, + keySelector: publicKey ? () => publicKey.pemkey : undefined, + } + await sigstore.verify(bundle, options) + } catch (e) { + throw Object.assign(new Error( + `${mani._id} failed to verify attestation: ${e.message}` + ), { + code: 'EATTESTATIONVERIFY', + predicateType, + keyid, + signature, + resolved: mani._resolved, + integrity: mani._integrity, + }) + } + } + mani._attestations = dist.attestations + } else { + mani._attestations = dist.attestations + } + } + } + + this.package = mani + return this.package + } + + [_.tarballFromResolved] () { + // we use a RemoteFetcher to get the actual tarball stream + return new RemoteFetcher(this.resolved, { + ...this.opts, + resolved: this.resolved, + pkgid: `registry:${this.spec.name}@${this.resolved}`, + })[_.tarballFromResolved]() + } + + get types () { + return [ + 'tag', + 'version', + 'range', + ] + } +} +module.exports = RegistryFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js new file mode 100644 index 00000000000000..bd321e65a1f18a --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js @@ -0,0 +1,89 @@ +const fetch = require('npm-registry-fetch') +const { Minipass } = require('minipass') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const _ = require('./util/protected.js') +const pacoteVersion = require('../package.json').version + +class RemoteFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + this.resolved = this.spec.fetchSpec + const resolvedURL = new URL(this.resolved) + if (this.replaceRegistryHost !== 'never' + && (this.replaceRegistryHost === 'always' + || this.replaceRegistryHost === resolvedURL.host)) { + this.resolved = new URL(resolvedURL.pathname, this.registry).href + } + + // nam is a fermented pork sausage that is good to eat + const nameat = this.spec.name ? `${this.spec.name}@` : '' + this.pkgid = opts.pkgid ? opts.pkgid : `remote:${nameat}${this.resolved}` + } + + // Don't need to cache tarball fetches in pacote, because make-fetch-happen + // will write into cacache anyway. + get [_.cacheFetches] () { + return false + } + + [_.tarballFromResolved] () { + const stream = new Minipass() + stream.hasIntegrityEmitter = true + + const fetchOpts = { + ...this.opts, + headers: this.#headers(), + spec: this.spec, + integrity: this.integrity, + algorithms: [this.pickIntegrityAlgorithm()], + } + + // eslint-disable-next-line promise/always-return + fetch(this.resolved, fetchOpts).then(res => { + res.body.on('error', + /* istanbul ignore next - exceedingly rare and hard to simulate */ + er => stream.emit('error', er) + ) + + res.body.on('integrity', i => { + this.integrity = i + stream.emit('integrity', i) + }) + + res.body.pipe(stream) + }).catch(er => stream.emit('error', er)) + + return stream + } + + #headers () { + return { + // npm will override this, but ensure that we always send *something* + 'user-agent': this.opts.userAgent || + `pacote/${pacoteVersion} node/${process.version}`, + ...(this.opts.headers || {}), + 'pacote-version': pacoteVersion, + 'pacote-req-type': 'tarball', + 'pacote-pkg-id': this.pkgid, + ...(this.integrity ? { 'pacote-integrity': String(this.integrity) } + : {}), + ...(this.opts.headers || {}), + } + } + + get types () { + return ['remote'] + } + + // getting a packument and/or manifest is the same as with a file: spec. + // unpack the tarball stream, and then read from the package.json file. + packument () { + return FileFetcher.prototype.packument.apply(this) + } + + manifest () { + return FileFetcher.prototype.manifest.apply(this) + } +} +module.exports = RemoteFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js new file mode 100644 index 00000000000000..843fe5b600cafa --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js @@ -0,0 +1,15 @@ +// add a sha to a git remote url spec +const addGitSha = (spec, sha) => { + if (spec.hosted) { + const h = spec.hosted + const opt = { noCommittish: true } + const base = h.https && h.auth ? h.https(opt) : h.shortcut(opt) + + return `${base}#${sha}` + } else { + // don't use new URL for this, because it doesn't handle scp urls + return spec.rawSpec.replace(/#.*$/, '') + `#${sha}` + } +} + +module.exports = addGitSha diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js new file mode 100644 index 00000000000000..ba5683a7bb5bf3 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js @@ -0,0 +1,15 @@ +const { resolve } = require('node:path') +const { tmpdir, homedir } = require('node:os') + +module.exports = (fakePlatform = false) => { + const temp = tmpdir() + const uidOrPid = process.getuid ? process.getuid() : process.pid + const home = homedir() || resolve(temp, 'npm-' + uidOrPid) + const platform = fakePlatform || process.platform + const cacheExtra = platform === 'win32' ? 'npm-cache' : '.npm' + const cacheRoot = (platform === 'win32' && process.env.LOCALAPPDATA) || home + return { + cacache: resolve(cacheRoot, cacheExtra, '_cacache'), + tufcache: resolve(cacheRoot, cacheExtra, '_tuf'), + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js new file mode 100644 index 00000000000000..49a3f73f537ce9 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js @@ -0,0 +1,25 @@ +// Function to determine whether a path is in the package.bin set. +// Used to prevent issues when people publish a package from a +// windows machine, and then install with --no-bin-links. +// +// Note: this is not possible in remote or file fetchers, since +// we don't have the manifest until AFTER we've unpacked. But the +// main use case is registry fetching with git a distant second, +// so that's an acceptable edge case to not handle. + +const binObj = (name, bin) => + typeof bin === 'string' ? { [name]: bin } : bin + +const hasBin = (pkg, path) => { + const bin = binObj(pkg.name, pkg.bin) + const p = path.replace(/^[^\\/]*\//, '') + for (const kv of Object.entries(bin)) { + if (kv[1] === p) { + return true + } + } + return false +} + +module.exports = (pkg, path) => + pkg && pkg.bin ? hasBin(pkg, path) : false diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js new file mode 100644 index 00000000000000..a3005c255565fb --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js @@ -0,0 +1,14 @@ +// run an npm command +const spawn = require('@npmcli/promise-spawn') + +module.exports = (npmBin, npmCommand, cwd, env, extra) => { + const isJS = npmBin.endsWith('.js') + const cmd = isJS ? process.execPath : npmBin + const args = (isJS ? [npmBin] : []).concat(npmCommand) + // when installing to run the `prepare` script for a git dep, we need + // to ensure that we don't run into a cycle of checking out packages + // in temp directories. this lets us link previously-seen repos that + // are also being prepared. + + return spawn(cmd, args, { cwd, env }, extra) +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js new file mode 100644 index 00000000000000..e05203b481e6aa --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js @@ -0,0 +1,5 @@ +module.exports = { + cacheFetches: Symbol.for('pacote.Fetcher._cacheFetches'), + readPackageJson: Symbol.for('package.Fetcher._readPackageJson'), + tarballFromResolved: Symbol.for('pacote.Fetcher._tarballFromResolved'), +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js new file mode 100644 index 00000000000000..d070f0f7ba2d4e --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js @@ -0,0 +1,31 @@ +const isPackageBin = require('./is-package-bin.js') + +const tarCreateOptions = manifest => ({ + cwd: manifest._resolved, + prefix: 'package/', + portable: true, + gzip: { + // forcing the level to 9 seems to avoid some + // platform specific optimizations that cause + // integrity mismatch errors due to differing + // end results after compression + level: 9, + }, + + // ensure that package bins are always executable + // Note that npm-packlist is already filtering out + // anything that is not a regular file, ignored by + // .npmignore or package.json "files", etc. + filter: (path, stat) => { + if (isPackageBin(manifest, path)) { + stat.mode |= 0o111 + } + return true + }, + + // Provide a specific date in the 1980s for the benefit of zip, + // which is confounded by files dated at the Unix epoch 0. + mtime: new Date('1985-10-26T08:15:00.000Z'), +}) + +module.exports = tarCreateOptions diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js new file mode 100644 index 00000000000000..c50cb6173b92eb --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js @@ -0,0 +1,10 @@ +const removeTrailingSlashes = (input) => { + // in order to avoid regexp redos detection + let output = input + while (output.endsWith('/')) { + output = output.slice(0, -1) + } + return output +} + +module.exports = removeTrailingSlashes diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json new file mode 100644 index 00000000000000..335c7a6c87bd3c --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json @@ -0,0 +1,79 @@ +{ + "name": "pacote", + "version": "20.0.0", + "description": "JavaScript package downloader", + "author": "GitHub Inc.", + "bin": { + "pacote": "bin/index.js" + }, + "license": "ISC", + "main": "lib/index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "lint": "npm run eslint", + "postlint": "template-oss-check", + "lintfix": "npm run eslint -- --fix", + "posttest": "npm run lint", + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" + }, + "tap": { + "timeout": 300, + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + }, + "devDependencies": { + "@npmcli/arborist": "^7.1.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", + "hosted-git-info": "^8.0.0", + "mutate-fs": "^2.1.1", + "nock": "^13.2.4", + "npm-registry-mock": "^1.3.2", + "tap": "^16.0.1" + }, + "files": [ + "bin/", + "lib/" + ], + "keywords": [ + "packages", + "npm", + "git" + ], + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/npm/pacote.git" + }, + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.23.3", + "windowsCI": false, + "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 4d0af031d54148..df0b8f2f4faf1c 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": "7.0.0", + "version": "8.0.1", "main": "lib/index.js", "files": [ "bin/", @@ -9,7 +9,7 @@ "description": "Calculate meta-vulnerabilities from package security advisories", "repository": { "type": "git", - "url": "https://github.com/npm/metavuln-calculator.git" + "url": "git+https://github.com/npm/metavuln-calculator.git" }, "author": "GitHub Inc.", "license": "ISC", @@ -18,9 +18,9 @@ "posttest": "npm run lint", "snap": "tap", "postsnap": "npm run lint", - "eslint": "eslint", - "lint": "eslint \"**/*.js\"", - "lintfix": "npm run lint -- --fix", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force" }, @@ -33,23 +33,24 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.18.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "require-inject": "^1.4.4", "tap": "^16.0.1" }, "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^17.0.0", + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^20.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.18.0", + "version": "4.23.3", "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 f0aa5b16dba1aa..323edd81d22fb4 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": "2.0.0", + "version": "3.0.0", "files": [ "bin/", "lib/" @@ -9,30 +9,32 @@ "description": "Get the package name from a folder path", "repository": { "type": "git", - "url": "https://github.com/npm/name-from-folder.git" + "url": "git+https://github.com/npm/name-from-folder.git" }, "author": "GitHub Inc.", "license": "ISC", "scripts": { "test": "tap", "snap": "tap", - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint" + "lintfix": "npm run eslint -- --fix", + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.1", - "@npmcli/template-oss": "4.11.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "tap": "^16.3.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.11.0" + "version": "4.23.3", + "publish": true }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/node-gyp/LICENSE b/deps/npm/node_modules/@npmcli/node-gyp/LICENSE new file mode 100644 index 00000000000000..3609cabca45350 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/node-gyp/LICENSE @@ -0,0 +1,7 @@ +ISC License: + +Copyright (c) 2023 by 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 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/node_modules/@npmcli/node-gyp/package.json b/deps/npm/node_modules/@npmcli/node-gyp/package.json index 999572bc5883a2..3be9663a39de04 100644 --- a/deps/npm/node_modules/@npmcli/node-gyp/package.json +++ b/deps/npm/node_modules/@npmcli/node-gyp/package.json @@ -1,19 +1,20 @@ { "name": "@npmcli/node-gyp", - "version": "3.0.0", + "version": "4.0.0", "description": "Tools for dealing with node-gyp packages", "scripts": { "test": "tap", - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "snap": "tap", - "posttest": "npm run lint" + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "repository": { "type": "git", - "url": "https://github.com/npm/node-gyp.git" + "url": "git+https://github.com/npm/node-gyp.git" }, "keywords": [ "npm", @@ -28,16 +29,17 @@ "author": "GitHub Inc.", "license": "ISC", "devDependencies": { - "@npmcli/eslint-config": "^3.0.1", - "@npmcli/template-oss": "4.5.1", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "tap": "^16.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.5.1" + "version": "4.23.3", + "publish": true }, "tap": { "nyc-arg": [ 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 0cc41c685a39e7..7eff602d73a3f5 100644 --- a/deps/npm/node_modules/@npmcli/package-json/lib/index.js +++ b/deps/npm/node_modules/@npmcli/package-json/lib/index.js @@ -1,11 +1,13 @@ -const { readFile, writeFile } = require('fs/promises') -const { resolve } = require('path') +const { readFile, writeFile } = require('node:fs/promises') +const { resolve } = require('node:path') +const parseJSON = require('json-parse-even-better-errors') + const updateDeps = require('./update-dependencies.js') const updateScripts = require('./update-scripts.js') const updateWorkspaces = require('./update-workspaces.js') const normalize = require('./normalize.js') - -const parseJSON = require('json-parse-even-better-errors') +const { read, parse } = require('./read-package.js') +const { packageSort } = require('./sort.js') // a list of handy specialized helper functions that take // care of special cases that are handled by the npm cli @@ -39,6 +41,7 @@ class PackageJson { 'binRefs', 'bundleDependencies', 'bundleDependenciesFalse', + 'fixName', 'fixNameField', 'fixVersionField', 'fixRepositoryField', @@ -126,9 +129,8 @@ class PackageJson { this.#path = path let parseErr try { - this.#readFileContent = await readFile(this.filename, 'utf8') + this.#readFileContent = await read(this.filename) } catch (err) { - err.message = `Could not read package.json: ${err}` if (!parseIndex) { throw err } @@ -158,12 +160,13 @@ class PackageJson { // Load data from a JSON string/buffer fromJSON (data) { - try { - this.#manifest = parseJSON(data) - } catch (err) { - err.message = `Invalid package.json: ${err}` - throw err - } + this.#manifest = parse(data) + return this + } + + fromContent (data) { + this.#manifest = data + this.#canSave = false return this } @@ -229,24 +232,30 @@ class PackageJson { return this } - async save () { + async save ({ sort } = {}) { if (!this.#canSave) { throw new Error('No package.json to save to') } const { [Symbol.for('indent')]: indent, [Symbol.for('newline')]: newline, + ...rest } = this.content const format = indent === undefined ? ' ' : indent const eol = newline === undefined ? '\n' : newline + + const content = sort ? packageSort(rest) : rest + const fileContent = `${ - JSON.stringify(this.content, null, format) + JSON.stringify(content, null, format) }\n` .replace(/\n/g, eol) if (fileContent.trim() !== this.#readFileContent.trim()) { - return await writeFile(this.filename, fileContent) + const written = await writeFile(this.filename, fileContent) + this.#readFileContent = fileContent + return written } } diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/normalize-data.js b/deps/npm/node_modules/@npmcli/package-json/lib/normalize-data.js new file mode 100644 index 00000000000000..79b0bafbcd3a4d --- /dev/null +++ b/deps/npm/node_modules/@npmcli/package-json/lib/normalize-data.js @@ -0,0 +1,257 @@ +// Originally normalize-package-data + +const url = require('node:url') +const hostedGitInfo = require('hosted-git-info') +const validateLicense = require('validate-npm-package-license') + +const typos = { + dependancies: 'dependencies', + dependecies: 'dependencies', + depdenencies: 'dependencies', + devEependencies: 'devDependencies', + depends: 'dependencies', + 'dev-dependencies': 'devDependencies', + devDependences: 'devDependencies', + devDepenencies: 'devDependencies', + devdependencies: 'devDependencies', + repostitory: 'repository', + repo: 'repository', + prefereGlobal: 'preferGlobal', + hompage: 'homepage', + hampage: 'homepage', + autohr: 'author', + autor: 'author', + contributers: 'contributors', + publicationConfig: 'publishConfig', + script: 'scripts', +} + +const isEmail = str => str.includes('@') && (str.indexOf('@') < str.lastIndexOf('.')) + +// Extracts description from contents of a readme file in markdown format +function extractDescription (description) { + // the first block of text before the first heading that isn't the first line heading + const lines = description.trim().split('\n') + let start = 0 + // skip initial empty lines and lines that start with # + while (lines[start]?.trim().match(/^(#|$)/)) { + start++ + } + let end = start + 1 + // keep going till we get to the end or an empty line + while (end < lines.length && lines[end].trim()) { + end++ + } + return lines.slice(start, end).join(' ').trim() +} + +function stringifyPerson (person) { + if (typeof person !== 'string') { + const name = person.name || '' + const u = person.url || person.web + const wrappedUrl = u ? (' (' + u + ')') : '' + const e = person.email || person.mail + const wrappedEmail = e ? (' <' + e + '>') : '' + person = name + wrappedEmail + wrappedUrl + } + const matchedName = person.match(/^([^(<]+)/) + const matchedUrl = person.match(/\(([^()]+)\)/) + const matchedEmail = person.match(/<([^<>]+)>/) + const parsed = {} + if (matchedName?.[0].trim()) { + parsed.name = matchedName[0].trim() + } + if (matchedEmail) { + parsed.email = matchedEmail[1] + } + if (matchedUrl) { + parsed.url = matchedUrl[1] + } + return parsed +} + +function normalizeData (data, changes) { + // fixDescriptionField + if (data.description && typeof data.description !== 'string') { + changes?.push(`'description' field should be a string`) + delete data.description + } + if (data.readme && !data.description && data.readme !== 'ERROR: No README data found!') { + data.description = extractDescription(data.readme) + } + if (data.description === undefined) { + delete data.description + } + if (!data.description) { + changes?.push('No description') + } + + // fixModulesField + if (data.modules) { + changes?.push(`modules field is deprecated`) + delete data.modules + } + + // fixFilesField + const files = data.files + if (files && !Array.isArray(files)) { + changes?.push(`Invalid 'files' member`) + delete data.files + } else if (data.files) { + data.files = data.files.filter(function (file) { + if (!file || typeof file !== 'string') { + changes?.push(`Invalid filename in 'files' list: ${file}`) + return false + } else { + return true + } + }) + } + + // fixManField + if (data.man && typeof data.man === 'string') { + data.man = [data.man] + } + + // fixBugsField + if (!data.bugs && data.repository?.url) { + const hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted && hosted.bugs()) { + data.bugs = { url: hosted.bugs() } + } + } else if (data.bugs) { + if (typeof data.bugs === 'string') { + if (isEmail(data.bugs)) { + data.bugs = { email: data.bugs } + /* eslint-disable-next-line node/no-deprecated-api */ + } else if (url.parse(data.bugs).protocol) { + data.bugs = { url: data.bugs } + } else { + changes?.push(`Bug string field must be url, email, or {email,url}`) + } + } else { + for (const k in data.bugs) { + if (['web', 'name'].includes(k)) { + changes?.push(`bugs['${k}'] should probably be bugs['url'].`) + data.bugs.url = data.bugs[k] + delete data.bugs[k] + } + } + const oldBugs = data.bugs + data.bugs = {} + if (oldBugs.url) { + /* eslint-disable-next-line node/no-deprecated-api */ + if (typeof (oldBugs.url) === 'string' && url.parse(oldBugs.url).protocol) { + data.bugs.url = oldBugs.url + } else { + changes?.push('bugs.url field must be a string url. Deleted.') + } + } + if (oldBugs.email) { + if (typeof (oldBugs.email) === 'string' && isEmail(oldBugs.email)) { + data.bugs.email = oldBugs.email + } else { + changes?.push('bugs.email field must be a string email. Deleted.') + } + } + } + if (!data.bugs.email && !data.bugs.url) { + delete data.bugs + changes?.push('Normalized value of bugs field is an empty object. Deleted.') + } + } + // fixKeywordsField + if (typeof data.keywords === 'string') { + data.keywords = data.keywords.split(/,\s+/) + } + if (data.keywords && !Array.isArray(data.keywords)) { + delete data.keywords + changes?.push(`keywords should be an array of strings`) + } else if (data.keywords) { + data.keywords = data.keywords.filter(function (kw) { + if (typeof kw !== 'string' || !kw) { + changes?.push(`keywords should be an array of strings`) + return false + } else { + return true + } + }) + } + // fixBundleDependenciesField + const bdd = 'bundledDependencies' + const bd = 'bundleDependencies' + if (data[bdd] && !data[bd]) { + data[bd] = data[bdd] + delete data[bdd] + } + if (data[bd] && !Array.isArray(data[bd])) { + changes?.push(`Invalid 'bundleDependencies' list. Must be array of package names`) + delete data[bd] + } else if (data[bd]) { + data[bd] = data[bd].filter(function (filtered) { + if (!filtered || typeof filtered !== 'string') { + changes?.push(`Invalid bundleDependencies member: ${filtered}`) + return false + } else { + if (!data.dependencies) { + data.dependencies = {} + } + if (!Object.prototype.hasOwnProperty.call(data.dependencies, filtered)) { + changes?.push(`Non-dependency in bundleDependencies: ${filtered}`) + data.dependencies[filtered] = '*' + } + return true + } + }) + } + // fixHomepageField + if (!data.homepage && data.repository && data.repository.url) { + const hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted) { + data.homepage = hosted.docs() + } + } + if (data.homepage) { + if (typeof data.homepage !== 'string') { + changes?.push('homepage field must be a string url. Deleted.') + delete data.homepage + } else { + /* eslint-disable-next-line node/no-deprecated-api */ + if (!url.parse(data.homepage).protocol) { + data.homepage = 'http://' + data.homepage + } + } + } + // fixReadmeField + if (!data.readme) { + changes?.push('No README data') + data.readme = 'ERROR: No README data found!' + } + // fixLicenseField + const license = data.license || data.licence + if (!license) { + changes?.push('No license field.') + } else if (typeof (license) !== 'string' || license.length < 1 || license.trim() === '') { + changes?.push('license should be a valid SPDX license expression') + } else if (!validateLicense(license).validForNewPackages) { + changes?.push('license should be a valid SPDX license expression') + } + // fixPeople + if (data.author) { + data.author = stringifyPerson(data.author) + } + ['maintainers', 'contributors'].forEach(function (set) { + if (!Array.isArray(data[set])) { + return + } + data[set] = data[set].map(stringifyPerson) + }) + // fixTypos + for (const d in typos) { + if (Object.prototype.hasOwnProperty.call(data, d)) { + changes?.push(`${d} should probably be ${typos[d]}.`) + } + } +} + +module.exports = { normalizeData } diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/normalize.js b/deps/npm/node_modules/@npmcli/package-json/lib/normalize.js index 204d4d8a8e7dd6..845f6753a9a00a 100644 --- a/deps/npm/node_modules/@npmcli/package-json/lib/normalize.js +++ b/deps/npm/node_modules/@npmcli/package-json/lib/normalize.js @@ -1,12 +1,31 @@ -const semver = require('semver') -const fs = require('fs/promises') -const { glob } = require('glob') -const legacyFixer = require('normalize-package-data/lib/fixer.js') -const legacyMakeWarning = require('normalize-package-data/lib/make_warning.js') -const path = require('path') -const log = require('proc-log') -const git = require('@npmcli/git') -const hostedGitInfo = require('hosted-git-info') +const valid = require('semver/functions/valid') +const clean = require('semver/functions/clean') +const fs = require('node:fs/promises') +const path = require('node:path') +const { log } = require('proc-log') +const moduleBuiltin = require('node:module') + +/** + * @type {import('hosted-git-info')} + */ +let _hostedGitInfo +function lazyHostedGitInfo () { + if (!_hostedGitInfo) { + _hostedGitInfo = require('hosted-git-info') + } + return _hostedGitInfo +} + +/** + * @type {import('glob').glob} + */ +let _glob +function lazyLoadGlob () { + if (!_glob) { + _glob = require('glob').glob + } + return _glob +} // used to be npm-normalize-package-bin function normalizePackageBin (pkg, changes) { @@ -28,15 +47,14 @@ function normalizePackageBin (pkg, changes) { changes?.push(`removed invalid "bin[${binKey}]"`) continue } - const base = path.join('/', path.basename(binKey.replace(/\\|:/g, '/'))).slice(1) + const base = path.basename(secureAndUnixifyPath(binKey)) if (!base) { delete pkg.bin[binKey] changes?.push(`removed invalid "bin[${binKey}]"`) continue } - const binTarget = path.join('/', pkg.bin[binKey].replace(/\\/g, '/')) - .replace(/\\/g, '/').slice(1) + const binTarget = secureAndUnixifyPath(pkg.bin[binKey]) if (!binTarget) { delete pkg.bin[binKey] @@ -65,6 +83,27 @@ function normalizePackageBin (pkg, changes) { delete pkg.bin } +function normalizePackageMan (pkg, changes) { + if (pkg.man) { + const mans = [] + for (const man of (Array.isArray(pkg.man) ? pkg.man : [pkg.man])) { + if (typeof man !== 'string') { + changes?.push(`removed invalid "man [${man}]"`) + } else { + mans.push(secureAndUnixifyPath(man)) + } + } + + if (!mans.length) { + changes?.push('empty "man" was removed') + } else { + pkg.man = mans + return pkg + } + } + delete pkg.man +} + function isCorrectlyEncodedName (spec) { return !spec.match(/[/@\s+%:]/) && spec === encodeURIComponent(spec) @@ -85,6 +124,15 @@ function isValidScopedPackageName (spec) { rest[1] === encodeURIComponent(rest[1]) } +function unixifyPath (ref) { + return ref.replace(/\\|:/g, '/') +} + +function secureAndUnixifyPath (ref) { + const secured = unixifyPath(path.join('.', path.join('/', unixifyPath(ref)))) + return secured.startsWith('./') ? '' : secured +} + // We don't want the `changes` array in here by default because this is a hot // path for parsing packuments during install. So the calling method passes it // in if it wants to track changes. @@ -97,7 +145,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) const pkgId = `${data.name ?? ''}@${data.version ?? ''}` // name and version are load bearing so we have to clean them up first - if (steps.includes('fixNameField') || steps.includes('normalizeData')) { + if (steps.includes('fixName') || steps.includes('fixNameField') || steps.includes('normalizeData')) { if (!data.name && !strict) { changes?.push('Missing "name" field was set to an empty string') data.name = '' @@ -123,6 +171,13 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) } } + if (steps.includes('fixName')) { + // Check for conflicts with builtin modules + if (moduleBuiltin.builtinModules.includes(data.name)) { + log.warn('package-json', pkgId, `Package name "${data.name}" conflicts with a Node.js built-in module name`) + } + } + if (steps.includes('fixVersionField') || steps.includes('normalizeData')) { // allow "loose" semver 1.0 versions in non-strict mode // enforce strict semver 2.0 compliance in strict mode @@ -130,10 +185,10 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) if (!data.version) { data.version = '' } else { - if (!semver.valid(data.version, loose)) { + if (!valid(data.version, loose)) { throw new Error(`Invalid version: "${data.version}"`) } - const version = semver.clean(data.version, loose) + const version = clean(data.version, loose) if (version !== data.version) { changes?.push(`"version" was cleaned and set to "${version}"`) data.version = version @@ -208,7 +263,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // add "install" attribute if any "*.gyp" files exist if (steps.includes('gypfile')) { if (!scripts.install && !scripts.preinstall && data.gypfile !== false) { - const files = await glob('*.gyp', { cwd: pkg.path }) + const files = await lazyLoadGlob()('*.gyp', { cwd: pkg.path }) if (files.length) { scripts.install = 'node-gyp rebuild' data.scripts = scripts @@ -233,7 +288,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // strip "node_modules/.bin" from scripts entries // remove invalid scripts entries (non-strings) - if (steps.includes('scripts') || steps.includes('scriptpath')) { + if ((steps.includes('scripts') || steps.includes('scriptpath')) && data.scripts !== undefined) { const spre = /^(\.[/\\])?node_modules[/\\].bin[\\/]/ if (typeof data.scripts === 'object') { for (const name in data.scripts) { @@ -275,7 +330,11 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // populate "readme" attribute if (steps.includes('readme') && !data.readme) { const mdre = /\.m?a?r?k?d?o?w?n?$/i - const files = await glob('{README,README.*}', { cwd: pkg.path, nocase: true, mark: true }) + const files = await lazyLoadGlob()('{README,README.*}', { + cwd: pkg.path, + nocase: true, + mark: true, + }) let readmeFile for (const file of files) { // don't accept directories. @@ -297,19 +356,21 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) changes?.push(`"readmeFilename" was set to ${readmeFile}`) } if (!data.readme) { - // this.warn('missingReadme') data.readme = 'ERROR: No README data found!' } } // expand directories.man - if (steps.includes('mans') && !data.man && data.directories?.man) { - const manDir = data.directories.man - const cwd = path.resolve(pkg.path, manDir) - const files = await glob('**/*.[0-9]', { cwd }) - data.man = files.map(man => - path.relative(pkg.path, path.join(cwd, man)).split(path.sep).join('/') - ) + if (steps.includes('mans')) { + if (data.directories?.man && !data.man) { + const manDir = secureAndUnixifyPath(data.directories.man) + const cwd = path.resolve(pkg.path, manDir) + const files = await lazyLoadGlob()('**/*.[0-9]', { cwd }) + data.man = files.map(man => + path.relative(pkg.path, path.join(cwd, man)).split(path.sep).join('/') + ) + } + normalizePackageMan(data, changes) } if (steps.includes('bin') || steps.includes('binDir') || steps.includes('binRefs')) { @@ -318,8 +379,8 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // expand "directories.bin" if (steps.includes('binDir') && data.directories?.bin && !data.bin) { - const binsDir = path.resolve(pkg.path, path.join('.', path.join('/', data.directories.bin))) - const bins = await glob('**', { cwd: binsDir }) + const binsDir = path.resolve(pkg.path, secureAndUnixifyPath(data.directories.bin)) + const bins = await lazyLoadGlob()('**', { cwd: binsDir }) data.bin = bins.reduce((acc, binFile) => { if (binFile && !binFile.startsWith('.')) { const binName = path.basename(binFile) @@ -333,6 +394,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // populate "gitHead" attribute if (steps.includes('gitHead') && !data.gitHead) { + const git = require('@npmcli/git') const gitRoot = await git.find({ cwd: pkg.path, root }) let head if (gitRoot) { @@ -433,7 +495,6 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) // Some steps are isolated so we can do a limited subset of these in `fix` if (steps.includes('fixRepositoryField') || steps.includes('normalizeData')) { if (data.repositories) { - /* eslint-disable-next-line max-len */ changes?.push(`"repository" was set to the first entry in "repositories" (${data.repository})`) data.repository = data.repositories[0] } @@ -446,7 +507,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) } } if (data.repository.url) { - const hosted = hostedGitInfo.fromUrl(data.repository.url) + const hosted = lazyHostedGitInfo().fromUrl(data.repository.url) let r if (hosted) { if (hosted.getDefaultRepresentation() === 'shortcut') { @@ -506,7 +567,7 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) changes?.push(`Removed invalid "${deps}.${d}"`) delete data[deps][d] } - const hosted = hostedGitInfo.fromUrl(data[deps][d])?.toString() + const hosted = lazyHostedGitInfo().fromUrl(data[deps][d])?.toString() if (hosted && hosted !== data[deps][d]) { changes?.push(`Normalized git reference to "${deps}.${d}"`) data[deps][d] = hosted.toString() @@ -517,28 +578,10 @@ const normalize = async (pkg, { strict, steps, root, changes, allowLegacyCase }) } } + // TODO some of this is duplicated in other steps here, a future breaking change may be able to remove the duplicates involved in this step if (steps.includes('normalizeData')) { - legacyFixer.warn = function () { - changes?.push(legacyMakeWarning.apply(null, arguments)) - } - - const legacySteps = [ - 'fixDescriptionField', - 'fixModulesField', - 'fixFilesField', - 'fixManField', - 'fixBugsField', - 'fixKeywordsField', - 'fixBundleDependenciesField', - 'fixHomepageField', - 'fixReadmeField', - 'fixLicenseField', - 'fixPeople', - 'fixTypos', - ] - for (const legacyStep of legacySteps) { - legacyFixer[legacyStep](data) - } + const { normalizeData } = require('./normalize-data.js') + normalizeData(data, changes) } // Warn if the bin references don't point to anything. This might be better diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/read-package.js b/deps/npm/node_modules/@npmcli/package-json/lib/read-package.js new file mode 100644 index 00000000000000..d6c86ce388e6ca --- /dev/null +++ b/deps/npm/node_modules/@npmcli/package-json/lib/read-package.js @@ -0,0 +1,39 @@ +// This is JUST the code needed to open a package.json file and parse it. +// It's isolated out so that code needing to parse a package.json file can do so in the same way as this module does, without needing to require the whole module, or needing to require the underlying parsing library. + +const { readFile } = require('fs/promises') +const parseJSON = require('json-parse-even-better-errors') + +async function read (filename) { + try { + const data = await readFile(filename, 'utf8') + return data + } catch (err) { + err.message = `Could not read package.json: ${err}` + throw err + } +} + +function parse (data) { + try { + const content = parseJSON(data) + return content + } catch (err) { + err.message = `Invalid package.json: ${err}` + throw err + } +} + +// This is what most external libs will use. +// PackageJson will call read and parse separately +async function readPackage (filename) { + const data = await read(filename) + const content = parse(data) + return content +} + +module.exports = { + read, + parse, + readPackage, +} diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/sort.js b/deps/npm/node_modules/@npmcli/package-json/lib/sort.js new file mode 100644 index 00000000000000..0bd0d5199da583 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/package-json/lib/sort.js @@ -0,0 +1,101 @@ +/** + * arbitrary sort order for package.json largely pulled from: + * https://github.com/keithamus/sort-package-json/blob/main/defaultRules.md + * + * cross checked with: + * https://github.com/npm/types/blob/main/types/index.d.ts#L104 + * https://docs.npmjs.com/cli/configuring-npm/package-json + */ +function packageSort (json) { + const { + name, + version, + private: isPrivate, + description, + keywords, + homepage, + bugs, + repository, + funding, + license, + author, + maintainers, + contributors, + type, + imports, + exports, + main, + browser, + types, + bin, + man, + directories, + files, + workspaces, + scripts, + config, + dependencies, + devDependencies, + peerDependencies, + peerDependenciesMeta, + optionalDependencies, + bundledDependencies, + bundleDependencies, + engines, + os, + cpu, + publishConfig, + devEngines, + licenses, + overrides, + ...rest + } = json + + return { + ...(typeof name !== 'undefined' ? { name } : {}), + ...(typeof version !== 'undefined' ? { version } : {}), + ...(typeof isPrivate !== 'undefined' ? { private: isPrivate } : {}), + ...(typeof description !== 'undefined' ? { description } : {}), + ...(typeof keywords !== 'undefined' ? { keywords } : {}), + ...(typeof homepage !== 'undefined' ? { homepage } : {}), + ...(typeof bugs !== 'undefined' ? { bugs } : {}), + ...(typeof repository !== 'undefined' ? { repository } : {}), + ...(typeof funding !== 'undefined' ? { funding } : {}), + ...(typeof license !== 'undefined' ? { license } : {}), + ...(typeof author !== 'undefined' ? { author } : {}), + ...(typeof maintainers !== 'undefined' ? { maintainers } : {}), + ...(typeof contributors !== 'undefined' ? { contributors } : {}), + ...(typeof type !== 'undefined' ? { type } : {}), + ...(typeof imports !== 'undefined' ? { imports } : {}), + ...(typeof exports !== 'undefined' ? { exports } : {}), + ...(typeof main !== 'undefined' ? { main } : {}), + ...(typeof browser !== 'undefined' ? { browser } : {}), + ...(typeof types !== 'undefined' ? { types } : {}), + ...(typeof bin !== 'undefined' ? { bin } : {}), + ...(typeof man !== 'undefined' ? { man } : {}), + ...(typeof directories !== 'undefined' ? { directories } : {}), + ...(typeof files !== 'undefined' ? { files } : {}), + ...(typeof workspaces !== 'undefined' ? { workspaces } : {}), + ...(typeof scripts !== 'undefined' ? { scripts } : {}), + ...(typeof config !== 'undefined' ? { config } : {}), + ...(typeof dependencies !== 'undefined' ? { dependencies } : {}), + ...(typeof devDependencies !== 'undefined' ? { devDependencies } : {}), + ...(typeof peerDependencies !== 'undefined' ? { peerDependencies } : {}), + ...(typeof peerDependenciesMeta !== 'undefined' ? { peerDependenciesMeta } : {}), + ...(typeof optionalDependencies !== 'undefined' ? { optionalDependencies } : {}), + ...(typeof bundledDependencies !== 'undefined' ? { bundledDependencies } : {}), + ...(typeof bundleDependencies !== 'undefined' ? { bundleDependencies } : {}), + ...(typeof engines !== 'undefined' ? { engines } : {}), + ...(typeof os !== 'undefined' ? { os } : {}), + ...(typeof cpu !== 'undefined' ? { cpu } : {}), + ...(typeof publishConfig !== 'undefined' ? { publishConfig } : {}), + ...(typeof devEngines !== 'undefined' ? { devEngines } : {}), + ...(typeof licenses !== 'undefined' ? { licenses } : {}), + ...(typeof overrides !== 'undefined' ? { overrides } : {}), + ...rest, + } +} + +module.exports = { + packageSort, +} diff --git a/deps/npm/node_modules/@npmcli/package-json/package.json b/deps/npm/node_modules/@npmcli/package-json/package.json index ab320e8695ca3d..263d67ff3bc5bf 100644 --- a/deps/npm/node_modules/@npmcli/package-json/package.json +++ b/deps/npm/node_modules/@npmcli/package-json/package.json @@ -1,7 +1,17 @@ { "name": "@npmcli/package-json", - "version": "5.0.0", + "version": "6.2.0", "description": "Programmatic API to update package.json", + "keywords": [ + "npm", + "oss" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/npm/package-json.git" + }, + "license": "ISC", + "author": "GitHub Inc.", "main": "lib/index.js", "files": [ "bin/", @@ -10,52 +20,37 @@ "scripts": { "snap": "tap", "test": "tap", - "lint": "eslint \"**/*.js\"", - "lintfix": "npm run lint -- --fix", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", "postsnap": "npm run lintfix --", "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" - }, - "keywords": [ - "npm", - "oss" - ], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.18.0", - "read-package-json": "^6.0.4", - "read-package-json-fast": "^3.0.2", - "tap": "^16.0.1" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, - "repository": { - "type": "git", - "url": "https://github.com/npm/package-json.git" + "devDependencies": { + "@npmcli/eslint-config": "^5.1.0", + "@npmcli/template-oss": "4.23.6", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^4.0.0", + "tap": "^16.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.18.0", - "publish": "true", - "ciVersions": [ - "16.14.0", - "16.x", - "18.0.0", - "18.x" - ] + "version": "4.23.6", + "publish": "true" }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js b/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js index b31395ebb5bcd4..aa7b55d8f038d4 100644 --- a/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js +++ b/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js @@ -12,54 +12,55 @@ const promiseSpawn = (cmd, args, opts = {}, extra = {}) => { return spawnWithShell(cmd, args, opts, extra) } - let proc + let resolve, reject + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve + reject = _reject + }) - const p = new Promise((res, rej) => { - proc = spawn(cmd, args, opts) + // Create error here so we have a more useful stack trace when rejecting + const closeError = new Error('command failed') - const stdout = [] - const stderr = [] + const stdout = [] + const stderr = [] - const reject = er => rej(Object.assign(er, { - cmd, - args, - ...stdioResult(stdout, stderr, opts), - ...extra, - })) + const getResult = (result) => ({ + cmd, + args, + ...result, + ...stdioResult(stdout, stderr, opts), + ...extra, + }) + const rejectWithOpts = (er, erOpts) => { + const resultError = getResult(erOpts) + reject(Object.assign(er, resultError)) + } - proc.on('error', reject) + const proc = spawn(cmd, args, opts) + promise.stdin = proc.stdin + promise.process = proc - if (proc.stdout) { - proc.stdout.on('data', c => stdout.push(c)).on('error', reject) - proc.stdout.on('error', er => reject(er)) - } + proc.on('error', rejectWithOpts) - if (proc.stderr) { - proc.stderr.on('data', c => stderr.push(c)).on('error', reject) - proc.stderr.on('error', er => reject(er)) - } + if (proc.stdout) { + proc.stdout.on('data', c => stdout.push(c)) + proc.stdout.on('error', rejectWithOpts) + } - proc.on('close', (code, signal) => { - const result = { - cmd, - args, - code, - signal, - ...stdioResult(stdout, stderr, opts), - ...extra, - } + if (proc.stderr) { + proc.stderr.on('data', c => stderr.push(c)) + proc.stderr.on('error', rejectWithOpts) + } - if (code || signal) { - rej(Object.assign(new Error('command failed'), result)) - } else { - res(result) - } - }) + proc.on('close', (code, signal) => { + if (code || signal) { + rejectWithOpts(closeError, { code, signal }) + } else { + resolve(getResult({ code, signal })) + } }) - p.stdin = proc.stdin - p.process = proc - return p + return promise } const spawnWithShell = (cmd, args, opts, extra) => { @@ -130,9 +131,19 @@ const open = (_args, opts = {}, extra = {}) => { let platform = process.platform // process.platform === 'linux' may actually indicate WSL, if that's the case - // we want to treat things as win32 anyway so the host can open the argument + // open the argument with sensible-browser which is pre-installed + // In WSL, set the default browser using, for example, + // export BROWSER="/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" + // or + // export BROWSER="/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" + // To permanently set the default browser, add the appropriate entry to your shell's + // RC file, e.g. .bashrc or .zshrc. if (platform === 'linux' && os.release().toLowerCase().includes('microsoft')) { - platform = 'win32' + platform = 'wsl' + if (!process.env.BROWSER) { + return Promise.reject( + new Error('Set the BROWSER environment variable to your desired browser.')) + } } let command = options.command @@ -145,6 +156,8 @@ const open = (_args, opts = {}, extra = {}) => { // accidentally interpret the first arg as the title, we stick an empty // string immediately after the start command command = 'start ""' + } else if (platform === 'wsl') { + command = 'sensible-browser' } else if (platform === 'darwin') { command = 'open' } else { diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/package.json b/deps/npm/node_modules/@npmcli/promise-spawn/package.json index 6e161b7404b858..f5fb026be50e85 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": "7.0.1", + "version": "8.0.2", "files": [ "bin/", "lib/" @@ -9,19 +9,20 @@ "description": "spawn processes the way the npm cli likes to do", "repository": { "type": "git", - "url": "https://github.com/npm/promise-spawn.git" + "url": "git+https://github.com/npm/promise-spawn.git" }, "author": "GitHub Inc.", "license": "ISC", "scripts": { "test": "tap", "snap": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", "postsnap": "npm run lintfix --", "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "tap": { "check-coverage": true, @@ -31,20 +32,20 @@ ] }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.4", "spawk": "^1.7.1", "tap": "^16.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.23.4", "publish": true }, "dependencies": { - "which": "^4.0.0" + "which": "^5.0.0" } } diff --git a/deps/npm/node_modules/@npmcli/query/package.json b/deps/npm/node_modules/@npmcli/query/package.json index ad45c18c44cd64..20660b227834d9 100644 --- a/deps/npm/node_modules/@npmcli/query/package.json +++ b/deps/npm/node_modules/@npmcli/query/package.json @@ -1,16 +1,17 @@ { "name": "@npmcli/query", - "version": "3.1.0", + "version": "4.0.1", "description": "npm query parser and tools", "main": "lib/index.js", "scripts": { "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "snap": "tap", - "posttest": "npm run lint" + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "contributors": [ { @@ -35,24 +36,24 @@ "lib/" ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.21.3", + "version": "4.23.3", "publish": true }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "tap": "^16.2.0" }, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^7.0.0" }, "repository": { "type": "git", - "url": "https://github.com/npm/query.git" + "url": "git+https://github.com/npm/query.git" }, "tap": { "nyc-arg": [ diff --git a/deps/npm/node_modules/@npmcli/redact/lib/deep-map.js b/deps/npm/node_modules/@npmcli/redact/lib/deep-map.js new file mode 100644 index 00000000000000..c14857c2c01b17 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/redact/lib/deep-map.js @@ -0,0 +1,71 @@ +const { serializeError } = require('./error') + +const deepMap = (input, handler = v => v, path = ['$'], seen = new Set([input])) => { + // this is in an effort to maintain bole's error logging behavior + if (path.join('.') === '$' && input instanceof Error) { + return deepMap({ err: serializeError(input) }, handler, path, seen) + } + if (input instanceof Error) { + return deepMap(serializeError(input), handler, path, seen) + } + // allows for non-node js environments, sush as workers + if (typeof Buffer !== 'undefined' && input instanceof Buffer) { + return `[unable to log instanceof buffer]` + } + if (input instanceof Uint8Array) { + return `[unable to log instanceof Uint8Array]` + } + + if (Array.isArray(input)) { + const result = [] + for (let i = 0; i < input.length; i++) { + const element = input[i] + const elementPath = [...path, i] + if (element instanceof Object) { + if (!seen.has(element)) { // avoid getting stuck in circular reference + seen.add(element) + result.push(deepMap(handler(element, elementPath), handler, elementPath, seen)) + } + } else { + result.push(handler(element, elementPath)) + } + } + return result + } + + if (input === null) { + return null + } else if (typeof input === 'object' || typeof input === 'function') { + const result = {} + + for (const propertyName of Object.getOwnPropertyNames(input)) { + // skip logging internal properties + if (propertyName.startsWith('_')) { + continue + } + + try { + const property = input[propertyName] + const propertyPath = [...path, propertyName] + if (property instanceof Object) { + if (!seen.has(property)) { // avoid getting stuck in circular reference + seen.add(property) + result[propertyName] = deepMap( + handler(property, propertyPath), handler, propertyPath, seen + ) + } + } else { + result[propertyName] = handler(property, propertyPath) + } + } catch (err) { + // a getter may throw an error + result[propertyName] = `[error getting value: ${err.message}]` + } + } + return result + } + + return handler(input, path) +} + +module.exports = { deepMap } diff --git a/deps/npm/node_modules/@npmcli/redact/lib/error.js b/deps/npm/node_modules/@npmcli/redact/lib/error.js new file mode 100644 index 00000000000000..e374b3902a2853 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/redact/lib/error.js @@ -0,0 +1,28 @@ +/** takes an error object and serializes it to a plan object */ +function serializeError (input) { + if (!(input instanceof Error)) { + if (typeof input === 'string') { + const error = new Error(`attempted to serialize a non-error, string String, "${input}"`) + return serializeError(error) + } + const error = new Error(`attempted to serialize a non-error, ${typeof input} ${input?.constructor?.name}`) + return serializeError(error) + } + // different error objects store status code differently + // AxiosError uses `status`, other services use `statusCode` + const statusCode = input.statusCode ?? input.status + // CAUTION: what we serialize here gets add to the size of logs + return { + errorType: input.errorType ?? input.constructor.name, + ...(input.message ? { message: input.message } : {}), + ...(input.stack ? { stack: input.stack } : {}), + // think of this as error code + ...(input.code ? { code: input.code } : {}), + // think of this as http status code + ...(statusCode ? { statusCode } : {}), + } +} + +module.exports = { + serializeError, +} diff --git a/deps/npm/node_modules/@npmcli/redact/lib/index.js b/deps/npm/node_modules/@npmcli/redact/lib/index.js index e5b5e74157c2a3..9b10c7f6a0081d 100644 --- a/deps/npm/node_modules/@npmcli/redact/lib/index.js +++ b/deps/npm/node_modules/@npmcli/redact/lib/index.js @@ -1,29 +1,15 @@ -const { URL } = require('url') +const matchers = require('./matchers') +const { redactUrlPassword } = require('./utils') const REPLACE = '***' -const TOKEN_REGEX = /\bnpm_[a-zA-Z0-9]{36}\b/g -const GUID_REGEX = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/g const redact = (value) => { if (typeof value !== 'string' || !value) { return value } - - let urlValue - try { - urlValue = new URL(value) - } catch { - // If it's not a URL then we can ignore all errors - } - - if (urlValue?.password) { - urlValue.password = REPLACE - value = urlValue.toString() - } - - return value - .replace(TOKEN_REGEX, `npm_${REPLACE}`) - .replace(GUID_REGEX, REPLACE) + return redactUrlPassword(value, REPLACE) + .replace(matchers.NPM_SECRET.pattern, `npm_${REPLACE}`) + .replace(matchers.UUID.pattern, REPLACE) } // split on \s|= similar to how nopt parses options @@ -49,7 +35,6 @@ const redactLog = (arg) => { } else if (Array.isArray(arg)) { return arg.map((a) => typeof a === 'string' ? splitAndRedact(a) : a) } - return arg } diff --git a/deps/npm/node_modules/@npmcli/redact/lib/matchers.js b/deps/npm/node_modules/@npmcli/redact/lib/matchers.js new file mode 100644 index 00000000000000..854ba8e1cbda14 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/redact/lib/matchers.js @@ -0,0 +1,88 @@ +const TYPE_REGEX = 'regex' +const TYPE_URL = 'url' +const TYPE_PATH = 'path' + +const NPM_SECRET = { + type: TYPE_REGEX, + pattern: /\b(npms?_)[a-zA-Z0-9]{36,48}\b/gi, + replacement: `[REDACTED_NPM_SECRET]`, +} + +const AUTH_HEADER = { + type: TYPE_REGEX, + pattern: /\b(Basic\s+|Bearer\s+)[\w+=\-.]+\b/gi, + replacement: `[REDACTED_AUTH_HEADER]`, +} + +const JSON_WEB_TOKEN = { + type: TYPE_REGEX, + pattern: /\b[A-Za-z0-9-_]{10,}(?!\.\d+\.)\.[A-Za-z0-9-_]{3,}\.[A-Za-z0-9-_]{20,}\b/gi, + replacement: `[REDACTED_JSON_WEB_TOKEN]`, +} + +const UUID = { + type: TYPE_REGEX, + pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi, + replacement: `[REDACTED_UUID]`, +} + +const URL_MATCHER = { + type: TYPE_REGEX, + pattern: /(?:https?|ftp):\/\/[^\s/"$.?#].[^\s"]*/gi, + replacement: '[REDACTED_URL]', +} + +const DEEP_HEADER_AUTHORIZATION = { + type: TYPE_PATH, + predicate: ({ path }) => path.endsWith('.headers.authorization'), + replacement: '[REDACTED_HEADER_AUTHORIZATION]', +} + +const DEEP_HEADER_SET_COOKIE = { + type: TYPE_PATH, + predicate: ({ path }) => path.endsWith('.headers.set-cookie'), + replacement: '[REDACTED_HEADER_SET_COOKIE]', +} + +const DEEP_HEADER_COOKIE = { + type: TYPE_PATH, + predicate: ({ path }) => path.endsWith('.headers.cookie'), + replacement: '[REDACTED_HEADER_COOKIE]', +} + +const REWRITE_REQUEST = { + type: TYPE_PATH, + predicate: ({ path }) => path.endsWith('.request'), + replacement: (input) => ({ + method: input?.method, + path: input?.path, + headers: input?.headers, + url: input?.url, + }), +} + +const REWRITE_RESPONSE = { + type: TYPE_PATH, + predicate: ({ path }) => path.endsWith('.response'), + replacement: (input) => ({ + data: input?.data, + status: input?.status, + headers: input?.headers, + }), +} + +module.exports = { + TYPE_REGEX, + TYPE_URL, + TYPE_PATH, + NPM_SECRET, + AUTH_HEADER, + JSON_WEB_TOKEN, + UUID, + URL_MATCHER, + DEEP_HEADER_AUTHORIZATION, + DEEP_HEADER_SET_COOKIE, + DEEP_HEADER_COOKIE, + REWRITE_REQUEST, + REWRITE_RESPONSE, +} diff --git a/deps/npm/node_modules/@npmcli/redact/lib/server.js b/deps/npm/node_modules/@npmcli/redact/lib/server.js new file mode 100644 index 00000000000000..555e37dcc1f54c --- /dev/null +++ b/deps/npm/node_modules/@npmcli/redact/lib/server.js @@ -0,0 +1,59 @@ +const { + AUTH_HEADER, + JSON_WEB_TOKEN, + NPM_SECRET, + DEEP_HEADER_AUTHORIZATION, + DEEP_HEADER_SET_COOKIE, + REWRITE_REQUEST, + REWRITE_RESPONSE, + DEEP_HEADER_COOKIE, +} = require('./matchers') + +const { + redactUrlMatcher, + redactUrlPasswordMatcher, + redactMatchers, +} = require('./utils') + +const { serializeError } = require('./error') + +const { deepMap } = require('./deep-map') + +const _redact = redactMatchers( + NPM_SECRET, + AUTH_HEADER, + JSON_WEB_TOKEN, + DEEP_HEADER_AUTHORIZATION, + DEEP_HEADER_SET_COOKIE, + DEEP_HEADER_COOKIE, + REWRITE_REQUEST, + REWRITE_RESPONSE, + redactUrlMatcher( + redactUrlPasswordMatcher() + ) +) + +const redact = (input) => deepMap(input, (value, path) => _redact(value, { path })) + +/** takes an error returns new error keeping some custom properties */ +function redactError (input) { + const { message, ...data } = serializeError(input) + const output = new Error(redact(message)) + return Object.assign(output, redact(data)) +} + +/** runs a function within try / catch and throws error wrapped in redactError */ +function redactThrow (func) { + if (typeof func !== 'function') { + throw new Error('redactThrow expects a function') + } + return async (...args) => { + try { + return await func(...args) + } catch (error) { + throw redactError(error) + } + } +} + +module.exports = { redact, redactError, redactThrow } diff --git a/deps/npm/node_modules/@npmcli/redact/lib/utils.js b/deps/npm/node_modules/@npmcli/redact/lib/utils.js new file mode 100644 index 00000000000000..8395ab25fc373e --- /dev/null +++ b/deps/npm/node_modules/@npmcli/redact/lib/utils.js @@ -0,0 +1,202 @@ +const { + URL_MATCHER, + TYPE_URL, + TYPE_REGEX, + TYPE_PATH, +} = require('./matchers') + +/** + * creates a string of asterisks, + * this forces a minimum asterisk for security purposes + */ +const asterisk = (length = 0) => { + length = typeof length === 'string' ? length.length : length + if (length < 8) { + return '*'.repeat(8) + } + return '*'.repeat(length) +} + +/** + * escapes all special regex chars + * @see https://stackoverflow.com/a/9310752 + * @see https://github.com/tc39/proposal-regex-escaping + */ +const escapeRegExp = (text) => { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, `\\$&`) +} + +/** + * provieds a regex "or" of the url versions of a string + */ +const urlEncodeRegexGroup = (value) => { + const decoded = decodeURIComponent(value) + const encoded = encodeURIComponent(value) + const union = [...new Set([encoded, decoded, value])].map(escapeRegExp).join('|') + return union +} + +/** + * a tagged template literal that returns a regex ensures all variables are excaped + */ +const urlEncodeRegexTag = (strings, ...values) => { + let pattern = '' + for (let i = 0; i < values.length; i++) { + pattern += strings[i] + `(${urlEncodeRegexGroup(values[i])})` + } + pattern += strings[strings.length - 1] + return new RegExp(pattern) +} + +/** + * creates a matcher for redacting url hostname + */ +const redactUrlHostnameMatcher = ({ hostname, replacement } = {}) => ({ + type: TYPE_URL, + predicate: ({ url }) => url.hostname === hostname, + pattern: ({ url }) => { + return urlEncodeRegexTag`(^${url.protocol}//${url.username}:.+@)?${url.hostname}` + }, + replacement: `$1${replacement || asterisk()}`, +}) + +/** + * creates a matcher for redacting url search / query parameter values + */ +const redactUrlSearchParamsMatcher = ({ param, replacement } = {}) => ({ + type: TYPE_URL, + predicate: ({ url }) => url.searchParams.has(param), + pattern: ({ url }) => urlEncodeRegexTag`(${param}=)${url.searchParams.get(param)}`, + replacement: `$1${replacement || asterisk()}`, +}) + +/** creates a matcher for redacting the url password */ +const redactUrlPasswordMatcher = ({ replacement } = {}) => ({ + type: TYPE_URL, + predicate: ({ url }) => url.password, + pattern: ({ url }) => urlEncodeRegexTag`(^${url.protocol}//${url.username}:)${url.password}`, + replacement: `$1${replacement || asterisk()}`, +}) + +const redactUrlReplacement = (...matchers) => (subValue) => { + try { + const url = new URL(subValue) + return redactMatchers(...matchers)(subValue, { url }) + } catch (err) { + return subValue + } +} + +/** + * creates a matcher / submatcher for urls, this function allows you to first + * collect all urls within a larger string and then pass those urls to a + * submatcher + * + * @example + * console.log("this will first match all urls, then pass those urls to the password patcher") + * redactMatchers(redactUrlMatcher(redactUrlPasswordMatcher())) + * + * @example + * console.log( + * "this will assume you are passing in a string that is a url, and will redact the password" + * ) + * redactMatchers(redactUrlPasswordMatcher()) + * + */ +const redactUrlMatcher = (...matchers) => { + return { + ...URL_MATCHER, + replacement: redactUrlReplacement(...matchers), + } +} + +const matcherFunctions = { + [TYPE_REGEX]: (matcher) => (value) => { + if (typeof value === 'string') { + value = value.replace(matcher.pattern, matcher.replacement) + } + return value + }, + [TYPE_URL]: (matcher) => (value, ctx) => { + if (typeof value === 'string') { + try { + const url = ctx?.url || new URL(value) + const { predicate, pattern } = matcher + const predicateValue = predicate({ url }) + if (predicateValue) { + value = value.replace(pattern({ url }), matcher.replacement) + } + } catch (_e) { + return value + } + } + return value + }, + [TYPE_PATH]: (matcher) => (value, ctx) => { + const rawPath = ctx?.path + const path = rawPath.join('.').toLowerCase() + const { predicate, replacement } = matcher + const replace = typeof replacement === 'function' ? replacement : () => replacement + const shouldRun = predicate({ rawPath, path }) + if (shouldRun) { + value = replace(value, { rawPath, path }) + } + return value + }, +} + +/** converts a matcher to a function */ +const redactMatcher = (matcher) => { + return matcherFunctions[matcher.type](matcher) +} + +/** converts a series of matchers to a function */ +const redactMatchers = (...matchers) => (value, ctx) => { + const flatMatchers = matchers.flat() + return flatMatchers.reduce((result, matcher) => { + const fn = (typeof matcher === 'function') ? matcher : redactMatcher(matcher) + return fn(result, ctx) + }, value) +} + +/** + * replacement handler, keeping $1 (if it exists) and replacing the + * rest of the string with asterisks, maintaining string length + */ +const redactDynamicReplacement = () => (value, start) => { + if (typeof start === 'number') { + return asterisk(value) + } + return start + asterisk(value.substring(start.length).length) +} + +/** + * replacement handler, keeping $1 (if it exists) and replacing the + * rest of the string with a fixed number of asterisks + */ +const redactFixedReplacement = (length) => (_value, start) => { + if (typeof start === 'number') { + return asterisk(length) + } + return start + asterisk(length) +} + +const redactUrlPassword = (value, replacement) => { + return redactMatchers(redactUrlPasswordMatcher({ replacement }))(value) +} + +module.exports = { + asterisk, + escapeRegExp, + urlEncodeRegexGroup, + urlEncodeRegexTag, + redactUrlHostnameMatcher, + redactUrlSearchParamsMatcher, + redactUrlPasswordMatcher, + redactUrlMatcher, + redactUrlReplacement, + redactDynamicReplacement, + redactFixedReplacement, + redactMatchers, + redactUrlPassword, +} diff --git a/deps/npm/node_modules/@npmcli/redact/package.json b/deps/npm/node_modules/@npmcli/redact/package.json index 1fc64a4c02f28e..b5070113b1330c 100644 --- a/deps/npm/node_modules/@npmcli/redact/package.json +++ b/deps/npm/node_modules/@npmcli/redact/package.json @@ -1,16 +1,22 @@ { "name": "@npmcli/redact", - "version": "1.1.0", + "version": "3.2.2", "description": "Redact sensitive npm information from output", "main": "lib/index.js", + "exports": { + ".": "./lib/index.js", + "./server": "./lib/server.js", + "./package.json": "./package.json" + }, "scripts": { "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "snap": "tap", - "posttest": "npm run lint" + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "keywords": [], "author": "GitHub Inc.", @@ -21,25 +27,26 @@ ], "repository": { "type": "git", - "url": "https://github.com/npm/redact.git" + "url": "git+https://github.com/npm/redact.git" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", + "version": "4.24.3", "publish": true }, "tap": { "nyc-arg": [ "--exclude", "tap-snapshots/**" - ] + ], + "timeout": 120 }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.2", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.24.3", "tap": "^16.3.10" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/@npmcli/run-script/lib/make-spawn-args.js b/deps/npm/node_modules/@npmcli/run-script/lib/make-spawn-args.js index 8a32d7198cb2e2..1c9f02c062f726 100644 --- a/deps/npm/node_modules/@npmcli/run-script/lib/make-spawn-args.js +++ b/deps/npm/node_modules/@npmcli/run-script/lib/make-spawn-args.js @@ -1,21 +1,34 @@ /* eslint camelcase: "off" */ const setPATH = require('./set-path.js') const { resolve } = require('path') -const npm_config_node_gyp = require.resolve('node-gyp/bin/node-gyp.js') + +let npm_config_node_gyp const makeSpawnArgs = options => { const { + args, + binPaths, + cmd, + env, event, + nodeGyp, path, scriptShell = true, - binPaths, - env, stdio, - cmd, - args, stdioString, } = options + if (nodeGyp) { + // npm already pulled this from env and passes it in to options + npm_config_node_gyp = nodeGyp + } else if (env.npm_config_node_gyp) { + // legacy mode for standalone user + npm_config_node_gyp = env.npm_config_node_gyp + } else { + // default + npm_config_node_gyp = require.resolve('node-gyp/bin/node-gyp.js') + } + const spawnEnv = setPATH(path, binPaths, { // we need to at least save the PATH environment var ...process.env, diff --git a/deps/npm/node_modules/@npmcli/run-script/lib/run-script-pkg.js b/deps/npm/node_modules/@npmcli/run-script/lib/run-script-pkg.js index ea33db56298586..161caebb98d975 100644 --- a/deps/npm/node_modules/@npmcli/run-script/lib/run-script-pkg.js +++ b/deps/npm/node_modules/@npmcli/run-script/lib/run-script-pkg.js @@ -5,35 +5,21 @@ const { isNodeGypPackage, defaultGypInstallScript } = require('@npmcli/node-gyp' const signalManager = require('./signal-manager.js') const isServerPackage = require('./is-server-package.js') -// you wouldn't like me when I'm angry... -const bruce = (id, event, cmd, args) => { - let banner = id - ? `\n> ${id} ${event}\n` - : `\n> ${event}\n` - banner += `> ${cmd.trim().replace(/\n/g, '\n> ')}` - if (args.length) { - banner += ` ${args.join(' ')}` - } - banner += '\n' - return banner -} - const runScriptPkg = async options => { const { - event, - path, - scriptShell, + args = [], binPaths = false, env = {}, - stdio = 'pipe', + event, + nodeGyp, + path, pkg, - args = [], - stdioString, - // note: only used when stdio:inherit - banner = true, + scriptShell, // how long to wait for a process.kill signal // only exposed here so that we can make the test go a bit faster. signalTimeout = 500, + stdio = 'pipe', + stdioString, } = options const { scripts = {}, gypfile } = pkg @@ -59,20 +45,34 @@ const runScriptPkg = async options => { return { code: 0, signal: null } } - if (stdio === 'inherit' && banner !== false) { - // we're dumping to the parent's stdout, so print the banner - console.log(bruce(pkg._id, event, cmd, args)) + let inputEnd = () => {} + if (stdio === 'inherit') { + let banner + if (pkg._id) { + banner = `\n> ${pkg._id} ${event}\n` + } else { + banner = `\n> ${event}\n` + } + banner += `> ${cmd.trim().replace(/\n/g, '\n> ')}` + if (args.length) { + banner += ` ${args.join(' ')}` + } + banner += '\n' + const { output, input } = require('proc-log') + output.standard(banner) + inputEnd = input.start() } const [spawnShell, spawnArgs, spawnOpts] = makeSpawnArgs({ + args, + binPaths, + cmd, + env: { ...env, ...packageEnvs(pkg) }, event, + nodeGyp, path, scriptShell, - binPaths, - env: { ...env, ...packageEnvs(pkg) }, stdio, - cmd, - args, stdioString, }) @@ -108,7 +108,7 @@ const runScriptPkg = async options => { } else { throw er } - }) + }).finally(inputEnd) } module.exports = runScriptPkg diff --git a/deps/npm/node_modules/@npmcli/run-script/package.json b/deps/npm/node_modules/@npmcli/run-script/package.json index 1c98b1b170e265..6003a73943ecf0 100644 --- a/deps/npm/node_modules/@npmcli/run-script/package.json +++ b/deps/npm/node_modules/@npmcli/run-script/package.json @@ -1,31 +1,32 @@ { "name": "@npmcli/run-script", - "version": "7.0.4", + "version": "9.1.0", "description": "Run a lifecycle script for a package (descendant of npm-lifecycle)", "author": "GitHub Inc.", "license": "ISC", "scripts": { "test": "tap", - "eslint": "eslint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "lint": "npm run eslint", + "lintfix": "npm run eslint -- --fix", "postlint": "template-oss-check", "snap": "tap", "posttest": "npm run lint", "template-oss-apply": "template-oss-apply --force" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.24.1", "spawk": "^1.8.1", "tap": "^16.0.1" }, "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "which": "^4.0.0" + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "files": [ "bin/", @@ -34,14 +35,14 @@ "main": "lib/run-script.js", "repository": { "type": "git", - "url": "https://github.com/npm/run-script.git" + "url": "git+https://github.com/npm/run-script.git" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "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.21.3", + "version": "4.24.1", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/build.js b/deps/npm/node_modules/@sigstore/bundle/dist/build.js deleted file mode 100644 index 6990f5451a2d33..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/dist/build.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toDSSEBundle = exports.toMessageSignatureBundle = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const protobuf_specs_1 = require("@sigstore/protobuf-specs"); -const bundle_1 = require("./bundle"); -// Message signature bundle - $case: 'messageSignature' -function toMessageSignatureBundle(options) { - return { - mediaType: bundle_1.BUNDLE_V02_MEDIA_TYPE, - content: { - $case: 'messageSignature', - messageSignature: { - messageDigest: { - algorithm: protobuf_specs_1.HashAlgorithm.SHA2_256, - digest: options.digest, - }, - signature: options.signature, - }, - }, - verificationMaterial: toVerificationMaterial(options), - }; -} -exports.toMessageSignatureBundle = toMessageSignatureBundle; -// DSSE envelope bundle - $case: 'dsseEnvelope' -function toDSSEBundle(options) { - return { - mediaType: bundle_1.BUNDLE_V02_MEDIA_TYPE, - content: { - $case: 'dsseEnvelope', - dsseEnvelope: toEnvelope(options), - }, - verificationMaterial: toVerificationMaterial(options), - }; -} -exports.toDSSEBundle = toDSSEBundle; -function toEnvelope(options) { - return { - payloadType: options.artifactType, - payload: options.artifact, - signatures: [toSignature(options)], - }; -} -function toSignature(options) { - return { - keyid: options.keyHint || '', - sig: options.signature, - }; -} -// Verification material -function toVerificationMaterial(options) { - return { - content: toKeyContent(options), - tlogEntries: [], - timestampVerificationData: { rfc3161Timestamps: [] }, - }; -} -function toKeyContent(options) { - if (options.certificate) { - return { - $case: 'x509CertificateChain', - x509CertificateChain: { - certificates: [{ rawBytes: options.certificate }], - }, - }; - } - else { - return { - $case: 'publicKey', - publicKey: { - hint: options.keyHint || '', - }, - }; - } -} diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js b/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js deleted file mode 100644 index 60574b309c09cb..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isBundleWithDsseEnvelope = exports.isBundleWithMessageSignature = exports.isBundleWithPublicKey = exports.isBundleWithCertificateChain = exports.BUNDLE_V03_MEDIA_TYPE = exports.BUNDLE_V02_MEDIA_TYPE = exports.BUNDLE_V01_MEDIA_TYPE = void 0; -exports.BUNDLE_V01_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.1'; -exports.BUNDLE_V02_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.2'; -exports.BUNDLE_V03_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.3'; -// Type guards for bundle variants. -function isBundleWithCertificateChain(b) { - return b.verificationMaterial.content.$case === 'x509CertificateChain'; -} -exports.isBundleWithCertificateChain = isBundleWithCertificateChain; -function isBundleWithPublicKey(b) { - return b.verificationMaterial.content.$case === 'publicKey'; -} -exports.isBundleWithPublicKey = isBundleWithPublicKey; -function isBundleWithMessageSignature(b) { - return b.content.$case === 'messageSignature'; -} -exports.isBundleWithMessageSignature = isBundleWithMessageSignature; -function isBundleWithDsseEnvelope(b) { - return b.content.$case === 'dsseEnvelope'; -} -exports.isBundleWithDsseEnvelope = isBundleWithDsseEnvelope; diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/index.js b/deps/npm/node_modules/@sigstore/bundle/dist/index.js deleted file mode 100644 index f2b50994e9b1f5..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/dist/index.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isBundleV01 = exports.assertBundleV02 = exports.assertBundleV01 = exports.assertBundleLatest = exports.assertBundle = exports.envelopeToJSON = exports.envelopeFromJSON = exports.bundleToJSON = exports.bundleFromJSON = exports.ValidationError = exports.isBundleWithPublicKey = exports.isBundleWithMessageSignature = exports.isBundleWithDsseEnvelope = exports.isBundleWithCertificateChain = exports.BUNDLE_V03_MEDIA_TYPE = exports.BUNDLE_V02_MEDIA_TYPE = exports.BUNDLE_V01_MEDIA_TYPE = exports.toMessageSignatureBundle = exports.toDSSEBundle = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -var build_1 = require("./build"); -Object.defineProperty(exports, "toDSSEBundle", { enumerable: true, get: function () { return build_1.toDSSEBundle; } }); -Object.defineProperty(exports, "toMessageSignatureBundle", { enumerable: true, get: function () { return build_1.toMessageSignatureBundle; } }); -var bundle_1 = require("./bundle"); -Object.defineProperty(exports, "BUNDLE_V01_MEDIA_TYPE", { enumerable: true, get: function () { return bundle_1.BUNDLE_V01_MEDIA_TYPE; } }); -Object.defineProperty(exports, "BUNDLE_V02_MEDIA_TYPE", { enumerable: true, get: function () { return bundle_1.BUNDLE_V02_MEDIA_TYPE; } }); -Object.defineProperty(exports, "BUNDLE_V03_MEDIA_TYPE", { enumerable: true, get: function () { return bundle_1.BUNDLE_V03_MEDIA_TYPE; } }); -Object.defineProperty(exports, "isBundleWithCertificateChain", { enumerable: true, get: function () { return bundle_1.isBundleWithCertificateChain; } }); -Object.defineProperty(exports, "isBundleWithDsseEnvelope", { enumerable: true, get: function () { return bundle_1.isBundleWithDsseEnvelope; } }); -Object.defineProperty(exports, "isBundleWithMessageSignature", { enumerable: true, get: function () { return bundle_1.isBundleWithMessageSignature; } }); -Object.defineProperty(exports, "isBundleWithPublicKey", { enumerable: true, get: function () { return bundle_1.isBundleWithPublicKey; } }); -var error_1 = require("./error"); -Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return error_1.ValidationError; } }); -var serialized_1 = require("./serialized"); -Object.defineProperty(exports, "bundleFromJSON", { enumerable: true, get: function () { return serialized_1.bundleFromJSON; } }); -Object.defineProperty(exports, "bundleToJSON", { enumerable: true, get: function () { return serialized_1.bundleToJSON; } }); -Object.defineProperty(exports, "envelopeFromJSON", { enumerable: true, get: function () { return serialized_1.envelopeFromJSON; } }); -Object.defineProperty(exports, "envelopeToJSON", { enumerable: true, get: function () { return serialized_1.envelopeToJSON; } }); -var validate_1 = require("./validate"); -Object.defineProperty(exports, "assertBundle", { enumerable: true, get: function () { return validate_1.assertBundle; } }); -Object.defineProperty(exports, "assertBundleLatest", { enumerable: true, get: function () { return validate_1.assertBundleLatest; } }); -Object.defineProperty(exports, "assertBundleV01", { enumerable: true, get: function () { return validate_1.assertBundleV01; } }); -Object.defineProperty(exports, "assertBundleV02", { enumerable: true, get: function () { return validate_1.assertBundleV02; } }); -Object.defineProperty(exports, "isBundleV01", { enumerable: true, get: function () { return validate_1.isBundleV01; } }); diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/validate.js b/deps/npm/node_modules/@sigstore/bundle/dist/validate.js deleted file mode 100644 index 6a59ecc230f4ac..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/dist/validate.js +++ /dev/null @@ -1,198 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertBundleLatest = exports.assertBundleV02 = exports.isBundleV01 = exports.assertBundleV01 = exports.assertBundle = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const error_1 = require("./error"); -// Performs basic validation of a Sigstore bundle to ensure that all required -// fields are populated. This is not a complete validation of the bundle, but -// rather a check that the bundle is in a valid state to be processed by the -// rest of the code. -function assertBundle(b) { - const invalidValues = validateBundleBase(b); - if (invalidValues.length > 0) { - throw new error_1.ValidationError('invalid bundle', invalidValues); - } -} -exports.assertBundle = assertBundle; -// Asserts that the given bundle conforms to the v0.1 bundle format. -function assertBundleV01(b) { - const invalidValues = []; - invalidValues.push(...validateBundleBase(b)); - invalidValues.push(...validateInclusionPromise(b)); - if (invalidValues.length > 0) { - throw new error_1.ValidationError('invalid v0.1 bundle', invalidValues); - } -} -exports.assertBundleV01 = assertBundleV01; -// Type guard to determine if Bundle is a v0.1 bundle. -function isBundleV01(b) { - try { - assertBundleV01(b); - return true; - } - catch (e) { - return false; - } -} -exports.isBundleV01 = isBundleV01; -// Asserts that the given bundle conforms to the v0.2 bundle format. -function assertBundleV02(b) { - const invalidValues = []; - invalidValues.push(...validateBundleBase(b)); - invalidValues.push(...validateInclusionProof(b)); - if (invalidValues.length > 0) { - throw new error_1.ValidationError('invalid v0.2 bundle', invalidValues); - } -} -exports.assertBundleV02 = assertBundleV02; -// Asserts that the given bundle conforms to the newest (0.3) bundle format. -function assertBundleLatest(b) { - const invalidValues = []; - invalidValues.push(...validateBundleBase(b)); - invalidValues.push(...validateInclusionProof(b)); - invalidValues.push(...validateNoCertificateChain(b)); - if (invalidValues.length > 0) { - throw new error_1.ValidationError('invalid bundle', invalidValues); - } -} -exports.assertBundleLatest = assertBundleLatest; -function validateBundleBase(b) { - const invalidValues = []; - // Media type validation - if (b.mediaType === undefined || - !b.mediaType.startsWith('application/vnd.dev.sigstore.bundle+json;version=')) { - invalidValues.push('mediaType'); - } - // Content-related validation - if (b.content === undefined) { - invalidValues.push('content'); - } - else { - switch (b.content.$case) { - case 'messageSignature': - if (b.content.messageSignature.messageDigest === undefined) { - invalidValues.push('content.messageSignature.messageDigest'); - } - else { - if (b.content.messageSignature.messageDigest.digest.length === 0) { - invalidValues.push('content.messageSignature.messageDigest.digest'); - } - } - if (b.content.messageSignature.signature.length === 0) { - invalidValues.push('content.messageSignature.signature'); - } - break; - case 'dsseEnvelope': - if (b.content.dsseEnvelope.payload.length === 0) { - invalidValues.push('content.dsseEnvelope.payload'); - } - if (b.content.dsseEnvelope.signatures.length !== 1) { - invalidValues.push('content.dsseEnvelope.signatures'); - } - else { - if (b.content.dsseEnvelope.signatures[0].sig.length === 0) { - invalidValues.push('content.dsseEnvelope.signatures[0].sig'); - } - } - break; - } - } - // Verification material-related validation - if (b.verificationMaterial === undefined) { - invalidValues.push('verificationMaterial'); - } - else { - if (b.verificationMaterial.content === undefined) { - invalidValues.push('verificationMaterial.content'); - } - else { - switch (b.verificationMaterial.content.$case) { - case 'x509CertificateChain': - if (b.verificationMaterial.content.x509CertificateChain.certificates - .length === 0) { - invalidValues.push('verificationMaterial.content.x509CertificateChain.certificates'); - } - b.verificationMaterial.content.x509CertificateChain.certificates.forEach((cert, i) => { - if (cert.rawBytes.length === 0) { - invalidValues.push(`verificationMaterial.content.x509CertificateChain.certificates[${i}].rawBytes`); - } - }); - break; - case 'certificate': - if (b.verificationMaterial.content.certificate.rawBytes.length === 0) { - invalidValues.push('verificationMaterial.content.certificate.rawBytes'); - } - break; - } - } - if (b.verificationMaterial.tlogEntries === undefined) { - invalidValues.push('verificationMaterial.tlogEntries'); - } - else { - if (b.verificationMaterial.tlogEntries.length > 0) { - b.verificationMaterial.tlogEntries.forEach((entry, i) => { - if (entry.logId === undefined) { - invalidValues.push(`verificationMaterial.tlogEntries[${i}].logId`); - } - if (entry.kindVersion === undefined) { - invalidValues.push(`verificationMaterial.tlogEntries[${i}].kindVersion`); - } - }); - } - } - } - return invalidValues; -} -// Necessary for V01 bundles -function validateInclusionPromise(b) { - const invalidValues = []; - if (b.verificationMaterial && - b.verificationMaterial.tlogEntries?.length > 0) { - b.verificationMaterial.tlogEntries.forEach((entry, i) => { - if (entry.inclusionPromise === undefined) { - invalidValues.push(`verificationMaterial.tlogEntries[${i}].inclusionPromise`); - } - }); - } - return invalidValues; -} -// Necessary for V02 and later bundles -function validateInclusionProof(b) { - const invalidValues = []; - if (b.verificationMaterial && - b.verificationMaterial.tlogEntries?.length > 0) { - b.verificationMaterial.tlogEntries.forEach((entry, i) => { - if (entry.inclusionProof === undefined) { - invalidValues.push(`verificationMaterial.tlogEntries[${i}].inclusionProof`); - } - else { - if (entry.inclusionProof.checkpoint === undefined) { - invalidValues.push(`verificationMaterial.tlogEntries[${i}].inclusionProof.checkpoint`); - } - } - }); - } - return invalidValues; -} -// Necessary for V03 and later bundles -function validateNoCertificateChain(b) { - const invalidValues = []; - if (b.verificationMaterial?.content?.$case === 'x509CertificateChain') { - invalidValues.push('verificationMaterial.content.$case'); - } - return invalidValues; -} diff --git a/deps/npm/node_modules/@sigstore/bundle/package.json b/deps/npm/node_modules/@sigstore/bundle/package.json deleted file mode 100644 index 2cac185f73895b..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@sigstore/bundle", - "version": "2.2.0", - "description": "Sigstore bundle type", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist", - "store" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/bundle#readme", - "publishConfig": { - "provenance": true - }, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js b/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js deleted file mode 100644 index 482c7239e83162..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseBitString = exports.parseBoolean = exports.parseOID = exports.parseTime = exports.parseStringASCII = exports.parseInteger = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const RE_TIME_SHORT_YEAR = /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; -const RE_TIME_LONG_YEAR = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; -// Parse a BigInt from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-integer -function parseInteger(buf) { - let pos = 0; - const end = buf.length; - let val = buf[pos]; - const neg = val > 0x7f; - // Consume any padding bytes - const pad = neg ? 0xff : 0x00; - while (val == pad && ++pos < end) { - val = buf[pos]; - } - // Calculate remaining bytes to read - const len = end - pos; - if (len === 0) - return BigInt(neg ? -1 : 0); - // Handle two's complement for negative numbers - val = neg ? val - 256 : val; - // Parse remaining bytes - let n = BigInt(val); - for (let i = pos + 1; i < end; ++i) { - n = n * BigInt(256) + BigInt(buf[i]); - } - return n; -} -exports.parseInteger = parseInteger; -// Parse an ASCII string from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean -function parseStringASCII(buf) { - return buf.toString('ascii'); -} -exports.parseStringASCII = parseStringASCII; -// Parse a Date from the DER-encoded buffer -// https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.5.1 -function parseTime(buf, shortYear) { - const timeStr = parseStringASCII(buf); - // Parse the time string into matches - captured groups start at index 1 - const m = shortYear - ? RE_TIME_SHORT_YEAR.exec(timeStr) - : RE_TIME_LONG_YEAR.exec(timeStr); - if (!m) { - throw new Error('invalid time'); - } - // Translate dates with a 2-digit year to 4 digits per the spec - if (shortYear) { - let year = Number(m[1]); - year += year >= 50 ? 1900 : 2000; - m[1] = year.toString(); - } - // Translate to ISO8601 format and parse - return new Date(`${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}Z`); -} -exports.parseTime = parseTime; -// Parse an OID from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-object-identifier -function parseOID(buf) { - let pos = 0; - const end = buf.length; - // Consume first byte which encodes the first two OID components - let n = buf[pos++]; - const first = Math.floor(n / 40); - const second = n % 40; - let oid = `${first}.${second}`; - // Consume remaining bytes - let val = 0; - for (; pos < end; ++pos) { - n = buf[pos]; - val = (val << 7) + (n & 0x7f); - // If the left-most bit is NOT set, then this is the last byte in the - // sequence and we can add the value to the OID and reset the accumulator - if ((n & 0x80) === 0) { - oid += `.${val}`; - val = 0; - } - } - return oid; -} -exports.parseOID = parseOID; -// Parse a boolean from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean -function parseBoolean(buf) { - return buf[0] !== 0; -} -exports.parseBoolean = parseBoolean; -// Parse a bit string from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-bit-string -function parseBitString(buf) { - // First byte tell us how many unused bits are in the last byte - const unused = buf[0]; - const start = 1; - const end = buf.length; - const bits = []; - for (let i = start; i < end; ++i) { - const byte = buf[i]; - // The skip value is only used for the last byte - const skip = i === end - 1 ? unused : 0; - // Iterate over each bit in the byte (most significant first) - for (let j = 7; j >= skip; --j) { - // Read the bit and add it to the bit string - bits.push((byte >> j) & 0x01); - } - } - return bits; -} -exports.parseBitString = parseBitString; diff --git a/deps/npm/node_modules/@sigstore/core/dist/dsse.js b/deps/npm/node_modules/@sigstore/core/dist/dsse.js deleted file mode 100644 index a78783c919a256..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/dsse.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.preAuthEncoding = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const PAE_PREFIX = 'DSSEv1'; -// DSSE Pre-Authentication Encoding -function preAuthEncoding(payloadType, payload) { - const prefix = [ - PAE_PREFIX, - payloadType.length, - payloadType, - payload.length, - '', - ].join(' '); - return Buffer.concat([Buffer.from(prefix, 'ascii'), payload]); -} -exports.preAuthEncoding = preAuthEncoding; diff --git a/deps/npm/node_modules/@sigstore/core/dist/encoding.js b/deps/npm/node_modules/@sigstore/core/dist/encoding.js deleted file mode 100644 index b020ac4d6ecd42..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/encoding.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.base64Decode = exports.base64Encode = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const BASE64_ENCODING = 'base64'; -const UTF8_ENCODING = 'utf-8'; -function base64Encode(str) { - return Buffer.from(str, UTF8_ENCODING).toString(BASE64_ENCODING); -} -exports.base64Encode = base64Encode; -function base64Decode(str) { - return Buffer.from(str, BASE64_ENCODING).toString(UTF8_ENCODING); -} -exports.base64Decode = base64Decode; diff --git a/deps/npm/node_modules/@sigstore/core/dist/json.js b/deps/npm/node_modules/@sigstore/core/dist/json.js deleted file mode 100644 index a50df7233c7c58..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/json.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.canonicalize = void 0; -// JSON canonicalization per https://github.com/cyberphone/json-canonicalization -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function canonicalize(object) { - let buffer = ''; - if (object === null || typeof object !== 'object' || object.toJSON != null) { - // Primitives or toJSONable objects - buffer += JSON.stringify(object); - } - else if (Array.isArray(object)) { - // Array - maintain element order - buffer += '['; - let first = true; - object.forEach((element) => { - if (!first) { - buffer += ','; - } - first = false; - // recursive call - buffer += canonicalize(element); - }); - buffer += ']'; - } - else { - // Object - Sort properties before serializing - buffer += '{'; - let first = true; - Object.keys(object) - .sort() - .forEach((property) => { - if (!first) { - buffer += ','; - } - first = false; - buffer += JSON.stringify(property); - buffer += ':'; - // recursive call - buffer += canonicalize(object[property]); - }); - buffer += '}'; - } - return buffer; -} -exports.canonicalize = canonicalize; diff --git a/deps/npm/node_modules/@sigstore/core/package.json b/deps/npm/node_modules/@sigstore/core/package.json deleted file mode 100644 index b9f901652ef0fd..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@sigstore/core", - "version": "1.0.0", - "description": "Base library for Sigstore", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/core#readme", - "publishConfig": { - "provenance": true - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/envelope.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/envelope.js index 0c367a8384454c..3c9abff8899b5b 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/envelope.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/envelope.js @@ -1,88 +1,58 @@ "use strict"; -/* eslint-disable */ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: envelope.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Signature = exports.Envelope = void 0; -function createBaseEnvelope() { - return { payload: Buffer.alloc(0), payloadType: "", signatures: [] }; -} exports.Envelope = { fromJSON(object) { return { payload: isSet(object.payload) ? Buffer.from(bytesFromBase64(object.payload)) : Buffer.alloc(0), - payloadType: isSet(object.payloadType) ? String(object.payloadType) : "", - signatures: Array.isArray(object?.signatures) ? object.signatures.map((e) => exports.Signature.fromJSON(e)) : [], + payloadType: isSet(object.payloadType) ? globalThis.String(object.payloadType) : "", + signatures: globalThis.Array.isArray(object?.signatures) + ? object.signatures.map((e) => exports.Signature.fromJSON(e)) + : [], }; }, toJSON(message) { const obj = {}; - message.payload !== undefined && - (obj.payload = base64FromBytes(message.payload !== undefined ? message.payload : Buffer.alloc(0))); - message.payloadType !== undefined && (obj.payloadType = message.payloadType); - if (message.signatures) { - obj.signatures = message.signatures.map((e) => e ? exports.Signature.toJSON(e) : undefined); + if (message.payload.length !== 0) { + obj.payload = base64FromBytes(message.payload); + } + if (message.payloadType !== "") { + obj.payloadType = message.payloadType; } - else { - obj.signatures = []; + if (message.signatures?.length) { + obj.signatures = message.signatures.map((e) => exports.Signature.toJSON(e)); } return obj; }, }; -function createBaseSignature() { - return { sig: Buffer.alloc(0), keyid: "" }; -} exports.Signature = { fromJSON(object) { return { sig: isSet(object.sig) ? Buffer.from(bytesFromBase64(object.sig)) : Buffer.alloc(0), - keyid: isSet(object.keyid) ? String(object.keyid) : "", + keyid: isSet(object.keyid) ? globalThis.String(object.keyid) : "", }; }, toJSON(message) { const obj = {}; - message.sig !== undefined && (obj.sig = base64FromBytes(message.sig !== undefined ? message.sig : Buffer.alloc(0))); - message.keyid !== undefined && (obj.keyid = message.keyid); + if (message.sig.length !== 0) { + obj.sig = base64FromBytes(message.sig); + } + if (message.keyid !== "") { + obj.keyid = message.keyid; + } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function isSet(value) { return value !== null && value !== undefined; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/events.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/events.js index 073093b8371a8f..46904b7ec64d94 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/events.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/events.js @@ -1,19 +1,21 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: events.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.CloudEventBatch = exports.CloudEvent_CloudEventAttributeValue = exports.CloudEvent_AttributesEntry = exports.CloudEvent = void 0; /* eslint-disable */ const any_1 = require("./google/protobuf/any"); const timestamp_1 = require("./google/protobuf/timestamp"); -function createBaseCloudEvent() { - return { id: "", source: "", specVersion: "", type: "", attributes: {}, data: undefined }; -} exports.CloudEvent = { fromJSON(object) { return { - id: isSet(object.id) ? String(object.id) : "", - source: isSet(object.source) ? String(object.source) : "", - specVersion: isSet(object.specVersion) ? String(object.specVersion) : "", - type: isSet(object.type) ? String(object.type) : "", + id: isSet(object.id) ? globalThis.String(object.id) : "", + source: isSet(object.source) ? globalThis.String(object.source) : "", + specVersion: isSet(object.specVersion) ? globalThis.String(object.specVersion) : "", + type: isSet(object.type) ? globalThis.String(object.type) : "", attributes: isObject(object.attributes) ? Object.entries(object.attributes).reduce((acc, [key, value]) => { acc[key] = exports.CloudEvent_CloudEventAttributeValue.fromJSON(value); @@ -23,7 +25,7 @@ exports.CloudEvent = { data: isSet(object.binaryData) ? { $case: "binaryData", binaryData: Buffer.from(bytesFromBase64(object.binaryData)) } : isSet(object.textData) - ? { $case: "textData", textData: String(object.textData) } + ? { $case: "textData", textData: globalThis.String(object.textData) } : isSet(object.protoData) ? { $case: "protoData", protoData: any_1.Any.fromJSON(object.protoData) } : undefined, @@ -31,60 +33,72 @@ exports.CloudEvent = { }, toJSON(message) { const obj = {}; - message.id !== undefined && (obj.id = message.id); - message.source !== undefined && (obj.source = message.source); - message.specVersion !== undefined && (obj.specVersion = message.specVersion); - message.type !== undefined && (obj.type = message.type); - obj.attributes = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.source !== "") { + obj.source = message.source; + } + if (message.specVersion !== "") { + obj.specVersion = message.specVersion; + } + if (message.type !== "") { + obj.type = message.type; + } if (message.attributes) { - Object.entries(message.attributes).forEach(([k, v]) => { - obj.attributes[k] = exports.CloudEvent_CloudEventAttributeValue.toJSON(v); - }); - } - message.data?.$case === "binaryData" && - (obj.binaryData = message.data?.binaryData !== undefined ? base64FromBytes(message.data?.binaryData) : undefined); - message.data?.$case === "textData" && (obj.textData = message.data?.textData); - message.data?.$case === "protoData" && - (obj.protoData = message.data?.protoData ? any_1.Any.toJSON(message.data?.protoData) : undefined); + const entries = Object.entries(message.attributes); + if (entries.length > 0) { + obj.attributes = {}; + entries.forEach(([k, v]) => { + obj.attributes[k] = exports.CloudEvent_CloudEventAttributeValue.toJSON(v); + }); + } + } + if (message.data?.$case === "binaryData") { + obj.binaryData = base64FromBytes(message.data.binaryData); + } + else if (message.data?.$case === "textData") { + obj.textData = message.data.textData; + } + else if (message.data?.$case === "protoData") { + obj.protoData = any_1.Any.toJSON(message.data.protoData); + } return obj; }, }; -function createBaseCloudEvent_AttributesEntry() { - return { key: "", value: undefined }; -} exports.CloudEvent_AttributesEntry = { fromJSON(object) { return { - key: isSet(object.key) ? String(object.key) : "", + key: isSet(object.key) ? globalThis.String(object.key) : "", value: isSet(object.value) ? exports.CloudEvent_CloudEventAttributeValue.fromJSON(object.value) : undefined, }; }, toJSON(message) { const obj = {}; - message.key !== undefined && (obj.key = message.key); - message.value !== undefined && - (obj.value = message.value ? exports.CloudEvent_CloudEventAttributeValue.toJSON(message.value) : undefined); + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = exports.CloudEvent_CloudEventAttributeValue.toJSON(message.value); + } return obj; }, }; -function createBaseCloudEvent_CloudEventAttributeValue() { - return { attr: undefined }; -} exports.CloudEvent_CloudEventAttributeValue = { fromJSON(object) { return { attr: isSet(object.ceBoolean) - ? { $case: "ceBoolean", ceBoolean: Boolean(object.ceBoolean) } + ? { $case: "ceBoolean", ceBoolean: globalThis.Boolean(object.ceBoolean) } : isSet(object.ceInteger) - ? { $case: "ceInteger", ceInteger: Number(object.ceInteger) } + ? { $case: "ceInteger", ceInteger: globalThis.Number(object.ceInteger) } : isSet(object.ceString) - ? { $case: "ceString", ceString: String(object.ceString) } + ? { $case: "ceString", ceString: globalThis.String(object.ceString) } : isSet(object.ceBytes) ? { $case: "ceBytes", ceBytes: Buffer.from(bytesFromBase64(object.ceBytes)) } : isSet(object.ceUri) - ? { $case: "ceUri", ceUri: String(object.ceUri) } + ? { $case: "ceUri", ceUri: globalThis.String(object.ceUri) } : isSet(object.ceUriRef) - ? { $case: "ceUriRef", ceUriRef: String(object.ceUriRef) } + ? { $case: "ceUriRef", ceUriRef: globalThis.String(object.ceUriRef) } : isSet(object.ceTimestamp) ? { $case: "ceTimestamp", ceTimestamp: fromJsonTimestamp(object.ceTimestamp) } : undefined, @@ -92,86 +106,61 @@ exports.CloudEvent_CloudEventAttributeValue = { }, toJSON(message) { const obj = {}; - message.attr?.$case === "ceBoolean" && (obj.ceBoolean = message.attr?.ceBoolean); - message.attr?.$case === "ceInteger" && (obj.ceInteger = Math.round(message.attr?.ceInteger)); - message.attr?.$case === "ceString" && (obj.ceString = message.attr?.ceString); - message.attr?.$case === "ceBytes" && - (obj.ceBytes = message.attr?.ceBytes !== undefined ? base64FromBytes(message.attr?.ceBytes) : undefined); - message.attr?.$case === "ceUri" && (obj.ceUri = message.attr?.ceUri); - message.attr?.$case === "ceUriRef" && (obj.ceUriRef = message.attr?.ceUriRef); - message.attr?.$case === "ceTimestamp" && (obj.ceTimestamp = message.attr?.ceTimestamp.toISOString()); + if (message.attr?.$case === "ceBoolean") { + obj.ceBoolean = message.attr.ceBoolean; + } + else if (message.attr?.$case === "ceInteger") { + obj.ceInteger = Math.round(message.attr.ceInteger); + } + else if (message.attr?.$case === "ceString") { + obj.ceString = message.attr.ceString; + } + else if (message.attr?.$case === "ceBytes") { + obj.ceBytes = base64FromBytes(message.attr.ceBytes); + } + else if (message.attr?.$case === "ceUri") { + obj.ceUri = message.attr.ceUri; + } + else if (message.attr?.$case === "ceUriRef") { + obj.ceUriRef = message.attr.ceUriRef; + } + else if (message.attr?.$case === "ceTimestamp") { + obj.ceTimestamp = message.attr.ceTimestamp.toISOString(); + } return obj; }, }; -function createBaseCloudEventBatch() { - return { events: [] }; -} exports.CloudEventBatch = { fromJSON(object) { - return { events: Array.isArray(object?.events) ? object.events.map((e) => exports.CloudEvent.fromJSON(e)) : [] }; + return { + events: globalThis.Array.isArray(object?.events) ? object.events.map((e) => exports.CloudEvent.fromJSON(e)) : [], + }; }, toJSON(message) { const obj = {}; - if (message.events) { - obj.events = message.events.map((e) => e ? exports.CloudEvent.toJSON(e) : undefined); - } - else { - obj.events = []; + if (message.events?.length) { + obj.events = message.events.map((e) => exports.CloudEvent.toJSON(e)); } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function fromTimestamp(t) { - let millis = Number(t.seconds) * 1000; - millis += t.nanos / 1000000; - return new Date(millis); + let millis = (globalThis.Number(t.seconds) || 0) * 1_000; + millis += (t.nanos || 0) / 1_000_000; + return new globalThis.Date(millis); } function fromJsonTimestamp(o) { - if (o instanceof Date) { + if (o instanceof globalThis.Date) { return o; } else if (typeof o === "string") { - return new Date(o); + return new globalThis.Date(o); } else { return fromTimestamp(timestamp_1.Timestamp.fromJSON(o)); diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/api/field_behavior.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/api/field_behavior.js index da627499ad7659..14e559a5e0126c 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/api/field_behavior.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/api/field_behavior.js @@ -1,7 +1,14 @@ "use strict"; -/* eslint-disable */ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: google/api/field_behavior.proto Object.defineProperty(exports, "__esModule", { value: true }); -exports.fieldBehaviorToJSON = exports.fieldBehaviorFromJSON = exports.FieldBehavior = void 0; +exports.FieldBehavior = void 0; +exports.fieldBehaviorFromJSON = fieldBehaviorFromJSON; +exports.fieldBehaviorToJSON = fieldBehaviorToJSON; +/* eslint-disable */ /** * An indicator of the behavior of a given field (for example, that a field * is required in requests, or given as output but ignored as input). @@ -48,11 +55,33 @@ var FieldBehavior; /** * UNORDERED_LIST - Denotes that a (repeated) field is an unordered list. * This indicates that the service may provide the elements of the list - * in any arbitrary order, rather than the order the user originally + * in any arbitrary order, rather than the order the user originally * provided. Additionally, the list's order may or may not be stable. */ FieldBehavior[FieldBehavior["UNORDERED_LIST"] = 6] = "UNORDERED_LIST"; -})(FieldBehavior = exports.FieldBehavior || (exports.FieldBehavior = {})); + /** + * NON_EMPTY_DEFAULT - Denotes that this field returns a non-empty default value if not set. + * This indicates that if the user provides the empty value in a request, + * a non-empty value will be returned. The user will not be aware of what + * non-empty value to expect. + */ + FieldBehavior[FieldBehavior["NON_EMPTY_DEFAULT"] = 7] = "NON_EMPTY_DEFAULT"; + /** + * IDENTIFIER - Denotes that the field in a resource (a message annotated with + * google.api.resource) is used in the resource name to uniquely identify the + * resource. For AIP-compliant APIs, this should only be applied to the + * `name` field on the resource. + * + * This behavior should not be applied to references to other resources within + * the message. + * + * The identifier field of resources often have different field behavior + * depending on the request it is embedded in (e.g. for Create methods name + * is optional and unused, while for Update methods it is required). Instead + * of method-specific annotations, only `IDENTIFIER` is required. + */ + FieldBehavior[FieldBehavior["IDENTIFIER"] = 8] = "IDENTIFIER"; +})(FieldBehavior || (exports.FieldBehavior = FieldBehavior = {})); function fieldBehaviorFromJSON(object) { switch (object) { case 0: @@ -76,11 +105,16 @@ function fieldBehaviorFromJSON(object) { case 6: case "UNORDERED_LIST": return FieldBehavior.UNORDERED_LIST; + case 7: + case "NON_EMPTY_DEFAULT": + return FieldBehavior.NON_EMPTY_DEFAULT; + case 8: + case "IDENTIFIER": + return FieldBehavior.IDENTIFIER; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldBehavior"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldBehavior"); } } -exports.fieldBehaviorFromJSON = fieldBehaviorFromJSON; function fieldBehaviorToJSON(object) { switch (object) { case FieldBehavior.FIELD_BEHAVIOR_UNSPECIFIED: @@ -97,23 +131,11 @@ function fieldBehaviorToJSON(object) { return "IMMUTABLE"; case FieldBehavior.UNORDERED_LIST: return "UNORDERED_LIST"; + case FieldBehavior.NON_EMPTY_DEFAULT: + return "NON_EMPTY_DEFAULT"; + case FieldBehavior.IDENTIFIER: + return "IDENTIFIER"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldBehavior"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldBehavior"); } } -exports.fieldBehaviorToJSON = fieldBehaviorToJSON; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/any.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/any.js index 6b3f3c97a66476..bc461887e318a0 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/any.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/any.js @@ -1,64 +1,34 @@ "use strict"; -/* eslint-disable */ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: google/protobuf/any.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Any = void 0; -function createBaseAny() { - return { typeUrl: "", value: Buffer.alloc(0) }; -} exports.Any = { fromJSON(object) { return { - typeUrl: isSet(object.typeUrl) ? String(object.typeUrl) : "", + typeUrl: isSet(object.typeUrl) ? globalThis.String(object.typeUrl) : "", value: isSet(object.value) ? Buffer.from(bytesFromBase64(object.value)) : Buffer.alloc(0), }; }, toJSON(message) { const obj = {}; - message.typeUrl !== undefined && (obj.typeUrl = message.typeUrl); - message.value !== undefined && - (obj.value = base64FromBytes(message.value !== undefined ? message.value : Buffer.alloc(0))); + if (message.typeUrl !== "") { + obj.typeUrl = message.typeUrl; + } + if (message.value.length !== 0) { + obj.value = base64FromBytes(message.value); + } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function isSet(value) { return value !== null && value !== undefined; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/descriptor.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/descriptor.js index d429aac8460436..a7d7550fc97741 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/descriptor.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/descriptor.js @@ -1,7 +1,191 @@ "use strict"; -/* eslint-disable */ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: google/protobuf/descriptor.proto Object.defineProperty(exports, "__esModule", { value: true }); -exports.GeneratedCodeInfo_Annotation = exports.GeneratedCodeInfo = exports.SourceCodeInfo_Location = exports.SourceCodeInfo = exports.UninterpretedOption_NamePart = exports.UninterpretedOption = exports.MethodOptions = exports.ServiceOptions = exports.EnumValueOptions = exports.EnumOptions = exports.OneofOptions = exports.FieldOptions = exports.MessageOptions = exports.FileOptions = exports.MethodDescriptorProto = exports.ServiceDescriptorProto = exports.EnumValueDescriptorProto = exports.EnumDescriptorProto_EnumReservedRange = exports.EnumDescriptorProto = exports.OneofDescriptorProto = exports.FieldDescriptorProto = exports.ExtensionRangeOptions = exports.DescriptorProto_ReservedRange = exports.DescriptorProto_ExtensionRange = exports.DescriptorProto = exports.FileDescriptorProto = exports.FileDescriptorSet = exports.methodOptions_IdempotencyLevelToJSON = exports.methodOptions_IdempotencyLevelFromJSON = exports.MethodOptions_IdempotencyLevel = exports.fieldOptions_JSTypeToJSON = exports.fieldOptions_JSTypeFromJSON = exports.FieldOptions_JSType = exports.fieldOptions_CTypeToJSON = exports.fieldOptions_CTypeFromJSON = exports.FieldOptions_CType = exports.fileOptions_OptimizeModeToJSON = exports.fileOptions_OptimizeModeFromJSON = exports.FileOptions_OptimizeMode = exports.fieldDescriptorProto_LabelToJSON = exports.fieldDescriptorProto_LabelFromJSON = exports.FieldDescriptorProto_Label = exports.fieldDescriptorProto_TypeToJSON = exports.fieldDescriptorProto_TypeFromJSON = exports.FieldDescriptorProto_Type = void 0; +exports.GeneratedCodeInfo = exports.SourceCodeInfo_Location = exports.SourceCodeInfo = exports.FeatureSetDefaults_FeatureSetEditionDefault = exports.FeatureSetDefaults = exports.FeatureSet = exports.UninterpretedOption_NamePart = exports.UninterpretedOption = exports.MethodOptions = exports.ServiceOptions = exports.EnumValueOptions = exports.EnumOptions = exports.OneofOptions = exports.FieldOptions_FeatureSupport = exports.FieldOptions_EditionDefault = exports.FieldOptions = exports.MessageOptions = exports.FileOptions = exports.MethodDescriptorProto = exports.ServiceDescriptorProto = exports.EnumValueDescriptorProto = exports.EnumDescriptorProto_EnumReservedRange = exports.EnumDescriptorProto = exports.OneofDescriptorProto = exports.FieldDescriptorProto = exports.ExtensionRangeOptions_Declaration = exports.ExtensionRangeOptions = exports.DescriptorProto_ReservedRange = exports.DescriptorProto_ExtensionRange = exports.DescriptorProto = exports.FileDescriptorProto = exports.FileDescriptorSet = exports.GeneratedCodeInfo_Annotation_Semantic = exports.FeatureSet_EnforceNamingStyle = exports.FeatureSet_JsonFormat = exports.FeatureSet_MessageEncoding = exports.FeatureSet_Utf8Validation = exports.FeatureSet_RepeatedFieldEncoding = exports.FeatureSet_EnumType = exports.FeatureSet_FieldPresence = exports.MethodOptions_IdempotencyLevel = exports.FieldOptions_OptionTargetType = exports.FieldOptions_OptionRetention = exports.FieldOptions_JSType = exports.FieldOptions_CType = exports.FileOptions_OptimizeMode = exports.FieldDescriptorProto_Label = exports.FieldDescriptorProto_Type = exports.ExtensionRangeOptions_VerificationState = exports.Edition = void 0; +exports.GeneratedCodeInfo_Annotation = void 0; +exports.editionFromJSON = editionFromJSON; +exports.editionToJSON = editionToJSON; +exports.extensionRangeOptions_VerificationStateFromJSON = extensionRangeOptions_VerificationStateFromJSON; +exports.extensionRangeOptions_VerificationStateToJSON = extensionRangeOptions_VerificationStateToJSON; +exports.fieldDescriptorProto_TypeFromJSON = fieldDescriptorProto_TypeFromJSON; +exports.fieldDescriptorProto_TypeToJSON = fieldDescriptorProto_TypeToJSON; +exports.fieldDescriptorProto_LabelFromJSON = fieldDescriptorProto_LabelFromJSON; +exports.fieldDescriptorProto_LabelToJSON = fieldDescriptorProto_LabelToJSON; +exports.fileOptions_OptimizeModeFromJSON = fileOptions_OptimizeModeFromJSON; +exports.fileOptions_OptimizeModeToJSON = fileOptions_OptimizeModeToJSON; +exports.fieldOptions_CTypeFromJSON = fieldOptions_CTypeFromJSON; +exports.fieldOptions_CTypeToJSON = fieldOptions_CTypeToJSON; +exports.fieldOptions_JSTypeFromJSON = fieldOptions_JSTypeFromJSON; +exports.fieldOptions_JSTypeToJSON = fieldOptions_JSTypeToJSON; +exports.fieldOptions_OptionRetentionFromJSON = fieldOptions_OptionRetentionFromJSON; +exports.fieldOptions_OptionRetentionToJSON = fieldOptions_OptionRetentionToJSON; +exports.fieldOptions_OptionTargetTypeFromJSON = fieldOptions_OptionTargetTypeFromJSON; +exports.fieldOptions_OptionTargetTypeToJSON = fieldOptions_OptionTargetTypeToJSON; +exports.methodOptions_IdempotencyLevelFromJSON = methodOptions_IdempotencyLevelFromJSON; +exports.methodOptions_IdempotencyLevelToJSON = methodOptions_IdempotencyLevelToJSON; +exports.featureSet_FieldPresenceFromJSON = featureSet_FieldPresenceFromJSON; +exports.featureSet_FieldPresenceToJSON = featureSet_FieldPresenceToJSON; +exports.featureSet_EnumTypeFromJSON = featureSet_EnumTypeFromJSON; +exports.featureSet_EnumTypeToJSON = featureSet_EnumTypeToJSON; +exports.featureSet_RepeatedFieldEncodingFromJSON = featureSet_RepeatedFieldEncodingFromJSON; +exports.featureSet_RepeatedFieldEncodingToJSON = featureSet_RepeatedFieldEncodingToJSON; +exports.featureSet_Utf8ValidationFromJSON = featureSet_Utf8ValidationFromJSON; +exports.featureSet_Utf8ValidationToJSON = featureSet_Utf8ValidationToJSON; +exports.featureSet_MessageEncodingFromJSON = featureSet_MessageEncodingFromJSON; +exports.featureSet_MessageEncodingToJSON = featureSet_MessageEncodingToJSON; +exports.featureSet_JsonFormatFromJSON = featureSet_JsonFormatFromJSON; +exports.featureSet_JsonFormatToJSON = featureSet_JsonFormatToJSON; +exports.featureSet_EnforceNamingStyleFromJSON = featureSet_EnforceNamingStyleFromJSON; +exports.featureSet_EnforceNamingStyleToJSON = featureSet_EnforceNamingStyleToJSON; +exports.generatedCodeInfo_Annotation_SemanticFromJSON = generatedCodeInfo_Annotation_SemanticFromJSON; +exports.generatedCodeInfo_Annotation_SemanticToJSON = generatedCodeInfo_Annotation_SemanticToJSON; +/* eslint-disable */ +/** The full set of known editions. */ +var Edition; +(function (Edition) { + /** EDITION_UNKNOWN - A placeholder for an unknown edition value. */ + Edition[Edition["EDITION_UNKNOWN"] = 0] = "EDITION_UNKNOWN"; + /** + * EDITION_LEGACY - A placeholder edition for specifying default behaviors *before* a feature + * was first introduced. This is effectively an "infinite past". + */ + Edition[Edition["EDITION_LEGACY"] = 900] = "EDITION_LEGACY"; + /** + * EDITION_PROTO2 - Legacy syntax "editions". These pre-date editions, but behave much like + * distinct editions. These can't be used to specify the edition of proto + * files, but feature definitions must supply proto2/proto3 defaults for + * backwards compatibility. + */ + Edition[Edition["EDITION_PROTO2"] = 998] = "EDITION_PROTO2"; + Edition[Edition["EDITION_PROTO3"] = 999] = "EDITION_PROTO3"; + /** + * EDITION_2023 - Editions that have been released. The specific values are arbitrary and + * should not be depended on, but they will always be time-ordered for easy + * comparison. + */ + Edition[Edition["EDITION_2023"] = 1000] = "EDITION_2023"; + Edition[Edition["EDITION_2024"] = 1001] = "EDITION_2024"; + /** + * EDITION_1_TEST_ONLY - Placeholder editions for testing feature resolution. These should not be + * used or relied on outside of tests. + */ + Edition[Edition["EDITION_1_TEST_ONLY"] = 1] = "EDITION_1_TEST_ONLY"; + Edition[Edition["EDITION_2_TEST_ONLY"] = 2] = "EDITION_2_TEST_ONLY"; + Edition[Edition["EDITION_99997_TEST_ONLY"] = 99997] = "EDITION_99997_TEST_ONLY"; + Edition[Edition["EDITION_99998_TEST_ONLY"] = 99998] = "EDITION_99998_TEST_ONLY"; + Edition[Edition["EDITION_99999_TEST_ONLY"] = 99999] = "EDITION_99999_TEST_ONLY"; + /** + * EDITION_MAX - Placeholder for specifying unbounded edition support. This should only + * ever be used by plugins that can expect to never require any changes to + * support a new edition. + */ + Edition[Edition["EDITION_MAX"] = 2147483647] = "EDITION_MAX"; +})(Edition || (exports.Edition = Edition = {})); +function editionFromJSON(object) { + switch (object) { + case 0: + case "EDITION_UNKNOWN": + return Edition.EDITION_UNKNOWN; + case 900: + case "EDITION_LEGACY": + return Edition.EDITION_LEGACY; + case 998: + case "EDITION_PROTO2": + return Edition.EDITION_PROTO2; + case 999: + case "EDITION_PROTO3": + return Edition.EDITION_PROTO3; + case 1000: + case "EDITION_2023": + return Edition.EDITION_2023; + case 1001: + case "EDITION_2024": + return Edition.EDITION_2024; + case 1: + case "EDITION_1_TEST_ONLY": + return Edition.EDITION_1_TEST_ONLY; + case 2: + case "EDITION_2_TEST_ONLY": + return Edition.EDITION_2_TEST_ONLY; + case 99997: + case "EDITION_99997_TEST_ONLY": + return Edition.EDITION_99997_TEST_ONLY; + case 99998: + case "EDITION_99998_TEST_ONLY": + return Edition.EDITION_99998_TEST_ONLY; + case 99999: + case "EDITION_99999_TEST_ONLY": + return Edition.EDITION_99999_TEST_ONLY; + case 2147483647: + case "EDITION_MAX": + return Edition.EDITION_MAX; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum Edition"); + } +} +function editionToJSON(object) { + switch (object) { + case Edition.EDITION_UNKNOWN: + return "EDITION_UNKNOWN"; + case Edition.EDITION_LEGACY: + return "EDITION_LEGACY"; + case Edition.EDITION_PROTO2: + return "EDITION_PROTO2"; + case Edition.EDITION_PROTO3: + return "EDITION_PROTO3"; + case Edition.EDITION_2023: + return "EDITION_2023"; + case Edition.EDITION_2024: + return "EDITION_2024"; + case Edition.EDITION_1_TEST_ONLY: + return "EDITION_1_TEST_ONLY"; + case Edition.EDITION_2_TEST_ONLY: + return "EDITION_2_TEST_ONLY"; + case Edition.EDITION_99997_TEST_ONLY: + return "EDITION_99997_TEST_ONLY"; + case Edition.EDITION_99998_TEST_ONLY: + return "EDITION_99998_TEST_ONLY"; + case Edition.EDITION_99999_TEST_ONLY: + return "EDITION_99999_TEST_ONLY"; + case Edition.EDITION_MAX: + return "EDITION_MAX"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum Edition"); + } +} +/** The verification state of the extension range. */ +var ExtensionRangeOptions_VerificationState; +(function (ExtensionRangeOptions_VerificationState) { + /** DECLARATION - All the extensions of the range must be declared. */ + ExtensionRangeOptions_VerificationState[ExtensionRangeOptions_VerificationState["DECLARATION"] = 0] = "DECLARATION"; + ExtensionRangeOptions_VerificationState[ExtensionRangeOptions_VerificationState["UNVERIFIED"] = 1] = "UNVERIFIED"; +})(ExtensionRangeOptions_VerificationState || (exports.ExtensionRangeOptions_VerificationState = ExtensionRangeOptions_VerificationState = {})); +function extensionRangeOptions_VerificationStateFromJSON(object) { + switch (object) { + case 0: + case "DECLARATION": + return ExtensionRangeOptions_VerificationState.DECLARATION; + case 1: + case "UNVERIFIED": + return ExtensionRangeOptions_VerificationState.UNVERIFIED; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum ExtensionRangeOptions_VerificationState"); + } +} +function extensionRangeOptions_VerificationStateToJSON(object) { + switch (object) { + case ExtensionRangeOptions_VerificationState.DECLARATION: + return "DECLARATION"; + case ExtensionRangeOptions_VerificationState.UNVERIFIED: + return "UNVERIFIED"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum ExtensionRangeOptions_VerificationState"); + } +} var FieldDescriptorProto_Type; (function (FieldDescriptorProto_Type) { /** @@ -27,9 +211,10 @@ var FieldDescriptorProto_Type; FieldDescriptorProto_Type[FieldDescriptorProto_Type["TYPE_STRING"] = 9] = "TYPE_STRING"; /** * TYPE_GROUP - Tag-delimited aggregate. - * Group type is deprecated and not supported in proto3. However, Proto3 + * Group type is deprecated and not supported after google.protobuf. However, Proto3 * implementations should still be able to parse the group wire format and - * treat group fields as unknown fields. + * treat group fields as unknown fields. In Editions, the group wire format + * can be enabled via the `message_encoding` feature. */ FieldDescriptorProto_Type[FieldDescriptorProto_Type["TYPE_GROUP"] = 10] = "TYPE_GROUP"; /** TYPE_MESSAGE - Length-delimited aggregate. */ @@ -44,7 +229,7 @@ var FieldDescriptorProto_Type; FieldDescriptorProto_Type[FieldDescriptorProto_Type["TYPE_SINT32"] = 17] = "TYPE_SINT32"; /** TYPE_SINT64 - Uses ZigZag encoding. */ FieldDescriptorProto_Type[FieldDescriptorProto_Type["TYPE_SINT64"] = 18] = "TYPE_SINT64"; -})(FieldDescriptorProto_Type = exports.FieldDescriptorProto_Type || (exports.FieldDescriptorProto_Type = {})); +})(FieldDescriptorProto_Type || (exports.FieldDescriptorProto_Type = FieldDescriptorProto_Type = {})); function fieldDescriptorProto_TypeFromJSON(object) { switch (object) { case 1: @@ -102,10 +287,9 @@ function fieldDescriptorProto_TypeFromJSON(object) { case "TYPE_SINT64": return FieldDescriptorProto_Type.TYPE_SINT64; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Type"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Type"); } } -exports.fieldDescriptorProto_TypeFromJSON = fieldDescriptorProto_TypeFromJSON; function fieldDescriptorProto_TypeToJSON(object) { switch (object) { case FieldDescriptorProto_Type.TYPE_DOUBLE: @@ -145,46 +329,48 @@ function fieldDescriptorProto_TypeToJSON(object) { case FieldDescriptorProto_Type.TYPE_SINT64: return "TYPE_SINT64"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Type"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Type"); } } -exports.fieldDescriptorProto_TypeToJSON = fieldDescriptorProto_TypeToJSON; var FieldDescriptorProto_Label; (function (FieldDescriptorProto_Label) { /** LABEL_OPTIONAL - 0 is reserved for errors */ FieldDescriptorProto_Label[FieldDescriptorProto_Label["LABEL_OPTIONAL"] = 1] = "LABEL_OPTIONAL"; - FieldDescriptorProto_Label[FieldDescriptorProto_Label["LABEL_REQUIRED"] = 2] = "LABEL_REQUIRED"; FieldDescriptorProto_Label[FieldDescriptorProto_Label["LABEL_REPEATED"] = 3] = "LABEL_REPEATED"; -})(FieldDescriptorProto_Label = exports.FieldDescriptorProto_Label || (exports.FieldDescriptorProto_Label = {})); + /** + * LABEL_REQUIRED - The required label is only allowed in google.protobuf. In proto3 and Editions + * it's explicitly prohibited. In Editions, the `field_presence` feature + * can be used to get this behavior. + */ + FieldDescriptorProto_Label[FieldDescriptorProto_Label["LABEL_REQUIRED"] = 2] = "LABEL_REQUIRED"; +})(FieldDescriptorProto_Label || (exports.FieldDescriptorProto_Label = FieldDescriptorProto_Label = {})); function fieldDescriptorProto_LabelFromJSON(object) { switch (object) { case 1: case "LABEL_OPTIONAL": return FieldDescriptorProto_Label.LABEL_OPTIONAL; - case 2: - case "LABEL_REQUIRED": - return FieldDescriptorProto_Label.LABEL_REQUIRED; case 3: case "LABEL_REPEATED": return FieldDescriptorProto_Label.LABEL_REPEATED; + case 2: + case "LABEL_REQUIRED": + return FieldDescriptorProto_Label.LABEL_REQUIRED; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Label"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Label"); } } -exports.fieldDescriptorProto_LabelFromJSON = fieldDescriptorProto_LabelFromJSON; function fieldDescriptorProto_LabelToJSON(object) { switch (object) { case FieldDescriptorProto_Label.LABEL_OPTIONAL: return "LABEL_OPTIONAL"; - case FieldDescriptorProto_Label.LABEL_REQUIRED: - return "LABEL_REQUIRED"; case FieldDescriptorProto_Label.LABEL_REPEATED: return "LABEL_REPEATED"; + case FieldDescriptorProto_Label.LABEL_REQUIRED: + return "LABEL_REQUIRED"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Label"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldDescriptorProto_Label"); } } -exports.fieldDescriptorProto_LabelToJSON = fieldDescriptorProto_LabelToJSON; /** Generated classes can be optimized for speed or code size. */ var FileOptions_OptimizeMode; (function (FileOptions_OptimizeMode) { @@ -194,7 +380,7 @@ var FileOptions_OptimizeMode; FileOptions_OptimizeMode[FileOptions_OptimizeMode["CODE_SIZE"] = 2] = "CODE_SIZE"; /** LITE_RUNTIME - Generate code using MessageLite and the lite runtime. */ FileOptions_OptimizeMode[FileOptions_OptimizeMode["LITE_RUNTIME"] = 3] = "LITE_RUNTIME"; -})(FileOptions_OptimizeMode = exports.FileOptions_OptimizeMode || (exports.FileOptions_OptimizeMode = {})); +})(FileOptions_OptimizeMode || (exports.FileOptions_OptimizeMode = FileOptions_OptimizeMode = {})); function fileOptions_OptimizeModeFromJSON(object) { switch (object) { case 1: @@ -207,10 +393,9 @@ function fileOptions_OptimizeModeFromJSON(object) { case "LITE_RUNTIME": return FileOptions_OptimizeMode.LITE_RUNTIME; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FileOptions_OptimizeMode"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FileOptions_OptimizeMode"); } } -exports.fileOptions_OptimizeModeFromJSON = fileOptions_OptimizeModeFromJSON; function fileOptions_OptimizeModeToJSON(object) { switch (object) { case FileOptions_OptimizeMode.SPEED: @@ -220,17 +405,24 @@ function fileOptions_OptimizeModeToJSON(object) { case FileOptions_OptimizeMode.LITE_RUNTIME: return "LITE_RUNTIME"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FileOptions_OptimizeMode"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FileOptions_OptimizeMode"); } } -exports.fileOptions_OptimizeModeToJSON = fileOptions_OptimizeModeToJSON; var FieldOptions_CType; (function (FieldOptions_CType) { /** STRING - Default mode. */ FieldOptions_CType[FieldOptions_CType["STRING"] = 0] = "STRING"; + /** + * CORD - The option [ctype=CORD] may be applied to a non-repeated field of type + * "bytes". It indicates that in C++, the data should be stored in a Cord + * instead of a string. For very large strings, this may reduce memory + * fragmentation. It may also allow better performance when parsing from a + * Cord, or when parsing with aliasing enabled, as the parsed Cord may then + * alias the original buffer. + */ FieldOptions_CType[FieldOptions_CType["CORD"] = 1] = "CORD"; FieldOptions_CType[FieldOptions_CType["STRING_PIECE"] = 2] = "STRING_PIECE"; -})(FieldOptions_CType = exports.FieldOptions_CType || (exports.FieldOptions_CType = {})); +})(FieldOptions_CType || (exports.FieldOptions_CType = FieldOptions_CType = {})); function fieldOptions_CTypeFromJSON(object) { switch (object) { case 0: @@ -243,10 +435,9 @@ function fieldOptions_CTypeFromJSON(object) { case "STRING_PIECE": return FieldOptions_CType.STRING_PIECE; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_CType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_CType"); } } -exports.fieldOptions_CTypeFromJSON = fieldOptions_CTypeFromJSON; function fieldOptions_CTypeToJSON(object) { switch (object) { case FieldOptions_CType.STRING: @@ -256,10 +447,9 @@ function fieldOptions_CTypeToJSON(object) { case FieldOptions_CType.STRING_PIECE: return "STRING_PIECE"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_CType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_CType"); } } -exports.fieldOptions_CTypeToJSON = fieldOptions_CTypeToJSON; var FieldOptions_JSType; (function (FieldOptions_JSType) { /** JS_NORMAL - Use the default type. */ @@ -268,7 +458,7 @@ var FieldOptions_JSType; FieldOptions_JSType[FieldOptions_JSType["JS_STRING"] = 1] = "JS_STRING"; /** JS_NUMBER - Use JavaScript numbers. */ FieldOptions_JSType[FieldOptions_JSType["JS_NUMBER"] = 2] = "JS_NUMBER"; -})(FieldOptions_JSType = exports.FieldOptions_JSType || (exports.FieldOptions_JSType = {})); +})(FieldOptions_JSType || (exports.FieldOptions_JSType = FieldOptions_JSType = {})); function fieldOptions_JSTypeFromJSON(object) { switch (object) { case 0: @@ -281,10 +471,9 @@ function fieldOptions_JSTypeFromJSON(object) { case "JS_NUMBER": return FieldOptions_JSType.JS_NUMBER; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_JSType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_JSType"); } } -exports.fieldOptions_JSTypeFromJSON = fieldOptions_JSTypeFromJSON; function fieldOptions_JSTypeToJSON(object) { switch (object) { case FieldOptions_JSType.JS_NORMAL: @@ -294,10 +483,123 @@ function fieldOptions_JSTypeToJSON(object) { case FieldOptions_JSType.JS_NUMBER: return "JS_NUMBER"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_JSType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_JSType"); + } +} +/** If set to RETENTION_SOURCE, the option will be omitted from the binary. */ +var FieldOptions_OptionRetention; +(function (FieldOptions_OptionRetention) { + FieldOptions_OptionRetention[FieldOptions_OptionRetention["RETENTION_UNKNOWN"] = 0] = "RETENTION_UNKNOWN"; + FieldOptions_OptionRetention[FieldOptions_OptionRetention["RETENTION_RUNTIME"] = 1] = "RETENTION_RUNTIME"; + FieldOptions_OptionRetention[FieldOptions_OptionRetention["RETENTION_SOURCE"] = 2] = "RETENTION_SOURCE"; +})(FieldOptions_OptionRetention || (exports.FieldOptions_OptionRetention = FieldOptions_OptionRetention = {})); +function fieldOptions_OptionRetentionFromJSON(object) { + switch (object) { + case 0: + case "RETENTION_UNKNOWN": + return FieldOptions_OptionRetention.RETENTION_UNKNOWN; + case 1: + case "RETENTION_RUNTIME": + return FieldOptions_OptionRetention.RETENTION_RUNTIME; + case 2: + case "RETENTION_SOURCE": + return FieldOptions_OptionRetention.RETENTION_SOURCE; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_OptionRetention"); + } +} +function fieldOptions_OptionRetentionToJSON(object) { + switch (object) { + case FieldOptions_OptionRetention.RETENTION_UNKNOWN: + return "RETENTION_UNKNOWN"; + case FieldOptions_OptionRetention.RETENTION_RUNTIME: + return "RETENTION_RUNTIME"; + case FieldOptions_OptionRetention.RETENTION_SOURCE: + return "RETENTION_SOURCE"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_OptionRetention"); + } +} +/** + * This indicates the types of entities that the field may apply to when used + * as an option. If it is unset, then the field may be freely used as an + * option on any kind of entity. + */ +var FieldOptions_OptionTargetType; +(function (FieldOptions_OptionTargetType) { + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_UNKNOWN"] = 0] = "TARGET_TYPE_UNKNOWN"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_FILE"] = 1] = "TARGET_TYPE_FILE"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_EXTENSION_RANGE"] = 2] = "TARGET_TYPE_EXTENSION_RANGE"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_MESSAGE"] = 3] = "TARGET_TYPE_MESSAGE"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_FIELD"] = 4] = "TARGET_TYPE_FIELD"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_ONEOF"] = 5] = "TARGET_TYPE_ONEOF"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_ENUM"] = 6] = "TARGET_TYPE_ENUM"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_ENUM_ENTRY"] = 7] = "TARGET_TYPE_ENUM_ENTRY"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_SERVICE"] = 8] = "TARGET_TYPE_SERVICE"; + FieldOptions_OptionTargetType[FieldOptions_OptionTargetType["TARGET_TYPE_METHOD"] = 9] = "TARGET_TYPE_METHOD"; +})(FieldOptions_OptionTargetType || (exports.FieldOptions_OptionTargetType = FieldOptions_OptionTargetType = {})); +function fieldOptions_OptionTargetTypeFromJSON(object) { + switch (object) { + case 0: + case "TARGET_TYPE_UNKNOWN": + return FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN; + case 1: + case "TARGET_TYPE_FILE": + return FieldOptions_OptionTargetType.TARGET_TYPE_FILE; + case 2: + case "TARGET_TYPE_EXTENSION_RANGE": + return FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE; + case 3: + case "TARGET_TYPE_MESSAGE": + return FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE; + case 4: + case "TARGET_TYPE_FIELD": + return FieldOptions_OptionTargetType.TARGET_TYPE_FIELD; + case 5: + case "TARGET_TYPE_ONEOF": + return FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF; + case 6: + case "TARGET_TYPE_ENUM": + return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM; + case 7: + case "TARGET_TYPE_ENUM_ENTRY": + return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY; + case 8: + case "TARGET_TYPE_SERVICE": + return FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE; + case 9: + case "TARGET_TYPE_METHOD": + return FieldOptions_OptionTargetType.TARGET_TYPE_METHOD; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_OptionTargetType"); + } +} +function fieldOptions_OptionTargetTypeToJSON(object) { + switch (object) { + case FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN: + return "TARGET_TYPE_UNKNOWN"; + case FieldOptions_OptionTargetType.TARGET_TYPE_FILE: + return "TARGET_TYPE_FILE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE: + return "TARGET_TYPE_EXTENSION_RANGE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE: + return "TARGET_TYPE_MESSAGE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_FIELD: + return "TARGET_TYPE_FIELD"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF: + return "TARGET_TYPE_ONEOF"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM: + return "TARGET_TYPE_ENUM"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY: + return "TARGET_TYPE_ENUM_ENTRY"; + case FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE: + return "TARGET_TYPE_SERVICE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_METHOD: + return "TARGET_TYPE_METHOD"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FieldOptions_OptionTargetType"); } } -exports.fieldOptions_JSTypeToJSON = fieldOptions_JSTypeToJSON; /** * Is this method side-effect-free (or safe in HTTP parlance), or idempotent, * or neither? HTTP based RPC implementation may choose GET verb for safe @@ -310,7 +612,7 @@ var MethodOptions_IdempotencyLevel; MethodOptions_IdempotencyLevel[MethodOptions_IdempotencyLevel["NO_SIDE_EFFECTS"] = 1] = "NO_SIDE_EFFECTS"; /** IDEMPOTENT - idempotent, but may have side effects */ MethodOptions_IdempotencyLevel[MethodOptions_IdempotencyLevel["IDEMPOTENT"] = 2] = "IDEMPOTENT"; -})(MethodOptions_IdempotencyLevel = exports.MethodOptions_IdempotencyLevel || (exports.MethodOptions_IdempotencyLevel = {})); +})(MethodOptions_IdempotencyLevel || (exports.MethodOptions_IdempotencyLevel = MethodOptions_IdempotencyLevel = {})); function methodOptions_IdempotencyLevelFromJSON(object) { switch (object) { case 0: @@ -323,10 +625,9 @@ function methodOptions_IdempotencyLevelFromJSON(object) { case "IDEMPOTENT": return MethodOptions_IdempotencyLevel.IDEMPOTENT; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum MethodOptions_IdempotencyLevel"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum MethodOptions_IdempotencyLevel"); } } -exports.methodOptions_IdempotencyLevelFromJSON = methodOptions_IdempotencyLevelFromJSON; function methodOptions_IdempotencyLevelToJSON(object) { switch (object) { case MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN: @@ -336,972 +637,1405 @@ function methodOptions_IdempotencyLevelToJSON(object) { case MethodOptions_IdempotencyLevel.IDEMPOTENT: return "IDEMPOTENT"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum MethodOptions_IdempotencyLevel"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum MethodOptions_IdempotencyLevel"); } } -exports.methodOptions_IdempotencyLevelToJSON = methodOptions_IdempotencyLevelToJSON; -function createBaseFileDescriptorSet() { - return { file: [] }; +var FeatureSet_FieldPresence; +(function (FeatureSet_FieldPresence) { + FeatureSet_FieldPresence[FeatureSet_FieldPresence["FIELD_PRESENCE_UNKNOWN"] = 0] = "FIELD_PRESENCE_UNKNOWN"; + FeatureSet_FieldPresence[FeatureSet_FieldPresence["EXPLICIT"] = 1] = "EXPLICIT"; + FeatureSet_FieldPresence[FeatureSet_FieldPresence["IMPLICIT"] = 2] = "IMPLICIT"; + FeatureSet_FieldPresence[FeatureSet_FieldPresence["LEGACY_REQUIRED"] = 3] = "LEGACY_REQUIRED"; +})(FeatureSet_FieldPresence || (exports.FeatureSet_FieldPresence = FeatureSet_FieldPresence = {})); +function featureSet_FieldPresenceFromJSON(object) { + switch (object) { + case 0: + case "FIELD_PRESENCE_UNKNOWN": + return FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN; + case 1: + case "EXPLICIT": + return FeatureSet_FieldPresence.EXPLICIT; + case 2: + case "IMPLICIT": + return FeatureSet_FieldPresence.IMPLICIT; + case 3: + case "LEGACY_REQUIRED": + return FeatureSet_FieldPresence.LEGACY_REQUIRED; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_FieldPresence"); + } +} +function featureSet_FieldPresenceToJSON(object) { + switch (object) { + case FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN: + return "FIELD_PRESENCE_UNKNOWN"; + case FeatureSet_FieldPresence.EXPLICIT: + return "EXPLICIT"; + case FeatureSet_FieldPresence.IMPLICIT: + return "IMPLICIT"; + case FeatureSet_FieldPresence.LEGACY_REQUIRED: + return "LEGACY_REQUIRED"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_FieldPresence"); + } +} +var FeatureSet_EnumType; +(function (FeatureSet_EnumType) { + FeatureSet_EnumType[FeatureSet_EnumType["ENUM_TYPE_UNKNOWN"] = 0] = "ENUM_TYPE_UNKNOWN"; + FeatureSet_EnumType[FeatureSet_EnumType["OPEN"] = 1] = "OPEN"; + FeatureSet_EnumType[FeatureSet_EnumType["CLOSED"] = 2] = "CLOSED"; +})(FeatureSet_EnumType || (exports.FeatureSet_EnumType = FeatureSet_EnumType = {})); +function featureSet_EnumTypeFromJSON(object) { + switch (object) { + case 0: + case "ENUM_TYPE_UNKNOWN": + return FeatureSet_EnumType.ENUM_TYPE_UNKNOWN; + case 1: + case "OPEN": + return FeatureSet_EnumType.OPEN; + case 2: + case "CLOSED": + return FeatureSet_EnumType.CLOSED; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_EnumType"); + } +} +function featureSet_EnumTypeToJSON(object) { + switch (object) { + case FeatureSet_EnumType.ENUM_TYPE_UNKNOWN: + return "ENUM_TYPE_UNKNOWN"; + case FeatureSet_EnumType.OPEN: + return "OPEN"; + case FeatureSet_EnumType.CLOSED: + return "CLOSED"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_EnumType"); + } +} +var FeatureSet_RepeatedFieldEncoding; +(function (FeatureSet_RepeatedFieldEncoding) { + FeatureSet_RepeatedFieldEncoding[FeatureSet_RepeatedFieldEncoding["REPEATED_FIELD_ENCODING_UNKNOWN"] = 0] = "REPEATED_FIELD_ENCODING_UNKNOWN"; + FeatureSet_RepeatedFieldEncoding[FeatureSet_RepeatedFieldEncoding["PACKED"] = 1] = "PACKED"; + FeatureSet_RepeatedFieldEncoding[FeatureSet_RepeatedFieldEncoding["EXPANDED"] = 2] = "EXPANDED"; +})(FeatureSet_RepeatedFieldEncoding || (exports.FeatureSet_RepeatedFieldEncoding = FeatureSet_RepeatedFieldEncoding = {})); +function featureSet_RepeatedFieldEncodingFromJSON(object) { + switch (object) { + case 0: + case "REPEATED_FIELD_ENCODING_UNKNOWN": + return FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN; + case 1: + case "PACKED": + return FeatureSet_RepeatedFieldEncoding.PACKED; + case 2: + case "EXPANDED": + return FeatureSet_RepeatedFieldEncoding.EXPANDED; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_RepeatedFieldEncoding"); + } +} +function featureSet_RepeatedFieldEncodingToJSON(object) { + switch (object) { + case FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN: + return "REPEATED_FIELD_ENCODING_UNKNOWN"; + case FeatureSet_RepeatedFieldEncoding.PACKED: + return "PACKED"; + case FeatureSet_RepeatedFieldEncoding.EXPANDED: + return "EXPANDED"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_RepeatedFieldEncoding"); + } +} +var FeatureSet_Utf8Validation; +(function (FeatureSet_Utf8Validation) { + FeatureSet_Utf8Validation[FeatureSet_Utf8Validation["UTF8_VALIDATION_UNKNOWN"] = 0] = "UTF8_VALIDATION_UNKNOWN"; + FeatureSet_Utf8Validation[FeatureSet_Utf8Validation["VERIFY"] = 2] = "VERIFY"; + FeatureSet_Utf8Validation[FeatureSet_Utf8Validation["NONE"] = 3] = "NONE"; +})(FeatureSet_Utf8Validation || (exports.FeatureSet_Utf8Validation = FeatureSet_Utf8Validation = {})); +function featureSet_Utf8ValidationFromJSON(object) { + switch (object) { + case 0: + case "UTF8_VALIDATION_UNKNOWN": + return FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN; + case 2: + case "VERIFY": + return FeatureSet_Utf8Validation.VERIFY; + case 3: + case "NONE": + return FeatureSet_Utf8Validation.NONE; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_Utf8Validation"); + } +} +function featureSet_Utf8ValidationToJSON(object) { + switch (object) { + case FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN: + return "UTF8_VALIDATION_UNKNOWN"; + case FeatureSet_Utf8Validation.VERIFY: + return "VERIFY"; + case FeatureSet_Utf8Validation.NONE: + return "NONE"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_Utf8Validation"); + } +} +var FeatureSet_MessageEncoding; +(function (FeatureSet_MessageEncoding) { + FeatureSet_MessageEncoding[FeatureSet_MessageEncoding["MESSAGE_ENCODING_UNKNOWN"] = 0] = "MESSAGE_ENCODING_UNKNOWN"; + FeatureSet_MessageEncoding[FeatureSet_MessageEncoding["LENGTH_PREFIXED"] = 1] = "LENGTH_PREFIXED"; + FeatureSet_MessageEncoding[FeatureSet_MessageEncoding["DELIMITED"] = 2] = "DELIMITED"; +})(FeatureSet_MessageEncoding || (exports.FeatureSet_MessageEncoding = FeatureSet_MessageEncoding = {})); +function featureSet_MessageEncodingFromJSON(object) { + switch (object) { + case 0: + case "MESSAGE_ENCODING_UNKNOWN": + return FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN; + case 1: + case "LENGTH_PREFIXED": + return FeatureSet_MessageEncoding.LENGTH_PREFIXED; + case 2: + case "DELIMITED": + return FeatureSet_MessageEncoding.DELIMITED; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_MessageEncoding"); + } +} +function featureSet_MessageEncodingToJSON(object) { + switch (object) { + case FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN: + return "MESSAGE_ENCODING_UNKNOWN"; + case FeatureSet_MessageEncoding.LENGTH_PREFIXED: + return "LENGTH_PREFIXED"; + case FeatureSet_MessageEncoding.DELIMITED: + return "DELIMITED"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_MessageEncoding"); + } +} +var FeatureSet_JsonFormat; +(function (FeatureSet_JsonFormat) { + FeatureSet_JsonFormat[FeatureSet_JsonFormat["JSON_FORMAT_UNKNOWN"] = 0] = "JSON_FORMAT_UNKNOWN"; + FeatureSet_JsonFormat[FeatureSet_JsonFormat["ALLOW"] = 1] = "ALLOW"; + FeatureSet_JsonFormat[FeatureSet_JsonFormat["LEGACY_BEST_EFFORT"] = 2] = "LEGACY_BEST_EFFORT"; +})(FeatureSet_JsonFormat || (exports.FeatureSet_JsonFormat = FeatureSet_JsonFormat = {})); +function featureSet_JsonFormatFromJSON(object) { + switch (object) { + case 0: + case "JSON_FORMAT_UNKNOWN": + return FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN; + case 1: + case "ALLOW": + return FeatureSet_JsonFormat.ALLOW; + case 2: + case "LEGACY_BEST_EFFORT": + return FeatureSet_JsonFormat.LEGACY_BEST_EFFORT; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_JsonFormat"); + } +} +function featureSet_JsonFormatToJSON(object) { + switch (object) { + case FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN: + return "JSON_FORMAT_UNKNOWN"; + case FeatureSet_JsonFormat.ALLOW: + return "ALLOW"; + case FeatureSet_JsonFormat.LEGACY_BEST_EFFORT: + return "LEGACY_BEST_EFFORT"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_JsonFormat"); + } +} +var FeatureSet_EnforceNamingStyle; +(function (FeatureSet_EnforceNamingStyle) { + FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["ENFORCE_NAMING_STYLE_UNKNOWN"] = 0] = "ENFORCE_NAMING_STYLE_UNKNOWN"; + FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE2024"] = 1] = "STYLE2024"; + FeatureSet_EnforceNamingStyle[FeatureSet_EnforceNamingStyle["STYLE_LEGACY"] = 2] = "STYLE_LEGACY"; +})(FeatureSet_EnforceNamingStyle || (exports.FeatureSet_EnforceNamingStyle = FeatureSet_EnforceNamingStyle = {})); +function featureSet_EnforceNamingStyleFromJSON(object) { + switch (object) { + case 0: + case "ENFORCE_NAMING_STYLE_UNKNOWN": + return FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN; + case 1: + case "STYLE2024": + return FeatureSet_EnforceNamingStyle.STYLE2024; + case 2: + case "STYLE_LEGACY": + return FeatureSet_EnforceNamingStyle.STYLE_LEGACY; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_EnforceNamingStyle"); + } +} +function featureSet_EnforceNamingStyleToJSON(object) { + switch (object) { + case FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN: + return "ENFORCE_NAMING_STYLE_UNKNOWN"; + case FeatureSet_EnforceNamingStyle.STYLE2024: + return "STYLE2024"; + case FeatureSet_EnforceNamingStyle.STYLE_LEGACY: + return "STYLE_LEGACY"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum FeatureSet_EnforceNamingStyle"); + } +} +/** + * Represents the identified object's effect on the element in the original + * .proto file. + */ +var GeneratedCodeInfo_Annotation_Semantic; +(function (GeneratedCodeInfo_Annotation_Semantic) { + /** NONE - There is no effect or the effect is indescribable. */ + GeneratedCodeInfo_Annotation_Semantic[GeneratedCodeInfo_Annotation_Semantic["NONE"] = 0] = "NONE"; + /** SET - The element is set or otherwise mutated. */ + GeneratedCodeInfo_Annotation_Semantic[GeneratedCodeInfo_Annotation_Semantic["SET"] = 1] = "SET"; + /** ALIAS - An alias to the element is returned. */ + GeneratedCodeInfo_Annotation_Semantic[GeneratedCodeInfo_Annotation_Semantic["ALIAS"] = 2] = "ALIAS"; +})(GeneratedCodeInfo_Annotation_Semantic || (exports.GeneratedCodeInfo_Annotation_Semantic = GeneratedCodeInfo_Annotation_Semantic = {})); +function generatedCodeInfo_Annotation_SemanticFromJSON(object) { + switch (object) { + case 0: + case "NONE": + return GeneratedCodeInfo_Annotation_Semantic.NONE; + case 1: + case "SET": + return GeneratedCodeInfo_Annotation_Semantic.SET; + case 2: + case "ALIAS": + return GeneratedCodeInfo_Annotation_Semantic.ALIAS; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum GeneratedCodeInfo_Annotation_Semantic"); + } +} +function generatedCodeInfo_Annotation_SemanticToJSON(object) { + switch (object) { + case GeneratedCodeInfo_Annotation_Semantic.NONE: + return "NONE"; + case GeneratedCodeInfo_Annotation_Semantic.SET: + return "SET"; + case GeneratedCodeInfo_Annotation_Semantic.ALIAS: + return "ALIAS"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum GeneratedCodeInfo_Annotation_Semantic"); + } } exports.FileDescriptorSet = { fromJSON(object) { - return { file: Array.isArray(object?.file) ? object.file.map((e) => exports.FileDescriptorProto.fromJSON(e)) : [] }; + return { + file: globalThis.Array.isArray(object?.file) ? object.file.map((e) => exports.FileDescriptorProto.fromJSON(e)) : [], + }; }, toJSON(message) { const obj = {}; - if (message.file) { - obj.file = message.file.map((e) => e ? exports.FileDescriptorProto.toJSON(e) : undefined); - } - else { - obj.file = []; + if (message.file?.length) { + obj.file = message.file.map((e) => exports.FileDescriptorProto.toJSON(e)); } return obj; }, }; -function createBaseFileDescriptorProto() { - return { - name: "", - package: "", - dependency: [], - publicDependency: [], - weakDependency: [], - messageType: [], - enumType: [], - service: [], - extension: [], - options: undefined, - sourceCodeInfo: undefined, - syntax: "", - }; -} exports.FileDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - package: isSet(object.package) ? String(object.package) : "", - dependency: Array.isArray(object?.dependency) ? object.dependency.map((e) => String(e)) : [], - publicDependency: Array.isArray(object?.publicDependency) - ? object.publicDependency.map((e) => Number(e)) + name: isSet(object.name) ? globalThis.String(object.name) : "", + package: isSet(object.package) ? globalThis.String(object.package) : "", + dependency: globalThis.Array.isArray(object?.dependency) + ? object.dependency.map((e) => globalThis.String(e)) + : [], + publicDependency: globalThis.Array.isArray(object?.publicDependency) + ? object.publicDependency.map((e) => globalThis.Number(e)) + : [], + weakDependency: globalThis.Array.isArray(object?.weakDependency) + ? object.weakDependency.map((e) => globalThis.Number(e)) : [], - weakDependency: Array.isArray(object?.weakDependency) ? object.weakDependency.map((e) => Number(e)) : [], - messageType: Array.isArray(object?.messageType) + messageType: globalThis.Array.isArray(object?.messageType) ? object.messageType.map((e) => exports.DescriptorProto.fromJSON(e)) : [], - enumType: Array.isArray(object?.enumType) ? object.enumType.map((e) => exports.EnumDescriptorProto.fromJSON(e)) : [], - service: Array.isArray(object?.service) ? object.service.map((e) => exports.ServiceDescriptorProto.fromJSON(e)) : [], - extension: Array.isArray(object?.extension) + enumType: globalThis.Array.isArray(object?.enumType) + ? object.enumType.map((e) => exports.EnumDescriptorProto.fromJSON(e)) + : [], + service: globalThis.Array.isArray(object?.service) + ? object.service.map((e) => exports.ServiceDescriptorProto.fromJSON(e)) + : [], + extension: globalThis.Array.isArray(object?.extension) ? object.extension.map((e) => exports.FieldDescriptorProto.fromJSON(e)) : [], options: isSet(object.options) ? exports.FileOptions.fromJSON(object.options) : undefined, sourceCodeInfo: isSet(object.sourceCodeInfo) ? exports.SourceCodeInfo.fromJSON(object.sourceCodeInfo) : undefined, - syntax: isSet(object.syntax) ? String(object.syntax) : "", + syntax: isSet(object.syntax) ? globalThis.String(object.syntax) : "", + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - message.package !== undefined && (obj.package = message.package); - if (message.dependency) { - obj.dependency = message.dependency.map((e) => e); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; } - else { - obj.dependency = []; + if (message.package !== undefined && message.package !== "") { + obj.package = message.package; } - if (message.publicDependency) { - obj.publicDependency = message.publicDependency.map((e) => Math.round(e)); + if (message.dependency?.length) { + obj.dependency = message.dependency; } - else { - obj.publicDependency = []; + if (message.publicDependency?.length) { + obj.publicDependency = message.publicDependency.map((e) => Math.round(e)); } - if (message.weakDependency) { + if (message.weakDependency?.length) { obj.weakDependency = message.weakDependency.map((e) => Math.round(e)); } - else { - obj.weakDependency = []; + if (message.messageType?.length) { + obj.messageType = message.messageType.map((e) => exports.DescriptorProto.toJSON(e)); } - if (message.messageType) { - obj.messageType = message.messageType.map((e) => e ? exports.DescriptorProto.toJSON(e) : undefined); + if (message.enumType?.length) { + obj.enumType = message.enumType.map((e) => exports.EnumDescriptorProto.toJSON(e)); } - else { - obj.messageType = []; + if (message.service?.length) { + obj.service = message.service.map((e) => exports.ServiceDescriptorProto.toJSON(e)); } - if (message.enumType) { - obj.enumType = message.enumType.map((e) => e ? exports.EnumDescriptorProto.toJSON(e) : undefined); + if (message.extension?.length) { + obj.extension = message.extension.map((e) => exports.FieldDescriptorProto.toJSON(e)); } - else { - obj.enumType = []; + if (message.options !== undefined) { + obj.options = exports.FileOptions.toJSON(message.options); } - if (message.service) { - obj.service = message.service.map((e) => e ? exports.ServiceDescriptorProto.toJSON(e) : undefined); + if (message.sourceCodeInfo !== undefined) { + obj.sourceCodeInfo = exports.SourceCodeInfo.toJSON(message.sourceCodeInfo); } - else { - obj.service = []; + if (message.syntax !== undefined && message.syntax !== "") { + obj.syntax = message.syntax; } - if (message.extension) { - obj.extension = message.extension.map((e) => e ? exports.FieldDescriptorProto.toJSON(e) : undefined); + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); } - else { - obj.extension = []; - } - message.options !== undefined && (obj.options = message.options ? exports.FileOptions.toJSON(message.options) : undefined); - message.sourceCodeInfo !== undefined && - (obj.sourceCodeInfo = message.sourceCodeInfo ? exports.SourceCodeInfo.toJSON(message.sourceCodeInfo) : undefined); - message.syntax !== undefined && (obj.syntax = message.syntax); return obj; }, }; -function createBaseDescriptorProto() { - return { - name: "", - field: [], - extension: [], - nestedType: [], - enumType: [], - extensionRange: [], - oneofDecl: [], - options: undefined, - reservedRange: [], - reservedName: [], - }; -} exports.DescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - field: Array.isArray(object?.field) ? object.field.map((e) => exports.FieldDescriptorProto.fromJSON(e)) : [], - extension: Array.isArray(object?.extension) + name: isSet(object.name) ? globalThis.String(object.name) : "", + field: globalThis.Array.isArray(object?.field) + ? object.field.map((e) => exports.FieldDescriptorProto.fromJSON(e)) + : [], + extension: globalThis.Array.isArray(object?.extension) ? object.extension.map((e) => exports.FieldDescriptorProto.fromJSON(e)) : [], - nestedType: Array.isArray(object?.nestedType) + nestedType: globalThis.Array.isArray(object?.nestedType) ? object.nestedType.map((e) => exports.DescriptorProto.fromJSON(e)) : [], - enumType: Array.isArray(object?.enumType) ? object.enumType.map((e) => exports.EnumDescriptorProto.fromJSON(e)) : [], - extensionRange: Array.isArray(object?.extensionRange) + enumType: globalThis.Array.isArray(object?.enumType) + ? object.enumType.map((e) => exports.EnumDescriptorProto.fromJSON(e)) + : [], + extensionRange: globalThis.Array.isArray(object?.extensionRange) ? object.extensionRange.map((e) => exports.DescriptorProto_ExtensionRange.fromJSON(e)) : [], - oneofDecl: Array.isArray(object?.oneofDecl) + oneofDecl: globalThis.Array.isArray(object?.oneofDecl) ? object.oneofDecl.map((e) => exports.OneofDescriptorProto.fromJSON(e)) : [], options: isSet(object.options) ? exports.MessageOptions.fromJSON(object.options) : undefined, - reservedRange: Array.isArray(object?.reservedRange) + reservedRange: globalThis.Array.isArray(object?.reservedRange) ? object.reservedRange.map((e) => exports.DescriptorProto_ReservedRange.fromJSON(e)) : [], - reservedName: Array.isArray(object?.reservedName) ? object.reservedName.map((e) => String(e)) : [], + reservedName: globalThis.Array.isArray(object?.reservedName) + ? object.reservedName.map((e) => globalThis.String(e)) + : [], }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - if (message.field) { - obj.field = message.field.map((e) => e ? exports.FieldDescriptorProto.toJSON(e) : undefined); - } - else { - obj.field = []; - } - if (message.extension) { - obj.extension = message.extension.map((e) => e ? exports.FieldDescriptorProto.toJSON(e) : undefined); - } - else { - obj.extension = []; - } - if (message.nestedType) { - obj.nestedType = message.nestedType.map((e) => e ? exports.DescriptorProto.toJSON(e) : undefined); - } - else { - obj.nestedType = []; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; } - if (message.enumType) { - obj.enumType = message.enumType.map((e) => e ? exports.EnumDescriptorProto.toJSON(e) : undefined); + if (message.field?.length) { + obj.field = message.field.map((e) => exports.FieldDescriptorProto.toJSON(e)); } - else { - obj.enumType = []; + if (message.extension?.length) { + obj.extension = message.extension.map((e) => exports.FieldDescriptorProto.toJSON(e)); } - if (message.extensionRange) { - obj.extensionRange = message.extensionRange.map((e) => e ? exports.DescriptorProto_ExtensionRange.toJSON(e) : undefined); + if (message.nestedType?.length) { + obj.nestedType = message.nestedType.map((e) => exports.DescriptorProto.toJSON(e)); } - else { - obj.extensionRange = []; + if (message.enumType?.length) { + obj.enumType = message.enumType.map((e) => exports.EnumDescriptorProto.toJSON(e)); } - if (message.oneofDecl) { - obj.oneofDecl = message.oneofDecl.map((e) => e ? exports.OneofDescriptorProto.toJSON(e) : undefined); + if (message.extensionRange?.length) { + obj.extensionRange = message.extensionRange.map((e) => exports.DescriptorProto_ExtensionRange.toJSON(e)); } - else { - obj.oneofDecl = []; + if (message.oneofDecl?.length) { + obj.oneofDecl = message.oneofDecl.map((e) => exports.OneofDescriptorProto.toJSON(e)); } - message.options !== undefined && - (obj.options = message.options ? exports.MessageOptions.toJSON(message.options) : undefined); - if (message.reservedRange) { - obj.reservedRange = message.reservedRange.map((e) => e ? exports.DescriptorProto_ReservedRange.toJSON(e) : undefined); + if (message.options !== undefined) { + obj.options = exports.MessageOptions.toJSON(message.options); } - else { - obj.reservedRange = []; + if (message.reservedRange?.length) { + obj.reservedRange = message.reservedRange.map((e) => exports.DescriptorProto_ReservedRange.toJSON(e)); } - if (message.reservedName) { - obj.reservedName = message.reservedName.map((e) => e); - } - else { - obj.reservedName = []; + if (message.reservedName?.length) { + obj.reservedName = message.reservedName; } return obj; }, }; -function createBaseDescriptorProto_ExtensionRange() { - return { start: 0, end: 0, options: undefined }; -} exports.DescriptorProto_ExtensionRange = { fromJSON(object) { return { - start: isSet(object.start) ? Number(object.start) : 0, - end: isSet(object.end) ? Number(object.end) : 0, + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, options: isSet(object.options) ? exports.ExtensionRangeOptions.fromJSON(object.options) : undefined, }; }, toJSON(message) { const obj = {}; - message.start !== undefined && (obj.start = Math.round(message.start)); - message.end !== undefined && (obj.end = Math.round(message.end)); - message.options !== undefined && - (obj.options = message.options ? exports.ExtensionRangeOptions.toJSON(message.options) : undefined); + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + if (message.options !== undefined) { + obj.options = exports.ExtensionRangeOptions.toJSON(message.options); + } return obj; }, }; -function createBaseDescriptorProto_ReservedRange() { - return { start: 0, end: 0 }; -} exports.DescriptorProto_ReservedRange = { fromJSON(object) { - return { start: isSet(object.start) ? Number(object.start) : 0, end: isSet(object.end) ? Number(object.end) : 0 }; + return { + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + }; }, toJSON(message) { const obj = {}; - message.start !== undefined && (obj.start = Math.round(message.start)); - message.end !== undefined && (obj.end = Math.round(message.end)); + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } return obj; }, }; -function createBaseExtensionRangeOptions() { - return { uninterpretedOption: [] }; -} exports.ExtensionRangeOptions = { fromJSON(object) { return { - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], + declaration: globalThis.Array.isArray(object?.declaration) + ? object.declaration.map((e) => exports.ExtensionRangeOptions_Declaration.fromJSON(e)) + : [], + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + verification: isSet(object.verification) + ? extensionRangeOptions_VerificationStateFromJSON(object.verification) + : 1, }; }, toJSON(message) { const obj = {}; - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); + } + if (message.declaration?.length) { + obj.declaration = message.declaration.map((e) => exports.ExtensionRangeOptions_Declaration.toJSON(e)); } - else { - obj.uninterpretedOption = []; + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.verification !== undefined && message.verification !== 1) { + obj.verification = extensionRangeOptions_VerificationStateToJSON(message.verification); + } + return obj; + }, +}; +exports.ExtensionRangeOptions_Declaration = { + fromJSON(object) { + return { + number: isSet(object.number) ? globalThis.Number(object.number) : 0, + fullName: isSet(object.fullName) ? globalThis.String(object.fullName) : "", + type: isSet(object.type) ? globalThis.String(object.type) : "", + reserved: isSet(object.reserved) ? globalThis.Boolean(object.reserved) : false, + repeated: isSet(object.repeated) ? globalThis.Boolean(object.repeated) : false, + }; + }, + toJSON(message) { + const obj = {}; + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.fullName !== undefined && message.fullName !== "") { + obj.fullName = message.fullName; + } + if (message.type !== undefined && message.type !== "") { + obj.type = message.type; + } + if (message.reserved !== undefined && message.reserved !== false) { + obj.reserved = message.reserved; + } + if (message.repeated !== undefined && message.repeated !== false) { + obj.repeated = message.repeated; } return obj; }, }; -function createBaseFieldDescriptorProto() { - return { - name: "", - number: 0, - label: 1, - type: 1, - typeName: "", - extendee: "", - defaultValue: "", - oneofIndex: 0, - jsonName: "", - options: undefined, - proto3Optional: false, - }; -} exports.FieldDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - number: isSet(object.number) ? Number(object.number) : 0, + name: isSet(object.name) ? globalThis.String(object.name) : "", + number: isSet(object.number) ? globalThis.Number(object.number) : 0, label: isSet(object.label) ? fieldDescriptorProto_LabelFromJSON(object.label) : 1, type: isSet(object.type) ? fieldDescriptorProto_TypeFromJSON(object.type) : 1, - typeName: isSet(object.typeName) ? String(object.typeName) : "", - extendee: isSet(object.extendee) ? String(object.extendee) : "", - defaultValue: isSet(object.defaultValue) ? String(object.defaultValue) : "", - oneofIndex: isSet(object.oneofIndex) ? Number(object.oneofIndex) : 0, - jsonName: isSet(object.jsonName) ? String(object.jsonName) : "", + typeName: isSet(object.typeName) ? globalThis.String(object.typeName) : "", + extendee: isSet(object.extendee) ? globalThis.String(object.extendee) : "", + defaultValue: isSet(object.defaultValue) ? globalThis.String(object.defaultValue) : "", + oneofIndex: isSet(object.oneofIndex) ? globalThis.Number(object.oneofIndex) : 0, + jsonName: isSet(object.jsonName) ? globalThis.String(object.jsonName) : "", options: isSet(object.options) ? exports.FieldOptions.fromJSON(object.options) : undefined, - proto3Optional: isSet(object.proto3Optional) ? Boolean(object.proto3Optional) : false, + proto3Optional: isSet(object.proto3Optional) ? globalThis.Boolean(object.proto3Optional) : false, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - message.number !== undefined && (obj.number = Math.round(message.number)); - message.label !== undefined && (obj.label = fieldDescriptorProto_LabelToJSON(message.label)); - message.type !== undefined && (obj.type = fieldDescriptorProto_TypeToJSON(message.type)); - message.typeName !== undefined && (obj.typeName = message.typeName); - message.extendee !== undefined && (obj.extendee = message.extendee); - message.defaultValue !== undefined && (obj.defaultValue = message.defaultValue); - message.oneofIndex !== undefined && (obj.oneofIndex = Math.round(message.oneofIndex)); - message.jsonName !== undefined && (obj.jsonName = message.jsonName); - message.options !== undefined && (obj.options = message.options ? exports.FieldOptions.toJSON(message.options) : undefined); - message.proto3Optional !== undefined && (obj.proto3Optional = message.proto3Optional); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.label !== undefined && message.label !== 1) { + obj.label = fieldDescriptorProto_LabelToJSON(message.label); + } + if (message.type !== undefined && message.type !== 1) { + obj.type = fieldDescriptorProto_TypeToJSON(message.type); + } + if (message.typeName !== undefined && message.typeName !== "") { + obj.typeName = message.typeName; + } + if (message.extendee !== undefined && message.extendee !== "") { + obj.extendee = message.extendee; + } + if (message.defaultValue !== undefined && message.defaultValue !== "") { + obj.defaultValue = message.defaultValue; + } + if (message.oneofIndex !== undefined && message.oneofIndex !== 0) { + obj.oneofIndex = Math.round(message.oneofIndex); + } + if (message.jsonName !== undefined && message.jsonName !== "") { + obj.jsonName = message.jsonName; + } + if (message.options !== undefined) { + obj.options = exports.FieldOptions.toJSON(message.options); + } + if (message.proto3Optional !== undefined && message.proto3Optional !== false) { + obj.proto3Optional = message.proto3Optional; + } return obj; }, }; -function createBaseOneofDescriptorProto() { - return { name: "", options: undefined }; -} exports.OneofDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", options: isSet(object.options) ? exports.OneofOptions.fromJSON(object.options) : undefined, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - message.options !== undefined && (obj.options = message.options ? exports.OneofOptions.toJSON(message.options) : undefined); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.options !== undefined) { + obj.options = exports.OneofOptions.toJSON(message.options); + } return obj; }, }; -function createBaseEnumDescriptorProto() { - return { name: "", value: [], options: undefined, reservedRange: [], reservedName: [] }; -} exports.EnumDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - value: Array.isArray(object?.value) ? object.value.map((e) => exports.EnumValueDescriptorProto.fromJSON(e)) : [], + name: isSet(object.name) ? globalThis.String(object.name) : "", + value: globalThis.Array.isArray(object?.value) + ? object.value.map((e) => exports.EnumValueDescriptorProto.fromJSON(e)) + : [], options: isSet(object.options) ? exports.EnumOptions.fromJSON(object.options) : undefined, - reservedRange: Array.isArray(object?.reservedRange) + reservedRange: globalThis.Array.isArray(object?.reservedRange) ? object.reservedRange.map((e) => exports.EnumDescriptorProto_EnumReservedRange.fromJSON(e)) : [], - reservedName: Array.isArray(object?.reservedName) - ? object.reservedName.map((e) => String(e)) + reservedName: globalThis.Array.isArray(object?.reservedName) + ? object.reservedName.map((e) => globalThis.String(e)) : [], }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - if (message.value) { - obj.value = message.value.map((e) => e ? exports.EnumValueDescriptorProto.toJSON(e) : undefined); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; } - else { - obj.value = []; + if (message.value?.length) { + obj.value = message.value.map((e) => exports.EnumValueDescriptorProto.toJSON(e)); } - message.options !== undefined && (obj.options = message.options ? exports.EnumOptions.toJSON(message.options) : undefined); - if (message.reservedRange) { - obj.reservedRange = message.reservedRange.map((e) => e ? exports.EnumDescriptorProto_EnumReservedRange.toJSON(e) : undefined); + if (message.options !== undefined) { + obj.options = exports.EnumOptions.toJSON(message.options); } - else { - obj.reservedRange = []; + if (message.reservedRange?.length) { + obj.reservedRange = message.reservedRange.map((e) => exports.EnumDescriptorProto_EnumReservedRange.toJSON(e)); } - if (message.reservedName) { - obj.reservedName = message.reservedName.map((e) => e); - } - else { - obj.reservedName = []; + if (message.reservedName?.length) { + obj.reservedName = message.reservedName; } return obj; }, }; -function createBaseEnumDescriptorProto_EnumReservedRange() { - return { start: 0, end: 0 }; -} exports.EnumDescriptorProto_EnumReservedRange = { fromJSON(object) { - return { start: isSet(object.start) ? Number(object.start) : 0, end: isSet(object.end) ? Number(object.end) : 0 }; + return { + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + }; }, toJSON(message) { const obj = {}; - message.start !== undefined && (obj.start = Math.round(message.start)); - message.end !== undefined && (obj.end = Math.round(message.end)); + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } return obj; }, }; -function createBaseEnumValueDescriptorProto() { - return { name: "", number: 0, options: undefined }; -} exports.EnumValueDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - number: isSet(object.number) ? Number(object.number) : 0, + name: isSet(object.name) ? globalThis.String(object.name) : "", + number: isSet(object.number) ? globalThis.Number(object.number) : 0, options: isSet(object.options) ? exports.EnumValueOptions.fromJSON(object.options) : undefined, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - message.number !== undefined && (obj.number = Math.round(message.number)); - message.options !== undefined && - (obj.options = message.options ? exports.EnumValueOptions.toJSON(message.options) : undefined); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.options !== undefined) { + obj.options = exports.EnumValueOptions.toJSON(message.options); + } return obj; }, }; -function createBaseServiceDescriptorProto() { - return { name: "", method: [], options: undefined }; -} exports.ServiceDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - method: Array.isArray(object?.method) ? object.method.map((e) => exports.MethodDescriptorProto.fromJSON(e)) : [], + name: isSet(object.name) ? globalThis.String(object.name) : "", + method: globalThis.Array.isArray(object?.method) + ? object.method.map((e) => exports.MethodDescriptorProto.fromJSON(e)) + : [], options: isSet(object.options) ? exports.ServiceOptions.fromJSON(object.options) : undefined, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - if (message.method) { - obj.method = message.method.map((e) => e ? exports.MethodDescriptorProto.toJSON(e) : undefined); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.method?.length) { + obj.method = message.method.map((e) => exports.MethodDescriptorProto.toJSON(e)); } - else { - obj.method = []; + if (message.options !== undefined) { + obj.options = exports.ServiceOptions.toJSON(message.options); } - message.options !== undefined && - (obj.options = message.options ? exports.ServiceOptions.toJSON(message.options) : undefined); return obj; }, }; -function createBaseMethodDescriptorProto() { - return { - name: "", - inputType: "", - outputType: "", - options: undefined, - clientStreaming: false, - serverStreaming: false, - }; -} exports.MethodDescriptorProto = { fromJSON(object) { return { - name: isSet(object.name) ? String(object.name) : "", - inputType: isSet(object.inputType) ? String(object.inputType) : "", - outputType: isSet(object.outputType) ? String(object.outputType) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + inputType: isSet(object.inputType) ? globalThis.String(object.inputType) : "", + outputType: isSet(object.outputType) ? globalThis.String(object.outputType) : "", options: isSet(object.options) ? exports.MethodOptions.fromJSON(object.options) : undefined, - clientStreaming: isSet(object.clientStreaming) ? Boolean(object.clientStreaming) : false, - serverStreaming: isSet(object.serverStreaming) ? Boolean(object.serverStreaming) : false, + clientStreaming: isSet(object.clientStreaming) ? globalThis.Boolean(object.clientStreaming) : false, + serverStreaming: isSet(object.serverStreaming) ? globalThis.Boolean(object.serverStreaming) : false, }; }, toJSON(message) { const obj = {}; - message.name !== undefined && (obj.name = message.name); - message.inputType !== undefined && (obj.inputType = message.inputType); - message.outputType !== undefined && (obj.outputType = message.outputType); - message.options !== undefined && - (obj.options = message.options ? exports.MethodOptions.toJSON(message.options) : undefined); - message.clientStreaming !== undefined && (obj.clientStreaming = message.clientStreaming); - message.serverStreaming !== undefined && (obj.serverStreaming = message.serverStreaming); + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.inputType !== undefined && message.inputType !== "") { + obj.inputType = message.inputType; + } + if (message.outputType !== undefined && message.outputType !== "") { + obj.outputType = message.outputType; + } + if (message.options !== undefined) { + obj.options = exports.MethodOptions.toJSON(message.options); + } + if (message.clientStreaming !== undefined && message.clientStreaming !== false) { + obj.clientStreaming = message.clientStreaming; + } + if (message.serverStreaming !== undefined && message.serverStreaming !== false) { + obj.serverStreaming = message.serverStreaming; + } return obj; }, }; -function createBaseFileOptions() { - return { - javaPackage: "", - javaOuterClassname: "", - javaMultipleFiles: false, - javaGenerateEqualsAndHash: false, - javaStringCheckUtf8: false, - optimizeFor: 1, - goPackage: "", - ccGenericServices: false, - javaGenericServices: false, - pyGenericServices: false, - phpGenericServices: false, - deprecated: false, - ccEnableArenas: false, - objcClassPrefix: "", - csharpNamespace: "", - swiftPrefix: "", - phpClassPrefix: "", - phpNamespace: "", - phpMetadataNamespace: "", - rubyPackage: "", - uninterpretedOption: [], - }; -} exports.FileOptions = { fromJSON(object) { return { - javaPackage: isSet(object.javaPackage) ? String(object.javaPackage) : "", - javaOuterClassname: isSet(object.javaOuterClassname) ? String(object.javaOuterClassname) : "", - javaMultipleFiles: isSet(object.javaMultipleFiles) ? Boolean(object.javaMultipleFiles) : false, + javaPackage: isSet(object.javaPackage) ? globalThis.String(object.javaPackage) : "", + javaOuterClassname: isSet(object.javaOuterClassname) ? globalThis.String(object.javaOuterClassname) : "", + javaMultipleFiles: isSet(object.javaMultipleFiles) ? globalThis.Boolean(object.javaMultipleFiles) : false, javaGenerateEqualsAndHash: isSet(object.javaGenerateEqualsAndHash) - ? Boolean(object.javaGenerateEqualsAndHash) + ? globalThis.Boolean(object.javaGenerateEqualsAndHash) : false, - javaStringCheckUtf8: isSet(object.javaStringCheckUtf8) ? Boolean(object.javaStringCheckUtf8) : false, + javaStringCheckUtf8: isSet(object.javaStringCheckUtf8) ? globalThis.Boolean(object.javaStringCheckUtf8) : false, optimizeFor: isSet(object.optimizeFor) ? fileOptions_OptimizeModeFromJSON(object.optimizeFor) : 1, - goPackage: isSet(object.goPackage) ? String(object.goPackage) : "", - ccGenericServices: isSet(object.ccGenericServices) ? Boolean(object.ccGenericServices) : false, - javaGenericServices: isSet(object.javaGenericServices) ? Boolean(object.javaGenericServices) : false, - pyGenericServices: isSet(object.pyGenericServices) ? Boolean(object.pyGenericServices) : false, - phpGenericServices: isSet(object.phpGenericServices) ? Boolean(object.phpGenericServices) : false, - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - ccEnableArenas: isSet(object.ccEnableArenas) ? Boolean(object.ccEnableArenas) : false, - objcClassPrefix: isSet(object.objcClassPrefix) ? String(object.objcClassPrefix) : "", - csharpNamespace: isSet(object.csharpNamespace) ? String(object.csharpNamespace) : "", - swiftPrefix: isSet(object.swiftPrefix) ? String(object.swiftPrefix) : "", - phpClassPrefix: isSet(object.phpClassPrefix) ? String(object.phpClassPrefix) : "", - phpNamespace: isSet(object.phpNamespace) ? String(object.phpNamespace) : "", - phpMetadataNamespace: isSet(object.phpMetadataNamespace) ? String(object.phpMetadataNamespace) : "", - rubyPackage: isSet(object.rubyPackage) ? String(object.rubyPackage) : "", - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + goPackage: isSet(object.goPackage) ? globalThis.String(object.goPackage) : "", + ccGenericServices: isSet(object.ccGenericServices) ? globalThis.Boolean(object.ccGenericServices) : false, + javaGenericServices: isSet(object.javaGenericServices) ? globalThis.Boolean(object.javaGenericServices) : false, + pyGenericServices: isSet(object.pyGenericServices) ? globalThis.Boolean(object.pyGenericServices) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + ccEnableArenas: isSet(object.ccEnableArenas) ? globalThis.Boolean(object.ccEnableArenas) : true, + objcClassPrefix: isSet(object.objcClassPrefix) ? globalThis.String(object.objcClassPrefix) : "", + csharpNamespace: isSet(object.csharpNamespace) ? globalThis.String(object.csharpNamespace) : "", + swiftPrefix: isSet(object.swiftPrefix) ? globalThis.String(object.swiftPrefix) : "", + phpClassPrefix: isSet(object.phpClassPrefix) ? globalThis.String(object.phpClassPrefix) : "", + phpNamespace: isSet(object.phpNamespace) ? globalThis.String(object.phpNamespace) : "", + phpMetadataNamespace: isSet(object.phpMetadataNamespace) ? globalThis.String(object.phpMetadataNamespace) : "", + rubyPackage: isSet(object.rubyPackage) ? globalThis.String(object.rubyPackage) : "", + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.javaPackage !== undefined && (obj.javaPackage = message.javaPackage); - message.javaOuterClassname !== undefined && (obj.javaOuterClassname = message.javaOuterClassname); - message.javaMultipleFiles !== undefined && (obj.javaMultipleFiles = message.javaMultipleFiles); - message.javaGenerateEqualsAndHash !== undefined && - (obj.javaGenerateEqualsAndHash = message.javaGenerateEqualsAndHash); - message.javaStringCheckUtf8 !== undefined && (obj.javaStringCheckUtf8 = message.javaStringCheckUtf8); - message.optimizeFor !== undefined && (obj.optimizeFor = fileOptions_OptimizeModeToJSON(message.optimizeFor)); - message.goPackage !== undefined && (obj.goPackage = message.goPackage); - message.ccGenericServices !== undefined && (obj.ccGenericServices = message.ccGenericServices); - message.javaGenericServices !== undefined && (obj.javaGenericServices = message.javaGenericServices); - message.pyGenericServices !== undefined && (obj.pyGenericServices = message.pyGenericServices); - message.phpGenericServices !== undefined && (obj.phpGenericServices = message.phpGenericServices); - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - message.ccEnableArenas !== undefined && (obj.ccEnableArenas = message.ccEnableArenas); - message.objcClassPrefix !== undefined && (obj.objcClassPrefix = message.objcClassPrefix); - message.csharpNamespace !== undefined && (obj.csharpNamespace = message.csharpNamespace); - message.swiftPrefix !== undefined && (obj.swiftPrefix = message.swiftPrefix); - message.phpClassPrefix !== undefined && (obj.phpClassPrefix = message.phpClassPrefix); - message.phpNamespace !== undefined && (obj.phpNamespace = message.phpNamespace); - message.phpMetadataNamespace !== undefined && (obj.phpMetadataNamespace = message.phpMetadataNamespace); - message.rubyPackage !== undefined && (obj.rubyPackage = message.rubyPackage); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); - } - else { - obj.uninterpretedOption = []; + if (message.javaPackage !== undefined && message.javaPackage !== "") { + obj.javaPackage = message.javaPackage; + } + if (message.javaOuterClassname !== undefined && message.javaOuterClassname !== "") { + obj.javaOuterClassname = message.javaOuterClassname; + } + if (message.javaMultipleFiles !== undefined && message.javaMultipleFiles !== false) { + obj.javaMultipleFiles = message.javaMultipleFiles; + } + if (message.javaGenerateEqualsAndHash !== undefined && message.javaGenerateEqualsAndHash !== false) { + obj.javaGenerateEqualsAndHash = message.javaGenerateEqualsAndHash; + } + if (message.javaStringCheckUtf8 !== undefined && message.javaStringCheckUtf8 !== false) { + obj.javaStringCheckUtf8 = message.javaStringCheckUtf8; + } + if (message.optimizeFor !== undefined && message.optimizeFor !== 1) { + obj.optimizeFor = fileOptions_OptimizeModeToJSON(message.optimizeFor); + } + if (message.goPackage !== undefined && message.goPackage !== "") { + obj.goPackage = message.goPackage; + } + if (message.ccGenericServices !== undefined && message.ccGenericServices !== false) { + obj.ccGenericServices = message.ccGenericServices; + } + if (message.javaGenericServices !== undefined && message.javaGenericServices !== false) { + obj.javaGenericServices = message.javaGenericServices; + } + if (message.pyGenericServices !== undefined && message.pyGenericServices !== false) { + obj.pyGenericServices = message.pyGenericServices; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.ccEnableArenas !== undefined && message.ccEnableArenas !== true) { + obj.ccEnableArenas = message.ccEnableArenas; + } + if (message.objcClassPrefix !== undefined && message.objcClassPrefix !== "") { + obj.objcClassPrefix = message.objcClassPrefix; + } + if (message.csharpNamespace !== undefined && message.csharpNamespace !== "") { + obj.csharpNamespace = message.csharpNamespace; + } + if (message.swiftPrefix !== undefined && message.swiftPrefix !== "") { + obj.swiftPrefix = message.swiftPrefix; + } + if (message.phpClassPrefix !== undefined && message.phpClassPrefix !== "") { + obj.phpClassPrefix = message.phpClassPrefix; + } + if (message.phpNamespace !== undefined && message.phpNamespace !== "") { + obj.phpNamespace = message.phpNamespace; + } + if (message.phpMetadataNamespace !== undefined && message.phpMetadataNamespace !== "") { + obj.phpMetadataNamespace = message.phpMetadataNamespace; + } + if (message.rubyPackage !== undefined && message.rubyPackage !== "") { + obj.rubyPackage = message.rubyPackage; + } + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseMessageOptions() { - return { - messageSetWireFormat: false, - noStandardDescriptorAccessor: false, - deprecated: false, - mapEntry: false, - uninterpretedOption: [], - }; -} exports.MessageOptions = { fromJSON(object) { return { - messageSetWireFormat: isSet(object.messageSetWireFormat) ? Boolean(object.messageSetWireFormat) : false, + messageSetWireFormat: isSet(object.messageSetWireFormat) + ? globalThis.Boolean(object.messageSetWireFormat) + : false, noStandardDescriptorAccessor: isSet(object.noStandardDescriptorAccessor) - ? Boolean(object.noStandardDescriptorAccessor) + ? globalThis.Boolean(object.noStandardDescriptorAccessor) + : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + mapEntry: isSet(object.mapEntry) ? globalThis.Boolean(object.mapEntry) : false, + deprecatedLegacyJsonFieldConflicts: isSet(object.deprecatedLegacyJsonFieldConflicts) + ? globalThis.Boolean(object.deprecatedLegacyJsonFieldConflicts) : false, - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - mapEntry: isSet(object.mapEntry) ? Boolean(object.mapEntry) : false, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.messageSetWireFormat !== undefined && (obj.messageSetWireFormat = message.messageSetWireFormat); - message.noStandardDescriptorAccessor !== undefined && - (obj.noStandardDescriptorAccessor = message.noStandardDescriptorAccessor); - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - message.mapEntry !== undefined && (obj.mapEntry = message.mapEntry); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.messageSetWireFormat !== undefined && message.messageSetWireFormat !== false) { + obj.messageSetWireFormat = message.messageSetWireFormat; } - else { - obj.uninterpretedOption = []; + if (message.noStandardDescriptorAccessor !== undefined && message.noStandardDescriptorAccessor !== false) { + obj.noStandardDescriptorAccessor = message.noStandardDescriptorAccessor; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.mapEntry !== undefined && message.mapEntry !== false) { + obj.mapEntry = message.mapEntry; + } + if (message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false) { + obj.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts; + } + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseFieldOptions() { - return { - ctype: 0, - packed: false, - jstype: 0, - lazy: false, - unverifiedLazy: false, - deprecated: false, - weak: false, - uninterpretedOption: [], - }; -} exports.FieldOptions = { fromJSON(object) { return { ctype: isSet(object.ctype) ? fieldOptions_CTypeFromJSON(object.ctype) : 0, - packed: isSet(object.packed) ? Boolean(object.packed) : false, + packed: isSet(object.packed) ? globalThis.Boolean(object.packed) : false, jstype: isSet(object.jstype) ? fieldOptions_JSTypeFromJSON(object.jstype) : 0, - lazy: isSet(object.lazy) ? Boolean(object.lazy) : false, - unverifiedLazy: isSet(object.unverifiedLazy) ? Boolean(object.unverifiedLazy) : false, - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - weak: isSet(object.weak) ? Boolean(object.weak) : false, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + lazy: isSet(object.lazy) ? globalThis.Boolean(object.lazy) : false, + unverifiedLazy: isSet(object.unverifiedLazy) ? globalThis.Boolean(object.unverifiedLazy) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + weak: isSet(object.weak) ? globalThis.Boolean(object.weak) : false, + debugRedact: isSet(object.debugRedact) ? globalThis.Boolean(object.debugRedact) : false, + retention: isSet(object.retention) ? fieldOptions_OptionRetentionFromJSON(object.retention) : 0, + targets: globalThis.Array.isArray(object?.targets) + ? object.targets.map((e) => fieldOptions_OptionTargetTypeFromJSON(e)) + : [], + editionDefaults: globalThis.Array.isArray(object?.editionDefaults) + ? object.editionDefaults.map((e) => exports.FieldOptions_EditionDefault.fromJSON(e)) + : [], + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + featureSupport: isSet(object.featureSupport) + ? exports.FieldOptions_FeatureSupport.fromJSON(object.featureSupport) + : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.ctype !== undefined && (obj.ctype = fieldOptions_CTypeToJSON(message.ctype)); - message.packed !== undefined && (obj.packed = message.packed); - message.jstype !== undefined && (obj.jstype = fieldOptions_JSTypeToJSON(message.jstype)); - message.lazy !== undefined && (obj.lazy = message.lazy); - message.unverifiedLazy !== undefined && (obj.unverifiedLazy = message.unverifiedLazy); - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - message.weak !== undefined && (obj.weak = message.weak); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); - } - else { - obj.uninterpretedOption = []; + if (message.ctype !== undefined && message.ctype !== 0) { + obj.ctype = fieldOptions_CTypeToJSON(message.ctype); + } + if (message.packed !== undefined && message.packed !== false) { + obj.packed = message.packed; + } + if (message.jstype !== undefined && message.jstype !== 0) { + obj.jstype = fieldOptions_JSTypeToJSON(message.jstype); + } + if (message.lazy !== undefined && message.lazy !== false) { + obj.lazy = message.lazy; + } + if (message.unverifiedLazy !== undefined && message.unverifiedLazy !== false) { + obj.unverifiedLazy = message.unverifiedLazy; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.weak !== undefined && message.weak !== false) { + obj.weak = message.weak; + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + obj.debugRedact = message.debugRedact; + } + if (message.retention !== undefined && message.retention !== 0) { + obj.retention = fieldOptions_OptionRetentionToJSON(message.retention); + } + if (message.targets?.length) { + obj.targets = message.targets.map((e) => fieldOptions_OptionTargetTypeToJSON(e)); + } + if (message.editionDefaults?.length) { + obj.editionDefaults = message.editionDefaults.map((e) => exports.FieldOptions_EditionDefault.toJSON(e)); + } + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.featureSupport !== undefined) { + obj.featureSupport = exports.FieldOptions_FeatureSupport.toJSON(message.featureSupport); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); + } + return obj; + }, +}; +exports.FieldOptions_EditionDefault = { + fromJSON(object) { + return { + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + toJSON(message) { + const obj = {}; + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); + } + if (message.value !== undefined && message.value !== "") { + obj.value = message.value; + } + return obj; + }, +}; +exports.FieldOptions_FeatureSupport = { + fromJSON(object) { + return { + editionIntroduced: isSet(object.editionIntroduced) ? editionFromJSON(object.editionIntroduced) : 0, + editionDeprecated: isSet(object.editionDeprecated) ? editionFromJSON(object.editionDeprecated) : 0, + deprecationWarning: isSet(object.deprecationWarning) ? globalThis.String(object.deprecationWarning) : "", + editionRemoved: isSet(object.editionRemoved) ? editionFromJSON(object.editionRemoved) : 0, + }; + }, + toJSON(message) { + const obj = {}; + if (message.editionIntroduced !== undefined && message.editionIntroduced !== 0) { + obj.editionIntroduced = editionToJSON(message.editionIntroduced); + } + if (message.editionDeprecated !== undefined && message.editionDeprecated !== 0) { + obj.editionDeprecated = editionToJSON(message.editionDeprecated); + } + if (message.deprecationWarning !== undefined && message.deprecationWarning !== "") { + obj.deprecationWarning = message.deprecationWarning; + } + if (message.editionRemoved !== undefined && message.editionRemoved !== 0) { + obj.editionRemoved = editionToJSON(message.editionRemoved); } return obj; }, }; -function createBaseOneofOptions() { - return { uninterpretedOption: [] }; -} exports.OneofOptions = { fromJSON(object) { return { - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); } - else { - obj.uninterpretedOption = []; + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseEnumOptions() { - return { allowAlias: false, deprecated: false, uninterpretedOption: [] }; -} exports.EnumOptions = { fromJSON(object) { return { - allowAlias: isSet(object.allowAlias) ? Boolean(object.allowAlias) : false, - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + allowAlias: isSet(object.allowAlias) ? globalThis.Boolean(object.allowAlias) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + deprecatedLegacyJsonFieldConflicts: isSet(object.deprecatedLegacyJsonFieldConflicts) + ? globalThis.Boolean(object.deprecatedLegacyJsonFieldConflicts) + : false, + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.allowAlias !== undefined && (obj.allowAlias = message.allowAlias); - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.allowAlias !== undefined && message.allowAlias !== false) { + obj.allowAlias = message.allowAlias; } - else { - obj.uninterpretedOption = []; + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false) { + obj.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts; + } + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseEnumValueOptions() { - return { deprecated: false, uninterpretedOption: [] }; -} exports.EnumValueOptions = { fromJSON(object) { return { - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + debugRedact: isSet(object.debugRedact) ? globalThis.Boolean(object.debugRedact) : false, + featureSupport: isSet(object.featureSupport) + ? exports.FieldOptions_FeatureSupport.fromJSON(object.featureSupport) + : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + obj.debugRedact = message.debugRedact; + } + if (message.featureSupport !== undefined) { + obj.featureSupport = exports.FieldOptions_FeatureSupport.toJSON(message.featureSupport); } - else { - obj.uninterpretedOption = []; + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseServiceOptions() { - return { deprecated: false, uninterpretedOption: [] }; -} exports.ServiceOptions = { fromJSON(object) { return { - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; } - else { - obj.uninterpretedOption = []; + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseMethodOptions() { - return { deprecated: false, idempotencyLevel: 0, uninterpretedOption: [] }; -} exports.MethodOptions = { fromJSON(object) { return { - deprecated: isSet(object.deprecated) ? Boolean(object.deprecated) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, idempotencyLevel: isSet(object.idempotencyLevel) ? methodOptions_IdempotencyLevelFromJSON(object.idempotencyLevel) : 0, - uninterpretedOption: Array.isArray(object?.uninterpretedOption) + features: isSet(object.features) ? exports.FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) ? object.uninterpretedOption.map((e) => exports.UninterpretedOption.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.deprecated !== undefined && (obj.deprecated = message.deprecated); - message.idempotencyLevel !== undefined && - (obj.idempotencyLevel = methodOptions_IdempotencyLevelToJSON(message.idempotencyLevel)); - if (message.uninterpretedOption) { - obj.uninterpretedOption = message.uninterpretedOption.map((e) => e ? exports.UninterpretedOption.toJSON(e) : undefined); + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.idempotencyLevel !== undefined && message.idempotencyLevel !== 0) { + obj.idempotencyLevel = methodOptions_IdempotencyLevelToJSON(message.idempotencyLevel); } - else { - obj.uninterpretedOption = []; + if (message.features !== undefined) { + obj.features = exports.FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => exports.UninterpretedOption.toJSON(e)); } return obj; }, }; -function createBaseUninterpretedOption() { - return { - name: [], - identifierValue: "", - positiveIntValue: "0", - negativeIntValue: "0", - doubleValue: 0, - stringValue: Buffer.alloc(0), - aggregateValue: "", - }; -} exports.UninterpretedOption = { fromJSON(object) { return { - name: Array.isArray(object?.name) ? object.name.map((e) => exports.UninterpretedOption_NamePart.fromJSON(e)) : [], - identifierValue: isSet(object.identifierValue) ? String(object.identifierValue) : "", - positiveIntValue: isSet(object.positiveIntValue) ? String(object.positiveIntValue) : "0", - negativeIntValue: isSet(object.negativeIntValue) ? String(object.negativeIntValue) : "0", - doubleValue: isSet(object.doubleValue) ? Number(object.doubleValue) : 0, + name: globalThis.Array.isArray(object?.name) + ? object.name.map((e) => exports.UninterpretedOption_NamePart.fromJSON(e)) + : [], + identifierValue: isSet(object.identifierValue) ? globalThis.String(object.identifierValue) : "", + positiveIntValue: isSet(object.positiveIntValue) ? globalThis.String(object.positiveIntValue) : "0", + negativeIntValue: isSet(object.negativeIntValue) ? globalThis.String(object.negativeIntValue) : "0", + doubleValue: isSet(object.doubleValue) ? globalThis.Number(object.doubleValue) : 0, stringValue: isSet(object.stringValue) ? Buffer.from(bytesFromBase64(object.stringValue)) : Buffer.alloc(0), - aggregateValue: isSet(object.aggregateValue) ? String(object.aggregateValue) : "", + aggregateValue: isSet(object.aggregateValue) ? globalThis.String(object.aggregateValue) : "", }; }, toJSON(message) { const obj = {}; - if (message.name) { - obj.name = message.name.map((e) => e ? exports.UninterpretedOption_NamePart.toJSON(e) : undefined); - } - else { - obj.name = []; - } - message.identifierValue !== undefined && (obj.identifierValue = message.identifierValue); - message.positiveIntValue !== undefined && (obj.positiveIntValue = message.positiveIntValue); - message.negativeIntValue !== undefined && (obj.negativeIntValue = message.negativeIntValue); - message.doubleValue !== undefined && (obj.doubleValue = message.doubleValue); - message.stringValue !== undefined && - (obj.stringValue = base64FromBytes(message.stringValue !== undefined ? message.stringValue : Buffer.alloc(0))); - message.aggregateValue !== undefined && (obj.aggregateValue = message.aggregateValue); + if (message.name?.length) { + obj.name = message.name.map((e) => exports.UninterpretedOption_NamePart.toJSON(e)); + } + if (message.identifierValue !== undefined && message.identifierValue !== "") { + obj.identifierValue = message.identifierValue; + } + if (message.positiveIntValue !== undefined && message.positiveIntValue !== "0") { + obj.positiveIntValue = message.positiveIntValue; + } + if (message.negativeIntValue !== undefined && message.negativeIntValue !== "0") { + obj.negativeIntValue = message.negativeIntValue; + } + if (message.doubleValue !== undefined && message.doubleValue !== 0) { + obj.doubleValue = message.doubleValue; + } + if (message.stringValue !== undefined && message.stringValue.length !== 0) { + obj.stringValue = base64FromBytes(message.stringValue); + } + if (message.aggregateValue !== undefined && message.aggregateValue !== "") { + obj.aggregateValue = message.aggregateValue; + } return obj; }, }; -function createBaseUninterpretedOption_NamePart() { - return { namePart: "", isExtension: false }; -} exports.UninterpretedOption_NamePart = { fromJSON(object) { return { - namePart: isSet(object.namePart) ? String(object.namePart) : "", - isExtension: isSet(object.isExtension) ? Boolean(object.isExtension) : false, + namePart: isSet(object.namePart) ? globalThis.String(object.namePart) : "", + isExtension: isSet(object.isExtension) ? globalThis.Boolean(object.isExtension) : false, }; }, toJSON(message) { const obj = {}; - message.namePart !== undefined && (obj.namePart = message.namePart); - message.isExtension !== undefined && (obj.isExtension = message.isExtension); + if (message.namePart !== "") { + obj.namePart = message.namePart; + } + if (message.isExtension !== false) { + obj.isExtension = message.isExtension; + } + return obj; + }, +}; +exports.FeatureSet = { + fromJSON(object) { + return { + fieldPresence: isSet(object.fieldPresence) ? featureSet_FieldPresenceFromJSON(object.fieldPresence) : 0, + enumType: isSet(object.enumType) ? featureSet_EnumTypeFromJSON(object.enumType) : 0, + repeatedFieldEncoding: isSet(object.repeatedFieldEncoding) + ? featureSet_RepeatedFieldEncodingFromJSON(object.repeatedFieldEncoding) + : 0, + utf8Validation: isSet(object.utf8Validation) ? featureSet_Utf8ValidationFromJSON(object.utf8Validation) : 0, + messageEncoding: isSet(object.messageEncoding) ? featureSet_MessageEncodingFromJSON(object.messageEncoding) : 0, + jsonFormat: isSet(object.jsonFormat) ? featureSet_JsonFormatFromJSON(object.jsonFormat) : 0, + enforceNamingStyle: isSet(object.enforceNamingStyle) + ? featureSet_EnforceNamingStyleFromJSON(object.enforceNamingStyle) + : 0, + }; + }, + toJSON(message) { + const obj = {}; + if (message.fieldPresence !== undefined && message.fieldPresence !== 0) { + obj.fieldPresence = featureSet_FieldPresenceToJSON(message.fieldPresence); + } + if (message.enumType !== undefined && message.enumType !== 0) { + obj.enumType = featureSet_EnumTypeToJSON(message.enumType); + } + if (message.repeatedFieldEncoding !== undefined && message.repeatedFieldEncoding !== 0) { + obj.repeatedFieldEncoding = featureSet_RepeatedFieldEncodingToJSON(message.repeatedFieldEncoding); + } + if (message.utf8Validation !== undefined && message.utf8Validation !== 0) { + obj.utf8Validation = featureSet_Utf8ValidationToJSON(message.utf8Validation); + } + if (message.messageEncoding !== undefined && message.messageEncoding !== 0) { + obj.messageEncoding = featureSet_MessageEncodingToJSON(message.messageEncoding); + } + if (message.jsonFormat !== undefined && message.jsonFormat !== 0) { + obj.jsonFormat = featureSet_JsonFormatToJSON(message.jsonFormat); + } + if (message.enforceNamingStyle !== undefined && message.enforceNamingStyle !== 0) { + obj.enforceNamingStyle = featureSet_EnforceNamingStyleToJSON(message.enforceNamingStyle); + } + return obj; + }, +}; +exports.FeatureSetDefaults = { + fromJSON(object) { + return { + defaults: globalThis.Array.isArray(object?.defaults) + ? object.defaults.map((e) => exports.FeatureSetDefaults_FeatureSetEditionDefault.fromJSON(e)) + : [], + minimumEdition: isSet(object.minimumEdition) ? editionFromJSON(object.minimumEdition) : 0, + maximumEdition: isSet(object.maximumEdition) ? editionFromJSON(object.maximumEdition) : 0, + }; + }, + toJSON(message) { + const obj = {}; + if (message.defaults?.length) { + obj.defaults = message.defaults.map((e) => exports.FeatureSetDefaults_FeatureSetEditionDefault.toJSON(e)); + } + if (message.minimumEdition !== undefined && message.minimumEdition !== 0) { + obj.minimumEdition = editionToJSON(message.minimumEdition); + } + if (message.maximumEdition !== undefined && message.maximumEdition !== 0) { + obj.maximumEdition = editionToJSON(message.maximumEdition); + } + return obj; + }, +}; +exports.FeatureSetDefaults_FeatureSetEditionDefault = { + fromJSON(object) { + return { + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, + overridableFeatures: isSet(object.overridableFeatures) + ? exports.FeatureSet.fromJSON(object.overridableFeatures) + : undefined, + fixedFeatures: isSet(object.fixedFeatures) ? exports.FeatureSet.fromJSON(object.fixedFeatures) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); + } + if (message.overridableFeatures !== undefined) { + obj.overridableFeatures = exports.FeatureSet.toJSON(message.overridableFeatures); + } + if (message.fixedFeatures !== undefined) { + obj.fixedFeatures = exports.FeatureSet.toJSON(message.fixedFeatures); + } return obj; }, }; -function createBaseSourceCodeInfo() { - return { location: [] }; -} exports.SourceCodeInfo = { fromJSON(object) { return { - location: Array.isArray(object?.location) + location: globalThis.Array.isArray(object?.location) ? object.location.map((e) => exports.SourceCodeInfo_Location.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.location) { - obj.location = message.location.map((e) => e ? exports.SourceCodeInfo_Location.toJSON(e) : undefined); - } - else { - obj.location = []; + if (message.location?.length) { + obj.location = message.location.map((e) => exports.SourceCodeInfo_Location.toJSON(e)); } return obj; }, }; -function createBaseSourceCodeInfo_Location() { - return { path: [], span: [], leadingComments: "", trailingComments: "", leadingDetachedComments: [] }; -} exports.SourceCodeInfo_Location = { fromJSON(object) { return { - path: Array.isArray(object?.path) ? object.path.map((e) => Number(e)) : [], - span: Array.isArray(object?.span) ? object.span.map((e) => Number(e)) : [], - leadingComments: isSet(object.leadingComments) ? String(object.leadingComments) : "", - trailingComments: isSet(object.trailingComments) ? String(object.trailingComments) : "", - leadingDetachedComments: Array.isArray(object?.leadingDetachedComments) - ? object.leadingDetachedComments.map((e) => String(e)) + path: globalThis.Array.isArray(object?.path) + ? object.path.map((e) => globalThis.Number(e)) + : [], + span: globalThis.Array.isArray(object?.span) ? object.span.map((e) => globalThis.Number(e)) : [], + leadingComments: isSet(object.leadingComments) ? globalThis.String(object.leadingComments) : "", + trailingComments: isSet(object.trailingComments) ? globalThis.String(object.trailingComments) : "", + leadingDetachedComments: globalThis.Array.isArray(object?.leadingDetachedComments) + ? object.leadingDetachedComments.map((e) => globalThis.String(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.path) { + if (message.path?.length) { obj.path = message.path.map((e) => Math.round(e)); } - else { - obj.path = []; - } - if (message.span) { + if (message.span?.length) { obj.span = message.span.map((e) => Math.round(e)); } - else { - obj.span = []; + if (message.leadingComments !== undefined && message.leadingComments !== "") { + obj.leadingComments = message.leadingComments; } - message.leadingComments !== undefined && (obj.leadingComments = message.leadingComments); - message.trailingComments !== undefined && (obj.trailingComments = message.trailingComments); - if (message.leadingDetachedComments) { - obj.leadingDetachedComments = message.leadingDetachedComments.map((e) => e); + if (message.trailingComments !== undefined && message.trailingComments !== "") { + obj.trailingComments = message.trailingComments; } - else { - obj.leadingDetachedComments = []; + if (message.leadingDetachedComments?.length) { + obj.leadingDetachedComments = message.leadingDetachedComments; } return obj; }, }; -function createBaseGeneratedCodeInfo() { - return { annotation: [] }; -} exports.GeneratedCodeInfo = { fromJSON(object) { return { - annotation: Array.isArray(object?.annotation) + annotation: globalThis.Array.isArray(object?.annotation) ? object.annotation.map((e) => exports.GeneratedCodeInfo_Annotation.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.annotation) { - obj.annotation = message.annotation.map((e) => e ? exports.GeneratedCodeInfo_Annotation.toJSON(e) : undefined); - } - else { - obj.annotation = []; + if (message.annotation?.length) { + obj.annotation = message.annotation.map((e) => exports.GeneratedCodeInfo_Annotation.toJSON(e)); } return obj; }, }; -function createBaseGeneratedCodeInfo_Annotation() { - return { path: [], sourceFile: "", begin: 0, end: 0 }; -} exports.GeneratedCodeInfo_Annotation = { fromJSON(object) { return { - path: Array.isArray(object?.path) ? object.path.map((e) => Number(e)) : [], - sourceFile: isSet(object.sourceFile) ? String(object.sourceFile) : "", - begin: isSet(object.begin) ? Number(object.begin) : 0, - end: isSet(object.end) ? Number(object.end) : 0, + path: globalThis.Array.isArray(object?.path) + ? object.path.map((e) => globalThis.Number(e)) + : [], + sourceFile: isSet(object.sourceFile) ? globalThis.String(object.sourceFile) : "", + begin: isSet(object.begin) ? globalThis.Number(object.begin) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + semantic: isSet(object.semantic) ? generatedCodeInfo_Annotation_SemanticFromJSON(object.semantic) : 0, }; }, toJSON(message) { const obj = {}; - if (message.path) { + if (message.path?.length) { obj.path = message.path.map((e) => Math.round(e)); } - else { - obj.path = []; + if (message.sourceFile !== undefined && message.sourceFile !== "") { + obj.sourceFile = message.sourceFile; + } + if (message.begin !== undefined && message.begin !== 0) { + obj.begin = Math.round(message.begin); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + if (message.semantic !== undefined && message.semantic !== 0) { + obj.semantic = generatedCodeInfo_Annotation_SemanticToJSON(message.semantic); } - message.sourceFile !== undefined && (obj.sourceFile = message.sourceFile); - message.begin !== undefined && (obj.begin = Math.round(message.begin)); - message.end !== undefined && (obj.end = Math.round(message.end)); return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function isSet(value) { return value !== null && value !== undefined; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/timestamp.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/timestamp.js index 159135fe87172a..8b75b604c231c8 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/timestamp.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/timestamp.js @@ -1,21 +1,26 @@ "use strict"; -/* eslint-disable */ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: google/protobuf/timestamp.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Timestamp = void 0; -function createBaseTimestamp() { - return { seconds: "0", nanos: 0 }; -} exports.Timestamp = { fromJSON(object) { return { - seconds: isSet(object.seconds) ? String(object.seconds) : "0", - nanos: isSet(object.nanos) ? Number(object.nanos) : 0, + seconds: isSet(object.seconds) ? globalThis.String(object.seconds) : "0", + nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, }; }, toJSON(message) { const obj = {}; - message.seconds !== undefined && (obj.seconds = message.seconds); - message.nanos !== undefined && (obj.nanos = Math.round(message.nanos)); + if (message.seconds !== "0") { + obj.seconds = message.seconds; + } + if (message.nanos !== 0) { + obj.nanos = Math.round(message.nanos); + } return obj; }, }; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/dsse.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/dsse.js new file mode 100644 index 00000000000000..13099ddc3631a1 --- /dev/null +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/dsse.js @@ -0,0 +1,55 @@ +"use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: rekor/v2/dsse.proto +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DSSELogEntryV002 = exports.DSSERequestV002 = void 0; +/* eslint-disable */ +const envelope_1 = require("../../envelope"); +const sigstore_common_1 = require("../../sigstore_common"); +const verifier_1 = require("./verifier"); +exports.DSSERequestV002 = { + fromJSON(object) { + return { + envelope: isSet(object.envelope) ? envelope_1.Envelope.fromJSON(object.envelope) : undefined, + verifiers: globalThis.Array.isArray(object?.verifiers) + ? object.verifiers.map((e) => verifier_1.Verifier.fromJSON(e)) + : [], + }; + }, + toJSON(message) { + const obj = {}; + if (message.envelope !== undefined) { + obj.envelope = envelope_1.Envelope.toJSON(message.envelope); + } + if (message.verifiers?.length) { + obj.verifiers = message.verifiers.map((e) => verifier_1.Verifier.toJSON(e)); + } + return obj; + }, +}; +exports.DSSELogEntryV002 = { + fromJSON(object) { + return { + payloadHash: isSet(object.payloadHash) ? sigstore_common_1.HashOutput.fromJSON(object.payloadHash) : undefined, + signatures: globalThis.Array.isArray(object?.signatures) + ? object.signatures.map((e) => verifier_1.Signature.fromJSON(e)) + : [], + }; + }, + toJSON(message) { + const obj = {}; + if (message.payloadHash !== undefined) { + obj.payloadHash = sigstore_common_1.HashOutput.toJSON(message.payloadHash); + } + if (message.signatures?.length) { + obj.signatures = message.signatures.map((e) => verifier_1.Signature.toJSON(e)); + } + return obj; + }, +}; +function isSet(value) { + return value !== null && value !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/entry.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/entry.js new file mode 100644 index 00000000000000..177fc0cbf3482e --- /dev/null +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/entry.js @@ -0,0 +1,81 @@ +"use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: rekor/v2/entry.proto +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateEntryRequest = exports.Spec = exports.Entry = void 0; +/* eslint-disable */ +const dsse_1 = require("./dsse"); +const hashedrekord_1 = require("./hashedrekord"); +exports.Entry = { + fromJSON(object) { + return { + kind: isSet(object.kind) ? globalThis.String(object.kind) : "", + apiVersion: isSet(object.apiVersion) ? globalThis.String(object.apiVersion) : "", + spec: isSet(object.spec) ? exports.Spec.fromJSON(object.spec) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.kind !== "") { + obj.kind = message.kind; + } + if (message.apiVersion !== "") { + obj.apiVersion = message.apiVersion; + } + if (message.spec !== undefined) { + obj.spec = exports.Spec.toJSON(message.spec); + } + return obj; + }, +}; +exports.Spec = { + fromJSON(object) { + return { + spec: isSet(object.hashedRekordV002) + ? { $case: "hashedRekordV002", hashedRekordV002: hashedrekord_1.HashedRekordLogEntryV002.fromJSON(object.hashedRekordV002) } + : isSet(object.dsseV002) + ? { $case: "dsseV002", dsseV002: dsse_1.DSSELogEntryV002.fromJSON(object.dsseV002) } + : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.spec?.$case === "hashedRekordV002") { + obj.hashedRekordV002 = hashedrekord_1.HashedRekordLogEntryV002.toJSON(message.spec.hashedRekordV002); + } + else if (message.spec?.$case === "dsseV002") { + obj.dsseV002 = dsse_1.DSSELogEntryV002.toJSON(message.spec.dsseV002); + } + return obj; + }, +}; +exports.CreateEntryRequest = { + fromJSON(object) { + return { + spec: isSet(object.hashedRekordRequestV002) + ? { + $case: "hashedRekordRequestV002", + hashedRekordRequestV002: hashedrekord_1.HashedRekordRequestV002.fromJSON(object.hashedRekordRequestV002), + } + : isSet(object.dsseRequestV002) + ? { $case: "dsseRequestV002", dsseRequestV002: dsse_1.DSSERequestV002.fromJSON(object.dsseRequestV002) } + : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.spec?.$case === "hashedRekordRequestV002") { + obj.hashedRekordRequestV002 = hashedrekord_1.HashedRekordRequestV002.toJSON(message.spec.hashedRekordRequestV002); + } + else if (message.spec?.$case === "dsseRequestV002") { + obj.dsseRequestV002 = dsse_1.DSSERequestV002.toJSON(message.spec.dsseRequestV002); + } + return obj; + }, +}; +function isSet(value) { + return value !== null && value !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/hashedrekord.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/hashedrekord.js new file mode 100644 index 00000000000000..ed0d16494e06ff --- /dev/null +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/hashedrekord.js @@ -0,0 +1,56 @@ +"use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: rekor/v2/hashedrekord.proto +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HashedRekordLogEntryV002 = exports.HashedRekordRequestV002 = void 0; +/* eslint-disable */ +const sigstore_common_1 = require("../../sigstore_common"); +const verifier_1 = require("./verifier"); +exports.HashedRekordRequestV002 = { + fromJSON(object) { + return { + digest: isSet(object.digest) ? Buffer.from(bytesFromBase64(object.digest)) : Buffer.alloc(0), + signature: isSet(object.signature) ? verifier_1.Signature.fromJSON(object.signature) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.digest.length !== 0) { + obj.digest = base64FromBytes(message.digest); + } + if (message.signature !== undefined) { + obj.signature = verifier_1.Signature.toJSON(message.signature); + } + return obj; + }, +}; +exports.HashedRekordLogEntryV002 = { + fromJSON(object) { + return { + data: isSet(object.data) ? sigstore_common_1.HashOutput.fromJSON(object.data) : undefined, + signature: isSet(object.signature) ? verifier_1.Signature.fromJSON(object.signature) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.data !== undefined) { + obj.data = sigstore_common_1.HashOutput.toJSON(message.data); + } + if (message.signature !== undefined) { + obj.signature = verifier_1.Signature.toJSON(message.signature); + } + return obj; + }, +}; +function bytesFromBase64(b64) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); +} +function base64FromBytes(arr) { + return globalThis.Buffer.from(arr).toString("base64"); +} +function isSet(value) { + return value !== null && value !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/verifier.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/verifier.js new file mode 100644 index 00000000000000..cc32d84bd7fae2 --- /dev/null +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/verifier.js @@ -0,0 +1,74 @@ +"use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: rekor/v2/verifier.proto +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Signature = exports.Verifier = exports.PublicKey = void 0; +/* eslint-disable */ +const sigstore_common_1 = require("../../sigstore_common"); +exports.PublicKey = { + fromJSON(object) { + return { rawBytes: isSet(object.rawBytes) ? Buffer.from(bytesFromBase64(object.rawBytes)) : Buffer.alloc(0) }; + }, + toJSON(message) { + const obj = {}; + if (message.rawBytes.length !== 0) { + obj.rawBytes = base64FromBytes(message.rawBytes); + } + return obj; + }, +}; +exports.Verifier = { + fromJSON(object) { + return { + verifier: isSet(object.publicKey) + ? { $case: "publicKey", publicKey: exports.PublicKey.fromJSON(object.publicKey) } + : isSet(object.x509Certificate) + ? { $case: "x509Certificate", x509Certificate: sigstore_common_1.X509Certificate.fromJSON(object.x509Certificate) } + : undefined, + keyDetails: isSet(object.keyDetails) ? (0, sigstore_common_1.publicKeyDetailsFromJSON)(object.keyDetails) : 0, + }; + }, + toJSON(message) { + const obj = {}; + if (message.verifier?.$case === "publicKey") { + obj.publicKey = exports.PublicKey.toJSON(message.verifier.publicKey); + } + else if (message.verifier?.$case === "x509Certificate") { + obj.x509Certificate = sigstore_common_1.X509Certificate.toJSON(message.verifier.x509Certificate); + } + if (message.keyDetails !== 0) { + obj.keyDetails = (0, sigstore_common_1.publicKeyDetailsToJSON)(message.keyDetails); + } + return obj; + }, +}; +exports.Signature = { + fromJSON(object) { + return { + content: isSet(object.content) ? Buffer.from(bytesFromBase64(object.content)) : Buffer.alloc(0), + verifier: isSet(object.verifier) ? exports.Verifier.fromJSON(object.verifier) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.content.length !== 0) { + obj.content = base64FromBytes(message.content); + } + if (message.verifier !== undefined) { + obj.verifier = exports.Verifier.toJSON(message.verifier); + } + return obj; + }, +}; +function bytesFromBase64(b64) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); +} +function base64FromBytes(arr) { + return globalThis.Buffer.from(arr).toString("base64"); +} +function isSet(value) { + return value !== null && value !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_bundle.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_bundle.js index 3773867f5426a3..0f0a27b662eba5 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_bundle.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_bundle.js @@ -1,35 +1,31 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: sigstore_bundle.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Bundle = exports.VerificationMaterial = exports.TimestampVerificationData = void 0; /* eslint-disable */ const envelope_1 = require("./envelope"); const sigstore_common_1 = require("./sigstore_common"); const sigstore_rekor_1 = require("./sigstore_rekor"); -function createBaseTimestampVerificationData() { - return { rfc3161Timestamps: [] }; -} exports.TimestampVerificationData = { fromJSON(object) { return { - rfc3161Timestamps: Array.isArray(object?.rfc3161Timestamps) + rfc3161Timestamps: globalThis.Array.isArray(object?.rfc3161Timestamps) ? object.rfc3161Timestamps.map((e) => sigstore_common_1.RFC3161SignedTimestamp.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.rfc3161Timestamps) { - obj.rfc3161Timestamps = message.rfc3161Timestamps.map((e) => e ? sigstore_common_1.RFC3161SignedTimestamp.toJSON(e) : undefined); - } - else { - obj.rfc3161Timestamps = []; + if (message.rfc3161Timestamps?.length) { + obj.rfc3161Timestamps = message.rfc3161Timestamps.map((e) => sigstore_common_1.RFC3161SignedTimestamp.toJSON(e)); } return obj; }, }; -function createBaseVerificationMaterial() { - return { content: undefined, tlogEntries: [], timestampVerificationData: undefined }; -} exports.VerificationMaterial = { fromJSON(object) { return { @@ -43,7 +39,7 @@ exports.VerificationMaterial = { : isSet(object.certificate) ? { $case: "certificate", certificate: sigstore_common_1.X509Certificate.fromJSON(object.certificate) } : undefined, - tlogEntries: Array.isArray(object?.tlogEntries) + tlogEntries: globalThis.Array.isArray(object?.tlogEntries) ? object.tlogEntries.map((e) => sigstore_rekor_1.TransparencyLogEntry.fromJSON(e)) : [], timestampVerificationData: isSet(object.timestampVerificationData) @@ -53,36 +49,28 @@ exports.VerificationMaterial = { }, toJSON(message) { const obj = {}; - message.content?.$case === "publicKey" && - (obj.publicKey = message.content?.publicKey ? sigstore_common_1.PublicKeyIdentifier.toJSON(message.content?.publicKey) : undefined); - message.content?.$case === "x509CertificateChain" && - (obj.x509CertificateChain = message.content?.x509CertificateChain - ? sigstore_common_1.X509CertificateChain.toJSON(message.content?.x509CertificateChain) - : undefined); - message.content?.$case === "certificate" && - (obj.certificate = message.content?.certificate - ? sigstore_common_1.X509Certificate.toJSON(message.content?.certificate) - : undefined); - if (message.tlogEntries) { - obj.tlogEntries = message.tlogEntries.map((e) => e ? sigstore_rekor_1.TransparencyLogEntry.toJSON(e) : undefined); + if (message.content?.$case === "publicKey") { + obj.publicKey = sigstore_common_1.PublicKeyIdentifier.toJSON(message.content.publicKey); + } + else if (message.content?.$case === "x509CertificateChain") { + obj.x509CertificateChain = sigstore_common_1.X509CertificateChain.toJSON(message.content.x509CertificateChain); + } + else if (message.content?.$case === "certificate") { + obj.certificate = sigstore_common_1.X509Certificate.toJSON(message.content.certificate); + } + if (message.tlogEntries?.length) { + obj.tlogEntries = message.tlogEntries.map((e) => sigstore_rekor_1.TransparencyLogEntry.toJSON(e)); } - else { - obj.tlogEntries = []; + if (message.timestampVerificationData !== undefined) { + obj.timestampVerificationData = exports.TimestampVerificationData.toJSON(message.timestampVerificationData); } - message.timestampVerificationData !== undefined && - (obj.timestampVerificationData = message.timestampVerificationData - ? exports.TimestampVerificationData.toJSON(message.timestampVerificationData) - : undefined); return obj; }, }; -function createBaseBundle() { - return { mediaType: "", verificationMaterial: undefined, content: undefined }; -} exports.Bundle = { fromJSON(object) { return { - mediaType: isSet(object.mediaType) ? String(object.mediaType) : "", + mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", verificationMaterial: isSet(object.verificationMaterial) ? exports.VerificationMaterial.fromJSON(object.verificationMaterial) : undefined, @@ -95,15 +83,18 @@ exports.Bundle = { }, toJSON(message) { const obj = {}; - message.mediaType !== undefined && (obj.mediaType = message.mediaType); - message.verificationMaterial !== undefined && (obj.verificationMaterial = message.verificationMaterial - ? exports.VerificationMaterial.toJSON(message.verificationMaterial) - : undefined); - message.content?.$case === "messageSignature" && (obj.messageSignature = message.content?.messageSignature - ? sigstore_common_1.MessageSignature.toJSON(message.content?.messageSignature) - : undefined); - message.content?.$case === "dsseEnvelope" && - (obj.dsseEnvelope = message.content?.dsseEnvelope ? envelope_1.Envelope.toJSON(message.content?.dsseEnvelope) : undefined); + if (message.mediaType !== "") { + obj.mediaType = message.mediaType; + } + if (message.verificationMaterial !== undefined) { + obj.verificationMaterial = exports.VerificationMaterial.toJSON(message.verificationMaterial); + } + if (message.content?.$case === "messageSignature") { + obj.messageSignature = sigstore_common_1.MessageSignature.toJSON(message.content.messageSignature); + } + else if (message.content?.$case === "dsseEnvelope") { + obj.dsseEnvelope = envelope_1.Envelope.toJSON(message.content.dsseEnvelope); + } return obj; }, }; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_common.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_common.js index c6f9baa91fff21..fd62147feaef79 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_common.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_common.js @@ -1,6 +1,17 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: sigstore_common.proto Object.defineProperty(exports, "__esModule", { value: true }); -exports.TimeRange = exports.X509CertificateChain = exports.SubjectAlternativeName = exports.X509Certificate = exports.DistinguishedName = exports.ObjectIdentifierValuePair = exports.ObjectIdentifier = exports.PublicKeyIdentifier = exports.PublicKey = exports.RFC3161SignedTimestamp = exports.LogId = exports.MessageSignature = exports.HashOutput = exports.subjectAlternativeNameTypeToJSON = exports.subjectAlternativeNameTypeFromJSON = exports.SubjectAlternativeNameType = exports.publicKeyDetailsToJSON = exports.publicKeyDetailsFromJSON = exports.PublicKeyDetails = exports.hashAlgorithmToJSON = exports.hashAlgorithmFromJSON = exports.HashAlgorithm = void 0; +exports.TimeRange = exports.X509CertificateChain = exports.SubjectAlternativeName = exports.X509Certificate = exports.DistinguishedName = exports.ObjectIdentifierValuePair = exports.ObjectIdentifier = exports.PublicKeyIdentifier = exports.PublicKey = exports.RFC3161SignedTimestamp = exports.LogId = exports.MessageSignature = exports.HashOutput = exports.SubjectAlternativeNameType = exports.PublicKeyDetails = exports.HashAlgorithm = void 0; +exports.hashAlgorithmFromJSON = hashAlgorithmFromJSON; +exports.hashAlgorithmToJSON = hashAlgorithmToJSON; +exports.publicKeyDetailsFromJSON = publicKeyDetailsFromJSON; +exports.publicKeyDetailsToJSON = publicKeyDetailsToJSON; +exports.subjectAlternativeNameTypeFromJSON = subjectAlternativeNameTypeFromJSON; +exports.subjectAlternativeNameTypeToJSON = subjectAlternativeNameTypeToJSON; /* eslint-disable */ const timestamp_1 = require("./google/protobuf/timestamp"); /** @@ -20,7 +31,7 @@ var HashAlgorithm; HashAlgorithm[HashAlgorithm["SHA2_512"] = 3] = "SHA2_512"; HashAlgorithm[HashAlgorithm["SHA3_256"] = 4] = "SHA3_256"; HashAlgorithm[HashAlgorithm["SHA3_384"] = 5] = "SHA3_384"; -})(HashAlgorithm = exports.HashAlgorithm || (exports.HashAlgorithm = {})); +})(HashAlgorithm || (exports.HashAlgorithm = HashAlgorithm = {})); function hashAlgorithmFromJSON(object) { switch (object) { case 0: @@ -42,10 +53,9 @@ function hashAlgorithmFromJSON(object) { case "SHA3_384": return HashAlgorithm.SHA3_384; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum HashAlgorithm"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum HashAlgorithm"); } } -exports.hashAlgorithmFromJSON = hashAlgorithmFromJSON; function hashAlgorithmToJSON(object) { switch (object) { case HashAlgorithm.HASH_ALGORITHM_UNSPECIFIED: @@ -61,10 +71,9 @@ function hashAlgorithmToJSON(object) { case HashAlgorithm.SHA3_384: return "SHA3_384"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum HashAlgorithm"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum HashAlgorithm"); } } -exports.hashAlgorithmToJSON = hashAlgorithmToJSON; /** * Details of a specific public key, capturing the the key encoding method, * and signature algorithm. @@ -76,7 +85,8 @@ exports.hashAlgorithmToJSON = hashAlgorithmToJSON; * opinionated options instead of allowing every possible permutation. * * Any changes to this enum MUST be reflected in the algorithm registry. - * See: docs/algorithm-registry.md + * + * See: * * To avoid the possibility of contradicting formats such as PKCS1 with * ED25519 the valid permutations are listed as a linear set instead of a @@ -123,11 +133,21 @@ var PublicKeyDetails; /** PKIX_ED25519 - Ed 25519 */ PublicKeyDetails[PublicKeyDetails["PKIX_ED25519"] = 7] = "PKIX_ED25519"; PublicKeyDetails[PublicKeyDetails["PKIX_ED25519_PH"] = 8] = "PKIX_ED25519_PH"; + /** + * PKIX_ECDSA_P384_SHA_256 - These algorithms are deprecated and should not be used, but they + * were/are being used by most Sigstore clients implementations. + * + * @deprecated + */ + PublicKeyDetails[PublicKeyDetails["PKIX_ECDSA_P384_SHA_256"] = 19] = "PKIX_ECDSA_P384_SHA_256"; + /** @deprecated */ + PublicKeyDetails[PublicKeyDetails["PKIX_ECDSA_P521_SHA_256"] = 20] = "PKIX_ECDSA_P521_SHA_256"; /** * LMS_SHA256 - LMS and LM-OTS * - * These keys and signatures may be used by private Sigstore - * deployments, but are not currently supported by the public + * These algorithms are deprecated and should not be used. + * Keys and signatures MAY be used by private Sigstore + * deployments, but will not be supported by the public * good instance. * * USER WARNING: LMS and LM-OTS are both stateful signature schemes. @@ -137,10 +157,30 @@ var PublicKeyDetails; * MUST NOT be used for more than one signature per LM-OTS key. * If you cannot maintain these invariants, you MUST NOT use these * schemes. + * + * @deprecated */ PublicKeyDetails[PublicKeyDetails["LMS_SHA256"] = 14] = "LMS_SHA256"; + /** @deprecated */ PublicKeyDetails[PublicKeyDetails["LMOTS_SHA256"] = 15] = "LMOTS_SHA256"; -})(PublicKeyDetails = exports.PublicKeyDetails || (exports.PublicKeyDetails = {})); + /** + * ML_DSA_65 - ML-DSA + * + * These ML_DSA_65 and ML-DSA_87 algorithms are the pure variants that + * take data to sign rather than the prehash variants (HashML-DSA), which + * take digests. While considered quantum-resistant, their usage + * involves tradeoffs in that signatures and keys are much larger, and + * this makes deployments more costly. + * + * USER WARNING: ML_DSA_65 and ML_DSA_87 are experimental algorithms. + * In the future they MAY be used by private Sigstore deployments, but + * they are not yet fully functional. This warning will be removed when + * these algorithms are widely supported by Sigstore clients and servers, + * but care should still be taken for production environments. + */ + PublicKeyDetails[PublicKeyDetails["ML_DSA_65"] = 21] = "ML_DSA_65"; + PublicKeyDetails[PublicKeyDetails["ML_DSA_87"] = 22] = "ML_DSA_87"; +})(PublicKeyDetails || (exports.PublicKeyDetails = PublicKeyDetails = {})); function publicKeyDetailsFromJSON(object) { switch (object) { case 0: @@ -194,17 +234,28 @@ function publicKeyDetailsFromJSON(object) { case 8: case "PKIX_ED25519_PH": return PublicKeyDetails.PKIX_ED25519_PH; + case 19: + case "PKIX_ECDSA_P384_SHA_256": + return PublicKeyDetails.PKIX_ECDSA_P384_SHA_256; + case 20: + case "PKIX_ECDSA_P521_SHA_256": + return PublicKeyDetails.PKIX_ECDSA_P521_SHA_256; case 14: case "LMS_SHA256": return PublicKeyDetails.LMS_SHA256; case 15: case "LMOTS_SHA256": return PublicKeyDetails.LMOTS_SHA256; + case 21: + case "ML_DSA_65": + return PublicKeyDetails.ML_DSA_65; + case 22: + case "ML_DSA_87": + return PublicKeyDetails.ML_DSA_87; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum PublicKeyDetails"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum PublicKeyDetails"); } } -exports.publicKeyDetailsFromJSON = publicKeyDetailsFromJSON; function publicKeyDetailsToJSON(object) { switch (object) { case PublicKeyDetails.PUBLIC_KEY_DETAILS_UNSPECIFIED: @@ -241,15 +292,22 @@ function publicKeyDetailsToJSON(object) { return "PKIX_ED25519"; case PublicKeyDetails.PKIX_ED25519_PH: return "PKIX_ED25519_PH"; + case PublicKeyDetails.PKIX_ECDSA_P384_SHA_256: + return "PKIX_ECDSA_P384_SHA_256"; + case PublicKeyDetails.PKIX_ECDSA_P521_SHA_256: + return "PKIX_ECDSA_P521_SHA_256"; case PublicKeyDetails.LMS_SHA256: return "LMS_SHA256"; case PublicKeyDetails.LMOTS_SHA256: return "LMOTS_SHA256"; + case PublicKeyDetails.ML_DSA_65: + return "ML_DSA_65"; + case PublicKeyDetails.ML_DSA_87: + return "ML_DSA_87"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum PublicKeyDetails"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum PublicKeyDetails"); } } -exports.publicKeyDetailsToJSON = publicKeyDetailsToJSON; var SubjectAlternativeNameType; (function (SubjectAlternativeNameType) { SubjectAlternativeNameType[SubjectAlternativeNameType["SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED"] = 0] = "SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED"; @@ -261,7 +319,7 @@ var SubjectAlternativeNameType; * for more details. */ SubjectAlternativeNameType[SubjectAlternativeNameType["OTHER_NAME"] = 3] = "OTHER_NAME"; -})(SubjectAlternativeNameType = exports.SubjectAlternativeNameType || (exports.SubjectAlternativeNameType = {})); +})(SubjectAlternativeNameType || (exports.SubjectAlternativeNameType = SubjectAlternativeNameType = {})); function subjectAlternativeNameTypeFromJSON(object) { switch (object) { case 0: @@ -277,10 +335,9 @@ function subjectAlternativeNameTypeFromJSON(object) { case "OTHER_NAME": return SubjectAlternativeNameType.OTHER_NAME; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum SubjectAlternativeNameType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum SubjectAlternativeNameType"); } } -exports.subjectAlternativeNameTypeFromJSON = subjectAlternativeNameTypeFromJSON; function subjectAlternativeNameTypeToJSON(object) { switch (object) { case SubjectAlternativeNameType.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED: @@ -292,13 +349,9 @@ function subjectAlternativeNameTypeToJSON(object) { case SubjectAlternativeNameType.OTHER_NAME: return "OTHER_NAME"; default: - throw new tsProtoGlobalThis.Error("Unrecognized enum value " + object + " for enum SubjectAlternativeNameType"); + throw new globalThis.Error("Unrecognized enum value " + object + " for enum SubjectAlternativeNameType"); } } -exports.subjectAlternativeNameTypeToJSON = subjectAlternativeNameTypeToJSON; -function createBaseHashOutput() { - return { algorithm: 0, digest: Buffer.alloc(0) }; -} exports.HashOutput = { fromJSON(object) { return { @@ -308,15 +361,15 @@ exports.HashOutput = { }, toJSON(message) { const obj = {}; - message.algorithm !== undefined && (obj.algorithm = hashAlgorithmToJSON(message.algorithm)); - message.digest !== undefined && - (obj.digest = base64FromBytes(message.digest !== undefined ? message.digest : Buffer.alloc(0))); + if (message.algorithm !== 0) { + obj.algorithm = hashAlgorithmToJSON(message.algorithm); + } + if (message.digest.length !== 0) { + obj.digest = base64FromBytes(message.digest); + } return obj; }, }; -function createBaseMessageSignature() { - return { messageDigest: undefined, signature: Buffer.alloc(0) }; -} exports.MessageSignature = { fromJSON(object) { return { @@ -326,30 +379,27 @@ exports.MessageSignature = { }, toJSON(message) { const obj = {}; - message.messageDigest !== undefined && - (obj.messageDigest = message.messageDigest ? exports.HashOutput.toJSON(message.messageDigest) : undefined); - message.signature !== undefined && - (obj.signature = base64FromBytes(message.signature !== undefined ? message.signature : Buffer.alloc(0))); + if (message.messageDigest !== undefined) { + obj.messageDigest = exports.HashOutput.toJSON(message.messageDigest); + } + if (message.signature.length !== 0) { + obj.signature = base64FromBytes(message.signature); + } return obj; }, }; -function createBaseLogId() { - return { keyId: Buffer.alloc(0) }; -} exports.LogId = { fromJSON(object) { return { keyId: isSet(object.keyId) ? Buffer.from(bytesFromBase64(object.keyId)) : Buffer.alloc(0) }; }, toJSON(message) { const obj = {}; - message.keyId !== undefined && - (obj.keyId = base64FromBytes(message.keyId !== undefined ? message.keyId : Buffer.alloc(0))); + if (message.keyId.length !== 0) { + obj.keyId = base64FromBytes(message.keyId); + } return obj; }, }; -function createBaseRFC3161SignedTimestamp() { - return { signedTimestamp: Buffer.alloc(0) }; -} exports.RFC3161SignedTimestamp = { fromJSON(object) { return { @@ -360,14 +410,12 @@ exports.RFC3161SignedTimestamp = { }, toJSON(message) { const obj = {}; - message.signedTimestamp !== undefined && - (obj.signedTimestamp = base64FromBytes(message.signedTimestamp !== undefined ? message.signedTimestamp : Buffer.alloc(0))); + if (message.signedTimestamp.length !== 0) { + obj.signedTimestamp = base64FromBytes(message.signedTimestamp); + } return obj; }, }; -function createBasePublicKey() { - return { rawBytes: undefined, keyDetails: 0, validFor: undefined }; -} exports.PublicKey = { fromJSON(object) { return { @@ -378,48 +426,42 @@ exports.PublicKey = { }, toJSON(message) { const obj = {}; - message.rawBytes !== undefined && - (obj.rawBytes = message.rawBytes !== undefined ? base64FromBytes(message.rawBytes) : undefined); - message.keyDetails !== undefined && (obj.keyDetails = publicKeyDetailsToJSON(message.keyDetails)); - message.validFor !== undefined && - (obj.validFor = message.validFor ? exports.TimeRange.toJSON(message.validFor) : undefined); + if (message.rawBytes !== undefined) { + obj.rawBytes = base64FromBytes(message.rawBytes); + } + if (message.keyDetails !== 0) { + obj.keyDetails = publicKeyDetailsToJSON(message.keyDetails); + } + if (message.validFor !== undefined) { + obj.validFor = exports.TimeRange.toJSON(message.validFor); + } return obj; }, }; -function createBasePublicKeyIdentifier() { - return { hint: "" }; -} exports.PublicKeyIdentifier = { fromJSON(object) { - return { hint: isSet(object.hint) ? String(object.hint) : "" }; + return { hint: isSet(object.hint) ? globalThis.String(object.hint) : "" }; }, toJSON(message) { const obj = {}; - message.hint !== undefined && (obj.hint = message.hint); + if (message.hint !== "") { + obj.hint = message.hint; + } return obj; }, }; -function createBaseObjectIdentifier() { - return { id: [] }; -} exports.ObjectIdentifier = { fromJSON(object) { - return { id: Array.isArray(object?.id) ? object.id.map((e) => Number(e)) : [] }; + return { id: globalThis.Array.isArray(object?.id) ? object.id.map((e) => globalThis.Number(e)) : [] }; }, toJSON(message) { const obj = {}; - if (message.id) { + if (message.id?.length) { obj.id = message.id.map((e) => Math.round(e)); } - else { - obj.id = []; - } return obj; }, }; -function createBaseObjectIdentifierValuePair() { - return { oid: undefined, value: Buffer.alloc(0) }; -} exports.ObjectIdentifierValuePair = { fromJSON(object) { return { @@ -429,90 +471,86 @@ exports.ObjectIdentifierValuePair = { }, toJSON(message) { const obj = {}; - message.oid !== undefined && (obj.oid = message.oid ? exports.ObjectIdentifier.toJSON(message.oid) : undefined); - message.value !== undefined && - (obj.value = base64FromBytes(message.value !== undefined ? message.value : Buffer.alloc(0))); + if (message.oid !== undefined) { + obj.oid = exports.ObjectIdentifier.toJSON(message.oid); + } + if (message.value.length !== 0) { + obj.value = base64FromBytes(message.value); + } return obj; }, }; -function createBaseDistinguishedName() { - return { organization: "", commonName: "" }; -} exports.DistinguishedName = { fromJSON(object) { return { - organization: isSet(object.organization) ? String(object.organization) : "", - commonName: isSet(object.commonName) ? String(object.commonName) : "", + organization: isSet(object.organization) ? globalThis.String(object.organization) : "", + commonName: isSet(object.commonName) ? globalThis.String(object.commonName) : "", }; }, toJSON(message) { const obj = {}; - message.organization !== undefined && (obj.organization = message.organization); - message.commonName !== undefined && (obj.commonName = message.commonName); + if (message.organization !== "") { + obj.organization = message.organization; + } + if (message.commonName !== "") { + obj.commonName = message.commonName; + } return obj; }, }; -function createBaseX509Certificate() { - return { rawBytes: Buffer.alloc(0) }; -} exports.X509Certificate = { fromJSON(object) { return { rawBytes: isSet(object.rawBytes) ? Buffer.from(bytesFromBase64(object.rawBytes)) : Buffer.alloc(0) }; }, toJSON(message) { const obj = {}; - message.rawBytes !== undefined && - (obj.rawBytes = base64FromBytes(message.rawBytes !== undefined ? message.rawBytes : Buffer.alloc(0))); + if (message.rawBytes.length !== 0) { + obj.rawBytes = base64FromBytes(message.rawBytes); + } return obj; }, }; -function createBaseSubjectAlternativeName() { - return { type: 0, identity: undefined }; -} exports.SubjectAlternativeName = { fromJSON(object) { return { type: isSet(object.type) ? subjectAlternativeNameTypeFromJSON(object.type) : 0, identity: isSet(object.regexp) - ? { $case: "regexp", regexp: String(object.regexp) } + ? { $case: "regexp", regexp: globalThis.String(object.regexp) } : isSet(object.value) - ? { $case: "value", value: String(object.value) } + ? { $case: "value", value: globalThis.String(object.value) } : undefined, }; }, toJSON(message) { const obj = {}; - message.type !== undefined && (obj.type = subjectAlternativeNameTypeToJSON(message.type)); - message.identity?.$case === "regexp" && (obj.regexp = message.identity?.regexp); - message.identity?.$case === "value" && (obj.value = message.identity?.value); + if (message.type !== 0) { + obj.type = subjectAlternativeNameTypeToJSON(message.type); + } + if (message.identity?.$case === "regexp") { + obj.regexp = message.identity.regexp; + } + else if (message.identity?.$case === "value") { + obj.value = message.identity.value; + } return obj; }, }; -function createBaseX509CertificateChain() { - return { certificates: [] }; -} exports.X509CertificateChain = { fromJSON(object) { return { - certificates: Array.isArray(object?.certificates) + certificates: globalThis.Array.isArray(object?.certificates) ? object.certificates.map((e) => exports.X509Certificate.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.certificates) { - obj.certificates = message.certificates.map((e) => e ? exports.X509Certificate.toJSON(e) : undefined); - } - else { - obj.certificates = []; + if (message.certificates?.length) { + obj.certificates = message.certificates.map((e) => exports.X509Certificate.toJSON(e)); } return obj; }, }; -function createBaseTimeRange() { - return { start: undefined, end: undefined }; -} exports.TimeRange = { fromJSON(object) { return { @@ -522,62 +560,32 @@ exports.TimeRange = { }, toJSON(message) { const obj = {}; - message.start !== undefined && (obj.start = message.start.toISOString()); - message.end !== undefined && (obj.end = message.end.toISOString()); + if (message.start !== undefined) { + obj.start = message.start.toISOString(); + } + if (message.end !== undefined) { + obj.end = message.end.toISOString(); + } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function fromTimestamp(t) { - let millis = Number(t.seconds) * 1000; - millis += t.nanos / 1000000; - return new Date(millis); + let millis = (globalThis.Number(t.seconds) || 0) * 1_000; + millis += (t.nanos || 0) / 1_000_000; + return new globalThis.Date(millis); } function fromJsonTimestamp(o) { - if (o instanceof Date) { + if (o instanceof globalThis.Date) { return o; } else if (typeof o === "string") { - return new Date(o); + return new globalThis.Date(o); } else { return fromTimestamp(timestamp_1.Timestamp.fromJSON(o)); diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_rekor.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_rekor.js index 398193b2075a70..9f9b3d0d1b4611 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_rekor.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_rekor.js @@ -1,71 +1,75 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: sigstore_rekor.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.TransparencyLogEntry = exports.InclusionPromise = exports.InclusionProof = exports.Checkpoint = exports.KindVersion = void 0; /* eslint-disable */ const sigstore_common_1 = require("./sigstore_common"); -function createBaseKindVersion() { - return { kind: "", version: "" }; -} exports.KindVersion = { fromJSON(object) { return { - kind: isSet(object.kind) ? String(object.kind) : "", - version: isSet(object.version) ? String(object.version) : "", + kind: isSet(object.kind) ? globalThis.String(object.kind) : "", + version: isSet(object.version) ? globalThis.String(object.version) : "", }; }, toJSON(message) { const obj = {}; - message.kind !== undefined && (obj.kind = message.kind); - message.version !== undefined && (obj.version = message.version); + if (message.kind !== "") { + obj.kind = message.kind; + } + if (message.version !== "") { + obj.version = message.version; + } return obj; }, }; -function createBaseCheckpoint() { - return { envelope: "" }; -} exports.Checkpoint = { fromJSON(object) { - return { envelope: isSet(object.envelope) ? String(object.envelope) : "" }; + return { envelope: isSet(object.envelope) ? globalThis.String(object.envelope) : "" }; }, toJSON(message) { const obj = {}; - message.envelope !== undefined && (obj.envelope = message.envelope); + if (message.envelope !== "") { + obj.envelope = message.envelope; + } return obj; }, }; -function createBaseInclusionProof() { - return { logIndex: "0", rootHash: Buffer.alloc(0), treeSize: "0", hashes: [], checkpoint: undefined }; -} exports.InclusionProof = { fromJSON(object) { return { - logIndex: isSet(object.logIndex) ? String(object.logIndex) : "0", + logIndex: isSet(object.logIndex) ? globalThis.String(object.logIndex) : "0", rootHash: isSet(object.rootHash) ? Buffer.from(bytesFromBase64(object.rootHash)) : Buffer.alloc(0), - treeSize: isSet(object.treeSize) ? String(object.treeSize) : "0", - hashes: Array.isArray(object?.hashes) ? object.hashes.map((e) => Buffer.from(bytesFromBase64(e))) : [], + treeSize: isSet(object.treeSize) ? globalThis.String(object.treeSize) : "0", + hashes: globalThis.Array.isArray(object?.hashes) + ? object.hashes.map((e) => Buffer.from(bytesFromBase64(e))) + : [], checkpoint: isSet(object.checkpoint) ? exports.Checkpoint.fromJSON(object.checkpoint) : undefined, }; }, toJSON(message) { const obj = {}; - message.logIndex !== undefined && (obj.logIndex = message.logIndex); - message.rootHash !== undefined && - (obj.rootHash = base64FromBytes(message.rootHash !== undefined ? message.rootHash : Buffer.alloc(0))); - message.treeSize !== undefined && (obj.treeSize = message.treeSize); - if (message.hashes) { - obj.hashes = message.hashes.map((e) => base64FromBytes(e !== undefined ? e : Buffer.alloc(0))); - } - else { - obj.hashes = []; - } - message.checkpoint !== undefined && - (obj.checkpoint = message.checkpoint ? exports.Checkpoint.toJSON(message.checkpoint) : undefined); + if (message.logIndex !== "0") { + obj.logIndex = message.logIndex; + } + if (message.rootHash.length !== 0) { + obj.rootHash = base64FromBytes(message.rootHash); + } + if (message.treeSize !== "0") { + obj.treeSize = message.treeSize; + } + if (message.hashes?.length) { + obj.hashes = message.hashes.map((e) => base64FromBytes(e)); + } + if (message.checkpoint !== undefined) { + obj.checkpoint = exports.Checkpoint.toJSON(message.checkpoint); + } return obj; }, }; -function createBaseInclusionPromise() { - return { signedEntryTimestamp: Buffer.alloc(0) }; -} exports.InclusionPromise = { fromJSON(object) { return { @@ -76,29 +80,19 @@ exports.InclusionPromise = { }, toJSON(message) { const obj = {}; - message.signedEntryTimestamp !== undefined && - (obj.signedEntryTimestamp = base64FromBytes(message.signedEntryTimestamp !== undefined ? message.signedEntryTimestamp : Buffer.alloc(0))); + if (message.signedEntryTimestamp.length !== 0) { + obj.signedEntryTimestamp = base64FromBytes(message.signedEntryTimestamp); + } return obj; }, }; -function createBaseTransparencyLogEntry() { - return { - logIndex: "0", - logId: undefined, - kindVersion: undefined, - integratedTime: "0", - inclusionPromise: undefined, - inclusionProof: undefined, - canonicalizedBody: Buffer.alloc(0), - }; -} exports.TransparencyLogEntry = { fromJSON(object) { return { - logIndex: isSet(object.logIndex) ? String(object.logIndex) : "0", + logIndex: isSet(object.logIndex) ? globalThis.String(object.logIndex) : "0", logId: isSet(object.logId) ? sigstore_common_1.LogId.fromJSON(object.logId) : undefined, kindVersion: isSet(object.kindVersion) ? exports.KindVersion.fromJSON(object.kindVersion) : undefined, - integratedTime: isSet(object.integratedTime) ? String(object.integratedTime) : "0", + integratedTime: isSet(object.integratedTime) ? globalThis.String(object.integratedTime) : "0", inclusionPromise: isSet(object.inclusionPromise) ? exports.InclusionPromise.fromJSON(object.inclusionPromise) : undefined, inclusionProof: isSet(object.inclusionProof) ? exports.InclusionProof.fromJSON(object.inclusionProof) : undefined, canonicalizedBody: isSet(object.canonicalizedBody) @@ -108,59 +102,35 @@ exports.TransparencyLogEntry = { }, toJSON(message) { const obj = {}; - message.logIndex !== undefined && (obj.logIndex = message.logIndex); - message.logId !== undefined && (obj.logId = message.logId ? sigstore_common_1.LogId.toJSON(message.logId) : undefined); - message.kindVersion !== undefined && - (obj.kindVersion = message.kindVersion ? exports.KindVersion.toJSON(message.kindVersion) : undefined); - message.integratedTime !== undefined && (obj.integratedTime = message.integratedTime); - message.inclusionPromise !== undefined && - (obj.inclusionPromise = message.inclusionPromise ? exports.InclusionPromise.toJSON(message.inclusionPromise) : undefined); - message.inclusionProof !== undefined && - (obj.inclusionProof = message.inclusionProof ? exports.InclusionProof.toJSON(message.inclusionProof) : undefined); - message.canonicalizedBody !== undefined && - (obj.canonicalizedBody = base64FromBytes(message.canonicalizedBody !== undefined ? message.canonicalizedBody : Buffer.alloc(0))); + if (message.logIndex !== "0") { + obj.logIndex = message.logIndex; + } + if (message.logId !== undefined) { + obj.logId = sigstore_common_1.LogId.toJSON(message.logId); + } + if (message.kindVersion !== undefined) { + obj.kindVersion = exports.KindVersion.toJSON(message.kindVersion); + } + if (message.integratedTime !== "0") { + obj.integratedTime = message.integratedTime; + } + if (message.inclusionPromise !== undefined) { + obj.inclusionPromise = exports.InclusionPromise.toJSON(message.inclusionPromise); + } + if (message.inclusionProof !== undefined) { + obj.inclusionProof = exports.InclusionProof.toJSON(message.inclusionProof); + } + if (message.canonicalizedBody.length !== 0) { + obj.canonicalizedBody = base64FromBytes(message.canonicalizedBody); + } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function isSet(value) { return value !== null && value !== undefined; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_trustroot.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_trustroot.js index 05e566767cdb24..d5f4e4ef3cddcd 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_trustroot.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_trustroot.js @@ -1,99 +1,280 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: sigstore_trustroot.proto Object.defineProperty(exports, "__esModule", { value: true }); -exports.TrustedRoot = exports.CertificateAuthority = exports.TransparencyLogInstance = void 0; +exports.ClientTrustConfig = exports.ServiceConfiguration = exports.Service = exports.SigningConfig = exports.TrustedRoot = exports.CertificateAuthority = exports.TransparencyLogInstance = exports.ServiceSelector = void 0; +exports.serviceSelectorFromJSON = serviceSelectorFromJSON; +exports.serviceSelectorToJSON = serviceSelectorToJSON; /* eslint-disable */ const sigstore_common_1 = require("./sigstore_common"); -function createBaseTransparencyLogInstance() { - return { baseUrl: "", hashAlgorithm: 0, publicKey: undefined, logId: undefined }; +/** + * ServiceSelector specifies how a client SHOULD select a set of + * Services to connect to. A client SHOULD throw an error if + * the value is SERVICE_SELECTOR_UNDEFINED. + */ +var ServiceSelector; +(function (ServiceSelector) { + ServiceSelector[ServiceSelector["SERVICE_SELECTOR_UNDEFINED"] = 0] = "SERVICE_SELECTOR_UNDEFINED"; + /** + * ALL - Clients SHOULD select all Services based on supported API version + * and validity window. + */ + ServiceSelector[ServiceSelector["ALL"] = 1] = "ALL"; + /** + * ANY - Clients SHOULD select one Service based on supported API version + * and validity window. It is up to the client implementation to + * decide how to select the Service, e.g. random or round-robin. + */ + ServiceSelector[ServiceSelector["ANY"] = 2] = "ANY"; + /** + * EXACT - Clients SHOULD select a specific number of Services based on + * supported API version and validity window, using the provided + * `count`. It is up to the client implementation to decide how to + * select the Service, e.g. random or round-robin. + */ + ServiceSelector[ServiceSelector["EXACT"] = 3] = "EXACT"; +})(ServiceSelector || (exports.ServiceSelector = ServiceSelector = {})); +function serviceSelectorFromJSON(object) { + switch (object) { + case 0: + case "SERVICE_SELECTOR_UNDEFINED": + return ServiceSelector.SERVICE_SELECTOR_UNDEFINED; + case 1: + case "ALL": + return ServiceSelector.ALL; + case 2: + case "ANY": + return ServiceSelector.ANY; + case 3: + case "EXACT": + return ServiceSelector.EXACT; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum ServiceSelector"); + } +} +function serviceSelectorToJSON(object) { + switch (object) { + case ServiceSelector.SERVICE_SELECTOR_UNDEFINED: + return "SERVICE_SELECTOR_UNDEFINED"; + case ServiceSelector.ALL: + return "ALL"; + case ServiceSelector.ANY: + return "ANY"; + case ServiceSelector.EXACT: + return "EXACT"; + default: + throw new globalThis.Error("Unrecognized enum value " + object + " for enum ServiceSelector"); + } } exports.TransparencyLogInstance = { fromJSON(object) { return { - baseUrl: isSet(object.baseUrl) ? String(object.baseUrl) : "", + baseUrl: isSet(object.baseUrl) ? globalThis.String(object.baseUrl) : "", hashAlgorithm: isSet(object.hashAlgorithm) ? (0, sigstore_common_1.hashAlgorithmFromJSON)(object.hashAlgorithm) : 0, publicKey: isSet(object.publicKey) ? sigstore_common_1.PublicKey.fromJSON(object.publicKey) : undefined, logId: isSet(object.logId) ? sigstore_common_1.LogId.fromJSON(object.logId) : undefined, + checkpointKeyId: isSet(object.checkpointKeyId) ? sigstore_common_1.LogId.fromJSON(object.checkpointKeyId) : undefined, + operator: isSet(object.operator) ? globalThis.String(object.operator) : "", }; }, toJSON(message) { const obj = {}; - message.baseUrl !== undefined && (obj.baseUrl = message.baseUrl); - message.hashAlgorithm !== undefined && (obj.hashAlgorithm = (0, sigstore_common_1.hashAlgorithmToJSON)(message.hashAlgorithm)); - message.publicKey !== undefined && - (obj.publicKey = message.publicKey ? sigstore_common_1.PublicKey.toJSON(message.publicKey) : undefined); - message.logId !== undefined && (obj.logId = message.logId ? sigstore_common_1.LogId.toJSON(message.logId) : undefined); + if (message.baseUrl !== "") { + obj.baseUrl = message.baseUrl; + } + if (message.hashAlgorithm !== 0) { + obj.hashAlgorithm = (0, sigstore_common_1.hashAlgorithmToJSON)(message.hashAlgorithm); + } + if (message.publicKey !== undefined) { + obj.publicKey = sigstore_common_1.PublicKey.toJSON(message.publicKey); + } + if (message.logId !== undefined) { + obj.logId = sigstore_common_1.LogId.toJSON(message.logId); + } + if (message.checkpointKeyId !== undefined) { + obj.checkpointKeyId = sigstore_common_1.LogId.toJSON(message.checkpointKeyId); + } + if (message.operator !== "") { + obj.operator = message.operator; + } return obj; }, }; -function createBaseCertificateAuthority() { - return { subject: undefined, uri: "", certChain: undefined, validFor: undefined }; -} exports.CertificateAuthority = { fromJSON(object) { return { subject: isSet(object.subject) ? sigstore_common_1.DistinguishedName.fromJSON(object.subject) : undefined, - uri: isSet(object.uri) ? String(object.uri) : "", + uri: isSet(object.uri) ? globalThis.String(object.uri) : "", certChain: isSet(object.certChain) ? sigstore_common_1.X509CertificateChain.fromJSON(object.certChain) : undefined, validFor: isSet(object.validFor) ? sigstore_common_1.TimeRange.fromJSON(object.validFor) : undefined, + operator: isSet(object.operator) ? globalThis.String(object.operator) : "", }; }, toJSON(message) { const obj = {}; - message.subject !== undefined && - (obj.subject = message.subject ? sigstore_common_1.DistinguishedName.toJSON(message.subject) : undefined); - message.uri !== undefined && (obj.uri = message.uri); - message.certChain !== undefined && - (obj.certChain = message.certChain ? sigstore_common_1.X509CertificateChain.toJSON(message.certChain) : undefined); - message.validFor !== undefined && - (obj.validFor = message.validFor ? sigstore_common_1.TimeRange.toJSON(message.validFor) : undefined); + if (message.subject !== undefined) { + obj.subject = sigstore_common_1.DistinguishedName.toJSON(message.subject); + } + if (message.uri !== "") { + obj.uri = message.uri; + } + if (message.certChain !== undefined) { + obj.certChain = sigstore_common_1.X509CertificateChain.toJSON(message.certChain); + } + if (message.validFor !== undefined) { + obj.validFor = sigstore_common_1.TimeRange.toJSON(message.validFor); + } + if (message.operator !== "") { + obj.operator = message.operator; + } return obj; }, }; -function createBaseTrustedRoot() { - return { mediaType: "", tlogs: [], certificateAuthorities: [], ctlogs: [], timestampAuthorities: [] }; -} exports.TrustedRoot = { fromJSON(object) { return { - mediaType: isSet(object.mediaType) ? String(object.mediaType) : "", - tlogs: Array.isArray(object?.tlogs) ? object.tlogs.map((e) => exports.TransparencyLogInstance.fromJSON(e)) : [], - certificateAuthorities: Array.isArray(object?.certificateAuthorities) + mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", + tlogs: globalThis.Array.isArray(object?.tlogs) + ? object.tlogs.map((e) => exports.TransparencyLogInstance.fromJSON(e)) + : [], + certificateAuthorities: globalThis.Array.isArray(object?.certificateAuthorities) ? object.certificateAuthorities.map((e) => exports.CertificateAuthority.fromJSON(e)) : [], - ctlogs: Array.isArray(object?.ctlogs) + ctlogs: globalThis.Array.isArray(object?.ctlogs) ? object.ctlogs.map((e) => exports.TransparencyLogInstance.fromJSON(e)) : [], - timestampAuthorities: Array.isArray(object?.timestampAuthorities) + timestampAuthorities: globalThis.Array.isArray(object?.timestampAuthorities) ? object.timestampAuthorities.map((e) => exports.CertificateAuthority.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - message.mediaType !== undefined && (obj.mediaType = message.mediaType); - if (message.tlogs) { - obj.tlogs = message.tlogs.map((e) => e ? exports.TransparencyLogInstance.toJSON(e) : undefined); + if (message.mediaType !== "") { + obj.mediaType = message.mediaType; + } + if (message.tlogs?.length) { + obj.tlogs = message.tlogs.map((e) => exports.TransparencyLogInstance.toJSON(e)); + } + if (message.certificateAuthorities?.length) { + obj.certificateAuthorities = message.certificateAuthorities.map((e) => exports.CertificateAuthority.toJSON(e)); + } + if (message.ctlogs?.length) { + obj.ctlogs = message.ctlogs.map((e) => exports.TransparencyLogInstance.toJSON(e)); + } + if (message.timestampAuthorities?.length) { + obj.timestampAuthorities = message.timestampAuthorities.map((e) => exports.CertificateAuthority.toJSON(e)); + } + return obj; + }, +}; +exports.SigningConfig = { + fromJSON(object) { + return { + mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", + caUrls: globalThis.Array.isArray(object?.caUrls) ? object.caUrls.map((e) => exports.Service.fromJSON(e)) : [], + oidcUrls: globalThis.Array.isArray(object?.oidcUrls) ? object.oidcUrls.map((e) => exports.Service.fromJSON(e)) : [], + rekorTlogUrls: globalThis.Array.isArray(object?.rekorTlogUrls) + ? object.rekorTlogUrls.map((e) => exports.Service.fromJSON(e)) + : [], + rekorTlogConfig: isSet(object.rekorTlogConfig) + ? exports.ServiceConfiguration.fromJSON(object.rekorTlogConfig) + : undefined, + tsaUrls: globalThis.Array.isArray(object?.tsaUrls) ? object.tsaUrls.map((e) => exports.Service.fromJSON(e)) : [], + tsaConfig: isSet(object.tsaConfig) ? exports.ServiceConfiguration.fromJSON(object.tsaConfig) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.mediaType !== "") { + obj.mediaType = message.mediaType; + } + if (message.caUrls?.length) { + obj.caUrls = message.caUrls.map((e) => exports.Service.toJSON(e)); + } + if (message.oidcUrls?.length) { + obj.oidcUrls = message.oidcUrls.map((e) => exports.Service.toJSON(e)); + } + if (message.rekorTlogUrls?.length) { + obj.rekorTlogUrls = message.rekorTlogUrls.map((e) => exports.Service.toJSON(e)); + } + if (message.rekorTlogConfig !== undefined) { + obj.rekorTlogConfig = exports.ServiceConfiguration.toJSON(message.rekorTlogConfig); + } + if (message.tsaUrls?.length) { + obj.tsaUrls = message.tsaUrls.map((e) => exports.Service.toJSON(e)); + } + if (message.tsaConfig !== undefined) { + obj.tsaConfig = exports.ServiceConfiguration.toJSON(message.tsaConfig); + } + return obj; + }, +}; +exports.Service = { + fromJSON(object) { + return { + url: isSet(object.url) ? globalThis.String(object.url) : "", + majorApiVersion: isSet(object.majorApiVersion) ? globalThis.Number(object.majorApiVersion) : 0, + validFor: isSet(object.validFor) ? sigstore_common_1.TimeRange.fromJSON(object.validFor) : undefined, + operator: isSet(object.operator) ? globalThis.String(object.operator) : "", + }; + }, + toJSON(message) { + const obj = {}; + if (message.url !== "") { + obj.url = message.url; } - else { - obj.tlogs = []; + if (message.majorApiVersion !== 0) { + obj.majorApiVersion = Math.round(message.majorApiVersion); } - if (message.certificateAuthorities) { - obj.certificateAuthorities = message.certificateAuthorities.map((e) => e ? exports.CertificateAuthority.toJSON(e) : undefined); + if (message.validFor !== undefined) { + obj.validFor = sigstore_common_1.TimeRange.toJSON(message.validFor); } - else { - obj.certificateAuthorities = []; + if (message.operator !== "") { + obj.operator = message.operator; } - if (message.ctlogs) { - obj.ctlogs = message.ctlogs.map((e) => e ? exports.TransparencyLogInstance.toJSON(e) : undefined); + return obj; + }, +}; +exports.ServiceConfiguration = { + fromJSON(object) { + return { + selector: isSet(object.selector) ? serviceSelectorFromJSON(object.selector) : 0, + count: isSet(object.count) ? globalThis.Number(object.count) : 0, + }; + }, + toJSON(message) { + const obj = {}; + if (message.selector !== 0) { + obj.selector = serviceSelectorToJSON(message.selector); } - else { - obj.ctlogs = []; + if (message.count !== 0) { + obj.count = Math.round(message.count); + } + return obj; + }, +}; +exports.ClientTrustConfig = { + fromJSON(object) { + return { + mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", + trustedRoot: isSet(object.trustedRoot) ? exports.TrustedRoot.fromJSON(object.trustedRoot) : undefined, + signingConfig: isSet(object.signingConfig) ? exports.SigningConfig.fromJSON(object.signingConfig) : undefined, + }; + }, + toJSON(message) { + const obj = {}; + if (message.mediaType !== "") { + obj.mediaType = message.mediaType; } - if (message.timestampAuthorities) { - obj.timestampAuthorities = message.timestampAuthorities.map((e) => e ? exports.CertificateAuthority.toJSON(e) : undefined); + if (message.trustedRoot !== undefined) { + obj.trustedRoot = exports.TrustedRoot.toJSON(message.trustedRoot); } - else { - obj.timestampAuthorities = []; + if (message.signingConfig !== undefined) { + obj.signingConfig = exports.SigningConfig.toJSON(message.signingConfig); } return obj; }, diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_verification.js b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_verification.js index 4af83c5a546607..a616d5f0f6a216 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_verification.js +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_verification.js @@ -1,86 +1,71 @@ "use strict"; +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.7.0 +// protoc v6.30.2 +// source: sigstore_verification.proto Object.defineProperty(exports, "__esModule", { value: true }); exports.Input = exports.Artifact = exports.ArtifactVerificationOptions_ObserverTimestampOptions = exports.ArtifactVerificationOptions_TlogIntegratedTimestampOptions = exports.ArtifactVerificationOptions_TimestampAuthorityOptions = exports.ArtifactVerificationOptions_CtlogOptions = exports.ArtifactVerificationOptions_TlogOptions = exports.ArtifactVerificationOptions = exports.PublicKeyIdentities = exports.CertificateIdentities = exports.CertificateIdentity = void 0; /* eslint-disable */ const sigstore_bundle_1 = require("./sigstore_bundle"); const sigstore_common_1 = require("./sigstore_common"); const sigstore_trustroot_1 = require("./sigstore_trustroot"); -function createBaseCertificateIdentity() { - return { issuer: "", san: undefined, oids: [] }; -} exports.CertificateIdentity = { fromJSON(object) { return { - issuer: isSet(object.issuer) ? String(object.issuer) : "", + issuer: isSet(object.issuer) ? globalThis.String(object.issuer) : "", san: isSet(object.san) ? sigstore_common_1.SubjectAlternativeName.fromJSON(object.san) : undefined, - oids: Array.isArray(object?.oids) ? object.oids.map((e) => sigstore_common_1.ObjectIdentifierValuePair.fromJSON(e)) : [], + oids: globalThis.Array.isArray(object?.oids) + ? object.oids.map((e) => sigstore_common_1.ObjectIdentifierValuePair.fromJSON(e)) + : [], }; }, toJSON(message) { const obj = {}; - message.issuer !== undefined && (obj.issuer = message.issuer); - message.san !== undefined && (obj.san = message.san ? sigstore_common_1.SubjectAlternativeName.toJSON(message.san) : undefined); - if (message.oids) { - obj.oids = message.oids.map((e) => e ? sigstore_common_1.ObjectIdentifierValuePair.toJSON(e) : undefined); + if (message.issuer !== "") { + obj.issuer = message.issuer; + } + if (message.san !== undefined) { + obj.san = sigstore_common_1.SubjectAlternativeName.toJSON(message.san); } - else { - obj.oids = []; + if (message.oids?.length) { + obj.oids = message.oids.map((e) => sigstore_common_1.ObjectIdentifierValuePair.toJSON(e)); } return obj; }, }; -function createBaseCertificateIdentities() { - return { identities: [] }; -} exports.CertificateIdentities = { fromJSON(object) { return { - identities: Array.isArray(object?.identities) + identities: globalThis.Array.isArray(object?.identities) ? object.identities.map((e) => exports.CertificateIdentity.fromJSON(e)) : [], }; }, toJSON(message) { const obj = {}; - if (message.identities) { - obj.identities = message.identities.map((e) => e ? exports.CertificateIdentity.toJSON(e) : undefined); - } - else { - obj.identities = []; + if (message.identities?.length) { + obj.identities = message.identities.map((e) => exports.CertificateIdentity.toJSON(e)); } return obj; }, }; -function createBasePublicKeyIdentities() { - return { publicKeys: [] }; -} exports.PublicKeyIdentities = { fromJSON(object) { return { - publicKeys: Array.isArray(object?.publicKeys) ? object.publicKeys.map((e) => sigstore_common_1.PublicKey.fromJSON(e)) : [], + publicKeys: globalThis.Array.isArray(object?.publicKeys) + ? object.publicKeys.map((e) => sigstore_common_1.PublicKey.fromJSON(e)) + : [], }; }, toJSON(message) { const obj = {}; - if (message.publicKeys) { - obj.publicKeys = message.publicKeys.map((e) => e ? sigstore_common_1.PublicKey.toJSON(e) : undefined); - } - else { - obj.publicKeys = []; + if (message.publicKeys?.length) { + obj.publicKeys = message.publicKeys.map((e) => sigstore_common_1.PublicKey.toJSON(e)); } return obj; }, }; -function createBaseArtifactVerificationOptions() { - return { - signers: undefined, - tlogOptions: undefined, - ctlogOptions: undefined, - tsaOptions: undefined, - integratedTsOptions: undefined, - observerOptions: undefined, - }; -} exports.ArtifactVerificationOptions = { fromJSON(object) { return { @@ -111,150 +96,152 @@ exports.ArtifactVerificationOptions = { }, toJSON(message) { const obj = {}; - message.signers?.$case === "certificateIdentities" && - (obj.certificateIdentities = message.signers?.certificateIdentities - ? exports.CertificateIdentities.toJSON(message.signers?.certificateIdentities) - : undefined); - message.signers?.$case === "publicKeys" && (obj.publicKeys = message.signers?.publicKeys - ? exports.PublicKeyIdentities.toJSON(message.signers?.publicKeys) - : undefined); - message.tlogOptions !== undefined && (obj.tlogOptions = message.tlogOptions - ? exports.ArtifactVerificationOptions_TlogOptions.toJSON(message.tlogOptions) - : undefined); - message.ctlogOptions !== undefined && (obj.ctlogOptions = message.ctlogOptions - ? exports.ArtifactVerificationOptions_CtlogOptions.toJSON(message.ctlogOptions) - : undefined); - message.tsaOptions !== undefined && (obj.tsaOptions = message.tsaOptions - ? exports.ArtifactVerificationOptions_TimestampAuthorityOptions.toJSON(message.tsaOptions) - : undefined); - message.integratedTsOptions !== undefined && (obj.integratedTsOptions = message.integratedTsOptions - ? exports.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.toJSON(message.integratedTsOptions) - : undefined); - message.observerOptions !== undefined && (obj.observerOptions = message.observerOptions - ? exports.ArtifactVerificationOptions_ObserverTimestampOptions.toJSON(message.observerOptions) - : undefined); + if (message.signers?.$case === "certificateIdentities") { + obj.certificateIdentities = exports.CertificateIdentities.toJSON(message.signers.certificateIdentities); + } + else if (message.signers?.$case === "publicKeys") { + obj.publicKeys = exports.PublicKeyIdentities.toJSON(message.signers.publicKeys); + } + if (message.tlogOptions !== undefined) { + obj.tlogOptions = exports.ArtifactVerificationOptions_TlogOptions.toJSON(message.tlogOptions); + } + if (message.ctlogOptions !== undefined) { + obj.ctlogOptions = exports.ArtifactVerificationOptions_CtlogOptions.toJSON(message.ctlogOptions); + } + if (message.tsaOptions !== undefined) { + obj.tsaOptions = exports.ArtifactVerificationOptions_TimestampAuthorityOptions.toJSON(message.tsaOptions); + } + if (message.integratedTsOptions !== undefined) { + obj.integratedTsOptions = exports.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.toJSON(message.integratedTsOptions); + } + if (message.observerOptions !== undefined) { + obj.observerOptions = exports.ArtifactVerificationOptions_ObserverTimestampOptions.toJSON(message.observerOptions); + } return obj; }, }; -function createBaseArtifactVerificationOptions_TlogOptions() { - return { threshold: 0, performOnlineVerification: false, disable: false }; -} exports.ArtifactVerificationOptions_TlogOptions = { fromJSON(object) { return { - threshold: isSet(object.threshold) ? Number(object.threshold) : 0, + threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, performOnlineVerification: isSet(object.performOnlineVerification) - ? Boolean(object.performOnlineVerification) + ? globalThis.Boolean(object.performOnlineVerification) : false, - disable: isSet(object.disable) ? Boolean(object.disable) : false, + disable: isSet(object.disable) ? globalThis.Boolean(object.disable) : false, }; }, toJSON(message) { const obj = {}; - message.threshold !== undefined && (obj.threshold = Math.round(message.threshold)); - message.performOnlineVerification !== undefined && - (obj.performOnlineVerification = message.performOnlineVerification); - message.disable !== undefined && (obj.disable = message.disable); + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + if (message.performOnlineVerification !== false) { + obj.performOnlineVerification = message.performOnlineVerification; + } + if (message.disable !== false) { + obj.disable = message.disable; + } return obj; }, }; -function createBaseArtifactVerificationOptions_CtlogOptions() { - return { threshold: 0, disable: false }; -} exports.ArtifactVerificationOptions_CtlogOptions = { fromJSON(object) { return { - threshold: isSet(object.threshold) ? Number(object.threshold) : 0, - disable: isSet(object.disable) ? Boolean(object.disable) : false, + threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, + disable: isSet(object.disable) ? globalThis.Boolean(object.disable) : false, }; }, toJSON(message) { const obj = {}; - message.threshold !== undefined && (obj.threshold = Math.round(message.threshold)); - message.disable !== undefined && (obj.disable = message.disable); + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + if (message.disable !== false) { + obj.disable = message.disable; + } return obj; }, }; -function createBaseArtifactVerificationOptions_TimestampAuthorityOptions() { - return { threshold: 0, disable: false }; -} exports.ArtifactVerificationOptions_TimestampAuthorityOptions = { fromJSON(object) { return { - threshold: isSet(object.threshold) ? Number(object.threshold) : 0, - disable: isSet(object.disable) ? Boolean(object.disable) : false, + threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, + disable: isSet(object.disable) ? globalThis.Boolean(object.disable) : false, }; }, toJSON(message) { const obj = {}; - message.threshold !== undefined && (obj.threshold = Math.round(message.threshold)); - message.disable !== undefined && (obj.disable = message.disable); + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + if (message.disable !== false) { + obj.disable = message.disable; + } return obj; }, }; -function createBaseArtifactVerificationOptions_TlogIntegratedTimestampOptions() { - return { threshold: 0, disable: false }; -} exports.ArtifactVerificationOptions_TlogIntegratedTimestampOptions = { fromJSON(object) { return { - threshold: isSet(object.threshold) ? Number(object.threshold) : 0, - disable: isSet(object.disable) ? Boolean(object.disable) : false, + threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, + disable: isSet(object.disable) ? globalThis.Boolean(object.disable) : false, }; }, toJSON(message) { const obj = {}; - message.threshold !== undefined && (obj.threshold = Math.round(message.threshold)); - message.disable !== undefined && (obj.disable = message.disable); + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + if (message.disable !== false) { + obj.disable = message.disable; + } return obj; }, }; -function createBaseArtifactVerificationOptions_ObserverTimestampOptions() { - return { threshold: 0, disable: false }; -} exports.ArtifactVerificationOptions_ObserverTimestampOptions = { fromJSON(object) { return { - threshold: isSet(object.threshold) ? Number(object.threshold) : 0, - disable: isSet(object.disable) ? Boolean(object.disable) : false, + threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, + disable: isSet(object.disable) ? globalThis.Boolean(object.disable) : false, }; }, toJSON(message) { const obj = {}; - message.threshold !== undefined && (obj.threshold = Math.round(message.threshold)); - message.disable !== undefined && (obj.disable = message.disable); + if (message.threshold !== 0) { + obj.threshold = Math.round(message.threshold); + } + if (message.disable !== false) { + obj.disable = message.disable; + } return obj; }, }; -function createBaseArtifact() { - return { data: undefined }; -} exports.Artifact = { fromJSON(object) { return { data: isSet(object.artifactUri) - ? { $case: "artifactUri", artifactUri: String(object.artifactUri) } + ? { $case: "artifactUri", artifactUri: globalThis.String(object.artifactUri) } : isSet(object.artifact) ? { $case: "artifact", artifact: Buffer.from(bytesFromBase64(object.artifact)) } - : undefined, + : isSet(object.artifactDigest) + ? { $case: "artifactDigest", artifactDigest: sigstore_common_1.HashOutput.fromJSON(object.artifactDigest) } + : undefined, }; }, toJSON(message) { const obj = {}; - message.data?.$case === "artifactUri" && (obj.artifactUri = message.data?.artifactUri); - message.data?.$case === "artifact" && - (obj.artifact = message.data?.artifact !== undefined ? base64FromBytes(message.data?.artifact) : undefined); + if (message.data?.$case === "artifactUri") { + obj.artifactUri = message.data.artifactUri; + } + else if (message.data?.$case === "artifact") { + obj.artifact = base64FromBytes(message.data.artifact); + } + else if (message.data?.$case === "artifactDigest") { + obj.artifactDigest = sigstore_common_1.HashOutput.toJSON(message.data.artifactDigest); + } return obj; }, }; -function createBaseInput() { - return { - artifactTrustRoot: undefined, - artifactVerificationOptions: undefined, - bundle: undefined, - artifact: undefined, - }; -} exports.Input = { fromJSON(object) { return { @@ -268,56 +255,26 @@ exports.Input = { }, toJSON(message) { const obj = {}; - message.artifactTrustRoot !== undefined && - (obj.artifactTrustRoot = message.artifactTrustRoot ? sigstore_trustroot_1.TrustedRoot.toJSON(message.artifactTrustRoot) : undefined); - message.artifactVerificationOptions !== undefined && - (obj.artifactVerificationOptions = message.artifactVerificationOptions - ? exports.ArtifactVerificationOptions.toJSON(message.artifactVerificationOptions) - : undefined); - message.bundle !== undefined && (obj.bundle = message.bundle ? sigstore_bundle_1.Bundle.toJSON(message.bundle) : undefined); - message.artifact !== undefined && (obj.artifact = message.artifact ? exports.Artifact.toJSON(message.artifact) : undefined); + if (message.artifactTrustRoot !== undefined) { + obj.artifactTrustRoot = sigstore_trustroot_1.TrustedRoot.toJSON(message.artifactTrustRoot); + } + if (message.artifactVerificationOptions !== undefined) { + obj.artifactVerificationOptions = exports.ArtifactVerificationOptions.toJSON(message.artifactVerificationOptions); + } + if (message.bundle !== undefined) { + obj.bundle = sigstore_bundle_1.Bundle.toJSON(message.bundle); + } + if (message.artifact !== undefined) { + obj.artifact = exports.Artifact.toJSON(message.artifact); + } return obj; }, }; -var tsProtoGlobalThis = (() => { - if (typeof globalThis !== "undefined") { - return globalThis; - } - if (typeof self !== "undefined") { - return self; - } - if (typeof window !== "undefined") { - return window; - } - if (typeof global !== "undefined") { - return global; - } - throw "Unable to locate global object"; -})(); function bytesFromBase64(b64) { - if (tsProtoGlobalThis.Buffer) { - return Uint8Array.from(tsProtoGlobalThis.Buffer.from(b64, "base64")); - } - else { - const bin = tsProtoGlobalThis.atob(b64); - const arr = new Uint8Array(bin.length); - for (let i = 0; i < bin.length; ++i) { - arr[i] = bin.charCodeAt(i); - } - return arr; - } + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); } function base64FromBytes(arr) { - if (tsProtoGlobalThis.Buffer) { - return tsProtoGlobalThis.Buffer.from(arr).toString("base64"); - } - else { - const bin = []; - arr.forEach((byte) => { - bin.push(String.fromCharCode(byte)); - }); - return tsProtoGlobalThis.btoa(bin.join("")); - } + return globalThis.Buffer.from(arr).toString("base64"); } function isSet(value) { return value !== null && value !== undefined; diff --git a/deps/npm/node_modules/@sigstore/protobuf-specs/package.json b/deps/npm/node_modules/@sigstore/protobuf-specs/package.json index 047a67a7a2e208..3080a305a8f050 100644 --- a/deps/npm/node_modules/@sigstore/protobuf-specs/package.json +++ b/deps/npm/node_modules/@sigstore/protobuf-specs/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/protobuf-specs", - "version": "0.3.0", + "version": "0.4.3", "description": "code-signing for npm packages", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -21,11 +21,11 @@ }, "homepage": "https://github.com/sigstore/protobuf-specs#readme", "devDependencies": { - "@tsconfig/node14": "^1.0.3", + "@tsconfig/node18": "^18.2.4", "@types/node": "^18.14.0", - "typescript": "^4.9.5" + "typescript": "^5.7.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js deleted file mode 100644 index f01aac252b304a..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js +++ /dev/null @@ -1,70 +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.toDSSEBundle = exports.toMessageSignatureBundle = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const sigstore = __importStar(require("@sigstore/bundle")); -const util_1 = require("../util"); -// Helper functions for assembling the parts of a Sigstore bundle -// Message signature bundle - $case: 'messageSignature' -function toMessageSignatureBundle(artifact, signature) { - const digest = util_1.crypto.hash(artifact.data); - return sigstore.toMessageSignatureBundle({ - digest, - signature: signature.signature, - certificate: signature.key.$case === 'x509Certificate' - ? util_1.pem.toDER(signature.key.certificate) - : undefined, - keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, - }); -} -exports.toMessageSignatureBundle = toMessageSignatureBundle; -// DSSE envelope bundle - $case: 'dsseEnvelope' -function toDSSEBundle(artifact, signature) { - return sigstore.toDSSEBundle({ - artifact: artifact.data, - artifactType: artifact.type, - signature: signature.signature, - certificate: signature.key.$case === 'x509Certificate' - ? util_1.pem.toDER(signature.key.certificate) - : undefined, - keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, - }); -} -exports.toDSSEBundle = toDSSEBundle; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js deleted file mode 100644 index 486d289aea38cb..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DSSEBundleBuilder = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const util_1 = require("../util"); -const base_1 = require("./base"); -const bundle_1 = require("./bundle"); -// BundleBuilder implementation for DSSE wrapped attestations -class DSSEBundleBuilder extends base_1.BaseBundleBuilder { - constructor(options) { - super(options); - } - // DSSE requires the artifact to be pre-encoded with the payload type - // before the signature is generated. - async prepare(artifact) { - const a = artifactDefaults(artifact); - return util_1.dsse.preAuthEncoding(a.type, a.data); - } - // Packages the artifact and signature into a DSSE bundle - async package(artifact, signature) { - return (0, bundle_1.toDSSEBundle)(artifactDefaults(artifact), signature); - } -} -exports.DSSEBundleBuilder = DSSEBundleBuilder; -// Defaults the artifact type to an empty string if not provided -function artifactDefaults(artifact) { - return { - ...artifact, - type: artifact.type ?? '', - }; -} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/error.js b/deps/npm/node_modules/@sigstore/sign/dist/error.js deleted file mode 100644 index d57e4567fb89ee..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/error.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.internalError = exports.InternalError = void 0; -const error_1 = require("./external/error"); -class InternalError extends Error { - constructor({ code, message, cause, }) { - super(message); - this.name = this.constructor.name; - this.cause = cause; - this.code = code; - } -} -exports.InternalError = InternalError; -function internalError(err, code, message) { - if (err instanceof error_1.HTTPError) { - message += ` - ${err.message}`; - } - throw new InternalError({ - code: code, - message: message, - cause: err, - }); -} -exports.internalError = internalError; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/error.js b/deps/npm/node_modules/@sigstore/sign/dist/external/error.js deleted file mode 100644 index 0dad92ea69414f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/error.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.checkStatus = exports.HTTPError = void 0; -class HTTPError extends Error { - constructor({ status, message, location, }) { - super(`(${status}) ${message}`); - this.statusCode = status; - this.location = location; - } -} -exports.HTTPError = HTTPError; -const checkStatus = async (response) => { - if (response.ok) { - return response; - } - else { - let message = response.statusText; - const location = response.headers?.get('Location') || undefined; - const contentType = response.headers?.get('Content-Type'); - // If response type is JSON, try to parse the body for a message - if (contentType?.includes('application/json')) { - try { - await response.json().then((body) => { - message = body.message; - }); - } - catch (e) { - // ignore - } - } - throw new HTTPError({ - status: response.status, - message: message, - location: location, - }); - } -}; -exports.checkStatus = checkStatus; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js b/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js deleted file mode 100644 index f00b62e147cd7f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js +++ /dev/null @@ -1,51 +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.Fulcio = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); -const util_1 = require("../util"); -const error_1 = require("./error"); -/** - * Fulcio API client. - */ -class Fulcio { - constructor(options) { - this.fetch = make_fetch_happen_1.default.defaults({ - retry: options.retry, - timeout: options.timeout, - headers: { - 'Content-Type': 'application/json', - 'User-Agent': util_1.ua.getUserAgent(), - }, - }); - this.baseUrl = options.baseURL; - } - async createSigningCertificate(request) { - const url = `${this.baseUrl}/api/v2/signingCert`; - const response = await this.fetch(url, { - method: 'POST', - body: JSON.stringify(request), - }); - await (0, error_1.checkStatus)(response); - const data = await response.json(); - return data; - } -} -exports.Fulcio = Fulcio; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js b/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js deleted file mode 100644 index 6f6cb96cc9c5cb..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js +++ /dev/null @@ -1,115 +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.Rekor = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); -const util_1 = require("../util"); -const error_1 = require("./error"); -/** - * Rekor API client. - */ -class Rekor { - constructor(options) { - this.fetch = make_fetch_happen_1.default.defaults({ - retry: options.retry, - timeout: options.timeout, - headers: { - Accept: 'application/json', - 'User-Agent': util_1.ua.getUserAgent(), - }, - }); - this.baseUrl = options.baseURL; - } - /** - * Create a new entry in the Rekor log. - * @param propsedEntry {ProposedEntry} Data to create a new entry - * @returns {Promise} The created entry - */ - async createEntry(propsedEntry) { - const url = `${this.baseUrl}/api/v1/log/entries`; - const response = await this.fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(propsedEntry), - }); - await (0, error_1.checkStatus)(response); - const data = await response.json(); - return entryFromResponse(data); - } - /** - * Get an entry from the Rekor log. - * @param uuid {string} The UUID of the entry to retrieve - * @returns {Promise} The retrieved entry - */ - async getEntry(uuid) { - const url = `${this.baseUrl}/api/v1/log/entries/${uuid}`; - const response = await this.fetch(url); - await (0, error_1.checkStatus)(response); - const data = await response.json(); - return entryFromResponse(data); - } - /** - * Search the Rekor log index for entries matching the given query. - * @param opts {SearchIndex} Options to search the Rekor log - * @returns {Promise} UUIDs of matching entries - */ - async searchIndex(opts) { - const url = `${this.baseUrl}/api/v1/index/retrieve`; - const response = await this.fetch(url, { - method: 'POST', - body: JSON.stringify(opts), - headers: { 'Content-Type': 'application/json' }, - }); - await (0, error_1.checkStatus)(response); - const data = await response.json(); - return data; - } - /** - * Search the Rekor logs for matching the given query. - * @param opts {SearchLogQuery} Query to search the Rekor log - * @returns {Promise} List of matching entries - */ - async searchLog(opts) { - const url = `${this.baseUrl}/api/v1/log/entries/retrieve`; - const response = await this.fetch(url, { - method: 'POST', - body: JSON.stringify(opts), - headers: { 'Content-Type': 'application/json' }, - }); - await (0, error_1.checkStatus)(response); - const rawData = await response.json(); - const data = rawData.map((d) => entryFromResponse(d)); - return data; - } -} -exports.Rekor = Rekor; -// Unpack the response from the Rekor API into a more convenient format. -function entryFromResponse(data) { - const entries = Object.entries(data); - if (entries.length != 1) { - throw new Error('Received multiple entries in Rekor response'); - } - // Grab UUID and entry data from the response - const [uuid, entry] = entries[0]; - return { - ...entry, - uuid, - }; -} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js b/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js deleted file mode 100644 index 252c14f2d32d87..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js +++ /dev/null @@ -1,47 +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.TimestampAuthority = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); -const util_1 = require("../util"); -const error_1 = require("./error"); -class TimestampAuthority { - constructor(options) { - this.fetch = make_fetch_happen_1.default.defaults({ - retry: options.retry, - timeout: options.timeout, - headers: { - 'Content-Type': 'application/json', - 'User-Agent': util_1.ua.getUserAgent(), - }, - }); - this.baseUrl = options.baseURL; - } - async createTimestamp(request) { - const url = `${this.baseUrl}/api/v1/timestamp`; - const response = await this.fetch(url, { - method: 'POST', - body: JSON.stringify(request), - }); - await (0, error_1.checkStatus)(response); - return response.buffer(); - } -} -exports.TimestampAuthority = TimestampAuthority; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/util/index.js b/deps/npm/node_modules/@sigstore/sign/dist/util/index.js deleted file mode 100644 index f467c9150c348f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/util/index.js +++ /dev/null @@ -1,49 +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.ua = exports.oidc = exports.pem = exports.json = exports.encoding = exports.dsse = exports.crypto = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -var core_1 = require("@sigstore/core"); -Object.defineProperty(exports, "crypto", { enumerable: true, get: function () { return core_1.crypto; } }); -Object.defineProperty(exports, "dsse", { enumerable: true, get: function () { return core_1.dsse; } }); -Object.defineProperty(exports, "encoding", { enumerable: true, get: function () { return core_1.encoding; } }); -Object.defineProperty(exports, "json", { enumerable: true, get: function () { return core_1.json; } }); -Object.defineProperty(exports, "pem", { enumerable: true, get: function () { return core_1.pem; } }); -exports.oidc = __importStar(require("./oidc")); -exports.ua = __importStar(require("./ua")); diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js deleted file mode 100644 index f6c165380ba45d..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js +++ /dev/null @@ -1,136 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toProposedEntry = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const bundle_1 = require("@sigstore/bundle"); -const util_1 = require("../../util"); -function toProposedEntry(content, publicKey, -// TODO: Remove this parameter once have completely switched to 'dsse' entries -entryType = 'intoto') { - switch (content.$case) { - case 'dsseEnvelope': - // TODO: Remove this conditional once have completely switched to 'dsse' entries - if (entryType === 'dsse') { - return toProposedDSSEEntry(content.dsseEnvelope, publicKey); - } - return toProposedIntotoEntry(content.dsseEnvelope, publicKey); - case 'messageSignature': - return toProposedHashedRekordEntry(content.messageSignature, publicKey); - } -} -exports.toProposedEntry = toProposedEntry; -// Returns a properly formatted Rekor "hashedrekord" entry for the given digest -// and signature -function toProposedHashedRekordEntry(messageSignature, publicKey) { - const hexDigest = messageSignature.messageDigest.digest.toString('hex'); - const b64Signature = messageSignature.signature.toString('base64'); - const b64Key = util_1.encoding.base64Encode(publicKey); - return { - apiVersion: '0.0.1', - kind: 'hashedrekord', - spec: { - data: { - hash: { - algorithm: 'sha256', - value: hexDigest, - }, - }, - signature: { - content: b64Signature, - publicKey: { - content: b64Key, - }, - }, - }, - }; -} -// Returns a properly formatted Rekor "dsse" entry for the given DSSE envelope -// and signature -function toProposedDSSEEntry(envelope, publicKey) { - const envelopeJSON = JSON.stringify((0, bundle_1.envelopeToJSON)(envelope)); - const encodedKey = util_1.encoding.base64Encode(publicKey); - return { - apiVersion: '0.0.1', - kind: 'dsse', - spec: { - proposedContent: { - envelope: envelopeJSON, - verifiers: [encodedKey], - }, - }, - }; -} -// Returns a properly formatted Rekor "intoto" entry for the given DSSE -// envelope and signature -function toProposedIntotoEntry(envelope, publicKey) { - // Calculate the value for the payloadHash field in the Rekor entry - const payloadHash = util_1.crypto.hash(envelope.payload).toString('hex'); - // Calculate the value for the hash field in the Rekor entry - const envelopeHash = calculateDSSEHash(envelope, publicKey); - // Collect values for re-creating the DSSE envelope. - // Double-encode payload and signature cause that's what Rekor expects - const payload = util_1.encoding.base64Encode(envelope.payload.toString('base64')); - const sig = util_1.encoding.base64Encode(envelope.signatures[0].sig.toString('base64')); - const keyid = envelope.signatures[0].keyid; - const encodedKey = util_1.encoding.base64Encode(publicKey); - // Create the envelope portion of the entry. Note the inclusion of the - // publicKey in the signature struct is not a standard part of a DSSE - // envelope, but is required by Rekor. - const dsse = { - payloadType: envelope.payloadType, - payload: payload, - signatures: [{ sig, publicKey: encodedKey }], - }; - // If the keyid is an empty string, Rekor seems to remove it altogether. We - // need to do the same here so that we can properly recreate the entry for - // verification. - if (keyid.length > 0) { - dsse.signatures[0].keyid = keyid; - } - return { - apiVersion: '0.0.2', - kind: 'intoto', - spec: { - content: { - envelope: dsse, - hash: { algorithm: 'sha256', value: envelopeHash }, - payloadHash: { algorithm: 'sha256', value: payloadHash }, - }, - }, - }; -} -// Calculates the hash of a DSSE envelope for inclusion in a Rekor entry. -// There is no standard way to do this, so the scheme we're using as as -// follows: -// * payload is base64 encoded -// * signature is base64 encoded (only the first signature is used) -// * keyid is included ONLY if it is NOT an empty string -// * The resulting JSON is canonicalized and hashed to a hex string -function calculateDSSEHash(envelope, publicKey) { - const dsse = { - payloadType: envelope.payloadType, - payload: envelope.payload.toString('base64'), - signatures: [ - { sig: envelope.signatures[0].sig.toString('base64'), publicKey }, - ], - }; - // If the keyid is an empty string, Rekor seems to remove it altogether. - if (envelope.signatures[0].keyid.length > 0) { - dsse.signatures[0].keyid = envelope.signatures[0].keyid; - } - return util_1.crypto.hash(util_1.json.canonicalize(dsse)).toString('hex'); -} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js deleted file mode 100644 index a334deb00b7756..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.TSAClient = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const error_1 = require("../../error"); -const tsa_1 = require("../../external/tsa"); -const util_1 = require("../../util"); -class TSAClient { - constructor(options) { - this.tsa = new tsa_1.TimestampAuthority({ - baseURL: options.tsaBaseURL, - retry: options.retry, - timeout: options.timeout, - }); - } - async createTimestamp(signature) { - const request = { - artifactHash: util_1.crypto.hash(signature).toString('base64'), - hashAlgorithm: 'sha256', - }; - try { - return await this.tsa.createTimestamp(request); - } - catch (err) { - (0, error_1.internalError)(err, 'TSA_CREATE_TIMESTAMP_ERROR', 'error creating timestamp'); - } - } -} -exports.TSAClient = TSAClient; diff --git a/deps/npm/node_modules/@sigstore/sign/package.json b/deps/npm/node_modules/@sigstore/sign/package.json deleted file mode 100644 index 4302f6e07a2a82..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@sigstore/sign", - "version": "2.2.3", - "description": "Sigstore signing library", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme", - "publishConfig": { - "provenance": true - }, - "devDependencies": { - "@sigstore/jest": "^0.0.0", - "@sigstore/mock": "^0.6.5", - "@sigstore/rekor-types": "^2.0.0", - "@types/make-fetch-happen": "^10.0.4" - }, - "dependencies": { - "@sigstore/bundle": "^2.2.0", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.0", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js b/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js index c9a8ee92b531eb..06a8143e70da2f 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.appDataPath = void 0; +exports.appDataPath = appDataPath; /* Copyright 2023 The Sigstore Authors. @@ -41,4 +41,3 @@ function appDataPath(name) { } } } -exports.appDataPath = appDataPath; diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/client.js b/deps/npm/node_modules/@sigstore/tuf/dist/client.js index 2019c1fd30f886..328f49e40dbbd7 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/client.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/client.js @@ -79,7 +79,6 @@ function seedCache({ cachePath, mirrorURL, tufRootPath, forceInit, }) { fs_1.default.copyFileSync(tufRootPath, cachedRootPath); } else { - /* eslint-disable @typescript-eslint/no-var-requires */ const seeds = require('../seeds.json'); const repoSeed = seeds[mirrorURL]; if (!repoSeed) { diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/index.js b/deps/npm/node_modules/@sigstore/tuf/dist/index.js index 678c81d45d21ed..2af5de93ec5d2f 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/index.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/index.js @@ -1,6 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.TUFError = exports.initTUF = exports.getTrustedRoot = exports.DEFAULT_MIRROR_URL = void 0; +exports.TUFError = exports.DEFAULT_MIRROR_URL = void 0; +exports.getTrustedRoot = getTrustedRoot; +exports.initTUF = initTUF; /* Copyright 2023 The Sigstore Authors. @@ -31,14 +33,12 @@ options = {}) { const trustedRoot = await client.getTarget(TRUSTED_ROOT_TARGET); return protobuf_specs_1.TrustedRoot.fromJSON(JSON.parse(trustedRoot)); } -exports.getTrustedRoot = getTrustedRoot; async function initTUF( /* istanbul ignore next */ options = {}) { const client = createClient(options); return client.refresh().then(() => client); } -exports.initTUF = initTUF; // Create a TUF client with default options function createClient(options) { /* istanbul ignore next */ diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/target.js b/deps/npm/node_modules/@sigstore/tuf/dist/target.js index 29eaf99a7e721c..5c6675bdfbf5fe 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/target.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/target.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.readTarget = void 0; +exports.readTarget = readTarget; /* Copyright 2023 The Sigstore Authors. @@ -39,7 +39,6 @@ async function readTarget(tuf, targetPath) { }); }); } -exports.readTarget = readTarget; // Returns the local path to the specified target. If the target is not yet // cached locally, the provided TUF Updater will be used to download and // cache the target. diff --git a/deps/npm/node_modules/@sigstore/tuf/package.json b/deps/npm/node_modules/@sigstore/tuf/package.json index fc842df1814700..4eb105f1acf4e6 100644 --- a/deps/npm/node_modules/@sigstore/tuf/package.json +++ b/deps/npm/node_modules/@sigstore/tuf/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/tuf", - "version": "2.3.2", + "version": "3.1.1", "description": "Client for the Sigstore TUF repository", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -28,14 +28,14 @@ }, "devDependencies": { "@sigstore/jest": "^0.0.0", - "@tufjs/repo-mock": "^2.0.0", + "@tufjs/repo-mock": "^3.0.1", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "tuf-js": "^2.2.0" + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/@sigstore/tuf/seeds.json b/deps/npm/node_modules/@sigstore/tuf/seeds.json index e8d97d5fa7a672..04fe4e6ebfcdbe 100644 --- a/deps/npm/node_modules/@sigstore/tuf/seeds.json +++ b/deps/npm/node_modules/@sigstore/tuf/seeds.json @@ -1 +1 @@ -{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewoJInNpZ25lZCI6IHsKCQkiX3R5cGUiOiAicm9vdCIsCgkJInNwZWNfdmVyc2lvbiI6ICIxLjAiLAoJCSJ2ZXJzaW9uIjogOSwKCQkiZXhwaXJlcyI6ICIyMDI0LTA5LTEyVDA2OjUzOjEwWiIsCgkJImtleXMiOiB7CgkJCSIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSIyMzBlMjEyNjE2Mjc0YTQxOTVjZGMyOGU5ZmNlNzgyYzIwZTZjNzIwZjFhODExYjQwZjk4MjI4Mzc2YmRkM2FjIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUxyV3ZOdDk0djRSMDg1RUxlZUNNeEhwN1BsZEZcbjAvVDFHeHVrVWgyT0R1Z2dMR0pFMHBjMWU4Q1NCZjZDUzkxRndvOUZVT3VSc2pCVWxkK1ZxU3lDZFE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSIzYzM0NGFhMDY4ZmQ0Y2M0ZTg3ZGM1MGI2MTJjMDI0MzFmYmM3NzFlOTUwMDM5OTM2ODNhMmIwYmYyNjBjZjBlIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSI5MjNiYjM5ZTYwZGQ2ZmEyYzMxZTZlYTU1NDczYWE5M2I2NGRkNGU1M2UxNmZiZTQyZjZhMjA3ZDNmOTdkZTJkIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJlMmY1OWFjYjk0ODg1MTk0MDdlMThjYmZjOTMyOTUxMGJlMDNjMDRhY2E5OTI5ZDJmMDMwMTM0M2ZlYzg1NTIzIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWluaWtTc0FRbVlrTmVINWVZcS9Dbkl6TGFhY09cbnhsU2Fhd1FET3dxS3kvdENxeHE1eHhQU0pjMjFLNFdJaHM5R3lPa0tmenVlWTNHSUx6Y01KWjRjV3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJlYzgxNjY5NzM0ZTAxNzk5NmM1Yjg1ZjNkMDJjM2RlMWRkNDYzN2ExNTIwMTlmZTFhZjEyNWQyZjkzNjhiOTVlIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJmZGZhODNhMDdiNWE4MzU4OWI4N2RlZDQxZjc3ZjM5ZDIzMmFkOTFmN2NjZTUyODY4ZGFjZDA2YmEwODk4NDlmIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0KCQl9LAoJCSJyb2xlcyI6IHsKCQkJInJvb3QiOiB7CgkJCQkia2V5aWRzIjogWwoJCQkJCSIzYzM0NGFhMDY4ZmQ0Y2M0ZTg3ZGM1MGI2MTJjMDI0MzFmYmM3NzFlOTUwMDM5OTM2ODNhMmIwYmYyNjBjZjBlIiwKCQkJCQkiZWM4MTY2OTczNGUwMTc5OTZjNWI4NWYzZDAyYzNkZTFkZDQ2MzdhMTUyMDE5ZmUxYWYxMjVkMmY5MzY4Yjk1ZSIsCgkJCQkJIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAoJCQkJCSJlMmY1OWFjYjk0ODg1MTk0MDdlMThjYmZjOTMyOTUxMGJlMDNjMDRhY2E5OTI5ZDJmMDMwMTM0M2ZlYzg1NTIzIiwKCQkJCQkiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIKCQkJCV0sCgkJCQkidGhyZXNob2xkIjogMwoJCQl9LAoJCQkic25hcHNob3QiOiB7CgkJCQkia2V5aWRzIjogWwoJCQkJCSIyMzBlMjEyNjE2Mjc0YTQxOTVjZGMyOGU5ZmNlNzgyYzIwZTZjNzIwZjFhODExYjQwZjk4MjI4Mzc2YmRkM2FjIgoJCQkJXSwKCQkJCSJ0aHJlc2hvbGQiOiAxCgkJCX0sCgkJCSJ0YXJnZXRzIjogewoJCQkJImtleWlkcyI6IFsKCQkJCQkiM2MzNDRhYTA2OGZkNGNjNGU4N2RjNTBiNjEyYzAyNDMxZmJjNzcxZTk1MDAzOTkzNjgzYTJiMGJmMjYwY2YwZSIsCgkJCQkJImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAoJCQkJCSIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IiwKCQkJCQkiZTJmNTlhY2I5NDg4NTE5NDA3ZTE4Y2JmYzkzMjk1MTBiZTAzYzA0YWNhOTkyOWQyZjAzMDEzNDNmZWM4NTUyMyIsCgkJCQkJImZkZmE4M2EwN2I1YTgzNTg5Yjg3ZGVkNDFmNzdmMzlkMjMyYWQ5MWY3Y2NlNTI4NjhkYWNkMDZiYTA4OTg0OWYiCgkJCQldLAoJCQkJInRocmVzaG9sZCI6IDMKCQkJfSwKCQkJInRpbWVzdGFtcCI6IHsKCQkJCSJrZXlpZHMiOiBbCgkJCQkJIjkyM2JiMzllNjBkZDZmYTJjMzFlNmVhNTU0NzNhYTkzYjY0ZGQ0ZTUzZTE2ZmJlNDJmNmEyMDdkM2Y5N2RlMmQiCgkJCQldLAoJCQkJInRocmVzaG9sZCI6IDEKCQkJfQoJCX0sCgkJImNvbnNpc3RlbnRfc25hcHNob3QiOiB0cnVlCgl9LAoJInNpZ25hdHVyZXMiOiBbCgkJewoJCQkia2V5aWQiOiAiZmY1MWUxN2ZjZjI1MzExOWI3MDMzZjZmNTc1MTI2MzFkYTRhMDk2OTQ0MmFmY2Y5ZmM4YjE0MWM3ZjJiZTk5YyIsCgkJCSJzaWciOiAiMzA0NTAyMjEwMDhiNzhmODk0YzNjZmVkM2JkNDg2Mzc5YzRlMGUwZGZiM2U3ZGQ4Y2JjNGQ1NTk4ZDI4MThlZWExYmEzYzc1NTAwMjIwMjlkM2QwNmU4OWQwNGQzNzg0OTk4NWRjNDZjMGUxMGRjNWIxZmM2OGRjNzBhZjFlYzk5MTAzMDNhMWYzZWUyZiIKCQl9LAoJCXsKCQkJImtleWlkIjogIjI1YTBlYjQ1MGZkM2VlMmJkNzkyMThjOTYzZGNlM2YxY2M2MTE4YmFkZjI1MWJmMTQ5ZjBiZDA3ZDVjYWJlOTkiLAoJCQkic2lnIjogIjMwNDUwMjIxMDA5ZTZiOTBiOTM1ZTA5YjgzN2E5MGQ0NDAyZWFhMjdkNWVhMjZlYjc4OTE5NDhiYTBlZDcwOTA4NDEyNDhmNDM2MDIyMDAzZGMyMjUxYzRkNGE3OTk5YjkxZTlhZDA4Njg3NjVhZTA5YWM3MjY5Mjc5ZjJhNzg5OWJhZmVmN2EyZDkyNjAiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICJmNTMxMmY1NDJjMjEyNzNkOTQ4NWE0OTM5NDM4NmM0NTc1ODA0NzcwNjY3ZjJkZGI1OWIzYmYwNjY5ZmRkZDJmIiwKCQkJInNpZyI6ICIzMDQ0MDIyMDA5OWU5MDdkY2Y5MGI3YjZlMTA5ZmQxZDZlNDQyMDA2ZmNjYmI0ODg5NGFhYWZmNDdhYjgyNGIwM2ZiMzVkMGQwMjIwMmFhMGEwNmMyMWE0MjMzZjM3OTAwYTQ4YmM4Nzc3ZDNiNDdmNTllM2EzODYxNmNlNjMxYTA0ZGY1N2Y5NjczNiIKCQl9LAoJCXsKCQkJImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAoJCQkic2lnIjogIjMwNDUwMjIxMDA4Yjc4Zjg5NGMzY2ZlZDNiZDQ4NjM3OWM0ZTBlMGRmYjNlN2RkOGNiYzRkNTU5OGQyODE4ZWVhMWJhM2M3NTUwMDIyMDI5ZDNkMDZlODlkMDRkMzc4NDk5ODVkYzQ2YzBlMTBkYzViMWZjNjhkYzcwYWYxZWM5OTEwMzAzYTFmM2VlMmYiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICJlYzgxNjY5NzM0ZTAxNzk5NmM1Yjg1ZjNkMDJjM2RlMWRkNDYzN2ExNTIwMTlmZTFhZjEyNWQyZjkzNjhiOTVlIiwKCQkJInNpZyI6ICIzMDQ1MDIyMTAwOWU2YjkwYjkzNWUwOWI4MzdhOTBkNDQwMmVhYTI3ZDVlYTI2ZWI3ODkxOTQ4YmEwZWQ3MDkwODQxMjQ4ZjQzNjAyMjAwM2RjMjI1MWM0ZDRhNzk5OWI5MWU5YWQwODY4NzY1YWUwOWFjNzI2OTI3OWYyYTc4OTliYWZlZjdhMmQ5MjYwIgoJCX0sCgkJewoJCQkia2V5aWQiOiAiZTJmNTlhY2I5NDg4NTE5NDA3ZTE4Y2JmYzkzMjk1MTBiZTAzYzA0YWNhOTkyOWQyZjAzMDEzNDNmZWM4NTUyMyIsCgkJCSJzaWciOiAiMzA0NTAyMjAwZTU2MTNiOTAxZTBmM2UwOGVjZWFiZGRjNzNmOThiNTBkZGY4OTJlOTk4ZDBiMzY5YzZlM2Q0NTFhYzQ4ODc1MDIyMTAwOTQwY2Y5MmQxZjQzZWUyZTVjZGJiMjI1NzJiYjUyOTI1ZWQzODYzYTY4OGY3ZmZkZDRiZDJlMmU1NmYwMjhiMyIKCQl9LAoJCXsKCQkJImtleWlkIjogIjJlNjFjZDBjYmY0YThmNDU4MDliZGE5ZjdmNzhjMGQzM2FkMTE4NDJmZjk0YWUzNDA4NzNlMjY2NGRjODQzZGUiLAoJCQkic2lnIjogIjMwNDUwMjIwMmNmZjQ0ZjIyMTVkN2E0N2IyOGI4ZjVmNTgwYzJjZmJiZDFiZmNmY2JiZTc4ZGUzMjMwNDViMmMwYmFkYzVlOTAyMjEwMGM3NDM5NDllYjNmNGVhNWE0YjlhZTI3YWM2ZWRkZWExZjBmZjliZmQwMDRmOGE5YTlkMThjNmU0MTQyYjZlNzUiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IiwKCQkJInNpZyI6ICIzMDQ0MDIyMDA5OWU5MDdkY2Y5MGI3YjZlMTA5ZmQxZDZlNDQyMDA2ZmNjYmI0ODg5NGFhYWZmNDdhYjgyNGIwM2ZiMzVkMGQwMjIwMmFhMGEwNmMyMWE0MjMzZjM3OTAwYTQ4YmM4Nzc3ZDNiNDdmNTllM2EzODYxNmNlNjMxYTA0ZGY1N2Y5NjczNiIKCQl9LAoJCXsKCQkJImtleWlkIjogImZkZmE4M2EwN2I1YTgzNTg5Yjg3ZGVkNDFmNzdmMzlkMjMyYWQ5MWY3Y2NlNTI4NjhkYWNkMDZiYTA4OTg0OWYiLAoJCQkic2lnIjogIjMwNDUwMjIwMmNmZjQ0ZjIyMTVkN2E0N2IyOGI4ZjVmNTgwYzJjZmJiZDFiZmNmY2JiZTc4ZGUzMjMwNDViMmMwYmFkYzVlOTAyMjEwMGM3NDM5NDllYjNmNGVhNWE0YjlhZTI3YWM2ZWRkZWExZjBmZjliZmQwMDRmOGE5YTlkMThjNmU0MTQyYjZlNzUiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICI3Zjc1MTNiMjU0MjlhNjQ0NzNlMTBjZTNhZDJmM2RhMzcyYmJkZDE0YjY1ZDA3YmJhZjU0N2U3YzhiYmJlNjJiIiwKCQkJInNpZyI6ICIzMDQ1MDIyMDBlNTYxM2I5MDFlMGYzZTA4ZWNlYWJkZGM3M2Y5OGI1MGRkZjg5MmU5OThkMGIzNjljNmUzZDQ1MWFjNDg4NzUwMjIxMDA5NDBjZjkyZDFmNDNlZTJlNWNkYmIyMjU3MmJiNTI5MjVlZDM4NjNhNjg4ZjdmZmRkNGJkMmUyZTU2ZjAyOGIzIgoJCX0KCV0KfQ==","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEyLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} +{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiIgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGIwYmNmMTg5Y2UxYjkzZTdkYjk2NDlkNWJlNTEyYTE4ODBjMGUzNTg4NzBlMzkzM2U0MjZjNWFmYjhhNDA2MTAwMjIwNmQyMTRiZDc5YjA5ZjQ1OGNjYzUyMWEyOTBhYTk2MGM0MTcwMTRmYzE2ZTYwNmY4MjA5MWI1ZTMxODE0ODg2YSIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIiIKICB9LAogIHsKICAgImtleWlkIjogIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiLAogICAic2lnIjogIjMwNDUwMjIxMDBhOWI5ZTI5NGVjMjFiNjJkZmNhNmExNmExOWQwODQxODJjMTI1NzJlMzNkOWM0ZGNhYjUzMTdmYTFlOGE0NTlkMDIyMDY5ZjY4ZTU1ZWExZjk1YzVhMzY3YWFjN2E2MWE2NTc1N2Y5M2RhNWEwMDZhNWY0ZDFjZjk5NWJlODEyZDc2MDIiCiAgfSwKICB7CiAgICJrZXlpZCI6ICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIiwKICAgInNpZyI6ICIzMDQ0MDIyMDc4MTE3OGVjMzkxNWNiMTZhY2E3NTdkNDBlMjg0MzVhYzUzNzhkNmI0ODdhY2IxMTFkMWVlYjMzOTM5N2Y3OWEwMjIwNzgxY2NlNDhhZTQ2ZjllNDdiOTdhODQxNGZjZjQ2NmE5ODY3MjZhNTg5NmM3MmEwZTRhYmEzMTYyY2I4MjZkZCIKICB9CiBdLAogInNpZ25lZCI6IHsKICAiX3R5cGUiOiAicm9vdCIsCiAgImNvbnNpc3RlbnRfc25hcHNob3QiOiB0cnVlLAogICJleHBpcmVzIjogIjIwMjUtMDgtMTlUMTQ6MzM6MDlaIiwKICAia2V5cyI6IHsKICAgIjBjODc0MzJjM2JmMDlmZDk5MTg5ZmRjMzJmYTVlYWVkZjRlNGE1ZmFjN2JhYjczZmEwNGEyZTBmYzY0YWY2ZjUiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXUmlHcjUraiszSjVTc0grWnRyNW5FMkgyd083XG5CVituTzNzOTNnTGNhMThxVE96SFkxb1d5QUdEeWtNU3NHVFVCU3Q5RCtBbjBLZktzRDJtZlNNNDJRPT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2ktb25saW5lLXVyaSI6ICJnY3BrbXM6cHJvamVjdHMvc2lnc3RvcmUtcm9vdC1zaWduaW5nL2xvY2F0aW9ucy9nbG9iYWwva2V5UmluZ3Mvcm9vdC9jcnlwdG9LZXlzL3RpbWVzdGFtcC9jcnlwdG9LZXlWZXJzaW9ucy8xIgogICB9LAogICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAc2FudGlhZ290b3JyZXMiCiAgIH0sCiAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaW5pa1NzQVFtWWtOZUg1ZVlxL0NuSXpMYWFjT1xueGxTYWF3UURPd3FLeS90Q3F4cTV4eFBTSmMyMUs0V0loczlHeU9rS2Z6dWVZM0dJTHpjTUpaNGNXdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBib2JjYWxsYXdheSIKICAgfSwKICAgIjZmMjYwMDg5ZDU5MjNkYWYyMDE2NmNhNjU3YzU0M2FmNjE4MzQ2YWI5NzE4ODRhOTk5NjJiMDE5ODhiYmUwYzMiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV5OFhLc21oQllESThKYzBHd3pCeGVLYXgwY201XG5TVEtFVTY1SFBGdW5VbjQxc1Q4cGkwRmpNNElrSHovWVVtd21MVU8wV3Q3bHhoajZCa0xJSzRxWUF3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGRsb3JlbmMiCiAgIH0sCiAgICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFMGdocmg5Mkx3MVlyM2lkR1Y1V3FDdE1EQjhDeFxuK0Q4aGRDNHcyWkxOSXBsVlJvVkdMc2tZYTNnaGVNeU9qaUo4a1BpMTVhUTIvLzdQK29qN1V2SlBHdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBqb3NodWFnbCIKICAgfSwKICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVFWHN6M1NaWEZiOGpNVjQyajZwSmx5amJqUjhLXG5OM0J3b2NleHE2TE1JYjVxc1dLT1F2TE4xNk5VZWZMYzRIc3dPb3VtUnNWVmFhalNwUVM2Zm9ia1J3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQG1ubTY3OCIKICAgfQogIH0sCiAgInJvbGVzIjogewogICAicm9vdCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjZmMjYwMDg5ZDU5MjNkYWYyMDE2NmNhNjU3YzU0M2FmNjE4MzQ2YWI5NzE4ODRhOTk5NjJiMDE5ODhiYmUwYzMiLAogICAgICJlNzFhNTRkNTQzODM1YmE4NmFkYWQ5NDYwMzc5Yzc2NDFmYjg3MjZkMTY0ZWE3NjY4MDFhMWM1MjJhYmE3ZWEyIiwKICAgICAiMjJmNGNhZWM2ZDhlNmY5NTU1YWY2NmIzZDRjM2NiMDZhM2JiMjNmZGM3ZTM5YzkxNmM2MWY0NjJlNmY1MmIwNiIsCiAgICAgIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiLAogICAgICJhNjg3ZTViZjRmYWI4MmIwZWU1OGQ0NmUwNWM5NTM1MTQ1YTJjOWFmYjQ1OGY0M2Q0MmI0NWNhMGZkY2UyYTcwIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAzCiAgIH0sCiAgICJzbmFwc2hvdCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjBjODc0MzJjM2JmMDlmZDk5MTg5ZmRjMzJmYTVlYWVkZjRlNGE1ZmFjN2JhYjczZmEwNGEyZTBmYzY0YWY2ZjUiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDEsCiAgICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDM2NTAsCiAgICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiAzNjUKICAgfSwKICAgInRhcmdldHMiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI2ZjI2MDA4OWQ1OTIzZGFmMjAxNjZjYTY1N2M1NDNhZjYxODM0NmFiOTcxODg0YTk5OTYyYjAxOTg4YmJlMGMzIiwKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMwogICB9LAogICAidGltZXN0YW1wIjogewogICAgImtleWlkcyI6IFsKICAgICAiMGM4NzQzMmMzYmYwOWZkOTkxODlmZGMzMmZhNWVhZWRmNGU0YTVmYWM3YmFiNzNmYTA0YTJlMGZjNjRhZjZmNSIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMSwKICAgICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogNywKICAgICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDYKICAgfQogIH0sCiAgInNwZWNfdmVyc2lvbiI6ICIxLjAiLAogICJ2ZXJzaW9uIjogMTIsCiAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiAxOTcsCiAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogNDYKIH0KfQ==","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXQp9Cg==","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js deleted file mode 100644 index 193f875fd1014e..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DSSESignatureContent = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const core_1 = require("@sigstore/core"); -class DSSESignatureContent { - constructor(env) { - this.env = env; - } - compareDigest(digest) { - return core_1.crypto.bufferEqual(digest, core_1.crypto.hash(this.env.payload)); - } - compareSignature(signature) { - return core_1.crypto.bufferEqual(signature, this.signature); - } - verifySignature(key) { - return core_1.crypto.verify(this.preAuthEncoding, key, this.signature); - } - get signature() { - return this.env.signatures.length > 0 - ? this.env.signatures[0].sig - : Buffer.from(''); - } - // DSSE Pre-Authentication Encoding - get preAuthEncoding() { - return core_1.dsse.preAuthEncoding(this.env.payloadType, this.env.payload); - } -} -exports.DSSESignatureContent = DSSESignatureContent; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js deleted file mode 100644 index 63f8d4c4998811..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.signatureContent = exports.toSignedEntity = void 0; -const core_1 = require("@sigstore/core"); -const dsse_1 = require("./dsse"); -const message_1 = require("./message"); -function toSignedEntity(bundle, artifact) { - const { tlogEntries, timestampVerificationData } = bundle.verificationMaterial; - const timestamps = []; - for (const entry of tlogEntries) { - timestamps.push({ - $case: 'transparency-log', - tlogEntry: entry, - }); - } - for (const ts of timestampVerificationData?.rfc3161Timestamps ?? []) { - timestamps.push({ - $case: 'timestamp-authority', - timestamp: core_1.RFC3161Timestamp.parse(ts.signedTimestamp), - }); - } - return { - signature: signatureContent(bundle, artifact), - key: key(bundle), - tlogEntries, - timestamps, - }; -} -exports.toSignedEntity = toSignedEntity; -function signatureContent(bundle, artifact) { - switch (bundle.content.$case) { - case 'dsseEnvelope': - return new dsse_1.DSSESignatureContent(bundle.content.dsseEnvelope); - case 'messageSignature': - return new message_1.MessageSignatureContent(bundle.content.messageSignature, artifact); - } -} -exports.signatureContent = signatureContent; -function key(bundle) { - switch (bundle.verificationMaterial.content.$case) { - case 'publicKey': - return { - $case: 'public-key', - hint: bundle.verificationMaterial.content.publicKey.hint, - }; - case 'x509CertificateChain': - return { - $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.x509CertificateChain - .certificates[0].rawBytes), - }; - case 'certificate': - return { - $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.certificate.rawBytes), - }; - } -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/key/index.js b/deps/npm/node_modules/@sigstore/verify/dist/key/index.js deleted file mode 100644 index 682a306803a991..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/key/index.js +++ /dev/null @@ -1,72 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyCertificate = exports.verifyPublicKey = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const certificate_1 = require("./certificate"); -const sct_1 = require("./sct"); -const OID_FULCIO_ISSUER_V1 = '1.3.6.1.4.1.57264.1.1'; -const OID_FULCIO_ISSUER_V2 = '1.3.6.1.4.1.57264.1.8'; -function verifyPublicKey(hint, timestamps, trustMaterial) { - const key = trustMaterial.publicKey(hint); - timestamps.forEach((timestamp) => { - if (!key.validFor(timestamp)) { - throw new error_1.VerificationError({ - code: 'PUBLIC_KEY_ERROR', - message: `Public key is not valid for timestamp: ${timestamp.toISOString()}`, - }); - } - }); - return { key: key.publicKey }; -} -exports.verifyPublicKey = verifyPublicKey; -function verifyCertificate(leaf, timestamps, trustMaterial) { - // Check that leaf certificate chains to a trusted CA - const path = (0, certificate_1.verifyCertificateChain)(leaf, trustMaterial.certificateAuthorities); - // Check that ALL certificates are valid for ALL of the timestamps - const validForDate = timestamps.every((timestamp) => path.every((cert) => cert.validForDate(timestamp))); - if (!validForDate) { - throw new error_1.VerificationError({ - code: 'CERTIFICATE_ERROR', - message: 'certificate is not valid or expired at the specified date', - }); - } - return { - scts: (0, sct_1.verifySCTs)(path[0], path[1], trustMaterial.ctlogs), - signer: getSigner(path[0]), - }; -} -exports.verifyCertificate = verifyCertificate; -function getSigner(cert) { - let issuer; - const issuerExtension = cert.extension(OID_FULCIO_ISSUER_V2); - if (issuerExtension) { - issuer = issuerExtension.valueObj.subs?.[0]?.value.toString('ascii'); - } - else { - issuer = cert.extension(OID_FULCIO_ISSUER_V1)?.value.toString('ascii'); - } - const identity = { - extensions: { issuer }, - subjectAlternativeName: cert.subjectAltName, - }; - return { - key: core_1.crypto.createPublicKey(cert.publicKey), - identity, - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/policy.js b/deps/npm/node_modules/@sigstore/verify/dist/policy.js deleted file mode 100644 index 731e5c83328475..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/policy.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyExtensions = exports.verifySubjectAlternativeName = void 0; -const error_1 = require("./error"); -function verifySubjectAlternativeName(policyIdentity, signerIdentity) { - if (signerIdentity === undefined || !signerIdentity.match(policyIdentity)) { - throw new error_1.PolicyError({ - code: 'UNTRUSTED_SIGNER_ERROR', - message: `certificate identity error - expected ${policyIdentity}, got ${signerIdentity}`, - }); - } -} -exports.verifySubjectAlternativeName = verifySubjectAlternativeName; -function verifyExtensions(policyExtensions, signerExtensions = {}) { - let key; - for (key in policyExtensions) { - if (signerExtensions[key] !== policyExtensions[key]) { - throw new error_1.PolicyError({ - code: 'UNTRUSTED_SIGNER_ERROR', - message: `invalid certificate extension - expected ${key}=${policyExtensions[key]}, got ${key}=${signerExtensions[key]}`, - }); - } - } -} -exports.verifyExtensions = verifyExtensions; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js deleted file mode 100644 index 0da554f648d25e..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogTimestamp = exports.verifyTSATimestamp = void 0; -const error_1 = require("../error"); -const checkpoint_1 = require("./checkpoint"); -const merkle_1 = require("./merkle"); -const set_1 = require("./set"); -const tsa_1 = require("./tsa"); -function verifyTSATimestamp(timestamp, data, timestampAuthorities) { - (0, tsa_1.verifyRFC3161Timestamp)(timestamp, data, timestampAuthorities); - return { - type: 'timestamp-authority', - logID: timestamp.signerSerialNumber, - timestamp: timestamp.signingTime, - }; -} -exports.verifyTSATimestamp = verifyTSATimestamp; -function verifyTLogTimestamp(entry, tlogAuthorities) { - let inclusionVerified = false; - if (isTLogEntryWithInclusionPromise(entry)) { - (0, set_1.verifyTLogSET)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (isTLogEntryWithInclusionProof(entry)) { - (0, merkle_1.verifyMerkleInclusion)(entry); - (0, checkpoint_1.verifyCheckpoint)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (!inclusionVerified) { - throw new error_1.VerificationError({ - code: 'TLOG_MISSING_INCLUSION_ERROR', - message: 'inclusion could not be verified', - }); - } - return { - type: 'transparency-log', - logID: entry.logId.keyId, - timestamp: new Date(Number(entry.integratedTime) * 1000), - }; -} -exports.verifyTLogTimestamp = verifyTLogTimestamp; -function isTLogEntryWithInclusionPromise(entry) { - return entry.inclusionPromise !== undefined; -} -function isTLogEntryWithInclusionProof(entry) { - return entry.inclusionProof !== undefined; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js deleted file mode 100644 index a6357c06999cba..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogSET = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const trust_1 = require("../trust"); -// Verifies the SET for the given entry against the list of trusted -// transparency logs. Returns true if the SET can be verified against at least -// one of the trusted logs; otherwise, returns false. -function verifyTLogSET(entry, tlogs) { - // Filter the list of tlog instances to only those which might be able to - // verify the SET - const validTLogs = (0, trust_1.filterTLogAuthorities)(tlogs, { - logID: entry.logId.keyId, - targetDate: new Date(Number(entry.integratedTime) * 1000), - }); - // Check to see if we can verify the SET against any of the valid tlogs - const verified = validTLogs.some((tlog) => { - // Re-create the original Rekor verification payload - const payload = toVerificationPayload(entry); - // Canonicalize the payload and turn into a buffer for verification - const data = Buffer.from(core_1.json.canonicalize(payload), 'utf8'); - // Extract the SET from the tlog entry - const signature = entry.inclusionPromise.signedEntryTimestamp; - return core_1.crypto.verify(data, tlog.publicKey, signature); - }); - if (!verified) { - throw new error_1.VerificationError({ - code: 'TLOG_INCLUSION_PROMISE_ERROR', - message: 'inclusion promise could not be verified', - }); - } -} -exports.verifyTLogSET = verifyTLogSET; -// Returns a properly formatted "VerificationPayload" for one of the -// transaction log entires in the given bundle which can be used for SET -// verification. -function toVerificationPayload(entry) { - const { integratedTime, logIndex, logId, canonicalizedBody } = entry; - return { - body: canonicalizedBody.toString('base64'), - integratedTime: Number(integratedTime), - logIndex: Number(logIndex), - logID: logId.keyId.toString('hex'), - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js deleted file mode 100644 index 7b095bc3a7f908..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js +++ /dev/null @@ -1,74 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyRFC3161Timestamp = void 0; -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const certificate_1 = require("../key/certificate"); -const trust_1 = require("../trust"); -function verifyRFC3161Timestamp(timestamp, data, timestampAuthorities) { - const signingTime = timestamp.signingTime; - // Filter for CAs which were valid at the time of signing - timestampAuthorities = (0, trust_1.filterCertAuthorities)(timestampAuthorities, { - start: signingTime, - end: signingTime, - }); - // Filter for CAs which match serial and issuer embedded in the timestamp - timestampAuthorities = filterCAsBySerialAndIssuer(timestampAuthorities, { - serialNumber: timestamp.signerSerialNumber, - issuer: timestamp.signerIssuer, - }); - // Check that we can verify the timestamp with AT LEAST ONE of the remaining - // CAs - const verified = timestampAuthorities.some((ca) => { - try { - verifyTimestampForCA(timestamp, data, ca); - return true; - } - catch (e) { - return false; - } - }); - if (!verified) { - throw new error_1.VerificationError({ - code: 'TIMESTAMP_ERROR', - message: 'timestamp could not be verified', - }); - } -} -exports.verifyRFC3161Timestamp = verifyRFC3161Timestamp; -function verifyTimestampForCA(timestamp, data, ca) { - const [leaf, ...cas] = ca.certChain; - const signingKey = core_1.crypto.createPublicKey(leaf.publicKey); - const signingTime = timestamp.signingTime; - // Verify the certificate chain for the provided CA - try { - new certificate_1.CertificateChainVerifier({ - untrustedCert: leaf, - trustedCerts: cas, - }).verify(); - } - catch (e) { - throw new error_1.VerificationError({ - code: 'TIMESTAMP_ERROR', - message: 'invalid certificate chain', - }); - } - // Check that all of the CA certs were valid at the time of signing - const validAtSigningTime = ca.certChain.every((cert) => cert.validForDate(signingTime)); - if (!validAtSigningTime) { - throw new error_1.VerificationError({ - code: 'TIMESTAMP_ERROR', - message: 'timestamp was signed with an expired certificate', - }); - } - // Check that the signing certificate's key can be used to verify the - // timestamp signature. - timestamp.verify(data, signingKey); -} -// Filters the list of CAs to those which have a leaf signing certificate which -// matches the given serial number and issuer. -function filterCAsBySerialAndIssuer(timestampAuthorities, criteria) { - return timestampAuthorities.filter((ca) => ca.certChain.length > 0 && - core_1.crypto.bufferEqual(ca.certChain[0].serialNumber, criteria.serialNumber) && - core_1.crypto.bufferEqual(ca.certChain[0].issuer, criteria.issuer)); -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js deleted file mode 100644 index bf430e61dde563..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyDSSETLogBody = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const error_1 = require("../error"); -// Compare the given intoto tlog entry to the given bundle -function verifyDSSETLogBody(tlogEntry, content) { - switch (tlogEntry.apiVersion) { - case '0.0.1': - return verifyDSSE001TLogBody(tlogEntry, content); - default: - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `unsupported dsse version: ${tlogEntry.apiVersion}`, - }); - } -} -exports.verifyDSSETLogBody = verifyDSSETLogBody; -// Compare the given dsse v0.0.1 tlog entry to the given DSSE envelope. -function verifyDSSE001TLogBody(tlogEntry, content) { - // Ensure the bundle's DSSE only contains a single signature - if (tlogEntry.spec.signatures?.length !== 1) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'signature count mismatch', - }); - } - const tlogSig = tlogEntry.spec.signatures[0].signature; - // Ensure that the signature in the bundle's DSSE matches tlog entry - if (!content.compareSignature(Buffer.from(tlogSig, 'base64'))) - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'tlog entry signature mismatch', - }); - // Ensure the digest of the bundle's DSSE payload matches the digest in the - // tlog entry - const tlogHash = tlogEntry.spec.payloadHash?.value || ''; - if (!content.compareDigest(Buffer.from(tlogHash, 'hex'))) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'DSSE payload hash mismatch', - }); - } -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js deleted file mode 100644 index d1758858f030d8..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyHashedRekordTLogBody = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const error_1 = require("../error"); -// Compare the given hashedrekord tlog entry to the given bundle -function verifyHashedRekordTLogBody(tlogEntry, content) { - switch (tlogEntry.apiVersion) { - case '0.0.1': - return verifyHashedrekord001TLogBody(tlogEntry, content); - default: - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `unsupported hashedrekord version: ${tlogEntry.apiVersion}`, - }); - } -} -exports.verifyHashedRekordTLogBody = verifyHashedRekordTLogBody; -// Compare the given hashedrekord v0.0.1 tlog entry to the given message -// signature -function verifyHashedrekord001TLogBody(tlogEntry, content) { - // Ensure that the bundles message signature matches the tlog entry - const tlogSig = tlogEntry.spec.signature.content || ''; - if (!content.compareSignature(Buffer.from(tlogSig, 'base64'))) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'signature mismatch', - }); - } - // Ensure that the bundle's message digest matches the tlog entry - const tlogDigest = tlogEntry.spec.data.hash?.value || ''; - if (!content.compareDigest(Buffer.from(tlogDigest, 'hex'))) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'digest mismatch', - }); - } -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js deleted file mode 100644 index adfc70ed51ad05..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogBody = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const error_1 = require("../error"); -const dsse_1 = require("./dsse"); -const hashedrekord_1 = require("./hashedrekord"); -const intoto_1 = require("./intoto"); -// Verifies that the given tlog entry matches the supplied signature content. -function verifyTLogBody(entry, sigContent) { - const { kind, version } = entry.kindVersion; - const body = JSON.parse(entry.canonicalizedBody.toString('utf8')); - if (kind !== body.kind || version !== body.apiVersion) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `kind/version mismatch - expected: ${kind}/${version}, received: ${body.kind}/${body.apiVersion}`, - }); - } - switch (body.kind) { - case 'dsse': - return (0, dsse_1.verifyDSSETLogBody)(body, sigContent); - case 'intoto': - return (0, intoto_1.verifyIntotoTLogBody)(body, sigContent); - case 'hashedrekord': - return (0, hashedrekord_1.verifyHashedRekordTLogBody)(body, sigContent); - /* istanbul ignore next */ - default: - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `unsupported kind: ${kind}`, - }); - } -} -exports.verifyTLogBody = verifyTLogBody; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js b/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js deleted file mode 100644 index 7991f351949a00..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toTrustMaterial = exports.filterTLogAuthorities = exports.filterCertAuthorities = void 0; -/* -Copyright 2023 The Sigstore Authors. - -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. -*/ -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const BEGINNING_OF_TIME = new Date(0); -const END_OF_TIME = new Date(8640000000000000); -var filter_1 = require("./filter"); -Object.defineProperty(exports, "filterCertAuthorities", { enumerable: true, get: function () { return filter_1.filterCertAuthorities; } }); -Object.defineProperty(exports, "filterTLogAuthorities", { enumerable: true, get: function () { return filter_1.filterTLogAuthorities; } }); -function toTrustMaterial(root, keys) { - const keyFinder = typeof keys === 'function' ? keys : keyLocator(keys); - return { - certificateAuthorities: root.certificateAuthorities.map(createCertAuthority), - timestampAuthorities: root.timestampAuthorities.map(createCertAuthority), - tlogs: root.tlogs.map(createTLogAuthority), - ctlogs: root.ctlogs.map(createTLogAuthority), - publicKey: keyFinder, - }; -} -exports.toTrustMaterial = toTrustMaterial; -function createTLogAuthority(tlogInstance) { - return { - logID: tlogInstance.logId.keyId, - publicKey: core_1.crypto.createPublicKey(tlogInstance.publicKey.rawBytes), - validFor: { - start: tlogInstance.publicKey.validFor?.start || BEGINNING_OF_TIME, - end: tlogInstance.publicKey.validFor?.end || END_OF_TIME, - }, - }; -} -function createCertAuthority(ca) { - return { - certChain: ca.certChain.certificates.map((cert) => { - return core_1.X509Certificate.parse(cert.rawBytes); - }), - validFor: { - start: ca.validFor?.start || BEGINNING_OF_TIME, - end: ca.validFor?.end || END_OF_TIME, - }, - }; -} -function keyLocator(keys) { - return (hint) => { - const key = (keys || {})[hint]; - if (!key) { - throw new error_1.VerificationError({ - code: 'PUBLIC_KEY_ERROR', - message: `key not found: ${hint}`, - }); - } - return { - publicKey: core_1.crypto.createPublicKey(key.rawBytes), - validFor: (date) => { - return ((key.validFor?.start || BEGINNING_OF_TIME) <= date && - (key.validFor?.end || END_OF_TIME) >= date); - }, - }; - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/package.json b/deps/npm/node_modules/@sigstore/verify/package.json deleted file mode 100644 index dcfb587e084a6c..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@sigstore/verify", - "version": "1.1.0", - "description": "Verification of Sigstore signatures", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/verify#readme", - "publishConfig": { - "provenance": true - }, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.0", - "@sigstore/bundle": "^2.2.0", - "@sigstore/core": "^1.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@tufjs/models/dist/base.js b/deps/npm/node_modules/@tufjs/models/dist/base.js deleted file mode 100644 index 259f6799c13a0d..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/dist/base.js +++ /dev/null @@ -1,83 +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.Signed = exports.isMetadataKind = exports.MetadataKind = void 0; -const util_1 = __importDefault(require("util")); -const error_1 = require("./error"); -const utils_1 = require("./utils"); -const SPECIFICATION_VERSION = ['1', '0', '31']; -var MetadataKind; -(function (MetadataKind) { - MetadataKind["Root"] = "root"; - MetadataKind["Timestamp"] = "timestamp"; - MetadataKind["Snapshot"] = "snapshot"; - MetadataKind["Targets"] = "targets"; -})(MetadataKind || (exports.MetadataKind = MetadataKind = {})); -function isMetadataKind(value) { - return (typeof value === 'string' && - Object.values(MetadataKind).includes(value)); -} -exports.isMetadataKind = isMetadataKind; -/*** - * A base class for the signed part of TUF metadata. - * - * Objects with base class Signed are usually included in a ``Metadata`` object - * on the signed attribute. This class provides attributes and methods that - * are common for all TUF metadata types (roles). - */ -class Signed { - constructor(options) { - this.specVersion = options.specVersion || SPECIFICATION_VERSION.join('.'); - const specList = this.specVersion.split('.'); - if (!(specList.length === 2 || specList.length === 3) || - !specList.every((item) => isNumeric(item))) { - throw new error_1.ValueError('Failed to parse specVersion'); - } - // major version must match - if (specList[0] != SPECIFICATION_VERSION[0]) { - throw new error_1.ValueError('Unsupported specVersion'); - } - this.expires = options.expires || new Date().toISOString(); - this.version = options.version || 1; - this.unrecognizedFields = options.unrecognizedFields || {}; - } - equals(other) { - if (!(other instanceof Signed)) { - return false; - } - return (this.specVersion === other.specVersion && - this.expires === other.expires && - this.version === other.version && - util_1.default.isDeepStrictEqual(this.unrecognizedFields, other.unrecognizedFields)); - } - isExpired(referenceTime) { - if (!referenceTime) { - referenceTime = new Date(); - } - return referenceTime >= new Date(this.expires); - } - static commonFieldsFromJSON(data) { - const { spec_version, expires, version, ...rest } = data; - if (utils_1.guard.isDefined(spec_version) && !(typeof spec_version === 'string')) { - throw new TypeError('spec_version must be a string'); - } - if (utils_1.guard.isDefined(expires) && !(typeof expires === 'string')) { - throw new TypeError('expires must be a string'); - } - if (utils_1.guard.isDefined(version) && !(typeof version === 'number')) { - throw new TypeError('version must be a number'); - } - return { - specVersion: spec_version, - expires, - version, - unrecognizedFields: rest, - }; - } -} -exports.Signed = Signed; -function isNumeric(str) { - return !isNaN(Number(str)); -} diff --git a/deps/npm/node_modules/@tufjs/models/package.json b/deps/npm/node_modules/@tufjs/models/package.json deleted file mode 100644 index 60368242ab556a..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@tufjs/models", - "version": "2.0.0", - "description": "TUF metadata models", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "tsc --build", - "clean": "rm -rf dist && rm tsconfig.tsbuildinfo", - "test": "jest" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/theupdateframework/tuf-js.git" - }, - "keywords": [ - "tuf", - "security", - "update" - ], - "author": "bdehamer@github.com", - "license": "MIT", - "bugs": { - "url": "https://github.com/theupdateframework/tuf-js/issues" - }, - "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/models#readme", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/abbrev/lib/index.js b/deps/npm/node_modules/abbrev/lib/index.js index 9f48801f049c9e..f7bee0c6fc7ada 100644 --- a/deps/npm/node_modules/abbrev/lib/index.js +++ b/deps/npm/node_modules/abbrev/lib/index.js @@ -1,7 +1,10 @@ module.exports = abbrev function abbrev (...args) { - let list = args.length === 1 || Array.isArray(args[0]) ? args[0] : 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]) diff --git a/deps/npm/node_modules/abbrev/package.json b/deps/npm/node_modules/abbrev/package.json index e26400445631ad..077d4bccd0e69e 100644 --- a/deps/npm/node_modules/abbrev/package.json +++ b/deps/npm/node_modules/abbrev/package.json @@ -1,26 +1,27 @@ { "name": "abbrev", - "version": "2.0.0", + "version": "3.0.1", "description": "Like ruby's abbrev module, but in js", "author": "GitHub Inc.", "main": "lib/index.js", "scripts": { "test": "tap", - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "postlint": "template-oss-check", "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "snap": "tap", - "posttest": "npm run lint" + "posttest": "npm run lint", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "repository": { "type": "git", - "url": "https://github.com/npm/abbrev-js.git" + "url": "git+https://github.com/npm/abbrev-js.git" }, "license": "ISC", "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.24.3", "tap": "^16.3.0" }, "tap": { @@ -34,10 +35,11 @@ "lib/" ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "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.8.0" + "version": "4.24.3", + "publish": true } } diff --git a/deps/npm/node_modules/agent-base/dist/index.js b/deps/npm/node_modules/agent-base/dist/index.js index 69396356e74db7..c3c4099c73c027 100644 --- a/deps/npm/node_modules/agent-base/dist/index.js +++ b/deps/npm/node_modules/agent-base/dist/index.js @@ -133,8 +133,13 @@ class Agent extends http.Agent { .then((socket) => { this.decrementSockets(name, fakeSocket); if (socket instanceof http.Agent) { - // @ts-expect-error `addRequest()` isn't defined in `@types/node` - return socket.addRequest(req, connectOpts); + try { + // @ts-expect-error `addRequest()` isn't defined in `@types/node` + return socket.addRequest(req, connectOpts); + } + catch (err) { + return cb(err); + } } this[INTERNAL].currentSocket = socket; // @ts-expect-error `createSocket()` isn't defined in `@types/node` diff --git a/deps/npm/node_modules/agent-base/package.json b/deps/npm/node_modules/agent-base/package.json index 8e95171707fef1..175ee71fb70eae 100644 --- a/deps/npm/node_modules/agent-base/package.json +++ b/deps/npm/node_modules/agent-base/package.json @@ -1,6 +1,6 @@ { "name": "agent-base", - "version": "7.1.1", + "version": "7.1.3", "description": "Turn a function into an `http.Agent` instance", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -21,9 +21,6 @@ ], "author": "Nathan Rajlich (http://n8.io/)", "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, "devDependencies": { "@types/debug": "^4.1.7", "@types/jest": "^29.5.1", @@ -34,7 +31,7 @@ "jest": "^29.5.0", "ts-jest": "^29.1.0", "typescript": "^5.0.4", - "ws": "^3.3.3", + "ws": "^5.2.4", "tsconfig": "0.0.0" }, "engines": { diff --git a/deps/npm/node_modules/aggregate-error/index.js b/deps/npm/node_modules/aggregate-error/index.js deleted file mode 100644 index ba5bf022116855..00000000000000 --- a/deps/npm/node_modules/aggregate-error/index.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; -const indentString = require('indent-string'); -const cleanStack = require('clean-stack'); - -const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); - -class AggregateError extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); - } - - errors = [...errors].map(error => { - if (error instanceof Error) { - return error; - } - - if (error !== null && typeof error === 'object') { - // Handle plain error objects with message property and/or possibly other metadata - return Object.assign(new Error(error.message), error); - } - - return new Error(error); - }); - - let message = errors - .map(error => { - // The `stack` property is not standardized, so we can't assume it exists - return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); - }) - .join('\n'); - message = '\n' + indentString(message, 4); - super(message); - - this.name = 'AggregateError'; - - Object.defineProperty(this, '_errors', {value: errors}); - } - - * [Symbol.iterator]() { - for (const error of this._errors) { - yield error; - } - } -} - -module.exports = AggregateError; diff --git a/deps/npm/node_modules/aggregate-error/license b/deps/npm/node_modules/aggregate-error/license deleted file mode 100644 index e7af2f77107d73..00000000000000 --- a/deps/npm/node_modules/aggregate-error/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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/node_modules/aggregate-error/package.json b/deps/npm/node_modules/aggregate-error/package.json deleted file mode 100644 index 74fcc37611e642..00000000000000 --- a/deps/npm/node_modules/aggregate-error/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "aggregate-error", - "version": "3.1.0", - "description": "Create an error from multiple errors", - "license": "MIT", - "repository": "sindresorhus/aggregate-error", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "aggregate", - "error", - "combine", - "multiple", - "many", - "collection", - "iterable", - "iterator" - ], - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "devDependencies": { - "ava": "^2.4.0", - "tsd": "^0.7.1", - "xo": "^0.25.3" - } -} diff --git a/deps/npm/node_modules/are-we-there-yet/LICENSE.md b/deps/npm/node_modules/are-we-there-yet/LICENSE.md deleted file mode 100644 index 845be76f64e789..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -ISC License - -Copyright 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 NPM DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -EVENT SHALL NPM 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/are-we-there-yet/lib/index.js b/deps/npm/node_modules/are-we-there-yet/lib/index.js deleted file mode 100644 index 57d8743fdad177..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/lib/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict' -exports.TrackerGroup = require('./tracker-group.js') -exports.Tracker = require('./tracker.js') -exports.TrackerStream = require('./tracker-stream.js') diff --git a/deps/npm/node_modules/are-we-there-yet/lib/tracker-base.js b/deps/npm/node_modules/are-we-there-yet/lib/tracker-base.js deleted file mode 100644 index 1b5e0dc30c49bb..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/lib/tracker-base.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' -const EventEmitter = require('events') - -let trackerId = 0 -class TrackerBase extends EventEmitter { - constructor (name) { - super() - this.id = ++trackerId - this.name = name - } -} - -module.exports = TrackerBase diff --git a/deps/npm/node_modules/are-we-there-yet/lib/tracker-group.js b/deps/npm/node_modules/are-we-there-yet/lib/tracker-group.js deleted file mode 100644 index 162c22584cdc53..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/lib/tracker-group.js +++ /dev/null @@ -1,112 +0,0 @@ -'use strict' -const TrackerBase = require('./tracker-base.js') -const Tracker = require('./tracker.js') -const TrackerStream = require('./tracker-stream.js') - -class TrackerGroup extends TrackerBase { - parentGroup = null - trackers = [] - completion = {} - weight = {} - totalWeight = 0 - finished = false - bubbleChange = bubbleChange(this) - - nameInTree () { - var names = [] - var from = this - while (from) { - names.unshift(from.name) - from = from.parentGroup - } - return names.join('/') - } - - addUnit (unit, weight) { - if (unit.addUnit) { - var toTest = this - while (toTest) { - if (unit === toTest) { - throw new Error( - 'Attempted to add tracker group ' + - unit.name + ' to tree that already includes it ' + - this.nameInTree(this)) - } - toTest = toTest.parentGroup - } - unit.parentGroup = this - } - this.weight[unit.id] = weight || 1 - this.totalWeight += this.weight[unit.id] - this.trackers.push(unit) - this.completion[unit.id] = unit.completed() - unit.on('change', this.bubbleChange) - if (!this.finished) { - this.emit('change', unit.name, this.completion[unit.id], unit) - } - return unit - } - - completed () { - if (this.trackers.length === 0) { - return 0 - } - var valPerWeight = 1 / this.totalWeight - var completed = 0 - for (var ii = 0; ii < this.trackers.length; ii++) { - var trackerId = this.trackers[ii].id - completed += - valPerWeight * this.weight[trackerId] * this.completion[trackerId] - } - return completed - } - - newGroup (name, weight) { - return this.addUnit(new TrackerGroup(name), weight) - } - - newItem (name, todo, weight) { - return this.addUnit(new Tracker(name, todo), weight) - } - - newStream (name, todo, weight) { - return this.addUnit(new TrackerStream(name, todo), weight) - } - - finish () { - this.finished = true - if (!this.trackers.length) { - this.addUnit(new Tracker(), 1, true) - } - for (var ii = 0; ii < this.trackers.length; ii++) { - var tracker = this.trackers[ii] - tracker.finish() - tracker.removeListener('change', this.bubbleChange) - } - this.emit('change', this.name, 1, this) - } - - debug (depth = 0) { - const indent = ' '.repeat(depth) - let output = `${indent}${this.name || 'top'}: ${this.completed()}\n` - - this.trackers.forEach(function (tracker) { - output += tracker instanceof TrackerGroup - ? tracker.debug(depth + 1) - : `${indent} ${tracker.name}: ${tracker.completed()}\n` - }) - return output - } -} - -function bubbleChange (trackerGroup) { - return function (name, completed, tracker) { - trackerGroup.completion[tracker.id] = completed - if (trackerGroup.finished) { - return - } - trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup) - } -} - -module.exports = TrackerGroup diff --git a/deps/npm/node_modules/are-we-there-yet/lib/tracker-stream.js b/deps/npm/node_modules/are-we-there-yet/lib/tracker-stream.js deleted file mode 100644 index 75e44df309150f..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/lib/tracker-stream.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' -const stream = require('stream') -const Tracker = require('./tracker.js') - -class TrackerStream extends stream.Transform { - constructor (name, size, options) { - super(options) - this.tracker = new Tracker(name, size) - this.name = name - this.id = this.tracker.id - this.tracker.on('change', this.trackerChange.bind(this)) - } - - trackerChange (name, completion) { - this.emit('change', name, completion, this) - } - - _transform (data, encoding, cb) { - this.tracker.completeWork(data.length ? data.length : 1) - this.push(data) - cb() - } - - _flush (cb) { - this.tracker.finish() - cb() - } - - completed () { - return this.tracker.completed() - } - - addWork (work) { - return this.tracker.addWork(work) - } - - finish () { - return this.tracker.finish() - } -} - -module.exports = TrackerStream diff --git a/deps/npm/node_modules/are-we-there-yet/lib/tracker.js b/deps/npm/node_modules/are-we-there-yet/lib/tracker.js deleted file mode 100644 index 02e879ce6e3e26..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/lib/tracker.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict' -const TrackerBase = require('./tracker-base.js') - -class Tracker extends TrackerBase { - constructor (name, todo) { - super(name) - this.workDone = 0 - this.workTodo = todo || 0 - } - - completed () { - return this.workTodo === 0 ? 0 : this.workDone / this.workTodo - } - - addWork (work) { - this.workTodo += work - this.emit('change', this.name, this.completed(), this) - } - - completeWork (work) { - this.workDone += work - if (this.workDone > this.workTodo) { - this.workDone = this.workTodo - } - this.emit('change', this.name, this.completed(), this) - } - - finish () { - this.workTodo = this.workDone = 1 - this.emit('change', this.name, 1, this) - } -} - -module.exports = Tracker diff --git a/deps/npm/node_modules/are-we-there-yet/package.json b/deps/npm/node_modules/are-we-there-yet/package.json deleted file mode 100644 index f072a21abb444b..00000000000000 --- a/deps/npm/node_modules/are-we-there-yet/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "are-we-there-yet", - "version": "4.0.2", - "description": "Keep track of the overall completion of many disparate processes", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "postsnap": "npm run lintfix --", - "snap": "tap", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/are-we-there-yet.git" - }, - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/are-we-there-yet/issues" - }, - "homepage": "https://github.com/npm/are-we-there-yet", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "tap": "^16.0.1" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "tap": { - "branches": 68, - "statements": 92, - "functions": 86, - "lines": 92, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": true - } -} diff --git a/deps/npm/node_modules/bin-links/lib/link-gently.js b/deps/npm/node_modules/bin-links/lib/link-gently.js index d1e955ec99b029..a39d3bced57b13 100644 --- a/deps/npm/node_modules/bin-links/lib/link-gently.js +++ b/deps/npm/node_modules/bin-links/lib/link-gently.js @@ -6,10 +6,16 @@ const { resolve, dirname } = require('path') const { lstat, mkdir, readlink, rm, symlink } = require('fs/promises') -const throwNonEnoent = er => { - if (er.code !== 'ENOENT') { - throw er +const { log } = require('proc-log') +const throwSignificant = er => { + if (er.code === 'ENOENT') { + return } + if (er.code === 'EACCES') { + log.warn('error adding file', er.message) + return + } + throw er } const rmOpts = { @@ -37,8 +43,8 @@ const linkGently = async ({ path, to, from, absFrom, force }) => { // or at least a warning, but npm has always behaved this // way in the past, so it'd be a breaking change return Promise.all([ - lstat(absFrom).catch(throwNonEnoent), - lstat(to).catch(throwNonEnoent), + lstat(absFrom).catch(throwSignificant), + lstat(to).catch(throwSignificant), ]).then(([stFrom, stTo]) => { // not present in package, skip it if (!stFrom) { diff --git a/deps/npm/node_modules/bin-links/lib/shim-bin.js b/deps/npm/node_modules/bin-links/lib/shim-bin.js index d5e19c0f9617fe..67e2702702f0a8 100644 --- a/deps/npm/node_modules/bin-links/lib/shim-bin.js +++ b/deps/npm/node_modules/bin-links/lib/shim-bin.js @@ -17,7 +17,7 @@ const fixBin = require('./fix-bin.js') // nondeterminism. const seen = new Set() -const failEEXIST = ({ path, to, from }) => +const failEEXIST = ({ to, from }) => Promise.reject(Object.assign(new Error('EEXIST: file already exists'), { path: to, dest: from, diff --git a/deps/npm/node_modules/bin-links/package.json b/deps/npm/node_modules/bin-links/package.json index d5c11f7971f942..22858d660ae0b9 100644 --- a/deps/npm/node_modules/bin-links/package.json +++ b/deps/npm/node_modules/bin-links/package.json @@ -1,20 +1,21 @@ { "name": "bin-links", - "version": "4.0.3", + "version": "5.0.0", "description": "JavaScript package binary linker", "main": "./lib/index.js", "scripts": { "snap": "tap", "test": "tap", - "lint": "eslint \"**/*.js\"", + "lint": "npm run eslint", "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", + "lintfix": "npm run eslint -- --fix", "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, "repository": { "type": "git", - "url": "https://github.com/npm/bin-links.git" + "url": "git+https://github.com/npm/bin-links.git" }, "keywords": [ "npm", @@ -23,14 +24,15 @@ ], "license": "ISC", "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" + "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" }, "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.19.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", "require-inject": "^1.4.4", "tap": "^16.0.1" }, @@ -47,13 +49,13 @@ "lib/" ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.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.19.0", + "version": "4.23.3", "publish": true } } diff --git a/deps/npm/node_modules/brace-expansion/index.js b/deps/npm/node_modules/brace-expansion/index.js index 6c06dafcfb6e05..254ca75dd9aba2 100644 --- a/deps/npm/node_modules/brace-expansion/index.js +++ b/deps/npm/node_modules/brace-expansion/index.js @@ -116,7 +116,7 @@ function expand(str, isTop) { var isOptions = m.body.indexOf(',') >= 0; if (!isSequence && !isOptions) { // {a},b} - if (m.post.match(/,.*\}/)) { + if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } diff --git a/deps/npm/node_modules/brace-expansion/package.json b/deps/npm/node_modules/brace-expansion/package.json index 7097d41e39de5d..c7eee34511002a 100644 --- a/deps/npm/node_modules/brace-expansion/package.json +++ b/deps/npm/node_modules/brace-expansion/package.json @@ -1,7 +1,7 @@ { "name": "brace-expansion", "description": "Brace expansion as known from sh/bash", - "version": "2.0.1", + "version": "2.0.2", "repository": { "type": "git", "url": "git://github.com/juliangruber/brace-expansion.git" @@ -42,5 +42,8 @@ "iphone/6.0..latest", "android-browser/4.2..latest" ] + }, + "publishConfig": { + "tag": "2.x" } } diff --git a/deps/npm/node_modules/builtins/License b/deps/npm/node_modules/builtins/License deleted file mode 100644 index b142e5dc081331..00000000000000 --- a/deps/npm/node_modules/builtins/License +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2015 Julian Gruber - -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/node_modules/builtins/index.js b/deps/npm/node_modules/builtins/index.js deleted file mode 100644 index b715278437cbcf..00000000000000 --- a/deps/npm/node_modules/builtins/index.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const semver = require('semver') - -const permanentModules = [ - 'assert', - 'buffer', - 'child_process', - 'cluster', - 'console', - 'constants', - 'crypto', - 'dgram', - 'dns', - 'domain', - 'events', - 'fs', - 'http', - 'https', - 'module', - 'net', - 'os', - 'path', - 'punycode', - 'querystring', - 'readline', - 'repl', - 'stream', - 'string_decoder', - 'sys', - 'timers', - 'tls', - 'tty', - 'url', - 'util', - 'vm', - 'zlib' -] - -const versionLockedModules = { - freelist: '<6.0.0', - v8: '>=1.0.0', - process: '>=1.1.0', - inspector: '>=8.0.0', - async_hooks: '>=8.1.0', - http2: '>=8.4.0', - perf_hooks: '>=8.5.0', - trace_events: '>=10.0.0', - worker_threads: '>=12.0.0', - 'node:test': '>=18.0.0' -} - -const experimentalModules = { - worker_threads: '>=10.5.0', - wasi: '>=12.16.0', - diagnostics_channel: '^14.17.0 || >=15.1.0' -} - -module.exports = ({ version = process.version, experimental = false } = {}) => { - const builtins = [...permanentModules] - - for (const [name, semverRange] of Object.entries(versionLockedModules)) { - if (version === '*' || semver.satisfies(version, semverRange)) { - builtins.push(name) - } - } - - if (experimental) { - for (const [name, semverRange] of Object.entries(experimentalModules)) { - if ( - !builtins.includes(name) && - (version === '*' || semver.satisfies(version, semverRange)) - ) { - builtins.push(name) - } - } - } - - return builtins -} diff --git a/deps/npm/node_modules/builtins/package.json b/deps/npm/node_modules/builtins/package.json deleted file mode 100644 index 1c43660c7483fe..00000000000000 --- a/deps/npm/node_modules/builtins/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "builtins", - "version": "5.0.1", - "description": "List of node.js builtin modules", - "repository": "juliangruber/builtins", - "license": "MIT", - "main": "index.js", - "files": [], - "scripts": { - "test": "prettier-standard && standard && node-core-test" - }, - "dependencies": { - "semver": "^7.0.0" - }, - "devDependencies": { - "node-core-test": "^1.4.0", - "prettier-standard": "^15.0.1", - "standard": "^14.3.4" - } -} diff --git a/deps/npm/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/cacache/lib/content/read.js index a1fa8a08cc0f93..5f6192c3cec566 100644 --- a/deps/npm/node_modules/cacache/lib/content/read.js +++ b/deps/npm/node_modules/cacache/lib/content/read.js @@ -71,7 +71,7 @@ function readStream (cache, integrity, opts = {}) { module.exports.copy = copy function copy (cache, integrity, dest) { - return withContentSri(cache, integrity, (cpath, sri) => { + return withContentSri(cache, integrity, (cpath) => { return fs.copyFile(cpath, dest) }) } diff --git a/deps/npm/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/cacache/lib/content/write.js index 09ca4e4e5a4d3f..e7187abca8788a 100644 --- a/deps/npm/node_modules/cacache/lib/content/write.js +++ b/deps/npm/node_modules/cacache/lib/content/write.js @@ -160,7 +160,7 @@ async function makeTmp (cache, opts) { } } -async function moveToDestination (tmp, cache, sri, opts) { +async function moveToDestination (tmp, cache, sri) { const destination = contentPath(cache, sri) const destDir = path.dirname(destination) if (moveOperations.has(destination)) { diff --git a/deps/npm/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/cacache/lib/entry-index.js index 722a37af5ce157..0e09b10818d097 100644 --- a/deps/npm/node_modules/cacache/lib/entry-index.js +++ b/deps/npm/node_modules/cacache/lib/entry-index.js @@ -19,6 +19,8 @@ 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}`) @@ -181,16 +183,17 @@ function lsStream (cache) { // 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 Promise.all(buckets.map(async (bucket) => { + await pMap(buckets, async (bucket) => { const bucketPath = path.join(indexDir, bucket) const subbuckets = await readdirOrEmpty(bucketPath) - await Promise.all(subbuckets.map(async (subbucket) => { + await pMap(subbuckets, async (subbucket) => { const subbucketPath = path.join(bucketPath, subbucket) // "/cachename//./*" const subbucketEntries = await readdirOrEmpty(subbucketPath) - await Promise.all(subbucketEntries.map(async (entry) => { + await pMap(subbucketEntries, async (entry) => { const entryPath = path.join(subbucketPath, entry) try { const entries = await bucketEntries(entryPath) @@ -213,9 +216,12 @@ function lsStream (cache) { } throw err } - })) - })) - })) + }, + { concurrency: lsStreamConcurrency }) + }, + { concurrency: lsStreamConcurrency }) + }, + { concurrency: lsStreamConcurrency }) stream.end() return stream }).catch(err => stream.emit('error', err)) @@ -240,7 +246,7 @@ async function bucketEntries (bucket, filter) { return _bucketEntries(data, filter) } -function _bucketEntries (data, filter) { +function _bucketEntries (data) { const entries = [] data.split('\n').forEach((entry) => { if (!entry) { diff --git a/deps/npm/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/cacache/lib/verify.js index 62e85c946490fc..dcff3aa73f3173 100644 --- a/deps/npm/node_modules/cacache/lib/verify.js +++ b/deps/npm/node_modules/cacache/lib/verify.js @@ -8,7 +8,6 @@ const { truncate, writeFile, } = require('fs/promises') -const pMap = require('p-map') const contentPath = require('./content/path') const fsm = require('fs-minipass') const glob = require('./util/glob.js') @@ -68,11 +67,11 @@ async function verify (cache, opts) { return stats } -async function markStartTime (cache, opts) { +async function markStartTime () { return { startTime: new Date() } } -async function markEndTime (cache, opts) { +async function markEndTime () { return { endTime: new Date() } } @@ -93,6 +92,7 @@ async function fixPerms (cache, opts) { // 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) => { @@ -176,6 +176,7 @@ async function verifyContent (filepath, sri) { 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, @@ -213,7 +214,7 @@ async function rebuildIndex (cache, opts) { return stats } -async function rebuildBucket (cache, bucket, stats, opts) { +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. diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/LICENSE.md b/deps/npm/node_modules/cacache/node_modules/chownr/LICENSE.md new file mode 100644 index 00000000000000..881248b6d7f0ca --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/LICENSE.md @@ -0,0 +1,63 @@ +All packages under `src/` are licensed according to the terms in +their respective `LICENSE` or `LICENSE.md` files. + +The remainder of this project is licensed under the Blue Oak +Model License, as follows: + +----- + +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/index.js b/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/index.js new file mode 100644 index 00000000000000..6a7b68d5eac26e --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/index.js @@ -0,0 +1,93 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.chownrSync = exports.chownr = void 0; +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const lchownSync = (path, uid, gid) => { + try { + return node_fs_1.default.lchownSync(path, uid, gid); + } + catch (er) { + if (er?.code !== 'ENOENT') + throw er; + } +}; +const chown = (cpath, uid, gid, cb) => { + node_fs_1.default.lchown(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er?.code !== 'ENOENT' ? er : null); + }); +}; +const chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + (0, exports.chownr)(node_path_1.default.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } + else { + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + } +}; +const chownr = (p, uid, gid, cb) => { + node_fs_1.default.readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb(); + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er) => { + /* c8 ignore start */ + if (errState) + return; + /* c8 ignore stop */ + if (er) + return cb((errState = er)); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); + } + }); +}; +exports.chownr = chownr; +const chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + (0, exports.chownrSync)(node_path_1.default.resolve(p, child.name), uid, gid); + lchownSync(node_path_1.default.resolve(p, child.name), uid, gid); +}; +const chownrSync = (p, uid, gid) => { + let children; + try { + children = node_fs_1.default.readdirSync(p, { withFileTypes: true }); + } + catch (er) { + const e = er; + if (e?.code === 'ENOENT') + return; + else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP') + return lchownSync(p, uid, gid); + else + throw e; + } + for (const child of children) { + chownrKidSync(p, child, uid, gid); + } + return lchownSync(p, uid, gid); +}; +exports.chownrSync = chownrSync; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/package.json b/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/package.json new file mode 100644 index 00000000000000..5bbefffbabee39 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/index.js b/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/index.js new file mode 100644 index 00000000000000..5c2815297a67cb --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/index.js @@ -0,0 +1,85 @@ +import fs from 'node:fs'; +import path from 'node:path'; +const lchownSync = (path, uid, gid) => { + try { + return fs.lchownSync(path, uid, gid); + } + catch (er) { + if (er?.code !== 'ENOENT') + throw er; + } +}; +const chown = (cpath, uid, gid, cb) => { + fs.lchown(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er?.code !== 'ENOENT' ? er : null); + }); +}; +const chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = path.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } + else { + const cpath = path.resolve(p, child.name); + chown(cpath, uid, gid, cb); + } +}; +export const chownr = (p, uid, gid, cb) => { + fs.readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb(); + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er) => { + /* c8 ignore start */ + if (errState) + return; + /* c8 ignore stop */ + if (er) + return cb((errState = er)); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); + } + }); +}; +const chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid); + lchownSync(path.resolve(p, child.name), uid, gid); +}; +export const chownrSync = (p, uid, gid) => { + let children; + try { + children = fs.readdirSync(p, { withFileTypes: true }); + } + catch (er) { + const e = er; + if (e?.code === 'ENOENT') + return; + else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP') + return lchownSync(p, uid, gid); + else + throw e; + } + for (const child of children) { + chownrKidSync(p, child, uid, gid); + } + return lchownSync(p, uid, gid); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/package.json b/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/cacache/node_modules/chownr/package.json b/deps/npm/node_modules/cacache/node_modules/chownr/package.json new file mode 100644 index 00000000000000..09aa6b2e2e576d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/chownr/package.json @@ -0,0 +1,69 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "chownr", + "description": "like `chown -R`", + "version": "3.0.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/chownr.git" + }, + "files": [ + "dist" + ], + "devDependencies": { + "@types/node": "^20.12.5", + "mkdirp": "^3.0.1", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "tap": "^18.7.2", + "tshy": "^1.13.1", + "typedoc": "^0.25.12" + }, + "scripts": { + "prepare": "tshy", + "pretest": "npm run prepare", + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --loglevel warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.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" + } + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "type": "module", + "prettier": { + "semi": false, + "printWidth": 75, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + } +} diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/LICENSE b/deps/npm/node_modules/cacache/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000000000..0a034db7a73b5d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2023 James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me) + +This project is free software released under the MIT license: + +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/node_modules/cacache/node_modules/mkdirp/dist/cjs/package.json b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/package.json new file mode 100644 index 00000000000000..9d04a66e16cd93 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/package.json @@ -0,0 +1,91 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "3.0.1", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "bin": "./dist/cjs/src/bin.js", + "main": "./dist/cjs/src/index.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 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" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.0", + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "prettier": "^2.8.2", + "tap": "^16.3.3", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "repository": { + "type": "git", + "url": "https://github.com/isaacs/node-mkdirp.git" + }, + "license": "MIT", + "engines": { + "node": ">=10" + } +} diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts new file mode 100644 index 00000000000000..34e005228653c8 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env node +export {}; +//# sourceMappingURL=bin.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map new file mode 100644 index 00000000000000..c10c656ec75109 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js new file mode 100755 index 00000000000000..757aae1fd96cb2 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const package_json_1 = require("../package.json"); +const usage = () => ` +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories + that don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m If a directory needs to be created, set the mode as an octal + --mode= permission string. + + -v --version Print the mkdirp version number + + -h --help Print this helpful banner + + -p --print Print the first directories created for each path provided + + --manual Use manual implementation, even if native is available +`; +const dirs = []; +const opts = {}; +let doPrint = false; +let dashdash = false; +let manual = false; +for (const arg of process.argv.slice(2)) { + if (dashdash) + dirs.push(arg); + else if (arg === '--') + dashdash = true; + else if (arg === '--manual') + manual = true; + else if (/^-h/.test(arg) || /^--help/.test(arg)) { + console.log(usage()); + process.exit(0); + } + else if (arg === '-v' || arg === '--version') { + console.log(package_json_1.version); + process.exit(0); + } + else if (arg === '-p' || arg === '--print') { + doPrint = true; + } + else if (/^-m/.test(arg) || /^--mode=/.test(arg)) { + // these don't get covered in CI, but work locally + // weird because the tests below show as passing in the output. + /* c8 ignore start */ + const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8); + if (isNaN(mode)) { + console.error(`invalid mode argument: ${arg}\nMust be an octal number.`); + process.exit(1); + } + /* c8 ignore stop */ + opts.mode = mode; + } + else + dirs.push(arg); +} +const index_js_1 = require("./index.js"); +const impl = manual ? index_js_1.mkdirp.manual : index_js_1.mkdirp; +if (dirs.length === 0) { + console.error(usage()); +} +// these don't get covered in CI, but work locally +/* c8 ignore start */ +Promise.all(dirs.map(dir => impl(dir, opts))) + .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null)) + .catch(er => { + console.error(er.message); + if (er.code) + console.error(' code: ' + er.code); + process.exit(1); +}); +/* c8 ignore stop */ +//# sourceMappingURL=bin.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js.map new file mode 100644 index 00000000000000..d99295301b5fa7 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { version } from '../package.json'\nimport { MkdirpOptions } from './opts-arg.js'\n\nconst usage = () => `\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories\n that don't yet exist.\n\n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m If a directory needs to be created, set the mode as an octal\n --mode= permission string.\n\n -v --version Print the mkdirp version number\n\n -h --help Print this helpful banner\n\n -p --print Print the first directories created for each path provided\n\n --manual Use manual implementation, even if native is available\n`\n\nconst dirs: string[] = []\nconst opts: MkdirpOptions = {}\nlet doPrint: boolean = false\nlet dashdash = false\nlet manual = false\nfor (const arg of process.argv.slice(2)) {\n if (dashdash) dirs.push(arg)\n else if (arg === '--') dashdash = true\n else if (arg === '--manual') manual = true\n else if (/^-h/.test(arg) || /^--help/.test(arg)) {\n console.log(usage())\n process.exit(0)\n } else if (arg === '-v' || arg === '--version') {\n console.log(version)\n process.exit(0)\n } else if (arg === '-p' || arg === '--print') {\n doPrint = true\n } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {\n // these don't get covered in CI, but work locally\n // weird because the tests below show as passing in the output.\n /* c8 ignore start */\n const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)\n if (isNaN(mode)) {\n console.error(`invalid mode argument: ${arg}\\nMust be an octal number.`)\n process.exit(1)\n }\n /* c8 ignore stop */\n opts.mode = mode\n } else dirs.push(arg)\n}\n\nimport { mkdirp } from './index.js'\nconst impl = manual ? mkdirp.manual : mkdirp\nif (dirs.length === 0) {\n console.error(usage())\n}\n\n// these don't get covered in CI, but work locally\n/* c8 ignore start */\nPromise.all(dirs.map(dir => impl(dir, opts)))\n .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null))\n .catch(er => {\n console.error(er.message)\n if (er.code) console.error(' code: ' + er.code)\n process.exit(1)\n })\n/* c8 ignore stop */\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts new file mode 100644 index 00000000000000..e47794b3bb72a3 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts @@ -0,0 +1,4 @@ +import { MkdirpOptionsResolved } from './opts-arg.js'; +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise; +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string; +//# sourceMappingURL=find-made.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map new file mode 100644 index 00000000000000..00d5d1a4dbefdf --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js new file mode 100644 index 00000000000000..e831ef27cadc1d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.findMadeSync = exports.findMade = void 0; +const path_1 = require("path"); +const findMade = async (opts, parent, path) => { + // we never want the 'made' return value to be a root directory + if (path === parent) { + return; + } + return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later + // will fail later + er => { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMade)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + }); +}; +exports.findMade = findMade; +const findMadeSync = (opts, parent, path) => { + if (path === parent) { + return undefined; + } + try { + return opts.statSync(parent).isDirectory() ? path : undefined; + } + catch (er) { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMadeSync)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + } +}; +exports.findMadeSync = findMadeSync; +//# sourceMappingURL=find-made.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js.map new file mode 100644 index 00000000000000..30a0d66398878d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAGvB,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB;AAEM,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,oBAAY,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA;AAjBY,QAAA,YAAY,gBAiBxB","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): Promise => {\n // we never want the 'made' return value to be a root directory\n if (path === parent) {\n return\n }\n\n return opts.statAsync(parent).then(\n st => (st.isDirectory() ? path : undefined), // will fail later\n er => {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMade(opts, dirname(parent), parent)\n : undefined\n }\n )\n}\n\nexport const findMadeSync = (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): undefined | string => {\n if (path === parent) {\n return undefined\n }\n\n try {\n return opts.statSync(parent).isDirectory() ? path : undefined\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMadeSync(opts, dirname(parent), parent)\n : undefined\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts new file mode 100644 index 00000000000000..fc9e43b3a45de1 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts @@ -0,0 +1,39 @@ +import { MkdirpOptions } from './opts-arg.js'; +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +}; +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +}; +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & { + mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; + mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + sync: (path: string, opts?: MkdirpOptions) => string | void; + native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + useNative: ((opts?: MkdirpOptions | undefined) => boolean) & { + sync: (opts?: MkdirpOptions | undefined) => boolean; + }; + useNativeSync: (opts?: MkdirpOptions | undefined) => boolean; +}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000000000..0e915bbc9a0c7a --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js new file mode 100644 index 00000000000000..ab9dc62cddda36 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirp = exports.nativeSync = exports.native = exports.manualSync = exports.manual = exports.sync = exports.mkdirpSync = exports.useNativeSync = exports.useNative = exports.mkdirpNativeSync = exports.mkdirpNative = exports.mkdirpManualSync = exports.mkdirpManual = void 0; +const mkdirp_manual_js_1 = require("./mkdirp-manual.js"); +const mkdirp_native_js_1 = require("./mkdirp-native.js"); +const opts_arg_js_1 = require("./opts-arg.js"); +const path_arg_js_1 = require("./path-arg.js"); +const use_native_js_1 = require("./use-native.js"); +/* c8 ignore start */ +var mkdirp_manual_js_2 = require("./mkdirp-manual.js"); +Object.defineProperty(exports, "mkdirpManual", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManual; } }); +Object.defineProperty(exports, "mkdirpManualSync", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManualSync; } }); +var mkdirp_native_js_2 = require("./mkdirp-native.js"); +Object.defineProperty(exports, "mkdirpNative", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNative; } }); +Object.defineProperty(exports, "mkdirpNativeSync", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNativeSync; } }); +var use_native_js_2 = require("./use-native.js"); +Object.defineProperty(exports, "useNative", { enumerable: true, get: function () { return use_native_js_2.useNative; } }); +Object.defineProperty(exports, "useNativeSync", { enumerable: true, get: function () { return use_native_js_2.useNativeSync; } }); +/* c8 ignore stop */ +const mkdirpSync = (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNativeSync)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNativeSync)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManualSync)(path, resolved); +}; +exports.mkdirpSync = mkdirpSync; +exports.sync = exports.mkdirpSync; +exports.manual = mkdirp_manual_js_1.mkdirpManual; +exports.manualSync = mkdirp_manual_js_1.mkdirpManualSync; +exports.native = mkdirp_native_js_1.mkdirpNative; +exports.nativeSync = mkdirp_native_js_1.mkdirpNativeSync; +exports.mkdirp = Object.assign(async (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNative)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNative)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManual)(path, resolved); +}, { + mkdirpSync: exports.mkdirpSync, + mkdirpNative: mkdirp_native_js_1.mkdirpNative, + mkdirpNativeSync: mkdirp_native_js_1.mkdirpNativeSync, + mkdirpManual: mkdirp_manual_js_1.mkdirpManual, + mkdirpManualSync: mkdirp_manual_js_1.mkdirpManualSync, + sync: exports.mkdirpSync, + native: mkdirp_native_js_1.mkdirpNative, + nativeSync: mkdirp_native_js_1.mkdirpNativeSync, + manual: mkdirp_manual_js_1.mkdirpManual, + manualSync: mkdirp_manual_js_1.mkdirpManualSync, + useNative: use_native_js_1.useNative, + useNativeSync: use_native_js_1.useNativeSync, +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js.map new file mode 100644 index 00000000000000..fdb572677a98ef --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAmE;AACnE,yDAAmE;AACnE,+CAAsD;AACtD,+CAAuC;AACvC,mDAA0D;AAC1D,qBAAqB;AACrB,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,iDAA0D;AAAjD,0GAAA,SAAS,OAAA;AAAE,8GAAA,aAAa,OAAA;AACjC,oBAAoB;AAEb,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,6BAAa,EAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AANY,QAAA,UAAU,cAMtB;AAEY,QAAA,IAAI,GAAG,kBAAU,CAAA;AACjB,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,yBAAS,EAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU,EAAV,kBAAU;IACV,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAChB,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAEhB,IAAI,EAAE,kBAAU;IAChB,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,SAAS,EAAT,yBAAS;IACT,aAAa,EAAb,6BAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNativeSync(resolved)\n ? mkdirpNativeSync(path, resolved)\n : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n async (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNative(resolved)\n ? mkdirpNative(path, resolved)\n : mkdirpManual(path, resolved)\n },\n {\n mkdirpSync,\n mkdirpNative,\n mkdirpNativeSync,\n mkdirpManual,\n mkdirpManualSync,\n\n sync: mkdirpSync,\n native: mkdirpNative,\n nativeSync: mkdirpNativeSync,\n manual: mkdirpManual,\n manualSync: mkdirpManualSync,\n useNative,\n useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts new file mode 100644 index 00000000000000..e49cdf9f1bd122 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & { + sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +}; +//# sourceMappingURL=mkdirp-manual.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map new file mode 100644 index 00000000000000..9301bab1ffb35b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js new file mode 100644 index 00000000000000..d9bd1d8bb5a49b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirpManual = exports.mkdirpManualSync = void 0; +const path_1 = require("path"); +const opts_arg_js_1 = require("./opts-arg.js"); +const mkdirpManualSync = (path, options, made) => { + const parent = (0, path_1.dirname)(path); + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: false }; + if (parent === path) { + try { + return opts.mkdirSync(path, opts); + } + catch (er) { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + return; + } + } + try { + opts.mkdirSync(path, opts); + return made || path; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManualSync)(path, opts, (0, exports.mkdirpManualSync)(parent, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { + throw er; + } + try { + if (!opts.statSync(path).isDirectory()) + throw er; + } + catch (_) { + throw er; + } + } +}; +exports.mkdirpManualSync = mkdirpManualSync; +exports.mkdirpManual = Object.assign(async (path, options, made) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = false; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirAsync(path, opts).catch(er => { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + }); + } + return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManual)(parent, opts).then((made) => (0, exports.mkdirpManual)(path, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { + throw er; + } + return opts.statAsync(path).then(st => { + if (st.isDirectory()) { + return made; + } + else { + throw er; + } + }, () => { + throw er; + }); + }); +}, { sync: exports.mkdirpManualSync }); +//# sourceMappingURL=mkdirp-manual.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map new file mode 100644 index 00000000000000..ff7ba24dca32ad --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n): string | undefined | void => {\n const parent = dirname(path)\n const opts = { ...optsArg(options), recursive: false }\n\n if (parent === path) {\n try {\n return opts.mkdirSync(path, opts)\n } catch (er) {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n return\n }\n }\n\n try {\n opts.mkdirSync(path, opts)\n return made || path\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n }\n if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n throw er\n }\n try {\n if (!opts.statSync(path).isDirectory()) throw er\n } catch (_) {\n throw er\n }\n }\n}\n\nexport const mkdirpManual = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n ): Promise => {\n const opts = optsArg(options)\n opts.recursive = false\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirAsync(path, opts).catch(er => {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n })\n }\n\n return opts.mkdirAsync(path, opts).then(\n () => made || path,\n async er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(parent, opts).then(\n (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n )\n }\n if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n throw er\n }\n return opts.statAsync(path).then(\n st => {\n if (st.isDirectory()) {\n return made\n } else {\n throw er\n }\n },\n () => {\n throw er\n }\n )\n }\n )\n },\n { sync: mkdirpManualSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts new file mode 100644 index 00000000000000..28b64814b2545a --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined; +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & { + sync: (path: string, options?: MkdirpOptions) => string | void | undefined; +}; +//# sourceMappingURL=mkdirp-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map new file mode 100644 index 00000000000000..379c0f6591c686 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js new file mode 100644 index 00000000000000..9f00567d7cc200 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirpNative = exports.mkdirpNativeSync = void 0; +const path_1 = require("path"); +const find_made_js_1 = require("./find-made.js"); +const mkdirp_manual_js_1 = require("./mkdirp-manual.js"); +const opts_arg_js_1 = require("./opts-arg.js"); +const mkdirpNativeSync = (path, options) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = true; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirSync(path, opts); + } + const made = (0, find_made_js_1.findMadeSync)(opts, path); + try { + opts.mkdirSync(path, opts); + return made; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManualSync)(path, opts); + } + else { + throw er; + } + } +}; +exports.mkdirpNativeSync = mkdirpNativeSync; +exports.mkdirpNative = Object.assign(async (path, options) => { + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: true }; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return await opts.mkdirAsync(path, opts); + } + return (0, find_made_js_1.findMade)(opts, path).then((made) => opts + .mkdirAsync(path, opts) + .then(m => made || m) + .catch(er => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManual)(path, opts); + } + else { + throw er; + } + })); +}, { sync: exports.mkdirpNativeSync }); +//# sourceMappingURL=mkdirp-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map new file mode 100644 index 00000000000000..1f889ee98876cc --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAC9B,iDAAuD;AACvD,yDAAmE;AACnE,+CAAsD;AAE/C,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,IAAA,2BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,mCAAgB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAvBY,QAAA,gBAAgB,oBAuB5B;AAEY,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,IAAA,uBAAQ,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,+BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,wBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n path: string,\n options?: MkdirpOptions\n): string | void | undefined => {\n const opts = optsArg(options)\n opts.recursive = true\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirSync(path, opts)\n }\n\n const made = findMadeSync(opts, path)\n try {\n opts.mkdirSync(path, opts)\n return made\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts)\n } else {\n throw er\n }\n }\n}\n\nexport const mkdirpNative = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions\n ): Promise => {\n const opts = { ...optsArg(options), recursive: true }\n const parent = dirname(path)\n if (parent === path) {\n return await opts.mkdirAsync(path, opts)\n }\n\n return findMade(opts, path).then((made?: string | undefined) =>\n opts\n .mkdirAsync(path, opts)\n .then(m => made || m)\n .catch(er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(path, opts)\n } else {\n throw er\n }\n })\n )\n },\n { sync: mkdirpNativeSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts new file mode 100644 index 00000000000000..73d076b3b6923c --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts @@ -0,0 +1,42 @@ +/// +/// +import { MakeDirectoryOptions, Stats } from 'fs'; +export interface FsProvider { + stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync?: (path: string) => Stats; + mkdirSync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; +} +interface Options extends FsProvider { + mode?: number | string; + fs?: FsProvider; + mkdirAsync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync?: (path: string) => Promise; +} +export type MkdirpOptions = Options | number | string; +export interface MkdirpOptionsResolved { + mode: number; + fs: FsProvider; + mkdirAsync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync: (path: string) => Promise; + stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync: (path: string) => Stats; + mkdirSync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; + recursive?: boolean; +} +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved; +export {}; +//# sourceMappingURL=opts-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map new file mode 100644 index 00000000000000..e575161714f651 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js new file mode 100644 index 00000000000000..e8f486c0905957 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.optsArg = void 0; +const fs_1 = require("fs"); +const optsArg = (opts) => { + if (!opts) { + opts = { mode: 0o777 }; + } + else if (typeof opts === 'object') { + opts = { mode: 0o777, ...opts }; + } + else if (typeof opts === 'number') { + opts = { mode: opts }; + } + else if (typeof opts === 'string') { + opts = { mode: parseInt(opts, 8) }; + } + else { + throw new TypeError('invalid options argument'); + } + const resolved = opts; + const optsFs = opts.fs || {}; + opts.mkdir = opts.mkdir || optsFs.mkdir || fs_1.mkdir; + opts.mkdirAsync = opts.mkdirAsync + ? opts.mkdirAsync + : async (path, options) => { + return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); + }; + opts.stat = opts.stat || optsFs.stat || fs_1.stat; + opts.statAsync = opts.statAsync + ? opts.statAsync + : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); + opts.statSync = opts.statSync || optsFs.statSync || fs_1.statSync; + opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || fs_1.mkdirSync; + return resolved; +}; +exports.optsArg = optsArg; +//# sourceMappingURL=opts-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map new file mode 100644 index 00000000000000..fd5590f40f54cd --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;;AAAA,2BAOW;AAwDJ,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,UAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,SAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,aAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,cAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AA3CY,QAAA,OAAO,WA2CnB","sourcesContent":["import {\n MakeDirectoryOptions,\n mkdir,\n mkdirSync,\n stat,\n Stats,\n statSync,\n} from 'fs'\n\nexport interface FsProvider {\n stat?: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync?: (path: string) => Stats\n mkdirSync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n mode?: number | string\n fs?: FsProvider\n mkdirAsync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n mode: number\n fs: FsProvider\n mkdirAsync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync: (path: string) => Promise\n stat: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync: (path: string) => Stats\n mkdirSync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n if (!opts) {\n opts = { mode: 0o777 }\n } else if (typeof opts === 'object') {\n opts = { mode: 0o777, ...opts }\n } else if (typeof opts === 'number') {\n opts = { mode: opts }\n } else if (typeof opts === 'string') {\n opts = { mode: parseInt(opts, 8) }\n } else {\n throw new TypeError('invalid options argument')\n }\n\n const resolved = opts as MkdirpOptionsResolved\n const optsFs = opts.fs || {}\n\n opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n opts.mkdirAsync = opts.mkdirAsync\n ? opts.mkdirAsync\n : async (\n path: string,\n options: MakeDirectoryOptions & { recursive?: boolean }\n ): Promise => {\n return new Promise((res, rej) =>\n resolved.mkdir(path, options, (er, made) =>\n er ? rej(er) : res(made)\n )\n )\n }\n\n opts.stat = opts.stat || optsFs.stat || stat\n opts.statAsync = opts.statAsync\n ? opts.statAsync\n : async (path: string) =>\n new Promise((res, rej) =>\n resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n )\n\n opts.statSync = opts.statSync || optsFs.statSync || statSync\n opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n return resolved\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts new file mode 100644 index 00000000000000..ad0ccfc482a485 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts @@ -0,0 +1,2 @@ +export declare const pathArg: (path: string) => string; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map new file mode 100644 index 00000000000000..3b52b077c6c05c --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js new file mode 100644 index 00000000000000..a6b457f6e23d58 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pathArg = void 0; +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; +const path_1 = require("path"); +const pathArg = (path) => { + if (/\0/.test(path)) { + // simulate same failure that node raises + throw Object.assign(new TypeError('path must be a string without null bytes'), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = (0, path_1.resolve)(path); + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = (0, path_1.parse)(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +exports.pathArg = pathArg; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js.map new file mode 100644 index 00000000000000..ad3b5d38cad3cd --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,+BAAqC;AAC9B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAzBY,QAAA,OAAO,WAyBnB","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n throw Object.assign(\n new TypeError('path must be a string without null bytes'),\n {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n }\n )\n }\n\n path = resolve(path)\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts new file mode 100644 index 00000000000000..1c6cb619e30405 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean; +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & { + sync: (opts?: MkdirpOptions) => boolean; +}; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map new file mode 100644 index 00000000000000..7dc275e322ea3b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js new file mode 100644 index 00000000000000..550b3452688ee5 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.useNative = exports.useNativeSync = void 0; +const fs_1 = require("fs"); +const opts_arg_js_1 = require("./opts-arg.js"); +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); +exports.useNativeSync = !hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdirSync === fs_1.mkdirSync; +exports.useNative = Object.assign(!hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdir === fs_1.mkdir, { + sync: exports.useNativeSync, +}); +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js.map new file mode 100644 index 00000000000000..9a15efebb9ec28 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":";;;AAAA,2BAAqC;AACrC,+CAAsD;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAElE,QAAA,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,SAAS,KAAK,cAAS,CAAA;AAEtD,QAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,KAAK,KAAK,UAAK,EAC3D;IACE,IAAI,EAAE,qBAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n {\n sync: useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts new file mode 100644 index 00000000000000..e47794b3bb72a3 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts @@ -0,0 +1,4 @@ +import { MkdirpOptionsResolved } from './opts-arg.js'; +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise; +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string; +//# sourceMappingURL=find-made.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts.map new file mode 100644 index 00000000000000..411aad1410eb7a --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js new file mode 100644 index 00000000000000..3e72fd59a2c1fb --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js @@ -0,0 +1,30 @@ +import { dirname } from 'path'; +export const findMade = async (opts, parent, path) => { + // we never want the 'made' return value to be a root directory + if (path === parent) { + return; + } + return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later + // will fail later + er => { + const fer = er; + return fer && fer.code === 'ENOENT' + ? findMade(opts, dirname(parent), parent) + : undefined; + }); +}; +export const findMadeSync = (opts, parent, path) => { + if (path === parent) { + return undefined; + } + try { + return opts.statSync(parent).isDirectory() ? path : undefined; + } + catch (er) { + const fer = er; + return fer && fer.code === 'ENOENT' + ? findMadeSync(opts, dirname(parent), parent) + : undefined; + } +}; +//# sourceMappingURL=find-made.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js.map new file mode 100644 index 00000000000000..7b58089c6266c1 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): Promise => {\n // we never want the 'made' return value to be a root directory\n if (path === parent) {\n return\n }\n\n return opts.statAsync(parent).then(\n st => (st.isDirectory() ? path : undefined), // will fail later\n er => {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMade(opts, dirname(parent), parent)\n : undefined\n }\n )\n}\n\nexport const findMadeSync = (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): undefined | string => {\n if (path === parent) {\n return undefined\n }\n\n try {\n return opts.statSync(parent).isDirectory() ? path : undefined\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMadeSync(opts, dirname(parent), parent)\n : undefined\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts new file mode 100644 index 00000000000000..fc9e43b3a45de1 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts @@ -0,0 +1,39 @@ +import { MkdirpOptions } from './opts-arg.js'; +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +}; +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +}; +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & { + mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; + mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + sync: (path: string, opts?: MkdirpOptions) => string | void; + native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + useNative: ((opts?: MkdirpOptions | undefined) => boolean) & { + sync: (opts?: MkdirpOptions | undefined) => boolean; + }; + useNativeSync: (opts?: MkdirpOptions | undefined) => boolean; +}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts.map new file mode 100644 index 00000000000000..cfcc78083857b1 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js new file mode 100644 index 00000000000000..0217ecc8cdd83d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js @@ -0,0 +1,43 @@ +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +import { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +import { optsArg } from './opts-arg.js'; +import { pathArg } from './path-arg.js'; +import { useNative, useNativeSync } from './use-native.js'; +/* c8 ignore start */ +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +/* c8 ignore stop */ +export const mkdirpSync = (path, opts) => { + path = pathArg(path); + const resolved = optsArg(opts); + return useNativeSync(resolved) + ? mkdirpNativeSync(path, resolved) + : mkdirpManualSync(path, resolved); +}; +export const sync = mkdirpSync; +export const manual = mkdirpManual; +export const manualSync = mkdirpManualSync; +export const native = mkdirpNative; +export const nativeSync = mkdirpNativeSync; +export const mkdirp = Object.assign(async (path, opts) => { + path = pathArg(path); + const resolved = optsArg(opts); + return useNative(resolved) + ? mkdirpNative(path, resolved) + : mkdirpManual(path, resolved); +}, { + mkdirpSync, + mkdirpNative, + mkdirpNativeSync, + mkdirpManual, + mkdirpManualSync, + sync: mkdirpSync, + native: mkdirpNative, + nativeSync: mkdirpNativeSync, + manual: mkdirpManual, + manualSync: mkdirpManualSync, + useNative, + useNativeSync, +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js.map new file mode 100644 index 00000000000000..47a8133a070c8f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,oBAAoB;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,aAAa,CAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,SAAS,CAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,gBAAgB;IAEhB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,SAAS;IACT,aAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNativeSync(resolved)\n ? mkdirpNativeSync(path, resolved)\n : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n async (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNative(resolved)\n ? mkdirpNative(path, resolved)\n : mkdirpManual(path, resolved)\n },\n {\n mkdirpSync,\n mkdirpNative,\n mkdirpNativeSync,\n mkdirpManual,\n mkdirpManualSync,\n\n sync: mkdirpSync,\n native: mkdirpNative,\n nativeSync: mkdirpNativeSync,\n manual: mkdirpManual,\n manualSync: mkdirpManualSync,\n useNative,\n useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts new file mode 100644 index 00000000000000..e49cdf9f1bd122 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & { + sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +}; +//# sourceMappingURL=mkdirp-manual.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map new file mode 100644 index 00000000000000..ae7f243d3ca78b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js new file mode 100644 index 00000000000000..a4d044e02d3bfc --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js @@ -0,0 +1,75 @@ +import { dirname } from 'path'; +import { optsArg } from './opts-arg.js'; +export const mkdirpManualSync = (path, options, made) => { + const parent = dirname(path); + const opts = { ...optsArg(options), recursive: false }; + if (parent === path) { + try { + return opts.mkdirSync(path, opts); + } + catch (er) { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + return; + } + } + try { + opts.mkdirSync(path, opts); + return made || path; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { + throw er; + } + try { + if (!opts.statSync(path).isDirectory()) + throw er; + } + catch (_) { + throw er; + } + } +}; +export const mkdirpManual = Object.assign(async (path, options, made) => { + const opts = optsArg(options); + opts.recursive = false; + const parent = dirname(path); + if (parent === path) { + return opts.mkdirAsync(path, opts).catch(er => { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + }); + } + return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManual(parent, opts).then((made) => mkdirpManual(path, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { + throw er; + } + return opts.statAsync(path).then(st => { + if (st.isDirectory()) { + return made; + } + else { + throw er; + } + }, () => { + throw er; + }); + }); +}, { sync: mkdirpManualSync }); +//# sourceMappingURL=mkdirp-manual.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map new file mode 100644 index 00000000000000..29eab250e126c8 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n): string | undefined | void => {\n const parent = dirname(path)\n const opts = { ...optsArg(options), recursive: false }\n\n if (parent === path) {\n try {\n return opts.mkdirSync(path, opts)\n } catch (er) {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n return\n }\n }\n\n try {\n opts.mkdirSync(path, opts)\n return made || path\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n }\n if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n throw er\n }\n try {\n if (!opts.statSync(path).isDirectory()) throw er\n } catch (_) {\n throw er\n }\n }\n}\n\nexport const mkdirpManual = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n ): Promise => {\n const opts = optsArg(options)\n opts.recursive = false\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirAsync(path, opts).catch(er => {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n })\n }\n\n return opts.mkdirAsync(path, opts).then(\n () => made || path,\n async er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(parent, opts).then(\n (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n )\n }\n if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n throw er\n }\n return opts.statAsync(path).then(\n st => {\n if (st.isDirectory()) {\n return made\n } else {\n throw er\n }\n },\n () => {\n throw er\n }\n )\n }\n )\n },\n { sync: mkdirpManualSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts new file mode 100644 index 00000000000000..28b64814b2545a --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined; +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & { + sync: (path: string, options?: MkdirpOptions) => string | void | undefined; +}; +//# sourceMappingURL=mkdirp-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map new file mode 100644 index 00000000000000..517dfabe7d1213 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js new file mode 100644 index 00000000000000..99d10a5425dade --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js @@ -0,0 +1,46 @@ +import { dirname } from 'path'; +import { findMade, findMadeSync } from './find-made.js'; +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +import { optsArg } from './opts-arg.js'; +export const mkdirpNativeSync = (path, options) => { + const opts = optsArg(options); + opts.recursive = true; + const parent = dirname(path); + if (parent === path) { + return opts.mkdirSync(path, opts); + } + const made = findMadeSync(opts, path); + try { + opts.mkdirSync(path, opts); + return made; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManualSync(path, opts); + } + else { + throw er; + } + } +}; +export const mkdirpNative = Object.assign(async (path, options) => { + const opts = { ...optsArg(options), recursive: true }; + const parent = dirname(path); + if (parent === path) { + return await opts.mkdirAsync(path, opts); + } + return findMade(opts, path).then((made) => opts + .mkdirAsync(path, opts) + .then(m => made || m) + .catch(er => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManual(path, opts); + } + else { + throw er; + } + })); +}, { sync: mkdirpNativeSync }); +//# sourceMappingURL=mkdirp-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map new file mode 100644 index 00000000000000..27de32d9436d67 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n path: string,\n options?: MkdirpOptions\n): string | void | undefined => {\n const opts = optsArg(options)\n opts.recursive = true\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirSync(path, opts)\n }\n\n const made = findMadeSync(opts, path)\n try {\n opts.mkdirSync(path, opts)\n return made\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts)\n } else {\n throw er\n }\n }\n}\n\nexport const mkdirpNative = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions\n ): Promise => {\n const opts = { ...optsArg(options), recursive: true }\n const parent = dirname(path)\n if (parent === path) {\n return await opts.mkdirAsync(path, opts)\n }\n\n return findMade(opts, path).then((made?: string | undefined) =>\n opts\n .mkdirAsync(path, opts)\n .then(m => made || m)\n .catch(er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(path, opts)\n } else {\n throw er\n }\n })\n )\n },\n { sync: mkdirpNativeSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts new file mode 100644 index 00000000000000..73d076b3b6923c --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts @@ -0,0 +1,42 @@ +/// +/// +import { MakeDirectoryOptions, Stats } from 'fs'; +export interface FsProvider { + stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync?: (path: string) => Stats; + mkdirSync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; +} +interface Options extends FsProvider { + mode?: number | string; + fs?: FsProvider; + mkdirAsync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync?: (path: string) => Promise; +} +export type MkdirpOptions = Options | number | string; +export interface MkdirpOptionsResolved { + mode: number; + fs: FsProvider; + mkdirAsync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync: (path: string) => Promise; + stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync: (path: string) => Stats; + mkdirSync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; + recursive?: boolean; +} +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved; +export {}; +//# sourceMappingURL=opts-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map new file mode 100644 index 00000000000000..717deb5f9cb0c6 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js new file mode 100644 index 00000000000000..d47e2927fee4c0 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js @@ -0,0 +1,34 @@ +import { mkdir, mkdirSync, stat, statSync, } from 'fs'; +export const optsArg = (opts) => { + if (!opts) { + opts = { mode: 0o777 }; + } + else if (typeof opts === 'object') { + opts = { mode: 0o777, ...opts }; + } + else if (typeof opts === 'number') { + opts = { mode: opts }; + } + else if (typeof opts === 'string') { + opts = { mode: parseInt(opts, 8) }; + } + else { + throw new TypeError('invalid options argument'); + } + const resolved = opts; + const optsFs = opts.fs || {}; + opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir; + opts.mkdirAsync = opts.mkdirAsync + ? opts.mkdirAsync + : async (path, options) => { + return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); + }; + opts.stat = opts.stat || optsFs.stat || stat; + opts.statAsync = opts.statAsync + ? opts.statAsync + : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); + opts.statSync = opts.statSync || optsFs.statSync || statSync; + opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync; + return resolved; +}; +//# sourceMappingURL=opts-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js.map new file mode 100644 index 00000000000000..663286dc7212ed --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,SAAS,EACT,IAAI,EAEJ,QAAQ,GACT,MAAM,IAAI,CAAA;AAwDX,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import {\n MakeDirectoryOptions,\n mkdir,\n mkdirSync,\n stat,\n Stats,\n statSync,\n} from 'fs'\n\nexport interface FsProvider {\n stat?: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync?: (path: string) => Stats\n mkdirSync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n mode?: number | string\n fs?: FsProvider\n mkdirAsync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n mode: number\n fs: FsProvider\n mkdirAsync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync: (path: string) => Promise\n stat: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync: (path: string) => Stats\n mkdirSync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n if (!opts) {\n opts = { mode: 0o777 }\n } else if (typeof opts === 'object') {\n opts = { mode: 0o777, ...opts }\n } else if (typeof opts === 'number') {\n opts = { mode: opts }\n } else if (typeof opts === 'string') {\n opts = { mode: parseInt(opts, 8) }\n } else {\n throw new TypeError('invalid options argument')\n }\n\n const resolved = opts as MkdirpOptionsResolved\n const optsFs = opts.fs || {}\n\n opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n opts.mkdirAsync = opts.mkdirAsync\n ? opts.mkdirAsync\n : async (\n path: string,\n options: MakeDirectoryOptions & { recursive?: boolean }\n ): Promise => {\n return new Promise((res, rej) =>\n resolved.mkdir(path, options, (er, made) =>\n er ? rej(er) : res(made)\n )\n )\n }\n\n opts.stat = opts.stat || optsFs.stat || stat\n opts.statAsync = opts.statAsync\n ? opts.statAsync\n : async (path: string) =>\n new Promise((res, rej) =>\n resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n )\n\n opts.statSync = opts.statSync || optsFs.statSync || statSync\n opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n return resolved\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/package.json b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts new file mode 100644 index 00000000000000..ad0ccfc482a485 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts @@ -0,0 +1,2 @@ +export declare const pathArg: (path: string) => string; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map new file mode 100644 index 00000000000000..801799e766fabc --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js new file mode 100644 index 00000000000000..03539cc5a94f98 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js @@ -0,0 +1,24 @@ +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; +import { parse, resolve } from 'path'; +export const pathArg = (path) => { + if (/\0/.test(path)) { + // simulate same failure that node raises + throw Object.assign(new TypeError('path must be a string without null bytes'), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = resolve(path); + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = parse(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js.map new file mode 100644 index 00000000000000..43efe1e3a9976f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACrC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n throw Object.assign(\n new TypeError('path must be a string without null bytes'),\n {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n }\n )\n }\n\n path = resolve(path)\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts new file mode 100644 index 00000000000000..1c6cb619e30405 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean; +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & { + sync: (opts?: MkdirpOptions) => boolean; +}; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts.map new file mode 100644 index 00000000000000..e2484228a04472 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js new file mode 100644 index 00000000000000..ad2093867eb74e --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js @@ -0,0 +1,14 @@ +import { mkdir, mkdirSync } from 'fs'; +import { optsArg } from './opts-arg.js'; +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); +export const useNativeSync = !hasNative + ? () => false + : (opts) => optsArg(opts).mkdirSync === mkdirSync; +export const useNative = Object.assign(!hasNative + ? () => false + : (opts) => optsArg(opts).mkdir === mkdir, { + sync: useNativeSync, +}); +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js.map b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js.map new file mode 100644 index 00000000000000..08c616d365510f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACrC,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAA;AAEnE,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAC3D;IACE,IAAI,EAAE,aAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n {\n sync: useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/package.json b/deps/npm/node_modules/cacache/node_modules/mkdirp/package.json new file mode 100644 index 00000000000000..f31ac3314d6f6a --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/package.json @@ -0,0 +1,91 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "3.0.1", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "bin": "./dist/cjs/src/bin.js", + "main": "./dist/cjs/src/index.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 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" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.0", + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "prettier": "^2.8.2", + "tap": "^16.3.3", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "repository": { + "type": "git", + "url": "https://github.com/isaacs/node-mkdirp.git" + }, + "license": "MIT", + "engines": { + "node": ">=10" + } +} diff --git a/deps/npm/node_modules/cacache/node_modules/mkdirp/readme.markdown b/deps/npm/node_modules/cacache/node_modules/mkdirp/readme.markdown new file mode 100644 index 00000000000000..df654b808755f5 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/mkdirp/readme.markdown @@ -0,0 +1,281 @@ +# mkdirp + +Like `mkdir -p`, but in Node.js! + +Now with a modern API and no\* bugs! + +\* may contain some bugs + +# example + +## pow.js + +```js +// hybrid module, import or require() both work +import { mkdirp } from 'mkdirp' +// or: +const { mkdirp } = require('mkdirp') + +// return value is a Promise resolving to the first directory created +mkdirp('/tmp/foo/bar/baz').then(made => + console.log(`made directories, starting with ${made}`) +) +``` + +Output (where `/tmp/foo` already exists) + +``` +made directories, starting with /tmp/foo/bar +``` + +Or, if you don't have time to wait around for promises: + +```js +import { mkdirp } from 'mkdirp' + +// return value is the first directory created +const made = mkdirp.sync('/tmp/foo/bar/baz') +console.log(`made directories, starting with ${made}`) +``` + +And now /tmp/foo/bar/baz exists, huzzah! + +# methods + +```js +import { mkdirp } from 'mkdirp' +``` + +## `mkdirp(dir: string, opts?: MkdirpOptions) => Promise` + +Create a new directory and any necessary subdirectories at `dir` +with octal permission string `opts.mode`. If `opts` is a string +or number, it will be treated as the `opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0o777`. + +Promise resolves to first directory `made` that had to be +created, or `undefined` if everything already exists. Promise +rejects if any errors are encountered. Note that, in the case of +promise rejection, some directories _may_ have been created, as +recursive directory creation is not an atomic operation. + +You can optionally pass in an alternate `fs` implementation by +passing in `opts.fs`. Your implementation should have +`opts.fs.mkdir(path, opts, cb)` and `opts.fs.stat(path, cb)`. + +You can also override just one or the other of `mkdir` and `stat` +by passing in `opts.stat` or `opts.mkdir`, or providing an `fs` +option that only overrides one of these. + +## `mkdirp.sync(dir: string, opts: MkdirpOptions) => string|undefined` + +Synchronously create a new directory and any necessary +subdirectories at `dir` with octal permission string `opts.mode`. +If `opts` is a string or number, it will be treated as the +`opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0o777`. + +Returns the first directory that had to be created, or undefined +if everything already exists. + +You can optionally pass in an alternate `fs` implementation by +passing in `opts.fs`. Your implementation should have +`opts.fs.mkdirSync(path, mode)` and `opts.fs.statSync(path)`. + +You can also override just one or the other of `mkdirSync` and +`statSync` by passing in `opts.statSync` or `opts.mkdirSync`, or +providing an `fs` option that only overrides one of these. + +## `mkdirp.manual`, `mkdirp.manualSync` + +Use the manual implementation (not the native one). This is the +default when the native implementation is not available or the +stat/mkdir implementation is overridden. + +## `mkdirp.native`, `mkdirp.nativeSync` + +Use the native implementation (not the manual one). This is the +default when the native implementation is available and +stat/mkdir are not overridden. + +# implementation + +On Node.js v10.12.0 and above, use the native `fs.mkdir(p, +{recursive:true})` option, unless `fs.mkdir`/`fs.mkdirSync` has +been overridden by an option. + +## native implementation + +- If the path is a root directory, then pass it to the underlying + implementation and return the result/error. (In this case, + it'll either succeed or fail, but we aren't actually creating + any dirs.) +- Walk up the path statting each directory, to find the first + path that will be created, `made`. +- Call `fs.mkdir(path, { recursive: true })` (or `fs.mkdirSync`) +- If error, raise it to the caller. +- Return `made`. + +## manual implementation + +- Call underlying `fs.mkdir` implementation, with `recursive: +false` +- If error: + - If path is a root directory, raise to the caller and do not + handle it + - If ENOENT, mkdirp parent dir, store result as `made` + - stat(path) + - If error, raise original `mkdir` error + - If directory, return `made` + - Else, raise original `mkdir` error +- else + - return `undefined` if a root dir, or `made` if set, or `path` + +## windows vs unix caveat + +On Windows file systems, attempts to create a root directory (ie, +a drive letter or root UNC path) will fail. If the root +directory exists, then it will fail with `EPERM`. If the root +directory does not exist, then it will fail with `ENOENT`. + +On posix file systems, attempts to create a root directory (in +recursive mode) will succeed silently, as it is treated like just +another directory that already exists. (In non-recursive mode, +of course, it fails with `EEXIST`.) + +In order to preserve this system-specific behavior (and because +it's not as if we can create the parent of a root directory +anyway), attempts to create a root directory are passed directly +to the `fs` implementation, and any errors encountered are not +handled. + +## native error caveat + +The native implementation (as of at least Node.js v13.4.0) does +not provide appropriate errors in some cases (see +[nodejs/node#31481](https://github.com/nodejs/node/issues/31481) +and +[nodejs/node#28015](https://github.com/nodejs/node/issues/28015)). + +In order to work around this issue, the native implementation +will fall back to the manual implementation if an `ENOENT` error +is encountered. + +# choosing a recursive mkdir implementation + +There are a few to choose from! Use the one that suits your +needs best :D + +## use `fs.mkdir(path, {recursive: true}, cb)` if: + +- You wish to optimize performance even at the expense of other + factors. +- You don't need to know the first dir created. +- You are ok with getting `ENOENT` as the error when some other + problem is the actual cause. +- You can limit your platforms to Node.js v10.12 and above. +- You're ok with using callbacks instead of promises. +- You don't need/want a CLI. +- You don't need to override the `fs` methods in use. + +## use this module (mkdirp 1.x or 2.x) if: + +- You need to know the first directory that was created. +- You wish to use the native implementation if available, but + fall back when it's not. +- You prefer promise-returning APIs to callback-taking APIs. +- You want more useful error messages than the native recursive + mkdir provides (at least as of Node.js v13.4), and are ok with + re-trying on `ENOENT` to achieve this. +- You need (or at least, are ok with) a CLI. +- You need to override the `fs` methods in use. + +## use [`make-dir`](http://npm.im/make-dir) if: + +- You do not need to know the first dir created (and wish to save + a few `stat` calls when using the native implementation for + this reason). +- You wish to use the native implementation if available, but + fall back when it's not. +- You prefer promise-returning APIs to callback-taking APIs. +- You are ok with occasionally getting `ENOENT` errors for + failures that are actually related to something other than a + missing file system entry. +- You don't need/want a CLI. +- You need to override the `fs` methods in use. + +## use mkdirp 0.x if: + +- You need to know the first directory that was created. +- You need (or at least, are ok with) a CLI. +- You need to override the `fs` methods in use. +- You're ok with using callbacks instead of promises. +- You are not running on Windows, where the root-level ENOENT + errors can lead to infinite regress. +- You think vinyl just sounds warmer and richer for some weird + reason. +- You are supporting truly ancient Node.js versions, before even + the advent of a `Promise` language primitive. (Please don't. + You deserve better.) + +# cli + +This package also ships with a `mkdirp` command. + +``` +$ mkdirp -h + +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories + that don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m If a directory needs to be created, set the mode as an octal + --mode= permission string. + + -v --version Print the mkdirp version number + + -h --help Print this helpful banner + + -p --print Print the first directories created for each path provided + + --manual Use manual implementation, even if native is available +``` + +# install + +With [npm](http://npmjs.org) do: + +``` +npm install mkdirp +``` + +to get the library locally, or + +``` +npm install -g mkdirp +``` + +to get the command everywhere, or + +``` +npx mkdirp ... +``` + +to run the command without installing it globally. + +# platform support + +This module works on node v8, but only v10 and above are officially +supported, as Node v8 reached its LTS end of life 2020-01-01, which is in +the past, as of this writing. + +# license + +MIT diff --git a/deps/npm/node_modules/semver/node_modules/lru-cache/LICENSE b/deps/npm/node_modules/cacache/node_modules/tar/LICENSE similarity index 100% rename from deps/npm/node_modules/semver/node_modules/lru-cache/LICENSE rename to deps/npm/node_modules/cacache/node_modules/tar/LICENSE diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/create.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/create.js new file mode 100644 index 00000000000000..3190afc48318f9 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/create.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.create = void 0; +const fs_minipass_1 = require("@isaacs/fs-minipass"); +const node_path_1 = __importDefault(require("node:path")); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const pack_js_1 = require("./pack.js"); +const createFileSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + const stream = new fs_minipass_1.WriteStreamSync(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const createFile = (opt, files) => { + const p = new pack_js_1.Pack(opt); + const stream = new fs_minipass_1.WriteStream(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + const promise = new Promise((res, rej) => { + stream.on('error', rej); + stream.on('close', res); + p.on('error', rej); + }); + addFilesAsync(p, files); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + (0, list_js_1.list)({ + file: node_path_1.default.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await (0, list_js_1.list)({ + file: node_path_1.default.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => { + p.add(entry); + }, + }); + } + else { + p.add(file); + } + } + p.end(); +}; +const createSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + addFilesSync(p, files); + return p; +}; +const createAsync = (opt, files) => { + const p = new pack_js_1.Pack(opt); + addFilesAsync(p, files); + return p; +}; +exports.create = (0, make_command_js_1.makeCommand)(createFileSync, createFile, createSync, createAsync, (_opt, files) => { + if (!files?.length) { + throw new TypeError('no paths specified to add to archive'); + } +}); +//# sourceMappingURL=create.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/cwd-error.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/cwd-error.js new file mode 100644 index 00000000000000..d703a7772be3a5 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/cwd-error.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CwdError = void 0; +class CwdError extends Error { + path; + code; + syscall = 'chdir'; + constructor(path, code) { + super(`${code}: Cannot cd into '${path}'`); + this.path = path; + this.code = code; + } + get name() { + return 'CwdError'; + } +} +exports.CwdError = CwdError; +//# sourceMappingURL=cwd-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/extract.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/extract.js new file mode 100644 index 00000000000000..f848cbcbf779e8 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/extract.js @@ -0,0 +1,78 @@ +"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; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extract = void 0; +// tar -x +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_fs_1 = __importDefault(require("node:fs")); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const unpack_js_1 = require("./unpack.js"); +const extractFileSync = (opt) => { + const u = new unpack_js_1.UnpackSync(opt); + const file = opt.file; + const stat = node_fs_1.default.statSync(file); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size, + }); + stream.pipe(u); +}; +const extractFile = (opt, _) => { + const u = new unpack_js_1.Unpack(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + u.on('error', reject); + u.on('close', resolve); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + node_fs_1.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(u); + } + }); + }); + return p; +}; +exports.extract = (0, make_command_js_1.makeCommand)(extractFileSync, extractFile, opt => new unpack_js_1.UnpackSync(opt), opt => new unpack_js_1.Unpack(opt), (opt, files) => { + if (files?.length) + (0, list_js_1.filesFilter)(opt, files); +}); +//# sourceMappingURL=extract.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/get-write-flag.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/get-write-flag.js new file mode 100644 index 00000000000000..94add8f6b2231c --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/get-write-flag.js @@ -0,0 +1,29 @@ +"use strict"; +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getWriteFlag = void 0; +const fs_1 = __importDefault(require("fs")); +const platform = process.env.__FAKE_PLATFORM__ || process.platform; +const isWindows = platform === 'win32'; +/* c8 ignore start */ +const { O_CREAT, O_TRUNC, O_WRONLY } = fs_1.default.constants; +const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || + fs_1.default.constants.UV_FS_O_FILEMAP || + 0; +/* c8 ignore stop */ +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; +const fMapLimit = 512 * 1024; +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; +exports.getWriteFlag = !fMapEnabled ? + () => 'w' + : (size) => (size < fMapLimit ? fMapFlag : 'w'); +//# sourceMappingURL=get-write-flag.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/header.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/header.js new file mode 100644 index 00000000000000..b3a48037b849ab --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/header.js @@ -0,0 +1,306 @@ +"use strict"; +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) +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.Header = void 0; +const node_path_1 = require("node:path"); +const large = __importStar(require("./large-numbers.js")); +const types = __importStar(require("./types.js")); +class Header { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = 'Unsupported'; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } + else if (data) { + this.#slurp(data); + } + } + decode(buf, off, ex, gex) { + if (!off) { + off = 0; + } + 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.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 + // Apply global before local, so it overrides + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + // old tar versions marked dirs as a file with a trailing / + const t = decString(buf, off + 156, 1); + if (types.isCode(t)) { + this.#type = t || '0'; + } + if (this.#type === '0' && this.path.slice(-1) === '/') { + this.#type = '5'; + } + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this.#type === '5') { + this.size = 0; + } + 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; + /* c8 ignore stop */ + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155); + this.path = prefix + '/' + this.path; + } + else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + '/' + this.path; + } + this.atime = decDate(buf, off + 476, 12); + this.ctime = decDate(buf, off + 488, 12); + } + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksumValid = sum === this.cksum; + if (this.cksum === undefined && sum === 8 * 0x20) { + this.nullBlock = true; + } + } + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex) || + (k === 'linkpath' && gex) || + k === 'global'); + }))); + } + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); + } + if (this.#type === 'Unsupported') { + this.#type = '0'; + } + if (!(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || '', prefixSize); + const path = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path) || this.needPax; + this.needPax = + encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = + encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = + encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = + encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = + encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = + encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write('ustar\u000000', off + 257, 8); + this.needPax = + encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = + encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = + encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = + encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = + encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = + encString(buf, off + 345, 155, prefix) || this.needPax; + } + else { + this.needPax = + encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = + encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = + encDate(buf, off + 488, 12, this.ctime) || this.needPax; + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; + } + get type() { + return (this.#type === 'Unsupported' ? + this.#type + : types.name.get(this.#type)); + } + get typeKey() { + return this.#type; + } + set type(type) { + const c = String(types.code.get(type)); + if (types.isCode(c) || c === 'Unsupported') { + this.#type = c; + } + else if (types.isCode(type)) { + this.#type = type; + } + else { + throw new TypeError('invalid entry type: ' + type); + } + } +} +exports.Header = Header; +const splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ''; + let ret = undefined; + const root = node_path_1.posix.parse(p).root || '.'; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } + else { + // first set prefix to the dir, and path to the base + prefix = node_path_1.posix.dirname(pp); + pp = node_path_1.posix.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // both fit! + ret = [pp, prefix, false]; + } + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // prefix fits in prefix, but path doesn't fit in path + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } + else { + // make path take a bit from prefix + pp = node_path_1.posix.join(node_path_1.posix.basename(prefix), pp); + prefix = node_path_1.posix.dirname(prefix); + } + } while (prefix !== root && ret === undefined); + // at this point, found no resolution, just truncate + if (!ret) { + ret = [p.slice(0, pathSize - 1), '', true]; + } + } + return ret; +}; +const decString = (buf, off, size) => buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*/, ''); +const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); +const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000); +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ? + large.parse(buf.subarray(off, off + size)) + : decSmallNumber(buf, off, size); +const nanUndef = (value) => (isNaN(value) ? undefined : value); +const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*$/, '') + .trim(), 8)); +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8: 0o7777777, +}; +const encNumber = (buf, off, size, num) => num === undefined ? false + : num > MAXNUM[size] || num < 0 ? + (large.encode(num, buf.subarray(off, off + size)), true) + : (encSmallNumber(buf, off, size, num), false); +const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii'); +const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); +const padOctal = (str, size) => (str.length === size - 1 ? + str + : new Array(size - str.length - 1).join('0') + str + ' ') + '\0'; +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000)); +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0'); +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'), + str.length !== Buffer.byteLength(str) || str.length > size)); +//# sourceMappingURL=header.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/index.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/index.js new file mode 100644 index 00000000000000..e93ed5ad54aa6e --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/index.js @@ -0,0 +1,54 @@ +"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 __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +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.u = exports.types = exports.r = exports.t = exports.x = exports.c = void 0; +__exportStar(require("./create.js"), exports); +var create_js_1 = require("./create.js"); +Object.defineProperty(exports, "c", { enumerable: true, get: function () { return create_js_1.create; } }); +__exportStar(require("./extract.js"), exports); +var extract_js_1 = require("./extract.js"); +Object.defineProperty(exports, "x", { enumerable: true, get: function () { return extract_js_1.extract; } }); +__exportStar(require("./header.js"), exports); +__exportStar(require("./list.js"), exports); +var list_js_1 = require("./list.js"); +Object.defineProperty(exports, "t", { enumerable: true, get: function () { return list_js_1.list; } }); +// classes +__exportStar(require("./pack.js"), exports); +__exportStar(require("./parse.js"), exports); +__exportStar(require("./pax.js"), exports); +__exportStar(require("./read-entry.js"), exports); +__exportStar(require("./replace.js"), exports); +var replace_js_1 = require("./replace.js"); +Object.defineProperty(exports, "r", { enumerable: true, get: function () { return replace_js_1.replace; } }); +exports.types = __importStar(require("./types.js")); +__exportStar(require("./unpack.js"), exports); +__exportStar(require("./update.js"), exports); +var update_js_1 = require("./update.js"); +Object.defineProperty(exports, "u", { enumerable: true, get: function () { return update_js_1.update; } }); +__exportStar(require("./write-entry.js"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/large-numbers.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/large-numbers.js new file mode 100644 index 00000000000000..5b07aa7f71b48d --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/large-numbers.js @@ -0,0 +1,99 @@ +"use strict"; +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = exports.encode = void 0; +const encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range'); + } + else if (num < 0) { + encodeNegative(num, buf); + } + else { + encodePositive(num, buf); + } + return buf; +}; +exports.encode = encode; +const encodePositive = (num, buf) => { + buf[0] = 0x80; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 0xff; + num = Math.floor(num / 0x100); + } +}; +const encodeNegative = (num, buf) => { + buf[0] = 0xff; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff; + num = Math.floor(num / 0x100); + if (flipped) { + buf[i - 1] = onesComp(byte); + } + else if (byte === 0) { + buf[i - 1] = 0; + } + else { + flipped = true; + buf[i - 1] = twosComp(byte); + } + } +}; +const parse = (buf) => { + const pre = buf[0]; + const value = pre === 0x80 ? pos(buf.subarray(1, buf.length)) + : pre === 0xff ? twos(buf) + : null; + if (value === null) { + throw Error('invalid base256 encoding'); + } + if (!Number.isSafeInteger(value)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('parsed number outside of javascript safe integer range'); + } + return value; +}; +exports.parse = parse; +const twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } + else if (byte === 0) { + f = byte; + } + else { + flipped = true; + f = twosComp(byte); + } + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const onesComp = (byte) => (0xff ^ byte) & 0xff; +const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff; +//# sourceMappingURL=large-numbers.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/list.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/list.js new file mode 100644 index 00000000000000..3cd34bb4bad481 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/list.js @@ -0,0 +1,136 @@ +"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; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.list = exports.filesFilter = void 0; +// tar -t +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_fs_1 = __importDefault(require("node:fs")); +const path_1 = require("path"); +const make_command_js_1 = require("./make-command.js"); +const parse_js_1 = require("./parse.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const onReadEntryFunction = (opt) => { + const onReadEntry = opt.onReadEntry; + opt.onReadEntry = + onReadEntry ? + e => { + onReadEntry(e); + e.resume(); + } + : e => e.resume(); +}; +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true])); + const filter = opt.filter; + const mapHas = (file, r = '') => { + const root = r || (0, path_1.parse)(file).root || '.'; + let ret; + if (file === root) + ret = false; + else { + const m = map.get(file); + if (m !== undefined) { + ret = m; + } + else { + ret = mapHas((0, path_1.dirname)(file), root); + } + } + map.set(file, ret); + return ret; + }; + opt.filter = + filter ? + (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) + : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); +}; +exports.filesFilter = filesFilter; +const listFileSync = (opt) => { + const p = new parse_js_1.Parser(opt); + const file = opt.file; + let fd; + try { + const stat = node_fs_1.default.statSync(file); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + if (stat.size < readSize) { + p.end(node_fs_1.default.readFileSync(file)); + } + else { + let pos = 0; + const buf = Buffer.allocUnsafe(readSize); + fd = node_fs_1.default.openSync(file, 'r'); + while (pos < stat.size) { + const bytesRead = node_fs_1.default.readSync(fd, buf, 0, readSize, pos); + pos += bytesRead; + p.write(buf.subarray(0, bytesRead)); + } + p.end(); + } + } + finally { + if (typeof fd === 'number') { + try { + node_fs_1.default.closeSync(fd); + /* c8 ignore next */ + } + catch (er) { } + } + } +}; +const listFile = (opt, _files) => { + const parse = new parse_js_1.Parser(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + parse.on('error', reject); + parse.on('end', resolve); + node_fs_1.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(parse); + } + }); + }); + return p; +}; +exports.list = (0, make_command_js_1.makeCommand)(listFileSync, listFile, opt => new parse_js_1.Parser(opt), opt => new parse_js_1.Parser(opt), (opt, files) => { + if (files?.length) + (0, exports.filesFilter)(opt, files); + if (!opt.noResume) + onReadEntryFunction(opt); +}); +//# sourceMappingURL=list.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/make-command.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/make-command.js new file mode 100644 index 00000000000000..1814319e78bc62 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/make-command.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeCommand = void 0; +const options_js_1 = require("./options.js"); +const makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { + return Object.assign((opt_ = [], entries, cb) => { + if (Array.isArray(opt_)) { + entries = opt_; + opt_ = {}; + } + if (typeof entries === 'function') { + cb = entries; + entries = undefined; + } + if (!entries) { + entries = []; + } + else { + entries = Array.from(entries); + } + const opt = (0, options_js_1.dealias)(opt_); + validate?.(opt, entries); + if ((0, options_js_1.isSyncFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncFile(opt, entries); + } + else if ((0, options_js_1.isAsyncFile)(opt)) { + const p = asyncFile(opt, entries); + // weirdness to make TS happy + const c = cb ? cb : undefined; + return c ? p.then(() => c(), c) : p; + } + else if ((0, options_js_1.isSyncNoFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncNoFile(opt, entries); + } + else if ((0, options_js_1.isAsyncNoFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback only supported with file option'); + } + return asyncNoFile(opt, entries); + /* c8 ignore start */ + } + else { + throw new Error('impossible options??'); + } + /* c8 ignore stop */ + }, { + syncFile, + asyncFile, + syncNoFile, + asyncNoFile, + validate, + }); +}; +exports.makeCommand = makeCommand; +//# sourceMappingURL=make-command.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mkdir.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mkdir.js new file mode 100644 index 00000000000000..2b13ecbab6723e --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mkdir.js @@ -0,0 +1,209 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirSync = exports.mkdir = void 0; +const chownr_1 = require("chownr"); +const fs_1 = __importDefault(require("fs")); +const mkdirp_1 = require("mkdirp"); +const node_path_1 = __importDefault(require("node:path")); +const cwd_error_js_1 = require("./cwd-error.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const symlink_error_js_1 = require("./symlink-error.js"); +const cGet = (cache, key) => cache.get((0, normalize_windows_path_js_1.normalizeWindowsPath)(key)); +const cSet = (cache, key, val) => cache.set((0, normalize_windows_path_js_1.normalizeWindowsPath)(key), val); +const checkCwd = (dir, cb) => { + fs_1.default.stat(dir, (er, st) => { + if (er || !st.isDirectory()) { + er = new cwd_error_js_1.CwdError(dir, er?.code || 'ENOTDIR'); + } + cb(er); + }); +}; +/** + * Wrapper around mkdirp for tar's needs. + * + * The main purpose is to avoid creating directories if we know that + * they already exist (and track which ones exist for this purpose), + * and prevent entries from being extracted into symlinked folders, + * if `preservePaths` is not set. + */ +const mkdir = (dir, opt, cb) => { + dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o0700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd); + const done = (er, created) => { + if (er) { + cb(er); + } + else { + cSet(cache, dir, true); + if (created && doChown) { + (0, chownr_1.chownr)(created, uid, gid, er => done(er)); + } + else if (needChmod) { + fs_1.default.chmod(dir, mode, cb); + } + else { + cb(); + } + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + return checkCwd(dir, done); + } + if (preserve) { + return (0, mkdirp_1.mkdirp)(dir, { mode }).then(made => done(null, made ?? undefined), // oh, ts + done); + } + const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir)); + const parts = sub.split('/'); + mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done); +}; +exports.mkdir = mkdir; +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) { + return cb(null, created); + } + const p = parts.shift(); + const part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(base + '/' + p)); + if (cGet(cache, part)) { + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); +}; +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { + if (er) { + fs_1.default.lstat(part, (statEr, st) => { + if (statEr) { + statEr.path = + statEr.path && (0, normalize_windows_path_js_1.normalizeWindowsPath)(statEr.path); + cb(statEr); + } + else if (st.isDirectory()) { + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + else if (unlink) { + fs_1.default.unlink(part, er => { + if (er) { + return cb(er); + } + fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + }); + } + else if (st.isSymbolicLink()) { + return cb(new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/'))); + } + else { + cb(er); + } + }); + } + else { + created = created || part; + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } +}; +const checkCwdSync = (dir) => { + let ok = false; + let code = undefined; + try { + ok = fs_1.default.statSync(dir).isDirectory(); + } + catch (er) { + code = er?.code; + } + finally { + if (!ok) { + throw new cwd_error_js_1.CwdError(dir, code ?? 'ENOTDIR'); + } + } +}; +const mkdirSync = (dir, opt) => { + dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd); + const done = (created) => { + cSet(cache, dir, true); + if (created && doChown) { + (0, chownr_1.chownrSync)(created, uid, gid); + } + if (needChmod) { + fs_1.default.chmodSync(dir, mode); + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + checkCwdSync(cwd); + return done(); + } + if (preserve) { + return done((0, mkdirp_1.mkdirpSync)(dir, mode) ?? undefined); + } + const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir)); + const parts = sub.split('/'); + let created = undefined; + for (let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift()) { + part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(part)); + if (cGet(cache, part)) { + continue; + } + try { + fs_1.default.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + } + catch (er) { + const st = fs_1.default.lstatSync(part); + if (st.isDirectory()) { + cSet(cache, part, true); + continue; + } + else if (unlink) { + fs_1.default.unlinkSync(part); + fs_1.default.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + continue; + } + else if (st.isSymbolicLink()) { + return new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/')); + } + } + } + return done(created); +}; +exports.mkdirSync = mkdirSync; +//# sourceMappingURL=mkdir.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mode-fix.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mode-fix.js new file mode 100644 index 00000000000000..49dd727961d290 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mode-fix.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.modeFix = void 0; +const modeFix = (mode, isDir, portable) => { + mode &= 0o7777; + // in portable mode, use the minimum reasonable umask + // if this system creates files with 0o664 by default + // (as some linux distros do), then we'll write the + // archive with 0o644 instead. Also, don't ever create + // a file that is not readable/writable by the owner. + if (portable) { + mode = (mode | 0o600) & ~0o22; + } + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) { + mode |= 0o100; + } + if (mode & 0o40) { + mode |= 0o10; + } + if (mode & 0o4) { + mode |= 0o1; + } + } + return mode; +}; +exports.modeFix = modeFix; +//# sourceMappingURL=mode-fix.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-unicode.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-unicode.js new file mode 100644 index 00000000000000..2f08ce46d98c4c --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-unicode.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeUnicode = void 0; +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const normalizeCache = Object.create(null); +const { hasOwnProperty } = Object.prototype; +const normalizeUnicode = (s) => { + if (!hasOwnProperty.call(normalizeCache, s)) { + normalizeCache[s] = s.normalize('NFD'); + } + return normalizeCache[s]; +}; +exports.normalizeUnicode = normalizeUnicode; +//# sourceMappingURL=normalize-unicode.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-windows-path.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-windows-path.js new file mode 100644 index 00000000000000..b0c7aaa9f2d175 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-windows-path.js @@ -0,0 +1,12 @@ +"use strict"; +// on windows, either \ or / are valid directory separators. +// on unix, \ is a valid character in filenames. +// so, on windows, and only on windows, we replace all \ chars with /, +// so that we can use / as our one and only directory separator char. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeWindowsPath = void 0; +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +exports.normalizeWindowsPath = platform !== 'win32' ? + (p) => p + : (p) => p && p.replace(/\\/g, '/'); +//# sourceMappingURL=normalize-windows-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/options.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/options.js new file mode 100644 index 00000000000000..4cd06505bc72b2 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/options.js @@ -0,0 +1,66 @@ +"use strict"; +// turn tar(1) style args like `C` into the more verbose things like `cwd` +Object.defineProperty(exports, "__esModule", { value: true }); +exports.dealias = exports.isNoFile = exports.isFile = exports.isAsync = exports.isSync = exports.isAsyncNoFile = exports.isSyncNoFile = exports.isAsyncFile = exports.isSyncFile = void 0; +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'], + ['onentry', 'onReadEntry'], +]); +const isSyncFile = (o) => !!o.sync && !!o.file; +exports.isSyncFile = isSyncFile; +const isAsyncFile = (o) => !o.sync && !!o.file; +exports.isAsyncFile = isAsyncFile; +const isSyncNoFile = (o) => !!o.sync && !o.file; +exports.isSyncNoFile = isSyncNoFile; +const isAsyncNoFile = (o) => !o.sync && !o.file; +exports.isAsyncNoFile = isAsyncNoFile; +const isSync = (o) => !!o.sync; +exports.isSync = isSync; +const isAsync = (o) => !o.sync; +exports.isAsync = isAsync; +const isFile = (o) => !!o.file; +exports.isFile = isFile; +const isNoFile = (o) => !o.file; +exports.isNoFile = isNoFile; +const dealiasKey = (k) => { + const d = argmap.get(k); + if (d) + return d; + return k; +}; +const dealias = (opt = {}) => { + if (!opt) + return {}; + const result = {}; + for (const [key, v] of Object.entries(opt)) { + // TS doesn't know that aliases are going to always be the same type + const k = dealiasKey(key); + result[k] = v; + } + // affordance for deprecated noChmod -> chmod + if (result.chmod === undefined && result.noChmod === false) { + result.chmod = true; + } + delete result.noChmod; + return result; +}; +exports.dealias = dealias; +//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pack.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pack.js new file mode 100644 index 00000000000000..303e93063c2db4 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pack.js @@ -0,0 +1,477 @@ +"use strict"; +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) +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; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PackSync = exports.Pack = exports.PackJob = void 0; +const fs_1 = __importDefault(require("fs")); +const write_entry_js_1 = require("./write-entry.js"); +class PackJob { + path; + absolute; + entry; + stat; + readdir; + pending = false; + ignore = false; + piped = false; + constructor(path, absolute) { + this.path = path || './'; + this.absolute = absolute; + } +} +exports.PackJob = PackJob; +const minipass_1 = require("minipass"); +const zlib = __importStar(require("minizlib")); +const yallist_1 = require("yallist"); +const read_entry_js_1 = require("./read-entry.js"); +const warn_method_js_1 = require("./warn-method.js"); +const EOF = Buffer.alloc(1024); +const ONSTAT = Symbol('onStat'); +const ENDED = Symbol('ended'); +const QUEUE = Symbol('queue'); +const CURRENT = Symbol('current'); +const PROCESS = Symbol('process'); +const PROCESSING = Symbol('processing'); +const PROCESSJOB = Symbol('processJob'); +const JOBS = Symbol('jobs'); +const JOBDONE = Symbol('jobDone'); +const ADDFSENTRY = Symbol('addFSEntry'); +const ADDTARENTRY = Symbol('addTarEntry'); +const STAT = Symbol('stat'); +const READDIR = Symbol('readdir'); +const ONREADDIR = Symbol('onreaddir'); +const PIPE = Symbol('pipe'); +const ENTRY = Symbol('entry'); +const ENTRYOPT = Symbol('entryOpt'); +const WRITEENTRYCLASS = Symbol('writeEntryClass'); +const WRITE = Symbol('write'); +const ONDRAIN = Symbol('ondrain'); +const path_1 = __importDefault(require("path")); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +class Pack extends minipass_1.Minipass { + opt; + cwd; + maxReadSize; + preservePaths; + strict; + noPax; + prefix; + linkCache; + statCache; + file; + portable; + zip; + readdirCache; + noDirRecurse; + follow; + noMtime; + mtime; + filter; + jobs; + [WRITEENTRYCLASS]; + onWriteEntry; + [QUEUE]; + [JOBS] = 0; + [PROCESSING] = false; + [ENDED] = false; + constructor(opt = {}) { + //@ts-ignore + super(); + this.opt = opt; + this.file = opt.file || ''; + this.cwd = opt.cwd || process.cwd(); + this.maxReadSize = opt.maxReadSize; + this.preservePaths = !!opt.preservePaths; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.prefix = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix || ''); + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.readdirCache = opt.readdirCache || new Map(); + this.onWriteEntry = opt.onWriteEntry; + this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + this.portable = !!opt.portable; + if (opt.gzip || opt.brotli) { + if (opt.gzip && opt.brotli) { + throw new TypeError('gzip and brotli are mutually exclusive'); + } + if (opt.gzip) { + if (typeof opt.gzip !== 'object') { + opt.gzip = {}; + } + if (this.portable) { + opt.gzip.portable = true; + } + this.zip = new zlib.Gzip(opt.gzip); + } + if (opt.brotli) { + if (typeof opt.brotli !== 'object') { + opt.brotli = {}; + } + this.zip = new zlib.BrotliCompress(opt.brotli); + } + /* c8 ignore next */ + if (!this.zip) + throw new Error('impossible'); + const zip = this.zip; + zip.on('data', chunk => super.write(chunk)); + zip.on('end', () => super.end()); + zip.on('drain', () => this[ONDRAIN]()); + this.on('resume', () => zip.resume()); + } + else { + this.on('drain', this[ONDRAIN]); + } + this.noDirRecurse = !!opt.noDirRecurse; + this.follow = !!opt.follow; + this.noMtime = !!opt.noMtime; + if (opt.mtime) + this.mtime = opt.mtime; + this.filter = + typeof opt.filter === 'function' ? opt.filter : () => true; + this[QUEUE] = new yallist_1.Yallist(); + this[JOBS] = 0; + this.jobs = Number(opt.jobs) || 4; + this[PROCESSING] = false; + this[ENDED] = false; + } + [WRITE](chunk) { + return super.write(chunk); + } + add(path) { + this.write(path); + return this; + } + end(path, encoding, cb) { + /* c8 ignore start */ + if (typeof path === 'function') { + cb = path; + path = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + /* c8 ignore stop */ + if (path) { + this.add(path); + } + this[ENDED] = true; + this[PROCESS](); + /* c8 ignore next */ + if (cb) + cb(); + return this; + } + write(path) { + if (this[ENDED]) { + throw new Error('write after end'); + } + if (path instanceof read_entry_js_1.ReadEntry) { + this[ADDTARENTRY](path); + } + else { + this[ADDFSENTRY](path); + } + return this.flowing; + } + [ADDTARENTRY](p) { + const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p.path)); + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) { + p.resume(); + } + else { + const job = new PackJob(p.path, absolute); + job.entry = new write_entry_js_1.WriteEntryTar(p, this[ENTRYOPT](job)); + job.entry.on('end', () => this[JOBDONE](job)); + this[JOBS] += 1; + this[QUEUE].push(job); + } + this[PROCESS](); + } + [ADDFSENTRY](p) { + const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p)); + this[QUEUE].push(new PackJob(p, absolute)); + this[PROCESS](); + } + [STAT](job) { + job.pending = true; + this[JOBS] += 1; + const stat = this.follow ? 'stat' : 'lstat'; + fs_1.default[stat](job.absolute, (er, stat) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + this.emit('error', er); + } + else { + this[ONSTAT](job, stat); + } + }); + } + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) { + job.ignore = true; + } + this[PROCESS](); + } + [READDIR](job) { + job.pending = true; + this[JOBS] += 1; + fs_1.default.readdir(job.absolute, (er, entries) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + return this.emit('error', er); + } + this[ONREADDIR](job, entries); + }); + } + [ONREADDIR](job, entries) { + this.readdirCache.set(job.absolute, entries); + job.readdir = entries; + this[PROCESS](); + } + [PROCESS]() { + if (this[PROCESSING]) { + return; + } + this[PROCESSING] = true; + for (let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next) { + this[PROCESSJOB](w.value); + if (w.value.ignore) { + const p = w.next; + this[QUEUE].removeNode(w); + w.next = p; + } + } + this[PROCESSING] = false; + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) { + this.zip.end(EOF); + } + else { + super.write(EOF); + super.end(); + } + } + } + get [CURRENT]() { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value; + } + [JOBDONE](_job) { + this[QUEUE].shift(); + this[JOBS] -= 1; + this[PROCESS](); + } + [PROCESSJOB](job) { + if (job.pending) { + return; + } + if (job.entry) { + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + return; + } + if (!job.stat) { + const sc = this.statCache.get(job.absolute); + if (sc) { + this[ONSTAT](job, sc); + } + else { + this[STAT](job); + } + } + if (!job.stat) { + return; + } + // filtered out! + if (job.ignore) { + return; + } + if (!this.noDirRecurse && + job.stat.isDirectory() && + !job.readdir) { + const rc = this.readdirCache.get(job.absolute); + if (rc) { + this[ONREADDIR](job, rc); + } + else { + this[READDIR](job); + } + if (!job.readdir) { + return; + } + } + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job); + if (!job.entry) { + job.ignore = true; + return; + } + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + } + [ENTRYOPT](job) { + return { + onwarn: (code, msg, data) => this.warn(code, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime, + prefix: this.prefix, + onWriteEntry: this.onWriteEntry, + }; + } + [ENTRY](job) { + this[JOBS] += 1; + try { + const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)); + return e + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)); + } + catch (er) { + this.emit('error', er); + } + } + [ONDRAIN]() { + if (this[CURRENT] && this[CURRENT].entry) { + this[CURRENT].entry.resume(); + } + } + // like .pipe() but using super, because our write() is special + [PIPE](job) { + job.piped = true; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + const source = job.entry; + const zip = this.zip; + /* c8 ignore start */ + if (!source) + throw new Error('cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + if (!zip.write(chunk)) { + source.pause(); + } + }); + } + else { + source.on('data', chunk => { + if (!super.write(chunk)) { + source.pause(); + } + }); + } + } + pause() { + if (this.zip) { + this.zip.pause(); + } + return super.pause(); + } + warn(code, message, data = {}) { + (0, warn_method_js_1.warnMethod)(this, code, message, data); + } +} +exports.Pack = Pack; +class PackSync extends Pack { + sync = true; + constructor(opt) { + super(opt); + this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntrySync; + } + // pause/resume are no-ops in sync streams. + pause() { } + resume() { } + [STAT](job) { + const stat = this.follow ? 'statSync' : 'lstatSync'; + this[ONSTAT](job, fs_1.default[stat](job.absolute)); + } + [READDIR](job) { + this[ONREADDIR](job, fs_1.default.readdirSync(job.absolute)); + } + // gotta get it all in this tick + [PIPE](job) { + const source = job.entry; + const zip = this.zip; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + /* c8 ignore start */ + if (!source) + throw new Error('Cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + zip.write(chunk); + }); + } + else { + source.on('data', chunk => { + super[WRITE](chunk); + }); + } + } +} +exports.PackSync = PackSync; +//# sourceMappingURL=pack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/package.json b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/package.json new file mode 100644 index 00000000000000..5bbefffbabee39 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/parse.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/parse.js new file mode 100644 index 00000000000000..1f7e5fd65e869f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/parse.js @@ -0,0 +1,599 @@ +"use strict"; +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Parser = void 0; +const events_1 = require("events"); +const minizlib_1 = require("minizlib"); +const yallist_1 = require("yallist"); +const header_js_1 = require("./header.js"); +const pax_js_1 = require("./pax.js"); +const read_entry_js_1 = require("./read-entry.js"); +const warn_method_js_1 = require("./warn-method.js"); +const maxMetaEntrySize = 1024 * 1024; +const gzipHeader = Buffer.from([0x1f, 0x8b]); +const STATE = Symbol('state'); +const WRITEENTRY = Symbol('writeEntry'); +const READENTRY = Symbol('readEntry'); +const NEXTENTRY = Symbol('nextEntry'); +const PROCESSENTRY = Symbol('processEntry'); +const EX = Symbol('extendedHeader'); +const GEX = Symbol('globalExtendedHeader'); +const META = Symbol('meta'); +const EMITMETA = Symbol('emitMeta'); +const BUFFER = Symbol('buffer'); +const QUEUE = Symbol('queue'); +const ENDED = Symbol('ended'); +const EMITTEDEND = Symbol('emittedEnd'); +const EMIT = Symbol('emit'); +const UNZIP = Symbol('unzip'); +const CONSUMECHUNK = Symbol('consumeChunk'); +const CONSUMECHUNKSUB = Symbol('consumeChunkSub'); +const CONSUMEBODY = Symbol('consumeBody'); +const CONSUMEMETA = Symbol('consumeMeta'); +const CONSUMEHEADER = Symbol('consumeHeader'); +const CONSUMING = Symbol('consuming'); +const BUFFERCONCAT = Symbol('bufferConcat'); +const MAYBEEND = Symbol('maybeEnd'); +const WRITING = Symbol('writing'); +const ABORTED = Symbol('aborted'); +const DONE = Symbol('onDone'); +const SAW_VALID_ENTRY = Symbol('sawValidEntry'); +const SAW_NULL_BLOCK = Symbol('sawNullBlock'); +const SAW_EOF = Symbol('sawEOF'); +const CLOSESTREAM = Symbol('closeStream'); +const noop = () => true; +class Parser extends events_1.EventEmitter { + file; + strict; + maxMetaEntrySize; + filter; + brotli; + writable = true; + readable = false; + [QUEUE] = new yallist_1.Yallist(); + [BUFFER]; + [READENTRY]; + [WRITEENTRY]; + [STATE] = 'begin'; + [META] = ''; + [EX]; + [GEX]; + [ENDED] = false; + [UNZIP]; + [ABORTED] = false; + [SAW_VALID_ENTRY]; + [SAW_NULL_BLOCK] = false; + [SAW_EOF] = false; + [WRITING] = false; + [CONSUMING] = false; + [EMITTEDEND] = false; + constructor(opt = {}) { + super(); + this.file = opt.file || ''; + // these BADARCHIVE errors can't be detected early. listen on DONE. + this.on(DONE, () => { + if (this[STATE] === 'begin' || + this[SAW_VALID_ENTRY] === false) { + // either less than 1 block of data, or all entries were invalid. + // Either way, probably not even a tarball. + this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format'); + } + }); + if (opt.ondone) { + this.on(DONE, opt.ondone); + } + else { + this.on(DONE, () => { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + }); + } + this.strict = !!opt.strict; + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; + this.filter = typeof opt.filter === 'function' ? opt.filter : noop; + // Unlike gzip, brotli doesn't have any magic bytes to identify it + // Users need to explicitly tell us they're extracting a brotli file + // Or we infer from the file extension + const isTBR = opt.file && + (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')); + // if it's a tbr file it MIGHT be brotli, but we don't know until + // we look at it and verify it's not a valid tar file. + this.brotli = + !opt.gzip && opt.brotli !== undefined ? opt.brotli + : isTBR ? undefined + : false; + // have to set this so that streams are ok piping into it + this.on('end', () => this[CLOSESTREAM]()); + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + if (typeof opt.onReadEntry === 'function') { + this.on('entry', opt.onReadEntry); + } + } + warn(code, message, data = {}) { + (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + [CONSUMEHEADER](chunk, position) { + if (this[SAW_VALID_ENTRY] === undefined) { + this[SAW_VALID_ENTRY] = false; + } + let header; + try { + header = new header_js_1.Header(chunk, position, this[EX], this[GEX]); + } + catch (er) { + return this.warn('TAR_ENTRY_INVALID', er); + } + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true; + // ending an archive with no entries. pointless, but legal. + if (this[STATE] === 'begin') { + this[STATE] = 'header'; + } + this[EMIT]('eof'); + } + else { + this[SAW_NULL_BLOCK] = true; + this[EMIT]('nullBlock'); + } + } + else { + this[SAW_NULL_BLOCK] = false; + if (!header.cksumValid) { + this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header }); + } + else if (!header.path) { + this.warn('TAR_ENTRY_INVALID', 'path is required', { header }); + } + else { + const type = header.type; + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath required', { + header, + }); + } + else if (!/^(Symbolic)?Link$/.test(type) && + !/^(Global)?ExtendedHeader$/.test(type) && + header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', { + header, + }); + } + else { + const entry = (this[WRITEENTRY] = new read_entry_js_1.ReadEntry(header, this[EX], this[GEX])); + // we do this for meta & ignored entries as well, because they + // are still valid tar, or else we wouldn't know to ignore them + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + // this might be the one! + const onend = () => { + if (!entry.invalid) { + this[SAW_VALID_ENTRY] = true; + } + }; + entry.on('end', onend); + } + else { + this[SAW_VALID_ENTRY] = true; + } + } + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true; + this[EMIT]('ignoredEntry', entry); + this[STATE] = 'ignore'; + entry.resume(); + } + else if (entry.size > 0) { + this[META] = ''; + entry.on('data', c => (this[META] += c)); + this[STATE] = 'meta'; + } + } + else { + this[EX] = undefined; + entry.ignore = + entry.ignore || !this.filter(entry.path, entry); + if (entry.ignore) { + // probably valid, just not something we care about + this[EMIT]('ignoredEntry', entry); + this[STATE] = entry.remain ? 'ignore' : 'header'; + entry.resume(); + } + else { + if (entry.remain) { + this[STATE] = 'body'; + } + else { + this[STATE] = 'header'; + entry.end(); + } + if (!this[READENTRY]) { + this[QUEUE].push(entry); + this[NEXTENTRY](); + } + else { + this[QUEUE].push(entry); + } + } + } + } + } + } + } + [CLOSESTREAM]() { + queueMicrotask(() => this.emit('close')); + } + [PROCESSENTRY](entry) { + let go = true; + if (!entry) { + this[READENTRY] = undefined; + go = false; + } + else if (Array.isArray(entry)) { + const [ev, ...args] = entry; + this.emit(ev, ...args); + } + else { + this[READENTRY] = entry; + this.emit('entry', entry); + if (!entry.emittedEnd) { + entry.on('end', () => this[NEXTENTRY]()); + go = false; + } + } + return go; + } + [NEXTENTRY]() { + do { } while (this[PROCESSENTRY](this[QUEUE].shift())); + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY]; + const drainNow = !re || re.flowing || re.size === re.remain; + if (drainNow) { + if (!this[WRITING]) { + this.emit('drain'); + } + } + else { + re.once('drain', () => this.emit('drain')); + } + } + } + [CONSUMEBODY](chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY]; + /* c8 ignore start */ + if (!entry) { + throw new Error('attempt to consume body without entry??'); + } + const br = entry.blockRemain ?? 0; + /* c8 ignore stop */ + const c = br >= chunk.length && position === 0 ? + chunk + : chunk.subarray(position, position + br); + entry.write(c); + if (!entry.blockRemain) { + this[STATE] = 'header'; + this[WRITEENTRY] = undefined; + entry.end(); + } + return c.length; + } + [CONSUMEMETA](chunk, position) { + const entry = this[WRITEENTRY]; + const ret = this[CONSUMEBODY](chunk, position); + // if we finished, then the entry is reset + if (!this[WRITEENTRY] && entry) { + this[EMITMETA](entry); + } + return ret; + } + [EMIT](ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) { + this.emit(ev, data, extra); + } + else { + this[QUEUE].push([ev, data, extra]); + } + } + [EMITMETA](entry) { + this[EMIT]('meta', this[META]); + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = pax_js_1.Pax.parse(this[META], this[EX], false); + break; + case 'GlobalExtendedHeader': + this[GEX] = pax_js_1.Pax.parse(this[META], this[GEX], true); + break; + case 'NextFileHasLongPath': + case 'OldGnuLongPath': { + const ex = this[EX] ?? Object.create(null); + this[EX] = ex; + ex.path = this[META].replace(/\0.*/, ''); + break; + } + case 'NextFileHasLongLinkpath': { + const ex = this[EX] || Object.create(null); + this[EX] = ex; + ex.linkpath = this[META].replace(/\0.*/, ''); + break; + } + /* c8 ignore start */ + default: + throw new Error('unknown meta: ' + entry.type); + /* c8 ignore stop */ + } + } + abort(error) { + this[ABORTED] = true; + this.emit('abort', error); + // always throws, even in non-strict mode + this.warn('TAR_ABORT', error, { recoverable: false }); + } + write(chunk, encoding, cb) { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, + /* c8 ignore next */ + typeof encoding === 'string' ? encoding : 'utf8'); + } + if (this[ABORTED]) { + /* c8 ignore next */ + cb?.(); + return false; + } + // first write, might be gzipped + const needSniff = this[UNZIP] === undefined || + (this.brotli === undefined && this[UNZIP] === false); + if (needSniff && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]); + this[BUFFER] = undefined; + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + // look for gzip header + for (let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) { + this[UNZIP] = false; + } + } + const maybeBrotli = this.brotli === undefined; + if (this[UNZIP] === false && maybeBrotli) { + // read the first header to see if it's a valid tar file. If so, + // we can safely assume that it's not actually brotli, despite the + // .tbr or .tar.br file extension. + // if we ended before getting a full chunk, yes, def brotli + if (chunk.length < 512) { + if (this[ENDED]) { + this.brotli = true; + } + else { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + } + else { + // if it's tar, it's pretty reliably not brotli, chances of + // that happening are astronomical. + try { + new header_js_1.Header(chunk.subarray(0, 512)); + this.brotli = false; + } + catch (_) { + this.brotli = true; + } + } + } + if (this[UNZIP] === undefined || + (this[UNZIP] === false && this.brotli)) { + const ended = this[ENDED]; + this[ENDED] = false; + this[UNZIP] = + this[UNZIP] === undefined ? + new minizlib_1.Unzip({}) + : new minizlib_1.BrotliDecompress({}); + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); + this[UNZIP].on('error', er => this.abort(er)); + this[UNZIP].on('end', () => { + this[ENDED] = true; + this[CONSUMECHUNK](); + }); + this[WRITING] = true; + const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); + this[WRITING] = false; + cb?.(); + return ret; + } + } + this[WRITING] = true; + if (this[UNZIP]) { + this[UNZIP].write(chunk); + } + else { + this[CONSUMECHUNK](chunk); + } + this[WRITING] = false; + // return false if there's a queue, or if the current entry isn't flowing + const ret = this[QUEUE].length ? false + : this[READENTRY] ? this[READENTRY].flowing + : true; + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) { + this[READENTRY]?.once('drain', () => this.emit('drain')); + } + /* c8 ignore next */ + cb?.(); + return ret; + } + [BUFFERCONCAT](c) { + if (c && !this[ABORTED]) { + this[BUFFER] = + this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c; + } + } + [MAYBEEND]() { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true; + const entry = this[WRITEENTRY]; + if (entry && entry.blockRemain) { + // truncated, likely a damaged file + const have = this[BUFFER] ? this[BUFFER].length : 0; + this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); + if (this[BUFFER]) { + entry.write(this[BUFFER]); + } + entry.end(); + } + this[EMIT](DONE); + } + } + [CONSUMECHUNK](chunk) { + if (this[CONSUMING] && chunk) { + this[BUFFERCONCAT](chunk); + } + else if (!chunk && !this[BUFFER]) { + this[MAYBEEND](); + } + else if (chunk) { + this[CONSUMING] = true; + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk); + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + else { + this[CONSUMECHUNKSUB](chunk); + } + while (this[BUFFER] && + this[BUFFER]?.length >= 512 && + !this[ABORTED] && + !this[SAW_EOF]) { + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + this[CONSUMING] = false; + } + if (!this[BUFFER] || this[ENDED]) { + this[MAYBEEND](); + } + } + [CONSUMECHUNKSUB](chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0; + const length = chunk.length; + while (position + 512 <= length && + !this[ABORTED] && + !this[SAW_EOF]) { + switch (this[STATE]) { + case 'begin': + case 'header': + this[CONSUMEHEADER](chunk, position); + position += 512; + break; + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position); + break; + case 'meta': + position += this[CONSUMEMETA](chunk, position); + break; + /* c8 ignore start */ + default: + throw new Error('invalid state: ' + this[STATE]); + /* c8 ignore stop */ + } + } + if (position < length) { + if (this[BUFFER]) { + this[BUFFER] = Buffer.concat([ + chunk.subarray(position), + this[BUFFER], + ]); + } + else { + this[BUFFER] = chunk.subarray(position); + } + } + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + if (cb) + this.once('finish', cb); + if (!this[ABORTED]) { + if (this[UNZIP]) { + /* c8 ignore start */ + if (chunk) + this[UNZIP].write(chunk); + /* c8 ignore stop */ + this[UNZIP].end(); + } + else { + this[ENDED] = true; + if (this.brotli === undefined) + chunk = chunk || Buffer.alloc(0); + if (chunk) + this.write(chunk); + this[MAYBEEND](); + } + } + return this; + } +} +exports.Parser = Parser; +//# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/path-reservations.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/path-reservations.js new file mode 100644 index 00000000000000..9ff391c44092c7 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/path-reservations.js @@ -0,0 +1,170 @@ +"use strict"; +// A path exclusive reservation system +// reserve([list, of, paths], fn) +// When the fn is first in line for all its paths, it +// is called with a cb that clears the reservation. +// +// Used by async unpack to avoid clobbering paths in use, +// while still allowing maximal safe parallelization. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PathReservations = void 0; +const node_path_1 = require("node:path"); +const normalize_unicode_js_1 = require("./normalize-unicode.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +// return a set of parent dirs for a given path +// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d'] +const getDirs = (path) => { + const dirs = path + .split('/') + .slice(0, -1) + .reduce((set, path) => { + const s = set[set.length - 1]; + if (s !== undefined) { + path = (0, node_path_1.join)(s, path); + } + set.push(path || '/'); + return set; + }, []); + return dirs; +}; +class PathReservations { + // path => [function or Set] + // A Set object means a directory reservation + // A fn is a direct reservation on that path + #queues = new Map(); + // fn => {paths:[path,...], dirs:[path, ...]} + #reservations = new Map(); + // functions currently running + #running = new Set(); + reserve(paths, fn) { + paths = + isWindows ? + ['win32 parallelization disabled'] + : paths.map(p => { + // don't need normPath, because we skip this entirely for windows + return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase(); + }); + const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b))); + this.#reservations.set(fn, { dirs, paths }); + for (const p of paths) { + const q = this.#queues.get(p); + if (!q) { + this.#queues.set(p, [fn]); + } + else { + q.push(fn); + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + if (!q) { + this.#queues.set(dir, [new Set([fn])]); + } + else { + const l = q[q.length - 1]; + if (l instanceof Set) { + l.add(fn); + } + else { + q.push(new Set([fn])); + } + } + } + return this.#run(fn); + } + // return the queues for each path the function cares about + // fn => {paths, dirs} + #getQueues(fn) { + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('function does not have any path reservations'); + } + /* c8 ignore stop */ + return { + paths: res.paths.map((path) => this.#queues.get(path)), + dirs: [...res.dirs].map(path => this.#queues.get(path)), + }; + } + // check if fn is first in line for all its paths, and is + // included in the first set for all its dir queues + check(fn) { + const { paths, dirs } = this.#getQueues(fn); + return (paths.every(q => q && q[0] === fn) && + dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))); + } + // run the function if it's first in line and not already running + #run(fn) { + if (this.#running.has(fn) || !this.check(fn)) { + return false; + } + this.#running.add(fn); + fn(() => this.#clear(fn)); + return true; + } + #clear(fn) { + if (!this.#running.has(fn)) { + return false; + } + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('invalid reservation'); + } + /* c8 ignore stop */ + const { paths, dirs } = res; + const next = new Set(); + for (const path of paths) { + const q = this.#queues.get(path); + /* c8 ignore start */ + if (!q || q?.[0] !== fn) { + continue; + } + /* c8 ignore stop */ + const q0 = q[1]; + if (!q0) { + this.#queues.delete(path); + continue; + } + q.shift(); + if (typeof q0 === 'function') { + next.add(q0); + } + else { + for (const f of q0) { + next.add(f); + } + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + const q0 = q?.[0]; + /* c8 ignore next - type safety only */ + if (!q || !(q0 instanceof Set)) + continue; + if (q0.size === 1 && q.length === 1) { + this.#queues.delete(dir); + continue; + } + else if (q0.size === 1) { + q.shift(); + // next one must be a function, + // or else the Set would've been reused + const n = q[0]; + if (typeof n === 'function') { + next.add(n); + } + } + else { + q0.delete(fn); + } + } + this.#running.delete(fn); + next.forEach(fn => this.#run(fn)); + return true; + } +} +exports.PathReservations = PathReservations; +//# sourceMappingURL=path-reservations.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pax.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pax.js new file mode 100644 index 00000000000000..d30c0f3efbe9ea --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pax.js @@ -0,0 +1,158 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pax = void 0; +const node_path_1 = require("node:path"); +const header_js_1 = require("./header.js"); +class Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; + } + encode() { + const body = this.encodeBody(); + if (body === '') { + return Buffer.allocUnsafe(0); + } + const bodyLen = Buffer.byteLength(body); + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0; + } + new header_js_1.Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ('PaxHeader/' + (0, node_path_1.basename)(this.path ?? '')).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 0o644, + uid: this.uid, + gid: this.gid, + size: bodyLen, + mtime: this.mtime, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime, + ctime: this.ctime, + }).encode(buf); + buf.write(body, 512, bodyLen, 'utf8'); + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; + } + return buf; + } + encodeBody() { + return (this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname')); + } + encodeField(field) { + if (this[field] === undefined) { + return ''; + } + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1000 : r; + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' ? + 'SCHILY.' + : '') + + field + + '=' + + v + + '\n'; + const byteLen = Buffer.byteLength(s); + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; + } + const len = digits + byteLen; + return len + s; + } + static parse(str, ex, g = false) { + return new Pax(merge(parseKV(str), ex), g); + } +} +exports.Pax = Pax; +const merge = (a, b) => b ? Object.assign({}, b, a) : a; +const parseKV = (str) => str + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)); +const parseKVLine = (set, line) => { + const n = parseInt(line, 10); + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) { + return set; + } + line = line.slice((n + ' ').length); + const kv = line.split('='); + const r = kv.shift(); + if (!r) { + return set; + } + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1'); + const v = kv.join('='); + set[k] = + /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? + new Date(Number(v) * 1000) + : /^[0-9]+$/.test(v) ? +v + : v; + return set; +}; +//# sourceMappingURL=pax.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/read-entry.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/read-entry.js new file mode 100644 index 00000000000000..15e2d55c938a43 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/read-entry.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReadEntry = void 0; +const minipass_1 = require("minipass"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +class ReadEntry extends minipass_1.Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; + path; + mode; + uid; + gid; + uname; + gname; + size = 0; + mtime; + atime; + ctime; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + /* c8 ignore start */ + this.remain = header.size ?? 0; + /* c8 ignore stop */ + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break; + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; + } + /* c8 ignore start */ + if (!header.path) { + throw new Error('no path provided for tar.ReadEntry'); + } + /* c8 ignore stop */ + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 0o7777; + } + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + /* c8 ignore start */ + this.linkpath = + header.linkpath ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath) + : undefined; + /* c8 ignore stop */ + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); + } + if (gex) { + this.#slurp(gex, true); + } + } + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; + } + if (r >= writeLen) { + return super.write(data); + } + // r < writeLen + return super.write(data.subarray(0, r)); + } + #slurp(ex, gex = false) { + if (ex.path) + ex.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.path); + if (ex.linkpath) + ex.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.linkpath); + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex)); + }))); + } +} +exports.ReadEntry = ReadEntry; +//# sourceMappingURL=read-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/replace.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/replace.js new file mode 100644 index 00000000000000..22eff246d4d75f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/replace.js @@ -0,0 +1,231 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.replace = void 0; +// tar -r +const fs_minipass_1 = require("@isaacs/fs-minipass"); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const header_js_1 = require("./header.js"); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const options_js_1 = require("./options.js"); +const pack_js_1 = require("./pack.js"); +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. +const replaceSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + let threw = true; + let fd; + let position; + try { + try { + fd = node_fs_1.default.openSync(opt.file, 'r+'); + } + catch (er) { + if (er?.code === 'ENOENT') { + fd = node_fs_1.default.openSync(opt.file, 'w+'); + } + else { + throw er; + } + } + const st = node_fs_1.default.fstatSync(fd); + const headBuf = Buffer.alloc(512); + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = node_fs_1.default.readSync(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos); + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + throw new Error('cannot append to compressed archives'); + } + if (!bytes) { + break POSITION; + } + } + const h = new header_js_1.Header(headBuf); + if (!h.cksumValid) { + break; + } + const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512); + if (position + entryBlockSize + 512 > st.size) { + break; + } + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize; + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + } + threw = false; + streamSync(opt, p, position, fd, files); + } + finally { + if (threw) { + try { + node_fs_1.default.closeSync(fd); + } + catch (er) { } + } + } +}; +const streamSync = (opt, p, position, fd, files) => { + const stream = new fs_minipass_1.WriteStreamSync(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const replaceAsync = (opt, files) => { + files = Array.from(files); + const p = new pack_js_1.Pack(opt); + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) { + node_fs_1.default.close(fd, _ => cb_(er)); + } + else { + cb_(null, pos); + } + }; + let position = 0; + if (size === 0) { + return cb(null, 0); + } + let bufPos = 0; + const headBuf = Buffer.alloc(512); + const onread = (er, bytes) => { + if (er || typeof bytes === 'undefined') { + return cb(er); + } + bufPos += bytes; + if (bufPos < 512 && bytes) { + return node_fs_1.default.read(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread); + } + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + return cb(new Error('cannot append to compressed archives')); + } + // truncated header + if (bufPos < 512) { + return cb(null, position); + } + const h = new header_js_1.Header(headBuf); + if (!h.cksumValid) { + return cb(null, position); + } + /* c8 ignore next */ + const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512); + if (position + entryBlockSize + 512 > size) { + return cb(null, position); + } + position += entryBlockSize + 512; + if (position >= size) { + return cb(null, position); + } + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + bufPos = 0; + node_fs_1.default.read(fd, headBuf, 0, 512, position, onread); + }; + node_fs_1.default.read(fd, headBuf, 0, 512, position, onread); + }; + const promise = new Promise((resolve, reject) => { + p.on('error', reject); + let flag = 'r+'; + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+'; + return node_fs_1.default.open(opt.file, flag, onopen); + } + if (er || !fd) { + return reject(er); + } + node_fs_1.default.fstat(fd, (er, st) => { + if (er) { + return node_fs_1.default.close(fd, () => reject(er)); + } + getPos(fd, st.size, (er, position) => { + if (er) { + return reject(er); + } + const stream = new fs_minipass_1.WriteStream(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + stream.on('error', reject); + stream.on('close', resolve); + addFilesAsync(p, files); + }); + }); + }; + node_fs_1.default.open(opt.file, flag, onopen); + }); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + (0, list_js_1.list)({ + file: node_path_1.default.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await (0, list_js_1.list)({ + file: node_path_1.default.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + } + p.end(); +}; +exports.replace = (0, make_command_js_1.makeCommand)(replaceSync, replaceAsync, +/* c8 ignore start */ +() => { + throw new TypeError('file is required'); +}, () => { + throw new TypeError('file is required'); +}, +/* c8 ignore stop */ +(opt, entries) => { + if (!(0, options_js_1.isFile)(opt)) { + throw new TypeError('file is required'); + } + if (opt.gzip || + opt.brotli || + opt.file.endsWith('.br') || + opt.file.endsWith('.tbr')) { + throw new TypeError('cannot append to compressed archives'); + } + if (!entries?.length) { + throw new TypeError('no paths specified to add/replace'); + } +}); +//# sourceMappingURL=replace.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-absolute-path.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-absolute-path.js new file mode 100644 index 00000000000000..bb7639c35a1104 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-absolute-path.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stripAbsolutePath = void 0; +// unix absolute paths are also absolute on win32, so we use this for both +const node_path_1 = require("node:path"); +const { isAbsolute, parse } = node_path_1.win32; +// returns [root, stripped] +// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in +// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip / +// explicitly if it's the first character. +// drive-specific relative paths on Windows get their root stripped off even +// though they are not absolute, so `c:../foo` becomes ['c:', '../foo'] +const stripAbsolutePath = (path) => { + let r = ''; + let parsed = parse(path); + while (isAbsolute(path) || parsed.root) { + // windows will think that //x/y/z has a "root" of //x/y/ + // but strip the //?/C:/ off of //?/C:/path + const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? + '/' + : parsed.root; + path = path.slice(root.length); + r += root; + parsed = parse(path); + } + return [r, path]; +}; +exports.stripAbsolutePath = stripAbsolutePath; +//# sourceMappingURL=strip-absolute-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-trailing-slashes.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-trailing-slashes.js new file mode 100644 index 00000000000000..6fa74ad6a4ac93 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-trailing-slashes.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stripTrailingSlashes = void 0; +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const stripTrailingSlashes = (str) => { + let i = str.length - 1; + let slashesStart = -1; + while (i > -1 && str.charAt(i) === '/') { + slashesStart = i; + i--; + } + return slashesStart === -1 ? str : str.slice(0, slashesStart); +}; +exports.stripTrailingSlashes = stripTrailingSlashes; +//# sourceMappingURL=strip-trailing-slashes.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/symlink-error.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/symlink-error.js new file mode 100644 index 00000000000000..cc19ac1a2e3c6b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/symlink-error.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SymlinkError = void 0; +class SymlinkError extends Error { + path; + symlink; + syscall = 'symlink'; + code = 'TAR_SYMLINK_ERROR'; + constructor(symlink, path) { + super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link'); + this.symlink = symlink; + this.path = path; + } + get name() { + return 'SymlinkError'; + } +} +exports.SymlinkError = SymlinkError; +//# sourceMappingURL=symlink-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/types.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/types.js new file mode 100644 index 00000000000000..cb9b684e843b72 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/types.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.code = exports.name = exports.isName = exports.isCode = void 0; +const isCode = (c) => exports.name.has(c); +exports.isCode = isCode; +const isName = (c) => exports.code.has(c); +exports.isName = isName; +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'], +]); +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/unpack.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/unpack.js new file mode 100644 index 00000000000000..edf8acbb18c408 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/unpack.js @@ -0,0 +1,919 @@ +"use strict"; +// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet. +// but the path reservations are required to avoid race conditions where +// parallelized unpack ops may mess with one another, due to dependencies +// (like a Link depending on its target) or destructive operations (like +// clobbering an fs object to create one of a different type.) +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; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UnpackSync = exports.Unpack = void 0; +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_assert_1 = __importDefault(require("node:assert")); +const node_crypto_1 = require("node:crypto"); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const get_write_flag_js_1 = require("./get-write-flag.js"); +const mkdir_js_1 = require("./mkdir.js"); +const normalize_unicode_js_1 = require("./normalize-unicode.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const parse_js_1 = require("./parse.js"); +const strip_absolute_path_js_1 = require("./strip-absolute-path.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const wc = __importStar(require("./winchars.js")); +const path_reservations_js_1 = require("./path-reservations.js"); +const ONENTRY = Symbol('onEntry'); +const CHECKFS = Symbol('checkFs'); +const CHECKFS2 = Symbol('checkFs2'); +const PRUNECACHE = Symbol('pruneCache'); +const ISREUSABLE = Symbol('isReusable'); +const MAKEFS = Symbol('makeFs'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const LINK = Symbol('link'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const UNSUPPORTED = Symbol('unsupported'); +const CHECKPATH = Symbol('checkPath'); +const MKDIR = Symbol('mkdir'); +const ONERROR = Symbol('onError'); +const PENDING = Symbol('pending'); +const PEND = Symbol('pend'); +const UNPEND = Symbol('unpend'); +const ENDED = Symbol('ended'); +const MAYBECLOSE = Symbol('maybeClose'); +const SKIP = Symbol('skip'); +const DOCHOWN = Symbol('doChown'); +const UID = Symbol('uid'); +const GID = Symbol('gid'); +const CHECKED_CWD = Symbol('checkedCwd'); +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +const DEFAULT_MAX_DEPTH = 1024; +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* c8 ignore start */ +const unlinkFile = (path, cb) => { + if (!isWindows) { + return node_fs_1.default.unlink(path, cb); + } + const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex'); + node_fs_1.default.rename(path, name, er => { + if (er) { + return cb(er); + } + node_fs_1.default.unlink(name, cb); + }); +}; +/* c8 ignore stop */ +/* c8 ignore start */ +const unlinkFileSync = (path) => { + if (!isWindows) { + return node_fs_1.default.unlinkSync(path); + } + const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex'); + node_fs_1.default.renameSync(path, name); + node_fs_1.default.unlinkSync(name); +}; +/* c8 ignore stop */ +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a + : b !== undefined && b === b >>> 0 ? b + : c; +// clear the cache if it's a case-insensitive unicode-squashing match. +// we can't know if the current file system is case-sensitive or supports +// unicode fully, so we check for similarity on the maximally compatible +// representation. Err on the side of pruning, since all it's doing is +// preventing lstats, and it's not the end of the world if we get a false +// positive. +// Note that on windows, we always drop the entire cache whenever a +// symbolic link is encountered, because 8.3 filenames are impossible +// to reason about, and collisions are hazards rather than just failures. +const cacheKeyNormalize = (path) => (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, normalize_windows_path_js_1.normalizeWindowsPath)((0, normalize_unicode_js_1.normalizeUnicode)(path))).toLowerCase(); +// remove all cache entries matching ${abs}/** +const pruneCache = (cache, abs) => { + abs = cacheKeyNormalize(abs); + for (const path of cache.keys()) { + const pnorm = cacheKeyNormalize(path); + if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) { + cache.delete(path); + } + } +}; +const dropCache = (cache) => { + for (const key of cache.keys()) { + cache.delete(key); + } +}; +class Unpack extends parse_js_1.Parser { + [ENDED] = false; + [CHECKED_CWD] = false; + [PENDING] = 0; + reservations = new path_reservations_js_1.PathReservations(); + transform; + writable = true; + readable = false; + dirCache; + uid; + gid; + setOwner; + preserveOwner; + processGid; + processUid; + maxDepth; + forceChown; + win32; + newer; + keep; + noMtime; + preservePaths; + unlink; + cwd; + strip; + processUmask; + umask; + dmode; + fmode; + chmod; + constructor(opt = {}) { + opt.ondone = () => { + this[ENDED] = true; + this[MAYBECLOSE](); + }; + super(opt); + this.transform = opt.transform; + this.dirCache = opt.dirCache || new Map(); + this.chmod = !!opt.chmod; + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || + typeof opt.gid !== 'number') { + throw new TypeError('cannot set owner without number uid and gid'); + } + if (opt.preserveOwner) { + throw new TypeError('cannot preserve owner in archive and also set owner explicitly'); + } + this.uid = opt.uid; + this.gid = opt.gid; + this.setOwner = true; + } + else { + this.uid = undefined; + this.gid = undefined; + this.setOwner = false; + } + // default true for root + if (opt.preserveOwner === undefined && + typeof opt.uid !== 'number') { + this.preserveOwner = !!(process.getuid && process.getuid() === 0); + } + else { + this.preserveOwner = !!opt.preserveOwner; + } + this.processUid = + (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() + : undefined; + this.processGid = + (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() + : undefined; + // prevent excessively deep nesting of subfolders + // set to `Infinity` to remove this restriction + this.maxDepth = + typeof opt.maxDepth === 'number' ? + opt.maxDepth + : DEFAULT_MAX_DEPTH; + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true; + // turn > this[ONENTRY](entry)); + } + // a bad or damaged archive is a warning for Parser, but an error + // when extracting. Mark those errors as unrecoverable, because + // the Unpack contract cannot be met. + warn(code, msg, data = {}) { + if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') { + data.recoverable = false; + } + return super.warn(code, msg, data); + } + [MAYBECLOSE]() { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + } + } + [CHECKPATH](entry) { + const p = (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path); + const parts = p.split('/'); + if (this.strip) { + if (parts.length < this.strip) { + return false; + } + if (entry.type === 'Link') { + const linkparts = (0, normalize_windows_path_js_1.normalizeWindowsPath)(String(entry.linkpath)).split('/'); + if (linkparts.length >= this.strip) { + entry.linkpath = linkparts.slice(this.strip).join('/'); + } + else { + return false; + } + } + parts.splice(0, this.strip); + entry.path = parts.join('/'); + } + if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { + this.warn('TAR_ENTRY_ERROR', 'path excessively deep', { + entry, + path: p, + depth: parts.length, + maxDepth: this.maxDepth, + }); + return false; + } + if (!this.preservePaths) { + if (parts.includes('..') || + /* c8 ignore next */ + (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) { + this.warn('TAR_ENTRY_ERROR', `path contains '..'`, { + entry, + path: p, + }); + return false; + } + // strip off the root + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p); + if (root) { + entry.path = String(stripped); + this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, { + entry, + path: p, + }); + } + } + if (node_path_1.default.isAbsolute(entry.path)) { + entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(entry.path)); + } + else { + entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, entry.path)); + } + // if we somehow ended up with a path that escapes the cwd, and we are + // not in preservePaths mode, then something is fishy! This should have + // been prevented above, so ignore this for coverage. + /* c8 ignore start - defense in depth */ + if (!this.preservePaths && + typeof entry.absolute === 'string' && + entry.absolute.indexOf(this.cwd + '/') !== 0 && + entry.absolute !== this.cwd) { + this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', { + entry, + path: (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path), + resolvedPath: entry.absolute, + cwd: this.cwd, + }); + return false; + } + /* c8 ignore stop */ + // an archive can set properties on the extraction directory, but it + // may not replace the cwd with a different kind of thing entirely. + if (entry.absolute === this.cwd && + entry.type !== 'Directory' && + entry.type !== 'GNUDumpDir') { + return false; + } + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const { root: aRoot } = node_path_1.default.win32.parse(String(entry.absolute)); + entry.absolute = + aRoot + wc.encode(String(entry.absolute).slice(aRoot.length)); + const { root: pRoot } = node_path_1.default.win32.parse(entry.path); + entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length)); + } + return true; + } + [ONENTRY](entry) { + if (!this[CHECKPATH](entry)) { + return entry.resume(); + } + node_assert_1.default.equal(typeof entry.absolute, 'string'); + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) { + entry.mode = entry.mode | 0o700; + } + // eslint-disable-next-line no-fallthrough + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry); + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + default: + return this[UNSUPPORTED](entry); + } + } + [ONERROR](er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') { + this.emit('error', er); + } + else { + this.warn('TAR_ENTRY_ERROR', er, { entry }); + this[UNPEND](); + entry.resume(); + } + } + [MKDIR](dir, mode, cb) { + (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }, cb); + } + [DOCHOWN](entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return (this.forceChown || + (this.preserveOwner && + ((typeof entry.uid === 'number' && + entry.uid !== this.processUid) || + (typeof entry.gid === 'number' && + entry.gid !== this.processGid))) || + (typeof this.uid === 'number' && + this.uid !== this.processUid) || + (typeof this.gid === 'number' && this.gid !== this.processGid)); + } + [UID](entry) { + return uint32(this.uid, entry.uid, this.processUid); + } + [GID](entry) { + return uint32(this.gid, entry.gid, this.processGid); + } + [FILE](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const stream = new fsm.WriteStream(String(entry.absolute), { + // slight lie, but it can be numeric flags + flags: (0, get_write_flag_js_1.getWriteFlag)(entry.size), + mode: mode, + autoClose: false, + }); + stream.on('error', (er) => { + if (stream.fd) { + node_fs_1.default.close(stream.fd, () => { }); + } + // flush all the data out so that we aren't left hanging + // if the error wasn't actually fatal. otherwise the parse + // is blocked, and we never proceed. + stream.write = () => true; + this[ONERROR](er, entry); + fullyDone(); + }); + let actions = 1; + const done = (er) => { + if (er) { + /* c8 ignore start - we should always have a fd by now */ + if (stream.fd) { + node_fs_1.default.close(stream.fd, () => { }); + } + /* c8 ignore stop */ + this[ONERROR](er, entry); + fullyDone(); + return; + } + if (--actions === 0) { + if (stream.fd !== undefined) { + node_fs_1.default.close(stream.fd, er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + } + fullyDone(); + }); + } + } + }; + stream.on('finish', () => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = String(entry.absolute); + const fd = stream.fd; + if (typeof fd === 'number' && entry.mtime && !this.noMtime) { + actions++; + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + node_fs_1.default.futimes(fd, atime, mtime, er => er ? + node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()); + } + if (typeof fd === 'number' && this[DOCHOWN](entry)) { + actions++; + const uid = this[UID](entry); + const gid = this[GID](entry); + if (typeof uid === 'number' && typeof gid === 'number') { + node_fs_1.default.fchown(fd, uid, gid, er => er ? + node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()); + } + } + done(); + }); + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => { + this[ONERROR](er, entry); + fullyDone(); + }); + entry.pipe(tx); + } + tx.pipe(stream); + } + [DIRECTORY](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + this[MKDIR](String(entry.absolute), mode, er => { + if (er) { + this[ONERROR](er, entry); + fullyDone(); + return; + } + let actions = 1; + const done = () => { + if (--actions === 0) { + fullyDone(); + this[UNPEND](); + entry.resume(); + } + }; + if (entry.mtime && !this.noMtime) { + actions++; + node_fs_1.default.utimes(String(entry.absolute), entry.atime || new Date(), entry.mtime, done); + } + if (this[DOCHOWN](entry)) { + actions++; + node_fs_1.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); + } + done(); + }); + } + [UNSUPPORTED](entry) { + entry.unsupported = true; + this.warn('TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry }); + entry.resume(); + } + [SYMLINK](entry, done) { + this[LINK](entry, String(entry.linkpath), 'symlink', done); + } + [HARDLINK](entry, done) { + const linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, String(entry.linkpath))); + this[LINK](entry, linkpath, 'link', done); + } + [PEND]() { + this[PENDING]++; + } + [UNPEND]() { + this[PENDING]--; + this[MAYBECLOSE](); + } + [SKIP](entry) { + this[UNPEND](); + entry.resume(); + } + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE](entry, st) { + return (entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + !isWindows); + } + // check if a thing is there, and if so, try to clobber it + [CHECKFS](entry) { + this[PEND](); + const paths = [entry.path]; + if (entry.linkpath) { + paths.push(entry.linkpath); + } + this.reservations.reserve(paths, done => this[CHECKFS2](entry, done)); + } + [PRUNECACHE](entry) { + // if we are not creating a directory, and the path is in the dirCache, + // then that means we are about to delete the directory we created + // previously, and it is no longer going to be a directory, and neither + // is any of its children. + // If a symbolic link is encountered, all bets are off. There is no + // reasonable way to sanitize the cache in such a way we will be able to + // avoid having filesystem collisions. If this happens with a non-symlink + // entry, it'll just fail to unpack, but a symlink to a directory, using an + // 8.3 shortname or certain unicode attacks, can evade detection and lead + // to arbitrary writes to anywhere on the system. + if (entry.type === 'SymbolicLink') { + dropCache(this.dirCache); + } + else if (entry.type !== 'Directory') { + pruneCache(this.dirCache, String(entry.absolute)); + } + } + [CHECKFS2](entry, fullyDone) { + this[PRUNECACHE](entry); + const done = (er) => { + this[PRUNECACHE](entry); + fullyDone(er); + }; + const checkCwd = () => { + this[MKDIR](this.cwd, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + this[CHECKED_CWD] = true; + start(); + }); + }; + const start = () => { + if (entry.absolute !== this.cwd) { + const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + return this[MKDIR](parent, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + afterMakeParent(); + }); + } + } + afterMakeParent(); + }; + const afterMakeParent = () => { + node_fs_1.default.lstat(String(entry.absolute), (lstatEr, st) => { + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + this[SKIP](entry); + done(); + return; + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry, done); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done); + if (!needChmod) { + return afterChmod(); + } + return node_fs_1.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + } + // Not a dir entry, have to remove it. + // NB: the only way to end up with an entry that is the cwd + // itself, in such a way that == does not detect, is a + // tricky windows absolute path with UNC or 8.3 parts (and + // preservePaths:true, or else it will have been stripped). + // In that case, the user has opted out of path protections + // explicitly, so if they blow away the cwd, c'est la vie. + if (entry.absolute !== this.cwd) { + return node_fs_1.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + } + } + // not a dir, and not reusable + // don't remove if the cwd, we want that error + if (entry.absolute === this.cwd) { + return this[MAKEFS](null, entry, done); + } + unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done)); + }); + }; + if (this[CHECKED_CWD]) { + start(); + } + else { + checkCwd(); + } + } + [MAKEFS](er, entry, done) { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry, done); + case 'Link': + return this[HARDLINK](entry, done); + case 'SymbolicLink': + return this[SYMLINK](entry, done); + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry, done); + } + } + [LINK](entry, linkpath, link, done) { + // XXX: get the type ('symlink' or 'junction') for windows + node_fs_1.default[link](linkpath, String(entry.absolute), er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + entry.resume(); + } + done(); + }); + } +} +exports.Unpack = Unpack; +const callSync = (fn) => { + try { + return [null, fn()]; + } + catch (er) { + return [er, null]; + } +}; +class UnpackSync extends Unpack { + sync = true; + [MAKEFS](er, entry) { + return super[MAKEFS](er, entry, () => { }); + } + [CHECKFS](entry) { + this[PRUNECACHE](entry); + if (!this[CHECKED_CWD]) { + const er = this[MKDIR](this.cwd, this.dmode); + if (er) { + return this[ONERROR](er, entry); + } + this[CHECKED_CWD] = true; + } + // don't bother to make the parent if the current entry is the cwd, + // we've already checked it. + if (entry.absolute !== this.cwd) { + const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + const mkParent = this[MKDIR](parent, this.dmode); + if (mkParent) { + return this[ONERROR](mkParent, entry); + } + } + } + const [lstatEr, st] = callSync(() => node_fs_1.default.lstatSync(String(entry.absolute))); + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + return this[SKIP](entry); + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const [er] = needChmod ? + callSync(() => { + node_fs_1.default.chmodSync(String(entry.absolute), Number(entry.mode)); + }) + : []; + return this[MAKEFS](er, entry); + } + // not a dir entry, have to remove it + const [er] = callSync(() => node_fs_1.default.rmdirSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + // not a dir, and not reusable. + // don't remove if it's the cwd, since we want that error. + const [er] = entry.absolute === this.cwd ? + [] + : callSync(() => unlinkFileSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + [FILE](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const oner = (er) => { + let closeError; + try { + node_fs_1.default.closeSync(fd); + } + catch (e) { + closeError = e; + } + if (er || closeError) { + this[ONERROR](er || closeError, entry); + } + done(); + }; + let fd; + try { + fd = node_fs_1.default.openSync(String(entry.absolute), (0, get_write_flag_js_1.getWriteFlag)(entry.size), mode); + } + catch (er) { + return oner(er); + } + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => this[ONERROR](er, entry)); + entry.pipe(tx); + } + tx.on('data', (chunk) => { + try { + node_fs_1.default.writeSync(fd, chunk, 0, chunk.length); + } + catch (er) { + oner(er); + } + }); + tx.on('end', () => { + let er = null; + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + try { + node_fs_1.default.futimesSync(fd, atime, mtime); + } + catch (futimeser) { + try { + node_fs_1.default.utimesSync(String(entry.absolute), atime, mtime); + } + catch (utimeser) { + er = futimeser; + } + } + } + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry); + const gid = this[GID](entry); + try { + node_fs_1.default.fchownSync(fd, Number(uid), Number(gid)); + } + catch (fchowner) { + try { + node_fs_1.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); + } + catch (chowner) { + er = er || fchowner; + } + } + } + oner(er); + }); + } + [DIRECTORY](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + const er = this[MKDIR](String(entry.absolute), mode); + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + if (entry.mtime && !this.noMtime) { + try { + node_fs_1.default.utimesSync(String(entry.absolute), entry.atime || new Date(), entry.mtime); + /* c8 ignore next */ + } + catch (er) { } + } + if (this[DOCHOWN](entry)) { + try { + node_fs_1.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + } + catch (er) { } + } + done(); + entry.resume(); + } + [MKDIR](dir, mode) { + try { + return (0, mkdir_js_1.mkdirSync)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }); + } + catch (er) { + return er; + } + } + [LINK](entry, linkpath, link, done) { + const ls = `${link}Sync`; + try { + node_fs_1.default[ls](linkpath, String(entry.absolute)); + done(); + entry.resume(); + } + catch (er) { + return this[ONERROR](er, entry); + } + } +} +exports.UnpackSync = UnpackSync; +//# sourceMappingURL=unpack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/update.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/update.js new file mode 100644 index 00000000000000..7687896f4bfeeb --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/update.js @@ -0,0 +1,33 @@ +"use strict"; +// tar -u +Object.defineProperty(exports, "__esModule", { value: true }); +exports.update = void 0; +const make_command_js_1 = require("./make-command.js"); +const replace_js_1 = require("./replace.js"); +// just call tar.r with the filter and mtimeCache +exports.update = (0, make_command_js_1.makeCommand)(replace_js_1.replace.syncFile, replace_js_1.replace.asyncFile, replace_js_1.replace.syncNoFile, replace_js_1.replace.asyncNoFile, (opt, entries = []) => { + replace_js_1.replace.validate?.(opt, entries); + mtimeFilter(opt); +}); +const mtimeFilter = (opt) => { + const filter = opt.filter; + if (!opt.mtimeCache) { + opt.mtimeCache = new Map(); + } + opt.filter = + filter ? + (path, stat) => filter(path, stat) && + !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ) + : (path, stat) => !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ); +}; +//# sourceMappingURL=update.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/warn-method.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/warn-method.js new file mode 100644 index 00000000000000..f25502776e36a3 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/warn-method.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.warnMethod = void 0; +const warnMethod = (self, code, message, data = {}) => { + if (self.file) { + data.file = self.file; + } + if (self.cwd) { + data.cwd = self.cwd; + } + data.code = + (message instanceof Error && + message.code) || + code; + data.tarCode = code; + if (!self.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; + } + self.emit('warn', code, message, data); + } + else if (message instanceof Error) { + self.emit('error', Object.assign(message, data)); + } + else { + self.emit('error', Object.assign(new Error(`${code}: ${message}`), data)); + } +}; +exports.warnMethod = warnMethod; +//# sourceMappingURL=warn-method.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/winchars.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/winchars.js new file mode 100644 index 00000000000000..c0a4405812929e --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/winchars.js @@ -0,0 +1,14 @@ +"use strict"; +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decode = exports.encode = void 0; +const raw = ['|', '<', '>', '?', ':']; +const win = raw.map(char => String.fromCharCode(0xf000 + char.charCodeAt(0))); +const toWin = new Map(raw.map((char, i) => [char, win[i]])); +const toRaw = new Map(win.map((char, i) => [char, raw[i]])); +const encode = (s) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s); +exports.encode = encode; +const decode = (s) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s); +exports.decode = decode; +//# sourceMappingURL=winchars.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/write-entry.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/write-entry.js new file mode 100644 index 00000000000000..45b7efeb795027 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/commonjs/write-entry.js @@ -0,0 +1,689 @@ +"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; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WriteEntryTar = exports.WriteEntrySync = exports.WriteEntry = void 0; +const fs_1 = __importDefault(require("fs")); +const minipass_1 = require("minipass"); +const path_1 = __importDefault(require("path")); +const header_js_1 = require("./header.js"); +const mode_fix_js_1 = require("./mode-fix.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const options_js_1 = require("./options.js"); +const pax_js_1 = require("./pax.js"); +const strip_absolute_path_js_1 = require("./strip-absolute-path.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const warn_method_js_1 = require("./warn-method.js"); +const winchars = __importStar(require("./winchars.js")); +const prefixPath = (path, prefix) => { + if (!prefix) { + return (0, normalize_windows_path_js_1.normalizeWindowsPath)(path); + } + path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path).replace(/^\.(\/|$)/, ''); + return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)(prefix) + '/' + path; +}; +const maxReadSize = 16 * 1024 * 1024; +const PROCESS = Symbol('process'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const HEADER = Symbol('header'); +const READ = Symbol('read'); +const LSTAT = Symbol('lstat'); +const ONLSTAT = Symbol('onlstat'); +const ONREAD = Symbol('onread'); +const ONREADLINK = Symbol('onreadlink'); +const OPENFILE = Symbol('openfile'); +const ONOPENFILE = Symbol('onopenfile'); +const CLOSE = Symbol('close'); +const MODE = Symbol('mode'); +const AWAITDRAIN = Symbol('awaitDrain'); +const ONDRAIN = Symbol('ondrain'); +const PREFIX = Symbol('prefix'); +class WriteEntry extends minipass_1.Minipass { + path; + portable; + myuid = (process.getuid && process.getuid()) || 0; + // until node has builtin pwnam functions, this'll have to do + myuser = process.env.USER || ''; + maxReadSize; + linkCache; + statCache; + preservePaths; + cwd; + strict; + mtime; + noPax; + noMtime; + prefix; + fd; + blockLen = 0; + blockRemain = 0; + buf; + pos = 0; + remain = 0; + length = 0; + offset = 0; + win32; + absolute; + header; + type; + linkpath; + stat; + onWriteEntry; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = (0, options_js_1.dealias)(opt_); + super(); + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(p); + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = + opt.prefix ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) : undefined; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.win32 = !!opt.win32 || process.platform === 'win32'; + if (this.win32) { + // force the \ to / normalization, since we might not *actually* + // be on windows, but want \ to be considered a path separator. + this.path = winchars.decode(this.path.replace(/\\/g, '/')); + p = p.replace(/\\/g, '/'); + } + this.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.absolute || path_1.default.resolve(this.cwd, p)); + if (this.path === '') { + this.path = './'; + } + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } + else { + this[LSTAT](); + } + } + warn(code, message, data = {}) { + return (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + emit(ev, ...data) { + if (ev === 'error') { + this.#hadError = true; + } + return super.emit(ev, ...data); + } + [LSTAT]() { + fs_1.default.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit('error', er); + } + this[ONLSTAT](stat); + }); + } + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; + } + this.type = getType(stat); + this.emit('stat', stat); + this[PROCESS](); + } + [PROCESS]() { + switch (this.type) { + case 'File': + return this[FILE](); + case 'Directory': + return this[DIRECTORY](); + case 'SymbolicLink': + return this[SYMLINK](); + // unsupported types are ignored. + default: + return this.end(); + } + } + [MODE](mode) { + return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [HEADER]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot write header before stat'); + } + /* c8 ignore stop */ + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new header_js_1.Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? undefined : this.stat.uid, + gid: this.portable ? undefined : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime, + /* c8 ignore next */ + type: this.type === 'Unsupported' ? undefined : this.type, + uname: this.portable ? undefined + : this.stat.uid === this.myuid ? this.myuser + : '', + atime: this.portable ? undefined : this.stat.atime, + ctime: this.portable ? undefined : this.stat.ctime, + }); + if (this.header.encode() && !this.noPax) { + super.write(new pax_js_1.Pax({ + atime: this.portable ? undefined : this.header.atime, + ctime: this.portable ? undefined : this.header.ctime, + gid: this.portable ? undefined : this.header.gid, + mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime), + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.header.size, + uid: this.portable ? undefined : this.header.uid, + uname: this.portable ? undefined : this.header.uname, + dev: this.portable ? undefined : this.stat.dev, + ino: this.portable ? undefined : this.stat.ino, + nlink: this.portable ? undefined : this.stat.nlink, + }).encode()); + } + const block = this.header?.block; + /* c8 ignore start */ + if (!block) { + throw new Error('failed to encode header'); + } + /* c8 ignore stop */ + super.write(block); + } + [DIRECTORY]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create directory entry without stat'); + } + /* c8 ignore stop */ + if (this.path.slice(-1) !== '/') { + this.path += '/'; + } + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [SYMLINK]() { + fs_1.default.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit('error', er); + } + this[ONREADLINK](linkpath); + }); + } + [ONREADLINK](linkpath) { + this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(linkpath); + this[HEADER](); + this.end(); + } + [HARDLINK](linkpath) { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create link entry without stat'); + } + /* c8 ignore stop */ + this.type = 'Link'; + this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [FILE]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create file entry without stat'); + } + /* c8 ignore stop */ + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK](linkpath); + } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); + } + [OPENFILE]() { + fs_1.default.open(this.absolute, 'r', (er, fd) => { + if (er) { + return this.emit('error', er); + } + this[ONOPENFILE](fd); + }); + } + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); + } + /* c8 ignore start */ + if (!this.stat) { + throw new Error('should stat before calling onopenfile'); + } + /* c8 ignore start */ + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ](); + } + [READ]() { + const { fd, buf, offset, length, pos } = this; + if (fd === undefined || buf === undefined) { + throw new Error('cannot read file without first opening'); + } + fs_1.default.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + return this[CLOSE](() => this.emit('error', er)); + } + this[ONREAD](bytesRead); + }); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs_1.default.close(this.fd, cb); + } + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error('encountered unexpected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error('did not encounter expected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('should have created buffer prior to reading'); + } + /* c8 ignore stop */ + // null out the rest of the buffer, if we could fit the block padding + // at the end of this loop, we've incremented bytesRead and this.remain + // to be incremented up to the blockRemain level, as if we had expected + // to get a null-padded file, and read it until the end. then we will + // decrement both remain and blockRemain by bytesRead, and know that we + // reached the expected EOF, without any null buffer to append. + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; + } + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? + this.buf + : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } + else { + this[ONDRAIN](); + } + } + [AWAITDRAIN](cb) { + this.once('drain', cb); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error('writing more data than expected'), { + path: this.absolute, + }); + return this.emit('error', er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); + } + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + return this[CLOSE](er => er ? this.emit('error', er) : this.end()); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('buffer lost somehow in ONDRAIN'); + } + /* c8 ignore stop */ + if (this.offset >= this.length) { + // if we only have a smaller bit left to read, alloc a smaller buffer + // otherwise, keep it the same length it was before. + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); + this.offset = 0; + } + this.length = this.buf.length - this.offset; + this[READ](); + } +} +exports.WriteEntry = WriteEntry; +class WriteEntrySync extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](fs_1.default.lstatSync(this.absolute)); + } + [SYMLINK]() { + this[ONREADLINK](fs_1.default.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](fs_1.default.openSync(this.absolute, 'r')); + } + [READ]() { + let threw = true; + try { + const { fd, buf, offset, length, pos } = this; + /* c8 ignore start */ + if (fd === undefined || buf === undefined) { + throw new Error('fd and buf must be set in READ method'); + } + /* c8 ignore stop */ + const bytesRead = fs_1.default.readSync(fd, buf, offset, length, pos); + this[ONREAD](bytesRead); + threw = false; + } + finally { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + if (threw) { + try { + this[CLOSE](() => { }); + } + catch (er) { } + } + } + } + [AWAITDRAIN](cb) { + cb(); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs_1.default.closeSync(this.fd); + cb(); + } +} +exports.WriteEntrySync = WriteEntrySync; +class WriteEntryTar extends minipass_1.Minipass { + blockLen = 0; + blockRemain = 0; + buf = 0; + pos = 0; + remain = 0; + length = 0; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; + type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; + linkpath; + size; + onWriteEntry; + warn(code, message, data = {}) { + return (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + constructor(readEntry, opt_ = {}) { + const opt = (0, options_js_1.dealias)(opt_); + super(); + this.preservePaths = !!opt.preservePaths; + this.portable = !!opt.portable; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.onWriteEntry = opt.onWriteEntry; + this.readEntry = readEntry; + const { type } = readEntry; + /* c8 ignore start */ + if (type === 'Unsupported') { + throw new Error('writing entry that should be ignored'); + } + /* c8 ignore stop */ + this.type = type; + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.prefix = opt.prefix; + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.path); + this.mode = + readEntry.mode !== undefined ? + this[MODE](readEntry.mode) + : undefined; + this.uid = this.portable ? undefined : readEntry.uid; + this.gid = this.portable ? undefined : readEntry.gid; + this.uname = this.portable ? undefined : readEntry.uname; + this.gname = this.portable ? undefined : readEntry.gname; + this.size = readEntry.size; + this.mtime = + this.noMtime ? undefined : opt.mtime || readEntry.mtime; + this.atime = this.portable ? undefined : readEntry.atime; + this.ctime = this.portable ? undefined : readEntry.ctime; + this.linkpath = + readEntry.linkpath !== undefined ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath) + : undefined; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; + this.onWriteEntry?.(this); + this.header = new header_js_1.Header({ + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? undefined : this.uid, + gid: this.portable ? undefined : this.gid, + size: this.size, + mtime: this.noMtime ? undefined : this.mtime, + type: this.type, + uname: this.portable ? undefined : this.uname, + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + }); + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + if (this.header.encode() && !this.noPax) { + super.write(new pax_js_1.Pax({ + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + gid: this.portable ? undefined : this.gid, + mtime: this.noMtime ? undefined : this.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.size, + uid: this.portable ? undefined : this.uid, + uname: this.portable ? undefined : this.uname, + dev: this.portable ? undefined : this.readEntry.dev, + ino: this.portable ? undefined : this.readEntry.ino, + nlink: this.portable ? undefined : this.readEntry.nlink, + }).encode()); + } + const b = this.header?.block; + /* c8 ignore start */ + if (!b) + throw new Error('failed to encode header'); + /* c8 ignore stop */ + super.write(b); + readEntry.pipe(this); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [MODE](mode) { + return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + this.blockRemain -= writeLen; + return super.write(chunk, cb); + } + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding ?? 'utf8'); + } + if (cb) + this.once('finish', cb); + chunk ? super.end(chunk, cb) : super.end(cb); + /* c8 ignore stop */ + return this; + } +} +exports.WriteEntryTar = WriteEntryTar; +const getType = (stat) => stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported'; +//# sourceMappingURL=write-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/create.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/create.js new file mode 100644 index 00000000000000..512a9911d70d5b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/create.js @@ -0,0 +1,77 @@ +import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'; +import path from 'node:path'; +import { list } from './list.js'; +import { makeCommand } from './make-command.js'; +import { Pack, PackSync } from './pack.js'; +const createFileSync = (opt, files) => { + const p = new PackSync(opt); + const stream = new WriteStreamSync(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const createFile = (opt, files) => { + const p = new Pack(opt); + const stream = new WriteStream(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + const promise = new Promise((res, rej) => { + stream.on('error', rej); + stream.on('close', res); + p.on('error', rej); + }); + addFilesAsync(p, files); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + list({ + file: path.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await list({ + file: path.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => { + p.add(entry); + }, + }); + } + else { + p.add(file); + } + } + p.end(); +}; +const createSync = (opt, files) => { + const p = new PackSync(opt); + addFilesSync(p, files); + return p; +}; +const createAsync = (opt, files) => { + const p = new Pack(opt); + addFilesAsync(p, files); + return p; +}; +export const create = makeCommand(createFileSync, createFile, createSync, createAsync, (_opt, files) => { + if (!files?.length) { + throw new TypeError('no paths specified to add to archive'); + } +}); +//# sourceMappingURL=create.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/cwd-error.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/cwd-error.js new file mode 100644 index 00000000000000..289a066b8e0317 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/cwd-error.js @@ -0,0 +1,14 @@ +export class CwdError extends Error { + path; + code; + syscall = 'chdir'; + constructor(path, code) { + super(`${code}: Cannot cd into '${path}'`); + this.path = path; + this.code = code; + } + get name() { + return 'CwdError'; + } +} +//# sourceMappingURL=cwd-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/extract.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/extract.js new file mode 100644 index 00000000000000..2274feef26e78f --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/extract.js @@ -0,0 +1,49 @@ +// tar -x +import * as fsm from '@isaacs/fs-minipass'; +import fs from 'node:fs'; +import { filesFilter } from './list.js'; +import { makeCommand } from './make-command.js'; +import { Unpack, UnpackSync } from './unpack.js'; +const extractFileSync = (opt) => { + const u = new UnpackSync(opt); + const file = opt.file; + const stat = fs.statSync(file); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size, + }); + stream.pipe(u); +}; +const extractFile = (opt, _) => { + const u = new Unpack(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + u.on('error', reject); + u.on('close', resolve); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(u); + } + }); + }); + return p; +}; +export const extract = makeCommand(extractFileSync, extractFile, opt => new UnpackSync(opt), opt => new Unpack(opt), (opt, files) => { + if (files?.length) + filesFilter(opt, files); +}); +//# sourceMappingURL=extract.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/get-write-flag.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/get-write-flag.js new file mode 100644 index 00000000000000..2c7f3e8b28fdaf --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/get-write-flag.js @@ -0,0 +1,23 @@ +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +import fs from 'fs'; +const platform = process.env.__FAKE_PLATFORM__ || process.platform; +const isWindows = platform === 'win32'; +/* c8 ignore start */ +const { O_CREAT, O_TRUNC, O_WRONLY } = fs.constants; +const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || + fs.constants.UV_FS_O_FILEMAP || + 0; +/* c8 ignore stop */ +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; +const fMapLimit = 512 * 1024; +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; +export const getWriteFlag = !fMapEnabled ? + () => 'w' + : (size) => (size < fMapLimit ? fMapFlag : 'w'); +//# sourceMappingURL=get-write-flag.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/header.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/header.js new file mode 100644 index 00000000000000..e15192b14b16e1 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/header.js @@ -0,0 +1,279 @@ +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) +import { posix as pathModule } from 'node:path'; +import * as large from './large-numbers.js'; +import * as types from './types.js'; +export class Header { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = 'Unsupported'; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } + else if (data) { + this.#slurp(data); + } + } + decode(buf, off, ex, gex) { + if (!off) { + off = 0; + } + 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.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 + // Apply global before local, so it overrides + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + // old tar versions marked dirs as a file with a trailing / + const t = decString(buf, off + 156, 1); + if (types.isCode(t)) { + this.#type = t || '0'; + } + if (this.#type === '0' && this.path.slice(-1) === '/') { + this.#type = '5'; + } + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this.#type === '5') { + this.size = 0; + } + 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; + /* c8 ignore stop */ + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155); + this.path = prefix + '/' + this.path; + } + else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + '/' + this.path; + } + this.atime = decDate(buf, off + 476, 12); + this.ctime = decDate(buf, off + 488, 12); + } + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksumValid = sum === this.cksum; + if (this.cksum === undefined && sum === 8 * 0x20) { + this.nullBlock = true; + } + } + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex) || + (k === 'linkpath' && gex) || + k === 'global'); + }))); + } + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); + } + if (this.#type === 'Unsupported') { + this.#type = '0'; + } + if (!(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || '', prefixSize); + const path = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path) || this.needPax; + this.needPax = + encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = + encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = + encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = + encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = + encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = + encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write('ustar\u000000', off + 257, 8); + this.needPax = + encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = + encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = + encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = + encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = + encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = + encString(buf, off + 345, 155, prefix) || this.needPax; + } + else { + this.needPax = + encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = + encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = + encDate(buf, off + 488, 12, this.ctime) || this.needPax; + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; + } + get type() { + return (this.#type === 'Unsupported' ? + this.#type + : types.name.get(this.#type)); + } + get typeKey() { + return this.#type; + } + set type(type) { + const c = String(types.code.get(type)); + if (types.isCode(c) || c === 'Unsupported') { + this.#type = c; + } + else if (types.isCode(type)) { + this.#type = type; + } + else { + throw new TypeError('invalid entry type: ' + type); + } + } +} +const splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ''; + let ret = undefined; + const root = pathModule.parse(p).root || '.'; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } + else { + // first set prefix to the dir, and path to the base + prefix = pathModule.dirname(pp); + pp = pathModule.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // both fit! + ret = [pp, prefix, false]; + } + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // prefix fits in prefix, but path doesn't fit in path + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } + else { + // make path take a bit from prefix + pp = pathModule.join(pathModule.basename(prefix), pp); + prefix = pathModule.dirname(prefix); + } + } while (prefix !== root && ret === undefined); + // at this point, found no resolution, just truncate + if (!ret) { + ret = [p.slice(0, pathSize - 1), '', true]; + } + } + return ret; +}; +const decString = (buf, off, size) => buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*/, ''); +const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); +const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000); +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ? + large.parse(buf.subarray(off, off + size)) + : decSmallNumber(buf, off, size); +const nanUndef = (value) => (isNaN(value) ? undefined : value); +const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*$/, '') + .trim(), 8)); +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8: 0o7777777, +}; +const encNumber = (buf, off, size, num) => num === undefined ? false + : num > MAXNUM[size] || num < 0 ? + (large.encode(num, buf.subarray(off, off + size)), true) + : (encSmallNumber(buf, off, size, num), false); +const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii'); +const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); +const padOctal = (str, size) => (str.length === size - 1 ? + str + : new Array(size - str.length - 1).join('0') + str + ' ') + '\0'; +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000)); +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0'); +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'), + str.length !== Buffer.byteLength(str) || str.length > size)); +//# sourceMappingURL=header.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/index.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/index.js new file mode 100644 index 00000000000000..1bac6415c8d732 --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/index.js @@ -0,0 +1,20 @@ +export * from './create.js'; +export { create as c } from './create.js'; +export * from './extract.js'; +export { extract as x } from './extract.js'; +export * from './header.js'; +export * from './list.js'; +export { list as t } from './list.js'; +// classes +export * from './pack.js'; +export * from './parse.js'; +export * from './pax.js'; +export * from './read-entry.js'; +export * from './replace.js'; +export { replace as r } from './replace.js'; +export * as types from './types.js'; +export * from './unpack.js'; +export * from './update.js'; +export { update as u } from './update.js'; +export * from './write-entry.js'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/large-numbers.js b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/large-numbers.js new file mode 100644 index 00000000000000..4f2f7e5f14fc1b --- /dev/null +++ b/deps/npm/node_modules/cacache/node_modules/tar/dist/esm/large-numbers.js @@ -0,0 +1,94 @@ +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. +export const encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range'); + } + else if (num < 0) { + encodeNegative(num, buf); + } + else { + encodePositive(num, buf); + } + return buf; +}; +const encodePositive = (num, buf) => { + buf[0] = 0x80; + for (var i = buf.length; i > 1; i--) { + buf[i - 1